ZGlmZiAtLWdpdCBhL2NvbnRhaW5lci8uY2xhc3NwYXRoIGIvY29udGFpbmVyLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE5ZWY4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBleGNsdWRpbmc9Im9yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvTWFpbFNlc3Npb25GYWN0b3J5LmphdmF8b3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9TZW5kTWFpbEZhY3RvcnkuamF2YSIga2luZD0ic3JjIiBwYXRoPSJjYXRhbGluYS9zcmMvc2hhcmUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJtb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3NlcyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvc3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id2ViYXBwcy9ob3N0LW1hbmFnZXIvV0VCLUlORi9jbGFzc2VzIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id2ViYXBwcy9qbXhyZW1vdGUvV0VCLUlORi9zcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iQU5UX0hPTUUvbGliL2FudC5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJUT01DQVRfTElCU19CQVNFL2NvbW1vbnMtbG9nZ2luZy0xLjAuNC9jb21tb25zLWxvZ2dpbmctYXBpLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IlRPTUNBVF9MSUJTX0JBU0UvbXg0ai0zLjAuMS9saWIvbXg0ai5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJUT01DQVRfTElCU19CQVNFL2NvbW1vbnMtbGF1bmNoZXItMC45L2Jpbi9jb21tb25zLWxhdW5jaGVyLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IlRPTUNBVF9MSUJTX0JBU0Uvc3RydXRzLTEuMi43L2xpYi9hbnRsci5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJUT01DQVRfTElCU19CQVNFL3N0cnV0cy0xLjIuNy9saWIvY29tbW9ucy1iZWFudXRpbHMuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iVE9NQ0FUX0xJQlNfQkFTRS9zdHJ1dHMtMS4yLjcvbGliL2NvbW1vbnMtZGlnZXN0ZXIuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iVE9NQ0FUX0xJQlNfQkFTRS9zdHJ1dHMtMS4yLjcvbGliL2NvbW1vbnMtZmlsZXVwbG9hZC5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJUT01DQVRfTElCU19CQVNFL3N0cnV0cy0xLjIuNy9saWIvY29tbW9ucy1sb2dnaW5nLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IlRPTUNBVF9MSUJTX0JBU0Uvc3RydXRzLTEuMi43L2xpYi9jb21tb25zLXZhbGlkYXRvci5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJUT01DQVRfTElCU19CQVNFL3N0cnV0cy0xLjIuNy9saWIvamFrYXJ0YS1vcm8uamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iVE9NQ0FUX0xJQlNfQkFTRS9zdHJ1dHMtMS4yLjcvbGliL3N0cnV0cy5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvY29ubmVjdG9ycyIvPgorCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9idWlsZCIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IlRPTUNBVF9MSUJTX0JBU0Uvc2VydmxldC1hcGktMi40L2xpYi9zZXJ2bGV0LWFwaS5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJUT01DQVRfTElCU19CQVNFL2pzcC1hcGktMi4wL2xpYi9qc3AtYXBpLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IlRPTUNBVF9MSUJTX0JBU0UvY29tbW9ucy1tb2RlbGVyLTIuMC9jb21tb25zLW1vZGVsZXItMi4wLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9jb250YWluZXIvLmN2c2lnbm9yZSBiL2NvbnRhaW5lci8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMGI3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvLmN2c2lnbm9yZQpAQCAtMCwwICsxLDIgQEAKK2J1aWxkCitkaXN0CmRpZmYgLS1naXQgYS9jb250YWluZXIvLnByb2plY3QgYi9jb250YWluZXIvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNlZmQwMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci8ucHJvamVjdApAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5jb250YWluZXI8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL0xJQ0VOU0UgYi9jb250YWluZXIvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ1Njk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL0xJQ0VOU0UKQEAgLTAsMCArMSwyMDIgQEAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9jb250YWluZXIvTk9USUNFIGIvY29udGFpbmVyL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjU5ODA1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL05PVElDRQpAQCAtMCwwICsxLDIgQEAKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKK1RoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCmRpZmYgLS1naXQgYS9jb250YWluZXIvVG9tY2F0NS41LmxhdW5jaCBiL2NvbnRhaW5lci9Ub21jYXQ1LjUubGF1bmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMzUwMGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvVG9tY2F0NS41LmxhdW5jaApAQCAtMCwwICsxLDEyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5sb2NhbEphdmFBcHBsaWNhdGlvbiI+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5NQUlOX1RZUEUiIHZhbHVlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQ2F0YWxpbmEiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0ic3RhcnQiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9ImNvbnRhaW5lciIvPgorPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5mYXZvcml0ZUdyb3VwcyI+Cis8bGlzdEVudHJ5IHZhbHVlPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hHcm91cC5ydW4iLz4KKzxsaXN0RW50cnkgdmFsdWU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaEdyb3VwLmRlYnVnIi8+Cis8L2xpc3RBdHRyaWJ1dGU+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5XT1JLSU5HX0RJUkVDVE9SWSIgdmFsdWU9IiR7d29ya3NwYWNlX2xvYzpjb250YWluZXJ9Ii8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Cis8L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9jb250YWluZXIvYnVpbGQueG1sIGIvY29udGFpbmVyL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWJjZDdjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2J1aWxkLnhtbApAQCAtMCwwICsxLDE4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8cHJvamVjdCBuYW1lPSJDYXRhbGluYSAyLjAiIGRlZmF1bHQ9ImRlcGxveSIgYmFzZWRpcj0iLiI+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBJbml0aWFsaXplIFByb3BlcnR5IFZhbHVlcyA9PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDwhLS0gU2VlICJidWlsZC5wcm9wZXJ0aWVzLnNhbXBsZSIgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgZm9yIGFsbCAgICAgLS0+CisgIDwhLS0gcHJvcGVydHkgdmFsdWVzIHlvdSBtdXN0IGN1c3RvbWl6ZSBmb3Igc3VjY2Vzc2Z1bCBidWlsZGluZyEhISAgICAgICAgLS0+CisgIDwhLS1wcm9wZXJ0eSBmaWxlPSJidWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3VzZXIuaG9tZX0vYnVpbGQucHJvcGVydGllcyIvLS0+CisKKyAgPCEtLSBCdWlsZCBEZWZhdWx0cyAtLT4KKyAgPCEtLXByb3BlcnR5IG5hbWU9ImNhdGFsaW5hLmJ1aWxkIiAgIHZhbHVlPSIke2Jhc2VkaXJ9L2NhdGFsaW5hL2J1aWxkIi8tLT4KKworICA8IS0tIFNvdXJjZSBkZXBlbmRlbmNpZXMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJhcGkuaG9tZSIKKyAgICAgICAgICAgdmFsdWU9IiR7YmFzZWRpcn0vLi4vamFrYXJ0YS1zZXJ2bGV0YXBpLTUiLz4KKyAgPHByb3BlcnR5IG5hbWU9Imp0Yy5ob21lIgorICAgICAgICAgICB2YWx1ZT0iJHtiYXNlZGlyfS8uLi9qYWthcnRhLXRvbWNhdC1jb25uZWN0b3JzIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gREVURUNUOiBEaXNwbGF5IGNvbmZpZ3VyYXRpb24gPT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImZsYWdzLmRpc3BsYXkiCisgICBkZXNjcmlwdGlvbj0iRGlzcGxheSBjb25maWd1cmF0aW9uIGFuZCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBmbGFncyI+CisKKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS9jYXRhbGluYSIgdGFyZ2V0PSJmbGFncy5kaXNwbGF5Ii8+CisgICAgPGFudCBkaXI9IiR7YmFzZWRpcn0vd2ViYXBwcy9hZG1pbiIgdGFyZ2V0PSJmbGFncy5kaXNwbGF5Ii8+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBERVBMT1k6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRlcGxveS1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke3RvbWNhdC5idWlsZH0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gREVQTE9ZOiBDb3B5IFN0YXRpYyBGaWxlcyA9PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRlcGxveS1zdGF0aWMiIGRlcGVuZHM9ImRlcGxveS1wcmVwYXJlIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gREVQTE9ZOiBEZXBsb3kgQ29tcG9uZW50cyA9PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRlcGxveSIgZGVwZW5kcz0iZGVwbG95LXN0YXRpYyIKKyAgIGRlc2NyaXB0aW9uPSJCdWlsZCBhbmQgZGVwbG95IGFsbCBjb21wb25lbnRzIj4KKyAgICA8ZWNobz5UYXJnZXQ6IENhdGFsaW5hIC0gRGVwbG95IC4uLjwvZWNobz4KKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS9jYXRhbGluYSIgdGFyZ2V0PSJkZXBsb3kiLz4KKyAgICA8ZWNobz5UYXJnZXQ6IFdlYmFwcHMgLSBEZXBsb3kgLi4uPC9lY2hvPgorICAgIDxhbnQgZGlyPSIke2Jhc2VkaXJ9L3dlYmFwcHMiICB0YXJnZXQ9ImRlcGxveSIvPgorICA8L3RhcmdldD4KKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gREVQTE9ZOiBEZXBsb3kgQ29yZSBDb21wb25lbnRzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDwhLS0gdXNlZCBieSBndW1wIHRvIGJ1aWxkIGp1c3QgY2F0YWxpbmEgYW5kIG5vdCB0aGUgai10LWNvbm5lY3RvcnMgLS0+CisgIDx0YXJnZXQgbmFtZT0iZGVwbG95LWNhdGFsaW5hIiBkZXBlbmRzPSJkZXBsb3ktc3RhdGljIgorICAgZGVzY3JpcHRpb249IkJ1aWxkIGFuZCBkZXBsb3kgYWxsIGNvbXBvbmVudHMiPgorICAgIDxlY2hvPlRhcmdldDogQ2F0YWxpbmEgLSBEZXBsb3kgLi4uPC9lY2hvPgorICAgIDxhbnQgZGlyPSIke2Jhc2VkaXJ9L2NhdGFsaW5hIiB0YXJnZXQ9ImRlcGxveS1jYXRhbGluYSIvPgorICAgIDxlY2hvPlRhcmdldDogV2ViYXBwcyAtIERlcGxveSAuLi48L2VjaG8+CisgICAgPGFudCBkaXI9IiR7YmFzZWRpcn0vd2ViYXBwcyIgIHRhcmdldD0iZGVwbG95Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IENPTUJPOiBDbGVhbiBBbGwgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJjbGVhbiIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiBhbGwgY29tcG9uZW50cyI+CisgICAgPGRlbGV0ZSBkaXI9IiR7dG9tY2F0LmJ1aWxkfSIvPgorICAgIDxlY2hvPlRhcmdldDogQ2F0YWxpbmEgLSBDbGVhbiAuLi48L2VjaG8+CisgICAgPGFudCBkaXI9IiR7YmFzZWRpcn0vY2F0YWxpbmEiIHRhcmdldD0iY2xlYW4iLz4KKyAgICA8ZWNobz5UYXJnZXQ6IFdlYmFwcHMgLSBDbGVhbiAuLi48L2VjaG8+CisgICAgPGFudCBkaXI9IiR7YmFzZWRpcn0vd2ViYXBwcyIgIHRhcmdldD0iY2xlYW4iLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHt0b21jYXQuZGlzdH0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IENPTUJPOiBCdWlsZCBBbGwgQ29tcG9uZW50cyA9PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImFsbCIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiwgYnVpbGQsIGFuZCBkZXBsb3kgYWxsIGNvbXBvbmVudHMiPgorICAgIDxlY2hvPlRhcmdldDogQ2F0YWxpbmEgLSBBbGwgLi4uPC9lY2hvPgorICAgIDxhbnQgZGlyPSIke2Jhc2VkaXJ9L2NhdGFsaW5hIiB0YXJnZXQ9ImFsbCIvPgorICAgIDxlY2hvPlRhcmdldDogV2ViYXBwcyAtIEFsbCAuLi48L2VjaG8+CisgICAgPGFudCBkaXI9IiR7YmFzZWRpcn0vd2ViYXBwcyIgIHRhcmdldD0iYWxsIi8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBDT01CTzogVGVzdCBBbGwgQ29tcG9uZW50cyA9PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0IgorICAgZGVzY3JpcHRpb249IlVuaXQgdGVzdHMgb24gYWxsIGNvbXBvbmVudHMiPgorICAgIDxlY2hvPlRhcmdldDogQ2F0YWxpbmEgLSBUZXN0IC4uLjwvZWNobz4KKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS9jYXRhbGluYSIgdGFyZ2V0PSJ0ZXN0Ii8+CisgICAgPGVjaG8+VGFyZ2V0OiBXZWJhcHBzIC0gVGVzdCAuLi48L2VjaG8+CisgICAgPGFudCBkaXI9IiR7YmFzZWRpcn0vd2ViYXBwcyIgIHRhcmdldD0idGVzdCIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDcmVhdGUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke3RvbWNhdC5kaXN0fSIvPgorICAgIDxta2RpciBkaXI9IiR7dG9tY2F0LmRpc3R9L2JpbiIvPgorICAgIDxta2RpciBkaXI9IiR7dG9tY2F0LmRpc3R9L2NvbW1vbiIvPgorICAgIDxta2RpciBkaXI9IiR7dG9tY2F0LmRpc3R9L2NvbW1vbi9jbGFzc2VzIi8+CisgICAgPG1rZGlyIGRpcj0iJHt0b21jYXQuZGlzdH0vY29tbW9uL2VuZG9yc2VkIi8+CisgICAgPG1rZGlyIGRpcj0iJHt0b21jYXQuZGlzdH0vY29tbW9uL2xpYiIvPgorICAgIDxta2RpciBkaXI9IiR7dG9tY2F0LmRpc3R9L2NvbmYiLz4KKyAgICA8bWtkaXIgZGlyPSIke3RvbWNhdC5kaXN0fS9sb2dzIi8+CisgICAgPG1rZGlyIGRpcj0iJHt0b21jYXQuZGlzdH0vc2VydmVyIi8+CisgICAgPG1rZGlyIGRpcj0iJHt0b21jYXQuZGlzdH0vc2VydmVyL2NsYXNzZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke3RvbWNhdC5kaXN0fS9zZXJ2ZXIvbGliIi8+CisgICAgPG1rZGlyIGRpcj0iJHt0b21jYXQuZGlzdH0vc2hhcmVkL2NsYXNzZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke3RvbWNhdC5kaXN0fS9zaGFyZWQvbGliIi8+CisgICAgPG1rZGlyIGRpcj0iJHt0b21jYXQuZGlzdH0vd2ViYXBwcyIvPgorICAgIDxta2RpciBkaXI9IiR7dG9tY2F0LmRpc3R9L3dvcmsiLz4KKyAgICA8bWtkaXIgZGlyPSIke3RvbWNhdC5kaXN0fS90ZW1wIi8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENvcHkgU3RhdGljIEZpbGVzID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0LXN0YXRpYyIgZGVwZW5kcz0iZGlzdC1wcmVwYXJlIj4KKworICAgIDwhLS0gQ29weSB0aGUgdG9wLWxldmVsIGRvY3VtZW50YXRpb24gZmlsZXMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7dG9tY2F0LmRpc3R9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iSU5TVEFMTElORy50eHQiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iQlVJTERJTkcudHh0Ii8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IlJFQURNRS50eHQiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iUkVMRUFTRSoiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iUlVOTklORy50eHQiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIENvcHkgdGhlIGNvbnRlbnRzIG9mIGVhY2ggImJ1aWxkIiBkaXJlY3RvcnkgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7dG9tY2F0LmRpc3R9L2JpbiI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dG9tY2F0LmJ1aWxkfS9iaW4iIC8+CisgICAgPC9jb3B5PgorICAgIDxjb3B5IHRvZGlyPSIke3RvbWNhdC5kaXN0fS9jb21tb24vY2xhc3NlcyI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dG9tY2F0LmJ1aWxkfS9jb21tb24vY2xhc3NlcyIgLz4KKyAgICA8L2NvcHk+CisgICAgPGNvcHkgdG9kaXI9IiR7dG9tY2F0LmRpc3R9L2NvbW1vbi9lbmRvcnNlZCI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dG9tY2F0LmJ1aWxkfS9jb21tb24vZW5kb3JzZWQiIC8+CisgICAgPC9jb3B5PgorICAgIDxjb3B5IHRvZGlyPSIke3RvbWNhdC5kaXN0fS9jb21tb24vbGliIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0b21jYXQuYnVpbGR9L2NvbW1vbi9saWIiIC8+CisgICAgPC9jb3B5PgorICAgIDxjb3B5IHRvZGlyPSIke3RvbWNhdC5kaXN0fS9jb25mIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0b21jYXQuYnVpbGR9L2NvbmYiIC8+CisgICAgPC9jb3B5PgorICAgIDxjb3B5IHRvZGlyPSIke3RvbWNhdC5kaXN0fS9zZXJ2ZXIvY2xhc3NlcyI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dG9tY2F0LmJ1aWxkfS9zZXJ2ZXIvY2xhc3NlcyIgLz4KKyAgICA8L2NvcHk+CisgICAgPGNvcHkgdG9kaXI9IiR7dG9tY2F0LmRpc3R9L3NlcnZlci9saWIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3RvbWNhdC5idWlsZH0vc2VydmVyL2xpYiIgLz4KKyAgICA8L2NvcHk+CisgICAgPGNvcHkgdG9kaXI9IiR7dG9tY2F0LmRpc3R9L3NlcnZlci93ZWJhcHBzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0b21jYXQuYnVpbGR9L3NlcnZlci93ZWJhcHBzIiAvPgorICAgIDwvY29weT4KKyAgICA8Y29weSB0b2Rpcj0iJHt0b21jYXQuZGlzdH0vc2hhcmVkL2NsYXNzZXMiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3RvbWNhdC5idWlsZH0vc2hhcmVkL2NsYXNzZXMiIC8+CisgICAgPC9jb3B5PgorICAgIDxjb3B5IHRvZGlyPSIke3RvbWNhdC5kaXN0fS9zaGFyZWQvbGliIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0b21jYXQuYnVpbGR9L3NoYXJlZC9saWIiIC8+CisgICAgPC9jb3B5PgorICAgIDxjb3B5IHRvZGlyPSIke3RvbWNhdC5kaXN0fS93ZWJhcHBzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0b21jYXQuYnVpbGR9L3dlYmFwcHMiIC8+CisgICAgPC9jb3B5PgorCisgICAgPCEtLSBDb3JyZWN0IHBlcm1pc3Npb25zIGFuZCBsaW5lIGVuZGluZ3Mgb24gImJpbiIgc2NyaXB0cyAtLT4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7dG9tY2F0LmRpc3R9L2JpbiIgICBpbmNsdWRlcz0iKi5zaCIgIGVvbD0ibGYiLz4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7dG9tY2F0LmRpc3R9L2JpbiIgICBpbmNsdWRlcz0iKi5iYXQiIGVvbD0iY3JsZiIvPgorICAgIDxjaG1vZCAgICAgIGRpcj0iJHt0b21jYXQuZGlzdH0vYmluIiAgIGluY2x1ZGVzPSIqLnNoIiAgcGVybT0iK3giLz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDcmVhdGUgSmF2YWRvYyA9PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1qYXZhZG9jIj4KKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS9jYXRhbGluYSIgdGFyZ2V0PSJqYXZhZG9jIi8+CisgICAgPG1rZGlyICBkaXI9IiR7dG9tY2F0LmRpc3R9L3dlYmFwcHMvdG9tY2F0LWRvY3MvY2F0YWxpbmEvZG9jcy9hcGkiLz4KKyAgICA8Y29weSB0b2Rpcj0iJHt0b21jYXQuZGlzdH0vd2ViYXBwcy90b21jYXQtZG9jcy9jYXRhbGluYS9kb2NzL2FwaSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2phdmFkb2MiIC8+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDcmVhdGUgQXJjaGl2ZXMgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0iZGVwbG95LGRpc3Qtc3RhdGljLGRpc3QtamF2YWRvYyIKKyAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiI+CisgIDwvdGFyZ2V0PgorCisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS8uY3ZzaWdub3JlIGIvY29udGFpbmVyL2NhdGFsaW5hLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwYjcxYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS8uY3ZzaWdub3JlCkBAIC0wLDAgKzEsMiBAQAorYnVpbGQKK2Rpc3QKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9idWlsZC54bWwgYi9jb250YWluZXIvY2F0YWxpbmEvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNTUxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvYnVpbGQueG1sCkBAIC0wLDAgKzEsMTIxNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8cHJvamVjdCBuYW1lPSJDYXRhbGluYSIgZGVmYXVsdD0iZGVwbG95IiBiYXNlZGlyPSIuIj4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgUHJvcGVydHkgVmFsdWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPCEtLSBTZWUgImJ1aWxkLnByb3BlcnRpZXMuc2FtcGxlIiBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBmb3IgYWxsICAgICAtLT4KKyAgPCEtLSBwcm9wZXJ0eSB2YWx1ZXMgeW91IG11c3QgY3VzdG9taXplIGZvciBzdWNjZXNzZnVsIGJ1aWxkaW5nISEhICAgICAgICAtLT4KKyAgPCEtLXByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uL2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dXNlci5ob21lfS9idWlsZC5wcm9wZXJ0aWVzIi8tLT4KKworICA8IS0tIEJ1aWxkIERlZmF1bHRzIC0tPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuaG9tZSIgICAgIGxvY2F0aW9uPSIuLiIvPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuYnVpbGQiICAgIHZhbHVlPSIke2NhdGFsaW5hLmhvbWV9L2NhdGFsaW5hL2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzLmRpciIgdmFsdWU9IiR7Y2F0YWxpbmEuYnVpbGR9L3NlcnZlci9jbGFzc2VzIiAvPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuZGVwbG95IiAgIHZhbHVlPSIke2NhdGFsaW5hLmhvbWV9L2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5kaXN0IiAgICAgdmFsdWU9IiR7Y2F0YWxpbmEuaG9tZX0vZGlzdCIvPgorICA8cHJvcGVydHkgbmFtZT0idGVzdC5mYWlsb25lcnJvciIgIHZhbHVlPSJ0cnVlIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LnJ1bm5lciIgICAgICAgdmFsdWU9Imp1bml0LnRleHR1aS5UZXN0UnVubmVyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LndlYmFwcCIgICAgICAgdmFsdWU9Ii4uL3dlYmFwcHMvYnVpbGQvUk9PVCIvPgorICA8cHJvcGVydHkgbmFtZT0idGVzdC53ZWJhcHAud2FyIiAgIHZhbHVlPSIke2phdmEuaW8udG1wZGlyfS93ZWJhcHAud2FyIi8+CisKKyAgPCEtLSBTb3VyY2UgZGVwZW5kZW5jaWVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0idG9tY2F0LXV0aWwuaG9tZSIgICAgICAgdmFsdWU9IiR7anRjLmhvbWV9L3V0aWwiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRvbWNhdC1jb3lvdGUuaG9tZSIgICAgIHZhbHVlPSIke2p0Yy5ob21lfS9jb3lvdGUiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRvbWNhdC1qay5ob21lIiAgICAgICAgIHZhbHVlPSIke2p0Yy5ob21lfS9qayIvPgorICA8cHJvcGVydHkgbmFtZT0idG9tY2F0LWh0dHAxMS5ob21lIiAgICAgdmFsdWU9IiR7anRjLmhvbWV9L2h0dHAxMSIvPgorCisgIDwhLS0gRGVwZW5kZW50IEpBUnMgYW5kIGZpbGVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0iYW50LmphciIgdmFsdWU9IiR7YW50LmhvbWV9L2xpYi9hbnQuamFyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2bGV0LWFwaS5qYXIiIHZhbHVlPSIke2FwaS5ob21lfS9qc3IxNTQvZGlzdC9saWIvc2VydmxldC1hcGkuamFyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0b21jYXQtdXRpbC5qYXIiCisgICAgICAgICAgIHZhbHVlPSIke3RvbWNhdC11dGlsLmhvbWV9L2J1aWxkL2xpYi90b21jYXQtdXRpbC5qYXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRvbWNhdC1jb3lvdGUuamFyIgorICAgICAgICAgICB2YWx1ZT0iJHt0b21jYXQtY295b3RlLmhvbWV9L2J1aWxkL2xpYi90b21jYXQtY295b3RlLmphciIvPgorICA8cHJvcGVydHkgbmFtZT0idG9tY2F0LWprMi5qYXIiCisgICAgICAgICAgIHZhbHVlPSIke3RvbWNhdC1qay5ob21lfS9idWlsZC9saWIvdG9tY2F0LWprMi5qYXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRvbWNhdC1qbmkuamFyIgorICAgICAgICAgICB2YWx1ZT0iJHt0b21jYXQtamsuaG9tZX0vYnVpbGQvbGliL3RvbWNhdC1qbmkuamFyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqazIucHJvcGVydGllcyIKKyAgICAgICAgICAgdmFsdWU9IiR7dG9tY2F0LWprLmhvbWV9L2J1aWxkL2NvbmYvamsyLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRvbWNhdC1odHRwMTEuamFyIgorICAgICAgICAgICB2YWx1ZT0iJHt0b21jYXQtaHR0cDExLmhvbWV9L2J1aWxkL2xpYi90b21jYXQtaHR0cDExLmphciIvPgorICA8cHJvcGVydHkgbmFtZT0idG9tY2F0LWRiY3AuamFyIiAKKyAgICAgICAgICAgdmFsdWU9IiR7YmFzZS5wYXRofS90b21jYXQtZGVwcy9uYW1pbmctZmFjdG9yeS1kYmNwLmphciIvPgorICA8IS0tIENvbnN0cnVjdCBDYXRhbGluYSBjbGFzc3BhdGggLS0+CisgIDxwYXRoIGlkPSJjYXRhbGluYS5jbGFzc3BhdGgiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthY3RpdmF0aW9uLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YW50Lmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1iZWFudXRpbHMuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWNvbGxlY3Rpb25zLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dG9tY2F0LWRiY3AuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWRpZ2VzdGVyLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1maWxldXBsb2FkLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sYXVuY2hlci5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbG9nZ2luZy5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbW9kZWxlci5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3RvbWNhdC11dGlsLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dG9tY2F0LWNveW90ZS5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2phYXMuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXZhZ3JvdXBzLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amNlcnQuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqbXguamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqbXgtcmVtb3RlLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7am5kaS5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2puZXQuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqc3NlLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF2YS5ob21lfS9saWIvanNzZS5qYXIiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7anRhLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bGRhcC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke21haWwuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtyZWdleHAuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtzZXJ2bGV0LWFwaS5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3hlcmNlc0ltcGwuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4bWwtYXBpcy5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NsYXNzZXMuZGlyfSIvPgorICA8L3BhdGg+CisKKyAgPCEtLSBDb25zdHJ1Y3QgdW5pdCB0ZXN0cyBjbGFzc3BhdGggLS0+CisgIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2p1bml0Lmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWN0aXZhdGlvbi5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2FudC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtYmVhbnV0aWxzLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1jb2xsZWN0aW9ucy5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3RvbWNhdC1kYmNwLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1kaWdlc3Rlci5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtZmlsZXVwbG9hZC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbGF1bmNoZXIuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxvZ2dpbmcuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLW1vZGVsZXIuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYWFzLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amNlcnQuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqbXguamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqbmRpLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7am5ldC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pzc2UuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqdGEuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtsZGFwLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bWFpbC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3JlZ2V4cC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3NlcnZsZXQtYXBpLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eGVyY2VzSW1wbC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3htbC1hcGlzLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NhdGFsaW5hLmJ1aWxkfS90ZXN0cyIvPgorICA8L3BhdGg+CisKKyAgPCEtLSBTb3VyY2UgcGF0aCAtLT4KKyAgPHBhdGggaWQ9ImphdmFkb2Muc291cmNlcGF0aCI+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvc2hhcmUiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dG9tY2F0LXV0aWwuaG9tZX0vamF2YSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0b21jYXQtY295b3RlLmhvbWV9L3NyYy9qYXZhIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3RvbWNhdC1qay5ob21lfS9qYXZhIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3RvbWNhdC1odHRwMTEuaG9tZX0vc3JjL2phdmEiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlIi8+CisgIDwvcGF0aD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogU2V0IGNvbXBpbGUgZmxhZ3MgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZmxhZ3MiPgorCisgICAgPCEtLSBKREsgZmxhZ3MgLS0+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrLjEuMi5wcmVzZW50IiBjbGFzc25hbWU9ImphdmEudXRpbC5IYXNoTWFwIiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Impkay4xLjMucHJlc2VudCIgCisgICAgIGNsYXNzbmFtZT0iamF2YS5sYW5nLnJlZmxlY3QuUHJveHkiIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrLjEuNC5wcmVzZW50IiBjbGFzc25hbWU9ImphdmEubmlvLkJ1ZmZlciIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsuMS41LnByZXNlbnQiIAorICAgICBjbGFzc25hbWU9ImphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZSIgLz4KKworICAgIDwhLS0gQW50IGZsYWdzIC0tPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InN0eWxlLmF2YWlsYWJsZSIKKyAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5UcmFYTGlhaXNvbiIgLz4KKworICAgIDwhLS0gU291cmNlIHBhdGggLS0+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ianRjLmhvbWUucHJlc2VudCIgZmlsZT0iJHtqdGMuaG9tZX0iIC8+CisKKyAgICA8IS0tIENsYXNzIGF2YWlsYWJpbGl0eSBmbGFncyAtLT4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJiZWFudXRpbHMucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkJlYW5VdGlscyIKKyAgICAgY2xhc3NwYXRoPSIke2NvbW1vbnMtYmVhbnV0aWxzLmphcn0iLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJjb2xsZWN0aW9ucy5wcmVzZW50IgorICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5GYXN0SGFzaE1hcCIKKyAgICAgY2xhc3NwYXRoPSIke2NvbW1vbnMtY29sbGVjdGlvbnMuamFyfSIvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImRiY3AucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvbWNhdC5kYmNwLmRiY3AuQ29ubmVjdGlvbkZhY3RvcnkiCisgICAgIGNsYXNzcGF0aD0iJHt0b21jYXQtZGJjcC5qYXJ9Ii8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iZGlnZXN0ZXIucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuRGlnZXN0ZXIiCisgICAgIGNsYXNzcGF0aD0iJHtjb21tb25zLWRpZ2VzdGVyLmphcn0iLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJmaWxldXBsb2FkLnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQuRmlsZVVwbG9hZCIKKyAgICAgY2xhc3NwYXRoPSIke2NvbW1vbnMtZmlsZXVwbG9hZC5qYXJ9Ii8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ibGF1bmNoZXIucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMubGF1bmNoZXIuTGF1bmNoZXIiCisgICAgIGNsYXNzcGF0aD0iJHtjb21tb25zLWxhdW5jaGVyLmphcn0iLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJsYXVuY2hlci5ib290c3RyYXAucHJlc2VudCIKKyAgICAgZmlsZT0iJHtjb21tb25zLWxhdW5jaGVyLmJvb3RzdHJhcC5jbGFzc30iLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJsb2dnaW5nLnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIgorICAgICBjbGFzc3BhdGg9IiR7Y29tbW9ucy1sb2dnaW5nLmphcn0iLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJtb2RlbGVyLnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnkiCisgICAgIGNsYXNzcGF0aD0iJHtjb21tb25zLW1vZGVsZXIuamFyfToke2pteC5qYXJ9Ii8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamFhcy5wcmVzZW50IgorICAgICBjbGFzc25hbWU9ImphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdCIKKyAgICAgY2xhc3NwYXRoPSIke2phYXMuamFyfSIgLz4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqYXhwLnByZXNlbnQiPgorICAgICAgPGFuZD4KKyAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9ImphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciIKKyAgICAgICAgIGNsYXNzcGF0aD0iJHt4bWwtYXBpcy5qYXJ9IiAvPgorICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0ib3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIiCisgICAgICAgICBjbGFzc3BhdGg9IiR7eG1sLWFwaXMuamFyfSIgLz4KKyAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImphdmFtYWlsLnByZXNlbnQiPgorICAgICAgPGFuZD4KKyAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9ImphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSIKKyAgICAgICAgIGNsYXNzcGF0aD0iJHthY3RpdmF0aW9uLmphcn0iIC8+CisgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZheC5tYWlsLlNlcnZpY2UiCisgICAgICAgICBjbGFzc3BhdGg9IiR7bWFpbC5qYXJ9IiAvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iam14LnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0iamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlciIKKyAgICAgY2xhc3NwYXRoPSIke2pteC5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpuZGkucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJqYXZheC5uYW1pbmcuQ29udGV4dCIKKyAgICAgY2xhc3NwYXRoPSIke2puZGkuamFyfSIgLz4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqc3NlLnByZXNlbnQiPgorICAgICAgPGFuZD4KKyAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9ImphdmF4LnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUiCisgICAgICAgICBjbGFzc3BhdGg9IiR7amNlcnQuamFyfSIgLz4KKyAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9ImphdmF4Lm5ldC5Tb2NrZXRGYWN0b3J5IgorICAgICAgICAgY2xhc3NwYXRoPSIke2puZXQuamFyfSIgLz4KKyAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9ImphdmF4Lm5ldC5zc2wuU1NMU29ja2V0IgorICAgICAgICAgY2xhc3NwYXRoPSIke2pzc2UuamFyfSIgLz4KKyAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Imp0YS5wcmVzZW50IgorICAgICAgY2xhc3NuYW1lPSJqYXZheC50cmFuc2FjdGlvbi5Vc2VyVHJhbnNhY3Rpb24iCisgICAgICBjbGFzc3BhdGg9IiR7anRhLmphcn0iIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ianVuaXQucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UiCisgICAgIGNsYXNzcGF0aD0iJHtqdW5pdC5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImxkYXAucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJjb20uc3VuLmpuZGkubGRhcC5MZGFwQ2xpZW50IgorICAgICBjbGFzc3BhdGg9IiR7bGRhcC5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InBvb2wucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvbWNhdC5kYmNwLnBvb2wuT2JqZWN0UG9vbCIKKyAgICAgY2xhc3NwYXRoPSIke3RvbWNhdC1kYmNwLmphcn0iLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJyZWdleHAucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnJlZ2V4cC5SRSIKKyAgICAgY2xhc3NwYXRoPSIke3JlZ2V4cC5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InhlcmNlcy5wcmVzZW50IgorICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyIgorICAgICBjbGFzc3BhdGg9IiR7eGVyY2VzSW1wbC5qYXJ9IiAvPgorCisgICAgPCEtLSBKQVIgZmlsZXMgYXZhaWxhYmlsaXR5IGZsYWdzIC0tPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImRiY3AuamFyLnByZXNlbnQiIGZpbGU9IiR7dG9tY2F0LWRiY3AuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJmaWxldXBsb2FkLmphci5wcmVzZW50IiBmaWxlPSIke2NvbW1vbnMtZmlsZXVwbG9hZC5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImphYXMuamFyLnByZXNlbnQiIGZpbGU9IiR7amFhcy5qYXJ9IiAvPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImphdmFtYWlsLmphci5wcmVzZW50Ij4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHthY3RpdmF0aW9uLmphcn0iIC8+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHttYWlsLmphcn0iIC8+CisgICAgICA8L2FuZD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqbXguamFyLnByZXNlbnQiIGZpbGU9IiR7am14Lmphcn0iIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamNlcnQuamFyLnByZXNlbnQiIGZpbGU9IiR7amNlcnQuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqbmRpLmphci5wcmVzZW50IiBmaWxlPSIke2puZGkuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqbmV0Lmphci5wcmVzZW50IiBmaWxlPSIke2puZXQuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqc3NlLmphci5wcmVzZW50IiBmaWxlPSIke2pzc2UuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqdGEuamFyLnByZXNlbnQiIGZpbGU9IiR7anRhLmphcn0iIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ianVuaXQuamFyLnByZXNlbnQiIGZpbGU9IiR7anVuaXQuamFyfSIgLz4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJsYXVuY2hlci5qYXJzLnByZXNlbnQiPgorICAgICAgPGFuZD4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2xhdW5jaGVyLnByZXNlbnR9IiBhcmcyPSJ0cnVlIi8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtsYXVuY2hlci5ib290c3RyYXAucHJlc2VudH0iIGFyZzI9InRydWUiLz4KKyAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImxkYXAuamFyLnByZXNlbnQiIGZpbGU9IiR7bGRhcC5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImxvZ2dpbmcuamFyLnByZXNlbnQiIGZpbGU9IiR7Y29tbW9ucy1sb2dnaW5nLmphcn0iIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ibW9kZWxlci5qYXIucHJlc2VudCIgZmlsZT0iJHtjb21tb25zLW1vZGVsZXIuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJwb29sLmphci5wcmVzZW50IiBmaWxlPSIke3RvbWNhdC1kYmNwLmphcn0iIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0icmVnZXhwLmphci5wcmVzZW50IiBmaWxlPSIke3JlZ2V4cC5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InNlcnZsZXQtYXBpLmphci5wcmVzZW50IiBmaWxlPSIke3NlcnZsZXQtYXBpLmphcn0iIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idG9tY2F0LXV0aWwuamFyLnByZXNlbnQiIGZpbGU9IiR7dG9tY2F0LXV0aWwuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ4ZXJjZXNJbXBsLmphci5wcmVzZW50IiBmaWxlPSIke3hlcmNlc0ltcGwuamFyfSIvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InhtbC1hcGlzLmphci5wcmVzZW50IiBmaWxlPSIke3htbC1hcGlzLmphcn0iLz4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ4ZXJjZXMyLmphcnMucHJlc2VudCI+CisgICAgICA8YW5kPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7eGVyY2VzSW1wbC5qYXIucHJlc2VudH0iIGFyZzI9InRydWUiLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke3htbC1hcGlzLmphci5wcmVzZW50fSIgYXJnMj0idHJ1ZSIvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8IS0tIENvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGZsYWdzIChkZXRlcm1pbmVkIGZyb20gdGhlIGZsYWdzIGFib3ZlKSAtLT4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb21waWxlLmRiY3AiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxhbmQ+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke2RiY3AucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke3Bvb2wucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICAgIDwvYW5kPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb21waWxlLmphYXMiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtqYWFzLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb21waWxlLmphdmFtYWlsIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2Z1bGwuZGlzdH0iIGFyZzI9Im9uIiAvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7amF2YW1haWwucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbXBpbGUuam14Ij4KKyAgICAgIDxvcj4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2Z1bGwuZGlzdH0iIGFyZzI9Im9uIiAvPgorICAgICAgICA8YW5kPgorICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtqbXgucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke21vZGVsZXIucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICAgIDwvYW5kPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb21waWxlLmpuZGkiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtqbmRpLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7amRrLjEuMy5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY29tcGlsZS5qc3NlIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2Z1bGwuZGlzdH0iIGFyZzI9Im9uIiAvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7anNzZS5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2pkay4xLjQucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbXBpbGUuanRhIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2Z1bGwuZGlzdH0iIGFyZzI9Im9uIiAvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7anRhLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb21waWxlLmp1bml0Ij4KKyAgICAgIDxvcj4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2Z1bGwuZGlzdH0iIGFyZzI9Im9uIiAvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7anVuaXQucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbXBpbGUubGF1bmNoZXIiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxhbmQ+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke2xhdW5jaGVyLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtsYXVuY2hlci5ib290c3RyYXAucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICAgIDwvYW5kPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb21waWxlLmxkYXAiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtsZGFwLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7amRrLjEuMy5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICAgPHByb3BlcnR5IG5hbWU9ImNvbXBpbGUuc3NpIiB2YWx1ZT0idHJ1ZSIvPgorCisKKyAgICA8IS0tIENvbmRpdGlvbmFsIGNvcHkgZmxhZ3MgKGRldGVybWluZWQgZnJvbSB0aGUgZmxhZ3MgYWJvdmUpIC0tPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvcHkuZGJjcC5qYXIiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtkYmNwLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb3B5LmpteC5qYXIiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtqbXguamFyLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb3B5LmxhbmcuamFyIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2Z1bGwuZGlzdH0iIGFyZzI9Im9uIiAvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7bGFuZy5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY29weS5sYXVuY2hlci5qYXJzIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2Z1bGwuZGlzdH0iIGFyZzI9Im9uIiAvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7bGF1bmNoZXIuamFycy5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY29weS5tb2RlbGVyLmphciI+CisgICAgICA8b3I+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtmdWxsLmRpc3R9IiBhcmcyPSJvbiIgLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke21vZGVsZXIucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvcHkubG9nZ2luZy5qYXIiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtsb2dnaW5nLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb3B5LnBvb2wuamFyIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2Z1bGwuZGlzdH0iIGFyZzI9Im9uIiAvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7cG9vbC5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IFNldCBjb21waWxlIGZsYWdzID09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImZsYWdzLmRpc3BsYXkiIGRlcGVuZHM9ImZsYWdzIiB1bmxlc3M9ImZsYWdzLmhpZGUiPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIEJ1aWxkIGVudmlyb25tZW50IGZvciBDYXRhbGluYSAtLS0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSJJZiAke3Byb3BlcnR5X25hbWV9IGlzIGRpc3BsYXllZCwgdGhlbiB0aGUgcHJvcGVydHkgaXMgbm90IHNldCkiIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gQnVpbGQgb3B0aW9ucyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iZnVsbC5kaXN0PSR7ZnVsbC5kaXN0fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJidWlsZC5zeXNjbGFzc3BhdGg9JHtidWlsZC5zeXNjbGFzc3BhdGh9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUuZGVidWc9JHtjb21waWxlLmRlYnVnfSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlLmRlcHJlY2F0aW9uPSR7Y29tcGlsZS5kZXByZWNhdGlvbn0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5vcHRpbWl6ZT0ke2NvbXBpbGUub3B0aW1pemV9IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIEFudCBGbGFncyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iJmx0O3N0eWxlJmd0OyB0YXNrIGF2YWlsYWJsZSAocmVxdWlyZWQpPSR7c3R5bGUuYXZhaWxhYmxlfSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBKREsgLS0tIiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Impkay4xLjIucHJlc2VudD0ke2pkay4xLjIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iamRrLjEuMy5wcmVzZW50PSR7amRrLjEuMy5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqZGsuMS40LnByZXNlbnQ9JHtqZGsuMS40LnByZXNlbnR9IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIFNvdXJjZSBEZXBlbmRlbmNpZXMgLS0tIiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Imp0Yy5ob21lLnByZXNlbnQ9JHtqdGMuaG9tZS5wcmVzZW50fSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBSZXF1aXJlZCBMaWJyYXJpZXMgLS0tIiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImJlYW51dGlscy5wcmVzZW50PSR7YmVhbnV0aWxzLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvbGxlY3Rpb25zLnByZXNlbnQ9JHtjb2xsZWN0aW9ucy5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJkaWdlc3Rlci5wcmVzZW50PSR7ZGlnZXN0ZXIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iamF4cC5wcmVzZW50PSR7amF4cC5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqbmRpLnByZXNlbnQ9JHtqbmRpLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImxvZ2dpbmcucHJlc2VudD0ke2xvZ2dpbmcucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0icmVnZXhwLnByZXNlbnQ9JHtyZWdleHAucHJlc2VudH0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gT3B0aW9uYWwgTGlicmFyaWVzIC0tLSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJkYmNwLnByZXNlbnQ9JHtkYmNwLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImZpbGV1cGxvYWQucHJlc2VudD0ke2ZpbGV1cGxvYWQucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iamFhcy5wcmVzZW50PSR7amFhcy5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqYXZhbWFpbC5wcmVzZW50PSR7amF2YW1haWwucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iam14LnByZXNlbnQ9JHtqbXgucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ianNzZS5wcmVzZW50PSR7anNzZS5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqdGEucHJlc2VudD0ke2p0YS5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqdW5pdC5wcmVzZW50PSR7anVuaXQucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ibGFuZy5wcmVzZW50PSR7bGFuZy5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJsYXVuY2hlci5wcmVzZW50PSR7bGF1bmNoZXIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ibGF1bmNoZXIuYm9vdHN0cmFwLnByZXNlbnQ9JHtsYXVuY2hlci5ib290c3RyYXAucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ibGRhcC5wcmVzZW50PSR7bGRhcC5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJtb2RlbGVyLnByZXNlbnQ9JHttb2RlbGVyLnByZXNlbnR9IiAgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJwb29sLnByZXNlbnQ9JHtwb29sLnByZXNlbnR9IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIFJlcXVpcmVkIEpBUnMgLS0tIiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImpuZGkuamFyLnByZXNlbnQoZXhjZXB0IEpESyAxLjMrKT0ke2puZGkuamFyLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9InJlZ2V4cC5qYXIucHJlc2VudD0ke3JlZ2V4cC5qYXIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ic2VydmxldC1hcGkuamFyLnByZXNlbnQ9JHtzZXJ2bGV0LWFwaS5qYXIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ieGVyY2VzMi5qYXJzLnByZXNlbnQoZXhjZXB0IEpESyAxLjQrKT0ke3hlcmNlczIuamFycy5wcmVzZW50fSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBPcHRpb25hbCBKQVJzIC0tLSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJkYmNwLmphci5wcmVzZW50PSR7ZGJjcC5qYXIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iZmlsZXVwbG9hZC5qYXIucHJlc2VudD0ke2ZpbGV1cGxvYWQuamFyLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImphYXMuamFyLnByZXNlbnQ9JHtqYWFzLmphci5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqYXZhbWFpbC5qYXIucHJlc2VudD0ke2phdmFtYWlsLmphci5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqbXguamFyLnByZXNlbnQ9JHtqbXguamFyLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Imp0YS5qYXIucHJlc2VudD0ke2p0YS5qYXIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ianVuaXQuamFyLnByZXNlbnQ9JHtqdW5pdC5qYXIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ibW9kZWxlci5qYXIucHJlc2VudD0ke21vZGVsZXIuamFyLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9InBvb2wuamFyLnByZXNlbnQ9JHtwb29sLmphci5wcmVzZW50fSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBDb25kaXRpb25hbCBjb21waWxhdGlvbiBmbGFncyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5kYmNwPSR7Y29tcGlsZS5kYmNwfSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlLmphYXM9JHtjb21waWxlLmphYXN9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUuamF2YW1haWw9JHtjb21waWxlLmphdmFtYWlsfSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlLmpteD0ke2NvbXBpbGUuam14fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlLmpuZGk9JHtjb21waWxlLmpuZGl9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUuanNzZT0ke2NvbXBpbGUuanNzZX0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5qdGE9JHtjb21waWxlLmp0YX0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5qdW5pdD0ke2NvbXBpbGUuanVuaXR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUubGRhcD0ke2NvbXBpbGUubGRhcH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5zc2k9JHtjb21waWxlLnNzaX0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gRGlzdHJpYnV0aW9uIGZsYWdzIC0tLSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb3B5LmRiY3AuamFyPSR7Y29weS5kYmNwLmphcn0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29weS5qbXguamFyPSR7Y29weS5qbXguamFyfSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb3B5LmxhdW5jaGVyLmphcnM9JHtjb3B5LmxhdW5jaGVyLmphcnN9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvcHkubG9nZ2luZy5qYXI9JHtjb3B5LmxvZ2dpbmcuamFyfSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb3B5Lm1vZGVsZXIuamFyPSR7Y29weS5tb2RlbGVyLmphcn0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29weS5wb29sLmphcj0ke2NvcHkucG9vbC5qYXJ9IiAvPgorCisgIDwvdGFyZ2V0PgorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtcHJlcGFyZSI+CisKKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfSIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2JpbiIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NvbW1vbi9jbGFzc2VzIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5idWlsZH0vY29tbW9uL2xpYiIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NvbW1vbi9lbmRvcnNlZCIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NvbmYiLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9sb2dzIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9zZXJ2ZXIvbGliIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5idWlsZH0vc2hhcmVkL2NsYXNzZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9zaGFyZWQvbGliIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5idWlsZH0vd29yayIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L3RlbXAiLz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDb3B5IEpBUnMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iY29weS1kYmNwLmphciIgaWY9ImNvcHkuZGJjcC5qYXIiPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jb21tb24vbGliIiBmaWxlPSIke2NvbW1vbnMtZGJjcC5qYXJ9Ii8+CisgIDwvdGFyZ2V0PgorICA8dGFyZ2V0IG5hbWU9ImNvcHktZmlsZXVwbG9hZC5qYXIiIGlmPSJmaWxldXBsb2FkLmphci5wcmVzZW50Ij4KKyAgPC90YXJnZXQ+CisgIDx0YXJnZXQgbmFtZT0iY29weS1qbXguamFyIiBpZj0iY29weS5qbXguamFyIj4KKyAgICA8Y29weSB0b2ZpbGU9IiR7Y2F0YWxpbmEuYnVpbGR9L2Jpbi9qbXguamFyIiBmaWxlPSIke2pteC5qYXJ9Ii8+CisgIDwvdGFyZ2V0PgorICA8dGFyZ2V0IG5hbWU9ImNvcHktbGF1bmNoZXIuamFycyIgaWY9ImNvcHkubGF1bmNoZXIuamFycyI+CisgICAgPCEtLSA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vY29tbW9uL2xpYiIgZmlsZT0iJHthbnQuamFyfSIvPiAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vYmluIiBmaWxlPSIke2NvbW1vbnMtbGF1bmNoZXIuamFyfSIvPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9iaW4iIGZpbGU9IiR7Y29tbW9ucy1sYXVuY2hlci5ib290c3RyYXAuY2xhc3N9Ii8+CisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2JpbiI+CisgICAgICA8ZmlsZXNldCBkaXI9InNyYy9iaW4iIGluY2x1ZGVzPSIqLXVzaW5nLWxhdW5jaGVyLiosbGF1bmNoZXIucHJvcGVydGllcyxjYXRhbGluYS54bWwiIC8+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJjb3B5LW1vZGVsZXIuamFyIiBpZj0iY29weS5tb2RlbGVyLmphciI+CisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L3NlcnZlci9saWIiIGZpbGU9IiR7Y29tbW9ucy1tb2RlbGVyLmphcn0iLz4KKyAgPC90YXJnZXQ+CisgIDx0YXJnZXQgbmFtZT0iY29weS1wb29sLmphciIgaWY9ImNvcHkucG9vbC5qYXIiPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jb21tb24vbGliIiBmaWxlPSIke2NvbW1vbnMtcG9vbC5qYXJ9Ii8+CisgIDwvdGFyZ2V0PgorICA8dGFyZ2V0IG5hbWU9ImNvcHktdG9tY2F0LXV0aWwuamFyIj4KKyAgCTwhLS0KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vc2VydmVyL2xpYiIgZmlsZT0iJHt0b21jYXQtdXRpbC5qYXJ9Ii8+CisgICAgLS0+CisJPGphciBqYXJmaWxlPSIke3RvbWNhdC11dGlsLmphcn0iCisgICAgICAgICAgICAgaW5kZXg9InRydWUiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jbGFzc2VzIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b21jYXQvdXRpbC8qKiIvPgorICAgICAgICA8IS0tIEphdmFkb2MgYW5kIGkxOG4gZXhjbHVzaW9ucyAtLT4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovcGFja2FnZS5odG1sIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9Mb2NhbFN0cmluZ3NfKiIgLz4KKyAgICAgPC9maWxlc2V0PgorICAgIDwvamFyPgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJjb3B5LXhlcmNlczIuamFycyI+CisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NvbW1vbi9lbmRvcnNlZCIgZmlsZT0iJHt4ZXJjZXNJbXBsLmphcn0iLz4KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vY29tbW9uL2VuZG9yc2VkIiBmaWxlPSIke3htbC1hcGlzLmphcn0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENvcHkgU3RhdGljIEZpbGVzID09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXN0YXRpYyIgZGVwZW5kcz0iZmxhZ3MsZmxhZ3MuZGlzcGxheSxidWlsZC1wcmVwYXJlLGNvcHktZmlsZXVwbG9hZC5qYXIsY29weS1sYXVuY2hlci5qYXJzLGNvcHktbW9kZWxlci5qYXIiPgorCisgICAgPCEtLSBFeGVjdXRhYmxlIENvbW1hbmRzIC0tPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9iaW4iPgorICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvYmluIiBleGNsdWRlcz0iKi11c2luZy1sYXVuY2hlci4qLGxhdW5jaGVyLnByb3BlcnRpZXMsY2F0YWxpbmEueG1sLCotdGFza3MueG1sIiAvPgorICAgIDwvY29weT4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2JpbiIgaW5jbHVkZXM9Iiouc2giIGVvbD0ibGYiLz4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2JpbiIgaW5jbHVkZXM9IiouYmF0IiBlb2w9ImNybGYiLz4KKyAgICA8Y2htb2QgcGVybT0iK3giIGRpcj0iJHtjYXRhbGluYS5idWlsZH0vYmluIiBpbmNsdWRlcz0iKi5zaCIvPgorCisgICAgPCEtLSBDb21tb24gRXh0ZW5zaW9ucyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vYmluIgorICAgICAgICAgICBmaWxlPSIke2NvbW1vbnMtbG9nZ2luZy1hcGkuamFyfSIvPgorPCEtLQorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jb21tb24vbGliIiBmaWxlPSIke3NlcnZsZXQtYXBpLmphcn0iLz4KKy0tPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jb21tb24vbGliIgorICAgICAgICAgICBmaWxlPSIke3RvbWNhdC1kYmNwLmphcn0iIC8+CisKKyAgICA8IS0tIENvbmZpZ3VyYXRpb24gRmlsZXMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NvbmYiPgorICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvY29uZiI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImNhdGFsaW5hLmNvbmYueG1sIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY29weT4KKworICAgIDwhLS0gSlZNIFRlbXBvcmFyeSBEaXJlY3RvcnkgUkVBRE1FIC0tPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS90ZW1wIgorICAgICAgICAgIGZpbGU9InNyYy90ZW1wL1JFQURNRS50eHQiLz4KKworICAgIDwhLS0gQ2F0YWxpbmEgU2VydmVyIExpYnJhcmllcyAtLT4KKyAgCTwhLS0KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vc2VydmVyL2xpYiIgZmlsZT0iJHtyZWdleHAuamFyfSIvPgorICAgIC0tPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBCdWlsZCB0b21jYXQtdXRpbCA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC10b21jYXQtdXRpbCI+CisKKyAgICA8YW50IGRpcj0iJHt0b21jYXQtdXRpbC5ob21lfSIgdGFyZ2V0PSJidWlsZC1tYWluIj4KKyAgICAgICA8cHJvcGVydHkgbmFtZT0iam14LmphciIgdmFsdWU9IiR7am14Lmphcn0iIC8+CisgICAgICAgPHByb3BlcnR5IG5hbWU9InB1cmV0bHMuamFyIiB2YWx1ZT0iJHtwdXJldGxzLmphcn0iIC8+CisgICAgICAgPHByb3BlcnR5IG5hbWU9Impzc2UubGliIiB2YWx1ZT0iJHtqc3NlLmxpYn0iIC8+CisgICAgPC9hbnQ+CisKKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vc2VydmVyL2xpYiIKKyAgICAgICAgICAgZmlsZT0iJHt0b21jYXQtdXRpbC5qYXJ9Ii8+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT0gQlVJTEQ6IENvbXBpbGUgQ2F0YWxpbmEgQ29tcG9uZW50cyA9PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNhdGFsaW5hIiBkZXBlbmRzPSJidWlsZC1jYXRhbGluYS1jb3JlLGJ1aWxkLWNhdGFsaW5hLW9wdGlvbmFsIi8+CisKKyAgPHRhcmdldCBuYW1lPSJidWlsZC1jYXRhbGluYS1jb3JlIj4KKyAgICA8IS0tIENvbXBpbGUgaW50ZXJuYWwgc2VydmVyIGNvbXBvbmVudHMgLS0+CisgICAgPGphdmFjIHNyY2Rpcj0ic3JjL3NoYXJlIiBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIKKyAgICAgICAgICAgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iCisgICAgICAgICAgIGRlcHJlY2F0aW9uPSIke2NvbXBpbGUuZGVwcmVjYXRpb259IgorICAgICAgICAgICBzb3VyY2U9IiR7Y29tcGlsZS5zb3VyY2V9IgorICAgICAgICAgICBvcHRpbWl6ZT0iJHtjb21waWxlLm9wdGltaXplfSIKKyAgICAgICAgICAgZXhjbHVkZXM9IioqL0NWUy8qKiI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjYXRhbGluYS5jbGFzc3BhdGgiIC8+CisKKyAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Qcm9jZXNzSGVscGVyLmphdmEiIAorICAgICAgICAgICAgICAgdW5sZXNzPSJqZGsuMS4zLnByZXNlbnQiLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0NlcnRpZmljYXRlc1ZhbHZlLmphdmEiCisgICAgICAgICAgICAgICB1bmxlc3M9ImNvbXBpbGUuanNzZSIvPgorCisgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0NHSVNlcnZsZXQuamF2YSIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvSFRNTE1hbmFnZXJTZXJ2bGV0LmphdmEiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L0RiY3BEYXRhU291cmNlRmFjdG9yeS5qYXZhIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvKioiLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci8qKiIvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9NYWlsU2Vzc2lvbkZhY3RvcnkuamF2YSIvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9TZW5kTWFpbEZhY3RvcnkuamF2YSIvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9sYXVuY2hlci8qKiIvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvU2VtYXBob3JlVmFsdmUuamF2YSIvPgorICAgIDwvamF2YWM+CisgICAgPHRzdGFtcD4KKyAgICAgICAgPGZvcm1hdCBwcm9wZXJ0eT0iVE9EQVkiIHBhdHRlcm49Ik1NTSBkIHl5eXkiIGxvY2FsZT0iZW4iLz4KKyAgICAgICAgPGZvcm1hdCBwcm9wZXJ0eT0iVFNUQU1QIiBwYXR0ZXJuPSJoaDptbTpzcyIvPiAgICAgICAgCisgICAgPC90c3RhbXA+ICAgIAorICAgIDwhLS0gQ29weSBzdGF0aWMgcmVzb3VyY2UgZmlsZXMgLS0+CisgICAgPGZpbHRlciB0b2tlbj0iVkVSU0lPTiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KKyAgICA8ZmlsdGVyIHRva2VuPSJWRVJTSU9OX05VTUJFUiIgdmFsdWU9IiR7dmVyc2lvbi5udW1iZXJ9Ii8+CisgICAgPGZpbHRlciB0b2tlbj0iVkVSU0lPTl9CVUlMVCIgdmFsdWU9IiR7VE9EQVl9ICR7VFNUQU1QfSIvPgorICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXMuZGlyfSIgZmlsdGVyaW5nPSJ0cnVlIiBlbmNvZGluZz0iSVNPLTg4NTktMSI+CisgICAgICA8ZmlsZXNldCBkaXI9InNyYy9zaGFyZSI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLyouamF2YSIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qLnNlciIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY29weT4KKyAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzLmRpcn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvc2hhcmUiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnNlciIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY29weT4KKworICA8L3RhcmdldD4KKworCQorCisJCisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtY2F0YWxpbmEtb3B0aW9uYWwiIHVubGVzcz0iYnVpbGQudG9tY2F0LmJhc2UiPgorICAgIDwhLS0gQ29tcGlsZSBpbnRlcm5hbCBzZXJ2ZXIgY29tcG9uZW50cyAtLT4KKyAgICA8amF2YWMgc3JjZGlyPSJzcmMvc2hhcmUiIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IgorICAgICAgICAgICBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIKKyAgICAgICAgICAgZGVwcmVjYXRpb249IiR7Y29tcGlsZS5kZXByZWNhdGlvbn0iCisgICAgICAgICAgIG9wdGltaXplPSIke2NvbXBpbGUub3B0aW1pemV9IgorICAgICAgICAgICBzb3VyY2U9IiR7Y29tcGlsZS5zb3VyY2V9IgorICAgICAgICAgICBleGNsdWRlcz0iKiovQ1ZTLyoqIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNhdGFsaW5hLmNsYXNzcGF0aCIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvTWFpbFNlc3Npb25GYWN0b3J5LmphdmEiCisgICAgICAgdW5sZXNzPSJjb21waWxlLmphdmFtYWlsIi8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L1NlbmRNYWlsRmFjdG9yeS5qYXZhIgorICAgICAgIHVubGVzcz0iY29tcGlsZS5qYXZhbWFpbCIvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvQ2VydGlmaWNhdGVzVmFsdmUuamF2YSIKKyAgICAgICB1bmxlc3M9ImNvbXBpbGUuanNzZSIvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvU2VtYXBob3JlVmFsdmUuamF2YSIgCisgICAgICAgdW5sZXNzPSJqZGsuMS41LnByZXNlbnQiLz4KKyAgICA8L2phdmFjPgorCisgICAgPCEtLSBDb3B5IHN0YXRpYyByZXNvdXJjZSBmaWxlcyAtLT4KKyAgICA8ZmlsdGVyIHRva2VuPSJWRVJTSU9OIiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgorICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXMuZGlyfSIgZmlsdGVyaW5nPSJ0cnVlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3NoYXJlIj4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8IS0tID09PT09PT09PT09PT09PT09PSBCVUlMRDogQnVpbGQgdG9tY2F0LWNveW90ZSA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXRvbWNhdC1jb3lvdGUiPgorCisgICAgPGFudCBkaXI9IiR7dG9tY2F0LWNveW90ZS5ob21lfSIgdGFyZ2V0PSJjb21waWxlIj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5ob21lIiB2YWx1ZT0iJHtjYXRhbGluYS5kZXBsb3l9Ii8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ic2VydmxldC5qYXIiICAgdmFsdWU9IiR7c2VydmxldC1hcGkuamFyfSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtbG9nZ2luZy5qYXIiIHZhbHVlPSIke2NvbW1vbnMtbG9nZ2luZy5qYXJ9Ii8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9ucy1tb2RlbGVyLmphciIgdmFsdWU9IiR7Y29tbW9ucy1tb2RlbGVyLmphcn0iLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqbXguamFyIiB2YWx1ZT0iJHtqbXguamFyfSIvPgorICAgIDwvYW50PgorCisgIAk8IS0tCisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuZGVwbG95fS9zZXJ2ZXIvbGliIgorICAgICAgICAgICBmaWxlPSIke3RvbWNhdC1jb3lvdGUuamFyfSIvPgorICAgIC0tPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBCVUlMRDogQnVpbGQgdG9tY2F0LWprID09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC10b21jYXQtamsiPgorCisgICAgPGFudCBkaXI9IiR7dG9tY2F0LWprLmhvbWV9IiB0YXJnZXQ9ImJ1aWxkLW1haW4iPgorICAgICAgPHByb3BlcnR5IG5hbWU9InRvbWNhdDUuaG9tZSIgdmFsdWU9IiR7Y2F0YWxpbmEuZGVwbG95fSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtbG9nZ2luZy5qYXIiIHZhbHVlPSIke2NvbW1vbnMtbG9nZ2luZy5qYXJ9Ii8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9ucy1tb2RlbGVyLmphciIgdmFsdWU9IiR7Y29tbW9ucy1tb2RlbGVyLmphcn0iLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqbXguamFyIiB2YWx1ZT0iJHtqbXguamFyfSIvPgorICAgIDwvYW50PgorCisgIAk8IS0tCisgICAgPGNvcHkgdG9maWxlPSIke2NhdGFsaW5hLmRlcGxveX0vc2VydmVyL2xpYi90b21jYXQtYWpwLmphciIKKyAgICAgICAgICAgIGZpbGU9IiR7dG9tY2F0LWprMi5qYXJ9Ii8+CisgICAgLS0+CisgIAk8IS0tCisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuZGVwbG95fS9jb25mIgorICAgICAgICAgICBmaWxlPSIke2prMi5wcm9wZXJ0aWVzfSIvPgorICAgIC0tPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PSBCVUlMRDogQnVpbGQgdG9tY2F0LWNveW90ZS1odHRwMTEgPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC10b21jYXQtaHR0cDExIj4KKworICAgIDxhbnQgZGlyPSIke3RvbWNhdC1odHRwMTEuaG9tZX0iIHRhcmdldD0iY29tcGlsZSI+CisgICAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9ucy1sb2dnaW5nLmphciIgdmFsdWU9IiR7Y29tbW9ucy1sb2dnaW5nLmphcn0iLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb25zLW1vZGVsZXIuamFyIiB2YWx1ZT0iJHtjb21tb25zLW1vZGVsZXIuamFyfSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImpteC5qYXIiIHZhbHVlPSIke2pteC5qYXJ9Ii8+CisgICAgPC9hbnQ+CisgIAk8IS0tCisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuZGVwbG95fS9zZXJ2ZXIvbGliIgorICAgICAgICAgICBmaWxlPSIke3RvbWNhdC1odHRwMTEuamFyfSIvPgorICAgIC0tPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PSBCVUlMRDogQ29tcGlsZSBBbGwgU2VydmVyIENvbXBvbmVudHMgPT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1tYWluIiBkZXBlbmRzPSJidWlsZC1zdGF0aWMsYnVpbGQtdG9tY2F0LXV0aWwsYnVpbGQtY2F0YWxpbmEiPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ3JlYXRlIENhdGFsaW5hIEphdmFkb2NzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgdW5sZXNzPSJkb2NzLnVwdG9kYXRlIiA+CisgICAgPGRlbGV0ZSBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2phdmFkb2MiLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9qYXZhZG9jIi8+CisKKyAgICA8IS0tIFRvIGZpeCBCdWd6aWxsYSAzNTg4MCwgd2UgbmVlZCB0byBlbnN1cmUgZmlsZXMgdGhhdCB1c2UgSjJTRSA1LjAKKyAgICAgICAgIHN5bnRheCBhcmUgbm90IEphdmFEb2MnZWQuICBFdmVuIHRob3VnaCBubyBvdGhlciB0YXJnZXQgdXNlcworICAgICAgICAgamF2YWRvYy5zb3VyY2VwYXRoIGFuZCBJIGNvdWxkIHJld3JpdGUgdGhlIGphdmFkb2MgdGFyZ2V0IGJlbG93LAorICAgICAgICAgdGhhdCBtaWdodCBpbXBhY3QgdXNlcnMgd2hvIHVzZSBqYXZhZG9jLnNvdXJjZXBhdGggaW4gdGhlaXIgb3duCisgICAgICAgICBidWlsZCBzY3JpcHRzLiAgQWNjb3JkaW5nbHksIGxldCdzIHRyeSB0aGlzIHVnbHkgdGVtcG9yYXJ5CisgICAgICAgICBmaXguICBXaGVuIHdlIHN0YXJ0IGJ1aWxkaW5nIFRvbWNhdCB3aXRoIEoyU0UgNS4wLCB3ZSBjYW4gcmVtb3ZlCisgICAgICAgICB0aGlzIHVnbGluZXNzLgorICAgIC0tPgorICAgIDxtb3ZlIGZpbGU9IiR7anRjLmhvbWV9L3V0aWwvamF2YS9vcmcvYXBhY2hlL3RvbWNhdC91dGlsL25ldC9qc3NlL0pTU0UxNVNvY2tldEZhY3RvcnkuamF2YSIKKyAgICAgICAgICB0b2ZpbGU9IiR7anRjLmhvbWV9L3V0aWwvamF2YS9vcmcvYXBhY2hlL3RvbWNhdC91dGlsL25ldC9qc3NlL0pTU0UxNVNvY2tldEZhY3RvcnkudGVtcCIgLz4KKworICAgIDxqYXZhZG9jIHBhY2thZ2VuYW1lcz0ib3JnLmFwYWNoZS4qIgorICAgICAgY2xhc3NwYXRocmVmPSJjYXRhbGluYS5jbGFzc3BhdGgiCisgICAgICBzb3VyY2VwYXRocmVmPSJqYXZhZG9jLnNvdXJjZXBhdGgiCisgICAgICBkZXN0ZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9qYXZhZG9jIgorICAgICAgYXV0aG9yPSJ0cnVlIgorICAgICAgdmVyc2lvbj0idHJ1ZSIKKyAgICAgIHdpbmRvd3RpdGxlPSJUb21jYXQgQVBJIERvY3VtZW50YXRpb24iCisgICAgICBkb2N0aXRsZT0iVG9tY2F0IEFQSSIKKyAgICAgIGJvdHRvbT0iQ29weXJpZ2h0ICYjMTY5OyAyMDAwLTIwMDUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLiIKKyAgICAgIGFkZGl0aW9uYWxwYXJhbT0iLWJyZWFraXRlcmF0b3IiPgorICAgIAk8ZXhjbHVkZXBhY2thZ2UgbmFtZT0ib3JnLmFwYWNoZS5hanAuKiIgLz4KKyAgICAJPGV4Y2x1ZGVwYWNrYWdlIG5hbWU9Im9yZy5hcGFjaGUuY295b3RlLnRvbWNhdDMiIC8+CisgICAgCTxleGNsdWRlcGFja2FnZSBuYW1lPSJvcmcuYXBhY2hlLmNveW90ZS50b21jYXQ0IiAvPgorICAgIAk8ZXhjbHVkZXBhY2thZ2UgbmFtZT0ib3JnLmFwYWNoZS5qay5hcHIiIC8+CisKKyAgICA8L2phdmFkb2M+CisKKyAgICA8bW92ZSBmaWxlPSIke2p0Yy5ob21lfS91dGlsL2phdmEvb3JnL2FwYWNoZS90b21jYXQvdXRpbC9uZXQvanNzZS9KU1NFMTVTb2NrZXRGYWN0b3J5LnRlbXAiCisgICAgICAgICAgdG9maWxlPSIke2p0Yy5ob21lfS91dGlsL2phdmEvb3JnL2FwYWNoZS90b21jYXQvdXRpbC9uZXQvanNzZS9KU1NFMTVTb2NrZXRGYWN0b3J5LmphdmEiIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1jbGVhbiI+CisKKyAgICA8ZGVsZXRlIGRpcj0iJHtjYXRhbGluYS5idWlsZH0iLz4KKworICAgIDxhbnQgZGlyPSIke3RvbWNhdC11dGlsLmhvbWV9IiB0YXJnZXQ9ImNsZWFuIi8+CisgICAgPGFudCBkaXI9IiR7dG9tY2F0LWNveW90ZS5ob21lfSIgdGFyZ2V0PSJjbGVhbiIvPgorICAgIDxhbnQgZGlyPSIke3RvbWNhdC1qay5ob21lfSIgdGFyZ2V0PSJjbGVhbiIvPgorICAgIDxhbnQgZGlyPSIke3RvbWNhdC1odHRwMTEuaG9tZX0iIHRhcmdldD0iY2xlYW4iLz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IFJlYnVpbGQgRXZlcnl0aGluZyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJidWlsZC1jbGVhbixidWlsZC1tYWluIgorICAgZGVzY3JpcHRpb249IkNsZWFuLCBidWlsZCwgYW5kIGRlcGxveSBDYXRhbGluYSBjb21wb25lbnQiLz4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBURVNUOiBDb21waWxlIFVuaXQgVGVzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtdGVzdHMiIGRlcGVuZHM9ImJ1aWxkLW1haW4iIGlmPSJqdW5pdC5wcmVzZW50Ij4KKyAgICA8bWtkaXIgICAgICBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L3Rlc3RzIi8+CisgICAgPCEtLSBDb21waWxlIHVuaXQgdGVzdCBjbGFzc2VzIC0tPgorICAgIDxqYXZhYyBzcmNkaXI9InNyYy90ZXN0IiBkZXN0ZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS90ZXN0cyIKKyAgICAgICAgICAgZGVwcmVjYXRpb249IiR7Y29tcGlsZS5kZXByZWNhdGlvbn0iCisgICAgICAgICAgIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IgorICAgICAgICAgICBvcHRpbWl6ZT0ib2ZmIgorICAgICAgICAgICBzb3VyY2U9IiR7Y29tcGlsZS5zb3VyY2V9IgorICAgICAgICAgICBleGNsdWRlcz0iKiovQ1ZTLyoqIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+CisgICAgPC9qYXZhYz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09IFRFU1Q6IEV4ZWN1dGUgVW5pdCBUZXN0cyA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3QiIGlmPSJqdW5pdC5wcmVzZW50IgorICAgZGVzY3JpcHRpb249IlJ1biBhbGwgdW5pdCB0ZXN0IGNhc2VzIgorICAgZGVwZW5kcz0iYnVpbGQtdGVzdHMsdGVzdC1kaXItY29udGV4dCx0ZXN0LXV0aWwiPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QtZGlyLWNvbnRleHQiIGlmPSJqdW5pdC5wcmVzZW50Ij4KKworICAgIDxlY2hvIG1lc3NhZ2U9IlJ1bm5pbmcgRmlsZURpckNvbnRleHQgdGVzdHMiLz4KKyAgICA8amF2YSBjbGFzc25hbWU9IiR7dGVzdC5ydW5uZXJ9IiBmb3JrPSJ5ZXMiCisgICAgICAgIGZhaWxvbmVycm9yPSIke3Rlc3QuZmFpbG9uZXJyb3J9Ij4KKyAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImRvYy5iYXNlIiB2YWx1ZT0iJHt0ZXN0LndlYmFwcH0iLz4KKyAgICAgIDxhcmcgdmFsdWU9Im9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5GaWxlRGlyQ29udGV4dFRlc3RDYXNlIi8+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgorICAgIDwvamF2YT4KKworICAgIDxlY2hvIG1lc3NhZ2U9IlJ1bm5pbmcgV0FSRGlyQ29udGV4dCB0ZXN0cyIvPgorICAgIDxqYXIgamFyZmlsZT0iJHt0ZXN0LndlYmFwcC53YXJ9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LndlYmFwcH0iLz4KKyAgICA8L2phcj4KKyAgICA8amF2YSBjbGFzc25hbWU9IiR7dGVzdC5ydW5uZXJ9IiBmb3JrPSJ5ZXMiCisgICAgICAgIGZhaWxvbmVycm9yPSIke3Rlc3QuZmFpbG9uZXJyb3J9Ij4KKyAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImRvYy5iYXNlIiB2YWx1ZT0iJHt0ZXN0LndlYmFwcC53YXJ9Ii8+CisgICAgICA8YXJnIHZhbHVlPSJvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuV0FSRGlyQ29udGV4dFRlc3RDYXNlIi8+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgorICAgIDwvamF2YT4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7dGVzdC53ZWJhcHAud2FyfSIvPgorCisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC11dGlsIiBpZj0ianVuaXQucHJlc2VudCI+CisKKyAgICA8ZWNobyBtZXNzYWdlPSJSdW5uaW5nIENvb2tpZVRvb2xzIHRlc3RzIi8+CisgICAgPGphdmEgY2xhc3NuYW1lPSIke3Rlc3QucnVubmVyfSIgZm9yaz0ieWVzIgorICAgICAgICBmYWlsb25lcnJvcj0iJHt0ZXN0LmZhaWxvbmVycm9yfSI+CisgICAgICA8YXJnIHZhbHVlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuQ29va2llVG9vbHNUZXN0Q2FzZSIvPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KKyAgICA8L2phdmE+CisKKyAgICA8ZWNobyBtZXNzYWdlPSJSdW5uaW5nIFVSTCB0ZXN0cyIvPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iJHt0ZXN0LnJ1bm5lcn0iIGZvcms9InllcyIKKyAgICAgICAgZmFpbG9uZXJyb3I9IiR7dGVzdC5mYWlsb25lcnJvcn0iPgorICAgICAgPGFyZyB2YWx1ZT0ib3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlVSTFRlc3RDYXNlIi8+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgorICAgIDwvamF2YT4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBERVBMT1k6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGVwbG95LXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuZGVwbG95fSIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuZGVwbG95fS9iaW4iLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmRlcGxveX0vY29uZiIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuZGVwbG95fS9sb2dzIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5kZXBsb3l9L2NvbW1vbi9jbGFzc2VzIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5kZXBsb3l9L2NvbW1vbi9lbmRvcnNlZCIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuZGVwbG95fS9jb21tb24vaTE4biIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuZGVwbG95fS9jb21tb24vbGliIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5kZXBsb3l9L3NlcnZlci9jbGFzc2VzIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5kZXBsb3l9L3NlcnZlci9saWIiLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmRlcGxveX0vd29yayIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuZGVwbG95fS90ZW1wIi8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IERFUExPWTogQ29weSBTdGF0aWMgRmlsZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkZXBsb3ktc3RhdGljIiBkZXBlbmRzPSJidWlsZC1tYWluLGRlcGxveS1wcmVwYXJlLGRlcGxveS1zdGF0aWMtb25seSxkZXBsb3ktbGlicyIvPgorCisgIDx0YXJnZXQgbmFtZT0iZGVwbG95LXN0YXRpYy1vbmx5IiBkZXBlbmRzPSJkZXBsb3ktcHJlcGFyZSI+CisKKyAgICA8IS0tIEV4ZWN1dGFibGUgQ29tbWFuZHMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuZGVwbG95fS9iaW4iPgorICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvYmluIiBleGNsdWRlcz0iKi11c2luZy1sYXVuY2hlci4qLGxhdW5jaGVyLnByb3BlcnRpZXMsY2F0YWxpbmEueG1sIiAvPgorICAgIDwvY29weT4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7Y2F0YWxpbmEuZGVwbG95fS9iaW4iIGluY2x1ZGVzPSIqLnNoIiAgZW9sPSJsZiIvPgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHtjYXRhbGluYS5kZXBsb3l9L2JpbiIgaW5jbHVkZXM9IiouYmF0IiBlb2w9ImNybGYiLz4KKyAgICA8Y2htb2QgcGVybT0iK3giIGRpcj0iJHtjYXRhbGluYS5idWlsZH0vYmluIiBpbmNsdWRlcz0iKi5zaCIvPgorCisgICAgPCEtLSBDb25maWd1cmF0aW9uIEZpbGVzIC0tPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRlcGxveX0vY29uZiI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NvbmYiIC8+CisgICAgPC9jb3B5PgorCisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZGVwbG95LWxpYnMiPgorCisgICAgPCEtLSBDb21tb24gRXh0ZW5zaW9ucyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5kZXBsb3l9L2NvbW1vbi9lbmRvcnNlZCI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NvbW1vbi9lbmRvcnNlZCIgLz4KKyAgICA8L2NvcHk+CisKKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5kZXBsb3l9L2NvbW1vbi9saWIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jb21tb24vbGliIiAvPgorICAgIDwvY29weT4KKworICAgIDwhLS0gU2VydmVyIENvbXBvbmVudHMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuZGVwbG95fS9zZXJ2ZXIvbGliIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5idWlsZH0vc2VydmVyL2xpYiIgLz4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIFNoYXJlZCBFeHRlbnNpb25zIC0tPgorPCEtLQorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRlcGxveX0vc2hhcmVkL2xpYiI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L3NoYXJlZC9saWIiIC8+CisgICAgPC9jb3B5PgorLS0+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IERFUExPWTogQ3JlYXRlIENhdGFsaW5hIEpBUnMgPT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJjYXRhbGluYS1qYXJzIiBkZXBlbmRzPSJidWlsZC1zdGF0aWMsZGVwbG95LXByZXBhcmUsZmxhZ3MsZmxhZ3MuZGlzcGxheSxidWlsZC1jYXRhbGluYSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQnVpbGQgY2F0YWxpbmEgamFycyI+CisKKyAgICA8IS0tIENhdGFsaW5hIEJvb3RzdHJhcCBKQVIgRmlsZS4gSXQgaXMgYSB2ZXJ5IHdyb25nIGlkZWEgdG8gc3BsaXQgcGFja2FnZXMgaW4gbXVsdGlwbGUgamFycyAhISEgLS0+CisgICAgPGphciBqYXJmaWxlPSIke2NhdGFsaW5hLmRlcGxveX0vYmluL2Jvb3RzdHJhcC5qYXIiIAorICAgICAgICAgbWFuaWZlc3Q9ImV0Yy9ib290c3RyYXAuTUYiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Cb290c3RyYXAuY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9jYXRhbGluYS5wcm9wZXJ0aWVzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ2F0YWxpbmFQcm9wZXJ0aWVzLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ2xhc3NMb2FkZXJGYWN0b3J5LmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvVG9vbC5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvU3RhbmRhcmRDbGFzc0xvYWRlciouY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL0V4dGVuc2lvbi5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvUmVsb2FkZXIuY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc2VjdXJpdHkvU2VjdXJpdHlDbGFzc0xvYWQuY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvbGF1bmNoZXIvQ2F0YWxpbmFMYXVuY2hGaWx0ZXIuY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL0puZGlQZXJtaXNzaW9uLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL3RvbWNhdC91dGlsL2NvbXBhdC8qIiAvPgorCisgICAgICAJPCEtLSBKYXZhZG9jIGFuZCBpMThuIGV4Y2x1c2lvbnMgLS0+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL3BhY2thZ2UuaHRtbCIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovTG9jYWxTdHJpbmdzXyoiIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9qYXI+CisKKyAgICA8IS0tIENhdGFsaW5hIE1haW4gSkFSIEZpbGUgLS0+CisgICAgPCEtLSBFeGNsdWRpbmcgZmlsZXMgZnJvbSBoZXJlIGlzIHdvcnNlIHRoYW4gZHVwbGljYXRpbmcgdGhlbSAtIGEgbG9hZGVyIHRoYXQgdXNlcyB0aGUKKyAgICAgICAgIHBhY2thZ2UgbmFtZSBhcyBpbmRleCBhbmQgaW5jbHVkZXMgYm90aCBib290c3RyYXAgYW5kIGNhdGFsaW5hIHdpbGwgYmUgY29uZnVzZWQgLS0+CisKKyAgICA8amFyIGphcmZpbGU9IiR7Y2F0YWxpbmEuZGVwbG95fS9zZXJ2ZXIvbGliL2NhdGFsaW5hLmphciI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KKworICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hLyoqIiAvPgorCisgICAgICAgIDwhLS0gSmF2YWRvYyBhbmQgaTE4biBleGNsdXNpb25zIC0tPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9wYWNrYWdlLmh0bWwiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL0xvY2FsU3RyaW5nc18qIiAvPgorCisgICAgICAgIDwhLS0gTW9kdWxlcyAtLT4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvKioiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci8qKiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9sYXVuY2hlci8qKiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy8qKiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0Jvb3RzdHJhcC5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy8qKiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvKioiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nLyoqIiAvPgorCisgICAgICAgIDwhLS0gQ2F0YWxpbmEtb3B0aW9uYWwgY2xhc3NlcyAtLT4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9EYXRhU291cmNlUmVhbG0uY2xhc3MiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vSkFBUyoiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vSkRCQyoiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vSk5ESSoiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vTWVtb3J5KiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL1N0b3JlQmFzZS5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uLypTdG9yZS5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL1BlcnNpc3RlbnRNYW5hZ2VyKiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0NHSVByb2Nlc3NFbnZpcm9ubWVudC5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0Nvb2tpZVRvb2xzLmNsYXNzIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvRGF0ZVRvb2wuY2xhc3MiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9ET01Xcml0ZXIuY2xhc3MiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9GYXN0RGF0ZUZvcm1hdC5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0lPVG9vbHMuY2xhc3MiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9NSU1FMkphdmEuY2xhc3MiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Qcm9jZXNzKiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1F1ZXVlLmNsYXNzIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvU3RyZnRpbWUuY2xhc3MiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9YTUxXcml0ZXIuY2xhc3MiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0V4dGVuZGVkQWNjZXNzTG9nVmFsdmUuY2xhc3MiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0Zhc3RDb21tb25BY2Nlc3NMb2dWYWx2ZS5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvRmllbGRJbmZvLmNsYXNzIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9KREJDQWNjZXNzTG9nVmFsdmUuY2xhc3MiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1BlcnNpc3RlbnRWYWx2ZS5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvUmVtb3RlKiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvUmVxdWVzdER1bXBlclZhbHZlLmNsYXNzIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9SZXF1ZXN0RmlsdGVyVmFsdmUuY2xhc3MiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1NlbWFwaG9yZVZhbHZlLmNsYXNzIiAvPgorCisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9qYXI+CisKKyAgICA8amFyIGphcmZpbGU9IiR7Y2F0YWxpbmEuZGVwbG95fS9zZXJ2ZXIvbGliL2NhdGFsaW5hLW9wdGlvbmFsLmphciI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KKworICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0RhdGFTb3VyY2VSZWFsbS5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9KQUFTKiIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9KREJDKiIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9KTkRJKiIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9NZW1vcnkqIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vU3RvcmVCYXNlLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vKlN0b3JlLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vUGVyc2lzdGVudE1hbmFnZXIqIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQ0dJUHJvY2Vzc0Vudmlyb25tZW50LmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQ29va2llVG9vbHMuY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9EYXRlVG9vbC5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0RPTVdyaXRlci5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0Zhc3REYXRlRm9ybWF0LmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvSU9Ub29scy5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL01JTUUySmF2YS5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1Byb2Nlc3MqIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUXVldWUuY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TdHJmdGltZS5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1hNTFdyaXRlci5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvRXh0ZW5kZWRBY2Nlc3NMb2dWYWx2ZS5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvRmFzdENvbW1vbkFjY2Vzc0xvZ1ZhbHZlLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9GaWVsZEluZm8uY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0pEQkNBY2Nlc3NMb2dWYWx2ZS5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvUGVyc2lzdGVudFZhbHZlLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9SZW1vdGUqIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9SZXF1ZXN0RHVtcGVyVmFsdmUuY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1JlcXVlc3RGaWx0ZXJWYWx2ZS5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvU2VtYXBob3JlVmFsdmUuY2xhc3MiIC8+CisKKyAgICAgICAgPCEtLSBKYXZhZG9jIGFuZCBpMThuIGV4Y2x1c2lvbnMgLS0+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL3BhY2thZ2UuaHRtbCIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovTG9jYWxTdHJpbmdzXyoiIC8+CisKKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2phcj4KKworICAgIDwhLS0gQ2F0YWxpbmEgQW50IFRhc2tzIEpBUiBGaWxlIC0tPgorICAgIDxqYXIgamFyZmlsZT0iJHtjYXRhbGluYS5kZXBsb3l9L3NlcnZlci9saWIvY2F0YWxpbmEtYW50LmphciI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KKyAgICAgICAgCisgICAgICAJPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvKiIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0Jhc2U2NC5jbGFzcyIgLz4KKworICAgICAgCTwhLS0gSmF2YWRvYyBhbmQgaTE4biBleGNsdXNpb25zIC0tPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9wYWNrYWdlLmh0bWwiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL0xvY2FsU3RyaW5nc18qIiAvPgorICAgICAgCQorICAgICAgPC9maWxlc2V0PgorICAgIDwvamFyPgorCisgIAk8IS0tIENhdGFsaW5hIEpNWCBBY2Nlc3NvciBBbnQgVGFza3MgSkFSIEZpbGUgLS0+CisgICAgPGphciBqYXJmaWxlPSIke2NhdGFsaW5hLmRlcGxveX0vc2VydmVyL2xpYi9jYXRhbGluYS1hbnQtam14LmphciI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KKyAgICAgICAgCisgICAgICAJPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvam14LyoiIC8+CisKKyAgICAgIAk8IS0tIEphdmFkb2MgYW5kIGkxOG4gZXhjbHVzaW9ucyAtLT4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovcGFja2FnZS5odG1sIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9Mb2NhbFN0cmluZ3NfKiIgLz4KKyAgICAgIAkKKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2phcj4KKworICAJPCEtLSBOYW1pbmcgLSBGYWN0b3J5IEpBUiBGaWxlIC0tPgorICAgIDxqYXIgamFyZmlsZT0iJHtjYXRhbGluYS5kZXBsb3l9L2NvbW1vbi9saWIvbmFtaW5nLWZhY3RvcnkuamFyIiBpbmRleD0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9uYW1pbmcvKioiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy8qKiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9uYW1pbmcvSm5kaVBlcm1pc3Npb24uY2xhc3MiIC8+CisgICAgICAJPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9uYW1pbmcvTmFtZVBhcnNlckltcGwuY2xhc3MiIC8+CisgICAgICAJPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9uYW1pbmcvTmFtaW5nQ29udGV4dEJpbmRpbmdzRW51bWVyYXRpb24uY2xhc3MiIC8+CisgICAgICAJPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9uYW1pbmcvTmFtaW5nQ29udGV4dEVudW1lcmF0aW9uLmNsYXNzIiAvPgorICAgICAgCTxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL05hbWluZ0VudHJ5LmNsYXNzIiAvPgorICAgICAgCTxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL1N0cmluZ01hbmFnZXIuY2xhc3MiIC8+CisgICAgICAgIDwhLS0gSmF2YWRvYyBhbmQgaTE4biBleGNsdXNpb25zIC0tPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9wYWNrYWdlLmh0bWwiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL0xvY2FsU3RyaW5nc18qIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvamFyPgorCisgICAgPCEtLSBOYW1pbmcgLSBSZXNvdXJjZXMgSkFSIEZpbGUgLS0+CisgICAgPGphciBqYXJmaWxlPSIke2NhdGFsaW5hLmRlcGxveX0vY29tbW9uL2xpYi9uYW1pbmctcmVzb3VyY2VzLmphciIgaW5kZXg9InRydWUiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL0puZGlQZXJtaXNzaW9uLmNsYXNzIiAvPgorICAgICAgCTxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL05hbWVQYXJzZXJJbXBsLmNsYXNzIiAvPgorICAgICAgCTxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL05hbWluZ0NvbnRleHRCaW5kaW5nc0VudW1lcmF0aW9uLmNsYXNzIiAvPgorICAgICAgCTxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL05hbWluZ0NvbnRleHRFbnVtZXJhdGlvbi5jbGFzcyIgLz4KKyAgICAgIAk8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL25hbWluZy9OYW1pbmdFbnRyeS5jbGFzcyIgLz4KKyAgICAgIAk8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL25hbWluZy9TdHJpbmdNYW5hZ2VyLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvKioiIC8+CisgICAgICAgIDwhLS0gSmF2YWRvYyBhbmQgaTE4biBleGNsdXNpb25zIC0tPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9wYWNrYWdlLmh0bWwiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL0xvY2FsU3RyaW5nc18qIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvamFyPgorCisgICAgPCEtLSBTZXJ2bGV0cyAtIENHSSBTZXJ2bGV0IC0tPgorICAgIDxqYXIgamFyZmlsZT0iJHtjYXRhbGluYS5kZXBsb3l9L3NlcnZlci9saWIvc2VydmxldHMtY2dpLnJlbmFtZXRvamFyIiBpbmRleD0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9DR0kqIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvamFyPgorCisgICAgPCEtLSBTZXJ2bGV0cyAtIERlZmF1bHQgRmlsZS1TZXJ2aW5nIFNlcnZsZXQgLS0+CisgICAgPGphciBqYXJmaWxlPSIke2NhdGFsaW5hLmRlcGxveX0vc2VydmVyL2xpYi9zZXJ2bGV0cy1kZWZhdWx0LmphciIgaW5kZXg9InRydWUiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvRGVmYXVsdCoiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvQ29uc3RhbnRzLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvamFyPgorCisgICAgPCEtLSBTZXJ2bGV0cyAtIEludm9rZXIgU2VydmxldCAtLT4KKyAgICA8amFyIGphcmZpbGU9IiR7Y2F0YWxpbmEuZGVwbG95fS9zZXJ2ZXIvbGliL3NlcnZsZXRzLWludm9rZXIuamFyIiBpbmRleD0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9JbnZva2VyKiIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2phcj4KKworICAgIDwhLS0gU2VydmxldHMgLSBTU0kgU2VydmxldCAtLT4KKyAgICA8amFyIGphcmZpbGU9IiR7Y2F0YWxpbmEuZGVwbG95fS9zZXJ2ZXIvbGliL3NlcnZsZXRzLXNzaS5yZW5hbWV0b2phciIgaW5kZXg9InRydWUiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc3NpLyoqIiAvPgorICAgICAgICA8IS0tIEphdmFkb2MgYW5kIGkxOG4gZXhjbHVzaW9ucyAtLT4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovcGFja2FnZS5odG1sIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9Mb2NhbFN0cmluZ3NfKiIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2phcj4KKworICAgIDwhLS0gU2VydmxldHMgLSBXZWJkYXYgU2VydmxldCAtLT4KKyAgICA8amFyIGphcmZpbGU9IiR7Y2F0YWxpbmEuZGVwbG95fS9zZXJ2ZXIvbGliL3NlcnZsZXRzLXdlYmRhdi5qYXIiIGluZGV4PSJ0cnVlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL1dlYmRhdioiIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9qYXI+CisKKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkZXBsb3ktY2F0YWxpbmEiIGRlcGVuZHM9ImRlcGxveS1zdGF0aWMsYnVpbGQtbWFpbixjYXRhbGluYS1qYXJzIgorICAgZGVzY3JpcHRpb249IkJ1aWxkIGFuZCBkZXBsb3kgQ2F0YWxpbmEgY29tcG9uZW50Ij4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gREVQTE9ZOiBDcmVhdGUgQ2F0YWxpbmEgSkFScyA9PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRlcGxveSIgZGVwZW5kcz0iZGVwbG95LWNhdGFsaW5hLGJ1aWxkLXRvbWNhdC1jb3lvdGUsYnVpbGQtdG9tY2F0LWprLGJ1aWxkLXRvbWNhdC1odHRwMTEiCisgICBkZXNjcmlwdGlvbj0iQnVpbGQgYW5kIGRlcGxveSBDYXRhbGluYSI+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXN0cmlidXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJidWlsZC1tYWluIgorICAgZGVzY3JpcHRpb249IkNyZWF0ZSBiaW5hcnkgZGlzdHJpYnV0aW9uIj4KKworICAgIDwhLS0gRXhlY3V0YWJsZSBDb21tYW5kcyAtLT4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmRpc3R9L2JpbiIvPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRpc3R9L2JpbiI+CisgICAgICA8ZmlsZXNldCBkaXI9InNyYy9iaW4iIGV4Y2x1ZGVzPSIqLXVzaW5nLWxhdW5jaGVyLiosbGF1bmNoZXIucHJvcGVydGllcyxjYXRhbGluYS54bWwiIC8+CisgICAgPC9jb3B5PgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHtjYXRhbGluYS5kaXN0fS9iaW4iIGluY2x1ZGVzPSIqLnNoIiBlb2w9ImxmIi8+CisgICAgPGZpeGNybGYgc3JjZGlyPSIke2NhdGFsaW5hLmRpc3R9L2JpbiIgaW5jbHVkZXM9IiouYmF0IiBlb2w9ImNybGYiLz4KKyAgICA8Y2htb2QgcGVybT0iK3giIGRpcj0iJHtjYXRhbGluYS5idWlsZH0vYmluIiBpbmNsdWRlcz0iKi5zaCIvPgorCisgICAgPCEtLSBDb21tb24gRXh0ZW5zaW9ucyAtLT4gICAgCisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5kaXN0fS9jb21tb24vY2xhc3NlcyIvPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRpc3R9L2NvbW1vbi9jbGFzc2VzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5idWlsZH0vY29tbW9uL2NsYXNzZXMiIC8+CisgICAgPC9jb3B5PgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuZGlzdH0vY29tbW9uL2xpYiIvPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRpc3R9L2NvbW1vbi9saWIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jb21tb24vbGliIiAvPgorICAgIDwvY29weT4KKworICAgIDwhLS0gQ29uZmlndXJhdGlvbiBGaWxlcyAtLT4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmRpc3R9L2NvbmYiLz4KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5kaXN0fS9jb25mIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5idWlsZH0vY29uZiIgLz4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIFNlcnZlciBDb21wb25lbnRzIC0tPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuZGlzdH0vc2VydmVyL2NsYXNzZXMiLz4KKyAgICA8IS0tIERvIHdlIHdhbnQgdG8gY29weSB0aGUgY2xhc3NlcyA/IAorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRpc3R9L3NlcnZlci9jbGFzc2VzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iIC8+CisgICAgPC9jb3B5PgorICAgIC0tPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuZGlzdH0vc2VydmVyL2xpYiIvPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRpc3R9L3NlcnZlci9saWIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9zZXJ2ZXIvbGliIiAvPgorICAgIDwvY29weT4KKworICAgIDwhLS0gU2hhcmVkIEV4dGVuc2lvbnMgLS0+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5kaXN0fS9zaGFyZWQvY2xhc3NlcyIvPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRpc3R9L3NoYXJlZC9jbGFzc2VzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5idWlsZH0vc2hhcmVkL2NsYXNzZXMiIC8+CisgICAgPC9jb3B5PgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuZGlzdH0vc2hhcmVkL2xpYiIvPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRpc3R9L3NoYXJlZC9saWIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9zaGFyZWQvbGliIiAvPgorICAgIDwvY29weT4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENsZWFuIERpcmVjdG9yeSA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7Y2F0YWxpbmEuZGlzdH0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gQ29udmVuaWVudCBTeW5vbnltcyA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJidWlsZC1jbGVhbiwgZGlzdC1jbGVhbiIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiBidWlsZCBhbmQgZGlzdCBkaXJlY3RvcmllcyIvPgorCisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9ldGMvYm9vdHN0cmFwLk1GIGIvY29udGFpbmVyL2NhdGFsaW5hL2V0Yy9ib290c3RyYXAuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVkNmJlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9ldGMvYm9vdHN0cmFwLk1GCkBAIC0wLDAgKzEsNSBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitNYWluLUNsYXNzOiBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwCitDbGFzcy1QYXRoOiBqbXguamFyIGNvbW1vbnMtZGFlbW9uLmphciBjb21tb25zLWxvZ2dpbmctYXBpLmphciB0b21jYXQtanVsaS5qYXIKK1NwZWNpZmljYXRpb24tVGl0bGU6IENhdGFsaW5hCitTcGVjaWZpY2F0aW9uLVZlcnNpb246IDEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL2NhdGFsaW5hLXRhc2tzLnhtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL2NhdGFsaW5hLXRhc2tzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmQxZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vY2F0YWxpbmEtdGFza3MueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzwhLS0KKyAgWE1MIGZpbGUgZm9yIGltcG9ydGluZyBDYXRhbGluYSBhbnQgdGFza3MuCisgIDxpbXBvcnQgZmlsZT0iJHtjYXRhbGluYS5ob21lfS9iaW4vY2F0YWxpbmEtdGFza3MueG1sIi8+CistLT4KKworPHByb2plY3QgbmFtZT0iY2F0YWxpbmEtdGFza3MiPgorICA8ZGVzY3JpcHRpb24+Q2F0YWxpbmEgQW50IE1hbmFnZXIgYW5kIEpTUEMgVGFza3M8L2Rlc2NyaXB0aW9uPgorICA8IS0tIHNldCBjYXRhbGluYS5ob21lIGlmIGl0J3Mgbm90IGFscmVhZHkgc2V0IC0tPgorICA8ZGlybmFtZSBwcm9wZXJ0eT0iY2F0YWxpbmEuaG9tZS5iaW4uZGlyIiBmaWxlPSIke2FudC5maWxlLmNhdGFsaW5hLXRhc2tzfSIvPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuaG9tZSIgdmFsdWU9IiR7Y2F0YWxpbmEuaG9tZS5iaW4uZGlyfS8uLiIvPgorICA8dGFza2RlZiByZXNvdXJjZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvY2F0YWxpbmEudGFza3MiPgorICAgIDxjbGFzc3BhdGg+CisgICAgICA8ZmlsZXNldCBmaWxlPSIke2NhdGFsaW5hLmhvbWV9L2Jpbi9jb21tb25zLWxvZ2dpbmctYXBpLmphciIvPgorICAgICAgPGZpbGVzZXQgZmlsZT0iJHtjYXRhbGluYS5ob21lfS9jb21tb24vbGliL2phc3Blci1jb21waWxlci5qYXIiLz4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2xpYi9qYXNwZXItcnVudGltZS5qYXIiLz4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2xpYi9zZXJ2bGV0LWFwaS5qYXIiLz4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2xpYi9qc3AtYXBpLmphciIvPgorICAgICAgPGZpbGVzZXQgZmlsZT0iJHtjYXRhbGluYS5ob21lfS9zZXJ2ZXIvbGliL2NhdGFsaW5hLWFudC5qYXIiLz4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2xpYi9jb21tb25zLWVsLmphciIvPgorICAgIDwvY2xhc3NwYXRoPgorICA8L3Rhc2tkZWY+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9jYXRhbGluYS5iYXQgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9jYXRhbGluYS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwYWQ0NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL2NhdGFsaW5hLmJhdApAQCAtMCwwICsxLDIyNSBAQAorQGVjaG8gb2ZmCitpZiAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIHNldGxvY2FsCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityZW0gU3RhcnQvU3RvcCBTY3JpcHQgZm9yIHRoZSBDQVRBTElOQSBTZXJ2ZXIKK3JlbQorcmVtIEVudmlyb25tZW50IFZhcmlhYmxlIFByZXF1aXNpdGVzCityZW0KK3JlbSAgIENBVEFMSU5BX0hPTUUgICBNYXkgcG9pbnQgYXQgeW91ciBDYXRhbGluYSAiYnVpbGQiIGRpcmVjdG9yeS4KK3JlbQorcmVtICAgQ0FUQUxJTkFfQkFTRSAgIChPcHRpb25hbCkgQmFzZSBkaXJlY3RvcnkgZm9yIHJlc29sdmluZyBkeW5hbWljIHBvcnRpb25zCityZW0gICAgICAgICAgICAgICAgICAgb2YgYSBDYXRhbGluYSBpbnN0YWxsYXRpb24uICBJZiBub3QgcHJlc2VudCwgcmVzb2x2ZXMgdG8KK3JlbSAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBkaXJlY3RvcnkgdGhhdCBDQVRBTElOQV9IT01FIHBvaW50cyB0by4KK3JlbQorcmVtICAgQ0FUQUxJTkFfT1BUUyAgIChPcHRpb25hbCkgSmF2YSBydW50aW1lIG9wdGlvbnMgdXNlZCB3aGVuIHRoZSAic3RhcnQiLAorcmVtICAgICAgICAgICAgICAgICAgIG9yICJydW4iIGNvbW1hbmQgaXMgZXhlY3V0ZWQuCityZW0KK3JlbSAgIENBVEFMSU5BX1RNUERJUiAoT3B0aW9uYWwpIERpcmVjdG9yeSBwYXRoIGxvY2F0aW9uIG9mIHRlbXBvcmFyeSBkaXJlY3RvcnkKK3JlbSAgICAgICAgICAgICAgICAgICB0aGUgSlZNIHNob3VsZCB1c2UgKGphdmEuaW8udG1wZGlyKS4gIERlZmF1bHRzIHRvCityZW0gICAgICAgICAgICAgICAgICAgJUNBVEFMSU5BX0JBU0UlXHRlbXAuCityZW0KK3JlbSAgIEpBVkFfSE9NRSAgICAgICBNdXN0IHBvaW50IGF0IHlvdXIgSmF2YSBEZXZlbG9wbWVudCBLaXQgaW5zdGFsbGF0aW9uLgorcmVtICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIHRvIHJ1biB0aGUgd2l0aCB0aGUgImRlYnVnIiBhcmd1bWVudC4KK3JlbQorcmVtICAgSlJFX0hPTUUgICAgICAgIE11c3QgcG9pbnQgYXQgeW91ciBKYXZhIFJ1bnRpbWUgaW5zdGFsbGF0aW9uLgorcmVtICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIEpBVkFfSE9NRSBpZiBlbXB0eS4KK3JlbQorcmVtICAgSkFWQV9PUFRTICAgICAgIChPcHRpb25hbCkgSmF2YSBydW50aW1lIG9wdGlvbnMgdXNlZCB3aGVuIHRoZSAic3RhcnQiLAorcmVtICAgICAgICAgICAgICAgICAgICJzdG9wIiwgb3IgInJ1biIgY29tbWFuZCBpcyBleGVjdXRlZC4KK3JlbQorcmVtICAgSlNTRV9IT01FICAgICAgIChPcHRpb25hbCkgTWF5IHBvaW50IGF0IHlvdXIgSmF2YSBTZWN1cmUgU29ja2V0cyBFeHRlbnNpb24KK3JlbSAgICAgICAgICAgICAgICAgICAoSlNTRSkgaW5zdGFsbGF0aW9uLCB3aG9zZSBKQVIgZmlsZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUKK3JlbSAgICAgICAgICAgICAgICAgICBzeXN0ZW0gY2xhc3MgcGF0aCB1c2VkIHRvIHN0YXJ0IFRvbWNhdC4KK3JlbQorcmVtICAgSlBEQV9UUkFOU1BPUlQgIChPcHRpb25hbCkgSlBEQSB0cmFuc3BvcnQgdXNlZCB3aGVuIHRoZSAianBkYSBzdGFydCIKK3JlbSAgICAgICAgICAgICAgICAgICBjb21tYW5kIGlzIGV4ZWN1dGVkLiBUaGUgZGVmYXVsdCBpcyAiZHRfc2htZW0iLgorcmVtCityZW0gICBKUERBX0FERFJFU1MgICAgKE9wdGlvbmFsKSBKYXZhIHJ1bnRpbWUgb3B0aW9ucyB1c2VkIHdoZW4gdGhlICJqcGRhIHN0YXJ0IgorcmVtICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgaXMgZXhlY3V0ZWQuIFRoZSBkZWZhdWx0IGlzICJqZGJjb25uIi4KK3JlbQorcmVtICAgSlBEQV9TVVNQRU5EICAgIChPcHRpb25hbCkgSmF2YSBydW50aW1lIG9wdGlvbnMgdXNlZCB3aGVuIHRoZSAianBkYSBzdGFydCIKK3JlbSAgICAgICAgICAgICAgICAgICBjb21tYW5kIGlzIGV4ZWN1dGVkLiBTcGVjaWZpZXMgd2hldGhlciBKVk0gc2hvdWxkIHN1c3BlbmQKK3JlbSAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnR1cC4gRGVmYXVsdCBpcyAibiIuCityZW0KK3JlbSAgIEpQREFfT1BUUyAgICAgICAoT3B0aW9uYWwpIEphdmEgcnVudGltZSBvcHRpb25zIHVzZWQgd2hlbiB0aGUgImpwZGEgc3RhcnQiCityZW0gICAgICAgICAgICAgICAgICAgY29tbWFuZCBpcyBleGVjdXRlZC4gSWYgdXNlZCwgSlBEQV9UUkFOU1BPUlQsIEpQREFfQUREUkVTUywKK3JlbSAgICAgICAgICAgICAgICAgICBhbmQgSlBEQV9TVVNQRU5EIGFyZSBpZ25vcmVkLiBUaHVzLCBhbGwgcmVxdWlyZWQganBkYQorcmVtICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgTVVTVCBiZSBzcGVjaWZpZWQuIFRoZSBkZWZhdWx0IGlzOgorcmVtCityZW0gICAgICAgICAgICAgICAgICAgLVhkZWJ1ZyAtWHJ1bmpkd3A6dHJhbnNwb3J0PSVKUERBX1RSQU5TUE9SVCUsCityZW0gICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M9JUpQREFfQUREUkVTUyUsc2VydmVyPXksc3VzcGVuZD0lSlBEQV9TVVNQRU5EJQorcmVtCityZW0gJElkJAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZW0gR3Vlc3MgQ0FUQUxJTkFfSE9NRSBpZiBub3QgZGVmaW5lZAorc2V0IENVUlJFTlRfRElSPSVjZCUKK2lmIG5vdCAiJUNBVEFMSU5BX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEhvbWUKK3NldCBDQVRBTElOQV9IT01FPSVDVVJSRU5UX0RJUiUKK2lmIGV4aXN0ICIlQ0FUQUxJTkFfSE9NRSVcYmluXGNhdGFsaW5hLmJhdCIgZ290byBva0hvbWUKK2NkIC4uCitzZXQgQ0FUQUxJTkFfSE9NRT0lY2QlCitjZCAlQ1VSUkVOVF9ESVIlCis6Z290SG9tZQoraWYgZXhpc3QgIiVDQVRBTElOQV9IT01FJVxiaW5cY2F0YWxpbmEuYmF0IiBnb3RvIG9rSG9tZQorZWNobyBUaGUgQ0FUQUxJTkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkKK2VjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBlbmQKKzpva0hvbWUKKworcmVtIEdldCBzdGFuZGFyZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK2lmIGV4aXN0ICIlQ0FUQUxJTkFfSE9NRSVcYmluXHNldGVudi5iYXQiIGNhbGwgIiVDQVRBTElOQV9IT01FJVxiaW5cc2V0ZW52LmJhdCIKKworcmVtIEdldCBzdGFuZGFyZCBKYXZhIGVudmlyb25tZW50IHZhcmlhYmxlcworaWYgZXhpc3QgIiVDQVRBTElOQV9IT01FJVxiaW5cc2V0Y2xhc3NwYXRoLmJhdCIgZ290byBva1NldGNsYXNzcGF0aAorZWNobyBDYW5ub3QgZmluZCAlQ0FUQUxJTkFfSE9NRSVcYmluXHNldGNsYXNzcGF0aC5iYXQKK2VjaG8gVGhpcyBmaWxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZAorOm9rU2V0Y2xhc3NwYXRoCitzZXQgQkFTRURJUj0lQ0FUQUxJTkFfSE9NRSUKK2NhbGwgIiVDQVRBTElOQV9IT01FJVxiaW5cc2V0Y2xhc3NwYXRoLmJhdCIgJTEKK2lmIGVycm9ybGV2ZWwgMSBnb3RvIGVuZAorCityZW0gQWRkIG9uIGV4dHJhIGphciBmaWxlcyB0byBDTEFTU1BBVEgKK2lmICIlSlNTRV9IT01FJSIgPT0gIiIgZ290byBub0pzc2UKK3NldCBDTEFTU1BBVEg9JUNMQVNTUEFUSCU7JUpTU0VfSE9NRSVcbGliXGpjZXJ0LmphcjslSlNTRV9IT01FJVxsaWJcam5ldC5qYXI7JUpTU0VfSE9NRSVcbGliXGpzc2UuamFyCis6bm9Kc3NlCitzZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOyVDQVRBTElOQV9IT01FJVxiaW5cYm9vdHN0cmFwLmphcgorCitpZiBub3QgIiVDQVRBTElOQV9CQVNFJSIgPT0gIiIgZ290byBnb3RCYXNlCitzZXQgQ0FUQUxJTkFfQkFTRT0lQ0FUQUxJTkFfSE9NRSUKKzpnb3RCYXNlCisKK2lmIG5vdCAiJUNBVEFMSU5BX1RNUERJUiUiID09ICIiIGdvdG8gZ290VG1wZGlyCitzZXQgQ0FUQUxJTkFfVE1QRElSPSVDQVRBTElOQV9CQVNFJVx0ZW1wCis6Z290VG1wZGlyCisKK2lmIG5vdCBleGlzdCAiJUNBVEFMSU5BX0hPTUUlXGJpblx0b21jYXQtanVsaS5qYXIiIGdvdG8gbm9KdWxpCitzZXQgSkFWQV9PUFRTPSVKQVZBX09QVFMlIC1EamF2YS51dGlsLmxvZ2dpbmcubWFuYWdlcj1vcmcuYXBhY2hlLmp1bGkuQ2xhc3NMb2FkZXJMb2dNYW5hZ2VyIC1EamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGU9IiVDQVRBTElOQV9CQVNFJVxjb25mXGxvZ2dpbmcucHJvcGVydGllcyIKKzpub0p1bGkKKworcmVtIC0tLS0tIEV4ZWN1dGUgVGhlIFJlcXVlc3RlZCBDb21tYW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitlY2hvIFVzaW5nIENBVEFMSU5BX0JBU0U6ICAgJUNBVEFMSU5BX0JBU0UlCitlY2hvIFVzaW5nIENBVEFMSU5BX0hPTUU6ICAgJUNBVEFMSU5BX0hPTUUlCitlY2hvIFVzaW5nIENBVEFMSU5BX1RNUERJUjogJUNBVEFMSU5BX1RNUERJUiUKK2lmICIiJTEiIiA9PSAiImRlYnVnIiIgZ290byB1c2VfamRrCitlY2hvIFVzaW5nIEpSRV9IT01FOiAgICAgICAgJUpSRV9IT01FJQorZ290byBqYXZhX2Rpcl9kaXNwbGF5ZWQKKzp1c2VfamRrCitlY2hvIFVzaW5nIEpBVkFfSE9NRTogICAgICAgJUpBVkFfSE9NRSUKKzpqYXZhX2Rpcl9kaXNwbGF5ZWQKKworc2V0IF9FWEVDSkFWQT0lX1JVTkpBVkElCitzZXQgTUFJTkNMQVNTPW9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAKK3NldCBBQ1RJT049c3RhcnQKK3NldCBTRUNVUklUWV9QT0xJQ1lfRklMRT0KK3NldCBERUJVR19PUFRTPQorc2V0IEpQREE9CisKK2lmIG5vdCAiIiUxIiIgPT0gIiJqcGRhIiIgZ290byBub0pwZGEKK3NldCBKUERBPWpwZGEKK2lmIG5vdCAiJUpQREFfVFJBTlNQT1JUJSIgPT0gIiIgZ290byBnb3RKcGRhVHJhbnNwb3J0CitzZXQgSlBEQV9UUkFOU1BPUlQ9ZHRfc2htZW0KKzpnb3RKcGRhVHJhbnNwb3J0CitpZiBub3QgIiVKUERBX0FERFJFU1MlIiA9PSAiIiBnb3RvIGdvdEpwZGFBZGRyZXNzCitzZXQgSlBEQV9BRERSRVNTPWpkYmNvbm4KKzpnb3RKcGRhQWRkcmVzcworaWYgbm90ICIlSlBEQV9TVVNQRU5EJSIgPT0gIiIgZ290byBnb3RKcGRhU3VzcGVuZAorc2V0IEpQREFfU1VTUEVORD1uCis6Z290SnBkYVN1c3BlbmQKK2lmIG5vdCAiJUpQREFfT1BUUyUiID09ICIiIGdvdG8gZ290SnBkYU9wdHMKK3NldCBKUERBX09QVFM9LVhkZWJ1ZyAtWHJ1bmpkd3A6dHJhbnNwb3J0PSVKUERBX1RSQU5TUE9SVCUsYWRkcmVzcz0lSlBEQV9BRERSRVNTJSxzZXJ2ZXI9eSxzdXNwZW5kPSVKUERBX1NVU1BFTkQlCis6Z290SnBkYU9wdHMKK3NoaWZ0Cis6bm9KcGRhCisKK2lmICIiJTEiIiA9PSAiImRlYnVnIiIgZ290byBkb0RlYnVnCitpZiAiIiUxIiIgPT0gIiJydW4iIiBnb3RvIGRvUnVuCitpZiAiIiUxIiIgPT0gIiJzdGFydCIiIGdvdG8gZG9TdGFydAoraWYgIiIlMSIiID09ICIic3RvcCIiIGdvdG8gZG9TdG9wCitpZiAiIiUxIiIgPT0gIiJ2ZXJzaW9uIiIgZ290byBkb1ZlcnNpb24KKworZWNobyBVc2FnZTogIGNhdGFsaW5hICggY29tbWFuZHMgLi4uICkKK2VjaG8gY29tbWFuZHM6CitlY2hvICAgZGVidWcgICAgICAgICAgICAgU3RhcnQgQ2F0YWxpbmEgaW4gYSBkZWJ1Z2dlcgorZWNobyAgIGRlYnVnIC1zZWN1cml0eSAgIERlYnVnIENhdGFsaW5hIHdpdGggYSBzZWN1cml0eSBtYW5hZ2VyCitlY2hvICAganBkYSBzdGFydCAgICAgICAgU3RhcnQgQ2F0YWxpbmEgdW5kZXIgSlBEQSBkZWJ1Z2dlcgorZWNobyAgIHJ1biAgICAgICAgICAgICAgIFN0YXJ0IENhdGFsaW5hIGluIHRoZSBjdXJyZW50IHdpbmRvdworZWNobyAgIHJ1biAtc2VjdXJpdHkgICAgIFN0YXJ0IGluIHRoZSBjdXJyZW50IHdpbmRvdyB3aXRoIHNlY3VyaXR5IG1hbmFnZXIKK2VjaG8gICBzdGFydCAgICAgICAgICAgICBTdGFydCBDYXRhbGluYSBpbiBhIHNlcGFyYXRlIHdpbmRvdworZWNobyAgIHN0YXJ0IC1zZWN1cml0eSAgIFN0YXJ0IGluIGEgc2VwYXJhdGUgd2luZG93IHdpdGggc2VjdXJpdHkgbWFuYWdlcgorZWNobyAgIHN0b3AgICAgICAgICAgICAgIFN0b3AgQ2F0YWxpbmEKK2VjaG8gICB2ZXJzaW9uICAgICAgICAgICBXaGF0IHZlcnNpb24gb2YgdG9tY2F0IGFyZSB5b3UgcnVubmluZz8KK2dvdG8gZW5kCisKKzpkb0RlYnVnCitzaGlmdAorc2V0IF9FWEVDSkFWQT0lX1JVTkpEQiUKK3NldCBERUJVR19PUFRTPS1zb3VyY2VwYXRoICIlQ0FUQUxJTkFfSE9NRSVcLi5cLi5camFrYXJ0YS10b21jYXQtY2F0YWxpbmFcY2F0YWxpbmFcc3JjXHNoYXJlIgoraWYgbm90ICIiJTEiIiA9PSAiIi1zZWN1cml0eSIiIGdvdG8gZXhlY0NtZAorc2hpZnQKK2VjaG8gVXNpbmcgU2VjdXJpdHkgTWFuYWdlcgorc2V0IFNFQ1VSSVRZX1BPTElDWV9GSUxFPSVDQVRBTElOQV9CQVNFJVxjb25mXGNhdGFsaW5hLnBvbGljeQorZ290byBleGVjQ21kCisKKzpkb1J1bgorc2hpZnQKK2lmIG5vdCAiIiUxIiIgPT0gIiItc2VjdXJpdHkiIiBnb3RvIGV4ZWNDbWQKK3NoaWZ0CitlY2hvIFVzaW5nIFNlY3VyaXR5IE1hbmFnZXIKK3NldCBTRUNVUklUWV9QT0xJQ1lfRklMRT0lQ0FUQUxJTkFfQkFTRSVcY29uZlxjYXRhbGluYS5wb2xpY3kKK2dvdG8gZXhlY0NtZAorCis6ZG9TdGFydAorc2hpZnQKK2lmIG5vdCAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIGdvdG8gbm9UaXRsZQorc2V0IF9FWEVDSkFWQT1zdGFydCAiVG9tY2F0IiAlX1JVTkpBVkElCitnb3RvIGdvdFRpdGxlCis6bm9UaXRsZQorc2V0IF9FWEVDSkFWQT1zdGFydCAlX1JVTkpBVkElCis6Z290VGl0bGUKK2lmIG5vdCAiIiUxIiIgPT0gIiItc2VjdXJpdHkiIiBnb3RvIGV4ZWNDbWQKK3NoaWZ0CitlY2hvIFVzaW5nIFNlY3VyaXR5IE1hbmFnZXIKK3NldCBTRUNVUklUWV9QT0xJQ1lfRklMRT0lQ0FUQUxJTkFfQkFTRSVcY29uZlxjYXRhbGluYS5wb2xpY3kKK2dvdG8gZXhlY0NtZAorCis6ZG9TdG9wCitzaGlmdAorc2V0IEFDVElPTj1zdG9wCitzZXQgQ0FUQUxJTkFfT1BUUz0KK2dvdG8gZXhlY0NtZAorCis6ZG9WZXJzaW9uCislX0VYRUNKQVZBJSAtY2xhc3NwYXRoICIlQ0FUQUxJTkFfSE9NRSVcc2VydmVyXGxpYlxjYXRhbGluYS5qYXIiIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TZXJ2ZXJJbmZvCitnb3RvIGVuZAorCisKKzpleGVjQ21kCityZW0gR2V0IHJlbWFpbmluZyB1bnNoaWZ0ZWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgc2F2ZSB0aGVtIGluIHRoZQorc2V0IENNRF9MSU5FX0FSR1M9Cis6c2V0QXJncworaWYgIiIlMSIiPT0iIiIiIGdvdG8gZG9uZVNldEFyZ3MKK3NldCBDTURfTElORV9BUkdTPSVDTURfTElORV9BUkdTJSAlMQorc2hpZnQKK2dvdG8gc2V0QXJncworOmRvbmVTZXRBcmdzCisKK3JlbSBFeGVjdXRlIEphdmEgd2l0aCB0aGUgYXBwbGljYWJsZSBwcm9wZXJ0aWVzCitpZiBub3QgIiVKUERBJSIgPT0gIiIgZ290byBkb0pwZGEKK2lmIG5vdCAiJVNFQ1VSSVRZX1BPTElDWV9GSUxFJSIgPT0gIiIgZ290byBkb1NlY3VyaXR5CislX0VYRUNKQVZBJSAlSkFWQV9PUFRTJSAlQ0FUQUxJTkFfT1BUUyUgJURFQlVHX09QVFMlIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIlSkFWQV9FTkRPUlNFRF9ESVJTJSIgLWNsYXNzcGF0aCAiJUNMQVNTUEFUSCUiIC1EY2F0YWxpbmEuYmFzZT0iJUNBVEFMSU5BX0JBU0UlIiAtRGNhdGFsaW5hLmhvbWU9IiVDQVRBTElOQV9IT01FJSIgLURqYXZhLmlvLnRtcGRpcj0iJUNBVEFMSU5BX1RNUERJUiUiICVNQUlOQ0xBU1MlICVDTURfTElORV9BUkdTJSAlQUNUSU9OJQorZ290byBlbmQKKzpkb1NlY3VyaXR5CislX0VYRUNKQVZBJSAlSkFWQV9PUFRTJSAlQ0FUQUxJTkFfT1BUUyUgJURFQlVHX09QVFMlIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIlSkFWQV9FTkRPUlNFRF9ESVJTJSIgLWNsYXNzcGF0aCAiJUNMQVNTUEFUSCUiIC1EamF2YS5zZWN1cml0eS5tYW5hZ2VyIC1EamF2YS5zZWN1cml0eS5wb2xpY3k9PSIlU0VDVVJJVFlfUE9MSUNZX0ZJTEUlIiAtRGNhdGFsaW5hLmJhc2U9IiVDQVRBTElOQV9CQVNFJSIgLURjYXRhbGluYS5ob21lPSIlQ0FUQUxJTkFfSE9NRSUiIC1EamF2YS5pby50bXBkaXI9IiVDQVRBTElOQV9UTVBESVIlIiAlTUFJTkNMQVNTJSAlQ01EX0xJTkVfQVJHUyUgJUFDVElPTiUKK2dvdG8gZW5kCis6ZG9KcGRhCitpZiBub3QgIiVTRUNVUklUWV9QT0xJQ1lfRklMRSUiID09ICIiIGdvdG8gZG9TZWN1cml0eUpwZGEKKyVfRVhFQ0pBVkElICVKQVZBX09QVFMlICVDQVRBTElOQV9PUFRTJSAlSlBEQV9PUFRTJSAlREVCVUdfT1BUUyUgLURqYXZhLmVuZG9yc2VkLmRpcnM9IiVKQVZBX0VORE9SU0VEX0RJUlMlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgLURjYXRhbGluYS5iYXNlPSIlQ0FUQUxJTkFfQkFTRSUiIC1EY2F0YWxpbmEuaG9tZT0iJUNBVEFMSU5BX0hPTUUlIiAtRGphdmEuaW8udG1wZGlyPSIlQ0FUQUxJTkFfVE1QRElSJSIgJU1BSU5DTEFTUyUgJUNNRF9MSU5FX0FSR1MlICVBQ1RJT04lCitnb3RvIGVuZAorOmRvU2VjdXJpdHlKcGRhCislX0VYRUNKQVZBJSAlSkFWQV9PUFRTJSAlQ0FUQUxJTkFfT1BUUyUgJUpQREFfT1BUUyUgJURFQlVHX09QVFMlIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIlSkFWQV9FTkRPUlNFRF9ESVJTJSIgLWNsYXNzcGF0aCAiJUNMQVNTUEFUSCUiIC1EamF2YS5zZWN1cml0eS5tYW5hZ2VyIC1EamF2YS5zZWN1cml0eS5wb2xpY3k9PSIlU0VDVVJJVFlfUE9MSUNZX0ZJTEUlIiAtRGNhdGFsaW5hLmJhc2U9IiVDQVRBTElOQV9CQVNFJSIgLURjYXRhbGluYS5ob21lPSIlQ0FUQUxJTkFfSE9NRSUiIC1EamF2YS5pby50bXBkaXI9IiVDQVRBTElOQV9UTVBESVIlIiAlTUFJTkNMQVNTJSAlQ01EX0xJTkVfQVJHUyUgJUFDVElPTiUKK2dvdG8gZW5kCisKKzplbmQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL2NhdGFsaW5hLnNoIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vY2F0YWxpbmEuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4Y2E3ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL2NhdGFsaW5hLnNoCkBAIC0wLDAgKzEsMzM4IEBACisjIS9iaW4vc2gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU3RhcnQvU3RvcCBTY3JpcHQgZm9yIHRoZSBDQVRBTElOQSBTZXJ2ZXIKKyMKKyMgRW52aXJvbm1lbnQgVmFyaWFibGUgUHJlcXVpc2l0ZXMKKyMKKyMgICBDQVRBTElOQV9IT01FICAgTWF5IHBvaW50IGF0IHlvdXIgQ2F0YWxpbmEgImJ1aWxkIiBkaXJlY3RvcnkuCisjCisjICAgQ0FUQUxJTkFfQkFTRSAgIChPcHRpb25hbCkgQmFzZSBkaXJlY3RvcnkgZm9yIHJlc29sdmluZyBkeW5hbWljIHBvcnRpb25zCisjICAgICAgICAgICAgICAgICAgIG9mIGEgQ2F0YWxpbmEgaW5zdGFsbGF0aW9uLiAgSWYgbm90IHByZXNlbnQsIHJlc29sdmVzIHRvCisjICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIGRpcmVjdG9yeSB0aGF0IENBVEFMSU5BX0hPTUUgcG9pbnRzIHRvLgorIworIyAgIENBVEFMSU5BX09QVFMgICAoT3B0aW9uYWwpIEphdmEgcnVudGltZSBvcHRpb25zIHVzZWQgd2hlbiB0aGUgInN0YXJ0IiwKKyMgICAgICAgICAgICAgICAgICAgb3IgInJ1biIgY29tbWFuZCBpcyBleGVjdXRlZC4KKyMKKyMgICBDQVRBTElOQV9UTVBESVIgKE9wdGlvbmFsKSBEaXJlY3RvcnkgcGF0aCBsb2NhdGlvbiBvZiB0ZW1wb3JhcnkgZGlyZWN0b3J5CisjICAgICAgICAgICAgICAgICAgIHRoZSBKVk0gc2hvdWxkIHVzZSAoamF2YS5pby50bXBkaXIpLiAgRGVmYXVsdHMgdG8KKyMgICAgICAgICAgICAgICAgICAgJENBVEFMSU5BX0JBU0UvdGVtcC4KKyMKKyMgICBKQVZBX0hPTUUgICAgICAgTXVzdCBwb2ludCBhdCB5b3VyIEphdmEgRGV2ZWxvcG1lbnQgS2l0IGluc3RhbGxhdGlvbi4KKyMgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgdG8gcnVuIHRoZSB3aXRoIHRoZSAiZGVidWciIG9yICJqYXZhYyIgYXJndW1lbnQuCisjCisjICAgSlJFX0hPTUUgICAgICAgIE11c3QgcG9pbnQgYXQgeW91ciBKYXZhIERldmVsb3BtZW50IEtpdCBpbnN0YWxsYXRpb24uCisjICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIEpBVkFfSE9NRSBpZiBlbXB0eS4KKyMKKyMgICBKQVZBX09QVFMgICAgICAgKE9wdGlvbmFsKSBKYXZhIHJ1bnRpbWUgb3B0aW9ucyB1c2VkIHdoZW4gdGhlICJzdGFydCIsCisjICAgICAgICAgICAgICAgICAgICJzdG9wIiwgb3IgInJ1biIgY29tbWFuZCBpcyBleGVjdXRlZC4KKyMKKyMgICBKUERBX1RSQU5TUE9SVCAgKE9wdGlvbmFsKSBKUERBIHRyYW5zcG9ydCB1c2VkIHdoZW4gdGhlICJqcGRhIHN0YXJ0IgorIyAgICAgICAgICAgICAgICAgICBjb21tYW5kIGlzIGV4ZWN1dGVkLiBUaGUgZGVmYXVsdCBpcyAiZHRfc29ja2V0Ii4KKyMKKyMgICBKUERBX0FERFJFU1MgICAgKE9wdGlvbmFsKSBKYXZhIHJ1bnRpbWUgb3B0aW9ucyB1c2VkIHdoZW4gdGhlICJqcGRhIHN0YXJ0IgorIyAgICAgICAgICAgICAgICAgICBjb21tYW5kIGlzIGV4ZWN1dGVkLiBUaGUgZGVmYXVsdCBpcyA4MDAwLgorIworIyAgIEpQREFfU1VTUEVORCAgICAoT3B0aW9uYWwpIEphdmEgcnVudGltZSBvcHRpb25zIHVzZWQgd2hlbiB0aGUgImpwZGEgc3RhcnQiCisjICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgaXMgZXhlY3V0ZWQuIFNwZWNpZmllcyB3aGV0aGVyIEpWTSBzaG91bGQgc3VzcGVuZAorIyAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnR1cC4gRGVmYXVsdCBpcyAibiIuCisjCisjICAgSlBEQV9PUFRTICAgICAgIChPcHRpb25hbCkgSmF2YSBydW50aW1lIG9wdGlvbnMgdXNlZCB3aGVuIHRoZSAianBkYSBzdGFydCIKKyMgICAgICAgICAgICAgICAgICAgY29tbWFuZCBpcyBleGVjdXRlZC4gSWYgdXNlZCwgSlBEQV9UUkFOU1BPUlQsIEpQREFfQUREUkVTUywKKyMgICAgICAgICAgICAgICAgICAgYW5kIEpQREFfU1VTUEVORCBhcmUgaWdub3JlZC4gVGh1cywgYWxsIHJlcXVpcmVkIGpwZGEKKyMgICAgICAgICAgICAgICAgICAgb3B0aW9ucyBNVVNUIGJlIHNwZWNpZmllZC4gVGhlIGRlZmF1bHQgaXM6CisjCisjICAgICAgICAgICAgICAgICAgIC1YZGVidWcgLVhydW5qZHdwOnRyYW5zcG9ydD0kSlBEQV9UUkFOU1BPUlQsCisjICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzPSRKUERBX0FERFJFU1Msc2VydmVyPXksc3VzcGVuZD0kSlBEQV9TVVNQRU5ECisjCisjICAgSlNTRV9IT01FICAgICAgIChPcHRpb25hbCkgTWF5IHBvaW50IGF0IHlvdXIgSmF2YSBTZWN1cmUgU29ja2V0cyBFeHRlbnNpb24KKyMgICAgICAgICAgICAgICAgICAgKEpTU0UpIGluc3RhbGxhdGlvbiwgd2hvc2UgSkFSIGZpbGVzIHdpbGwgYmUgYWRkZWQgdG8gdGhlCisjICAgICAgICAgICAgICAgICAgIHN5c3RlbSBjbGFzcyBwYXRoIHVzZWQgdG8gc3RhcnQgVG9tY2F0LgorIworIyAgIENBVEFMSU5BX1BJRCAgICAoT3B0aW9uYWwpIFBhdGggb2YgdGhlIGZpbGUgd2hpY2ggc2hvdWxkIGNvbnRhaW5zIHRoZSBwaWQKKyMgICAgICAgICAgICAgICAgICAgb2YgY2F0YWxpbmEgc3RhcnR1cCBqYXZhIHByb2Nlc3MsIHdoZW4gc3RhcnQgKGZvcmspIGlzIHVzZWQKKyMKKyMgJElkJAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIE9TIHNwZWNpZmljIHN1cHBvcnQuICAkdmFyIF9tdXN0XyBiZSBzZXQgdG8gZWl0aGVyIHRydWUgb3IgZmFsc2UuCitjeWd3aW49ZmFsc2UKK29zNDAwPWZhbHNlCitkYXJ3aW49ZmFsc2UKK2Nhc2UgImB1bmFtZWAiIGluCitDWUdXSU4qKSBjeWd3aW49dHJ1ZTs7CitPUzQwMCopIG9zNDAwPXRydWU7OworRGFyd2luKikgZGFyd2luPXRydWU7OworZXNhYworCisjIHJlc29sdmUgbGlua3MgLSAkMCBtYXkgYmUgYSBzb2Z0bGluaworUFJHPSIkMCIKKword2hpbGUgWyAtaCAiJFBSRyIgXTsgZG8KKyAgbHM9YGxzIC1sZCAiJFBSRyJgCisgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICBQUkc9IiRsaW5rIgorICBlbHNlCisgICAgUFJHPWBkaXJuYW1lICIkUFJHImAvIiRsaW5rIgorICBmaQorZG9uZQorCisjIEdldCBzdGFuZGFyZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK1BSR0RJUj1gZGlybmFtZSAiJFBSRyJgCisKKyMgT25seSBzZXQgQ0FUQUxJTkFfSE9NRSBpZiBub3QgYWxyZWFkeSBzZXQKK1sgLXogIiRDQVRBTElOQV9IT01FIiBdICYmIENBVEFMSU5BX0hPTUU9YGNkICIkUFJHRElSLy4uIiA7IHB3ZGAKKworaWYgWyAtciAiJENBVEFMSU5BX0hPTUUiL2Jpbi9zZXRlbnYuc2ggXTsgdGhlbgorICAuICIkQ0FUQUxJTkFfSE9NRSIvYmluL3NldGVudi5zaAorZmkKKworIyBGb3IgQ3lnd2luLCBlbnN1cmUgcGF0aHMgYXJlIGluIFVOSVggZm9ybWF0IGJlZm9yZSBhbnl0aGluZyBpcyB0b3VjaGVkCitpZiAkY3lnd2luOyB0aGVuCisgIFsgLW4gIiRKQVZBX0hPTUUiIF0gJiYgSkFWQV9IT01FPWBjeWdwYXRoIC0tdW5peCAiJEpBVkFfSE9NRSJgCisgIFsgLW4gIiRKUkVfSE9NRSIgXSAmJiBKUkVfSE9NRT1gY3lncGF0aCAtLXVuaXggIiRKUkVfSE9NRSJgCisgIFsgLW4gIiRDQVRBTElOQV9IT01FIiBdICYmIENBVEFMSU5BX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkQ0FUQUxJTkFfSE9NRSJgCisgIFsgLW4gIiRDQVRBTElOQV9CQVNFIiBdICYmIENBVEFMSU5BX0JBU0U9YGN5Z3BhdGggLS11bml4ICIkQ0FUQUxJTkFfQkFTRSJgCisgIFsgLW4gIiRDTEFTU1BBVEgiIF0gJiYgQ0xBU1NQQVRIPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRDTEFTU1BBVEgiYAorICBbIC1uICIkSlNTRV9IT01FIiBdICYmIEpTU0VfSE9NRT1gY3lncGF0aCAtLWFic29sdXRlIC0tdW5peCAiJEpTU0VfSE9NRSJgCitmaQorCisjIEZvciBPUzQwMAoraWYgJG9zNDAwOyB0aGVuCisgICMgU2V0IGpvYiBwcmlvcml0eSB0byBzdGFuZGFyZCBmb3IgaW50ZXJhY3RpdmUgKGludGVyYWN0aXZlIC0gNikgYnkgdXNpbmcKKyAgIyB0aGUgaW50ZXJhY3RpdmUgcHJpb3JpdHkgLSA2LCB0aGUgaGVscGVyIHRocmVhZHMgdGhhdCByZXNwb25kIHRvIHJlcXVlc3RzCisgICMgd2lsbCBiZSBydW5uaW5nIGF0IHRoZSBzYW1lIHByaW9yaXR5IGFzIGludGVyYWN0aXZlIGpvYnMuCisgIENPTU1BTkQ9J2NoZ2pvYiBqb2IoJyRKT0JOQU1FJykgcnVucHR5KDYpJworICBzeXN0ZW0gJENPTU1BTkQKKworICAjIEVuYWJsZSBtdWx0aSB0aHJlYWRpbmcKKyAgZXhwb3J0IFFJQk1fTVVMVElfVEhSRUFERUQ9WQorZmkKKworIyBHZXQgc3RhbmRhcmQgSmF2YSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK2lmICRvczQwMDsgdGhlbgorICAjIC1yIHdpbGwgT25seSB3b3JrIG9uIHRoZSBvczQwMCBpZiB0aGUgZmlsZXMgYXJlOgorICAjIDEuIG93bmVkIGJ5IHRoZSB1c2VyCisgICMgMi4gb3duZWQgYnkgdGhlIFBSSU1BUlkgZ3JvdXAgb2YgdGhlIHVzZXIKKyAgIyB0aGlzIHdpbGwgbm90IHdvcmsgaWYgdGhlIHVzZXIgYmVsb25ncyBpbiBzZWNvbmRhcnkgZ3JvdXBzCisgIEJBU0VESVI9IiRDQVRBTElOQV9IT01FIgorICAuICIkQ0FUQUxJTkFfSE9NRSIvYmluL3NldGNsYXNzcGF0aC5zaCAKK2Vsc2UKKyAgaWYgWyAtciAiJENBVEFMSU5BX0hPTUUiL2Jpbi9zZXRjbGFzc3BhdGguc2ggXTsgdGhlbgorICAgIEJBU0VESVI9IiRDQVRBTElOQV9IT01FIgorICAgIC4gIiRDQVRBTElOQV9IT01FIi9iaW4vc2V0Y2xhc3NwYXRoLnNoCisgIGVsc2UKKyAgICBlY2hvICJDYW5ub3QgZmluZCAkQ0FUQUxJTkFfSE9NRS9iaW4vc2V0Y2xhc3NwYXRoLnNoIgorICAgIGVjaG8gIlRoaXMgZmlsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbSIKKyAgICBleGl0IDEKKyAgZmkKK2ZpCisKKyMgQWRkIG9uIGV4dHJhIGphciBmaWxlcyB0byBDTEFTU1BBVEgKK2lmIFsgLW4gIiRKU1NFX0hPTUUiIF07IHRoZW4KKyAgQ0xBU1NQQVRIPSIkQ0xBU1NQQVRIIjoiJEpTU0VfSE9NRSIvbGliL2pjZXJ0LmphcjoiJEpTU0VfSE9NRSIvbGliL2puZXQuamFyOiIkSlNTRV9IT01FIi9saWIvanNzZS5qYXIKK2ZpCitDTEFTU1BBVEg9IiRDTEFTU1BBVEgiOiIkQ0FUQUxJTkFfSE9NRSIvYmluL2Jvb3RzdHJhcC5qYXI6IiRDQVRBTElOQV9IT01FIi9iaW4vY29tbW9ucy1sb2dnaW5nLWFwaS5qYXIKKworaWYgWyAteiAiJENBVEFMSU5BX0JBU0UiIF0gOyB0aGVuCisgIENBVEFMSU5BX0JBU0U9IiRDQVRBTElOQV9IT01FIgorZmkKKworaWYgWyAteiAiJENBVEFMSU5BX1RNUERJUiIgXSA7IHRoZW4KKyAgIyBEZWZpbmUgdGhlIGphdmEuaW8udG1wZGlyIHRvIHVzZSBmb3IgQ2F0YWxpbmEKKyAgQ0FUQUxJTkFfVE1QRElSPSIkQ0FUQUxJTkFfQkFTRSIvdGVtcAorZmkKKworIyBCdWd6aWxsYSAzNzg0ODogV2hlbiBubyBUVFkgaXMgYXZhaWxhYmxlLCBkb24ndCBvdXRwdXQgdG8gY29uc29sZQoraGF2ZV90dHk9MAoraWYgWyAiYHR0eWAiICE9ICJub3QgYSB0dHkiIF07IHRoZW4KKyAgICBoYXZlX3R0eT0xCitmaQorCisjIEZvciBDeWd3aW4sIHN3aXRjaCBwYXRocyB0byBXaW5kb3dzIGZvcm1hdCBiZWZvcmUgcnVubmluZyBqYXZhCitpZiAkY3lnd2luOyB0aGVuCisgIEpBVkFfSE9NRT1gY3lncGF0aCAtLWFic29sdXRlIC0td2luZG93cyAiJEpBVkFfSE9NRSJgCisgIEpSRV9IT01FPWBjeWdwYXRoIC0tYWJzb2x1dGUgLS13aW5kb3dzICIkSlJFX0hPTUUiYAorICBDQVRBTElOQV9IT01FPWBjeWdwYXRoIC0tYWJzb2x1dGUgLS13aW5kb3dzICIkQ0FUQUxJTkFfSE9NRSJgCisgIENBVEFMSU5BX0JBU0U9YGN5Z3BhdGggLS1hYnNvbHV0ZSAtLXdpbmRvd3MgIiRDQVRBTElOQV9CQVNFImAKKyAgQ0FUQUxJTkFfVE1QRElSPWBjeWdwYXRoIC0tYWJzb2x1dGUgLS13aW5kb3dzICIkQ0FUQUxJTkFfVE1QRElSImAKKyAgQ0xBU1NQQVRIPWBjeWdwYXRoIC0tcGF0aCAtLXdpbmRvd3MgIiRDTEFTU1BBVEgiYAorICBbIC1uICIkSlNTRV9IT01FIiBdICYmIEpTU0VfSE9NRT1gY3lncGF0aCAtLWFic29sdXRlIC0td2luZG93cyAiJEpTU0VfSE9NRSJgCisgIEpBVkFfRU5ET1JTRURfRElSUz1gY3lncGF0aCAtLXBhdGggLS13aW5kb3dzICIkSkFWQV9FTkRPUlNFRF9ESVJTImAKK2ZpCisKKyMgU2V0IGp1bGkgTG9nTWFuYWdlciBpZiBpdCBpcyBwcmVzZW50CitpZiBbIC1yICIkQ0FUQUxJTkFfSE9NRSIvYmluL3RvbWNhdC1qdWxpLmphciBdOyB0aGVuCisgIEpBVkFfT1BUUz0iJEpBVkFfT1BUUyAiLURqYXZhLnV0aWwubG9nZ2luZy5tYW5hZ2VyPW9yZy5hcGFjaGUuanVsaS5DbGFzc0xvYWRlckxvZ01hbmFnZXIiICItRGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPSIkQ0FUQUxJTkFfQkFTRS9jb25mL2xvZ2dpbmcucHJvcGVydGllcyIKK2ZpCisKKyMgLS0tLS0gRXhlY3V0ZSBUaGUgUmVxdWVzdGVkIENvbW1hbmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBCdWd6aWxsYSAzNzg0ODogb25seSBvdXRwdXQgdGhpcyBpZiB3ZSBoYXZlIGEgVFRZCitpZiBbICRoYXZlX3R0eSAtZXEgMSBdOyB0aGVuCisgIGVjaG8gIlVzaW5nIENBVEFMSU5BX0JBU0U6ICAgJENBVEFMSU5BX0JBU0UiCisgIGVjaG8gIlVzaW5nIENBVEFMSU5BX0hPTUU6ICAgJENBVEFMSU5BX0hPTUUiCisgIGVjaG8gIlVzaW5nIENBVEFMSU5BX1RNUERJUjogJENBVEFMSU5BX1RNUERJUiIKKyAgaWYgWyAiJDEiID0gImRlYnVnIiAtbyAiJDEiID0gImphdmFjIiBdIDsgdGhlbgorICAgIGVjaG8gIlVzaW5nIEpBVkFfSE9NRTogICAgICAgJEpBVkFfSE9NRSIKKyAgZWxzZQorICAgIGVjaG8gIlVzaW5nIEpSRV9IT01FOiAgICAgICAkSlJFX0hPTUUiCisgIGZpCitmaQorCitpZiBbICIkMSIgPSAianBkYSIgXSA7IHRoZW4KKyAgaWYgWyAteiAiJEpQREFfVFJBTlNQT1JUIiBdOyB0aGVuCisgICAgSlBEQV9UUkFOU1BPUlQ9ImR0X3NvY2tldCIKKyAgZmkKKyAgaWYgWyAteiAiJEpQREFfQUREUkVTUyIgXTsgdGhlbgorICAgIEpQREFfQUREUkVTUz0iODAwMCIKKyAgZmkKKyAgaWYgWyAteiAiJEpQREFfU1VTUEVORCIgXTsgdGhlbgorICAgIEpQREFfU1VTUEVORD0ibiIKKyAgZmkKKyAgaWYgWyAteiAiJEpQREFfT1BUUyIgXTsgdGhlbgorICAgIEpQREFfT1BUUz0iLVhkZWJ1ZyAtWHJ1bmpkd3A6dHJhbnNwb3J0PSRKUERBX1RSQU5TUE9SVCxhZGRyZXNzPSRKUERBX0FERFJFU1Msc2VydmVyPXksc3VzcGVuZD0kSlBEQV9TVVNQRU5EIgorICBmaQorICBDQVRBTElOQV9PUFRTPSIkQ0FUQUxJTkFfT1BUUyAkSlBEQV9PUFRTIgorICBzaGlmdAorZmkKKworaWYgWyAiJDEiID0gImRlYnVnIiBdIDsgdGhlbgorICBpZiAkb3M0MDA7IHRoZW4KKyAgICBlY2hvICJEZWJ1ZyBjb21tYW5kIG5vdCBhdmFpbGFibGUgb24gT1M0MDAiCisgICAgZXhpdCAxCisgIGVsc2UKKyAgICBzaGlmdAorICAgIGlmIFsgIiQxIiA9ICItc2VjdXJpdHkiIF0gOyB0aGVuCisgICAgICBlY2hvICJVc2luZyBTZWN1cml0eSBNYW5hZ2VyIgorICAgICAgc2hpZnQKKyAgICAgIGV4ZWMgIiRfUlVOSkRCIiAkSkFWQV9PUFRTICRDQVRBTElOQV9PUFRTIFwKKyAgICAgICAgLURqYXZhLmVuZG9yc2VkLmRpcnM9IiRKQVZBX0VORE9SU0VEX0RJUlMiIC1jbGFzc3BhdGggIiRDTEFTU1BBVEgiIFwKKyAgICAgICAgLXNvdXJjZXBhdGggIiRDQVRBTElOQV9IT01FIi8uLi8uLi9qYWthcnRhLXRvbWNhdC1jYXRhbGluYS9jYXRhbGluYS9zcmMvc2hhcmUgXAorICAgICAgICAtRGphdmEuc2VjdXJpdHkubWFuYWdlciBcCisgICAgICAgIC1EamF2YS5zZWN1cml0eS5wb2xpY3k9PSIkQ0FUQUxJTkFfQkFTRSIvY29uZi9jYXRhbGluYS5wb2xpY3kgXAorICAgICAgICAtRGNhdGFsaW5hLmJhc2U9IiRDQVRBTElOQV9CQVNFIiBcCisgICAgICAgIC1EY2F0YWxpbmEuaG9tZT0iJENBVEFMSU5BX0hPTUUiIFwKKyAgICAgICAgLURqYXZhLmlvLnRtcGRpcj0iJENBVEFMSU5BX1RNUERJUiIgXAorICAgICAgICBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwICIkQCIgc3RhcnQKKyAgICBlbHNlCisgICAgICBleGVjICIkX1JVTkpEQiIgJEpBVkFfT1BUUyAkQ0FUQUxJTkFfT1BUUyBcCisgICAgICAgIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIkSkFWQV9FTkRPUlNFRF9ESVJTIiAtY2xhc3NwYXRoICIkQ0xBU1NQQVRIIiBcCisgICAgICAgIC1zb3VyY2VwYXRoICIkQ0FUQUxJTkFfSE9NRSIvLi4vLi4vamFrYXJ0YS10b21jYXQtY2F0YWxpbmEvY2F0YWxpbmEvc3JjL3NoYXJlIFwKKyAgICAgICAgLURjYXRhbGluYS5iYXNlPSIkQ0FUQUxJTkFfQkFTRSIgXAorICAgICAgICAtRGNhdGFsaW5hLmhvbWU9IiRDQVRBTElOQV9IT01FIiBcCisgICAgICAgIC1EamF2YS5pby50bXBkaXI9IiRDQVRBTElOQV9UTVBESVIiIFwKKyAgICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkJvb3RzdHJhcCAiJEAiIHN0YXJ0CisgICAgZmkKKyAgZmkKKworZWxpZiBbICIkMSIgPSAicnVuIiBdOyB0aGVuCisKKyAgc2hpZnQKKyAgaWYgWyAiJDEiID0gIi1zZWN1cml0eSIgXSA7IHRoZW4KKyAgICBlY2hvICJVc2luZyBTZWN1cml0eSBNYW5hZ2VyIgorICAgIHNoaWZ0CisgICAgZXhlYyAiJF9SVU5KQVZBIiAkSkFWQV9PUFRTICRDQVRBTElOQV9PUFRTIFwKKyAgICAgIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIkSkFWQV9FTkRPUlNFRF9ESVJTIiAtY2xhc3NwYXRoICIkQ0xBU1NQQVRIIiBcCisgICAgICAtRGphdmEuc2VjdXJpdHkubWFuYWdlciBcCisgICAgICAtRGphdmEuc2VjdXJpdHkucG9saWN5PT0iJENBVEFMSU5BX0JBU0UiL2NvbmYvY2F0YWxpbmEucG9saWN5IFwKKyAgICAgIC1EY2F0YWxpbmEuYmFzZT0iJENBVEFMSU5BX0JBU0UiIFwKKyAgICAgIC1EY2F0YWxpbmEuaG9tZT0iJENBVEFMSU5BX0hPTUUiIFwKKyAgICAgIC1EamF2YS5pby50bXBkaXI9IiRDQVRBTElOQV9UTVBESVIiIFwKKyAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAgIiRAIiBzdGFydAorICBlbHNlCisgICAgZXhlYyAiJF9SVU5KQVZBIiAkSkFWQV9PUFRTICRDQVRBTElOQV9PUFRTIFwKKyAgICAgIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIkSkFWQV9FTkRPUlNFRF9ESVJTIiAtY2xhc3NwYXRoICIkQ0xBU1NQQVRIIiBcCisgICAgICAtRGNhdGFsaW5hLmJhc2U9IiRDQVRBTElOQV9CQVNFIiBcCisgICAgICAtRGNhdGFsaW5hLmhvbWU9IiRDQVRBTElOQV9IT01FIiBcCisgICAgICAtRGphdmEuaW8udG1wZGlyPSIkQ0FUQUxJTkFfVE1QRElSIiBcCisgICAgICBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwICIkQCIgc3RhcnQKKyAgZmkKKworZWxpZiBbICIkMSIgPSAic3RhcnQiIF0gOyB0aGVuCisKKyAgc2hpZnQKKyAgdG91Y2ggIiRDQVRBTElOQV9CQVNFIi9sb2dzL2NhdGFsaW5hLm91dAorICBpZiBbICIkMSIgPSAiLXNlY3VyaXR5IiBdIDsgdGhlbgorICAgIGVjaG8gIlVzaW5nIFNlY3VyaXR5IE1hbmFnZXIiCisgICAgc2hpZnQKKyAgICAiJF9SVU5KQVZBIiAkSkFWQV9PUFRTICRDQVRBTElOQV9PUFRTIFwKKyAgICAgIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIkSkFWQV9FTkRPUlNFRF9ESVJTIiAtY2xhc3NwYXRoICIkQ0xBU1NQQVRIIiBcCisgICAgICAtRGphdmEuc2VjdXJpdHkubWFuYWdlciBcCisgICAgICAtRGphdmEuc2VjdXJpdHkucG9saWN5PT0iJENBVEFMSU5BX0JBU0UiL2NvbmYvY2F0YWxpbmEucG9saWN5IFwKKyAgICAgIC1EY2F0YWxpbmEuYmFzZT0iJENBVEFMSU5BX0JBU0UiIFwKKyAgICAgIC1EY2F0YWxpbmEuaG9tZT0iJENBVEFMSU5BX0hPTUUiIFwKKyAgICAgIC1EamF2YS5pby50bXBkaXI9IiRDQVRBTElOQV9UTVBESVIiIFwKKyAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAgIiRAIiBzdGFydCBcCisgICAgICA+PiAiJENBVEFMSU5BX0JBU0UiL2xvZ3MvY2F0YWxpbmEub3V0IDI+JjEgJgorCisgICAgICBpZiBbICEgLXogIiRDQVRBTElOQV9QSUQiIF07IHRoZW4KKyAgICAgICAgZWNobyAkISA+ICRDQVRBTElOQV9QSUQKKyAgICAgIGZpCisgIGVsc2UKKyAgICAiJF9SVU5KQVZBIiAkSkFWQV9PUFRTICRDQVRBTElOQV9PUFRTIFwKKyAgICAgIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIkSkFWQV9FTkRPUlNFRF9ESVJTIiAtY2xhc3NwYXRoICIkQ0xBU1NQQVRIIiBcCisgICAgICAtRGNhdGFsaW5hLmJhc2U9IiRDQVRBTElOQV9CQVNFIiBcCisgICAgICAtRGNhdGFsaW5hLmhvbWU9IiRDQVRBTElOQV9IT01FIiBcCisgICAgICAtRGphdmEuaW8udG1wZGlyPSIkQ0FUQUxJTkFfVE1QRElSIiBcCisgICAgICBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwICIkQCIgc3RhcnQgXAorICAgICAgPj4gIiRDQVRBTElOQV9CQVNFIi9sb2dzL2NhdGFsaW5hLm91dCAyPiYxICYKKworICAgICAgaWYgWyAhIC16ICIkQ0FUQUxJTkFfUElEIiBdOyB0aGVuCisgICAgICAgIGVjaG8gJCEgPiAkQ0FUQUxJTkFfUElECisgICAgICBmaQorICBmaQorCitlbGlmIFsgIiQxIiA9ICJzdG9wIiBdIDsgdGhlbgorCisgIHNoaWZ0CisgIEZPUkNFPTAKKyAgaWYgWyAiJDEiID0gIi1mb3JjZSIgXTsgdGhlbgorICAgIHNoaWZ0CisgICAgRk9SQ0U9MQorICBmaQorCisgICIkX1JVTkpBVkEiICRKQVZBX09QVFMgXAorICAgIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIkSkFWQV9FTkRPUlNFRF9ESVJTIiAtY2xhc3NwYXRoICIkQ0xBU1NQQVRIIiBcCisgICAgLURjYXRhbGluYS5iYXNlPSIkQ0FUQUxJTkFfQkFTRSIgXAorICAgIC1EY2F0YWxpbmEuaG9tZT0iJENBVEFMSU5BX0hPTUUiIFwKKyAgICAtRGphdmEuaW8udG1wZGlyPSIkQ0FUQUxJTkFfVE1QRElSIiBcCisgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkJvb3RzdHJhcCAiJEAiIHN0b3AKKworICBpZiBbICRGT1JDRSAtZXEgMSBdOyB0aGVuCisgICAgaWYgWyAhIC16ICIkQ0FUQUxJTkFfUElEIiBdOyB0aGVuCisgICAgICAgZWNobyAiS2lsbGluZzogYGNhdCAkQ0FUQUxJTkFfUElEYCIKKyAgICAgICBraWxsIC05IGBjYXQgJENBVEFMSU5BX1BJRGAKKyAgICBlbHNlCisgICAgICAgZWNobyAiS2lsbCBmYWlsZWQ6IFwkQ0FUQUxJTkFfUElEIG5vdCBzZXQiCisgICAgZmkKKyAgZmkKKworZWxpZiBbICIkMSIgPSAidmVyc2lvbiIgXSA7IHRoZW4KKworICAgICIkX1JVTkpBVkEiICAgXAorICAgICAgLWNsYXNzcGF0aCAiJENBVEFMSU5BX0hPTUUvc2VydmVyL2xpYi9jYXRhbGluYS5qYXIiIFwKKyAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TZXJ2ZXJJbmZvCisKK2Vsc2UKKworICBlY2hvICJVc2FnZTogY2F0YWxpbmEuc2ggKCBjb21tYW5kcyAuLi4gKSIKKyAgZWNobyAiY29tbWFuZHM6IgorICBpZiAkb3M0MDA7IHRoZW4KKyAgICBlY2hvICIgIGRlYnVnICAgICAgICAgICAgIFN0YXJ0IENhdGFsaW5hIGluIGEgZGVidWdnZXIgKG5vdCBhdmFpbGFibGUgb24gT1M0MDApIgorICAgIGVjaG8gIiAgZGVidWcgLXNlY3VyaXR5ICAgRGVidWcgQ2F0YWxpbmEgd2l0aCBhIHNlY3VyaXR5IG1hbmFnZXIgKG5vdCBhdmFpbGFibGUgb24gT1M0MDApIgorICBlbHNlCisgICAgZWNobyAiICBkZWJ1ZyAgICAgICAgICAgICBTdGFydCBDYXRhbGluYSBpbiBhIGRlYnVnZ2VyIgorICAgIGVjaG8gIiAgZGVidWcgLXNlY3VyaXR5ICAgRGVidWcgQ2F0YWxpbmEgd2l0aCBhIHNlY3VyaXR5IG1hbmFnZXIiCisgIGZpCisgIGVjaG8gIiAganBkYSBzdGFydCAgICAgICAgU3RhcnQgQ2F0YWxpbmEgdW5kZXIgSlBEQSBkZWJ1Z2dlciIKKyAgZWNobyAiICBydW4gICAgICAgICAgICAgICBTdGFydCBDYXRhbGluYSBpbiB0aGUgY3VycmVudCB3aW5kb3ciCisgIGVjaG8gIiAgcnVuIC1zZWN1cml0eSAgICAgU3RhcnQgaW4gdGhlIGN1cnJlbnQgd2luZG93IHdpdGggc2VjdXJpdHkgbWFuYWdlciIKKyAgZWNobyAiICBzdGFydCAgICAgICAgICAgICBTdGFydCBDYXRhbGluYSBpbiBhIHNlcGFyYXRlIHdpbmRvdyIKKyAgZWNobyAiICBzdGFydCAtc2VjdXJpdHkgICBTdGFydCBpbiBhIHNlcGFyYXRlIHdpbmRvdyB3aXRoIHNlY3VyaXR5IG1hbmFnZXIiCisgIGVjaG8gIiAgc3RvcCAgICAgICAgICAgICAgU3RvcCBDYXRhbGluYSIKKyAgZWNobyAiICBzdG9wIC1mb3JjZSAgICAgICBTdG9wIENhdGFsaW5hIChmb2xsb3dlZCBieSBraWxsIC1LSUxMKSIKKyAgZWNobyAiICB2ZXJzaW9uICAgICAgICAgICBXaGF0IHZlcnNpb24gb2YgdG9tY2F0IGFyZSB5b3UgcnVubmluZz8iCisgIGV4aXQgMQorCitmaQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vY2F0YWxpbmEueG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vY2F0YWxpbmEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNzhkNjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9jYXRhbGluYS54bWwKQEAgLTAsMCArMSwyMzQgQEAKKzwhLS0KKyAgWE1MIGZpbGUgZm9yIGxhdW5jaGluZyBDYXRhbGluYSBhcHBsaWNhdGlvbnMgdXNpbmcgYW50LgorLS0+CisKKzxwcm9qZWN0IG5hbWU9IkNhdGFsaW5hIExhdW5jaGVyIiBkZWZhdWx0PSJjYXRhbGluYSIgYmFzZWRpcj0iLiI+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3VzZXIuaG9tZX0vLnRvbWNhdDUucHJvcGVydGllcyIvPgorCisgIDwhLS0gU2V0IHRoZSBhcHBsaWNhdGlvbiBob21lIHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoaXMgZGlyZWN0b3J5IC0tPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuaG9tZSIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4iLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJvb3RzdHJhcC5qYXIiIGxvY2F0aW9uPSIke2NhdGFsaW5hLmhvbWV9L2Jpbi9ib290c3RyYXAuamFyIi8+CisKKyAgPCEtLSBJbXBvcnQgdGhlIHVzZXIncyBjdXN0b20gcHJvcGVydGllcyAtLT4KKyAgPHByb3BlcnR5IGZpbGU9IiR7Y2F0YWxpbmEuaG9tZX0vYmluL2NhdGFsaW5hLnByb3BlcnRpZXMiLz4gPCEtLSBYWFggc2hvbGQgaXQgYmUgY29uZiA/PyAtLT4KKyAgPHByb3BlcnR5IGZpbGU9IiR7Y2F0YWxpbmEuaG9tZX0vY29uZi9jYXRhbGluYS5wcm9wZXJ0aWVzIi8+IDwhLS0gWFhYIHNob2xkIGl0IGJlIGNvbmYgPz8gLS0+CisKKworICA8IS0tIFNldCB1c2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0ianNzZS5ob21lIiBsb2NhdGlvbj0iJHtjYXRhbGluYS5ob21lfSIvPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuYmFzZSIgbG9jYXRpb249IiR7Y2F0YWxpbmEuaG9tZX0iLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNhdGFsaW5hLnRtcGRpciIgbG9jYXRpb249IiR7Y2F0YWxpbmEuYmFzZX0vdGVtcCIvPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEub3V0IiBsb2NhdGlvbj0iJHtjYXRhbGluYS5iYXNlfS9sb2dzL2NhdGFsaW5hLm91dCIvPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEucG9saWN5IiBsb2NhdGlvbj0iJHtjYXRhbGluYS5iYXNlfS9jb25mL2NhdGFsaW5hLnBvbGljeSIvPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuanZtLmFyZ3MiIHZhbHVlPSItRHN1bi5pby51c2VDYW5vbkNhY2hlcz1mYWxzZSIvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5zb3VyY2UucGF0aCIgdmFsdWU9IiR7Y2F0YWxpbmEuaG9tZX0vLi4vLi4vamFrYXJ0YS1zZXJ2bGV0YXBpLTUvc3JjL3NoYXJlOiR7Y2F0YWxpbmEuaG9tZX0vLi4vLi4vamFrYXJ0YS10b21jYXQtamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlOiR7Y2F0YWxpbmEuaG9tZX0vLi4vLi4vamFrYXJ0YS10b21jYXQtY29ubmVjdG9ycy9jb3lvdGUvc3JjL2phdmE6JHtjYXRhbGluYS5ob21lfS8uLi8uLi9qYWthcnRhLXRvbWNhdC1jYXRhbGluYS9jYXRhbGluYS9zcmMvc2hhcmUiLz4KKworCisgIDwhLS0gQnVpbGQgdGhlIGNsYXNzcGF0aCByZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24gaG9tZSAtLT4KKyAgPHBhdGggaWQ9ImJhc2UuY2xhc3MucGF0aCI+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Jvb3RzdHJhcC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7anNzZS5ob21lfS9saWIvanNzZS5qYXI6JHtqc3NlLmhvbWV9L2xpYi9qY2VydC5qYXI6JHtqc3NlLmhvbWV9L2xpYi9qbmV0LmphciIvPgorICA8L3BhdGg+CisKKyAgPHByb3BlcnR5IG5hbWU9ImJhc2VkaXIiIGxvY2F0aW9uPSIuIi8+CisgIAorICA8cHJvcGVydHkgbmFtZT0idG9vbHMuamFyIiBsb2NhdGlvbj0iJHtqYXZhLmhvbWV9Ly4uL2xpYi90b29scy5qYXIiIC8+CisKKyAgPHBhdGggaWQ9InRvbWNhdGNwIiA+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NhdGFsaW5hLmhvbWV9L2Jpbi9ib290c3RyYXAuamFyIi8+CisgICAgPCEtLSAKKyAgICA8ZmlsZXNldCBkaXI9IiR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2xpYiIgaW5jbHVkZXM9IiouamFyIi8+CisgICAgPGZpbGVzZXQgZGlyPSIke2NhdGFsaW5hLmhvbWV9L3NlcnZlci9saWIiIGluY2x1ZGVzPSIqLmphciIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjYXRhbGluYS5ob21lfS9jb21tb24vY2xhc3NlcyIvPgorICAgIC0tPgorICAgIDwhLS0gCisgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2FudC5ob21lfS9saWIveGVyY2VzSW1wbC5qYXIiIC8+CisgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2FudC5ob21lfS9saWIveG1sLWFwaXMuamFyIiAvPgorICAgIC0tPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthbnQuaG9tZX0vbGliL2FudC5qYXIiIC8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rvb2xzLmphcn0iIC8+CisgIDwvcGF0aD4KKyAKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6YXRpb24vaGVscGVycyA9PT09PT09PT09PT09PT09PT0gLS0+CisKKworICA8dGFyZ2V0IG5hbWU9ImluaXQiCisgICAgICAgICAgZGVzY3JpcHRpb249IkRpc3BsYXkgY29uZmlndXJhdGlvbiBhbmQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gZmxhZ3MiPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImluaXQtbGF1bmNoZXIiID4KKyAgICA8IS0tIEJ1aWxkIHRoZSBzeXNwcm9wZXJ0aWVzIHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbiBob21lIC0tPgorICAgIDxzeXNwcm9wZXJ0eXNldCBpZD0iYmFzZS5zeXMucHJvcGVydGllcyI+CisgICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZhLmVuZG9yc2VkLmRpcnMiIGZpbGU9IiR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2VuZG9yc2VkIi8+CisgICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZhLmlvLnRtcGRpciIgZmlsZT0iJHtjYXRhbGluYS50bXBkaXJ9Ii8+CisgICAgICA8c3lzcHJvcGVydHkga2V5PSJjYXRhbGluYS5ob21lIiBmaWxlPSIke2NhdGFsaW5hLmhvbWV9Ii8+CisgICAgICA8c3lzcHJvcGVydHkga2V5PSJjYXRhbGluYS5iYXNlIiBmaWxlPSIke2NhdGFsaW5hLmJhc2V9Ii8+CisgICAgPC9zeXNwcm9wZXJ0eXNldD4KKworICAgIDwhLS0gQnVpbGQgdGhlIHN0YW5kYXJkIGp2bWFyZ3MgLS0+CisgICAgPGp2bWFyZ3NldCBpZD0iYmFzZS5qdm0uYXJncyI+CisgICAgICA8anZtYXJnIGxpbmU9IiR7Y2F0YWxpbmEuanZtLmFyZ3N9Ii8+CisgICAgICA8anZtYXJnIHZhbHVlPSItWGRlYnVnIiBpZj0ianBkYS5zZXR0aW5ncyIvPgorICAgICAgPGp2bWFyZyB2YWx1ZT0iLVhydW5qZHdwOiR7anBkYS5zZXR0aW5nc30iIGlmPSJqcGRhLnNldHRpbmdzIi8+CisgICAgICA8anZtYXJnIHZhbHVlPSItc291cmNlcGF0aCIgaWY9ImpkYiIvPgorICAgICAgPGp2bWFyZyBwYXRoPSIke2NhdGFsaW5hLnNvdXJjZS5wYXRofSIgaWY9ImpkYiIvPgorICAgIDwvanZtYXJnc2V0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImVjaG8tY29uZmlnIiA+CisgICAgPGVjaG8+VE9NQ0FUX0hPTUU9JHtjYXRhbGluYS5ob21lfTwvZWNobz4KKyAgICA8ZWNobz5DTEFTU1BBVEg9JHt0b1N0cmluZzp0b21jYXRjcH08L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaGVscCIgPgorICAgIDxlY2hvPgorICBUbyBydW4gYW55IG9mIHRoZSBhcHBsaWNhdGlvbnMgaW4gdGhlIEpEQiBkZWJ1Z2dlciwgZXhlY3V0ZSB0aGUgTGF1bmNoZXIgd2l0aAorICBhICItRGRlYnVnPXRydWUiIGFyZ3VtZW50LgorCisgIFRvIHJ1biBhbnkgb2YgdGhlIGFwcGxpY2F0aW9ucyBpbiBKUERBIG1vZGUsIGV4ZWN1dGUgdGhlIExhdW5jaGVyIHdpdGggYQorICAiLURqcGRhPXRydWUiIGFyZ3VtZW50LgorICAgPC9lY2hvPgorICA8L3RhcmdldD4KKworICA8IS0tIFRhcmdldCB0aGF0IHNldHMgSkRCIHByb3BlcnRpZXMgd2hlbiB0aGUgImRlYnVnIiBwcm9wZXJ0eSBpcyBzZXQgLS0+CisgIDx0YXJnZXQgbmFtZT0ic2V0amRiIiBkZXNjcmlwdGlvbj0iU2V0IEpEQiBwcm9wZXJ0aWVzIiBpZj0iZGVidWciPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqZGIiIHZhbHVlPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gVGFyZ2V0IHRoYXQgc2V0cyBKUERBIHByb3BlcnRpZXMgd2hlbiB0aGUgImpwZGEiIHByb3BlcnR5IGlzIHNldCAtLT4KKyAgPHRhcmdldCBuYW1lPSJzZXRqcGRhIiBkZXNjcmlwdGlvbj0iU2V0IEpQREEgcHJvcGVydGllcyIgaWY9ImpwZGEiPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImpwZGEudHJhbnNwb3J0IiB2YWx1ZT0iZHRfc2htZW0iPgorICAgICAgPG9zIGZhbWlseT0id2luZG93cyIvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImpwZGEudHJhbnNwb3J0IiB2YWx1ZT0iZHRfc29ja2V0Ij4KKyAgICAgIDxub3Q+CisgICAgICAgIDxvcyBmYW1pbHk9IndpbmRvd3MiLz4KKyAgICAgIDwvbm90PgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImpwZGEuYWRkcmVzcyIgdmFsdWU9ImpkYmNvbm4iPgorICAgICAgPGVxdWFscyBhcmcxPSIke2pwZGEudHJhbnNwb3J0fSIgYXJnMj0iZHRfc2htZW0iLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqcGRhLmFkZHJlc3MiIHZhbHVlPSI4MDAwIj4KKyAgICAgIDxub3Q+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtqcGRhLnRyYW5zcG9ydH0iIGFyZzI9ImR0X3NobWVtIi8+CisgICAgICA8L25vdD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8cHJvcGVydHkgbmFtZT0ianBkYS5zdXNwZW5kIiB2YWx1ZT0ieSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqcGRhLnNldHRpbmdzIiB2YWx1ZT0idHJhbnNwb3J0PSR7anBkYS50cmFuc3BvcnR9LGFkZHJlc3M9JHtqcGRhLmFkZHJlc3N9LHNlcnZlcj15LHN1c3BlbmQ9JHtqcGRhLnN1c3BlbmR9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBMYXVuY2hlci1iYXNlZCA9PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPCEtLSBUYXJnZXQgdGhhdCBleGVjdXRlcyBDYXRhbGluYSAtLT4KKyAgPHRhcmdldCBuYW1lPSJjYXRhbGluYSIgZGVzY3JpcHRpb249IkV4ZWN1dGUgQ2F0YWxpbmEiCisgICAgZGVwZW5kcz0iaW5pdC1sYXVuY2hlcixzZXRqZGIsc2V0anBkYSIgPgorCisgICAgPCEtLSBTZXQgZGVmYXVsdCB0aXRsZSBmb3IgbWluaW1pemVkIHdpbmRvdyAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEud2luZG93LnRpdGxlIiB2YWx1ZT0iQ2F0YWxpbmEiLz4KKworICAgIDwhLS0KKyAgICAgIExhdW5jaCBDYXRhbGluYS4gTm90ZSB0aGF0IHRoZSAiZmlsdGVyY2xhc3NuYW1lIiBhdHRyaWJ1dGUgd2lsbCBmb3JjZQorICAgICAgdGhlICJ3YWl0Zm9yY2hpbGQiIGF0dHJpYnV0ZSB0byAidHJ1ZSIgaWYgYW55IGludmFsaWQgYXJndW1lbnRzIGFyZQorICAgICAgdXNlZCBvciBpZiAic3RhcnQiIGlzIG5vdCB0aGUgbGFzdCBhcmd1bWVudC4KKyAgICAtLT4KKyAgICA8bGF1bmNoIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkJvb3RzdHJhcCIKKyAgICAgIHdhaXRmb3JjaGlsZD0iJHt3YWl0fSIKKyAgICAgIGRlYnVnPSIke2pkYn0iCisgICAgICBwcmludD0iJHtwcmludH0iCisgICAgICBmaWx0ZXJjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubGF1bmNoZXIuQ2F0YWxpbmFMYXVuY2hGaWx0ZXIiCisgICAgICBmaWx0ZXJjbGFzc3BhdGg9IiR7Ym9vdHN0cmFwLmphcn0iCisgICAgICB1c2VzeXN0ZW1pbj0iZmFsc2UiCisgICAgICByZXF1aXJldG9vbHM9InRydWUiCisgICAgICByZWRpcmVjdG91dHB1dD0idHJ1ZSIKKyAgICAgIG91dHB1dD0iJHtjYXRhbGluYS5vdXR9IgorICAgICAgZGlzcGxheU1pbmltaXplZFdpbmRvdz0idHJ1ZSIKKyAgICAgIG1pbmltaXplZFdpbmRvd1RpdGxlPSIke2NhdGFsaW5hLndpbmRvdy50aXRsZX0iPgorICAgICAgICA8anZtYXJnc2V0IHJlZmlkPSJiYXNlLmp2bS5hcmdzIi8+CisgICAgICAgIDxzeXNwcm9wZXJ0eXNldCByZWZpZD0iYmFzZS5zeXMucHJvcGVydGllcyIvPgorICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZhLnNlY3VyaXR5Lm1hbmFnZXIiIHZhbHVlPSIiIGlmPSJzZWN1cml0eSIvPgorICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZhLnNlY3VyaXR5LnBvbGljeSIgdmFsdWU9Ij0ke2NhdGFsaW5hLnBvbGljeX0iIGlmPSJzZWN1cml0eSIvPgorICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJiYXNlLmNsYXNzLnBhdGgiLz4KKyAgICA8L2xhdW5jaD4KKworICA8L3RhcmdldD4KKworICA8IS0tIFRhcmdldCB0aGF0IGV4ZWN1dGVzIHRoZSBDYXRhbGluYSB0b29sIHdyYXBwZXIgLS0+CisgIDx0YXJnZXQgbmFtZT0idG9vbC13cmFwcGVyIiBkZXNjcmlwdGlvbj0iRXhlY3V0ZSBDYXRhbGluYSB0b29sIHdyYXBwZXIiCisgICAgZGVwZW5kcz0ic2V0amRiLHNldGpwZGEiID4KKworICAgIDwhLS0gTGF1bmNoIENhdGFsaW5hIHRvb2wgd3JhcHBlciAtLT4KKyAgICA8bGF1bmNoIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLlRvb2wiCisgICAgICBkZWJ1Zz0iJHtqZGJ9IgorICAgICAgcHJpbnQ9IiR7cHJpbnR9IgorICAgICAgdXNlc3lzdGVtaW49ImZhbHNlIgorICAgICAgcmVxdWlyZXRvb2xzPSJ0cnVlIj4KKyAgICAgICAgPGp2bWFyZ3NldCByZWZpZD0iYmFzZS5qdm0uYXJncyIvPgorICAgICAgICA8c3lzcHJvcGVydHlzZXQgcmVmaWQ9ImJhc2Uuc3lzLnByb3BlcnRpZXMiLz4KKyAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYmFzZS5jbGFzcy5wYXRoIi8+CisgICAgPC9sYXVuY2g+CisKKyAgPC90YXJnZXQ+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBBbnQvSk1YIGJhc2VkID09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHRhcmdldCBuYW1lPSJ0YXNrZGVmIiA+CisgICAgPHByb3BlcnR5IG5hbWU9InRvbWNhdC5ob21lIiBsb2NhdGlvbj0iLi4iIC8+CisKKyAgICA8cGF0aCBpZD0iam14LnRlc3QuY2xhc3NwYXRoIj4KKyAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLW1vZGVsZXIuamFyfSIgLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0b21jYXQuaG9tZX0vY29tbW9uL2xpYiIgaW5jbHVkZXM9IiouamFyIi8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dG9tY2F0LmhvbWV9L3NlcnZlci9saWIiIGluY2x1ZGVzPSIqLmphciIvPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3RvbWNhdC5ob21lfS9iaW4iIGluY2x1ZGVzPSIqLmphciIvPgorICAgIDwvcGF0aD4KKworICAgIDwhLS0gcGFydCBvZiBtb2RlbGVyIC0tPgorICAgIDx0YXNrZGVmIHJlc291cmNlPSJNRVRBLUlORi9hbnQucHJvcGVydGllcyIKKyAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImpteC50ZXN0LmNsYXNzcGF0aCIgLz4KKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iZWNoby1jb25maWcsdGFza2RlZiIKKyAgICAgICAgZGVzY3JpcHRpb249IlN0YXJ0IHRvbWNhdCBhcyBhIHRhc2sgYW5kIHJldHVybiI+CisgICAKKyAgICA8TUxFVCBjb2RlPSJvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5CYXNlTW9kZWxNQmVhbiIKKyAgICAgICAgICBuYW1lPSJjYXRhbGluYTp0eXBlPXNlcnZlciIgPgorICAgICAgIDxhcmcgdmFsdWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5DYXRhbGluYSIgLz4KKyAgICA8L01MRVQ+CisKKyAgICA8am14U2V0IG5hbWU9ImNhdGFsaW5hOnR5cGU9c2VydmVyIgorICAgICAgICAgICAgYXR0cmlidXRlPSJjYXRhbGluYUhvbWUiCisgICAgICAgICAgICB2YWx1ZT0iJHt0b21jYXQuaG9tZX0iLz4KKyAgCisgICAgPCEtLSBXZSBjb3VsZCBhbHNvIGNhbGwgaW5pdCBhbmQgc2V0IG90aGVyIHByb3BlcnRpZXMgLSAKKyAgICAgICAgIGluaXQgc2hvdWxkIGxvYWQgdGhlIG1vZHVsZXMgLS0+CisKKyAgICA8am14IG5hbWU9ImNhdGFsaW5hOnR5cGU9c2VydmVyIgorICAgICAgICAgbWV0aG9kPSJzdGFydCIgLz4KKyAgICAKKyAgICA8ZWNobyBtZXNzYWdlPSJUb21jYXQ1IHJ1bm5pbmciLz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRXhlYy9qYXZhICA9PT09PT09PT09PT09PT09IC0tPgorCisgIDx0YXJnZXQgbmFtZT0iamF2YS1zdGFydCIgZGVwZW5kcz0iZWNoby1jb25maWciIAorICAgICAgICBkZXNjcmlwdGlvbj0iUnVuIHRvbWNhdCBpbi1wcm9jZXNzIGFuZCB3YWl0IGZvciBpdCB0byBlbmQsIHVzaW5nIGphdmEgdGFzayIgPgorCisgICAgPHByb3BlcnR5IG5hbWU9InRvbWNhdC5mb3JrIiB2YWx1ZT0iZmFsc2UiIC8+CisKKyAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAiIGZvcms9IiR7dG9tY2F0LmZvcmt9Ij4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRvbWNhdGNwIiAvPgorICAgICAgPGFyZyB2YWx1ZT0ic3RhcnRkIiAvPgorICAgICAgPHN5c3Byb3BlcnR5IGtleT0iY2F0YWxpbmEuaG9tZSIgdmFsdWU9IiR7Y2F0YWxpbmEuaG9tZX0iLz4KKyAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0iamlrZXMiLz4KKyAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmEuZW5kb3JzZWQuZGlycyIgdmFsdWU9IiR7YW50LmhvbWV9L2xpYjoke2phdmEuaG9tZX0vbGliIi8+CisgICAgPC9qYXZhPgorCisgICAgPGVjaG8gbWVzc2FnZT0iVG9tY2F0NSBydW5uaW5nIi8+CisKKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL2NwYXBwZW5kLmJhdCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL2NwYXBwZW5kLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDU1ZTZmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vY3BhcHBlbmQuYmF0CkBAIC0wLDAgKzEsMTkgQEAKK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JlbSBBcHBlbmQgdG8gQ0xBU1NQQVRICityZW0KK3JlbSAkSWQkCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JlbSBQcm9jZXNzIHRoZSBmaXJzdCBhcmd1bWVudAoraWYgIiIlMSIiID09ICIiIiIgZ290byBlbmQKK3NldCBDTEFTU1BBVEg9JUNMQVNTUEFUSCU7JTEKK3NoaWZ0CisKK3JlbSBQcm9jZXNzIHRoZSByZW1haW5pbmcgYXJndW1lbnRzCis6c2V0QXJncworaWYgIiIlMSIiID09ICIiIiIgZ290byBkb25lU2V0QXJncworc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJSAlMQorc2hpZnQKK2dvdG8gc2V0QXJncworOmRvbmVTZXRBcmdzCis6ZW5kCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9kaWdlc3QuYmF0IGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vZGlnZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDVmNzExCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vZGlnZXN0LmJhdApAQCAtMCwwICsxLDQxIEBACitAZWNobyBvZmYKK2lmICIlT1MlIiA9PSAiV2luZG93c19OVCIgc2V0bG9jYWwKK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JlbSBTY3JpcHQgdG8gZGlnZXN0IHBhc3N3b3JkIHVzaW5nIHRoZSBhbGdvcml0aG0gc3BlY2lmaWVkCityZW0KK3JlbSAkSWQkCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JlbSBHdWVzcyBDQVRBTElOQV9IT01FIGlmIG5vdCBkZWZpbmVkCitpZiBub3QgIiVDQVRBTElOQV9IT01FJSIgPT0gIiIgZ290byBnb3RIb21lCitzZXQgQ0FUQUxJTkFfSE9NRT0uCitpZiBleGlzdCAiJUNBVEFMSU5BX0hPTUUlXGJpblx0b29sLXdyYXBwZXIuYmF0IiBnb3RvIG9rSG9tZQorc2V0IENBVEFMSU5BX0hPTUU9Li4KKzpnb3RIb21lCitpZiBleGlzdCAiJUNBVEFMSU5BX0hPTUUlXGJpblx0b29sLXdyYXBwZXIuYmF0IiBnb3RvIG9rSG9tZQorZWNobyBUaGUgQ0FUQUxJTkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkKK2VjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBlbmQKKzpva0hvbWUKKworc2V0IEVYRUNVVEFCTEU9JUNBVEFMSU5BX0hPTUUlXGJpblx0b29sLXdyYXBwZXIuYmF0CisKK3JlbSBDaGVjayB0aGF0IHRhcmdldCBleGVjdXRhYmxlIGV4aXN0cworaWYgZXhpc3QgIiVFWEVDVVRBQkxFJSIgZ290byBva0V4ZWMKK2VjaG8gQ2Fubm90IGZpbmQgJUVYRUNVVEFCTEUlCitlY2hvIFRoaXMgZmlsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBlbmQKKzpva0V4ZWMKKworcmVtIEdldCByZW1haW5pbmcgdW5zaGlmdGVkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIHNhdmUgdGhlbSBpbiB0aGUKK3NldCBDTURfTElORV9BUkdTPQorOnNldEFyZ3MKK2lmICIiJTEiIj09IiIiIiBnb3RvIGRvbmVTZXRBcmdzCitzZXQgQ01EX0xJTkVfQVJHUz0lQ01EX0xJTkVfQVJHUyUgJTEKK3NoaWZ0Citnb3RvIHNldEFyZ3MKKzpkb25lU2V0QXJncworCitjYWxsICIlRVhFQ1VUQUJMRSUiIC1zZXJ2ZXIgb3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5SZWFsbUJhc2UgJUNNRF9MSU5FX0FSR1MlCisKKzplbmQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL2RpZ2VzdC5zaCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL2RpZ2VzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTM1NmMyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vZGlnZXN0LnNoCkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9zaAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTY3JpcHQgdG8gZGlnZXN0IHBhc3N3b3JkIHVzaW5nIHRoZSBhbGdvcml0aG0gc3BlY2lmaWVkCisjCisjICRJZCQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyByZXNvbHZlIGxpbmtzIC0gJDAgbWF5IGJlIGEgc29mdGxpbmsKK1BSRz0iJDAiCisKK3doaWxlIFsgLWggIiRQUkciIF0gOyBkbworICBscz1gbHMgLWxkICIkUFJHImAKKyAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAorICBpZiBleHByICIkbGluayIgOiAnLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIFBSRz0iJGxpbmsiCisgIGVsc2UKKyAgICBQUkc9YGRpcm5hbWUgIiRQUkciYC8iJGxpbmsiCisgIGZpCitkb25lCisgCitQUkdESVI9YGRpcm5hbWUgIiRQUkciYAorRVhFQ1VUQUJMRT10b29sLXdyYXBwZXIuc2gKKworIyBDaGVjayB0aGF0IHRhcmdldCBleGVjdXRhYmxlIGV4aXN0cworaWYgWyAhIC14ICIkUFJHRElSIi8iJEVYRUNVVEFCTEUiIF07IHRoZW4KKyAgZWNobyAiQ2Fubm90IGZpbmQgJFBSR0RJUi8kRVhFQ1VUQUJMRSIKKyAgZWNobyAiVGhpcyBmaWxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtIgorICBleGl0IDEKK2ZpCisKK2V4ZWMgIiRQUkdESVIiLyIkRVhFQ1VUQUJMRSIgLXNlcnZlciBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLlJlYWxtQmFzZSAiJEAiCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9qbXhhY2Nlc3Nvci10YXNrcy54bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9qbXhhY2Nlc3Nvci10YXNrcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhYjg5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL2pteGFjY2Vzc29yLXRhc2tzLnhtbApAQCAtMCwwICsxLDM0IEBACis8IS0tCisgIFhNTCBmaWxlIGZvciBpbXBvcnRpbmcgQ2F0YWxpbmEgam14IGFudCB0YXNrcy4KKyAgPGltcG9ydCBmaWxlPSIke2NhdGFsaW5hLmhvbWV9L2Jpbi9qbXhhY2Nlc3Nvci10YXNrcy54bWwiLz4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJqbXhhY2Nlc3Nvci10YXNrcyIgPgorICA8ZGVzY3JpcHRpb24+Q2F0YWxpbmEgQW50IEpNWCBBY2Nlc3NvciBUYXNrczwvZGVzY3JpcHRpb24+CisgIDwhLS0gc2V0IGNhdGFsaW5hLmhvbWUgaWYgaXQncyBub3QgYWxyZWFkeSBzZXQgLS0+CisgIDxkaXJuYW1lIHByb3BlcnR5PSJjYXRhbGluYS5ob21lLmJpbi5kaXIiIGZpbGU9IiR7YW50LmZpbGUuam14YWNjZXNzb3ItdGFza3N9Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5ob21lIiB2YWx1ZT0iJHtjYXRhbGluYS5ob21lLmJpbi5kaXJ9Ly4uIi8+CisgIDx0YXNrZGVmIHJlc291cmNlPSJvcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvam14YWNjZXNzb3IudGFza3MiPgorICAgIDxjbGFzc3BhdGg+CisgICAgICA8ZmlsZXNldCBmaWxlPSIke2NhdGFsaW5hLmhvbWV9L3NlcnZlci9saWIvY2F0YWxpbmEtYW50LmphciIvPgorICAgICAgPGZpbGVzZXQgZmlsZT0iJHtjYXRhbGluYS5ob21lfS9zZXJ2ZXIvbGliL2NhdGFsaW5hLWFudC1qbXguamFyIi8+CisgICAgPC9jbGFzc3BhdGg+CisgIDwvdGFza2RlZj4KKyAgPHR5cGVkZWYKKyAgICAgICAgbmFtZT0iam14RXF1YWxzIgorICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LmpteC5KTVhBY2Nlc3NvckVxdWFsc0NvbmRpdGlvbiI+CisgICAgPGNsYXNzcGF0aD4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7Y2F0YWxpbmEuaG9tZX0vc2VydmVyL2xpYi9jYXRhbGluYS1hbnQuamFyIi8+CisgICAgICA8ZmlsZXNldCBmaWxlPSIke2NhdGFsaW5hLmhvbWV9L3NlcnZlci9saWIvY2F0YWxpbmEtYW50LWpteC5qYXIiLz4KKyAgICA8L2NsYXNzcGF0aD4KKyAgPC90eXBlZGVmPgorICA8dHlwZWRlZgorICAgICAgICBuYW1lPSJqbXhDb25kaXRpb24iCisgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuam14LkpNWEFjY2Vzc29yQ29uZGl0aW9uIj4KKyAgICA8Y2xhc3NwYXRoPgorICAgICAgPGZpbGVzZXQgZmlsZT0iJHtjYXRhbGluYS5ob21lfS9zZXJ2ZXIvbGliL2NhdGFsaW5hLWFudC5qYXIiLz4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7Y2F0YWxpbmEuaG9tZX0vc2VydmVyL2xpYi9jYXRhbGluYS1hbnQtam14LmphciIvPgorICAgIDwvY2xhc3NwYXRoPgorICA8L3R5cGVkZWY+CisKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9sYXVuY2hlci5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vbGF1bmNoZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTcyMmRhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vbGF1bmNoZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDIzIEBACisjCisjIFByb3BlcnRpZXMgZm9yIHRoZSBMYXVuY2hlckJvb3RzdHJhcCBjbGFzcworIworIyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBjb25maWd1cmFibGUgcHJvcGVydGllczoKKyMgLSBhbnQuY2xhc3MucGF0aCAtIFRoaXMgcHJvcGVydHkgaXMgYSAiOiIgc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIFVSTCBmaWxlCisjICAgZnJhZ21lbnRzIHdoZXJlIHRoZSBBbnQgY2xhc3NlcyBhcmUgbG9jYXRlZC4gVGhlIGxpc3QgbXVzdCBpbmNsdWRlIGEgSkFYUAorIyAgIGNvbXBsaWFudCBYTUwgcGFyc2VyIGlmIHlvdSBhcmUgbm90IHVzaW5nIEphdmEoVE0pIFNFIDEuNCBvciBoaWdoZXIuCisjCisjIEltcG9ydGFudCBub3RlczoKKyMgLSBSZWxhdGl2ZSBVUkwgZmlsZSBmcmFnbWVudHMsIHN1Y2ggYXMgIi4uL2xpYiIsIGFyZSBzdXBwb3J0ZWQgYW5kIHN0cm9uZ2x5CisjICAgZW5jb3VyYWdlZCBhcyBhYnNvbHV0ZSBmaWxlcyBwcmV2ZW50IGNyb3NzIHBsYXRmb3JtIGRpc3RyaWJ1dGlvbi4KKyMgLSBVUkwgZmlsZSBmcmFnbWVudHMgYXJlIHRoZSBwb3J0aW9ucyBvZiBhIFVSTCBhZnRlciB0aGUgImZpbGU6IiBzdHJpbmcuCisjICAgVGhpcyBtZWFucyB0aGF0IHlvdSBtdXN0IHVzZSAiLyIgY2hhcmFjdGVycyBhcyBkaXJlY3Rvcnkgc2VwYXJhdG9ycyBvbgorIyAgIGFsbCBwbGF0Zm9ybXMuIEFsc28sICI6IiBjaGFyYWN0ZXJzIGluIGEgZmlsZSBmcmFnbWVudCwgc3VjaCBhcyBpbiBkcml2ZQorIyAgIHBvcnRpb24gb2YgYWJzb2x1dGUgV2luZG93cyBmaWxlcywgbXVzdCBiZSBVUkwgZW5jb2RlZCBhcyAiJTNBIi4gTGFzdGx5LAorIyAgIGRpcmVjdG9yaWVzIG11c3QgaGF2ZSBhICIvIiBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KKyMgLSBBbGwgcmVsYXRpdmUgVVJMIGZpbGUgZnJhZ21lbnRzIGluIHRoZSBhYm92ZSBwcm9wZXJ0aWVzIHdpbGwgYmUgcmVzb2x2ZWQKKyMgICB1c2luZyB0aGUgVVJMIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCB0aGUgTGF1bmNoZXJCb290c3RyYXAgY2xhc3Mgd2FzCisjICAgbG9hZGVkIGZyb20sIG5vdCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlCisjICAgTGF1bmNoZXJCb290c3RyYXAgY2xhc3MgY2FuIHByb3Blcmx5IHJlc29sdmUgdGhlIGZpbGVzIHdpdGhvdXQgcmVnYXJkIHRvCisjICAgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisjCithbnQuY2xhc3MucGF0aD0uLi9jb21tb24vbGliL2FudC5qYXI6Li4vY29tbW9uL2xpYi9hbnQtbGF1bmNoZXIuamFyOi4uL2NvbW1vbi9lbmRvcnNlZC94ZXJjZXNJbXBsLmphcjouLi9jb21tb24vZW5kb3JzZWQveG1sLWFwaXMuamFyCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zZXJ2aWNlLmJhdCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3NlcnZpY2UuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZWNiY2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zZXJ2aWNlLmJhdApAQCAtMCwwICsxLDExNyBAQAorQGVjaG8gb2ZmCitpZiAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIHNldGxvY2FsCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityZW0gTlQgU2VydmljZSBJbnN0YWxsL1VuaW5zdGFsbCBzY3JpcHQKK3JlbQorcmVtIE9wdGlvbnMKK3JlbSBpbnN0YWxsICAgICAgICAgICAgICAgIEluc3RhbGwgdGhlIHNlcnZpY2UgdXNpbmcgVG9tY2F0NSBhcyBzZXJ2aWNlIG5hbWUuCityZW0gICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlIGlzIGluc3RhbGxlZCB1c2luZyBkZWZhdWx0IHNldHRpbmdzLgorcmVtIHJlbW92ZSAgICAgICAgICAgICAgICAgUmVtb3ZlIHRoZSBzZXJ2aWNlIGZyb20gdGhlIFN5c3RlbS4KK3JlbQorcmVtIG5hbWUgICAgICAgIChvcHRpb25hbCkgSWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBwcmVzZW50IGl0IGlzIGNvbnNpZGVyZWQKK3JlbSAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIG5ldyBzZXJ2aWNlIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCityZW0KK3JlbSAkSWQkCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JlbSBHdWVzcyBDQVRBTElOQV9IT01FIGlmIG5vdCBkZWZpbmVkCitzZXQgQ1VSUkVOVF9ESVI9JWNkJQoraWYgbm90ICIlQ0FUQUxJTkFfSE9NRSUiID09ICIiIGdvdG8gZ290SG9tZQorc2V0IENBVEFMSU5BX0hPTUU9JWNkJQoraWYgZXhpc3QgIiVDQVRBTElOQV9IT01FJVxiaW5cdG9tY2F0NS5leGUiIGdvdG8gb2tIb21lCityZW0gQ0QgdG8gdGhlIHVwcGVyIGRpcgorY2QgLi4KK3NldCBDQVRBTElOQV9IT01FPSVjZCUKKzpnb3RIb21lCitpZiBleGlzdCAiJUNBVEFMSU5BX0hPTUUlXGJpblx0b21jYXQ1LmV4ZSIgZ290byBva0hvbWUKK2VjaG8gVGhlIHRvbWNhdC5leGUgd2FzIG5vdCBmb3VuZC4uLgorZWNobyBUaGUgQ0FUQUxJTkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkuCitlY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KK2dvdG8gZW5kCityZW0gTWFrZSBzdXJlIHByZXJlcXVpc2l0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldAoraWYgbm90ICIlSkFWQV9IT01FJSIgPT0gIiIgZ290byBva0hvbWUKK2VjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZAorZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZCAKKzpva0hvbWUKK2lmIG5vdCAiJUNBVEFMSU5BX0JBU0UlIiA9PSAiIiBnb3RvIGdvdEJhc2UKK3NldCBDQVRBTElOQV9CQVNFPSVDQVRBTElOQV9IT01FJQorOmdvdEJhc2UKKyAKK3NldCBFWEVDVVRBQkxFPSVDQVRBTElOQV9IT01FJVxiaW5cdG9tY2F0NS5leGUKKworcmVtIFNldCBkZWZhdWx0IFNlcnZpY2UgbmFtZQorc2V0IFNFUlZJQ0VfTkFNRT1Ub21jYXQ1CitzZXQgUFJfRElTUExBWU5BTUU9QXBhY2hlIFRvbWNhdAorCitpZiAiJTEiID09ICIiIGdvdG8gZGlzcGxheVVzYWdlCitpZiAiJTIiID09ICIiIGdvdG8gc2V0U2VydmljZU5hbWUKK3NldCBTRVJWSUNFX05BTUU9JTIKK3NldCBQUl9ESVNQTEFZTkFNRT1BcGFjaGUgVG9tY2F0ICUyCis6c2V0U2VydmljZU5hbWUKK2lmICUxID09IGluc3RhbGwgZ290byBkb0luc3RhbGwKK2lmICUxID09IHJlbW92ZSBnb3RvIGRvUmVtb3ZlCitpZiAlMSA9PSB1bmluc3RhbGwgZ290byBkb1JlbW92ZQorZWNobyBVbmtub3duIHBhcmFtZXRlciAiJTEiCis6ZGlzcGxheVVzYWdlCitlY2hvLgorZWNobyBVc2FnZTogc2VydmljZS5iYXQgaW5zdGFsbC9yZW1vdmUgW3NlcnZpY2VfbmFtZV0KK2dvdG8gZW5kCisKKzpkb1JlbW92ZQorcmVtIFJlbW92ZSB0aGUgc2VydmljZQorIiVFWEVDVVRBQkxFJSIgLy9EUy8vJVNFUlZJQ0VfTkFNRSUKK2VjaG8gVGhlIHNlcnZpY2UgJyVTRVJWSUNFX05BTUUlJyBoYXMgYmVlbiByZW1vdmVkCitnb3RvIGVuZAorCis6ZG9JbnN0YWxsCityZW0gSW5zdGFsbCB0aGUgc2VydmljZQorZWNobyBJbnN0YWxsaW5nIHRoZSBzZXJ2aWNlICclU0VSVklDRV9OQU1FJScgLi4uCitlY2hvIFVzaW5nIENBVEFMSU5BX0hPTUU6ICAgICVDQVRBTElOQV9IT01FJQorZWNobyBVc2luZyBDQVRBTElOQV9CQVNFOiAgICAlQ0FUQUxJTkFfQkFTRSUKK2VjaG8gVXNpbmcgSkFWQV9IT01FOiAgICAgICAgJUpBVkFfSE9NRSUKKworcmVtIFVzZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIGFuIGV4YW1wbGUKK3JlbSBFYWNoIGNvbW1hbmQgbGluZSBvcHRpb24gaXMgcHJlZml4ZWQgd2l0aCBQUl8KKworc2V0IFBSX0RFU0NSSVBUSU9OPUFwYWNoZSBUb21jYXQgU2VydmVyIC0gaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnCitzZXQgUFJfSU5TVEFMTD0lRVhFQ1VUQUJMRSUKK3NldCBQUl9MT0dQQVRIPSVDQVRBTElOQV9CQVNFJVxsb2dzCitzZXQgUFJfQ0xBU1NQQVRIPSVDQVRBTElOQV9IT01FJVxiaW5cYm9vdHN0cmFwLmphcgorCityZW0gU2V0IHRoZSBzZXJ2ZXIganZtIGZyb20gSkFWQV9IT01FCitzZXQgUFJfSlZNPSVKQVZBX0hPTUUlXGpyZVxiaW5cc2VydmVyXGp2bS5kbGwKK2lmIGV4aXN0ICIlUFJfSlZNJSIgZ290byBmb3VuZEp2bQorcmVtIFNldCB0aGUgY2xpZW50IGp2bSBmcm9tIEpBVkFfSE9NRQorc2V0IFBSX0pWTT0lSkFWQV9IT01FJVxqcmVcYmluXGNsaWVudFxqdm0uZGxsCitpZiBleGlzdCAiJVBSX0pWTSUiIGdvdG8gZm91bmRKdm0KK3JlbSBDaGVjayBmb3IgSlJvY2tpdCBKVk06IEJ1Z3ppbGxhIDM5Njc0CitzZXQgUFJfSlZNPSVKQVZBX0hPTUUlXGpyZVxiaW5canJvY2tpdFxqdm0uZGxsCitpZiBleGlzdCAiJVBSX0pWTSUiIGdvdG8gZm91bmRKdm0KK3NldCBQUl9KVk09YXV0bworCis6Zm91bmRKdm0KK2VjaG8gVXNpbmcgSlZNOiAgICAgICAgICAgICAgJVBSX0pWTSUKKyIlRVhFQ1VUQUJMRSUiIC8vSVMvLyVTRVJWSUNFX05BTUUlIC0tU3RhcnRDbGFzcyBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwIC0tU3RvcENsYXNzIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAgLS1TdGFydFBhcmFtcyBzdGFydCAtLVN0b3BQYXJhbXMgc3RvcAoraWYgbm90IGVycm9ybGV2ZWwgMSBnb3RvIGluc3RhbGxlZAorZWNobyBGYWlsZWQgaW5zdGFsbGluZyAnJVNFUlZJQ0VfTkFNRSUnIHNlcnZpY2UKK2dvdG8gZW5kCis6aW5zdGFsbGVkCityZW0gQ2xlYXIgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gVGhleSBhcmUgbm90IG5lZWRlZCBhbnkgbW9yZS4KK3NldCBQUl9ESVNQTEFZTkFNRT0KK3NldCBQUl9ERVNDUklQVElPTj0KK3NldCBQUl9JTlNUQUxMPQorc2V0IFBSX0xPR1BBVEg9CitzZXQgUFJfQ0xBU1NQQVRIPQorc2V0IFBSX0pWTT0KK3JlbSBTZXQgZXh0cmEgcGFyYW1ldGVycworIiVFWEVDVVRBQkxFJSIgLy9VUy8vJVNFUlZJQ0VfTkFNRSUgLS1Kdm1PcHRpb25zICItRGNhdGFsaW5hLmJhc2U9JUNBVEFMSU5BX0JBU0UlOy1EY2F0YWxpbmEuaG9tZT0lQ0FUQUxJTkFfSE9NRSU7LURqYXZhLmVuZG9yc2VkLmRpcnM9JUNBVEFMSU5BX0hPTUUlXGNvbW1vblxlbmRvcnNlZCIgLS1TdGFydE1vZGUganZtIC0tU3RvcE1vZGUganZtCityZW0gTW9yZSBleHRyYSBwYXJhbWV0ZXJzCitzZXQgUFJfTE9HUEFUSD0lQ0FUQUxJTkFfQkFTRSVcbG9ncworc2V0IFBSX1NURE9VVFBVVD1hdXRvCitzZXQgUFJfU1RERVJST1I9YXV0bworIiVFWEVDVVRBQkxFJSIgLy9VUy8vJVNFUlZJQ0VfTkFNRSUgKytKdm1PcHRpb25zICItRGphdmEuaW8udG1wZGlyPSVDQVRBTElOQV9CQVNFJVx0ZW1wIiAtLUp2bU1zIDEyOCAtLUp2bU14IDI1NgorZWNobyBUaGUgc2VydmljZSAnJVNFUlZJQ0VfTkFNRSUnIGhhcyBiZWVuIGluc3RhbGxlZC4KKworOmVuZAorY2QgJUNVUlJFTlRfRElSJQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc2V0Y2xhc3NwYXRoLmJhdCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3NldGNsYXNzcGF0aC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxMzRlMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3NldGNsYXNzcGF0aC5iYXQKQEAgLTAsMCArMSw2OSBAQAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcmVtIFNldCBDTEFTU1BBVEggYW5kIEphdmEgb3B0aW9ucworcmVtCityZW0gJElkJAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZW0gTWFrZSBzdXJlIHByZXJlcXVpc2l0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldAoraWYgbm90ICIlSkFWQV9IT01FJSIgPT0gIiIgZ290byBnb3RKZGtIb21lCitpZiBub3QgIiVKUkVfSE9NRSUiID09ICIiIGdvdG8gZ290SnJlSG9tZQorZWNobyBOZWl0aGVyIHRoZSBKQVZBX0hPTUUgbm9yIHRoZSBKUkVfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBkZWZpbmVkCitlY2hvIEF0IGxlYXN0IG9uZSBvZiB0aGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBleGl0CisKKzpnb3RKcmVIb21lCitpZiBub3QgZXhpc3QgIiVKUkVfSE9NRSVcYmluXGphdmEuZXhlIiBnb3RvIG5vSmF2YUhvbWUKK2lmIG5vdCBleGlzdCAiJUpSRV9IT01FJVxiaW5camF2YXcuZXhlIiBnb3RvIG5vSmF2YUhvbWUKK2lmIG5vdCAiIiUxIiIgPT0gIiJkZWJ1ZyIiIGdvdG8gb2tKYXZhSG9tZQorZWNobyBKQVZBX0hPTUUgc2hvdWxkIHBvaW50IHRvIGEgSkRLIGluIG9yZGVyIHRvIHJ1biBpbiBkZWJ1ZyBtb2RlLgorZ290byBleGl0CisKKzpnb3RKZGtIb21lCitpZiBub3QgZXhpc3QgIiVKQVZBX0hPTUUlXGJpblxqYXZhLmV4ZSIgZ290byBub0phdmFIb21lCitpZiBub3QgZXhpc3QgIiVKQVZBX0hPTUUlXGJpblxqYXZhdy5leGUiIGdvdG8gbm9KYXZhSG9tZQoraWYgbm90IGV4aXN0ICIlSkFWQV9IT01FJVxiaW5camRiLmV4ZSIgZ290byBub0phdmFIb21lCitpZiBub3QgZXhpc3QgIiVKQVZBX0hPTUUlXGJpblxqYXZhYy5leGUiIGdvdG8gbm9KYXZhSG9tZQoraWYgbm90ICIlSlJFX0hPTUUlIiA9PSAiIiBnb3RvIG9rSmF2YUhvbWUKK3NldCBKUkVfSE9NRT0lSkFWQV9IT01FJQorZ290byBva0phdmFIb21lCisKKzpub0phdmFIb21lCitlY2hvIFRoZSBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5CitlY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KK2VjaG8gTkI6IEpBVkFfSE9NRSBzaG91bGQgcG9pbnQgdG8gYSBKREsgbm90IGEgSlJFCitnb3RvIGV4aXQKKzpva0phdmFIb21lCisKK2lmIG5vdCAiJUJBU0VESVIlIiA9PSAiIiBnb3RvIGdvdEJhc2VkaXIKK2VjaG8gVGhlIEJBU0VESVIgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQKK2VjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBleGl0Cis6Z290QmFzZWRpcgoraWYgZXhpc3QgIiVCQVNFRElSJVxiaW5cc2V0Y2xhc3NwYXRoLmJhdCIgZ290byBva0Jhc2VkaXIKK2VjaG8gVGhlIEJBU0VESVIgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5CitlY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KK2dvdG8gZXhpdAorOm9rQmFzZWRpcgorCityZW0gU2V0IHRoZSBkZWZhdWx0IC1EamF2YS5lbmRvcnNlZC5kaXJzIGFyZ3VtZW50CitzZXQgSkFWQV9FTkRPUlNFRF9ESVJTPSVCQVNFRElSJVxjb21tb25cZW5kb3JzZWQKKworcmVtIFNldCBzdGFuZGFyZCBDTEFTU1BBVEgKK3JlbSBOb3RlIHRoYXQgdGhlcmUgYXJlIG5vIHF1b3RlcyBhcyB3ZSBkbyBub3Qgd2FudCB0byBpbnRyb2R1Y2UgcmFuZG9tCityZW0gcXVvdGVzIGludG8gdGhlIENMQVNTUEFUSAorc2V0IENMQVNTUEFUSD0lSkFWQV9IT01FJVxsaWJcdG9vbHMuamFyCisKK3JlbSBTZXQgc3RhbmRhcmQgY29tbWFuZCBmb3IgaW52b2tpbmcgSmF2YS4KK3JlbSBOb3RlIHRoYXQgTlQgcmVxdWlyZXMgYSB3aW5kb3cgbmFtZSBhcmd1bWVudCB3aGVuIHVzaW5nIHN0YXJ0LgorcmVtIEFsc28gbm90ZSB0aGUgcXVvdGluZyBhcyBKQVZBX0hPTUUgbWF5IGNvbnRhaW4gc3BhY2VzLgorc2V0IF9SVU5KQVZBPSIlSlJFX0hPTUUlXGJpblxqYXZhIgorc2V0IF9SVU5KQVZBVz0iJUpSRV9IT01FJVxiaW5camF2YXciCitzZXQgX1JVTkpEQj0iJUpBVkFfSE9NRSVcYmluXGpkYiIKK3NldCBfUlVOSkFWQUM9IiVKQVZBX0hPTUUlXGJpblxqYXZhYyIKKworZ290byBlbmQKKworOmV4aXQKK2V4aXQgL2IgMQorCis6ZW5kCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zZXRjbGFzc3BhdGguc2ggYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zZXRjbGFzc3BhdGguc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5NDc3MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3NldGNsYXNzcGF0aC5zaApAQCAtMCwwICsxLDkxIEBACisjIS9iaW4vc2gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgIFNldCBDTEFTU1BBVEggYW5kIEphdmEgb3B0aW9ucworIworIyAgJElkJAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIEZpcnN0IGNsZWFyIG91dCB0aGUgdXNlciBjbGFzc3BhdGgKK0NMQVNTUEFUSD0KKworIyBNYWtlIHN1cmUgcHJlcmVxdWlzaXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0CitpZiBbIC16ICIkSkFWQV9IT01FIiAtYSAteiAiJEpSRV9IT01FIiBdOyB0aGVuCisgICMgQnVnemlsbGEgMzcyODQKKyAgaWYgJGRhcndpbiAmJiBbIC1kICIvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9KYXZhVk0uZnJhbWV3b3JrL1ZlcnNpb25zLzEuNS9Ib21lIiBdOyB0aGVuCisgICAgZXhwb3J0IEpBVkFfSE9NRT0iL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvSmF2YVZNLmZyYW1ld29yay9WZXJzaW9ucy8xLjUvSG9tZSIKKyAgZWxzZQorICAgIGVjaG8gIk5laXRoZXIgdGhlIEpBVkFfSE9NRSBub3IgdGhlIEpSRV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGRlZmluZWQiCisgICAgZWNobyAiQXQgbGVhc3Qgb25lIG9mIHRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtIgorICAgIGV4aXQgMQorICBmaQorZmkKK2lmIFsgLXogIiRKQVZBX0hPTUUiIC1hICIkMSIgPSAiZGVidWciIF07IHRoZW4KKyAgZWNobyAiSkFWQV9IT01FIHNob3VsZCBwb2ludCB0byBhIEpESyBpbiBvcmRlciB0byBydW4gaW4gZGVidWcgbW9kZS4iCisgIGV4aXQgMQorZmkKK2lmIFsgLXogIiRKUkVfSE9NRSIgXTsgdGhlbgorICBKUkVfSE9NRT0iJEpBVkFfSE9NRSIKK2ZpCisKKyMgSWYgd2UncmUgcnVubmluZyB1bmRlciBqZGIsIHdlIG5lZWQgYSBmdWxsIGpkay4KK2lmIFsgIiQxIiA9ICJkZWJ1ZyIgLW8gIiQxIiA9ICJqYXZhYyIgXSA7IHRoZW4KKyAgaWYgWyAiJG9zNDAwIiA9ICJ0cnVlIiBdOyB0aGVuCisgICAgaWYgWyAhIC14ICIkSkFWQV9IT01FIi9iaW4vamF2YSAtbyAhIC14ICIkSkFWQV9IT01FIi9iaW4vamF2YWMgXTsgdGhlbgorICAgICAgZWNobyAiVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkiCisgICAgICBlY2hvICJUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtIgorICAgICAgZWNobyAiTkI6IEpBVkFfSE9NRSBzaG91bGQgcG9pbnQgdG8gYSBKREsgbm90IGEgSlJFIgorICAgICAgZXhpdCAxCisgICAgZmkKKyAgZWxzZQorICAgIGlmIFsgISAteCAiJEpBVkFfSE9NRSIvYmluL2phdmEgLW8gISAteCAiJEpBVkFfSE9NRSIvYmluL2pkYiAtbyAhIC14ICIkSkFWQV9IT01FIi9iaW4vamF2YWMgXTsgdGhlbgorICAgICAgZWNobyAiVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkiCisgICAgICBlY2hvICJUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtIgorICAgICAgZWNobyAiTkI6IEpBVkFfSE9NRSBzaG91bGQgcG9pbnQgdG8gYSBKREsgbm90IGEgSlJFIgorICAgICAgZXhpdCAxCisgICAgZmkKKyAgZmkKK2ZpCitpZiBbIC16ICIkQkFTRURJUiIgXTsgdGhlbgorICBlY2hvICJUaGUgQkFTRURJUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCIKKyAgZWNobyAiVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbSIKKyAgZXhpdCAxCitmaQoraWYgWyAhIC14ICIkQkFTRURJUiIvYmluL3NldGNsYXNzcGF0aC5zaCBdOyB0aGVuCisgIGlmICRvczQwMDsgdGhlbgorICAgICMgLXggd2lsbCBPbmx5IHdvcmsgb24gdGhlIG9zNDAwIGlmIHRoZSBmaWxlcyBhcmU6CisgICAgIyAxLiBvd25lZCBieSB0aGUgdXNlcgorICAgICMgMi4gb3duZWQgYnkgdGhlIFBSSU1BUlkgZ3JvdXAgb2YgdGhlIHVzZXIKKyAgICAjIHRoaXMgd2lsbCBub3Qgd29yayBpZiB0aGUgdXNlciBiZWxvbmdzIGluIHNlY29uZGFyeSBncm91cHMKKyAgICBldmFsCisgIGVsc2UKKyAgICBlY2hvICJUaGUgQkFTRURJUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkiCisgICAgZWNobyAiVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbSIKKyAgICBleGl0IDEKKyAgZmkKK2ZpCisKKyMgU2V0IHRoZSBkZWZhdWx0IC1EamF2YS5lbmRvcnNlZC5kaXJzIGFyZ3VtZW50CitKQVZBX0VORE9SU0VEX0RJUlM9IiRCQVNFRElSIi9jb21tb24vZW5kb3JzZWQKKworIyBTZXQgc3RhbmRhcmQgQ0xBU1NQQVRICitpZiBbICIkMSIgPSAiZGVidWciIC1vICIkMSIgPSAiamF2YWMiIF0gOyB0aGVuCisgIENMQVNTUEFUSD0iJEpBVkFfSE9NRSIvbGliL3Rvb2xzLmphcgorZmkKKworIyBPU1ggaGFjayB0byBDTEFTU1BBVEgKK0pJS0VTUEFUSD0KK2lmIFsgYHVuYW1lIC1zYCA9ICJEYXJ3aW4iIF07IHRoZW4KKyAgT1NYSEFDSz0iL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvSmF2YVZNLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50SkRLL0NsYXNzZXMiCisgIGlmIFsgLWQgIiRPU1hIQUNLIiBdOyB0aGVuCisgICAgZm9yIGkgaW4gIiRPU1hIQUNLIi8qLmphcjsgZG8KKyAgICAgIEpJS0VTUEFUSD0iJEpJS0VTUEFUSCI6IiRpIgorICAgIGRvbmUKKyAgZmkKK2ZpCisKKyMgU2V0IHN0YW5kYXJkIGNvbW1hbmRzIGZvciBpbnZva2luZyBKYXZhLgorICBfUlVOSkFWQT0iJEpSRV9IT01FIi9iaW4vamF2YQoraWYgWyAiJG9zNDAwIiAhPSAidHJ1ZSIgXTsgdGhlbgorICBfUlVOSkRCPSIkSkFWQV9IT01FIi9iaW4vamRiCitmaQorX1JVTkpBVkFDPSIkSkFWQV9IT01FIi9iaW4vamF2YWMKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3NodXRkb3duLXVzaW5nLWxhdW5jaGVyLmJhdCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3NodXRkb3duLXVzaW5nLWxhdW5jaGVyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDM0ZWRjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc2h1dGRvd24tdXNpbmctbGF1bmNoZXIuYmF0CkBAIC0wLDAgKzEsMzkgQEAKK0BlY2hvIG9mZgoraWYgIiVPUyUiID09ICJXaW5kb3dzX05UIiBzZXRsb2NhbAorCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityZW0KK3JlbSBTY3JpcHQgZm9yIHNodXR0aW5nIGRvd24gQ2F0YWxpbmEgdXNpbmcgdGhlIExhdW5jaGVyCityZW0KK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmVtIEdldCBzdGFuZGFyZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK3NldCBQUkc9JTAKK2lmIGV4aXN0ICVQUkclXC4uXHNldGVudi5iYXQgZ290byBnb3RDbWRQYXRoCityZW0gJTAgbXVzdCBoYXZlIGJlZW4gZm91bmQgYnkgRE9TIHVzaW5nIHRoZSAlUEFUSCUgc28gd2UgYXNzdW1lIHRoYXQKK3JlbSBzZXRlbnYuYmF0IHdpbGwgYWxzbyBiZSBmb3VuZCBpbiB0aGUgJVBBVEglCitnb3RvIGRvbmVTZXRlbnYKKzpnb3RDbWRQYXRoCitjYWxsICVQUkclXC4uXHNldGVudi5iYXQKKzpkb25lU2V0ZW52CisKK3JlbSBNYWtlIHN1cmUgcHJlcmVxdWlzaXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0CitpZiBub3QgIiVKQVZBX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEphdmFIb21lCitlY2hvIFRoZSBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQKK2VjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBlbmQKKzpnb3RKYXZhSG9tZQorCityZW0gR2V0IGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIHNhdmUgdGhlbSB3aXRoIHRoZSBwcm9wZXIgcXVvdGluZworc2V0IENNRF9MSU5FX0FSR1M9Cis6c2V0QXJncworaWYgIiIlMSIiPT0iIiIiIGdvdG8gZG9uZVNldEFyZ3MKK3NldCBDTURfTElORV9BUkdTPSVDTURfTElORV9BUkdTJSAlMQorc2hpZnQKK2dvdG8gc2V0QXJncworOmRvbmVTZXRBcmdzCisKK3JlbSBFeGVjdXRlIHRoZSBMYXVuY2hlciB1c2luZyB0aGUgImNhdGFsaW5hIiB0YXJnZXQKKyIlSkFWQV9IT01FJVxiaW5camF2YS5leGUiIC1jbGFzc3BhdGggJVBSRyVcLi47IiVQQVRIJSI7LiBMYXVuY2hlckJvb3RzdHJhcCAtbGF1bmNoZmlsZSBjYXRhbGluYS54bWwgLXZlcmJvc2UgY2F0YWxpbmEgJUNNRF9MSU5FX0FSR1MlIHN0b3AKKworOmVuZApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc2h1dGRvd24tdXNpbmctbGF1bmNoZXIuc2ggYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zaHV0ZG93bi11c2luZy1sYXVuY2hlci5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmRhZWMyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc2h1dGRvd24tdXNpbmctbGF1bmNoZXIuc2gKQEAgLTAsMCArMSwyOSBAQAorIyEvYmluL3NoCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgU2NyaXB0IGZvciBzaHV0dGluZyBkb3duIENhdGFsaW5hIHVzaW5nIHRoZSBMYXVuY2hlcgorIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFJlc29sdmUgbGlua3MgLSAkMCBtYXkgYmUgYSBzb2Z0bGluaworUFJHPSIkMCIKKword2hpbGUgWyAtaCAiJFBSRyIgXTsgZG8KKyAgbHM9YGxzIC1sZCAiJFBSRyJgCisgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgaWYgZXhwciAiJGxpbmsiIDogJy4qLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIFBSRz0iJGxpbmsiCisgIGVsc2UKKyAgICBQUkc9YGRpcm5hbWUgIiRQUkciYC8iJGxpbmsiCisgIGZpCitkb25lCisKKyMgR2V0IHN0YW5kYXJkIGVudmlyb25tZW50IHZhcmlhYmxlcworUFJHRElSPWBkaXJuYW1lICIkUFJHImAKK2lmIFsgLXIgIiRQUkdESVIiL3NldGVudi5zaCBdOyB0aGVuCisgIC4gIiRQUkdESVIiL3NldGVudi5zaAorZmkKKworIyBFeGVjdXRlIHRoZSBMYXVuY2hlciB1c2luZyB0aGUgImNhdGFsaW5hIiB0YXJnZXQKK2V4ZWMgIiRKQVZBX0hPTUUiL2Jpbi9qYXZhIC1jbGFzc3BhdGggIiRQUkdESVIiIExhdW5jaGVyQm9vdHN0cmFwIC1sYXVuY2hmaWxlIGNhdGFsaW5hLnhtbCAtdmVyYm9zZSBjYXRhbGluYSAiJEAiIHN0b3AKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3NodXRkb3duLmJhdCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3NodXRkb3duLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjhjNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc2h1dGRvd24uYmF0CkBAIC0wLDAgKzEsNDQgQEAKK0BlY2hvIG9mZgoraWYgIiVPUyUiID09ICJXaW5kb3dzX05UIiBzZXRsb2NhbAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcmVtIFN0b3Agc2NyaXB0IGZvciB0aGUgQ0FUQUxJTkEgU2VydmVyCityZW0KK3JlbSAkSWQkCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JlbSBHdWVzcyBDQVRBTElOQV9IT01FIGlmIG5vdCBkZWZpbmVkCitzZXQgQ1VSUkVOVF9ESVI9JWNkJQoraWYgbm90ICIlQ0FUQUxJTkFfSE9NRSUiID09ICIiIGdvdG8gZ290SG9tZQorc2V0IENBVEFMSU5BX0hPTUU9JUNVUlJFTlRfRElSJQoraWYgZXhpc3QgIiVDQVRBTElOQV9IT01FJVxiaW5cY2F0YWxpbmEuYmF0IiBnb3RvIG9rSG9tZQorY2QgLi4KK3NldCBDQVRBTElOQV9IT01FPSVjZCUKK2NkICVDVVJSRU5UX0RJUiUKKzpnb3RIb21lCitpZiBleGlzdCAiJUNBVEFMSU5BX0hPTUUlXGJpblxjYXRhbGluYS5iYXQiIGdvdG8gb2tIb21lCitlY2hvIFRoZSBDQVRBTElOQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseQorZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZAorOm9rSG9tZQorCitzZXQgRVhFQ1VUQUJMRT0lQ0FUQUxJTkFfSE9NRSVcYmluXGNhdGFsaW5hLmJhdAorCityZW0gQ2hlY2sgdGhhdCB0YXJnZXQgZXhlY3V0YWJsZSBleGlzdHMKK2lmIGV4aXN0ICIlRVhFQ1VUQUJMRSUiIGdvdG8gb2tFeGVjCitlY2hvIENhbm5vdCBmaW5kICVFWEVDVVRBQkxFJQorZWNobyBUaGlzIGZpbGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KK2dvdG8gZW5kCis6b2tFeGVjCisKK3JlbSBHZXQgcmVtYWluaW5nIHVuc2hpZnRlZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZCBzYXZlIHRoZW0gaW4gdGhlCitzZXQgQ01EX0xJTkVfQVJHUz0KKzpzZXRBcmdzCitpZiAiIiUxIiI9PSIiIiIgZ290byBkb25lU2V0QXJncworc2V0IENNRF9MSU5FX0FSR1M9JUNNRF9MSU5FX0FSR1MlICUxCitzaGlmdAorZ290byBzZXRBcmdzCis6ZG9uZVNldEFyZ3MKKworY2FsbCAiJUVYRUNVVEFCTEUlIiBzdG9wICVDTURfTElORV9BUkdTJQorCis6ZW5kCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zaHV0ZG93bi5zaCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3NodXRkb3duLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYWQzMjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zaHV0ZG93bi5zaApAQCAtMCwwICsxLDMxIEBACisjIS9iaW4vc2gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU3RvcCBzY3JpcHQgZm9yIHRoZSBDQVRBTElOQSBTZXJ2ZXIKKyMKKyMgJElkJAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIHJlc29sdmUgbGlua3MgLSAkMCBtYXkgYmUgYSBzb2Z0bGluaworUFJHPSIkMCIKKword2hpbGUgWyAtaCAiJFBSRyIgXSA7IGRvCisgIGxzPWBscyAtbGQgIiRQUkciYAorICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgIGlmIGV4cHIgIiRsaW5rIiA6ICcvLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgUFJHPSIkbGluayIKKyAgZWxzZQorICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgLyIkbGluayIKKyAgZmkKK2RvbmUKKyAKK1BSR0RJUj1gZGlybmFtZSAiJFBSRyJgCitFWEVDVVRBQkxFPWNhdGFsaW5hLnNoCisKKyMgQ2hlY2sgdGhhdCB0YXJnZXQgZXhlY3V0YWJsZSBleGlzdHMKK2lmIFsgISAteCAiJFBSR0RJUiIvIiRFWEVDVVRBQkxFIiBdOyB0aGVuCisgIGVjaG8gIkNhbm5vdCBmaW5kICRQUkdESVIvJEVYRUNVVEFCTEUiCisgIGVjaG8gIlRoaXMgZmlsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbSIKKyAgZXhpdCAxCitmaQorCitleGVjICIkUFJHRElSIi8iJEVYRUNVVEFCTEUiIHN0b3AgIiRAIgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc3RhcnR1cC11c2luZy1sYXVuY2hlci5iYXQgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zdGFydHVwLXVzaW5nLWxhdW5jaGVyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTVlY2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc3RhcnR1cC11c2luZy1sYXVuY2hlci5iYXQKQEAgLTAsMCArMSwzOSBAQAorQGVjaG8gb2ZmCitpZiAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIHNldGxvY2FsCisKK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JlbQorcmVtIFNjcmlwdCBmb3Igc3RhcnRpbmcgQ2F0YWxpbmEgdXNpbmcgdGhlIExhdW5jaGVyCityZW0KK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmVtIEdldCBzdGFuZGFyZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK3NldCBQUkc9JTAKK2lmIGV4aXN0ICVQUkclXC4uXHNldGVudi5iYXQgZ290byBnb3RDbWRQYXRoCityZW0gJTAgbXVzdCBoYXZlIGJlZW4gZm91bmQgYnkgRE9TIHVzaW5nIHRoZSAlUEFUSCUgc28gd2UgYXNzdW1lIHRoYXQKK3JlbSBzZXRlbnYuYmF0IHdpbGwgYWxzbyBiZSBmb3VuZCBpbiB0aGUgJVBBVEglCitnb3RvIGRvbmVTZXRlbnYKKzpnb3RDbWRQYXRoCitjYWxsICVQUkclXC4uXHNldGVudi5iYXQKKzpkb25lU2V0ZW52CisKK3JlbSBNYWtlIHN1cmUgcHJlcmVxdWlzaXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0CitpZiBub3QgIiVKQVZBX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEphdmFIb21lCitlY2hvIFRoZSBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQKK2VjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBlbmQKKzpnb3RKYXZhSG9tZQorCityZW0gR2V0IGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIHNhdmUgdGhlbSB3aXRoIHRoZSBwcm9wZXIgcXVvdGluZworc2V0IENNRF9MSU5FX0FSR1M9Cis6c2V0QXJncworaWYgIiIlMSIiPT0iIiIiIGdvdG8gZG9uZVNldEFyZ3MKK3NldCBDTURfTElORV9BUkdTPSVDTURfTElORV9BUkdTJSAlMQorc2hpZnQKK2dvdG8gc2V0QXJncworOmRvbmVTZXRBcmdzCisKK3JlbSBFeGVjdXRlIHRoZSBMYXVuY2hlciB1c2luZyB0aGUgImNhdGFsaW5hIiB0YXJnZXQKKyIlSkFWQV9IT01FJVxiaW5camF2YS5leGUiIC1jbGFzc3BhdGggJVBSRyVcLi47IiVQQVRIJSI7LiBMYXVuY2hlckJvb3RzdHJhcCAtbGF1bmNoZmlsZSBjYXRhbGluYS54bWwgLXZlcmJvc2UgY2F0YWxpbmEgJUNNRF9MSU5FX0FSR1MlIHN0YXJ0CisKKzplbmQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3N0YXJ0dXAtdXNpbmctbGF1bmNoZXIuc2ggYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zdGFydHVwLXVzaW5nLWxhdW5jaGVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZDE3OWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zdGFydHVwLXVzaW5nLWxhdW5jaGVyLnNoCkBAIC0wLDAgKzEsMjkgQEAKKyMhL2Jpbi9zaAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjIFNjcmlwdCBmb3Igc3RhcnRpbmcgQ2F0YWxpbmEgdXNpbmcgdGhlIExhdW5jaGVyCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgUmVzb2x2ZSBsaW5rcyAtICQwIG1heSBiZSBhIHNvZnRsaW5rCitQUkc9IiQwIgorCit3aGlsZSBbIC1oICIkUFJHIiBdOyBkbworICBscz1gbHMgLWxkICIkUFJHImAKKyAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAorICBpZiBleHByICIkbGluayIgOiAnLiovLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgUFJHPSIkbGluayIKKyAgZWxzZQorICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgLyIkbGluayIKKyAgZmkKK2RvbmUKKworIyBHZXQgc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFyaWFibGVzCitQUkdESVI9YGRpcm5hbWUgIiRQUkciYAoraWYgWyAtciAiJFBSR0RJUiIvc2V0ZW52LnNoIF07IHRoZW4KKyAgLiAiJFBSR0RJUiIvc2V0ZW52LnNoCitmaQorCisjIEV4ZWN1dGUgdGhlIExhdW5jaGVyIHVzaW5nIHRoZSAiY2F0YWxpbmEiIHRhcmdldAorZXhlYyAiJEpBVkFfSE9NRSIvYmluL2phdmEgLWNsYXNzcGF0aCAiJFBSR0RJUiIgTGF1bmNoZXJCb290c3RyYXAgLWxhdW5jaGZpbGUgY2F0YWxpbmEueG1sIC12ZXJib3NlIGNhdGFsaW5hICIkQCIgc3RhcnQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3N0YXJ0dXAuYmF0IGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc3RhcnR1cC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2ZTJkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3N0YXJ0dXAuYmF0CkBAIC0wLDAgKzEsNDQgQEAKK0BlY2hvIG9mZgoraWYgIiVPUyUiID09ICJXaW5kb3dzX05UIiBzZXRsb2NhbAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcmVtIFN0YXJ0IHNjcmlwdCBmb3IgdGhlIENBVEFMSU5BIFNlcnZlcgorcmVtCityZW0gJElkJAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZW0gR3Vlc3MgQ0FUQUxJTkFfSE9NRSBpZiBub3QgZGVmaW5lZAorc2V0IENVUlJFTlRfRElSPSVjZCUKK2lmIG5vdCAiJUNBVEFMSU5BX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEhvbWUKK3NldCBDQVRBTElOQV9IT01FPSVDVVJSRU5UX0RJUiUKK2lmIGV4aXN0ICIlQ0FUQUxJTkFfSE9NRSVcYmluXGNhdGFsaW5hLmJhdCIgZ290byBva0hvbWUKK2NkIC4uCitzZXQgQ0FUQUxJTkFfSE9NRT0lY2QlCitjZCAlQ1VSUkVOVF9ESVIlCis6Z290SG9tZQoraWYgZXhpc3QgIiVDQVRBTElOQV9IT01FJVxiaW5cY2F0YWxpbmEuYmF0IiBnb3RvIG9rSG9tZQorZWNobyBUaGUgQ0FUQUxJTkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkKK2VjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBlbmQKKzpva0hvbWUKKworc2V0IEVYRUNVVEFCTEU9JUNBVEFMSU5BX0hPTUUlXGJpblxjYXRhbGluYS5iYXQKKworcmVtIENoZWNrIHRoYXQgdGFyZ2V0IGV4ZWN1dGFibGUgZXhpc3RzCitpZiBleGlzdCAiJUVYRUNVVEFCTEUlIiBnb3RvIG9rRXhlYworZWNobyBDYW5ub3QgZmluZCAlRVhFQ1VUQUJMRSUKK2VjaG8gVGhpcyBmaWxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZAorOm9rRXhlYworCityZW0gR2V0IHJlbWFpbmluZyB1bnNoaWZ0ZWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgc2F2ZSB0aGVtIGluIHRoZQorc2V0IENNRF9MSU5FX0FSR1M9Cis6c2V0QXJncworaWYgIiIlMSIiPT0iIiIiIGdvdG8gZG9uZVNldEFyZ3MKK3NldCBDTURfTElORV9BUkdTPSVDTURfTElORV9BUkdTJSAlMQorc2hpZnQKK2dvdG8gc2V0QXJncworOmRvbmVTZXRBcmdzCisKK2NhbGwgIiVFWEVDVVRBQkxFJSIgc3RhcnQgJUNNRF9MSU5FX0FSR1MlCisKKzplbmQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3N0YXJ0dXAuc2ggYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zdGFydHVwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTEzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zdGFydHVwLnNoCkBAIC0wLDAgKzEsNDggQEAKKyMhL2Jpbi9zaAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTdGFydCBTY3JpcHQgZm9yIHRoZSBDQVRBTElOQSBTZXJ2ZXIKKyMKKyMgJElkJAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIEJldHRlciBPUy80MDAgZGV0ZWN0aW9uOiBzZWUgQnVnemlsbGEgMzExMzIKK29zNDAwPWZhbHNlCitkYXJ3aW49ZmFsc2UKK2Nhc2UgImB1bmFtZWAiIGluCitDWUdXSU4qKSBjeWd3aW49dHJ1ZTs7CitPUzQwMCopIG9zNDAwPXRydWU7OworRGFyd2luKikgZGFyd2luPXRydWU7OworZXNhYworCisjIHJlc29sdmUgbGlua3MgLSAkMCBtYXkgYmUgYSBzb2Z0bGluaworUFJHPSIkMCIKKword2hpbGUgWyAtaCAiJFBSRyIgXSA7IGRvCisgIGxzPWBscyAtbGQgIiRQUkciYAorICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgIGlmIGV4cHIgIiRsaW5rIiA6ICcvLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgUFJHPSIkbGluayIKKyAgZWxzZQorICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgLyIkbGluayIKKyAgZmkKK2RvbmUKKyAKK1BSR0RJUj1gZGlybmFtZSAiJFBSRyJgCitFWEVDVVRBQkxFPWNhdGFsaW5hLnNoCisKKyMgQ2hlY2sgdGhhdCB0YXJnZXQgZXhlY3V0YWJsZSBleGlzdHMKK2lmICRvczQwMDsgdGhlbgorICAjIC14IHdpbGwgT25seSB3b3JrIG9uIHRoZSBvczQwMCBpZiB0aGUgZmlsZXMgYXJlOiAKKyAgIyAxLiBvd25lZCBieSB0aGUgdXNlcgorICAjIDIuIG93bmVkIGJ5IHRoZSBQUklNQVJZIGdyb3VwIG9mIHRoZSB1c2VyCisgICMgdGhpcyB3aWxsIG5vdCB3b3JrIGlmIHRoZSB1c2VyIGJlbG9uZ3MgaW4gc2Vjb25kYXJ5IGdyb3VwcworICBldmFsCitlbHNlCisgIGlmIFsgISAteCAiJFBSR0RJUiIvIiRFWEVDVVRBQkxFIiBdOyB0aGVuCisgICAgZWNobyAiQ2Fubm90IGZpbmQgJFBSR0RJUi8kRVhFQ1VUQUJMRSIKKyAgICBlY2hvICJUaGlzIGZpbGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0iCisgICAgZXhpdCAxCisgIGZpCitmaSAKKworZXhlYyAiJFBSR0RJUiIvIiRFWEVDVVRBQkxFIiBzdGFydCAiJEAiCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi90b29sLXdyYXBwZXItdXNpbmctbGF1bmNoZXIuYmF0IGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vdG9vbC13cmFwcGVyLXVzaW5nLWxhdW5jaGVyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzM0ODc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vdG9vbC13cmFwcGVyLXVzaW5nLWxhdW5jaGVyLmJhdApAQCAtMCwwICsxLDM5IEBACitAZWNobyBvZmYKK2lmICIlT1MlIiA9PSAiV2luZG93c19OVCIgc2V0bG9jYWwKKworcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcmVtCityZW0gU2NyaXB0IGZvciBydW5uaW5nIHRoZSBDYXRhbGluYSB0b29sIHdyYXBwZXIgdXNpbmcgdGhlIExhdW5jaGVyCityZW0KK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmVtIEdldCBzdGFuZGFyZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK3NldCBQUkc9JTAKK2lmIGV4aXN0ICVQUkclXC4uXHNldGVudi5iYXQgZ290byBnb3RDbWRQYXRoCityZW0gJTAgbXVzdCBoYXZlIGJlZW4gZm91bmQgYnkgRE9TIHVzaW5nIHRoZSAlUEFUSCUgc28gd2UgYXNzdW1lIHRoYXQKK3JlbSBzZXRlbnYuYmF0IHdpbGwgYWxzbyBiZSBmb3VuZCBpbiB0aGUgJVBBVEglCitnb3RvIGRvbmVTZXRlbnYKKzpnb3RDbWRQYXRoCitjYWxsICVQUkclXC4uXHNldGVudi5iYXQKKzpkb25lU2V0ZW52CisKK3JlbSBNYWtlIHN1cmUgcHJlcmVxdWlzaXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0CitpZiBub3QgIiVKQVZBX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEphdmFIb21lCitlY2hvIFRoZSBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQKK2VjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBlbmQKKzpnb3RKYXZhSG9tZQorCityZW0gR2V0IGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIHNhdmUgdGhlbSB3aXRoIHRoZSBwcm9wZXIgcXVvdGluZworc2V0IENNRF9MSU5FX0FSR1M9Cis6c2V0QXJncworaWYgIiIlMSIiPT0iIiIiIGdvdG8gZG9uZVNldEFyZ3MKK3NldCBDTURfTElORV9BUkdTPSVDTURfTElORV9BUkdTJSAlMQorc2hpZnQKK2dvdG8gc2V0QXJncworOmRvbmVTZXRBcmdzCisKK3JlbSBFeGVjdXRlIHRoZSBMYXVuY2hlciB1c2luZyB0aGUgInRvb2wtd3JhcHBlciIgdGFyZ2V0CisiJUpBVkFfSE9NRSVcYmluXGphdmEuZXhlIiAtY2xhc3NwYXRoICVQUkclXC4uOyIlUEFUSCUiOy4gTGF1bmNoZXJCb290c3RyYXAgLWxhdW5jaGZpbGUgY2F0YWxpbmEueG1sIC12ZXJib3NlIHRvb2wtd3JhcHBlciAlQ01EX0xJTkVfQVJHUyUKKworOmVuZApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vdG9vbC13cmFwcGVyLXVzaW5nLWxhdW5jaGVyLnNoIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vdG9vbC13cmFwcGVyLXVzaW5nLWxhdW5jaGVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMjg2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi90b29sLXdyYXBwZXItdXNpbmctbGF1bmNoZXIuc2gKQEAgLTAsMCArMSwyOSBAQAorIyEvYmluL3NoCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgU2NyaXB0IGZvciBydW5uaW5nIHRoZSBDYXRhbGluYSB0b29sIHdyYXBwZXIgdXNpbmcgdGhlIExhdW5jaGVyCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgUmVzb2x2ZSBsaW5rcyAtICQwIG1heSBiZSBhIHNvZnRsaW5rCitQUkc9IiQwIgorCit3aGlsZSBbIC1oICIkUFJHIiBdOyBkbworICBscz1gbHMgLWxkICIkUFJHImAKKyAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAorICBpZiBleHByICIkbGluayIgOiAnLiovLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgUFJHPSIkbGluayIKKyAgZWxzZQorICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgLyIkbGluayIKKyAgZmkKK2RvbmUKKworIyBHZXQgc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFyaWFibGVzCitQUkdESVI9YGRpcm5hbWUgIiRQUkciYAoraWYgWyAtciAiJFBSR0RJUiIvc2V0ZW52LnNoIF07IHRoZW4KKyAgLiAiJFBSR0RJUiIvc2V0ZW52LnNoCitmaQorCisjIEV4ZWN1dGUgdGhlIExhdW5jaGVyIHVzaW5nIHRoZSAidG9vbC13cmFwcGVyIiB0YXJnZXQKK2V4ZWMgIiRKQVZBX0hPTUUiL2Jpbi9qYXZhIC1jbGFzc3BhdGggIiRQUkdESVIiIExhdW5jaGVyQm9vdHN0cmFwIC1sYXVuY2hmaWxlIGNhdGFsaW5hLnhtbCAtdmVyYm9zZSB0b29sLXdyYXBwZXIgIiRAIgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vdG9vbC13cmFwcGVyLmJhdCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3Rvb2wtd3JhcHBlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExMjhkYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3Rvb2wtd3JhcHBlci5iYXQKQEAgLTAsMCArMSw1OSBAQAorQGVjaG8gb2ZmCitpZiAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIHNldGxvY2FsCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityZW0gV3JhcHBlciBzY3JpcHQgZm9yIGNvbW1hbmQgbGluZSB0b29scworcmVtCityZW0gRW52aXJvbm1lbnQgVmFyaWFibGUgUHJlcXVpc2l0ZXMKK3JlbQorcmVtICAgQ0FUQUxJTkFfSE9NRSBNYXkgcG9pbnQgYXQgeW91ciBDYXRhbGluYSAiYnVpbGQiIGRpcmVjdG9yeS4KK3JlbQorcmVtICAgVE9PTF9PUFRTICAgICAoT3B0aW9uYWwpIEphdmEgcnVudGltZSBvcHRpb25zIHVzZWQgd2hlbiB0aGUgInN0YXJ0IiwKK3JlbSAgICAgICAgICAgICAgICAgInN0b3AiLCBvciAicnVuIiBjb21tYW5kIGlzIGV4ZWN1dGVkLgorcmVtCityZW0gICBKQVZBX0hPTUUgICAgIE11c3QgcG9pbnQgYXQgeW91ciBKYXZhIERldmVsb3BtZW50IEtpdCBpbnN0YWxsYXRpb24uCityZW0KK3JlbSAgIEpBVkFfT1BUUyAgICAgKE9wdGlvbmFsKSBKYXZhIHJ1bnRpbWUgb3B0aW9ucyB1c2VkIHdoZW4gdGhlICJzdGFydCIsCityZW0gICAgICAgICAgICAgICAgICJzdG9wIiwgb3IgInJ1biIgY29tbWFuZCBpcyBleGVjdXRlZC4KK3JlbQorcmVtICRJZCQKK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmVtIEd1ZXNzIENBVEFMSU5BX0hPTUUgaWYgbm90IGRlZmluZWQKK2lmIG5vdCAiJUNBVEFMSU5BX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEhvbWUKK3NldCBDQVRBTElOQV9IT01FPS4KK2lmIGV4aXN0ICIlQ0FUQUxJTkFfSE9NRSVcYmluXHRvb2wtd3JhcHBlci5iYXQiIGdvdG8gb2tIb21lCitzZXQgQ0FUQUxJTkFfSE9NRT0uLgorOmdvdEhvbWUKK2lmIGV4aXN0ICIlQ0FUQUxJTkFfSE9NRSVcYmluXHRvb2wtd3JhcHBlci5iYXQiIGdvdG8gb2tIb21lCitlY2hvIFRoZSBDQVRBTElOQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseQorZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZAorOm9rSG9tZQorCityZW0gR2V0IHN0YW5kYXJkIGVudmlyb25tZW50IHZhcmlhYmxlcworaWYgZXhpc3QgIiVDQVRBTElOQV9IT01FJVxiaW5cc2V0ZW52LmJhdCIgY2FsbCAiJUNBVEFMSU5BX0hPTUUlXGJpblxzZXRlbnYuYmF0IgorCityZW0gR2V0IHN0YW5kYXJkIEphdmEgZW52aXJvbm1lbnQgdmFyaWFibGVzCitpZiBleGlzdCAiJUNBVEFMSU5BX0hPTUUlXGJpblxzZXRjbGFzc3BhdGguYmF0IiBnb3RvIG9rU2V0Y2xhc3NwYXRoCitlY2hvIENhbm5vdCBmaW5kICVDQVRBTElOQV9IT01FJVxiaW5cc2V0Y2xhc3NwYXRoLmJhdAorZWNobyBUaGlzIGZpbGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KK2dvdG8gZW5kCis6b2tTZXRjbGFzc3BhdGgKK3NldCBCQVNFRElSPSVDQVRBTElOQV9IT01FJQorY2FsbCAiJUNBVEFMSU5BX0hPTUUlXGJpblxzZXRjbGFzc3BhdGguYmF0IgorCityZW0gQWRkIG9uIGV4dHJhIGphciBmaWxlcyB0byBDTEFTU1BBVEgKK3NldCBDTEFTU1BBVEg9JUNMQVNTUEFUSCU7JUNBVEFMSU5BX0hPTUUlXGJpblxib290c3RyYXAuamFyOyIlQkFTRURJUiUiXGNvbW1vblxsaWJcam14LmphcjsiJUJBU0VESVIlIlxjb21tb25cbGliXHNlcnZsZXQtYXBpLmphcgorCityZW0gR2V0IHJlbWFpbmluZyB1bnNoaWZ0ZWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgc2F2ZSB0aGVtIGluIHRoZQorc2V0IENNRF9MSU5FX0FSR1M9Cis6c2V0QXJncworaWYgIiIlMSIiPT0iIiIiIGdvdG8gZG9uZVNldEFyZ3MKK3NldCBDTURfTElORV9BUkdTPSVDTURfTElORV9BUkdTJSAlMQorc2hpZnQKK2dvdG8gc2V0QXJncworOmRvbmVTZXRBcmdzCisKKyVfUlVOSkFWQSUgJUpBVkFfT1BUUyUgJVRPT0xfT1BUUyUgLURqYXZhLmVuZG9yc2VkLmRpcnM9IiVKQVZBX0VORE9SU0VEX0RJUlMlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgLURjYXRhbGluYS5ob21lPSIlQ0FUQUxJTkFfSE9NRSUiIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Ub29sICVDTURfTElORV9BUkdTJQorCis6ZW5kCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi90b29sLXdyYXBwZXIuc2ggYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi90b29sLXdyYXBwZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3NTI1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3Rvb2wtd3JhcHBlci5zaApAQCAtMCwwICsxLDc4IEBACisjIS9iaW4vc2gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgV3JhcHBlciBzY3JpcHQgZm9yIGNvbW1hbmQgbGluZSB0b29scworIworIyBFbnZpcm9ubWVudCBWYXJpYWJsZSBQcmVxdWlzaXRlcworIworIyAgIENBVEFMSU5BX0hPTUUgTWF5IHBvaW50IGF0IHlvdXIgQ2F0YWxpbmEgImJ1aWxkIiBkaXJlY3RvcnkuCisjCisjICAgVE9PTF9PUFRTICAgICAoT3B0aW9uYWwpIEphdmEgcnVudGltZSBvcHRpb25zIHVzZWQgd2hlbiB0aGUgInN0YXJ0IiwKKyMgICAgICAgICAgICAgICAgICJzdG9wIiwgb3IgInJ1biIgY29tbWFuZCBpcyBleGVjdXRlZC4KKyMKKyMgICBKQVZBX0hPTUUgICAgIE11c3QgcG9pbnQgYXQgeW91ciBKYXZhIERldmVsb3BtZW50IEtpdCBpbnN0YWxsYXRpb24uCisjCisjICAgSkFWQV9PUFRTICAgICAoT3B0aW9uYWwpIEphdmEgcnVudGltZSBvcHRpb25zIHVzZWQgd2hlbiB0aGUgInN0YXJ0IiwKKyMgICAgICAgICAgICAgICAgICJzdG9wIiwgb3IgInJ1biIgY29tbWFuZCBpcyBleGVjdXRlZC4KKyMKKyMgJElkJAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIE9TIHNwZWNpZmljIHN1cHBvcnQuICAkdmFyIF9tdXN0XyBiZSBzZXQgdG8gZWl0aGVyIHRydWUgb3IgZmFsc2UuCitjeWd3aW49ZmFsc2UKK2Nhc2UgImB1bmFtZWAiIGluCitDWUdXSU4qKSBjeWd3aW49dHJ1ZTs7Citlc2FjCisKKyMgcmVzb2x2ZSBsaW5rcyAtICQwIG1heSBiZSBhIHNvZnRsaW5rCitQUkc9IiQwIgorCit3aGlsZSBbIC1oICIkUFJHIiBdOyBkbworICBscz1gbHMgLWxkICIkUFJHImAKKyAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAorICBpZiBleHByICIkbGluayIgOiAnLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIFBSRz0iJGxpbmsiCisgIGVsc2UKKyAgICBQUkc9YGRpcm5hbWUgIiRQUkciYC8iJGxpbmsiCisgIGZpCitkb25lCisKKyMgR2V0IHN0YW5kYXJkIGVudmlyb25tZW50IHZhcmlhYmxlcworUFJHRElSPWBkaXJuYW1lICIkUFJHImAKK0NBVEFMSU5BX0hPTUU9YGNkICIkUFJHRElSLy4uIiA7IHB3ZGAKK2lmIFsgLXIgIiRDQVRBTElOQV9IT01FIi9iaW4vc2V0ZW52LnNoIF07IHRoZW4KKyAgLiAiJENBVEFMSU5BX0hPTUUiL2Jpbi9zZXRlbnYuc2gKK2ZpCisKKyMgRm9yIEN5Z3dpbiwgZW5zdXJlIHBhdGhzIGFyZSBpbiBVTklYIGZvcm1hdCBiZWZvcmUgYW55dGhpbmcgaXMgdG91Y2hlZAoraWYgJGN5Z3dpbjsgdGhlbgorICBbIC1uICIkSkFWQV9IT01FIiBdICYmIEpBVkFfSE9NRT1gY3lncGF0aCAtLXVuaXggIiRKQVZBX0hPTUUiYAorICBbIC1uICIkQ0FUQUxJTkFfSE9NRSIgXSAmJiBDQVRBTElOQV9IT01FPWBjeWdwYXRoIC0tdW5peCAiJENBVEFMSU5BX0hPTUUiYAorICBbIC1uICIkQ0xBU1NQQVRIIiBdICYmIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkQ0xBU1NQQVRIImAKK2ZpCisKKyMgR2V0IHN0YW5kYXJkIEphdmEgZW52aXJvbm1lbnQgdmFyaWFibGVzCitpZiBbIC1yICIkQ0FUQUxJTkFfSE9NRSIvYmluL3NldGNsYXNzcGF0aC5zaCBdOyB0aGVuCisgIEJBU0VESVI9IiRDQVRBTElOQV9IT01FIgorICAuICIkQ0FUQUxJTkFfSE9NRSIvYmluL3NldGNsYXNzcGF0aC5zaAorZWxzZQorICBlY2hvICJDYW5ub3QgZmluZCAkQ0FUQUxJTkFfSE9NRS9iaW4vc2V0Y2xhc3NwYXRoLnNoIgorICBlY2hvICJUaGlzIGZpbGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0iCisgIGV4aXQgMQorZmkKKworIyBBZGQgb24gZXh0cmEgamFyIGZpbGVzIHRvIENMQVNTUEFUSAorQ0xBU1NQQVRIPSIkQ0xBU1NQQVRIIjoiJENBVEFMSU5BX0hPTUUiL2Jpbi9ib290c3RyYXAuamFyOiIkQkFTRURJUiIvY29tbW9uL2xpYi9qbXguamFyOiIkQkFTRURJUiIvY29tbW9uL2xpYi9zZXJ2bGV0LWFwaS5qYXIKKworIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgJGN5Z3dpbjsgdGhlbgorICBKQVZBX0hPTUU9YGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAiJEpBVkFfSE9NRSJgCisgIENBVEFMSU5BX0hPTUU9YGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAiJENBVEFMSU5BX0hPTUUiYAorICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAiJENMQVNTUEFUSCJgCitmaQorCisjIC0tLS0tIEV4ZWN1dGUgVGhlIFJlcXVlc3RlZCBDb21tYW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4ZWMgIiRfUlVOSkFWQSIgJEpBVkFfT1BUUyAkVE9PTF9PUFRTIFwKKyAgLURqYXZhLmVuZG9yc2VkLmRpcnM9IiRKQVZBX0VORE9SU0VEX0RJUlMiIC1jbGFzc3BhdGggIiRDTEFTU1BBVEgiIFwKKyAgLURjYXRhbGluYS5ob21lPSIkQ0FUQUxJTkFfSE9NRSIgXAorICBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuVG9vbCAiJEAiCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi92ZXJzaW9uLmJhdCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3ZlcnNpb24uYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIxNGJlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi92ZXJzaW9uLmJhdApAQCAtMCwwICsxLDQ0IEBACitAZWNobyBvZmYKK2lmICIlT1MlIiA9PSAiV2luZG93c19OVCIgc2V0bG9jYWwKK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JlbSBWZXJzaW9uIHNjcmlwdCBmb3IgdGhlIENBVEFMSU5BIFNlcnZlcgorcmVtCityZW0gJElkJAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZW0gR3Vlc3MgQ0FUQUxJTkFfSE9NRSBpZiBub3QgZGVmaW5lZAorc2V0IENVUlJFTlRfRElSPSVjZCUKK2lmIG5vdCAiJUNBVEFMSU5BX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEhvbWUKK3NldCBDQVRBTElOQV9IT01FPSVDVVJSRU5UX0RJUiUKK2lmIGV4aXN0ICIlQ0FUQUxJTkFfSE9NRSVcYmluXGNhdGFsaW5hLmJhdCIgZ290byBva0hvbWUKK2NkIC4uCitzZXQgQ0FUQUxJTkFfSE9NRT0lY2QlCitjZCAlQ1VSUkVOVF9ESVIlCis6Z290SG9tZQoraWYgZXhpc3QgIiVDQVRBTElOQV9IT01FJVxiaW5cY2F0YWxpbmEuYmF0IiBnb3RvIG9rSG9tZQorZWNobyBUaGUgQ0FUQUxJTkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkKK2VjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBlbmQKKzpva0hvbWUKKworc2V0IEVYRUNVVEFCTEU9JUNBVEFMSU5BX0hPTUUlXGJpblxjYXRhbGluYS5iYXQKKworcmVtIENoZWNrIHRoYXQgdGFyZ2V0IGV4ZWN1dGFibGUgZXhpc3RzCitpZiBleGlzdCAiJUVYRUNVVEFCTEUlIiBnb3RvIG9rRXhlYworZWNobyBDYW5ub3QgZmluZCAlRVhFQ1VUQUJMRSUKK2VjaG8gVGhpcyBmaWxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZAorOm9rRXhlYworCityZW0gR2V0IHJlbWFpbmluZyB1bnNoaWZ0ZWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgc2F2ZSB0aGVtIGluIHRoZQorc2V0IENNRF9MSU5FX0FSR1M9Cis6c2V0QXJncworaWYgIiIlMSIiPT0iIiIiIGdvdG8gZG9uZVNldEFyZ3MKK3NldCBDTURfTElORV9BUkdTPSVDTURfTElORV9BUkdTJSAlMQorc2hpZnQKK2dvdG8gc2V0QXJncworOmRvbmVTZXRBcmdzCisKK2NhbGwgIiVFWEVDVVRBQkxFJSIgdmVyc2lvbiAlQ01EX0xJTkVfQVJHUyUKKworOmVuZApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vdmVyc2lvbi5zaCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3ZlcnNpb24uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjUxMjdmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3ZlcnNpb24uc2gKQEAgLTAsMCArMSwzMSBAQAorIyEvYmluL3NoCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFZlcnNpb24gU2NyaXB0IGZvciB0aGUgQ0FUQUxJTkEgU2VydmVyCisjCisjICRJZCQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyByZXNvbHZlIGxpbmtzIC0gJDAgbWF5IGJlIGEgc29mdGxpbmsKK1BSRz0iJDAiCisKK3doaWxlIFsgLWggIiRQUkciIF0gOyBkbworICBscz1gbHMgLWxkICIkUFJHImAKKyAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAorICBpZiBleHByICIkbGluayIgOiAnLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIFBSRz0iJGxpbmsiCisgIGVsc2UKKyAgICBQUkc9YGRpcm5hbWUgIiRQUkciYC8iJGxpbmsiCisgIGZpCitkb25lCisKK1BSR0RJUj1gZGlybmFtZSAiJFBSRyJgCitFWEVDVVRBQkxFPWNhdGFsaW5hLnNoCisKKyMgQ2hlY2sgdGhhdCB0YXJnZXQgZXhlY3V0YWJsZSBleGlzdHMKK2lmIFsgISAteCAiJFBSR0RJUiIvIiRFWEVDVVRBQkxFIiBdOyB0aGVuCisgIGVjaG8gIkNhbm5vdCBmaW5kICRQUkdESVIvJEVYRUNVVEFCTEUiCisgIGVjaG8gIlRoaXMgZmlsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbSIKKyAgZXhpdCAxCitmaQorCitleGVjICIkUFJHRElSIi8iJEVYRUNVVEFCTEUiIHZlcnNpb24gIiRAIgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9jb25mL2NhdGFsaW5hLnBvbGljeSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvY29uZi9jYXRhbGluYS5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1NDRkYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvY29uZi9jYXRhbGluYS5wb2xpY3kKQEAgLTAsMCArMSwxNzQgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGNhdGFsaW5hLmNvcmVwb2xpY3kgLSBTZWN1cml0eSBQb2xpY3kgUGVybWlzc2lvbnMgZm9yIFRvbWNhdCA1CisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGEgZGVmYXVsdCBzZXQgb2Ygc2VjdXJpdHkgcG9saWNpZXMgdG8gYmUgZW5mb3JjZWQgKGJ5IHRoZQorLy8gSlZNKSB3aGVuIENhdGFsaW5hIGlzIGV4ZWN1dGVkIHdpdGggdGhlICItc2VjdXJpdHkiIG9wdGlvbi4gIEluIGFkZGl0aW9uCisvLyB0byB0aGUgcGVybWlzc2lvbnMgZ3JhbnRlZCBoZXJlLCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgYXJlCisvLyBncmFudGVkIHRvIHRoZSBjb2RlYmFzZSBzcGVjaWZpYyB0byBlYWNoIHdlYiBhcHBsaWNhdGlvbjoKKy8vCisvLyAqIFJlYWQgYWNjZXNzIHRvIHRoZSBkb2N1bWVudCByb290IGRpcmVjdG9yeQorLy8KKy8vICRJZCQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyA9PT09PT09PT09IFNZU1RFTSBDT0RFIFBFUk1JU1NJT05TID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gVGhlc2UgcGVybWlzc2lvbnMgYXBwbHkgdG8gamF2YWMKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7amF2YS5ob21lfS9saWIvLSIgeworICAgICAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKy8vIFRoZXNlIHBlcm1pc3Npb25zIGFwcGx5IHRvIGFsbCBzaGFyZWQgc3lzdGVtIGV4dGVuc2lvbnMKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7amF2YS5ob21lfS9qcmUvbGliL2V4dC8tIiB7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKworLy8gVGhlc2UgcGVybWlzc2lvbnMgYXBwbHkgdG8gamF2YWMgd2hlbiAke2phdmEuaG9tZV0gcG9pbnRzIGF0ICRKQVZBX0hPTUUvanJlCitncmFudCBjb2RlQmFzZSAiZmlsZToke2phdmEuaG9tZX0vLi4vbGliLy0iIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyBUaGVzZSBwZXJtaXNzaW9ucyBhcHBseSB0byBhbGwgc2hhcmVkIHN5c3RlbSBleHRlbnNpb25zIHdoZW4KKy8vICR7amF2YS5ob21lfSBwb2ludHMgYXQgJEpBVkFfSE9NRS9qcmUKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7amF2YS5ob21lfS9saWIvZXh0Ly0iIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisKKy8vID09PT09PT09PT0gQ0FUQUxJTkEgQ09ERSBQRVJNSVNTSU9OUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyBUaGVzZSBwZXJtaXNzaW9ucyBhcHBseSB0byB0aGUgbGF1bmNoZXIgY29kZQorZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtjYXRhbGluYS5ob21lfS9iaW4vY29tbW9ucy1sYXVuY2hlci5qYXIiIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyBUaGVzZSBwZXJtaXNzaW9ucyBhcHBseSB0byB0aGUgZGFlbW9uIGNvZGUKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7Y2F0YWxpbmEuaG9tZX0vYmluL2NvbW1vbnMtZGFlbW9uLmphciIgeworICAgICAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKy8vIFRoZXNlIHBlcm1pc3Npb25zIGFwcGx5IHRvIHRoZSBjb21tb25zLWxvZ2dpbmcgQVBJCitncmFudCBjb2RlQmFzZSAiZmlsZToke2NhdGFsaW5hLmhvbWV9L2Jpbi9jb21tb25zLWxvZ2dpbmctYXBpLmphciIgeworICAgICAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKy8vIFRoZXNlIHBlcm1pc3Npb25zIGFwcGx5IHRvIHRoZSBzZXJ2ZXIgc3RhcnR1cCBjb2RlCitncmFudCBjb2RlQmFzZSAiZmlsZToke2NhdGFsaW5hLmhvbWV9L2Jpbi9ib290c3RyYXAuamFyIiB7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKworLy8gVGhlc2UgcGVybWlzc2lvbnMgYXBwbHkgdG8gdGhlIEpNWCBzZXJ2ZXIKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7Y2F0YWxpbmEuaG9tZX0vYmluL2pteC5qYXIiIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyBUaGVzZSBwZXJtaXNzaW9ucyBhcHBseSB0byBKVUxJCitncmFudCBjb2RlQmFzZSAiZmlsZToke2NhdGFsaW5hLmhvbWV9L2Jpbi90b21jYXQtanVsaS5qYXIiIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyBUaGVzZSBwZXJtaXNzaW9ucyBhcHBseSB0byB0aGUgc2VydmxldCBBUEkgY2xhc3NlcworLy8gYW5kIHRob3NlIHRoYXQgYXJlIHNoYXJlZCBhY3Jvc3MgYWxsIGNsYXNzIGxvYWRlcnMKKy8vIGxvY2F0ZWQgaW4gdGhlICJjb21tb24iIGRpcmVjdG9yeQorZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtjYXRhbGluYS5ob21lfS9jb21tb24vLSIgeworICAgICAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKy8vIFRoZXNlIHBlcm1pc3Npb25zIGFwcGx5IHRvIHRoZSBjb250YWluZXIncyBjb3JlIGNvZGUsIHBsdXMgYW55IGFkZGl0aW9uYWwKKy8vIGxpYnJhcmllcyBpbnN0YWxsZWQgaW4gdGhlICJzZXJ2ZXIiIGRpcmVjdG9yeQorZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtjYXRhbGluYS5ob21lfS9zZXJ2ZXIvLSIgeworICAgICAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKy8vIFRoZSBwZXJtaXNzaW9ucyBncmFudGVkIHRvIHRoZSBiYWxhbmNlciBXRUItSU5GL2NsYXNzZXMgYW5kIFdFQi1JTkYvbGliIGRpcmVjdG9yeQorZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtjYXRhbGluYS5ob21lfS93ZWJhcHBzL2JhbGFuY2VyLy0iIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLm9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIiOworICAgICAgICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzQ2xhc3NJblBhY2thZ2Uub3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci4qIjsKK307CisvLyA9PT09PT09PT09IFdFQiBBUFBMSUNBVElPTiBQRVJNSVNTSU9OUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gVGhlc2UgcGVybWlzc2lvbnMgYXJlIGdyYW50ZWQgYnkgZGVmYXVsdCB0byBhbGwgd2ViIGFwcGxpY2F0aW9ucworLy8gSW4gYWRkaXRpb24sIGEgd2ViIGFwcGxpY2F0aW9uIHdpbGwgYmUgZ2l2ZW4gYSByZWFkIEZpbGVQZXJtaXNzaW9uCisvLyBhbmQgSm5kaVBlcm1pc3Npb24gZm9yIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW4gaXRzIGRvY3VtZW50IHJvb3QuCitncmFudCB7IAorICAgIC8vIFJlcXVpcmVkIGZvciBKTkRJIGxvb2t1cCBvZiBuYW1lZCBKREJDIERhdGFTb3VyY2UncyBhbmQKKyAgICAvLyBqYXZhbWFpbCBuYW1lZCBNaW1lUGFydCBEYXRhU291cmNlIHVzZWQgdG8gc2VuZCBtYWlsCisgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLmhvbWUiLCAicmVhZCI7CisgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLm5hbWluZy4qIiwgInJlYWQiOworICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YXguc3FsLioiLCAicmVhZCI7CisKKyAgICAvLyBPUyBTcGVjaWZpYyBwcm9wZXJ0aWVzIHRvIGFsbG93IHJlYWQgYWNjZXNzCisgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJvcy5uYW1lIiwgInJlYWQiOworICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAib3MudmVyc2lvbiIsICJyZWFkIjsKKyAgICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIm9zLmFyY2giLCAicmVhZCI7CisgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJmaWxlLnNlcGFyYXRvciIsICJyZWFkIjsKKyAgICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gInBhdGguc2VwYXJhdG9yIiwgInJlYWQiOworICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAibGluZS5zZXBhcmF0b3IiLCAicmVhZCI7CisKKyAgICAvLyBKVk0gcHJvcGVydGllcyB0byBhbGxvdyByZWFkIGFjY2VzcworICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52ZXJzaW9uIiwgInJlYWQiOworICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52ZW5kb3IiLCAicmVhZCI7CisgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnZlbmRvci51cmwiLCAicmVhZCI7CisgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLmNsYXNzLnZlcnNpb24iLCAicmVhZCI7CisgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnNwZWNpZmljYXRpb24udmVyc2lvbiIsICJyZWFkIjsKKyAgICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEuc3BlY2lmaWNhdGlvbi52ZW5kb3IiLCAicmVhZCI7CisgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnNwZWNpZmljYXRpb24ubmFtZSIsICJyZWFkIjsKKworICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52bS5zcGVjaWZpY2F0aW9uLnZlcnNpb24iLCAicmVhZCI7CisgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnZtLnNwZWNpZmljYXRpb24udmVuZG9yIiwgInJlYWQiOworICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52bS5zcGVjaWZpY2F0aW9uLm5hbWUiLCAicmVhZCI7CisgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnZtLnZlcnNpb24iLCAicmVhZCI7CisgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnZtLnZlbmRvciIsICJyZWFkIjsKKyAgICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEudm0ubmFtZSIsICJyZWFkIjsKKworICAgIC8vIFJlcXVpcmVkIGZvciBPcGVuSk1YCisgICAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImdldEF0dHJpYnV0ZSI7CisKKyAgICAvLyBBbGxvdyByZWFkIG9mIEpBWFAgY29tcGxpYW50IFhNTCBwYXJzZXIgZGVidWcKKyAgICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImpheHAuZGVidWciLCAicmVhZCI7CisKKyAgICAvLyBQcmVjb21waWxlZCBKU1BzIG5lZWQgYWNjZXNzIHRvIHRoaXMgcGFja2FnZS4KKyAgICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzQ2xhc3NJblBhY2thZ2Uub3JnLmFwYWNoZS5qYXNwZXIucnVudGltZSI7CisgICAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuKiI7CisKKyAgICAvLyBQcmVjb21waWxlZCBKU1BzIG5lZWQgYWNjZXNzIHRvIHRoaXMgc3lzdGVtIHByb3BlcnR5LgorICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAib3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Cb2R5Q29udGVudEltcGwuTElNSVRfQlVGRkVSIiwgInJlYWQiOworfTsKKworCisvLyBZb3UgY2FuIGFzc2lnbiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRvIHBhcnRpY3VsYXIgd2ViIGFwcGxpY2F0aW9ucyBieQorLy8gYWRkaW5nIGFkZGl0aW9uYWwgImdyYW50IiBlbnRyaWVzIGhlcmUsIGJhc2VkIG9uIHRoZSBjb2RlIGJhc2UgZm9yIHRoYXQKKy8vIGFwcGxpY2F0aW9uLCAvV0VCLUlORi9jbGFzc2VzLywgb3IgL1dFQi1JTkYvbGliLyBqYXIgZmlsZXMuCisvLworLy8gRGlmZmVyZW50IHBlcm1pc3Npb25zIGNhbiBiZSBncmFudGVkIHRvIEpTUCBwYWdlcywgY2xhc3NlcyBsb2FkZWQgZnJvbQorLy8gdGhlIC9XRUItSU5GL2NsYXNzZXMvIGRpcmVjdG9yeSwgYWxsIGphciBmaWxlcyBpbiB0aGUgL1dFQi1JTkYvbGliLworLy8gZGlyZWN0b3J5LCBvciBldmVuIHRvIGluZGl2aWR1YWwgamFyIGZpbGVzIGluIHRoZSAvV0VCLUlORi9saWIvIGRpcmVjdG9yeS4KKy8vCisvLyBGb3IgaW5zdGFuY2UsIGFzc3VtZSB0aGF0IHRoZSBzdGFuZGFyZCAiZXhhbXBsZXMiIGFwcGxpY2F0aW9uCisvLyBpbmNsdWRlZCBhIEpEQkMgZHJpdmVyIHRoYXQgbmVlZGVkIHRvIGVzdGFibGlzaCBhIG5ldHdvcmsgY29ubmVjdGlvbiB0byB0aGUKKy8vIGNvcnJlc3BvbmRpbmcgZGF0YWJhc2UgYW5kIHVzZWQgdGhlIHNjcmFwZSB0YWdsaWIgdG8gZ2V0IHRoZSB3ZWF0aGVyIGZyb20KKy8vIHRoZSBOT0FBIHdlYiBzZXJ2ZXIuICBZb3UgbWlnaHQgY3JlYXRlIGEgImdyYW50IiBlbnRyaWVzIGxpa2UgdGhpczoKKy8vCisvLyBUaGUgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byB0aGUgY29udGV4dCByb290IGRpcmVjdG9yeSBhcHBseSB0byBKU1AgcGFnZXMuCisvLyBncmFudCBjb2RlQmFzZSAiZmlsZToke2NhdGFsaW5hLmhvbWV9L3dlYmFwcHMvZXhhbXBsZXMvLSIgeworLy8gICAgICBwZXJtaXNzaW9uIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24gImRiaG9zdC5teWNvbXBhbnkuY29tOjU0MzIiLCAiY29ubmVjdCI7CisvLyAgICAgIHBlcm1pc3Npb24gamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbiAiKi5ub2FhLmdvdjo4MCIsICJjb25uZWN0IjsKKy8vIH07CisvLworLy8gVGhlIHBlcm1pc3Npb25zIGdyYW50ZWQgdG8gdGhlIGNvbnRleHQgV0VCLUlORi9jbGFzc2VzIGRpcmVjdG9yeQorLy8gZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtjYXRhbGluYS5ob21lfS93ZWJhcHBzL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy8tIiB7CisvLyB9OworLy8KKy8vIFRoZSBwZXJtaXNzaW9uIGdyYW50ZWQgdG8geW91ciBKREJDIGRyaXZlcgorLy8gZ3JhbnQgY29kZUJhc2UgImphcjpmaWxlOiR7Y2F0YWxpbmEuaG9tZX0vd2ViYXBwcy9leGFtcGxlcy9XRUItSU5GL2xpYi9kcml2ZXIuamFyIS8tIiB7CisvLyAgICAgIHBlcm1pc3Npb24gamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbiAiZGJob3N0Lm15Y29tcGFueS5jb206NTQzMiIsICJjb25uZWN0IjsKKy8vIH07CisvLyBUaGUgcGVybWlzc2lvbiBncmFudGVkIHRvIHRoZSBzY3JhcGUgdGFnbGliCisvLyBncmFudCBjb2RlQmFzZSAiamFyOmZpbGU6JHtjYXRhbGluYS5ob21lfS93ZWJhcHBzL2V4YW1wbGVzL1dFQi1JTkYvbGliL3NjcmFwZS5qYXIhLy0iIHsKKy8vICAgICAgcGVybWlzc2lvbiBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uICIqLm5vYWEuZ292OjgwIiwgImNvbm5lY3QiOworLy8gfTsKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9jb25mL2NhdGFsaW5hLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvY2F0YWxpbmEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGZiZTlkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9jb25mL2NhdGFsaW5hLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2NiBAQAorIworIyBMaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBwYWNrYWdlcyB0aGF0IHN0YXJ0IHdpdGggb3IgZXF1YWwgdGhpcyBzdHJpbmcKKyMgd2lsbCBjYXVzZSBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gd2hlbgorIyBwYXNzZWQgdG8gY2hlY2tQYWNrYWdlQWNjZXNzIHVubGVzcyB0aGUKKyMgY29ycmVzcG9uZGluZyBSdW50aW1lUGVybWlzc2lvbiAoImFjY2Vzc0NsYXNzSW5QYWNrYWdlLiIrcGFja2FnZSkgaGFzCisjIGJlZW4gZ3JhbnRlZC4KK3BhY2thZ2UuYWNjZXNzPXN1bi4sb3JnLmFwYWNoZS5jYXRhbGluYS4sb3JnLmFwYWNoZS5jb3lvdGUuLG9yZy5hcGFjaGUudG9tY2F0LixvcmcuYXBhY2hlLmphc3Blci4sc3VuLmJlYW5zLgorIworIyBMaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBwYWNrYWdlcyB0aGF0IHN0YXJ0IHdpdGggb3IgZXF1YWwgdGhpcyBzdHJpbmcKKyMgd2lsbCBjYXVzZSBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gd2hlbgorIyBwYXNzZWQgdG8gY2hlY2tQYWNrYWdlRGVmaW5pdGlvbiB1bmxlc3MgdGhlCisjIGNvcnJlc3BvbmRpbmcgUnVudGltZVBlcm1pc3Npb24gKCJkZWZpbmVDbGFzc0luUGFja2FnZS4iK3BhY2thZ2UpIGhhcworIyBiZWVuIGdyYW50ZWQuCisjCisjIGJ5IGRlZmF1bHQsIG5vIHBhY2thZ2VzIGFyZSByZXN0cmljdGVkIGZvciBkZWZpbml0aW9uLCBhbmQgbm9uZSBvZgorIyB0aGUgY2xhc3MgbG9hZGVycyBzdXBwbGllZCB3aXRoIHRoZSBKREsgY2FsbCBjaGVja1BhY2thZ2VEZWZpbml0aW9uLgorIworcGFja2FnZS5kZWZpbml0aW9uPXN1bi4samF2YS4sb3JnLmFwYWNoZS5jYXRhbGluYS4sb3JnLmFwYWNoZS5jb3lvdGUuLG9yZy5hcGFjaGUudG9tY2F0LixvcmcuYXBhY2hlLmphc3Blci4KKworIworIworIyBMaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBwYXRocyBkZWZpbmluZyB0aGUgY29udGVudHMgb2YgdGhlICJjb21tb24iIAorIyBjbGFzc2xvYWRlci4gUHJlZml4ZXMgc2hvdWxkIGJlIHVzZWQgdG8gZGVmaW5lIHdoYXQgaXMgdGhlIHJlcG9zaXRvcnkgdHlwZS4KKyMgUGF0aCBtYXkgYmUgcmVsYXRpdmUgdG8gdGhlIENBVEFMSU5BX0hPTUUgb3IgQ0FUQUxJTkFfQkFTRSBwYXRoIG9yIGFic29sdXRlLgorIyBJZiBsZWZ0IGFzIGJsYW5rLHRoZSBKVk0gc3lzdGVtIGxvYWRlciB3aWxsIGJlIHVzZWQgYXMgQ2F0YWxpbmEncyAiY29tbW9uIiAKKyMgbG9hZGVyLgorIyBFeGFtcGxlczoKKyMgICAgICJmb28iOiBBZGQgdGhpcyBmb2xkZXIgYXMgYSBjbGFzcyByZXBvc2l0b3J5CisjICAgICAiZm9vLyouamFyIjogQWRkIGFsbCB0aGUgSkFScyBvZiB0aGUgc3BlY2lmaWVkIGZvbGRlciBhcyBjbGFzcyAKKyMgICAgICAgICAgICAgICAgICByZXBvc2l0b3JpZXMKKyMgICAgICJmb28vYmFyLmphciI6IEFkZCBiYXIuamFyIGFzIGEgY2xhc3MgcmVwb3NpdG9yeQorY29tbW9uLmxvYWRlcj0ke2NhdGFsaW5hLmhvbWV9L2NvbW1vbi9jbGFzc2VzLCR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2kxOG4vKi5qYXIsJHtjYXRhbGluYS5ob21lfS9jb21tb24vZW5kb3JzZWQvKi5qYXIsJHtjYXRhbGluYS5ob21lfS9jb21tb24vbGliLyouamFyCisKKyMKKyMgTGlzdCBvZiBjb21tYS1zZXBhcmF0ZWQgcGF0aHMgZGVmaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSAic2VydmVyIiAKKyMgY2xhc3Nsb2FkZXIuIFByZWZpeGVzIHNob3VsZCBiZSB1c2VkIHRvIGRlZmluZSB3aGF0IGlzIHRoZSByZXBvc2l0b3J5IHR5cGUuCisjIFBhdGggbWF5IGJlIHJlbGF0aXZlIHRvIHRoZSBDQVRBTElOQV9IT01FIG9yIENBVEFMSU5BX0JBU0UgcGF0aCBvciBhYnNvbHV0ZS4KKyMgSWYgbGVmdCBhcyBibGFuaywgdGhlICJjb21tb24iIGxvYWRlciB3aWxsIGJlIHVzZWQgYXMgQ2F0YWxpbmEncyAic2VydmVyIiAKKyMgbG9hZGVyLgorIyBFeGFtcGxlczoKKyMgICAgICJmb28iOiBBZGQgdGhpcyBmb2xkZXIgYXMgYSBjbGFzcyByZXBvc2l0b3J5CisjICAgICAiZm9vLyouamFyIjogQWRkIGFsbCB0aGUgSkFScyBvZiB0aGUgc3BlY2lmaWVkIGZvbGRlciBhcyBjbGFzcyAKKyMgICAgICAgICAgICAgICAgICByZXBvc2l0b3JpZXMKKyMgICAgICJmb28vYmFyLmphciI6IEFkZCBiYXIuamFyIGFzIGEgY2xhc3MgcmVwb3NpdG9yeQorc2VydmVyLmxvYWRlcj0ke2NhdGFsaW5hLmhvbWV9L3NlcnZlci9jbGFzc2VzLCR7Y2F0YWxpbmEuaG9tZX0vc2VydmVyL2xpYi8qLmphcgorCisjCisjIExpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHBhdGhzIGRlZmluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgInNoYXJlZCIgCisjIGNsYXNzbG9hZGVyLiBQcmVmaXhlcyBzaG91bGQgYmUgdXNlZCB0byBkZWZpbmUgd2hhdCBpcyB0aGUgcmVwb3NpdG9yeSB0eXBlLgorIyBQYXRoIG1heSBiZSByZWxhdGl2ZSB0byB0aGUgQ0FUQUxJTkFfQkFTRSBwYXRoIG9yIGFic29sdXRlLiBJZiBsZWZ0IGFzIGJsYW5rLAorIyB0aGUgImNvbW1vbiIgbG9hZGVyIHdpbGwgYmUgdXNlZCBhcyBDYXRhbGluYSdzICJzaGFyZWQiIGxvYWRlci4KKyMgRXhhbXBsZXM6CisjICAgICAiZm9vIjogQWRkIHRoaXMgZm9sZGVyIGFzIGEgY2xhc3MgcmVwb3NpdG9yeQorIyAgICAgImZvby8qLmphciI6IEFkZCBhbGwgdGhlIEpBUnMgb2YgdGhlIHNwZWNpZmllZCBmb2xkZXIgYXMgY2xhc3MgCisjICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yaWVzCisjICAgICAiZm9vL2Jhci5qYXIiOiBBZGQgYmFyLmphciBhcyBhIGNsYXNzIHJlcG9zaXRvcnkgCisjIFBsZWFzZSBub3RlIHRoYXQgZm9yIGluZGl2aWR1YWwgamFyIGZpbGVzLCBlLmcuIGJhci5qYXIsIHlvdSBuZWVkIHRoZSBVUkwgZm9ybQorIyBzdGFydGluZyB3aXRoIGZpbGU6Lgorc2hhcmVkLmxvYWRlcj0ke2NhdGFsaW5hLmJhc2V9L3NoYXJlZC9jbGFzc2VzLCR7Y2F0YWxpbmEuYmFzZX0vc2hhcmVkL2xpYi8qLmphcgorCisjCisjIFN0cmluZyBjYWNoZSBjb25maWd1cmF0aW9uLgordG9tY2F0LnV0aWwuYnVmLlN0cmluZ0NhY2hlLmJ5dGUuZW5hYmxlZD10cnVlCisjdG9tY2F0LnV0aWwuYnVmLlN0cmluZ0NhY2hlLmNoYXIuZW5hYmxlZD10cnVlCisjdG9tY2F0LnV0aWwuYnVmLlN0cmluZ0NhY2hlLnRyYWluVGhyZXNob2xkPTUwMDAwMAorI3RvbWNhdC51dGlsLmJ1Zi5TdHJpbmdDYWNoZS5jYWNoZVNpemU9NTAwMApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9jb25mL2NvbnRleHQueG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9jb25mL2NvbnRleHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MDRhYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvY29udGV4dC54bWwKQEAgLTAsMCArMSwxMiBAQAorPCEtLSBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIHdpbGwgYmUgbG9hZGVkIGZvciBlYWNoIHdlYiBhcHBsaWNhdGlvbiAtLT4KKzxDb250ZXh0PgorCisgICAgPCEtLSBEZWZhdWx0IHNldCBvZiBtb25pdG9yZWQgcmVzb3VyY2VzIC0tPgorICAgIDxXYXRjaGVkUmVzb3VyY2U+V0VCLUlORi93ZWIueG1sPC9XYXRjaGVkUmVzb3VyY2U+CisJCisgICAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBkaXNhYmxlIHNlc3Npb24gcGVyc2lzdGVuY2UgYWNyb3NzIFRvbWNhdCByZXN0YXJ0cyAtLT4KKyAgICA8IS0tCisgICAgPE1hbmFnZXIgcGF0aG5hbWU9IiIgLz4KKyAgICAtLT4KKworPC9Db250ZXh0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvY29uZi9zZXJ2ZXItbWluaW1hbC54bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvc2VydmVyLW1pbmltYWwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNTQyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvc2VydmVyLW1pbmltYWwueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzxTZXJ2ZXIgcG9ydD0iODAwNSIgc2h1dGRvd249IlNIVVRET1dOIj4KKworICA8R2xvYmFsTmFtaW5nUmVzb3VyY2VzPgorICAgIDwhLS0gVXNlZCBieSBNYW5hZ2VyIHdlYmFwcCAtLT4KKyAgICA8UmVzb3VyY2UgbmFtZT0iVXNlckRhdGFiYXNlIiBhdXRoPSJDb250YWluZXIiCisgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlIgorICAgICAgIGRlc2NyaXB0aW9uPSJVc2VyIGRhdGFiYXNlIHRoYXQgY2FuIGJlIHVwZGF0ZWQgYW5kIHNhdmVkIgorICAgICAgICAgICBmYWN0b3J5PSJvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLk1lbW9yeVVzZXJEYXRhYmFzZUZhY3RvcnkiCisgICAgICAgICAgcGF0aG5hbWU9ImNvbmYvdG9tY2F0LXVzZXJzLnhtbCIgLz4KKyAgPC9HbG9iYWxOYW1pbmdSZXNvdXJjZXM+CisKKyAgPFNlcnZpY2UgbmFtZT0iQ2F0YWxpbmEiPgorICAgIDxDb25uZWN0b3IgcG9ydD0iODA4MCIgLz4KKworICAgIDwhLS0gVGhpcyBpcyBoZXJlIGZvciBjb21wYXRpYmlsaXR5IG9ubHksIG5vdCByZXF1aXJlZCAtLT4KKyAgICA8Q29ubmVjdG9yIHBvcnQ9IjgwMDkiIHByb3RvY29sPSJBSlAvMS4zIiAvPgorCisgICAgPEVuZ2luZSBuYW1lPSJDYXRhbGluYSIgZGVmYXVsdEhvc3Q9ImxvY2FsaG9zdCI+CisgICAgICA8UmVhbG0gY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLlVzZXJEYXRhYmFzZVJlYWxtIgorICAgICAgICAgICAgIHJlc291cmNlTmFtZT0iVXNlckRhdGFiYXNlIiAvPgorICAgICAgPEhvc3QgbmFtZT0ibG9jYWxob3N0IiBhcHBCYXNlPSJ3ZWJhcHBzIiAvPgorICAgIDwvRW5naW5lPgorICAgIAorICA8L1NlcnZpY2U+Cis8L1NlcnZlcj4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvY29uZi9zZXJ2ZXIueG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9jb25mL3NlcnZlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkOGYxMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvY29uZi9zZXJ2ZXIueG1sCkBAIC0wLDAgKzEsMzc0IEBACis8IS0tIEV4YW1wbGUgU2VydmVyIENvbmZpZ3VyYXRpb24gRmlsZSAtLT4KKzwhLS0gTm90ZSB0aGF0IGNvbXBvbmVudCBlbGVtZW50cyBhcmUgbmVzdGVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlaXIKKyAgICAgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcHMgd2l0aCBlYWNoIG90aGVyIC0tPgorCis8IS0tIEEgIlNlcnZlciIgaXMgYSBzaW5nbGV0b24gZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIGVudGlyZSBKVk0sCisgICAgIHdoaWNoIG1heSBjb250YWluIG9uZSBvciBtb3JlICJTZXJ2aWNlIiBpbnN0YW5jZXMuICBUaGUgU2VydmVyCisgICAgIGxpc3RlbnMgZm9yIGEgc2h1dGRvd24gY29tbWFuZCBvbiB0aGUgaW5kaWNhdGVkIHBvcnQuCisKKyAgICAgTm90ZTogIEEgIlNlcnZlciIgaXMgbm90IGl0c2VsZiBhICJDb250YWluZXIiLCBzbyB5b3UgbWF5IG5vdAorICAgICBkZWZpbmUgc3ViY29tcG9uZW50cyBzdWNoIGFzICJWYWx2ZXMiIG9yICJMb2dnZXJzIiBhdCB0aGlzIGxldmVsLgorIC0tPgorCis8U2VydmVyIHBvcnQ9IjgwMDUiIHNodXRkb3duPSJTSFVURE9XTiI+CisKKyAgPCEtLSBDb21tZW50IHRoZXNlIGVudHJpZXMgb3V0IHRvIGRpc2FibGUgSk1YIE1CZWFucyBzdXBwb3J0IHVzZWQgZm9yIHRoZSAKKyAgICAgICBhZG1pbmlzdHJhdGlvbiB3ZWIgYXBwbGljYXRpb24gLS0+CisgIDxMaXN0ZW5lciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5BcHJMaWZlY3ljbGVMaXN0ZW5lciIgLz4KKyAgPExpc3RlbmVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIiIC8+CisgIDxMaXN0ZW5lciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLkdsb2JhbFJlc291cmNlc0xpZmVjeWNsZUxpc3RlbmVyIiAvPgorICA8TGlzdGVuZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlQ29uZmlnTGlmZWN5Y2xlTGlzdGVuZXIiLz4KKworICA8IS0tIEdsb2JhbCBKTkRJIHJlc291cmNlcyAtLT4KKyAgPEdsb2JhbE5hbWluZ1Jlc291cmNlcz4KKworICAgIDwhLS0gVGVzdCBlbnRyeSBmb3IgZGVtb25zdHJhdGlvbiBwdXJwb3NlcyAtLT4KKyAgICA8RW52aXJvbm1lbnQgbmFtZT0ic2ltcGxlVmFsdWUiIHR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIiB2YWx1ZT0iMzAiLz4KKworICAgIDwhLS0gRWRpdGFibGUgdXNlciBkYXRhYmFzZSB0aGF0IGNhbiBhbHNvIGJlIHVzZWQgYnkKKyAgICAgICAgIFVzZXJEYXRhYmFzZVJlYWxtIHRvIGF1dGhlbnRpY2F0ZSB1c2VycyAtLT4KKyAgICA8UmVzb3VyY2UgbmFtZT0iVXNlckRhdGFiYXNlIiBhdXRoPSJDb250YWluZXIiCisgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlIgorICAgICAgIGRlc2NyaXB0aW9uPSJVc2VyIGRhdGFiYXNlIHRoYXQgY2FuIGJlIHVwZGF0ZWQgYW5kIHNhdmVkIgorICAgICAgICAgICBmYWN0b3J5PSJvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLk1lbW9yeVVzZXJEYXRhYmFzZUZhY3RvcnkiCisgICAgICAgICAgcGF0aG5hbWU9ImNvbmYvdG9tY2F0LXVzZXJzLnhtbCIgLz4KKworICA8L0dsb2JhbE5hbWluZ1Jlc291cmNlcz4KKworICA8IS0tIEEgIlNlcnZpY2UiIGlzIGEgY29sbGVjdGlvbiBvZiBvbmUgb3IgbW9yZSAiQ29ubmVjdG9ycyIgdGhhdCBzaGFyZQorICAgICAgIGEgc2luZ2xlICJDb250YWluZXIiIChhbmQgdGhlcmVmb3JlIHRoZSB3ZWIgYXBwbGljYXRpb25zIHZpc2libGUKKyAgICAgICB3aXRoaW4gdGhhdCBDb250YWluZXIpLiAgTm9ybWFsbHksIHRoYXQgQ29udGFpbmVyIGlzIGFuICJFbmdpbmUiLAorICAgICAgIGJ1dCB0aGlzIGlzIG5vdCByZXF1aXJlZC4KKworICAgICAgIE5vdGU6ICBBICJTZXJ2aWNlIiBpcyBub3QgaXRzZWxmIGEgIkNvbnRhaW5lciIsIHNvIHlvdSBtYXkgbm90CisgICAgICAgZGVmaW5lIHN1YmNvbXBvbmVudHMgc3VjaCBhcyAiVmFsdmVzIiBvciAiTG9nZ2VycyIgYXQgdGhpcyBsZXZlbC4KKyAgIC0tPgorCisgIDwhLS0gRGVmaW5lIHRoZSBUb21jYXQgU3RhbmQtQWxvbmUgU2VydmljZSAtLT4KKyAgPFNlcnZpY2UgbmFtZT0iQ2F0YWxpbmEiPgorCisgICAgPCEtLSBBICJDb25uZWN0b3IiIHJlcHJlc2VudHMgYW4gZW5kcG9pbnQgYnkgd2hpY2ggcmVxdWVzdHMgYXJlIHJlY2VpdmVkCisgICAgICAgICBhbmQgcmVzcG9uc2VzIGFyZSByZXR1cm5lZC4gIEVhY2ggQ29ubmVjdG9yIHBhc3NlcyByZXF1ZXN0cyBvbiB0byB0aGUKKyAgICAgICAgIGFzc29jaWF0ZWQgIkNvbnRhaW5lciIgKG5vcm1hbGx5IGFuIEVuZ2luZSkgZm9yIHByb2Nlc3NpbmcuCisKKyAgICAgICAgIEJ5IGRlZmF1bHQsIGEgbm9uLVNTTCBIVFRQLzEuMSBDb25uZWN0b3IgaXMgZXN0YWJsaXNoZWQgb24gcG9ydCA4MDgwLgorICAgICAgICAgWW91IGNhbiBhbHNvIGVuYWJsZSBhbiBTU0wgSFRUUC8xLjEgQ29ubmVjdG9yIG9uIHBvcnQgODQ0MyBieQorICAgICAgICAgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbnMgYmVsb3cgYW5kIHVuY29tbWVudGluZyB0aGUgc2Vjb25kIENvbm5lY3RvcgorICAgICAgICAgZW50cnkuICBTU0wgc3VwcG9ydCByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHN0ZXBzIChzZWUgdGhlIFNTTCBDb25maWcKKyAgICAgICAgIEhPV1RPIGluIHRoZSBUb21jYXQgNSBkb2N1bWVudGF0aW9uIGJ1bmRsZSBmb3IgbW9yZSBkZXRhaWxlZAorICAgICAgICAgaW5zdHJ1Y3Rpb25zKToKKyAgICAgICAgICogSWYgeW91ciBKREsgdmVyc2lvbiAxLjMgb3IgcHJpb3IsIGRvd25sb2FkIGFuZCBpbnN0YWxsIEpTU0UgMS4wLjIgb3IKKyAgICAgICAgICAgbGF0ZXIsIGFuZCBwdXQgdGhlIEpBUiBmaWxlcyBpbnRvICIkSkFWQV9IT01FL2pyZS9saWIvZXh0Ii4KKyAgICAgICAgICogRXhlY3V0ZToKKyAgICAgICAgICAgICAlSkFWQV9IT01FJVxiaW5ca2V5dG9vbCAtZ2Vua2V5IC1hbGlhcyB0b21jYXQgLWtleWFsZyBSU0EgKFdpbmRvd3MpCisgICAgICAgICAgICAgJEpBVkFfSE9NRS9iaW4va2V5dG9vbCAtZ2Vua2V5IC1hbGlhcyB0b21jYXQgLWtleWFsZyBSU0EgIChVbml4KQorICAgICAgICAgICB3aXRoIGEgcGFzc3dvcmQgdmFsdWUgb2YgImNoYW5nZWl0IiBmb3IgYm90aCB0aGUgY2VydGlmaWNhdGUgYW5kCisgICAgICAgICAgIHRoZSBrZXlzdG9yZSBpdHNlbGYuCisKKyAgICAgICAgIEJ5IGRlZmF1bHQsIEROUyBsb29rdXBzIGFyZSBlbmFibGVkIHdoZW4gYSB3ZWIgYXBwbGljYXRpb24gY2FsbHMKKyAgICAgICAgIHJlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpLiAgVGhpcyBjYW4gaGF2ZSBhbiBhZHZlcnNlIGltcGFjdCBvbgorICAgICAgICAgcGVyZm9ybWFuY2UsIHNvIHlvdSBjYW4gZGlzYWJsZSBpdCBieSBzZXR0aW5nIHRoZQorICAgICAgICAgImVuYWJsZUxvb2t1cHMiIGF0dHJpYnV0ZSB0byAiZmFsc2UiLiAgV2hlbiBETlMgbG9va3VwcyBhcmUgZGlzYWJsZWQsCisgICAgICAgICByZXF1ZXN0LmdldFJlbW90ZUhvc3QoKSB3aWxsIHJldHVybiB0aGUgU3RyaW5nIHZlcnNpb24gb2YgdGhlCisgICAgICAgICBJUCBhZGRyZXNzIG9mIHRoZSByZW1vdGUgY2xpZW50LgorICAgIC0tPgorCisgICAgPCEtLSBEZWZpbmUgYSBub24tU1NMIEhUVFAvMS4xIENvbm5lY3RvciBvbiBwb3J0IDgwODAgLS0+CisgICAgPENvbm5lY3RvciBwb3J0PSI4MDgwIiBtYXhIdHRwSGVhZGVyU2l6ZT0iODE5MiIKKyAgICAgICAgICAgICAgIG1heFRocmVhZHM9IjE1MCIgbWluU3BhcmVUaHJlYWRzPSIyNSIgbWF4U3BhcmVUaHJlYWRzPSI3NSIKKyAgICAgICAgICAgICAgIGVuYWJsZUxvb2t1cHM9ImZhbHNlIiByZWRpcmVjdFBvcnQ9Ijg0NDMiIGFjY2VwdENvdW50PSIxMDAiCisgICAgICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dD0iMjAwMDAiIGRpc2FibGVVcGxvYWRUaW1lb3V0PSJ0cnVlIiAvPgorICAgIDwhLS0gTm90ZSA6IFRvIGRpc2FibGUgY29ubmVjdGlvbiB0aW1lb3V0cywgc2V0IGNvbm5lY3Rpb25UaW1lb3V0IHZhbHVlCisgICAgIHRvIDAgLS0+CisJCisJPCEtLSBOb3RlIDogVG8gdXNlIGd6aXAgY29tcHJlc3Npb24geW91IGNvdWxkIHNldCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgOgorCQorCQkJICAgY29tcHJlc3Npb249Im9uIiAKKwkJCSAgIGNvbXByZXNzaW9uTWluU2l6ZT0iMjA0OCIgCisJCQkgICBub0NvbXByZXNzaW9uVXNlckFnZW50cz0iZ296aWxsYSwgdHJhdmlhdGEiIAorCQkJICAgY29tcHJlc3NhYmxlTWltZVR5cGU9InRleHQvaHRtbCx0ZXh0L3htbCIKKwktLT4KKworICAgIDwhLS0gRGVmaW5lIGEgU1NMIEhUVFAvMS4xIENvbm5lY3RvciBvbiBwb3J0IDg0NDMgLS0+CisgICAgPCEtLQorICAgIDxDb25uZWN0b3IgcG9ydD0iODQ0MyIgbWF4SHR0cEhlYWRlclNpemU9IjgxOTIiCisgICAgICAgICAgICAgICBtYXhUaHJlYWRzPSIxNTAiIG1pblNwYXJlVGhyZWFkcz0iMjUiIG1heFNwYXJlVGhyZWFkcz0iNzUiCisgICAgICAgICAgICAgICBlbmFibGVMb29rdXBzPSJmYWxzZSIgZGlzYWJsZVVwbG9hZFRpbWVvdXQ9InRydWUiCisgICAgICAgICAgICAgICBhY2NlcHRDb3VudD0iMTAwIiBzY2hlbWU9Imh0dHBzIiBzZWN1cmU9InRydWUiCisgICAgICAgICAgICAgICBjbGllbnRBdXRoPSJmYWxzZSIgc3NsUHJvdG9jb2w9IlRMUyIgLz4KKyAgICAtLT4KKworICAgIDwhLS0gRGVmaW5lIGFuIEFKUCAxLjMgQ29ubmVjdG9yIG9uIHBvcnQgODAwOSAtLT4KKyAgICA8Q29ubmVjdG9yIHBvcnQ9IjgwMDkiIAorICAgICAgICAgICAgICAgZW5hYmxlTG9va3Vwcz0iZmFsc2UiIHJlZGlyZWN0UG9ydD0iODQ0MyIgcHJvdG9jb2w9IkFKUC8xLjMiIC8+CisKKyAgICA8IS0tIERlZmluZSBhIFByb3hpZWQgSFRUUC8xLjEgQ29ubmVjdG9yIG9uIHBvcnQgODA4MiAtLT4KKyAgICA8IS0tIFNlZSBwcm94eSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIHRoaXMuIC0tPgorICAgIDwhLS0KKyAgICA8Q29ubmVjdG9yIHBvcnQ9IjgwODIiIAorICAgICAgICAgICAgICAgbWF4VGhyZWFkcz0iMTUwIiBtaW5TcGFyZVRocmVhZHM9IjI1IiBtYXhTcGFyZVRocmVhZHM9Ijc1IgorICAgICAgICAgICAgICAgZW5hYmxlTG9va3Vwcz0iZmFsc2UiIGFjY2VwdENvdW50PSIxMDAiIGNvbm5lY3Rpb25UaW1lb3V0PSIyMDAwMCIKKyAgICAgICAgICAgICAgIHByb3h5UG9ydD0iODAiIGRpc2FibGVVcGxvYWRUaW1lb3V0PSJ0cnVlIiAvPgorICAgIC0tPgorCisgICAgPCEtLSBBbiBFbmdpbmUgcmVwcmVzZW50cyB0aGUgZW50cnkgcG9pbnQgKHdpdGhpbiBDYXRhbGluYSkgdGhhdCBwcm9jZXNzZXMKKyAgICAgICAgIGV2ZXJ5IHJlcXVlc3QuICBUaGUgRW5naW5lIGltcGxlbWVudGF0aW9uIGZvciBUb21jYXQgc3RhbmQgYWxvbmUKKyAgICAgICAgIGFuYWx5emVzIHRoZSBIVFRQIGhlYWRlcnMgaW5jbHVkZWQgd2l0aCB0aGUgcmVxdWVzdCwgYW5kIHBhc3NlcyB0aGVtCisgICAgICAgICBvbiB0byB0aGUgYXBwcm9wcmlhdGUgSG9zdCAodmlydHVhbCBob3N0KS4gLS0+CisKKyAgICA8IS0tIFlvdSBzaG91bGQgc2V0IGp2bVJvdXRlIHRvIHN1cHBvcnQgbG9hZC1iYWxhbmNpbmcgdmlhIEFKUCBpZSA6CisgICAgPEVuZ2luZSBuYW1lPSJTdGFuZGFsb25lIiBkZWZhdWx0SG9zdD0ibG9jYWxob3N0IiBqdm1Sb3V0ZT0ianZtMSI+ICAgICAgICAgCisgICAgLS0+IAorICAgICAgICAgCisgICAgPCEtLSBEZWZpbmUgdGhlIHRvcCBsZXZlbCBjb250YWluZXIgaW4gb3VyIGNvbnRhaW5lciBoaWVyYXJjaHkgLS0+CisgICAgPEVuZ2luZSBuYW1lPSJDYXRhbGluYSIgZGVmYXVsdEhvc3Q9ImxvY2FsaG9zdCI+CisKKyAgICAgIDwhLS0gVGhlIHJlcXVlc3QgZHVtcGVyIHZhbHZlIGR1bXBzIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgICAgICAgdGhlIHJlcXVlc3QgaGVhZGVycyBhbmQgY29va2llcyB0aGF0IHdlcmUgcmVjZWl2ZWQsIGFuZCB0aGUgcmVzcG9uc2UKKyAgICAgICAgICAgaGVhZGVycyBhbmQgY29va2llcyB0aGF0IHdlcmUgc2VudCwgZm9yIGFsbCByZXF1ZXN0cyByZWNlaXZlZCBieQorICAgICAgICAgICB0aGlzIGluc3RhbmNlIG9mIFRvbWNhdC4gIElmIHlvdSBjYXJlIG9ubHkgYWJvdXQgcmVxdWVzdHMgdG8gYQorICAgICAgICAgICBwYXJ0aWN1bGFyIHZpcnR1YWwgaG9zdCwgb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLCBuZXN0IHRoaXMKKyAgICAgICAgICAgZWxlbWVudCBpbnNpZGUgdGhlIGNvcnJlc3BvbmRpbmcgPEhvc3Q+IG9yIDxDb250ZXh0PiBlbnRyeSBpbnN0ZWFkLgorCisgICAgICAgICAgIEZvciBhIHNpbWlsYXIgbWVjaGFuaXNtIHRoYXQgaXMgcG9ydGFibGUgdG8gYWxsIFNlcnZsZXQgMi40CisgICAgICAgICAgIGNvbnRhaW5lcnMsIGNoZWNrIG91dCB0aGUgIlJlcXVlc3REdW1wZXJGaWx0ZXIiIEZpbHRlciBpbiB0aGUKKyAgICAgICAgICAgZXhhbXBsZSBhcHBsaWNhdGlvbiAodGhlIHNvdXJjZSBmb3IgdGhpcyBmaWx0ZXIgbWF5IGJlIGZvdW5kIGluCisgICAgICAgICAgICIkQ0FUQUxJTkFfSE9NRS93ZWJhcHBzL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9maWx0ZXJzIikuCisKKyAgICAgICAgICAgTm90ZSB0aGF0IHRoaXMgVmFsdmUgdXNlcyB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZy4KKyAgICAgICAgICAgVGhpcyBtYXkgY2F1c2UgcHJvYmxlbXMgZm9yIGRldmVsb3BlcnMgaW4gYW5vdGhlciBlbmNvZGluZywgZS5nLgorICAgICAgICAgICBVVEYtOC4gIFVzZSB0aGUgUmVxdWVzdER1bXBlckZpbHRlciBpbnN0ZWFkLgorCisgICAgICAgICAgIEFsc28gbm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgVmFsdmUgd2lsbCB3cml0ZSBhIHRvbiBvZiBzdHVmZiB0byB5b3VyCisgICAgICAgICAgIGxvZ3MuICBUaGV5IGFyZSBsaWtlbHkgdG8gZ3JvdyBxdWl0ZSBsYXJnZS4gIFRoaXMgZXh0ZW5zaXZlIGxvZyB3cml0aW5nCisgICAgICAgICAgIHdpbGwgZGVmaW5pdGVseSBzbG93IGRvd24geW91ciBzZXJ2ZXIuCisKKyAgICAgICAgICAgUmVxdWVzdCBkdW1waW5nIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuICBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZworICAgICAgICAgICBlbGVtZW50IHRvIGVuYWJsZSBpdC4gLS0+CisgICAgICA8IS0tCisgICAgICA8VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZXF1ZXN0RHVtcGVyVmFsdmUiLz4KKyAgICAgIC0tPgorCisgICAgICA8IS0tIEJlY2F1c2UgdGhpcyBSZWFsbSBpcyBoZXJlLCBhbiBpbnN0YW5jZSB3aWxsIGJlIHNoYXJlZCBnbG9iYWxseSAtLT4KKworICAgICAgPCEtLSBUaGlzIFJlYWxtIHVzZXMgdGhlIFVzZXJEYXRhYmFzZSBjb25maWd1cmVkIGluIHRoZSBnbG9iYWwgSk5ESQorICAgICAgICAgICByZXNvdXJjZXMgdW5kZXIgdGhlIGtleSAiVXNlckRhdGFiYXNlIi4gIEFueSBlZGl0cworICAgICAgICAgICB0aGF0IGFyZSBwZXJmb3JtZWQgYWdhaW5zdCB0aGlzIFVzZXJEYXRhYmFzZSBhcmUgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgYXZhaWxhYmxlIGZvciB1c2UgYnkgdGhlIFJlYWxtLiAgLS0+CisgICAgICA8UmVhbG0gY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLlVzZXJEYXRhYmFzZVJlYWxtIgorICAgICAgICAgICAgIHJlc291cmNlTmFtZT0iVXNlckRhdGFiYXNlIi8+CisKKyAgICAgIDwhLS0gQ29tbWVudCBvdXQgdGhlIG9sZCByZWFsbSBidXQgbGVhdmUgaGVyZSBmb3Igbm93IGluIGNhc2Ugd2UKKyAgICAgICAgICAgbmVlZCB0byBnbyBiYWNrIHF1aWNrbHkgLS0+CisgICAgICA8IS0tCisgICAgICA8UmVhbG0gY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLk1lbW9yeVJlYWxtIiAvPgorICAgICAgLS0+CisKKyAgICAgIDwhLS0gUmVwbGFjZSB0aGUgYWJvdmUgUmVhbG0gd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0byBnZXQgYSBSZWFsbQorICAgICAgICAgICBzdG9yZWQgaW4gYSBkYXRhYmFzZSBhbmQgYWNjZXNzZWQgdmlhIEpEQkMgLS0+CisKKyAgICAgIDwhLS0KKyAgICAgIDxSZWFsbSAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpEQkNSZWFsbSIKKyAgICAgICAgICAgICBkcml2ZXJOYW1lPSJvcmcuZ2p0Lm1tLm15c3FsLkRyaXZlciIKKyAgICAgICAgICBjb25uZWN0aW9uVVJMPSJqZGJjOm15c3FsOi8vbG9jYWxob3N0L2F1dGhvcml0eSIKKyAgICAgICAgIGNvbm5lY3Rpb25OYW1lPSJ0ZXN0IiBjb25uZWN0aW9uUGFzc3dvcmQ9InRlc3QiCisgICAgICAgICAgICAgIHVzZXJUYWJsZT0idXNlcnMiIHVzZXJOYW1lQ29sPSJ1c2VyX25hbWUiIHVzZXJDcmVkQ29sPSJ1c2VyX3Bhc3MiCisgICAgICAgICAgdXNlclJvbGVUYWJsZT0idXNlcl9yb2xlcyIgcm9sZU5hbWVDb2w9InJvbGVfbmFtZSIgLz4KKyAgICAgIC0tPgorCisgICAgICA8IS0tCisgICAgICA8UmVhbG0gIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG0iCisgICAgICAgICAgICAgZHJpdmVyTmFtZT0ib3JhY2xlLmpkYmMuZHJpdmVyLk9yYWNsZURyaXZlciIKKyAgICAgICAgICBjb25uZWN0aW9uVVJMPSJqZGJjOm9yYWNsZTp0aGluOkBudHNlcnZlcjoxNTIxOk9SQ0wiCisgICAgICAgICBjb25uZWN0aW9uTmFtZT0ic2NvdHQiIGNvbm5lY3Rpb25QYXNzd29yZD0idGlnZXIiCisgICAgICAgICAgICAgIHVzZXJUYWJsZT0idXNlcnMiIHVzZXJOYW1lQ29sPSJ1c2VyX25hbWUiIHVzZXJDcmVkQ29sPSJ1c2VyX3Bhc3MiCisgICAgICAgICAgdXNlclJvbGVUYWJsZT0idXNlcl9yb2xlcyIgcm9sZU5hbWVDb2w9InJvbGVfbmFtZSIgLz4KKyAgICAgIC0tPgorCisgICAgICA8IS0tCisgICAgICA8UmVhbG0gIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG0iCisgICAgICAgICAgICAgZHJpdmVyTmFtZT0ic3VuLmpkYmMub2RiYy5KZGJjT2RiY0RyaXZlciIKKyAgICAgICAgICBjb25uZWN0aW9uVVJMPSJqZGJjOm9kYmM6Q0FUQUxJTkEiCisgICAgICAgICAgICAgIHVzZXJUYWJsZT0idXNlcnMiIHVzZXJOYW1lQ29sPSJ1c2VyX25hbWUiIHVzZXJDcmVkQ29sPSJ1c2VyX3Bhc3MiCisgICAgICAgICAgdXNlclJvbGVUYWJsZT0idXNlcl9yb2xlcyIgcm9sZU5hbWVDb2w9InJvbGVfbmFtZSIgLz4KKyAgICAgIC0tPgorCisgICAgICA8IS0tIERlZmluZSB0aGUgZGVmYXVsdCB2aXJ0dWFsIGhvc3QKKyAgICAgICAgICAgTm90ZTogWE1MIFNjaGVtYSB2YWxpZGF0aW9uIHdpbGwgbm90IHdvcmsgd2l0aCBYZXJjZXMgMi4yLgorICAgICAgIC0tPgorICAgICAgPEhvc3QgbmFtZT0ibG9jYWxob3N0IiBhcHBCYXNlPSJ3ZWJhcHBzIgorICAgICAgIHVucGFja1dBUnM9InRydWUiIGF1dG9EZXBsb3k9InRydWUiCisgICAgICAgeG1sVmFsaWRhdGlvbj0iZmFsc2UiIHhtbE5hbWVzcGFjZUF3YXJlPSJmYWxzZSI+CisKKyAgICAgICAgPCEtLSBEZWZpbmVzIGEgY2x1c3RlciBmb3IgdGhpcyBub2RlLAorICAgICAgICAgICAgIEJ5IGRlZmluaW5nIHRoaXMgZWxlbWVudCwgbWVhbnMgdGhhdCBldmVyeSBtYW5hZ2VyIHdpbGwgYmUgY2hhbmdlZC4KKyAgICAgICAgICAgICBTbyB3aGVuIHJ1bm5pbmcgYSBjbHVzdGVyLCBvbmx5IG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHdlYmFwcHMgaW4gdGhlcmUKKyAgICAgICAgICAgICB0aGF0IG5lZWQgdG8gYmUgY2x1c3RlcmVkIGFuZCByZW1vdmUgdGhlIG90aGVyIG9uZXMuCisgICAgICAgICAgICAgQSBjbHVzdGVyIGhhcyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisKKyAgICAgICAgICAgICBjbGFzc05hbWUgPSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsdXN0ZXIgY2xhc3MKKworICAgICAgICAgICAgIGNsdXN0ZXJOYW1lID0gYSBkZXNjcmlwdGl2ZSBuYW1lIGZvciB5b3VyIGNsdXN0ZXIsIGNhbiBiZSBhbnl0aGluZworCisgICAgICAgICAgICAgbWNhc3RBZGRyID0gdGhlIG11bHRpY2FzdCBhZGRyZXNzLCBoYXMgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCB0aGUgbm9kZXMKKworICAgICAgICAgICAgIG1jYXN0UG9ydCA9IHRoZSBtdWx0aWNhc3QgcG9ydCwgaGFzIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgdGhlIG5vZGVzCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgbWNhc3RCaW5kQWRkcmVzcyA9IGJpbmQgdGhlIG11bHRpY2FzdCBzb2NrZXQgdG8gYSBzcGVjaWZpYyBhZGRyZXNzCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgbWNhc3RUVEwgPSB0aGUgbXVsdGljYXN0IFRUTCBpZiB5b3Ugd2FudCB0byBsaW1pdCB5b3VyIGJyb2FkY2FzdAorICAgICAgICAgICAgIAorICAgICAgICAgICAgIG1jYXN0U29UaW1lb3V0ID0gdGhlIG11bHRpY2FzdCByZWFkdGltZW91dCAKKworICAgICAgICAgICAgIG1jYXN0RnJlcXVlbmN5ID0gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYmV0d2VlbiBzZW5kaW5nIGEgIkknbSBhbGl2ZSIgaGVhcnRiZWF0CisKKyAgICAgICAgICAgICBtY2FzdERyb3BUaW1lID0gdGhlIG51bWJlciBhIG1pbGxpc2Vjb25kcyBiZWZvcmUgYSBub2RlIGlzIGNvbnNpZGVyZWQgImRlYWQiIGlmIG5vIGhlYXJ0YmVhdCBpcyByZWNlaXZlZAorCisgICAgICAgICAgICAgdGNwVGhyZWFkQ291bnQgPSB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdG8gaGFuZGxlIGluY29taW5nIHJlcGxpY2F0aW9uIHJlcXVlc3RzLCBvcHRpbWFsIHdvdWxkIGJlIHRoZSBzYW1lIGFtb3VudCBvZiB0aHJlYWRzIGFzIG5vZGVzIAorCisgICAgICAgICAgICAgdGNwTGlzdGVuQWRkcmVzcyA9IHRoZSBsaXN0ZW4gYWRkcmVzcyAoYmluZCBhZGRyZXNzKSBmb3IgVENQIGNsdXN0ZXIgcmVxdWVzdCBvbiB0aGlzIGhvc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBjYXNlIG9mIG11bHRpcGxlIGV0aGVybmV0IGNhcmRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIG1lYW5zIHRoYXQgYWRkcmVzcyBiZWNvbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3RBZGRyZXNzKCkKKworICAgICAgICAgICAgIHRjcExpc3RlblBvcnQgPSB0aGUgdGNwIGxpc3RlbiBwb3J0CisKKyAgICAgICAgICAgICB0Y3BTZWxlY3RvclRpbWVvdXQgPSB0aGUgdGltZW91dCAobXMpIGZvciB0aGUgU2VsZWN0b3Iuc2VsZWN0KCkgbWV0aG9kIGluIGNhc2UgdGhlIE9TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGEgd2FrdXAgYnVnIGluIGphdmEubmlvLiBTZXQgdG8gMCBmb3Igbm8gdGltZW91dAorCisgICAgICAgICAgICAgcHJpbnRUb1NjcmVlbiA9IHRydWUgbWVhbnMgdGhhdCBtYW5hZ2VycyB3aWxsIGFsc28gcHJpbnQgdG8gc3RkLm91dAorCisgICAgICAgICAgICAgZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duID0gdHJ1ZSBtZWFucyB0aGF0IAorCisgICAgICAgICAgICAgdXNlRGlydHlGbGFnID0gdHJ1ZSBtZWFucyB0aGF0IHdlIG9ubHkgcmVwbGljYXRlIGEgc2Vzc2lvbiBhZnRlciBzZXRBdHRyaWJ1dGUscmVtb3ZlQXR0cmlidXRlIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBtZWFucyB0byByZXBsaWNhdGUgdGhlIHNlc3Npb24gYWZ0ZXIgZWFjaCByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG1lYW5zIHRoYXQgcmVwbGljYXRpb24gd291bGQgd29yayBmb3IgdGhlIGZvbGxvd2luZyBwaWVjZSBvZiBjb2RlOiAob25seSBmb3IgU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaE1hcCBtYXAgPSAoSGFzaE1hcClzZXNzaW9uLmdldEF0dHJpYnV0ZSgibWFwIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dCgia2V5IiwidmFsdWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlPgorICAgICAgICAgICAgIHJlcGxpY2F0aW9uTW9kZSA9IGNhbiBiZSBlaXRoZXIgJ3Bvb2xlZCcsICdzeW5jaHJvbm91cycgb3IgJ2FzeW5jaHJvbm91cycuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQb29sZWQgbWVhbnMgdGhhdCB0aGUgcmVwbGljYXRpb24gaGFwcGVucyB1c2luZyBzZXZlcmFsIHNvY2tldHMgaW4gYSBzeW5jaHJvbm91cyB3YXkuIEllLCB0aGUgZGF0YSBnZXRzIHJlcGxpY2F0ZWQsIHRoZW4gdGhlIHJlcXVlc3QgcmV0dXJuLiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSAnc3luY2hyb25vdXMnIHNldHRpbmcgZXhjZXB0IGl0IHVzZXMgYSBwb29sIG9mIHNvY2tldHMsIGhlbmNlIGl0IGlzIG11bHRpdGhyZWFkZWQuIFRoaXMgaXMgdGhlIGZhc3Rlc3QgYW5kIHNhZmVzdCBjb25maWd1cmF0aW9uLiBUbyB1c2UgdGhpcywgYWxzbyBpbmNyZWFzZSB0aGUgbnIgb2YgdGNwIHRocmVhZHMgdGhhdCB5b3UgaGF2ZSBkZWFsaW5nIHdpdGggcmVwbGljYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTeW5jaHJvbm91cyBtZWFucyB0aGF0IHRoZSB0aHJlYWQgdGhhdCBleGVjdXRlcyB0aGUgcmVxdWVzdCwgaXMgYWxzbyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQgdGhlIHJlcGxpY2F0ZXMgdGhlIGRhdGEgdG8gdGhlIG90aGVyIG5vZGVzLCBhbmQgd2lsbCBub3QgcmV0dXJuIHVudGlsIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzIGhhdmUgcmVjZWl2ZWQgdGhlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXN5bmNocm9ub3VzIG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBzcGVjaWZpYyAnc2VuZGVyJyB0aHJlYWQgZm9yIGVhY2ggY2x1c3RlciBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoZSByZXF1ZXN0IHRocmVhZCB3aWxsIHF1ZXVlIHRoZSByZXBsaWNhdGlvbiByZXF1ZXN0IGludG8gYSAic21hcnQiIHF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIHJldHVybiB0byB0aGUgY2xpZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAic21hcnQiIHF1ZXVlIGlzIGEgcXVldWUgd2hlcmUgd2hlbiBhIHNlc3Npb24gaXMgYWRkZWQgdG8gdGhlIHF1ZXVlLCBhbmQgdGhlIHNhbWUgc2Vzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgZXhpc3RzIGluIHRoZSBxdWV1ZSBmcm9tIGEgcHJldmlvdXMgcmVxdWVzdCwgdGhhdCBzZXNzaW9uIHdpbGwgYmUgcmVwbGFjZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcXVldWUgaW5zdGVhZCBvZiByZXBsaWNhdGluZyB0d28gcmVxdWVzdHMuIFRoaXMgYWxtb3N0IG5ldmVyIGhhcHBlbnMsIHVubGVzcyB0aGVyZSBpcyBhIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlIG5ldHdvcmsgZGVsYXkuCisgICAgICAgIC0tPiAgICAgICAgICAgICAKKyAgICAgICAgPCEtLQorICAgICAgICAgICAgV2hlbiBjb25maWd1cmluZyBmb3IgY2x1c3RlcmluZywgeW91IGFsc28gYWRkIGluIGEgdmFsdmUgdG8gY2F0Y2ggYWxsIHRoZSByZXF1ZXN0cworICAgICAgICAgICAgY29taW5nIGluLCBhdCB0aGUgZW5kIG9mIHRoZSByZXF1ZXN0LCB0aGUgc2Vzc2lvbiBtYXkgb3IgbWF5IG5vdCBiZSByZXBsaWNhdGVkLgorICAgICAgICAgICAgQSBzZXNzaW9uIGlzIHJlcGxpY2F0ZWQgaWYgYW5kIG9ubHkgaWYgYWxsIHRoZSBjb25kaXRpb25zIGFyZSBtZXQ6CisgICAgICAgICAgICAxLiB1c2VEaXJ0eUZsYWcgaXMgdHJ1ZSBvciBzZXRBdHRyaWJ1dGUgb3IgcmVtb3ZlQXR0cmlidXRlIGhhcyBiZWVuIGNhbGxlZCBBTkQKKyAgICAgICAgICAgIDIuIGEgc2Vzc2lvbiBleGlzdHMgKGhhcyBiZWVuIGNyZWF0ZWQpCisgICAgICAgICAgICAzLiB0aGUgcmVxdWVzdCBpcyBub3QgdHJhcHBlZCBieSB0aGUgImZpbHRlciIgYXR0cmlidXRlCisKKyAgICAgICAgICAgIFRoZSBmaWx0ZXIgYXR0cmlidXRlIGlzIHRvIGZpbHRlciBvdXQgcmVxdWVzdHMgdGhhdCBjb3VsZCBub3QgbW9kaWZ5IHRoZSBzZXNzaW9uLAorICAgICAgICAgICAgaGVuY2Ugd2UgZG9uJ3QgcmVwbGljYXRlIHRoZSBzZXNzaW9uIGFmdGVyIHRoZSBlbmQgb2YgdGhpcyByZXF1ZXN0LgorICAgICAgICAgICAgVGhlIGZpbHRlciBpcyBuZWdhdGl2ZSwgaWUsIGFueXRoaW5nIHlvdSBwdXQgaW4gdGhlIGZpbHRlciwgeW91IG1lYW4gdG8gZmlsdGVyIG91dCwKKyAgICAgICAgICAgIGllLCBubyByZXBsaWNhdGlvbiB3aWxsIGJlIGRvbmUgb24gcmVxdWVzdHMgdGhhdCBtYXRjaCBvbmUgb2YgdGhlIGZpbHRlcnMuCisgICAgICAgICAgICBUaGUgZmlsdGVyIGF0dHJpYnV0ZSBpcyBkZWxpbWl0ZWQgYnkgOywgc28geW91IGNhbid0IGVzY2FwZSBvdXQgOyBldmVuIGlmIHlvdSB3YW50ZWQgdG8uCisKKyAgICAgICAgICAgIGZpbHRlcj0iLipcLmdpZjsuKlwuanM7IiBtZWFucyB0aGF0IHdlIHdpbGwgbm90IHJlcGxpY2F0ZSB0aGUgc2Vzc2lvbiBhZnRlciByZXF1ZXN0cyB3aXRoIHRoZSBVUkkKKyAgICAgICAgICAgIGVuZGluZyB3aXRoIC5naWYgYW5kIC5qcyBhcmUgaW50ZXJjZXB0ZWQuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIFRoZSBkZXBsb3llciBlbGVtZW50IGNhbiBiZSB1c2VkIHRvIGRlcGxveSBhcHBzIGNsdXN0ZXIgd2lkZS4KKyAgICAgICAgICAgIEN1cnJlbnRseSB0aGUgZGVwbG95bWVudCBvbmx5IGRlcGxveXMvdW5kZXBsb3lzIHRvIHdvcmtpbmcgbWVtYmVycyBpbiB0aGUgY2x1c3RlcgorICAgICAgICAgICAgc28gbm8gV0FScyBhcmUgY29waWVkIHVwb25zIHN0YXJ0dXAgb2YgYSBicm9rZW4gbm9kZS4KKyAgICAgICAgICAgIFRoZSBkZXBsb3llciB3YXRjaGVzIGEgZGlyZWN0b3J5ICh3YXRjaERpcikgZm9yIFdBUiBmaWxlcyB3aGVuIHdhdGNoRW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICAgIFdoZW4gYSBuZXcgd2FyIGZpbGUgaXMgYWRkZWQgdGhlIHdhciBnZXRzIGRlcGxveWVkIHRvIHRoZSBsb2NhbCBpbnN0YW5jZSwKKyAgICAgICAgICAgIGFuZCB0aGVuIGRlcGxveWVkIHRvIHRoZSBvdGhlciBpbnN0YW5jZXMgaW4gdGhlIGNsdXN0ZXIuCisgICAgICAgICAgICBXaGVuIGEgd2FyIGZpbGUgaXMgZGVsZXRlZCBmcm9tIHRoZSB3YXRjaERpciB0aGUgd2FyIGlzIHVuZGVwbG95ZWQgbG9jYWxseSAKKyAgICAgICAgICAgIGFuZCBjbHVzdGVyIHdpZGUKKyAgICAgICAgLS0+CisgICAgICAgIAorICAgICAgICA8IS0tCisgICAgICAgIDxDbHVzdGVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5TaW1wbGVUY3BDbHVzdGVyIgorICAgICAgICAgICAgICAgICBtYW5hZ2VyQ2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5EZWx0YU1hbmFnZXIiCisgICAgICAgICAgICAgICAgIGV4cGlyZVNlc3Npb25zT25TaHV0ZG93bj0iZmFsc2UiCisgICAgICAgICAgICAgICAgIHVzZURpcnR5RmxhZz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbj0idHJ1ZSI+CisKKyAgICAgICAgICAgIDxNZW1iZXJzaGlwIAorICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLm1jYXN0Lk1jYXN0U2VydmljZSIKKyAgICAgICAgICAgICAgICBtY2FzdEFkZHI9IjIyOC4wLjAuNCIKKyAgICAgICAgICAgICAgICBtY2FzdFBvcnQ9IjQ1NTY0IgorICAgICAgICAgICAgICAgIG1jYXN0RnJlcXVlbmN5PSI1MDAiCisgICAgICAgICAgICAgICAgbWNhc3REcm9wVGltZT0iMzAwMCIvPgorCisgICAgICAgICAgICA8UmVjZWl2ZXIgCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlJlcGxpY2F0aW9uTGlzdGVuZXIiCisgICAgICAgICAgICAgICAgdGNwTGlzdGVuQWRkcmVzcz0iYXV0byIKKyAgICAgICAgICAgICAgICB0Y3BMaXN0ZW5Qb3J0PSI0MDAxIgorICAgICAgICAgICAgICAgIHRjcFNlbGVjdG9yVGltZW91dD0iMTAwIgorICAgICAgICAgICAgICAgIHRjcFRocmVhZENvdW50PSI2Ii8+CisKKyAgICAgICAgICAgIDxTZW5kZXIKKyAgICAgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25UcmFuc21pdHRlciIKKyAgICAgICAgICAgICAgICByZXBsaWNhdGlvbk1vZGU9InBvb2xlZCIKKyAgICAgICAgICAgICAgICBhY2tUaW1lb3V0PSIxNTAwMCIKKyAgICAgICAgICAgICAgICB3YWl0Rm9yQWNrPSJ0cnVlIi8+CisKKyAgICAgICAgICAgIDxWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25WYWx2ZSIKKyAgICAgICAgICAgICAgICAgICBmaWx0ZXI9Ii4qXC5naWY7LipcLmpzOy4qXC5qcGc7LipcLnBuZzsuKlwuaHRtOy4qXC5odG1sOy4qXC5jc3M7LipcLnR4dDsiLz4KKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIDxEZXBsb3llciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5kZXBsb3kuRmFybVdhckRlcGxveWVyIgorICAgICAgICAgICAgICAgICAgICAgIHRlbXBEaXI9Ii90bXAvd2FyLXRlbXAvIgorICAgICAgICAgICAgICAgICAgICAgIGRlcGxveURpcj0iL3RtcC93YXItZGVwbG95LyIKKyAgICAgICAgICAgICAgICAgICAgICB3YXRjaERpcj0iL3RtcC93YXItbGlzdGVuLyIKKyAgICAgICAgICAgICAgICAgICAgICB3YXRjaEVuYWJsZWQ9ImZhbHNlIi8+CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICA8Q2x1c3Rlckxpc3RlbmVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uQ2x1c3RlclNlc3Npb25MaXN0ZW5lciIvPgorICAgICAgICA8L0NsdXN0ZXI+CisgICAgICAgIC0tPiAgICAgICAgCisKKworCisgICAgICAgIDwhLS0gTm9ybWFsbHksIHVzZXJzIG11c3QgYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMgdG8gZWFjaCB3ZWIgYXBwCisgICAgICAgICAgICAgaW5kaXZpZHVhbGx5LiAgVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgZW50cnkgaWYgeW91IHdvdWxkIGxpa2UKKyAgICAgICAgICAgICBhIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZCB0aGUgZmlyc3QgdGltZSB0aGV5IGVuY291bnRlciBhCisgICAgICAgICAgICAgcmVzb3VyY2UgcHJvdGVjdGVkIGJ5IGEgc2VjdXJpdHkgY29uc3RyYWludCwgYW5kIHRoZW4gaGF2ZSB0aGF0CisgICAgICAgICAgICAgdXNlciBpZGVudGl0eSBtYWludGFpbmVkIGFjcm9zcyAqYWxsKiB3ZWIgYXBwbGljYXRpb25zIGNvbnRhaW5lZAorICAgICAgICAgICAgIGluIHRoaXMgdmlydHVhbCBob3N0LiAtLT4KKyAgICAgICAgPCEtLQorICAgICAgICA8VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuU2luZ2xlU2lnbk9uIiAvPgorICAgICAgICAtLT4KKworICAgICAgICA8IS0tIEFjY2VzcyBsb2cgcHJvY2Vzc2VzIGFsbCByZXF1ZXN0cyBmb3IgdGhpcyB2aXJ0dWFsIGhvc3QuICBCeQorICAgICAgICAgICAgIGRlZmF1bHQsIGxvZyBmaWxlcyBhcmUgY3JlYXRlZCBpbiB0aGUgImxvZ3MiIGRpcmVjdG9yeSByZWxhdGl2ZSB0bworICAgICAgICAgICAgICRDQVRBTElOQV9IT01FLiAgSWYgeW91IHdpc2gsIHlvdSBjYW4gc3BlY2lmeSBhIGRpZmZlcmVudAorICAgICAgICAgICAgIGRpcmVjdG9yeSB3aXRoIHRoZSAiZGlyZWN0b3J5IiBhdHRyaWJ1dGUuICBTcGVjaWZ5IGVpdGhlciBhIHJlbGF0aXZlCisgICAgICAgICAgICAgKHRvICRDQVRBTElOQV9IT01FKSBvciBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBkZXNpcmVkIGRpcmVjdG9yeS4KKyAgICAgICAgLS0+CisgICAgICAgIDwhLS0KKyAgICAgICAgPFZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuQWNjZXNzTG9nVmFsdmUiCisgICAgICAgICAgICAgICAgIGRpcmVjdG9yeT0ibG9ncyIgIHByZWZpeD0ibG9jYWxob3N0X2FjY2Vzc19sb2cuIiBzdWZmaXg9Ii50eHQiCisgICAgICAgICAgICAgICAgIHBhdHRlcm49ImNvbW1vbiIgcmVzb2x2ZUhvc3RzPSJmYWxzZSIvPgorICAgICAgICAtLT4KKworICAgICAgICA8IS0tIEFjY2VzcyBsb2cgcHJvY2Vzc2VzIGFsbCByZXF1ZXN0cyBmb3IgdGhpcyB2aXJ0dWFsIGhvc3QuICBCeQorICAgICAgICAgICAgIGRlZmF1bHQsIGxvZyBmaWxlcyBhcmUgY3JlYXRlZCBpbiB0aGUgImxvZ3MiIGRpcmVjdG9yeSByZWxhdGl2ZSB0bworICAgICAgICAgICAgICRDQVRBTElOQV9IT01FLiAgSWYgeW91IHdpc2gsIHlvdSBjYW4gc3BlY2lmeSBhIGRpZmZlcmVudAorICAgICAgICAgICAgIGRpcmVjdG9yeSB3aXRoIHRoZSAiZGlyZWN0b3J5IiBhdHRyaWJ1dGUuICBTcGVjaWZ5IGVpdGhlciBhIHJlbGF0aXZlCisgICAgICAgICAgICAgKHRvICRDQVRBTElOQV9IT01FKSBvciBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBkZXNpcmVkIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICBUaGlzIGFjY2VzcyBsb2cgaW1wbGVtZW50YXRpb24gaXMgb3B0aW1pemVkIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlLAorICAgICAgICAgICAgIGJ1dCBpcyBoYXJkY29kZWQgdG8gc3VwcG9ydCBvbmx5IHRoZSAiY29tbW9uIiBhbmQgImNvbWJpbmVkIiBwYXR0ZXJucy4KKyAgICAgICAgLS0+CisgICAgICAgIDwhLS0KKyAgICAgICAgPFZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuRmFzdENvbW1vbkFjY2Vzc0xvZ1ZhbHZlIgorICAgICAgICAgICAgICAgICBkaXJlY3Rvcnk9ImxvZ3MiICBwcmVmaXg9ImxvY2FsaG9zdF9hY2Nlc3NfbG9nLiIgc3VmZml4PSIudHh0IgorICAgICAgICAgICAgICAgICBwYXR0ZXJuPSJjb21tb24iIHJlc29sdmVIb3N0cz0iZmFsc2UiLz4KKyAgICAgICAgLS0+CisKKyAgICAgIDwvSG9zdD4KKworICAgIDwvRW5naW5lPgorCisgIDwvU2VydmljZT4KKworPC9TZXJ2ZXI+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvdG9tY2F0LXVzZXJzLnhtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvY29uZi90b21jYXQtdXNlcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OGNmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvdG9tY2F0LXVzZXJzLnhtbApAQCAtMCwwICsxLDEwIEBACis8IS0tCisgIE5PVEU6ICBCeSBkZWZhdWx0LCBubyB1c2VyIGlzIGluY2x1ZGVkIGluIHRoZSAibWFuYWdlciIgcm9sZSByZXF1aXJlZAorICB0byBvcGVyYXRlIHRoZSAiL21hbmFnZXIiIHdlYiBhcHBsaWNhdGlvbi4gIElmIHlvdSB3aXNoIHRvIHVzZSB0aGlzIGFwcCwKKyAgeW91IG11c3QgZGVmaW5lIHN1Y2ggYSB1c2VyIC0gdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBhcmUgYXJiaXRyYXJ5LgorLS0+Cis8dG9tY2F0LXVzZXJzPgorICA8dXNlciBuYW1lPSJ0b21jYXQiIHBhc3N3b3JkPSJ0b21jYXQiIHJvbGVzPSJ0b21jYXQiIC8+CisgIDx1c2VyIG5hbWU9InJvbGUxIiAgcGFzc3dvcmQ9InRvbWNhdCIgcm9sZXM9InJvbGUxIiAgLz4KKyAgPHVzZXIgbmFtZT0iYm90aCIgICBwYXNzd29yZD0idG9tY2F0IiByb2xlcz0idG9tY2F0LHJvbGUxIiAvPgorPC90b21jYXQtdXNlcnM+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvd2ViLnhtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvY29uZi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmODZhMDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvd2ViLnhtbApAQCAtMCwwICsxLDExNzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgorICAgIHZlcnNpb249IjIuNCI+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT0gSW50cm9kdWN0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBUaGlzIGRvY3VtZW50IGRlZmluZXMgZGVmYXVsdCB2YWx1ZXMgZm9yICphbGwqIHdlYiBhcHBsaWNhdGlvbnMgICAgICAtLT4KKyAgPCEtLSBsb2FkZWQgaW50byB0aGlzIGluc3RhbmNlIG9mIFRvbWNhdC4gIEFzIGVhY2ggYXBwbGljYXRpb24gaXMgICAgICAgICAtLT4KKyAgPCEtLSBkZXBsb3llZCwgdGhpcyBmaWxlIGlzIHByb2Nlc3NlZCwgZm9sbG93ZWQgYnkgdGhlICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAiL1dFQi1JTkYvd2ViLnhtbCIgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZyb20geW91ciBvd24gICAgICAgICAgICAgICAtLT4KKyAgPCEtLSBhcHBsaWNhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSBXQVJOSU5HOiAgRG8gbm90IGNvbmZpZ3VyZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZXNvdXJjZXMgaGVyZSEgICAgICAtLT4KKyAgPCEtLSBUaGV5IHNob3VsZCBnbyBpbiB0aGUgIi9XRUItSU5GL3dlYi54bWwiIGZpbGUgaW4geW91ciBhcHBsaWNhdGlvbi4gICAtLT4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09IEJ1aWx0IEluIFNlcnZsZXQgRGVmaW5pdGlvbnMgPT09PT09PT09PT09PT09PT09PT0gLS0+CisKKworICA8IS0tIFRoZSBkZWZhdWx0IHNlcnZsZXQgZm9yIGFsbCB3ZWIgYXBwbGljYXRpb25zLCB0aGF0IHNlcnZlcyBzdGF0aWMgICAgIC0tPgorICA8IS0tIHJlc291cmNlcy4gIEl0IHByb2Nlc3NlcyBhbGwgcmVxdWVzdHMgdGhhdCBhcmUgbm90IG1hcHBlZCB0byBvdGhlciAgIC0tPgorICA8IS0tIHNlcnZsZXRzIHdpdGggc2VydmxldCBtYXBwaW5ncyAoZGVmaW5lZCBlaXRoZXIgaGVyZSBvciBpbiB5b3VyIG93biAgIC0tPgorICA8IS0tIHdlYi54bWwgZmlsZS4gIFRoaXMgc2VydmxldCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uICAgIC0tPgorICA8IS0tIHBhcmFtZXRlcnMgKGRlZmF1bHQgdmFsdWVzIGFyZSBpbiBzcXVhcmUgYnJhY2tldHMpOiAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgZGVidWcgICAgICAgICAgICAgICBEZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIGZvciBtZXNzYWdlcyBsb2dnZWQgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBieSB0aGlzIHNlcnZsZXQuICBbMF0gICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgZmlsZUVuY29kaW5nICAgICAgICBFbmNvZGluZyB0byBiZSB1c2VkIHRvIHJlYWQgc3RhdGljIHJlc291cmNlcyAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBbcGxhdGZvcm0gZGVmYXVsdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgaW5wdXQgICAgICAgICAgICAgICBJbnB1dCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIHdoZW4gcmVhZGluZyAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgdG8gYmUgc2VydmVkLiAgWzIwNDhdICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgbGlzdGluZ3MgICAgICAgICAgICBTaG91bGQgZGlyZWN0b3J5IGxpc3RpbmdzIGJlIHByb2R1Y2VkIGlmIHRoZXJlIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBpcyBubyB3ZWxjb21lIGZpbGUgaW4gdGhpcyBkaXJlY3Rvcnk/ICBbZmFsc2VdIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBXQVJOSU5HOiBMaXN0aW5ncyBmb3IgZGlyZWN0b3JpZXMgd2l0aCBtYW55ICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzIGNhbiBiZSBzbG93IGFuZCBtYXkgY29uc3VtZSAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBzaWduaWZpY2FudCBwcm9wb3J0aW9ucyBvZiBzZXJ2ZXIgcmVzb3VyY2VzLiAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgb3V0cHV0ICAgICAgICAgICAgICBPdXRwdXQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSB3aGVuIHdyaXRpbmcgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgdG8gYmUgc2VydmVkLiAgWzIwNDhdICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgcmVhZG9ubHkgICAgICAgICAgICBJcyB0aGlzIGNvbnRleHQgInJlYWQgb25seSIsIHNvIEhUVFAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcyBsaWtlIFBVVCBhbmQgREVMRVRFIGFyZSAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICByZWplY3RlZD8gIFt0cnVlXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgcmVhZG1lRmlsZSAgICAgICAgICBGaWxlIG5hbWUgdG8gZGlzcGxheSB3aXRoIHRoZSBkaXJlY3RvcnkgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cy4gW251bGxdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgc2VuZGZpbGVTaXplICAgICAgICBJZiB0aGUgY29ubmVjdG9yIHVzZWQgc3VwcG9ydHMgc2VuZGZpbGUsIHRoaXMgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIHRoZSBtaW5pbWFsIGZpbGUgc2l6ZSBpbiBLQiBmb3IgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBzZW5kZmlsZSB3aWxsIGJlIHVzZWQuIFVzZSBhIG5lZ2F0aXZlICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB0byBhbHdheXMgZGlzYWJsZSBzZW5kZmlsZS4gIFs0OF0gICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICBGb3IgZGlyZWN0b3J5IGxpc3RpbmcgY3VzdG9taXphdGlvbi4gQ2hlY2tzIGxvY2FsWHNsdEZpbGUsIHRoZW4gICAgIC0tPgorICA8IS0tICBnbG9iYWxYc2x0RmlsZSwgdGhlbiBkZWZhdWx0cyB0byBvcmlnaW5hbCBiZWhhdmlvci4gICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgbG9jYWxYc2x0RmlsZSAgICAgICBNYWtlIGRpcmVjdG9yeSBsaXN0aW5ncyBhbiBYTUwgZG9jIGFuZCAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBwYXNzIHRoZSByZXN1bHQgdG8gdGhpcyBzdHlsZSBzaGVldCByZXNpZGluZyAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGF0IGRpcmVjdG9yeS4gVGhpcyBvdmVycmlkZXMgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsWHNsdEZpbGVbbnVsbF0gICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgZ2xvYmFsWHNsdEZpbGUgICAgICBTaXRlIHdpZGUgY29uZmlndXJhdGlvbiB2ZXJzaW9uIG9mICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFhzbHRGaWxlIFRoaXMgYXJndW1lbnQgaXMgZXhwZWN0ZWQgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBhIHBoeXNpY2FsIGZpbGUuIFtudWxsXSAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+ZGVmYXVsdDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLmNhdGFsaW5hLnNlcnZsZXRzLkRlZmF1bHRTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmRlYnVnPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPjA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+bGlzdGluZ3M8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKworCisgIDwhLS0gVGhlICJpbnZva2VyIiBzZXJ2bGV0LCB3aGljaCBleGVjdXRlcyBhbm9ueW1vdXMgc2VydmxldCBjbGFzc2VzICAgICAgLS0+CisgIDwhLS0gdGhhdCBoYXZlIG5vdCBiZWVuIGRlZmluZWQgaW4gYSB3ZWIueG1sIGZpbGUuICBUcmFkaXRpb25hbGx5LCB0aGlzICAgLS0+CisgIDwhLS0gc2VydmxldCBpcyBtYXBwZWQgdG8gdGhlIFVSTCBwYXR0ZXJuICIvc2VydmxldC8qIiwgYnV0IHlvdSBjYW4gbWFwICAgLS0+CisgIDwhLS0gaXQgdG8gb3RoZXIgcGF0dGVybnMgYXMgd2VsbC4gIFRoZSBleHRyYSBwYXRoIGluZm8gcG9ydGlvbiBvZiBzdWNoIGEgLS0+CisgIDwhLS0gcmVxdWVzdCBtdXN0IGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCAgLS0+CisgIDwhLS0gaW1wbGVtZW50cyBTZXJ2bGV0IChvciBleHRlbmRzIEh0dHBTZXJ2bGV0KSwgb3IgdGhlIHNlcnZsZXQgbmFtZSAgICAgLS0+CisgIDwhLS0gb2YgYW4gZXhpc3Rpbmcgc2VydmxldCBkZWZpbml0aW9uLiAgICAgVGhpcyBzZXJ2bGV0IHN1cHBvcnRzIHRoZSAgICAgLS0+CisgIDwhLS0gZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgKGRlZmF1bHQgdmFsdWVzIGFyZSBpbiBzcXVhcmUgICAgLS0+CisgIDwhLS0gYnJhY2tldHMpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICBkZWJ1ZyAgICAgICAgICAgICAgIERlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgZm9yIG1lc3NhZ2VzIGxvZ2dlZCAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoaXMgc2VydmxldC4gIFswXSAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisKKzwhLS0KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5pbnZva2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPgorICAgICAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VydmxldHMuSW52b2tlclNlcnZsZXQKKyAgICAgICAgPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmRlYnVnPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPjA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MjwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKy0tPgorCisKKyAgPCEtLSBUaGUgSlNQIHBhZ2UgY29tcGlsZXIgYW5kIGV4ZWN1dGlvbiBzZXJ2bGV0LCB3aGljaCBpcyB0aGUgbWVjaGFuaXNtICAtLT4KKyAgPCEtLSB1c2VkIGJ5IFRvbWNhdCB0byBzdXBwb3J0IEpTUCBwYWdlcy4gIFRyYWRpdGlvbmFsbHksIHRoaXMgc2VydmxldCAgICAtLT4KKyAgPCEtLSBpcyBtYXBwZWQgdG8gdGhlIFVSTCBwYXR0ZXJuICIqLmpzcCIuICBUaGlzIHNlcnZsZXQgc3VwcG9ydHMgdGhlICAgICAtLT4KKyAgPCEtLSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAoZGVmYXVsdCB2YWx1ZXMgYXJlIGluIHNxdWFyZSAgICAtLT4KKyAgPCEtLSBicmFja2V0cyk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIGNoZWNrSW50ZXJ2YWwgICAgICAgSWYgZGV2ZWxvcG1lbnQgaXMgZmFsc2UgYW5kIGNoZWNrSW50ZXJ2YWwgaXMgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIHplcm8sIGJhY2tncm91bmQgY29tcGlsYXRpb25zIGFyZSAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZC4gY2hlY2tJbnRlcnZhbCBpcyB0aGUgdGltZSBpbiBzZWNvbmRzICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBjaGVja3MgdG8gc2VlIGlmIGEgSlNQIHBhZ2UgbmVlZHMgdG8gICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgYmUgcmVjb21waWxlZC4gWzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIG1vZGlmaWNhdGlvblRlc3RJbnRlcnZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgQ2F1c2VzIGEgSlNQIChhbmQgaXRzIGRlcGVuZGVudCBmaWxlcykgdG8gbm90ICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgYmUgY2hlY2tlZCBmb3IgbW9kaWZpY2F0aW9uIGR1cmluZyB0aGUgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHRpbWUgaW50ZXJ2YWwgKGluIHNlY29uZHMpIGZyb20gdGhlICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgbGFzdCB0aW1lIHRoZSBKU1Agd2FzIGNoZWNrZWQgZm9yICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpY2F0aW9uLiBBIHZhbHVlIG9mIDAgd2lsbCBjYXVzZSB0aGUgSlNQICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY2hlY2tlZCBvbiBldmVyeSBhY2Nlc3MuICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgVXNlZCBpbiBkZXZlbG9wbWVudCBtb2RlIG9ubHkuIFs0XSAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIGNvbXBpbGVyICAgICAgICAgICAgV2hpY2ggY29tcGlsZXIgQW50IHNob3VsZCB1c2UgdG8gY29tcGlsZSBKU1AgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgcGFnZXMuICBTZWUgdGhlIEFudCBkb2N1bWVudGF0aW9uIGZvciBtb3JlICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIGNsYXNzZGVidWdpbmZvICAgICAgU2hvdWxkIHRoZSBjbGFzcyBmaWxlIGJlIGNvbXBpbGVkIHdpdGggICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgZGVidWdnaW5nIGluZm9ybWF0aW9uPyAgW3RydWVdICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIGNsYXNzcGF0aCAgICAgICAgICAgV2hhdCBjbGFzcyBwYXRoIHNob3VsZCBJIHVzZSB3aGlsZSBjb21waWxpbmcgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIHNlcnZsZXRzPyAgW0NyZWF0ZWQgZHluYW1pY2FsbHkgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gdGhlIGN1cnJlbnQgd2ViIGFwcGxpY2F0aW9uXSAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIGRldmVsb3BtZW50ICAgICAgICAgSXMgSmFzcGVyIHVzZWQgaW4gZGV2ZWxvcG1lbnQgbW9kZT8gSWYgdHJ1ZSwgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZyZXF1ZW5jeSBhdCB3aGljaCBKU1BzIGFyZSBjaGVja2VkIGZvciAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpY2F0aW9uIG1heSBiZSBzcGVjaWZpZWQgdmlhIHRoZSAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpY2F0aW9uVGVzdEludGVydmFsIHBhcmFtZXRlci4gW3RydWVdICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIGVuYWJsZVBvb2xpbmcgICAgICAgRGV0ZXJtaW5lcyB3aGV0aGVyIHRhZyBoYW5kbGVyIHBvb2xpbmcgaXMgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCAgW3RydWVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIGZvcmsgICAgICAgICAgICAgICAgVGVsbCBBbnQgdG8gZm9yayBjb21waWxlcyBvZiBKU1AgcGFnZXMgc28gdGhhdCAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgYSBzZXBhcmF0ZSBKVk0gaXMgdXNlZCBmb3IgSlNQIHBhZ2UgY29tcGlsZXMgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgb25lIFRvbWNhdCBpcyBydW5uaW5nIGluLiBbdHJ1ZV0gICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIGllQ2xhc3NJZCAgICAgICAgICAgVGhlIGNsYXNzLWlkIHZhbHVlIHRvIGJlIHNlbnQgdG8gSW50ZXJuZXQgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9yZXIgd2hlbiB1c2luZyA8anNwOnBsdWdpbj4gdGFncy4gICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgW2Nsc2lkOjhBRDlDODQwLTA0NEUtMTFEMS1CM0U5LTAwODA1RjQ5OUQ5M10gICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIGphdmFFbmNvZGluZyAgICAgICAgSmF2YSBmaWxlIGVuY29kaW5nIHRvIHVzZSBmb3IgZ2VuZXJhdGluZyBqYXZhICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIGZpbGVzLiBbVVRGOF0gICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIGtlZXBnZW5lcmF0ZWQgICAgICAgU2hvdWxkIHdlIGtlZXAgdGhlIGdlbmVyYXRlZCBKYXZhIHNvdXJjZSBjb2RlICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIGVhY2ggcGFnZSBpbnN0ZWFkIG9mIGRlbGV0aW5nIGl0PyBbdHJ1ZV0gICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIG1hcHBlZGZpbGUgICAgICAgICAgU2hvdWxkIHdlIGdlbmVyYXRlIHN0YXRpYyBjb250ZW50IHdpdGggb25lICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3RhdGVtZW50IHBlciBpbnB1dCBsaW5lLCB0byBlYXNlICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgZGVidWdnaW5nPyAgW3RydWVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIHRyaW1TcGFjZXMgICAgICAgICAgU2hvdWxkIHdoaXRlIHNwYWNlcyBpbiB0ZW1wbGF0ZSB0ZXh0IGJldHdlZW4gICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucyBvciBkaXJlY3RpdmVzIGJlIHRyaW1tZWQ/ICBbZmFsc2VdICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIHN1cHByZXNzU21hcCAgICAgICAgU2hvdWxkIHRoZSBnZW5lcmF0aW9uIG9mIFNNQVAgaW5mbyBmb3IgSlNSNDUgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgZGVidWdnaW5nIGJlIHN1cHByZXNzZWQ/ICBbZmFsc2VdICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIGR1bXBTbWFwICAgICAgICAgICAgU2hvdWxkIHRoZSBTTUFQIGluZm8gZm9yIEpTUjQ1IGRlYnVnZ2luZyBiZSAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgZHVtcGVkIHRvIGEgZmlsZT8gW2ZhbHNlXSAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UgaWYgc3VwcHJlc3NTbWFwIGlzIHRydWUgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIGdlblN0ckFzQ2hhckFycmF5ICAgU2hvdWxkIHRleHQgc3RyaW5ncyBiZSBnZW5lcmF0ZWQgYXMgY2hhciAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlzLCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGluIHNvbWUgY2FzZXM/ICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgW2ZhbHNlXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIGVycm9yT25Vc2VCZWFuSW52YWxpZENsYXNzQXR0cmlidXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgU2hvdWxkIEphc3BlciBpc3N1ZSBhbiBlcnJvciB3aGVuIHRoZSB2YWx1ZSBvZiAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNsYXNzIGF0dHJpYnV0ZSBpbiBhbiB1c2VCZWFuIGFjdGlvbiBpcyAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgdmFsaWQgYmVhbiBjbGFzcz8gIFt0cnVlXSAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIHNjcmF0Y2hkaXIgICAgICAgICAgV2hhdCBzY3JhdGNoIGRpcmVjdG9yeSBzaG91bGQgd2UgdXNlIHdoZW4gICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsaW5nIEpTUCBwYWdlcz8gIFtkZWZhdWx0IHdvcmsgZGlyZWN0b3J5ICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBjdXJyZW50IHdlYiBhcHBsaWNhdGlvbl0gICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIHhwb3dlcmVkQnkgICAgICAgICAgRGV0ZXJtaW5lcyB3aGV0aGVyIFgtUG93ZXJlZC1CeSByZXNwb25zZSAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyIGlzIGFkZGVkIGJ5IGdlbmVyYXRlZCBzZXJ2bGV0ICBbZmFsc2VdICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIGNvbXBpbGVyVGFyZ2V0Vk0gICAgQ29tcGlsZXIgdGFyZ2V0IFZNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4gIAorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIFN5c3RlbS5wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5zcGVjaWZpY2F0aW9uLnZlcnNpb24gPiAxLjQgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgWzEuNV0gZWxzZSBbMS40XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgY29tcGlsZXJTb3VyY2VWTSAgICBDb21waWxlciBzb3VyY2UgVk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIFN5c3RlbS5wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5zcGVjaWZpY2F0aW9uLnZlcnNpb24gPiAxLjQgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgWzEuNV0gZWxzZSBbMS40XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tIElmIHlvdSB3aXNoIHRvIHVzZSBKaWtlcyB0byBjb21waWxlIEpTUCBwYWdlczogICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgUGxlYXNlIHNlZSB0aGUgIlVzaW5nIEppa2VzIiBzZWN0aW9uIG9mIHRoZSBKYXNwZXItSG93VG8gICAgICAgICAgIC0tPgorICA8IS0tICAgcGFnZSBpbiB0aGUgVG9tY2F0IGRvY3VtZW50YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+anNwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUuamFzcGVyLnNlcnZsZXQuSnNwU2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5mb3JrPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPnhwb3dlcmVkQnk8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MzwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKworCisgIDwhLS0gTk9URTogQW4gU1NJIEZpbHRlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhbiBhbHRlcm5hdGl2ZSBTU0kgICAgICAgICAgLS0+CisgIDwhLS0gaW1wbGVtZW50YXRpb24uIFVzZSBlaXRoZXIgdGhlIFNlcnZsZXQgb3IgdGhlIEZpbHRlciBidXQgTk9UIGJvdGguICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gU2VydmVyIFNpZGUgSW5jbHVkZXMgcHJvY2Vzc2luZyBzZXJ2bGV0LCB3aGljaCBwcm9jZXNzZXMgU1NJICAgICAgICAgLS0+CisgIDwhLS0gZGlyZWN0aXZlcyBpbiBIVE1MIHBhZ2VzIGNvbnNpc3RlbnQgd2l0aCBzaW1pbGFyIHN1cHBvcnQgaW4gd2ViICAgICAgLS0+CisgIDwhLS0gc2VydmVycyBsaWtlIEFwYWNoZS4gIFRyYWRpdGlvbmFsbHksIHRoaXMgc2VydmxldCBpcyBtYXBwZWQgdG8gdGhlICAgLS0+CisgIDwhLS0gVVJMIHBhdHRlcm4gIiouc2h0bWwiLiAgVGhpcyBzZXJ2bGV0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgICAgICAgICAgLS0+CisgIDwhLS0gaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAoZGVmYXVsdCB2YWx1ZXMgYXJlIGluIHNxdWFyZSBicmFja2V0cyk6ICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICBidWZmZXJlZCAgICAgICAgICAgIFNob3VsZCBvdXRwdXQgZnJvbSB0aGlzIHNlcnZsZXQgYmUgYnVmZmVyZWQ/ICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICgwPWZhbHNlLCAxPXRydWUpICBbMF0gICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICBkZWJ1ZyAgICAgICAgICAgICAgIERlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgZm9yIG1lc3NhZ2VzIGxvZ2dlZCAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoaXMgc2VydmxldC4gIFswXSAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICBleHBpcmVzICAgICAgICAgICAgIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBiZWZvcmUgYSBwYWdlIHdpdGggU1NJICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXMgd2lsbCBleHBpcmUuICBbTm8gZGVmYXVsdF0gICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICBpc1ZpcnR1YWxXZWJhcHBSZWxhdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIFNob3VsZCAidmlydHVhbCIgcGF0aHMgYmUgaW50ZXJwcmV0ZWQgYXMgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBjb250ZXh0IHJvb3QsIGluc3RlYWQgb2YgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBzZXJ2ZXIgcm9vdD8gICgwPWZhbHNlLCAxPXRydWUpIFswXSAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICBpbnB1dEVuY29kaW5nICAgICAgIFRoZSBlbmNvZGluZyB0byBhc3N1bWUgZm9yIFNTSSByZXNvdXJjZXMgaWYgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIG9uZSBpcyBub3QgYXZhaWxhYmxlIGZyb20gdGhlIHJlc291cmNlLiAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIFtQbGF0Zm9ybSBkZWZhdWx0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICBvdXRwdXRFbmNvZGluZyAgICAgIFRoZSBlbmNvZGluZyB0byB1c2UgZm9yIHRoZSBwYWdlIHRoYXQgcmVzdWx0cyAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIFNTSSBwcm9jZXNzaW5nLiBbVVRGLThdICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gSU1QT1JUQU5UOiBUbyB1c2UgdGhlIFNTSSBzZXJ2bGV0LCB5b3UgYWxzbyBuZWVkIHRvIHJlbmFtZSB0aGUgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAkQ0FUQUxJTkFfSE9NRS9zZXJ2ZXIvbGliL3NlcnZsZXRzLXNzaS5yZW5hbWV0b2phciBmaWxlICAgLS0+CisgIDwhLS0gICAgICAgICAgICB0byAkQ0FUQUxJTkFfSE9NRS9zZXJ2ZXIvbGliL3NlcnZsZXRzLXNzaS5qYXIgICAgICAgICAgICAgLS0+CisKKzwhLS0KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5zc2k8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+CisgICAgICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5zc2kuU1NJU2VydmxldAorICAgICAgICA8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgIDxwYXJhbS1uYW1lPmJ1ZmZlcmVkPC9wYXJhbS1uYW1lPgorICAgICAgICAgIDxwYXJhbS12YWx1ZT4xPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICA8cGFyYW0tbmFtZT5kZWJ1ZzwvcGFyYW0tbmFtZT4KKyAgICAgICAgICA8cGFyYW0tdmFsdWU+MDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgPHBhcmFtLW5hbWU+ZXhwaXJlczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICA8cGFyYW0tdmFsdWU+NjY2PC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICA8cGFyYW0tbmFtZT5pc1ZpcnR1YWxXZWJhcHBSZWxhdGl2ZTwvcGFyYW0tbmFtZT4KKyAgICAgICAgICA8cGFyYW0tdmFsdWU+MDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD40PC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorLS0+CisKKworICA8IS0tIENvbW1vbiBHYXRld2F5IEluY2x1ZGVzIChDR0kpIHByb2Nlc3Npbmcgc2VydmxldCwgd2hpY2ggc3VwcG9ydHMgICAgIC0tPgorICA8IS0tIGV4ZWN1dGlvbiBvZiBleHRlcm5hbCBhcHBsaWNhdGlvbnMgdGhhdCBjb25mb3JtIHRvIHRoZSBDR0kgc3BlYyAgICAgIC0tPgorICA8IS0tIHJlcXVpcmVtZW50cy4gIFR5cGljYWxseSwgdGhpcyBzZXJ2bGV0IGlzIG1hcHBlZCB0byB0aGUgVVJMIHBhdHRlcm4gIC0tPgorICA8IS0tICIvY2dpLWJpbi8qIiwgd2hpY2ggbWVhbnMgdGhhdCBhbnkgQ0dJIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSAgICAgICAgIC0tPgorICA8IS0tIGV4ZWN1dGVkIG11c3QgYmUgcHJlc2VudCB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gIFRoaXMgc2VydmxldCAgIC0tPgorICA8IS0tIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAoZGVmYXVsdCB2YWx1ZXMgICAgIC0tPgorICA8IS0tIGFyZSBpbiBzcXVhcmUgYnJhY2tldHMpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgY2dpUGF0aFByZWZpeCAgICAgICAgVGhlIENHSSBzZWFyY2ggcGF0aCB3aWxsIHN0YXJ0IGF0ICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgd2ViQXBwUm9vdERpciArIEZpbGUuc2VwYXJhdG9yICsgdGhpcyBwcmVmaXguIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgW1dFQi1JTkYvY2dpXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgZGVidWcgICAgICAgICAgICAgICAgRGVidWdnaW5nIGRldGFpbCBsZXZlbCBmb3IgbWVzc2FnZXMgbG9nZ2VkICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyBzZXJ2bGV0LiAgWzBdICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgZXhlY3V0YWJsZSAgICAgICAgICAgTmFtZSBvZiB0aGUgZXhlY3R1YWJsZSB1c2VkIHRvIHJ1biB0aGUgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LiBbcGVybF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgcGFyYW1ldGVyRW5jb2RpbmcgICAgTmFtZSBvZiBwYXJhbWV0ZXIgZW5jb2RpbmcgdG8gYmUgdXNlZCB3aXRoICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgQ0dJIHNlcnZsZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgW1N5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIsIlVURi04IildIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgcGFzc1NoZWxsRW52aXJvbm1lbnQgU2hvdWxkIHRoZSBzaGVsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGlmICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgYW55KSBiZSBwYXNzZWQgdG8gdGhlIENHSSBzY3JpcHQ/IFtmYWxzZV0gICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tIElNUE9SVEFOVDogVG8gdXNlIHRoZSBDR0kgc2VydmxldCwgeW91IGFsc28gbmVlZCB0byByZW5hbWUgdGhlICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgJENBVEFMSU5BX0hPTUUvc2VydmVyL2xpYi9zZXJ2bGV0cy1jZ2kucmVuYW1ldG9qYXIgZmlsZSAgIC0tPgorICA8IS0tICAgICAgICAgICAgdG8gJENBVEFMSU5BX0hPTUUvc2VydmVyL2xpYi9zZXJ2bGV0cy1jZ2kuamFyICAgICAgICAgICAgIC0tPgorCis8IS0tCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Y2dpPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUuY2F0YWxpbmEuc2VydmxldHMuQ0dJU2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgPHBhcmFtLW5hbWU+ZGVidWc8L3BhcmFtLW5hbWU+CisgICAgICAgICAgPHBhcmFtLXZhbHVlPjA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgIDxwYXJhbS1uYW1lPmNnaVBhdGhQcmVmaXg8L3BhcmFtLW5hbWU+CisgICAgICAgICAgPHBhcmFtLXZhbHVlPldFQi1JTkYvY2dpPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICAgPGxvYWQtb24tc3RhcnR1cD41PC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorLS0+CisKKworICA8IS0tID09PT09PT09PT09PT09PT0gQnVpbHQgSW4gU2VydmxldCBNYXBwaW5ncyA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisKKyAgPCEtLSBUaGUgc2VydmxldCBtYXBwaW5ncyBmb3IgdGhlIGJ1aWx0IGluIHNlcnZsZXRzIGRlZmluZWQgYWJvdmUuICBOb3RlICAtLT4KKyAgPCEtLSB0aGF0LCBieSBkZWZhdWx0LCB0aGUgQ0dJIGFuZCBTU0kgc2VydmxldHMgYXJlICpub3QqIG1hcHBlZC4gIFlvdSAgICAtLT4KKyAgPCEtLSBtdXN0IHVuY29tbWVudCB0aGVzZSBtYXBwaW5ncyAob3IgYWRkIHRoZW0gdG8geW91ciBhcHBsaWNhdGlvbidzIG93biAtLT4KKyAgPCEtLSB3ZWIueG1sIGRlcGxveW1lbnQgZGVzY3JpcHRvcikgdG8gZW5hYmxlIHRoZXNlIHNlcnZpY2VzICAgICAgICAgICAgICAtLT4KKworICAgIDwhLS0gVGhlIG1hcHBpbmcgZm9yIHRoZSBkZWZhdWx0IHNlcnZsZXQgLS0+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5kZWZhdWx0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDwhLS0gVGhlIG1hcHBpbmcgZm9yIHRoZSBpbnZva2VyIHNlcnZsZXQgLS0+Cis8IS0tCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5pbnZva2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vc2VydmxldC8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKy0tPgorCisgICAgPCEtLSBUaGUgbWFwcGluZyBmb3IgdGhlIEpTUCBzZXJ2bGV0IC0tPgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+anNwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4qLmpzcDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmpzcDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Ki5qc3B4PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDwhLS0gVGhlIG1hcHBpbmcgZm9yIHRoZSBTU0kgc2VydmxldCAtLT4KKzwhLS0KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPnNzaTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Ki5zaHRtbDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CistLT4KKworICAgIDwhLS0gVGhlIG1hcHBpbmcgZm9yIHRoZSBDR0kgR2F0ZXdheSBzZXJ2bGV0IC0tPgorCis8IS0tCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5jZ2k8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9jZ2ktYmluLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorLS0+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PSBCdWlsdCBJbiBGaWx0ZXIgRGVmaW5pdGlvbnMgPT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDwhLS0gTk9URTogQW4gU1NJIFNlcnZsZXQgaXMgYWxzbyBhdmFpbGFibGUgYXMgYW4gYWx0ZXJuYXRpdmUgU1NJICAgICAgICAgLS0+CisgIDwhLS0gaW1wbGVtZW50YXRpb24uIFVzZSBlaXRoZXIgdGhlIFNlcnZsZXQgb3IgdGhlIEZpbHRlciBidXQgTk9UIGJvdGguICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gU2VydmVyIFNpZGUgSW5jbHVkZXMgcHJvY2Vzc2luZyBmaWx0ZXIsIHdoaWNoIHByb2Nlc3NlcyBTU0kgICAgICAgICAgLS0+CisgIDwhLS0gZGlyZWN0aXZlcyBpbiBIVE1MIHBhZ2VzIGNvbnNpc3RlbnQgd2l0aCBzaW1pbGFyIHN1cHBvcnQgaW4gd2ViICAgICAgLS0+CisgIDwhLS0gc2VydmVycyBsaWtlIEFwYWNoZS4gIFRyYWRpdGlvbmFsbHksIHRoaXMgZmlsdGVyIGlzIG1hcHBlZCB0byB0aGUgICAgLS0+CisgIDwhLS0gVVJMIHBhdHRlcm4gIiouc2h0bWwiLCB0aG91Z2ggaXQgY2FuIGJlIG1hcHBlZCB0byAiKiIgYXMgaXQgd2lsbCAgICAgLS0+CisgIDwhLS0gc2VsZWN0aXZlbHkgZW5hYmxlL2Rpc2FibGUgU1NJIHByb2Nlc3NpbmcgYmFzZWQgb24gbWltZSB0eXBlcy4gRm9yICAgLS0+CisgIDwhLS0gdGhpcyB0byB3b3JrIHlvdSB3aWxsIG5lZWQgdG8gdW5jb21tZW50IHRoZSAuc2h0bWwgbWltZSB0eXBlICAgICAgICAgLS0+CisgIDwhLS0gZGVmaW5pdGlvbiB0b3dhcmRzIHRoZSBib3R0b20gb2YgdGhpcyBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gVGhlIGNvbnRlbnRUeXBlIGluaXQgcGFyYW0gYWxsb3dzIHlvdSB0byBhcHBseSBTU0kgcHJvY2Vzc2luZyB0byBKU1AgLS0+CisgIDwhLS0gcGFnZXMsIGphdmFzY3JpcHQsIG9yIGFueSBvdGhlciBjb250ZW50IHlvdSB3aXNoLiAgVGhpcyBmaWx0ZXIgICAgICAgLS0+CisgIDwhLS0gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIChkZWZhdWx0IHZhbHVlcyBhcmUgLS0+CisgIDwhLS0gaW4gc3F1YXJlIGJyYWNrZXRzKTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICBjb250ZW50VHlwZSAgICAgICAgIEEgcmVnZXggcGF0dGVybiB0aGF0IG11c3QgYmUgbWF0Y2hlZCBiZWZvcmUgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIFNTSSBwcm9jZXNzaW5nIGlzIGFwcGxpZWQuICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0L3gtc2VydmVyLXBhcnNlZC1odG1sKDsuKik/XSAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICBkZWJ1ZyAgICAgICAgICAgICAgIERlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgZm9yIG1lc3NhZ2VzIGxvZ2dlZCAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoaXMgc2VydmxldC4gIFswXSAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICBleHBpcmVzICAgICAgICAgICAgIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBiZWZvcmUgYSBwYWdlIHdpdGggU1NJICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXMgd2lsbCBleHBpcmUuICBbTm8gZGVmYXVsdF0gICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICBpc1ZpcnR1YWxXZWJhcHBSZWxhdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIFNob3VsZCAidmlydHVhbCIgcGF0aHMgYmUgaW50ZXJwcmV0ZWQgYXMgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBjb250ZXh0IHJvb3QsIGluc3RlYWQgb2YgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBzZXJ2ZXIgcm9vdD8gICgwPWZhbHNlLCAxPXRydWUpIFswXSAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gSU1QT1JUQU5UOiBUbyB1c2UgdGhlIFNTSSBmaWx0ZXIsIHlvdSBhbHNvIG5lZWQgdG8gcmVuYW1lIHRoZSAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAkQ0FUQUxJTkFfSE9NRS9zZXJ2ZXIvbGliL3NlcnZsZXRzLXNzaS5yZW5hbWV0b2phciBmaWxlICAgLS0+CisgIDwhLS0gICAgICAgICAgICB0byAkQ0FUQUxJTkFfSE9NRS9zZXJ2ZXIvbGliL3NlcnZsZXRzLXNzaS5qYXIgICAgICAgICAgICAgLS0+CisKKzwhLS0KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+c3NpPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz4KKyAgICAgICAgICBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaS5TU0lGaWx0ZXIKKyAgICAgICAgPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgIDxwYXJhbS1uYW1lPmNvbnRlbnRUeXBlPC9wYXJhbS1uYW1lPgorICAgICAgICAgIDxwYXJhbS12YWx1ZT50ZXh0L3gtc2VydmVyLXBhcnNlZC1odG1sKDsuKik/PC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICA8cGFyYW0tbmFtZT5kZWJ1ZzwvcGFyYW0tbmFtZT4KKyAgICAgICAgICA8cGFyYW0tdmFsdWU+MDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgPHBhcmFtLW5hbWU+ZXhwaXJlczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICA8cGFyYW0tdmFsdWU+NjY2PC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICA8cGFyYW0tbmFtZT5pc1ZpcnR1YWxXZWJhcHBSZWxhdGl2ZTwvcGFyYW0tbmFtZT4KKyAgICAgICAgICA8cGFyYW0tdmFsdWU+MDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKy0tPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBCdWlsdCBJbiBGaWx0ZXIgTWFwcGluZ3MgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8IS0tIFRoZSBtYXBwaW5nIGZvciB0aGUgU1NJIEZpbHRlciAtLT4KKzwhLS0KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5zc2k8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Ki5zaHRtbDwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKy0tPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBEZWZhdWx0IFNlc3Npb24gQ29uZmlndXJhdGlvbiA9PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBZb3UgY2FuIHNldCB0aGUgZGVmYXVsdCBzZXNzaW9uIHRpbWVvdXQgKGluIG1pbnV0ZXMpIGZvciBhbGwgbmV3bHkgICAtLT4KKyAgPCEtLSBjcmVhdGVkIHNlc3Npb25zIGJ5IG1vZGlmeWluZyB0aGUgdmFsdWUgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAtLT4KKworICAgIDxzZXNzaW9uLWNvbmZpZz4KKyAgICAgICAgPHNlc3Npb24tdGltZW91dD4zMDwvc2Vzc2lvbi10aW1lb3V0PgorICAgIDwvc2Vzc2lvbi1jb25maWc+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBEZWZhdWx0IE1JTUUgVHlwZSBNYXBwaW5ncyA9PT09PT09PT09PT09PT09PT09IC0tPgorICA8IS0tIFdoZW4gc2VydmluZyBzdGF0aWMgcmVzb3VyY2VzLCBUb21jYXQgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlICAgIC0tPgorICA8IS0tIGEgIkNvbnRlbnQtVHlwZSIgaGVhZGVyIGJhc2VkIG9uIHRoZSByZXNvdXJjZSdzIGZpbGVuYW1lIGV4dGVuc2lvbiwgIC0tPgorICA8IS0tIGJhc2VkIG9uIHRoZXNlIG1hcHBpbmdzLiAgQWRkaXRpb25hbCBtYXBwaW5ncyBjYW4gYmUgYWRkZWQgaGVyZSAodG8gIC0tPgorICA8IS0tIGFwcGx5IHRvIGFsbCB3ZWIgYXBwbGljYXRpb25zKSwgb3IgaW4geW91ciBvd24gYXBwbGljYXRpb24ncyB3ZWIueG1sIC0tPgorICA8IS0tIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorCisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5hYnM8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby94LW1wZWc8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmFpPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vcG9zdHNjcmlwdDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+YWlmPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXVkaW8veC1haWZmPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5haWZjPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXVkaW8veC1haWZmPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5haWZmPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXVkaW8veC1haWZmPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5haW08L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LWFpbTwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+YXJ0PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+aW1hZ2UveC1qZzwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+YXNmPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dmlkZW8veC1tcy1hc2Y8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmFzeDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnZpZGVvL3gtbXMtYXNmPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5hdTwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmF1ZGlvL2Jhc2ljPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5hdmk8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT52aWRlby94LW1zdmlkZW88L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmF2eDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnZpZGVvL3gtcmFkLXNjcmVlbnBsYXk8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmJjcGlvPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC1iY3BpbzwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+YmluPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5ibXA8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS9ibXA8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmJvZHk8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT50ZXh0L2h0bWw8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmNkZjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtbmV0Y2RmPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5jZXI8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+Y2xhc3M8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi9qYXZhPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5jcGlvPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC1jcGlvPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5jc2g8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LWNzaDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+Y3NzPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dGV4dC9jc3M8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmRpYjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL2JtcDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+ZG9jPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vbXN3b3JkPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5kdGQ8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94bWwtZHRkPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5kdjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnZpZGVvL3gtZHY8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmR2aTwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtZHZpPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5lcHM8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi9wb3N0c2NyaXB0PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5ldHg8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT50ZXh0L3gtc2V0ZXh0PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5leGU8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi9vY3RldC1zdHJlYW08L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmdpZjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL2dpZjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+Z3RhcjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtZ3RhcjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+Z3o8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LWd6aXA8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmhkZjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtaGRmPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5odGM8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT50ZXh0L3gtY29tcG9uZW50PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5odG08L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT50ZXh0L2h0bWw8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmh0bWw8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT50ZXh0L2h0bWw8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmhxeDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL21hYy1iaW5oZXg0MDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+aWNvPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+aW1hZ2UveC1pY29uPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5pZWY8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS9pZWY8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmphZDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnRleHQvdm5kLnN1bi5qMm1lLmFwcC1kZXNjcmlwdG9yPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5qYXI8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi9qYXZhLWFyY2hpdmU8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmphdmE8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT50ZXh0L3BsYWluPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5qbmxwPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC1qYXZhLWpubHAtZmlsZTwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+anBlPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+aW1hZ2UvanBlZzwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+anBlZzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL2pwZWc8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmpwZzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL2pwZWc8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmpzPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dGV4dC9qYXZhc2NyaXB0PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5qc2Y8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT50ZXh0L3BsYWluPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5qc3BmPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dGV4dC9wbGFpbjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+a2FyPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXVkaW8vbWlkaTwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+bGF0ZXg8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LWxhdGV4PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5tM3U8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby94LW1wZWd1cmw8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPm1hYzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL3gtbWFjcGFpbnQ8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPm1hbjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtdHJvZmYtbWFuPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5tYXRobWw8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi9tYXRobWwreG1sPC9taW1lLXR5cGU+IAorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+bWU8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXRyb2ZmLW1lPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5taWQ8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby9taWRpPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5taWRpPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXVkaW8vbWlkaTwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+bWlmPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vdm5kLm1pZjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+bW92PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dmlkZW8vcXVpY2t0aW1lPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5tb3ZpZTwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnZpZGVvL3gtc2dpLW1vdmllPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5tcDE8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby94LW1wZWc8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPm1wMjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmF1ZGlvL21wZWc8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPm1wMzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmF1ZGlvL21wZWc8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPm1wNDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnZpZGVvL21wNDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+bXBhPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXVkaW8veC1tcGVnPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5tcGU8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT52aWRlby9tcGVnPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5tcGVnPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dmlkZW8vbXBlZzwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+bXBlZ2E8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby94LW1wZWc8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPm1wZzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnZpZGVvL21wZWc8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPm1wdjI8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT52aWRlby9tcGVnMjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+bXM8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXRyb2ZmLW1zPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5uYzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtbmV0Y2RmPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5vZGE8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi9vZGE8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8IS0tIE9wZW5Eb2N1bWVudCBEYXRhYmFzZSAtLT4KKyAgICAgICAgPGV4dGVuc2lvbj5vZGI8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmRhdGFiYXNlPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPCEtLSBPcGVuRG9jdW1lbnQgQ2hhcnQgLS0+CisgICAgICAgIDxleHRlbnNpb24+b2RjPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDwhLS0gT3BlbkRvY3VtZW50IEZvcm11bGEgLS0+CisgICAgICAgIDxleHRlbnNpb24+b2RmPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPCEtLSBPcGVuRG9jdW1lbnQgRHJhd2luZyAtLT4KKyAgICAgICAgPGV4dGVuc2lvbj5vZGc8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPCEtLSBPcGVuRG9jdW1lbnQgSW1hZ2UgLS0+CisgICAgICAgIDxleHRlbnNpb24+b2RpPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZTwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDwhLS0gT3BlbkRvY3VtZW50IE1hc3RlciBEb2N1bWVudCAtLT4KKyAgICAgICAgPGV4dGVuc2lvbj5vZG08L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtbWFzdGVyPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPCEtLSBPcGVuRG9jdW1lbnQgUHJlc2VudGF0aW9uIC0tPgorICAgICAgICA8ZXh0ZW5zaW9uPm9kcDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPCEtLSBPcGVuRG9jdW1lbnQgU3ByZWFkc2hlZXQgLS0+CisgICAgICAgIDxleHRlbnNpb24+b2RzPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDwhLS0gT3BlbkRvY3VtZW50IFRleHQgLS0+CisgICAgICAgIDxleHRlbnNpb24+b2R0PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5vZ2c8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi9vZ2c8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8IS0tIE9wZW5Eb2N1bWVudCBEcmF3aW5nIFRlbXBsYXRlIC0tPgorICAgICAgICA8ZXh0ZW5zaW9uPm90ZyA8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzLXRlbXBsYXRlPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPCEtLSBIVE1MIERvY3VtZW50IFRlbXBsYXRlIC0tPgorICAgICAgICA8ZXh0ZW5zaW9uPm90aDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC13ZWI8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8IS0tIE9wZW5Eb2N1bWVudCBQcmVzZW50YXRpb24gVGVtcGxhdGUgLS0+CisgICAgICAgIDxleHRlbnNpb24+b3RwPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24tdGVtcGxhdGU8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8IS0tIE9wZW5Eb2N1bWVudCBTcHJlYWRzaGVldCBUZW1wbGF0ZSAtLT4KKyAgICAgICAgPGV4dGVuc2lvbj5vdHM8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0LXRlbXBsYXRlIDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDwhLS0gT3BlbkRvY3VtZW50IFRleHQgVGVtcGxhdGUgLS0+CisgICAgICAgIDxleHRlbnNpb24+b3R0PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5wYm08L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LXBvcnRhYmxlLWJpdG1hcDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+cGN0PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+aW1hZ2UvcGljdDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+cGRmPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vcGRmPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5wZ208L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LXBvcnRhYmxlLWdyYXltYXA8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnBpYzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL3BpY3Q8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnBpY3Q8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS9waWN0PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5wbHM8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby94LXNjcGxzPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5wbmc8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS9wbmc8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnBubTwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL3gtcG9ydGFibGUtYW55bWFwPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5wbnQ8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LW1hY3BhaW50PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5wcG08L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LXBvcnRhYmxlLXBpeG1hcDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+cHBzPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQ8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnBwdDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5wczwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3Bvc3RzY3JpcHQ8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnBzZDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL3gtcGhvdG9zaG9wPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5xdDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnZpZGVvL3F1aWNrdGltZTwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+cXRpPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+aW1hZ2UveC1xdWlja3RpbWU8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnF0aWY8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LXF1aWNrdGltZTwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+cmFzPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+aW1hZ2UveC1jbXUtcmFzdGVyPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5yZGY8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi9yZGYreG1sPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5yZ2I8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LXJnYjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+cm08L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi92bmQucm4tcmVhbG1lZGlhPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5yb2ZmPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC10cm9mZjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+cnRmPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dGV4dC9ydGY8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnJ0eDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnRleHQvcmljaHRleHQ8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnNoPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC1zaDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+c2hhcjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtc2hhcjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorPCEtLQorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+c2h0bWw8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT50ZXh0L3gtc2VydmVyLXBhcnNlZC1odG1sPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CistLT4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnNtZjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmF1ZGlvL3gtbWlkaTwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+c2l0PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC1zdHVmZml0PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5zbmQ8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby9iYXNpYzwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+c3JjPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC13YWlzLXNvdXJjZTwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+c3Y0Y3BpbzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtc3Y0Y3BpbzwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+c3Y0Y3JjPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC1zdjRjcmM8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnN2ZzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL3N2Zyt4bWw8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnN2Z3o8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS9zdmcreG1sPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5zd2Y8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+dDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtdHJvZmY8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnRhcjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtdGFyPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj50Y2w8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXRjbDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+dGV4PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC10ZXg8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnRleGk8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXRleGluZm88L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnRleGluZm88L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXRleGluZm88L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnRpZjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL3RpZmY8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnRpZmY8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS90aWZmPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj50cjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtdHJvZmY8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnRzdjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXM8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnR4dDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnRleHQvcGxhaW48L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnVsdzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmF1ZGlvL2Jhc2ljPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj51c3RhcjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtdXN0YXI8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnZybWw8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5tb2RlbC92cm1sPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj52c2Q8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXZpc2lvPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj52eG1sPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vdm9pY2V4bWwreG1sPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj53YXY8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby94LXdhdjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDwhLS0gV2lyZWxlc3MgQml0bWFwIC0tPgorICAgICAgICA8ZXh0ZW5zaW9uPndibXA8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS92bmQud2FwLndibXA8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8IS0tIFdNTCBTb3VyY2UgLS0+CisgICAgICAgIDxleHRlbnNpb24+d21sPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dGV4dC92bmQud2FwLndtbDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDwhLS0gQ29tcGlsZWQgV01MIC0tPgorICAgICAgICA8ZXh0ZW5zaW9uPndtbGM8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi92bmQud2FwLndtbGM8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8IS0tIFdNTCBTY3JpcHQgU291cmNlIC0tPgorICAgICAgICA8ZXh0ZW5zaW9uPndtbHM8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT50ZXh0L3ZuZC53YXAud21sc2NyaXB0PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPCEtLSBDb21waWxlZCBXTUwgU2NyaXB0IC0tPgorICAgICAgICA8ZXh0ZW5zaW9uPndtbHNjcmlwdGM8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi92bmQud2FwLndtbHNjcmlwdGM8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPndtdjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnZpZGVvL3gtbXMtd212PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj53cmw8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5tb2RlbC92cm1sPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj54Ym08L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LXhiaXRtYXA8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnhodDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3hodG1sK3htbDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+eGh0bWw8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94aHRtbCt4bWw8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnhsczwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+eG1sPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veG1sPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj54cG08L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LXhwaXhtYXA8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnhzbDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3htbDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+eHNsdDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3hzbHQreG1sPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj54dWw8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi92bmQubW96aWxsYS54dWwreG1sPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj54d2Q8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LXh3aW5kb3dkdW1wPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5aPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC1jb21wcmVzczwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+ejwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtY29tcHJlc3M8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnppcDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3ppcDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT0gRGVmYXVsdCBXZWxjb21lIEZpbGUgTGlzdCA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDwhLS0gV2hlbiBhIHJlcXVlc3QgVVJJIHJlZmVycyB0byBhIGRpcmVjdG9yeSwgdGhlIGRlZmF1bHQgc2VydmxldCBsb29rcyAgLS0+CisgIDwhLS0gZm9yIGEgIndlbGNvbWUgZmlsZSIgd2l0aGluIHRoYXQgZGlyZWN0b3J5IGFuZCwgaWYgcHJlc2VudCwgICAgICAgICAgLS0+CisgIDwhLS0gdG8gdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgVVJJIGZvciBkaXNwbGF5LiAgSWYgbm8gd2VsY29tZSBmaWxlICAgLS0+CisgIDwhLS0gaXMgcHJlc2VudCwgdGhlIGRlZmF1bHQgc2VydmxldCBlaXRoZXIgc2VydmVzIGEgZGlyZWN0b3J5IGxpc3RpbmcsICAgLS0+CisgIDwhLS0gb3IgcmV0dXJucyBhIDQwNCBzdGF0dXMsIGRlcGVuZGluZyBvbiBob3cgaXQgaXMgY29uZmlndXJlZC4gICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gSWYgeW91IGRlZmluZSB3ZWxjb21lIGZpbGVzIGluIHlvdXIgb3duIGFwcGxpY2F0aW9uJ3Mgd2ViLnhtbCAgICAgICAgLS0+CisgIDwhLS0gZGVwbG95bWVudCBkZXNjcmlwdG9yLCB0aGF0IGxpc3QgKnJlcGxhY2VzKiB0aGUgbGlzdCBjb25maWd1cmVkICAgICAgLS0+CisgIDwhLS0gaGVyZSwgc28gYmUgc3VyZSB0aGF0IHlvdSBpbmNsdWRlIGFueSBvZiB0aGUgZGVmYXVsdCB2YWx1ZXMgdGhhdCAgICAgLS0+CisgIDwhLS0geW91IHdpc2ggdG8gaW5jbHVkZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisKKyAgICA8d2VsY29tZS1maWxlLWxpc3Q+CisgICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgorICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bTwvd2VsY29tZS1maWxlPgorICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgorICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+CisKKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9BdXRoZW50aWNhdG9yLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQXV0aGVudGljYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZjYwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQXV0aGVudGljYXRvci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCisvKioKKyAqIEFuIDxiPkF1dGhlbnRpY2F0b3I8L2I+IGlzIGEgY29tcG9uZW50ICh1c3VhbGx5IGEgVmFsdmUgb3IgQ29udGFpbmVyKSB0aGF0CisgKiBwcm92aWRlcyBzb21lIHNvcnQgb2YgYXV0aGVudGljYXRpb24gc2VydmljZS4gIFRoZSBpbnRlcmZhY2UgaXRzZWxmIGhhcyBubworICogZnVuY3Rpb25hbCBzaWduaWZpY2FuY2UsICBidXQgaXMgdXNlZCBhcyBhIHRhZ2dpbmcgbWVjaGFuaXNtIHNvIHRoYXQgb3RoZXIKKyAqIGNvbXBvbmVudHMgY2FuIGRldGVjdCB0aGUgcHJlc2VuY2UgKHZpYSBhbiAiaW5zdGFuY2VvZiBBdXRoZW50aWNhdG9yIiB0ZXN0KQorICogb2YgYW4gYWxyZWFkeSBjb25maWd1cmVkIGF1dGhlbnRpY2F0aW9uIHNlcnZpY2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgQXV0aGVudGljYXRvciB7CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0NsdXN0ZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9DbHVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdjOGMxZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9DbHVzdGVyLmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKy8qKgorICogQSA8Yj5DbHVzdGVyPC9iPiB3b3JrcyBhcyBhIENsdXN0ZXIgY2xpZW50L3NlcnZlciBmb3IgdGhlIGxvY2FsIGhvc3QKKyAqIERpZmZlcmVudCBDbHVzdGVyIGltcGxlbWVudGF0aW9ucyBjYW4gYmUgdXNlZCB0byBzdXBwb3J0IGRpZmZlcmVudAorICogd2F5cyB0byBjb21tdW5pY2F0ZSB3aXRoaW4gdGhlIENsdXN0ZXIuIEEgQ2x1c3RlciBpbXBsZW1lbnRhdGlvbiBpcworICogcmVzcG9uc2libGUgZm9yIHNldHRpbmcgdXAgYSB3YXkgdG8gY29tbXVuaWNhdGUgd2l0aGluIHRoZSBDbHVzdGVyCisgKiBhbmQgYWxzbyBzdXBwbHkgIkNsaWVudEFwcGxpY2F0aW9ucyIgd2l0aCA8Y29kZT5DbHVzdGVyU2VuZGVyPC9jb2RlPgorICogdXNlZCB3aGVuIHNlbmRpbmcgaW5mb3JtYXRpb24gaW4gdGhlIENsdXN0ZXIgYW5kCisgKiA8Y29kZT5DbHVzdGVySW5mbzwvY29kZT4gdXNlZCBmb3IgcmVjZWl2aW5nIGluZm9ybWF0aW9uIGluIHRoZSBDbHVzdGVyLgorICoKKyAqIEBhdXRob3IgQmlwIFRoZWxpbgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworcHVibGljIGludGVyZmFjZSBDbHVzdGVyIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgQ2x1c3RlciBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2x1c3RlciB0aGF0IHRoaXMgU2VydmVyIGlzIGN1cnJlbnRseQorICAgICAqIGNvbmZpZ3VyZWQgdG8gb3BlcmF0ZSB3aXRoaW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBjbHVzdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2x1c3Rlck5hbWUoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgY2x1c3RlciB0byBqb2luLCBpZiBubyBjbHVzdGVyIHdpdGgKKyAgICAgKiB0aGlzIG5hbWUgaXMgcHJlc2VudCBjcmVhdGUgb25lLgorICAgICAqCisgICAgICogQHBhcmFtIGNsdXN0ZXJOYW1lIFRoZSBjbHVzdGVybmFtZSB0byBqb2luCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3Rlck5hbWUoU3RyaW5nIGNsdXN0ZXJOYW1lKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCBvdXIgQ2x1c3RlcgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgQ29udGFpbmVyIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgY29udGFpbmVyKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgQ29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCBvdXIgQ2x1c3RlcgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgQ29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCBvdXIgQ2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHByb3RvY29sIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdG9jb2wgVGhlIHByb3RvY29sIHVzZWQgYnkgdGhlIGNsdXN0ZXIKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3RvY29sKFN0cmluZyBwcm90b2NvbCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHByb3RvY29sIHVzZWQgYnkgdGhlIGNsdXN0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBwcm90b2NvbAorICAgICAqIEBkZXByZWNhdGVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgbWFuYWdlciB3aGljaCB3aWxsIHVzZSB0aGlzIGNsdXN0ZXIgdG8gcmVwbGljYXRlIGl0cworICAgICAqIHNlc3Npb25zLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSAoa2V5KSBvZiB0aGUgYXBwbGljYXRpb24gd2l0aCB3aGljaCB0aGUgbWFuYWdlciBpcworICAgICAqIGFzc29jaWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFuYWdlciBjcmVhdGVNYW5hZ2VyKFN0cmluZyBuYW1lKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDbHVzdGVyIFdpZGUgRGVwbG95bWVudHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIGEgcGVyaW9kaWMgdGFzaywgc3VjaCBhcyByZWxvYWRpbmcsIGV0Yy4gVGhpcyBtZXRob2Qgd2lsbCBiZQorICAgICAqIGludm9rZWQgaW5zaWRlIHRoZSBjbGFzc2xvYWRpbmcgY29udGV4dCBvZiB0aGlzIGNvbnRhaW5lci4gVW5leHBlY3RlZAorICAgICAqIHRocm93YWJsZXMgd2lsbCBiZSBjYXVnaHQgYW5kIGxvZ2dlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiYWNrZ3JvdW5kUHJvY2VzcygpOworCisKKyAgICAvKioKKyAgICAgKiBTdGFydCBhbiBleGlzdGluZyB3ZWIgYXBwbGljYXRpb24sIGF0dGFjaGVkIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dAorICAgICAqIHBhdGggaW4gYWxsIHRoZSBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3Rlci4KKyAgICAgKiBPbmx5IHN0YXJ0cyBhIHdlYiBhcHBsaWNhdGlvbiBpZiBpdCBpcyBub3QgcnVubmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCBUaGUgY29udGV4dCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSBzdGFydGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aAorICAgICAqICBpcyBtYWxmb3JtZWQgKGl0IG11c3QgYmUgIiIgb3Igc3RhcnQgd2l0aCBhIHNsYXNoKQorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoIGRvZXMKKyAgICAgKiAgbm90IGlkZW50aWZ5IGEgY3VycmVudGx5IGluc3RhbGxlZCB3ZWIgYXBwbGljYXRpb24KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMgZHVyaW5nCisgICAgICogIHN0YXJ0dXAKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q29udGV4dChTdHJpbmcgY29udGV4dFBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogSW5zdGFsbCBhIG5ldyB3ZWIgYXBwbGljYXRpb24sIHdob3NlIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIGlzIGF0IHRoZQorICAgICAqIHNwZWNpZmllZCBVUkwsIGludG8gdGhpcyBjb250YWluZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aC4KKyAgICAgKiBBIGNvbnRleHQgcGF0aCBvZiAiIiAodGhlIGVtcHR5IHN0cmluZykgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSByb290CisgICAgICogYXBwbGljYXRpb24gZm9yIHRoaXMgY29udGFpbmVyLiAgT3RoZXJ3aXNlLCB0aGUgY29udGV4dCBwYXRoIG11c3QKKyAgICAgKiBzdGFydCB3aXRoIGEgc2xhc2guCisgICAgICogPHA+CisgICAgICogSWYgdGhpcyBhcHBsaWNhdGlvbiBpcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkLCBhIENvbnRhaW5lckV2ZW50IG9mIHR5cGUKKyAgICAgKiA8Y29kZT5QUkVfSU5TVEFMTF9FVkVOVDwvY29kZT4gd2lsbCBiZSBzZW50IHRvIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCisgICAgICogYmVmb3JlIHRoZSBhc3NvY2lhdGVkIENvbnRleHQgaXMgc3RhcnRlZCwgYW5kIGEgQ29udGFpbmVyRXZlbnQgb2YgdHlwZQorICAgICAqIDxjb2RlPklOU1RBTExfRVZFTlQ8L2NvZGU+IHdpbGwgYmUgc2VudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMKKyAgICAgKiBhZnRlciB0aGUgYXNzb2NpYXRlZCBDb250ZXh0IGlzIHN0YXJ0ZWQsIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQKKyAgICAgKiA8Y29kZT5Db250ZXh0PC9jb2RlPiBhcyBhbiBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCBUaGUgY29udGV4dCBwYXRoIHRvIHdoaWNoIHRoaXMgYXBwbGljYXRpb24gc2hvdWxkCisgICAgICogIGJlIGluc3RhbGxlZCAobXVzdCBiZSB1bmlxdWUpCisgICAgICogQHBhcmFtIHdhciBBIFVSTCBvZiB0eXBlICJqYXI6IiB0aGF0IHBvaW50cyB0byBhIFdBUiBmaWxlLCBvciB0eXBlCisgICAgICogICJmaWxlOiIgdGhhdCBwb2ludHMgdG8gYW4gdW5wYWNrZWQgZGlyZWN0b3J5IHN0cnVjdHVyZSBjb250YWluaW5nCisgICAgICogIHRoZSB3ZWIgYXBwbGljYXRpb24gdG8gYmUgaW5zdGFsbGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aAorICAgICAqICBpcyBtYWxmb3JtZWQgKGl0IG11c3QgYmUgIiIgb3Igc3RhcnQgd2l0aCBhIHNsYXNoKQorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoCisgICAgICogIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYW4gZXhpc3Rpbmcgd2ViIGFwcGxpY2F0aW9uCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnN0YWxsQ29udGV4dChTdHJpbmcgY29udGV4dFBhdGgsIFVSTCB3YXIpOworCisgICAgLyoqCisgICAgICogU3RvcCBhbiBleGlzdGluZyB3ZWIgYXBwbGljYXRpb24sIGF0dGFjaGVkIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dAorICAgICAqIHBhdGguICBPbmx5IHN0b3BzIGEgd2ViIGFwcGxpY2F0aW9uIGlmIGl0IGlzIHJ1bm5pbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGggVGhlIGNvbnRleHQgcGF0aCBvZiB0aGUgYXBwbGljYXRpb24gdG8gYmUgc3RvcHBlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGgKKyAgICAgKiAgaXMgbWFsZm9ybWVkIChpdCBtdXN0IGJlICIiIG9yIHN0YXJ0IHdpdGggYSBzbGFzaCkKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aCBkb2VzCisgICAgICogIG5vdCBpZGVudGlmeSBhIGN1cnJlbnRseSBpbnN0YWxsZWQgd2ViIGFwcGxpY2F0aW9uCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzIHdoaWxlIHN0b3BwaW5nCisgICAgICogIHRoZSB3ZWIgYXBwbGljYXRpb24KKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoU3RyaW5nIGNvbnRleHRQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0NvbnRhaW5lZC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0NvbnRhaW5lZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2N2E2NzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQ29udGFpbmVkLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKKy8qKgorICogPHA+RGVjb3VwbGluZyBpbnRlcmZhY2Ugd2hpY2ggc3BlY2lmaWVzIHRoYXQgYW4gaW1wbGVtZW50aW5nIGNsYXNzIGlzCisgKiBhc3NvY2lhdGVkIHdpdGggYXQgbW9zdCBvbmUgPHN0cm9uZz5Db250YWluZXI8L3N0cm9uZz4gaW5zdGFuY2UuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBQZXRlciBEb25hbGQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGludGVyZmFjZSBDb250YWluZWQgeworCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5Db250YWluZXI8L2NvZGU+IHdpdGggd2hpY2ggdGhpcyBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkCisgICAgICogKGlmIGFueSk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lciBnZXRDb250YWluZXIoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8Y29kZT5Db250YWluZXI8L2NvZGU+IHdpdGggd2hpY2ggdGhpcyBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgQ29udGFpbmVyIGluc3RhbmNlIHdpdGggd2hpY2ggdGhpcyBpbnN0YW5jZSBpcyB0bworICAgICAqICBiZSBhc3NvY2lhdGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBkaXNhc3NvY2lhdGUgdGhpcyBpbnN0YW5jZQorICAgICAqICBmcm9tIGFueSBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGNvbnRhaW5lcik7CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0NvbnRhaW5lci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0NvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YzBlMTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSw0NDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworCisKKy8qKgorICogQSA8Yj5Db250YWluZXI8L2I+IGlzIGFuIG9iamVjdCB0aGF0IGNhbiBleGVjdXRlIHJlcXVlc3RzIHJlY2VpdmVkIGZyb20KKyAqIGEgY2xpZW50LCBhbmQgcmV0dXJuIHJlc3BvbnNlcyBiYXNlZCBvbiB0aG9zZSByZXF1ZXN0cy4gIEEgQ29udGFpbmVyIG1heQorICogb3B0aW9uYWxseSBzdXBwb3J0IGEgcGlwZWxpbmUgb2YgVmFsdmVzIHRoYXQgcHJvY2VzcyB0aGUgcmVxdWVzdCBpbiBhbgorICogb3JkZXIgY29uZmlndXJlZCBhdCBydW50aW1lLCBieSBpbXBsZW1lbnRpbmcgdGhlIDxiPlBpcGVsaW5lPC9iPiBpbnRlcmZhY2UKKyAqIGFzIHdlbGwuCisgKiA8cD4KKyAqIENvbnRhaW5lcnMgd2lsbCBleGlzdCBhdCBzZXZlcmFsIGNvbmNlcHR1YWwgbGV2ZWxzIHdpdGhpbiBDYXRhbGluYS4gIFRoZQorICogZm9sbG93aW5nIGV4YW1wbGVzIHJlcHJlc2VudCBjb21tb24gY2FzZXM6CisgKiA8dWw+CisgKiA8bGk+PGI+RW5naW5lPC9iPiAtIFJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbnRpcmUgQ2F0YWxpbmEgc2VydmxldCBlbmdpbmUsCisgKiAgICAgbW9zdCBsaWtlbHkgY29udGFpbmluZyBvbmUgb3IgbW9yZSBzdWJjb250YWluZXJzIHRoYXQgYXJlIGVpdGhlciBIb3N0CisgKiAgICAgb3IgQ29udGV4dCBpbXBsZW1lbnRhdGlvbnMsIG9yIG90aGVyIGN1c3RvbSBncm91cHMuCisgKiA8bGk+PGI+SG9zdDwvYj4gLSBSZXByZXNlbnRhdGlvbiBvZiBhIHZpcnR1YWwgaG9zdCBjb250YWluaW5nIGEgbnVtYmVyCisgKiAgICAgb2YgQ29udGV4dHMuCisgKiA8bGk+PGI+Q29udGV4dDwvYj4gLSBSZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBTZXJ2bGV0Q29udGV4dCwgd2hpY2ggd2lsbAorICogICAgIHR5cGljYWxseSBjb250YWluIG9uZSBvciBtb3JlIFdyYXBwZXJzIGZvciB0aGUgc3VwcG9ydGVkIHNlcnZsZXRzLgorICogPGxpPjxiPldyYXBwZXI8L2I+IC0gUmVwcmVzZW50YXRpb24gb2YgYW4gaW5kaXZpZHVhbCBzZXJ2bGV0IGRlZmluaXRpb24KKyAqICAgICAod2hpY2ggbWF5IHN1cHBvcnQgbXVsdGlwbGUgc2VydmxldCBpbnN0YW5jZXMgaWYgdGhlIHNlcnZsZXQgaXRzZWxmCisgKiAgICAgaW1wbGVtZW50cyBTaW5nbGVUaHJlYWRNb2RlbCkuCisgKiA8L3VsPgorICogQSBnaXZlbiBkZXBsb3ltZW50IG9mIENhdGFsaW5hIG5lZWQgbm90IGluY2x1ZGUgQ29udGFpbmVycyBhdCBhbGwgb2YgdGhlCisgKiBsZXZlbHMgZGVzY3JpYmVkIGFib3ZlLiAgRm9yIGV4YW1wbGUsIGFuIGFkbWluaXN0cmF0aW9uIGFwcGxpY2F0aW9uCisgKiBlbWJlZGRlZCB3aXRoaW4gYSBuZXR3b3JrIGRldmljZSAoc3VjaCBhcyBhIHJvdXRlcikgbWlnaHQgb25seSBjb250YWluCisgKiBhIHNpbmdsZSBDb250ZXh0IGFuZCBhIGZldyBXcmFwcGVycywgb3IgZXZlbiBhIHNpbmdsZSBXcmFwcGVyIGlmIHRoZQorICogYXBwbGljYXRpb24gaXMgcmVsYXRpdmVseSBzbWFsbC4gIFRoZXJlZm9yZSwgQ29udGFpbmVyIGltcGxlbWVudGF0aW9ucworICogbmVlZCB0byBiZSBkZXNpZ25lZCBzbyB0aGF0IHRoZXkgd2lsbCBvcGVyYXRlIGNvcnJlY3RseSBpbiB0aGUgYWJzZW5jZQorICogb2YgcGFyZW50IENvbnRhaW5lcnMgaW4gYSBnaXZlbiBkZXBsb3ltZW50LgorICogPHA+CisgKiBBIENvbnRhaW5lciBtYXkgYWxzbyBiZSBhc3NvY2lhdGVkIHdpdGggYSBudW1iZXIgb2Ygc3VwcG9ydCBjb21wb25lbnRzCisgKiB0aGF0IHByb3ZpZGUgZnVuY3Rpb25hbGl0eSB3aGljaCBtaWdodCBiZSBzaGFyZWQgKGJ5IGF0dGFjaGluZyBpdCB0byBhCisgKiBwYXJlbnQgQ29udGFpbmVyKSBvciBpbmRpdmlkdWFsbHkgY3VzdG9taXplZC4gIFRoZSBmb2xsb3dpbmcgc3VwcG9ydAorICogY29tcG9uZW50cyBhcmUgY3VycmVudGx5IHJlY29nbml6ZWQ6CisgKiA8dWw+CisgKiA8bGk+PGI+TG9hZGVyPC9iPiAtIENsYXNzIGxvYWRlciB0byB1c2UgZm9yIGludGVncmF0aW5nIG5ldyBKYXZhIGNsYXNzZXMKKyAqICAgICBmb3IgdGhpcyBDb250YWluZXIgaW50byB0aGUgSlZNIGluIHdoaWNoIENhdGFsaW5hIGlzIHJ1bm5pbmcuCisgKiA8bGk+PGI+TG9nZ2VyPC9iPiAtIEltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5sb2coKTwvY29kZT4gbWV0aG9kCisgKiAgICAgc2lnbmF0dXJlcyBvZiB0aGUgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+IGludGVyZmFjZS4KKyAqIDxsaT48Yj5NYW5hZ2VyPC9iPiAtIE1hbmFnZXIgZm9yIHRoZSBwb29sIG9mIFNlc3Npb25zIGFzc29jaWF0ZWQgd2l0aAorICogICAgIHRoaXMgQ29udGFpbmVyLgorICogPGxpPjxiPlJlYWxtPC9iPiAtIFJlYWQtb25seSBpbnRlcmZhY2UgdG8gYSBzZWN1cml0eSBkb21haW4sIGZvcgorICogICAgIGF1dGhlbnRpY2F0aW5nIHVzZXIgaWRlbnRpdGllcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyByb2xlcy4KKyAqIDxsaT48Yj5SZXNvdXJjZXM8L2I+IC0gSk5ESSBkaXJlY3RvcnkgY29udGV4dCBlbmFibGluZyBhY2Nlc3MgdG8gc3RhdGljCisgKiAgICAgcmVzb3VyY2VzLCBlbmFibGluZyBjdXN0b20gbGlua2FnZXMgdG8gZXhpc3Rpbmcgc2VydmVyIGNvbXBvbmVudHMgd2hlbgorICogICAgIENhdGFsaW5hIGlzIGVtYmVkZGVkIGluIGEgbGFyZ2VyIHNlcnZlci4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgQ29udGFpbmVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFuaWZlc3QgQ29uc3RhbnRzCisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXJFdmVudCBldmVudCB0eXBlIHNlbnQgd2hlbiBhIGNoaWxkIGNvbnRhaW5lciBpcyBhZGRlZAorICAgICAqIGJ5IDxjb2RlPmFkZENoaWxkKCk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9DSElMRF9FVkVOVCA9ICJhZGRDaGlsZCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXJFdmVudCBldmVudCB0eXBlIHNlbnQgd2hlbiBhIE1hcHBlciBpcyBhZGRlZAorICAgICAqIGJ5IDxjb2RlPmFkZE1hcHBlcigpPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfTUFQUEVSX0VWRU5UID0gImFkZE1hcHBlciI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXJFdmVudCBldmVudCB0eXBlIHNlbnQgd2hlbiBhIHZhbHZlIGlzIGFkZGVkCisgICAgICogYnkgPGNvZGU+YWRkVmFsdmUoKTwvY29kZT4sIGlmIHRoaXMgQ29udGFpbmVyIHN1cHBvcnRzIHBpcGVsaW5lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfVkFMVkVfRVZFTlQgPSAiYWRkVmFsdmUiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29udGFpbmVyRXZlbnQgZXZlbnQgdHlwZSBzZW50IHdoZW4gYSBjaGlsZCBjb250YWluZXIgaXMgcmVtb3ZlZAorICAgICAqIGJ5IDxjb2RlPnJlbW92ZUNoaWxkKCk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9DSElMRF9FVkVOVCA9ICJyZW1vdmVDaGlsZCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXJFdmVudCBldmVudCB0eXBlIHNlbnQgd2hlbiBhIE1hcHBlciBpcyByZW1vdmVkCisgICAgICogYnkgPGNvZGU+cmVtb3ZlTWFwcGVyKCk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9NQVBQRVJfRVZFTlQgPSAicmVtb3ZlTWFwcGVyIjsKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRhaW5lckV2ZW50IGV2ZW50IHR5cGUgc2VudCB3aGVuIGEgdmFsdmUgaXMgcmVtb3ZlZAorICAgICAqIGJ5IDxjb2RlPnJlbW92ZVZhbHZlKCk8L2NvZGU+LCBpZiB0aGlzIENvbnRhaW5lciBzdXBwb3J0cyBwaXBlbGluZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX1ZBTFZFX0VWRU5UID0gInJlbW92ZVZhbHZlIjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIENvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMb2FkZXIgd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLiAgSWYgdGhlcmUgaXMKKyAgICAgKiBubyBhc3NvY2lhdGVkIExvYWRlciwgcmV0dXJuIHRoZSBMb2FkZXIgYXNzb2NpYXRlZCB3aXRoIG91ciBwYXJlbnQKKyAgICAgKiBDb250YWluZXIgKGlmIGFueSk7IG90aGVyd2lzZSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXIgZ2V0TG9hZGVyKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgTG9hZGVyIHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYXNzb2NpYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2FkZXIgVGhlIG5ld2x5IGFzc29jaWF0ZWQgbG9hZGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9hZGVyKExvYWRlciBsb2FkZXIpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExvZ2dlciB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuICBJZiB0aGVyZSBpcworICAgICAqIG5vIGFzc29jaWF0ZWQgTG9nZ2VyLCByZXR1cm4gdGhlIExvZ2dlciBhc3NvY2lhdGVkIHdpdGggb3VyIHBhcmVudAorICAgICAqIENvbnRhaW5lciAoaWYgYW55KTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9nIGdldExvZ2dlcigpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1hbmFnZXIgd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLiAgSWYgdGhlcmUgaXMKKyAgICAgKiBubyBhc3NvY2lhdGVkIE1hbmFnZXIsIHJldHVybiB0aGUgTWFuYWdlciBhc3NvY2lhdGVkIHdpdGggb3VyIHBhcmVudAorICAgICAqIENvbnRhaW5lciAoaWYgYW55KTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFuYWdlciBnZXRNYW5hZ2VyKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgTWFuYWdlciB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgbmV3bHkgYXNzb2NpYXRlZCBNYW5hZ2VyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlcihNYW5hZ2VyIG1hbmFnZXIpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gb2JqZWN0IHdoaWNoIG1heSBiZSB1dGlsaXplZCBmb3IgbWFwcGluZyB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE1hcHBpbmdPYmplY3QoKTsKKworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSk1YIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0TmFtZSgpOyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUGlwZWxpbmUgb2JqZWN0IHRoYXQgbWFuYWdlcyB0aGUgVmFsdmVzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgQ29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBQaXBlbGluZSBnZXRQaXBlbGluZSgpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENsdXN0ZXIgd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLiAgSWYgdGhlcmUgaXMKKyAgICAgKiBubyBhc3NvY2lhdGVkIENsdXN0ZXIsIHJldHVybiB0aGUgQ2x1c3RlciBhc3NvY2lhdGVkIHdpdGggb3VyIHBhcmVudAorICAgICAqIENvbnRhaW5lciAoaWYgYW55KTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2x1c3RlciBnZXRDbHVzdGVyKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ2x1c3RlciB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2x1c3RlciB0aGUgQ2x1c3RlciB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlcihDbHVzdGVyIGNsdXN0ZXIpOworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlbGF5IGJldHdlZW4gdGhlIGludm9jYXRpb24gb2YgdGhlIGJhY2tncm91bmRQcm9jZXNzIG1ldGhvZCBvbgorICAgICAqIHRoaXMgY29udGFpbmVyIGFuZCBpdHMgY2hpbGRyZW4uIENoaWxkIGNvbnRhaW5lcnMgd2lsbCBub3QgYmUgaW52b2tlZAorICAgICAqIGlmIHRoZWlyIGRlbGF5IHZhbHVlIGlzIG5vdCBuZWdhdGl2ZSAod2hpY2ggd291bGQgbWVhbiB0aGV5IGFyZSB1c2luZyAKKyAgICAgKiB0aGVpciBvd24gdGhyZWFkKS4gU2V0dGluZyB0aGlzIHRvIGEgcG9zaXRpdmUgdmFsdWUgd2lsbCBjYXVzZSAKKyAgICAgKiBhIHRocmVhZCB0byBiZSBzcGF3bi4gQWZ0ZXIgd2FpdGluZyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lLCAKKyAgICAgKiB0aGUgdGhyZWFkIHdpbGwgaW52b2tlIHRoZSBleGVjdXRlUGVyaW9kaWMgbWV0aG9kIG9uIHRoaXMgY29udGFpbmVyIAorICAgICAqIGFuZCBhbGwgaXRzIGNoaWxkcmVuLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QmFja2dyb3VuZFByb2Nlc3NvckRlbGF5KCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVsYXkgYmV0d2VlbiB0aGUgaW52b2NhdGlvbiBvZiB0aGUgZXhlY3V0ZSBtZXRob2Qgb24gdGhpcworICAgICAqIGNvbnRhaW5lciBhbmQgaXRzIGNoaWxkcmVuLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkZWxheSBUaGUgZGVsYXkgaW4gc2Vjb25kcyBiZXR3ZWVuIHRoZSBpbnZvY2F0aW9uIG9mIAorICAgICAqICAgICAgICAgICAgICBiYWNrZ3JvdW5kUHJvY2VzcyBtZXRob2RzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZFByb2Nlc3NvckRlbGF5KGludCBkZWxheSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG5hbWUgc3RyaW5nIChzdWl0YWJsZSBmb3IgdXNlIGJ5IGh1bWFucykgdGhhdCBkZXNjcmliZXMgdGhpcworICAgICAqIENvbnRhaW5lci4gIFdpdGhpbiB0aGUgc2V0IG9mIGNoaWxkIGNvbnRhaW5lcnMgYmVsb25naW5nIHRvIGEgcGFydGljdWxhcgorICAgICAqIHBhcmVudCwgQ29udGFpbmVyIG5hbWVzIG11c3QgYmUgdW5pcXVlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBuYW1lIHN0cmluZyAoc3VpdGFibGUgZm9yIHVzZSBieSBodW1hbnMpIHRoYXQgZGVzY3JpYmVzIHRoaXMKKyAgICAgKiBDb250YWluZXIuICBXaXRoaW4gdGhlIHNldCBvZiBjaGlsZCBjb250YWluZXJzIGJlbG9uZ2luZyB0byBhIHBhcnRpY3VsYXIKKyAgICAgKiBwYXJlbnQsIENvbnRhaW5lciBuYW1lcyBtdXN0IGJlIHVuaXF1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5ldyBuYW1lIG9mIHRoaXMgY29udGFpbmVyCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIENvbnRhaW5lciBoYXMgYWxyZWFkeSBiZWVuCisgICAgICogIGFkZGVkIHRvIHRoZSBjaGlsZHJlbiBvZiBhIHBhcmVudCBDb250YWluZXIgKGFmdGVyIHdoaWNoIHRoZSBuYW1lCisgICAgICogIG1heSBub3QgYmUgY2hhbmdlZCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250YWluZXIgZm9yIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGEgY2hpbGQsIGlmIHRoZXJlIGlzCisgICAgICogb25lLiAgSWYgdGhlcmUgaXMgbm8gZGVmaW5lZCBwYXJlbnQsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGdldFBhcmVudCgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhcmVudCBDb250YWluZXIgdG8gd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYmVpbmcgYWRkZWQgYXMgYQorICAgICAqIGNoaWxkLiAgVGhpcyBDb250YWluZXIgbWF5IHJlZnVzZSB0byBiZWNvbWUgYXR0YWNoZWQgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIENvbnRhaW5lciBieSB0aHJvd2luZyBhbiBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIENvbnRhaW5lciB0byB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBiZWluZyBhZGRlZAorICAgICAqICBhcyBhIGNoaWxkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIENvbnRhaW5lciByZWZ1c2VzIHRvIGJlY29tZQorICAgICAqICBhdHRhY2hlZCB0byB0aGUgc3BlY2lmaWVkIENvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChDb250YWluZXIgY29udGFpbmVyKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyIChpZiBhbnkpIGZvciB3ZWIgYXBwbGljYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRQYXJlbnRDbGFzc0xvYWRlcigpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhcmVudCBjbGFzcyBsb2FkZXIgKGlmIGFueSkgZm9yIHdlYiBhcHBsaWNhdGlvbnMuCisgICAgICogVGhpcyBjYWxsIGlzIG1lYW5pbmdmdWwgb25seSA8c3Ryb25nPmJlZm9yZTwvc3Ryb25nPiBhIExvYWRlciBoYXMKKyAgICAgKiBiZWVuIGNvbmZpZ3VyZWQsIGFuZCB0aGUgc3BlY2lmaWVkIHZhbHVlIChpZiBub24tbnVsbCkgc2hvdWxkIGJlCisgICAgICogcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBjbGFzcyBsb2FkZXIgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBuZXcgcGFyZW50IGNsYXNzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUmVhbG0gd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLiAgSWYgdGhlcmUgaXMKKyAgICAgKiBubyBhc3NvY2lhdGVkIFJlYWxtLCByZXR1cm4gdGhlIFJlYWxtIGFzc29jaWF0ZWQgd2l0aCBvdXIgcGFyZW50CisgICAgICogQ29udGFpbmVyIChpZiBhbnkpOyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBSZWFsbSBnZXRSZWFsbSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFJlYWxtIHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYXNzb2NpYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFsbSBUaGUgbmV3bHkgYXNzb2NpYXRlZCBSZWFsbQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlYWxtKFJlYWxtIHJlYWxtKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBSZXNvdXJjZXMgd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLiAgSWYgdGhlcmUKKyAgICAgKiBpcyBubyBhc3NvY2lhdGVkIFJlc291cmNlcyBvYmplY3QsIHJldHVybiB0aGUgUmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIG91ciBwYXJlbnQgQ29udGFpbmVyIChpZiBhbnkpOyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBEaXJDb250ZXh0IGdldFJlc291cmNlcygpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFJlc291cmNlcyBvYmplY3Qgd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlcyBUaGUgbmV3bHkgYXNzb2NpYXRlZCBSZXNvdXJjZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXMoRGlyQ29udGV4dCByZXNvdXJjZXMpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSBhIHBlcmlvZGljIHRhc2ssIHN1Y2ggYXMgcmVsb2FkaW5nLCBldGMuIFRoaXMgbWV0aG9kIHdpbGwgYmUKKyAgICAgKiBpbnZva2VkIGluc2lkZSB0aGUgY2xhc3Nsb2FkaW5nIGNvbnRleHQgb2YgdGhpcyBjb250YWluZXIuIFVuZXhwZWN0ZWQKKyAgICAgKiB0aHJvd2FibGVzIHdpbGwgYmUgY2F1Z2h0IGFuZCBsb2dnZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmFja2dyb3VuZFByb2Nlc3MoKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGNoaWxkIENvbnRhaW5lciB0byB0aG9zZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250YWluZXIsCisgICAgICogaWYgc3VwcG9ydGVkLiAgUHJpb3IgdG8gYWRkaW5nIHRoaXMgQ29udGFpbmVyIHRvIHRoZSBzZXQgb2YgY2hpbGRyZW4sCisgICAgICogdGhlIGNoaWxkJ3MgPGNvZGU+c2V0UGFyZW50KCk8L2NvZGU+IG1ldGhvZCBtdXN0IGJlIGNhbGxlZCwgd2l0aCB0aGlzCisgICAgICogQ29udGFpbmVyIGFzIGFuIGFyZ3VtZW50LiAgVGhpcyBtZXRob2QgbWF5IHRocm93biBhbgorICAgICAqIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaWYgdGhpcyBDb250YWluZXIgY2hvb3NlcyBub3QKKyAgICAgKiB0byBiZSBhdHRhY2hlZCB0byB0aGUgc3BlY2lmaWVkIENvbnRhaW5lciwgaW4gd2hpY2ggY2FzZSBpdCBpcyBub3QgYWRkZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZCBOZXcgY2hpbGQgQ29udGFpbmVyIHRvIGJlIGFkZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkKKyAgICAgKiAgdGhlIDxjb2RlPnNldFBhcmVudCgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIGNoaWxkIENvbnRhaW5lcgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBuZXcgY2hpbGQgZG9lcyBub3QgaGF2ZQorICAgICAqICBhIG5hbWUgdW5pcXVlIGZyb20gdGhhdCBvZiBleGlzdGluZyBjaGlsZHJlbiBvZiB0aGlzIENvbnRhaW5lcgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgQ29udGFpbmVyIGRvZXMgbm90IHN1cHBvcnQKKyAgICAgKiAgY2hpbGQgQ29udGFpbmVycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKENvbnRhaW5lciBjaGlsZCk7CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGNvbnRhaW5lciBldmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29udGFpbmVyTGlzdGVuZXIoQ29udGFpbmVyTGlzdGVuZXIgbGlzdGVuZXIpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2hpbGQgQ29udGFpbmVyLCBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250YWluZXIsIHdpdGgKKyAgICAgKiB0aGUgc3BlY2lmaWVkIG5hbWUgKGlmIGFueSk7IG90aGVyd2lzZSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjaGlsZCBDb250YWluZXIgdG8gYmUgcmV0cmlldmVkCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lciBmaW5kQ2hpbGQoU3RyaW5nIG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBjaGlsZHJlbiBDb250YWluZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbnRhaW5lci4KKyAgICAgKiBJZiB0aGlzIENvbnRhaW5lciBoYXMgbm8gY2hpbGRyZW4sIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lcltdIGZpbmRDaGlsZHJlbigpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBjb250YWluZXIgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbnRhaW5lci4KKyAgICAgKiBJZiB0aGlzIENvbnRhaW5lciBoYXMgbm8gcmVnaXN0ZXJlZCBjb250YWluZXIgbGlzdGVuZXJzLCBhIHplcm8tbGVuZ3RoCisgICAgICogYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lckxpc3RlbmVyW10gZmluZENvbnRhaW5lckxpc3RlbmVycygpOworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgUmVxdWVzdCwgYW5kIGdlbmVyYXRlIHRoZSBjb3JyZXNwb25kaW5nIFJlc3BvbnNlLAorICAgICAqIGFjY29yZGluZyB0byB0aGUgZGVzaWduIG9mIHRoaXMgcGFydGljdWxhciBDb250YWluZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSB0byBiZSBwcm9kdWNlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJyZWQgd2hpbGUKKyAgICAgKiAgcHJvY2Vzc2luZworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIFNlcnZsZXRFeGNlcHRpb24gd2FzIHRocm93bgorICAgICAqICB3aGlsZSBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBleGlzdGluZyBjaGlsZCBDb250YWluZXIgZnJvbSBhc3NvY2lhdGlvbiB3aXRoIHRoaXMgcGFyZW50CisgICAgICogQ29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkIEV4aXN0aW5nIGNoaWxkIENvbnRhaW5lciB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoQ29udGFpbmVyIGNoaWxkKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgY29udGFpbmVyIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvbnRhaW5lckxpc3RlbmVyKENvbnRhaW5lckxpc3RlbmVyIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0NvbnRhaW5lckV2ZW50LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQ29udGFpbmVyRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTgwMjFjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0NvbnRhaW5lckV2ZW50LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworCisKKy8qKgorICogR2VuZXJhbCBldmVudCBmb3Igbm90aWZ5aW5nIGxpc3RlbmVycyBvZiBzaWduaWZpY2FudCBjaGFuZ2VzIG9uIGEgQ29udGFpbmVyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29udGFpbmVyRXZlbnQKKyAgICBleHRlbmRzIEV2ZW50T2JqZWN0IHsKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRhaW5lciBvbiB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkLgorICAgICAqLworICAgIHByaXZhdGUgQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBldmVudCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGRhdGEgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgdHlwZSB0aGlzIGluc3RhbmNlIHJlcHJlc2VudHMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBDb250YWluZXJFdmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXIgQ29udGFpbmVyIG9uIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlCisgICAgICogQHBhcmFtIGRhdGEgRXZlbnQgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXJFdmVudChDb250YWluZXIgY29udGFpbmVyLCBTdHJpbmcgdHlwZSwgT2JqZWN0IGRhdGEpIHsKKworICAgICAgICBzdXBlcihjb250YWluZXIpOworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBldmVudCBkYXRhIG9mIHRoaXMgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXREYXRhKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5kYXRhKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250YWluZXIgb24gd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29udGFpbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBldmVudCB0eXBlIG9mIHRoaXMgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy50eXBlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICByZXR1cm4gKCJDb250YWluZXJFdmVudFsnIiArIGdldENvbnRhaW5lcigpICsgIicsJyIgKworICAgICAgICAgICAgICAgIGdldFR5cGUoKSArICInLCciICsgZ2V0RGF0YSgpICsgIiddIik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0NvbnRhaW5lckxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQ29udGFpbmVyTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTQwMmIxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0NvbnRhaW5lckxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKKworCisvKioKKyAqIEludGVyZmFjZSBkZWZpbmluZyBhIGxpc3RlbmVyIGZvciBzaWduaWZpY2FudCBDb250YWluZXIgZ2VuZXJhdGVkIGV2ZW50cy4KKyAqIE5vdGUgdGhhdCAiY29udGFpbmVyIHN0YXJ0IiBhbmQgImNvbnRhaW5lciBzdG9wIiBldmVudHMgYXJlIG5vcm1hbGx5CisgKiBMaWZlY3ljbGVFdmVudHMsIG5vdCBDb250YWluZXJFdmVudHMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgQ29udGFpbmVyTGlzdGVuZXIgeworCisKKyAgICAvKioKKyAgICAgKiBBY2tub3dsZWRnZSB0aGUgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IENvbnRhaW5lckV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29udGFpbmVyRXZlbnQoQ29udGFpbmVyRXZlbnQgZXZlbnQpOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Db250YWluZXJTZXJ2bGV0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQ29udGFpbmVyU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZTNhZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQ29udGFpbmVyU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCisvKioKKyAqIEEgPGI+Q29udGFpbmVyU2VydmxldDwvYj4gaXMgYSBzZXJ2bGV0IHRoYXQgaGFzIGFjY2VzcyB0byBDYXRhbGluYQorICogaW50ZXJuYWwgZnVuY3Rpb25hbGl0eSwgYW5kIGlzIGxvYWRlZCBmcm9tIHRoZSBDYXRhbGluYSBjbGFzcyBsb2FkZXIKKyAqIGluc3RlYWQgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBjbGFzcyBsb2FkZXIuICBUaGUgcHJvcGVydHkgc2V0dGVyCisgKiBtZXRob2RzIG11c3QgYmUgY2FsbGVkIGJ5IHRoZSBjb250YWluZXIgd2hlbmV2ZXIgYSBuZXcgaW5zdGFuY2Ugb2YKKyAqIHRoaXMgc2VydmxldCBpcyBwdXQgaW50byBzZXJ2aWNlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIENvbnRhaW5lclNlcnZsZXQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBXcmFwcGVyIHdpdGggd2hpY2ggdGhpcyBTZXJ2bGV0IGlzIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHVibGljIFdyYXBwZXIgZ2V0V3JhcHBlcigpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFdyYXBwZXIgd2l0aCB3aGljaCB0aGlzIFNlcnZsZXQgaXMgYXNzb2NpYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cmFwcGVyIFRoZSBuZXcgYXNzb2NpYXRlZCBXcmFwcGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V3JhcHBlcihXcmFwcGVyIHdyYXBwZXIpOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Db250ZXh0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNmQ3YTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMTA0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5odHRwLm1hcHBlci5NYXBwZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5BcHBsaWNhdGlvblBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5FcnJvclBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuRmlsdGVyRGVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkZpbHRlck1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Mb2dpbkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuU2VjdXJpdHlDb25zdHJhaW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5DaGFyc2V0TWFwcGVyOworCisKKy8qKgorICogQSA8Yj5Db250ZXh0PC9iPiBpcyBhIENvbnRhaW5lciB0aGF0IHJlcHJlc2VudHMgYSBzZXJ2bGV0IGNvbnRleHQsIGFuZAorICogdGhlcmVmb3JlIGFuIGluZGl2aWR1YWwgd2ViIGFwcGxpY2F0aW9uLCBpbiB0aGUgQ2F0YWxpbmEgc2VydmxldCBlbmdpbmUuCisgKiBJdCBpcyB0aGVyZWZvcmUgdXNlZnVsIGluIGFsbW9zdCBldmVyeSBkZXBsb3ltZW50IG9mIENhdGFsaW5hIChldmVuIGlmIGEKKyAqIENvbm5lY3RvciBhdHRhY2hlZCB0byBhIHdlYiBzZXJ2ZXIgKHN1Y2ggYXMgQXBhY2hlKSB1c2VzIHRoZSB3ZWIgc2VydmVyJ3MKKyAqIGZhY2lsaXRpZXMgdG8gaWRlbnRpZnkgdGhlIGFwcHJvcHJpYXRlIFdyYXBwZXIgdG8gaGFuZGxlIHRoaXMgcmVxdWVzdC4KKyAqIEl0IGFsc28gcHJvdmlkZXMgYSBjb252ZW5pZW50IG1lY2hhbmlzbSB0byB1c2UgSW50ZXJjZXB0b3JzIHRoYXQgc2VlCisgKiBldmVyeSByZXF1ZXN0IHByb2Nlc3NlZCBieSB0aGlzIHBhcnRpY3VsYXIgd2ViIGFwcGxpY2F0aW9uLgorICogPHA+CisgKiBUaGUgcGFyZW50IENvbnRhaW5lciBhdHRhY2hlZCB0byBhIENvbnRleHQgaXMgZ2VuZXJhbGx5IGEgSG9zdCwgYnV0IG1heQorICogYmUgc29tZSBvdGhlciBpbXBsZW1lbnRhdGlvbiwgb3IgbWF5IGJlIG9taXR0ZWQgaWYgaXQgaXMgbm90IG5lY2Vzc2FyeS4KKyAqIDxwPgorICogVGhlIGNoaWxkIGNvbnRhaW5lcnMgYXR0YWNoZWQgdG8gYSBDb250ZXh0IGFyZSBnZW5lcmFsbHkgaW1wbGVtZW50YXRpb25zCisgKiBvZiBXcmFwcGVyIChyZXByZXNlbnRpbmcgaW5kaXZpZHVhbCBzZXJ2bGV0IGRlZmluaXRpb25zKS4KKyAqIDxwPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIENvbnRleHQgZXh0ZW5kcyBDb250YWluZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYW5pZmVzdCBDb25zdGFudHMKKworCisgICAgLyoqCisgICAgICogVGhlIExpZmVjeWNsZUV2ZW50IHR5cGUgc2VudCB3aGVuIGEgY29udGV4dCBpcyByZWxvYWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxPQURfRVZFTlQgPSAicmVsb2FkIjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGluaXRpYWxpemVkIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIG9iamVjdHMsCisgICAgICogaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzcGVjaWZpZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CisgICAgICogZGVzY3JpcHRvciwgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlCisgICAgICogIHRoaXMgYXBwbGljYXRpb24gaGFzIHN0YXJ0ZWQsIG9yIGFmdGVyIGl0IGhhcyBiZWVuIHN0b3BwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0QXBwbGljYXRpb25FdmVudExpc3RlbmVycygpOworCisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgc2V0IG9mIGluaXRpYWxpemVkIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIG9iamVjdHMsCisgICAgICogaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzcGVjaWZpZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CisgICAgICogZGVzY3JpcHRvciwgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXJzIFRoZSBzZXQgb2YgaW5zdGFudGlhdGVkIGxpc3RlbmVyIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb25FdmVudExpc3RlbmVycyhPYmplY3QgbGlzdGVuZXJzW10pOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBpbml0aWFsaXplZCBhcHBsaWNhdGlvbiBsaWZlY3ljbGUgbGlzdGVuZXIgb2JqZWN0cywKKyAgICAgKiBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHNwZWNpZmllZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKKyAgICAgKiBkZXNjcmlwdG9yLCBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUKKyAgICAgKiAgdGhpcyBhcHBsaWNhdGlvbiBoYXMgc3RhcnRlZCwgb3IgYWZ0ZXIgaXQgaGFzIGJlZW4gc3RvcHBlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3RbXSBnZXRBcHBsaWNhdGlvbkxpZmVjeWNsZUxpc3RlbmVycygpOworCisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgc2V0IG9mIGluaXRpYWxpemVkIGFwcGxpY2F0aW9uIGxpZmVjeWNsZSBsaXN0ZW5lciBvYmplY3RzLAorICAgICAqIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgc3BlY2lmaWVkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudAorICAgICAqIGRlc2NyaXB0b3IsIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVycyBUaGUgc2V0IG9mIGluc3RhbnRpYXRlZCBsaXN0ZW5lciBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uTGlmZWN5Y2xlTGlzdGVuZXJzKE9iamVjdCBsaXN0ZW5lcnNbXSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXBwbGljYXRpb24gYXZhaWxhYmxlIGZsYWcgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBdmFpbGFibGUoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhcHBsaWNhdGlvbiBhdmFpbGFibGUgZmxhZyBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGF2YWlsYWJsZSBUaGUgbmV3IGFwcGxpY2F0aW9uIGF2YWlsYWJsZSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlKGJvb2xlYW4gYXZhaWxhYmxlKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMb2NhbGUgdG8gY2hhcmFjdGVyIHNldCBtYXBwZXIgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhcnNldE1hcHBlciBnZXRDaGFyc2V0TWFwcGVyKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgTG9jYWxlIHRvIGNoYXJhY3RlciBzZXQgbWFwcGVyIGZvciB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGVyIFRoZSBuZXcgbWFwcGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hhcnNldE1hcHBlcihDaGFyc2V0TWFwcGVyIG1hcHBlcik7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGF0aCB0byBhIGZpbGUgdG8gc2F2ZSB0aGlzIENvbnRleHQgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25maWdGaWxlKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGF0aCB0byBhIGZpbGUgdG8gc2F2ZSB0aGlzIENvbnRleHQgaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnRmlsZSBUaGUgcGF0aCB0byBhIGZpbGUgdG8gc2F2ZSB0aGlzIENvbnRleHQgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnRmlsZShTdHJpbmcgY29uZmlnRmlsZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgImNvcnJlY3RseSBjb25maWd1cmVkIiBmbGFnIGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q29uZmlndXJlZCgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlICJjb3JyZWN0bHkgY29uZmlndXJlZCIgZmxhZyBmb3IgdGhpcyBDb250ZXh0LiAgVGhpcyBjYW4gYmUKKyAgICAgKiBzZXQgdG8gZmFsc2UgYnkgc3RhcnR1cCBsaXN0ZW5lcnMgdGhhdCBkZXRlY3QgYSBmYXRhbCBjb25maWd1cmF0aW9uCisgICAgICogZXJyb3IgdG8gYXZvaWQgdGhlIGFwcGxpY2F0aW9uIGZyb20gYmVpbmcgbWFkZSBhdmFpbGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlndXJlZCBUaGUgbmV3IGNvcnJlY3RseSBjb25maWd1cmVkIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmVkKGJvb2xlYW4gY29uZmlndXJlZCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgInVzZSBjb29raWVzIGZvciBzZXNzaW9uIGlkcyIgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDb29raWVzKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgInVzZSBjb29raWVzIGZvciBzZXNzaW9uIGlkcyIgZmxhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb29raWVzIFRoZSBuZXcgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvb2tpZXMoYm9vbGVhbiBjb29raWVzKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSAiYWxsb3cgY3Jvc3Npbmcgc2VydmxldCBjb250ZXh0cyIgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDcm9zc0NvbnRleHQoKTsKKworCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhbHRlcm5hdGUgRGVwbG95bWVudCBEZXNjcmlwdG9yIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBbHRERE5hbWUoKTsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gYWx0ZXJuYXRlIERlcGxveW1lbnQgRGVzY3JpcHRvciBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFsdERETmFtZShTdHJpbmcgYWx0REROYW1lKSA7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSAiYWxsb3cgY3Jvc3Npbmcgc2VydmxldCBjb250ZXh0cyIgZmxhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjcm9zc0NvbnRleHQgVGhlIG5ldyBjcm9zcyBjb250ZXh0cyBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q3Jvc3NDb250ZXh0KGJvb2xlYW4gY3Jvc3NDb250ZXh0KTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXNwbGF5TmFtZSBUaGUgbmV3IGRpc3BsYXkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBkaXNwbGF5TmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlzdHJpYnV0YWJsZSBmbGFnIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREaXN0cmlidXRhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlzdHJpYnV0YWJsZSBmbGFnIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXN0cmlidXRhYmxlIFRoZSBuZXcgZGlzdHJpYnV0YWJsZSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzdHJpYnV0YWJsZShib29sZWFuIGRpc3RyaWJ1dGFibGUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRvY3VtZW50IHJvb3QgZm9yIHRoaXMgQ29udGV4dC4gIFRoaXMgY2FuIGJlIGFuIGFic29sdXRlCisgICAgICogcGF0aG5hbWUsIGEgcmVsYXRpdmUgcGF0aG5hbWUsIG9yIGEgVVJMLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jQmFzZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRvY3VtZW50IHJvb3QgZm9yIHRoaXMgQ29udGV4dC4gIFRoaXMgY2FuIGJlIGFuIGFic29sdXRlCisgICAgICogcGF0aG5hbWUsIGEgcmVsYXRpdmUgcGF0aG5hbWUsIG9yIGEgVVJMLgorICAgICAqCisgICAgICogQHBhcmFtIGRvY0Jhc2UgVGhlIG5ldyBkb2N1bWVudCByb290CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9jQmFzZShTdHJpbmcgZG9jQmFzZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgVVJMIGVuY29kZWQgY29udGV4dCBwYXRoLCB1c2luZyBVVEYtOC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kZWRQYXRoKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9naW4gY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9naW5Db25maWcgZ2V0TG9naW5Db25maWcoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2dpbiBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBUaGUgbmV3IGxvZ2luIGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2dpbkNvbmZpZyhMb2dpbkNvbmZpZyBjb25maWcpOworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlcXVlc3QgZGlzcGF0Y2hlciBtYXBwZXIuCisgICAgICovCisgICAgcHVibGljIE1hcHBlciBnZXRNYXBwZXIoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1pbmcgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nUmVzb3VyY2VzIGdldE5hbWluZ1Jlc291cmNlcygpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWluZyByZXNvdXJjZXMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWluZ1Jlc291cmNlcyBUaGUgbmV3IG5hbWluZyByZXNvdXJjZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1pbmdSZXNvdXJjZXMoTmFtaW5nUmVzb3VyY2VzIG5hbWluZ1Jlc291cmNlcyk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29udGV4dCBwYXRoIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb250ZXh0IHBhdGggZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIG5ldyBjb250ZXh0IHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIERURCB0aGF0IGlzCisgICAgICogY3VycmVudGx5IGJlaW5nIHBhcnNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBEVEQgdGhhdCBpcworICAgICAqIGN1cnJlbnRseSBiZWluZyBwYXJzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHVibGljSWQgVGhlIHB1YmxpYyBpZGVudGlmaWVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZWxvYWRhYmxlIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJlbG9hZGFibGUoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZWxvYWRhYmxlIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlbG9hZGFibGUgVGhlIG5ldyByZWxvYWRhYmxlIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWxvYWRhYmxlKGJvb2xlYW4gcmVsb2FkYWJsZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb3ZlcnJpZGUgZmxhZyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0T3ZlcnJpZGUoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvdmVycmlkZSBmbGFnIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdmVycmlkZSBUaGUgbmV3IG92ZXJyaWRlIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZShib29sZWFuIG92ZXJyaWRlKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcml2aWxlZ2VkIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFByaXZpbGVnZWQoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcml2aWxlZ2VkIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHByaXZpbGVnZWQgVGhlIG5ldyBwcml2aWxlZ2VkIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcml2aWxlZ2VkKGJvb2xlYW4gcHJpdmlsZWdlZCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VydmxldCBjb250ZXh0IGZvciB3aGljaCB0aGlzIENvbnRleHQgaXMgYSBmYWNhZGUuCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCBzZXNzaW9uIHRpbWVvdXQgKGluIG1pbnV0ZXMpIGZvciB0aGlzCisgICAgICogd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2Vzc2lvblRpbWVvdXQoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWZhdWx0IHNlc3Npb24gdGltZW91dCAoaW4gbWludXRlcykgZm9yIHRoaXMKKyAgICAgKiB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZW91dCBUaGUgbmV3IGRlZmF1bHQgc2Vzc2lvbiB0aW1lb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvblRpbWVvdXQoaW50IHRpbWVvdXQpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzd2FsbG93T3V0cHV0IGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U3dhbGxvd091dHB1dCgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBzd2FsbG93T3V0cHV0IGZsYWcuIElmIHNldCB0byB0cnVlLCB0aGUgc3lzdGVtLm91dAorICAgICAqIGFuZCBzeXN0ZW0uZXJyIHdpbGwgYmUgcmVkaXJlY3RlZCB0byB0aGUgbG9nZ2VyIGR1cmluZyBhIHNlcnZsZXQKKyAgICAgKiBleGVjdXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3dhbGxvd091dHB1dCBUaGUgbmV3IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3dhbGxvd091dHB1dChib29sZWFuIHN3YWxsb3dPdXRwdXQpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgV3JhcHBlciBpbXBsZW1lbnRhdGlvbiB1c2VkCisgICAgICogZm9yIHNlcnZsZXRzIHJlZ2lzdGVyZWQgaW4gdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0V3JhcHBlckNsYXNzKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBXcmFwcGVyIGltcGxlbWVudGF0aW9uIHVzZWQKKyAgICAgKiBmb3Igc2VydmxldHMgcmVnaXN0ZXJlZCBpbiB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JhcHBlckNsYXNzIFRoZSBuZXcgd3JhcHBlciBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdyYXBwZXJDbGFzcyhTdHJpbmcgd3JhcHBlckNsYXNzKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBMaXN0ZW5lciBjbGFzcyBuYW1lIHRvIHRoZSBzZXQgb2YgTGlzdGVuZXJzCisgICAgICogY29uZmlndXJlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBKYXZhIGNsYXNzIG5hbWUgb2YgYSBsaXN0ZW5lciBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEFwcGxpY2F0aW9uTGlzdGVuZXIoU3RyaW5nIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGFwcGxpY2F0aW9uIHBhcmFtZXRlciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIgVGhlIG5ldyBhcHBsaWNhdGlvbiBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBcHBsaWNhdGlvblBhcmFtZXRlcihBcHBsaWNhdGlvblBhcmFtZXRlciBwYXJhbWV0ZXIpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZWN1cml0eSBjb25zdHJhaW50IHRvIHRoZSBzZXQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IGNvbnN0cmFpbnQpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZXJyb3IgcGFnZSBmb3IgdGhlIHNwZWNpZmllZCBlcnJvciBvciBKYXZhIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvclBhZ2UgVGhlIGVycm9yIHBhZ2UgZGVmaW5pdGlvbiB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yUGFnZShFcnJvclBhZ2UgZXJyb3JQYWdlKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgZmlsdGVyIGRlZmluaXRpb24gdG8gdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlckRlZiBUaGUgZmlsdGVyIGRlZmluaXRpb24gdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXJEZWYoRmlsdGVyRGVmIGZpbHRlckRlZik7CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGZpbHRlciBtYXBwaW5nIHRvIHRoaXMgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJNYXAgVGhlIGZpbHRlciBtYXBwaW5nIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsdGVyTWFwKEZpbHRlck1hcCBmaWx0ZXJNYXApOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGNsYXNzbmFtZSBvZiBhbiBJbnN0YW5jZUxpc3RlbmVyIHRvIGJlIGFkZGVkIHRvIGVhY2gKKyAgICAgKiBXcmFwcGVyIGFwcGVuZGVkIHRvIHRoaXMgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBKYXZhIGNsYXNzIG5hbWUgb2YgYW4gSW5zdGFuY2VMaXN0ZW5lciBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEluc3RhbmNlTGlzdGVuZXIoU3RyaW5nIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiBVUkwgcGF0dGVybiBhcyBhIGpzcC1wcm9wZXJ0eS1ncm91cC4gIFRoaXMgbWFwcworICAgICAqIHJlc291cmNlcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXR0ZXJuIHNvIHRoZXkgd2lsbCBiZSBwYXNzZWQKKyAgICAgKiB0byB0aGUgSlNQIGNvbnRhaW5lci4gIFRob3VnaCB0aGVyZSBhcmUgb3RoZXIgZWxlbWVudHMgaW4gdGhlCisgICAgICogcHJvcGVydHkgZ3JvdXAsIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgVVJMIHBhdHRlcm4gaGVyZS4gIFRoZQorICAgICAqIEpTUCBjb250YWluZXIgd2lsbCBwYXJzZSB0aGUgcmVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIFVSTCBwYXR0ZXJuIHRvIGJlIG1hcHBlZCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRKc3BNYXBwaW5nKFN0cmluZyBwYXR0ZXJuKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgTG9jYWxlIEVuY29kaW5nIE1hcHBpbmcgKHNlZSBTZWMgNS40IG9mIFNlcnZsZXQgc3BlYyAyLjQpCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWxlIGxvY2FsZSB0byBtYXAgYW4gZW5jb2RpbmcgZm9yCisgICAgICogQHBhcmFtIGVuY29kaW5nIGVuY29kaW5nIHRvIGJlIHVzZWQgZm9yIGEgZ2l2ZSBsb2NhbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMb2NhbGVFbmNvZGluZ01hcHBpbmdQYXJhbWV0ZXIoU3RyaW5nIGxvY2FsZSwgU3RyaW5nIGVuY29kaW5nKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IE1JTUUgbWFwcGluZywgcmVwbGFjaW5nIGFueSBleGlzdGluZyBtYXBwaW5nIGZvcgorICAgICAqIHRoZSBzcGVjaWZpZWQgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGV4dGVuc2lvbiBGaWxlbmFtZSBleHRlbnNpb24gYmVpbmcgbWFwcGVkCisgICAgICogQHBhcmFtIG1pbWVUeXBlIENvcnJlc3BvbmRpbmcgTUlNRSB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTWltZU1hcHBpbmcoU3RyaW5nIGV4dGVuc2lvbiwgU3RyaW5nIG1pbWVUeXBlKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyLCByZXBsYWNpbmcgYW55IGV4aXN0aW5nCisgICAgICogdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG5ldyBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgb2YgdGhlIG5ldyAgcGFyYW1ldGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBTZWN1cml0eSByb2xlIHVzZWQgaW4gdGhlIGFwcGxpY2F0aW9uCisgICAgICogQHBhcmFtIGxpbmsgQWN0dWFsIHNlY3VyaXR5IHJvbGUgdG8gY2hlY2sgZm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUm9sZU1hcHBpbmcoU3RyaW5nIHJvbGUsIFN0cmluZyBsaW5rKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHNlY3VyaXR5IHJvbGUgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgTmV3IHNlY3VyaXR5IHJvbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTZWN1cml0eVJvbGUoU3RyaW5nIHJvbGUpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgc2VydmxldCBtYXBwaW5nLCByZXBsYWNpbmcgYW55IGV4aXN0aW5nIG1hcHBpbmcgZm9yCisgICAgICogdGhlIHNwZWNpZmllZCBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gVVJMIHBhdHRlcm4gdG8gYmUgbWFwcGVkCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBzZXJ2bGV0IHRvIGV4ZWN1dGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTZXJ2bGV0TWFwcGluZyhTdHJpbmcgcGF0dGVybiwgU3RyaW5nIG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBKU1AgdGFnIGxpYnJhcnkgZm9yIHRoZSBzcGVjaWZpZWQgVVJJLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBVUkksIHJlbGF0aXZlIHRvIHRoZSB3ZWIueG1sIGZpbGUsIG9mIHRoaXMgdGFnIGxpYnJhcnkKKyAgICAgKiBAcGFyYW0gbG9jYXRpb24gTG9jYXRpb24gb2YgdGhlIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUYWdsaWIoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2F0aW9uKTsKKworICAgIAorICAgIC8qKgorICAgICAqIEFkZCBhIHJlc291cmNlIHdoaWNoIHdpbGwgYmUgd2F0Y2hlZCBmb3IgcmVsb2FkaW5nIGJ5IHRoZSBob3N0IGF1dG8KKyAgICAgKiBkZXBsb3llci4gTm90ZTogdGhpcyB3aWxsIG5vdCBiZSB1c2VkIGluIGVtYmVkZGVkIG1vZGUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgUGF0aCB0byB0aGUgcmVzb3VyY2UsIHJlbGF0aXZlIHRvIGRvY0Jhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRXYXRjaGVkUmVzb3VyY2UoU3RyaW5nIG5hbWUpOworICAgIAorCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHdlbGNvbWUgZmlsZSB0byB0aGUgc2V0IHJlY29nbml6ZWQgYnkgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmV3IHdlbGNvbWUgZmlsZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkV2VsY29tZUZpbGUoU3RyaW5nIG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGNsYXNzbmFtZSBvZiBhIExpZmVjeWNsZUxpc3RlbmVyIHRvIGJlIGFkZGVkIHRvIGVhY2gKKyAgICAgKiBXcmFwcGVyIGFwcGVuZGVkIHRvIHRoaXMgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBKYXZhIGNsYXNzIG5hbWUgb2YgYSBMaWZlY3ljbGVMaXN0ZW5lciBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFdyYXBwZXJMaWZlY3ljbGUoU3RyaW5nIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBjbGFzc25hbWUgb2YgYSBDb250YWluZXJMaXN0ZW5lciB0byBiZSBhZGRlZCB0byBlYWNoCisgICAgICogV3JhcHBlciBhcHBlbmRlZCB0byB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgSmF2YSBjbGFzcyBuYW1lIG9mIGEgQ29udGFpbmVyTGlzdGVuZXIgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRXcmFwcGVyTGlzdGVuZXIoU3RyaW5nIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgV3JhcHBlciBpbnN0YW5jZSwgb2YKKyAgICAgKiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBhcHByb3ByaWF0ZSBmb3IgdGhpcyBDb250ZXh0CisgICAgICogaW1wbGVtZW50YXRpb24uICBUaGUgY29uc3RydWN0b3Igb2YgdGhlIGluc3RhbnRpYXRlZCBXcmFwcGVyCisgICAgICogd2lsbCBoYXZlIGJlZW4gY2FsbGVkLCBidXQgbm8gcHJvcGVydGllcyB3aWxsIGhhdmUgYmVlbiBzZXQuCisgICAgICovCisgICAgcHVibGljIFdyYXBwZXIgY3JlYXRlV3JhcHBlcigpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBjbGFzcyBuYW1lcyBjb25maWd1cmVkCisgICAgICogZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRBcHBsaWNhdGlvbkxpc3RlbmVycygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBhcHBsaWNhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvblBhcmFtZXRlcltdIGZpbmRBcHBsaWNhdGlvblBhcmFtZXRlcnMoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Ygc2VjdXJpdHkgY29uc3RyYWludHMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqIElmIHRoZXJlIGFyZSBub25lLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTZWN1cml0eUNvbnN0cmFpbnRbXSBmaW5kQ29uc3RyYWludHMoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlcnJvciBwYWdlIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIEhUVFAgZXJyb3IgY29kZSwKKyAgICAgKiBpZiBhbnk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyb3JDb2RlIEVycm9yIGNvZGUgdG8gbG9vayB1cAorICAgICAqLworICAgIHB1YmxpYyBFcnJvclBhZ2UgZmluZEVycm9yUGFnZShpbnQgZXJyb3JDb2RlKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlcnJvciBwYWdlIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIEphdmEgZXhjZXB0aW9uIHR5cGUsCisgICAgICogaWYgYW55OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2VwdGlvblR5cGUgRXhjZXB0aW9uIHR5cGUgdG8gbG9vayB1cAorICAgICAqLworICAgIHB1YmxpYyBFcnJvclBhZ2UgZmluZEVycm9yUGFnZShTdHJpbmcgZXhjZXB0aW9uVHlwZSk7CisKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgZGVmaW5lZCBlcnJvciBwYWdlcyBmb3IgYWxsIHNwZWNpZmllZCBlcnJvciBjb2RlcworICAgICAqIGFuZCBleGNlcHRpb24gdHlwZXMuCisgICAgICovCisgICAgcHVibGljIEVycm9yUGFnZVtdIGZpbmRFcnJvclBhZ2VzKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZmlsdGVyIGRlZmluaXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgZmlsdGVyIG5hbWUsIGlmIGFueTsKKyAgICAgKiBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlck5hbWUgRmlsdGVyIG5hbWUgdG8gbG9vayB1cAorICAgICAqLworICAgIHB1YmxpYyBGaWx0ZXJEZWYgZmluZEZpbHRlckRlZihTdHJpbmcgZmlsdGVyTmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGRlZmluZWQgZmlsdGVycyBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBGaWx0ZXJEZWZbXSBmaW5kRmlsdGVyRGVmcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBmaWx0ZXIgbWFwcGluZ3MgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsdGVyTWFwW10gZmluZEZpbHRlck1hcHMoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgSW5zdGFuY2VMaXN0ZW5lciBjbGFzc2VzIHRoYXQgd2lsbCBiZSBhZGRlZCB0bworICAgICAqIG5ld2x5IGNyZWF0ZWQgV3JhcHBlcnMgYXV0b21hdGljYWxseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZEluc3RhbmNlTGlzdGVuZXJzKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUlNRSB0eXBlIHRvIHdoaWNoIHRoZSBzcGVjaWZpZWQgZXh0ZW5zaW9uIGlzIG1hcHBlZCwKKyAgICAgKiBpZiBhbnk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uIEV4dGVuc2lvbiB0byBtYXAgdG8gYSBNSU1FIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGZpbmRNaW1lTWFwcGluZyhTdHJpbmcgZXh0ZW5zaW9uKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBleHRlbnNpb25zIGZvciB3aGljaCBNSU1FIG1hcHBpbmdzIGFyZSBkZWZpbmVkLiAgSWYgdGhlcmUKKyAgICAgKiBhcmUgbm9uZSwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZE1pbWVNYXBwaW5ncygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRleHQgaW5pdGlhbGl6YXRpb24KKyAgICAgKiBwYXJhbWV0ZXIgbmFtZSwgaWYgYW55OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZmluZFBhcmFtZXRlcihTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIGRlZmluZWQgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzCisgICAgICogZm9yIHRoaXMgQ29udGV4dC4gIElmIG5vIHBhcmFtZXRlcnMgYXJlIGRlZmluZWQsIGEgemVyby1sZW5ndGgKKyAgICAgKiBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZFBhcmFtZXRlcnMoKTsKKworCisgICAgLyoqCisgICAgICogRm9yIHRoZSBnaXZlbiBzZWN1cml0eSByb2xlIChhcyB1c2VkIGJ5IGFuIGFwcGxpY2F0aW9uKSwgcmV0dXJuIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgcm9sZSBuYW1lIChhcyBkZWZpbmVkIGJ5IHRoZSB1bmRlcmx5aW5nIFJlYWxtKSBpZiB0aGVyZQorICAgICAqIGlzIG9uZS4gIE90aGVyd2lzZSwgcmV0dXJuIHRoZSBzcGVjaWZpZWQgcm9sZSB1bmNoYW5nZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBTZWN1cml0eSByb2xlIHRvIG1hcAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZmluZFJvbGVNYXBwaW5nKFN0cmluZyByb2xlKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgc2VjdXJpdHkgcm9sZSBpcyBkZWZpbmVkCisgICAgICogZm9yIHRoaXMgYXBwbGljYXRpb247IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgU2VjdXJpdHkgcm9sZSB0byB2ZXJpZnkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBmaW5kU2VjdXJpdHlSb2xlKFN0cmluZyByb2xlKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGZvciB0aGlzIGFwcGxpY2F0aW9uLiAgSWYgbm9uZQorICAgICAqIGhhdmUgYmVlbiBkZWZpbmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kU2VjdXJpdHlSb2xlcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlcnZsZXQgbmFtZSBtYXBwZWQgYnkgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIChpZiBhbnkpOworICAgICAqIG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBQYXR0ZXJuIGZvciB3aGljaCBhIG1hcHBpbmcgaXMgcmVxdWVzdGVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaW5kU2VydmxldE1hcHBpbmcoU3RyaW5nIHBhdHRlcm4pOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdHRlcm5zIG9mIGFsbCBkZWZpbmVkIHNlcnZsZXQgbWFwcGluZ3MgZm9yIHRoaXMKKyAgICAgKiBDb250ZXh0LiAgSWYgbm8gbWFwcGluZ3MgYXJlIGRlZmluZWQsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRTZXJ2bGV0TWFwcGluZ3MoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb250ZXh0LXJlbGF0aXZlIFVSSSBvZiB0aGUgZXJyb3IgcGFnZSBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIEhUVFAgc3RhdHVzIGNvZGUsIGlmIGFueTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0dXMgSFRUUCBzdGF0dXMgY29kZSB0byBsb29rIHVwCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaW5kU3RhdHVzUGFnZShpbnQgc3RhdHVzKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgSFRUUCBzdGF0dXMgY29kZXMgZm9yIHdoaWNoIGVycm9yIHBhZ2VzIGhhdmUKKyAgICAgKiBiZWVuIHNwZWNpZmllZC4gIElmIG5vbmUgYXJlIHNwZWNpZmllZCwgYSB6ZXJvLWxlbmd0aCBhcnJheQorICAgICAqIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBpbnRbXSBmaW5kU3RhdHVzUGFnZXMoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0YWcgbGlicmFyeSBkZXNjcmlwdG9yIGxvY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHRhZ2xpYgorICAgICAqIFVSSSwgaWYgYW55OyBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVVJJLCByZWxhdGl2ZSB0byB0aGUgd2ViLnhtbCBmaWxlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaW5kVGFnbGliKFN0cmluZyB1cmkpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFVSSXMgb2YgYWxsIHRhZyBsaWJyYXJpZXMgZm9yIHdoaWNoIGEgdGFnIGxpYnJhcnkKKyAgICAgKiBkZXNjcmlwdG9yIGxvY2F0aW9uIGhhcyBiZWVuIHNwZWNpZmllZC4gIElmIG5vbmUgYXJlIHNwZWNpZmllZCwKKyAgICAgKiBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kVGFnbGlicygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiB3YXRjaGVkIHJlc291cmNlcyBmb3IgdGhpcyBDb250ZXh0LiBJZiBub25lIGFyZSAKKyAgICAgKiBkZWZpbmVkLCBhIHplcm8gbGVuZ3RoIGFycmF5IHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRXYXRjaGVkUmVzb3VyY2VzKCk7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCB3ZWxjb21lIGZpbGUgaXMgZGVmaW5lZAorICAgICAqIGZvciB0aGlzIENvbnRleHQ7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgV2VsY29tZSBmaWxlIHRvIHZlcmlmeQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGZpbmRXZWxjb21lRmlsZShTdHJpbmcgbmFtZSk7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiB3ZWxjb21lIGZpbGVzIGRlZmluZWQgZm9yIHRoaXMgQ29udGV4dC4gIElmIG5vbmUgYXJlCisgICAgICogZGVmaW5lZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZFdlbGNvbWVGaWxlcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBMaWZlY3ljbGVMaXN0ZW5lciBjbGFzc2VzIHRoYXQgd2lsbCBiZSBhZGRlZCB0bworICAgICAqIG5ld2x5IGNyZWF0ZWQgV3JhcHBlcnMgYXV0b21hdGljYWxseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZFdyYXBwZXJMaWZlY3ljbGVzKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIENvbnRhaW5lckxpc3RlbmVyIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvCisgICAgICogbmV3bHkgY3JlYXRlZCBXcmFwcGVycyBhdXRvbWF0aWNhbGx5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kV3JhcHBlckxpc3RlbmVycygpOworCisKKyAgICAvKioKKyAgICAgKiBSZWxvYWQgdGhpcyB3ZWIgYXBwbGljYXRpb24sIGlmIHJlbG9hZGluZyBpcyBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+cmVsb2FkYWJsZTwvY29kZT4KKyAgICAgKiAgcHJvcGVydHkgaXMgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxvYWQoKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYXBwbGljYXRpb24gbGlzdGVuZXIgY2xhc3MgZnJvbSB0aGUgc2V0IG9mCisgICAgICogbGlzdGVuZXJzIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFwcGxpY2F0aW9uTGlzdGVuZXIoU3RyaW5nIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBhcHBsaWNhdGlvbiBwYXJhbWV0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgZnJvbQorICAgICAqIHRoZSBzZXQgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBwYXJhbWV0ZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXBwbGljYXRpb25QYXJhbWV0ZXIoU3RyaW5nIG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBzZWN1cml0eSBjb25zdHJhaW50IGZyb20gdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uc3RyYWludCBDb25zdHJhaW50IHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBjb25zdHJhaW50KTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBlcnJvciBwYWdlIGZvciB0aGUgc3BlY2lmaWVkIGVycm9yIGNvZGUgb3IKKyAgICAgKiBKYXZhIGxhbmd1YWdlIGV4Y2VwdGlvbiwgaWYgaXQgZXhpc3RzOyBvdGhlcndpc2UsIG5vIGFjdGlvbiBpcyB0YWtlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvclBhZ2UgVGhlIGVycm9yIHBhZ2UgZGVmaW5pdGlvbiB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRXJyb3JQYWdlKEVycm9yUGFnZSBlcnJvclBhZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBmaWx0ZXIgZGVmaW5pdGlvbiBmcm9tIHRoaXMgQ29udGV4dCwgaWYgaXQgZXhpc3RzOworICAgICAqIG90aGVyd2lzZSwgbm8gYWN0aW9uIGlzIHRha2VuLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlckRlZiBGaWx0ZXIgZGVmaW5pdGlvbiB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRmlsdGVyRGVmKEZpbHRlckRlZiBmaWx0ZXJEZWYpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBmaWx0ZXIgbWFwcGluZyBmcm9tIHRoaXMgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJNYXAgVGhlIGZpbHRlciBtYXBwaW5nIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVGaWx0ZXJNYXAoRmlsdGVyTWFwIGZpbHRlck1hcCk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGNsYXNzIG5hbWUgZnJvbSB0aGUgc2V0IG9mIEluc3RhbmNlTGlzdGVuZXIgY2xhc3NlcyB0aGF0CisgICAgICogd2lsbCBiZSBhZGRlZCB0byBuZXdseSBjcmVhdGVkIFdyYXBwZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIENsYXNzIG5hbWUgb2YgYW4gSW5zdGFuY2VMaXN0ZW5lciBjbGFzcyB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlSW5zdGFuY2VMaXN0ZW5lcihTdHJpbmcgbGlzdGVuZXIpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIE1JTUUgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBleHRlbnNpb24sIGlmIGl0IGV4aXN0czsKKyAgICAgKiBvdGhlcndpc2UsIG5vIGFjdGlvbiBpcyB0YWtlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHRlbnNpb24gRXh0ZW5zaW9uIHRvIHJlbW92ZSB0aGUgbWFwcGluZyBmb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNaW1lTWFwcGluZyhTdHJpbmcgZXh0ZW5zaW9uKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBuYW1lLCBpZiBpdCBleGlzdHM7IG90aGVyd2lzZSwgbm8gYWN0aW9uIGlzIHRha2VuLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmFtZXRlcihTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZQorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgU2VjdXJpdHkgcm9sZSAoYXMgdXNlZCBpbiB0aGUgYXBwbGljYXRpb24pIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJvbGVNYXBwaW5nKFN0cmluZyByb2xlKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBzZWN1cml0eSByb2xlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgU2VjdXJpdHkgcm9sZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTZWN1cml0eVJvbGUoU3RyaW5nIHJvbGUpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IHNlcnZsZXQgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBwYXR0ZXJuLCBpZiBpdCBleGlzdHM7CisgICAgICogb3RoZXJ3aXNlLCBubyBhY3Rpb24gaXMgdGFrZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBVUkwgcGF0dGVybiBvZiB0aGUgbWFwcGluZyB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTZXJ2bGV0TWFwcGluZyhTdHJpbmcgcGF0dGVybik7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgdGFnIGxpYnJhcnkgbG9jYXRpb24gZm9ydGhlIHNwZWNpZmllZCB0YWcgbGlicmFyeSBVUkkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFVSSSwgcmVsYXRpdmUgdG8gdGhlIHdlYi54bWwgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRhZ2xpYihTdHJpbmcgdXJpKTsKKworICAgIAorICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHdhdGNoZWQgcmVzb3VyY2UgbmFtZSBmcm9tIHRoZSBsaXN0IGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoaXMgQ29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB3YXRjaGVkIHJlc291cmNlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVXYXRjaGVkUmVzb3VyY2UoU3RyaW5nIG5hbWUpOworICAgIAorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgd2VsY29tZSBmaWxlIG5hbWUgZnJvbSB0aGUgbGlzdCByZWNvZ25pemVkCisgICAgICogYnkgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgd2VsY29tZSBmaWxlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVXZWxjb21lRmlsZShTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGNsYXNzIG5hbWUgZnJvbSB0aGUgc2V0IG9mIExpZmVjeWNsZUxpc3RlbmVyIGNsYXNzZXMgdGhhdAorICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gbmV3bHkgY3JlYXRlZCBXcmFwcGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBDbGFzcyBuYW1lIG9mIGEgTGlmZWN5Y2xlTGlzdGVuZXIgY2xhc3MgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVdyYXBwZXJMaWZlY3ljbGUoU3RyaW5nIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgY2xhc3MgbmFtZSBmcm9tIHRoZSBzZXQgb2YgQ29udGFpbmVyTGlzdGVuZXIgY2xhc3NlcyB0aGF0CisgICAgICogd2lsbCBiZSBhZGRlZCB0byBuZXdseSBjcmVhdGVkIFdyYXBwZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIENsYXNzIG5hbWUgb2YgYSBDb250YWluZXJMaXN0ZW5lciBjbGFzcyB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlV3JhcHBlckxpc3RlbmVyKFN0cmluZyBsaXN0ZW5lcik7CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VydmVyLnhtbCA8Y29udGV4dD4gYXR0cmlidXRlJ3MgeG1sTmFtZXNwYWNlQXdhcmUuCisgICAgICogQHJldHVybiB0cnVlIGlmIG5hbWVzcGFjZSBhd2FyZW5lcyBpcyBlbmFibGVkLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0WG1sTmFtZXNwYWNlQXdhcmUoKTsKKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXJ2ZXIueG1sIDxjb250ZXh0PiBhdHRyaWJ1dGUncyB4bWxWYWxpZGF0aW9uLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB2YWxpZGF0aW9uIGlzIGVuYWJsZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRYbWxWYWxpZGF0aW9uKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsaWRhdGlvbiBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgeG1sIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0geG1sVmFsaWRhdGlvbiB0cnVlIHRvIGVuYWJsZSB4bWwgaW5zdGFuY2UgdmFsaWRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhtbFZhbGlkYXRpb24oYm9vbGVhbiB4bWxWYWxpZGF0aW9uKTsKKworCisgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWVzcGFjZSBhd2FyZSBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgeG1sIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0geG1sTmFtZXNwYWNlQXdhcmUgdHJ1ZSB0byBlbmFibGUgbmFtZXNwYWNlIGF3YXJlbmVzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhtbE5hbWVzcGFjZUF3YXJlKGJvb2xlYW4geG1sTmFtZXNwYWNlQXdhcmUpOworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VydmVyLnhtbCA8Y29udGV4dD4gYXR0cmlidXRlJ3MgeG1sVmFsaWRhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdmFsaWRhdGlvbiBpcyBlbmFibGVkLgorICAgICAqLworICAgICAKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsaWRhdGlvbiBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgdGxkcyBmaWxlcy4gCisgICAgICogQHBhcmFtIHRsZFZhbGlkYXRpb24gdHJ1ZSB0byBlbmFibGUgeG1sIGluc3RhbmNlIHZhbGlkYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUbGRWYWxpZGF0aW9uKGJvb2xlYW4gdGxkVmFsaWRhdGlvbik7CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VydmVyLnhtbCA8Y29udGV4dD4gYXR0cmlidXRlJ3Mgd2ViWG1sVmFsaWRhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdmFsaWRhdGlvbiBpcyBlbmFibGVkLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VGxkVmFsaWRhdGlvbigpOworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNlcnZlci54bWwgPGhvc3Q+IGF0dHJpYnV0ZSdzIHhtbE5hbWVzcGFjZUF3YXJlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lc3BhY2UgYXdhcmVuZXMgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUbGROYW1lc3BhY2VBd2FyZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWVzcGFjZSBhd2FyZSBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgeG1sIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0gdGxkTmFtZXNwYWNlQXdhcmUgdHJ1ZSB0byBlbmFibGUgbmFtZXNwYWNlIGF3YXJlbmVzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRsZE5hbWVzcGFjZUF3YXJlKGJvb2xlYW4gdGxkTmFtZXNwYWNlQXdhcmUpOworCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0VuZ2luZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0VuZ2luZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlODQ1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvRW5naW5lLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisvKioKKyAqIEFuIDxiPkVuZ2luZTwvYj4gaXMgYSBDb250YWluZXIgdGhhdCByZXByZXNlbnRzIHRoZSBlbnRpcmUgQ2F0YWxpbmEgc2VydmxldAorICogZW5naW5lLiAgSXQgaXMgdXNlZnVsIGluIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2Ygc2NlbmFyaW9zOgorICogPHVsPgorICogPGxpPllvdSB3aXNoIHRvIHVzZSBJbnRlcmNlcHRvcnMgdGhhdCBzZWUgZXZlcnkgc2luZ2xlIHJlcXVlc3QgcHJvY2Vzc2VkCisgKiAgICAgYnkgdGhlIGVudGlyZSBlbmdpbmUuCisgKiA8bGk+WW91IHdpc2ggdG8gcnVuIENhdGFsaW5hIGluIHdpdGggYSBzdGFuZGFsb25lIEhUVFAgY29ubmVjdG9yLCBidXQgc3RpbGwKKyAqICAgICB3YW50IHN1cHBvcnQgZm9yIG11bHRpcGxlIHZpcnR1YWwgaG9zdHMuCisgKiA8L3VsPgorICogSW4gZ2VuZXJhbCwgeW91IHdvdWxkIG5vdCB1c2UgYW4gRW5naW5lIHdoZW4gZGVwbG95aW5nIENhdGFsaW5hIGNvbm5lY3RlZAorICogdG8gYSB3ZWIgc2VydmVyIChzdWNoIGFzIEFwYWNoZSksIGJlY2F1c2UgdGhlIENvbm5lY3RvciB3aWxsIGhhdmUKKyAqIHV0aWxpemVkIHRoZSB3ZWIgc2VydmVyJ3MgZmFjaWxpdGllcyB0byBkZXRlcm1pbmUgd2hpY2ggQ29udGV4dCAob3IKKyAqIHBlcmhhcHMgZXZlbiB3aGljaCBXcmFwcGVyKSBzaG91bGQgYmUgdXRpbGl6ZWQgdG8gcHJvY2VzcyB0aGlzIHJlcXVlc3QuCisgKiA8cD4KKyAqIFRoZSBjaGlsZCBjb250YWluZXJzIGF0dGFjaGVkIHRvIGFuIEVuZ2luZSBhcmUgZ2VuZXJhbGx5IGltcGxlbWVudGF0aW9ucworICogb2YgSG9zdCAocmVwcmVzZW50aW5nIGEgdmlydHVhbCBob3N0KSBvciBDb250ZXh0IChyZXByZXNlbnRpbmcgaW5kaXZpZHVhbAorICogYW4gaW5kaXZpZHVhbCBzZXJ2bGV0IGNvbnRleHQpLCBkZXBlbmRpbmcgdXBvbiB0aGUgRW5naW5lIGltcGxlbWVudGF0aW9uLgorICogPHA+CisgKiBJZiB1c2VkLCBhbiBFbmdpbmUgaXMgYWx3YXlzIHRoZSB0b3AgbGV2ZWwgQ29udGFpbmVyIGluIGEgQ2F0YWxpbmEKKyAqIGhpZXJhcmNoeS4gVGhlcmVmb3JlLCB0aGUgaW1wbGVtZW50YXRpb24ncyA8Y29kZT5zZXRQYXJlbnQoKTwvY29kZT4gbWV0aG9kCisgKiBzaG91bGQgdGhyb3cgPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGludGVyZmFjZSBFbmdpbmUgZXh0ZW5kcyBDb250YWluZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IGhvc3RuYW1lIGZvciB0aGlzIEVuZ2luZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRIb3N0KCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVmYXVsdCBob3N0bmFtZSBmb3IgdGhpcyBFbmdpbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVmYXVsdEhvc3QgVGhlIG5ldyBkZWZhdWx0IGhvc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0SG9zdChTdHJpbmcgZGVmYXVsdEhvc3QpOworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgSnZtUm91dGVJZCBmb3IgdGhpcyBlbmdpbmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRKdm1Sb3V0ZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEp2bVJvdXRlSWQgZm9yIHRoaXMgZW5naW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGp2bVJvdXRlSWQgdGhlIChuZXcpIEpWTSBSb3V0ZSBJRC4gRWFjaCBFbmdpbmUgd2l0aGluIGEgY2x1c3RlcgorICAgICAqICAgICAgICBtdXN0IGhhdmUgYSB1bmlxdWUgSlZNIFJvdXRlIElELgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEp2bVJvdXRlKFN0cmluZyBqdm1Sb3V0ZUlkKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5TZXJ2aWNlPC9jb2RlPiB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkIChpZiBhbnkpLgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2aWNlIGdldFNlcnZpY2UoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8Y29kZT5TZXJ2aWNlPC9jb2RlPiB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkIChpZiBhbnkpLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2UgdGhhdCBvd25zIHRoaXMgRW5naW5lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VydmljZShTZXJ2aWNlIHNlcnZpY2UpOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9HbG9iYWxzLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvR2xvYmFscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODliNGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvR2xvYmFscy5qYXZhCkBAIC0wLDAgKzEsMzMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKKworLyoqCisgKiBHbG9iYWwgY29uc3RhbnRzIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gbXVsdGlwbGUgcGFja2FnZXMgd2l0aGluIENhdGFsaW5hLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgR2xvYmFscyB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB3ZSBzdG9yZSB0aGUgYWx0ZXJuYXRlCisgICAgICogZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRfRERfQVRUUiA9IAorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuYWx0X2RkIjsKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB3ZSBzdG9yZSB0aGUgYXJyYXkgb2YgWDUwOUNlcnRpZmljYXRlCisgICAgICogb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGNlcnRpZmljYXRlIGNoYWluIHByZXNlbnRlZCBieSBvdXIgY2xpZW50LAorICAgICAqIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRVJUSUZJQ0FURVNfQVRUUiA9CisgICAgICAgICJqYXZheC5zZXJ2bGV0LnJlcXVlc3QuWDUwOUNlcnRpZmljYXRlIjsKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB3ZSBzdG9yZSB0aGUgbmFtZSBvZiB0aGUgY2lwaGVyIHN1aXRlCisgICAgICogYmVpbmcgdXNlZCBvbiBhbiBTU0wgY29ubmVjdGlvbiAoYXMgYW4gb2JqZWN0IG9mIHR5cGUKKyAgICAgKiBqYXZhLmxhbmcuU3RyaW5nKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSVBIRVJfU1VJVEVfQVRUUiA9CisgICAgICAgICJqYXZheC5zZXJ2bGV0LnJlcXVlc3QuY2lwaGVyX3N1aXRlIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggd2Ugc3RvcmUgdGhlIGNsYXNzIGxvYWRlcgorICAgICAqIHVzZWQgZm9yIGxvYWRpbmcgc2VydmxldHMgKGFzIGFuIG9iamVjdCBvZiB0eXBlIGphdmEubGFuZy5DbGFzc0xvYWRlcikuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTE9BREVSX0FUVFIgPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jbGFzc2xvYWRlciI7CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IGRpc3BhdGNoZXIgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUEFUQ0hFUl9UWVBFX0FUVFIgPSAKKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5ESVNQQVRDSEVSX1RZUEUiOworCisgICAgLyoqCisgICAgICogUmVxdWVzdCBkaXNwYXRjaGVyIHBhdGguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUEFUQ0hFUl9SRVFVRVNUX1BBVEhfQVRUUiA9IAorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkRJU1BBVENIRVJfUkVRVUVTVF9QQVRIIjsKKworICAgIC8qKgorICAgICAqIFRoZSBKTkRJIGRpcmVjdG9yeSBjb250ZXh0IHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGV4dC4gVGhpcworICAgICAqIGNvbnRleHQgY2FuIGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSBzdGF0aWMgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VTX0FUVFIgPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5yZXNvdXJjZXMiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB3ZSBzdG9yZSB0aGUgY2xhc3MgcGF0aAorICAgICAqIGZvciBvdXIgYXBwbGljYXRpb24gY2xhc3MgbG9hZGVyIChhcyBhbiBvYmplY3Qgb2YgdHlwZSBTdHJpbmcpLAorICAgICAqIGRlbGltaXRlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBwYXRoIGRlbGltaXRlciBmb3IgdGhpcyBwbGF0Zm9ybS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19QQVRIX0FUVFIgPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5qc3BfY2xhc3NwYXRoIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXR0cmlidXRlIHVuZGVyIHdoaWNoIHdlIGZvcndhcmQgYSBKYXZhIGV4Y2VwdGlvbgorICAgICAqIChhcyBhbiBvYmplY3Qgb2YgdHlwZSBUaHJvd2FibGUpIHRvIGFuIGVycm9yIHBhZ2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX0FUVFIgPQorICAgICAgICAiamF2YXguc2VydmxldC5lcnJvci5leGNlcHRpb24iOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggd2UgZm9yd2FyZCB0aGUgcmVxdWVzdCBVUkkKKyAgICAgKiAoYXMgYW4gb2JqZWN0IG9mIHR5cGUgU3RyaW5nKSBvZiB0aGUgcGFnZSBvbiB3aGljaCBhbiBlcnJvciBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fUEFHRV9BVFRSID0KKyAgICAgICAgImphdmF4LnNlcnZsZXQuZXJyb3IucmVxdWVzdF91cmkiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggd2UgZm9yd2FyZCBhIEphdmEgZXhjZXB0aW9uIHR5cGUKKyAgICAgKiAoYXMgYW4gb2JqZWN0IG9mIHR5cGUgQ2xhc3MpIHRvIGFuIGVycm9yIHBhZ2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX1RZUEVfQVRUUiA9CisgICAgICAgICJqYXZheC5zZXJ2bGV0LmVycm9yLmV4Y2VwdGlvbl90eXBlIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXR0cmlidXRlIHVuZGVyIHdoaWNoIHdlIGZvcndhcmQgYW4gSFRUUCBzdGF0dXMgbWVzc2FnZQorICAgICAqIChhcyBhbiBvYmplY3Qgb2YgdHlwZSBTVHJpbmcpIHRvIGFuIGVycm9yIHBhZ2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTUVTU0FHRV9BVFRSID0KKyAgICAgICAgImphdmF4LnNlcnZsZXQuZXJyb3IubWVzc2FnZSI7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB0aGUgSW52b2tlciBzZXJ2bGV0IHdpbGwgc3RvcmUKKyAgICAgKiB0aGUgaW52b2tpbmcgc2VydmxldCBwYXRoLCBpZiBpdCB3YXMgdXNlZCB0byBleGVjdXRlIGEgc2VydmxldAorICAgICAqIGluZGlyZWN0bHkgaW5zdGVhZCBvZiB0aHJvdWdoIGEgc2VydmxldCBtYXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVk9LRURfQVRUUiA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLklOVk9LRUQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggd2UgZXhwb3NlIHRoZSB2YWx1ZSBvZiB0aGUKKyAgICAgKiA8Y29kZT4mbHQ7anNwLWZpbGUmZ3Q7PC9jb2RlPiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2bGV0LAorICAgICAqIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRklMRV9BVFRSID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuanNwX2ZpbGUiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggd2Ugc3RvcmUgdGhlIGtleSBzaXplIGJlaW5nIHVzZWQgZm9yCisgICAgICogdGhpcyBTU0wgY29ubmVjdGlvbiAoYXMgYW4gb2JqZWN0IG9mIHR5cGUgamF2YS5sYW5nLkludGVnZXIpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TSVpFX0FUVFIgPQorICAgICAgICAiamF2YXguc2VydmxldC5yZXF1ZXN0LmtleV9zaXplIjsKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB3ZSBzdG9yZSB0aGUgc2Vzc2lvbiBpZCBiZWluZyB1c2VkCisgICAgICogZm9yIHRoaXMgU1NMIGNvbm5lY3Rpb24gKGFzIGFuIG9iamVjdCBvZiB0eXBlIGphdmEubGFuZy5TdHJpbmcpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTTF9TRVNTSU9OX0lEX0FUVFIgPQorICAgICAgICAiamF2YXguc2VydmxldC5yZXF1ZXN0LnNzbF9zZXNzaW9uIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggdGhlIG1hbmFnZWQgYmVhbiBSZWdpc3RyeQorICAgICAqIHdpbGwgYmUgc3RvcmVkIGZvciBwcml2aWxlZ2VkIGNvbnRleHRzIChpZiBlbmFibGVkKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQkVBTl9SRUdJU1RSWV9BVFRSID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVnaXN0cnkiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB0aGUgTUJlYW5TZXJ2ZXIgd2lsbCBiZSBzdG9yZWQKKyAgICAgKiBmb3IgcHJpdmlsZWdlZCBjb250ZXh0cyAoaWYgZW5hYmxlZCkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUJFQU5fU0VSVkVSX0FUVFIgPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5NQmVhblNlcnZlciI7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB3ZSBzdG9yZSB0aGUgc2VydmxldCBuYW1lIG9uIGEKKyAgICAgKiBuYW1lZCBkaXNwYXRjaGVyIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRURfRElTUEFUQ0hFUl9BVFRSID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuTkFNRUQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggdGhlIHJlcXVlc3QgVVJJIG9mIHRoZSBpbmNsdWRlZAorICAgICAqIHNlcnZsZXQgaXMgc3RvcmVkIG9uIGFuIGluY2x1ZGVkIGRpc3BhdGNoZXIgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX1JFUVVFU1RfVVJJX0FUVFIgPQorICAgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLnJlcXVlc3RfdXJpIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXR0cmlidXRlIHVuZGVyIHdoaWNoIHRoZSBjb250ZXh0IHBhdGggb2YgdGhlIGluY2x1ZGVkCisgICAgICogc2VydmxldCBpcyBzdG9yZWQgb24gYW4gaW5jbHVkZWQgZGlzcGF0Y2hlciByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfQ09OVEVYVF9QQVRIX0FUVFIgPQorICAgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLmNvbnRleHRfcGF0aCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB0aGUgcGF0aCBpbmZvIG9mIHRoZSBpbmNsdWRlZAorICAgICAqIHNlcnZsZXQgaXMgc3RvcmVkIG9uIGFuIGluY2x1ZGVkIGRpc3BhdGNoZXIgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX1BBVEhfSU5GT19BVFRSID0KKyAgICAgICAgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5wYXRoX2luZm8iOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggdGhlIHNlcnZsZXQgcGF0aCBvZiB0aGUgaW5jbHVkZWQKKyAgICAgKiBzZXJ2bGV0IGlzIHN0b3JlZCBvbiBhbiBpbmNsdWRlZCBkaXNwYXRjaGVyIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9TRVJWTEVUX1BBVEhfQVRUUiA9CisgICAgICAgICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUuc2VydmxldF9wYXRoIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXR0cmlidXRlIHVuZGVyIHdoaWNoIHRoZSBxdWVyeSBzdHJpbmcgb2YgdGhlIGluY2x1ZGVkCisgICAgICogc2VydmxldCBpcyBzdG9yZWQgb24gYW4gaW5jbHVkZWQgZGlzcGF0Y2hlciByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfUVVFUllfU1RSSU5HX0FUVFIgPQorICAgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLnF1ZXJ5X3N0cmluZyI7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBVUkkgaXMgc3RvcmVkCisgICAgICogb24gYW4gZm9yd2FyZGVkIGRpc3BhdGNoZXIgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJEX1JFUVVFU1RfVVJJX0FUVFIgPQorICAgICAgICAiamF2YXguc2VydmxldC5mb3J3YXJkLnJlcXVlc3RfdXJpIjsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggdGhlIG9yaWdpbmFsIGNvbnRleHQgcGF0aCBpcyBzdG9yZWQKKyAgICAgKiBvbiBhbiBmb3J3YXJkZWQgZGlzcGF0Y2hlciByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUldBUkRfQ09OVEVYVF9QQVRIX0FUVFIgPQorICAgICAgICAiamF2YXguc2VydmxldC5mb3J3YXJkLmNvbnRleHRfcGF0aCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB0aGUgb3JpZ2luYWwgcGF0aCBpbmZvIGlzIHN0b3JlZAorICAgICAqIG9uIGFuIGZvcndhcmRlZCBkaXNwYXRjaGVyIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSRF9QQVRIX0lORk9fQVRUUiA9CisgICAgICAgICJqYXZheC5zZXJ2bGV0LmZvcndhcmQucGF0aF9pbmZvIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXR0cmlidXRlIHVuZGVyIHdoaWNoIHRoZSBvcmlnaW5hbCBzZXJ2bGV0IHBhdGggaXMgc3RvcmVkCisgICAgICogb24gYW4gZm9yd2FyZGVkIGRpc3BhdGNoZXIgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJEX1NFUlZMRVRfUEFUSF9BVFRSID0KKyAgICAgICAgImphdmF4LnNlcnZsZXQuZm9yd2FyZC5zZXJ2bGV0X3BhdGgiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggdGhlIG9yaWdpbmFsIHF1ZXJ5IHN0cmluZyBpcyBzdG9yZWQKKyAgICAgKiBvbiBhbiBmb3J3YXJkZWQgZGlzcGF0Y2hlciByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUldBUkRfUVVFUllfU1RSSU5HX0FUVFIgPQorICAgICAgICAiamF2YXguc2VydmxldC5mb3J3YXJkLnF1ZXJ5X3N0cmluZyI7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB3ZSBmb3J3YXJkIGEgc2VydmxldCBuYW1lIHRvCisgICAgICogYW4gZXJyb3IgcGFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX05BTUVfQVRUUiA9CisgICAgICAgICJqYXZheC5zZXJ2bGV0LmVycm9yLnNlcnZsZXRfbmFtZSI7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29va2llIHVzZWQgdG8gcGFzcyB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyIGJhY2sKKyAgICAgKiBhbmQgZm9ydGggd2l0aCB0aGUgY2xpZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fQ09PS0lFX05BTUUgPSAiSlNFU1NJT05JRCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYXRoIHBhcmFtZXRlciB1c2VkIHRvIHBhc3MgdGhlIHNlc3Npb24gaWRlbnRpZmllcgorICAgICAqIGJhY2sgYW5kIGZvcnRoIHdpdGggdGhlIGNsaWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX1BBUkFNRVRFUl9OQU1FID0gImpzZXNzaW9uaWQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB3ZSBzdG9yZSBhIGZsYWcgdXNlZAorICAgICAqIHRvIG1hcmsgdGhpcyByZXF1ZXN0IGFzIGhhdmluZyBiZWVuIHByb2Nlc3NlZCBieSB0aGUgU1NJU2VydmxldC4KKyAgICAgKiBXZSBkbyB0aGlzIGJlY2F1c2Ugb2YgdGhlIHBhdGhJbmZvIG1hbmdsaW5nIGhhcHBlbmluZyB3aGVuIHVzaW5nCisgICAgICogdGhlIENHSVNlcnZsZXQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgU1NJIHNlcnZsZXQuICh2YWx1ZSBzdG9yZWQKKyAgICAgKiBhcyBhbiBvYmplY3Qgb2YgdHlwZSBTdHJpbmcpCisgICAgICovCisgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9GTEFHX0FUVFIgPQorICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3NpLlNTSVNlcnZsZXQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggd2UgZm9yd2FyZCBhbiBIVFRQIHN0YXR1cyBjb2RlCisgICAgICogKGFzIGFuIG9iamVjdCBvZiB0eXBlIEludGVnZXIpIHRvIGFuIGVycm9yIHBhZ2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVFVTX0NPREVfQVRUUiA9CisgICAgICAgICJqYXZheC5zZXJ2bGV0LmVycm9yLnN0YXR1c19jb2RlIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHN1YmplY3QgdW5kZXIgd2hpY2ggdGhlIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGlzIHJ1bm5pbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCSkVDVF9BVFRSID0KKyAgICAgICAgImphdmF4LnNlY3VyaXR5LmF1dGguc3ViamVjdCI7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB3ZSByZWNvcmQgdGhlIHNldCBvZgorICAgICAqIHdlbGNvbWUgZmlsZXMgKGFzIGFuIG9iamVjdCBvZiB0eXBlIFN0cmluZ1tdKSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUxDT01FX0ZJTEVTX0FUVFIgPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5XRUxDT01FX0ZJTEVTIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggd2Ugc3RvcmUgYSB0ZW1wb3JhcnkKKyAgICAgKiB3b3JraW5nIGRpcmVjdG9yeSAoYXMgYW4gb2JqZWN0IG9mIHR5cGUgRmlsZSkgZm9yIHVzZSBieSBzZXJ2bGV0cworICAgICAqIHdpdGhpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX0RJUl9BVFRSID0KKyAgICAgICAgImphdmF4LnNlcnZsZXQuY29udGV4dC50ZW1wZGlyIjsKKworCisgICAgLyoqCisgICAgICogVGhlIG1hc3RlciBmbGFnIHdoaWNoIGNvbnRyb2xzIHN0cmljdCBzZXJ2bGV0IHNwZWNpZmljYXRpb24gCisgICAgICogY29tcGxpYW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1RSSUNUX1NFUlZMRVRfQ09NUExJQU5DRSA9CisgICAgICAgIEJvb2xlYW4udmFsdWVPZihTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUuY2F0YWxpbmEuU1RSSUNUX1NFUlZMRVRfQ09NUExJQU5DRSIsICJmYWxzZSIpKS5ib29sZWFuVmFsdWUoKTsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvR3JvdXAuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Hcm91cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiM2ZmOTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvR3JvdXAuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKworLyoqCisgKiA8cD5BYnN0cmFjdCByZXByZXNlbnRhdGlvbiBvZiBhIGdyb3VwIG9mIHtAbGluayBVc2VyfXMgaW4gYQorICoge0BsaW5rIFVzZXJEYXRhYmFzZX0uICBFYWNoIHVzZXIgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGlzIGdyb3VwCisgKiBpbmhlcml0cyB0aGUge0BsaW5rIFJvbGV9cyBhc3NpZ25lZCB0byB0aGUgZ3JvdXAuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIEdyb3VwIGV4dGVuZHMgUHJpbmNpcGFsIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBncm91cC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgbmV3IGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBncm91cCBuYW1lIG9mIHRoaXMgZ3JvdXAsIHdoaWNoIG11c3QgYmUgdW5pcXVlCisgICAgICogd2l0aGluIHRoZSBzY29wZSBvZiBhIHtAbGluayBVc2VyRGF0YWJhc2V9LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JvdXBuYW1lKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ3JvdXAgbmFtZSBvZiB0aGlzIGdyb3VwLCB3aGljaCBtdXN0IGJlIHVuaXF1ZQorICAgICAqIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSB7QGxpbmsgVXNlckRhdGFiYXNlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cG5hbWUgVGhlIG5ldyBncm91cCBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXBuYW1lKFN0cmluZyBncm91cG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiB7QGxpbmsgUm9sZX1zIGFzc2lnbmVkIHNwZWNpZmljYWxseSB0byB0aGlzIGdyb3VwLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRSb2xlcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBVc2VyRGF0YWJhc2V9IHdpdGhpbiB3aGljaCB0aGlzIEdyb3VwIGlzIGRlZmluZWQuCisgICAgICovCisgICAgcHVibGljIFVzZXJEYXRhYmFzZSBnZXRVc2VyRGF0YWJhc2UoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIFVzZXJ9cyB0aGF0IGFyZSBtZW1iZXJzIG9mIHRoaXMgZ3JvdXAuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGdldFVzZXJzKCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcge0BsaW5rIFJvbGV9IHRvIHRob3NlIGFzc2lnbmVkIHNwZWNpZmljYWxseSB0byB0aGlzIGdyb3VwLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgVGhlIG5ldyByb2xlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUm9sZShSb2xlIHJvbGUpOworCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIGdyb3VwIHNwZWNpZmljYWxseSBhc3NpZ25lZCB0aGUgc3BlY2lmaWVkIHtAbGluayBSb2xlfT8KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFRoZSByb2xlIHRvIGNoZWNrCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJblJvbGUoUm9sZSByb2xlKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEge0BsaW5rIFJvbGV9IGZyb20gdGhvc2UgYXNzaWduZWQgdG8gdGhpcyBncm91cC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFRoZSBvbGQgcm9sZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJvbGUoUm9sZSByb2xlKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCB7QGxpbmsgUm9sZX1zIGZyb20gdGhvc2UgYXNzaWduZWQgdG8gdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSb2xlcygpOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Ib3N0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvSG9zdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZDgzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvSG9zdC5qYXZhCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKKworCisvKioKKyAqIEEgPGI+SG9zdDwvYj4gaXMgYSBDb250YWluZXIgdGhhdCByZXByZXNlbnRzIGEgdmlydHVhbCBob3N0IGluIHRoZQorICogQ2F0YWxpbmEgc2VydmxldCBlbmdpbmUuICBJdCBpcyB1c2VmdWwgaW4gdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBzY2VuYXJpb3M6CisgKiA8dWw+CisgKiA8bGk+WW91IHdpc2ggdG8gdXNlIEludGVyY2VwdG9ycyB0aGF0IHNlZSBldmVyeSBzaW5nbGUgcmVxdWVzdCBwcm9jZXNzZWQKKyAqICAgICBieSB0aGlzIHBhcnRpY3VsYXIgdmlydHVhbCBob3N0LgorICogPGxpPllvdSB3aXNoIHRvIHJ1biBDYXRhbGluYSBpbiB3aXRoIGEgc3RhbmRhbG9uZSBIVFRQIGNvbm5lY3RvciwgYnV0IHN0aWxsCisgKiAgICAgd2FudCBzdXBwb3J0IGZvciBtdWx0aXBsZSB2aXJ0dWFsIGhvc3RzLgorICogPC91bD4KKyAqIEluIGdlbmVyYWwsIHlvdSB3b3VsZCBub3QgdXNlIGEgSG9zdCB3aGVuIGRlcGxveWluZyBDYXRhbGluYSBjb25uZWN0ZWQKKyAqIHRvIGEgd2ViIHNlcnZlciAoc3VjaCBhcyBBcGFjaGUpLCBiZWNhdXNlIHRoZSBDb25uZWN0b3Igd2lsbCBoYXZlCisgKiB1dGlsaXplZCB0aGUgd2ViIHNlcnZlcidzIGZhY2lsaXRpZXMgdG8gZGV0ZXJtaW5lIHdoaWNoIENvbnRleHQgKG9yCisgKiBwZXJoYXBzIGV2ZW4gd2hpY2ggV3JhcHBlcikgc2hvdWxkIGJlIHV0aWxpemVkIHRvIHByb2Nlc3MgdGhpcyByZXF1ZXN0LgorICogPHA+CisgKiBUaGUgcGFyZW50IENvbnRhaW5lciBhdHRhY2hlZCB0byBhIEhvc3QgaXMgZ2VuZXJhbGx5IGFuIEVuZ2luZSwgYnV0IG1heQorICogYmUgc29tZSBvdGhlciBpbXBsZW1lbnRhdGlvbiwgb3IgbWF5IGJlIG9taXR0ZWQgaWYgaXQgaXMgbm90IG5lY2Vzc2FyeS4KKyAqIDxwPgorICogVGhlIGNoaWxkIGNvbnRhaW5lcnMgYXR0YWNoZWQgdG8gYSBIb3N0IGFyZSBnZW5lcmFsbHkgaW1wbGVtZW50YXRpb25zCisgKiBvZiBDb250ZXh0IChyZXByZXNlbnRpbmcgYW4gaW5kaXZpZHVhbCBzZXJ2bGV0IGNvbnRleHQpLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIEhvc3QgZXh0ZW5kcyBDb250YWluZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYW5pZmVzdCBDb25zdGFudHMKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRhaW5lckV2ZW50IGV2ZW50IHR5cGUgc2VudCB3aGVuIGEgbmV3IGFsaWFzIGlzIGFkZGVkCisgICAgICogYnkgPGNvZGU+YWRkQWxpYXMoKTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0FMSUFTX0VWRU5UID0gImFkZEFsaWFzIjsKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRhaW5lckV2ZW50IGV2ZW50IHR5cGUgc2VudCB3aGVuIGFuIG9sZCBhbGlhcyBpcyByZW1vdmVkCisgICAgICogYnkgPGNvZGU+cmVtb3ZlQWxpYXMoKTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX0FMSUFTX0VWRU5UID0gInJlbW92ZUFsaWFzIjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXBwbGljYXRpb24gcm9vdCBmb3IgdGhpcyBIb3N0LiAgVGhpcyBjYW4gYmUgYW4gYWJzb2x1dGUKKyAgICAgKiBwYXRobmFtZSwgYSByZWxhdGl2ZSBwYXRobmFtZSwgb3IgYSBVUkwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBcHBCYXNlKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXBwbGljYXRpb24gcm9vdCBmb3IgdGhpcyBIb3N0LiAgVGhpcyBjYW4gYmUgYW4gYWJzb2x1dGUKKyAgICAgKiBwYXRobmFtZSwgYSByZWxhdGl2ZSBwYXRobmFtZSwgb3IgYSBVUkwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwQmFzZSBUaGUgbmV3IGFwcGxpY2F0aW9uIHJvb3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcHBCYXNlKFN0cmluZyBhcHBCYXNlKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYXV0byBkZXBsb3kgZmxhZy4gIElmIHRydWUsIGl0IGluZGljYXRlcyB0aGF0IAorICAgICAqIHRoaXMgaG9zdCdzIGNoaWxkIHdlYmFwcHMgc2hvdWxkIGJlIGRpc2NvdnJlZCBhbmQgYXV0b21hdGljYWxseSAKKyAgICAgKiBkZXBsb3llZCBkeW5hbWljYWxseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBdXRvRGVwbG95KCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXV0byBkZXBsb3kgZmxhZyB2YWx1ZSBmb3IgdGhpcyBob3N0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBhdXRvRGVwbG95IFRoZSBuZXcgYXV0byBkZXBsb3kgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9EZXBsb3koYm9vbGVhbiBhdXRvRGVwbG95KTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGNvbnRleHQgY29uZmlndXJhdGlvbiBjbGFzcworICAgICAqIGZvciBuZXcgd2ViIGFwcGxpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ0NsYXNzKCk7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgY29udGV4dCBjb25maWd1cmF0aW9uIGNsYXNzCisgICAgICogZm9yIG5ldyB3ZWIgYXBwbGljYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZ0NsYXNzIFRoZSBuZXcgY29udGV4dCBjb25maWd1cmF0aW9uIGNsYXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnQ2xhc3MoU3RyaW5nIGNvbmZpZ0NsYXNzKTsKKworICAgICAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBkZXBsb3kgb24gc3RhcnR1cCBmbGFnLiAgSWYgdHJ1ZSwgaXQgaW5kaWNhdGVzIAorICAgICAqIHRoYXQgdGhpcyBob3N0J3MgY2hpbGQgd2ViYXBwcyBzaG91bGQgYmUgZGlzY292cmVkIGFuZCBhdXRvbWF0aWNhbGx5IAorICAgICAqIGRlcGxveWVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldERlcGxveU9uU3RhcnR1cCgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlcGxveSBvbiBzdGFydHVwIGZsYWcgdmFsdWUgZm9yIHRoaXMgaG9zdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVwbG95T25TdGFydHVwIFRoZSBuZXcgZGVwbG95IG9uIHN0YXJ0dXAgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlcGxveU9uU3RhcnR1cChib29sZWFuIGRlcGxveU9uU3RhcnR1cCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2Fub25pY2FsLCBmdWxseSBxdWFsaWZpZWQsIG5hbWUgb2YgdGhlIHZpcnR1YWwgaG9zdAorICAgICAqIHRoaXMgQ29udGFpbmVyIHJlcHJlc2VudHMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2Fub25pY2FsLCBmdWxseSBxdWFsaWZpZWQsIG5hbWUgb2YgdGhlIHZpcnR1YWwgaG9zdAorICAgICAqIHRoaXMgQ29udGFpbmVyIHJlcHJlc2VudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBWaXJ0dWFsIGhvc3QgbmFtZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbmFtZSBpcyBudWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VydmVyLnhtbCA8aG9zdD4gYXR0cmlidXRlJ3MgeG1sTmFtZXNwYWNlQXdhcmUuCisgICAgICogQHJldHVybiB0cnVlIGlmIG5hbWVzcGFjZSBhd2FyZW5lcyBpcyBlbmFibGVkLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0WG1sTmFtZXNwYWNlQXdhcmUoKTsKKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXJ2ZXIueG1sIDxob3N0PiBhdHRyaWJ1dGUncyB4bWxWYWxpZGF0aW9uLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB2YWxpZGF0aW9uIGlzIGVuYWJsZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRYbWxWYWxpZGF0aW9uKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsaWRhdGlvbiBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgeG1sIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0geG1sVmFsaWRhdGlvbiB0cnVlIHRvIGVuYWJsZSB4bWwgaW5zdGFuY2UgdmFsaWRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhtbFZhbGlkYXRpb24oYm9vbGVhbiB4bWxWYWxpZGF0aW9uKTsKKworCisgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWVzcGFjZSBhd2FyZSBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgeG1sIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0geG1sTmFtZXNwYWNlQXdhcmUgdHJ1ZSB0byBlbmFibGUgbmFtZXNwYWNlIGF3YXJlbmVzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhtbE5hbWVzcGFjZUF3YXJlKGJvb2xlYW4geG1sTmFtZXNwYWNlQXdhcmUpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGFuIGFsaWFzIG5hbWUgdGhhdCBzaG91bGQgYmUgbWFwcGVkIHRvIHRoaXMgc2FtZSBIb3N0LgorICAgICAqCisgICAgICogQHBhcmFtIGFsaWFzIFRoZSBhbGlhcyB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEFsaWFzKFN0cmluZyBhbGlhcyk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGFsaWFzIG5hbWVzIGZvciB0aGlzIEhvc3QuICBJZiBub25lIGFyZSBkZWZpbmVkLAorICAgICAqIGEgemVybyBsZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRBbGlhc2VzKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29udGV4dCB0aGF0IHdvdWxkIGJlIHVzZWQgdG8gcHJvY2VzcyB0aGUgc3BlY2lmaWVkCisgICAgICogaG9zdC1yZWxhdGl2ZSByZXF1ZXN0IFVSSSwgaWYgYW55OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBSZXF1ZXN0IFVSSSB0byBiZSBtYXBwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dCBtYXAoU3RyaW5nIHVyaSk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGFsaWFzIG5hbWUgZnJvbSB0aGUgYWxpYXNlcyBmb3IgdGhpcyBIb3N0LgorICAgICAqCisgICAgICogQHBhcmFtIGFsaWFzIEFsaWFzIG5hbWUgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsaWFzKFN0cmluZyBhbGlhcyk7CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0luc3RhbmNlRXZlbnQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9JbnN0YW5jZUV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZlNmE2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9JbnN0YW5jZUV2ZW50LmphdmEKQEAgLTAsMCArMSw0NDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworCisKKy8qKgorICogR2VuZXJhbCBldmVudCBmb3Igbm90aWZ5aW5nIGxpc3RlbmVycyBvZiBzaWduaWZpY2FudCBldmVudHMgcmVsYXRlZCB0bworICogYSBzcGVjaWZpYyBpbnN0YW5jZSBvZiBhIFNlcnZsZXQsIG9yIGEgc3BlY2lmaWMgaW5zdGFuY2Ugb2YgYSBGaWx0ZXIsCisgKiBhcyBvcHBvc2VkIHRvIHRoZSBXcmFwcGVyIGNvbXBvbmVudCB0aGF0IG1hbmFnZXMgaXQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBJbnN0YW5jZUV2ZW50CisgICAgZXh0ZW5kcyBFdmVudE9iamVjdCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hbmlmZXN0IENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgaW5kaWNhdGluZyB0aGF0IHRoZSA8Y29kZT5pbml0KCk8L2NvZGU+IG1ldGhvZCBpcyBhYm91dAorICAgICAqIHRvIGJlIGNhbGxlZCBmb3IgdGhpcyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUZPUkVfSU5JVF9FVkVOVCA9ICJiZWZvcmVJbml0IjsKKworCisgICAgLyoqCisgICAgICogVGhlIGV2ZW50IGluZGljYXRpbmcgdGhhdCB0aGUgPGNvZGU+aW5pdCgpPC9jb2RlPiBtZXRob2QgaGFzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFGVEVSX0lOSVRfRVZFTlQgPSAiYWZ0ZXJJbml0IjsKKworCisgICAgLyoqCisgICAgICogVGhlIGV2ZW50IGluZGljYXRpbmcgdGhhdCB0aGUgPGNvZGU+c2VydmljZSgpPC9jb2RlPiBtZXRob2QgaXMgYWJvdXQKKyAgICAgKiB0byBiZSBjYWxsZWQgb24gYSBzZXJ2bGV0LiAgVGhlIDxjb2RlPnNlcnZsZXQ8L2NvZGU+IHByb3BlcnR5IGNvbnRhaW5zCisgICAgICogdGhlIHNlcnZsZXQgYmVpbmcgY2FsbGVkLCBhbmQgdGhlIDxjb2RlPnJlcXVlc3Q8L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPnJlc3BvbnNlPC9jb2RlPiBwcm9wZXJ0aWVzIGNvbnRhaW4gdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQKKyAgICAgKiByZXNwb25zZSBiZWluZyBwcm9jZXNzZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVGT1JFX1NFUlZJQ0VfRVZFTlQgPSAiYmVmb3JlU2VydmljZSI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBldmVudCBpbmRpY2F0aW5nIHRoYXQgdGhlIDxjb2RlPnNlcnZpY2UoKTwvY29kZT4gbWV0aG9kIGhhcworICAgICAqIHJldHVybmVkLiAgVGhlIDxjb2RlPnNlcnZsZXQ8L2NvZGU+IHByb3BlcnR5IGNvbnRhaW5zIHRoZSBzZXJ2bGV0CisgICAgICogdGhhdCB3YXMgY2FsbGVkLCBhbmQgdGhlIDxjb2RlPnJlcXVlc3Q8L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPnJlc3BvbnNlPC9jb2RlPiBwcm9wZXJ0aWVzIGNvbnRhaW4gdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQKKyAgICAgKiByZXNwb25zZSBiZWluZyBwcm9jZXNzZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUZURVJfU0VSVklDRV9FVkVOVCA9ICJhZnRlclNlcnZpY2UiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgaW5kaWNhdGluZyB0aGF0IHRoZSA8Y29kZT5kZXN0cm95PC9jb2RlPiBtZXRob2QgaXMgYWJvdXQKKyAgICAgKiB0byBiZSBjYWxsZWQgZm9yIHRoaXMgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVGT1JFX0RFU1RST1lfRVZFTlQgPSAiYmVmb3JlRGVzdHJveSI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBldmVudCBpbmRpY2F0aW5nIHRoYXQgdGhlIDxjb2RlPmRlc3Ryb3koKTwvY29kZT4gbWV0aG9kIGhhcworICAgICAqIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFGVEVSX0RFU1RST1lfRVZFTlQgPSAiYWZ0ZXJEZXN0cm95IjsKKworCisgICAgLyoqCisgICAgICogVGhlIGV2ZW50IGluZGljYXRpbmcgdGhhdCB0aGUgPGNvZGU+c2VydmljZSgpPC9jb2RlPiBtZXRob2Qgb2YgYQorICAgICAqIHNlcnZsZXQgYWNjZXNzZWQgdmlhIGEgcmVxdWVzdCBkaXNwYXRjaGVyIGlzIGFib3V0IHRvIGJlIGNhbGxlZC4KKyAgICAgKiBUaGUgPGNvZGU+c2VydmxldDwvY29kZT4gcHJvcGVydHkgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlCisgICAgICogZGlzcGF0Y2hlZC10byBzZXJ2bGV0IGluc3RhbmNlLCBhbmQgdGhlIDxjb2RlPnJlcXVlc3Q8L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPnJlc3BvbnNlPC9jb2RlPiBwcm9wZXJ0aWVzIGNvbnRhaW4gdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQKKyAgICAgKiByZXNwb25zZSBiZWluZyBwcm9jZXNzZWQuICBUaGUgPGNvZGU+d3JhcHBlcjwvY29kZT4gcHJvcGVydHkgd2lsbAorICAgICAqIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIGRpc3BhdGNoZWQtdG8gV3JhcHBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUZPUkVfRElTUEFUQ0hfRVZFTlQgPSAiYmVmb3JlRGlzcGF0Y2giOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgaW5kaWNhdGluZyB0aGF0IHRoZSA8Y29kZT5zZXJ2aWNlKCk8L2NvZGU+IG1ldGhvZCBvZiBhCisgICAgICogc2VydmxldCBhY2Nlc3NlZCB2aWEgYSByZXF1ZXN0IGRpc3BhdGNoZXIgaGFzIHJldHVybmVkLiAgVGhlCisgICAgICogPGNvZGU+c2VydmxldDwvY29kZT4gcHJvcGVydHkgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlCisgICAgICogZGlzcGF0Y2hlZC10byBzZXJ2bGV0IGluc3RhbmNlLCBhbmQgdGhlIDxjb2RlPnJlcXVlc3Q8L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPnJlc3BvbnNlPC9jb2RlPiBwcm9wZXJ0aWVzIGNvbnRhaW4gdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQKKyAgICAgKiByZXNwb25zZSBiZWluZyBwcm9jZXNzZWQuICBUaGUgPGNvZGU+d3JhcHBlcjwvY29kZT4gcHJvcGVydHkgd2lsbAorICAgICAqIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIGRpc3BhdGNoZWQtdG8gV3JhcHBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRlRFUl9ESVNQQVRDSF9FVkVOVCA9ICJhZnRlckRpc3BhdGNoIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGV2ZW50IGluZGljYXRpbmcgdGhhdCB0aGUgPGNvZGU+ZG9GaWx0ZXIoKTwvY29kZT4gbWV0aG9kIG9mIGEKKyAgICAgKiBGaWx0ZXIgaXMgYWJvdXQgdG8gYmUgY2FsbGVkLiAgVGhlIDxjb2RlPmZpbHRlcjwvY29kZT4gcHJvcGVydHkKKyAgICAgKiBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgcmVsZXZhbnQgZmlsdGVyIGluc3RhbmNlLCBhbmQgdGhlCisgICAgICogPGNvZGU+cmVxdWVzdDwvY29kZT4gYW5kIDxjb2RlPnJlc3BvbnNlPC9jb2RlPiBwcm9wZXJ0aWVzIGNvbnRhaW4KKyAgICAgKiB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCByZXNwb25zZSBiZWluZyBwcm9jZXNzZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVGT1JFX0ZJTFRFUl9FVkVOVCA9ICJiZWZvcmVGaWx0ZXIiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgaW5kaWNhdGluZyB0aGF0IHRoZSA8Y29kZT5kb0ZpbHRlcigpPC9jb2RlPiBtZXRob2Qgb2YgYQorICAgICAqIEZpbHRlciBoYXMgcmV0dXJuZWQuICBUaGUgPGNvZGU+ZmlsdGVyPC9jb2RlPiBwcm9wZXJ0eSBjb250YWlucworICAgICAqIGEgcmVmZXJlbmNlIHRvIHRoZSByZWxldmFudCBmaWx0ZXIgaW5zdGFuY2UsIGFuZCB0aGUKKyAgICAgKiA8Y29kZT5yZXF1ZXN0PC9jb2RlPiBhbmQgPGNvZGU+cmVzcG9uc2U8L2NvZGU+IHByb3BlcnRpZXMgY29udGFpbgorICAgICAqIHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIHJlc3BvbnNlIGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRlRFUl9GSUxURVJfRVZFTlQgPSAiYWZ0ZXJGaWx0ZXIiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEluc3RhbmNlRXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuICBUaGlzCisgICAgICogY29uc3RydWN0b3IgaXMgdXNlZCBmb3IgZmlsdGVyIGxpZmVjeWNsZSBldmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JhcHBlciBXcmFwcGVyIG1hbmFnaW5nIHRoaXMgc2VydmxldCBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBmaWx0ZXIgRmlsdGVyIGluc3RhbmNlIGZvciB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkCisgICAgICogQHBhcmFtIHR5cGUgRXZlbnQgdHlwZSAocmVxdWlyZWQpCisgICAgICovCisgICAgcHVibGljIEluc3RhbmNlRXZlbnQoV3JhcHBlciB3cmFwcGVyLCBGaWx0ZXIgZmlsdGVyLCBTdHJpbmcgdHlwZSkgeworCisgICAgICBzdXBlcih3cmFwcGVyKTsKKyAgICAgIHRoaXMud3JhcHBlciA9IHdyYXBwZXI7CisgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjsKKyAgICAgIHRoaXMuc2VydmxldCA9IG51bGw7CisgICAgICB0aGlzLnR5cGUgPSB0eXBlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgSW5zdGFuY2VFdmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gIFRoaXMKKyAgICAgKiBjb25zdHJ1Y3RvciBpcyB1c2VkIGZvciBmaWx0ZXIgbGlmZWN5Y2xlIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cmFwcGVyIFdyYXBwZXIgbWFuYWdpbmcgdGhpcyBzZXJ2bGV0IGluc3RhbmNlCisgICAgICogQHBhcmFtIGZpbHRlciBGaWx0ZXIgaW5zdGFuY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlIChyZXF1aXJlZCkKKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIEV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIEluc3RhbmNlRXZlbnQoV3JhcHBlciB3cmFwcGVyLCBGaWx0ZXIgZmlsdGVyLCBTdHJpbmcgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisKKyAgICAgIHN1cGVyKHdyYXBwZXIpOworICAgICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKKyAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyOworICAgICAgdGhpcy5zZXJ2bGV0ID0gbnVsbDsKKyAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEluc3RhbmNlRXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuICBUaGlzCisgICAgICogY29uc3RydWN0b3IgaXMgdXNlZCBmb3IgZmlsdGVyIHByb2Nlc3NpbmcgZXZlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHdyYXBwZXIgV3JhcHBlciBtYW5hZ2luZyB0aGlzIHNlcnZsZXQgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gZmlsdGVyIEZpbHRlciBpbnN0YW5jZSBmb3Igd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZAorICAgICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUgKHJlcXVpcmVkKQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBTZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIEluc3RhbmNlRXZlbnQoV3JhcHBlciB3cmFwcGVyLCBGaWx0ZXIgZmlsdGVyLCBTdHJpbmcgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKworICAgICAgc3VwZXIod3JhcHBlcik7CisgICAgICB0aGlzLndyYXBwZXIgPSB3cmFwcGVyOworICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7CisgICAgICB0aGlzLnNlcnZsZXQgPSBudWxsOworICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBJbnN0YW5jZUV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiAgVGhpcworICAgICAqIGNvbnN0cnVjdG9yIGlzIHVzZWQgZm9yIGZpbHRlciBwcm9jZXNzaW5nIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cmFwcGVyIFdyYXBwZXIgbWFuYWdpbmcgdGhpcyBzZXJ2bGV0IGluc3RhbmNlCisgICAgICogQHBhcmFtIGZpbHRlciBGaWx0ZXIgaW5zdGFuY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlIChyZXF1aXJlZCkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBTZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgU2VydmxldCByZXNwb25zZSB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSBleGNlcHRpb24gRXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5zdGFuY2VFdmVudChXcmFwcGVyIHdyYXBwZXIsIEZpbHRlciBmaWx0ZXIsIFN0cmluZyB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisKKyAgICAgIHN1cGVyKHdyYXBwZXIpOworICAgICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKKyAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyOworICAgICAgdGhpcy5zZXJ2bGV0ID0gbnVsbDsKKyAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICAgICAgdGhpcy5leGNlcHRpb24gPSBleGNlcHRpb247CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBJbnN0YW5jZUV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiAgVGhpcworICAgICAqIGNvbnN0cnVjdG9yIGlzIHVzZWQgZm9yIHByb2Nlc3Npbmcgc2VydmxldCBsaWZlY3ljbGUgZXZlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHdyYXBwZXIgV3JhcHBlciBtYW5hZ2luZyB0aGlzIHNlcnZsZXQgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gc2VydmxldCBTZXJ2bGV0IGluc3RhbmNlIGZvciB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkCisgICAgICogQHBhcmFtIHR5cGUgRXZlbnQgdHlwZSAocmVxdWlyZWQpCisgICAgICovCisgICAgcHVibGljIEluc3RhbmNlRXZlbnQoV3JhcHBlciB3cmFwcGVyLCBTZXJ2bGV0IHNlcnZsZXQsIFN0cmluZyB0eXBlKSB7CisKKyAgICAgIHN1cGVyKHdyYXBwZXIpOworICAgICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKKyAgICAgIHRoaXMuZmlsdGVyID0gbnVsbDsKKyAgICAgIHRoaXMuc2VydmxldCA9IHNlcnZsZXQ7CisgICAgICB0aGlzLnR5cGUgPSB0eXBlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgSW5zdGFuY2VFdmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gIFRoaXMKKyAgICAgKiBjb25zdHJ1Y3RvciBpcyB1c2VkIGZvciBwcm9jZXNzaW5nIHNlcnZsZXQgbGlmZWN5Y2xlIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cmFwcGVyIFdyYXBwZXIgbWFuYWdpbmcgdGhpcyBzZXJ2bGV0IGluc3RhbmNlCisgICAgICogQHBhcmFtIHNlcnZsZXQgU2VydmxldCBpbnN0YW5jZSBmb3Igd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZAorICAgICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUgKHJlcXVpcmVkKQorICAgICAqIEBwYXJhbSBleGNlcHRpb24gRXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5zdGFuY2VFdmVudChXcmFwcGVyIHdyYXBwZXIsIFNlcnZsZXQgc2VydmxldCwgU3RyaW5nIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCisgICAgICBzdXBlcih3cmFwcGVyKTsKKyAgICAgIHRoaXMud3JhcHBlciA9IHdyYXBwZXI7CisgICAgICB0aGlzLmZpbHRlciA9IG51bGw7CisgICAgICB0aGlzLnNlcnZsZXQgPSBzZXJ2bGV0OworICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgIHRoaXMuZXhjZXB0aW9uID0gZXhjZXB0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgSW5zdGFuY2VFdmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gIFRoaXMKKyAgICAgKiBjb25zdHJ1Y3RvciBpcyB1c2VkIGZvciBwcm9jZXNzaW5nIHNlcnZsZXQgcHJvY2Vzc2luZyBldmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JhcHBlciBXcmFwcGVyIG1hbmFnaW5nIHRoaXMgc2VydmxldCBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBzZXJ2bGV0IFNlcnZsZXQgaW5zdGFuY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlIChyZXF1aXJlZCkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBTZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgU2VydmxldCByZXNwb25zZSB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyBJbnN0YW5jZUV2ZW50KFdyYXBwZXIgd3JhcHBlciwgU2VydmxldCBzZXJ2bGV0LCBTdHJpbmcgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKworICAgICAgc3VwZXIod3JhcHBlcik7CisgICAgICB0aGlzLndyYXBwZXIgPSB3cmFwcGVyOworICAgICAgdGhpcy5maWx0ZXIgPSBudWxsOworICAgICAgdGhpcy5zZXJ2bGV0ID0gc2VydmxldDsKKyAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgSW5zdGFuY2VFdmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gIFRoaXMKKyAgICAgKiBjb25zdHJ1Y3RvciBpcyB1c2VkIGZvciBwcm9jZXNzaW5nIHNlcnZsZXQgcHJvY2Vzc2luZyBldmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JhcHBlciBXcmFwcGVyIG1hbmFnaW5nIHRoaXMgc2VydmxldCBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBzZXJ2bGV0IFNlcnZsZXQgaW5zdGFuY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlIChyZXF1aXJlZCkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBTZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgU2VydmxldCByZXNwb25zZSB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSBleGNlcHRpb24gRXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5zdGFuY2VFdmVudChXcmFwcGVyIHdyYXBwZXIsIFNlcnZsZXQgc2VydmxldCwgU3RyaW5nIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBleGNlcHRpb24pIHsKKworICAgICAgc3VwZXIod3JhcHBlcik7CisgICAgICB0aGlzLndyYXBwZXIgPSB3cmFwcGVyOworICAgICAgdGhpcy5maWx0ZXIgPSBudWxsOworICAgICAgdGhpcy5zZXJ2bGV0ID0gc2VydmxldDsKKyAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICAgICAgdGhpcy5leGNlcHRpb24gPSBleGNlcHRpb247CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXhjZXB0aW9uIHRoYXQgd2FzIHRocm93biBkdXJpbmcgdGhlIHByb2Nlc3NpbmcgYmVpbmcgcmVwb3J0ZWQKKyAgICAgKiBieSB0aGlzIGV2ZW50IChBRlRFUl9JTklUX0VWRU5ULCBBRlRFUl9TRVJWSUNFX0VWRU5ULCAKKyAgICAgKiBBRlRFUl9ERVNUUk9ZX0VWRU5ULCBBRlRFUl9ESVNQQVRDSF9FVkVOVCwgYW5kIEFGVEVSX0ZJTFRFUl9FVkVOVCBvbmx5KS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFRocm93YWJsZSBleGNlcHRpb24gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgRmlsdGVyIGluc3RhbmNlIGZvciB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkIChCRUZPUkVfRklMVEVSX0VWRU5UCisgICAgICogYW5kIEFGVEVSX0ZJTFRFUl9FVkVOVCBvbmx5KS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbHRlciBmaWx0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZCAoQkVGT1JFX0ZJTFRFUl9FVkVOVCwKKyAgICAgKiBBRlRFUl9GSUxURVJfRVZFTlQsIEJFRk9SRV9TRVJWSUNFX0VWRU5ULCBhbmQgQUZURVJfU0VSVklDRV9FVkVOVCkuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZsZXQgcmVzcG9uc2UgYmVpbmcgcHJvY2Vzc2VkIChCRUZPUkVfRklMVEVSX0VWRU5ULAorICAgICAqIEFGVEVSX0ZJTFRFUl9FVkVOVCwgQkVGT1JFX1NFUlZJQ0VfRVZFTlQsIGFuZCBBRlRFUl9TRVJWSUNFX0VWRU5UKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBTZXJ2bGV0IGluc3RhbmNlIGZvciB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkIChub3QgcHJlc2VudCBvbgorICAgICAqIEJFRk9SRV9GSUxURVJfRVZFTlQgb3IgQUZURVJfRklMVEVSX0VWRU5UIGV2ZW50cykuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXJ2bGV0IHNlcnZsZXQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgdHlwZSB0aGlzIGluc3RhbmNlIHJlcHJlc2VudHMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBXcmFwcGVyIG1hbmFnaW5nIHRoZSBzZXJ2bGV0IGluc3RhbmNlIGZvciB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkLgorICAgICAqLworICAgIHByaXZhdGUgV3JhcHBlciB3cmFwcGVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQgZHVyaW5nIHRoZSBwcm9jZXNzaW5nCisgICAgICogdGhhdCB3YXMgcmVwb3J0ZWQgYnkgdGhpcyBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldEV4Y2VwdGlvbigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZXhjZXB0aW9uKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmaWx0ZXIgaW5zdGFuY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQuCisgICAgICovCisgICAgcHVibGljIEZpbHRlciBnZXRGaWx0ZXIoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmZpbHRlcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VydmxldCByZXF1ZXN0IGZvciB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkLgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0UmVxdWVzdCBnZXRSZXF1ZXN0KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5yZXF1ZXN0KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJ2bGV0IHJlc3BvbnNlIGZvciB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkLgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0UmVzcG9uc2UgZ2V0UmVzcG9uc2UoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJ2bGV0IGluc3RhbmNlIGZvciB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkLgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0IGdldFNlcnZsZXQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlcnZsZXQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV2ZW50IHR5cGUgb2YgdGhpcyBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnR5cGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFdyYXBwZXIgbWFuYWdpbmcgdGhlIHNlcnZsZXQgaW5zdGFuY2UgZm9yIHdoaWNoIHRoaXMKKyAgICAgKiBldmVudCBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV3JhcHBlciBnZXRXcmFwcGVyKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy53cmFwcGVyKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvSW5zdGFuY2VMaXN0ZW5lci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0luc3RhbmNlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTA2MmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0luc3RhbmNlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKKworLyoqCisgKiBJbnRlcmZhY2UgZGVmaW5pbmcgYSBsaXN0ZW5lciBmb3Igc2lnbmlmaWNhbnQgZXZlbnRzIHJlbGF0ZWQgdG8gYQorICogc3BlY2lmaWMgc2VydmxldCBpbnN0YW5jZSwgcmF0aGVyIHRoYW4gdG8gdGhlIFdyYXBwZXIgY29tcG9uZW50IHRoYXQKKyAqIGlzIG1hbmFnaW5nIHRoYXQgaW5zdGFuY2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgSW5zdGFuY2VMaXN0ZW5lciB7CisKKworICAgIC8qKgorICAgICAqIEFja25vd2xlZGdlIHRoZSBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgSW5zdGFuY2VFdmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudCBldmVudCk7CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0xpZmVjeWNsZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0xpZmVjeWNsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NDlmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvTGlmZWN5Y2xlLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCisvKioKKyAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGNvbXBvbmVudCBsaWZlIGN5Y2xlIG1ldGhvZHMuICBDYXRhbGluYSBjb21wb25lbnRzCisgKiBtYXksIGJ1dCBhcmUgbm90IHJlcXVpcmVkIHRvLCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgKGFzIHdlbGwgYXMgdGhlCisgKiBhcHByb3ByaWF0ZSBpbnRlcmZhY2UocykgZm9yIHRoZSBmdW5jdGlvbmFsaXR5IHRoZXkgc3VwcG9ydCkgaW4gb3JkZXIgdG8KKyAqIHByb3ZpZGUgYSBjb25zaXN0ZW50IG1lY2hhbmlzbSB0byBzdGFydCBhbmQgc3RvcCB0aGUgY29tcG9uZW50LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIExpZmVjeWNsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hbmlmZXN0IENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTGlmZWN5Y2xlRXZlbnQgdHlwZSBmb3IgdGhlICJjb21wb25lbnQgaW5pdCIgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVF9FVkVOVCA9ICJpbml0IjsKKworCisgICAgLyoqCisgICAgICogVGhlIExpZmVjeWNsZUV2ZW50IHR5cGUgZm9yIHRoZSAiY29tcG9uZW50IHN0YXJ0IiBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9FVkVOVCA9ICJzdGFydCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBMaWZlY3ljbGVFdmVudCB0eXBlIGZvciB0aGUgImNvbXBvbmVudCBiZWZvcmUgc3RhcnQiIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFRk9SRV9TVEFSVF9FVkVOVCA9ICJiZWZvcmVfc3RhcnQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTGlmZWN5Y2xlRXZlbnQgdHlwZSBmb3IgdGhlICJjb21wb25lbnQgYWZ0ZXIgc3RhcnQiIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFGVEVSX1NUQVJUX0VWRU5UID0gImFmdGVyX3N0YXJ0IjsKKworCisgICAgLyoqCisgICAgICogVGhlIExpZmVjeWNsZUV2ZW50IHR5cGUgZm9yIHRoZSAiY29tcG9uZW50IHN0b3AiIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1BfRVZFTlQgPSAic3RvcCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBMaWZlY3ljbGVFdmVudCB0eXBlIGZvciB0aGUgImNvbXBvbmVudCBiZWZvcmUgc3RvcCIgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVGT1JFX1NUT1BfRVZFTlQgPSAiYmVmb3JlX3N0b3AiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTGlmZWN5Y2xlRXZlbnQgdHlwZSBmb3IgdGhlICJjb21wb25lbnQgYWZ0ZXIgc3RvcCIgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUZURVJfU1RPUF9FVkVOVCA9ICJhZnRlcl9zdG9wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIExpZmVjeWNsZUV2ZW50IHR5cGUgZm9yIHRoZSAiY29tcG9uZW50IGRlc3Ryb3kiIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU1RST1lfRVZFTlQgPSAiZGVzdHJveSI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBMaWZlY3ljbGVFdmVudCB0eXBlIGZvciB0aGUgInBlcmlvZGljIiBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJJT0RJQ19FVkVOVCA9ICJwZXJpb2RpYyI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBMaWZlY3ljbGVFdmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpOworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlmZWN5Y2xlLiBJZiB0aGlzIAorICAgICAqIExpZmVjeWNsZSBoYXMgbm8gbGlzdGVuZXJzIHJlZ2lzdGVyZWQsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUxpc3RlbmVyW10gZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBMaWZlY3ljbGVFdmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcik7CisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvZiB0aGUgcHVibGljCisgICAgICogbWV0aG9kcyBvZiB0aGlzIGNvbXBvbmVudCBhcmUgdXRpbGl6ZWQuICBJdCBzaG91bGQgYWxzbyBzZW5kIGEKKyAgICAgKiBMaWZlY3ljbGVFdmVudCBvZiB0eXBlIFNUQVJUX0VWRU5UIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IHByZXZlbnRzIHRoaXMgY29tcG9uZW50IGZyb20gYmVpbmcgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSB0ZXJtaW5hdGUgdGhlIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdGhlIGxhc3Qgb25lIGNhbGxlZCBvbiBhIGdpdmVuCisgICAgICogaW5zdGFuY2Ugb2YgdGhpcyBjb21wb25lbnQuICBJdCBzaG91bGQgYWxzbyBzZW5kIGEgTGlmZWN5Y2xlRXZlbnQKKyAgICAgKiBvZiB0eXBlIFNUT1BfRVZFTlQgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbjsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvTGlmZWN5Y2xlRXZlbnQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9MaWZlY3ljbGVFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNjRjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvTGlmZWN5Y2xlRXZlbnQuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CisKKworLyoqCisgKiBHZW5lcmFsIGV2ZW50IGZvciBub3RpZnlpbmcgbGlzdGVuZXJzIG9mIHNpZ25pZmljYW50IGNoYW5nZXMgb24gYSBjb21wb25lbnQKKyAqIHRoYXQgaW1wbGVtZW50cyB0aGUgTGlmZWN5Y2xlIGludGVyZmFjZS4gIEluIHBhcnRpY3VsYXIsIHRoaXMgd2lsbCBiZSB1c2VmdWwKKyAqIG9uIENvbnRhaW5lcnMsIHdoZXJlIHRoZXNlIGV2ZW50cyByZXBsYWNlIHRoZSBDb250ZXh0SW50ZXJjZXB0b3IgY29uY2VwdCBpbgorICogVG9tY2F0IDMueC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIExpZmVjeWNsZUV2ZW50CisgICAgZXh0ZW5kcyBFdmVudE9iamVjdCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgTGlmZWN5Y2xlRXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlmZWN5Y2xlIENvbXBvbmVudCBvbiB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkCisgICAgICogQHBhcmFtIHR5cGUgRXZlbnQgdHlwZSAocmVxdWlyZWQpCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUV2ZW50KExpZmVjeWNsZSBsaWZlY3ljbGUsIFN0cmluZyB0eXBlKSB7CisKKyAgICAgICAgdGhpcyhsaWZlY3ljbGUsIHR5cGUsIG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgTGlmZWN5Y2xlRXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlmZWN5Y2xlIENvbXBvbmVudCBvbiB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkCisgICAgICogQHBhcmFtIHR5cGUgRXZlbnQgdHlwZSAocmVxdWlyZWQpCisgICAgICogQHBhcmFtIGRhdGEgRXZlbnQgZGF0YSAoaWYgYW55KQorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVFdmVudChMaWZlY3ljbGUgbGlmZWN5Y2xlLCBTdHJpbmcgdHlwZSwgT2JqZWN0IGRhdGEpIHsKKworICAgICAgICBzdXBlcihsaWZlY3ljbGUpOworICAgICAgICB0aGlzLmxpZmVjeWNsZSA9IGxpZmVjeWNsZTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBldmVudCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGRhdGEgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTGlmZWN5Y2xlIG9uIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBMaWZlY3ljbGUgbGlmZWN5Y2xlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGV2ZW50IHR5cGUgdGhpcyBpbnN0YW5jZSByZXByZXNlbnRzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHR5cGUgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBldmVudCBkYXRhIG9mIHRoaXMgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXREYXRhKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5kYXRhKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMaWZlY3ljbGUgb24gd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlIGdldExpZmVjeWNsZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMubGlmZWN5Y2xlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBldmVudCB0eXBlIG9mIHRoaXMgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy50eXBlKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvTGlmZWN5Y2xlRXhjZXB0aW9uLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvTGlmZWN5Y2xlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FmNzU4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9MaWZlY3ljbGVFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKKy8qKgorICogR2VuZXJhbCBwdXJwb3NlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB0byBpbmRpY2F0ZSBhIGxpZmVjeWNsZSByZWxhdGVkCisgKiBwcm9ibGVtLiAgU3VjaCBleGNlcHRpb25zIHNob3VsZCBnZW5lcmFsbHkgYmUgY29uc2lkZXJlZCBmYXRhbCB0byB0aGUKKyAqIG9wZXJhdGlvbiBvZiB0aGUgYXBwbGljYXRpb24gY29udGFpbmluZyB0aGlzIGNvbXBvbmVudC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIExpZmVjeWNsZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uIHdpdGggbm8gb3RoZXIgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUV4Y2VwdGlvbigpIHsKKworICAgICAgICB0aGlzKG51bGwsIG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uIGZvciB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIGRlc2NyaWJpbmcgdGhpcyBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisKKyAgICAgICAgdGhpcyhtZXNzYWdlLCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbiBmb3IgdGhlIHNwZWNpZmllZCB0aHJvd2FibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhyb3dhYmxlIFRocm93YWJsZSB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVFeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSkgeworCisgICAgICAgIHRoaXMobnVsbCwgdGhyb3dhYmxlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBtZXNzYWdlCisgICAgICogYW5kIHRocm93YWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UgZGVzY3JpYmluZyB0aGlzIGV4Y2VwdGlvbgorICAgICAqIEBwYXJhbSB0aHJvd2FibGUgVGhyb3dhYmxlIHRoYXQgY2F1c2VkIHRoaXMgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIHRoaXMudGhyb3dhYmxlID0gdGhyb3dhYmxlOworCisgICAgfQorCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGVycm9yIG1lc3NhZ2UgcGFzc2VkIHRvIG91ciBjb25zdHJ1Y3RvciAoaWYgYW55KQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSB1bmRlcmx5aW5nIGV4Y2VwdGlvbiBvciBlcnJvciBwYXNzZWQgdG8gb3VyIGNvbnN0cnVjdG9yIChpZiBhbnkpCisgICAgICovCisgICAgcHJvdGVjdGVkIFRocm93YWJsZSB0aHJvd2FibGUgPSBudWxsOworCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBleGNlcHRpb24sIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisKKyAgICAgICAgcmV0dXJuIChtZXNzYWdlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGhyb3dhYmxlIHRoYXQgY2F1c2VkIHRoaXMgZXhjZXB0aW9uLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIFRocm93YWJsZSBnZXRUaHJvd2FibGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aHJvd2FibGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBmb3JtYXR0ZWQgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoaXMgZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiTGlmZWN5Y2xlRXhjZXB0aW9uOiAgIik7CisgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgICAgIGlmICh0aHJvd2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiOiAgIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQodGhyb3dhYmxlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0xpZmVjeWNsZUxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmRjNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0xpZmVjeWNsZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKKworCisvKioKKyAqIEludGVyZmFjZSBkZWZpbmluZyBhIGxpc3RlbmVyIGZvciBzaWduaWZpY2FudCBldmVudHMgKGluY2x1ZGluZyAiY29tcG9uZW50CisgKiBzdGFydCIgYW5kICJjb21wb25lbnQgc3RvcCIgZ2VuZXJhdGVkIGJ5IGEgY29tcG9uZW50IHRoYXQgaW1wbGVtZW50cyB0aGUKKyAqIExpZmVjeWNsZSBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgTGlmZWN5Y2xlTGlzdGVuZXIgeworCisKKyAgICAvKioKKyAgICAgKiBBY2tub3dsZWRnZSB0aGUgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IExpZmVjeWNsZUV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgbGlmZWN5Y2xlRXZlbnQoTGlmZWN5Y2xlRXZlbnQgZXZlbnQpOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Mb2FkZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Mb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQ2ODUzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0xvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKKworCisvKioKKyAqIEEgPGI+TG9hZGVyPC9iPiByZXByZXNlbnRzIGEgSmF2YSBDbGFzc0xvYWRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbgorICogYmUgdXNlZCBieSBhIENvbnRhaW5lciB0byBsb2FkIGNsYXNzIGZpbGVzICh3aXRoaW4gYSByZXBvc2l0b3J5IGFzc29jaWF0ZWQKKyAqIHdpdGggdGhlIExvYWRlcikgdGhhdCBhcmUgZGVzaWduZWQgdG8gYmUgcmVsb2FkZWQgdXBvbiByZXF1ZXN0LCBhcyB3ZWxsIGFzCisgKiBhIG1lY2hhbmlzbSB0byBkZXRlY3Qgd2hldGhlciBjaGFuZ2VzIGhhdmUgb2NjdXJyZWQgaW4gdGhlIHVuZGVybHlpbmcKKyAqIHJlcG9zaXRvcnkuCisgKiA8cD4KKyAqIEluIG9yZGVyIGZvciBhIDxjb2RlPkxvYWRlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gdG8gc3VjY2Vzc2Z1bGx5IG9wZXJhdGUKKyAqIHdpdGggYSA8Y29kZT5Db250ZXh0PC9jb2RlPiBpbXBsZW1lbnRhdGlvbiB0aGF0IGltcGxlbWVudHMgcmVsb2FkaW5nLCBpdAorICogbXVzdCBvYmV5IHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHM6CisgKiA8dWw+CisgKiA8bGk+TXVzdCBpbXBsZW1lbnQgPGNvZGU+TGlmZWN5Y2xlPC9jb2RlPiBzbyB0aGF0IHRoZSBDb250ZXh0IGNhbiBpbmRpY2F0ZQorICogICAgIHRoYXQgYSBuZXcgY2xhc3MgbG9hZGVyIGlzIHJlcXVpcmVkLgorICogPGxpPlRoZSA8Y29kZT5zdGFydCgpPC9jb2RlPiBtZXRob2QgbXVzdCB1bmNvbmRpdGlvbmFsbHkgY3JlYXRlIGEgbmV3CisgKiAgICAgPGNvZGU+Q2xhc3NMb2FkZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uLgorICogPGxpPlRoZSA8Y29kZT5zdG9wKCk8L2NvZGU+IG1ldGhvZCBtdXN0IHRocm93IGF3YXkgaXRzIHJlZmVyZW5jZSB0byB0aGUKKyAqICAgICA8Y29kZT5DbGFzc0xvYWRlcjwvY29kZT4gcHJldmlvdXNseSB1dGlsaXplZCwgc28gdGhhdCB0aGUgY2xhc3MgbG9hZGVyLAorICogICAgIGFsbCBjbGFzc2VzIGxvYWRlZCBieSBpdCwgYW5kIGFsbCBvYmplY3RzIG9mIHRob3NlIGNsYXNzZXMsIGNhbiBiZQorICogICAgIGdhcmJhZ2UgY29sbGVjdGVkLgorICogPGxpPk11c3QgYWxsb3cgYSBjYWxsIHRvIDxjb2RlPnN0b3AoKTwvY29kZT4gdG8gYmUgZm9sbG93ZWQgYnkgYSBjYWxsIHRvCisgKiAgICAgPGNvZGU+c3RhcnQoKTwvY29kZT4gb24gdGhlIHNhbWUgPGNvZGU+TG9hZGVyPC9jb2RlPiBpbnN0YW5jZS4KKyAqIDxsaT5CYXNlZCBvbiBhIHBvbGljeSBjaG9zZW4gYnkgdGhlIGltcGxlbWVudGF0aW9uLCBtdXN0IGNhbGwgdGhlCisgKiAgICAgPGNvZGU+Q29udGV4dC5yZWxvYWQoKTwvY29kZT4gbWV0aG9kIG9uIHRoZSBvd25pbmcgPGNvZGU+Q29udGV4dDwvY29kZT4KKyAqICAgICB3aGVuIGEgY2hhbmdlIHRvIG9uZSBvciBtb3JlIG9mIHRoZSBjbGFzcyBmaWxlcyBsb2FkZWQgYnkgdGhpcyBjbGFzcworICogICAgIGxvYWRlciBpcyBkZXRlY3RlZC4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgTG9hZGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgYSBwZXJpb2RpYyB0YXNrLCBzdWNoIGFzIHJlbG9hZGluZywgZXRjLiBUaGlzIG1ldGhvZCB3aWxsIGJlCisgICAgICogaW52b2tlZCBpbnNpZGUgdGhlIGNsYXNzbG9hZGluZyBjb250ZXh0IG9mIHRoaXMgY29udGFpbmVyLiBVbmV4cGVjdGVkCisgICAgICogdGhyb3dhYmxlcyB3aWxsIGJlIGNhdWdodCBhbmQgbG9nZ2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJhY2tncm91bmRQcm9jZXNzKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSmF2YSBjbGFzcyBsb2FkZXIgdG8gYmUgdXNlZCBieSB0aGlzIENvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIExvYWRlciBoYXMgYmVlbiBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBMb2FkZXIgaGFzIGJlZW4gYXNzb2NpYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXIgVGhlIGFzc29jaWF0ZWQgQ29udGFpbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKENvbnRhaW5lciBjb250YWluZXIpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlICJmb2xsb3cgc3RhbmRhcmQgZGVsZWdhdGlvbiBtb2RlbCIgZmxhZyB1c2VkIHRvIGNvbmZpZ3VyZQorICAgICAqIG91ciBDbGFzc0xvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWxlZ2F0ZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlICJmb2xsb3cgc3RhbmRhcmQgZGVsZWdhdGlvbiBtb2RlbCIgZmxhZyB1c2VkIHRvIGNvbmZpZ3VyZQorICAgICAqIG91ciBDbGFzc0xvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWxlZ2F0ZSBUaGUgbmV3IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWxlZ2F0ZShib29sZWFuIGRlbGVnYXRlKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgTG9hZGVyIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlbG9hZGFibGUgZmxhZyBmb3IgdGhpcyBMb2FkZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UmVsb2FkYWJsZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlbG9hZGFibGUgZmxhZyBmb3IgdGhpcyBMb2FkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVsb2FkYWJsZSBUaGUgbmV3IHJlbG9hZGFibGUgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbG9hZGFibGUoYm9vbGVhbiByZWxvYWRhYmxlKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHJlcG9zaXRvcnkgdG8gdGhlIHNldCBvZiByZXBvc2l0b3JpZXMgZm9yIHRoaXMgY2xhc3MgbG9hZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcG9zaXRvcnkgUmVwb3NpdG9yeSB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJlcG9zaXRvcnkoU3RyaW5nIHJlcG9zaXRvcnkpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiByZXBvc2l0b3JpZXMgZGVmaW5lZCBmb3IgdGhpcyBjbGFzcyBsb2FkZXIuCisgICAgICogSWYgbm9uZSBhcmUgZGVmaW5lZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZFJlcG9zaXRvcmllcygpOworCisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhlIGludGVybmFsIHJlcG9zaXRvcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgTG9hZGVyIGJlZW4gbW9kaWZpZWQsCisgICAgICogc3VjaCB0aGF0IHRoZSBsb2FkZWQgY2xhc3NlcyBzaG91bGQgYmUgcmVsb2FkZWQ/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbW9kaWZpZWQoKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL01hbmFnZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyMTRjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwzNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKworLyoqCisgKiBBIDxiPk1hbmFnZXI8L2I+IG1hbmFnZXMgdGhlIHBvb2wgb2YgU2Vzc2lvbnMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGEKKyAqIHBhcnRpY3VsYXIgQ29udGFpbmVyLiAgRGlmZmVyZW50IE1hbmFnZXIgaW1wbGVtZW50YXRpb25zIG1heSBzdXBwb3J0CisgKiB2YWx1ZS1hZGRlZCBmZWF0dXJlcyBzdWNoIGFzIHRoZSBwZXJzaXN0ZW50IHN0b3JhZ2Ugb2Ygc2Vzc2lvbiBkYXRhLAorICogYXMgd2VsbCBhcyBtaWdyYXRpbmcgc2Vzc2lvbnMgZm9yIGRpc3RyaWJ1dGFibGUgd2ViIGFwcGxpY2F0aW9ucy4KKyAqIDxwPgorICogSW4gb3JkZXIgZm9yIGEgPGNvZGU+TWFuYWdlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gdG8gc3VjY2Vzc2Z1bGx5IG9wZXJhdGUKKyAqIHdpdGggYSA8Y29kZT5Db250ZXh0PC9jb2RlPiBpbXBsZW1lbnRhdGlvbiB0aGF0IGltcGxlbWVudHMgcmVsb2FkaW5nLCBpdAorICogbXVzdCBvYmV5IHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHM6CisgKiA8dWw+CisgKiA8bGk+TXVzdCBpbXBsZW1lbnQgPGNvZGU+TGlmZWN5Y2xlPC9jb2RlPiBzbyB0aGF0IHRoZSBDb250ZXh0IGNhbiBpbmRpY2F0ZQorICogICAgIHRoYXQgYSByZXN0YXJ0IGlzIHJlcXVpcmVkLgorICogPGxpPk11c3QgYWxsb3cgYSBjYWxsIHRvIDxjb2RlPnN0b3AoKTwvY29kZT4gdG8gYmUgZm9sbG93ZWQgYnkgYSBjYWxsIHRvCisgKiAgICAgPGNvZGU+c3RhcnQoKTwvY29kZT4gb24gdGhlIHNhbWUgPGNvZGU+TWFuYWdlcjwvY29kZT4gaW5zdGFuY2UuCisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIE1hbmFnZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIE1hbmFnZXIgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENvbnRhaW5lciB3aXRoIHdoaWNoIHRoaXMgTWFuYWdlciBpcyBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgbmV3bHkgYXNzb2NpYXRlZCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGNvbnRhaW5lcik7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlzdHJpYnV0YWJsZSBmbGFnIGZvciB0aGUgc2Vzc2lvbnMgc3VwcG9ydGVkIGJ5CisgICAgICogdGhpcyBNYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldERpc3RyaWJ1dGFibGUoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkaXN0cmlidXRhYmxlIGZsYWcgZm9yIHRoZSBzZXNzaW9ucyBzdXBwb3J0ZWQgYnkgdGhpcworICAgICAqIE1hbmFnZXIuICBJZiB0aGlzIGZsYWcgaXMgc2V0LCBhbGwgdXNlciBkYXRhIG9iamVjdHMgYWRkZWQgdG8KKyAgICAgKiBzZXNzaW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBtYW5hZ2VyIG11c3QgaW1wbGVtZW50IFNlcmlhbGl6YWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXN0cmlidXRhYmxlIFRoZSBuZXcgZGlzdHJpYnV0YWJsZSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzdHJpYnV0YWJsZShib29sZWFuIGRpc3RyaWJ1dGFibGUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBNYW5hZ2VyIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgbWF4aW11bSBpbmFjdGl2ZSBpbnRlcnZhbCAoaW4gc2Vjb25kcykKKyAgICAgKiBmb3IgU2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzIE1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhJbmFjdGl2ZUludGVydmFsKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVmYXVsdCBtYXhpbXVtIGluYWN0aXZlIGludGVydmFsIChpbiBzZWNvbmRzKQorICAgICAqIGZvciBTZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlcnZhbCBUaGUgbmV3IGRlZmF1bHQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhJbmFjdGl2ZUludGVydmFsKGludCBpbnRlcnZhbCk7CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNlc3Npb24gaWQgbGVuZ3RoIChpbiBieXRlcykgb2YgU2Vzc2lvbnMgY3JlYXRlZCBieQorICAgICAqIHRoaXMgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24gaWQgbGVuZ3RoCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZXNzaW9uSWRMZW5ndGgoKTsKKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2Vzc2lvbiBpZCBsZW5ndGggKGluIGJ5dGVzKSBmb3IgU2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzCisgICAgICogTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZExlbmd0aCBUaGUgc2Vzc2lvbiBpZCBsZW5ndGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uSWRMZW5ndGgoaW50IGlkTGVuZ3RoKTsKKworCisgICAgLyoqIAorICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBzZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgbWFuYWdlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVG90YWwgbnVtYmVyIG9mIHNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2Vzc2lvbkNvdW50ZXIoKTsKKworCisgICAgLyoqIAorICAgICAqIFNldHMgdGhlIHRvdGFsIG51bWJlciBvZiBzZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgbWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uQ291bnRlciBUb3RhbCBudW1iZXIgb2Ygc2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbkNvdW50ZXIoaW50IHNlc3Npb25Db3VudGVyKTsKKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2Vzc2lvbnMgdGhhdCBoYXZlIGJlZW4gYWN0aXZlIGF0IHRoZSBzYW1lCisgICAgICogdGltZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTWF4aW11bSBudW1iZXIgb2Ygc2Vzc2lvbnMgdGhhdCBoYXZlIGJlZW4gYWN0aXZlIGF0IHRoZSBzYW1lCisgICAgICogdGltZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4QWN0aXZlKCk7CisKKworICAgIC8qKgorICAgICAqIChSZSlzZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZXNzaW9ucyB0aGF0IGhhdmUgYmVlbiBhY3RpdmUgYXQgdGhlCisgICAgICogc2FtZSB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG1heEFjdGl2ZSBNYXhpbXVtIG51bWJlciBvZiBzZXNzaW9ucyB0aGF0IGhhdmUgYmVlbiBhY3RpdmUgYXQKKyAgICAgKiB0aGUgc2FtZSB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heEFjdGl2ZShpbnQgbWF4QWN0aXZlKTsKKworCisgICAgLyoqIAorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBjdXJyZW50bHkgYWN0aXZlIHNlc3Npb25zLgorICAgICAqCisgICAgICogQHJldHVybiBOdW1iZXIgb2YgY3VycmVudGx5IGFjdGl2ZSBzZXNzaW9ucworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QWN0aXZlU2Vzc2lvbnMoKTsKKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHNlc3Npb25zIHRoYXQgaGF2ZSBleHBpcmVkLgorICAgICAqCisgICAgICogQHJldHVybiBOdW1iZXIgb2Ygc2Vzc2lvbnMgdGhhdCBoYXZlIGV4cGlyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEV4cGlyZWRTZXNzaW9ucygpOworCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2Ygc2Vzc2lvbnMgdGhhdCBoYXZlIGV4cGlyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwaXJlZFNlc3Npb25zIE51bWJlciBvZiBzZXNzaW9ucyB0aGF0IGhhdmUgZXhwaXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4cGlyZWRTZXNzaW9ucyhpbnQgZXhwaXJlZFNlc3Npb25zKTsKKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHNlc3Npb25zIHRoYXQgd2VyZSBub3QgY3JlYXRlZCBiZWNhdXNlIHRoZSBtYXhpbXVtCisgICAgICogbnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyB3YXMgcmVhY2hlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIHJlamVjdGVkIHNlc3Npb25zCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZWplY3RlZFNlc3Npb25zKCk7CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBzZXNzaW9ucyB0aGF0IHdlcmUgbm90IGNyZWF0ZWQgYmVjYXVzZSB0aGUgbWF4aW11bQorICAgICAqIG51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMgd2FzIHJlYWNoZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVqZWN0ZWRTZXNzaW9ucyBOdW1iZXIgb2YgcmVqZWN0ZWQgc2Vzc2lvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWplY3RlZFNlc3Npb25zKGludCByZWplY3RlZFNlc3Npb25zKTsKKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbG9uZ2VzdCB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IGFuIGV4cGlyZWQgc2Vzc2lvbiBoYWQgYmVlbgorICAgICAqIGFsaXZlLgorICAgICAqCisgICAgICogQHJldHVybiBMb25nZXN0IHRpbWUgKGluIHNlY29uZHMpIHRoYXQgYW4gZXhwaXJlZCBzZXNzaW9uIGhhZCBiZWVuCisgICAgICogYWxpdmUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZXNzaW9uTWF4QWxpdmVUaW1lKCk7CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxvbmdlc3QgdGltZSAoaW4gc2Vjb25kcykgdGhhdCBhbiBleHBpcmVkIHNlc3Npb24gaGFkIGJlZW4KKyAgICAgKiBhbGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uTWF4QWxpdmVUaW1lIExvbmdlc3QgdGltZSAoaW4gc2Vjb25kcykgdGhhdCBhbiBleHBpcmVkCisgICAgICogc2Vzc2lvbiBoYWQgYmVlbiBhbGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uTWF4QWxpdmVUaW1lKGludCBzZXNzaW9uTWF4QWxpdmVUaW1lKTsKKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYXZlcmFnZSB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IGV4cGlyZWQgc2Vzc2lvbnMgaGFkIGJlZW4KKyAgICAgKiBhbGl2ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQXZlcmFnZSB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IGV4cGlyZWQgc2Vzc2lvbnMgaGFkIGJlZW4KKyAgICAgKiBhbGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNlc3Npb25BdmVyYWdlQWxpdmVUaW1lKCk7CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGF2ZXJhZ2UgdGltZSAoaW4gc2Vjb25kcykgdGhhdCBleHBpcmVkIHNlc3Npb25zIGhhZCBiZWVuCisgICAgICogYWxpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbkF2ZXJhZ2VBbGl2ZVRpbWUgQXZlcmFnZSB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IGV4cGlyZWQKKyAgICAgKiBzZXNzaW9ucyBoYWQgYmVlbiBhbGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uQXZlcmFnZUFsaXZlVGltZShpbnQgc2Vzc2lvbkF2ZXJhZ2VBbGl2ZVRpbWUpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIHRoaXMgU2Vzc2lvbiB0byB0aGUgc2V0IG9mIGFjdGl2ZSBTZXNzaW9ucyBmb3IgdGhpcyBNYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChTZXNzaW9uIHNlc3Npb24pOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CisKKworICAgIC8qKgorICAgICAqIEdldCBhIHNlc3Npb24gZnJvbSB0aGUgcmVjeWNsZWQgb25lcyBvciBjcmVhdGUgYSBuZXcgZW1wdHkgb25lLgorICAgICAqIFRoZSBQZXJzaXN0ZW50TWFuYWdlciBtYW5hZ2VyIGRvZXMgbm90IG5lZWQgdG8gY3JlYXRlIHNlc3Npb24gZGF0YQorICAgICAqIGJlY2F1c2UgaXQgcmVhZHMgaXQgZnJvbSB0aGUgU3RvcmUuCisgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHB1YmxpYyBTZXNzaW9uIGNyZWF0ZUVtcHR5U2Vzc2lvbigpOworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW5kIHJldHVybiBhIG5ldyBzZXNzaW9uIG9iamVjdCwgYmFzZWQgb24gdGhlIGRlZmF1bHQKKyAgICAgKiBzZXR0aW5ncyBzcGVjaWZpZWQgYnkgdGhpcyBNYW5hZ2VyJ3MgcHJvcGVydGllcy4gIFRoZSBzZXNzaW9uCisgICAgICogaWQgd2lsbCBiZSBhc3NpZ25lZCBieSB0aGlzIG1ldGhvZCwgYW5kIGF2YWlsYWJsZSB2aWEgdGhlIGdldElkKCkKKyAgICAgKiBtZXRob2Qgb2YgdGhlIHJldHVybmVkIHNlc3Npb24uICBJZiBhIG5ldyBzZXNzaW9uIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICogZm9yIGFueSByZWFzb24sIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIG5ldyBzZXNzaW9uIGNhbm5vdCBiZQorICAgICAqICBpbnN0YW50aWF0ZWQgZm9yIGFueSByZWFzb24KKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uIGNyZWF0ZVNlc3Npb24oKTsKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuZCByZXR1cm4gYSBuZXcgc2Vzc2lvbiBvYmplY3QsIGJhc2VkIG9uIHRoZSBkZWZhdWx0CisgICAgICogc2V0dGluZ3Mgc3BlY2lmaWVkIGJ5IHRoaXMgTWFuYWdlcidzIHByb3BlcnRpZXMuICBUaGUgc2Vzc2lvbgorICAgICAqIGlkIHNwZWNpZmllZCB3aWxsIGJlIHVzZWQgYXMgdGhlIHNlc3Npb24gaWQuCisgICAgICogSWYgYSBuZXcgc2Vzc2lvbiBjYW5ub3QgYmUgY3JlYXRlZCBmb3IgYW55IHJlYXNvbiwgcmV0dXJuIAorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQgd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIHRoZQorICAgICAqICBuZXcgc2Vzc2lvbjsgaWYgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSBzZXNzaW9uCisgICAgICogIGlkIHdpbGwgYmUgYXNzaWduZWQgYnkgdGhpcyBtZXRob2QsIGFuZCBhdmFpbGFibGUgdmlhIHRoZSBnZXRJZCgpCisgICAgICogIG1ldGhvZCBvZiB0aGUgcmV0dXJuZWQgc2Vzc2lvbi4KKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIG5ldyBzZXNzaW9uIGNhbm5vdCBiZQorICAgICAqICBpbnN0YW50aWF0ZWQgZm9yIGFueSByZWFzb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKFN0cmluZyBzZXNzaW9uSWQpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFjdGl2ZSBTZXNzaW9uLCBhc3NvY2lhdGVkIHdpdGggdGhpcyBNYW5hZ2VyLCB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBzZXNzaW9uIGlkIChpZiBhbnkpOyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGlkIFRoZSBzZXNzaW9uIGlkIGZvciB0aGUgc2Vzc2lvbiB0byBiZSByZXR1cm5lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBuZXcgc2Vzc2lvbiBjYW5ub3QgYmUKKyAgICAgKiAgaW5zdGFudGlhdGVkIGZvciBhbnkgcmVhc29uCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzIHdoaWxlCisgICAgICogIHByb2Nlc3NpbmcgdGhpcyByZXF1ZXN0CisgICAgICovCisgICAgcHVibGljIFNlc3Npb24gZmluZFNlc3Npb24oU3RyaW5nIGlkKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGFjdGl2ZSBTZXNzaW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBNYW5hZ2VyLgorICAgICAqIElmIHRoaXMgTWFuYWdlciBoYXMgbm8gYWN0aXZlIFNlc3Npb25zLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uW10gZmluZFNlc3Npb25zKCk7CisKKworICAgIC8qKgorICAgICAqIExvYWQgYW55IGN1cnJlbnRseSBhY3RpdmUgc2Vzc2lvbnMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgdW5sb2FkZWQKKyAgICAgKiB0byB0aGUgYXBwcm9wcmlhdGUgcGVyc2lzdGVuY2UgbWVjaGFuaXNtLCBpZiBhbnkuICBJZiBwZXJzaXN0ZW5jZSBpcyBub3QKKyAgICAgKiBzdXBwb3J0ZWQsIHRoaXMgbWV0aG9kIHJldHVybnMgd2l0aG91dCBkb2luZyBhbnl0aGluZy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhIHNlcmlhbGl6ZWQgY2xhc3MgY2Fubm90IGJlCisgICAgICogIGZvdW5kIGR1cmluZyB0aGUgcmVsb2FkCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZCgpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoaXMgU2Vzc2lvbiBmcm9tIHRoZSBhY3RpdmUgU2Vzc2lvbnMgZm9yIHRoaXMgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uIFNlc3Npb24gdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTZXNzaW9uIHNlc3Npb24pOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogU2F2ZSBhbnkgY3VycmVudGx5IGFjdGl2ZSBzZXNzaW9ucyBpbiB0aGUgYXBwcm9wcmlhdGUgcGVyc2lzdGVuY2UKKyAgICAgKiBtZWNoYW5pc20sIGlmIGFueS4gIElmIHBlcnNpc3RlbmNlIGlzIG5vdCBzdXBwb3J0ZWQsIHRoaXMgbWV0aG9kCisgICAgICogcmV0dXJucyB3aXRob3V0IGRvaW5nIGFueXRoaW5nLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5sb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIAorICAgICAvKioKKyAgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGJ5IHRoZSBjb250ZXh0L2NvbnRhaW5lciBvbiBhIHBlcmlvZGljCisgICAgICAqIGJhc2lzIGFuZCBhbGxvd3MgdGhlIG1hbmFnZXIgdG8gaW1wbGVtZW50CisgICAgICAqIGEgbWV0aG9kIHRoYXQgZXhlY3V0ZXMgcGVyaW9kaWMgdGFza3MsIHN1Y2ggYXMgZXhwaXJpbmcgc2Vzc2lvbnMgZXRjLgorICAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgYmFja2dyb3VuZFByb2Nlc3MoKTsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1BpcGVsaW5lLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvUGlwZWxpbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWI4ZmVkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1BpcGVsaW5lLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCisvKioKKyAqIDxwPkludGVyZmFjZSBkZXNjcmliaW5nIGEgY29sbGVjdGlvbiBvZiBWYWx2ZXMgdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQKKyAqIGluIHNlcXVlbmNlIHdoZW4gdGhlIDxjb2RlPmludm9rZSgpPC9jb2RlPiBtZXRob2QgaXMgaW52b2tlZC4gIEl0IGlzCisgKiByZXF1aXJlZCB0aGF0IGEgVmFsdmUgc29tZXdoZXJlIGluIHRoZSBwaXBlbGluZSAodXN1YWxseSB0aGUgbGFzdCBvbmUpCisgKiBtdXN0IHByb2Nlc3MgdGhlIHJlcXVlc3QgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZSwgcmF0aGVyCisgKiB0aGFuIHRyeWluZyB0byBwYXNzIHRoZSByZXF1ZXN0IG9uLjwvcD4KKyAqCisgKiA8cD5UaGVyZSBpcyBnZW5lcmFsbHkgYSBzaW5nbGUgUGlwZWxpbmUgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGVhY2gKKyAqIENvbnRhaW5lci4gIFRoZSBjb250YWluZXIncyBub3JtYWwgcmVxdWVzdCBwcm9jZXNzaW5nIGZ1bmN0aW9uYWxpdHkgaXMKKyAqIGdlbmVyYWxseSBlbmNhcHN1bGF0ZWQgaW4gYSBjb250YWluZXItc3BlY2lmaWMgVmFsdmUsIHdoaWNoIHNob3VsZCBhbHdheXMKKyAqIGJlIGV4ZWN1dGVkIGF0IHRoZSBlbmQgb2YgYSBwaXBlbGluZS4gIFRvIGZhY2lsaXRhdGUgdGhpcywgdGhlCisgKiA8Y29kZT5zZXRCYXNpYygpPC9jb2RlPiBtZXRob2QgaXMgcHJvdmlkZWQgdG8gc2V0IHRoZSBWYWx2ZSBpbnN0YW5jZSB0aGF0CisgKiB3aWxsIGFsd2F5cyBiZSBleGVjdXRlZCBsYXN0LiAgT3RoZXIgVmFsdmVzIHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIG9yZGVyCisgKiB0aGF0IHRoZXkgd2VyZSBhZGRlZCwgYmVmb3JlIHRoZSBiYXNpYyBWYWx2ZSBpcyBleGVjdXRlZC48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFBldGVyIERvbmFsZAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFBpcGVsaW5lIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIDxwPlJldHVybiB0aGUgVmFsdmUgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBkaXN0aW5ndWlzaGVkIGFzIHRoZSBiYXNpYworICAgICAqIFZhbHZlIGZvciB0aGlzIFBpcGVsaW5lIChpZiBhbnkpLgorICAgICAqLworICAgIHB1YmxpYyBWYWx2ZSBnZXRCYXNpYygpOworCisKKyAgICAvKioKKyAgICAgKiA8cD5TZXQgdGhlIFZhbHZlIGluc3RhbmNlIHRoYXQgaGFzIGJlZW4gZGlzdGluZ3Vpc2hlZCBhcyB0aGUgYmFzaWMKKyAgICAgKiBWYWx2ZSBmb3IgdGhpcyBQaXBlbGluZSAoaWYgYW55KS4gIFByaW9lciB0byBzZXR0aW5nIHRoZSBiYXNpYyBWYWx2ZSwKKyAgICAgKiB0aGUgVmFsdmUncyA8Y29kZT5zZXRDb250YWluZXIoKTwvY29kZT4gd2lsbCBiZSBjYWxsZWQsIGlmIGl0CisgICAgICogaW1wbGVtZW50cyA8Y29kZT5Db250YWluZWQ8L2NvZGU+LCB3aXRoIHRoZSBvd25pbmcgQ29udGFpbmVyIGFzIGFuCisgICAgICogYXJndW1lbnQuICBUaGUgbWV0aG9kIG1heSB0aHJvdyBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+CisgICAgICogaWYgdGhpcyBWYWx2ZSBjaG9vc2VzIG5vdCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250YWluZXIsIG9yCisgICAgICogPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPiBpZiBpdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aAorICAgICAqIGEgZGlmZmVyZW50IENvbnRhaW5lci48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdmUgVmFsdmUgdG8gYmUgZGlzdGluZ3Vpc2hlZCBhcyB0aGUgYmFzaWMgVmFsdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNpYyhWYWx2ZSB2YWx2ZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiA8cD5BZGQgYSBuZXcgVmFsdmUgdG8gdGhlIGVuZCBvZiB0aGUgcGlwZWxpbmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiBDb250YWluZXIuICBQcmlvciB0byBhZGRpbmcgdGhlIFZhbHZlLCB0aGUgVmFsdmUncworICAgICAqIDxjb2RlPnNldENvbnRhaW5lcigpPC9jb2RlPiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQsIGlmIGl0IGltcGxlbWVudHMKKyAgICAgKiA8Y29kZT5Db250YWluZWQ8L2NvZGU+LCB3aXRoIHRoZSBvd25pbmcgQ29udGFpbmVyIGFzIGFuIGFyZ3VtZW50LgorICAgICAqIFRoZSBtZXRob2QgbWF5IHRocm93IGFuCisgICAgICogPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpZiB0aGlzIFZhbHZlIGNob29zZXMgbm90IHRvCisgICAgICogYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGFpbmVyLCBvciA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+CisgICAgICogaWYgaXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJlbnQgQ29udGFpbmVyLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx2ZSBWYWx2ZSB0byBiZSBhZGRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBDb250YWluZXIgcmVmdXNlZCB0bworICAgICAqICBhY2NlcHQgdGhlIHNwZWNpZmllZCBWYWx2ZQorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZSBWYWx2ZSByZWZ1c2VzIHRvIGJlCisgICAgICogIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbnRhaW5lcgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgVmFsdmUgaXMgYWxyZWFkeQorICAgICAqICBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJlbnQgQ29udGFpbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVmFsdmUoVmFsdmUgdmFsdmUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBWYWx2ZXMgaW4gdGhlIHBpcGVsaW5lIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgICogQ29udGFpbmVyLCBpbmNsdWRpbmcgdGhlIGJhc2ljIFZhbHZlIChpZiBhbnkpLiAgSWYgdGhlcmUgYXJlIG5vCisgICAgICogc3VjaCBWYWx2ZXMsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFZhbHZlW10gZ2V0VmFsdmVzKCk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIFZhbHZlIGZyb20gdGhlIHBpcGVsaW5lIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgICogQ29udGFpbmVyLCBpZiBpdCBpcyBmb3VuZDsgb3RoZXJ3aXNlLCBkbyBub3RoaW5nLiAgSWYgdGhlIFZhbHZlIGlzCisgICAgICogZm91bmQgYW5kIHJlbW92ZWQsIHRoZSBWYWx2ZSdzIDxjb2RlPnNldENvbnRhaW5lcihudWxsKTwvY29kZT4gbWV0aG9kCisgICAgICogd2lsbCBiZSBjYWxsZWQgaWYgaXQgaW1wbGVtZW50cyA8Y29kZT5Db250YWluZWQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHZlIFZhbHZlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVWYWx2ZShWYWx2ZSB2YWx2ZSk7CisKKworICAgIC8qKgorICAgICAqIDxwPlJldHVybiB0aGUgVmFsdmUgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBkaXN0aW5ndWlzaGVkIGFzIHRoZSBiYXNpYworICAgICAqIFZhbHZlIGZvciB0aGlzIFBpcGVsaW5lIChpZiBhbnkpLgorICAgICAqLworICAgIHB1YmxpYyBWYWx2ZSBnZXRGaXJzdCgpOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9SZWFsbS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1JlYWxtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1ZmEzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9SZWFsbS5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5TZWN1cml0eUNvbnN0cmFpbnQ7CisvKioKKyAqIEEgPGI+UmVhbG08L2I+IGlzIGEgcmVhZC1vbmx5IGZhY2FkZSBmb3IgYW4gdW5kZXJseWluZyBzZWN1cml0eSByZWFsbQorICogdXNlZCB0byBhdXRoZW50aWNhdGUgaW5kaXZpZHVhbCB1c2VycywgYW5kIGlkZW50aWZ5IHRoZSBzZWN1cml0eSByb2xlcworICogYXNzb2NpYXRlZCB3aXRoIHRob3NlIHVzZXJzLiAgUmVhbG1zIGNhbiBiZSBhdHRhY2hlZCBhdCBhbnkgQ29udGFpbmVyCisgKiBsZXZlbCwgYnV0IHdpbGwgdHlwaWNhbGx5IG9ubHkgYmUgYXR0YWNoZWQgdG8gYSBDb250ZXh0LCBvciBoaWdoZXIgbGV2ZWwsCisgKiBDb250YWluZXIuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgUmVhbG0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIFJlYWxtIGhhcyBiZWVuIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lciBnZXRDb250YWluZXIoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIFJlYWxtIGhhcyBiZWVuIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBhc3NvY2lhdGVkIENvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgY29udGFpbmVyKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUmVhbG0gaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgCisgICAgLyoqCisgICAgICogQWRkIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFByaW5jaXBhbCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCB1c2VybmFtZSBhbmQKKyAgICAgKiBjcmVkZW50aWFscywgaWYgdGhlcmUgaXMgb25lOyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lIG9mIHRoZSBQcmluY2lwYWwgdG8gbG9vayB1cAorICAgICAqIEBwYXJhbSBjcmVkZW50aWFscyBQYXNzd29yZCBvciBvdGhlciBjcmVkZW50aWFscyB0byB1c2UgaW4KKyAgICAgKiAgYXV0aGVudGljYXRpbmcgdGhpcyB1c2VybmFtZQorICAgICAqLworICAgIHB1YmxpYyBQcmluY2lwYWwgYXV0aGVudGljYXRlKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIGNyZWRlbnRpYWxzKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kCisgICAgICogY3JlZGVudGlhbHMsIGlmIHRoZXJlIGlzIG9uZTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSBvZiB0aGUgUHJpbmNpcGFsIHRvIGxvb2sgdXAKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgUGFzc3dvcmQgb3Igb3RoZXIgY3JlZGVudGlhbHMgdG8gdXNlIGluCisgICAgICogIGF1dGhlbnRpY2F0aW5nIHRoaXMgdXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbmNpcGFsIGF1dGhlbnRpY2F0ZShTdHJpbmcgdXNlcm5hbWUsIGJ5dGVbXSBjcmVkZW50aWFscyk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lLCB3aGljaAorICAgICAqIG1hdGNoZXMgdGhlIGRpZ2VzdCBjYWxjdWxhdGVkIHVzaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIHVzaW5nIHRoZQorICAgICAqIG1ldGhvZCBkZXNjcmliZWQgaW4gUkZDIDIwNjk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUgb2YgdGhlIFByaW5jaXBhbCB0byBsb29rIHVwCisgICAgICogQHBhcmFtIGRpZ2VzdCBEaWdlc3Qgd2hpY2ggaGFzIGJlZW4gc3VibWl0dGVkIGJ5IHRoZSBjbGllbnQKKyAgICAgKiBAcGFyYW0gbm9uY2UgVW5pcXVlIChvciBzdXBwb3NlZGx5IHVuaXF1ZSkgdG9rZW4gd2hpY2ggaGFzIGJlZW4gdXNlZAorICAgICAqIGZvciB0aGlzIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcmVhbG0gUmVhbG0gbmFtZQorICAgICAqIEBwYXJhbSBtZDVhMiBTZWNvbmQgTUQ1IGRpZ2VzdCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgZGlnZXN0IDoKKyAgICAgKiBNRDUoTWV0aG9kICsgIjoiICsgdXJpKQorICAgICAqLworICAgIHB1YmxpYyBQcmluY2lwYWwgYXV0aGVudGljYXRlKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIGRpZ2VzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm9uY2UsIFN0cmluZyBuYywgU3RyaW5nIGNub25jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcW9wLCBTdHJpbmcgcmVhbG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1kNWEyKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgY2hhaW4gb2YgWDUwOQorICAgICAqIGNsaWVudCBjZXJ0aWZpY2F0ZXMuICBJZiB0aGVyZSBpcyBub25lLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2VydHMgQXJyYXkgb2YgY2xpZW50IGNlcnRpZmljYXRlcywgd2l0aCB0aGUgZmlyc3Qgb25lIGluCisgICAgICogIHRoZSBhcnJheSBiZWluZyB0aGUgY2VydGlmaWNhdGUgb2YgdGhlIGNsaWVudCBpdHNlbGYuCisgICAgICovCisgICAgcHVibGljIFByaW5jaXBhbCBhdXRoZW50aWNhdGUoWDUwOUNlcnRpZmljYXRlIGNlcnRzW10pOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEV4ZWN1dGUgYSBwZXJpb2RpYyB0YXNrLCBzdWNoIGFzIHJlbG9hZGluZywgZXRjLiBUaGlzIG1ldGhvZCB3aWxsIGJlCisgICAgICogaW52b2tlZCBpbnNpZGUgdGhlIGNsYXNzbG9hZGluZyBjb250ZXh0IG9mIHRoaXMgY29udGFpbmVyLiBVbmV4cGVjdGVkCisgICAgICogdGhyb3dhYmxlcyB3aWxsIGJlIGNhdWdodCBhbmQgbG9nZ2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJhY2tncm91bmRQcm9jZXNzKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU2VjdXJpdHlDb25zdHJhaW50cyBjb25maWd1cmVkIHRvIGd1YXJkIHRoZSByZXF1ZXN0IFVSSSBmb3IKKyAgICAgKiB0aGlzIHJlcXVlc3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHN1Y2ggY29uc3RyYWludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VjdXJpdHlDb25zdHJhaW50IFtdIGZpbmRTZWN1cml0eUNvbnN0cmFpbnRzKFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0KTsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFjY2VzcyBjb250cm9sIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgYXV0aG9yaXphdGlvbiBjb25zdHJhaW50LgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnN0cmFpbnQgaXMgc2F0aXNmaWVkIGFuZCBwcm9jZXNzaW5nCisgICAgICogc2hvdWxkIGNvbnRpbnVlLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKiBAcGFyYW0gY29uc3RyYWludCBTZWN1cml0eSBjb25zdHJhaW50IHdlIGFyZSBlbmZvcmNpbmcKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0byB3aGljaCBjbGllbnQgb2YgdGhpcyBjbGFzcyBpcyBhdHRhY2hlZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1Jlc291cmNlUGVybWlzc2lvbihSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgW10gY29uc3RyYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgUHJpbmNpcGFsIGhhcyB0aGUgc3BlY2lmaWVkCisgICAgICogc2VjdXJpdHkgcm9sZSwgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoaXMgUmVhbG07IG90aGVyd2lzZSByZXR1cm4KKyAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJpbmNpcGFsIFByaW5jaXBhbCBmb3Igd2hvbSB0aGUgcm9sZSBpcyB0byBiZSBjaGVja2VkCisgICAgICogQHBhcmFtIHJvbGUgU2VjdXJpdHkgcm9sZSB0byBiZSBjaGVja2VkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzUm9sZShQcmluY2lwYWwgcHJpbmNpcGFsLCBTdHJpbmcgcm9sZSk7CisKKyAgICAgICAgLyoqCisgICAgICogRW5mb3JjZSBhbnkgdXNlciBkYXRhIGNvbnN0cmFpbnQgcmVxdWlyZWQgYnkgdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQKKyAgICAgKiBndWFyZGluZyB0aGlzIHJlcXVlc3QgVVJJLiAgUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY29uc3RyYWludAorICAgICAqIHdhcyBub3QgdmlvbGF0ZWQgYW5kIHByb2Nlc3Npbmcgc2hvdWxkIGNvbnRpbnVlLCBvciA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgKiBpZiB3ZSBoYXZlIGNyZWF0ZWQgYSByZXNwb25zZSBhbHJlYWR5LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKiBAcGFyYW0gY29uc3RyYWludCBTZWN1cml0eSBjb25zdHJhaW50IGJlaW5nIGNoZWNrZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1VzZXJEYXRhUGVybWlzc2lvbihSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgW11jb25zdHJhaW50KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1JvbGUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Sb2xlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkZDBhZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Sb2xlLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKKworCisvKioKKyAqIDxwPkFic3RyYWN0IHJlcHJlc2VudGF0aW9uIG9mIGEgc2VjdXJpdHkgcm9sZSwgc3VpdGFibGUgZm9yIHVzZSBpbgorICogZW52aXJvbm1lbnRzIGxpa2UgSkFBUyB0aGF0IHdhbnQgdG8gZGVhbCB3aXRoIDxjb2RlPlByaW5jaXBhbHM8L2NvZGU+LjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGludGVyZmFjZSBSb2xlIGV4dGVuZHMgUHJpbmNpcGFsIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyByb2xlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHJvbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIG5ldyBkZXNjcmlwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbik7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcm9sZSBuYW1lIG9mIHRoaXMgcm9sZSwgd2hpY2ggbXVzdCBiZSB1bmlxdWUKKyAgICAgKiB3aXRoaW4gdGhlIHNjb3BlIG9mIGEge0BsaW5rIFVzZXJEYXRhYmFzZX0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSb2xlbmFtZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJvbGUgbmFtZSBvZiB0aGlzIHJvbGUsIHdoaWNoIG11c3QgYmUgdW5pcXVlCisgICAgICogd2l0aGluIHRoZSBzY29wZSBvZiBhIHtAbGluayBVc2VyRGF0YWJhc2V9LgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGVuYW1lIFRoZSBuZXcgcm9sZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um9sZW5hbWUoU3RyaW5nIHJvbGVuYW1lKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgVXNlckRhdGFiYXNlfSB3aXRoaW4gd2hpY2ggdGhpcyBSb2xlIGlzIGRlZmluZWQuCisgICAgICovCisgICAgcHVibGljIFVzZXJEYXRhYmFzZSBnZXRVc2VyRGF0YWJhc2UoKTsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU2VydmVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE0ZjZmZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9TZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworCisvKioKKyAqIEEgPGNvZGU+U2VydmVyPC9jb2RlPiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGVudGlyZSBDYXRhbGluYQorICogc2VydmxldCBjb250YWluZXIuICBJdHMgYXR0cmlidXRlcyByZXByZXNlbnQgdGhlIGNoYXJhY3RlcmlzdGljcyBvZgorICogdGhlIHNlcnZsZXQgY29udGFpbmVyIGFzIGEgd2hvbGUuICBBIDxjb2RlPlNlcnZlcjwvY29kZT4gbWF5IGNvbnRhaW4KKyAqIG9uZSBvciBtb3JlIDxjb2RlPlNlcnZpY2VzPC9jb2RlPiwgYW5kIHRoZSB0b3AgbGV2ZWwgc2V0IG9mIG5hbWluZworICogcmVzb3VyY2VzLgorICogPHA+CisgKiBOb3JtYWxseSwgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2Ugd2lsbCBhbHNvIGltcGxlbWVudAorICogPGNvZGU+TGlmZWN5Y2xlPC9jb2RlPiwgc3VjaCB0aGF0IHdoZW4gdGhlIDxjb2RlPnN0YXJ0KCk8L2NvZGU+IGFuZAorICogPGNvZGU+c3RvcCgpPC9jb2RlPiBtZXRob2RzIGFyZSBjYWxsZWQsIGFsbCBvZiB0aGUgZGVmaW5lZAorICogPGNvZGU+U2VydmljZXM8L2NvZGU+IGFyZSBhbHNvIHN0YXJ0ZWQgb3Igc3RvcHBlZC4KKyAqIDxwPgorICogSW4gYmV0d2VlbiwgdGhlIGltcGxlbWVudGF0aW9uIG11c3Qgb3BlbiBhIHNlcnZlciBzb2NrZXQgb24gdGhlIHBvcnQgbnVtYmVyCisgKiBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnBvcnQ8L2NvZGU+IHByb3BlcnR5LiAgV2hlbiBhIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQsCisgKiB0aGUgZmlyc3QgbGluZSBpcyByZWFkIGFuZCBjb21wYXJlZCB3aXRoIHRoZSBzcGVjaWZpZWQgc2h1dGRvd24gY29tbWFuZC4KKyAqIElmIHRoZSBjb21tYW5kIG1hdGNoZXMsIHNodXRkb3duIG9mIHRoZSBzZXJ2ZXIgaXMgaW5pdGlhdGVkLgorICogPHA+CisgKiA8c3Ryb25nPk5PVEU8L3N0cm9uZz4gLSBUaGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcyBzaG91bGQKKyAqIHJlZ2lzdGVyIHRoZSAoc2luZ2xldG9uKSBpbnN0YW5jZSB3aXRoIHRoZSA8Y29kZT5TZXJ2ZXJGYWN0b3J5PC9jb2RlPgorICogY2xhc3MgaW4gaXRzIGNvbnN0cnVjdG9yKHMpLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBTZXJ2ZXIgaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZ2xvYmFsIG5hbWluZyByZXNvdXJjZXMuCisgICAgICovCisgICAgcHVibGljIE5hbWluZ1Jlc291cmNlcyBnZXRHbG9iYWxOYW1pbmdSZXNvdXJjZXMoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnbG9iYWwgbmFtaW5nIHJlc291cmNlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2xvYmFsTmFtaW5nUmVzb3VyY2VzIFRoZSBuZXcgZ2xvYmFsIG5hbWluZyByZXNvdXJjZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRHbG9iYWxOYW1pbmdSZXNvdXJjZXMKKyAgICAgICAgKE5hbWluZ1Jlc291cmNlcyBnbG9iYWxOYW1pbmdSZXNvdXJjZXMpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBvcnQgbnVtYmVyIHdlIGxpc3RlbiB0byBmb3Igc2h1dGRvd24gY29tbWFuZHMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQb3J0KCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcG9ydCBudW1iZXIgd2UgbGlzdGVuIHRvIGZvciBzaHV0ZG93biBjb21tYW5kcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3J0IFRoZSBuZXcgcG9ydCBudW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzaHV0ZG93biBjb21tYW5kIHN0cmluZyB3ZSBhcmUgd2FpdGluZyBmb3IuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTaHV0ZG93bigpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNodXRkb3duIGNvbW1hbmQgd2UgYXJlIHdhaXRpbmcgZm9yLgorICAgICAqCisgICAgICogQHBhcmFtIHNodXRkb3duIFRoZSBuZXcgc2h1dGRvd24gY29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNodXRkb3duKFN0cmluZyBzaHV0ZG93bik7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgU2VydmljZSB0byB0aGUgc2V0IG9mIGRlZmluZWQgU2VydmljZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgU2VydmljZSB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKTsKKworCisgICAgLyoqCisgICAgICogV2FpdCB1bnRpbCBhIHByb3BlciBzaHV0ZG93biBjb21tYW5kIGlzIHJlY2VpdmVkLCB0aGVuIHJldHVybi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhd2FpdCgpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBTZXJ2aWNlIChpZiBpdCBleGlzdHMpOyBvdGhlcndpc2UgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBTZXJ2aWNlIHRvIGJlIHJldHVybmVkCisgICAgICovCisgICAgcHVibGljIFNlcnZpY2UgZmluZFNlcnZpY2UoU3RyaW5nIG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBTZXJ2aWNlcyBkZWZpbmVkIHdpdGhpbiB0aGlzIFNlcnZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmljZVtdIGZpbmRTZXJ2aWNlcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBTZXJ2aWNlIGZyb20gdGhlIHNldCBhc3NvY2lhdGVkIGZyb20gdGhpcworICAgICAqIFNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBTZXJ2aWNlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSk7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgYSBwcmUtc3RhcnR1cCBpbml0aWFsaXphdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGFsbG93IGNvbm5lY3RvcnMKKyAgICAgKiB0byBiaW5kIHRvIHJlc3RyaWN0ZWQgcG9ydHMgdW5kZXIgVW5peCBvcGVyYXRpbmcgZW52aXJvbm1lbnRzLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gSWYgdGhpcyBzZXJ2ZXIgd2FzIGFscmVhZHkgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpCisgICAgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9TZXJ2ZXJGYWN0b3J5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU2VydmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMWUzOTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU2VydmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlcjsKKworCisvKioKKyAqIDxwPjxzdHJvbmc+U2VydmVyRmFjdG9yeTwvc3Ryb25nPiBhbGxvd3MgdGhlIHJlZ2lzdHJhdGlvbiBvZiB0aGUKKyAqIChzaW5nbGV0b24pIDxjb2RlPlNlcnZlcjwvY29kZT4gaW5zdGFuY2UgZm9yIHRoaXMgSlZNLCBzbyB0aGF0IGl0CisgKiBjYW4gYmUgYWNjZXNzZWQgaW5kZXBlbmRlbnRseSBvZiBhbnkgZXhpc3RpbmcgcmVmZXJlbmNlIHRvIHRoZQorICogY29tcG9uZW50IGhpZXJhcmNoeS4gIFRoaXMgaXMgaW1wb3J0YW50IGZvciBhZG1pbmlzdHJhdGlvbiB0b29scworICogdGhhdCBhcmUgYnVpbHQgYXJvdW5kIHRoZSBpbnRlcm5hbCBjb21wb25lbnQgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFNlcnZlckZhY3RvcnkgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YXRpYyBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHNpbmdsZXRvbiA8Y29kZT5TZXJ2ZXI8L2NvZGU+IGluc3RhbmNlIGZvciB0aGlzIEpWTS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTZXJ2ZXIgc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2luZ2xldG9uIDxjb2RlPlNlcnZlcjwvY29kZT4gaW5zdGFuY2UgZm9yIHRoaXMgSlZNLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2VydmVyIGdldFNlcnZlcigpIHsKKyAgICAgICAgaWYoIHNlcnZlcj09bnVsbCApCisgICAgICAgICAgICBzZXJ2ZXI9bmV3IFN0YW5kYXJkU2VydmVyKCk7CisgICAgICAgIHJldHVybiAoc2VydmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzaW5nbGV0b24gPGNvZGU+U2VydmVyPC9jb2RlPiBpbnN0YW5jZSBmb3IgdGhpcyBKVk0uICBUaGlzCisgICAgICogbWV0aG9kIG11c3QgPHN0cm9uZz5vbmx5PC9zdHJvbmc+IGJlIGNhbGxlZCBmcm9tIGEgY29uc3RydWN0b3Igb2YKKyAgICAgKiB0aGUgKHNpbmdsZXRvbikgPGNvZGU+U2VydmVyPC9jb2RlPiBpbnN0YW5jZSB0aGF0IGlzIGNyZWF0ZWQgZm9yCisgICAgICogdGhpcyBleGVjdXRpb24gb2YgQ2F0YWxpbmEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlU2VydmVyIFRoZSBuZXcgc2luZ2xldG9uIGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFNlcnZlcihTZXJ2ZXIgdGhlU2VydmVyKSB7CisKKyAgICAgICAgaWYgKHNlcnZlciA9PSBudWxsKQorICAgICAgICAgICAgc2VydmVyID0gdGhlU2VydmVyOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9TZXJ2aWNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZThkNmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5Db25uZWN0b3I7CisKKworLyoqCisgKiBBIDxzdHJvbmc+U2VydmljZTwvc3Ryb25nPiBpcyBhIGdyb3VwIG9mIG9uZSBvciBtb3JlCisgKiA8c3Ryb25nPkNvbm5lY3RvcnM8L3N0cm9uZz4gdGhhdCBzaGFyZSBhIHNpbmdsZSA8c3Ryb25nPkNvbnRhaW5lcjwvc3Ryb25nPgorICogdG8gcHJvY2VzcyB0aGVpciBpbmNvbWluZyByZXF1ZXN0cy4gIFRoaXMgYXJyYW5nZW1lbnQgYWxsb3dzLCBmb3IgZXhhbXBsZSwKKyAqIGEgbm9uLVNTTCBhbmQgU1NMIGNvbm5lY3RvciB0byBzaGFyZSB0aGUgc2FtZSBwb3B1bGF0aW9uIG9mIHdlYiBhcHBzLgorICogPHA+CisgKiBBIGdpdmVuIEpWTSBjYW4gY29udGFpbiBhbnkgbnVtYmVyIG9mIFNlcnZpY2UgaW5zdGFuY2VzOyBob3dldmVyLCB0aGV5IGFyZQorICogY29tcGxldGVseSBpbmRlcGVuZGVudCBvZiBlYWNoIG90aGVyIGFuZCBzaGFyZSBvbmx5IHRoZSBiYXNpYyBKVk0gZmFjaWxpdGllcworICogYW5kIGNsYXNzZXMgb24gdGhlIHN5c3RlbSBjbGFzcyBwYXRoLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5Db250YWluZXI8L2NvZGU+IHRoYXQgaGFuZGxlcyByZXF1ZXN0cyBmb3IgYWxsCisgICAgICogPGNvZGU+Q29ubmVjdG9yczwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPkNvbnRhaW5lcjwvY29kZT4gdGhhdCBoYW5kbGVzIHJlcXVlc3RzIGZvciBhbGwKKyAgICAgKiA8Y29kZT5Db25uZWN0b3JzPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgbmV3IENvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgY29udGFpbmVyKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgU2VydmljZSBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoaXMgU2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgc2VydmljZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgPGNvZGU+U2VydmVyPC9jb2RlPiB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkIChpZiBhbnkpLgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2ZXIgZ2V0U2VydmVyKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+U2VydmVyPC9jb2RlPiB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkIChpZiBhbnkpLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZlciBUaGUgc2VydmVyIHRoYXQgb3ducyB0aGlzIFNlcnZpY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXIoU2VydmVyIHNlcnZlcik7CisKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IENvbm5lY3RvciB0byB0aGUgc2V0IG9mIGRlZmluZWQgQ29ubmVjdG9ycywgYW5kIGFzc29jaWF0ZSBpdAorICAgICAqIHdpdGggdGhpcyBTZXJ2aWNlJ3MgQ29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3RvciBUaGUgQ29ubmVjdG9yIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29ubmVjdG9yKENvbm5lY3RvciBjb25uZWN0b3IpOworCisKKyAgICAvKioKKyAgICAgKiBGaW5kIGFuZCByZXR1cm4gdGhlIHNldCBvZiBDb25uZWN0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIENvbm5lY3RvcltdIGZpbmRDb25uZWN0b3JzKCk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIENvbm5lY3RvciBmcm9tIHRoZSBzZXQgYXNzb2NpYXRlZCBmcm9tIHRoaXMKKyAgICAgKiBTZXJ2aWNlLiAgVGhlIHJlbW92ZWQgQ29ubmVjdG9yIHdpbGwgYWxzbyBiZSBkaXNhc3NvY2lhdGVkIGZyb20gb3VyCisgICAgICogQ29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3RvciBUaGUgQ29ubmVjdG9yIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb25uZWN0b3IoQ29ubmVjdG9yIGNvbm5lY3Rvcik7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgYSBwcmUtc3RhcnR1cCBpbml0aWFsaXphdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGFsbG93IGNvbm5lY3RvcnMKKyAgICAgKiB0byBiaW5kIHRvIHJlc3RyaWN0ZWQgcG9ydHMgdW5kZXIgVW5peCBvcGVyYXRpbmcgZW52aXJvbm1lbnRzLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gSWYgdGhpcyBzZXJ2ZXIgd2FzIGFscmVhZHkgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpCisgICAgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1Nlc3Npb24uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9TZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEwMDg0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9TZXNzaW9uLmphdmEKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworCisKKy8qKgorICogQSA8Yj5TZXNzaW9uPC9iPiBpcyB0aGUgQ2F0YWxpbmEtaW50ZXJuYWwgZmFjYWRlIGZvciBhbgorICogPGNvZGU+SHR0cFNlc3Npb248L2NvZGU+IHRoYXQgaXMgdXNlZCB0byBtYWludGFpbiBzdGF0ZSBpbmZvcm1hdGlvbgorICogYmV0d2VlbiByZXF1ZXN0cyBmb3IgYSBwYXJ0aWN1bGFyIHVzZXIgb2YgYSB3ZWIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgU2Vzc2lvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hbmlmZXN0IENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBUaGUgU2Vzc2lvbkV2ZW50IGV2ZW50IHR5cGUgd2hlbiBhIHNlc3Npb24gaXMgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0NSRUFURURfRVZFTlQgPSAiY3JlYXRlU2Vzc2lvbiI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBTZXNzaW9uRXZlbnQgZXZlbnQgdHlwZSB3aGVuIGEgc2Vzc2lvbiBpcyBkZXN0cm95ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9ERVNUUk9ZRURfRVZFTlQgPSAiZGVzdHJveVNlc3Npb24iOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgU2Vzc2lvbkV2ZW50IGV2ZW50IHR5cGUgd2hlbiBhIHNlc3Npb24gaXMgYWN0aXZhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fQUNUSVZBVEVEX0VWRU5UID0gImFjdGl2YXRlU2Vzc2lvbiI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBTZXNzaW9uRXZlbnQgZXZlbnQgdHlwZSB3aGVuIGEgc2Vzc2lvbiBpcyBwYXNzaXZhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fUEFTU0lWQVRFRF9FVkVOVCA9ICJwYXNzaXZhdGVTZXNzaW9uIjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXV0aGVudGljYXRpb24gdHlwZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSBvdXIgY2FjaGVkCisgICAgICogUHJpbmNpcGFsLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRoVHlwZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgdXNlZCB0byBhdXRoZW50aWNhdGUgb3VyIGNhY2hlZAorICAgICAqIFByaW5jaXBhbCwgaWYgYW55LgorICAgICAqCisgICAgICogQHBhcmFtIGF1dGhUeXBlIFRoZSBuZXcgY2FjaGVkIGF1dGhlbnRpY2F0aW9uIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRoVHlwZShTdHJpbmcgYXV0aFR5cGUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNyZWF0aW9uIHRpbWUgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDcmVhdGlvblRpbWUoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjcmVhdGlvbiB0aW1lIGZvciB0aGlzIHNlc3Npb24uICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlCisgICAgICogTWFuYWdlciB3aGVuIGFuIGV4aXN0aW5nIFNlc3Npb24gaW5zdGFuY2UgaXMgcmV1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWUgVGhlIG5ldyBjcmVhdGlvbiB0aW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q3JlYXRpb25UaW1lKGxvbmcgdGltZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyIGZvciB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gaWRlbnRpZmllciBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWRJbnRlcm5hbCgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlc3Npb24gaWRlbnRpZmllciBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIFRoZSBuZXcgc2Vzc2lvbiBpZGVudGlmaWVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgU2Vzc2lvbiBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsYXN0IHRpbWUgdGhlIGNsaWVudCBzZW50IGEgcmVxdWVzdCBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIHNlc3Npb24sIGFzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0LCBKYW51YXJ5IDEsIDE5NzAKKyAgICAgKiBHTVQuICBBY3Rpb25zIHRoYXQgeW91ciBhcHBsaWNhdGlvbiB0YWtlcywgc3VjaCBhcyBnZXR0aW5nIG9yIHNldHRpbmcKKyAgICAgKiBhIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2Vzc2lvbiwgZG8gbm90IGFmZmVjdCB0aGUgYWNjZXNzIHRpbWUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TGFzdEFjY2Vzc2VkVGltZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsYXN0IGNsaWVudCBhY2Nlc3MgdGltZSB3aXRob3V0IGludmFsaWRhdGlvbiBjaGVjaworICAgICAqIEBzZWUgI2dldExhc3RBY2Nlc3NlZFRpbWUoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRMYXN0QWNjZXNzZWRUaW1lSW50ZXJuYWwoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTWFuYWdlciB3aXRoaW4gd2hpY2ggdGhpcyBTZXNzaW9uIGlzIHZhbGlkLgorICAgICAqLworICAgIHB1YmxpYyBNYW5hZ2VyIGdldE1hbmFnZXIoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBNYW5hZ2VyIHdpdGhpbiB3aGljaCB0aGlzIFNlc3Npb24gaXMgdmFsaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgbmV3IE1hbmFnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKE1hbmFnZXIgbWFuYWdlcik7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWF4aW11bSB0aW1lIGludGVydmFsLCBpbiBzZWNvbmRzLCBiZXR3ZWVuIGNsaWVudCByZXF1ZXN0cworICAgICAqIGJlZm9yZSB0aGUgc2VydmxldCBjb250YWluZXIgd2lsbCBpbnZhbGlkYXRlIHRoZSBzZXNzaW9uLiAgQSBuZWdhdGl2ZQorICAgICAqIHRpbWUgaW5kaWNhdGVzIHRoYXQgdGhlIHNlc3Npb24gc2hvdWxkIG5ldmVyIHRpbWUgb3V0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1heGltdW0gdGltZSBpbnRlcnZhbCwgaW4gc2Vjb25kcywgYmV0d2VlbiBjbGllbnQgcmVxdWVzdHMKKyAgICAgKiBiZWZvcmUgdGhlIHNlcnZsZXQgY29udGFpbmVyIHdpbGwgaW52YWxpZGF0ZSB0aGUgc2Vzc2lvbi4gIEEgbmVnYXRpdmUKKyAgICAgKiB0aW1lIGluZGljYXRlcyB0aGF0IHRoZSBzZXNzaW9uIHNob3VsZCBuZXZlciB0aW1lIG91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlcnZhbCBUaGUgbmV3IG1heGltdW0gaW50ZXJ2YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhJbmFjdGl2ZUludGVydmFsKGludCBpbnRlcnZhbCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+aXNOZXc8L2NvZGU+IGZsYWcgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpc05ldyBUaGUgbmV3IHZhbHVlIGZvciB0aGUgPGNvZGU+aXNOZXc8L2NvZGU+IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROZXcoYm9vbGVhbiBpc05ldyk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXV0aGVudGljYXRlZCBQcmluY2lwYWwgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXNzaW9uLgorICAgICAqIFRoaXMgcHJvdmlkZXMgYW4gPGNvZGU+QXV0aGVudGljYXRvcjwvY29kZT4gd2l0aCBhIG1lYW5zIHRvIGNhY2hlIGEKKyAgICAgKiBwcmV2aW91c2x5IGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFsLCBhbmQgYXZvaWQgcG90ZW50aWFsbHkgZXhwZW5zaXZlCisgICAgICogPGNvZGU+UmVhbG0uYXV0aGVudGljYXRlKCk8L2NvZGU+IGNhbGxzIG9uIGV2ZXJ5IHJlcXVlc3QuICBJZiB0aGVyZQorICAgICAqIGlzIG5vIGN1cnJlbnQgYXNzb2NpYXRlZCBQcmluY2lwYWwsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFByaW5jaXBhbCgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFsIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU2Vzc2lvbi4KKyAgICAgKiBUaGlzIHByb3ZpZGVzIGFuIDxjb2RlPkF1dGhlbnRpY2F0b3I8L2NvZGU+IHdpdGggYSBtZWFucyB0byBjYWNoZSBhCisgICAgICogcHJldmlvdXNseSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCwgYW5kIGF2b2lkIHBvdGVudGlhbGx5IGV4cGVuc2l2ZQorICAgICAqIDxjb2RlPlJlYWxtLmF1dGhlbnRpY2F0ZSgpPC9jb2RlPiBjYWxscyBvbiBldmVyeSByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHByaW5jaXBhbCBUaGUgbmV3IFByaW5jaXBhbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW5jaXBhbChQcmluY2lwYWwgcHJpbmNpcGFsKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5IdHRwU2Vzc2lvbjwvY29kZT4gZm9yIHdoaWNoIHRoaXMgb2JqZWN0CisgICAgICogaXMgdGhlIGZhY2FkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbigpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPmlzVmFsaWQ8L2NvZGU+IGZsYWcgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpc1ZhbGlkIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSA8Y29kZT5pc1ZhbGlkPC9jb2RlPiBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsaWQoYm9vbGVhbiBpc1ZhbGlkKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5pc1ZhbGlkPC9jb2RlPiBmbGFnIGZvciB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBhY2Nlc3NlZCB0aW1lIGluZm9ybWF0aW9uIGZvciB0aGlzIHNlc3Npb24uICBUaGlzIG1ldGhvZAorICAgICAqIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIGNvbnRleHQgd2hlbiBhIHJlcXVlc3QgY29tZXMgaW4gZm9yIGEgcGFydGljdWxhcgorICAgICAqIHNlc3Npb24sIGV2ZW4gaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHJlZmVyZW5jZSBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhY2Nlc3MoKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgc2Vzc2lvbiBldmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTZXNzaW9uTGlzdGVuZXIoU2Vzc2lvbkxpc3RlbmVyIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogRW5kIGFjY2VzcyB0byB0aGUgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRBY2Nlc3MoKTsKKworCisgICAgLyoqCisgICAgICogUGVyZm9ybSB0aGUgaW50ZXJuYWwgcHJvY2Vzc2luZyByZXF1aXJlZCB0byBpbnZhbGlkYXRlIHRoaXMgc2Vzc2lvbiwKKyAgICAgKiB3aXRob3V0IHRyaWdnZXJpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSBzZXNzaW9uIGhhcyBhbHJlYWR5IGV4cGlyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhwaXJlKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHRvIHRoZSBpbnRlcm5hbCBub3RlcworICAgICAqIGZvciB0aGlzIHNlc3Npb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggYmluZGluZyBleGlzdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBub3RlIHRvIGJlIHJldHVybmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXROb3RlKFN0cmluZyBuYW1lKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIEl0ZXJhdG9yIGNvbnRhaW5pbmcgdGhlIFN0cmluZyBuYW1lcyBvZiBhbGwgbm90ZXMgYmluZGluZ3MKKyAgICAgKiB0aGF0IGV4aXN0IGZvciB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGdldE5vdGVOYW1lcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIGFsbCBvYmplY3QgcmVmZXJlbmNlcywgYW5kIGluaXRpYWxpemUgaW5zdGFuY2UgdmFyaWFibGVzLCBpbgorICAgICAqIHByZXBhcmF0aW9uIGZvciByZXVzZSBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgb2JqZWN0IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiB0aGUgaW50ZXJuYWwgbm90ZXMKKyAgICAgKiBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgbm90ZSB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTm90ZShTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHNlc3Npb24gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTZXNzaW9uTGlzdGVuZXIoU2Vzc2lvbkxpc3RlbmVyIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogQmluZCBhbiBvYmplY3QgdG8gYSBzcGVjaWZpZWQgbmFtZSBpbiB0aGUgaW50ZXJuYWwgbm90ZXMgYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhpcyBzZXNzaW9uLCByZXBsYWNpbmcgYW55IGV4aXN0aW5nIGJpbmRpbmcgZm9yIHRoaXMgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgdG8gd2hpY2ggdGhlIG9iamVjdCBzaG91bGQgYmUgYm91bmQKKyAgICAgKiBAcGFyYW0gdmFsdWUgT2JqZWN0IHRvIGJlIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vdGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSk7CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1Nlc3Npb25FdmVudC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1Nlc3Npb25FdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZWVhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU2Vzc2lvbkV2ZW50LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworCisKKy8qKgorICogR2VuZXJhbCBldmVudCBmb3Igbm90aWZ5aW5nIGxpc3RlbmVycyBvZiBzaWduaWZpY2FudCBjaGFuZ2VzIG9uIGEgU2Vzc2lvbi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNlc3Npb25FdmVudAorICAgIGV4dGVuZHMgRXZlbnRPYmplY3QgeworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBkYXRhID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIFNlc3Npb24gb24gd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBldmVudCB0eXBlIHRoaXMgaW5zdGFuY2UgcmVwcmVzZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0eXBlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFNlc3Npb25FdmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uIFNlc3Npb24gb24gd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZAorICAgICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUKKyAgICAgKiBAcGFyYW0gZGF0YSBFdmVudCBkYXRhCisgICAgICovCisgICAgcHVibGljIFNlc3Npb25FdmVudChTZXNzaW9uIHNlc3Npb24sIFN0cmluZyB0eXBlLCBPYmplY3QgZGF0YSkgeworCisgICAgICAgIHN1cGVyKHNlc3Npb24pOworICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV2ZW50IGRhdGEgb2YgdGhpcyBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldERhdGEoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmRhdGEpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNlc3Npb24gb24gd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2Vzc2lvbiBnZXRTZXNzaW9uKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5zZXNzaW9uKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBldmVudCB0eXBlIG9mIHRoaXMgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy50eXBlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICByZXR1cm4gKCJTZXNzaW9uRXZlbnRbJyIgKyBnZXRTZXNzaW9uKCkgKyAiJywnIiArCisgICAgICAgICAgICAgICAgZ2V0VHlwZSgpICsgIiddIik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1Nlc3Npb25MaXN0ZW5lci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1Nlc3Npb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMjcyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU2Vzc2lvbkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKKworCisvKioKKyAqIEludGVyZmFjZSBkZWZpbmluZyBhIGxpc3RlbmVyIGZvciBzaWduaWZpY2FudCBTZXNzaW9uIGdlbmVyYXRlZCBldmVudHMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgU2Vzc2lvbkxpc3RlbmVyIHsKKworCisgICAgLyoqCisgICAgICogQWNrbm93bGVkZ2UgdGhlIG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBldmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBTZXNzaW9uRXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uRXZlbnQoU2Vzc2lvbkV2ZW50IGV2ZW50KTsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU3RvcmUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9TdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZGRhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU3RvcmUuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworCisvKioKKyAqIEEgPGI+U3RvcmU8L2I+IGlzIHRoZSBhYnN0cmFjdGlvbiBvZiBhIENhdGFsaW5hIGNvbXBvbmVudCB0aGF0IHByb3ZpZGVzCisgKiBwZXJzaXN0ZW50IHN0b3JhZ2UgYW5kIGxvYWRpbmcgb2YgU2Vzc2lvbnMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgdXNlciBkYXRhLgorICogSW1wbGVtZW50YXRpb25zIGFyZSBmcmVlIHRvIHNhdmUgYW5kIGxvYWQgdGhlIFNlc3Npb25zIHRvIGFueSBtZWRpYSB0aGV5CisgKiB3aXNoLCBidXQgaXQgaXMgYXNzdW1lZCB0aGF0IHNhdmVkIFNlc3Npb25zIGFyZSBwZXJzaXN0ZW50IGFjcm9zcworICogc2VydmVyIG9yIGNvbnRleHQgcmVzdGFydHMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgU3RvcmUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgU3RvcmUgaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTWFuYWdlciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBTdG9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFuYWdlciBnZXRNYW5hZ2VyKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgTWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBTdG9yZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBNYW5hZ2VyIHdoaWNoIHdpbGwgdXNlIHRoaXMgU3RvcmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlcihNYW5hZ2VyIG1hbmFnZXIpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBTZXNzaW9ucyBwcmVzZW50IGluIHRoaXMgU3RvcmUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNpemUoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBzZXNzaW9uIGlkZW50aWZpZXJzIG9mIGFsbCBTZXNzaW9ucworICAgICAqIGN1cnJlbnRseSBzYXZlZCBpbiB0aGlzIFN0b3JlLiAgSWYgdGhlcmUgYXJlIG5vIHN1Y2ggU2Vzc2lvbnMsIGEKKyAgICAgKiB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGtleXMoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIExvYWQgYW5kIHJldHVybiB0aGUgU2Vzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBzZXNzaW9uCisgICAgICogaWRlbnRpZmllciBmcm9tIHRoaXMgU3RvcmUsIHdpdGhvdXQgcmVtb3ZpbmcgaXQuICBJZiB0aGVyZSBpcyBubworICAgICAqIHN1Y2ggc3RvcmVkIFNlc3Npb24sIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCBTZXNzaW9uIGlkZW50aWZpZXIgb2YgdGhlIHNlc3Npb24gdG8gbG9hZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIGEgZGVzZXJpYWxpemF0aW9uIGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uIGxvYWQoU3RyaW5nIGlkKQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgU2Vzc2lvbiB3aXRoIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiBpZGVudGlmaWVyIGZyb20KKyAgICAgKiB0aGlzIFN0b3JlLCBpZiBwcmVzZW50LiAgSWYgbm8gc3VjaCBTZXNzaW9uIGlzIHByZXNlbnQsIHRoaXMgbWV0aG9kCisgICAgICogdGFrZXMgbm8gYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIFNlc3Npb24gaWRlbnRpZmllciBvZiB0aGUgU2Vzc2lvbiB0byBiZSByZW1vdmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGlkKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbGwgU2Vzc2lvbnMgZnJvbSB0aGlzIFN0b3JlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogU2F2ZSB0aGUgc3BlY2lmaWVkIFNlc3Npb24gaW50byB0aGlzIFN0b3JlLiAgQW55IHByZXZpb3VzbHkgc2F2ZWQKKyAgICAgKiBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgc2Vzc2lvbiBpZGVudGlmaWVyIGlzIHJlcGxhY2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiB0byBiZSBzYXZlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2F2ZShTZXNzaW9uIHNlc3Npb24pIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvVXNlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1VzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmM0OGJkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1VzZXIuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKworLyoqCisgKiA8cD5BYnN0cmFjdCByZXByZXNlbnRhdGlvbiBvZiBhIHVzZXIgaW4gYSB7QGxpbmsgVXNlckRhdGFiYXNlfS4gIEVhY2ggdXNlcgorICogaXMgb3B0aW9uYWxseSBhc3NvY2lhdGVkIHdpdGggYSBzZXQgb2Yge0BsaW5rIEdyb3VwfXMgdGhyb3VnaCB3aGljaCBoZSBvcgorICogc2hlIGluaGVyaXRzIGFkZGl0aW9uYWwgc2VjdXJpdHkgcm9sZXMsIGFuZCBpcyBvcHRpb25hbGx5IGFzc2lnbmVkIGEgc2V0CisgKiBvZiBzcGVjaWZpYyB7QGxpbmsgUm9sZX1zLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGludGVyZmFjZSBVc2VyIGV4dGVuZHMgUHJpbmNpcGFsIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgdXNlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmdWxsTmFtZSBUaGUgbmV3IGZ1bGwgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZ1bGxOYW1lKFN0cmluZyBmdWxsTmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIHtAbGluayBHcm91cH1zIHRvIHdoaWNoIHRoaXMgdXNlciBiZWxvbmdzLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRHcm91cHMoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2dvbiBwYXNzd29yZCBvZiB0aGlzIHVzZXIsIG9wdGlvbmFsbHkgcHJlZml4ZWQgd2l0aCB0aGUKKyAgICAgKiBpZGVudGlmaWVyIG9mIGFuIGVuY29kaW5nIHNjaGVtZSBzdXJyb3VuZGVkIGJ5IGN1cmx5IGJyYWNlcywgc3VjaCBhcworICAgICAqIDxjb2RlPnttZDV9eHh4eHg8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2dvbiBwYXNzd29yZCBvZiB0aGlzIHVzZXIsIG9wdGlvbmFsbHkgcHJlZml4ZWQgd2l0aCB0aGUKKyAgICAgKiBpZGVudGlmaWVyIG9mIGFuIGVuY29kaW5nIHNjaGVtZSBzdXJyb3VuZGVkIGJ5IGN1cmx5IGJyYWNlcywgc3VjaCBhcworICAgICAqIDxjb2RlPnttZDV9eHh4eHg8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHBhc3N3b3JkIFRoZSBuZXcgbG9nb24gcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiB7QGxpbmsgUm9sZX1zIGFzc2lnbmVkIHNwZWNpZmljYWxseSB0byB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGdldFJvbGVzKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUge0BsaW5rIFVzZXJEYXRhYmFzZX0gd2l0aGluIHdoaWNoIHRoaXMgVXNlciBpcyBkZWZpbmVkLgorICAgICAqLworICAgIHB1YmxpYyBVc2VyRGF0YWJhc2UgZ2V0VXNlckRhdGFiYXNlKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9nb24gdXNlcm5hbWUgb2YgdGhpcyB1c2VyLCB3aGljaCBtdXN0IGJlIHVuaXF1ZQorICAgICAqIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSB7QGxpbmsgVXNlckRhdGFiYXNlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9nb24gdXNlcm5hbWUgb2YgdGhpcyB1c2VyLCB3aGljaCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KKyAgICAgKiB0aGUgc2NvcGUgb2YgYSB7QGxpbmsgVXNlckRhdGFiYXNlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBUaGUgbmV3IGxvZ29uIHVzZXJuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlcm5hbWUoU3RyaW5nIHVzZXJuYW1lKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyB7QGxpbmsgR3JvdXB9IHRvIHRob3NlIHRoaXMgdXNlciBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHBhcmFtIGdyb3VwIFRoZSBuZXcgZ3JvdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRHcm91cChHcm91cCBncm91cCk7CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIHtAbGluayBSb2xlfSB0byB0aG9zZSBhc3NpZ25lZCBzcGVjaWZpY2FsbHkgdG8gdGhpcyB1c2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgVGhlIG5ldyByb2xlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUm9sZShSb2xlIHJvbGUpOworCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIHVzZXIgaW4gdGhlIHNwZWNpZmllZCB7QGxpbmsgR3JvdXB9PworICAgICAqCisgICAgICogQHBhcmFtIGdyb3VwIFRoZSBncm91cCB0byBjaGVjaworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSW5Hcm91cChHcm91cCBncm91cCk7CisKKworICAgIC8qKgorICAgICAqIElzIHRoaXMgdXNlciBzcGVjaWZpY2FsbHkgYXNzaWduZWQgdGhlIHNwZWNpZmllZCB7QGxpbmsgUm9sZX0/ICBUaGlzCisgICAgICogbWV0aG9kIGRvZXMgPHN0cm9uZz5OT1Q8L3N0cm9uZz4gY2hlY2sgZm9yIHJvbGVzIGluaGVyaXRlZCBiYXNlZCBvbgorICAgICAqIHtAbGluayBHcm91cH0gbWVtYmVyc2hpcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFRoZSByb2xlIHRvIGNoZWNrCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJblJvbGUoUm9sZSByb2xlKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEge0BsaW5rIEdyb3VwfSBmcm9tIHRob3NlIHRoaXMgdXNlciBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHBhcmFtIGdyb3VwIFRoZSBvbGQgZ3JvdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cChHcm91cCBncm91cCk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbGwge0BsaW5rIEdyb3VwfXMgZnJvbSB0aG9zZSB0aGlzIHVzZXIgYmVsb25ncyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cHMoKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEge0BsaW5rIFJvbGV9IGZyb20gdGhvc2UgYXNzaWduZWQgdG8gdGhpcyB1c2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgVGhlIG9sZCByb2xlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUm9sZShSb2xlIHJvbGUpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIHtAbGluayBSb2xlfXMgZnJvbSB0aG9zZSBhc3NpZ25lZCB0byB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUm9sZXMoKTsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvVXNlckRhdGFiYXNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvVXNlckRhdGFiYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYxYWM1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Vc2VyRGF0YWJhc2UuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKworLyoqCisgKiA8cD5BYnN0cmFjdCByZXByZXNlbnRhdGlvbiBvZiBhIGRhdGFiYXNlIG9mIHtAbGluayBVc2VyfXMgYW5kCisgKiB7QGxpbmsgR3JvdXB9cyB0aGF0IGNhbiBiZSBtYWludGFpbmVkIGJ5IGFuIGFwcGxpY2F0aW9uLAorICogYWxvbmcgd2l0aCBkZWZpbml0aW9ucyBvZiBjb3JyZXNwb25kaW5nIHtAbGluayBSb2xlfXMsIGFuZAorICogcmVmZXJlbmNlZCBieSBhIHtAbGluayBSZWFsbX0gZm9yIGF1dGhlbnRpY2F0aW9uIGFuZCBhY2Nlc3MgY29udHJvbC48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgVXNlckRhdGFiYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIHtAbGluayBHcm91cH1zIGRlZmluZWQgaW4gdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRHcm91cHMoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1bmlxdWUgZ2xvYmFsIGlkZW50aWZpZXIgb2YgdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIFJvbGV9cyBkZWZpbmVkIGluIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Um9sZXMoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIFVzZXJ9cyBkZWZpbmVkIGluIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0VXNlcnMoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEZpbmFsaXplIGFjY2VzcyB0byB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbnkgZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgY2xvc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcge0BsaW5rIEdyb3VwfSBkZWZpbmVkIGluIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cG5hbWUgVGhlIGdyb3VwIG5hbWUgb2YgdGhlIG5ldyBncm91cCAobXVzdCBiZSB1bmlxdWUpCisgICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGdyb3VwCisgICAgICovCisgICAgcHVibGljIEdyb3VwIGNyZWF0ZUdyb3VwKFN0cmluZyBncm91cG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbik7CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IHtAbGluayBSb2xlfSBkZWZpbmVkIGluIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlbmFtZSBUaGUgcm9sZSBuYW1lIG9mIHRoZSBuZXcgcm9sZSAobXVzdCBiZSB1bmlxdWUpCisgICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHJvbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgUm9sZSBjcmVhdGVSb2xlKFN0cmluZyByb2xlbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKTsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcge0BsaW5rIFVzZXJ9IGRlZmluZWQgaW4gdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFRoZSBsb2dvbiB1c2VybmFtZSBvZiB0aGUgbmV3IHVzZXIgKG11c3QgYmUgdW5pcXVlKQorICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgbG9nb24gcGFzc3dvcmQgb2YgdGhlIG5ldyB1c2VyCisgICAgICogQHBhcmFtIGZ1bGxOYW1lIFRoZSBmdWxsIG5hbWUgb2YgdGhlIG5ldyB1c2VyCisgICAgICovCisgICAgcHVibGljIFVzZXIgY3JlYXRlVXNlcihTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxsTmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUge0BsaW5rIEdyb3VwfSB3aXRoIHRoZSBzcGVjaWZpZWQgZ3JvdXAgbmFtZSwgaWYgYW55OworICAgICAqIG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXBuYW1lIE5hbWUgb2YgdGhlIGdyb3VwIHRvIHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBHcm91cCBmaW5kR3JvdXAoU3RyaW5nIGdyb3VwbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUge0BsaW5rIFJvbGV9IHdpdGggdGhlIHNwZWNpZmllZCByb2xlIG5hbWUsIGlmIGFueTsKKyAgICAgKiBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGVuYW1lIE5hbWUgb2YgdGhlIHJvbGUgdG8gcmV0dXJuCisgICAgICovCisgICAgcHVibGljIFJvbGUgZmluZFJvbGUoU3RyaW5nIHJvbGVuYW1lKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgVXNlcn0gd2l0aCB0aGUgc3BlY2lmaWVkIHVzZXIgbmFtZSwgaWYgYW55OworICAgICAqIG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgTmFtZSBvZiB0aGUgdXNlciB0byByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgVXNlciBmaW5kVXNlcihTdHJpbmcgdXNlcm5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGFjY2VzcyB0byB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbnkgZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgb3BlbmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCB7QGxpbmsgR3JvdXB9IGZyb20gdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGdyb3VwIFRoZSBncm91cCB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlR3JvdXAoR3JvdXAgZ3JvdXApOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCB7QGxpbmsgUm9sZX0gZnJvbSB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBUaGUgcm9sZSB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUm9sZShSb2xlIHJvbGUpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCB7QGxpbmsgVXNlcn0gZnJvbSB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlciBUaGUgdXNlciB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVXNlcihVc2VyIHVzZXIpOworCisKKyAgICAvKioKKyAgICAgKiBTYXZlIGFueSB1cGRhdGVkIGluZm9ybWF0aW9uIHRvIHRoZSBwZXJzaXN0ZW50IHN0b3JhZ2UgbG9jYXRpb24gZm9yCisgICAgICogdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW55IGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIHNhdmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgRXhjZXB0aW9uOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9WYWx2ZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1ZhbHZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwY2QyMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9WYWx2ZS5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKKworCisvKioKKyAqIDxwPkEgPGI+VmFsdmU8L2I+IGlzIGEgcmVxdWVzdCBwcm9jZXNzaW5nIGNvbXBvbmVudCBhc3NvY2lhdGVkIHdpdGggYQorICogcGFydGljdWxhciBDb250YWluZXIuICBBIHNlcmllcyBvZiBWYWx2ZXMgYXJlIGdlbmVyYWxseSBhc3NvY2lhdGVkIHdpdGgKKyAqIGVhY2ggb3RoZXIgaW50byBhIFBpcGVsaW5lLiAgVGhlIGRldGFpbGVkIGNvbnRyYWN0IGZvciBhIFZhbHZlIGlzIGluY2x1ZGVkCisgKiBpbiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIDxjb2RlPmludm9rZSgpPC9jb2RlPiBtZXRob2QgYmVsb3cuPC9wPgorICoKKyAqIDxiPkhJU1RPUklDQUwgTk9URTwvYj46ICBUaGUgIlZhbHZlIiBuYW1lIHdhcyBhc3NpZ25lZCB0byB0aGlzIGNvbmNlcHQKKyAqIGJlY2F1c2UgYSB2YWx2ZSBpcyB3aGF0IHlvdSB1c2UgaW4gYSByZWFsIHdvcmxkIHBpcGVsaW5lIHRvIGNvbnRyb2wgYW5kL29yCisgKiBtb2RpZnkgZmxvd3MgdGhyb3VnaCBpdC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgR3VubmFyIFJqbm5pbmcKKyAqIEBhdXRob3IgUGV0ZXIgRG9uYWxkCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgVmFsdmUgeworCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmV4dCBWYWx2ZSBpbiB0aGUgcGlwZWxpbmUgY29udGFpbmluZyB0aGlzIFZhbHZlLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIFZhbHZlIGdldE5leHQoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuZXh0IFZhbHZlIGluIHRoZSBwaXBlbGluZSBjb250YWluaW5nIHRoaXMgVmFsdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdmUgVGhlIG5ldyBuZXh0IHZhbHZlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmV4dChWYWx2ZSB2YWx2ZSk7CisKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIGEgcGVyaW9kaWMgdGFzaywgc3VjaCBhcyByZWxvYWRpbmcsIGV0Yy4gVGhpcyBtZXRob2Qgd2lsbCBiZQorICAgICAqIGludm9rZWQgaW5zaWRlIHRoZSBjbGFzc2xvYWRpbmcgY29udGV4dCBvZiB0aGlzIGNvbnRhaW5lci4gVW5leHBlY3RlZAorICAgICAqIHRocm93YWJsZXMgd2lsbCBiZSBjYXVnaHQgYW5kIGxvZ2dlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiYWNrZ3JvdW5kUHJvY2VzcygpOworCisKKyAgICAvKioKKyAgICAgKiA8cD5QZXJmb3JtIHJlcXVlc3QgcHJvY2Vzc2luZyBhcyByZXF1aXJlZCBieSB0aGlzIFZhbHZlLjwvcD4KKyAgICAgKgorICAgICAqIDxwPkFuIGluZGl2aWR1YWwgVmFsdmUgPGI+TUFZPC9iPiBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgYWN0aW9ucywgaW4KKyAgICAgKiB0aGUgc3BlY2lmaWVkIG9yZGVyOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPkV4YW1pbmUgYW5kL29yIG1vZGlmeSB0aGUgcHJvcGVydGllcyBvZiB0aGUgc3BlY2lmaWVkIFJlcXVlc3QgYW5kCisgICAgICogICAgIFJlc3BvbnNlLgorICAgICAqIDxsaT5FeGFtaW5lIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzcGVjaWZpZWQgUmVxdWVzdCwgY29tcGxldGVseSBnZW5lcmF0ZQorICAgICAqICAgICB0aGUgY29ycmVzcG9uZGluZyBSZXNwb25zZSwgYW5kIHJldHVybiBjb250cm9sIHRvIHRoZSBjYWxsZXIuCisgICAgICogPGxpPkV4YW1pbmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHNwZWNpZmllZCBSZXF1ZXN0IGFuZCBSZXNwb25zZSwgd3JhcAorICAgICAqICAgICBlaXRoZXIgb3IgYm90aCBvZiB0aGVzZSBvYmplY3RzIHRvIHN1cHBsZW1lbnQgdGhlaXIgZnVuY3Rpb25hbGl0eSwKKyAgICAgKiAgICAgYW5kIHBhc3MgdGhlbSBvbi4KKyAgICAgKiA8bGk+SWYgdGhlIGNvcnJlc3BvbmRpbmcgUmVzcG9uc2Ugd2FzIG5vdCBnZW5lcmF0ZWQgKGFuZCBjb250cm9sIHdhcyBub3QKKyAgICAgKiAgICAgcmV0dXJuZWQsIGNhbGwgdGhlIG5leHQgVmFsdmUgaW4gdGhlIHBpcGVsaW5lIChpZiB0aGVyZSBpcyBvbmUpIGJ5CisgICAgICogICAgIGV4ZWN1dGluZyA8Y29kZT5jb250ZXh0Lmludm9rZU5leHQoKTwvY29kZT4uCisgICAgICogPGxpPkV4YW1pbmUsIGJ1dCBub3QgbW9kaWZ5LCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcmVzdWx0aW5nIFJlc3BvbnNlCisgICAgICogICAgICh3aGljaCB3YXMgY3JlYXRlZCBieSBhIHN1YnNlcXVlbnRseSBpbnZva2VkIFZhbHZlIG9yIENvbnRhaW5lcikuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxwPkEgVmFsdmUgPGI+TVVTVCBOT1Q8L2I+IGRvIGFueSBvZiB0aGUgZm9sbG93aW5nIHRoaW5nczo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5DaGFuZ2UgcmVxdWVzdCBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gdXNlZCB0byBkaXJlY3QKKyAgICAgKiAgICAgdGhlIGZsb3cgb2YgcHJvY2Vzc2luZyBjb250cm9sIGZvciB0aGlzIHJlcXVlc3QgKGZvciBpbnN0YW5jZSwKKyAgICAgKiAgICAgdHJ5aW5nIHRvIGNoYW5nZSB0aGUgdmlydHVhbCBob3N0IHRvIHdoaWNoIGEgUmVxdWVzdCBzaG91bGQgYmUKKyAgICAgKiAgICAgc2VudCBmcm9tIGEgcGlwZWxpbmUgYXR0YWNoZWQgdG8gYSBIb3N0IG9yIENvbnRleHQgaW4gdGhlCisgICAgICogICAgIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uKS4KKyAgICAgKiA8bGk+Q3JlYXRlIGEgY29tcGxldGVkIFJlc3BvbnNlIDxzdHJvbmc+QU5EPC9zdHJvbmc+IHBhc3MgdGhpcworICAgICAqICAgICBSZXF1ZXN0IGFuZCBSZXNwb25zZSBvbiB0byB0aGUgbmV4dCBWYWx2ZSBpbiB0aGUgcGlwZWxpbmUuCisgICAgICogPGxpPkNvbnN1bWUgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmVxdWVzdCwKKyAgICAgKiAgICAgdW5sZXNzIGl0IGlzIGNvbXBsZXRlbHkgZ2VuZXJhdGluZyB0aGUgcmVzcG9uc2UsIG9yIHdyYXBwaW5nIHRoZQorICAgICAqICAgICByZXF1ZXN0IGJlZm9yZSBwYXNzaW5nIGl0IG9uLgorICAgICAqIDxsaT5Nb2RpZnkgdGhlIEhUVFAgaGVhZGVycyBpbmNsdWRlZCB3aXRoIHRoZSBSZXNwb25zZSBhZnRlciB0aGUKKyAgICAgKiAgICAgPGNvZGU+aW52b2tlTmV4dCgpPC9jb2RlPiBtZXRob2QgaGFzIHJldHVybmVkLgorICAgICAqIDxsaT5QZXJmb3JtIGFueSBhY3Rpb25zIG9uIHRoZSBvdXRwdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiAgICAgc3BlY2lmaWVkIFJlc3BvbnNlIGFmdGVyIHRoZSA8Y29kZT5pbnZva2VOZXh0KCk8L2NvZGU+IG1ldGhvZCBoYXMKKyAgICAgKiAgICAgcmV0dXJuZWQuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3QgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3Vycywgb3IgaXMgdGhyb3duCisgICAgICogIGJ5IGEgc3Vic2VxdWVudGx5IGludm9rZWQgVmFsdmUsIEZpbHRlciwgb3IgU2VydmxldAorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzLCBvciBpcyB0aHJvd24KKyAgICAgKiAgYnkgYSBzdWJzZXF1ZW50bHkgaW52b2tlZCBWYWx2ZSwgRmlsdGVyLCBvciBTZXJ2bGV0CisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52b2tlKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbjsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvV3JhcHBlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1dyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDUzMjk3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1dyYXBwZXIuamF2YQpAQCAtMCwwICsxLDMzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuVW5hdmFpbGFibGVFeGNlcHRpb247CisKKworLyoqCisgKiBBIDxiPldyYXBwZXI8L2I+IGlzIGEgQ29udGFpbmVyIHRoYXQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIHNlcnZsZXQKKyAqIGRlZmluaXRpb24gZnJvbSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uICBJdAorICogcHJvdmlkZXMgYSBjb252ZW5pZW50IG1lY2hhbmlzbSB0byB1c2UgSW50ZXJjZXB0b3JzIHRoYXQgc2VlIGV2ZXJ5IHNpbmdsZQorICogcmVxdWVzdCB0byB0aGUgc2VydmxldCByZXByZXNlbnRlZCBieSB0aGlzIGRlZmluaXRpb24uCisgKiA8cD4KKyAqIEltcGxlbWVudGF0aW9ucyBvZiBXcmFwcGVyIGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIHNlcnZsZXQgbGlmZQorICogY3ljbGUgZm9yIHRoZWlyIHVuZGVybHlpbmcgc2VydmxldCBjbGFzcywgaW5jbHVkaW5nIGNhbGxpbmcgaW5pdCgpIGFuZAorICogZGVzdHJveSgpIGF0IGFwcHJvcHJpYXRlIHRpbWVzLCBhcyB3ZWxsIGFzIHJlc3BlY3RpbmcgdGhlIGV4aXN0ZW5jZSBvZgorICogdGhlIFNpbmdsZVRocmVhZE1vZGVsIGRlY2xhcmF0aW9uIG9uIHRoZSBzZXJ2bGV0IGNsYXNzIGl0c2VsZi4KKyAqIDxwPgorICogVGhlIHBhcmVudCBDb250YWluZXIgYXR0YWNoZWQgdG8gYSBXcmFwcGVyIHdpbGwgZ2VuZXJhbGx5IGJlIGFuCisgKiBpbXBsZW1lbnRhdGlvbiBvZiBDb250ZXh0LCByZXByZXNlbnRpbmcgdGhlIHNlcnZsZXQgY29udGV4dCAoYW5kCisgKiB0aGVyZWZvcmUgdGhlIHdlYiBhcHBsaWNhdGlvbikgd2l0aGluIHdoaWNoIHRoaXMgc2VydmxldCBleGVjdXRlcy4KKyAqIDxwPgorICogQ2hpbGQgQ29udGFpbmVycyBhcmUgbm90IGFsbG93ZWQgb24gV3JhcHBlciBpbXBsZW1lbnRhdGlvbnMsIHNvIHRoZQorICogPGNvZGU+YWRkQ2hpbGQoKTwvY29kZT4gbWV0aG9kIHNob3VsZCB0aHJvdyBhbgorICogPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGludGVyZmFjZSBXcmFwcGVyIGV4dGVuZHMgQ29udGFpbmVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXZhaWxhYmxlIGRhdGUvdGltZSBmb3IgdGhpcyBzZXJ2bGV0LCBpbiBtaWxsaXNlY29uZHMgc2luY2UKKyAgICAgKiB0aGUgZXBvY2guICBJZiB0aGlzIGRhdGUvdGltZSBpcyBpbiB0aGUgZnV0dXJlLCBhbnkgcmVxdWVzdCBmb3IgdGhpcworICAgICAqIHNlcnZsZXQgd2lsbCByZXR1cm4gYW4gU0NfU0VSVklDRV9VTkFWQUlMQUJMRSBlcnJvci4gIElmIGl0IGlzIHplcm8sCisgICAgICogdGhlIHNlcnZsZXQgaXMgY3VycmVudGx5IGF2YWlsYWJsZS4gIEEgdmFsdWUgZXF1YWwgdG8gTG9uZy5NQVhfVkFMVUUKKyAgICAgKiBpcyBjb25zaWRlcmVkIHRvIG1lYW4gdGhhdCB1bmF2YWlsYWJpbGl0eSBpcyBwZXJtYW5lbnQuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0QXZhaWxhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXZhaWxhYmxlIGRhdGUvdGltZSBmb3IgdGhpcyBzZXJ2bGV0LCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlCisgICAgICogZXBvY2guICBJZiB0aGlzIGRhdGUvdGltZSBpcyBpbiB0aGUgZnV0dXJlLCBhbnkgcmVxdWVzdCBmb3IgdGhpcyBzZXJ2bGV0CisgICAgICogd2lsbCByZXR1cm4gYW4gU0NfU0VSVklDRV9VTkFWQUlMQUJMRSBlcnJvci4gIEEgdmFsdWUgZXF1YWwgdG8KKyAgICAgKiBMb25nLk1BWF9WQUxVRSBpcyBjb25zaWRlcmVkIHRvIG1lYW4gdGhhdCB1bmF2YWlsYWJpbGl0eSBpcyBwZXJtYW5lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXZhaWxhYmxlIFRoZSBuZXcgYXZhaWxhYmxlIGRhdGUvdGltZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF2YWlsYWJsZShsb25nIGF2YWlsYWJsZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29udGV4dC1yZWxhdGl2ZSBVUkkgb2YgdGhlIEpTUCBmaWxlIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRKc3BGaWxlKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29udGV4dC1yZWxhdGl2ZSBVUkkgb2YgdGhlIEpTUCBmaWxlIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ganNwRmlsZSBKU1AgZmlsZSBVUkkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKc3BGaWxlKFN0cmluZyBqc3BGaWxlKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2FkLW9uLXN0YXJ0dXAgb3JkZXIgdmFsdWUgKG5lZ2F0aXZlIHZhbHVlIG1lYW5zCisgICAgICogbG9hZCBvbiBmaXJzdCBjYWxsKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExvYWRPblN0YXJ0dXAoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2FkLW9uLXN0YXJ0dXAgb3JkZXIgdmFsdWUgKG5lZ2F0aXZlIHZhbHVlIG1lYW5zCisgICAgICogbG9hZCBvbiBmaXJzdCBjYWxsKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBOZXcgbG9hZC1vbi1zdGFydHVwIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9hZE9uU3RhcnR1cChpbnQgdmFsdWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJ1bi1hcyBpZGVudGl0eSBmb3IgdGhpcyBzZXJ2bGV0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UnVuQXMoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBydW4tYXMgaWRlbnRpdHkgZm9yIHRoaXMgc2VydmxldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW5BcyBOZXcgcnVuLWFzIGlkZW50aXR5IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UnVuQXMoU3RyaW5nIHJ1bkFzKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgc2VydmxldCBjbGFzcyBuYW1lIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0Q2xhc3MoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmdWxseSBxdWFsaWZpZWQgc2VydmxldCBjbGFzcyBuYW1lIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmxldENsYXNzIFNlcnZsZXQgY2xhc3MgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZsZXRDbGFzcyhTdHJpbmcgc2VydmxldENsYXNzKTsKKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmFtZXMgb2YgdGhlIG1ldGhvZHMgc3VwcG9ydGVkIGJ5IHRoZSB1bmRlcmx5aW5nIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHRoZSBzYW1lIHNldCBvZiBtZXRob2RzIGluY2x1ZGVkIGluIHRoZSBBbGxvdyByZXNwb25zZSBoZWFkZXIKKyAgICAgKiBpbiByZXNwb25zZSB0byBhbiBPUFRJT05TIHJlcXVlc3QgbWV0aG9kIHByb2Nlc3NlZCBieSB0aGUgdW5kZXJseWluZworICAgICAqIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFycmF5IG9mIG5hbWVzIG9mIHRoZSBtZXRob2RzIHN1cHBvcnRlZCBieSB0aGUgdW5kZXJseWluZworICAgICAqIHNlcnZsZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U2VydmxldE1ldGhvZHMoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogSXMgdGhpcyBzZXJ2bGV0IGN1cnJlbnRseSB1bmF2YWlsYWJsZT8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VuYXZhaWxhYmxlKCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgc2VydmxldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgZm9yIHRoaXMgc2VydmxldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhpcyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgdG8gYWRkCisgICAgICogQHBhcmFtIHZhbHVlIFZhbHVlIG9mIHRoaXMgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEluaXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBsaXN0ZW5lciBpbnRlcmVzdGVkIGluIEluc3RhbmNlRXZlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBuZXcgbGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRJbnN0YW5jZUxpc3RlbmVyKEluc3RhbmNlTGlzdGVuZXIgbGlzdGVuZXIpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBtYXBwaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgV3JhcHBlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbmV3IHdyYXBwZXIgbWFwcGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIG1hcHBpbmcpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgcmVjb3JkIHRvIHRoZSBzZXQgb2YgcmVjb3JkcyBmb3IKKyAgICAgKiB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBSb2xlIG5hbWUgdXNlZCB3aXRoaW4gdGhpcyBzZXJ2bGV0CisgICAgICogQHBhcmFtIGxpbmsgUm9sZSBuYW1lIHVzZWQgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTZWN1cml0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSwgU3RyaW5nIGxpbmspOworCisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhbiBpbml0aWFsaXplZCBpbnN0YW5jZSBvZiB0aGlzIFNlcnZsZXQgdGhhdCBpcyByZWFkeSB0byBoYXZlCisgICAgICogaXRzIDxjb2RlPnNlcnZpY2UoKTwvY29kZT4gbWV0aG9kIGNhbGxlZC4gIElmIHRoZSBzZXJ2bGV0IGNsYXNzIGRvZXMKKyAgICAgKiBub3QgaW1wbGVtZW50IDxjb2RlPlNpbmdsZVRocmVhZE1vZGVsPC9jb2RlPiwgdGhlIChvbmx5KSBpbml0aWFsaXplZAorICAgICAqIGluc3RhbmNlIG1heSBiZSByZXR1cm5lZCBpbW1lZGlhdGVseS4gIElmIHRoZSBzZXJ2bGV0IGNsYXNzIGltcGxlbWVudHMKKyAgICAgKiA8Y29kZT5TaW5nbGVUaHJlYWRNb2RlbDwvY29kZT4sIHRoZSBXcmFwcGVyIGltcGxlbWVudGF0aW9uIG11c3QgZW5zdXJlCisgICAgICogdGhhdCB0aGlzIGluc3RhbmNlIGlzIG5vdCBhbGxvY2F0ZWQgYWdhaW4gdW50aWwgaXQgaXMgZGVhbGxvY2F0ZWQgYnkgYQorICAgICAqIGNhbGwgdG8gPGNvZGU+ZGVhbGxvY2F0ZSgpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiB0aGUgc2VydmxldCBpbml0KCkgbWV0aG9kIHRocmV3CisgICAgICogIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIGxvYWRpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXQgYWxsb2NhdGUoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoaXMgcHJldmlvdXNseSBhbGxvY2F0ZWQgc2VydmxldCB0byB0aGUgcG9vbCBvZiBhdmFpbGFibGUKKyAgICAgKiBpbnN0YW5jZXMuICBJZiB0aGlzIHNlcnZsZXQgY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IFNpbmdsZVRocmVhZE1vZGVsLAorICAgICAqIG5vIGFjdGlvbiBpcyBhY3R1YWxseSByZXF1aXJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2bGV0IFRoZSBzZXJ2bGV0IHRvIGJlIHJldHVybmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBkZWFsbG9jYXRpb24gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVhbGxvY2F0ZShTZXJ2bGV0IHNlcnZsZXQpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBuYW1lLAorICAgICAqIGlmIGFueTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHJlcXVlc3RlZCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGZpbmRJbml0UGFyYW1ldGVyKFN0cmluZyBuYW1lKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgZGVmaW5lZCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGlzCisgICAgICogc2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZEluaXRQYXJhbWV0ZXJzKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWFwcGluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd3JhcHBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZE1hcHBpbmdzKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VjdXJpdHkgcm9sZSBsaW5rIGZvciB0aGUgc3BlY2lmaWVkIHNlY3VyaXR5IHJvbGUKKyAgICAgKiByZWZlcmVuY2UgbmFtZSwgaWYgYW55OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgU2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgdXNlZCB3aXRoaW4gdGhpcyBzZXJ2bGV0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaW5kU2VjdXJpdHlSZWZlcmVuY2UoU3RyaW5nIG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBuYW1lcyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIHNlcnZsZXQsIGlmIGFueTsgb3RoZXJ3aXNlIHJldHVybiBhIHplcm8tbGVuZ3RoIGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kU2VjdXJpdHlSZWZlcmVuY2VzKCk7CisKKworICAgIC8qKgorICAgICAqIEluY3JlbWVudCB0aGUgZXJyb3IgY291bnQgdmFsdWUgdXNlZCB3aGVuIG1vbml0b3JpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5jcmVtZW50RXJyb3JDb3VudCgpOworCisKKyAgICAvKioKKyAgICAgKiBMb2FkIGFuZCBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoaXMgc2VydmxldCwgaWYgdGhlcmUgaXMgbm90IGFscmVhZHkKKyAgICAgKiBhdCBsZWFzdCBvbmUgaW5pdGlhbGl6ZWQgaW5zdGFuY2UuICBUaGlzIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8KKyAgICAgKiBsb2FkIHNlcnZsZXRzIHRoYXQgYXJlIG1hcmtlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIGJlIGxvYWRlZAorICAgICAqIGF0IHNlcnZlciBzdGFydHVwIHRpbWUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgdGhlIHNlcnZsZXQgaW5pdCgpIG1ldGhvZCB0aHJldworICAgICAqICBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgc29tZSBvdGhlciBsb2FkaW5nIHByb2JsZW0gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZCgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgZnJvbSB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlSW5pdFBhcmFtZXRlcihTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpc3RlbmVyIG5vIGxvbmdlciBpbnRlcmVzdGVkIGluIEluc3RhbmNlRXZlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVJbnN0YW5jZUxpc3RlbmVyKEluc3RhbmNlTGlzdGVuZXIgbGlzdGVuZXIpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBtYXBwaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgd3JhcHBlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBwYXR0ZXJuIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1hcHBpbmcoU3RyaW5nIG1hcHBpbmcpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIGZvciB0aGUgc3BlY2lmaWVkIHJvbGUgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFNlY3VyaXR5IHJvbGUgdXNlZCB3aXRoaW4gdGhpcyBzZXJ2bGV0IHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTZWN1cml0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYW4gVW5hdmFpbGFibGVFeGNlcHRpb24sIG1hcmtpbmcgdGhpcyBzZXJ2bGV0IGFzIHVuYXZhaWxhYmxlCisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdW5hdmFpbGFibGUgVGhlIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkLCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqICB0byBtYXJrIHRoaXMgc2VydmxldCBhcyBwZXJtYW5lbnRseSB1bmF2YWlsYWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuYXZhaWxhYmxlKFVuYXZhaWxhYmxlRXhjZXB0aW9uIHVuYXZhaWxhYmxlKTsKKworCisgICAgLyoqCisgICAgICogVW5sb2FkIGFsbCBpbml0aWFsaXplZCBpbnN0YW5jZXMgb2YgdGhpcyBzZXJ2bGV0LCBhZnRlciBjYWxsaW5nIHRoZQorICAgICAqIDxjb2RlPmRlc3Ryb3koKTwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGluc3RhbmNlLiAgVGhpcyBjYW4gYmUgdXNlZCwKKyAgICAgKiBmb3IgZXhhbXBsZSwgcHJpb3IgdG8gc2h1dHRpbmcgZG93biB0aGUgZW50aXJlIHNlcnZsZXQgZW5naW5lLCBvcgorICAgICAqIHByaW9yIHRvIHJlbG9hZGluZyBhbGwgb2YgdGhlIGNsYXNzZXMgZnJvbSB0aGUgTG9hZGVyIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIG91ciBMb2FkZXIncyByZXBvc2l0b3J5LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGFuIHVubG9hZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmxvYWQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbjsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0Fic3RyYWN0Q2F0YWxpbmFUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0Fic3RyYWN0Q2F0YWxpbmFUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1NzljMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvQWJzdHJhY3RDYXRhbGluYVRhc2suamF2YQpAQCAtMCwwICsxLDI4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmFudDsKKworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkJhc2U2NDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisKKy8qKgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgQW50IHRhc2tzIHRoYXQgaW50ZXJhY3Qgd2l0aCB0aGUKKyAqIDxlbT5NYW5hZ2VyPC9lbT4gd2ViIGFwcGxpY2F0aW9uIGZvciBkeW5hbWljYWxseSBkZXBsb3lpbmcgYW5kCisgKiB1bmRlcGxveWluZyBhcHBsaWNhdGlvbnMuICBUaGVzZSB0YXNrcyByZXF1aXJlIEFudCAxLjQgb3IgbGF0ZXIuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENhdGFsaW5hVGFzayBleHRlbmRzIEJhc2VSZWRpcmVjdG9ySGVscGVyVGFzayB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBtYW5hZ2VyIHdlYmFwcCdzIGVuY29kaW5nLgorICAgICAqLyAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0hBUlNFVCA9ICJ1dGYtOCI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2hhcnNldCB1c2VkIGR1cmluZyBVUkwgZW5jb2RpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjaGFyc2V0ID0gIklTTy04ODU5LTEiOworCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyc2V0KCkgeworICAgICAgICByZXR1cm4gKHRoaXMuY2hhcnNldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hhcnNldChTdHJpbmcgY2hhcnNldCkgeworICAgICAgICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGxvZ2luIHBhc3N3b3JkIGZvciB0aGUgPGNvZGU+TWFuYWdlcjwvY29kZT4gYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucGFzc3dvcmQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgVVJMIG9mIHRoZSA8Y29kZT5NYW5hZ2VyPC9jb2RlPiBhcHBsaWNhdGlvbiB0byBiZSB1c2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyIjsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudXJsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIHVybCkgeworICAgICAgICB0aGlzLnVybCA9IHVybDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBsb2dpbiB1c2VybmFtZSBmb3IgdGhlIDxjb2RlPk1hbmFnZXI8L2NvZGU+IGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlcm5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnVzZXJuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VybmFtZShTdHJpbmcgdXNlcm5hbWUpIHsKKyAgICAgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLiAgVGhpcyBsb2dpYyBvbmx5IHBlcmZvcm1zIHRoZSBjb21tb24KKyAgICAgKiBhdHRyaWJ1dGUgdmFsaWRhdGlvbiByZXF1aXJlZCBieSBhbGwgc3ViY2xhc3NlczsgaXQgZG9lcyBub3QgcGVyZm9ybQorICAgICAqIGFueSBmdW5jdGlvbmFsIGxvZ2ljIGRpcmVjdGx5LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhIHZhbGlkYXRpb24gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCh1c2VybmFtZSA9PSBudWxsKSB8fCAocGFzc3dvcmQgPT0gbnVsbCkgfHwgKHVybCA9PSBudWxsKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJNdXN0IHNwZWNpZnkgYWxsIG9mICd1c2VybmFtZScsICdwYXNzd29yZCcsIGFuZCAndXJsJyIpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCwgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21tYW5kIENvbW1hbmQgdG8gYmUgZXhlY3V0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZShTdHJpbmcgY29tbWFuZCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBleGVjdXRlKGNvbW1hbmQsIG51bGwsIG51bGwsIC0xKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQsIGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIHByb3BlcnRpZXMuCisgICAgICogVGhlIGlucHV0IHN0cmVhbSB3aWxsIGJlIGNsb3NlZCB1cG9uIGNvbXBsZXRpb24gb2YgdGhpcyB0YXNrLCB3aGV0aGVyCisgICAgICogaXQgd2FzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSBvciBub3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWFuZCBDb21tYW5kIHRvIGJlIGV4ZWN1dGVkCisgICAgICogQHBhcmFtIGlzdHJlYW0gSW5wdXRTdHJlYW0gdG8gaW5jbHVkZSBpbiBhbiBIVFRQIFBVVCwgaWYgYW55CisgICAgICogQHBhcmFtIGNvbnRlbnRUeXBlIENvbnRlbnQgdHlwZSB0byBzcGVjaWZ5IGZvciB0aGUgaW5wdXQsIGlmIGFueQorICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIENvbnRlbnQgbGVuZ3RoIHRvIHNwZWNpZnkgZm9yIHRoZSBpbnB1dCwgaWYgYW55CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoU3RyaW5nIGNvbW1hbmQsIElucHV0U3RyZWFtIGlzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUsIGludCBjb250ZW50TGVuZ3RoKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIGNvbm5lY3Rpb24gZm9yIHRoaXMgY29tbWFuZAorICAgICAgICAgICAgY29ubiA9IChuZXcgVVJMKHVybCArIGNvbW1hbmQpKS5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24gaGNvbm4gPSAoSHR0cFVSTENvbm5lY3Rpb24pIGNvbm47CisKKyAgICAgICAgICAgIC8vIFNldCB1cCBzdGFuZGFyZCBjb25uZWN0aW9uIGNoYXJhY3RlcmlzdGljcworICAgICAgICAgICAgaGNvbm4uc2V0QWxsb3dVc2VySW50ZXJhY3Rpb24oZmFsc2UpOworICAgICAgICAgICAgaGNvbm4uc2V0RG9JbnB1dCh0cnVlKTsKKyAgICAgICAgICAgIGhjb25uLnNldFVzZUNhY2hlcyhmYWxzZSk7CisgICAgICAgICAgICBpZiAoaXN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGNvbm4uc2V0RG9PdXRwdXQodHJ1ZSk7CisgICAgICAgICAgICAgICAgaGNvbm4uc2V0UmVxdWVzdE1ldGhvZCgiUFVUIik7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LVR5cGUiLCBjb250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb250ZW50TGVuZ3RoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LUxlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiArIGNvbnRlbnRMZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGNvbm4uc2V0RG9PdXRwdXQoZmFsc2UpOworICAgICAgICAgICAgICAgIGhjb25uLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJVc2VyLUFnZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2F0YWxpbmEtQW50LVRhc2svMS4wIik7CisKKyAgICAgICAgICAgIC8vIFNldCB1cCBhbiBhdXRob3JpemF0aW9uIGhlYWRlciB3aXRoIG91ciBjcmVkZW50aWFscworICAgICAgICAgICAgU3RyaW5nIGlucHV0ID0gdXNlcm5hbWUgKyAiOiIgKyBwYXNzd29yZDsKKyAgICAgICAgICAgIFN0cmluZyBvdXRwdXQgPSBuZXcgU3RyaW5nKEJhc2U2NC5lbmNvZGUoaW5wdXQuZ2V0Qnl0ZXMoKSkpOworICAgICAgICAgICAgaGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJBdXRob3JpemF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFzaWMgIiArIG91dHB1dCk7CisKKyAgICAgICAgICAgIC8vIEVzdGFibGlzaCB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSBzZXJ2ZXIKKyAgICAgICAgICAgIGhjb25uLmNvbm5lY3QoKTsKKworICAgICAgICAgICAgLy8gU2VuZCB0aGUgcmVxdWVzdCBkYXRhIChpZiBhbnkpCisgICAgICAgICAgICBpZiAoaXN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gb3N0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShoY29ubi5nZXRPdXRwdXRTdHJlYW0oKSwgMTAyNCk7CisgICAgICAgICAgICAgICAgYnl0ZSBidWZmZXJbXSA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBuID0gaXN0cmVhbS5yZWFkKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3N0cmVhbS53cml0ZShidWZmZXIsIDAsIG4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvc3RyZWFtLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgb3N0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIGlzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUHJvY2VzcyB0aGUgcmVzcG9uc2UgbWVzc2FnZQorICAgICAgICAgICAgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGhjb25uLmdldElucHV0U3RyZWFtKCksIENIQVJTRVQpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBTdHJpbmcgZXJyb3IgPSBudWxsOworICAgICAgICAgICAgaW50IG1zZ1ByaW9yaXR5ID0gUHJvamVjdC5NU0dfSU5GTzsKKyAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgY2ggPSByZWFkZXIucmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChjaCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoY2ggPT0gJ1xyJykgfHwgKGNoID09ICdcbicpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGluIFdpbiBcclxuIHdvdWxkIGNhdXNlIGhhbmRsZU91dHB1dCgpIHRvIGJlIGNhbGxlZAorICAgICAgICAgICAgICAgICAgICAvLyB0d2ljZSwgdGhlIHNlY29uZCB0aW1lIHdpdGggYW4gZW1wdHkgc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAvLyBwcm9kdWNpbmcgYmxhbmsgbGluZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmYubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IGJ1ZmYudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYuc2V0TGVuZ3RoKDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lLnN0YXJ0c1dpdGgoIk9LIC0iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGxpbmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1ByaW9yaXR5ID0gUHJvamVjdC5NU0dfRVJSOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT3V0cHV0KGxpbmUsIG1zZ1ByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKChjaGFyKSBjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJ1ZmYubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlT3V0cHV0KGJ1ZmYudG9TdHJpbmcoKSwgbXNnUHJpb3JpdHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwgJiYgaXNGYWlsT25FcnJvcigpKSB7CisgICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gb25seSBpZiBmYWlsT25FcnJvciA9PSB0cnVlCisgICAgICAgICAgICAgICAgLy8gb3IgZXJyb3IgbGluZSB3aWxsIGJlIGxvZ2dlZCB0d2ljZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBpZiAoaXNGYWlsT25FcnJvcigpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVFcnJvck91dHB1dCh0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZVJlZGlyZWN0b3IoKTsKKyAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB1KSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHUpIHsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvQmFzZVJlZGlyZWN0b3JIZWxwZXJUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0Jhc2VSZWRpcmVjdG9ySGVscGVyVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYWIxMzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0Jhc2VSZWRpcmVjdG9ySGVscGVyVGFzay5qYXZhCkBAIC0wLDAgKzEsMzcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYW50OworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5SZWRpcmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZGlyZWN0b3JFbGVtZW50OworCisKKy8qKgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyB0byBhZGQgb3V0cHV0IHJlZGlyZWN0aW9uIHN1cHBvcnQgZm9yIENhdGFsaW5hCisgKiBBbnQgdGFza3MuIFRoZXNlIHRhc2tzIHJlcXVpcmUgQW50IDEuNSBvciBsYXRlci4KKyAqIDxicj4KKyAqIDxzdHJvbmc+V0FSTklORzo8L3N0cm9uZz4gZHVlIHRvIGRlcGVuZHMgY2hhaW4sIEFudCBjb3VsZCBjYWxsIGEgVGFzayAKKyAqIG1vcmUgdGhhbiBvbmNlIGFuZCB0aGlzIGNhbiBhZmZlY3QgdGhlIG91dHB1dCByZWRpcmVjdGlvbiB3aGVuIGNvbmZpZ3VyZWQuCisgKiBJZiB5b3UgYXJlIGNvbGxlY3RpbmcgdGhlIG91dHB1dCBpbiBhIHByb3BlcnR5LCBpdCB3aWxsIGNvbGxlY3QgdGhlIG91dHB1dAorICogb2Ygb25seSB0aGUgZmlyc3QgcnVuLCBzaW5jZSBBbnQgcHJvcGVydGllcyBhcmUgaW1tdXRhYmxlIGFuZCBvbmNlIGNyZWF0ZWQKKyAqIHRoZXkgY2Fubm90IGJlIGNoYW5nZWQuCisgKiA8YnI+CisgKiBJZiB5b3UgYXJlIGNvbGxlY3Rpbmcgb3V0cHV0IGluIGEgZmlsZSB0aGUgZmlsZSB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlCisgKiBvdXRwdXQgb2YgdGhlIGxhc3QgcnVuLCB1bmxlc3MgeW91IHNldCBhcHBlbmQ9InRydWUiLCBpbiB3aGljaCBjYXNlIGVhY2ggcnVuIAorICogd2lsbCBhcHBlbmQgaXQncyBvdXRwdXQgdG8gdGhlIGZpbGUuCisgKiAKKyAqCisgKiBAYXV0aG9yIEdhYnJpZWxlIEdhcnVnbGllcmkKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNS41CisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VSZWRpcmVjdG9ySGVscGVyVGFzayBleHRlbmRzIFRhc2sgeworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICAvKiogUmVkaXJlY3RvciBoZWxwZXIgKi8KKyAgICBwcm90ZWN0ZWQgUmVkaXJlY3RvciByZWRpcmVjdG9yID0gbmV3IFJlZGlyZWN0b3IodGhpcyk7CisgICAgLy9wcm90ZWN0ZWQgUmVkaXJlY3RvciByZWRpcmVjdG9yID0gbnVsbDsKKyAgICAvKiogUmVkaXJlY3RvciBlbGVtZW50IGZvciB0aGlzIHRhc2sgKi8KKyAgICBwcm90ZWN0ZWQgUmVkaXJlY3RvckVsZW1lbnQgcmVkaXJlY3RvckVsZW1lbnQgPSBudWxsOworICAgIC8qKiBUaGUgc3RyZWFtIGZvciBpbmZvIG91dHB1dCAqLworICAgIHByb3RlY3RlZCBPdXRwdXRTdHJlYW0gcmVkaXJlY3RPdXRTdHJlYW0gPSBudWxsOworICAgIC8qKiBUaGUgc3RyZWFtIGZvciBlcnJvciBvdXRwdXQgKi8KKyAgICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIHJlZGlyZWN0RXJyU3RyZWFtID0gbnVsbDsKKyAgICAvKiogVGhlIHByaW50IHN0cmVhbSBmb3IgaW5mbyBvdXRwdXQgKi8KKyAgICBQcmludFN0cmVhbSByZWRpcmVjdE91dFByaW50U3RyZWFtID0gbnVsbDsKKyAgICAvKiogVGhlIHByaW50IHN0cmVhbSBmb3IgZXJyb3Igb3V0cHV0ICovCisgICAgUHJpbnRTdHJlYW0gcmVkaXJlY3RFcnJQcmludFN0cmVhbSA9IG51bGw7CisgICAgICAgIAorICAgLyoqCisgICAgICogV2hldGhlciB0byBmYWlsICh3aXRoIGEgQnVpbGRFeGNlcHRpb24pIGlmCisgICAgICogTWFuYWdlclNlcnZsZXQgcmV0dXJucyBhbiBlcnJvci4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMKKyAgICAgKiB0byBkbyBzby4KKyAgICAgKiA8Yj4KKyAgICAgKiBUaGlzIGZsYWcgZG9lcyBub3QgY29udHJvbCBwYXJhbWV0ZXJzIGNoZWNraW5nLiBJZiB0aGUgdGFzayBpcyBjYWxsZWQKKyAgICAgKiB3aXRoIHdyb25nIG9yIGludmFsaWQgcGFyYW1ldGVycywgaXQgd2lsbCB0aHJvdyBCdWlsZEV4Y2VwdGlvbgorICAgICAqIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgc2V0dGluZyBvZiB0aGlzIGZsYWcuCisgICAgICovICAgIAorICAgIHByb3RlY3RlZCBib29sZWFuIGZhaWxPbkVycm9yID0gdHJ1ZTsKKyAgICAKKyAgICAvKiogCisgICAgICAqIDxjb2RlPnRydWU8L2NvZGU+IHRydWUgd2hlbiBvdXRwdXQgcmVkaXJlY3Rpb24gaXMgcmVxdWVzdGVkIGZvciB0aGlzIHRhc2sgLgorICAgICAgKiBEZWZhdWx0IGlzIHRvIGxvZyBvbiBBbnQgbG9nLgorICAgICAgKi8gICAgCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVkaXJlY3RPdXRwdXQgPSBmYWxzZTsKKyAKKyAgICAvKiogCisgICAgICAqIHdpbGwgYmUgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFJlZGlyZWN0b3IgaXMKKyAgICAgICogY29tcGxldGUuCisgICAgICAqLyAgICAKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWRpcmVjdG9yQ29uZmlndXJlZCA9IGZhbHNlOworCisgICAgLyoqIAorICAgICAqIEZsYWcgd2hpY2ggaW5kaWNhdGVzIHRoYXQsIGlmIHJlZGlyZWN0ZWQsIG91dHB1dCBzaG91bGQgYWxzbyBiZSAKKyAgICAgKiBhbHdheXMgc2VudCB0byB0aGUgbG9nLiBEZWZhdWx0IGlzIHRoYXQgb3RwdXQgaXMgc2VudCBvbmx5IHRvCisgICAgICogcmVkaXJlY3RlZCBzdHJlYW1zLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGFsd2F5c0xvZyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBmYWlsICh3aXRoIGEgQnVpbGRFeGNlcHRpb24pIGlmCisgICAgICogTWFuYWdlclNlcnZsZXQgcmV0dXJucyBhbiBlcnJvci4gIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzCisgICAgICogdG8gZG8gc28uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmFpbG9uZXJyb3IoYm9vbGVhbiBmYWlsKSB7CisgICAgICAgIGZhaWxPbkVycm9yID0gZmFpbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmFpbE9uRXJyb3IKKyAgICAgKiBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhaWxPbkVycm9yKCkgeworICAgICAgcmV0dXJuIGZhaWxPbkVycm9yOworICAgIH0KKyAgICAgICAgCisKKyAgICAvKioKKyAgICAgKiBGaWxlIHRoZSBvdXRwdXQgb2YgdGhlIHRhc2sgaXMgcmVkaXJlY3RlZCB0by4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXQgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoRmlsZSBvdXQpIHsKKyAgICAgICAgcmVkaXJlY3Rvci5zZXRPdXRwdXQob3V0KTsKKyAgICAgICAgcmVkaXJlY3RPdXRwdXQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbGUgdGhlIGVycm9yIG91dHB1dCBvZiB0aGUgdGFzayBpcyByZWRpcmVjdGVkIHRvLgorICAgICAqCisgICAgICogQHBhcmFtIGVycm9yIG5hbWUgb2YgdGhlIGVycm9yIGZpbGUKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yKEZpbGUgZXJyb3IpIHsKKyAgICAgICAgcmVkaXJlY3Rvci5zZXRFcnJvcihlcnJvcik7CisgICAgICAgIHJlZGlyZWN0T3V0cHV0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250cm9scyB3aGV0aGVyIGVycm9yIG91dHB1dCBpcyBsb2dnZWQuIFRoaXMgaXMgb25seSB1c2VmdWwKKyAgICAgKiB3aGVuIG91dHB1dCBpcyBiZWluZyByZWRpcmVjdGVkIGFuZCBlcnJvciBvdXRwdXQgaXMgZGVzaXJlZCBpbiB0aGUKKyAgICAgKiBBbnQgbG9nCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9nRXJyb3IgaWYgdHJ1ZSB0aGUgc3RhbmRhcmQgZXJyb3IgaXMgc2VudCB0byB0aGUgQW50IGxvZyBzeXN0ZW0KKyAgICAgKiAgICAgICAgYW5kIG5vdCBzZW50IHRvIG91dHB1dCBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9nRXJyb3IoYm9vbGVhbiBsb2dFcnJvcikgeworICAgICAgICByZWRpcmVjdG9yLnNldExvZ0Vycm9yKGxvZ0Vycm9yKTsKKyAgICAgICAgcmVkaXJlY3RPdXRwdXQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3BlcnR5IG5hbWUgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0aGUgb3V0cHV0IG9mCisgICAgICogdGhlIHRhc2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0UHJvcGVydHkgcHJvcGVydHkgbmFtZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0cHJvcGVydHkoU3RyaW5nIG91dHB1dFByb3BlcnR5KSB7CisgICAgICAgIHJlZGlyZWN0b3Iuc2V0T3V0cHV0UHJvcGVydHkob3V0cHV0UHJvcGVydHkpOworICAgICAgICByZWRpcmVjdE91dHB1dCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvcGVydHkgbmFtZSB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBlcnJvciBvZgorICAgICAqIHRoZSB0YXNrLi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvclByb3BlcnR5IHByb3BlcnR5IG5hbWUKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yUHJvcGVydHkoU3RyaW5nIGVycm9yUHJvcGVydHkpIHsKKyAgICAgICAgcmVkaXJlY3Rvci5zZXRFcnJvclByb3BlcnR5KGVycm9yUHJvcGVydHkpOworICAgICAgICByZWRpcmVjdE91dHB1dCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgYXBwZW5kIG91dHB1dCB0byBleGlzdGluZyBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcGVuZCBpZiB0cnVlLCBhcHBlbmQgb3V0cHV0IHRvIGV4aXN0aW5nIGZpbGUKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFwcGVuZChib29sZWFuIGFwcGVuZCkgeworICAgICAgICByZWRpcmVjdG9yLnNldEFwcGVuZChhcHBlbmQpOworICAgICAgICByZWRpcmVjdE91dHB1dCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgKGVycm9yIGFuZCBub24tZXJyb3IpIG91dHB1dCB3aWxsIGJlIHJlZGlyZWN0ZWQKKyAgICAgKiBhcyBzcGVjaWZpZWQgd2hpbGUgYmVpbmcgc2VudCB0byBBbnQncyBsb2dnaW5nIG1lY2hhbmlzbSBhcyBpZiBubworICAgICAqIHJlZGlyZWN0aW9uIGhhZCB0YWtlbiBwbGFjZS4gIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqIDxicj4KKyAgICAgKiBBY3R1YWxseSBoYW5kbGVkIGludGVybmFsbHksIHdpdGggQW50IDEuNi4zIGl0IHdpbGwgYmUgaGFuZGxlZCBieQorICAgICAqIHRoZSA8Y29kZT5SZWRpcmVjdG9yPC9jb2RlPiBpdHNlbGYuCisgICAgICogQHBhcmFtIGFsd2F5c0xvZyA8Y29kZT5ib29sZWFuPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFsd2F5c0xvZyhib29sZWFuIGFsd2F5c0xvZykgeworICAgICAgICB0aGlzLmFsd2F5c0xvZyA9IGFsd2F5c0xvZzsKKyAgICAgICAgLy9yZWRpcmVjdG9yLnNldEFsd2F5c0xvZyhhbHdheXNMb2cpOworICAgICAgICByZWRpcmVjdE91dHB1dCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBvdXRwdXQgYW5kIGVycm9yIGZpbGVzIHNob3VsZCBiZSBjcmVhdGVkIGV2ZW4gd2hlbiBlbXB0eS4KKyAgICAgKiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqIEBwYXJhbSBjcmVhdGVFbXB0eUZpbGVzIDxDT0RFPmJvb2xlYW48L0NPREU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENyZWF0ZUVtcHR5RmlsZXMoYm9vbGVhbiBjcmVhdGVFbXB0eUZpbGVzKSB7CisgICAgICAgIHJlZGlyZWN0b3Iuc2V0Q3JlYXRlRW1wdHlGaWxlcyhjcmVhdGVFbXB0eUZpbGVzKTsKKyAgICAgICAgcmVkaXJlY3RPdXRwdXQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIDxDT0RFPlJlZGlyZWN0b3JFbGVtZW50PC9DT0RFPiB0byB0aGlzIHRhc2suCisgICAgICogQHBhcmFtIHJlZGlyZWN0b3JFbGVtZW50ICAgPENPREU+UmVkaXJlY3RvckVsZW1lbnQ8L0NPREU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRSZWRpcmVjdG9yKFJlZGlyZWN0b3JFbGVtZW50IHJlZGlyZWN0b3JFbGVtZW50KSB7CisgICAgICAgIGlmICh0aGlzLnJlZGlyZWN0b3JFbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGhhdmUgPiAxIG5lc3RlZCA8cmVkaXJlY3Rvcj5zIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnJlZGlyZWN0b3JFbGVtZW50ID0gcmVkaXJlY3RvckVsZW1lbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgcHJvcGVydGllcyBvbiB0aGUgUmVkaXJlY3RvciBmcm9tIFJlZGlyZWN0b3JFbGVtZW50IGlmIHByZXNlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVJlZGlyZWN0b3IoKSB7CisgICAgICAgIGlmIChyZWRpcmVjdG9yRWxlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICByZWRpcmVjdG9yRWxlbWVudC5jb25maWd1cmUocmVkaXJlY3Rvcik7CisgICAgICAgICAgICByZWRpcmVjdE91dHB1dCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgICogRHVlIHRvIGRlcGVuZHMgY2hhaW4sIEFudCBjb3VsZCBjYWxsIHRoZSBUYXNrIG1vcmUgdGhhbiBvbmNlLAorICAgICAgICAgKiB0aGlzIGlzIHRvIHByZXZlbnQgdGhhdCB3ZSBhdHRlbXB0IHRvIGNvbmZpZ3VyZSB1c2VsZXNzbHkKKyAgICAgICAgICogbW9yZSB0aGFuIG9uY2UgdGhlIFJlZGlyZWN0b3IuCisgICAgICAgICAqLworICAgICAgICByZWRpcmVjdG9yQ29uZmlndXJlZCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHVwIHByb3BlcnRpZXMgb24gdGhlIFJlZGlyZWN0b3IgYW5kIGNyZWF0ZSBvdXRwdXQgc3RyZWFtcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBvcGVuUmVkaXJlY3RvcigpIHsKKyAgICAgICAgaWYgKCEgcmVkaXJlY3RvckNvbmZpZ3VyZWQpIHsKKyAgICAgICAgICAgIGNvbmZpZ3VyZVJlZGlyZWN0b3IoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVkaXJlY3RPdXRwdXQpIHsKKyAgICAgICAgICAgIHJlZGlyZWN0b3IuY3JlYXRlU3RyZWFtcygpOworICAgICAgICAgICAgcmVkaXJlY3RPdXRTdHJlYW0gPSByZWRpcmVjdG9yLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgcmVkaXJlY3RPdXRQcmludFN0cmVhbSA9IG5ldyBQcmludFN0cmVhbShyZWRpcmVjdE91dFN0cmVhbSk7CisgICAgICAgICAgICByZWRpcmVjdEVyclN0cmVhbSA9IHJlZGlyZWN0b3IuZ2V0RXJyb3JTdHJlYW0oKTsKKyAgICAgICAgICAgIHJlZGlyZWN0RXJyUHJpbnRTdHJlYW0gPSBuZXcgUHJpbnRTdHJlYW0ocmVkaXJlY3RFcnJTdHJlYW0pOworICAgICAgICB9CisgICB9CisKKyAgICAvKioKKyAgICAgKiBBc2sgcmVkaXJlY3RvciB0byBjbG9zZSBhbGwgdGhlIHN0cmVhbXMuIEl0IGlzIG5lY2Vzc2FyeSB0byBjYWxsIHRoaXMgbWV0aG9kCisgICAgICogYmVmb3JlIGxlYXZpbmcgdGhlIFRhc2sgdG8gaGF2ZSB0aGUgU3RyZWFtcyBmbHVzaCB0aGVpciBjb250ZW50cy4gSWYgeW91IGFyZSAKKyAgICAgKiBjb2xsZWN0aW5nIG91dHB1dCBpbiBhIHByb3BlcnR5LCBpdCB3aWxsIGJlIGNyZWF0ZWQgb25seSBpZiB0aGlzIG1ldGhvZCBpcworICAgICAqIGNhbGxlZCwgb3RoZXJ3aXNlIHlvdSdsbCBmaW5kIGl0IHVuc2V0LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlUmVkaXJlY3RvcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChyZWRpcmVjdE91dHB1dCkgeworICAgICAgICAgICAgICAgIHJlZGlyZWN0b3IuY29tcGxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBsb2coIkVycm9yIGNsb3NpbmcgcmVkaXJlY3RvcjogIgorICAgICAgICAgICAgICAgICsgaW9lLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICAgKiBEdWUgdG8gZGVwZW5kcyBjaGFpbiwgQW50IGNvdWxkIGNhbGwgdGhlIFRhc2sgbW9yZSB0aGFuIG9uY2UsCisgICAgICAgICAqIHRoaXMgaXMgdG8gcHJldmVudCB0aGF0IHdlIGF0dGVtcHQgdG8gcmV1c2UgdGhlIHByZXZpdW9zbHkgCisgICAgICAgICAqIGNsb3NlZCBTdHJlYW1zLgorICAgICAgICAgKi8KKyAgICAgICAgcmVkaXJlY3RPdXRTdHJlYW0gPSBudWxsOworICAgICAgICByZWRpcmVjdE91dFByaW50U3RyZWFtID0gbnVsbDsKKyAgICAgICAgcmVkaXJlY3RFcnJTdHJlYW0gPSBudWxsOworICAgICAgICByZWRpcmVjdEVyclByaW50U3RyZWFtID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSGFuZGxlcyBvdXRwdXQgd2l0aCB0aGUgSU5GTyBwcmlvcml0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRwdXQgVGhlIG91dHB1dCB0byBsb2cuIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlT3V0cHV0KFN0cmluZyBvdXRwdXQpIHsKKyAgICAgICAgaWYgKHJlZGlyZWN0T3V0cHV0KSB7CisgICAgICAgICAgICBpZiAocmVkaXJlY3RPdXRQcmludFN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3BlblJlZGlyZWN0b3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlZGlyZWN0T3V0UHJpbnRTdHJlYW0ucHJpbnRsbihvdXRwdXQpOworICAgICAgICAgICAgaWYgKGFsd2F5c0xvZykgeworICAgICAgICAgICAgICAgIGxvZyhvdXRwdXQsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgIGxvZyhvdXRwdXQsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlcyBvdXRwdXQgd2l0aCB0aGUgSU5GTyBwcmlvcml0eSBhbmQgZmx1c2hlcyB0aGUgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCBUaGUgb3V0cHV0IHRvIGxvZy4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUZsdXNoKFN0cmluZyBvdXRwdXQpIHsKKyAgICAgICAgaGFuZGxlT3V0cHV0KG91dHB1dCk7CisgICAgICAgIHJlZGlyZWN0T3V0UHJpbnRTdHJlYW0uZmx1c2goKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVzIGVycm9yIG91dHB1dCB3aXRoIHRoZSBFUlIgcHJpb3JpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBlcnJvciBvdXRwdXQgdG8gbG9nLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUVycm9yT3V0cHV0KFN0cmluZyBvdXRwdXQpIHsKKyAgICAgICAgaWYgKHJlZGlyZWN0T3V0cHV0KSB7CisgICAgICAgICAgICBpZiAocmVkaXJlY3RFcnJQcmludFN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3BlblJlZGlyZWN0b3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlZGlyZWN0RXJyUHJpbnRTdHJlYW0ucHJpbnRsbihvdXRwdXQpOworICAgICAgICAgICAgaWYgKGFsd2F5c0xvZykgeworICAgICAgICAgICAgICAgIGxvZyhvdXRwdXQsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgbG9nKG91dHB1dCwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZXMgZXJyb3Igb3V0cHV0IHdpdGggdGhlIEVSUiBwcmlvcml0eSBhbmQgZmx1c2hlcyB0aGUgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCBUaGUgZXJyb3Igb3V0cHV0IHRvIGxvZy4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUVycm9yRmx1c2goU3RyaW5nIG91dHB1dCkgeworICAgICAgICBoYW5kbGVFcnJvck91dHB1dChvdXRwdXQpOworICAgICAgICByZWRpcmVjdEVyclByaW50U3RyZWFtLmZsdXNoKCk7CisgICAgfQorICAKKyAgICAvKioKKyAgICAgKiBIYW5kbGVzIG91dHB1dCB3aXRoIEVSUiBwcmlvcml0eSB0byBlcnJvciBzdHJlYW0gYW5kIGFsbCBvdGhlcgorICAgICAqIHByaXRvcml0aWVzIHRvIG91dHB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgdG8gbG9nLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU91dHB1dChTdHJpbmcgb3V0cHV0LCBpbnQgcHJpb3JpdHkpIHsKKyAgICAgICAgaWYgKHByaW9yaXR5ID09IFByb2plY3QuTVNHX0VSUikgeworICAgICAgICAgICAgaGFuZGxlRXJyb3JPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhhbmRsZU91dHB1dChvdXRwdXQpOworICAgICAgICB9CisgICAgfQorICAKKyAgICAvKioKKyAgICAgKiBIYW5kbGVzIG91dHB1dCB3aXRoIEVSUiBwcmlvcml0eSB0byBlcnJvciBzdHJlYW0gYW5kIGFsbCBvdGhlcgorICAgICAqIHByaXRvcml0aWVzIHRvIG91dHB1dCBzdHJlYW0sIHRoZW4gZmx1c2hlcyB0aGUgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCBUaGUgb3V0cHV0IHRvIGxvZy4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGbHVzaChTdHJpbmcgb3V0cHV0LCBpbnQgcHJpb3JpdHkpIHsKKyAgICAgICAgaWYgKHByaW9yaXR5ID09IFByb2plY3QuTVNHX0VSUikgeworICAgICAgICAgICAgaGFuZGxlRXJyb3JGbHVzaChvdXRwdXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGFuZGxlRmx1c2gob3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9EZXBsb3lUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0RlcGxveVRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWIxMWVjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9EZXBsb3lUYXNrLmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hbnQ7CisKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKworLyoqCisgKiBBbnQgdGFzayB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPi9kZXBsb3k8L2NvZGU+IGNvbW1hbmQsIHN1cHBvcnRlZCBieQorICogdGhlIFRvbWNhdCBtYW5hZ2VyIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworcHVibGljIGNsYXNzIERlcGxveVRhc2sgZXh0ZW5kcyBBYnN0cmFjdENhdGFsaW5hVGFzayB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBVUkwgb2YgdGhlIGNvbnRleHQgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBpZiBhbnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb25maWcgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRDb25maWcoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5jb25maWcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZyhTdHJpbmcgY29uZmlnKSB7CisgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVVJMIG9mIHRoZSBzZXJ2ZXIgbG9jYWwgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgKFdBUikgZmlsZSAKKyAgICAgKiB0byBiZSBkZXBsb3llZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsV2FyID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxXYXIoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5sb2NhbFdhcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9jYWxXYXIoU3RyaW5nIGxvY2FsV2FyKSB7CisgICAgICAgIHRoaXMubG9jYWxXYXIgPSBsb2NhbFdhcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb250ZXh0IHBhdGggb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiB3ZSBhcmUgbWFuYWdpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXRoID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhdGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRhZyB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIHRvIGJlIGRlcGxveWVkIHdlYmFwcC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRhZyA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhZygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnRhZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGFnKFN0cmluZyB0YWcpIHsKKyAgICAgICAgdGhpcy50YWcgPSB0YWc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgZXhpc3Rpbmcgd2ViYXBwcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGUgPSBmYWxzZTsKKworICAgIHB1YmxpYyBib29sZWFuIGdldFVwZGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnVwZGF0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXBkYXRlKGJvb2xlYW4gdXBkYXRlKSB7CisgICAgICAgIHRoaXMudXBkYXRlID0gdXBkYXRlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVVJMIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSAoV0FSKSBmaWxlIHRvIGJlIGRlcGxveWVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgd2FyID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0V2FyKCkgeworICAgICAgICByZXR1cm4gKHRoaXMud2FyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXYXIoU3RyaW5nIHdhcikgeworICAgICAgICB0aGlzLndhciA9IHdhcjsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5leGVjdXRlKCk7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiTXVzdCBzcGVjaWZ5ICdwYXRoJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHdhciA9PSBudWxsKSAmJiAobG9jYWxXYXIgPT0gbnVsbCkgJiYgKGNvbmZpZyA9PSBudWxsKSAmJiAodGFnID09IG51bGwpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIk11c3Qgc3BlY2lmeSBlaXRoZXIgJ3dhcicsICdsb2NhbFdhcicsICdjb25maWcnLCBvciAndGFnJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEJ1aWxkaW5nIGFuIGlucHV0IHN0cmVhbSBvbiB0aGUgV0FSIHRvIHVwbG9hZCwgaWYgYW55CisgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gbnVsbDsKKyAgICAgICAgaW50IGNvbnRlbnRMZW5ndGggPSAtMTsKKyAgICAgICAgaWYgKHdhciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAod2FyLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh3YXIpOworICAgICAgICAgICAgICAgICAgICBVUkxDb25uZWN0aW9uIGNvbm4gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGVudExlbmd0aCA9IGNvbm4uZ2V0Q29udGVudExlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbm4uZ2V0SW5wdXRTdHJlYW0oKSwgMTAyNCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBGaWxlSW5wdXRTdHJlYW0od2FyKSwgMTAyNCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGVudFR5cGUgPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEJ1aWxkaW5nIFVSTAorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCIvZGVwbG95P3BhdGg9Iik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoVVJMRW5jb2Rlci5lbmNvZGUodGhpcy5wYXRoLCBnZXRDaGFyc2V0KCkpKTsKKyAgICAgICAgICAgIGlmICgod2FyID09IG51bGwpICYmIChjb25maWcgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiZjb25maWc9Iik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKFVSTEVuY29kZXIuZW5jb2RlKGNvbmZpZywgZ2V0Q2hhcnNldCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHdhciA9PSBudWxsKSAmJiAobG9jYWxXYXIgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiZ3YXI9Iik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKFVSTEVuY29kZXIuZW5jb2RlKGxvY2FsV2FyLCBnZXRDaGFyc2V0KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1cGRhdGUpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiZ1cGRhdGU9dHJ1ZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImdGFnPSIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChVUkxFbmNvZGVyLmVuY29kZSh0YWcsIGdldENoYXJzZXQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCAnY2hhcnNldCcgYXR0cmlidXRlOiAiICsgZ2V0Q2hhcnNldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGV4ZWN1dGUoc2IudG9TdHJpbmcoKSwgc3RyZWFtLCBjb250ZW50VHlwZSwgY29udGVudExlbmd0aCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9JbnN0YWxsVGFzay5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9JbnN0YWxsVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMTNjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0luc3RhbGxUYXNrLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hbnQ7CisKKworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworCisvKioKKyAqIEFudCB0YXNrIHRoYXQgaW1wbGVtZW50cyB0aGUgPGNvZGU+L2luc3RhbGw8L2NvZGU+IGNvbW1hbmQsIHN1cHBvcnRlZCBieSB0aGUKKyAqIFRvbWNhdCBtYW5hZ2VyIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IERlcGxveVRhc2sKKyAqLworcHVibGljIGNsYXNzIEluc3RhbGxUYXNrIGV4dGVuZHMgQWJzdHJhY3RDYXRhbGluYVRhc2sgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVVJMIG9mIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhpcyBhcHBsaWNhdGlvbiwgaWYgYW55LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29uZmlnID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuY29uZmlnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWcoU3RyaW5nIGNvbmZpZykgeworICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb250ZXh0IHBhdGggb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiB3ZSBhcmUgbWFuYWdpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXRoID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhdGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVSTCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgKFdBUikgZmlsZSwgb3IgdGhlIHVucGFja2VkIGRpcmVjdG9yeQorICAgICAqIGNvbnRhaW5pbmcgdGhpcyBhcHBsaWNhdGlvbiwgaWYgYW55LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgd2FyID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0V2FyKCkgeworICAgICAgICByZXR1cm4gKHRoaXMud2FyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXYXIoU3RyaW5nIHdhcikgeworICAgICAgICB0aGlzLndhciA9IHdhcjsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5leGVjdXRlKCk7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiTXVzdCBzcGVjaWZ5ICdwYXRoJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNvbmZpZyA9PSBudWxsKSAmJiAod2FyID09IG51bGwpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIk11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgb2YgJ2NvbmZpZycgYW5kICd3YXInIik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiL2luc3RhbGw/cGF0aD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKFVSTEVuY29kZXIuZW5jb2RlKHRoaXMucGF0aCkpOworICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiJmNvbmZpZz0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChVUkxFbmNvZGVyLmVuY29kZShjb25maWcpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2FyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiJndhcj0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChVUkxFbmNvZGVyLmVuY29kZSh3YXIpKTsKKyAgICAgICAgfQorICAgICAgICBleGVjdXRlKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvSktTdGF0dXNVcGRhdGVUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0pLU3RhdHVzVXBkYXRlVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZjVlMDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0pLU3RhdHVzVXBkYXRlVGFzay5qYXZhCkBAIC0wLDAgKzEsNDE2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmFudDsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogQW50IHRhc2sgdGhhdCBpbXBsZW1lbnRzIHRoZSA8Y29kZT4vc3RhdHVzPC9jb2RlPiBjb21tYW5kLCBzdXBwb3J0ZWQgYnkgdGhlCisgKiBtb2Rfamsgc3RhdHVzICgxLjIuOSkgYXBwbGljYXRpb24uCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIEBzaW5jZSA1LjUuOQorICovCitwdWJsaWMgY2xhc3MgSktTdGF0dXNVcGRhdGVUYXNrIGV4dGVuZHMgQWJzdHJhY3RDYXRhbGluYVRhc2sgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgd29ya2VyID0gImxiIjsKKworICAgIHByaXZhdGUgU3RyaW5nIHdvcmtlclR5cGUgPSAibGIiOworCisgICAgcHJpdmF0ZSBpbnQgaW50ZXJuYWxpZCA9IDA7CisKKyAgICBwcml2YXRlIEludGVnZXIgbGJSZXRyaWVzOworCisgICAgcHJpdmF0ZSBJbnRlZ2VyIGxiUmVjb3ZlcnRpbWU7CisKKyAgICBwcml2YXRlIEJvb2xlYW4gbGJTdGlja3lTZXNzaW9uID0gQm9vbGVhbi5UUlVFOworCisgICAgcHJpdmF0ZSBCb29sZWFuIGxiRm9yY2VTZXNzaW9uID0gQm9vbGVhbi5GQUxTRTsKKworICAgIHByaXZhdGUgSW50ZWdlciB3b3JrZXJMb2FkRmFjdG9yOworCisgICAgcHJpdmF0ZSBTdHJpbmcgd29ya2VyUmVkaXJlY3Q7CisKKyAgICBwcml2YXRlIFN0cmluZyB3b3JrZXJDbHVzdGVyRG9tYWluOworCisgICAgcHJpdmF0ZSBCb29sZWFuIHdvcmtlckRpc2FibGVkID0gQm9vbGVhbi5GQUxTRTsKKworICAgIHByaXZhdGUgQm9vbGVhbiB3b3JrZXJTdG9wcGVkID0gQm9vbGVhbi5GQUxTRTsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNMQk1vZGUgPSB0cnVlOworCisgICAgcHJpdmF0ZSBTdHJpbmcgd29ya2VyTGI7CisKKyAgICAvKioKKyAgICAgKiAgCisgICAgICovCisgICAgcHVibGljIEpLU3RhdHVzVXBkYXRlVGFzaygpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgc2V0VXJsKCJodHRwOi8vbG9jYWxob3N0L3N0YXR1cyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW50ZXJuYWxpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEludGVybmFsaWQoKSB7CisgICAgICAgIHJldHVybiBpbnRlcm5hbGlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBpbnRlcm5hbGlkCisgICAgICogICAgICAgICAgICBUaGUgaW50ZXJuYWxpZCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJuYWxpZChpbnQgaW50ZXJuYWxpZCkgeworICAgICAgICB0aGlzLmludGVybmFsaWQgPSBpbnRlcm5hbGlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGJGb3JjZVNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIEJvb2xlYW4gZ2V0TGJGb3JjZVNlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBsYkZvcmNlU2Vzc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbGJGb3JjZVNlc3Npb24KKyAgICAgKiAgICAgICAgICAgIFRoZSBsYkZvcmNlU2Vzc2lvbiB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGJGb3JjZVNlc3Npb24oQm9vbGVhbiBsYkZvcmNlU2Vzc2lvbikgeworICAgICAgICB0aGlzLmxiRm9yY2VTZXNzaW9uID0gbGJGb3JjZVNlc3Npb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsYlJlY292ZXJ0aW1lLgorICAgICAqLworICAgIHB1YmxpYyBJbnRlZ2VyIGdldExiUmVjb3ZlcnRpbWUoKSB7CisgICAgICAgIHJldHVybiBsYlJlY292ZXJ0aW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBsYlJlY292ZXJ0aW1lCisgICAgICogICAgICAgICAgICBUaGUgbGJSZWNvdmVydGltZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGJSZWNvdmVydGltZShJbnRlZ2VyIGxiUmVjb3ZlcnRpbWUpIHsKKyAgICAgICAgdGhpcy5sYlJlY292ZXJ0aW1lID0gbGJSZWNvdmVydGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxiUmV0cmllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW50ZWdlciBnZXRMYlJldHJpZXMoKSB7CisgICAgICAgIHJldHVybiBsYlJldHJpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGxiUmV0cmllcworICAgICAqICAgICAgICAgICAgVGhlIGxiUmV0cmllcyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGJSZXRyaWVzKEludGVnZXIgbGJSZXRyaWVzKSB7CisgICAgICAgIHRoaXMubGJSZXRyaWVzID0gbGJSZXRyaWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGJTdGlja3lTZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBCb29sZWFuIGdldExiU3RpY2t5U2Vzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGxiU3RpY2t5U2Vzc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbGJTdGlja3lTZXNzaW9uCisgICAgICogICAgICAgICAgICBUaGUgbGJTdGlja3lTZXNzaW9uIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYlN0aWNreVNlc3Npb24oQm9vbGVhbiBsYlN0aWNreVNlc3Npb24pIHsKKyAgICAgICAgdGhpcy5sYlN0aWNreVNlc3Npb24gPSBsYlN0aWNreVNlc3Npb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3b3JrZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRXb3JrZXIoKSB7CisgICAgICAgIHJldHVybiB3b3JrZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHdvcmtlcgorICAgICAqICAgICAgICAgICAgVGhlIHdvcmtlciB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V29ya2VyKFN0cmluZyB3b3JrZXIpIHsKKyAgICAgICAgdGhpcy53b3JrZXIgPSB3b3JrZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3b3JrZXJUeXBlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0V29ya2VyVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHdvcmtlclR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHdvcmtlclR5cGUKKyAgICAgKiAgICAgICAgICAgIFRoZSB3b3JrZXJUeXBlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXb3JrZXJUeXBlKFN0cmluZyB3b3JrZXJUeXBlKSB7CisgICAgICAgIHRoaXMud29ya2VyVHlwZSA9IHdvcmtlclR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3b3JrZXJMYi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFdvcmtlckxiKCkgeworICAgICAgICByZXR1cm4gd29ya2VyTGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHdvcmtlckxiCisgICAgICogICAgICAgICAgICBUaGUgd29ya2VyTGIgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdvcmtlckxiKFN0cmluZyB3b3JrZXJMYikgeworICAgICAgICB0aGlzLndvcmtlckxiID0gd29ya2VyTGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3b3JrZXJDbHVzdGVyRG9tYWluLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0V29ya2VyQ2x1c3RlckRvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIHdvcmtlckNsdXN0ZXJEb21haW47CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHdvcmtlckNsdXN0ZXJEb21haW4KKyAgICAgKiAgICAgICAgICAgIFRoZSB3b3JrZXJDbHVzdGVyRG9tYWluIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXb3JrZXJDbHVzdGVyRG9tYWluKFN0cmluZyB3b3JrZXJDbHVzdGVyRG9tYWluKSB7CisgICAgICAgIHRoaXMud29ya2VyQ2x1c3RlckRvbWFpbiA9IHdvcmtlckNsdXN0ZXJEb21haW47CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3b3JrZXJEaXNhYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQm9vbGVhbiBnZXRXb3JrZXJEaXNhYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIHdvcmtlckRpc2FibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB3b3JrZXJEaXNhYmxlZAorICAgICAqICAgICAgICAgICAgVGhlIHdvcmtlckRpc2FibGVkIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXb3JrZXJEaXNhYmxlZChCb29sZWFuIHdvcmtlckRpc2FibGVkKSB7CisgICAgICAgIHRoaXMud29ya2VyRGlzYWJsZWQgPSB3b3JrZXJEaXNhYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdvcmtlclN0b3BwZWQuCisgICAgICovCisgICAgcHVibGljIEJvb2xlYW4gZ2V0V29ya2VyU3RvcHBlZCgpIHsKKyAgICAgICAgcmV0dXJuIHdvcmtlclN0b3BwZWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSB3b3JrZXJTdG9wcGVkIFRoZSB3b3JrZXJTdG9wcGVkIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXb3JrZXJTdG9wcGVkKEJvb2xlYW4gd29ya2VyU3RvcHBlZCkgeworICAgICAgICB0aGlzLndvcmtlclN0b3BwZWQgPSB3b3JrZXJTdG9wcGVkOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdvcmtlckxvYWRGYWN0b3IuCisgICAgICovCisgICAgcHVibGljIEludGVnZXIgZ2V0V29ya2VyTG9hZEZhY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIHdvcmtlckxvYWRGYWN0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHdvcmtlckxvYWRGYWN0b3IKKyAgICAgKiAgICAgICAgICAgIFRoZSB3b3JrZXJMb2FkRmFjdG9yIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXb3JrZXJMb2FkRmFjdG9yKEludGVnZXIgd29ya2VyTG9hZEZhY3RvcikgeworICAgICAgICB0aGlzLndvcmtlckxvYWRGYWN0b3IgPSB3b3JrZXJMb2FkRmFjdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd29ya2VyUmVkaXJlY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRXb3JrZXJSZWRpcmVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHdvcmtlclJlZGlyZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB3b3JrZXJSZWRpcmVjdAorICAgICAqICAgICAgICAgICAgVGhlIHdvcmtlclJlZGlyZWN0IHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXb3JrZXJSZWRpcmVjdChTdHJpbmcgd29ya2VyUmVkaXJlY3QpIHsKKyAgICAgICAgdGhpcy53b3JrZXJSZWRpcmVjdCA9IHdvcmtlclJlZGlyZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKKyAgICAgICAgY2hlY2tQYXJhbWV0ZXIoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gY3JlYXRlTGluaygpOworICAgICAgICBleGVjdXRlKHNiLnRvU3RyaW5nKCksIG51bGwsIG51bGwsIC0xKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBKa1N0YXR1cyBsaW5rCisgICAgICogPHVsPgorICAgICAqIDxsaT48Yj5sb2FkIGJhbGFuY2UgZXhhbXBsZToKKyAgICAgKiA8L2I+aHR0cDovL2xvY2FsaG9zdC9zdGF0dXM/Y21kPXVwZGF0ZSZtaW1lPXR4dCZ3PWxiJmxmPWZhbHNlJmxzPXRydWU8L2xpPgorICAgICAqIDxsaT48Yj53b3JrZXIgZXhhbXBsZToKKyAgICAgKiA8L2I+aHR0cDovL2xvY2FsaG9zdC9zdGF0dXM/Y21kPXVwZGF0ZSZtaW1lPXR4dCZ3PW5vZGUxJmw9bGImd2Y9MSZ3ZD1mYWxzZSZ3cz1mYWxzZQorICAgICAqIDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGNyZWF0ZSBqa3N0YXR1cyBsaW5rCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgY3JlYXRlTGluaygpIHsKKyAgICAgICAgLy8gQnVpbGRpbmcgVVJMCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiP2NtZD11cGRhdGUmbWltZT10eHQiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiJnc9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoVVJMRW5jb2Rlci5lbmNvZGUod29ya2VyLCBnZXRDaGFyc2V0KCkpKTsKKworICAgICAgICAgICAgaWYgKGlzTEJNb2RlKSB7CisgICAgICAgICAgICAgICAgLy9odHRwOi8vbG9jYWxob3N0L3N0YXR1cz9jbWQ9dXBkYXRlJm1pbWU9dHh0Jnc9bGImbGY9ZmFsc2UmbHM9dHJ1ZQorICAgICAgICAgICAgICAgIGlmICgobGJSZXRyaWVzICE9IG51bGwpKSB7IC8vID4gMAorICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiZscj0iKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGxiUmV0cmllcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgobGJSZWNvdmVydGltZSAhPSBudWxsKSkgeyAvLyA+IDU5CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmx0PSIpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQobGJSZWNvdmVydGltZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgobGJTdGlja3lTZXNzaW9uICE9IG51bGwpKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmxzPSIpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQobGJTdGlja3lTZXNzaW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChsYkZvcmNlU2Vzc2lvbiAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiZsZj0iKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGxiRm9yY2VTZXNzaW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vaHR0cDovL2xvY2FsaG9zdC9zdGF0dXM/Y21kPXVwZGF0ZSZtaW1lPXR4dCZ3PW5vZGUxJmw9bGImd2Y9MSZ3ZD1mYWxzZSZ3cz1mYWxzZQorICAgICAgICAgICAgICAgIGlmICgod29ya2VyTGIgIT0gbnVsbCkpIHsgLy8gbXVzdCBiZSBjb25maWd1cmVkCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmw9Iik7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChVUkxFbmNvZGVyLmVuY29kZSh3b3JrZXJMYiwgZ2V0Q2hhcnNldCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgod29ya2VyTG9hZEZhY3RvciAhPSBudWxsKSkgeyAvLyA+PSAxCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJndmPSIpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQod29ya2VyTG9hZEZhY3Rvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgod29ya2VyRGlzYWJsZWQgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImd2Q9Iik7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh3b3JrZXJEaXNhYmxlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgod29ya2VyU3RvcHBlZCAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiZ3cz0iKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHdvcmtlclN0b3BwZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKHdvcmtlclJlZGlyZWN0ICE9IG51bGwpKSB7IC8vIG90aGVyIHdvcmtlciBjb25yZWN0ZSBsYidzCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJndyPSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKHdvcmtlckNsdXN0ZXJEb21haW4gIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImd2M9Iik7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChVUkxFbmNvZGVyLmVuY29kZSh3b3JrZXJDbHVzdGVyRG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENoYXJzZXQoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCAnY2hhcnNldCcgYXR0cmlidXRlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZ2V0Q2hhcnNldCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2I7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2hlY2sgY29ycmVjdCBsYiBhbmQgd29ya2VyIHBhcmFybWV0ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmFtZXRlcigpIHsKKyAgICAgICAgaWYgKHdvcmtlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk11c3Qgc3BlY2lmeSAnd29ya2VyJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod29ya2VyVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk11c3Qgc3BlY2lmeSAnd29ya2VyVHlwZScgYXR0cmlidXRlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCJsYiIuZXF1YWxzKHdvcmtlclR5cGUpKSB7CisgICAgICAgICAgICBpZiAobGJSZWNvdmVydGltZSA9PSBudWxsICYmIGxiUmV0cmllcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBhdCBhIGxiIHdvcmtlciBlaXRoZXIgJ2xiUmVjb3ZlcnRpbWUnIG9yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInbGJSZXRyaWVzJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYlN0aWNreVNlc3Npb24gPT0gbnVsbCB8fCBsYkZvcmNlU2Vzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJNdXN0IHNwZWNpZnkgYXQgYSBsYiB3b3JrZXIgZWl0aGVyIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiJ2xiU3RpY2t5U2Vzc2lvbicgYW5kICdsYkZvcmNlU2Vzc2lvbicgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVsbCAhPSBsYlJlY292ZXJ0aW1lICYmIDYwIDwgbGJSZWNvdmVydGltZS5pbnRWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAnbGJSZWNvdmVydGltZScgbXVzdCBiZSBncmVhdGVyIHRoYW4gNTkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudWxsICE9IGxiUmV0cmllcyAmJiAxIDwgbGJSZXRyaWVzLmludFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICdsYlJldHJpZXMnIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzTEJNb2RlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICgid29ya2VyIi5lcXVhbHMod29ya2VyVHlwZSkpIHsKKyAgICAgICAgICAgIGlmICh3b3JrZXJEaXNhYmxlZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBhdCBhIG5vZGUgd29ya2VyICd3b3JrZXJEaXNhYmxlZCcgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod29ya2VyU3RvcHBlZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBhdCBhIG5vZGUgd29ya2VyICd3b3JrZXJTdG9wcGVkJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3b3JrZXJMb2FkRmFjdG9yID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBhdCBhIG5vZGUgd29ya2VyICd3b3JrZXJMb2FkRmFjdG9yJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3b3JrZXJDbHVzdGVyRG9tYWluID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IGF0IGEgbm9kZSB3b3JrZXIgJ3dvcmtlckNsdXN0ZXJEb21haW4nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdvcmtlclJlZGlyZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IGF0IGEgbm9kZSB3b3JrZXIgJ3dvcmtlclJlZGlyZWN0JyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3b3JrZXJMYiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJNdXN0IHNwZWNpZnkgJ3dvcmtlckxiJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3b3JrZXJMb2FkRmFjdG9yLmludFZhbHVlKCkgPCAxKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAnd29ya2VyTG9hZEZhY3RvcicgbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsIDEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzTEJNb2RlID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJPbmx5ICdsYicgYW5kICd3b3JrZXInIHN1cHBvcnRlZCBhcyB3b3JrZXJUeXBlIGF0dHJpYnV0ZSIpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvSk1YR2V0VGFzay5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9KTVhHZXRUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY0YTdjMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvSk1YR2V0VGFzay5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hbnQ7CisKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisKKy8qKgorICogQW50IHRhc2sgdGhhdCBpbXBsZW1lbnRzIHRoZSBKTVggR2V0IGNvbW1hbmQgKDxjb2RlPi9qbXhwcm94eS8/Z2V0PC9jb2RlPikKKyAqIHN1cHBvcnRlZCBieSB0aGUgVG9tY2F0IG1hbmFnZXIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSk1YR2V0VGFzayBleHRlbmRzIEFic3RyYWN0Q2F0YWxpbmFUYXNrIHsKKworICAgIC8vIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIFRoZSBmdWxsIGJlYW4gbmFtZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYmVhbiAgICAgID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBhdHRyaWJ1dGUgeW91IHdpc2ggdG8gYWx0ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisKKyAgICAvLyBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIEdldCBtZXRob2QgZm9yIHRoZSBiZWFuIG5hbWUKKyAgICAgKiBAcmV0dXJuIEJlYW4gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmVhbiAoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJlYW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IG1ldGhvZCBmb3IgdGhlIGJlYW4gbmFtZQorICAgICAqIEBwYXJhbSBiZWFuIEJlYW4gbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJlYW4gKFN0cmluZyBiZWFuKSB7CisgICAgICAgIHRoaXMuYmVhbiA9IGJlYW47CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZSBuYW1lCisgICAgICogQHJldHVybiBBdHRyaWJ1dGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlICgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUgbmFtZQorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgQXR0cmlidXRlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUgKFN0cmluZyBhdHRyaWJ1dGUpIHsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKKyAgICAgICAgaWYgKGJlYW4gPT0gbnVsbCB8fCBhdHRyaWJ1dGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJNdXN0IHNwZWNpZnkgJ2JlYW4nIGFuZCAnYXR0cmlidXRlJyBhdHRyaWJ1dGVzIik7CisgICAgICAgIH0KKyAgICAgICAgbG9nKCJHZXR0aW5nIGF0dHJpYnV0ZSAiICsgYXR0cmlidXRlICsKKyAgICAgICAgICAgICAgICAiIGluIGJlYW4gIiArIGJlYW4gKTsgCisgICAgICAgIGV4ZWN1dGUoIi9qbXhwcm94eS8/Z2V0PSIgKyBiZWFuIAorICAgICAgICAgICAgICAgICsgIiZhdHQ9IiArIGF0dHJpYnV0ZSApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvSk1YUXVlcnlUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0pNWFF1ZXJ5VGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYjg5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0pNWFF1ZXJ5VGFzay5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hbnQ7CisKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisKKy8qKgorICogQW50IHRhc2sgdGhhdCBpbXBsZW1lbnRzIHRoZSBKTVggUXVlcnkgY29tbWFuZCAKKyAqICg8Y29kZT4vam14cHJveHkvP3FyeTwvY29kZT4pIHN1cHBvcnRlZCBieSB0aGUgVG9tY2F0IG1hbmFnZXIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBWaXZlayBDaG9wcmEKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEpNWFF1ZXJ5VGFzayBleHRlbmRzIEFic3RyYWN0Q2F0YWxpbmFUYXNrIHsKKworICAgIC8vIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIFRoZSBKTVggcXVlcnkgc3RyaW5nIAorICAgICAqIEBzZWUgI3NldFF1ZXJ5KFN0cmluZykKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHF1ZXJ5ICAgICAgPSBudWxsOworCisgICAgLy8gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgbWV0aG9kIGZvciB0aGUgSk1YIHF1ZXJ5IHN0cmluZworICAgICAqIEByZXR1cm4gUXVlcnkgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeSAoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBtZXRob2QgZm9yIHRoZSBKTVggcXVlcnkgc3RyaW5nLgorICAgICogPFA+RXhhbXBsZXMgb2YgcXVlcnkgZm9ybWF0OgorICAgICAqIDxVTD4KKyAgICAgKiA8TEk+KjoqPC9MST4KKyAgICAgKiA8TEk+Kjp0eXBlPVJlcXVlc3RQcm9jZXNzb3IsKjwvTEk+CisgICAgICogPExJPio6ajJlZVR5cGU9U2VydmxldCwqPC9MST4KKyAgICAgKiA8TEk+Q2F0YWxpbmE6dHlwZT1FbnZpcm9ubWVudCxyZXNvdXJjZXR5cGU9R2xvYmFsLG5hbWU9c2ltcGxlVmFsdWU8L0xJPgorICAgICAqIDwvVUw+CisgICAgICogPC9QPiAKKyAgICAgKiBAcGFyYW0gcXVlcnkgSk1YIFF1ZXJ5IHN0cmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5IChTdHJpbmcgcXVlcnkpIHsKKyAgICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBzdXBlci5leGVjdXRlKCk7CisgICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IChxdWVyeSA9PSBudWxsKSA/ICIiOigiP3FyeT0iK3F1ZXJ5KTsKKyAgICAgICAgbG9nKCJRdWVyeSBzdHJpbmcgaXMgIiArIHF1ZXJ5U3RyaW5nKTsgCisgICAgICAgIGV4ZWN1dGUgKCIvam14cHJveHkvIiArIHF1ZXJ5U3RyaW5nKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0pNWFNldFRhc2suamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvSk1YU2V0VGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYWI0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0pNWFNldFRhc2suamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmFudDsKKworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKworLyoqCisgKiBBbnQgdGFzayB0aGF0IGltcGxlbWVudHMgdGhlIEpNWCBTZXQgY29tbWFuZCAoPGNvZGU+L2pteHByb3h5Lz9zZXQ8L2NvZGU+KQorICogc3VwcG9ydGVkIGJ5IHRoZSBUb21jYXQgbWFuYWdlciBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIENob3ByYQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSk1YU2V0VGFzayBleHRlbmRzIEFic3RyYWN0Q2F0YWxpbmFUYXNrIHsKKworICAgIC8vIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIFRoZSBmdWxsIGJlYW4gbmFtZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYmVhbiAgICAgID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBhdHRyaWJ1dGUgeW91IHdpc2ggdG8gYWx0ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmV3IHZhbHVlIGZvciB0aGUgYXR0cmlidXRlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSAgICAgPSBudWxsOworCisgICAgLy8gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgbWV0aG9kIGZvciB0aGUgYmVhbiBuYW1lCisgICAgICogQHJldHVybiBCZWFuIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEJlYW4gKCkgeworICAgICAgICByZXR1cm4gdGhpcy5iZWFuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBtZXRob2QgZm9yIHRoZSBiZWFuIG5hbWUKKyAgICAgKiBAcGFyYW0gYmVhbiBCZWFuIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCZWFuIChTdHJpbmcgYmVhbikgeworICAgICAgICB0aGlzLmJlYW4gPSBiZWFuOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUgbmFtZQorICAgICAqIEByZXR1cm4gQXR0cmlidXRlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZSAoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlIG5hbWUKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlIEF0dHJpYnV0ZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlIChTdHJpbmcgYXR0cmlidXRlKSB7CisgICAgICAgIHRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUgdmFsdWUKKyAgICAgKiBAcmV0dXJuIEF0dHJpYnV0ZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUgKCkgeworICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlIHZhbHVlLgorICAgICAqIEBwYXJhbSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZSAoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOworICAgICAgICBpZiAoYmVhbiA9PSBudWxsIHx8IGF0dHJpYnV0ZSA9PSBudWxsIHx8IHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiTXVzdCBzcGVjaWZ5ICdiZWFuJywgJ2F0dHJpYnV0ZScgYW5kICd2YWx1ZScgYXR0cmlidXRlcyIpOworICAgICAgICB9CisgICAgICAgIGxvZygiU2V0dGluZyBhdHRyaWJ1dGUgIiArIGF0dHJpYnV0ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiBiZWFuICIgKyBiZWFuICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRvICIgKyB2YWx1ZSk7IAorICAgICAgICBleGVjdXRlKCIvam14cHJveHkvP3NldD0iICsgYmVhbiAKKyAgICAgICAgICAgICAgICArICImYXR0PSIgKyBhdHRyaWJ1dGUgCisgICAgICAgICAgICAgICAgKyAiJnZhbD0iICsgdmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvTGlzdFRhc2suamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvTGlzdFRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzNkZmRmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9MaXN0VGFzay5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hbnQ7CisKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisKKy8qKgorICogQW50IHRhc2sgdGhhdCBpbXBsZW1lbnRzIHRoZSA8Y29kZT4vbGlzdDwvY29kZT4gY29tbWFuZCwgc3VwcG9ydGVkIGJ5IHRoZQorICogVG9tY2F0IG1hbmFnZXIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCitwdWJsaWMgY2xhc3MgTGlzdFRhc2sgZXh0ZW5kcyBBYnN0cmFjdENhdGFsaW5hVGFzayB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOworICAgICAgICBleGVjdXRlKCIvbGlzdCIpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvUmVsb2FkVGFzay5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9SZWxvYWRUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlMjFhNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvUmVsb2FkVGFzay5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hbnQ7CisKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKworLyoqCisgKiBBbnQgdGFzayB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPi9yZWxvYWQ8L2NvZGU+IGNvbW1hbmQsIHN1cHBvcnRlZCBieSB0aGUKKyAqIFRvbWNhdCBtYW5hZ2VyIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworcHVibGljIGNsYXNzIFJlbG9hZFRhc2sgZXh0ZW5kcyBBYnN0cmFjdENhdGFsaW5hVGFzayB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dCBwYXRoIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gd2UgYXJlIG1hbmFnaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wYXRoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIk11c3Qgc3BlY2lmeSAncGF0aCcgYXR0cmlidXRlIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZWN1dGUoIi9yZWxvYWQ/cGF0aD0iICsgVVJMRW5jb2Rlci5lbmNvZGUodGhpcy5wYXRoLCBnZXRDaGFyc2V0KCkpKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgJ2NoYXJzZXQnIGF0dHJpYnV0ZTogIiArIGdldENoYXJzZXQoKSk7CisgICAgICAgIH0KKworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvUmVtb3ZlVGFzay5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9SZW1vdmVUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWViOTM5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvUmVtb3ZlVGFzay5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hbnQ7CisKKworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworCisvKioKKyAqIEFudCB0YXNrIHRoYXQgaW1wbGVtZW50cyB0aGUgPGNvZGU+L3JlbW92ZTwvY29kZT4gY29tbWFuZCwgc3VwcG9ydGVkIGJ5IHRoZQorICogVG9tY2F0IG1hbmFnZXIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgVW5kZXBsb3lUYXNrCisgKi8KK3B1YmxpYyBjbGFzcyBSZW1vdmVUYXNrIGV4dGVuZHMgQWJzdHJhY3RDYXRhbGluYVRhc2sgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbnRleHQgcGF0aCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIHdlIGFyZSBtYW5hZ2luZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGggPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucGF0aCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJNdXN0IHNwZWNpZnkgJ3BhdGgnIGF0dHJpYnV0ZSIpOworICAgICAgICB9CisgICAgICAgIGV4ZWN1dGUoIi9yZW1vdmU/cGF0aD0iICsgVVJMRW5jb2Rlci5lbmNvZGUodGhpcy5wYXRoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9SZXNvdXJjZXNUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1Jlc291cmNlc1Rhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmNiYjU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9SZXNvdXJjZXNUYXNrLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmFudDsKKworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKworLyoqCisgKiBBbnQgdGFzayB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPi9yZXNvdXJjZXM8L2NvZGU+IGNvbW1hbmQsIHN1cHBvcnRlZCBieQorICogdGhlIFRvbWNhdCBtYW5hZ2VyIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlc1Rhc2sgZXh0ZW5kcyBBYnN0cmFjdENhdGFsaW5hVGFzayB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHJlc291cmNlIHR5cGUgYmVpbmcgcmVxdWVzdGVkCisgICAgICogKGlmIGFueSkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5leGVjdXRlKCk7CisgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGV4ZWN1dGUoIi9yZXNvdXJjZXM/dHlwZT0iICsgdHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBleGVjdXRlKCIvcmVzb3VyY2VzIik7CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1JvbGVzVGFzay5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9Sb2xlc1Rhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQxZTEwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9Sb2xlc1Rhc2suamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYW50OworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworCisvKioKKyAqIEFudCB0YXNrIHRoYXQgaW1wbGVtZW50cyB0aGUgPGNvZGU+L3JvbGVzPC9jb2RlPiBjb21tYW5kLCBzdXBwb3J0ZWQgYnkgdGhlCisgKiBUb21jYXQgbWFuYWdlciBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KK3B1YmxpYyBjbGFzcyBSb2xlc1Rhc2sgZXh0ZW5kcyBBYnN0cmFjdENhdGFsaW5hVGFzayB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOworICAgICAgICBleGVjdXRlKCIvcm9sZXMiKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1NlcnZlcmluZm9UYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1NlcnZlcmluZm9UYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyZmRmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvU2VydmVyaW5mb1Rhc2suamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYW50OworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworCisvKioKKyAqIEFudCB0YXNrIHRoYXQgaW1wbGVtZW50cyB0aGUgPGNvZGU+L3NlcnZlcmluZm88L2NvZGU+IGNvbW1hbmQKKyAqIHN1cHBvcnRlZCBieSB0aGUgVG9tY2F0IG1hbmFnZXIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBWaXZlayBDaG9wcmEKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2ZXJpbmZvVGFzayBleHRlbmRzIEFic3RyYWN0Q2F0YWxpbmFUYXNrIHsKKworICAgIC8vIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5leGVjdXRlKCk7CisgICAgICAgIGV4ZWN1dGUoIi9zZXJ2ZXJpbmZvIik7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvU2Vzc2lvbnNUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1Nlc3Npb25zVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNjE1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1Nlc3Npb25zVGFzay5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hbnQ7CisKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKworLyoqCisgKiBBbnQgdGFzayB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPi9zZXNzaW9uczwvY29kZT4gY29tbWFuZAorICogc3VwcG9ydGVkIGJ5IHRoZSBUb21jYXQgbWFuYWdlciBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIENob3ByYQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgU2Vzc2lvbnNUYXNrIGV4dGVuZHMgQWJzdHJhY3RDYXRhbGluYVRhc2sgeworCisgICAgLy8gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogVGhlIGNvbnRleHQgcGF0aCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIHdlIGFyZSBtYW5hZ2luZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGggPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucGF0aCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgIH0KKworICAgIC8vIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5leGVjdXRlKCk7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiTXVzdCBzcGVjaWZ5ICdwYXRoJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZWN1dGUoIi9zZXNzaW9ucz9wYXRoPSIgKyBVUkxFbmNvZGVyLmVuY29kZSh0aGlzLnBhdGgsIGdldENoYXJzZXQoKSkpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiSW52YWxpZCAnY2hhcnNldCcgYXR0cmlidXRlOiAiICsgZ2V0Q2hhcnNldCgpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvU3RhcnRUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1N0YXJ0VGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MGVhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1N0YXJ0VGFzay5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hbnQ7CisKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKworLyoqCisgKiBBbnQgdGFzayB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPi9zdGFydDwvY29kZT4gY29tbWFuZCwgc3VwcG9ydGVkIGJ5IHRoZQorICogVG9tY2F0IG1hbmFnZXIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCitwdWJsaWMgY2xhc3MgU3RhcnRUYXNrIGV4dGVuZHMgQWJzdHJhY3RDYXRhbGluYVRhc2sgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbnRleHQgcGF0aCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIHdlIGFyZSBtYW5hZ2luZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGggPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucGF0aCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJNdXN0IHNwZWNpZnkgJ3BhdGgnIGF0dHJpYnV0ZSIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleGVjdXRlKCIvc3RhcnQ/cGF0aD0iICsgVVJMRW5jb2Rlci5lbmNvZGUodGhpcy5wYXRoLCBnZXRDaGFyc2V0KCkpKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgJ2NoYXJzZXQnIGF0dHJpYnV0ZTogIiArIGdldENoYXJzZXQoKSk7CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1N0b3BUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1N0b3BUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5MzMxYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvU3RvcFRhc2suamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYW50OworCisKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisKKy8qKgorICogQW50IHRhc2sgdGhhdCBpbXBsZW1lbnRzIHRoZSA8Y29kZT4vc3RvcDwvY29kZT4gY29tbWFuZCwgc3VwcG9ydGVkIGJ5IHRoZQorICogVG9tY2F0IG1hbmFnZXIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCitwdWJsaWMgY2xhc3MgU3RvcFRhc2sgZXh0ZW5kcyBBYnN0cmFjdENhdGFsaW5hVGFzayB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dCBwYXRoIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gd2UgYXJlIG1hbmFnaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wYXRoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIk11c3Qgc3BlY2lmeSAncGF0aCcgYXR0cmlidXRlIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZWN1dGUoIi9zdG9wP3BhdGg9IiArIFVSTEVuY29kZXIuZW5jb2RlKHRoaXMucGF0aCwgZ2V0Q2hhcnNldCgpKSk7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkICdjaGFyc2V0JyBhdHRyaWJ1dGU6ICIgKyBnZXRDaGFyc2V0KCkpOworICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9VbmRlcGxveVRhc2suamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvVW5kZXBsb3lUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMwYjgxYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvVW5kZXBsb3lUYXNrLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmFudDsKKworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKworLyoqCisgKiBBbnQgdGFzayB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPi91bmRlcGxveTwvY29kZT4gY29tbWFuZCwgc3VwcG9ydGVkIGJ5CisgKiB0aGUgVG9tY2F0IG1hbmFnZXIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCitwdWJsaWMgY2xhc3MgVW5kZXBsb3lUYXNrIGV4dGVuZHMgQWJzdHJhY3RDYXRhbGluYVRhc2sgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIFRoZSBjb250ZXh0IHBhdGggb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiB3ZSBhcmUgbWFuYWdpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXRoID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhdGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5leGVjdXRlKCk7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiTXVzdCBzcGVjaWZ5ICdwYXRoJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIGV4ZWN1dGUoIi91bmRlcGxveT9wYXRoPSIgKyB0aGlzLnBhdGgpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1ZhbGlkYXRvclRhc2suamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvVmFsaWRhdG9yVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOWEzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1ZhbGlkYXRvclRhc2suamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmFudDsKKworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuRGlnZXN0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuRGlnZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CisKKworLyoqCisgKiBUYXNrIGZvciB2YWxpZGF0aW5nIGEgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgdXNpbmcgWE1MIAorICogc2NoZW1hIHZhbGlkYXRpb24uCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA1LjAKKyAqLworCitwdWJsaWMgY2xhc3MgVmFsaWRhdG9yVGFzayBleHRlbmRzIEJhc2VSZWRpcmVjdG9ySGVscGVyVGFzayB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHBhdGggdG8gdGhlIHdlYmFwcCBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXRoID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhdGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4gIFRoaXMgbG9naWMgb25seSBwZXJmb3JtcyB0aGUgY29tbW9uCisgICAgICogYXR0cmlidXRlIHZhbGlkYXRpb24gcmVxdWlyZWQgYnkgYWxsIHN1YmNsYXNzZXM7IGl0IGRvZXMgbm90IHBlcmZvcm0KKyAgICAgKiBhbnkgZnVuY3Rpb25hbCBsb2dpYyBkaXJlY3RseS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYSB2YWxpZGF0aW9uIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTXVzdCBzcGVjaWZ5ICdwYXRoJyIpOworICAgICAgICB9CisKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCwgQ29uc3RhbnRzLkFwcGxpY2F0aW9uV2ViWG1sKTsKKyAgICAgICAgaWYgKCghZmlsZS5leGlzdHMoKSkgfHwgKCFmaWxlLmNhblJlYWQoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgd2ViLnhtbCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29tbW9ucy1sb2dnaW5nIGxpa2VzIGhhdmluZyB0aGUgY29udGV4dCBjbGFzc2xvYWRlciBzZXQKKyAgICAgICAgQ2xhc3NMb2FkZXIgb2xkQ0wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcgorICAgICAgICAgICAgKFZhbGlkYXRvclRhc2suY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisKKyAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBEaWdlc3RlckZhY3RvcnkubmV3RGlnZXN0ZXIodHJ1ZSwgdHJ1ZSwgbnVsbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaWxlID0gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSAKKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKKyAgICAgICAgICAgIElucHV0U291cmNlIGlzID0gbmV3IElucHV0U291cmNlKGZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKKyAgICAgICAgICAgIGlzLnNldEJ5dGVTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLnBhcnNlKGlzKTsKKyAgICAgICAgICAgIGhhbmRsZU91dHB1dCgid2ViLnhtbCB2YWxpZGF0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGlmIChpc0ZhaWxPbkVycm9yKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlZhbGlkYXRpb24gZmFpbHVyZSIsIHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVFcnJvck91dHB1dCgiVmFsaWRhdGlvbiBmYWlsdXJlOiAiICsgdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihvbGRDTCk7CisgICAgICAgICAgICBjbG9zZVJlZGlyZWN0b3IoKTsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvYW50bGliLnhtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvYW50bGliLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTJlMTJjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9hbnRsaWIueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8YW50bGliPgorICA8dHlwZWRlZgorICAgICAgICBuYW1lPSJsaXN0IgorICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50Lkxpc3RUYXNrIiAvPgorICA8dHlwZWRlZgorICAgICAgICBuYW1lPSJkZXBsb3kiCisgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuRGVwbG95VGFzayIgLz4KKyAgPHR5cGVkZWYKKyAgICAgICAgbmFtZT0ic3RhcnQiCisgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuU3RhcnRUYXNrIiAvPgorICA8dHlwZWRlZgorICAgICAgICBuYW1lPSJyZWxvYWQiCisgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuUmVsb2FkVGFzayIgLz4KKyAgPHR5cGVkZWYKKyAgICAgICAgbmFtZT0ic3RvcCIKKyAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5TdG9wVGFzayIgLz4gICAgICAgIAorICA8dHlwZWRlZgorICAgICAgICBuYW1lPSJ1bmRlcGxveSIKKyAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5VbmRlcGxveVRhc2siIC8+CisgIDx0eXBlZGVmCisgICAgICAgIG5hbWU9InJvbGVzIgorICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LlJvbGVzVGFzayIgLz4KKyAgPHR5cGVkZWYKKyAgICAgICAgbmFtZT0icmVzb3VyY2VzIgorICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LlJlc291cmNlc1Rhc2siIC8+CisgIDx0eXBlZGVmCisgICAgICAgIG5hbWU9InNlc3Npb25zIgorICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LlNlc3Npb25zVGFzayIgLz4KKyAgPHR5cGVkZWYKKyAgICAgICAgbmFtZT0iamt1cGRhdGUiCisgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuSktTdGF0dXNVcGRhdGVUYXNrIiAvPgorICA8dHlwZWRlZgorICAgICAgICBuYW1lPSJqbXhNYW5hZ2VyU2V0IgorICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LkpNWFNldFRhc2siIC8+CisgIDx0eXBlZGVmCisgICAgICAgIG5hbWU9ImpteE1hbmFnZXJHZXQiCisgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuSk1YR2V0VGFzayIgLz4KKyAgPHR5cGVkZWYKKyAgICAgICAgbmFtZT0iam14TWFuYWdlclF1ZXJ5IgorICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LkpNWFF1ZXJ5VGFzayIgLz4KKzwvYW50bGliPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvY2F0YWxpbmEudGFza3MgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L2NhdGFsaW5hLnRhc2tzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NmYxNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L2NhdGFsaW5hLnRhc2tzCkBAIC0wLDAgKzEsMjIgQEAKKyMgUHVyZSBjYXRhbGluYSB0YXNrcworZGVwbG95PW9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LkRlcGxveVRhc2sKK2xpc3Q9b3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuTGlzdFRhc2sKK3JlbG9hZD1vcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5SZWxvYWRUYXNrCitzZXNzaW9ucz1vcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5TZXNzaW9uc1Rhc2sKK3Jlc291cmNlcz1vcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5SZXNvdXJjZXNUYXNrCityb2xlcz1vcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5Sb2xlc1Rhc2sKK3N0YXJ0PW9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LlN0YXJ0VGFzaworc3RvcD1vcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5TdG9wVGFzawordW5kZXBsb3k9b3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuVW5kZXBsb3lUYXNrCit2YWxpZGF0b3I9b3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuVmFsaWRhdG9yVGFzaworCisjSmsgVGFzaworamtzdGF0dXM9b3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuSktTdGF0dXNVcGRhdGVUYXNrCisKKyMgTWFuYWdlciBKTVgKK2pteE1hbmFnZXJTZXQ9b3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuSk1YU2V0VGFzaworam14TWFuYWdlckdldD1vcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5KTVhHZXRUYXNrCitqbXhNYW5hZ2VyUXVlcnk9b3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuSk1YUXVlcnlUYXNrCisKKyMgSmFzcGVyIHRhc2tzCitqYXNwZXIyPW9yZy5hcGFjaGUuamFzcGVyLkpzcEMKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvam14L0FyZy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvQXJnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmNmVhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvam14L0FyZy5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LmpteDsKKworLyoqCisgKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA1LjUuMTAKKyAqLworcHVibGljIGNsYXNzIEFyZyB7CisgICAgU3RyaW5nIG5hbWU7CisgICAgU3RyaW5nIHR5cGU7CisgICAgU3RyaW5nIHZhbHVlOworCisgICAgcHVibGljIHZvaWQgc2V0TmFtZSggU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lPW5hbWU7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoIFN0cmluZyB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZT10eXBlOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZSggU3RyaW5nIHZhbHVlICkgeworICAgICAgICB0aGlzLnZhbHVlPXZhbHVlOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KCBTdHJpbmcgdGV4dCApIHsKKyAgICAgICAgdGhpcy52YWx1ZT10ZXh0OworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvSk1YQWNjZXNzb3JDb25kaXRpb24uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvam14L0pNWEFjY2Vzc29yQ29uZGl0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzZGVkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvam14L0pNWEFjY2Vzc29yQ29uZGl0aW9uLmphdmEKQEAgLTAsMCArMSw0MDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LmpteDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckNvbm5lY3Rpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uQ29uZGl0aW9uOworCisvKioKKyAqCisgKiA8Yj5EZWZpbml0aW9uPC9iPjoKKyAqIDxwcmU+IAorICogICAmbHQ7cGF0aCBpZD0iY2F0YWxpbmFfYW50Ij4KKyAqICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5ob21lfS9zZXJ2ZXIvbGliIj4KKyAqICAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSJjYXRhbGluYS1hbnQuamFyIi8+CisgKiAgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iY2F0YWxpbmEtYW50LWpteC5qYXIiLz4KKyAqICAgICAgICZsdDsvZmlsZXNldD4KKyAqICAgJmx0Oy9wYXRoPgorICoKKyAqICAgJmx0O3R5cGVkZWYKKyAqICAgICAgIG5hbWU9ImpteENvbmRpdGlvbiIKKyAqICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuam14LkpNWEFjY2Vzc29yQ29uZGl0aW9uIgorICogICAgICAgY2xhc3NwYXRocmVmPSJjYXRhbGluYV9hbnQiLz4KKyAqICAgJmx0O3Rhc2tkZWYKKyAqICAgICAgIG5hbWU9ImpteE9wZW4iCisgKiAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LmpteC5KTVhBY2Nlc3NvclRhc2siCisgKiAgICAgICBjbGFzc3BhdGhyZWY9ImNhdGFsaW5hX2FudCIvPgorICogPC9wcmU+CisgKiAKKyAqIDxiPlVzYWdlPC9iPjogV2FpdCBmb3Igc3RhcnQgYmFja3VwIG5vZGUKKyAqIDxwcmU+CisgKiAgICAgJmx0O3RhcmdldCBuYW1lPSJ3YWl0IiZndDsKKyAqICAgICAgICZsdDtqbXhPcGVuCisgKiAgICAgICAgICAgICAgIGhvc3Q9IiR7am14Lmhvc3R9IiBwb3J0PSIke2pteC5wb3J0fSIgdXNlcm5hbWU9IiR7am14LnVzZXJuYW1lfSIgcGFzc3dvcmQ9IiR7am14LnBhc3N3b3JkfSIgLyZndDsKKyAqICAgICAgICAmbHQ7d2FpdGZvciBtYXh3YWl0PSIke21heHdhaXR9IiBtYXh3YWl0dW5pdD0ic2Vjb25kIiB0aW1lb3V0cHJvcGVydHk9InNlcnZlci50aW1lb3V0IiAmZ3Q7CisgKiAgICAgICAgICAgJmx0O2FuZCZndDsKKyAqICAgICAgICAgICAgICAgJmx0O3NvY2tldCBzZXJ2ZXI9IiR7c2VydmVyLm5hbWV9IiBwb3J0PSIke3NlcnZlci5wb3J0fSIvJmd0OworICogICAgICAgICAgICAgICAmbHQ7aHR0cCB1cmw9IiR7dXJsfSIvJmd0OworICogICAgICAgICAgICAgICAmbHQ7am14Q29uZGl0aW9uCisgKiAgICAgICAgICAgICAgICAgICBuYW1lPSJDYXRhbGluYTp0eXBlPUlEYXRhU2VuZGVyLGhvc3Q9bG9jYWxob3N0LHNlbmRlckFkZHJlc3M9MTkyLjE2OC4xMTEuMSxzZW5kZXJQb3J0PTkwMjUiCisgKiAgICAgICAgICAgICAgICAgICBvcGVyYXRpb249Ij09IiAKKyAqICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZT0iY29ubmVjdGVkIiB2YWx1ZT0idHJ1ZSIKKyAqICAgICAgICAgICAgICAgLyZndDsKKyAqICAgICAgICAgICAgICAgJmx0O2pteENvbmRpdGlvbgorICogICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uPSImYW1wO2x0OyIKKyAqICAgICAgICAgICAgICAgICAgIG5hbWU9IkNhdGFsaW5hOmoyZWVUeXBlPVdlYk1vZHVsZSxuYW1lPS8vJHt0b21jYXQuYXBwbGljYXRpb24uaG9zdH0ke3RvbWNhdC5hcHBsaWNhdGlvbi5wYXRofSxKMkVFQXBwbGljYXRpb249bm9uZSxKMkVFU2VydmVyPW5vbmUiCisgKiAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGU9InN0YXJ0dXBUaW1lIiB2YWx1ZT0iMjUwIgorICogICAgICAgICAgICAgICAvJmd0OworICogICAgICAgICAgICZsdDsvYW5kJmd0OworICogICAgICAgJmx0Oy93YWl0Zm9yJmd0OworICogICAgICAgJmx0O2ZhaWwgaWY9InNlcnZlci50aW1lb3V0IiBtZXNzYWdlPSJTZXJ2ZXIgJHt1cmx9IGRvbid0IGFuc3dlciBpbnNpZGUgJHttYXh3YWl0fSBzZWMiIC8mZ3Q7CisgKiAgICAgICAmbHQ7ZWNobyBtZXNzYWdlPSJTZXJ2ZXIgJHt1cmx9IGFsaXZlIiAvJmd0OworICogICAmbHQ7L3RhcmdldCZndDsKKyAqCisgKiA8L3ByZT4KKyAqIEFsbG93ZWQgb3BlcmF0aW9uIGJldHdlZW4gam14IGF0dHJpYnV0ZSBhbmQgcmVmZXJlbmNlIHZhbHVlOgorICogPHVsPgorICogPGxpPj09ICBlcXVhbHM8L2xpPgorICogPGxpPiE9ICBub3QgZXF1YWxzPC9saT4KKyAqIDxsaT4mZ3Q7IGdyZWF0ZXIgdGhhbiAoJmFtcDtndDspPC9saT4KKyAqIDxsaT4mZ3Q7PSBncmVhdGVyIHRoYW4gb3IgZXF1YWxzICgmYW1wO2d0Oz0pPC9saT4KKyAqIDxsaT4mbHQ7IGxlc3NlciB0aGFuICgmYW1wO2x0Oyk8L2xpPgorICogPGxpPiZsdDs9IGxlc3NlciB0aGFuIG9yIGVxdWFscyAoJmFtcDtsdDs9KTwvbGk+CisgKiA8L3VsPiAKKyAqIDxiPk5PVEU8L2I+OiAgRm9yIG51bWVyaWMgZXhwcmVzc2lvbnMgdGhlIHR5cGUgbXVzdCBiZSBzZXQgYW5kIHVzZSB4bWwgZW50aXRpZXMgYXMgb3BlcmF0aW9ucy48YnIvPgorICogQXMgdHlwZSB3ZSBjdXJyZW50bHkgc3VwcG9ydCA8ZW0+bG9uZzwvZW0+IGFuZCA8ZW0+ZG91YmxlPC9lbT4uCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDUuNS4xMAorICoKKyAqLworcHVibGljIGNsYXNzIEpNWEFjY2Vzc29yQ29uZGl0aW9uIGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCBpbXBsZW1lbnRzIENvbmRpdGlvbiB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIHByaXZhdGUgU3RyaW5nIHVybCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOworICAgIHByaXZhdGUgU3RyaW5nIHBvcnQgPSAiODA1MCI7CisgICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJuYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgb3BlcmF0aW9uID0gIj09IiA7CisgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZSA9ICJsb25nIiA7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVmID0gImpteC5zZXJ2ZXIiOworICAgIHByaXZhdGUgU3RyaW5nIHVubGVzc0NvbmRpdGlvbjsKKyAgICBwcml2YXRlIFN0cmluZyBpZkNvbmRpdGlvbjsKKyAgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgSW5mbworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LkpNWEFjY2Vzc29yQ29uZGl0aW9uLzEuMSI7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE9wZXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG9wZXJhdGlvbjsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIG9wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb24oU3RyaW5nIG9wZXJhdGlvbikgeworICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoKSB7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGU7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGUpIHsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7CisgICAgfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaG9zdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7CisgICAgICAgIHJldHVybiBob3N0OworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gaG9zdCBUaGUgaG9zdCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkgeworICAgICAgICB0aGlzLmhvc3QgPSBob3N0OworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIG9iamVjdE5hbWUgVGhlIG5hbWUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG9iamVjdE5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gb2JqZWN0TmFtZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gcGFzc3dvcmQ7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcG9ydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBvcnQoKSB7CisgICAgICAgIHJldHVybiBwb3J0OworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG9ydChTdHJpbmcgcG9ydCkgeworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVybC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKKyAgICAgICAgcmV0dXJuIHVybDsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIHVybCBUaGUgdXJsIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIHVybCkgeworICAgICAgICB0aGlzLnVybCA9IHVybDsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB1c2VybmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCkgeworICAgICAgICByZXR1cm4gdXNlcm5hbWU7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBUaGUgdXNlcm5hbWUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSkgeworICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7CisgICAgfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICAvLyBUaGUgc2V0dGVyIGZvciB0aGUgInZhbHVlIiBhdHRyaWJ1dGUKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKyAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlZi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIHJlZjsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIHJlZklkIFRoZSByZWYgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZihTdHJpbmcgcmVmSWQpIHsKKyAgICAgICAgdGhpcy5yZWYgPSByZWZJZDsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpZkNvbmRpdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElmKCkgeworICAgICAgICByZXR1cm4gaWZDb25kaXRpb247CisgICAgfQorICAgIC8qKgorICAgICAqIE9ubHkgZXhlY3V0ZSBpZiBhIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBuYW1lIGV4aXN0cyBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgorICAgICAqIEBwYXJhbSBjIHByb3BlcnR5IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZihTdHJpbmcgYykgeworICAgICAgICBpZkNvbmRpdGlvbiA9IGM7CisgICAgfQorICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB1bmxlc3NDb25kaXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVbmxlc3MoKSB7CisgICAgICAgIHJldHVybiB1bmxlc3NDb25kaXRpb247CisgICAgfQorIAorICAgIC8qKgorICAgICAqIE9ubHkgZXhlY3V0ZSBpZiBhIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBuYW1lIGRvZXMgbm90CisgICAgICogZXhpc3QgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4KKyAgICAgKiBAcGFyYW0gYyBwcm9wZXJ0eSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VW5sZXNzKFN0cmluZyBjKSB7CisgICAgICAgIHVubGVzc0NvbmRpdGlvbiA9IGM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IEpNWENvbm5lY3Rpb24gKGRlZmF1bHQgbG9vayBhdCA8ZW0+am14LnNlcnZlcjwvZW0+IHByb2plY3QgcmVmZXJlbmNlIGZyb20gam14T3BlbiBUYXNrKQorICAgICAqIEByZXR1cm4gYWN0aXZlIEpNWENvbm5lY3Rpb24KKyAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGdldEpNWENvbm5lY3Rpb24oKQorICAgICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gSk1YQWNjZXNzb3JUYXNrLmFjY2Vzc0pNWENvbm5lY3Rpb24oCisgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLAorICAgICAgICAgICAgICAgIGdldFVybCgpLCBnZXRIb3N0KCksCisgICAgICAgICAgICAgICAgZ2V0UG9ydCgpLCBnZXRVc2VybmFtZSgpLCBnZXRQYXNzd29yZCgpLCByZWYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB2YWx1ZSBmcm9tIE1CZWFucyBhdHRyaWJ1dGUgCisgICAgICogQHJldHVybiBUaGUgdmFsdWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFjY2Vzc0pNWFZhbHVlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGdldEpNWENvbm5lY3Rpb24oKS5nZXRBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKG5hbWUpLCBhdHRyaWJ1dGUpOworICAgICAgICAgICAgaWYocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWdub3JlIGFjY2VzcyBvciBjb25uZWN0aW9uIG9wZW4gZXJyb3JzCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCB0aGUgaWYgY29uZGl0aW9uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIG5vIGlmIGNvbmRpdGlvbiwgb3IgdGhlIG5hbWVkIHByb3BlcnR5IGV4aXN0cworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHRlc3RJZkNvbmRpdGlvbigpIHsKKyAgICAgICAgaWYgKGlmQ29uZGl0aW9uID09IG51bGwgfHwgIiIuZXF1YWxzKGlmQ29uZGl0aW9uKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eShpZkNvbmRpdGlvbikgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoZSB1bmxlc3MgY29uZGl0aW9uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIG5vIHVubGVzcyBjb25kaXRpb24sCisgICAgICogIG9yIHRoZXJlIGlzIGEgbmFtZWQgcHJvcGVydHkgYnV0IGl0IGRvZXNuJ3QgZXhpc3QKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0ZXN0VW5sZXNzQ29uZGl0aW9uKCkgeworICAgICAgICBpZiAodW5sZXNzQ29uZGl0aW9uID09IG51bGwgfHwgIiIuZXF1YWxzKHVubGVzc0NvbmRpdGlvbikpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkodW5sZXNzQ29uZGl0aW9uKSA9PSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGV2YWx1YXRlcyB0aGUgY29uZGl0aW9uCisgICAgICogSXQgc3VwcG9ydCBmb3Igb3BlcmF0aW9uICI+LD49LDwsPD0iIHRoZSB0eXBlcyA8Y29kZT5sb25nPC9jb2RlPiBhbmQgPGNvZGU+ZG91YmxlPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIGV4cHJlc3Npb24gPGVtPmpteFZhbHVlPC9lbT4gPGVtPm9wZXJhdGlvbjwvZW0+IDxlbT52YWx1ZTwvZW0+CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHsKKyAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm9wZXJhdGlvbiBhdHRyaWJ1dGUgaXMgbm90IHNldCIpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInZhbHVlIGF0dHJpYnV0ZSBpcyBub3Qgc2V0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChuYW1lID09IG51bGwgfHwgYXR0cmlidXRlID09IG51bGwpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgYSAnYXR0cmlidXRlJywgbmFtZSBmb3IgZXF1YWxzIGNvbmRpdGlvbiIpOworICAgICAgICB9CisgICAgICAgIGlmICh0ZXN0SWZDb25kaXRpb24oKSAmJiB0ZXN0VW5sZXNzQ29uZGl0aW9uKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBqbXhWYWx1ZSA9IGFjY2Vzc0pNWFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoam14VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBvcCA9IGdldE9wZXJhdGlvbigpOworICAgICAgICAgICAgICAgIGlmICgiPT0iLmVxdWFscyhvcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpteFZhbHVlLmVxdWFscyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiIT0iLmVxdWFscyhvcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFqbXhWYWx1ZS5lcXVhbHModmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgibG9uZyIuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGp2YWx1ZSA9IExvbmcucGFyc2VMb25nKGpteFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbHZhbHVlID0gTG9uZy5wYXJzZUxvbmcodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCI+Ii5lcXVhbHMob3ApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGp2YWx1ZSA+IGx2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIj49Ii5lcXVhbHMob3ApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGp2YWx1ZSA+PSBsdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCI8Ii5lcXVhbHMob3ApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGp2YWx1ZSA8IGx2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIjw9Ii5lcXVhbHMob3ApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGp2YWx1ZSA8PSBsdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImRvdWJsZSIuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUganZhbHVlID0gRG91YmxlLnBhcnNlRG91YmxlKGpteFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkdmFsdWUgPSBEb3VibGUucGFyc2VEb3VibGUodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCI+Ii5lcXVhbHMob3ApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGp2YWx1ZSA+IGR2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIj49Ii5lcXVhbHMob3ApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGp2YWx1ZSA+PSBkdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCI8Ii5lcXVhbHMob3ApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGp2YWx1ZSA8IGR2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIjw9Ii5lcXVhbHMob3ApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGp2YWx1ZSA8PSBkdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorIH0KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvSk1YQWNjZXNzb3JDcmVhdGVUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L2pteC9KTVhBY2Nlc3NvckNyZWF0ZVRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODg2MWEwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvSk1YQWNjZXNzb3JDcmVhdGVUYXNrLmphdmEKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5qbXg7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckNvbm5lY3Rpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogQ3JlYXRlIG5ldyBNQmVhbiBhdCA8ZW0+Sk1YPC9lbT4gSlNSIDE2MCBNQmVhbnMgU2VydmVyLiAKKyAqIDx1bD4KKyAqIDxsaT5DcmVhdGUgTWJlYW5zPC9saT4KKyAqIDxsaT5DcmVhdGUgTWJlYW5zIHdpdGggcGFyYW1ldGVyPC9saT4KKyAqIDxsaT5DcmVhdGUgcmVtb3RlIE1iZWFucyB3aXRoIGRpZmZlcmVudCBjbGFzc2xvYWRlcjwvbGk+CisgKiA8L3VsPgorICogPHA+CisgKiBFeGFtcGxlczoKKyAqIDxici8+CisgKiBjcmVhdGUgYSBuZXcgTWJlYW4gYXQgam14LnNlcnZlciBjb25uZWN0aW9uIAorICogPHByZT4KKyAqICAgJmx0O2pteDpjcmVhdGUKKyAqICAgICAgICAgICByZWY9ImpteC5zZXJ2ZXIiCisgKiAgICAgICAgICAgbmFtZT0iQ2F0YWxpbmE6dHlwZT1NQmVhbkZhY3RvcnkiCisgKiAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5NQmVhbkZhY3RvcnkiCisgKiAgICAgICAgICAgY2xhc3NMb2FkZXI9IkNhdGFsaW5hOnR5cGU9U2VydmVyQ2xhc3NMb2FkZXIsbmFtZT1zZXJ2ZXIiJmd0OworICogICAgICAgICAgICAmbHQ7QXJnIHZhbHVlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5NQmVhbkZhY3RvcnkiIC8mZ3Q7CisgKiAgICZsdDsvam14Q3JlYXRlLyZndDsKKyAqIDwvcHJlPgorICogPC9wPgorICogPHA+CisgKiA8Yj5XQVJOSU5HPC9iPk5vdCBhbGwgVG9tY2F0IE1CZWFucyBjYW4gY3JlYXRlIHJlbW90ZWx5IGFuZCBhdXRvcmVnaXN0ZXIgYnkgaXRzIHBhcmVudHMhCisgKiBQbGVhc2UsIHVzZSB0aGUgTUJlYW5GYWN0b3J5IG9wZXJhdGlvbiB0byBnZW5lcmF0ZSB2YWx2ZXMgYW5kIHJlYWxtcy4KKyAqIDwvcD4KKyAqIDxwPgorICogRmlyc3QgY2FsbCB0byBhIHJlbW90ZSBNQmVhbnNlcnZlciBzYXZlIHRoZSBKTVhDb25uZWN0aW9uIGEgcmVmZXJlbmNlIDxlbT5qbXguc2VydmVyPC9lbT4KKyAqIDwvcD4KKyAqIFRoZXNlIHRhc2tzIHJlcXVpcmUgQW50IDEuNiBvciBsYXRlciBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogQHNpbmNlIDUuNS4xMgorICovCitwdWJsaWMgY2xhc3MgSk1YQWNjZXNzb3JDcmVhdGVUYXNrIGV4dGVuZHMgSk1YQWNjZXNzb3JUYXNrIHsKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc0xvYWRlcjsKKyAgICBwcml2YXRlIExpc3QgYXJncz1uZXcgQXJyYXlMaXN0KCk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBJbmZvCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuSk1YQWNjZXNzb3JDcmVhdGVUYXNrLzEuMCI7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsYXNzIGluZm8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xhc3NMb2FkZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgVGhlIGNsYXNzTG9hZGVyIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihTdHJpbmcgY2xhc3NMb2FkZXJOYW1lKSB7CisgICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlck5hbWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xhc3NOYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBjbGFzc05hbWUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRBcmcoQXJnIGFyZyApIHsKKyAgICAgICAgYXJncy5hZGQoYXJnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFyZ3MuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0QXJncygpIHsKKyAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSBhcmdzIFRoZSBhcmdzIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcmdzKExpc3QgYXJncykgeworICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcm90ZWN0ZWQgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLCBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBwcm9wZXJ0aWVzLiBUaGUKKyAgICAgKiBpbnB1dCBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgdXBvbiBjb21wbGV0aW9uIG9mIHRoaXMgdGFzaywgd2hldGhlciBpdCB3YXMKKyAgICAgKiBleGVjdXRlZCBzdWNjZXNzZnVsbHkgb3Igbm90LgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBqbXhFeGVjdXRlKE1CZWFuU2VydmVyQ29ubmVjdGlvbiBqbXhTZXJ2ZXJDb25uZWN0aW9uKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTXVzdCBzcGVjaWZ5IGEgJ25hbWUnIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjbGFzc05hbWUgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBhICdjbGFzc05hbWUnIGZvciBnZXQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gam14Q3JlYXRlKGpteFNlcnZlckNvbm5lY3Rpb24sIGdldE5hbWUoKSk7CisgICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBjcmVhdGUgbmV3IE1iZWFuIGFuZCB3aGVuIHNldCBmcm9tIENsYXNzTG9hZGVyIE9iamVjdG5hbWUKKyAgICAgKiBAcGFyYW0gam14U2VydmVyQ29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIGdpdmVuIG5hbWVkIGF0dHJpYnV0ZQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBqbXhDcmVhdGUoTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGpteFNlcnZlckNvbm5lY3Rpb24sCisgICAgICAgICAgICBTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBlcnJvciA9IG51bGw7CisgICAgICAgIE9iamVjdCBhcmdzQVtdID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHNpZ0FbXSA9IG51bGw7CisgICAgICAgIGlmIChhcmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgYXJnc0EgPSBuZXcgT2JqZWN0WyBhcmdzLnNpemUoKV07CisgICAgICAgICAgIHNpZ0EgPSBuZXcgU3RyaW5nW2FyZ3Muc2l6ZSgpXTsKKyAgICAgICAgICAgZm9yKCBpbnQgaT0wOyBpPGFyZ3Muc2l6ZSgpOyBpKysgKSB7CisgICAgICAgICAgICAgICBBcmcgYXJnPShBcmcpYXJncy5nZXQoaSk7CisgICAgICAgICAgICAgICBpZiggYXJnLnR5cGU9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICBhcmcudHlwZT0iamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgICAgICAgICAgICAgc2lnQVtpXT1hcmcuZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgICAgIGFyZ3NBW2ldPWFyZy5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICBzaWdBW2ldPWFyZy5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgYXJnc0FbaV09Y29udmVydFN0cmluZ1RvVHlwZShhcmcuZ2V0VmFsdWUoKSxhcmcuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2xhc3NMb2FkZXIgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGNsYXNzTG9hZGVyKSkgeworICAgICAgICAgICAgaWYgKGlzRWNobygpKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlT3V0cHV0KCJjcmVhdGUgTUJlYW4gIiArIG5hbWUgKyAiIGZyb20gY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGFzc05hbWUgKyAiIHdpdGggY2xhc3NMb2FkZXIgIiArIGNsYXNzTG9hZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGFyZ3MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBqbXhTZXJ2ZXJDb25uZWN0aW9uLmNyZWF0ZU1CZWFuKGNsYXNzTmFtZSwgbmV3IE9iamVjdE5hbWUobmFtZSksIG5ldyBPYmplY3ROYW1lKGNsYXNzTG9hZGVyKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgam14U2VydmVyQ29ubmVjdGlvbi5jcmVhdGVNQmVhbihjbGFzc05hbWUsIG5ldyBPYmplY3ROYW1lKG5hbWUpLCBuZXcgT2JqZWN0TmFtZShjbGFzc0xvYWRlciksYXJnc0Esc2lnQSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaXNFY2hvKCkpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVPdXRwdXQoImNyZWF0ZSBNQmVhbiAiICsgbmFtZSArICIgZnJvbSBjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGNsYXNzTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihhcmdzID09IG51bGwpCisgICAgICAgICAgICAgICAgam14U2VydmVyQ29ubmVjdGlvbi5jcmVhdGVNQmVhbihjbGFzc05hbWUsIG5ldyBPYmplY3ROYW1lKG5hbWUpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBqbXhTZXJ2ZXJDb25uZWN0aW9uLmNyZWF0ZU1CZWFuKGNsYXNzTmFtZSwgbmV3IE9iamVjdE5hbWUobmFtZSksYXJnc0Esc2lnQSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvam14L0pNWEFjY2Vzc29yRXF1YWxzQ29uZGl0aW9uLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L2pteC9KTVhBY2Nlc3NvckVxdWFsc0NvbmRpdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MTM3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L2pteC9KTVhBY2Nlc3NvckVxdWFsc0NvbmRpdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5qbXg7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJDb25uZWN0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkNvbmRpdGlvbjsKKworLyoqCisgKgorICogRGVmaW5pdGlvbgorICogPHByZT4gCisgKiAgICZsdDtwYXRoIGlkPSJjYXRhbGluYV9hbnQiPgorICogICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke2NhdGFsaW5hLmhvbWV9L3NlcnZlci9saWIiPgorICogICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9ImNhdGFsaW5hLWFudC5qYXIiLz4KKyAqICAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSJjYXRhbGluYS1hbnQtam14LmphciIvPgorICogICAgICAgJmx0Oy9maWxlc2V0PgorICogICAmbHQ7L3BhdGg+CisgKgorICogICAmbHQ7dHlwZWRlZgorICogICAgICAgbmFtZT0iam14RXF1YWxzIgorICogICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5qbXguSk1YQWNjZXNzb3JFcXVhbHNDb25kaXRpb24iCisgKiAgICAgICBjbGFzc3BhdGhyZWY9ImNhdGFsaW5hX2FudCIvPgorICogPC9wcmU+CisgKiAKKyAqIHVzYWdlOiBXYWl0IGZvciBzdGFydCBiYWNrdXAgbm9kZQorICogPHByZT4KKyAqICAgICAmbHQ7dGFyZ2V0IG5hbWU9IndhaXQiJmd0OworICogICAgICAgICZsdDt3YWl0Zm9yIG1heHdhaXQ9IiR7bWF4d2FpdH0iIG1heHdhaXR1bml0PSJzZWNvbmQiIHRpbWVvdXRwcm9wZXJ0eT0ic2VydmVyLnRpbWVvdXQiICZndDsKKyAqICAgICAgICAgICAmbHQ7YW5kJmd0OworICogICAgICAgICAgICAgICAmbHQ7c29ja2V0IHNlcnZlcj0iJHtzZXJ2ZXIubmFtZX0iIHBvcnQ9IiR7c2VydmVyLnBvcnR9Ii8mZ3Q7CisgKiAgICAgICAgICAgICAgICZsdDtodHRwIHVybD0iJHt1cmx9Ii8mZ3Q7CisgKiAgICAgICAgICAgICAgICZsdDtqbXhFcXVhbHMgCisgKiAgICAgICAgICAgICAgICAgICBob3N0PSJsb2NhbGhvc3QiIHBvcnQ9IjkwMTQiIHVzZXJuYW1lPSJjb250cm9sUm9sZSIgcGFzc3dvcmQ9InRvbWNhdCIKKyAqICAgICAgICAgICAgICAgICAgIG5hbWU9IkNhdGFsaW5hOnR5cGU9SURhdGFTZW5kZXIsaG9zdD1sb2NhbGhvc3Qsc2VuZGVyQWRkcmVzcz0xOTIuMTY4LjExMS4xLHNlbmRlclBvcnQ9OTAyNSIKKyAqICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZT0iY29ubmVjdGVkIiB2YWx1ZT0idHJ1ZSIKKyAqICAgICAgICAgICAgICAgLyZndDsKKyAqICAgICAgICAgICAmbHQ7L2FuZCZndDsKKyAqICAgICAgICZsdDsvd2FpdGZvciZndDsKKyAqICAgICAgICZsdDtmYWlsIGlmPSJzZXJ2ZXIudGltZW91dCIgbWVzc2FnZT0iU2VydmVyICR7dXJsfSBkb24ndCBhbnN3ZXIgaW5zaWRlICR7bWF4d2FpdH0gc2VjIiAvJmd0OworICogICAgICAgJmx0O2VjaG8gbWVzc2FnZT0iU2VydmVyICR7dXJsfSBhbGl2ZSIgLyZndDsKKyAqICAgJmx0Oy90YXJnZXQmZ3Q7CisgKgorICogPC9wcmU+CisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNS41LjEwCisgKgorICovCitwdWJsaWMgY2xhc3MgSk1YQWNjZXNzb3JFcXVhbHNDb25kaXRpb24gIGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCAgaW1wbGVtZW50cyBDb25kaXRpb24geworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICBwcml2YXRlIFN0cmluZyB1cmwgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKKyAgICBwcml2YXRlIFN0cmluZyBwb3J0ID0gIjgwNTAiOworICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyB1c2VybmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlOworICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworICAgIHByaXZhdGUgU3RyaW5nIHJlZiA9ICJqbXguc2VydmVyIiA7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgSW5mbworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LkpNWEFjY2Vzc29yRXF1YWxzQ29uZGl0aW9uLzEuMSI7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSkgeworICAgICAgICB0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBob3N0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKKyAgICAgICAgcmV0dXJuIGhvc3Q7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSBob3N0IFRoZSBob3N0IHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gb2JqZWN0TmFtZSBUaGUgbmFtZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgb2JqZWN0TmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBvYmplY3ROYW1lOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisgICAgICAgIHJldHVybiBwYXNzd29yZDsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIHBhc3N3b3JkIFRoZSBwYXNzd29yZCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwb3J0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSBwb3J0IFRoZSBwb3J0IHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KFN0cmluZyBwb3J0KSB7CisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdXJsLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworICAgICAgICByZXR1cm4gdXJsOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdXJsIFRoZSB1cmwgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7CisgICAgICAgIHRoaXMudXJsID0gdXJsOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVzZXJuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKSB7CisgICAgICAgIHJldHVybiB1c2VybmFtZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFRoZSB1c2VybmFtZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlcm5hbWUoU3RyaW5nIHVzZXJuYW1lKSB7CisgICAgICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIC8vIFRoZSBzZXR0ZXIgZm9yIHRoZSAidmFsdWUiIGF0dHJpYnV0ZQorICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByZWYuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZWYoKSB7CisgICAgICAgIHJldHVybiByZWY7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSByZWZJZCBUaGUgcmVmIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWYoU3RyaW5nIHJlZklkKSB7CisgICAgICAgIHRoaXMucmVmID0gcmVmSWQ7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBNQmVhblNlcnZlckNvbm5lY3Rpb24gZ2V0Sk1YQ29ubmVjdGlvbigpCisgICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBKTVhBY2Nlc3NvclRhc2suYWNjZXNzSk1YQ29ubmVjdGlvbigKKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCksCisgICAgICAgICAgICAgICAgZ2V0VXJsKCksIGdldEhvc3QoKSwKKyAgICAgICAgICAgICAgICBnZXRQb3J0KCksIGdldFVzZXJuYW1lKCksIGdldFBhc3N3b3JkKCksIHJlZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgdmFsdWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFjY2Vzc0pNWFZhbHVlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGdldEpNWENvbm5lY3Rpb24oKS5nZXRBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKG5hbWUpLCBhdHRyaWJ1dGUpOworICAgICAgICAgICAgaWYocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWdub3JlIGFjY2VzcyBvciBjb25uZWN0aW9uIG9wZW4gZXJyb3JzCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLy8gVGhpcyBtZXRob2QgZXZhbHVhdGVzIHRoZSBjb25kaXRpb24KKyAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ2YWx1ZSBhdHRyaWJ1dGUgaXMgbm90IHNldCIpOworICAgICAgICB9CisgICAgICAgIGlmICgobmFtZSA9PSBudWxsIHx8IGF0dHJpYnV0ZSA9PSBudWxsKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IGEgJ2F0dHJpYnV0ZScsIG5hbWUgZm9yIGVxdWFscyBjb25kaXRpb24iKTsKKyAgICAgICAgfQorICAgICAgICAvL0ZJWE1FIGNoZWNrIHVybCBvciBob3N0L3BhcmFtZXRlcgorICAgICAgICBTdHJpbmcgam14VmFsdWUgPSBhY2Nlc3NKTVhWYWx1ZSgpOworICAgICAgICBpZihqbXhWYWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGpteFZhbHVlLmVxdWFscyh2YWx1ZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvam14L0pNWEFjY2Vzc29yR2V0VGFzay5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvSk1YQWNjZXNzb3JHZXRUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkMGQ2MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvam14L0pNWEFjY2Vzc29yR2V0VGFzay5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LmpteDsKKworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckNvbm5lY3Rpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKworLyoqCisgKiBBY2Nlc3MgPGVtPkpNWDwvZW0+IEpTUiAxNjAgTUJlYW5zIFNlcnZlci4gCisgKiA8dWw+CisgKiA8bGk+R2V0IE1iZWFucyBhdHRyaWJ1dGVzPC9saT4KKyAqIDxsaT5TaG93IEdldCByZXN1bHQgYXMgQW50IGNvbnNvbGUgbG9nPC9saT4KKyAqIDxsaT5CaW5kIEdldCByZXN1bHQgYXMgQW50IHByb3BlcnRpZXM8L2xpPgorICogPC91bD4KKyAqIDxwPgorICogRXhhbXBsZXM6CisgKiA8YnIvPgorICogR2V0IGEgTWJlYW4gSURhdGFTZW5kZXIgYXR0cmlidXRlIG5yT2ZSZXF1ZXN0cyBhbmQgY3JlYXRlIGEgbmV3IGFudCBwcm9wZXJ0eSA8ZW0+SURhdGFTZW5kZXIuOTAyNS5uck9mUmVxdWVzdHM8L2VtPiAKKyAqIDxwcmU+CisgKiAgICZsdDtqbXg6Z2V0CisgKiAgICAgICAgICAgcmVmPSJqbXguc2VydmVyIgorICogICAgICAgICAgIG5hbWU9IkNhdGFsaW5hOnR5cGU9SURhdGFTZW5kZXIsaG9zdD1sb2NhbGhvc3Qsc2VuZGVyQWRkcmVzcz0xOTIuMTY4LjEuMixzZW5kZXJQb3J0PTkwMjUiIAorICogICAgICAgICAgIGF0dHJpYnV0ZT0ibnJPZlJlcXVlc3RzIgorICogICAgICAgICAgIHJlc3VsdHByb3BlcnR5PSJJRGF0YVNlbmRlci45MDI1Lm5yT2ZSZXF1ZXN0cyIKKyAqICAgICAgICAgICBlY2hvPSJmYWxzZSImZ3Q7CisgKiAgICAgICAvJmd0OworICogPC9wcmU+CisgKiA8L3A+CisgKiA8cD4KKyAqIEZpcnN0IGNhbGwgdG8gYSByZW1vdGUgTUJlYW5zZXJ2ZXIgc2F2ZSB0aGUgSk1YQ29ubmVjdGlvbiBhIHJlZmVyZW56IDxlbT5qbXguc2VydmVyPC9lbT4KKyAqIDwvcD4KKyAqIFRoZXNlIHRhc2tzIHJlcXVpcmUgQW50IDEuNiBvciBsYXRlciBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA1LjUuMTAKKyAqLworCitwdWJsaWMgY2xhc3MgSk1YQWNjZXNzb3JHZXRUYXNrIGV4dGVuZHMgSk1YQWNjZXNzb3JUYXNrIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICBwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGU7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBJbmZvCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuSk1YQWNjZXNzb3JHZXRUYXNrLzEuMCI7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKCkgeworICAgICAgICByZXR1cm4gYXR0cmlidXRlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlKSB7CisgICAgICAgIHRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOworICAgIH0KKyAgICAKKyAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3RlY3RlZCBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQsIGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIHByb3BlcnRpZXMuIFRoZQorICAgICAqIGlucHV0IHN0cmVhbSB3aWxsIGJlIGNsb3NlZCB1cG9uIGNvbXBsZXRpb24gb2YgdGhpcyB0YXNrLCB3aGV0aGVyIGl0IHdhcworICAgICAqIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSBvciBub3QuCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgam14RXhlY3V0ZShNQmVhblNlcnZlckNvbm5lY3Rpb24gam14U2VydmVyQ29ubmVjdGlvbikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk11c3Qgc3BlY2lmeSBhICduYW1lJyIpOworICAgICAgICB9CisgICAgICAgIGlmICgoYXR0cmlidXRlID09IG51bGwpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgYSAnYXR0cmlidXRlJyBmb3IgZ2V0Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICBqbXhHZXQoam14U2VydmVyQ29ubmVjdGlvbiwgZ2V0TmFtZSgpKTsKKyAgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gam14U2VydmVyQ29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIGdpdmVuIG5hbWVkIGF0dHJpYnV0ZQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBqbXhHZXQoTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGpteFNlcnZlckNvbm5lY3Rpb24sU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZXJyb3IgPSBudWxsOworICAgICAgICBpZihpc0VjaG8oKSkgeworICAgICAgICAgICAgaGFuZGxlT3V0cHV0KCJNQmVhbiAiICsgbmFtZSArICIgZ2V0IGF0dHJpYnV0ZSAiICsgYXR0cmlidXRlICk7CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGpteFNlcnZlckNvbm5lY3Rpb24uZ2V0QXR0cmlidXRlKAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKG5hbWUpLCBhdHRyaWJ1dGUpOworICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGVjaG9SZXN1bHQoYXR0cmlidXRlLHJlc3VsdCk7CisgICAgICAgICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGVycm9yID0gIkF0dHJpYnV0ZSAiICsgYXR0cmlidXRlICsgIiBpcyBlbXB0eSI7CisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L2pteC9KTVhBY2Nlc3Nvckludm9rZVRhc2suamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvam14L0pNWEFjY2Vzc29ySW52b2tlVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3Nzc1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L2pteC9KTVhBY2Nlc3Nvckludm9rZVRhc2suamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5qbXg7CisKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworCisvKioKKyAqIEFjY2VzcyA8ZW0+Sk1YPC9lbT4gSlNSIDE2MCBNQmVhbnMgU2VydmVyLiAKKyAqIDx1bD4KKyAqIDxsaT5vcGVuIG1vcmUgdGhlbiBvbmUgSlNSIDE2MCBybWkgY29ubmVjdGlvbjwvbGk+CisgKiA8bGk+R2V0L1NldCBNYmVhbnMgYXR0cmlidXRlczwvbGk+CisgKiA8bGk+Q2FsbCBNYmVhbiBPcGVyYXRpb24gd2l0aCBhcmd1bWVudHM8L2xpPgorICogPGxpPkFyZ3VtZW50IHZhbHVlcyBjYW4gYmUgY29udmVydGVkIGZyb20gc3RyaW5nIHRvIGludCxsb25nLGZsb2F0LGRvdWJsZSxib29sZWFuLE9iamVjdE5hbWUgb3IgSW5ldEFkZHJlc3MgPC9saT4KKyAqIDxsaT5RdWVyeSBNYmVhbnM8L2xpPgorICogPGxpPlNob3cgR2V0LCBDYWxsLCBRdWVyeSByZXN1bHQgYXQgQW50IGNvbnNvbGUgbG9nPC9saT4KKyAqIDxsaT5CaW5kIEdldCwgQ2FsbCwgUXVlcnkgcmVzdWx0IGF0IEFudCBwcm9wZXJ0aWVzPC9saT4KKyAqIDwvdWw+CisgKgorICogRXhhbXBsZXM6CisgKiA8dWw+CisgKiA8bGk+CisgKiBHZXQgYSBzZXNzaW9uIGF0dHJpYnV0ZSBoZWxsbyBmcm9tIHNlc3Npb24gd2l0aCByZWYgPGVtPiR7c2Vzc2lvbmlkLjB9PC9lbT4gZm9ybSAKKyAqIGFwcCA8ZW0+Q2F0YWxpbmE6dHlwZT1NYW5hZ2VyLHBhdGg9L0NsdXN0ZXJUZXN0LGhvc3Q9bG9jYWxob3N0PC9lbT4gCisgKiA8cHJlPgorICogICAmbHQ7am14Omludm9rZQorICogICAgICAgICAgIG5hbWU9IkNhdGFsaW5hOnR5cGU9TWFuYWdlcixwYXRoPS9DbHVzdGVyVGVzdCxob3N0PWxvY2FsaG9zdCIgCisgKiAgICAgICAgICAgb3BlcmF0aW9uPSJnZXRTZXNzaW9uQXR0cmlidXRlIgorICogICAgICAgICAgIHJlc3VsdHByb3BlcnR5PSJoZWxsbyImZ3Q7CisgKiAgICAgICAgICZsdDthcmcgdmFsdWU9IiR7c2Vzc2lvbmlkLjB9Ii8mZ3Q7CisgKiAgICAgICAgICZsdDthcmcgdmFsdWU9IkhlbGxvIi8mZ3Q7CisgKiAgICZsdDsvam14Omludm9rZSZndDsKKyAqIDwvcHJlPgorICogPC9saT4KKyAqIDxsaT4KKyAqIENyZWF0ZSBuZXcgQWNjZXNzTG9nZ2VyIGF0IGxvY2FsaG9zdCAKKyAqIDxjb2RlPgorICogICAmbHQ7am14Omludm9rZQorICogICAgICAgICAgIG5hbWU9IkNhdGFsaW5hOnR5cGU9TUJlYW5GYWN0b3J5IiAKKyAqICAgICAgICAgICBvcGVyYXRpb249ImNyZWF0ZUFjY2Nlc0xvZ2dlclZhbHZlIgorICogICAgICAgICAgIHJlc3VsdHByb3BlcnR5PSJhY2NjZXNMb2dnZXJPYmplY3ROYW1lIgorICogICAgICAgJmd0OworICogICAgICAgICAmbHQ7YXJnIHZhbHVlPSJDYXRhbGluYTp0eXBlPUhvc3QsaG9zdD1sb2NhbGhvc3QiLyZndDsKKyAqICAgJmx0Oy9qbXg6aW52b2tlJmd0OworICoKKyAqIDwvY29kZT4KKyAqIDwvbGk+CisgKiA8bGk+CisgKiBSZW1vdmUgZXhpc3RpbmcgQWNjZXNzTG9nZ2VyIGF0IGxvY2FsaG9zdCAKKyAqIDxjb2RlPgorICogICAmbHQ7am14Omludm9rZQorICogICAgICAgICAgIG5hbWU9IkNhdGFsaW5hOnR5cGU9TUJlYW5GYWN0b3J5IiAKKyAqICAgICAgICAgICBvcGVyYXRpb249InJlbW92ZVZhbHZlIgorICogICAgICAgJmd0OworICogICAgICAgICAmbHQ7YXJnIHZhbHVlPSJDYXRhbGluYTp0eXBlPVZhbHZlLG5hbWU9QWNjZXNzTG9nVmFsdmUsaG9zdD1sb2NhbGhvc3QiLyZndDsKKyAqICAgJmx0Oy9qbXg6aW52b2tlJmd0OworICoKKyAqIDwvY29kZT4KKyAqIDwvbGk+CisgKiA8L3VsPgorICogPHA+CisgKiBGaXJzdCBjYWxsIHRvIGEgcmVtb3RlIE1CZWFuc2VydmVyIHNhdmUgdGhlIEpNWENvbm5lY3Rpb24gYSByZWZlcmVueiA8ZW0+am14LnNlcnZlcjwvZW0+CisgKiA8L3A+CisgKiBUaGVzZSB0YXNrcyByZXF1aXJlIEFudCAxLjYgb3IgbGF0ZXIgaW50ZXJmYWNlLgorICoKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNS41LjEwCisgKi8KKworcHVibGljIGNsYXNzIEpNWEFjY2Vzc29ySW52b2tlVGFzayBleHRlbmRzIEpNWEFjY2Vzc29yVGFzayB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgcHJpdmF0ZSBTdHJpbmcgb3BlcmF0aW9uIDsKKyAgICBwcml2YXRlIExpc3QgYXJncz1uZXcgQXJyYXlMaXN0KCk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBJbmZvCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuSk1YQWNjZXNzb3JJbnZva2VUYXNrLzEuMCI7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3BlcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3BlcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gb3BlcmF0aW9uOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbihTdHJpbmcgb3BlcmF0aW9uKSB7CisgICAgICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEFyZyhBcmcgYXJnICkgeworICAgICAgICBhcmdzLmFkZChhcmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYXJncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRBcmdzKCkgeworICAgICAgICByZXR1cm4gYXJnczsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3MgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3MoTGlzdCBhcmdzKSB7CisgICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CisgICAgfQorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcm90ZWN0ZWQgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLCBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBwcm9wZXJ0aWVzLiBUaGUKKyAgICAgKiBpbnB1dCBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgdXBvbiBjb21wbGV0aW9uIG9mIHRoaXMgdGFzaywgd2hldGhlciBpdCB3YXMKKyAgICAgKiBleGVjdXRlZCBzdWNjZXNzZnVsbHkgb3Igbm90LgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGpteEV4ZWN1dGUoTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGpteFNlcnZlckNvbm5lY3Rpb24pCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChnZXROYW1lKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJNdXN0IHNwZWNpZnkgYSAnbmFtZSciKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG9wZXJhdGlvbiA9PSBudWxsKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IGEgJ29wZXJhdGlvbicgZm9yIGNhbGwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIGpteEludm9rZShqbXhTZXJ2ZXJDb25uZWN0aW9uLCBnZXROYW1lKCkpOworICAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gam14U2VydmVyQ29ubmVjdGlvbgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBqbXhJbnZva2UoTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGpteFNlcnZlckNvbm5lY3Rpb24sIFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA7CisgICAgICAgIGlmIChhcmdzID09IG51bGwpIHsKKyAgICAgICAgICAgICByZXN1bHQgPSBqbXhTZXJ2ZXJDb25uZWN0aW9uLmludm9rZShuZXcgT2JqZWN0TmFtZShuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLCBudWxsLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9iamVjdCBhcmdzQVtdPW5ldyBPYmplY3RbIGFyZ3Muc2l6ZSgpXTsKKyAgICAgICAgICAgIFN0cmluZyBzaWdBW109bmV3IFN0cmluZ1thcmdzLnNpemUoKV07CisgICAgICAgICAgICBmb3IoIGludCBpPTA7IGk8YXJncy5zaXplKCk7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBBcmcgYXJnPShBcmcpYXJncy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYoIGFyZy50eXBlPT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFyZy50eXBlPSJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgc2lnQVtpXT1hcmcuZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgICAgICBhcmdzQVtpXT1hcmcuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzaWdBW2ldPWFyZy5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIGFyZ3NBW2ldPWNvbnZlcnRTdHJpbmdUb1R5cGUoYXJnLmdldFZhbHVlKCksYXJnLmdldFR5cGUoKSk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IGpteFNlcnZlckNvbm5lY3Rpb24uaW52b2tlKG5ldyBPYmplY3ROYW1lKG5hbWUpLCBvcGVyYXRpb24sIGFyZ3NBLCBzaWdBKTsKKyAgICAgICAgfQorICAgICAgICBpZihyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgZWNob1Jlc3VsdChvcGVyYXRpb24scmVzdWx0KTsKKyAgICAgICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L2pteC9KTVhBY2Nlc3NvclF1ZXJ5VGFzay5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvSk1YQWNjZXNzb3JRdWVyeVRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzgwMWM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvSk1YQWNjZXNzb3JRdWVyeVRhc2suamF2YQpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5qbXg7CisKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkF0dHJpYnV0ZUluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckNvbm5lY3Rpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKworLyoqCisgKiBRdWVyeSBmb3IgTWJlYW5zLiAKKyAqIDx1bD4KKyAqIDxsaT5vcGVuIG5vIGV4aXN0aW5nIEpTUiAxNjAgcm1pIGpteCBjb25uZWN0aW9uPC9saT4KKyAqIDxsaT5HZXQgYWxsIE1iZWFucyBhdHRyaWJ1dGVzPC9saT4KKyAqIDxsaT5HZXQgb25seSB0aGUgUXVlcnkgTWJlYW5zIE9iamVjdE5hbWVzPC9saT4KKyAqIDxsaT5TaG93IHF1ZXJ5IHJlc3VsdCBhcyBBbnQgY29uc29sZSBsb2c8L2xpPgorICogPGxpPkJpbmQgcXVlcnkgcmVzdWx0IGFzIEFudCBwcm9wZXJ0aWVzPC9saT4KKyAqIDwvdWw+CisgKiA8YnIvPgorICogUXVlcnkgYSBsaXN0IG9mIE1iZWFucy4KKyAqIDxwcmU+CisgKiAgICZsdDtqbXhRdWVyeQorICogICAgICAgICAgIGhvc3Q9IjEyNy4wLjAuMSIKKyAqICAgICAgICAgICBwb3J0PSI5MDE0IgorICogICAgICAgICAgIG5hbWU9IkNhdGFsaW5hOnR5cGU9TWFuYWdlciwqIAorICogICAgICAgICAgIHJlc3VsdHByb3BlcnR5PSJtYW5hZ2VyIiAvJmd0OworICogPC9wcmU+CisgKiB3aXRoIGF0dHJpYnV0ZSA8ZW0+YXR0cmlidXRlYmluZGluZz0idHJ1ZSI8L2VtPiB5b3UgY2FuIGdldCAKKyAqIGFsbCBhdHRyaWJ1dGVzIGFsc28gZnJvbSByZXN1bHQgb2JqZWN0cy48YnIvPgorICogVGhlIHBvcGVydHkgbWFuYWdlci5sZW5naHQgc2hvdyB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0IAorICogYW5kIHdpdGggbWFuYWdlci5bMC4ubGVuZ2h0XS5uYW1lIHRoZSAKKyAqIHJlc3VsdGVkIE9iamVjdE5hbWVzIGFyZSBzYXZlZC4gCisgKiBUaGVzZSB0YXNrcyByZXF1aXJlIEFudCAxLjYgb3IgbGF0ZXIgaW50ZXJmYWNlLgorICoKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNS41LjEwCisgKi8KKworcHVibGljIGNsYXNzIEpNWEFjY2Vzc29yUXVlcnlUYXNrIGV4dGVuZHMgSk1YQWNjZXNzb3JUYXNrIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgcHJpdmF0ZSBib29sZWFuIGF0dHJpYnV0ZWJpbmRpbmcgPSBmYWxzZTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIEluZm8KKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5KTVhBY2Nlc3NvclF1ZXJ5VGFzay8xLjAiOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24gYW5kIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGF0dHJpYnV0ZWJpbmRpbmcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGViaW5kaW5nKCkgeworICAgICAgICByZXR1cm4gYXR0cmlidXRlYmluZGluZzsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZUJpbmRpbmcgVGhlIGF0dHJpYnV0ZWJpbmRpbmcgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZWJpbmRpbmcoYm9vbGVhbiBhdHRyaWJ1dGVCaW5kaW5nKSB7CisgICAgICAgIHRoaXMuYXR0cmlidXRlYmluZGluZyA9IGF0dHJpYnV0ZUJpbmRpbmc7CisgICAgfQorICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJvdGVjdGVkIE1ldGhvZHMKKworICAgIAorICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLCBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBwcm9wZXJ0aWVzLiBUaGUKKyAgICAgKiBpbnB1dCBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgdXBvbiBjb21wbGV0aW9uIG9mIHRoaXMgdGFzaywgd2hldGhlciBpdCB3YXMKKyAgICAgKiBleGVjdXRlZCBzdWNjZXNzZnVsbHkgb3Igbm90LgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBqbXhFeGVjdXRlKE1CZWFuU2VydmVyQ29ubmVjdGlvbiBqbXhTZXJ2ZXJDb25uZWN0aW9uKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTXVzdCBzcGVjaWZ5IGEgJ25hbWUnIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGpteFF1ZXJ5KGpteFNlcnZlckNvbm5lY3Rpb24sIGdldE5hbWUoKSk7CisKKyAgICB9CisKKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsIE1iZWFuIHNlcnZlciBmb3Igc29tZSBtYmVhbnMgd2l0aCBzYW1lIGRvbWFpbiwgYXR0cmlidXRlcy4KKyAgICAgKiAgd2l0aCA8ZW0+YXR0cmlidXRlYmluZHVuZz10cnVlPC9lbT4geW91IGNhbiBzYXZlIGFsbCBhdHRyaWJ1dGVzIGZyb20gYWxsIGZvdW5kIG9iamVjdHMKKyAgICAgKiBhcyB5b3VyIGFudCBwcm9wZXJ0aWVzCisgICAgICogQHBhcmFtIGpteFNlcnZlckNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gcXJ5CisgICAgICogQHJldHVybiBUaGUgcXVlcnkgcmVzdWx0CisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBqbXhRdWVyeShNQmVhblNlcnZlckNvbm5lY3Rpb24gam14U2VydmVyQ29ubmVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZyBxcnkpIHsKKyAgICAgICAgU3RyaW5nIGlzRXJyb3IgPSBudWxsOworICAgICAgICBTZXQgbmFtZXMgPSBudWxsOworICAgICAgICBTdHJpbmcgcmVzdWx0cHJvcGVydHkgPSBnZXRSZXN1bHRwcm9wZXJ0eSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmFtZXMgPSBqbXhTZXJ2ZXJDb25uZWN0aW9uLnF1ZXJ5TmFtZXMobmV3IE9iamVjdE5hbWUocXJ5KSwgbnVsbCk7CisgICAgICAgICAgICBpZiAocmVzdWx0cHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldFByb3BlcnR5KHJlc3VsdHByb3BlcnR5ICsgIi5MZW5ndGgiLEludGVnZXIudG9TdHJpbmcobmFtZXMuc2l6ZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoaXNFY2hvKCkpCisgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3JPdXRwdXQoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuICJDYW4ndCBxdWVyeSBtYmVhbnMgIiArIHFyeTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHRwcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBJdGVyYXRvciBpdCA9IG5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBpbnQgb2luZGV4ID0gMDsKKyAgICAgICAgICAgIFN0cmluZyBwbmFtZSA9IG51bGw7CisgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IChPYmplY3ROYW1lKSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgcG5hbWUgPSByZXN1bHRwcm9wZXJ0eSArICIuIiArIEludGVnZXIudG9TdHJpbmcob2luZGV4KSArICIuIjsKKyAgICAgICAgICAgICAgICBvaW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgc2V0UHJvcGVydHkocG5hbWUgKyAiTmFtZSIsIG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNBdHRyaWJ1dGViaW5kaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRBdHRyaWJ1dGVzKGpteFNlcnZlckNvbm5lY3Rpb24sIHJlc3VsdHByb3BlcnR5LCBwbmFtZSwgb25hbWUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpc0Vycm9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBqbXhTZXJ2ZXJDb25uZWN0aW9uCisgICAgICogQHBhcmFtIHJlc3VsdHByb3BlcnR5CisgICAgICogQHBhcmFtIHBuYW1lCisgICAgICogQHBhcmFtIG9uYW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYmluZEF0dHJpYnV0ZXMoTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGpteFNlcnZlckNvbm5lY3Rpb24sIFN0cmluZyByZXN1bHRwcm9wZXJ0eSwgU3RyaW5nIHBuYW1lLCBPYmplY3ROYW1lIG9uYW1lKSB7CisgICAgICAgIGlmIChqbXhTZXJ2ZXJDb25uZWN0aW9uICE9IG51bGwgICYmIHJlc3VsdHByb3BlcnR5ICE9IG51bGwgCisgICAgICAgICAgICAmJiBwbmFtZSAhPSBudWxsICYmIG9uYW1lICE9IG51bGwgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE1CZWFuSW5mbyBtaW5mbyA9IGpteFNlcnZlckNvbm5lY3Rpb24uZ2V0TUJlYW5JbmZvKG9uYW1lKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29kZSA9IG1pbmZvLmdldENsYXNzTmFtZSgpOworICAgICAgICAgICAgICAgIGlmICgib3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuQmFzZU1vZGVsTUJlYW4iLmVxdWFscyhjb2RlKSkgeworICAgICAgICAgICAgICAgICAgICBjb2RlID0gKFN0cmluZykgam14U2VydmVyQ29ubmVjdGlvbi5nZXRBdHRyaWJ1dGUob25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZGVsZXJUeXBlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1CZWFuQXR0cmlidXRlSW5mbyBhdHRyc1tdID0gbWluZm8uZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYXR0cnNbaV0uaXNSZWFkYWJsZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHROYW1lID0gYXR0cnNbaV0uZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXR0TmFtZS5pbmRleE9mKCI9IikgPj0gMCB8fCBhdHROYW1lLmluZGV4T2YoIjoiKSA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYXR0TmFtZS5pbmRleE9mKCIgIikgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBqbXhTZXJ2ZXJDb25uZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dE5hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRWNobygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yT3V0cHV0KCJFcnJvciBnZXR0aW5nIGF0dHJpYnV0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9uYW1lICsgIiAiICsgcG5hbWUgKyBhdHROYW1lICsgIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoIm1vZGVsZXJUeXBlIi5lcXVhbHMoYXR0TmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlUHJvcGVydHkocG5hbWUgKyBhdHROYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvam14L0pNWEFjY2Vzc29yU2V0VGFzay5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvSk1YQWNjZXNzb3JTZXRUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1ZDc5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvam14L0pNWEFjY2Vzc29yU2V0VGFzay5qYXZhCkBAIC0wLDAgKzEsMzUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LmpteDsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZUxpc3Q7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkF0dHJpYnV0ZUluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckNvbm5lY3Rpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKworLyoqCisgKiBBY2Nlc3MgPGVtPkpNWDwvZW0+IEpTUiAxNjAgTUJlYW5zIFNlcnZlci4gCisgKiA8dWw+CisgKiA8bGk+U2V0IE1iZWFucyBhdHRyaWJ1dGVzPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIEV4YW1wbGVzOgorICogU2V0IGEgTWJlYW4gTWFuYWdlciBhdHRyaWJ1dGUgbWF4QWN0aXZlU2Vzc2lvbnMuCisgKiBTZXQgdGhpcyBhdHRyaWJ1dGUgd2l0aCBmcmVzaCBqbXggY29ubmVjdGlvbiB3aXRob3V0IHNhdmUgcmVmZXJlbmNlIAorICogPHByZT4KKyAqICAgJmx0O2pteDpzZXQKKyAqICAgICAgICAgICBob3N0PSIxMjcuMC4wLjEiCisgKiAgICAgICAgICAgcG9ydD0iOTAxNCIKKyAqICAgICAgICAgICBuYW1lPSJDYXRhbGluYTp0eXBlPU1hbmFnZXIscGF0aD0iL0NsdXN0ZXJUZXN0Iixob3N0PWxvY2FsaG9zdCIgCisgKiAgICAgICAgICAgYXR0cmlidXRlPSJtYXhBY3RpdmVTZXNzaW9ucyIKKyAqICAgICAgICAgICB2YWx1ZT0iMTAwIgorICogICAgICAgICAgIHR5cGU9ImludCIKKyAqICAgICAgICAgICBlY2hvPSJmYWxzZSImZ3Q7CisgKiAgICAgICAvJmd0OworICogPC9wcmU+CisgKgorICogb3IgCisgKiAKKyAqIDxwcmU+CisgKiAgICZsdDtqbXg6c2V0CisgKiAgICAgICAgICAgaG9zdD0iMTI3LjAuMC4xIgorICogICAgICAgICAgIHBvcnQ9IjkwMTQiCisgKiAgICAgICAgICAgbmFtZT0iQ2F0YWxpbmE6dHlwZT1NYW5hZ2VyLHBhdGg9Ii9DbHVzdGVyVGVzdCIsaG9zdD1sb2NhbGhvc3QiIAorICogICAgICAgICAgIGVjaG89ImZhbHNlIiZndDsKKyAqICAgICAgICZndDsKKyAqICAgICAgIAorICogICAgICAgICZsdDthcmcgbmFtZT0ibm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbiIKKyAqICAgICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIgorICogICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvJmd0OworICogICAgICAgICZsdDthcmcgbmFtZT0ibm90aWZ5U2Vzc2lvbkxpc3RlbmVyc09uUmVwbGljYXRpb24iCisgKiAgICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSIKKyAqICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLyZndDsKKyAqICAgJmx0Oy9qbXg6c2V0Jmd0OworICoKKyAqIDwvcHJlPgorICogPC9wPgorICogPHA+CisgKiBGaXJzdCBjYWxsIHRvIGEgcmVtb3RlIE1CZWFuc2VydmVyIHNhdmUgdGhlIEpNWENvbm5lY3Rpb24gYSByZWZlcmVueiA8ZW0+am14LnNlcnZlcjwvZW0+CisgKiA8L3A+CisgKiBUaGVzZSB0YXNrcyByZXF1aXJlIEFudCAxLjYgb3IgbGF0ZXIgaW50ZXJmYWNlLgorICoKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNS41LjEwCisgKi8KKworcHVibGljIGNsYXNzIEpNWEFjY2Vzc29yU2V0VGFzayBleHRlbmRzIEpNWEFjY2Vzc29yVGFzayB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIHByaXZhdGUgU3RyaW5nIGF0dHJpYnV0ZTsKKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKyAgICBwcml2YXRlIFN0cmluZyB0eXBlOworICAgIHByaXZhdGUgYm9vbGVhbiBjb252ZXJ0ID0gZmFsc2UgOworICAgIHByaXZhdGUgTGlzdCBhcmdzPW5ldyBBcnJheUxpc3QoKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIEluZm8KKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5KTVhBY2Nlc3NvclNldFRhc2svMS4xIjsKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uIGFuZCB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICBwdWJsaWMgdm9pZCBhZGRBcmcoQXJnIGF0dHJpYnV0ZSkgeworICAgICAgICBhcmdzLmFkZChhdHRyaWJ1dGUpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGdldEFyZ3MoKSB7CisgICAgICAgIHJldHVybiBhcmdzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoKSB7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSkgeworICAgICAgICB0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUgVGhlIHR5cGUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHZhbHVlVHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB2YWx1ZVR5cGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbnZlcnQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb252ZXJ0KCkgeworICAgICAgICByZXR1cm4gY29udmVydDsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIGNvbnZlcnQgVGhlIGNvbnZlcnQgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnQoYm9vbGVhbiBjb252ZXJ0KSB7CisgICAgICAgIHRoaXMuY29udmVydCA9IGNvbnZlcnQ7CisgICAgfQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcm90ZWN0ZWQgTWV0aG9kcworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQsIGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIHByb3BlcnRpZXMuIFRoZQorICAgICAqIGlucHV0IHN0cmVhbSB3aWxsIGJlIGNsb3NlZCB1cG9uIGNvbXBsZXRpb24gb2YgdGhpcyB0YXNrLCB3aGV0aGVyIGl0IHdhcworICAgICAqIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSBvciBub3QuCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGpteEV4ZWN1dGUoTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGpteFNlcnZlckNvbm5lY3Rpb24pCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTXVzdCBzcGVjaWZ5IGEgJ25hbWUnIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGF0dHJpYnV0ZSA9PSBudWxsIHx8IHZhbHVlID09IG51bGwpICYmIGFyZ3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgYSAnYXR0cmlidXRlJyBhbmQgJ3ZhbHVlJyBvciAnYXR0cmlidXRlJyBlbGVtZW50cyBmb3Igc2V0IHdpdGggYXJncyIpOworICAgICAgICB9CisgICAgICAgIGlmIChhcmdzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGpteFNldChqbXhTZXJ2ZXJDb25uZWN0aW9uLCBnZXROYW1lKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChhdHRyaWJ1dGUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIEFyZyBhID0gbmV3IEFyZygpOworICAgICAgICAgICAgICAgIGEuc2V0TmFtZShhdHRyaWJ1dGUpOworICAgICAgICAgICAgICAgIGEuc2V0VmFsdWUodmFsdWUpOworICAgICAgICAgICAgICAgIGEuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgICAgICAgICBhcmdzLmFkZChhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBqbXhTZXRXaXRoQXR0cmlidXRMaXN0KGpteFNlcnZlckNvbm5lY3Rpb24sIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gam14U2VydmVyQ29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGpteFNldChNQmVhblNlcnZlckNvbm5lY3Rpb24gam14U2VydmVyQ29ubmVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IHJlYWxWYWx1ZTsKKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVhbFZhbHVlID0gY29udmVydFN0cmluZ1RvVHlwZSh2YWx1ZSwgdHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaXNDb252ZXJ0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbVR5cGUgPSBnZXRNQmVhbkF0dHJpYnV0ZVR5cGUoam14U2VydmVyQ29ubmVjdGlvbiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSk7CisgICAgICAgICAgICAgICAgcmVhbFZhbHVlID0gY29udmVydFN0cmluZ1RvVHlwZSh2YWx1ZSwgbVR5cGUpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcmVhbFZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgam14U2VydmVyQ29ubmVjdGlvbi5zZXRBdHRyaWJ1dGUobmV3IE9iamVjdE5hbWUobmFtZSksIG5ldyBBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgYXR0cmlidXRlLCByZWFsVmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IHNldmVyYWwgYXR0cmlidXRlcyBpbiBvbmUgaW52b2NhdGlvbiB0byB0aGUgc2VydmVyCisgICAgICogQHBhcmFtIGpteFNlcnZlckNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBqbXhTZXRXaXRoQXR0cmlidXRMaXN0KE1CZWFuU2VydmVyQ29ubmVjdGlvbiBqbXhTZXJ2ZXJDb25uZWN0aW9uLAorICAgICAgICAgICAgU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIEF0dHJpYnV0ZUxpc3QgYXR0cmlidXRlTGlzdCA9IG5ldyBBdHRyaWJ1dGVMaXN0KCk7CisgICAgICAgIE1CZWFuSW5mbyBtaW5mbyA9IG51bGw7CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXJncy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIEFyZyBlbGVtZW50ID0gKEFyZykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBPYmplY3QgcmVhbFZhbHVlOworICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0VHlwZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWFsVmFsdWUgPSBjb252ZXJ0U3RyaW5nVG9UeXBlKGVsZW1lbnQuZ2V0VmFsdWUoKSwgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFR5cGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpc0NvbnZlcnQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobWluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbmZvID0gZ2V0TUJlYW5JbmZvKGpteFNlcnZlckNvbm5lY3Rpb24sIG5hbWUpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbVR5cGUgPSBnZXRNQmVhbkF0dHJpYnV0ZVR5cGUobWluZm8sIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVhbFZhbHVlID0gY29udmVydFN0cmluZ1RvVHlwZShlbGVtZW50LmdldFZhbHVlKCksIG1UeXBlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVhbFZhbHVlID0gZWxlbWVudC5nZXRWYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXR0cmlidXRlIGEgPSBuZXcgQXR0cmlidXRlKGVsZW1lbnQuZ2V0TmFtZSgpLCByZWFsVmFsdWUpOworICAgICAgICAgICAgYXR0cmlidXRlTGlzdC5hZGQoYSk7CisgICAgICAgIH0KKworICAgICAgICBBdHRyaWJ1dGVMaXN0IHNldHRlZEF0dHJpYnV0ZXMgPSBqbXhTZXJ2ZXJDb25uZWN0aW9uLnNldEF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdE5hbWUobmFtZSksIGF0dHJpYnV0ZUxpc3QpOworICAgICAgICBpZiAoaXNFY2hvKCkpCisgICAgICAgICAgICBpZiAoc2V0dGVkQXR0cmlidXRlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJObyBzZXR0ZWQgYXR0cmlidXRlcyEiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiQXR0cmlidXRlcyIpOworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNldHRlZEF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsgaXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIGVsZW1lbnQgPSAoQXR0cmlidXRlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJykuYXBwZW5kKGVsZW1lbnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgd2VyZSBzZXR0ZWQiKTsKKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgTUJlYW4gQXR0cmlidXRlIGZyb20gdGhlIE1CZWFuSW5mbworICAgICAqIEBwYXJhbSBtaW5mbworICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUKKyAgICAgKiBAcmV0dXJuIFRoZSB0eXBlCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE1CZWFuQXR0cmlidXRlVHlwZSgKKyAgICAgICAgICAgIE1CZWFuSW5mbyBtaW5mbywKKyAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbWF0dHJUeXBlID0gbnVsbDsKKyAgICAgICAgTUJlYW5BdHRyaWJ1dGVJbmZvIGF0dHJzW10gPSBtaW5mby5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgIGlmIChhdHRycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgbWF0dHJUeXBlID09IG51bGwgJiYgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5lcXVhbHMoYXR0cnNbaV0uZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgbWF0dHJUeXBlID0gYXR0cnNbaV0uZ2V0VHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtYXR0clR5cGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIE1CZWFuSW5mbyBmcm9tIE1iZWFuIFNlcnZlcgorICAgICAqIEBwYXJhbSBqbXhTZXJ2ZXJDb25uZWN0aW9uCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiBAcmV0dXJuIFRoZSBtYmVhbiBpbmZvCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTUJlYW5JbmZvIGdldE1CZWFuSW5mbygKKyAgICAgICAgICAgIE1CZWFuU2VydmVyQ29ubmVjdGlvbiBqbXhTZXJ2ZXJDb25uZWN0aW9uLAorICAgICAgICAgICAgU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUobmFtZSk7CisgICAgICAgIE1CZWFuSW5mbyBtaW5mbyA9IGpteFNlcnZlckNvbm5lY3Rpb24uZ2V0TUJlYW5JbmZvKG9uYW1lKTsKKyAgICAgICAgcmV0dXJuIG1pbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBNQmVhbiBBdHRyaXV0ZSBmcm9tIE1iZWFuIFNlcnZlcgorICAgICAqIEBwYXJhbSBqbXhTZXJ2ZXJDb25uZWN0aW9uCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlCisgICAgICogQHJldHVybiBUaGUgdHlwZQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRNQmVhbkF0dHJpYnV0ZVR5cGUoCisgICAgICAgICAgICBNQmVhblNlcnZlckNvbm5lY3Rpb24gam14U2VydmVyQ29ubmVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShuYW1lKTsKKyAgICAgICAgU3RyaW5nIG1hdHRyVHlwZSA9IG51bGw7CisgICAgICAgIE1CZWFuSW5mbyBtaW5mbyA9IGpteFNlcnZlckNvbm5lY3Rpb24uZ2V0TUJlYW5JbmZvKG9uYW1lKTsKKyAgICAgICAgTUJlYW5BdHRyaWJ1dGVJbmZvIGF0dHJzW10gPSBtaW5mby5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgIGlmIChhdHRycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgbWF0dHJUeXBlID09IG51bGwgJiYgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5lcXVhbHMoYXR0cnNbaV0uZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgbWF0dHJUeXBlID0gYXR0cnNbaV0uZ2V0VHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtYXR0clR5cGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvSk1YQWNjZXNzb3JUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L2pteC9KTVhBY2Nlc3NvclRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmQ1NjBkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvSk1YQWNjZXNzb3JUYXNrLmphdmEKQEAgLTAsMCArMSw3MzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LmpteDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJDb25uZWN0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uQ29tcG9zaXRlRGF0YTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21wb3NpdGVEYXRhU3VwcG9ydDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21wb3NpdGVUeXBlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLk9wZW5UeXBlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLlNpbXBsZVR5cGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uVGFidWxhckRhdGFTdXBwb3J0OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3JGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWFNlcnZpY2VVUkw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5CYXNlUmVkaXJlY3RvckhlbHBlclRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworLyoqCisgKiBBY2Nlc3MgPGVtPkpNWDwvZW0+IEpTUiAxNjAgTUJlYW5zIFNlcnZlci4KKyAqIDx1bD4KKyAqIDxsaT5vcGVuIG1vcmUgdGhlbiBvbmUgSlNSIDE2MCBybWkgY29ubmVjdGlvbjwvbGk+CisgKiA8bGk+R2V0L1NldCBNYmVhbnMgYXR0cmlidXRlczwvbGk+CisgKiA8bGk+Q2FsbCBNYmVhbiBPcGVyYXRpb24gd2l0aCBhcmd1bWVudHM8L2xpPgorICogPGxpPkFyZ3VtZW50IHZhbHVlcyBjYW4gYmUgY29udmVydGVkIGZyb20gc3RyaW5nIHRvCisgKiBpbnQsbG9uZyxmbG9hdCxkb3VibGUsYm9vbGVhbixPYmplY3ROYW1lIG9yIEluZXRBZGRyZXNzPC9saT4KKyAqIDxsaT5RdWVyeSBNYmVhbnM8L2xpPgorICogPGxpPlNob3cgR2V0LCBDYWxsLCBRdWVyeSByZXN1bHQgYXQgQW50IGNvbnNvbGUgbG9nPC9saT4KKyAqIDxsaT5CaW5kIEdldCwgQ2FsbCwgUXVlcnkgcmVzdWx0IGF0IEFudCBwcm9wZXJ0aWVzPC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIEV4YW1wbGVzOiBvcGVuIHNlcnZlciB3aXRoIHJlZmVyZW5jZSBhbmQgYXV0b3Jpc2F0aW9uCisgKiAKKyAqIDxwcmU+CisgKiAKKyAqICAgICZsdDtqbXhPcGVuCisgKiAgICAgICAgICAgIGhvc3Q9JnF1b3Q7MTI3LjAuMC4xJnF1b3Q7CisgKiAgICAgICAgICAgIHBvcnQ9JnF1b3Q7OTAxNCZxdW90OworICogICAgICAgICAgICB1c2VybmFtZT0mcXVvdDttb25pdG9yUm9sZSZxdW90OworICogICAgICAgICAgICBwYXNzd29yZD0mcXVvdDtteXNlY3JldCZxdW90OworICogICAgICAgICAgICByZWY9JnF1b3Q7am14Lm15c2VydmVyJnF1b3Q7IAorICogICAgICAgIC8mZ3Q7CisgKiAgCisgKiA8L3ByZT4KKyAqIAorICogQWxsIGNhbGxzIGFmdGVyIG9wZW5pbmcgd2l0aCBzYW1lIHJlZmlkIHJldXNlIHRoZSBjb25uZWN0aW9uLgorICogPHA+CisgKiBGaXJzdCBjYWxsIHRvIGEgcmVtb3RlIE1CZWFuc2VydmVyIHNhdmUgdGhlIEpNWENvbm5lY3Rpb24gYSByZWZlcmVuegorICogPGVtPmpteC5zZXJ2ZXI8L2VtPgorICogPC9wPgorICogQWxsIEpNWEFjY2Vzc29yWFhYVGFzayBzdXBwb3J0IHRoZSBhdHRyaWJ1dGUgPGVtPmlmPC9lbT4gYW5kCisgKiA8ZW0+dW5sZXNzPC9lbT4uIFdpdGggPGVtPmlmPC9lbT4gdGhlIHRhc2sgaXMgb25seSBleGVjdXRlIHdoZW4gcHJvcGVydHkKKyAqIGV4aXN0IGFuZCB3aXRoIDxlbT51bmxlc3M8L2VtPiB3aGVuIHByb3BlcnR5IG5vdCBleGlzdHMuIDxici8+PGI+Tk9URQorICogPC9iPjogVGhlc2UgdGFza3MgcmVxdWlyZSBBbnQgMS42IG9yIGxhdGVyIGludGVyZmFjZS4KKyAqIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA1LjUuMTAKKyAqLworCitwdWJsaWMgY2xhc3MgSk1YQWNjZXNzb3JUYXNrIGV4dGVuZHMgQmFzZVJlZGlyZWN0b3JIZWxwZXJUYXNrIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSk1YX1NFUlZJQ0VfUFJFRklYID0gInNlcnZpY2U6am14OnJtaTovLy9qbmRpL3JtaTovLyI7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKTVhfU0VSVklDRV9TVUZGSVggPSAiL2pteHJtaSI7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKworICAgIHByaXZhdGUgU3RyaW5nIHJlc3VsdHByb3BlcnR5OworCisgICAgcHJpdmF0ZSBTdHJpbmcgdXJsID0gbnVsbDsKKworICAgIHByaXZhdGUgU3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKKworICAgIHByaXZhdGUgU3RyaW5nIHBvcnQgPSAiODA1MCI7CisKKyAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisKKyAgICBwcml2YXRlIFN0cmluZyB1c2VybmFtZSA9IG51bGw7CisKKyAgICBwcml2YXRlIFN0cmluZyByZWYgPSAiam14LnNlcnZlciI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZWNobyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBib29sZWFuIHNlcGFyYXRlYXJyYXlyZXN1bHRzID0gdHJ1ZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGRlbGltaXRlcjsKKworICAgIHByaXZhdGUgU3RyaW5nIHVubGVzc0NvbmRpdGlvbjsKKworICAgIHByaXZhdGUgU3RyaW5nIGlmQ29uZGl0aW9uOworCisgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgSW5mbworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LkpNWEFjY2Vzc29yVGFzay8xLjEiOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24gYW5kIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIHVzZWQgYXQgcmVtb3RlIE1iZWFuU2VydmVyCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5uYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBvYmplY3ROYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG9iamVjdE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByZXN1bHRwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3VsdHByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gcmVzdWx0cHJvcGVydHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgcmVzdWx0cHJvcGVydHkgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc3VsdHByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgdGhpcy5yZXN1bHRwcm9wZXJ0eSA9IHByb3BlcnR5TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlbGltaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlbGltaXRlcigpIHsKKyAgICAgICAgcmV0dXJuIGRlbGltaXRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc2VwYXJhdG9yIFRoZSBkZWxpbWl0ZXIgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlbGltaXRlcihTdHJpbmcgc2VwYXJhdG9yKSB7CisgICAgICAgIHRoaXMuZGVsaW1pdGVyID0gc2VwYXJhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZWNoby4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VjaG8oKSB7CisgICAgICAgIHJldHVybiBlY2hvOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBlY2hvCisgICAgICogICAgICAgICAgICBUaGUgZWNobyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RWNobyhib29sZWFuIGVjaG8pIHsKKyAgICAgICAgdGhpcy5lY2hvID0gZWNobzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcGFyYXRlYXJyYXlyZXN1bHRzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2VwYXJhdGVhcnJheXJlc3VsdHMoKSB7CisgICAgICAgIHJldHVybiBzZXBhcmF0ZWFycmF5cmVzdWx0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc2VwYXJhdGVBcnJheVJlc3VsdHMKKyAgICAgKiAgICAgICAgICAgIFRoZSBzZXBhcmF0ZWFycmF5cmVzdWx0cyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VwYXJhdGVhcnJheXJlc3VsdHMoYm9vbGVhbiBzZXBhcmF0ZUFycmF5UmVzdWx0cykgeworICAgICAgICB0aGlzLnNlcGFyYXRlYXJyYXlyZXN1bHRzID0gc2VwYXJhdGVBcnJheVJlc3VsdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGxvZ2luIHBhc3N3b3JkIGZvciB0aGUgPGNvZGU+TWFuYWdlcjwvY29kZT4gYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhc3N3b3JkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBsb2dpbiB1c2VybmFtZSBmb3IgdGhlIDxjb2RlPkpNWDwvY29kZT4gTUJlYW5TZXJ2ZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnVzZXJuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VybmFtZShTdHJpbmcgdXNlcm5hbWUpIHsKKyAgICAgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBVUkwgb2YgdGhlIDxjb2RlPkpNWCBKU1IgMTYwPC9jb2RlPiBNQmVhblNlcnZlciB0byBiZSB1c2VkLgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CisgICAgICAgIHJldHVybiAodGhpcy51cmwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7CisgICAgICAgIHRoaXMudXJsID0gdXJsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBIb3N0IG9mIHRoZSA8Y29kZT5KTVggSlNSIDE2MDwvY29kZT4gTUJlYW5TZXJ2ZXIgdG8gYmUgdXNlZC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmhvc3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKKyAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgUG9ydCBvZiB0aGUgPGNvZGU+Sk1YIEpTUiAxNjA8L2NvZGU+IE1CZWFuU2VydmVyIHRvIGJlIHVzZWQuCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBvcnQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wb3J0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KFN0cmluZyBwb3J0KSB7CisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB1c2VSZWYuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNVc2VSZWYoKSB7CisgICAgICAgIHJldHVybiByZWYgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHJlZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByZWYuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZWYoKSB7CisgICAgICAgIHJldHVybiByZWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHJlZklkIFRoZSByZWYgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZihTdHJpbmcgcmVmSWQpIHsKKyAgICAgICAgdGhpcy5yZWYgPSByZWZJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlmQ29uZGl0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWYoKSB7CisgICAgICAgIHJldHVybiBpZkNvbmRpdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbmx5IGV4ZWN1dGUgaWYgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMgaW4gdGhlIGN1cnJlbnQKKyAgICAgKiBwcm9qZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjIHByb3BlcnR5IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZihTdHJpbmcgYykgeworICAgICAgICBpZkNvbmRpdGlvbiA9IGM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB1bmxlc3NDb25kaXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVbmxlc3MoKSB7CisgICAgICAgIHJldHVybiB1bmxlc3NDb25kaXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogT25seSBleGVjdXRlIGlmIGEgcHJvcGVydHkgb2YgdGhlIGdpdmVuIG5hbWUgZG9lcyBub3QgZXhpc3QgaW4gdGhlCisgICAgICogY3VycmVudCBwcm9qZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjIHByb3BlcnR5IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbmxlc3MoU3RyaW5nIGMpIHsKKyAgICAgICAgdW5sZXNzQ29uZGl0aW9uID0gYzsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLiBUaGlzIGxvZ2ljIG9ubHkgcGVyZm9ybXMgdGhlIGNvbW1vbgorICAgICAqIGF0dHJpYnV0ZSB2YWxpZGF0aW9uIHJlcXVpcmVkIGJ5IGFsbCBzdWJjbGFzc2VzOyBpdCBkb2VzIG5vdCBwZXJmb3JtIGFueQorICAgICAqIGZ1bmN0aW9uYWwgbG9naWMgZGlyZWN0bHkuCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGEgdmFsaWRhdGlvbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRlc3RJZkNvbmRpdGlvbigpICYmIHRlc3RVbmxlc3NDb25kaXRpb24oKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3IgPSBudWxsOworCisgICAgICAgICAgICAgICAgTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGpteFNlcnZlckNvbm5lY3Rpb24gPSBnZXRKTVhDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBqbXhFeGVjdXRlKGpteFNlcnZlckNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsICYmIGlzRmFpbE9uRXJyb3IoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBvbmx5IGlmIGZhaWxPbkVycm9yID09IHRydWUKKyAgICAgICAgICAgICAgICAgICAgLy8gb3IgZXJyb3IgbGluZSB3aWxsIGJlIGxvZ2dlZCB0d2ljZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXJyb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgaWYgKGlzRmFpbE9uRXJyb3IoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24odCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3JPdXRwdXQodC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2xvc2VSZWRpcmVjdG9yKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGUgYSBuZXcgSk1YIENvbm5lY3Rpb24gd2l0aCBhdXRoIHdoZW4gdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGlzIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1CZWFuU2VydmVyQ29ubmVjdGlvbiBjcmVhdGVKTVhDb25uZWN0aW9uKFN0cmluZyB1cmwsCisgICAgICAgICAgICBTdHJpbmcgaG9zdCwgU3RyaW5nIHBvcnQsIFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKQorICAgICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdXJsRm9ySk1YOworICAgICAgICBpZiAodXJsICE9IG51bGwpCisgICAgICAgICAgICB1cmxGb3JKTVggPSB1cmw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVybEZvckpNWCA9IEpNWF9TRVJWSUNFX1BSRUZJWCArIGhvc3QgKyAiOiIgKyBwb3J0CisgICAgICAgICAgICAgICAgICAgICsgSk1YX1NFUlZJQ0VfU1VGRklYOworICAgICAgICBNYXAgZW52aXJvbm1lbnQgPSBudWxsOworICAgICAgICBpZiAodXNlcm5hbWUgIT0gbnVsbCAmJiBwYXNzd29yZCAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmdbXSBjcmVkZW50aWFscyA9IG5ldyBTdHJpbmdbMl07CisgICAgICAgICAgICBjcmVkZW50aWFsc1swXSA9IHVzZXJuYW1lOworICAgICAgICAgICAgY3JlZGVudGlhbHNbMV0gPSBwYXNzd29yZDsKKyAgICAgICAgICAgIGVudmlyb25tZW50ID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgIGVudmlyb25tZW50LnB1dChKTVhDb25uZWN0b3IuQ1JFREVOVElBTFMsIGNyZWRlbnRpYWxzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSk1YQ29ubmVjdG9yRmFjdG9yeS5jb25uZWN0KG5ldyBKTVhTZXJ2aWNlVVJMKHVybEZvckpNWCksCisgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQpLmdldE1CZWFuU2VydmVyQ29ubmVjdGlvbigpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCB0aGUgaWYgY29uZGl0aW9uCisgICAgICogCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIG5vIGlmIGNvbmRpdGlvbiwgb3IgdGhlIG5hbWVkIHByb3BlcnR5IGV4aXN0cworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHRlc3RJZkNvbmRpdGlvbigpIHsKKyAgICAgICAgaWYgKGlmQ29uZGl0aW9uID09IG51bGwgfHwgIiIuZXF1YWxzKGlmQ29uZGl0aW9uKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5KGlmQ29uZGl0aW9uKSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhlIHVubGVzcyBjb25kaXRpb24KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgbm8gdW5sZXNzIGNvbmRpdGlvbiwgb3IgdGhlcmUgaXMgYSBuYW1lZAorICAgICAqICAgICAgICAgcHJvcGVydHkgYnV0IGl0IGRvZXNuJ3QgZXhpc3QKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0ZXN0VW5sZXNzQ29uZGl0aW9uKCkgeworICAgICAgICBpZiAodW5sZXNzQ29uZGl0aW9uID09IG51bGwgfHwgIiIuZXF1YWxzKHVubGVzc0NvbmRpdGlvbikpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eSh1bmxlc3NDb25kaXRpb24pID09IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IEN1cnJlbnQgQ29ubmVjdGlvbiBmcm9tIDxlbT5yZWY8L2VtPiBwYXJhbWV0ZXIgb3IgY3JlYXRlIGEgbmV3IG9uZSEKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBzZXJ2ZXIgY29ubmVjdGlvbgorICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGFjY2Vzc0pNWENvbm5lY3Rpb24oUHJvamVjdCBwcm9qZWN0LAorICAgICAgICAgICAgU3RyaW5nIHVybCwgU3RyaW5nIGhvc3QsIFN0cmluZyBwb3J0LCBTdHJpbmcgdXNlcm5hbWUsCisgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQsIFN0cmluZyByZWZJZCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGpteFNlcnZlckNvbm5lY3Rpb24gPSBudWxsOworICAgICAgICBib29sZWFuIGlzUmVmID0gcHJvamVjdCAhPSBudWxsICYmIHJlZklkICE9IG51bGwgJiYgcmVmSWQubGVuZ3RoKCkgPiAwOworICAgICAgICBpZiAoaXNSZWYpIHsKKyAgICAgICAgICAgIE9iamVjdCBwcmVmID0gcHJvamVjdC5nZXRSZWZlcmVuY2UocmVmSWQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBqbXhTZXJ2ZXJDb25uZWN0aW9uID0gKE1CZWFuU2VydmVyQ29ubmVjdGlvbikgcHJlZjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3QubG9nKCJ3cm9uZyBvYmplY3QgcmVmZXJlbmNlICIgKyByZWZJZCArICIgLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcmVmLmdldENsYXNzKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoam14U2VydmVyQ29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBqbXhTZXJ2ZXJDb25uZWN0aW9uID0gY3JlYXRlSk1YQ29ubmVjdGlvbih1cmwsIGhvc3QsIHBvcnQsCisgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUmVmICYmIGpteFNlcnZlckNvbm5lY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UocmVmSWQsIGpteFNlcnZlckNvbm5lY3Rpb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBqbXhTZXJ2ZXJDb25uZWN0aW9uOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcm90ZWN0ZWQgTWV0aG9kcworCisgICAgLyoqCisgICAgICogZ2V0IEpNWENvbm5lY3Rpb24KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBjb25uZWN0aW9uCisgICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIE1CZWFuU2VydmVyQ29ubmVjdGlvbiBnZXRKTVhDb25uZWN0aW9uKCkKKyAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBNQmVhblNlcnZlckNvbm5lY3Rpb24gam14U2VydmVyQ29ubmVjdGlvbiA9IG51bGw7CisgICAgICAgIGlmIChpc1VzZVJlZigpKSB7CisgICAgICAgICAgICBPYmplY3QgcHJlZiA9IG51bGwgOworICAgICAgICAgICAgaWYoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwcmVmID0gZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZShnZXRSZWYoKSk7CisgICAgICAgICAgICAgICAgaWYgKHByZWYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgam14U2VydmVyQ29ubmVjdGlvbiA9IChNQmVhblNlcnZlckNvbm5lY3Rpb24pIHByZWY7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldyb25nIG9iamVjdCByZWZlcmVuY2UgIiArIGdldFJlZigpICsgIiAtICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJlZi5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpteFNlcnZlckNvbm5lY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGpteFNlcnZlckNvbm5lY3Rpb24gPSBhY2Nlc3NKTVhDb25uZWN0aW9uKGdldFByb2plY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFVybCgpLCBnZXRIb3N0KCksIGdldFBvcnQoKSwgZ2V0VXNlcm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhc3N3b3JkKCksIGdldFJlZigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGpteFNlcnZlckNvbm5lY3Rpb24gPSBhY2Nlc3NKTVhDb25uZWN0aW9uKGdldFByb2plY3QoKSwgZ2V0VXJsKCksCisgICAgICAgICAgICAgICAgICAgIGdldEhvc3QoKSwgZ2V0UG9ydCgpLCBnZXRVc2VybmFtZSgpLCBnZXRQYXNzd29yZCgpLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gam14U2VydmVyQ29ubmVjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCwgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgcHJvcGVydGllcy4gVGhlCisgICAgICogaW5wdXQgc3RyZWFtIHdpbGwgYmUgY2xvc2VkIHVwb24gY29tcGxldGlvbiBvZiB0aGlzIHRhc2ssIHdoZXRoZXIgaXQgd2FzCisgICAgICogZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdC4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgam14RXhlY3V0ZShNQmVhblNlcnZlckNvbm5lY3Rpb24gam14U2VydmVyQ29ubmVjdGlvbikKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmICgoam14U2VydmVyQ29ubmVjdGlvbiA9PSBudWxsKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJNdXN0IG9wZW4gYSBjb25uZWN0aW9uISIpOworICAgICAgICB9IGVsc2UgaWYgKGlzRWNobygpKSB7CisgICAgICAgICAgICBoYW5kbGVPdXRwdXQoIkpNWCBDb25uZWN0aW9uIHJlZj0iICsgcmVmICsgIiBpcyBvcGVuISIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgc3RyaW5nIHRvIGRhdGF0eXBlIEZJWE1FIEhvdyB3ZSBjYW4gdHJhbnNmZXIgdmFsdWVzIGZyb20gYW50CisgICAgICogcHJvamVjdCByZWZlcmVuY2Ugc3RvcmUgKHJlZik/CisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZQorICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUgVGhlIHR5cGUKKyAgICAgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQgb2JqZWN0CisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9UeXBlKFN0cmluZyB2YWx1ZSwgU3RyaW5nIHZhbHVlVHlwZSkgeworICAgICAgICBpZiAoImphdmEubGFuZy5TdHJpbmciLmVxdWFscyh2YWx1ZVR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworCisgICAgICAgIE9iamVjdCBjb252ZXJ0VmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgaWYgKCJqYXZhLmxhbmcuSW50ZWdlciIuZXF1YWxzKHZhbHVlVHlwZSkgfHwgImludCIuZXF1YWxzKHZhbHVlVHlwZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29udmVydFZhbHVlID0gbmV3IEludGVnZXIodmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKGlzRWNobygpKQorICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvck91dHB1dCgiVW5hYmxlIHRvIGNvbnZlcnQgdG8gaW50ZWdlcjoiICsgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCJqYXZhLmxhbmcuTG9uZyIuZXF1YWxzKHZhbHVlVHlwZSkKKyAgICAgICAgICAgICAgICB8fCAibG9uZyIuZXF1YWxzKHZhbHVlVHlwZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29udmVydFZhbHVlID0gbmV3IExvbmcodmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKGlzRWNobygpKQorICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvck91dHB1dCgiVW5hYmxlIHRvIGNvbnZlcnQgdG8gbG9uZzoiICsgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCJqYXZhLmxhbmcuQm9vbGVhbiIuZXF1YWxzKHZhbHVlVHlwZSkKKyAgICAgICAgICAgICAgICB8fCAiYm9vbGVhbiIuZXF1YWxzKHZhbHVlVHlwZSkpIHsKKyAgICAgICAgICAgIGNvbnZlcnRWYWx1ZSA9IG5ldyBCb29sZWFuKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICgiamF2YS5sYW5nLkZsb2F0Ii5lcXVhbHModmFsdWVUeXBlKQorICAgICAgICAgICAgICAgIHx8ICJmbG9hdCIuZXF1YWxzKHZhbHVlVHlwZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29udmVydFZhbHVlID0gbmV3IEZsb2F0KHZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGlmIChpc0VjaG8oKSkKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3JPdXRwdXQoIlVuYWJsZSB0byBjb252ZXJ0IHRvIGZsb2F0OiIgKyB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoImphdmEubGFuZy5Eb3VibGUiLmVxdWFscyh2YWx1ZVR5cGUpCisgICAgICAgICAgICAgICAgfHwgImRvdWJsZSIuZXF1YWxzKHZhbHVlVHlwZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29udmVydFZhbHVlID0gbmV3IERvdWJsZSh2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNFY2hvKCkpCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yT3V0cHV0KCJVbmFibGUgdG8gY29udmVydCB0byBkb3VibGU6IiArIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgiamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lIi5lcXVhbHModmFsdWVUeXBlKQorICAgICAgICAgICAgICAgIHx8ICJuYW1lIi5lcXVhbHModmFsdWVUeXBlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb252ZXJ0VmFsdWUgPSBuZXcgT2JqZWN0TmFtZSh2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNFY2hvKCkpCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yT3V0cHV0KCJVbmFibGUgdG8gY29udmVydCB0byBPYmplY3ROYW1lOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgiamF2YS5uZXQuSW5ldEFkZHJlc3MiLmVxdWFscyh2YWx1ZVR5cGUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbnZlcnRWYWx1ZSA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZSh2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNFY2hvKCkpCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yT3V0cHV0KCJVbmFibGUgdG8gcmVzb2x2ZSBob3N0IG5hbWU6IiArIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29udmVydFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBuYW1lIGNvbnRleHQgb2YgcmVzdWx0CisgICAgICogQHBhcmFtIHJlc3VsdAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGVjaG9SZXN1bHQoU3RyaW5nIG5hbWUsIE9iamVjdCByZXN1bHQpIHsKKyAgICAgICAgaWYgKGlzRWNobygpKSB7CisgICAgICAgICAgICBpZiAocmVzdWx0LmdldENsYXNzKCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBcnJheS5nZXRMZW5ndGgocmVzdWx0KTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZU91dHB1dChuYW1lICsgIi4iICsgaSArICI9IiArIEFycmF5LmdldChyZXN1bHQsIGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBoYW5kbGVPdXRwdXQobmFtZSArICI9IiArIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGUgcmVzdWx0IGFzIHByb3BlcnR5IHdpdGggbmFtZSBmcm9tIGF0dHJpYnV0ZSByZXN1bHRwcm9wZXJ0eQorICAgICAqIAorICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIHJlc3VsdAorICAgICAqIEBzZWUgI2NyZWF0ZVByb3BlcnR5KFN0cmluZywgT2JqZWN0KQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb3BlcnR5KE9iamVjdCByZXN1bHQpIHsKKyAgICAgICAgaWYgKHJlc3VsdHByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdHByb3BlcnR5LCByZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlIHJlc3VsdCBhcyBwcm9wZXJ0eSB3aXRoIG5hbWUgZnJvbSBwcm9wZXJ0eSBwcmVmaXggV2hlbiByZXN1bHQgaXMKKyAgICAgKiBhbiBhcnJheSBhbmQgaXNTZXBhcmF0ZUFycmF5UmVzdWx0cyBpcyB0cnVlLCByZXN1bHRwcm9wZXJ0eSB1c2VkIGFzCisgICAgICogcHJlZml4ICg8Y29kZT5yZXN1bHRwcm9wZXJ0eS4wLWFycmF5Lmxlbmd0aDwvY29kZT4gYW5kIHN0b3JlIHRoZQorICAgICAqIHJlc3VsdCBhcnJheSBsZW5ndGggYXQgPGNvZGU+cmVzdWx0cHJvcGVydHkubGVuZ3RoPC9jb2RlPi4gT3RoZXIKKyAgICAgKiBvcHRpb24gaXMgdGhhdCB5b3UgZGVsZW1pdCB5b3VyIHJlc3VsdCB3aXRoIGEgZGVsaW1pdGVyCisgICAgICogKGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIgaXMgdXNlZCkuCisgICAgICogCisgICAgICogQHBhcmFtIHByb3BlcnR5UHJlZml4CisgICAgICogQHBhcmFtIHJlc3VsdAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eVByZWZpeCwgT2JqZWN0IHJlc3VsdCkgeworICAgICAgICBpZiAocHJvcGVydHlQcmVmaXggPT0gbnVsbCkKKyAgICAgICAgICAgIHByb3BlcnR5UHJlZml4ID0gIiI7CisgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBDb21wb3NpdGVEYXRhU3VwcG9ydCkgeworICAgICAgICAgICAgQ29tcG9zaXRlRGF0YVN1cHBvcnQgZGF0YSA9IChDb21wb3NpdGVEYXRhU3VwcG9ydCkgcmVzdWx0OworICAgICAgICAgICAgQ29tcG9zaXRlVHlwZSBjb21wb3NpdGVUeXBlID0gZGF0YS5nZXRDb21wb3NpdGVUeXBlKCk7CisgICAgICAgICAgICBTZXQga2V5cyA9IGNvbXBvc2l0ZVR5cGUua2V5U2V0KCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBkYXRhLmdldChrZXkpOworICAgICAgICAgICAgICAgIE9wZW5UeXBlIHR5cGUgPSBjb21wb3NpdGVUeXBlLmdldFR5cGUoa2V5KTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFNpbXBsZVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UHJvcGVydHkocHJvcGVydHlQcmVmaXggKyAiLiIgKyBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjcmVhdGVQcm9wZXJ0eShwcm9wZXJ0eVByZWZpeCArICIuIiArIGtleSwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBUYWJ1bGFyRGF0YVN1cHBvcnQpIHsKKyAgICAgICAgICAgIFRhYnVsYXJEYXRhU3VwcG9ydCBkYXRhID0gKFRhYnVsYXJEYXRhU3VwcG9ydCkgcmVzdWx0OworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZGF0YS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyMSA9ICgoTGlzdCkga2V5KS5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBrZXkxID0gaXRlcjEubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGVEYXRhIHZhbHVlZGF0YSA9IGRhdGEuZ2V0KG5ldyBPYmplY3RbXSB7IGtleTEgfSk7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHZhbHVlZGF0YS5nZXQoInZhbHVlIik7CisgICAgICAgICAgICAgICAgICAgIE9wZW5UeXBlIHR5cGUgPSB2YWx1ZWRhdGEuZ2V0Q29tcG9zaXRlVHlwZSgpLmdldFR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIik7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgU2ltcGxlVHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvcGVydHkocHJvcGVydHlQcmVmaXggKyAiLiIgKyBrZXkxLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVQcm9wZXJ0eShwcm9wZXJ0eVByZWZpeCArICIuIiArIGtleTEsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIGlmIChpc1NlcGFyYXRlYXJyYXlyZXN1bHRzKCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBcnJheS5nZXRMZW5ndGgocmVzdWx0KTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXRQcm9wZXJ0eShwcm9wZXJ0eVByZWZpeCArICIuIiArIHNpemUsIEFycmF5LmdldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsIGkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eShwcm9wZXJ0eVByZWZpeCArICIuTGVuZ3RoIiwgSW50ZWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZyhzaXplKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIGRlbGltID0gZ2V0RGVsaW1pdGVyKCk7CisgICAgICAgICAgICBpZiAoZGVsaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCksIGRlbGltKTsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgZm9yICg7IHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7KSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNldFByb3BlcnR5KHByb3BlcnR5UHJlZml4ICsgIi4iICsgc2l6ZSwgdG9rZW4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPiAwKQorICAgICAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eShwcm9wZXJ0eVByZWZpeCArICIuTGVuZ3RoIiwgSW50ZWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZyhzaXplKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNldFByb3BlcnR5KHByb3BlcnR5UHJlZml4LCByZXN1bHQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgYWxsIHByb3BlcnRpZXMsIHdoZW4gcHJvamVjdCBpcyB0aGVyZSBnb3QgYWxsIHByb2plY3QgUHJvcGVydGllcworICAgICAqIEByZXR1cm4gcHJvcGVydGllcworICAgICAqLworICAgIHB1YmxpYyBNYXAgZ2V0UHJvcGVydGllcygpIHsKKyAgICAgICAgUHJvamVjdCBjdXJyZW50UHJvamVjdCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgaWYgKGN1cnJlbnRQcm9qZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50UHJvamVjdC5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcHJvcGVydGllczsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIGdldCBhbGwgUHJvcGVydGllcworICAgICAqIEBwYXJhbSBwcm9wZXJ0eQorICAgICAqIEByZXR1cm4gVGhlIHByb3BlcnR5CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgUHJvamVjdCBjdXJyZW50UHJvamVjdCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgaWYgKGN1cnJlbnRQcm9qZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50UHJvamVjdC5nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5CisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZQorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBzdWNjZXNzZnVsCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHZhbHVlID0gIiI7CisgICAgICAgICAgICBpZiAoaXNFY2hvKCkpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVPdXRwdXQocHJvcGVydHkgKyAiPSIgKyB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFByb2plY3QgY3VycmVudFByb2plY3QgPSBnZXRQcm9qZWN0KCk7CisgICAgICAgICAgICBpZiAoY3VycmVudFByb2plY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9qZWN0LnNldE5ld1Byb3BlcnR5KHByb3BlcnR5LCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvSk1YQWNjZXNzb3JVbnJlZ2lzdGVyVGFzay5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvSk1YQWNjZXNzb3JVbnJlZ2lzdGVyVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMzdkZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L2pteC9KTVhBY2Nlc3NvclVucmVnaXN0ZXJUYXNrLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5qbXg7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiB1bnJlZ2lzdGVyIGEgTUJlYW4gYXQgPGVtPkpNWDwvZW0+IEpTUiAxNjAgTUJlYW5zIFNlcnZlci4gCisgKiA8dWw+CisgKiA8bGk+dW5yZWdpc3RlciBNYmVhbnM8L2xpPgorICogPC91bD4KKyAqIDxwPgorICogRXhhbXBsZXM6CisgKiA8YnIvPgorICogdW5yZWdpc3RlciBhbiBleGlzdGluZyBNYmVhbiBhdCBqbXguc2VydmVyIGNvbm5lY3Rpb24gCisgKiA8cHJlPgorICogICAmbHQ7am14OnVucmVnaXN0ZXIKKyAqICAgICAgICAgICByZWY9ImpteC5zZXJ2ZXIiCisgKiAgICAgICAgICAgbmFtZT0iQ2F0YWxpbmE6dHlwZT1NQmVhbkZhY3RvcnkiIC8mZ3Q7CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIDxwPgorICogPGI+V0FSTklORzwvYj5Ob3QgYWxsIFRvbWNhdCBNQmVhbnMgY2FuIHN1Y2Nlc3NmdWxseSB1bnJlZ2lzdGVyIHJlbW90ZWx5LiBUaGUgbWJlYW4KKyAqIHVucmVnaXN0cmF0aW9uIGRvbid0IHJlbW92ZSB2YWx2ZXMsIHJlYWxtLCAuLiBmcm9tIHBhcmVudCBjbGFzcy4KKyAqIFBsZWFzZSwgdXNlIHRoZSBNQmVhbkZhY3Rvcnkgb3BlcmF0aW9uIHRvIHJlbW92ZSB2YWx2ZXMgYW5kIHJlYWxtcy4KKyAqIDwvcD4KKyAqIDxwPgorICogRmlyc3QgY2FsbCB0byBhIHJlbW90ZSBNQmVhbnNlcnZlciBzYXZlIHRoZSBKTVhDb25uZWN0aW9uIGEgcmVmZXJlbmNlIDxlbT5qbXguc2VydmVyPC9lbT4KKyAqIDwvcD4KKyAqIFRoZXNlIHRhc2tzIHJlcXVpcmUgQW50IDEuNiBvciBsYXRlciBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogQHNpbmNlIDUuNS4xMgorICovCitwdWJsaWMgY2xhc3MgSk1YQWNjZXNzb3JVbnJlZ2lzdGVyVGFzayBleHRlbmRzIEpNWEFjY2Vzc29yVGFzayB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBJbmZvCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuSk1YQWNjZXNzb3JVbnJlZ2lzdGVyVGFzay8xLjAiOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24gYW5kIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGFzcyBpbmZvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcm90ZWN0ZWQgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLCBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBwcm9wZXJ0aWVzLiBUaGUKKyAgICAgKiBpbnB1dCBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgdXBvbiBjb21wbGV0aW9uIG9mIHRoaXMgdGFzaywgd2hldGhlciBpdCB3YXMKKyAgICAgKiBleGVjdXRlZCBzdWNjZXNzZnVsbHkgb3Igbm90LgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBqbXhFeGVjdXRlKE1CZWFuU2VydmVyQ29ubmVjdGlvbiBqbXhTZXJ2ZXJDb25uZWN0aW9uKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTXVzdCBzcGVjaWZ5IGEgJ25hbWUnIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICBqbXhVdXJlZ2lzdGVyKGpteFNlcnZlckNvbm5lY3Rpb24sIGdldE5hbWUoKSk7CisgICAgIH0KKworCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlciBNYmVhbgorICAgICAqIEBwYXJhbSBqbXhTZXJ2ZXJDb25uZWN0aW9uCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gbmFtZWQgYXR0cmlidXRlCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGpteFV1cmVnaXN0ZXIoTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGpteFNlcnZlckNvbm5lY3Rpb24sU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZXJyb3IgPSBudWxsOworICAgICAgICBpZihpc0VjaG8oKSkgeworICAgICAgICAgICAgaGFuZGxlT3V0cHV0KCJVbnJlZ2lzdGVyIE1CZWFuICIgKyBuYW1lICApOworICAgICAgICB9CisgICAgICAgIGpteFNlcnZlckNvbm5lY3Rpb24udW5yZWdpc3Rlck1CZWFuKAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKG5hbWUpKTsKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvYW50bGliLnhtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvam14L2FudGxpYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkMjc3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvam14L2FudGxpYi54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxhbnRsaWI+CisgIDx0eXBlZGVmCisgICAgICAgIG5hbWU9Im9wZW4iCisgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuam14LkpNWEFjY2Vzc29yVGFzayIgLz4KKyAgPHR5cGVkZWYKKyAgICAgICAgbmFtZT0ic2V0IgorICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LmpteC5KTVhBY2Nlc3NvclNldFRhc2siIC8+CisgIDx0eXBlZGVmCisgICAgICAgIG5hbWU9ImdldCIKKyAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5qbXguSk1YQWNjZXNzb3JHZXRUYXNrIiAvPgorICA8dHlwZWRlZgorICAgICAgICBuYW1lPSJpbnZva2UiCisgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuam14LkpNWEFjY2Vzc29ySW52b2tlVGFzayIgLz4KKyAgPHR5cGVkZWYKKyAgICAgICAgbmFtZT0icXVlcnkiCisgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuam14LkpNWEFjY2Vzc29yUXVlcnlUYXNrIiAvPgorICA8dHlwZWRlZgorICAgICAgICBuYW1lPSJjcmVhdGUiCisgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuam14LkpNWEFjY2Vzc29yQ3JlYXRlVGFzayIgLz4KKyAgPHR5cGVkZWYKKyAgICAgICAgbmFtZT0idW5yZWdpc3RlciIKKyAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5qbXguSk1YQWNjZXNzb3JVbnJlZ2lzdGVyVGFzayIgLz4KKyAgPHR5cGVkZWYKKyAgICAgICAgbmFtZT0iZXF1YWxzIgorICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LmpteC5KTVhBY2Nlc3NvckVxdWFsc0NvbmRpdGlvbiIgLz4KKyAgPHR5cGVkZWYKKyAgICAgICAgbmFtZT0iY29uZGl0aW9uIgorICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LmpteC5KTVhBY2Nlc3NvckNvbmRpdGlvbiIgLz4KKzwvYW50bGliPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvam14L2pteGFjY2Vzc29yLnRhc2tzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvam14YWNjZXNzb3IudGFza3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3ZTg5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvam14L2pteGFjY2Vzc29yLnRhc2tzCkBAIC0wLDAgKzEsOCBAQAorIyBKTVgKK2pteE9wZW49b3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuam14LkpNWEFjY2Vzc29yVGFzaworam14U2V0PW9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LmpteC5KTVhBY2Nlc3NvclNldFRhc2sKK2pteEdldD1vcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5qbXguSk1YQWNjZXNzb3JHZXRUYXNrCitqbXhJbnZva2U9b3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuam14LkpNWEFjY2Vzc29ySW52b2tlVGFzaworam14UXVlcnk9b3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuam14LkpNWEFjY2Vzc29yUXVlcnlUYXNrCitqbXhDcmVhdGU9b3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuam14LkpNWEFjY2Vzc29yQ3JlYXRlVGFzaworam14VW5yZWdpc3Rlcj1vcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5qbXguSk1YQWNjZXNzb3JVbnJlZ2lzdGVyVGFzawpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvcGFja2FnZS5odG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9qbXgvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OWRjODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L2pteC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw2MSBAQAorPGJvZHk+CisKKzxwPlRoaXMgcGFja2FnZSBjb250YWlucyBhIHNldCBvZiA8Y29kZT5KTVggVGFzazwvY29kZT4gaW1wbGVtZW50YXRpb25zIGZvcgorPGVtPkFudCAodmVyc2lvbiAxLjYgb3IgbGF0ZXIpPC9lbT4gdGhhdCBjYW4gYmUgdXNlZCB0byBpbnRlcmFjdCB3aXRoIHRoZQorUmVtb3RlIEpNWCBKU1IgMTYwIFJNSSBBZGFwdG9yIHRvIGdldC9zZXQgYXR0cmlidXRlcywgaW52b2tlIE1CZWFuIG9wZXJhdGlvbnMKK2FuZCBxdWVyeSBmb3IgTWJlYW5zIGluc2lkZSBhIHJ1bm5pbmcgaW5zdGFuY2Ugb2YgVG9tY2F0LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQorPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvdG9tY2F0LTUuNS1kb2MvbW9uaXRvcmluZy5odG1sIj4KK2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0L3RvbWNhdC01LjUtZG9jL21vbml0b3JpbmcuaHRtbDwvYT4uPC9wPgorCis8cD5FYWNoIHRhc2sgZWxlbWVudCBjYW4gb3BlbiBhIG5ldyBqbXggY29ubmVjdGlvbiBvciByZWZlcmVuY2UgYW4KKwlleGlzdGluZyBvbmUuIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlIGFyZSBleGlzdHMgaW4gZXZlcnkgdGFza3M6Cis8L3A+CisKKzx0YWJsZT4KKyAgPHRyPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTUlIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUlIj5EZXNjcmlwdGlvbjwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+dXJsPC90ZD4KKyAgICA8dGQ+CisgICAgICBUaGUgSk1YIENvbm5lY3Rpb24gVVJMIG9mIHRoZSByZW1vdGUgVG9tY2F0IE1CZWFuc1NlcnZlci4KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPnVzZXJuYW1lPC90ZD4KKyAgICA8dGQ+CisgICAgICBUaGUgdXNlcm5hbWUgb2YgYSBNQmVhblNlcnZlciBhdXRoLCB3aGVuIGNvbmZpZ3VyZWQuCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5wYXNzd29yZDwvdGQ+CisgICAgPHRkPgorICAgICAgVGhlIHBhc3N3b3JkIG9mIGEgTUJlYW5TZXJ2ZXIgYXV0aCwgd2hlbiBjb25maWd1cmVkLgorICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+aG9zdDwvdGQ+CisgICAgPHRkPgorICAgICAgVGhlIEpNWCBDb25uZWN0aW9uIGhvc3QuCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5wb3J0PC90ZD4KKyAgICA8dGQ+CisgICAgICBUaGUgSk1YIENvbm5lY3Rpb24gcG9ydC4KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPnJlZjwvdGQ+CisgICAgPHRkPgorICAgICAgVGhlIG5hbWUgb2YgdGhlIGFudCBpbnRlcm5hbCByZWZlcmVuY2UgZm9yIGEgam14IGNvbm5lY3Rpb24uCisgICAgPC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKworPHA+PHN0cm9uZz5OT1RFPC9zdHJvbmc+IC0gVGhpcyBUYXNrcyBvbmx5IHdvcmssIAorCXdoZW4gSlNSIDE2MCBNQmVhbiBBZGFwdG9yIGFzIHJlbW90ZSBqdm0gaXMgY29uZmlndXJlZC48L3A+CisKKzwvYm9keT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvcGFja2FnZS5odG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhYTQwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsODYgQEAKKzxib2R5PgorCis8cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgYSBzZXQgb2YgPGNvZGU+VGFzazwvY29kZT4gaW1wbGVtZW50YXRpb25zIGZvcgorPGVtPkFudCAodmVyc2lvbiAxLjYueCBvciBsYXRlcik8L2VtPiB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlCitNYW5hZ2VyIGFwcGxpY2F0aW9uIHRvIGRlcGxveSwgdW5kZXBsb3ksIGxpc3QsIHJlbG9hZCwgc3RhcnQgYW5kIHN0b3Agd2ViIGFwcGxpY2F0aW9ucyAKK2Zyb20gYSBydW5uaW5nIGluc3RhbmNlIG9mIFRvbWNhdC4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKKzxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0L3RvbWNhdC01LjUtZG9jL21hbmFnZXItaG93dG8uaHRtbCI+CitodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RvbWNhdC90b21jYXQtNS41LWRvYy9tYW5hZ2VyLWhvd3RvLmh0bWw8L2E+LjwvcD4KKworPHA+VGhlIGF0dHJpYnV0ZXMgb2YgZWFjaCB0YXNrIGVsZW1lbnQgY29ycmVzcG9uZAorZXhhY3RseSB0byB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzIHRoYXQgYXJlIGluY2x1ZGVkIHdpdGggYW4gSFRUUCByZXF1ZXN0CitzZW50IGRpcmVjdGx5IHRvIHRoZSBNYW5hZ2VyIGFwcGxpY2F0aW9uLiAgVGhleSBhcmUgc3VtbWFyaXplZCBhcyBmb2xsb3dzOgorPC9wPgorCis8dGFibGU+CisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgd2lkdGg9IjE1JSI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1JSI+RGVzY3JpcHRpb248L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPnVybDwvdGQ+CisgICAgPHRkPgorICAgICAgVGhlIFVSTCBvZiB0aGUgTWFuYWdlciB3ZWIgYXBwbGljYXRpb24geW91IHdpbGwgdXNlIHRvCisgICAgICBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9ucy4gIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvCisgICAgICA8Y29kZT5odHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlcjwvY29kZT4gKHdoaWNoIGNvcnJlc3BvbmRzCisgICAgICB0byBhIHN0YW5kYXJkIGluc3RhbGxhdGlvbiBvZiBUb21jYXQgNSkuCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj51c2VybmFtZTwvdGQ+CisgICAgPHRkPgorICAgICAgVGhlIHVzZXJuYW1lIG9mIGEgVG9tY2F0IHVzZXIgdGhhdCBoYXMgYmVlbiBjb25maWd1cmVkIHdpdGggdGhlCisgICAgICA8Y29kZT5tYW5hZ2VyPC9jb2RlPiByb2xlLCBhcyByZXF1aXJlZCB0byBleGVjdXRlIE1hbmFnZXIKKyAgICAgIGFwcGxpY2F0aW9uIGNvbW1hbmRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5wYXNzd29yZDwvdGQ+CisgICAgPHRkPgorICAgICAgVGhlIHBhc3N3b3JkIG9mIGEgVG9tY2F0IHVzZXIgdGhhdCBoYXMgYmVlbiBjb25maWd1cmVkIHdpdGggdGhlCisgICAgICA8Y29kZT5tYW5hZ2VyPC9jb2RlPiByb2xlLCBhcyByZXF1aXJlZCB0byBleGVjdXRlIE1hbmFnZXIKKyAgICAgIGFwcGxpY2F0aW9uIGNvbW1hbmRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5jb25maWc8L3RkPgorICAgIDx0ZD4KKyAgICAgIEEgVVJMIHBvaW50aW5nIGF0IHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZSAoaS5lLiBhIGZpbGUKKyAgICAgIGNvbnRhaW5pbmcgb25seSB0aGUgPGNvZGU+Jmx0O0NvbnRleHQmZ3Q7PC9jb2RlPiBlbGVtZW50LCBhbmQKKyAgICAgIGl0cyBuZXN0ZWQgZWxlbWVudHMsIGZyb20gPGNvZGU+c2VydmVyLnhtbDwvY29kZT4gZm9yIGEgcGFydGljdWxhcgorICAgICAgd2ViIGFwcGxpY2F0aW9uKS4gIFRoaXMgYXR0cmlidXRlIGlzIHN1cHBvcnRlZCBvbmx5IG9uIHRoZQorICAgICAgPGNvZGU+aW5zdGFsbDwvY29kZT4gdGFyZ2V0LCBhbmQgaXMgcmVxdWlyZWQgb25seSBpZiB5b3Ugd2lzaCB0bworICAgICAgaW5zdGFsbCBhbiBhcHBsaWNhdGlvbiB3aXRoIG5vbi1kZWZhdWx0IGNvbmZpZ3VyYXRpb24gY2hhcmFjdGVyaXN0aWNzLgorICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+cGF0aDwvdGQ+CisgICAgPHRkPgorICAgICAgVGhlIGNvbnRleHQgcGF0aCAoaW5jbHVkaW5nIHRoZSBsZWFkaW5nIHNsYXNoKSBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgICB0aGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgdG8gbWFuYWdlLCBvciBhIHplcm8tbGVuZ3RoIHN0cmluZyBmb3IgdGhlCisgICAgICBST09UIHdlYiBhcHBsaWNhdGlvbi4gIFRoaXMgYXR0cmlidXRlIGlzIHZhbGlkIGZvciB0aGUKKyAgICAgIDxjb2RlPmluc3RhbGw8L2NvZGU+LCA8Y29kZT5yZWxvYWQ8L2NvZGU+LCA8Y29kZT5yZW1vdmU8L2NvZGU+LAorICAgICAgPGNvZGU+c3RhcnQ8L2NvZGU+LCBhbmQgPGNvZGU+c3RvcDwvY29kZT4gdGFza3Mgb25seSwgYW5kIGlzCisgICAgICByZXF1aXJlZCBpbiBhbGwgb2YgdGhvc2UgY2FzZXMuCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj53YXI8L3RkPgorICAgIDx0ZD4KKyAgICAgIEEgPGNvZGU+amFyOjwvY29kZT4gVVJMIHRoYXQgcG9pbnRzIGF0IGEgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgKFdBUikKKyAgICAgIGZpbGUsIG9yIGEgPGNvZGU+ZmlsZTo8L2NvZGU+IFVSTCB0aGF0IHBvaW50cyBhdCBhbiB1bnBhY2tlZCBkaXJlY3RvcnkKKyAgICAgIGNvbnRhaW5pbmcgdGhlIHdlYiBhcHBsaWNhdGlvbi4gIFRoaXMgYXR0cmlidXRlIGlzIHN1cHBvcnRlZCBvbmx5IG9uCisgICAgICB0aGUgPGNvZGU+aW5zdGFsbDwvY29kZT4gdGFyZ2V0LiAgWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgb2YgdGhlCisgICAgICA8Y29kZT5jb25maWc8L2NvZGU+IGFuZCA8Y29kZT53YXI8L2NvZGU+IGF0dHJpYnV0ZXM7IGlmIHlvdSBzcGVjaWZ5CisgICAgICBib3RoLCB0aGUgPGNvZGU+d2FyPC9jb2RlPiBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHRoZSA8Y29kZT5kb2NCYXNlPC9jb2RlPgorICAgICAgYXR0cmlidXRlIGluIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICA8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+PHN0cm9uZz5OT1RFPC9zdHJvbmc+IC0gQ29tbWFuZHMgZXhlY3V0ZWQgdGhyb3VnaCB0aGUgPGVtPk1hbmFnZXI8L2VtPgorYXBwbGljYXRpb24gYXJlIDxzdHJvbmc+Tk9UPC9zdHJvbmc+IHJlZmxlY3RlZCBpbiB1cGRhdGVzIHRvIHRoZSBUb21jYXQKKzxjb2RlPnNlcnZlci54bWw8L2NvZGU+IGNvbmZpZ3VyYXRpb24gZmlsZSwgc28gdGhleSBkbyBub3QgcGVyc2lzdCBwYXN0IHRoZQorbmV4dCB0aW1lIHlvdSByZXN0YXJ0IHRoZSBlbnRpcmUgVG9tY2F0IGNvbnRhaW5lci48L3A+CisKKzwvYm9keT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0F1dGhlbnRpY2F0b3JCYXNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdG9yQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMjdiMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdG9yQmFzZS5qYXZhCkBAIC0wLDAgKzEsODg3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvcjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkF1dGhlbnRpY2F0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5QaXBlbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTG9naW5Db25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuU2VjdXJpdHlDb25zdHJhaW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5EYXRlVG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5WYWx2ZUJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKworLyoqCisgKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGI+VmFsdmU8L2I+IGludGVyZmFjZSB0aGF0IGVuZm9yY2VzIHRoZQorICogPGNvZGU+Jmx0O3NlY3VyaXR5LWNvbnN0cmFpbnQmZ3Q7PC9jb2RlPiBlbGVtZW50cyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCisgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgaW1wbGVtZW50ZWQgYXMgYSBWYWx2ZQorICogc28gdGhhdCBpdCBjYW4gYmUgb21taXR0ZWQgaW4gZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IHJlcXVpcmUgdGhlc2UKKyAqIGZlYXR1cmVzLiAgSW5kaXZpZHVhbCBpbXBsZW1lbnRhdGlvbnMgb2YgZWFjaCBzdXBwb3J0ZWQgYXV0aGVudGljYXRpb24KKyAqIG1ldGhvZCBjYW4gc3ViY2xhc3MgdGhpcyBiYXNlIGNsYXNzIGFzIHJlcXVpcmVkLgorICogPHA+CisgKiA8Yj5VU0FHRSBDT05TVFJBSU5UPC9iPjogIFdoZW4gdGhpcyBjbGFzcyBpcyB1dGlsaXplZCwgdGhlIENvbnRleHQgdG8KKyAqIHdoaWNoIGl0IGlzIGF0dGFjaGVkIChvciBhIHBhcmVudCBDb250YWluZXIgaW4gYSBoaWVyYXJjaHkpIG11c3QgaGF2ZSBhbgorICogYXNzb2NpYXRlZCBSZWFsbSB0aGF0IGNhbiBiZSB1c2VkIGZvciBhdXRoZW50aWNhdGluZyB1c2VycyBhbmQgZW51bWVyYXRpbmcKKyAqIHRoZSByb2xlcyB0byB3aGljaCB0aGV5IGhhdmUgYmVlbiBhc3NpZ25lZC4KKyAqIDxwPgorICogPGI+VVNBR0UgQ09OU1RSQUlOVDwvYj46ICBUaGlzIFZhbHZlIGlzIG9ubHkgdXNlZnVsIHdoZW4gcHJvY2Vzc2luZyBIVFRQCisgKiByZXF1ZXN0cy4gIFJlcXVlc3RzIG9mIGFueSBvdGhlciB0eXBlIHdpbGwgc2ltcGx5IGJlIHBhc3NlZCB0aHJvdWdoLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBdXRoZW50aWNhdG9yQmFzZQorICAgIGV4dGVuZHMgVmFsdmVCYXNlCisgICAgaW1wbGVtZW50cyBBdXRoZW50aWNhdG9yLCBMaWZlY3ljbGUgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBdXRoZW50aWNhdG9yQmFzZS5jbGFzcyk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gdG8gdXNlIGlmIHdlIGNhbm5vdCB1c2UKKyAgICAgKiB0aGUgcmVxdWVzdGVkIG9uZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FMR09SSVRITSA9ICJNRDUiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHJhbmRvbSBieXRlcyB0byBpbmNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhCisgICAgICogc2Vzc2lvbiBpZGVudGlmaWVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNFU1NJT05fSURfQllURVMgPSAxNjsKKworCisgICAgLyoqCisgICAgICogVGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSB0byBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBzZXNzaW9uCisgICAgICogaWRlbnRpZmllcnMuICBUaGlzIG11c3QgYmUgYW4gYWxnb3JpdGhtIHN1cHBvcnRlZCBieSB0aGUKKyAgICAgKiA8Y29kZT5qYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q8L2NvZGU+IGNsYXNzIG9uIHlvdXIgcGxhdGZvcm0uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBhbGdvcml0aG0gPSBERUZBVUxUX0FMR09SSVRITTsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIGNhY2hlIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFscyBpZiB0aGUgcmVxdWVzdCBpcyBwYXJ0IG9mCisgICAgICogYW4gSFRUUCBzZXNzaW9uPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNhY2hlID0gdHJ1ZTsKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRleHQgdG8gd2hpY2ggdGhpcyBWYWx2ZSBpcyBhdHRhY2hlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNZXNzYWdlRGlnZXN0IGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQgd2hlbgorICAgICAqIGNyZWF0aW5nIHNlc3Npb24gaWRlbnRpZmllcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1lc3NhZ2VEaWdlc3QgZGlnZXN0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQSBTdHJpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHVzZWQgdG8gaW5jcmVhc2UgdGhlIGVudHJvcHkgb2YKKyAgICAgKiB0aGUgaW5pdGlhbGl6YXRpb24gb2Ygb3VyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZW50cm9weSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuQXV0aGVudGljYXRvckJhc2UvMS4wIjsKKworICAgIC8qKgorICAgICAqIEZsYWcgdG8gZGV0ZXJtaW5lIGlmIHdlIGRpc2FibGUgcHJveHkgY2FjaGluZywgb3IgbGVhdmUgdGhlIGlzc3VlCisgICAgICogdXAgdG8gdGhlIHdlYmFwcCBkZXZlbG9wZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZGlzYWJsZVByb3h5Q2FjaGluZyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIGRldGVybWluZSBpZiB3ZSBkaXNhYmxlIHByb3h5IGNhY2hpbmcgd2l0aCBoZWFkZXJzIGluY29tcGF0aWJsZQorICAgICAqIHdpdGggSUUgCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2VjdXJlUGFnZXNXaXRoUHJhZ21hID0gdHJ1ZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBBIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgc2Vzc2lvbiBpZGVudGlmaWVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmFuZG9tIHJhbmRvbSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGNsYXNzIHRvIGJlIHVzZWQKKyAgICAgKiB3aGVuIGdlbmVyYXRpbmcgc2Vzc2lvbiBpZGVudGlmaWVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJhbmRvbUNsYXNzID0gImphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogVGhlIFNpbmdsZVNpZ25PbiBpbXBsZW1lbnRhdGlvbiBpbiBvdXIgcmVxdWVzdCBwcm9jZXNzaW5nIGNoYWluLAorICAgICAqIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2luZ2xlU2lnbk9uIHNzbyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIHN0YXJ0ZWQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiAiRXhwaXJlcyIgaGVhZGVyIGFsd2F5cyBzZXQgdG8gRGF0ZSgxKSwgc28gZ2VuZXJhdGUgb25jZSBvbmx5CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfT05FID0KKyAgICAgICAgKG5ldyBTaW1wbGVEYXRlRm9ybWF0KERhdGVUb29sLkhUVFBfUkVTUE9OU0VfREFURV9IRUFERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUuVVMpKS5mb3JtYXQobmV3IERhdGUoMSkpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gZm9yIHRoaXMgTWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsZ29yaXRobSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuYWxnb3JpdGhtKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gZm9yIHRoaXMgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGdvcml0aG0gVGhlIG5ldyBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGdvcml0aG0oU3RyaW5nIGFsZ29yaXRobSkgeworCisgICAgICAgIHRoaXMuYWxnb3JpdGhtID0gYWxnb3JpdGhtOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNhY2hlIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFscyBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldENhY2hlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jYWNoZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2FjaGUgYXV0aGVudGljYXRlZCBQcmluY2lwYWxzIGZsYWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FjaGUgVGhlIG5ldyBjYWNoZSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FjaGUoYm9vbGVhbiBjYWNoZSkgeworCisgICAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250YWluZXIgdG8gd2hpY2ggdGhpcyBWYWx2ZSBpcyBhdHRhY2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29udGV4dCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIHRvIHdoaWNoIHRoaXMgVmFsdmUgaXMgYXR0YWNoZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgdG8gd2hpY2ggd2UgYXJlIGF0dGFjaGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKENvbnRhaW5lciBjb250YWluZXIpIHsKKworICAgICAgICBpZiAoIShjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJhdXRoZW50aWNhdG9yLm5vdENvbnRleHQiKSk7CisKKyAgICAgICAgc3VwZXIuc2V0Q29udGFpbmVyKGNvbnRhaW5lcik7CisgICAgICAgIHRoaXMuY29udGV4dCA9IChDb250ZXh0KSBjb250YWluZXI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZW50cm9weSBpbmNyZWFzZXIgdmFsdWUsIG9yIGNvbXB1dGUgYSBzZW1pLXVzZWZ1bCB2YWx1ZQorICAgICAqIGlmIHRoaXMgU3RyaW5nIGhhcyBub3QgeWV0IGJlZW4gc2V0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW50cm9weSgpIHsKKworICAgICAgICAvLyBDYWxjdWxhdGUgYSBzZW1pLXVzZWZ1bCB2YWx1ZSBpZiB0aGlzIGhhcyBub3QgYmVlbiBzZXQKKyAgICAgICAgaWYgKHRoaXMuZW50cm9weSA9PSBudWxsKQorICAgICAgICAgICAgc2V0RW50cm9weSh0aGlzLnRvU3RyaW5nKCkpOworCisgICAgICAgIHJldHVybiAodGhpcy5lbnRyb3B5KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBlbnRyb3B5IGluY3JlYXNlciB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRyb3B5IFRoZSBuZXcgZW50cm9weSBpbmNyZWFzZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRyb3B5KFN0cmluZyBlbnRyb3B5KSB7CisKKyAgICAgICAgdGhpcy5lbnRyb3B5ID0gZW50cm9weTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJhbmRvbUNsYXNzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5yYW5kb21DbGFzcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgY2xhc3MgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByYW5kb21DbGFzcyBUaGUgbmV3IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGNsYXNzIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSYW5kb21DbGFzcyhTdHJpbmcgcmFuZG9tQ2xhc3MpIHsKKworICAgICAgICB0aGlzLnJhbmRvbUNsYXNzID0gcmFuZG9tQ2xhc3M7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZsYWcgdGhhdCBzdGF0ZXMgaWYgd2UgYWRkIGhlYWRlcnMgdG8gZGlzYWJsZSBjYWNoaW5nIGJ5CisgICAgICogcHJveGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREaXNhYmxlUHJveHlDYWNoaW5nKCkgeworICAgICAgICByZXR1cm4gZGlzYWJsZVByb3h5Q2FjaGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIHRoYXQgc3RhdGVzIGlmIHdlIGFkZCBoZWFkZXJzIHRvIGRpc2FibGUKKyAgICAgKiBjYWNoaW5nIGJ5IHByb3hpZXMuCisgICAgICogQHBhcmFtIG5vY2FjaGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgd2UgYWRkIGhlYWRlcnMgdG8gZGlzYWJsZSBwcm94eSAKKyAgICAgKiAgICAgICAgICAgICAgY2FjaGluZywgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHdlIGxlYXZlIHRoZSBoZWFkZXJzIGFsb25lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc2FibGVQcm94eUNhY2hpbmcoYm9vbGVhbiBub2NhY2hlKSB7CisgICAgICAgIGRpc2FibGVQcm94eUNhY2hpbmcgPSBub2NhY2hlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZsYWcgdGhhdCBzdGF0ZXMsIGlmIHByb3h5IGNhY2hpbmcgaXMgZGlzYWJsZWQsIHdoYXQgaGVhZGVycworICAgICAqIHdlIGFkZCB0byBkaXNhYmxlIHRoZSBjYWNoaW5nLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFNlY3VyZVBhZ2VzV2l0aFByYWdtYSgpIHsKKyAgICAgICAgcmV0dXJuIHNlY3VyZVBhZ2VzV2l0aFByYWdtYTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIHRoYXQgc3RhdGVzIHdoYXQgaGVhZGVycyB3ZSBhZGQgdG8gZGlzYWJsZQorICAgICAqIHByb3h5IGNhY2hpbmcuCisgICAgICogQHBhcmFtIHNlY3VyZVBhZ2VzV2l0aFByYWdtYSA8Y29kZT50cnVlPC9jb2RlPiBpZiB3ZSBhZGQgaGVhZGVycyB3aGljaCAKKyAgICAgKiBhcmUgaW5jb21wYXRpYmxlIHdpdGggZG93bmxvYWRpbmcgb2ZmaWNlIGRvY3VtZW50cyBpbiBJRSB1bmRlciBTU0wgYnV0CisgICAgICogd2hpY2ggZml4IGEgY2FjaGluZyBwcm9ibGVtIGluIE1vemlsbGEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VjdXJlUGFnZXNXaXRoUHJhZ21hKGJvb2xlYW4gc2VjdXJlUGFnZXNXaXRoUHJhZ21hKSB7CisgICAgICAgIHRoaXMuc2VjdXJlUGFnZXNXaXRoUHJhZ21hID0gc2VjdXJlUGFnZXNXaXRoUHJhZ21hOworICAgIH0gICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRW5mb3JjZSB0aGUgc2VjdXJpdHkgcmVzdHJpY3Rpb25zIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudAorICAgICAqIGRlc2NyaXB0b3Igb2Ygb3VyIGFzc29jaWF0ZWQgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3QgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlIHRvIGJlIHByb2Nlc3NlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIHRocm93biBieSBhIHByb2Nlc3NpbmcgZWxlbWVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VjdXJpdHkgY2hlY2tpbmcgcmVxdWVzdCAiICsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICBMb2dpbkNvbmZpZyBjb25maWcgPSB0aGlzLmNvbnRleHQuZ2V0TG9naW5Db25maWcoKTsKKworICAgICAgICAvLyBIYXZlIHdlIGdvdCBhIGNhY2hlZCBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCB0byByZWNvcmQ/CisgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgUHJpbmNpcGFsIHByaW5jaXBhbCA9IHJlcXVlc3QuZ2V0VXNlclByaW5jaXBhbCgpOworICAgICAgICAgICAgaWYgKHByaW5jaXBhbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwoZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbmNpcGFsID0gc2Vzc2lvbi5nZXRQcmluY2lwYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByaW5jaXBhbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJXZSBoYXZlIGNhY2hlZCBhdXRoIHR5cGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXV0aFR5cGUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIHByaW5jaXBhbCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRQcmluY2lwYWwoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNldEF1dGhUeXBlKHNlc3Npb24uZ2V0QXV0aFR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNldFVzZXJQcmluY2lwYWwocHJpbmNpcGFsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGZvcm0tYmFzZWQgbG9naW5zIHRvIGRlYWwgd2l0aCB0aGUgY2FzZQorICAgICAgICAvLyB3aGVyZSB0aGUgbG9naW4gZm9ybSAoYW5kIHRoZXJlZm9yZSB0aGUgImpfc2VjdXJpdHlfY2hlY2siIFVSSQorICAgICAgICAvLyB0byB3aGljaCBpdCBzdWJtaXRzKSBtaWdodCBiZSBvdXRzaWRlIHRoZSBzZWN1cmVkIGFyZWEKKyAgICAgICAgU3RyaW5nIGNvbnRleHRQYXRoID0gdGhpcy5jb250ZXh0LmdldFBhdGgoKTsKKyAgICAgICAgU3RyaW5nIHJlcXVlc3RVUkkgPSByZXF1ZXN0LmdldERlY29kZWRSZXF1ZXN0VVJJKCk7CisgICAgICAgIGlmIChyZXF1ZXN0VVJJLnN0YXJ0c1dpdGgoY29udGV4dFBhdGgpICYmCisgICAgICAgICAgICByZXF1ZXN0VVJJLmVuZHNXaXRoKENvbnN0YW50cy5GT1JNX0FDVElPTikpIHsKKyAgICAgICAgICAgIGlmICghYXV0aGVudGljYXRlKHJlcXVlc3QsIHJlc3BvbnNlLCBjb25maWcpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBGYWlsZWQgYXV0aGVudGljYXRlKCkgdGVzdCA/PyIgKyByZXF1ZXN0VVJJICk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgUmVhbG0gcmVhbG0gPSB0aGlzLmNvbnRleHQuZ2V0UmVhbG0oKTsKKyAgICAgICAgLy8gSXMgdGhpcyByZXF1ZXN0IFVSSSBzdWJqZWN0IHRvIGEgc2VjdXJpdHkgY29uc3RyYWludD8KKyAgICAgICAgU2VjdXJpdHlDb25zdHJhaW50IFtdIGNvbnN0cmFpbnRzCisgICAgICAgICAgICA9IHJlYWxtLmZpbmRTZWN1cml0eUNvbnN0cmFpbnRzKHJlcXVlc3QsIHRoaXMuY29udGV4dCk7CisgICAgICAgCisgICAgICAgIGlmICgoY29uc3RyYWludHMgPT0gbnVsbCkgLyogJiYKKyAgICAgICAgICAgICghQ29uc3RhbnRzLkZPUk1fTUVUSE9ELmVxdWFscyhjb25maWcuZ2V0QXV0aE1ldGhvZCgpKSkgKi8gKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgTm90IHN1YmplY3QgdG8gYW55IGNvbnN0cmFpbnQiKTsKKyAgICAgICAgICAgIGdldE5leHQoKS5pbnZva2UocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgY29uc3RyYWluZWQgcmVzb3VyY2VzIGFyZSBub3QgY2FjaGVkIGJ5IHdlYiBwcm94aWVzCisgICAgICAgIC8vIG9yIGJyb3dzZXJzIGFzIGNhY2hpbmcgY2FuIHByb3ZpZGUgYSBzZWN1cml0eSBob2xlCisgICAgICAgIGlmIChkaXNhYmxlUHJveHlDYWNoaW5nICYmIAorICAgICAgICAgICAgLy8gRklYTUU6IERpc2FibGVkIGZvciBNb3ppbGxhIEZPUk0gc3VwcG9ydCBvdmVyIFNTTCAKKyAgICAgICAgICAgIC8vIChpbXByb3BlciBjYWNoaW5nIGlzc3VlKQorICAgICAgICAgICAgLy8hcmVxdWVzdC5pc1NlY3VyZSgpICYmCisgICAgICAgICAgICAhIlBPU1QiLmVxdWFsc0lnbm9yZUNhc2UocmVxdWVzdC5nZXRNZXRob2QoKSkpIHsKKyAgICAgICAgICAgIGlmIChzZWN1cmVQYWdlc1dpdGhQcmFnbWEpIHsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhlc2UgY2F1c2UgcHJvYmxlbXMgd2l0aCBkb3dubG9hZGluZyBvZmZpY2UgZG9jcworICAgICAgICAgICAgICAgIC8vIGZyb20gSUUgdW5kZXIgU1NMIGFuZCBtYXkgbm90IGJlIG5lZWRlZCBmb3IgbmV3ZXIgTW96aWxsYQorICAgICAgICAgICAgICAgIC8vIGNsaWVudHMuCisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJQcmFnbWEiLCAiTm8tY2FjaGUiKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAibm8tY2FjaGUiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgInByaXZhdGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiRXhwaXJlcyIsIERBVEVfT05FKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBpOworICAgICAgICAvLyBFbmZvcmNlIGFueSB1c2VyIGRhdGEgY29uc3RyYWludCBmb3IgdGhpcyBzZWN1cml0eSBjb25zdHJhaW50CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCIgQ2FsbGluZyBoYXNVc2VyRGF0YVBlcm1pc3Npb24oKSIpOworICAgICAgICB9CisgICAgICAgIGlmICghcmVhbG0uaGFzVXNlckRhdGFQZXJtaXNzaW9uKHJlcXVlc3QsIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50cykpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIEZhaWxlZCBoYXNVc2VyRGF0YVBlcm1pc3Npb24oKSB0ZXN0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQVNTRVJUOiBBdXRoZW50aWNhdG9yIGFscmVhZHkgc2V0IHRoZSBhcHByb3ByaWF0ZQorICAgICAgICAgICAgICogSFRUUCBzdGF0dXMgY29kZSwgc28gd2UgZG8gbm90IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbAorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBTaW5jZSBhdXRoZW50aWNhdGUgbW9kaWZpZXMgdGhlIHJlc3BvbnNlIG9uIGZhaWx1cmUsCisgICAgICAgIC8vIHdlIGhhdmUgdG8gY2hlY2sgZm9yIGFsbG93LWZyb20tYWxsIGZpcnN0LgorICAgICAgICBib29sZWFuIGF1dGhSZXF1aXJlZCA9IHRydWU7CisgICAgICAgIGZvcihpPTA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGggJiYgYXV0aFJlcXVpcmVkOyBpKyspIHsKKyAgICAgICAgICAgIGlmKCFjb25zdHJhaW50c1tpXS5nZXRBdXRoQ29uc3RyYWludCgpKSB7CisgICAgICAgICAgICAgICAgYXV0aFJlcXVpcmVkID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYoIWNvbnN0cmFpbnRzW2ldLmdldEFsbFJvbGVzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgW10gcm9sZXMgPSBjb25zdHJhaW50c1tpXS5maW5kQXV0aFJvbGVzKCk7CisgICAgICAgICAgICAgICAgaWYocm9sZXMgPT0gbnVsbCB8fCByb2xlcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBhdXRoUmVxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgICAgICAKKyAgICAgICAgaWYoYXV0aFJlcXVpcmVkKSB7ICAKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIENhbGxpbmcgYXV0aGVudGljYXRlKCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghYXV0aGVudGljYXRlKHJlcXVlc3QsIHJlc3BvbnNlLCBjb25maWcpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIEZhaWxlZCBhdXRoZW50aWNhdGUoKSB0ZXN0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQVNTRVJUOiBBdXRoZW50aWNhdG9yIGFscmVhZHkgc2V0IHRoZSBhcHByb3ByaWF0ZQorICAgICAgICAgICAgICAgICAqIEhUVFAgc3RhdHVzIGNvZGUsIHNvIHdlIGRvIG5vdCBoYXZlIHRvIGRvIGFueXRoaW5nCisgICAgICAgICAgICAgICAgICogc3BlY2lhbAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKyAgICAKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIiBDYWxsaW5nIGFjY2Vzc0NvbnRyb2woKSIpOworICAgICAgICB9CisgICAgICAgIGlmICghcmVhbG0uaGFzUmVzb3VyY2VQZXJtaXNzaW9uKHJlcXVlc3QsIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0KSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgRmFpbGVkIGFjY2Vzc0NvbnRyb2woKSB0ZXN0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQVNTRVJUOiBBY2Nlc3NDb250cm9sIG1ldGhvZCBoYXMgYWxyZWFkeSBzZXQgdGhlCisgICAgICAgICAgICAgKiBhcHByb3ByaWF0ZSBIVFRQIHN0YXR1cyBjb2RlLCBzbyB3ZSBkbyBub3QgaGF2ZSB0byBkbworICAgICAgICAgICAgICogYW55dGhpbmcgc3BlY2lhbAorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLy8gQW55IGFuZCBhbGwgc3BlY2lmaWVkIGNvbnN0cmFpbnRzIGhhdmUgYmVlbiBzYXRpc2ZpZWQKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIiBTdWNjZXNzZnVsbHkgcGFzc2VkIGFsbCBzZWN1cml0eSBjb25zdHJhaW50cyIpOworICAgICAgICB9CisgICAgICAgIGdldE5leHQoKS5pbnZva2UocmVxdWVzdCwgcmVzcG9uc2UpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisKKworICAgIC8qKgorICAgICAqIEFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIHNpbmdsZSBzaWduIG9uIGlkZW50aWZpZXIgd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgU2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzc29JZCBTaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyCisgICAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiB0byBiZSBhc3NvY2lhdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzb2NpYXRlKFN0cmluZyBzc29JZCwgU2Vzc2lvbiBzZXNzaW9uKSB7CisKKyAgICAgICAgaWYgKHNzbyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBzc28uYXNzb2NpYXRlKHNzb0lkLCBzZXNzaW9uKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQXV0aGVudGljYXRlIHRoZSB1c2VyIG1ha2luZyB0aGlzIHJlcXVlc3QsIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBsb2dpbiBjb25maWd1cmF0aW9uLiAgUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFueSBzcGVjaWZpZWQKKyAgICAgKiBjb25zdHJhaW50IGhhcyBiZWVuIHNhdGlzZmllZCwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHdlIGhhdmUKKyAgICAgKiBjcmVhdGVkIGEgcmVzcG9uc2UgY2hhbGxlbmdlIGFscmVhZHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSBjb25maWcgICAgTG9naW4gY29uZmlndXJhdGlvbiBkZXNjcmliaW5nIGhvdyBhdXRoZW50aWNhdGlvbgorICAgICAqICAgICAgICAgICAgICBzaG91bGQgYmUgcGVyZm9ybWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBhdXRoZW50aWNhdGUoUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9naW5Db25maWcgY29uZmlnKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGFuZCByZXR1cm4gYSBuZXcgc2Vzc2lvbiBpZGVudGlmaWVyIGZvciB0aGUgY29va2llIHRoYXQKKyAgICAgKiBpZGVudGlmaWVzIGFuIFNTTyBwcmluY2lwYWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBTdHJpbmcgZ2VuZXJhdGVTZXNzaW9uSWQoKSB7CisKKyAgICAgICAgLy8gR2VuZXJhdGUgYSBieXRlIGFycmF5IGNvbnRhaW5pbmcgYSBzZXNzaW9uIGlkZW50aWZpZXIKKyAgICAgICAgYnl0ZSBieXRlc1tdID0gbmV3IGJ5dGVbU0VTU0lPTl9JRF9CWVRFU107CisgICAgICAgIGdldFJhbmRvbSgpLm5leHRCeXRlcyhieXRlcyk7CisgICAgICAgIGJ5dGVzID0gZ2V0RGlnZXN0KCkuZGlnZXN0KGJ5dGVzKTsKKworICAgICAgICAvLyBSZW5kZXIgdGhlIHJlc3VsdCBhcyBhIFN0cmluZyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYnl0ZSBiMSA9IChieXRlKSAoKGJ5dGVzW2ldICYgMHhmMCkgPj4gNCk7CisgICAgICAgICAgICBieXRlIGIyID0gKGJ5dGUpIChieXRlc1tpXSAmIDB4MGYpOworICAgICAgICAgICAgaWYgKGIxIDwgMTApCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoY2hhcikgKCcwJyArIGIxKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoY2hhcikgKCdBJyArIChiMSAtIDEwKSkpOworICAgICAgICAgICAgaWYgKGIyIDwgMTApCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoY2hhcikgKCcwJyArIGIyKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoY2hhcikgKCdBJyArIChiMiAtIDEwKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAocmVzdWx0LnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1lc3NhZ2VEaWdlc3Qgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIGNhbGN1bGF0aW5nCisgICAgICogc2Vzc2lvbiBpZGVudGlmaWVycy4gIElmIG5vbmUgaGFzIGJlZW4gY3JlYXRlZCB5ZXQsIGluaXRpYWxpemUKKyAgICAgKiBvbmUgdGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgTWVzc2FnZURpZ2VzdCBnZXREaWdlc3QoKSB7CisKKyAgICAgICAgaWYgKHRoaXMuZGlnZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhpcy5kaWdlc3QgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKGFsZ29yaXRobSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlnZXN0ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZShERUZBVUxUX0FMR09SSVRITSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGYpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWdlc3QgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAodGhpcy5kaWdlc3QpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGluc3RhbmNlIHdlIHNob3VsZCB1c2UgZm9yCisgICAgICogZ2VuZXJhdGluZyBzZXNzaW9uIGlkZW50aWZpZXJzLiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBnZW5lcmF0b3IKKyAgICAgKiBjdXJyZW50bHkgZGVmaW5lZCwgY29uc3RydWN0IGFuZCBzZWVkIGEgbmV3IG9uZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIFJhbmRvbSBnZXRSYW5kb20oKSB7CisKKyAgICAgICAgaWYgKHRoaXMucmFuZG9tID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKHJhbmRvbUNsYXNzKTsKKyAgICAgICAgICAgICAgICB0aGlzLnJhbmRvbSA9IChSYW5kb20pIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgbG9uZyBzZWVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgY2hhciBlbnRyb3B5W10gPSBnZXRFbnRyb3B5KCkudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJvcHkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyB1cGRhdGUgPSAoKGJ5dGUpIGVudHJvcHlbaV0pIDw8ICgoaSAlIDgpICogOCk7CisgICAgICAgICAgICAgICAgICAgIHNlZWQgXj0gdXBkYXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLnJhbmRvbS5zZXRTZWVkKHNlZWQpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnJhbmRvbSA9IG5ldyBqYXZhLnV0aWwuUmFuZG9tKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHRoaXMucmFuZG9tKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQXR0ZW1wdHMgcmVhdXRoZW50aWNhdGlvbiB0byB0aGUgPGNvZGU+UmVhbG08L2NvZGU+IHVzaW5nCisgICAgICogdGhlIGNyZWRlbnRpYWxzIGluY2x1ZGVkIGluIGFyZ3VtZW50IDxjb2RlPmVudHJ5PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzc29JZCBpZGVudGlmaWVyIG9mIFNpbmdsZVNpZ25PbiBzZXNzaW9uIHdpdGggd2hpY2ggdGhlCisgICAgICogICAgICAgICAgICAgIGNhbGxlciBpcyBhc3NvY2lhdGVkCisgICAgICogQHBhcmFtIHJlcXVlc3QgICB0aGUgcmVxdWVzdCB0aGF0IG5lZWRzIHRvIGJlIGF1dGhlbnRpY2F0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWF1dGhlbnRpY2F0ZUZyb21TU08oU3RyaW5nIHNzb0lkLCBSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBpZiAoc3NvID09IG51bGwgfHwgc3NvSWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBib29sZWFuIHJlYXV0aGVudGljYXRlZCA9IGZhbHNlOworCisgICAgICAgIENvbnRhaW5lciBwYXJlbnQgPSBnZXRDb250YWluZXIoKTsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBSZWFsbSByZWFsbSA9IHBhcmVudC5nZXRSZWFsbSgpOworICAgICAgICAgICAgaWYgKHJlYWxtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWF1dGhlbnRpY2F0ZWQgPSBzc28ucmVhdXRoZW50aWNhdGUoc3NvSWQsIHJlYWxtLCByZXF1ZXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWF1dGhlbnRpY2F0ZWQpIHsKKyAgICAgICAgICAgIGFzc29jaWF0ZShzc29JZCwgcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwodHJ1ZSkpOworCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBSZWF1dGhlbnRpY2F0ZWQgY2FjaGVkIHByaW5jaXBhbCAnIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0VXNlclByaW5jaXBhbCgpLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICInIHdpdGggYXV0aCB0eXBlICciICsgIHJlcXVlc3QuZ2V0QXV0aFR5cGUoKSArICInIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVhdXRoZW50aWNhdGVkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYW4gYXV0aGVudGljYXRlZCBQcmluY2lwYWwgYW5kIGF1dGhlbnRpY2F0aW9uIHR5cGUgaW4gb3VyCisgICAgICogcmVxdWVzdCwgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbiAoaWYgdGhlcmUgaXMgb25lKSwgYW5kIHdpdGggb3VyCisgICAgICogU2luZ2xlU2lnbk9uIHZhbHZlLCBpZiB0aGVyZSBpcyBvbmUuICBTZXQgdGhlIGFwcHJvcHJpYXRlIGNvb2tpZQorICAgICAqIHRvIGJlIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgZ2VuZXJhdGluZworICAgICAqIEBwYXJhbSBwcmluY2lwYWwgVGhlIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFsIHRvIGJlIHJlZ2lzdGVyZWQKKyAgICAgKiBAcGFyYW0gYXV0aFR5cGUgVGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgdG8gYmUgcmVnaXN0ZXJlZAorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSAoaWYgYW55KQorICAgICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzd29yZCB1c2VkIHRvIGF1dGhlbnRpY2F0ZSAoaWYgYW55KQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbmNpcGFsIHByaW5jaXBhbCwgU3RyaW5nIGF1dGhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAvLyBCdWd6aWxsYSAzOTI1NTogaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zOTI1NQorICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAocHJpbmNpcGFsID09IG51bGwpID8gIm5vbmUiIDogcHJpbmNpcGFsLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXV0aGVudGljYXRlZCAnIiArIG5hbWUgKyAiJyB3aXRoIHR5cGUgJyIKKyAgICAgICAgICAgICAgICArIGF1dGhUeXBlICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhY2hlIHRoZSBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBpbiBvdXIgcmVxdWVzdAorICAgICAgICByZXF1ZXN0LnNldEF1dGhUeXBlKGF1dGhUeXBlKTsKKyAgICAgICAgcmVxdWVzdC5zZXRVc2VyUHJpbmNpcGFsKHByaW5jaXBhbCk7CisKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwoZmFsc2UpOworICAgICAgICAvLyBDYWNoZSB0aGUgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gaW4gb3VyIHNlc3Npb24sIGlmIGFueQorICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLnNldEF1dGhUeXBlKGF1dGhUeXBlKTsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLnNldFByaW5jaXBhbChwcmluY2lwYWwpOworICAgICAgICAgICAgICAgIGlmICh1c2VybmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnNldE5vdGUoQ29uc3RhbnRzLlNFU1NfVVNFUk5BTUVfTk9URSwgdXNlcm5hbWUpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVOb3RlKENvbnN0YW50cy5TRVNTX1VTRVJOQU1FX05PVEUpOworICAgICAgICAgICAgICAgIGlmIChwYXNzd29yZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnNldE5vdGUoQ29uc3RhbnRzLlNFU1NfUEFTU1dPUkRfTk9URSwgcGFzc3dvcmQpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVOb3RlKENvbnN0YW50cy5TRVNTX1BBU1NXT1JEX05PVEUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ29uc3RydWN0IGEgY29va2llIHRvIGJlIHJldHVybmVkIHRvIHRoZSBjbGllbnQKKyAgICAgICAgaWYgKHNzbyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIE9ubHkgY3JlYXRlIGEgbmV3IFNTTyBlbnRyeSBpZiB0aGUgU1NPIGRpZCBub3QgYWxyZWFkeSBzZXQgYSBub3RlCisgICAgICAgIC8vIGZvciBhbiBleGlzdGluZyBlbnRyeSAoYXMgaXQgd291bGQgZG8gd2l0aCBzdWJzZXF1ZW50IHJlcXVlc3RzCisgICAgICAgIC8vIGZvciBESUdFU1QgYW5kIFNTTCBhdXRoZW50aWNhdGVkIGNvbnRleHRzKQorICAgICAgICBTdHJpbmcgc3NvSWQgPSAoU3RyaW5nKSByZXF1ZXN0LmdldE5vdGUoQ29uc3RhbnRzLlJFUV9TU09JRF9OT1RFKTsKKyAgICAgICAgaWYgKHNzb0lkID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIENvbnN0cnVjdCBhIGNvb2tpZSB0byBiZSByZXR1cm5lZCB0byB0aGUgY2xpZW50CisgICAgICAgICAgICBzc29JZCA9IGdlbmVyYXRlU2Vzc2lvbklkKCk7CisgICAgICAgICAgICBDb29raWUgY29va2llID0gbmV3IENvb2tpZShDb25zdGFudHMuU0lOR0xFX1NJR05fT05fQ09PS0lFLCBzc29JZCk7CisgICAgICAgICAgICBjb29raWUuc2V0TWF4QWdlKC0xKTsKKyAgICAgICAgICAgIGNvb2tpZS5zZXRQYXRoKCIvIik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEJ1Z3ppbGxhIDQxMjE3CisgICAgICAgICAgICBjb29raWUuc2V0U2VjdXJlKHJlcXVlc3QuaXNTZWN1cmUoKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEJ1Z3ppbGxhIDM0NzI0CisgICAgICAgICAgICBTdHJpbmcgc3NvRG9tYWluID0gc3NvLmdldENvb2tpZURvbWFpbigpOworICAgICAgICAgICAgaWYoc3NvRG9tYWluICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb29raWUuc2V0RG9tYWluKHNzb0RvbWFpbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3BvbnNlLmFkZENvb2tpZShjb29raWUpOworCisgICAgICAgICAgICAvLyBSZWdpc3RlciB0aGlzIHByaW5jaXBhbCB3aXRoIG91ciBTU08gdmFsdmUKKyAgICAgICAgICAgIHNzby5yZWdpc3Rlcihzc29JZCwgcHJpbmNpcGFsLCBhdXRoVHlwZSwgdXNlcm5hbWUsIHBhc3N3b3JkKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0Tm90ZShDb25zdGFudHMuUkVRX1NTT0lEX05PVEUsIHNzb0lkKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBTU08gc2Vzc2lvbiB3aXRoIHRoZSBsYXRlc3QgYXV0aGVudGljYXRpb24gZGF0YQorICAgICAgICAgICAgc3NvLnVwZGF0ZShzc29JZCwgcHJpbmNpcGFsLCBhdXRoVHlwZSwgdXNlcm5hbWUsIHBhc3N3b3JkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpeCBmb3IgQnVnIDEwMDQwCisgICAgICAgIC8vIEFsd2F5cyBhc3NvY2lhdGUgYSBzZXNzaW9uIHdpdGggYSBuZXcgU1NPIHJlcWlzdHJhdGlvbi4KKyAgICAgICAgLy8gU1NPIGVudHJpZXMgYXJlIG9ubHkgcmVtb3ZlZCBmcm9tIHRoZSBTU08gcmVnaXN0cnkgbWFwIHdoZW4KKyAgICAgICAgLy8gYXNzb2NpYXRlZCBzZXNzaW9ucyBhcmUgZGVzdHJveWVkOyBpZiBhIG5ldyBTU08gZW50cnkgaXMgY3JlYXRlZAorICAgICAgICAvLyBhYm92ZSBmb3IgdGhpcyByZXF1ZXN0IGFuZCB0aGUgdXNlciBuZXZlciByZXZpc2l0cyB0aGUgY29udGV4dCwgdGhlCisgICAgICAgIC8vIFNTTyBlbnRyeSB3aWxsIG5ldmVyIGJlIGNsZWFyZWQgaWYgd2UgZG9uJ3QgYXNzb2NpYXRlIHRoZSBzZXNzaW9uCisgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpCisgICAgICAgICAgICBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwodHJ1ZSk7CisgICAgICAgIHNzby5hc3NvY2lhdGUoc3NvSWQsIHNlc3Npb24pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlmZWN5Y2xlIGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaWZlY3ljbGUuIElmIHRoaXMgCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiBsaWZlY3ljbGUuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIDxjb2RlPmNvbmZpZ3VyZSgpPC9jb2RlPiwKKyAgICAgKiBhbmQgYmVmb3JlIGFueSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhlIGNvbXBvbmVudCBhcmUgdXRpbGl6ZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyB0aGlzIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmIChzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImF1dGhlbnRpY2F0b3IuYWxyZWFkeVN0YXJ0ZWQiKSk7CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBTaW5nbGVTaWduT24gaW1wbGVtZW50YXRpb24gaW4gb3VyIHJlcXVlc3QgcHJvY2Vzc2luZworICAgICAgICAvLyBwYXRoLCBpZiB0aGVyZSBpcyBvbmUKKyAgICAgICAgQ29udGFpbmVyIHBhcmVudCA9IGNvbnRleHQuZ2V0UGFyZW50KCk7CisgICAgICAgIHdoaWxlICgoc3NvID09IG51bGwpICYmIChwYXJlbnQgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIGlmICghKHBhcmVudCBpbnN0YW5jZW9mIFBpcGVsaW5lKSkgeworICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFZhbHZlIHZhbHZlc1tdID0gKChQaXBlbGluZSkgcGFyZW50KS5nZXRWYWx2ZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHZlc1tpXSBpbnN0YW5jZW9mIFNpbmdsZVNpZ25PbikgeworICAgICAgICAgICAgICAgICAgICBzc28gPSAoU2luZ2xlU2lnbk9uKSB2YWx2ZXNbaV07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzc28gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBpZiAoc3NvICE9IG51bGwpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBTaW5nbGVTaWduT24gVmFsdmUgYXQgIiArIHNzbyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBTaW5nbGVTaWduT24gVmFsdmUgaXMgcHJlc2VudCIpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgdGVybWluYXRlIHRoZSBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzCisgICAgICogY29tcG9uZW50LiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHRoZSBsYXN0IG9uZSBjYWxsZWQgb24gYSBnaXZlbgorICAgICAqIGluc3RhbmNlIG9mIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKCFzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImF1dGhlbnRpY2F0b3Iubm90U3RhcnRlZCIpKTsKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVE9QX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworCisgICAgICAgIHNzbyA9IG51bGw7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvQmFzaWNBdXRoZW50aWNhdG9yLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9CYXNpY0F1dGhlbnRpY2F0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjgzMDgyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvQmFzaWNBdXRoZW50aWNhdG9yLmphdmEKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkxvZ2luQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5CYXNlNjQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuQnl0ZUNodW5rOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLkNoYXJDaHVuazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5NZXNzYWdlQnl0ZXM7CisKKworCisvKioKKyAqIEFuIDxiPkF1dGhlbnRpY2F0b3I8L2I+IGFuZCA8Yj5WYWx2ZTwvYj4gaW1wbGVtZW50YXRpb24gb2YgSFRUUCBCQVNJQworICogQXV0aGVudGljYXRpb24sIGFzIG91dGxpbmVkIGluIFJGQyAyNjE3OiAgIkhUVFAgQXV0aGVudGljYXRpb246IEJhc2ljCisgKiBhbmQgRGlnZXN0IEFjY2VzcyBBdXRoZW50aWNhdGlvbi4iCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBCYXNpY0F1dGhlbnRpY2F0b3IKKyAgICBleHRlbmRzIEF1dGhlbnRpY2F0b3JCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQmFzaWNBdXRoZW50aWNhdG9yLmNsYXNzKTsKKworCisKKyAgICAvKioKKyAgICAgKiBBdXRoZW50aWNhdGUgYnl0ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gQVVUSEVOVElDQVRFX0JZVEVTID0geworICAgICAgICAoYnl0ZSkgJ1cnLAorICAgICAgICAoYnl0ZSkgJ1cnLAorICAgICAgICAoYnl0ZSkgJ1cnLAorICAgICAgICAoYnl0ZSkgJy0nLAorICAgICAgICAoYnl0ZSkgJ0EnLAorICAgICAgICAoYnl0ZSkgJ3UnLAorICAgICAgICAoYnl0ZSkgJ3QnLAorICAgICAgICAoYnl0ZSkgJ2gnLAorICAgICAgICAoYnl0ZSkgJ2UnLAorICAgICAgICAoYnl0ZSkgJ24nLAorICAgICAgICAoYnl0ZSkgJ3QnLAorICAgICAgICAoYnl0ZSkgJ2knLAorICAgICAgICAoYnl0ZSkgJ2MnLAorICAgICAgICAoYnl0ZSkgJ2EnLAorICAgICAgICAoYnl0ZSkgJ3QnLAorICAgICAgICAoYnl0ZSkgJ2UnCisgICAgfTsKKworCisgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5CYXNpY0F1dGhlbnRpY2F0b3IvMS4wIjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFZhbHZlIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQXV0aGVudGljYXRlIHRoZSB1c2VyIG1ha2luZyB0aGlzIHJlcXVlc3QsIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBsb2dpbiBjb25maWd1cmF0aW9uLiAgUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFueSBzcGVjaWZpZWQKKyAgICAgKiBjb25zdHJhaW50IGhhcyBiZWVuIHNhdGlzZmllZCwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHdlIGhhdmUKKyAgICAgKiBjcmVhdGVkIGEgcmVzcG9uc2UgY2hhbGxlbmdlIGFscmVhZHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSBjb25maWcgICAgTG9naW4gY29uZmlndXJhdGlvbiBkZXNjcmliaW5nIGhvdyBhdXRoZW50aWNhdGlvbgorICAgICAqICAgICAgICAgICAgICBzaG91bGQgYmUgcGVyZm9ybWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGUoUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9naW5Db25maWcgY29uZmlnKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIEhhdmUgd2UgYWxyZWFkeSBhdXRoZW50aWNhdGVkIHNvbWVvbmU/CisgICAgICAgIFByaW5jaXBhbCBwcmluY2lwYWwgPSByZXF1ZXN0LmdldFVzZXJQcmluY2lwYWwoKTsKKyAgICAgICAgU3RyaW5nIHNzb0lkID0gKFN0cmluZykgcmVxdWVzdC5nZXROb3RlKENvbnN0YW50cy5SRVFfU1NPSURfTk9URSk7CisgICAgICAgIGlmIChwcmluY2lwYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWxyZWFkeSBhdXRoZW50aWNhdGVkICciICsgcHJpbmNpcGFsLmdldE5hbWUoKSArICInIik7CisgICAgICAgICAgICAvLyBBc3NvY2lhdGUgdGhlIHNlc3Npb24gd2l0aCBhbnkgZXhpc3RpbmcgU1NPIHNlc3Npb24KKyAgICAgICAgICAgIGlmIChzc29JZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGFzc29jaWF0ZShzc29JZCwgcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwodHJ1ZSkpOworICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElzIHRoZXJlIGFuIFNTTyBzZXNzaW9uIGFnYWluc3Qgd2hpY2ggd2UgY2FuIHRyeSB0byByZWF1dGhlbnRpY2F0ZT8KKyAgICAgICAgaWYgKHNzb0lkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNTTyBJZCAiICsgc3NvSWQgKyAiIHNldDsgYXR0ZW1wdGluZyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYXV0aGVudGljYXRpb24iKTsKKyAgICAgICAgICAgIC8qIFRyeSB0byByZWF1dGhlbnRpY2F0ZSB1c2luZyBkYXRhIGNhY2hlZCBieSBTU08uICBJZiB0aGlzIGZhaWxzLAorICAgICAgICAgICAgICAgZWl0aGVyIHRoZSBvcmlnaW5hbCBTU08gbG9nb24gd2FzIG9mIERJR0VTVCBvciBTU0wgKHdoaWNoCisgICAgICAgICAgICAgICB3ZSBjYW4ndCByZWF1dGhlbnRpY2F0ZSBvdXJzZWx2ZXMgYmVjYXVzZSB0aGVyZSBpcyBubworICAgICAgICAgICAgICAgY2FjaGVkIHVzZXJuYW1lIGFuZCBwYXNzd29yZCksIG9yIHRoZSByZWFsbSBkZW5pZWQKKyAgICAgICAgICAgICAgIHRoZSB1c2VyJ3MgcmVhdXRoZW50aWNhdGlvbiBmb3Igc29tZSByZWFzb24uCisgICAgICAgICAgICAgICBJbiBlaXRoZXIgY2FzZSB3ZSBoYXZlIHRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBsb2dvbiAqLworICAgICAgICAgICAgaWYgKHJlYXV0aGVudGljYXRlRnJvbVNTTyhzc29JZCwgcmVxdWVzdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBWYWxpZGF0ZSBhbnkgY3JlZGVudGlhbHMgYWxyZWFkeSBpbmNsdWRlZCB3aXRoIHRoaXMgcmVxdWVzdAorICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSBudWxsOworCisgICAgICAgIE1lc3NhZ2VCeXRlcyBhdXRob3JpemF0aW9uID0gCisgICAgICAgICAgICByZXF1ZXN0LmdldENveW90ZVJlcXVlc3QoKS5nZXRNaW1lSGVhZGVycygpCisgICAgICAgICAgICAuZ2V0VmFsdWUoImF1dGhvcml6YXRpb24iKTsKKyAgICAgICAgCisgICAgICAgIGlmIChhdXRob3JpemF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF1dGhvcml6YXRpb24udG9CeXRlcygpOworICAgICAgICAgICAgQnl0ZUNodW5rIGF1dGhvcml6YXRpb25CQyA9IGF1dGhvcml6YXRpb24uZ2V0Qnl0ZUNodW5rKCk7CisgICAgICAgICAgICBpZiAoYXV0aG9yaXphdGlvbkJDLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJiYXNpYyAiLCAwKSkgeworICAgICAgICAgICAgICAgIGF1dGhvcml6YXRpb25CQy5zZXRPZmZzZXQoYXV0aG9yaXphdGlvbkJDLmdldE9mZnNldCgpICsgNik7CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IEFkZCB0cmltbWluZworICAgICAgICAgICAgICAgIC8vIGF1dGhvcml6YXRpb25CQy50cmltKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQ2hhckNodW5rIGF1dGhvcml6YXRpb25DQyA9IGF1dGhvcml6YXRpb24uZ2V0Q2hhckNodW5rKCk7CisgICAgICAgICAgICAgICAgQmFzZTY0LmRlY29kZShhdXRob3JpemF0aW9uQkMsIGF1dGhvcml6YXRpb25DQyk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gR2V0IHVzZXJuYW1lIGFuZCBwYXNzd29yZAorICAgICAgICAgICAgICAgIGludCBjb2xvbiA9IGF1dGhvcml6YXRpb25DQy5pbmRleE9mKCc6Jyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbG9uIDwgMCkgeworICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSA9IGF1dGhvcml6YXRpb25DQy50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBhdXRob3JpemF0aW9uQ0MuZ2V0QnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lID0gbmV3IFN0cmluZyhidWYsIDAsIGNvbG9uKTsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBuZXcgU3RyaW5nKGJ1ZiwgY29sb24gKyAxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uQ0MuZ2V0RW5kKCkgLSBjb2xvbiAtIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uQkMuc2V0T2Zmc2V0KGF1dGhvcml6YXRpb25CQy5nZXRPZmZzZXQoKSAtIDYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcmluY2lwYWwgPSBjb250ZXh0LmdldFJlYWxtKCkuYXV0aGVudGljYXRlKHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgICAgICAgICBpZiAocHJpbmNpcGFsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlcihyZXF1ZXN0LCByZXNwb25zZSwgcHJpbmNpcGFsLCBDb25zdGFudHMuQkFTSUNfTUVUSE9ELAorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKworICAgICAgICAvLyBTZW5kIGFuICJ1bmF1dGhvcml6ZWQiIHJlc3BvbnNlIGFuZCBhbiBhcHByb3ByaWF0ZSBjaGFsbGVuZ2UKKyAgICAgICAgTWVzc2FnZUJ5dGVzIGF1dGhlbnRpY2F0ZSA9IAorICAgICAgICAgICAgcmVzcG9uc2UuZ2V0Q295b3RlUmVzcG9uc2UoKS5nZXRNaW1lSGVhZGVycygpCisgICAgICAgICAgICAuYWRkVmFsdWUoQVVUSEVOVElDQVRFX0JZVEVTLCAwLCBBVVRIRU5USUNBVEVfQllURVMubGVuZ3RoKTsKKyAgICAgICAgQ2hhckNodW5rIGF1dGhlbnRpY2F0ZUNDID0gYXV0aGVudGljYXRlLmdldENoYXJDaHVuaygpOworICAgICAgICBhdXRoZW50aWNhdGVDQy5hcHBlbmQoIkJhc2ljIHJlYWxtPVwiIik7CisgICAgICAgIGlmIChjb25maWcuZ2V0UmVhbG1OYW1lKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgYXV0aGVudGljYXRlQ0MuYXBwZW5kKHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpKTsKKyAgICAgICAgICAgIGF1dGhlbnRpY2F0ZUNDLmFwcGVuZCgnOicpOworICAgICAgICAgICAgYXV0aGVudGljYXRlQ0MuYXBwZW5kKEludGVnZXIudG9TdHJpbmcocmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF1dGhlbnRpY2F0ZUNDLmFwcGVuZChjb25maWcuZ2V0UmVhbG1OYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGF1dGhlbnRpY2F0ZUNDLmFwcGVuZCgnXCInKTsgICAgICAgIAorICAgICAgICBhdXRoZW50aWNhdGUudG9DaGFycygpOworICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19VTkFVVEhPUklaRUQpOworICAgICAgICAvL3Jlc3BvbnNlLmZsdXNoQnVmZmVyKCk7CisgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0NvbnN0YW50cy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmNDdiYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvcjsKKworCitwdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhY2thZ2UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yIjsKKworICAgIC8vIEF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgZm9yIGxvZ2luIGNvbmZpZ3VyYXRpb24KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQ19NRVRIT0QgPSAiQkFTSUMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENFUlRfTUVUSE9EID0gIkNMSUVOVF9DRVJUIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUdFU1RfTUVUSE9EID0gIkRJR0VTVCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9NRVRIT0QgPSAiRk9STSI7CisKKyAgICAvLyBVc2VyIGRhdGEgY29uc3RyYWludHMgZm9yIHRyYW5zcG9ydCBndWFyYW50ZWUKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FX1RSQU5TUE9SVCA9ICJOT05FIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFR1JBTF9UUkFOU1BPUlQgPSAiSU5URUdSQUwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJREVOVElBTF9UUkFOU1BPUlQgPSAiQ09ORklERU5USUFMIjsKKworICAgIC8vIEZvcm0gYmFzZWQgYXV0aGVudGljYXRpb24gY29uc3RhbnRzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9BQ1RJT04gPSAiL2pfc2VjdXJpdHlfY2hlY2siOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFTU1dPUkQgPSAial9wYXNzd29yZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9VU0VSTkFNRSA9ICJqX3VzZXJuYW1lIjsKKworICAgIC8vIENvb2tpZSBuYW1lIGZvciBzaW5nbGUgc2lnbiBvbiBzdXBwb3J0CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFX1NJR05fT05fQ09PS0lFID0gIkpTRVNTSU9OSURTU08iOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVxdWVzdCBOb3RlcworCisKKyAgICAvKioKKyAgICAgKiA8cD5JZiBhIHVzZXIgaGFzIGJlZW4gYXV0aGVudGljYXRlZCBieSB0aGUgd2ViIGxheWVyLCBieSBtZWFucyBvZiBhCisgICAgICogbG9naW4gbWV0aG9kIG90aGVyIHRoYW4gQ0xJRU5UX0NFUlQsIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQKKyAgICAgKiB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSByZXF1ZXN0IGFzCisgICAgICogTm90ZXMgZm9yIHVzZSBieSBvdGhlciBzZXJ2ZXIgY29tcG9uZW50cy4gIEEgc2VydmVyIGNvbXBvbmVudCBjYW4KKyAgICAgKiBhbHNvIGNhbGwgc2V2ZXJhbCBleGlzdGluZyBtZXRob2RzIG9uIFJlcXVlc3QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKyAgICAgKiBvciBub3QgYW55IHVzZXIgaGFzIGJlZW4gYXV0aGVudGljYXRlZDo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT48c3Ryb25nPnJlcXVlc3QuZ2V0QXV0aFR5cGUoKTwvc3Ryb25nPgorICAgICAqICAgICB3aWxsIHJldHVybiBCQVNJQywgQ0xJRU5UX0NFUlQsIERJR0VTVCwgRk9STSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiAgICAgaWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRlZCB1c2VyLjwvbGk+CisgICAgICogPGxpPjxzdHJvbmc+cmVxdWVzdC5nZXRVc2VyUHJpbmNpcGFsKCk8L3N0cm9uZz4KKyAgICAgKiAgICAgd2lsbCByZXR1cm4gdGhlIGF1dGhlbnRpY2F0ZWQgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiByZXR1cm5lZCBieSB0aGUKKyAgICAgKiAgICAgPGNvZGU+UmVhbG08L2NvZGU+IHRoYXQgYXV0aGVudGljYXRlZCB0aGlzIHVzZXIuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPklmIENMSUVOVF9DRVJUIGF1dGhlbnRpY2F0aW9uIHdhcyBwZXJmb3JtZWQsIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbgorICAgICAqIHdpbGwgYmUgYXZhaWxhYmxlIGFzIGEgcmVxdWVzdCBhdHRyaWJ1dGUsIGFzIGRlZmluZWQgaW4gdGhlCisgICAgICogc2VydmxldCBzcGVjaWZpY2F0aW9uLjwvcD4KKyAgICAgKi8KKworCisgICAgLyoqCisgICAgICogVGhlIG5vdGVzIGtleSBmb3IgdGhlIHBhc3N3b3JkIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFfUEFTU1dPUkRfTk9URSA9CisgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5yZXF1ZXN0LlBBU1NXT1JEIjsKKworCisgICAgLyoqCisgICAgICogVGhlIG5vdGVzIGtleSBmb3IgdGhlIHVzZXJuYW1lIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFfVVNFUk5BTUVfTk9URSA9CisgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5yZXF1ZXN0LlVTRVJOQU1FIjsKKworCisgICAgLyoqCisgICAgICogVGhlIG5vdGVzIGtleSB0byB0cmFjayB0aGUgc2luZ2xlLXNpZ24tb24gaWRlbnRpdHkgd2l0aCB3aGljaCB0aGlzCisgICAgICogcmVxdWVzdCBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUV9TU09JRF9OT1RFID0KKyAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlcXVlc3QuU1NPSUQiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlc3Npb24gTm90ZXMKKworCisgICAgLyoqCisgICAgICogSWYgdGhlIDxjb2RlPmNhY2hlPC9jb2RlPiBwcm9wZXJ0eSBvZiBvdXIgYXV0aGVudGljYXRvciBpcyBzZXQsIGFuZAorICAgICAqIHRoZSBjdXJyZW50IHJlcXVlc3QgaXMgcGFydCBvZiBhIHNlc3Npb24sIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uCisgICAgICogd2lsbCBiZSBjYWNoZWQgdG8gYXZvaWQgdGhlIG5lZWQgZm9yIHJlcGVhdGVkIGNhbGxzIHRvCisgICAgICogPGNvZGU+UmVhbG0uYXV0aGVudGljYXRlKCk8L2NvZGU+LCB1bmRlciB0aGUgZm9sbG93aW5nIGtleXM6CisgICAgICovCisKKworICAgIC8qKgorICAgICAqIFRoZSBub3RlcyBrZXkgZm9yIHRoZSBwYXNzd29yZCB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU19QQVNTV09SRF9OT1RFID0KKyAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uUEFTU1dPUkQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbm90ZXMga2V5IGZvciB0aGUgdXNlcm5hbWUgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhpcyB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NfVVNFUk5BTUVfTk9URSA9CisgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlVTRVJOQU1FIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGZvbGxvd2luZyBub3RlIGtleXMgYXJlIHVzZWQgZHVyaW5nIGZvcm0gbG9naW4gcHJvY2Vzc2luZyB0bworICAgICAqIGNhY2hlIHJlcXVpcmVkIGluZm9ybWF0aW9uIHByaW9yIHRvIHRoZSBjb21wbGV0aW9uIG9mIGF1dGhlbnRpY2F0aW9uLgorICAgICAqLworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJldmlvdXNseSBhdXRoZW50aWNhdGVkIHByaW5jaXBhbCAoaWYgY2FjaGluZyBpcyBkaXNhYmxlZCkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QUklOQ0lQQUxfTk9URSA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuUFJJTkNJUEFMIjsKKworCisgICAgLyoqCisgICAgICogVGhlIG9yaWdpbmFsIHJlcXVlc3QgaW5mb3JtYXRpb24sIHRvIHdoaWNoIHRoZSB1c2VyIHdpbGwgYmUKKyAgICAgKiByZWRpcmVjdGVkIGlmIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUkVRVUVTVF9OT1RFID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5SRVFVRVNUIjsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9EaWdlc3RBdXRoZW50aWNhdG9yLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9EaWdlc3RBdXRoZW50aWNhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2NmQ0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0RpZ2VzdEF1dGhlbnRpY2F0b3IuamF2YQpAQCAtMCwwICsxLDQyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3I7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkxvZ2luQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5NRDVFbmNvZGVyOworCisKKworLyoqCisgKiBBbiA8Yj5BdXRoZW50aWNhdG9yPC9iPiBhbmQgPGI+VmFsdmU8L2I+IGltcGxlbWVudGF0aW9uIG9mIEhUVFAgRElHRVNUCisgKiBBdXRoZW50aWNhdGlvbiAoc2VlIFJGQyAyMDY5KS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERpZ2VzdEF1dGhlbnRpY2F0b3IKKyAgICBleHRlbmRzIEF1dGhlbnRpY2F0b3JCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGlnZXN0QXV0aGVudGljYXRvci5jbGFzcyk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisgICAgLyoqCisgICAgICogVGhlIE1ENSBoZWxwZXIgb2JqZWN0IGZvciB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTUQ1RW5jb2RlciBtZDVFbmNvZGVyID0gbmV3IE1ENUVuY29kZXIoKTsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5EaWdlc3RBdXRoZW50aWNhdG9yLzEuMCI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICBwdWJsaWMgRGlnZXN0QXV0aGVudGljYXRvcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChtZDVIZWxwZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBtZDVIZWxwZXIgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBNRDUgbWVzc2FnZSBkaWdlc3QgcHJvdmlkZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBNZXNzYWdlRGlnZXN0IG1kNUhlbHBlcjsKKworCisgICAgLyoqCisgICAgICogUHJpdmF0ZSBrZXkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBrZXkgPSAiQ2F0YWxpbmEiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBdXRoZW50aWNhdGUgdGhlIHVzZXIgbWFraW5nIHRoaXMgcmVxdWVzdCwgYmFzZWQgb24gdGhlIHNwZWNpZmllZAorICAgICAqIGxvZ2luIGNvbmZpZ3VyYXRpb24uICBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW55IHNwZWNpZmllZAorICAgICAqIGNvbnN0cmFpbnQgaGFzIGJlZW4gc2F0aXNmaWVkLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgd2UgaGF2ZQorICAgICAqIGNyZWF0ZWQgYSByZXNwb25zZSBjaGFsbGVuZ2UgYWxyZWFkeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHBhcmFtIGNvbmZpZyAgICBMb2dpbiBjb25maWd1cmF0aW9uIGRlc2NyaWJpbmcgaG93IGF1dGhlbnRpY2F0aW9uCisgICAgICogICAgICAgICAgICAgIHNob3VsZCBiZSBwZXJmb3JtZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dpbkNvbmZpZyBjb25maWcpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gSGF2ZSB3ZSBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQgc29tZW9uZT8KKyAgICAgICAgUHJpbmNpcGFsIHByaW5jaXBhbCA9IHJlcXVlc3QuZ2V0VXNlclByaW5jaXBhbCgpOworICAgICAgICAvL1N0cmluZyBzc29JZCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0Tm90ZShDb25zdGFudHMuUkVRX1NTT0lEX05PVEUpOworICAgICAgICBpZiAocHJpbmNpcGFsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFscmVhZHkgYXV0aGVudGljYXRlZCAnIiArIHByaW5jaXBhbC5nZXROYW1lKCkgKyAiJyIpOworICAgICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBzZXNzaW9uIHdpdGggYW55IGV4aXN0aW5nIFNTTyBzZXNzaW9uIGluIG9yZGVyCisgICAgICAgICAgICAvLyB0byBnZXQgY29vcmRpbmF0ZWQgc2Vzc2lvbiBpbnZhbGlkYXRpb24gYXQgbG9nb3V0CisgICAgICAgICAgICBTdHJpbmcgc3NvSWQgPSAoU3RyaW5nKSByZXF1ZXN0LmdldE5vdGUoQ29uc3RhbnRzLlJFUV9TU09JRF9OT1RFKTsKKyAgICAgICAgICAgIGlmIChzc29JZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGFzc29jaWF0ZShzc29JZCwgcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwodHJ1ZSkpOworICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5PVEU6IFdlIGRvbid0IHRyeSB0byByZWF1dGhlbnRpY2F0ZSB1c2luZyBhbnkgZXhpc3RpbmcgU1NPIHNlc3Npb24sCisgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3aWxsIG9ubHkgd29yayBpZiB0aGUgb3JpZ2luYWwgYXV0aGVudGljYXRpb24gd2FzCisgICAgICAgIC8vIEJBU0lDIG9yIEZPUk0sIHdoaWNoIGFyZSBsZXNzIHNlY3VyZSB0aGFuIHRoZSBESUdFU1QgYXV0aC10eXBlCisgICAgICAgIC8vIHNwZWNpZmllZCBmb3IgdGhpcyB3ZWJhcHAKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVW5jb21tZW50IGJlbG93IHRvIGFsbG93IHByZXZpb3VzIEZPUk0gb3IgQkFTSUMgYXV0aGVudGljYXRpb25zCisgICAgICAgIC8vIHRvIGF1dGhlbnRpY2F0ZSB1c2VycyBmb3IgdGhpcyB3ZWJhcHAKKyAgICAgICAgLy8gVE9ETyBtYWtlIHRoaXMgYSBjb25maWd1cmFibGUgYXR0cmlidXRlIChpbiBTaW5nbGVTaWduT24/PykKKyAgICAgICAgLyoKKyAgICAgICAgLy8gSXMgdGhlcmUgYW4gU1NPIHNlc3Npb24gYWdhaW5zdCB3aGljaCB3ZSBjYW4gdHJ5IHRvIHJlYXV0aGVudGljYXRlPworICAgICAgICBpZiAoc3NvSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU1NPIElkICIgKyBzc29JZCArICIgc2V0OyBhdHRlbXB0aW5nICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhdXRoZW50aWNhdGlvbiIpOworICAgICAgICAgICAgLy8gVHJ5IHRvIHJlYXV0aGVudGljYXRlIHVzaW5nIGRhdGEgY2FjaGVkIGJ5IFNTTy4gIElmIHRoaXMgZmFpbHMsCisgICAgICAgICAgICAvLyBlaXRoZXIgdGhlIG9yaWdpbmFsIFNTTyBsb2dvbiB3YXMgb2YgRElHRVNUIG9yIFNTTCAod2hpY2gKKyAgICAgICAgICAgIC8vIHdlIGNhbid0IHJlYXV0aGVudGljYXRlIG91cnNlbHZlcyBiZWNhdXNlIHRoZXJlIGlzIG5vCisgICAgICAgICAgICAvLyBjYWNoZWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkKSwgb3IgdGhlIHJlYWxtIGRlbmllZAorICAgICAgICAgICAgLy8gdGhlIHVzZXIncyByZWF1dGhlbnRpY2F0aW9uIGZvciBzb21lIHJlYXNvbi4KKyAgICAgICAgICAgIC8vIEluIGVpdGhlciBjYXNlIHdlIGhhdmUgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciBhIGxvZ29uCisgICAgICAgICAgICBpZiAocmVhdXRoZW50aWNhdGVGcm9tU1NPKHNzb0lkLCByZXF1ZXN0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAqLworCisgICAgICAgIC8vIFZhbGlkYXRlIGFueSBjcmVkZW50aWFscyBhbHJlYWR5IGluY2x1ZGVkIHdpdGggdGhpcyByZXF1ZXN0CisgICAgICAgIFN0cmluZyBhdXRob3JpemF0aW9uID0gcmVxdWVzdC5nZXRIZWFkZXIoImF1dGhvcml6YXRpb24iKTsKKyAgICAgICAgaWYgKGF1dGhvcml6YXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgcHJpbmNpcGFsID0gZmluZFByaW5jaXBhbChyZXF1ZXN0LCBhdXRob3JpemF0aW9uLCBjb250ZXh0LmdldFJlYWxtKCkpOworICAgICAgICAgICAgaWYgKHByaW5jaXBhbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gcGFyc2VVc2VybmFtZShhdXRob3JpemF0aW9uKTsKKyAgICAgICAgICAgICAgICByZWdpc3RlcihyZXF1ZXN0LCByZXNwb25zZSwgcHJpbmNpcGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5ESUdFU1RfTUVUSE9ELAorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lLCBudWxsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2VuZCBhbiAidW5hdXRob3JpemVkIiByZXNwb25zZSBhbmQgYW4gYXBwcm9wcmlhdGUgY2hhbGxlbmdlCisKKyAgICAgICAgLy8gTmV4dCwgZ2VuZXJhdGUgYSBuT25jZSB0b2tlbiAodGhhdCBpcyBhIHRva2VuIHdoaWNoIGlzIHN1cHBvc2VkCisgICAgICAgIC8vIHRvIGJlIHVuaXF1ZSkuCisgICAgICAgIFN0cmluZyBuT25jZSA9IGdlbmVyYXRlTk9uY2UocmVxdWVzdCk7CisKKyAgICAgICAgc2V0QXV0aGVudGljYXRlSGVhZGVyKHJlcXVlc3QsIHJlc3BvbnNlLCBjb25maWcsIG5PbmNlKTsKKyAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEKTsKKyAgICAgICAgLy8gICAgICBocmVzLmZsdXNoQnVmZmVyKCk7CisgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIHNwZWNpZmllZCBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzLCBhbmQgcmV0dXJuIHRoZQorICAgICAqIGFzc29jaWF0ZWQgUHJpbmNpcGFsIHRoYXQgdGhlc2UgY3JlZGVudGlhbHMgYXV0aGVudGljYXRlIChpZiBhbnkpCisgICAgICogZnJvbSB0aGUgc3BlY2lmaWVkIFJlYWxtLiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBQcmluY2lwYWwsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgSFRUUCBzZXJ2bGV0IHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gYXV0aG9yaXphdGlvbiBBdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIGZyb20gdGhpcyByZXF1ZXN0CisgICAgICogQHBhcmFtIHJlYWxtIFJlYWxtIHVzZWQgdG8gYXV0aGVudGljYXRlIFByaW5jaXBhbHMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFByaW5jaXBhbCBmaW5kUHJpbmNpcGFsKFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdXRob3JpemF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbG0gcmVhbG0pIHsKKworICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiQXV0aG9yaXphdGlvbiB0b2tlbiA6ICIgKyBhdXRob3JpemF0aW9uKTsKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGF1dGhvcml6YXRpb24gY3JlZGVudGlhbHMgZm9ybWF0CisgICAgICAgIGlmIChhdXRob3JpemF0aW9uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBpZiAoIWF1dGhvcml6YXRpb24uc3RhcnRzV2l0aCgiRGlnZXN0ICIpKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgYXV0aG9yaXphdGlvbiA9IGF1dGhvcml6YXRpb24uc3Vic3RyaW5nKDcpLnRyaW0oKTsKKworICAgICAgICAvLyBCdWd6aWxsYSAzNzEzMjogaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNzEzMgorICAgICAgICBTdHJpbmdbXSB0b2tlbnMgPSBhdXRob3JpemF0aW9uLnNwbGl0KCIsKD89KD86W15cIl0qXCJbXlwiXSpcIikrJCkiKTsKKworICAgICAgICBTdHJpbmcgdXNlck5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgcmVhbG1OYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIG5PbmNlID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIG5jID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGNub25jZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBxb3AgPSBudWxsOworICAgICAgICBTdHJpbmcgdXJpID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIG1ldGhvZCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBjdXJyZW50VG9rZW4gPSB0b2tlbnNbaV07CisgICAgICAgICAgICBpZiAoY3VycmVudFRva2VuLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGludCBlcXVhbFNpZ24gPSBjdXJyZW50VG9rZW4uaW5kZXhPZignPScpOworICAgICAgICAgICAgaWYgKGVxdWFsU2lnbiA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBTdHJpbmcgY3VycmVudFRva2VuTmFtZSA9CisgICAgICAgICAgICAgICAgY3VycmVudFRva2VuLnN1YnN0cmluZygwLCBlcXVhbFNpZ24pLnRyaW0oKTsKKyAgICAgICAgICAgIFN0cmluZyBjdXJyZW50VG9rZW5WYWx1ZSA9CisgICAgICAgICAgICAgICAgY3VycmVudFRva2VuLnN1YnN0cmluZyhlcXVhbFNpZ24gKyAxKS50cmltKCk7CisgICAgICAgICAgICBpZiAoInVzZXJuYW1lIi5lcXVhbHMoY3VycmVudFRva2VuTmFtZSkpCisgICAgICAgICAgICAgICAgdXNlck5hbWUgPSByZW1vdmVRdW90ZXMoY3VycmVudFRva2VuVmFsdWUpOworICAgICAgICAgICAgaWYgKCJyZWFsbSIuZXF1YWxzKGN1cnJlbnRUb2tlbk5hbWUpKQorICAgICAgICAgICAgICAgIHJlYWxtTmFtZSA9IHJlbW92ZVF1b3RlcyhjdXJyZW50VG9rZW5WYWx1ZSwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoIm5vbmNlIi5lcXVhbHMoY3VycmVudFRva2VuTmFtZSkpCisgICAgICAgICAgICAgICAgbk9uY2UgPSByZW1vdmVRdW90ZXMoY3VycmVudFRva2VuVmFsdWUpOworICAgICAgICAgICAgaWYgKCJuYyIuZXF1YWxzKGN1cnJlbnRUb2tlbk5hbWUpKQorICAgICAgICAgICAgICAgIG5jID0gcmVtb3ZlUXVvdGVzKGN1cnJlbnRUb2tlblZhbHVlKTsKKyAgICAgICAgICAgIGlmICgiY25vbmNlIi5lcXVhbHMoY3VycmVudFRva2VuTmFtZSkpCisgICAgICAgICAgICAgICAgY25vbmNlID0gcmVtb3ZlUXVvdGVzKGN1cnJlbnRUb2tlblZhbHVlKTsKKyAgICAgICAgICAgIGlmICgicW9wIi5lcXVhbHMoY3VycmVudFRva2VuTmFtZSkpCisgICAgICAgICAgICAgICAgcW9wID0gcmVtb3ZlUXVvdGVzKGN1cnJlbnRUb2tlblZhbHVlKTsKKyAgICAgICAgICAgIGlmICgidXJpIi5lcXVhbHMoY3VycmVudFRva2VuTmFtZSkpCisgICAgICAgICAgICAgICAgdXJpID0gcmVtb3ZlUXVvdGVzKGN1cnJlbnRUb2tlblZhbHVlKTsKKyAgICAgICAgICAgIGlmICgicmVzcG9uc2UiLmVxdWFscyhjdXJyZW50VG9rZW5OYW1lKSkKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IHJlbW92ZVF1b3RlcyhjdXJyZW50VG9rZW5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICh1c2VyTmFtZSA9PSBudWxsKSB8fCAocmVhbG1OYW1lID09IG51bGwpIHx8IChuT25jZSA9PSBudWxsKQorICAgICAgICAgICAgIHx8ICh1cmkgPT0gbnVsbCkgfHwgKHJlc3BvbnNlID09IG51bGwpICkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIFNlY29uZCBNRDUgZGlnZXN0IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBkaWdlc3QgOgorICAgICAgICAvLyBNRDUoTWV0aG9kICsgIjoiICsgdXJpKQorICAgICAgICBTdHJpbmcgYTIgPSBtZXRob2QgKyAiOiIgKyB1cmk7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJBMjoiICsgYTIpOworCisgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1kNUhlbHBlcikgeworICAgICAgICAgICAgYnVmZmVyID0gbWQ1SGVscGVyLmRpZ2VzdChhMi5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbWQ1YTIgPSBtZDVFbmNvZGVyLmVuY29kZShidWZmZXIpOworCisgICAgICAgIHJldHVybiAocmVhbG0uYXV0aGVudGljYXRlKHVzZXJOYW1lLCByZXNwb25zZSwgbk9uY2UsIG5jLCBjbm9uY2UsIHFvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbG1OYW1lLCBtZDVhMikpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgdXNlcm5hbWUgZnJvbSB0aGUgc3BlY2lmaWVkIGF1dGhvcml6YXRpb24gc3RyaW5nLiAgSWYgbm9uZQorICAgICAqIGNhbiBiZSBpZGVudGlmaWVkLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdXRob3JpemF0aW9uIEF1dGhvcml6YXRpb24gc3RyaW5nIHRvIGJlIHBhcnNlZAorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGFyc2VVc2VybmFtZShTdHJpbmcgYXV0aG9yaXphdGlvbikgeworCisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJBdXRob3JpemF0aW9uIHRva2VuIDogIiArIGF1dGhvcml6YXRpb24pOworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFscyBmb3JtYXQKKyAgICAgICAgaWYgKGF1dGhvcml6YXRpb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIGlmICghYXV0aG9yaXphdGlvbi5zdGFydHNXaXRoKCJEaWdlc3QgIikpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBhdXRob3JpemF0aW9uID0gYXV0aG9yaXphdGlvbi5zdWJzdHJpbmcoNykudHJpbSgpOworCisgICAgICAgIFN0cmluZ1Rva2VuaXplciBjb21tYVRva2VuaXplciA9CisgICAgICAgICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKGF1dGhvcml6YXRpb24sICIsIik7CisKKyAgICAgICAgd2hpbGUgKGNvbW1hVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRUb2tlbiA9IGNvbW1hVG9rZW5pemVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgaW50IGVxdWFsU2lnbiA9IGN1cnJlbnRUb2tlbi5pbmRleE9mKCc9Jyk7CisgICAgICAgICAgICBpZiAoZXF1YWxTaWduIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBjdXJyZW50VG9rZW5OYW1lID0KKyAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4uc3Vic3RyaW5nKDAsIGVxdWFsU2lnbikudHJpbSgpOworICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRUb2tlblZhbHVlID0KKyAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4uc3Vic3RyaW5nKGVxdWFsU2lnbiArIDEpLnRyaW0oKTsKKyAgICAgICAgICAgIGlmICgidXNlcm5hbWUiLmVxdWFscyhjdXJyZW50VG9rZW5OYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHJlbW92ZVF1b3RlcyhjdXJyZW50VG9rZW5WYWx1ZSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgcXVvdGVzIG9uIGEgc3RyaW5nLiBSRkMyNjE3IHN0YXRlcyBxdW90ZXMgYXJlIG9wdGlvbmFsIGZvcgorICAgICAqIGFsbCBwYXJhbWV0ZXJzIGV4Y2VwdCByZWFsbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyByZW1vdmVRdW90ZXMoU3RyaW5nIHF1b3RlZFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBxdW90ZXNSZXF1aXJlZCkgeworICAgICAgICAvL3N1cHBvcnQgYm90aCBxdW90ZWQgYW5kIG5vbi1xdW90ZWQKKyAgICAgICAgaWYgKHF1b3RlZFN0cmluZy5sZW5ndGgoKSA+IDAgJiYgcXVvdGVkU3RyaW5nLmNoYXJBdCgwKSAhPSAnIicgJiYKKyAgICAgICAgICAgICAgICAhcXVvdGVzUmVxdWlyZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBxdW90ZWRTdHJpbmc7CisgICAgICAgIH0gZWxzZSBpZiAocXVvdGVkU3RyaW5nLmxlbmd0aCgpID4gMikgeworICAgICAgICAgICAgcmV0dXJuIHF1b3RlZFN0cmluZy5zdWJzdHJpbmcoMSwgcXVvdGVkU3RyaW5nLmxlbmd0aCgpIC0gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgcXVvdGVzIG9uIGEgc3RyaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlbW92ZVF1b3RlcyhTdHJpbmcgcXVvdGVkU3RyaW5nKSB7CisgICAgICAgIHJldHVybiByZW1vdmVRdW90ZXMocXVvdGVkU3RyaW5nLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgYSB1bmlxdWUgdG9rZW4uIFRoZSB0b2tlbiBpcyBnZW5lcmF0ZWQgYWNjb3JkaW5nIHRvIHRoZQorICAgICAqIGZvbGxvd2luZyBwYXR0ZXJuLiBOT25jZVRva2VuID0gQmFzZTY0ICggTUQ1ICggY2xpZW50LUlQICI6IgorICAgICAqIHRpbWUtc3RhbXAgIjoiIHByaXZhdGUta2V5ICkgKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IEhUVFAgU2VydmxldCByZXF1ZXN0CisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZW5lcmF0ZU5PbmNlKFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIGxvbmcgY3VycmVudFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBTdHJpbmcgbk9uY2VWYWx1ZSA9IHJlcXVlc3QuZ2V0UmVtb3RlQWRkcigpICsgIjoiICsKKyAgICAgICAgICAgIGN1cnJlbnRUaW1lICsgIjoiICsga2V5OworCisgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1kNUhlbHBlcikgeworICAgICAgICAgICAgYnVmZmVyID0gbWQ1SGVscGVyLmRpZ2VzdChuT25jZVZhbHVlLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgICAgIG5PbmNlVmFsdWUgPSBtZDVFbmNvZGVyLmVuY29kZShidWZmZXIpOworCisgICAgICAgIHJldHVybiBuT25jZVZhbHVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBXV1ctQXV0aGVudGljYXRlIGhlYWRlci4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgaGVhZGVyIE1VU1QgZm9sbG93IHRoaXMgdGVtcGxhdGUgOgorICAgICAqIDxwcmU+CisgICAgICogICAgICBXV1ctQXV0aGVudGljYXRlICAgID0gIldXVy1BdXRoZW50aWNhdGUiICI6IiAiRGlnZXN0IgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2VzdC1jaGFsbGVuZ2UKKyAgICAgKgorICAgICAqICAgICAgZGlnZXN0LWNoYWxsZW5nZSAgICA9IDEjKCByZWFsbSB8IFsgZG9tYWluIF0gfCBuT25jZSB8CisgICAgICogICAgICAgICAgICAgICAgICBbIGRpZ2VzdC1vcGFxdWUgXSB8WyBzdGFsZSBdIHwgWyBhbGdvcml0aG0gXSApCisgICAgICoKKyAgICAgKiAgICAgIHJlYWxtICAgICAgICAgICAgICAgPSAicmVhbG0iICI9IiByZWFsbS12YWx1ZQorICAgICAqICAgICAgcmVhbG0tdmFsdWUgICAgICAgICA9IHF1b3RlZC1zdHJpbmcKKyAgICAgKiAgICAgIGRvbWFpbiAgICAgICAgICAgICAgPSAiZG9tYWluIiAiPSIgPCI+IDEjVVJJIDwiPgorICAgICAqICAgICAgbm9uY2UgICAgICAgICAgICAgICA9ICJub25jZSIgIj0iIG5vbmNlLXZhbHVlCisgICAgICogICAgICBub25jZS12YWx1ZSAgICAgICAgID0gcXVvdGVkLXN0cmluZworICAgICAqICAgICAgb3BhcXVlICAgICAgICAgICAgICA9ICJvcGFxdWUiICI9IiBxdW90ZWQtc3RyaW5nCisgICAgICogICAgICBzdGFsZSAgICAgICAgICAgICAgID0gInN0YWxlIiAiPSIgKCAidHJ1ZSIgfCAiZmFsc2UiICkKKyAgICAgKiAgICAgIGFsZ29yaXRobSAgICAgICAgICAgPSAiYWxnb3JpdGhtIiAiPSIgKCAiTUQ1IiB8IHRva2VuICkKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IEhUVFAgU2VydmxldCByZXF1ZXN0CisgICAgICogQHBhcmFtIHJlc3BvbnNlIEhUVFAgU2VydmxldCByZXNwb25zZQorICAgICAqIEBwYXJhbSBjb25maWcgICAgTG9naW4gY29uZmlndXJhdGlvbiBkZXNjcmliaW5nIGhvdyBhdXRoZW50aWNhdGlvbgorICAgICAqICAgICAgICAgICAgICBzaG91bGQgYmUgcGVyZm9ybWVkCisgICAgICogQHBhcmFtIG5PbmNlIG5vbmNlIHRva2VuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0QXV0aGVudGljYXRlSGVhZGVyKFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2luQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5PbmNlKSB7CisKKyAgICAgICAgLy8gR2V0IHRoZSByZWFsbSBuYW1lCisgICAgICAgIFN0cmluZyByZWFsbU5hbWUgPSBjb25maWcuZ2V0UmVhbG1OYW1lKCk7CisgICAgICAgIGlmIChyZWFsbU5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJlYWxtTmFtZSA9IHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpICsgIjoiCisgICAgICAgICAgICAgICAgKyByZXF1ZXN0LmdldFNlcnZlclBvcnQoKTsKKworICAgICAgICBieXRlW10gYnVmZmVyID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChtZDVIZWxwZXIpIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG1kNUhlbHBlci5kaWdlc3Qobk9uY2UuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgYXV0aGVudGljYXRlSGVhZGVyID0gIkRpZ2VzdCByZWFsbT1cIiIgKyByZWFsbU5hbWUgKyAiXCIsICIKKyAgICAgICAgICAgICsgICJxb3A9XCJhdXRoXCIsIG5vbmNlPVwiIiArIG5PbmNlICsgIlwiLCAiICsgIm9wYXF1ZT1cIiIKKyAgICAgICAgICAgICsgbWQ1RW5jb2Rlci5lbmNvZGUoYnVmZmVyKSArICJcIiI7CisgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiV1dXLUF1dGhlbnRpY2F0ZSIsIGF1dGhlbnRpY2F0ZUhlYWRlcik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvRm9ybUF1dGhlbnRpY2F0b3IuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0Zvcm1BdXRoZW50aWNhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5ZTFiNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0Zvcm1BdXRoZW50aWNhdG9yLmphdmEKQEAgLTAsMCArMSw1MzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Mb2dpbkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNveW90ZS5BY3Rpb25Db2RlOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLkJ5dGVDaHVuazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5DaGFyQ2h1bms7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuTWVzc2FnZUJ5dGVzOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuaHR0cC5NaW1lSGVhZGVyczsKKworCisvKioKKyAqIEFuIDxiPkF1dGhlbnRpY2F0b3I8L2I+IGFuZCA8Yj5WYWx2ZTwvYj4gaW1wbGVtZW50YXRpb24gb2YgRk9STSBCQVNFRAorICogQXV0aGVudGljYXRpb24sIGFzIGRlc2NyaWJlZCBpbiB0aGUgU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbiwgVmVyc2lvbiAyLjIuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBGb3JtQXV0aGVudGljYXRvcgorICAgIGV4dGVuZHMgQXV0aGVudGljYXRvckJhc2UgeworICAgIAorICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhGb3JtQXV0aGVudGljYXRvci5jbGFzcyk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5Gb3JtQXV0aGVudGljYXRvci8xLjAiOworCisgICAgLyoqCisgICAgICogQ2hhcmFjdGVyIGVuY29kaW5nIHRvIHVzZSB0byByZWFkIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgcGFyYW1ldGVycworICAgICAqIGZyb20gdGhlIHJlcXVlc3QuIElmIG5vdCBzZXQsIHRoZSBlbmNvZGluZyBvZiB0aGUgcmVxdWVzdCBib2R5IHdpbGwgYmUKKyAgICAgKiB1c2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY2hhcmFjdGVyRW5jb2RpbmcgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHVzZSB0byByZWFkIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpIHsKKyAgICAgICAgcmV0dXJuIGNoYXJhY3RlckVuY29kaW5nOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIGJlIHVzZWQgdG8gcmVhZCB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgY2hhcmFjdGVyRW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBdXRoZW50aWNhdGUgdGhlIHVzZXIgbWFraW5nIHRoaXMgcmVxdWVzdCwgYmFzZWQgb24gdGhlIHNwZWNpZmllZAorICAgICAqIGxvZ2luIGNvbmZpZ3VyYXRpb24uICBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW55IHNwZWNpZmllZAorICAgICAqIGNvbnN0cmFpbnQgaGFzIGJlZW4gc2F0aXNmaWVkLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgd2UgaGF2ZQorICAgICAqIGNyZWF0ZWQgYSByZXNwb25zZSBjaGFsbGVuZ2UgYWxyZWFkeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHBhcmFtIGNvbmZpZyAgICBMb2dpbiBjb25maWd1cmF0aW9uIGRlc2NyaWJpbmcgaG93IGF1dGhlbnRpY2F0aW9uCisgICAgICogICAgICAgICAgICAgIHNob3VsZCBiZSBwZXJmb3JtZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dpbkNvbmZpZyBjb25maWcpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUmVmZXJlbmNlcyB0byBvYmplY3RzIHdlIHdpbGwgbmVlZCBsYXRlcgorICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBudWxsOworCisgICAgICAgIC8vIEhhdmUgd2UgYWxyZWFkeSBhdXRoZW50aWNhdGVkIHNvbWVvbmU/CisgICAgICAgIFByaW5jaXBhbCBwcmluY2lwYWwgPSByZXF1ZXN0LmdldFVzZXJQcmluY2lwYWwoKTsKKyAgICAgICAgU3RyaW5nIHNzb0lkID0gKFN0cmluZykgcmVxdWVzdC5nZXROb3RlKENvbnN0YW50cy5SRVFfU1NPSURfTk9URSk7CisgICAgICAgIGlmIChwcmluY2lwYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWxyZWFkeSBhdXRoZW50aWNhdGVkICciICsKKyAgICAgICAgICAgICAgICAgICAgcHJpbmNpcGFsLmdldE5hbWUoKSArICInIik7CisgICAgICAgICAgICAvLyBBc3NvY2lhdGUgdGhlIHNlc3Npb24gd2l0aCBhbnkgZXhpc3RpbmcgU1NPIHNlc3Npb24KKyAgICAgICAgICAgIGlmIChzc29JZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGFzc29jaWF0ZShzc29JZCwgcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwodHJ1ZSkpOworICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElzIHRoZXJlIGFuIFNTTyBzZXNzaW9uIGFnYWluc3Qgd2hpY2ggd2UgY2FuIHRyeSB0byByZWF1dGhlbnRpY2F0ZT8KKyAgICAgICAgaWYgKHNzb0lkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNTTyBJZCAiICsgc3NvSWQgKyAiIHNldDsgYXR0ZW1wdGluZyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYXV0aGVudGljYXRpb24iKTsKKyAgICAgICAgICAgIC8vIFRyeSB0byByZWF1dGhlbnRpY2F0ZSB1c2luZyBkYXRhIGNhY2hlZCBieSBTU08uICBJZiB0aGlzIGZhaWxzLAorICAgICAgICAgICAgLy8gZWl0aGVyIHRoZSBvcmlnaW5hbCBTU08gbG9nb24gd2FzIG9mIERJR0VTVCBvciBTU0wgKHdoaWNoCisgICAgICAgICAgICAvLyB3ZSBjYW4ndCByZWF1dGhlbnRpY2F0ZSBvdXJzZWx2ZXMgYmVjYXVzZSB0aGVyZSBpcyBubworICAgICAgICAgICAgLy8gY2FjaGVkIHVzZXJuYW1lIGFuZCBwYXNzd29yZCksIG9yIHRoZSByZWFsbSBkZW5pZWQKKyAgICAgICAgICAgIC8vIHRoZSB1c2VyJ3MgcmVhdXRoZW50aWNhdGlvbiBmb3Igc29tZSByZWFzb24uCisgICAgICAgICAgICAvLyBJbiBlaXRoZXIgY2FzZSB3ZSBoYXZlIHRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBsb2dvbiAqLworICAgICAgICAgICAgaWYgKHJlYXV0aGVudGljYXRlRnJvbVNTTyhzc29JZCwgcmVxdWVzdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBIYXZlIHdlIGF1dGhlbnRpY2F0ZWQgdGhpcyB1c2VyIGJlZm9yZSBidXQgaGF2ZSBjYWNoaW5nIGRpc2FibGVkPworICAgICAgICBpZiAoIWNhY2hlKSB7CisgICAgICAgICAgICBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwodHJ1ZSk7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGVja2luZyBmb3IgcmVhdXRoZW50aWNhdGUgaW4gc2Vzc2lvbiAiICsgc2Vzc2lvbik7CisgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPQorICAgICAgICAgICAgICAgIChTdHJpbmcpIHNlc3Npb24uZ2V0Tm90ZShDb25zdGFudHMuU0VTU19VU0VSTkFNRV9OT1RFKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9CisgICAgICAgICAgICAgICAgKFN0cmluZykgc2Vzc2lvbi5nZXROb3RlKENvbnN0YW50cy5TRVNTX1BBU1NXT1JEX05PVEUpOworICAgICAgICAgICAgaWYgKCh1c2VybmFtZSAhPSBudWxsKSAmJiAocGFzc3dvcmQgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVhdXRoZW50aWNhdGluZyB1c2VybmFtZSAnIiArIHVzZXJuYW1lICsgIiciKTsKKyAgICAgICAgICAgICAgICBwcmluY2lwYWwgPQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlYWxtKCkuYXV0aGVudGljYXRlKHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgICAgICAgICAgICAgaWYgKHByaW5jaXBhbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0Tm90ZShDb25zdGFudHMuRk9STV9QUklOQ0lQQUxfTk9URSwgcHJpbmNpcGFsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaFJlcXVlc3QocmVxdWVzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyKHJlcXVlc3QsIHJlc3BvbnNlLCBwcmluY2lwYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuRk9STV9NRVRIT0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVhdXRoZW50aWNhdGlvbiBmYWlsZWQsIHByb2NlZWQgbm9ybWFsbHkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElzIHRoaXMgdGhlIHJlLXN1Ym1pdCBvZiB0aGUgb3JpZ2luYWwgcmVxdWVzdCBVUkkgYWZ0ZXIgc3VjY2Vzc2Z1bAorICAgICAgICAvLyBhdXRoZW50aWNhdGlvbj8gIElmIHNvLCBmb3J3YXJkIHRoZSAqb3JpZ2luYWwqIHJlcXVlc3QgaW5zdGVhZC4KKyAgICAgICAgaWYgKG1hdGNoUmVxdWVzdChyZXF1ZXN0KSkgeworICAgICAgICAgICAgc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbkludGVybmFsKHRydWUpOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVzdG9yZSByZXF1ZXN0IGZyb20gc2Vzc2lvbiAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlc3Npb24uZ2V0SWRJbnRlcm5hbCgpIAorICAgICAgICAgICAgICAgICAgICAgICAgICArICInIik7CisgICAgICAgICAgICBwcmluY2lwYWwgPSAoUHJpbmNpcGFsKQorICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Tm90ZShDb25zdGFudHMuRk9STV9QUklOQ0lQQUxfTk9URSk7CisgICAgICAgICAgICByZWdpc3RlcihyZXF1ZXN0LCByZXNwb25zZSwgcHJpbmNpcGFsLCBDb25zdGFudHMuRk9STV9NRVRIT0QsCisgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBzZXNzaW9uLmdldE5vdGUoQ29uc3RhbnRzLlNFU1NfVVNFUk5BTUVfTk9URSksCisgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBzZXNzaW9uLmdldE5vdGUoQ29uc3RhbnRzLlNFU1NfUEFTU1dPUkRfTk9URSkpOworICAgICAgICAgICAgLy8gSWYgd2UncmUgY2FjaGluZyBwcmluY2lwYWxzIHdlIG5vIGxvbmdlciBuZWVkIHRoZSB1c2VybmFtZQorICAgICAgICAgICAgLy8gYW5kIHBhc3N3b3JkIGluIHRoZSBzZXNzaW9uLCBzbyByZW1vdmUgdGhlbQorICAgICAgICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVOb3RlKENvbnN0YW50cy5TRVNTX1VTRVJOQU1FX05PVEUpOworICAgICAgICAgICAgICAgIHNlc3Npb24ucmVtb3ZlTm90ZShDb25zdGFudHMuU0VTU19QQVNTV09SRF9OT1RFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXN0b3JlUmVxdWVzdChyZXF1ZXN0LCBzZXNzaW9uKSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9jZWVkIHRvIHJlc3RvcmVkIHJlcXVlc3QiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVzdG9yZSBvZiBvcmlnaW5hbCByZXF1ZXN0IGZhaWxlZCIpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEFjcXVpcmUgcmVmZXJlbmNlcyB0byBvYmplY3RzIHdlIHdpbGwgbmVlZCB0byBldmFsdWF0ZQorICAgICAgICBNZXNzYWdlQnl0ZXMgdXJpTUIgPSBNZXNzYWdlQnl0ZXMubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgQ2hhckNodW5rIHVyaUNDID0gdXJpTUIuZ2V0Q2hhckNodW5rKCk7CisgICAgICAgIHVyaUNDLnNldExpbWl0KC0xKTsKKyAgICAgICAgU3RyaW5nIGNvbnRleHRQYXRoID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpOworICAgICAgICBTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0RGVjb2RlZFJlcXVlc3RVUkkoKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGV4dChyZXF1ZXN0LmdldENvbnRleHQoKSk7CisKKyAgICAgICAgLy8gSXMgdGhpcyB0aGUgYWN0aW9uIHJlcXVlc3QgZnJvbSB0aGUgbG9naW4gcGFnZT8KKyAgICAgICAgYm9vbGVhbiBsb2dpbkFjdGlvbiA9CisgICAgICAgICAgICByZXF1ZXN0VVJJLnN0YXJ0c1dpdGgoY29udGV4dFBhdGgpICYmCisgICAgICAgICAgICByZXF1ZXN0VVJJLmVuZHNXaXRoKENvbnN0YW50cy5GT1JNX0FDVElPTik7CisKKyAgICAgICAgLy8gTm8gLS0gU2F2ZSB0aGlzIHJlcXVlc3QgYW5kIHJlZGlyZWN0IHRvIHRoZSBmb3JtIGxvZ2luIHBhZ2UKKyAgICAgICAgaWYgKCFsb2dpbkFjdGlvbikgeworICAgICAgICAgICAgc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbkludGVybmFsKHRydWUpOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2F2ZSByZXF1ZXN0IGluIHNlc3Npb24gJyIgKyBzZXNzaW9uLmdldElkSW50ZXJuYWwoKSArICInIik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNhdmVSZXF1ZXN0KHJlcXVlc3QsIHNlc3Npb24pOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXF1ZXN0IGJvZHkgdG9vIGJpZyB0byBzYXZlIGR1cmluZyBhdXRoZW50aWNhdGlvbiIpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0ZPUkJJRERFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygiYXV0aGVudGljYXRvci5yZXF1ZXN0Qm9keVRvb0JpZyIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcndhcmRUb0xvZ2luUGFnZShyZXF1ZXN0LCByZXNwb25zZSwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gWWVzIC0tIFZhbGlkYXRlIHRoZSBzcGVjaWZpZWQgY3JlZGVudGlhbHMgYW5kIHJlZGlyZWN0CisgICAgICAgIC8vIHRvIHRoZSBlcnJvciBwYWdlIGlmIHRoZXkgYXJlIG5vdCBjb3JyZWN0CisgICAgICAgIFJlYWxtIHJlYWxtID0gY29udGV4dC5nZXRSZWFsbSgpOworICAgICAgICBpZiAoY2hhcmFjdGVyRW5jb2RpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVxdWVzdC5zZXRDaGFyYWN0ZXJFbmNvZGluZyhjaGFyYWN0ZXJFbmNvZGluZyk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkZPUk1fVVNFUk5BTUUpOworICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihDb25zdGFudHMuRk9STV9QQVNTV09SRCk7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXV0aGVudGljYXRpbmcgdXNlcm5hbWUgJyIgKyB1c2VybmFtZSArICInIik7CisgICAgICAgIHByaW5jaXBhbCA9IHJlYWxtLmF1dGhlbnRpY2F0ZSh1c2VybmFtZSwgcGFzc3dvcmQpOworICAgICAgICBpZiAocHJpbmNpcGFsID09IG51bGwpIHsKKyAgICAgICAgICAgIGZvcndhcmRUb0Vycm9yUGFnZShyZXF1ZXN0LCByZXNwb25zZSwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJBdXRoZW50aWNhdGlvbiBvZiAnIiArIHVzZXJuYW1lICsgIicgd2FzIHN1Y2Nlc3NmdWwiKTsKKworICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKQorICAgICAgICAgICAgc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbkludGVybmFsKGZhbHNlKTsKKyAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5lckxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGNvbnRhaW5lckxvZy5kZWJ1ZworICAgICAgICAgICAgICAgICAgICAoIlVzZXIgdG9vayBzbyBsb25nIHRvIGxvZyBvbiB0aGUgc2Vzc2lvbiBleHBpcmVkIik7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19SRVFVRVNUX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJhdXRoZW50aWNhdG9yLnNlc3Npb25FeHBpcmVkIikpOworICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTYXZlIHRoZSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCBpbiBvdXIgc2Vzc2lvbgorICAgICAgICBzZXNzaW9uLnNldE5vdGUoQ29uc3RhbnRzLkZPUk1fUFJJTkNJUEFMX05PVEUsIHByaW5jaXBhbCk7CisKKyAgICAgICAgLy8gU2F2ZSB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFzIHdlbGwKKyAgICAgICAgc2Vzc2lvbi5zZXROb3RlKENvbnN0YW50cy5TRVNTX1VTRVJOQU1FX05PVEUsIHVzZXJuYW1lKTsKKyAgICAgICAgc2Vzc2lvbi5zZXROb3RlKENvbnN0YW50cy5TRVNTX1BBU1NXT1JEX05PVEUsIHBhc3N3b3JkKTsKKworICAgICAgICAvLyBSZWRpcmVjdCB0aGUgdXNlciB0byB0aGUgb3JpZ2luYWwgcmVxdWVzdCBVUkkgKHdoaWNoIHdpbGwgY2F1c2UKKyAgICAgICAgLy8gdGhlIG9yaWdpbmFsIHJlcXVlc3QgdG8gYmUgcmVzdG9yZWQpCisgICAgICAgIHJlcXVlc3RVUkkgPSBzYXZlZFJlcXVlc3RVUkwoc2Vzc2lvbik7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVkaXJlY3RpbmcgdG8gb3JpZ2luYWwgJyIgKyByZXF1ZXN0VVJJICsgIiciKTsKKyAgICAgICAgaWYgKHJlcXVlc3RVUkkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygiYXV0aGVudGljYXRvci5mb3JtbG9naW4iKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRSZWRpcmVjdChyZXNwb25zZS5lbmNvZGVSZWRpcmVjdFVSTChyZXF1ZXN0VVJJKSk7CisgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGZvcndhcmQgdG8gdGhlIGxvZ2luIHBhZ2UKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSBjb25maWcgICAgTG9naW4gY29uZmlndXJhdGlvbiBkZXNjcmliaW5nIGhvdyBhdXRoZW50aWNhdGlvbgorICAgICAqICAgICAgICAgICAgICBzaG91bGQgYmUgcGVyZm9ybWVkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZm9yd2FyZFRvTG9naW5QYWdlKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UsIExvZ2luQ29uZmlnIGNvbmZpZykgeworICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciBkaXNwID0KKyAgICAgICAgICAgIGNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcgorICAgICAgICAgICAgKGNvbmZpZy5nZXRMb2dpblBhZ2UoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkaXNwLmZvcndhcmQocmVxdWVzdC5nZXRSZXF1ZXN0KCksIHJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworICAgICAgICAgICAgcmVzcG9uc2UuZmluaXNoUmVzcG9uc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy53YXJuKCJVbmV4cGVjdGVkIGVycm9yIGZvcndhcmRpbmcgdG8gbG9naW4gcGFnZSIsIHQpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZm9yd2FyZCB0byB0aGUgZXJyb3IgcGFnZQorICAgICAqIAorICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHBhcmFtIGNvbmZpZyAgICBMb2dpbiBjb25maWd1cmF0aW9uIGRlc2NyaWJpbmcgaG93IGF1dGhlbnRpY2F0aW9uCisgICAgICogICAgICAgICAgICAgIHNob3VsZCBiZSBwZXJmb3JtZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBmb3J3YXJkVG9FcnJvclBhZ2UoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSwgTG9naW5Db25maWcgY29uZmlnKSB7CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIGRpc3AgPQorICAgICAgICAgICAgY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyCisgICAgICAgICAgICAoY29uZmlnLmdldEVycm9yUGFnZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRpc3AuZm9yd2FyZChyZXF1ZXN0LmdldFJlcXVlc3QoKSwgcmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2cud2FybigiVW5leHBlY3RlZCBlcnJvciBmb3J3YXJkaW5nIHRvIGVycm9yIHBhZ2UiLCB0KTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogRG9lcyB0aGlzIHJlcXVlc3QgbWF0Y2ggdGhlIHNhdmVkIG9uZSAoc28gdGhhdCBpdCBtdXN0IGJlIHRoZSByZWRpcmVjdAorICAgICAqIHdlIHNpZ25hbGxlZCBhZnRlciBzdWNjZXNzZnVsIGF1dGhlbnRpY2F0aW9uPworICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QgdG8gYmUgdmVyaWZpZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgIC8vIEhhcyBhIHNlc3Npb24gYmVlbiBjcmVhdGVkPworICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwoZmFsc2UpOworICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkKKyAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgICAgLy8gSXMgdGhlcmUgYSBzYXZlZCByZXF1ZXN0PworICAgICAgU2F2ZWRSZXF1ZXN0IHNyZXEgPSAoU2F2ZWRSZXF1ZXN0KQorICAgICAgICAgIHNlc3Npb24uZ2V0Tm90ZShDb25zdGFudHMuRk9STV9SRVFVRVNUX05PVEUpOworICAgICAgaWYgKHNyZXEgPT0gbnVsbCkKKyAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgICAgLy8gSXMgdGhlcmUgYSBzYXZlZCBwcmluY2lwYWw/CisgICAgICBpZiAoc2Vzc2lvbi5nZXROb3RlKENvbnN0YW50cy5GT1JNX1BSSU5DSVBBTF9OT1RFKSA9PSBudWxsKQorICAgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgICAvLyBEb2VzIHRoZSByZXF1ZXN0IFVSSSBtYXRjaD8KKyAgICAgIFN0cmluZyByZXF1ZXN0VVJJID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisgICAgICBpZiAocmVxdWVzdFVSSSA9PSBudWxsKQorICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgcmV0dXJuIChyZXF1ZXN0VVJJLmVxdWFscyhzcmVxLmdldFJlcXVlc3RVUkkoKSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGZyb20gaW5mb3JtYXRpb24gc3RvcmVkIGluIG91ciBzZXNzaW9uLgorICAgICAqIElmIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGlzIG5vIGxvbmdlciBwcmVzZW50IChiZWNhdXNlIHRoZSBzZXNzaW9uCisgICAgICogdGltZWQgb3V0KSwgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPjsgb3RoZXJ3aXNlLCByZXR1cm4KKyAgICAgKiA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0IHRvIGJlIHJlc3RvcmVkCisgICAgICogQHBhcmFtIHNlc3Npb24gVGhlIHNlc3Npb24gY29udGFpbmluZyB0aGUgc2F2ZWQgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZXN0b3JlUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QsIFNlc3Npb24gc2Vzc2lvbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBSZXRyaWV2ZSBhbmQgcmVtb3ZlIHRoZSBTYXZlZFJlcXVlc3Qgb2JqZWN0IGZyb20gb3VyIHNlc3Npb24KKyAgICAgICAgU2F2ZWRSZXF1ZXN0IHNhdmVkID0gKFNhdmVkUmVxdWVzdCkKKyAgICAgICAgICAgIHNlc3Npb24uZ2V0Tm90ZShDb25zdGFudHMuRk9STV9SRVFVRVNUX05PVEUpOworICAgICAgICBzZXNzaW9uLnJlbW92ZU5vdGUoQ29uc3RhbnRzLkZPUk1fUkVRVUVTVF9OT1RFKTsKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVOb3RlKENvbnN0YW50cy5GT1JNX1BSSU5DSVBBTF9OT1RFKTsKKyAgICAgICAgaWYgKHNhdmVkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgICAgICAvLyBNb2RpZnkgb3VyIGN1cnJlbnQgcmVxdWVzdCB0byByZWZsZWN0IHRoZSBvcmlnaW5hbCBvbmUKKyAgICAgICAgcmVxdWVzdC5jbGVhckNvb2tpZXMoKTsKKyAgICAgICAgSXRlcmF0b3IgY29va2llcyA9IHNhdmVkLmdldENvb2tpZXMoKTsKKyAgICAgICAgd2hpbGUgKGNvb2tpZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICByZXF1ZXN0LmFkZENvb2tpZSgoQ29va2llKSBjb29raWVzLm5leHQoKSk7CisgICAgICAgIH0KKworICAgICAgICBNaW1lSGVhZGVycyBybWggPSByZXF1ZXN0LmdldENveW90ZVJlcXVlc3QoKS5nZXRNaW1lSGVhZGVycygpOworICAgICAgICBybWgucmVjeWNsZSgpOworICAgICAgICBJdGVyYXRvciBuYW1lcyA9IHNhdmVkLmdldEhlYWRlck5hbWVzKCk7CisgICAgICAgIHdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMubmV4dCgpOworICAgICAgICAgICAgSXRlcmF0b3IgdmFsdWVzID0gc2F2ZWQuZ2V0SGVhZGVyVmFsdWVzKG5hbWUpOworICAgICAgICAgICAgd2hpbGUgKHZhbHVlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBybWguYWRkVmFsdWUobmFtZSkuc2V0U3RyaW5nKCAoU3RyaW5nKXZhbHVlcy5uZXh0KCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmVxdWVzdC5jbGVhckxvY2FsZXMoKTsKKyAgICAgICAgSXRlcmF0b3IgbG9jYWxlcyA9IHNhdmVkLmdldExvY2FsZXMoKTsKKyAgICAgICAgd2hpbGUgKGxvY2FsZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICByZXF1ZXN0LmFkZExvY2FsZSgoTG9jYWxlKSBsb2NhbGVzLm5leHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJlcXVlc3QuZ2V0Q295b3RlUmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKS5yZWN5Y2xlKCk7CisgICAgICAgIAorICAgICAgICBpZiAoIlBPU1QiLmVxdWFsc0lnbm9yZUNhc2Uoc2F2ZWQuZ2V0TWV0aG9kKCkpKSB7CisgICAgICAgICAgICBCeXRlQ2h1bmsgYm9keSA9IHNhdmVkLmdldEJvZHkoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGJvZHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0Q295b3RlUmVxdWVzdCgpLmFjdGlvbgorICAgICAgICAgICAgICAgICAgICAoQWN0aW9uQ29kZS5BQ1RJT05fUkVRX1NFVF9CT0RZX1JFUExBWSwgYm9keSk7CisgICAgCisgICAgICAgICAgICAgICAgLy8gU2V0IGNvbnRlbnQgdHlwZQorICAgICAgICAgICAgICAgIE1lc3NhZ2VCeXRlcyBjb250ZW50VHlwZSA9IE1lc3NhZ2VCeXRlcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIElmIG5vIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQsIHVzZSBkZWZhdWx0IGZvciBQT1NUCisgICAgICAgICAgICAgICAgU3RyaW5nIHNhdmVkQ29udGVudFR5cGUgPSBzYXZlZC5nZXRDb250ZW50VHlwZSgpOworICAgICAgICAgICAgICAgIGlmIChzYXZlZENvbnRlbnRUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZWRDb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLnNldFN0cmluZyhzYXZlZENvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmdldENveW90ZVJlcXVlc3QoKS5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5nZXRDb3lvdGVSZXF1ZXN0KCkubWV0aG9kKCkuc2V0U3RyaW5nKHNhdmVkLmdldE1ldGhvZCgpKTsKKworICAgICAgICByZXF1ZXN0LmdldENveW90ZVJlcXVlc3QoKS5xdWVyeVN0cmluZygpLnNldFN0cmluZworICAgICAgICAgICAgKHNhdmVkLmdldFF1ZXJ5U3RyaW5nKCkpOworCisgICAgICAgIHJlcXVlc3QuZ2V0Q295b3RlUmVxdWVzdCgpLnJlcXVlc3RVUkkoKS5zZXRTdHJpbmcKKyAgICAgICAgICAgIChzYXZlZC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGluZm9ybWF0aW9uIGludG8gb3VyIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdCB0byBiZSBzYXZlZAorICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSBzZXNzaW9uIHRvIGNvbnRhaW4gdGhlIHNhdmVkIGluZm9ybWF0aW9uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNhdmVSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCwgU2Vzc2lvbiBzZXNzaW9uKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSBhbmQgcG9wdWxhdGUgYSBTYXZlZFJlcXVlc3Qgb2JqZWN0IGZvciB0aGlzIHJlcXVlc3QKKyAgICAgICAgU2F2ZWRSZXF1ZXN0IHNhdmVkID0gbmV3IFNhdmVkUmVxdWVzdCgpOworICAgICAgICBDb29raWUgY29va2llc1tdID0gcmVxdWVzdC5nZXRDb29raWVzKCk7CisgICAgICAgIGlmIChjb29raWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBzYXZlZC5hZGRDb29raWUoY29va2llc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgRW51bWVyYXRpb24gbmFtZXMgPSByZXF1ZXN0LmdldEhlYWRlck5hbWVzKCk7CisgICAgICAgIHdoaWxlIChuYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgRW51bWVyYXRpb24gdmFsdWVzID0gcmVxdWVzdC5nZXRIZWFkZXJzKG5hbWUpOworICAgICAgICAgICAgd2hpbGUgKHZhbHVlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIHZhbHVlcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIHNhdmVkLmFkZEhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRW51bWVyYXRpb24gbG9jYWxlcyA9IHJlcXVlc3QuZ2V0TG9jYWxlcygpOworICAgICAgICB3aGlsZSAobG9jYWxlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSA9IChMb2NhbGUpIGxvY2FsZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIHNhdmVkLmFkZExvY2FsZShsb2NhbGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCJQT1NUIi5lcXVhbHNJZ25vcmVDYXNlKHJlcXVlc3QuZ2V0TWV0aG9kKCkpKSB7CisgICAgICAgICAgICBCeXRlQ2h1bmsgYm9keSA9IG5ldyBCeXRlQ2h1bmsoKTsKKyAgICAgICAgICAgIGJvZHkuc2V0TGltaXQocmVxdWVzdC5nZXRDb25uZWN0b3IoKS5nZXRNYXhTYXZlUG9zdFNpemUoKSk7CisKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgICAgIGludCBieXRlc1JlYWQ7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgCisgICAgICAgICAgICB3aGlsZSAoIChieXRlc1JlYWQgPSBpcy5yZWFkKGJ1ZmZlcikgKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgYm9keS5hcHBlbmQoYnVmZmVyLCAwLCBieXRlc1JlYWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2F2ZWQuc2V0Qm9keShib2R5KTsKKyAgICAgICAgICAgIHNhdmVkLnNldENvbnRlbnRUeXBlKHJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBzYXZlZC5zZXRNZXRob2QocmVxdWVzdC5nZXRNZXRob2QoKSk7CisgICAgICAgIHNhdmVkLnNldFF1ZXJ5U3RyaW5nKHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSk7CisgICAgICAgIHNhdmVkLnNldFJlcXVlc3RVUkkocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOworCisgICAgICAgIC8vIFN0YXNoIHRoZSBTYXZlZFJlcXVlc3QgaW4gb3VyIHNlc3Npb24gZm9yIGxhdGVyIHVzZQorICAgICAgICBzZXNzaW9uLnNldE5vdGUoQ29uc3RhbnRzLkZPUk1fUkVRVUVTVF9OT1RFLCBzYXZlZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVxdWVzdCBVUkkgKHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcXVlcnkgc3RyaW5nLCBpZiBhbnkpCisgICAgICogZnJvbSB0aGUgc2F2ZWQgcmVxdWVzdCBzbyB0aGF0IHdlIGNhbiByZWRpcmVjdCB0byBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uIE91ciBjdXJyZW50IHNlc3Npb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNhdmVkUmVxdWVzdFVSTChTZXNzaW9uIHNlc3Npb24pIHsKKworICAgICAgICBTYXZlZFJlcXVlc3Qgc2F2ZWQgPQorICAgICAgICAgICAgKFNhdmVkUmVxdWVzdCkgc2Vzc2lvbi5nZXROb3RlKENvbnN0YW50cy5GT1JNX1JFUVVFU1RfTk9URSk7CisgICAgICAgIGlmIChzYXZlZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzYXZlZC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICBpZiAoc2F2ZWQuZ2V0UXVlcnlTdHJpbmcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoJz8nKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzYXZlZC5nZXRRdWVyeVN0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYwNmY2YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTQgQEAKK2F1dGhlbnRpY2F0b3IuYWxyZWFkeVN0YXJ0ZWQ9U2VjdXJpdHkgSW50ZXJjZXB0b3IgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCithdXRoZW50aWNhdG9yLmNlcnRpZmljYXRlcz1ObyBjbGllbnQgY2VydGlmaWNhdGUgY2hhaW4gaW4gdGhpcyByZXF1ZXN0CithdXRoZW50aWNhdG9yLmZvcmJpZGRlbj1BY2Nlc3MgdG8gdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBoYXMgYmVlbiBkZW5pZWQKK2F1dGhlbnRpY2F0b3IuZm9ybWxvZ2luPUludmFsaWQgZGlyZWN0IHJlZmVyZW5jZSB0byBmb3JtIGxvZ2luIHBhZ2UKK2F1dGhlbnRpY2F0b3IuaW52YWxpZD1JbnZhbGlkIGNsaWVudCBjZXJ0aWZpY2F0ZSBjaGFpbiBpbiB0aGlzIHJlcXVlc3QKK2F1dGhlbnRpY2F0b3Iua2V5c3RvcmU9RXhjZXB0aW9uIGxvYWRpbmcga2V5IHN0b3JlCithdXRoZW50aWNhdG9yLm1hbmFnZXI9RXhjZXB0aW9uIGluaXRpYWxpemluZyB0cnVzdCBtYW5hZ2VycworYXV0aGVudGljYXRvci5ub3RBdXRoZW50aWNhdGVkPUNvbmZpZ3VyYXRpb24gZXJyb3I6ICBDYW5ub3QgcGVyZm9ybSBhY2Nlc3MgY29udHJvbCB3aXRob3V0IGFuIGF1dGhlbnRpY2F0ZWQgcHJpbmNpcGFsCithdXRoZW50aWNhdG9yLm5vdENvbnRleHQ9Q29uZmlndXJhdGlvbiBlcnJvcjogIE11c3QgYmUgYXR0YWNoZWQgdG8gYSBDb250ZXh0CithdXRoZW50aWNhdG9yLm5vdFN0YXJ0ZWQ9U2VjdXJpdHkgSW50ZXJjZXB0b3IgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCithdXRoZW50aWNhdG9yLnJlcXVlc3RCb2R5VG9vQmlnPVRoZSByZXF1ZXN0IGJvZHkgd2FzIHRvbyBsYXJnZSB0byBiZSBjYWNoZWQgZHVyaW5nIHRoZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzCithdXRoZW50aWNhdG9yLnNlc3Npb25FeHBpcmVkPVRoZSB0aW1lIGFsbG93ZWQgZm9yIHRoZSBsb2dpbiBwcm9jZXNzIGhhcyBiZWVuIGV4Y2VlZGVkLiBJZiB5b3Ugd2lzaCB0byBjb250aW51ZSB5b3UgbXVzdCBlaXRoZXIgY2xpY2sgYmFjayB0d2ljZSBhbmQgcmUtY2xpY2sgdGhlIGxpbmsgeW91IHJlcXVlc3RlZCBvciBjbG9zZSBhbmQgcmUtb3BlbiB5b3VyIGJyb3dzZXIKK2F1dGhlbnRpY2F0b3IudW5hdXRob3JpemVkPUNhbm5vdCBhdXRoZW50aWNhdGUgd2l0aCB0aGUgcHJvdmlkZWQgY3JlZGVudGlhbHMKK2F1dGhlbnRpY2F0b3IudXNlckRhdGFDb25zdHJhaW50PVRoaXMgcmVxdWVzdCB2aW9sYXRlcyBhIFVzZXIgRGF0YSBjb25zdHJhaW50IGZvciB0aGlzIGFwcGxpY2F0aW9uCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZGE5M2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDEyIEBACithdXRoZW50aWNhdG9yLmFscmVhZHlTdGFydGVkPUVsIGludGVyY2VwdG9yIGRlIHNlZ3VyaWRhZCB5YSBoYSBzaWRvIGFycmFuY2FkbworYXV0aGVudGljYXRvci5jZXJ0aWZpY2F0ZXM9Tm8gaGF5IGNhZGVuYSBkZSBjZXJ0aWZpY2Fkb3MgZGVsIGNsaWVudGUgZW4gZXN0YSBwZXRpY2nzbgorYXV0aGVudGljYXRvci5mb3JiaWRkZW49RWwgYWNjZXNvIGFsIHJlY3Vyc28gcGVkaWRvIGhhIHNpZG8gZGVuZWdhZG8KK2F1dGhlbnRpY2F0b3IuZm9ybWxvZ2luPVJlZmVyZW5jaWEgZGlyZWN0YSBhbCBmb3JtdWxhcmlvIGRlIGNvbmV4afNuIChw4WdpbmEgZGUgZm9ybXVsYXJpbyBkZSBsb2dpbikgaW524WxpZGEKK2F1dGhlbnRpY2F0b3IuaW52YWxpZD1ObyBlcyB24WxpZGEgbGEgY2FkZW5hIGRlIGNlcnRpZmljYWRvcyBkZWwgY2xpZW50ZSBlbiBlc3RhIHBldGljafNuCithdXRoZW50aWNhdG9yLmtleXN0b3JlPUV4Y2VwY2nzbiBjYXJnYW5kbyBlbCBhbG1hY+luIGRlIGNsYXZlcworYXV0aGVudGljYXRvci5tYW5hZ2VyPUV4Y2VwY2nzbiBpbmljaWFsaXphbmRvIGFkbWluaXN0cmFkb3JlcyBkZSBjb25maWFuemEKK2F1dGhlbnRpY2F0b3Iubm90QXV0aGVudGljYXRlZD1FcnJvciBkZSBDb25maWd1cmFjafNuOiBObyBzZSBwdWVkZW4gcmVhbGl6YXIgZnVuY2lvbmVzIGRlIGNvbnRyb2wgZGUgYWNjZXNvIHNpbiB1biBwcmluY2lwYWwgYXV0ZW50aWNhZG8KK2F1dGhlbnRpY2F0b3Iubm90Q29udGV4dD1FcnJvciBkZSBDb25maWd1cmFjafNuOiBEZWJlIGRlIGVzdGFyIHVuaWRvIGEgdW4gQ29udGV4dG8KK2F1dGhlbnRpY2F0b3Iubm90U3RhcnRlZD1FbCBJbnRlcmNlcHRvciBkZSBzZWd1cmlkYWQgbm8gc2lkbyBh+m4gaW5pY2lhZG8KK2F1dGhlbnRpY2F0b3IudW5hdXRob3JpemVkPUltcG9zaWJsZSBhdXRlbnRpY2FyIG1lZGlhbnRlIGxhcyBjcmVkZW5jaWFsZXMgc3VtaW5pc3RyYWRhcworYXV0aGVudGljYXRvci51c2VyRGF0YUNvbnN0cmFpbnQ9RXN0YSBwZXRpY2nzbiB2aW9sYSB1bmEgUmVzdHJpY2nzbiBkZSBEYXRvcyBkZSB1c3VhcmlvIHBhcmEgZXN0YSBhcGxpY2FjafNuCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZTVkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpAQCAtMCwwICsxLDEyIEBACithdXRoZW50aWNhdG9yLmFscmVhZHlTdGFydGVkPUwnJ2ludGVyY2VwdGV1ciBkZSBz6WN1cml06SAoc2VjdXJpdHkgaW50ZXJjZXB0b3IpIGEgZOlq4CDpdOkgZOltYXJy6QorYXV0aGVudGljYXRvci5jZXJ0aWZpY2F0ZXM9QXVjdW5lIGNoYe5uZSBkZSBjZXJ0aWZpY2F0IGNsaWVudCAoY2xpZW50IGNlcnRpZmljYXRlIGNoYWluKSBkYW5zIGNldHRlIHJlcXXqdGUKK2F1dGhlbnRpY2F0b3IuZm9yYmlkZGVuPUwnJ2FjY+hzIOAgbGEgcmVzc291cmNlIGRlbWFuZOllIGEg6XTpIGludGVyZGl0CithdXRoZW50aWNhdG9yLmZvcm1sb2dpbj1S6WbpcmVuY2UgZGlyZWN0ZSDgIGxhIGZvcm0gZGUgY29ubmV4aW9uIChmb3JtIGxvZ2luIHBhZ2UpIGludmFsaWRlCithdXRoZW50aWNhdG9yLmludmFsaWQ9Q2hh7m5lIGRlIGNlcnRpZmljYXQgY2xpZW50IGludmFsaWRlIGRhbnMgY2V0dGUgcmVxdep0ZQorYXV0aGVudGljYXRvci5rZXlzdG9yZT1FeGNlcHRpb24gbG9ycyBkdSBjaGFyZ2VtZW50IGR1IHLpZulyZW50aWVsIGRlIGNsZWZzIChrZXkgc3RvcmUpCithdXRoZW50aWNhdG9yLm1hbmFnZXI9RXhjZXB0aW9uIGxvcnMgZGUgbCcnaW5pdGlhbGlzYXRpb24gZGVzIGdlc3Rpb25uYWlyZXMgZCcnYXV0aGVudGlmaWNhdGlvbiAodHJ1c3QgbWFuYWdlcnMpCithdXRoZW50aWNhdG9yLm5vdEF1dGhlbnRpY2F0ZWQ9RXJyZXVyIGRlIGNvbmZpZ3VyYXRpb246ICBJbXBvc3NpYmxlIGRlIHByb2PpZGVyIOAgdW4gY29udHL0bGUgZCcnYWNj6HMgc2FucyB1biBwcmluY2lwYWwgYXV0aGVudGlmaekgKGF1dGhlbnRpY2F0ZWQgcHJpbmNpcGFsKQorYXV0aGVudGljYXRvci5ub3RDb250ZXh0PUVycmV1ciBkZSBjb25maWd1cmF0aW9uOiAgRG9pdCDqdHJlIGF0dGFjaOkg4CB1biBjb250ZXh0ZQorYXV0aGVudGljYXRvci5ub3RTdGFydGVkPUwnJ2ludGVyY2VwdGV1ciBkZSBz6WN1cml06SAoc2VjdXJpdHkgaW50ZXJjZXB0b3IpIG4nJ2EgcGFzIGVuY29yZSDpdOkgZOltYXJy6QorYXV0aGVudGljYXRvci51bmF1dGhvcml6ZWQ9SW1wb3NzaWJsZSBkJydhdXRoZW50aWZpZXIgYXZlYyBsZXMgY3LpZGl0cyBmb3VybmlzIChwcm92aWRlZCBjcmVkZW50aWFscykKK2F1dGhlbnRpY2F0b3IudXNlckRhdGFDb25zdHJhaW50PUNldHRlIHJlcXXqdGUgdmlvbGUgdW5lIGNvbnRyYWludGUgZG9ubullIHV0aWxpc2F0ZXVyICh1c2VyIGRhdGEgY29uc3RyYWludCkgcG91ciBjZXR0ZSBhcHBsaWNhdGlvbgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDdmZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMyBAQAorYXV0aGVudGljYXRvci5hbHJlYWR5U3RhcnRlZD1cdTMwYmJcdTMwYWRcdTMwZTVcdTMwZWFcdTMwYzZcdTMwYTNcdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwYmJcdTMwZDdcdTMwYmZcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2F1dGhlbnRpY2F0b3IuY2VydGlmaWNhdGVzPVx1MzA1M1x1MzA2ZVx1MzBlYVx1MzBhZlx1MzBhOFx1MzBiOVx1MzBjOFx1MzA2Ylx1MzA2Zlx1MzBhZlx1MzBlOVx1MzBhNFx1MzBhMlx1MzBmM1x1MzBjOFx1OGE4ZFx1OGEzY1x1MzBjMVx1MzBhN1x1MzBmY1x1MzBmM1x1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworYXV0aGVudGljYXRvci5mb3JiaWRkZW49XHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMDU1XHUzMDhjXHUzMDVmXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDc4XHUzMDZlXHUzMGEyXHUzMGFmXHUzMGJiXHUzMGI5XHUzMDRjXHU2MmQyXHU1NDI2XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmCithdXRoZW50aWNhdG9yLmZvcm1sb2dpbj1cdTMwZDVcdTMwYTlcdTMwZmNcdTMwZTBcdTMwZWRcdTMwYjBcdTMwYTRcdTMwZjNcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNzhcdTMwNmVcdTcxMjFcdTUyYjlcdTMwNmFcdTc2ZjRcdTYzYTVcdTUzYzJcdTcxNjdcdTMwNjdcdTMwNTkKK2F1dGhlbnRpY2F0b3IuaW52YWxpZD1cdTMwNTNcdTMwNmVcdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwNmJcdTcxMjFcdTUyYjlcdTMwNmFcdTMwYWZcdTMwZTlcdTMwYTRcdTMwYTJcdTMwZjNcdTMwYzhcdThhOGRcdThhM2NcdTMwYzFcdTMwYTdcdTMwZmNcdTMwZjNcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTkKK2F1dGhlbnRpY2F0b3Iua2V5c3RvcmU9XHUzMGFkXHUzMGZjXHUzMGI5XHUzMGM4XHUzMGEyXHUzMDkyXHUzMGVkXHUzMGZjXHUzMGM5XHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CithdXRoZW50aWNhdG9yLm1hbmFnZXI9XHUzMGM4XHUzMGU5XHUzMGI5XHUzMGM4XHUzMGRlXHUzMGNkXHUzMGZjXHUzMGI4XHUzMGUzXHUzMDkyXHU1MjFkXHU2NzFmXHU1MzE2XHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CithdXRoZW50aWNhdG9yLm5vdEF1dGhlbnRpY2F0ZWQ9XHU4YTJkXHU1YjlhXHUzMGE4XHUzMGU5XHUzMGZjOiBcdThhOGRcdThhM2NcdTMwNTVcdTMwOGNcdTMwNWZcdTRlM2JcdTRmNTNcdTMwNmFcdTMwNTdcdTMwNmJcdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjlcdTUyMzZcdTVmYTFcdTMwOTJcdTViOWZcdTg4NGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2F1dGhlbnRpY2F0b3Iubm90Q29udGV4dD1cdThhMmRcdTViOWFcdTMwYThcdTMwZTlcdTMwZmM6IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2Ylx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworYXV0aGVudGljYXRvci5ub3RTdGFydGVkPVx1MzBiYlx1MzBhZFx1MzBlNVx1MzBlYVx1MzBjNlx1MzBhM1x1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBiYlx1MzBkN1x1MzBiZlx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworYXV0aGVudGljYXRvci5zZXNzaW9uRXhwaXJlZD1cdTMwZWRcdTMwYjBcdTMwYTRcdTMwZjNcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmJcdThhOGRcdTMwODFcdTMwODlcdTMwOGNcdTMwNjZcdTMwNDRcdTMwNWZcdTY2NDJcdTk1OTNcdTMwNGNcdTkwNGVcdTMwNGVcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDJcdTdkOTlcdTdkOWFcdTMwNTdcdTMwNWZcdTMwNDRcdTMwNmFcdTMwODlcdTMwNzBcdWZmMGNcdTMwZDBcdTMwYzNcdTMwYWZcdTMwZGNcdTMwYmZcdTMwZjNcdTMwOTIyXHU1ZWE2XHU2MmJjXHUzMDU3XHUzMDY2XHUzMDRiXHUzMDg5XHU1MThkXHU1ZWE2XHUzMGVhXHUzMGYzXHUzMGFmXHUzMDkyXHU2MmJjXHUzMDU5XHUzMDRiXHVmZjBjXHUzMGQ2XHUzMGU5XHUzMGE2XHUzMGI2XHUzMDkyXHU3YWNiXHUzMDYxXHU0ZTBhXHUzMDUyXHU3NmY0XHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0CithdXRoZW50aWNhdG9yLnVuYXV0aG9yaXplZD1cdTc1MjhcdTYxMGZcdTMwNTVcdTMwOGNcdTMwNWZcdThhM2NcdTY2MGVcdTY2ZjhcdTMwNjdcdThhOGRcdThhM2NcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2F1dGhlbnRpY2F0b3IudXNlckRhdGFDb25zdHJhaW50PVx1MzA1M1x1MzA2ZVx1MzBlYVx1MzBhZlx1MzBhOFx1MzBiOVx1MzBjOFx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZVx1MzBlNlx1MzBmY1x1MzBiNlx1MzBjN1x1MzBmY1x1MzBiZlx1MzA2ZVx1NTIzNlx1OTY1MFx1MzA2Ylx1OTA1NVx1NTNjZFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvTm9uTG9naW5BdXRoZW50aWNhdG9yLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9Ob25Mb2dpbkF1dGhlbnRpY2F0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjM4MzhjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvTm9uTG9naW5BdXRoZW50aWNhdG9yLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Mb2dpbkNvbmZpZzsKKworCisKKy8qKgorICogQW4gPGI+QXV0aGVudGljYXRvcjwvYj4gYW5kIDxiPlZhbHZlPC9iPiBpbXBsZW1lbnRhdGlvbiB0aGF0IGNoZWNrcworICogb25seSBzZWN1cml0eSBjb25zdHJhaW50cyBub3QgaW52b2x2aW5nIHVzZXIgYXV0aGVudGljYXRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBOb25Mb2dpbkF1dGhlbnRpY2F0b3IKKyAgICBleHRlbmRzIEF1dGhlbnRpY2F0b3JCYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLk5vbkxvZ2luQXV0aGVudGljYXRvci8xLjAiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBdXRoZW50aWNhdGUgdGhlIHVzZXIgbWFraW5nIHRoaXMgcmVxdWVzdCwgYmFzZWQgb24gdGhlIHNwZWNpZmllZAorICAgICAqIGxvZ2luIGNvbmZpZ3VyYXRpb24uICBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW55IHNwZWNpZmllZAorICAgICAqIGNvbnN0cmFpbnQgaGFzIGJlZW4gc2F0aXNmaWVkLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgd2UgaGF2ZQorICAgICAqIGNyZWF0ZWQgYSByZXNwb25zZSBjaGFsbGVuZ2UgYWxyZWFkeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHBhcmFtIGNvbmZpZyAgICBMb2dpbiBjb25maWd1cmF0aW9uIGRlc2NyaWJpbmcgaG93IGF1dGhlbnRpY2F0aW9uCisgICAgICogICAgICAgICAgICAgIHNob3VsZCBiZSBwZXJmb3JtZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dpbkNvbmZpZyBjb25maWcpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLyogIEFzc29jaWF0aW5nIHRoaXMgcmVxdWVzdCdzIHNlc3Npb24gd2l0aCBhbiBTU08gd291bGQgYWxsb3cKKyAgICAgICAgICAgIGNvb3JkaW5hdGVkIHNlc3Npb24gaW52YWxpZGF0aW9uLCBidXQgc2hvdWxkIHRoZSBzZXNzaW9uIGZvcgorICAgICAgICAgICAgYSB3ZWJhcHAgdGhhdCB0aGUgdXNlciBkaWRuJ3QgbG9nIGludG8gYmUgaW52YWxpZGF0ZWQgd2hlbgorICAgICAgICAgICAgYW5vdGhlciBzZXNzaW9uIGlzIGxvZ2dlZCBvdXQ/CisgICAgICAgIFN0cmluZyBzc29JZCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0Tm90ZShDb25zdGFudHMuUkVRX1NTT0lEX05PVEUpOworICAgICAgICBpZiAoc3NvSWQgIT0gbnVsbCkKKyAgICAgICAgICAgIGFzc29jaWF0ZShzc29JZCwgZ2V0U2Vzc2lvbihyZXF1ZXN0LCB0cnVlKSk7CisgICAgICAgICovCisgICAgICAgIAorICAgICAgICBpZiAoY29udGFpbmVyTG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBjb250YWluZXJMb2cuZGVidWcoIlVzZXIgYXV0aGVudGljYXRpb24gaXMgbm90IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAodHJ1ZSk7CisKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9TU0xBdXRoZW50aWNhdG9yLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9TU0xBdXRoZW50aWNhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlZDlkYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL1NTTEF1dGhlbnRpY2F0b3IuamF2YQpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3I7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb3lvdGUuQWN0aW9uQ29kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Mb2dpbkNvbmZpZzsKKworCisKKy8qKgorICogQW4gPGI+QXV0aGVudGljYXRvcjwvYj4gYW5kIDxiPlZhbHZlPC9iPiBpbXBsZW1lbnRhdGlvbiBvZiBhdXRoZW50aWNhdGlvbgorICogdGhhdCB1dGlsaXplcyBTU0wgY2VydGlmaWNhdGVzIHRvIGlkZW50aWZ5IGNsaWVudCB1c2Vycy4KKyAqCisgKiBZb3Ugd2lsbCBsaWtlbHkgd2FudCB0byByZWFkIHRoZSBTU0wgSG93VG8gaW4gdGhlIFRvbWNhdCBkb2N1bWVudGF0aW9uOgorICogaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnL3RvbWNhdC01LjUtZG9jL3NzbC1ob3d0by5odG1sCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTU0xBdXRoZW50aWNhdG9yCisgICAgZXh0ZW5kcyBBdXRoZW50aWNhdG9yQmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLlNTTEF1dGhlbnRpY2F0b3IvMS4wIjsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBdXRoZW50aWNhdGUgdGhlIHVzZXIgYnkgY2hlY2tpbmcgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYSBjZXJ0aWZpY2F0ZQorICAgICAqIGNoYWluLCBhbmQgb3B0aW9uYWxseSBhc2tpbmcgYSB0cnVzdCBtYW5hZ2VyIHRvIHZhbGlkYXRlIHRoYXQgd2UgdHJ1c3QKKyAgICAgKiB0aGlzIHVzZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSBjb25maWcgICAgTG9naW4gY29uZmlndXJhdGlvbiBkZXNjcmliaW5nIGhvdyBhdXRoZW50aWNhdGlvbgorICAgICAqICAgICAgICAgICAgICBzaG91bGQgYmUgcGVyZm9ybWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGUoUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9naW5Db25maWcgY29uZmlnKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIEhhdmUgd2UgYWxyZWFkeSBhdXRoZW50aWNhdGVkIHNvbWVvbmU/CisgICAgICAgIFByaW5jaXBhbCBwcmluY2lwYWwgPSByZXF1ZXN0LmdldFVzZXJQcmluY2lwYWwoKTsKKyAgICAgICAgLy9TdHJpbmcgc3NvSWQgPSAoU3RyaW5nKSByZXF1ZXN0LmdldE5vdGUoQ29uc3RhbnRzLlJFUV9TU09JRF9OT1RFKTsKKyAgICAgICAgaWYgKHByaW5jaXBhbCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyTG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgY29udGFpbmVyTG9nLmRlYnVnKCJBbHJlYWR5IGF1dGhlbnRpY2F0ZWQgJyIgKyBwcmluY2lwYWwuZ2V0TmFtZSgpICsgIiciKTsKKyAgICAgICAgICAgIC8vIEFzc29jaWF0ZSB0aGUgc2Vzc2lvbiB3aXRoIGFueSBleGlzdGluZyBTU08gc2Vzc2lvbiBpbiBvcmRlcgorICAgICAgICAgICAgLy8gdG8gZ2V0IGNvb3JkaW5hdGVkIHNlc3Npb24gaW52YWxpZGF0aW9uIGF0IGxvZ291dAorICAgICAgICAgICAgU3RyaW5nIHNzb0lkID0gKFN0cmluZykgcmVxdWVzdC5nZXROb3RlKENvbnN0YW50cy5SRVFfU1NPSURfTk9URSk7CisgICAgICAgICAgICBpZiAoc3NvSWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBhc3NvY2lhdGUoc3NvSWQsIHJlcXVlc3QuZ2V0U2Vzc2lvbkludGVybmFsKHRydWUpKTsKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOT1RFOiBXZSBkb24ndCB0cnkgdG8gcmVhdXRoZW50aWNhdGUgdXNpbmcgYW55IGV4aXN0aW5nIFNTTyBzZXNzaW9uLAorICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIG9yaWdpbmFsIGF1dGhlbnRpY2F0aW9uIHdhcworICAgICAgICAvLyBCQVNJQyBvciBGT1JNLCB3aGljaCBhcmUgbGVzcyBzZWN1cmUgdGhhbiB0aGUgQ0xJRU5UX0NFUlQgYXV0aC10eXBlCisgICAgICAgIC8vIHNwZWNpZmllZCBmb3IgdGhpcyB3ZWJhcHAKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVW5jb21tZW50IGJlbG93IHRvIGFsbG93IHByZXZpb3VzIEZPUk0gb3IgQkFTSUMgYXV0aGVudGljYXRpb25zCisgICAgICAgIC8vIHRvIGF1dGhlbnRpY2F0ZSB1c2VycyBmb3IgdGhpcyB3ZWJhcHAKKyAgICAgICAgLy8gVE9ETyBtYWtlIHRoaXMgYSBjb25maWd1cmFibGUgYXR0cmlidXRlIChpbiBTaW5nbGVTaWduT24/PykKKyAgICAgICAgLyoKKyAgICAgICAgLy8gSXMgdGhlcmUgYW4gU1NPIHNlc3Npb24gYWdhaW5zdCB3aGljaCB3ZSBjYW4gdHJ5IHRvIHJlYXV0aGVudGljYXRlPworICAgICAgICBpZiAoc3NvSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU1NPIElkICIgKyBzc29JZCArICIgc2V0OyBhdHRlbXB0aW5nICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhdXRoZW50aWNhdGlvbiIpOworICAgICAgICAgICAgLy8gVHJ5IHRvIHJlYXV0aGVudGljYXRlIHVzaW5nIGRhdGEgY2FjaGVkIGJ5IFNTTy4gIElmIHRoaXMgZmFpbHMsCisgICAgICAgICAgICAvLyBlaXRoZXIgdGhlIG9yaWdpbmFsIFNTTyBsb2dvbiB3YXMgb2YgRElHRVNUIG9yIFNTTCAod2hpY2gKKyAgICAgICAgICAgIC8vIHdlIGNhbid0IHJlYXV0aGVudGljYXRlIG91cnNlbHZlcyBiZWNhdXNlIHRoZXJlIGlzIG5vCisgICAgICAgICAgICAvLyBjYWNoZWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkKSwgb3IgdGhlIHJlYWxtIGRlbmllZAorICAgICAgICAgICAgLy8gdGhlIHVzZXIncyByZWF1dGhlbnRpY2F0aW9uIGZvciBzb21lIHJlYXNvbi4KKyAgICAgICAgICAgIC8vIEluIGVpdGhlciBjYXNlIHdlIGhhdmUgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciBhIGxvZ29uCisgICAgICAgICAgICBpZiAocmVhdXRoZW50aWNhdGVGcm9tU1NPKHNzb0lkLCByZXF1ZXN0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAqLworCisgICAgICAgIC8vIFJldHJpZXZlIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiBmb3IgdGhpcyBjbGllbnQKKyAgICAgICAgaWYgKGNvbnRhaW5lckxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgY29udGFpbmVyTG9nLmRlYnVnKCIgTG9va2luZyB1cCBjZXJ0aWZpY2F0ZXMiKTsKKworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydHNbXSA9IChYNTA5Q2VydGlmaWNhdGVbXSkKKyAgICAgICAgICAgIHJlcXVlc3QuZ2V0QXR0cmlidXRlKEdsb2JhbHMuQ0VSVElGSUNBVEVTX0FUVFIpOworICAgICAgICBpZiAoKGNlcnRzID09IG51bGwpIHx8IChjZXJ0cy5sZW5ndGggPCAxKSkgeworICAgICAgICAgICAgcmVxdWVzdC5nZXRDb3lvdGVSZXF1ZXN0KCkuYWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQWN0aW9uQ29kZS5BQ1RJT05fUkVRX1NTTF9DRVJUSUZJQ0FURSwgbnVsbCk7CisgICAgICAgICAgICBjZXJ0cyA9IChYNTA5Q2VydGlmaWNhdGVbXSkKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmdldEF0dHJpYnV0ZShHbG9iYWxzLkNFUlRJRklDQVRFU19BVFRSKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNlcnRzID09IG51bGwpIHx8IChjZXJ0cy5sZW5ndGggPCAxKSkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5lckxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGNvbnRhaW5lckxvZy5kZWJ1ZygiICBObyBjZXJ0aWZpY2F0ZXMgaW5jbHVkZWQgd2l0aCB0aGlzIHJlcXVlc3QiKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygiYXV0aGVudGljYXRvci5jZXJ0aWZpY2F0ZXMiKSk7CisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEF1dGhlbnRpY2F0ZSB0aGUgc3BlY2lmaWVkIGNlcnRpZmljYXRlIGNoYWluCisgICAgICAgIHByaW5jaXBhbCA9IGNvbnRleHQuZ2V0UmVhbG0oKS5hdXRoZW50aWNhdGUoY2VydHMpOworICAgICAgICBpZiAocHJpbmNpcGFsID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjb250YWluZXJMb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBjb250YWluZXJMb2cuZGVidWcoIiAgUmVhbG0uYXV0aGVudGljYXRlKCkgcmV0dXJuZWQgZmFsc2UiKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX1VOQVVUSE9SSVpFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoImF1dGhlbnRpY2F0b3IudW5hdXRob3JpemVkIikpOworICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDYWNoZSB0aGUgcHJpbmNpcGFsIChpZiByZXF1ZXN0ZWQpIGFuZCByZWNvcmQgdGhpcyBhdXRoZW50aWNhdGlvbgorICAgICAgICByZWdpc3RlcihyZXF1ZXN0LCByZXNwb25zZSwgcHJpbmNpcGFsLCBDb25zdGFudHMuQ0VSVF9NRVRIT0QsCisgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOworICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgZGF0YWJhc2Ugd2Ugd2lsbCBiZSB1c2luZyBmb3IgY2xpZW50IHZlcmlmaWNhdGlvbgorICAgICAqIGFuZCBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uIChpZiBhbnkpLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgdGhpcyBjb21wb25lbnQgZnJvbSBiZWluZyB1c2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5zdGFydCgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGaW5hbGl6ZSB0aGUgZGF0YWJhc2Ugd2UgdXNlZCBmb3IgY2xpZW50IHZlcmlmaWNhdGlvbiBhbmQKKyAgICAgKiBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uIChpZiBhbnkpLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgdGhpcyBjb21wb25lbnQgZnJvbSBiZWluZyB1c2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLnN0b3AoKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9TYXZlZFJlcXVlc3QuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL1NhdmVkUmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNGJiMjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9TYXZlZFJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3I7CisKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworCitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuQnl0ZUNodW5rOworCisKKy8qKgorICogT2JqZWN0IHRoYXQgc2F2ZXMgdGhlIGNyaXRpY2FsIGluZm9ybWF0aW9uIGZyb20gYSByZXF1ZXN0IHNvIHRoYXQKKyAqIGZvcm0tYmFzZWQgYXV0aGVudGljYXRpb24gY2FuIHJlcHJvZHVjZSBpdCBvbmNlIHRoZSB1c2VyIGhhcyBiZWVuCisgKiBhdXRoZW50aWNhdGVkLgorICogPHA+CisgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFPC9iPiAtIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGlzIG9iamVjdCBpcyBhY2Nlc3NlZAorICogb25seSBmcm9tIHRoZSBjb250ZXh0IG9mIGEgc2luZ2xlIHRocmVhZCwgc28gbm8gc3luY2hyb25pemF0aW9uIGFyb3VuZAorICogaW50ZXJuYWwgY29sbGVjdGlvbiBjbGFzc2VzIGlzIHBlcmZvcm1lZC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVkUmVxdWVzdCB7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgQ29va2llcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0IGNvb2tpZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDb29raWUoQ29va2llIGNvb2tpZSkgeworICAgICAgICBjb29raWVzLmFkZChjb29raWUpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRDb29raWVzKCkgeworICAgICAgICByZXR1cm4gKGNvb2tpZXMuaXRlcmF0b3IoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIEhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdC4gIEVhY2gga2V5IGlzIGEgaGVhZGVyCisgICAgICogbmFtZSwgd2hpbGUgdGhlIHZhbHVlIGlzIGEgQXJyYXlMaXN0IGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgYWN0dWFsCisgICAgICogdmFsdWVzIGZvciB0aGlzIGhlYWRlci4gIFRoZSB2YWx1ZXMgYXJlIHJldHVybmVkIGFzIGFuIEl0ZXJhdG9yIHdoZW4KKyAgICAgKiB5b3UgYXNrIGZvciB0aGVtLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBoZWFkZXJzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIEFycmF5TGlzdCB2YWx1ZXMgPSAoQXJyYXlMaXN0KSBoZWFkZXJzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBoZWFkZXJzLnB1dChuYW1lLCB2YWx1ZXMpOworICAgICAgICB9CisgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRIZWFkZXJOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIChoZWFkZXJzLmtleVNldCgpLml0ZXJhdG9yKCkpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRIZWFkZXJWYWx1ZXMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgQXJyYXlMaXN0IHZhbHVlcyA9IChBcnJheUxpc3QpIGhlYWRlcnMuZ2V0KG5hbWUpOworICAgICAgICBpZiAodmFsdWVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKChuZXcgQXJyYXlMaXN0KCkpLml0ZXJhdG9yKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKHZhbHVlcy5pdGVyYXRvcigpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgTG9jYWxlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0IGxvY2FsZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICBwdWJsaWMgdm9pZCBhZGRMb2NhbGUoTG9jYWxlIGxvY2FsZSkgeworICAgICAgICBsb2NhbGVzLmFkZChsb2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRMb2NhbGVzKCkgeworICAgICAgICByZXR1cm4gKGxvY2FsZXMuaXRlcmF0b3IoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBtZXRob2QgdXNlZCBvbiB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubWV0aG9kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2QoU3RyaW5nIG1ldGhvZCkgeworICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiByZXF1ZXN0IHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdC4gIEVhY2gKKyAgICAgKiBlbnRyeSBpcyBrZXllZCBieSB0aGUgcGFyYW1ldGVyIG5hbWUsIHBvaW50aW5nIGF0IGEgU3RyaW5nIGFycmF5IG9mCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlc1tdKSB7CisgICAgICAgIHBhcmFtZXRlcnMucHV0KG5hbWUsIHZhbHVlcyk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGdldFBhcmFtZXRlck5hbWVzKCkgeworICAgICAgICByZXR1cm4gKHBhcmFtZXRlcnMua2V5U2V0KCkuaXRlcmF0b3IoKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcGFyYW1ldGVycy5nZXQobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHF1ZXJ5IHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5xdWVyeVN0cmluZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UXVlcnlTdHJpbmcoU3RyaW5nIHF1ZXJ5U3RyaW5nKSB7CisgICAgICAgIHRoaXMucXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IFVSSSBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlcXVlc3RVUkkgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0VVJJKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucmVxdWVzdFVSSSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdFVSSShTdHJpbmcgcmVxdWVzdFVSSSkgeworICAgICAgICB0aGlzLnJlcXVlc3RVUkkgPSByZXF1ZXN0VVJJOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBib2R5IG9mIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJ5dGVDaHVuayBib2R5ID0gbnVsbDsKKyAgICAKKyAgICBwdWJsaWMgQnl0ZUNodW5rIGdldEJvZHkoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5ib2R5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCb2R5KEJ5dGVDaHVuayBib2R5KSB7CisgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHJlcXVlc3QsIHVzZWQgaWYgdGhpcyBpcyBhIFBPU1QuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29udGVudFR5cGUgPSBudWxsOworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5jb250ZW50VHlwZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgeworICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvU2luZ2xlU2lnbk9uLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9TaW5nbGVTaWduT24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGI3MGE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvU2luZ2xlU2lnbk9uLmphdmEKQEAgLTAsMCArMSw3MDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5WYWx2ZUJhc2U7CisKKworLyoqCisgKiBBIDxzdHJvbmc+VmFsdmU8L3N0cm9uZz4gdGhhdCBzdXBwb3J0cyBhICJzaW5nbGUgc2lnbiBvbiIgdXNlciBleHBlcmllbmNlLAorICogd2hlcmUgdGhlIHNlY3VyaXR5IGlkZW50aXR5IG9mIGEgdXNlciB3aG8gc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZXMgdG8gb25lCisgKiB3ZWIgYXBwbGljYXRpb24gaXMgcHJvcG9nYXRlZCB0byBvdGhlciB3ZWIgYXBwbGljYXRpb25zIGluIHRoZSBzYW1lCisgKiBzZWN1cml0eSBkb21haW4uICBGb3Igc3VjY2Vzc2Z1bCB1c2UsIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIG11c3QKKyAqIGJlIG1ldDoKKyAqIDx1bD4KKyAqIDxsaT5UaGlzIFZhbHZlIG11c3QgYmUgY29uZmlndXJlZCBvbiB0aGUgQ29udGFpbmVyIHRoYXQgcmVwcmVzZW50cyBhCisgKiAgICAgdmlydHVhbCBob3N0ICh0eXBpY2FsbHkgYW4gaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SG9zdDwvY29kZT4pLjwvbGk+CisgKiA8bGk+VGhlIDxjb2RlPlJlYWxtPC9jb2RlPiB0aGF0IGNvbnRhaW5zIHRoZSBzaGFyZWQgdXNlciBhbmQgcm9sZQorICogICAgIGluZm9ybWF0aW9uIG11c3QgYmUgY29uZmlndXJlZCBvbiB0aGUgc2FtZSBDb250YWluZXIgKG9yIGEgaGlnaGVyCisgKiAgICAgb25lKSwgYW5kIG5vdCBvdmVycmlkZGVuIGF0IHRoZSB3ZWIgYXBwbGljYXRpb24gbGV2ZWwuPC9saT4KKyAqIDxsaT5UaGUgd2ViIGFwcGxpY2F0aW9ucyB0aGVtc2VsdmVzIG11c3QgdXNlIG9uZSBvZiB0aGUgc3RhbmRhcmQKKyAqICAgICBBdXRoZW50aWNhdG9ycyBmb3VuZCBpbiB0aGUKKyAqICAgICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3I8L2NvZGU+IHBhY2thZ2UuPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTaW5nbGVTaWduT24KKyAgICBleHRlbmRzIFZhbHZlQmFzZQorICAgIGltcGxlbWVudHMgTGlmZWN5Y2xlLCBTZXNzaW9uTGlzdGVuZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGNhY2hlIG9mIFNpbmdsZVNpZ25PbkVudHJ5IGluc3RhbmNlcyBmb3IgYXV0aGVudGljYXRlZCBQcmluY2lwYWxzLAorICAgICAqIGtleWVkIGJ5IHRoZSBjb29raWUgdmFsdWUgdGhhdCBpcyB1c2VkIHRvIHNlbGVjdCB0aGVtLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXAgY2FjaGUgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFZhbHZlIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLlNpbmdsZVNpZ25PbiI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaWZlY3ljbGUgZXZlbnQgc3VwcG9ydCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIExpZmVjeWNsZVN1cHBvcnQgbGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZVN1cHBvcnQodGhpcyk7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHZhbHZlIHNob3VsZCByZXF1aXJlIGEgZG93bnN0cmVhbSBBdXRoZW50aWNhdG9yIHRvCisgICAgICogcmVhdXRoZW50aWNhdGUgZWFjaCByZXF1ZXN0LCBvciBpZiBpdCBpdHNlbGYgY2FuIGJpbmQgYSBVc2VyUHJpbmNpcGFsCisgICAgICogYW5kIEF1dGhUeXBlIG9iamVjdCB0byB0aGUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZVJlYXV0aGVudGljYXRpb24gPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFRoZSBjYWNoZSBvZiBzaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVycywga2V5ZWQgYnkgdGhlIFNlc3Npb24gdGhhdCBpcworICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXAgcmV2ZXJzZSA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIENvbXBvbmVudCBzdGFydGVkIGZsYWcuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogT3B0aW9uYWwgU1NPIGNvb2tpZSBkb21haW4uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29va2llRG9tYWluOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBvcHRpb25hbCBjb29raWUgZG9tYWluLgorICAgICAqIE1heSByZXR1cm4gbnVsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNvb2tpZSBkb21haW4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvb2tpZURvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIGNvb2tpZURvbWFpbjsKKyAgICB9CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZG9tYWluIHRvIGJlIHVzZWQgZm9yIHNzbyBjb29raWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGNvb2tpZURvbWFpbiBjb29raWUgZG9tYWluIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb29raWVEb21haW4oU3RyaW5nIGNvb2tpZURvbWFpbikgeworICAgICAgICBpZiAoY29va2llRG9tYWluICE9IG51bGwgJiYgY29va2llRG9tYWluLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBjb29raWVEb21haW4gPSBudWxsOworICAgICAgICB9CisgICAgICAgIHRoaXMuY29va2llRG9tYWluID0gY29va2llRG9tYWluOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciBlYWNoIHJlcXVlc3QgbmVlZHMgdG8gYmUgcmVhdXRoZW50aWNhdGVkIChieSBhbgorICAgICAqIEF1dGhlbnRpY2F0b3IgZG93bnN0cmVhbSBpbiB0aGUgcGlwZWxpbmUpIHRvIHRoZSBzZWN1cml0eQorICAgICAqIDxjb2RlPlJlYWxtPC9jb2RlPiwgb3IgaWYgdGhpcyBWYWx2ZSBjYW4gaXRzZWxmIGJpbmQgc2VjdXJpdHkgaW5mbworICAgICAqIHRvIHRoZSByZXF1ZXN0IGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIHZhbGlkIFNTTyBlbnRyeSB3aXRob3V0CisgICAgICogcmVjaGVja2luZyB3aXRoIHRoZSA8Y29kZT5SZWFsbTwvY29kZS4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuICA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBpcyByZXF1aXJlZCB0aGF0IGEgZG93bnN0cmVhbQorICAgICAqICAgICAgICAgIEF1dGhlbnRpY2F0b3IgcmVhdXRoZW50aWNhdGUgZWFjaCByZXF1ZXN0IGJlZm9yZSBjYWxscyB0bworICAgICAqICAgICAgICAgIDxjb2RlPkh0dHBTZXJ2bGV0UmVxdWVzdC5zZXRVc2VyUHJpbmNpcGFsKCk8L2NvZGU+CisgICAgICogICAgICAgICAgYW5kIDxjb2RlPkh0dHBTZXJ2bGV0UmVxdWVzdC5zZXRBdXRoVHlwZSgpPC9jb2RlPiBhcmUgbWFkZTsKKyAgICAgKiAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIDxjb2RlPlZhbHZlPC9jb2RlPiBjYW4gaXRzZWxmIG1ha2UKKyAgICAgKiAgICAgICAgICB0aG9zZSBjYWxscyByZWx5aW5nIG9uIHRoZSBwcmVzZW5jZSBvZiBhIHZhbGlkIFNpbmdsZVNpZ25PbgorICAgICAqICAgICAgICAgIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFJlcXVpcmVSZWF1dGhlbnRpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UmVxdWlyZVJlYXV0aGVudGljYXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlcXVpcmVSZWF1dGhlbnRpY2F0aW9uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIGVhY2ggcmVxdWVzdCBuZWVkcyB0byBiZSByZWF1dGhlbnRpY2F0ZWQgKGJ5IGFuCisgICAgICogQXV0aGVudGljYXRvciBkb3duc3RyZWFtIGluIHRoZSBwaXBlbGluZSkgdG8gdGhlIHNlY3VyaXR5CisgICAgICogPGNvZGU+UmVhbG08L2NvZGU+LCBvciBpZiB0aGlzIFZhbHZlIGNhbiBpdHNlbGYgYmluZCBzZWN1cml0eSBpbmZvCisgICAgICogdG8gdGhlIHJlcXVlc3QsIGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIHZhbGlkIFNTTyBlbnRyeSwgd2l0aG91dAorICAgICAqIHJlY2hlY2tpbmcgd2l0aCB0aGUgPGNvZGU+UmVhbG08L2NvZGUuCisgICAgICogPHA+CisgICAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyA8Y29kZT5mYWxzZTwvY29kZT4gKHRoZSBkZWZhdWx0KSwgdGhpcworICAgICAqIDxjb2RlPlZhbHZlPC9jb2RlPiB3aWxsIGJpbmQgYSBVc2VyUHJpbmNpcGFsIGFuZCBBdXRoVHlwZSB0byB0aGUgcmVxdWVzdAorICAgICAqIGlmIGEgdmFsaWQgU1NPIGVudHJ5IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdC4gIEl0IHdpbGwgbm90IG5vdGlmeQorICAgICAqIHRoZSBzZWN1cml0eSA8Y29kZT5SZWFsbTwvY29kZT4gb2YgdGhlIGluY29taW5nIHJlcXVlc3QuCisgICAgICogPHA+CisgICAgICogVGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvdmVyYWxsIHNlcnZlcgorICAgICAqIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgPGNvZGU+UmVhbG08L2NvZGU+IHJlYXV0aGVudGljYXRlIGVhY2gKKyAgICAgKiByZXF1ZXN0IHRocmVhZC4gIEFuIGV4YW1wbGUgb2Ygc3VjaCBhIGNvbmZpZ3VyYXRpb24gd291bGQgYmUgb25lIHdoZXJlCisgICAgICogdGhlIDxjb2RlPlJlYWxtPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBzZWN1cml0eSBmb3IgYm90aCBhCisgICAgICogd2ViIHRpZXIgYW5kIGFuIGFzc29jaWF0ZWQgRUpCIHRpZXIsIGFuZCBuZWVkcyB0byBzZXQgc2VjdXJpdHkKKyAgICAgKiBjcmVkZW50aWFscyBvbiBlYWNoIHJlcXVlc3QgdGhyZWFkIGluIG9yZGVyIHRvIHN1cHBvcnQgRUpCIGFjY2Vzcy4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhpcyBWYWx2ZSB3aWxsIHNldCBmbGFncworICAgICAqIG9uIHRoZSByZXF1ZXN0IG5vdGlmeWluZyB0aGUgZG93bnN0cmVhbSBBdXRoZW50aWNhdG9yIHRoYXQgdGhlIHJlcXVlc3QKKyAgICAgKiBpcyBhc3NvY2lhdGVkIHdpdGggYW4gU1NPIHNlc3Npb24uICBUaGUgQXV0aGVudGljYXRvciB3aWxsIHRoZW4gY2FsbCBpdHMKKyAgICAgKiB7QGxpbmsgQXV0aGVudGljYXRvckJhc2UjcmVhdXRoZW50aWNhdGVGcm9tU1NPIHJlYXV0aGVudGljYXRlRnJvbVNTT30KKyAgICAgKiBtZXRob2QgdG8gYXR0ZW1wdCB0byByZWF1dGhlbnRpY2F0ZSB0aGUgcmVxdWVzdCB0byB0aGUKKyAgICAgKiA8Y29kZT5SZWFsbTwvY29kZT4sIHVzaW5nIGFueSBjcmVkZW50aWFscyB0aGF0IHdlcmUgY2FjaGVkIHdpdGggdGhpcworICAgICAqIFZhbHZlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpbiBvcmRlcgorICAgICAqIHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZiBUb21jYXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWlyZWQgIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIHJlcXVpcmVkIHRoYXQgYSBkb3duc3RyZWFtCisgICAgICogICAgICAgICAgICAgICAgICBBdXRoZW50aWNhdG9yIHJlYXV0aGVudGljYXRlIGVhY2ggcmVxdWVzdCBiZWZvcmUgY2FsbHMKKyAgICAgKiAgICAgICAgICAgICAgICAgIHRvICA8Y29kZT5IdHRwU2VydmxldFJlcXVlc3Quc2V0VXNlclByaW5jaXBhbCgpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICAgYW5kIDxjb2RlPkh0dHBTZXJ2bGV0UmVxdWVzdC5zZXRBdXRoVHlwZSgpPC9jb2RlPiBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIG1hZGU7IDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgPGNvZGU+VmFsdmU8L2NvZGU+IGNhbgorICAgICAqICAgICAgICAgICAgICAgICAgaXRzZWxmIG1ha2UgdGhvc2UgY2FsbHMgcmVseWluZyBvbiB0aGUgcHJlc2VuY2Ugb2YgYQorICAgICAqICAgICAgICAgICAgICAgICAgdmFsaWQgU2luZ2xlU2lnbk9uIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBzZWUgQXV0aGVudGljYXRvckJhc2UjcmVhdXRoZW50aWNhdGVGcm9tU1NPCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVxdWlyZVJlYXV0aGVudGljYXRpb24oYm9vbGVhbiByZXF1aXJlZCkKKyAgICB7CisgICAgICAgIHRoaXMucmVxdWlyZVJlYXV0aGVudGljYXRpb24gPSByZXF1aXJlZDsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcyAKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgPGNvZGU+Y29uZmlndXJlKCk8L2NvZGU+LAorICAgICAqIGFuZCBiZWZvcmUgYW55IG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgY29tcG9uZW50IGFyZSB1dGlsaXplZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IHByZXZlbnRzIHRoaXMgY29tcG9uZW50IGZyb20gYmVpbmcgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiYXV0aGVudGljYXRvci5hbHJlYWR5U3RhcnRlZCIpKTsKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCwgbnVsbCk7CisgICAgICAgIHN0YXJ0ZWQgPSB0cnVlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHRlcm1pbmF0ZSB0aGUgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB0aGUgbGFzdCBvbmUgY2FsbGVkIG9uIGEgZ2l2ZW4KKyAgICAgKiBpbnN0YW5jZSBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmICghc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJhdXRoZW50aWNhdG9yLm5vdFN0YXJ0ZWQiKSk7CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RPUF9FVkVOVCwgbnVsbCk7CisgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlc3Npb25MaXN0ZW5lciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFja25vd2xlZGdlIHRoZSBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgU2Vzc2lvbkV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2Vzc2lvbkV2ZW50KFNlc3Npb25FdmVudCBldmVudCkgeworCisgICAgICAgIC8vIFdlIG9ubHkgY2FyZSBhYm91dCBzZXNzaW9uIGRlc3Ryb3llZCBldmVudHMKKyAgICAgICAgaWYgKCFTZXNzaW9uLlNFU1NJT05fREVTVFJPWUVEX0VWRU5ULmVxdWFscyhldmVudC5nZXRUeXBlKCkpCisgICAgICAgICAgICAgICAgJiYgKCFTZXNzaW9uLlNFU1NJT05fUEFTU0lWQVRFRF9FVkVOVC5lcXVhbHMoZXZlbnQuZ2V0VHlwZSgpKSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgc2luZ2xlIHNlc3Npb24gaWQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbiAoaWYgYW55KQorICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBldmVudC5nZXRTZXNzaW9uKCk7CisgICAgICAgIGlmIChjb250YWluZXJMb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lckxvZy5kZWJ1ZygiUHJvY2VzcyBzZXNzaW9uIGRlc3Ryb3llZCBvbiAiICsgc2Vzc2lvbik7CisKKyAgICAgICAgU3RyaW5nIHNzb0lkID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChyZXZlcnNlKSB7CisgICAgICAgICAgICBzc29JZCA9IChTdHJpbmcpIHJldmVyc2UuZ2V0KHNlc3Npb24pOworICAgICAgICB9CisgICAgICAgIGlmIChzc29JZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFdhcyB0aGUgc2Vzc2lvbiBkZXN0cm95ZWQgYXMgdGhlIHJlc3VsdCBvZiBhIHRpbWVvdXQ/CisgICAgICAgIC8vIElmIHNvLCB3ZSdsbCBqdXN0IHJlbW92ZSB0aGUgZXhwaXJlZCBzZXNzaW9uIGZyb20gdGhlCisgICAgICAgIC8vIFNTTy4gIElmIHRoZSBzZXNzaW9uIHdhcyBsb2dnZWQgb3V0LCB3ZSdsbCBsb2cgb3V0CisgICAgICAgIC8vIG9mIGFsbCBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgU1NPLgorICAgICAgICBpZiAoKChzZXNzaW9uLmdldE1heEluYWN0aXZlSW50ZXJ2YWwoKSA+IDApCisgICAgICAgICAgICAmJiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWVJbnRlcm5hbCgpID49CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRNYXhJbmFjdGl2ZUludGVydmFsKCkgKiAxMDAwKSkgCisgICAgICAgICAgICB8fCAoU2Vzc2lvbi5TRVNTSU9OX1BBU1NJVkFURURfRVZFTlQuZXF1YWxzKGV2ZW50LmdldFR5cGUoKSkpKSB7CisgICAgICAgICAgICByZW1vdmVTZXNzaW9uKHNzb0lkLCBzZXNzaW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoZSBzZXNzaW9uIHdhcyBsb2dnZWQgb3V0LgorICAgICAgICAgICAgLy8gRGVyZWdpc3RlciB0aGlzIHNpbmdsZSBzZXNzaW9uIGlkLCBpbnZhbGlkYXRpbmcgCisgICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHNlc3Npb25zCisgICAgICAgICAgICBkZXJlZ2lzdGVyKHNzb0lkKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZhbHZlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gc2luZ2xlLXNpZ24tb24gc3VwcG9ydCBwcm9jZXNzaW5nIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZva2UoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXF1ZXN0LnJlbW92ZU5vdGUoQ29uc3RhbnRzLlJFUV9TU09JRF9OT1RFKTsKKworICAgICAgICAvLyBIYXMgYSB2YWxpZCB1c2VyIGFscmVhZHkgYmVlbiBhdXRoZW50aWNhdGVkPworICAgICAgICBpZiAoY29udGFpbmVyTG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBjb250YWluZXJMb2cuZGVidWcoIlByb2Nlc3MgcmVxdWVzdCBmb3IgJyIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSArICInIik7CisgICAgICAgIGlmIChyZXF1ZXN0LmdldFVzZXJQcmluY2lwYWwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyTG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgY29udGFpbmVyTG9nLmRlYnVnKCIgUHJpbmNpcGFsICciICsgcmVxdWVzdC5nZXRVc2VyUHJpbmNpcGFsKCkuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgIicgaGFzIGFscmVhZHkgYmVlbiBhdXRoZW50aWNhdGVkIik7CisgICAgICAgICAgICBnZXROZXh0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGZvciB0aGUgc2luZ2xlIHNpZ24gb24gY29va2llCisgICAgICAgIGlmIChjb250YWluZXJMb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lckxvZy5kZWJ1ZygiIENoZWNraW5nIGZvciBTU08gY29va2llIik7CisgICAgICAgIENvb2tpZSBjb29raWUgPSBudWxsOworICAgICAgICBDb29raWUgY29va2llc1tdID0gcmVxdWVzdC5nZXRDb29raWVzKCk7CisgICAgICAgIGlmIChjb29raWVzID09IG51bGwpCisgICAgICAgICAgICBjb29raWVzID0gbmV3IENvb2tpZVswXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb29raWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoQ29uc3RhbnRzLlNJTkdMRV9TSUdOX09OX0NPT0tJRS5lcXVhbHMoY29va2llc1tpXS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgY29va2llID0gY29va2llc1tpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29va2llID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjb250YWluZXJMb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBjb250YWluZXJMb2cuZGVidWcoIiBTU08gY29va2llIGlzIG5vdCBwcmVzZW50Iik7CisgICAgICAgICAgICBnZXROZXh0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNhY2hlZCBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29va2llIHZhbHVlCisgICAgICAgIGlmIChjb250YWluZXJMb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lckxvZy5kZWJ1ZygiIENoZWNraW5nIGZvciBjYWNoZWQgcHJpbmNpcGFsIGZvciAiICsgY29va2llLmdldFZhbHVlKCkpOworICAgICAgICBTaW5nbGVTaWduT25FbnRyeSBlbnRyeSA9IGxvb2t1cChjb29raWUuZ2V0VmFsdWUoKSk7CisgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyTG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgY29udGFpbmVyTG9nLmRlYnVnKCIgRm91bmQgY2FjaGVkIHByaW5jaXBhbCAnIiArCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFByaW5jaXBhbCgpLmdldE5hbWUoKSArICInIHdpdGggYXV0aCB0eXBlICciICsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0QXV0aFR5cGUoKSArICInIik7CisgICAgICAgICAgICByZXF1ZXN0LnNldE5vdGUoQ29uc3RhbnRzLlJFUV9TU09JRF9OT1RFLCBjb29raWUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAvLyBPbmx5IHNldCBzZWN1cml0eSBlbGVtZW50cyBpZiByZWF1dGhlbnRpY2F0aW9uIGlzIG5vdCByZXF1aXJlZAorICAgICAgICAgICAgaWYgKCFnZXRSZXF1aXJlUmVhdXRoZW50aWNhdGlvbigpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRBdXRoVHlwZShlbnRyeS5nZXRBdXRoVHlwZSgpKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnNldFVzZXJQcmluY2lwYWwoZW50cnkuZ2V0UHJpbmNpcGFsKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5lckxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGNvbnRhaW5lckxvZy5kZWJ1ZygiIE5vIGNhY2hlZCBwcmluY2lwYWwgZm91bmQsIGVyYXNpbmcgU1NPIGNvb2tpZSIpOworICAgICAgICAgICAgY29va2llLnNldE1heEFnZSgwKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLmFkZENvb2tpZShjb29raWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW52b2tlIHRoZSBuZXh0IFZhbHZlIGluIG91ciBwaXBlbGluZQorICAgICAgICBnZXROZXh0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZW5kZXJpbmcgb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJTaW5nbGVTaWduT25bIik7CisgICAgICAgIGlmIChjb250YWluZXIgPT0gbnVsbCApCisgICAgICAgICAgICBzYi5hcHBlbmQoIkNvbnRhaW5lciBpcyBudWxsIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNiLmFwcGVuZChjb250YWluZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGUgdGhlIHNwZWNpZmllZCBzaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIFNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3NvSWQgU2luZ2xlIHNpZ24gb24gaWRlbnRpZmllcgorICAgICAqIEBwYXJhbSBzZXNzaW9uIFNlc3Npb24gdG8gYmUgYXNzb2NpYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFzc29jaWF0ZShTdHJpbmcgc3NvSWQsIFNlc3Npb24gc2Vzc2lvbikgeworCisgICAgICAgIGlmIChjb250YWluZXJMb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lckxvZy5kZWJ1ZygiQXNzb2NpYXRlIHNzbyBpZCAiICsgc3NvSWQgKyAiIHdpdGggc2Vzc2lvbiAiICsgc2Vzc2lvbik7CisKKyAgICAgICAgU2luZ2xlU2lnbk9uRW50cnkgc3NvID0gbG9va3VwKHNzb0lkKTsKKyAgICAgICAgaWYgKHNzbyAhPSBudWxsKQorICAgICAgICAgICAgc3NvLmFkZFNlc3Npb24odGhpcywgc2Vzc2lvbik7CisgICAgICAgIHN5bmNocm9uaXplZCAocmV2ZXJzZSkgeworICAgICAgICAgICAgcmV2ZXJzZS5wdXQoc2Vzc2lvbiwgc3NvSWQpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbi4gIElmIGl0IGlzIHRoZSBsYXN0IHNlc3Npb24sCisgICAgICogdGhlbiBhbHNvIGdldCByaWQgb2YgdGhlIHNpbmdsZSBzaWduIG9uIGlkZW50aWZpZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzc29JZCBTaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyCisgICAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiB0byBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXJlZ2lzdGVyKFN0cmluZyBzc29JZCwgU2Vzc2lvbiBzZXNzaW9uKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChyZXZlcnNlKSB7CisgICAgICAgICAgICByZXZlcnNlLnJlbW92ZShzZXNzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIFNpbmdsZVNpZ25PbkVudHJ5IHNzbyA9IGxvb2t1cChzc29JZCk7CisgICAgICAgIGlmICggc3NvID09IG51bGwgKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHNzby5yZW1vdmVTZXNzaW9uKCBzZXNzaW9uICk7CisKKyAgICAgICAgLy8gc2VlIGlmIHdlIGFyZSB0aGUgbGFzdCBzZXNzaW9uLCBpZiBzbyBibG93IGF3YXkgc3NvSWQKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uc1tdID0gc3NvLmZpbmRTZXNzaW9ucygpOworICAgICAgICBpZiAoIHNlc3Npb25zID09IG51bGwgfHwgc2Vzc2lvbnMubGVuZ3RoID09IDAgKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlKSB7CisgICAgICAgICAgICAgICAgc3NvID0gKFNpbmdsZVNpZ25PbkVudHJ5KSBjYWNoZS5yZW1vdmUoc3NvSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIHNwZWNpZmllZCBzaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyLCBhbmQgaW52YWxpZGF0ZQorICAgICAqIGFueSBhc3NvY2lhdGVkIHNlc3Npb25zLgorICAgICAqCisgICAgICogQHBhcmFtIHNzb0lkIFNpbmdsZSBzaWduIG9uIGlkZW50aWZpZXIgdG8gZGVyZWdpc3RlcgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlcmVnaXN0ZXIoU3RyaW5nIHNzb0lkKSB7CisKKyAgICAgICAgaWYgKGNvbnRhaW5lckxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgY29udGFpbmVyTG9nLmRlYnVnKCJEZXJlZ2lzdGVyaW5nIHNzbyBpZCAnIiArIHNzb0lkICsgIiciKTsKKworICAgICAgICAvLyBMb29rIHVwIGFuZCByZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgU2luZ2xlU2lnbk9uRW50cnkKKyAgICAgICAgU2luZ2xlU2lnbk9uRW50cnkgc3NvID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChjYWNoZSkgeworICAgICAgICAgICAgc3NvID0gKFNpbmdsZVNpZ25PbkVudHJ5KSBjYWNoZS5yZW1vdmUoc3NvSWQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNzbyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIEV4cGlyZSBhbnkgYXNzb2NpYXRlZCBzZXNzaW9ucworICAgICAgICBTZXNzaW9uIHNlc3Npb25zW10gPSBzc28uZmluZFNlc3Npb25zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vzc2lvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjb250YWluZXJMb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBjb250YWluZXJMb2cudHJhY2UoIiBJbnZhbGlkYXRpbmcgc2Vzc2lvbiAiICsgc2Vzc2lvbnNbaV0pOworICAgICAgICAgICAgLy8gUmVtb3ZlIGZyb20gcmV2ZXJzZSBjYWNoZSBmaXJzdCB0byBhdm9pZCByZWN1cnNpb24KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAocmV2ZXJzZSkgeworICAgICAgICAgICAgICAgIHJldmVyc2UucmVtb3ZlKHNlc3Npb25zW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEludmFsaWRhdGUgdGhpcyBzZXNzaW9uCisgICAgICAgICAgICBzZXNzaW9uc1tpXS5leHBpcmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5PVEU6ICBDbGllbnRzIG1heSBzdGlsbCBwb3NzZXNzIHRoZSBvbGQgc2luZ2xlIHNpZ24gb24gY29va2llLAorICAgICAgICAvLyBidXQgaXQgd2lsbCBiZSByZW1vdmVkIG9uIHRoZSBuZXh0IHJlcXVlc3Qgc2luY2UgaXQgaXMgbm8gbG9uZ2VyCisgICAgICAgIC8vIGluIHRoZSBjYWNoZQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBdHRlbXB0cyByZWF1dGhlbnRpY2F0aW9uIHRvIHRoZSBnaXZlbiA8Y29kZT5SZWFsbTwvY29kZT4gdXNpbmcKKyAgICAgKiB0aGUgY3JlZGVudGlhbHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzaW5nbGUgc2lnbi1vbiBzZXNzaW9uCisgICAgICogaWRlbnRpZmllZCBieSBhcmd1bWVudCA8Y29kZT5zc29JZDwvY29kZT4uCisgICAgICogPHA+CisgICAgICogSWYgcmVhdXRoZW50aWNhdGlvbiBpcyBzdWNjZXNzZnVsLCB0aGUgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiBhbmQKKyAgICAgKiBhdXRob3JpemF0aW9uIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBTU08gc2Vzc2lvbiB3aWxsIGJlIGJvdW5kCisgICAgICogdG8gdGhlIGdpdmVuIDxjb2RlPlJlcXVlc3Q8L2NvZGU+IG9iamVjdCB2aWEgY2FsbHMgdG8gCisgICAgICoge0BsaW5rIFJlcXVlc3Qjc2V0QXV0aFR5cGUgUmVxdWVzdC5zZXRBdXRoVHlwZSgpfSBhbmQgCisgICAgICoge0BsaW5rIFJlcXVlc3Qjc2V0VXNlclByaW5jaXBhbCBSZXF1ZXN0LnNldFVzZXJQcmluY2lwYWwoKX0KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3NvSWQgICAgIGlkZW50aWZpZXIgb2YgU2luZ2xlU2lnbk9uIHNlc3Npb24gd2l0aCB3aGljaCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGNhbGxlciBpcyBhc3NvY2lhdGVkCisgICAgICogQHBhcmFtIHJlYWxtICAgICBSZWFsbSBpbXBsZW1lbnRhdGlvbiBhZ2FpbnN0IHdoaWNoIHRoZSBjYWxsZXIgaXMgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgIGJlIGF1dGhlbnRpY2F0ZWQKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCAgIHRoZSByZXF1ZXN0IHRoYXQgbmVlZHMgdG8gYmUgYXV0aGVudGljYXRlZAorICAgICAqIAorICAgICAqIEByZXR1cm4gIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlYXV0aGVudGljYXRpb24gd2FzIHN1Y2Nlc3NmdWwsCisgICAgICogICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWF1dGhlbnRpY2F0ZShTdHJpbmcgc3NvSWQsIFJlYWxtIHJlYWxtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIGlmIChzc29JZCA9PSBudWxsIHx8IHJlYWxtID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgYm9vbGVhbiByZWF1dGhlbnRpY2F0ZWQgPSBmYWxzZTsKKworICAgICAgICBTaW5nbGVTaWduT25FbnRyeSBlbnRyeSA9IGxvb2t1cChzc29JZCk7CisgICAgICAgIGlmIChlbnRyeSAhPSBudWxsICYmIGVudHJ5LmdldENhblJlYXV0aGVudGljYXRlKCkpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gZW50cnkuZ2V0VXNlcm5hbWUoKTsKKyAgICAgICAgICAgIGlmICh1c2VybmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgUHJpbmNpcGFsIHJlYXV0aFByaW5jaXBhbCA9CisgICAgICAgICAgICAgICAgICAgICAgICByZWFsbS5hdXRoZW50aWNhdGUodXNlcm5hbWUsIGVudHJ5LmdldFBhc3N3b3JkKCkpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAocmVhdXRoUHJpbmNpcGFsICE9IG51bGwpIHsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZWF1dGhlbnRpY2F0ZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIEJpbmQgdGhlIGF1dGhvcml6YXRpb24gY3JlZGVudGlhbHMgdG8gdGhlIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRBdXRoVHlwZShlbnRyeS5nZXRBdXRoVHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRVc2VyUHJpbmNpcGFsKHJlYXV0aFByaW5jaXBhbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlYXV0aGVudGljYXRlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIHRoZSBzcGVjaWZpZWQgUHJpbmNpcGFsIGFzIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogdmFsdWUgZm9yIHRoZSBzaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyLgorICAgICAqCisgICAgICogQHBhcmFtIHNzb0lkIFNpbmdsZSBzaWduIG9uIGlkZW50aWZpZXIgdG8gcmVnaXN0ZXIKKyAgICAgKiBAcGFyYW0gcHJpbmNpcGFsIEFzc29jaWF0ZWQgdXNlciBwcmluY2lwYWwgdGhhdCBpcyBpZGVudGlmaWVkCisgICAgICogQHBhcmFtIGF1dGhUeXBlIEF1dGhlbnRpY2F0aW9uIHR5cGUgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhpcworICAgICAqICB1c2VyIHByaW5jaXBhbAorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIHVzZXIKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzc3dvcmQgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhpcyB1c2VyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXIoU3RyaW5nIHNzb0lkLCBQcmluY2lwYWwgcHJpbmNpcGFsLCBTdHJpbmcgYXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworCisgICAgICAgIGlmIChjb250YWluZXJMb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lckxvZy5kZWJ1ZygiUmVnaXN0ZXJpbmcgc3NvIGlkICciICsgc3NvSWQgKyAiJyBmb3IgdXNlciAnIiArCisgICAgICAgICAgICAgICAgcHJpbmNpcGFsLmdldE5hbWUoKSArICInIHdpdGggYXV0aCB0eXBlICciICsgYXV0aFR5cGUgKyAiJyIpOworCisgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGUpIHsKKyAgICAgICAgICAgIGNhY2hlLnB1dChzc29JZCwgbmV3IFNpbmdsZVNpZ25PbkVudHJ5KHByaW5jaXBhbCwgYXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIGFueSA8Y29kZT5TaW5nbGVTaWduT25FbnRyeTwvY29kZT4gZm91bmQgdW5kZXIga2V5CisgICAgICogPGNvZGU+c3NvSWQ8L2NvZGU+IHdpdGggdGhlIGdpdmVuIGF1dGhlbnRpY2F0aW9uIGRhdGEuCisgICAgICogPHA+CisgICAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gYWxsb3cgYW4gU1NPIGVudHJ5IHRoYXQgd2FzCisgICAgICogZXN0YWJsaXNoZWQgd2l0aG91dCBhIHVzZXJuYW1lL3Bhc3N3b3JkIGNvbWJpbmF0aW9uIChpLmUuIGVzdGFibGlzaGVkCisgICAgICogZm9sbG93aW5nIERJR0VTVCBvciBDTElFTlRfQ0VSVCBhdXRoZW50aWNhdGlvbikgdG8gYmUgdXBkYXRlZCB3aXRoCisgICAgICogYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaWYgb25lIGJlY29tZXMgYXZhaWxhYmxlIHRocm91Z2ggYSBzdWJzZXF1ZW50CisgICAgICogQkFTSUMgb3IgRk9STSBhdXRoZW50aWNhdGlvbi4gIFRoZSBTU08gZW50cnkgd2lsbCB0aGVuIGJlIHVzYWJsZSBmb3IKKyAgICAgKiByZWF1dGhlbnRpY2F0aW9uLgorICAgICAqIDxwPgorICAgICAqIDxiPk5PVEU6PC9iPiBPbmx5IHVwZGF0ZXMgdGhlIFNTTyBlbnRyeSBpZiBhIGNhbGwgdG8KKyAgICAgKiA8Y29kZT5TaW5nbGVTaWduT25FbnRyeS5nZXRDYW5SZWF1dGhlbnRpY2F0ZSgpPC9jb2RlPiByZXR1cm5zCisgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+OyBvdGhlcndpc2UsIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgU1NPIGVudHJ5IGFscmVhZHkKKyAgICAgKiBoYXMgc3VmZmljaWVudCBpbmZvcm1hdGlvbiB0byBhbGxvdyByZWF1dGhlbnRpY2F0aW9uIGFuZCB0aGF0IG5vIHVwZGF0ZQorICAgICAqIGlzIG5lZWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzc29JZCAgICAgaWRlbnRpZmllciBvZiBTaW5nbGUgc2lnbiB0byBiZSB1cGRhdGVkCisgICAgICogQHBhcmFtIHByaW5jaXBhbCB0aGUgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiByZXR1cm5lZCBieSB0aGUgbGF0ZXN0CisgICAgICogICAgICAgICAgICAgICAgICBjYWxsIHRvIDxjb2RlPlJlYWxtLmF1dGhlbnRpY2F0ZTwvY29kZT4uCisgICAgICogQHBhcmFtIGF1dGhUeXBlICB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdG9yIHVzZWQgKEJBU0lDLCBDTElFTlRfQ0VSVCwKKyAgICAgKiAgICAgICAgICAgICAgICAgIERJR0VTVCBvciBGT1JNKQorICAgICAqIEBwYXJhbSB1c2VybmFtZSAgdGhlIHVzZXJuYW1lIChpZiBhbnkpIHVzZWQgZm9yIHRoZSBhdXRoZW50aWNhdGlvbgorICAgICAqIEBwYXJhbSBwYXNzd29yZCAgdGhlIHBhc3N3b3JkIChpZiBhbnkpIHVzZWQgZm9yIHRoZSBhdXRoZW50aWNhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZShTdHJpbmcgc3NvSWQsIFByaW5jaXBhbCBwcmluY2lwYWwsIFN0cmluZyBhdXRoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKKworICAgICAgICBTaW5nbGVTaWduT25FbnRyeSBzc28gPSBsb29rdXAoc3NvSWQpOworICAgICAgICBpZiAoc3NvICE9IG51bGwgJiYgIXNzby5nZXRDYW5SZWF1dGhlbnRpY2F0ZSgpKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyTG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgY29udGFpbmVyTG9nLmRlYnVnKCJVcGRhdGUgc3NvIGlkICIgKyBzc29JZCArICIgdG8gYXV0aCB0eXBlICIgKyBhdXRoVHlwZSk7CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChzc28pIHsKKyAgICAgICAgICAgICAgICBzc28udXBkYXRlQ3JlZGVudGlhbHMocHJpbmNpcGFsLCBhdXRoVHlwZSwgdXNlcm5hbWUsIHBhc3N3b3JkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb29rIHVwIGFuZCByZXR1cm4gdGhlIGNhY2hlZCBTaW5nbGVTaWduT24gZW50cnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiBzc28gaWQgdmFsdWUsIGlmIHRoZXJlIGlzIG9uZTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzc29JZCBTaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyIHRvIGxvb2sgdXAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2luZ2xlU2lnbk9uRW50cnkgbG9va3VwKFN0cmluZyBzc29JZCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGUpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFNpbmdsZVNpZ25PbkVudHJ5KSBjYWNoZS5nZXQoc3NvSWQpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgc2luZ2xlIFNlc3Npb24gZnJvbSBhIFNpbmdsZVNpZ25Pbi4gIENhbGxlZCB3aGVuCisgICAgICogYSBzZXNzaW9uIGlzIHRpbWVkIG91dCBhbmQgbm8gbG9uZ2VyIGFjdGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzc29JZCBTaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyIGZyb20gd2hpY2ggdG8gcmVtb3ZlIHRoZSBzZXNzaW9uLgorICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSBzZXNzaW9uIHRvIGJlIHJlbW92ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2Vzc2lvbihTdHJpbmcgc3NvSWQsIFNlc3Npb24gc2Vzc2lvbikgeworCisgICAgICAgIGlmIChjb250YWluZXJMb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lckxvZy5kZWJ1ZygiUmVtb3Zpbmcgc2Vzc2lvbiAiICsgc2Vzc2lvbi50b1N0cmluZygpICsgIiBmcm9tIHNzbyBpZCAiICsgCisgICAgICAgICAgICAgICAgc3NvSWQgKTsKKworICAgICAgICAvLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIFNpbmdsZVNpZ25PbgorICAgICAgICBTaW5nbGVTaWduT25FbnRyeSBlbnRyeSA9IGxvb2t1cChzc29JZCk7CisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFJlbW92ZSB0aGUgaW5hY3RpdmUgc2Vzc2lvbiBmcm9tIFNpbmdsZVNpZ25PbkVudHJ5CisgICAgICAgIGVudHJ5LnJlbW92ZVNlc3Npb24oc2Vzc2lvbik7CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBpbmFjdGl2ZSBzZXNzaW9uIGZyb20gdGhlICdyZXZlcnNlJyBNYXAuCisgICAgICAgIHN5bmNocm9uaXplZChyZXZlcnNlKSB7CisgICAgICAgICAgICByZXZlcnNlLnJlbW92ZShzZXNzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZXJlIGFyZSBub3Qgc2Vzc2lvbnMgbGVmdCBpbiB0aGUgU2luZ2xlU2lnbk9uRW50cnksCisgICAgICAgIC8vIGRlcmVnaXN0ZXIgdGhlIGVudHJ5LgorICAgICAgICBpZiAoZW50cnkuZmluZFNlc3Npb25zKCkubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIGRlcmVnaXN0ZXIoc3NvSWQpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9TaW5nbGVTaWduT25FbnRyeS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvU2luZ2xlU2lnbk9uRW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmIxYzQyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvU2luZ2xlU2lnbk9uRW50cnkuamF2YQpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvcjsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5Db25zdGFudHM7CisKKy8qKgorICogQSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgZW50cmllcyBpbiB0aGUgY2FjaGUgb2YgYXV0aGVudGljYXRlZCB1c2Vycy4KKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgYXZhaWxhYmxlIHRvCisgKiA8Y29kZT5BdXRoZW50aWNhdG9yQmFzZTwvY29kZT4gc3ViY2xhc3NlcyB0aGF0IG5lZWQgaXQgaW4gb3JkZXIgdG8gcGVyZm9ybQorICogcmVhdXRoZW50aWNhdGlvbnMgd2hlbiBTaW5nbGVTaWduT24gaXMgaW4gdXNlLgorICoKKyAqIEBhdXRob3IgIEIgU3RhbnNiZXJyeSwgYmFzZWQgb24gd29yayBieSBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogQHNlZSBTaW5nbGVTaWduT24KKyAqIEBzZWUgQXV0aGVudGljYXRvckJhc2UjcmVhdXRoZW50aWNhdGVGcm9tU1NPCisgKi8KK3B1YmxpYyBjbGFzcyBTaW5nbGVTaWduT25FbnRyeQoreworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgSW5zdGFuY2UgRmllbGRzCisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGF1dGhUeXBlID0gbnVsbDsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgcGFzc3dvcmQgPSBudWxsOworCisgICAgcHJvdGVjdGVkIFByaW5jaXBhbCBwcmluY2lwYWwgPSBudWxsOworCisgICAgcHJvdGVjdGVkIFNlc3Npb24gc2Vzc2lvbnNbXSA9IG5ldyBTZXNzaW9uWzBdOworCisgICAgcHJvdGVjdGVkIFN0cmluZyB1c2VybmFtZSA9IG51bGw7CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZWF1dGhlbnRpY2F0ZSA9IGZhbHNlOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBDb25zdHJ1Y3RvcnMKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgU2luZ2xlU2lnbk9uRW50cnkKKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmluY2lwYWwgdGhlIDxjb2RlPlByaW5jaXBhbDwvY29kZT4gcmV0dXJuZWQgYnkgdGhlIGxhdGVzdAorICAgICAqICAgICAgICAgICAgICAgICAgY2FsbCB0byA8Y29kZT5SZWFsbS5hdXRoZW50aWNhdGU8L2NvZGU+LgorICAgICAqIEBwYXJhbSBhdXRoVHlwZSAgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRvciB1c2VkIChCQVNJQywgQ0xJRU5UX0NFUlQsCisgICAgICogICAgICAgICAgICAgICAgICBESUdFU1Qgb3IgRk9STSkKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgIHRoZSB1c2VybmFtZSAoaWYgYW55KSB1c2VkIGZvciB0aGUgYXV0aGVudGljYXRpb24KKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgIHRoZSBwYXNzd29yZCAoaWYgYW55KSB1c2VkIGZvciB0aGUgYXV0aGVudGljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU2luZ2xlU2lnbk9uRW50cnkoUHJpbmNpcGFsIHByaW5jaXBhbCwgU3RyaW5nIGF1dGhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICB1cGRhdGVDcmVkZW50aWFscyhwcmluY2lwYWwsIGF1dGhUeXBlLCB1c2VybmFtZSwgcGFzc3dvcmQpOworICAgIH0KKworICAgIHB1YmxpYyBTaW5nbGVTaWduT25FbnRyeSgpIHsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisgICAgLyoqCisgICAgICogQWRkcyBhIDxjb2RlPlNlc3Npb248L2NvZGU+IHRvIHRoZSBsaXN0IG9mIHRob3NlIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgU1NPLgorICAgICAqCisgICAgICogQHBhcmFtIHNzbyAgICAgICBUaGUgPGNvZGU+U2luZ2xlU2lnbk9uPC9jb2RlPiB2YWx2ZSB0aGF0IGlzIG1hbmFnaW5nCisgICAgICogICAgICAgICAgICAgICAgICB0aGUgU1NPIHNlc3Npb24uCisgICAgICogQHBhcmFtIHNlc3Npb24gICBUaGUgPGNvZGU+U2Vzc2lvbjwvY29kZT4gYmVpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBTU08uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFNlc3Npb24oU2luZ2xlU2lnbk9uIHNzbywgU2Vzc2lvbiBzZXNzaW9uKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vzc2lvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uID09IHNlc3Npb25zW2ldKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTZXNzaW9uIHJlc3VsdHNbXSA9IG5ldyBTZXNzaW9uW3Nlc3Npb25zLmxlbmd0aCArIDFdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHNlc3Npb25zLCAwLCByZXN1bHRzLCAwLCBzZXNzaW9ucy5sZW5ndGgpOworICAgICAgICByZXN1bHRzW3Nlc3Npb25zLmxlbmd0aF0gPSBzZXNzaW9uOworICAgICAgICBzZXNzaW9ucyA9IHJlc3VsdHM7CisgICAgICAgIHNlc3Npb24uYWRkU2Vzc2lvbkxpc3RlbmVyKHNzbyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gPGNvZGU+U2Vzc2lvbjwvY29kZT4gZnJvbSB0aGUgbGlzdCBvZiB0aG9zZQorICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNTTy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uICB0aGUgPGNvZGU+U2Vzc2lvbjwvY29kZT4gdG8gcmVtb3ZlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVTZXNzaW9uKFNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICBTZXNzaW9uW10gbnNlc3Npb25zID0gbmV3IFNlc3Npb25bc2Vzc2lvbnMubGVuZ3RoIC0gMV07CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBqID0gMDsgaSA8IHNlc3Npb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBzZXNzaW9uc1tpXSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIG5zZXNzaW9uc1tqKytdID0gc2Vzc2lvbnNbaV07CisgICAgICAgIH0KKyAgICAgICAgc2Vzc2lvbnMgPSBuc2Vzc2lvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgPGNvZGU+U2Vzc2lvbjwvY29kZT5zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNTTy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFNlc3Npb25bXSBmaW5kU2Vzc2lvbnMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zZXNzaW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgPGNvZGU+U2Vzc2lvbjwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgU1NPPworICAgICAqCisgICAgICogQHBhcmFtIHNzbyAgICAgICBUaGUgPGNvZGU+U2luZ2xlU2lnbk9uPC9jb2RlPiB2YWx2ZSB0aGF0IGlzIG1hbmFnaW5nCisgICAgICogICAgICAgICAgICAgICAgICB0aGUgU1NPIHNlc3Npb24uCisgICAgICogQHJldHVybiBzZXNzaW9uIGV4aXN0cworICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXNzaW9uRXhpc3RzKFNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlc3Npb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBzZXNzaW9uc1tpXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2UgOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgb3JpZ2luYWxseSB1c2VkIHRvIGF1dGhlbnRpY2F0ZQorICAgICAqIHRoZSB1c2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgU1NPLgorICAgICAqCisgICAgICogQHJldHVybiAiQkFTSUMiLCAiQ0xJRU5UX0NFUlQiLCAiRElHRVNUIiwgIkZPUk0iIG9yICJOT05FIgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aFR5cGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5hdXRoVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIHRoZSBhdXRoZW50aWNhdGlvbiB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwKKyAgICAgKiBhdXRoZW50aWNhdGlvbiBzdXBwb3J0cyByZWF1dGhlbnRpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+Z2V0QXV0aFR5cGU8L2NvZGU+IHJldHVybnMKKyAgICAgKiAgICAgICAgICAiQkFTSUMiIG9yICJGT1JNIiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDYW5SZWF1dGhlbnRpY2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmNhblJlYXV0aGVudGljYXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBwYXNzd29yZCBjcmVkZW50aWFsIChpZiBhbnkpIGFzc29jaWF0ZWQgd2l0aCB0aGUgU1NPLgorICAgICAqCisgICAgICogQHJldHVybiAgdGhlIHBhc3N3b3JkIGNyZWRlbnRpYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBTU08sIG9yCisgICAgICogICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG9yaWdpbmFsIGF1dGhlbnRpY2F0aW9uIHR5cGUKKyAgICAgKiAgICAgICAgICBkb2VzIG5vdCBpbnZvbHZlIGEgcGFzc3dvcmQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhc3N3b3JkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSA8Y29kZT5QcmluY2lwYWw8L2NvZGU+IHRoYXQgaGFzIGJlZW4gYXV0aGVudGljYXRlZCBieQorICAgICAqIHRoZSBTU08uCisgICAgICovCisgICAgcHVibGljIFByaW5jaXBhbCBnZXRQcmluY2lwYWwoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wcmluY2lwYWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVzZXJuYW1lIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGFzIHBhcnQgb2YgdGhlIGF1dGhlbnRpY2F0aW9uCisgICAgICogcHJvY2Vzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudXNlcm5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgU2luZ2xlU2lnbk9uRW50cnkgdG8gcmVmbGVjdCB0aGUgbGF0ZXN0IHNlY3VyaXR5CisgICAgICogaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJpbmNpcGFsIHRoZSA8Y29kZT5QcmluY2lwYWw8L2NvZGU+IHJldHVybmVkIGJ5IHRoZSBsYXRlc3QKKyAgICAgKiAgICAgICAgICAgICAgICAgIGNhbGwgdG8gPGNvZGU+UmVhbG0uYXV0aGVudGljYXRlPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gYXV0aFR5cGUgIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0b3IgdXNlZCAoQkFTSUMsIENMSUVOVF9DRVJULAorICAgICAqICAgICAgICAgICAgICAgICAgRElHRVNUIG9yIEZPUk0pCisgICAgICogQHBhcmFtIHVzZXJuYW1lICB0aGUgdXNlcm5hbWUgKGlmIGFueSkgdXNlZCBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uCisgICAgICogQHBhcmFtIHBhc3N3b3JkICB0aGUgcGFzc3dvcmQgKGlmIGFueSkgdXNlZCBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlQ3JlZGVudGlhbHMoUHJpbmNpcGFsIHByaW5jaXBhbCwgU3RyaW5nIGF1dGhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7CisKKyAgICAgICAgdGhpcy5wcmluY2lwYWwgPSBwcmluY2lwYWw7CisgICAgICAgIHRoaXMuYXV0aFR5cGUgPSBhdXRoVHlwZTsKKyAgICAgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgICAgIHRoaXMuY2FuUmVhdXRoZW50aWNhdGUgPQorICAgICAgICAgICAgKENvbnN0YW50cy5CQVNJQ19NRVRIT0QuZXF1YWxzKGF1dGhUeXBlKQorICAgICAgICAgICAgICAgIHx8IENvbnN0YW50cy5GT1JNX01FVEhPRC5lcXVhbHMoYXV0aFR5cGUpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL21iZWFucy1kZXNjcmlwdG9ycy54bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxODk1NGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCkBAIC0wLDAgKzEsMTQ4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxtYmVhbnMtZGVzY3JpcHRvcnM+CisKKyAgPG1iZWFuIG5hbWU9IkJhc2ljQXV0aGVudGljYXRvciIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSJBbiBBdXRoZW50aWNhdG9yIGFuZCBWYWx2ZSBpbXBsZW1lbnRhdGlvbiBvZiBIVFRQIEJBU0lDIEF1dGhlbnRpY2F0aW9uIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJWYWx2ZSIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5CYXNpY0F1dGhlbnRpY2F0b3IiPgorICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhbGdvcml0aG0iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSB0byBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBzZXNzaW9uIGlkZW50aWZpZXJzIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYWNoZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgd2UgY2FjaGUgYXV0aGVudGljYXRlZCBQcmluY2lwYWxzIGlmIHRoZSByZXF1ZXN0IGlzIHBhcnQgb2YgYW4gSFRUUCBzZXNzaW9uPyIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW50cm9weSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBIFN0cmluZyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgdXNlZCB0byBpbmNyZWFzZSB0aGUgIGVudHJvcHkgb2YgdGhlIGluaXRpYWxpemF0aW9uIG9mIG91ciByYW5kb20gbnVtYmVyIGdlbmVyYXRvciIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgPC9tYmVhbj4KKyAgCisgIAorICA8bWJlYW4gbmFtZT0iRGlnZXN0QXV0aGVudGljYXRvciIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSJBbiBBdXRoZW50aWNhdG9yIGFuZCBWYWx2ZSBpbXBsZW1lbnRhdGlvbiBvZiBIVFRQIERJR0VTVCBBdXRoZW50aWNhdGlvbiIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iVmFsdmUiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuRGlnZXN0QXV0aGVudGljYXRvciI+CisgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGdvcml0aG0iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSB0byBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBzZXNzaW9uIGlkZW50aWZpZXJzIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYWNoZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgd2UgY2FjaGUgYXV0aGVudGljYXRlZCBQcmluY2lwYWxzIGlmIHRoZSByZXF1ZXN0IGlzIHBhcnQgb2YgYW4gSFRUUCBzZXNzaW9uPyIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJlbnRyb3B5IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkEgU3RyaW5nIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB1c2VkIHRvIGluY3JlYXNlIHRoZSAgZW50cm9weSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gb2Ygb3VyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICA8L21iZWFuPgorICAKKyAgPG1iZWFuIG5hbWU9IkZvcm1BdXRoZW50aWNhdG9yIgorICAgICAgICAgZGVzY3JpcHRpb249IkFuIEF1dGhlbnRpY2F0b3IgYW5kIFZhbHZlIGltcGxlbWVudGF0aW9uIG9mIEZPUk0gQkFTRUQgQXV0aGVudGljYXRpb24iCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9IlZhbHZlIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkZvcm1BdXRoZW50aWNhdG9yIj4KKyAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWxnb3JpdGhtIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gdG8gYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgc2Vzc2lvbiBpZGVudGlmaWVycyIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjYWNoZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgd2UgY2FjaGUgYXV0aGVudGljYXRlZCBQcmluY2lwYWxzIGlmIHRoZSByZXF1ZXN0IGlzIHBhcnQgb2YgYW4gSFRUUCBzZXNzaW9uPyIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJlbnRyb3B5IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkEgU3RyaW5nIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB1c2VkIHRvIGluY3JlYXNlIHRoZSBlbnRyb3B5IG9mIHRoZSBpbml0aWFsaXphdGlvbiBvZiBvdXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgIDwvbWJlYW4+CisgIAorICA8bWJlYW4gbmFtZT0iTm9uTG9naW5BdXRoZW50aWNhdG9yIgorICAgICAgICAgZGVzY3JpcHRpb249IkFuIEF1dGhlbnRpY2F0b3IgYW5kIFZhbHZlIGltcGxlbWVudGF0aW9uIHRoYXQgY2hlY2tzIG9ubHkgc2VjdXJpdHkgY29uc3RyYWludHMgbm90IGludm9sdmluZyB1c2VyIGF1dGhlbnRpY2F0aW9uIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJWYWx2ZSIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5Ob25Mb2dpbkF1dGhlbnRpY2F0b3IiPgorICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWxnb3JpdGhtIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gdG8gYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgc2Vzc2lvbiBpZGVudGlmaWVycyIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2FjaGUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU2hvdWxkIHdlIGNhY2hlIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFscyBpZiB0aGUgcmVxdWVzdCBpcyBwYXJ0IG9mIGFuIEhUVFAgc2Vzc2lvbj8iCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbnRyb3B5IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkEgU3RyaW5nIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB1c2VkIHRvIGluY3JlYXNlIHRoZSBlbnRyb3B5IG9mIHRoZSBpbml0aWFsaXphdGlvbiBvZiBvdXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgIDwvbWJlYW4+CisgIAorICAKKyAgPG1iZWFuIG5hbWU9IlNpbmdsZVNpZ25PbiIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSJBIFZhbHZlIHRoYXQgc3VwcG9ydHMgYSAnc2luZ2xlIHNpZ25vbicgdXNlciBleHBlcmllbmNlIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJWYWx2ZSIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5TaW5nbGVTaWduT24iPgorICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVxdWlyZVJlYXV0aGVudGljYXRpb24iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU2hvdWxkIHdlIGF0dGVtcHQgdG8gcmVhdXRoZW50aWNhdGUgZWFjaCByZXF1ZXN0IGFnYWluc3QgdGhlIHNlY3VyaXR5IFJlYWxtPyIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29va2llRG9tYWluIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IihPcHRpb25hKSBEb21haW4gdG8gYmUgdXNlZCBieSBzc28gY29va2llcyIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIC8+CisgICAgICAKKyAgPC9tYmVhbj4KKworCisgIDxtYmVhbiBuYW1lPSJTU0xBdXRoZW50aWNhdG9yIgorICAgICAgICAgZGVzY3JpcHRpb249IkFuIEF1dGhlbnRpY2F0b3IgYW5kIFZhbHZlIGltcGxlbWVudGF0aW9uIG9mIGF1dGhlbnRpY2F0aW9uIHRoYXQgdXRpbGl6ZXMgU1NMIGNlcnRpZmljYXRlcyB0byBpZGVudGlmeSBjbGllbnQgdXNlcnMiCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9IlZhbHZlIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLlNTTEF1dGhlbnRpY2F0b3IiPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGdvcml0aG0iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSB0byBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBzZXNzaW9uIGlkZW50aWZpZXJzIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYWNoZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgd2UgY2FjaGUgYXV0aGVudGljYXRlZCBQcmluY2lwYWxzIGlmIHRoZSByZXF1ZXN0IGlzIHBhcnQgb2YgYW4gSFRUUCBzZXNzaW9uPyIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImVudHJvcHkiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQSBTdHJpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHVzZWQgdG8gaW5jcmVhc2UgdGhlIGVudHJvcHkgb2YgdGhlIGluaXRpYWxpemF0aW9uIG9mIG91ciByYW5kb20gbnVtYmVyIGdlbmVyYXRvciIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgPC9tYmVhbj4KKyAgCis8L21iZWFucy1kZXNjcmlwdG9ycz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL3BhY2thZ2UuaHRtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTgxNGYyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMzggQEAKKzxib2R5PgorCis8cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgPGNvZGU+QXV0aGVudGljYXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb25zIGZvciB0aGUKK3ZhcmlvdXMgc3VwcG9ydGVkIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgKEJBU0lDLCBESUdFU1QsIGFuZCBGT1JNKS4gIEluCithZGRpdGlvbiwgdGhlcmUgaXMgYSBjb252ZW5pZW5jZSBiYXNlIGNsYXNzLAorPGNvZGU+QXV0aGVudGljYXRvckJhc2U8L2NvZGU+LCBmb3IgY3VzdG9taXplZCA8Y29kZT5BdXRoZW50aWNhdG9yPC9jb2RlPgoraW1wbGVtZW50YXRpb25zLjwvcD4KKworPHA+SWYgeW91IGFyZSB1c2luZyB0aGUgc3RhbmRhcmQgY29udGV4dCBjb25maWd1cmF0aW9uIGNsYXNzCisoPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNvbnRleHRDb25maWc8L2NvZGU+KSB0byBjb25maWd1cmUgdGhlCitBdXRoZW50aWNhdG9yIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgY29udGV4dCwgeW91IGNhbiByZWdpc3RlciB0aGUgSmF2YQorY2xhc3MgdG8gYmUgdXNlZCBmb3IgZWFjaCBwb3NzaWJsZSBhdXRoZW50aWNhdGlvbiBtZXRob2QgYnkgbW9kaWZ5aW5nIHRoZQorZm9sbG93aW5nIFByb3BlcnRpZXMgZmlsZTo8L3A+Cis8cHJlPgorICAgIHNyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQXV0aGVudGljYXRvcnMucHJvcGVydGllcworPC9wcmU+CisKKzxwPkVhY2ggb2YgdGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9ucyBleHRlbmRzIGEgY29tbW9uIGJhc2UgY2xhc3MKKyg8Y29kZT5BdXRoZW50aWNhdG9yQmFzZTwvY29kZT4pLCB3aGljaCBpcyBjb25maWd1cmVkIGJ5IHNldHRpbmcgdGhlCitmb2xsb3dpbmcgSmF2YUJlYW5zIHByb3BlcnRpZXMgKHdpdGggZGVmYXVsdCB2YWx1ZXMgaW4gc3F1YXJlIGJyYWNrZXRzKTo8L3A+Cis8dWw+Cis8bGk+PGI+Y2FjaGU8L2I+IC0gU2hvdWxkIHdlIGNhY2hlIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFscyAodGh1cyBhdm9pZGluZworICAgIHBlci1yZXF1ZXN0IGxvb2t1cHMgaW4gb3VyIHVuZGVyeWxpbmcgPGNvZGU+UmVhbG08L2NvZGU+KSBpZiB0aGlzIHJlcXVlc3QKKyAgICBpcyBwYXJ0IG9mIGFuIEhUVFAgc2Vzc2lvbj8gIFt0cnVlXTwvbGk+Cis8bGk+PGI+ZGVidWc8L2I+IC0gRGVidWdnaW5nIGRldGFpbCBsZXZlbCBmb3IgdGhpcyBjb21wb25lbnQuICBbMF08L2xpPgorPC91bD4KKworPHA+VGhlIHN0YW5kYXJkIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgdGhhdCBhcmUgY3VycmVudGx5IHByb3ZpZGVkIGluY2x1ZGU6PC9wPgorPHVsPgorPGxpPjxiPkJhc2ljQXV0aGVudGljYXRvcjwvYj4gLSBJbXBsZW1lbnRzIEhUVFAgQkFTSUMgYXV0aGVudGljYXRpb24sIGFzCisgICAgZGVzY3JpYmVkIGluIFJGQyAyNjE3LjwvbGk+Cis8bGk+PGI+RGlnZXN0QXV0aGVudGljYXRvcjwvYj4gLSBJbXBsZW1lbnRzIEhUVFAgRElHRVNUIGF1dGhlbnRpY2F0aW9uLCBhcworICAgIGRlc2NyaWJlZCBpbiBSRkMgMjYxNy48L2xpPgorPGxpPjxiPkZvcm1BdXRoZW50aWNhdG9yPC9iPiAtIEltcGxlbWVudHMgRk9STS1CQVNFRCBhdXRoZW50aWNhdGlvbiwgYXMKKyAgICBkZXNjcmliZWQgaW4gdGhlIFNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24sIHZlcnNpb24gMi4yLjwvbGk+Cis8L3VsPgorCis8L2JvZHk+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NsaWVudEFib3J0RXhjZXB0aW9uLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NsaWVudEFib3J0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlhZjI3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ2xpZW50QWJvcnRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogV3JhcCBhbiBJT0V4Y2VwdGlvbiBpZGVudGlmeWluZyBpdCBhcyBiZWluZyBjYXVzZWQgYnkgYW4gYWJvcnQKKyAqIG9mIGEgcmVxdWVzdCBieSBhIHJlbW90ZSBjbGllbnQuCisgKgorICogQGF1dGhvciBHbGVubiBMLiBOaWVsc2VuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDbGllbnRBYm9ydEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKKworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBDbGllbnRBYm9ydEV4Y2VwdGlvbiB3aXRoIG5vIG90aGVyIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBDbGllbnRBYm9ydEV4Y2VwdGlvbigpIHsKKworICAgICAgICB0aGlzKG51bGwsIG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgQ2xpZW50QWJvcnRFeGNlcHRpb24gZm9yIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UgZGVzY3JpYmluZyB0aGlzIGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBDbGllbnRBYm9ydEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCisgICAgICAgIHRoaXMobWVzc2FnZSwgbnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBDbGllbnRBYm9ydEV4Y2VwdGlvbiBmb3IgdGhlIHNwZWNpZmllZCB0aHJvd2FibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhyb3dhYmxlIFRocm93YWJsZSB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBDbGllbnRBYm9ydEV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisKKyAgICAgICAgdGhpcyhudWxsLCB0aHJvd2FibGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgQ2xpZW50QWJvcnRFeGNlcHRpb24gZm9yIHRoZSBzcGVjaWZpZWQgbWVzc2FnZQorICAgICAqIGFuZCB0aHJvd2FibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIGRlc2NyaWJpbmcgdGhpcyBleGNlcHRpb24KKyAgICAgKiBAcGFyYW0gdGhyb3dhYmxlIFRocm93YWJsZSB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBDbGllbnRBYm9ydEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIHRoaXMudGhyb3dhYmxlID0gdGhyb3dhYmxlOworCisgICAgfQorCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGVycm9yIG1lc3NhZ2UgcGFzc2VkIHRvIG91ciBjb25zdHJ1Y3RvciAoaWYgYW55KQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSB1bmRlcmx5aW5nIGV4Y2VwdGlvbiBvciBlcnJvciBwYXNzZWQgdG8gb3VyIGNvbnN0cnVjdG9yIChpZiBhbnkpCisgICAgICovCisgICAgcHJvdGVjdGVkIFRocm93YWJsZSB0aHJvd2FibGUgPSBudWxsOworCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBleGNlcHRpb24sIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisKKyAgICAgICAgcmV0dXJuIChtZXNzYWdlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2F1c2UgdGhhdCBjYXVzZWQgdGhpcyBleGNlcHRpb24sIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuICh0aHJvd2FibGUpOworICAgICAgICAKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBmb3JtYXR0ZWQgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoaXMgZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiQ2xpZW50QWJvcnRFeGNlcHRpb246ICAiKTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKG1lc3NhZ2UpOworICAgICAgICAgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI6ICAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodGhyb3dhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh0aHJvd2FibGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0Nvbm5lY3Rvci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db25uZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTBhMjEwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db25uZWN0b3IuamF2YQpAQCAtMCwwICsxLDEyNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5SZWdpc3RyYXRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5MaWZlY3ljbGVTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY295b3RlLkFkYXB0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb3lvdGUuUHJvdG9jb2xIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuSW50cm9zcGVjdGlvblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuaHR0cC5tYXBwZXIuTWFwcGVyOworCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgYSBDb3lvdGUgY29ubmVjdG9yIGZvciBUb21jYXQgNS54LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCisKK3B1YmxpYyBjbGFzcyBDb25uZWN0b3IKKyAgICBpbXBsZW1lbnRzIExpZmVjeWNsZSwgTUJlYW5SZWdpc3RyYXRpb24KK3sKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ29ubmVjdG9yLmNsYXNzKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKworICAgIHB1YmxpYyBDb25uZWN0b3IoKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIENvbm5lY3RvcihTdHJpbmcgcHJvdG9jb2wpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0UHJvdG9jb2wocHJvdG9jb2wpOworICAgICAgICAvLyBJbnN0YW50aWF0ZSBwcm90b2NvbCBoYW5kbGVyCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUocHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgIHRoaXMucHJvdG9jb2xIYW5kbGVyID0gKFByb3RvY29sSGFuZGxlcikgY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgKCJjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVySW5zdGFudGlhdGlvbkZhaWxlZCIsIGUpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPlNlcnZpY2U8L2NvZGU+IHdlIGFyZSBhc3NvY2lhdGVkIHdpdGggKGlmIGFueSkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFNlcnZpY2Ugc2VydmljZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIERvIHdlIGFsbG93IFRSQUNFID8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd1RyYWNlID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXIgdXNlZCBmb3IgcHJvY2Vzc2luZyByZXF1ZXN0cyByZWNlaXZlZCBieSB0aGlzIENvbm5lY3Rvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFVzZSAiLyIgYXMgcGF0aCBmb3Igc2Vzc2lvbiBjb29raWVzID8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlbXB0eVNlc3Npb25QYXRoID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFRoZSAiZW5hYmxlIEROUyBsb29rdXBzIiBmbGFnIGZvciB0aGlzIENvbm5lY3Rvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVMb29rdXBzID0gZmFsc2U7CisKKworICAgIC8qCisgICAgICogSXMgZ2VuZXJhdGlvbiBvZiBYLVBvd2VyZWQtQnkgcmVzcG9uc2UgaGVhZGVyIGVuYWJsZWQvZGlzYWJsZWQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4geHBvd2VyZWRCeSA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIENvbm5lY3RvciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3Rvci8yLjEiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcG9ydCBudW1iZXIgb24gd2hpY2ggd2UgbGlzdGVuIGZvciByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHBvcnQgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmVyIG5hbWUgdG8gd2hpY2ggd2Ugc2hvdWxkIHByZXRlbmQgcmVxdWVzdHMgdG8gdGhpcyBDb25uZWN0b3IKKyAgICAgKiB3ZXJlIGRpcmVjdGVkLiAgVGhpcyBpcyB1c2VmdWwgd2hlbiBvcGVyYXRpbmcgVG9tY2F0IGJlaGluZCBhIHByb3h5CisgICAgICogc2VydmVyLCBzbyB0aGF0IHJlZGlyZWN0cyBnZXQgY29uc3RydWN0ZWQgYWNjdXJhdGVseS4gIElmIG5vdCBzcGVjaWZpZWQsCisgICAgICogdGhlIHNlcnZlciBuYW1lIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5Ib3N0PC9jb2RlPiBoZWFkZXIgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3h5TmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2ZXIgcG9ydCB0byB3aGljaCB3ZSBzaG91bGQgcHJldGVudCByZXF1ZXN0cyB0byB0aGlzIENvbm5lY3RvcgorICAgICAqIHdlcmUgZGlyZWN0ZWQuICBUaGlzIGlzIHVzZWZ1bCB3aGVuIG9wZXJhdGluZyBUb21jYXQgYmVoaW5kIGEgcHJveHkKKyAgICAgKiBzZXJ2ZXIsIHNvIHRoYXQgcmVkaXJlY3RzIGdldCBjb25zdHJ1Y3RlZCBhY2N1cmF0ZWx5LiAgSWYgbm90IHNwZWNpZmllZCwKKyAgICAgKiB0aGUgcG9ydCBudW1iZXIgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT5wb3J0PC9jb2RlPiBwcm9wZXJ0eSBpcyB1c2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgcHJveHlQb3J0ID0gMDsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlZGlyZWN0IHBvcnQgZm9yIG5vbi1TU0wgdG8gU1NMIHJlZGlyZWN0cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHJlZGlyZWN0UG9ydCA9IDQ0MzsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3Qgc2NoZW1lIHRoYXQgd2lsbCBiZSBzZXQgb24gYWxsIHJlcXVlc3RzIHJlY2VpdmVkCisgICAgICogdGhyb3VnaCB0aGlzIGNvbm5lY3Rvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNjaGVtZSA9ICJodHRwIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlY3VyZSBjb25uZWN0aW9uIGZsYWcgdGhhdCB3aWxsIGJlIHNldCBvbiBhbGwgcmVxdWVzdHMgcmVjZWl2ZWQKKyAgICAgKiB0aHJvdWdoIHRoaXMgY29ubmVjdG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHNlY3VyZSA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIE1heGltdW0gc2l6ZSBvZiBhIFBPU1Qgd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHBhcnNlZCBieSB0aGUgCisgICAgICogY29udGFpbmVyLiAyTUIgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG1heFBvc3RTaXplID0gMiAqIDEwMjQgKiAxMDI0OworCisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIHNpemUgb2YgYSBQT1NUIHdoaWNoIHdpbGwgYmUgc2F2ZWQgYnkgdGhlIGNvbnRhaW5lcgorICAgICAqIGR1cmluZyBhdXRoZW50aWNhdGlvbi4gNGtCIGJ5IGRlZmF1bHQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG1heFNhdmVQb3N0U2l6ZSA9IDQgKiAxMDI0OworCisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhpcyBjb21wb25lbnQgYmVlbiBpbml0aWFsaXplZCB5ZXQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZCB5ZXQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2h1dGRvd24gc2lnbmFsIHRvIG91ciBiYWNrZ3JvdW5kIHRocmVhZAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN0b3BwZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEZsYWcgdG8gdXNlIElQLWJhc2VkIHZpcnR1YWwgaG9zdGluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VJUFZIb3N0cyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVGhlIGJhY2tncm91bmQgdGhyZWFkLgorICAgICAqLworICAgIHByb3RlY3RlZCBUaHJlYWQgdGhyZWFkID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQ295b3RlIFByb3RvY29sIGhhbmRsZXIgY2xhc3MgbmFtZS4KKyAgICAgKiBEZWZhdWx0cyB0byB0aGUgQ295b3RlIEhUVFAvMS4xIHByb3RvY29sSGFuZGxlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3RvY29sSGFuZGxlckNsYXNzTmFtZSA9CisgICAgICAgICJvcmcuYXBhY2hlLmNveW90ZS5odHRwMTEuSHR0cDExUHJvdG9jb2wiOworCisKKyAgICAvKioKKyAgICAgKiBDb3lvdGUgcHJvdG9jb2wgaGFuZGxlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJvdG9jb2xIYW5kbGVyIHByb3RvY29sSGFuZGxlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIENveW90ZSBhZGFwdGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOworCisKKyAgICAgLyoqCisgICAgICAqIE1hcHBlci4KKyAgICAgICovCisgICAgIHByb3RlY3RlZCBNYXBwZXIgbWFwcGVyID0gbmV3IE1hcHBlcigpOworCisKKyAgICAgLyoqCisgICAgICAqIE1hcHBlciBsaXN0ZW5lci4KKyAgICAgICovCisgICAgIHByb3RlY3RlZCBNYXBwZXJMaXN0ZW5lciBtYXBwZXJMaXN0ZW5lciA9IG5ldyBNYXBwZXJMaXN0ZW5lcihtYXBwZXIpOworCisKKyAgICAgLyoqCisgICAgICAqIFVSSSBlbmNvZGluZy4KKyAgICAgICovCisgICAgIHByb3RlY3RlZCBTdHJpbmcgVVJJRW5jb2RpbmcgPSBudWxsOworCisKKyAgICAgLyoqCisgICAgICAqIFVSSSBlbmNvZGluZyBhcyBib2R5LgorICAgICAgKi8KKyAgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlQm9keUVuY29kaW5nRm9yVVJJID0gZmFsc2U7CisKKworICAgICBwcm90ZWN0ZWQgc3RhdGljIEhhc2hNYXAgcmVwbGFjZW1lbnRzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgc3RhdGljIHsKKyAgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoImFjY2VwdENvdW50IiwgImJhY2tsb2ciKTsKKyAgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoImNvbm5lY3Rpb25MaW5nZXIiLCAic29MaW5nZXIiKTsKKyAgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoImNvbm5lY3Rpb25UaW1lb3V0IiwgInNvVGltZW91dCIpOworICAgICAgICAgcmVwbGFjZW1lbnRzLnB1dCgiY29ubmVjdGlvblVwbG9hZFRpbWVvdXQiLCAidGltZW91dCIpOworICAgICAgICAgcmVwbGFjZW1lbnRzLnB1dCgiY2xpZW50QXV0aCIsICJjbGllbnRhdXRoIik7CisgICAgICAgICByZXBsYWNlbWVudHMucHV0KCJrZXlzdG9yZUZpbGUiLCAia2V5c3RvcmUiKTsKKyAgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoInJhbmRvbUZpbGUiLCAicmFuZG9tZmlsZSIpOworICAgICAgICAgcmVwbGFjZW1lbnRzLnB1dCgicm9vdEZpbGUiLCAicm9vdGZpbGUiKTsKKyAgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoImtleXN0b3JlUGFzcyIsICJrZXlwYXNzIik7CisgICAgICAgICByZXBsYWNlbWVudHMucHV0KCJrZXlzdG9yZVR5cGUiLCAia2V5dHlwZSIpOworICAgICAgICAgcmVwbGFjZW1lbnRzLnB1dCgic3NsUHJvdG9jb2wiLCAicHJvdG9jb2wiKTsKKyAgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoInNzbFByb3RvY29scyIsICJwcm90b2NvbHMiKTsKKyAgICAgfQorICAgICAKKyAgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvbmZpZ3VyZWQgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgeworICAgICAgICBTdHJpbmcgcmVwbCA9IG5hbWU7CisgICAgICAgIGlmIChyZXBsYWNlbWVudHMuZ2V0KG5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcGwgPSAoU3RyaW5nKSByZXBsYWNlbWVudHMuZ2V0KG5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJbnRyb3NwZWN0aW9uVXRpbHMuZ2V0UHJvcGVydHkocHJvdG9jb2xIYW5kbGVyLCByZXBsKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgYSBjb25maWd1cmVkIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgU3RyaW5nIHJlcGwgPSBuYW1lOworICAgICAgICBpZiAocmVwbGFjZW1lbnRzLmdldChuYW1lKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXBsID0gKFN0cmluZykgcmVwbGFjZW1lbnRzLmdldChuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBJbnRyb3NwZWN0aW9uVXRpbHMuc2V0UHJvcGVydHkocHJvdG9jb2xIYW5kbGVyLCByZXBsLCB2YWx1ZSk7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29uZmlndXJlZCBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHkobmFtZSk7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogU2V0IGEgY29uZmlndXJlZCBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzZXRQcm9wZXJ0eShuYW1lLCBTdHJpbmcudmFsdWVPZih2YWx1ZSkpOworICAgIH0KKworICAgIAorICAgIC8qKiAKKyAgICAgKiByZW1vdmUgYSBjb25maWd1cmVkIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIC8vIEZJWE1FICEKKyAgICAgICAgLy9wcm90b2NvbEhhbmRsZXIucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgPGNvZGU+U2VydmljZTwvY29kZT4gd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZCAoaWYgYW55KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmljZSBnZXRTZXJ2aWNlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5zZXJ2aWNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8Y29kZT5TZXJ2aWNlPC9jb2RlPiB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkIChpZiBhbnkpLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2UgdGhhdCBvd25zIHRoaXMgRW5naW5lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VydmljZShTZXJ2aWNlIHNlcnZpY2UpIHsKKworICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOworICAgICAgICAvLyBGSVhNRTogc2V0UHJvcGVydHkoInNlcnZpY2UiLCBzZXJ2aWNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgVFJBQ0UgbWV0aG9kIGlzIGFsbG93ZWQuICBEZWZhdWx0IHZhbHVlIGlzICJmYWxzZSIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QWxsb3dUcmFjZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuYWxsb3dUcmFjZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWxsb3dUcmFjZSBmbGFnLCB0byBkaXNhYmxlIG9yIGVuYWJsZSB0aGUgVFJBQ0UgSFRUUCBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsb3dUcmFjZSBUaGUgbmV3IGFsbG93VHJhY2UgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFsbG93VHJhY2UoYm9vbGVhbiBhbGxvd1RyYWNlKSB7CisKKyAgICAgICAgdGhpcy5hbGxvd1RyYWNlID0gYWxsb3dUcmFjZTsKKyAgICAgICAgc2V0UHJvcGVydHkoImFsbG93VHJhY2UiLCBTdHJpbmcudmFsdWVPZihhbGxvd1RyYWNlKSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIGNvbm5lY3RvciBhdmFpbGFibGUgZm9yIHByb2Nlc3NpbmcgcmVxdWVzdHM/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7CisKKyAgICAgICAgcmV0dXJuIChzdGFydGVkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpbnB1dCBidWZmZXIgc2l6ZSBmb3IgdGhpcyBDb25uZWN0b3IuCisgICAgICogCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEJ1ZmZlclNpemUoKSB7CisgICAgICAgIHJldHVybiAyMDQ4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaW5wdXQgYnVmZmVyIHNpemUgZm9yIHRoaXMgQ29ubmVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZmZlclNpemUgVGhlIG5ldyBpbnB1dCBidWZmZXIgc2l6ZS4KKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJ1ZmZlclNpemUoaW50IGJ1ZmZlclNpemUpIHsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENvbnRhaW5lciB1c2VkIGZvciBwcm9jZXNzaW5nIHJlcXVlc3RzIHJlY2VpdmVkIGJ5IHRoaXMKKyAgICAgKiBDb25uZWN0b3IuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lciBnZXRDb250YWluZXIoKSB7CisgICAgICAgIGlmKCBjb250YWluZXI9PW51bGwgKSB7CisgICAgICAgICAgICAvLyBMYXp5IC0gbWF5YmUgaXQgd2FzIGFkZGVkIGxhdGVyCisgICAgICAgICAgICBmaW5kQ29udGFpbmVyKCk7ICAgICAKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGNvbnRhaW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIHVzZWQgZm9yIHByb2Nlc3NpbmcgcmVxdWVzdHMgcmVjZWl2ZWQgYnkgdGhpcworICAgICAqIENvbm5lY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXIgVGhlIG5ldyBDb250YWluZXIgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKENvbnRhaW5lciBjb250YWluZXIpIHsKKworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSAiZW1wdHkgc2Vzc2lvbiBwYXRoIiBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEVtcHR5U2Vzc2lvblBhdGgoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmVtcHR5U2Vzc2lvblBhdGgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlICJlbXB0eSBzZXNzaW9uIHBhdGgiIGZsYWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW1wdHlTZXNzaW9uUGF0aCBUaGUgbmV3ICJlbXB0eSBzZXNzaW9uIHBhdGgiIGZsYWcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbXB0eVNlc3Npb25QYXRoKGJvb2xlYW4gZW1wdHlTZXNzaW9uUGF0aCkgeworCisgICAgICAgIHRoaXMuZW1wdHlTZXNzaW9uUGF0aCA9IGVtcHR5U2Vzc2lvblBhdGg7CisgICAgICAgIHNldFByb3BlcnR5KCJlbXB0eVNlc3Npb25QYXRoIiwgU3RyaW5nLnZhbHVlT2YoZW1wdHlTZXNzaW9uUGF0aCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlICJlbmFibGUgRE5TIGxvb2t1cHMiIGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlTG9va3VwcygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZW5hYmxlTG9va3Vwcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgImVuYWJsZSBETlMgbG9va3VwcyIgZmxhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmFibGVMb29rdXBzIFRoZSBuZXcgImVuYWJsZSBETlMgbG9va3VwcyIgZmxhZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZUxvb2t1cHMoYm9vbGVhbiBlbmFibGVMb29rdXBzKSB7CisKKyAgICAgICAgdGhpcy5lbmFibGVMb29rdXBzID0gZW5hYmxlTG9va3VwczsKKyAgICAgICAgc2V0UHJvcGVydHkoImVuYWJsZUxvb2t1cHMiLCBTdHJpbmcudmFsdWVPZihlbmFibGVMb29rdXBzKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIENvbm5lY3RvciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgIC8qKgorICAgICAgKiBSZXR1cm4gdGhlIG1hcHBlci4KKyAgICAgICovCisgICAgIHB1YmxpYyBNYXBwZXIgZ2V0TWFwcGVyKCkgeworCisgICAgICAgICByZXR1cm4gKG1hcHBlcik7CisKKyAgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gc2l6ZSBvZiBhIFBPU1Qgd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5CisgICAgICogcGFyc2VkIGJ5IHRoZSBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhQb3N0U2l6ZSgpIHsKKworICAgICAgICByZXR1cm4gKG1heFBvc3RTaXplKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYXhpbXVtIHNpemUgb2YgYSBQT1NUIHdoaWNoIHdpbGwgYmUgYXV0b21hdGljYWxseQorICAgICAqIHBhcnNlZCBieSB0aGUgY29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIG1heFBvc3RTaXplIFRoZSBuZXcgbWF4aW11bSBzaXplIGluIGJ5dGVzIG9mIGEgUE9TVCB3aGljaCB3aWxsIAorICAgICAqIGJlIGF1dG9tYXRpY2FsbHkgcGFyc2VkIGJ5IHRoZSBjb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhQb3N0U2l6ZShpbnQgbWF4UG9zdFNpemUpIHsKKworICAgICAgICB0aGlzLm1heFBvc3RTaXplID0gbWF4UG9zdFNpemU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gc2l6ZSBvZiBhIFBPU1Qgd2hpY2ggd2lsbCBiZSBzYXZlZCBieSB0aGUgY29udGFpbmVyCisgICAgICogZHVyaW5nIGF1dGhlbnRpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4U2F2ZVBvc3RTaXplKCkgeworCisgICAgICAgIHJldHVybiAobWF4U2F2ZVBvc3RTaXplKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYXhpbXVtIHNpemUgb2YgYSBQT1NUIHdoaWNoIHdpbGwgYmUgc2F2ZWQgYnkgdGhlIGNvbnRhaW5lcgorICAgICAqIGR1cmluZyBhdXRoZW50aWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXhTYXZlUG9zdFNpemUgVGhlIG5ldyBtYXhpbXVtIHNpemUgaW4gYnl0ZXMgb2YgYSBQT1NUIHdoaWNoIHdpbGwKKyAgICAgKiBiZSBzYXZlZCBieSB0aGUgY29udGFpbmVyIGR1cmluZyBhdXRoZW50aWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhTYXZlUG9zdFNpemUoaW50IG1heFNhdmVQb3N0U2l6ZSkgeworCisgICAgICAgIHRoaXMubWF4U2F2ZVBvc3RTaXplID0gbWF4U2F2ZVBvc3RTaXplOworICAgICAgICBzZXRQcm9wZXJ0eSgibWF4U2F2ZVBvc3RTaXplIiwgU3RyaW5nLnZhbHVlT2YobWF4U2F2ZVBvc3RTaXplKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBvcnQgbnVtYmVyIG9uIHdoaWNoIHdlIGxpc3RlbiBmb3IgcmVxdWVzdHMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQb3J0KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5wb3J0KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwb3J0IG51bWJlciBvbiB3aGljaCB3ZSBsaXN0ZW4gZm9yIHJlcXVlc3RzLgorICAgICAqCisgICAgICogQHBhcmFtIHBvcnQgVGhlIG5ldyBwb3J0IG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHBvcnQpIHsKKworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICBzZXRQcm9wZXJ0eSgicG9ydCIsIFN0cmluZy52YWx1ZU9mKHBvcnQpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb3lvdGUgcHJvdG9jb2wgaGFuZGxlciBpbiB1c2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKKworICAgICAgICBpZiAoIm9yZy5hcGFjaGUuY295b3RlLmh0dHAxMS5IdHRwMTFQcm90b2NvbCIuZXF1YWxzCisgICAgICAgICAgICAoZ2V0UHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lKCkpCisgICAgICAgICAgICB8fCAib3JnLmFwYWNoZS5jb3lvdGUuaHR0cDExLkh0dHAxMUFwclByb3RvY29sIi5lcXVhbHMKKyAgICAgICAgICAgIChnZXRQcm90b2NvbEhhbmRsZXJDbGFzc05hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiSFRUUC8xLjEiOworICAgICAgICB9IGVsc2UgaWYgKCJvcmcuYXBhY2hlLmprLnNlcnZlci5Ka0NveW90ZUhhbmRsZXIiLmVxdWFscworICAgICAgICAgICAgICAgICAgIChnZXRQcm90b2NvbEhhbmRsZXJDbGFzc05hbWUoKSkKKyAgICAgICAgICAgICAgICAgICB8fCAib3JnLmFwYWNoZS5jb3lvdGUuYWpwLkFqcEFwclByb3RvY29sIi5lcXVhbHMKKyAgICAgICAgICAgICAgICAgICAoZ2V0UHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gIkFKUC8xLjMiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRQcm90b2NvbEhhbmRsZXJDbGFzc05hbWUoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDb3lvdGUgcHJvdG9jb2wgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IHRoZSBjb25uZWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdG9jb2wgVGhlIENveW90ZSBwcm90b2NvbCBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvdG9jb2woU3RyaW5nIHByb3RvY29sKSB7CisKKyAgICAgICAgLy8gVGVzdCBBUFIgc3VwcG9ydAorICAgICAgICBib29sZWFuIGFwciA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSAiaW5pdGlhbGl6ZSI7CisgICAgICAgICAgICBDbGFzcyBwYXJhbVR5cGVzW10gPSBuZXcgQ2xhc3NbMV07CisgICAgICAgICAgICBwYXJhbVR5cGVzWzBdID0gU3RyaW5nLmNsYXNzOworICAgICAgICAgICAgT2JqZWN0IHBhcmFtVmFsdWVzW10gPSBuZXcgT2JqZWN0WzFdOworICAgICAgICAgICAgcGFyYW1WYWx1ZXNbMF0gPSBudWxsOworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUudG9tY2F0LmpuaS5MaWJyYXJ5IikKKyAgICAgICAgICAgICAgICAuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtVHlwZXMpOworICAgICAgICAgICAgbWV0aG9kLmludm9rZShudWxsLCBwYXJhbVZhbHVlcyk7CisgICAgICAgICAgICBhcHIgPSB0cnVlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgIH0KKworICAgICAgICBpZiAoYXByKSB7CisgICAgICAgICAgICBpZiAoIkhUVFAvMS4xIi5lcXVhbHMocHJvdG9jb2wpKSB7CisgICAgICAgICAgICAgICAgc2V0UHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lCisgICAgICAgICAgICAgICAgICAgICgib3JnLmFwYWNoZS5jb3lvdGUuaHR0cDExLkh0dHAxMUFwclByb3RvY29sIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJBSlAvMS4zIi5lcXVhbHMocHJvdG9jb2wpKSB7CisgICAgICAgICAgICAgICAgc2V0UHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lCisgICAgICAgICAgICAgICAgICAgICgib3JnLmFwYWNoZS5jb3lvdGUuYWpwLkFqcEFwclByb3RvY29sIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXRQcm90b2NvbEhhbmRsZXJDbGFzc05hbWUocHJvdG9jb2wpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXRQcm90b2NvbEhhbmRsZXJDbGFzc05hbWUKKyAgICAgICAgICAgICAgICAgICAgKCJvcmcuYXBhY2hlLmNveW90ZS5odHRwMTEuSHR0cDExQXByUHJvdG9jb2wiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgiSFRUUC8xLjEiLmVxdWFscyhwcm90b2NvbCkpIHsKKyAgICAgICAgICAgICAgICBzZXRQcm90b2NvbEhhbmRsZXJDbGFzc05hbWUKKyAgICAgICAgICAgICAgICAgICAgKCJvcmcuYXBhY2hlLmNveW90ZS5odHRwMTEuSHR0cDExUHJvdG9jb2wiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIkFKUC8xLjMiLmVxdWFscyhwcm90b2NvbCkpIHsKKyAgICAgICAgICAgICAgICBzZXRQcm90b2NvbEhhbmRsZXJDbGFzc05hbWUKKyAgICAgICAgICAgICAgICAgICAgKCJvcmcuYXBhY2hlLmprLnNlcnZlci5Ka0NveW90ZUhhbmRsZXIiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldFByb3RvY29sSGFuZGxlckNsYXNzTmFtZShwcm90b2NvbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBDb3lvdGUgcHJvdG9jb2wgaGFuZGxlciBpbiB1c2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbEhhbmRsZXJDbGFzc05hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnByb3RvY29sSGFuZGxlckNsYXNzTmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgQ295b3RlIHByb3RvY29sIGhhbmRsZXIgd2hpY2ggd2lsbCBiZSB1c2VkCisgICAgICogYnkgdGhlIGNvbm5lY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm90b2NvbEhhbmRsZXJDbGFzc05hbWUgVGhlIG5ldyBjbGFzcyBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lKFN0cmluZyBwcm90b2NvbEhhbmRsZXJDbGFzc05hbWUpIHsKKworICAgICAgICB0aGlzLnByb3RvY29sSGFuZGxlckNsYXNzTmFtZSA9IHByb3RvY29sSGFuZGxlckNsYXNzTmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm90b2NvbCBoYW5kbGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ubmVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBQcm90b2NvbEhhbmRsZXIgZ2V0UHJvdG9jb2xIYW5kbGVyKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5wcm90b2NvbEhhbmRsZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3h5IHNlcnZlciBuYW1lIGZvciB0aGlzIENvbm5lY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3h5TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucHJveHlOYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcm94eSBzZXJ2ZXIgbmFtZSBmb3IgdGhpcyBDb25uZWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJveHlOYW1lIFRoZSBuZXcgcHJveHkgc2VydmVyIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm94eU5hbWUoU3RyaW5nIHByb3h5TmFtZSkgeworCisgICAgICAgIGlmKHByb3h5TmFtZSAhPSBudWxsICYmIHByb3h5TmFtZS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHRoaXMucHJveHlOYW1lID0gcHJveHlOYW1lOworICAgICAgICAgICAgc2V0UHJvcGVydHkoInByb3h5TmFtZSIsIHByb3h5TmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnByb3h5TmFtZSA9IG51bGw7CisgICAgICAgICAgICByZW1vdmVQcm9wZXJ0eSgicHJveHlOYW1lIik7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm94eSBzZXJ2ZXIgcG9ydCBmb3IgdGhpcyBDb25uZWN0b3IuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQcm94eVBvcnQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnByb3h5UG9ydCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJveHkgc2VydmVyIHBvcnQgZm9yIHRoaXMgQ29ubmVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3h5UG9ydCBUaGUgbmV3IHByb3h5IHNlcnZlciBwb3J0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJveHlQb3J0KGludCBwcm94eVBvcnQpIHsKKworICAgICAgICB0aGlzLnByb3h5UG9ydCA9IHByb3h5UG9ydDsKKyAgICAgICAgc2V0UHJvcGVydHkoInByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKHByb3h5UG9ydCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBvcnQgbnVtYmVyIHRvIHdoaWNoIGEgcmVxdWVzdCBzaG91bGQgYmUgcmVkaXJlY3RlZCBpZgorICAgICAqIGl0IGNvbWVzIGluIG9uIGEgbm9uLVNTTCBwb3J0IGFuZCBpcyBzdWJqZWN0IHRvIGEgc2VjdXJpdHkgY29uc3RyYWludAorICAgICAqIHdpdGggYSB0cmFuc3BvcnQgZ3VhcmFudGVlIHRoYXQgcmVxdWlyZXMgU1NMLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVkaXJlY3RQb3J0KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5yZWRpcmVjdFBvcnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlZGlyZWN0IHBvcnQgbnVtYmVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlZGlyZWN0UG9ydCBUaGUgcmVkaXJlY3QgcG9ydCBudW1iZXIgKG5vbi1TU0wgdG8gU1NMKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZGlyZWN0UG9ydChpbnQgcmVkaXJlY3RQb3J0KSB7CisKKyAgICAgICAgdGhpcy5yZWRpcmVjdFBvcnQgPSByZWRpcmVjdFBvcnQ7CisgICAgICAgIHNldFByb3BlcnR5KCJyZWRpcmVjdFBvcnQiLCBTdHJpbmcudmFsdWVPZihyZWRpcmVjdFBvcnQpKTsKKworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2NoZW1lIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byByZXF1ZXN0cyByZWNlaXZlZAorICAgICAqIHRocm91Z2ggdGhpcyBjb25uZWN0b3IuICBEZWZhdWx0IHZhbHVlIGlzICJodHRwIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuc2NoZW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzY2hlbWUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIHJlcXVlc3RzIHJlY2VpdmVkIHRocm91Z2gKKyAgICAgKiB0aGlzIGNvbm5lY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY2hlbWUgVGhlIG5ldyBzY2hlbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWUoU3RyaW5nIHNjaGVtZSkgeworCisgICAgICAgIHRoaXMuc2NoZW1lID0gc2NoZW1lOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlY3VyZSBjb25uZWN0aW9uIGZsYWcgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIHJlcXVlc3RzCisgICAgICogcmVjZWl2ZWQgdGhyb3VnaCB0aGlzIGNvbm5lY3Rvci4gIERlZmF1bHQgdmFsdWUgaXMgImZhbHNlIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTZWN1cmUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlY3VyZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2VjdXJlIGNvbm5lY3Rpb24gZmxhZyB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gcmVxdWVzdHMKKyAgICAgKiByZWNlaXZlZCB0aHJvdWdoIHRoaXMgY29ubmVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHNlY3VyZSBUaGUgbmV3IHNlY3VyZSBjb25uZWN0aW9uIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZWN1cmUoYm9vbGVhbiBzZWN1cmUpIHsKKworICAgICAgICB0aGlzLnNlY3VyZSA9IHNlY3VyZTsKKyAgICAgICAgc2V0UHJvcGVydHkoInNlY3VyZSIsIEJvb2xlYW4udG9TdHJpbmcoc2VjdXJlKSk7CisgICAgfQorCisgICAgIC8qKgorICAgICAgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSB1c2VkIGZvciB0aGUgVVJJLgorICAgICAgKi8KKyAgICAgcHVibGljIFN0cmluZyBnZXRVUklFbmNvZGluZygpIHsKKworICAgICAgICAgcmV0dXJuICh0aGlzLlVSSUVuY29kaW5nKTsKKworICAgICB9CisKKworICAgICAvKioKKyAgICAgICogU2V0IHRoZSBVUkkgZW5jb2RpbmcgdG8gYmUgdXNlZCBmb3IgdGhlIFVSSS4KKyAgICAgICoKKyAgICAgICogQHBhcmFtIFVSSUVuY29kaW5nIFRoZSBuZXcgVVJJIGNoYXJhY3RlciBlbmNvZGluZy4KKyAgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHNldFVSSUVuY29kaW5nKFN0cmluZyBVUklFbmNvZGluZykgeworCisgICAgICAgICB0aGlzLlVSSUVuY29kaW5nID0gVVJJRW5jb2Rpbmc7CisgICAgICAgICBzZXRQcm9wZXJ0eSgidVJJRW5jb2RpbmciLCBVUklFbmNvZGluZyk7CisKKyAgICAgfQorCisKKyAgICAgLyoqCisgICAgICAqIFJldHVybiB0aGUgdHJ1ZSBpZiB0aGUgZW50aXR5IGJvZHkgZW5jb2Rpbmcgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBVUkkuCisgICAgICAqLworICAgICBwdWJsaWMgYm9vbGVhbiBnZXRVc2VCb2R5RW5jb2RpbmdGb3JVUkkoKSB7CisKKyAgICAgICAgIHJldHVybiAodGhpcy51c2VCb2R5RW5jb2RpbmdGb3JVUkkpOworCisgICAgIH0KKworCisgICAgIC8qKgorICAgICAgKiBTZXQgaWYgdGhlIGVudGl0eSBib2R5IGVuY29kaW5nIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgVVJJLgorICAgICAgKgorICAgICAgKiBAcGFyYW0gdXNlQm9keUVuY29kaW5nRm9yVVJJIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBmbGFnLgorICAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgc2V0VXNlQm9keUVuY29kaW5nRm9yVVJJKGJvb2xlYW4gdXNlQm9keUVuY29kaW5nRm9yVVJJKSB7CisKKyAgICAgICAgIHRoaXMudXNlQm9keUVuY29kaW5nRm9yVVJJID0gdXNlQm9keUVuY29kaW5nRm9yVVJJOworICAgICAgICAgc2V0UHJvcGVydHkKKyAgICAgICAgICAgICAoInVzZUJvZHlFbmNvZGluZ0ZvclVSSSIsIFN0cmluZy52YWx1ZU9mKHVzZUJvZHlFbmNvZGluZ0ZvclVSSSkpOworCisgICAgIH0KKworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdlbmVyYXRpb24gb2YgYW4gWC1Qb3dlcmVkLUJ5IHJlc3BvbnNlIGhlYWRlciBmb3IKKyAgICAgKiBzZXJ2bGV0LWdlbmVyYXRlZCByZXNwb25zZXMgaXMgZW5hYmxlZCBvciBkaXNhYmxlZCBmb3IgdGhpcyBDb25uZWN0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZ2VuZXJhdGlvbiBvZiBYLVBvd2VyZWQtQnkgcmVzcG9uc2UgaGVhZGVyIGlzIGVuYWJsZWQsCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0WHBvd2VyZWRCeSgpIHsKKyAgICAgICAgcmV0dXJuIHhwb3dlcmVkQnk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBnZW5lcmF0aW9uIG9mIGFuIFgtUG93ZXJlZC1CeSBoZWFkZXIgKHdpdGggdmFsdWUKKyAgICAgKiBTZXJ2bGV0LzIuNCkgZm9yIGFsbCBzZXJ2bGV0LWdlbmVyYXRlZCByZXNwb25zZXMgcmV0dXJuZWQgYnkgdGhpcworICAgICAqIENvbm5lY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4cG93ZXJlZEJ5IHRydWUgaWYgZ2VuZXJhdGlvbiBvZiBYLVBvd2VyZWQtQnkgcmVzcG9uc2UgaGVhZGVyIGlzCisgICAgICogdG8gYmUgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0WHBvd2VyZWRCeShib29sZWFuIHhwb3dlcmVkQnkpIHsKKyAgICAgICAgdGhpcy54cG93ZXJlZEJ5ID0geHBvd2VyZWRCeTsKKyAgICAgICAgc2V0UHJvcGVydHkoInhwb3dlcmVkQnkiLCBTdHJpbmcudmFsdWVPZih4cG93ZXJlZEJ5KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlIHRoZSB1c2Ugb2YgSVAtYmFzZWQgdmlydHVhbCBob3N0aW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZUlQVkhvc3RzIDxjb2RlPnRydWU8L2NvZGU+IGlmIEhvc3RzIGFyZSBpZGVudGlmaWVkIGJ5IElQLAorICAgICAqICAgICAgICAgICAgICAgICAgICA8Y29kZT5mYWxzZS9jb2RlPiBpZiBIb3N0cyBhcmUgaWRlbnRpZmllZCBieSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZUlQVkhvc3RzKGJvb2xlYW4gdXNlSVBWSG9zdHMpIHsKKyAgICAgICAgdGhpcy51c2VJUFZIb3N0cyA9IHVzZUlQVkhvc3RzOworICAgICAgICBzZXRQcm9wZXJ0eSgidXNlSVBWSG9zdHMiLCBTdHJpbmcudmFsdWVPZih1c2VJUFZIb3N0cykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgaWYgSVAtYmFzZWQgdmlydHVhbCBob3N0aW5nIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VXNlSVBWSG9zdHMoKSB7CisgICAgICAgIHJldHVybiB1c2VJUFZIb3N0czsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIChvciBhbGxvY2F0ZSkgYW5kIHJldHVybiBhIFJlcXVlc3Qgb2JqZWN0IHN1aXRhYmxlIGZvcgorICAgICAqIHNwZWNpZnlpbmcgdGhlIGNvbnRlbnRzIG9mIGEgUmVxdWVzdCB0byB0aGUgcmVzcG9uc2libGUgQ29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0IGNyZWF0ZVJlcXVlc3QoKSB7CisKKyAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoKTsKKyAgICAgICAgcmVxdWVzdC5zZXRDb25uZWN0b3IodGhpcyk7CisgICAgICAgIHJldHVybiAocmVxdWVzdCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSAob3IgYWxsb2NhdGUpIGFuZCByZXR1cm4gYSBSZXNwb25zZSBvYmplY3Qgc3VpdGFibGUgZm9yCisgICAgICogcmVjZWl2aW5nIHRoZSBjb250ZW50cyBvZiBhIFJlc3BvbnNlIGZyb20gdGhlIHJlc3BvbnNpYmxlIENvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzcG9uc2UgY3JlYXRlUmVzcG9uc2UoKSB7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29ubmVjdG9yKHRoaXMpOworICAgICAgICByZXR1cm4gKHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlmZWN5Y2xlLiBJZiB0aGlzCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiBsaWZlY3ljbGUuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisgICAgCisgICAgcHJvdGVjdGVkIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLCBTdHJpbmcgdHlwZSkKKyAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGVuY29kZWRBZGRyID0gbnVsbDsKKyAgICAgICAgaWYgKGdldFByb3BlcnR5KCJhZGRyZXNzIikgIT0gbnVsbCkgeworICAgICAgICAgICAgZW5jb2RlZEFkZHIgPSBVUkxFbmNvZGVyLmVuY29kZShnZXRQcm9wZXJ0eSgiYWRkcmVzcyIpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBhZGRTdWZmaXggPSAoZ2V0UHJvcGVydHkoImFkZHJlc3MiKSA9PSBudWxsKSA/ICIiIDogIixhZGRyZXNzPSIKKyAgICAgICAgICAgICAgICArIGVuY29kZWRBZGRyOworICAgICAgICBPYmplY3ROYW1lIF9vbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT0iICsgdHlwZSArICIscG9ydD0iCisgICAgICAgICAgICAgICAgKyBnZXRQb3J0KCkgKyBhZGRTdWZmaXgpOworICAgICAgICByZXR1cm4gX29uYW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMgY29ubmVjdG9yIChjcmVhdGUgU2VydmVyU29ja2V0IGhlcmUhKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKQorICAgICAgICB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJjb3lvdGVDb25uZWN0b3IuYWxyZWFkeUluaXRpYWxpemVkIikpOworICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsKKworICAgICAgICBpZiggb25hbWUgPT0gbnVsbCAmJiAoY29udGFpbmVyIGluc3RhbmNlb2YgU3RhbmRhcmRFbmdpbmUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBsb2FkZWQgZGlyZWN0bHksIHZpYSBBUEkgLSBhbmQgbm8gbmFtZSB3YXMgZ2l2ZW4gdG8gdXMKKyAgICAgICAgICAgICAgICBTdGFuZGFyZEVuZ2luZSBjYj0oU3RhbmRhcmRFbmdpbmUpY29udGFpbmVyOworICAgICAgICAgICAgICAgIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShjYi5nZXROYW1lKCksICJDb25uZWN0b3IiKTsKKyAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXJDb21wb25lbnQodGhpcywgb25hbWUsIG51bGwpOworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI9b25hbWU7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvciggIkVycm9yIHJlZ2lzdGVyaW5nIGNvbm5lY3RvciAiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgbmFtZSBmb3IgY29ubmVjdG9yICIgKyBvbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbml0aWFsaXphIGFkYXB0ZXIKKyAgICAgICAgYWRhcHRlciA9IG5ldyBDb3lvdGVBZGFwdGVyKHRoaXMpOworICAgICAgICBwcm90b2NvbEhhbmRsZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKworICAgICAgICBJbnRyb3NwZWN0aW9uVXRpbHMuc2V0UHJvcGVydHkocHJvdG9jb2xIYW5kbGVyLCAiamtIb21lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvdG9jb2xIYW5kbGVyLmluaXQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICgiY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlckluaXRpYWxpemF0aW9uRmFpbGVkIiwgZSkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQYXVzZSB0aGUgY29ubmVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhdXNlKCkKKyAgICAgICAgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm90b2NvbEhhbmRsZXIucGF1c2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAoImNveW90ZUNvbm5lY3Rvci5wcm90b2NvbEhhbmRsZXJQYXVzZUZhaWxlZCIpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUGF1c2UgdGhlIGNvbm5lY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXN1bWUoKQorICAgICAgICB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb3RvY29sSGFuZGxlci5yZXN1bWUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAoImNveW90ZUNvbm5lY3Rvci5wcm90b2NvbEhhbmRsZXJSZXN1bWVGYWlsZWQiKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJlZ2luIHByb2Nlc3NpbmcgcmVxdWVzdHMgdmlhIHRoaXMgQ29ubmVjdG9yLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgYSBmYXRhbCBzdGFydHVwIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmKCAhaW5pdGlhbGl6ZWQgKQorICAgICAgICAgICAgaW5pdGlhbGl6ZSgpOworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQgKSB7CisgICAgICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygiY295b3RlQ29ubmVjdG9yLmFscmVhZHlTdGFydGVkIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKworICAgICAgICAvLyBXZSBjYW4ndCByZWdpc3RlciBlYXJsaWVyIC0gdGhlIEpNWCByZWdpc3RyYXRpb24gb2YgdGhpcyBoYXBwZW5zCisgICAgICAgIC8vIGluIFNlcnZlci5zdGFydCBjYWxsYmFjaworICAgICAgICBpZiAoIHRoaXMub25hbWUgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIC8vIFdlIGFyZSByZWdpc3RyZWQgLSByZWdpc3RlciB0aGUgYWRhcHRlciBhcyB3ZWxsLgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS5yZWdpc3RlckNvbXBvbmVudAorICAgICAgICAgICAgICAgICAgICAocHJvdG9jb2xIYW5kbGVyLCBjcmVhdGVPYmplY3ROYW1lKHRoaXMuZG9tYWluLCJQcm90b2NvbEhhbmRsZXIiKSwgbnVsbCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICgiY295b3RlQ29ubmVjdG9yLnByb3RvY29sUmVnaXN0cmF0aW9uRmFpbGVkIiksIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAoImNveW90ZUNvbm5lY3Rvci5jYW5ub3RSZWdpc3RlclByb3RvY29sIikpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb3RvY29sSGFuZGxlci5zdGFydCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIGVyclByZWZpeCA9ICIiOworICAgICAgICAgICAgaWYodGhpcy5zZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnJQcmVmaXggKz0gInNlcnZpY2UuZ2V0TmFtZSgpOiBcIiIgKyB0aGlzLnNlcnZpY2UuZ2V0TmFtZSgpICsgIlwiOyAiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKGVyclByZWZpeCArICIgIiArIHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAoImNveW90ZUNvbm5lY3Rvci5wcm90b2NvbEhhbmRsZXJTdGFydEZhaWxlZCIsIGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCB0aGlzLmRvbWFpbiAhPSBudWxsICkgeworICAgICAgICAgICAgbWFwcGVyTGlzdGVuZXIuc2V0RG9tYWluKCBkb21haW4gKTsKKyAgICAgICAgICAgIC8vbWFwcGVyTGlzdGVuZXIuc2V0RW5naW5lKCBzZXJ2aWNlLmdldENvbnRhaW5lcigpLmdldE5hbWUoKSApOworICAgICAgICAgICAgbWFwcGVyTGlzdGVuZXIuaW5pdCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG1hcHBlck9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZSh0aGlzLmRvbWFpbiwiTWFwcGVyIik7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3lvdGVDb25uZWN0b3IuTWFwcGVyUmVnaXN0cmF0aW9uIiwgbWFwcGVyT25hbWUpKTsKKyAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS5yZWdpc3RlckNvbXBvbmVudAorICAgICAgICAgICAgICAgICAgICAobWFwcGVyLCBtYXBwZXJPbmFtZSwgIk1hcHBlciIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgKCJjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xSZWdpc3RyYXRpb25GYWlsZWQiKSwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXJtaW5hdGUgcHJvY2Vzc2luZyByZXF1ZXN0cyB2aWEgdGhpcyBDb25uZWN0b3IuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiBhIGZhdGFsIHNodXRkb3duIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IHN0YXRlCisgICAgICAgIGlmICghc3RhcnRlZCkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiY295b3RlQ29ubmVjdG9yLm5vdFN0YXJ0ZWQiKSk7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgfQorICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUT1BfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hcHBlckxpc3RlbmVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLnVucmVnaXN0ZXJDb21wb25lbnQKKyAgICAgICAgICAgICAgICAoY3JlYXRlT2JqZWN0TmFtZSh0aGlzLmRvbWFpbiwiTWFwcGVyIikpOworICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkudW5yZWdpc3RlckNvbXBvbmVudAorICAgICAgICAgICAgICAgIChjcmVhdGVPYmplY3ROYW1lKHRoaXMuZG9tYWluLCJQcm90b2NvbEhhbmRsZXIiKSk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCBzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgKCJjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xVbnJlZ2lzdHJhdGlvbkZhaWxlZCIpLCBlKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvdG9jb2xIYW5kbGVyLmRlc3Ryb3koKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICgiY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlckRlc3Ryb3lGYWlsZWQiLCBlKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gSk1YIHJlZ2lzdHJhdGlvbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRvbWFpbjsKKyAgICBwcm90ZWN0ZWQgT2JqZWN0TmFtZSBvbmFtZTsKKyAgICBwcm90ZWN0ZWQgTUJlYW5TZXJ2ZXIgbXNlcnZlcjsKKyAgICBPYmplY3ROYW1lIGNvbnRyb2xsZXI7CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBnZXRDb250cm9sbGVyKCkgeworICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250cm9sbGVyKE9iamVjdE5hbWUgY29udHJvbGxlcikgeworICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3ROYW1lIGdldE9iamVjdE5hbWUoKSB7CisgICAgICAgIHJldHVybiBvbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIGRvbWFpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBwcmVSZWdpc3RlcihNQmVhblNlcnZlciBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgb25hbWU9bmFtZTsKKyAgICAgICAgbXNlcnZlcj1zZXJ2ZXI7CisgICAgICAgIGRvbWFpbj1uYW1lLmdldERvbWFpbigpOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3N0UmVnaXN0ZXIoQm9vbGVhbiByZWdpc3RyYXRpb25Eb25lKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJlRGVyZWdpc3RlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3REZXJlZ2lzdGVyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYoIHN0YXJ0ZWQgKSB7CisgICAgICAgICAgICAgICAgc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKCBUaHJvd2FibGUgdCApIHsKKyAgICAgICAgICAgIGxvZy5lcnJvciggIlVucmVnaXN0ZXJpbmcgLSBjYW4ndCBzdG9wIiwgdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgZmluZENvbnRhaW5lcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRvIHRoZSBzZXJ2aWNlCisgICAgICAgICAgICBPYmplY3ROYW1lIHBhcmVudE5hbWU9bmV3IE9iamVjdE5hbWUoIGRvbWFpbiArICI6IiArCisgICAgICAgICAgICAgICAgICAgICJ0eXBlPVNlcnZpY2UiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgdG8gIiArIHBhcmVudE5hbWUgKTsKKyAgICAgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZChwYXJlbnROYW1lICkpIHsKKyAgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZShwYXJlbnROYW1lLCAiYWRkQ29ubmVjdG9yIiwgbmV3IE9iamVjdFtdIHsgdGhpcyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsib3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuQ29ubmVjdG9yIn0pOworICAgICAgICAgICAgICAgIC8vIEFzIGEgc2lkZSBlZmZlY3Qgd2UnbGwgZ2V0IHRoZSBjb250YWluZXIgZmllbGQgc2V0CisgICAgICAgICAgICAgICAgLy8gQWxzbyBpbml0aWFsaXplIHdpbGwgYmUgY2FsbGVkCisgICAgICAgICAgICAgICAgLy9yZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBYWFggR28gZGlyZWN0bHkgdG8gdGhlIEVuZ2luZQorICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSgpOyAtIGlzIGNhbGxlZCBieSBhZGRDb25uZWN0b3IKKyAgICAgICAgICAgIE9iamVjdE5hbWUgZW5nTmFtZT1uZXcgT2JqZWN0TmFtZSggZG9tYWluICsgIjoiICsgInR5cGU9RW5naW5lIik7CisgICAgICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQoZW5nTmFtZSApKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG9iaj1tc2VydmVyLmdldEF0dHJpYnV0ZShlbmdOYW1lLCAibWFuYWdlZFJlc291cmNlIik7CisgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBlbmdpbmUgIiArIG9iaiArICIgIiArIG9iai5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgICAgICBjb250YWluZXI9KENvbnRhaW5lcilvYmo7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWwgaW5pdGlhbGl6ZSAtIHdlIG5vdyBoYXZlIHRoZSBFbmdpbmUKKyAgICAgICAgICAgICAgICBpbml0aWFsaXplKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgICAgICAvLyBBcyBhIHNpZGUgZWZmZWN0IHdlJ2xsIGdldCB0aGUgY29udGFpbmVyIGZpZWxkIHNldAorICAgICAgICAgICAgICAgIC8vIEFsc28gaW5pdGlhbGl6ZSB3aWxsIGJlIGNhbGxlZAorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgbG9nLmVycm9yKCAiRXJyb3IgZmluZGluZyBjb250YWluZXIgIiArIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiggdGhpcy5nZXRTZXJ2aWNlKCkgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICBsb2cuZGVidWcoICJBbHJlYWR5IGNvbmZpZ3VyZWQiICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYoIGNvbnRhaW5lcj09bnVsbCApIHsKKyAgICAgICAgICAgIGZpbmRDb250YWluZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoIG9uYW1lIT1udWxsICYmIGNvbnRyb2xsZXI9PW9uYW1lICkgeworICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5yZWdpc3RlciBpdHNlbGYgIiArIG9uYW1lICk7CisgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS51bnJlZ2lzdGVyQ29tcG9uZW50KG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiggZ2V0U2VydmljZSgpID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGdldFNlcnZpY2UoKS5yZW1vdmVDb25uZWN0b3IodGhpcyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NvbnN0YW50cy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODg0YTljCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yOworCisKKy8qKgorICogU3RhdGljIGNvbnN0YW50cyBmb3IgdGhpcyBwYWNrYWdlLgorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb25zdGFudHMgeworCisJCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhY2thZ2UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DT05ORUNUSU9OX0xJTkdFUiA9IC0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ09OTkVDVElPTl9USU1FT1VUID0gNjAwMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DT05ORUNUSU9OX1VQTE9BRF9USU1FT1VUID0gMzAwMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU0VSVkVSX1NPQ0tFVF9USU1FT1VUID0gMDsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0NFU1NPUl9JRExFID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9DRVNTT1JfQUNUSVZFID0gMTsKKworICAgIC8qKgorICAgICAqIFNlY3VyaXR5IGZsYWcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFNFQ1VSSVRZID0gCisgICAgICAgIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCk7CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db3lvdGVBZGFwdGVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NveW90ZUFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmRiZjdmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db3lvdGVBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw2MTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLldyYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb3lvdGUuQWN0aW9uQ29kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNveW90ZS5BZGFwdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLkIyQ0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5CeXRlQ2h1bms7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuQ2hhckNodW5rOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLk1lc3NhZ2VCeXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmh0dHAuQ29va2llczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmh0dHAuU2VydmVyQ29va2llOworCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgYSByZXF1ZXN0IHByb2Nlc3NvciB3aGljaCBkZWxlZ2F0ZXMgdGhlIHByb2Nlc3NpbmcgdG8gYQorICogQ295b3RlIHByb2Nlc3Nvci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENveW90ZUFkYXB0ZXIKKyAgICBpbXBsZW1lbnRzIEFkYXB0ZXIgCisgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDb3lvdGVBZGFwdGVyLmNsYXNzKTsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBTExPV19CQUNLU0xBU0ggPSAKKyAgICAgICAgQm9vbGVhbi52YWx1ZU9mKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuQ295b3RlQWRhcHRlci5BTExPV19CQUNLU0xBU0giLCAiZmFsc2UiKSkuYm9vbGVhblZhbHVlKCk7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEQVBURVJfTk9URVMgPSAxOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IENveW90ZVByb2Nlc3NvciBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBjb25uZWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdG9yIENveW90ZUNvbm5lY3RvciB0aGF0IG93bnMgdGhpcyBwcm9jZXNzb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgQ295b3RlQWRhcHRlcihDb25uZWN0b3IgY29ubmVjdG9yKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5jb25uZWN0b3IgPSBjb25uZWN0b3I7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ295b3RlQ29ubmVjdG9yIHdpdGggd2hpY2ggdGhpcyBwcm9jZXNzb3IgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbm5lY3RvciBjb25uZWN0b3IgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF0Y2ggc3RyaW5nIGZvciBpZGVudGlmeWluZyBhIHNlc3Npb24gSUQgcGFyYW1ldGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtYXRjaCA9CisgICAgICAgICI7IiArIEdsb2JhbHMuU0VTU0lPTl9QQVJBTUVURVJfTkFNRSArICI9IjsKKworCisgICAgLyoqCisgICAgICogVGhlIG1hdGNoIHN0cmluZyBmb3IgaWRlbnRpZnlpbmcgYSBzZXNzaW9uIElEIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gU0VTU0lPTl9JRCA9IG1hdGNoLnRvQ2hhckFycmF5KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQWRhcHRlciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFNlcnZpY2UgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlcnZpY2Uob3JnLmFwYWNoZS5jb3lvdGUuUmVxdWVzdCByZXEsIAorICAgIAkgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5jb3lvdGUuUmVzcG9uc2UgcmVzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSAoUmVxdWVzdCkgcmVxLmdldE5vdGUoQURBUFRFUl9OT1RFUyk7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gKFJlc3BvbnNlKSByZXMuZ2V0Tm90ZShBREFQVEVSX05PVEVTKTsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBvYmplY3RzCisgICAgICAgICAgICByZXF1ZXN0ID0gKFJlcXVlc3QpIGNvbm5lY3Rvci5jcmVhdGVSZXF1ZXN0KCk7CisgICAgICAgICAgICByZXF1ZXN0LnNldENveW90ZVJlcXVlc3QocmVxKTsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gKFJlc3BvbnNlKSBjb25uZWN0b3IuY3JlYXRlUmVzcG9uc2UoKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldENveW90ZVJlc3BvbnNlKHJlcyk7CisKKyAgICAgICAgICAgIC8vIExpbmsgb2JqZWN0cworICAgICAgICAgICAgcmVxdWVzdC5zZXRSZXNwb25zZShyZXNwb25zZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZXRSZXF1ZXN0KHJlcXVlc3QpOworCisgICAgICAgICAgICAvLyBTZXQgYXMgbm90ZXMKKyAgICAgICAgICAgIHJlcS5zZXROb3RlKEFEQVBURVJfTk9URVMsIHJlcXVlc3QpOworICAgICAgICAgICAgcmVzLnNldE5vdGUoQURBUFRFUl9OT1RFUywgcmVzcG9uc2UpOworCisgICAgICAgICAgICAvLyBTZXQgcXVlcnkgc3RyaW5nIGVuY29kaW5nCisgICAgICAgICAgICByZXEuZ2V0UGFyYW1ldGVycygpLnNldFF1ZXJ5U3RyaW5nRW5jb2RpbmcKKyAgICAgICAgICAgICAgICAoY29ubmVjdG9yLmdldFVSSUVuY29kaW5nKCkpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAoY29ubmVjdG9yLmdldFhwb3dlcmVkQnkoKSkgeworICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJYLVBvd2VyZWQtQnkiLCAiU2VydmxldC8yLjQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXEuZ2V0UmVxdWVzdFByb2Nlc3NvcigpLnNldFdvcmtlclRocmVhZE5hbWUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgLy8gUGFyc2UgYW5kIHNldCBDYXRhbGluYSBhbmQgY29uZmlndXJhdGlvbiBzcGVjaWZpYyAKKyAgICAgICAgICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVycworICAgICAgICAgICAgaWYgKCBwb3N0UGFyc2VSZXF1ZXN0KHJlcSwgcmVxdWVzdCwgcmVzLCByZXNwb25zZSkgKSB7CisgICAgICAgICAgICAgICAgLy8gQ2FsbGluZyB0aGUgY29udGFpbmVyCisgICAgICAgICAgICAgICAgY29ubmVjdG9yLmdldENvbnRhaW5lcigpLmdldFBpcGVsaW5lKCkuZ2V0Rmlyc3QoKS5pbnZva2UocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXNwb25zZS5maW5pc2hSZXNwb25zZSgpOworICAgICAgICAgICAgcmVxLmFjdGlvbiggQWN0aW9uQ29kZS5BQ1RJT05fUE9TVF9SRVFVRVNUICwgbnVsbCk7CisKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiY295b3RlQWRhcHRlci5zZXJ2aWNlIiksIHQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVxLmdldFJlcXVlc3RQcm9jZXNzb3IoKS5zZXRXb3JrZXJUaHJlYWROYW1lKG51bGwpOworICAgICAgICAgICAgLy8gUmVjeWNsZSB0aGUgd3JhcHBlciByZXF1ZXN0IGFuZCByZXNwb25zZQorICAgICAgICAgICAgcmVxdWVzdC5yZWN5Y2xlKCk7CisgICAgICAgICAgICByZXNwb25zZS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFBhcnNlIGFkZGl0aW9uYWwgcmVxdWVzdCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHBvc3RQYXJzZVJlcXVlc3Qob3JnLmFwYWNoZS5jb3lvdGUuUmVxdWVzdCByZXEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdCByZXF1ZXN0LAorICAgIAkJICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmNveW90ZS5SZXNwb25zZSByZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBYWFggdGhlIHByb2Nlc3NvciBuZWVkcyB0byBzZXQgYSBjb3JyZWN0IHNjaGVtZSBhbmQgcG9ydCBwcmlvciB0byB0aGlzIHBvaW50LCAKKyAgICAgICAgLy8gaW4gYWpwMTMgcHJvdG9jb2xzIGRvbnQgbWFrZSBzZW5zZSB0byBnZXQgdGhlIHBvcnQgZnJvbSB0aGUgY29ubmVjdG9yLi4KKyAgICAgICAgLy8gWFhYIHRoZSBwcm9jZXNzb3IgbWF5IGhhdmUgc2V0IGEgY29ycmVjdCBzY2hlbWUgYW5kIHBvcnQgcHJpb3IgdG8gdGhpcyBwb2ludCwgCisgICAgICAgIC8vIGluIGFqcDEzIHByb3RvY29scyBkb250IG1ha2Ugc2Vuc2UgdG8gZ2V0IHRoZSBwb3J0IGZyb20gdGhlIGNvbm5lY3Rvci4uLgorICAgICAgICAvLyBvdGhlcndpc2UsIHVzZSBjb25uZWN0b3IgY29uZmlndXJhdGlvbgorICAgICAgICBpZiAoISByZXEuc2NoZW1lKCkuaXNOdWxsKCkpIHsKKyAgICAgICAgICAgIC8vIHVzZSBwcm9jZXNzb3Igc3BlY2lmaWVkIHNjaGVtZSB0byBkZXRlcm1pbmUgc2VjdXJlIHN0YXRlCisgICAgICAgICAgICByZXF1ZXN0LnNldFNlY3VyZShyZXEuc2NoZW1lKCkuZXF1YWxzKCJodHRwcyIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHVzZSBjb25uZWN0b3Igc2NoZW1lIGFuZCBzZWN1cmUgY29uZmlndXJhdGlvbiwgKGRlZmF1bHRzIHRvCisgICAgICAgICAgICAvLyAiaHR0cCIgYW5kIGZhbHNlIHJlc3BlY3RpdmVseSkKKyAgICAgICAgICAgIHJlcS5zY2hlbWUoKS5zZXRTdHJpbmcoY29ubmVjdG9yLmdldFNjaGVtZSgpKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0U2VjdXJlKGNvbm5lY3Rvci5nZXRTZWN1cmUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGSVhNRTogdGhlIGNvZGUgYmVsb3cgZG9lc250IGJlbG9uZ3MgdG8gaGVyZSwgCisgICAgICAgIC8vIHRoaXMgaXMgb25seSBoYXZlIHNlbnNlIAorICAgICAgICAvLyBpbiBIdHRwMTEsIG5vdCBpbiBhanAxMy4uCisgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIEhvc3QgaGVhZGVyIGhhcyBiZWVuIHByb2Nlc3NlZC4KKyAgICAgICAgLy8gT3ZlcnJpZGUgaWYgdGhlIHByb3h5UG9ydC9wcm94eUhvc3QgYXJlIHNldCAKKyAgICAgICAgU3RyaW5nIHByb3h5TmFtZSA9IGNvbm5lY3Rvci5nZXRQcm94eU5hbWUoKTsKKyAgICAgICAgaW50IHByb3h5UG9ydCA9IGNvbm5lY3Rvci5nZXRQcm94eVBvcnQoKTsKKyAgICAgICAgaWYgKHByb3h5UG9ydCAhPSAwKSB7CisgICAgICAgICAgICByZXEuc2V0U2VydmVyUG9ydChwcm94eVBvcnQpOworICAgICAgICB9CisgICAgICAgIGlmIChwcm94eU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVxLnNlcnZlck5hbWUoKS5zZXRTdHJpbmcocHJveHlOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhcnNlIHNlc3Npb24gSWQKKyAgICAgICAgcGFyc2VTZXNzaW9uSWQocmVxLCByZXF1ZXN0KTsKKworICAgICAgICAvLyBVUkkgZGVjb2RpbmcKKyAgICAgICAgTWVzc2FnZUJ5dGVzIGRlY29kZWRVUkkgPSByZXEuZGVjb2RlZFVSSSgpOworICAgICAgICBkZWNvZGVkVVJJLmR1cGxpY2F0ZShyZXEucmVxdWVzdFVSSSgpKTsKKworICAgICAgICBpZiAoZGVjb2RlZFVSSS5nZXRUeXBlKCkgPT0gTWVzc2FnZUJ5dGVzLlRfQllURVMpIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgcGF0aCBwYXJhbWV0ZXJzCisgICAgICAgICAgICBCeXRlQ2h1bmsgdXJpQkIgPSBkZWNvZGVkVVJJLmdldEJ5dGVDaHVuaygpOworICAgICAgICAgICAgaW50IHNlbWljb2xvbiA9IHVyaUJCLmluZGV4T2YoJzsnLCAwKTsKKyAgICAgICAgICAgIGlmIChzZW1pY29sb24gPiAwKSB7CisgICAgICAgICAgICAgICAgZGVjb2RlZFVSSS5zZXRCeXRlcworICAgICAgICAgICAgICAgICh1cmlCQi5nZXRCdWZmZXIoKSwgdXJpQkIuZ2V0U3RhcnQoKSwgc2VtaWNvbG9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vICV4eCBkZWNvZGluZyBvZiB0aGUgVVJMCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlcS5nZXRVUkxEZWNvZGVyKCkuY29udmVydChkZWNvZGVkVVJJLCBmYWxzZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICByZXMuc2V0U3RhdHVzKDQwMCk7CisgICAgICAgICAgICAgICAgcmVzLnNldE1lc3NhZ2UoIkludmFsaWQgVVJJOiAiICsgaW9lLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm9ybWFsaXphdGlvbgorICAgICAgICAgICAgaWYgKCFub3JtYWxpemUocmVxLmRlY29kZWRVUkkoKSkpIHsKKyAgICAgICAgICAgICAgICByZXMuc2V0U3RhdHVzKDQwMCk7CisgICAgICAgICAgICAgICAgcmVzLnNldE1lc3NhZ2UoIkludmFsaWQgVVJJIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ2hhcmFjdGVyIGRlY29kaW5nCisgICAgICAgICAgICBjb252ZXJ0VVJJKGRlY29kZWRVUkksIHJlcXVlc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhlIFVSTCBpcyBjaGFycyBvciBTdHJpbmcsIGFuZCBoYXMgYmVlbiBzZW50IHVzaW5nIGFuIGluLW1lbW9yeQorICAgICAgICAgICAgLy8gcHJvdG9jb2wgaGFuZGxlciwgd2UgaGF2ZSB0byBhc3N1bWUgdGhlIFVSTCBoYXMgYmVlbiBwcm9wZXJseQorICAgICAgICAgICAgLy8gZGVjb2RlZCBhbHJlYWR5CisgICAgICAgICAgICBkZWNvZGVkVVJJLnRvQ2hhcnMoKTsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgcGF0aCBwYXJhbWV0ZXJzCisgICAgICAgICAgICBDaGFyQ2h1bmsgdXJpQ0MgPSBkZWNvZGVkVVJJLmdldENoYXJDaHVuaygpOworICAgICAgICAgICAgaW50IHNlbWljb2xvbiA9IHVyaUNDLmluZGV4T2YoJzsnKTsKKyAgICAgICAgICAgIGlmIChzZW1pY29sb24gPiAwKSB7CisgICAgICAgICAgICAgICAgZGVjb2RlZFVSSS5zZXRDaGFycworICAgICAgICAgICAgICAgICh1cmlDQy5nZXRCdWZmZXIoKSwgdXJpQ0MuZ2V0U3RhcnQoKSwgc2VtaWNvbG9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB0aGUgcmVtb3RlIHByaW5jaXBhbAorICAgICAgICBTdHJpbmcgcHJpbmNpcGFsID0gcmVxLmdldFJlbW90ZVVzZXIoKS50b1N0cmluZygpOworICAgICAgICBpZiAocHJpbmNpcGFsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0VXNlclByaW5jaXBhbChuZXcgQ295b3RlUHJpbmNpcGFsKHByaW5jaXBhbCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHRoZSBhdXRob3JpemF0aW9uIHR5cGUKKyAgICAgICAgU3RyaW5nIGF1dGh0eXBlID0gcmVxLmdldEF1dGhUeXBlKCkudG9TdHJpbmcoKTsKKyAgICAgICAgaWYgKGF1dGh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXV0aFR5cGUoYXV0aHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVxdWVzdCBtYXBwaW5nLgorICAgICAgICBNZXNzYWdlQnl0ZXMgc2VydmVyTmFtZTsKKyAgICAgICAgaWYgKGNvbm5lY3Rvci5nZXRVc2VJUFZIb3N0cygpKSB7CisgICAgICAgICAgICBzZXJ2ZXJOYW1lID0gcmVxLmxvY2FsTmFtZSgpOworICAgICAgICAgICAgaWYgKHNlcnZlck5hbWUuaXNOdWxsKCkpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZWxsLCB0aGV5IGRpZCBhc2sgZm9yIGl0CisgICAgICAgICAgICAgICAgcmVzLmFjdGlvbihBY3Rpb25Db2RlLkFDVElPTl9SRVFfTE9DQUxfTkFNRV9BVFRSSUJVVEUsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VydmVyTmFtZSA9IHJlcS5zZXJ2ZXJOYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgY29ubmVjdG9yLmdldE1hcHBlcigpLm1hcChzZXJ2ZXJOYW1lLCBkZWNvZGVkVVJJLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldE1hcHBpbmdEYXRhKCkpOworICAgICAgICByZXF1ZXN0LnNldENvbnRleHQoKENvbnRleHQpIHJlcXVlc3QuZ2V0TWFwcGluZ0RhdGEoKS5jb250ZXh0KTsKKyAgICAgICAgcmVxdWVzdC5zZXRXcmFwcGVyKChXcmFwcGVyKSByZXF1ZXN0LmdldE1hcHBpbmdEYXRhKCkud3JhcHBlcik7CisKKyAgICAgICAgLy8gRmlsdGVyIHRyYWNlIG1ldGhvZAorICAgICAgICBpZiAoIWNvbm5lY3Rvci5nZXRBbGxvd1RyYWNlKCkgCisgICAgICAgICAgICAgICAgJiYgcmVxLm1ldGhvZCgpLmVxdWFsc0lnbm9yZUNhc2UoIlRSQUNFIikpIHsKKyAgICAgICAgICAgIFdyYXBwZXIgd3JhcHBlciA9IHJlcXVlc3QuZ2V0V3JhcHBlcigpOworICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9IG51bGw7CisgICAgICAgICAgICBpZiAod3JhcHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gbWV0aG9kcyA9IHdyYXBwZXIuZ2V0U2VydmxldE1ldGhvZHMoKTsKKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIlRSQUNFIi5lcXVhbHMobWV0aG9kc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IG1ldGhvZHNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciArPSAiLCAiICsgbWV0aG9kc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICByZXMuc2V0U3RhdHVzKDQwNSk7CisgICAgICAgICAgICByZXMuYWRkSGVhZGVyKCJBbGxvdyIsIGhlYWRlcik7CisgICAgICAgICAgICByZXMuc2V0TWVzc2FnZSgiVFJBQ0UgbWV0aG9kIGlzIG5vdCBhbGxvd2VkIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBQb3NzaWJsZSByZWRpcmVjdAorICAgICAgICBNZXNzYWdlQnl0ZXMgcmVkaXJlY3RQYXRoTUIgPSByZXF1ZXN0LmdldE1hcHBpbmdEYXRhKCkucmVkaXJlY3RQYXRoOworICAgICAgICBpZiAoIXJlZGlyZWN0UGF0aE1CLmlzTnVsbCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVkaXJlY3RQYXRoID0gcmVkaXJlY3RQYXRoTUIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0LmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3Qgb3B0aW1hbCwgYnV0IGFzIHRoaXMgaXMgbm90IHZlcnkgY29tbW9uLCBpdAorICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCBtYXR0ZXIKKyAgICAgICAgICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFBhdGggKyAiO2pzZXNzaW9uaWQ9IiAKKyAgICAgICAgICAgICAgICAgICAgKyByZXF1ZXN0LmdldFJlcXVlc3RlZFNlc3Npb25JZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBvcHRpbWFsLCBidXQgYXMgdGhpcyBpcyBub3QgdmVyeSBjb21tb24sIGl0CisgICAgICAgICAgICAgICAgLy8gc2hvdWxkbid0IG1hdHRlcgorICAgICAgICAgICAgICAgIHJlZGlyZWN0UGF0aCA9IHJlZGlyZWN0UGF0aCArICI/IiArIHF1ZXJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KHJlZGlyZWN0UGF0aCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJzZSBzZXNzaW9uIElkCisgICAgICAgIHBhcnNlU2Vzc2lvbkNvb2tpZXNJZChyZXEsIHJlcXVlc3QpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFyc2Ugc2Vzc2lvbiBpZCBpbiBVUkwuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VTZXNzaW9uSWQob3JnLmFwYWNoZS5jb3lvdGUuUmVxdWVzdCByZXEsIFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIEJ5dGVDaHVuayB1cmlCQyA9IHJlcS5yZXF1ZXN0VVJJKCkuZ2V0Qnl0ZUNodW5rKCk7CisgICAgICAgIGludCBzZW1pY29sb24gPSB1cmlCQy5pbmRleE9mKG1hdGNoLCAwLCBtYXRjaC5sZW5ndGgoKSwgMCk7CisKKyAgICAgICAgaWYgKHNlbWljb2xvbiA+IDApIHsKKworICAgICAgICAgICAgLy8gUGFyc2Ugc2Vzc2lvbiBJRCwgYW5kIGV4dHJhY3QgaXQgZnJvbSB0aGUgZGVjb2RlZCByZXF1ZXN0IFVSSQorICAgICAgICAgICAgaW50IHN0YXJ0ID0gdXJpQkMuZ2V0U3RhcnQoKTsKKyAgICAgICAgICAgIGludCBlbmQgPSB1cmlCQy5nZXRFbmQoKTsKKworICAgICAgICAgICAgaW50IHNlc3Npb25JZFN0YXJ0ID0gc2VtaWNvbG9uICsgbWF0Y2gubGVuZ3RoKCk7CisgICAgICAgICAgICBpbnQgc2VtaWNvbG9uMiA9IHVyaUJDLmluZGV4T2YoJzsnLCBzZXNzaW9uSWRTdGFydCk7CisgICAgICAgICAgICBpZiAoc2VtaWNvbG9uMiA+PSAwKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0ZWRTZXNzaW9uSWQKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBTdHJpbmcodXJpQkMuZ2V0QnVmZmVyKCksIHN0YXJ0ICsgc2Vzc2lvbklkU3RhcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWljb2xvbjIgLSBzZXNzaW9uSWRTdGFydCkpOworICAgICAgICAgICAgICAgIC8vIEV4dHJhY3Qgc2Vzc2lvbiBJRCBmcm9tIHJlcXVlc3QgVVJJCisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IHVyaUJDLmdldEJ1ZmZlcigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQgLSBzZW1pY29sb24yOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmW3N0YXJ0ICsgc2VtaWNvbG9uICsgaV0gCisgICAgICAgICAgICAgICAgICAgICAgICA9IGJ1ZltzdGFydCArIGkgKyBzZW1pY29sb24yXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXJpQkMuc2V0Qnl0ZXMoYnVmLCBzdGFydCwgZW5kIC0gc3RhcnQgLSBzZW1pY29sb24yICsgc2VtaWNvbG9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0ZWRTZXNzaW9uSWQKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBTdHJpbmcodXJpQkMuZ2V0QnVmZmVyKCksIHN0YXJ0ICsgc2Vzc2lvbklkU3RhcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbmQgLSBzdGFydCkgLSBzZXNzaW9uSWRTdGFydCkpOworICAgICAgICAgICAgICAgIHVyaUJDLnNldEVuZChzdGFydCArIHNlbWljb2xvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RlZFNlc3Npb25VUkwodHJ1ZSk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdGVkU2Vzc2lvbklkKG51bGwpOworICAgICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0ZWRTZXNzaW9uVVJMKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBzZXNzaW9uIGlkIGluIFVSTC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZVNlc3Npb25Db29raWVzSWQob3JnLmFwYWNoZS5jb3lvdGUuUmVxdWVzdCByZXEsIFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIC8vIFBhcnNlIHNlc3Npb24gaWQgZnJvbSBjb29raWVzCisgICAgICAgIENvb2tpZXMgc2VydmVyQ29va2llcyA9IHJlcS5nZXRDb29raWVzKCk7CisgICAgICAgIGludCBjb3VudCA9IHNlcnZlckNvb2tpZXMuZ2V0Q29va2llQ291bnQoKTsKKyAgICAgICAgaWYgKGNvdW50IDw9IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBTZXJ2ZXJDb29raWUgc2Nvb2tpZSA9IHNlcnZlckNvb2tpZXMuZ2V0Q29va2llKGkpOworICAgICAgICAgICAgaWYgKHNjb29raWUuZ2V0TmFtZSgpLmVxdWFscyhHbG9iYWxzLlNFU1NJT05fQ09PS0lFX05BTUUpKSB7CisgICAgICAgICAgICAgICAgLy8gT3ZlcnJpZGUgYW55dGhpbmcgcmVxdWVzdGVkIGluIHRoZSBVUkwKKyAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3QuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tQ29va2llKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWNjZXB0IG9ubHkgdGhlIGZpcnN0IHNlc3Npb24gaWQgY29va2llCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRNQihzY29va2llLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RlZFNlc3Npb25JZAorICAgICAgICAgICAgICAgICAgICAgICAgKHNjb29raWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0ZWRTZXNzaW9uQ29va2llKHRydWUpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RlZFNlc3Npb25VUkwoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBSZXF1ZXN0ZWQgY29va2llIHNlc3Npb24gaWQgaXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1ZXN0LmlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgc2Vzc2lvbiBpZCB1bnRpbCBvbmUgaXMgdmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRNQihzY29va2llLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0ZWRTZXNzaW9uSWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2Nvb2tpZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoYXJhY3RlciBjb252ZXJzaW9uIG9mIHRoZSBVUkkuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY29udmVydFVSSShNZXNzYWdlQnl0ZXMgdXJpLCBSZXF1ZXN0IHJlcXVlc3QpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBCeXRlQ2h1bmsgYmMgPSB1cmkuZ2V0Qnl0ZUNodW5rKCk7CisgICAgICAgIENoYXJDaHVuayBjYyA9IHVyaS5nZXRDaGFyQ2h1bmsoKTsKKyAgICAgICAgY2MuYWxsb2NhdGUoYmMuZ2V0TGVuZ3RoKCksIC0xKTsKKworICAgICAgICBTdHJpbmcgZW5jID0gY29ubmVjdG9yLmdldFVSSUVuY29kaW5nKCk7CisgICAgICAgIGlmIChlbmMgIT0gbnVsbCkgeworICAgICAgICAgICAgQjJDQ29udmVydGVyIGNvbnYgPSByZXF1ZXN0LmdldFVSSUNvbnZlcnRlcigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoY29udiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnYgPSBuZXcgQjJDQ29udmVydGVyKGVuYyk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0VVJJQ29udmVydGVyKGNvbnYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnYucmVjeWNsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkludmFsaWQgVVJJIGVuY29kaW5nOyB1c2luZyBIVFRQIGRlZmF1bHQiKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0b3Iuc2V0VVJJRW5jb2RpbmcobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29udiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29udi5jb252ZXJ0KGJjLCBjYyk7CisgICAgICAgICAgICAgICAgICAgIHVyaS5zZXRDaGFycyhjYy5nZXRCdWZmZXIoKSwgY2MuZ2V0U3RhcnQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy5nZXRMZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiSW52YWxpZCBVUkkgY2hhcmFjdGVyIGVuY29kaW5nOyB0cnlpbmcgYXNjaWkiKTsKKyAgICAgICAgICAgICAgICAgICAgY2MucmVjeWNsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIERlZmF1bHQgZW5jb2Rpbmc6IGZhc3QgY29udmVyc2lvbgorICAgICAgICBieXRlW10gYmJ1ZiA9IGJjLmdldEJ1ZmZlcigpOworICAgICAgICBjaGFyW10gY2J1ZiA9IGNjLmdldEJ1ZmZlcigpOworICAgICAgICBpbnQgc3RhcnQgPSBiYy5nZXRTdGFydCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJjLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGNidWZbaV0gPSAoY2hhcikgKGJidWZbaSArIHN0YXJ0XSAmIDB4ZmYpOworICAgICAgICB9CisgICAgICAgIHVyaS5zZXRDaGFycyhjYnVmLCAwLCBiYy5nZXRMZW5ndGgoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoYXJhY3RlciBjb252ZXJzaW9uIG9mIHRoZSBhIFVTLUFTQ0lJIE1lc3NhZ2VCeXRlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjb252ZXJ0TUIoTWVzc2FnZUJ5dGVzIG1iKSB7CisKKyAgICAgICAgLy8gVGhpcyBpcyBvZiBjb3Vyc2Ugb25seSBtZWFuaW5nZnVsIGZvciBieXRlcworICAgICAgICBpZiAobWIuZ2V0VHlwZSgpICE9IE1lc3NhZ2VCeXRlcy5UX0JZVEVTKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgQnl0ZUNodW5rIGJjID0gbWIuZ2V0Qnl0ZUNodW5rKCk7CisgICAgICAgIENoYXJDaHVuayBjYyA9IG1iLmdldENoYXJDaHVuaygpOworICAgICAgICBjYy5hbGxvY2F0ZShiYy5nZXRMZW5ndGgoKSwgLTEpOworCisgICAgICAgIC8vIERlZmF1bHQgZW5jb2Rpbmc6IGZhc3QgY29udmVyc2lvbgorICAgICAgICBieXRlW10gYmJ1ZiA9IGJjLmdldEJ1ZmZlcigpOworICAgICAgICBjaGFyW10gY2J1ZiA9IGNjLmdldEJ1ZmZlcigpOworICAgICAgICBpbnQgc3RhcnQgPSBiYy5nZXRTdGFydCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJjLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGNidWZbaV0gPSAoY2hhcikgKGJidWZbaSArIHN0YXJ0XSAmIDB4ZmYpOworICAgICAgICB9CisgICAgICAgIG1iLnNldENoYXJzKGNidWYsIDAsIGJjLmdldExlbmd0aCgpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTm9ybWFsaXplIFVSSS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBub3JtYWxpemVzICJcIiwgIi8vIiwgIi8uLyIgYW5kICIvLi4vIi4gVGhpcyBtZXRob2Qgd2lsbAorICAgICAqIHJldHVybiBmYWxzZSB3aGVuIHRyeWluZyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgb3IgaWYgdGhlIFVSSSBjb250YWlucworICAgICAqIGEgbnVsbCBieXRlLgorICAgICAqIAorICAgICAqIEBwYXJhbSB1cmlNQiBVUkkgdG8gYmUgbm9ybWFsaXplZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBub3JtYWxpemUoTWVzc2FnZUJ5dGVzIHVyaU1CKSB7CisKKyAgICAgICAgQnl0ZUNodW5rIHVyaUJDID0gdXJpTUIuZ2V0Qnl0ZUNodW5rKCk7CisgICAgICAgIGJ5dGVbXSBiID0gdXJpQkMuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgaW50IHN0YXJ0ID0gdXJpQkMuZ2V0U3RhcnQoKTsKKyAgICAgICAgaW50IGVuZCA9IHVyaUJDLmdldEVuZCgpOworCisgICAgICAgIC8vIFVSTCAqIGlzIGFjY2VwdGFibGUKKyAgICAgICAgaWYgKChlbmQgLSBzdGFydCA9PSAxKSAmJiBiW3N0YXJ0XSA9PSAoYnl0ZSkgJyonKQorICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICBpbnQgaW5kZXggPSAwOworCisgICAgICAgIC8vIFJlcGxhY2UgJ1wnIHdpdGggJy8nCisgICAgICAgIC8vIENoZWNrIGZvciBudWxsIGJ5dGUKKyAgICAgICAgZm9yIChwb3MgPSBzdGFydDsgcG9zIDwgZW5kOyBwb3MrKykgeworICAgICAgICAgICAgaWYgKGJbcG9zXSA9PSAoYnl0ZSkgJ1xcJykgeworICAgICAgICAgICAgICAgIGlmIChBTExPV19CQUNLU0xBU0gpIHsKKyAgICAgICAgICAgICAgICAgICAgYltwb3NdID0gKGJ5dGUpICcvJzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJbcG9zXSA9PSAoYnl0ZSkgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgVVJMIG11c3Qgc3RhcnQgd2l0aCAnLycKKyAgICAgICAgaWYgKGJbc3RhcnRdICE9IChieXRlKSAnLycpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcGxhY2UgIi8vIiB3aXRoICIvIgorICAgICAgICBmb3IgKHBvcyA9IHN0YXJ0OyBwb3MgPCAoZW5kIC0gMSk7IHBvcysrKSB7CisgICAgICAgICAgICBpZiAoYltwb3NdID09IChieXRlKSAnLycpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKHBvcyArIDEgPCBlbmQpICYmIChiW3BvcyArIDFdID09IChieXRlKSAnLycpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvcHlCeXRlcyhiLCBwb3MsIHBvcyArIDEsIGVuZCAtIHBvcyAtIDEpOworICAgICAgICAgICAgICAgICAgICBlbmQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgVVJJIGVuZHMgd2l0aCAiLy4iIG9yICIvLi4iLCB0aGVuIHdlIGFwcGVuZCBhbiBleHRyYSAiLyIKKyAgICAgICAgLy8gTm90ZTogSXQgaXMgcG9zc2libGUgdG8gZXh0ZW5kIHRoZSBVUkkgYnkgMSB3aXRob3V0IGFueSBzaWRlIGVmZmVjdAorICAgICAgICAvLyBhcyB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgYSBub24tc2lnbmlmaWNhbnQgV1MuCisgICAgICAgIGlmICgoKGVuZCAtIHN0YXJ0KSA+PSAyKSAmJiAoYltlbmQgLSAxXSA9PSAoYnl0ZSkgJy4nKSkgeworICAgICAgICAgICAgaWYgKChiW2VuZCAtIDJdID09IChieXRlKSAnLycpIAorICAgICAgICAgICAgICAgIHx8ICgoYltlbmQgLSAyXSA9PSAoYnl0ZSkgJy4nKSAKKyAgICAgICAgICAgICAgICAgICAgJiYgKGJbZW5kIC0gM10gPT0gKGJ5dGUpICcvJykpKSB7CisgICAgICAgICAgICAgICAgYltlbmRdID0gKGJ5dGUpICcvJzsKKyAgICAgICAgICAgICAgICBlbmQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHVyaUJDLnNldEVuZChlbmQpOworCisgICAgICAgIGluZGV4ID0gMDsKKworICAgICAgICAvLyBSZXNvbHZlIG9jY3VycmVuY2VzIG9mICIvLi8iIGluIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGluZGV4ID0gdXJpQkMuaW5kZXhPZigiLy4vIiwgMCwgMywgaW5kZXgpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvcHlCeXRlcyhiLCBzdGFydCArIGluZGV4LCBzdGFydCArIGluZGV4ICsgMiwgCisgICAgICAgICAgICAgICAgICAgICAgZW5kIC0gc3RhcnQgLSBpbmRleCAtIDIpOworICAgICAgICAgICAgZW5kID0gZW5kIC0gMjsKKyAgICAgICAgICAgIHVyaUJDLnNldEVuZChlbmQpOworICAgICAgICB9CisKKyAgICAgICAgaW5kZXggPSAwOworCisgICAgICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8uLi8iIGluIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGluZGV4ID0gdXJpQkMuaW5kZXhPZigiLy4uLyIsIDAsIDQsIGluZGV4KTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBQcmV2ZW50IGZyb20gZ29pbmcgb3V0c2lkZSBvdXIgY29udGV4dAorICAgICAgICAgICAgaWYgKGluZGV4ID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaW50IGluZGV4MiA9IC0xOworICAgICAgICAgICAgZm9yIChwb3MgPSBzdGFydCArIGluZGV4IC0gMTsgKHBvcyA+PSAwKSAmJiAoaW5kZXgyIDwgMCk7IHBvcyAtLSkgeworICAgICAgICAgICAgICAgIGlmIChiW3Bvc10gPT0gKGJ5dGUpICcvJykgeworICAgICAgICAgICAgICAgICAgICBpbmRleDIgPSBwb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29weUJ5dGVzKGIsIHN0YXJ0ICsgaW5kZXgyLCBzdGFydCArIGluZGV4ICsgMywKKyAgICAgICAgICAgICAgICAgICAgICBlbmQgLSBzdGFydCAtIGluZGV4IC0gMyk7CisgICAgICAgICAgICBlbmQgPSBlbmQgKyBpbmRleDIgLSBpbmRleCAtIDM7CisgICAgICAgICAgICB1cmlCQy5zZXRFbmQoZW5kKTsKKyAgICAgICAgICAgIGluZGV4ID0gaW5kZXgyOworICAgICAgICB9CisKKyAgICAgICAgdXJpQkMuc2V0Qnl0ZXMoYiwgc3RhcnQsIGVuZCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDb3B5IGFuIGFycmF5IG9mIGJ5dGVzIHRvIGEgZGlmZmVyZW50IHBvc2l0aW9uLiBVc2VkIGR1cmluZyAKKyAgICAgKiBub3JtYWxpemF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBjb3B5Qnl0ZXMoYnl0ZVtdIGIsIGludCBkZXN0LCBpbnQgc3JjLCBpbnQgbGVuKSB7CisgICAgICAgIGZvciAoaW50IHBvcyA9IDA7IHBvcyA8IGxlbjsgcG9zKyspIHsKKyAgICAgICAgICAgIGJbcG9zICsgZGVzdF0gPSBiW3BvcyArIHNyY107CisgICAgICAgIH0KKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db3lvdGVJbnB1dFN0cmVhbS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db3lvdGVJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MWM4NjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NveW90ZUlucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldElucHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zZWN1cml0eS5TZWN1cml0eVV0aWw7CisKKy8qKgorICogVGhpcyBjbGFzcyBoYW5kbGVzIHJlYWRpbmcgYnl0ZXMuCisgKiAKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEBhdXRob3IgSmVhbi1GcmFuY29pcyBBcmNhbmQKKyAqLworcHVibGljIGNsYXNzIENveW90ZUlucHV0U3RyZWFtCisgICAgZXh0ZW5kcyBTZXJ2bGV0SW5wdXRTdHJlYW0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgcHJvdGVjdGVkIElucHV0QnVmZmVyIGliOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgcHJvdGVjdGVkIENveW90ZUlucHV0U3RyZWFtKElucHV0QnVmZmVyIGliKSB7CisgICAgICAgIHRoaXMuaWIgPSBpYjsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDbGVhciBmYWNhZGUuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgaWIgPSBudWxsOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByZXZlbnQgY2xvbmluZyB0aGUgZmFjYWRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgY2xvbmUoKQorICAgICAgICB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXJ2bGV0SW5wdXRTdHJlYW0gTWV0aG9kcworCisKKyAgICBwdWJsaWMgaW50IHJlYWQoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geyAgICAKKyAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKXsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgICAgIEludGVnZXIgcmVzdWx0ID0gCisgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKXsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9ueworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGludGVnZXIgPSBuZXcgSW50ZWdlcihpYi5yZWFkQnl0ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludGVnZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5pbnRWYWx1ZSgpOworICAgICAgICAgICAgfSBjYXRjaChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHBhZSl7CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBwYWUuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbil7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbillOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gaWIucmVhZEJ5dGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSl7CisgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgSW50ZWdlciByZXN1bHQgPSAKKyAgICAgICAgICAgICAgICAgICAgKEludGVnZXIpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb257CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgaW50ZWdlciA9IG5ldyBJbnRlZ2VyKGliLmF2YWlsYWJsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludGVnZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5pbnRWYWx1ZSgpOworICAgICAgICAgICAgfSBjYXRjaChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHBhZSl7CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBwYWUuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbil7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbillOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIHJldHVybiBpYi5hdmFpbGFibGUoKTsKKyAgICAgICAgfSAgICAKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWQoZmluYWwgYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpeworICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgICAgIEludGVnZXIgcmVzdWx0ID0gCisgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKXsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9ueworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGludGVnZXIgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKGliLnJlYWQoYiwgMCwgYi5sZW5ndGgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludGVnZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5pbnRWYWx1ZSgpOworICAgICAgICAgICAgfSBjYXRjaChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHBhZSl7CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBwYWUuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbil7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbillOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gaWIucmVhZChiLCAwLCBiLmxlbmd0aCk7CisgICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgcmVhZChmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG9mZiwgZmluYWwgaW50IGxlbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpeworICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgICAgIEludGVnZXIgcmVzdWx0ID0gCisgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKXsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9ueworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGludGVnZXIgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKGliLnJlYWQoYiwgb2ZmLCBsZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludGVnZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5pbnRWYWx1ZSgpOworICAgICAgICAgICAgfSBjYXRjaChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHBhZSl7CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBwYWUuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbil7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbillOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gaWIucmVhZChiLCBvZmYsIGxlbik7CisgICAgICAgIH0gICAgICAgICAgICAKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgcmVhZExpbmUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzdXBlci5yZWFkTGluZShiLCBvZmYsIGxlbik7CisgICAgfQorCisKKyAgICAvKiogCisgICAgICogQ2xvc2UgdGhlIHN0cmVhbQorICAgICAqIFNpbmNlIHdlIHJlLWN5Y2xlLCB3ZSBjYW4ndCBhbGxvdyB0aGUgY2FsbCB0byBzdXBlci5jbG9zZSgpCisgICAgICogd2hpY2ggd291bGQgcGVybWFudGVseSBkaXNhYmxlIHVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSl7CisgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCl7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9ueworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGliLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gY2F0Y2goUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwYWUpeworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gcGFlLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24peworICAgICAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIGliLmNsb3NlKCk7CisgICAgICAgIH0gICAgICAgICAgICAKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ295b3RlT3V0cHV0U3RyZWFtLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NveW90ZU91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNGJlZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NveW90ZU91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW07CisKKy8qKgorICogQ295b3RlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2bGV0IG91dHB1dCBzdHJlYW0uCisgKiAKKyAqIEBhdXRob3IgQ29zdGluIE1hbm9sYWNoZQorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICovCitwdWJsaWMgY2xhc3MgQ295b3RlT3V0cHV0U3RyZWFtIAorICAgIGV4dGVuZHMgU2VydmxldE91dHB1dFN0cmVhbSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICBwcm90ZWN0ZWQgT3V0cHV0QnVmZmVyIG9iOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgcHJvdGVjdGVkIENveW90ZU91dHB1dFN0cmVhbShPdXRwdXRCdWZmZXIgb2IpIHsKKyAgICAgICAgdGhpcy5vYiA9IG9iOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByZXZlbnQgY2xvbmluZyB0aGUgZmFjYWRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgY2xvbmUoKQorICAgICAgICB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDbGVhciBmYWNhZGUuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgb2IgPSBudWxsOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE91dHB1dFN0cmVhbSBNZXRob2RzCisKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBpKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvYi53cml0ZUJ5dGUoaSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGUoYiwgMCwgYi5sZW5ndGgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG9iLndyaXRlKGIsIG9mZiwgbGVuKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdpbGwgc2VuZCB0aGUgYnVmZmVyIHRvIHRoZSBjbGllbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmx1c2goKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvYi5mbHVzaCgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvYi5jbG9zZSgpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VydmxldE91dHB1dFN0cmVhbSBNZXRob2RzCisKKworICAgIHB1YmxpYyB2b2lkIHByaW50KFN0cmluZyBzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvYi53cml0ZShzKTsKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NveW90ZVByaW5jaXBhbC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db3lvdGVQcmluY2lwYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTEwOTAwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db3lvdGVQcmluY2lwYWwuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CisKKy8qKgorICogR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPmphdmEuc2VjdXJpdHkuUHJpbmNpcGFsPC9zdHJvbmc+IHRoYXQKKyAqIGlzIHVzZWQgdG8gcmVwcmVzZW50IHByaW5jaXBhbHMgYXV0aGVudGljYXRlZCBhdCB0aGUgcHJvdG9jb2wgaGFuZGxlciBsZXZlbC4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb3lvdGVQcmluY2lwYWwgCisgICAgaW1wbGVtZW50cyBQcmluY2lwYWwgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgcHVibGljIENveW90ZVByaW5jaXBhbChTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlcm5hbWUgb2YgdGhlIHVzZXIgcmVwcmVzZW50ZWQgYnkgdGhpcyBQcmluY2lwYWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm5hbWUpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdCwgd2hpY2ggZXhwb3NlcyBvbmx5CisgICAgICogaW5mb3JtYXRpb24gdGhhdCBzaG91bGQgYmUgcHVibGljLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiQ295b3RlUHJpbmNpcGFsWyIpOworICAgICAgICBzYi5hcHBlbmQodGhpcy5uYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db3lvdGVSZWFkZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ295b3RlUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1ODRlOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ295b3RlUmVhZGVyLmphdmEKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisKKy8qKgorICogQ295b3RlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBidWZmcmVkIHJlYWRlci4KKyAqIAorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICovCitwdWJsaWMgY2xhc3MgQ295b3RlUmVhZGVyCisgICAgZXh0ZW5kcyBCdWZmZXJlZFJlYWRlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gTElORV9TRVAgPSB7ICdccicsICdcbicgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0xJTkVfTEVOR1RIID0gNDA5NjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIHByb3RlY3RlZCBJbnB1dEJ1ZmZlciBpYjsKKworCisgICAgcHJvdGVjdGVkIGNoYXJbXSBsaW5lQnVmZmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIHB1YmxpYyBDb3lvdGVSZWFkZXIoSW5wdXRCdWZmZXIgaWIpIHsKKyAgICAgICAgc3VwZXIoaWIsIDEpOworICAgICAgICB0aGlzLmliID0gaWI7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJldmVudCBjbG9uaW5nIHRoZSBmYWNhZGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBjbG9uZSgpCisgICAgICAgIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENsZWFyIGZhY2FkZS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICBpYiA9IG51bGw7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVhZGVyIE1ldGhvZHMKKworCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpYi5jbG9zZSgpOworICAgIH0KKworCisgICAgcHVibGljIGludCByZWFkKCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGliLnJlYWQoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgcmVhZChjaGFyW10gY2J1ZikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGliLnJlYWQoY2J1ZiwgMCwgY2J1Zi5sZW5ndGgpOworICAgIH0KKworCisgICAgcHVibGljIGludCByZWFkKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gaWIucmVhZChjYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisKKyAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGliLnNraXAobik7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiByZWFkeSgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBpYi5yZWFkeSgpOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWIubWFyayhyZWFkQWhlYWRMaW1pdCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGliLnJlc2V0KCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIHJlYWRMaW5lKCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobGluZUJ1ZmZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBsaW5lQnVmZmVyID0gbmV3IGNoYXJbTUFYX0xJTkVfTEVOR1RIXTsKKyAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7CisKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIGludCBlbmQgPSAtMTsKKyAgICAgICAgaW50IHNraXAgPSAtMTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGFnZ3JlZ2F0b3IgPSBudWxsOworICAgICAgICB3aGlsZSAoZW5kIDwgMCkgeworICAgICAgICAgICAgbWFyayhNQVhfTElORV9MRU5HVEgpOworICAgICAgICAgICAgd2hpbGUgKChwb3MgPCBNQVhfTElORV9MRU5HVEgpICYmIChlbmQgPCAwKSkgeworICAgICAgICAgICAgICAgIGludCBuUmVhZCA9IHJlYWQobGluZUJ1ZmZlciwgcG9zLCBNQVhfTElORV9MRU5HVEggLSBwb3MpOworICAgICAgICAgICAgICAgIGlmIChuUmVhZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbmQgPSBwb3M7CisgICAgICAgICAgICAgICAgICAgIHNraXAgPSBwb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBwb3M7IChpIDwgKHBvcyArIG5SZWFkKSkgJiYgKGVuZCA8IDApOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVCdWZmZXJbaV0gPT0gTElORV9TRVBbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gaSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIG5leHRjaGFyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gKHBvcyArIG5SZWFkIC0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Y2hhciA9IChjaGFyKSByZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRjaGFyID0gbGluZUJ1ZmZlcltpKzFdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRjaGFyID09IExJTkVfU0VQWzFdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmVCdWZmZXJbaV0gPT0gTElORV9TRVBbMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gaSArIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5SZWFkID4gMCkgeworICAgICAgICAgICAgICAgICAgICBwb3MgKz0gblJlYWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVuZCA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoYWdncmVnYXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0b3IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFnZ3JlZ2F0b3IuYXBwZW5kKGxpbmVCdWZmZXIpOworICAgICAgICAgICAgICAgIHBvcyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICAgICAgc2tpcChza2lwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChhZ2dyZWdhdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTdHJpbmcobGluZUJ1ZmZlciwgMCwgZW5kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFnZ3JlZ2F0b3IuYXBwZW5kKGxpbmVCdWZmZXIsIDAsIGVuZCk7CisgICAgICAgICAgICByZXN1bHQgPSBhZ2dyZWdhdG9yLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ295b3RlV3JpdGVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NveW90ZVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxM2YyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NveW90ZVdyaXRlci5qYXZhCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworLyoqCisgKiBDb3lvdGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcnZsZXQgd3JpdGVyLgorICogCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKi8KK3B1YmxpYyBjbGFzcyBDb3lvdGVXcml0ZXIKKyAgICBleHRlbmRzIFByaW50V3JpdGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBMSU5FX1NFUCA9IHsgJ1xyJywgJ1xuJyB9OworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgcHJvdGVjdGVkIE91dHB1dEJ1ZmZlciBvYjsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcnJvciA9IGZhbHNlOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgcHVibGljIENveW90ZVdyaXRlcihPdXRwdXRCdWZmZXIgb2IpIHsKKyAgICAgICAgc3VwZXIob2IpOworICAgICAgICB0aGlzLm9iID0gb2I7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJldmVudCBjbG9uaW5nIHRoZSBmYWNhZGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBjbG9uZSgpCisgICAgICAgIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENsZWFyIGZhY2FkZS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICBvYiA9IG51bGw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWN5Y2xlLgorICAgICAqLworICAgIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAgICAgZXJyb3IgPSBmYWxzZTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXcml0ZXIgTWV0aG9kcworCisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKKworICAgICAgICBpZiAoZXJyb3IpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9iLmZsdXNoKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKworICAgICAgICAvLyBXZSBkb24ndCBjbG9zZSB0aGUgUHJpbnRXcml0ZXIgLSBzdXBlcigpIGlzIG5vdCBjYWxsZWQsCisgICAgICAgIC8vIHNvIHRoZSBzdHJlYW0gY2FuIGJlIHJldXNlZC4gV2UgY2xvc2Ugb2IuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICBlcnJvciA9IGZhbHNlOworCisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0Vycm9yKCkgeworICAgICAgICBmbHVzaCgpOworICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYykgeworCisgICAgICAgIGlmIChlcnJvcikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2Iud3JpdGUoYyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShjaGFyIGJ1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisKKyAgICAgICAgaWYgKGVycm9yKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYi53cml0ZShidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgYnVmW10pIHsKKwl3cml0ZShidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHMsIGludCBvZmYsIGludCBsZW4pIHsKKworICAgICAgICBpZiAoZXJyb3IpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9iLndyaXRlKHMsIG9mZiwgbGVuKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzKSB7CisgICAgICAgIHdyaXRlKHMsIDAsIHMubGVuZ3RoKCkpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcmludFdyaXRlciBNZXRob2RzCisKKworICAgIHB1YmxpYyB2b2lkIHByaW50KGJvb2xlYW4gYikgeworICAgICAgICBpZiAoYikgeworICAgICAgICAgICAgd3JpdGUoInRydWUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlKCJmYWxzZSIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChjaGFyIGMpIHsKKyAgICAgICAgd3JpdGUoYyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChpbnQgaSkgeworICAgICAgICB3cml0ZShTdHJpbmcudmFsdWVPZihpKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChsb25nIGwpIHsKKyAgICAgICAgd3JpdGUoU3RyaW5nLnZhbHVlT2YobCkpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcHJpbnQoZmxvYXQgZikgeworICAgICAgICB3cml0ZShTdHJpbmcudmFsdWVPZihmKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChkb3VibGUgZCkgeworICAgICAgICB3cml0ZShTdHJpbmcudmFsdWVPZihkKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChjaGFyIHNbXSkgeworICAgICAgICB3cml0ZShzKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHByaW50KFN0cmluZyBzKSB7CisgICAgICAgIGlmIChzID09IG51bGwpIHsKKyAgICAgICAgICAgIHMgPSAibnVsbCI7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGUocyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChPYmplY3Qgb2JqKSB7CisgICAgICAgIHdyaXRlKFN0cmluZy52YWx1ZU9mKG9iaikpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcHJpbnRsbigpIHsKKyAgICAgICAgd3JpdGUoTElORV9TRVApOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihib29sZWFuIGIpIHsKKyAgICAgICAgcHJpbnQoYik7CisgICAgICAgIHByaW50bG4oKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oY2hhciBjKSB7CisgICAgICAgIHByaW50KGMpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGludCBpKSB7CisgICAgICAgIHByaW50KGkpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGxvbmcgbCkgeworICAgICAgICBwcmludChsKTsKKyAgICAgICAgcHJpbnRsbigpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihmbG9hdCBmKSB7CisgICAgICAgIHByaW50KGYpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGRvdWJsZSBkKSB7CisgICAgICAgIHByaW50KGQpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGNoYXIgY1tdKSB7CisgICAgICAgIHByaW50KGMpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKFN0cmluZyBzKSB7CisgICAgICAgIHByaW50KHMpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKE9iamVjdCBvKSB7CisgICAgICAgIHByaW50KG8pOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvSW5wdXRCdWZmZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvSW5wdXRCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzM1N2ZjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9JbnB1dEJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsNDc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zZWN1cml0eS5TZWN1cml0eVV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jb3lvdGUuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5CMkNDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuQnl0ZUNodW5rOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLkNoYXJDaHVuazsKKworCisvKioKKyAqIFRoZSBidWZmZXIgdXNlZCBieSBUb21jYXQgcmVxdWVzdC4gVGhpcyBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIFRvbWNhdCAzLjMKKyAqIE91dHB1dEJ1ZmZlciwgYWRhcHRlZCB0byBoYW5kbGUgaW5wdXQgaW5zdGVhZCBvZiBvdXRwdXQuIFRoaXMgYWxsb3dzIAorICogY29tcGxldGUgcmVjeWNsaW5nIG9mIHRoZSBmYWNhZGUgb2JqZWN0cyAodGhlIFNlcnZsZXRJbnB1dFN0cmVhbSBhbmQgdGhlCisgKiBCdWZmZXJlZFJlYWRlcikuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICovCitwdWJsaWMgY2xhc3MgSW5wdXRCdWZmZXIgZXh0ZW5kcyBSZWFkZXIKKyAgICBpbXBsZW1lbnRzIEJ5dGVDaHVuay5CeXRlSW5wdXRDaGFubmVsLCBDaGFyQ2h1bmsuQ2hhcklucHV0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgIENoYXJDaHVuay5DaGFyT3V0cHV0Q2hhbm5lbCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VOQ09ESU5HID0gCisgICAgICAgIG9yZy5hcGFjaGUuY295b3RlLkNvbnN0YW50cy5ERUZBVUxUX0NIQVJBQ1RFUl9FTkNPRElORzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gOCoxMDI0OworCisgICAgLy8gVGhlIGJ1ZmZlciBjYW4gYmUgdXNlZCBmb3IgYnl0ZVtdIGFuZCBjaGFyW10gcmVhZGluZworICAgIC8vICggdGhpcyBpcyBuZWVkZWQgdG8gc3VwcG9ydCBTZXJ2bGV0SW5wdXRTdHJlYW0gYW5kIEJ1ZmZlcmVkUmVhZGVyICkKKyAgICBwdWJsaWMgZmluYWwgaW50IElOSVRJQUxfU1RBVEUgPSAwOworICAgIHB1YmxpYyBmaW5hbCBpbnQgQ0hBUl9TVEFURSA9IDE7CisgICAgcHVibGljIGZpbmFsIGludCBCWVRFX1NUQVRFID0gMjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBieXRlIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJ5dGVDaHVuayBiYjsKKworCisgICAgLyoqCisgICAgICogVGhlIGNodW5rIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIENoYXJDaHVuayBjYjsKKworCisgICAgLyoqCisgICAgICogU3RhdGUgb2YgdGhlIG91dHB1dCBidWZmZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc3RhdGUgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBGbGFnIHdoaWNoIGluZGljYXRlcyBpZiB0aGUgaW5wdXQgYnVmZmVyIGlzIGNsb3NlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEVuY29kaW5nIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlbmM7CisKKworICAgIC8qKgorICAgICAqIEVuY29kZXIgaXMgc2V0LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBnb3RFbmMgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogTGlzdCBvZiBlbmNvZGVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCBlbmNvZGVycyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIEN1cnJlbnQgYnl0ZSB0byBjaGFyIGNvbnZlcnRlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQjJDQ29udmVydGVyIGNvbnY7CisKKworICAgIC8qKgorICAgICAqIEFzc29jaWF0ZWQgQ295b3RlIHJlcXVlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBSZXF1ZXN0IGNveW90ZVJlcXVlc3Q7CisKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtYXJrUG9zID0gLTE7CisKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBzaXplLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHNpemUgPSAtMTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuIEFsbG9jYXRlIHRoZSBidWZmZXIgd2l0aCB0aGUgZGVmYXVsdCBidWZmZXIgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRCdWZmZXIoKSB7CisKKyAgICAgICAgdGhpcyhERUZBVUxUX0JVRkZFUl9TSVpFKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWx0ZXJuYXRlIGNvbnN0cnVjdG9yIHdoaWNoIGFsbG93cyBzcGVjaWZ5aW5nIHRoZSBpbml0aWFsIGJ1ZmZlciBzaXplLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzaXplIEJ1ZmZlciBzaXplIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyBJbnB1dEJ1ZmZlcihpbnQgc2l6ZSkgeworCisgICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7CisgICAgICAgIGJiID0gbmV3IEJ5dGVDaHVuayhzaXplKTsKKyAgICAgICAgYmIuc2V0TGltaXQoc2l6ZSk7CisgICAgICAgIGJiLnNldEJ5dGVJbnB1dENoYW5uZWwodGhpcyk7CisgICAgICAgIGNiID0gbmV3IENoYXJDaHVuayhzaXplKTsKKyAgICAgICAgY2Iuc2V0TGltaXQoc2l6ZSk7CisgICAgICAgIGNiLnNldE9wdGltaXplZFdyaXRlKGZhbHNlKTsKKyAgICAgICAgY2Iuc2V0Q2hhcklucHV0Q2hhbm5lbCh0aGlzKTsKKyAgICAgICAgY2Iuc2V0Q2hhck91dHB1dENoYW5uZWwodGhpcyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVkIENveW90ZSByZXF1ZXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb3lvdGVSZXF1ZXN0IEFzc29jaWF0ZWQgQ295b3RlIHJlcXVlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KFJlcXVlc3QgY295b3RlUmVxdWVzdCkgeworICAgICAgICB0aGlzLmNveW90ZVJlcXVlc3QgPSBjb3lvdGVSZXF1ZXN0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IGFzc29jaWF0ZWQgQ295b3RlIHJlcXVlc3QuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCBDb3lvdGUgcmVxdWVzdAorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0IGdldFJlcXVlc3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNveW90ZVJlcXVlc3Q7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVjeWNsZSB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgeworICAgICAgICAKKyAgICAgICAgc3RhdGUgPSBJTklUSUFMX1NUQVRFOworICAgICAgICAKKyAgICAgICAgLy8gSWYgdXNhZ2Ugb2YgbWFyayBtYWRlIHRoZSBidWZmZXIgdG9vIGJpZywgcmVhbGxvY2F0ZSBpdAorICAgICAgICBpZiAoY2IuZ2V0Q2hhcnMoKS5sZW5ndGggPiBzaXplKSB7CisgICAgICAgICAgICBjYiA9IG5ldyBDaGFyQ2h1bmsoc2l6ZSk7CisgICAgICAgICAgICBjYi5zZXRMaW1pdChzaXplKTsKKyAgICAgICAgICAgIGNiLnNldE9wdGltaXplZFdyaXRlKGZhbHNlKTsKKyAgICAgICAgICAgIGNiLnNldENoYXJJbnB1dENoYW5uZWwodGhpcyk7CisgICAgICAgICAgICBjYi5zZXRDaGFyT3V0cHV0Q2hhbm5lbCh0aGlzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNiLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICBtYXJrUG9zID0gLTE7CisgICAgICAgIGJiLnJlY3ljbGUoKTsgCisgICAgICAgIGNsb3NlZCA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgaWYgKGNvbnYgIT0gbnVsbCkgeworICAgICAgICAgICAgY29udi5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGdvdEVuYyA9IGZhbHNlOworICAgICAgICBlbmMgPSBudWxsOworICAgICAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBpbnB1dCBidWZmZXIuCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBBbiB1bmRlcmx5aW5nIElPRXhjZXB0aW9uIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjbG9zZWQgPSB0cnVlOworICAgIH0KKworCisgICAgcHVibGljIGludCBhdmFpbGFibGUoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdGUgPT0gQllURV9TVEFURSkgeworICAgICAgICAgICAgcmV0dXJuIGJiLmdldExlbmd0aCgpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IENIQVJfU1RBVEUpIHsKKyAgICAgICAgICAgIHJldHVybiBjYi5nZXRMZW5ndGgoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJ5dGVzIEhhbmRsaW5nIE1ldGhvZHMKKworCisgICAgLyoqIAorICAgICAqIFJlYWRzIG5ldyBieXRlcyBpbiB0aGUgYnl0ZSBjaHVuay4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2J1ZiBCeXRlIGJ1ZmZlciB0byBiZSB3cml0dGVuIHRvIHRoZSByZXNwb25zZQorICAgICAqIEBwYXJhbSBvZmYgT2Zmc2V0CisgICAgICogQHBhcmFtIGxlbiBMZW5ndGgKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIEFuIHVuZGVybHlpbmcgSU9FeGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWxSZWFkQnl0ZXMoYnl0ZSBjYnVmW10sIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGNsb3NlZCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGNveW90ZVJlcXVlc3QgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBzdGF0ZSA9IEJZVEVfU1RBVEU7CisKKyAgICAgICAgaW50IHJlc3VsdCA9IGNveW90ZVJlcXVlc3QuZG9SZWFkKGJiKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IHJlYWRCeXRlKCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGJiLnN1YnN0cmFjdCgpOworICAgIH0KKworCisgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gYmIuc3Vic3RyYWN0KGIsIG9mZiwgbGVuKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2hhcnMgSGFuZGxpbmcgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTaW5jZSB0aGUgY29udmVydGVyIHdpbGwgdXNlIGFwcGVuZCwgaXQgaXMgcG9zc2libGUgdG8gZ2V0IGNoYXJzIHRvCisgICAgICogYmUgcmVtb3ZlZCBmcm9tIHRoZSBidWZmZXIgZm9yICJ3cml0aW5nIi4gU2luY2UgdGhlIGNoYXJzIGhhdmUgYWxyZWFkeQorICAgICAqIGJlZW4gcmVhZCBiZWZvcmUsIHRoZXkgYXJlIGlnbm9yZWQuIElmIGEgbWFyayB3YXMgc2V0LCB0aGVuIHRoZQorICAgICAqIG1hcmsgaXMgbG9zdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFsV3JpdGVDaGFycyhjaGFyIGNbXSwgaW50IG9mZiwgaW50IGxlbikgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG1hcmtQb3MgPSAtMTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBzKSB7CisgICAgICAgIGVuYyA9IHM7CisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IHJlYWxSZWFkQ2hhcnMoY2hhciBjYnVmW10sIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCFnb3RFbmMpCisgICAgICAgICAgICBzZXRDb252ZXJ0ZXIoKTsKKworICAgICAgICBpZiAoYmIuZ2V0TGVuZ3RoKCkgPD0gMCkgeworICAgICAgICAgICAgaW50IG5SZWFkID0gcmVhbFJlYWRCeXRlcyhiYi5nZXRCeXRlcygpLCAwLCBiYi5nZXRCeXRlcygpLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoblJlYWQgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hcmtQb3MgPT0gLTEpIHsKKyAgICAgICAgICAgIGNiLnNldE9mZnNldCgwKTsKKyAgICAgICAgICAgIGNiLnNldEVuZCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBsaW1pdCA9IGJiLmdldExlbmd0aCgpK2NiLmdldFN0YXJ0KCk7CisgICAgICAgIGlmKCBjYi5nZXRMaW1pdCgpIDwgbGltaXQgKSAKKyAgICAgICAgICAgIGNiLnNldExpbWl0KGxpbWl0KTsKKyAgICAgICAgY29udi5jb252ZXJ0KGJiLCBjYik7CisgICAgICAgIGJiLnNldE9mZnNldChiYi5nZXRFbmQoKSk7CisgICAgICAgIHN0YXRlID0gQ0hBUl9TVEFURTsKKworICAgICAgICByZXR1cm4gY2IuZ2V0TGVuZ3RoKCk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgcmVhZCgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjYi5zdWJzdHJhY3QoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgcmVhZChjaGFyW10gY2J1ZikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlYWQoY2J1ZiwgMCwgY2J1Zi5sZW5ndGgpOworICAgIH0KKworCisgICAgcHVibGljIGludCByZWFkKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gY2Iuc3Vic3RyYWN0KGNidWYsIG9mZiwgbGVuKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBuKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBuUmVhZCA9IDA7CisgICAgICAgIHdoaWxlIChuUmVhZCA8IG4pIHsKKyAgICAgICAgICAgIGlmIChjYi5nZXRMZW5ndGgoKSA+PSBuKSB7CisgICAgICAgICAgICAgICAgY2Iuc2V0T2Zmc2V0KGNiLmdldFN0YXJ0KCkgKyAoaW50KSBuKTsKKyAgICAgICAgICAgICAgICBuUmVhZCA9IG47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5SZWFkICs9IGNiLmdldExlbmd0aCgpOworICAgICAgICAgICAgICAgIGNiLnNldE9mZnNldChjYi5nZXRFbmQoKSk7CisgICAgICAgICAgICAgICAgaW50IHRvUmVhZCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGNiLmdldENoYXJzKCkubGVuZ3RoIDwgKG4gLSBuUmVhZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9SZWFkID0gY2IuZ2V0Q2hhcnMoKS5sZW5ndGg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdG9SZWFkID0gKGludCkgKG4gLSBuUmVhZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuYiA9IHJlYWxSZWFkQ2hhcnMoY2IuZ2V0Q2hhcnMoKSwgMCwgdG9SZWFkKTsKKyAgICAgICAgICAgICAgICBpZiAobmIgPCAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuUmVhZDsKKworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gcmVhZHkoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gKGNiLmdldExlbmd0aCgpID4gMCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoY2IuZ2V0TGVuZ3RoKCkgPD0gMCkgeworICAgICAgICAgICAgY2Iuc2V0T2Zmc2V0KDApOworICAgICAgICAgICAgY2Iuc2V0RW5kKDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChjYi5nZXRCdWZmZXIoKS5sZW5ndGggPiAoMiAqIHNpemUpKSAKKyAgICAgICAgICAgICAgICAmJiAoY2IuZ2V0TGVuZ3RoKCkpIDwgKGNiLmdldFN0YXJ0KCkpKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjYi5nZXRCdWZmZXIoKSwgY2IuZ2V0U3RhcnQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYi5nZXRCdWZmZXIoKSwgMCwgY2IuZ2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGNiLnNldEVuZChjYi5nZXRMZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgY2Iuc2V0T2Zmc2V0KDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludCBvZmZzZXQgPSByZWFkQWhlYWRMaW1pdDsKKyAgICAgICAgaWYgKG9mZnNldCA8IHNpemUpIHsKKyAgICAgICAgICAgIG9mZnNldCA9IHNpemU7CisgICAgICAgIH0KKyAgICAgICAgY2Iuc2V0TGltaXQoY2IuZ2V0U3RhcnQoKSArIG9mZnNldCk7CisgICAgICAgIG1hcmtQb3MgPSBjYi5nZXRTdGFydCgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVzZXQoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdGUgPT0gQ0hBUl9TVEFURSkgeworICAgICAgICAgICAgaWYgKG1hcmtQb3MgPCAwKSB7CisgICAgICAgICAgICAgICAgY2IucmVjeWNsZSgpOworICAgICAgICAgICAgICAgIG1hcmtQb3MgPSAtMTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2Iuc2V0T2Zmc2V0KG1hcmtQb3MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmIucmVjeWNsZSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBjaGVja0NvbnZlcnRlcigpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmICghZ290RW5jKQorICAgICAgICAgICAgc2V0Q29udmVydGVyKCk7CisKKyAgICB9CisKKworICAgIHByb3RlY3RlZCB2b2lkIHNldENvbnZlcnRlcigpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGNveW90ZVJlcXVlc3QgIT0gbnVsbCkKKyAgICAgICAgICAgIGVuYyA9IGNveW90ZVJlcXVlc3QuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTsKKworICAgICAgICBnb3RFbmMgPSB0cnVlOworICAgICAgICBpZiAoZW5jID09IG51bGwpCisgICAgICAgICAgICBlbmMgPSBERUZBVUxUX0VOQ09ESU5HOworICAgICAgICBjb252ID0gKEIyQ0NvbnZlcnRlcikgZW5jb2RlcnMuZ2V0KGVuYyk7CisgICAgICAgIGlmIChjb252ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSl7CisgICAgICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgICAgICAgICBjb252ID0gKEIyQ0NvbnZlcnRlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9ueworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCMkNDb252ZXJ0ZXIoZW5jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICApOyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfWNhdGNoKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSA9IGV4LmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKWU7IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udiA9IG5ldyBCMkNDb252ZXJ0ZXIoZW5jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuY29kZXJzLnB1dChlbmMsIGNvbnYpOworICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiM2JhMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2NSBAQAorCisjCisjIENveW90ZUNvbm5lY3RvcgorIworCitjb3lvdGVDb25uZWN0b3IuYWxyZWFkeUluaXRpYWxpemVkPVRoZSBjb25uZWN0b3IgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZAorY295b3RlQ29ubmVjdG9yLmFscmVhZHlTdGFydGVkPVRoZSBjb25uZWN0b3IgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCitjb3lvdGVDb25uZWN0b3IuY2Fubm90UmVnaXN0ZXJQcm90b2NvbD1DYW5ub3QgcmVnaXN0ZXIgTUJlYW4gZm9yIHRoZSBQcm90b2NvbAorY295b3RlQ29ubmVjdG9yLm5vdFN0YXJ0ZWQ9Q295b3RlIGNvbm5lY3RvciBoYXMgbm90IGJlZW4gc3RhcnRlZAorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlckRlc3Ryb3lGYWlsZWQ9UHJvdG9jb2wgaGFuZGxlciBkZXN0cm95IGZhaWxlZDogezB9Citjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVySW5pdGlhbGl6YXRpb25GYWlsZWQ9UHJvdG9jb2wgaGFuZGxlciBpbml0aWFsaXphdGlvbiBmYWlsZWQ6IHswfQorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlckluc3RhbnRpYXRpb25GYWlsZWQ9UHJvdG9jb2wgaGFuZGxlciBpbnN0YW50aWF0aW9uIGZhaWxlZDogezB9Citjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVyU3RhcnRGYWlsZWQ9UHJvdG9jb2wgaGFuZGxlciBzdGFydCBmYWlsZWQ6IHswfQorY295b3RlQ29ubmVjdG9yLnByb3RvY29sUmVnaXN0cmF0aW9uRmFpbGVkPVByb3RvY29sIEpNWCByZWdpc3RyYXRpb24gZmFpbGVkCitjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVyUGF1c2VGYWlsZWQ9UHJvdG9jb2wgaGFuZGxlciBwYXVzZSBmYWlsZWQKK2NveW90ZUNvbm5lY3Rvci5wcm90b2NvbEhhbmRsZXJSZXN1bWVGYWlsZWQ9UHJvdG9jb2wgaGFuZGxlciByZXN1bWUgZmFpbGVkCitjb3lvdGVDb25uZWN0b3IuTWFwcGVyUmVnaXN0cmF0aW9uPXJlZ2lzdGVyIE1hcHBlcjogezB9Citjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xVbnJlZ2lzdHJhdGlvbkZhaWxlZD1Qcm90b2NvbCBoYW5kbGVyIHN0b3AgZmFpbGVkCisKKworIworIyBDb3lvdGVBZGFwdGVyCisjCisKK2NveW90ZUFkYXB0ZXIuc2VydmljZT1BbiBleGNlcHRpb24gb3IgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGNvbnRhaW5lciBkdXJpbmcgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZworCisjCisjIENveW90ZVJlc3BvbnNlCisjCisKK2NveW90ZVJlc3BvbnNlLmdldE91dHB1dFN0cmVhbS5pc2U9Z2V0V3JpdGVyKCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIHRoaXMgcmVzcG9uc2UKK2NveW90ZVJlc3BvbnNlLmdldFdyaXRlci5pc2U9Z2V0T3V0cHV0U3RyZWFtKCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIHRoaXMgcmVzcG9uc2UKK2NveW90ZVJlc3BvbnNlLnJlc2V0QnVmZmVyLmlzZT1DYW5ub3QgcmVzZXQgYnVmZmVyIGFmdGVyIHJlc3BvbnNlIGhhcyBiZWVuIGNvbW1pdHRlZAorY295b3RlUmVzcG9uc2Uuc2VuZEVycm9yLmlzZT1DYW5ub3QgY2FsbCBzZW5kRXJyb3IoKSBhZnRlciB0aGUgcmVzcG9uc2UgaGFzIGJlZW4gY29tbWl0dGVkCitjb3lvdGVSZXNwb25zZS5zZW5kUmVkaXJlY3QuaXNlPUNhbm5vdCBjYWxsIHNlbmRSZWRpcmVjdCgpIGFmdGVyIHRoZSByZXNwb25zZSBoYXMgYmVlbiBjb21taXR0ZWQKK2NveW90ZVJlc3BvbnNlLnNldEJ1ZmZlclNpemUuaXNlPUNhbm5vdCBjaGFuZ2UgYnVmZmVyIHNpemUgYWZ0ZXIgZGF0YSBoYXMgYmVlbiB3cml0dGVuCisKKyMKKyMgQ295b3RlUmVxdWVzdAorIworCitjb3lvdGVSZXF1ZXN0LmdldElucHV0U3RyZWFtLmlzZT1nZXRSZWFkZXIoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXF1ZXN0Citjb3lvdGVSZXF1ZXN0LmdldFJlYWRlci5pc2U9Z2V0SW5wdXRTdHJlYW0oKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXF1ZXN0Citjb3lvdGVSZXF1ZXN0LnNlc3Npb25DcmVhdGVDb21taXR0ZWQ9Q2Fubm90IGNyZWF0ZSBhIHNlc3Npb24gYWZ0ZXIgdGhlIHJlc3BvbnNlIGhhcyBiZWVuIGNvbW1pdHRlZAorY295b3RlUmVxdWVzdC5zZXRBdHRyaWJ1dGUubmFtZW51bGw9Q2Fubm90IGNhbGwgc2V0QXR0cmlidXRlIHdpdGggYSBudWxsIG5hbWUKK2NveW90ZVJlcXVlc3QubGlzdGVuZXJTdGFydD1FeGNlcHRpb24gc2VuZGluZyBjb250ZXh0IGluaXRpYWxpemVkIGV2ZW50IHRvIGxpc3RlbmVyIGluc3RhbmNlIG9mIGNsYXNzIHswfQorY295b3RlUmVxdWVzdC5saXN0ZW5lclN0b3A9RXhjZXB0aW9uIHNlbmRpbmcgY29udGV4dCBkZXN0cm95ZWQgZXZlbnQgdG8gbGlzdGVuZXIgaW5zdGFuY2Ugb2YgY2xhc3MgezB9Citjb3lvdGVSZXF1ZXN0LmF0dHJpYnV0ZUV2ZW50PUV4Y2VwdGlvbiB0aHJvd24gYnkgYXR0cmlidXRlcyBldmVudCBsaXN0ZW5lcgorY295b3RlUmVxdWVzdC5wYXJzZVBhcmFtZXRlcnM9RXhjZXB0aW9uIHRocm93biB3aGlsc3QgcHJvY2Vzc2luZyBQT1NUZWQgcGFyYW1ldGVycworY295b3RlUmVxdWVzdC5wb3N0VG9vTGFyZ2U9UGFyYW1ldGVycyB3ZXJlIG5vdCBwYXJzZWQgYmVjYXVzZSB0aGUgc2l6ZSBvZiB0aGUgcG9zdGVkIGRhdGEgd2FzIHRvbyBiaWcuIFVzZSB0aGUgbWF4UG9zdFNpemUgYXR0cmlidXRlIG9mIHRoZSBjb25uZWN0b3IgdG8gcmVzb2x2ZSB0aGlzIGlmIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgYWNjZXB0IGxhcmdlIFBPU1RzLgorcmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdD1OdWxsIHJlcXVlc3Qgb2JqZWN0CityZXNwb25zZUZhY2FkZS5udWxsUmVzcG9uc2U9TnVsbCByZXNwb25zZSBvYmplY3QKKworIworIyBNYXBwZXJMaXN0ZW5lcgorIworbWFwcGVyTGlzdGVuZXIudW5rbm93bkRlZmF1bHRIb3N0PVVua25vd24gZGVmYXVsdCBob3N0OiB7MH0KK21hcHBlckxpc3RlbmVyLnJlZ2lzdGVySG9zdD1SZWdpc3RlciBob3N0IHswfSBhdCBkb21haW4gezF9CittYXBwZXJMaXN0ZW5lci51bnJlZ2lzdGVySG9zdD1VbnJlZ2lzdGVyIGhvc3QgezB9IGF0IGRvbWFpbiB7MX0KK21hcHBlckxpc3RlbmVyLnJlZ2lzdGVyQ29udGV4dD1SZWdpc3RlciBDb250ZXh0IHswfSAKK21hcHBlckxpc3RlbmVyLnVucmVnaXN0ZXJDb250ZXh0PVVucmVnaXN0ZXIgQ29udGV4dCB7MH0KK21hcHBlckxpc3RlbmVyLnJlZ2lzdGVyV3JhcHBlcj1SZWdpc3RlciBXcmFwcGVyIHswfSBpbiBDb250ZXh0IHsxfQorCisKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjYTRiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1NiBAQAorCisjCisjIENveW90ZUNvbm5lY3RvcgorIworCitjb3lvdGVDb25uZWN0b3IuYWxyZWFkeUluaXRpYWxpemVkPVlhIGhhIHNpZG8gaW5pY2lhbGl6YWRvIGVsIGNvbmVjdG9yCitjb3lvdGVDb25uZWN0b3IuYWxyZWFkeVN0YXJ0ZWQ9WWEgaGEgc2lkbyBhcnJhbmNhZG8gZWwgY29uZWN0b3IKK2NveW90ZUNvbm5lY3Rvci5jYW5ub3RSZWdpc3RlclByb3RvY29sPU5vIHB1ZWRvIHJlZ2lzdHJhciBNQmVhbiBwYXJhIGVsIFByb3RvY29sbworY295b3RlQ29ubmVjdG9yLm5vdFN0YXJ0ZWQ9RWwgY29uZWN0b3IgQ295b3RlIG5vIGhhIHNpZG8gYXJyYW5jYWRvCitjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVyRGVzdHJveUZhaWxlZD1GYWxs8yBsYSBkZXN0cnVjY2nzbiBkZWwgbWFuZWphZG9yIGRlIHByb3RvY29sbzogezB9Citjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVySW5pdGlhbGl6YXRpb25GYWlsZWQ9RmFsbPMgbGEgaW5pY2lhbGl6YWNp824gZGVsIG1hbmVqYWRvciBkZSBwcm90b2NvbG86IHswfQorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlckluc3RhbnRpYXRpb25GYWlsZWQ9RmFsbPMgbGEgaW5zdGFuY2lhY2nzbiBkZWwgbWFuZWphZG9yIGRlIHByb3RvY29sbzogezB9Citjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVyU3RhcnRGYWlsZWQ9RmFsbPMgZWwgYXJyYW5xdWUgZGVsIG1hbmVqYWRvciBkZSBwcm90b2NvbG86IHswfQorY295b3RlQ29ubmVjdG9yLnByb3RvY29sUmVnaXN0cmF0aW9uRmFpbGVkPUZhbGzzIGVsIHJlZ2lzdHJvIGRlIEpNWAorCisjCisjIENveW90ZUFkYXB0ZXIKKyMKKworY295b3RlQWRhcHRlci5zZXJ2aWNlPUhhIHRlbmlkbyBsdWdhciB1bmEgZXhjZXBjafNuIG8gZXJyb3IgZW4gZWwgY29udGVuZWRvciBkdXJhbnRlIGVsIHByb2Nlc2FtaWVudG8gZGVsIHJlcXVlcmltaWVudG8KKworIworIyBDb3lvdGVSZXNwb25zZQorIworCitjb3lvdGVSZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0uaXNlPWdldFdyaXRlcigpIHlhIGhhIHNpZG8gbGxhbWFkbyBwYXJhIGVzdGEgcmVzcHVlc3RhCitjb3lvdGVSZXNwb25zZS5nZXRXcml0ZXIuaXNlPWdldE91dHB1dFN0cmVhbSgpIHlhIGhhIHNpZG8gbGxhbWFkbyBwYXJhIGVzdGEgcmVzcHVlc3RhCitjb3lvdGVSZXNwb25zZS5yZXNldEJ1ZmZlci5pc2U9Tm8gcHVlZG8gbGltcGlhciBlbCBi+mZlciBkZXNwdelzIGRlIHF1ZSBsYSByZXB1ZXN0YSBoYSBzaWRvIGxsZXZhZGEgYSBjYWJvCitjb3lvdGVSZXNwb25zZS5zZW5kRXJyb3IuaXNlPU5vIHB1ZWRvIGxsYW1hciBhIHNlbmRFcnJvcigpIHRyYXMgbGxldmFyIGEgY2FibyBsYSByZXNwdWVzdGEKK2NveW90ZVJlc3BvbnNlLnNlbmRSZWRpcmVjdC5pc2U9Tm8gcHVlZG8gbGxhbWFyIGEgc2VuZFJlZGlyZWN0KCkgdHJhcyBsbGV2YXIgYSBjYWJvIGxhIHJlc3B1ZXN0YQorY295b3RlUmVzcG9uc2Uuc2V0QnVmZmVyU2l6ZS5pc2U9Tm8gcHVlZG8gY2FtYmlhciBsYSBtZWRpZGEgZGVsIGL6ZmVyIHRyYXMgZXNjcmliaXIgbG9zIGRhdG9zCisKKyMKKyMgQ295b3RlUmVxdWVzdAorIworCitjb3lvdGVSZXF1ZXN0LmdldElucHV0U3RyZWFtLmlzZT1nZXRSZWFkZXIoKSB5YSBoYSBzaWRvIGxsYW1hZG8gcGFyYSBlc3RlIHJlcXVlcmltaWVudG8KK2NveW90ZVJlcXVlc3QuZ2V0UmVhZGVyLmlzZT1nZXRJbnB1dFN0cmVhbSgpIHlhIGhhIHNpZG8gbGxhbWFkbyBwYXJhIGVzdGUgcmVxdWVyaW1pZW50bworY295b3RlUmVxdWVzdC5zZXNzaW9uQ3JlYXRlQ29tbWl0dGVkPU5vIHB1ZWRvIGNyZWFyIHVuYSBzZXNp824gZGVzcHXpcyBkZSBsbGV2YXIgYSBjYWJvIGxhIHJlc3B1ZXRhCitjb3lvdGVSZXF1ZXN0LnNldEF0dHJpYnV0ZS5uYW1lbnVsbD1ObyBwdWRlbyBsbGFtYXIgYSBzZXRBdHRyaWJ1dGUgY29uIHVuIG5vbWJyZSBudWxvCitjb3lvdGVSZXF1ZXN0Lmxpc3RlbmVyU3RhcnQ9RXhjZXBjafNuIGVudmlhbmRvIGV2ZW50byBpbmljaWFsaXphZG8gZGUgY29udGV4dG8gYSBpbnN0YW5jaWEgZGUgZXNjdWNoYWRvciBkZSBjbGFzZSB7MH0KK2NveW90ZVJlcXVlc3QubGlzdGVuZXJTdG9wPUV4Y2VwY2nzbiBlbnZpYW5kbyBldmVudG8gZGVzdHJ17WRvIGRlIGNvbnRleHRvIGEgaW5zdGFuY2lhIGRlIGVzY3VjaGFkb3IgZGUgY2xhc2UgezB9Citjb3lvdGVSZXF1ZXN0LmF0dHJpYnV0ZUV2ZW50PUV4Y2VwY2nzbiBsYW56YWRhIG1lZGlhbnRlIGVsIGVzY3VjaGFkb3IgZGUgZXZlbnRvcyBkZSBhdHJpYnV0b3MKK2NveW90ZVJlcXVlc3QucG9zdFRvb0xhcmdlPU5vIHNlIGFuYWxpemFyb24gbG9zIHBhcuFtZXRyb3MgcG9ycXVlIGxhIG1lZGlkYSBkZSBsb3MgZGF0b3MgZW52aWFkb3MgZXJhIGRlbWFzaWFkbyBncmFuZGUuIFVzYSBlbCBhdHJpYnV0byBtYXhQb3N0U2l6ZSBkZWwgY29uZWN0b3IgcGFyYSByZXNvbHZlciBlc3RvIGVuIGNhc28gZGUgcXVlIGxhIGFwbGljYWNp824gZGViaWVyYSBkZSBhY2VwdGFyIFBPU1RzIG3hcyBncmFuZGVzLgorCisKKyMKKyMgTWFwcGVyTGlzdGVuZXIKKyMKKworbWFwcGVyTGlzdGVuZXIucmVnaXN0ZXJDb250ZXh0PVJlZ2lzdHJhciBDb250ZXh0byB7MH0KK21hcHBlckxpc3RlbmVyLnVucmVnaXN0ZXJDb250ZXh0PURlc3JlZ2lzdHJhciBDb250ZXh0byB7MH0KK21hcHBlckxpc3RlbmVyLnJlZ2lzdGVyV3JhcHBlcj1SZWdpc3RyYXIgQXJyb3BhZG9yIChXcmFwcGVyKSB7MH0gZW4gQ29udGV4dG8gezF9CisKKworCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjkwNThkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpAQCAtMCwwICsxLDU4IEBACisKKyMKKyMgQ295b3RlQ29ubmVjdG9yCisjCisKK2NveW90ZUNvbm5lY3Rvci5hbHJlYWR5SW5pdGlhbGl6ZWQ9TGUgY29ubmVjdGV1ciBhIGTpauAg6XTpIGluaXRpYWxpc+kKK2NveW90ZUNvbm5lY3Rvci5hbHJlYWR5U3RhcnRlZD1MZSBjb25uZWN0ZXVyIGEgZOlq4CDpdOkgZOltYXJy6QorY295b3RlQ29ubmVjdG9yLmNhbm5vdFJlZ2lzdGVyUHJvdG9jb2w9SW1wb3NzaWJsZSBkJydlbnJlZ2lzdHJlciBsZSBNQmVhbiBwb3VyIGxlIFByb3RvY29sCitjb3lvdGVDb25uZWN0b3Iubm90U3RhcnRlZD1MZSBjb25uZWN0ZXVyIENveW90ZSBuJydhIHBhcyDpdOkgZOltYXJy6QorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlckRlc3Ryb3lGYWlsZWQ9TGEgZGVzdHJ1Y3Rpb24gZHUgZ2VzdGlvbm5haXJlIGRlIHByb3RvY29sZSBhIOljaG916WU6IHswfQorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlckluaXRpYWxpemF0aW9uRmFpbGVkPUwnJ2luaXRpYWxpc2F0aW9uIGR1IGdlc3Rpb25uYWlyZSBkZSBwcm90b2NvbGUgYSDpY2hvdek6IHswfQorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlckluc3RhbnRpYXRpb25GYWlsZWQ9TCcnaW5zdGFudGlhdGlvbiBkdSBnZXN0aW9ubmFpcmUgZGUgcHJvdG9jb2xlIGEg6WNob3XpOiB7MH0KK2NveW90ZUNvbm5lY3Rvci5wcm90b2NvbEhhbmRsZXJTdGFydEZhaWxlZD1MZSBk6W1hcnJhZ2UgZHUgZ2VzdGlvbm5haXJlIGRlIHByb3RvY29sZSBhIOljaG916TogezB9Citjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xSZWdpc3RyYXRpb25GYWlsZWQ9TCcnZW5yZWdpc3RyZW1lbnQgZHUgcHJvdG9jb2wgSk1YIGEg6WNob3XpCitjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVyUGF1c2VGYWlsZWQ9TGEgc3VzcGVuc2lvbiBkdSBnZXN0aW9ubmFpcmUgZGUgcHJvdG9jb2xlIGEg6WNob3XpZQorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlclJlc3VtZUZhaWxlZD1MZSByZWTpbWFycmFnZSBkdSBnZXN0aW9ubmFpcmUgZGUgcHJvdG9jb2xlIGEg6WNob3XpCisKKyMKKyMgQ295b3RlQWRhcHRlcgorIworCitjb3lvdGVBZGFwdGVyLnNlcnZpY2U9VW5lIGV4Y2VwdGlvbiBvdSB1bmUgZXJyZXVyIHMnJ2VzdCBwcm9kdWl0ZSBkYW5zIGxlIGNvbnRlbmV1ciBkdXJhbnQgbGUgdHJhaXRlbWVudCBkZSBsYSByZXF16nRlCisKKyMKKyMgQ295b3RlUmVzcG9uc2UKKyMKKworY295b3RlUmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtLmlzZT0iZ2V0V3JpdGVyKCkiIGEgZOlq4CDpdOkgYXBwZWzpIHBvdXIgY2V0dGUgculwb25zZQorY295b3RlUmVzcG9uc2UuZ2V0V3JpdGVyLmlzZT0iZ2V0T3V0cHV0U3RyZWFtKCkiIGEgZOlq4CDpdOkgYXBwZWzpIHBvdXIgY2V0dGUgculwb25zZQorY295b3RlUmVzcG9uc2UucmVzZXRCdWZmZXIuaXNlPUltcG9zc2libGUgZGUgcmVtZXR0cmUg4CB66XJvIGxlIHRhbXBvbiBhcHLocyBxdWUgbGEgculwb25zZSBhaXQg6XTpIGVudm956WUKK2NveW90ZVJlc3BvbnNlLnNlbmRFcnJvci5pc2U9SW1wb3NzaWJsZSBkJydhcHBlbGVyICJzZW5kRXJyb3IoKSIgYXBy6HMgcXVlIGxhIHLpcG9uc2UgYWl0IOl06SBlbnZveellCitjb3lvdGVSZXNwb25zZS5zZW5kUmVkaXJlY3QuaXNlPUltcG9zc2libGUgZCcnYXBwZWxlciAic2VuZFJlZGlyZWN0KCkiIGFwcuhzIHF1ZSBsYSBy6XBvbnNlIGFpdCDpdOkgZW52b3npZQorY295b3RlUmVzcG9uc2Uuc2V0QnVmZmVyU2l6ZS5pc2U9SW1wb3NzaWJsZSBkZSBjaGFuZ2VyIGxhIHRhaWxsZSBkdSB0YW1wb24gYXBy6HMgcXVlIGxlcyBkb25u6WVzIGFpZW50IOl06SDpY3JpdGVzCisKKyMKKyMgQ295b3RlUmVxdWVzdAorIworCitjb3lvdGVSZXF1ZXN0LmdldElucHV0U3RyZWFtLmlzZT0iZ2V0UmVhZGVyKCkiIGEgZOlq4CDpdOkgYXBwZWzpIHBvdXIgY2V0dGUgcmVxdep0ZQorY295b3RlUmVxdWVzdC5nZXRSZWFkZXIuaXNlPSJnZXRJbnB1dFN0cmVhbSgpIiBhIGTpauAg6XTpIGFwcGVs6SBwb3VyIGNldHRlIHJlcXXqdGUKK2NveW90ZVJlcXVlc3Quc2Vzc2lvbkNyZWF0ZUNvbW1pdHRlZD1JbXBvc3NpYmxlIGRlIGNy6WVyIHVuZSBzZXNzaW9uYXBy6HMgcXVlIGxhIHLpcG9uc2UgYWl0IOl06SBlbnZveellCitjb3lvdGVSZXF1ZXN0LnNldEF0dHJpYnV0ZS5uYW1lbnVsbD1JbXBvc3NpYmxlIGQnJ2FwcGVsZXIgInNldEF0dHJpYnV0ZSIgYXZlYyB1biBub20gbnVsCitjb3lvdGVSZXF1ZXN0Lmxpc3RlbmVyU3RhcnQ9VW5lIGV4Y2VwdGlvbiBzJydlc3QgcHJvZHVpdGUgbG9ycyBkZSBsJydlbnZvaSBkZSBsJyfpduhuZW1lbnQgY29udGV4dGUgaW5pdGlhbGlz6SDgIGwnJ2luc3RhbmNlIGRlIGNsYXNzZSBkJyfpY291dGUgezB9Citjb3lvdGVSZXF1ZXN0Lmxpc3RlbmVyU3RvcD1VbmUgZXhjZXB0aW9uIHMnJ2VzdCBwcm9kdWl0ZSBsb3JzIGRlIGwnJ2Vudm9pIGRlIGwnJ+l26G5lbWVudCBjb250ZXh0ZSBk6XRydWl0IOAgbCcnaW5zdGFuY2UgZGUgY2xhc3NlIGQnJ+ljb3V0ZSB7MH0KK2NveW90ZVJlcXVlc3QuYXR0cmlidXRlRXZlbnQ9VW5lIGV4Y2VwdGlvbiBhIOl06SBsYW5j6WUgcGFyIGwnJ2luc3RhbmNlIGQnJ+ljb3V0ZSBwb3VyIGwnJ+l26G5lbWVudCBhdHRyaWJ1dHMgKGF0dHJpYnV0ZXMpCitjb3lvdGVSZXF1ZXN0LnBvc3RUb29MYXJnZT1MZXMgcGFyYW3odHJlcyBuJydvbnQgcGFzIOl06SDpdmFsdekgY2FyIGxhIHRhaWxsZSBkZXMgZG9ubullcyBwb3N06WVzIGVzdCB0cm9wIGltcG9ydGFudC4gVXRpbGlzZXogbCcnYXR0cmlidXQgbWF4UG9zdFNpemUgZHUgY29ubmVjdGV1ciBwb3VyIGNvcnJpZ2VyIGNlIHByb2Js6G1lIHNpIHZvdHJlIGFwcGxpY2F0aW9uIGRvaXQgYWNjZXB0ZXIgZGVzIFBPU1RzIGltcG9ydGFudHMuCisKKworIworIyBNYXBwZXJMaXN0ZW5lcgorIworCittYXBwZXJMaXN0ZW5lci5yZWdpc3RlckNvbnRleHQ9RW5yZWdpc3RyZW1lbnQgZHUgY29udGV4dGUgezB9CittYXBwZXJMaXN0ZW5lci51bnJlZ2lzdGVyQ29udGV4dD1E6XNlbnJlZ2lzdHJlbWVudCBkdSBjb250ZXh0ZSB7MH0KK21hcHBlckxpc3RlbmVyLnJlZ2lzdGVyV3JhcHBlcj1FbnJlZ2lzdHJlbWVudCBkZSBsJydlbnJvYmV1ciAod3JhcHBlcikgezB9IGRhbnMgbGUgY29udGV4dGUgezF9CisKKworCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjNiZDgxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpAQCAtMCwwICsxLDU4IEBACisKKyMKKyMgQ295b3RlQ29ubmVjdG9yCisjCisKK2NveW90ZUNvbm5lY3Rvci5hbHJlYWR5SW5pdGlhbGl6ZWQ9XHUzMGIzXHUzMGNkXHUzMGFmXHUzMGJmXHUzMDZmXHU2NWUyXHUzMDZiXHU1MjFkXHU2NzFmXHU1MzE2XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Citjb3lvdGVDb25uZWN0b3IuYWxyZWFkeVN0YXJ0ZWQ9XHUzMGIzXHUzMGNkXHUzMGFmXHUzMGJmXHUzMDZmXHU2NWUyXHUzMDZiXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Citjb3lvdGVDb25uZWN0b3IuY2Fubm90UmVnaXN0ZXJQcm90b2NvbD1cdTMwNWRcdTMwNmVcdTMwZDdcdTMwZWRcdTMwYzhcdTMwYjNcdTMwZWJcdTMwNmJNQmVhblx1MzA5Mlx1NzY3Ylx1OTMzMlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworY295b3RlQ29ubmVjdG9yLm5vdFN0YXJ0ZWQ9Q295b3RlXHUzMGIzXHUzMGNkXHUzMGFmXHUzMGJmXHUzMDZmXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVyRGVzdHJveUZhaWxlZD1cdTMwZDdcdTMwZWRcdTMwYzhcdTMwYjNcdTMwZWJcdTMwY2ZcdTMwZjNcdTMwYzlcdTMwZTlcdTMwNmVcdTVlYzNcdTY4YzRcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWY6IHswfQorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlckluaXRpYWxpemF0aW9uRmFpbGVkPVx1MzBkN1x1MzBlZFx1MzBjOFx1MzBiM1x1MzBlYlx1MzBjZlx1MzBmM1x1MzBjOVx1MzBlOVx1MzA2ZVx1NTIxZFx1NjcxZlx1NTMxNlx1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZjogezB9Citjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVySW5zdGFudGlhdGlvbkZhaWxlZD1cdTMwZDdcdTMwZWRcdTMwYzhcdTMwYjNcdTMwZWJcdTMwY2ZcdTMwZjNcdTMwYzlcdTMwZTlcdTMwNmVcdTMwYTRcdTMwZjNcdTMwYjlcdTMwYmZcdTMwZjNcdTMwYjlcdTUzMTZcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWY6IHswfQorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlclN0YXJ0RmFpbGVkPVx1MzBkN1x1MzBlZFx1MzBjOFx1MzBiM1x1MzBlYlx1MzBjZlx1MzBmM1x1MzBjOVx1MzBlOVx1MzA2ZVx1OGQ3N1x1NTJkNVx1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZjogezB9Citjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xSZWdpc3RyYXRpb25GYWlsZWQ9XHUzMGQ3XHUzMGVkXHUzMGM4XHUzMGIzXHUzMGViSk1YXHUzMDZlXHU3NjdiXHU5MzMyXHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVyUGF1c2VGYWlsZWQ9XHUzMGQ3XHUzMGVkXHUzMGM4XHUzMGIzXHUzMGViXHUzMGNmXHUzMGYzXHUzMGM5XHUzMGU5XHUzMDZlXHU0ZTAwXHU2NjQyXHU1MDVjXHU2YjYyXHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVyUmVzdW1lRmFpbGVkPVx1MzBkN1x1MzBlZFx1MzBjOFx1MzBiM1x1MzBlYlx1MzBjZlx1MzBmM1x1MzBjOVx1MzBlOVx1MzA2ZVx1NTE4ZFx1OTU4Ylx1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorCisjCisjIENveW90ZUFkYXB0ZXIKKyMKKworY295b3RlQWRhcHRlci5zZXJ2aWNlPVx1MzBlYVx1MzBhZlx1MzBhOFx1MzBiOVx1MzBjOFx1MzA2ZVx1NTFlNlx1NzQwNlx1NGUyZFx1MzA2Ylx1MzBiM1x1MzBjZFx1MzBhZlx1MzBiZlx1MzA2N1x1NGY4Ylx1NTkxNlx1MzA3ZVx1MzA1Zlx1MzA2Zlx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorCisjCisjIENveW90ZVJlc3BvbnNlCisjCisKK2NveW90ZVJlc3BvbnNlLmdldE91dHB1dFN0cmVhbS5pc2U9Z2V0V3JpdGVyKClcdTMwNmZcdTMwNTNcdTMwNmVcdTMwZWNcdTMwYjlcdTMwZGRcdTMwZjNcdTMwYjlcdTMwNmJcdTViZmVcdTMwNTdcdTMwNjZcdTY1ZTJcdTMwNmJcdTU0N2NcdTMwNzNcdTUxZmFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2NveW90ZVJlc3BvbnNlLmdldFdyaXRlci5pc2U9Z2V0T3V0cHV0U3RyZWFtKClcdTMwNmZcdTMwNTNcdTMwNmVcdTMwZWNcdTMwYjlcdTMwZGRcdTMwZjNcdTMwYjlcdTMwNmJcdTViZmVcdTMwNTdcdTMwNjZcdTY1ZTJcdTMwNmJcdTU0N2NcdTMwNzNcdTUxZmFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2NveW90ZVJlc3BvbnNlLnJlc2V0QnVmZmVyLmlzZT1cdTMwZWNcdTMwYjlcdTMwZGRcdTMwZjNcdTMwYjlcdTMwNGNcdTMwYjNcdTMwZGZcdTMwYzNcdTMwYzhcdTMwNTVcdTMwOGNcdTMwNWZcdTVmOGNcdTMwNjdcdTMwZDBcdTMwYzNcdTMwZDVcdTMwYTFcdTMwOTJcdTMwZWFcdTMwYmJcdTMwYzNcdTMwYzhcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2NveW90ZVJlc3BvbnNlLnNlbmRFcnJvci5pc2U9XHUzMGVjXHUzMGI5XHUzMGRkXHUzMGYzXHUzMGI5XHUzMDRjXHUzMGIzXHUzMGRmXHUzMGMzXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDVmXHU1ZjhjXHUzMDY3c2VuZEVycm9yKClcdTMwOTJcdTU0N2NcdTMwNzNcdTUxZmFcdTMwNTlcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2NveW90ZVJlc3BvbnNlLnNlbmRSZWRpcmVjdC5pc2U9XHUzMGVjXHUzMGI5XHUzMGRkXHUzMGYzXHUzMGI5XHUzMDRjXHUzMGIzXHUzMGRmXHUzMGMzXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDVmXHU1ZjhjXHUzMDY3c2VuZFJlZGlyZWN0KClcdTMwOTJcdTU0N2NcdTMwNzNcdTUxZmFcdTMwNTlcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2NveW90ZVJlc3BvbnNlLnNldEJ1ZmZlclNpemUuaXNlPVx1MzBjN1x1MzBmY1x1MzBiZlx1MzA0Y1x1NjVlMlx1MzA2Ylx1NjZmOFx1MzA0ZFx1OGZiY1x1MzA3ZVx1MzA4Y1x1MzA1Zlx1NWY4Y1x1MzA2N1x1MzBkMFx1MzBjM1x1MzBkNVx1MzBhMVx1MzBiNVx1MzBhNFx1MzBiYVx1MzA5Mlx1NTkwOVx1NjZmNFx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworCisjCisjIENveW90ZVJlcXVlc3QKKyMKKworY295b3RlUmVxdWVzdC5nZXRJbnB1dFN0cmVhbS5pc2U9Z2V0UmVhZGVyKClcdTMwNmZcdTMwNTNcdTMwNmVcdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwNmJcdTViZmVcdTMwNTdcdTMwNjZcdTY1ZTJcdTMwNmJcdTU0N2NcdTMwNzNcdTUxZmFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2NveW90ZVJlcXVlc3QuZ2V0UmVhZGVyLmlzZT1nZXRJbnB1dFN0cmVhbSgpXHUzMDZmXHUzMDUzXHUzMDZlXHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMDZiXHU1YmZlXHUzMDU3XHUzMDY2XHU2NWUyXHUzMDZiXHU1NDdjXHUzMDczXHU1MWZhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Citjb3lvdGVSZXF1ZXN0LnNlc3Npb25DcmVhdGVDb21taXR0ZWQ9XHUzMGVjXHUzMGI5XHUzMGRkXHUzMGYzXHUzMGI5XHUzMDkyXHUzMGIzXHUzMGRmXHUzMGMzXHUzMGM4XHUzMDU3XHUzMDVmXHU1ZjhjXHUzMDY3XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitjb3lvdGVSZXF1ZXN0LnNldEF0dHJpYnV0ZS5uYW1lbnVsbD1zZXRBdHRyaWJ1dGVcdTMwOTJcdTU0MGRcdTUyNGRcdTMwOTJcdTYzMDdcdTViOWFcdTMwNWJcdTMwNWFcdTMwNmJcdTU0N2NcdTMwNzNcdTUxZmFcdTMwNTlcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2NveW90ZVJlcXVlc3QubGlzdGVuZXJTdGFydD1cdTMwYWZcdTMwZTlcdTMwYjkgezB9IFx1MzA2ZVx1MzBlYVx1MzBiOVx1MzBjYVx1MzBhNFx1MzBmM1x1MzBiOVx1MzBiZlx1MzBmM1x1MzBiOVx1MzA2Ylx1NTIxZFx1NjcxZlx1NTMxNlx1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1MzA5Mlx1OTAwMVx1NGZlMVx1NGUyZFx1MzA2Ylx1NGY4Ylx1NTkxNlx1MzA0Y1x1NjI5NVx1MzA1Mlx1MzA4OVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1ZgorY295b3RlUmVxdWVzdC5saXN0ZW5lclN0b3A9XHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwNmVcdTMwZWFcdTMwYjlcdTMwY2FcdTMwYTRcdTMwZjNcdTMwYjlcdTMwYmZcdTMwZjNcdTMwYjlcdTMwNmJcdTVlYzNcdTY4YzRcdTMwYTRcdTMwZDlcdTMwZjNcdTMwYzhcdTMwOTJcdTkwMDFcdTRmZTFcdTRlMmRcdTMwNmJcdTRmOGJcdTU5MTZcdTMwNGNcdTYyOTVcdTMwNTJcdTMwODlcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWYKK2NveW90ZVJlcXVlc3QuYXR0cmlidXRlRXZlbnQ9XHU1YzVlXHU2MDI3XHUzMGE0XHUzMGQ5XHUzMGYzXHUzMGM4XHUzMGVhXHUzMGI5XHUzMGNhXHUzMDZiXHUzMDg4XHUzMDYzXHUzMDY2XHU0ZjhiXHU1OTE2XHUzMDRjXHU2Mjk1XHUzMDUyXHUzMDg5XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmCitjb3lvdGVSZXF1ZXN0LnBvc3RUb29MYXJnZT1QT1NUXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGM3XHUzMGZjXHUzMGJmXHUzMDRjXHU1OTI3XHUzMDRkXHUzMDU5XHUzMDRlXHUzMDVmXHUzMDZlXHUzMDY3XHUzMDAxXHUzMGQxXHUzMGU5XHUzMGUxXHUzMGZjXHUzMGJmXHUzMDRjXHU2OWNiXHU2NTg3XHU4OWUzXHU2NzkwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyXHUzMDVkXHUzMDZlXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDRjXHU1ZGU4XHU1OTI3XHUzMDZhUE9TVFx1MzA5Mlx1NTNkN1x1MzA1MVx1NGVkOFx1MzA1MVx1MzA2ZFx1MzA3MFx1MzA2YVx1MzA4OVx1MzA2YVx1MzA0NFx1NTgzNFx1NTQwOFx1MzA2Ylx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA4Y1x1MzA5Mlx1ODllM1x1NmM3YVx1MzA1OVx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzA2Ylx1MzBiM1x1MzBjZFx1MzBhZlx1MzBiZlx1MzA2ZW1heFBvc3RTaXplXHU1YzVlXHU2MDI3XHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyCisKKworIworIyBNYXBwZXJMaXN0ZW5lcgorIworCittYXBwZXJMaXN0ZW5lci5yZWdpc3RlckNvbnRleHQ9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4IHswfVx1MzAwMFx1MzA5Mlx1NzY3Ylx1OTMzMlx1MzA1N1x1MzA3ZVx1MzA1OQorbWFwcGVyTGlzdGVuZXIudW5yZWdpc3RlckNvbnRleHQ9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4IHswfSBcdTMwNmVcdTc2N2JcdTkzMzJcdTMwOTJcdTYyYjlcdTZkODhcdTMwNTdcdTMwN2VcdTMwNTkKK21hcHBlckxpc3RlbmVyLnJlZ2lzdGVyV3JhcHBlcj1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzggezF9IFx1MzA2Ylx1MzBlOVx1MzBjM1x1MzBkMSB7MH0gXHUzMDkyXHU3NjdiXHU5MzMyXHUzMDU3XHUzMDdlXHUzMDU5CisKKworCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL01hcHBlckxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL01hcHBlckxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2ZTQ0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvTWFwcGVyTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDUwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyTm90aWZpY2F0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworCitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5odHRwLm1hcHBlci5NYXBwZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLnJlcy5TdHJpbmdNYW5hZ2VyOworCisKKy8qKgorICogTWFwcGVyIGxpc3RlbmVyLgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEBhdXRob3IgQ29zdGluIE1hbm9sYWNoZQorICovCitwdWJsaWMgY2xhc3MgTWFwcGVyTGlzdGVuZXIKKyAgICBpbXBsZW1lbnRzIE5vdGlmaWNhdGlvbkxpc3RlbmVyIAorIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWFwcGVyTGlzdGVuZXIuY2xhc3MpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVkIG1hcHBlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFwcGVyIG1hcHBlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBNQmVhbiBzZXJ2ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1CZWFuU2VydmVyIG1CZWFuU2VydmVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworICAgIC8vIEl0IHNob3VsZCBiZSBudWxsIC0gYW5kIGZhaWwgaWYgbm90IHNldAorICAgIHByaXZhdGUgU3RyaW5nIGRvbWFpbj0iKiI7CisgICAgcHJpdmF0ZSBTdHJpbmcgZW5naW5lPSIqIjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbWFwcGVyIGxpc3RlbmVyLgorICAgICAqLworICAgIHB1YmxpYyBNYXBwZXJMaXN0ZW5lcihNYXBwZXIgbWFwcGVyKSB7CisgICAgICAgIHRoaXMubWFwcGVyID0gbWFwcGVyOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIGRvbWFpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREb21haW4oU3RyaW5nIGRvbWFpbikgeworICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuZ2luZSgpIHsKKyAgICAgICAgcmV0dXJuIGVuZ2luZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFbmdpbmUoU3RyaW5nIGVuZ2luZSkgeworICAgICAgICB0aGlzLmVuZ2luZSA9IGVuZ2luZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGFzc29jaWF0ZWQgbWFwcGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgbUJlYW5TZXJ2ZXIgPSBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS5nZXRNQmVhblNlcnZlcigpOworCisgICAgICAgICAgICByZWdpc3RlckVuZ2luZSgpOworCisgICAgICAgICAgICAvLyBRdWVyeSBob3N0cworICAgICAgICAgICAgU3RyaW5nIG9uU3RyID0gZG9tYWluICsgIjp0eXBlPUhvc3QsKiI7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZShvblN0cik7CisgICAgICAgICAgICBTZXQgc2V0ID0gbUJlYW5TZXJ2ZXIucXVlcnlNQmVhbnMob2JqZWN0TmFtZSwgbnVsbCk7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdEluc3RhbmNlIG9pID0gKE9iamVjdEluc3RhbmNlKSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJIb3N0KG9pLmdldE9iamVjdE5hbWUoKSk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gUXVlcnkgY29udGV4dHMKKyAgICAgICAgICAgIG9uU3RyID0gIio6ajJlZVR5cGU9V2ViTW9kdWxlLCoiOworICAgICAgICAgICAgb2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKG9uU3RyKTsKKyAgICAgICAgICAgIHNldCA9IG1CZWFuU2VydmVyLnF1ZXJ5TUJlYW5zKG9iamVjdE5hbWUsIG51bGwpOworICAgICAgICAgICAgaXRlcmF0b3IgPSBzZXQuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3RJbnN0YW5jZSBvaSA9IChPYmplY3RJbnN0YW5jZSkgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ29udGV4dChvaS5nZXRPYmplY3ROYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBRdWVyeSB3cmFwcGVycworICAgICAgICAgICAgb25TdHIgPSAiKjpqMmVlVHlwZT1TZXJ2bGV0LCoiOworICAgICAgICAgICAgb2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKG9uU3RyKTsKKyAgICAgICAgICAgIHNldCA9IG1CZWFuU2VydmVyLnF1ZXJ5TUJlYW5zKG9iamVjdE5hbWUsIG51bGwpOworICAgICAgICAgICAgaXRlcmF0b3IgPSBzZXQuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3RJbnN0YW5jZSBvaSA9IChPYmplY3RJbnN0YW5jZSkgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgIHJlZ2lzdGVyV3JhcHBlcihvaS5nZXRPYmplY3ROYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvblN0ciA9ICJKTUltcGxlbWVudGF0aW9uOnR5cGU9TUJlYW5TZXJ2ZXJEZWxlZ2F0ZSI7CisgICAgICAgICAgICBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUob25TdHIpOworICAgICAgICAgICAgbUJlYW5TZXJ2ZXIuYWRkTm90aWZpY2F0aW9uTGlzdGVuZXIob2JqZWN0TmFtZSwgdGhpcywgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy53YXJuKCJFcnJvciByZWdpc3RlcmluZyBjb250ZXh0cyIsZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIHVucmVnaXN0ZXIgdGhpcyBmcm9tIEpNSW1wbGVtZW50YXRpb246dHlwZT1NQmVhblNlcnZlckRlbGVnYXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUoCisgICAgICAgICAgICAgICAgICAgICJKTUltcGxlbWVudGF0aW9uOnR5cGU9TUJlYW5TZXJ2ZXJEZWxlZ2F0ZSIpOworICAgICAgICAgICAgbUJlYW5TZXJ2ZXIucmVtb3ZlTm90aWZpY2F0aW9uTGlzdGVuZXIob2JqZWN0TmFtZSwgdGhpcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cud2FybigiRXJyb3IgdW5yZWdpc3RlcmluZyBNQmVhblNlcnZlckRlbGVnYXRlIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE5vdGlmaWNhdGlvbkxpc3RlbmVyIE1ldGhvZHMKKworCisgICAgcHVibGljIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QgaGFuZGJhY2spIHsKKworICAgICAgICBpZiAobm90aWZpY2F0aW9uIGluc3RhbmNlb2YgTUJlYW5TZXJ2ZXJOb3RpZmljYXRpb24pIHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IAorICAgICAgICAgICAgICAgICgoTUJlYW5TZXJ2ZXJOb3RpZmljYXRpb24pIG5vdGlmaWNhdGlvbikuZ2V0TUJlYW5OYW1lKCk7CisgICAgICAgICAgICBTdHJpbmcgajJlZVR5cGUgPSBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJqMmVlVHlwZSIpOworICAgICAgICAgICAgU3RyaW5nIGVuZ2luZU5hbWUgPSBudWxsOworICAgICAgICAgICAgaWYgKGoyZWVUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGoyZWVUeXBlLmVxdWFscygiV2ViTW9kdWxlIikpIHx8IAorICAgICAgICAgICAgICAgICAgICAoajJlZVR5cGUuZXF1YWxzKCJTZXJ2bGV0IikpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQmVhblNlcnZlci5pc1JlZ2lzdGVyZWQob2JqZWN0TmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lTmFtZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLCAiZW5naW5lTmFtZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgIAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBdCBkZXBsb3ltZW50IHRpbWUsIGVuZ2luZU5hbWUgaXMgYWx3YXlzID0gbnVsbC4KKyAgICAgICAgICAgIGlmICggKCEiKiIuZXF1YWxzKGRvbWFpbikpICYmCisgICAgICAgICAgICAgICAgICggIWRvbWFpbi5lcXVhbHMob2JqZWN0TmFtZS5nZXREb21haW4oKSkgKSAmJgorICAgICAgICAgICAgICAgICAoICghZG9tYWluLmVxdWFscyhlbmdpbmVOYW1lKSApICYmCisgICAgICAgICAgICAgICAgICAgKGVuZ2luZU5hbWUgIT0gbnVsbCkgKSApICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiSGFuZGxlICIgKyBvYmplY3ROYW1lICArICIgdHlwZSA6ICIgKyBub3RpZmljYXRpb24uZ2V0VHlwZSgpKTsgICAgCisgICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uLmdldFR5cGUoKS5lcXVhbHMKKyAgICAgICAgICAgICAgICAoTUJlYW5TZXJ2ZXJOb3RpZmljYXRpb24uUkVHSVNUUkFUSU9OX05PVElGSUNBVElPTikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZT1vYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJ0eXBlIik7CisgICAgICAgICAgICAgICAgaWYoICJIb3N0Ii5lcXVhbHMoIHR5cGUgKSAmJiBkb21haW4uZXF1YWxzKG9iamVjdE5hbWUuZ2V0RG9tYWluKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlckhvc3Qob2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiRXJyb3IgcmVnaXN0ZXJpbmcgSG9zdCAiICsgb2JqZWN0TmFtZSwgZSk7ICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgICAgICBpZiAoajJlZVR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoajJlZVR5cGUuZXF1YWxzKCJXZWJNb2R1bGUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckNvbnRleHQob2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJFcnJvciByZWdpc3RlcmluZyBDb250ZXh0ICIgKyBvYmplY3ROYW1lLHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGoyZWVUeXBlLmVxdWFscygiU2VydmxldCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyV3JhcHBlcihvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkVycm9yIHJlZ2lzdGVyaW5nIFdyYXBwZXIgIiArIG9iamVjdE5hbWUsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRUeXBlKCkuZXF1YWxzCisgICAgICAgICAgICAgICAgICAgICAgIChNQmVhblNlcnZlck5vdGlmaWNhdGlvbi5VTlJFR0lTVFJBVElPTl9OT1RJRklDQVRJT04pKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGU9b2JqZWN0TmFtZS5nZXRLZXlQcm9wZXJ0eSgidHlwZSIpOworICAgICAgICAgICAgICAgIGlmKCAiSG9zdCIuZXF1YWxzKCB0eXBlICkmJiBkb21haW4uZXF1YWxzKG9iamVjdE5hbWUuZ2V0RG9tYWluKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVySG9zdChvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJFcnJvciB1bnJlZ2lzdGVyaW5nIEhvc3QgIiArIG9iamVjdE5hbWUsZSk7ICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAKKyAgICAgICAgICAgICAgICBpZiAoajJlZVR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoajJlZVR5cGUuZXF1YWxzKCJXZWJNb2R1bGUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyQ29udGV4dChvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkVycm9yIHVucmVnaXN0ZXJpbmcgd2ViYXBwICIgKyBvYmplY3ROYW1lLHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRW5naW5lKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgT2JqZWN0TmFtZSBlbmdpbmVOYW1lID0gbmV3IE9iamVjdE5hbWUKKyAgICAgICAgICAgIChkb21haW4gKyAiOnR5cGU9RW5naW5lIik7CisgICAgICAgIGlmICggISBtQmVhblNlcnZlci5pc1JlZ2lzdGVyZWQoZW5naW5lTmFtZSkpIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGRlZmF1bHRIb3N0ID0gCisgICAgICAgICAgICAoU3RyaW5nKSBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUoZW5naW5lTmFtZSwgImRlZmF1bHRIb3N0Iik7CisgICAgICAgIE9iamVjdE5hbWUgaG9zdE5hbWUgPSBuZXcgT2JqZWN0TmFtZQorICAgICAgICAgICAgKGRvbWFpbiArICI6dHlwZT1Ib3N0LCIgKyAiaG9zdD0iICsgZGVmYXVsdEhvc3QpOworICAgICAgICBpZiAoIW1CZWFuU2VydmVyLmlzUmVnaXN0ZXJlZChob3N0TmFtZSkpIHsKKworICAgICAgICAgICAgLy8gR2V0IHRoZSBob3N0cycgbGlzdAorICAgICAgICAgICAgU3RyaW5nIG9uU3RyID0gZG9tYWluICsgIjp0eXBlPUhvc3QsKiI7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZShvblN0cik7CisgICAgICAgICAgICBTZXQgc2V0ID0gbUJlYW5TZXJ2ZXIucXVlcnlNQmVhbnMob2JqZWN0TmFtZSwgbnVsbCk7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOworICAgICAgICAgICAgU3RyaW5nW10gYWxpYXNlczsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNSZWdpc3RlcmVkV2l0aEFsaWFzID0gZmFsc2U7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKworICAgICAgICAgICAgICAgIGlmIChpc1JlZ2lzdGVyZWRXaXRoQWxpYXMpIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgT2JqZWN0SW5zdGFuY2Ugb2kgPSAoT2JqZWN0SW5zdGFuY2UpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBob3N0TmFtZSA9IG9pLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgICAgICAgICBhbGlhc2VzID0gKFN0cmluZ1tdKQorICAgICAgICAgICAgICAgICAgICBtQmVhblNlcnZlci5pbnZva2UoaG9zdE5hbWUsICJmaW5kQWxpYXNlcyIsIG51bGwsIG51bGwpOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgYWxpYXNlcy5sZW5ndGg7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbGlhc2VzW2ldLmVxdWFsc0lnbm9yZUNhc2UoZGVmYXVsdEhvc3QpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVnaXN0ZXJlZFdpdGhBbGlhcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFpc1JlZ2lzdGVyZWRXaXRoQWxpYXMgJiYgbG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcoIm1hcHBlckxpc3RlbmVyLnVua25vd25EZWZhdWx0SG9zdCIsIGRlZmF1bHRIb3N0KSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyBzaG91bGQgcHJvYmFibHQgYmUgY2FsbGVkIGxhdGVyIAorICAgICAgICBpZiggZGVmYXVsdEhvc3QgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIG1hcHBlci5zZXREZWZhdWx0SG9zdE5hbWUoZGVmYXVsdEhvc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgaG9zdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJIb3N0KE9iamVjdE5hbWUgb2JqZWN0TmFtZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBuYW1lPW9iamVjdE5hbWUuZ2V0S2V5UHJvcGVydHkoImhvc3QiKTsKKyAgICAgICAgaWYoIG5hbWUgIT0gbnVsbCApIHsgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nW10gYWxpYXNlcyA9IChTdHJpbmdbXSkKKyAgICAgICAgICAgICAgICBtQmVhblNlcnZlci5pbnZva2Uob2JqZWN0TmFtZSwgImZpbmRBbGlhc2VzIiwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBtYXBwZXIuYWRkSG9zdChuYW1lLCBhbGlhc2VzLCBvYmplY3ROYW1lKTsKKyAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICgibWFwcGVyTGlzdGVuZXIucmVnaXN0ZXJIb3N0IiwgbmFtZSwgZG9tYWluKSk7CisKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlciBob3N0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1bnJlZ2lzdGVySG9zdChPYmplY3ROYW1lIG9iamVjdE5hbWUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbmFtZT1vYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJob3N0Iik7CisgICAgICAgIG1hcHBlci5yZW1vdmVIb3N0KG5hbWUpOworICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgKCJtYXBwZXJMaXN0ZW5lci51bnJlZ2lzdGVySG9zdCIsIG5hbWUsIGRvbWFpbikpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJDb250ZXh0KE9iamVjdE5hbWUgb2JqZWN0TmFtZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgIAorICAgICAgICAvLyBJZiB0aGUgZG9tYWluIGlzIHRoZSBzYW1lIHdpdGggb3VycyBvciB0aGUgZW5naW5lIAorICAgICAgICAvLyBuYW1lIGF0dHJpYnV0ZSBpcyB0aGUgc2FtZS4uLiAtIHRoZW4gaXQncyBvdXJzCisgICAgICAgIFN0cmluZyB0YXJnZXREb21haW49b2JqZWN0TmFtZS5nZXREb21haW4oKTsKKyAgICAgICAgaWYoICEgZG9tYWluLmVxdWFscyggdGFyZ2V0RG9tYWluICkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0RG9tYWluID0gKFN0cmluZykgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgIChvYmplY3ROYW1lLCAiZW5naW5lTmFtZSIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhIGRvbWFpbi5lcXVhbHMoIHRhcmdldERvbWFpbiApKSB7CisgICAgICAgICAgICAgICAgLy8gbm90IG91cnMKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgY29udGV4dE5hbWUgPSBudWxsOworICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCIvLyIpKSB7CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMik7CisgICAgICAgIH0KKyAgICAgICAgaW50IHNsYXNoID0gbmFtZS5pbmRleE9mKCIvIik7CisgICAgICAgIGlmIChzbGFzaCAhPSAtMSkgeworICAgICAgICAgICAgaG9zdE5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBzbGFzaCk7CisgICAgICAgICAgICBjb250ZXh0TmFtZSA9IG5hbWUuc3Vic3RyaW5nKHNsYXNoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHRoZSByb290IGNvbnRleHQKKyAgICAgICAgaWYgKGNvbnRleHROYW1lLmVxdWFscygiLyIpKSB7CisgICAgICAgICAgICBjb250ZXh0TmFtZSA9ICIiOworICAgICAgICB9CisKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgKCJtYXBwZXJMaXN0ZW5lci5yZWdpc3RlckNvbnRleHQiLCBjb250ZXh0TmFtZSkpOworCisgICAgICAgIE9iamVjdCBjb250ZXh0ID0gCisgICAgICAgICAgICBtQmVhblNlcnZlci5pbnZva2Uob2JqZWN0TmFtZSwgImZpbmRNYXBwaW5nT2JqZWN0IiwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAvL21CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLCAibWFwcGluZ09iamVjdCIpOworICAgICAgICBqYXZheC5uYW1pbmcuQ29udGV4dCByZXNvdXJjZXMgPSAoamF2YXgubmFtaW5nLkNvbnRleHQpCisgICAgICAgICAgICBtQmVhblNlcnZlci5pbnZva2Uob2JqZWN0TmFtZSwgImZpbmRTdGF0aWNSZXNvdXJjZXMiLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIC8vbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKG9iamVjdE5hbWUsICJzdGF0aWNSZXNvdXJjZXMiKTsKKyAgICAgICAgU3RyaW5nW10gd2VsY29tZUZpbGVzID0gKFN0cmluZ1tdKQorICAgICAgICAgICAgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKG9iamVjdE5hbWUsICJ3ZWxjb21lRmlsZXMiKTsKKworICAgICAgICBtYXBwZXIuYWRkQ29udGV4dChob3N0TmFtZSwgY29udGV4dE5hbWUsIGNvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWxjb21lRmlsZXMsIHJlc291cmNlcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXIgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdW5yZWdpc3RlckNvbnRleHQoT2JqZWN0TmFtZSBvYmplY3ROYW1lKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IG9iamVjdE5hbWUuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKworICAgICAgICAvLyBJZiB0aGUgZG9tYWluIGlzIHRoZSBzYW1lIHdpdGggb3VycyBvciB0aGUgZW5naW5lIAorICAgICAgICAvLyBuYW1lIGF0dHJpYnV0ZSBpcyB0aGUgc2FtZS4uLiAtIHRoZW4gaXQncyBvdXJzCisgICAgICAgIFN0cmluZyB0YXJnZXREb21haW49b2JqZWN0TmFtZS5nZXREb21haW4oKTsKKyAgICAgICAgaWYoICEgZG9tYWluLmVxdWFscyggdGFyZ2V0RG9tYWluICkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0RG9tYWluID0gKFN0cmluZykgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgIChvYmplY3ROYW1lLCAiZW5naW5lTmFtZSIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhIGRvbWFpbi5lcXVhbHMoIHRhcmdldERvbWFpbiApKSB7CisgICAgICAgICAgICAgICAgLy8gbm90IG91cnMKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgY29udGV4dE5hbWUgPSBudWxsOworICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCIvLyIpKSB7CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMik7CisgICAgICAgIH0KKyAgICAgICAgaW50IHNsYXNoID0gbmFtZS5pbmRleE9mKCIvIik7CisgICAgICAgIGlmIChzbGFzaCAhPSAtMSkgeworICAgICAgICAgICAgaG9zdE5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBzbGFzaCk7CisgICAgICAgICAgICBjb250ZXh0TmFtZSA9IG5hbWUuc3Vic3RyaW5nKHNsYXNoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHRoZSByb290IGNvbnRleHQKKyAgICAgICAgaWYgKGNvbnRleHROYW1lLmVxdWFscygiLyIpKSB7CisgICAgICAgICAgICBjb250ZXh0TmFtZSA9ICIiOworICAgICAgICB9CisgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgKCJtYXBwZXJMaXN0ZW5lci51bnJlZ2lzdGVyQ29udGV4dCIsIGNvbnRleHROYW1lKSk7CisKKyAgICAgICAgbWFwcGVyLnJlbW92ZUNvbnRleHQoaG9zdE5hbWUsIGNvbnRleHROYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgd3JhcHBlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJXcmFwcGVyKE9iamVjdE5hbWUgb2JqZWN0TmFtZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgCisgICAgICAgIC8vIElmIHRoZSBkb21haW4gaXMgdGhlIHNhbWUgd2l0aCBvdXJzIG9yIHRoZSBlbmdpbmUgCisgICAgICAgIC8vIG5hbWUgYXR0cmlidXRlIGlzIHRoZSBzYW1lLi4uIC0gdGhlbiBpdCdzIG91cnMKKyAgICAgICAgU3RyaW5nIHRhcmdldERvbWFpbj1vYmplY3ROYW1lLmdldERvbWFpbigpOworICAgICAgICBpZiggISBkb21haW4uZXF1YWxzKCB0YXJnZXREb21haW4gKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0YXJnZXREb21haW49KFN0cmluZykgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKG9iamVjdE5hbWUsICJlbmdpbmVOYW1lIik7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICEgZG9tYWluLmVxdWFscyggdGFyZ2V0RG9tYWluICkpIHsKKyAgICAgICAgICAgICAgICAvLyBub3Qgb3VycworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHdyYXBwZXJOYW1lID0gb2JqZWN0TmFtZS5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICBTdHJpbmcgbmFtZSA9IG9iamVjdE5hbWUuZ2V0S2V5UHJvcGVydHkoIldlYk1vZHVsZSIpOworCisgICAgICAgIFN0cmluZyBob3N0TmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBjb250ZXh0TmFtZSA9IG51bGw7CisgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIi8vIikpIHsKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygyKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2xhc2ggPSBuYW1lLmluZGV4T2YoIi8iKTsKKyAgICAgICAgaWYgKHNsYXNoICE9IC0xKSB7CisgICAgICAgICAgICBob3N0TmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIHNsYXNoKTsKKyAgICAgICAgICAgIGNvbnRleHROYW1lID0gbmFtZS5zdWJzdHJpbmcoc2xhc2gpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdGhlIHJvb3QgY29udGV4dAorICAgICAgICBpZiAoY29udGV4dE5hbWUuZXF1YWxzKCIvIikpIHsKKyAgICAgICAgICAgIGNvbnRleHROYW1lID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAoIm1hcHBlckxpc3RlbmVyLnJlZ2lzdGVyV3JhcHBlciIsIAorICAgICAgICAgICAgICAgICAgIHdyYXBwZXJOYW1lLCBjb250ZXh0TmFtZSkpOworCisgICAgICAgIFN0cmluZ1tdIG1hcHBpbmdzID0gKFN0cmluZ1tdKQorICAgICAgICAgICAgbUJlYW5TZXJ2ZXIuaW52b2tlKG9iamVjdE5hbWUsICJmaW5kTWFwcGluZ3MiLCBudWxsLCBudWxsKTsKKyAgICAgICAgT2JqZWN0IHdyYXBwZXIgPSAKKyAgICAgICAgICAgIG1CZWFuU2VydmVyLmludm9rZShvYmplY3ROYW1lLCAiZmluZE1hcHBpbmdPYmplY3QiLCBudWxsLCBudWxsKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcHBpbmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBib29sZWFuIGpzcFdpbGRDYXJkID0gKHdyYXBwZXJOYW1lLmVxdWFscygianNwIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWFwcGluZ3NbaV0uZW5kc1dpdGgoIi8qIikpOworICAgICAgICAgICAgbWFwcGVyLmFkZFdyYXBwZXIoaG9zdE5hbWUsIGNvbnRleHROYW1lLCBtYXBwaW5nc1tpXSwgd3JhcHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzcFdpbGRDYXJkKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL091dHB1dEJ1ZmZlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9PdXRwdXRCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGE5NmNhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9PdXRwdXRCdWZmZXIuamF2YQpAQCAtMCwwICsxLDY1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb3lvdGUuQWN0aW9uQ29kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNveW90ZS5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5CeXRlQ2h1bms7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuQzJCQ29udmVydGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLkNoYXJDaHVuazsKKworCisvKioKKyAqIFRoZSBidWZmZXIgdXNlZCBieSBUb21jYXQgcmVzcG9uc2UuIFRoaXMgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBUb21jYXQgMy4zCisgKiBPdXRwdXRCdWZmZXIsIHdpdGggdGhlIHJlbW92YWwgb2Ygc29tZSBvZiB0aGUgc3RhdGUgaGFuZGxpbmcgKHdoaWNoIGluIAorICogQ295b3RlIGlzIG1vc3RseSB0aGUgUHJvY2Vzc29yJ3MgcmVzcG9uc2FiaWxpdHkpLgorICoKKyAqIEBhdXRob3IgQ29zdGluIE1hbm9sYWNoZQorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICovCitwdWJsaWMgY2xhc3MgT3V0cHV0QnVmZmVyIGV4dGVuZHMgV3JpdGVyCisgICAgaW1wbGVtZW50cyBCeXRlQ2h1bmsuQnl0ZU91dHB1dENoYW5uZWwsIENoYXJDaHVuay5DaGFyT3V0cHV0Q2hhbm5lbCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VOQ09ESU5HID0gCisgICAgICAgIG9yZy5hcGFjaGUuY295b3RlLkNvbnN0YW50cy5ERUZBVUxUX0NIQVJBQ1RFUl9FTkNPRElORzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gOCoxMDI0OworCisKKyAgICAvLyBUaGUgYnVmZmVyIGNhbiBiZSB1c2VkIGZvciBieXRlW10gYW5kIGNoYXJbXSB3cml0aW5nCisgICAgLy8gKCB0aGlzIGlzIG5lZWRlZCB0byBzdXBwb3J0IFNlcnZsZXRPdXRwdXRTdHJlYW0gYW5kIGZvcgorICAgIC8vIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGVtcGxhdGluZyBzeXN0ZW1zICkKKyAgICBwdWJsaWMgZmluYWwgaW50IElOSVRJQUxfU1RBVEUgPSAwOworICAgIHB1YmxpYyBmaW5hbCBpbnQgQ0hBUl9TVEFURSA9IDE7CisgICAgcHVibGljIGZpbmFsIGludCBCWVRFX1NUQVRFID0gMjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBieXRlIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJ5dGVDaHVuayBiYjsKKworCisgICAgLyoqCisgICAgICogVGhlIGNodW5rIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIENoYXJDaHVuayBjYjsKKworCisgICAgLyoqCisgICAgICogU3RhdGUgb2YgdGhlIG91dHB1dCBidWZmZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc3RhdGUgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBieXRlc1dyaXR0ZW4gPSAwOworCisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgY2hhcnMgd3JpdHRlbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBjaGFyc1dyaXR0ZW4gPSAwOworCisKKyAgICAvKioKKyAgICAgKiBGbGFnIHdoaWNoIGluZGljYXRlcyBpZiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBjbG9zZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBEbyBhIGZsdXNoIG9uIHRoZSBuZXh0IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZG9GbHVzaCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBCeXRlIGNodW5rIHVzZWQgdG8gb3V0cHV0IGJ5dGVzLgorICAgICAqLworICAgIHByaXZhdGUgQnl0ZUNodW5rIG91dHB1dENodW5rID0gbmV3IEJ5dGVDaHVuaygpOworCisKKyAgICAvKioKKyAgICAgKiBFbmNvZGluZyB0byB1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jOworCisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVyIGlzIHNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZ290RW5jID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIExpc3Qgb2YgZW5jb2RlcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgZW5jb2RlcnMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBDdXJyZW50IGNoYXIgdG8gYnl0ZSBjb252ZXJ0ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIEMyQkNvbnZlcnRlciBjb252OworCisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVkIENveW90ZSByZXNwb25zZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlc3BvbnNlIGNveW90ZVJlc3BvbnNlOworCisKKyAgICAvKioKKyAgICAgKiBTdXNwZW5kZWQgZmxhZy4gQWxsIG91dHB1dCBieXRlcyB3aWxsIGJlIHN3YWxsb3dlZCBpZiB0aGlzIGlzIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN1c3BlbmRlZCA9IGZhbHNlOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gQWxsb2NhdGUgdGhlIGJ1ZmZlciB3aXRoIHRoZSBkZWZhdWx0IGJ1ZmZlciBzaXplLgorICAgICAqLworICAgIHB1YmxpYyBPdXRwdXRCdWZmZXIoKSB7CisKKyAgICAgICAgdGhpcyhERUZBVUxUX0JVRkZFUl9TSVpFKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWx0ZXJuYXRlIGNvbnN0cnVjdG9yIHdoaWNoIGFsbG93cyBzcGVjaWZ5aW5nIHRoZSBpbml0aWFsIGJ1ZmZlciBzaXplLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzaXplIEJ1ZmZlciBzaXplIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyBPdXRwdXRCdWZmZXIoaW50IHNpemUpIHsKKworICAgICAgICBiYiA9IG5ldyBCeXRlQ2h1bmsoc2l6ZSk7CisgICAgICAgIGJiLnNldExpbWl0KHNpemUpOworICAgICAgICBiYi5zZXRCeXRlT3V0cHV0Q2hhbm5lbCh0aGlzKTsKKyAgICAgICAgY2IgPSBuZXcgQ2hhckNodW5rKHNpemUpOworICAgICAgICBjYi5zZXRDaGFyT3V0cHV0Q2hhbm5lbCh0aGlzKTsKKyAgICAgICAgY2Iuc2V0TGltaXQoc2l6ZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVkIENveW90ZSByZXNwb25zZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY295b3RlUmVzcG9uc2UgQXNzb2NpYXRlZCBDb3lvdGUgcmVzcG9uc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNwb25zZShSZXNwb25zZSBjb3lvdGVSZXNwb25zZSkgeworCXRoaXMuY295b3RlUmVzcG9uc2UgPSBjb3lvdGVSZXNwb25zZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCBhc3NvY2lhdGVkIENveW90ZSByZXNwb25zZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIENveW90ZSByZXNwb25zZQorICAgICAqLworICAgIHB1YmxpYyBSZXNwb25zZSBnZXRSZXNwb25zZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY295b3RlUmVzcG9uc2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgcmVzcG9uc2Ugb3V0cHV0IHN1c3BlbmRlZCA/CisgICAgICogCisgICAgICogQHJldHVybiBzdXNwZW5kZWQgZmxhZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU3VzcGVuZGVkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zdXNwZW5kZWQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN1c3BlbmRlZCBmbGFnLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdXNwZW5kZWQgTmV3IHN1c3BlbmRlZCBmbGFnIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3VzcGVuZGVkKGJvb2xlYW4gc3VzcGVuZGVkKSB7CisgICAgICAgIHRoaXMuc3VzcGVuZGVkID0gc3VzcGVuZGVkOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlY3ljbGUgdGhlIG91dHB1dCBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAgICAgCisgICAgICAgIHN0YXRlID0gSU5JVElBTF9TVEFURTsKKyAgICAgICAgYnl0ZXNXcml0dGVuID0gMDsKKyAgICAgICAgY2hhcnNXcml0dGVuID0gMDsKKyAgICAgICAgCisgICAgICAgIGNiLnJlY3ljbGUoKTsKKyAgICAgICAgYmIucmVjeWNsZSgpOyAKKyAgICAgICAgY2xvc2VkID0gZmFsc2U7CisgICAgICAgIHN1c3BlbmRlZCA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgaWYgKGNvbnYhPSBudWxsKSB7CisgICAgICAgICAgICBjb252LnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZ290RW5jID0gZmFsc2U7CisgICAgICAgIGVuYyA9IG51bGw7CisgICAgICAgIAorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIG91dHB1dCBidWZmZXIuIFRoaXMgdHJpZXMgdG8gY2FsY3VsYXRlIHRoZSByZXNwb25zZSBzaXplIGlmIAorICAgICAqIHRoZSByZXNwb25zZSBoYXMgbm90IGJlZW4gY29tbWl0dGVkIHlldC4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIEFuIHVuZGVybHlpbmcgSU9FeGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGNsb3NlZCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHN1c3BlbmRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoKCFjb3lvdGVSZXNwb25zZS5pc0NvbW1pdHRlZCgpKSAKKyAgICAgICAgICAgICYmIChjb3lvdGVSZXNwb25zZS5nZXRDb250ZW50TGVuZ3RoTG9uZygpID09IC0xKSkgeworICAgICAgICAgICAgLy8gRmx1c2hpbmcgdGhlIGNoYXIgYnVmZmVyCisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQ0hBUl9TVEFURSkgeworICAgICAgICAgICAgICAgIGNiLmZsdXNoQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBCWVRFX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgdGhpcyBkaWRuJ3QgY2F1c2UgYSBjb21taXQgb2YgdGhlIHJlc3BvbnNlLCB0aGUgZmluYWwgY29udGVudAorICAgICAgICAgICAgLy8gbGVuZ3RoIGNhbiBiZSBjYWxjdWxhdGVkCisgICAgICAgICAgICBpZiAoIWNveW90ZVJlc3BvbnNlLmlzQ29tbWl0dGVkKCkpIHsKKyAgICAgICAgICAgICAgICBjb3lvdGVSZXNwb25zZS5zZXRDb250ZW50TGVuZ3RoKGJiLmdldExlbmd0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRvRmx1c2goZmFsc2UpOworICAgICAgICBjbG9zZWQgPSB0cnVlOworCisgICAgICAgIGNveW90ZVJlc3BvbnNlLmZpbmlzaCgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBieXRlcyBvciBjaGFycyBjb250YWluZWQgaW4gdGhlIGJ1ZmZlci4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIEFuIHVuZGVybHlpbmcgSU9FeGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGRvRmx1c2godHJ1ZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBieXRlcyBvciBjaGFycyBjb250YWluZWQgaW4gdGhlIGJ1ZmZlci4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIEFuIHVuZGVybHlpbmcgSU9FeGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0ZsdXNoKGJvb2xlYW4gcmVhbEZsdXNoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChzdXNwZW5kZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZG9GbHVzaCA9IHRydWU7CisgICAgICAgIGlmIChzdGF0ZSA9PSBDSEFSX1NUQVRFKSB7CisgICAgICAgICAgICBjYi5mbHVzaEJ1ZmZlcigpOworICAgICAgICAgICAgYmIuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgICAgIHN0YXRlID0gQllURV9TVEFURTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBCWVRFX1NUQVRFKSB7CisgICAgICAgICAgICBiYi5mbHVzaEJ1ZmZlcigpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IElOSVRJQUxfU1RBVEUpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBidWZmZXJzIGFyZSBlbXB0eSwgY29tbWl0IHRoZSByZXNwb25zZSBoZWFkZXIKKyAgICAgICAgICAgIGNveW90ZVJlc3BvbnNlLnNlbmRIZWFkZXJzKCk7CisgICAgICAgIH0KKyAgICAgICAgZG9GbHVzaCA9IGZhbHNlOworCisgICAgICAgIGlmIChyZWFsRmx1c2gpIHsKKyAgICAgICAgICAgIGNveW90ZVJlc3BvbnNlLmFjdGlvbihBY3Rpb25Db2RlLkFDVElPTl9DTElFTlRfRkxVU0gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNveW90ZVJlc3BvbnNlKTsKKyAgICAgICAgICAgIC8vIElmIHNvbWUgZXhjZXB0aW9uIG9jY3VycmVkIGVhcmxpZXIsIG9yIGlmIHNvbWUgSU9FIG9jY3VycmVkCisgICAgICAgICAgICAvLyBoZXJlLCBub3RpZnkgdGhlIHNlcnZsZXQgd2l0aCBhbiBJT0UKKyAgICAgICAgICAgIGlmIChjb3lvdGVSZXNwb25zZS5pc0V4Y2VwdGlvblByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGllbnRBYm9ydEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoY295b3RlUmVzcG9uc2UuZ2V0RXJyb3JFeGNlcHRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCeXRlcyBIYW5kbGluZyBNZXRob2RzCisKKworICAgIC8qKiAKKyAgICAgKiBTZW5kcyB0aGUgYnVmZmVyIGRhdGEgdG8gdGhlIGNsaWVudCBvdXRwdXQsIGNoZWNraW5nIHRoZQorICAgICAqIHN0YXRlIG9mIFJlc3BvbnNlIGFuZCBjYWxsaW5nIHRoZSByaWdodCBpbnRlcmNlcHRvcnMuCisgICAgICogCisgICAgICogQHBhcmFtIGJ1ZiBCeXRlIGJ1ZmZlciB0byBiZSB3cml0dGVuIHRvIHRoZSByZXNwb25zZQorICAgICAqIEBwYXJhbSBvZmYgT2Zmc2V0CisgICAgICogQHBhcmFtIGNudCBMZW5ndGgKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIEFuIHVuZGVybHlpbmcgSU9FeGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFsV3JpdGVCeXRlcyhieXRlIGJ1ZltdLCBpbnQgb2ZmLCBpbnQgY250KQorCXRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGNsb3NlZCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGNveW90ZVJlc3BvbnNlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gSWYgd2UgcmVhbGx5IGhhdmUgc29tZXRoaW5nIHRvIHdyaXRlCisgICAgICAgIGlmIChjbnQgPiAwKSB7CisgICAgICAgICAgICAvLyByZWFsIHdyaXRlIHRvIHRoZSBhZGFwdGVyCisgICAgICAgICAgICBvdXRwdXRDaHVuay5zZXRCeXRlcyhidWYsIG9mZiwgY250KTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY295b3RlUmVzcG9uc2UuZG9Xcml0ZShvdXRwdXRDaHVuayk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gQW4gSU9FeGNlcHRpb24gb24gYSB3cml0ZSBpcyBhbG1vc3QgYWx3YXlzIGR1ZSB0bworICAgICAgICAgICAgICAgIC8vIHRoZSByZW1vdGUgY2xpZW50IGFib3J0aW5nIHRoZSByZXF1ZXN0LiAgV3JhcCB0aGlzCisgICAgICAgICAgICAgICAgLy8gc28gdGhhdCBpdCBjYW4gYmUgaGFuZGxlZCBiZXR0ZXIgYnkgdGhlIGVycm9yIGRpc3BhdGNoZXIuCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsaWVudEFib3J0RXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChzdXNwZW5kZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKHN0YXRlID09IENIQVJfU1RBVEUpCisgICAgICAgICAgICBjYi5mbHVzaEJ1ZmZlcigpOworICAgICAgICBzdGF0ZSA9IEJZVEVfU1RBVEU7CisgICAgICAgIHdyaXRlQnl0ZXMoYiwgb2ZmLCBsZW4pOworCisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVCeXRlcyhieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGNsb3NlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBiYi5hcHBlbmQoYiwgb2ZmLCBsZW4pOworICAgICAgICBieXRlc1dyaXR0ZW4gKz0gbGVuOworCisgICAgICAgIC8vIGlmIGNhbGxlZCBmcm9tIHdpdGhpbiBmbHVzaCgpLCB0aGVuIGltbWVkaWF0ZWx5IGZsdXNoCisgICAgICAgIC8vIHJlbWFpbmluZyBieXRlcworICAgICAgICBpZiAoZG9GbHVzaCkgeworICAgICAgICAgICAgYmIuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoaW50IGIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHN1c3BlbmRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoc3RhdGUgPT0gQ0hBUl9TVEFURSkKKyAgICAgICAgICAgIGNiLmZsdXNoQnVmZmVyKCk7CisgICAgICAgIHN0YXRlID0gQllURV9TVEFURTsKKworICAgICAgICBiYi5hcHBlbmQoIChieXRlKWIgKTsKKyAgICAgICAgYnl0ZXNXcml0dGVuKys7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2hhcnMgSGFuZGxpbmcgTWV0aG9kcworCisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoc3VzcGVuZGVkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHN0YXRlID0gQ0hBUl9TVEFURTsKKworICAgICAgICBjYi5hcHBlbmQoKGNoYXIpIGMpOworICAgICAgICBjaGFyc1dyaXR0ZW4rKzsKKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgd3JpdGUoY2hhciBjW10pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHN1c3BlbmRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB3cml0ZShjLCAwLCBjLmxlbmd0aCk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgY1tdLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChzdXNwZW5kZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgc3RhdGUgPSBDSEFSX1NUQVRFOworCisgICAgICAgIGNiLmFwcGVuZChjLCBvZmYsIGxlbik7CisgICAgICAgIGNoYXJzV3JpdHRlbiArPSBsZW47CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZ0J1ZmZlciBzYikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoc3VzcGVuZGVkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHN0YXRlID0gQ0hBUl9TVEFURTsKKworICAgICAgICBpbnQgbGVuID0gc2IubGVuZ3RoKCk7CisgICAgICAgIGNoYXJzV3JpdHRlbiArPSBsZW47CisgICAgICAgIGNiLmFwcGVuZChzYik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFwcGVuZCBhIHN0cmluZyB0byB0aGUgYnVmZmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHMsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHN1c3BlbmRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzdGF0ZT1DSEFSX1NUQVRFOworCisgICAgICAgIGNoYXJzV3JpdHRlbiArPSBsZW47CisgICAgICAgIGlmIChzPT1udWxsKQorICAgICAgICAgICAgcz0ibnVsbCI7CisgICAgICAgIGNiLmFwcGVuZCggcywgb2ZmLCBsZW4gKTsKKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHN1c3BlbmRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzdGF0ZSA9IENIQVJfU1RBVEU7CisgICAgICAgIGlmIChzPT1udWxsKQorICAgICAgICAgICAgcz0ibnVsbCI7CisgICAgICAgIHdyaXRlKHMsIDAsIHMubGVuZ3RoKCkpOworCisgICAgfSAKKworCisgICAgcHVibGljIHZvaWQgZmx1c2hDaGFycygpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgY2IuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgc3RhdGUgPSBCWVRFX1NUQVRFOworCisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBmbHVzaENoYXJzTmVlZGVkKCkgeworICAgICAgICByZXR1cm4gc3RhdGUgPT0gQ0hBUl9TVEFURTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBzKSB7CisgICAgICAgIGVuYyA9IHM7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZWFsV3JpdGVDaGFycyhjaGFyIGNbXSwgaW50IG9mZiwgaW50IGxlbikgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCFnb3RFbmMpCisgICAgICAgICAgICBzZXRDb252ZXJ0ZXIoKTsKKworICAgICAgICBjb252LmNvbnZlcnQoYywgb2ZmLCBsZW4pOworICAgICAgICBjb252LmZsdXNoQnVmZmVyKCk7CS8vID8/PworCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBjaGVja0NvbnZlcnRlcigpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmICghZ290RW5jKQorICAgICAgICAgICAgc2V0Q29udmVydGVyKCk7CisKKyAgICB9CisKKworICAgIHByb3RlY3RlZCB2b2lkIHNldENvbnZlcnRlcigpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChjb3lvdGVSZXNwb25zZSAhPSBudWxsKQorICAgICAgICAgICAgZW5jID0gY295b3RlUmVzcG9uc2UuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTsKKworICAgICAgICBnb3RFbmMgPSB0cnVlOworICAgICAgICBpZiAoZW5jID09IG51bGwpCisgICAgICAgICAgICBlbmMgPSBERUZBVUxUX0VOQ09ESU5HOworICAgICAgICBjb252ID0gKEMyQkNvbnZlcnRlcikgZW5jb2RlcnMuZ2V0KGVuYyk7CisgICAgICAgIGlmIChjb252ID09IG51bGwpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgICAgIGNvbnYgPSAoQzJCQ29udmVydGVyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCl7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb257CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEMyQkNvbnZlcnRlcihiYiwgZW5jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICApOyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfWNhdGNoKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSA9IGV4LmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKWU7IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udiA9IG5ldyBDMkJDb252ZXJ0ZXIoYmIsIGVuYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGVuY29kZXJzLnB1dChlbmMsIGNvbnYpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gY29tcGF0aWJpbGl0eQorCisKKyAgICAvKioKKyAgICAgKiBSZWFsIHdyaXRlIC0gdGhpcyBidWZmZXIgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaEJ5dGVzKCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBiYi5mbHVzaEJ1ZmZlcigpOworCisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IGdldEJ5dGVzV3JpdHRlbigpIHsKKyAgICAgICAgcmV0dXJuIGJ5dGVzV3JpdHRlbjsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0Q2hhcnNXcml0dGVuKCkgeworICAgICAgICByZXR1cm4gY2hhcnNXcml0dGVuOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRDb250ZW50V3JpdHRlbigpIHsKKyAgICAgICAgcmV0dXJuIGJ5dGVzV3JpdHRlbiArIGNoYXJzV3JpdHRlbjsKKyAgICB9CisKKworICAgIC8qKiAKKyAgICAgKiBUcnVlIGlmIHRoaXMgYnVmZmVyIGhhc24ndCBiZWVuIHVzZWQgKCBzaW5jZSByZWN5Y2xlKCkgKSAtCisgICAgICogaS5lLiBubyBjaGFycyBvciBieXRlcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGJ1ZmZlci4gIAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTmV3KCkgeworICAgICAgICByZXR1cm4gKGJ5dGVzV3JpdHRlbiA9PSAwKSAmJiAoY2hhcnNXcml0dGVuID09IDApOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0QnVmZmVyU2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA+IGJiLmdldExpbWl0KCkpIHsvLyA/Pz8/Pz8KKwkgICAgYmIuc2V0TGltaXQoc2l6ZSk7CisJfQorICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisKKyAgICAgICAgLy9jb3VudD0wOworICAgICAgICBiYi5yZWN5Y2xlKCk7CisgICAgICAgIGJ5dGVzV3JpdHRlbiA9IDA7CisgICAgICAgIGNiLnJlY3ljbGUoKTsKKyAgICAgICAgY2hhcnNXcml0dGVuID0gMDsKKyAgICAgICAgZ290RW5jID0gZmFsc2U7CisgICAgICAgIGVuYyA9IG51bGw7CisgICAgICAgIHN0YXRlID0gSU5JVElBTF9TVEFURTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0QnVmZmVyU2l6ZSgpIHsKKwlyZXR1cm4gYmIuZ2V0TGltaXQoKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9SZXF1ZXN0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL1JlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzE4NTlhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9SZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwyNTQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yOworCisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlJlcXVlc3REaXNwYXRjaGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUV2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuQjJDQ29udmVydGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLk1lc3NhZ2VCeXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5TdHJpbmdDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmh0dHAuQ29va2llczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmh0dHAuRmFzdEh0dHBEYXRlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuaHR0cC5QYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuaHR0cC5TZXJ2ZXJDb29raWU7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5odHRwLm1hcHBlci5NYXBwaW5nRGF0YTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY295b3RlLkFjdGlvbkNvZGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5XcmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5BcHBsaWNhdGlvbkZpbHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5HZW5lcmljUHJpbmNpcGFsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5FbnVtZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5QYXJhbWV0ZXJNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlJlcXVlc3RVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdQYXJzZXI7CisKKworLyoqCisgKiBXcmFwcGVyIG9iamVjdCBmb3IgdGhlIENveW90ZSByZXF1ZXN0LgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVxdWVzdAorICAgIGltcGxlbWVudHMgSHR0cFNlcnZsZXRSZXF1ZXN0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIEVuc3VyZSB0aGF0IGNsYXNzZXMgYXJlIGxvYWRlZCBmb3IgU00KKyAgICAgICAgbmV3IFN0cmluZ0NhY2hlLkJ5dGVFbnRyeSgpOworICAgICAgICBuZXcgU3RyaW5nQ2FjaGUuQ2hhckVudHJ5KCk7CisgICAgfQorCisgICAgcHVibGljIFJlcXVlc3QoKSB7CisKKyAgICAgICAgZm9ybWF0c1swXS5zZXRUaW1lWm9uZShHTVRfWk9ORSk7CisgICAgICAgIGZvcm1hdHNbMV0uc2V0VGltZVpvbmUoR01UX1pPTkUpOworICAgICAgICBmb3JtYXRzWzJdLnNldFRpbWVab25lKEdNVF9aT05FKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIENveW90ZSByZXF1ZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmNveW90ZS5SZXF1ZXN0IGNveW90ZVJlcXVlc3Q7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENveW90ZSByZXF1ZXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb3lvdGVSZXF1ZXN0IFRoZSBDb3lvdGUgcmVxdWVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENveW90ZVJlcXVlc3Qob3JnLmFwYWNoZS5jb3lvdGUuUmVxdWVzdCBjb3lvdGVSZXF1ZXN0KSB7CisgICAgICAgIHRoaXMuY295b3RlUmVxdWVzdCA9IGNveW90ZVJlcXVlc3Q7CisgICAgICAgIGlucHV0QnVmZmVyLnNldFJlcXVlc3QoY295b3RlUmVxdWVzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBDb3lvdGUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgb3JnLmFwYWNoZS5jb3lvdGUuUmVxdWVzdCBnZXRDb3lvdGVSZXF1ZXN0KCkgeworICAgICAgICByZXR1cm4gKHRoaXMuY295b3RlUmVxdWVzdCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWYXJpYWJsZXMKKworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUaW1lWm9uZSBHTVRfWk9ORSA9IFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBjb29raWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvb2tpZVtdIGNvb2tpZXMgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0cyB0byB1c2UgaW4gZ2V0RGF0ZUhlYWRlcigpLgorICAgICAqCisgICAgICogTm90aWNlIHRoYXQgYmVjYXVzZSBTaW1wbGVEYXRlRm9ybWF0IGlzIG5vdCB0aHJlYWQtc2FmZSwgd2UgY2FuJ3QKKyAgICAgKiBkZWNsYXJlIGZvcm1hdHNbXSBhcyBhIHN0YXRpYyB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXRzW10gPSB7CisgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJFRUUsIGRkIE1NTSB5eXl5IEhIOm1tOnNzIHp6eiIsIExvY2FsZS5VUyksCisgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJFRUVFRUUsIGRkLU1NTS15eSBISDptbTpzcyB6enoiLCBMb2NhbGUuVVMpLAorICAgICAgICBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFIE1NTU0gZCBISDptbTpzcyB5eXl5IiwgTG9jYWxlLlVTKQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIGxvY2FsZSBsYW5ndWFnZSBhbmQgY291bnRyeSBjb21wb25lbnRzIGFnYWluc3QKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBsb2NhbGVSZWdleCA9ICJbYS16QS1aXXsxLDh9IjsKKworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgTG9jYWxlIGlmIG5vbmUgYXJlIHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIExvY2FsZSBkZWZhdWx0TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdCwga2V5ZWQgYnkgYXR0cmlidXRlIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIExpc3Qgb2YgcmVhZCBvbmx5IGF0dHJpYnV0ZXMgZm9yIHRoaXMgUmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgcmVhZE9ubHlBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHByZWZlcnJlZCBMb2NhbGVzIGFzc29jYWl0ZWQgd2l0aCB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBsb2NhbGVzID0gbmV3IEFycmF5TGlzdCgpOworCisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0IGJ5IENhdGFsaW5hIGNvbXBvbmVudHMKKyAgICAgKiBhbmQgZXZlbnQgbGlzdGVuZXJzLgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IEhhc2hNYXAgbm90ZXMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBBdXRoZW50aWNhdGlvbiB0eXBlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYXV0aFR5cGUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBkaXNwYXRjaGVyIHR5cGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBkaXNwYXRjaGVyVHlwZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhc3NvY2lhdGVkIGlucHV0IGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSW5wdXRCdWZmZXIgaW5wdXRCdWZmZXIgPSBuZXcgSW5wdXRCdWZmZXIoKTsKKworCisgICAgLyoqCisgICAgICogU2VydmxldElucHV0U3RyZWFtLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb3lvdGVJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IAorICAgICAgICBuZXcgQ295b3RlSW5wdXRTdHJlYW0oaW5wdXRCdWZmZXIpOworCisKKyAgICAvKioKKyAgICAgKiBSZWFkZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIENveW90ZVJlYWRlciByZWFkZXIgPSBuZXcgQ295b3RlUmVhZGVyKGlucHV0QnVmZmVyKTsKKworCisgICAgLyoqCisgICAgICogVXNpbmcgc3RyZWFtIGZsYWcuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNpbmdJbnB1dFN0cmVhbSA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBVc2luZyB3cml0ZXIgZmxhZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2luZ1JlYWRlciA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBVc2VyIHByaW5jaXBhbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJpbmNpcGFsIHVzZXJQcmluY2lwYWwgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBTZXNzaW9uIHBhcnNlZCBmbGFnLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHNlc3Npb25QYXJzZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogUmVxdWVzdCBwYXJhbWV0ZXJzIHBhcnNlZCBmbGFnLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHBhcmFtZXRlcnNQYXJzZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogQ29va2llcyBwYXJzZWQgZmxhZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb29raWVzUGFyc2VkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFNlY3VyZSBmbGFnLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHNlY3VyZSA9IGZhbHNlOworCisgICAgCisgICAgLyoqCisgICAgICogVGhlIFN1YmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IEFjY2Vzc0NvbnRyb2xsZXJDb250ZXh0CisgICAgICovCisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBTdWJqZWN0IHN1YmplY3QgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBQb3N0IGRhdGEgYnVmZmVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgaW50IENBQ0hFRF9QT1NUX0xFTiA9IDgxOTI7CisgICAgcHJvdGVjdGVkIGJ5dGVbXSBwb3N0RGF0YSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEhhc2ggbWFwIHVzZWQgaW4gdGhlIGdldFBhcmFtZXRlcnNNYXAgbWV0aG9kLgorICAgICAqLworICAgIHByb3RlY3RlZCBQYXJhbWV0ZXJNYXAgcGFyYW1ldGVyTWFwID0gbmV3IFBhcmFtZXRlck1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBzZXNzaW9uIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IHJlcXVlc3QgZGlzcGF0Y2hlciBwYXRoLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgcmVxdWVzdERpc3BhdGNoZXJQYXRoID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogV2FzIHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBJRCByZWNlaXZlZCBpbiBhIGNvb2tpZT8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1ZXN0ZWRTZXNzaW9uQ29va2llID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBJRCAoaWYgYW55KSBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVxdWVzdGVkU2Vzc2lvbklkID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogV2FzIHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBJRCByZWNlaXZlZCBpbiBhIFVSTD8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1ZXN0ZWRTZXNzaW9uVVJMID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIGxvY2FsZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbG9jYWxlc1BhcnNlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIHBhcnNlciB3ZSB3aWxsIHVzZSBmb3IgcGFyc2luZyByZXF1ZXN0IGxpbmVzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nUGFyc2VyIHBhcnNlciA9IG5ldyBTdHJpbmdQYXJzZXIoKTsKKworCisgICAgLyoqCisgICAgICogTG9jYWwgcG9ydAorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgbG9jYWxQb3J0ID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgYWRkcmVzcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlbW90ZUFkZHIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgaG9zdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlbW90ZUhvc3QgPSBudWxsOworCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3RlIHBvcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHJlbW90ZVBvcnQgPSAtMTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBMb2NhbCBhZGRyZXNzCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBsb2NhbEFkZHIgPSBudWxsOworCisgICAgCisgICAgLyoqCisgICAgICogTG9jYWwgYWRkcmVzcworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbG9jYWxOYW1lID0gbnVsbDsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUmVsZWFzZSBhbGwgb2JqZWN0IHJlZmVyZW5jZXMsIGFuZCBpbml0aWFsaXplIGluc3RhbmNlIHZhcmlhYmxlcywgaW4KKyAgICAgKiBwcmVwYXJhdGlvbiBmb3IgcmV1c2Ugb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKKworICAgICAgICBjb250ZXh0ID0gbnVsbDsKKyAgICAgICAgd3JhcHBlciA9IG51bGw7CisKKyAgICAgICAgZGlzcGF0Y2hlclR5cGUgPSBudWxsOworICAgICAgICByZXF1ZXN0RGlzcGF0Y2hlclBhdGggPSBudWxsOworCisgICAgICAgIGF1dGhUeXBlID0gbnVsbDsKKyAgICAgICAgaW5wdXRCdWZmZXIucmVjeWNsZSgpOworICAgICAgICB1c2luZ0lucHV0U3RyZWFtID0gZmFsc2U7CisgICAgICAgIHVzaW5nUmVhZGVyID0gZmFsc2U7CisgICAgICAgIHVzZXJQcmluY2lwYWwgPSBudWxsOworICAgICAgICBzdWJqZWN0ID0gbnVsbDsKKyAgICAgICAgc2Vzc2lvblBhcnNlZCA9IGZhbHNlOworICAgICAgICBwYXJhbWV0ZXJzUGFyc2VkID0gZmFsc2U7CisgICAgICAgIGNvb2tpZXNQYXJzZWQgPSBmYWxzZTsKKyAgICAgICAgbG9jYWxlcy5jbGVhcigpOworICAgICAgICBsb2NhbGVzUGFyc2VkID0gZmFsc2U7CisgICAgICAgIHNlY3VyZSA9IGZhbHNlOworICAgICAgICByZW1vdGVBZGRyID0gbnVsbDsKKyAgICAgICAgcmVtb3RlSG9zdCA9IG51bGw7CisgICAgICAgIHJlbW90ZVBvcnQgPSAtMTsKKyAgICAgICAgbG9jYWxQb3J0ID0gLTE7CisgICAgICAgIGxvY2FsQWRkciA9IG51bGw7CisgICAgICAgIGxvY2FsTmFtZSA9IG51bGw7CisKKyAgICAgICAgYXR0cmlidXRlcy5jbGVhcigpOworICAgICAgICBub3Rlcy5jbGVhcigpOworICAgICAgICBjb29raWVzID0gbnVsbDsKKworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXNzaW9uLmVuZEFjY2VzcygpOworICAgICAgICB9CisgICAgICAgIHNlc3Npb24gPSBudWxsOworICAgICAgICByZXF1ZXN0ZWRTZXNzaW9uQ29va2llID0gZmFsc2U7CisgICAgICAgIHJlcXVlc3RlZFNlc3Npb25JZCA9IG51bGw7CisgICAgICAgIHJlcXVlc3RlZFNlc3Npb25VUkwgPSBmYWxzZTsKKworICAgICAgICBwYXJhbWV0ZXJNYXAuc2V0TG9ja2VkKGZhbHNlKTsKKyAgICAgICAgcGFyYW1ldGVyTWFwLmNsZWFyKCk7CisKKyAgICAgICAgbWFwcGluZ0RhdGEucmVjeWNsZSgpOworCisgICAgICAgIGlmIChDb25zdGFudHMuU0VDVVJJVFkpIHsKKyAgICAgICAgICAgIGlmIChmYWNhZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZhY2FkZS5jbGVhcigpOworICAgICAgICAgICAgICAgIGZhY2FkZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVhZGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXF1ZXN0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlZCBDYXRhbGluYSBjb25uZWN0b3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbm5lY3RvciBjb25uZWN0b3I7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENvbm5lY3RvciB0aHJvdWdoIHdoaWNoIHRoaXMgUmVxdWVzdCB3YXMgcmVjZWl2ZWQuCisgICAgICovCisgICAgcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5jb25uZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29ubmVjdG9yIHRocm91Z2ggd2hpY2ggdGhpcyBSZXF1ZXN0IHdhcyByZWNlaXZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0b3IgVGhlIG5ldyBjb25uZWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0b3IoQ29ubmVjdG9yIGNvbm5lY3RvcikgeworICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFzc29jaWF0ZWQgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29udGV4dCB3aXRoaW4gd2hpY2ggdGhpcyBSZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gKHRoaXMuY29udGV4dCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENvbnRleHQgd2l0aGluIHdoaWNoIHRoaXMgUmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQuICBUaGlzCisgICAgICogbXVzdCBiZSBjYWxsZWQgYXMgc29vbiBhcyB0aGUgYXBwcm9wcmlhdGUgQ29udGV4dCBpcyBpZGVudGlmaWVkLCBiZWNhdXNlCisgICAgICogaXQgaWRlbnRpZmllcyB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0Q29udGV4dFBhdGgoKTwvY29kZT4sCisgICAgICogYW5kIHRodXMgZW5hYmxlcyBwYXJzaW5nIG9mIHRoZSByZXF1ZXN0IFVSSS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBuZXdseSBhc3NvY2lhdGVkIENvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmlsdGVyIGNoYWluIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsdGVyQ2hhaW4gZmlsdGVyQ2hhaW4gPSBudWxsOworCisgICAgLyoqCisgICAgICogR2V0IGZpbHRlciBjaGFpbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIEZpbHRlckNoYWluIGdldEZpbHRlckNoYWluKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZmlsdGVyQ2hhaW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBmaWx0ZXIgY2hhaW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBmaWx0ZXJDaGFpbiBuZXcgZmlsdGVyIGNoYWluCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyQ2hhaW4oRmlsdGVyQ2hhaW4gZmlsdGVyQ2hhaW4pIHsKKyAgICAgICAgdGhpcy5maWx0ZXJDaGFpbiA9IGZpbHRlckNoYWluOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBIb3N0IHdpdGhpbiB3aGljaCB0aGlzIFJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkLgorICAgICAqLworICAgIHB1YmxpYyBIb3N0IGdldEhvc3QoKSB7CisgICAgICAgIGlmIChnZXRDb250ZXh0KCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gKEhvc3QpIGdldENvbnRleHQoKS5nZXRQYXJlbnQoKTsKKyAgICAgICAgLy9yZXR1cm4gKChIb3N0KSBtYXBwaW5nRGF0YS5ob3N0KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgSG9zdCB3aXRoaW4gd2hpY2ggdGhpcyBSZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4gIFRoaXMKKyAgICAgKiBtdXN0IGJlIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBhcHByb3ByaWF0ZSBIb3N0IGlzIGlkZW50aWZpZWQsIGFuZAorICAgICAqIGJlZm9yZSB0aGUgUmVxdWVzdCBpcyBwYXNzZWQgdG8gYSBjb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGhvc3QgVGhlIG5ld2x5IGFzc29jaWF0ZWQgSG9zdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvc3QoSG9zdCBob3N0KSB7CisgICAgICAgIG1hcHBpbmdEYXRhLmhvc3QgPSBob3N0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBSZXF1ZXN0IGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jb3lvdGUuY2F0YWxpbmEuQ295b3RlUmVxdWVzdC8xLjAiOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUmVxdWVzdCBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisgICAgICAgIHJldHVybiAoaW5mbyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNYXBwaW5nIGRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hcHBpbmdEYXRhIG1hcHBpbmdEYXRhID0gbmV3IE1hcHBpbmdEYXRhKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbWFwcGluZyBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBNYXBwaW5nRGF0YSBnZXRNYXBwaW5nRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nRGF0YSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmFjYWRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlcXVlc3RGYWNhZGUgZmFjYWRlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgPGNvZGU+U2VydmxldFJlcXVlc3Q8L2NvZGU+IGZvciB3aGljaCB0aGlzIG9iamVjdAorICAgICAqIGlzIHRoZSBmYWNhZGUuICBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuCisgICAgICovCisgICAgcHVibGljIEh0dHBTZXJ2bGV0UmVxdWVzdCBnZXRSZXF1ZXN0KCkgeworICAgICAgICBpZiAoZmFjYWRlID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhY2FkZSA9IG5ldyBSZXF1ZXN0RmFjYWRlKHRoaXMpOworICAgICAgICB9IAorICAgICAgICByZXR1cm4gKGZhY2FkZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzcG9uc2Ugd2l0aCB3aGljaCB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBSZXNwb25zZSB3aXRoIHdoaWNoIHRoaXMgUmVxdWVzdCBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZSBnZXRSZXNwb25zZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlc3BvbnNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFJlc3BvbnNlIHdpdGggd2hpY2ggdGhpcyBSZXF1ZXN0IGlzIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIG5ldyBhc3NvY2lhdGVkIHJlc3BvbnNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2Uob3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5wdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldFN0cmVhbSgpIHsKKyAgICAgICAgaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IENveW90ZUlucHV0U3RyZWFtKGlucHV0QnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW07CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbnB1dCBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIG5ldyBpbnB1dCBzdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtKSB7CisgICAgICAgIC8vIElnbm9yZQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVVJJIGJ5dGUgdG8gY2hhciBjb252ZXJ0ZXIgKG5vdCByZWN5Y2xlZCkuCisgICAgICovCisgICAgcHJvdGVjdGVkIEIyQ0NvbnZlcnRlciBVUklDb252ZXJ0ZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBVUkkgY29udmVydGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBCMkNDb252ZXJ0ZXIgZ2V0VVJJQ29udmVydGVyKCkgeworICAgICAgICByZXR1cm4gVVJJQ29udmVydGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgVVJJIGNvbnZlcnRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gVVJJQ29udmVydGVyIHRoZSBuZXcgVVJJIGNvbm52ZXJ0ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVUklDb252ZXJ0ZXIoQjJDQ29udmVydGVyIFVSSUNvbnZlcnRlcikgeworICAgICAgICB0aGlzLlVSSUNvbnZlcnRlciA9IFVSSUNvbnZlcnRlcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFzc29jaWF0ZWQgd3JhcHBlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgV3JhcHBlciB3cmFwcGVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgV3JhcHBlciB3aXRoaW4gd2hpY2ggdGhpcyBSZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV3JhcHBlciBnZXRXcmFwcGVyKCkgeworICAgICAgICByZXR1cm4gKHRoaXMud3JhcHBlcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFdyYXBwZXIgd2l0aGluIHdoaWNoIHRoaXMgUmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQuICBUaGlzCisgICAgICogbXVzdCBiZSBjYWxsZWQgYXMgc29vbiBhcyB0aGUgYXBwcm9wcmlhdGUgV3JhcHBlciBpcyBpZGVudGlmaWVkLCBhbmQKKyAgICAgKiBiZWZvcmUgdGhlIFJlcXVlc3QgaXMgdWx0aW1hdGVseSBwYXNzZWQgdG8gYW4gYXBwbGljYXRpb24gc2VydmxldC4KKyAgICAgKiBAcGFyYW0gd3JhcHBlciBUaGUgbmV3bHkgYXNzb2NpYXRlZCBXcmFwcGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V3JhcHBlcihXcmFwcGVyIHdyYXBwZXIpIHsKKyAgICAgICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVxdWVzdCBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIFNlcnZsZXRJbnB1dFN0cmVhbSB0byByZWFkIHRoZSBjb250ZW50CisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0SW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW0oKSAKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IENveW90ZUlucHV0U3RyZWFtKGlucHV0QnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW07CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHdoYXRldmVyIGFjdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGZsdXNoIGFuZCBjbG9zZSB0aGUgaW5wdXQKKyAgICAgKiBzdHJlYW0gb3IgcmVhZGVyLCBpbiBhIHNpbmdsZSBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaW5pc2hSZXF1ZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGhlIHJlYWRlciBhbmQgaW5wdXQgc3RyZWFtIGRvbid0IG5lZWQgdG8gYmUgY2xvc2VkCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBib3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB0byB0aGUgaW50ZXJuYWwgbm90ZXMKKyAgICAgKiBmb3IgdGhpcyByZXF1ZXN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGJpbmRpbmcgZXhpc3RzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgbm90ZSB0byBiZSByZXR1cm5lZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0Tm90ZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gKG5vdGVzLmdldChuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gSXRlcmF0b3IgY29udGFpbmluZyB0aGUgU3RyaW5nIG5hbWVzIG9mIGFsbCBub3RlcyBiaW5kaW5ncworICAgICAqIHRoYXQgZXhpc3QgZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Tm90ZU5hbWVzKCkgeworICAgICAgICByZXR1cm4gKG5vdGVzLmtleVNldCgpLml0ZXJhdG9yKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBvYmplY3QgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSBpbnRlcm5hbCBub3RlcworICAgICAqIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBub3RlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIG5vdGVzLnJlbW92ZShuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmQgYW4gb2JqZWN0IHRvIGEgc3BlY2lmaWVkIG5hbWUgaW4gdGhlIGludGVybmFsIG5vdGVzIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoaXMgcmVxdWVzdCwgcmVwbGFjaW5nIGFueSBleGlzdGluZyBiaW5kaW5nIGZvciB0aGlzIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIHRvIHdoaWNoIHRoZSBvYmplY3Qgc2hvdWxkIGJlIGJvdW5kCisgICAgICogQHBhcmFtIHZhbHVlIE9iamVjdCB0byBiZSBib3VuZCB0byB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb3RlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgbm90ZXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29udGVudCBsZW5ndGggYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBjb250ZW50IGxlbmd0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRMZW5ndGgoaW50IGxlbmd0aCkgeworICAgICAgICAvLyBOb3QgdXNlZAorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb250ZW50IHR5cGUgKGFuZCBvcHRpb25hbGx5IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcpCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdC4gIEZvciBleGFtcGxlLAorICAgICAqIDxjb2RlPnRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS00PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIFRoZSBuZXcgY29udGVudCB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgLy8gTm90IHVzZWQKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJvdG9jb2wgbmFtZSBhbmQgdmVyc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3RvY29sIFByb3RvY29sIG5hbWUgYW5kIHZlcnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm90b2NvbChTdHJpbmcgcHJvdG9jb2wpIHsKKyAgICAgICAgLy8gTm90IHVzZWQKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIGNsaWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlbW90ZUFkZHIgVGhlIHJlbW90ZSBJUCBhZGRyZXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlQWRkcihTdHJpbmcgcmVtb3RlQWRkcikgeworICAgICAgICAvLyBOb3QgdXNlZAorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgcmVtb3RlIGNsaWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIFJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVtb3RlSG9zdCBUaGUgcmVtb3RlIGhvc3QgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZUhvc3QoU3RyaW5nIHJlbW90ZUhvc3QpIHsKKyAgICAgICAgLy8gTm90IHVzZWQKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgc2NoZW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuICBUeXBpY2FsIHZhbHVlcworICAgICAqIGFyZSA8Y29kZT5odHRwPC9jb2RlPiwgPGNvZGU+aHR0cHM8L2NvZGU+LCBhbmQgPGNvZGU+ZnRwPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY2hlbWUgVGhlIHNjaGVtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtZShTdHJpbmcgc2NoZW1lKSB7CisgICAgICAgIC8vIE5vdCB1c2VkCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGJ5IDxjb2RlPmlzU2VjdXJlKCk8L2NvZGU+CisgICAgICogZm9yIHRoaXMgUmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWN1cmUgVGhlIG5ldyBpc1NlY3VyZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlY3VyZShib29sZWFuIHNlY3VyZSkgeworICAgICAgICB0aGlzLnNlY3VyZSA9IHNlY3VyZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgc2VydmVyICh2aXJ0dWFsIGhvc3QpIHRvIHByb2Nlc3MgdGhpcyByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHNlcnZlciBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VydmVyTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBjb3lvdGVSZXF1ZXN0LnNlcnZlck5hbWUoKS5zZXRTdHJpbmcobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBzZXJ2ZXIgdG8gcHJvY2VzcyB0aGlzIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9ydCBUaGUgc2VydmVyIHBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQb3J0KGludCBwb3J0KSB7CisgICAgICAgIGNveW90ZVJlcXVlc3Quc2V0U2VydmVyUG9ydChwb3J0KTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VydmxldFJlcXVlc3QgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCByZXF1ZXN0IGF0dHJpYnV0ZSBpZiBpdCBleGlzdHM7IG90aGVyd2lzZSwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB0byByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChuYW1lLmVxdWFscyhHbG9iYWxzLkRJU1BBVENIRVJfVFlQRV9BVFRSKSkgeworICAgICAgICAgICAgcmV0dXJuIChkaXNwYXRjaGVyVHlwZSA9PSBudWxsKSAKKyAgICAgICAgICAgICAgICA/IEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeS5SRVFVRVNUX0lOVEVHRVIKKyAgICAgICAgICAgICAgICA6IGRpc3BhdGNoZXJUeXBlOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKEdsb2JhbHMuRElTUEFUQ0hFUl9SRVFVRVNUX1BBVEhfQVRUUikpIHsKKyAgICAgICAgICAgIHJldHVybiAocmVxdWVzdERpc3BhdGNoZXJQYXRoID09IG51bGwpIAorICAgICAgICAgICAgICAgID8gZ2V0UmVxdWVzdFBhdGhNQigpLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICA6IHJlcXVlc3REaXNwYXRjaGVyUGF0aC50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IGF0dHI9YXR0cmlidXRlcy5nZXQobmFtZSk7CisKKyAgICAgICAgaWYoYXR0ciE9bnVsbCkKKyAgICAgICAgICAgIHJldHVybihhdHRyKTsKKworICAgICAgICBhdHRyID0gIGNveW90ZVJlcXVlc3QuZ2V0QXR0cmlidXRlKG5hbWUpOworICAgICAgICBpZihhdHRyICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gYXR0cjsKKyAgICAgICAgaWYoIGlzU1NMQXR0cmlidXRlKG5hbWUpICkgeworICAgICAgICAgICAgY295b3RlUmVxdWVzdC5hY3Rpb24oQWN0aW9uQ29kZS5BQ1RJT05fUkVRX1NTTF9BVFRSSUJVVEUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY295b3RlUmVxdWVzdCk7CisgICAgICAgICAgICBhdHRyID0gY295b3RlUmVxdWVzdC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5DRVJUSUZJQ0FURVNfQVRUUik7CisgICAgICAgICAgICBpZiggYXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoR2xvYmFscy5DRVJUSUZJQ0FURVNfQVRUUiwgYXR0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRyID0gY295b3RlUmVxdWVzdC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5DSVBIRVJfU1VJVEVfQVRUUik7CisgICAgICAgICAgICBpZihhdHRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChHbG9iYWxzLkNJUEhFUl9TVUlURV9BVFRSLCBhdHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dHIgPSBjb3lvdGVSZXF1ZXN0LmdldEF0dHJpYnV0ZShHbG9iYWxzLktFWV9TSVpFX0FUVFIpOworICAgICAgICAgICAgaWYoYXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoR2xvYmFscy5LRVlfU0laRV9BVFRSLCBhdHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dHIgPSBjb3lvdGVSZXF1ZXN0LmdldEF0dHJpYnV0ZShHbG9iYWxzLlNTTF9TRVNTSU9OX0lEX0FUVFIpOworICAgICAgICAgICAgaWYoYXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoR2xvYmFscy5TU0xfU0VTU0lPTl9JRF9BVFRSLCBhdHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dHIgPSBhdHRyaWJ1dGVzLmdldChuYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXR0cjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRlc3QgaWYgYSBnaXZlbiBuYW1lIGlzIG9uZSBvZiB0aGUgc3BlY2lhbCBTZXJ2bGV0LXNwZWMgU1NMIGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gaXNTU0xBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIEdsb2JhbHMuQ0VSVElGSUNBVEVTX0FUVFIuZXF1YWxzKG5hbWUpIHx8CisgICAgICAgICAgICBHbG9iYWxzLkNJUEhFUl9TVUlURV9BVFRSLmVxdWFscyhuYW1lKSB8fAorICAgICAgICAgICAgR2xvYmFscy5LRVlfU0laRV9BVFRSLmVxdWFscyhuYW1lKSAgfHwKKyAgICAgICAgICAgIEdsb2JhbHMuU1NMX1NFU1NJT05fSURfQVRUUi5lcXVhbHMobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgcmVxdWVzdCBhdHRyaWJ1dGVzIGZvciB0aGlzIFJlcXVlc3QsIG9yIGFuCisgICAgICogZW1wdHkgPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IGlmIHRoZXJlIGFyZSBub25lLgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVOYW1lcygpIHsKKyAgICAgICAgaWYgKGlzU2VjdXJlKCkpIHsKKyAgICAgICAgICAgIGdldEF0dHJpYnV0ZShHbG9iYWxzLkNFUlRJRklDQVRFU19BVFRSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEVudW1lcmF0b3IoYXR0cmlidXRlcy5rZXlTZXQoKSwgdHJ1ZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBlbmNvZGluZyBmb3IgdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSB7CisgICAgICByZXR1cm4gKGNveW90ZVJlcXVlc3QuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbnRlbnQgbGVuZ3RoIGZvciB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gKGNveW90ZVJlcXVlc3QuZ2V0Q29udGVudExlbmd0aCgpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29udGVudCB0eXBlIGZvciB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIChjb3lvdGVSZXF1ZXN0LmdldENvbnRlbnRUeXBlKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJ2bGV0IGlucHV0IHN0cmVhbSBmb3IgdGhpcyBSZXF1ZXN0LiAgVGhlIGRlZmF1bHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgc2VydmxldCBpbnB1dCBzdHJlYW0gY3JlYXRlZCBieQorICAgICAqIDxjb2RlPmNyZWF0ZUlucHV0U3RyZWFtKCk8L2NvZGU+LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+Z2V0UmVhZGVyKCk8L2NvZGU+IGhhcworICAgICAqICBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHJlcXVlc3QKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAodXNpbmdSZWFkZXIpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiY295b3RlUmVxdWVzdC5nZXRJbnB1dFN0cmVhbS5pc2UiKSk7CisKKyAgICAgICAgdXNpbmdJbnB1dFN0cmVhbSA9IHRydWU7CisgICAgICAgIGlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBDb3lvdGVJbnB1dFN0cmVhbShpbnB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlucHV0U3RyZWFtOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByZWZlcnJlZCBMb2NhbGUgdGhhdCB0aGUgY2xpZW50IHdpbGwgYWNjZXB0IGNvbnRlbnQgaW4sCisgICAgICogYmFzZWQgb24gdGhlIHZhbHVlIGZvciB0aGUgZmlyc3QgPGNvZGU+QWNjZXB0LUxhbmd1YWdlPC9jb2RlPiBoZWFkZXIKKyAgICAgKiB0aGF0IHdhcyBlbmNvdW50ZXJlZC4gIElmIHRoZSByZXF1ZXN0IGRpZCBub3Qgc3BlY2lmeSBhIHByZWZlcnJlZAorICAgICAqIGxhbmd1YWdlLCB0aGUgc2VydmVyJ3MgZGVmYXVsdCBMb2NhbGUgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7CisKKyAgICAgICAgaWYgKCFsb2NhbGVzUGFyc2VkKQorICAgICAgICAgICAgcGFyc2VMb2NhbGVzKCk7CisKKyAgICAgICAgaWYgKGxvY2FsZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgcmV0dXJuICgoTG9jYWxlKSBsb2NhbGVzLmdldCgwKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKGRlZmF1bHRMb2NhbGUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIHByZWZlcnJlZCBMb2NhbGVzIHRoYXQgdGhlIGNsaWVudCB3aWxsIGFjY2VwdAorICAgICAqIGNvbnRlbnQgaW4sIGJhc2VkIG9uIHRoZSB2YWx1ZXMgZm9yIGFueSA8Y29kZT5BY2NlcHQtTGFuZ3VhZ2U8L2NvZGU+CisgICAgICogaGVhZGVycyB0aGF0IHdlcmUgZW5jb3VudGVyZWQuICBJZiB0aGUgcmVxdWVzdCBkaWQgbm90IHNwZWNpZnkgYQorICAgICAqIHByZWZlcnJlZCBsYW5ndWFnZSwgdGhlIHNlcnZlcidzIGRlZmF1bHQgTG9jYWxlIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRMb2NhbGVzKCkgeworCisgICAgICAgIGlmICghbG9jYWxlc1BhcnNlZCkKKyAgICAgICAgICAgIHBhcnNlTG9jYWxlcygpOworCisgICAgICAgIGlmIChsb2NhbGVzLnNpemUoKSA+IDApCisgICAgICAgICAgICByZXR1cm4gKG5ldyBFbnVtZXJhdG9yKGxvY2FsZXMpKTsKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHJlc3VsdHMuYWRkKGRlZmF1bHRMb2NhbGUpOworICAgICAgICByZXR1cm4gKG5ldyBFbnVtZXJhdG9yKHJlc3VsdHMpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgcGFyYW1ldGVyLCBpZiBhbnk7IG90aGVyd2lzZSwKKyAgICAgKiByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uICBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHZhbHVlIGRlZmluZWQsCisgICAgICogcmV0dXJuIG9ubHkgdGhlIGZpcnN0IG9uZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGRlc2lyZWQgcmVxdWVzdCBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmICghcGFyYW1ldGVyc1BhcnNlZCkKKyAgICAgICAgICAgIHBhcnNlUGFyYW1ldGVycygpOworCisgICAgICAgIHJldHVybiBjb3lvdGVSZXF1ZXN0LmdldFBhcmFtZXRlcnMoKS5nZXRQYXJhbWV0ZXIobmFtZSk7CisKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIDxjb2RlPk1hcDwvY29kZT4gb2YgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyByZXF1ZXN0LgorICAgICAqIFJlcXVlc3QgcGFyYW1ldGVycyBhcmUgZXh0cmEgaW5mb3JtYXRpb24gc2VudCB3aXRoIHRoZSByZXF1ZXN0LgorICAgICAqIEZvciBIVFRQIHNlcnZsZXRzLCBwYXJhbWV0ZXJzIGFyZSBjb250YWluZWQgaW4gdGhlIHF1ZXJ5IHN0cmluZworICAgICAqIG9yIHBvc3RlZCBmb3JtIGRhdGEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgPGNvZGU+TWFwPC9jb2RlPiBjb250YWluaW5nIHBhcmFtZXRlciBuYW1lcyBhcyBrZXlzCisgICAgICogIGFuZCBwYXJhbWV0ZXIgdmFsdWVzIGFzIG1hcCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIE1hcCBnZXRQYXJhbWV0ZXJNYXAoKSB7CisKKyAgICAgICAgaWYgKHBhcmFtZXRlck1hcC5pc0xvY2tlZCgpKQorICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlck1hcDsKKworICAgICAgICBFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IGdldFBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBnZXRQYXJhbWV0ZXJWYWx1ZXMobmFtZSk7CisgICAgICAgICAgICBwYXJhbWV0ZXJNYXAucHV0KG5hbWUsIHZhbHVlcyk7CisgICAgICAgIH0KKworICAgICAgICBwYXJhbWV0ZXJNYXAuc2V0TG9ja2VkKHRydWUpOworCisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJNYXA7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIGRlZmluZWQgcmVxdWVzdCBwYXJhbWV0ZXJzIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFBhcmFtZXRlck5hbWVzKCkgeworCisgICAgICAgIGlmICghcGFyYW1ldGVyc1BhcnNlZCkKKyAgICAgICAgICAgIHBhcnNlUGFyYW1ldGVycygpOworCisgICAgICAgIHJldHVybiBjb3lvdGVSZXF1ZXN0LmdldFBhcmFtZXRlcnMoKS5nZXRQYXJhbWV0ZXJOYW1lcygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlZmluZWQgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgcGFyYW1ldGVyLCBpZiBhbnk7CisgICAgICogb3RoZXJ3aXNlLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBkZXNpcmVkIHJlcXVlc3QgcGFyYW1ldGVyCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmICghcGFyYW1ldGVyc1BhcnNlZCkKKyAgICAgICAgICAgIHBhcnNlUGFyYW1ldGVycygpOworCisgICAgICAgIHJldHVybiBjb3lvdGVSZXF1ZXN0LmdldFBhcmFtZXRlcnMoKS5nZXRQYXJhbWV0ZXJWYWx1ZXMobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJvdG9jb2wgYW5kIHZlcnNpb24gdXNlZCB0byBtYWtlIHRoaXMgUmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgeworICAgICAgICByZXR1cm4gY295b3RlUmVxdWVzdC5wcm90b2NvbCgpLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBSZWFkZXIgd3JhcHBpbmcgdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhpcyBSZXF1ZXN0LiAgVGhlCisgICAgICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhIDxjb2RlPkJ1ZmZlcmVkUmVhZGVyPC9jb2RlPiBhcm91bmQgdGhlCisgICAgICogc2VydmxldCBpbnB1dCBzdHJlYW0gcmV0dXJuZWQgYnkgPGNvZGU+Y3JlYXRlSW5wdXRTdHJlYW0oKTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiA8Y29kZT5nZXRJbnB1dFN0cmVhbSgpPC9jb2RlPgorICAgICAqICBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXF1ZXN0CisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEJ1ZmZlcmVkUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHVzaW5nSW5wdXRTdHJlYW0pCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiY295b3RlUmVxdWVzdC5nZXRSZWFkZXIuaXNlIikpOworCisgICAgICAgIHVzaW5nUmVhZGVyID0gdHJ1ZTsKKyAgICAgICAgaW5wdXRCdWZmZXIuY2hlY2tDb252ZXJ0ZXIoKTsKKyAgICAgICAgaWYgKHJlYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZWFkZXIgPSBuZXcgQ295b3RlUmVhZGVyKGlucHV0QnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVhZGVyOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlYWwgcGF0aCBvZiB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggdG8gYmUgdHJhbnNsYXRlZAorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgdmVyc2lvbiAyLjEgb2YgdGhlIEphdmEgU2VydmxldCBBUEksIHVzZQorICAgICAqICA8Y29kZT5TZXJ2bGV0Q29udGV4dC5nZXRSZWFsUGF0aCgpPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxQYXRoKFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0ID0gY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgICAgICBpZiAoc2VydmxldENvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHNlcnZsZXRDb250ZXh0LmdldFJlYWxQYXRoKHBhdGgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlbW90ZSBJUCBhZGRyZXNzIG1ha2luZyB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVBZGRyKCkgeworICAgICAgICBpZiAocmVtb3RlQWRkciA9PSBudWxsKSB7CisgICAgICAgICAgICBjb3lvdGVSZXF1ZXN0LmFjdGlvbgorICAgICAgICAgICAgICAgIChBY3Rpb25Db2RlLkFDVElPTl9SRVFfSE9TVF9BRERSX0FUVFJJQlVURSwgY295b3RlUmVxdWVzdCk7CisgICAgICAgICAgICByZW1vdGVBZGRyID0gY295b3RlUmVxdWVzdC5yZW1vdGVBZGRyKCkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVtb3RlQWRkcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVtb3RlIGhvc3QgbmFtZSBtYWtpbmcgdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlSG9zdCgpIHsKKyAgICAgICAgaWYgKHJlbW90ZUhvc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFjb25uZWN0b3IuZ2V0RW5hYmxlTG9va3VwcygpKSB7CisgICAgICAgICAgICAgICAgcmVtb3RlSG9zdCA9IGdldFJlbW90ZUFkZHIoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY295b3RlUmVxdWVzdC5hY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgKEFjdGlvbkNvZGUuQUNUSU9OX1JFUV9IT1NUX0FUVFJJQlVURSwgY295b3RlUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgcmVtb3RlSG9zdCA9IGNveW90ZVJlcXVlc3QucmVtb3RlSG9zdCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlbW90ZUhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSW50ZXJuZXQgUHJvdG9jb2wgKElQKSBzb3VyY2UgcG9ydCBvZiB0aGUgY2xpZW50CisgICAgICogb3IgbGFzdCBwcm94eSB0aGF0IHNlbnQgdGhlIHJlcXVlc3QuCisgICAgICovICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0UmVtb3RlUG9ydCgpeworICAgICAgICBpZiAocmVtb3RlUG9ydCA9PSAtMSkgeworICAgICAgICAgICAgY295b3RlUmVxdWVzdC5hY3Rpb24KKyAgICAgICAgICAgICAgICAoQWN0aW9uQ29kZS5BQ1RJT05fUkVRX1JFTU9URVBPUlRfQVRUUklCVVRFLCBjb3lvdGVSZXF1ZXN0KTsKKyAgICAgICAgICAgIHJlbW90ZVBvcnQgPSBjb3lvdGVSZXF1ZXN0LmdldFJlbW90ZVBvcnQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVtb3RlUG9ydDsgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaG9zdCBuYW1lIG9mIHRoZSBJbnRlcm5ldCBQcm90b2NvbCAoSVApIGludGVyZmFjZSBvbgorICAgICAqIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyByZWNlaXZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpeworICAgICAgICBpZiAobG9jYWxOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIGNveW90ZVJlcXVlc3QuYWN0aW9uCisgICAgICAgICAgICAgICAgKEFjdGlvbkNvZGUuQUNUSU9OX1JFUV9MT0NBTF9OQU1FX0FUVFJJQlVURSwgY295b3RlUmVxdWVzdCk7CisgICAgICAgICAgICBsb2NhbE5hbWUgPSBjb3lvdGVSZXF1ZXN0LmxvY2FsTmFtZSgpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvY2FsTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBJbnRlcm5ldCBQcm90b2NvbCAoSVApIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZSBvbgorICAgICAqIHdoaWNoIHRoZSByZXF1ZXN0ICB3YXMgcmVjZWl2ZWQuCisgICAgICovICAgICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxBZGRyKCl7CisgICAgICAgIGlmIChsb2NhbEFkZHIgPT0gbnVsbCkgeworICAgICAgICAgICAgY295b3RlUmVxdWVzdC5hY3Rpb24KKyAgICAgICAgICAgICAgICAoQWN0aW9uQ29kZS5BQ1RJT05fUkVRX0xPQ0FMX0FERFJfQVRUUklCVVRFLCBjb3lvdGVSZXF1ZXN0KTsKKyAgICAgICAgICAgIGxvY2FsQWRkciA9IGNveW90ZVJlcXVlc3QubG9jYWxBZGRyKCkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbG9jYWxBZGRyOyAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEludGVybmV0IFByb3RvY29sIChJUCkgcG9ydCBudW1iZXIgb2YgdGhlIGludGVyZmFjZQorICAgICAqIG9uIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyByZWNlaXZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpeworICAgICAgICBpZiAobG9jYWxQb3J0ID09IC0xKXsKKyAgICAgICAgICAgIGNveW90ZVJlcXVlc3QuYWN0aW9uCisgICAgICAgICAgICAgICAgKEFjdGlvbkNvZGUuQUNUSU9OX1JFUV9MT0NBTFBPUlRfQVRUUklCVVRFLCBjb3lvdGVSZXF1ZXN0KTsKKyAgICAgICAgICAgIGxvY2FsUG9ydCA9IGNveW90ZVJlcXVlc3QuZ2V0TG9jYWxQb3J0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvY2FsUG9ydDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgUmVxdWVzdERpc3BhdGNoZXIgdGhhdCB3cmFwcyB0aGUgcmVzb3VyY2UgYXQgdGhlIHNwZWNpZmllZAorICAgICAqIHBhdGgsIHdoaWNoIG1heSBiZSBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCByZXF1ZXN0IHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSByZXNvdXJjZSB0byBiZSB3cmFwcGVkCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3REaXNwYXRjaGVyIGdldFJlcXVlc3REaXNwYXRjaGVyKFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgLy8gSWYgdGhlIHBhdGggaXMgYWxyZWFkeSBjb250ZXh0LXJlbGF0aXZlLCBqdXN0IHBhc3MgaXQgdGhyb3VnaAorICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgZWxzZSBpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpCisgICAgICAgICAgICByZXR1cm4gKGNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihwYXRoKSk7CisKKyAgICAgICAgLy8gQ29udmVydCBhIHJlcXVlc3QtcmVsYXRpdmUgcGF0aCB0byBhIGNvbnRleHQtcmVsYXRpdmUgb25lCisgICAgICAgIFN0cmluZyBzZXJ2bGV0UGF0aCA9IChTdHJpbmcpIGdldEF0dHJpYnV0ZShHbG9iYWxzLklOQ0xVREVfU0VSVkxFVF9QQVRIX0FUVFIpOworICAgICAgICBpZiAoc2VydmxldFBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHNlcnZsZXRQYXRoID0gZ2V0U2VydmxldFBhdGgoKTsKKworICAgICAgICAvLyBBZGQgdGhlIHBhdGggaW5mbywgaWYgdGhlcmUgaXMgYW55CisgICAgICAgIFN0cmluZyBwYXRoSW5mbyA9IGdldFBhdGhJbmZvKCk7CisgICAgICAgIFN0cmluZyByZXF1ZXN0UGF0aCA9IG51bGw7CisKKyAgICAgICAgaWYgKHBhdGhJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gc2VydmxldFBhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IHNlcnZsZXRQYXRoICsgcGF0aEluZm87CisgICAgICAgIH0KKworICAgICAgICBpbnQgcG9zID0gcmVxdWVzdFBhdGgubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlID0gbnVsbDsKKyAgICAgICAgaWYgKHBvcyA+PSAwKSB7CisgICAgICAgICAgICByZWxhdGl2ZSA9IFJlcXVlc3RVdGlsLm5vcm1hbGl6ZQorICAgICAgICAgICAgICAgIChyZXF1ZXN0UGF0aC5zdWJzdHJpbmcoMCwgcG9zICsgMSkgKyBwYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbGF0aXZlID0gUmVxdWVzdFV0aWwubm9ybWFsaXplKHJlcXVlc3RQYXRoICsgcGF0aCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKGNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihyZWxhdGl2ZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNjaGVtZSB1c2VkIHRvIG1ha2UgdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1lKCkgeworICAgICAgICByZXR1cm4gKGNveW90ZVJlcXVlc3Quc2NoZW1lKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlcnZlciBuYW1lIHJlc3BvbmRpbmcgdG8gdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIChjb3lvdGVSZXF1ZXN0LnNlcnZlck5hbWUoKS50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VydmVyIHBvcnQgcmVzcG9uZGluZyB0byB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZXJ2ZXJQb3J0KCkgeworICAgICAgICByZXR1cm4gKGNveW90ZVJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdhcyB0aGlzIHJlcXVlc3QgcmVjZWl2ZWQgb24gYSBzZWN1cmUgY29ubmVjdGlvbj8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIChzZWN1cmUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgcmVxdWVzdCBhdHRyaWJ1dGUgaWYgaXQgZXhpc3RzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcmVxdWVzdCBhdHRyaWJ1dGUgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKworICAgICAgICAvLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHJlYWQgb25seSBhdHRyaWJ1dGUKKyAgICAgICAgLy8gcmVxdWVzdHMgYXJlIHBlciB0aHJlYWQgc28gc3luY2hyb25pemF0aW9uIHVubmVjZXNzYXJ5CisgICAgICAgIGlmIChyZWFkT25seUF0dHJpYnV0ZXMuY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmb3VuZCA9IGF0dHJpYnV0ZXMuY29udGFpbnNLZXkobmFtZSk7CisgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgICAgdmFsdWUgPSBhdHRyaWJ1dGVzLmdldChuYW1lKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucmVtb3ZlKG5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm90aWZ5IGludGVyZXN0ZWQgYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzCisgICAgICAgIE9iamVjdCBsaXN0ZW5lcnNbXSA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25FdmVudExpc3RlbmVycygpOworICAgICAgICBpZiAoKGxpc3RlbmVycyA9PSBudWxsKSB8fCAobGlzdGVuZXJzLmxlbmd0aCA9PSAwKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVFdmVudCBldmVudCA9CisgICAgICAgICAgbmV3IFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQoY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3QoKSwgbmFtZSwgdmFsdWUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCEobGlzdGVuZXJzW2ldIGluc3RhbmNlb2YgU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVMaXN0ZW5lcikpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAoU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5hdHRyaWJ1dGVSZW1vdmVkKGV2ZW50KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoImNveW90ZVJlcXVlc3QuYXR0cmlidXRlRXZlbnQiKSwgdCk7CisgICAgICAgICAgICAgICAgLy8gRXJyb3IgdmFsdmUgd2lsbCBwaWNrIHRoaXMgZXhlY3B0aW9uIHVwIGFuZCBkaXNwbGF5IGl0IHRvIHVzZXIKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dCggR2xvYmFscy5FWENFUFRJT05fQVRUUiwgdCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwZWNpZmllZCByZXF1ZXN0IGF0dHJpYnV0ZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcmVxdWVzdCBhdHRyaWJ1dGUgdG8gc2V0CisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBhc3NvY2lhdGVkIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKwkKKyAgICAgICAgLy8gTmFtZSBjYW5ub3QgYmUgbnVsbAorICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImNveW90ZVJlcXVlc3Quc2V0QXR0cmlidXRlLm5hbWVudWxsIikpOworCisgICAgICAgIC8vIE51bGwgdmFsdWUgaXMgdGhlIHNhbWUgYXMgcmVtb3ZlQXR0cmlidXRlKCkKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYW1lLmVxdWFscyhHbG9iYWxzLkRJU1BBVENIRVJfVFlQRV9BVFRSKSkgeworICAgICAgICAgICAgZGlzcGF0Y2hlclR5cGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhHbG9iYWxzLkRJU1BBVENIRVJfUkVRVUVTVF9QQVRIX0FUVFIpKSB7CisgICAgICAgICAgICByZXF1ZXN0RGlzcGF0Y2hlclBhdGggPSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gcmVwbGFjZWQgPSBmYWxzZTsKKworICAgICAgICAvLyBBZGQgb3IgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQorICAgICAgICAvLyBDaGVjayBmb3IgcmVhZCBvbmx5IGF0dHJpYnV0ZQorICAgICAgICAvLyByZXF1ZXN0cyBhcmUgcGVyIHRocmVhZCBzbyBzeW5jaHJvbml6YXRpb24gdW5uZWNlc3NhcnkKKyAgICAgICAgaWYgKHJlYWRPbmx5QXR0cmlidXRlcy5jb250YWluc0tleShuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgb2xkVmFsdWUgPSBhdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXBsYWNlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXNzIHNwZWNpYWwgYXR0cmlidXRlcyB0byB0aGUgbmF0aXZlIGxheWVyCisgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIm9yZy5hcGFjaGUudG9tY2F0LiIpKSB7CisgICAgICAgICAgICBjb3lvdGVSZXF1ZXN0LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE5vdGlmeSBpbnRlcmVzdGVkIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVycworICAgICAgICBPYmplY3QgbGlzdGVuZXJzW10gPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcnMoKTsKKyAgICAgICAgaWYgKChsaXN0ZW5lcnMgPT0gbnVsbCkgfHwgKGxpc3RlbmVycy5sZW5ndGggPT0gMCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQgZXZlbnQgPSBudWxsOworICAgICAgICBpZiAocmVwbGFjZWQpCisgICAgICAgICAgICBldmVudCA9CisgICAgICAgICAgICAgICAgbmV3IFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQoY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3QoKSwgbmFtZSwgb2xkVmFsdWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBldmVudCA9CisgICAgICAgICAgICAgICAgbmV3IFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQoY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3QoKSwgbmFtZSwgdmFsdWUpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIShsaXN0ZW5lcnNbaV0gaW5zdGFuY2VvZiBTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlTGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgIChTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlZCkgeworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5hdHRyaWJ1dGVSZXBsYWNlZChldmVudCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuYXR0cmlidXRlQWRkZWQoZXZlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoImNveW90ZVJlcXVlc3QuYXR0cmlidXRlRXZlbnQiKSwgdCk7CisgICAgICAgICAgICAgICAgLy8gRXJyb3IgdmFsdmUgd2lsbCBwaWNrIHRoaXMgZXhlY3B0aW9uIHVwIGFuZCBkaXNwbGF5IGl0IHRvIHVzZXIKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dCggR2xvYmFscy5FWENFUFRJT05fQVRUUiwgdCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZXMgdGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB1c2VkIGluIHRoZSBib2R5IG9mCisgICAgICogdGhpcyByZXF1ZXN0LiAgVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gcmVhZGluZyByZXF1ZXN0CisgICAgICogcGFyYW1ldGVycyBvciByZWFkaW5nIGlucHV0IHVzaW5nIDxjb2RlPmdldFJlYWRlcigpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmMgVGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSB1c2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBlbmNvZGluZworICAgICAqICBpcyBub3Qgc3VwcG9ydGVkCisgICAgICoKKyAgICAgKiBAc2luY2UgU2VydmxldCAyLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgZW5jKQorICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHNwZWNpZmllZCBlbmNvZGluZyBpcyB2YWxpZAorICAgICAgICBieXRlIGJ1ZmZlcltdID0gbmV3IGJ5dGVbMV07CisgICAgICAgIGJ1ZmZlclswXSA9IChieXRlKSAnYSc7CisgICAgICAgIFN0cmluZyBkdW1teSA9IG5ldyBTdHJpbmcoYnVmZmVyLCBlbmMpOworCisgICAgICAgIC8vIFNhdmUgdGhlIHZhbGlkYXRlZCBlbmNvZGluZworICAgICAgICBjb3lvdGVSZXF1ZXN0LnNldENoYXJhY3RlckVuY29kaW5nKGVuYyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSHR0cFJlcXVlc3QgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBDb29raWUgdG8gdGhlIHNldCBvZiBDb29raWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29va2llIFRoZSBuZXcgY29va2llCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29va2llKENvb2tpZSBjb29raWUpIHsKKworICAgICAgICBpZiAoIWNvb2tpZXNQYXJzZWQpCisgICAgICAgICAgICBwYXJzZUNvb2tpZXMoKTsKKworICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgIGlmIChjb29raWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNpemUgPSBjb29raWVzLmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIENvb2tpZVtdIG5ld0Nvb2tpZXMgPSBuZXcgQ29va2llW3NpemUgKyAxXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIG5ld0Nvb2tpZXNbaV0gPSBjb29raWVzW2ldOworICAgICAgICB9CisgICAgICAgIG5ld0Nvb2tpZXNbc2l6ZV0gPSBjb29raWU7CisKKyAgICAgICAgY29va2llcyA9IG5ld0Nvb2tpZXM7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIEhlYWRlciB0byB0aGUgc2V0IG9mIEhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgaGVhZGVyIG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBoZWFkZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAvLyBOb3QgdXNlZAorICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgTG9jYWxlIHRvIHRoZSBzZXQgb2YgcHJlZmVycmVkIExvY2FsZXMgZm9yIHRoaXMgUmVxdWVzdC4gIFRoZQorICAgICAqIGZpcnN0IGFkZGVkIExvY2FsZSB3aWxsIGJlIHRoZSBmaXJzdCBvbmUgcmV0dXJuZWQgYnkgZ2V0TG9jYWxlcygpLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsZSBUaGUgbmV3IHByZWZlcnJlZCBMb2NhbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMb2NhbGUoTG9jYWxlIGxvY2FsZSkgeworICAgICAgICBsb2NhbGVzLmFkZChsb2NhbGUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgcGFyYW1ldGVyIG5hbWUgYW5kIGNvcnJlc3BvbmRpbmcgc2V0IG9mIHZhbHVlcyB0byB0aGlzIFJlcXVlc3QuCisgICAgICogKFRoaXMgaXMgdXNlZCB3aGVuIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwgcmVxdWVzdCBvbiBhIGZvcm0gYmFzZWQKKyAgICAgKiBsb2dpbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoaXMgcmVxdWVzdCBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gdmFsdWVzIENvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aGlzIHJlcXVlc3QgcGFyYW1ldGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWVzW10pIHsKKyAgICAgICAgY295b3RlUmVxdWVzdC5nZXRQYXJhbWV0ZXJzKCkuYWRkUGFyYW1ldGVyVmFsdWVzKG5hbWUsIHZhbHVlcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbGVhciB0aGUgY29sbGVjdGlvbiBvZiBDb29raWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJDb29raWVzKCkgeworICAgICAgICBjb29raWVzUGFyc2VkID0gdHJ1ZTsKKyAgICAgICAgY29va2llcyA9IG51bGw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbGVhciB0aGUgY29sbGVjdGlvbiBvZiBIZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJIZWFkZXJzKCkgeworICAgICAgICAvLyBOb3QgdXNlZAorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGNvbGxlY3Rpb24gb2YgTG9jYWxlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyTG9jYWxlcygpIHsKKyAgICAgICAgbG9jYWxlcy5jbGVhcigpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGNvbGxlY3Rpb24gb2YgcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyUGFyYW1ldGVycygpIHsKKyAgICAgICAgLy8gTm90IHVzZWQKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXV0aGVudGljYXRpb24gdHlwZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QsIGlmIGFueTsgb3RoZXJ3aXNlCisgICAgICogc2V0IHRoZSB0eXBlIHRvIDxjb2RlPm51bGw8L2NvZGU+LiAgVHlwaWNhbCB2YWx1ZXMgYXJlICJCQVNJQyIsCisgICAgICogIkRJR0VTVCIsIG9yICJTU0wiLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgVGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dGhUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHRoaXMuYXV0aFR5cGUgPSB0eXBlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb250ZXh0IHBhdGggZm9yIHRoaXMgUmVxdWVzdC4gIFRoaXMgd2lsbCBub3JtYWxseSBiZSBjYWxsZWQKKyAgICAgKiB3aGVuIHRoZSBhc3NvY2lhdGVkIENvbnRleHQgaXMgbWFwcGluZyB0aGUgUmVxdWVzdCB0byBhIHBhcnRpY3VsYXIKKyAgICAgKiBXcmFwcGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIGNvbnRleHQgcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRQYXRoKFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgbWFwcGluZ0RhdGEuY29udGV4dFBhdGguc2V0U3RyaW5nKCIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1hcHBpbmdEYXRhLmNvbnRleHRQYXRoLnNldFN0cmluZyhwYXRoKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEhUVFAgcmVxdWVzdCBtZXRob2QgdXNlZCBmb3IgdGhpcyBSZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZCBUaGUgcmVxdWVzdCBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2QoU3RyaW5nIG1ldGhvZCkgeworICAgICAgICAvLyBOb3QgdXNlZAorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoaXMgUmVxdWVzdC4gIFRoaXMgd2lsbCBub3JtYWxseSBiZSBjYWxsZWQKKyAgICAgKiBieSB0aGUgSFRUUCBDb25uZWN0b3IsIHdoZW4gaXQgcGFyc2VzIHRoZSByZXF1ZXN0IGhlYWRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHN0cmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5U3RyaW5nKFN0cmluZyBxdWVyeSkgeworICAgICAgICAvLyBOb3QgdXNlZAorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXRoIGluZm9ybWF0aW9uIGZvciB0aGlzIFJlcXVlc3QuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgY2FsbGVkCisgICAgICogd2hlbiB0aGUgYXNzb2NpYXRlZCBDb250ZXh0IGlzIG1hcHBpbmcgdGhlIFJlcXVlc3QgdG8gYSBwYXJ0aWN1bGFyCisgICAgICogV3JhcHBlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIGluZm9ybWF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0aEluZm8oU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgbWFwcGluZ0RhdGEucGF0aEluZm8uc2V0U3RyaW5nKHBhdGgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBJRCBmb3IgdGhpcworICAgICAqIHJlcXVlc3QgY2FtZSBpbiB0aHJvdWdoIGEgY29va2llLiAgVGhpcyBpcyBub3JtYWxseSBjYWxsZWQgYnkgdGhlCisgICAgICogSFRUUCBDb25uZWN0b3IsIHdoZW4gaXQgcGFyc2VzIHRoZSByZXF1ZXN0IGhlYWRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxhZyBUaGUgbmV3IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0ZWRTZXNzaW9uQ29va2llKGJvb2xlYW4gZmxhZykgeworCisgICAgICAgIHRoaXMucmVxdWVzdGVkU2Vzc2lvbkNvb2tpZSA9IGZsYWc7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVxdWVzdGVkIHNlc3Npb24gSUQgZm9yIHRoaXMgcmVxdWVzdC4gIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkCisgICAgICogYnkgdGhlIEhUVFAgQ29ubmVjdG9yLCB3aGVuIGl0IHBhcnNlcyB0aGUgcmVxdWVzdCBoZWFkZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIFRoZSBuZXcgc2Vzc2lvbiBpZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3RlZFNlc3Npb25JZChTdHJpbmcgaWQpIHsKKworICAgICAgICB0aGlzLnJlcXVlc3RlZFNlc3Npb25JZCA9IGlkOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIHJlcXVlc3RlZCBzZXNzaW9uIElEIGZvciB0aGlzCisgICAgICogcmVxdWVzdCBjYW1lIGluIHRocm91Z2ggYSBVUkwuICBUaGlzIGlzIG5vcm1hbGx5IGNhbGxlZCBieSB0aGUKKyAgICAgKiBIVFRQIENvbm5lY3Rvciwgd2hlbiBpdCBwYXJzZXMgdGhlIHJlcXVlc3QgaGVhZGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGFnIFRoZSBuZXcgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3RlZFNlc3Npb25VUkwoYm9vbGVhbiBmbGFnKSB7CisKKyAgICAgICAgdGhpcy5yZXF1ZXN0ZWRTZXNzaW9uVVJMID0gZmxhZzsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1bnBhcnNlZCByZXF1ZXN0IFVSSSBmb3IgdGhpcyBSZXF1ZXN0LiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlCisgICAgICogY2FsbGVkIGJ5IHRoZSBIVFRQIENvbm5lY3Rvciwgd2hlbiBpdCBwYXJzZXMgdGhlIHJlcXVlc3QgaGVhZGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlcXVlc3QgVVJJCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdFVSSShTdHJpbmcgdXJpKSB7CisgICAgICAgIC8vIE5vdCB1c2VkCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlY29kZWQgcmVxdWVzdCBVUkkuCisgICAgICogCisgICAgICogQHBhcmFtIHVyaSBUaGUgZGVjb2RlZCByZXF1ZXN0IFVSSQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlY29kZWRSZXF1ZXN0VVJJKFN0cmluZyB1cmkpIHsKKyAgICAgICAgLy8gTm90IHVzZWQKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGVjb2RlZCByZXF1ZXN0IFVSSS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBVUkwgZGVjb2RlZCByZXF1ZXN0IFVSSQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVjb2RlZFJlcXVlc3RVUkkoKSB7CisgICAgICAgIHJldHVybiAoY295b3RlUmVxdWVzdC5kZWNvZGVkVVJJKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlY29kZWQgcmVxdWVzdCBVUkkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgVVJMIGRlY29kZWQgcmVxdWVzdCBVUkkKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZUJ5dGVzIGdldERlY29kZWRSZXF1ZXN0VVJJTUIoKSB7CisgICAgICAgIHJldHVybiAoY295b3RlUmVxdWVzdC5kZWNvZGVkVVJJKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZXJ2bGV0IHBhdGggZm9yIHRoaXMgUmVxdWVzdC4gIFRoaXMgd2lsbCBub3JtYWxseSBiZSBjYWxsZWQKKyAgICAgKiB3aGVuIHRoZSBhc3NvY2lhdGVkIENvbnRleHQgaXMgbWFwcGluZyB0aGUgUmVxdWVzdCB0byBhIHBhcnRpY3VsYXIKKyAgICAgKiBXcmFwcGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIHNlcnZsZXQgcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZsZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIGlmIChwYXRoICE9IG51bGwpCisgICAgICAgICAgICBtYXBwaW5nRGF0YS53cmFwcGVyUGF0aC5zZXRTdHJpbmcocGF0aCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFByaW5jaXBhbCB3aG8gaGFzIGJlZW4gYXV0aGVudGljYXRlZCBmb3IgdGhpcyBSZXF1ZXN0LiAgVGhpcworICAgICAqIHZhbHVlIGlzIGFsc28gdXNlZCB0byBjYWxjdWxhdGUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGJ5IHRoZQorICAgICAqIDxjb2RlPmdldFJlbW90ZVVzZXIoKTwvY29kZT4gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHByaW5jaXBhbCBUaGUgdXNlciBQcmluY2lwYWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyUHJpbmNpcGFsKFByaW5jaXBhbCBwcmluY2lwYWwpIHsKKworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IGdldFNlc3Npb24oZmFsc2UpOworICAgICAgICAgICAgaWYgKCAoc3ViamVjdCAhPSBudWxsKSAmJiAKKyAgICAgICAgICAgICAgICAgKCFzdWJqZWN0LmdldFByaW5jaXBhbHMoKS5jb250YWlucyhwcmluY2lwYWwpKSApeworICAgICAgICAgICAgICAgIHN1YmplY3QuZ2V0UHJpbmNpcGFscygpLmFkZChwcmluY2lwYWwpOyAgICAgICAgIAorICAgICAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKEdsb2JhbHMuU1VCSkVDVF9BVFRSKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7CisgICAgICAgICAgICAgICAgc3ViamVjdC5nZXRQcmluY2lwYWxzKCkuYWRkKHByaW5jaXBhbCk7ICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZShHbG9iYWxzLlNVQkpFQ1RfQVRUUiwgc3ViamVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gCisKKyAgICAgICAgdGhpcy51c2VyUHJpbmNpcGFsID0gcHJpbmNpcGFsOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEh0dHBTZXJ2bGV0UmVxdWVzdCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXV0aGVudGljYXRpb24gdHlwZSB1c2VkIGZvciB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRoVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIChhdXRoVHlwZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBvcnRpb24gb2YgdGhlIHJlcXVlc3QgVVJJIHVzZWQgdG8gc2VsZWN0IHRoZSBDb250ZXh0CisgICAgICogb2YgdGhlIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nRGF0YS5jb250ZXh0UGF0aC50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY29udGV4dCBwYXRoLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNvbnRleHQgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlQnl0ZXMgZ2V0Q29udGV4dFBhdGhNQigpIHsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nRGF0YS5jb250ZXh0UGF0aCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBDb29raWVzIHJlY2VpdmVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBDb29raWVbXSBnZXRDb29raWVzKCkgeworCisgICAgICAgIGlmICghY29va2llc1BhcnNlZCkKKyAgICAgICAgICAgIHBhcnNlQ29va2llcygpOworCisgICAgICAgIHJldHVybiBjb29raWVzOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNldCBvZiBjb29raWVzIHJlY2lldmVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvb2tpZXMoQ29va2llW10gY29va2llcykgeworCisgICAgICAgIHRoaXMuY29va2llcyA9IGNvb2tpZXM7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBkYXRlIGhlYWRlciwgaWYgYW55OyBvdGhlcndpc2UKKyAgICAgKiByZXR1cm4gLTEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0ZWQgZGF0ZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgaGVhZGVyIHZhbHVlCisgICAgICogIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYSBkYXRlCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0RGF0ZUhlYWRlcihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldEhlYWRlcihuYW1lKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKC0xTCk7CisKKyAgICAgICAgLy8gQXR0ZW1wdCB0byBjb252ZXJ0IHRoZSBkYXRlIGhlYWRlciBpbiBhIHZhcmlldHkgb2YgZm9ybWF0cworICAgICAgICBsb25nIHJlc3VsdCA9IEZhc3RIdHRwRGF0ZUZvcm1hdC5wYXJzZURhdGUodmFsdWUsIGZvcm1hdHMpOworICAgICAgICBpZiAocmVzdWx0ICE9ICgtMUwpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZpcnN0IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgaGVhZGVyLCBpZiBhbnk7IG90aGVyd2lzZSwKKyAgICAgKiByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHJlcXVlc3RlZCBoZWFkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gY295b3RlUmVxdWVzdC5nZXRIZWFkZXIobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBoZWFkZXIsIGlmIGFueTsgb3RoZXJ3aXNlLAorICAgICAqIHJldHVybiBhbiBlbXB0eSBlbnVtZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHJlcXVlc3RlZCBoZWFkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SGVhZGVycyhTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gY295b3RlUmVxdWVzdC5nZXRNaW1lSGVhZGVycygpLnZhbHVlcyhuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIGhlYWRlcnMgcmVjZWl2ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEhlYWRlck5hbWVzKCkgeworICAgICAgICByZXR1cm4gY295b3RlUmVxdWVzdC5nZXRNaW1lSGVhZGVycygpLm5hbWVzKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgaGVhZGVyIGFzIGFuIGludGVnZXIsIG9yIC0xIGlmIHRoZXJlCisgICAgICogaXMgbm8gc3VjaCBoZWFkZXIgZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHJlcXVlc3RlZCBoZWFkZXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgaGVhZGVyIHZhbHVlCisgICAgICogIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW50SGVhZGVyKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0SGVhZGVyKG5hbWUpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKEludGVnZXIucGFyc2VJbnQodmFsdWUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEhUVFAgcmVxdWVzdCBtZXRob2QgdXNlZCBpbiB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7CisgICAgICAgIHJldHVybiBjb3lvdGVSZXF1ZXN0Lm1ldGhvZCgpLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdGggaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhJbmZvKCkgeworICAgICAgICByZXR1cm4gKG1hcHBpbmdEYXRhLnBhdGhJbmZvLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXRoIGluZm8uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcGF0aCBpbmZvCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2VCeXRlcyBnZXRQYXRoSW5mb01CKCkgeworICAgICAgICByZXR1cm4gKG1hcHBpbmdEYXRhLnBhdGhJbmZvKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXh0cmEgcGF0aCBpbmZvcm1hdGlvbiBmb3IgdGhpcyByZXF1ZXN0LCB0cmFuc2xhdGVkCisgICAgICogdG8gYSByZWFsIHBhdGguCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoVHJhbnNsYXRlZCgpIHsKKworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICBpZiAoZ2V0UGF0aEluZm8oKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIChjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVhbFBhdGgoZ2V0UGF0aEluZm8oKSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcXVlcnkgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gY295b3RlUmVxdWVzdC5xdWVyeVN0cmluZygpLnRvU3RyaW5nKCk7CisgICAgICAgIGlmIChxdWVyeVN0cmluZyA9PSBudWxsIHx8IHF1ZXJ5U3RyaW5nLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcXVlcnlTdHJpbmc7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcmVtb3RlIHVzZXIgdGhhdCBoYXMgYmVlbiBhdXRoZW50aWNhdGVkCisgICAgICogZm9yIHRoaXMgUmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZVVzZXIoKSB7CisKKyAgICAgICAgaWYgKHVzZXJQcmluY2lwYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuICh1c2VyUHJpbmNpcGFsLmdldE5hbWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmVxdWVzdCBwYXRoLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3QgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlQnl0ZXMgZ2V0UmVxdWVzdFBhdGhNQigpIHsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nRGF0YS5yZXF1ZXN0UGF0aCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gaWRlbnRpZmllciBpbmNsdWRlZCBpbiB0aGlzIHJlcXVlc3QsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RlZFNlc3Npb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIChyZXF1ZXN0ZWRTZXNzaW9uSWQpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXF1ZXN0IFVSSSBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFVSSSgpIHsKKyAgICAgICAgcmV0dXJuIGNveW90ZVJlcXVlc3QucmVxdWVzdFVSSSgpLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNvbnN0cnVjdHMgdGhlIFVSTCB0aGUgY2xpZW50IHVzZWQgdG8gbWFrZSB0aGUgcmVxdWVzdC4KKyAgICAgKiBUaGUgcmV0dXJuZWQgVVJMIGNvbnRhaW5zIGEgcHJvdG9jb2wsIHNlcnZlciBuYW1lLCBwb3J0CisgICAgICogbnVtYmVyLCBhbmQgc2VydmVyIHBhdGgsIGJ1dCBpdCBkb2VzIG5vdCBpbmNsdWRlIHF1ZXJ5CisgICAgICogc3RyaW5nIHBhcmFtZXRlcnMuCisgICAgICogPHA+CisgICAgICogQmVjYXVzZSB0aGlzIG1ldGhvZCByZXR1cm5zIGEgPGNvZGU+U3RyaW5nQnVmZmVyPC9jb2RlPiwKKyAgICAgKiBub3QgYSA8Y29kZT5TdHJpbmc8L2NvZGU+LCB5b3UgY2FuIG1vZGlmeSB0aGUgVVJMIGVhc2lseSwKKyAgICAgKiBmb3IgZXhhbXBsZSwgdG8gYXBwZW5kIHF1ZXJ5IHBhcmFtZXRlcnMuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvciBjcmVhdGluZyByZWRpcmVjdCBtZXNzYWdlcyBhbmQKKyAgICAgKiBmb3IgcmVwb3J0aW5nIGVycm9ycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSA8Y29kZT5TdHJpbmdCdWZmZXI8L2NvZGU+IG9iamVjdCBjb250YWluaW5nIHRoZQorICAgICAqICByZWNvbnN0cnVjdGVkIFVSTAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0UmVxdWVzdFVSTCgpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgdXJsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmcgc2NoZW1lID0gZ2V0U2NoZW1lKCk7CisgICAgICAgIGludCBwb3J0ID0gZ2V0U2VydmVyUG9ydCgpOworICAgICAgICBpZiAocG9ydCA8IDApCisgICAgICAgICAgICBwb3J0ID0gODA7IC8vIFdvcmsgYXJvdW5kIGphdmEubmV0LlVSTCBidWcKKworICAgICAgICB1cmwuYXBwZW5kKHNjaGVtZSk7CisgICAgICAgIHVybC5hcHBlbmQoIjovLyIpOworICAgICAgICB1cmwuYXBwZW5kKGdldFNlcnZlck5hbWUoKSk7CisgICAgICAgIGlmICgoc2NoZW1lLmVxdWFscygiaHR0cCIpICYmIChwb3J0ICE9IDgwKSkKKyAgICAgICAgICAgIHx8IChzY2hlbWUuZXF1YWxzKCJodHRwcyIpICYmIChwb3J0ICE9IDQ0MykpKSB7CisgICAgICAgICAgICB1cmwuYXBwZW5kKCc6Jyk7CisgICAgICAgICAgICB1cmwuYXBwZW5kKHBvcnQpOworICAgICAgICB9CisgICAgICAgIHVybC5hcHBlbmQoZ2V0UmVxdWVzdFVSSSgpKTsKKworICAgICAgICByZXR1cm4gKHVybCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcG9ydGlvbiBvZiB0aGUgcmVxdWVzdCBVUkkgdXNlZCB0byBzZWxlY3QgdGhlIHNlcnZsZXQKKyAgICAgKiB0aGF0IHdpbGwgcHJvY2VzcyB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nRGF0YS53cmFwcGVyUGF0aC50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VydmxldCBwYXRoLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNlcnZsZXQgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlQnl0ZXMgZ2V0U2VydmxldFBhdGhNQigpIHsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nRGF0YS53cmFwcGVyUGF0aCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdCwgY3JlYXRpbmcgb25lCisgICAgICogaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKCkgeworICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBkb0dldFNlc3Npb24odHJ1ZSk7CisgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXNzaW9uLmdldFNlc3Npb24oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdCwgY3JlYXRpbmcgb25lCisgICAgICogaWYgbmVjZXNzYXJ5IGFuZCByZXF1ZXN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3JlYXRlIENyZWF0ZSBhIG5ldyBzZXNzaW9uIGlmIG9uZSBkb2VzIG5vdCBleGlzdAorICAgICAqLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKGJvb2xlYW4gY3JlYXRlKSB7CisgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGRvR2V0U2Vzc2lvbihjcmVhdGUpOworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRTZXNzaW9uKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXNzaW9uIGlkZW50aWZpZXIgaW5jbHVkZWQgaW4gdGhpcworICAgICAqIHJlcXVlc3QgY2FtZSBmcm9tIGEgY29va2llLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpIHsKKworICAgICAgICBpZiAocmVxdWVzdGVkU2Vzc2lvbklkICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHJlcXVlc3RlZFNlc3Npb25Db29raWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXNzaW9uIGlkZW50aWZpZXIgaW5jbHVkZWQgaW4gdGhpcworICAgICAqIHJlcXVlc3QgY2FtZSBmcm9tIHRoZSByZXF1ZXN0IFVSSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VUkwoKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3RlZFNlc3Npb25JZCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChyZXF1ZXN0ZWRTZXNzaW9uVVJMKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyIGluY2x1ZGVkIGluIHRoaXMKKyAgICAgKiByZXF1ZXN0IGNhbWUgZnJvbSB0aGUgcmVxdWVzdCBVUkkuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBWZXJzaW9uIDIuMSBvZiB0aGUgSmF2YSBTZXJ2bGV0IEFQSSwgdXNlCisgICAgICogIDxjb2RlPmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpPC9jb2RlPiBpbnN0ZWFkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVybCgpIHsKKyAgICAgICAgcmV0dXJuIChpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VUkwoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlc3Npb24gaWRlbnRpZmllciBpbmNsdWRlZCBpbiB0aGlzCisgICAgICogcmVxdWVzdCBpZGVudGlmaWVzIGEgdmFsaWQgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZFZhbGlkKCkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ZWRTZXNzaW9uSWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIE1hbmFnZXIgbWFuYWdlciA9IGNvbnRleHQuZ2V0TWFuYWdlcigpOworICAgICAgICBpZiAobWFuYWdlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXNzaW9uID0gbWFuYWdlci5maW5kU2Vzc2lvbihyZXF1ZXN0ZWRTZXNzaW9uSWQpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzZXNzaW9uID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHNlc3Npb24gIT0gbnVsbCkgJiYgc2Vzc2lvbi5pc1ZhbGlkKCkpCisgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIgcHJpbmNpcGFsCisgICAgICogcG9zc2Vzc2VzIHRoZSBzcGVjaWZpZWQgcm9sZSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgUm9sZSBuYW1lIHRvIGJlIHZhbGlkYXRlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgeworCisgICAgICAgIC8vIEhhdmUgd2UgZ290IGFuIGF1dGhlbnRpY2F0ZWQgcHJpbmNpcGFsIGF0IGFsbD8KKyAgICAgICAgaWYgKHVzZXJQcmluY2lwYWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSBSZWFsbSB3ZSB3aWxsIHVzZSBmb3IgY2hlY2tpbmcgcm9sZSBhc3NpZ25tZW5ldHMKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICBSZWFsbSByZWFsbSA9IGNvbnRleHQuZ2V0UmVhbG0oKTsKKyAgICAgICAgaWYgKHJlYWxtID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgICAgICAvLyBDaGVjayBmb3IgYSByb2xlIGFsaWFzIGRlZmluZWQgaW4gYSA8c2VjdXJpdHktcm9sZS1yZWY+IGVsZW1lbnQKKyAgICAgICAgaWYgKHdyYXBwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHJlYWxSb2xlID0gd3JhcHBlci5maW5kU2VjdXJpdHlSZWZlcmVuY2Uocm9sZSk7CisgICAgICAgICAgICBpZiAoKHJlYWxSb2xlICE9IG51bGwpICYmCisgICAgICAgICAgICAgICAgcmVhbG0uaGFzUm9sZSh1c2VyUHJpbmNpcGFsLCByZWFsUm9sZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGZvciBhIHJvbGUgZGVmaW5lZCBkaXJlY3RseSBhcyBhIDxzZWN1cml0eS1yb2xlPgorICAgICAgICByZXR1cm4gKHJlYWxtLmhhc1JvbGUodXNlclByaW5jaXBhbCwgcm9sZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByaW5jaXBhbCB0aGF0IGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgZm9yIHRoaXMgUmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFByaW5jaXBhbCgpIHsKKyAgICAgICAgcmV0dXJuICh1c2VyUHJpbmNpcGFsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJpbmNpcGFsIHRoYXQgaGFzIGJlZW4gYXV0aGVudGljYXRlZCBmb3IgdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgaWYgKHVzZXJQcmluY2lwYWwgaW5zdGFuY2VvZiBHZW5lcmljUHJpbmNpcGFsKSB7CisgICAgICAgICAgICByZXR1cm4gKChHZW5lcmljUHJpbmNpcGFsKSB1c2VyUHJpbmNpcGFsKS5nZXRVc2VyUHJpbmNpcGFsKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKHVzZXJQcmluY2lwYWwpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdCwgY3JlYXRpbmcgb25lCisgICAgICogaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uIGdldFNlc3Npb25JbnRlcm5hbCgpIHsKKyAgICAgICAgcmV0dXJuIGRvR2V0U2Vzc2lvbih0cnVlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2Vzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LCBjcmVhdGluZyBvbmUKKyAgICAgKiBpZiBuZWNlc3NhcnkgYW5kIHJlcXVlc3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjcmVhdGUgQ3JlYXRlIGEgbmV3IHNlc3Npb24gaWYgb25lIGRvZXMgbm90IGV4aXN0CisgICAgICovCisgICAgcHVibGljIFNlc3Npb24gZ2V0U2Vzc2lvbkludGVybmFsKGJvb2xlYW4gY3JlYXRlKSB7CisgICAgICAgIHJldHVybiBkb0dldFNlc3Npb24oY3JlYXRlKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICBwcm90ZWN0ZWQgU2Vzc2lvbiBkb0dldFNlc3Npb24oYm9vbGVhbiBjcmVhdGUpIHsKKworICAgICAgICAvLyBUaGVyZSBjYW5ub3QgYmUgYSBzZXNzaW9uIGlmIG5vIGNvbnRleHQgaGFzIGJlZW4gYXNzaWduZWQgeWV0CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIC8vIFJldHVybiB0aGUgY3VycmVudCBzZXNzaW9uIGlmIGl0IGV4aXN0cyBhbmQgaXMgdmFsaWQKKyAgICAgICAgaWYgKChzZXNzaW9uICE9IG51bGwpICYmICFzZXNzaW9uLmlzVmFsaWQoKSkKKyAgICAgICAgICAgIHNlc3Npb24gPSBudWxsOworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChzZXNzaW9uKTsKKworICAgICAgICAvLyBSZXR1cm4gdGhlIHJlcXVlc3RlZCBzZXNzaW9uIGlmIGl0IGV4aXN0cyBhbmQgaXMgdmFsaWQKKyAgICAgICAgTWFuYWdlciBtYW5hZ2VyID0gbnVsbDsKKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgIG1hbmFnZXIgPSBjb250ZXh0LmdldE1hbmFnZXIoKTsKKyAgICAgICAgaWYgKG1hbmFnZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7ICAgICAgLy8gU2Vzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgaWYgKHJlcXVlc3RlZFNlc3Npb25JZCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlc3Npb24gPSBtYW5hZ2VyLmZpbmRTZXNzaW9uKHJlcXVlc3RlZFNlc3Npb25JZCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHNlc3Npb24gIT0gbnVsbCkgJiYgIXNlc3Npb24uaXNWYWxpZCgpKQorICAgICAgICAgICAgICAgIHNlc3Npb24gPSBudWxsOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uYWNjZXNzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzZXNzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBzZXNzaW9uIGlmIHJlcXVlc3RlZCBhbmQgdGhlIHJlc3BvbnNlIGlzIG5vdCBjb21taXR0ZWQKKyAgICAgICAgaWYgKCFjcmVhdGUpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBpZiAoKGNvbnRleHQgIT0gbnVsbCkgJiYgKHJlc3BvbnNlICE9IG51bGwpICYmCisgICAgICAgICAgICBjb250ZXh0LmdldENvb2tpZXMoKSAmJgorICAgICAgICAgICAgcmVzcG9uc2UuZ2V0UmVzcG9uc2UoKS5pc0NvbW1pdHRlZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImNveW90ZVJlcXVlc3Quc2Vzc2lvbkNyZWF0ZUNvbW1pdHRlZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEF0dGVtcHQgdG8gcmV1c2Ugc2Vzc2lvbiBpZCBpZiBvbmUgd2FzIHN1Ym1pdHRlZCBpbiBhIGNvb2tpZQorICAgICAgICAvLyBEbyBub3QgcmV1c2UgdGhlIHNlc3Npb24gaWQgaWYgaXQgaXMgZnJvbSBhIFVSTCwgdG8gcHJldmVudCBwb3NzaWJsZQorICAgICAgICAvLyBwaGlzaGluZyBhdHRhY2tzCisgICAgICAgIGlmIChjb25uZWN0b3IuZ2V0RW1wdHlTZXNzaW9uUGF0aCgpIAorICAgICAgICAgICAgICAgICYmIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpKSB7CisgICAgICAgICAgICBzZXNzaW9uID0gbWFuYWdlci5jcmVhdGVTZXNzaW9uKGdldFJlcXVlc3RlZFNlc3Npb25JZCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlc3Npb24gPSBtYW5hZ2VyLmNyZWF0ZVNlc3Npb24obnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGluZyBhIG5ldyBzZXNzaW9uIGNvb2tpZSBiYXNlZCBvbiB0aGF0IHNlc3Npb24KKyAgICAgICAgaWYgKChzZXNzaW9uICE9IG51bGwpICYmIChnZXRDb250ZXh0KCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICYmIGdldENvbnRleHQoKS5nZXRDb29raWVzKCkpIHsKKyAgICAgICAgICAgIENvb2tpZSBjb29raWUgPSBuZXcgQ29va2llKEdsb2JhbHMuU0VTU0lPTl9DT09LSUVfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SWRJbnRlcm5hbCgpKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZVNlc3Npb25Db29raWUoY29va2llKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLmFkZENvb2tpZShjb29raWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgc2Vzc2lvbi5hY2Nlc3MoKTsKKyAgICAgICAgICAgIHJldHVybiAoc2Vzc2lvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIHRoZSBnaXZlbiBKU0VTU0lPTklEIGNvb2tpZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb29raWUgVGhlIEpTRVNTSU9OSUQgY29va2llIHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTZXNzaW9uQ29va2llKENvb2tpZSBjb29raWUpIHsKKyAgICAgICAgY29va2llLnNldE1heEFnZSgtMSk7CisgICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCA9IG51bGw7CisgICAgICAgIGlmICghY29ubmVjdG9yLmdldEVtcHR5U2Vzc2lvblBhdGgoKSAmJiAoZ2V0Q29udGV4dCgpICE9IG51bGwpKSB7CisgICAgICAgICAgICBjb250ZXh0UGF0aCA9IGdldENvbnRleHQoKS5nZXRFbmNvZGVkUGF0aCgpOworICAgICAgICB9CisgICAgICAgIGlmICgoY29udGV4dFBhdGggIT0gbnVsbCkgJiYgKGNvbnRleHRQYXRoLmxlbmd0aCgpID4gMCkpIHsKKyAgICAgICAgICAgIGNvb2tpZS5zZXRQYXRoKGNvbnRleHRQYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvb2tpZS5zZXRQYXRoKCIvIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzU2VjdXJlKCkpIHsKKyAgICAgICAgICAgIGNvb2tpZS5zZXRTZWN1cmUodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBjb29raWVzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlQ29va2llcygpIHsKKworICAgICAgICBjb29raWVzUGFyc2VkID0gdHJ1ZTsKKworICAgICAgICBDb29raWVzIHNlcnZlckNvb2tpZXMgPSBjb3lvdGVSZXF1ZXN0LmdldENvb2tpZXMoKTsKKyAgICAgICAgaW50IGNvdW50ID0gc2VydmVyQ29va2llcy5nZXRDb29raWVDb3VudCgpOworICAgICAgICBpZiAoY291bnQgPD0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBjb29raWVzID0gbmV3IENvb2tpZVtjb3VudF07CisKKyAgICAgICAgaW50IGlkeD0wOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFNlcnZlckNvb2tpZSBzY29va2llID0gc2VydmVyQ29va2llcy5nZXRDb29raWUoaSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENvb2tpZSBjb29raWUgPSBuZXcgQ29va2llKHNjb29raWUuZ2V0TmFtZSgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nvb2tpZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGNvb2tpZS5zZXRQYXRoKHNjb29raWUuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGNvb2tpZS5zZXRWZXJzaW9uKHNjb29raWUuZ2V0VmVyc2lvbigpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gc2Nvb2tpZS5nZXREb21haW4oKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGlmIChkb21haW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb29raWUuc2V0RG9tYWluKHNjb29raWUuZ2V0RG9tYWluKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvb2tpZXNbaWR4KytdID0gY29va2llOworICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZSBiYWQgY29va2llCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoIGlkeCA8IGNvdW50ICkgeworICAgICAgICAgICAgQ29va2llIFtdIG5jb29raWVzID0gbmV3IENvb2tpZVtpZHhdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb29raWVzLCAwLCBuY29va2llcywgMCwgaWR4KTsKKyAgICAgICAgICAgIGNvb2tpZXMgPSBuY29va2llczsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgcmVxdWVzdCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlUGFyYW1ldGVycygpIHsKKworICAgICAgICBwYXJhbWV0ZXJzUGFyc2VkID0gdHJ1ZTsKKworICAgICAgICBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBjb3lvdGVSZXF1ZXN0LmdldFBhcmFtZXRlcnMoKTsKKworICAgICAgICAvLyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpIG1heSBoYXZlIGJlZW4gb3ZlcnJpZGRlbiB0byBzZWFyY2ggZm9yCisgICAgICAgIC8vIGhpZGRlbiBmb3JtIGZpZWxkIGNvbnRhaW5pbmcgcmVxdWVzdCBlbmNvZGluZworICAgICAgICBTdHJpbmcgZW5jID0gZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTsKKworICAgICAgICBib29sZWFuIHVzZUJvZHlFbmNvZGluZ0ZvclVSSSA9IGNvbm5lY3Rvci5nZXRVc2VCb2R5RW5jb2RpbmdGb3JVUkkoKTsKKyAgICAgICAgaWYgKGVuYyAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXJhbWV0ZXJzLnNldEVuY29kaW5nKGVuYyk7CisgICAgICAgICAgICBpZiAodXNlQm9keUVuY29kaW5nRm9yVVJJKSB7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5zZXRRdWVyeVN0cmluZ0VuY29kaW5nKGVuYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJhbWV0ZXJzLnNldEVuY29kaW5nCisgICAgICAgICAgICAgICAgKG9yZy5hcGFjaGUuY295b3RlLkNvbnN0YW50cy5ERUZBVUxUX0NIQVJBQ1RFUl9FTkNPRElORyk7CisgICAgICAgICAgICBpZiAodXNlQm9keUVuY29kaW5nRm9yVVJJKSB7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5zZXRRdWVyeVN0cmluZ0VuY29kaW5nCisgICAgICAgICAgICAgICAgICAgIChvcmcuYXBhY2hlLmNveW90ZS5Db25zdGFudHMuREVGQVVMVF9DSEFSQUNURVJfRU5DT0RJTkcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGFyYW1ldGVycy5oYW5kbGVRdWVyeVBhcmFtZXRlcnMoKTsKKworICAgICAgICBpZiAodXNpbmdJbnB1dFN0cmVhbSB8fCB1c2luZ1JlYWRlcikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoIWdldE1ldGhvZCgpLmVxdWFsc0lnbm9yZUNhc2UoIlBPU1QiKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBnZXRDb250ZW50VHlwZSgpOworICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gIiI7CisgICAgICAgIGludCBzZW1pY29sb24gPSBjb250ZW50VHlwZS5pbmRleE9mKCc7Jyk7CisgICAgICAgIGlmIChzZW1pY29sb24gPj0gMCkgeworICAgICAgICAgICAgY29udGVudFR5cGUgPSBjb250ZW50VHlwZS5zdWJzdHJpbmcoMCwgc2VtaWNvbG9uKS50cmltKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLnRyaW0oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoISgiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIi5lcXVhbHMoY29udGVudFR5cGUpKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpbnQgbGVuID0gZ2V0Q29udGVudExlbmd0aCgpOworCisgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICBpbnQgbWF4UG9zdFNpemUgPSBjb25uZWN0b3IuZ2V0TWF4UG9zdFNpemUoKTsKKyAgICAgICAgICAgIGlmICgobWF4UG9zdFNpemUgPiAwKSAmJiAobGVuID4gbWF4UG9zdFNpemUpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRMb2dnZXIoKS5pbmZvCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImNveW90ZVJlcXVlc3QucG9zdFRvb0xhcmdlIikpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlBvc3QgdG9vIGxhcmdlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBmb3JtRGF0YSA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IENBQ0hFRF9QT1NUX0xFTikgeworICAgICAgICAgICAgICAgICAgICBpZiAocG9zdERhdGEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc3REYXRhID0gbmV3IGJ5dGVbQ0FDSEVEX1BPU1RfTEVOXTsKKyAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBwb3N0RGF0YTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IG5ldyBieXRlW2xlbl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBhY3R1YWxMZW4gPSByZWFkUG9zdEJvZHkoZm9ybURhdGEsIGxlbik7CisgICAgICAgICAgICAgICAgaWYgKGFjdHVhbExlbiA9PSBsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5wcm9jZXNzUGFyYW1ldGVycyhmb3JtRGF0YSwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TG9nZ2VyKCkud2FybgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJjb3lvdGVSZXF1ZXN0LnBhcnNlUGFyYW1ldGVycyIpLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWFkIHBvc3QgYm9keSBpbiBhbiBhcnJheS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHJlYWRQb3N0Qm9keShieXRlIGJvZHlbXSwgaW50IGxlbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaW50IGlucHV0TGVuID0gZ2V0U3RyZWFtKCkucmVhZChib2R5LCBvZmZzZXQsIGxlbiAtIG9mZnNldCk7CisgICAgICAgICAgICBpZiAoaW5wdXRMZW4gPD0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmZzZXQgKz0gaW5wdXRMZW47CisgICAgICAgIH0gd2hpbGUgKChsZW4gLSBvZmZzZXQpID4gMCk7CisgICAgICAgIHJldHVybiBsZW47CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIHJlcXVlc3QgbG9jYWxlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZUxvY2FsZXMoKSB7CisKKyAgICAgICAgbG9jYWxlc1BhcnNlZCA9IHRydWU7CisKKyAgICAgICAgRW51bWVyYXRpb24gdmFsdWVzID0gZ2V0SGVhZGVycygiYWNjZXB0LWxhbmd1YWdlIik7CisKKyAgICAgICAgd2hpbGUgKHZhbHVlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gdmFsdWVzLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHBhcnNlTG9jYWxlc0hlYWRlcih2YWx1ZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFyc2UgYWNjZXB0LWxhbmd1YWdlIGhlYWRlciB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZUxvY2FsZXNIZWFkZXIoU3RyaW5nIHZhbHVlKSB7CisKKyAgICAgICAgLy8gU3RvcmUgdGhlIGFjY3VtdWxhdGVkIGxhbmd1YWdlcyB0aGF0IGhhdmUgYmVlbiByZXF1ZXN0ZWQgaW4KKyAgICAgICAgLy8gYSBsb2NhbCBjb2xsZWN0aW9uLCBzb3J0ZWQgYnkgdGhlIHF1YWxpdHkgdmFsdWUgKHNvIHdlIGNhbgorICAgICAgICAvLyBhZGQgTG9jYWxlcyBpbiBkZXNjZW5kaW5nIG9yZGVyKS4gIFRoZSB2YWx1ZXMgd2lsbCBiZSBBcnJheUxpc3RzCisgICAgICAgIC8vIGNvbnRhaW5pbmcgdGhlIGNvcnJlc3BvbmRpbmcgTG9jYWxlcyB0byBiZSBhZGRlZAorICAgICAgICBUcmVlTWFwIGxvY2FsZXMgPSBuZXcgVHJlZU1hcCgpOworCisgICAgICAgIC8vIFByZXByb2Nlc3MgdGhlIHZhbHVlIHRvIHJlbW92ZSBhbGwgd2hpdGVzcGFjZQorICAgICAgICBpbnQgd2hpdGUgPSB2YWx1ZS5pbmRleE9mKCcgJyk7CisgICAgICAgIGlmICh3aGl0ZSA8IDApCisgICAgICAgICAgICB3aGl0ZSA9IHZhbHVlLmluZGV4T2YoJ1x0Jyk7CisgICAgICAgIGlmICh3aGl0ZSA+PSAwKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBpbnQgbGVuID0gdmFsdWUubGVuZ3RoKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoKGNoICE9ICcgJykgJiYgKGNoICE9ICdcdCcpKQorICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY2gpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWUgPSBzYi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VzcyBlYWNoIGNvbW1hLWRlbGltaXRlZCBsYW5ndWFnZSBzcGVjaWZpY2F0aW9uCisgICAgICAgIHBhcnNlci5zZXRTdHJpbmcodmFsdWUpOyAgICAgICAgLy8gQVNTRVJUOiBwYXJzZXIgaXMgYXZhaWxhYmxlIHRvIHVzCisgICAgICAgIGludCBsZW5ndGggPSBwYXJzZXIuZ2V0TGVuZ3RoKCk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisKKyAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIG5leHQgY29tbWEtZGVsaW1pdGVkIGVudHJ5CisgICAgICAgICAgICBpbnQgc3RhcnQgPSBwYXJzZXIuZ2V0SW5kZXgoKTsKKyAgICAgICAgICAgIGlmIChzdGFydCA+PSBsZW5ndGgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpbnQgZW5kID0gcGFyc2VyLmZpbmRDaGFyKCcsJyk7CisgICAgICAgICAgICBTdHJpbmcgZW50cnkgPSBwYXJzZXIuZXh0cmFjdChzdGFydCwgZW5kKS50cmltKCk7CisgICAgICAgICAgICBwYXJzZXIuYWR2YW5jZSgpOyAgIC8vIEZvciB0aGUgZm9sbG93aW5nIGVudHJ5CisKKyAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHF1YWxpdHkgZmFjdG9yIGZvciB0aGlzIGVudHJ5CisgICAgICAgICAgICBkb3VibGUgcXVhbGl0eSA9IDEuMDsKKyAgICAgICAgICAgIGludCBzZW1pID0gZW50cnkuaW5kZXhPZigiO3E9Iik7CisgICAgICAgICAgICBpZiAoc2VtaSA+PSAwKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSA9IERvdWJsZS5wYXJzZURvdWJsZShlbnRyeS5zdWJzdHJpbmcoc2VtaSArIDMpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gMC4wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbnRyeSA9IGVudHJ5LnN1YnN0cmluZygwLCBzZW1pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2tpcCBlbnRyaWVzIHdlIGFyZSBub3QgZ29pbmcgdG8ga2VlcCB0cmFjayBvZgorICAgICAgICAgICAgaWYgKHF1YWxpdHkgPCAwLjAwMDA1KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAvLyBaZXJvIChvciBlZmZlY3RpdmVseSB6ZXJvKSBxdWFsaXR5IGZhY3RvcnMKKyAgICAgICAgICAgIGlmICgiKiIuZXF1YWxzKGVudHJ5KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgLy8gRklYTUUgLSAiKiIgZW50cmllcyBhcmUgbm90IGhhbmRsZWQKKworICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgbGFuZ3VhZ2UgYW5kIGNvdW50cnkgZm9yIHRoaXMgZW50cnkKKyAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgY291bnRyeSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgdmFyaWFudCA9IG51bGw7CisgICAgICAgICAgICBpbnQgZGFzaCA9IGVudHJ5LmluZGV4T2YoJy0nKTsKKyAgICAgICAgICAgIGlmIChkYXNoIDwgMCkgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gZW50cnk7CisgICAgICAgICAgICAgICAgY291bnRyeSA9ICIiOworICAgICAgICAgICAgICAgIHZhcmlhbnQgPSAiIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSBlbnRyeS5zdWJzdHJpbmcoMCwgZGFzaCk7CisgICAgICAgICAgICAgICAgY291bnRyeSA9IGVudHJ5LnN1YnN0cmluZyhkYXNoICsgMSk7CisgICAgICAgICAgICAgICAgaW50IHZEYXNoID0gY291bnRyeS5pbmRleE9mKCctJyk7CisgICAgICAgICAgICAgICAgaWYgKHZEYXNoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY1RlbXAgPSBjb3VudHJ5LnN1YnN0cmluZygwLCB2RGFzaCk7CisgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQgPSBjb3VudHJ5LnN1YnN0cmluZyh2RGFzaCArIDEpOworICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gY1RlbXA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFudCA9ICIiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaXNBbHBoYShsYW5ndWFnZSkgfHwgIWlzQWxwaGEoY291bnRyeSkgfHwgIWlzQWxwaGEodmFyaWFudCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWRkIGEgbmV3IExvY2FsZSB0byB0aGUgbGlzdCBvZiBMb2NhbGVzIGZvciB0aGlzIHF1YWxpdHkgbGV2ZWwKKyAgICAgICAgICAgIExvY2FsZSBsb2NhbGUgPSBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5LCB2YXJpYW50KTsKKyAgICAgICAgICAgIERvdWJsZSBrZXkgPSBuZXcgRG91YmxlKC1xdWFsaXR5KTsgIC8vIFJldmVyc2UgdGhlIG9yZGVyCisgICAgICAgICAgICBBcnJheUxpc3QgdmFsdWVzID0gKEFycmF5TGlzdCkgbG9jYWxlcy5nZXQoa2V5KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICBsb2NhbGVzLnB1dChrZXksIHZhbHVlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZXMuYWRkKGxvY2FsZSk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2Nlc3MgdGhlIHF1YWxpdHkgdmFsdWVzIGluIGhpZ2hlc3QtPmxvd2VzdCBvcmRlciAoZHVlIHRvCisgICAgICAgIC8vIG5lZ2F0aW5nIHRoZSBEb3VibGUgdmFsdWUgd2hlbiBjcmVhdGluZyB0aGUga2V5KQorICAgICAgICBJdGVyYXRvciBrZXlzID0gbG9jYWxlcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIERvdWJsZSBrZXkgPSAoRG91YmxlKSBrZXlzLm5leHQoKTsKKyAgICAgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCkgbG9jYWxlcy5nZXQoa2V5KTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIHZhbHVlcyA9IGxpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSA9IChMb2NhbGUpIHZhbHVlcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgYWRkTG9jYWxlKGxvY2FsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0FscGhhKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHZhbHVlLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmICghKChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL1JlcXVlc3RGYWNhZGUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvUmVxdWVzdEZhY2FkZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYTdkMDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL1JlcXVlc3RGYWNhZGUuamF2YQpAQCAtMCwwICsxLDkzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlJlcXVlc3REaXNwYXRjaGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldElucHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zZWN1cml0eS5TZWN1cml0eVV0aWw7CisKKy8qKgorICogRmFjYWRlIGNsYXNzIHRoYXQgd3JhcHMgYSBDb3lvdGUgcmVxdWVzdCBvYmplY3QuICAKKyAqIEFsbCBtZXRob2RzIGFyZSBkZWxlZ2F0ZWQgdG8gdGhlIHdyYXBwZWQgcmVxdWVzdC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEBhdXRob3IgSmVhbi1GcmFuY29pcyBBcmNhbmQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFJlcXVlc3RGYWNhZGUgaW1wbGVtZW50cyBIdHRwU2VydmxldFJlcXVlc3QgeworICAgICAgICAKKyAgICAgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRG9Qcml2aWxlZ2VkCisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBHZXRBdHRyaWJ1dGVQcml2aWxlZ2VkQWN0aW9uCisgICAgICAgICAgICBpbXBsZW1lbnRzIFByaXZpbGVnZWRBY3Rpb24geworICAgICAgICAKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgICAgICB9ICAgICAgICAgICAgCisgICAgfQorICAgICAKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEdldFBhcmFtZXRlck1hcFByaXZpbGVnZWRBY3Rpb24KKyAgICAgICAgICAgIGltcGxlbWVudHMgUHJpdmlsZWdlZEFjdGlvbiB7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFBhcmFtZXRlck1hcCgpOworICAgICAgICB9ICAgICAgICAKKyAgICB9ICAgIAorICAgIAorICAgIAorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgR2V0UmVxdWVzdERpc3BhdGNoZXJQcml2aWxlZ2VkQWN0aW9uCisgICAgICAgICAgICBpbXBsZW1lbnRzIFByaXZpbGVnZWRBY3Rpb24geworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7CisKKyAgICAgICAgcHVibGljIEdldFJlcXVlc3REaXNwYXRjaGVyUHJpdmlsZWdlZEFjdGlvbihTdHJpbmcgcGF0aCl7CisgICAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsgICAKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFJlcXVlc3REaXNwYXRjaGVyKHBhdGgpOworICAgICAgICB9ICAgICAgICAgICAKKyAgICB9ICAgIAorICAgIAorICAgIAorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgR2V0UGFyYW1ldGVyUHJpdmlsZWdlZEFjdGlvbgorICAgICAgICAgICAgaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9uIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgcHVibGljIEdldFBhcmFtZXRlclByaXZpbGVnZWRBY3Rpb24oU3RyaW5nIG5hbWUpeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeyAgICAgICAKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFBhcmFtZXRlcihuYW1lKTsKKyAgICAgICAgfSAgICAgICAgICAgCisgICAgfSAgICAKKyAgICAKKyAgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBHZXRQYXJhbWV0ZXJOYW1lc1ByaXZpbGVnZWRBY3Rpb24KKyAgICAgICAgICAgIGltcGxlbWVudHMgUHJpdmlsZWdlZEFjdGlvbiB7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICB9ICAgICAgICAgICAKKyAgICB9IAorICAgIAorICAgIAorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgR2V0UGFyYW1ldGVyVmFsdWVQcml2aWxlZ2VkQWN0aW9uCisgICAgICAgICAgICBpbXBsZW1lbnRzIFByaXZpbGVnZWRBY3Rpb24geworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKworICAgICAgICBwdWJsaWMgR2V0UGFyYW1ldGVyVmFsdWVQcml2aWxlZ2VkQWN0aW9uKFN0cmluZyBuYW1lKXsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsgICAgICAgCisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMobmFtZSk7CisgICAgICAgIH0gICAgICAgICAgIAorICAgIH0gICAgCisgIAorICAgIAorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgR2V0Q29va2llc1ByaXZpbGVnZWRBY3Rpb24KKyAgICAgICAgICAgIGltcGxlbWVudHMgUHJpdmlsZWdlZEFjdGlvbiB7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsgICAgICAgCisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRDb29raWVzKCk7CisgICAgICAgIH0gICAgICAgICAgIAorICAgIH0gICAgICAKKyAgICAKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEdldENoYXJhY3RlckVuY29kaW5nUHJpdmlsZWdlZEFjdGlvbgorICAgICAgICAgICAgaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9uIHsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeyAgICAgICAKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldENoYXJhY3RlckVuY29kaW5nKCk7CisgICAgICAgIH0gICAgICAgICAgIAorICAgIH0gICAKKyAgICAgICAgCisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBHZXRIZWFkZXJzUHJpdmlsZWdlZEFjdGlvbgorICAgICAgICAgICAgaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9uIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgICAgIHB1YmxpYyBHZXRIZWFkZXJzUHJpdmlsZWdlZEFjdGlvbihTdHJpbmcgbmFtZSl7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsgICAgICAgCisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRIZWFkZXJzKG5hbWUpOworICAgICAgICB9ICAgICAgICAgICAKKyAgICB9ICAgIAorICAgICAgICAKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEdldEhlYWRlck5hbWVzUHJpdmlsZWdlZEFjdGlvbgorICAgICAgICAgICAgaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9uIHsKKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsgICAgICAgCisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRIZWFkZXJOYW1lcygpOworICAgICAgICB9ICAgICAgICAgICAKKyAgICB9ICAKKyAgICAgICAgICAgIAorICAgIAorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgR2V0TG9jYWxlUHJpdmlsZWdlZEFjdGlvbgorICAgICAgICAgICAgaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9uIHsKKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsgICAgICAgCisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRMb2NhbGUoKTsKKyAgICAgICAgfSAgICAgICAgICAgCisgICAgfSAgICAKKyAgICAgICAgICAgIAorICAgIAorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgR2V0TG9jYWxlc1ByaXZpbGVnZWRBY3Rpb24KKyAgICAgICAgICAgIGltcGxlbWVudHMgUHJpdmlsZWdlZEFjdGlvbiB7CisKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7ICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0TG9jYWxlcygpOworICAgICAgICB9ICAgICAgICAgICAKKyAgICB9ICAgIAorICAgIAorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgR2V0U2Vzc2lvblByaXZpbGVnZWRBY3Rpb24KKyAgICAgICAgICAgIGltcGxlbWVudHMgUHJpdmlsZWdlZEFjdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBHZXRTZXNzaW9uUHJpdmlsZWdlZEFjdGlvbihib29sZWFuIGNyZWF0ZSl7CisgICAgICAgICAgICB0aGlzLmNyZWF0ZSA9IGNyZWF0ZTsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsgIAorICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0U2Vzc2lvbihjcmVhdGUpOworICAgICAgICB9ICAgICAgICAgICAKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgd3JhcHBlciBmb3IgdGhlIHNwZWNpZmllZCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QgdG8gYmUgd3JhcHBlZAorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0RmFjYWRlKFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgd3JhcHBlZCByZXF1ZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBSZXF1ZXN0IHJlcXVlc3QgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ2xlYXIgZmFjYWRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICByZXF1ZXN0ID0gbnVsbDsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50IGNsb25pbmcgdGhlIGZhY2FkZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGNsb25lKCkKKyAgICAgICAgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlcnZsZXRSZXF1ZXN0IE1ldGhvZHMKKworCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldEF0dHJpYnV0ZShuYW1lKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVOYW1lcygpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgICByZXR1cm4gKEVudW1lcmF0aW9uKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgIG5ldyBHZXRBdHRyaWJ1dGVQcml2aWxlZ2VkQWN0aW9uKCkpOyAgICAgICAgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nKCkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgIG5ldyBHZXRDaGFyYWN0ZXJFbmNvZGluZ1ByaXZpbGVnZWRBY3Rpb24oKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpOworICAgICAgICB9ICAgICAgICAgCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgZW52KQorICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlcXVlc3RGYWNhZGUubnVsbFJlcXVlc3QiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXF1ZXN0LnNldENoYXJhY3RlckVuY29kaW5nKGVudik7CisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IGdldENvbnRlbnRMZW5ndGgoKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlcXVlc3RGYWNhZGUubnVsbFJlcXVlc3QiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRDb250ZW50TGVuZ3RoKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTZXJ2bGV0SW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlcXVlc3RGYWNhZGUubnVsbFJlcXVlc3QiKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgbmV3IEdldFBhcmFtZXRlclByaXZpbGVnZWRBY3Rpb24obmFtZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UGFyYW1ldGVyTmFtZXMoKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlcXVlc3RGYWNhZGUubnVsbFJlcXVlc3QiKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIChFbnVtZXJhdGlvbilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICBuZXcgR2V0UGFyYW1ldGVyTmFtZXNQcml2aWxlZ2VkQWN0aW9uKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gcmV0ID0gbnVsbDsKKworICAgICAgICAvKgorICAgICAgICAgKiBDbG9uZSB0aGUgcmV0dXJuZWQgYXJyYXkgb25seSBpZiB0aGVyZSBpcyBhIHNlY3VyaXR5IG1hbmFnZXIKKyAgICAgICAgICogaW4gcGxhY2UsIHNvIHRoYXQgcGVyZm9ybWFuY2Ugd29uJ3Qgc3VmZmVyIGluIHRoZSBub25zZWN1cmUgY2FzZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKXsKKyAgICAgICAgICAgIHJldCA9IChTdHJpbmdbXSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgbmV3IEdldFBhcmFtZXRlclZhbHVlUHJpdmlsZWdlZEFjdGlvbihuYW1lKSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXQgPSAoU3RyaW5nW10pIHJldC5jbG9uZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMobmFtZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworCisgICAgcHVibGljIE1hcCBnZXRQYXJhbWV0ZXJNYXAoKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlcXVlc3RGYWNhZGUubnVsbFJlcXVlc3QiKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIChNYXApQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgbmV3IEdldFBhcmFtZXRlck1hcFByaXZpbGVnZWRBY3Rpb24oKSk7ICAgICAgICAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFBhcmFtZXRlck1hcCgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UHJvdG9jb2woKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1lKCkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0U2NoZW1lKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlck5hbWUoKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlcXVlc3RGYWNhZGUubnVsbFJlcXVlc3QiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IGdldFNlcnZlclBvcnQoKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlcXVlc3RGYWNhZGUubnVsbFJlcXVlc3QiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgQnVmZmVyZWRSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFJlYWRlcigpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVBZGRyKCkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UmVtb3RlQWRkcigpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVIb3N0KCkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgbykgeworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUobmFtZSwgbyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgIH0KKworCisgICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlcXVlc3RGYWNhZGUubnVsbFJlcXVlc3QiKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIChMb2NhbGUpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgbmV3IEdldExvY2FsZVByaXZpbGVnZWRBY3Rpb24oKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRMb2NhbGUoKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TG9jYWxlcygpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgICByZXR1cm4gKEVudW1lcmF0aW9uKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgIG5ldyBHZXRMb2NhbGVzUHJpdmlsZWdlZEFjdGlvbigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldExvY2FsZXMoKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0LmlzU2VjdXJlKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0UmVxdWVzdERpc3BhdGNoZXIoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgICByZXR1cm4gKFJlcXVlc3REaXNwYXRjaGVyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgIG5ldyBHZXRSZXF1ZXN0RGlzcGF0Y2hlclByaXZpbGVnZWRBY3Rpb24ocGF0aCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UmVxdWVzdERpc3BhdGNoZXIocGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbFBhdGgoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFJlYWxQYXRoKHBhdGgpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRoVHlwZSgpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldEF1dGhUeXBlKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgQ29va2llW10gZ2V0Q29va2llcygpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIENvb2tpZVtdIHJldCA9IG51bGw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2xvbmUgdGhlIHJldHVybmVkIGFycmF5IG9ubHkgaWYgdGhlcmUgaXMgYSBzZWN1cml0eSBtYW5hZ2VyCisgICAgICAgICAqIGluIHBsYWNlLCBzbyB0aGF0IHBlcmZvcm1hbmNlIHdvbid0IHN1ZmZlciBpbiB0aGUgbm9uc2VjdXJlIGNhc2UKKyAgICAgICAgICovCisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSl7CisgICAgICAgICAgICByZXQgPSAoQ29va2llW10pQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgbmV3IEdldENvb2tpZXNQcml2aWxlZ2VkQWN0aW9uKCkpOworICAgICAgICAgICAgaWYgKHJldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gKENvb2tpZVtdKSByZXQuY2xvbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IHJlcXVlc3QuZ2V0Q29va2llcygpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKworICAgIHB1YmxpYyBsb25nIGdldERhdGVIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldERhdGVIZWFkZXIobmFtZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0SGVhZGVyKG5hbWUpOworICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEhlYWRlcnMoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgICByZXR1cm4gKEVudW1lcmF0aW9uKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgIG5ldyBHZXRIZWFkZXJzUHJpdmlsZWdlZEFjdGlvbihuYW1lKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRIZWFkZXJzKG5hbWUpOworICAgICAgICB9ICAgICAgICAgCisgICAgfQorCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SGVhZGVyTmFtZXMoKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlcXVlc3RGYWNhZGUubnVsbFJlcXVlc3QiKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIChFbnVtZXJhdGlvbilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICBuZXcgR2V0SGVhZGVyTmFtZXNQcml2aWxlZ2VkQWN0aW9uKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0SGVhZGVyTmFtZXMoKTsKKyAgICAgICAgfSAgICAgICAgICAgICAKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0SW50SGVhZGVyKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlcXVlc3RGYWNhZGUubnVsbFJlcXVlc3QiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRJbnRIZWFkZXIobmFtZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldE1ldGhvZCgpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoSW5mbygpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFBhdGhJbmZvKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhUcmFuc2xhdGVkKCkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UGF0aFRyYW5zbGF0ZWQoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFBhdGgoKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlcXVlc3RGYWNhZGUubnVsbFJlcXVlc3QiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZVVzZXIoKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlcXVlc3RGYWNhZGUubnVsbFJlcXVlc3QiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRSZW1vdGVVc2VyKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0LmlzVXNlckluUm9sZShyb2xlKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbCBnZXRVc2VyUHJpbmNpcGFsKCkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0VXNlclByaW5jaXBhbCgpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlcXVlc3RGYWNhZGUubnVsbFJlcXVlc3QiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFVSSSgpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0UmVxdWVzdFVSTCgpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFJlcXVlc3RVUkwoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldFBhdGgoKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlcXVlc3RGYWNhZGUubnVsbFJlcXVlc3QiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpOworICAgIH0KKworCisgICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oYm9vbGVhbiBjcmVhdGUpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSl7CisgICAgICAgICAgICByZXR1cm4gKEh0dHBTZXNzaW9uKUFjY2Vzc0NvbnRyb2xsZXIuCisgICAgICAgICAgICAgICAgZG9Qcml2aWxlZ2VkKG5ldyBHZXRTZXNzaW9uUHJpdmlsZWdlZEFjdGlvbihjcmVhdGUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFNlc3Npb24oY3JlYXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKCkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGdldFNlc3Npb24odHJ1ZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZFZhbGlkKCkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZCgpOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tQ29va2llKCkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tQ29va2llKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VUkwoKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlcXVlc3RGYWNhZGUubnVsbFJlcXVlc3QiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVxdWVzdC5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VUkwoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVybCgpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0LmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbEFkZHIoKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlcXVlc3RGYWNhZGUubnVsbFJlcXVlc3QiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRMb2NhbEFkZHIoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0TG9jYWxOYW1lKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVxdWVzdEZhY2FkZS5udWxsUmVxdWVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldExvY2FsUG9ydCgpOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXF1ZXN0RmFjYWRlLm51bGxSZXF1ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UmVtb3RlUG9ydCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9SZXNwb25zZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9SZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMTc5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL1Jlc3BvbnNlLmphdmEKQEAgLTAsMCArMSwxNTY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuV3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuQ2hhcnNldE1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuRGF0ZVRvb2w7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zZWN1cml0eS5TZWN1cml0eVV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuQ2hhckNodW5rOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLlVFbmNvZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuaHR0cC5GYXN0SHR0cERhdGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5odHRwLk1pbWVIZWFkZXJzOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuaHR0cC5TZXJ2ZXJDb29raWU7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5uZXQuVVJMOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuY29tcGF0Lkpka0NvbXBhdDsKKworLyoqCisgKiBXcmFwcGVyIG9iamVjdCBmb3IgdGhlIENveW90ZSByZXNwb25zZS4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFJlc3BvbnNlCisgICAgaW1wbGVtZW50cyBIdHRwU2VydmxldFJlc3BvbnNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKyAgICBzdGF0aWMgeworICAgICAgICAvLyBFbnN1cmUgdGhhdCBVUkwgaXMgbG9hZGVkIGZvciBTTQorICAgICAgICBVUkwuaXNTY2hlbWVDaGFyKCdjJyk7CisgICAgfQorCisgICAgcHVibGljIFJlc3BvbnNlKCkgeworICAgICAgICB1cmxFbmNvZGVyLmFkZFNhZmVDaGFyYWN0ZXIoJy8nKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENsYXNzIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBKREsgY29tcGF0aWJpbGl0eSBzdXBwb3J0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmRrQ29tcGF0IGpka0NvbXBhdCA9IEpka0NvbXBhdC5nZXRKZGtDb21wYXQoKTsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBSZXNwb25zZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY295b3RlLnRvbWNhdDUuQ295b3RlUmVzcG9uc2UvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGF0ZSBmb3JtYXQgd2Ugd2lsbCB1c2UgZm9yIGNyZWF0aW5nIGRhdGUgaGVhZGVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXQgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlZCBDYXRhbGluYSBjb25uZWN0b3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbm5lY3RvciBjb25uZWN0b3I7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENvbm5lY3RvciB0aHJvdWdoIHdoaWNoIHRoaXMgUmVxdWVzdCB3YXMgcmVjZWl2ZWQuCisgICAgICovCisgICAgcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5jb25uZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29ubmVjdG9yIHRocm91Z2ggd2hpY2ggdGhpcyBSZXF1ZXN0IHdhcyByZWNlaXZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0b3IgVGhlIG5ldyBjb25uZWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0b3IoQ29ubmVjdG9yIGNvbm5lY3RvcikgeworICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKKyAgICAgICAgaWYgKCJBSlAvMS4zIi5lcXVhbHMoY29ubmVjdG9yLmdldFByb3RvY29sKCkpKSB7CisgICAgICAgICAgICAvLyBkZWZhdWx0IHNpemUgdG8gc2l6ZSBvZiBvbmUgYWpwLXBhY2tldAorICAgICAgICAgICAgLy8gUmVkdWNlIEhTSVpFIGFuZCBDb21tYW5kID0gNiBCeXRlcworICAgICAgICAgICAgb3V0cHV0QnVmZmVyID0gbmV3IE91dHB1dEJ1ZmZlcig4MTg0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlciA9IG5ldyBPdXRwdXRCdWZmZXIoKTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgQ295b3RlT3V0cHV0U3RyZWFtKG91dHB1dEJ1ZmZlcik7CisgICAgICAgIHdyaXRlciA9IG5ldyBDb3lvdGVXcml0ZXIob3V0cHV0QnVmZmVyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENveW90ZSByZXNwb25zZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5jb3lvdGUuUmVzcG9uc2UgY295b3RlUmVzcG9uc2U7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENveW90ZSByZXNwb25zZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY295b3RlUmVzcG9uc2UgVGhlIENveW90ZSByZXNwb25zZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENveW90ZVJlc3BvbnNlKG9yZy5hcGFjaGUuY295b3RlLlJlc3BvbnNlIGNveW90ZVJlc3BvbnNlKSB7CisgICAgICAgIHRoaXMuY295b3RlUmVzcG9uc2UgPSBjb3lvdGVSZXNwb25zZTsKKyAgICAgICAgb3V0cHV0QnVmZmVyLnNldFJlc3BvbnNlKGNveW90ZVJlc3BvbnNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIENveW90ZSByZXNwb25zZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgb3JnLmFwYWNoZS5jb3lvdGUuUmVzcG9uc2UgZ2V0Q295b3RlUmVzcG9uc2UoKSB7CisgICAgICAgIHJldHVybiAoY295b3RlUmVzcG9uc2UpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250ZXh0IHdpdGhpbiB3aGljaCB0aGlzIFJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkLgorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiAocmVxdWVzdC5nZXRDb250ZXh0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGV4dCB3aXRoaW4gd2hpY2ggdGhpcyBSZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4gIFRoaXMKKyAgICAgKiBtdXN0IGJlIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBhcHByb3ByaWF0ZSBDb250ZXh0IGlzIGlkZW50aWZpZWQsIGJlY2F1c2UKKyAgICAgKiBpdCBpZGVudGlmaWVzIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBieSA8Y29kZT5nZXRDb250ZXh0UGF0aCgpPC9jb2RlPiwKKyAgICAgKiBhbmQgdGh1cyBlbmFibGVzIHBhcnNpbmcgb2YgdGhlIHJlcXVlc3QgVVJJLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIG5ld2x5IGFzc29jaWF0ZWQgQ29udGV4dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJlcXVlc3Quc2V0Q29udGV4dChjb250ZXh0KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBhc3NvY2lhdGVkIG91dHB1dCBidWZmZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIE91dHB1dEJ1ZmZlciBvdXRwdXRCdWZmZXI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhc3NvY2lhdGVkIG91dHB1dCBzdHJlYW0uCisgICAgICovCisgICAgcHJvdGVjdGVkIENveW90ZU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW07CisKKworICAgIC8qKgorICAgICAqIFRoZSBhc3NvY2lhdGVkIHdyaXRlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ295b3RlV3JpdGVyIHdyaXRlcjsKKworCisgICAgLyoqCisgICAgICogVGhlIGFwcGxpY2F0aW9uIGNvbW1pdCBmbGFnLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGFwcENvbW1pdHRlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5jbHVkZWQgZmxhZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRlZCA9IGZhbHNlOworCisgICAgCisgICAgLyoqCisgICAgICogVGhlIGNoYXJhY3RlckVuY29kaW5nIGZsYWcKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDaGFyYWN0ZXJFbmNvZGluZ1NldCA9IGZhbHNlOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBlcnJvciBmbGFnLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGVycm9yID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgQ29va2llcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXNwb25zZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IGNvb2tpZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKworICAgIC8qKgorICAgICAqIFVzaW5nIG91dHB1dCBzdHJlYW0gZmxhZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2luZ091dHB1dFN0cmVhbSA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBVc2luZyB3cml0ZXIgZmxhZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2luZ1dyaXRlciA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBVUkwgZW5jb2Rlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVUVuY29kZXIgdXJsRW5jb2RlciA9IG5ldyBVRW5jb2RlcigpOworCisKKyAgICAvKioKKyAgICAgKiBSZWN5Y2xhYmxlIGJ1ZmZlciB0byBob2xkIHRoZSByZWRpcmVjdCBVUkwuCisgICAgICovCisgICAgcHJvdGVjdGVkIENoYXJDaHVuayByZWRpcmVjdFVSTENDID0gbmV3IENoYXJDaHVuaygpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVsZWFzZSBhbGwgb2JqZWN0IHJlZmVyZW5jZXMsIGFuZCBpbml0aWFsaXplIGluc3RhbmNlIHZhcmlhYmxlcywgaW4KKyAgICAgKiBwcmVwYXJhdGlvbiBmb3IgcmV1c2Ugb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKKworICAgICAgICBvdXRwdXRCdWZmZXIucmVjeWNsZSgpOworICAgICAgICB1c2luZ091dHB1dFN0cmVhbSA9IGZhbHNlOworICAgICAgICB1c2luZ1dyaXRlciA9IGZhbHNlOworICAgICAgICBhcHBDb21taXR0ZWQgPSBmYWxzZTsKKyAgICAgICAgaW5jbHVkZWQgPSBmYWxzZTsKKyAgICAgICAgZXJyb3IgPSBmYWxzZTsKKyAgICAgICAgaXNDaGFyYWN0ZXJFbmNvZGluZ1NldCA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgY29va2llcy5jbGVhcigpOworCisgICAgICAgIGlmIChDb25zdGFudHMuU0VDVVJJVFkpIHsKKyAgICAgICAgICAgIGlmIChmYWNhZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZhY2FkZS5jbGVhcigpOworICAgICAgICAgICAgICAgIGZhY2FkZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlci5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXNwb25zZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb250ZW50Q291bnQoKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRCdWZmZXIuZ2V0Q29udGVudFdyaXR0ZW4oKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXBwbGljYXRpb24gY29tbWl0IGZsYWcuCisgICAgICogCisgICAgICogQHBhcmFtIGFwcENvbW1pdHRlZCBUaGUgbmV3IGFwcGxpY2F0aW9uIGNvbW1pdHRlZCBmbGFnIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXBwQ29tbWl0dGVkKGJvb2xlYW4gYXBwQ29tbWl0dGVkKSB7CisgICAgICAgIHRoaXMuYXBwQ29tbWl0dGVkID0gYXBwQ29tbWl0dGVkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQXBwbGljYXRpb24gY29tbWl0IGZsYWcgYWNjZXNzb3IuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBcHBDb21taXR0ZWQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5hcHBDb21taXR0ZWQgfHwgaXNDb21taXR0ZWQoKSB8fCBpc1N1c3BlbmRlZCgpCisgICAgICAgICAgICAgICAgfHwgKChnZXRDb250ZW50TGVuZ3RoKCkgPiAwKSAKKyAgICAgICAgICAgICAgICAgICAgJiYgKGdldENvbnRlbnRDb3VudCgpID49IGdldENvbnRlbnRMZW5ndGgoKSkpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgInByb2Nlc3NpbmcgaW5zaWRlIGFuIGluY2x1ZGUiIGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVkZWQoKSB7CisgICAgICAgIHJldHVybiBpbmNsdWRlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgInByb2Nlc3NpbmcgaW5zaWRlIGFuIGluY2x1ZGUiIGZsYWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgd2UgYXJlIGN1cnJlbnRseSBpbnNpZGUgYQorICAgICAqICBSZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCksIGVsc2UgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZWQoYm9vbGVhbiBpbmNsdWRlZCkgeworICAgICAgICB0aGlzLmluY2x1ZGVkID0gaW5jbHVkZWQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBSZXNwb25zZSBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisgICAgICAgIHJldHVybiAoaW5mbyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCB3aXRoIHdoaWNoIHRoaXMgcmVzcG9uc2UgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVxdWVzdCByZXF1ZXN0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUmVxdWVzdCB3aXRoIHdoaWNoIHRoaXMgUmVzcG9uc2UgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdCBnZXRSZXF1ZXN0KCkgeworICAgICAgICByZXR1cm4gKHRoaXMucmVxdWVzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBSZXF1ZXN0IHdpdGggd2hpY2ggdGhpcyBSZXNwb25zZSBpcyBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIG5ldyBhc3NvY2lhdGVkIHJlcXVlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICB0aGlzLnJlcXVlc3QgPSAoUmVxdWVzdCkgcmVxdWVzdDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBmYWNhZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVzcG9uc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlc3BvbnNlRmFjYWRlIGZhY2FkZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPlNlcnZsZXRSZXNwb25zZTwvY29kZT4gZm9yIHdoaWNoIHRoaXMgb2JqZWN0CisgICAgICogaXMgdGhlIGZhY2FkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSHR0cFNlcnZsZXRSZXNwb25zZSBnZXRSZXNwb25zZSgpIHsKKyAgICAgICAgaWYgKGZhY2FkZSA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWNhZGUgPSBuZXcgUmVzcG9uc2VGYWNhZGUodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChmYWNhZGUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvdXRwdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlc3BvbnNlLgorICAgICAqLworICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0U3RyZWFtKCkgeworICAgICAgICBpZiAob3V0cHV0U3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG5ldyBDb3lvdGVPdXRwdXRTdHJlYW0ob3V0cHV0QnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3V0cHV0U3RyZWFtOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvdXRwdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmVhbSBUaGUgbmV3IG91dHB1dCBzdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJlYW0oT3V0cHV0U3RyZWFtIHN0cmVhbSkgeworICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBldmlsCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN1c3BlbmRlZCBmbGFnLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdXNwZW5kZWQgVGhlIG5ldyBzdXNwZW5kZWQgZmxhZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN1c3BlbmRlZChib29sZWFuIHN1c3BlbmRlZCkgeworICAgICAgICBvdXRwdXRCdWZmZXIuc2V0U3VzcGVuZGVkKHN1c3BlbmRlZCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdXNwZW5kZWQgZmxhZyBhY2Nlc3Nvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N1c3BlbmRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dEJ1ZmZlci5pc1N1c3BlbmRlZCgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBlcnJvciBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yKCkgeworICAgICAgICBlcnJvciA9IHRydWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFcnJvciBmbGFnIGFjY2Vzc29yLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRXJyb3IoKSB7CisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgU2VydmxldE91dHB1dFN0cmVhbSB0byB3cml0ZSB0aGUgY29udGVudAorICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlc3BvbnNlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gY3JlYXRlT3V0cHV0U3RyZWFtKCkgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFByb2JhYmx5IHVzZWxlc3MKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgQ295b3RlT3V0cHV0U3RyZWFtKG91dHB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG91dHB1dFN0cmVhbTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gd2hhdGV2ZXIgYWN0aW9ucyBhcmUgcmVxdWlyZWQgdG8gZmx1c2ggYW5kIGNsb3NlIHRoZSBvdXRwdXQKKyAgICAgKiBzdHJlYW0gb3Igd3JpdGVyLCBpbiBhIHNpbmdsZSBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaW5pc2hSZXNwb25zZSgpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBXcml0aW5nIGxlZnRvdmVyIGJ5dGVzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXIuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisJICAgIDsKKyAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgdCkgeworCSAgICB0LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbnRlbnQgbGVuZ3RoIHRoYXQgd2FzIHNldCBvciBjYWxjdWxhdGVkIGZvciB0aGlzIFJlc3BvbnNlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q29udGVudExlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIChjb3lvdGVSZXNwb25zZS5nZXRDb250ZW50TGVuZ3RoKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb250ZW50IHR5cGUgdGhhdCB3YXMgc2V0IG9yIGNhbGN1bGF0ZWQgZm9yIHRoaXMgcmVzcG9uc2UsCisgICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gY29udGVudCB0eXBlIHdhcyBzZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIChjb3lvdGVSZXNwb25zZS5nZXRDb250ZW50VHlwZSgpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFByaW50V3JpdGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVuZGVyIGVycm9yIG1lc3NhZ2VzLAorICAgICAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhIHN0cmVhbSBvciB3cml0ZXIgaGFzIGFscmVhZHkgYmVlbiBhY3F1aXJlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gV3JpdGVyIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBlcnJvciByZXBvcnRzLiBJZiB0aGUgcmVzcG9uc2UgaXMKKyAgICAgKiBub3QgYW4gZXJyb3IgcmVwb3J0IHJldHVybmVkIHVzaW5nIHNlbmRFcnJvciBvciB0cmlnZ2VyZWQgYnkgYW4KKyAgICAgKiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiB0aHJvd24gZHVyaW5nIHRoZSBzZXJ2bGV0IHByb2Nlc3NpbmcKKyAgICAgKiAoYW5kIG9ubHkgaW4gdGhhdCBjYXNlKSwgbnVsbCB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSByZXNwb25zZSBzdHJlYW0KKyAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0UmVwb3J0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAob3V0cHV0QnVmZmVyLmlzTmV3KCkpIHsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5jaGVja0NvbnZlcnRlcigpOworICAgICAgICAgICAgaWYgKHdyaXRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyID0gbmV3IENveW90ZVdyaXRlcihvdXRwdXRCdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHdyaXRlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VydmxldFJlc3BvbnNlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIGJ1ZmZlciBhbmQgY29tbWl0IHRoaXMgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaEJ1ZmZlcigpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXRwdXRCdWZmZXIuZmx1c2goKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplIHVzZWQgZm9yIHRoaXMgUmVzcG9uc2UuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRCdWZmZXJTaXplKCkgeworICAgICAgICByZXR1cm4gb3V0cHV0QnVmZmVyLmdldEJ1ZmZlclNpemUoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgZm9yIHRoaXMgUmVzcG9uc2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpIHsKKyAgICAgICAgcmV0dXJuIChjb3lvdGVSZXNwb25zZS5nZXRDaGFyYWN0ZXJFbmNvZGluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VydmxldCBvdXRwdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlc3BvbnNlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+Z2V0V3JpdGVyPC9jb2RlPiBoYXMKKyAgICAgKiAgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXNwb25zZQorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0T3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmICh1c2luZ1dyaXRlcikKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJjb3lvdGVSZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0uaXNlIikpOworCisgICAgICAgIHVzaW5nT3V0cHV0U3RyZWFtID0gdHJ1ZTsKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgQ295b3RlT3V0cHV0U3RyZWFtKG91dHB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG91dHB1dFN0cmVhbTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMb2NhbGUgYXNzaWduZWQgdG8gdGhpcyByZXNwb25zZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIChjb3lvdGVSZXNwb25zZS5nZXRMb2NhbGUoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHdyaXRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIDxjb2RlPmdldE91dHB1dFN0cmVhbTwvY29kZT4gaGFzCisgICAgICogIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIHRoaXMgcmVzcG9uc2UKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKCkgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHVzaW5nT3V0cHV0U3RyZWFtKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImNveW90ZVJlc3BvbnNlLmdldFdyaXRlci5pc2UiKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIHJlc3BvbnNlJ3MgY2hhcmFjdGVyIGVuY29kaW5nIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgYXMKKyAgICAgICAgICogZGVzY3JpYmVkIGluIDxjb2RlPmdldENoYXJhY3RlckVuY29kaW5nPC9jb2RlPiAoaS5lLiwgdGhlIG1ldGhvZAorICAgICAgICAgKiBqdXN0IHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgPGNvZGU+SVNPLTg4NTktMTwvY29kZT4pLAorICAgICAgICAgKiA8Y29kZT5nZXRXcml0ZXI8L2NvZGU+IHVwZGF0ZXMgaXQgdG8gPGNvZGU+SVNPLTg4NTktMTwvY29kZT4KKyAgICAgICAgICogKHdpdGggdGhlIGVmZmVjdCB0aGF0IGEgc3Vic2VxdWVudCBjYWxsIHRvIGdldENvbnRlbnRUeXBlKCkgd2lsbAorICAgICAgICAgKiBpbmNsdWRlIGEgY2hhcnNldD1JU08tODg1OS0xIGNvbXBvbmVudCB3aGljaCB3aWxsIGFsc28gYmUKKyAgICAgICAgICogcmVmbGVjdGVkIGluIHRoZSBDb250ZW50LVR5cGUgcmVzcG9uc2UgaGVhZGVyLCB0aGVyZWJ5IHNhdGlzZnlpbmcKKyAgICAgICAgICogdGhlIFNlcnZsZXQgc3BlYyByZXF1aXJlbWVudCB0aGF0IGNvbnRhaW5lcnMgbXVzdCBjb21tdW5pY2F0ZSB0aGUKKyAgICAgICAgICogY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgZm9yIHRoZSBzZXJ2bGV0IHJlc3BvbnNlJ3Mgd3JpdGVyIHRvIHRoZQorICAgICAgICAgKiBjbGllbnQpLgorICAgICAgICAgKi8KKyAgICAgICAgc2V0Q2hhcmFjdGVyRW5jb2RpbmcoZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSk7CisKKyAgICAgICAgdXNpbmdXcml0ZXIgPSB0cnVlOworICAgICAgICBvdXRwdXRCdWZmZXIuY2hlY2tDb252ZXJ0ZXIoKTsKKyAgICAgICAgaWYgKHdyaXRlciA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgQ295b3RlV3JpdGVyKG91dHB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdyaXRlcjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSGFzIHRoZSBvdXRwdXQgb2YgdGhpcyByZXNwb25zZSBhbHJlYWR5IGJlZW4gY29tbWl0dGVkPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWl0dGVkKCkgeworICAgICAgICByZXR1cm4gKGNveW90ZVJlc3BvbnNlLmlzQ29tbWl0dGVkKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2xlYXIgYW55IGNvbnRlbnQgd3JpdHRlbiB0byB0aGUgYnVmZmVyLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyByZXNwb25zZSBoYXMgYWxyZWFkeQorICAgICAqICBiZWVuIGNvbW1pdHRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworCisgICAgICAgIGlmIChpbmNsdWRlZCkKKyAgICAgICAgICAgIHJldHVybjsgICAgIC8vIElnbm9yZSBhbnkgY2FsbCBmcm9tIGFuIGluY2x1ZGVkIHNlcnZsZXQKKworICAgICAgICBjb3lvdGVSZXNwb25zZS5yZXNldCgpOworICAgICAgICBvdXRwdXRCdWZmZXIucmVzZXQoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlc2V0IHRoZSBkYXRhIGJ1ZmZlciBidXQgbm90IGFueSBzdGF0dXMgb3IgaGVhZGVyIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHJlc3BvbnNlIGhhcyBhbHJlYWR5CisgICAgICogIGJlZW4gY29tbWl0dGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXRCdWZmZXIoKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiY295b3RlUmVzcG9uc2UucmVzZXRCdWZmZXIuaXNlIikpOworCisgICAgICAgIG91dHB1dEJ1ZmZlci5yZXNldCgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJ1ZmZlciBzaXplIHRvIGJlIHVzZWQgZm9yIHRoaXMgUmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgbmV3IGJ1ZmZlciBzaXplCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIKKyAgICAgKiAgb3V0cHV0IGhhcyBiZWVuIGNvbW1pdHRlZCBmb3IgdGhpcyByZXNwb25zZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJ1ZmZlclNpemUoaW50IHNpemUpIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSB8fCAhb3V0cHV0QnVmZmVyLmlzTmV3KCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiY295b3RlUmVzcG9uc2Uuc2V0QnVmZmVyU2l6ZS5pc2UiKSk7CisKKyAgICAgICAgb3V0cHV0QnVmZmVyLnNldEJ1ZmZlclNpemUoc2l6ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29udGVudCBsZW5ndGggKGluIGJ5dGVzKSBmb3IgdGhpcyBSZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBjb250ZW50IGxlbmd0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRMZW5ndGgoaW50IGxlbmd0aCkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIElnbm9yZSBhbnkgY2FsbCBmcm9tIGFuIGluY2x1ZGVkIHNlcnZsZXQKKyAgICAgICAgaWYgKGluY2x1ZGVkKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKHVzaW5nV3JpdGVyKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgY295b3RlUmVzcG9uc2Uuc2V0Q29udGVudExlbmd0aChsZW5ndGgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbnRlbnQgdHlwZSBmb3IgdGhpcyBSZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIFRoZSBuZXcgY29udGVudCB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIHR5cGUpIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBJZ25vcmUgYW55IGNhbGwgZnJvbSBhbiBpbmNsdWRlZCBzZXJ2bGV0CisgICAgICAgIGlmIChpbmNsdWRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBJZ25vcmUgY2hhcnNldCBpZiBnZXRXcml0ZXIoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZAorICAgICAgICBpZiAodXNpbmdXcml0ZXIpIHsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSB0eXBlLmluZGV4T2YoIjsiKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHR5cGUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb3lvdGVSZXNwb25zZS5zZXRDb250ZW50VHlwZSh0eXBlKTsKKworICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgY29udGVudCB0eXBlIGNvbnRhaW5zIGNoYXJzZXQKKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gdHlwZS5pbmRleE9mKCI7Iik7CisgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gdHlwZS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGxlbiAmJiBDaGFyYWN0ZXIuaXNTcGFjZSh0eXBlLmNoYXJBdChpbmRleCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbmRleCs3IDwgbGVuCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlLmNoYXJBdChpbmRleCkgPT0gJ2MnCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlLmNoYXJBdChpbmRleCsxKSA9PSAnaCcKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGUuY2hhckF0KGluZGV4KzIpID09ICdhJworICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZS5jaGFyQXQoaW5kZXgrMykgPT0gJ3InCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlLmNoYXJBdChpbmRleCs0KSA9PSAncycKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGUuY2hhckF0KGluZGV4KzUpID09ICdlJworICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZS5jaGFyQXQoaW5kZXgrNikgPT0gJ3QnCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlLmNoYXJBdChpbmRleCs3KSA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNDaGFyYWN0ZXJFbmNvZGluZ1NldCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIE92ZXJyaWRlcyB0aGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgaW4gdGhlIGJvZHkKKyAgICAgKiBvZiB0aGUgcmVxdWVzdC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gcmVhZGluZworICAgICAqIHJlcXVlc3QgcGFyYW1ldGVycyBvciByZWFkaW5nIGlucHV0IHVzaW5nIGdldFJlYWRlcigpLgorICAgICAqCisgICAgICogQHBhcmFtIGNoYXJzZXQgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGNoYXJhcmFjdGVyIGVuY29kaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlckVuY29kaW5nKFN0cmluZyBjaGFyc2V0KSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICAvLyBJZ25vcmUgYW55IGNhbGwgZnJvbSBhbiBpbmNsdWRlZCBzZXJ2bGV0CisgICAgICAgIGlmIChpbmNsdWRlZCkKKyAgICAgICAgICAgIHJldHVybjsgICAgIAorICAgICAgICAKKyAgICAgICAgLy8gSWdub3JlIGFueSBjYWxsIG1hZGUgYWZ0ZXIgdGhlIGdldFdyaXRlciBoYXMgYmVlbiBpbnZva2VkCisgICAgICAgIC8vIFRoZSBkZWZhdWx0IHNob3VsZCBiZSB1c2VkCisgICAgICAgIGlmICh1c2luZ1dyaXRlcikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBjb3lvdGVSZXNwb25zZS5zZXRDaGFyYWN0ZXJFbmNvZGluZyhjaGFyc2V0KTsKKyAgICAgICAgaXNDaGFyYWN0ZXJFbmNvZGluZ1NldCA9IHRydWU7CisgICAgfQorCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBMb2NhbGUgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhpcyByZXNwb25zZSwgaW5jbHVkaW5nCisgICAgICogc2V0dGluZyB0aGUgYXBwcm9wcmlhdGUgY2hhcmFjdGVyIGVuY29kaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsZSBUaGUgbmV3IGxvY2FsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gSWdub3JlIGFueSBjYWxsIGZyb20gYW4gaW5jbHVkZWQgc2VydmxldAorICAgICAgICBpZiAoaW5jbHVkZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY295b3RlUmVzcG9uc2Uuc2V0TG9jYWxlKGxvY2FsZSk7CisKKyAgICAgICAgLy8gSWdub3JlIGFueSBjYWxsIG1hZGUgYWZ0ZXIgdGhlIGdldFdyaXRlciBoYXMgYmVlbiBpbnZva2VkLgorICAgICAgICAvLyBUaGUgZGVmYXVsdCBzaG91bGQgYmUgdXNlZAorICAgICAgICBpZiAodXNpbmdXcml0ZXIpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKGlzQ2hhcmFjdGVyRW5jb2RpbmdTZXQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIENoYXJzZXRNYXBwZXIgY20gPSBnZXRDb250ZXh0KCkuZ2V0Q2hhcnNldE1hcHBlcigpOworICAgICAgICBTdHJpbmcgY2hhcnNldCA9IGNtLmdldENoYXJzZXQoIGxvY2FsZSApOworICAgICAgICBpZiAoIGNoYXJzZXQgIT0gbnVsbCApeworICAgICAgICAgICAgY295b3RlUmVzcG9uc2Uuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoY2hhcnNldCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEh0dHBSZXNwb25zZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcnJheSBvZiBhbGwgY29va2llcyBzZXQgZm9yIHRoaXMgcmVzcG9uc2UsIG9yCisgICAgICogYSB6ZXJvLWxlbmd0aCBhcnJheSBpZiBubyBjb29raWVzIGhhdmUgYmVlbiBzZXQuCisgICAgICovCisgICAgcHVibGljIENvb2tpZVtdIGdldENvb2tpZXMoKSB7CisgICAgICAgIHJldHVybiAoKENvb2tpZVtdKSBjb29raWVzLnRvQXJyYXkobmV3IENvb2tpZVtjb29raWVzLnNpemUoKV0pKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgaGVhZGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzCisgICAgICogaGVhZGVyIGhhcyBub3QgYmVlbiBzZXQuICBJZiBtb3JlIHRoYW4gb25lIHZhbHVlIHdhcyBhZGRlZCBmb3IgdGhpcworICAgICAqIG5hbWUsIG9ubHkgdGhlIGZpcnN0IGlzIHJldHVybmVkOyB1c2UgZ2V0SGVhZGVyVmFsdWVzKCkgdG8gcmV0cmlldmUgYWxsCisgICAgICogb2YgdGhlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIEhlYWRlciBuYW1lIHRvIGxvb2sgdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gY295b3RlUmVzcG9uc2UuZ2V0TWltZUhlYWRlcnMoKS5nZXRIZWFkZXIobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgYWxsIHRoZSBoZWFkZXIgbmFtZXMgc2V0IGZvciB0aGlzIHJlc3BvbnNlLCBvcgorICAgICAqIGEgemVyby1sZW5ndGggYXJyYXkgaWYgbm8gaGVhZGVycyBoYXZlIGJlZW4gc2V0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRIZWFkZXJOYW1lcygpIHsKKworICAgICAgICBNaW1lSGVhZGVycyBoZWFkZXJzID0gY295b3RlUmVzcG9uc2UuZ2V0TWltZUhlYWRlcnMoKTsKKyAgICAgICAgaW50IG4gPSBoZWFkZXJzLnNpemUoKTsKKyAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tuXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdFtpXSA9IGhlYWRlcnMuZ2V0TmFtZShpKS50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcnJheSBvZiBhbGwgdGhlIGhlYWRlciB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBoZWFkZXIgbmFtZSwgb3IgYW4gemVyby1sZW5ndGggYXJyYXkgaWYgdGhlcmUgYXJlIG5vIHN1Y2gKKyAgICAgKiBoZWFkZXIgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgSGVhZGVyIG5hbWUgdG8gbG9vayB1cAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRIZWFkZXJWYWx1ZXMoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IGNveW90ZVJlc3BvbnNlLmdldE1pbWVIZWFkZXJzKCkudmFsdWVzKG5hbWUpOworICAgICAgICBWZWN0b3IgcmVzdWx0ID0gbmV3IFZlY3RvcigpOworICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGRFbGVtZW50KGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCkpOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIHJlc3VsdEFycmF5ID0gbmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXTsKKyAgICAgICAgcmVzdWx0LmNvcHlJbnRvKHJlc3VsdEFycmF5KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdEFycmF5OworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UgdGhhdCB3YXMgc2V0IHdpdGggPGNvZGU+c2VuZEVycm9yKCk8L2NvZGU+CisgICAgICogZm9yIHRoaXMgUmVzcG9uc2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gY295b3RlUmVzcG9uc2UuZ2V0TWVzc2FnZSgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBIVFRQIHN0YXR1cyBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlc3BvbnNlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkgeworICAgICAgICByZXR1cm4gY295b3RlUmVzcG9uc2UuZ2V0U3RhdHVzKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXNldCB0aGlzIHJlc3BvbnNlLCBhbmQgc3BlY2lmeSB0aGUgdmFsdWVzIGZvciB0aGUgSFRUUCBzdGF0dXMgY29kZQorICAgICAqIGFuZCBjb3JyZXNwb25kaW5nIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIHJlc3BvbnNlIGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgKiAgY29tbWl0dGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoaW50IHN0YXR1cywgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgc2V0U3RhdHVzKHN0YXR1cywgbWVzc2FnZSk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIdHRwU2VydmxldFJlc3BvbnNlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBzcGVjaWZpZWQgQ29va2llIHRvIHRob3NlIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCB3aXRoCisgICAgICogdGhpcyBSZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb29raWUgQ29va2llIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29va2llKGZpbmFsIENvb2tpZSBjb29raWUpIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBJZ25vcmUgYW55IGNhbGwgZnJvbSBhbiBpbmNsdWRlZCBzZXJ2bGV0CisgICAgICAgIGlmIChpbmNsdWRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBjb29raWVzLmFkZChjb29raWUpOworCisgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpeworICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJDb29raWUuYXBwZW5kQ29va2llVmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIChzYiwgY29va2llLmdldFZlcnNpb24oKSwgY29va2llLmdldE5hbWUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llLmdldFZhbHVlKCksIGNvb2tpZS5nZXRQYXRoKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZS5nZXREb21haW4oKSwgY29va2llLmdldENvbW1lbnQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llLmdldE1heEFnZSgpLCBjb29raWUuZ2V0U2VjdXJlKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNlcnZlckNvb2tpZS5hcHBlbmRDb29raWVWYWx1ZQorICAgICAgICAgICAgICAgIChzYiwgY29va2llLmdldFZlcnNpb24oKSwgY29va2llLmdldE5hbWUoKSwgY29va2llLmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICBjb29raWUuZ2V0UGF0aCgpLCBjb29raWUuZ2V0RG9tYWluKCksIGNvb2tpZS5nZXRDb21tZW50KCksIAorICAgICAgICAgICAgICAgICAgICAgY29va2llLmdldE1heEFnZSgpLCBjb29raWUuZ2V0U2VjdXJlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlIGhlYWRlciBuYW1lIGlzIFNldC1Db29raWUgZm9yIGJvdGggIm9sZCIgYW5kIHYuMSAoIFJGQzIxMDkgKQorICAgICAgICAvLyBSRkMyOTY1IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYnJvd3NlcnMgYW5kIHRoZSBTZXJ2bGV0IHNwZWMKKyAgICAgICAgLy8gYXNrcyBmb3IgMjEwOS4KKyAgICAgICAgYWRkSGVhZGVyKCJTZXQtQ29va2llIiwgc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgc3BlY2lmaWVkIGRhdGUgaGVhZGVyIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBoZWFkZXIgdG8gc2V0CisgICAgICogQHBhcmFtIHZhbHVlIERhdGUgdmFsdWUgdG8gYmUgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIElnbm9yZSBhbnkgY2FsbCBmcm9tIGFuIGluY2x1ZGVkIHNlcnZsZXQKKyAgICAgICAgaWYgKGluY2x1ZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm9ybWF0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KERhdGVUb29sLkhUVFBfUkVTUE9OU0VfREFURV9IRUFERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUuVVMpOworICAgICAgICAgICAgZm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7CisgICAgICAgIH0KKworICAgICAgICBhZGRIZWFkZXIobmFtZSwgRmFzdEh0dHBEYXRlRm9ybWF0LmZvcm1hdERhdGUodmFsdWUsIGZvcm1hdCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIHNwZWNpZmllZCBoZWFkZXIgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGhlYWRlciB0byBzZXQKKyAgICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gYmUgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBJZ25vcmUgYW55IGNhbGwgZnJvbSBhbiBpbmNsdWRlZCBzZXJ2bGV0CisgICAgICAgIGlmIChpbmNsdWRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBjb3lvdGVSZXNwb25zZS5hZGRIZWFkZXIobmFtZSwgdmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIHNwZWNpZmllZCBpbnRlZ2VyIGhlYWRlciB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgaGVhZGVyIHRvIHNldAorICAgICAqIEBwYXJhbSB2YWx1ZSBJbnRlZ2VyIHZhbHVlIHRvIGJlIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gSWdub3JlIGFueSBjYWxsIGZyb20gYW4gaW5jbHVkZWQgc2VydmxldAorICAgICAgICBpZiAoaW5jbHVkZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgYWRkSGVhZGVyKG5hbWUsICIiICsgdmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhlIHNwZWNpZmllZCBoZWFkZXIgYmVlbiBzZXQgYWxyZWFkeSBpbiB0aGlzIHJlc3BvbnNlPworICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgaGVhZGVyIHRvIGNoZWNrCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgLy8gTmVlZCBzcGVjaWFsIGhhbmRsaW5nIGZvciBDb250ZW50LVR5cGUgYW5kIENvbnRlbnQtTGVuZ3RoIGR1ZSB0bworICAgICAgICAvLyBzcGVjaWFsIGhhbmRsaW5nIG9mIHRoZXNlIGluIGNveW90ZVJlc3BvbnNlCisgICAgICAgIGNoYXIgY2M9bmFtZS5jaGFyQXQoMCk7CisgICAgICAgIGlmKGNjPT0nQycgfHwgY2M9PSdjJykgeworICAgICAgICAgICAgaWYobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJDb250ZW50LVR5cGUiKSkgeworICAgICAgICAgICAgICAgIC8vIFdpbGwgcmV0dXJuIG51bGwgaWYgdGhpcyBoYXMgbm90IGJlZW4gc2V0CisgICAgICAgICAgICAgICAgcmV0dXJuIChjb3lvdGVSZXNwb25zZS5nZXRDb250ZW50VHlwZSgpICE9IG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJDb250ZW50LUxlbmd0aCIpKSB7CisgICAgICAgICAgICAgICAgLy8gLTEgbWVhbnMgbm90IGtub3duIGFuZCBpcyBub3Qgc2VudCB0byBjbGllbnQKKyAgICAgICAgICAgICAgICByZXR1cm4gKGNveW90ZVJlc3BvbnNlLmdldENvbnRlbnRMZW5ndGhMb25nKCkgIT0gLTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNveW90ZVJlc3BvbnNlLmNvbnRhaW5zSGVhZGVyKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW5jb2RlIHRoZSBzZXNzaW9uIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVzcG9uc2UKKyAgICAgKiBpbnRvIHRoZSBzcGVjaWZpZWQgcmVkaXJlY3QgVVJMLCBpZiBuZWNlc3NhcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIFVSTCB0byBiZSBlbmNvZGVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVSZWRpcmVjdFVSTChTdHJpbmcgdXJsKSB7CisKKyAgICAgICAgaWYgKGlzRW5jb2RlYWJsZSh0b0Fic29sdXRlKHVybCkpKSB7CisgICAgICAgICAgICByZXR1cm4gKHRvRW5jb2RlZCh1cmwsIHJlcXVlc3QuZ2V0U2Vzc2lvbkludGVybmFsKCkuZ2V0SWRJbnRlcm5hbCgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKHVybCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW5jb2RlIHRoZSBzZXNzaW9uIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVzcG9uc2UKKyAgICAgKiBpbnRvIHRoZSBzcGVjaWZpZWQgcmVkaXJlY3QgVVJMLCBpZiBuZWNlc3NhcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIFVSTCB0byBiZSBlbmNvZGVkCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBWZXJzaW9uIDIuMSBvZiB0aGUgSmF2YSBTZXJ2bGV0IEFQSSwgdXNlCisgICAgICogIDxjb2RlPmVuY29kZVJlZGlyZWN0VVJMKCk8L2NvZGU+IGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVSZWRpcmVjdFVybChTdHJpbmcgdXJsKSB7CisgICAgICAgIHJldHVybiAoZW5jb2RlUmVkaXJlY3RVUkwodXJsKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbmNvZGUgdGhlIHNlc3Npb24gaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXNwb25zZQorICAgICAqIGludG8gdGhlIHNwZWNpZmllZCBVUkwsIGlmIG5lY2Vzc2FyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgVVJMIHRvIGJlIGVuY29kZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVSTChTdHJpbmcgdXJsKSB7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgYWJzb2x1dGUgPSB0b0Fic29sdXRlKHVybCk7CisgICAgICAgIGlmIChpc0VuY29kZWFibGUoYWJzb2x1dGUpKSB7CisgICAgICAgICAgICAvLyBXM2Mgc3BlYyBjbGVhcmx5IHNhaWQgCisgICAgICAgICAgICBpZiAodXJsLmVxdWFsc0lnbm9yZUNhc2UoIiIpKXsKKyAgICAgICAgICAgICAgICB1cmwgPSBhYnNvbHV0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAodG9FbmNvZGVkKHVybCwgcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwoKS5nZXRJZEludGVybmFsKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAodXJsKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbmNvZGUgdGhlIHNlc3Npb24gaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXNwb25zZQorICAgICAqIGludG8gdGhlIHNwZWNpZmllZCBVUkwsIGlmIG5lY2Vzc2FyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgVVJMIHRvIGJlIGVuY29kZWQKKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIFZlcnNpb24gMi4xIG9mIHRoZSBKYXZhIFNlcnZsZXQgQVBJLCB1c2UKKyAgICAgKiAgPGNvZGU+ZW5jb2RlVVJMKCk8L2NvZGU+IGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVVcmwoU3RyaW5nIHVybCkgeworICAgICAgICByZXR1cm4gKGVuY29kZVVSTCh1cmwpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlbmQgYW4gYWNrbm93bGVkZ21lbnQgb2YgYSByZXF1ZXN0LgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRBY2tub3dsZWRnZW1lbnQoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIElnbm9yZSBhbnkgY2FsbCBmcm9tIGFuIGluY2x1ZGVkIHNlcnZsZXQKKyAgICAgICAgaWYgKGluY2x1ZGVkKQorICAgICAgICAgICAgcmV0dXJuOyAKKworICAgICAgICBjb3lvdGVSZXNwb25zZS5hY2tub3dsZWRnZSgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZW5kIGFuIGVycm9yIHJlc3BvbnNlIHdpdGggdGhlIHNwZWNpZmllZCBzdGF0dXMgYW5kIGEKKyAgICAgKiBkZWZhdWx0IG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdHVzIEhUVFAgc3RhdHVzIGNvZGUgdG8gc2VuZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyByZXNwb25zZSBoYXMKKyAgICAgKiAgYWxyZWFkeSBiZWVuIGNvbW1pdHRlZAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgc3RhdHVzKSAKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc2VuZEVycm9yKHN0YXR1cywgbnVsbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZW5kIGFuIGVycm9yIHJlc3BvbnNlIHdpdGggdGhlIHNwZWNpZmllZCBzdGF0dXMgYW5kIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdHVzIEhUVFAgc3RhdHVzIGNvZGUgdG8gc2VuZAorICAgICAqIEBwYXJhbSBtZXNzYWdlIENvcnJlc3BvbmRpbmcgbWVzc2FnZSB0byBzZW5kCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIHJlc3BvbnNlIGhhcworICAgICAqICBhbHJlYWR5IGJlZW4gY29tbWl0dGVkCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBzdGF0dXMsIFN0cmluZyBtZXNzYWdlKSAKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJjb3lvdGVSZXNwb25zZS5zZW5kRXJyb3IuaXNlIikpOworCisgICAgICAgIC8vIElnbm9yZSBhbnkgY2FsbCBmcm9tIGFuIGluY2x1ZGVkIHNlcnZsZXQKKyAgICAgICAgaWYgKGluY2x1ZGVkKQorICAgICAgICAgICAgcmV0dXJuOyAKKworICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSBnZXRSZXF1ZXN0KCkuZ2V0V3JhcHBlcigpOworICAgICAgICBpZiAod3JhcHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICB3cmFwcGVyLmluY3JlbWVudEVycm9yQ291bnQoKTsKKyAgICAgICAgfSAKKworICAgICAgICBzZXRFcnJvcigpOworCisgICAgICAgIGNveW90ZVJlc3BvbnNlLnNldFN0YXR1cyhzdGF0dXMpOworICAgICAgICBjb3lvdGVSZXNwb25zZS5zZXRNZXNzYWdlKG1lc3NhZ2UpOworCisgICAgICAgIC8vIENsZWFyIGFueSBkYXRhIGNvbnRlbnQgdGhhdCBoYXMgYmVlbiBidWZmZXJlZAorICAgICAgICByZXNldEJ1ZmZlcigpOworCisgICAgICAgIC8vIENhdXNlIHRoZSByZXNwb25zZSB0byBiZSBmaW5pc2hlZCAoZnJvbSB0aGUgYXBwbGljYXRpb24gcGVyc3BlY3RpdmUpCisgICAgICAgIHNldFN1c3BlbmRlZCh0cnVlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VuZCBhIHRlbXBvcmFyeSByZWRpcmVjdCB0byB0aGUgc3BlY2lmaWVkIHJlZGlyZWN0IGxvY2F0aW9uIFVSTC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhdGlvbiBMb2NhdGlvbiBVUkwgdG8gcmVkaXJlY3QgdG8KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgcmVzcG9uc2UgaGFzCisgICAgICogIGFscmVhZHkgYmVlbiBjb21taXR0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kUmVkaXJlY3QoU3RyaW5nIGxvY2F0aW9uKSAKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJjb3lvdGVSZXNwb25zZS5zZW5kUmVkaXJlY3QuaXNlIikpOworCisgICAgICAgIC8vIElnbm9yZSBhbnkgY2FsbCBmcm9tIGFuIGluY2x1ZGVkIHNlcnZsZXQKKyAgICAgICAgaWYgKGluY2x1ZGVkKQorICAgICAgICAgICAgcmV0dXJuOyAKKworICAgICAgICAvLyBDbGVhciBhbnkgZGF0YSBjb250ZW50IHRoYXQgaGFzIGJlZW4gYnVmZmVyZWQKKyAgICAgICAgcmVzZXRCdWZmZXIoKTsKKworICAgICAgICAvLyBHZW5lcmF0ZSBhIHRlbXBvcmFyeSByZWRpcmVjdCB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgYWJzb2x1dGUgPSB0b0Fic29sdXRlKGxvY2F0aW9uKTsKKyAgICAgICAgICAgIHNldFN0YXR1cyhTQ19GT1VORCk7CisgICAgICAgICAgICBzZXRIZWFkZXIoIkxvY2F0aW9uIiwgYWJzb2x1dGUpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc2V0U3RhdHVzKFNDX05PVF9GT1VORCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDYXVzZSB0aGUgcmVzcG9uc2UgdG8gYmUgZmluaXNoZWQgKGZyb20gdGhlIGFwcGxpY2F0aW9uIHBlcnNwZWN0aXZlKQorICAgICAgICBzZXRTdXNwZW5kZWQodHJ1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIGRhdGUgaGVhZGVyIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBoZWFkZXIgdG8gc2V0CisgICAgICogQHBhcmFtIHZhbHVlIERhdGUgdmFsdWUgdG8gYmUgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIElnbm9yZSBhbnkgY2FsbCBmcm9tIGFuIGluY2x1ZGVkIHNlcnZsZXQKKyAgICAgICAgaWYgKGluY2x1ZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm9ybWF0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KERhdGVUb29sLkhUVFBfUkVTUE9OU0VfREFURV9IRUFERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUuVVMpOworICAgICAgICAgICAgZm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7CisgICAgICAgIH0KKworICAgICAgICBzZXRIZWFkZXIobmFtZSwgRmFzdEh0dHBEYXRlRm9ybWF0LmZvcm1hdERhdGUodmFsdWUsIGZvcm1hdCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwZWNpZmllZCBoZWFkZXIgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGhlYWRlciB0byBzZXQKKyAgICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gYmUgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBJZ25vcmUgYW55IGNhbGwgZnJvbSBhbiBpbmNsdWRlZCBzZXJ2bGV0CisgICAgICAgIGlmIChpbmNsdWRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBjb3lvdGVSZXNwb25zZS5zZXRIZWFkZXIobmFtZSwgdmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwZWNpZmllZCBpbnRlZ2VyIGhlYWRlciB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgaGVhZGVyIHRvIHNldAorICAgICAqIEBwYXJhbSB2YWx1ZSBJbnRlZ2VyIHZhbHVlIHRvIGJlIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gSWdub3JlIGFueSBjYWxsIGZyb20gYW4gaW5jbHVkZWQgc2VydmxldAorICAgICAgICBpZiAoaW5jbHVkZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgc2V0SGVhZGVyKG5hbWUsICIiICsgdmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEhUVFAgc3RhdHVzIHRvIGJlIHJldHVybmVkIHdpdGggdGhpcyByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0dXMgVGhlIG5ldyBIVFRQIHN0YXR1cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc3RhdHVzKSB7CisgICAgICAgIHNldFN0YXR1cyhzdGF0dXMsIG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBIVFRQIHN0YXR1cyBhbmQgbWVzc2FnZSB0byBiZSByZXR1cm5lZCB3aXRoIHRoaXMgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBuZXcgSFRUUCBzdGF0dXMKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgYXNzb2NpYXRlZCB0ZXh0IG1lc3NhZ2UKKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIFZlcnNpb24gMi4xIG9mIHRoZSBKYXZhIFNlcnZsZXQgQVBJLCB0aGlzIG1ldGhvZAorICAgICAqICBoYXMgYmVlbiBkZXByZWNhdGVkIGR1ZSB0byB0aGUgYW1iaWd1b3VzIG1lYW5pbmcgb2YgdGhlIG1lc3NhZ2UKKyAgICAgKiAgcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc3RhdHVzLCBTdHJpbmcgbWVzc2FnZSkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIElnbm9yZSBhbnkgY2FsbCBmcm9tIGFuIGluY2x1ZGVkIHNlcnZsZXQKKyAgICAgICAgaWYgKGluY2x1ZGVkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGNveW90ZVJlc3BvbnNlLnNldFN0YXR1cyhzdGF0dXMpOworICAgICAgICBjb3lvdGVSZXNwb25zZS5zZXRNZXNzYWdlKG1lc3NhZ2UpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgVVJMIHNob3VsZCBiZSBlbmNvZGVkIHdpdGgKKyAgICAgKiBhIHNlc3Npb24gaWRlbnRpZmllci4gIFRoaXMgd2lsbCBiZSB0cnVlIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nCisgICAgICogY29uZGl0aW9ucyBhcmUgbWV0OgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+VGhlIHJlcXVlc3Qgd2UgYXJlIHJlc3BvbmRpbmcgdG8gYXNrZWQgZm9yIGEgdmFsaWQgc2Vzc2lvbgorICAgICAqIDxsaT5UaGUgcmVxdWVzdGVkIHNlc3Npb24gSUQgd2FzIG5vdCByZWNlaXZlZCB2aWEgYSBjb29raWUKKyAgICAgKiA8bGk+VGhlIHNwZWNpZmllZCBVUkwgcG9pbnRzIGJhY2sgdG8gc29tZXdoZXJlIHdpdGhpbiB0aGUgd2ViCisgICAgICogICAgIGFwcGxpY2F0aW9uIHRoYXQgaXMgcmVzcG9uZGluZyB0byB0aGlzIHJlcXVlc3QKKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0aW9uIEFic29sdXRlIFVSTCB0byBiZSB2YWxpZGF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuY29kZWFibGUoZmluYWwgU3RyaW5nIGxvY2F0aW9uKSB7CisKKyAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgICAgICAvLyBJcyB0aGlzIGFuIGludHJhLWRvY3VtZW50IHJlZmVyZW5jZT8KKyAgICAgICAgaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoIiMiKSkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgICAgIC8vIEFyZSB3ZSBpbiBhIHZhbGlkIHNlc3Npb24gdGhhdCBpcyBub3QgdXNpbmcgY29va2llcz8KKyAgICAgICAgZmluYWwgUmVxdWVzdCBocmVxID0gcmVxdWVzdDsKKyAgICAgICAgZmluYWwgU2Vzc2lvbiBzZXNzaW9uID0gaHJlcS5nZXRTZXNzaW9uSW50ZXJuYWwoZmFsc2UpOworICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIGlmIChocmVxLmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIAorICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pCisgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJvb2xlYW4oZG9Jc0VuY29kZWFibGUoaHJlcSwgc2Vzc2lvbiwgbG9jYXRpb24pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZG9Jc0VuY29kZWFibGUoaHJlcSwgc2Vzc2lvbiwgbG9jYXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGRvSXNFbmNvZGVhYmxlKFJlcXVlc3QgaHJlcSwgU2Vzc2lvbiBzZXNzaW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uKSB7CisgICAgICAgIC8vIElzIHRoaXMgYSB2YWxpZCBhYnNvbHV0ZSBVUkw/CisgICAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXJsID0gbmV3IFVSTChsb2NhdGlvbik7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERvZXMgdGhpcyBVUkwgbWF0Y2ggZG93biB0byAoYW5kIGluY2x1ZGluZykgdGhlIGNvbnRleHQgcGF0aD8KKyAgICAgICAgaWYgKCFocmVxLmdldFNjaGVtZSgpLmVxdWFsc0lnbm9yZUNhc2UodXJsLmdldFByb3RvY29sKCkpKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIGlmICghaHJlcS5nZXRTZXJ2ZXJOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSh1cmwuZ2V0SG9zdCgpKSkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICBpbnQgc2VydmVyUG9ydCA9IGhyZXEuZ2V0U2VydmVyUG9ydCgpOworICAgICAgICBpZiAoc2VydmVyUG9ydCA9PSAtMSkgeworICAgICAgICAgICAgaWYgKCJodHRwcyIuZXF1YWxzKGhyZXEuZ2V0U2NoZW1lKCkpKQorICAgICAgICAgICAgICAgIHNlcnZlclBvcnQgPSA0NDM7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2VydmVyUG9ydCA9IDgwOworICAgICAgICB9CisgICAgICAgIGludCB1cmxQb3J0ID0gdXJsLmdldFBvcnQoKTsKKyAgICAgICAgaWYgKHVybFBvcnQgPT0gLTEpIHsKKyAgICAgICAgICAgIGlmICgiaHR0cHMiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpCisgICAgICAgICAgICAgICAgdXJsUG9ydCA9IDQ0MzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1cmxQb3J0ID0gODA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlcnZlclBvcnQgIT0gdXJsUG9ydCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCA9IGdldENvbnRleHQoKS5nZXRQYXRoKCk7CisgICAgICAgIGlmIChjb250ZXh0UGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgZmlsZSA9IHVybC5nZXRGaWxlKCk7CisgICAgICAgICAgICBpZiAoKGZpbGUgPT0gbnVsbCkgfHwgIWZpbGUuc3RhcnRzV2l0aChjb250ZXh0UGF0aCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgICAgICBpZiggZmlsZS5pbmRleE9mKCI7anNlc3Npb25pZD0iICsgc2Vzc2lvbi5nZXRJZEludGVybmFsKCkpID49IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBVUkwgYmVsb25ncyB0byBvdXIgd2ViIGFwcGxpY2F0aW9uLCBzbyBpdCBpcyBlbmNvZGVhYmxlCisgICAgICAgIHJldHVybiAodHJ1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgKGlmIG5lY2Vzc2FyeSkgYW5kIHJldHVybiB0aGUgYWJzb2x1dGUgVVJMIHRoYXQgcmVwcmVzZW50cyB0aGUKKyAgICAgKiByZXNvdXJjZSByZWZlcmVuY2VkIGJ5IHRoaXMgcG9zc2libHkgcmVsYXRpdmUgVVJMLiAgSWYgdGhpcyBVUkwgaXMKKyAgICAgKiBhbHJlYWR5IGFic29sdXRlLCByZXR1cm4gaXQgdW5jaGFuZ2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0aW9uIFVSTCB0byBiZSAocG9zc2libHkpIGNvbnZlcnRlZCBhbmQgdGhlbiByZXR1cm5lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYSBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaXMKKyAgICAgKiAgdGhyb3duIHdoZW4gY29udmVydGluZyB0aGUgcmVsYXRpdmUgVVJMIHRvIGFuIGFic29sdXRlIG9uZQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHRvQWJzb2x1dGUoU3RyaW5nIGxvY2F0aW9uKSB7CisKKyAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGxvY2F0aW9uKTsKKworICAgICAgICBib29sZWFuIGxlYWRpbmdTbGFzaCA9IGxvY2F0aW9uLnN0YXJ0c1dpdGgoIi8iKTsKKworICAgICAgICBpZiAobGVhZGluZ1NsYXNoIHx8ICFoYXNTY2hlbWUobG9jYXRpb24pKSB7CisKKyAgICAgICAgICAgIHJlZGlyZWN0VVJMQ0MucmVjeWNsZSgpOworCisgICAgICAgICAgICBTdHJpbmcgc2NoZW1lID0gcmVxdWVzdC5nZXRTY2hlbWUoKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCk7CisgICAgICAgICAgICBpbnQgcG9ydCA9IHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlZGlyZWN0VVJMQ0MuYXBwZW5kKHNjaGVtZSwgMCwgc2NoZW1lLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICByZWRpcmVjdFVSTENDLmFwcGVuZCgiOi8vIiwgMCwgMyk7CisgICAgICAgICAgICAgICAgcmVkaXJlY3RVUkxDQy5hcHBlbmQobmFtZSwgMCwgbmFtZS5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgaWYgKChzY2hlbWUuZXF1YWxzKCJodHRwIikgJiYgcG9ydCAhPSA4MCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHNjaGVtZS5lcXVhbHMoImh0dHBzIikgJiYgcG9ydCAhPSA0NDMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VVJMQ0MuYXBwZW5kKCc6Jyk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0UyA9IHBvcnQgKyAiIjsKKyAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVUkxDQy5hcHBlbmQocG9ydFMsIDAsIHBvcnRTLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFsZWFkaW5nU2xhc2gpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHJlcXVlc3QuZ2V0RGVjb2RlZFJlcXVlc3RVUkkoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IHJlbGF0aXZlUGF0aC5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGguc3Vic3RyaW5nKDAsIHBvcyk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RlZFVSSSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmcmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgICAgICAgICAgICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkgKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkVVJJID0gKFN0cmluZylBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9ueworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmxFbmNvZGVyLmVuY29kZVVSTChmcmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyAgIAorICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwYWUpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBwYWUuZ2V0RXhjZXB0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRVUkkgPSB1cmxFbmNvZGVyLmVuY29kZVVSTChyZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VVJMQ0MuYXBwZW5kKGVuY29kZWRVUkksIDAsIGVuY29kZWRVUkkubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVSTENDLmFwcGVuZCgnLycpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWRpcmVjdFVSTENDLmFwcGVuZChsb2NhdGlvbiwgMCwgbG9jYXRpb24ubGVuZ3RoKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBpYWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZWRpcmVjdFVSTENDLnRvU3RyaW5nKCk7CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgcmV0dXJuIChsb2NhdGlvbik7CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgaWYgYSBVUkkgc3RyaW5nIGhhcyBhIDxjb2RlPnNjaGVtZTwvY29kZT4gY29tcG9uZW50LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNTY2hlbWUoU3RyaW5nIHVyaSkgeworICAgICAgICBpbnQgbGVuID0gdXJpLmxlbmd0aCgpOworICAgICAgICBmb3IoaW50IGk9MDsgaSA8IGxlbiA7IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gdXJpLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmKGMgPT0gJzonKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGkgPiAwOworICAgICAgICAgICAgfSBlbHNlIGlmKCFVUkwuaXNTY2hlbWVDaGFyKGMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBVUkwgd2l0aCB0aGUgc3BlY2lmaWVkIHNlc3Npb24gaWRlbnRpZmllcgorICAgICAqIHN1aXRhYmx5IGVuY29kZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIFVSTCB0byBiZSBlbmNvZGVkIHdpdGggdGhlIHNlc3Npb24gaWQKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFNlc3Npb24gaWQgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGVuY29kZWQgVVJMCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB0b0VuY29kZWQoU3RyaW5nIHVybCwgU3RyaW5nIHNlc3Npb25JZCkgeworCisgICAgICAgIGlmICgodXJsID09IG51bGwpIHx8IChzZXNzaW9uSWQgPT0gbnVsbCkpCisgICAgICAgICAgICByZXR1cm4gKHVybCk7CisKKyAgICAgICAgU3RyaW5nIHBhdGggPSB1cmw7CisgICAgICAgIFN0cmluZyBxdWVyeSA9ICIiOworICAgICAgICBTdHJpbmcgYW5jaG9yID0gIiI7CisgICAgICAgIGludCBxdWVzdGlvbiA9IHVybC5pbmRleE9mKCc/Jyk7CisgICAgICAgIGlmIChxdWVzdGlvbiA+PSAwKSB7CisgICAgICAgICAgICBwYXRoID0gdXJsLnN1YnN0cmluZygwLCBxdWVzdGlvbik7CisgICAgICAgICAgICBxdWVyeSA9IHVybC5zdWJzdHJpbmcocXVlc3Rpb24pOworICAgICAgICB9CisgICAgICAgIGludCBwb3VuZCA9IHBhdGguaW5kZXhPZignIycpOworICAgICAgICBpZiAocG91bmQgPj0gMCkgeworICAgICAgICAgICAgYW5jaG9yID0gcGF0aC5zdWJzdHJpbmcocG91bmQpOworICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBvdW5kKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHBhdGgpOworICAgICAgICBpZiggc2IubGVuZ3RoKCkgPiAwICkgeyAvLyBqc2Vzc2lvbmlkIGNhbid0IGJlIGZpcnN0LgorICAgICAgICAgICAgc2IuYXBwZW5kKCI7anNlc3Npb25pZD0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzZXNzaW9uSWQpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZChhbmNob3IpOworICAgICAgICBzYi5hcHBlbmQocXVlcnkpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9SZXNwb25zZUZhY2FkZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9SZXNwb25zZUZhY2FkZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NDIyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL1Jlc3BvbnNlRmFjYWRlLmphdmEKQEAgLTAsMCArMSw1NTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VjdXJpdHkuU2VjdXJpdHlVdGlsOworCisvKioKKyAqIEZhY2FkZSBjbGFzcyB0aGF0IHdyYXBzIGEgQ295b3RlIHJlc3BvbnNlIG9iamVjdC4gCisgKiBBbGwgbWV0aG9kcyBhcmUgZGVsZWdhdGVkIHRvIHRoZSB3cmFwcGVkIHJlc3BvbnNlLgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEBhdXRob3IgSmVhbi1GcmFuY29pcyBBcmNhbmQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNwb25zZUZhY2FkZSAKKyAgICBpbXBsZW1lbnRzIEh0dHBTZXJ2bGV0UmVzcG9uc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEb1ByaXZpbGVnZWQKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFNldENvbnRlbnRUeXBlUHJpdmlsZWdlZEFjdGlvbgorICAgICAgICAgICAgaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9uIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBjb250ZW50VHlwZTsKKworICAgICAgICBwdWJsaWMgU2V0Q29udGVudFR5cGVQcml2aWxlZ2VkQWN0aW9uKFN0cmluZyBjb250ZW50VHlwZSl7CisgICAgICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gICAgICAgICAgICAKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIERhdGVIZWFkZXJQcml2aWxlZ2VkQWN0aW9uCisgICAgICAgICAgICBpbXBsZW1lbnRzIFByaXZpbGVnZWRBY3Rpb24geworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgICAgIHByaXZhdGUgbG9uZyB2YWx1ZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFkZDsKKworICAgICAgICBEYXRlSGVhZGVyUHJpdmlsZWdlZEFjdGlvbihTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSwgYm9vbGVhbiBhZGQpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB0aGlzLmFkZCA9IGFkZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworICAgICAgICAgICAgaWYoYWRkKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkRGF0ZUhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldERhdGVIZWFkZXIobmFtZSwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIHdyYXBwZXIgZm9yIHRoZSBzcGVjaWZpZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIHRvIGJlIHdyYXBwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzcG9uc2VGYWNhZGUoUmVzcG9uc2UgcmVzcG9uc2UpIHsKKworICAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xhc3MvSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIFRoZSB3cmFwcGVkIHJlc3BvbnNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDbGVhciBmYWNhZGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIHJlc3BvbnNlID0gbnVsbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByZXZlbnQgY2xvbmluZyB0aGUgZmFjYWRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgY2xvbmUoKQorICAgICAgICB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKKworICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlc3BvbnNlRmFjYWRlLm51bGxSZXNwb25zZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3BvbnNlLnNldFN1c3BlbmRlZCh0cnVlKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzRmluaXNoZWQoKSB7CisKKyAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXNwb25zZUZhY2FkZS5udWxsUmVzcG9uc2UiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzcG9uc2UuaXNTdXNwZW5kZWQoKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXJ2bGV0UmVzcG9uc2UgTWV0aG9kcworCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nKCkgeworCisgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVzcG9uc2VGYWNhZGUubnVsbFJlc3BvbnNlIikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmdldENoYXJhY3RlckVuY29kaW5nKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU2VydmxldE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vICAgICAgICBpZiAoaXNGaW5pc2hlZCgpKQorICAgICAgICAvLyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgKC8qc20uZ2V0U3RyaW5nKCJyZXNwb25zZUZhY2FkZS5maW5pc2hlZCIpKi8pOworCisgICAgICAgIFNlcnZsZXRPdXRwdXRTdHJlYW0gc29zID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGlmIChpc0ZpbmlzaGVkKCkpCisgICAgICAgICAgICByZXNwb25zZS5zZXRTdXNwZW5kZWQodHJ1ZSk7CisgICAgICAgIHJldHVybiAoc29zKTsKKworICAgIH0KKworCisgICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gICAgICAgIGlmIChpc0ZpbmlzaGVkKCkpCisgICAgICAgIC8vICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAvLyAgICAgICAgICAgICAgICAoLypzbS5nZXRTdHJpbmcoInJlc3BvbnNlRmFjYWRlLmZpbmlzaGVkIikqLyk7CisKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIGlmIChpc0ZpbmlzaGVkKCkpCisgICAgICAgICAgICByZXNwb25zZS5zZXRTdXNwZW5kZWQodHJ1ZSk7CisgICAgICAgIHJldHVybiAod3JpdGVyKTsKKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudExlbmd0aChpbnQgbGVuKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudExlbmd0aChsZW4pOworCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgdHlwZSkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKXsKKyAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBTZXRDb250ZW50VHlwZVByaXZpbGVnZWRBY3Rpb24odHlwZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUodHlwZSk7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEJ1ZmZlclNpemUoaW50IHNpemUpIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoLypzbS5nZXRTdHJpbmcoInJlc3BvbnNlQmFzZS5yZXNldC5pc2UiKSovKTsKKworICAgICAgICByZXNwb25zZS5zZXRCdWZmZXJTaXplKHNpemUpOworCisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IGdldEJ1ZmZlclNpemUoKSB7CisKKyAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXNwb25zZUZhY2FkZS5udWxsUmVzcG9uc2UiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzcG9uc2UuZ2V0QnVmZmVyU2l6ZSgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgZmx1c2hCdWZmZXIoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChpc0ZpbmlzaGVkKCkpCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICgvKnNtLmdldFN0cmluZygicmVzcG9uc2VGYWNhZGUuZmluaXNoZWQiKSovKTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpeworICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCl7CisKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb257CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRBcHBDb21taXR0ZWQodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmZsdXNoQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBjYXRjaChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBleCA9IGUuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24peworICAgICAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0QXBwQ29tbWl0dGVkKHRydWUpOworCisgICAgICAgICAgICByZXNwb25zZS5mbHVzaEJ1ZmZlcigpOyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHJlc2V0QnVmZmVyKCkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgvKnNtLmdldFN0cmluZygicmVzcG9uc2VCYXNlLnJlc2V0LmlzZSIpKi8pOworCisgICAgICAgIHJlc3BvbnNlLnJlc2V0QnVmZmVyKCk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWl0dGVkKCkgeworCisgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVzcG9uc2VGYWNhZGUubnVsbFJlc3BvbnNlIikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChyZXNwb25zZS5pc0FwcENvbW1pdHRlZCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgvKnNtLmdldFN0cmluZygicmVzcG9uc2VCYXNlLnJlc2V0LmlzZSIpKi8pOworCisgICAgICAgIHJlc3BvbnNlLnJlc2V0KCk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0TG9jYWxlKGxvYyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKKworICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlc3BvbnNlRmFjYWRlLm51bGxSZXNwb25zZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXNwb25zZS5nZXRMb2NhbGUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGFkZENvb2tpZShDb29raWUgY29va2llKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgcmVzcG9uc2UuYWRkQ29va2llKGNvb2tpZSk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSGVhZGVyKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXNwb25zZUZhY2FkZS5udWxsUmVzcG9uc2UiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzcG9uc2UuY29udGFpbnNIZWFkZXIobmFtZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVSTChTdHJpbmcgdXJsKSB7CisKKyAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXNwb25zZUZhY2FkZS5udWxsUmVzcG9uc2UiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzcG9uc2UuZW5jb2RlVVJMKHVybCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VVJMKFN0cmluZyB1cmwpIHsKKworICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlc3BvbnNlRmFjYWRlLm51bGxSZXNwb25zZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXNwb25zZS5lbmNvZGVSZWRpcmVjdFVSTCh1cmwpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVVcmwoU3RyaW5nIHVybCkgeworCisgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVzcG9uc2VGYWNhZGUubnVsbFJlc3BvbnNlIikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmVuY29kZVVSTCh1cmwpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVSZWRpcmVjdFVybChTdHJpbmcgdXJsKSB7CisKKyAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZXNwb25zZUZhY2FkZS5udWxsUmVzcG9uc2UiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzcG9uc2UuZW5jb2RlUmVkaXJlY3RVUkwodXJsKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgc2MsIFN0cmluZyBtc2cpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKC8qc20uZ2V0U3RyaW5nKCJyZXNwb25zZUJhc2UucmVzZXQuaXNlIikqLyk7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0QXBwQ29tbWl0dGVkKHRydWUpOworCisgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihzYywgbXNnKTsKKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBzYykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoLypzbS5nZXRTdHJpbmcoInJlc3BvbnNlQmFzZS5yZXNldC5pc2UiKSovKTsKKworICAgICAgICByZXNwb25zZS5zZXRBcHBDb21taXR0ZWQodHJ1ZSk7CisKKyAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKHNjKTsKKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2VuZFJlZGlyZWN0KFN0cmluZyBsb2NhdGlvbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoLypzbS5nZXRTdHJpbmcoInJlc3BvbnNlQmFzZS5yZXNldC5pc2UiKSovKTsKKworICAgICAgICByZXNwb25zZS5zZXRBcHBDb21taXR0ZWQodHJ1ZSk7CisKKyAgICAgICAgcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KGxvY2F0aW9uKTsKKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0RGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyBkYXRlKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBEYXRlSGVhZGVyUHJpdmlsZWdlZEFjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUsIGRhdGUsIGZhbHNlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNwb25zZS5zZXREYXRlSGVhZGVyKG5hbWUsIGRhdGUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGFkZERhdGVIZWFkZXIoU3RyaW5nIG5hbWUsIGxvbmcgZGF0ZSkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgRGF0ZUhlYWRlclByaXZpbGVnZWRBY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCBkYXRlLCB0cnVlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNwb25zZS5hZGREYXRlSGVhZGVyKG5hbWUsIGRhdGUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTsKKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIobmFtZSwgdmFsdWUpOworCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRIZWFkZXIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHJlc3BvbnNlLnNldEludEhlYWRlcihuYW1lLCB2YWx1ZSk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGFkZEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgcmVzcG9uc2UuYWRkSW50SGVhZGVyKG5hbWUsIHZhbHVlKTsKKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzYykgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhzYyk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc2MsIFN0cmluZyBzbSkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhzYywgc20pOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKworICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlc3BvbnNlRmFjYWRlLm51bGxSZXNwb25zZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXNwb25zZS5nZXRDb250ZW50VHlwZSgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q2hhcmFjdGVyRW5jb2RpbmcoU3RyaW5nIGFyZzApIHsKKworICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInJlc3BvbnNlRmFjYWRlLm51bGxSZXNwb25zZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3BvbnNlLnNldENoYXJhY3RlckVuY29kaW5nKGFyZzApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMTYwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSwyMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPG1iZWFucy1kZXNjcmlwdG9ycz4KKworICA8bWJlYW4gICAgICAgICBuYW1lPSJDb3lvdGVDb25uZWN0b3IiCisgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLkNvbm5lY3Rvck1CZWFuIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJJbXBsZW1lbnRhdGlvbiBvZiBhIENveW90ZSBjb25uZWN0b3IiCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJDb25uZWN0b3IiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvciI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWNjZXB0Q291bnQiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBhY2NlcHQgY291bnQgZm9yIHRoaXMgQ29ubmVjdG9yIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhZGRyZXNzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgSVAgYWRkcmVzcyBvbiB3aGljaCB0byBiaW5kIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWxnb3JpdGhtIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY2VydGlmaWNhdGUgZW5jb2RpbmcgYWxnb3JpdGhtIHRvIGJlIHVzZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhbGxvd1RyYWNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJBbGxvdyBkaXNhYmxpbmcgVFJBQ0UgbWV0aG9kIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYnVmZmVyU2l6ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGlucHV0IGJ1ZmZlciBzaXplIHdlIHNob3VsZCBjcmVhdGUgb24gaW5wdXQgc3RyZWFtcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY2xpZW50QXV0aCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU2hvdWxkIHdlIHJlcXVpcmUgY2xpZW50IGF1dGhlbnRpY2F0aW9uPyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNpcGhlcnMiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIFNTTCBjaXBoZXIgc3VpdGVzIHRvIGJlIGVuYWJsZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb21wcmVzc2lvbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29tcHJlc3Npb24gdmFsdWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0aW9uTGluZ2VyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJMaW5nZXIgdmFsdWUgb24gdGhlIGluY29taW5nIGNvbm5lY3Rpb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3Rpb25UaW1lb3V0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaW1lb3V0IHZhbHVlIG9uIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0aW9uVXBsb2FkVGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGltZW91dCB2YWx1ZSBvbiB0aGUgaW5jb21pbmcgY29ubmVjdGlvbiBkdXJpbmcgcmVxdWVzdCBwcm9jZXNzaW5nIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICAgbmFtZT0iZGlzYWJsZVVwbG9hZFRpbWVvdXQiCisgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgVG9tY2F0IGlnbm9yZSBzZXR0aW5nIGEgdGltZW91dCBmb3IgdXBsb2Fkcz8iIAorICAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImVtcHR5U2Vzc2lvblBhdGgiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSAnZW1wdHkgc2Vzc2lvbiBwYXRoJyBmbGFnIGZvciB0aGlzIENvbm5lY3RvciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImVuYWJsZUxvb2t1cHMiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSAnZW5hYmxlIEROUyBsb29rdXBzJyBmbGFnIGZvciB0aGlzIENvbm5lY3RvciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtleXN0b3JlRmlsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUGF0aG5hbWUgdG8gdGhlIGtleSBzdG9yZSBmaWxlIHRvIGJlIHVzZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJrZXlzdG9yZVBhc3MiCisgICAgICAgICAgZGVzY3JpcHRpb249IlBhc3N3b3JkIGZvciBhY2Nlc3NpbmcgdGhlIGtleSBzdG9yZSBmaWxlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ia2V5c3RvcmVUeXBlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUeXBlIG9mIGtleXN0b3JlIGZpbGUgdG8gYmUgdXNlZCBmb3IgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtleUFsaWFzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJBbGlhcyBuYW1lIG9mIHRoaXMgY29ubmVjdG9yJ3Mga2V5cGFpciBhbmQgc3VwcG9ydGluZyBjZXJ0aWZpY2F0ZSBjaGFpbiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heEh0dHBIZWFkZXJTaXplIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNYXhpbXVtIHNpemUgaW4gYnl0ZXMgb2YgdGhlIEhUVFAgaGVhZGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhLZWVwQWxpdmVSZXF1ZXN0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTWF4aW11bSBudW1iZXIgb2YgS2VlcC1BbGl2ZSByZXF1ZXN0cyB0byBob25vciBwZXIgY29ubmVjdGlvbiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4UG9zdFNpemUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiBhIFBPU1Qgd2hpY2ggd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBzZXJ2bGV0IEFQSSBwcm92aWRlZCBmZWF0dXJlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4U3BhcmVUaHJlYWRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWF4aW11bSBudW1iZXIgb2YgdW51c2VkIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWRzIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhUaHJlYWRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdCBwcm9jZXNzaW5nIHRocmVhZHMgdG8gYmUgY3JlYXRlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWluU3BhcmVUaHJlYWRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWRzIHRoYXQgd2lsbCBiZSBjcmVhdGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwb3J0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgcG9ydCBudW1iZXIgb24gd2hpY2ggd2UgbGlzdGVuIGZvciBhanAxMyByZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwcm90b2NvbCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ295b3RlIHByb3RvY29sIGhhbmRsZXIgaW4gdXNlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3lvdGUgUHJvdG9jb2wgaGFuZGxlciBjbGFzcyBuYW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InByb3h5TmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlciBTZXJ2ZXIgbmFtZSB0byB3aGljaCB3ZSBzaG91bGQgcHJldGVuZCByZXF1ZXN0cyB0byB0aGlzIENvbm5lY3RvciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InByb3h5UG9ydCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlciBTZXJ2ZXIgcG9ydCB0byB3aGljaCB3ZSBzaG91bGQgcHJldGVuZCByZXF1ZXN0cyB0byB0aGlzIENvbm5lY3RvciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVkaXJlY3RQb3J0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgcmVkaXJlY3QgcG9ydCBmb3Igbm9uLVNTTCB0byBTU0wgcmVkaXJlY3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzY2hlbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlByb3RvY29sIG5hbWUgZm9yIHRoaXMgQ29ubmVjdG9yIChodHRwLCBodHRwcykiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzZWNyZXQiCisgICAgICAgICAgZGVzY3JpcHRpb249IkF1dGhlbnRpY2F0aW9uIHNlY3JldCAoSSBndWVzcyAuLi4gbm90IGluIEphdmFkb2NzKSIKKyAgICAgICAgICAgIHJlYWRhYmxlID0gImZhbHNlIiAKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNlY3VyZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSXMgdGhpcyBhIHNlY3VyZSAoU1NMKSBDb25uZWN0b3I/IgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic3NsUHJvdG9jb2wiCisgICAgICAgICAgZGVzY3JpcHRpb249IlNTTCBwcm90b2NvbCB2YXJpYW50IHRvIGJlIHVzZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzc2xQcm90b2NvbHMiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIFNTTCBwcm90b2NvbCB2YXJpYW50cyB0byBiZSBlbmFibGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic3RyYXRlZ3kiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRocmVhZCBwb29sIHN0cmF0ZWd5IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idGNwTm9EZWxheSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU2hvdWxkIHdlIHVzZSBUQ1Agbm8gZGVsYXk/IgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlICAgIG5hbWU9InRvbWNhdEF1dGhlbnRpY2F0aW9uIgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iU2hvdWxkIFRvbWNhdCBwZXJmb3JtIGFsbCBhdXRoZW50aWNhdGlvbnM/IgorICAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgICBuYW1lPSJ0aHJlYWRQcmlvcml0eSIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSB0aHJlYWQgcHJpb3JpdHkgZm9yIHByb2Nlc3NvcnMiCisgICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0cnVzdFN0b3JlRmlsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUGF0aG5hbWUgdG8gdGhlIHRydXN0IHN0b3JlIGZpbGUgdG8gYmUgdXNlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InRydXN0U3RvcmVQYXNzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJQYXNzd29yZCBmb3IgYWNjZXNzaW5nIHRoZSB0cnVzdCBzdG9yZSBmaWxlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idHJ1c3RTdG9yZVR5cGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlR5cGUgb2YgdHJ1c3Qgc3RvcmUgZmlsZSB0byBiZSB1c2VkIGZvciB0cnVzdGVkIGNlcnRpZmljYXRlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9IlVSSUVuY29kaW5nIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDaGFyYWN0ZXIgZW5jb2RpbmcgdXNlZCB0byBkZWNvZGUgdGhlIFVSSSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InVzZUJvZHlFbmNvZGluZ0ZvclVSSSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU2hvdWxkIHRoZSBib2R5IGVuY29kaW5nIGJlIHVzZWQgZm9yIFVSSSBxdWVyeSBwYXJhbWV0ZXJzIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlICAgIG5hbWU9Inhwb3dlcmVkQnkiCisgICAgICAgICAgIGRlc2NyaXB0aW9uPSJJcyBnZW5lcmF0aW9uIG9mIFgtUG93ZXJlZC1CeSByZXNwb25zZSBoZWFkZXIgZW5hYmxlZC9kaXNhYmxlZD8iCisgICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8b3BlcmF0aW9uIG5hbWU9InN0YXJ0IiBkZXNjcmlwdGlvbj0iU3RhcnQiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcCIgZGVzY3JpcHRpb249IlN0b3AiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0icGF1c2UiIGRlc2NyaXB0aW9uPSJTdGFydCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJyZXN1bWUiIGRlc2NyaXB0aW9uPSJTdG9wIiBpbXBhY3Q9IkFDVElPTiIgcmV0dXJuVHlwZT0idm9pZCIgLz4KKyAgICA8b3BlcmF0aW9uIG5hbWU9ImluaXQiIGRlc2NyaXB0aW9uPSJJbml0IiBpbXBhY3Q9IkFDVElPTiIgcmV0dXJuVHlwZT0idm9pZCIgLz4KKyAgICA8b3BlcmF0aW9uIG5hbWU9ImRlc3Ryb3kiIGRlc2NyaXB0aW9uPSJEZXN0cm95IiBpbXBhY3Q9IkFDVElPTiIgcmV0dXJuVHlwZT0idm9pZCIgLz4KKworICA8L21iZWFuPgorCisKKzwvbWJlYW5zLWRlc2NyaXB0b3JzPgorCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uQ29udGV4dC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25Db250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVlNjdkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsOTc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5CaW5kaW5nOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuUmVxdWVzdERpc3BhdGNoZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5XcmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkFwcGxpY2F0aW9uUGFyYW1ldGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5FbnVtZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5SZXNvdXJjZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU2VydmVySW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLkNoYXJDaHVuazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5NZXNzYWdlQnl0ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5odHRwLm1hcHBlci5NYXBwaW5nRGF0YTsKKworCisvKioKKyAqIFN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPlNlcnZsZXRDb250ZXh0PC9jb2RlPiB0aGF0IHJlcHJlc2VudHMKKyAqIGEgd2ViIGFwcGxpY2F0aW9uJ3MgZXhlY3V0aW9uIGVudmlyb25tZW50LiAgQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcworICogYXNzb2NpYXRlZCB3aXRoIGVhY2ggaW5zdGFuY2Ugb2YgPGNvZGU+U3RhbmRhcmRDb250ZXh0PC9jb2RlPi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uQ29udGV4dAorICAgIGltcGxlbWVudHMgU2VydmxldENvbnRleHQgeworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIENvbnRleHQgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgYXNzb2NpYXRlZCBDb250ZXh0IGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIEFwcGxpY2F0aW9uQ29udGV4dChTdHJpbmcgYmFzZVBhdGgsIFN0YW5kYXJkQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIHRoaXMuYmFzZVBhdGggPSBiYXNlUGF0aDsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dCBhdHRyaWJ1dGVzIGZvciB0aGlzIGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIExpc3Qgb2YgcmVhZCBvbmx5IGF0dHJpYnV0ZXMgZm9yIHRoaXMgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgcmVhZE9ubHlBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRleHQgaW5zdGFuY2Ugd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0YW5kYXJkQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRW1wdHkgY29sbGVjdGlvbiB0byBzZXJ2ZSBhcyB0aGUgYmFzaXMgZm9yIGVtcHR5IGVudW1lcmF0aW9ucy4KKyAgICAgKiA8c3Ryb25nPkRPIE5PVCBBREQgQU5ZIEVMRU1FTlRTIFRPIFRISVMgQ09MTEVDVElPTiE8L3N0cm9uZz4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3QgZW1wdHkgPSBuZXcgQXJyYXlMaXN0KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBmYWNhZGUgYXJvdW5kIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgZmFjYWRlID0gbmV3IEFwcGxpY2F0aW9uQ29udGV4dEZhY2FkZSh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIG1lcmdlZCBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgcGFyYW1ldGVycyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogQmFzZSBwYXRoLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGJhc2VQYXRoID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhyZWFkIGxvY2FsIG1hcHBpbmcgZGF0YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFRocmVhZExvY2FsIGxvY2FsTWFwcGluZ0RhdGEgPSBuZXcgVGhyZWFkTG9jYWwoKTsKKworCisgICAgLyoqCisgICAgICogVGhyZWFkIGxvY2FsIFVSSSBtZXNzYWdlIGJ5dGVzLgorICAgICAqLworICAgIHByaXZhdGUgVGhyZWFkTG9jYWwgbG9jYWxVcmlNQiA9IG5ldyBUaHJlYWRMb2NhbCgpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXNvdXJjZXMgb2JqZWN0IHRoYXQgaXMgbWFwcGVkIHRvIGEgc3BlY2lmaWVkIHBhdGguCisgICAgICogVGhlIHBhdGggbXVzdCBiZWdpbiB3aXRoIGEgIi8iIGFuZCBpcyBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUKKyAgICAgKiBjdXJyZW50IGNvbnRleHQgcm9vdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyQ29udGV4dCBnZXRSZXNvdXJjZXMoKSB7CisKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VydmxldENvbnRleHQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgY29udGV4dCBhdHRyaWJ1dGUsIGlmIGFueTsKKyAgICAgKiBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dCBhdHRyaWJ1dGUgdG8gcmV0dXJuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAoYXR0cmlidXRlcy5nZXQobmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgbmFtZXMgb2YgdGhlIGNvbnRleHQgYXR0cmlidXRlcworICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoYXR0cmlidXRlcykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnVtZXJhdG9yKGF0dHJpYnV0ZXMua2V5U2V0KCksIHRydWUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIDxjb2RlPlNlcnZsZXRDb250ZXh0PC9jb2RlPiBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byBhCisgICAgICogc3BlY2lmaWVkIFVSSSBvbiB0aGUgc2VydmVyLiAgVGhpcyBtZXRob2QgYWxsb3dzIHNlcnZsZXRzIHRvIGdhaW4KKyAgICAgKiBhY2Nlc3MgdG8gdGhlIGNvbnRleHQgZm9yIHZhcmlvdXMgcGFydHMgb2YgdGhlIHNlcnZlciwgYW5kIGFzIG5lZWRlZAorICAgICAqIG9idGFpbiA8Y29kZT5SZXF1ZXN0RGlzcGF0Y2hlcjwvY29kZT4gb2JqZWN0cyBvciByZXNvdXJjZXMgZnJvbSB0aGUKKyAgICAgKiBjb250ZXh0LiAgVGhlIGdpdmVuIHBhdGggbXVzdCBiZSBhYnNvbHV0ZSAoYmVnaW5uaW5nIHdpdGggYSAiLyIpLAorICAgICAqIGFuZCBpcyBpbnRlcnByZXRlZCBiYXNlZCBvbiBvdXIgdmlydHVhbCBob3N0J3MgZG9jdW1lbnQgcm9vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgQWJzb2x1dGUgVVJJIG9mIGEgcmVzb3VyY2Ugb24gdGhlIHNlcnZlcgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRDb250ZXh0KFN0cmluZyB1cmkpIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgZm9ybWF0IG9mIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQKKyAgICAgICAgaWYgKCh1cmkgPT0gbnVsbCkgfHwgKCF1cmkuc3RhcnRzV2l0aCgiLyIpKSkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgQ29udGV4dCBjaGlsZCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBIb3N0IGhvc3QgPSAoSG9zdCkgY29udGV4dC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIFN0cmluZyBtYXB1cmkgPSB1cmk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGNoaWxkID0gKENvbnRleHQpIGhvc3QuZmluZENoaWxkKG1hcHVyaSk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGludCBzbGFzaCA9IG1hcHVyaS5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgICAgIGlmIChzbGFzaCA8IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG1hcHVyaSA9IG1hcHVyaS5zdWJzdHJpbmcoMCwgc2xhc2gpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjaGlsZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICBpZiAoY29udGV4dC5nZXRDcm9zc0NvbnRleHQoKSkgeworICAgICAgICAgICAgLy8gSWYgY3Jvc3NDb250ZXh0IGlzIGVuYWJsZWQsIGNhbiBhbHdheXMgcmV0dXJuIHRoZSBjb250ZXh0CisgICAgICAgICAgICByZXR1cm4gY2hpbGQuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaGlsZCA9PSBjb250ZXh0KSB7CisgICAgICAgICAgICAvLyBDYW4gc3RpbGwgcmV0dXJuIHRoZSBjdXJyZW50IGNvbnRleHQKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIHJldHVybgorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWFpbiBwYXRoIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UGF0aCgpOworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIsIG9yCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBwYXJhbWV0ZXIgZG9lcyBub3QgZXhpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgdG8gcmV0cmlldmUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoZmluYWwgU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBtZXJnZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChwYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KG5hbWUpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgY29udGV4dCdzIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMsIG9yIGFuCisgICAgICogZW1wdHkgZW51bWVyYXRpb24gaWYgdGhlIGNvbnRleHQgaGFzIG5vIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEluaXRQYXJhbWV0ZXJOYW1lcygpIHsKKworICAgICAgICBtZXJnZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChwYXJhbWV0ZXJzKSB7CisgICAgICAgICAgIHJldHVybiAobmV3IEVudW1lcmF0b3IocGFyYW1ldGVycy5rZXlTZXQoKSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgSmF2YSBTZXJ2bGV0IEFQSSB0aGF0IHdlIGltcGxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1ham9yVmVyc2lvbigpIHsKKworICAgICAgICByZXR1cm4gKENvbnN0YW50cy5NQUpPUl9WRVJTSU9OKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtaW5vciB2ZXJzaW9uIG9mIHRoZSBKYXZhIFNlcnZsZXQgQVBJIHRoYXQgd2UgaW1wbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWlub3JWZXJzaW9uKCkgeworCisgICAgICAgIHJldHVybiAoQ29uc3RhbnRzLk1JTk9SX1ZFUlNJT04pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1JTUUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisgICAgICogdGhlIE1JTUUgdHlwZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIEZpbGVuYW1lIGZvciB3aGljaCB0byBpZGVudGlmeSBhIE1JTUUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoU3RyaW5nIGZpbGUpIHsKKworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgaW50IHBlcmlvZCA9IGZpbGUubGFzdEluZGV4T2YoIi4iKTsKKyAgICAgICAgaWYgKHBlcmlvZCA8IDApCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gZmlsZS5zdWJzdHJpbmcocGVyaW9kICsgMSk7CisgICAgICAgIGlmIChleHRlbnNpb24ubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgcmV0dXJuIChjb250ZXh0LmZpbmRNaW1lTWFwcGluZyhleHRlbnNpb24pKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+IG9iamVjdCB0aGF0IGFjdHMgYXMgYQorICAgICAqIHdyYXBwZXIgZm9yIHRoZSBuYW1lZCBzZXJ2bGV0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgc2VydmxldCBmb3Igd2hpY2ggYSBkaXNwYXRjaGVyIGlzIHJlcXVlc3RlZAorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0RGlzcGF0Y2hlciBnZXROYW1lZERpc3BhdGNoZXIoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgbmFtZSBhcmd1bWVudAorICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAvLyBDcmVhdGUgYW5kIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgcmVxdWVzdCBkaXNwYXRjaGVyCisgICAgICAgIFdyYXBwZXIgd3JhcHBlciA9IChXcmFwcGVyKSBjb250ZXh0LmZpbmRDaGlsZChuYW1lKTsKKyAgICAgICAgaWYgKHdyYXBwZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uRGlzcGF0Y2hlcih3cmFwcGVyLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZWFsIHBhdGggZm9yIGEgZ2l2ZW4gdmlydHVhbCBwYXRoLCBpZiBwb3NzaWJsZTsgb3RoZXJ3aXNlCisgICAgICogcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdGhlIGRlc2lyZWQgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxQYXRoKFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgaWYgKCFjb250ZXh0LmlzRmlsZXN5c3RlbUJhc2VkKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGJhc2VQYXRoLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+IGluc3RhbmNlIHRoYXQgYWN0cyBhcyBhCisgICAgICogd3JhcHBlciBmb3IgdGhlIHJlc291cmNlIGF0IHRoZSBnaXZlbiBwYXRoLiAgVGhlIHBhdGggbXVzdCBiZWdpbgorICAgICAqIHdpdGggYSAiLyIgYW5kIGlzIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGNvbnRleHQgcm9vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHRoZSBkZXNpcmVkIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0RGlzcGF0Y2hlciBnZXRSZXF1ZXN0RGlzcGF0Y2hlcihTdHJpbmcgcGF0aCkgeworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBwYXRoIGFyZ3VtZW50CisgICAgICAgIGlmIChwYXRoID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aCgiLyIpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgKCJhcHBsaWNhdGlvbkNvbnRleHQucmVxdWVzdERpc3BhdGNoZXIuaWFlIiwgcGF0aCkpOworICAgICAgICBwYXRoID0gbm9ybWFsaXplKHBhdGgpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgdGhyZWFkIGxvY2FsIFVSSQorICAgICAgICBNZXNzYWdlQnl0ZXMgdXJpTUIgPSAoTWVzc2FnZUJ5dGVzKSBsb2NhbFVyaU1CLmdldCgpOworICAgICAgICBpZiAodXJpTUIgPT0gbnVsbCkgeworICAgICAgICAgICAgdXJpTUIgPSBNZXNzYWdlQnl0ZXMubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIENoYXJDaHVuayB1cmlDQyA9IHVyaU1CLmdldENoYXJDaHVuaygpOworICAgICAgICAgICAgdXJpQ0Muc2V0TGltaXQoLTEpOworICAgICAgICAgICAgbG9jYWxVcmlNQi5zZXQodXJpTUIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXJpTUIucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IHF1ZXJ5IHN0cmluZworICAgICAgICBTdHJpbmcgcXVlcnlTdHJpbmcgPSBudWxsOworICAgICAgICBpbnQgcG9zID0gcGF0aC5pbmRleE9mKCc/Jyk7CisgICAgICAgIGlmIChwb3MgPj0gMCkgeworICAgICAgICAgICAgcXVlcnlTdHJpbmcgPSBwYXRoLnN1YnN0cmluZyhwb3MgKyAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBvcyA9IHBhdGgubGVuZ3RoKCk7CisgICAgICAgIH0KKyAKKyAgICAgICAgLy8gUmV0cmlldmUgdGhlIHRocmVhZCBsb2NhbCBtYXBwaW5nIGRhdGEKKyAgICAgICAgTWFwcGluZ0RhdGEgbWFwcGluZ0RhdGEgPSAoTWFwcGluZ0RhdGEpIGxvY2FsTWFwcGluZ0RhdGEuZ2V0KCk7CisgICAgICAgIGlmIChtYXBwaW5nRGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICBtYXBwaW5nRGF0YSA9IG5ldyBNYXBwaW5nRGF0YSgpOworICAgICAgICAgICAgbG9jYWxNYXBwaW5nRGF0YS5zZXQobWFwcGluZ0RhdGEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFwIHRoZSBVUkkKKyAgICAgICAgQ2hhckNodW5rIHVyaUNDID0gdXJpTUIuZ2V0Q2hhckNodW5rKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1cmlDQy5hcHBlbmQoY29udGV4dC5nZXRQYXRoKCksIDAsIGNvbnRleHQuZ2V0UGF0aCgpLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJZ25vcmUgYW55IHRyYWlsaW5nIHBhdGggcGFyYW1zIChzZXBhcmF0ZWQgYnkgJzsnKSBmb3IgbWFwcGluZworICAgICAgICAgICAgICogcHVycG9zZXMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50IHNlbWljb2xvbiA9IHBhdGguaW5kZXhPZignOycpOworICAgICAgICAgICAgaWYgKHBvcyA+PSAwICYmIHNlbWljb2xvbiA+IHBvcykgeworICAgICAgICAgICAgICAgIHNlbWljb2xvbiA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXJpQ0MuYXBwZW5kKHBhdGgsIDAsIHNlbWljb2xvbiA+IDAgPyBzZW1pY29sb24gOiBwb3MpOworICAgICAgICAgICAgY29udGV4dC5nZXRNYXBwZXIoKS5tYXAodXJpTUIsIG1hcHBpbmdEYXRhKTsKKyAgICAgICAgICAgIGlmIChtYXBwaW5nRGF0YS53cmFwcGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGVuZCBhbnkgdHJhaWxpbmcgcGF0aCBwYXJhbXMgKHNlcGFyYXRlZCBieSAnOycpIHRoYXQgd2VyZQorICAgICAgICAgICAgICogaWdub3JlZCBmb3IgbWFwcGluZyBwdXJwb3Nlcywgc28gdGhhdCB0aGV5J3JlIHJlZmxlY3RlZCBpbiB0aGUKKyAgICAgICAgICAgICAqIFJlcXVlc3REaXNwYXRjaGVyJ3MgcmVxdWVzdFVSSQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoc2VtaWNvbG9uID4gMCkgeworICAgICAgICAgICAgICAgIHVyaUNDLmFwcGVuZChwYXRoLCBzZW1pY29sb24sIHBvcyAtIHNlbWljb2xvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICBsb2coc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkNvbnRleHQubWFwcGluZy5lcnJvciIpLCBlKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSAoV3JhcHBlcikgbWFwcGluZ0RhdGEud3JhcHBlcjsKKyAgICAgICAgU3RyaW5nIHdyYXBwZXJQYXRoID0gbWFwcGluZ0RhdGEud3JhcHBlclBhdGgudG9TdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nIHBhdGhJbmZvID0gbWFwcGluZ0RhdGEucGF0aEluZm8udG9TdHJpbmcoKTsKKworICAgICAgICBtYXBwaW5nRGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIAorICAgICAgICAvLyBDb25zdHJ1Y3QgYSBSZXF1ZXN0RGlzcGF0Y2hlciB0byBwcm9jZXNzIHRoaXMgcmVxdWVzdAorICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uRGlzcGF0Y2hlcgorICAgICAgICAgICAgKHdyYXBwZXIsIHVyaUNDLnRvU3RyaW5nKCksIHdyYXBwZXJQYXRoLCBwYXRoSW5mbywgCisgICAgICAgICAgICAgcXVlcnlTdHJpbmcsIG51bGwpOworCisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgVVJMIHRvIHRoZSByZXNvdXJjZSB0aGF0IGlzIG1hcHBlZCB0byBhIHNwZWNpZmllZCBwYXRoLgorICAgICAqIFRoZSBwYXRoIG11c3QgYmVnaW4gd2l0aCBhICIvIiBhbmQgaXMgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlCisgICAgICogY3VycmVudCBjb250ZXh0IHJvb3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byB0aGUgZGVzaXJlZCByZXNvdXJjZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgdGhlIHBhdGggaXMgbm90IGdpdmVuCisgICAgICogIGluIHRoZSBjb3JyZWN0IGZvcm0KKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyBwYXRoKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocGF0aCA9PSBudWxsIHx8ICFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbihzbS5nZXRTdHJpbmcoImFwcGxpY2F0aW9uQ29udGV4dC5yZXF1ZXN0RGlzcGF0Y2hlci5pYWUiLCBwYXRoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHBhdGggPSBub3JtYWxpemUocGF0aCk7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIFN0cmluZyBsaWJQYXRoID0gIi9XRUItSU5GL2xpYi8iOworICAgICAgICBpZiAoKHBhdGguc3RhcnRzV2l0aChsaWJQYXRoKSkgJiYgKHBhdGguZW5kc1dpdGgoIi5qYXIiKSkpIHsKKyAgICAgICAgICAgIEZpbGUgamFyRmlsZSA9IG51bGw7CisgICAgICAgICAgICBpZiAoY29udGV4dC5pc0ZpbGVzeXN0ZW1CYXNlZCgpKSB7CisgICAgICAgICAgICAgICAgamFyRmlsZSA9IG5ldyBGaWxlKGJhc2VQYXRoLCBwYXRoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgamFyRmlsZSA9IG5ldyBGaWxlKGNvbnRleHQuZ2V0V29ya1BhdGgoKSwgcGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoamFyRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBqYXJGaWxlLnRvVVJMKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICBEaXJDb250ZXh0IHJlc291cmNlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbFBhdGggPSBjb250ZXh0LmdldE5hbWUoKSArIHBhdGg7CisgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gY29udGV4dC5nZXRQYXJlbnQoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmxvb2t1cChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiam5kaSIsICIiLCAwLCBnZXRKTkRJVXJpKGhvc3ROYW1lLCBmdWxsUGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpckNvbnRleHRVUkxTdHJlYW1IYW5kbGVyKHJlc291cmNlcykpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGFzIGFuIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPi4gIFRoZQorICAgICAqIHBhdGggbXVzdCBiZSBzcGVjaWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBkZXNjcmliZWQgdW5kZXIKKyAgICAgKiA8Y29kZT5nZXRSZXNvdXJjZTwvY29kZT4uICBJZiBubyBzdWNoIHJlc291cmNlIGNhbiBiZSBpZGVudGlmaWVkLAorICAgICAqIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHRoZSBkZXNpcmVkIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgcGF0aCA9IG5vcm1hbGl6ZShwYXRoKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgRGlyQ29udGV4dCByZXNvdXJjZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHJlc291cmNlID0gcmVzb3VyY2VzLmxvb2t1cChwYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBSZXNvdXJjZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoKFJlc291cmNlKSByZXNvdXJjZSkuc3RyZWFtQ29udGVudCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU2V0IGNvbnRhaW5pbmcgdGhlIHJlc291cmNlIHBhdGhzIG9mIHJlc291cmNlcyBtZW1iZXIgb2YgdGhlCisgICAgICogc3BlY2lmaWVkIGNvbGxlY3Rpb24uIEVhY2ggcGF0aCB3aWxsIGJlIGEgU3RyaW5nIHN0YXJ0aW5nIHdpdGgKKyAgICAgKiBhICIvIiBjaGFyYWN0ZXIuIFRoZSByZXR1cm5lZCBzZXQgaXMgaW1tdXRhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggQ29sbGVjdGlvbiBwYXRoCisgICAgICovCisgICAgcHVibGljIFNldCBnZXRSZXNvdXJjZVBhdGhzKFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHBhdGggYXJndW1lbnQKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImFwcGxpY2F0aW9uQ29udGV4dC5yZXNvdXJjZVBhdGhzLmlhZSIsIHBhdGgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhdGggPSBub3JtYWxpemUocGF0aCk7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIERpckNvbnRleHQgcmVzb3VyY2VzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKGdldFJlc291cmNlUGF0aHNJbnRlcm5hbChyZXNvdXJjZXMsIHBhdGgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiBnZXRSZXNvdXJjZXNQYXRoKCkgbG9naWMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIERpcmVjdG9yeSBjb250ZXh0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBwYXRoIENvbGxlY3Rpb24gcGF0aAorICAgICAqLworICAgIHByaXZhdGUgU2V0IGdldFJlc291cmNlUGF0aHNJbnRlcm5hbChEaXJDb250ZXh0IHJlc291cmNlcywgU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBSZXNvdXJjZVNldCBzZXQgPSBuZXcgUmVzb3VyY2VTZXQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxpc3RDb2xsZWN0aW9uUGF0aHMoc2V0LCByZXNvdXJjZXMsIHBhdGgpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICBzZXQuc2V0TG9ja2VkKHRydWUpOworICAgICAgICByZXR1cm4gKHNldCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGUgc2VydmxldCBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoU2VydmVySW5mby5nZXRTZXJ2ZXJJbmZvKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBKYXZhIFNlcnZsZXQgQVBJIDIuMSwgd2l0aCBubyBkaXJlY3QgcmVwbGFjZW1lbnQuCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXQgZ2V0U2VydmxldChTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlzcGxheSBuYW1lIG9mIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldENvbnRleHROYW1lKCkgeworCisgICAgICAgIHJldHVybiAoY29udGV4dC5nZXREaXNwbGF5TmFtZSgpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgSmF2YSBTZXJ2bGV0IEFQSSAyLjEsIHdpdGggbm8gZGlyZWN0IHJlcGxhY2VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRTZXJ2bGV0TmFtZXMoKSB7CisgICAgICAgIHJldHVybiAobmV3IEVudW1lcmF0b3IoZW1wdHkpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIEphdmEgU2VydmxldCBBUEkgMi4xLCB3aXRoIG5vIGRpcmVjdCByZXBsYWNlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0U2VydmxldHMoKSB7CisgICAgICAgIHJldHVybiAobmV3IEVudW1lcmF0b3IoZW1wdHkpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgdG8gYSBzZXJ2bGV0IGxvZyBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZSB0byBiZSB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisKKyAgICAgICAgY29udGV4dC5nZXRMb2dnZXIoKS5pbmZvKG1lc3NhZ2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gYW5kIG1lc3NhZ2UgdG8gYSBzZXJ2bGV0IGxvZyBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBFeGNlcHRpb24gdG8gYmUgcmVwb3J0ZWQKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIHRvIGJlIHdyaXR0ZW4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIEphdmEgU2VydmxldCBBUEkgMi4xLCB1c2UKKyAgICAgKiAgPGNvZGU+bG9nKFN0cmluZywgVGhyb3dhYmxlKTwvY29kZT4gaW5zdGVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvZyhFeGNlcHRpb24gZXhjZXB0aW9uLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAKKyAgICAgICAgY29udGV4dC5nZXRMb2dnZXIoKS5lcnJvcihtZXNzYWdlLCBleGNlcHRpb24pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGFuZCBleGNlcHRpb24gdG8gYSBzZXJ2bGV0IGxvZyBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZSB0byBiZSB3cml0dGVuCisgICAgICogQHBhcmFtIHRocm93YWJsZSBFeGNlcHRpb24gdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgCisgICAgICAgIGNvbnRleHQuZ2V0TG9nZ2VyKCkuZXJyb3IobWVzc2FnZSwgdGhyb3dhYmxlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBjb250ZXh0IGF0dHJpYnV0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgaWYgYW55LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dCBhdHRyaWJ1dGUgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKworICAgICAgICAvLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKKyAgICAgICAgc3luY2hyb25pemVkIChhdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAvLyBDaGVjayBmb3IgcmVhZCBvbmx5IGF0dHJpYnV0ZQorICAgICAgICAgICBpZiAocmVhZE9ubHlBdHRyaWJ1dGVzLmNvbnRhaW5zS2V5KG5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGZvdW5kID0gYXR0cmlidXRlcy5jb250YWluc0tleShuYW1lKTsKKyAgICAgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gYXR0cmlidXRlcy5nZXQobmFtZSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5yZW1vdmUobmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGlmeSBpbnRlcmVzdGVkIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVycworICAgICAgICBPYmplY3QgbGlzdGVuZXJzW10gPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcnMoKTsKKyAgICAgICAgaWYgKChsaXN0ZW5lcnMgPT0gbnVsbCkgfHwgKGxpc3RlbmVycy5sZW5ndGggPT0gMCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFNlcnZsZXRDb250ZXh0QXR0cmlidXRlRXZlbnQgZXZlbnQgPQorICAgICAgICAgIG5ldyBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50KGNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdmFsdWUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCEobGlzdGVuZXJzW2ldIGluc3RhbmNlb2YgU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lcikpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUxpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAoU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmZpcmVDb250YWluZXJFdmVudCgiYmVmb3JlQ29udGV4dEF0dHJpYnV0ZVJlbW92ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5hdHRyaWJ1dGVSZW1vdmVkKGV2ZW50KTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmZpcmVDb250YWluZXJFdmVudCgiYWZ0ZXJDb250ZXh0QXR0cmlidXRlUmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmZpcmVDb250YWluZXJFdmVudCgiYWZ0ZXJDb250ZXh0QXR0cmlidXRlUmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgIC8vIEZJWE1FIC0gc2hvdWxkIHdlIGRvIGFueXRoaW5nIGJlc2lkZXMgbG9nIHRoZXNlPworICAgICAgICAgICAgICAgIGxvZyhzbS5nZXRTdHJpbmcoImFwcGxpY2F0aW9uQ29udGV4dC5hdHRyaWJ1dGVFdmVudCIpLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbnRleHQgYXR0cmlidXRlIG5hbWUsCisgICAgICogcmVwbGFjaW5nIGFueSBleGlzdGluZyB2YWx1ZSBmb3IgdGhhdCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgQXR0cmlidXRlIG5hbWUgdG8gYmUgYm91bmQKKyAgICAgKiBAcGFyYW0gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZSB0byBiZSBib3VuZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisKKyAgICAgICAgLy8gTmFtZSBjYW5ub3QgYmUgbnVsbAorICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImFwcGxpY2F0aW9uQ29udGV4dC5zZXRBdHRyaWJ1dGUubmFtZW51bGwiKSk7CisKKyAgICAgICAgLy8gTnVsbCB2YWx1ZSBpcyB0aGUgc2FtZSBhcyByZW1vdmVBdHRyaWJ1dGUoKQorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiByZXBsYWNlZCA9IGZhbHNlOworCisgICAgICAgIC8vIEFkZCBvciByZXBsYWNlIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCisgICAgICAgIHN5bmNocm9uaXplZCAoYXR0cmlidXRlcykgeworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHJlYWQgb25seSBhdHRyaWJ1dGUKKyAgICAgICAgICAgIGlmIChyZWFkT25seUF0dHJpYnV0ZXMuY29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgb2xkVmFsdWUgPSBhdHRyaWJ1dGVzLmdldChuYW1lKTsKKyAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlcGxhY2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGlmeSBpbnRlcmVzdGVkIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVycworICAgICAgICBPYmplY3QgbGlzdGVuZXJzW10gPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcnMoKTsKKyAgICAgICAgaWYgKChsaXN0ZW5lcnMgPT0gbnVsbCkgfHwgKGxpc3RlbmVycy5sZW5ndGggPT0gMCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFNlcnZsZXRDb250ZXh0QXR0cmlidXRlRXZlbnQgZXZlbnQgPSBudWxsOworICAgICAgICBpZiAocmVwbGFjZWQpCisgICAgICAgICAgICBldmVudCA9CisgICAgICAgICAgICAgICAgbmV3IFNlcnZsZXRDb250ZXh0QXR0cmlidXRlRXZlbnQoY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIG9sZFZhbHVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXZlbnQgPQorICAgICAgICAgICAgICAgIG5ldyBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50KGNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB2YWx1ZSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghKGxpc3RlbmVyc1tpXSBpbnN0YW5jZW9mIFNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXIpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lciBsaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgKFNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZmlyZUNvbnRhaW5lckV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAoImJlZm9yZUNvbnRleHRBdHRyaWJ1dGVSZXBsYWNlZCIsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuYXR0cmlidXRlUmVwbGFjZWQoZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmZpcmVDb250YWluZXJFdmVudCgiYWZ0ZXJDb250ZXh0QXR0cmlidXRlUmVwbGFjZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5maXJlQ29udGFpbmVyRXZlbnQoImJlZm9yZUNvbnRleHRBdHRyaWJ1dGVBZGRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuYXR0cmlidXRlQWRkZWQoZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmZpcmVDb250YWluZXJFdmVudCgiYWZ0ZXJDb250ZXh0QXR0cmlidXRlQWRkZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVwbGFjZWQpCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZmlyZUNvbnRhaW5lckV2ZW50KCJhZnRlckNvbnRleHRBdHRyaWJ1dGVSZXBsYWNlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZmlyZUNvbnRhaW5lckV2ZW50KCJhZnRlckNvbnRleHRBdHRyaWJ1dGVBZGRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSAtIHNob3VsZCB3ZSBkbyBhbnl0aGluZyBiZXNpZGVzIGxvZyB0aGVzZT8KKyAgICAgICAgICAgICAgICBsb2coc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkNvbnRleHQuYXR0cmlidXRlRXZlbnQiKSwgdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENsZWFyIGFsbCBhcHBsaWNhdGlvbi1jcmVhdGVkIGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgdm9pZCBjbGVhckF0dHJpYnV0ZXMoKSB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGxpc3Qgb2YgYXR0cmlidXRlcyB0byBiZSByZW1vdmVkCisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChpdGVyLm5leHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmUgYXBwbGljYXRpb24gb3JpZ2luYXRlZCBhdHRyaWJ1dGVzCisgICAgICAgIC8vIChyZWFkIG9ubHkgYXR0cmlidXRlcyB3aWxsIGJlIGxlZnQgaW4gcGxhY2UpCisgICAgICAgIEl0ZXJhdG9yIGtleXMgPSBsaXN0Lml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGtleXMubmV4dCgpOworICAgICAgICAgICAgcmVtb3ZlQXR0cmlidXRlKGtleSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZmFjYWRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEFwcGxpY2F0aW9uQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2VydmxldENvbnRleHQgZ2V0RmFjYWRlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5mYWNhZGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gYXR0cmlidXRlIGFzIHJlYWQgb25seS4KKyAgICAgKi8KKyAgICB2b2lkIHNldEF0dHJpYnV0ZVJlYWRPbmx5KFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChhdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICBpZiAoYXR0cmlidXRlcy5jb250YWluc0tleShuYW1lKSkKKyAgICAgICAgICAgICAgICByZWFkT25seUF0dHJpYnV0ZXMucHV0KG5hbWUsIG5hbWUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb250ZXh0LXJlbGF0aXZlIHBhdGgsIGJlZ2lubmluZyB3aXRoIGEgIi8iLCB0aGF0IHJlcHJlc2VudHMKKyAgICAgKiB0aGUgY2Fub25pY2FsIHZlcnNpb24gb2YgdGhlIHNwZWNpZmllZCBwYXRoIGFmdGVyICIuLiIgYW5kICIuIiBlbGVtZW50cworICAgICAqIGFyZSByZXNvbHZlZCBvdXQuICBJZiB0aGUgc3BlY2lmaWVkIHBhdGggYXR0ZW1wdHMgdG8gZ28gb3V0c2lkZSB0aGUKKyAgICAgKiBib3VuZGFyaWVzIG9mIHRoZSBjdXJyZW50IGNvbnRleHQgKGkuZS4gdG9vIG1hbnkgIi4uIiBwYXRoIGVsZW1lbnRzCisgICAgICogYXJlIHByZXNlbnQpLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaW5zdGVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggdG8gYmUgbm9ybWFsaXplZAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgcGF0aCkgeworCisgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG5vcm1hbGl6ZWQgPSBwYXRoOworCisgICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgc2xhc2hlcyBhbmQgYWRkIGxlYWRpbmcgc2xhc2ggaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChub3JtYWxpemVkLmluZGV4T2YoJ1xcJykgPj0gMCkKKyAgICAgICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnJlcGxhY2UoJ1xcJywgJy8nKTsKKworICAgICAgICAvLyBSZXNvbHZlIG9jY3VycmVuY2VzIG9mICIvLi4vIiBpbiB0aGUgbm9ybWFsaXplZCBwYXRoCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBub3JtYWxpemVkLmluZGV4T2YoIi8uLi8iKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOyAgLy8gVHJ5aW5nIHRvIGdvIG91dHNpZGUgb3VyIGNvbnRleHQKKyAgICAgICAgICAgIGludCBpbmRleDIgPSBub3JtYWxpemVkLmxhc3RJbmRleE9mKCcvJywgaW5kZXggLSAxKTsKKyAgICAgICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnN1YnN0cmluZygwLCBpbmRleDIpICsKKyAgICAgICAgICAgICAgICBub3JtYWxpemVkLnN1YnN0cmluZyhpbmRleCArIDMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBub3JtYWxpemVkIHBhdGggdGhhdCB3ZSBoYXZlIGNvbXBsZXRlZAorICAgICAgICByZXR1cm4gKG5vcm1hbGl6ZWQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNZXJnZSB0aGUgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUgYXBwbGljYXRpb24KKyAgICAgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3Igd2l0aCB0aGUgYXBwbGljYXRpb24gcGFyYW1ldGVycyBkZXNjcmliZWQgaW4gdGhlCisgICAgICogc2VydmVyIGNvbmZpZ3VyYXRpb24sIHJlc3BlY3RpbmcgdGhlIDxjb2RlPm92ZXJyaWRlPC9jb2RlPiBwcm9wZXJ0eSBvZgorICAgICAqIHRoZSBhcHBsaWNhdGlvbiBwYXJhbWV0ZXJzIGFwcHJvcHJpYXRlbHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG1lcmdlUGFyYW1ldGVycygpIHsKKworICAgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBIYXNoTWFwIHJlc3VsdHMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBTdHJpbmcgbmFtZXNbXSA9IGNvbnRleHQuZmluZFBhcmFtZXRlcnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHJlc3VsdHMucHV0KG5hbWVzW2ldLCBjb250ZXh0LmZpbmRQYXJhbWV0ZXIobmFtZXNbaV0pKTsKKyAgICAgICAgQXBwbGljYXRpb25QYXJhbWV0ZXIgcGFyYW1zW10gPQorICAgICAgICAgICAgY29udGV4dC5maW5kQXBwbGljYXRpb25QYXJhbWV0ZXJzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocGFyYW1zW2ldLmdldE92ZXJyaWRlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0cy5nZXQocGFyYW1zW2ldLmdldE5hbWUoKSkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXQocGFyYW1zW2ldLmdldE5hbWUoKSwgcGFyYW1zW2ldLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChwYXJhbXNbaV0uZ2V0TmFtZSgpLCBwYXJhbXNbaV0uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcGFyYW1ldGVycyA9IHJlc3VsdHM7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExpc3QgcmVzb3VyY2UgcGF0aHMgKHJlY3Vyc2l2ZWx5KSwgYW5kIHN0b3JlIGFsbCBvZiB0aGVtIGluIHRoZSBnaXZlbgorICAgICAqIFNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxpc3RDb2xsZWN0aW9uUGF0aHMKKyAgICAgICAgKFNldCBzZXQsIERpckNvbnRleHQgcmVzb3VyY2VzLCBTdHJpbmcgcGF0aCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgRW51bWVyYXRpb24gY2hpbGRQYXRocyA9IHJlc291cmNlcy5saXN0QmluZGluZ3MocGF0aCk7CisgICAgICAgIHdoaWxlIChjaGlsZFBhdGhzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgY2hpbGRQYXRocy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBiaW5kaW5nLmdldE5hbWUoKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBjaGlsZFBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKHBhdGgpOworICAgICAgICAgICAgaWYgKCEiLyIuZXF1YWxzKHBhdGgpICYmICFwYXRoLmVuZHNXaXRoKCIvIikpCisgICAgICAgICAgICAgICAgY2hpbGRQYXRoLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgY2hpbGRQYXRoLmFwcGVuZChuYW1lKTsKKyAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBiaW5kaW5nLmdldE9iamVjdCgpOworICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERpckNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBjaGlsZFBhdGguYXBwZW5kKCIvIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQuYWRkKGNoaWxkUGF0aC50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgZnVsbCBwYXRoLCBiYXNlZCBvbiB0aGUgaG9zdCBuYW1lIGFuZCB0aGUgY29udGV4dCBwYXRoLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRKTkRJVXJpKFN0cmluZyBob3N0TmFtZSwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgICAgIHJldHVybiAiLyIgKyBob3N0TmFtZSArICIvIiArIHBhdGg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAiLyIgKyBob3N0TmFtZSArIHBhdGg7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uQ29udGV4dEZhY2FkZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25Db250ZXh0RmFjYWRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1ZTY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uQ29udGV4dEZhY2FkZS5qYXZhCkBAIC0wLDAgKzEsNDg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlY3VyaXR5LlNlY3VyaXR5VXRpbDsKKworCisvKioKKyAqIEZhY2FkZSBvYmplY3Qgd2hpY2ggbWFza3MgdGhlIGludGVybmFsIDxjb2RlPkFwcGxpY2F0aW9uQ29udGV4dDwvY29kZT4KKyAqIG9iamVjdCBmcm9tIHRoZSB3ZWIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQGF1dGhvciBKZWFuLUZyYW5jb2lzIEFyY2FuZAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQXBwbGljYXRpb25Db250ZXh0RmFjYWRlCisgICAgaW1wbGVtZW50cyBTZXJ2bGV0Q29udGV4dCB7CisgICAgICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXR0cmlidXRlcworICAgIC8qKgorICAgICAqIENhY2hlIENsYXNzIG9iamVjdCB1c2VkIGZvciByZWZsZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBjbGFzc0NhY2hlOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENhY2hlIG1ldGhvZCBvYmplY3QuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIG9iamVjdENhY2hlOworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBDb250ZXh0IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGFzc29jaWF0ZWQgQ29udGV4dCBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvbkNvbnRleHRGYWNhZGUoQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgCisgICAgICAgIGNsYXNzQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBvYmplY3RDYWNoZSA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIGluaXRDbGFzc0NhY2hlKCk7CisgICAgfQorICAgIAorICAgIAorICAgIHByaXZhdGUgdm9pZCBpbml0Q2xhc3NDYWNoZSgpeworICAgICAgICBDbGFzc1tdIGNsYXp6ID0gbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfTsKKyAgICAgICAgY2xhc3NDYWNoZS5wdXQoImdldENvbnRleHQiLCBjbGF6eik7CisgICAgICAgIGNsYXNzQ2FjaGUucHV0KCJnZXRNaW1lVHlwZSIsIGNsYXp6KTsKKyAgICAgICAgY2xhc3NDYWNoZS5wdXQoImdldFJlc291cmNlUGF0aHMiLCBjbGF6eik7CisgICAgICAgIGNsYXNzQ2FjaGUucHV0KCJnZXRSZXNvdXJjZSIsIGNsYXp6KTsKKyAgICAgICAgY2xhc3NDYWNoZS5wdXQoImdldFJlc291cmNlQXNTdHJlYW0iLCBjbGF6eik7CisgICAgICAgIGNsYXNzQ2FjaGUucHV0KCJnZXRSZXF1ZXN0RGlzcGF0Y2hlciIsIGNsYXp6KTsKKyAgICAgICAgY2xhc3NDYWNoZS5wdXQoImdldE5hbWVkRGlzcGF0Y2hlciIsIGNsYXp6KTsKKyAgICAgICAgY2xhc3NDYWNoZS5wdXQoImdldFNlcnZsZXQiLCBjbGF6eik7CisgICAgICAgIGNsYXNzQ2FjaGUucHV0KCJnZXRJbml0UGFyYW1ldGVyIiwgY2xhenopOworICAgICAgICBjbGFzc0NhY2hlLnB1dCgic2V0QXR0cmlidXRlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9KTsKKyAgICAgICAgY2xhc3NDYWNoZS5wdXQoInJlbW92ZUF0dHJpYnV0ZSIsIGNsYXp6KTsKKyAgICAgICAgY2xhc3NDYWNoZS5wdXQoImdldFJlYWxQYXRoIiwgY2xhenopOworICAgICAgICBjbGFzc0NhY2hlLnB1dCgiZ2V0QXR0cmlidXRlIiwgY2xhenopOworICAgICAgICBjbGFzc0NhY2hlLnB1dCgibG9nIiwgY2xhenopOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFdyYXBwZWQgYXBwbGljYXRpb24gY29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKyAgICAKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXJ2bGV0Q29udGV4dCBNZXRob2RzCisKKworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRDb250ZXh0KFN0cmluZyB1cmlwYXRoKSB7CisgICAgICAgIFNlcnZsZXRDb250ZXh0IHRoZUNvbnRleHQgPSBudWxsOworICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHRoZUNvbnRleHQgPSAoU2VydmxldENvbnRleHQpCisgICAgICAgICAgICAgICAgZG9Qcml2aWxlZ2VkKCJnZXRDb250ZXh0IiwgbmV3IE9iamVjdFtde3VyaXBhdGh9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoZUNvbnRleHQgPSBjb250ZXh0LmdldENvbnRleHQodXJpcGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0aGVDb250ZXh0ICE9IG51bGwpICYmCisgICAgICAgICAgICAodGhlQ29udGV4dCBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uQ29udGV4dCkpeworICAgICAgICAgICAgdGhlQ29udGV4dCA9ICgoQXBwbGljYXRpb25Db250ZXh0KXRoZUNvbnRleHQpLmdldEZhY2FkZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodGhlQ29udGV4dCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IGdldE1ham9yVmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0TWFqb3JWZXJzaW9uKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IGdldE1pbm9yVmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0TWlub3JWZXJzaW9uKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKFN0cmluZyBmaWxlKSB7CisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpZG9Qcml2aWxlZ2VkKCJnZXRNaW1lVHlwZSIsIG5ldyBPYmplY3RbXXtmaWxlfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRNaW1lVHlwZShmaWxlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIFNldCBnZXRSZXNvdXJjZVBhdGhzKFN0cmluZyBwYXRoKSB7CisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSl7CisgICAgICAgICAgICByZXR1cm4gKFNldClkb1ByaXZpbGVnZWQoImdldFJlc291cmNlUGF0aHMiLCBuZXcgT2JqZWN0W117cGF0aH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UmVzb3VyY2VQYXRocyhwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIFVSTCBnZXRSZXNvdXJjZShTdHJpbmcgcGF0aCkKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFVSTCkgaW52b2tlTWV0aG9kKGNvbnRleHQsICJnZXRSZXNvdXJjZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde3BhdGh9KTsKKyAgICAgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbil7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChNYWxmb3JtZWRVUkxFeGNlcHRpb24pdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRSZXNvdXJjZShwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gKElucHV0U3RyZWFtKSBkb1ByaXZpbGVnZWQoImdldFJlc291cmNlQXNTdHJlYW0iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117cGF0aH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIFJlcXVlc3REaXNwYXRjaGVyIGdldFJlcXVlc3REaXNwYXRjaGVyKGZpbmFsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIChSZXF1ZXN0RGlzcGF0Y2hlcikgZG9Qcml2aWxlZ2VkKCJnZXRSZXF1ZXN0RGlzcGF0Y2hlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtwYXRofSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIFJlcXVlc3REaXNwYXRjaGVyIGdldE5hbWVkRGlzcGF0Y2hlcihTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoUmVxdWVzdERpc3BhdGNoZXIpIGRvUHJpdmlsZWdlZCgiZ2V0TmFtZWREaXNwYXRjaGVyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde25hbWV9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldE5hbWVkRGlzcGF0Y2hlcihuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIFNlcnZsZXQgZ2V0U2VydmxldChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChTZXJ2bGV0KSBpbnZva2VNZXRob2QoY29udGV4dCwgImdldFNlcnZsZXQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117bmFtZX0pOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFNlcnZsZXRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFNlcnZsZXRFeGNlcHRpb24pIHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U2VydmxldChuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFNlcnZsZXRzKCkgeworICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoRW51bWVyYXRpb24pIGRvUHJpdmlsZWdlZCgiZ2V0U2VydmxldHMiLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFNlcnZsZXRzKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRTZXJ2bGV0TmFtZXMoKSB7CisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIChFbnVtZXJhdGlvbikgZG9Qcml2aWxlZ2VkKCJnZXRTZXJ2bGV0TmFtZXMiLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFNlcnZsZXROYW1lcygpOworICAgICAgICB9CisgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7CisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgZG9Qcml2aWxlZ2VkKCJsb2ciLCBuZXcgT2JqZWN0W117bXNnfSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dC5sb2cobXNnKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHZvaWQgbG9nKEV4Y2VwdGlvbiBleGNlcHRpb24sIFN0cmluZyBtc2cpIHsKKyAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBkb1ByaXZpbGVnZWQoImxvZyIsIG5ldyBDbGFzc1tde0V4Y2VwdGlvbi5jbGFzcywgU3RyaW5nLmNsYXNzfSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2V4Y2VwdGlvbixtc2d9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnRleHQubG9nKGV4Y2VwdGlvbiwgbXNnKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgZG9Qcml2aWxlZ2VkKCJsb2ciLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3MsIFRocm93YWJsZS5jbGFzc30sIAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXttZXNzYWdlLCB0aHJvd2FibGV9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnRleHQubG9nKG1lc3NhZ2UsIHRocm93YWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgZG9Qcml2aWxlZ2VkKCJnZXRSZWFsUGF0aCIsIG5ldyBPYmplY3RbXXtwYXRofSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRSZWFsUGF0aChwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJJbmZvKCkgeworICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBkb1ByaXZpbGVnZWQoImdldFNlcnZlckluZm8iLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFNlcnZlckluZm8oKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGRvUHJpdmlsZWdlZCgiZ2V0SW5pdFBhcmFtZXRlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117bmFtZX0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0SW5pdFBhcmFtZXRlcihuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEluaXRQYXJhbWV0ZXJOYW1lcygpIHsKKyAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gKEVudW1lcmF0aW9uKSBkb1ByaXZpbGVnZWQoImdldEluaXRQYXJhbWV0ZXJOYW1lcyIsIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGRvUHJpdmlsZWdlZCgiZ2V0QXR0cmlidXRlIiwgbmV3IE9iamVjdFtde25hbWV9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgfQorICAgICB9CisKKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVOYW1lcygpIHsKKyAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gKEVudW1lcmF0aW9uKSBkb1ByaXZpbGVnZWQoImdldEF0dHJpYnV0ZU5hbWVzIiwgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBkb1ByaXZpbGVnZWQoInNldEF0dHJpYnV0ZSIsIG5ldyBPYmplY3RbXXtuYW1lLG9iamVjdH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dC5zZXRBdHRyaWJ1dGUobmFtZSwgb2JqZWN0KTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgZG9Qcml2aWxlZ2VkKCJyZW1vdmVBdHRyaWJ1dGUiLCBuZXcgT2JqZWN0W117bmFtZX0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldENvbnRleHROYW1lKCkgeworICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBkb1ByaXZpbGVnZWQoImdldFNlcnZsZXRDb250ZXh0TmFtZSIsIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U2VydmxldENvbnRleHROYW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQYXRoKCkgeworICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBkb1ByaXZpbGVnZWQoImdldENvbnRleHRQYXRoIiwgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRDb250ZXh0UGF0aCgpOworICAgICAgICB9CisgICAgfQorCisgICAgICAgCisgICAgLyoqCisgICAgICogVXNlIHJlZmxlY3Rpb24gdG8gaW52b2tlIHRoZSByZXF1ZXN0ZWQgbWV0aG9kLiBDYWNoZSB0aGUgbWV0aG9kIG9iamVjdCAKKyAgICAgKiB0byBzcGVlZCB1cCB0aGUgcHJvY2VzcworICAgICAqICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgaW52b2tlZAorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIFRoZSBtZXRob2QgdG8gY2FsbC4KKyAgICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBjYWxsZWQgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGRvUHJpdmlsZWdlZChmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgZmluYWwgT2JqZWN0W10gcGFyYW1zKXsKKyAgICAgICAgdHJ5eworICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZChjb250ZXh0LCBtZXRob2ROYW1lLCBwYXJhbXMpOworICAgICAgICB9Y2F0Y2goVGhyb3dhYmxlIHQpeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogVXNlIHJlZmxlY3Rpb24gdG8gaW52b2tlIHRoZSByZXF1ZXN0ZWQgbWV0aG9kLiBDYWNoZSB0aGUgbWV0aG9kIG9iamVjdCAKKyAgICAgKiB0byBzcGVlZCB1cCB0aGUgcHJvY2VzcworICAgICAqIEBwYXJhbSBhcHBDb250ZXh0IFRoZSBBcHBsaWF0aW9uQ29udGV4dCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGhvZAorICAgICAqICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgaW52b2tlZAorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIFRoZSBtZXRob2QgdG8gY2FsbC4KKyAgICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBjYWxsZWQgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGludm9rZU1ldGhvZChBcHBsaWNhdGlvbkNvbnRleHQgYXBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBwYXJhbXMpIAorICAgICAgICB0aHJvd3MgVGhyb3dhYmxleworCisgICAgICAgIHRyeXsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKW9iamVjdENhY2hlLmdldChtZXRob2ROYW1lKTsKKyAgICAgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCl7CisgICAgICAgICAgICAgICAgbWV0aG9kID0gYXBwQ29udGV4dC5nZXRDbGFzcygpCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXRob2QobWV0aG9kTmFtZSwgKENsYXNzW10pY2xhc3NDYWNoZS5nZXQobWV0aG9kTmFtZSkpOworICAgICAgICAgICAgICAgIG9iamVjdENhY2hlLnB1dChtZXRob2ROYW1lLCBtZXRob2QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gZXhlY3V0ZU1ldGhvZChtZXRob2QsYXBwQ29udGV4dCxwYXJhbXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpeworICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4LCBtZXRob2ROYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcGFyYW1zID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBVc2UgcmVmbGVjdGlvbiB0byBpbnZva2UgdGhlIHJlcXVlc3RlZCBtZXRob2QuIENhY2hlIHRoZSBtZXRob2Qgb2JqZWN0IAorICAgICAqIHRvIHNwZWVkIHVwIHRoZSBwcm9jZXNzCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgVGhlIG1ldGhvZCB0byBpbnZva2UuCisgICAgICogQHBhcmFtIGNsYXp6IFRoZSBjbGFzcyB3aGVyZSB0aGUgbWV0aG9kIGlzLgorICAgICAqIEBwYXJhbSBwYXJhbXMgVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGNhbGxlZCBtZXRob2QuCisgICAgICovICAgIAorICAgIHByaXZhdGUgT2JqZWN0IGRvUHJpdmlsZWdlZChmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzW10gY2xhenosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHBhcmFtcyl7CisKKyAgICAgICAgdHJ5eworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGNvbnRleHQuZ2V0Q2xhc3MoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIChDbGFzc1tdKWNsYXp6KTsKKyAgICAgICAgICAgIHJldHVybiBleGVjdXRlTWV0aG9kKG1ldGhvZCxjb250ZXh0LHBhcmFtcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCl7CisgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4LCBtZXRob2ROYW1lKTsKKyAgICAgICAgICAgIH1jYXRjaCAoVGhyb3dhYmxlIHQpeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcGFyYW1zID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgbWV0aG9kIG9mIHRoZSBzcGVjaWZpZWQgPGNvZGU+QXBwbGljYXRpb25Db250ZXh0PC9jb2RlPgorICAgICAqIEBwYXJhbSBtZXRob2QgVGhlIG1ldGhvZCBvYmplY3QgdG8gYmUgaW52b2tlZC4KKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQXBwbGlhdGlvbkNvbnRleHQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRob2QKKyAgICAgKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGludm9rZWQKKyAgICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBjYWxsZWQgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGV4ZWN1dGVNZXRob2QoZmluYWwgTWV0aG9kIG1ldGhvZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIHBhcmFtcykgCisgICAgICAgICAgICB0aHJvd3MgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiwgCisgICAgICAgICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKXsKKyAgICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCl7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbnsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UoY29udGV4dCwgIHBhcmFtcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZShjb250ZXh0LCBwYXJhbXMpOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKgorICAgICAqIFRocm93IHRoZSByZWFsIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gZXggVGhlIGN1cnJlbnQgZXhjZXB0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2VwdGlvbihFeGNlcHRpb24gZXgsIFN0cmluZyBtZXRob2ROYW1lKQorCSAgICB0aHJvd3MgVGhyb3dhYmxlIHsKKworICAgICAgICBUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbjsKKyAgICAgICAgCisgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24pIHsKKyAgICAgICAgICAgIGV4ID0gKChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uKSBleCkuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJlYWxFeGNlcHRpb24gPQorICAgICAgICAgICAgICAgICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZXgpLmdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVhbEV4Y2VwdGlvbiA9IGV4OworICAgICAgICB9ICAgCisgICAgICAgIAorICAgICAgICB0aHJvdyByZWFsRXhjZXB0aW9uOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uRGlzcGF0Y2hlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25EaXNwYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMxZjE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uRGlzcGF0Y2hlci5qYXZhCkBAIC0wLDAgKzEsMTAyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlJlcXVlc3REaXNwYXRjaGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdFdyYXBwZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5JbnN0YW5jZUV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuV3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5DbGllbnRBYm9ydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3RGYWNhZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2VGYWNhZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkluc3RhbmNlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CisKKy8qKgorICogU3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+IHRoYXQgYWxsb3dzIGEKKyAqIHJlcXVlc3QgdG8gYmUgZm9yd2FyZGVkIHRvIGEgZGlmZmVyZW50IHJlc291cmNlIHRvIGNyZWF0ZSB0aGUgdWx0aW1hdGUKKyAqIHJlc3BvbnNlLCBvciB0byBpbmNsdWRlIHRoZSBvdXRwdXQgb2YgYW5vdGhlciByZXNvdXJjZSBpbiB0aGUgcmVzcG9uc2UKKyAqIGZyb20gdGhpcyByZXNvdXJjZS4gIFRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzIGFwcGxpY2F0aW9uIGxldmVsIHNlcnZsZXRzCisgKiB0byB3cmFwIHRoZSByZXF1ZXN0IGFuZC9vciByZXNwb25zZSBvYmplY3RzIHRoYXQgYXJlIHBhc3NlZCBvbiB0byB0aGUKKyAqIGNhbGxlZCByZXNvdXJjZSwgYXMgbG9uZyBhcyB0aGUgd3JhcHBpbmcgY2xhc3NlcyBleHRlbmQKKyAqIDxjb2RlPmphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RXcmFwcGVyPC9jb2RlPiBhbmQKKyAqIDxjb2RlPmphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlV3JhcHBlcjwvY29kZT4uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK2ZpbmFsIGNsYXNzIEFwcGxpY2F0aW9uRGlzcGF0Y2hlcgorICAgIGltcGxlbWVudHMgUmVxdWVzdERpc3BhdGNoZXIgeworCisKKyAgICBwcm90ZWN0ZWQgY2xhc3MgUHJpdmlsZWdlZEZvcndhcmQgaW1wbGVtZW50cyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OworICAgICAgICBwcml2YXRlIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICBQcml2aWxlZ2VkRm9yd2FyZChTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvRm9yd2FyZChyZXF1ZXN0LHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGNsYXNzIFByaXZpbGVnZWRJbmNsdWRlIGltcGxlbWVudHMgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbiB7CisgICAgICAgIHByaXZhdGUgU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKKyAgICAgICAgcHJpdmF0ZSBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICAgICAgUHJpdmlsZWdlZEluY2x1ZGUoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZG9JbmNsdWRlKHJlcXVlc3QscmVzcG9uc2UpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHBhc3Mgc3RhdGUgd2hlbiB0aGUgcmVxdWVzdCBkaXNwYXRjaGVyIGlzIHVzZWQuIFVzaW5nIGluc3RhbmNlCisgICAgICogdmFyaWFibGVzIGNhdXNlcyB0aHJlYWRpbmcgaXNzdWVzIGFuZCBzdGF0ZSBpcyB0b28gY29tcGxleCB0byBwYXNzIGFuZAorICAgICAqIHJldHVybiBzaW5nbGUgU2VydmxldFJlcXVlc3Qgb3IgU2VydmxldFJlc3BvbnNlIG9iamVjdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBTdGF0ZSB7CisgICAgICAgIFN0YXRlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGluZykgeworICAgICAgICAgICAgdGhpcy5vdXRlclJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICAgICAgdGhpcy5vdXRlclJlc3BvbnNlID0gcmVzcG9uc2U7CisgICAgICAgICAgICB0aGlzLmluY2x1ZGluZyA9IGluY2x1ZGluZzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb3V0ZXJtb3N0IHJlcXVlc3QgdGhhdCB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgaW52b2tlZCBzZXJ2bGV0LgorICAgICAgICAgKi8KKyAgICAgICAgU2VydmxldFJlcXVlc3Qgb3V0ZXJSZXF1ZXN0ID0gbnVsbDsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb3V0ZXJtb3N0IHJlc3BvbnNlIHRoYXQgd2lsbCBiZSBwYXNzZWQgb24gdG8gdGhlIGludm9rZWQgc2VydmxldC4KKyAgICAgICAgICovCisgICAgICAgIFNlcnZsZXRSZXNwb25zZSBvdXRlclJlc3BvbnNlID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcmVxdWVzdCB3cmFwcGVyIHdlIGhhdmUgY3JlYXRlZCBhbmQgaW5zdGFsbGVkIChpZiBhbnkpLgorICAgICAgICAgKi8KKyAgICAgICAgU2VydmxldFJlcXVlc3Qgd3JhcFJlcXVlc3QgPSBudWxsOworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSByZXNwb25zZSB3cmFwcGVyIHdlIGhhdmUgY3JlYXRlZCBhbmQgaW5zdGFsbGVkIChpZiBhbnkpLgorICAgICAgICAgKi8KKyAgICAgICAgU2VydmxldFJlc3BvbnNlIHdyYXBSZXNwb25zZSA9IG51bGw7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogQXJlIHdlIHBlcmZvcm1pbmcgYW4gaW5jbHVkZSgpIGluc3RlYWQgb2YgYSBmb3J3YXJkKCk/CisgICAgICAgICAqLworICAgICAgICBib29sZWFuIGluY2x1ZGluZyA9IGZhbHNlOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgY29uZmlndXJlZCBhY2NvcmRpbmcgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIHBhcmFtZXRlcnMuICBJZiBib3RoIHNlcnZsZXRQYXRoIGFuZCBwYXRoSW5mbyBhcmUKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiwgaXQgd2lsbCBiZSBhc3N1bWVkIHRoYXQgdGhpcyBSZXF1ZXN0RGlzcGF0Y2hlcgorICAgICAqIHdhcyBhY3F1aXJlZCBieSBuYW1lLCByYXRoZXIgdGhhbiBieSBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHdyYXBwZXIgVGhlIFdyYXBwZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZSB0aGF0IHdpbGwKKyAgICAgKiAgYmUgZm9yd2FyZGVkIHRvIG9yIGluY2x1ZGVkIChyZXF1aXJlZCkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdFVSSSBUaGUgcmVxdWVzdCBVUkkgdG8gdGhpcyByZXNvdXJjZSAoaWYgYW55KQorICAgICAqIEBwYXJhbSBzZXJ2bGV0UGF0aCBUaGUgcmV2aXNlZCBzZXJ2bGV0IHBhdGggdG8gdGhpcyByZXNvdXJjZSAoaWYgYW55KQorICAgICAqIEBwYXJhbSBwYXRoSW5mbyBUaGUgcmV2aXNlZCBleHRyYSBwYXRoIGluZm9ybWF0aW9uIHRvIHRoaXMgcmVzb3VyY2UKKyAgICAgKiAgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcXVlcnlTdHJpbmcgUXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgaW5jbHVkZWQgd2l0aCB0aGlzIHJlcXVlc3QKKyAgICAgKiAgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gbmFtZSBTZXJ2bGV0IG5hbWUgKGlmIGEgbmFtZWQgZGlzcGF0Y2hlciB3YXMgY3JlYXRlZCkKKyAgICAgKiAgZWxzZSA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvbkRpc3BhdGNoZXIKKyAgICAgICAgKFdyYXBwZXIgd3JhcHBlciwgU3RyaW5nIHJlcXVlc3RVUkksIFN0cmluZyBzZXJ2bGV0UGF0aCwKKyAgICAgICAgIFN0cmluZyBwYXRoSW5mbywgU3RyaW5nIHF1ZXJ5U3RyaW5nLCBTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICAgICAgLy8gU2F2ZSBhbGwgb2Ygb3VyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICAgICAgICB0aGlzLndyYXBwZXIgPSB3cmFwcGVyOworICAgICAgICB0aGlzLmNvbnRleHQgPSAoQ29udGV4dCkgd3JhcHBlci5nZXRQYXJlbnQoKTsKKyAgICAgICAgbG9nID0gIGNvbnRleHQuZ2V0TG9nZ2VyKCk7CisgICAgICAgIHRoaXMucmVxdWVzdFVSSSA9IHJlcXVlc3RVUkk7CisgICAgICAgIHRoaXMuc2VydmxldFBhdGggPSBzZXJ2bGV0UGF0aDsKKyAgICAgICAgdGhpcy5wYXRoSW5mbyA9IHBhdGhJbmZvOworICAgICAgICB0aGlzLnF1ZXJ5U3RyaW5nID0gcXVlcnlTdHJpbmc7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIGlmICh3cmFwcGVyIGluc3RhbmNlb2YgU3RhbmRhcmRXcmFwcGVyKQorICAgICAgICAgICAgdGhpcy5zdXBwb3J0ID0gKChTdGFuZGFyZFdyYXBwZXIpIHdyYXBwZXIpLmdldEluc3RhbmNlU3VwcG9ydCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aGlzLnN1cHBvcnQgPSBuZXcgSW5zdGFuY2VTdXBwb3J0KHdyYXBwZXIpOworCisgICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJzZXJ2bGV0UGF0aD0iICsgdGhpcy5zZXJ2bGV0UGF0aCArICIsIHBhdGhJbmZvPSIgKworICAgICAgICAgICAgICAgIHRoaXMucGF0aEluZm8gKyAiLCBxdWVyeVN0cmluZz0iICsgcXVlcnlTdHJpbmcgKworICAgICAgICAgICAgICAgICIsIG5hbWU9IiArIHRoaXMubmFtZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgcHJpdmF0ZSBMb2cgbG9nID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBDb250ZXh0IHRoaXMgUmVxdWVzdERpc3BhdGNoZXIgaXMgYXNzb2NpYXRlZCB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQXBwbGljYXRpb25EaXNwYXRjaGVyLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2bGV0IG5hbWUgZm9yIGEgbmFtZWQgZGlzcGF0Y2hlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGV4dHJhIHBhdGggaW5mb3JtYXRpb24gZm9yIHRoaXMgUmVxdWVzdERpc3BhdGNoZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aEluZm8gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgZm9yIHRoaXMgUmVxdWVzdERpc3BhdGNoZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnlTdHJpbmcgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBVUkkgZm9yIHRoaXMgUmVxdWVzdERpc3BhdGNoZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVxdWVzdFVSSSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2bGV0IHBhdGggZm9yIHRoaXMgUmVxdWVzdERpc3BhdGNoZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmxldFBhdGggPSBudWxsOworCisgICAgCisgICAgLyoqCisgICAgICogVGhlIFN0cmluZ01hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBJbnN0YW5jZVN1cHBvcnQgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIG91ciBXcmFwcGVyICh1c2VkIHRvCisgICAgICogc2VuZCAiYmVmb3JlIGRpc3BhdGNoIiBhbmQgImFmdGVyIGRpc3BhdGNoIiBldmVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnN0YW5jZVN1cHBvcnQgc3VwcG9ydCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBXcmFwcGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UgdGhhdCB3aWxsIGJlIGZvcndhcmRlZCB0bworICAgICAqIG9yIGluY2x1ZGVkLgorICAgICAqLworICAgIHByaXZhdGUgV3JhcHBlciB3cmFwcGVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEZvcndhcmQgdGhpcyByZXF1ZXN0IGFuZCByZXNwb25zZSB0byBhbm90aGVyIHJlc291cmNlIGZvciBwcm9jZXNzaW5nLgorICAgICAqIEFueSBydW50aW1lIGV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIG9yIFNlcnZsZXRFeGNlcHRpb24gdGhyb3duIGJ5IHRoZQorICAgICAqIGNhbGxlZCBzZXJ2bGV0IHdpbGwgYmUgcHJvcG9nYXRlZCB0byB0aGUgY2FsbGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB0byBiZSBmb3J3YXJkZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2UgdG8gYmUgZm9yd2FyZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmb3J3YXJkKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUHJpdmlsZWdlZEZvcndhcmQgZHAgPSBuZXcgUHJpdmlsZWdlZEZvcndhcmQocmVxdWVzdCxyZXNwb25zZSk7CisgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoZHApOworICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gcGUuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTZXJ2bGV0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyAoU2VydmxldEV4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb0ZvcndhcmQocmVxdWVzdCxyZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Gb3J3YXJkKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAKKyAgICAgICAgLy8gUmVzZXQgYW55IG91dHB1dCB0aGF0IGhhcyBiZWVuIGJ1ZmZlcmVkLCBidXQga2VlcCBoZWFkZXJzL2Nvb2tpZXMKKyAgICAgICAgaWYgKHJlc3BvbnNlLmlzQ29tbWl0dGVkKCkpIHsKKyAgICAgICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBGb3J3YXJkIG9uIGNvbW1pdHRlZCByZXNwb25zZSAtLT4gSVNFIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiYXBwbGljYXRpb25EaXNwYXRjaGVyLmZvcndhcmQuaXNlIikpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5yZXNldEJ1ZmZlcigpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIEZvcndhcmQgcmVzZXRCdWZmZXIoKSByZXR1cm5lZCBJU0U6ICIgKyBlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdXAgdG8gaGFuZGxlIHRoZSBzcGVjaWZpZWQgcmVxdWVzdCBhbmQgcmVzcG9uc2UKKyAgICAgICAgU3RhdGUgc3RhdGUgPSBuZXcgU3RhdGUocmVxdWVzdCwgcmVzcG9uc2UsIGZhbHNlKTsKKyAgICAgICAgCisgICAgICAgIGlmIChHbG9iYWxzLlNUUklDVF9TRVJWTEVUX0NPTVBMSUFOQ0UpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIFNSVi44LjIgLyBTUlYuMTQuMi41LjEgY29tcGxpYW5jZQorICAgICAgICAgICAgY2hlY2tTYW1lT2JqZWN0cyhyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZGVudGlmeSB0aGUgSFRUUC1zcGVjaWZpYyByZXF1ZXN0IGFuZCByZXNwb25zZSBvYmplY3RzIChpZiBhbnkpCisgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCBocmVxdWVzdCA9IG51bGw7CisgICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXF1ZXN0KQorICAgICAgICAgICAgaHJlcXVlc3QgPSAoSHR0cFNlcnZsZXRSZXF1ZXN0KSByZXF1ZXN0OworICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIGhyZXNwb25zZSA9IG51bGw7CisgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVzcG9uc2UpCisgICAgICAgICAgICBocmVzcG9uc2UgPSAoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzcG9uc2U7CisKKyAgICAgICAgLy8gSGFuZGxlIGEgbm9uLUhUVFAgZm9yd2FyZCBieSBwYXNzaW5nIHRoZSBleGlzdGluZyByZXF1ZXN0L3Jlc3BvbnNlCisgICAgICAgIGlmICgoaHJlcXVlc3QgPT0gbnVsbCkgfHwgKGhyZXNwb25zZSA9PSBudWxsKSkgeworCisgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBOb24tSFRUUCBGb3J3YXJkIik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHByb2Nlc3NSZXF1ZXN0KGhyZXF1ZXN0LGhyZXNwb25zZSxzdGF0ZSk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIEhhbmRsZSBhbiBIVFRQIG5hbWVkIGRpc3BhdGNoZXIgZm9yd2FyZAorICAgICAgICBlbHNlIGlmICgoc2VydmxldFBhdGggPT0gbnVsbCkgJiYgKHBhdGhJbmZvID09IG51bGwpKSB7CisKKyAgICAgICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIE5hbWVkIERpc3BhdGNoZXIgRm9yd2FyZCIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBBcHBsaWNhdGlvbkh0dHBSZXF1ZXN0IHdyZXF1ZXN0ID0KKyAgICAgICAgICAgICAgICAoQXBwbGljYXRpb25IdHRwUmVxdWVzdCkgd3JhcFJlcXVlc3Qoc3RhdGUpOworICAgICAgICAgICAgd3JlcXVlc3Quc2V0UmVxdWVzdFVSSShocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICAgICAgd3JlcXVlc3Quc2V0Q29udGV4dFBhdGgoaHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSk7CisgICAgICAgICAgICB3cmVxdWVzdC5zZXRTZXJ2bGV0UGF0aChocmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICAgICAgICAgIHdyZXF1ZXN0LnNldFBhdGhJbmZvKGhyZXF1ZXN0LmdldFBhdGhJbmZvKCkpOworICAgICAgICAgICAgd3JlcXVlc3Quc2V0UXVlcnlTdHJpbmcoaHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSk7CisKKyAgICAgICAgICAgIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3QscmVzcG9uc2Usc3RhdGUpOworCisgICAgICAgICAgICB3cmVxdWVzdC5yZWN5Y2xlKCk7CisgICAgICAgICAgICB1bndyYXBSZXF1ZXN0KHN0YXRlKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gSGFuZGxlIGFuIEhUVFAgcGF0aC1iYXNlZCBmb3J3YXJkCisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBQYXRoIEJhc2VkIEZvcndhcmQiKTsKKworICAgICAgICAgICAgQXBwbGljYXRpb25IdHRwUmVxdWVzdCB3cmVxdWVzdCA9CisgICAgICAgICAgICAgICAgKEFwcGxpY2F0aW9uSHR0cFJlcXVlc3QpIHdyYXBSZXF1ZXN0KHN0YXRlKTsKKyAgICAgICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpOworCisgICAgICAgICAgICBpZiAoaHJlcXVlc3QuZ2V0QXR0cmlidXRlKEdsb2JhbHMuRk9SV0FSRF9SRVFVRVNUX1VSSV9BVFRSKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuRk9SV0FSRF9SRVFVRVNUX1VSSV9BVFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICAgICAgICAgIHdyZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLkZPUldBUkRfQ09OVEVYVF9QQVRIX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkpOworICAgICAgICAgICAgICAgIHdyZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLkZPUldBUkRfU0VSVkxFVF9QQVRIX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkpOworICAgICAgICAgICAgICAgIHdyZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLkZPUldBUkRfUEFUSF9JTkZPX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZXF1ZXN0LmdldFBhdGhJbmZvKCkpOworICAgICAgICAgICAgICAgIHdyZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLkZPUldBUkRfUVVFUllfU1RSSU5HX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCkpOworICAgICAgICAgICAgfQorIAorICAgICAgICAgICAgd3JlcXVlc3Quc2V0Q29udGV4dFBhdGgoY29udGV4dFBhdGgpOworICAgICAgICAgICAgd3JlcXVlc3Quc2V0UmVxdWVzdFVSSShyZXF1ZXN0VVJJKTsKKyAgICAgICAgICAgIHdyZXF1ZXN0LnNldFNlcnZsZXRQYXRoKHNlcnZsZXRQYXRoKTsKKyAgICAgICAgICAgIHdyZXF1ZXN0LnNldFBhdGhJbmZvKHBhdGhJbmZvKTsKKyAgICAgICAgICAgIGlmIChxdWVyeVN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JlcXVlc3Quc2V0UXVlcnlTdHJpbmcocXVlcnlTdHJpbmcpOworICAgICAgICAgICAgICAgIHdyZXF1ZXN0LnNldFF1ZXJ5UGFyYW1zKHF1ZXJ5U3RyaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvY2Vzc1JlcXVlc3QocmVxdWVzdCxyZXNwb25zZSxzdGF0ZSk7CisKKyAgICAgICAgICAgIHdyZXF1ZXN0LnJlY3ljbGUoKTsKKyAgICAgICAgICAgIHVud3JhcFJlcXVlc3Qoc3RhdGUpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHJlYWwgY2xvc2UgaW4gb3JkZXIgdG8gc3VwcG9ydCBlcnJvciBwcm9jZXNzaW5nCisgICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgbG9nLmRlYnVnKCIgRGlzYWJsaW5nIHRoZSByZXNwb25zZSBmb3IgZnV0aGVyIG91dHB1dCIpOworCisgICAgICAgIGlmICAocmVzcG9uc2UgaW5zdGFuY2VvZiBSZXNwb25zZUZhY2FkZSkgeworICAgICAgICAgICAgKChSZXNwb25zZUZhY2FkZSkgcmVzcG9uc2UpLmZpbmlzaCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gU2VydmxldCBTUlYuNi4yLjIuIFRoZSBSZXNxdWVzdC9SZXNwb25zZSBtYXkgaGF2ZSBiZWVuIHdyYXBwZWQKKyAgICAgICAgICAgIC8vIGFuZCBtYXkgbm8gbG9uZ2VyIGJlIGluc3RhbmNlIG9mIFJlcXVlc3RGYWNhZGUgCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyggIiBUaGUgUmVzcG9uc2UgaXMgdmVoaWN1bGVkIHVzaW5nIGEgd3JhcHBlcjogIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVzcG9uc2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2xvc2UgYW55d2F5CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0T3V0cHV0U3RyZWFtIHN0cmVhbSA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZikgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZikgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgCisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIHRoZSByZXF1ZXN0IGJhc2VkIG9uIHRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1JlcXVlc3QoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgc3RhdGUpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgCisgICAgICAgIEludGVnZXIgZGlzSW50ID0gKEludGVnZXIpIHJlcXVlc3QuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAoQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LkRJU1BBVENIRVJfVFlQRV9BVFRSKTsKKyAgICAgICAgaWYgKGRpc0ludCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZGlzSW50LmludFZhbHVlKCkgIT0gQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LkVSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdGUub3V0ZXJSZXF1ZXN0LnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAoQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LkRJU1BBVENIRVJfUkVRVUVTVF9QQVRIX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0UGF0aCk7CisgICAgICAgICAgICAgICAgc3RhdGUub3V0ZXJSZXF1ZXN0LnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAoQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LkRJU1BBVENIRVJfVFlQRV9BVFRSLAorICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LkZPUldBUkQpKTsKKyAgICAgICAgICAgICAgICBpbnZva2Uoc3RhdGUub3V0ZXJSZXF1ZXN0LCByZXNwb25zZSwgc3RhdGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnZva2Uoc3RhdGUub3V0ZXJSZXF1ZXN0LCByZXNwb25zZSwgc3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogSW5jbHVkZSB0aGUgcmVzcG9uc2UgZnJvbSBhbm90aGVyIHJlc291cmNlIGluIHRoZSBjdXJyZW50IHJlc3BvbnNlLgorICAgICAqIEFueSBydW50aW1lIGV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIG9yIFNlcnZsZXRFeGNlcHRpb24gdGhyb3duIGJ5IHRoZQorICAgICAqIGNhbGxlZCBzZXJ2bGV0IHdpbGwgYmUgcHJvcG9nYXRlZCB0byB0aGUgY2FsbGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB0aGF0IGlzIGluY2x1ZGluZyB0aGlzIG9uZQorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB0byBiZSBhcHBlbmRlZCB0bworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5jbHVkZShTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFByaXZpbGVnZWRJbmNsdWRlIGRwID0gbmV3IFByaXZpbGVnZWRJbmNsdWRlKHJlcXVlc3QscmVzcG9uc2UpOworICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGRwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGUpIHsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHBlLmdldEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTZXJ2bGV0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyAoU2VydmxldEV4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb0luY2x1ZGUocmVxdWVzdCxyZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9JbmNsdWRlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBTZXQgdXAgdG8gaGFuZGxlIHRoZSBzcGVjaWZpZWQgcmVxdWVzdCBhbmQgcmVzcG9uc2UKKyAgICAgICAgU3RhdGUgc3RhdGUgPSBuZXcgU3RhdGUocmVxdWVzdCwgcmVzcG9uc2UsIHRydWUpOworCisgICAgICAgIGlmIChHbG9iYWxzLlNUUklDVF9TRVJWTEVUX0NPTVBMSUFOQ0UpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIFNSVi44LjIgLyBTUlYuMTQuMi41LjEgY29tcGxpYW5jZQorICAgICAgICAgICAgY2hlY2tTYW1lT2JqZWN0cyhyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIENyZWF0ZSBhIHdyYXBwZWQgcmVzcG9uc2UgdG8gdXNlIGZvciB0aGlzIHJlcXVlc3QKKyAgICAgICAgLy8gU2VydmxldFJlc3BvbnNlIHdyZXNwb25zZSA9IG51bGw7CisgICAgICAgIHdyYXBSZXNwb25zZShzdGF0ZSk7CisKKyAgICAgICAgLy8gSGFuZGxlIGEgbm9uLUhUVFAgaW5jbHVkZQorICAgICAgICBpZiAoIShyZXF1ZXN0IGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXF1ZXN0KSB8fAorICAgICAgICAgICAgIShyZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVzcG9uc2UpKSB7CisKKyAgICAgICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIE5vbi1IVFRQIEluY2x1ZGUiKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuRElTUEFUQ0hFUl9UWVBFX0FUVFIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeS5JTkNMVURFKSk7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LkRJU1BBVENIRVJfUkVRVUVTVF9QQVRIX0FUVFIsCisgICAgICAgICAgICAgICAgICAgIHNlcnZsZXRQYXRoKTsKKyAgICAgICAgICAgIGludm9rZShyZXF1ZXN0LCBzdGF0ZS5vdXRlclJlc3BvbnNlLCBzdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBIYW5kbGUgYW4gSFRUUCBuYW1lZCBkaXNwYXRjaGVyIGluY2x1ZGUKKyAgICAgICAgZWxzZSBpZiAobmFtZSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIE5hbWVkIERpc3BhdGNoZXIgSW5jbHVkZSIpOworCisgICAgICAgICAgICBBcHBsaWNhdGlvbkh0dHBSZXF1ZXN0IHdyZXF1ZXN0ID0KKyAgICAgICAgICAgICAgICAoQXBwbGljYXRpb25IdHRwUmVxdWVzdCkgd3JhcFJlcXVlc3Qoc3RhdGUpOworICAgICAgICAgICAgd3JlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuTkFNRURfRElTUEFUQ0hFUl9BVFRSLCBuYW1lKTsKKyAgICAgICAgICAgIGlmIChzZXJ2bGV0UGF0aCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHdyZXF1ZXN0LnNldFNlcnZsZXRQYXRoKHNlcnZsZXRQYXRoKTsKKyAgICAgICAgICAgIHdyZXF1ZXN0LnNldEF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LkRJU1BBVENIRVJfVFlQRV9BVFRSLAorICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuSU5DTFVERSkpOworICAgICAgICAgICAgd3JlcXVlc3Quc2V0QXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuRElTUEFUQ0hFUl9SRVFVRVNUX1BBVEhfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgc2VydmxldFBhdGgpOworICAgICAgICAgICAgaW52b2tlKHN0YXRlLm91dGVyUmVxdWVzdCwgc3RhdGUub3V0ZXJSZXNwb25zZSwgc3RhdGUpOworCisgICAgICAgICAgICB3cmVxdWVzdC5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBIYW5kbGUgYW4gSFRUUCBwYXRoIGJhc2VkIGluY2x1ZGUKKyAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIFBhdGggQmFzZWQgSW5jbHVkZSIpOworCisgICAgICAgICAgICBBcHBsaWNhdGlvbkh0dHBSZXF1ZXN0IHdyZXF1ZXN0ID0KKyAgICAgICAgICAgICAgICAoQXBwbGljYXRpb25IdHRwUmVxdWVzdCkgd3JhcFJlcXVlc3Qoc3RhdGUpOworICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRQYXRoID0gY29udGV4dC5nZXRQYXRoKCk7CisgICAgICAgICAgICBpZiAocmVxdWVzdFVSSSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHdyZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLklOQ0xVREVfUkVRVUVTVF9VUklfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVSSSk7CisgICAgICAgICAgICBpZiAoY29udGV4dFBhdGggIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB3cmVxdWVzdC5zZXRBdHRyaWJ1dGUoR2xvYmFscy5JTkNMVURFX0NPTlRFWFRfUEFUSF9BVFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0UGF0aCk7CisgICAgICAgICAgICBpZiAoc2VydmxldFBhdGggIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB3cmVxdWVzdC5zZXRBdHRyaWJ1dGUoR2xvYmFscy5JTkNMVURFX1NFUlZMRVRfUEFUSF9BVFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0UGF0aCk7CisgICAgICAgICAgICBpZiAocGF0aEluZm8gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB3cmVxdWVzdC5zZXRBdHRyaWJ1dGUoR2xvYmFscy5JTkNMVURFX1BBVEhfSU5GT19BVFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoSW5mbyk7CisgICAgICAgICAgICBpZiAocXVlcnlTdHJpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLklOQ0xVREVfUVVFUllfU1RSSU5HX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RyaW5nKTsKKyAgICAgICAgICAgICAgICB3cmVxdWVzdC5zZXRRdWVyeVBhcmFtcyhxdWVyeVN0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHdyZXF1ZXN0LnNldEF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LkRJU1BBVENIRVJfVFlQRV9BVFRSLAorICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuSU5DTFVERSkpOworICAgICAgICAgICAgd3JlcXVlc3Quc2V0QXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuRElTUEFUQ0hFUl9SRVFVRVNUX1BBVEhfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgc2VydmxldFBhdGgpOworICAgICAgICAgICAgaW52b2tlKHN0YXRlLm91dGVyUmVxdWVzdCwgc3RhdGUub3V0ZXJSZXNwb25zZSwgc3RhdGUpOworCisgICAgICAgICAgICB3cmVxdWVzdC5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFzayB0aGUgcmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBSZXF1ZXN0RGlzcGF0Y2hlciB0byBwcm9jZXNzCisgICAgICogdGhlIGFzc29jaWF0ZWQgcmVxdWVzdCwgYW5kIGNyZWF0ZSAob3IgYXBwZW5kIHRvKSB0aGUgYXNzb2NpYXRlZAorICAgICAqIHJlc3BvbnNlLgorICAgICAqIDxwPgorICAgICAqIDxzdHJvbmc+SU1QTEVNRU5UQVRJT04gTk9URTwvc3Ryb25nPjogVGhpcyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzCisgICAgICogdGhhdCBubyBmaWx0ZXJzIGFyZSBhcHBsaWVkIHRvIGEgZm9yd2FyZGVkIG9yIGluY2x1ZGVkIHJlc291cmNlLAorICAgICAqIGJlY2F1c2UgdGhleSB3ZXJlIGFscmVhZHkgZG9uZSBmb3IgdGhlIG9yaWdpbmFsIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW52b2tlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgIFN0YXRlIHN0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIENoZWNraW5nIHRvIHNlZSBpZiB0aGUgY29udGV4dCBjbGFzc2xvYWRlciBpcyB0aGUgY3VycmVudCBjb250ZXh0CisgICAgICAgIC8vIGNsYXNzbG9hZGVyLiBJZiBpdCdzIG5vdCwgd2UncmUgc2F2aW5nIGl0LCBhbmQgc2V0dGluZyB0aGUgY29udGV4dAorICAgICAgICAvLyBjbGFzc2xvYWRlciB0byB0aGUgQ29udGV4dCBjbGFzc2xvYWRlcgorICAgICAgICBDbGFzc0xvYWRlciBvbGRDQ0wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBDbGFzc0xvYWRlciBjb250ZXh0Q2xhc3NMb2FkZXIgPSBjb250ZXh0LmdldExvYWRlcigpLmdldENsYXNzTG9hZGVyKCk7CisKKyAgICAgICAgaWYgKG9sZENDTCAhPSBjb250ZXh0Q2xhc3NMb2FkZXIpIHsKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNvbnRleHRDbGFzc0xvYWRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvbGRDQ0wgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZXMgd2UgbWF5IG5lZWQKKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSBocmVzcG9uc2UgPSAoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzcG9uc2U7CisgICAgICAgIFNlcnZsZXQgc2VydmxldCA9IG51bGw7CisgICAgICAgIElPRXhjZXB0aW9uIGlvRXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgU2VydmxldEV4Y2VwdGlvbiBzZXJ2bGV0RXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgUnVudGltZUV4Y2VwdGlvbiBydW50aW1lRXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiB1bmF2YWlsYWJsZSA9IGZhbHNlOworCisgICAgICAgIC8vIENoZWNrIGZvciB0aGUgc2VydmxldCBiZWluZyBtYXJrZWQgdW5hdmFpbGFibGUKKyAgICAgICAgaWYgKHdyYXBwZXIuaXNVbmF2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICB3cmFwcGVyLmdldExvZ2dlcigpLndhcm4oCisgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygiYXBwbGljYXRpb25EaXNwYXRjaGVyLmlzVW5hdmFpbGFibGUiLCAKKyAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIGxvbmcgYXZhaWxhYmxlID0gd3JhcHBlci5nZXRBdmFpbGFibGUoKTsKKyAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlID4gMEwpICYmIChhdmFpbGFibGUgPCBMb25nLk1BWF9WQUxVRSkpCisgICAgICAgICAgICAgICAgaHJlc3BvbnNlLnNldERhdGVIZWFkZXIoIlJldHJ5LUFmdGVyIiwgYXZhaWxhYmxlKTsKKyAgICAgICAgICAgIGhyZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19TRVJWSUNFX1VOQVZBSUxBQkxFLCBzbQorICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkRpc3BhdGNoZXIuaXNVbmF2YWlsYWJsZSIsIHdyYXBwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB1bmF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBBbGxvY2F0ZSBhIHNlcnZsZXQgaW5zdGFuY2UgdG8gcHJvY2VzcyB0aGlzIHJlcXVlc3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghdW5hdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICBzZXJ2bGV0ID0gd3JhcHBlci5hbGxvY2F0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyYXBwZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkRpc3BhdGNoZXIuYWxsb2NhdGVFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIFN0YW5kYXJkV3JhcHBlci5nZXRSb290Q2F1c2UoZSkpOworICAgICAgICAgICAgc2VydmxldEV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICBzZXJ2bGV0ID0gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIHdyYXBwZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkRpc3BhdGNoZXIuYWxsb2NhdGVFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIGUpOworICAgICAgICAgICAgc2VydmxldEV4Y2VwdGlvbiA9IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiYXBwbGljYXRpb25EaXNwYXRjaGVyLmFsbG9jYXRlRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSwgZSk7CisgICAgICAgICAgICBzZXJ2bGV0ID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAvLyBHZXQgdGhlIEZpbHRlckNoYWluIEhlcmUKKyAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5IGZhY3RvcnkgPSBBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJDaGFpbiBmaWx0ZXJDaGFpbiA9IGZhY3RvcnkuY3JlYXRlRmlsdGVyQ2hhaW4ocmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLHNlcnZsZXQpOworICAgICAgICAvLyBDYWxsIHRoZSBzZXJ2aWNlKCkgbWV0aG9kIGZvciB0aGUgYWxsb2NhdGVkIHNlcnZsZXQgaW5zdGFuY2UKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBqc3BGaWxlID0gd3JhcHBlci5nZXRKc3BGaWxlKCk7CisgICAgICAgICAgICBpZiAoanNwRmlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUiwganNwRmlsZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5CRUZPUkVfRElTUEFUQ0hfRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIC8vIGZvciBpbmNsdWRlcy9mb3J3YXJkcworICAgICAgICAgICAgaWYgKChzZXJ2bGV0ICE9IG51bGwpICYmIChmaWx0ZXJDaGFpbiAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgZmlsdGVyQ2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFNlcnZsZXQgU2VydmljZSBNZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBGaWx0ZXJDaGFpbgorICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5BRlRFUl9ESVNQQVRDSF9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9IGNhdGNoIChDbGllbnRBYm9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShHbG9iYWxzLkpTUF9GSUxFX0FUVFIpOworICAgICAgICAgICAgc3VwcG9ydC5maXJlSW5zdGFuY2VFdmVudChJbnN0YW5jZUV2ZW50LkFGVEVSX0RJU1BBVENIX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0LCByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICBpb0V4Y2VwdGlvbiA9IGU7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUik7CisgICAgICAgICAgICBzdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfRElTUEFUQ0hfRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyYXBwZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkRpc3BhdGNoZXIuc2VydmljZUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSwgZSk7CisgICAgICAgICAgICBpb0V4Y2VwdGlvbiA9IGU7CisgICAgICAgIH0gY2F0Y2ggKFVuYXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUik7CisgICAgICAgICAgICBzdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfRElTUEFUQ0hfRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyYXBwZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkRpc3BhdGNoZXIuc2VydmljZUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSwgZSk7CisgICAgICAgICAgICBzZXJ2bGV0RXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIHdyYXBwZXIudW5hdmFpbGFibGUoZSk7CisgICAgICAgIH0gY2F0Y2ggKFNlcnZsZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5BRlRFUl9ESVNQQVRDSF9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgVGhyb3dhYmxlIHJvb3RDYXVzZSA9IFN0YW5kYXJkV3JhcHBlci5nZXRSb290Q2F1c2UoZSk7CisgICAgICAgICAgICBpZiAoIShyb290Q2F1c2UgaW5zdGFuY2VvZiBDbGllbnRBYm9ydEV4Y2VwdGlvbikpIHsKKyAgICAgICAgICAgICAgICB3cmFwcGVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygiYXBwbGljYXRpb25EaXNwYXRjaGVyLnNlcnZpY2VFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCByb290Q2F1c2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VydmxldEV4Y2VwdGlvbiA9IGU7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5BRlRFUl9ESVNQQVRDSF9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgd3JhcHBlci5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoImFwcGxpY2F0aW9uRGlzcGF0Y2hlci5zZXJ2aWNlRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCBlKTsKKyAgICAgICAgICAgIHJ1bnRpbWVFeGNlcHRpb24gPSBlOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVsZWFzZSB0aGUgZmlsdGVyIGNoYWluIChpZiBhbnkpIGZvciB0aGlzIHJlcXVlc3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJDaGFpbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZpbHRlckNoYWluLnJlbGVhc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5yZWxlYXNlRmlsdGVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSwgZSk7CisgICAgICAgICAgLy9GSVhNRSBFeGNlcHRpb24gaGFuZGxpbmcgbmVlZHMgdG8gYmUgc2ltcGlsZXIgdG8gd2hhdCBpcyBpbiB0aGUgU3RhbmRhcmRXcmFwcGVyVmFsdWUKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlYWxsb2NhdGUgdGhlIGFsbG9jYXRlZCBzZXJ2bGV0IGluc3RhbmNlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc2VydmxldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JhcHBlci5kZWFsbG9jYXRlKHNlcnZsZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyYXBwZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkRpc3BhdGNoZXIuZGVhbGxvY2F0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSwgZSk7CisgICAgICAgICAgICBzZXJ2bGV0RXhjZXB0aW9uID0gZTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIHdyYXBwZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkRpc3BhdGNoZXIuZGVhbGxvY2F0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSwgZSk7CisgICAgICAgICAgICBzZXJ2bGV0RXhjZXB0aW9uID0gbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkRpc3BhdGNoZXIuZGVhbGxvY2F0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzZXQgdGhlIG9sZCBjb250ZXh0IGNsYXNzIGxvYWRlcgorICAgICAgICBpZiAob2xkQ0NMICE9IG51bGwpCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihvbGRDQ0wpOworICAgICAgICAKKyAgICAgICAgLy8gVW53cmFwIHJlcXVlc3QvcmVzcG9uc2UgaWYgbmVlZGVkCisgICAgICAgIC8vIFNlZSBCdWd6aWxsYSAzMDk0OQorICAgICAgICB1bndyYXBSZXF1ZXN0KHN0YXRlKTsKKyAgICAgICAgdW53cmFwUmVzcG9uc2Uoc3RhdGUpOworCisgICAgICAgIC8vIFJldGhyb3cgYW4gZXhjZXB0aW9uIGlmIG9uZSB3YXMgdGhyb3duIGJ5IHRoZSBpbnZva2VkIHNlcnZsZXQKKyAgICAgICAgaWYgKGlvRXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBpb0V4Y2VwdGlvbjsKKyAgICAgICAgaWYgKHNlcnZsZXRFeGNlcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IHNlcnZsZXRFeGNlcHRpb247CisgICAgICAgIGlmIChydW50aW1lRXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBydW50aW1lRXhjZXB0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbndyYXAgdGhlIHJlcXVlc3QgaWYgd2UgaGF2ZSB3cmFwcGVkIGl0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1bndyYXBSZXF1ZXN0KFN0YXRlIHN0YXRlKSB7CisKKyAgICAgICAgaWYgKHN0YXRlLndyYXBSZXF1ZXN0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU2VydmxldFJlcXVlc3QgcHJldmlvdXMgPSBudWxsOworICAgICAgICBTZXJ2bGV0UmVxdWVzdCBjdXJyZW50ID0gc3RhdGUub3V0ZXJSZXF1ZXN0OworICAgICAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIElmIHdlIHJ1biBpbnRvIHRoZSBjb250YWluZXIgcmVxdWVzdCB3ZSBhcmUgZG9uZQorICAgICAgICAgICAgaWYgKChjdXJyZW50IGluc3RhbmNlb2YgUmVxdWVzdCkKKyAgICAgICAgICAgICAgICB8fCAoY3VycmVudCBpbnN0YW5jZW9mIFJlcXVlc3RGYWNhZGUpKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGN1cnJlbnQgcmVxdWVzdCBpZiBpdCBpcyBvdXIgd3JhcHBlcgorICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gc3RhdGUud3JhcFJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICBTZXJ2bGV0UmVxdWVzdCBuZXh0ID0KKyAgICAgICAgICAgICAgICAgICgoU2VydmxldFJlcXVlc3RXcmFwcGVyKSBjdXJyZW50KS5nZXRSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLm91dGVyUmVxdWVzdCA9IG5leHQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAoKFNlcnZsZXRSZXF1ZXN0V3JhcHBlcikgcHJldmlvdXMpLnNldFJlcXVlc3QobmV4dCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgcmVxdWVzdCBpbiB0aGUgY2hhaW4KKyAgICAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKKyAgICAgICAgICAgIGN1cnJlbnQgPSAoKFNlcnZsZXRSZXF1ZXN0V3JhcHBlcikgY3VycmVudCkuZ2V0UmVxdWVzdCgpOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVW53cmFwIHRoZSByZXNwb25zZSBpZiB3ZSBoYXZlIHdyYXBwZWQgaXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVud3JhcFJlc3BvbnNlKFN0YXRlIHN0YXRlKSB7CisKKyAgICAgICAgaWYgKHN0YXRlLndyYXBSZXNwb25zZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFNlcnZsZXRSZXNwb25zZSBwcmV2aW91cyA9IG51bGw7CisgICAgICAgIFNlcnZsZXRSZXNwb25zZSBjdXJyZW50ID0gc3RhdGUub3V0ZXJSZXNwb25zZTsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgeworCisgICAgICAgICAgICAvLyBJZiB3ZSBydW4gaW50byB0aGUgY29udGFpbmVyIHJlc3BvbnNlIHdlIGFyZSBkb25lCisgICAgICAgICAgICBpZiAoKGN1cnJlbnQgaW5zdGFuY2VvZiBSZXNwb25zZSkKKyAgICAgICAgICAgICAgICB8fCAoY3VycmVudCBpbnN0YW5jZW9mIFJlc3BvbnNlRmFjYWRlKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBjdXJyZW50IHJlc3BvbnNlIGlmIGl0IGlzIG91ciB3cmFwcGVyCisgICAgICAgICAgICBpZiAoY3VycmVudCA9PSBzdGF0ZS53cmFwUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBTZXJ2bGV0UmVzcG9uc2UgbmV4dCA9CisgICAgICAgICAgICAgICAgICAoKFNlcnZsZXRSZXNwb25zZVdyYXBwZXIpIGN1cnJlbnQpLmdldFJlc3BvbnNlKCk7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLm91dGVyUmVzcG9uc2UgPSBuZXh0OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKChTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKSBwcmV2aW91cykuc2V0UmVzcG9uc2UobmV4dCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgcmVzcG9uc2UgaW4gdGhlIGNoYWluCisgICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7CisgICAgICAgICAgICBjdXJyZW50ID0gKChTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKSBjdXJyZW50KS5nZXRSZXNwb25zZSgpOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSByZXF1ZXN0IHdyYXBwZXIgdGhhdCBoYXMgYmVlbiBpbnNlcnRlZCBpbiB0aGUKKyAgICAgKiBhcHByb3ByaWF0ZSBzcG90IGluIHRoZSByZXF1ZXN0IGNoYWluLgorICAgICAqLworICAgIHByaXZhdGUgU2VydmxldFJlcXVlc3Qgd3JhcFJlcXVlc3QoU3RhdGUgc3RhdGUpIHsKKworICAgICAgICAvLyBMb2NhdGUgdGhlIHJlcXVlc3Qgd2Ugc2hvdWxkIGluc2VydCBpbiBmcm9udCBvZgorICAgICAgICBTZXJ2bGV0UmVxdWVzdCBwcmV2aW91cyA9IG51bGw7CisgICAgICAgIFNlcnZsZXRSZXF1ZXN0IGN1cnJlbnQgPSBzdGF0ZS5vdXRlclJlcXVlc3Q7CisgICAgICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICgib3JnLmFwYWNoZS5jYXRhbGluYS5zZXJ2bGV0cy5JbnZva2VySHR0cFJlcXVlc3QiLgorICAgICAgICAgICAgICAgIGVxdWFscyhjdXJyZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICBicmVhazsgLy8gS0xVREdFIC0gTWFrZSBuZXN0ZWQgUkQuZm9yd2FyZCgpIHVzaW5nIGludm9rZXIgd29yaworICAgICAgICAgICAgaWYgKCEoY3VycmVudCBpbnN0YW5jZW9mIFNlcnZsZXRSZXF1ZXN0V3JhcHBlcikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uSHR0cFJlcXVlc3QpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUmVxdWVzdCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChjdXJyZW50IGluc3RhbmNlb2YgUmVxdWVzdCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKKyAgICAgICAgICAgIGN1cnJlbnQgPSAoKFNlcnZsZXRSZXF1ZXN0V3JhcHBlcikgY3VycmVudCkuZ2V0UmVxdWVzdCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5zdGFudGlhdGUgYSBuZXcgd3JhcHBlciBhdCB0aGlzIHBvaW50IGFuZCBpbnNlcnQgaXQgaW4gdGhlIGNoYWluCisgICAgICAgIFNlcnZsZXRSZXF1ZXN0IHdyYXBwZXIgPSBudWxsOworICAgICAgICBpZiAoKGN1cnJlbnQgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkh0dHBSZXF1ZXN0KSB8fAorICAgICAgICAgICAgKGN1cnJlbnQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB8fAorICAgICAgICAgICAgKGN1cnJlbnQgaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlcXVlc3QpKSB7CisgICAgICAgICAgICAvLyBDb21wdXRlIGEgY3Jvc3NDb250ZXh0IGZsYWcKKyAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCBoY3VycmVudCA9IChIdHRwU2VydmxldFJlcXVlc3QpIGN1cnJlbnQ7CisgICAgICAgICAgICBib29sZWFuIGNyb3NzQ29udGV4dCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKChzdGF0ZS5vdXRlclJlcXVlc3QgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkh0dHBSZXF1ZXN0KSB8fAorICAgICAgICAgICAgICAgIChzdGF0ZS5vdXRlclJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0KSB8fAorICAgICAgICAgICAgICAgIChzdGF0ZS5vdXRlclJlcXVlc3QgaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlcXVlc3QpKSB7CisgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IGhvdXRlclJlcXVlc3QgPSAKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVxdWVzdCkgc3RhdGUub3V0ZXJSZXF1ZXN0OworICAgICAgICAgICAgICAgIE9iamVjdCBjb250ZXh0UGF0aCA9IGhvdXRlclJlcXVlc3QuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgIChHbG9iYWxzLklOQ0xVREVfQ09OVEVYVF9QQVRIX0FUVFIpOworICAgICAgICAgICAgICAgIGlmIChjb250ZXh0UGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZvcndhcmQKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFBhdGggPSBob3V0ZXJSZXF1ZXN0LmdldENvbnRleHRQYXRoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNyb3NzQ29udGV4dCA9ICEoY29udGV4dC5nZXRQYXRoKCkuZXF1YWxzKGNvbnRleHRQYXRoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cmFwcGVyID0gbmV3IEFwcGxpY2F0aW9uSHR0cFJlcXVlc3QKKyAgICAgICAgICAgICAgICAoaGN1cnJlbnQsIGNvbnRleHQsIGNyb3NzQ29udGV4dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cmFwcGVyID0gbmV3IEFwcGxpY2F0aW9uUmVxdWVzdChjdXJyZW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJldmlvdXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHN0YXRlLm91dGVyUmVxdWVzdCA9IHdyYXBwZXI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICgoU2VydmxldFJlcXVlc3RXcmFwcGVyKSBwcmV2aW91cykuc2V0UmVxdWVzdCh3cmFwcGVyKTsKKyAgICAgICAgc3RhdGUud3JhcFJlcXVlc3QgPSB3cmFwcGVyOworICAgICAgICByZXR1cm4gKHdyYXBwZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIHJlc3BvbnNlIHdyYXBwZXIgdGhhdCBoYXMgYmVlbiBpbnNlcnRlZCBpbiB0aGUKKyAgICAgKiBhcHByb3ByaWF0ZSBzcG90IGluIHRoZSByZXNwb25zZSBjaGFpbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZsZXRSZXNwb25zZSB3cmFwUmVzcG9uc2UoU3RhdGUgc3RhdGUpIHsKKworICAgICAgICAvLyBMb2NhdGUgdGhlIHJlc3BvbnNlIHdlIHNob3VsZCBpbnNlcnQgaW4gZnJvbnQgb2YKKyAgICAgICAgU2VydmxldFJlc3BvbnNlIHByZXZpb3VzID0gbnVsbDsKKyAgICAgICAgU2VydmxldFJlc3BvbnNlIGN1cnJlbnQgPSBzdGF0ZS5vdXRlclJlc3BvbnNlOworICAgICAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIShjdXJyZW50IGluc3RhbmNlb2YgU2VydmxldFJlc3BvbnNlV3JhcHBlcikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uSHR0cFJlc3BvbnNlKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblJlc3BvbnNlKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBSZXNwb25zZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKKyAgICAgICAgICAgIGN1cnJlbnQgPSAoKFNlcnZsZXRSZXNwb25zZVdyYXBwZXIpIGN1cnJlbnQpLmdldFJlc3BvbnNlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnN0YW50aWF0ZSBhIG5ldyB3cmFwcGVyIGF0IHRoaXMgcG9pbnQgYW5kIGluc2VydCBpdCBpbiB0aGUgY2hhaW4KKyAgICAgICAgU2VydmxldFJlc3BvbnNlIHdyYXBwZXIgPSBudWxsOworICAgICAgICBpZiAoKGN1cnJlbnQgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkh0dHBSZXNwb25zZSkgfHwKKyAgICAgICAgICAgIChjdXJyZW50IGluc3RhbmNlb2YgUmVzcG9uc2UpIHx8CisgICAgICAgICAgICAoY3VycmVudCBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVzcG9uc2UpKQorICAgICAgICAgICAgd3JhcHBlciA9CisgICAgICAgICAgICAgICAgbmV3IEFwcGxpY2F0aW9uSHR0cFJlc3BvbnNlKChIdHRwU2VydmxldFJlc3BvbnNlKSBjdXJyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaW5jbHVkaW5nKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd3JhcHBlciA9IG5ldyBBcHBsaWNhdGlvblJlc3BvbnNlKGN1cnJlbnQsIHN0YXRlLmluY2x1ZGluZyk7CisgICAgICAgIGlmIChwcmV2aW91cyA9PSBudWxsKQorICAgICAgICAgICAgc3RhdGUub3V0ZXJSZXNwb25zZSA9IHdyYXBwZXI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICgoU2VydmxldFJlc3BvbnNlV3JhcHBlcikgcHJldmlvdXMpLnNldFJlc3BvbnNlKHdyYXBwZXIpOworICAgICAgICBzdGF0ZS53cmFwUmVzcG9uc2UgPSB3cmFwcGVyOworICAgICAgICByZXR1cm4gKHdyYXBwZXIpOworCisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tTYW1lT2JqZWN0cyhTZXJ2bGV0UmVxdWVzdCBhcHBSZXF1ZXN0LAorICAgICAgICAgICAgU2VydmxldFJlc3BvbnNlIGFwcFJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIFNlcnZsZXRSZXF1ZXN0IG9yaWdpbmFsUmVxdWVzdCA9CisgICAgICAgICAgICBBcHBsaWNhdGlvbkZpbHRlckNoYWluLmdldExhc3RTZXJ2aWNlZFJlcXVlc3QoKTsKKyAgICAgICAgU2VydmxldFJlc3BvbnNlIG9yaWdpbmFsUmVzcG9uc2UgPQorICAgICAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJDaGFpbi5nZXRMYXN0U2VydmljZWRSZXNwb25zZSgpOworICAgICAgICAKKyAgICAgICAgLy8gU29tZSBmb3J3YXJkcywgZWcgZnJvbSB2YWx2ZXMgd2lsbCBub3Qgc2V0IG9yaWdpbmFsIHZhbHVlcyAKKyAgICAgICAgaWYgKG9yaWdpbmFsUmVxdWVzdCA9PSBudWxsIHx8IG9yaWdpbmFsUmVzcG9uc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBib29sZWFuIHNhbWUgPSBmYWxzZTsKKyAgICAgICAgU2VydmxldFJlcXVlc3QgZGlzcGF0Y2hlZFJlcXVlc3QgPSBhcHBSZXF1ZXN0OworICAgICAgICAKKyAgICAgICAgLy9maW5kIHRoZSByZXF1ZXN0IHRoYXQgd2FzIHBhc3NlZCBpbnRvIHRoZSBzZXJ2aWNlIG1ldGhvZAorICAgICAgICB3aGlsZSAob3JpZ2luYWxSZXF1ZXN0IGluc3RhbmNlb2YgU2VydmxldFJlcXVlc3RXcmFwcGVyICYmCisgICAgICAgICAgICAgICAgKChTZXJ2bGV0UmVxdWVzdFdyYXBwZXIpIG9yaWdpbmFsUmVxdWVzdCkuZ2V0UmVxdWVzdCgpIT1udWxsKSB7CisgICAgICAgICAgICBvcmlnaW5hbFJlcXVlc3QgPQorICAgICAgICAgICAgICAgICgoU2VydmxldFJlcXVlc3RXcmFwcGVyKSBvcmlnaW5hbFJlcXVlc3QpLmdldFJlcXVlc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vY29tcGFyZSB3aXRoIHRoZSBkaXNwYXRjaGVkIHJlcXVlc3QKKyAgICAgICAgd2hpbGUgKCFzYW1lKSB7CisgICAgICAgICAgICBpZiAob3JpZ2luYWxSZXF1ZXN0LmVxdWFscyhkaXNwYXRjaGVkUmVxdWVzdCkpIHsKKyAgICAgICAgICAgICAgICBzYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc2FtZSAmJiBkaXNwYXRjaGVkUmVxdWVzdCBpbnN0YW5jZW9mIFNlcnZsZXRSZXF1ZXN0V3JhcHBlcikgeworICAgICAgICAgICAgICAgIGRpc3BhdGNoZWRSZXF1ZXN0ID0KKyAgICAgICAgICAgICAgICAgICAgKChTZXJ2bGV0UmVxdWVzdFdyYXBwZXIpIGRpc3BhdGNoZWRSZXF1ZXN0KS5nZXRSZXF1ZXN0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghc2FtZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb25EaXNwYXRjaGVyLnNwZWNWaW9sYXRpb24ucmVxdWVzdCIpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc2FtZSA9IGZhbHNlOworICAgICAgICBTZXJ2bGV0UmVzcG9uc2UgZGlzcGF0Y2hlZFJlc3BvbnNlID0gYXBwUmVzcG9uc2U7CisgICAgICAgIAorICAgICAgICAvL2ZpbmQgdGhlIHJlc3BvbnNlIHRoYXQgd2FzIHBhc3NlZCBpbnRvIHRoZSBzZXJ2aWNlIG1ldGhvZAorICAgICAgICB3aGlsZSAob3JpZ2luYWxSZXNwb25zZSBpbnN0YW5jZW9mIFNlcnZsZXRSZXNwb25zZVdyYXBwZXIgJiYKKyAgICAgICAgICAgICAgICAoKFNlcnZsZXRSZXNwb25zZVdyYXBwZXIpIG9yaWdpbmFsUmVzcG9uc2UpLmdldFJlc3BvbnNlKCkgIT0KKyAgICAgICAgICAgICAgICAgICAgbnVsbCkgeworICAgICAgICAgICAgb3JpZ2luYWxSZXNwb25zZSA9CisgICAgICAgICAgICAgICAgKChTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKSBvcmlnaW5hbFJlc3BvbnNlKS5nZXRSZXNwb25zZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy9jb21wYXJlIHdpdGggdGhlIGRpc3BhdGNoZWQgcmVzcG9uc2UKKyAgICAgICAgd2hpbGUgKCFzYW1lKSB7CisgICAgICAgICAgICBpZiAob3JpZ2luYWxSZXNwb25zZS5lcXVhbHMoZGlzcGF0Y2hlZFJlc3BvbnNlKSkgeworICAgICAgICAgICAgICAgIHNhbWUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIXNhbWUgJiYgZGlzcGF0Y2hlZFJlc3BvbnNlIGluc3RhbmNlb2YgU2VydmxldFJlc3BvbnNlV3JhcHBlcikgeworICAgICAgICAgICAgICAgIGRpc3BhdGNoZWRSZXNwb25zZSA9CisgICAgICAgICAgICAgICAgICAgICgoU2VydmxldFJlc3BvbnNlV3JhcHBlcikgZGlzcGF0Y2hlZFJlc3BvbnNlKS5nZXRSZXNwb25zZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghc2FtZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb25EaXNwYXRjaGVyLnNwZWNWaW9sYXRpb24ucmVzcG9uc2UiKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkZpbHRlckNoYWluLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkZpbHRlckNoYWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3MzVhNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uRmlsdGVyQ2hhaW4uamF2YQpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmU7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkluc3RhbmNlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zZWN1cml0eS5TZWN1cml0eVV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkluc3RhbmNlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5qYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluPC9jb2RlPiB1c2VkIHRvIG1hbmFnZQorICogdGhlIGV4ZWN1dGlvbiBvZiBhIHNldCBvZiBmaWx0ZXJzIGZvciBhIHBhcnRpY3VsYXIgcmVxdWVzdC4gIFdoZW4gdGhlCisgKiBzZXQgb2YgZGVmaW5lZCBmaWx0ZXJzIGhhcyBhbGwgYmVlbiBleGVjdXRlZCwgdGhlIG5leHQgY2FsbCB0bworICogPGNvZGU+ZG9GaWx0ZXIoKTwvY29kZT4gd2lsbCBleGVjdXRlIHRoZSBzZXJ2bGV0J3MgPGNvZGU+c2VydmljZSgpPC9jb2RlPgorICogbWV0aG9kIGl0c2VsZi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworZmluYWwgY2xhc3MgQXBwbGljYXRpb25GaWx0ZXJDaGFpbiBpbXBsZW1lbnRzIEZpbHRlckNoYWluIHsKKworICAgIC8vIFVzZWQgdG8gZW5mb3JjZSByZXF1aXJlbWVudHMgb2YgU1JWLjguMiAvIFNSVi4xNC4yLjUuMQorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFRocmVhZExvY2FsIGxhc3RTZXJ2aWNlZFJlcXVlc3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVGhyZWFkTG9jYWwgbGFzdFNlcnZpY2VkUmVzcG9uc2U7CisKKyAgICBzdGF0aWMgeworICAgICAgICBpZiAoR2xvYmFscy5TVFJJQ1RfU0VSVkxFVF9DT01QTElBTkNFKSB7CisgICAgICAgICAgICBsYXN0U2VydmljZWRSZXF1ZXN0ID0gbmV3IFRocmVhZExvY2FsKCk7CisgICAgICAgICAgICBsYXN0U2VydmljZWRSZXNwb25zZSA9IG5ldyBUaHJlYWRMb2NhbCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGFzdFNlcnZpY2VkUmVxdWVzdCA9IG51bGw7CisgICAgICAgICAgICBsYXN0U2VydmljZWRSZXNwb25zZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ1JFTUVOVCA9IDEwOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGNoYWluIGluc3RhbmNlIHdpdGggbm8gZGVmaW5lZCBmaWx0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvbkZpbHRlckNoYWluKCkgeworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXJzLgorICAgICAqLworICAgIHByaXZhdGUgQXBwbGljYXRpb25GaWx0ZXJDb25maWdbXSBmaWx0ZXJzID0gCisgICAgICAgIG5ldyBBcHBsaWNhdGlvbkZpbHRlckNvbmZpZ1swXTsKKworCisgICAgLyoqCisgICAgICogVGhlIGludCB3aGljaCBpcyB1c2VkIHRvIG1haW50YWluIHRoZSBjdXJyZW50IHBvc2l0aW9uIAorICAgICAqIGluIHRoZSBmaWx0ZXIgY2hhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKKworCisgICAgLyoqCisgICAgICogVGhlIGludCB3aGljaCBnaXZlcyB0aGUgY3VycmVudCBudW1iZXIgb2YgZmlsdGVycyBpbiB0aGUgY2hhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbiA9IDA7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2bGV0IGluc3RhbmNlIHRvIGJlIGV4ZWN1dGVkIGJ5IHRoaXMgY2hhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBTZXJ2bGV0IHNlcnZsZXQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIG91ciBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogVGhlIEluc3RhbmNlU3VwcG9ydCBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggb3VyIFdyYXBwZXIgKHVzZWQgdG8KKyAgICAgKiBzZW5kICJiZWZvcmUgZmlsdGVyIiBhbmQgImFmdGVyIGZpbHRlciIgZXZlbnRzLgorICAgICAqLworICAgIHByaXZhdGUgSW5zdGFuY2VTdXBwb3J0IHN1cHBvcnQgPSBudWxsOworCisgICAgCisgICAgLyoqCisgICAgICogU3RhdGljIGNsYXNzIGFycmF5IHVzZWQgd2hlbiB0aGUgU2VjdXJpdHlNYW5hZ2VyIGlzIHR1cm5lZCBvbiBhbmQgCisgICAgICogPGNvZGU+ZG9GaWx0ZXI8L2NvZGUgaXMgaW52b2tlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzc1tdIGNsYXNzVHlwZSA9IG5ldyBDbGFzc1tde1NlcnZsZXRSZXF1ZXN0LmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXNwb25zZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlckNoYWluLmNsYXNzfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIC8qKgorICAgICAqIFN0YXRpYyBjbGFzcyBhcnJheSB1c2VkIHdoZW4gdGhlIFNlY3VyaXR5TWFuYWdlciBpcyB0dXJuZWQgb24gYW5kIAorICAgICAqIDxjb2RlPnNlcnZpY2U8L2NvZGUgaXMgaW52b2tlZC4KKyAgICAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSBjbGFzc1R5cGVVc2VkSW5TZXJ2aWNlID0gbmV3IENsYXNzW117CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0UmVxdWVzdC5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXNwb25zZS5jbGFzc307CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpbHRlckNoYWluIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSBuZXh0IGZpbHRlciBpbiB0aGlzIGNoYWluLCBwYXNzaW5nIHRoZSBzcGVjaWZpZWQgcmVxdWVzdAorICAgICAqIGFuZCByZXNwb25zZS4gIElmIHRoZXJlIGFyZSBubyBtb3JlIGZpbHRlcnMgaW4gdGhpcyBjaGFpbiwgaW52b2tlCisgICAgICogdGhlIDxjb2RlPnNlcnZpY2UoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBzZXJ2bGV0IGl0c2VsZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYoIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsICkgeworICAgICAgICAgICAgZmluYWwgU2VydmxldFJlcXVlc3QgcmVxID0gcmVxdWVzdDsKKyAgICAgICAgICAgIGZpbmFsIFNlcnZsZXRSZXNwb25zZSByZXMgPSByZXNwb25zZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbERvRmlsdGVyKHJlcSxyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0gY2F0Y2goIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGUpIHsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHBlLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU2VydmxldEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFNlcnZsZXRFeGNlcHRpb24pIGU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIGU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50ZXJuYWxEb0ZpbHRlcihyZXF1ZXN0LHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbnRlcm5hbERvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDYWxsIHRoZSBuZXh0IGZpbHRlciBpZiB0aGVyZSBpcyBvbmUKKyAgICAgICAgaWYgKHBvcyA8IG4pIHsKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZyA9IGZpbHRlcnNbcG9zKytdOworICAgICAgICAgICAgRmlsdGVyIGZpbHRlciA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbHRlciA9IGZpbHRlckNvbmZpZy5nZXRGaWx0ZXIoKTsKKyAgICAgICAgICAgICAgICBzdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQkVGT1JFX0ZJTFRFUl9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmKCBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VydmxldFJlcXVlc3QgcmVxID0gcmVxdWVzdDsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VydmxldFJlc3BvbnNlIHJlcyA9IHJlc3BvbnNlOworCisgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W117cmVxLCByZXMsIHRoaXN9OworICAgICAgICAgICAgICAgICAgICBTZWN1cml0eVV0aWwuZG9Bc1ByaXZpbGVnZQorICAgICAgICAgICAgICAgICAgICAgICAgKCJkb0ZpbHRlciIsIGZpbHRlciwgY2xhc3NUeXBlLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlLCB0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfRklMVEVSX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfRklMVEVSX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgcmVxdWVzdCwgcmVzcG9uc2UsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5BRlRFUl9GSUxURVJfRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCByZXF1ZXN0LCByZXNwb25zZSwgZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5maXJlSW5zdGFuY2VFdmVudChJbnN0YW5jZUV2ZW50LkFGVEVSX0ZJTFRFUl9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIHJlcXVlc3QsIHJlc3BvbnNlLCBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5BRlRFUl9GSUxURVJfRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCByZXF1ZXN0LCByZXNwb25zZSwgZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImZpbHRlckNoYWluLmZpbHRlciIpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIGZlbGwgb2ZmIHRoZSBlbmQgb2YgdGhlIGNoYWluIC0tIGNhbGwgdGhlIHNlcnZsZXQgaW5zdGFuY2UKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChHbG9iYWxzLlNUUklDVF9TRVJWTEVUX0NPTVBMSUFOQ0UpIHsKKyAgICAgICAgICAgICAgICBsYXN0U2VydmljZWRSZXF1ZXN0LnNldChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICBsYXN0U2VydmljZWRSZXNwb25zZS5zZXQocmVzcG9uc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwcG9ydC5maXJlSW5zdGFuY2VFdmVudChJbnN0YW5jZUV2ZW50LkJFRk9SRV9TRVJWSUNFX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0LCByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICBpZiAoKHJlcXVlc3QgaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlcXVlc3QpICYmCisgICAgICAgICAgICAgICAgKHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXNwb25zZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYoIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXJ2bGV0UmVxdWVzdCByZXEgPSByZXF1ZXN0OworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXJ2bGV0UmVzcG9uc2UgcmVzID0gcmVzcG9uc2U7CisgICAgICAgICAgICAgICAgICAgIFByaW5jaXBhbCBwcmluY2lwYWwgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICgoSHR0cFNlcnZsZXRSZXF1ZXN0KSByZXEpLmdldFVzZXJQcmluY2lwYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXXtyZXEsIHJlc307CisgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5VXRpbC5kb0FzUHJpdmlsZWdlKCJzZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NUeXBlVXNlZEluU2VydmljZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW5jaXBhbCk7ICAgCisgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAKKyAgICAgICAgICAgICAgICAgICAgc2VydmxldC5zZXJ2aWNlKChIdHRwU2VydmxldFJlcXVlc3QpIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VydmxldC5zZXJ2aWNlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5BRlRFUl9TRVJWSUNFX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0LCByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5BRlRFUl9TRVJWSUNFX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0LCByZXF1ZXN0LCByZXNwb25zZSwgZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5BRlRFUl9TRVJWSUNFX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0LCByZXF1ZXN0LCByZXNwb25zZSwgZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5BRlRFUl9TRVJWSUNFX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0LCByZXF1ZXN0LCByZXNwb25zZSwgZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgc3VwcG9ydC5maXJlSW5zdGFuY2VFdmVudChJbnN0YW5jZUV2ZW50LkFGVEVSX1NFUlZJQ0VfRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQsIHJlcXVlc3QsIHJlc3BvbnNlLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImZpbHRlckNoYWluLnNlcnZsZXQiKSwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoR2xvYmFscy5TVFJJQ1RfU0VSVkxFVF9DT01QTElBTkNFKSB7CisgICAgICAgICAgICAgICAgbGFzdFNlcnZpY2VkUmVxdWVzdC5zZXQobnVsbCk7CisgICAgICAgICAgICAgICAgbGFzdFNlcnZpY2VkUmVzcG9uc2Uuc2V0KG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGZpbHRlciB0byB0aGUgc2V0IG9mIGZpbHRlcnMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoaXMgY2hhaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyQ29uZmlnIFRoZSBGaWx0ZXJDb25maWcgZm9yIHRoZSBzZXJ2bGV0IHRvIGJlIGV4ZWN1dGVkCisgICAgICovCisgICAgdm9pZCBhZGRGaWx0ZXIoQXBwbGljYXRpb25GaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB7CisKKyAgICAgICAgaWYgKG4gPT0gZmlsdGVycy5sZW5ndGgpIHsKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRmlsdGVyQ29uZmlnW10gbmV3RmlsdGVycyA9CisgICAgICAgICAgICAgICAgbmV3IEFwcGxpY2F0aW9uRmlsdGVyQ29uZmlnW24gKyBJTkNSRU1FTlRdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShmaWx0ZXJzLCAwLCBuZXdGaWx0ZXJzLCAwLCBuKTsKKyAgICAgICAgICAgIGZpbHRlcnMgPSBuZXdGaWx0ZXJzOworICAgICAgICB9CisgICAgICAgIGZpbHRlcnNbbisrXSA9IGZpbHRlckNvbmZpZzsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSBmaWx0ZXJzIGFuZCB3cmFwcGVyIGV4ZWN1dGVkIGJ5IHRoaXMgY2hhaW4uCisgICAgICovCisgICAgdm9pZCByZWxlYXNlKCkgeworCisgICAgICAgIG4gPSAwOworICAgICAgICBwb3MgPSAwOworICAgICAgICBzZXJ2bGV0ID0gbnVsbDsKKyAgICAgICAgc3VwcG9ydCA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2VydmxldCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGNoYWluLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZsZXQgVGhlIFdyYXBwZXIgZm9yIHRoZSBzZXJ2bGV0IHRvIGJlIGV4ZWN1dGVkCisgICAgICovCisgICAgdm9pZCBzZXRTZXJ2bGV0KFNlcnZsZXQgc2VydmxldCkgeworCisgICAgICAgIHRoaXMuc2VydmxldCA9IHNlcnZsZXQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgSW5zdGFuY2VTdXBwb3J0IG9iamVjdCB1c2VkIGZvciBldmVudCBub3RpZmljYXRpb25zCisgICAgICogZm9yIHRoaXMgZmlsdGVyIGNoYWluLgorICAgICAqCisgICAgICogQHBhcmFtIHN1cHBvcnQgVGhlIEluc3RhbmNlU3VwcG9ydCBvYmplY3QgZm9yIG91ciBXcmFwcGVyCisgICAgICovCisgICAgdm9pZCBzZXRTdXBwb3J0KEluc3RhbmNlU3VwcG9ydCBzdXBwb3J0KSB7CisKKyAgICAgICAgdGhpcy5zdXBwb3J0ID0gc3VwcG9ydDsKKworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBsYXN0IHJlcXVlc3QgcGFzc2VkIHRvIGEgc2VydmxldCBmb3Igc2VydmljaW5nIGZyb20gdGhlIGN1cnJlbnQKKyAgICAgKiB0aHJlYWQuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgbGFzdCByZXF1ZXN0IHRvIGJlIHNlcnZpY2VkLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZsZXRSZXF1ZXN0IGdldExhc3RTZXJ2aWNlZFJlcXVlc3QoKSB7CisgICAgICAgIHJldHVybiAoU2VydmxldFJlcXVlc3QpIGxhc3RTZXJ2aWNlZFJlcXVlc3QuZ2V0KCk7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogVGhlIGxhc3QgcmVzcG9uc2UgcGFzc2VkIHRvIGEgc2VydmxldCBmb3Igc2VydmljaW5nIGZyb20gdGhlIGN1cnJlbnQKKyAgICAgKiB0aHJlYWQuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgbGFzdCByZXNwb25zZSB0byBiZSBzZXJ2aWNlZC4gCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXJ2bGV0UmVzcG9uc2UgZ2V0TGFzdFNlcnZpY2VkUmVzcG9uc2UoKSB7CisgICAgICAgIHJldHVybiAoU2VydmxldFJlc3BvbnNlKSBsYXN0U2VydmljZWRSZXNwb25zZS5nZXQoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uRmlsdGVyQ29uZmlnLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkZpbHRlckNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZTY0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkZpbHRlckNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkZpbHRlckRlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlY3VyaXR5LlNlY3VyaXR5VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuRW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmxvZy5TeXN0ZW1Mb2dIYW5kbGVyOworCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgYSA8Y29kZT5qYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzwvY29kZT4gdXNlZnVsIGluCisgKiBtYW5hZ2luZyB0aGUgZmlsdGVyIGluc3RhbmNlcyBpbnN0YW50aWF0ZWQgd2hlbiBhIHdlYiBhcHBsaWNhdGlvbgorICogaXMgZmlyc3Qgc3RhcnRlZC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworZmluYWwgY2xhc3MgQXBwbGljYXRpb25GaWx0ZXJDb25maWcgaW1wbGVtZW50cyBGaWx0ZXJDb25maWcsIFNlcmlhbGl6YWJsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgQXBwbGljYXRpb25GaWx0ZXJDb25maWcgZm9yIHRoZSBzcGVjaWZpZWQgZmlsdGVyCisgICAgICogZGVmaW5pdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQKKyAgICAgKiBAcGFyYW0gZmlsdGVyRGVmIEZpbHRlciBkZWZpbml0aW9uIGZvciB3aGljaCBhIEZpbHRlckNvbmZpZyBpcyB0byBiZQorICAgICAqICBjb25zdHJ1Y3RlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQKKyAgICAgKiAgdGhlIDxjb2RlPmphdmF4LnNlcnZsZXQuRmlsdGVyPC9jb2RlPiBpbnRlcmZhY2UKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGZpbHRlciBjbGFzcyBjYW5ub3QgYmUgZm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWYgdGhlIGZpbHRlciBjbGFzcyBjYW5ub3QgYmUKKyAgICAgKiAgcHVibGljbHkgaW5zdGFudGlhdGVkCisgICAgICogQGV4Y2VwdGlvbiBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUKKyAgICAgKiAgaW5zdGFudGlhdGluZyB0aGUgZmlsdGVyIG9iamVjdAorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiB0aHJvd24gYnkgdGhlIGZpbHRlcidzIGluaXQoKSBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25GaWx0ZXJDb25maWcoQ29udGV4dCBjb250ZXh0LCBGaWx0ZXJEZWYgZmlsdGVyRGVmKQorICAgICAgICB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIHNldEZpbHRlckRlZihmaWx0ZXJEZWYpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRleHQgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbnRleHQgY29udGV4dCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhcHBsaWNhdGlvbiBGaWx0ZXIgd2UgYXJlIGNvbmZpZ3VyZWQgZm9yLgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IEZpbHRlciBmaWx0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+RmlsdGVyRGVmPC9jb2RlPiB0aGF0IGRlZmluZXMgb3VyIGFzc29jaWF0ZWQgRmlsdGVyLgorICAgICAqLworICAgIHByaXZhdGUgRmlsdGVyRGVmIGZpbHRlckRlZiA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaWx0ZXJDb25maWcgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZpbHRlciB3ZSBhcmUgY29uZmlndXJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGaWx0ZXJOYW1lKCkgeworCisgICAgICAgIHJldHVybiAoZmlsdGVyRGVmLmdldEZpbHRlck5hbWUoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkCisgICAgICogaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcGFyYW1ldGVyCisgICAgICogZG9lcyBub3QgZXhpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0ZWQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgTWFwIG1hcCA9IGZpbHRlckRlZi5nZXRQYXJhbWV0ZXJNYXAoKTsKKyAgICAgICAgaWYgKG1hcCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICgoU3RyaW5nKSBtYXAuZ2V0KG5hbWUpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiB0aGUgbmFtZXMgb2YgdGhlIGluaXRpYWxpemF0aW9uCisgICAgICogcGFyYW1ldGVycyBmb3IgdGhpcyBGaWx0ZXIuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEluaXRQYXJhbWV0ZXJOYW1lcygpIHsKKworICAgICAgICBNYXAgbWFwID0gZmlsdGVyRGVmLmdldFBhcmFtZXRlck1hcCgpOworICAgICAgICBpZiAobWFwID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG5ldyBFbnVtZXJhdG9yKG5ldyBBcnJheUxpc3QoKSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKG5ldyBFbnVtZXJhdG9yKG1hcC5rZXlTZXQoKSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNlcnZsZXRDb250ZXh0IG9mIG91ciBhc3NvY2lhdGVkIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkFwcGxpY2F0aW9uRmlsdGVyQ29uZmlnWyIpOworICAgICAgICBzYi5hcHBlbmQoIm5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChmaWx0ZXJEZWYuZ2V0RmlsdGVyTmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsIGZpbHRlckNsYXNzPSIpOworICAgICAgICBzYi5hcHBlbmQoZmlsdGVyRGVmLmdldEZpbHRlckNsYXNzKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXBwbGljYXRpb24gRmlsdGVyIHdlIGFyZSBjb25maWd1cmVkIGZvci4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50CisgICAgICogIHRoZSA8Y29kZT5qYXZheC5zZXJ2bGV0LkZpbHRlcjwvY29kZT4gaW50ZXJmYWNlCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBmaWx0ZXIgY2xhc3MgY2Fubm90IGJlIGZvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlmIHRoZSBmaWx0ZXIgY2xhc3MgY2Fubm90IGJlCisgICAgICogIHB1YmxpY2x5IGluc3RhbnRpYXRlZAorICAgICAqIEBleGNlcHRpb24gSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlCisgICAgICogIGluc3RhbnRpYXRpbmcgdGhlIGZpbHRlciBvYmplY3QKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgdGhyb3duIGJ5IHRoZSBmaWx0ZXIncyBpbml0KCkgbWV0aG9kCisgICAgICovCisgICAgRmlsdGVyIGdldEZpbHRlcigpIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sCisgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFJldHVybiB0aGUgZXhpc3RpbmcgZmlsdGVyIGluc3RhbmNlLCBpZiBhbnkKKyAgICAgICAgaWYgKHRoaXMuZmlsdGVyICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHRoaXMuZmlsdGVyKTsKKworICAgICAgICAvLyBJZGVudGlmeSB0aGUgY2xhc3MgbG9hZGVyIHdlIHdpbGwgYmUgdXNpbmcKKyAgICAgICAgU3RyaW5nIGZpbHRlckNsYXNzID0gZmlsdGVyRGVmLmdldEZpbHRlckNsYXNzKCk7CisgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKKyAgICAgICAgaWYgKGZpbHRlckNsYXNzLnN0YXJ0c1dpdGgoIm9yZy5hcGFjaGUuY2F0YWxpbmEuIikpCisgICAgICAgICAgICBjbGFzc0xvYWRlciA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjbGFzc0xvYWRlciA9IGNvbnRleHQuZ2V0TG9hZGVyKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKworICAgICAgICAvLyBJbnN0YW50aWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGZpbHRlciBhbmQgcmV0dXJuIGl0CisgICAgICAgIENsYXNzIGNsYXp6ID0gY2xhc3NMb2FkZXIubG9hZENsYXNzKGZpbHRlckNsYXNzKTsKKyAgICAgICAgdGhpcy5maWx0ZXIgPSAoRmlsdGVyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCAmJgorICAgICAgICAgICAgKChTdGFuZGFyZENvbnRleHQpY29udGV4dCkuZ2V0U3dhbGxvd091dHB1dCgpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN5c3RlbUxvZ0hhbmRsZXIuc3RhcnRDYXB0dXJlKCk7CisgICAgICAgICAgICAgICAgZmlsdGVyLmluaXQodGhpcyk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIFN0cmluZyBsb2cgPSBTeXN0ZW1Mb2dIYW5kbGVyLnN0b3BDYXB0dXJlKCk7CisgICAgICAgICAgICAgICAgaWYgKGxvZyAhPSBudWxsICYmIGxvZy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5sb2cobG9nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWx0ZXIuaW5pdCh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHRoaXMuZmlsdGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmaWx0ZXIgZGVmaW5pdGlvbiB3ZSBhcmUgY29uZmlndXJlZCBmb3IuCisgICAgICovCisgICAgRmlsdGVyRGVmIGdldEZpbHRlckRlZigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZmlsdGVyRGVmKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgRmlsdGVyIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEZpbHRlckNvbmZpZywKKyAgICAgKiBpZiB0aGVyZSBpcyBvbmUuCisgICAgICovCisgICAgdm9pZCByZWxlYXNlKCkgeworCisgICAgICAgIGlmICh0aGlzLmZpbHRlciAhPSBudWxsKXsKKyAgICAgICAgICAgICBpZiggU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5VXRpbC5kb0FzUHJpdmlsZWdlKCJkZXN0cm95IiwgZmlsdGVyKTsgCisgICAgICAgICAgICAgICAgfSBjYXRjaChqYXZhLmxhbmcuRXhjZXB0aW9uIGV4KXsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldExvZ2dlcigpLmVycm9yKCJBcHBsaWNhdGlvbkZpbHRlckNvbmZpZy5kb0FzUHJpdmlsZWdlIiwgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTZWN1cml0eVV0aWwucmVtb3ZlKGZpbHRlcik7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgICBmaWx0ZXIuZGVzdHJveSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRoaXMuZmlsdGVyID0gbnVsbDsKKworICAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZmlsdGVyIGRlZmluaXRpb24gd2UgYXJlIGNvbmZpZ3VyZWQgZm9yLiAgVGhpcyBoYXMgdGhlIHNpZGUKKyAgICAgKiBlZmZlY3Qgb2YgaW5zdGFudGlhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGUgY29ycmVzcG9uZGluZyBmaWx0ZXIgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyRGVmIFRoZSBuZXcgZmlsdGVyIGRlZmluaXRpb24KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50CisgICAgICogIHRoZSA8Y29kZT5qYXZheC5zZXJ2bGV0LkZpbHRlcjwvY29kZT4gaW50ZXJmYWNlCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBmaWx0ZXIgY2xhc3MgY2Fubm90IGJlIGZvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlmIHRoZSBmaWx0ZXIgY2xhc3MgY2Fubm90IGJlCisgICAgICogIHB1YmxpY2x5IGluc3RhbnRpYXRlZAorICAgICAqIEBleGNlcHRpb24gSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlCisgICAgICogIGluc3RhbnRpYXRpbmcgdGhlIGZpbHRlciBvYmplY3QKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgdGhyb3duIGJ5IHRoZSBmaWx0ZXIncyBpbml0KCkgbWV0aG9kCisgICAgICovCisgICAgdm9pZCBzZXRGaWx0ZXJEZWYoRmlsdGVyRGVmIGZpbHRlckRlZikKKyAgICAgICAgdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCisgICAgICAgICAgICAgICBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICB0aGlzLmZpbHRlckRlZiA9IGZpbHRlckRlZjsKKyAgICAgICAgaWYgKGZpbHRlckRlZiA9PSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIFJlbGVhc2UgYW55IHByZXZpb3VzbHkgYWxsb2NhdGVkIGZpbHRlciBpbnN0YW5jZQorICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyICE9IG51bGwpeworICAgICAgICAgICAgICAgICBpZiggU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlVdGlsLmRvQXNQcml2aWxlZ2UoImRlc3Ryb3kiLCBmaWx0ZXIpOyAgCisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goamF2YS5sYW5nLkV4Y2VwdGlvbiBleCl7ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRMb2dnZXIoKS5lcnJvcigiQXBwbGljYXRpb25GaWx0ZXJDb25maWcuZG9Bc1ByaXZpbGVnZSIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTZWN1cml0eVV0aWwucmVtb3ZlKGZpbHRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgICAgIGZpbHRlci5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBudWxsOworCisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIGEgbmV3IGZpbHRlciBpbnN0YW5jZQorICAgICAgICAgICAgZ2V0RmlsdGVyKCk7CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZTk4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDMzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmU7CisKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuV3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkZpbHRlck1hcDsKKworLyoqCisgKiBGYWN0b3J5IGZvciB0aGUgY3JlYXRpb24gYW5kIGNhY2hpbmcgb2YgRmlsdGVycyBhbmQgY3JlYXRpb25nIAorICogb2YgRmlsdGVyIENoYWlucy4KKyAqCisgKiBAYXV0aG9yIEdyZWcgTXVycmF5CisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBFUlJPUl9JTlRFR0VSID0gbmV3IEludGVnZXIoRVJST1IpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUldBUkQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBGT1JXQVJEX0lOVEVHRVIgPSBuZXcgSW50ZWdlcihGT1JXQVJEKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgSU5DTFVERV9JTlRFR0VSID0gbmV3IEludGVnZXIoSU5DTFVERSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVCA9IDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFJFUVVFU1RfSU5URUdFUiA9IG5ldyBJbnRlZ2VyKFJFUVVFU1QpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUEFUQ0hFUl9UWVBFX0FUVFIgPSAKKyAgICAgICAgR2xvYmFscy5ESVNQQVRDSEVSX1RZUEVfQVRUUjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQQVRDSEVSX1JFUVVFU1RfUEFUSF9BVFRSID0gCisgICAgICAgIEdsb2JhbHMuRElTUEFUQ0hFUl9SRVFVRVNUX1BBVEhfQVRUUjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNlY3VyaXR5TWFuYWdlciBzZWN1cml0eU1hbmFnZXIgPSAKKyAgICAgICAgU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOzsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qCisgICAgICogUHJldmVudCBpbnN0YW5jaWF0aW9uIG91dHNpZGUgb2YgdGhlIGdldEluc3RhbmNlTWV0aG9kKCkuCisgICAgICovCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkoKSB7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmcWN0b3J5IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgeworICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWN0b3J5ID0gbmV3IEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWN0b3J5OworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuZCByZXR1cm4gYSBGaWx0ZXJDaGFpbiBpbXBsZW1lbnRhdGlvbiB0aGF0IHdpbGwgd3JhcCB0aGUKKyAgICAgKiBleGVjdXRpb24gb2YgdGhlIHNwZWNpZmllZCBzZXJ2bGV0IGluc3RhbmNlLiAgSWYgd2Ugc2hvdWxkIG5vdCBleGVjdXRlCisgICAgICogYSBmaWx0ZXIgY2hhaW4gYXQgYWxsLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHNlcnZsZXQgVGhlIHNlcnZsZXQgaW5zdGFuY2UgdG8gYmUgd3JhcHBlZAorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvbkZpbHRlckNoYWluIGNyZWF0ZUZpbHRlckNoYWluCisgICAgICAgIChTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBXcmFwcGVyIHdyYXBwZXIsIFNlcnZsZXQgc2VydmxldCkgeworCisgICAgICAgIC8vIGdldCB0aGUgZGlzcGF0Y2hlciB0eXBlCisgICAgICAgIGludCBkaXNwYXRjaGVyID0gLTE7IAorICAgICAgICBpZiAocmVxdWVzdC5nZXRBdHRyaWJ1dGUoRElTUEFUQ0hFUl9UWVBFX0FUVFIpICE9IG51bGwpIHsKKyAgICAgICAgICAgIEludGVnZXIgZGlzcGF0Y2hlckludCA9IAorICAgICAgICAgICAgICAgIChJbnRlZ2VyKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShESVNQQVRDSEVSX1RZUEVfQVRUUik7CisgICAgICAgICAgICBkaXNwYXRjaGVyID0gZGlzcGF0Y2hlckludC5pbnRWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyByZXF1ZXN0UGF0aCA9IG51bGw7CisgICAgICAgIE9iamVjdCBhdHRyaWJ1dGUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZShESVNQQVRDSEVSX1JFUVVFU1RfUEFUSF9BVFRSKTsKKyAgICAgICAgCisgICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCl7CisgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IGF0dHJpYnV0ZS50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBzZXJ2bGV0IHRvIGV4ZWN1dGUsIHJldHVybiBudWxsCisgICAgICAgIGlmIChzZXJ2bGV0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIC8vIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIGZpbHRlciBjaGFpbiBvYmplY3QKKyAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJDaGFpbiBmaWx0ZXJDaGFpbiA9IG51bGw7CisgICAgICAgIGlmICgoc2VjdXJpdHlNYW5hZ2VyID09IG51bGwpICYmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCkpIHsKKyAgICAgICAgICAgIFJlcXVlc3QgcmVxID0gKFJlcXVlc3QpIHJlcXVlc3Q7CisgICAgICAgICAgICBmaWx0ZXJDaGFpbiA9IChBcHBsaWNhdGlvbkZpbHRlckNoYWluKSByZXEuZ2V0RmlsdGVyQ2hhaW4oKTsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJDaGFpbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmlsdGVyQ2hhaW4gPSBuZXcgQXBwbGljYXRpb25GaWx0ZXJDaGFpbigpOworICAgICAgICAgICAgICAgIHJlcS5zZXRGaWx0ZXJDaGFpbihmaWx0ZXJDaGFpbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTZWN1cml0eTogRG8gbm90IHJlY3ljbGUKKyAgICAgICAgICAgIGZpbHRlckNoYWluID0gbmV3IEFwcGxpY2F0aW9uRmlsdGVyQ2hhaW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbHRlckNoYWluLnNldFNlcnZsZXQoc2VydmxldCk7CisKKyAgICAgICAgZmlsdGVyQ2hhaW4uc2V0U3VwcG9ydAorICAgICAgICAgICAgKCgoU3RhbmRhcmRXcmFwcGVyKXdyYXBwZXIpLmdldEluc3RhbmNlU3VwcG9ydCgpKTsKKworICAgICAgICAvLyBBY3F1aXJlIHRoZSBmaWx0ZXIgbWFwcGluZ3MgZm9yIHRoaXMgQ29udGV4dAorICAgICAgICBTdGFuZGFyZENvbnRleHQgY29udGV4dCA9IChTdGFuZGFyZENvbnRleHQpIHdyYXBwZXIuZ2V0UGFyZW50KCk7CisgICAgICAgIEZpbHRlck1hcCBmaWx0ZXJNYXBzW10gPSBjb250ZXh0LmZpbmRGaWx0ZXJNYXBzKCk7CisKKyAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGZpbHRlciBtYXBwaW5ncywgd2UgYXJlIGRvbmUKKyAgICAgICAgaWYgKChmaWx0ZXJNYXBzID09IG51bGwpIHx8IChmaWx0ZXJNYXBzLmxlbmd0aCA9PSAwKSkKKyAgICAgICAgICAgIHJldHVybiAoZmlsdGVyQ2hhaW4pOworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIGluZm9ybWF0aW9uIHdlIHdpbGwgbmVlZCB0byBtYXRjaCBmaWx0ZXIgbWFwcGluZ3MKKyAgICAgICAgU3RyaW5nIHNlcnZsZXROYW1lID0gd3JhcHBlci5nZXROYW1lKCk7CisKKyAgICAgICAgaW50IG4gPSAwOworCisgICAgICAgIC8vIEFkZCB0aGUgcmVsZXZhbnQgcGF0aC1tYXBwZWQgZmlsdGVycyB0byB0aGlzIGZpbHRlciBjaGFpbgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlck1hcHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghbWF0Y2hEaXNwYXRjaGVyKGZpbHRlck1hcHNbaV0gLGRpc3BhdGNoZXIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1hdGNoRmlsdGVyc1VSTChmaWx0ZXJNYXBzW2ldLCByZXF1ZXN0UGF0aCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBBcHBsaWNhdGlvbkZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcgPSAoQXBwbGljYXRpb25GaWx0ZXJDb25maWcpCisgICAgICAgICAgICAgICAgY29udGV4dC5maW5kRmlsdGVyQ29uZmlnKGZpbHRlck1hcHNbaV0uZ2V0RmlsdGVyTmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJDb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIDsgICAgICAgLy8gRklYTUUgLSBsb2cgY29uZmlndXJhdGlvbiBwcm9ibGVtCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWx0ZXJDaGFpbi5hZGRGaWx0ZXIoZmlsdGVyQ29uZmlnKTsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCBmaWx0ZXJzIHRoYXQgbWF0Y2ggb24gc2VydmxldCBuYW1lIHNlY29uZAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlck1hcHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghbWF0Y2hEaXNwYXRjaGVyKGZpbHRlck1hcHNbaV0gLGRpc3BhdGNoZXIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1hdGNoRmlsdGVyc1NlcnZsZXQoZmlsdGVyTWFwc1tpXSwgc2VydmxldE5hbWUpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnID0gKEFwcGxpY2F0aW9uRmlsdGVyQ29uZmlnKQorICAgICAgICAgICAgICAgIGNvbnRleHQuZmluZEZpbHRlckNvbmZpZyhmaWx0ZXJNYXBzW2ldLmdldEZpbHRlck5hbWUoKSk7CisgICAgICAgICAgICBpZiAoZmlsdGVyQ29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICA7ICAgICAgIC8vIEZJWE1FIC0gbG9nIGNvbmZpZ3VyYXRpb24gcHJvYmxlbQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsdGVyQ2hhaW4uYWRkRmlsdGVyKGZpbHRlckNvbmZpZyk7CisgICAgICAgICAgICBuKys7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gdGhlIGNvbXBsZXRlZCBmaWx0ZXIgY2hhaW4KKyAgICAgICAgcmV0dXJuIChmaWx0ZXJDaGFpbik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRleHQtcmVsYXRpdmUgcmVxdWVzdCBwYXRoCisgICAgICogbWF0Y2hlcyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQgZmlsdGVyIG1hcHBpbmc7CisgICAgICogb3RoZXJ3aXNlLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyTWFwIEZpbHRlciBtYXBwaW5nIGJlaW5nIGNoZWNrZWQKKyAgICAgKiBAcGFyYW0gcmVxdWVzdFBhdGggQ29udGV4dC1yZWxhdGl2ZSByZXF1ZXN0IHBhdGggb2YgdGhpcyByZXF1ZXN0CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1hdGNoRmlsdGVyc1VSTChGaWx0ZXJNYXAgZmlsdGVyTWFwLCBTdHJpbmcgcmVxdWVzdFBhdGgpIHsKKworICAgICAgICBpZiAocmVxdWVzdFBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgICAgIC8vIE1hdGNoIG9uIGNvbnRleHQgcmVsYXRpdmUgcmVxdWVzdCBwYXRoCisgICAgICAgIFN0cmluZyB0ZXN0UGF0aCA9IGZpbHRlck1hcC5nZXRVUkxQYXR0ZXJuKCk7CisgICAgICAgIGlmICh0ZXN0UGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICAgICAgLy8gQ2FzZSAxIC0gRXhhY3QgTWF0Y2gKKyAgICAgICAgaWYgKHRlc3RQYXRoLmVxdWFscyhyZXF1ZXN0UGF0aCkpCisgICAgICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgICAgIC8vIENhc2UgMiAtIFBhdGggTWF0Y2ggKCIvLi4uLyoiKQorICAgICAgICBpZiAodGVzdFBhdGguZXF1YWxzKCIvKiIpKQorICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgaWYgKHRlc3RQYXRoLmVuZHNXaXRoKCIvKiIpKSB7CisgICAgICAgICAgICBpZiAodGVzdFBhdGgucmVnaW9uTWF0Y2hlcygwLCByZXF1ZXN0UGF0aCwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UGF0aC5sZW5ndGgoKSAtIDIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RQYXRoLmxlbmd0aCgpID09ICh0ZXN0UGF0aC5sZW5ndGgoKSAtIDIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgnLycgPT0gcmVxdWVzdFBhdGguY2hhckF0KHRlc3RQYXRoLmxlbmd0aCgpIC0gMikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhc2UgMyAtIEV4dGVuc2lvbiBNYXRjaAorICAgICAgICBpZiAodGVzdFBhdGguc3RhcnRzV2l0aCgiKi4iKSkgeworICAgICAgICAgICAgaW50IHNsYXNoID0gcmVxdWVzdFBhdGgubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgIGludCBwZXJpb2QgPSByZXF1ZXN0UGF0aC5sYXN0SW5kZXhPZignLicpOworICAgICAgICAgICAgaWYgKChzbGFzaCA+PSAwKSAmJiAocGVyaW9kID4gc2xhc2gpIAorICAgICAgICAgICAgICAgICYmIChwZXJpb2QgIT0gcmVxdWVzdFBhdGgubGVuZ3RoKCkgLSAxKQorICAgICAgICAgICAgICAgICYmICgocmVxdWVzdFBhdGgubGVuZ3RoKCkgLSBwZXJpb2QpIAorICAgICAgICAgICAgICAgICAgICA9PSAodGVzdFBhdGgubGVuZ3RoKCkgLSAxKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRlc3RQYXRoLnJlZ2lvbk1hdGNoZXMoMiwgcmVxdWVzdFBhdGgsIHBlcmlvZCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RQYXRoLmxlbmd0aCgpIC0gMikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FzZSA0IC0gIkRlZmF1bHQiIE1hdGNoCisgICAgICAgIHJldHVybiAoZmFsc2UpOyAvLyBOT1RFIC0gTm90IHJlbGV2YW50IGZvciBzZWxlY3RpbmcgZmlsdGVycworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBzZXJ2bGV0IG5hbWUgbWF0Y2hlcworICAgICAqIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBmaWx0ZXIgbWFwcGluZzsgb3RoZXJ3aXNlCisgICAgICogcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJNYXAgRmlsdGVyIG1hcHBpbmcgYmVpbmcgY2hlY2tlZAorICAgICAqIEBwYXJhbSBzZXJ2bGV0TmFtZSBTZXJ2bGV0IG5hbWUgYmVpbmcgY2hlY2tlZAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtYXRjaEZpbHRlcnNTZXJ2bGV0KEZpbHRlck1hcCBmaWx0ZXJNYXAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2bGV0TmFtZSkgeworCisgICAgICAgIGlmIChzZXJ2bGV0TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzZXJ2bGV0TmFtZS5lcXVhbHMoZmlsdGVyTWFwLmdldFNlcnZsZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZpZW5pZW5jZSBtZXRob2Qgd2hpY2ggcmV0dXJucyB0cnVlIGlmICB0aGUgZGlzcGF0Y2hlciB0eXBlCisgICAgICogbWF0Y2hlcyB0aGUgZGlzcGF0Y2hlciB0eXBlcyBzcGVjaWZpZWQgaW4gdGhlIEZpbHRlck1hcAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtYXRjaERpc3BhdGNoZXIoRmlsdGVyTWFwIGZpbHRlck1hcCwgaW50IGRpc3BhdGNoZXIpIHsKKyAgICAgICAgc3dpdGNoIChkaXNwYXRjaGVyKSB7CisgICAgICAgICAgICBjYXNlIEZPUldBUkQgOiB7CisgICAgICAgICAgICAgICAgaWYgKGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5GT1JXQVJEIHx8CisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5GT1JXQVJEX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5JTkNMVURFX0ZPUldBUkQgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLklOQ0xVREVfRVJST1JfRk9SV0FSRCB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuUkVRVUVTVF9GT1JXQVJEIHx8CisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5SRVFVRVNUX0VSUk9SX0ZPUldBUkQgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLlJFUVVFU1RfRVJST1JfRk9SV0FSRF9JTkNMVURFIHx8CisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5SRVFVRVNUX0ZPUldBUkRfSU5DTFVERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBJTkNMVURFIDogeworICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuSU5DTFVERSB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuSU5DTFVERV9FUlJPUiB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuSU5DTFVERV9GT1JXQVJEIHx8CisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5JTkNMVURFX0VSUk9SX0ZPUldBUkQgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLlJFUVVFU1RfSU5DTFVERSB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuUkVRVUVTVF9FUlJPUl9JTkNMVURFIHx8CisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5SRVFVRVNUX0VSUk9SX0ZPUldBUkRfSU5DTFVERSB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuUkVRVUVTVF9GT1JXQVJEX0lOQ0xVREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgUkVRVUVTVCA6IHsKKyAgICAgICAgICAgICAgICBpZiAoZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLlJFUVVFU1QgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLlJFUVVFU1RfRVJST1IgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLlJFUVVFU1RfSU5DTFVERSB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuUkVRVUVTVF9FUlJPUl9JTkNMVURFIHx8CisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5SRVFVRVNUX0ZPUldBUkQgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLlJFUVVFU1RfRVJST1JfRk9SV0FSRCB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuUkVRVUVTVF9GT1JXQVJEX0lOQ0xVREUgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLlJFUVVFU1RfRVJST1JfRk9SV0FSRF9JTkNMVURFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEVSUk9SIDogeworICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuRVJST1IgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLkZPUldBUkRfRVJST1IgfHwgCisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5JTkNMVURFX0VSUk9SIHx8IAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuSU5DTFVERV9FUlJPUl9GT1JXQVJEIHx8IAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuUkVRVUVTVF9FUlJPUiB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuUkVRVUVTVF9FUlJPUl9GT1JXQVJEIHx8CisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5SRVFVRVNUX0VSUk9SX0ZPUldBUkRfSU5DTFVERSB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuUkVRVUVTVF9FUlJPUl9JTkNMVURFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkh0dHBSZXF1ZXN0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkh0dHBSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyNzNkYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uSHR0cFJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDk1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmU7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlJlcXVlc3REaXNwYXRjaGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5FbnVtZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5SZXF1ZXN0VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworCisvKioKKyAqIFdyYXBwZXIgYXJvdW5kIGEgPGNvZGU+amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDwvY29kZT4KKyAqIHRoYXQgdHJhbnNmb3JtcyBhbiBhcHBsaWNhdGlvbiByZXF1ZXN0IG9iamVjdCAod2hpY2ggbWlnaHQgYmUgdGhlIG9yaWdpbmFsCisgKiBvbmUgcGFzc2VkIHRvIGEgc2VydmxldCwgb3IgbWlnaHQgYmUgYmFzZWQgb24gdGhlIDIuMworICogPGNvZGU+amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI8L2NvZGU+IGNsYXNzKQorICogYmFjayBpbnRvIGFuIGludGVybmFsIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuSHR0cFJlcXVlc3Q8L2NvZGU+LgorICogPHA+CisgKiA8c3Ryb25nPldBUk5JTkc8L3N0cm9uZz46ICBEdWUgdG8gSmF2YSdzIGxhY2sgb2Ygc3VwcG9ydCBmb3IgbXVsdGlwbGUKKyAqIGluaGVyaXRhbmNlLCBhbGwgb2YgdGhlIGxvZ2ljIGluIDxjb2RlPkFwcGxpY2F0aW9uUmVxdWVzdDwvY29kZT4gaXMKKyAqIGR1cGxpY2F0ZWQgaW4gPGNvZGU+QXBwbGljYXRpb25IdHRwUmVxdWVzdDwvY29kZT4uICBNYWtlIHN1cmUgdGhhdCB5b3UKKyAqIGtlZXAgdGhlc2UgdHdvIGNsYXNzZXMgaW4gc3luY2hyb25pemF0aW9uIHdoZW4gbWFraW5nIGNoYW5nZXMhCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK2NsYXNzIEFwcGxpY2F0aW9uSHR0cFJlcXVlc3QgZXh0ZW5kcyBIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgYXR0cmlidXRlIG5hbWVzIHRoYXQgYXJlIHNwZWNpYWwgZm9yIHJlcXVlc3QgZGlzcGF0Y2hlcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3BlY2lhbHNbXSA9CisgICAgeyBHbG9iYWxzLklOQ0xVREVfUkVRVUVTVF9VUklfQVRUUiwgR2xvYmFscy5JTkNMVURFX0NPTlRFWFRfUEFUSF9BVFRSLAorICAgICAgR2xvYmFscy5JTkNMVURFX1NFUlZMRVRfUEFUSF9BVFRSLCBHbG9iYWxzLklOQ0xVREVfUEFUSF9JTkZPX0FUVFIsCisgICAgICBHbG9iYWxzLklOQ0xVREVfUVVFUllfU1RSSU5HX0FUVFIsIEdsb2JhbHMuRk9SV0FSRF9SRVFVRVNUX1VSSV9BVFRSLCAKKyAgICAgIEdsb2JhbHMuRk9SV0FSRF9DT05URVhUX1BBVEhfQVRUUiwgR2xvYmFscy5GT1JXQVJEX1NFUlZMRVRfUEFUSF9BVFRSLCAKKyAgICAgIEdsb2JhbHMuRk9SV0FSRF9QQVRIX0lORk9fQVRUUiwgR2xvYmFscy5GT1JXQVJEX1FVRVJZX1NUUklOR19BVFRSIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgd3JhcHBlZCByZXF1ZXN0IGFyb3VuZCB0aGUgc3BlY2lmaWVkIHNlcnZsZXQgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3QgYmVpbmcgd3JhcHBlZAorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvbkh0dHBSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjcm9zc0NvbnRleHQpIHsKKworICAgICAgICBzdXBlcihyZXF1ZXN0KTsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgdGhpcy5jcm9zc0NvbnRleHQgPSBjcm9zc0NvbnRleHQ7CisgICAgICAgIHNldFJlcXVlc3QocmVxdWVzdCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dCBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBDb250ZXh0IGNvbnRleHQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dCBwYXRoIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0UGF0aCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIElmIHRoaXMgcmVxdWVzdCBpcyBjcm9zcyBjb250ZXh0LCBzaW5jZSB0aGlzIGNoYW5nZXMgc2Vzc2lvbiBhY2Nlc3NzCisgICAgICogYmVoYXZpb3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY3Jvc3NDb250ZXh0ID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IGRpc3BhdGNoZXIgdHlwZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGRpc3BhdGNoZXJUeXBlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5BcHBsaWNhdGlvbkh0dHBSZXF1ZXN0LzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IHBhcmFtZXRlcnMgZm9yIHRoaXMgcmVxdWVzdC4gIFRoaXMgaXMgaW5pdGlhbGl6ZWQgZnJvbSB0aGUKKyAgICAgKiB3cmFwcGVkIHJlcXVlc3QsIGJ1dCB1cGRhdGVzIGFyZSBhbGxvd2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXAgcGFyYW1ldGVycyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEhhdmUgdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMgcmVxdWVzdCBhbHJlYWR5IGJlZW4gcGFyc2VkPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZWRQYXJhbXMgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHBhdGggaW5mb3JtYXRpb24gZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGhJbmZvID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnlQYXJhbVN0cmluZyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgcmVxdWVzdCBkaXNwYXRjaGVyIHBhdGguCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCByZXF1ZXN0RGlzcGF0Y2hlclBhdGggPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBVUkkgZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlcXVlc3RVUkkgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBwYXRoIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2bGV0UGF0aCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50bHkgYWN0aXZlIHNlc3Npb24gZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogU3BlY2lhbCBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3RbXSBzcGVjaWFsQXR0cmlidXRlcyA9IG5ldyBPYmplY3Rbc3BlY2lhbHMubGVuZ3RoXTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXJ2bGV0UmVxdWVzdCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSA8Y29kZT5nZXRBdHRyaWJ1dGUoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSB3cmFwcGVkIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gcmV0cmlldmUKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChuYW1lLmVxdWFscyhHbG9iYWxzLkRJU1BBVENIRVJfVFlQRV9BVFRSKSkgeworICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXJUeXBlOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKEdsb2JhbHMuRElTUEFUQ0hFUl9SRVFVRVNUX1BBVEhfQVRUUikpIHsKKyAgICAgICAgICAgIGlmICggcmVxdWVzdERpc3BhdGNoZXJQYXRoICE9IG51bGwgKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdERpc3BhdGNoZXJQYXRoLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IHBvcyA9IGdldFNwZWNpYWwobmFtZSk7CisgICAgICAgIGlmIChwb3MgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlKG5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChzcGVjaWFsQXR0cmlidXRlc1twb3NdID09IG51bGwpIAorICAgICAgICAgICAgICAgICYmIChzcGVjaWFsQXR0cmlidXRlc1s1XSA9PSBudWxsKSAmJiAocG9zID49IDUpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgaXQncyBhIGZvcndhcmQgc3BlY2lhbCBhdHRyaWJ1dGUsIGFuZCBudWxsLCBpdCBtZWFucyB0aGlzCisgICAgICAgICAgICAgICAgLy8gaXMgYW4gaW5jbHVkZSwgc28gd2UgY2hlY2sgdGhlIHdyYXBwZWQgcmVxdWVzdCBzaW5jZSAKKyAgICAgICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBjb3VsZCBoYXZlIGJlZW4gZm9yd2FyZGVkIGJlZm9yZSB0aGUgaW5jbHVkZQorICAgICAgICAgICAgICAgIHJldHVybiBnZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlKG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lhbEF0dHJpYnV0ZXNbcG9zXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGUgPGNvZGU+Z2V0QXR0cmlidXRlTmFtZXMoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSB3cmFwcGVkCisgICAgICogcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QXR0cmlidXRlTmFtZXMoKSB7CisgICAgICAgIHJldHVybiAobmV3IEF0dHJpYnV0ZU5hbWVzRW51bWVyYXRvcigpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSA8Y29kZT5yZW1vdmVBdHRyaWJ1dGUoKTwvY29kZT4gbWV0aG9kIG9mIHRoZQorICAgICAqIHdyYXBwZWQgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAoIXJlbW92ZVNwZWNpYWwobmFtZSkpCisgICAgICAgICAgICBnZXRSZXF1ZXN0KCkucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGUgPGNvZGU+c2V0QXR0cmlidXRlKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUKKyAgICAgKiB3cmFwcGVkIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gc2V0CisgICAgICogQHBhcmFtIHZhbHVlIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKworICAgICAgICBpZiAobmFtZS5lcXVhbHMoR2xvYmFscy5ESVNQQVRDSEVSX1RZUEVfQVRUUikpIHsKKyAgICAgICAgICAgIGRpc3BhdGNoZXJUeXBlID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoR2xvYmFscy5ESVNQQVRDSEVSX1JFUVVFU1RfUEFUSF9BVFRSKSkgeworICAgICAgICAgICAgcmVxdWVzdERpc3BhdGNoZXJQYXRoID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXNldFNwZWNpYWwobmFtZSwgdmFsdWUpKSB7CisgICAgICAgICAgICBnZXRSZXF1ZXN0KCkuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBSZXF1ZXN0RGlzcGF0Y2hlciB0aGF0IHdyYXBzIHRoZSByZXNvdXJjZSBhdCB0aGUgc3BlY2lmaWVkCisgICAgICogcGF0aCwgd2hpY2ggbWF5IGJlIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHJlcXVlc3QgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHJlc291cmNlIHRvIGJlIHdyYXBwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0UmVxdWVzdERpc3BhdGNoZXIoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAvLyBJZiB0aGUgcGF0aCBpcyBhbHJlYWR5IGNvbnRleHQtcmVsYXRpdmUsIGp1c3QgcGFzcyBpdCB0aHJvdWdoCisgICAgICAgIGlmIChwYXRoID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBlbHNlIGlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgICAgIHJldHVybiAoY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKHBhdGgpKTsKKworICAgICAgICAvLyBDb252ZXJ0IGEgcmVxdWVzdC1yZWxhdGl2ZSBwYXRoIHRvIGEgY29udGV4dC1yZWxhdGl2ZSBvbmUKKyAgICAgICAgU3RyaW5nIHNlcnZsZXRQYXRoID0gCisgICAgICAgICAgICAoU3RyaW5nKSBnZXRBdHRyaWJ1dGUoR2xvYmFscy5JTkNMVURFX1NFUlZMRVRfUEFUSF9BVFRSKTsKKyAgICAgICAgaWYgKHNlcnZsZXRQYXRoID09IG51bGwpCisgICAgICAgICAgICBzZXJ2bGV0UGF0aCA9IGdldFNlcnZsZXRQYXRoKCk7CisKKyAgICAgICAgLy8gQWRkIHRoZSBwYXRoIGluZm8sIGlmIHRoZXJlIGlzIGFueQorICAgICAgICBTdHJpbmcgcGF0aEluZm8gPSBnZXRQYXRoSW5mbygpOworICAgICAgICBTdHJpbmcgcmVxdWVzdFBhdGggPSBudWxsOworCisgICAgICAgIGlmIChwYXRoSW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IHNlcnZsZXRQYXRoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBzZXJ2bGV0UGF0aCArIHBhdGhJbmZvOworICAgICAgICB9CisKKyAgICAgICAgaW50IHBvcyA9IHJlcXVlc3RQYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgIFN0cmluZyByZWxhdGl2ZSA9IG51bGw7CisgICAgICAgIGlmIChwb3MgPj0gMCkgeworICAgICAgICAgICAgcmVsYXRpdmUgPSBSZXF1ZXN0VXRpbC5ub3JtYWxpemUKKyAgICAgICAgICAgICAgICAocmVxdWVzdFBhdGguc3Vic3RyaW5nKDAsIHBvcyArIDEpICsgcGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWxhdGl2ZSA9IFJlcXVlc3RVdGlsLm5vcm1hbGl6ZShyZXF1ZXN0UGF0aCArIHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIocmVsYXRpdmUpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEh0dHBTZXJ2bGV0UmVxdWVzdCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSA8Y29kZT5nZXRDb250ZXh0UGF0aCgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIHdyYXBwZWQKKyAgICAgKiByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFBhdGgoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRleHRQYXRoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPmdldFBhcmFtZXRlcigpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIHdyYXBwZWQgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworCisJcGFyc2VQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gcGFyYW1ldGVycy5nZXQobmFtZSk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmdbXSkKKyAgICAgICAgICAgIHJldHVybiAoKChTdHJpbmdbXSkgdmFsdWUpWzBdKTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCisgICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIHZhbHVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICh2YWx1ZS50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPmdldFBhcmFtZXRlck1hcCgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlCisgICAgICogd3JhcHBlZCByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBNYXAgZ2V0UGFyYW1ldGVyTWFwKCkgeworCisJcGFyc2VQYXJhbWV0ZXJzKCk7CisgICAgICAgIHJldHVybiAocGFyYW1ldGVycyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSA8Y29kZT5nZXRQYXJhbWV0ZXJOYW1lcygpPC9jb2RlPiBtZXRob2Qgb2YgdGhlCisgICAgICogd3JhcHBlZCByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQYXJhbWV0ZXJOYW1lcygpIHsKKworCXBhcnNlUGFyYW1ldGVycygpOworICAgICAgICByZXR1cm4gKG5ldyBFbnVtZXJhdG9yKHBhcmFtZXRlcnMua2V5U2V0KCkpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPmdldFBhcmFtZXRlclZhbHVlcygpPC9jb2RlPiBtZXRob2Qgb2YgdGhlCisgICAgICogd3JhcHBlZCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIG5hbWUpIHsKKworCXBhcnNlUGFyYW1ldGVycygpOworICAgICAgICBPYmplY3QgdmFsdWUgPSBwYXJhbWV0ZXJzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgbnVsbCk7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nW10pCisgICAgICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgdmFsdWUpOworICAgICAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIHZhbHVlc1swXSA9IChTdHJpbmcpIHZhbHVlOworICAgICAgICAgICAgcmV0dXJuICh2YWx1ZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIHZhbHVlc1swXSA9IHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gKHZhbHVlcyk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPmdldFBhdGhJbmZvKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgd3JhcHBlZCByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhdGhJbmZvKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPmdldFF1ZXJ5U3RyaW5nKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgd3JhcHBlZAorICAgICAqIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucXVlcnlTdHJpbmcpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGUgPGNvZGU+Z2V0UmVxdWVzdFVSSSgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIHdyYXBwZWQKKyAgICAgKiByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFVSSSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucmVxdWVzdFVSSSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSA8Y29kZT5nZXRSZXF1ZXN0VVJMKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgd3JhcHBlZAorICAgICAqIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ0J1ZmZlciBnZXRSZXF1ZXN0VVJMKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciB1cmwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyBzY2hlbWUgPSBnZXRTY2hlbWUoKTsKKyAgICAgICAgaW50IHBvcnQgPSBnZXRTZXJ2ZXJQb3J0KCk7CisgICAgICAgIGlmIChwb3J0IDwgMCkKKyAgICAgICAgICAgIHBvcnQgPSA4MDsgLy8gV29yayBhcm91bmQgamF2YS5uZXQuVVJMIGJ1ZworCisgICAgICAgIHVybC5hcHBlbmQoc2NoZW1lKTsKKyAgICAgICAgdXJsLmFwcGVuZCgiOi8vIik7CisgICAgICAgIHVybC5hcHBlbmQoZ2V0U2VydmVyTmFtZSgpKTsKKyAgICAgICAgaWYgKChzY2hlbWUuZXF1YWxzKCJodHRwIikgJiYgKHBvcnQgIT0gODApKQorICAgICAgICAgICAgfHwgKHNjaGVtZS5lcXVhbHMoImh0dHBzIikgJiYgKHBvcnQgIT0gNDQzKSkpIHsKKyAgICAgICAgICAgIHVybC5hcHBlbmQoJzonKTsKKyAgICAgICAgICAgIHVybC5hcHBlbmQocG9ydCk7CisgICAgICAgIH0KKyAgICAgICAgdXJsLmFwcGVuZChnZXRSZXF1ZXN0VVJJKCkpOworCisgICAgICAgIHJldHVybiAodXJsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPmdldFNlcnZsZXRQYXRoKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgd3JhcHBlZAorICAgICAqIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuc2VydmxldFBhdGgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdCwgY3JlYXRpbmcgb25lCisgICAgICogaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gKGdldFNlc3Npb24odHJ1ZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlcXVlc3QsIGNyZWF0aW5nIG9uZQorICAgICAqIGlmIG5lY2Vzc2FyeSBhbmQgcmVxdWVzdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNyZWF0ZSBDcmVhdGUgYSBuZXcgc2Vzc2lvbiBpZiBvbmUgZG9lcyBub3QgZXhpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbihib29sZWFuIGNyZWF0ZSkgeworCisgICAgICAgIGlmIChjcm9zc0NvbnRleHQpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gVGhlcmUgY2Fubm90IGJlIGEgc2Vzc2lvbiBpZiBubyBjb250ZXh0IGhhcyBiZWVuIGFzc2lnbmVkIHlldAorICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZiBpdCBleGlzdHMgYW5kIGlzIHZhbGlkCisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsICYmIHNlc3Npb24uaXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzZXNzaW9uLmdldFNlc3Npb24oKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEh0dHBTZXNzaW9uIG90aGVyID0gc3VwZXIuZ2V0U2Vzc2lvbihmYWxzZSk7CisgICAgICAgICAgICBpZiAoY3JlYXRlICYmIChvdGhlciA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNyZWF0ZSBhIHNlc3Npb24gaW4gdGhlIGZpcnN0IGNvbnRleHQ6IHRoZSBwcm9ibGVtIGlzCisgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgdG9wIGxldmVsIHJlcXVlc3QgaXMgdGhlIG9ubHkgb25lIHdoaWNoIGNhbiAKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGNvb2tpZSBzYWZlbHkKKyAgICAgICAgICAgICAgICBvdGhlciA9IHN1cGVyLmdldFNlc3Npb24odHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3RoZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFNlc3Npb24gbG9jYWxTZXNzaW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbFNlc3Npb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRNYW5hZ2VyKCkuZmluZFNlc3Npb24ob3RoZXIuZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxvY2FsU2Vzc2lvbiA9PSBudWxsICYmIGNyZWF0ZSkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbFNlc3Npb24gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TWFuYWdlcigpLmNyZWF0ZVNlc3Npb24ob3RoZXIuZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsb2NhbFNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbFNlc3Npb24uYWNjZXNzKCk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gPSBsb2NhbFNlc3Npb247CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uLmdldFNlc3Npb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFNlc3Npb24oY3JlYXRlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlcXVlc3Qgc3BlY2lmaWVzIGEgSlNFU1NJT05JRCB0aGF0IGlzIHZhbGlkIHdpdGhpbgorICAgICAqIHRoZSBjb250ZXh0IG9mIHRoaXMgQXBwbGljYXRpb25IdHRwUmVxdWVzdCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZXF1ZXN0IHNwZWNpZmllcyBhIEpTRVNTSU9OSUQgdGhhdCBpcyB2YWxpZCB3aXRoaW4KKyAgICAgKiB0aGUgY29udGV4dCBvZiB0aGlzIEFwcGxpY2F0aW9uSHR0cFJlcXVlc3QsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZFZhbGlkKCkgeworCisgICAgICAgIGlmIChjcm9zc0NvbnRleHQpIHsKKworICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RlZFNlc3Npb25JZCA9IGdldFJlcXVlc3RlZFNlc3Npb25JZCgpOworICAgICAgICAgICAgaWYgKHJlcXVlc3RlZFNlc3Npb25JZCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgICAgIE1hbmFnZXIgbWFuYWdlciA9IGNvbnRleHQuZ2V0TWFuYWdlcigpOworICAgICAgICAgICAgaWYgKG1hbmFnZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlc3Npb24gPSBtYW5hZ2VyLmZpbmRTZXNzaW9uKHJlcXVlc3RlZFNlc3Npb25JZCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHNlc3Npb24gIT0gbnVsbCkgJiYgc2Vzc2lvbi5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlY3ljbGUgdGhpcyByZXF1ZXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgc2Vzc2lvbi5lbmRBY2Nlc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYSBzaGFsbG93IGNvcHkgb2YgdGhlIHNwZWNpZmllZCBNYXAsIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcmlnIE9yaWdpbiBNYXAgdG8gYmUgY29waWVkCisgICAgICovCisgICAgTWFwIGNvcHlNYXAoTWFwIG9yaWcpIHsKKworICAgICAgICBpZiAob3JpZyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChuZXcgSGFzaE1hcCgpKTsKKyAgICAgICAgSGFzaE1hcCBkZXN0ID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgSXRlcmF0b3Iga2V5cyA9IG9yaWcua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7CisgICAgICAgICAgICBkZXN0LnB1dChrZXksIG9yaWcuZ2V0KGtleSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoZGVzdCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29udGV4dCBwYXRoIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGggVGhlIG5ldyBjb250ZXh0IHBhdGgKKyAgICAgKi8KKyAgICB2b2lkIHNldENvbnRleHRQYXRoKFN0cmluZyBjb250ZXh0UGF0aCkgeworCisgICAgICAgIHRoaXMuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXRoIGluZm9ybWF0aW9uIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aEluZm8gVGhlIG5ldyBwYXRoIGluZm8KKyAgICAgKi8KKyAgICB2b2lkIHNldFBhdGhJbmZvKFN0cmluZyBwYXRoSW5mbykgeworCisgICAgICAgIHRoaXMucGF0aEluZm8gPSBwYXRoSW5mbzsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBxdWVyeVN0cmluZyBUaGUgbmV3IHF1ZXJ5IHN0cmluZworICAgICAqLworICAgIHZvaWQgc2V0UXVlcnlTdHJpbmcoU3RyaW5nIHF1ZXJ5U3RyaW5nKSB7CisKKyAgICAgICAgdGhpcy5xdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlcXVlc3QgdGhhdCB3ZSBhcmUgd3JhcHBpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgbmV3IHdyYXBwZWQgcmVxdWVzdAorICAgICAqLworICAgIHZvaWQgc2V0UmVxdWVzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyLnNldFJlcXVlc3QocmVxdWVzdCk7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgYXR0cmlidXRlcyBmb3IgdGhpcyByZXF1ZXN0CisgICAgICAgIGRpc3BhdGNoZXJUeXBlID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5ESVNQQVRDSEVSX1RZUEVfQVRUUik7CisgICAgICAgIHJlcXVlc3REaXNwYXRjaGVyUGF0aCA9IAorICAgICAgICAgICAgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5ESVNQQVRDSEVSX1JFUVVFU1RfUEFUSF9BVFRSKTsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwYXRoIGVsZW1lbnRzIGZvciB0aGlzIHJlcXVlc3QKKyAgICAgICAgY29udGV4dFBhdGggPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCk7CisgICAgICAgIHBhdGhJbmZvID0gcmVxdWVzdC5nZXRQYXRoSW5mbygpOworICAgICAgICBxdWVyeVN0cmluZyA9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKTsKKyAgICAgICAgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworICAgICAgICBzZXJ2bGV0UGF0aCA9IHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXF1ZXN0IFVSSSBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3RVUkkgVGhlIG5ldyByZXF1ZXN0IFVSSQorICAgICAqLworICAgIHZvaWQgc2V0UmVxdWVzdFVSSShTdHJpbmcgcmVxdWVzdFVSSSkgeworCisgICAgICAgIHRoaXMucmVxdWVzdFVSSSA9IHJlcXVlc3RVUkk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2VydmxldCBwYXRoIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmxldFBhdGggVGhlIG5ldyBzZXJ2bGV0IHBhdGgKKyAgICAgKi8KKyAgICB2b2lkIHNldFNlcnZsZXRQYXRoKFN0cmluZyBzZXJ2bGV0UGF0aCkgeworCisgICAgICAgIHRoaXMuc2VydmxldFBhdGggPSBzZXJ2bGV0UGF0aDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIElmIHBhcmFtZXRlcnMgYXJlIHByZXNlbnQgaW4gYm90aCB0aGUgcXVlcnkgc3RyaW5nIGFuZCB0aGUgcmVxdWVzdAorICAgICAqIGNvbnRlbnQsIHRoZXkgYXJlIG1lcmdlZC4KKyAgICAgKi8KKyAgICB2b2lkIHBhcnNlUGFyYW1ldGVycygpIHsKKworCWlmIChwYXJzZWRQYXJhbXMpIHsKKwkgICAgcmV0dXJuOworCX0KKworICAgICAgICBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgcGFyYW1ldGVycyA9IGNvcHlNYXAoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlck1hcCgpKTsKKyAgICAgICAgbWVyZ2VQYXJhbWV0ZXJzKCk7CisgICAgICAgIHBhcnNlZFBhcmFtcyA9IHRydWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTYXZlIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBxdWVyeVN0cmluZyBUaGUgcXVlcnkgc3RyaW5nIGNvbnRhaW5pbmcgcGFyYW1ldGVycyBmb3IgdGhpcworICAgICAqICAgICAgICAgICAgICAgICAgICByZXF1ZXN0CisgICAgICovCisgICAgdm9pZCBzZXRRdWVyeVBhcmFtcyhTdHJpbmcgcXVlcnlTdHJpbmcpIHsKKyAgICAgICAgdGhpcy5xdWVyeVBhcmFtU3RyaW5nID0gcXVlcnlTdHJpbmc7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSXMgdGhpcyBhdHRyaWJ1dGUgbmFtZSBvbmUgb2YgdGhlIHNwZWNpYWwgb25lcyB0aGF0IGlzIGFkZGVkIG9ubHkgZm9yCisgICAgICogaW5jbHVkZWQgc2VydmxldHM/CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBBdHRyaWJ1dGUgbmFtZSB0byBiZSB0ZXN0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NwZWNpYWwoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwZWNpYWxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3BlY2lhbHNbaV0uZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCBhIHNwZWNpYWwgYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc3BlY2lhbCBhdHRyaWJ1dGUgcG9zLCBvciAtMSBpZiBpdCBpcyBub3QgYSBzcGVjaWFsIAorICAgICAqICAgICAgICAgYXR0cmlidXRlCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBnZXRTcGVjaWFsKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BlY2lhbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzcGVjaWFsc1tpXS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGEgc3BlY2lhbCBhdHRyaWJ1dGUuCisgICAgICogCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgd2FzIGEgc3BlY2lhbCBhdHRyaWJ1dGUsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHNldFNwZWNpYWwoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwZWNpYWxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3BlY2lhbHNbaV0uZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgc3BlY2lhbEF0dHJpYnV0ZXNbaV0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgc3BlY2lhbCBhdHRyaWJ1dGUuCisgICAgICogCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgd2FzIGEgc3BlY2lhbCBhdHRyaWJ1dGUsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHJlbW92ZVNwZWNpYWwoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjaWFscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHNwZWNpYWxzW2ldLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHNwZWNpYWxBdHRyaWJ1dGVzW2ldID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogTWVyZ2UgdGhlIHR3byBzZXRzIG9mIHBhcmFtZXRlciB2YWx1ZXMgaW50byBhIHNpbmdsZSBTdHJpbmcgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWVzMSBGaXJzdCBzZXQgb2YgdmFsdWVzCisgICAgICogQHBhcmFtIHZhbHVlczIgU2Vjb25kIHNldCBvZiB2YWx1ZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbWVyZ2VWYWx1ZXMoT2JqZWN0IHZhbHVlczEsIE9iamVjdCB2YWx1ZXMyKSB7CisKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgaWYgKHZhbHVlczEgPT0gbnVsbCkKKyAgICAgICAgICAgIDsKKyAgICAgICAgZWxzZSBpZiAodmFsdWVzMSBpbnN0YW5jZW9mIFN0cmluZykKKyAgICAgICAgICAgIHJlc3VsdHMuYWRkKHZhbHVlczEpOworICAgICAgICBlbHNlIGlmICh2YWx1ZXMxIGluc3RhbmNlb2YgU3RyaW5nW10pIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZXNbXSA9IChTdHJpbmdbXSkgdmFsdWVzMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKHZhbHVlc1tpXSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmVzdWx0cy5hZGQodmFsdWVzMS50b1N0cmluZygpKTsKKworICAgICAgICBpZiAodmFsdWVzMiA9PSBudWxsKQorICAgICAgICAgICAgOworICAgICAgICBlbHNlIGlmICh2YWx1ZXMyIGluc3RhbmNlb2YgU3RyaW5nKQorICAgICAgICAgICAgcmVzdWx0cy5hZGQodmFsdWVzMik7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlczIgaW5zdGFuY2VvZiBTdHJpbmdbXSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gKFN0cmluZ1tdKSB2YWx1ZXMyOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQodmFsdWVzW2ldKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXN1bHRzLmFkZCh2YWx1ZXMyLnRvU3RyaW5nKCkpOworCisgICAgICAgIFN0cmluZyB2YWx1ZXNbXSA9IG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldOworICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KHZhbHVlcykpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIE1lcmdlIHRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIHNhdmVkIHF1ZXJ5IHBhcmFtZXRlciBzdHJpbmcgKGlmIGFueSksIGFuZAorICAgICAqIHRoZSBwYXJhbWV0ZXJzIGFscmVhZHkgcHJlc2VudCBvbiB0aGlzIHJlcXVlc3QgKGlmIGFueSksIHN1Y2ggdGhhdCB0aGUKKyAgICAgKiBwYXJhbWV0ZXIgdmFsdWVzIGZyb20gdGhlIHF1ZXJ5IHN0cmluZyBzaG93IHVwIGZpcnN0IGlmIHRoZXJlIGFyZQorICAgICAqIGR1cGxpY2F0ZSBwYXJhbWV0ZXIgbmFtZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG1lcmdlUGFyYW1ldGVycygpIHsKKworICAgICAgICBpZiAoKHF1ZXJ5UGFyYW1TdHJpbmcgPT0gbnVsbCkgfHwgKHF1ZXJ5UGFyYW1TdHJpbmcubGVuZ3RoKCkgPCAxKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBIYXNoTWFwIHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIFN0cmluZyBlbmNvZGluZyA9IGdldENoYXJhY3RlckVuY29kaW5nKCk7CisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKQorICAgICAgICAgICAgZW5jb2RpbmcgPSAiSVNPLTg4NTktMSI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZXF1ZXN0VXRpbC5wYXJzZVBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAocXVlcnlQYXJhbWV0ZXJzLCBxdWVyeVBhcmFtU3RyaW5nLCBlbmNvZGluZyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgSXRlcmF0b3Iga2V5cyA9IHBhcmFtZXRlcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBxdWVyeVBhcmFtZXRlcnMuZ2V0KGtleSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycy5wdXQoa2V5LCBwYXJhbWV0ZXJzLmdldChrZXkpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycy5wdXQKKyAgICAgICAgICAgICAgICAoa2V5LCBtZXJnZVZhbHVlcyh2YWx1ZSwgcGFyYW1ldGVycy5nZXQoa2V5KSkpOworICAgICAgICB9CisgICAgICAgIHBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnM7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZU5hbWVzRW51bWVyYXRvciBJbm5lciBDbGFzcworCisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGNsYXNzIHVzZWQgdG8gZXhwb3NlIHRoZSBzcGVjaWFsIGF0dHJpYnV0ZXMgYXMgYmVpbmcgYXZhaWxhYmxlCisgICAgICogYXMgcmVxdWVzdCBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBBdHRyaWJ1dGVOYW1lc0VudW1lcmF0b3IgaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7CisKKyAgICAgICAgcHJvdGVjdGVkIGludCBwb3MgPSAtMTsKKyAgICAgICAgcHJvdGVjdGVkIGludCBsYXN0ID0gLTE7CisgICAgICAgIHByb3RlY3RlZCBFbnVtZXJhdGlvbiBwYXJlbnRFbnVtZXJhdGlvbiA9IG51bGw7CisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgbmV4dCA9IG51bGw7CisKKyAgICAgICAgcHVibGljIEF0dHJpYnV0ZU5hbWVzRW51bWVyYXRvcigpIHsKKyAgICAgICAgICAgIHBhcmVudEVudW1lcmF0aW9uID0gZ2V0UmVxdWVzdCgpLmdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwZWNpYWxBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGdldEF0dHJpYnV0ZShzcGVjaWFsc1tpXSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsYXN0ID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7CisgICAgICAgICAgICByZXR1cm4gKChwb3MgIT0gbGFzdCkgfHwgKG5leHQgIT0gbnVsbCkgCisgICAgICAgICAgICAgICAgICAgIHx8ICgobmV4dCA9IGZpbmROZXh0KCkpICE9IG51bGwpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7CisgICAgICAgICAgICBpZiAocG9zICE9IGxhc3QpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gcG9zICsgMTsgaSA8PSBsYXN0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldEF0dHJpYnV0ZShzcGVjaWFsc1tpXSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc3BlY2lhbHNbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG5leHQ7CisgICAgICAgICAgICBpZiAobmV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmV4dCA9IGZpbmROZXh0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBmaW5kTmV4dCgpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOworICAgICAgICAgICAgd2hpbGUgKChyZXN1bHQgPT0gbnVsbCkgJiYgKHBhcmVudEVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50ID0gKFN0cmluZykgcGFyZW50RW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWlzU3BlY2lhbChjdXJyZW50KSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkh0dHBSZXNwb25zZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25IdHRwUmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTI0NTIzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25IdHRwUmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDM5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmU7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CisKKworLyoqCisgKiBXcmFwcGVyIGFyb3VuZCBhIDxjb2RlPmphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlPC9jb2RlPgorICogdGhhdCB0cmFuc2Zvcm1zIGFuIGFwcGxpY2F0aW9uIHJlc3BvbnNlIG9iamVjdCAod2hpY2ggbWlnaHQgYmUgdGhlIG9yaWdpbmFsCisgKiBvbmUgcGFzc2VkIHRvIGEgc2VydmxldCwgb3IgbWlnaHQgYmUgYmFzZWQgb24gdGhlIDIuMworICogPGNvZGU+amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyPC9jb2RlPiBjbGFzcykKKyAqIGJhY2sgaW50byBhbiBpbnRlcm5hbCA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkh0dHBSZXNwb25zZTwvY29kZT4uCisgKiA8cD4KKyAqIDxzdHJvbmc+V0FSTklORzwvc3Ryb25nPjogIER1ZSB0byBKYXZhJ3MgbGFjayBvZiBzdXBwb3J0IGZvciBtdWx0aXBsZQorICogaW5oZXJpdGFuY2UsIGFsbCBvZiB0aGUgbG9naWMgaW4gPGNvZGU+QXBwbGljYXRpb25SZXNwb25zZTwvY29kZT4gaXMKKyAqIGR1cGxpY2F0ZWQgaW4gPGNvZGU+QXBwbGljYXRpb25IdHRwUmVzcG9uc2U8L2NvZGU+LiAgTWFrZSBzdXJlIHRoYXQgeW91CisgKiBrZWVwIHRoZXNlIHR3byBjbGFzc2VzIGluIHN5bmNocm9uaXphdGlvbiB3aGVuIG1ha2luZyBjaGFuZ2VzIQorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitjbGFzcyBBcHBsaWNhdGlvbkh0dHBSZXNwb25zZSBleHRlbmRzIEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyB3cmFwcGVkIHJlc3BvbnNlIGFyb3VuZCB0aGUgc3BlY2lmaWVkIHNlcnZsZXQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2UgYmVpbmcgd3JhcHBlZAorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvbkh0dHBSZXNwb25zZShIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisKKyAgICAgICAgdGhpcyhyZXNwb25zZSwgZmFsc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgd3JhcHBlZCByZXNwb25zZSBhcm91bmQgdGhlIHNwZWNpZmllZCBzZXJ2bGV0IHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIGJlaW5nIHdyYXBwZWQKKyAgICAgKiBAcGFyYW0gaW5jbHVkZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyByZXNwb25zZSBpcyBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiAgYnkgYSA8Y29kZT5SZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCk8L2NvZGU+IGNhbGwKKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25IdHRwUmVzcG9uc2UoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlZCkgeworCisgICAgICAgIHN1cGVyKHJlc3BvbnNlKTsKKyAgICAgICAgc2V0SW5jbHVkZWQoaW5jbHVkZWQpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogSXMgdGhpcyB3cmFwcGVkIHJlc3BvbnNlIHRoZSBzdWJqZWN0IG9mIGFuIDxjb2RlPmluY2x1ZGUoKTwvY29kZT4KKyAgICAgKiBjYWxsPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQXBwbGljYXRpb25IdHRwUmVzcG9uc2UvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlcnZsZXRSZXNwb25zZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnJlc2V0KCk8L2NvZGU+IGNhbGxzIG9uIGEgaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgcmVzcG9uc2UgaGFzIGFscmVhZHkKKyAgICAgKiAgYmVlbiBjb21taXR0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKworICAgICAgICAvLyBJZiBhbHJlYWR5IGNvbW1pdHRlZCwgdGhlIHdyYXBwZWQgcmVzcG9uc2Ugd2lsbCB0aHJvdyBJU0UKKyAgICAgICAgaWYgKCFpbmNsdWRlZCB8fCBnZXRSZXNwb25zZSgpLmlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICBnZXRSZXNwb25zZSgpLnJlc2V0KCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnNldENvbnRlbnRMZW5ndGgoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVuIFRoZSBuZXcgY29udGVudCBsZW5ndGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TGVuZ3RoKGludCBsZW4pIHsKKworICAgICAgICBpZiAoIWluY2x1ZGVkKQorICAgICAgICAgICAgZ2V0UmVzcG9uc2UoKS5zZXRDb250ZW50TGVuZ3RoKGxlbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnNldENvbnRlbnRUeXBlKCk8L2NvZGU+IGNhbGxzIG9uIGFuIGluY2x1ZGVkIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgVGhlIG5ldyBjb250ZW50IHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgdHlwZSkgeworCisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICBnZXRSZXNwb25zZSgpLnNldENvbnRlbnRUeXBlKHR5cGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaXNhbGxvdyA8Y29kZT5zZXRMb2NhbGUoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jIFRoZSBuZXcgbG9jYWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2MpIHsKKworICAgICAgICBpZiAoIWluY2x1ZGVkKQorICAgICAgICAgICAgZ2V0UmVzcG9uc2UoKS5zZXRMb2NhbGUobG9jKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSWdub3JlIDxjb2RlPnNldEJ1ZmZlclNpemUoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgYnVmZmVyIHNpemUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCdWZmZXJTaXplKGludCBzaXplKSB7CisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICBnZXRSZXNwb25zZSgpLnNldEJ1ZmZlclNpemUoc2l6ZSk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIdHRwU2VydmxldFJlc3BvbnNlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRGlzYWxsb3cgPGNvZGU+YWRkQ29va2llKCk8L2NvZGU+IGNhbGxzIG9uIGFuIGluY2x1ZGVkIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvb2tpZSBUaGUgbmV3IGNvb2tpZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvb2tpZShDb29raWUgY29va2llKSB7CisKKyAgICAgICAgaWYgKCFpbmNsdWRlZCkKKyAgICAgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuYWRkQ29va2llKGNvb2tpZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPmFkZERhdGVIZWFkZXIoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmV3IGhlYWRlciBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgaGVhZGVyIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgeworCisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLmFkZERhdGVIZWFkZXIobmFtZSwgdmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaXNhbGxvdyA8Y29kZT5hZGRIZWFkZXIoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmV3IGhlYWRlciBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgaGVhZGVyIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKworICAgICAgICBpZiAoIWluY2x1ZGVkKQorICAgICAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5hZGRIZWFkZXIobmFtZSwgdmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaXNhbGxvdyA8Y29kZT5hZGRJbnRIZWFkZXIoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmV3IGhlYWRlciBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgaGVhZGVyIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSW50SGVhZGVyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKKworICAgICAgICBpZiAoIWluY2x1ZGVkKQorICAgICAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5hZGRJbnRIZWFkZXIobmFtZSwgdmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaXNhbGxvdyA8Y29kZT5zZW5kRXJyb3IoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2MgVGhlIG5ldyBzdGF0dXMgY29kZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBzYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoIWluY2x1ZGVkKQorICAgICAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5zZW5kRXJyb3Ioc2MpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaXNhbGxvdyA8Y29kZT5zZW5kRXJyb3IoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2MgVGhlIG5ldyBzdGF0dXMgY29kZQorICAgICAqIEBwYXJhbSBtc2cgVGhlIG5ldyBtZXNzYWdlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHNjLCBTdHJpbmcgbXNnKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLnNlbmRFcnJvcihzYywgbXNnKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGlzYWxsb3cgPGNvZGU+c2VuZFJlZGlyZWN0KCk8L2NvZGU+IGNhbGxzIG9uIGFuIGluY2x1ZGVkIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBuZXcgbG9jYXRpb24KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRSZWRpcmVjdChTdHJpbmcgbG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCFpbmNsdWRlZCkKKyAgICAgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuc2VuZFJlZGlyZWN0KGxvY2F0aW9uKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGlzYWxsb3cgPGNvZGU+c2V0RGF0ZUhlYWRlcigpPC9jb2RlPiBjYWxscyBvbiBhbiBpbmNsdWRlZCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgaGVhZGVyIG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBoZWFkZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlSGVhZGVyKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7CisKKyAgICAgICAgaWYgKCFpbmNsdWRlZCkKKyAgICAgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuc2V0RGF0ZUhlYWRlcihuYW1lLCB2YWx1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnNldEhlYWRlcigpPC9jb2RlPiBjYWxscyBvbiBhbiBpbmNsdWRlZCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgaGVhZGVyIG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBoZWFkZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworCisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnNldEludEhlYWRlcigpPC9jb2RlPiBjYWxscyBvbiBhbiBpbmNsdWRlZCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgaGVhZGVyIG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBoZWFkZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRIZWFkZXIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgeworCisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLnNldEludEhlYWRlcihuYW1lLCB2YWx1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnNldFN0YXR1cygpPC9jb2RlPiBjYWxscyBvbiBhbiBpbmNsdWRlZCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzYyBUaGUgbmV3IHN0YXR1cyBjb2RlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzYykgeworCisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLnNldFN0YXR1cyhzYyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnNldFN0YXR1cygpPC9jb2RlPiBjYWxscyBvbiBhbiBpbmNsdWRlZCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzYyBUaGUgbmV3IHN0YXR1cyBjb2RlCisgICAgICogQHBhcmFtIG1zZyBUaGUgbmV3IG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHNjLCBTdHJpbmcgbXNnKSB7CisKKyAgICAgICAgaWYgKCFpbmNsdWRlZCkKKyAgICAgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuc2V0U3RhdHVzKHNjLCBtc2cpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5jbHVkZWQgZmxhZyBmb3IgdGhpcyByZXNwb25zZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzSW5jbHVkZWQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmluY2x1ZGVkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbmNsdWRlZCBmbGFnIGZvciB0aGlzIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIGluY2x1ZGVkIFRoZSBuZXcgaW5jbHVkZWQgZmxhZworICAgICAqLworICAgIHZvaWQgc2V0SW5jbHVkZWQoYm9vbGVhbiBpbmNsdWRlZCkgeworCisgICAgICAgIHRoaXMuaW5jbHVkZWQgPSBpbmNsdWRlZDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXNwb25zZSB0aGF0IHdlIGFyZSB3cmFwcGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgbmV3IHdyYXBwZWQgcmVzcG9uc2UKKyAgICAgKi8KKyAgICB2b2lkIHNldFJlc3BvbnNlKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKworICAgICAgICBzdXBlci5zZXRSZXNwb25zZShyZXNwb25zZSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25SZXF1ZXN0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvblJlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmYwMTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25SZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RXcmFwcGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5FbnVtZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworCisKKy8qKgorICogV3JhcHBlciBhcm91bmQgYSA8Y29kZT5qYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0PC9jb2RlPgorICogdGhhdCB0cmFuc2Zvcm1zIGFuIGFwcGxpY2F0aW9uIHJlcXVlc3Qgb2JqZWN0ICh3aGljaCBtaWdodCBiZSB0aGUgb3JpZ2luYWwKKyAqIG9uZSBwYXNzZWQgdG8gYSBzZXJ2bGV0LCBvciBtaWdodCBiZSBiYXNlZCBvbiB0aGUgMi4zCisgKiA8Y29kZT5qYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0V3JhcHBlcjwvY29kZT4gY2xhc3MpCisgKiBiYWNrIGludG8gYW4gaW50ZXJuYWwgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5SZXF1ZXN0PC9jb2RlPi4KKyAqIDxwPgorICogPHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+OiAgRHVlIHRvIEphdmEncyBsYWNrIG9mIHN1cHBvcnQgZm9yIG11bHRpcGxlCisgKiBpbmhlcml0YW5jZSwgYWxsIG9mIHRoZSBsb2dpYyBpbiA8Y29kZT5BcHBsaWNhdGlvblJlcXVlc3Q8L2NvZGU+IGlzCisgKiBkdXBsaWNhdGVkIGluIDxjb2RlPkFwcGxpY2F0aW9uSHR0cFJlcXVlc3Q8L2NvZGU+LiAgTWFrZSBzdXJlIHRoYXQgeW91CisgKiBrZWVwIHRoZXNlIHR3byBjbGFzc2VzIGluIHN5bmNocm9uaXphdGlvbiB3aGVuIG1ha2luZyBjaGFuZ2VzIQorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitjbGFzcyBBcHBsaWNhdGlvblJlcXVlc3QgZXh0ZW5kcyBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YXRpYyBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBhcmUgc3BlY2lhbCBmb3IgcmVxdWVzdCBkaXNwYXRjaGVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBzcGVjaWFsc1tdID0KKyAgICB7IEdsb2JhbHMuSU5DTFVERV9SRVFVRVNUX1VSSV9BVFRSLCBHbG9iYWxzLklOQ0xVREVfQ09OVEVYVF9QQVRIX0FUVFIsCisgICAgICBHbG9iYWxzLklOQ0xVREVfU0VSVkxFVF9QQVRIX0FUVFIsIEdsb2JhbHMuSU5DTFVERV9QQVRIX0lORk9fQVRUUiwKKyAgICAgIEdsb2JhbHMuSU5DTFVERV9RVUVSWV9TVFJJTkdfQVRUUiwgR2xvYmFscy5GT1JXQVJEX1JFUVVFU1RfVVJJX0FUVFIsIAorICAgICAgR2xvYmFscy5GT1JXQVJEX0NPTlRFWFRfUEFUSF9BVFRSLCBHbG9iYWxzLkZPUldBUkRfU0VSVkxFVF9QQVRIX0FUVFIsIAorICAgICAgR2xvYmFscy5GT1JXQVJEX1BBVEhfSU5GT19BVFRSLCBHbG9iYWxzLkZPUldBUkRfUVVFUllfU1RSSU5HX0FUVFIgfTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyB3cmFwcGVkIHJlcXVlc3QgYXJvdW5kIHRoZSBzcGVjaWZpZWQgc2VydmxldCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCBiZWluZyB3cmFwcGVkCisgICAgICovCisgICAgcHVibGljIEFwcGxpY2F0aW9uUmVxdWVzdChTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIocmVxdWVzdCk7CisgICAgICAgIHNldFJlcXVlc3QocmVxdWVzdCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGVzIGZvciB0aGlzIHJlcXVlc3QuICBUaGlzIGlzIGluaXRpYWxpemVkIGZyb20gdGhlCisgICAgICogd3JhcHBlZCByZXF1ZXN0LCBidXQgdXBkYXRlcyBhcmUgYWxsb3dlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXJ2bGV0UmVxdWVzdCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSA8Y29kZT5nZXRBdHRyaWJ1dGUoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSB3cmFwcGVkIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gcmV0cmlldmUKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoYXR0cmlidXRlcykgeworICAgICAgICAgICAgcmV0dXJuIChhdHRyaWJ1dGVzLmdldChuYW1lKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPmdldEF0dHJpYnV0ZU5hbWVzKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgd3JhcHBlZAorICAgICAqIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoYXR0cmlidXRlcykgeworICAgICAgICAgICAgcmV0dXJuIChuZXcgRW51bWVyYXRvcihhdHRyaWJ1dGVzLmtleVNldCgpKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPnJlbW92ZUF0dHJpYnV0ZSgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlCisgICAgICogd3JhcHBlZCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoYXR0cmlidXRlcykgeworICAgICAgICAgICAgYXR0cmlidXRlcy5yZW1vdmUobmFtZSk7CisgICAgICAgICAgICBpZiAoIWlzU3BlY2lhbChuYW1lKSkKKyAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0KCkucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSA8Y29kZT5zZXRBdHRyaWJ1dGUoKTwvY29kZT4gbWV0aG9kIG9mIHRoZQorICAgICAqIHdyYXBwZWQgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBzZXQKKyAgICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoYXR0cmlidXRlcykgeworICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOworICAgICAgICAgICAgaWYgKCFpc1NwZWNpYWwobmFtZSkpCisgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdCgpLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlcnZsZXRSZXF1ZXN0V3JhcHBlciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVxdWVzdCB0aGF0IHdlIGFyZSB3cmFwcGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBuZXcgd3JhcHBlZCByZXF1ZXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdChTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIuc2V0UmVxdWVzdChyZXF1ZXN0KTsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIHJlcXVlc3QKKyAgICAgICAgc3luY2hyb25pemVkIChhdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICBhdHRyaWJ1dGVzLmNsZWFyKCk7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBuYW1lcyA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlTmFtZXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChuYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIElzIHRoaXMgYXR0cmlidXRlIG5hbWUgb25lIG9mIHRoZSBzcGVjaWFsIG9uZXMgdGhhdCBpcyBhZGRlZCBvbmx5IGZvcgorICAgICAqIGluY2x1ZGVkIHNlcnZsZXRzPworICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgQXR0cmlidXRlIG5hbWUgdG8gYmUgdGVzdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTcGVjaWFsKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjaWFscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHNwZWNpYWxzW2ldLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uUmVzcG9uc2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uUmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWJmMzg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25SZXNwb25zZS5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlV3JhcHBlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworCisKKy8qKgorICogV3JhcHBlciBhcm91bmQgYSA8Y29kZT5qYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTwvY29kZT4KKyAqIHRoYXQgdHJhbnNmb3JtcyBhbiBhcHBsaWNhdGlvbiByZXNwb25zZSBvYmplY3QgKHdoaWNoIG1pZ2h0IGJlIHRoZSBvcmlnaW5hbAorICogb25lIHBhc3NlZCB0byBhIHNlcnZsZXQsIG9yIG1pZ2h0IGJlIGJhc2VkIG9uIHRoZSAyLjMKKyAqIDxjb2RlPmphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlV3JhcHBlcjwvY29kZT4gY2xhc3MpCisgKiBiYWNrIGludG8gYW4gaW50ZXJuYWwgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5SZXNwb25zZTwvY29kZT4uCisgKiA8cD4KKyAqIDxzdHJvbmc+V0FSTklORzwvc3Ryb25nPjogIER1ZSB0byBKYXZhJ3MgbGFjayBvZiBzdXBwb3J0IGZvciBtdWx0aXBsZQorICogaW5oZXJpdGFuY2UsIGFsbCBvZiB0aGUgbG9naWMgaW4gPGNvZGU+QXBwbGljYXRpb25SZXNwb25zZTwvY29kZT4gaXMKKyAqIGR1cGxpY2F0ZWQgaW4gPGNvZGU+QXBwbGljYXRpb25IdHRwUmVzcG9uc2U8L2NvZGU+LiAgTWFrZSBzdXJlIHRoYXQgeW91CisgKiBrZWVwIHRoZXNlIHR3byBjbGFzc2VzIGluIHN5bmNocm9uaXphdGlvbiB3aGVuIG1ha2luZyBjaGFuZ2VzIQorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitjbGFzcyBBcHBsaWNhdGlvblJlc3BvbnNlIGV4dGVuZHMgU2VydmxldFJlc3BvbnNlV3JhcHBlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgd3JhcHBlZCByZXNwb25zZSBhcm91bmQgdGhlIHNwZWNpZmllZCBzZXJ2bGV0IHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIGJlaW5nIHdyYXBwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25SZXNwb25zZShTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKworICAgICAgICB0aGlzKHJlc3BvbnNlLCBmYWxzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyB3cmFwcGVkIHJlc3BvbnNlIGFyb3VuZCB0aGUgc3BlY2lmaWVkIHNlcnZsZXQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2UgYmVpbmcgd3JhcHBlZAorICAgICAqIEBwYXJhbSBpbmNsdWRlZCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHJlc3BvbnNlIGlzIGJlaW5nIHByb2Nlc3NlZAorICAgICAqICBieSBhIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyLmluY2x1ZGUoKTwvY29kZT4gY2FsbAorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvblJlc3BvbnNlKFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgYm9vbGVhbiBpbmNsdWRlZCkgeworCisgICAgICAgIHN1cGVyKHJlc3BvbnNlKTsKKyAgICAgICAgc2V0SW5jbHVkZWQoaW5jbHVkZWQpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogSXMgdGhpcyB3cmFwcGVkIHJlc3BvbnNlIHRoZSBzdWJqZWN0IG9mIGFuIDxjb2RlPmluY2x1ZGUoKTwvY29kZT4KKyAgICAgKiBjYWxsPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXJ2bGV0UmVzcG9uc2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBEaXNhbGxvdyA8Y29kZT5yZXNldCgpPC9jb2RlPiBjYWxscyBvbiBhIGluY2x1ZGVkIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHJlc3BvbnNlIGhhcyBhbHJlYWR5CisgICAgICogIGJlZW4gY29tbWl0dGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisKKyAgICAgICAgLy8gSWYgYWxyZWFkeSBjb21taXR0ZWQsIHRoZSB3cmFwcGVkIHJlc3BvbnNlIHdpbGwgdGhyb3cgSVNFCisgICAgICAgIGlmICghaW5jbHVkZWQgfHwgZ2V0UmVzcG9uc2UoKS5pc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgZ2V0UmVzcG9uc2UoKS5yZXNldCgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaXNhbGxvdyA8Y29kZT5zZXRDb250ZW50TGVuZ3RoKCk8L2NvZGU+IGNhbGxzIG9uIGFuIGluY2x1ZGVkIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIGxlbiBUaGUgbmV3IGNvbnRlbnQgbGVuZ3RoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudExlbmd0aChpbnQgbGVuKSB7CisKKyAgICAgICAgaWYgKCFpbmNsdWRlZCkKKyAgICAgICAgICAgIGdldFJlc3BvbnNlKCkuc2V0Q29udGVudExlbmd0aChsZW4pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaXNhbGxvdyA8Y29kZT5zZXRDb250ZW50VHlwZSgpPC9jb2RlPiBjYWxscyBvbiBhbiBpbmNsdWRlZCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIFRoZSBuZXcgY29udGVudCB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIHR5cGUpIHsKKworICAgICAgICBpZiAoIWluY2x1ZGVkKQorICAgICAgICAgICAgZ2V0UmVzcG9uc2UoKS5zZXRDb250ZW50VHlwZSh0eXBlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSWdub3JlIDxjb2RlPnNldExvY2FsZSgpPC9jb2RlPiBjYWxscyBvbiBhbiBpbmNsdWRlZCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2MgVGhlIG5ldyBsb2NhbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvYykgeworICAgICAgICBpZiAoIWluY2x1ZGVkKQorICAgICAgICAgICAgZ2V0UmVzcG9uc2UoKS5zZXRMb2NhbGUobG9jKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElnbm9yZSA8Y29kZT5zZXRCdWZmZXJTaXplKCk8L2NvZGU+IGNhbGxzIG9uIGFuIGluY2x1ZGVkIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgVGhlIGJ1ZmZlciBzaXplCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QnVmZmVyU2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBpZiAoIWluY2x1ZGVkKQorICAgICAgICAgICAgZ2V0UmVzcG9uc2UoKS5zZXRCdWZmZXJTaXplKHNpemUpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VydmxldFJlc3BvbnNlV3JhcHBlciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVzcG9uc2UgdGhhdCB3ZSBhcmUgd3JhcHBpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIG5ldyB3cmFwcGVkIHJlc3BvbnNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2UoU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisKKyAgICAgICAgc3VwZXIuc2V0UmVzcG9uc2UocmVzcG9uc2UpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpbmNsdWRlZCBmbGFnIGZvciB0aGlzIHJlc3BvbnNlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNJbmNsdWRlZCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuaW5jbHVkZWQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGluY2x1ZGVkIGZsYWcgZm9yIHRoaXMgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZWQgVGhlIG5ldyBpbmNsdWRlZCBmbGFnCisgICAgICovCisgICAgdm9pZCBzZXRJbmNsdWRlZChib29sZWFuIGluY2x1ZGVkKSB7CisKKyAgICAgICAgdGhpcy5pbmNsdWRlZCA9IGluY2x1ZGVkOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwckxpZmVjeWNsZUxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMzg4YmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmU7CisKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5MaWZlY3ljbGVMaXN0ZW5lcjwvY29kZT4gdGhhdCB3aWxsIGluaXQgYW5kCisgKiBhbmQgZGVzdHJveSBBUFIuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgY2xhc3MgQXByTGlmZWN5Y2xlTGlzdGVuZXIKKyAgICBpbXBsZW1lbnRzIExpZmVjeWNsZUxpc3RlbmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBcHJMaWZlY3ljbGVMaXN0ZW5lci5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUlSRURfTUFKT1IgPSAxOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFJFUVVJUkVEX01JTk9SID0gMTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBSRVFVSVJFRF9QQVRDSCA9IDM7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUkVDT01NRU5ERURfUFYgPSA0OworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZUxpc3RlbmVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJpbWFyeSBlbnRyeSBwb2ludCBmb3Igc3RhcnR1cCBhbmQgc2h1dGRvd24gZXZlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgaWYgKExpZmVjeWNsZS5JTklUX0VWRU5ULmVxdWFscyhldmVudC5nZXRUeXBlKCkpKSB7CisgICAgICAgICAgICBpbnQgbWFqb3IgPSAwOworICAgICAgICAgICAgaW50IG1pbm9yID0gMDsKKyAgICAgICAgICAgIGludCBwYXRjaCA9IDA7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gImluaXRpYWxpemUiOworICAgICAgICAgICAgICAgIENsYXNzIHBhcmFtVHlwZXNbXSA9IG5ldyBDbGFzc1sxXTsKKyAgICAgICAgICAgICAgICBwYXJhbVR5cGVzWzBdID0gU3RyaW5nLmNsYXNzOworICAgICAgICAgICAgICAgIE9iamVjdCBwYXJhbVZhbHVlc1tdID0gbmV3IE9iamVjdFsxXTsKKyAgICAgICAgICAgICAgICBwYXJhbVZhbHVlc1swXSA9IG51bGw7CisgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnRvbWNhdC5qbmkuTGlicmFyeSIpOworICAgICAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBjbGF6ei5nZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1UeXBlcyk7CisgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShudWxsLCBwYXJhbVZhbHVlcyk7CisgICAgICAgICAgICAgICAgbWFqb3IgPSBjbGF6ei5nZXRGaWVsZCgiVENOX01BSk9SX1ZFUlNJT04iKS5nZXRJbnQobnVsbCk7CisgICAgICAgICAgICAgICAgbWlub3IgPSBjbGF6ei5nZXRGaWVsZCgiVENOX01JTk9SX1ZFUlNJT04iKS5nZXRJbnQobnVsbCk7CisgICAgICAgICAgICAgICAgcGF0Y2ggPSBjbGF6ei5nZXRGaWVsZCgiVENOX1BBVENIX1ZFUlNJT04iKS5nZXRJbnQobnVsbCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGlmICghbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJhcHJMaXN0ZW5lci5hcHJJbml0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmxpYnJhcnkucGF0aCIpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiYXByTGlzdGVuZXIuYXBySW5pdCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5saWJyYXJ5LnBhdGgiKSksIHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1ham9yICE9IFJFUVVJUkVEX01BSk9SKSB8fCAobWlub3IgIT0gUkVRVUlSRURfTUlOT1IpCisgICAgICAgICAgICAgICAgICAgIHx8IChwYXRjaCA8IFJFUVVJUkVEX1BBVENIKSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImFwckxpc3RlbmVyLnRjbkludmFsaWQiLCBtYWpvciArICIuIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbWlub3IgKyAiLiIgKyBwYXRjaCwgUkVRVUlSRURfTUFKT1IgKyAiLiIgCisgICAgICAgICAgICAgICAgICAgICAgICArIFJFUVVJUkVEX01JTk9SICsgIi4iICsgUkVRVUlSRURfUEFUQ0gpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXRjaCA8IFJFQ09NTUVOREVEX1BWKSB7CisgICAgICAgICAgICAgICAgLyogVGhlIHZlcnNpb24gaXMgbG93ZXIgdGhlbiByZWNvbW1lbmRlZC4KKyAgICAgICAgICAgICAgICAgKiBJbnN0cnVjdCB0aGUgdXNlciB0byBjb25zaWRlciB1cGdyYWRpbmcgdGhlIG5hdGl2ZQorICAgICAgICAgICAgICAgICAqIHRvIHRoZSBjdXJyZW50IHN0YWJsZSB2ZXJzaW9uLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICghbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJhcHJMaXN0ZW5lci50Y25WZXJzaW9uIiwgbWFqb3IgKyAiLiIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtaW5vciArICIuIiArIHBhdGNoLCBSRVFVSVJFRF9NQUpPUiArICIuIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFJFUVVJUkVEX01JTk9SICsgIi4iICsgUkVDT01NRU5ERURfUFYpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJhcHJMaXN0ZW5lci50Y25WZXJzaW9uIiwgbWFqb3IgKyAiLiIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtaW5vciArICIuIiArIHBhdGNoLCBSRVFVSVJFRF9NQUpPUiArICIuIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFJFUVVJUkVEX01JTk9SICsgIi4iICsgUkVDT01NRU5ERURfUFYpKTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKExpZmVjeWNsZS5BRlRFUl9TVE9QX0VWRU5ULmVxdWFscyhldmVudC5nZXRUeXBlKCkpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gInRlcm1pbmF0ZSI7CisgICAgICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUudG9tY2F0LmpuaS5MaWJyYXJ5IikKKyAgICAgICAgICAgICAgICAgICAgLmdldE1ldGhvZChtZXRob2ROYW1lLCAoQ2xhc3MgW10pbnVsbCk7CisgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShudWxsLCAoT2JqZWN0IFtdKSBudWxsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgaWYgKCFsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoImFwckxpc3RlbmVyLmFwckRlc3Ryb3kiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiYXByTGlzdGVuZXIuYXByRGVzdHJveSIpLCB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9Db25zdGFudHMuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlN2FkODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitwdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhY2thZ2UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUpPUl9WRVJTSU9OID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5PUl9WRVJTSU9OID0gNDsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9TRVJWTEVUX0NMQVNTID0KKyAgICAgICAgIm9yZy5hcGFjaGUuamFzcGVyLnNlcnZsZXQuSnNwU2VydmxldCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1NFUlZMRVRfTkFNRSA9ICJqc3AiOworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9Db250YWluZXJCYXNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9Db250YWluZXJCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ1NzkyZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0NvbnRhaW5lckJhc2UuamF2YQpAQCAtMCwwICsxLDE1ODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZVN1cHBvcnQ7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuUmVnaXN0cmF0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlBpcGVsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5MaWZlY3ljbGVTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5Qcm94eURpckNvbnRleHQ7CisKKworLyoqCisgKiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGI+Q29udGFpbmVyPC9iPiBpbnRlcmZhY2UsIHByb3ZpZGluZyBjb21tb24KKyAqIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQgYnkgbmVhcmx5IGV2ZXJ5IGltcGxlbWVudGF0aW9uLiAgQ2xhc3NlcyBleHRlbmRpbmcKKyAqIHRoaXMgYmFzZSBjbGFzcyBtdXN0IGltcGxlbWVudCA8Y29kZT5nZXRJbmZvKCk8L2NvZGU+LCBhbmQgbWF5IGltcGxlbWVudAorICogYSByZXBsYWNlbWVudCBmb3IgPGNvZGU+aW52b2tlKCk8L2NvZGU+LgorICogPHA+CisgKiBBbGwgc3ViY2xhc3NlcyBvZiB0aGlzIGFic3RyYWN0IGJhc2UgY2xhc3Mgd2lsbCBpbmNsdWRlIHN1cHBvcnQgZm9yIGEKKyAqIFBpcGVsaW5lIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIHByb2Nlc3NpbmcgdG8gYmUgcGVyZm9ybWVkIGZvciBlYWNoIHJlcXVlc3QKKyAqIHJlY2VpdmVkIGJ5IHRoZSA8Y29kZT5pbnZva2UoKTwvY29kZT4gbWV0aG9kIG9mIHRoaXMgY2xhc3MsIHV0aWxpemluZyB0aGUKKyAqICJDaGFpbiBvZiBSZXNwb25zaWJpbGl0eSIgZGVzaWduIHBhdHRlcm4uICBBIHN1YmNsYXNzIHNob3VsZCBlbmNhcHN1bGF0ZSBpdHMKKyAqIG93biBwcm9jZXNzaW5nIGZ1bmN0aW9uYWxpdHkgYXMgYSA8Y29kZT5WYWx2ZTwvY29kZT4sIGFuZCBjb25maWd1cmUgdGhpcworICogVmFsdmUgaW50byB0aGUgcGlwZWxpbmUgYnkgY2FsbGluZyA8Y29kZT5zZXRCYXNpYygpPC9jb2RlPi4KKyAqIDxwPgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBmaXJlcyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzLCBwZXIgdGhlIEphdmFCZWFucyBkZXNpZ24KKyAqIHBhdHRlcm4sIGZvciBjaGFuZ2VzIGluIHNpbmdsZXRvbiBwcm9wZXJ0aWVzLiAgSW4gYWRkaXRpb24sIGl0IGZpcmVzIHRoZQorICogZm9sbG93aW5nIDxjb2RlPkNvbnRhaW5lckV2ZW50PC9jb2RlPiBldmVudHMgdG8gbGlzdGVuZXJzIHdobyByZWdpc3RlcgorICogdGhlbXNlbHZlcyB3aXRoIDxjb2RlPmFkZENvbnRhaW5lckxpc3RlbmVyKCk8L2NvZGU+OgorICogPHRhYmxlIGJvcmRlcj0xPgorICogICA8dHI+CisgKiAgICAgPHRoPlR5cGU8L3RoPgorICogICAgIDx0aD5EYXRhPC90aD4KKyAqICAgICA8dGg+RGVzY3JpcHRpb248L3RoPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgPHRkIGFsaWduPWNlbnRlcj48Y29kZT5hZGRDaGlsZDwvY29kZT48L3RkPgorICogICAgIDx0ZCBhbGlnbj1jZW50ZXI+PGNvZGU+Q29udGFpbmVyPC9jb2RlPjwvdGQ+CisgKiAgICAgPHRkPkNoaWxkIGNvbnRhaW5lciBhZGRlZCB0byB0aGlzIENvbnRhaW5lci48L3RkPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgPHRkIGFsaWduPWNlbnRlcj48Y29kZT5hZGRWYWx2ZTwvY29kZT48L3RkPgorICogICAgIDx0ZCBhbGlnbj1jZW50ZXI+PGNvZGU+VmFsdmU8L2NvZGU+PC90ZD4KKyAqICAgICA8dGQ+VmFsdmUgYWRkZWQgdG8gdGhpcyBDb250YWluZXIuPC90ZD4KKyAqICAgPC90cj4KKyAqICAgPHRyPgorICogICAgIDx0ZCBhbGlnbj1jZW50ZXI+PGNvZGU+cmVtb3ZlQ2hpbGQ8L2NvZGU+PC90ZD4KKyAqICAgICA8dGQgYWxpZ249Y2VudGVyPjxjb2RlPkNvbnRhaW5lcjwvY29kZT48L3RkPgorICogICAgIDx0ZD5DaGlsZCBjb250YWluZXIgcmVtb3ZlZCBmcm9tIHRoaXMgQ29udGFpbmVyLjwvdGQ+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICA8dGQgYWxpZ249Y2VudGVyPjxjb2RlPnJlbW92ZVZhbHZlPC9jb2RlPjwvdGQ+CisgKiAgICAgPHRkIGFsaWduPWNlbnRlcj48Y29kZT5WYWx2ZTwvY29kZT48L3RkPgorICogICAgIDx0ZD5WYWx2ZSByZW1vdmVkIGZyb20gdGhpcyBDb250YWluZXIuPC90ZD4KKyAqICAgPC90cj4KKyAqICAgPHRyPgorICogICAgIDx0ZCBhbGlnbj1jZW50ZXI+PGNvZGU+c3RhcnQ8L2NvZGU+PC90ZD4KKyAqICAgICA8dGQgYWxpZ249Y2VudGVyPjxjb2RlPm51bGw8L2NvZGU+PC90ZD4KKyAqICAgICA8dGQ+Q29udGFpbmVyIHdhcyBzdGFydGVkLjwvdGQ+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICA8dGQgYWxpZ249Y2VudGVyPjxjb2RlPnN0b3A8L2NvZGU+PC90ZD4KKyAqICAgICA8dGQgYWxpZ249Y2VudGVyPjxjb2RlPm51bGw8L2NvZGU+PC90ZD4KKyAqICAgICA8dGQ+Q29udGFpbmVyIHdhcyBzdG9wcGVkLjwvdGQ+CisgKiAgIDwvdHI+CisgKiA8L3RhYmxlPgorICogU3ViY2xhc3NlcyB0aGF0IGZpcmUgYWRkaXRpb25hbCBldmVudHMgc2hvdWxkIGRvY3VtZW50IHRoZW0gaW4gdGhlCisgKiBjbGFzcyBjb21tZW50cyBvZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRhaW5lckJhc2UKKyAgICBpbXBsZW1lbnRzIENvbnRhaW5lciwgTGlmZWN5Y2xlLCBQaXBlbGluZSwgTUJlYW5SZWdpc3RyYXRpb24sIFNlcmlhbGl6YWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggQ29udGFpbmVyQmFzZS5jbGFzcyApOworCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhZGRDaGlsZCB3aXRoIHRoZSBwZXJtaXNzaW9ucyBvZiB0aGlzIGNsYXNzLgorICAgICAqIGFkZENoaWxkIGNhbiBiZSBjYWxsZWQgd2l0aCB0aGUgWE1MIHBhcnNlciBvbiB0aGUgc3RhY2ssCisgICAgICogdGhpcyBhbGxvd3MgdGhlIFhNTCBwYXJzZXIgdG8gaGF2ZSBmZXdlciBwcml2aWxlZ2VzIHRoYW4KKyAgICAgKiBUb21jYXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGNsYXNzIFByaXZpbGVnZWRBZGRDaGlsZAorICAgICAgICBpbXBsZW1lbnRzIFByaXZpbGVnZWRBY3Rpb24geworCisgICAgICAgIHByaXZhdGUgQ29udGFpbmVyIGNoaWxkOworCisgICAgICAgIFByaXZpbGVnZWRBZGRDaGlsZChDb250YWluZXIgY2hpbGQpIHsKKyAgICAgICAgICAgIHRoaXMuY2hpbGQgPSBjaGlsZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworICAgICAgICAgICAgYWRkQ2hpbGRJbnRlcm5hbChjaGlsZCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGNoaWxkIENvbnRhaW5lcnMgYmVsb25naW5nIHRvIHRoaXMgQ29udGFpbmVyLCBrZXllZCBieSBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIGNoaWxkcmVuID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHByb2Nlc3NvciBkZWxheSBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBiYWNrZ3JvdW5kUHJvY2Vzc29yRGVsYXkgPSAtMTsKKworCisgICAgLyoqCisgICAgICogVGhlIGxpZmVjeWNsZSBldmVudCBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlmZWN5Y2xlU3VwcG9ydCBsaWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbnRhaW5lciBldmVudCBsaXN0ZW5lcnMgZm9yIHRoaXMgQ29udGFpbmVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBBcnJheUxpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTG9hZGVyIGltcGxlbWVudGF0aW9uIHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTG9hZGVyIGxvYWRlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBMb2dnZXIgaW1wbGVtZW50YXRpb24gd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBMb2cgbG9nZ2VyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlZCBsb2dnZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxvZ05hbWUgPSBudWxsOworICAgIAorCisgICAgLyoqCisgICAgICogVGhlIE1hbmFnZXIgaW1wbGVtZW50YXRpb24gd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYW5hZ2VyIG1hbmFnZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2x1c3RlciB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIENsdXN0ZXIgY2x1c3RlciA9IG51bGw7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGlzIENvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFyZW50IENvbnRhaW5lciB0byB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhIGNoaWxkLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb250YWluZXIgcGFyZW50ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHBhcmVudCBjbGFzcyBsb2FkZXIgdG8gYmUgY29uZmlndXJlZCB3aGVuIHdlIGluc3RhbGwgYSBMb2FkZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyIHBhcmVudENsYXNzTG9hZGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIFBpcGVsaW5lIG9iamVjdCB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFBpcGVsaW5lIHBpcGVsaW5lID0gbmV3IFN0YW5kYXJkUGlwZWxpbmUodGhpcyk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBSZWFsbSB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlYWxtIHJlYWxtID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlc291cmNlcyBEaXJDb250ZXh0IG9iamVjdCB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIERpckNvbnRleHQgcmVzb3VyY2VzID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZD8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplZD1mYWxzZTsKKworICAgIC8qKgorICAgICAqIFRoZSBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBzdXBwb3J0ID0gbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGJhY2tncm91bmQgdGhyZWFkLgorICAgICAqLworICAgIHByaXZhdGUgVGhyZWFkIHRocmVhZCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBiYWNrZ3JvdW5kIHRocmVhZCBjb21wbGV0aW9uIHNlbWFwaG9yZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdGhyZWFkRG9uZSA9IGZhbHNlOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkZWxheSBiZXR3ZWVuIHRoZSBpbnZvY2F0aW9uIG9mIHRoZSBiYWNrZ3JvdW5kUHJvY2VzcyBtZXRob2Qgb24KKyAgICAgKiB0aGlzIGNvbnRhaW5lciBhbmQgaXRzIGNoaWxkcmVuLiBDaGlsZCBjb250YWluZXJzIHdpbGwgbm90IGJlIGludm9rZWQKKyAgICAgKiBpZiB0aGVpciBkZWxheSB2YWx1ZSBpcyBub3QgbmVnYXRpdmUgKHdoaWNoIHdvdWxkIG1lYW4gdGhleSBhcmUgdXNpbmcgCisgICAgICogdGhlaXIgb3duIHRocmVhZCkuIFNldHRpbmcgdGhpcyB0byBhIHBvc2l0aXZlIHZhbHVlIHdpbGwgY2F1c2UgCisgICAgICogYSB0aHJlYWQgdG8gYmUgc3Bhd24uIEFmdGVyIHdhaXRpbmcgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSwgCisgICAgICogdGhlIHRocmVhZCB3aWxsIGludm9rZSB0aGUgZXhlY3V0ZVBlcmlvZGljIG1ldGhvZCBvbiB0aGlzIGNvbnRhaW5lciAKKyAgICAgKiBhbmQgYWxsIGl0cyBjaGlsZHJlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEJhY2tncm91bmRQcm9jZXNzb3JEZWxheSgpIHsKKyAgICAgICAgcmV0dXJuIGJhY2tncm91bmRQcm9jZXNzb3JEZWxheTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVsYXkgYmV0d2VlbiB0aGUgaW52b2NhdGlvbiBvZiB0aGUgZXhlY3V0ZSBtZXRob2Qgb24gdGhpcworICAgICAqIGNvbnRhaW5lciBhbmQgaXRzIGNoaWxkcmVuLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkZWxheSBUaGUgZGVsYXkgaW4gc2Vjb25kcyBiZXR3ZWVuIHRoZSBpbnZvY2F0aW9uIG9mIAorICAgICAqICAgICAgICAgICAgICBiYWNrZ3JvdW5kUHJvY2VzcyBtZXRob2RzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZFByb2Nlc3NvckRlbGF5KGludCBkZWxheSkgeworICAgICAgICBiYWNrZ3JvdW5kUHJvY2Vzc29yRGVsYXkgPSBkZWxheTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIENvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMb2FkZXIgd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLiAgSWYgdGhlcmUgaXMKKyAgICAgKiBubyBhc3NvY2lhdGVkIExvYWRlciwgcmV0dXJuIHRoZSBMb2FkZXIgYXNzb2NpYXRlZCB3aXRoIG91ciBwYXJlbnQKKyAgICAgKiBDb250YWluZXIgKGlmIGFueSk7IG90aGVyd2lzZSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXIgZ2V0TG9hZGVyKCkgeworCisgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobG9hZGVyKTsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChwYXJlbnQuZ2V0TG9hZGVyKCkpOworICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIExvYWRlciB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9hZGVyIFRoZSBuZXdseSBhc3NvY2lhdGVkIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRMb2FkZXIoTG9hZGVyIGxvYWRlcikgeworCisgICAgICAgIC8vIENoYW5nZSBjb21wb25lbnRzIGlmIG5lY2Vzc2FyeQorICAgICAgICBMb2FkZXIgb2xkTG9hZGVyID0gdGhpcy5sb2FkZXI7CisgICAgICAgIGlmIChvbGRMb2FkZXIgPT0gbG9hZGVyKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjsKKworICAgICAgICAvLyBTdG9wIHRoZSBvbGQgY29tcG9uZW50IGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoc3RhcnRlZCAmJiAob2xkTG9hZGVyICE9IG51bGwpICYmCisgICAgICAgICAgICAob2xkTG9hZGVyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgb2xkTG9hZGVyKS5zdG9wKCk7CisgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ29udGFpbmVyQmFzZS5zZXRMb2FkZXI6IHN0b3A6ICIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhcnQgdGhlIG5ldyBjb21wb25lbnQgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGxvYWRlci5zZXRDb250YWluZXIodGhpcyk7CisgICAgICAgIGlmIChzdGFydGVkICYmIChsb2FkZXIgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgIChsb2FkZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBsb2FkZXIpLnN0YXJ0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ29udGFpbmVyQmFzZS5zZXRMb2FkZXI6IHN0YXJ0OiAiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCB0aGlzIHByb3BlcnR5IGNoYW5nZSB0byBpbnRlcmVzdGVkIGxpc3RlbmVycworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgibG9hZGVyIiwgb2xkTG9hZGVyLCB0aGlzLmxvYWRlcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTG9nZ2VyIHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYXNzb2NpYXRlZC4gIElmIHRoZXJlIGlzCisgICAgICogbm8gYXNzb2NpYXRlZCBMb2dnZXIsIHJldHVybiB0aGUgTG9nZ2VyIGFzc29jaWF0ZWQgd2l0aCBvdXIgcGFyZW50CisgICAgICogQ29udGFpbmVyIChpZiBhbnkpOyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBMb2cgZ2V0TG9nZ2VyKCkgeworCisgICAgICAgIGlmIChsb2dnZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobG9nZ2VyKTsKKyAgICAgICAgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2cobG9nTmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIChsb2dnZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1hbmFnZXIgd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLiAgSWYgdGhlcmUgaXMKKyAgICAgKiBubyBhc3NvY2lhdGVkIE1hbmFnZXIsIHJldHVybiB0aGUgTWFuYWdlciBhc3NvY2lhdGVkIHdpdGggb3VyIHBhcmVudAorICAgICAqIENvbnRhaW5lciAoaWYgYW55KTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFuYWdlciBnZXRNYW5hZ2VyKCkgeworCisgICAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG1hbmFnZXIpOworICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHBhcmVudC5nZXRNYW5hZ2VyKCkpOworICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIE1hbmFnZXIgd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIG5ld2x5IGFzc29jaWF0ZWQgTWFuYWdlcgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRNYW5hZ2VyKE1hbmFnZXIgbWFuYWdlcikgeworCisgICAgICAgIC8vIENoYW5nZSBjb21wb25lbnRzIGlmIG5lY2Vzc2FyeQorICAgICAgICBNYW5hZ2VyIG9sZE1hbmFnZXIgPSB0aGlzLm1hbmFnZXI7CisgICAgICAgIGlmIChvbGRNYW5hZ2VyID09IG1hbmFnZXIpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7CisKKyAgICAgICAgLy8gU3RvcCB0aGUgb2xkIGNvbXBvbmVudCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKHN0YXJ0ZWQgJiYgKG9sZE1hbmFnZXIgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgIChvbGRNYW5hZ2VyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgb2xkTWFuYWdlcikuc3RvcCgpOworICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvbnRhaW5lckJhc2Uuc2V0TWFuYWdlcjogc3RvcDogIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCB0aGUgbmV3IGNvbXBvbmVudCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIG1hbmFnZXIuc2V0Q29udGFpbmVyKHRoaXMpOworICAgICAgICBpZiAoc3RhcnRlZCAmJiAobWFuYWdlciAhPSBudWxsKSAmJgorICAgICAgICAgICAgKG1hbmFnZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBtYW5hZ2VyKS5zdGFydCgpOworICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvbnRhaW5lckJhc2Uuc2V0TWFuYWdlcjogc3RhcnQ6ICIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHRoaXMgcHJvcGVydHkgY2hhbmdlIHRvIGludGVyZXN0ZWQgbGlzdGVuZXJzCisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJtYW5hZ2VyIiwgb2xkTWFuYWdlciwgdGhpcy5tYW5hZ2VyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIG9iamVjdCB3aGljaCBtYXkgYmUgdXRpbGl6ZWQgZm9yIG1hcHBpbmcgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRNYXBwaW5nT2JqZWN0KCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ2x1c3RlciB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuICBJZiB0aGVyZSBpcworICAgICAqIG5vIGFzc29jaWF0ZWQgQ2x1c3RlciwgcmV0dXJuIHRoZSBDbHVzdGVyIGFzc29jaWF0ZWQgd2l0aCBvdXIgcGFyZW50CisgICAgICogQ29udGFpbmVyIChpZiBhbnkpOyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBDbHVzdGVyIGdldENsdXN0ZXIoKSB7CisgICAgICAgIGlmIChjbHVzdGVyICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGNsdXN0ZXIpOworCisgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAocGFyZW50LmdldENsdXN0ZXIoKSk7CisKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ2x1c3RlciB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2x1c3RlciBUaGUgbmV3bHkgYXNzb2NpYXRlZCBDbHVzdGVyCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldENsdXN0ZXIoQ2x1c3RlciBjbHVzdGVyKSB7CisgICAgICAgIC8vIENoYW5nZSBjb21wb25lbnRzIGlmIG5lY2Vzc2FyeQorICAgICAgICBDbHVzdGVyIG9sZENsdXN0ZXIgPSB0aGlzLmNsdXN0ZXI7CisgICAgICAgIGlmIChvbGRDbHVzdGVyID09IGNsdXN0ZXIpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRoaXMuY2x1c3RlciA9IGNsdXN0ZXI7CisKKyAgICAgICAgLy8gU3RvcCB0aGUgb2xkIGNvbXBvbmVudCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKHN0YXJ0ZWQgJiYgKG9sZENsdXN0ZXIgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgIChvbGRDbHVzdGVyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgb2xkQ2x1c3Rlcikuc3RvcCgpOworICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvbnRhaW5lckJhc2Uuc2V0Q2x1c3Rlcjogc3RvcDogIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCB0aGUgbmV3IGNvbXBvbmVudCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKGNsdXN0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGNsdXN0ZXIuc2V0Q29udGFpbmVyKHRoaXMpOworCisgICAgICAgIGlmIChzdGFydGVkICYmIChjbHVzdGVyICE9IG51bGwpICYmCisgICAgICAgICAgICAoY2x1c3RlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNsdXN0ZXIpLnN0YXJ0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ29udGFpbmVyQmFzZS5zZXRDbHVzdGVyOiBzdGFydDogIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgdGhpcyBwcm9wZXJ0eSBjaGFuZ2UgdG8gaW50ZXJlc3RlZCBsaXN0ZW5lcnMKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImNsdXN0ZXIiLCBvbGRDbHVzdGVyLCB0aGlzLmNsdXN0ZXIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmFtZSBzdHJpbmcgKHN1aXRhYmxlIGZvciB1c2UgYnkgaHVtYW5zKSB0aGF0IGRlc2NyaWJlcyB0aGlzCisgICAgICogQ29udGFpbmVyLiAgV2l0aGluIHRoZSBzZXQgb2YgY2hpbGQgY29udGFpbmVycyBiZWxvbmdpbmcgdG8gYSBwYXJ0aWN1bGFyCisgICAgICogcGFyZW50LCBDb250YWluZXIgbmFtZXMgbXVzdCBiZSB1bmlxdWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCBhIG5hbWUgc3RyaW5nIChzdWl0YWJsZSBmb3IgdXNlIGJ5IGh1bWFucykgdGhhdCBkZXNjcmliZXMgdGhpcworICAgICAqIENvbnRhaW5lci4gIFdpdGhpbiB0aGUgc2V0IG9mIGNoaWxkIGNvbnRhaW5lcnMgYmVsb25naW5nIHRvIGEgcGFydGljdWxhcgorICAgICAqIHBhcmVudCwgQ29udGFpbmVyIG5hbWVzIG11c3QgYmUgdW5pcXVlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmV3IG5hbWUgb2YgdGhpcyBjb250YWluZXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgQ29udGFpbmVyIGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgKiAgYWRkZWQgdG8gdGhlIGNoaWxkcmVuIG9mIGEgcGFyZW50IENvbnRhaW5lciAoYWZ0ZXIgd2hpY2ggdGhlIG5hbWUKKyAgICAgKiAgbWF5IG5vdCBiZSBjaGFuZ2VkKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm5hbWUiLCBvbGROYW1lLCB0aGlzLm5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250YWluZXIgZm9yIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGEgY2hpbGQsIGlmIHRoZXJlIGlzCisgICAgICogb25lLiAgSWYgdGhlcmUgaXMgbm8gZGVmaW5lZCBwYXJlbnQsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGdldFBhcmVudCgpIHsKKworICAgICAgICByZXR1cm4gKHBhcmVudCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFyZW50IENvbnRhaW5lciB0byB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBiZWluZyBhZGRlZCBhcyBhCisgICAgICogY2hpbGQuICBUaGlzIENvbnRhaW5lciBtYXkgcmVmdXNlIHRvIGJlY29tZSBhdHRhY2hlZCB0byB0aGUgc3BlY2lmaWVkCisgICAgICogQ29udGFpbmVyIGJ5IHRocm93aW5nIGFuIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXIgQ29udGFpbmVyIHRvIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGJlaW5nIGFkZGVkCisgICAgICogIGFzIGEgY2hpbGQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgQ29udGFpbmVyIHJlZnVzZXMgdG8gYmVjb21lCisgICAgICogIGF0dGFjaGVkIHRvIHRoZSBzcGVjaWZpZWQgQ29udGFpbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KENvbnRhaW5lciBjb250YWluZXIpIHsKKworICAgICAgICBDb250YWluZXIgb2xkUGFyZW50ID0gdGhpcy5wYXJlbnQ7CisgICAgICAgIHRoaXMucGFyZW50ID0gY29udGFpbmVyOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicGFyZW50Iiwgb2xkUGFyZW50LCB0aGlzLnBhcmVudCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGFyZW50IGNsYXNzIGxvYWRlciAoaWYgYW55KSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICogVGhpcyBjYWxsIGlzIG1lYW5pbmdmdWwgb25seSA8c3Ryb25nPmFmdGVyPC9zdHJvbmc+IGEgTG9hZGVyIGhhcworICAgICAqIGJlZW4gY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0UGFyZW50Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgIGlmIChwYXJlbnRDbGFzc0xvYWRlciAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChwYXJlbnRDbGFzc0xvYWRlcik7CisgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChwYXJlbnQuZ2V0UGFyZW50Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyIChpZiBhbnkpIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKiBUaGlzIGNhbGwgaXMgbWVhbmluZ2Z1bCBvbmx5IDxzdHJvbmc+YmVmb3JlPC9zdHJvbmc+IGEgTG9hZGVyIGhhcworICAgICAqIGJlZW4gY29uZmlndXJlZCwgYW5kIHRoZSBzcGVjaWZpZWQgdmFsdWUgKGlmIG5vbi1udWxsKSBzaG91bGQgYmUKKyAgICAgKiBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIGNsYXNzIGxvYWRlciBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgbmV3IHBhcmVudCBjbGFzcyBsb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBwYXJlbnQpIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgb2xkUGFyZW50Q2xhc3NMb2FkZXIgPSB0aGlzLnBhcmVudENsYXNzTG9hZGVyOworICAgICAgICB0aGlzLnBhcmVudENsYXNzTG9hZGVyID0gcGFyZW50OworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicGFyZW50Q2xhc3NMb2FkZXIiLCBvbGRQYXJlbnRDbGFzc0xvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRDbGFzc0xvYWRlcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUGlwZWxpbmUgb2JqZWN0IHRoYXQgbWFuYWdlcyB0aGUgVmFsdmVzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgQ29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBQaXBlbGluZSBnZXRQaXBlbGluZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucGlwZWxpbmUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFJlYWxtIHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYXNzb2NpYXRlZC4gIElmIHRoZXJlIGlzCisgICAgICogbm8gYXNzb2NpYXRlZCBSZWFsbSwgcmV0dXJuIHRoZSBSZWFsbSBhc3NvY2lhdGVkIHdpdGggb3VyIHBhcmVudAorICAgICAqIENvbnRhaW5lciAoaWYgYW55KTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVhbG0gZ2V0UmVhbG0oKSB7CisKKyAgICAgICAgaWYgKHJlYWxtICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHJlYWxtKTsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChwYXJlbnQuZ2V0UmVhbG0oKSk7CisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgUmVhbG0gd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWxtIFRoZSBuZXdseSBhc3NvY2lhdGVkIFJlYWxtCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFJlYWxtKFJlYWxtIHJlYWxtKSB7CisKKyAgICAgICAgLy8gQ2hhbmdlIGNvbXBvbmVudHMgaWYgbmVjZXNzYXJ5CisgICAgICAgIFJlYWxtIG9sZFJlYWxtID0gdGhpcy5yZWFsbTsKKyAgICAgICAgaWYgKG9sZFJlYWxtID09IHJlYWxtKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB0aGlzLnJlYWxtID0gcmVhbG07CisKKyAgICAgICAgLy8gU3RvcCB0aGUgb2xkIGNvbXBvbmVudCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKHN0YXJ0ZWQgJiYgKG9sZFJlYWxtICE9IG51bGwpICYmCisgICAgICAgICAgICAob2xkUmVhbG0gaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBvbGRSZWFsbSkuc3RvcCgpOworICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvbnRhaW5lckJhc2Uuc2V0UmVhbG06IHN0b3A6ICIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhcnQgdGhlIG5ldyBjb21wb25lbnQgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChyZWFsbSAhPSBudWxsKQorICAgICAgICAgICAgcmVhbG0uc2V0Q29udGFpbmVyKHRoaXMpOworICAgICAgICBpZiAoc3RhcnRlZCAmJiAocmVhbG0gIT0gbnVsbCkgJiYKKyAgICAgICAgICAgIChyZWFsbSBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIHJlYWxtKS5zdGFydCgpOworICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvbnRhaW5lckJhc2Uuc2V0UmVhbG06IHN0YXJ0OiAiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCB0aGlzIHByb3BlcnR5IGNoYW5nZSB0byBpbnRlcmVzdGVkIGxpc3RlbmVycworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicmVhbG0iLCBvbGRSZWFsbSwgdGhpcy5yZWFsbSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlcyBEaXJDb250ZXh0IG9iamVjdCB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzCisgICAgICAqIGFzc29jaWF0ZWQuICBJZiB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIHJlc291cmNlcyBvYmplY3QsIHJldHVybiB0aGUKKyAgICAgICogcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBvdXIgcGFyZW50IENvbnRhaW5lciAoaWYgYW55KTsgb3RoZXJ3aXNlCisgICAgICAqIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyQ29udGV4dCBnZXRSZXNvdXJjZXMoKSB7CisgICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAocmVzb3VyY2VzKTsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChwYXJlbnQuZ2V0UmVzb3VyY2VzKCkpOworICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlc291cmNlcyBEaXJDb250ZXh0IG9iamVjdCB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzCisgICAgICogYXNzb2NpYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgVGhlIG5ld2x5IGFzc29jaWF0ZWQgRGlyQ29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRSZXNvdXJjZXMoRGlyQ29udGV4dCByZXNvdXJjZXMpIHsKKyAgICAgICAgLy8gQ2FsbGVkIGZyb20gU3RhbmRhcmRDb250ZXh0LnNldFJlc291cmNlcygpCisgICAgICAgIC8vICAgICAgICAgICAgICA8LSBTdGFuZGFyZENvbnRleHQuc3RhcnQoKSAKKyAgICAgICAgLy8gICAgICAgICAgICAgIDwtIENvbnRhaW5lckJhc2UuYWRkQ2hpbGRJbnRlcm5hbCgpIAorCisgICAgICAgIC8vIENoYW5nZSBjb21wb25lbnRzIGlmIG5lY2Vzc2FyeQorICAgICAgICBEaXJDb250ZXh0IG9sZFJlc291cmNlcyA9IHRoaXMucmVzb3VyY2VzOworICAgICAgICBpZiAob2xkUmVzb3VyY2VzID09IHJlc291cmNlcykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgSGFzaHRhYmxlIGVudiA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgaWYgKGdldFBhcmVudCgpICE9IG51bGwpCisgICAgICAgICAgICBlbnYucHV0KFByb3h5RGlyQ29udGV4dC5IT1NULCBnZXRQYXJlbnQoKS5nZXROYW1lKCkpOworICAgICAgICBlbnYucHV0KFByb3h5RGlyQ29udGV4dC5DT05URVhULCBnZXROYW1lKCkpOworICAgICAgICB0aGlzLnJlc291cmNlcyA9IG5ldyBQcm94eURpckNvbnRleHQoZW52LCByZXNvdXJjZXMpOworICAgICAgICAvLyBSZXBvcnQgdGhpcyBwcm9wZXJ0eSBjaGFuZ2UgdG8gaW50ZXJlc3RlZCBsaXN0ZW5lcnMKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInJlc291cmNlcyIsIG9sZFJlc291cmNlcywgdGhpcy5yZXNvdXJjZXMpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29udGFpbmVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGNoaWxkIENvbnRhaW5lciB0byB0aG9zZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250YWluZXIsCisgICAgICogaWYgc3VwcG9ydGVkLiAgUHJpb3IgdG8gYWRkaW5nIHRoaXMgQ29udGFpbmVyIHRvIHRoZSBzZXQgb2YgY2hpbGRyZW4sCisgICAgICogdGhlIGNoaWxkJ3MgPGNvZGU+c2V0UGFyZW50KCk8L2NvZGU+IG1ldGhvZCBtdXN0IGJlIGNhbGxlZCwgd2l0aCB0aGlzCisgICAgICogQ29udGFpbmVyIGFzIGFuIGFyZ3VtZW50LiAgVGhpcyBtZXRob2QgbWF5IHRocm93biBhbgorICAgICAqIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaWYgdGhpcyBDb250YWluZXIgY2hvb3NlcyBub3QKKyAgICAgKiB0byBiZSBhdHRhY2hlZCB0byB0aGUgc3BlY2lmaWVkIENvbnRhaW5lciwgaW4gd2hpY2ggY2FzZSBpdCBpcyBub3QgYWRkZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZCBOZXcgY2hpbGQgQ29udGFpbmVyIHRvIGJlIGFkZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkKKyAgICAgKiAgdGhlIDxjb2RlPnNldFBhcmVudCgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIGNoaWxkIENvbnRhaW5lcgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBuZXcgY2hpbGQgZG9lcyBub3QgaGF2ZQorICAgICAqICBhIG5hbWUgdW5pcXVlIGZyb20gdGhhdCBvZiBleGlzdGluZyBjaGlsZHJlbiBvZiB0aGlzIENvbnRhaW5lcgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgQ29udGFpbmVyIGRvZXMgbm90IHN1cHBvcnQKKyAgICAgKiAgY2hpbGQgQ29udGFpbmVycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKENvbnRhaW5lciBjaGlsZCkgeworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFByaXZpbGVnZWRBY3Rpb24gZHAgPQorICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWRkQ2hpbGQoY2hpbGQpOworICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoZHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkQ2hpbGRJbnRlcm5hbChjaGlsZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkQ2hpbGRJbnRlcm5hbChDb250YWluZXIgY2hpbGQpIHsKKworICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGQgY2hpbGQgIiArIGNoaWxkICsgIiAiICsgdGhpcyk7CisgICAgICAgIHN5bmNocm9uaXplZChjaGlsZHJlbikgeworICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmdldChjaGlsZC5nZXROYW1lKCkpICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWRkQ2hpbGQ6ICBDaGlsZCBuYW1lICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpcyBub3QgdW5pcXVlIik7CisgICAgICAgICAgICBjaGlsZC5zZXRQYXJlbnQodGhpcyk7ICAvLyBNYXkgdGhyb3cgSUFFCisgICAgICAgICAgICBjaGlsZHJlbi5wdXQoY2hpbGQuZ2V0TmFtZSgpLCBjaGlsZCk7CisKKyAgICAgICAgICAgIC8vIFN0YXJ0IGNoaWxkCisgICAgICAgICAgICBpZiAoc3RhcnRlZCAmJiAoY2hpbGQgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNoaWxkKS5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvbnRhaW5lckJhc2UuYWRkQ2hpbGQ6IHN0YXJ0OiAiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgKCJDb250YWluZXJCYXNlLmFkZENoaWxkOiBzdGFydDogIiArIGUpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucmVtb3ZlKGNoaWxkLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChBRERfQ0hJTERfRVZFTlQsIGNoaWxkKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjb250YWluZXIgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbnRhaW5lckxpc3RlbmVyKENvbnRhaW5lckxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgc3VwcG9ydC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjaGlsZCBDb250YWluZXIsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbnRhaW5lciwgd2l0aAorICAgICAqIHRoZSBzcGVjaWZpZWQgbmFtZSAoaWYgYW55KTsgb3RoZXJ3aXNlLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNoaWxkIENvbnRhaW5lciB0byBiZSByZXRyaWV2ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGZpbmRDaGlsZChTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBzeW5jaHJvbml6ZWQgKGNoaWxkcmVuKSB7ICAgICAgIC8vIFJlcXVpcmVkIGJ5IHBvc3Qtc3RhcnQgY2hhbmdlcworICAgICAgICAgICAgcmV0dXJuICgoQ29udGFpbmVyKSBjaGlsZHJlbi5nZXQobmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGNoaWxkcmVuIENvbnRhaW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGFpbmVyLgorICAgICAqIElmIHRoaXMgQ29udGFpbmVyIGhhcyBubyBjaGlsZHJlbiwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyW10gZmluZENoaWxkcmVuKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoY2hpbGRyZW4pIHsKKyAgICAgICAgICAgIENvbnRhaW5lciByZXN1bHRzW10gPSBuZXcgQ29udGFpbmVyW2NoaWxkcmVuLnNpemUoKV07CisgICAgICAgICAgICByZXR1cm4gKChDb250YWluZXJbXSkgY2hpbGRyZW4udmFsdWVzKCkudG9BcnJheShyZXN1bHRzKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgY29udGFpbmVyIGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250YWluZXIuCisgICAgICogSWYgdGhpcyBDb250YWluZXIgaGFzIG5vIHJlZ2lzdGVyZWQgY29udGFpbmVyIGxpc3RlbmVycywgYSB6ZXJvLWxlbmd0aAorICAgICAqIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXJMaXN0ZW5lcltdIGZpbmRDb250YWluZXJMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIENvbnRhaW5lckxpc3RlbmVyW10gcmVzdWx0cyA9IAorICAgICAgICAgICAgICAgIG5ldyBDb250YWluZXJMaXN0ZW5lcltsaXN0ZW5lcnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIHJldHVybiAoKENvbnRhaW5lckxpc3RlbmVyW10pIGxpc3RlbmVycy50b0FycmF5KHJlc3VsdHMpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgUmVxdWVzdCwgdG8gcHJvZHVjZSB0aGUgY29ycmVzcG9uZGluZyBSZXNwb25zZSwKKyAgICAgKiBieSBpbnZva2luZyB0aGUgZmlyc3QgVmFsdmUgaW4gb3VyIHBpcGVsaW5lIChpZiBhbnkpLCBvciB0aGUgYmFzaWMKKyAgICAgKiBWYWx2ZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSB0byBiZSBwcm9kdWNlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgbmVpdGhlciBhIHBpcGVsaW5lIG9yIGEgYmFzaWMKKyAgICAgKiAgVmFsdmUgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgZm9yIHRoaXMgQ29udGFpbmVyCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJyZWQgd2hpbGUKKyAgICAgKiAgcHJvY2Vzc2luZworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIFNlcnZsZXRFeGNlcHRpb24gd2FzIHRocm93bgorICAgICAqICB3aGlsZSBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHBpcGVsaW5lLmdldEZpcnN0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIGV4aXN0aW5nIGNoaWxkIENvbnRhaW5lciBmcm9tIGFzc29jaWF0aW9uIHdpdGggdGhpcyBwYXJlbnQKKyAgICAgKiBDb250YWluZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGQgRXhpc3RpbmcgY2hpbGQgQ29udGFpbmVyIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChDb250YWluZXIgY2hpbGQpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQoY2hpbGRyZW4pIHsKKyAgICAgICAgICAgIGlmIChjaGlsZHJlbi5nZXQoY2hpbGQuZ2V0TmFtZSgpKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNoaWxkcmVuLnJlbW92ZShjaGlsZC5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoc3RhcnRlZCAmJiAoY2hpbGQgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmKCBjaGlsZCBpbnN0YW5jZW9mIENvbnRhaW5lckJhc2UgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAoKENvbnRhaW5lckJhc2UpY2hpbGQpLnN0YXJ0ZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY2hpbGQpLnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjaGlsZCkuc3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDb250YWluZXJCYXNlLnJlbW92ZUNoaWxkOiBzdG9wOiAiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KFJFTU9WRV9DSElMRF9FVkVOVCwgY2hpbGQpOworICAgICAgICAKKyAgICAgICAgLy8gY2hpbGQuc2V0UGFyZW50KG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBjb250YWluZXIgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQ29udGFpbmVyTGlzdGVuZXIoQ29udGFpbmVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgeworICAgICAgICAgICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN1cHBvcnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcyAKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgQ29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgaXQgZnJvbSBiZWluZyBzdGFydGVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJjb250YWluZXJCYXNlLmFscmVhZHlTdGFydGVkIiwgbG9nTmFtZSgpKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RBUlRfRVZFTlQsIG51bGwpOworCisgICAgICAgIHN0YXJ0ZWQgPSB0cnVlOworCisgICAgICAgIC8vIFN0YXJ0IG91ciBzdWJvcmRpbmF0ZSBjb21wb25lbnRzLCBpZiBhbnkKKyAgICAgICAgaWYgKChsb2FkZXIgIT0gbnVsbCkgJiYgKGxvYWRlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpCisgICAgICAgICAgICAoKExpZmVjeWNsZSkgbG9hZGVyKS5zdGFydCgpOworICAgICAgICBsb2dnZXIgPSBudWxsOworICAgICAgICBnZXRMb2dnZXIoKTsKKyAgICAgICAgaWYgKChsb2dnZXIgIT0gbnVsbCkgJiYgKGxvZ2dlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpCisgICAgICAgICAgICAoKExpZmVjeWNsZSkgbG9nZ2VyKS5zdGFydCgpOworICAgICAgICBpZiAoKG1hbmFnZXIgIT0gbnVsbCkgJiYgKG1hbmFnZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKQorICAgICAgICAgICAgKChMaWZlY3ljbGUpIG1hbmFnZXIpLnN0YXJ0KCk7CisgICAgICAgIGlmICgoY2x1c3RlciAhPSBudWxsKSAmJiAoY2x1c3RlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpCisgICAgICAgICAgICAoKExpZmVjeWNsZSkgY2x1c3Rlcikuc3RhcnQoKTsKKyAgICAgICAgaWYgKChyZWFsbSAhPSBudWxsKSAmJiAocmVhbG0gaW5zdGFuY2VvZiBMaWZlY3ljbGUpKQorICAgICAgICAgICAgKChMaWZlY3ljbGUpIHJlYWxtKS5zdGFydCgpOworICAgICAgICBpZiAoKHJlc291cmNlcyAhPSBudWxsKSAmJiAocmVzb3VyY2VzIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkKKyAgICAgICAgICAgICgoTGlmZWN5Y2xlKSByZXNvdXJjZXMpLnN0YXJ0KCk7CisKKyAgICAgICAgLy8gU3RhcnQgb3VyIGNoaWxkIGNvbnRhaW5lcnMsIGlmIGFueQorICAgICAgICBDb250YWluZXIgY2hpbGRyZW5bXSA9IGZpbmRDaGlsZHJlbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBMaWZlY3ljbGUpCisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNoaWxkcmVuW2ldKS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhcnQgdGhlIFZhbHZlcyBpbiBvdXIgcGlwZWxpbmUgKGluY2x1ZGluZyB0aGUgYmFzaWMpLCBpZiBhbnkKKyAgICAgICAgaWYgKHBpcGVsaW5lIGluc3RhbmNlb2YgTGlmZWN5Y2xlKQorICAgICAgICAgICAgKChMaWZlY3ljbGUpIHBpcGVsaW5lKS5zdGFydCgpOworCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgLy8gU3RhcnQgb3VyIHRocmVhZAorICAgICAgICB0aHJlYWRTdGFydCgpOworCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChBRlRFUl9TVEFSVF9FVkVOVCwgbnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgc2h1dCBkb3duIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgQ29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmICghc3RhcnRlZCkgeworICAgICAgICAgICAgaWYobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoImNvbnRhaW5lckJhc2Uubm90U3RhcnRlZCIsIGxvZ05hbWUoKSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9TVE9QX0VWRU5ULCBudWxsKTsKKworICAgICAgICAvLyBTdG9wIG91ciB0aHJlYWQKKyAgICAgICAgdGhyZWFkU3RvcCgpOworCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVE9QX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworCisgICAgICAgIC8vIFN0b3AgdGhlIFZhbHZlcyBpbiBvdXIgcGlwZWxpbmUgKGluY2x1ZGluZyB0aGUgYmFzaWMpLCBpZiBhbnkKKyAgICAgICAgaWYgKHBpcGVsaW5lIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICAoKExpZmVjeWNsZSkgcGlwZWxpbmUpLnN0b3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3Agb3VyIGNoaWxkIGNvbnRhaW5lcnMsIGlmIGFueQorICAgICAgICBDb250YWluZXIgY2hpbGRyZW5bXSA9IGZpbmRDaGlsZHJlbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBMaWZlY3ljbGUpCisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNoaWxkcmVuW2ldKS5zdG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVtb3ZlIGNoaWxkcmVuIC0gc28gbmV4dCBzdGFydCBjYW4gd29yaworICAgICAgICBjaGlsZHJlbiA9IGZpbmRDaGlsZHJlbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICByZW1vdmVDaGlsZChjaGlsZHJlbltpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9wIG91ciBzdWJvcmRpbmF0ZSBjb21wb25lbnRzLCBpZiBhbnkKKyAgICAgICAgaWYgKChyZXNvdXJjZXMgIT0gbnVsbCkgJiYgKHJlc291cmNlcyBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgICgoTGlmZWN5Y2xlKSByZXNvdXJjZXMpLnN0b3AoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJlYWxtICE9IG51bGwpICYmIChyZWFsbSBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgICgoTGlmZWN5Y2xlKSByZWFsbSkuc3RvcCgpOworICAgICAgICB9CisgICAgICAgIGlmICgoY2x1c3RlciAhPSBudWxsKSAmJiAoY2x1c3RlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjbHVzdGVyKS5zdG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChtYW5hZ2VyICE9IG51bGwpICYmIChtYW5hZ2VyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgKChMaWZlY3ljbGUpIG1hbmFnZXIpLnN0b3AoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGxvZ2dlciAhPSBudWxsKSAmJiAobG9nZ2VyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgKChMaWZlY3ljbGUpIGxvZ2dlcikuc3RvcCgpOworICAgICAgICB9CisgICAgICAgIGlmICgobG9hZGVyICE9IG51bGwpICYmIChsb2FkZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAoKExpZmVjeWNsZSkgbG9hZGVyKS5zdG9wKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQUZURVJfU1RPUF9FVkVOVCwgbnVsbCk7CisKKyAgICB9CisKKyAgICAvKiogSW5pdCBtZXRob2QsIHBhcnQgb2YgdGhlIE1CZWFuIGxpZmVjeWNsZS4KKyAgICAgKiAgSWYgdGhlIGNvbnRhaW5lciB3YXMgYWRkZWQgdmlhIEpNWCwgaXQnbGwgcmVnaXN0ZXIgaXRzZWxmIHdpdGggdGhlIAorICAgICAqIHBhcmVudCwgdXNpbmcgdGhlIE9iamVjdE5hbWUgY29udmVudGlvbnMgdG8gbG9jYXRlIHRoZSBwYXJlbnQuCisgICAgICogCisgICAgICogIElmIHRoZSBjb250YWluZXIgd2FzIGFkZGVkIGRpcmVjdGx5IGFuZCBpdCBkb2Vzbid0IGhhdmUgYW4gT2JqZWN0TmFtZSwKKyAgICAgKiBpdCdsbCBjcmVhdGUgYSBuYW1lIGFuZCByZWdpc3RlciBpdHNlbGYgd2l0aCB0aGUgSk1YIGNvbnNvbGUuIE9uIGRlc3Ryb3koKSwgCisgICAgICogdGhlIG9iamVjdCB3aWxsIHVucmVnaXN0ZXIuCisgICAgICogCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmKCB0aGlzLmdldFBhcmVudCgpID09IG51bGwgKSB7CisgICAgICAgICAgICAvLyAiTGlmZSIgdXBkYXRlCisgICAgICAgICAgICBPYmplY3ROYW1lIHBhcmVudE5hbWU9Z2V0UGFyZW50TmFtZSgpOworCisgICAgICAgICAgICAvL2xvZy5pbmZvKCJSZWdpc3RlciAiICsgcGFyZW50TmFtZSApOworICAgICAgICAgICAgaWYoIHBhcmVudE5hbWUgIT0gbnVsbCAmJiAKKyAgICAgICAgICAgICAgICAgICAgbXNlcnZlci5pc1JlZ2lzdGVyZWQocGFyZW50TmFtZSkpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKHBhcmVudE5hbWUsICJhZGRDaGlsZCIsIG5ldyBPYmplY3RbXSB7IHRoaXMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Im9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyIn0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluaXRpYWxpemVkPXRydWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBPYmplY3ROYW1lIGdldFBhcmVudE5hbWUoKSB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmKCBzdGFydGVkICkgeworICAgICAgICAgICAgc3RvcCgpOworICAgICAgICB9CisgICAgICAgIGluaXRpYWxpemVkPWZhbHNlOworCisgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhpcyBjb21wb25lbnQKKyAgICAgICAgaWYgKCBvbmFtZSAhPSBudWxsICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiggY29udHJvbGxlciA9PSBvbmFtZSApIHsKKyAgICAgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC51bnJlZ2lzdGVyQ29tcG9uZW50KG9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInVucmVnaXN0ZXJpbmcgIiArIG9uYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoKCBUaHJvd2FibGUgdCApIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHVucmVnaXN0ZXJpbmcgIiwgdCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9wIG91ciBjaGlsZCBjb250YWluZXJzLCBpZiBhbnkKKyAgICAgICAgQ29udGFpbmVyIGNoaWxkcmVuW10gPSBmaW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcmVtb3ZlQ2hpbGQoY2hpbGRyZW5baV0pOworICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQaXBlbGluZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBWYWx2ZSB0byB0aGUgZW5kIG9mIHRoZSBwaXBlbGluZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIENvbnRhaW5lci4gIFByaW9yIHRvIGFkZGluZyB0aGUgVmFsdmUsIHRoZSBWYWx2ZSdzCisgICAgICogPGNvZGU+c2V0Q29udGFpbmVyPC9jb2RlPiBtZXRob2QgbXVzdCBiZSBjYWxsZWQsIHdpdGggdGhpcyBDb250YWluZXIKKyAgICAgKiBhcyBhbiBhcmd1bWVudC4gIFRoZSBtZXRob2QgbWF5IHRocm93IGFuCisgICAgICogPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpZiB0aGlzIFZhbHZlIGNob29zZXMgbm90IHRvCisgICAgICogYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGFpbmVyLCBvciA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+CisgICAgICogaWYgaXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJlbnQgQ29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHZlIFZhbHZlIHRvIGJlIGFkZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIENvbnRhaW5lciByZWZ1c2VkIHRvCisgICAgICogIGFjY2VwdCB0aGUgc3BlY2lmaWVkIFZhbHZlCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllIFZhbHZlIHJlZnVzZXMgdG8gYmUKKyAgICAgKiAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGFpbmVyCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBWYWx2ZSBpcyBhbHJlYWR5CisgICAgICogIGFzc29jaWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkVmFsdmUoVmFsdmUgdmFsdmUpIHsKKworICAgICAgICBwaXBlbGluZS5hZGRWYWx2ZSh2YWx2ZSk7CisgICAgICAgIGZpcmVDb250YWluZXJFdmVudChBRERfVkFMVkVfRVZFTlQsIHZhbHZlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZVtdIGdldFZhbHZlT2JqZWN0TmFtZXMoKSB7CisgICAgICAgIHJldHVybiAoKFN0YW5kYXJkUGlwZWxpbmUpcGlwZWxpbmUpLmdldFZhbHZlT2JqZWN0TmFtZXMoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogPHA+UmV0dXJuIHRoZSBWYWx2ZSBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIGRpc3Rpbmd1aXNoZWQgYXMgdGhlIGJhc2ljCisgICAgICogVmFsdmUgZm9yIHRoaXMgUGlwZWxpbmUgKGlmIGFueSkuCisgICAgICovCisgICAgcHVibGljIFZhbHZlIGdldEJhc2ljKCkgeworCisgICAgICAgIHJldHVybiAocGlwZWxpbmUuZ2V0QmFzaWMoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZmlyc3QgdmFsdmUgaW4gdGhlIHBpcGVsaW5lLgorICAgICAqLworICAgIHB1YmxpYyBWYWx2ZSBnZXRGaXJzdCgpIHsKKworICAgICAgICByZXR1cm4gKHBpcGVsaW5lLmdldEZpcnN0KCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBWYWx2ZXMgaW4gdGhlIHBpcGVsaW5lIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgICogQ29udGFpbmVyLCBpbmNsdWRpbmcgdGhlIGJhc2ljIFZhbHZlIChpZiBhbnkpLiAgSWYgdGhlcmUgYXJlIG5vCisgICAgICogc3VjaCBWYWx2ZXMsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFZhbHZlW10gZ2V0VmFsdmVzKCkgeworCisgICAgICAgIHJldHVybiAocGlwZWxpbmUuZ2V0VmFsdmVzKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBWYWx2ZSBmcm9tIHRoZSBwaXBlbGluZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIENvbnRhaW5lciwgaWYgaXQgaXMgZm91bmQ7IG90aGVyd2lzZSwgZG8gbm90aGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx2ZSBWYWx2ZSB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVZhbHZlKFZhbHZlIHZhbHZlKSB7CisKKyAgICAgICAgcGlwZWxpbmUucmVtb3ZlVmFsdmUodmFsdmUpOworICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoUkVNT1ZFX1ZBTFZFX0VWRU5ULCB2YWx2ZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiA8cD5TZXQgdGhlIFZhbHZlIGluc3RhbmNlIHRoYXQgaGFzIGJlZW4gZGlzdGluZ3Vpc2hlZCBhcyB0aGUgYmFzaWMKKyAgICAgKiBWYWx2ZSBmb3IgdGhpcyBQaXBlbGluZSAoaWYgYW55KS4gIFByaW9lciB0byBzZXR0aW5nIHRoZSBiYXNpYyBWYWx2ZSwKKyAgICAgKiB0aGUgVmFsdmUncyA8Y29kZT5zZXRDb250YWluZXIoKTwvY29kZT4gd2lsbCBiZSBjYWxsZWQsIGlmIGl0CisgICAgICogaW1wbGVtZW50cyA8Y29kZT5Db250YWluZWQ8L2NvZGU+LCB3aXRoIHRoZSBvd25pbmcgQ29udGFpbmVyIGFzIGFuCisgICAgICogYXJndW1lbnQuICBUaGUgbWV0aG9kIG1heSB0aHJvdyBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+CisgICAgICogaWYgdGhpcyBWYWx2ZSBjaG9vc2VzIG5vdCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250YWluZXIsIG9yCisgICAgICogPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPiBpZiBpdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aAorICAgICAqIGEgZGlmZmVyZW50IENvbnRhaW5lci48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdmUgVmFsdmUgdG8gYmUgZGlzdGluZ3Vpc2hlZCBhcyB0aGUgYmFzaWMgVmFsdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNpYyhWYWx2ZSB2YWx2ZSkgeworCisgICAgICAgIHBpcGVsaW5lLnNldEJhc2ljKHZhbHZlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSBhIHBlcmlvZGljIHRhc2ssIHN1Y2ggYXMgcmVsb2FkaW5nLCBldGMuIFRoaXMgbWV0aG9kIHdpbGwgYmUKKyAgICAgKiBpbnZva2VkIGluc2lkZSB0aGUgY2xhc3Nsb2FkaW5nIGNvbnRleHQgb2YgdGhpcyBjb250YWluZXIuIFVuZXhwZWN0ZWQKKyAgICAgKiB0aHJvd2FibGVzIHdpbGwgYmUgY2F1Z2h0IGFuZCBsb2dnZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmFja2dyb3VuZFByb2Nlc3MoKSB7CisgICAgICAgIAorICAgICAgICBpZiAoIXN0YXJ0ZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKGNsdXN0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjbHVzdGVyLmJhY2tncm91bmRQcm9jZXNzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiY29udGFpbmVyQmFzZS5iYWNrZ3JvdW5kUHJvY2Vzcy5jbHVzdGVyIiwgY2x1c3RlciksIGUpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9hZGVyLmJhY2tncm91bmRQcm9jZXNzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiY29udGFpbmVyQmFzZS5iYWNrZ3JvdW5kUHJvY2Vzcy5sb2FkZXIiLCBsb2FkZXIpLCBlKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYW5hZ2VyLmJhY2tncm91bmRQcm9jZXNzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiY29udGFpbmVyQmFzZS5iYWNrZ3JvdW5kUHJvY2Vzcy5tYW5hZ2VyIiwgbWFuYWdlciksIGUpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmVhbG0gIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZWFsbS5iYWNrZ3JvdW5kUHJvY2VzcygpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcoImNvbnRhaW5lckJhc2UuYmFja2dyb3VuZFByb2Nlc3MucmVhbG0iLCByZWFsbSksIGUpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBWYWx2ZSBjdXJyZW50ID0gcGlwZWxpbmUuZ2V0Rmlyc3QoKTsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjdXJyZW50LmJhY2tncm91bmRQcm9jZXNzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiY29udGFpbmVyQmFzZS5iYWNrZ3JvdW5kUHJvY2Vzcy52YWx2ZSIsIGN1cnJlbnQpLCBlKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5nZXROZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChMaWZlY3ljbGUuUEVSSU9ESUNfRVZFTlQsIG51bGwpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIE5vdGlmeSBhbGwgY29udGFpbmVyIGV2ZW50IGxpc3RlbmVycyB0aGF0IGEgcGFydGljdWxhciBldmVudCBoYXMKKyAgICAgKiBvY2N1cnJlZCBmb3IgdGhpcyBDb250YWluZXIuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcworICAgICAqIHRoaXMgbm90aWZpY2F0aW9uIHN5bmNocm9ub3VzbHkgdXNpbmcgdGhlIGNhbGxpbmcgdGhyZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgRXZlbnQgdHlwZQorICAgICAqIEBwYXJhbSBkYXRhIEV2ZW50IGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaXJlQ29udGFpbmVyRXZlbnQoU3RyaW5nIHR5cGUsIE9iamVjdCBkYXRhKSB7CisKKyAgICAgICAgaWYgKGxpc3RlbmVycy5zaXplKCkgPCAxKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBDb250YWluZXJFdmVudCBldmVudCA9IG5ldyBDb250YWluZXJFdmVudCh0aGlzLCB0eXBlLCBkYXRhKTsKKyAgICAgICAgQ29udGFpbmVyTGlzdGVuZXIgbGlzdFtdID0gbmV3IENvbnRhaW5lckxpc3RlbmVyWzBdOworICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgeworICAgICAgICAgICAgbGlzdCA9IChDb250YWluZXJMaXN0ZW5lcltdKSBsaXN0ZW5lcnMudG9BcnJheShsaXN0KTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAoKENvbnRhaW5lckxpc3RlbmVyKSBsaXN0W2ldKS5jb250YWluZXJFdmVudChldmVudCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWJicmV2aWF0ZWQgbmFtZSBvZiB0aGlzIGNvbnRhaW5lciBmb3IgbG9nZ2luZyBtZXNzc2FnZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxvZ05hbWUoKSB7CisKKyAgICAgICAgaWYgKGxvZ05hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGxvZ05hbWU7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGxvZ2dlck5hbWUgPSBudWxsOworICAgICAgICBDb250YWluZXIgY3VycmVudCA9IHRoaXM7CisgICAgICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY3VycmVudC5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAoKG5hbWUgPT0gbnVsbCkgfHwgKG5hbWUuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gIi8iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nZ2VyTmFtZSA9ICJbIiArIG5hbWUgKyAiXSIgCisgICAgICAgICAgICAgICAgKyAoKGxvZ2dlck5hbWUgIT0gbnVsbCkgPyAoIi4iICsgbG9nZ2VyTmFtZSkgOiAiIik7CisgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5nZXRQYXJlbnQoKTsKKyAgICAgICAgfQorICAgICAgICBsb2dOYW1lID0gQ29udGFpbmVyQmFzZS5jbGFzcy5nZXROYW1lKCkgKyAiLiIgKyBsb2dnZXJOYW1lOworICAgICAgICByZXR1cm4gbG9nTmFtZTsKKyAgICAgICAgCisgICAgfQorCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gSk1YIGFuZCBSZWdpc3RyYXRpb24gIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHJvdGVjdGVkIFN0cmluZyB0eXBlOworICAgIHByb3RlY3RlZCBTdHJpbmcgZG9tYWluOworICAgIHByb3RlY3RlZCBTdHJpbmcgc3VmZml4OworICAgIHByb3RlY3RlZCBPYmplY3ROYW1lIG9uYW1lOworICAgIHByb3RlY3RlZCBPYmplY3ROYW1lIGNvbnRyb2xsZXI7CisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBNQmVhblNlcnZlciBtc2VydmVyOworCisgICAgcHVibGljIE9iamVjdE5hbWUgZ2V0Sm14TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG9uYW1lOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE9iamVjdE5hbWUoKSB7CisgICAgICAgIGlmIChvbmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gb25hbWUudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICBpZiggZG9tYWluPT1udWxsICkgeworICAgICAgICAgICAgQ29udGFpbmVyIHBhcmVudD10aGlzOworICAgICAgICAgICAgd2hpbGUoIHBhcmVudCAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICEoIHBhcmVudCBpbnN0YW5jZW9mIFN0YW5kYXJkRW5naW5lKSApIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQ9cGFyZW50LmdldFBhcmVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHBhcmVudCBpbnN0YW5jZW9mIFN0YW5kYXJkRW5naW5lICkgeworICAgICAgICAgICAgICAgIGRvbWFpbj0oKFN0YW5kYXJkRW5naW5lKXBhcmVudCkuZ2V0RG9tYWluKCk7CisgICAgICAgICAgICB9IAorICAgICAgICB9CisgICAgICAgIHJldHVybiBkb21haW47CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RG9tYWluKFN0cmluZyBkb21haW4pIHsKKyAgICAgICAgdGhpcy5kb21haW49ZG9tYWluOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SlNSNzdTdWZmaXgoKSB7CisgICAgICAgIHJldHVybiBzdWZmaXg7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWUgcHJlUmVnaXN0ZXIoTUJlYW5TZXJ2ZXIgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG9uYW1lPW5hbWU7CisgICAgICAgIG1zZXJ2ZXI9c2VydmVyOworICAgICAgICBpZiAobmFtZSA9PSBudWxsICl7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGRvbWFpbj1uYW1lLmdldERvbWFpbigpOworCisgICAgICAgIHR5cGU9bmFtZS5nZXRLZXlQcm9wZXJ0eSgidHlwZSIpOworICAgICAgICBpZiggdHlwZT09bnVsbCApIHsKKyAgICAgICAgICAgIHR5cGU9bmFtZS5nZXRLZXlQcm9wZXJ0eSgiajJlZVR5cGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBqMmVlQXBwPW5hbWUuZ2V0S2V5UHJvcGVydHkoIkoyRUVBcHBsaWNhdGlvbiIpOworICAgICAgICBTdHJpbmcgajJlZVNlcnZlcj1uYW1lLmdldEtleVByb3BlcnR5KCJKMkVFU2VydmVyIik7CisgICAgICAgIGlmKCBqMmVlQXBwPT1udWxsICkgeworICAgICAgICAgICAgajJlZUFwcD0ibm9uZSI7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGoyZWVTZXJ2ZXI9PW51bGwgKSB7CisgICAgICAgICAgICBqMmVlU2VydmVyPSJub25lIjsKKyAgICAgICAgfQorICAgICAgICBzdWZmaXg9IixKMkVFQXBwbGljYXRpb249IiArIGoyZWVBcHAgKyAiLEoyRUVTZXJ2ZXI9IiArIGoyZWVTZXJ2ZXI7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3RSZWdpc3RlcihCb29sZWFuIHJlZ2lzdHJhdGlvbkRvbmUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXJlZ2lzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9zdERlcmVnaXN0ZXIoKSB7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWVbXSBnZXRDaGlsZHJlbigpIHsKKyAgICAgICAgT2JqZWN0TmFtZSByZXN1bHRbXT1uZXcgT2JqZWN0TmFtZVtjaGlsZHJlbi5zaXplKCldOworICAgICAgICBJdGVyYXRvciBpdD1jaGlsZHJlbi52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICBpbnQgaT0wOworICAgICAgICB3aGlsZSggaXQuaGFzTmV4dCgpICkgeworICAgICAgICAgICAgT2JqZWN0IG5leHQ9aXQubmV4dCgpOworICAgICAgICAgICAgaWYoIG5leHQgaW5zdGFuY2VvZiBDb250YWluZXJCYXNlICkgeworICAgICAgICAgICAgICAgIHJlc3VsdFtpKytdPSgoQ29udGFpbmVyQmFzZSluZXh0KS5nZXRKbXhOYW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBjcmVhdGVPYmplY3ROYW1lKFN0cmluZyBkb21haW4sIE9iamVjdE5hbWUgcGFyZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0ZSBPYmplY3ROYW1lICIgKyBkb21haW4gKyAiICIgKyBwYXJlbnQgKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb250YWluZXJTdWZmaXgoKSB7CisgICAgICAgIENvbnRhaW5lciBjb250YWluZXI9dGhpczsKKyAgICAgICAgQ29udGFpbmVyIGNvbnRleHQ9bnVsbDsKKyAgICAgICAgQ29udGFpbmVyIGhvc3Q9bnVsbDsKKyAgICAgICAgQ29udGFpbmVyIHNlcnZsZXQ9bnVsbDsKKyAgICAgICAgCisgICAgICAgIFN0cmluZ0J1ZmZlciBzdWZmaXg9bmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAKKyAgICAgICAgaWYoIGNvbnRhaW5lciBpbnN0YW5jZW9mIFN0YW5kYXJkSG9zdCApIHsKKyAgICAgICAgICAgIGhvc3Q9Y29udGFpbmVyOworICAgICAgICB9IGVsc2UgaWYoIGNvbnRhaW5lciBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCApIHsKKyAgICAgICAgICAgIGhvc3Q9Y29udGFpbmVyLmdldFBhcmVudCgpOworICAgICAgICAgICAgY29udGV4dD1jb250YWluZXI7CisgICAgICAgIH0gZWxzZSBpZiggY29udGFpbmVyIGluc3RhbmNlb2YgU3RhbmRhcmRXcmFwcGVyICkgeworICAgICAgICAgICAgY29udGV4dD1jb250YWluZXIuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBob3N0PWNvbnRleHQuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBzZXJ2bGV0PWNvbnRhaW5lcjsKKyAgICAgICAgfQorICAgICAgICBpZiggY29udGV4dCE9bnVsbCApIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoPSgoU3RhbmRhcmRDb250ZXh0KWNvbnRleHQpLmdldFBhdGgoKTsKKyAgICAgICAgICAgIHN1ZmZpeC5hcHBlbmQoIixwYXRoPSIpLmFwcGVuZCgocGF0aC5lcXVhbHMoIiIpKSA/ICIvIiA6IHBhdGgpOworICAgICAgICB9IAorICAgICAgICBpZiggaG9zdCE9bnVsbCApIHN1ZmZpeC5hcHBlbmQoIixob3N0PSIpLmFwcGVuZCggaG9zdC5nZXROYW1lKCkgKTsKKyAgICAgICAgaWYoIHNlcnZsZXQgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lPWNvbnRhaW5lci5nZXROYW1lKCk7CisgICAgICAgICAgICBzdWZmaXguYXBwZW5kKCIsc2VydmxldD0iKTsKKyAgICAgICAgICAgIHN1ZmZpeC5hcHBlbmQoKG5hbWU9PSIiKSA/ICIvIiA6IG5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdWZmaXgudG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHRocmVhZCB0aGF0IHdpbGwgcGVyaW9kaWNhbGx5IGNoZWNrIGZvcgorICAgICAqIHNlc3Npb24gdGltZW91dHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGhyZWFkU3RhcnQoKSB7CisKKyAgICAgICAgaWYgKHRocmVhZCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoYmFja2dyb3VuZFByb2Nlc3NvckRlbGF5IDw9IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdGhyZWFkRG9uZSA9IGZhbHNlOworICAgICAgICBTdHJpbmcgdGhyZWFkTmFtZSA9ICJDb250YWluZXJCYWNrZ3JvdW5kUHJvY2Vzc29yWyIgKyB0b1N0cmluZygpICsgIl0iOworICAgICAgICB0aHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBDb250YWluZXJCYWNrZ3JvdW5kUHJvY2Vzc29yKCksIHRocmVhZE5hbWUpOworICAgICAgICB0aHJlYWQuc2V0RGFlbW9uKHRydWUpOworICAgICAgICB0aHJlYWQuc3RhcnQoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgYmFja2dyb3VuZCB0aHJlYWQgdGhhdCBpcyBwZXJpb2RpY2FsbHkgY2hlY2tpbmcgZm9yCisgICAgICogc2Vzc2lvbiB0aW1lb3V0cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0aHJlYWRTdG9wKCkgeworCisgICAgICAgIGlmICh0aHJlYWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB0aHJlYWREb25lID0gdHJ1ZTsKKyAgICAgICAgdGhyZWFkLmludGVycnVwdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhyZWFkLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgOworICAgICAgICB9CisKKyAgICAgICAgdGhyZWFkID0gbnVsbDsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29udGFpbmVyRXhlY3V0ZURlbGF5IElubmVyIENsYXNzCisKKworICAgIC8qKgorICAgICAqIFByaXZhdGUgdGhyZWFkIGNsYXNzIHRvIGludm9rZSB0aGUgYmFja2dyb3VuZFByb2Nlc3MgbWV0aG9kIAorICAgICAqIG9mIHRoaXMgY29udGFpbmVyIGFuZCBpdHMgY2hpbGRyZW4gYWZ0ZXIgYSBmaXhlZCBkZWxheS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgY2xhc3MgQ29udGFpbmVyQmFja2dyb3VuZFByb2Nlc3NvciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB3aGlsZSAoIXRocmVhZERvbmUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoYmFja2dyb3VuZFByb2Nlc3NvckRlbGF5ICogMTAwMEwpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXRocmVhZERvbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyIHBhcmVudCA9IChDb250YWluZXIpIGdldE1hcHBpbmdPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuZ2V0TG9hZGVyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2wgPSBwYXJlbnQuZ2V0TG9hZGVyKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ2hpbGRyZW4ocGFyZW50LCBjbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NoaWxkcmVuKENvbnRhaW5lciBjb250YWluZXIsIENsYXNzTG9hZGVyIGNsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9hZGVyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRhaW5lci5nZXRMb2FkZXIoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGFpbmVyLmJhY2tncm91bmRQcm9jZXNzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXhjZXB0aW9uIGludm9raW5nIHBlcmlvZGljIG9wZXJhdGlvbjogIiwgdCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnRhaW5lcltdIGNoaWxkcmVuID0gY29udGFpbmVyLmZpbmRDaGlsZHJlbigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5nZXRCYWNrZ3JvdW5kUHJvY2Vzc29yRGVsYXkoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDaGlsZHJlbihjaGlsZHJlbltpXSwgY2wpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0R1bW15UmVxdWVzdC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvRHVtbXlSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2ZWZjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0R1bW15UmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsMjY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuV3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuTWVzc2FnZUJ5dGVzOworCisKKy8qKgorICogRHVtbXkgcmVxdWVzdCBvYmplY3QsIHVzZWQgZm9yIHJlcXVlc3QgZGlzcGF0Y2hlciBtYXBwaW5nLCBhcyB3ZWxsIGFzCisgKiBKU1AgcHJlY29tcGlsYXRpb24uCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRHVtbXlSZXF1ZXN0CisgICAgaW1wbGVtZW50cyBIdHRwU2VydmxldFJlcXVlc3QgeworCisgICAgcHVibGljIER1bW15UmVxdWVzdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgRHVtbXlSZXF1ZXN0KFN0cmluZyBjb250ZXh0UGF0aCwgU3RyaW5nIGRlY29kZWRVUkksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcXVlcnlTdHJpbmcpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoOworICAgICAgICB0aGlzLmRlY29kZWRVUkkgPSBkZWNvZGVkVVJJOworICAgICAgICB0aGlzLnF1ZXJ5U3RyaW5nID0gcXVlcnlTdHJpbmc7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0UGF0aCA9IG51bGw7CisgICAgcHJvdGVjdGVkIFN0cmluZyBkZWNvZGVkVVJJID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gbnVsbDsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aEluZm8gPSBudWxsOworICAgIHByb3RlY3RlZCBTdHJpbmcgc2VydmxldFBhdGggPSBudWxsOworICAgIHByb3RlY3RlZCBXcmFwcGVyIHdyYXBwZXIgPSBudWxsOworCisgICAgcHJvdGVjdGVkIEZpbHRlckNoYWluIGZpbHRlckNoYWluID0gbnVsbDsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBFbnVtZXJhdGlvbiBkdW1teUVudW0gPSBuZXcgRW51bWVyYXRpb24oKXsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCl7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIChjb250ZXh0UGF0aCk7CisgICAgfQorCisgICAgcHVibGljIE1lc3NhZ2VCeXRlcyBnZXRDb250ZXh0UGF0aE1CKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VydmxldFJlcXVlc3QgZ2V0UmVxdWVzdCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlY29kZWRSZXF1ZXN0VVJJKCkgeworICAgICAgICByZXR1cm4gZGVjb2RlZFVSSTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVzc2FnZUJ5dGVzIGdldERlY29kZWRSZXF1ZXN0VVJJTUIoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBGaWx0ZXJDaGFpbiBnZXRGaWx0ZXJDaGFpbigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmZpbHRlckNoYWluKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJDaGFpbihGaWx0ZXJDaGFpbiBmaWx0ZXJDaGFpbikgeworICAgICAgICB0aGlzLmZpbHRlckNoYWluID0gZmlsdGVyQ2hhaW47CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXJ5U3RyaW5nOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5U3RyaW5nKFN0cmluZyBxdWVyeSkgeworICAgICAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aEluZm8oKSB7CisgICAgICAgIHJldHVybiBwYXRoSW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoSW5mbyhTdHJpbmcgcGF0aCkgeworICAgICAgICBwYXRoSW5mbyA9IHBhdGg7CisgICAgfQorCisgICAgcHVibGljIE1lc3NhZ2VCeXRlcyBnZXRQYXRoSW5mb01CKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVzc2FnZUJ5dGVzIGdldFJlcXVlc3RQYXRoTUIoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldFBhdGgoKSB7CisgICAgICAgIHJldHVybiBzZXJ2bGV0UGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2bGV0UGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICBzZXJ2bGV0UGF0aCA9IHBhdGg7CisgICAgfQorCisgICAgcHVibGljIE1lc3NhZ2VCeXRlcyBnZXRTZXJ2bGV0UGF0aE1CKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgV3JhcHBlciBnZXRXcmFwcGVyKCkgeworICAgICAgICByZXR1cm4gKHRoaXMud3JhcHBlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0V3JhcHBlcihXcmFwcGVyIHdyYXBwZXIpIHsKKyAgICAgICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhvcml6YXRpb24oKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIHZvaWQgc2V0QXV0aG9yaXphdGlvbihTdHJpbmcgYXV0aG9yaXphdGlvbikge30KKyAgICBwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcigpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0b3IoQ29ubmVjdG9yIGNvbm5lY3Rvcikge30KKyAgICBwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7fQorICAgIHB1YmxpYyBIb3N0IGdldEhvc3QoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIHZvaWQgc2V0SG9zdChIb3N0IGhvc3QpIHt9CisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBSZXNwb25zZSBnZXRSZXNwb25zZSgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNwb25zZShSZXNwb25zZSByZXNwb25zZSkge30KKyAgICBwdWJsaWMgU29ja2V0IGdldFNvY2tldCgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRTb2NrZXQoU29ja2V0IHNvY2tldCkge30KKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0U3RyZWFtKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyB2b2lkIHNldFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dCkge30KKyAgICBwdWJsaWMgdm9pZCBhZGRMb2NhbGUoTG9jYWxlIGxvY2FsZSkge30KKyAgICBwdWJsaWMgU2VydmxldElucHV0U3RyZWFtIGNyZWF0ZUlucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGZpbmlzaFJlcXVlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24ge30KKyAgICBwdWJsaWMgT2JqZWN0IGdldE5vdGUoU3RyaW5nIG5hbWUpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Tm90ZU5hbWVzKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGUoU3RyaW5nIG5hbWUpIHt9CisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIHR5cGUpIHt9CisgICAgcHVibGljIHZvaWQgc2V0Tm90ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFByb3RvY29sKFN0cmluZyBwcm90b2NvbCkge30KKyAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGVBZGRyKFN0cmluZyByZW1vdGVBZGRyKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZUhvc3QoU3RyaW5nIHJlbW90ZUhvc3QpIHt9CisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1lKFN0cmluZyBzY2hlbWUpIHt9CisgICAgcHVibGljIHZvaWQgc2V0U2VydmVyTmFtZShTdHJpbmcgbmFtZSkge30KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQb3J0KGludCBwb3J0KSB7fQorICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCkgeyByZXR1cm4gLTE7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TGVuZ3RoKGludCBsZW5ndGgpIHt9CisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgU2VydmxldElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRMb2NhbGVzKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIEJ1ZmZlcmVkUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRSZWFsUGF0aChTdHJpbmcgcGF0aCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlQWRkcigpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUhvc3QoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWUoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJOYW1lKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBpbnQgZ2V0U2VydmVyUG9ydCgpIHsgcmV0dXJuIC0xOyB9CisgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkge30KKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkge30KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgZW5jKQorICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7fQorICAgIHB1YmxpYyB2b2lkIGFkZENvb2tpZShDb29raWUgY29va2llKSB7fQorICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7fQorICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlc1tdKSB7fQorICAgIHB1YmxpYyB2b2lkIGNsZWFyQ29va2llcygpIHt9CisgICAgcHVibGljIHZvaWQgY2xlYXJIZWFkZXJzKCkge30KKyAgICBwdWJsaWMgdm9pZCBjbGVhckxvY2FsZXMoKSB7fQorICAgIHB1YmxpYyB2b2lkIGNsZWFyUGFyYW1ldGVycygpIHt9CisgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHt9CisgICAgcHVibGljIHZvaWQgc2V0QXV0aFR5cGUoU3RyaW5nIGF1dGhUeXBlKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRQYXRoKFN0cmluZyBwYXRoKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZChTdHJpbmcgbWV0aG9kKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3RlZFNlc3Npb25Db29raWUoYm9vbGVhbiBmbGFnKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3RlZFNlc3Npb25JZChTdHJpbmcgaWQpIHt9CisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdGVkU2Vzc2lvblVSTChib29sZWFuIGZsYWcpIHt9CisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdFVSSShTdHJpbmcgdXJpKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFNlY3VyZShib29sZWFuIHNlY3VyZSkge30KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyUHJpbmNpcGFsKFByaW5jaXBhbCBwcmluY2lwYWwpIHt9CisgICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgTWFwIGdldFBhcmFtZXRlck1hcCgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UGFyYW1ldGVyTmFtZXMoKSB7IHJldHVybiBkdW1teUVudW07IH0KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBuYW1lKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFJlcXVlc3REaXNwYXRjaGVyIGdldFJlcXVlc3REaXNwYXRjaGVyKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhUeXBlKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBDb29raWVbXSBnZXRDb29raWVzKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBsb25nIGdldERhdGVIZWFkZXIoU3RyaW5nIG5hbWUpIHsgcmV0dXJuIC0xOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXIoU3RyaW5nIG5hbWUpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SGVhZGVycyhTdHJpbmcgbmFtZSkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRIZWFkZXJOYW1lcygpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgaW50IGdldEludEhlYWRlcihTdHJpbmcgbmFtZSkgeyByZXR1cm4gLTE7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhUcmFuc2xhdGVkKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlVXNlcigpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RlZFNlc3Npb25JZCgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RVUkkoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIHZvaWQgc2V0RGVjb2RlZFJlcXVlc3RVUkkoU3RyaW5nIHVyaSkge30KKyAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGdldFJlcXVlc3RVUkwoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oYm9vbGVhbiBjcmVhdGUpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVXJsKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZFZhbGlkKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgcHVibGljIFByaW5jaXBhbCBnZXRVc2VyUHJpbmNpcGFsKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxBZGRyKCkgeyByZXR1cm4gbnVsbDsgfSAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsgcmV0dXJuIC0xOyB9CisgICAgcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCkgeyByZXR1cm4gLTE7IH0KKyAgICAKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvRHVtbXlSZXNwb25zZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvRHVtbXlSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZjM2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9EdW1teVJlc3BvbnNlLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworCisKKy8qKgorICogRHVtbXkgcmVzcG9uc2Ugb2JqZWN0LCB1c2VkIGZvciBKU1AgcHJlY29tcGlsYXRpb24uCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRHVtbXlSZXNwb25zZQorICAgIGltcGxlbWVudHMgSHR0cFNlcnZsZXRSZXNwb25zZSB7CisKKyAgICBwdWJsaWMgRHVtbXlSZXNwb25zZSgpIHsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEFwcENvbW1pdHRlZChib29sZWFuIGFwcENvbW1pdHRlZCkge30KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FwcENvbW1pdHRlZCgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdG9yKENvbm5lY3RvciBjb25uZWN0b3IpIHt9CisgICAgcHVibGljIGludCBnZXRDb250ZW50Q291bnQoKSB7IHJldHVybiAtMTsgfQorICAgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChDb250ZXh0IGNvbnRleHQpIHt9CisgICAgcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVkZWQoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVkKGJvb2xlYW4gaW5jbHVkZWQpIHt9CisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBSZXF1ZXN0IGdldFJlcXVlc3QoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHt9CisgICAgcHVibGljIFNlcnZsZXRSZXNwb25zZSBnZXRSZXNwb25zZSgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldFN0cmVhbSgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJlYW0oT3V0cHV0U3RyZWFtIHN0cmVhbSkge30KKyAgICBwdWJsaWMgdm9pZCBzZXRTdXNwZW5kZWQoYm9vbGVhbiBzdXNwZW5kZWQpIHt9CisgICAgcHVibGljIGJvb2xlYW4gaXNTdXNwZW5kZWQoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHB1YmxpYyB2b2lkIHNldEVycm9yKCkge30KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBwdWJsaWMgU2VydmxldE91dHB1dFN0cmVhbSBjcmVhdGVPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgZmluaXNoUmVzcG9uc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24ge30KKyAgICBwdWJsaWMgaW50IGdldENvbnRlbnRMZW5ndGgoKSB7IHJldHVybiAtMTsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFByaW50V3JpdGVyIGdldFJlcG9ydGVyKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyB2b2lkIHJlY3ljbGUoKSB7fQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24ge30KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHt9CisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7fQorICAgIHB1YmxpYyB2b2lkIGZsdXNoQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHt9CisgICAgcHVibGljIGludCBnZXRCdWZmZXJTaXplKCkgeyByZXR1cm4gLTE7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlckVuY29kaW5nKFN0cmluZyBjaGFyRW5jb2RpbmcpIHt9CisgICAgcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWl0dGVkKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHt9CisgICAgcHVibGljIHZvaWQgcmVzZXRCdWZmZXIoKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldEJ1ZmZlclNpemUoaW50IHNpemUpIHt9CisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudExlbmd0aChpbnQgbGVuZ3RoKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyB0eXBlKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKSB7fQorCisgICAgcHVibGljIENvb2tpZVtdIGdldENvb2tpZXMoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXIoU3RyaW5nIG5hbWUpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SGVhZGVyTmFtZXMoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFN0cmluZ1tdIGdldEhlYWRlclZhbHVlcyhTdHJpbmcgbmFtZSkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsgcmV0dXJuIC0xOyB9CisgICAgcHVibGljIHZvaWQgcmVzZXQoaW50IHN0YXR1cywgU3RyaW5nIG1lc3NhZ2UpIHt9CisgICAgcHVibGljIHZvaWQgYWRkQ29va2llKENvb2tpZSBjb29raWUpIHt9CisgICAgcHVibGljIHZvaWQgYWRkRGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkge30KKyAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkge30KKyAgICBwdWJsaWMgdm9pZCBhZGRJbnRIZWFkZXIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkge30KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0hlYWRlcihTdHJpbmcgbmFtZSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VVJMKFN0cmluZyB1cmwpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VXJsKFN0cmluZyB1cmwpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVSTChTdHJpbmcgdXJsKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFN0cmluZyBlbmNvZGVVcmwoU3RyaW5nIHVybCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyB2b2lkIHNlbmRBY2tub3dsZWRnZW1lbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24ge30KKyAgICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHN0YXR1cykgdGhyb3dzIElPRXhjZXB0aW9uIHt9CisgICAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBzdGF0dXMsIFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24ge30KKyAgICBwdWJsaWMgdm9pZCBzZW5kUmVkaXJlY3QoU3RyaW5nIGxvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24ge30KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlSGVhZGVyKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc3RhdHVzKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc3RhdHVzLCBTdHJpbmcgbWVzc2FnZSkge30KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDFmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMCwwICsxLDE5MyBAQAorYXBwbGljYXRpb25Db250ZXh0LmF0dHJpYnV0ZUV2ZW50PUV4Y2VwdGlvbiB0aHJvd24gYnkgYXR0cmlidXRlcyBldmVudCBsaXN0ZW5lcgorYXBwbGljYXRpb25Db250ZXh0Lm1hcHBpbmcuZXJyb3I9RXJyb3IgZHVyaW5nIG1hcHBpbmcKK2FwcGxpY2F0aW9uQ29udGV4dC5yZXF1ZXN0RGlzcGF0Y2hlci5pYWU9UGF0aCB7MH0gZG9lcyBub3Qgc3RhcnQgd2l0aCBhICIvIiBjaGFyYWN0ZXIKK2FwcGxpY2F0aW9uQ29udGV4dC5yZXNvdXJjZVBhdGhzLmlhZT1QYXRoIHswfSBkb2VzIG5vdCBzdGFydCB3aXRoIGEgIi8iIGNoYXJhY3RlcgorYXBwbGljYXRpb25Db250ZXh0LnNldEF0dHJpYnV0ZS5uYW1lbnVsbD1OYW1lIGNhbm5vdCBiZSBudWxsCithcHBsaWNhdGlvbkRpc3BhdGNoZXIuYWxsb2NhdGVFeGNlcHRpb249QWxsb2NhdGUgZXhjZXB0aW9uIGZvciBzZXJ2bGV0IHswfQorYXBwbGljYXRpb25EaXNwYXRjaGVyLmRlYWxsb2NhdGVFeGNlcHRpb249RGVhbGxvY2F0ZSBleGNlcHRpb24gZm9yIHNlcnZsZXQgezB9CithcHBsaWNhdGlvbkRpc3BhdGNoZXIuZm9yd2FyZC5pc2U9Q2Fubm90IGZvcndhcmQgYWZ0ZXIgcmVzcG9uc2UgaGFzIGJlZW4gY29tbWl0dGVkCithcHBsaWNhdGlvbkRpc3BhdGNoZXIuZm9yd2FyZC50aHJvdz1Gb3J3YXJkZWQgcmVzb3VyY2UgdGhyZXcgYW4gZXhjZXB0aW9uCithcHBsaWNhdGlvbkRpc3BhdGNoZXIuaW5jbHVkZS50aHJvdz1JbmNsdWRlZCByZXNvdXJjZSB0aHJldyBhbiBleGNlcHRpb24KK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5pc1VuYXZhaWxhYmxlPVNlcnZsZXQgezB9IGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZQorYXBwbGljYXRpb25EaXNwYXRjaGVyLnNlcnZpY2VFeGNlcHRpb249U2VydmxldC5zZXJ2aWNlKCkgZm9yIHNlcnZsZXQgezB9IHRocmV3IGV4Y2VwdGlvbgorYXBwbGljYXRpb25EaXNwYXRjaGVyLnNwZWNWaW9sYXRpb24ucmVxdWVzdD1PcmlnaW5hbCBTZXZsZXRSZXF1ZXN0IG9yIHdyYXBwZWQgb3JpZ2luYWwgU2VydmxldFJlcXVlc3Qgbm90IHBhc3NlZCB0byBSZXF1ZXN0RGlzcGF0Y2hlciBpbiB2aW9sYXRpb24gb2YgU1JWLjguMiBhbmQgU1JWLjE0LjIuNS4xCithcHBsaWNhdGlvbkRpc3BhdGNoZXIuc3BlY1Zpb2xhdGlvbi5yZXNwb25zZT1PcmlnaW5hbCBTZXZsZXRSZXNwb25zZSBvciB3cmFwcGVkIG9yaWdpbmFsIFNlcnZsZXRSZXNwb25zZSBub3QgcGFzc2VkIHRvIFJlcXVlc3REaXNwYXRjaGVyIGluIHZpb2xhdGlvbiBvZiBTUlYuOC4yIGFuZCBTUlYuMTQuMi41LjEKK2FwcGxpY2F0aW9uUmVxdWVzdC5iYWRQYXJlbnQ9Q2Fubm90IGxvY2F0ZSBwYXJlbnQgUmVxdWVzdCBpbXBsZW1lbnRhdGlvbgorYXBwbGljYXRpb25SZXF1ZXN0LmJhZFJlcXVlc3Q9UmVxdWVzdCBpcyBub3QgYSBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0V3JhcHBlcgorYXBwbGljYXRpb25SZXNwb25zZS5iYWRQYXJlbnQ9Q2Fubm90IGxvY2F0ZSBwYXJlbnQgUmVzcG9uc2UgaW1wbGVtZW50YXRpb24KK2FwcGxpY2F0aW9uUmVzcG9uc2UuYmFkUmVzcG9uc2U9UmVzcG9uc2UgaXMgbm90IGEgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyCithcHJMaXN0ZW5lci5hcHJJbml0PVRoZSBBcGFjaGUgVG9tY2F0IE5hdGl2ZSBsaWJyYXJ5IHdoaWNoIGFsbG93cyBvcHRpbWFsIHBlcmZvcm1hbmNlIGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdhcyBub3QgZm91bmQgb24gdGhlIGphdmEubGlicmFyeS5wYXRoOiB7MH0KK2Fwckxpc3RlbmVyLnRjbkludmFsaWQ9QW4gaW5jb21wYXRpYmxlIHZlcnNpb24gezB9IG9mIHRoZSBBcGFjaGUgVG9tY2F0IE5hdGl2ZSBsaWJyYXJ5IGlzIGluc3RhbGxlZCwgd2hpbGUgVG9tY2F0IHJlcXVpcmVzIHZlcnNpb24gezF9IAorYXByTGlzdGVuZXIudGNuVmVyc2lvbj1BbiBvbGRlciB2ZXJzaW9uIHswfSBvZiB0aGUgQXBhY2hlIFRvbWNhdCBOYXRpdmUgbGlicmFyeSBpcyBpbnN0YWxsZWQsIHdoaWxlIFRvbWNhdCByZWNvbW1lbmRzIHZlcnNpb24gZ3JlYXRlciB0aGFuIHsxfQorYXByTGlzdGVuZXIuYXByRGVzdHJveT1GYWlsZWQgc2h1dGRvd24gb2YgQXBhY2hlIFBvcnRhYmxlIFJ1bnRpbWUKK2NvbnRhaW5lckJhc2UuYWRkRGVmYXVsdE1hcHBlcj1FeGNlcHRpb24gY29uZmlndXJpbmcgZGVmYXVsdCBtYXBwZXIgb2YgY2xhc3MgezB9Citjb250YWluZXJCYXNlLmFscmVhZHlTdGFydGVkPUNvbnRhaW5lciB7MH0gaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCitjb250YWluZXJCYXNlLm5vdENvbmZpZ3VyZWQ9Tm8gYmFzaWMgVmFsdmUgaGFzIGJlZW4gY29uZmlndXJlZAorY29udGFpbmVyQmFzZS5ub3RTdGFydGVkPUNvbnRhaW5lciB7MH0gaGFzIG5vdCBiZWVuIHN0YXJ0ZWQKK2NvbnRhaW5lckJhc2UuYmFja2dyb3VuZFByb2Nlc3MuY2x1c3Rlcj1FeGNlcHRpb24gcHJvY2Vzc2luZyBjbHVzdGVyIHswfSBiYWNrZ3JvdW5kIHByb2Nlc3MKK2NvbnRhaW5lckJhc2UuYmFja2dyb3VuZFByb2Nlc3MubG9hZGVyPUV4Y2VwdGlvbiBwcm9jZXNzaW5nIGxvYWRlciB7MH0gYmFja2dyb3VuZCBwcm9jZXNzCitjb250YWluZXJCYXNlLmJhY2tncm91bmRQcm9jZXNzLm1hbmFnZXI9RXhjZXB0aW9uIHByb2Nlc3NpbmcgbWFuYWdlciB7MH0gYmFja2dyb3VuZCBwcm9jZXNzCitjb250YWluZXJCYXNlLmJhY2tncm91bmRQcm9jZXNzLnJlYWxtPUV4Y2VwdGlvbiBwcm9jZXNzaW5nIHJlYWxtIHswfSBiYWNrZ3JvdW5kIHByb2Nlc3MKK2NvbnRhaW5lckJhc2UuYmFja2dyb3VuZFByb2Nlc3MudmFsdmU9RXhjZXB0aW9uIHByb2Nlc3NpbmcgdmFsdmUgezB9IGJhY2tncm91bmQgcHJvY2VzcworZmFzdEVuZ2luZU1hcHBlci5hbHJlYWR5U3RhcnRlZD1GYXN0RW5naW5lTWFwcGVyIHswfSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKK2Zhc3RFbmdpbmVNYXBwZXIubm90U3RhcnRlZD1GYXN0RW5naW5lTWFwcGVyIHswfSBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQKK2ZpbHRlckNoYWluLmZpbHRlcj1GaWx0ZXIgZXhlY3V0aW9uIHRocmV3IGFuIGV4Y2VwdGlvbgorZmlsdGVyQ2hhaW4uc2VydmxldD1TZXJ2bGV0IGV4ZWN1dGlvbiB0aHJldyBhbiBleGNlcHRpb24KK2h0dHBDb250ZXh0TWFwcGVyLmNvbnRhaW5lcj1UaGlzIGNvbnRhaW5lciBpcyBub3QgYSBTdGFuZGFyZENvbnRleHQKK2h0dHBFbmdpbmVNYXBwZXIuY29udGFpbmVyPVRoaXMgY29udGFpbmVyIGlzIG5vdCBhIFN0YW5kYXJkRW5naW5lCitodHRwSG9zdE1hcHBlci5jb250YWluZXI9VGhpcyBjb250YWluZXIgaXMgbm90IGEgU3RhbmRhcmRIb3N0CitpbnRlcmNlcHRvclZhbHZlLmFscmVhZHlTdGFydGVkPUludGVyY2VwdG9yVmFsdmUgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCitpbnRlcmNlcHRvclZhbHZlLm5vdFN0YXJ0ZWQ9SW50ZXJjZXB0b3JWYWx2ZSBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQKK25hbWluZy5iaW5kRmFpbGVkPUZhaWxlZCB0byBiaW5kIG9iamVjdDogezB9CituYW1pbmcuam14UmVnaXN0cmF0aW9uRmFpbGVkPUZhaWxlZCB0byByZWdpc3RlciBpbiBKTVg6IHswfQorbmFtaW5nLnVuYmluZEZhaWxlZD1GYWlsZWQgdG8gdW5iaW5kIG9iamVjdDogezB9CituYW1pbmcuaW52YWxpZEVudkVudHJ5VHlwZT1FbnZpcm9ubWVudCBlbnRyeSB7MH0gaGFzIGFuIGludmFsaWQgdHlwZQorbmFtaW5nLmludmFsaWRFbnZFbnRyeVZhbHVlPUVudmlyb25tZW50IGVudHJ5IHswfSBoYXMgYW4gaW52YWxpZCB2YWx1ZQorbmFtaW5nLm5hbWluZ0NvbnRleHRDcmVhdGlvbkZhaWxlZD1DcmVhdGlvbiBvZiB0aGUgbmFtaW5nIGNvbnRleHQgZmFpbGVkOiB7MH0KK3N0YW5kYXJkQ29udGV4dC5pbnZhbGlkV3JhcHBlckNsYXNzPXswfSBpcyBub3QgYSBzdWJjbGFzcyBvZiBTdGFuZGFyZFdyYXBwZXIKK3N0YW5kYXJkQ29udGV4dC5hbHJlYWR5U3RhcnRlZD1Db250ZXh0IGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorc3RhbmRhcmRDb250ZXh0LmFwcGxpY2F0aW9uTGlzdGVuZXI9RXJyb3IgY29uZmlndXJpbmcgYXBwbGljYXRpb24gbGlzdGVuZXIgb2YgY2xhc3MgezB9CitzdGFuZGFyZENvbnRleHQuYXBwbGljYXRpb25Ta2lwcGVkPVNraXBwZWQgaW5zdGFsbGluZyBhcHBsaWNhdGlvbiBsaXN0ZW5lcnMgZHVlIHRvIHByZXZpb3VzIGVycm9yKHMpCitzdGFuZGFyZENvbnRleHQuYmFkUmVxdWVzdD1JbnZhbGlkIHJlcXVlc3QgcGF0aCAoezB9KS4KK3N0YW5kYXJkQ29udGV4dC5jcmxmaW51cmw9VGhlIFVSTCBwYXR0ZXJuICJ7MH0iIGNvbnRhaW5zIGEgQ1Igb3IgTEYgYW5kIHNvIGNhbiBuZXZlciBiZSBtYXRjaGVkLgorc3RhbmRhcmRDb250ZXh0LmVycm9yUGFnZS5lcnJvcj1FcnJvciBwYWdlIGxvY2F0aW9uIHswfSBtdXN0IHN0YXJ0IHdpdGggYSAnJy8nJworc3RhbmRhcmRDb250ZXh0LmVycm9yUGFnZS5yZXF1aXJlZD1FcnJvclBhZ2UgY2Fubm90IGJlIG51bGwKK3N0YW5kYXJkQ29udGV4dC5lcnJvclBhZ2Uud2FybmluZz1XQVJOSU5HOiBFcnJvciBwYWdlIGxvY2F0aW9uIHswfSBtdXN0IHN0YXJ0IHdpdGggYSAnJy8nJyBpbiBTZXJ2bGV0IDIuNAorc3RhbmRhcmRDb250ZXh0LmZpbHRlck1hcC5laXRoZXI9RmlsdGVyIG1hcHBpbmcgbXVzdCBzcGVjaWZ5IGVpdGhlciBhIDx1cmwtcGF0dGVybj4gb3IgYSA8c2VydmxldC1uYW1lPgorc3RhbmRhcmRDb250ZXh0LmZpbHRlck1hcC5uYW1lPUZpbHRlciBtYXBwaW5nIHNwZWNpZmllcyBhbiB1bmtub3duIGZpbHRlciBuYW1lIHswfQorc3RhbmRhcmRDb250ZXh0LmZpbHRlck1hcC5wYXR0ZXJuPUludmFsaWQgPHVybC1wYXR0ZXJuPiB7MH0gaW4gZmlsdGVyIG1hcHBpbmcKK3N0YW5kYXJkQ29udGV4dC5maWx0ZXJTdGFydD1FeGNlcHRpb24gc3RhcnRpbmcgZmlsdGVyIHswfQorc3RhbmRhcmRDb250ZXh0LmZpbHRlclN0YXJ0RmFpbGVkPUZhaWxlZCB0byBzdGFydCBhcHBsaWNhdGlvbiBGaWx0ZXJzIHN1Y2Nlc3NmdWxseQorc3RhbmRhcmRDb250ZXh0LnJlcXVlc3RMaXN0ZW5lci5yZXF1ZXN0SW5pdD1FeGNlcHRpb24gc2VuZGluZyByZXF1ZXN0IGluaXRpYWxpemVkIGxpZmVjeWNsZSBldmVudCB0byBsaXN0ZW5lciBpbnN0YW5jZSBvZiBjbGFzcyB7MH0KK3N0YW5kYXJkQ29udGV4dC5yZXF1ZXN0TGlzdGVuZXIucmVxdWVzdERlc3Ryb3k9RXhjZXB0aW9uIHNlbmRpbmcgcmVxdWVzdCBkZXN0cm95ZWQgbGlmZWN5Y2xlIGV2ZW50IHRvIGxpc3RlbmVyIGluc3RhbmNlIG9mIGNsYXNzIHswfQorc3RhbmRhcmRDb250ZXh0LnJlcXVlc3RMaXN0ZW5lclN0YXJ0RmFpbGVkPUZhaWxlZCB0byBzdGFydCByZXF1ZXN0IGxpc3RlbmVyIHZhbHZlIHN1Y2Nlc3NmdWxseQorc3RhbmRhcmRDb250ZXh0LnJlcXVlc3RMaXN0ZW5lckNvbmZpZy5hZGRlZD1BZGRlZCByZXF1ZXN0IGxpc3RlbmVyIFZhbHZlCitzdGFuZGFyZENvbnRleHQucmVxdWVzdExpc3RlbmVyQ29uZmlnLmVycm9yPUV4Y2VwdGlvbiBhZGRpbmcgcmVxdWVzdCBsaXN0ZW5lciBWYWx2ZTogezB9CitzdGFuZGFyZENvbnRleHQuaXNVbmF2YWlsYWJsZT1UaGlzIGFwcGxpY2F0aW9uIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlCitzdGFuZGFyZENvbnRleHQubGlzdGVuZXJTdGFydD1FeGNlcHRpb24gc2VuZGluZyBjb250ZXh0IGluaXRpYWxpemVkIGV2ZW50IHRvIGxpc3RlbmVyIGluc3RhbmNlIG9mIGNsYXNzIHswfQorc3RhbmRhcmRDb250ZXh0Lmxpc3RlbmVyU3RhcnRGYWlsZWQ9RmFpbGVkIHRvIHN0YXJ0IGFwcGxpY2F0aW9uIExpc3RlbmVycyBzdWNjZXNzZnVsbHkKK3N0YW5kYXJkQ29udGV4dC5saXN0ZW5lclN0b3A9RXhjZXB0aW9uIHNlbmRpbmcgY29udGV4dCBkZXN0cm95ZWQgZXZlbnQgdG8gbGlzdGVuZXIgaW5zdGFuY2Ugb2YgY2xhc3MgezB9CitzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcuZXJyb3JQYWdlPUZvcm0gZXJyb3IgcGFnZSB7MH0gbXVzdCBzdGFydCB3aXRoIGEgJycvJworc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmVycm9yV2FybmluZz1XQVJOSU5HOiBGb3JtIGVycm9yIHBhZ2UgezB9IG11c3Qgc3RhcnQgd2l0aCBhICcnLycnIGluIFNlcnZsZXQgMi40CitzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcubG9naW5QYWdlPUZvcm0gbG9naW4gcGFnZSB7MH0gbXVzdCBzdGFydCB3aXRoIGEgJycvJworc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmxvZ2luV2FybmluZz1XQVJOSU5HOiBGb3JtIGxvZ2luIHBhZ2UgezB9IG11c3Qgc3RhcnQgd2l0aCBhICcnLycnIGluIFNlcnZsZXQgMi40CitzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcucmVxdWlyZWQ9TG9naW5Db25maWcgY2Fubm90IGJlIG51bGwKK3N0YW5kYXJkQ29udGV4dC5tYXBwaW5nRXJyb3I9TUFQUElORyBjb25maWd1cmF0aW9uIGVycm9yIGZvciByZWxhdGl2ZSBVUkkgezB9CitzdGFuZGFyZENvbnRleHQubm90Rm91bmQ9VGhlIHJlcXVlc3RlZCByZXNvdXJjZSAoezB9KSBpcyBub3QgYXZhaWxhYmxlLgorc3RhbmRhcmRDb250ZXh0Lm5vdFJlbG9hZGFibGU9UmVsb2FkaW5nIGlzIGRpc2FibGVkIG9uIHRoaXMgQ29udGV4dAorc3RhbmRhcmRDb250ZXh0Lm5vdFN0YXJ0ZWQ9Q29udGV4dCBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQKK3N0YW5kYXJkQ29udGV4dC5ub3RXcmFwcGVyPUNoaWxkIG9mIGEgQ29udGV4dCBtdXN0IGJlIGEgV3JhcHBlcgorc3RhbmRhcmRDb250ZXh0LnBhcmFtZXRlci5kdXBsaWNhdGU9RHVwbGljYXRlIGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHswfQorc3RhbmRhcmRDb250ZXh0LnBhcmFtZXRlci5yZXF1aXJlZD1Cb3RoIHBhcmFtZXRlciBuYW1lIGFuZCBwYXJhbWV0ZXIgdmFsdWUgYXJlIHJlcXVpcmVkCitzdGFuZGFyZENvbnRleHQucGF0aFJlcXVpcmVkPUNvbnRleHQgcGF0aCBtdXN0IGJlIGNvbmZpZ3VyZWQKK3N0YW5kYXJkQ29udGV4dC5yZWxvYWRpbmdDb21wbGV0ZWQ9UmVsb2FkaW5nIHRoaXMgQ29udGV4dCBpcyBjb21wbGV0ZWQKK3N0YW5kYXJkQ29udGV4dC5yZWxvYWRpbmdGYWlsZWQ9UmVsb2FkaW5nIHRoaXMgQ29udGV4dCBmYWlsZWQgZHVlIHRvIHByZXZpb3VzIGVycm9ycworc3RhbmRhcmRDb250ZXh0LnJlbG9hZGluZ1N0YXJ0ZWQ9UmVsb2FkaW5nIHRoaXMgQ29udGV4dCBoYXMgc3RhcnRlZAorc3RhbmRhcmRDb250ZXh0LnJlc291cmNlc1N0YXJ0PUVycm9yIHN0YXJ0aW5nIHN0YXRpYyBSZXNvdXJjZXMKK3N0YW5kYXJkQ29udGV4dC5zZWN1cml0eUNvbnN0cmFpbnQucGF0dGVybj1JbnZhbGlkIDx1cmwtcGF0dGVybj4gezB9IGluIHNlY3VyaXR5IGNvbnN0cmFpbnQKK3N0YW5kYXJkQ29udGV4dC5zZXJ2bGV0TWFwLm5hbWU9U2VydmxldCBtYXBwaW5nIHNwZWNpZmllcyBhbiB1bmtub3duIHNlcnZsZXQgbmFtZSB7MH0KK3N0YW5kYXJkQ29udGV4dC5zZXJ2bGV0TWFwLnBhdHRlcm49SW52YWxpZCA8dXJsLXBhdHRlcm4+IHswfSBpbiBzZXJ2bGV0IG1hcHBpbmcKK3N0YW5kYXJkQ29udGV4dC5zdGFydENsZWFudXA9RXhjZXB0aW9uIGR1cmluZyBjbGVhbnVwIGFmdGVyIHN0YXJ0IGZhaWxlZAorc3RhbmRhcmRDb250ZXh0LnN0YXJ0RmFpbGVkPUNvbnRleHQgW3swfV0gc3RhcnR1cCBmYWlsZWQgZHVlIHRvIHByZXZpb3VzIGVycm9ycworc3RhbmRhcmRDb250ZXh0LnN0YXJ0aW5nTG9hZGVyPUV4Y2VwdGlvbiBzdGFydGluZyBMb2FkZXIKK3N0YW5kYXJkQ29udGV4dC5zdGFydGluZ01hbmFnZXI9RXhjZXB0aW9uIHN0YXJ0aW5nIE1hbmFnZXIKK3N0YW5kYXJkQ29udGV4dC5zdGFydGluZ1dyYXBwZXI9RXhjZXB0aW9uIHN0YXJ0aW5nIFdyYXBwZXIgZm9yIHNlcnZsZXQgezB9CitzdGFuZGFyZENvbnRleHQuc3RvcHBpbmdDb250ZXh0PUV4Y2VwdGlvbiBzdG9wcGluZyBDb250ZXh0CitzdGFuZGFyZENvbnRleHQuc3RvcHBpbmdMb2FkZXI9RXhjZXB0aW9uIHN0b3BwaW5nIExvYWRlcgorc3RhbmRhcmRDb250ZXh0LnN0b3BwaW5nTWFuYWdlcj1FeGNlcHRpb24gc3RvcHBpbmcgTWFuYWdlcgorc3RhbmRhcmRDb250ZXh0LnN0b3BwaW5nV3JhcHBlcj1FeGNlcHRpb24gc3RvcHBpbmcgV3JhcHBlciBmb3Igc2VydmxldCB7MH0KK3N0YW5kYXJkQ29udGV4dC51cmxEZWNvZGU9Q2Fubm90IFVSTCBkZWNvZGUgcmVxdWVzdCBwYXRoIHswfQorc3RhbmRhcmRDb250ZXh0LnVybFBhdHRlcm4ucGF0dGVybldhcm5pbmc9V0FSTklORzogVVJMIHBhdHRlcm4gezB9IG11c3Qgc3RhcnQgd2l0aCBhICcnLycnIGluIFNlcnZsZXQgMi40CitzdGFuZGFyZENvbnRleHQudXJsVmFsaWRhdGU9Q2Fubm90IHZhbGlkYXRlIFVSTCBkZWNvZGVkIHJlcXVlc3QgcGF0aCB7MH0KK3N0YW5kYXJkQ29udGV4dC53cmFwcGVyLmVycm9yPUpTUCBmaWxlIHswfSBtdXN0IHN0YXJ0IHdpdGggYSAnJy8nCitzdGFuZGFyZENvbnRleHQud3JhcHBlci53YXJuaW5nPVdBUk5JTkc6IEpTUCBmaWxlIHswfSBtdXN0IHN0YXJ0IHdpdGggYSAnJy8nJyBpbiBTZXJ2bGV0IDIuNAorc3RhbmRhcmRFbmdpbmUuYWxyZWFkeVN0YXJ0ZWQ9RW5naW5lIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorc3RhbmRhcmRFbmdpbmUubWFwcGluZ0Vycm9yPU1BUFBJTkcgY29uZmlndXJhdGlvbiBlcnJvciBmb3Igc2VydmVyIG5hbWUgezB9CitzdGFuZGFyZEVuZ2luZS5ub0hvc3Q9Tm8gSG9zdCBtYXRjaGVzIHNlcnZlciBuYW1lIHswfQorc3RhbmRhcmRFbmdpbmUubm9Ib3N0SGVhZGVyPUhUVFAvMS4xIHJlcXVlc3Qgd2l0aCBubyBIb3N0OiBoZWFkZXIKK3N0YW5kYXJkRW5naW5lLm5vdEhvc3Q9Q2hpbGQgb2YgYW4gRW5naW5lIG11c3QgYmUgYSBIb3N0CitzdGFuZGFyZEVuZ2luZS5ub3RQYXJlbnQ9RW5naW5lIGNhbm5vdCBoYXZlIGEgcGFyZW50IENvbnRhaW5lcgorc3RhbmRhcmRFbmdpbmUubm90U3RhcnRlZD1FbmdpbmUgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCitzdGFuZGFyZEVuZ2luZS51bmZvdW5kSG9zdD1WaXJ0dWFsIGhvc3QgezB9IG5vdCBmb3VuZAorc3RhbmRhcmRFbmdpbmUudW5rbm93bkhvc3Q9Tm8gc2VydmVyIGhvc3Qgc3BlY2lmaWVkIGluIHRoaXMgcmVxdWVzdAorc3RhbmRhcmRFbmdpbmUudW5yZWdpc3Rlci5tYmVhbnMuZmFpbGVkPUVycm9yIGluIGRlc3Ryb3koKSBmb3IgbWJlYW4gZmlsZSB7MH0KK3N0YW5kYXJkSG9zdC5hY2Nlc3NCYXNlPUNhbm5vdCBhY2Nlc3MgZG9jdW1lbnQgYmFzZSBkaXJlY3RvcnkgezB9CitzdGFuZGFyZEhvc3QuYWxyZWFkeVN0YXJ0ZWQ9SG9zdCBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKK3N0YW5kYXJkSG9zdC5hcHBCYXNlPUFwcGxpY2F0aW9uIGJhc2UgZGlyZWN0b3J5IHswfSBkb2VzIG5vdCBleGlzdAorc3RhbmRhcmRIb3N0LmNsaWVudEFib3J0PVJlbW90ZSBDbGllbnQgQWJvcnRlZCBSZXF1ZXN0LCBJT0V4Y2VwdGlvbjogezB9CitzdGFuZGFyZEhvc3QuY29uZmlnUmVxdWlyZWQ9VVJMIHRvIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyByZXF1aXJlZAorc3RhbmRhcmRIb3N0LmNvbmZpZ05vdEFsbG93ZWQ9VXNlIG9mIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBub3QgYWxsb3dlZAorc3RhbmRhcmRIb3N0Lmluc3RhbGxCYXNlPU9ubHkgd2ViIGFwcGxpY2F0aW9ucyBpbiB0aGUgSG9zdCB3ZWIgYXBwbGljYXRpb24gZGlyZWN0b3J5IGNhbiBiZSBpbnN0YWxsZWQKK3N0YW5kYXJkSG9zdC5pbnN0YWxsaW5nPUluc3RhbGxpbmcgd2ViIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCB7MH0gZnJvbSBVUkwgezF9CitzdGFuZGFyZEhvc3QuaW5zdGFsbGluZ1dBUj1JbnN0YWxsaW5nIHdlYiBhcHBsaWNhdGlvbiBmcm9tIFVSTCB7MH0KK3N0YW5kYXJkSG9zdC5pbnN0YWxsaW5nWE1MPVByb2Nlc3NpbmcgQ29udGV4dCBjb25maWd1cmF0aW9uIGZpbGUgVVJMIHswfQorc3RhbmRhcmRIb3N0Lmluc3RhbGxFcnJvcj1FcnJvciBkZXBsb3lpbmcgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIHswfQorc3RhbmRhcmRIb3N0LmludmFsaWRFcnJvclJlcG9ydFZhbHZlQ2xhc3M9Q291bGRuJyd0IGxvYWQgc3BlY2lmaWVkIGVycm9yIHJlcG9ydCB2YWx2ZSBjbGFzczogezB9CitzdGFuZGFyZEhvc3QuZG9jQmFzZT1Eb2N1bWVudCBiYXNlIGRpcmVjdG9yeSB7MH0gYWxyZWFkeSBleGlzdHMKK3N0YW5kYXJkSG9zdC5tYXBwaW5nRXJyb3I9TUFQUElORyBjb25maWd1cmF0aW9uIGVycm9yIGZvciByZXF1ZXN0IFVSSSB7MH0KK3N0YW5kYXJkSG9zdC5ub0NvbnRleHQ9Tm8gQ29udGV4dCBjb25maWd1cmVkIHRvIHByb2Nlc3MgdGhpcyByZXF1ZXN0CitzdGFuZGFyZEhvc3Qubm9Ib3N0PU5vIEhvc3QgY29uZmlndXJlZCB0byBwcm9jZXNzIHRoaXMgcmVxdWVzdAorc3RhbmRhcmRIb3N0Lm5vdENvbnRleHQ9Q2hpbGQgb2YgYSBIb3N0IG11c3QgYmUgYSBDb250ZXh0CitzdGFuZGFyZEhvc3Qubm90U3RhcnRlZD1Ib3N0IGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZAorc3RhbmRhcmRIb3N0Lm51bGxOYW1lPUhvc3QgbmFtZSBpcyByZXF1aXJlZAorc3RhbmRhcmRIb3N0LnBhdGhGb3JtYXQ9SW52YWxpZCBjb250ZXh0IHBhdGg6IHswfQorc3RhbmRhcmRIb3N0LnBhdGhNYXRjaD1Db250ZXh0IHBhdGggezB9IG11c3QgbWF0Y2ggdGhlIGRpcmVjdG9yeSBvciBXQVIgZmlsZSBuYW1lOiB7MX0KK3N0YW5kYXJkSG9zdC5wYXRoTWlzc2luZz1Db250ZXh0IHBhdGggezB9IGlzIG5vdCBjdXJyZW50bHkgaW4gdXNlCitzdGFuZGFyZEhvc3QucGF0aFJlcXVpcmVkPUNvbnRleHQgcGF0aCBpcyByZXF1aXJlZAorc3RhbmRhcmRIb3N0LnBhdGhVc2VkPUNvbnRleHQgcGF0aCB7MH0gaXMgYWxyZWFkeSBpbiB1c2UKK3N0YW5kYXJkSG9zdC5yZW1vdmluZz1SZW1vdmluZyB3ZWIgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIHswfQorc3RhbmRhcmRIb3N0LnJlbW92ZUVycm9yPUVycm9yIHJlbW92aW5nIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCB7MH0KK3N0YW5kYXJkSG9zdC5zdGFydD1TdGFydGluZyB3ZWIgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIHswfQorc3RhbmRhcmRIb3N0LnN0b3A9U3RvcHBpbmcgd2ViIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCB7MH0KK3N0YW5kYXJkSG9zdC51bmZvdW5kQ29udGV4dD1DYW5ub3QgZmluZCBjb250ZXh0IGZvciByZXF1ZXN0IFVSSSB7MH0KK3N0YW5kYXJkSG9zdC53YXJSZXF1aXJlZD1VUkwgdG8gd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgaXMgcmVxdWlyZWQKK3N0YW5kYXJkSG9zdC53YXJVUkw9SW52YWxpZCBVUkwgZm9yIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlOiB7MH0KK3N0YW5kYXJkSG9zdC52YWxpZGF0aW9uRW5hYmxlZD1YTUwgdmFsaWRhdGlvbiBlbmFibGVkCitzdGFuZGFyZEhvc3QudmFsaWRhdGlvbkRpc2FibGVkPVhNTCB2YWxpZGF0aW9uIGRpc2FibGVkCitzdGFuZGFyZFBpcGVsaW5lLmFscmVhZHlTdGFydGVkPVBpcGVsaW5lIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorc3RhbmRhcmRQaXBlbGluZS5ub3RTdGFydGVkPVBpcGVsaW5lIGhhcyBub3QgYmVlbiBzdGFydGVkCitzdGFuZGFyZFBpcGVsaW5lLm5vVmFsdmU9Tm8gbW9yZSBWYWx2ZXMgaW4gdGhlIFBpcGVsaW5lIHByb2Nlc3NpbmcgdGhpcyByZXF1ZXN0CitzdGFuZGFyZFNlcnZlci5hZGRDb250YWluZXIuaXNlPU5vIGNvbm5lY3RvcnMgYXZhaWxhYmxlIHRvIGFzc29jaWF0ZSB0aGlzIGNvbnRhaW5lciB3aXRoCitzdGFuZGFyZFNlcnZlci5pbml0aWFsaXplLmluaXRpYWxpemVkPVRoaXMgc2VydmVyIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQKK3N0YW5kYXJkU2VydmVyLnN0YXJ0LmNvbm5lY3RvcnM9QXQgbGVhc3Qgb25lIGNvbm5lY3RvciBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBjb250YWluZXIKK3N0YW5kYXJkU2VydmVyLnN0YXJ0LnN0YXJ0ZWQ9VGhpcyBzZXJ2ZXIgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCitzdGFuZGFyZFNlcnZlci5zdG9wLm5vdFN0YXJ0ZWQ9VGhpcyBzZXJ2ZXIgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCitzdGFuZGFyZFNlcnZpY2UuaW5pdGlhbGl6ZS5pbml0aWFsaXplZD1UaGlzIHNlcnZpY2UgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZAorc3RhbmRhcmRTZXJ2aWNlLmluaXRpYWxpemUuZmFpbGVkPVNlcnZpY2UgaW5pdGlhbGl6aW5nIGF0IHswfSBmYWlsZWQKK3N0YW5kYXJkU2VydmljZS5yZWdpc3Rlci5mYWlsZWQ9RXJyb3IgcmVnaXN0ZXJpbmcgU2VydmljZSBhdCBkb21haW4gezB9CitzdGFuZGFyZFNlcnZpY2Uuc3RhcnQubmFtZT1TdGFydGluZyBzZXJ2aWNlIHswfQorc3RhbmRhcmRTZXJ2aWNlLnN0YXJ0LnN0YXJ0ZWQ9VGhpcyBzZXJ2aWNlIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorc3RhbmRhcmRTZXJ2aWNlLnN0b3AubmFtZT1TdG9wcGluZyBzZXJ2aWNlIHswfQorc3RhbmRhcmRTZXJ2aWNlLnN0b3Aubm90U3RhcnRlZD1UaGlzIHNlcnZpY2UgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCitzdGFuZGFyZFdyYXBwZXIuYWxsb2NhdGU9RXJyb3IgYWxsb2NhdGluZyBhIHNlcnZsZXQgaW5zdGFuY2UKK3N0YW5kYXJkV3JhcHBlci5hbGxvY2F0ZUV4Y2VwdGlvbj1BbGxvY2F0ZSBleGNlcHRpb24gZm9yIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuY29udGFpbmVyU2VydmxldD1Mb2FkaW5nIGNvbnRhaW5lciBzZXJ2bGV0IHswfQorc3RhbmRhcmRXcmFwcGVyLmNyZWF0ZUZpbHRlcnM9Q3JlYXRlIGZpbHRlcnMgZXhjZXB0aW9uIGZvciBzZXJ2bGV0IHswfQorc3RhbmRhcmRXcmFwcGVyLmRlYWxsb2NhdGVFeGNlcHRpb249RGVhbGxvY2F0ZSBleGNlcHRpb24gZm9yIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuZGVzdHJveUV4Y2VwdGlvbj1TZXJ2bGV0LmRlc3Ryb3koKSBmb3Igc2VydmxldCB7MH0gdGhyZXcgZXhjZXB0aW9uCitzdGFuZGFyZFdyYXBwZXIuZXhjZXB0aW9uMD1Ub21jYXQgRXhjZXB0aW9uIFJlcG9ydAorc3RhbmRhcmRXcmFwcGVyLmV4Y2VwdGlvbjE9QSBTZXJ2bGV0IEV4Y2VwdGlvbiBIYXMgT2NjdXJyZWQKK3N0YW5kYXJkV3JhcHBlci5leGNlcHRpb24yPUV4Y2VwdGlvbiBSZXBvcnQ6CitzdGFuZGFyZFdyYXBwZXIuZXhjZXB0aW9uMz1Sb290IENhdXNlOgorc3RhbmRhcmRXcmFwcGVyLmluaXRFeGNlcHRpb249U2VydmxldC5pbml0KCkgZm9yIHNlcnZsZXQgezB9IHRocmV3IGV4Y2VwdGlvbgorc3RhbmRhcmRXcmFwcGVyLmluc3RhbnRpYXRlPUVycm9yIGluc3RhbnRpYXRpbmcgc2VydmxldCBjbGFzcyB7MH0KK3N0YW5kYXJkV3JhcHBlci5pc1VuYXZhaWxhYmxlPVNlcnZsZXQgezB9IGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZQorc3RhbmRhcmRXcmFwcGVyLmphc3BlckxvYWRlcj1Vc2luZyBKYXNwZXIgY2xhc3Nsb2FkZXIgZm9yIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuanNwRmlsZS5mb3JtYXQ9SlNQIGZpbGUgezB9IGRvZXMgbm90IHN0YXJ0IHdpdGggYSAnJy8nJyBjaGFyYWN0ZXIKK3N0YW5kYXJkV3JhcHBlci5sb2FkRXhjZXB0aW9uPVNlcnZsZXQgezB9IHRocmV3IGxvYWQoKSBleGNlcHRpb24KK3N0YW5kYXJkV3JhcHBlci5taXNzaW5nQ2xhc3M9V3JhcHBlciBjYW5ub3QgZmluZCBzZXJ2bGV0IGNsYXNzIHswfSBvciBhIGNsYXNzIGl0IGRlcGVuZHMgb24KK3N0YW5kYXJkV3JhcHBlci5taXNzaW5nTG9hZGVyPVdyYXBwZXIgY2Fubm90IGZpbmQgTG9hZGVyIGZvciBzZXJ2bGV0IHswfQorc3RhbmRhcmRXcmFwcGVyLm5vdENoaWxkPVdyYXBwZXIgY29udGFpbmVyIG1heSBub3QgaGF2ZSBjaGlsZCBjb250YWluZXJzCitzdGFuZGFyZFdyYXBwZXIubm90Q2xhc3M9Tm8gc2VydmxldCBjbGFzcyBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIubm90Q29udGV4dD1QYXJlbnQgY29udGFpbmVyIG9mIGEgV3JhcHBlciBtdXN0IGJlIGEgQ29udGV4dAorc3RhbmRhcmRXcmFwcGVyLm5vdEZvdW5kPVNlcnZsZXQgezB9IGlzIG5vdCBhdmFpbGFibGUKK3N0YW5kYXJkV3JhcHBlci5ub3RTZXJ2bGV0PUNsYXNzIHswfSBpcyBub3QgYSBTZXJ2bGV0CitzdGFuZGFyZFdyYXBwZXIucHJpdmlsZWdlZFNlcnZsZXQ9U2VydmxldCBvZiBjbGFzcyB7MH0gaXMgcHJpdmlsZWdlZCBhbmQgY2Fubm90IGJlIGxvYWRlZCBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbgorc3RhbmRhcmRXcmFwcGVyLnJlbGVhc2VGaWx0ZXJzPVJlbGVhc2UgZmlsdGVycyBleGNlcHRpb24gZm9yIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuc2VydmljZUV4Y2VwdGlvbj1TZXJ2bGV0LnNlcnZpY2UoKSBmb3Igc2VydmxldCB7MH0gdGhyZXcgZXhjZXB0aW9uCitzdGFuZGFyZFdyYXBwZXIuc3RhdHVzSGVhZGVyPUhUVFAgU3RhdHVzIHswfSAtIHsxfQorc3RhbmRhcmRXcmFwcGVyLnN0YXR1c1RpdGxlPVRvbWNhdCBFcnJvciBSZXBvcnQKK3N0YW5kYXJkV3JhcHBlci51bmF2YWlsYWJsZT1NYXJraW5nIHNlcnZsZXQgezB9IGFzIHVuYXZhaWxhYmxlCitzdGFuZGFyZFdyYXBwZXIudW5sb2FkRXhjZXB0aW9uPVNlcnZsZXQgezB9IHRocmV3IHVubG9hZCgpIGV4Y2VwdGlvbgorc3RhbmRhcmRXcmFwcGVyLnVubG9hZGluZz1DYW5ub3QgYWxsb2NhdGUgc2VydmxldCB7MH0gYmVjYXVzZSBpdCBpcyBiZWluZyB1bmxvYWRlZAorc3RhbmRhcmRXcmFwcGVyLndhaXRpbmc9V2FpdGluZyBmb3IgezB9IGluc3RhbmNlKHMpIHRvIGJlIGRlYWxsb2NhdGVkCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNDliZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDE3NCBAQAorYXBwbGljYXRpb25Db250ZXh0LmF0dHJpYnV0ZUV2ZW50PUV4Y2VwY2nzbiBsYW56YWRhIHBvciBlc2N1Y2hhZG9yIGRlIGV2ZW50b3MgZGUgYXRyaWJ1dG9zCithcHBsaWNhdGlvbkNvbnRleHQubWFwcGluZy5lcnJvcj1FcnJvciBkdXJhbnRlIG1hcGVvCithcHBsaWNhdGlvbkNvbnRleHQucmVxdWVzdERpc3BhdGNoZXIuaWFlPUxhIFRyYXllY3RvcmlhIHswfSBubyBjb21pZW56YSBjb24gY2Fy4WN0ZXIgIi8iCithcHBsaWNhdGlvbkNvbnRleHQuc2V0QXR0cmlidXRlLm5hbWVudWxsPUVsIG5vbWJyZSBubyBwdWVkZSBzZXIgbnVsbworYXBwbGljYXRpb25EaXNwYXRjaGVyLmFsbG9jYXRlRXhjZXB0aW9uPUV4Y2VwY2nzbiBkZSByZXNlcnZhIGRlIGVzcGFjaW8gcGFyYSBzZXJ2bGV0IHswfQorYXBwbGljYXRpb25EaXNwYXRjaGVyLmRlYWxsb2NhdGVFeGNlcHRpb249RXhjZXBjafNuIGRlIHJlY3VwZXJhY2nzbiBkZSBlc3BhY2lvIHBhcmEgc2VydmxldCB7MH0KK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5mb3J3YXJkLmlzZT1ObyBwdWVkbyByZWVudmlhciBkZXNwdelzIGRlIHF1ZSBsYSByZXNwdWVzdGEgc2UgaGF5YSBsbGV2YWRvIGEgY2Fiby4KK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5mb3J3YXJkLnRocm93PUVsIHJlY3Vyc28gcmVlbnZpYWRvIGxhbnrzIHVuIGV4Y2VwY2nzbgorYXBwbGljYXRpb25EaXNwYXRjaGVyLmluY2x1ZGUudGhyb3c9RWwgcmVjdXJzbyBpbmNsde1kbyBsYW568yB1bmEgZXhjZXBjafNuCithcHBsaWNhdGlvbkRpc3BhdGNoZXIuaXNVbmF2YWlsYWJsZT1FbCBTZXJ2bGV0IHswfSBubyBlc3ThIGRpc3BvbmlibGUgZW4gZXN0ZSBtb21lbnRvCithcHBsaWNhdGlvbkRpc3BhdGNoZXIuc2VydmljZUV4Y2VwdGlvbj1FbCBTZXJ2bGV0LnNlcnZpY2UoKSBwYXJhIHNlcnZsZXQgezB9IGxhbnrzIHVuYSBleGNlcGNp824KK2FwcGxpY2F0aW9uUmVxdWVzdC5iYWRQYXJlbnQ9Tm8gcHVlZG8gbG9jYWxpemFyIGxhIGltcGxlbWVudGFjafNuIGRlIFJlcXVlcmltaWVudG8gcGFkcmUKK2FwcGxpY2F0aW9uUmVxdWVzdC5iYWRSZXF1ZXN0PUVsIHJlcXVlcmltaWVudG8gbm8gZXMgdW4gamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdFdyYXBwZXIKK2FwcGxpY2F0aW9uUmVzcG9uc2UuYmFkUGFyZW50PU5vIHB1ZWRvIGxvY2FsaXphciBpbXBsZW1lbnRhY2nzbiBkZSBSZXNwdWVzdGEgcGFkcmUKK2FwcGxpY2F0aW9uUmVzcG9uc2UuYmFkUmVzcG9uc2U9TGEgUmVzcHVlc3RhIG5vIGVzIHVuIGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlV3JhcHBlcgorY29udGFpbmVyQmFzZS5hZGREZWZhdWx0TWFwcGVyPUV4Y2VwY2nzbiBjb25maWd1cmFuZG8gbWFwZWFkb3IgcG9yIGRlZmVjdG8gZGUgY2xhc2UgezB9Citjb250YWluZXJCYXNlLmFscmVhZHlTdGFydGVkPVlhIGhhIHNpZG8gYXJyYW5jYWRvIGVsIENvbnRlbmVkb3IgezB9Citjb250YWluZXJCYXNlLm5vdENvbmZpZ3VyZWQ9Tm8gc2UgaGEgY29uZmlndXJhZG8gVuFsdnVsYSBi4XNpY2EKK2NvbnRhaW5lckJhc2Uubm90U3RhcnRlZD1ObyBzZSBoYSBhcnJhbmNhZG8gZWwgQ29udGVuZWRvciB7MH0KK2Zhc3RFbmdpbmVNYXBwZXIuYWxyZWFkeVN0YXJ0ZWQ9WWEgc2UgaGEgYXJyYW5jYWRvIGVsIEZhc3RFbmdpbmVNYXBwZXIgezB9CitmYXN0RW5naW5lTWFwcGVyLm5vdFN0YXJ0ZWQ9Tm8gc2UgaGEgYXJyYW5jYWRvIGH6biBlbCBGYXN0RW5naW5lTWFwcGVyIHswfQorZmlsdGVyQ2hhaW4uZmlsdGVyPUxhIGVqZWN1Y2nzbiBkZWwgRmlsdHJvIGxhbnrzIHVuYSBleGNlcGNp824KK2ZpbHRlckNoYWluLnNlcnZsZXQ9TGEgZWplY3VjafNuIGRlbCBTZXJ2bGV0IGxhbnrzIHVuYSBleGNlcGNp824KK2h0dHBDb250ZXh0TWFwcGVyLmNvbnRhaW5lcj1Fc3RlIENvbnRlbmVkb3Igbm8gZXMgdW4gU3RhbmRhcmRDb250ZXh0CitodHRwRW5naW5lTWFwcGVyLmNvbnRhaW5lcj1Fc3RlIENvbnRlbmVkb3Igbm8gZXMgdW4gU3RhbmRhcmRFbmdpbmUKK2h0dHBIb3N0TWFwcGVyLmNvbnRhaW5lcj1Fc3RhIENvbnRlbmVkb3Igbm8gZXMgdW5hIFN0YW5kYXJkSG9zdAoraW50ZXJjZXB0b3JWYWx2ZS5hbHJlYWR5U3RhcnRlZD1ZYSBoYSBzaWRvIGFycmFuY2FkYSBsYSBJbnRlcmNlcHRvclZhbHZlCitpbnRlcmNlcHRvclZhbHZlLm5vdFN0YXJ0ZWQ9QfpuIG5vIGhhIHNpZG8gYXJyYW5jYWRhIGxhIEludGVyY2VwdG9yVmFsdmUKK25hbWluZy5iaW5kRmFpbGVkPU5vIHB1ZGUgY2FtYmlhciAoYmluZCkgb2JqZXRvOiB7MH0KK25hbWluZy51bmJpbmRGYWlsZWQ9Tm8gcHVkZSBkZXNjYW1iaWFyICh1bmJpbmQpIG9iamVjdG86IHswfQorbmFtaW5nLmludmFsaWRFbnZFbnRyeVR5cGU9TGEgZW50cmFkYSBkZSBFbnRvcm5vIHswfSB0aWVuZSB1biB0aXBvIGluduFsaWRvCituYW1pbmcuaW52YWxpZEVudkVudHJ5VmFsdWU9TGEgZW50cmFkYSBkZSBFbnRvcm5vIHswfSB0aWVuZSB1biB2YWxvciBpbnbhbGlkbworbmFtaW5nLm5hbWluZ0NvbnRleHRDcmVhdGlvbkZhaWxlZD1GYWxs8yBsYSBjcmVhY2nzbiBkZWwgY29udGV4dG8gZGUgbm9tYnJlcyAobmFtaW5nKTogezB9CitzdGFuZGFyZENvbnRleHQuYWxyZWFkeVN0YXJ0ZWQ9WWEgc2UgaGEgYXJyYW5jYWRvIGVsIENvbnRleHRvCitzdGFuZGFyZENvbnRleHQuYXBwbGljYXRpb25MaXN0ZW5lcj1FcnJvciBjb25maWd1cmFuZG8gZXNjdWNoYWRvciBkZSBhcGxpY2FjafNuIGRlIGNsYXNlIHswfQorc3RhbmRhcmRDb250ZXh0LmFwcGxpY2F0aW9uU2tpcHBlZD1TZSBoYSBzYWx0YWRvIGxhIGluc3RhbGFjafNuIGRlIGVzY3VjaGFkb3JlcyBkZSBhcGxpY2FjafNuIGRlYmlkbyBhIGVycm9yKGVzKSBwcmV2aW8ocykKK3N0YW5kYXJkQ29udGV4dC5iYWRSZXF1ZXN0PVRyYXllY3RvcmlhIGRlIHJlcXVlcmltaWVudG8gaW524WxpZGEgKHswfSkuCitzdGFuZGFyZENvbnRleHQuZXJyb3JQYWdlLmVycm9yPUxhIGxvY2FsaXphY2nzbiBkZSBsYSBw4WdpbmEgZGUgZXJyb3IgMH0gZGViZSBkZSBjb21lbnphciBjb24gJycvJycKK3N0YW5kYXJkQ29udGV4dC5lcnJvclBhZ2UucmVxdWlyZWQ9RXJyb3JQYWdlIG5vIHB1ZWRlIHNlciBudWxvCitzdGFuZGFyZENvbnRleHQuZXJyb3JQYWdlLndhcm5pbmc9QVZJU086IExhIGxvY2FsaXphY2nzbiBkZSBsYSBw4WdpbmEgZGUgZXJyb3IgezB9IGRlYmUgZGUgY29tZW56YXIgY29uICcnLycnIGVuIFNlcnZsZXQgMi40CitzdGFuZGFyZENvbnRleHQuZmlsdGVyTWFwLmVpdGhlcj1FbCBtYXBlbyBkZSBmaWx0cm8gZGViZSBkZSBlc3BlY2lmaWNhciBvIHVuIDx1cmwtcGF0dGVybj4gbyB1biA8c2VydmxldC1uYW1lPgorc3RhbmRhcmRDb250ZXh0LmZpbHRlck1hcC5uYW1lPUVsIG1hcGVvIGRlIGZpbHRybyBlc3BlY2lmaWNhIHVuIG5vbWJyZSBkZXNjb25vY2lkbyBkZSBmaWx0cm8gezB9CitzdGFuZGFyZENvbnRleHQuZmlsdGVyTWFwLnBhdHRlcm49PHVybC1wYXR0ZXJuPiB7MH0gaW524WxpZG8gZW4gbWFwZW8gZGUgZmlsdHJvCitzdGFuZGFyZENvbnRleHQuZmlsdGVyU3RhcnQ9RXhjZXBjafNuIGFycmFuY2FuZG8gZmlsdHJvIHswfQorc3RhbmRhcmRDb250ZXh0LmZpbHRlclN0YXJ0RmFpbGVkPU5vIHB1ZGUgYXJyYW5jYXIgRmlsdHJvcyBkZSBhcGxpY2FjafNuIGNvbiDpeGl0bworc3RhbmRhcmRDb250ZXh0LnJlcXVlc3RMaXN0ZW5lclN0YXJ0RmFpbGVkPU5vIHB1ZGUgYXJyYW5jYXIgduFsdnVsYSBkZSBlc2N1Y2hhZG9yIGRlIHJlcXVlcmltaWVudG8gY29uIGV4aXRvCitzdGFuZGFyZENvbnRleHQucmVxdWVzdExpc3RlbmVyQ29uZmlnLmFkZGVkPUHxYWRpZGEgVuFsdnVsYSBkZSBlc2N1Y2hhZG9yIGRlIHJlcXVlcmltaWVudG8KK3N0YW5kYXJkQ29udGV4dC5yZXF1ZXN0TGlzdGVuZXJDb25maWcuZXJyb3I9RXhjZXBjafNuIGHxYWRpZW5kbyBW4Wx2dWxhIGRlIGVzY3VjaGFkb3IgZGUgcmVxdWVyaW1pZW50bzogezB9CitzdGFuZGFyZENvbnRleHQuaXNVbmF2YWlsYWJsZT1Fc3RhIGFwbGljYWNp824gbm8gZXN04SBkaXNwb25pYmxlIGVuIGVzdGUgbW9tZW50bworc3RhbmRhcmRDb250ZXh0Lmxpc3RlbmVyU3RhcnQ9RXhjZXBjafNuIGVudmlhbmRvIGV2ZW50byBpbmljaWFsaXphZG8gZGUgY29udGV4dG8gYSBpbnN0YW5jaWEgZGUgZXNjdWNoYWRvciBkZSBjbGFzZSB7MH0KK3N0YW5kYXJkQ29udGV4dC5saXN0ZW5lclN0YXJ0RmFpbGVkPU5vIHB1ZGUgYXJyYW5jYXIgRXNjdWNoYWRvcmVzIGRlIGFwbGljYWNp824gY29uIOl4aXRvCitzdGFuZGFyZENvbnRleHQubGlzdGVuZXJTdG9wPUV4Y2VwY2nzbiBlbnZpYW5kbyBldmVudG8gZGUgY29udGV4dG8gZGVzdHJ17WRvIGEgaW5zdGFuY2lhIGRlIGVzY3VjaGFkb3IgZGUgY2xhc2UgezB9CitzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcuZXJyb3JQYWdlPUxhIFDhZ2luYSBkZSBlcnJvciBkZSBGb3JtdWxhcmlvIHswfSBkZWJlIGRlIGNvbWVuemFyIGNvbiAnJy8nCitzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcuZXJyb3JXYXJuaW5nPUFWSVNPOiBMYSBw4WdpbmEgZGUgZXJyb3IgZGUgRm9ybXVsYXJpbyB7MH0gZGViZSBkZSBjb21lbnphciBjb24gJycvJycgZW4gU2VydmxldCAyLjQKK3N0YW5kYXJkQ29udGV4dC5sb2dpbkNvbmZpZy5sb2dpblBhZ2U9TGEgcOFnaW5hIGRlIGxvZ2luIGRlIEZvcm11bGFyaW8gezB9IGRlYmUgZGUgY29tZW56YXIgY29uICcnLycKK3N0YW5kYXJkQ29udGV4dC5sb2dpbkNvbmZpZy5sb2dpbldhcm5pbmc9QVZJU086IExhIHDhZ2luYSBkZSBsb2dpbiBkZSBGb3JtdWxhcmlvIHswfSBkZWJlIGRlIGNvbWVuemFyIGNvbiAnJy8nJyBlbiBTZXJ2bGV0IDIuNAorc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLnJlcXVpcmVkPUxvZ2luQ29uZmlnIG5vIHB1ZWRlIHNlciBudWxhCitzdGFuZGFyZENvbnRleHQubWFwcGluZ0Vycm9yPUVycm9yIGRlIGNvbmZpZ3VyYWNp824gZGUgTUFQRU8gcGFyYSBVUkkgcmVsYXRpdmEgezB9CitzdGFuZGFyZENvbnRleHQubm90Rm91bmQ9RWwgcmVjdXJzbyByZXF1ZXJpZG8gKHswfSkgbm8gc2UgZW5jdWVudHJhIGRpc3BvbmlibGUKK3N0YW5kYXJkQ29udGV4dC5ub3RSZWxvYWRhYmxlPUVzdOEgZGVzYWN0aXZhZGEgbGEgcmVjYXJnYSBlbiBlc3RlIENvbnRleHRvCitzdGFuZGFyZENvbnRleHQubm90U3RhcnRlZD1B+m4gbm8gc2UgaGEgYXJyYW5jYWRvIGVsIENvbnRleHRvCitzdGFuZGFyZENvbnRleHQubm90V3JhcHBlcj1FbCBIaWpvIGRlIHVuIENvbnRleHRvIGRlYmUgZGUgc2VyIHVuIEFycm9wYWRvciAoV3JhcHBlcikKK3N0YW5kYXJkQ29udGV4dC5wYXJhbWV0ZXIuZHVwbGljYXRlPUR1cGxpY2FkbyBwYXLhbWV0cm8gZGUgaW5pY2lhbGl6YWNp824gZGUgY29udGV4dG8gezB9CitzdGFuZGFyZENvbnRleHQucGFyYW1ldGVyLnJlcXVpcmVkPUVzIG5lY2VzYXJpbyBwb25lciBub21icmUgZGUgcGFy4W1ldHJvIHkgdmFsb3IgZGUgcGFy4W1ldHJvCitzdGFuZGFyZENvbnRleHQucmVsb2FkaW5nQ29tcGxldGVkPVNlIGhhIGNvbXBsZXRhZG8gbGEgUmVnYXJnYSBkZSBlc3RlIENvbnRleHRvCitzdGFuZGFyZENvbnRleHQucmVsb2FkaW5nRmFpbGVkPUZhbGzzIGxhIHJlY2FyZ2EgZGUgZXN0ZSBDb250ZXh0byBkZWJpZG8gYSBlcnJvcmVzIHByZXZpb3MKK3N0YW5kYXJkQ29udGV4dC5yZWxvYWRpbmdTdGFydGVkPUhhIGNvbWVuemFkbyBsYSByZWNhcmdhIGRlIGVzdGUgQ29udGV4dG8KK3N0YW5kYXJkQ29udGV4dC5yZXF1ZXN0TGlzdGVuZXIucmVxdWVzdEluaXQ9VW5hIGV4Y2VwY2nzbiBkdXJhbnRlIGVsIGVudu1vIGRlIHJlcXVlcmltaWVudG8gaGEgaW5pY2lhZG8gdW4gZXZlbnRvIGRlIGNpY2xvIGRlIHZpZGEgKGxpZmVjeWNsZSBldmVudCkgcGFyYSBsYSBpbnN0YW5jaWEgZGUgY2xhc2UgYSBsYSBlc2N1Y2hhIChsaXN0ZW5lcikgezB9CitzdGFuZGFyZENvbnRleHQucmVxdWVzdExpc3RlbmVyLnJlcXVlc3REZXN0cm95PVVuYSBleGNlcGNp824gZHVyYW50ZSBlbCBlbnbtbyBkZSByZXF1ZXJpbWllbnRvIGhhIGRlc3Ryde1kbyB1biBldmVudG8gZGUgY2ljbG8gZGUgdmlkYSAobGlmZWN5Y2xlIGV2ZW50KSBwYXJhIGxhIGluc3RhbmNpYSBkZSBjbGFzZSBhIGxhIGVzY3VjaGEgKGxpc3RlbmVyKSB7MH0KK3N0YW5kYXJkQ29udGV4dC5yZXNvdXJjZXNTdGFydD1FcnJvciBhcnJhbmNhbmRvIFJlY3Vyc29zIGVzdOF0aWNvcworc3RhbmRhcmRDb250ZXh0LnNlY3VyaXR5Q29uc3RyYWludC5wYXR0ZXJuPTx1cmwtcGF0dGVybj4gezB9IGluduFsaWRhIGVuIHJlc3RyaWNjafNuIGRlIHNlZ3VyaWRhZAorc3RhbmRhcmRDb250ZXh0LnNlcnZsZXRNYXAubmFtZT1FbCBtYXBlbyBkZSBTZXJ2bGV0IGVzcGVjaWZpY2EgdW4gbm9tYnJlIGRlIHNlcnZsZXQgZGVzY29ub2NpZG8gezB9CitzdGFuZGFyZENvbnRleHQuc2VydmxldE1hcC5wYXR0ZXJuPTx1cmwtcGF0dGVybj4gezB9IGluduFsaWRhIGVuIG1hcGVvIGRlIHNlcnZsZXQKK3N0YW5kYXJkQ29udGV4dC5zdGFydENsZWFudXA9RXhjZXBjafNuIGR1cmFudGUgbGEgbGltcGllemEgdHJhcyBubyBwb2RlciBhcnJhbmNhcgorc3RhbmRhcmRDb250ZXh0LnN0YXJ0RmFpbGVkPUZhbGzzIGVuIGFycmFucXVlIGRlbCBDb250ZXh0byBbezB9XSBkZWJpZG8gYSBlcnJvcmVzIHByZXZpb3MKK3N0YW5kYXJkQ29udGV4dC5zdGFydGluZ0xvYWRlcj1FeGNlcGNp824gYXJyYW5jYW5kbyBDYXJnYWRvcgorc3RhbmRhcmRDb250ZXh0LnN0YXJ0aW5nTWFuYWdlcj1FeGNlcGNp824gYXJyYW5jYW5kbyBHZXN0b3IKK3N0YW5kYXJkQ29udGV4dC5zdGFydGluZ1dyYXBwZXI9RXhjZXBjafNuIGFycmFuY2FuZG8gQXJyb3BhZG9yIChXcmFwcGVyKSBwYXJhIHNlcnZsZXQgezB9CitzdGFuZGFyZENvbnRleHQuc3RvcHBpbmdDb250ZXh0PUV4Y2VwY2k/biBwYXJhbmRvIENvbnRleHQKK3N0YW5kYXJkQ29udGV4dC5zdG9wcGluZ0xvYWRlcj1FeGNlcGNp824gcGFyYW5kbyBDYXJnYWRvcgorc3RhbmRhcmRDb250ZXh0LnN0b3BwaW5nTWFuYWdlcj1FeGNlcGNp824gcGFyYW5kbyBHZXN0b3IKK3N0YW5kYXJkQ29udGV4dC5zdG9wcGluZ1dyYXBwZXI9RXhjZXBjafNuIHBhcmFuZG8gQXJyb3BhZG9yIChXcmFwcGVyKSBwYXJhIHNlcnZsZXQgezB9CitzdGFuZGFyZENvbnRleHQudXJsRGVjb2RlPU5vIHB1ZWRvIGRlY29kaWZpY2FyIFVSTCBkZSB0cmF5ZWN0b3JpYSBkZSByZXF1ZXJpbWllbnRvIHswfQorc3RhbmRhcmRDb250ZXh0LnVybFBhdHRlcm4ucGF0dGVybldhcm5pbmc9QVZJU086IGVsIHBhdHLzbiBVUkwgezB9IGRlYmUgZGUgY29tZW56YXIgY29uICcnLycnIGVuIFNlcnZsZXQgMi40CitzdGFuZGFyZENvbnRleHQudXJsVmFsaWRhdGU9Tm8gcHVlZG8gdmFsaWRhciB0cmF5ZWN0b3JpYSBkZSByZXF1ZXJpbWllbnRvIGRlIFVSTCBkZWNvZGlmaWNhZGEgezB9CitzdGFuZGFyZENvbnRleHQud3JhcHBlci5lcnJvcj1FbCBhcmNoaXZvIEpTUCB7MH0gZGViZSBkZSBjb21lbnphciBjb24gJycvJworc3RhbmRhcmRDb250ZXh0LndyYXBwZXIud2FybmluZz1BVklTTzogRWwgYXJjaGl2byBKU1AgezB9IGRlYmUgZGUgY29tZW56YXIgY29uICcnLycnIGVuIFNlcnZsZXQgMi40CitzdGFuZGFyZEVuZ2luZS5hbHJlYWR5U3RhcnRlZD1ZYSBoYSBzaWRvIGFycmFuY2FkbyBlbCBNb3Rvcgorc3RhbmRhcmRFbmdpbmUubWFwcGluZ0Vycm9yPUVycm9yIGRlIGNvbmZpZ3VyYWNp824gZGUgTUFQRU8gcGFyYSBub21icmUgZGUgc2Vydmlkb3IgezB9CitzdGFuZGFyZEVuZ2luZS5ub0hvc3Q9Tm8gaGF5IE3hcXVpbmEgcXVlIGNvaW5jaWRhIGNvbiBub21icmUgZGUgc2Vydmlkb3IgezB9CitzdGFuZGFyZEVuZ2luZS5ub0hvc3RIZWFkZXI9UmVxdWVyaW1pZW50byBIVFRQLzEuMSBzaW4gTeFxdWluYTogY2FiZWNlcmEKK3N0YW5kYXJkRW5naW5lLm5vdEhvc3Q9RWwgSGlqbyBkZSB1biBNb3RvciBkZWJlIGRlIHNlciB1biBN4XF1aW5hCitzdGFuZGFyZEVuZ2luZS5ub3RQYXJlbnQ9RWwgTW90b3Igbm8gcHVlZGUgdGVuZXIgdW4gQ29udGVuZWRvciBwYWRyZQorc3RhbmRhcmRFbmdpbmUubm90U3RhcnRlZD1B+m4gbm8gc2UgaGEgYXJyYW5jYWRvIGVsIE1vdG9yCitzdGFuZGFyZEVuZ2luZS51bmZvdW5kSG9zdD1N4XF1aW5hIHZpcnR1YWwgezB9IG5vIGhhbGxhZGEKK3N0YW5kYXJkRW5naW5lLnVua25vd25Ib3N0PU5vIHNlIGhhIGVzcGVjaWZpY2FkbyBt4XF1aW5hIHNlcnZpZG9yYSBlbiBlc3RlIHJlcXVlcmltaWVudG8KK3N0YW5kYXJkSG9zdC5hY2Nlc3NCYXNlPU5vIHB1ZWRvIGFjY2VkZXIgYSBkaXJlY3RvcmlvIGJhc2UgZGUgZG9jdW1lbnRvIHswfQorc3RhbmRhcmRIb3N0LmFscmVhZHlTdGFydGVkPVlhIGhhIHNpZG8gYXJyYW5jYWRhIGxhIE3hcXVpbmEKK3N0YW5kYXJkSG9zdC5hcHBCYXNlPU5vIGV4aXN0ZSBlbCBkaXJlY3RvcmlvIGJhc2UgZGUgYXBsaWNhY2nzbiB7MH0KK3N0YW5kYXJkSG9zdC5jbGllbnRBYm9ydD1FbCBDbGllbnRlIFJlbW90byBBYm9ydPMgZWwgUmVxdWVyaW1pZW50bywgSU9FeGNlcHRpb246IHswfQorc3RhbmRhcmRIb3N0LmNvbmZpZ1JlcXVpcmVkPUVzIG5lY2VzYXJpbyBwb25lciBsYSBVUkwgYSBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNp824KK3N0YW5kYXJkSG9zdC5jb25maWdOb3RBbGxvd2VkPU5vIHNlIHBlcm1pdGUgZWwgdXNvIGRlbCBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNp824KK3N0YW5kYXJkSG9zdC5pbnN0YWxsQmFzZT1T82xvIHNlIHB1ZWRlbiBpbnN0YWxhciBhcGxpY2FjaW9uZXMgd2ViIGVuIGVsIGRpcmVjdG9yaW8gZGUgYXBsaWNhY2lvbmVzIHdlYiBkZSBN4XF1aW5hCitzdGFuZGFyZEhvc3QuaW5zdGFsbGluZz1JbnN0YWxhbmRvIGFwbGljYWNpb25lcyB3ZWIgZW4gdHJheWVjdG9yaWEgZGUgY29udGV4dG8gezB9IGRlc2RlIFVSTCB7MX0KK3N0YW5kYXJkSG9zdC5pbnN0YWxsaW5nV0FSPUluc3RhbGFuZG8gYXBsaWNhY2nzbiB3ZWIgZGVzZGUgVVJMIHswfQorc3RhbmRhcmRIb3N0Lmluc3RhbGxpbmdYTUw9UHJvY2VzYW5kbyBVUkwgZGUgYXJjaGl2byBkZSBjb25maWd1cmFjafNuIGRlIENvbnRleHRvIHswfQorc3RhbmRhcmRIb3N0Lmluc3RhbGxFcnJvcj1FcnJvciBkZXNwbGVnYW5kbyBhcGxpY2FjafNuIGVuIHRyYXllY3RvcmlhIGRlIGNvbnRleHRvIHswfQorc3RhbmRhcmRIb3N0LmludmFsaWRFcnJvclJlcG9ydFZhbHZlQ2xhc3M9Tm8gcHVkZSBjYXJnYXIgY2xhc2UgZXNwZWNpZmlhZGEgZGUgduFsdnVsYSBkZSBpbmZvcm1lIGRlIGVycm9yOiB7MH0KK3N0YW5kYXJkSG9zdC5kb2NCYXNlPVlhIGV4aXN0ZSBlbCBkaXJlY3RvcmlvIGJhc2UgZGUgZG9jdW1lbnRvIHswfQorc3RhbmRhcmRIb3N0Lm1hcHBpbmdFcnJvcj1FcnJvciBkZSBjb25maWd1cmFjafNuIGRlIE1BUEVPIHBhcmEgVVJJIGRlIHJlcXVlcmltaWVudG8gezB9CitzdGFuZGFyZEhvc3Qubm9Db250ZXh0PU5vIHNlIGhhIGNvbmZpZ3VyYWRvIENvbnRleHRvIHBhcmEgcHJvY2VzYXIgZXN0ZSByZXF1ZXJpbWllbnRvCitzdGFuZGFyZEhvc3Qubm9Ib3N0PU5vIHNlIGhhIGNvbmZpZ3VyYWRvIE3hcXVpbmEgcGFyYSBwcm9jZXNhciBlc3RlIHJlcXVlcmltaWVudG8KK3N0YW5kYXJkSG9zdC5ub3RDb250ZXh0PUVsIEhpam8gZGUgdW5hIE3hcXVpbmEgZGViZSBkZSBzZXIgdW4gQ29udGV4dG8KK3N0YW5kYXJkSG9zdC5ub3RTdGFydGVkPUH6biBubyBzZSBoYSBhcnJhbmNhZG8gbGEgTeFxdWluYQorc3RhbmRhcmRIb3N0Lm51bGxOYW1lPUVzIG5lY2VzYXJpbyBwb25lciBlbCBub21icmUgZGUgTeFxdWluYQorc3RhbmRhcmRIb3N0LnBhdGhGb3JtYXQ9VHJheWVjdG9yaWEgZGUgY29udGV4dG8gaW524WxpZGE6IHswfQorc3RhbmRhcmRIb3N0LnBhdGhNYXRjaD1MYSB0cmF5ZWN0b3JpYSBkZSBDb250ZXh0byB7MH0gZGViZSBkZSBjb2luY2lkaXIgY29uIGVsIG5vbWJyZSBkZSBkaXJlY3RvcmlvIG8gZGUgYXJjaGl2byBXQVI6IHsxfQorc3RhbmRhcmRIb3N0LnBhdGhNaXNzaW5nPUxhIHRyYXllY3RvcmlhIGRlIENvbnRleHRvIHswfSBubyBlc3ThIGVuIHVzbyBlbiBlc3RlIG1vbWVudG8KK3N0YW5kYXJkSG9zdC5wYXRoUmVxdWlyZWQ9RXMgbmVjZXNhcmlvIHBvbmVyIGxhIHRyYXllY3RvcmlhIGRlIENvbnRleHRvCitzdGFuZGFyZEhvc3QucGF0aFVzZWQ9WWEgZXN04SBlbiB1c28gbGEgdHJheWVjdG9yaWEgZGUgQ29udGV4dG8gezB9CitzdGFuZGFyZEhvc3QucmVtb3Zpbmc9UXVpdGFuZG8gYXBsaWNhY2nzbiB3ZWIgZW4gdHJheWVjdG9yaWEgZGUgY29udGV4dG8gezB9CitzdGFuZGFyZEhvc3QucmVtb3ZlRXJyb3I9RXJyb3IgcXVpdGFuZG8gYXBsaWNhY2nzbiBlbiB0cmF5ZWN0b3JpYSBkZSBjb250ZXh0byB7MH0KK3N0YW5kYXJkSG9zdC5zdGFydD1BcnJhbmNhbmRvIGFwbGljYWNp824gd2ViIGVuIHRyYXllY3RvcmlhIGRlIGNvbnRleHRvIHswfQorc3RhbmRhcmRIb3N0LnN0b3A9UGFyYW5kbyBhcGxpY2FjafNuIHdlYiBlbiB0cmF5ZWN0b3JpYSBkZSBjb250ZXh0byB7MH0KK3N0YW5kYXJkSG9zdC51bmZvdW5kQ29udGV4dD1ObyBwdWVkbyBoYWxsYXIgY29udGV4dG8gcGFyYSBVUkkgZGUgcmVxdWVyaW1pZW50byB7MH0KK3N0YW5kYXJkSG9zdC53YXJSZXF1aXJlZD1FcyBuZWNlc2FyaW8gcG9uZXIgbGEgVVJMIGEgYXJjaGl2byBkZSBhcGxpY2FjafNuIHdlYgorc3RhbmRhcmRIb3N0LndhclVSTD1VUkwgaW524WxpZGEgcGFyYSBhcmNoaXZvIGRlIGFwbGljYWNp824gd2ViOiB7MH0KK3N0YW5kYXJkSG9zdC52YWxpZGF0aW9uRW5hYmxlZD1BY3RpdmFkYSBsYSB2YWxpZGFjafNuIFhNTAorc3RhbmRhcmRIb3N0LnZhbGlkYXRpb25EaXNhYmxlZD1EZXNhY3RpdmFkYSBsYSB2YWxpZGFjafNuIFhNTAorc3RhbmRhcmRQaXBlbGluZS5hbHJlYWR5U3RhcnRlZD1ZYSBzZSBoYSBhcnJhbmNhZG8gbGEgVHViZXLtYSAoUGlwZWxpbmUpCitzdGFuZGFyZFBpcGVsaW5lLm5vdFN0YXJ0ZWQ9Tm8gc2UgaGEgYXJyYW5jYWRvIGxhIFR1YmVy7WEgKFBpcGVsaW5lKQorc3RhbmRhcmRQaXBlbGluZS5ub1ZhbHZlPU5vIGhheSBt4XMgVuFsdnVsYXMgZW4gbGEgVHViZXLtYSAoUGlwZWxpbmUpIHByb2Nlc2FuZG8gZXN0ZSByZXF1ZXJpbWllbnRvCitzdGFuZGFyZFNlcnZlci5hZGRDb250YWluZXIuaXNlPU5vIGhheSBjb25lY3RvcmVzIGRpc3BvbmlibGVzIHBhcmEgc2VyIGFzb2NpYWRvcyBjb24gZXN0ZSBjb250ZW5lZG9yCitzdGFuZGFyZFNlcnZlci5pbml0aWFsaXplLmluaXRpYWxpemVkPVlhIHNlIGhhIGluaWNpYWxpemFkbyBlc3RlIHNlcnZpZG9yCitzdGFuZGFyZFNlcnZlci5zdGFydC5jb25uZWN0b3JzPUFsIG1lbm9zIHVuIGNvbmVjdG9yIG5vIGVzdOEgYXNvY2lhZG8gY29uIGN1YWxxdWllciBjb250ZW5lZG9yCitzdGFuZGFyZFNlcnZlci5zdGFydC5zdGFydGVkPVlhIGhhIHNpZG8gYXJyYW5jYWRvIGVzdGUgc2Vydmlkb3IKK3N0YW5kYXJkU2VydmVyLnN0b3Aubm90U3RhcnRlZD1B+m4gbm8gaGEgc2lkbyBhcnJhbmNhZG8gZXN0ZSBzZXJ2aWRvcgorc3RhbmRhcmRTZXJ2aWNlLmluaXRpYWxpemUuaW5pdGlhbGl6ZWQ9WWEgaGEgc2lkbyBpbmljaWFsaXphZG8gZXN0ZSBzZXJ2aWNpbworc3RhbmRhcmRTZXJ2aWNlLnN0YXJ0Lm5hbWU9QXJyYW5jYW5kbyBzZXJ2aWNpbyB7MH0KK3N0YW5kYXJkU2VydmljZS5zdGFydC5zdGFydGVkPVlhIGhhIHNpZG8gYXJyYW5jYWRvIGVzdGUgc2VyY2ljaW8KK3N0YW5kYXJkU2VydmljZS5zdG9wLm5hbWU9UGFyYW5kbyBzZXJ2aWNpbyB7MH0KK3N0YW5kYXJkU2VydmljZS5zdG9wLm5vdFN0YXJ0ZWQ9QfpuIG5vIHNlIGhhIGFycmFuY2FkbyBlc3RlIHNlcnZpY2lvCitzdGFuZGFyZFdyYXBwZXIuYWxsb2NhdGU9RXJyb3IgcmVzZXJ2YW5kbyBlc3BhY2lvIHBhcmEgdW5hIGluc3RhbmNpYSBkZSBzZXJ2bGV0CitzdGFuZGFyZFdyYXBwZXIuYWxsb2NhdGVFeGNlcHRpb249RXhjZXBjafNuIGRlIHJlc2VydmEgZGUgZXNwYWNpbyBwYXJhIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuY29udGFpbmVyU2VydmxldD1DYXJnYW5kbyBzZXJ2bGV0IGRlIGNvbnRlbmVkb3IgezB9CitzdGFuZGFyZFdyYXBwZXIuY3JlYXRlRmlsdGVycz1FeGNlcGNp824gZGUgY3JlYWNp824gZGUgZmlsdHJvcyBwYXJhIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuZGVhbGxvY2F0ZUV4Y2VwdGlvbj1FeGNlcGNp824gZGUgcmVjdXBlcmFjafNuIGRlIGVzcGFjaW8gcGFyYSBzZXJ2bGV0IHswfQorc3RhbmRhcmRXcmFwcGVyLmRlc3Ryb3lFeGNlcHRpb249U2VydmxldC5kZXN0cm95KCkgcGFyYSBzZXJ2bGV0IHswfSBsYW568yBleGNlcGNp824KK3N0YW5kYXJkV3JhcHBlci5leGNlcHRpb24wPUluZm9ybWUgZGUgRXhjZXBjafNuIGRlIFRvbWNhdAorc3RhbmRhcmRXcmFwcGVyLmV4Y2VwdGlvbjE9SGEgdGVuaWRvIGx1Z2FyIHVuYSBFeGNlcGNp824gZGUgU2VydmxldAorc3RhbmRhcmRXcmFwcGVyLmV4Y2VwdGlvbjI9SW5mb3JtZSBkZSBFeGNlcGNp8246CitzdGFuZGFyZFdyYXBwZXIuZXhjZXB0aW9uMz1DYXVzYSBSYe16Ogorc3RhbmRhcmRXcmFwcGVyLmluaXRFeGNlcHRpb249U2VydmxldC5pbml0KCkgcGFyYSBzZXJ2bGV0IHswfSBsYW568yBleGNlcGNp824KK3N0YW5kYXJkV3JhcHBlci5pbnN0YW50aWF0ZT1FcnJvciBpbnN0YW5jaWFuZG8gY2xhc2UgZGUgc2VydmxldCB7MH0KK3N0YW5kYXJkV3JhcHBlci5pc1VuYXZhaWxhYmxlPUVsIFNlcnZsZXQgezB9IG5vIGVzdOEgZGlzcG9uaWJsZSBlbiBlc3RlIG1vbWVudG8KK3N0YW5kYXJkV3JhcHBlci5qYXNwZXJMb2FkZXI9VXNhbmRvIGNhcmdhZG9yIGRlIGNsYXNlcyAoY2xhc3Nsb2FkZXIpIGRlIEphc3BlciBwYXJhIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuanNwRmlsZS5mb3JtYXQ9RWwgYXJjaGl2byBKU1AgezB9IG5vIGNvbWllbnphIGNvbiBjYXLhY3RlciAnJy8nJworc3RhbmRhcmRXcmFwcGVyLmxvYWRFeGNlcHRpb249RWwgU2VydmxldCB7MH0gbGFuevMgZXhjZXBjafNuIGRlIGxvYWQoKQorc3RhbmRhcmRXcmFwcGVyLm1pc3NpbmdDbGFzcz1FbCBBcnJvcGFkb3IgKFdyYXBwZXIpIG5vIHB1ZWRlIGhhbGxhciBjbGFzZSBkZSBzZXJ2bGV0IHswfSBvIHVuYSBjbGFzZSBkZSBsYSBxdWUgZGVwZW5kZQorc3RhbmRhcmRXcmFwcGVyLm1pc3NpbmdMb2FkZXI9RWwgQXJyb3BhZG9yIChXcmFwcGVyKSBubyBwdWVkZSBoYWxsYXIgQ2FyZ2Fkb3IgcGFyYSBzZXJ2bGV0IHswfQorc3RhbmRhcmRXcmFwcGVyLm5vdENoaWxkPUVsIGNvbnRlbmVkb3IgZGUgQXJyb3BhZG9yIChXcmFwcGVyKSBubyBwdWVkZSB0ZW5lciBjb250ZW5lZG9yZXMgaGlqbworc3RhbmRhcmRXcmFwcGVyLm5vdENsYXNzPU5vIHNlIGhhIGVzcGVjaWZpY2FkbyBjbGFzZSBkZSBzZXJ2bGV0IHBhcmEgc2VydmxldCB7MH0KK3N0YW5kYXJkV3JhcHBlci5ub3RDb250ZXh0PUVsIGNvbnRlbmVkb3IgcGFkcmUgcGFyYSB1biBBcnJvcGFkb3IgKFdyYXBwZXIpIGRlYmUgZGUgc2VyIHVuIENvbnRleHRvCitzdGFuZGFyZFdyYXBwZXIubm90Rm91bmQ9Tm8gZXN04SBkaXNwb25pYmxlIGVsIFNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIubm90U2VydmxldD1MYSBDbGFzZSB7MH0gbm8gZXMgdW4gU2VydmxldAorc3RhbmRhcmRXcmFwcGVyLnByaXZpbGVnZWRTZXJ2bGV0PUVsIFNlcnZsZXQgZGUgY2xhc2UgezB9IGVzIHByaXZpbGVnaWFkbyB5IG5vIHB1ZWRlIHNlciBjYXJnYWRvIG1lZGlhbnRlIGVzdGEgYXBsaWNhY2nzbiB3ZWIKK3N0YW5kYXJkV3JhcHBlci5yZWxlYXNlRmlsdGVycz1FeGNlcGNp824gZGUgTGliZXJhY2nzbiBkZSBmaWx0cm9zIHBhcmEgc2VydmxldCB7MH0KK3N0YW5kYXJkV3JhcHBlci5zZXJ2aWNlRXhjZXB0aW9uPVNlcnZsZXQuc2VydmljZSgpIHBhcmEgc2VydmxldCB7MH0gbGFuevMgZXhjZXBjafNuCitzdGFuZGFyZFdyYXBwZXIuc3RhdHVzSGVhZGVyPUhUVFAgRXN0YWRvIHswfSAtIHsxfQorc3RhbmRhcmRXcmFwcGVyLnN0YXR1c1RpdGxlPUluZm9ybWUgZGUgRXJyb3IgZGUgVG9tY2F0CitzdGFuZGFyZFdyYXBwZXIudW5hdmFpbGFibGU9TWFyY2FuZG8gZWwgc2VydmxldCB7MH0gY29tbyBubyBkaXNwb25pYmxlCitzdGFuZGFyZFdyYXBwZXIudW5sb2FkRXhjZXB0aW9uPUVsIFNlcnZsZXQgezB9IGxhbnrzIGV4Y2VwY2nzbiB1bmxvYWQoKQorc3RhbmRhcmRXcmFwcGVyLnVubG9hZGluZz1ObyBwdWVkbyByZXNlcnZhciBlc3BhY2lvIHBhcmEgc2VydmxldCB7MH0gcG9ycXVlIGVzdOEgc2llbmRvIGRlc2NhcmdhZG8KK3N0YW5kYXJkV3JhcHBlci53YWl0aW5nPUVzcGVyYW5kbyBwb3IgezB9IGluc3RhbmNpYShzKSBwYXJhIHJlY3VwZXJhciBzdSBlc3BhY2lvIHJlc2VydmFkbwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDY5YWRiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNjYgQEAKK2FwcGxpY2F0aW9uQ29udGV4dC5hdHRyaWJ1dGVFdmVudD1FeGNlcHRpb24gbGFuY+llIHBhciBsJyfpY291dGV1ciAobGlzdGVuZXIpIGQnJ+l26G5lbWVudCBhdHRyaWJ1dHMKK2FwcGxpY2F0aW9uQ29udGV4dC5yZXF1ZXN0RGlzcGF0Y2hlci5pYWU9TGUgY2hlbWluIHswfSBuZSBjb21tZW5jZSBwYXMgcGFyIGxlIGNhcmFjdOhyZSAiLyIKK2FwcGxpY2F0aW9uQ29udGV4dC5zZXRBdHRyaWJ1dGUubmFtZW51bGw9bGUgbm9tIG5lIHBldXQg6nRyZSBudWwKK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5hbGxvY2F0ZUV4Y2VwdGlvbj1FeGNlcHRpb24gZCcnYWxsb2NhdGlvbiBwb3VyIGxhIHNlcnZsZXQgezB9CithcHBsaWNhdGlvbkRpc3BhdGNoZXIuZGVhbGxvY2F0ZUV4Y2VwdGlvbj1FeGNlcHRpb24gZGUgZOlzYWxsb2NhdGlvbiBwb3VyIGxhIHNlcnZsZXQgezB9CithcHBsaWNhdGlvbkRpc3BhdGNoZXIuZm9yd2FyZC5pc2U9SW1wb3NzaWJsZSBkJyd1dGlsaXNlciBmYWlyZS1zdWl2cmUgKGZvcndhcmQpIGFwcuhzIHF1ZSBsYSBy6XBvbnNlIGFpdCDpdOkgZW52b3npZQorYXBwbGljYXRpb25EaXNwYXRjaGVyLmZvcndhcmQudGhyb3c9TGEgcmVzc291cmNlIGZhaXJlLXN1aXZyZSAoZm9yd2FyZGVkKSBhIGxhbmPpIHVuZSBleGNlcHRpb24KK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5pbmNsdWRlLnRocm93PUxhIHJlc3NvdXJjZSBpbmNsdXNlIChpbmNsdWRlZCkgYSBsYW5j6SB1bmUgZXhjZXB0aW9uCithcHBsaWNhdGlvbkRpc3BhdGNoZXIuaXNVbmF2YWlsYWJsZT1MYSBzZXJ2bGV0IHswfSBlc3QgYWN0dWVsbGVtZW50IGluZGlzcG9uaWJsZQorYXBwbGljYXRpb25EaXNwYXRjaGVyLnNlcnZpY2VFeGNlcHRpb249IlNlcnZsZXQuc2VydmljZSgpIiBwb3VyIGxhIHNlcnZsZXQgezB9IGEgbGFuY+kgdW5lIGV4Y2VwdGlvbgorYXBwbGljYXRpb25SZXF1ZXN0LmJhZFBhcmVudD1JbXBvc3NpYmxlIGRlIHRyb3V2ZXIgbCcnaW1wbGVtZW50YXRpb24gcmVxdep0ZSBhcHBhcmVudOllIChwYXJlbnQgcmVxdWVzdCkKK2FwcGxpY2F0aW9uUmVxdWVzdC5iYWRSZXF1ZXN0PUxhIHJlcXXqdGUgbicnZXN0IHBhcyB1bmUgImphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RXcmFwcGVyIgorYXBwbGljYXRpb25SZXNwb25zZS5iYWRQYXJlbnQ9SW1wb3NzaWJsZSBkZSB0cm91dmVyIHVuZSBpbXBs6W1lbnRhdGlvbiBy6XBvbnNlIGFwcGFyZW506WUgKHBhcmVudCByZXNwb25zZSkKK2FwcGxpY2F0aW9uUmVzcG9uc2UuYmFkUmVzcG9uc2U9TGEgculwb25zZSBuJydlc3QgcGFzIHVuZSAiamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIgorY29udGFpbmVyQmFzZS5hZGREZWZhdWx0TWFwcGVyPUV4Y2VwdGlvbiBsb3JzIGRlIGxhIGNvbmZpZ3VyYXRpb24gZHUgcm91dGV1ciBwYXIgZOlmYXV0IChkZWZhdWx0IG1hcHBlcikgcG91ciBsYSBjbGFzc2UgezB9Citjb250YWluZXJCYXNlLmFscmVhZHlTdGFydGVkPUxlIGNvbnRlbmV1ciB7MH0gYSBk6WrgIOl06SBk6W1hcnLpCitjb250YWluZXJCYXNlLm5vdENvbmZpZ3VyZWQ9QXVjdW5lIFZhbHZlIGJhc2lxdWUgKGJhc2ljIHZhbHZlKSBuJydhIOl06SBjb25maWd1cullCitjb250YWluZXJCYXNlLm5vdFN0YXJ0ZWQ9TGUgY29udGVuZXVyIHswfSBuJydhIHBhcyDpdOkgZOltYXJy6QorZmFzdEVuZ2luZU1hcHBlci5hbHJlYWR5U3RhcnRlZD1sZSAiRmFzdEVuZ2luZU1hcHBlciIgezB9IGEgZOlq4CDpdOkgZOltYXJy6QorZmFzdEVuZ2luZU1hcHBlci5ub3RTdGFydGVkPUxlICJGYXN0RW5naW5lTWFwcGVyIiB7MH0gbicnYSBwYXMgZW5jb3JlIOl06SBk6W1hcnLpCitmaWx0ZXJDaGFpbi5maWx0ZXI9TCcnZXjpY3V0aW9uIGR1IGZpbHRyZSAoRmlsdGVyKSBhIGxhbmPpIHVuZSBleGNlcHRpb24KK2ZpbHRlckNoYWluLnNlcnZsZXQ9TCcnZXjpY3V0aW9uIGRlIGxhIHNlcnZsZXQgYSBsYW5j6SB1bmUgZXhjZXB0aW9uCitodHRwQ29udGV4dE1hcHBlci5jb250YWluZXI9Q2UgY29udGVuZXVyIG4nJ2VzdCBwYXMgdW4gIlN0YW5kYXJkQ29udGV4dCIKK2h0dHBFbmdpbmVNYXBwZXIuY29udGFpbmVyPUNlIGNvbnRlbmV1ciBuJydlc3QgcGFzIHVuICJTdGFuZGFyZEVuZ2luZSIKK2h0dHBIb3N0TWFwcGVyLmNvbnRhaW5lcj1DZSBjb250ZW5ldXIgbicnZXN0IHBhcyB1biAiU3RhbmRhcmRIb3N0IgoraW50ZXJjZXB0b3JWYWx2ZS5hbHJlYWR5U3RhcnRlZD1MYSB2YWx2ZSBkJydpbnRlcmNlcHRpb24gKEludGVyY2VwdG9yVmFsdmUpIGEgZOlq4CDpdOkgZOltYXJy6WUKK2ludGVyY2VwdG9yVmFsdmUubm90U3RhcnRlZD1MYSB2YWx2ZSBkJydpbnRlcmNlcHRpb24gKEludGVyY2VwdG9yVmFsdmUpIG4nJ2EgcGFzIGVuY29yZSDpdOkgZOltYXJy6WUKK25hbWluZy5iaW5kRmFpbGVkPUVjaGVjIGxvcnMgZHUgbGlhZ2Ug4CBsJydvYmpldDogezB9CituYW1pbmcudW5iaW5kRmFpbGVkPUVjaGVjIGxvcnMgZHUgZOlsaWFnZSDgIGwnJ29iamV0IDogezB9CituYW1pbmcuaW52YWxpZEVudkVudHJ5VHlwZT1MJydlbnRy6WUgZW52aXJvbm5lbWVudCB7MH0gYSB1biB0eXBlIGludmFsaWRlCituYW1pbmcuaW52YWxpZEVudkVudHJ5VmFsdWU9TCcnZW50cullIGVudmlyb25uZW1lbnQgezB9IGEgdW5lIHZhbGV1ciBpbnZhbGlkZQorbmFtaW5nLm5hbWluZ0NvbnRleHRDcmVhdGlvbkZhaWxlZD1MYSBjculhdGlvbiBkdSBjb250ZXh0IGRlIG5vbW1hZ2UgKG5hbWluZyBjb250ZXh0KSBhIOljaG916SA6IHswfQorc3RhbmRhcmRDb250ZXh0LmFscmVhZHlTdGFydGVkPUxlIGNvbnRleHRlIGEgZOlq4CDpdOkgZOltYXJy6Qorc3RhbmRhcmRDb250ZXh0LmFwcGxpY2F0aW9uTGlzdGVuZXI9RXJyZXVyIGxvcnMgZGUgbGEgY29uZmlndXJhdGlvbiBkZSBsYSBjbGFzc2UgZCcn6WNvdXRlIGRlIGwnJ2FwcGxpY2F0aW9uIChhcHBsaWNhdGlvbiBsaXN0ZW5lcikgezB9CitzdGFuZGFyZENvbnRleHQuYXBwbGljYXRpb25Ta2lwcGVkPUwnJ2luc3RhbGxhdGlvbiBkZXMg6WNvdXRldXJzIChsaXN0ZW5lcnMpIGRlIGwnJ2FwcGxpY2F0aW9uIGEg6XTpIHNhdXTpZSBzdWl0ZSBhdXggZXJyZXVycyBwculj6WRlbnRlcworc3RhbmRhcmRDb250ZXh0LmJhZFJlcXVlc3Q9Q2hlbWluIGRlIHJlcXXqdGUgaW52YWxpZGUgKHswfSkuCitzdGFuZGFyZENvbnRleHQuZXJyb3JQYWdlLmVycm9yPUxhIHBvc2l0aW9uIGRlIGxhIHBhZ2UgZCcnZXJyZXVyIChFcnJvclBhZ2UpIHswfSBkb2l0IGNvbW1lbmNlciBwYXIgdW4gJycvJworc3RhbmRhcmRDb250ZXh0LmVycm9yUGFnZS5yZXF1aXJlZD1MYSBwYWdlIGQnJ2VycmV1ciAoRXJyb3JQYWdlKSBuZSBwZXV0IOp0cmUgbnVsbGUKK3N0YW5kYXJkQ29udGV4dC5lcnJvclBhZ2Uud2FybmluZz1BVFRFTlRJT046IExhIHBvc2l0aW9uIGRlIGxhIHBhZ2UgZCcnZXJyZXVyIChFcnJvclBhZ2UpIHswfSBkb2l0IGNvbW1lbmNlciBwYXIgdW4gJycvJycgZGFucyBsJydBUEkgU2VydmxldCAyLjQKK3N0YW5kYXJkQ29udGV4dC5maWx0ZXJNYXAuZWl0aGVyPUwnJ2Fzc29jaWF0aW9uIGRlIGZpbHRyZSAoZmlsdGVyIG1hcHBpbmcpIGRvaXQgaW5kaXF16SBzb2l0IHVuZSA8dXJsLXBhdHRlcm4+IG91IHVuZSA8c2VydmxldC1uYW1lPgorc3RhbmRhcmRDb250ZXh0LmZpbHRlck1hcC5uYW1lPUwnJ2Fzc29jaWF0aW9uIGRlIGZpbHRyZSAoZmlsdGVyIG1hcHBpbmcpIGluZGlxdWUgdW4gbm9tIGRlIGZpbHRyZSBpbmNvbm51IHswfQorc3RhbmRhcmRDb250ZXh0LmZpbHRlck1hcC5wYXR0ZXJuPTx1cmwtcGF0dGVybj4gezB9IGludmFsaWRlIGRhbnMgbCcnYXNzb2NpYXRpb24gZGUgZmlsdHJlIChmaWx0ZXIgbWFwcGluZykKK3N0YW5kYXJkQ29udGV4dC5maWx0ZXJTdGFydD1FeGNlcHRpb24gYXUgZOltYXJyYWdlIGR1IGZpbHRyZSB7MH0KK3N0YW5kYXJkQ29udGV4dC5maWx0ZXJTdGFydEZhaWxlZD1FY2hlYyBkdSBk6W1hcnJhZ2UgZGVzIGZpbHRyZXMgZCcnYXBwbGljYXRpb24KK3N0YW5kYXJkQ29udGV4dC5yZXF1ZXN0TGlzdGVuZXJTdGFydEZhaWxlZD1FY2hlYyBk6W1hcnJhZ2UgZGVzIFZhbHZlcyBkJyfpY291dGUKK3N0YW5kYXJkQ29udGV4dC5yZXF1ZXN0TGlzdGVuZXJDb25maWcuYWRkZWQ9QWpvdXQgZGUgbGEgdmFsdmUgZCcn6WNvdXRlCitzdGFuZGFyZENvbnRleHQucmVxdWVzdExpc3RlbmVyQ29uZmlnLmVycm9yPUV4Y2VwdGlvbiBsb3JzIGRlIGwnJ2Fqb3V0IGRlIGxhIHZhbHZlIGQnJ+ljb3V0ZSBkZSByZXF16nRlOiB7MH0KK3N0YW5kYXJkQ29udGV4dC5pc1VuYXZhaWxhYmxlPUNldHRlIGFwcGxpY2F0aW9uIG4nJ2VzdCBwYXMgZGlzcG9uaWJsZSBhY3R1ZWxsZW1lbnQKK3N0YW5kYXJkQ29udGV4dC5saXN0ZW5lclN0YXJ0PUV4Y2VwdGlvbiBsb3JzIGRlIGwnJ2Vudm9pIGRlIGwnJ+l26G5lbWVudCBjb250ZXh0ZSBpbml0aWFsaXPpIChjb250ZXh0IGluaXRpYWxpemVkKSDgIGwnJ2luc3RhbmNlIGRlIGNsYXNzZSBkJyfpY291dGUgKGxpc3RlbmVyKSB7MH0KK3N0YW5kYXJkQ29udGV4dC5saXN0ZW5lclN0YXJ0RmFpbGVkPUVjaGVjIGR1IGTpbWFycmFnZSBkZXMg6WNvdXRldXJzIChsaXN0ZW5lcnMpIGQnJ2FwcGxpY2F0aW9uCitzdGFuZGFyZENvbnRleHQubGlzdGVuZXJTdG9wPUV4Y2VwdGlvbiBsb3JzIGRlIGwnJ2Vudm9pIGRlIGwnJ+l26G5lbWVudCBjb250ZXh0ZSBk6XRydWl0IChjb250ZXh0IGRlc3Ryb3llZCkg4CBsJydpbnN0YW5jZSBkZSBjbGFzc2UgZCcn6WNvdXRlIHswfQorc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmVycm9yUGFnZT1MYSBmb3JtZSBkZSBwYWdlIGQnJ2VycmV1ciAoZm9ybSBlcnJvciBwYWdlKSB7MH0gZG9pdCBjb21tZW5jZXIgcGFyIHVuICcnLycnCitzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcuZXJyb3JXYXJuaW5nPUFUVEVOVElPTjogTGEgZm9ybWUgZGUgcGFnZSBkJydlcnJldXIgKGZvcm0gZXJyb3IgcGFnZSkgezB9IGRvaXQgY29tbWVuY2VyIHBhciB1biAnJy8nJyBkYW5zIGwnJ0FQSSBTZXJ2bGV0IDIuNAorc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmxvZ2luUGFnZT1MYSBmb3JtZSBkZSBwYWdlIGRlIGNvbm5leGlvbiAoZm9ybSBsb2dpbiBwYWdlKSB7MH0gZG9pdCBjb21tZW5jZXIgcGFyIHVuICcnLycnCitzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcubG9naW5XYXJuaW5nPUFUVEVOVElPTjogTGEgZm9ybWUgZGUgcGFnZSBkZSBjb25uZXhpb24gKGZvcm0gbG9naW4gcGFnZSkgezB9IGRvaXQgY29tbWVuY2VyIHBhciB1biAnJy8nJyBkYW5zIGwnJ0FQSSBTZXJ2bGV0IDIuNAorc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLnJlcXVpcmVkPSJMb2dpbkNvbmZpZyIgbmUgcGV1dCDqdHJlIG51bAorc3RhbmRhcmRDb250ZXh0Lm1hcHBpbmdFcnJvcj1FcnJldXIgZGFucyBsYSBjb25maWd1cmF0aW9uIGQnJ2Fzc29jaWF0aW9uIChtYXBwaW5nIGNvbmZpZ3VyYXRpb24pIHBvdXIgbCcnVVJJIHJlbGF0aXZlIHswfQorc3RhbmRhcmRDb250ZXh0Lm5vdEZvdW5kPUxhIHJlc3NvdXJjZSBkZW1hbmTpZSAoezB9KSBuJydlc3QgcGFzIGRpc3BvbmlibGUuCitzdGFuZGFyZENvbnRleHQubm90UmVsb2FkYWJsZT1MZSByZWNoYXJnZW1lbnQgZXN0IGTpc2FjdGl26SBwb3VyIGNlIGNvbnRleHRlCitzdGFuZGFyZENvbnRleHQubm90U3RhcnRlZD1MZSBjb250ZXh0ZSBuJydhIHBhcyBlbmNvcmUg6XTpIGTpbWFycukKK3N0YW5kYXJkQ29udGV4dC5ub3RXcmFwcGVyPUxlIGZpbHMgZHUgY29udGV4dGUgKGNoaWxkIG9mIGNvbnRleHQpIGRvaXQg6nRyZSB1biBlbnJvYmV1ciAod3JhcHBlcikKK3N0YW5kYXJkQ29udGV4dC5wYXJhbWV0ZXIuZHVwbGljYXRlPVBhcmFt6HRyZSBkJydpbml0aWFsaXNhdGlvbiBkZSBjb250ZXh0ZSBkdXBsaXF16SB7MH0KK3N0YW5kYXJkQ29udGV4dC5wYXJhbWV0ZXIucmVxdWlyZWQ9TGUgbm9tIGRlIHBhcmFt6HRyZSBhaW5zaSBxdWUgbGEgdmFsZXVyIGR1IHBhcmFt6HRyZSBzb250IHJlcXVpcworc3RhbmRhcmRDb250ZXh0LnJlbG9hZGluZ0NvbXBsZXRlZD1MZSByZWNoYXJnZW1lbnQgZGUgY2UgY29udGV4dGUgZXN0IHRlcm1pbukKK3N0YW5kYXJkQ29udGV4dC5yZWxvYWRpbmdGYWlsZWQ9TGUgcmVjaGFyZ2VtZW50IGRlIGNlIGNvbnRleHRlIGEg6WNob3XpIHN1aXRlIOAgdW5lIGVycmV1ciBwculj6WRlbnRlCitzdGFuZGFyZENvbnRleHQucmVsb2FkaW5nU3RhcnRlZD1MZSByZWNoYXJnZW1lbnQgZGUgY2UgY29udGV4dGUgYSBk6W1hcnLpCitzdGFuZGFyZENvbnRleHQucmVxdWVzdExpc3RlbmVyLnJlcXVlc3RJbml0PVVuZSBleGNlcHRpb24gbG9ycyBkZSBsJydlbnZvaSBkZSByZXF16nRlIGEgaW5pdGnpIHVuIOl26G5lbWVudCBjeWNsZSBkZSB2aWUgKGxpZmVjeWNsZSBldmVudCkgcG91ciBsJydpbnN0YW5jZSBkZSBjbGFzc2Ug4CBsJyfpY291dGUgKGxpc3RlbmVyKSB7MH0KK3N0YW5kYXJkQ29udGV4dC5yZXF1ZXN0TGlzdGVuZXIucmVxdWVzdERlc3Ryb3k9VW5lIGV4Y2VwdGlvbiBsb3JzIGRlIGwnJ2Vudm9pIGRlIHJlcXXqdGUgYSBk6XRydWl0IHVuIOl26G5lbWVudCBjeWNsZSBkZSB2aWUgKGxpZmVjeWNsZSBldmVudCkgcG91ciBsJydpbnN0YW5jZSBkZSBjbGFzc2Ug4CBsJyfpY291dGUgKGxpc3RlbmVyKSB7MH0KK3N0YW5kYXJkQ29udGV4dC5zZWN1cml0eUNvbnN0cmFpbnQucGF0dGVybj08dXJsLXBhdHRlcm4+IHswfSBpbnZhbGlkZSBkJydhcHLocyBsZXMgY29udHJhaW50ZXMgZGUgc+ljdXJpdOkgKHNlY3VyaXR5IGNvbnN0cmFpbnQpCitzdGFuZGFyZENvbnRleHQuc2VydmxldE1hcC5uYW1lPUwnJ2Fzc29jaWF0aW9uIGRlIHNlcnZsZXQgKHNlcnZsZXQgbWFwcGluZykgaW5kaXF1ZSB1biBub20gZGUgc2VydmxldCBpbmNvbm51IHswfQorc3RhbmRhcmRDb250ZXh0LnNlcnZsZXRNYXAucGF0dGVybj08dXJsLXBhdHRlcm4+IHswfSBpbnZhbGlkZSBkYW5zIGwnJ2Fzc29jaWF0aW9uIGRlIHNlcnZsZXQgKHNlcnZsZXQgbWFwcGluZykKK3N0YW5kYXJkQ29udGV4dC5zdGFydENsZWFudXA9RXhjZXB0aW9uIGxvcnMgZHUgbmV0dG95YWdlIGFwcuhzIHF1ZSBsZSBk6W1hcnJhZ2UgYWl0IOljaG916Qorc3RhbmRhcmRDb250ZXh0LnN0YXJ0RmFpbGVkPUVycmV1ciBkZSBk6W1hcnJhZ2UgZHUgY29udGV4dGUgW3swfV0gc3VpdGUgYXV4IGVycmV1cnMgcHLpY+lkZW50ZXMKK3N0YW5kYXJkQ29udGV4dC5zdGFydGluZ0xvYWRlcj1FeGNlcHRpb24gYW4gZOltYXJyYWdlIGR1ICJMb2FkZXIiCitzdGFuZGFyZENvbnRleHQuc3RhcnRpbmdNYW5hZ2VyPUV4Y2VwdGlvbiBhbiBk6W1hcnJhZ2UgZHUgIk1hbmFnZXIiCitzdGFuZGFyZENvbnRleHQuc3RhcnRpbmdXcmFwcGVyPUV4Y2VwdGlvbiBhbiBk6W1hcnJhZ2UgZGUgbCcnZW5yb2JldXIgKHdyYXBwZXIpIGRlIGxhIHNlcnZsZXQgezB9CitzdGFuZGFyZENvbnRleHQuc3RvcHBpbmdDb250ZXh0PUV4Y2VwdGlvbiA/IGwnJ2Fycj90IGR1ICJDb250ZXh0Igorc3RhbmRhcmRDb250ZXh0LnN0b3BwaW5nTG9hZGVyPUV4Y2VwdGlvbiDgIGwnJ2Fycup0IGR1ICJMb2FkZXIiCitzdGFuZGFyZENvbnRleHQuc3RvcHBpbmdNYW5hZ2VyPUV4Y2VwdGlvbiDgIGwnJ2Fycup0IGR1ICJNYW5hZ2VyIgorc3RhbmRhcmRDb250ZXh0LnN0b3BwaW5nV3JhcHBlcj1FeGNlcHRpb24g4CBsJydhcnLqdCBkZSBsJydlbnJvYmV1ciAod3JhcHBlcikgZGUgbGEgc2VydmxldCB7MH0KK3N0YW5kYXJkQ29udGV4dC5yZXNvdXJjZXNTdGFydD1FcnJldXIgbG9ycyBkdSBk6W1hcnJhZ2UgZGVzIFJlc291cmNlcyBzdGF0aXF1ZXMKK3N0YW5kYXJkQ29udGV4dC51cmxEZWNvZGU9SW1wb3NzaWJsZSBkZSBk6WNvZGVyIGxlIGNoZW1pbiBkZSByZXF16nRlIGVuY29k6SBkYW5zIGwnJ1VSTCB7MH0KK3N0YW5kYXJkQ29udGV4dC51cmxQYXR0ZXJuLnBhdHRlcm5XYXJuaW5nPUFUVEVOVElPTjogTGUgbW9k6GxlIChwYXR0ZXJuKSBVUkwgezB9IGRvaXQgY29tbWVuY2VyIHBhciB1biAnJy8nJyBkYW5zIGwnJ0FQSSBTZXJ2bGV0IDIuNAorc3RhbmRhcmRDb250ZXh0LnVybFZhbGlkYXRlPUltcG9zc2libGUgZGUgdmFsaWRlciBsZSBjaGVtaW4gZGUgcmVxdep0ZSBlbmNvZOkgZGFucyBsJydVUkwgezB9CitzdGFuZGFyZENvbnRleHQud3JhcHBlci5lcnJvcj1MZSBmaWNoaWVyIEpTUCB7MH0gZG9pdCBjb21tZW5jZXIgcGFyIHVuICcnLycnCitzdGFuZGFyZENvbnRleHQud3JhcHBlci53YXJuaW5nPUFUVEVOVElPTjogTGUgZmljaGllciBKU1AgezB9IGRvaXQgY29tbWVuY2VyIHBhciB1biAgJycvJycgZGFucyBsJydBUEkgU2VydmxldCAyLjQKK3N0YW5kYXJkRW5naW5lLmFscmVhZHlTdGFydGVkPUxlIG1vdGV1ciBhIGTpauAg6XTpIGTpbWFycukKK3N0YW5kYXJkRW5naW5lLm1hcHBpbmdFcnJvcj1FcnJldXIgZGUgY29uZmlndXJhdGlvbiBkJydhc3NvY2lhdGlvbiAobWFwcGluZyBjb25maWd1cmF0aW9uKSBwb3VyIGxlIHNlcnZldXIgezB9CitzdGFuZGFyZEVuZ2luZS5ub0hvc3Q9QXVjdW5lIGj0dGUgKGhvc3QpIG5lIGNvcnJlc3BvbmQgYXUgbm9tIGRlIHNlcnZldXIgezB9CitzdGFuZGFyZEVuZ2luZS5ub0hvc3RIZWFkZXI9cmVxdep0ZSBIVFRQLzEuMSBzYW5zIGVudOp0ZSBIb3N0OiAKK3N0YW5kYXJkRW5naW5lLm5vdEhvc3Q9TGUgZmlscyBkJyd1biBtb3RldXIgKGNoaWxkIG9mIGFuIEVuZ2luZSkgZG9pdCDqdHJlIHVuIGj0dGUKK3N0YW5kYXJkRW5naW5lLm5vdFBhcmVudD1MZXMgbW90ZXVycyAoZW5naW5lKSBuZSBwZXV2ZW50IGF2b2lyIGRlIHBhcmVudCBjb250ZW5ldXIgKGNvbnRhaW5lcikKK3N0YW5kYXJkRW5naW5lLm5vdFN0YXJ0ZWQ9TGUgbW90ZXVyIG4nJ2EgcGFzIGVuY29yZSDpdOkgZOltYXJy6Qorc3RhbmRhcmRFbmdpbmUudW5mb3VuZEhvc3Q9TCcnaPR0ZSB2aXJ0dWVsICh2aXJ0dWFsIGhvc3QpIHswfSBlc3QgaW50cm91dmFibGUKK3N0YW5kYXJkRW5naW5lLnVua25vd25Ib3N0PUF1Y3VuIHNlcnZldXIgaPR0ZSBuJydlc3QgaW5kaXF16SBwb3VyIGNldHRlIHJlcXXqdGUKK3N0YW5kYXJkSG9zdC5hY2Nlc3NCYXNlPUltcG9zc2libGUgZCcnYWNj6WRlciBsZSBy6XBlcnRvaXJlICJkb2N1bWVudCBiYXNlIiB7MH0KK3N0YW5kYXJkSG9zdC5hbHJlYWR5U3RhcnRlZD1MJydo9HRlIGEgZOlq4CDpdOkgZOltYXJy6Qorc3RhbmRhcmRIb3N0LmFwcEJhc2U9TGUgculwZXJ0b2lyZSBkZSBiYXNlIGRlIGwnJ2FwcGxpY2F0aW9uIHswfSBuJydleGlzdGUgcGFzCitzdGFuZGFyZEhvc3QuY29uZmlnUmVxdWlyZWQ9VW5lIFVSTCB2ZXJzIGxlIGZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiBlc3Qgb2JsaWdhdG9pcmUKK3N0YW5kYXJkSG9zdC5jb25maWdOb3RBbGxvd2VkPUwnJ3V0aWxpc2F0aW9uIGQnJ3VuIGZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiBmaWxlIG4nJ2VzdCBwYXMgYXV0b3Jpc+kKK3N0YW5kYXJkSG9zdC5pbnN0YWxsaW5nPUluc3RhbGxhdGlvbiBkJyd1bmUgYXBwbGljYXRpb24gcG91ciBsZSBjaGVtaW4gZGUgY29udGV4dGUgezB9IGRlcHVpcyBsJydVUkwgezF9CitzdGFuZGFyZEhvc3QuaW5zdGFsbGluZ1dBUj1JbnN0YWxsYXRpb24gZCcndW5lIGFwcGxpY2F0aW9uIGRlcHVpcyBsJydVUkwgezB9CitzdGFuZGFyZEhvc3QuaW5zdGFsbEVycm9yPUVycmV1ciBsb3JzIGR1IGTpcGxvaWVtZW50IGRlIGwnJ2FwcGxpY2F0aW9uIHBvdXIgbGUgY2hlbWluIGRlIGNvbnRleHRlIHswfQorc3RhbmRhcmRIb3N0LmludmFsaWRFcnJvclJlcG9ydFZhbHZlQ2xhc3M9SW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGxhIGNsYXNzZSB2YWx2ZSBkZSByYXBwb3J0IGQnJ2VycmV1cjogezB9CitzdGFuZGFyZEhvc3QuZG9jQmFzZT1MZSBy6XBlcnRvaXJlICJkb2N1bWVudCBiYXNlIiB7MH0gZXhpc3RlIGTpauAKK3N0YW5kYXJkSG9zdC5tYXBwaW5nRXJyb3I9RXJyZXVyIGQnJ2Fzc29jaWF0aW9uIGRlIGNvbmZpZ3VyYXRpb24gKG1hcHBpbmcgY29uZmlndXJhdGlvbikgcG91ciBsJydVUkkgZGVtYW5k6WUgezB9CitzdGFuZGFyZEhvc3Qubm9Db250ZXh0PUF1Y3VuZSBjb250ZXh0ZSBuJydlc3QgY29uZmlndXLpIHBvdXIgdHJhaXRlciBjZXR0ZSByZXF16nRlCitzdGFuZGFyZEhvc3Qubm9Ib3N0PUF1Y3VuIGj0dGUgbicnZXN0IGNvbmZpZ3Vy6SBwb3VyIHRyYWl0ZXIgY2V0dGUgcmVxdep0ZQorc3RhbmRhcmRIb3N0Lm5vdENvbnRleHQ9TGUgZmlscyBkJyd1biBo9HRlIChjaGlsZCBvZiBhIEhvc3QpIGRvaXQg6nRyZSB1biBjb250ZXh0ZQorc3RhbmRhcmRIb3N0Lm5vdFN0YXJ0ZWQ9bCcnaPR0ZSBuJydhIHBhcyBlbmNvcmUg6XTpIGTpbWFycukKK3N0YW5kYXJkSG9zdC5udWxsTmFtZT1MZSBub20gZCcnaPR0ZSBlc3QgcmVxdWlzCitzdGFuZGFyZEhvc3QucGF0aEZvcm1hdD1DaGVtaW4gZGUgY29udGV4dGUgaW52YWxpZGU6IHswfQorc3RhbmRhcmRIb3N0LnBhdGhNaXNzaW5nPUxlIGNoZW1pbiBkZSBjb250ZXh0ZSB7MH0gbicnZXN0IHBhcyB1dGlsaXPpIGFjdHVlbGxlbWVudAorc3RhbmRhcmRIb3N0LnBhdGhSZXF1aXJlZD1MZSBjaGVtaW4gZGUgY29udGV4dGUgZXN0IHJlcXVpcworc3RhbmRhcmRIb3N0LnBhdGhVc2VkPUxlIGNoZW1pbiBkZSBjb250ZXh0ZSB7MH0gZXN0IGTpauAgdXRpbGlz6Qorc3RhbmRhcmRIb3N0LnJlbW92aW5nPVJldHJhaXQgZGUgbCcnYXBwbGljYXRpb24gd2ViIHBvdXIgbGUgY2hlbWluIGRlIGNvbnRleHRlIHswfQorc3RhbmRhcmRIb3N0LnJlbW92ZUVycm9yPUVycmV1ciBsb3JzIGR1IHJldHJhaXQgZGUgbCcnYXBwbGljYXRpb24gd2ViIHBvdXIgbGUgY2hlbWluIGRlIGNvbnRleHRlIHswfQorc3RhbmRhcmRIb3N0LnN0YXJ0PUTpbWFycmFnZSBkZSBsJydhcHBsaWNhdGlvbiB3ZWIgYXBwbGljYXRpb24gcG91ciBsZSBjaGVtaW4gZGUgY29udGV4dGUgezB9CitzdGFuZGFyZEhvc3Quc3RvcD1BcnLpdCBkZSBsJydhcHBsaWNhdGlvbiB3ZWIgYXBwbGljYXRpb24gcG91ciBsZSBjaGVtaW4gZGUgY29udGV4dGUgezB9CitzdGFuZGFyZEhvc3QudW5mb3VuZENvbnRleHQ9SW1wb3NzaWJsZSBkZSB0cm91dmVyIHVuIGNvbnRleHRlIHBvdXIgbCcnVVJJIHswfSBkZW1hbmTpZQorc3RhbmRhcmRIb3N0LndhclJlcXVpcmVkPVVuZSBVUkwgdmVycyBsJydhcmNoaXZlIGQnJ2FwcGxpY2F0aW9uIHdlYiAod2FyKSBlc3QgbuljZXNzYWlyZSAKK3N0YW5kYXJkSG9zdC53YXJVUkw9VVJMIHZlcnMgbCcnYXJjaGl2ZSBkJydhcHBsaWNhdGlvbiB3ZWIgKHdhcikgaW52YWxpZGU6IHswfQorc3RhbmRhcmRQaXBlbGluZS5hbHJlYWR5U3RhcnRlZD1MZSAiUGlwZWxpbmUiIGEgZOlq4CDpdOkgZOltYXJy6Qorc3RhbmRhcmRQaXBlbGluZS5ub3RTdGFydGVkPWxlICJQaXBlbGluZSIgbicnYSBwYXMg6XTpIGTpbWFycukKK3N0YW5kYXJkUGlwZWxpbmUubm9WYWx2ZT1QbHVzIGF1Y3VuZSBWYWx2ZXMgZGFucyBsZSAiUGlwZWxpbmUiIHRyYWl0YW50IGNldHRlIHJlcXXqdGUKK3N0YW5kYXJkU2VydmVyLmFkZENvbnRhaW5lci5pc2U9QXVjdW4gY29ubmVjdGV1ciBkaXNwb25pYmxlIOAgYXNzb2NpZXIgYXZlYyBjZSBjb250ZW5ldXIgKGNvbnRhaW5lcikKK3N0YW5kYXJkU2VydmVyLmluaXRpYWxpemUuaW5pdGlhbGl6ZWQ9Q2Ugc2VydmV1ciBhIGTpauAg6XTpIGluaXRpYWxpc+kKK3N0YW5kYXJkU2VydmVyLnN0YXJ0LmNvbm5lY3RvcnM9QXUgbW9pbnMgdW4gY29ubmVjdGV1ciBuJydlc3QgcGFzIGFzc29jaekg4CBhdWN1biBjb250ZW5ldXIgKGNvbnRhaW5lcikKK3N0YW5kYXJkU2VydmVyLnN0YXJ0LnN0YXJ0ZWQ9Q2Ugc2VydmV1ciBhIGTpauAg6XTpIGTpbWFycukKK3N0YW5kYXJkU2VydmVyLnN0b3Aubm90U3RhcnRlZD1DZSBzZXJ2ZXVyIG4nJ2EgcGFzIGVuY29yZSDpdOkgZOltYXJy6Qorc3RhbmRhcmRTZXJ2aWNlLmluaXRpYWxpemUuaW5pdGlhbGl6ZWQ9Q2Ugc2VydmljZSBhIGTpauAg6XTpIGluaXRpYWxpc+kKK3N0YW5kYXJkU2VydmljZS5zdGFydC5uYW1lPUTpbWFycmFnZSBkdSBzZXJ2aWNlIHswfQorc3RhbmRhcmRTZXJ2aWNlLnN0YXJ0LnN0YXJ0ZWQ9Q2Ugc2VydmljZSBhIGTpauAg6XTpIGTpbWFycukKK3N0YW5kYXJkU2VydmljZS5zdG9wLm5hbWU9QXJy6nQgZHUgc2VydmljZSB7MH0KK3N0YW5kYXJkU2VydmljZS5zdG9wLm5vdFN0YXJ0ZWQ9Q2Ugc2VydmljZSBuJydhIHBhcyBlbmNvcmUg6XTpIGTpbWFycukKK3N0YW5kYXJkV3JhcHBlci5hbGxvY2F0ZT1FcnJldXIgZCcnYWxsb2NhdGlvbiDgIHVuZSBpbnN0YW5jZSBkZSBzZXJ2bGV0CitzdGFuZGFyZFdyYXBwZXIuYWxsb2NhdGVFeGNlcHRpb249RXhjZXB0aW9uIGxvcnMgZGUgbCcnYWxsb2NhdGlvbiBwb3VyIGxhIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuY29udGFpbmVyU2VydmxldD1DaGFyZ2VtZW50IGR1IGNvbnRlbmV1ciAoY29udGFpbmVyKSBkZSBzZXJ2bGV0IHswfQorc3RhbmRhcmRXcmFwcGVyLmNyZWF0ZUZpbHRlcnM9RXhjZXB0aW9uIOAgbGEgY3LpYXRpb24gZGUgZmlsdHJlcyBwb3VyIGxhIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuZGVhbGxvY2F0ZUV4Y2VwdGlvbj1FeGNlcHRpb24g4CBsYSBk6XNhbGxvY2F0aW9uIHBvdXIgbGEgc2VydmxldCB7MH0KK3N0YW5kYXJkV3JhcHBlci5kZXN0cm95RXhjZXB0aW9uPSJTZXJ2bGV0LmRlc3Ryb3koKSIgZGUgbGEgc2VydmxldCB7MH0gYSBn6W7pcukgdW5lIGV4Y2VwdGlvbgorc3RhbmRhcmRXcmFwcGVyLmV4Y2VwdGlvbjA9UmFwcG9ydCBkJydleGNlcHRpb24gVG9tY2F0CitzdGFuZGFyZFdyYXBwZXIuZXhjZXB0aW9uMT1VbmUgZXhjZXB0aW9uIFNlcnZsZXQgcycnZXN0IHByb2R1aXRlCitzdGFuZGFyZFdyYXBwZXIuZXhjZXB0aW9uMj1SYXBwb3J0IGQnJ2V4Y2VwdGlvbjoKK3N0YW5kYXJkV3JhcHBlci5leGNlcHRpb24zPUNhdXNlIG3ocmU6CitzdGFuZGFyZFdyYXBwZXIuaW5pdEV4Y2VwdGlvbj0iU2VydmxldC5pbml0KCkiIHBvdXIgbGEgc2VydmxldCB7MH0gYSBn6W7pcukgdW5lIGV4Y2VwdGlvbgorc3RhbmRhcmRXcmFwcGVyLmluc3RhbnRpYXRlPUVycmV1ciDgIGwnJ2luc3RhbnRpYXRpb24gZGUgbGEgY2xhc3NlIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuaXNVbmF2YWlsYWJsZT1MYSBzZXJ2bGV0IHswfSBlc3QgYWN0dWVsbGVtZW50IGluZGlzcG9uaWJsZQorc3RhbmRhcmRXcmFwcGVyLmphc3BlckxvYWRlcj1VdGlsaXNhdGlvbiBkdSBjaGFyZ2V1ciBkZSBjbGFzc2UgSmFzcGVyIChjbGFzc2xvYWRlcikgcG91ciBsYSBzZXJ2bGV0IHswfQorc3RhbmRhcmRXcmFwcGVyLmpzcEZpbGUuZm9ybWF0PUxlIGZpY2hpZXIgSlNQIHswfSBuZSBjb21tZW5jZSBwYXIgcGFyIHVuIGNhcmFjdOhyZSAnJy8nJworc3RhbmRhcmRXcmFwcGVyLmxvYWRFeGNlcHRpb249TGEgc2VydmxldCB7MH0gYSBn6W7pcukgdW5lIGV4Y2VwdGlvbiAibG9hZCgpIgorc3RhbmRhcmRXcmFwcGVyLm1pc3NpbmdDbGFzcz1MJydlbnJvYmV1ciAod3JhcHBlcikgbmUgcGV1dCB0cm91dmVyIGxhIGNsYXNzZSBzZXJ2bGV0IHswfSBvdSB1bmUgY2xhc3NlIGRvbnQgZWxsZSBk6XBlbmQKK3N0YW5kYXJkV3JhcHBlci5taXNzaW5nTG9hZGVyPUwnJ2Vucm9iZXVyICh3cmFwcGVyKSBuZSBwZXV0IHRyb3V2ZXIgZGUgY2hhcmdldXIgKGxvYWRlcikgcG91ciBsYSBzZXJ2bGV0IHswfQorc3RhbmRhcmRXcmFwcGVyLm5vdENoaWxkPUwnJ2Vucm9iZXVyIGRlIGNvbnRlbmV1ciAod3JhcHBlciBjb250YWluZXIpIHBldXQgbmUgcGFzIGF2b2lyIGRlIGNvbnRlbmV1cnMgZmlscworc3RhbmRhcmRXcmFwcGVyLm5vdENsYXNzPUF1Y3VuZSBjbGFzc2Ugc2VydmxldCBuJydhIOl06SBzcOljaWZp6WUgcG91ciBsYSBzZXJ2bGV0IHswfQorc3RhbmRhcmRXcmFwcGVyLm5vdENvbnRleHQ9TGUgY29udGVuZXVyIHBhcmVudCBkJyd1biBlbnJvYmV1ciAod3JhcHBlcikgZG9pdCDqdHJlIHVuIGNvbnRleHRlCitzdGFuZGFyZFdyYXBwZXIubm90Rm91bmQ9U2VydmxldCB7MH0gbicnZXN0IHBhcyBkaXNwb25pYmxlLgorc3RhbmRhcmRXcmFwcGVyLm5vdFNlcnZsZXQ9TGEgY2xhc3NlIHswfSBuJydlc3QgcGFzIHVuZSBzZXJ2bGV0CitzdGFuZGFyZFdyYXBwZXIucHJpdmlsZWdlZFNlcnZsZXQ9TGEgc2VydmxldCBkZSBjbGFzc2UgezB9IGVzdCBwcml2aWzpZ2npZSAocHJpdmlsZWdlZCkgZXQgbmUgcGV1dCDqdHJlIGNoYXJn6SBwYXIgY2V0dGUgYXBwbGljYXRpb24gd2ViCitzdGFuZGFyZFdyYXBwZXIucmVsZWFzZUZpbHRlcnM9RXhjZXB0aW9uIGRlcyBmaWx0cmVzIGRlIHNvcnRpZSAocmVsZWFzZSBmaWx0ZXJzKSBwb3VyIGxhIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuc2VydmljZUV4Y2VwdGlvbj0iU2VydmxldC5zZXJ2aWNlKCkiIHBvdXIgbGEgc2VydmxldCB7MH0gYSBn6W7pcukgdW5lIGV4Y2VwdGlvbgorc3RhbmRhcmRXcmFwcGVyLnN0YXR1c0hlYWRlcj1FdGF0IEhUVFAgezB9IC0gezF9CitzdGFuZGFyZFdyYXBwZXIuc3RhdHVzVGl0bGU9UmFwcG9ydCBkJydlcnJldXIgVG9tY2F0CitzdGFuZGFyZFdyYXBwZXIudW5hdmFpbGFibGU9TGEgc2VydmxldCB7MH0gZXN0IG1hcnF16SBjb21tZSBpbmRpc3BvbmlibGUKK3N0YW5kYXJkV3JhcHBlci51bmxvYWRFeGNlcHRpb249TGEgc2VydmxldCB7MH0gYSBn6W7pcukgdW5lIGV4Y2VwdGlvbiAidW5sb2FkKCkiCitzdGFuZGFyZFdyYXBwZXIudW5sb2FkaW5nPUltcG9zc2libGUgZCcnYWxsb3VlciBsYSBzZXJ2bGV0IHswfSBjYXIgZWxsZSBhIOl06SBk6WNoYXJn6WUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjMjVmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTc0IEBACithcHBsaWNhdGlvbkNvbnRleHQuYXR0cmlidXRlRXZlbnQ9XHU1YzVlXHU2MDI3XHUzMGE0XHUzMGQ5XHUzMGYzXHUzMGM4XHUzMGVhXHUzMGI5XHUzMGNhXHUzMDZiXHUzMDg4XHUzMDYzXHUzMDY2XHU0ZjhiXHU1OTE2XHUzMDRjXHU2Mjk1XHUzMDUyXHUzMDg5XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmCithcHBsaWNhdGlvbkNvbnRleHQubWFwcGluZy5lcnJvcj1cdTMwZGVcdTMwYzNcdTMwZDRcdTMwZjNcdTMwYjBcdTRlMmRcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK2FwcGxpY2F0aW9uQ29udGV4dC5yZXF1ZXN0RGlzcGF0Y2hlci5pYWU9XHUzMGQxXHUzMGI5IHswfSBcdTMwNGMiLyJcdTY1ODdcdTViNTdcdTMwNjdcdTU5Y2JcdTMwN2VcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK2FwcGxpY2F0aW9uQ29udGV4dC5zZXRBdHRyaWJ1dGUubmFtZW51bGw9bmFtZVx1MzA0Y251bGxcdTMwNjdcdTMwNmZcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5hbGxvY2F0ZUV4Y2VwdGlvbj1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzggezB9IFx1MzA2Ylx1NGY4Ylx1NTkxNlx1MzA5Mlx1NTI3Mlx1MzA4YVx1NWY1M1x1MzA2Nlx1MzA3ZVx1MzA1OQorYXBwbGljYXRpb25EaXNwYXRjaGVyLmRlYWxsb2NhdGVFeGNlcHRpb249XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4IHswfSBcdTMwNmVcdTRmOGJcdTU5MTZcdTMwOTJcdTg5ZTNcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTkKK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5mb3J3YXJkLmlzZT1cdTMwZWNcdTMwYjlcdTMwZGRcdTMwZjNcdTMwYjlcdTMwOTJcdTMwYjNcdTMwZGZcdTMwYzNcdTMwYzhcdTMwNTdcdTMwNWZcdTVmOGNcdTMwNjdcdTMwZDVcdTMwYTlcdTMwZWZcdTMwZmNcdTMwYzlcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5mb3J3YXJkLnRocm93PVx1MzBkNVx1MzBhOVx1MzBlZlx1MzBmY1x1MzBjOVx1MzA1N1x1MzA1Zlx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzA0Y1x1NGY4Ylx1NTkxNlx1MzA5Mlx1NjI5NVx1MzA1Mlx1MzA3ZVx1MzA1N1x1MzA1ZgorYXBwbGljYXRpb25EaXNwYXRjaGVyLmluY2x1ZGUudGhyb3c9XHUzMGE0XHUzMGYzXHUzMGFmXHUzMGViXHUzMGZjXHUzMGM5XHUzMDU3XHUzMDVmXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDRjXHU0ZjhiXHU1OTE2XHUzMDkyXHU2Mjk1XHUzMDUyXHUzMDdlXHUzMDU3XHUzMDVmCithcHBsaWNhdGlvbkRpc3BhdGNoZXIuaXNVbmF2YWlsYWJsZT1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzggezB9IFx1MzA2Zlx1NzNmZVx1NTcyOFx1NTIyOVx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworYXBwbGljYXRpb25EaXNwYXRjaGVyLnNlcnZpY2VFeGNlcHRpb249XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4IHswfSBcdTMwNmVTZXJ2bGV0LnNlcnZpY2UoKVx1MzA0Y1x1NGY4Ylx1NTkxNlx1MzA5Mlx1NjI5NVx1MzA1Mlx1MzA3ZVx1MzA1N1x1MzA1ZgorYXBwbGljYXRpb25SZXF1ZXN0LmJhZFBhcmVudD1cdTg5YWFcdTMwNmVcdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTViOWZcdTg4YzVcdTMwOTJcdTkxNGRcdTdmNmVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2FwcGxpY2F0aW9uUmVxdWVzdC5iYWRSZXF1ZXN0PVx1MzBlYVx1MzBhZlx1MzBhOFx1MzBiOVx1MzBjOFx1MzA0Y2phdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RXcmFwcGVyXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCithcHBsaWNhdGlvblJlc3BvbnNlLmJhZFBhcmVudD1cdTg5YWFcdTMwNmVcdTMwZWNcdTMwYjlcdTMwZGRcdTMwZjNcdTMwYjlcdTViOWZcdTg4YzVcdTMwOTJcdTkxNGRcdTdmNmVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2FwcGxpY2F0aW9uUmVzcG9uc2UuYmFkUmVzcG9uc2U9XHUzMGVjXHUzMGI5XHUzMGRkXHUzMGYzXHUzMGI5XHUzMDRjamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitjb250YWluZXJCYXNlLmFkZERlZmF1bHRNYXBwZXI9XHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmVcdTMwZGVcdTMwYzNcdTMwZDFcdTMwOTJcdThhMmRcdTViOWFcdTRlMmRcdTMwNmJcdTRmOGJcdTU5MTZcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2NvbnRhaW5lckJhc2UuYWxyZWFkeVN0YXJ0ZWQ9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhIHswfSBcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2NvbnRhaW5lckJhc2Uubm90Q29uZmlndXJlZD1cdTU3ZmFcdTY3MmNcdTMwZDBcdTMwZWJcdTMwZDZcdTMwNGNcdThhMmRcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2NvbnRhaW5lckJhc2Uubm90U3RhcnRlZD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2EgezB9IFx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworZmFzdEVuZ2luZU1hcHBlci5hbHJlYWR5U3RhcnRlZD1GYXN0RW5naW5lTWFwcGVyIHswfSBcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2Zhc3RFbmdpbmVNYXBwZXIubm90U3RhcnRlZD1GYXN0RW5naW5lTWFwcGVyIHswfSBcdTMwNmZcdTMwN2VcdTMwNjBcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2ZpbHRlckNoYWluLmZpbHRlcj1cdTMwZDVcdTMwYTNcdTMwZWJcdTMwYmZcdTMwNmVcdTViOWZcdTg4NGNcdTMwNmJcdTMwODhcdTMwOGFcdTRmOGJcdTU5MTZcdTMwOTJcdTYyOTVcdTMwNTJcdTMwN2VcdTMwNTdcdTMwNWYKK2ZpbHRlckNoYWluLnNlcnZsZXQ9XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHUzMDZlXHU1YjlmXHU4ODRjXHUzMDZiXHUzMDg4XHUzMDhhXHU0ZjhiXHU1OTE2XHUzMDkyXHU2Mjk1XHUzMDUyXHUzMDdlXHUzMDU3XHUzMDVmCitodHRwQ29udGV4dE1hcHBlci5jb250YWluZXI9XHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMDZmU3RhbmRhcmRDb250ZXh0XHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitodHRwRW5naW5lTWFwcGVyLmNvbnRhaW5lcj1cdTMwNTNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwNmZTdGFuZGFyZEVuZ2luZVx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworaHR0cEhvc3RNYXBwZXIuY29udGFpbmVyPVx1MzA1M1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzA2ZlN0YW5kYXJkSG9zdFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworaW50ZXJjZXB0b3JWYWx2ZS5hbHJlYWR5U3RhcnRlZD1JbnRlcmNlcHRvclZhbHZlXHUzMDZmXHU2NWUyXHUzMDZiXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitpbnRlcmNlcHRvclZhbHZlLm5vdFN0YXJ0ZWQ9SW50ZXJjZXB0b3JWYWx2ZVx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworbmFtaW5nLmJpbmRGYWlsZWQ9XHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDZlXHUzMGQwXHUzMGE0XHUzMGYzXHUzMGM5XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0KK25hbWluZy51bmJpbmRGYWlsZWQ9XHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDZlXHUzMGEyXHUzMGYzXHUzMGQwXHUzMGE0XHUzMGYzXHUzMGM5XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0KK25hbWluZy5pbnZhbGlkRW52RW50cnlUeXBlPVx1NzRiMFx1NTg4M1x1MzBhOFx1MzBmM1x1MzBjOFx1MzBlYSB7MH0gXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDZhXHU1NzhiXHUzMDkyXHU2MzAxXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CituYW1pbmcuaW52YWxpZEVudkVudHJ5VmFsdWU9XHU3NGIwXHU1ODgzXHUzMGE4XHUzMGYzXHUzMGM4XHUzMGVhIHswfSBcdTMwNmZcdTcxMjFcdTUyYjlcdTMwNmFcdTUwMjRcdTMwOTJcdTYzMDFcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK25hbWluZy5uYW1pbmdDb250ZXh0Q3JlYXRpb25GYWlsZWQ9XHU1NDBkXHU1MjRkXHU0ZWQ4XHUzMDRkXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU3NTFmXHU2MjEwXHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0KK3N0YW5kYXJkQ29udGV4dC5hbHJlYWR5U3RhcnRlZD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3N0YW5kYXJkQ29udGV4dC5hcHBsaWNhdGlvbkxpc3RlbmVyPVx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDZlXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGVhXHUzMGI5XHUzMGNhXHUzMDZlXHU4YTJkXHU1YjlhXHU0ZTJkXHUzMDZiXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZENvbnRleHQuYXBwbGljYXRpb25Ta2lwcGVkPVx1NTI0ZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2ZVx1MzA1Zlx1MzA4MVx1MzA2Ylx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBlYVx1MzBiOVx1MzBjYVx1MzA2ZVx1MzBhNFx1MzBmM1x1MzBiOVx1MzBjOFx1MzBmY1x1MzBlYlx1MzA5Mlx1MzBiOVx1MzBhZFx1MzBjM1x1MzBkN1x1MzA1N1x1MzA3ZVx1MzA1OQorc3RhbmRhcmRDb250ZXh0LmJhZFJlcXVlc3Q9XHU3MTIxXHU1MmI5XHUzMDZhXHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMGQxXHUzMGI5XHUzMDY3XHUzMDU5ICh7MH0pXHUzMDAyCitzdGFuZGFyZENvbnRleHQuZXJyb3JQYWdlLmVycm9yPVx1MzBhOFx1MzBlOVx1MzBmY1x1MzBkYVx1MzBmY1x1MzBiOFx1MzA2ZVx1NGY0ZFx1N2Y2ZSB7MH0gXHUzMDZmJycvJydcdTMwNjdcdTU5Y2JcdTMwN2VcdTMwODlcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkQ29udGV4dC5lcnJvclBhZ2UucmVxdWlyZWQ9RXJyb3JQYWdlXHUzMDRjbnVsbFx1MzA2N1x1MzA2Zlx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRDb250ZXh0LmVycm9yUGFnZS53YXJuaW5nPVx1OGI2Nlx1NTQ0YTogU2VydmxldCAyLjRcdTMwNjdcdTMwNmZcdTMwYThcdTMwZTlcdTMwZmNcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmVcdTRmNGRcdTdmNmUgezB9IFx1MzA2ZicnLycnXHUzMDY3XHU1OWNiXHUzMDdlXHUzMDg5XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZENvbnRleHQuZmlsdGVyTWFwLmVpdGhlcj1cdTMwZDVcdTMwYTNcdTMwZWJcdTMwYmZcdTMwZGVcdTMwYzNcdTMwZDRcdTMwZjNcdTMwYjBcdTMwNmY8dXJsLXBhdHRlcm4+XHU1M2M4XHUzMDZmPHNlcnZsZXQtbmFtZT5cdTMwNmVcdTMwNjlcdTMwNjFcdTMwODlcdTMwNGJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkQ29udGV4dC5maWx0ZXJNYXAubmFtZT1cdTMwZDVcdTMwYTNcdTMwZWJcdTMwYmZcdTMwZGVcdTMwYzNcdTMwZDRcdTMwZjNcdTMwYjBcdTMwNmZcdTY3MmFcdTc3ZTVcdTMwNmVcdTMwZDVcdTMwYTNcdTMwZWJcdTMwYmZcdTU0MGQgezB9IFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zgorc3RhbmRhcmRDb250ZXh0LmZpbHRlck1hcC5wYXR0ZXJuPVx1MzBkNVx1MzBhM1x1MzBlYlx1MzBiZlx1MzBkZVx1MzBjM1x1MzBkNFx1MzBmM1x1MzBiMFx1NGUyZFx1MzA2Ylx1NzEyMVx1NTJiOVx1MzA2YSA8dXJsLXBhdHRlcm4+IHswfSBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTkKK3N0YW5kYXJkQ29udGV4dC5maWx0ZXJTdGFydD1cdTMwZDVcdTMwYTNcdTMwZWJcdTMwYmYgezB9IFx1MzA2ZVx1OGQ3N1x1NTJkNVx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorc3RhbmRhcmRDb250ZXh0LmZpbHRlclN0YXJ0RmFpbGVkPVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBkNVx1MzBhM1x1MzBlYlx1MzBiZlx1MzA2ZVx1OGQ3N1x1NTJkNVx1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zgorc3RhbmRhcmRDb250ZXh0LnJlcXVlc3RMaXN0ZW5lclN0YXJ0RmFpbGVkPVx1MzBlYVx1MzBhZlx1MzBhOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBiOVx1MzBjYVx1MzBkMFx1MzBlYlx1MzBkNlx1MzA2ZVx1OGQ3N1x1NTJkNVx1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zgorc3RhbmRhcmRDb250ZXh0LnJlcXVlc3RMaXN0ZW5lckNvbmZpZy5hZGRlZD1cdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwZWFcdTMwYjlcdTMwY2FcdTMwZDBcdTMwZWJcdTMwZDZcdTMwOTJcdThmZmRcdTUyYTBcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK3N0YW5kYXJkQ29udGV4dC5yZXF1ZXN0TGlzdGVuZXJDb25maWcuZXJyb3I9XHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMGVhXHUzMGI5XHUzMGNhXHUzMGQwXHUzMGViXHUzMGQ2XHU4ZmZkXHU1MmEwXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5OiB7MH0KK3N0YW5kYXJkQ29udGV4dC5pc1VuYXZhaWxhYmxlPVx1MzA1M1x1MzA2ZVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2Zlx1NzNmZVx1NTcyOFx1NTIyOVx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRDb250ZXh0Lmxpc3RlbmVyU3RhcnQ9XHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwNmVcdTMwZWFcdTMwYjlcdTMwY2FcdTMwYTRcdTMwZjNcdTMwYjlcdTMwYmZcdTMwZjNcdTMwYjlcdTMwNmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTUyMWRcdTY3MWZcdTUzMTZcdTMwYTRcdTMwZDlcdTMwZjNcdTMwYzhcdTMwOTJcdTkwMDFcdTRmZTFcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK3N0YW5kYXJkQ29udGV4dC5saXN0ZW5lclN0YXJ0RmFpbGVkPVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBlYVx1MzBiOVx1MzBjYVx1MzA2ZVx1OGQ3N1x1NTJkNVx1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zgorc3RhbmRhcmRDb250ZXh0Lmxpc3RlbmVyU3RvcD1cdTMwYWZcdTMwZTlcdTMwYjkgezB9IFx1MzA2ZVx1MzBlYVx1MzBiOVx1MzBjYVx1MzBhNFx1MzBmM1x1MzBiOVx1MzBiZlx1MzBmM1x1MzBiOVx1MzA2Ylx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1NzgzNFx1NjhjNFx1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1MzA5Mlx1OTAwMVx1NGZlMVx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmVycm9yUGFnZT1cdTMwZDVcdTMwYTlcdTMwZmNcdTMwZTBcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwZGFcdTMwZmNcdTMwYjggezB9IFx1MzA2ZicnLycnXHUzMDY3XHU1OWNiXHUzMDdlXHUzMDg5XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcuZXJyb3JXYXJuaW5nPVx1OGI2Nlx1NTQ0YTogU2VydmxldCAyLjRcdTMwNjdcdTMwNmZcdTMwZDVcdTMwYTlcdTMwZmNcdTMwZTBcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwZGFcdTMwZmNcdTMwYjggezB9IFx1MzA2ZicnLycnXHUzMDY3XHU1OWNiXHUzMDdlXHUzMDg5XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcubG9naW5QYWdlPVx1MzBkNVx1MzBhOVx1MzBmY1x1MzBlMFx1MzA2ZVx1MzBlZFx1MzBiMFx1MzBhNFx1MzBmM1x1MzBkYVx1MzBmY1x1MzBiOCB7MH0gXHUzMDZmJycvJydcdTMwNjdcdTU5Y2JcdTMwN2VcdTMwODlcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkQ29udGV4dC5sb2dpbkNvbmZpZy5sb2dpbldhcm5pbmc9XHU4YjY2XHU1NDRhOiBTZXJ2bGV0IDIuNFx1MzA2N1x1MzA2Zlx1MzBkNVx1MzBhOVx1MzBmY1x1MzBlMFx1MzA2ZVx1MzBlZFx1MzBiMFx1MzBhNFx1MzBmM1x1MzBkYVx1MzBmY1x1MzBiOCB7MH0gXHUzMDZmJycvJydcdTMwNjdcdTU5Y2JcdTMwN2VcdTMwODlcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkQ29udGV4dC5sb2dpbkNvbmZpZy5yZXF1aXJlZD1Mb2dpbkNvbmZpZ1x1MzA2Zm51bGxcdTMwNjdcdTMwNmZcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkQ29udGV4dC5tYXBwaW5nRXJyb3I9XHU3NmY4XHU1YmZlVVJJIHswfSBcdTMwNmVcdTMwZGVcdTMwYzNcdTMwZDRcdTMwZjNcdTMwYjBcdThhMmRcdTViOWFcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK3N0YW5kYXJkQ29udGV4dC5ub3RGb3VuZD1cdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjkgKHswfSkgXHUzMDZmXHU1MjI5XHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCitzdGFuZGFyZENvbnRleHQubm90UmVsb2FkYWJsZT1cdTMwNTNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNjdcdTMwNmZcdTUxOGRcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNmZcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTkKK3N0YW5kYXJkQ29udGV4dC5ub3RTdGFydGVkPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRDb250ZXh0Lm5vdFdyYXBwZXI9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU1YjUwXHU0ZjliXHUzMDZmXHUzMGU5XHUzMGMzXHUzMGQxXHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZENvbnRleHQucGFyYW1ldGVyLmR1cGxpY2F0ZT1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTUyMWRcdTY3MWZcdTUzMTZcdTMwZDFcdTMwZTlcdTMwZTFcdTMwYmYgezB9IFx1MzA0Y1x1OTFjZFx1ODkwN1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRDb250ZXh0LnBhcmFtZXRlci5yZXF1aXJlZD1cdTMwZDFcdTMwZTlcdTMwZTFcdTMwYmZcdTU0MGRcdTMwNjhcdTMwZDFcdTMwZTlcdTMwZTFcdTMwYmZcdTUwMjRcdTMwNmVcdTRlMjFcdTY1YjlcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK3N0YW5kYXJkQ29udGV4dC5yZWxvYWRpbmdDb21wbGV0ZWQ9XHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDRjXHU1YjhjXHU0ZTg2XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZENvbnRleHQucmVsb2FkaW5nRmFpbGVkPVx1NGVlNVx1NTI0ZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2ZVx1MzA1Zlx1MzA4MVx1MzA2Ylx1MzA1M1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2ZVx1NTE4ZFx1MzBlZFx1MzBmY1x1MzBjOVx1MzA0Y1x1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zgorc3RhbmRhcmRDb250ZXh0LnJlbG9hZGluZ1N0YXJ0ZWQ9XHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDkyXHU5NThiXHU1OWNiXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZENvbnRleHQucmVxdWVzdExpc3RlbmVyLnJlcXVlc3RJbml0PVx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDZlXHUzMGVhXHUzMGI5XHUzMGNhXHUzMGE0XHUzMGYzXHUzMGI5XHUzMGJmXHUzMGYzXHUzMGI5XHUzMDZiXHU1MjFkXHU2NzFmXHU1MzE2XHUzMDU5XHUzMDhiXHUzMGU5XHUzMGE0XHUzMGQ1XHUzMGI1XHUzMGE0XHUzMGFmXHUzMGViXHUzMGE0XHUzMGQ5XHUzMGYzXHUzMGM4XHUzMDZlXHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMDkyXHU5MDAxXHU0ZmUxXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitzdGFuZGFyZENvbnRleHQucmVxdWVzdExpc3RlbmVyLnJlcXVlc3REZXN0cm95PVx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDZlXHUzMGVhXHUzMGI5XHUzMGNhXHUzMGE0XHUzMGYzXHUzMGI5XHUzMGJmXHUzMGYzXHUzMGI5XHUzMDZiXHU1ZWMzXHU2OGM0XHUzMDU5XHUzMDhiXHUzMGU5XHUzMGE0XHUzMGQ1XHUzMGI1XHUzMGE0XHUzMGFmXHUzMGViXHUzMGE0XHUzMGQ5XHUzMGYzXHUzMGM4XHUzMDZlXHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMDkyXHU5MDAxXHU0ZmUxXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitzdGFuZGFyZENvbnRleHQucmVzb3VyY2VzU3RhcnQ9XHU5NzU5XHU3Njg0XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDZlXHU4ZDc3XHU1MmQ1XHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5CitzdGFuZGFyZENvbnRleHQuc2VjdXJpdHlDb25zdHJhaW50LnBhdHRlcm49XHUzMGJiXHUzMGFkXHUzMGU1XHUzMGVhXHUzMGM2XHUzMGEzXHUzMDZlXHU1MjM2XHU3ZDA0XHUzMDZlXHU0ZTJkXHUzMDZiXHU3MTIxXHU1MmI5XHUzMDZhIDx1cmwtcGF0dGVybj4gezB9IFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OQorc3RhbmRhcmRDb250ZXh0LnNlcnZsZXRNYXAubmFtZT1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTMwZGVcdTMwYzNcdTMwZDRcdTMwZjNcdTMwYjBcdTMwNmZcdTY3MmFcdTc3ZTVcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTU0MGQgezB9IFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRDb250ZXh0LnNlcnZsZXRNYXAucGF0dGVybj1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTMwZGVcdTMwYzNcdTMwZDRcdTMwZjNcdTMwYjBcdTRlMmRcdTMwNmJcdTcxMjFcdTUyYjlcdTMwNmEgPHVybC1wYXR0ZXJuPiB7MH0gXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5CitzdGFuZGFyZENvbnRleHQuc3RhcnRDbGVhbnVwPVx1OGQ3N1x1NTJkNVx1MzA0Y1x1NTkzMVx1NjU1N1x1MzA1N1x1MzA1Zlx1NWY4Y1x1MzA2ZVx1MzBhZlx1MzBlYVx1MzBmY1x1MzBmM1x1MzBjYVx1MzBjM1x1MzBkN1x1NGUyZFx1MzA2Ylx1NGY4Ylx1NTkxNlx1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zgorc3RhbmRhcmRDb250ZXh0LnN0YXJ0RmFpbGVkPVx1NGVlNVx1NTI0ZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2ZVx1MzA1Zlx1MzA4MVx1MzA2Ylx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2ZVx1OGQ3N1x1NTJkNVx1MzA0Y1x1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZiBbezB9XQorc3RhbmRhcmRDb250ZXh0LnN0YXJ0aW5nTG9hZGVyPVx1MzBlZFx1MzBmY1x1MzBjMFx1MzA5Mlx1OGQ3N1x1NTJkNVx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorc3RhbmRhcmRDb250ZXh0LnN0YXJ0aW5nTWFuYWdlcj1cdTMwZGVcdTMwY2RcdTMwZmNcdTMwYjhcdTMwZTNcdTMwOTJcdThkNzdcdTUyZDVcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK3N0YW5kYXJkQ29udGV4dC5zdGFydGluZ1dyYXBwZXI9XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4IHswfSBcdTMwNmVcdTMwZTlcdTMwYzNcdTMwZDFcdTMwOTJcdThkNzdcdTUyZDVcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK3N0YW5kYXJkQ29udGV4dC5zdG9wcGluZ0NvbnRleHQ9XHUzMGVkXHUzMGZjXHUzMGMwXHUzMDkyXHU1MDVjXHU2YjYyXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitzdGFuZGFyZENvbnRleHQuc3RvcHBpbmdMb2FkZXI9XHUzMGVkXHUzMGZjXHUzMGMwXHUzMDkyXHU1MDVjXHU2YjYyXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitzdGFuZGFyZENvbnRleHQuc3RvcHBpbmdNYW5hZ2VyPVx1MzBkZVx1MzBjZFx1MzBmY1x1MzBiOFx1MzBlM1x1MzA5Mlx1NTA1Y1x1NmI2Mlx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorc3RhbmRhcmRDb250ZXh0LnN0b3BwaW5nV3JhcHBlcj1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzggezB9IFx1MzA2ZVx1MzBlOVx1MzBjM1x1MzBkMVx1MzA5Mlx1NTA1Y1x1NmI2Mlx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorc3RhbmRhcmRDb250ZXh0LnVybERlY29kZT1cdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2ZVVSTFx1MzBjN1x1MzBiM1x1MzBmY1x1MzBjOVx1MzA0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRDb250ZXh0LnVybFBhdHRlcm4ucGF0dGVybldhcm5pbmc9XHU4YjY2XHU1NDRhOiBTZXJ2bGV0IDIuNFx1MzA2N1x1MzA2ZlVSTFx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmMyB7MH0gXHUzMDZmJycvJydcdTMwNjdcdTU5Y2JcdTMwN2VcdTMwODlcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkQ29udGV4dC51cmxWYWxpZGF0ZT1VUkxcdTMwYzdcdTMwYjNcdTMwZmNcdTMwYzlcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA5Mlx1NjkxY1x1OGEzY1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRDb250ZXh0LndyYXBwZXIuZXJyb3I9SlNQXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViIHswfSBcdTMwNmYnJy8nJ1x1MzA2N1x1NTljYlx1MzA3ZVx1MzA4OVx1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRDb250ZXh0LndyYXBwZXIud2FybmluZz1cdThiNjZcdTU0NGE6IFNlcnZsZXQgMi40XHUzMDY3XHUzMDZmSlNQXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViIHswfSBcdTMwNmYnJy8nJ1x1MzA2N1x1NTljYlx1MzA3ZVx1MzA4OVx1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRFbmdpbmUuYWxyZWFkeVN0YXJ0ZWQ9XHUzMGE4XHUzMGYzXHUzMGI4XHUzMGYzXHUzMDZmXHU2NWUyXHUzMDZiXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZEVuZ2luZS5tYXBwaW5nRXJyb3I9XHUzMGI1XHUzMGZjXHUzMGQwXHU1NDBkIHswfSBcdTMwNmVcdTMwZGVcdTMwYzNcdTMwZDRcdTMwZjNcdTMwYjBcdThhMmRcdTViOWFcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK3N0YW5kYXJkRW5naW5lLm5vSG9zdD1cdTMwYjVcdTMwZmNcdTMwZDBcdTU0MGQgezB9IFx1MzA2Ylx1NGUwMFx1ODFmNFx1MzA1OVx1MzA4Ylx1MzBkYlx1MzBiOVx1MzBjOFx1MzA0Y1x1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRFbmdpbmUubm9Ib3N0SGVhZGVyPUhvc3Q6XHUzMGQ4XHUzMGMzXHUzMGMwXHUzMDkyXHU2MzAxXHUzMDVmXHUzMDZhXHUzMDQ0IEhUVFAvMS4xIFx1MzBlYVx1MzBhZlx1MzBhOFx1MzBiOVx1MzBjOFx1MzA2N1x1MzA1OQorc3RhbmRhcmRFbmdpbmUubm90SG9zdD1cdTMwYThcdTMwZjNcdTMwYjhcdTMwZjNcdTMwNmVcdTViNTBcdTRmOWJcdTMwNmZcdTMwZGJcdTMwYjlcdTMwYzhcdTMwNjdcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkRW5naW5lLm5vdFBhcmVudD1cdTMwYThcdTMwZjNcdTMwYjhcdTMwZjNcdTMwNmZcdTg5YWFcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwOTJcdTYzMDFcdTMwNjRcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkRW5naW5lLm5vdFN0YXJ0ZWQ9XHUzMGE4XHUzMGYzXHUzMGI4XHUzMGYzXHUzMDZmXHUzMDdlXHUzMDYwXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZEVuZ2luZS51bmZvdW5kSG9zdD1cdTMwZDBcdTMwZmNcdTMwYzFcdTMwZTNcdTMwZWJcdTMwZGJcdTMwYjlcdTMwYzggezB9IFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRFbmdpbmUudW5rbm93bkhvc3Q9XHUzMDUzXHUzMDZlXHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHU0ZTJkXHUzMDZiXHUzMGI1XHUzMGZjXHUzMGQwXHUzMGRiXHUzMGI5XHUzMGM4XHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZEhvc3QuYWNjZXNzQmFzZT1cdTMwYzlcdTMwYWRcdTMwZTVcdTMwZTFcdTMwZjNcdTMwYzhcdTMwZDlcdTMwZmNcdTMwYjlcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWEgezB9IFx1MzA2Ylx1MzBhMlx1MzBhZlx1MzBiYlx1MzBiOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRIb3N0LmFscmVhZHlTdGFydGVkPVx1MzBkYlx1MzBiOVx1MzBjOFx1MzA2Zlx1NjVlMlx1MzA2Ylx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRIb3N0LmFwcEJhc2U9XHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhIHswfSBcdTMwNGNcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkSG9zdC5jbGllbnRBYm9ydD1cdTMwZWFcdTMwZTJcdTMwZmNcdTMwYzhcdTMwYWZcdTMwZTlcdTMwYTRcdTMwYTJcdTMwZjNcdTMwYzhcdTMwNGNcdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwOTJcdTRlMmRcdTZiNjJcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYsIElPRXhjZXB0aW9uOiB7MH0KK3N0YW5kYXJkSG9zdC5jb25maWdSZXF1aXJlZD1cdThhMmRcdTViOWFcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNzhcdTMwNmVVUkxcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK3N0YW5kYXJkSG9zdC5jb25maWdOb3RBbGxvd2VkPVx1OGEyZFx1NWI5YVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NGY3Zlx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRIb3N0Lmluc3RhbGxCYXNlPVx1MzBkYlx1MzBiOVx1MzBjOFdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1NGUyZFx1MzA2ZVdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2MFx1MzA1MVx1MzA0Y1x1MzBhNFx1MzBmM1x1MzBiOVx1MzBjOFx1MzBmY1x1MzBlYlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRIb3N0Lmluc3RhbGxpbmc9VVJMIHsxfSBcdTMwNGJcdTMwODlcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2YldlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1MzBhNFx1MzBmM1x1MzBiOVx1MzBjOFx1MzBmY1x1MzBlYlx1MzA1N1x1MzA3ZVx1MzA1OQorc3RhbmRhcmRIb3N0Lmluc3RhbGxpbmdXQVI9VVJMIHswfSBcdTMwNGJcdTMwODlXZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTMwYTRcdTMwZjNcdTMwYjlcdTMwYzhcdTMwZmNcdTMwZWJcdTMwNTdcdTMwN2VcdTMwNTkKK3N0YW5kYXJkSG9zdC5pbnN0YWxsaW5nWE1MPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1OGEyZFx1NWI5YVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZVVSTCB7MH0gXHUzMDkyXHU1MWU2XHU3NDA2XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZEhvc3QuaW5zdGFsbEVycm9yPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZiXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU5MTRkXHU1MDk5XHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5CitzdGFuZGFyZEhvc3QuaW52YWxpZEVycm9yUmVwb3J0VmFsdmVDbGFzcz1cdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYThcdTMwZTlcdTMwZmNcdTMwZWFcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZDBcdTMwZWJcdTMwZDZcdTMwYWZcdTMwZTlcdTMwYjlcdTMwOTJcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTM6IHswfQorc3RhbmRhcmRIb3N0LmRvY0Jhc2U9XHUzMGM5XHUzMGFkXHUzMGU1XHUzMGUxXHUzMGYzXHUzMGM4XHUzMGQ5XHUzMGZjXHUzMGI5XHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhIHswfSBcdTMwNGNcdTY1ZTJcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNTkKK3N0YW5kYXJkSG9zdC5tYXBwaW5nRXJyb3I9XHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4VVJJIHswfSBcdTMwNmVcdTMwZGVcdTMwYzNcdTMwZDRcdTMwZjNcdTMwYjBcdThhMmRcdTViOWFcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK3N0YW5kYXJkSG9zdC5ub0NvbnRleHQ9XHUzMDUzXHUzMDZlXHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMDkyXHU1MWU2XHU3NDA2XHUzMDU5XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDZiXHU4YTJkXHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZEhvc3Qubm9Ib3N0PVx1MzA1M1x1MzA2ZVx1MzBlYVx1MzBhZlx1MzBhOFx1MzBiOVx1MzBjOFx1MzA5Mlx1NTFlNlx1NzQwNlx1MzA1OVx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzA2Ylx1OGEyZFx1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBkYlx1MzBiOVx1MzBjOFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRIb3N0Lm5vdENvbnRleHQ9XHUzMGRiXHUzMGI5XHUzMGM4XHUzMDZlXHU1YjUwXHU0ZjliXHUzMDZmXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZEhvc3Qubm90U3RhcnRlZD1cdTMwZGJcdTMwYjlcdTMwYzhcdTMwNGNcdTMwN2VcdTMwNjBcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkSG9zdC5udWxsTmFtZT1cdTMwZGJcdTMwYjlcdTMwYzhcdTU0MGRcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK3N0YW5kYXJkSG9zdC5wYXRoRm9ybWF0PVx1NzEyMVx1NTJiOVx1MzA2YVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOVx1MzA2N1x1MzA1OTogezB9CitzdGFuZGFyZEhvc3QucGF0aE1hdGNoPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZmXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHU1M2M4XHUzMDZmV0FSXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU1NDBkXHUzMDZiXHU0ZTAwXHU4MWY0XHUzMDU3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzOiB7MX0KK3N0YW5kYXJkSG9zdC5wYXRoTWlzc2luZz1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2Zlx1NzNmZVx1NTcyOFx1NGY3Zlx1NzUyOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRIb3N0LnBhdGhSZXF1aXJlZD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjlcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK3N0YW5kYXJkSG9zdC5wYXRoVXNlZD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2Zlx1NjVlMlx1MzA2Ylx1NGY3Zlx1NzUyOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRIb3N0LnJlbW92aW5nPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZlV2ViXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU1MjRhXHU5NjY0XHUzMDU3XHUzMDdlXHUzMDU5CitzdGFuZGFyZEhvc3QucmVtb3ZlRXJyb3I9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGQxXHUzMGI5IHswfSBcdTMwNmVcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTUyNGFcdTk2NjRcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK3N0YW5kYXJkSG9zdC5zdGFydD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2ZVdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1OGQ3N1x1NTJkNVx1MzA1N1x1MzA3ZVx1MzA1OQorc3RhbmRhcmRIb3N0LnN0b3A9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGQxXHUzMGI5IHswfSBcdTMwNmVXZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTUwNWNcdTZiNjJcdTMwNTdcdTMwN2VcdTMwNTkKK3N0YW5kYXJkSG9zdC51bmZvdW5kQ29udGV4dD1cdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhVUkkgezB9IFx1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA5Mlx1ODk4Ylx1MzA2NFx1MzA1MVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRIb3N0LndhclJlcXVpcmVkPVdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBhMlx1MzBmY1x1MzBhYlx1MzBhNFx1MzBkNlx1MzA2ZVVSTFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OQorc3RhbmRhcmRIb3N0LndhclVSTD1XZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwYTJcdTMwZmNcdTMwYWJcdTMwYTRcdTMwZDZcdTMwNmJcdTViZmVcdTMwNTlcdTMwOGJcdTcxMjFcdTUyYjlcdTMwNmFVUkxcdTMwNjdcdTMwNTk6IHswfQorc3RhbmRhcmRIb3N0LnZhbGlkYXRpb25FbmFibGVkPVhNTFx1NjkxY1x1OGEzY1x1MzA2Zlx1NjcwOVx1NTJiOVx1MzA2N1x1MzA1OQorc3RhbmRhcmRIb3N0LnZhbGlkYXRpb25EaXNhYmxlZD1YTUxcdTY5MWNcdThhM2NcdTMwNmZcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTkKK3N0YW5kYXJkUGlwZWxpbmUuYWxyZWFkeVN0YXJ0ZWQ9XHUzMGQxXHUzMGE0XHUzMGQ3XHUzMGU5XHUzMGE0XHUzMGYzXHUzMDZmXHU2NWUyXHUzMDZiXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZFBpcGVsaW5lLm5vdFN0YXJ0ZWQ9XHUzMGQxXHUzMGE0XHUzMGQ3XHUzMGU5XHUzMGE0XHUzMGYzXHUzMDZmXHUzMDdlXHUzMDYwXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFBpcGVsaW5lLm5vVmFsdmU9XHUzMDUzXHUzMDZlXHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMDkyXHU1MWU2XHU3NDA2XHUzMDU5XHUzMDhiXHUzMGQxXHUzMGE0XHUzMGQ3XHUzMGU5XHUzMGE0XHUzMGYzXHU0ZTJkXHUzMDZiXHUzMDUzXHUzMDhjXHU0ZWU1XHU0ZTBhXHUzMDZlXHUzMGQwXHUzMGViXHUzMGQ2XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFNlcnZlci5hZGRDb250YWluZXIuaXNlPVx1MzA1M1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzA5Mlx1OTVhMlx1OTAyM1x1MzA2NVx1MzA1MVx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzA2ZVx1MzBiM1x1MzBjZFx1MzBhZlx1MzBiZlx1MzA0Y1x1NTIyOVx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRTZXJ2ZXIuaW5pdGlhbGl6ZS5pbml0aWFsaXplZD1cdTMwNTNcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDBcdTMwNmZcdTY1ZTJcdTMwNmJcdTUyMWRcdTY3MWZcdTUzMTZcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3N0YW5kYXJkU2VydmVyLnN0YXJ0LmNvbm5lY3RvcnM9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMDZiXHU0ZTAwXHUzMDY0XHUzMDgyXHUzMGIzXHUzMGNkXHUzMGFmXHUzMGJmXHUzMDRjXHU5NWEyXHU5MDIzXHUzMDY1XHUzMDUxXHUzMDg5XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFNlcnZlci5zdGFydC5zdGFydGVkPVx1MzA1M1x1MzA2ZVx1MzBiNVx1MzBmY1x1MzBkMFx1MzA2Zlx1NjVlMlx1MzA2Ylx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRTZXJ2ZXIuc3RvcC5ub3RTdGFydGVkPVx1MzA1M1x1MzA2ZVx1MzBiNVx1MzBmY1x1MzBkMFx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRTZXJ2aWNlLmluaXRpYWxpemUuaW5pdGlhbGl6ZWQ9XHUzMDUzXHUzMDZlXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDZmXHU2NWUyXHUzMDZiXHU1MjFkXHU2NzFmXHU1MzE2XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZFNlcnZpY2Uuc3RhcnQubmFtZT1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjkgezB9IFx1MzA5Mlx1OGQ3N1x1NTJkNVx1MzA1N1x1MzA3ZVx1MzA1OQorc3RhbmRhcmRTZXJ2aWNlLnN0YXJ0LnN0YXJ0ZWQ9XHUzMDUzXHUzMDZlXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDZmXHU2NWUyXHUzMDZiXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZFNlcnZpY2Uuc3RvcC5uYW1lPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOSB7MH0gXHUzMDkyXHU1MDVjXHU2YjYyXHUzMDU3XHUzMDdlXHUzMDU5CitzdGFuZGFyZFNlcnZpY2Uuc3RvcC5ub3RTdGFydGVkPVx1MzA1M1x1MzA2ZVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRXcmFwcGVyLmFsbG9jYXRlPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOFx1MzBhNFx1MzBmM1x1MzBiOVx1MzBiZlx1MzBmM1x1MzBiOVx1MzA5Mlx1NTI3Mlx1MzA4YVx1NWY1M1x1MzA2Nlx1NGUyZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OQorc3RhbmRhcmRXcmFwcGVyLmFsbG9jYXRlRXhjZXB0aW9uPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOCB7MH0gXHUzMDZiXHU0ZjhiXHU1OTE2XHUzMDkyXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2XHUzMDdlXHUzMDU5CitzdGFuZGFyZFdyYXBwZXIuY29udGFpbmVyU2VydmxldD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzggezB9IFx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA1N1x1MzA3ZVx1MzA1OQorc3RhbmRhcmRXcmFwcGVyLmNyZWF0ZUZpbHRlcnM9XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4IHswfVx1MzA2Ylx1NWJmZVx1MzA1OVx1MzA4Ylx1MzBkNVx1MzBhM1x1MzBlYlx1MzBiZlx1NGY4Ylx1NTkxNlx1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA1N1x1MzA3ZVx1MzA1OQorc3RhbmRhcmRXcmFwcGVyLmRlYWxsb2NhdGVFeGNlcHRpb249XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4IHswfSBcdTMwNmJcdTViZmVcdTMwNTlcdTMwOGJcdTRmOGJcdTU5MTZcdTMwNmVcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjZcdTMwOTJcdTg5ZTNcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTkKK3N0YW5kYXJkV3JhcHBlci5kZXN0cm95RXhjZXB0aW9uPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOCB7MH0gXHUzMDZlU2VydmxldC5kZXN0cm95KClcdTMwNGNcdTRmOGJcdTU5MTZcdTMwOTJcdTYyOTVcdTMwNTJcdTMwN2VcdTMwNTdcdTMwNWYKK3N0YW5kYXJkV3JhcHBlci5leGNlcHRpb24wPVRvbWNhdFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2ZVx1NTgzMVx1NTQ0YQorc3RhbmRhcmRXcmFwcGVyLmV4Y2VwdGlvbjE9XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHU0ZjhiXHU1OTE2XHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZFdyYXBwZXIuZXhjZXB0aW9uMj1cdTRmOGJcdTU5MTZcdTMwNmVcdTU4MzFcdTU0NGE6CitzdGFuZGFyZFdyYXBwZXIuZXhjZXB0aW9uMz1cdTY4MzlcdTY3MmNcdTMwNmVcdTUzOWZcdTU2ZTA6CitzdGFuZGFyZFdyYXBwZXIuaW5pdEV4Y2VwdGlvbj1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzggezB9IFx1MzA2ZVNlcnZsZXQuaW5pdCgpXHUzMDRjXHU0ZjhiXHU1OTE2XHUzMDkyXHU2Mjk1XHUzMDUyXHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZFdyYXBwZXIuaW5zdGFudGlhdGU9XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwOTJcdTUyMWRcdTY3MWZcdTUzMTZcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK3N0YW5kYXJkV3JhcHBlci5pc1VuYXZhaWxhYmxlPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOCB7MH0gXHUzMDZmXHU3M2ZlXHU1NzI4XHU1MjI5XHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFdyYXBwZXIuamFzcGVyTG9hZGVyPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOCB7MH0gXHUzMDZiSmFzcGVyXHUzMGFmXHUzMGU5XHUzMGI5XHUzMGVkXHUzMGZjXHUzMGMwXHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5CitzdGFuZGFyZFdyYXBwZXIuanNwRmlsZS5mb3JtYXQ9SlNQXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViIHswfSBcdTMwNGMnJy8nJ1x1NjU4N1x1NWI1N1x1MzA2N1x1NTljYlx1MzA3ZVx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRXcmFwcGVyLmxvYWRFeGNlcHRpb249XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4IHswfSBcdTMwNGNsb2FkKClcdTRmOGJcdTU5MTZcdTMwOTJcdTYyOTVcdTMwNTJcdTMwN2VcdTMwNTdcdTMwNWYKK3N0YW5kYXJkV3JhcHBlci5taXNzaW5nQ2xhc3M9XHUzMGU5XHUzMGMzXHUzMGQxXHUzMDRjXHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTUzYzhcdTMwNmZcdTMwNWRcdTMwOGNcdTMwNGNcdTRmOWRcdTViNThcdTMwNTlcdTMwOGJcdTMwYWZcdTMwZTlcdTMwYjlcdTMwOTJcdTg5OGJcdTMwNjRcdTMwNTFcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkV3JhcHBlci5taXNzaW5nTG9hZGVyPVx1MzBlOVx1MzBjM1x1MzBkMVx1MzA0Y1x1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOCB7MH0gXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGMwXHUzMDkyXHU4OThiXHUzMDY0XHUzMDUxXHUzMDhiXHUzMDUzXHUzMDY4XHUzMDRjXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFdyYXBwZXIubm90Q2hpbGQ9XHUzMGU5XHUzMGMzXHUzMGQxXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMDZmXHU1YjUwXHU0ZjliXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMDkyXHU2MzAxXHUzMDY0XHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFdyYXBwZXIubm90Q2xhc3M9XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4IHswfSBcdTMwNmJcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTMwYWZcdTMwZTlcdTMwYjlcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkV3JhcHBlci5ub3RDb250ZXh0PVx1MzBlOVx1MzBjM1x1MzBkMVx1MzA2ZVx1ODlhYVx1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzA2Zlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRXcmFwcGVyLm5vdEZvdW5kPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOCB7MH0gXHUzMDRjXHU1MjI5XHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFdyYXBwZXIubm90U2VydmxldD1cdTMwYWZcdTMwZTlcdTMwYjkgezB9IFx1MzA2Zlx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRXcmFwcGVyLnByaXZpbGVnZWRTZXJ2bGV0PVx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDZlXHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHUzMDZmXHU3Mjc5XHU2YTI5XHUzMDkyXHU0ZTBlXHUzMDQ4XHUzMDg5XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHUzMDZlXHUzMDY3XHUzMDAxXHUzMDUzXHUzMDZlV2ViXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZiXHUzMDg4XHUzMDYzXHUzMDY2XHUzMGVkXHUzMGZjXHUzMGM5XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFdyYXBwZXIucmVsZWFzZUZpbHRlcnM9XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4IHswfSBcdTMwNmVcdTMwZDVcdTMwYTNcdTMwZWJcdTMwYmZcdTRmOGJcdTU5MTZcdTMwOTJcdTg5ZTNcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTkKK3N0YW5kYXJkV3JhcHBlci5zZXJ2aWNlRXhjZXB0aW9uPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOCB7MH0gXHUzMDZlU2VydmxldC5zZXJ2aWNlKClcdTMwNGNcdTRmOGJcdTU5MTZcdTMwOTJcdTYyOTVcdTMwNTJcdTMwN2VcdTMwNTdcdTMwNWYKK3N0YW5kYXJkV3JhcHBlci5zdGF0dXNIZWFkZXI9SFRUUFx1MzBiOVx1MzBjNlx1MzBmY1x1MzBiZlx1MzBiOSB7MH0gLSB7MX0KK3N0YW5kYXJkV3JhcHBlci5zdGF0dXNUaXRsZT1Ub21jYXRcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwNmVcdTU4MzFcdTU0NGEKK3N0YW5kYXJkV3JhcHBlci51bmF2YWlsYWJsZT1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzggezB9IFx1MzA5Mlx1NTIyOVx1NzUyOFx1NGUwZFx1NTNlZlx1ODBmZFx1MzA2Ylx1MzBkZVx1MzBmY1x1MzBhZlx1MzA1N1x1MzA3ZVx1MzA1OQorc3RhbmRhcmRXcmFwcGVyLnVubG9hZEV4Y2VwdGlvbj1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzggezB9IFx1MzA0Y3VubG9hZCgpXHU0ZjhiXHU1OTE2XHUzMDkyXHU2Mjk1XHUzMDUyXHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZFdyYXBwZXIudW5sb2FkaW5nPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOCB7MH0gXHUzMDRjXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDZhXHUzMDQ0XHUzMDZlXHUzMDY3XHUzMDAxXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDRjXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFdyYXBwZXIud2FpdGluZz17MH0gXHUzMGE0XHUzMGYzXHUzMGI5XHUzMGJmXHUzMGYzXHUzMGI5XHUzMDRjXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2XHU4OWUzXHU5NjY0XHUzMDU1XHUzMDhjXHUzMDhiXHUzMDZlXHUzMDkyXHU1Zjg1XHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9OYW1pbmdDb250ZXh0TGlzdGVuZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL05hbWluZ0NvbnRleHRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZGE5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9OYW1pbmdDb250ZXh0TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDEwMTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLlJlZmVyZW5jZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuU3RyaW5nUmVmQWRkcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RWpiOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0TG9jYWxFamI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUVudlJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VMaW5rOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRUcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuQ29udGV4dEFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuQ29udGV4dEJpbmRpbmdzOworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLkVqYlJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5OYW1pbmdDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLlJlc291cmNlRW52UmVmOworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLlJlc291cmNlTGlua1JlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5SZXNvdXJjZVJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5UcmFuc2FjdGlvblJlZjsKKworCisvKioKKyAqIEhlbHBlciBjbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgYW5kIHBvcHVsYXRlIHRoZSBKTkRJIGNvbnRleHQgYXNzb2NpYXRlZAorICogd2l0aCBlYWNoIGNvbnRleHQgYW5kIHNlcnZlci4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBOYW1pbmdDb250ZXh0TGlzdGVuZXIKKyAgICBpbXBsZW1lbnRzIExpZmVjeWNsZUxpc3RlbmVyLCBDb250YWluZXJMaXN0ZW5lciwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTmFtaW5nQ29udGV4dExpc3RlbmVyLmNsYXNzKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIHByb3RlY3RlZCBMb2cgbG9nZ2VyID0gbG9nOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgbmFtaW5nIGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gIi8iOworCisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVkIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGNvbnRhaW5lciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVkIGZsYWcuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlZCBuYW1pbmcgcmVzb3VyY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBOYW1pbmdSZXNvdXJjZXMgbmFtaW5nUmVzb3VyY2VzID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlZCBKTkRJIGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIE5hbWluZ0NvbnRleHQgbmFtaW5nQ29udGV4dCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIENvbXAgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgamF2YXgubmFtaW5nLkNvbnRleHQgY29tcEN0eCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEVudiBjb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBqYXZheC5uYW1pbmcuQ29udGV4dCBlbnZDdHggPSBudWxsOworCisgICAgCisgICAgLyoqCisgICAgICogT2JqZWN0bmFtZXMgaGFzaHRhYmxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIG9iamVjdE5hbWVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlICJuYW1lIiBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLm5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlICJuYW1lIiBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgbG9nLmRlYnVnKCAic2V0TmFtZSAiICsgbmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFzc29jaWF0ZWQgbmFtaW5nIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0NvbnRleHQgZ2V0TmFtaW5nQ29udGV4dCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMubmFtaW5nQ29udGV4dCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlTGlzdGVuZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBY2tub3dsZWRnZSB0aGUgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IExpZmVjeWNsZUV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgbGlmZWN5Y2xlRXZlbnQoTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKKworICAgICAgICBjb250YWluZXIgPSBldmVudC5nZXRMaWZlY3ljbGUoKTsKKworICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGV4dCkgeworICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzID0gKChDb250ZXh0KSBjb250YWluZXIpLmdldE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICAgICAgbG9nZ2VyID0gbG9nOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFNlcnZlcikgeworICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzID0gKChTZXJ2ZXIpIGNvbnRhaW5lcikuZ2V0R2xvYmFsTmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IExpZmVjeWNsZS5TVEFSVF9FVkVOVCkgeworCisgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBIYXNodGFibGUgY29udGV4dEVudiA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbmFtaW5nQ29udGV4dCA9IG5ldyBOYW1pbmdDb250ZXh0KGNvbnRleHRFbnYsIGdldE5hbWUoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIE5ldmVyIGhhcHBlbnMKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnRleHRBY2Nlc3NDb250cm9sbGVyLnNldFNlY3VyaXR5VG9rZW4oZ2V0TmFtZSgpLCBjb250YWluZXIpOworICAgICAgICAgICAgQ29udGV4dEJpbmRpbmdzLmJpbmRDb250ZXh0KGNvbnRhaW5lciwgbmFtaW5nQ29udGV4dCwgY29udGFpbmVyKTsKKyAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkJvdW5kICIgKyBjb250YWluZXIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgY29udGV4dCBpbiByZWFkL3dyaXRlIG1vZGUKKyAgICAgICAgICAgIENvbnRleHRBY2Nlc3NDb250cm9sbGVyLnNldFdyaXRhYmxlKGdldE5hbWUoKSwgY29udGFpbmVyKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjcmVhdGVOYW1pbmdDb250ZXh0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJuYW1pbmcubmFtaW5nQ29udGV4dENyZWF0aW9uRmFpbGVkIiwgZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCaW5kaW5nIHRoZSBuYW1pbmcgY29udGV4dCB0byB0aGUgY2xhc3MgbG9hZGVyCisgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGV4dCkgeworICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGNvbnRleHQgaW4gcmVhZCBvbmx5IG1vZGUKKyAgICAgICAgICAgICAgICBDb250ZXh0QWNjZXNzQ29udHJvbGxlci5zZXRSZWFkT25seShnZXROYW1lKCkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENvbnRleHRCaW5kaW5ncy5iaW5kQ2xhc3NMb2FkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb250YWluZXIsIGNvbnRhaW5lciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgKChDb250YWluZXIpIGNvbnRhaW5lcikuZ2V0TG9hZGVyKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNtLmdldFN0cmluZygibmFtaW5nLmJpbmRGYWlsZWQiLCBlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU2VydmVyKSB7CisgICAgICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5uYW1pbmcuZmFjdG9yeS5SZXNvdXJjZUxpbmtGYWN0b3J5LnNldEdsb2JhbENvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgKG5hbWluZ0NvbnRleHQpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENvbnRleHRCaW5kaW5ncy5iaW5kQ2xhc3NMb2FkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb250YWluZXIsIGNvbnRhaW5lciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzbS5nZXRTdHJpbmcoIm5hbWluZy5iaW5kRmFpbGVkIiwgZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU3RhbmRhcmRTZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgKChTdGFuZGFyZFNlcnZlcikgY29udGFpbmVyKS5zZXRHbG9iYWxOYW1pbmdDb250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAobmFtaW5nQ29udGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CisKKyAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRUeXBlKCkgPT0gTGlmZWN5Y2xlLlNUT1BfRVZFTlQpIHsKKworICAgICAgICAgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGNvbnRleHQgaW4gcmVhZC93cml0ZSBtb2RlCisgICAgICAgICAgICBDb250ZXh0QWNjZXNzQ29udHJvbGxlci5zZXRXcml0YWJsZShnZXROYW1lKCksIGNvbnRhaW5lcik7CisgICAgICAgICAgICBDb250ZXh0QmluZGluZ3MudW5iaW5kQ29udGV4dChjb250YWluZXIsIGNvbnRhaW5lcik7CisKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgQ29udGV4dEJpbmRpbmdzLnVuYmluZENsYXNzTG9hZGVyCisgICAgICAgICAgICAgICAgICAgIChjb250YWluZXIsIGNvbnRhaW5lciwgCisgICAgICAgICAgICAgICAgICAgICAoKENvbnRhaW5lcikgY29udGFpbmVyKS5nZXRMb2FkZXIoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFNlcnZlcikgeworICAgICAgICAgICAgICAgIG5hbWluZ1Jlc291cmNlcy5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIENvbnRleHRCaW5kaW5ncy51bmJpbmRDbGFzc0xvYWRlcgorICAgICAgICAgICAgICAgICAgICAoY29udGFpbmVyLCBjb250YWluZXIsIAorICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb250ZXh0QWNjZXNzQ29udHJvbGxlci51bnNldFNlY3VyaXR5VG9rZW4oZ2V0TmFtZSgpLCBjb250YWluZXIpOworCisgICAgICAgICAgICBuYW1pbmdDb250ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIGVudkN0eCA9IG51bGw7CisgICAgICAgICAgICBjb21wQ3R4ID0gbnVsbDsKKyAgICAgICAgICAgIGluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnRhaW5lckxpc3RlbmVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWNrbm93bGVkZ2UgdGhlIG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBldmVudC4KKyAgICAgKiBOb3RlOiBXaWxsIG5ldmVyIGJlIGNhbGxlZCB3aGVuIHRoZSBsaXN0ZW5lciBpcyBhc3NvY2lhdGVkIHRvIGEgU2VydmVyLAorICAgICAqIHNpbmNlIGl0IGlzIG5vdCBhIENvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBDb250YWluZXJFdmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbnRhaW5lckV2ZW50KENvbnRhaW5lckV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBTZXR0aW5nIHRoZSBjb250ZXh0IGluIHJlYWQvd3JpdGUgbW9kZQorICAgICAgICBDb250ZXh0QWNjZXNzQ29udHJvbGxlci5zZXRXcml0YWJsZShnZXROYW1lKCksIGNvbnRhaW5lcik7CisKKyAgICAgICAgU3RyaW5nIHR5cGUgPSBldmVudC5nZXRUeXBlKCk7CisKKyAgICAgICAgaWYgKHR5cGUuZXF1YWxzKCJhZGRFamIiKSkgeworCisgICAgICAgICAgICBTdHJpbmcgZWpiTmFtZSA9IChTdHJpbmcpIGV2ZW50LmdldERhdGEoKTsKKyAgICAgICAgICAgIGlmIChlamJOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb250ZXh0RWpiIGVqYiA9IG5hbWluZ1Jlc291cmNlcy5maW5kRWpiKGVqYk5hbWUpOworICAgICAgICAgICAgICAgIGFkZEVqYihlamIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoImFkZEVudmlyb25tZW50IikpIHsKKworICAgICAgICAgICAgU3RyaW5nIGVudmlyb25tZW50TmFtZSA9IChTdHJpbmcpIGV2ZW50LmdldERhdGEoKTsKKyAgICAgICAgICAgIGlmIChlbnZpcm9ubWVudE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRleHRFbnZpcm9ubWVudCBlbnYgPSAKKyAgICAgICAgICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzLmZpbmRFbnZpcm9ubWVudChlbnZpcm9ubWVudE5hbWUpOworICAgICAgICAgICAgICAgIGFkZEVudmlyb25tZW50KGVudik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiYWRkTG9jYWxFamIiKSkgeworCisgICAgICAgICAgICBTdHJpbmcgbG9jYWxFamJOYW1lID0gKFN0cmluZykgZXZlbnQuZ2V0RGF0YSgpOworICAgICAgICAgICAgaWYgKGxvY2FsRWpiTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGV4dExvY2FsRWpiIGxvY2FsRWpiID0gCisgICAgICAgICAgICAgICAgICAgIG5hbWluZ1Jlc291cmNlcy5maW5kTG9jYWxFamIobG9jYWxFamJOYW1lKTsKKyAgICAgICAgICAgICAgICBhZGRMb2NhbEVqYihsb2NhbEVqYik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiYWRkUmVzb3VyY2UiKSkgeworCisgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lID0gKFN0cmluZykgZXZlbnQuZ2V0RGF0YSgpOworICAgICAgICAgICAgaWYgKHJlc291cmNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGV4dFJlc291cmNlIHJlc291cmNlID0gCisgICAgICAgICAgICAgICAgICAgIG5hbWluZ1Jlc291cmNlcy5maW5kUmVzb3VyY2UocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgICAgICAgICBhZGRSZXNvdXJjZShyZXNvdXJjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiYWRkUmVzb3VyY2VMaW5rIikpIHsKKworICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlTGlua05hbWUgPSAoU3RyaW5nKSBldmVudC5nZXREYXRhKCk7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VMaW5rTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGV4dFJlc291cmNlTGluayByZXNvdXJjZUxpbmsgPSAKKyAgICAgICAgICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzLmZpbmRSZXNvdXJjZUxpbmsocmVzb3VyY2VMaW5rTmFtZSk7CisgICAgICAgICAgICAgICAgYWRkUmVzb3VyY2VMaW5rKHJlc291cmNlTGluayk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiYWRkUmVzb3VyY2VFbnZSZWYiKSkgeworCisgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VFbnZSZWZOYW1lID0gKFN0cmluZykgZXZlbnQuZ2V0RGF0YSgpOworICAgICAgICAgICAgaWYgKHJlc291cmNlRW52UmVmTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGV4dFJlc291cmNlRW52UmVmIHJlc291cmNlRW52UmVmID0gCisgICAgICAgICAgICAgICAgICAgIG5hbWluZ1Jlc291cmNlcy5maW5kUmVzb3VyY2VFbnZSZWYocmVzb3VyY2VFbnZSZWZOYW1lKTsKKyAgICAgICAgICAgICAgICBhZGRSZXNvdXJjZUVudlJlZihyZXNvdXJjZUVudlJlZik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygicmVtb3ZlRWpiIikpIHsKKworICAgICAgICAgICAgU3RyaW5nIGVqYk5hbWUgPSAoU3RyaW5nKSBldmVudC5nZXREYXRhKCk7CisgICAgICAgICAgICBpZiAoZWpiTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlRWpiKGVqYk5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoInJlbW92ZUVudmlyb25tZW50IikpIHsKKworICAgICAgICAgICAgU3RyaW5nIGVudmlyb25tZW50TmFtZSA9IChTdHJpbmcpIGV2ZW50LmdldERhdGEoKTsKKyAgICAgICAgICAgIGlmIChlbnZpcm9ubWVudE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlbW92ZUVudmlyb25tZW50KGVudmlyb25tZW50TmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygicmVtb3ZlTG9jYWxFamIiKSkgeworCisgICAgICAgICAgICBTdHJpbmcgbG9jYWxFamJOYW1lID0gKFN0cmluZykgZXZlbnQuZ2V0RGF0YSgpOworICAgICAgICAgICAgaWYgKGxvY2FsRWpiTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWxFamIobG9jYWxFamJOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJyZW1vdmVSZXNvdXJjZSIpKSB7CisKKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUgPSAoU3RyaW5nKSBldmVudC5nZXREYXRhKCk7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVSZXNvdXJjZShyZXNvdXJjZU5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoInJlbW92ZVJlc291cmNlTGluayIpKSB7CisKKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZUxpbmtOYW1lID0gKFN0cmluZykgZXZlbnQuZ2V0RGF0YSgpOworICAgICAgICAgICAgaWYgKHJlc291cmNlTGlua05hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlbW92ZVJlc291cmNlTGluayhyZXNvdXJjZUxpbmtOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJyZW1vdmVSZXNvdXJjZUVudlJlZiIpKSB7CisKKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZUVudlJlZk5hbWUgPSAoU3RyaW5nKSBldmVudC5nZXREYXRhKCk7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VFbnZSZWZOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVSZXNvdXJjZUVudlJlZihyZXNvdXJjZUVudlJlZk5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBTZXR0aW5nIHRoZSBjb250ZXh0IGluIHJlYWQgb25seSBtb2RlCisgICAgICAgIENvbnRleHRBY2Nlc3NDb250cm9sbGVyLnNldFJlYWRPbmx5KGdldE5hbWUoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHByb3BlcnR5IGNoYW5nZSBldmVudHMuICBDdXJyZW50bHksIG9ubHkgbGlzdGVucyB0byBzdWNoIGV2ZW50cworICAgICAqIG9uIHRoZSA8Y29kZT5OYW1pbmdSZXNvdXJjZXM8L2NvZGU+IGluc3RhbmNlIGZvciB0aGUgZ2xvYmFsIG5hbWluZworICAgICAqIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgcHJvcGVydHkgY2hhbmdlIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCisgICAgICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgT2JqZWN0IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpOworICAgICAgICBpZiAoc291cmNlID09IG5hbWluZ1Jlc291cmNlcykgeworCisgICAgICAgICAgICAvLyBTZXR0aW5nIHRoZSBjb250ZXh0IGluIHJlYWQvd3JpdGUgbW9kZQorICAgICAgICAgICAgQ29udGV4dEFjY2Vzc0NvbnRyb2xsZXIuc2V0V3JpdGFibGUoZ2V0TmFtZSgpLCBjb250YWluZXIpOworCisgICAgICAgICAgICBwcm9jZXNzR2xvYmFsUmVzb3VyY2VzQ2hhbmdlKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRPbGRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROZXdWYWx1ZSgpKTsKKworICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgY29udGV4dCBpbiByZWFkIG9ubHkgbW9kZQorICAgICAgICAgICAgQ29udGV4dEFjY2Vzc0NvbnRyb2xsZXIuc2V0UmVhZE9ubHkoZ2V0TmFtZSgpKTsKKworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgcHJvcGVydHkgY2hhbmdlIG9uIHRoZSBnbG9iYWwgbmFtaW5nIHJlc291cmNlcywgYnkgbWFraW5nIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgYWRkaXRpb24gb3IgcmVtb3ZhbCB0byB0aGUgYXNzb2NpYXRlZCBKTkRJIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBjaGFuZ2UgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIG9sZFZhbHVlIFRoZSBvbGQgdmFsdWUgKG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGFkZGluZykKKyAgICAgKiBAcGFyYW0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZSAob3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcmVtb3ZpbmcpCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NHbG9iYWxSZXNvdXJjZXNDaGFuZ2UoU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBuZXdWYWx1ZSkgeworCisgICAgICAgIC8vIE5PVEUgLSBJdCBzZWVtcyB0aGF0IHRoZSBDb250ZXh0IGZvciBnbG9iYWwgSk5ESSByZXNvdXJjZXMKKyAgICAgICAgLy8gaXMgbGVmdCBpbiByZWFkLXdyaXRlIG1vZGUsIHNvIHdlIGRvIG5vdCBoYXZlIHRvIGNoYW5nZSBpdCBoZXJlCisKKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJlamIiKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb250ZXh0RWpiIGVqYiA9IChDb250ZXh0RWpiKSBvbGRWYWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoZWpiLmdldE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUVqYihlamIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRleHRFamIgZWpiID0gKENvbnRleHRFamIpIG5ld1ZhbHVlOworICAgICAgICAgICAgICAgIGlmIChlamIuZ2V0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkRWpiKGVqYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJlbnZpcm9ubWVudCIpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRleHRFbnZpcm9ubWVudCBlbnYgPSAoQ29udGV4dEVudmlyb25tZW50KSBvbGRWYWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoZW52LmdldE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUVudmlyb25tZW50KGVudi5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGV4dEVudmlyb25tZW50IGVudiA9IChDb250ZXh0RW52aXJvbm1lbnQpIG5ld1ZhbHVlOworICAgICAgICAgICAgICAgIGlmIChlbnYuZ2V0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkRW52aXJvbm1lbnQoZW52KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImxvY2FsRWpiIikpIHsKKyAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGV4dExvY2FsRWpiIGVqYiA9IChDb250ZXh0TG9jYWxFamIpIG9sZFZhbHVlOworICAgICAgICAgICAgICAgIGlmIChlamIuZ2V0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWxFamIoZWpiLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb250ZXh0TG9jYWxFamIgZWpiID0gKENvbnRleHRMb2NhbEVqYikgbmV3VmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKGVqYi5nZXROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhZGRMb2NhbEVqYihlamIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygicmVzb3VyY2UiKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb250ZXh0UmVzb3VyY2UgcmVzb3VyY2UgPSAoQ29udGV4dFJlc291cmNlKSBvbGRWYWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UuZ2V0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVzb3VyY2UocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRleHRSZXNvdXJjZSByZXNvdXJjZSA9IChDb250ZXh0UmVzb3VyY2UpIG5ld1ZhbHVlOworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5nZXROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhZGRSZXNvdXJjZShyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJyZXNvdXJjZUVudlJlZiIpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRleHRSZXNvdXJjZUVudlJlZiByZXNvdXJjZUVudlJlZiA9IAorICAgICAgICAgICAgICAgICAgICAoQ29udGV4dFJlc291cmNlRW52UmVmKSBvbGRWYWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VFbnZSZWYuZ2V0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVzb3VyY2VFbnZSZWYocmVzb3VyY2VFbnZSZWYuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRleHRSZXNvdXJjZUVudlJlZiByZXNvdXJjZUVudlJlZiA9IAorICAgICAgICAgICAgICAgICAgICAoQ29udGV4dFJlc291cmNlRW52UmVmKSBuZXdWYWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VFbnZSZWYuZ2V0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkUmVzb3VyY2VFbnZSZWYocmVzb3VyY2VFbnZSZWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygicmVzb3VyY2VMaW5rIikpIHsKKyAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGV4dFJlc291cmNlTGluayBybCA9IChDb250ZXh0UmVzb3VyY2VMaW5rKSBvbGRWYWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAocmwuZ2V0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVzb3VyY2VMaW5rKHJsLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb250ZXh0UmVzb3VyY2VMaW5rIHJsID0gKENvbnRleHRSZXNvdXJjZUxpbmspIG5ld1ZhbHVlOworICAgICAgICAgICAgICAgIGlmIChybC5nZXROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhZGRSZXNvdXJjZUxpbmsocmwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgSk5ESSBuYW1pbmcgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlTmFtaW5nQ29udGV4dCgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0aW5nIHRoZSBjb21wIHN1YmNvbnRleHQKKyAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFNlcnZlcikgeworICAgICAgICAgICAgY29tcEN0eCA9IG5hbWluZ0NvbnRleHQ7CisgICAgICAgICAgICBlbnZDdHggPSBuYW1pbmdDb250ZXh0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29tcEN0eCA9IG5hbWluZ0NvbnRleHQuY3JlYXRlU3ViY29udGV4dCgiY29tcCIpOworICAgICAgICAgICAgZW52Q3R4ID0gY29tcEN0eC5jcmVhdGVTdWJjb250ZXh0KCJlbnYiKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBpOworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgSk5ESSBuYW1pbmcgY29udGV4dCIpOworCisgICAgICAgIGlmIChuYW1pbmdSZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzID0gbmV3IE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzLnNldENvbnRhaW5lcihjb250YWluZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzb3VyY2UgbGlua3MKKyAgICAgICAgQ29udGV4dFJlc291cmNlTGlua1tdIHJlc291cmNlTGlua3MgPSAKKyAgICAgICAgICAgIG5hbWluZ1Jlc291cmNlcy5maW5kUmVzb3VyY2VMaW5rcygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VMaW5rcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYWRkUmVzb3VyY2VMaW5rKHJlc291cmNlTGlua3NbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzb3VyY2VzCisgICAgICAgIENvbnRleHRSZXNvdXJjZVtdIHJlc291cmNlcyA9IG5hbWluZ1Jlc291cmNlcy5maW5kUmVzb3VyY2VzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFkZFJlc291cmNlKHJlc291cmNlc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNvdXJjZXMgRW52CisgICAgICAgIENvbnRleHRSZXNvdXJjZUVudlJlZltdIHJlc291cmNlRW52UmVmcyA9IG5hbWluZ1Jlc291cmNlcy5maW5kUmVzb3VyY2VFbnZSZWZzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXNvdXJjZUVudlJlZnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFkZFJlc291cmNlRW52UmVmKHJlc291cmNlRW52UmVmc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBFbnZpcm9ubWVudCBlbnRyaWVzCisgICAgICAgIENvbnRleHRFbnZpcm9ubWVudFtdIGNvbnRleHRFbnZpcm9ubWVudHMgPSAKKyAgICAgICAgICAgIG5hbWluZ1Jlc291cmNlcy5maW5kRW52aXJvbm1lbnRzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb250ZXh0RW52aXJvbm1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhZGRFbnZpcm9ubWVudChjb250ZXh0RW52aXJvbm1lbnRzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVKQiByZWZlcmVuY2VzCisgICAgICAgIENvbnRleHRFamJbXSBlamJzID0gbmFtaW5nUmVzb3VyY2VzLmZpbmRFamJzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlamJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhZGRFamIoZWpic1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBCaW5kaW5nIGEgVXNlciBUcmFuc2FjdGlvbiByZWZlcmVuY2UKKyAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlIHJlZiA9IG5ldyBUcmFuc2FjdGlvblJlZigpOworICAgICAgICAgICAgICAgIGNvbXBDdHguYmluZCgiVXNlclRyYW5zYWN0aW9uIiwgcmVmKTsKKyAgICAgICAgICAgICAgICBDb250ZXh0VHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBuYW1pbmdSZXNvdXJjZXMuZ2V0VHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNhY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBwYXJhbXMgPSB0cmFuc2FjdGlvbi5saXN0UHJvcGVydGllcygpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFyYW1zLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IChTdHJpbmcpIHBhcmFtcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IChTdHJpbmcpIHRyYW5zYWN0aW9uLmdldFByb3BlcnR5KHBhcmFtTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWZBZGRyIHJlZkFkZHIgPSBuZXcgU3RyaW5nUmVmQWRkcihwYXJhbU5hbWUsIHBhcmFtVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVmLmFkZChyZWZBZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZSBiZWNhdXNlIFVzZXJUcmFuc2FjdGlvbiB3YXMgb2J2aW91c2x5IAorICAgICAgICAgICAgICAgIC8vIGFkZGVkIHZpYSBSZXNvdXJjZUxpbmsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNtLmdldFN0cmluZygibmFtaW5nLmJpbmRGYWlsZWQiLCBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBCaW5kaW5nIHRoZSByZXNvdXJjZXMgZGlyZWN0b3J5IGNvbnRleHQKKyAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29tcEN0eC5iaW5kKCJSZXNvdXJjZXMiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDb250YWluZXIpIGNvbnRhaW5lcikuZ2V0UmVzb3VyY2VzKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc20uZ2V0U3RyaW5nKCJuYW1pbmcuYmluZEZhaWxlZCIsIGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+T2JqZWN0TmFtZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Db250ZXh0UmVzb3VyY2U8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcmVzb3VyY2UKKyAgICAgKiBAcmV0dXJuIE9iamVjdE5hbWUgVGhlIG9iamVjdCBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGlmIGEgbmFtZSBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3ROYW1lIGNyZWF0ZU9iamVjdE5hbWUoQ29udGV4dFJlc291cmNlIHJlc291cmNlKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBTdGFuZGFyZFNlcnZlcikgeworICAgICAgICAgICAgZG9tYWluID0gKChTdGFuZGFyZFNlcnZlcikgY29udGFpbmVyKS5nZXREb21haW4oKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBDb250YWluZXJCYXNlKSB7CisgICAgICAgICAgICBkb21haW4gPSAoKENvbnRhaW5lckJhc2UpIGNvbnRhaW5lcikuZ2V0RG9tYWluKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKSB7CisgICAgICAgICAgICBkb21haW4gPSAiQ2F0YWxpbmEiOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgcXVvdGVkUmVzb3VyY2VOYW1lID0gT2JqZWN0TmFtZS5xdW90ZShyZXNvdXJjZS5nZXROYW1lKCkpOworICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU2VydmVyKSB7ICAgICAgICAKKyAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9RGF0YVNvdXJjZSIgKworICAgICAgICAgICAgICAgICAgICAgICAgIixjbGFzcz0iICsgcmVzb3VyY2UuZ2V0VHlwZSgpICsgCisgICAgICAgICAgICAgICAgICAgICAgICAiLG5hbWU9IiArIHF1b3RlZFJlc291cmNlTmFtZSk7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGV4dCkgeyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9ICgoQ29udGV4dCljb250YWluZXIpLmdldFBhdGgoKTsKKyAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgICAgICBwYXRoID0gIi8iOworICAgICAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpICgoQ29udGV4dCljb250YWluZXIpLmdldFBhcmVudCgpOworICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1EYXRhU291cmNlIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiLHBhdGg9IiArIHBhdGggKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIsaG9zdD0iICsgaG9zdC5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIixjbGFzcz0iICsgcmVzb3VyY2UuZ2V0VHlwZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIsbmFtZT0iICsgcXVvdGVkUmVzb3VyY2VOYW1lKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIEVKQnMgaW4gdGhlIG5hbWluZyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEVqYihDb250ZXh0RWpiIGVqYikgeworCisgICAgICAgIC8vIENyZWF0ZSBhIHJlZmVyZW5jZSB0byB0aGUgRUpCLgorICAgICAgICBSZWZlcmVuY2UgcmVmID0gbmV3IEVqYlJlZgorICAgICAgICAgICAgKGVqYi5nZXRUeXBlKCksIGVqYi5nZXRIb21lKCksIGVqYi5nZXRSZW1vdGUoKSwgZWpiLmdldExpbmsoKSk7CisgICAgICAgIC8vIEFkZGluZyB0aGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLCBpZiBhbnkKKyAgICAgICAgSXRlcmF0b3IgcGFyYW1zID0gZWpiLmxpc3RQcm9wZXJ0aWVzKCk7CisgICAgICAgIHdoaWxlIChwYXJhbXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gKFN0cmluZykgcGFyYW1zLm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlID0gKFN0cmluZykgZWpiLmdldFByb3BlcnR5KHBhcmFtTmFtZSk7CisgICAgICAgICAgICBTdHJpbmdSZWZBZGRyIHJlZkFkZHIgPSBuZXcgU3RyaW5nUmVmQWRkcihwYXJhbU5hbWUsIHBhcmFtVmFsdWUpOworICAgICAgICAgICAgcmVmLmFkZChyZWZBZGRyKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY3JlYXRlU3ViY29udGV4dHMoZW52Q3R4LCBlamIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGVudkN0eC5iaW5kKGVqYi5nZXROYW1lKCksIHJlZik7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc20uZ2V0U3RyaW5nKCJuYW1pbmcuYmluZEZhaWxlZCIsIGUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwZWNpZmllZCBlbnZpcm9ubWVudCBlbnRyaWVzIGluIHRoZSBuYW1pbmcgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFbnZpcm9ubWVudChDb250ZXh0RW52aXJvbm1lbnQgZW52KSB7CisKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKyAgICAgICAgLy8gSW5zdGFudGlhdGluZyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY29ycmVjdCBvYmplY3QgdHlwZSwgYW5kCisgICAgICAgIC8vIGluaXRpYWxpemluZyBpdC4KKyAgICAgICAgU3RyaW5nIHR5cGUgPSBlbnYuZ2V0VHlwZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHR5cGUuZXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIikpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudi5nZXRWYWx1ZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiamF2YS5sYW5nLkJ5dGUiKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnYuZ2V0VmFsdWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IEJ5dGUoKGJ5dGUpIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQnl0ZS5kZWNvZGUoZW52LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoImphdmEubGFuZy5TaG9ydCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudi5nZXRWYWx1ZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgU2hvcnQoKHNob3J0KSAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFNob3J0LmRlY29kZShlbnYuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiamF2YS5sYW5nLkludGVnZXIiKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnYuZ2V0VmFsdWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IEludGVnZXIoMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBJbnRlZ2VyLmRlY29kZShlbnYuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiamF2YS5sYW5nLkxvbmciKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnYuZ2V0VmFsdWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IExvbmcoMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBMb25nLmRlY29kZShlbnYuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiamF2YS5sYW5nLkJvb2xlYW4iKSkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gQm9vbGVhbi52YWx1ZU9mKGVudi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoImphdmEubGFuZy5Eb3VibGUiKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnYuZ2V0VmFsdWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IERvdWJsZSgwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IERvdWJsZS52YWx1ZU9mKGVudi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJqYXZhLmxhbmcuRmxvYXQiKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnYuZ2V0VmFsdWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IEZsb2F0KDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gRmxvYXQudmFsdWVPZihlbnYuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiamF2YS5sYW5nLkNoYXJhY3RlciIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudi5nZXRWYWx1ZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgQ2hhcmFjdGVyKChjaGFyKSAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZW52LmdldFZhbHVlKCkubGVuZ3RoKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgQ2hhcmFjdGVyKGVudi5nZXRWYWx1ZSgpLmNoYXJBdCgwKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzbS5nZXRTdHJpbmcoIm5hbWluZy5pbnZhbGlkRW52RW50cnlUeXBlIiwgZW52LmdldE5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNtLmdldFN0cmluZygibmFtaW5nLmludmFsaWRFbnZFbnRyeVZhbHVlIiwgZW52LmdldE5hbWUoKSkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNtLmdldFN0cmluZygibmFtaW5nLmludmFsaWRFbnZFbnRyeVZhbHVlIiwgZW52LmdldE5hbWUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQmluZGluZyB0aGUgb2JqZWN0IHRvIHRoZSBhcHByb3ByaWF0ZSBuYW1lCisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCIgIEFkZGluZyBlbnZpcm9ubWVudCBlbnRyeSAiICsgZW52LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgY3JlYXRlU3ViY29udGV4dHMoZW52Q3R4LCBlbnYuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBlbnZDdHguYmluZChlbnYuZ2V0TmFtZSgpLCB2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzbS5nZXRTdHJpbmcoIm5hbWluZy5pbnZhbGlkRW52RW50cnlWYWx1ZSIsIGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwZWNpZmllZCBsb2NhbCBFSkJzIGluIHRoZSBuYW1pbmcgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMb2NhbEVqYihDb250ZXh0TG9jYWxFamIgbG9jYWxFamIpIHsKKworCisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIHJlc291cmNlcyBpbiB0aGUgbmFtaW5nIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVzb3VyY2UoQ29udGV4dFJlc291cmNlIHJlc291cmNlKSB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIHRoZSByZXNvdXJjZS4KKyAgICAgICAgUmVmZXJlbmNlIHJlZiA9IG5ldyBSZXNvdXJjZVJlZgorICAgICAgICAgICAgKHJlc291cmNlLmdldFR5cGUoKSwgcmVzb3VyY2UuZ2V0RGVzY3JpcHRpb24oKSwKKyAgICAgICAgICAgICByZXNvdXJjZS5nZXRTY29wZSgpLCByZXNvdXJjZS5nZXRBdXRoKCkpOworICAgICAgICAvLyBBZGRpbmcgdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVycywgaWYgYW55CisgICAgICAgIEl0ZXJhdG9yIHBhcmFtcyA9IHJlc291cmNlLmxpc3RQcm9wZXJ0aWVzKCk7CisgICAgICAgIHdoaWxlIChwYXJhbXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gKFN0cmluZykgcGFyYW1zLm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlID0gKFN0cmluZykgcmVzb3VyY2UuZ2V0UHJvcGVydHkocGFyYW1OYW1lKTsKKyAgICAgICAgICAgIFN0cmluZ1JlZkFkZHIgcmVmQWRkciA9IG5ldyBTdHJpbmdSZWZBZGRyKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7CisgICAgICAgICAgICByZWYuYWRkKHJlZkFkZHIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIiAgQWRkaW5nIHJlc291cmNlIHJlZiAiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc291cmNlLmdldE5hbWUoKSArICIgICIgKyByZWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3JlYXRlU3ViY29udGV4dHMoZW52Q3R4LCByZXNvdXJjZS5nZXROYW1lKCkpOworICAgICAgICAgICAgZW52Q3R4LmJpbmQocmVzb3VyY2UuZ2V0TmFtZSgpLCByZWYpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNtLmdldFN0cmluZygibmFtaW5nLmJpbmRGYWlsZWQiLCBlKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoImphdmF4LnNxbC5EYXRhU291cmNlIi5lcXVhbHMocmVmLmdldENsYXNzTmFtZSgpKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uID0gY3JlYXRlT2JqZWN0TmFtZShyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgT2JqZWN0IGFjdHVhbFJlc291cmNlID0gZW52Q3R4Lmxvb2t1cChyZXNvdXJjZS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLnJlZ2lzdGVyQ29tcG9uZW50KGFjdHVhbFJlc291cmNlLCBvbiwgbnVsbCk7CisgICAgICAgICAgICAgICAgb2JqZWN0TmFtZXMucHV0KHJlc291cmNlLmdldE5hbWUoKSwgb24pOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybihzbS5nZXRTdHJpbmcoIm5hbWluZy5qbXhSZWdpc3RyYXRpb25GYWlsZWQiLCBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwZWNpZmllZCByZXNvdXJjZXMgaW4gdGhlIG5hbWluZyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJlc291cmNlRW52UmVmKENvbnRleHRSZXNvdXJjZUVudlJlZiByZXNvdXJjZUVudlJlZikgeworCisgICAgICAgIC8vIENyZWF0ZSBhIHJlZmVyZW5jZSB0byB0aGUgcmVzb3VyY2UgZW52LgorICAgICAgICBSZWZlcmVuY2UgcmVmID0gbmV3IFJlc291cmNlRW52UmVmKHJlc291cmNlRW52UmVmLmdldFR5cGUoKSk7CisgICAgICAgIC8vIEFkZGluZyB0aGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLCBpZiBhbnkKKyAgICAgICAgSXRlcmF0b3IgcGFyYW1zID0gcmVzb3VyY2VFbnZSZWYubGlzdFByb3BlcnRpZXMoKTsKKyAgICAgICAgd2hpbGUgKHBhcmFtcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSAoU3RyaW5nKSBwYXJhbXMubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHBhcmFtVmFsdWUgPSAoU3RyaW5nKSByZXNvdXJjZUVudlJlZi5nZXRQcm9wZXJ0eShwYXJhbU5hbWUpOworICAgICAgICAgICAgU3RyaW5nUmVmQWRkciByZWZBZGRyID0gbmV3IFN0cmluZ1JlZkFkZHIocGFyYW1OYW1lLCBwYXJhbVZhbHVlKTsKKyAgICAgICAgICAgIHJlZi5hZGQocmVmQWRkcik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgQWRkaW5nIHJlc291cmNlIGVudiByZWYgIiArIHJlc291cmNlRW52UmVmLmdldE5hbWUoKSk7CisgICAgICAgICAgICBjcmVhdGVTdWJjb250ZXh0cyhlbnZDdHgsIHJlc291cmNlRW52UmVmLmdldE5hbWUoKSk7CisgICAgICAgICAgICBlbnZDdHguYmluZChyZXNvdXJjZUVudlJlZi5nZXROYW1lKCksIHJlZik7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc20uZ2V0U3RyaW5nKCJuYW1pbmcuYmluZEZhaWxlZCIsIGUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBsaW5rIGluIHRoZSBuYW1pbmcgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZUxpbmsoQ29udGV4dFJlc291cmNlTGluayByZXNvdXJjZUxpbmspIHsKKworICAgICAgICAvLyBDcmVhdGUgYSByZWZlcmVuY2UgdG8gdGhlIHJlc291cmNlLgorICAgICAgICBSZWZlcmVuY2UgcmVmID0gbmV3IFJlc291cmNlTGlua1JlZgorICAgICAgICAgICAgKHJlc291cmNlTGluay5nZXRUeXBlKCksIHJlc291cmNlTGluay5nZXRHbG9iYWwoKSk7CisgICAgICAgIGphdmF4Lm5hbWluZy5Db250ZXh0IGN0eCA9IAorICAgICAgICAgICAgIlVzZXJUcmFuc2FjdGlvbiIuZXF1YWxzKHJlc291cmNlTGluay5nZXROYW1lKCkpIAorICAgICAgICAgICAgPyBjb21wQ3R4IDogZW52Q3R4OworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBBZGRpbmcgcmVzb3VyY2UgbGluayAiICsgcmVzb3VyY2VMaW5rLmdldE5hbWUoKSk7CisgICAgICAgICAgICBjcmVhdGVTdWJjb250ZXh0cyhlbnZDdHgsIHJlc291cmNlTGluay5nZXROYW1lKCkpOworICAgICAgICAgICAgY3R4LmJpbmQocmVzb3VyY2VMaW5rLmdldE5hbWUoKSwgcmVmKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzbS5nZXRTdHJpbmcoIm5hbWluZy5iaW5kRmFpbGVkIiwgZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIEVKQnMgaW4gdGhlIG5hbWluZyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUVqYihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbnZDdHgudW5iaW5kKG5hbWUpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNtLmdldFN0cmluZygibmFtaW5nLnVuYmluZEZhaWxlZCIsIGUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwZWNpZmllZCBlbnZpcm9ubWVudCBlbnRyaWVzIGluIHRoZSBuYW1pbmcgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVFbnZpcm9ubWVudChTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbnZDdHgudW5iaW5kKG5hbWUpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNtLmdldFN0cmluZygibmFtaW5nLnVuYmluZEZhaWxlZCIsIGUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwZWNpZmllZCBsb2NhbCBFSkJzIGluIHRoZSBuYW1pbmcgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMb2NhbEVqYihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbnZDdHgudW5iaW5kKG5hbWUpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNtLmdldFN0cmluZygibmFtaW5nLnVuYmluZEZhaWxlZCIsIGUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwZWNpZmllZCByZXNvdXJjZXMgaW4gdGhlIG5hbWluZyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVudkN0eC51bmJpbmQobmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc20uZ2V0U3RyaW5nKCJuYW1pbmcudW5iaW5kRmFpbGVkIiwgZSkpOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0TmFtZSBvbiA9IChPYmplY3ROYW1lKSBvYmplY3ROYW1lcy5nZXQobmFtZSk7CisgICAgICAgIGlmIChvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS51bnJlZ2lzdGVyQ29tcG9uZW50KG9uKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwZWNpZmllZCByZXNvdXJjZXMgaW4gdGhlIG5hbWluZyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlRW52UmVmKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVudkN0eC51bmJpbmQobmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc20uZ2V0U3RyaW5nKCJuYW1pbmcudW5iaW5kRmFpbGVkIiwgZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIHJlc291cmNlcyBpbiB0aGUgbmFtaW5nIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VMaW5rKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVudkN0eC51bmJpbmQobmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc20uZ2V0U3RyaW5nKCJuYW1pbmcudW5iaW5kRmFpbGVkIiwgZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbGwgaW50ZXJtZWRpYXRlIHN1YmNvbnRleHRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTdWJjb250ZXh0cyhqYXZheC5uYW1pbmcuQ29udGV4dCBjdHgsIFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgamF2YXgubmFtaW5nLkNvbnRleHQgY3VycmVudENvbnRleHQgPSBjdHg7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG5hbWUsICIvIik7CisgICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICBpZiAoKCF0b2tlbi5lcXVhbHMoIiIpKSAmJiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29udGV4dCA9IGN1cnJlbnRDb250ZXh0LmNyZWF0ZVN1YmNvbnRleHQodG9rZW4pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbGVudCBjYXRjaC4gUHJvYmFibHkgYW4gb2JqZWN0IGlzIGFscmVhZHkgYm91bmQgaW4KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbnRleHQuCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChqYXZheC5uYW1pbmcuQ29udGV4dCkgY3VycmVudENvbnRleHQubG9va3VwKHRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRDb250ZXh0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZENvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGNlYWI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRDb250ZXh0LmphdmEKQEAgLTAsMCArMSw1Mzk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkxpc3RlbmVyTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbk5vdGlmaWNhdGlvbkluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblJlZ2lzdHJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkJyb2FkY2FzdGVyU3VwcG9ydDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkVtaXR0ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25GaWx0ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEV2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25MaXN0ZW5lcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5JbnN0YW5jZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5XcmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkFwcGxpY2F0aW9uUGFyYW1ldGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkVycm9yUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5GaWx0ZXJEZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuRmlsdGVyTWFwOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkxvZ2luQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk1lc3NhZ2VEZXN0aW5hdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5NZXNzYWdlRGVzdGluYXRpb25SZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LlNlY3VyaXR5Q29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5TZWN1cml0eUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIuV2ViYXBwTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5TdGFuZGFyZE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNvbnRleHRDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLlRsZENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuQ2hhcnNldE1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuRXh0ZW5zaW9uVmFsaWRhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5SZXF1ZXN0VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuVVJMRW5jb2RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5Db250ZXh0QmluZGluZ3M7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLkJhc2VEaXJDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5EaXJDb250ZXh0VVJMU3RyZWFtSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuRmlsZURpckNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLlByb3h5RGlyQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuV0FSRGlyQ29udGV4dDsKKworLyoqCisgKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGI+Q29udGV4dDwvYj4gaW50ZXJmYWNlLiAgRWFjaAorICogY2hpbGQgY29udGFpbmVyIG11c3QgYmUgYSBXcmFwcGVyIGltcGxlbWVudGF0aW9uIHRvIHByb2Nlc3MgdGhlCisgKiByZXF1ZXN0cyBkaXJlY3RlZCB0byBhIHBhcnRpY3VsYXIgc2VydmxldC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFN0YW5kYXJkQ29udGV4dAorICAgIGV4dGVuZHMgQ29udGFpbmVyQmFzZQorICAgIGltcGxlbWVudHMgQ29udGV4dCwgU2VyaWFsaXphYmxlLCBOb3RpZmljYXRpb25FbWl0dGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgdHJhbnNpZW50IExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTdGFuZGFyZENvbnRleHQuY2xhc3MpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IFN0YW5kYXJkQ29udGV4dCBjb21wb25lbnQgd2l0aCB0aGUgZGVmYXVsdCBiYXNpYyBWYWx2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhbmRhcmRDb250ZXh0KCkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHBpcGVsaW5lLnNldEJhc2ljKG5ldyBTdGFuZGFyZENvbnRleHRWYWx2ZSgpKTsKKyAgICAgICAgYnJvYWRjYXN0ZXIgPSBuZXcgTm90aWZpY2F0aW9uQnJvYWRjYXN0ZXJTdXBwb3J0KCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENsYXNzIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gc3RyaW5nIGZvciB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQvMS4wIjsKKworCisgICAgLyoqCisgICAgICogQXJyYXkgY29udGFpbmluZyB0aGUgc2FmZSBjaGFyYWN0ZXJzIHNldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFVSTEVuY29kZXIgdXJsRW5jb2RlcjsKKworCisgICAgLyoqCisgICAgICogR01UIHRpbWV6b25lIC0gYWxsIEhUVFAgZGF0ZXMgYXJlIG9uIEdNVAorICAgICAqLworICAgIHN0YXRpYyB7CisgICAgICAgIHVybEVuY29kZXIgPSBuZXcgVVJMRW5jb2RlcigpOworICAgICAgICB1cmxFbmNvZGVyLmFkZFNhZmVDaGFyYWN0ZXIoJ34nKTsKKyAgICAgICAgdXJsRW5jb2Rlci5hZGRTYWZlQ2hhcmFjdGVyKCctJyk7CisgICAgICAgIHVybEVuY29kZXIuYWRkU2FmZUNoYXJhY3RlcignXycpOworICAgICAgICB1cmxFbmNvZGVyLmFkZFNhZmVDaGFyYWN0ZXIoJy4nKTsKKyAgICAgICAgdXJsRW5jb2Rlci5hZGRTYWZlQ2hhcmFjdGVyKCcqJyk7CisgICAgICAgIHVybEVuY29kZXIuYWRkU2FmZUNoYXJhY3RlcignLycpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBhbHRlcm5hdGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWx0REROYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlZCBob3N0IG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdE5hbWU7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhbnRpSkFSTG9ja2luZyBmbGFnIGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFudGlKQVJMb2NraW5nID0gZmFsc2U7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgYW50aVJlc291cmNlTG9ja2luZyBmbGFnIGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFudGlSZXNvdXJjZUxvY2tpbmcgPSBmYWxzZTsKKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgYXBwbGljYXRpb24gbGlzdGVuZXIgY2xhc3MgbmFtZXMgY29uZmlndXJlZCBmb3IgdGhpcworICAgICAqIGFwcGxpY2F0aW9uLCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGVuY291bnRlcmVkIGluIHRoZSB3ZWIueG1sIGZpbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXBwbGljYXRpb25MaXN0ZW5lcnNbXSA9IG5ldyBTdHJpbmdbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgaW5zdGFudGlhdGVkIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIG9iamVjdHM8L2NvZGU+LgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IE9iamVjdCBhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzT2JqZWN0c1tdID0gCisgICAgICAgIG5ldyBPYmplY3RbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgaW5zdGFudGlhdGVkIGFwcGxpY2F0aW9uIGxpZmVjeWNsZSBsaXN0ZW5lciBvYmplY3RzPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3QgYXBwbGljYXRpb25MaWZlY3ljbGVMaXN0ZW5lcnNPYmplY3RzW10gPSAKKyAgICAgICAgbmV3IE9iamVjdFswXTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBhcHBsaWNhdGlvbiBwYXJhbWV0ZXJzIGRlZmluZWQgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvblBhcmFtZXRlciBhcHBsaWNhdGlvblBhcmFtZXRlcnNbXSA9CisgICAgICAgIG5ldyBBcHBsaWNhdGlvblBhcmFtZXRlclswXTsKKworCisgICAgLyoqCisgICAgICogVGhlIGFwcGxpY2F0aW9uIGF2YWlsYWJsZSBmbGFnIGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGF2YWlsYWJsZSA9IGZhbHNlOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBicm9hZGNhc3RlciB0aGF0IHNlbmRzIGoyZWUgbm90aWZpY2F0aW9ucy4gCisgICAgICovCisgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25Ccm9hZGNhc3RlclN1cHBvcnQgYnJvYWRjYXN0ZXIgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBMb2NhbGUgdG8gY2hhcmFjdGVyIHNldCBtYXBwZXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgQ2hhcnNldE1hcHBlciBjaGFyc2V0TWFwcGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgQ2hhcnNldE1hcHBlciBjbGFzcyB0byBiZSBjcmVhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNoYXJzZXRNYXBwZXJDbGFzcyA9CisgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkNoYXJzZXRNYXBwZXIiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aCB0byBhIGZpbGUgdG8gc2F2ZSB0aGlzIENvbnRleHQgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29uZmlnRmlsZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSAiY29ycmVjdGx5IGNvbmZpZ3VyZWQiIGZsYWcgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY29uZmlndXJlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VjdXJpdHkgY29uc3RyYWludHMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU2VjdXJpdHlDb25zdHJhaW50IGNvbnN0cmFpbnRzW10gPSBuZXcgU2VjdXJpdHlDb25zdHJhaW50WzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgU2VydmxldENvbnRleHQgaW1wbGVtZW50YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IEFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQ29tcGlsZXIgY2xhc3NwYXRoIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb21waWxlckNsYXNzcGF0aCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFNob3VsZCB3ZSBhdHRlbXB0IHRvIHVzZSBjb29raWVzIGZvciBzZXNzaW9uIGlkIGNvbW11bmljYXRpb24/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvb2tpZXMgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgd2UgYWxsb3cgdGhlIDxjb2RlPlNlcnZsZXRDb250ZXh0LmdldENvbnRleHQoKTwvY29kZT4gbWV0aG9kCisgICAgICogdG8gYWNjZXNzIHRoZSBjb250ZXh0IG9mIG90aGVyIHdlYiBhcHBsaWNhdGlvbnMgaW4gdGhpcyBzZXJ2ZXI/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNyb3NzQ29udGV4dCA9IGZhbHNlOworCisgICAgCisgICAgLyoqCisgICAgICogRW5jb2RlZCBwYXRoLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGVuY29kZWRQYXRoID0gbnVsbDsKKyAgICAKKworICAgIC8qKgorICAgICAqIFRoZSAiZm9sbG93IHN0YW5kYXJkIGRlbGVnYXRpb24gbW9kZWwiIGZsYWcgdGhhdCB3aWxsIGJlIHVzZWQgdG8KKyAgICAgKiBjb25maWd1cmUgb3VyIENsYXNzTG9hZGVyLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkZWxlZ2F0ZSA9IGZhbHNlOworCisKKyAgICAgLyoqCisgICAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkaXNwbGF5TmFtZSA9IG51bGw7CisKKworICAgIC8qKiAKKyAgICAgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBjb250ZXh0IHhtbCBsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0Q29udGV4dFhtbDsKKworCisgICAgLyoqIAorICAgICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHdlYiB4bWwgbG9jYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFdlYlhtbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGRpc3RyaWJ1dGFibGUgZmxhZyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRpc3RyaWJ1dGFibGUgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIGRvY3VtZW50IHJvb3QgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRvY0Jhc2UgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgb3JpZ2luYWwgZG9jdW1lbnQgcm9vdCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgb3JpZ2luYWxEb2NCYXNlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBleGNlcHRpb24gcGFnZXMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLCBrZXllZCBieSBmdWxseSBxdWFsaWZpZWQKKyAgICAgKiBjbGFzcyBuYW1lIG9mIHRoZSBKYXZhIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgZXhjZXB0aW9uUGFnZXMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGZpbHRlciBjb25maWd1cmF0aW9ucyAoYW5kIGFzc29jaWF0ZWQgZmlsdGVyIGluc3RhbmNlcykgd2UKKyAgICAgKiBoYXZlIGluaXRpYWxpemVkLCBrZXllZCBieSBmaWx0ZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgZmlsdGVyQ29uZmlncyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgZmlsdGVyIGRlZmluaXRpb25zIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBrZXllZCBieQorICAgICAqIGZpbHRlciBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBmaWx0ZXJEZWZzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBmaWx0ZXIgbWFwcGluZ3MgZm9yIHRoaXMgYXBwbGljYXRpb24sIGluIHRoZSBvcmRlcgorICAgICAqIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWx0ZXJNYXAgZmlsdGVyTWFwc1tdID0gbmV3IEZpbHRlck1hcFswXTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBjbGFzc25hbWVzIG9mIEluc3RhbmNlTGlzdGVuZXJzIHRoYXQgd2lsbCBiZSBhZGRlZAorICAgICAqIHRvIGVhY2ggbmV3bHkgY3JlYXRlZCBXcmFwcGVyIGJ5IDxjb2RlPmNyZWF0ZVdyYXBwZXIoKTwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaW5zdGFuY2VMaXN0ZW5lcnNbXSA9IG5ldyBTdHJpbmdbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBsb2dpbiBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgTG9naW5Db25maWcgbG9naW5Db25maWcgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWFwcGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmh0dHAubWFwcGVyLk1hcHBlciBtYXBwZXIgPSAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuaHR0cC5tYXBwZXIuTWFwcGVyKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1pbmcgY29udGV4dCBsaXN0ZW5lciBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgTmFtaW5nQ29udGV4dExpc3RlbmVyIG5hbWluZ0NvbnRleHRMaXN0ZW5lciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1pbmcgcmVzb3VyY2VzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIE5hbWluZ1Jlc291cmNlcyBuYW1pbmdSZXNvdXJjZXMgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWVzc2FnZSBkZXN0aW5hdGlvbnMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBtZXNzYWdlRGVzdGluYXRpb25zID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIE1JTUUgbWFwcGluZ3MgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLCBrZXllZCBieSBleHRlbnNpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIG1pbWVNYXBwaW5ncyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgICAvKioKKyAgICAgICogU3BlY2lhbCBjYXNlOiBlcnJvciBwYWdlIGZvciBzdGF0dXMgMjAwLgorICAgICAgKi8KKyAgICAgcHJpdmF0ZSBFcnJvclBhZ2Ugb2tFcnJvclBhZ2UgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwKKyAgICAgKiBrZXllZCBieSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBwYXVzZSBmbGFnICh3aGlsZSByZWxvYWRpbmcgb2NjdXJzKQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwYXVzZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBEVEQgZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudAorICAgICAqIGRlc2NyaXB0b3IgdmVyc2lvbiB3ZSBhcmUgY3VycmVudGx5IHBhcnNpbmcuICBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydAorICAgICAqIHJlbGF4ZWQgdmFsaWRhdGlvbiBydWxlcyB3aGVuIHByb2Nlc3NpbmcgdmVyc2lvbiAyLjIgd2ViLnhtbCBmaWxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwdWJsaWNJZCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZWxvYWRhYmxlIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiByZWxvYWRhYmxlID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFVucGFjayBXQVIgcHJvcGVydHkuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHVucGFja1dBUiA9IHRydWU7CisKKworICAgIC8qKgorICAgICAqIFRoZSBEZWZhdWx0Q29udGV4dCBvdmVycmlkZSBmbGFnIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gb3ZlcnJpZGUgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHByaXZpbGVnZWQgZmxhZyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHByaXZpbGVnZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHRoZSBuZXh0IGNhbGwgdG8gPGNvZGU+YWRkV2VsY29tZUZpbGUoKTwvY29kZT4gY2F1c2UgcmVwbGFjZW1lbnQKKyAgICAgKiBvZiBhbnkgZXhpc3Rpbmcgd2VsY29tZSBmaWxlcz8gIFRoaXMgd2lsbCBiZSBzZXQgYmVmb3JlIHByb2Nlc3NpbmcgdGhlCisgICAgICogd2ViIGFwcGxpY2F0aW9uJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBzbyB0aGF0IGFwcGxpY2F0aW9uIHNwZWNpZmllZAorICAgICAqIGNob2ljZXMgPHN0cm9uZz5yZXBsYWNlPC9zdHJvbmc+LCByYXRoZXIgdGhhbiBhcHBlbmQgdG8sIHRob3NlIGRlZmluZWQKKyAgICAgKiBpbiB0aGUgZ2xvYmFsIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlcGxhY2VXZWxjb21lRmlsZXMgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlY3VyaXR5IHJvbGUgbWFwcGluZ3MgZm9yIHRoaXMgYXBwbGljYXRpb24sIGtleWVkIGJ5IHJvbGUKKyAgICAgKiBuYW1lIChhcyB1c2VkIHdpdGhpbiB0aGUgYXBwbGljYXRpb24pLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCByb2xlTWFwcGluZ3MgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VjdXJpdHkgcm9sZXMgZm9yIHRoaXMgYXBwbGljYXRpb24sIGtleWVkIGJ5IHJvbGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzZWN1cml0eVJvbGVzW10gPSBuZXcgU3RyaW5nWzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBtYXBwaW5ncyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIGtleWVkIGJ5CisgICAgICogbWF0Y2hpbmcgcGF0dGVybi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgc2VydmxldE1hcHBpbmdzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlc3Npb24gdGltZW91dCAoaW4gbWludXRlcykgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHNlc3Npb25UaW1lb3V0ID0gMzA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbm90aWZpY2F0aW9uIHNlcXVlbmNlIG51bWJlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgc2VxdWVuY2VOdW1iZXIgPSAwOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBzdGF0dXMgY29kZSBlcnJvciBwYWdlcyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIGtleWVkIGJ5CisgICAgICogSFRUUCBzdGF0dXMgY29kZSAoYXMgYW4gSW50ZWdlcikuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIHN0YXR1c1BhZ2VzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IGZsYWcgdG8gdHJ1ZSB0byBjYXVzZSB0aGUgc3lzdGVtLm91dCBhbmQgc3lzdGVtLmVyciB0byBiZSByZWRpcmVjdGVkCisgICAgICogdG8gdGhlIGxvZ2dlciB3aGVuIGV4ZWN1dGluZyBhIHNlcnZsZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN3YWxsb3dPdXRwdXQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIEpTUCB0YWcgbGlicmFyaWVzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwga2V5ZWQgYnkgVVJJCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIHRhZ2xpYnMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBBbW91bnQgb2YgbXMgdGhhdCB0aGUgY29udGFpbmVyIHdpbGwgd2FpdCBmb3Igc2VydmxldHMgdG8gdW5sb2FkLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyB1bmxvYWREZWxheSA9IDIwMDA7CisKKworICAgIC8qKgorICAgICAqIFRoZSB3YXRjaGVkIHJlc291cmNlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB3YXRjaGVkUmVzb3VyY2VzW10gPSBuZXcgU3RyaW5nWzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgd2VsY29tZSBmaWxlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB3ZWxjb21lRmlsZXNbXSA9IG5ldyBTdHJpbmdbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgY2xhc3NuYW1lcyBvZiBMaWZlY3ljbGVMaXN0ZW5lcnMgdGhhdCB3aWxsIGJlIGFkZGVkCisgICAgICogdG8gZWFjaCBuZXdseSBjcmVhdGVkIFdyYXBwZXIgYnkgPGNvZGU+Y3JlYXRlV3JhcHBlcigpPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB3cmFwcGVyTGlmZWN5Y2xlc1tdID0gbmV3IFN0cmluZ1swXTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBjbGFzc25hbWVzIG9mIENvbnRhaW5lckxpc3RlbmVycyB0aGF0IHdpbGwgYmUgYWRkZWQKKyAgICAgKiB0byBlYWNoIG5ld2x5IGNyZWF0ZWQgV3JhcHBlciBieSA8Y29kZT5jcmVhdGVXcmFwcGVyKCk8L2NvZGU+LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHdyYXBwZXJMaXN0ZW5lcnNbXSA9IG5ldyBTdHJpbmdbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBwYXRobmFtZSB0byB0aGUgd29yayBkaXJlY3RvcnkgZm9yIHRoaXMgY29udGV4dCAocmVsYXRpdmUgdG8KKyAgICAgKiB0aGUgc2VydmVyJ3MgaG9tZSBpZiBub3QgYWJzb2x1dGUpLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHdvcmtEaXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIFdyYXBwZXIgY2xhc3MgaW1wbGVtZW50YXRpb24gd2UgdXNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHdyYXBwZXJDbGFzc05hbWUgPSBTdGFuZGFyZFdyYXBwZXIuY2xhc3MuZ2V0TmFtZSgpOworICAgIHByaXZhdGUgQ2xhc3Mgd3JhcHBlckNsYXNzID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogSk5ESSB1c2UgZmxhZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlTmFtaW5nID0gdHJ1ZTsKKworCisgICAgLyoqCisgICAgICogRmlsZXN5c3RlbSBiYXNlZCBmbGFnLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBmaWxlc3lzdGVtQmFzZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBuYW1pbmcgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1pbmdDb250ZXh0TmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIENhY2hpbmcgYWxsb3dlZCBmbGFnLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjYWNoaW5nQWxsb3dlZCA9IHRydWU7CisKKworICAgIC8qKgorICAgICAqIENhc2Ugc2Vuc2l0aXZpdHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSA9IHRydWU7CisKKworICAgIC8qKgorICAgICAqIEFsbG93IGxpbmtpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dMaW5raW5nID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIENhY2hlIG1heCBzaXplIGluIEtCLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY2FjaGVNYXhTaXplID0gMTAyNDA7IC8vIDEwIE1CCisKKworICAgIC8qKgorICAgICAqIENhY2hlIFRUTCBpbiBtcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGNhY2hlVFRMID0gNTAwMDsKKworCisgICAgcHJpdmF0ZSBib29sZWFuIGxhenk9dHJ1ZTsKKworICAgIC8qKgorICAgICAqIE5vbiBwcm94aWVkIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBEaXJDb250ZXh0IHdlYmFwcFJlc291cmNlcyA9IG51bGw7CisKKyAgICBwcml2YXRlIGxvbmcgc3RhcnR1cFRpbWU7CisgICAgcHJpdmF0ZSBsb25nIHN0YXJ0VGltZTsKKyAgICBwcml2YXRlIGxvbmcgdGxkU2NhblRpbWU7CisKKyAgICAvKiogCisgICAgICogTmFtZSBvZiB0aGUgZW5naW5lLiBJZiBudWxsLCB0aGUgZG9tYWluIGlzIHVzZWQuCisgICAgICovIAorICAgIHByaXZhdGUgU3RyaW5nIGVuZ2luZU5hbWUgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIGoyRUVBcHBsaWNhdGlvbj0ibm9uZSI7CisgICAgcHJpdmF0ZSBTdHJpbmcgajJFRVNlcnZlcj0ibm9uZSI7CisKKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSB2YWx1ZSB1c2VkIHRvIHR1cm4gb24vb2ZmIFhNTCB2YWxpZGF0aW9uCisgICAgICovCisgICAgIHByaXZhdGUgYm9vbGVhbiB3ZWJYbWxWYWxpZGF0aW9uID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSB2YWx1ZSB1c2VkIHRvIHR1cm4gb24vb2ZmIFhNTCBuYW1lc3BhY2UgdmFsaWRhdGlvbgorICAgICAqLworICAgICBwcml2YXRlIGJvb2xlYW4gd2ViWG1sTmFtZXNwYWNlQXdhcmUgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSB2YWx1ZSB1c2VkIHRvIHR1cm4gb24vb2ZmIFRMRCBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NUbGRzID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSB2YWx1ZSB1c2VkIHRvIHR1cm4gb24vb2ZmIFhNTCB2YWxpZGF0aW9uCisgICAgICovCisgICAgIHByaXZhdGUgYm9vbGVhbiB0bGRWYWxpZGF0aW9uID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSB2YWx1ZSB1c2VkIHRvIHR1cm4gb24vb2ZmIFRMRCBYTUwgbmFtZXNwYWNlIHZhbGlkYXRpb24KKyAgICAgKi8KKyAgICAgcHJpdmF0ZSBib29sZWFuIHRsZE5hbWVzcGFjZUF3YXJlID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFNob3VsZCB3ZSBzYXZlIHRoZSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzYXZlQ29uZmlnID0gdHJ1ZTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29udGV4dCBQcm9wZXJ0aWVzCisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RlZFBhdGgoKSB7CisgICAgICAgIHJldHVybiBlbmNvZGVkUGF0aDsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoIFN0cmluZyBuYW1lICkgeworICAgICAgICBzdXBlci5zZXROYW1lKCBuYW1lICk7CisgICAgICAgIGVuY29kZWRQYXRoID0gdXJsRW5jb2Rlci5lbmNvZGUobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJcyBjYWNoaW5nIGFsbG93ZWQgPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2FjaGluZ0FsbG93ZWQoKSB7CisgICAgICAgIHJldHVybiBjYWNoaW5nQWxsb3dlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCBjYWNoaW5nIGFsbG93ZWQgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWNoaW5nQWxsb3dlZChib29sZWFuIGNhY2hpbmdBbGxvd2VkKSB7CisgICAgICAgIHRoaXMuY2FjaGluZ0FsbG93ZWQgPSBjYWNoaW5nQWxsb3dlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCBjYXNlIHNlbnNpdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhc2VTZW5zaXRpdmUoYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7CisgICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJcyBjYXNlIHNlbnNpdGl2ZSA/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKCkgeworICAgICAgICByZXR1cm4gY2FzZVNlbnNpdGl2ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCBhbGxvdyBsaW5raW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFsbG93TGlua2luZyhib29sZWFuIGFsbG93TGlua2luZykgeworICAgICAgICB0aGlzLmFsbG93TGlua2luZyA9IGFsbG93TGlua2luZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElzIGxpbmtpbmcgYWxsb3dlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbG93TGlua2luZygpIHsKKyAgICAgICAgcmV0dXJuIGFsbG93TGlua2luZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCBjYWNoZSBUVEwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FjaGVUVEwoaW50IGNhY2hlVFRMKSB7CisgICAgICAgIHRoaXMuY2FjaGVUVEwgPSBjYWNoZVRUTDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCBjYWNoZSBUVEwuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDYWNoZVRUTCgpIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlVFRMOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIEtCLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2FjaGVNYXhTaXplKCkgeworICAgICAgICByZXR1cm4gY2FjaGVNYXhTaXplOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIEtCLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhY2hlTWF4U2l6ZShpbnQgY2FjaGVNYXhTaXplKSB7CisgICAgICAgIHRoaXMuY2FjaGVNYXhTaXplID0gY2FjaGVNYXhTaXplOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSAiZm9sbG93IHN0YW5kYXJkIGRlbGVnYXRpb24gbW9kZWwiIGZsYWcgdXNlZCB0byBjb25maWd1cmUKKyAgICAgKiBvdXIgQ2xhc3NMb2FkZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGVsZWdhdGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmRlbGVnYXRlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSAiZm9sbG93IHN0YW5kYXJkIGRlbGVnYXRpb24gbW9kZWwiIGZsYWcgdXNlZCB0byBjb25maWd1cmUKKyAgICAgKiBvdXIgQ2xhc3NMb2FkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVsZWdhdGUgVGhlIG5ldyBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVsZWdhdGUoYm9vbGVhbiBkZWxlZ2F0ZSkgeworCisgICAgICAgIGJvb2xlYW4gb2xkRGVsZWdhdGUgPSB0aGlzLmRlbGVnYXRlOworICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJkZWxlZ2F0ZSIsIG5ldyBCb29sZWFuKG9sZERlbGVnYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odGhpcy5kZWxlZ2F0ZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGludGVybmFsIG5hbWluZyBzdXBwb3J0IGlzIHVzZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNVc2VOYW1pbmcoKSB7CisKKyAgICAgICAgcmV0dXJuICh1c2VOYW1pbmcpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIG5hbWluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VOYW1pbmcoYm9vbGVhbiB1c2VOYW1pbmcpIHsKKyAgICAgICAgdGhpcy51c2VOYW1pbmcgPSB1c2VOYW1pbmc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250ZXh0IGFyZQorICAgICAqIGZpbGVzeXN0ZW0gYmFzZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGaWxlc3lzdGVtQmFzZWQoKSB7CisKKyAgICAgICAgcmV0dXJuIChmaWxlc3lzdGVtQmFzZWQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBpbml0aWFsaXplZCBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lciBvYmplY3RzLAorICAgICAqIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgc3BlY2lmaWVkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudAorICAgICAqIGRlc2NyaXB0b3IsIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJlZm9yZQorICAgICAqICB0aGlzIGFwcGxpY2F0aW9uIGhhcyBzdGFydGVkLCBvciBhZnRlciBpdCBoYXMgYmVlbiBzdG9wcGVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdFtdIGdldEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcnMoKSB7CisgICAgICAgIHJldHVybiAoYXBwbGljYXRpb25FdmVudExpc3RlbmVyc09iamVjdHMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNldCBvZiBpbml0aWFsaXplZCBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lciBvYmplY3RzLAorICAgICAqIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgc3BlY2lmaWVkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudAorICAgICAqIGRlc2NyaXB0b3IsIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVycyBUaGUgc2V0IG9mIGluc3RhbnRpYXRlZCBsaXN0ZW5lciBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcnMoT2JqZWN0IGxpc3RlbmVyc1tdKSB7CisgICAgICAgIGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcnNPYmplY3RzID0gbGlzdGVuZXJzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgaW5pdGlhbGl6ZWQgYXBwbGljYXRpb24gbGlmZWN5Y2xlIGxpc3RlbmVyIG9iamVjdHMsCisgICAgICogaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzcGVjaWZpZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CisgICAgICogZGVzY3JpcHRvciwgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlCisgICAgICogIHRoaXMgYXBwbGljYXRpb24gaGFzIHN0YXJ0ZWQsIG9yIGFmdGVyIGl0IGhhcyBiZWVuIHN0b3BwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0QXBwbGljYXRpb25MaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisgICAgICAgIHJldHVybiAoYXBwbGljYXRpb25MaWZlY3ljbGVMaXN0ZW5lcnNPYmplY3RzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzZXQgb2YgaW5pdGlhbGl6ZWQgYXBwbGljYXRpb24gbGlmZWN5Y2xlIGxpc3RlbmVyIG9iamVjdHMsCisgICAgICogaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzcGVjaWZpZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CisgICAgICogZGVzY3JpcHRvciwgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXJzIFRoZSBzZXQgb2YgaW5zdGFudGlhdGVkIGxpc3RlbmVyIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb25MaWZlY3ljbGVMaXN0ZW5lcnMoT2JqZWN0IGxpc3RlbmVyc1tdKSB7CisgICAgICAgIGFwcGxpY2F0aW9uTGlmZWN5Y2xlTGlzdGVuZXJzT2JqZWN0cyA9IGxpc3RlbmVyczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYW50aUpBUkxvY2tpbmcgZmxhZyBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEFudGlKQVJMb2NraW5nKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5hbnRpSkFSTG9ja2luZyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYW50aVJlc291cmNlTG9ja2luZyBmbGFnIGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QW50aVJlc291cmNlTG9ja2luZygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuYW50aVJlc291cmNlTG9ja2luZyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYW50aUpBUkxvY2tpbmcgZmVhdHVyZSBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGFudGlKQVJMb2NraW5nIFRoZSBuZXcgZmxhZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFudGlKQVJMb2NraW5nKGJvb2xlYW4gYW50aUpBUkxvY2tpbmcpIHsKKworICAgICAgICBib29sZWFuIG9sZEFudGlKQVJMb2NraW5nID0gdGhpcy5hbnRpSkFSTG9ja2luZzsKKyAgICAgICAgdGhpcy5hbnRpSkFSTG9ja2luZyA9IGFudGlKQVJMb2NraW5nOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiYW50aUpBUkxvY2tpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbihvbGRBbnRpSkFSTG9ja2luZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKHRoaXMuYW50aUpBUkxvY2tpbmcpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhbnRpUmVzb3VyY2VMb2NraW5nIGZlYXR1cmUgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbnRpUmVzb3VyY2VMb2NraW5nIFRoZSBuZXcgZmxhZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFudGlSZXNvdXJjZUxvY2tpbmcoYm9vbGVhbiBhbnRpUmVzb3VyY2VMb2NraW5nKSB7CisKKyAgICAgICAgYm9vbGVhbiBvbGRBbnRpUmVzb3VyY2VMb2NraW5nID0gdGhpcy5hbnRpUmVzb3VyY2VMb2NraW5nOworICAgICAgICB0aGlzLmFudGlSZXNvdXJjZUxvY2tpbmcgPSBhbnRpUmVzb3VyY2VMb2NraW5nOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiYW50aVJlc291cmNlTG9ja2luZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKG9sZEFudGlSZXNvdXJjZUxvY2tpbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbih0aGlzLmFudGlSZXNvdXJjZUxvY2tpbmcpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhcHBsaWNhdGlvbiBhdmFpbGFibGUgZmxhZyBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEF2YWlsYWJsZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuYXZhaWxhYmxlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhcHBsaWNhdGlvbiBhdmFpbGFibGUgZmxhZyBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGF2YWlsYWJsZSBUaGUgbmV3IGFwcGxpY2F0aW9uIGF2YWlsYWJsZSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlKGJvb2xlYW4gYXZhaWxhYmxlKSB7CisKKyAgICAgICAgYm9vbGVhbiBvbGRBdmFpbGFibGUgPSB0aGlzLmF2YWlsYWJsZTsKKyAgICAgICAgdGhpcy5hdmFpbGFibGUgPSBhdmFpbGFibGU7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJhdmFpbGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbihvbGRBdmFpbGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbih0aGlzLmF2YWlsYWJsZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExvY2FsZSB0byBjaGFyYWN0ZXIgc2V0IG1hcHBlciBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBDaGFyc2V0TWFwcGVyIGdldENoYXJzZXRNYXBwZXIoKSB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbWFwcGVyIHRoZSBmaXJzdCB0aW1lIGl0IGlzIHJlcXVlc3RlZAorICAgICAgICBpZiAodGhpcy5jaGFyc2V0TWFwcGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNoYXJzZXRNYXBwZXJDbGFzcyk7CisgICAgICAgICAgICAgICAgdGhpcy5jaGFyc2V0TWFwcGVyID0KKyAgICAgICAgICAgICAgICAgIChDaGFyc2V0TWFwcGVyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNoYXJzZXRNYXBwZXIgPSBuZXcgQ2hhcnNldE1hcHBlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmNoYXJzZXRNYXBwZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIExvY2FsZSB0byBjaGFyYWN0ZXIgc2V0IG1hcHBlciBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBlciBUaGUgbmV3IG1hcHBlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENoYXJzZXRNYXBwZXIoQ2hhcnNldE1hcHBlciBtYXBwZXIpIHsKKworICAgICAgICBDaGFyc2V0TWFwcGVyIG9sZENoYXJzZXRNYXBwZXIgPSB0aGlzLmNoYXJzZXRNYXBwZXI7CisgICAgICAgIHRoaXMuY2hhcnNldE1hcHBlciA9IG1hcHBlcjsKKyAgICAgICAgaWYoIG1hcHBlciAhPSBudWxsICkKKyAgICAgICAgICAgIHRoaXMuY2hhcnNldE1hcHBlckNsYXNzPSBtYXBwZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJjaGFyc2V0TWFwcGVyIiwgb2xkQ2hhcnNldE1hcHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFyc2V0TWFwcGVyKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGF0aCB0byBhIGZpbGUgdG8gc2F2ZSB0aGlzIENvbnRleHQgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25maWdGaWxlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jb25maWdGaWxlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXRoIHRvIGEgZmlsZSB0byBzYXZlIHRoaXMgQ29udGV4dCBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWdGaWxlIFRoZSBwYXRoIHRvIGEgZmlsZSB0byBzYXZlIHRoaXMgQ29udGV4dCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdGaWxlKFN0cmluZyBjb25maWdGaWxlKSB7CisKKyAgICAgICAgdGhpcy5jb25maWdGaWxlID0gY29uZmlnRmlsZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgImNvcnJlY3RseSBjb25maWd1cmVkIiBmbGFnIGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q29uZmlndXJlZCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29uZmlndXJlZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgImNvcnJlY3RseSBjb25maWd1cmVkIiBmbGFnIGZvciB0aGlzIENvbnRleHQuICBUaGlzIGNhbiBiZQorICAgICAqIHNldCB0byBmYWxzZSBieSBzdGFydHVwIGxpc3RlbmVycyB0aGF0IGRldGVjdCBhIGZhdGFsIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBlcnJvciB0byBhdm9pZCB0aGUgYXBwbGljYXRpb24gZnJvbSBiZWluZyBtYWRlIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWd1cmVkIFRoZSBuZXcgY29ycmVjdGx5IGNvbmZpZ3VyZWQgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyZWQoYm9vbGVhbiBjb25maWd1cmVkKSB7CisKKyAgICAgICAgYm9vbGVhbiBvbGRDb25maWd1cmVkID0gdGhpcy5jb25maWd1cmVkOworICAgICAgICB0aGlzLmNvbmZpZ3VyZWQgPSBjb25maWd1cmVkOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiY29uZmlndXJlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKG9sZENvbmZpZ3VyZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbih0aGlzLmNvbmZpZ3VyZWQpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSAidXNlIGNvb2tpZXMgZm9yIHNlc3Npb24gaWRzIiBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldENvb2tpZXMoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmNvb2tpZXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlICJ1c2UgY29va2llcyBmb3Igc2Vzc2lvbiBpZHMiIGZsYWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29va2llcyBUaGUgbmV3IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb29raWVzKGJvb2xlYW4gY29va2llcykgeworCisgICAgICAgIGJvb2xlYW4gb2xkQ29va2llcyA9IHRoaXMuY29va2llczsKKyAgICAgICAgdGhpcy5jb29raWVzID0gY29va2llczsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImNvb2tpZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbihvbGRDb29raWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odGhpcy5jb29raWVzKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgImFsbG93IGNyb3NzaW5nIHNlcnZsZXQgY29udGV4dHMiIGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q3Jvc3NDb250ZXh0KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jcm9zc0NvbnRleHQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlICJhbGxvdyBjcm9zc2luZyBzZXJ2bGV0IGNvbnRleHRzIiBmbGFnLgorICAgICAqCisgICAgICogQHBhcmFtIGNyb3NzQ29udGV4dCBUaGUgbmV3IGNyb3NzIGNvbnRleHRzIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDcm9zc0NvbnRleHQoYm9vbGVhbiBjcm9zc0NvbnRleHQpIHsKKworICAgICAgICBib29sZWFuIG9sZENyb3NzQ29udGV4dCA9IHRoaXMuY3Jvc3NDb250ZXh0OworICAgICAgICB0aGlzLmNyb3NzQ29udGV4dCA9IGNyb3NzQ29udGV4dDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImNyb3NzQ29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKG9sZENyb3NzQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKHRoaXMuY3Jvc3NDb250ZXh0KSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb250ZXh0WG1sKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdENvbnRleHRYbWw7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFNldCB0aGUgbG9jYXRpb24gb2YgdGhlIGRlZmF1bHQgY29udGV4dCB4bWwgdGhhdCB3aWxsIGJlIHVzZWQuCisgICAgICogSWYgbm90IGFic29sdXRlLCBpdCdsbCBiZSBtYWRlIHJlbGF0aXZlIHRvIHRoZSBlbmdpbmUncyBiYXNlIGRpcgorICAgICAqICggd2hpY2ggZGVmYXVsdHMgdG8gY2F0YWxpbmEuYmFzZSBzeXN0ZW0gcHJvcGVydHkgKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWZhdWx0Q29udGV4dFhtbCBUaGUgZGVmYXVsdCB3ZWIgeG1sIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRDb250ZXh0WG1sKFN0cmluZyBkZWZhdWx0Q29udGV4dFhtbCkgeworICAgICAgICB0aGlzLmRlZmF1bHRDb250ZXh0WG1sID0gZGVmYXVsdENvbnRleHRYbWw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0V2ViWG1sKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdFdlYlhtbDsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZGVmYXVsdCB3ZWIgeG1sIHRoYXQgd2lsbCBiZSB1c2VkLgorICAgICAqIElmIG5vdCBhYnNvbHV0ZSwgaXQnbGwgYmUgbWFkZSByZWxhdGl2ZSB0byB0aGUgZW5naW5lJ3MgYmFzZSBkaXIKKyAgICAgKiAoIHdoaWNoIGRlZmF1bHRzIHRvIGNhdGFsaW5hLmJhc2Ugc3lzdGVtIHByb3BlcnR5ICkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFdlYlhtbCBUaGUgZGVmYXVsdCB3ZWIgeG1sIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRXZWJYbWwoU3RyaW5nIGRlZmF1bHRXZWJYbWwpIHsKKyAgICAgICAgdGhpcy5kZWZhdWx0V2ViWG1sID0gZGVmYXVsdFdlYlhtbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIGl0IHRvb2sgdG8gc3RhcnQgdGhpcyBjb250ZXh0LgorICAgICAqCisgICAgICogQHJldHVybiBUaW1lIChpbiBtaWxsaXNlY29uZHMpIGl0IHRvb2sgdG8gc3RhcnQgdGhpcyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFN0YXJ0dXBUaW1lKCkgeworICAgICAgICByZXR1cm4gc3RhcnR1cFRpbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnR1cFRpbWUobG9uZyBzdGFydHVwVGltZSkgeworICAgICAgICB0aGlzLnN0YXJ0dXBUaW1lID0gc3RhcnR1cFRpbWU7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0VGxkU2NhblRpbWUoKSB7CisgICAgICAgIHJldHVybiB0bGRTY2FuVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUbGRTY2FuVGltZShsb25nIHRsZFNjYW5UaW1lKSB7CisgICAgICAgIHRoaXMudGxkU2NhblRpbWUgPSB0bGRTY2FuVGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5kaXNwbGF5TmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWx0ZXJuYXRlIERlcGxveW1lbnQgRGVzY3JpcHRvciBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWx0REROYW1lKCl7CisgICAgICAgIHJldHVybiBhbHRERE5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gYWx0ZXJuYXRlIERlcGxveW1lbnQgRGVzY3JpcHRvciBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFsdERETmFtZShTdHJpbmcgYWx0REROYW1lKSB7CisgICAgICAgIHRoaXMuYWx0REROYW1lID0gYWx0REROYW1lOworICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250ZXh0LnNldEF0dHJpYnV0ZShHbG9iYWxzLkFMVF9ERF9BVFRSLGFsdERETmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29tcGlsZXIgY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcGlsZXJDbGFzc3BhdGgoKXsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyQ2xhc3NwYXRoOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb21waWxlciBjbGFzc3BhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZXJDbGFzc3BhdGgoU3RyaW5nIGNvbXBpbGVyQ2xhc3NwYXRoKSB7CisgICAgICAgIHRoaXMuY29tcGlsZXJDbGFzc3BhdGggPSBjb21waWxlckNsYXNzcGF0aDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlzcGxheSBuYW1lIG9mIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGRpc3BsYXlOYW1lIFRoZSBuZXcgZGlzcGxheSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIGRpc3BsYXlOYW1lKSB7CisKKyAgICAgICAgU3RyaW5nIG9sZERpc3BsYXlOYW1lID0gdGhpcy5kaXNwbGF5TmFtZTsKKyAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiZGlzcGxheU5hbWUiLCBvbGREaXNwbGF5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRpc3RyaWJ1dGFibGUgZmxhZyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGlzdHJpYnV0YWJsZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZGlzdHJpYnV0YWJsZSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpc3RyaWJ1dGFibGUgZmxhZyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlzdHJpYnV0YWJsZSBUaGUgbmV3IGRpc3RyaWJ1dGFibGUgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc3RyaWJ1dGFibGUoYm9vbGVhbiBkaXN0cmlidXRhYmxlKSB7CisgICAgICAgIGJvb2xlYW4gb2xkRGlzdHJpYnV0YWJsZSA9IHRoaXMuZGlzdHJpYnV0YWJsZTsKKyAgICAgICAgdGhpcy5kaXN0cmlidXRhYmxlID0gZGlzdHJpYnV0YWJsZTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImRpc3RyaWJ1dGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbihvbGREaXN0cmlidXRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odGhpcy5kaXN0cmlidXRhYmxlKSk7CisKKyAgICAgICAgLy8gQnVnemlsbGEgMzI4NjYKKyAgICAgICAgaWYoZ2V0TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9wYWdhdGluZyBkaXN0cmlidXRhYmxlPSIgKyBkaXN0cmlidXRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0byBtYW5hZ2VyIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZXRNYW5hZ2VyKCkuc2V0RGlzdHJpYnV0YWJsZShkaXN0cmlidXRhYmxlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkb2N1bWVudCByb290IGZvciB0aGlzIENvbnRleHQuICBUaGlzIGNhbiBiZSBhbiBhYnNvbHV0ZQorICAgICAqIHBhdGhuYW1lLCBhIHJlbGF0aXZlIHBhdGhuYW1lLCBvciBhIFVSTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERvY0Jhc2UoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmRvY0Jhc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRvY3VtZW50IHJvb3QgZm9yIHRoaXMgQ29udGV4dC4gIFRoaXMgY2FuIGJlIGFuIGFic29sdXRlCisgICAgICogcGF0aG5hbWUsIGEgcmVsYXRpdmUgcGF0aG5hbWUsIG9yIGEgVVJMLgorICAgICAqCisgICAgICogQHBhcmFtIGRvY0Jhc2UgVGhlIG5ldyBkb2N1bWVudCByb290CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9jQmFzZShTdHJpbmcgZG9jQmFzZSkgeworCisgICAgICAgIHRoaXMuZG9jQmFzZSA9IGRvY0Jhc2U7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9yaWdpbmFsIGRvY3VtZW50IHJvb3QgZm9yIHRoaXMgQ29udGV4dC4gIFRoaXMgY2FuIGJlIGFuIGFic29sdXRlCisgICAgICogcGF0aG5hbWUsIGEgcmVsYXRpdmUgcGF0aG5hbWUsIG9yIGEgVVJMLgorICAgICAqIElzIG9ubHkgc2V0IGFzIGRlcGxveW1lbnQgaGFzIGNoYW5nZSBkb2NSb290IQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3JpZ2luYWxEb2NCYXNlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5vcmlnaW5hbERvY0Jhc2UpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvcmlnaW5hbCBkb2N1bWVudCByb290IGZvciB0aGlzIENvbnRleHQuICBUaGlzIGNhbiBiZSBhbiBhYnNvbHV0ZQorICAgICAqIHBhdGhuYW1lLCBhIHJlbGF0aXZlIHBhdGhuYW1lLCBvciBhIFVSTC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb2NCYXNlIFRoZSBvcmdpbmFsIGRvY3VtZW50IHJvb3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcmlnaW5hbERvY0Jhc2UoU3RyaW5nIGRvY0Jhc2UpIHsKKworICAgICAgICB0aGlzLm9yaWdpbmFsRG9jQmFzZSA9IGRvY0Jhc2U7CisgICAgfQorICAgIAorICAgIC8vIGV4cGVyaW1lbnRhbAorICAgIHB1YmxpYyBib29sZWFuIGlzTGF6eSgpIHsKKyAgICAgICAgcmV0dXJuIGxhenk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGF6eShib29sZWFuIGxhenkpIHsKKyAgICAgICAgdGhpcy5sYXp5ID0gbGF6eTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIENvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5naW5lTmFtZSgpIHsKKyAgICAgICAgaWYoIGVuZ2luZU5hbWUgIT0gbnVsbCApIHJldHVybiBlbmdpbmVOYW1lOworICAgICAgICByZXR1cm4gZG9tYWluOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVuZ2luZU5hbWUoU3RyaW5nIGVuZ2luZU5hbWUpIHsKKyAgICAgICAgdGhpcy5lbmdpbmVOYW1lID0gZW5naW5lTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEoyRUVBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGoyRUVBcHBsaWNhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRKMkVFQXBwbGljYXRpb24oU3RyaW5nIGoyRUVBcHBsaWNhdGlvbikgeworICAgICAgICB0aGlzLmoyRUVBcHBsaWNhdGlvbiA9IGoyRUVBcHBsaWNhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEoyRUVTZXJ2ZXIoKSB7CisgICAgICAgIHJldHVybiBqMkVFU2VydmVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEoyRUVTZXJ2ZXIoU3RyaW5nIGoyRUVTZXJ2ZXIpIHsKKyAgICAgICAgdGhpcy5qMkVFU2VydmVyID0gajJFRVNlcnZlcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgTG9hZGVyIHdpdGggd2hpY2ggdGhpcyBDb250ZXh0IGlzIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9hZGVyIFRoZSBuZXdseSBhc3NvY2lhdGVkIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRMb2FkZXIoTG9hZGVyIGxvYWRlcikgeworCisgICAgICAgIHN1cGVyLnNldExvYWRlcihsb2FkZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvZ2luIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIExvZ2luQ29uZmlnIGdldExvZ2luQ29uZmlnKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5sb2dpbkNvbmZpZyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9naW4gY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgVGhlIG5ldyBsb2dpbiBjb25maWd1cmF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9naW5Db25maWcoTG9naW5Db25maWcgY29uZmlnKSB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGluY29taW5nIHByb3BlcnR5IHZhbHVlCisgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcucmVxdWlyZWQiKSk7CisgICAgICAgIFN0cmluZyBsb2dpblBhZ2UgPSBjb25maWcuZ2V0TG9naW5QYWdlKCk7CisgICAgICAgIGlmICgobG9naW5QYWdlICE9IG51bGwpICYmICFsb2dpblBhZ2Uuc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICBpZiAoaXNTZXJ2bGV0MjIoKSkgeworICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcubG9naW5XYXJuaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2luUGFnZSkpOworICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRMb2dpblBhZ2UoIi8iICsgbG9naW5QYWdlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcubG9naW5QYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpblBhZ2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZXJyb3JQYWdlID0gY29uZmlnLmdldEVycm9yUGFnZSgpOworICAgICAgICBpZiAoKGVycm9yUGFnZSAhPSBudWxsKSAmJiAhZXJyb3JQYWdlLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgaWYgKGlzU2VydmxldDIyKCkpIHsKKyAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmVycm9yV2FybmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclBhZ2UpKTsKKyAgICAgICAgICAgICAgICBjb25maWcuc2V0RXJyb3JQYWdlKCIvIiArIGVycm9yUGFnZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmVycm9yUGFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JQYWdlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZXNzIHRoZSBwcm9wZXJ0eSBzZXR0aW5nIGNoYW5nZQorICAgICAgICBMb2dpbkNvbmZpZyBvbGRMb2dpbkNvbmZpZyA9IHRoaXMubG9naW5Db25maWc7CisgICAgICAgIHRoaXMubG9naW5Db25maWcgPSBjb25maWc7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJsb2dpbkNvbmZpZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZExvZ2luQ29uZmlnLCB0aGlzLmxvZ2luQ29uZmlnKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtYXBwZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmh0dHAubWFwcGVyLk1hcHBlciBnZXRNYXBwZXIoKSB7CisgICAgICAgIHJldHVybiAobWFwcGVyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtaW5nIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIE5hbWluZ1Jlc291cmNlcyBnZXROYW1pbmdSZXNvdXJjZXMoKSB7CisKKyAgICAgICAgaWYgKG5hbWluZ1Jlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXROYW1pbmdSZXNvdXJjZXMobmV3IE5hbWluZ1Jlc291cmNlcygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG5hbWluZ1Jlc291cmNlcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtaW5nIHJlc291cmNlcyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtaW5nUmVzb3VyY2VzIFRoZSBuZXcgbmFtaW5nIHJlc291cmNlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWluZ1Jlc291cmNlcyhOYW1pbmdSZXNvdXJjZXMgbmFtaW5nUmVzb3VyY2VzKSB7CisKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgcHJvcGVydHkgc2V0dGluZyBjaGFuZ2UKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIG9sZE5hbWluZ1Jlc291cmNlcyA9IHRoaXMubmFtaW5nUmVzb3VyY2VzOworICAgICAgICB0aGlzLm5hbWluZ1Jlc291cmNlcyA9IG5hbWluZ1Jlc291cmNlczsKKyAgICAgICAgbmFtaW5nUmVzb3VyY2VzLnNldENvbnRhaW5lcih0aGlzKTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm5hbWluZ1Jlc291cmNlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZE5hbWluZ1Jlc291cmNlcywgdGhpcy5uYW1pbmdSZXNvdXJjZXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhcmVudCBjbGFzcyBsb2FkZXIgKGlmIGFueSkgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqIFRoaXMgY2FsbCBpcyBtZWFuaW5nZnVsIG9ubHkgPHN0cm9uZz5hZnRlcjwvc3Ryb25nPiBhIExvYWRlciBoYXMKKyAgICAgKiBiZWVuIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIENsYXNzTG9hZGVyIGdldFBhcmVudENsYXNzTG9hZGVyKCkgeworICAgICAgICBpZiAocGFyZW50Q2xhc3NMb2FkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAocGFyZW50Q2xhc3NMb2FkZXIpOworICAgICAgICBpZiAoZ2V0UHJpdmlsZWdlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIH0gZWxzZSBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAocGFyZW50LmdldFBhcmVudENsYXNzTG9hZGVyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbnRleHQgcGF0aCBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKworICAgICAgICByZXR1cm4gKGdldE5hbWUoKSk7CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbnRleHQgcGF0aCBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqIDxwPgorICAgICAqIDxiPklNUExFTUVOVEFUSU9OIE5PVEU8L2I+OiAgVGhlIGNvbnRleHQgcGF0aCBpcyB1c2VkIGFzIHRoZSAibmFtZSIgb2YKKyAgICAgKiBhIENvbnRleHQsIGJlY2F1c2UgaXQgbXVzdCBiZSB1bmlxdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBUaGUgbmV3IGNvbnRleHQgcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgLy8gWFhYIFVzZSBob3N0IGluIG5hbWUKKyAgICAgICAgc2V0TmFtZShSZXF1ZXN0VXRpbC5VUkxEZWNvZGUocGF0aCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgRFREIHRoYXQgaXMKKyAgICAgKiBjdXJyZW50bHkgYmVpbmcgcGFyc2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnB1YmxpY0lkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIERURCB0aGF0IGlzCisgICAgICogY3VycmVudGx5IGJlaW5nIHBhcnNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwdWJsaWNJZCBUaGUgcHVibGljIGlkZW50aWZpZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yIHB1YmxpYyBJRCB0byAnIiArCisgICAgICAgICAgICAgICAgcHVibGljSWQgKyAiJyIpOworCisgICAgICAgIFN0cmluZyBvbGRQdWJsaWNJZCA9IHRoaXMucHVibGljSWQ7CisgICAgICAgIHRoaXMucHVibGljSWQgPSBwdWJsaWNJZDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInB1YmxpY0lkIiwgb2xkUHVibGljSWQsIHB1YmxpY0lkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZWxvYWRhYmxlIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJlbG9hZGFibGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlbG9hZGFibGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIERlZmF1bHRDb250ZXh0IG92ZXJyaWRlIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE92ZXJyaWRlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5vdmVycmlkZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJpdmlsZWdlZCBmbGFnIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRQcml2aWxlZ2VkKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5wcml2aWxlZ2VkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcml2aWxlZ2VkIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHByaXZpbGVnZWQgVGhlIG5ldyBwcml2aWxlZ2VkIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcml2aWxlZ2VkKGJvb2xlYW4gcHJpdmlsZWdlZCkgeworCisgICAgICAgIGJvb2xlYW4gb2xkUHJpdmlsZWdlZCA9IHRoaXMucHJpdmlsZWdlZDsKKyAgICAgICAgdGhpcy5wcml2aWxlZ2VkID0gcHJpdmlsZWdlZDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInByaXZpbGVnZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbihvbGRQcml2aWxlZ2VkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odGhpcy5wcml2aWxlZ2VkKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVsb2FkYWJsZSBmbGFnIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWxvYWRhYmxlIFRoZSBuZXcgcmVsb2FkYWJsZSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVsb2FkYWJsZShib29sZWFuIHJlbG9hZGFibGUpIHsKKworICAgICAgICBib29sZWFuIG9sZFJlbG9hZGFibGUgPSB0aGlzLnJlbG9hZGFibGU7CisgICAgICAgIHRoaXMucmVsb2FkYWJsZSA9IHJlbG9hZGFibGU7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJyZWxvYWRhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4ob2xkUmVsb2FkYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKHRoaXMucmVsb2FkYWJsZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIERlZmF1bHRDb250ZXh0IG92ZXJyaWRlIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG92ZXJyaWRlIFRoZSBuZXcgb3ZlcnJpZGUgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE92ZXJyaWRlKGJvb2xlYW4gb3ZlcnJpZGUpIHsKKworICAgICAgICBib29sZWFuIG9sZE92ZXJyaWRlID0gdGhpcy5vdmVycmlkZTsKKyAgICAgICAgdGhpcy5vdmVycmlkZSA9IG92ZXJyaWRlOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgib3ZlcnJpZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbihvbGRPdmVycmlkZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKHRoaXMub3ZlcnJpZGUpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSAicmVwbGFjZSB3ZWxjb21lIGZpbGVzIiBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGxhY2VXZWxjb21lRmlsZXMoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlcGxhY2VXZWxjb21lRmlsZXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlICJyZXBsYWNlIHdlbGNvbWUgZmlsZXMiIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcGxhY2VXZWxjb21lRmlsZXMgVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcGxhY2VXZWxjb21lRmlsZXMoYm9vbGVhbiByZXBsYWNlV2VsY29tZUZpbGVzKSB7CisKKyAgICAgICAgYm9vbGVhbiBvbGRSZXBsYWNlV2VsY29tZUZpbGVzID0gdGhpcy5yZXBsYWNlV2VsY29tZUZpbGVzOworICAgICAgICB0aGlzLnJlcGxhY2VXZWxjb21lRmlsZXMgPSByZXBsYWNlV2VsY29tZUZpbGVzOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicmVwbGFjZVdlbGNvbWVGaWxlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKG9sZFJlcGxhY2VXZWxjb21lRmlsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbih0aGlzLnJlcGxhY2VXZWxjb21lRmlsZXMpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJ2bGV0IGNvbnRleHQgZm9yIHdoaWNoIHRoaXMgQ29udGV4dCBpcyBhIGZhY2FkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKSB7CisKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgY29udGV4dCA9IG5ldyBBcHBsaWNhdGlvbkNvbnRleHQoZ2V0QmFzZVBhdGgoKSwgdGhpcyk7CisgICAgICAgICAgICBpZiAoYWx0REROYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRBdHRyaWJ1dGUoR2xvYmFscy5BTFRfRERfQVRUUixhbHRERE5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoY29udGV4dC5nZXRGYWNhZGUoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCBzZXNzaW9uIHRpbWVvdXQgKGluIG1pbnV0ZXMpIGZvciB0aGlzCisgICAgICogd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2Vzc2lvblRpbWVvdXQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlc3Npb25UaW1lb3V0KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWZhdWx0IHNlc3Npb24gdGltZW91dCAoaW4gbWludXRlcykgZm9yIHRoaXMKKyAgICAgKiB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZW91dCBUaGUgbmV3IGRlZmF1bHQgc2Vzc2lvbiB0aW1lb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvblRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKworICAgICAgICBpbnQgb2xkU2Vzc2lvblRpbWVvdXQgPSB0aGlzLnNlc3Npb25UaW1lb3V0OworICAgICAgICAvKgorICAgICAgICAgKiBTUlYuMTMuNCAoIkRlcGxveW1lbnQgRGVzY3JpcHRvciIpOgorICAgICAgICAgKiBJZiB0aGUgdGltZW91dCBpcyAwIG9yIGxlc3MsIHRoZSBjb250YWluZXIgZW5zdXJlcyB0aGUgZGVmYXVsdAorICAgICAgICAgKiBiZWhhdmlvdXIgb2Ygc2Vzc2lvbnMgaXMgbmV2ZXIgdG8gdGltZSBvdXQuCisgICAgICAgICAqLworICAgICAgICB0aGlzLnNlc3Npb25UaW1lb3V0ID0gKHRpbWVvdXQgPT0gMCkgPyAtMSA6IHRpbWVvdXQ7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJzZXNzaW9uVGltZW91dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKG9sZFNlc3Npb25UaW1lb3V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIodGhpcy5zZXNzaW9uVGltZW91dCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzd2FsbG93T3V0cHV0IGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U3dhbGxvd091dHB1dCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuc3dhbGxvd091dHB1dCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHN3YWxsb3dPdXRwdXQgZmxhZy4gSWYgc2V0IHRvIHRydWUsIHRoZSBzeXN0ZW0ub3V0CisgICAgICogYW5kIHN5c3RlbS5lcnIgd2lsbCBiZSByZWRpcmVjdGVkIHRvIHRoZSBsb2dnZXIgZHVyaW5nIGEgc2VydmxldAorICAgICAqIGV4ZWN1dGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzd2FsbG93T3V0cHV0IFRoZSBuZXcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTd2FsbG93T3V0cHV0KGJvb2xlYW4gc3dhbGxvd091dHB1dCkgeworCisgICAgICAgIGJvb2xlYW4gb2xkU3dhbGxvd091dHB1dCA9IHRoaXMuc3dhbGxvd091dHB1dDsKKyAgICAgICAgdGhpcy5zd2FsbG93T3V0cHV0ID0gc3dhbGxvd091dHB1dDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInN3YWxsb3dPdXRwdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbihvbGRTd2FsbG93T3V0cHV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odGhpcy5zd2FsbG93T3V0cHV0KSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHVubG9hZERlbGF5IGZsYWcuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0VW5sb2FkRGVsYXkoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnVubG9hZERlbGF5KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgdW5sb2FkRGVsYXkgZmxhZywgd2hpY2ggcmVwcmVzZW50cyB0aGUgYW1vdW50CisgICAgICogb2YgbXMgdGhhdCB0aGUgY29udGFpbmVyIHdpbGwgd2FpdCB3aGVuIHVubG9hZGluZyBzZXJ2bGV0cy4KKyAgICAgKiBTZXR0aW5nIHRoaXMgdG8gYSBzbWFsbCB2YWx1ZSBtYXkgY2F1c2UgbW9yZSByZXF1ZXN0cyB0byBmYWlsIAorICAgICAqIHRvIGNvbXBsZXRlIHdoZW4gc3RvcHBpbmcgYSB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdW5sb2FkRGVsYXkgVGhlIG5ldyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVubG9hZERlbGF5KGxvbmcgdW5sb2FkRGVsYXkpIHsKKworICAgICAgICBsb25nIG9sZFVubG9hZERlbGF5ID0gdGhpcy51bmxvYWREZWxheTsKKyAgICAgICAgdGhpcy51bmxvYWREZWxheSA9IHVubG9hZERlbGF5OworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgidW5sb2FkRGVsYXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyhvbGRVbmxvYWREZWxheSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKHRoaXMudW5sb2FkRGVsYXkpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVW5wYWNrIFdBUiBmbGFnIGFjY2Vzc29yLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFVucGFja1dBUigpIHsKKworICAgICAgICByZXR1cm4gKHVucGFja1dBUik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVucGFjayBXQVIgZmxhZyBtdXRhdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVucGFja1dBUihib29sZWFuIHVucGFja1dBUikgeworCisgICAgICAgIHRoaXMudW5wYWNrV0FSID0gdW5wYWNrV0FSOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIFdyYXBwZXIgaW1wbGVtZW50YXRpb24gdXNlZAorICAgICAqIGZvciBzZXJ2bGV0cyByZWdpc3RlcmVkIGluIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFdyYXBwZXJDbGFzcygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMud3JhcHBlckNsYXNzTmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBXcmFwcGVyIGltcGxlbWVudGF0aW9uIHVzZWQKKyAgICAgKiBmb3Igc2VydmxldHMgcmVnaXN0ZXJlZCBpbiB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JhcHBlckNsYXNzTmFtZSBUaGUgbmV3IHdyYXBwZXIgY2xhc3MgbmFtZQorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCB3cmFwcGVyIGNsYXNzCisgICAgICogY2Fubm90IGJlIGZvdW5kIG9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIFN0YW5kYXJkV3JhcHBlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdyYXBwZXJDbGFzcyhTdHJpbmcgd3JhcHBlckNsYXNzTmFtZSkgeworCisgICAgICAgIHRoaXMud3JhcHBlckNsYXNzTmFtZSA9IHdyYXBwZXJDbGFzc05hbWU7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyYXBwZXJDbGFzcyA9IENsYXNzLmZvck5hbWUod3JhcHBlckNsYXNzTmFtZSk7ICAgICAgICAgCisgICAgICAgICAgICBpZiAoIVN0YW5kYXJkV3JhcHBlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHdyYXBwZXJDbGFzcykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5pbnZhbGlkV3JhcHBlckNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXJDbGFzc05hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNuZmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXNvdXJjZXMgRGlyQ29udGV4dCBvYmplY3Qgd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcworICAgICAqIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSBuZXdseSBhc3NvY2lhdGVkIERpckNvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UmVzb3VyY2VzKERpckNvbnRleHQgcmVzb3VyY2VzKSB7CisKKyAgICAgICAgaWYgKHN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQucmVzb3VyY2VzLnN0YXJ0ZWQiKSk7CisgICAgICAgIH0KKworICAgICAgICBEaXJDb250ZXh0IG9sZFJlc291cmNlcyA9IHRoaXMud2ViYXBwUmVzb3VyY2VzOworICAgICAgICBpZiAob2xkUmVzb3VyY2VzID09IHJlc291cmNlcykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAocmVzb3VyY2VzIGluc3RhbmNlb2YgQmFzZURpckNvbnRleHQpIHsKKyAgICAgICAgICAgICgoQmFzZURpckNvbnRleHQpIHJlc291cmNlcykuc2V0Q2FjaGVkKGlzQ2FjaGluZ0FsbG93ZWQoKSk7CisgICAgICAgICAgICAoKEJhc2VEaXJDb250ZXh0KSByZXNvdXJjZXMpLnNldENhY2hlVFRMKGdldENhY2hlVFRMKCkpOworICAgICAgICAgICAgKChCYXNlRGlyQ29udGV4dCkgcmVzb3VyY2VzKS5zZXRDYWNoZU1heFNpemUoZ2V0Q2FjaGVNYXhTaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXNvdXJjZXMgaW5zdGFuY2VvZiBGaWxlRGlyQ29udGV4dCkgeworICAgICAgICAgICAgZmlsZXN5c3RlbUJhc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICgoRmlsZURpckNvbnRleHQpIHJlc291cmNlcykuc2V0Q2FzZVNlbnNpdGl2ZShpc0Nhc2VTZW5zaXRpdmUoKSk7CisgICAgICAgICAgICAoKEZpbGVEaXJDb250ZXh0KSByZXNvdXJjZXMpLnNldEFsbG93TGlua2luZyhpc0FsbG93TGlua2luZygpKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLndlYmFwcFJlc291cmNlcyA9IHJlc291cmNlczsKKworICAgICAgICAvLyBUaGUgcHJveGllZCByZXNvdXJjZXMgd2lsbCBiZSByZWZyZXNoZWQgb24gc3RhcnQKKyAgICAgICAgdGhpcy5yZXNvdXJjZXMgPSBudWxsOworCisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJyZXNvdXJjZXMiLCBvbGRSZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2ViYXBwUmVzb3VyY2VzKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTG9jYWxlIHRvIGNoYXJhY3RlciBzZXQgbWFwcGVyIGNsYXNzIGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyc2V0TWFwcGVyQ2xhc3MoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmNoYXJzZXRNYXBwZXJDbGFzcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgTG9jYWxlIHRvIGNoYXJhY3RlciBzZXQgbWFwcGVyIGNsYXNzIGZvciB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGVyIFRoZSBuZXcgbWFwcGVyIGNsYXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hhcnNldE1hcHBlckNsYXNzKFN0cmluZyBtYXBwZXIpIHsKKworICAgICAgICBTdHJpbmcgb2xkQ2hhcnNldE1hcHBlckNsYXNzID0gdGhpcy5jaGFyc2V0TWFwcGVyQ2xhc3M7CisgICAgICAgIHRoaXMuY2hhcnNldE1hcHBlckNsYXNzID0gbWFwcGVyOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiY2hhcnNldE1hcHBlckNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ2hhcnNldE1hcHBlckNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXJzZXRNYXBwZXJDbGFzcyk7CisKKyAgICB9CisKKworICAgIC8qKiBHZXQgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHdvcmsgZGlyLgorICAgICAqICBUbyBhdm9pZCBkdXBsaWNhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSB3b3JrIHBhdGgKKyAgICAgKi8gCisgICAgcHVibGljIFN0cmluZyBnZXRXb3JrUGF0aCgpIHsKKyAgICAgICAgRmlsZSB3b3JrRGlyID0gbmV3IEZpbGUoZ2V0V29ya0RpcigpKTsKKyAgICAgICAgaWYgKCF3b3JrRGlyLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgRmlsZSBjYXRhbGluYUhvbWUgPSBlbmdpbmVCYXNlKCk7CisgICAgICAgICAgICBTdHJpbmcgY2F0YWxpbmFIb21lUGF0aCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNhdGFsaW5hSG9tZVBhdGggPSBjYXRhbGluYUhvbWUuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgIHdvcmtEaXIgPSBuZXcgRmlsZShjYXRhbGluYUhvbWVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya0RpcigpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cud2FybigiRXhjZXB0aW9uIG9idGFpbmluZyB3b3JrIHBhdGggZm9yICIgKyBnZXRQYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB3b3JrRGlyLmdldEFic29sdXRlUGF0aCgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHdvcmsgZGlyZWN0b3J5IGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRXb3JrRGlyKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy53b3JrRGlyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3b3JrIGRpcmVjdG9yeSBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHdvcmtEaXIgVGhlIG5ldyB3b3JrIGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdvcmtEaXIoU3RyaW5nIHdvcmtEaXIpIHsKKworICAgICAgICB0aGlzLndvcmtEaXIgPSB3b3JrRGlyOworCisgICAgICAgIGlmIChzdGFydGVkKSB7CisgICAgICAgICAgICBwb3N0V29ya0RpcmVjdG9yeSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTYXZlIGNvbmZpZyA/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTYXZlQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gc2F2ZUNvbmZpZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCBzYXZlIGNvbmZpZyBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNhdmVDb25maWcoYm9vbGVhbiBzYXZlQ29uZmlnKSB7CisgICAgICAgIHRoaXMuc2F2ZUNvbmZpZyA9IHNhdmVDb25maWc7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb250ZXh0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IExpc3RlbmVyIGNsYXNzIG5hbWUgdG8gdGhlIHNldCBvZiBMaXN0ZW5lcnMKKyAgICAgKiBjb25maWd1cmVkIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIEphdmEgY2xhc3MgbmFtZSBvZiBhIGxpc3RlbmVyIGNsYXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQXBwbGljYXRpb25MaXN0ZW5lcihTdHJpbmcgbGlzdGVuZXIpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGFwcGxpY2F0aW9uTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID1uZXcgU3RyaW5nW2FwcGxpY2F0aW9uTGlzdGVuZXJzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcHBsaWNhdGlvbkxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5lcXVhbHMoYXBwbGljYXRpb25MaXN0ZW5lcnNbaV0pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IGFwcGxpY2F0aW9uTGlzdGVuZXJzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0c1thcHBsaWNhdGlvbkxpc3RlbmVycy5sZW5ndGhdID0gbGlzdGVuZXI7CisgICAgICAgICAgICBhcHBsaWNhdGlvbkxpc3RlbmVycyA9IHJlc3VsdHM7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRBcHBsaWNhdGlvbkxpc3RlbmVyIiwgbGlzdGVuZXIpOworCisgICAgICAgIC8vIEZJWE1FIC0gYWRkIGluc3RhbmNlIGlmIGFscmVhZHkgc3RhcnRlZD8KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGFwcGxpY2F0aW9uIHBhcmFtZXRlciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIgVGhlIG5ldyBhcHBsaWNhdGlvbiBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBcHBsaWNhdGlvblBhcmFtZXRlcihBcHBsaWNhdGlvblBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGFwcGxpY2F0aW9uUGFyYW1ldGVycykgeworICAgICAgICAgICAgU3RyaW5nIG5ld05hbWUgPSBwYXJhbWV0ZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcHBsaWNhdGlvblBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobmV3TmFtZS5lcXVhbHMoYXBwbGljYXRpb25QYXJhbWV0ZXJzW2ldLmdldE5hbWUoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIWFwcGxpY2F0aW9uUGFyYW1ldGVyc1tpXS5nZXRPdmVycmlkZSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBcHBsaWNhdGlvblBhcmFtZXRlciByZXN1bHRzW10gPQorICAgICAgICAgICAgICAgIG5ldyBBcHBsaWNhdGlvblBhcmFtZXRlclthcHBsaWNhdGlvblBhcmFtZXRlcnMubGVuZ3RoICsgMV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFwcGxpY2F0aW9uUGFyYW1ldGVycywgMCwgcmVzdWx0cywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCk7CisgICAgICAgICAgICByZXN1bHRzW2FwcGxpY2F0aW9uUGFyYW1ldGVycy5sZW5ndGhdID0gcGFyYW1ldGVyOworICAgICAgICAgICAgYXBwbGljYXRpb25QYXJhbWV0ZXJzID0gcmVzdWx0czsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFkZEFwcGxpY2F0aW9uUGFyYW1ldGVyIiwgcGFyYW1ldGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgY2hpbGQgQ29udGFpbmVyLCBvbmx5IGlmIHRoZSBwcm9wb3NlZCBjaGlsZCBpcyBhbiBpbXBsZW1lbnRhdGlvbgorICAgICAqIG9mIFdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGQgQ2hpbGQgY29udGFpbmVyIHRvIGJlIGFkZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJvcG9zZWQgY29udGFpbmVyIGlzCisgICAgICogIG5vdCBhbiBpbXBsZW1lbnRhdGlvbiBvZiBXcmFwcGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoQ29udGFpbmVyIGNoaWxkKSB7CisKKyAgICAgICAgLy8gR2xvYmFsIEpzcFNlcnZsZXQKKyAgICAgICAgV3JhcHBlciBvbGRKc3BTZXJ2bGV0ID0gbnVsbDsKKworICAgICAgICBpZiAoIShjaGlsZCBpbnN0YW5jZW9mIFdyYXBwZXIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0Lm5vdFdyYXBwZXIiKSk7CisgICAgICAgIH0KKworICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSAoV3JhcHBlcikgY2hpbGQ7CisgICAgICAgIGJvb2xlYW4gaXNKc3BTZXJ2bGV0ID0gImpzcCIuZXF1YWxzKGNoaWxkLmdldE5hbWUoKSk7CisKKyAgICAgICAgLy8gQWxsb3cgd2ViYXBwIHRvIG92ZXJyaWRlIEpzcFNlcnZsZXQgaW5oZXJpdGVkIGZyb20gZ2xvYmFsIHdlYi54bWwuCisgICAgICAgIGlmIChpc0pzcFNlcnZsZXQpIHsKKyAgICAgICAgICAgIG9sZEpzcFNlcnZsZXQgPSAoV3JhcHBlcikgZmluZENoaWxkKCJqc3AiKTsKKyAgICAgICAgICAgIGlmIChvbGRKc3BTZXJ2bGV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVDaGlsZChvbGRKc3BTZXJ2bGV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBqc3BGaWxlID0gd3JhcHBlci5nZXRKc3BGaWxlKCk7CisgICAgICAgIGlmICgoanNwRmlsZSAhPSBudWxsKSAmJiAhanNwRmlsZS5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIGlmIChpc1NlcnZsZXQyMigpKSB7CisgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC53cmFwcGVyLndhcm5pbmciLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzcEZpbGUpKTsKKyAgICAgICAgICAgICAgICB3cmFwcGVyLnNldEpzcEZpbGUoIi8iICsganNwRmlsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LndyYXBwZXIuZXJyb3IiLCBqc3BGaWxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdXBlci5hZGRDaGlsZChjaGlsZCk7CisKKyAgICAgICAgaWYgKGlzSnNwU2VydmxldCAmJiBvbGRKc3BTZXJ2bGV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgd2ViYXBwLXNwZWNpZmljIEpzcFNlcnZsZXQgaW5oZXJpdHMgYWxsIHRoZSBtYXBwaW5ncworICAgICAgICAgICAgICogc3BlY2lmaWVkIGluIHRoZSBnbG9iYWwgd2ViLnhtbCwgYW5kIG1heSBhZGQgYWRkaXRpb25hbCBvbmVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBTdHJpbmdbXSBqc3BNYXBwaW5ncyA9IG9sZEpzcFNlcnZsZXQuZmluZE1hcHBpbmdzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGpzcE1hcHBpbmdzIT1udWxsICYmIGk8anNwTWFwcGluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZGRTZXJ2bGV0TWFwcGluZyhqc3BNYXBwaW5nc1tpXSwgY2hpbGQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgc2VjdXJpdHkgY29uc3RyYWludCB0byB0aGUgc2V0IGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBjb25zdHJhaW50KSB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHByb3Bvc2VkIGNvbnN0cmFpbnQKKyAgICAgICAgU2VjdXJpdHlDb2xsZWN0aW9uIGNvbGxlY3Rpb25zW10gPSBjb25zdHJhaW50LmZpbmRDb2xsZWN0aW9ucygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbGxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0dGVybnNbXSA9IGNvbGxlY3Rpb25zW2ldLmZpbmRQYXR0ZXJucygpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXR0ZXJucy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIHBhdHRlcm5zW2pdID0gYWRqdXN0VVJMUGF0dGVybihwYXR0ZXJuc1tqXSk7CisgICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZVVSTFBhdHRlcm4ocGF0dGVybnNbal0pKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJzdGFuZGFyZENvbnRleHQuc2VjdXJpdHlDb25zdHJhaW50LnBhdHRlcm4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuc1tqXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHRoaXMgY29uc3RyYWludCB0byB0aGUgc2V0IGZvciBvdXIgd2ViIGFwcGxpY2F0aW9uCisgICAgICAgIHN5bmNocm9uaXplZCAoY29uc3RyYWludHMpIHsKKyAgICAgICAgICAgIFNlY3VyaXR5Q29uc3RyYWludCByZXN1bHRzW10gPQorICAgICAgICAgICAgICAgIG5ldyBTZWN1cml0eUNvbnN0cmFpbnRbY29uc3RyYWludHMubGVuZ3RoICsgMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSBjb25zdHJhaW50c1tpXTsKKyAgICAgICAgICAgIHJlc3VsdHNbY29uc3RyYWludHMubGVuZ3RoXSA9IGNvbnN0cmFpbnQ7CisgICAgICAgICAgICBjb25zdHJhaW50cyA9IHJlc3VsdHM7CisgICAgICAgIH0KKworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZXJyb3IgcGFnZSBmb3IgdGhlIHNwZWNpZmllZCBlcnJvciBvciBKYXZhIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvclBhZ2UgVGhlIGVycm9yIHBhZ2UgZGVmaW5pdGlvbiB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yUGFnZShFcnJvclBhZ2UgZXJyb3JQYWdlKSB7CisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCisgICAgICAgIGlmIChlcnJvclBhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQuZXJyb3JQYWdlLnJlcXVpcmVkIikpOworICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBlcnJvclBhZ2UuZ2V0TG9jYXRpb24oKTsKKyAgICAgICAgaWYgKChsb2NhdGlvbiAhPSBudWxsKSAmJiAhbG9jYXRpb24uc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICBpZiAoaXNTZXJ2bGV0MjIoKSkgeworICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQuZXJyb3JQYWdlLndhcm5pbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pKTsKKyAgICAgICAgICAgICAgICBlcnJvclBhZ2Uuc2V0TG9jYXRpb24oIi8iICsgbG9jYXRpb24pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5lcnJvclBhZ2UuZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgdGhlIHNwZWNpZmllZCBlcnJvciBwYWdlIHRvIG91ciBpbnRlcm5hbCBjb2xsZWN0aW9ucworICAgICAgICBTdHJpbmcgZXhjZXB0aW9uVHlwZSA9IGVycm9yUGFnZS5nZXRFeGNlcHRpb25UeXBlKCk7CisgICAgICAgIGlmIChleGNlcHRpb25UeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZXhjZXB0aW9uUGFnZXMpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb25QYWdlcy5wdXQoZXhjZXB0aW9uVHlwZSwgZXJyb3JQYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc3RhdHVzUGFnZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3JQYWdlLmdldEVycm9yQ29kZSgpID09IDIwMCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLm9rRXJyb3JQYWdlID0gZXJyb3JQYWdlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXNQYWdlcy5wdXQobmV3IEludGVnZXIoZXJyb3JQYWdlLmdldEVycm9yQ29kZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JQYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFkZEVycm9yUGFnZSIsIGVycm9yUGFnZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGZpbHRlciBkZWZpbml0aW9uIHRvIHRoaXMgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJEZWYgVGhlIGZpbHRlciBkZWZpbml0aW9uIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsdGVyRGVmKEZpbHRlckRlZiBmaWx0ZXJEZWYpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGZpbHRlckRlZnMpIHsKKyAgICAgICAgICAgIGZpbHRlckRlZnMucHV0KGZpbHRlckRlZi5nZXRGaWx0ZXJOYW1lKCksIGZpbHRlckRlZik7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRGaWx0ZXJEZWYiLCBmaWx0ZXJEZWYpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmaWx0ZXIgbWFwcGluZyB0byB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyTWFwIFRoZSBmaWx0ZXIgbWFwcGluZyB0byBiZSBhZGRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBmaWx0ZXIgbmFtZQorICAgICAqICBkb2VzIG5vdCBtYXRjaCBhbiBleGlzdGluZyBmaWx0ZXIgZGVmaW5pdGlvbiwgb3IgdGhlIGZpbHRlciBtYXBwaW5nCisgICAgICogIGlzIG1hbGZvcm1lZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbHRlck1hcChGaWx0ZXJNYXAgZmlsdGVyTWFwKSB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHByb3Bvc2VkIGZpbHRlciBtYXBwaW5nCisgICAgICAgIFN0cmluZyBmaWx0ZXJOYW1lID0gZmlsdGVyTWFwLmdldEZpbHRlck5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHNlcnZsZXROYW1lID0gZmlsdGVyTWFwLmdldFNlcnZsZXROYW1lKCk7CisgICAgICAgIFN0cmluZyB1cmxQYXR0ZXJuID0gZmlsdGVyTWFwLmdldFVSTFBhdHRlcm4oKTsKKyAgICAgICAgaWYgKGZpbmRGaWx0ZXJEZWYoZmlsdGVyTmFtZSkgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQuZmlsdGVyTWFwLm5hbWUiLCBmaWx0ZXJOYW1lKSk7CisgICAgICAgIGlmICgoc2VydmxldE5hbWUgPT0gbnVsbCkgJiYgKHVybFBhdHRlcm4gPT0gbnVsbCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LmZpbHRlck1hcC5laXRoZXIiKSk7CisgICAgICAgIGlmICgoc2VydmxldE5hbWUgIT0gbnVsbCkgJiYgKHVybFBhdHRlcm4gIT0gbnVsbCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LmZpbHRlck1hcC5laXRoZXIiKSk7CisgICAgICAgIC8vIEJlY2F1c2UgZmlsdGVyLXBhdHRlcm4gaXMgbmV3IGluIDIuMywgbm8gbmVlZCB0byBhZGp1c3QKKyAgICAgICAgLy8gZm9yIDIuMiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICAgICAgICBpZiAoKHVybFBhdHRlcm4gIT0gbnVsbCkgJiYgIXZhbGlkYXRlVVJMUGF0dGVybih1cmxQYXR0ZXJuKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQuZmlsdGVyTWFwLnBhdHRlcm4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsUGF0dGVybikpOworCisgICAgICAgIC8vIEFkZCB0aGlzIGZpbHRlciBtYXBwaW5nIHRvIG91ciByZWdpc3RlcmVkIHNldAorICAgICAgICBzeW5jaHJvbml6ZWQgKGZpbHRlck1hcHMpIHsKKyAgICAgICAgICAgIEZpbHRlck1hcCByZXN1bHRzW10gPW5ldyBGaWx0ZXJNYXBbZmlsdGVyTWFwcy5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZmlsdGVyTWFwcywgMCwgcmVzdWx0cywgMCwgZmlsdGVyTWFwcy5sZW5ndGgpOworICAgICAgICAgICAgcmVzdWx0c1tmaWx0ZXJNYXBzLmxlbmd0aF0gPSBmaWx0ZXJNYXA7CisgICAgICAgICAgICBmaWx0ZXJNYXBzID0gcmVzdWx0czsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFkZEZpbHRlck1hcCIsIGZpbHRlck1hcCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgY2xhc3NuYW1lIG9mIGFuIEluc3RhbmNlTGlzdGVuZXIgdG8gYmUgYWRkZWQgdG8gZWFjaAorICAgICAqIFdyYXBwZXIgYXBwZW5kZWQgdG8gdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIEphdmEgY2xhc3MgbmFtZSBvZiBhbiBJbnN0YW5jZUxpc3RlbmVyIGNsYXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSW5zdGFuY2VMaXN0ZW5lcihTdHJpbmcgbGlzdGVuZXIpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGluc3RhbmNlTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID1uZXcgU3RyaW5nW2luc3RhbmNlTGlzdGVuZXJzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZUxpc3RlbmVycy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICByZXN1bHRzW2ldID0gaW5zdGFuY2VMaXN0ZW5lcnNbaV07CisgICAgICAgICAgICByZXN1bHRzW2luc3RhbmNlTGlzdGVuZXJzLmxlbmd0aF0gPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIGluc3RhbmNlTGlzdGVuZXJzID0gcmVzdWx0czsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFkZEluc3RhbmNlTGlzdGVuZXIiLCBsaXN0ZW5lcik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIFVSTCBwYXR0ZXJuIGFzIGEganNwLXByb3BlcnR5LWdyb3VwLiAgVGhpcyBtYXBzCisgICAgICogcmVzb3VyY2VzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHBhdHRlcm4gc28gdGhleSB3aWxsIGJlIHBhc3NlZAorICAgICAqIHRvIHRoZSBKU1AgY29udGFpbmVyLiAgVGhvdWdoIHRoZXJlIGFyZSBvdGhlciBlbGVtZW50cyBpbiB0aGUKKyAgICAgKiBwcm9wZXJ0eSBncm91cCwgd2Ugb25seSBjYXJlIGFib3V0IHRoZSBVUkwgcGF0dGVybiBoZXJlLiAgVGhlCisgICAgICogSlNQIGNvbnRhaW5lciB3aWxsIHBhcnNlIHRoZSByZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gVVJMIHBhdHRlcm4gdG8gYmUgbWFwcGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSnNwTWFwcGluZyhTdHJpbmcgcGF0dGVybikgeworICAgICAgICBTdHJpbmcgc2VydmxldE5hbWUgPSBmaW5kU2VydmxldE1hcHBpbmcoIiouanNwIik7CisgICAgICAgIGlmIChzZXJ2bGV0TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXJ2bGV0TmFtZSA9ICJqc3AiOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGZpbmRDaGlsZChzZXJ2bGV0TmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkU2VydmxldE1hcHBpbmcocGF0dGVybiwgc2VydmxldE5hbWUsIHRydWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTa2lwaW5nICIgKyBwYXR0ZXJuICsgIiAsIG5vIHNlcnZsZXQgIiArIHNlcnZsZXROYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgTG9jYWxlIEVuY29kaW5nIE1hcHBpbmcgKHNlZSBTZWMgNS40IG9mIFNlcnZsZXQgc3BlYyAyLjQpCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWxlIGxvY2FsZSB0byBtYXAgYW4gZW5jb2RpbmcgZm9yCisgICAgICogQHBhcmFtIGVuY29kaW5nIGVuY29kaW5nIHRvIGJlIHVzZWQgZm9yIGEgZ2l2ZSBsb2NhbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMb2NhbGVFbmNvZGluZ01hcHBpbmdQYXJhbWV0ZXIoU3RyaW5nIGxvY2FsZSwgU3RyaW5nIGVuY29kaW5nKXsKKyAgICAgICAgZ2V0Q2hhcnNldE1hcHBlcigpLmFkZENoYXJzZXRNYXBwaW5nRnJvbURlcGxveW1lbnREZXNjcmlwdG9yKGxvY2FsZSwgZW5jb2RpbmcpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWQgTmV3IG1lc3NhZ2UgZGVzdGluYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlRGVzdGluYXRpb24oTWVzc2FnZURlc3RpbmF0aW9uIG1kKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtZXNzYWdlRGVzdGluYXRpb25zKSB7CisgICAgICAgICAgICBtZXNzYWdlRGVzdGluYXRpb25zLnB1dChtZC5nZXROYW1lKCksIG1kKTsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFkZE1lc3NhZ2VEZXN0aW5hdGlvbiIsIG1kLmdldE5hbWUoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZHIgTmV3IG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZURlc3RpbmF0aW9uUmVmCisgICAgICAgIChNZXNzYWdlRGVzdGluYXRpb25SZWYgbWRyKSB7CisKKyAgICAgICAgbmFtaW5nUmVzb3VyY2VzLmFkZE1lc3NhZ2VEZXN0aW5hdGlvblJlZihtZHIpOworICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFkZE1lc3NhZ2VEZXN0aW5hdGlvblJlZiIsIG1kci5nZXROYW1lKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgTUlNRSBtYXBwaW5nLCByZXBsYWNpbmcgYW55IGV4aXN0aW5nIG1hcHBpbmcgZm9yCisgICAgICogdGhlIHNwZWNpZmllZCBleHRlbnNpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uIEZpbGVuYW1lIGV4dGVuc2lvbiBiZWluZyBtYXBwZWQKKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgQ29ycmVzcG9uZGluZyBNSU1FIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRNaW1lTWFwcGluZyhTdHJpbmcgZXh0ZW5zaW9uLCBTdHJpbmcgbWltZVR5cGUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1pbWVNYXBwaW5ncykgeworICAgICAgICAgICAgbWltZU1hcHBpbmdzLnB1dChleHRlbnNpb24sIG1pbWVUeXBlKTsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFkZE1pbWVNYXBwaW5nIiwgZXh0ZW5zaW9uKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgbmV3IHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvZiB0aGUgbmV3ICBwYXJhbWV0ZXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBuYW1lIG9yIHZhbHVlIGlzIG1pc3NpbmcsCisgICAgICogIG9yIGlmIHRoaXMgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgaGFzIGFscmVhZHkgYmVlbgorICAgICAqICByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHByb3Bvc2VkIGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyCisgICAgICAgIGlmICgobmFtZSA9PSBudWxsKSB8fCAodmFsdWUgPT0gbnVsbCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LnBhcmFtZXRlci5yZXF1aXJlZCIpKTsKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMuZ2V0KG5hbWUpICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LnBhcmFtZXRlci5kdXBsaWNhdGUiLCBuYW1lKSk7CisKKyAgICAgICAgLy8gQWRkIHRoaXMgcGFyYW1ldGVyIHRvIG91ciBkZWZpbmVkIHNldAorICAgICAgICBzeW5jaHJvbml6ZWQgKHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFkZFBhcmFtZXRlciIsIG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBTZWN1cml0eSByb2xlIHVzZWQgaW4gdGhlIGFwcGxpY2F0aW9uCisgICAgICogQHBhcmFtIGxpbmsgQWN0dWFsIHNlY3VyaXR5IHJvbGUgdG8gY2hlY2sgZm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUm9sZU1hcHBpbmcoU3RyaW5nIHJvbGUsIFN0cmluZyBsaW5rKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChyb2xlTWFwcGluZ3MpIHsKKyAgICAgICAgICAgIHJvbGVNYXBwaW5ncy5wdXQocm9sZSwgbGluayk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRSb2xlTWFwcGluZyIsIHJvbGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgc2VjdXJpdHkgcm9sZSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBOZXcgc2VjdXJpdHkgcm9sZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNlY3VyaXR5Um9sZShTdHJpbmcgcm9sZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoc2VjdXJpdHlSb2xlcykgeworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9bmV3IFN0cmluZ1tzZWN1cml0eVJvbGVzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWN1cml0eVJvbGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSBzZWN1cml0eVJvbGVzW2ldOworICAgICAgICAgICAgcmVzdWx0c1tzZWN1cml0eVJvbGVzLmxlbmd0aF0gPSByb2xlOworICAgICAgICAgICAgc2VjdXJpdHlSb2xlcyA9IHJlc3VsdHM7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRTZWN1cml0eVJvbGUiLCByb2xlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHNlcnZsZXQgbWFwcGluZywgcmVwbGFjaW5nIGFueSBleGlzdGluZyBtYXBwaW5nIGZvcgorICAgICAqIHRoZSBzcGVjaWZpZWQgcGF0dGVybi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIFVSTCBwYXR0ZXJuIHRvIGJlIG1hcHBlZAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2VydmxldCB0byBleGVjdXRlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIHNlcnZsZXQgbmFtZQorICAgICAqICBpcyBub3Qga25vd24gdG8gdGhpcyBDb250ZXh0CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2VydmxldE1hcHBpbmcoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGFkZFNlcnZsZXRNYXBwaW5nKHBhdHRlcm4sIG5hbWUsIGZhbHNlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBzZXJ2bGV0IG1hcHBpbmcsIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgbWFwcGluZyBmb3IKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHBhdHRlcm4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBVUkwgcGF0dGVybiB0byBiZSBtYXBwZWQKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNlcnZsZXQgdG8gZXhlY3V0ZQorICAgICAqIEBwYXJhbSBqc3BXaWxkQ2FyZCB0cnVlIGlmIG5hbWUgaWRlbnRpZmllcyB0aGUgSnNwU2VydmxldAorICAgICAqIGFuZCBwYXR0ZXJuIGNvbnRhaW5zIGEgd2lsZGNhcmQ7IGZhbHNlIG90aGVyd2lzZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBzZXJ2bGV0IG5hbWUKKyAgICAgKiAgaXMgbm90IGtub3duIHRvIHRoaXMgQ29udGV4dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNlcnZsZXRNYXBwaW5nKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGpzcFdpbGRDYXJkKSB7CisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBwcm9wb3NlZCBtYXBwaW5nCisgICAgICAgIGlmIChmaW5kQ2hpbGQobmFtZSkgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQuc2VydmxldE1hcC5uYW1lIiwgbmFtZSkpOworICAgICAgICBwYXR0ZXJuID0gYWRqdXN0VVJMUGF0dGVybihSZXF1ZXN0VXRpbC5VUkxEZWNvZGUocGF0dGVybikpOworICAgICAgICBpZiAoIXZhbGlkYXRlVVJMUGF0dGVybihwYXR0ZXJuKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQuc2VydmxldE1hcC5wYXR0ZXJuIiwgcGF0dGVybikpOworCisgICAgICAgIC8vIEFkZCB0aGlzIG1hcHBpbmcgdG8gb3VyIHJlZ2lzdGVyZWQgc2V0CisgICAgICAgIHN5bmNocm9uaXplZCAoc2VydmxldE1hcHBpbmdzKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZTIgPSAoU3RyaW5nKSBzZXJ2bGV0TWFwcGluZ3MuZ2V0KHBhdHRlcm4pOworICAgICAgICAgICAgaWYgKG5hbWUyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBEb24ndCBhbGxvdyBtb3JlIHRoYW4gb25lIHNlcnZsZXQgb24gdGhlIHNhbWUgcGF0dGVybgorICAgICAgICAgICAgICAgIFdyYXBwZXIgd3JhcHBlciA9IChXcmFwcGVyKSBmaW5kQ2hpbGQobmFtZTIpOworICAgICAgICAgICAgICAgIHdyYXBwZXIucmVtb3ZlTWFwcGluZyhwYXR0ZXJuKTsKKyAgICAgICAgICAgICAgICBtYXBwZXIucmVtb3ZlV3JhcHBlcihwYXR0ZXJuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlcnZsZXRNYXBwaW5ncy5wdXQocGF0dGVybiwgbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgV3JhcHBlciB3cmFwcGVyID0gKFdyYXBwZXIpIGZpbmRDaGlsZChuYW1lKTsKKyAgICAgICAgd3JhcHBlci5hZGRNYXBwaW5nKHBhdHRlcm4pOworCisgICAgICAgIC8vIFVwZGF0ZSBjb250ZXh0IG1hcHBlcgorICAgICAgICBtYXBwZXIuYWRkV3JhcHBlcihwYXR0ZXJuLCB3cmFwcGVyLCBqc3BXaWxkQ2FyZCk7CisKKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRTZXJ2bGV0TWFwcGluZyIsIHBhdHRlcm4pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBKU1AgdGFnIGxpYnJhcnkgZm9yIHRoZSBzcGVjaWZpZWQgVVJJLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBVUkksIHJlbGF0aXZlIHRvIHRoZSB3ZWIueG1sIGZpbGUsIG9mIHRoaXMgdGFnIGxpYnJhcnkKKyAgICAgKiBAcGFyYW0gbG9jYXRpb24gTG9jYXRpb24gb2YgdGhlIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUYWdsaWIoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2F0aW9uKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkICh0YWdsaWJzKSB7CisgICAgICAgICAgICB0YWdsaWJzLnB1dCh1cmksIGxvY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFkZFRhZ2xpYiIsIHVyaSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyB3YXRjaGVkIHJlc291cmNlIHRvIHRoZSBzZXQgcmVjb2duaXplZCBieSB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOZXcgd2F0Y2hlZCByZXNvdXJjZSBmaWxlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRXYXRjaGVkUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHdhdGNoZWRSZXNvdXJjZXMpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW3dhdGNoZWRSZXNvdXJjZXMubGVuZ3RoICsgMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdhdGNoZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IHdhdGNoZWRSZXNvdXJjZXNbaV07CisgICAgICAgICAgICByZXN1bHRzW3dhdGNoZWRSZXNvdXJjZXMubGVuZ3RoXSA9IG5hbWU7CisgICAgICAgICAgICB3YXRjaGVkUmVzb3VyY2VzID0gcmVzdWx0czsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFkZFdhdGNoZWRSZXNvdXJjZSIsIG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgd2VsY29tZSBmaWxlIHRvIHRoZSBzZXQgcmVjb2duaXplZCBieSB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOZXcgd2VsY29tZSBmaWxlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRXZWxjb21lRmlsZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAod2VsY29tZUZpbGVzKSB7CisgICAgICAgICAgICAvLyBXZWxjb21lIGZpbGVzIGZyb20gdGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAgICAgICAgICAgLy8gY29tcGxldGVseSByZXBsYWNlIHRob3NlIGZyb20gdGhlIGRlZmF1bHQgY29uZi93ZWIueG1sIGZpbGUKKyAgICAgICAgICAgIGlmIChyZXBsYWNlV2VsY29tZUZpbGVzKSB7CisgICAgICAgICAgICAgICAgd2VsY29tZUZpbGVzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgICAgICAgICBzZXRSZXBsYWNlV2VsY29tZUZpbGVzKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPW5ldyBTdHJpbmdbd2VsY29tZUZpbGVzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWxjb21lRmlsZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IHdlbGNvbWVGaWxlc1tpXTsKKyAgICAgICAgICAgIHJlc3VsdHNbd2VsY29tZUZpbGVzLmxlbmd0aF0gPSBuYW1lOworICAgICAgICAgICAgd2VsY29tZUZpbGVzID0gcmVzdWx0czsKKyAgICAgICAgfQorICAgICAgICBwb3N0V2VsY29tZUZpbGVzKCk7CisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgiYWRkV2VsY29tZUZpbGUiLCBuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBjbGFzc25hbWUgb2YgYSBMaWZlY3ljbGVMaXN0ZW5lciB0byBiZSBhZGRlZCB0byBlYWNoCisgICAgICogV3JhcHBlciBhcHBlbmRlZCB0byB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgSmF2YSBjbGFzcyBuYW1lIG9mIGEgTGlmZWN5Y2xlTGlzdGVuZXIgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRXcmFwcGVyTGlmZWN5Y2xlKFN0cmluZyBsaXN0ZW5lcikgeworCisgICAgICAgIHN5bmNocm9uaXplZCAod3JhcHBlckxpZmVjeWNsZXMpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPW5ldyBTdHJpbmdbd3JhcHBlckxpZmVjeWNsZXMubGVuZ3RoICsgMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyYXBwZXJMaWZlY3ljbGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSB3cmFwcGVyTGlmZWN5Y2xlc1tpXTsKKyAgICAgICAgICAgIHJlc3VsdHNbd3JhcHBlckxpZmVjeWNsZXMubGVuZ3RoXSA9IGxpc3RlbmVyOworICAgICAgICAgICAgd3JhcHBlckxpZmVjeWNsZXMgPSByZXN1bHRzOworICAgICAgICB9CisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgiYWRkV3JhcHBlckxpZmVjeWNsZSIsIGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBjbGFzc25hbWUgb2YgYSBDb250YWluZXJMaXN0ZW5lciB0byBiZSBhZGRlZCB0byBlYWNoCisgICAgICogV3JhcHBlciBhcHBlbmRlZCB0byB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgSmF2YSBjbGFzcyBuYW1lIG9mIGEgQ29udGFpbmVyTGlzdGVuZXIgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRXcmFwcGVyTGlzdGVuZXIoU3RyaW5nIGxpc3RlbmVyKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkICh3cmFwcGVyTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID1uZXcgU3RyaW5nW3dyYXBwZXJMaXN0ZW5lcnMubGVuZ3RoICsgMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyYXBwZXJMaXN0ZW5lcnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IHdyYXBwZXJMaXN0ZW5lcnNbaV07CisgICAgICAgICAgICByZXN1bHRzW3dyYXBwZXJMaXN0ZW5lcnMubGVuZ3RoXSA9IGxpc3RlbmVyOworICAgICAgICAgICAgd3JhcHBlckxpc3RlbmVycyA9IHJlc3VsdHM7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRXcmFwcGVyTGlzdGVuZXIiLCBsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IFdyYXBwZXIgaW5zdGFuY2UsIG9mCisgICAgICogdGhlIEphdmEgaW1wbGVtZW50YXRpb24gY2xhc3MgYXBwcm9wcmlhdGUgZm9yIHRoaXMgQ29udGV4dAorICAgICAqIGltcGxlbWVudGF0aW9uLiAgVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBpbnN0YW50aWF0ZWQgV3JhcHBlcgorICAgICAqIHdpbGwgaGF2ZSBiZWVuIGNhbGxlZCwgYnV0IG5vIHByb3BlcnRpZXMgd2lsbCBoYXZlIGJlZW4gc2V0LgorICAgICAqLworICAgIHB1YmxpYyBXcmFwcGVyIGNyZWF0ZVdyYXBwZXIoKSB7CisKKyAgICAgICAgV3JhcHBlciB3cmFwcGVyID0gbnVsbDsKKyAgICAgICAgaWYgKHdyYXBwZXJDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdyYXBwZXIgPSAoV3JhcHBlcikgd3JhcHBlckNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiY3JlYXRlV3JhcHBlciIsIHQpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cmFwcGVyID0gbmV3IFN0YW5kYXJkV3JhcHBlcigpOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChpbnN0YW5jZUxpc3RlbmVycykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZUxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShpbnN0YW5jZUxpc3RlbmVyc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIEluc3RhbmNlTGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgICAgICAgIChJbnN0YW5jZUxpc3RlbmVyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmFkZEluc3RhbmNlTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiY3JlYXRlV3JhcHBlciIsIHQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAod3JhcHBlckxpZmVjeWNsZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3JhcHBlckxpZmVjeWNsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUod3JhcHBlckxpZmVjeWNsZXNbaV0pOworICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgICAgICAgKExpZmVjeWNsZUxpc3RlbmVyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAod3JhcHBlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSB3cmFwcGVyKS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJjcmVhdGVXcmFwcGVyIiwgdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkICh3cmFwcGVyTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyYXBwZXJMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUod3JhcHBlckxpc3RlbmVyc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lckxpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAoQ29udGFpbmVyTGlzdGVuZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuYWRkQ29udGFpbmVyTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiY3JlYXRlV3JhcHBlciIsIHQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAod3JhcHBlcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGNsYXNzIG5hbWVzIGNvbmZpZ3VyZWQKKyAgICAgKiBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZEFwcGxpY2F0aW9uTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiAoYXBwbGljYXRpb25MaXN0ZW5lcnMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBhcHBsaWNhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvblBhcmFtZXRlcltdIGZpbmRBcHBsaWNhdGlvblBhcmFtZXRlcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIChhcHBsaWNhdGlvblBhcmFtZXRlcnMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnRzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKiBJZiB0aGVyZSBhcmUgbm9uZSwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VjdXJpdHlDb25zdHJhaW50W10gZmluZENvbnN0cmFpbnRzKCkgeworCisgICAgICAgIHJldHVybiAoY29uc3RyYWludHMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGVycm9yIHBhZ2UgZW50cnkgZm9yIHRoZSBzcGVjaWZpZWQgSFRUUCBlcnJvciBjb2RlLAorICAgICAqIGlmIGFueTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvckNvZGUgRXJyb3IgY29kZSB0byBsb29rIHVwCisgICAgICovCisgICAgcHVibGljIEVycm9yUGFnZSBmaW5kRXJyb3JQYWdlKGludCBlcnJvckNvZGUpIHsKKyAgICAgICAgaWYgKGVycm9yQ29kZSA9PSAyMDApIHsKKyAgICAgICAgICAgIHJldHVybiAob2tFcnJvclBhZ2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICgoRXJyb3JQYWdlKSBzdGF0dXNQYWdlcy5nZXQobmV3IEludGVnZXIoZXJyb3JDb2RlKSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXJyb3IgcGFnZSBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBKYXZhIGV4Y2VwdGlvbiB0eXBlLAorICAgICAqIGlmIGFueTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGNlcHRpb25UeXBlIEV4Y2VwdGlvbiB0eXBlIHRvIGxvb2sgdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgRXJyb3JQYWdlIGZpbmRFcnJvclBhZ2UoU3RyaW5nIGV4Y2VwdGlvblR5cGUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGV4Y2VwdGlvblBhZ2VzKSB7CisgICAgICAgICAgICByZXR1cm4gKChFcnJvclBhZ2UpIGV4Y2VwdGlvblBhZ2VzLmdldChleGNlcHRpb25UeXBlKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgZGVmaW5lZCBlcnJvciBwYWdlcyBmb3IgYWxsIHNwZWNpZmllZCBlcnJvciBjb2RlcworICAgICAqIGFuZCBleGNlcHRpb24gdHlwZXMuCisgICAgICovCisgICAgcHVibGljIEVycm9yUGFnZVtdIGZpbmRFcnJvclBhZ2VzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZChleGNlcHRpb25QYWdlcykgeworICAgICAgICAgICAgc3luY2hyb25pemVkKHN0YXR1c1BhZ2VzKSB7CisgICAgICAgICAgICAgICAgRXJyb3JQYWdlIHJlc3VsdHMxW10gPSBuZXcgRXJyb3JQYWdlW2V4Y2VwdGlvblBhZ2VzLnNpemUoKV07CisgICAgICAgICAgICAgICAgcmVzdWx0czEgPQorICAgICAgICAgICAgICAgICAgICAoRXJyb3JQYWdlW10pIGV4Y2VwdGlvblBhZ2VzLnZhbHVlcygpLnRvQXJyYXkocmVzdWx0czEpOworICAgICAgICAgICAgICAgIEVycm9yUGFnZSByZXN1bHRzMltdID0gbmV3IEVycm9yUGFnZVtzdGF0dXNQYWdlcy5zaXplKCldOworICAgICAgICAgICAgICAgIHJlc3VsdHMyID0KKyAgICAgICAgICAgICAgICAgICAgKEVycm9yUGFnZVtdKSBzdGF0dXNQYWdlcy52YWx1ZXMoKS50b0FycmF5KHJlc3VsdHMyKTsKKyAgICAgICAgICAgICAgICBFcnJvclBhZ2UgcmVzdWx0c1tdID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEVycm9yUGFnZVtyZXN1bHRzMS5sZW5ndGggKyByZXN1bHRzMi5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0czEubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSByZXN1bHRzMVtpXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gcmVzdWx0czEubGVuZ3RoOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IHJlc3VsdHMyW2kgLSByZXN1bHRzMS5sZW5ndGhdOworICAgICAgICAgICAgICAgIHJldHVybiAocmVzdWx0cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmaWx0ZXIgZGVmaW5pdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBmaWx0ZXIgbmFtZSwgaWYgYW55OworICAgICAqIG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyTmFtZSBGaWx0ZXIgbmFtZSB0byBsb29rIHVwCisgICAgICovCisgICAgcHVibGljIEZpbHRlckRlZiBmaW5kRmlsdGVyRGVmKFN0cmluZyBmaWx0ZXJOYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChmaWx0ZXJEZWZzKSB7CisgICAgICAgICAgICByZXR1cm4gKChGaWx0ZXJEZWYpIGZpbHRlckRlZnMuZ2V0KGZpbHRlck5hbWUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBkZWZpbmVkIGZpbHRlcnMgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsdGVyRGVmW10gZmluZEZpbHRlckRlZnMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChmaWx0ZXJEZWZzKSB7CisgICAgICAgICAgICBGaWx0ZXJEZWYgcmVzdWx0c1tdID0gbmV3IEZpbHRlckRlZltmaWx0ZXJEZWZzLnNpemUoKV07CisgICAgICAgICAgICByZXR1cm4gKChGaWx0ZXJEZWZbXSkgZmlsdGVyRGVmcy52YWx1ZXMoKS50b0FycmF5KHJlc3VsdHMpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBmaWx0ZXIgbWFwcGluZ3MgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsdGVyTWFwW10gZmluZEZpbHRlck1hcHMoKSB7CisKKyAgICAgICAgcmV0dXJuIChmaWx0ZXJNYXBzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgSW5zdGFuY2VMaXN0ZW5lciBjbGFzc2VzIHRoYXQgd2lsbCBiZSBhZGRlZCB0bworICAgICAqIG5ld2x5IGNyZWF0ZWQgV3JhcHBlcnMgYXV0b21hdGljYWxseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZEluc3RhbmNlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiAoaW5zdGFuY2VMaXN0ZW5lcnMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGSVhNRTogRm9vbGluZyBpbnRyb3NwZWN0aW9uIC4uLgorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGZpbmRNYXBwaW5nT2JqZWN0KCkgeworICAgICAgICByZXR1cm4gKENvbnRleHQpIGdldE1hcHBpbmdPYmplY3QoKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBpZiBhbnk7CisgICAgICogb3RoZXJ3aXNlLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBkZXNpcmVkIG1lc3NhZ2UgZGVzdGluYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uIGZpbmRNZXNzYWdlRGVzdGluYXRpb24oU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1lc3NhZ2VEZXN0aW5hdGlvbnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lc3NhZ2VEZXN0aW5hdGlvbikgbWVzc2FnZURlc3RpbmF0aW9ucy5nZXQobmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGRlZmluZWQgbWVzc2FnZSBkZXN0aW5hdGlvbnMgZm9yIHRoaXMgd2ViCisgICAgICogYXBwbGljYXRpb24uICBJZiBub25lIGhhdmUgYmVlbiBkZWZpbmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5CisgICAgICogaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvbltdIGZpbmRNZXNzYWdlRGVzdGluYXRpb25zKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobWVzc2FnZURlc3RpbmF0aW9ucykgeworICAgICAgICAgICAgTWVzc2FnZURlc3RpbmF0aW9uIHJlc3VsdHNbXSA9CisgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VEZXN0aW5hdGlvblttZXNzYWdlRGVzdGluYXRpb25zLnNpemUoKV07CisgICAgICAgICAgICByZXR1cm4gKChNZXNzYWdlRGVzdGluYXRpb25bXSkKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZURlc3RpbmF0aW9ucy52YWx1ZXMoKS50b0FycmF5KHJlc3VsdHMpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBpZiBhbnk7CisgICAgICogb3RoZXJ3aXNlLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBkZXNpcmVkIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvblJlZgorICAgICAgICBmaW5kTWVzc2FnZURlc3RpbmF0aW9uUmVmKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuIG5hbWluZ1Jlc291cmNlcy5maW5kTWVzc2FnZURlc3RpbmF0aW9uUmVmKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBkZWZpbmVkIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmcyBmb3IgdGhpcyB3ZWIKKyAgICAgKiBhcHBsaWNhdGlvbi4gIElmIG5vbmUgaGF2ZSBiZWVuIGRlZmluZWQsIGEgemVyby1sZW5ndGggYXJyYXkKKyAgICAgKiBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uUmVmW10KKyAgICAgICAgZmluZE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7CisKKyAgICAgICAgcmV0dXJuIG5hbWluZ1Jlc291cmNlcy5maW5kTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1JTUUgdHlwZSB0byB3aGljaCB0aGUgc3BlY2lmaWVkIGV4dGVuc2lvbiBpcyBtYXBwZWQsCisgICAgICogaWYgYW55OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGV4dGVuc2lvbiBFeHRlbnNpb24gdG8gbWFwIHRvIGEgTUlNRSB0eXBlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaW5kTWltZU1hcHBpbmcoU3RyaW5nIGV4dGVuc2lvbikgeworCisgICAgICAgIHJldHVybiAoKFN0cmluZykgbWltZU1hcHBpbmdzLmdldChleHRlbnNpb24pKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBleHRlbnNpb25zIGZvciB3aGljaCBNSU1FIG1hcHBpbmdzIGFyZSBkZWZpbmVkLiAgSWYgdGhlcmUKKyAgICAgKiBhcmUgbm9uZSwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZE1pbWVNYXBwaW5ncygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1pbWVNYXBwaW5ncykgeworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9IG5ldyBTdHJpbmdbbWltZU1hcHBpbmdzLnNpemUoKV07CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAoKFN0cmluZ1tdKSBtaW1lTWFwcGluZ3Mua2V5U2V0KCkudG9BcnJheShyZXN1bHRzKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBjb250ZXh0IGluaXRpYWxpemF0aW9uCisgICAgICogcGFyYW1ldGVyIG5hbWUsIGlmIGFueTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGZpbmRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFN0cmluZykgcGFyYW1ldGVycy5nZXQobmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIGRlZmluZWQgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzCisgICAgICogZm9yIHRoaXMgQ29udGV4dC4gIElmIG5vIHBhcmFtZXRlcnMgYXJlIGRlZmluZWQsIGEgemVyby1sZW5ndGgKKyAgICAgKiBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZFBhcmFtZXRlcnMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChwYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID0gbmV3IFN0cmluZ1twYXJhbWV0ZXJzLnNpemUoKV07CisgICAgICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcGFyYW1ldGVycy5rZXlTZXQoKS50b0FycmF5KHJlc3VsdHMpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGb3IgdGhlIGdpdmVuIHNlY3VyaXR5IHJvbGUgKGFzIHVzZWQgYnkgYW4gYXBwbGljYXRpb24pLCByZXR1cm4gdGhlCisgICAgICogY29ycmVzcG9uZGluZyByb2xlIG5hbWUgKGFzIGRlZmluZWQgYnkgdGhlIHVuZGVybHlpbmcgUmVhbG0pIGlmIHRoZXJlCisgICAgICogaXMgb25lLiAgT3RoZXJ3aXNlLCByZXR1cm4gdGhlIHNwZWNpZmllZCByb2xlIHVuY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFNlY3VyaXR5IHJvbGUgdG8gbWFwCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaW5kUm9sZU1hcHBpbmcoU3RyaW5nIHJvbGUpIHsKKworICAgICAgICBTdHJpbmcgcmVhbFJvbGUgPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKHJvbGVNYXBwaW5ncykgeworICAgICAgICAgICAgcmVhbFJvbGUgPSAoU3RyaW5nKSByb2xlTWFwcGluZ3MuZ2V0KHJvbGUpOworICAgICAgICB9CisgICAgICAgIGlmIChyZWFsUm9sZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChyZWFsUm9sZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAocm9sZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIHNlY3VyaXR5IHJvbGUgaXMgZGVmaW5lZAorICAgICAqIGZvciB0aGlzIGFwcGxpY2F0aW9uOyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFNlY3VyaXR5IHJvbGUgdG8gdmVyaWZ5CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZmluZFNlY3VyaXR5Um9sZShTdHJpbmcgcm9sZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoc2VjdXJpdHlSb2xlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWN1cml0eVJvbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHJvbGUuZXF1YWxzKHNlY3VyaXR5Um9sZXNbaV0pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgZm9yIHRoaXMgYXBwbGljYXRpb24uICBJZiBub25lCisgICAgICogaGF2ZSBiZWVuIGRlZmluZWQsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRTZWN1cml0eVJvbGVzKCkgeworCisgICAgICAgIHJldHVybiAoc2VjdXJpdHlSb2xlcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VydmxldCBuYW1lIG1hcHBlZCBieSB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gKGlmIGFueSk7CisgICAgICogb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIFBhdHRlcm4gZm9yIHdoaWNoIGEgbWFwcGluZyBpcyByZXF1ZXN0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGZpbmRTZXJ2bGV0TWFwcGluZyhTdHJpbmcgcGF0dGVybikgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoc2VydmxldE1hcHBpbmdzKSB7CisgICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIHNlcnZsZXRNYXBwaW5ncy5nZXQocGF0dGVybikpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGF0dGVybnMgb2YgYWxsIGRlZmluZWQgc2VydmxldCBtYXBwaW5ncyBmb3IgdGhpcworICAgICAqIENvbnRleHQuICBJZiBubyBtYXBwaW5ncyBhcmUgZGVmaW5lZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZFNlcnZsZXRNYXBwaW5ncygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcnZsZXRNYXBwaW5ncykgeworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9IG5ldyBTdHJpbmdbc2VydmxldE1hcHBpbmdzLnNpemUoKV07CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICgoU3RyaW5nW10pIHNlcnZsZXRNYXBwaW5ncy5rZXlTZXQoKS50b0FycmF5KHJlc3VsdHMpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbnRleHQtcmVsYXRpdmUgVVJJIG9mIHRoZSBlcnJvciBwYWdlIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogSFRUUCBzdGF0dXMgY29kZSwgaWYgYW55OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXR1cyBIVFRQIHN0YXR1cyBjb2RlIHRvIGxvb2sgdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGZpbmRTdGF0dXNQYWdlKGludCBzdGF0dXMpIHsKKworICAgICAgICByZXR1cm4gKChTdHJpbmcpIHN0YXR1c1BhZ2VzLmdldChuZXcgSW50ZWdlcihzdGF0dXMpKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIEhUVFAgc3RhdHVzIGNvZGVzIGZvciB3aGljaCBlcnJvciBwYWdlcyBoYXZlCisgICAgICogYmVlbiBzcGVjaWZpZWQuICBJZiBub25lIGFyZSBzcGVjaWZpZWQsIGEgemVyby1sZW5ndGggYXJyYXkKKyAgICAgKiBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50W10gZmluZFN0YXR1c1BhZ2VzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoc3RhdHVzUGFnZXMpIHsKKyAgICAgICAgICAgIGludCByZXN1bHRzW10gPSBuZXcgaW50W3N0YXR1c1BhZ2VzLnNpemUoKV07CisgICAgICAgICAgICBJdGVyYXRvciBlbGVtZW50cyA9IHN0YXR1c1BhZ2VzLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoZWxlbWVudHMuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIHJlc3VsdHNbaSsrXSA9ICgoSW50ZWdlcikgZWxlbWVudHMubmV4dCgpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIChyZXN1bHRzKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgbG9jYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgdGFnbGliCisgICAgICogVVJJLCBpZiBhbnk7IG90aGVyd2lzZSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBVUkksIHJlbGF0aXZlIHRvIHRoZSB3ZWIueG1sIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGZpbmRUYWdsaWIoU3RyaW5nIHVyaSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAodGFnbGlicykgeworICAgICAgICAgICAgcmV0dXJuICgoU3RyaW5nKSB0YWdsaWJzLmdldCh1cmkpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFVSSXMgb2YgYWxsIHRhZyBsaWJyYXJpZXMgZm9yIHdoaWNoIGEgdGFnIGxpYnJhcnkKKyAgICAgKiBkZXNjcmlwdG9yIGxvY2F0aW9uIGhhcyBiZWVuIHNwZWNpZmllZC4gIElmIG5vbmUgYXJlIHNwZWNpZmllZCwKKyAgICAgKiBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kVGFnbGlicygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRhZ2xpYnMpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW3RhZ2xpYnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSB0YWdsaWJzLmtleVNldCgpLnRvQXJyYXkocmVzdWx0cykpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIHdlbGNvbWUgZmlsZSBpcyBkZWZpbmVkCisgICAgICogZm9yIHRoaXMgQ29udGV4dDsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBXZWxjb21lIGZpbGUgdG8gdmVyaWZ5CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZmluZFdlbGNvbWVGaWxlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkICh3ZWxjb21lRmlsZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2VsY29tZUZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKHdlbGNvbWVGaWxlc1tpXSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIHdhdGNoZWQgcmVzb3VyY2VzIGZvciB0aGlzIENvbnRleHQuIElmIG5vbmUgYXJlIAorICAgICAqIGRlZmluZWQsIGEgemVybyBsZW5ndGggYXJyYXkgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZFdhdGNoZWRSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiB3YXRjaGVkUmVzb3VyY2VzOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiB3ZWxjb21lIGZpbGVzIGRlZmluZWQgZm9yIHRoaXMgQ29udGV4dC4gIElmIG5vbmUgYXJlCisgICAgICogZGVmaW5lZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZFdlbGNvbWVGaWxlcygpIHsKKworICAgICAgICByZXR1cm4gKHdlbGNvbWVGaWxlcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIExpZmVjeWNsZUxpc3RlbmVyIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvCisgICAgICogbmV3bHkgY3JlYXRlZCBXcmFwcGVycyBhdXRvbWF0aWNhbGx5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kV3JhcHBlckxpZmVjeWNsZXMoKSB7CisKKyAgICAgICAgcmV0dXJuICh3cmFwcGVyTGlmZWN5Y2xlcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIENvbnRhaW5lckxpc3RlbmVyIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvCisgICAgICogbmV3bHkgY3JlYXRlZCBXcmFwcGVycyBhdXRvbWF0aWNhbGx5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kV3JhcHBlckxpc3RlbmVycygpIHsKKworICAgICAgICByZXR1cm4gKHdyYXBwZXJMaXN0ZW5lcnMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWxvYWQgdGhpcyB3ZWIgYXBwbGljYXRpb24sIGlmIHJlbG9hZGluZyBpcyBzdXBwb3J0ZWQuCisgICAgICogPHA+CisgICAgICogPGI+SU1QTEVNRU5UQVRJT04gTk9URTwvYj46ICBUaGlzIG1ldGhvZCBpcyBkZXNpZ25lZCB0byBkZWFsIHdpdGgKKyAgICAgKiByZWxvYWRzIHJlcXVpcmVkIGJ5IGNoYW5nZXMgdG8gY2xhc3NlcyBpbiB0aGUgdW5kZXJseWluZyByZXBvc2l0b3JpZXMKKyAgICAgKiBvZiBvdXIgY2xhc3MgbG9hZGVyLiAgSXQgZG9lcyBub3QgaGFuZGxlIGNoYW5nZXMgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbgorICAgICAqIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIElmIHRoYXQgaGFzIG9jY3VycmVkLCB5b3Ugc2hvdWxkIHN0b3AgdGhpcworICAgICAqIENvbnRleHQgYW5kIGNyZWF0ZSAoYW5kIHN0YXJ0KSBhIG5ldyBDb250ZXh0IGluc3RhbmNlIGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+cmVsb2FkYWJsZTwvY29kZT4KKyAgICAgKiAgcHJvcGVydHkgaXMgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVsb2FkKCkgeworCisgICAgICAgIC8vIFZhbGlkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAoIXN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiY29udGFpbmVyQmFzZS5ub3RTdGFydGVkIiwgbG9nTmFtZSgpKSk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHJlbG9hZGluZyBpcyBlbmFibGVkCisgICAgICAgIC8vICAgICAgaWYgKCFyZWxvYWRhYmxlKQorICAgICAgICAvLyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgIC8vICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQubm90UmVsb2FkYWJsZSIpKTsKKyAgICAgICAgaWYobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LnJlbG9hZGluZ1N0YXJ0ZWQiKSk7CisKKyAgICAgICAgLy8gU3RvcCBhY2NlcHRpbmcgcmVxdWVzdHMgdGVtcG9yYXJpbHkKKyAgICAgICAgc2V0UGF1c2VkKHRydWUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQuc3RvcHBpbmdDb250ZXh0IiksIGUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0YXJ0KCk7CisgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQuc3RhcnRpbmdDb250ZXh0IiksIGUpOworICAgICAgICB9CisKKyAgICAgICAgc2V0UGF1c2VkKGZhbHNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYXBwbGljYXRpb24gbGlzdGVuZXIgY2xhc3MgZnJvbSB0aGUgc2V0IG9mCisgICAgICogbGlzdGVuZXJzIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFwcGxpY2F0aW9uTGlzdGVuZXIoU3RyaW5nIGxpc3RlbmVyKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChhcHBsaWNhdGlvbkxpc3RlbmVycykgeworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyB3ZWxjb21lIGZpbGUgaXMgY3VycmVudGx5IHByZXNlbnQKKyAgICAgICAgICAgIGludCBuID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFwcGxpY2F0aW9uTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGFwcGxpY2F0aW9uTGlzdGVuZXJzW2ldLmVxdWFscyhsaXN0ZW5lcikpIHsKKyAgICAgICAgICAgICAgICAgICAgbiA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNvbnN0cmFpbnQKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW2FwcGxpY2F0aW9uTGlzdGVuZXJzLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcHBsaWNhdGlvbkxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpICE9IG4pCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaisrXSA9IGFwcGxpY2F0aW9uTGlzdGVuZXJzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXBwbGljYXRpb25MaXN0ZW5lcnMgPSByZXN1bHRzOworCisgICAgICAgIH0KKworICAgICAgICAvLyBJbmZvcm0gaW50ZXJlc3RlZCBsaXN0ZW5lcnMKKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJyZW1vdmVBcHBsaWNhdGlvbkxpc3RlbmVyIiwgbGlzdGVuZXIpOworCisgICAgICAgIC8vIEZJWE1FIC0gYmVoYXZpb3IgaWYgYWxyZWFkeSBzdGFydGVkPworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGFwcGxpY2F0aW9uIHBhcmFtZXRlciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBmcm9tCisgICAgICogdGhlIHNldCBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHBhcmFtZXRlciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBcHBsaWNhdGlvblBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoYXBwbGljYXRpb25QYXJhbWV0ZXJzKSB7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIHBhcmFtZXRlciBpcyBjdXJyZW50bHkgcHJlc2VudAorICAgICAgICAgICAgaW50IG4gPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXBwbGljYXRpb25QYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGFwcGxpY2F0aW9uUGFyYW1ldGVyc1tpXS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIG4gPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uUGFyYW1ldGVyIHJlc3VsdHNbXSA9CisgICAgICAgICAgICAgICAgbmV3IEFwcGxpY2F0aW9uUGFyYW1ldGVyW2FwcGxpY2F0aW9uUGFyYW1ldGVycy5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXBwbGljYXRpb25QYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gbikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tqKytdID0gYXBwbGljYXRpb25QYXJhbWV0ZXJzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXBwbGljYXRpb25QYXJhbWV0ZXJzID0gcmVzdWx0czsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5mb3JtIGludGVyZXN0ZWQgbGlzdGVuZXJzCisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgicmVtb3ZlQXBwbGljYXRpb25QYXJhbWV0ZXIiLCBuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgY2hpbGQgQ29udGFpbmVyLCBvbmx5IGlmIHRoZSBwcm9wb3NlZCBjaGlsZCBpcyBhbiBpbXBsZW1lbnRhdGlvbgorICAgICAqIG9mIFdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGQgQ2hpbGQgY29udGFpbmVyIHRvIGJlIGFkZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJvcG9zZWQgY29udGFpbmVyIGlzCisgICAgICogIG5vdCBhbiBpbXBsZW1lbnRhdGlvbiBvZiBXcmFwcGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoQ29udGFpbmVyIGNoaWxkKSB7CisKKyAgICAgICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBXcmFwcGVyKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5ub3RXcmFwcGVyIikpOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIucmVtb3ZlQ2hpbGQoY2hpbGQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBzZWN1cml0eSBjb25zdHJhaW50IGZyb20gdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uc3RyYWludCBDb25zdHJhaW50IHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBjb25zdHJhaW50KSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChjb25zdHJhaW50cykgeworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBjb25zdHJhaW50IGlzIGN1cnJlbnRseSBwcmVzZW50CisgICAgICAgICAgICBpbnQgbiA9IC0xOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChjb25zdHJhaW50c1tpXS5lcXVhbHMoY29uc3RyYWludCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbiA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNvbnN0cmFpbnQKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIFNlY3VyaXR5Q29uc3RyYWludCByZXN1bHRzW10gPQorICAgICAgICAgICAgICAgIG5ldyBTZWN1cml0eUNvbnN0cmFpbnRbY29uc3RyYWludHMubGVuZ3RoIC0gMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gbikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tqKytdID0gY29uc3RyYWludHNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdHJhaW50cyA9IHJlc3VsdHM7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluZm9ybSBpbnRlcmVzdGVkIGxpc3RlbmVycworICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoInJlbW92ZUNvbnN0cmFpbnQiLCBjb25zdHJhaW50KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBlcnJvciBwYWdlIGZvciB0aGUgc3BlY2lmaWVkIGVycm9yIGNvZGUgb3IKKyAgICAgKiBKYXZhIGxhbmd1YWdlIGV4Y2VwdGlvbiwgaWYgaXQgZXhpc3RzOyBvdGhlcndpc2UsIG5vIGFjdGlvbiBpcyB0YWtlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvclBhZ2UgVGhlIGVycm9yIHBhZ2UgZGVmaW5pdGlvbiB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRXJyb3JQYWdlKEVycm9yUGFnZSBlcnJvclBhZ2UpIHsKKworICAgICAgICBTdHJpbmcgZXhjZXB0aW9uVHlwZSA9IGVycm9yUGFnZS5nZXRFeGNlcHRpb25UeXBlKCk7CisgICAgICAgIGlmIChleGNlcHRpb25UeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZXhjZXB0aW9uUGFnZXMpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb25QYWdlcy5yZW1vdmUoZXhjZXB0aW9uVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHN0YXR1c1BhZ2VzKSB7CisgICAgICAgICAgICAgICAgaWYgKGVycm9yUGFnZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5va0Vycm9yUGFnZSA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1c1BhZ2VzLnJlbW92ZShuZXcgSW50ZWdlcihlcnJvclBhZ2UuZ2V0RXJyb3JDb2RlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoInJlbW92ZUVycm9yUGFnZSIsIGVycm9yUGFnZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGZpbHRlciBkZWZpbml0aW9uIGZyb20gdGhpcyBDb250ZXh0LCBpZiBpdCBleGlzdHM7CisgICAgICogb3RoZXJ3aXNlLCBubyBhY3Rpb24gaXMgdGFrZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyRGVmIEZpbHRlciBkZWZpbml0aW9uIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVGaWx0ZXJEZWYoRmlsdGVyRGVmIGZpbHRlckRlZikgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoZmlsdGVyRGVmcykgeworICAgICAgICAgICAgZmlsdGVyRGVmcy5yZW1vdmUoZmlsdGVyRGVmLmdldEZpbHRlck5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJyZW1vdmVGaWx0ZXJEZWYiLCBmaWx0ZXJEZWYpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBmaWx0ZXIgbWFwcGluZyBmcm9tIHRoaXMgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJNYXAgVGhlIGZpbHRlciBtYXBwaW5nIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVGaWx0ZXJNYXAoRmlsdGVyTWFwIGZpbHRlck1hcCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoZmlsdGVyTWFwcykgeworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBmaWx0ZXIgbWFwcGluZyBpcyBjdXJyZW50bHkgcHJlc2VudAorICAgICAgICAgICAgaW50IG4gPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVyTWFwcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJNYXBzW2ldID09IGZpbHRlck1hcCkgeworICAgICAgICAgICAgICAgICAgICBuID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZmlsdGVyIG1hcHBpbmcKKyAgICAgICAgICAgIEZpbHRlck1hcCByZXN1bHRzW10gPSBuZXcgRmlsdGVyTWFwW2ZpbHRlck1hcHMubGVuZ3RoIC0gMV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGZpbHRlck1hcHMsIDAsIHJlc3VsdHMsIDAsIG4pOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShmaWx0ZXJNYXBzLCBuICsgMSwgcmVzdWx0cywgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlck1hcHMubGVuZ3RoIC0gMSkgLSBuKTsKKyAgICAgICAgICAgIGZpbHRlck1hcHMgPSByZXN1bHRzOworCisgICAgICAgIH0KKworICAgICAgICAvLyBJbmZvcm0gaW50ZXJlc3RlZCBsaXN0ZW5lcnMKKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJyZW1vdmVGaWx0ZXJNYXAiLCBmaWx0ZXJNYXApOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBjbGFzcyBuYW1lIGZyb20gdGhlIHNldCBvZiBJbnN0YW5jZUxpc3RlbmVyIGNsYXNzZXMgdGhhdAorICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gbmV3bHkgY3JlYXRlZCBXcmFwcGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBDbGFzcyBuYW1lIG9mIGFuIEluc3RhbmNlTGlzdGVuZXIgY2xhc3MgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUluc3RhbmNlTGlzdGVuZXIoU3RyaW5nIGxpc3RlbmVyKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChpbnN0YW5jZUxpc3RlbmVycykgeworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyB3ZWxjb21lIGZpbGUgaXMgY3VycmVudGx5IHByZXNlbnQKKyAgICAgICAgICAgIGludCBuID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlTGlzdGVuZXJzW2ldLmVxdWFscyhsaXN0ZW5lcikpIHsKKyAgICAgICAgICAgICAgICAgICAgbiA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNvbnN0cmFpbnQKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW2luc3RhbmNlTGlzdGVuZXJzLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZUxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpICE9IG4pCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaisrXSA9IGluc3RhbmNlTGlzdGVuZXJzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5zdGFuY2VMaXN0ZW5lcnMgPSByZXN1bHRzOworCisgICAgICAgIH0KKworICAgICAgICAvLyBJbmZvcm0gaW50ZXJlc3RlZCBsaXN0ZW5lcnMKKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJyZW1vdmVJbnN0YW5jZUxpc3RlbmVyIiwgbGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IG1lc3NhZ2UgZGVzdGluYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VEZXN0aW5hdGlvbihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobWVzc2FnZURlc3RpbmF0aW9ucykgeworICAgICAgICAgICAgbWVzc2FnZURlc3RpbmF0aW9ucy5yZW1vdmUobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJyZW1vdmVNZXNzYWdlRGVzdGluYXRpb24iLCBuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIG5hbWluZ1Jlc291cmNlcy5yZW1vdmVNZXNzYWdlRGVzdGluYXRpb25SZWYobmFtZSk7CisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgicmVtb3ZlTWVzc2FnZURlc3RpbmF0aW9uUmVmIiwgbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgTUlNRSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGV4dGVuc2lvbiwgaWYgaXQgZXhpc3RzOworICAgICAqIG90aGVyd2lzZSwgbm8gYWN0aW9uIGlzIHRha2VuLgorICAgICAqCisgICAgICogQHBhcmFtIGV4dGVuc2lvbiBFeHRlbnNpb24gdG8gcmVtb3ZlIHRoZSBtYXBwaW5nIGZvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1pbWVNYXBwaW5nKFN0cmluZyBleHRlbnNpb24pIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1pbWVNYXBwaW5ncykgeworICAgICAgICAgICAgbWltZU1hcHBpbmdzLnJlbW92ZShleHRlbnNpb24pOworICAgICAgICB9CisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgicmVtb3ZlTWltZU1hcHBpbmciLCBleHRlbnNpb24pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG5hbWUsIGlmIGl0IGV4aXN0czsgb3RoZXJ3aXNlLCBubyBhY3Rpb24gaXMgdGFrZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChwYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBwYXJhbWV0ZXJzLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoInJlbW92ZVBhcmFtZXRlciIsIG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIGZvciB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFNlY3VyaXR5IHJvbGUgKGFzIHVzZWQgaW4gdGhlIGFwcGxpY2F0aW9uKSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSb2xlTWFwcGluZyhTdHJpbmcgcm9sZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocm9sZU1hcHBpbmdzKSB7CisgICAgICAgICAgICByb2xlTWFwcGluZ3MucmVtb3ZlKHJvbGUpOworICAgICAgICB9CisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgicmVtb3ZlUm9sZU1hcHBpbmciLCByb2xlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBzZWN1cml0eSByb2xlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgU2VjdXJpdHkgcm9sZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTZWN1cml0eVJvbGUoU3RyaW5nIHJvbGUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHNlY3VyaXR5Um9sZXMpIHsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgc2VjdXJpdHkgcm9sZSBpcyBjdXJyZW50bHkgcHJlc2VudAorICAgICAgICAgICAgaW50IG4gPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VjdXJpdHlSb2xlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChyb2xlLmVxdWFscyhzZWN1cml0eVJvbGVzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICBuID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgc2VjdXJpdHkgcm9sZQorICAgICAgICAgICAgaW50IGogPSAwOworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9IG5ldyBTdHJpbmdbc2VjdXJpdHlSb2xlcy5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VjdXJpdHlSb2xlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpICE9IG4pCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaisrXSA9IHNlY3VyaXR5Um9sZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZWN1cml0eVJvbGVzID0gcmVzdWx0czsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5mb3JtIGludGVyZXN0ZWQgbGlzdGVuZXJzCisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgicmVtb3ZlU2VjdXJpdHlSb2xlIiwgcm9sZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgc2VydmxldCBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIHBhdHRlcm4sIGlmIGl0IGV4aXN0czsKKyAgICAgKiBvdGhlcndpc2UsIG5vIGFjdGlvbiBpcyB0YWtlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIFVSTCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlcnZsZXRNYXBwaW5nKFN0cmluZyBwYXR0ZXJuKSB7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcnZsZXRNYXBwaW5ncykgeworICAgICAgICAgICAgbmFtZSA9IChTdHJpbmcpIHNlcnZsZXRNYXBwaW5ncy5yZW1vdmUocGF0dGVybik7CisgICAgICAgIH0KKyAgICAgICAgV3JhcHBlciB3cmFwcGVyID0gKFdyYXBwZXIpIGZpbmRDaGlsZChuYW1lKTsKKyAgICAgICAgaWYoIHdyYXBwZXIgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHdyYXBwZXIucmVtb3ZlTWFwcGluZyhwYXR0ZXJuKTsKKyAgICAgICAgfQorICAgICAgICBtYXBwZXIucmVtb3ZlV3JhcHBlcihwYXR0ZXJuKTsKKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJyZW1vdmVTZXJ2bGV0TWFwcGluZyIsIHBhdHRlcm4pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHRhZyBsaWJyYXJ5IGxvY2F0aW9uIGZvcnRoZSBzcGVjaWZpZWQgdGFnIGxpYnJhcnkgVVJJLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBVUkksIHJlbGF0aXZlIHRvIHRoZSB3ZWIueG1sIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVUYWdsaWIoU3RyaW5nIHVyaSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAodGFnbGlicykgeworICAgICAgICAgICAgdGFnbGlicy5yZW1vdmUodXJpKTsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoInJlbW92ZVRhZ2xpYiIsIHVyaSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCB3YXRjaGVkIHJlc291cmNlIG5hbWUgZnJvbSB0aGUgbGlzdCBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGlzIENvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgd2F0Y2hlZCByZXNvdXJjZSB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlV2F0Y2hlZFJlc291cmNlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIAorICAgICAgICBzeW5jaHJvbml6ZWQgKHdhdGNoZWRSZXNvdXJjZXMpIHsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgd2F0Y2hlZCByZXNvdXJjZSBpcyBjdXJyZW50bHkgcHJlc2VudAorICAgICAgICAgICAgaW50IG4gPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2F0Y2hlZFJlc291cmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh3YXRjaGVkUmVzb3VyY2VzW2ldLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBuID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgd2F0Y2hlZCByZXNvdXJjZQorICAgICAgICAgICAgaW50IGogPSAwOworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9IG5ldyBTdHJpbmdbd2F0Y2hlZFJlc291cmNlcy5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2F0Y2hlZFJlc291cmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpICE9IG4pCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaisrXSA9IHdhdGNoZWRSZXNvdXJjZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3YXRjaGVkUmVzb3VyY2VzID0gcmVzdWx0czsKKworICAgICAgICB9CisKKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJyZW1vdmVXYXRjaGVkUmVzb3VyY2UiLCBuYW1lKTsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCB3ZWxjb21lIGZpbGUgbmFtZSBmcm9tIHRoZSBsaXN0IHJlY29nbml6ZWQKKyAgICAgKiBieSB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB3ZWxjb21lIGZpbGUgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVdlbGNvbWVGaWxlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkICh3ZWxjb21lRmlsZXMpIHsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgd2VsY29tZSBmaWxlIGlzIGN1cnJlbnRseSBwcmVzZW50CisgICAgICAgICAgICBpbnQgbiA9IC0xOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWxjb21lRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAod2VsY29tZUZpbGVzW2ldLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBuID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgY29uc3RyYWludAorICAgICAgICAgICAgaW50IGogPSAwOworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9IG5ldyBTdHJpbmdbd2VsY29tZUZpbGVzLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWxjb21lRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBuKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2orK10gPSB3ZWxjb21lRmlsZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3ZWxjb21lRmlsZXMgPSByZXN1bHRzOworCisgICAgICAgIH0KKworICAgICAgICAvLyBJbmZvcm0gaW50ZXJlc3RlZCBsaXN0ZW5lcnMKKyAgICAgICAgcG9zdFdlbGNvbWVGaWxlcygpOworICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoInJlbW92ZVdlbGNvbWVGaWxlIiwgbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGNsYXNzIG5hbWUgZnJvbSB0aGUgc2V0IG9mIExpZmVjeWNsZUxpc3RlbmVyIGNsYXNzZXMgdGhhdAorICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gbmV3bHkgY3JlYXRlZCBXcmFwcGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBDbGFzcyBuYW1lIG9mIGEgTGlmZWN5Y2xlTGlzdGVuZXIgY2xhc3MgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVdyYXBwZXJMaWZlY3ljbGUoU3RyaW5nIGxpc3RlbmVyKSB7CisKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHdyYXBwZXJMaWZlY3ljbGVzKSB7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIHdlbGNvbWUgZmlsZSBpcyBjdXJyZW50bHkgcHJlc2VudAorICAgICAgICAgICAgaW50IG4gPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3JhcHBlckxpZmVjeWNsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAod3JhcHBlckxpZmVjeWNsZXNbaV0uZXF1YWxzKGxpc3RlbmVyKSkgeworICAgICAgICAgICAgICAgICAgICBuID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgY29uc3RyYWludAorICAgICAgICAgICAgaW50IGogPSAwOworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9IG5ldyBTdHJpbmdbd3JhcHBlckxpZmVjeWNsZXMubGVuZ3RoIC0gMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyYXBwZXJMaWZlY3ljbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gbikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tqKytdID0gd3JhcHBlckxpZmVjeWNsZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cmFwcGVyTGlmZWN5Y2xlcyA9IHJlc3VsdHM7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluZm9ybSBpbnRlcmVzdGVkIGxpc3RlbmVycworICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoInJlbW92ZVdyYXBwZXJMaWZlY3ljbGUiLCBsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGNsYXNzIG5hbWUgZnJvbSB0aGUgc2V0IG9mIENvbnRhaW5lckxpc3RlbmVyIGNsYXNzZXMgdGhhdAorICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gbmV3bHkgY3JlYXRlZCBXcmFwcGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBDbGFzcyBuYW1lIG9mIGEgQ29udGFpbmVyTGlzdGVuZXIgY2xhc3MgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVdyYXBwZXJMaXN0ZW5lcihTdHJpbmcgbGlzdGVuZXIpIHsKKworCisgICAgICAgIHN5bmNocm9uaXplZCAod3JhcHBlckxpc3RlbmVycykgeworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyB3ZWxjb21lIGZpbGUgaXMgY3VycmVudGx5IHByZXNlbnQKKyAgICAgICAgICAgIGludCBuID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyYXBwZXJMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAod3JhcHBlckxpc3RlbmVyc1tpXS5lcXVhbHMobGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIG4gPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBjb25zdHJhaW50CisgICAgICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID0gbmV3IFN0cmluZ1t3cmFwcGVyTGlzdGVuZXJzLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3cmFwcGVyTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gbikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tqKytdID0gd3JhcHBlckxpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyYXBwZXJMaXN0ZW5lcnMgPSByZXN1bHRzOworCisgICAgICAgIH0KKworICAgICAgICAvLyBJbmZvcm0gaW50ZXJlc3RlZCBsaXN0ZW5lcnMKKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJyZW1vdmVXcmFwcGVyTGlzdGVuZXIiLCBsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGN1bXVsYXRpdmUgcHJvY2Vzc2luZyB0aW1lcyBvZiBhbGwgc2VydmxldHMgaW4gdGhpcworICAgICAqIFN0YW5kYXJkQ29udGV4dC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQ3VtdWxhdGl2ZSBwcm9jZXNzaW5nIHRpbWVzIG9mIGFsbCBzZXJ2bGV0cyBpbiB0aGlzCisgICAgICogU3RhbmRhcmRDb250ZXh0CisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0UHJvY2Vzc2luZ1RpbWUoKSB7CisgICAgICAgIAorICAgICAgICBsb25nIHJlc3VsdCA9IDA7CisKKyAgICAgICAgQ29udGFpbmVyW10gY2hpbGRyZW4gPSBmaW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciggaW50IGk9MDsgaTwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICgoU3RhbmRhcmRXcmFwcGVyKWNoaWxkcmVuW2ldKS5nZXRQcm9jZXNzaW5nVGltZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgYW5kIGluaXRpYWxpemUgdGhlIHNldCBvZiBmaWx0ZXJzIGZvciB0aGlzIENvbnRleHQuCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCBmaWx0ZXIgaW5pdGlhbGl6YXRpb24gY29tcGxldGVkCisgICAgICogc3VjY2Vzc2Z1bGx5LCBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGZpbHRlclN0YXJ0KCkgeworCisgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlN0YXJ0aW5nIGZpbHRlcnMiKTsKKyAgICAgICAgLy8gSW5zdGFudGlhdGUgYW5kIHJlY29yZCBhIEZpbHRlckNvbmZpZyBmb3IgZWFjaCBkZWZpbmVkIGZpbHRlcgorICAgICAgICBib29sZWFuIG9rID0gdHJ1ZTsKKyAgICAgICAgc3luY2hyb25pemVkIChmaWx0ZXJDb25maWdzKSB7CisgICAgICAgICAgICBmaWx0ZXJDb25maWdzLmNsZWFyKCk7CisgICAgICAgICAgICBJdGVyYXRvciBuYW1lcyA9IGZpbHRlckRlZnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIiBTdGFydGluZyBmaWx0ZXIgJyIgKyBuYW1lICsgIiciKTsKKyAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbkZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlckNvbmZpZyA9IG5ldyBBcHBsaWNhdGlvbkZpbHRlckNvbmZpZworICAgICAgICAgICAgICAgICAgICAgICh0aGlzLCAoRmlsdGVyRGVmKSBmaWx0ZXJEZWZzLmdldChuYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlckNvbmZpZ3MucHV0KG5hbWUsIGZpbHRlckNvbmZpZyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5maWx0ZXJTdGFydCIsIG5hbWUpLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKG9rKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmluYWxpemUgYW5kIHJlbGVhc2UgdGhlIHNldCBvZiBmaWx0ZXJzIGZvciB0aGlzIENvbnRleHQuCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCBmaWx0ZXIgZmluYWxpemF0aW9uIGNvbXBsZXRlZAorICAgICAqIHN1Y2Nlc3NmdWxseSwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBmaWx0ZXJTdG9wKCkgeworCisgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlN0b3BwaW5nIGZpbHRlcnMiKTsKKworICAgICAgICAvLyBSZWxlYXNlIGFsbCBGaWx0ZXIgYW5kIEZpbHRlckNvbmZpZyBpbnN0YW5jZXMKKyAgICAgICAgc3luY2hyb25pemVkIChmaWx0ZXJDb25maWdzKSB7CisgICAgICAgICAgICBJdGVyYXRvciBuYW1lcyA9IGZpbHRlckNvbmZpZ3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIiBTdG9wcGluZyBmaWx0ZXIgJyIgKyBuYW1lICsgIiciKTsKKyAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbkZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcgPQorICAgICAgICAgICAgICAgICAgKEFwcGxpY2F0aW9uRmlsdGVyQ29uZmlnKSBmaWx0ZXJDb25maWdzLmdldChuYW1lKTsKKyAgICAgICAgICAgICAgICBmaWx0ZXJDb25maWcucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsdGVyQ29uZmlncy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodHJ1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZpbmQgYW5kIHJldHVybiB0aGUgaW5pdGlhbGl6ZWQgPGNvZGU+RmlsdGVyQ29uZmlnPC9jb2RlPiBmb3IgdGhlCisgICAgICogc3BlY2lmaWVkIGZpbHRlciBuYW1lLCBpZiBhbnk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBkZXNpcmVkIGZpbHRlcgorICAgICAqLworICAgIHB1YmxpYyBGaWx0ZXJDb25maWcgZmluZEZpbHRlckNvbmZpZyhTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHJldHVybiAoKEZpbHRlckNvbmZpZykgZmlsdGVyQ29uZmlncy5nZXQobmFtZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgdGhlIHNldCBvZiBpbnN0YW50aWF0ZWQgYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzCisgICAgICogZm9yIHRoaXMgQ29udGV4dC4gIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgbGlzdGVuZXJzIHdyZQorICAgICAqIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseSwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBsaXN0ZW5lclN0YXJ0KCkgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29uZmlndXJpbmcgYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzIik7CisKKyAgICAgICAgLy8gSW5zdGFudGlhdGUgdGhlIHJlcXVpcmVkIGxpc3RlbmVycworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBnZXRMb2FkZXIoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICBTdHJpbmcgbGlzdGVuZXJzW10gPSBmaW5kQXBwbGljYXRpb25MaXN0ZW5lcnMoKTsKKyAgICAgICAgT2JqZWN0IHJlc3VsdHNbXSA9IG5ldyBPYmplY3RbbGlzdGVuZXJzLmxlbmd0aF07CisgICAgICAgIGJvb2xlYW4gb2sgPSB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCIgQ29uZmlndXJpbmcgZXZlbnQgbGlzdGVuZXIgY2xhc3MgJyIgKworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNbaV0gKyAiJyIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IGxvYWRlci5sb2FkQ2xhc3MobGlzdGVuZXJzW2ldKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzW2ldID0gY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LmFwcGxpY2F0aW9uTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyc1tpXSksIHQpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQuYXBwbGljYXRpb25Ta2lwcGVkIikpOworICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTb3J0IGxpc3RlbmVycyBpbiB0d28gYXJyYXlzCisgICAgICAgIEFycmF5TGlzdCBldmVudExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgQXJyYXlMaXN0IGxpZmVjeWNsZUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKHJlc3VsdHNbaV0gaW5zdGFuY2VvZiBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUxpc3RlbmVyKQorICAgICAgICAgICAgICAgIHx8IChyZXN1bHRzW2ldIGluc3RhbmNlb2YgU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVMaXN0ZW5lcikKKyAgICAgICAgICAgICAgICB8fCAocmVzdWx0c1tpXSBpbnN0YW5jZW9mIFNlcnZsZXRSZXF1ZXN0TGlzdGVuZXIpCisgICAgICAgICAgICAgICAgfHwgKHJlc3VsdHNbaV0gaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyKSkgeworICAgICAgICAgICAgICAgIGV2ZW50TGlzdGVuZXJzLmFkZChyZXN1bHRzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocmVzdWx0c1tpXSBpbnN0YW5jZW9mIFNlcnZsZXRDb250ZXh0TGlzdGVuZXIpCisgICAgICAgICAgICAgICAgfHwgKHJlc3VsdHNbaV0gaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkxpc3RlbmVyKSkgeworICAgICAgICAgICAgICAgIGxpZmVjeWNsZUxpc3RlbmVycy5hZGQocmVzdWx0c1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzZXRBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzKGV2ZW50TGlzdGVuZXJzLnRvQXJyYXkoKSk7CisgICAgICAgIHNldEFwcGxpY2F0aW9uTGlmZWN5Y2xlTGlzdGVuZXJzKGxpZmVjeWNsZUxpc3RlbmVycy50b0FycmF5KCkpOworCisgICAgICAgIC8vIFNlbmQgYXBwbGljYXRpb24gc3RhcnQgZXZlbnRzCisKKyAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiU2VuZGluZyBhcHBsaWNhdGlvbiBzdGFydCBldmVudHMiKTsKKworICAgICAgICBPYmplY3QgaW5zdGFuY2VzW10gPSBnZXRBcHBsaWNhdGlvbkxpZmVjeWNsZUxpc3RlbmVycygpOworICAgICAgICBpZiAoaW5zdGFuY2VzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG9rKTsKKyAgICAgICAgU2VydmxldENvbnRleHRFdmVudCBldmVudCA9CisgICAgICAgICAgbmV3IFNlcnZsZXRDb250ZXh0RXZlbnQoZ2V0U2VydmxldENvbnRleHQoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW5zdGFuY2VzW2ldID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoIShpbnN0YW5jZXNbaV0gaW5zdGFuY2VvZiBTZXJ2bGV0Q29udGV4dExpc3RlbmVyKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIFNlcnZsZXRDb250ZXh0TGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgIChTZXJ2bGV0Q29udGV4dExpc3RlbmVyKSBpbnN0YW5jZXNbaV07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgiYmVmb3JlQ29udGV4dEluaXRpYWxpemVkIiwgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNvbnRleHRJbml0aWFsaXplZChldmVudCk7CisgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZnRlckNvbnRleHRJbml0aWFsaXplZCIsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZnRlckNvbnRleHRJbml0aWFsaXplZCIsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQubGlzdGVuZXJTdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VzW2ldLmdldENsYXNzKCkuZ2V0TmFtZSgpKSwgdCk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG9rKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VuZCBhbiBhcHBsaWNhdGlvbiBzdG9wIGV2ZW50IHRvIGFsbCBpbnRlcmVzdGVkIGxpc3RlbmVycy4KKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWxsIGV2ZW50cyB3ZXJlIHNlbnQgc3VjY2Vzc2Z1bGx5LAorICAgICAqIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbGlzdGVuZXJTdG9wKCkgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VuZGluZyBhcHBsaWNhdGlvbiBzdG9wIGV2ZW50cyIpOworCisgICAgICAgIGJvb2xlYW4gb2sgPSB0cnVlOworICAgICAgICBPYmplY3QgbGlzdGVuZXJzW10gPSBnZXRBcHBsaWNhdGlvbkxpZmVjeWNsZUxpc3RlbmVycygpOworICAgICAgICBpZiAobGlzdGVuZXJzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG9rKTsKKyAgICAgICAgU2VydmxldENvbnRleHRFdmVudCBldmVudCA9CisgICAgICAgICAgbmV3IFNlcnZsZXRDb250ZXh0RXZlbnQoZ2V0U2VydmxldENvbnRleHQoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaiA9IChsaXN0ZW5lcnMubGVuZ3RoIC0gMSkgLSBpOworICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tqXSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCEobGlzdGVuZXJzW2pdIGluc3RhbmNlb2YgU2VydmxldENvbnRleHRMaXN0ZW5lcikpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBTZXJ2bGV0Q29udGV4dExpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAoU2VydmxldENvbnRleHRMaXN0ZW5lcikgbGlzdGVuZXJzW2pdOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImJlZm9yZUNvbnRleHREZXN0cm95ZWQiLCBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuY29udGV4dERlc3Ryb3llZChldmVudCk7CisgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZnRlckNvbnRleHREZXN0cm95ZWQiLCBsaXN0ZW5lcik7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgiYWZ0ZXJDb250ZXh0RGVzdHJveWVkIiwgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5saXN0ZW5lclN0b3AiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyc1tqXS5nZXRDbGFzcygpLmdldE5hbWUoKSksIHQpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzZXRBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzKG51bGwpOworICAgICAgICBzZXRBcHBsaWNhdGlvbkxpZmVjeWNsZUxpc3RlbmVycyhudWxsKTsKKworICAgICAgICByZXR1cm4gKG9rKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWxsb2NhdGUgcmVzb3VyY2VzLCBpbmNsdWRpbmcgcHJveHkuCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsbCwKKyAgICAgKiBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlc291cmNlc1N0YXJ0KCkgeworICAgICAgICBib29sZWFuIG9rID0gdHJ1ZTsKKworICAgICAgICBIYXNodGFibGUgZW52ID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBpZiAoZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZW52LnB1dChQcm94eURpckNvbnRleHQuSE9TVCwgZ2V0UGFyZW50KCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBCdWd6aWxsYSA0MDEzMzogaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00MDEzMworICAgICAgICAgICAgaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LnBhdGhSZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVudi5wdXQoUHJveHlEaXJDb250ZXh0LkNPTlRFWFQsIGdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBQcm94eURpckNvbnRleHQgcHJveHlEaXJDb250ZXh0ID0KKyAgICAgICAgICAgICAgICBuZXcgUHJveHlEaXJDb250ZXh0KGVudiwgd2ViYXBwUmVzb3VyY2VzKTsKKyAgICAgICAgICAgIGlmICh3ZWJhcHBSZXNvdXJjZXMgaW5zdGFuY2VvZiBGaWxlRGlyQ29udGV4dCkgeworICAgICAgICAgICAgICAgIGZpbGVzeXN0ZW1CYXNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgKChGaWxlRGlyQ29udGV4dCkgd2ViYXBwUmVzb3VyY2VzKS5zZXRDYXNlU2Vuc2l0aXZlCisgICAgICAgICAgICAgICAgICAgIChpc0Nhc2VTZW5zaXRpdmUoKSk7CisgICAgICAgICAgICAgICAgKChGaWxlRGlyQ29udGV4dCkgd2ViYXBwUmVzb3VyY2VzKS5zZXRBbGxvd0xpbmtpbmcKKyAgICAgICAgICAgICAgICAgICAgKGlzQWxsb3dMaW5raW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdlYmFwcFJlc291cmNlcyBpbnN0YW5jZW9mIEJhc2VEaXJDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgKChCYXNlRGlyQ29udGV4dCkgd2ViYXBwUmVzb3VyY2VzKS5zZXREb2NCYXNlKGdldEJhc2VQYXRoKCkpOworICAgICAgICAgICAgICAgICgoQmFzZURpckNvbnRleHQpIHdlYmFwcFJlc291cmNlcykuc2V0Q2FjaGVkCisgICAgICAgICAgICAgICAgICAgIChpc0NhY2hpbmdBbGxvd2VkKCkpOworICAgICAgICAgICAgICAgICgoQmFzZURpckNvbnRleHQpIHdlYmFwcFJlc291cmNlcykuc2V0Q2FjaGVUVEwoZ2V0Q2FjaGVUVEwoKSk7CisgICAgICAgICAgICAgICAgKChCYXNlRGlyQ29udGV4dCkgd2ViYXBwUmVzb3VyY2VzKS5zZXRDYWNoZU1heFNpemUKKyAgICAgICAgICAgICAgICAgICAgKGdldENhY2hlTWF4U2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAoKEJhc2VEaXJDb250ZXh0KSB3ZWJhcHBSZXNvdXJjZXMpLmFsbG9jYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBSZWdpc3RlciB0aGUgY2FjaGUgaW4gSk1YCisgICAgICAgICAgICBpZiAoaXNDYWNoaW5nQWxsb3dlZCgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSByZXNvdXJjZXNOYW1lID0gCisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKHRoaXMuZ2V0RG9tYWluKCkgKyAiOnR5cGU9Q2FjaGUsaG9zdD0iIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldEhvc3RuYW1lKCkgKyAiLHBhdGg9IiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKCIiLmVxdWFscyhnZXRQYXRoKCkpKT8iLyI6Z2V0UGF0aCgpKSk7CisgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkucmVnaXN0ZXJDb21wb25lbnQKKyAgICAgICAgICAgICAgICAgICAgKHByb3h5RGlyQ29udGV4dC5nZXRDYWNoZSgpLCByZXNvdXJjZXNOYW1lLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzID0gcHJveHlEaXJDb250ZXh0OworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LnJlc291cmNlc1N0YXJ0IiksIHQpOworICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAob2spOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZWFsbG9jYXRlIHJlc291cmNlcyBhbmQgZGVzdHJveSBwcm94eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZXNvdXJjZXNTdG9wKCkgeworCisgICAgICAgIGJvb2xlYW4gb2sgPSB0cnVlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSByZXNvdXJjZXMpLnN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHdlYmFwcFJlc291cmNlcyBpbnN0YW5jZW9mIEJhc2VEaXJDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICgoQmFzZURpckNvbnRleHQpIHdlYmFwcFJlc291cmNlcykucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBVbnJlZ2lzdGVyIHRoZSBjYWNoZSBpbiBKTVgKKyAgICAgICAgICAgICAgICBpZiAoaXNDYWNoaW5nQWxsb3dlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgcmVzb3VyY2VzTmFtZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdE5hbWUodGhpcy5nZXREb21haW4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOnR5cGU9Q2FjaGUsaG9zdD0iIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRIb3N0bmFtZSgpICsgIixwYXRoPSIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoIiIuZXF1YWxzKGdldFBhdGgoKSkpPyIvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmdldFBhdGgoKSkpOworICAgICAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgLnVucmVnaXN0ZXJDb21wb25lbnQocmVzb3VyY2VzTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LnJlc291cmNlc1N0b3AiKSwgdCk7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5yZXNvdXJjZXMgPSBudWxsOworCisgICAgICAgIHJldHVybiAob2spOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2FkIGFuZCBpbml0aWFsaXplIGFsbCBzZXJ2bGV0cyBtYXJrZWQgImxvYWQgb24gc3RhcnR1cCIgaW4gdGhlCisgICAgICogd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZHJlbiBBcnJheSBvZiB3cmFwcGVycyBmb3IgYWxsIGN1cnJlbnRseSBkZWZpbmVkCisgICAgICogIHNlcnZsZXRzIChpbmNsdWRpbmcgdGhvc2Ugbm90IGRlY2xhcmVkIGxvYWQgb24gc3RhcnR1cCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkT25TdGFydHVwKENvbnRhaW5lciBjaGlsZHJlbltdKSB7CisKKyAgICAgICAgLy8gQ29sbGVjdCAibG9hZCBvbiBzdGFydHVwIiBzZXJ2bGV0cyB0aGF0IG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQKKyAgICAgICAgVHJlZU1hcCBtYXAgPSBuZXcgVHJlZU1hcCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSAoV3JhcHBlcikgY2hpbGRyZW5baV07CisgICAgICAgICAgICBpbnQgbG9hZE9uU3RhcnR1cCA9IHdyYXBwZXIuZ2V0TG9hZE9uU3RhcnR1cCgpOworICAgICAgICAgICAgaWYgKGxvYWRPblN0YXJ0dXAgPCAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgSW50ZWdlciBrZXkgPSBuZXcgSW50ZWdlcihsb2FkT25TdGFydHVwKTsKKyAgICAgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCkgbWFwLmdldChrZXkpOworICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgbWFwLnB1dChrZXksIGxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdC5hZGQod3JhcHBlcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2FkIHRoZSBjb2xsZWN0ZWQgImxvYWQgb24gc3RhcnR1cCIgc2VydmxldHMKKyAgICAgICAgSXRlcmF0b3Iga2V5cyA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEludGVnZXIga2V5ID0gKEludGVnZXIpIGtleXMubmV4dCgpOworICAgICAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSAoQXJyYXlMaXN0KSBtYXAuZ2V0KGtleSk7CisgICAgICAgICAgICBJdGVyYXRvciB3cmFwcGVycyA9IGxpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlICh3cmFwcGVycy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSAoV3JhcHBlcikgd3JhcHBlcnMubmV4dCgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIubG9hZCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlcnZsZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5sb2FkRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpKSwgU3RhbmRhcmRXcmFwcGVyLmdldFJvb3RDYXVzZShlKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGxvYWQgZXJyb3JzIChpbmNsdWRpbmcgYSBzZXJ2bGV0IHRoYXQgdGhyb3dzCisgICAgICAgICAgICAgICAgICAgIC8vIFVuYXZhaWxhYmxlRXhjZXB0aW9uIGZyb20gdGh0IGluaXQoKSBtZXRob2QpIGFyZSBOT1QKKyAgICAgICAgICAgICAgICAgICAgLy8gZmF0YWwgdG8gYXBwbGljYXRpb24gc3RhcnR1cAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGlzIENvbnRleHQgY29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgYSBzdGFydHVwIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICAvL2lmIChsYXp5ICkgcmV0dXJuOworICAgICAgICBpZiAoc3RhcnRlZCkgeworICAgICAgICAgICAgaWYobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoImNvbnRhaW5lckJhc2UuYWxyZWFkeVN0YXJ0ZWQiLCBsb2dOYW1lKCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiggIWluaXRpYWxpemVkICkgeyAKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW5pdCgpOworICAgICAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24oIkVycm9yIGluaXRpYWxpemFpbmcgIiwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJTdGFydGluZyAiICsgKCIiLmVxdWFscyhnZXROYW1lKCkpID8gIlJPT1QiIDogZ2V0TmFtZSgpKSk7CisKKyAgICAgICAgLy8gU2V0IEpNWCBvYmplY3QgbmFtZSBmb3IgcHJvcGVyIHBpcGVsaW5lIHJlZ2lzdHJhdGlvbgorICAgICAgICBwcmVSZWdpc3RlckpNWCgpOworCisgICAgICAgIGlmICgob25hbWUgIT0gbnVsbCkgJiYgCisgICAgICAgICAgICAoUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkuZ2V0TUJlYW5TZXJ2ZXIoKS5pc1JlZ2lzdGVyZWQob25hbWUpKSkgeworICAgICAgICAgICAgLy8gQXMgdGhpbmdzIGRlcGVuZCBvbiB0aGUgSk1YIHJlZ2lzdHJhdGlvbiwgdGhlIGNvbnRleHQKKyAgICAgICAgICAgIC8vIG11c3QgYmUgcmVyZWdpc3RlcmVkIGFnYWluIG9uY2UgcHJvcGVybHkgaW5pdGlhbGl6ZWQKKyAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLnVucmVnaXN0ZXJDb21wb25lbnQob25hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9TVEFSVF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgc2V0QXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgc2V0Q29uZmlndXJlZChmYWxzZSk7CisgICAgICAgIGJvb2xlYW4gb2sgPSB0cnVlOworCisgICAgICAgIC8vIEFkZCBtaXNzaW5nIGNvbXBvbmVudHMgYXMgbmVjZXNzYXJ5CisgICAgICAgIGlmICh3ZWJhcHBSZXNvdXJjZXMgPT0gbnVsbCkgeyAgIC8vICgxKSBSZXF1aXJlZCBieSBMb2FkZXIKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvbmZpZ3VyaW5nIGRlZmF1bHQgUmVzb3VyY2VzIik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICgoZG9jQmFzZSAhPSBudWxsKSAmJiAoZG9jQmFzZS5lbmRzV2l0aCgiLndhciIpKSAmJiAoIShuZXcgRmlsZShnZXRCYXNlUGF0aCgpKSkuaXNEaXJlY3RvcnkoKSkpCisgICAgICAgICAgICAgICAgICAgIHNldFJlc291cmNlcyhuZXcgV0FSRGlyQ29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNldFJlc291cmNlcyhuZXcgRmlsZURpckNvbnRleHQoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXJyb3IgaW5pdGlhbGl6aW5nIHJlc291cmNlczogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgaWYgKCFyZXNvdXJjZXNTdGFydCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCAiRXJyb3IgaW4gcmVzb3VyY2VTdGFydCgpIik7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIExvb2sgZm9yIGEgcmVhbG0gLSB0aGF0IG1heSBoYXZlIGJlZW4gY29uZmlndXJlZCBlYXJsaWVyLiAKKyAgICAgICAgLy8gSWYgdGhlIHJlYWxtIGlzIGFkZGVkIGFmdGVyIGNvbnRleHQgLSBpdCdsbCBzZXQgaXRzZWxmLgorICAgICAgICBpZiggcmVhbG0gPT0gbnVsbCAmJiBtc2VydmVyICE9IG51bGwgKSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIHJlYWxtTmFtZT1udWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZWFsbU5hbWU9bmV3IE9iamVjdE5hbWUoIGdldEVuZ2luZU5hbWUoKSArICI6dHlwZT1SZWFsbSxob3N0PSIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEhvc3RuYW1lKCkgKyAiLHBhdGg9IiArIGdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKHJlYWxtTmFtZSApICkgeworICAgICAgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZShyZWFsbU5hbWUsICJpbml0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7fQorICAgICAgICAgICAgICAgICAgICApOyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2goIFRocm93YWJsZSB0ICkgeworICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5vIHJlYWxtIGZvciB0aGlzIGhvc3QgIiArIHJlYWxtTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChnZXRMb2FkZXIoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBXZWJhcHBMb2FkZXIgd2ViYXBwTG9hZGVyID0gbmV3IFdlYmFwcExvYWRlcihnZXRQYXJlbnRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIHdlYmFwcExvYWRlci5zZXREZWxlZ2F0ZShnZXREZWxlZ2F0ZSgpKTsKKyAgICAgICAgICAgIHNldExvYWRlcih3ZWJhcHBMb2FkZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBjaGFyYWN0ZXIgc2V0IG1hcHBlcgorICAgICAgICBnZXRDaGFyc2V0TWFwcGVyKCk7CisKKyAgICAgICAgLy8gUG9zdCB3b3JrIGRpcmVjdG9yeQorICAgICAgICBwb3N0V29ya0RpcmVjdG9yeSgpOworCisgICAgICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIGV4dGVuc2lvbnMKKyAgICAgICAgYm9vbGVhbiBkZXBlbmRlbmN5Q2hlY2sgPSB0cnVlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGVwZW5kZW5jeUNoZWNrID0gRXh0ZW5zaW9uVmFsaWRhdG9yLnZhbGlkYXRlQXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICAoZ2V0UmVzb3VyY2VzKCksIHRoaXMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiRXJyb3IgaW4gZGVwZW5kZW5jeUNoZWNrIiwgaW9lKTsKKyAgICAgICAgICAgIGRlcGVuZGVuY3lDaGVjayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFkZXBlbmRlbmN5Q2hlY2spIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdCBtYWtlIGFwcGxpY2F0aW9uIGF2YWlsYWJsZSBpZiBkZXBlbmN5IGNoZWNrIGZhaWxzCisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVhZGluZyB0aGUgImNhdGFsaW5hLnVzZU5hbWluZyIgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICAgICAgU3RyaW5nIHVzZU5hbWluZ1Byb3BlcnR5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS51c2VOYW1pbmciKTsKKyAgICAgICAgaWYgKCh1c2VOYW1pbmdQcm9wZXJ0eSAhPSBudWxsKQorICAgICAgICAgICAgJiYgKHVzZU5hbWluZ1Byb3BlcnR5LmVxdWFscygiZmFsc2UiKSkpIHsKKyAgICAgICAgICAgIHVzZU5hbWluZyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9rICYmIGlzVXNlTmFtaW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChuYW1pbmdDb250ZXh0TGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5hbWluZ0NvbnRleHRMaXN0ZW5lciA9IG5ldyBOYW1pbmdDb250ZXh0TGlzdGVuZXIoKTsKKyAgICAgICAgICAgICAgICBuYW1pbmdDb250ZXh0TGlzdGVuZXIuc2V0TmFtZShnZXROYW1pbmdDb250ZXh0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBhZGRMaWZlY3ljbGVMaXN0ZW5lcihuYW1pbmdDb250ZXh0TGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhbmRhcmQgY29udGFpbmVyIHN0YXJ0dXAKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9jZXNzaW5nIHN0YW5kYXJkIGNvbnRhaW5lciBzdGFydHVwIik7CisKKyAgICAgICAgLy8gQmluZGluZyB0aHJlYWQKKyAgICAgICAgQ2xhc3NMb2FkZXIgb2xkQ0NMID0gYmluZFRocmVhZCgpOworCisgICAgICAgIGJvb2xlYW4gbWFpbk9rID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RhcnRlZCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAvLyBTdGFydCBvdXIgc3Vib3JkaW5hdGUgY29tcG9uZW50cywgaWYgYW55CisgICAgICAgICAgICAgICAgaWYgKChsb2FkZXIgIT0gbnVsbCkgJiYgKGxvYWRlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpCisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBsb2FkZXIpLnN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICAvLyBVbmJpbmRpbmcgdGhyZWFkCisgICAgICAgICAgICAgICAgdW5iaW5kVGhyZWFkKG9sZENDTCk7CisKKyAgICAgICAgICAgICAgICAvLyBCaW5kaW5nIHRocmVhZAorICAgICAgICAgICAgICAgIG9sZENDTCA9IGJpbmRUaHJlYWQoKTsKKworICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgbG9nZ2VyIGFnYWluLiBPdGhlciBjb21wb25lbnRzIG1pZ2h0IGhhdmUgdXNlZCBpdCB0b28gZWFybHksIAorICAgICAgICAgICAgICAgIC8vIHNvIGl0IHNob3VsZCBiZSByZXNldC4KKyAgICAgICAgICAgICAgICBsb2dnZXIgPSBudWxsOworICAgICAgICAgICAgICAgIGdldExvZ2dlcigpOworICAgICAgICAgICAgICAgIGlmICgobG9nZ2VyICE9IG51bGwpICYmIChsb2dnZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKQorICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgbG9nZ2VyKS5zdGFydCgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICgoY2x1c3RlciAhPSBudWxsKSAmJiAoY2x1c3RlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpCisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjbHVzdGVyKS5zdGFydCgpOworICAgICAgICAgICAgICAgIGlmICgocmVhbG0gIT0gbnVsbCkgJiYgKHJlYWxtIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkKKyAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIHJlYWxtKS5zdGFydCgpOworICAgICAgICAgICAgICAgIGlmICgocmVzb3VyY2VzICE9IG51bGwpICYmIChyZXNvdXJjZXMgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKQorICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgcmVzb3VyY2VzKS5zdGFydCgpOworCisgICAgICAgICAgICAgICAgLy8gU3RhcnQgb3VyIGNoaWxkIGNvbnRhaW5lcnMsIGlmIGFueQorICAgICAgICAgICAgICAgIENvbnRhaW5lciBjaGlsZHJlbltdID0gZmluZENoaWxkcmVuKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBMaWZlY3ljbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY2hpbGRyZW5baV0pLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gU3RhcnQgdGhlIFZhbHZlcyBpbiBvdXIgcGlwZWxpbmUgKGluY2x1ZGluZyB0aGUgYmFzaWMpLAorICAgICAgICAgICAgICAgIC8vIGlmIGFueQorICAgICAgICAgICAgICAgIGlmIChwaXBlbGluZSBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgcGlwZWxpbmUpLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmKGdldFByb2Nlc3NUbGRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RsZHMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICAgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQsIG51bGwpOworCisgICAgICAgICAgICAgICAgLy8gQ29uZmlndXJlIGRlZmF1bHQgbWFuYWdlciBpZiBub25lIHdhcyBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICBpZiAobWFuYWdlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoZ2V0Q2x1c3RlcigpICE9IG51bGwpICYmIGRpc3RyaWJ1dGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TWFuYWdlcihnZXRDbHVzdGVyKCkuY3JlYXRlTWFuYWdlcihnZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigic3RhbmRhcmRDb250ZXh0LmNsdXN0ZXJGYWlsIiwgZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRNYW5hZ2VyKG5ldyBTdGFuZGFyZE1hbmFnZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gU3RhcnQgbWFuYWdlcgorICAgICAgICAgICAgICAgIGlmICgobWFuYWdlciAhPSBudWxsKSAmJiAobWFuYWdlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGdldE1hbmFnZXIoKSkuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBTdGFydCBDb250YWluZXJCYWNrZ3JvdW5kUHJvY2Vzc29yIHRocmVhZAorICAgICAgICAgICAgICAgIHN1cGVyLnRocmVhZFN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICBtYWluT2sgPSB0cnVlOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIFVuYmluZGluZyB0aHJlYWQKKyAgICAgICAgICAgIHVuYmluZFRocmVhZChvbGRDQ0wpOworICAgICAgICAgICAgaWYgKCFtYWluT2spIHsKKyAgICAgICAgICAgICAgICAvLyBBbiBleGNlcHRpb24gb2NjdXJyZWQKKyAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciB3aXRoIEpNWCBhbnl3YXksIHRvIGFsbG93IG1hbmFnZW1lbnQKKyAgICAgICAgICAgICAgICByZWdpc3RlckpNWCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFnZXRDb25maWd1cmVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvciggIkVycm9yIGdldENvbmZpZ3VyZWQiKTsKKyAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBwdXQgdGhlIHJlc291cmNlcyBpbnRvIHRoZSBzZXJ2bGV0IGNvbnRleHQKKyAgICAgICAgaWYgKG9rKQorICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAoR2xvYmFscy5SRVNPVVJDRVNfQVRUUiwgZ2V0UmVzb3VyY2VzKCkpOworCisgICAgICAgIC8vIEluaXRpYWxpemUgYXNzb2NpYXRlZCBtYXBwZXIKKyAgICAgICAgbWFwcGVyLnNldENvbnRleHQoZ2V0UGF0aCgpLCB3ZWxjb21lRmlsZXMsIHJlc291cmNlcyk7CisKKyAgICAgICAgLy8gQmluZGluZyB0aHJlYWQKKyAgICAgICAgb2xkQ0NMID0gYmluZFRocmVhZCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIENyZWF0ZSBjb250ZXh0IGF0dHJpYnV0ZXMgdGhhdCB3aWxsIGJlIHJlcXVpcmVkCisgICAgICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgICAgICBwb3N0V2VsY29tZUZpbGVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEFGVEVSX1NUQVJUX0VWRU5ULCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQ29uZmlndXJlIGFuZCBjYWxsIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVycyBhbmQgZmlsdGVycworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgaWYgKCFsaXN0ZW5lclN0YXJ0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCAiRXJyb3IgbGlzdGVuZXJTdGFydCIpOworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgIGlmICghZmlsdGVyU3RhcnQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoICJFcnJvciBmaWx0ZXJTdGFydCIpOworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gTG9hZCBhbmQgaW5pdGlhbGl6ZSBhbGwgImxvYWQgb24gc3RhcnR1cCIgc2VydmxldHMKKyAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgIGxvYWRPblN0YXJ0dXAoZmluZENoaWxkcmVuKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBVbmJpbmRpbmcgdGhyZWFkCisgICAgICAgICAgICB1bmJpbmRUaHJlYWQob2xkQ0NMKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCBhdmFpbGFibGUgc3RhdHVzIGRlcGVuZGluZyB1cG9uIHN0YXJ0dXAgc3VjY2VzcworICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlN0YXJ0aW5nIGNvbXBsZXRlZCIpOworICAgICAgICAgICAgc2V0QXZhaWxhYmxlKHRydWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LnN0YXJ0RmFpbGVkIiwgZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LnN0YXJ0Q2xlYW51cCIpLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEF2YWlsYWJsZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBKTVggcmVnaXN0cmF0aW9uCisgICAgICAgIHJlZ2lzdGVySk1YKCk7CisKKyAgICAgICAgc3RhcnRUaW1lPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAKKyAgICAgICAgLy8gU2VuZCBqMmVlLnN0YXRlLnJ1bm5pbmcgbm90aWZpY2F0aW9uIAorICAgICAgICBpZiAob2sgJiYgKHRoaXMuZ2V0T2JqZWN0TmFtZSgpICE9IG51bGwpKSB7CisgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gCisgICAgICAgICAgICAgICAgbmV3IE5vdGlmaWNhdGlvbigiajJlZS5zdGF0ZS5ydW5uaW5nIiwgdGhpcy5nZXRPYmplY3ROYW1lKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlcisrKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLnNlbmROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENsb3NlIGFsbCBKQVJzIHJpZ2h0IGF3YXkgdG8gYXZvaWQgYWx3YXlzIG9wZW5pbmcgYSBwZWFrIG51bWJlciAKKyAgICAgICAgLy8gb2YgZmlsZXMgb24gc3RhcnR1cAorICAgICAgICBpZiAoZ2V0TG9hZGVyKCkgaW5zdGFuY2VvZiBXZWJhcHBMb2FkZXIpIHsKKyAgICAgICAgICAgICgoV2ViYXBwTG9hZGVyKSBnZXRMb2FkZXIoKSkuY2xvc2VKQVJzKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVpbml0aWFsaXppbmcgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAgICAgICAgaWYgKCFvayAmJiBzdGFydGVkKSB7CisgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgIH0KKworICAgICAgICAvL2NhY2hlQ29udGV4dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBUTERzLgorICAgICAqCisgICAgICogQHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NUbGRzKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisgICAgICAgVGxkQ29uZmlnIHRsZENvbmZpZyA9IG5ldyBUbGRDb25maWcoKTsKKyAgICAgICB0bGRDb25maWcuc2V0Q29udGV4dCh0aGlzKTsKKworICAgICAgIC8vICgxKSAgY2hlY2sgaWYgdGhlIGF0dHJpYnV0ZSBoYXMgYmVlbiBkZWZpbmVkCisgICAgICAgLy8gICAgICBvbiB0aGUgY29udGV4dCBlbGVtZW50LgorICAgICAgIHRsZENvbmZpZy5zZXRUbGRWYWxpZGF0aW9uKHRsZFZhbGlkYXRpb24pOworICAgICAgIHRsZENvbmZpZy5zZXRUbGROYW1lc3BhY2VBd2FyZSh0bGROYW1lc3BhY2VBd2FyZSk7CisKKyAgICAgICAvLyAoMikgaWYgdGhlIGF0dHJpYnV0ZSB3YXNuJ3QgZGVmaW5lZCBvbiB0aGUgY29udGV4dAorICAgICAgIC8vICAgICB0cnkgdGhlIGhvc3QuCisgICAgICAgaWYgKCF0bGRWYWxpZGF0aW9uKSB7CisgICAgICAgICB0bGRDb25maWcuc2V0VGxkVmFsaWRhdGlvbgorICAgICAgICAgICAoKChTdGFuZGFyZEhvc3QpIGdldFBhcmVudCgpKS5nZXRYbWxWYWxpZGF0aW9uKCkpOworICAgICAgIH0KKworICAgICAgIGlmICghdGxkTmFtZXNwYWNlQXdhcmUpIHsKKyAgICAgICAgIHRsZENvbmZpZy5zZXRUbGROYW1lc3BhY2VBd2FyZQorICAgICAgICAgICAoKChTdGFuZGFyZEhvc3QpIGdldFBhcmVudCgpKS5nZXRYbWxOYW1lc3BhY2VBd2FyZSgpKTsKKyAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgIHRyeSB7CisgICAgICAgICB0bGRDb25maWcuZXhlY3V0ZSgpOworICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgbG9nLmVycm9yKCJFcnJvciByZWFkaW5nIHRsZCBsaXN0ZW5lcnMgIiAKKyAgICAgICAgICAgICAgICAgICAgKyBleC50b1N0cmluZygpLCBleCk7IAorICAgICAgIH0KKyAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFN0b3AgdGhpcyBDb250ZXh0IGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIGEgc2h1dGRvd24gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAoIXN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJjb250YWluZXJCYXNlLm5vdFN0YXJ0ZWQiLCBsb2dOYW1lKCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RPUF9FVkVOVCwgbnVsbCk7CisgICAgICAgIAorICAgICAgICAvLyBTZW5kIGoyZWUuc3RhdGUuc3RvcHBpbmcgbm90aWZpY2F0aW9uIAorICAgICAgICBpZiAodGhpcy5nZXRPYmplY3ROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IAorICAgICAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb24oImoyZWUuc3RhdGUuc3RvcHBpbmciLCB0aGlzLmdldE9iamVjdE5hbWUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyKyspOworICAgICAgICAgICAgYnJvYWRjYXN0ZXIuc2VuZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBNYXJrIHRoaXMgYXBwbGljYXRpb24gYXMgdW5hdmFpbGFibGUgd2hpbGUgd2Ugc2h1dCBkb3duCisgICAgICAgIHNldEF2YWlsYWJsZShmYWxzZSk7CisKKyAgICAgICAgLy8gQmluZGluZyB0aHJlYWQKKyAgICAgICAgQ2xhc3NMb2FkZXIgb2xkQ0NMID0gYmluZFRocmVhZCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBTdG9wIG91ciBjaGlsZCBjb250YWluZXJzLCBpZiBhbnkKKyAgICAgICAgICAgIENvbnRhaW5lcltdIGNoaWxkcmVuID0gZmluZENoaWxkcmVuKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgTGlmZWN5Y2xlKQorICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY2hpbGRyZW5baV0pLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU3RvcCBvdXIgZmlsdGVycworICAgICAgICAgICAgZmlsdGVyU3RvcCgpOworCisgICAgICAgICAgICAvLyBTdG9wIENvbnRhaW5lckJhY2tncm91bmRQcm9jZXNzb3IgdGhyZWFkCisgICAgICAgICAgICBzdXBlci50aHJlYWRTdG9wKCk7CisKKyAgICAgICAgICAgIGlmICgobWFuYWdlciAhPSBudWxsKSAmJiAobWFuYWdlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgbWFuYWdlcikuc3RvcCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTdG9wIG91ciBhcHBsaWNhdGlvbiBsaXN0ZW5lcnMKKyAgICAgICAgICAgIGxpc3RlbmVyU3RvcCgpOworCisgICAgICAgICAgICAvLyBGaW5hbGl6ZSBvdXIgY2hhcmFjdGVyIHNldCBtYXBwZXIKKyAgICAgICAgICAgIHNldENoYXJzZXRNYXBwZXIobnVsbCk7CisKKyAgICAgICAgICAgIC8vIE5vcm1hbCBjb250YWluZXIgc2h1dGRvd24gcHJvY2Vzc2luZworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHJvY2Vzc2luZyBzdGFuZGFyZCBjb250YWluZXIgc2h1dGRvd24iKTsKKyAgICAgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RPUF9FVkVOVCwgbnVsbCk7CisgICAgICAgICAgICBzdGFydGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIFN0b3AgdGhlIFZhbHZlcyBpbiBvdXIgcGlwZWxpbmUgKGluY2x1ZGluZyB0aGUgYmFzaWMpLCBpZiBhbnkKKyAgICAgICAgICAgIGlmIChwaXBlbGluZSBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBwaXBlbGluZSkuc3RvcCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDbGVhciBhbGwgYXBwbGljYXRpb24tb3JpZ2luYXRlZCBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlcworICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250ZXh0LmNsZWFyQXR0cmlidXRlcygpOworCisgICAgICAgICAgICAvLyBTdG9wIHJlc291cmNlcworICAgICAgICAgICAgcmVzb3VyY2VzU3RvcCgpOworCisgICAgICAgICAgICBpZiAoKHJlYWxtICE9IG51bGwpICYmIChyZWFsbSBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgcmVhbG0pLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoY2x1c3RlciAhPSBudWxsKSAmJiAoY2x1c3RlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY2x1c3Rlcikuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChsb2dnZXIgIT0gbnVsbCkgJiYgKGxvZ2dlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgbG9nZ2VyKS5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGxvYWRlciAhPSBudWxsKSAmJiAobG9hZGVyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBsb2FkZXIpLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGZpbmFsbHkgeworCisgICAgICAgICAgICAvLyBVbmJpbmRpbmcgdGhyZWFkCisgICAgICAgICAgICB1bmJpbmRUaHJlYWQob2xkQ0NMKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gU2VuZCBqMmVlLnN0YXRlLnN0b3BwZWQgbm90aWZpY2F0aW9uIAorICAgICAgICBpZiAodGhpcy5nZXRPYmplY3ROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IAorICAgICAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb24oImoyZWUuc3RhdGUuc3RvcHBlZCIsIHRoaXMuZ2V0T2JqZWN0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXIrKyk7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5zZW5kTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFJlc2V0IGFwcGxpY2F0aW9uIGNvbnRleHQKKyAgICAgICAgY29udGV4dCA9IG51bGw7CisKKyAgICAgICAgLy8gVGhpcyBvYmplY3Qgd2lsbCBubyBsb25nZXIgYmUgdmlzaWJsZSBvciB1c2VkLiAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc2V0Q29udGV4dCgpOworICAgICAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoICJFcnJvciByZXNldGluZyBjb250ZXh0ICIgKyB0aGlzICsgIiAiICsgZXgsIGV4ICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChBRlRFUl9TVE9QX0VWRU5ULCBudWxsKTsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlN0b3BwaW5nIGNvbXBsZXRlIik7CisKKyAgICB9CisKKyAgICAvKiogRGVzdHJveSBuZWVkcyB0byBjbGVhbiB1cCB0aGUgY29udGV4dCBjb21wbGV0ZWx5LgorICAgICAqIAorICAgICAqIFRoZSBwcm9ibGVtIGlzIHRoYXQgdW5kb2luZyBhbGwgdGhlIGNvbmZpZyBpbiBzdGFydCgpIGFuZCByZXN0b3JpbmcgCisgICAgICogYSAnZnJlc2gnIHN0YXRlIGlzIGltcG9zc2libGUuIEFmdGVyIHN0b3AoKS9kZXN0cm95KCkvaW5pdCgpL3N0YXJ0KCkKKyAgICAgKiB3ZSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBzdGF0ZSBhcyBpZiBhIGZyZXNoIHN0YXJ0IHdhcyBkb25lIC0gaS5lCisgICAgICogcmVhZCBtb2RpZmllZCB3ZWIueG1sLCBldGMuIFRoaXMgY2FuIG9ubHkgYmUgZG9uZSBieSBjb21wbGV0ZWx5IAorICAgICAqIHJlbW92aW5nIHRoZSBjb250ZXh0IG9iamVjdCBhbmQgcmVtYXBwaW5nIGEgbmV3IG9uZSwgb3IgYnkgY2xlYW5pbmcKKyAgICAgKiB1cCBldmVyeXRoaW5nLgorICAgICAqIAorICAgICAqIFhYWCBTaG91bGQgdGhpcyBiZSBkb25lIGluIHN0b3AoKSA/CisgICAgICogCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoIG9uYW1lICE9IG51bGwgKSB7IAorICAgICAgICAgICAgLy8gU2VuZCBqMmVlLm9iamVjdC5kZWxldGVkIG5vdGlmaWNhdGlvbiAKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSAKKyAgICAgICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uKCJqMmVlLm9iamVjdC5kZWxldGVkIiwgdGhpcy5nZXRPYmplY3ROYW1lKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlcisrKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLnNlbmROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTsKKyAgICAgICAgfSAKKyAgICAgICAgc3VwZXIuZGVzdHJveSgpOworCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChERVNUUk9ZX0VWRU5ULCBudWxsKTsKKworICAgICAgICBpbnN0YW5jZUxpc3RlbmVycyA9IG5ldyBTdHJpbmdbMF07CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCByZXNldENvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uLCBNQmVhblJlZ2lzdHJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHN0YXRlICggcHJlIHJlYWRpbmcgd2ViLnhtbCBpbiBzdGFydCApCisgICAgICAgIC8vIElmIHlvdSBleHRlbmQgdGhpcyAtIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBtYWtlIHN1cmUgdG8gY2xlYW4gdXAKKyAgICAgICAgY2hpbGRyZW49bmV3IEhhc2hNYXAoKTsKKyAgICAgICAgc3RhcnR1cFRpbWUgPSAwOworICAgICAgICBzdGFydFRpbWUgPSAwOworICAgICAgICB0bGRTY2FuVGltZSA9IDA7CisKKyAgICAgICAgLy8gQnVnemlsbGEgMzI4NjcKKyAgICAgICAgZGlzdHJpYnV0YWJsZSA9IGZhbHNlOworCisgICAgICAgIGFwcGxpY2F0aW9uTGlzdGVuZXJzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgYXBwbGljYXRpb25FdmVudExpc3RlbmVyc09iamVjdHMgPSBuZXcgT2JqZWN0WzBdOworICAgICAgICBhcHBsaWNhdGlvbkxpZmVjeWNsZUxpc3RlbmVyc09iamVjdHMgPSBuZXcgT2JqZWN0WzBdOworCisgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJyZXNldENvbnRleHQgIiArIG9uYW1lICsgIiAiICsgbXNlcnZlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpZiAoZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKGdldFBhcmVudCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIuIik7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCJTdGFuZGFyZENvbnRleHRbIik7CisgICAgICAgIHNiLmFwcGVuZChnZXROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkanVzdCB0aGUgVVJMIHBhdHRlcm4gdG8gYmVnaW4gd2l0aCBhIGxlYWRpbmcgc2xhc2gsIGlmIGFwcHJvcHJpYXRlCisgICAgICogKGkuZS4gd2UgYXJlIHJ1bm5pbmcgYSBzZXJ2bGV0IDIuMiBhcHBsaWNhdGlvbikuICBPdGhlcndpc2UsIHJldHVybgorICAgICAqIHRoZSBzcGVjaWZpZWQgVVJMIHBhdHRlcm4gdW5jaGFuZ2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHVybFBhdHRlcm4gVGhlIFVSTCBwYXR0ZXJuIHRvIGJlIGFkanVzdGVkIChpZiBuZWVkZWQpCisgICAgICogIGFuZCByZXR1cm5lZAorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYWRqdXN0VVJMUGF0dGVybihTdHJpbmcgdXJsUGF0dGVybikgeworCisgICAgICAgIGlmICh1cmxQYXR0ZXJuID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHVybFBhdHRlcm4pOworICAgICAgICBpZiAodXJsUGF0dGVybi5zdGFydHNXaXRoKCIvIikgfHwgdXJsUGF0dGVybi5zdGFydHNXaXRoKCIqLiIpKQorICAgICAgICAgICAgcmV0dXJuICh1cmxQYXR0ZXJuKTsKKyAgICAgICAgaWYgKCFpc1NlcnZsZXQyMigpKQorICAgICAgICAgICAgcmV0dXJuICh1cmxQYXR0ZXJuKTsKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQudXJsUGF0dGVybi5wYXR0ZXJuV2FybmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXJsUGF0dGVybikpOworICAgICAgICByZXR1cm4gKCIvIiArIHVybFBhdHRlcm4pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBcmUgd2UgcHJvY2Vzc2luZyBhIHZlcnNpb24gMi4yIGRlcGxveW1lbnQgZGVzY3JpcHRvcj8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlcnZsZXQyMigpIHsKKworICAgICAgICBpZiAodGhpcy5wdWJsaWNJZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIGlmICh0aGlzLnB1YmxpY0lkLmVxdWFscworICAgICAgICAgICAgKG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Db25zdGFudHMuV2ViRHRkUHVibGljSWRfMjIpKQorICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZQorICAgICAqIGVudGlyZSBzZXJ2bGV0IGNvbnRhaW5lciAoaS5lLiB0aGUgRW5naW5lIGNvbnRhaW5lciBpZiBwcmVzZW50KS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBlbmdpbmVCYXNlKCkgeworICAgICAgICBTdHJpbmcgYmFzZT1TeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKTsKKyAgICAgICAgaWYoIGJhc2UgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIFN0YW5kYXJkRW5naW5lIGVuZz0oU3RhbmRhcmRFbmdpbmUpdGhpcy5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIGJhc2U9ZW5nLmdldEJhc2VEaXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG5ldyBGaWxlKGJhc2UpKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBCaW5kIGN1cnJlbnQgdGhyZWFkLCBib3RoIGZvciBDTCBwdXJwb3NlcyBhbmQgZm9yIEpOREkgRU5DIHN1cHBvcnQKKyAgICAgKiBkdXJpbmcgOiBzdGFydHVwLCBzaHV0ZG93biBhbmQgcmVhbG9hZGluZyBvZiB0aGUgY29udGV4dC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIGNvbnRleHQgY2xhc3MgbG9hZGVyCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBiaW5kVGhyZWFkKCkgeworCisgICAgICAgIENsYXNzTG9hZGVyIG9sZENvbnRleHRDbGFzc0xvYWRlciA9CisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworCisgICAgICAgIGlmIChnZXRSZXNvdXJjZXMoKSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG9sZENvbnRleHRDbGFzc0xvYWRlcjsKKworICAgICAgICBpZiAoZ2V0TG9hZGVyKCkuZ2V0Q2xhc3NMb2FkZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcgorICAgICAgICAgICAgICAgIChnZXRMb2FkZXIoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIERpckNvbnRleHRVUkxTdHJlYW1IYW5kbGVyLmJpbmQoZ2V0UmVzb3VyY2VzKCkpOworCisgICAgICAgIGlmIChpc1VzZU5hbWluZygpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENvbnRleHRCaW5kaW5ncy5iaW5kVGhyZWFkKHRoaXMsIHRoaXMpOworICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBTaWxlbnQgY2F0Y2gsIGFzIHRoaXMgaXMgYSBub3JtYWwgY2FzZSBkdXJpbmcgdGhlIGVhcmx5CisgICAgICAgICAgICAgICAgLy8gc3RhcnR1cCBzdGFnZXMKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBvbGRDb250ZXh0Q2xhc3NMb2FkZXI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVuYmluZCB0aHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVuYmluZFRocmVhZChDbGFzc0xvYWRlciBvbGRDb250ZXh0Q2xhc3NMb2FkZXIpIHsKKworICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihvbGRDb250ZXh0Q2xhc3NMb2FkZXIpOworCisgICAgICAgIG9sZENvbnRleHRDbGFzc0xvYWRlciA9IG51bGw7CisKKyAgICAgICAgaWYgKGlzVXNlTmFtaW5nKCkpIHsKKyAgICAgICAgICAgIENvbnRleHRCaW5kaW5ncy51bmJpbmRUaHJlYWQodGhpcywgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBEaXJDb250ZXh0VVJMU3RyZWFtSGFuZGxlci51bmJpbmQoKTsKKworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBHZXQgYmFzZSBwYXRoLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZVBhdGgoKSB7CisgICAgICAgIFN0cmluZyBkb2NCYXNlID0gbnVsbDsKKyAgICAgICAgQ29udGFpbmVyIGNvbnRhaW5lciA9IHRoaXM7CisgICAgICAgIHdoaWxlIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEhvc3QpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZ2V0RG9jQmFzZSgpKTsKKyAgICAgICAgaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZG9jQmFzZSA9IChuZXcgRmlsZShlbmdpbmVCYXNlKCksIGdldERvY0Jhc2UoKSkpLmdldFBhdGgoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSAiYXBwQmFzZSIgcHJvcGVydHkgb2YgdGhpcyBjb250YWluZXIKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXBwQmFzZSA9ICgoSG9zdCkgY29udGFpbmVyKS5nZXRBcHBCYXNlKCk7CisgICAgICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGFwcEJhc2UpOworICAgICAgICAgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShlbmdpbmVCYXNlKCksIGFwcEJhc2UpOworICAgICAgICAgICAgICAgIGRvY0Jhc2UgPSAobmV3IEZpbGUoZmlsZSwgZ2V0RG9jQmFzZSgpKSkuZ2V0UGF0aCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9jQmFzZSA9IGZpbGUuZ2V0UGF0aCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkb2NCYXNlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IGNvbmZpZyBiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldENvbmZpZ0Jhc2UoKSB7CisgICAgICAgIEZpbGUgY29uZmlnQmFzZSA9IAorICAgICAgICAgICAgbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksICJjb25mIik7CisgICAgICAgIGlmICghY29uZmlnQmFzZS5leGlzdHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgQ29udGFpbmVyIGNvbnRhaW5lciA9IHRoaXM7CisgICAgICAgIENvbnRhaW5lciBob3N0ID0gbnVsbDsKKyAgICAgICAgQ29udGFpbmVyIGVuZ2luZSA9IG51bGw7CisgICAgICAgIHdoaWxlIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEhvc3QpCisgICAgICAgICAgICAgICAgaG9zdCA9IGNvbnRhaW5lcjsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFbmdpbmUpCisgICAgICAgICAgICAgICAgZW5naW5lID0gY29udGFpbmVyOworICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLmdldFBhcmVudCgpOworICAgICAgICB9CisgICAgICAgIGlmIChlbmdpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgY29uZmlnQmFzZSA9IG5ldyBGaWxlKGNvbmZpZ0Jhc2UsIGVuZ2luZS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbmZpZ0Jhc2UgPSBuZXcgRmlsZShjb25maWdCYXNlLCBob3N0LmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNhdmVDb25maWcpIHsKKyAgICAgICAgICAgIGNvbmZpZ0Jhc2UubWtkaXJzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbmZpZ0Jhc2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIGNvbnRleHQgcGF0aCwgZ2V0IHRoZSBjb25maWcgZmlsZSBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdENvbmZpZ0ZpbGUoKSB7CisgICAgICAgIFN0cmluZyBiYXNlbmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UGF0aCgpOworICAgICAgICBpZiAocGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBiYXNlbmFtZSA9ICJST09UIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJhc2VuYW1lID0gcGF0aC5zdWJzdHJpbmcoMSkucmVwbGFjZSgnLycsICcjJyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChiYXNlbmFtZSArICIueG1sIik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgbmFtaW5nIGNvbnRleHQgZnVsbCBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldE5hbWluZ0NvbnRleHROYW1lKCkgeworICAgIGlmIChuYW1pbmdDb250ZXh0TmFtZSA9PSBudWxsKSB7CisgICAgICAgIENvbnRhaW5lciBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKKyAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CisgICAgICAgIG5hbWluZ0NvbnRleHROYW1lID0gZ2V0TmFtZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICBTdGFjayBzdGsgPSBuZXcgU3RhY2soKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgc3RrLnB1c2gocGFyZW50LmdldE5hbWUoKSk7CisgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKCFzdGsuZW1wdHkoKSkgeworICAgICAgICAgICAgYnVmZi5hcHBlbmQoIi8iICsgc3RrLnBvcCgpKTsKKyAgICAgICAgfQorICAgICAgICBidWZmLmFwcGVuZChnZXROYW1lKCkpOworICAgICAgICBuYW1pbmdDb250ZXh0TmFtZSA9IGJ1ZmYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmFtaW5nQ29udGV4dE5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBwYXVzZWQgZmxhZyBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFBhdXNlZCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucGF1c2VkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUG9zdCBhIGNvcHkgb2Ygb3VyIGN1cnJlbnQgbGlzdCBvZiB3ZWxjb21lIGZpbGVzIGFzIGEgc2VydmxldCBjb250ZXh0CisgICAgICogYXR0cmlidXRlLCBzbyB0aGF0IHRoZSBkZWZhdWx0IHNlcnZsZXQgY2FuIGZpbmQgdGhlbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcG9zdFdlbGNvbWVGaWxlcygpIHsKKworICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZSgib3JnLmFwYWNoZS5jYXRhbGluYS5XRUxDT01FX0ZJTEVTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VsY29tZUZpbGVzKTsKKworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdG5hbWUoKSB7CisgICAgICAgIENvbnRhaW5lciBwYXJlbnRIb3N0ID0gZ2V0UGFyZW50KCk7CisgICAgICAgIGlmIChwYXJlbnRIb3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGhvc3ROYW1lID0gcGFyZW50SG9zdC5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChob3N0TmFtZSA9PSBudWxsKSB8fCAoaG9zdE5hbWUubGVuZ3RoKCkgPCAxKSkKKyAgICAgICAgICAgIGhvc3ROYW1lID0gIl8iOworICAgICAgICByZXR1cm4gaG9zdE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhcHByb3ByaWF0ZSBjb250ZXh0IGF0dHJpYnV0ZSBmb3Igb3VyIHdvcmsgZGlyZWN0b3J5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwb3N0V29ya0RpcmVjdG9yeSgpIHsKKworICAgICAgICAvLyBBY3F1aXJlIChvciBjYWxjdWxhdGUpIHRoZSB3b3JrIGRpcmVjdG9yeSBwYXRoCisgICAgICAgIFN0cmluZyB3b3JrRGlyID0gZ2V0V29ya0RpcigpOworICAgICAgICBpZiAod29ya0RpciA9PSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIFJldHJpZXZlIG91ciBwYXJlbnQgKG5vcm1hbGx5IGEgaG9zdCkgbmFtZQorICAgICAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBlbmdpbmVOYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBob3N0V29ya0RpciA9IG51bGw7CisgICAgICAgICAgICBDb250YWluZXIgcGFyZW50SG9zdCA9IGdldFBhcmVudCgpOworICAgICAgICAgICAgaWYgKHBhcmVudEhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhvc3ROYW1lID0gcGFyZW50SG9zdC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudEhvc3QgaW5zdGFuY2VvZiBTdGFuZGFyZEhvc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgaG9zdFdvcmtEaXIgPSAoKFN0YW5kYXJkSG9zdClwYXJlbnRIb3N0KS5nZXRXb3JrRGlyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnRhaW5lciBwYXJlbnRFbmdpbmUgPSBwYXJlbnRIb3N0LmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbmdpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgIGVuZ2luZU5hbWUgPSBwYXJlbnRFbmdpbmUuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoaG9zdE5hbWUgPT0gbnVsbCkgfHwgKGhvc3ROYW1lLmxlbmd0aCgpIDwgMSkpCisgICAgICAgICAgICAgICAgaG9zdE5hbWUgPSAiXyI7CisgICAgICAgICAgICBpZiAoKGVuZ2luZU5hbWUgPT0gbnVsbCkgfHwgKGVuZ2luZU5hbWUubGVuZ3RoKCkgPCAxKSkKKyAgICAgICAgICAgICAgICBlbmdpbmVOYW1lID0gIl8iOworCisgICAgICAgICAgICBTdHJpbmcgdGVtcCA9IGdldFBhdGgoKTsKKyAgICAgICAgICAgIGlmICh0ZW1wLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcC5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICB0ZW1wID0gdGVtcC5yZXBsYWNlKCcvJywgJ18nKTsKKyAgICAgICAgICAgIHRlbXAgPSB0ZW1wLnJlcGxhY2UoJ1xcJywgJ18nKTsKKyAgICAgICAgICAgIGlmICh0ZW1wLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgICAgICB0ZW1wID0gIl8iOworICAgICAgICAgICAgaWYgKGhvc3RXb3JrRGlyICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgd29ya0RpciA9IGhvc3RXb3JrRGlyICsgRmlsZS5zZXBhcmF0b3IgKyB0ZW1wOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3b3JrRGlyID0gIndvcmsiICsgRmlsZS5zZXBhcmF0b3IgKyBlbmdpbmVOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKyBob3N0TmFtZSArIEZpbGUuc2VwYXJhdG9yICsgdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFdvcmtEaXIod29ya0Rpcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgdGhpcyBkaXJlY3RvcnkgaWYgbmVjZXNzYXJ5CisgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUod29ya0Rpcik7CisgICAgICAgIGlmICghZGlyLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgRmlsZSBjYXRhbGluYUhvbWUgPSBlbmdpbmVCYXNlKCk7CisgICAgICAgICAgICBTdHJpbmcgY2F0YWxpbmFIb21lUGF0aCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNhdGFsaW5hSG9tZVBhdGggPSBjYXRhbGluYUhvbWUuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgIGRpciA9IG5ldyBGaWxlKGNhdGFsaW5hSG9tZVBhdGgsIHdvcmtEaXIpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRpci5ta2RpcnMoKTsKKworICAgICAgICAvLyBTZXQgdGhlIGFwcHJvcHJpYXRlIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUKKyAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5zZXRBdHRyaWJ1dGUoR2xvYmFscy5XT1JLX0RJUl9BVFRSLCBkaXIpOworICAgICAgICBpZiAoZ2V0U2VydmxldENvbnRleHQoKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uQ29udGV4dCkKKyAgICAgICAgICAgICgoQXBwbGljYXRpb25Db250ZXh0KSBnZXRTZXJ2bGV0Q29udGV4dCgpKS5zZXRBdHRyaWJ1dGVSZWFkT25seQorICAgICAgICAgICAgICAgIChHbG9iYWxzLldPUktfRElSX0FUVFIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBwYXVzZWQgZmxhZyBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHBhdXNlZCBUaGUgbmV3IHJlcXVlc3QgcHJvY2Vzc2luZyBwYXVzZWQgZmxhZworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRQYXVzZWQoYm9vbGVhbiBwYXVzZWQpIHsKKworICAgICAgICB0aGlzLnBhdXNlZCA9IHBhdXNlZDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHN5bnRheCBvZiBhIHByb3Bvc2VkIDxjb2RlPiZsdDt1cmwtcGF0dGVybiZndDs8L2NvZGU+CisgICAgICogZm9yIGNvbmZvcm1hbmNlIHdpdGggc3BlY2lmaWNhdGlvbiByZXF1aXJlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsUGF0dGVybiBVUkwgcGF0dGVybiB0byBiZSB2YWxpZGF0ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVVUkxQYXR0ZXJuKFN0cmluZyB1cmxQYXR0ZXJuKSB7CisKKyAgICAgICAgaWYgKHVybFBhdHRlcm4gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICBpZiAodXJsUGF0dGVybi5pbmRleE9mKCdcbicpID49IDAgfHwgdXJsUGF0dGVybi5pbmRleE9mKCdccicpID49IDApIHsKKyAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQuY3JsZmludXJsIix1cmxQYXR0ZXJuKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVybFBhdHRlcm4uc3RhcnRzV2l0aCgiKi4iKSkgeworICAgICAgICAgICAgaWYgKHVybFBhdHRlcm4uaW5kZXhPZignLycpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGlmICggKHVybFBhdHRlcm4uc3RhcnRzV2l0aCgiLyIpKSAmJgorICAgICAgICAgICAgICAgICh1cmxQYXR0ZXJuLmluZGV4T2YoIiouIikgPCAwKSkKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGlvbnMKKworCisgICAgLyoqCisgICAgICogSlNSNzcgZGVwbG95bWVudERlc2NyaXB0b3IgYXR0cmlidXRlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKKyAgICAKKyAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSBnZXRTZXJ2bGV0Q29udGV4dCgpOworICAgICAgICBpZiAoc2VydmxldENvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgc3RyZWFtID0gc2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbSgKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQ29uc3RhbnRzLkFwcGxpY2F0aW9uV2ViWG1sKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSkpOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyBzdHJSZWFkID0gIiI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aGlsZSAoc3RyUmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHN0clJlYWQpOworICAgICAgICAgICAgICAgIHN0clJlYWQgPSBici5yZWFkTGluZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsgCisgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEpTUjc3IHNlcnZsZXRzIGF0dHJpYnV0ZQorICAgICAqCisgICAgICogQHJldHVybiBsaXN0IG9mIGFsbCBzZXJ2bGV0cyAoIHdlIGtub3cgYWJvdXQgKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTZXJ2bGV0cygpIHsKKyAgICAgICAgCisgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG51bGw7CisKKyAgICAgICAgQ29udGFpbmVyW10gY2hpbGRyZW4gPSBmaW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTdHJpbmdbY2hpbGRyZW4ubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciggaW50IGk9MDsgaTwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gKChTdGFuZGFyZFdyYXBwZXIpY2hpbGRyZW5baV0pLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorCisgICAgcHVibGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgaG9zdERvbWFpbiwgT2JqZWN0TmFtZSBwYXJlbnROYW1lKQorICAgICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyBvbmFtZVN0cjsKKyAgICAgICAgU3RhbmRhcmRIb3N0IGhzdD0oU3RhbmRhcmRIb3N0KWdldFBhcmVudCgpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHBhdGhOYW1lPWdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGhvc3ROYW1lPWdldFBhcmVudCgpLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIG5hbWU9ICIvLyIgKyAoKGhvc3ROYW1lPT1udWxsKT8gIkRFRkFVTFQiIDogaG9zdE5hbWUpICsKKyAgICAgICAgICAgICAgICAoKCIiLmVxdWFscyhwYXRoTmFtZSkpPyIvIjpwYXRoTmFtZSApOworCisgICAgICAgIFN0cmluZyBzdWZmaXg9IixKMkVFQXBwbGljYXRpb249IiArCisgICAgICAgICAgICAgICAgZ2V0SjJFRUFwcGxpY2F0aW9uKCkgKyAiLEoyRUVTZXJ2ZXI9IiArCisgICAgICAgICAgICAgICAgZ2V0SjJFRVNlcnZlcigpOworCisgICAgICAgIG9uYW1lU3RyPSJqMmVlVHlwZT1XZWJNb2R1bGUsbmFtZT0iICsgbmFtZSArIHN1ZmZpeDsKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWdpc3RlcmluZyAiICsgb25hbWVTdHIgKyAiIGZvciAiICsgb25hbWUpOworICAgICAgICAKKyAgICAgICAgLy8gZGVmYXVsdCBjYXNlIC0gbm8gZG9tYWluIGV4cGxpY3RlbHkgc2V0LgorICAgICAgICBpZiggZ2V0RG9tYWluKCkgPT0gbnVsbCApIGRvbWFpbj1oc3QuZ2V0RG9tYWluKCk7CisKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZT1uZXcgT2JqZWN0TmFtZShnZXREb21haW4oKSArICI6IiArIG9uYW1lU3RyKTsKKyAgICAgICAgcmV0dXJuIG9uYW1lOyAgICAgICAgCisgICAgfSAgICAKKyAgICAKKyAgICBwcml2YXRlIHZvaWQgcHJlUmVnaXN0ZXJKTVgoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdGFuZGFyZEhvc3QgaG9zdCA9IChTdGFuZGFyZEhvc3QpIGdldFBhcmVudCgpOworICAgICAgICAgICAgaWYgKChvbmFtZSA9PSBudWxsKSAKKyAgICAgICAgICAgICAgICB8fCAob25hbWUuZ2V0S2V5UHJvcGVydHkoImoyZWVUeXBlIikgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoaG9zdC5nZXREb21haW4oKSwgaG9zdC5nZXRKbXhOYW1lKCkpOworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBvbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oIkVycm9yIHJlZ2lzdGVyaW5nIGN0eCB3aXRoIGpteCAiICsgdGhpcyArICIgIiArCisgICAgICAgICAgICAgICAgICAgICBvbmFtZSArICIgIiArIGV4LnRvU3RyaW5nKCksIGV4ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJKTVgoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNoZWNraW5nIGZvciAiICsgb25hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCEgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkKKyAgICAgICAgICAgICAgICAuZ2V0TUJlYW5TZXJ2ZXIoKS5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICAgICAgY29udHJvbGxlciA9IG9uYW1lOworICAgICAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlckNvbXBvbmVudCh0aGlzLCBvbmFtZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gU2VuZCBqMmVlLm9iamVjdC5jcmVhdGVkIG5vdGlmaWNhdGlvbiAKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRPYmplY3ROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImoyZWUub2JqZWN0LmNyZWF0ZWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRPYmplY3ROYW1lKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlcisrKTsKKyAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0ZXIuc2VuZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnRhaW5lciBjaGlsZHJlbltdID0gZmluZENoaWxkcmVuKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGNoaWxkcmVuIT1udWxsICYmIGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAoKFN0YW5kYXJkV3JhcHBlciljaGlsZHJlbltpXSkucmVnaXN0ZXJKTVgoIHRoaXMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJFcnJvciByZWdpc3RlcmluZyB3cmFwcGVyIHdpdGggam14ICIgKyB0aGlzICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgb25hbWUgKyAiICIgKyBleC50b1N0cmluZygpLCBleCApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFRoZXJlIGFyZSAyIGNhc2VzOgorICAgICAqICAgMS5UaGUgY29udGV4dCBpcyBjcmVhdGVkIGFuZCByZWdpc3RlcmVkIGJ5IGludGVybmFsIEFQSVMKKyAgICAgKiAgIDIuIFRoZSBjb250ZXh0IGlzIGNyZWF0ZWQgYnkgSk1YLCBhbmQgaXQnbGwgc2VsZi1yZWdpc3Rlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2ZXIgVGhlIHNlcnZlcgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBvYmplY3QgbmFtZQorICAgICAqIEByZXR1cm4gT2JqZWN0TmFtZSBUaGUgbmFtZSBvZiB0aGUgb2JqZWN0CisgICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIE9iamVjdE5hbWUgcHJlUmVnaXN0ZXIoTUJlYW5TZXJ2ZXIgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgbmFtZSkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmKCBvbmFtZSAhPSBudWxsICkgeworICAgICAgICAgICAgLy9sb2cuaW5mbyggIkFscmVhZHkgcmVnaXN0ZXJlZCAiICsgb25hbWUgKyAiICIgKyBuYW1lKTsKKyAgICAgICAgICAgIC8vIFRlbXBvcmFyeSAtIC9hZG1pbiB1c2VzIHRoZSBvbGQgbmFtZXMKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnByZVJlZ2lzdGVyKHNlcnZlcixuYW1lKTsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJlRGVyZWdpc3RlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiggc3RhcnRlZCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RvcCgpOworICAgICAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvciggImVycm9yIHN0b3BwaW5nICIsIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiggdGhpcy5nZXRQYXJlbnQoKSA9PSBudWxsICkgeworICAgICAgICAgICAgT2JqZWN0TmFtZSBwYXJlbnROYW1lPWdldFBhcmVudE5hbWUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoICEgbXNlcnZlci5pc1JlZ2lzdGVyZWQocGFyZW50TmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBob3N0LCBjcmVhdGluZyBvbmUgIiArIHBhcmVudE5hbWUpOworICAgICAgICAgICAgICAgIFN0YW5kYXJkSG9zdCBob3N0PW5ldyBTdGFuZGFyZEhvc3QoKTsKKyAgICAgICAgICAgICAgICBob3N0LnNldE5hbWUoaG9zdE5hbWUpOworICAgICAgICAgICAgICAgIGhvc3Quc2V0QXV0b0RlcGxveShmYWxzZSk7CisgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyQ29tcG9uZW50KGhvc3QsIHBhcmVudE5hbWUsIG51bGwpOworICAgICAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKHBhcmVudE5hbWUsICJpbml0IiwgbmV3IE9iamVjdFtdIHt9LCBuZXcgU3RyaW5nW10ge30gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQWRkIHRoZSBtYWluIGNvbmZpZ3VyYXRpb24gbGlzdGVuZXIKKyAgICAgICAgICAgIExpZmVjeWNsZUxpc3RlbmVyIGNvbmZpZyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdCBjb25maWdDbGFzc25hbWUgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NsYXNzbmFtZSA9IG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKHBhcmVudE5hbWUsICJjb25maWdDbGFzcyIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLCBpdCdzIG5vcm1hbCBhIGhvc3QgbWF5IG5vdCBoYXZlIHRoaXMgb3B0aW9uYWwgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb25maWdDbGFzc25hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoU3RyaW5nLnZhbHVlT2YoY29uZmlnQ2xhc3NuYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IChMaWZlY3ljbGVMaXN0ZW5lcikgY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBuZXcgQ29udGV4dENvbmZpZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIkVycm9yIGNyZWF0aW5nIENvbnRleHRDb25maWcgZm9yICIgKyBwYXJlbnROYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5hZGRMaWZlY3ljbGVMaXN0ZW5lcihjb25maWcpOworCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZENoaWxkICIgKyBwYXJlbnROYW1lICsgIiAiICsgdGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKHBhcmVudE5hbWUsICJhZGRDaGlsZCIsIG5ldyBPYmplY3RbXSB7IHRoaXMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lciJ9KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZGVzdHJveSgpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgYWRkQ2hpbGQgbWF5IGhhdmUgc3RhcnRlZCB1cworICAgICAgICAgICAgaWYoIGluaXRpYWxpemVkICkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdXBlci5pbml0KCk7CisgICAgICAgIAorICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoSU5JVF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgLy8gU2VuZCBqMmVlLnN0YXRlLnN0YXJ0aW5nIG5vdGlmaWNhdGlvbiAKKyAgICAgICAgaWYgKHRoaXMuZ2V0T2JqZWN0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uKCJqMmVlLnN0YXRlLnN0YXJ0aW5nIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0T2JqZWN0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXIrKyk7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5zZW5kTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWUgZ2V0UGFyZW50TmFtZSgpIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gIkxpZmUiIHVwZGF0ZQorICAgICAgICBTdHJpbmcgcGF0aD1vbmFtZS5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICBpZiggcGF0aCA9PSBudWxsICkgeworICAgICAgICAgICAgbG9nLmVycm9yKCAiTm8gbmFtZSBhdHRyaWJ1dGUgIiArbmFtZSApOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYoICEgcGF0aC5zdGFydHNXaXRoKCAiLy8iKSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJJbnZhbGlkIG5hbWUgIiArIG5hbWUpOworICAgICAgICB9CisgICAgICAgIHBhdGg9cGF0aC5zdWJzdHJpbmcoMik7CisgICAgICAgIGludCBkZWxpbT1wYXRoLmluZGV4T2YoICIvIiApOworICAgICAgICBob3N0TmFtZT0ibG9jYWxob3N0IjsgLy8gU2hvdWxkIGJlIGRlZmF1bHQuLi4KKyAgICAgICAgaWYoIGRlbGltID4gMCApIHsKKyAgICAgICAgICAgIGhvc3ROYW1lPXBhdGguc3Vic3RyaW5nKDAsIGRlbGltKTsKKyAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhkZWxpbSk7CisgICAgICAgICAgICBpZiAocGF0aC5lcXVhbHMoIi8iKSkgeworICAgICAgICAgICAgICAgIHRoaXMuc2V0TmFtZSgiIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuc2V0TmFtZShwYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2V0dGluZyBwYXRoICIgKyAgcGF0aCApOworICAgICAgICAgICAgdGhpcy5zZXROYW1lKCBwYXRoICk7CisgICAgICAgIH0KKyAgICAgICAgLy8gWFhYIFRoZSBzZXJ2aWNlIGFuZCBkb21haW4gc2hvdWxkIGJlIHRoZSBzYW1lLgorICAgICAgICBTdHJpbmcgcGFyZW50RG9tYWluPWdldEVuZ2luZU5hbWUoKTsKKyAgICAgICAgaWYoIHBhcmVudERvbWFpbiA9PSBudWxsICkgcGFyZW50RG9tYWluPWRvbWFpbjsKKyAgICAgICAgT2JqZWN0TmFtZSBwYXJlbnROYW1lPW5ldyBPYmplY3ROYW1lKCBwYXJlbnREb21haW4gKyAiOiIgKworICAgICAgICAgICAgICAgICJ0eXBlPUhvc3QsaG9zdD0iICsgaG9zdE5hbWUpOworICAgICAgICByZXR1cm4gcGFyZW50TmFtZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgY3JlYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgaW5pdCgpOworICAgIH0KKworICAgIC8qIFJlbW92ZSBhIEpNWCBub3RmaWNhdGlvbkxpc3RlbmVyIAorICAgICAqIEBzZWUgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25FbWl0dGVyI3JlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVyKGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uTGlzdGVuZXIsIGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uRmlsdGVyLCBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVyKE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyLCAKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbkZpbHRlciBmaWx0ZXIsIE9iamVjdCBvYmplY3QpIHRocm93cyBMaXN0ZW5lck5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAJYnJvYWRjYXN0ZXIucmVtb3ZlTm90aWZpY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIsZmlsdGVyLG9iamVjdCk7CisgICAgCQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIE1CZWFuTm90aWZpY2F0aW9uSW5mb1tdIG5vdGlmaWNhdGlvbkluZm87CisgICAgCisgICAgLyogR2V0IEpNWCBCcm9hZGNhc3RlciBJbmZvCisgICAgICogQFRPRE8gdXNlIFN0cmluZ01hbmFnZXIgZm9yIGludGVybmF0aW9uYWwgc3VwcG9ydCEKKyAgICAgKiBAVE9ETyBUaGlzIHR3byBldmVudHMgd2Ugbm90IHNlbmQgajJlZS5zdGF0ZS5mYWlsZWQgYW5kIGoyZWUuYXR0cmlidXRlLmNoYW5nZWQhCisgICAgICogQHNlZSBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkJyb2FkY2FzdGVyI2dldE5vdGlmaWNhdGlvbkluZm8oKQorICAgICAqLworICAgIHB1YmxpYyBNQmVhbk5vdGlmaWNhdGlvbkluZm9bXSBnZXROb3RpZmljYXRpb25JbmZvKCkgeworICAgIAkvLyBGSVhNRTogaTE4bgorICAgIAlpZihub3RpZmljYXRpb25JbmZvID09IG51bGwpIHsKKyAgICAJCW5vdGlmaWNhdGlvbkluZm8gPSBuZXcgTUJlYW5Ob3RpZmljYXRpb25JbmZvW117CisgICAgCQkJCW5ldyBNQmVhbk5vdGlmaWNhdGlvbkluZm8obmV3IFN0cmluZ1tdIHsKKyAgICAJCQkJImoyZWUub2JqZWN0LmNyZWF0ZWQifSwKKwkJCQkJTm90aWZpY2F0aW9uLmNsYXNzLmdldE5hbWUoKSwKKwkJCQkJIndlYiBhcHBsaWNhdGlvbiBpcyBjcmVhdGVkIgorICAgIAkJCQkpLCAKKwkJCQkJbmV3IE1CZWFuTm90aWZpY2F0aW9uSW5mbyhuZXcgU3RyaW5nW10geworCQkJCQkiajJlZS5zdGF0ZS5zdGFydGluZyJ9LAorCQkJCQlOb3RpZmljYXRpb24uY2xhc3MuZ2V0TmFtZSgpLAorCQkJCQkiY2hhbmdlIHdlYiBhcHBsaWNhdGlvbiBpcyBzdGFydGluZyIKKwkJCQkJKSwKKwkJCQkJbmV3IE1CZWFuTm90aWZpY2F0aW9uSW5mbyhuZXcgU3RyaW5nW10geworCQkJCQkiajJlZS5zdGF0ZS5ydW5uaW5nIn0sCisJCQkJCU5vdGlmaWNhdGlvbi5jbGFzcy5nZXROYW1lKCksCisJCQkJCSJ3ZWIgYXBwbGljYXRpb24gaXMgcnVubmluZyIKKwkJCQkJKSwKKwkJCQkJbmV3IE1CZWFuTm90aWZpY2F0aW9uSW5mbyhuZXcgU3RyaW5nW10geworCQkJCQkiajJlZS5zdGF0ZS5zdG9wcGVkIn0sCisJCQkJCU5vdGlmaWNhdGlvbi5jbGFzcy5nZXROYW1lKCksCisJCQkJCSJ3ZWIgYXBwbGljYXRpb24gc3RhcnQgdG8gc3RvcHBlZCIKKwkJCQkJKSwKKwkJCQkJbmV3IE1CZWFuTm90aWZpY2F0aW9uSW5mbyhuZXcgU3RyaW5nW10geworCQkJCQkiajJlZS5vYmplY3Quc3RvcHBlZCJ9LAorCQkJCQlOb3RpZmljYXRpb24uY2xhc3MuZ2V0TmFtZSgpLAorCQkJCQkid2ViIGFwcGxpY2F0aW9uIGlzIHN0b3BwZWQiCisJCQkJCSksCisJCQkJCW5ldyBNQmVhbk5vdGlmaWNhdGlvbkluZm8obmV3IFN0cmluZ1tdIHsKKwkJCQkJImoyZWUub2JqZWN0LmRlbGV0ZWQifSwKKwkJCQkJTm90aWZpY2F0aW9uLmNsYXNzLmdldE5hbWUoKSwKKwkJCQkJIndlYiBhcHBsaWNhdGlvbiBpcyBkZWxldGVkIgorCQkJCQkpCisgICAgCQl9OworICAgIAkJCisgICAgCX0KKyAgICAJCisgICAgCXJldHVybiBub3RpZmljYXRpb25JbmZvOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKiBBZGQgYSBKTVgtTm90aWZpY2F0aW9uTGlzdGVuZXIKKyAgICAgKiBAc2VlIGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uQnJvYWRjYXN0ZXIjYWRkTm90aWZpY2F0aW9uTGlzdGVuZXIoamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25MaXN0ZW5lciwgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25GaWx0ZXIsIGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTm90aWZpY2F0aW9uTGlzdGVuZXIoTm90aWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIsIAorICAgICAgICAgICAgTm90aWZpY2F0aW9uRmlsdGVyIGZpbHRlciwgT2JqZWN0IG9iamVjdCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgCWJyb2FkY2FzdGVyLmFkZE5vdGlmaWNhdGlvbkxpc3RlbmVyKGxpc3RlbmVyLGZpbHRlcixvYmplY3QpOworICAgIAkKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgSk1YLU5vdGlmaWNhdGlvbkxpc3RlbmVyIAorICAgICAqIEBzZWUgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25Ccm9hZGNhc3RlciNyZW1vdmVOb3RpZmljYXRpb25MaXN0ZW5lcihqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkxpc3RlbmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVyKE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSAKKyAgICB0aHJvd3MgTGlzdGVuZXJOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgCWJyb2FkY2FzdGVyLnJlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAJCisgICAgfQorICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXR0cmlidXRlcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQgZ2V0U3RhdGljUmVzb3VyY2VzKCkgeworCisgICAgICAgIHJldHVybiBnZXRSZXNvdXJjZXMoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1pbmcgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKiBGSVhNRTogRm9vbGluZyBpbnRyb3NwZWN0aW9uIC4uLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0IGZpbmRTdGF0aWNSZXNvdXJjZXMoKSB7CisKKyAgICAgICAgcmV0dXJuIGdldFJlc291cmNlcygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWxjb21lRmlsZXMoKSB7CisKKyAgICAgICAgcmV0dXJuIGZpbmRXZWxjb21lRmlsZXMoKTsKKworICAgIH0KKworICAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbGlkYXRpb24gZmVhdHVyZSBvZiB0aGUgWE1MIHBhcnNlciB1c2VkIHdoZW4KKyAgICAgKiBwYXJzaW5nIHhtbCBpbnN0YW5jZXMuCisgICAgICogQHBhcmFtIHdlYlhtbFZhbGlkYXRpb24gdHJ1ZSB0byBlbmFibGUgeG1sIGluc3RhbmNlIHZhbGlkYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRYbWxWYWxpZGF0aW9uKGJvb2xlYW4gd2ViWG1sVmFsaWRhdGlvbil7CisgICAgICAgIAorICAgICAgICB0aGlzLndlYlhtbFZhbGlkYXRpb24gPSB3ZWJYbWxWYWxpZGF0aW9uOworCisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXJ2ZXIueG1sIDxjb250ZXh0PiBhdHRyaWJ1dGUncyB4bWxWYWxpZGF0aW9uLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB2YWxpZGF0aW9uIGlzIGVuYWJsZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRYbWxWYWxpZGF0aW9uKCl7CisgICAgICAgIHJldHVybiB3ZWJYbWxWYWxpZGF0aW9uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXJ2ZXIueG1sIDxjb250ZXh0PiBhdHRyaWJ1dGUncyB4bWxOYW1lc3BhY2VBd2FyZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbmFtZXNwYWNlIGF3YXJlbmVzIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0WG1sTmFtZXNwYWNlQXdhcmUoKXsKKyAgICAgICAgcmV0dXJuIHdlYlhtbE5hbWVzcGFjZUF3YXJlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lc3BhY2UgYXdhcmUgZmVhdHVyZSBvZiB0aGUgWE1MIHBhcnNlciB1c2VkIHdoZW4KKyAgICAgKiBwYXJzaW5nIHhtbCBpbnN0YW5jZXMuCisgICAgICogQHBhcmFtIHdlYlhtbE5hbWVzcGFjZUF3YXJlIHRydWUgdG8gZW5hYmxlIG5hbWVzcGFjZSBhd2FyZW5lc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRYbWxOYW1lc3BhY2VBd2FyZShib29sZWFuIHdlYlhtbE5hbWVzcGFjZUF3YXJlKXsKKyAgICAgICAgdGhpcy53ZWJYbWxOYW1lc3BhY2VBd2FyZT0gd2ViWG1sTmFtZXNwYWNlQXdhcmU7CisgICAgfSAgICAKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWxpZGF0aW9uIGZlYXR1cmUgb2YgdGhlIFhNTCBwYXJzZXIgdXNlZCB3aGVuCisgICAgICogcGFyc2luZyB0bGRzIGZpbGVzLiAKKyAgICAgKiBAcGFyYW0gdGxkVmFsaWRhdGlvbiB0cnVlIHRvIGVuYWJsZSB4bWwgaW5zdGFuY2UgdmFsaWRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRsZFZhbGlkYXRpb24oYm9vbGVhbiB0bGRWYWxpZGF0aW9uKXsKKyAgICAgICAgCisgICAgICAgIHRoaXMudGxkVmFsaWRhdGlvbiA9IHRsZFZhbGlkYXRpb247CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNlcnZlci54bWwgPGNvbnRleHQ+IGF0dHJpYnV0ZSdzIHdlYlhtbFZhbGlkYXRpb24uCisgICAgICogQHJldHVybiB0cnVlIGlmIHZhbGlkYXRpb24gaXMgZW5hYmxlZC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFRsZFZhbGlkYXRpb24oKXsKKyAgICAgICAgcmV0dXJuIHRsZFZhbGlkYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcHJvY2VzcyBUTERzIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXdQcm9jZXNzVGxkcyBUaGUgbmV3IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc1RsZHMoYm9vbGVhbiBuZXdQcm9jZXNzVGxkcykgeworCXByb2Nlc3NUbGRzID0gbmV3UHJvY2Vzc1RsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcHJvY2Vzc1RsZHMgYXR0cmlidXRlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFByb2Nlc3NUbGRzKCkgeworCXJldHVybiBwcm9jZXNzVGxkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNlcnZlci54bWwgPGhvc3Q+IGF0dHJpYnV0ZSdzIHhtbE5hbWVzcGFjZUF3YXJlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lc3BhY2UgYXdhcmVuZXMgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUbGROYW1lc3BhY2VBd2FyZSgpeworICAgICAgICByZXR1cm4gdGxkTmFtZXNwYWNlQXdhcmU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWVzcGFjZSBhd2FyZSBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgeG1sIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0gdGxkTmFtZXNwYWNlQXdhcmUgdHJ1ZSB0byBlbmFibGUgbmFtZXNwYWNlIGF3YXJlbmVzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRsZE5hbWVzcGFjZUF3YXJlKGJvb2xlYW4gdGxkTmFtZXNwYWNlQXdhcmUpeworICAgICAgICB0aGlzLnRsZE5hbWVzcGFjZUF3YXJlPSB0bGROYW1lc3BhY2VBd2FyZTsKKyAgICB9ICAgIAorCisKKyAgICAvKiogCisgICAgICogU3VwcG9ydCBmb3IgInN0YXRlTWFuYWdlYWJsZSIgSlNSNzcgCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0ZU1hbmFnZWFibGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzdGFydFJlY3Vyc2l2ZSgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICAvLyBub3RoaW5nIHRvIHN0YXJ0IHJlY3Vyc2l2ZSwgdGhlIHNlcnZsZXRzIHdpbGwgYmUgc3RhcnRlZCBieSBsb2FkLW9uLXN0YXJ0dXAKKyAgICAgICAgc3RhcnQoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRTdGF0ZSgpIHsKKyAgICAgICAgaWYoIHN0YXJ0ZWQgKSB7CisgICAgICAgICAgICByZXR1cm4gMTsgLy8gUlVOTklORworICAgICAgICB9CisgICAgICAgIGlmKCBpbml0aWFsaXplZCApIHsKKyAgICAgICAgICAgIHJldHVybiAwOyAvLyBzdGFydGluZyA/IAorICAgICAgICB9CisgICAgICAgIGlmKCAhIGF2YWlsYWJsZSApIHsgCisgICAgICAgICAgICByZXR1cm4gNDsgLy9GQUlMRUQKKyAgICAgICAgfQorICAgICAgICAvLyAyIC0gU1RPUFBJTkcKKyAgICAgICAgcmV0dXJuIDM7IC8vIFNUT1BQRUQKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIEoyRUUgU2VydmVyIE9iamVjdE5hbWUgdGhpcyBtb2R1bGUgaXMgZGVwbG95ZWQgb24uCisgICAgICovICAgICAKKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2ZXIgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBKYXZhIHZpcnR1YWwgbWFjaGluZXMgb24gd2hpY2ggdGhpcyBtb2R1bGUgaXMgcnVubmluZy4KKyAgICAgKi8gICAgICAgCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBqYXZhVk1zID0gbnVsbDsKKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlcigpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZlcjsKKyAgICB9CisgICAgICAgIAorICAgIHB1YmxpYyBTdHJpbmcgc2V0U2VydmVyKFN0cmluZyBzZXJ2ZXIpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2VydmVyPXNlcnZlcjsKKyAgICB9CisgICAgICAgIAorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRKYXZhVk1zKCkgeworICAgICAgICByZXR1cm4gamF2YVZNczsKKyAgICB9CisgICAgICAgIAorICAgIHB1YmxpYyBTdHJpbmdbXSBzZXRKYXZhVk1zKFN0cmluZ1tdIGphdmFWTXMpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuamF2YVZNcyA9IGphdmFWTXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIHRpbWUgdGhpcyBjb250ZXh0IHdhcyBzdGFydGVkLgorICAgICAqCisgICAgICogQHJldHVybiBUaW1lIChpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwLCAwMDowMDowMCkgd2hlbiB0aGlzCisgICAgICogY29udGV4dCB3YXMgc3RhcnRlZCAKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTdGFydFRpbWUoKSB7CisgICAgICAgIHJldHVybiBzdGFydFRpbWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzRXZlbnRQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRpc3RpY3NQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkQ29udGV4dFZhbHZlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZENvbnRleHRWYWx2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZjQ3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZENvbnRleHRWYWx2ZS5qYXZhCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RFdmVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0TGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5XcmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuVmFsdmVCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLk1lc3NhZ2VCeXRlczsKKworLyoqCisgKiBWYWx2ZSB0aGF0IGltcGxlbWVudHMgdGhlIGRlZmF1bHQgYmFzaWMgYmVoYXZpb3IgZm9yIHRoZQorICogPGNvZGU+U3RhbmRhcmRDb250ZXh0PC9jb2RlPiBjb250YWluZXIgaW1wbGVtZW50YXRpb24uCisgKiA8cD4KKyAqIDxiPlVTQUdFIENPTlNUUkFJTlQ8L2I+OiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBsaWtlbHkgdG8gYmUgdXNlZnVsIG9ubHkKKyAqIHdoZW4gcHJvY2Vzc2luZyBIVFRQIHJlcXVlc3RzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitmaW5hbCBjbGFzcyBTdGFuZGFyZENvbnRleHRWYWx2ZQorICAgIGV4dGVuZHMgVmFsdmVCYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dFZhbHZlLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICBwcml2YXRlIFN0YW5kYXJkQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBWYWx2ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENhc3QgdG8gYSBTdGFuZGFyZENvbnRleHQgcmlnaHQgYXdheSwgYXMgaXQgd2lsbCBiZSBuZWVkZWQgbGF0ZXIuCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lZCNzZXRDb250YWluZXIob3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXIpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgc3VwZXIuc2V0Q29udGFpbmVyKGNvbnRhaW5lcik7CisgICAgICAgIGNvbnRleHQgPSAoU3RhbmRhcmRDb250ZXh0KSBjb250YWluZXI7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBjaGlsZCBXcmFwcGVyIHRvIHByb2Nlc3MgdGhpcyByZXF1ZXN0LAorICAgICAqIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcmVxdWVzdCBVUkkuICBJZiBubyBtYXRjaGluZyBXcmFwcGVyIGNhbgorICAgICAqIGJlIGZvdW5kLCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgSFRUUCBlcnJvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3QgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlIHRvIGJlIHByb2R1Y2VkCisgICAgICogQHBhcmFtIHZhbHZlQ29udGV4dCBWYWx2ZSBjb250ZXh0IHVzZWQgdG8gZm9yd2FyZCB0byB0aGUgbmV4dCBWYWx2ZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgaW52b2tlKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRGlzYWxsb3cgYW55IGRpcmVjdCBhY2Nlc3MgdG8gcmVzb3VyY2VzIHVuZGVyIFdFQi1JTkYgb3IgTUVUQS1JTkYKKyAgICAgICAgTWVzc2FnZUJ5dGVzIHJlcXVlc3RQYXRoTUIgPSByZXF1ZXN0LmdldFJlcXVlc3RQYXRoTUIoKTsKKyAgICAgICAgaWYgKChyZXF1ZXN0UGF0aE1CLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCIvTUVUQS1JTkYvIiwgMCkpCisgICAgICAgICAgICB8fCAocmVxdWVzdFBhdGhNQi5lcXVhbHNJZ25vcmVDYXNlKCIvTUVUQS1JTkYiKSkKKyAgICAgICAgICAgIHx8IChyZXF1ZXN0UGF0aE1CLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCIvV0VCLUlORi8iLCAwKSkKKyAgICAgICAgICAgIHx8IChyZXF1ZXN0UGF0aE1CLmVxdWFsc0lnbm9yZUNhc2UoIi9XRUItSU5GIikpKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0RGVjb2RlZFJlcXVlc3RVUkkoKTsKKyAgICAgICAgICAgIG5vdEZvdW5kKHJlcXVlc3RVUkksIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdhaXQgaWYgd2UgYXJlIHJlbG9hZGluZworICAgICAgICB3aGlsZSAoY29udGV4dC5nZXRQYXVzZWQoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2VsZWN0IHRoZSBXcmFwcGVyIHRvIGJlIHVzZWQgZm9yIHRoaXMgUmVxdWVzdAorICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSByZXF1ZXN0LmdldFdyYXBwZXIoKTsKKyAgICAgICAgaWYgKHdyYXBwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RVUkkgPSByZXF1ZXN0LmdldERlY29kZWRSZXF1ZXN0VVJJKCk7CisgICAgICAgICAgICBub3RGb3VuZChyZXF1ZXN0VVJJLCByZXNwb25zZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3JtYWwgcmVxdWVzdCBwcm9jZXNzaW5nCisgICAgICAgIE9iamVjdCBpbnN0YW5jZXNbXSA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25FdmVudExpc3RlbmVycygpOworCisgICAgICAgIFNlcnZsZXRSZXF1ZXN0RXZlbnQgZXZlbnQgPSBudWxsOworCisgICAgICAgIGlmICgoaW5zdGFuY2VzICE9IG51bGwpIAorICAgICAgICAgICAgICAgICYmIChpbnN0YW5jZXMubGVuZ3RoID4gMCkpIHsKKyAgICAgICAgICAgIGV2ZW50ID0gbmV3IFNlcnZsZXRSZXF1ZXN0RXZlbnQKKyAgICAgICAgICAgICAgICAoKChTdGFuZGFyZENvbnRleHQpIGNvbnRhaW5lcikuZ2V0U2VydmxldENvbnRleHQoKSwgCisgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UmVxdWVzdCgpKTsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBwcmUtc2VydmljZSBldmVudAorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VzW2ldID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmICghKGluc3RhbmNlc1tpXSBpbnN0YW5jZW9mIFNlcnZsZXRSZXF1ZXN0TGlzdGVuZXIpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBTZXJ2bGV0UmVxdWVzdExpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgKFNlcnZsZXRSZXF1ZXN0TGlzdGVuZXIpIGluc3RhbmNlc1tpXTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5yZXF1ZXN0SW5pdGlhbGl6ZWQoZXZlbnQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5yZXF1ZXN0TGlzdGVuZXIucmVxdWVzdEluaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlc1tpXS5nZXRDbGFzcygpLmdldE5hbWUoKSksIHQpOworICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0UmVxdWVzdCBzcmVxID0gcmVxdWVzdC5nZXRSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIHNyZXEuc2V0QXR0cmlidXRlKEdsb2JhbHMuRVhDRVBUSU9OX0FUVFIsdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3cmFwcGVyLmdldFBpcGVsaW5lKCkuZ2V0Rmlyc3QoKS5pbnZva2UocmVxdWVzdCwgcmVzcG9uc2UpOworCisgICAgICAgIGlmICgoaW5zdGFuY2VzICE9bnVsbCApICYmCisgICAgICAgICAgICAgICAgKGluc3RhbmNlcy5sZW5ndGggPiAwKSkgeworICAgICAgICAgICAgLy8gY3JlYXRlIHBvc3Qtc2VydmljZSBldmVudAorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VzW2ldID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmICghKGluc3RhbmNlc1tpXSBpbnN0YW5jZW9mIFNlcnZsZXRSZXF1ZXN0TGlzdGVuZXIpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBTZXJ2bGV0UmVxdWVzdExpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgKFNlcnZsZXRSZXF1ZXN0TGlzdGVuZXIpIGluc3RhbmNlc1tpXTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5yZXF1ZXN0RGVzdHJveWVkKGV2ZW50KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQucmVxdWVzdExpc3RlbmVyLnJlcXVlc3REZXN0cm95IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXNbaV0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlcXVlc3Qgc3JlcSA9IHJlcXVlc3QuZ2V0UmVxdWVzdCgpOworICAgICAgICAgICAgICAgICAgICBzcmVxLnNldEF0dHJpYnV0ZShHbG9iYWxzLkVYQ0VQVElPTl9BVFRSLHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlcG9ydCBhICJub3QgZm91bmQiIGVycm9yIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLiAgRklYTUU6ICBXZQorICAgICAqIHNob3VsZCByZWFsbHkgYmUgdXNpbmcgdGhlIGVycm9yIHJlcG9ydGluZyBzZXR0aW5ncyBmb3IgdGhpcyB3ZWIKKyAgICAgKiBhcHBsaWNhdGlvbiwgYnV0IGN1cnJlbnRseSB0aGF0IGNvZGUgcnVucyBhdCB0aGUgd3JhcHBlciBsZXZlbCByYXRoZXIKKyAgICAgKiB0aGFuIHRoZSBjb250ZXh0IGxldmVsLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3RVUkkgVGhlIHJlcXVlc3QgVVJJIGZvciB0aGUgcmVxdWVzdGVkIHJlc291cmNlCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbm90Rm91bmQoU3RyaW5nIHJlcXVlc3RVUkksIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5ELCByZXF1ZXN0VVJJKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgOworICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRFbmdpbmUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkRW5naW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1NDU4MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkRW5naW5lLmphdmEKQEAgLTAsMCArMSw1MzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KQUFTUmVhbG07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlNlcnZlckluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIubW9kdWxlcy5NYmVhbnNTb3VyY2U7CisKKy8qKgorICogU3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxiPkVuZ2luZTwvYj4gaW50ZXJmYWNlLiAgRWFjaAorICogY2hpbGQgY29udGFpbmVyIG11c3QgYmUgYSBIb3N0IGltcGxlbWVudGF0aW9uIHRvIHByb2Nlc3MgdGhlIHNwZWNpZmljCisgKiBmdWxseSBxdWFsaWZpZWQgaG9zdCBuYW1lIG9mIHRoYXQgdmlydHVhbCBob3N0LiA8YnIvPgorICogWW91IGNhbiBzZXQgdGhlIGp2bVJvdXRlIGRpcmVjdCBvciB3aXRoIHRoZSBTeXN0ZW0ucHJvcGVydHkgPGI+anZtUm91dGU8L2I+LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRFbmdpbmUKKyAgICBleHRlbmRzIENvbnRhaW5lckJhc2UKKyAgICBpbXBsZW1lbnRzIEVuZ2luZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3RhbmRhcmRFbmdpbmUuY2xhc3MpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBTdGFuZGFyZEVuZ2luZSBjb21wb25lbnQgd2l0aCB0aGUgZGVmYXVsdCBiYXNpYyBWYWx2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhbmRhcmRFbmdpbmUoKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgcGlwZWxpbmUuc2V0QmFzaWMobmV3IFN0YW5kYXJkRW5naW5lVmFsdmUoKSk7CisgICAgICAgIC8qIFNldCB0aGUgam12Um91dGUgdXNpbmcgdGhlIHN5c3RlbSBwcm9wZXJ0eSBqdm1Sb3V0ZSAqLworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0SnZtUm91dGUoU3lzdGVtLmdldFByb3BlcnR5KCJqdm1Sb3V0ZSIpKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgfQorICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZW5naW5lIHdpbGwgaG9sZCB0aGUgcmVsb2FkaW5nIHRocmVhZAorICAgICAgICBiYWNrZ3JvdW5kUHJvY2Vzc29yRGVsYXkgPSAxMDsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIEhvc3QgbmFtZSB0byB1c2Ugd2hlbiBubyBzZXJ2ZXIgaG9zdCwgb3IgYW4gdW5rbm93biBob3N0LAorICAgICAqIGlzIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0SG9zdCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBzdHJpbmcgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5TZXJ2aWNlPC9jb2RlPiB0aGF0IG93bnMgdGhpcyBFbmdpbmUsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZpY2Ugc2VydmljZSA9IG51bGw7CisKKyAgICAvKiogQWxsb3cgdGhlIGJhc2UgZGlyIHRvIGJlIHNwZWNpZmllZCBleHBsaWNpdGVseSBmb3IKKyAgICAgKiBlYWNoIGVuZ2luZS4gSW4gdGltZSB3ZSBzaG91bGQgc3RvcCB1c2luZyBjYXRhbGluYS5iYXNlIHByb3BlcnR5IC0KKyAgICAgKiBvdGhlcndpc2Ugd2UgbG9vc2Ugc29tZSBmbGV4aWJpbGl0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBiYXNlRGlyID0gbnVsbDsKKworICAgIC8qKiBPcHRpb25hbCBtYmVhbnMgY29uZmlnIGZpbGUuIFRoaXMgd2lsbCByZXBsYWNlIHRoZSAiaGFja3MiIGluCisgICAgICogamsgYW5kIFNlcnZlckxpc3RlbmVyLiBUaGUgbWJlYW5zIGZpbGUgd2lsbCBzdXBwb3J0ICh0cmFuc3BhcmVudCkgCisgICAgICogcGVyc2lzdGVuY2UgLSBzb29uLiBJdCdsbCBwcm9iYWJseSByZXBsYWNlIGprMi5wcm9wZXJ0aWVzIGFuZCBjb3VsZAorICAgICAqIHJlcGxhY2Ugc2VydmVyLnhtbC4gT2YgY291cnNlIC0gdGhlIHNhbWUgYmVhbnMgY291bGQgYmUgbG9hZGVkIGFuZCAKKyAgICAgKiBtYW5hZ2VkIGJ5IGFuIGV4dGVybmFsIGVudGl0eSAtIGxpa2UgdGhlIGVtYmVkZGluZyBhcHAgLSB3aGljaAorICAgICAqICBjYW4gdXNlIGEgZGlmZmVyZW50IHBlcnNpc3RlbmNlIG1lY2hhbmlzbS4KKyAgICAgKi8gCisgICAgcHJpdmF0ZSBTdHJpbmcgbWJlYW5zRmlsZSA9IG51bGw7CisgICAgCisgICAgLyoqIE1iZWFucyBsb2FkZWQgYnkgdGhlIGVuZ2luZS4gIAorICAgICAqLyAKKyAgICBwcml2YXRlIExpc3QgbWJlYW5zOworICAgIAorCisgICAgLyoqCisgICAgICogVGhlIEpWTSBSb3V0ZSBJRCBmb3IgdGhpcyBUb21jYXQgaW5zdGFuY2UuIEFsbCBSb3V0ZSBJRCdzIG11c3QgYmUgdW5pcXVlCisgICAgICogYWNyb3NzIHRoZSBjbHVzdGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGp2bVJvdXRlSWQ7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqIFByb3ZpZGUgYSBkZWZhdWx0IGluIGNhc2Ugbm8gZXhwbGljaXQgY29uZmlndXJhdGlvbiBpcyBzZXQKKyAgICAgKgorICAgICAqIEByZXR1cm4gY29uZmlndXJlZCByZWFsbSwgb3IgYSBKQUFTIHJlYWxtIGJ5IGRlZmF1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVhbG0gZ2V0UmVhbG0oKSB7CisgICAgICAgIFJlYWxtIGNvbmZpZ3VyZWQ9c3VwZXIuZ2V0UmVhbG0oKTsKKyAgICAgICAgLy8gSWYgbm8gc2V0IHJlYWxtIGhhcyBiZWVuIGNhbGxlZCAtIGRlZmF1bHQgdG8gSkFBUworICAgICAgICAvLyBUaGlzIGNhbiBiZSBvdmVycmlkZW4gYXQgZW5naW5lLCBjb250ZXh0IGFuZCBob3N0IGxldmVsICAKKyAgICAgICAgaWYoIGNvbmZpZ3VyZWQ9PW51bGwgKSB7CisgICAgICAgICAgICBjb25maWd1cmVkPW5ldyBKQUFTUmVhbG0oKTsKKyAgICAgICAgICAgIHRoaXMuc2V0UmVhbG0oIGNvbmZpZ3VyZWQgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29uZmlndXJlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCBob3N0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEhvc3QoKSB7CisKKyAgICAgICAgcmV0dXJuIChkZWZhdWx0SG9zdCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVmYXVsdCBob3N0LgorICAgICAqCisgICAgICogQHBhcmFtIGhvc3QgVGhlIG5ldyBkZWZhdWx0IGhvc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0SG9zdChTdHJpbmcgaG9zdCkgeworCisgICAgICAgIFN0cmluZyBvbGREZWZhdWx0SG9zdCA9IHRoaXMuZGVmYXVsdEhvc3Q7CisgICAgICAgIGlmIChob3N0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZGVmYXVsdEhvc3QgPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5kZWZhdWx0SG9zdCA9IGhvc3QudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiZGVmYXVsdEhvc3QiLCBvbGREZWZhdWx0SG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0SG9zdCk7CisKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSApIHsKKyAgICAgICAgaWYoIGRvbWFpbiAhPSBudWxsICkgeworICAgICAgICAgICAgLy8ga2VlcCBuYW1lPT1kb21haW4sIGlnbm9yZSBvdmVycmlkZQorICAgICAgICAgICAgLy8gd2UgYXJlIGFscmVhZHkgcmVnaXN0ZXJlZAorICAgICAgICAgICAgc3VwZXIuc2V0TmFtZSggZG9tYWluICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIGVuZ2luZSBuYW1lIGlzIHVzZWQgYXMgZG9tYWluCisgICAgICAgIGRvbWFpbj1uYW1lOyAvLyBYWFggc2hvdWxkIHdlIHNldCBpdCBpbiBpbml0KCkgPyBJdCBzaG91bGRuJ3QgbWF0dGVyCisgICAgICAgIHN1cGVyLnNldE5hbWUoIG5hbWUgKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2x1c3Rlci13aWRlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIEVuZ2luZS4KKyAgICAgKiBUaGlzIHZhbHVlIGlzIG9ubHkgdXNlZnVsIGluIGEgbG9hZC1iYWxhbmNpbmcgc2NlbmFyaW8uCisgICAgICogPHA+CisgICAgICogVGhpcyBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIGNoYW5nZWQgb25jZSBpdCBpcyBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SnZtUm91dGUoU3RyaW5nIHJvdXRlSWQpIHsKKyAgICAgICAganZtUm91dGVJZCA9IHJvdXRlSWQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY2x1c3Rlci13aWRlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIEVuZ2luZS4KKyAgICAgKiBUaGlzIHZhbHVlIGlzIG9ubHkgdXNlZnVsIGluIGEgbG9hZC1iYWxhbmNpbmcgc2NlbmFyaW8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRKdm1Sb3V0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGp2bVJvdXRlSWQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPlNlcnZpY2U8L2NvZGU+IHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQgKGlmIGFueSkuCisgICAgICovCisgICAgcHVibGljIFNlcnZpY2UgZ2V0U2VydmljZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuc2VydmljZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+U2VydmljZTwvY29kZT4gd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZCAoaWYgYW55KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRoYXQgb3ducyB0aGlzIEVuZ2luZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKSB7CisgICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNYmVhbnNGaWxlKCkgeworICAgICAgICByZXR1cm4gbWJlYW5zRmlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYmVhbnNGaWxlKFN0cmluZyBtYmVhbnNGaWxlKSB7CisgICAgICAgIHRoaXMubWJlYW5zRmlsZSA9IG1iZWFuc0ZpbGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRCYXNlRGlyKCkgeworICAgICAgICBpZiggYmFzZURpcj09bnVsbCApIHsKKyAgICAgICAgICAgIGJhc2VEaXI9U3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGJhc2VEaXI9PW51bGwgKSB7CisgICAgICAgICAgICBiYXNlRGlyPVN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuaG9tZSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiYXNlRGlyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJhc2VEaXIoU3RyaW5nIGJhc2VEaXIpIHsKKyAgICAgICAgdGhpcy5iYXNlRGlyID0gYmFzZURpcjsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgY2hpbGQgQ29udGFpbmVyLCBvbmx5IGlmIHRoZSBwcm9wb3NlZCBjaGlsZCBpcyBhbiBpbXBsZW1lbnRhdGlvbgorICAgICAqIG9mIEhvc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGQgQ2hpbGQgY29udGFpbmVyIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoQ29udGFpbmVyIGNoaWxkKSB7CisKKyAgICAgICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBIb3N0KSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZEVuZ2luZS5ub3RIb3N0IikpOworICAgICAgICBzdXBlci5hZGRDaGlsZChjaGlsZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIENvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2FsbG93IGFueSBhdHRlbXB0IHRvIHNldCBhIHBhcmVudCBmb3IgdGhpcyBDb250YWluZXIsIHNpbmNlIGFuCisgICAgICogRW5naW5lIGlzIHN1cHBvc2VkIHRvIGJlIGF0IHRoZSB0b3Agb2YgdGhlIENvbnRhaW5lciBoaWVyYXJjaHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFByb3Bvc2VkIHBhcmVudCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoQ29udGFpbmVyIGNvbnRhaW5lcikgeworCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkRW5naW5lLm5vdFBhcmVudCIpKTsKKworICAgIH0KKworCisgICAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkPWZhbHNlOworICAgIAorICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIGlmKCBpbml0aWFsaXplZCApIHJldHVybjsKKyAgICAgICAgaW5pdGlhbGl6ZWQ9dHJ1ZTsKKworICAgICAgICBpZiggb25hbWU9PW51bGwgKSB7CisgICAgICAgICAgICAvLyBub3QgcmVnaXN0ZXJlZCBpbiBKTVggeWV0IC0gc3RhbmRhbG9uZSBtb2RlCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChkb21haW49PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZG9tYWluPWdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyggIlJlZ2lzdGVyICIgKyBkb21haW4gKTsKKyAgICAgICAgICAgICAgICBvbmFtZT1uZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9RW5naW5lIik7CisgICAgICAgICAgICAgICAgY29udHJvbGxlcj1vbmFtZTsKKyAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXJDb21wb25lbnQodGhpcywgb25hbWUsIG51bGwpOworICAgICAgICAgICAgfSBjYXRjaCggVGhyb3dhYmxlIHQgKSB7CisgICAgICAgICAgICAgICAgbG9nLmluZm8oIkVycm9yIHJlZ2lzdGVyaW5nICIsIHQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCBtYmVhbnNGaWxlID09IG51bGwgKSB7CisgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdE1CZWFuc0ZpbGU9Z2V0QmFzZURpcigpICsgIi9jb25mL3RvbWNhdDUtbWJlYW5zLnhtbCI7CisgICAgICAgICAgICBGaWxlIGY9bmV3IEZpbGUoIGRlZmF1bHRNQmVhbnNGaWxlICk7CisgICAgICAgICAgICBpZiggZi5leGlzdHMoKSApIG1iZWFuc0ZpbGU9Zi5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgfQorICAgICAgICBpZiggbWJlYW5zRmlsZSAhPSBudWxsICkgeworICAgICAgICAgICAgcmVhZEVuZ2luZU1iZWFucygpOworICAgICAgICB9CisgICAgICAgIGlmKCBtYmVhbnMgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkuaW52b2tlKG1iZWFucywgImluaXQiLCBmYWxzZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXJyb3IgaW4gaW5pdCgpIGZvciAiICsgbWJlYW5zRmlsZSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIG5vdCBuZWVkZWQgc2luY2UgdGhlIGZvbGxvd2luZyBpZiBzdGF0ZW1lbnQgZG9lcyB0aGUgc2FtZSB0aGluZyB0aGUgcmlnaHQgd2F5CisgICAgICAgIC8vIHJlbW92ZSBsYXRlciBhZnRlciBjaGVja2luZworICAgICAgICAvL2lmKCBzZXJ2aWNlPT1udWxsICkgeworICAgICAgICAvLyAgICB0cnkgeworICAgICAgICAvLyAgICAgICAgT2JqZWN0TmFtZSBzZXJ2aWNlTmFtZT1nZXRQYXJlbnROYW1lKCk7ICAgICAgICAKKyAgICAgICAgLy8gICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZCggc2VydmljZU5hbWUgKSkgeworICAgICAgICAvLyAgICAgICAgICAgIGxvZy5pbmZvKCJSZWdpc3RlcmluZyB3aXRoIHRoZSBzZXJ2aWNlICIpOworICAgICAgICAvLyAgICAgICAgICAgIHRyeSB7CisgICAgICAgIC8vICAgICAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKCBzZXJ2aWNlTmFtZSwgInNldENvbnRhaW5lciIsCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgdGhpcyB9LAorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lciIgfSApOworICAgICAgICAvLyAgICAgICAgICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgLy8gICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgLy8gICAgICAgICAgICB9CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgLy8gICAgICAgIGxvZy5lcnJvcigiRXJyb3IgcmVnaXN0ZXJpbmcgd2l0aCBzZXJ2aWNlICIpOworICAgICAgICAvLyAgICB9CisgICAgICAgIC8vfQorICAgICAgICAKKyAgICAgICAgaWYoIHNlcnZpY2U9PW51bGwgKSB7CisgICAgICAgICAgICAvLyBmb3IgY29uc2lzdGVuY3kuLi46IHdlIGFyZSBwcm9iYWJseSBpbiBlbWJlZGVkIG1vZGUKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VydmljZT1uZXcgU3RhbmRhcmRTZXJ2aWNlKCk7CisgICAgICAgICAgICAgICAgc2VydmljZS5zZXRDb250YWluZXIoIHRoaXMgKTsKKyAgICAgICAgICAgICAgICBzZXJ2aWNlLmluaXRpYWxpemUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2goIFRocm93YWJsZSB0ICkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICBpZiggISBpbml0aWFsaXplZCApIHJldHVybjsKKyAgICAgICAgaW5pdGlhbGl6ZWQ9ZmFsc2U7CisgICAgICAgIAorICAgICAgICAvLyBpZiB3ZSBjcmVhdGVkIGl0LCBtYWtlIHN1cmUgaXQncyBhbHNvIGRlc3Ryb3llZAorICAgICAgICAvLyB0aGlzIGNhbGwgaW1wbGl6aXQgdGhpcy5zdG9wKCkKKyAgICAgICAgKChTdGFuZGFyZFNlcnZpY2Upc2VydmljZSkuZGVzdHJveSgpOworCisgICAgICAgIGlmKCBtYmVhbnMgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgLmludm9rZShtYmVhbnMsICJkZXN0cm95IiwgZmFsc2UpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZEVuZ2luZS51bnJlZ2lzdGVyLm1iZWFucy5mYWlsZWQiICxtYmVhbnNGaWxlKSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gCisgICAgICAgIGlmKCBtYmVhbnMgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaT0wOyBpPG1iZWFucy5zaXplKCkgOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAudW5yZWdpc3RlckNvbXBvbmVudCgoT2JqZWN0TmFtZSltYmVhbnMuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkRW5naW5lLnVucmVnaXN0ZXIubWJlYW5zLmZhaWxlZCIsIG1iZWFuc0ZpbGUpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gZm9yY2UgYWxsIG1ldGFkYXRhIHRvIGJlIHJlbG9hZGVkLgorICAgICAgICAvLyBUaGF0IGRvZXNuJ3QgYWZmZWN0IGV4aXN0aW5nIGJlYW5zLiBXZSBzaG91bGQgbWFrZSBpdCBwZXIKKyAgICAgICAgLy8gcmVnaXN0cnkgLSBhbmQgc3RvcCB1c2luZyB0aGUgc3RhdGljLgorICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS5yZXNldE1ldGFkYXRhKCk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGlzIEVuZ2luZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiBhIHN0YXJ0dXAgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoIHN0YXJ0ZWQgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYoICFpbml0aWFsaXplZCApIHsKKyAgICAgICAgICAgIGluaXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvb2sgZm9yIGEgcmVhbG0gLSB0aGF0IG1heSBoYXZlIGJlZW4gY29uZmlndXJlZCBlYXJsaWVyLiAKKyAgICAgICAgLy8gSWYgdGhlIHJlYWxtIGlzIGFkZGVkIGFmdGVyIGNvbnRleHQgLSBpdCdsbCBzZXQgaXRzZWxmLgorICAgICAgICBpZiggcmVhbG0gPT0gbnVsbCApIHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgcmVhbG1OYW1lPW51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlYWxtTmFtZT1uZXcgT2JqZWN0TmFtZSggZG9tYWluICsgIjp0eXBlPVJlYWxtIik7CisgICAgICAgICAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKHJlYWxtTmFtZSApICkgeworICAgICAgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZShyZWFsbU5hbWUsICJpbml0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7fQorICAgICAgICAgICAgICAgICAgICApOyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2goIFRocm93YWJsZSB0ICkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gcmVhbG0gZm9yIHRoaXMgZW5naW5lICIgKyByZWFsbU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgLy8gTG9nIG91ciBzZXJ2ZXIgaWRlbnRpZmljYXRpb24gaW5mb3JtYXRpb24KKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oU2VydmVySW5mby5nZXRTZXJ2ZXJJbmZvKCkpOworICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oICJTdGFydGluZyBTZXJ2bGV0IEVuZ2luZTogIiArIFNlcnZlckluZm8uZ2V0U2VydmVySW5mbygpKTsKKyAgICAgICAgaWYoIG1iZWFucyAhPSBudWxsICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKQorICAgICAgICAgICAgICAgICAgICAuaW52b2tlKG1iZWFucywgInN0YXJ0IiwgZmFsc2UpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIGluIHN0YXJ0KCkgZm9yICIgKyBtYmVhbnNGaWxlLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YW5kYXJkIGNvbnRhaW5lciBzdGFydHVwCisgICAgICAgIHN1cGVyLnN0YXJ0KCk7CisKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICBzdXBlci5zdG9wKCk7CisgICAgICAgIGlmKCBtYmVhbnMgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkuaW52b2tlKG1iZWFucywgInN0b3AiLCBmYWxzZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXJyb3IgaW4gc3RvcCgpIGZvciAiICsgbWJlYW5zRmlsZSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlN0YW5kYXJkRW5naW5lWyIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBKTVggcmVnaXN0cmF0aW9uICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIE9iamVjdE5hbWUgcHJlUmVnaXN0ZXIoTUJlYW5TZXJ2ZXIgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc3VwZXIucHJlUmVnaXN0ZXIoc2VydmVyLG5hbWUpOworCisgICAgICAgIHRoaXMuc2V0TmFtZSggbmFtZS5nZXREb21haW4oKSk7CisKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLy8gRklYTUUgUmVtb3ZlIC0tIG5vdCB1c2VkIAorICAgIHB1YmxpYyBPYmplY3ROYW1lIGdldFBhcmVudE5hbWUoKSB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChnZXRTZXJ2aWNlKCk9PW51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0U2VydmljZSgpLmdldE5hbWUoKTsKKyAgICAgICAgT2JqZWN0TmFtZSBzZXJ2aWNlTmFtZT1uZXcgT2JqZWN0TmFtZShkb21haW4gKworICAgICAgICAgICAgICAgICAgICAgICAgIjp0eXBlPVNlcnZpY2Usc2VydmljZU5hbWU9IituYW1lKTsKKyAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lOyAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLCBPYmplY3ROYW1lIHBhcmVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGUgT2JqZWN0TmFtZSAiICsgZG9tYWluICsgIiAiICsgcGFyZW50ICk7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0TmFtZSggZG9tYWluICsgIjp0eXBlPUVuZ2luZSIpOworICAgIH0KKworICAgIAorICAgIHByaXZhdGUgdm9pZCByZWFkRW5naW5lTWJlYW5zKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWJlYW5zU291cmNlIG1iZWFuc01CPW5ldyBNYmVhbnNTb3VyY2UoKTsKKyAgICAgICAgICAgIEZpbGUgbWJlYW5zRj1uZXcgRmlsZSggbWJlYW5zRmlsZSApOworICAgICAgICAgICAgbWJlYW5zTUIuc2V0U291cmNlKG1iZWFuc0YpOworICAgICAgICAgICAgCisgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS5yZWdpc3RlckNvbXBvbmVudAorICAgICAgICAgICAgICAgIChtYmVhbnNNQiwgZG9tYWluICsgIjp0eXBlPU1iZWFuc0ZpbGUiLCBudWxsKTsKKyAgICAgICAgICAgIG1iZWFuc01CLmxvYWQoKTsKKyAgICAgICAgICAgIG1iZWFuc01CLmluaXQoKTsKKyAgICAgICAgICAgIG1iZWFuc01CLnNldFJlZ2lzdHJ5KFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpKTsKKyAgICAgICAgICAgIG1iZWFucz1tYmVhbnNNQi5nZXRNQmVhbnMoKTsKKyAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoKCBUaHJvd2FibGUgdCApIHsKKyAgICAgICAgICAgIGxvZy5lcnJvciggIkVycm9yIGxvYWRpbmcgIiArIG1iZWFuc0ZpbGUsIHQgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXREb21haW4oKSB7CisgICAgICAgIGlmIChkb21haW4hPW51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBkb21haW47CisgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREb21haW4oU3RyaW5nIGRvbWFpbikgeworICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZEVuZ2luZVZhbHZlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZEVuZ2luZVZhbHZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjNWU4MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkRW5naW5lVmFsdmUuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmU7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5WYWx2ZUJhc2U7CisKKworLyoqCisgKiBWYWx2ZSB0aGF0IGltcGxlbWVudHMgdGhlIGRlZmF1bHQgYmFzaWMgYmVoYXZpb3IgZm9yIHRoZQorICogPGNvZGU+U3RhbmRhcmRFbmdpbmU8L2NvZGU+IGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbi4KKyAqIDxwPgorICogPGI+VVNBR0UgQ09OU1RSQUlOVDwvYj46ICBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGxpa2VseSB0byBiZSB1c2VmdWwgb25seQorICogd2hlbiBwcm9jZXNzaW5nIEhUVFAgcmVxdWVzdHMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK2ZpbmFsIGNsYXNzIFN0YW5kYXJkRW5naW5lVmFsdmUKKyAgICBleHRlbmRzIFZhbHZlQmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEVuZ2luZVZhbHZlLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGNoaWxkIEhvc3QgdG8gcHJvY2VzcyB0aGlzIHJlcXVlc3QsCisgICAgICogYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBzZXJ2ZXIgbmFtZS4gIElmIG5vIG1hdGNoaW5nIEhvc3QgY2FuCisgICAgICogYmUgZm91bmQsIHJldHVybiBhbiBhcHByb3ByaWF0ZSBIVFRQIGVycm9yLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2UgdG8gYmUgcHJvZHVjZWQKKyAgICAgKiBAcGFyYW0gdmFsdmVDb250ZXh0IFZhbHZlIGNvbnRleHQgdXNlZCB0byBmb3J3YXJkIHRvIHRoZSBuZXh0IFZhbHZlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnJlZAorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBpbnZva2UoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBTZWxlY3QgdGhlIEhvc3QgdG8gYmUgdXNlZCBmb3IgdGhpcyBSZXF1ZXN0CisgICAgICAgIEhvc3QgaG9zdCA9IHJlcXVlc3QuZ2V0SG9zdCgpOworICAgICAgICBpZiAoaG9zdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJzdGFuZGFyZEVuZ2luZS5ub0hvc3QiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBBc2sgdGhpcyBIb3N0IHRvIHByb2Nlc3MgdGhpcyByZXF1ZXN0CisgICAgICAgIGhvc3QuZ2V0UGlwZWxpbmUoKS5nZXRGaXJzdCgpLmludm9rZShyZXF1ZXN0LCByZXNwb25zZSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkSG9zdC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRIb3N0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzMWI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkSG9zdC5qYXZhCkBAIC0wLDAgKzEsODUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkhvc3RDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuVmFsdmVCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworCisKKy8qKgorICogU3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxiPkhvc3Q8L2I+IGludGVyZmFjZS4gIEVhY2gKKyAqIGNoaWxkIGNvbnRhaW5lciBtdXN0IGJlIGEgQ29udGV4dCBpbXBsZW1lbnRhdGlvbiB0byBwcm9jZXNzIHRoZQorICogcmVxdWVzdHMgZGlyZWN0ZWQgdG8gYSBwYXJ0aWN1bGFyIHdlYiBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFN0YW5kYXJkSG9zdAorICAgIGV4dGVuZHMgQ29udGFpbmVyQmFzZQorICAgIGltcGxlbWVudHMgSG9zdCAgCisgeworICAgIC8qIFdoeSBkbyB3ZSBpbXBsZW1lbnQgZGVwbG95ZXIgYW5kIGRlbGVnYXRlIHRvIGRlcGxveWVyID8/PyAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFN0YW5kYXJkSG9zdC5jbGFzcyApOworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgU3RhbmRhcmRIb3N0IGNvbXBvbmVudCB3aXRoIHRoZSBkZWZhdWx0IGJhc2ljIFZhbHZlLgorICAgICAqLworICAgIHB1YmxpYyBTdGFuZGFyZEhvc3QoKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgcGlwZWxpbmUuc2V0QmFzaWMobmV3IFN0YW5kYXJkSG9zdFZhbHZlKCkpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBhbGlhc2VzIGZvciB0aGlzIEhvc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBhbGlhc2VzID0gbmV3IFN0cmluZ1swXTsKKworCisgICAgLyoqCisgICAgICogVGhlIGFwcGxpY2F0aW9uIHJvb3QgZm9yIHRoaXMgSG9zdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhcHBCYXNlID0gIi4iOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXV0byBkZXBsb3kgZmxhZyBmb3IgdGhpcyBIb3N0LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBhdXRvRGVwbG95ID0gdHJ1ZTsKKworCisgICAgLyoqCisgICAgICogVGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgZGVmYXVsdCBjb250ZXh0IGNvbmZpZ3VyYXRpb24gY2xhc3MKKyAgICAgKiBmb3IgZGVwbG95ZWQgd2ViIGFwcGxpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb25maWdDbGFzcyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQ29udGV4dENvbmZpZyI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBkZWZhdWx0IGhvc3QgY29uZmlnIGNvbmZpZ3VyYXRpb24gY2xhc3MgKGRlcGxveWVyKQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGhvc3RDb25maWdDbGFzcyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuSG9zdENvbmZpZyI7CisKKyAgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgZGVmYXVsdCBDb250ZXh0IGltcGxlbWVudGF0aW9uIGNsYXNzIGZvcgorICAgICAqIGRlcGxveWVkIHdlYiBhcHBsaWNhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dENsYXNzID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVwbG95IG9uIHN0YXJ0dXAgZmxhZyBmb3IgdGhpcyBIb3N0LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkZXBsb3lPblN0YXJ0dXAgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBkZXBsb3kgQ29udGV4dCBYTUwgY29uZmlnIGZpbGVzIHByb3BlcnR5LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkZXBsb3lYTUwgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBkZWZhdWx0IGVycm9yIHJlcG9ydGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIAorICAgICAqIGZvciBkZXBsb3llZCB3ZWIgYXBwbGljYXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGVycm9yUmVwb3J0VmFsdmVDbGFzcyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5FcnJvclJlcG9ydFZhbHZlIjsKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBzdHJpbmcgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdC8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBVbnBhY2sgV0FScyBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdW5wYWNrV0FScyA9IHRydWU7CisKKworICAgIC8qKgorICAgICAqIFdvcmsgRGlyZWN0b3J5IGJhc2UgZm9yIGFwcGxpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB3b3JrRGlyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIHZhbHVlIHVzZWQgdG8gdHVybiBvbi9vZmYgWE1MIHZhbGlkYXRpb24KKyAgICAgKi8KKyAgICAgcHJpdmF0ZSBib29sZWFuIHhtbFZhbGlkYXRpb24gPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIHZhbHVlIHVzZWQgdG8gdHVybiBvbi9vZmYgWE1MIG5hbWVzcGFjZSBhd2FyZW5lcy4KKyAgICAgKi8KKyAgICAgcHJpdmF0ZSBib29sZWFuIHhtbE5hbWVzcGFjZUF3YXJlID0gZmFsc2U7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFwcGxpY2F0aW9uIHJvb3QgZm9yIHRoaXMgSG9zdC4gIFRoaXMgY2FuIGJlIGFuIGFic29sdXRlCisgICAgICogcGF0aG5hbWUsIGEgcmVsYXRpdmUgcGF0aG5hbWUsIG9yIGEgVVJMLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwQmFzZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuYXBwQmFzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXBwbGljYXRpb24gcm9vdCBmb3IgdGhpcyBIb3N0LiAgVGhpcyBjYW4gYmUgYW4gYWJzb2x1dGUKKyAgICAgKiBwYXRobmFtZSwgYSByZWxhdGl2ZSBwYXRobmFtZSwgb3IgYSBVUkwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwQmFzZSBUaGUgbmV3IGFwcGxpY2F0aW9uIHJvb3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcHBCYXNlKFN0cmluZyBhcHBCYXNlKSB7CisKKyAgICAgICAgU3RyaW5nIG9sZEFwcEJhc2UgPSB0aGlzLmFwcEJhc2U7CisgICAgICAgIHRoaXMuYXBwQmFzZSA9IGFwcEJhc2U7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJhcHBCYXNlIiwgb2xkQXBwQmFzZSwgdGhpcy5hcHBCYXNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYXV0byBkZXBsb3kgZmxhZy4gIElmIHRydWUsIGl0IGluZGljYXRlcyB0aGF0IAorICAgICAqIHRoaXMgaG9zdCdzIGNoaWxkIHdlYmFwcHMgd2lsbCBiZSBkeW5hbWljYWxseSBkZXBsb3llZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBdXRvRGVwbG95KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5hdXRvRGVwbG95KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhdXRvIGRlcGxveSBmbGFnIHZhbHVlIGZvciB0aGlzIGhvc3QuCisgICAgICogCisgICAgICogQHBhcmFtIGF1dG9EZXBsb3kgVGhlIG5ldyBhdXRvIGRlcGxveSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0RlcGxveShib29sZWFuIGF1dG9EZXBsb3kpIHsKKworICAgICAgICBib29sZWFuIG9sZEF1dG9EZXBsb3kgPSB0aGlzLmF1dG9EZXBsb3k7CisgICAgICAgIHRoaXMuYXV0b0RlcGxveSA9IGF1dG9EZXBsb3k7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJhdXRvRGVwbG95Iiwgb2xkQXV0b0RlcGxveSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0b0RlcGxveSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb24gY2xhc3MKKyAgICAgKiBmb3IgbmV3IHdlYiBhcHBsaWNhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25maWdDbGFzcygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29uZmlnQ2xhc3MpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgY29udGV4dCBjb25maWd1cmF0aW9uIGNsYXNzCisgICAgICogZm9yIG5ldyB3ZWIgYXBwbGljYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZ0NsYXNzIFRoZSBuZXcgY29udGV4dCBjb25maWd1cmF0aW9uIGNsYXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnQ2xhc3MoU3RyaW5nIGNvbmZpZ0NsYXNzKSB7CisKKyAgICAgICAgU3RyaW5nIG9sZENvbmZpZ0NsYXNzID0gdGhpcy5jb25maWdDbGFzczsKKyAgICAgICAgdGhpcy5jb25maWdDbGFzcyA9IGNvbmZpZ0NsYXNzOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiY29uZmlnQ2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRDb25maWdDbGFzcywgdGhpcy5jb25maWdDbGFzcyk7CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgaG9zdCBjb25maWd1cmF0aW9uIGNsYXNzIChkZXBsb3llcikKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3RDb25maWdDbGFzcygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuaG9zdENvbmZpZ0NsYXNzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGhvc3QgY29uZmlnIGNvbmZpZ3VyYXRpb24gY2xhc3MgKGRlcGxveWVyKQorICAgICAqCisgICAgICogQHBhcmFtIGhvc3RDb25maWdDbGFzcyBUaGUgbmV3IGhvc3QgY29uZmlnIGNvbmZpZ3VyYXRpb24gY2xhc3MgKGRlcGxveWVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvc3RDb25maWdDbGFzcyhTdHJpbmcgaG9zdENvbmZpZ0NsYXNzKSB7CisKKyAgICAgICAgU3RyaW5nIG9sZEhvc3RDb25maWdDbGFzcyA9IHRoaXMuaG9zdENvbmZpZ0NsYXNzOworICAgICAgICB0aGlzLmhvc3RDb25maWdDbGFzcyA9IGhvc3RDb25maWdDbGFzczsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImhvc3RDb25maWdDbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEhvc3RDb25maWdDbGFzcywgdGhpcy5ob3N0Q29uZmlnQ2xhc3MpOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBDb250ZXh0IGltcGxlbWVudGF0aW9uIGNsYXNzCisgICAgICogZm9yIG5ldyB3ZWIgYXBwbGljYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dENsYXNzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jb250ZXh0Q2xhc3MpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgQ29udGV4dCBpbXBsZW1lbnRhdGlvbiBjbGFzcworICAgICAqIGZvciBuZXcgd2ViIGFwcGxpY2F0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0Q2xhc3MgVGhlIG5ldyBjb250ZXh0IGltcGxlbWVudGF0aW9uIGNsYXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dENsYXNzKFN0cmluZyBjb250ZXh0Q2xhc3MpIHsKKworICAgICAgICBTdHJpbmcgb2xkQ29udGV4dENsYXNzID0gdGhpcy5jb250ZXh0Q2xhc3M7CisgICAgICAgIHRoaXMuY29udGV4dENsYXNzID0gY29udGV4dENsYXNzOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiY29udGV4dENsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ29udGV4dENsYXNzLCB0aGlzLmNvbnRleHRDbGFzcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGRlcGxveSBvbiBzdGFydHVwIGZsYWcuICBJZiB0cnVlLCBpdCBpbmRpY2F0ZXMgCisgICAgICogdGhhdCB0aGlzIGhvc3QncyBjaGlsZCB3ZWJhcHBzIHNob3VsZCBiZSBkaXNjb3ZyZWQgYW5kIGF1dG9tYXRpY2FsbHkgCisgICAgICogZGVwbG95ZWQgYXQgc3RhcnR1cCB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldERlcGxveU9uU3RhcnR1cCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZGVwbG95T25TdGFydHVwKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXBsb3kgb24gc3RhcnR1cCBmbGFnIHZhbHVlIGZvciB0aGlzIGhvc3QuCisgICAgICogCisgICAgICogQHBhcmFtIGRlcGxveU9uU3RhcnR1cCBUaGUgbmV3IGRlcGxveSBvbiBzdGFydHVwIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXBsb3lPblN0YXJ0dXAoYm9vbGVhbiBkZXBsb3lPblN0YXJ0dXApIHsKKworICAgICAgICBib29sZWFuIG9sZERlcGxveU9uU3RhcnR1cCA9IHRoaXMuZGVwbG95T25TdGFydHVwOworICAgICAgICB0aGlzLmRlcGxveU9uU3RhcnR1cCA9IGRlcGxveU9uU3RhcnR1cDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImRlcGxveU9uU3RhcnR1cCIsIG9sZERlcGxveU9uU3RhcnR1cCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwbG95T25TdGFydHVwKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVwbG95IFhNTCBDb250ZXh0IGNvbmZpZyBmaWxlcyBmbGFnIGFjY2Vzc29yLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVwbG95WE1MKCkgeworCisgICAgICAgIHJldHVybiAoZGVwbG95WE1MKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVwbG95IFhNTCBDb250ZXh0IGNvbmZpZyBmaWxlcyBmbGFnIG11dGF0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVwbG95WE1MKGJvb2xlYW4gZGVwbG95WE1MKSB7CisKKyAgICAgICAgdGhpcy5kZXBsb3lYTUwgPSBkZXBsb3lYTUw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGxpdmUgZGVwbG95IGZsYWcuICBJZiB0cnVlLCBpdCBpbmRpY2F0ZXMgdGhhdCAKKyAgICAgKiBhIGJhY2tncm91bmQgdGhyZWFkIHNob3VsZCBiZSBzdGFydGVkIHRoYXQgbG9va3MgZm9yIHdlYiBhcHBsaWNhdGlvbgorICAgICAqIGNvbnRleHQgZmlsZXMsIFdBUiBmaWxlcywgb3IgdW5wYWNrZWQgZGlyZWN0b3JpZXMgYmVpbmcgZHJvcHBlZCBpbiB0bworICAgICAqIHRoZSA8Y29kZT5hcHBCYXNlPC9jb2RlPiBkaXJlY3RvcnksIGFuZCBkZXBsb3lzIG5ldyBvbmVzIGFzIHRoZXkgYXJlCisgICAgICogZW5jb3VudGVyZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0TGl2ZURlcGxveSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmF1dG9EZXBsb3kpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsaXZlIGRlcGxveSBmbGFnIHZhbHVlIGZvciB0aGlzIGhvc3QuCisgICAgICogCisgICAgICogQHBhcmFtIGxpdmVEZXBsb3kgVGhlIG5ldyBsaXZlIGRlcGxveSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGl2ZURlcGxveShib29sZWFuIGxpdmVEZXBsb3kpIHsKKyAgICAgICAgc2V0QXV0b0RlcGxveShsaXZlRGVwbG95KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBlcnJvciByZXBvcnQgdmFsdmUgY2xhc3MKKyAgICAgKiBmb3IgbmV3IHdlYiBhcHBsaWNhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFcnJvclJlcG9ydFZhbHZlQ2xhc3MoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmVycm9yUmVwb3J0VmFsdmVDbGFzcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBlcnJvciByZXBvcnQgdmFsdmUgY2xhc3MKKyAgICAgKiBmb3IgbmV3IHdlYiBhcHBsaWNhdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyb3JSZXBvcnRWYWx2ZUNsYXNzIFRoZSBuZXcgZXJyb3IgcmVwb3J0IHZhbHZlIGNsYXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JSZXBvcnRWYWx2ZUNsYXNzKFN0cmluZyBlcnJvclJlcG9ydFZhbHZlQ2xhc3MpIHsKKworICAgICAgICBTdHJpbmcgb2xkRXJyb3JSZXBvcnRWYWx2ZUNsYXNzQ2xhc3MgPSB0aGlzLmVycm9yUmVwb3J0VmFsdmVDbGFzczsKKyAgICAgICAgdGhpcy5lcnJvclJlcG9ydFZhbHZlQ2xhc3MgPSBlcnJvclJlcG9ydFZhbHZlQ2xhc3M7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJlcnJvclJlcG9ydFZhbHZlQ2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRFcnJvclJlcG9ydFZhbHZlQ2xhc3NDbGFzcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JSZXBvcnRWYWx2ZUNsYXNzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjYW5vbmljYWwsIGZ1bGx5IHF1YWxpZmllZCwgbmFtZSBvZiB0aGUgdmlydHVhbCBob3N0CisgICAgICogdGhpcyBDb250YWluZXIgcmVwcmVzZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjYW5vbmljYWwsIGZ1bGx5IHF1YWxpZmllZCwgbmFtZSBvZiB0aGUgdmlydHVhbCBob3N0CisgICAgICogdGhpcyBDb250YWluZXIgcmVwcmVzZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFZpcnR1YWwgaG9zdCBuYW1lCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBuYW1lIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZEhvc3QubnVsbE5hbWUiKSk7CisKKyAgICAgICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsgICAgICAvLyBJbnRlcm5hbGx5IGFsbCBuYW1lcyBhcmUgbG93ZXIgY2FzZQorCisgICAgICAgIFN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgibmFtZSIsIG9sZE5hbWUsIHRoaXMubmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVucGFjayBXQVJzIGZsYWcgYWNjZXNzb3IuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNVbnBhY2tXQVJzKCkgeworCisgICAgICAgIHJldHVybiAodW5wYWNrV0FScyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVucGFjayBXQVJzIGZsYWcgbXV0YXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbnBhY2tXQVJzKGJvb2xlYW4gdW5wYWNrV0FScykgeworCisgICAgICAgIHRoaXMudW5wYWNrV0FScyA9IHVucGFja1dBUnM7CisKKyAgICB9CisKKyAgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWxpZGF0aW9uIGZlYXR1cmUgb2YgdGhlIFhNTCBwYXJzZXIgdXNlZCB3aGVuCisgICAgICogcGFyc2luZyB4bWwgaW5zdGFuY2VzLgorICAgICAqIEBwYXJhbSB4bWxWYWxpZGF0aW9uIHRydWUgdG8gZW5hYmxlIHhtbCBpbnN0YW5jZSB2YWxpZGF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0WG1sVmFsaWRhdGlvbihib29sZWFuIHhtbFZhbGlkYXRpb24peworICAgICAgICAKKyAgICAgICAgdGhpcy54bWxWYWxpZGF0aW9uID0geG1sVmFsaWRhdGlvbjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VydmVyLnhtbCA8aG9zdD4gYXR0cmlidXRlJ3MgeG1sVmFsaWRhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdmFsaWRhdGlvbiBpcyBlbmFibGVkLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0WG1sVmFsaWRhdGlvbigpeworICAgICAgICByZXR1cm4geG1sVmFsaWRhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNlcnZlci54bWwgPGhvc3Q+IGF0dHJpYnV0ZSdzIHhtbE5hbWVzcGFjZUF3YXJlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lc3BhY2UgYXdhcmVuZXMgaXMgZW5hYmxlZC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFhtbE5hbWVzcGFjZUF3YXJlKCl7CisgICAgICAgIHJldHVybiB4bWxOYW1lc3BhY2VBd2FyZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZXNwYWNlIGF3YXJlIGZlYXR1cmUgb2YgdGhlIFhNTCBwYXJzZXIgdXNlZCB3aGVuCisgICAgICogcGFyc2luZyB4bWwgaW5zdGFuY2VzLgorICAgICAqIEBwYXJhbSB4bWxOYW1lc3BhY2VBd2FyZSB0cnVlIHRvIGVuYWJsZSBuYW1lc3BhY2UgYXdhcmVuZXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0WG1sTmFtZXNwYWNlQXdhcmUoYm9vbGVhbiB4bWxOYW1lc3BhY2VBd2FyZSl7CisgICAgICAgIHRoaXMueG1sTmFtZXNwYWNlQXdhcmU9eG1sTmFtZXNwYWNlQXdhcmU7CisgICAgfSAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBIb3N0IHdvcmsgZGlyZWN0b3J5IGJhc2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRXb3JrRGlyKCkgeworCisgICAgICAgIHJldHVybiAod29ya0Rpcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBIb3N0IHdvcmsgZGlyZWN0b3J5IGJhc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V29ya0RpcihTdHJpbmcgd29ya0RpcikgeworCisgICAgICAgIHRoaXMud29ya0RpciA9IHdvcmtEaXI7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGFuIGFsaWFzIG5hbWUgdGhhdCBzaG91bGQgYmUgbWFwcGVkIHRvIHRoaXMgc2FtZSBIb3N0LgorICAgICAqCisgICAgICogQHBhcmFtIGFsaWFzIFRoZSBhbGlhcyB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEFsaWFzKFN0cmluZyBhbGlhcykgeworCisgICAgICAgIGFsaWFzID0gYWxpYXMudG9Mb3dlckNhc2UoKTsKKworICAgICAgICAvLyBTa2lwIGR1cGxpY2F0ZSBhbGlhc2VzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxpYXNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGFsaWFzZXNbaV0uZXF1YWxzKGFsaWFzKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgdGhpcyBhbGlhcyB0byB0aGUgbGlzdAorICAgICAgICBTdHJpbmcgbmV3QWxpYXNlc1tdID0gbmV3IFN0cmluZ1thbGlhc2VzLmxlbmd0aCArIDFdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsaWFzZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBuZXdBbGlhc2VzW2ldID0gYWxpYXNlc1tpXTsKKyAgICAgICAgbmV3QWxpYXNlc1thbGlhc2VzLmxlbmd0aF0gPSBhbGlhczsKKworICAgICAgICBhbGlhc2VzID0gbmV3QWxpYXNlczsKKworICAgICAgICAvLyBJbmZvcm0gaW50ZXJlc3RlZCBsaXN0ZW5lcnMKKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KEFERF9BTElBU19FVkVOVCwgYWxpYXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjaGlsZCBDb250YWluZXIsIG9ubHkgaWYgdGhlIHByb3Bvc2VkIGNoaWxkIGlzIGFuIGltcGxlbWVudGF0aW9uCisgICAgICogb2YgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZCBDaGlsZCBjb250YWluZXIgdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChDb250YWluZXIgY2hpbGQpIHsKKworICAgICAgICBpZiAoIShjaGlsZCBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkSG9zdC5ub3RDb250ZXh0IikpOworICAgICAgICBzdXBlci5hZGRDaGlsZChjaGlsZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGFsaWFzIG5hbWVzIGZvciB0aGlzIEhvc3QuICBJZiBub25lIGFyZSBkZWZpbmVkLAorICAgICAqIGEgemVybyBsZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRBbGlhc2VzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5hbGlhc2VzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgQ29udGFpbmVyIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENvbnRleHQgdGhhdCB3b3VsZCBiZSB1c2VkIHRvIHByb2Nlc3MgdGhlIHNwZWNpZmllZAorICAgICAqIGhvc3QtcmVsYXRpdmUgcmVxdWVzdCBVUkksIGlmIGFueTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgUmVxdWVzdCBVUkkgdG8gYmUgbWFwcGVkCisgICAgICovCisgICAgcHVibGljIENvbnRleHQgbWFwKFN0cmluZyB1cmkpIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIk1hcHBpbmcgcmVxdWVzdCBVUkkgJyIgKyB1cmkgKyAiJyIpOworICAgICAgICBpZiAodXJpID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIC8vIE1hdGNoIG9uIHRoZSBsb25nZXN0IHBvc3NpYmxlIGNvbnRleHQgcGF0aCBwcmVmaXgKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLnRyYWNlKCIgIFRyeWluZyB0aGUgbG9uZ2VzdCBjb250ZXh0IHBhdGggcHJlZml4Iik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG51bGw7CisgICAgICAgIFN0cmluZyBtYXB1cmkgPSB1cmk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBjb250ZXh0ID0gKENvbnRleHQpIGZpbmRDaGlsZChtYXB1cmkpOworICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGludCBzbGFzaCA9IG1hcHVyaS5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgaWYgKHNsYXNoIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG1hcHVyaSA9IG1hcHVyaS5zdWJzdHJpbmcoMCwgc2xhc2gpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgbm8gQ29udGV4dCBtYXRjaGVzLCBzZWxlY3QgdGhlIGRlZmF1bHQgQ29udGV4dAorICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCIgIFRyeWluZyB0aGUgZGVmYXVsdCBjb250ZXh0Iik7CisgICAgICAgICAgICBjb250ZXh0ID0gKENvbnRleHQpIGZpbmRDaGlsZCgiIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb21wbGFpbiBpZiBubyBDb250ZXh0IGhhcyBiZWVuIHNlbGVjdGVkCisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkSG9zdC5tYXBwaW5nRXJyb3IiLCB1cmkpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gdGhlIG1hcHBlZCBDb250ZXh0IChpZiBhbnkpCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiIE1hcHBlZCB0byBjb250ZXh0ICciICsgY29udGV4dC5nZXRQYXRoKCkgKyAiJyIpOworICAgICAgICByZXR1cm4gKGNvbnRleHQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBhbGlhcyBuYW1lIGZyb20gdGhlIGFsaWFzZXMgZm9yIHRoaXMgSG9zdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGlhcyBBbGlhcyBuYW1lIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGlhcyhTdHJpbmcgYWxpYXMpIHsKKworICAgICAgICBhbGlhcyA9IGFsaWFzLnRvTG93ZXJDYXNlKCk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChhbGlhc2VzKSB7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIGFsaWFzIGlzIGN1cnJlbnRseSBwcmVzZW50CisgICAgICAgICAgICBpbnQgbiA9IC0xOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGlhc2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGFsaWFzZXNbaV0uZXF1YWxzKGFsaWFzKSkgeworICAgICAgICAgICAgICAgICAgICBuID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYWxpYXMKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW2FsaWFzZXMubGVuZ3RoIC0gMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsaWFzZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBuKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2orK10gPSBhbGlhc2VzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWxpYXNlcyA9IHJlc3VsdHM7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluZm9ybSBpbnRlcmVzdGVkIGxpc3RlbmVycworICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoUkVNT1ZFX0FMSUFTX0VWRU5ULCBhbGlhcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKGdldFBhcmVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChnZXRQYXJlbnQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiU3RhbmRhcmRIb3N0WyIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRoaXMgaG9zdC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IHByZXZlbnRzIGl0IGZyb20gYmVpbmcgc3RhcnRlZAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICBpZiggc3RhcnRlZCApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiggISBpbml0aWFsaXplZCApCisgICAgICAgICAgICBpbml0KCk7CisKKyAgICAgICAgLy8gTG9vayBmb3IgYSByZWFsbSAtIHRoYXQgbWF5IGhhdmUgYmVlbiBjb25maWd1cmVkIGVhcmxpZXIuIAorICAgICAgICAvLyBJZiB0aGUgcmVhbG0gaXMgYWRkZWQgYWZ0ZXIgY29udGV4dCAtIGl0J2xsIHNldCBpdHNlbGYuCisgICAgICAgIGlmKCByZWFsbSA9PSBudWxsICkgeworICAgICAgICAgICAgT2JqZWN0TmFtZSByZWFsbU5hbWU9bnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVhbG1OYW1lPW5ldyBPYmplY3ROYW1lKCBkb21haW4gKyAiOnR5cGU9UmVhbG0saG9zdD0iICsgZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQocmVhbG1OYW1lICkgKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKHJlYWxtTmFtZSwgImluaXQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHt9CisgICAgICAgICAgICAgICAgICAgICk7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCggVGhyb3dhYmxlIHQgKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyByZWFsbSBmb3IgdGhpcyBob3N0ICIgKyByZWFsbU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgLy8gU2V0IGVycm9yIHJlcG9ydCB2YWx2ZQorICAgICAgICBpZiAoKGVycm9yUmVwb3J0VmFsdmVDbGFzcyAhPSBudWxsKQorICAgICAgICAgICAgJiYgKCFlcnJvclJlcG9ydFZhbHZlQ2xhc3MuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIFZhbHZlW10gdmFsdmVzID0gCisgICAgICAgICAgICAgICAgICAgICgoU3RhbmRhcmRQaXBlbGluZSlwaXBlbGluZSkuZ2V0VmFsdmVzKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyAhZm91bmQgJiYgaTx2YWx2ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmKGVycm9yUmVwb3J0VmFsdmVDbGFzcy5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdmVzW2ldLmdldENsYXNzKCkuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZSA7CisgICAgICAgICAgICAgICAgaWYoIWZvdW5kKSB7ICAgICAgICAgIAkKKyAgICAgICAgICAgICAgICAgICAgVmFsdmUgdmFsdmUgPSAoVmFsdmUpIENsYXNzLmZvck5hbWUoZXJyb3JSZXBvcnRWYWx2ZUNsYXNzKQorICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkVmFsdmUodmFsdmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAoInN0YW5kYXJkSG9zdC5pbnZhbGlkRXJyb3JSZXBvcnRWYWx2ZUNsYXNzIiwgCisgICAgICAgICAgICAgICAgICAgICBlcnJvclJlcG9ydFZhbHZlQ2xhc3MpLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBpZiAoeG1sVmFsaWRhdGlvbikKKyAgICAgICAgICAgICAgICBsb2cuaW5mbyggc20uZ2V0U3RyaW5nKCJzdGFuZGFyZEhvc3QudmFsaWRhdGlvbkVuYWJsZWQiKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbG9nLmluZm8oIHNtLmdldFN0cmluZygic3RhbmRhcmRIb3N0LnZhbGlkYXRpb25EaXNhYmxlZCIpKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zdGFydCgpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBKTVggIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLyoqCisgICAgICAqIFJldHVybiB0aGUgTUJlYW4gTmFtZXMgb2YgdGhlIFZhbHZlcyBhc3NvaWNhdGVkIHdpdGggdGhpcyBIb3N0CisgICAgICAqCisgICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgICovCisgICAgIHB1YmxpYyBTdHJpbmcgW10gZ2V0VmFsdmVOYW1lcygpCisgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICAgVmFsdmUgW10gdmFsdmVzID0gdGhpcy5nZXRWYWx2ZXMoKTsKKyAgICAgICAgIFN0cmluZyBbXSBtYmVhbk5hbWVzID0gbmV3IFN0cmluZ1t2YWx2ZXMubGVuZ3RoXTsKKyAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgaWYoIHZhbHZlc1tpXSA9PSBudWxsICkgY29udGludWU7CisgICAgICAgICAgICAgaWYoICgoVmFsdmVCYXNlKXZhbHZlc1tpXSkuZ2V0T2JqZWN0TmFtZSgpID09IG51bGwgKSBjb250aW51ZTsKKyAgICAgICAgICAgICBtYmVhbk5hbWVzW2ldID0gKChWYWx2ZUJhc2UpdmFsdmVzW2ldKS5nZXRPYmplY3ROYW1lKCkudG9TdHJpbmcoKTsKKyAgICAgICAgIH0KKworICAgICAgICAgcmV0dXJuIG1iZWFuTmFtZXM7CisKKyAgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldEFsaWFzZXMoKSB7CisgICAgICAgIHJldHVybiBhbGlhc2VzOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZD1mYWxzZTsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgICAgICBpZiggaW5pdGlhbGl6ZWQgKSByZXR1cm47CisgICAgICAgIGluaXRpYWxpemVkPXRydWU7CisgICAgICAgIAorICAgICAgICAvLyBhbHJlYWR5IHJlZ2lzdGVyZWQuCisgICAgICAgIGlmKCBnZXRQYXJlbnQoKSA9PSBudWxsICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciB3aXRoIHRoZSBFbmdpbmUKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIHNlcnZpY2VOYW1lPW5ldyBPYmplY3ROYW1lKGRvbWFpbiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6dHlwZT1FbmdpbmUiKTsKKworICAgICAgICAgICAgICAgIEhvc3RDb25maWcgZGVwbG95ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBob3N0Q29uZmlnQ2xhc3NuYW1lID0gZ2V0SG9zdENvbmZpZ0NsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChob3N0Q29uZmlnQ2xhc3NuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShob3N0Q29uZmlnQ2xhc3NuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveWVyID0gKEhvc3RDb25maWcpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3llciA9IG5ldyBIb3N0Q29uZmlnKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiRXJyb3IgY3JlYXRpbmcgSG9zdENvbmZpZyBmb3IgaG9zdCAiICsgbmFtZSwgZSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZExpZmVjeWNsZUxpc3RlbmVyKGRlcGxveWVyKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBzZXJ2aWNlTmFtZSApKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWdpc3RlcmluZyAiKyBzZXJ2aWNlTmFtZSArIiB3aXRoIHRoZSBFbmdpbmUiKTsKKyAgICAgICAgICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoIHNlcnZpY2VOYW1lLCAiYWRkQ2hpbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IHRoaXMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyAib3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXIiIH0gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJIb3N0IHJlZ2lzdGVyaW5nIGZhaWxlZCEiLGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoIG9uYW1lPT1udWxsICkgeworICAgICAgICAgICAgLy8gbm90IHJlZ2lzdGVyZWQgaW4gSk1YIHlldCAtIHN0YW5kYWxvbmUgbW9kZQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdGFuZGFyZEVuZ2luZSBlbmdpbmU9KFN0YW5kYXJkRW5naW5lKXBhcmVudDsKKyAgICAgICAgICAgICAgICBkb21haW49ZW5naW5lLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiUmVnaXN0ZXIgaG9zdCAiICsgZ2V0TmFtZSgpICsgIiB3aXRoIGRvbWFpbiAiKyBkb21haW4gKTsKKyAgICAgICAgICAgICAgICBvbmFtZT1uZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9SG9zdCxob3N0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBvbmFtZTsKKyAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXJDb21wb25lbnQodGhpcywgb25hbWUsIG51bGwpOworICAgICAgICAgICAgfSBjYXRjaCggVGhyb3dhYmxlIHQgKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJIb3N0IHJlZ2lzdGVyaW5nIGZhaWxlZCEiLCB0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGRlc3Ryb3kgb3VyIGNoaWxkIGNvbnRhaW5lcnMsIGlmIGFueQorICAgICAgICBDb250YWluZXIgY2hpbGRyZW5bXSA9IGZpbmRDaGlsZHJlbigpOworICAgICAgICBzdXBlci5kZXN0cm95KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmKGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KQorICAgICAgICAgICAgICAgICgoU3RhbmRhcmRDb250ZXh0KWNoaWxkcmVuW2ldKS5kZXN0cm95KCk7CisgICAgICAgIH0KKyAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBwcmVSZWdpc3RlcihNQmVhblNlcnZlciBzZXJ2ZXIsIE9iamVjdE5hbWUgb25hbWUgKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgT2JqZWN0TmFtZSByZXM9c3VwZXIucHJlUmVnaXN0ZXIoc2VydmVyLCBvbmFtZSk7CisgICAgICAgIFN0cmluZyBuYW1lPW9uYW1lLmdldEtleVByb3BlcnR5KCJob3N0Iik7CisgICAgICAgIGlmKCBuYW1lICE9IG51bGwgKQorICAgICAgICAgICAgc2V0TmFtZSggbmFtZSApOworICAgICAgICByZXR1cm4gcmVzOyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBPYmplY3ROYW1lIGNyZWF0ZU9iamVjdE5hbWUoU3RyaW5nIGRvbWFpbiwgT2JqZWN0TmFtZSBwYXJlbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRlIE9iamVjdE5hbWUgIiArIGRvbWFpbiArICIgIiArIHBhcmVudCApOworICAgICAgICByZXR1cm4gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArICI6dHlwZT1Ib3N0LGhvc3Q9IiArIGdldE5hbWUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZEhvc3RWYWx2ZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRIb3N0VmFsdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTNiNWJjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRIb3N0VmFsdmUuamF2YQpAQCAtMCwwICsxLDM4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5XcmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNsaWVudEFib3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuRXJyb3JQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5SZXF1ZXN0VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5WYWx2ZUJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKworLyoqCisgKiBWYWx2ZSB0aGF0IGltcGxlbWVudHMgdGhlIGRlZmF1bHQgYmFzaWMgYmVoYXZpb3IgZm9yIHRoZQorICogPGNvZGU+U3RhbmRhcmRIb3N0PC9jb2RlPiBjb250YWluZXIgaW1wbGVtZW50YXRpb24uCisgKiA8cD4KKyAqIDxiPlVTQUdFIENPTlNUUkFJTlQ8L2I+OiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBsaWtlbHkgdG8gYmUgdXNlZnVsIG9ubHkKKyAqIHdoZW4gcHJvY2Vzc2luZyBIVFRQIHJlcXVlc3RzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitmaW5hbCBjbGFzcyBTdGFuZGFyZEhvc3RWYWx2ZQorICAgIGV4dGVuZHMgVmFsdmVCYXNlIHsKKworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFN0YW5kYXJkSG9zdFZhbHZlLmNsYXNzKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3RWYWx2ZS8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFZhbHZlIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBjaGlsZCBDb250ZXh0IHRvIHByb2Nlc3MgdGhpcyByZXF1ZXN0LAorICAgICAqIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcmVxdWVzdCBVUkkuICBJZiBubyBtYXRjaGluZyBDb250ZXh0IGNhbgorICAgICAqIGJlIGZvdW5kLCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgSFRUUCBlcnJvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3QgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlIHRvIGJlIHByb2R1Y2VkCisgICAgICogQHBhcmFtIHZhbHZlQ29udGV4dCBWYWx2ZSBjb250ZXh0IHVzZWQgdG8gZm9yd2FyZCB0byB0aGUgbmV4dCBWYWx2ZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgaW52b2tlKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gU2VsZWN0IHRoZSBDb250ZXh0IHRvIGJlIHVzZWQgZm9yIHRoaXMgUmVxdWVzdAorICAgICAgICBDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldENvbnRleHQoKTsKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInN0YW5kYXJkSG9zdC5ub0NvbnRleHQiKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBCaW5kIHRoZSBjb250ZXh0IENMIHRvIHRoZSBjdXJyZW50IHRocmVhZAorICAgICAgICBpZiggY29udGV4dC5nZXRMb2FkZXIoKSAhPSBudWxsICkgeworICAgICAgICAgICAgLy8gTm90IHN0YXJ0ZWQgLSBpdCBzaG91bGQgY2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBmaXJzdAorICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgZXZlbnR1YWxseSBtb3ZlIHRvIEVuZ2luZSwgaXQncyBnZW5lcmljLgorICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIKKyAgICAgICAgICAgICAgICAgICAgKGNvbnRleHQuZ2V0TG9hZGVyKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBc2sgdGhpcyBDb250ZXh0IHRvIHByb2Nlc3MgdGhpcyByZXF1ZXN0CisgICAgICAgIGNvbnRleHQuZ2V0UGlwZWxpbmUoKS5nZXRGaXJzdCgpLmludm9rZShyZXF1ZXN0LCByZXNwb25zZSk7CisKKyAgICAgICAgLy8gRXJyb3IgcGFnZSBwcm9jZXNzaW5nCisgICAgICAgIHJlc3BvbnNlLnNldFN1c3BlbmRlZChmYWxzZSk7CisKKyAgICAgICAgVGhyb3dhYmxlIHQgPSAoVGhyb3dhYmxlKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShHbG9iYWxzLkVYQ0VQVElPTl9BVFRSKTsKKworICAgICAgICBpZiAodCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvd2FibGUocmVxdWVzdCwgcmVzcG9uc2UsIHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc3RvcmUgdGhlIGNvbnRleHQgY2xhc3Nsb2FkZXIKKyAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIKKyAgICAgICAgICAgIChTdGFuZGFyZEhvc3RWYWx2ZS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEhhbmRsZSB0aGUgc3BlY2lmaWVkIFRocm93YWJsZSBlbmNvdW50ZXJlZCB3aGlsZSBwcm9jZXNzaW5nCisgICAgICogdGhlIHNwZWNpZmllZCBSZXF1ZXN0IHRvIHByb2R1Y2UgdGhlIHNwZWNpZmllZCBSZXNwb25zZS4gIEFueQorICAgICAqIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciBkdXJpbmcgZ2VuZXJhdGlvbiBvZiB0aGUgZXhjZXB0aW9uIHJlcG9ydCBhcmUKKyAgICAgKiBsb2dnZWQgYW5kIHN3YWxsb3dlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UgYmVpbmcgZ2VuZXJhdGVkCisgICAgICogQHBhcmFtIHRocm93YWJsZSBUaGUgZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQgKHdoaWNoIHBvc3NpYmx5IHdyYXBzCisgICAgICogIGEgcm9vdCBjYXVzZSBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0aHJvd2FibGUoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldENvbnRleHQoKTsKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBUaHJvd2FibGUgcmVhbEVycm9yID0gdGhyb3dhYmxlOworCisgICAgICAgIGlmIChyZWFsRXJyb3IgaW5zdGFuY2VvZiBTZXJ2bGV0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZWFsRXJyb3IgPSAoKFNlcnZsZXRFeGNlcHRpb24pIHJlYWxFcnJvcikuZ2V0Um9vdENhdXNlKCk7CisgICAgICAgICAgICBpZiAocmVhbEVycm9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWFsRXJyb3IgPSB0aHJvd2FibGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIGFib3J0ZWQgcmVxdWVzdCBmcm9tIGEgY2xpZW50IGp1c3QgbG9nIGl0IGFuZCByZXR1cm4KKyAgICAgICAgaWYgKHJlYWxFcnJvciBpbnN0YW5jZW9mIENsaWVudEFib3J0RXhjZXB0aW9uICkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkSG9zdC5jbGllbnRBYm9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICByZWFsRXJyb3IuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEVycm9yUGFnZSBlcnJvclBhZ2UgPSBmaW5kRXJyb3JQYWdlKGNvbnRleHQsIHRocm93YWJsZSk7CisgICAgICAgIGlmICgoZXJyb3JQYWdlID09IG51bGwpICYmIChyZWFsRXJyb3IgIT0gdGhyb3dhYmxlKSkgeworICAgICAgICAgICAgZXJyb3JQYWdlID0gZmluZEVycm9yUGFnZShjb250ZXh0LCByZWFsRXJyb3IpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVycm9yUGFnZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZXRBcHBDb21taXR0ZWQoZmFsc2UpOworICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAoQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LkRJU1BBVENIRVJfUkVRVUVTVF9QQVRIX0FUVFIsCisgICAgICAgICAgICAgICAgIGVycm9yUGFnZS5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeS5ESVNQQVRDSEVSX1RZUEVfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeS5FUlJPUikpOworICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAoR2xvYmFscy5TVEFUVVNfQ09ERV9BVFRSLAorICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUikpOworICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoR2xvYmFscy5FUlJPUl9NRVNTQUdFX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuRVhDRVBUSU9OX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsRXJyb3IpOworICAgICAgICAgICAgV3JhcHBlciB3cmFwcGVyID0gcmVxdWVzdC5nZXRXcmFwcGVyKCk7CisgICAgICAgICAgICBpZiAod3JhcHBlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuU0VSVkxFVF9OQU1FX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpOworICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoR2xvYmFscy5FWENFUFRJT05fUEFHRV9BVFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoR2xvYmFscy5FWENFUFRJT05fVFlQRV9BVFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbEVycm9yLmdldENsYXNzKCkpOworICAgICAgICAgICAgaWYgKGN1c3RvbShyZXF1ZXN0LCByZXNwb25zZSwgZXJyb3JQYWdlKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmZsdXNoQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkud2FybigiRXhjZXB0aW9uIFByb2Nlc3NpbmcgIiArIGVycm9yUGFnZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQSBjdXN0b20gZXJyb3ItcGFnZSBoYXMgbm90IGJlZW4gZGVmaW5lZCBmb3IgdGhlIGV4Y2VwdGlvbgorICAgICAgICAgICAgLy8gdGhhdCB3YXMgdGhyb3duIGR1cmluZyByZXF1ZXN0IHByb2Nlc3NpbmcuIENoZWNrIGlmIGFuCisgICAgICAgICAgICAvLyBlcnJvci1wYWdlIGZvciBlcnJvciBjb2RlIDUwMCB3YXMgc3BlY2lmaWVkIGFuZCBpZiBzbywKKyAgICAgICAgICAgIC8vIHNlbmQgdGhhdCBwYWdlIGJhY2sgYXMgdGhlIHJlc3BvbnNlLgorICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICAgICAgICAgIC8vIFRoZSByZXNwb25zZSBpcyBhbiBlcnJvcgorICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RXJyb3IoKTsKKworICAgICAgICAgICAgc3RhdHVzKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorCisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEhhbmRsZSB0aGUgSFRUUCBzdGF0dXMgY29kZSAoYW5kIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSkgZ2VuZXJhdGVkCisgICAgICogd2hpbGUgcHJvY2Vzc2luZyB0aGUgc3BlY2lmaWVkIFJlcXVlc3QgdG8gcHJvZHVjZSB0aGUgc3BlY2lmaWVkCisgICAgICogUmVzcG9uc2UuICBBbnkgZXhjZXB0aW9ucyB0aGF0IG9jY3VyIGR1cmluZyBnZW5lcmF0aW9uIG9mIHRoZSBlcnJvcgorICAgICAqIHJlcG9ydCBhcmUgbG9nZ2VkIGFuZCBzd2FsbG93ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIGJlaW5nIGdlbmVyYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0YXR1cyhSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKSB7CisKKyAgICAgICAgaW50IHN0YXR1c0NvZGUgPSByZXNwb25zZS5nZXRTdGF0dXMoKTsKKworICAgICAgICAvLyBIYW5kbGUgYSBjdXN0b20gZXJyb3IgcGFnZSBmb3IgdGhpcyBzdGF0dXMgY29kZQorICAgICAgICBDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldENvbnRleHQoKTsKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvKiBPbmx5IGxvb2sgZm9yIGVycm9yIHBhZ2VzIHdoZW4gaXNFcnJvcigpIGlzIHNldC4KKyAgICAgICAgICogaXNFcnJvcigpIGlzIHNldCB3aGVuIHJlc3BvbnNlLnNlbmRFcnJvcigpIGlzIGludm9rZWQuIFRoaXMKKyAgICAgICAgICogYWxsb3dzIGN1c3RvbSBlcnJvciBwYWdlcyB3aXRob3V0IHJlbHlpbmcgb24gZGVmYXVsdCBmcm9tCisgICAgICAgICAqIHdlYi54bWwuCisgICAgICAgICAqLworICAgICAgICBpZiAoIXJlc3BvbnNlLmlzRXJyb3IoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBFcnJvclBhZ2UgZXJyb3JQYWdlID0gY29udGV4dC5maW5kRXJyb3JQYWdlKHN0YXR1c0NvZGUpOworICAgICAgICBpZiAoZXJyb3JQYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldEFwcENvbW1pdHRlZChmYWxzZSk7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLlNUQVRVU19DT0RFX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihzdGF0dXNDb2RlKSk7CisKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gUmVxdWVzdFV0aWwuZmlsdGVyKHJlc3BvbnNlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiIjsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuRVJST1JfTUVTU0FHRV9BVFRSLCBtZXNzYWdlKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgKEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeS5ESVNQQVRDSEVSX1JFUVVFU1RfUEFUSF9BVFRSLAorICAgICAgICAgICAgICAgICBlcnJvclBhZ2UuZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuRElTUEFUQ0hFUl9UWVBFX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuRVJST1IpKTsKKworCisgICAgICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSByZXF1ZXN0LmdldFdyYXBwZXIoKTsKKyAgICAgICAgICAgIGlmICh3cmFwcGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoR2xvYmFscy5TRVJWTEVUX05BTUVfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSk7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLkVYQ0VQVElPTl9QQUdFX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgICAgICBpZiAoY3VzdG9tKHJlcXVlc3QsIHJlc3BvbnNlLCBlcnJvclBhZ2UpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS53YXJuKCJFeGNlcHRpb24gUHJvY2Vzc2luZyAiICsgZXJyb3JQYWdlLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmluZCBhbmQgcmV0dXJuIHRoZSBFcnJvclBhZ2UgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uJ3MKKyAgICAgKiBjbGFzcywgb3IgYW4gRXJyb3JQYWdlIGluc3RhbmNlIGZvciB0aGUgY2xvc2VzdCBzdXBlcmNsYXNzIGZvciB3aGljaAorICAgICAqIHRoZXJlIGlzIHN1Y2ggYSBkZWZpbml0aW9uLiAgSWYgbm8gYXNzb2NpYXRlZCBFcnJvclBhZ2UgaW5zdGFuY2UgaXMKKyAgICAgKiBmb3VuZCwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIENvbnRleHQgaW4gd2hpY2ggdG8gc2VhcmNoCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIGZvciB3aGljaCB0byBmaW5kIGFuIEVycm9yUGFnZQorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgRXJyb3JQYWdlIGZpbmRFcnJvclBhZ2UKKyAgICAgICAgKENvbnRleHQgY29udGV4dCwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCisgICAgICAgIGlmIChleGNlcHRpb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIENsYXNzIGNsYXp6ID0gZXhjZXB0aW9uLmdldENsYXNzKCk7CisgICAgICAgIFN0cmluZyBuYW1lID0gY2xhenouZ2V0TmFtZSgpOworICAgICAgICB3aGlsZSAoIU9iamVjdC5jbGFzcy5lcXVhbHMoY2xhenopKSB7CisgICAgICAgICAgICBFcnJvclBhZ2UgZXJyb3JQYWdlID0gY29udGV4dC5maW5kRXJyb3JQYWdlKG5hbWUpOworICAgICAgICAgICAgaWYgKGVycm9yUGFnZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyb3JQYWdlKTsKKyAgICAgICAgICAgIGNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAgICAgaWYgKGNsYXp6ID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBuYW1lID0gY2xhenouZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEhhbmRsZSBhbiBIVFRQIHN0YXR1cyBjb2RlIG9yIEphdmEgZXhjZXB0aW9uIGJ5IGZvcndhcmRpbmcgY29udHJvbAorICAgICAqIHRvIHRoZSBsb2NhdGlvbiBpbmNsdWRlZCBpbiB0aGUgc3BlY2lmaWVkIGVycm9yUGFnZSBvYmplY3QuICBJdCBpcworICAgICAqIGFzc3VtZWQgdGhhdCB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IHJlY29yZGVkIGFueSByZXF1ZXN0IGF0dHJpYnV0ZXMKKyAgICAgKiB0aGF0IGFyZSB0byBiZSBmb3J3YXJkZWQgdG8gdGhpcyBwYWdlLiAgUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCisgICAgICogd2Ugc3VjY2Vzc2Z1bGx5IHV0aWxpemVkIHRoZSBzcGVjaWZpZWQgZXJyb3IgcGFnZSBsb2NhdGlvbiwgb3IKKyAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGRlZmF1bHQgZXJyb3IgcmVwb3J0IHNob3VsZCBiZSByZW5kZXJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UgYmVpbmcgZ2VuZXJhdGVkCisgICAgICogQHBhcmFtIGVycm9yUGFnZSBUaGUgZXJyb3JQYWdlIGRpcmVjdGl2ZSB3ZSBhcmUgb2JleWluZworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGN1c3RvbShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvclBhZ2UgZXJyb3JQYWdlKSB7CisKKyAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmRlYnVnKCJQcm9jZXNzaW5nICIgKyBlcnJvclBhZ2UpOworCisgICAgICAgIHJlcXVlc3Quc2V0UGF0aEluZm8oZXJyb3JQYWdlLmdldExvY2F0aW9uKCkpOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIFJlc2V0IHRoZSByZXNwb25zZSBpZiBwb3NzaWJsZSAoZWxzZSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24pCisgICAgICAgICAgICAvL2hyZXMucmVzZXQoKTsKKyAgICAgICAgICAgIC8vIFJlc2V0IHRoZSByZXNwb25zZSAoa2VlcGluZyB0aGUgcmVhbCBlcnJvciBjb2RlIGFuZCBtZXNzYWdlKQorICAgICAgICAgICAgSW50ZWdlciBzdGF0dXNDb2RlT2JqID0KKyAgICAgICAgICAgICAgICAoSW50ZWdlcikgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5TVEFUVVNfQ09ERV9BVFRSKTsKKyAgICAgICAgICAgIGludCBzdGF0dXNDb2RlID0gc3RhdHVzQ29kZU9iai5pbnRWYWx1ZSgpOworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgIChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKEdsb2JhbHMuRVJST1JfTUVTU0FHRV9BVFRSKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnJlc2V0KHN0YXR1c0NvZGUsIG1lc3NhZ2UpOworCisgICAgICAgICAgICAvLyBGb3J3YXJkIGNvbnRyb2wgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbgorICAgICAgICAgICAgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPQorICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0Q29udGV4dCgpLmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICAgICAgc2VydmxldENvbnRleHQuZ2V0UmVxdWVzdERpc3BhdGNoZXIoZXJyb3JQYWdlLmdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgcmQuZm9yd2FyZChyZXF1ZXN0LmdldFJlcXVlc3QoKSwgcmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKyAgICAgICAgICAgIC8vIElmIHdlIGZvcndhcmQsIHRoZSByZXNwb25zZSBpcyBzdXNwZW5kZWQgYWdhaW4KKyAgICAgICAgICAgIHJlc3BvbnNlLnNldFN1c3BlbmRlZChmYWxzZSk7CisKKyAgICAgICAgICAgIC8vIEluZGljYXRlIHRoYXQgd2UgaGF2ZSBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkIHRoaXMgY3VzdG9tIHBhZ2UKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKworICAgICAgICAgICAgLy8gUmVwb3J0IG91ciBmYWlsdXJlIHRvIHByb2Nlc3MgdGhpcyBjdXN0b20gcGFnZQorICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKCJFeGNlcHRpb24gUHJvY2Vzc2luZyAiICsgZXJyb3JQYWdlLCB0KTsKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZFBpcGVsaW5lLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZFBpcGVsaW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0ZjQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkUGlwZWxpbmUuamF2YQpAQCAtMCwwICsxLDU2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmU7CisKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUGlwZWxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5WYWx2ZUJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CisKKworLyoqCisgKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiBhIHByb2Nlc3NpbmcgPGI+UGlwZWxpbmU8L2I+IHRoYXQgd2lsbCBpbnZva2UKKyAqIGEgc2VyaWVzIG9mIFZhbHZlcyB0aGF0IGhhdmUgYmVlbiBjb25maWd1cmVkIHRvIGJlIGNhbGxlZCBpbiBvcmRlci4gIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIGNhbiBiZSB1c2VkIGZvciBhbnkgdHlwZSBvZiBDb250YWluZXIuCisgKgorICogPGI+SU1QTEVNRU5UQVRJT04gV0FSTklORzwvYj4gLSBUaGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhhdCBubworICogY2FsbHMgdG8gPGNvZGU+YWRkVmFsdmUoKTwvY29kZT4gb3IgPGNvZGU+cmVtb3ZlVmFsdmU8L2NvZGU+IGFyZSBhbGxvd2VkCisgKiB3aGlsZSBhIHJlcXVlc3QgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gIE90aGVyd2lzZSwgdGhlIG1lY2hhbmlzbQorICogYnkgd2hpY2ggcGVyLXRocmVhZCBzdGF0ZSBpcyBtYWludGFpbmVkIHdpbGwgbmVlZCB0byBiZSBtb2RpZmllZC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqLworCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRQaXBlbGluZQorICAgIGltcGxlbWVudHMgUGlwZWxpbmUsIENvbnRhaW5lZCwgTGlmZWN5Y2xlIAorIHsKKworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTdGFuZGFyZFBpcGVsaW5lLmNsYXNzKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgU3RhbmRhcmRQaXBlbGluZSBpbnN0YW5jZSB3aXRoIG5vIGFzc29jaWF0ZWQgQ29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBTdGFuZGFyZFBpcGVsaW5lKCkgeworCisgICAgICAgIHRoaXMobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBTdGFuZGFyZFBpcGVsaW5lIGluc3RhbmNlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBDb250YWluZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgd2Ugc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aAorICAgICAqLworICAgIHB1YmxpYyBTdGFuZGFyZFBpcGVsaW5lKENvbnRhaW5lciBjb250YWluZXIpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICBzZXRDb250YWluZXIoY29udGFpbmVyKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBiYXNpYyBWYWx2ZSAoaWYgYW55KSBhc3NvY2lhdGVkIHdpdGggdGhpcyBQaXBlbGluZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmFsdmUgYmFzaWMgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBQaXBlbGluZSBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGluZm8gPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkUGlwZWxpbmUvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGxpZmVjeWNsZSBldmVudCBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlmZWN5Y2xlU3VwcG9ydCBsaWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZCB5ZXQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlyc3QgdmFsdmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUGlwZWxpbmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFZhbHZlIGZpcnN0ID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuaW5mbyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb250YWluZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENvbnRhaW5lciB3aXRoIHdoaWNoIHRoaXMgUGlwZWxpbmUgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29udGFpbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIFBpcGVsaW5lIGlzIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBuZXcgYXNzb2NpYXRlZCBjb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGNvbnRhaW5lcikgeworCisgICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlmZWN5Y2xlIGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaWZlY3ljbGUuIElmIHRoaXMgCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiBsaWZlY3ljbGUuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGFyZSBmb3IgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcyBDb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHN0YXJ0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAoc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFBpcGVsaW5lLmFscmVhZHlTdGFydGVkIikpOworCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RBUlRfRVZFTlQsIG51bGwpOworCisgICAgICAgIHN0YXJ0ZWQgPSB0cnVlOworCisgICAgICAgIC8vIFN0YXJ0IHRoZSBWYWx2ZXMgaW4gb3VyIHBpcGVsaW5lIChpbmNsdWRpbmcgdGhlIGJhc2ljKSwgaWYgYW55CisgICAgICAgIFZhbHZlIGN1cnJlbnQgPSBmaXJzdDsKKyAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgeworICAgICAgICAJY3VycmVudCA9IGJhc2ljOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50IGluc3RhbmNlb2YgTGlmZWN5Y2xlKQorICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjdXJyZW50KS5zdGFydCgpOworICAgICAgICAgICAgcmVnaXN0ZXJWYWx2ZShjdXJyZW50KTsKKyAgICAgICAgCWN1cnJlbnQgPSBjdXJyZW50LmdldE5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEFGVEVSX1NUQVJUX0VWRU5ULCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSBzaHV0IGRvd24gYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcyBDb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBuZWVkcyB0byBiZSByZXBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKCFzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkUGlwZWxpbmUubm90U3RhcnRlZCIpKTsKKworICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQkVGT1JFX1NUT1BfRVZFTlQsIG51bGwpOworCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVE9QX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworCisgICAgICAgIC8vIFN0b3AgdGhlIFZhbHZlcyBpbiBvdXIgcGlwZWxpbmUgKGluY2x1ZGluZyB0aGUgYmFzaWMpLCBpZiBhbnkKKyAgICAgICAgVmFsdmUgY3VycmVudCA9IGZpcnN0OworICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKSB7CisgICAgICAgIAljdXJyZW50ID0gYmFzaWM7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBMaWZlY3ljbGUpCisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGN1cnJlbnQpLnN0b3AoKTsKKyAgICAgICAgICAgIHVucmVnaXN0ZXJWYWx2ZShjdXJyZW50KTsKKyAgICAgICAgCWN1cnJlbnQgPSBjdXJyZW50LmdldE5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChBRlRFUl9TVE9QX0VWRU5ULCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJWYWx2ZShWYWx2ZSB2YWx2ZSkgeworCisgICAgICAgIGlmKCB2YWx2ZSBpbnN0YW5jZW9mIFZhbHZlQmFzZSAmJgorICAgICAgICAgICAgICAgICgoVmFsdmVCYXNlKXZhbHZlKS5nZXRPYmplY3ROYW1lKCk9PW51bGwgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0cmluZyBkb21haW49KChDb250YWluZXJCYXNlKWNvbnRhaW5lcikuZ2V0RG9tYWluKCk7CisgICAgICAgICAgICAgICAgaWYoIGNvbnRhaW5lciBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCApIHsKKyAgICAgICAgICAgICAgICAgICAgZG9tYWluPSgoU3RhbmRhcmRDb250ZXh0KWNvbnRhaW5lcikuZ2V0RW5naW5lTmFtZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggY29udGFpbmVyIGluc3RhbmNlb2YgU3RhbmRhcmRXcmFwcGVyKSB7CisgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lciBjdHg9KChTdGFuZGFyZFdyYXBwZXIpY29udGFpbmVyKS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZG9tYWluPSgoU3RhbmRhcmRDb250ZXh0KWN0eCkuZ2V0RW5naW5lTmFtZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIHZuYW1lPSgoVmFsdmVCYXNlKXZhbHZlKS5jcmVhdGVPYmplY3ROYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgKChDb250YWluZXJCYXNlKWNvbnRhaW5lcikuZ2V0Sm14TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiggdm5hbWUgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgKChWYWx2ZUJhc2UpdmFsdmUpLnNldE9iamVjdE5hbWUodm5hbWUpOworICAgICAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS5yZWdpc3RlckNvbXBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHZlLCB2bmFtZSwgdmFsdmUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAoKFZhbHZlQmFzZSl2YWx2ZSkuc2V0Q29udHJvbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgKCgoQ29udGFpbmVyQmFzZSljb250YWluZXIpLmdldEpteE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCggVGhyb3dhYmxlIHQgKSB7CisgICAgICAgICAgICAgICAgbG9nLmluZm8oICJDYW4ndCByZWdpc3RlciB2YWx2ZSAiICsgdmFsdmUgLCB0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJWYWx2ZShWYWx2ZSB2YWx2ZSkgeworICAgICAgICBpZiggdmFsdmUgaW5zdGFuY2VvZiBWYWx2ZUJhc2UgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFZhbHZlQmFzZSB2Yj0oVmFsdmVCYXNlKXZhbHZlOworICAgICAgICAgICAgICAgIGlmKCB2Yi5nZXRDb250cm9sbGVyKCkhPW51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHZiLmdldENvbnRyb2xsZXIoKSA9PSAKKyAgICAgICAgICAgICAgICAgICAgICAgICgoQ29udGFpbmVyQmFzZSljb250YWluZXIpLmdldEpteE5hbWUoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgdm5hbWU9dmIuZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS5nZXRNQmVhblNlcnZlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAudW5yZWdpc3Rlck1CZWFuKHZuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgKChWYWx2ZUJhc2UpdmFsdmUpLnNldE9iamVjdE5hbWUobnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCggVGhyb3dhYmxlIHQgKSB7CisgICAgICAgICAgICAgICAgbG9nLmluZm8oICJDYW4ndCB1bnJlZ2lzdGVyIHZhbHZlICIgKyB2YWx2ZSAsIHQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBpcGVsaW5lIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogPHA+UmV0dXJuIHRoZSBWYWx2ZSBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIGRpc3Rpbmd1aXNoZWQgYXMgdGhlIGJhc2ljCisgICAgICogVmFsdmUgZm9yIHRoaXMgUGlwZWxpbmUgKGlmIGFueSkuCisgICAgICovCisgICAgcHVibGljIFZhbHZlIGdldEJhc2ljKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5iYXNpYyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIDxwPlNldCB0aGUgVmFsdmUgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBkaXN0aW5ndWlzaGVkIGFzIHRoZSBiYXNpYworICAgICAqIFZhbHZlIGZvciB0aGlzIFBpcGVsaW5lIChpZiBhbnkpLiAgUHJpb2VyIHRvIHNldHRpbmcgdGhlIGJhc2ljIFZhbHZlLAorICAgICAqIHRoZSBWYWx2ZSdzIDxjb2RlPnNldENvbnRhaW5lcigpPC9jb2RlPiB3aWxsIGJlIGNhbGxlZCwgaWYgaXQKKyAgICAgKiBpbXBsZW1lbnRzIDxjb2RlPkNvbnRhaW5lZDwvY29kZT4sIHdpdGggdGhlIG93bmluZyBDb250YWluZXIgYXMgYW4KKyAgICAgKiBhcmd1bWVudC4gIFRoZSBtZXRob2QgbWF5IHRocm93IGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4KKyAgICAgKiBpZiB0aGlzIFZhbHZlIGNob29zZXMgbm90IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbnRhaW5lciwgb3IKKyAgICAgKiA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+IGlmIGl0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoCisgICAgICogYSBkaWZmZXJlbnQgQ29udGFpbmVyLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx2ZSBWYWx2ZSB0byBiZSBkaXN0aW5ndWlzaGVkIGFzIHRoZSBiYXNpYyBWYWx2ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhc2ljKFZhbHZlIHZhbHZlKSB7CisKKyAgICAgICAgLy8gQ2hhbmdlIGNvbXBvbmVudHMgaWYgbmVjZXNzYXJ5CisgICAgICAgIFZhbHZlIG9sZEJhc2ljID0gdGhpcy5iYXNpYzsKKyAgICAgICAgaWYgKG9sZEJhc2ljID09IHZhbHZlKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFN0b3AgdGhlIG9sZCBjb21wb25lbnQgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChvbGRCYXNpYyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoc3RhcnRlZCAmJiAob2xkQmFzaWMgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIG9sZEJhc2ljKS5zdG9wKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJTdGFuZGFyZFBpcGVsaW5lLnNldEJhc2ljOiBzdG9wIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9sZEJhc2ljIGluc3RhbmNlb2YgQ29udGFpbmVkKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgKChDb250YWluZWQpIG9sZEJhc2ljKS5zZXRDb250YWluZXIobnVsbCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXJ0IHRoZSBuZXcgY29tcG9uZW50IGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAodmFsdmUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHZhbHZlIGluc3RhbmNlb2YgQ29udGFpbmVkKSB7CisgICAgICAgICAgICAoKENvbnRhaW5lZCkgdmFsdmUpLnNldENvbnRhaW5lcih0aGlzLmNvbnRhaW5lcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHZlIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSB2YWx2ZSkuc3RhcnQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJTdGFuZGFyZFBpcGVsaW5lLnNldEJhc2ljOiBzdGFydCIsIGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgcGlwZWxpbmUKKyAgICAgICAgVmFsdmUgY3VycmVudCA9IGZpcnN0OworICAgICAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CisgICAgICAgIAlpZiAoY3VycmVudC5nZXROZXh0KCkgPT0gb2xkQmFzaWMpIHsKKyAgICAgICAgCQljdXJyZW50LnNldE5leHQodmFsdmUpOworICAgICAgICAJCWJyZWFrOworICAgICAgICAJfQorICAgICAgICAJY3VycmVudCA9IGN1cnJlbnQuZ2V0TmV4dCgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0aGlzLmJhc2ljID0gdmFsdmU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIDxwPkFkZCBhIG5ldyBWYWx2ZSB0byB0aGUgZW5kIG9mIHRoZSBwaXBlbGluZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIENvbnRhaW5lci4gIFByaW9yIHRvIGFkZGluZyB0aGUgVmFsdmUsIHRoZSBWYWx2ZSdzCisgICAgICogPGNvZGU+c2V0Q29udGFpbmVyKCk8L2NvZGU+IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCwgaWYgaXQgaW1wbGVtZW50cworICAgICAqIDxjb2RlPkNvbnRhaW5lZDwvY29kZT4sIHdpdGggdGhlIG93bmluZyBDb250YWluZXIgYXMgYW4gYXJndW1lbnQuCisgICAgICogVGhlIG1ldGhvZCBtYXkgdGhyb3cgYW4KKyAgICAgKiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlmIHRoaXMgVmFsdmUgY2hvb3NlcyBub3QgdG8KKyAgICAgKiBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250YWluZXIsIG9yIDxjb2RlPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4KKyAgICAgKiBpZiBpdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBDb250YWluZXIuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHZlIFZhbHZlIHRvIGJlIGFkZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIENvbnRhaW5lciByZWZ1c2VkIHRvCisgICAgICogIGFjY2VwdCB0aGUgc3BlY2lmaWVkIFZhbHZlCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllIFZhbHZlIHJlZnVzZXMgdG8gYmUKKyAgICAgKiAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGFpbmVyCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBWYWx2ZSBpcyBhbHJlYWR5CisgICAgICogIGFzc29jaWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRWYWx2ZShWYWx2ZSB2YWx2ZSkgeworICAgIAorICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHdlIGNhbiBhZGQgdGhpcyBWYWx2ZQorICAgICAgICBpZiAodmFsdmUgaW5zdGFuY2VvZiBDb250YWluZWQpCisgICAgICAgICAgICAoKENvbnRhaW5lZCkgdmFsdmUpLnNldENvbnRhaW5lcih0aGlzLmNvbnRhaW5lcik7CisKKyAgICAgICAgLy8gU3RhcnQgdGhlIG5ldyBjb21wb25lbnQgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChzdGFydGVkKSB7CisgICAgICAgICAgICBpZiAodmFsdmUgaW5zdGFuY2VvZiBMaWZlY3ljbGUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgdmFsdmUpLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJTdGFuZGFyZFBpcGVsaW5lLmFkZFZhbHZlOiBzdGFydDogIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIG5ld2x5IGFkZGVkIHZhbHZlCisgICAgICAgICAgICByZWdpc3RlclZhbHZlKHZhbHZlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCB0aGlzIFZhbHZlIHRvIHRoZSBzZXQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUGlwZWxpbmUKKyAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpIHsKKyAgICAgICAgCWZpcnN0ID0gdmFsdmU7CisgICAgICAgIAl2YWx2ZS5zZXROZXh0KGJhc2ljKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFZhbHZlIGN1cnJlbnQgPSBmaXJzdDsKKyAgICAgICAgICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKKwkJCQlpZiAoY3VycmVudC5nZXROZXh0KCkgPT0gYmFzaWMpIHsKKwkJCQkJY3VycmVudC5zZXROZXh0KHZhbHZlKTsKKwkJCQkJdmFsdmUuc2V0TmV4dChiYXNpYyk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljdXJyZW50ID0gY3VycmVudC5nZXROZXh0KCk7CisJCQl9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgVmFsdmVzIGluIHRoZSBwaXBlbGluZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIENvbnRhaW5lciwgaW5jbHVkaW5nIHRoZSBiYXNpYyBWYWx2ZSAoaWYgYW55KS4gIElmIHRoZXJlIGFyZSBubworICAgICAqIHN1Y2ggVmFsdmVzLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBWYWx2ZVtdIGdldFZhbHZlcygpIHsKKworICAgIAlBcnJheUxpc3QgdmFsdmVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBWYWx2ZSBjdXJyZW50ID0gZmlyc3Q7CisgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpIHsKKyAgICAgICAgCWN1cnJlbnQgPSBiYXNpYzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CisgICAgICAgIAl2YWx2ZUxpc3QuYWRkKGN1cnJlbnQpOworICAgICAgICAJY3VycmVudCA9IGN1cnJlbnQuZ2V0TmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgoVmFsdmVbXSkgdmFsdmVMaXN0LnRvQXJyYXkobmV3IFZhbHZlWzBdKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZVtdIGdldFZhbHZlT2JqZWN0TmFtZXMoKSB7CisKKyAgICAJQXJyYXlMaXN0IHZhbHZlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgVmFsdmUgY3VycmVudCA9IGZpcnN0OworICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKSB7CisgICAgICAgIAljdXJyZW50ID0gYmFzaWM7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgeworICAgICAgICAJaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBWYWx2ZUJhc2UpIHsKKyAgICAgICAgCQl2YWx2ZUxpc3QuYWRkKCgoVmFsdmVCYXNlKSBjdXJyZW50KS5nZXRPYmplY3ROYW1lKCkpOworICAgICAgICAJfQorICAgICAgICAJY3VycmVudCA9IGN1cnJlbnQuZ2V0TmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgoT2JqZWN0TmFtZVtdKSB2YWx2ZUxpc3QudG9BcnJheShuZXcgT2JqZWN0TmFtZVswXSkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgVmFsdmUgZnJvbSB0aGUgcGlwZWxpbmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiBDb250YWluZXIsIGlmIGl0IGlzIGZvdW5kOyBvdGhlcndpc2UsIGRvIG5vdGhpbmcuICBJZiB0aGUgVmFsdmUgaXMKKyAgICAgKiBmb3VuZCBhbmQgcmVtb3ZlZCwgdGhlIFZhbHZlJ3MgPGNvZGU+c2V0Q29udGFpbmVyKG51bGwpPC9jb2RlPiBtZXRob2QKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBpZiBpdCBpbXBsZW1lbnRzIDxjb2RlPkNvbnRhaW5lZDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdmUgVmFsdmUgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVZhbHZlKFZhbHZlIHZhbHZlKSB7CisKKyAgICAgICAgVmFsdmUgY3VycmVudDsKKyAgICAgICAgaWYoZmlyc3QgPT0gdmFsdmUpIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmlyc3QuZ2V0TmV4dCgpOworICAgICAgICAgICAgY3VycmVudCA9IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdXJyZW50ID0gZmlyc3Q7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQuZ2V0TmV4dCgpID09IHZhbHZlKSB7CisgICAgICAgICAgICAgICAgY3VycmVudC5zZXROZXh0KHZhbHZlLmdldE5leHQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5nZXROZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmlyc3QgPT0gYmFzaWMpIGZpcnN0ID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIGlmICh2YWx2ZSBpbnN0YW5jZW9mIENvbnRhaW5lZCkKKyAgICAgICAgICAgICgoQ29udGFpbmVkKSB2YWx2ZSkuc2V0Q29udGFpbmVyKG51bGwpOworCisgICAgICAgIC8vIFN0b3AgdGhpcyB2YWx2ZSBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKHN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIGlmICh2YWx2ZSBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSB2YWx2ZSkuc3RvcCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiU3RhbmRhcmRQaXBlbGluZS5yZW1vdmVWYWx2ZTogc3RvcDogIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVW5yZWdpc3RlciB0aGUgcmVtb3ZlZCB2YWxhdmUKKyAgICAgICAgICAgIHVucmVnaXN0ZXJWYWx2ZSh2YWx2ZSk7CisgICAgICAgIH0KKyAgICAKKyAgICB9CisKKworICAgIHB1YmxpYyBWYWx2ZSBnZXRGaXJzdCgpIHsKKyAgICAgICAgaWYgKGZpcnN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmaXJzdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBiYXNpYzsKKyAgICAgICAgfQorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZFNlcnZlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2RmNmI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDgxNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmU7CisKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlU3VwcG9ydDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5SZWdpc3RyYXRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk5hbWluZ1Jlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU2VydmVySW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5TdHJpbmdDYWNoZTsKKworCisKKy8qKgorICogU3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxiPlNlcnZlcjwvYj4gaW50ZXJmYWNlLCBhdmFpbGFibGUgZm9yIHVzZQorICogKGJ1dCBub3QgcmVxdWlyZWQpIHdoZW4gZGVwbG95aW5nIGFuZCBzdGFydGluZyBDYXRhbGluYS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTdGFuZGFyZFNlcnZlcgorICAgIGltcGxlbWVudHMgTGlmZWN5Y2xlLCBTZXJ2ZXIsIE1CZWFuUmVnaXN0cmF0aW9uIAorIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3RhbmRhcmRTZXJ2ZXIuY2xhc3MpOworICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBTdGFuZGFyZFNlcnZlcigpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICBTZXJ2ZXJGYWN0b3J5LnNldFNlcnZlcih0aGlzKTsKKworICAgICAgICBnbG9iYWxOYW1pbmdSZXNvdXJjZXMgPSBuZXcgTmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGdsb2JhbE5hbWluZ1Jlc291cmNlcy5zZXRDb250YWluZXIodGhpcyk7CisKKyAgICAgICAgaWYgKGlzVXNlTmFtaW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChuYW1pbmdDb250ZXh0TGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5hbWluZ0NvbnRleHRMaXN0ZW5lciA9IG5ldyBOYW1pbmdDb250ZXh0TGlzdGVuZXIoKTsKKyAgICAgICAgICAgICAgICBhZGRMaWZlY3ljbGVMaXN0ZW5lcihuYW1pbmdDb250ZXh0TGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBHbG9iYWwgbmFtaW5nIHJlc291cmNlcyBjb250ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgamF2YXgubmFtaW5nLkNvbnRleHQgZ2xvYmFsTmFtaW5nQ29udGV4dCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEdsb2JhbCBuYW1pbmcgcmVzb3VyY2VzLgorICAgICAqLworICAgIHByaXZhdGUgTmFtaW5nUmVzb3VyY2VzIGdsb2JhbE5hbWluZ1Jlc291cmNlcyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgU2VydmVyIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlci8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByaXZhdGUgTGlmZWN5Y2xlU3VwcG9ydCBsaWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWluZyBjb250ZXh0IGxpc3RlbmVyIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIE5hbWluZ0NvbnRleHRMaXN0ZW5lciBuYW1pbmdDb250ZXh0TGlzdGVuZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcG9ydCBudW1iZXIgb24gd2hpY2ggd2Ugd2FpdCBmb3Igc2h1dGRvd24gY29tbWFuZHMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcG9ydCA9IDgwMDU7CisKKworICAgIC8qKgorICAgICAqIEEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGhhdCBpcyA8c3Ryb25nPm9ubHk8L3N0cm9uZz4gdXNlZCBpZgorICAgICAqIHRoZSBzaHV0ZG93biBjb21tYW5kIHN0cmluZyBpcyBsb25nZXIgdGhhbiAxMDI0IGNoYXJhY3RlcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBSYW5kb20gcmFuZG9tID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBTZXJ2aWNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXJ2ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXJ2aWNlIHNlcnZpY2VzW10gPSBuZXcgU2VydmljZVswXTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNodXRkb3duIGNvbW1hbmQgc3RyaW5nIHdlIGFyZSBsb29raW5nIGZvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzaHV0ZG93biA9ICJTSFVURE9XTiI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhpcyBjb21wb25lbnQgYmVlbiBzdGFydGVkPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIGluaXRpYWxpemVkPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQgc3VwcG9ydCA9IG5ldyBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQodGhpcyk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc3RvcEF3YWl0ID0gZmFsc2U7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBnbG9iYWwgbmFtaW5nIHJlc291cmNlcyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBqYXZheC5uYW1pbmcuQ29udGV4dCBnZXRHbG9iYWxOYW1pbmdDb250ZXh0KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5nbG9iYWxOYW1pbmdDb250ZXh0KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnbG9iYWwgbmFtaW5nIHJlc291cmNlcyBjb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGdsb2JhbE5hbWluZ0NvbnRleHQgVGhlIG5ldyBnbG9iYWwgbmFtaW5nIHJlc291cmNlIGNvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRHbG9iYWxOYW1pbmdDb250ZXh0CisgICAgICAgIChqYXZheC5uYW1pbmcuQ29udGV4dCBnbG9iYWxOYW1pbmdDb250ZXh0KSB7CisKKyAgICAgICAgdGhpcy5nbG9iYWxOYW1pbmdDb250ZXh0ID0gZ2xvYmFsTmFtaW5nQ29udGV4dDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBnbG9iYWwgbmFtaW5nIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nUmVzb3VyY2VzIGdldEdsb2JhbE5hbWluZ1Jlc291cmNlcygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZ2xvYmFsTmFtaW5nUmVzb3VyY2VzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnbG9iYWwgbmFtaW5nIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBnbG9iYWxOYW1pbmdSZXNvdXJjZXMgVGhlIG5ldyBnbG9iYWwgbmFtaW5nIHJlc291cmNlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdsb2JhbE5hbWluZ1Jlc291cmNlcworICAgICAgICAoTmFtaW5nUmVzb3VyY2VzIGdsb2JhbE5hbWluZ1Jlc291cmNlcykgeworCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBvbGRHbG9iYWxOYW1pbmdSZXNvdXJjZXMgPQorICAgICAgICAgICAgdGhpcy5nbG9iYWxOYW1pbmdSZXNvdXJjZXM7CisgICAgICAgIHRoaXMuZ2xvYmFsTmFtaW5nUmVzb3VyY2VzID0gZ2xvYmFsTmFtaW5nUmVzb3VyY2VzOworICAgICAgICB0aGlzLmdsb2JhbE5hbWluZ1Jlc291cmNlcy5zZXRDb250YWluZXIodGhpcyk7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJnbG9iYWxOYW1pbmdSZXNvdXJjZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRHbG9iYWxOYW1pbmdSZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2xvYmFsTmFtaW5nUmVzb3VyY2VzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgU2VydmVyIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwb3J0IHRoZSBjdXJyZW50IFRvbWNhdCBTZXJ2ZXIgUmVsZWFzZSBudW1iZXIKKyAgICAgKiBAcmV0dXJuIFRvbWNhdCByZWxlYXNlIGlkZW50aWZpZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIFNlcnZlckluZm8uZ2V0U2VydmVySW5mbygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcG9ydCBudW1iZXIgd2UgbGlzdGVuIHRvIGZvciBzaHV0ZG93biBjb21tYW5kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnBvcnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBvcnQgbnVtYmVyIHdlIGxpc3RlbiB0byBmb3Igc2h1dGRvd24gY29tbWFuZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9ydCBUaGUgbmV3IHBvcnQgbnVtYmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgeworCisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2h1dGRvd24gY29tbWFuZCBzdHJpbmcgd2UgYXJlIHdhaXRpbmcgZm9yLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2h1dGRvd24oKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnNodXRkb3duKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzaHV0ZG93biBjb21tYW5kIHdlIGFyZSB3YWl0aW5nIGZvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaHV0ZG93biBUaGUgbmV3IHNodXRkb3duIGNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaHV0ZG93bihTdHJpbmcgc2h1dGRvd24pIHsKKworICAgICAgICB0aGlzLnNodXRkb3duID0gc2h1dGRvd247CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXJ2ZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgU2VydmljZSB0byB0aGUgc2V0IG9mIGRlZmluZWQgU2VydmljZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgU2VydmljZSB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKSB7CisKKyAgICAgICAgc2VydmljZS5zZXRTZXJ2ZXIodGhpcyk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChzZXJ2aWNlcykgeworICAgICAgICAgICAgU2VydmljZSByZXN1bHRzW10gPSBuZXcgU2VydmljZVtzZXJ2aWNlcy5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc2VydmljZXMsIDAsIHJlc3VsdHMsIDAsIHNlcnZpY2VzLmxlbmd0aCk7CisgICAgICAgICAgICByZXN1bHRzW3NlcnZpY2VzLmxlbmd0aF0gPSBzZXJ2aWNlOworICAgICAgICAgICAgc2VydmljZXMgPSByZXN1bHRzOworCisgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmluaXRpYWxpemUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhcnRlZCAmJiAoc2VydmljZSBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgc2VydmljZSkuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZXBvcnQgdGhpcyBwcm9wZXJ0eSBjaGFuZ2UgdG8gaW50ZXJlc3RlZCBsaXN0ZW5lcnMKKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJzZXJ2aWNlIiwgbnVsbCwgc2VydmljZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3BBd2FpdCgpIHsKKyAgICAgICAgc3RvcEF3YWl0PXRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FpdCB1bnRpbCBhIHByb3BlciBzaHV0ZG93biBjb21tYW5kIGlzIHJlY2VpdmVkLCB0aGVuIHJldHVybi4KKyAgICAgKiBUaGlzIGtlZXBzIHRoZSBtYWluIHRocmVhZCBhbGl2ZSAtIHRoZSB0aHJlYWQgcG9vbCBsaXN0ZW5pbmcgZm9yIGh0dHAgCisgICAgICogY29ubmVjdGlvbnMgaXMgZGFlbW9uIHRocmVhZHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXdhaXQoKSB7CisgICAgICAgIC8vIE5lZ2F0aXZlIHZhbHVlcyAtIGRvbid0IHdhaXQgb24gcG9ydCAtIHRvbWNhdCBpcyBlbWJlZGRlZCBvciB3ZSBqdXN0IGRvbid0IGxpa2UgcG9ydHMKKyAgICAgICAgaWYoIHBvcnQgPT0gLTIgKSB7CisgICAgICAgICAgICAvLyB1bmRvY3VtZW50ZWQgeWV0IC0gZm9yIGVtYmVkZGluZyBhcHBzIHRoYXQgYXJlIGFyb3VuZCwgYWxpdmUuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYoIHBvcnQ9PS0xICkgeworICAgICAgICAgICAgd2hpbGUoIHRydWUgKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKCAxMDAwMDAgKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIHN0b3BBd2FpdCApIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gU2V0IHVwIGEgc2VydmVyIHNvY2tldCB0byB3YWl0IG9uCisgICAgICAgIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VydmVyU29ja2V0ID0KKyAgICAgICAgICAgICAgICBuZXcgU2VydmVyU29ja2V0KHBvcnQsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjEyNy4wLjAuMSIpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJTdGFuZGFyZFNlcnZlci5hd2FpdDogY3JlYXRlWyIgKyBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXTogIiwgZSk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvb3Agd2FpdGluZyBmb3IgYSBjb25uZWN0aW9uIGFuZCBhIHZhbGlkIGNvbW1hbmQKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKworICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIG5leHQgY29ubmVjdGlvbgorICAgICAgICAgICAgU29ja2V0IHNvY2tldCA9IG51bGw7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzb2NrZXQgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisgICAgICAgICAgICAgICAgc29ja2V0LnNldFNvVGltZW91dCgxMCAqIDEwMDApOyAgLy8gVGVuIHNlY29uZHMKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gYWNlKSB7CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIlN0YW5kYXJkU2VydmVyLmFjY2VwdCBzZWN1cml0eSBleGNlcHRpb246ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhY2UuZ2V0TWVzc2FnZSgpLCBhY2UpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiU3RhbmRhcmRTZXJ2ZXIuYXdhaXQ6IGFjY2VwdDogIiwgZSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlYWQgYSBzZXQgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBzb2NrZXQKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBjb21tYW5kID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgaW50IGV4cGVjdGVkID0gMTAyNDsgLy8gQ3V0IG9mZiB0byBhdm9pZCBEb1MgYXR0YWNrCisgICAgICAgICAgICB3aGlsZSAoZXhwZWN0ZWQgPCBzaHV0ZG93bi5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIGlmIChyYW5kb20gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gbmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgKz0gKHJhbmRvbS5uZXh0SW50KCkgJSAxMDI0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChleHBlY3RlZCA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgY2ggPSAtMTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjaCA9IHN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiU3RhbmRhcmRTZXJ2ZXIuYXdhaXQ6IHJlYWQ6ICIsIGUpOworICAgICAgICAgICAgICAgICAgICBjaCA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2ggPCAzMikgIC8vIENvbnRyb2wgY2hhcmFjdGVyIG9yIEVPRiB0ZXJtaW5hdGVzIGxvb3AKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY29tbWFuZC5hcHBlbmQoKGNoYXIpIGNoKTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZC0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDbG9zZSB0aGUgc29ja2V0IG5vdyB0aGF0IHdlIGFyZSBkb25lIHdpdGggaXQKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNYXRjaCBhZ2FpbnN0IG91ciBjb21tYW5kIHN0cmluZworICAgICAgICAgICAgYm9vbGVhbiBtYXRjaCA9IGNvbW1hbmQudG9TdHJpbmcoKS5lcXVhbHMoc2h1dGRvd24pOworICAgICAgICAgICAgaWYgKG1hdGNoKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBsb2cud2FybigiU3RhbmRhcmRTZXJ2ZXIuYXdhaXQ6IEludmFsaWQgY29tbWFuZCAnIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQudG9TdHJpbmcoKSArICInIHJlY2VpdmVkIik7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIENsb3NlIHRoZSBzZXJ2ZXIgc29ja2V0IGFuZCByZXR1cm4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlcnZlclNvY2tldC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgU2VydmljZSAoaWYgaXQgZXhpc3RzKTsgb3RoZXJ3aXNlIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgU2VydmljZSB0byBiZSByZXR1cm5lZAorICAgICAqLworICAgIHB1YmxpYyBTZXJ2aWNlIGZpbmRTZXJ2aWNlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcnZpY2VzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKHNlcnZpY2VzW2ldLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzZXJ2aWNlc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIFNlcnZpY2VzIGRlZmluZWQgd2l0aGluIHRoaXMgU2VydmVyLgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2aWNlW10gZmluZFNlcnZpY2VzKCkgeworCisgICAgICAgIHJldHVybiAoc2VydmljZXMpOworCisgICAgfQorICAgIAorICAgIC8qKiAKKyAgICAgKiBSZXR1cm4gdGhlIEpNWCBzZXJ2aWNlIG5hbWVzLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3ROYW1lW10gZ2V0U2VydmljZU5hbWVzKCkgeworICAgICAgICBPYmplY3ROYW1lIG9uYW1lc1tdPW5ldyBPYmplY3ROYW1lWyBzZXJ2aWNlcy5sZW5ndGggXTsKKyAgICAgICAgZm9yKCBpbnQgaT0wOyBpPHNlcnZpY2VzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgb25hbWVzW2ldPSgoU3RhbmRhcmRTZXJ2aWNlKXNlcnZpY2VzW2ldKS5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9uYW1lczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIFNlcnZpY2UgZnJvbSB0aGUgc2V0IGFzc29jaWF0ZWQgZnJvbSB0aGlzCisgICAgICogU2VydmVyLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIFNlcnZpY2UgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChzZXJ2aWNlcykgeworICAgICAgICAgICAgaW50IGogPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VydmljZSA9PSBzZXJ2aWNlc1tpXSkgeworICAgICAgICAgICAgICAgICAgICBqID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGogPCAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGlmIChzZXJ2aWNlc1tqXSBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBzZXJ2aWNlc1tqXSkuc3RvcCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgayA9IDA7CisgICAgICAgICAgICBTZXJ2aWNlIHJlc3VsdHNbXSA9IG5ldyBTZXJ2aWNlW3NlcnZpY2VzLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpICE9IGopCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaysrXSA9IHNlcnZpY2VzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VydmljZXMgPSByZXN1bHRzOworCisgICAgICAgICAgICAvLyBSZXBvcnQgdGhpcyBwcm9wZXJ0eSBjaGFuZ2UgdG8gaW50ZXJlc3RlZCBsaXN0ZW5lcnMKKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJzZXJ2aWNlIiwgc2VydmljZSwgbnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgc3VwcG9ydC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN1cHBvcnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlN0YW5kYXJkU2VydmVyWyIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0UG9ydCgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIGVudGlyZSA8Y29kZT5TZXJ2ZXI8L2NvZGU+CisgICAgICogb3V0IHRvIHRoZSBzZXJ2ZXIueG1sIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gamF2YXgubWFuYWdlbWVudC5JbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBtYW5hZ2VkIHJlc291cmNlIG9iamVjdAorICAgICAqICBjYW5ub3QgYmUgZm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5FeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemVyIG9mIHRoZSBvYmplY3QgdGhyb3dzCisgICAgICogIGFuIGV4Y2VwdGlvbiwgb3IgcGVyc2lzdGVuY2UgaXMgbm90IHN1cHBvcnRlZAorICAgICAqIEBleGNlcHRpb24gamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgcmVwb3J0ZWQKKyAgICAgKiAgYnkgdGhlIHBlcnNpc3RlbmNlIG1lY2hhbmlzbQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9yZUNvbmZpZygpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgc25hbWUgPSBudWxsOyAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgc25hbWUgPSBuZXcgT2JqZWN0TmFtZSgiQ2F0YWxpbmE6dHlwZT1TdG9yZUNvbmZpZyIpOworICAgICAgICAgICBpZihtc2VydmVyLmlzUmVnaXN0ZXJlZChzbmFtZSkpIHsKKyAgICAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKHNuYW1lLCAic3RvcmVDb25maWciLCBudWxsLCBudWxsKTsgICAgICAgICAgICAKKyAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlN0b3JlQ29uZmlnIG1iZWFuIG5vdCByZWdpc3RlcmVkIiArIHNuYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcih0KTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgPGNvZGU+Q29udGV4dDwvY29kZT4KKyAgICAgKiBvdXQgdG8gdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIGphdmF4Lm1hbmFnZW1lbnQuSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgbWFuYWdlZCByZXNvdXJjZSBvYmplY3QKKyAgICAgKiAgY2Fubm90IGJlIGZvdW5kCisgICAgICogQGV4Y2VwdGlvbiBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiB0aGUgb2JqZWN0IHRocm93cworICAgICAqICBhbiBleGNlcHRpb24sIG9yIHBlcnNpc3RlbmNlIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIGphdmF4Lm1hbmFnZW1lbnQuUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHJlcG9ydGVkCisgICAgICogIGJ5IHRoZSBwZXJzaXN0ZW5jZSBtZWNoYW5pc20KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcmVDb250ZXh0KENvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBPYmplY3ROYW1lIHNuYW1lID0gbnVsbDsgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgIHNuYW1lID0gbmV3IE9iamVjdE5hbWUoIkNhdGFsaW5hOnR5cGU9U3RvcmVDb25maWciKTsKKyAgICAgICAgICAgaWYobXNlcnZlci5pc1JlZ2lzdGVyZWQoc25hbWUpKSB7CisgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZShzbmFtZSwgInN0b3JlIiwKKyAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2NvbnRleHR9LCAKKyAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nIFtdIHsgImphdmEubGFuZy5TdHJpbmcifSk7CisgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgbG9nLmVycm9yKCJTdG9yZUNvbmZpZyBtYmVhbiBub3QgcmVnaXN0ZXJlZCIgKyBzbmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IodCk7CisgICAgICAgIH0KKyAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIG5hbWluZyBzaG91bGQgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNVc2VOYW1pbmcoKSB7CisgICAgICAgIGJvb2xlYW4gdXNlTmFtaW5nID0gdHJ1ZTsKKyAgICAgICAgLy8gUmVhZGluZyB0aGUgImNhdGFsaW5hLnVzZU5hbWluZyIgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICAgICAgU3RyaW5nIHVzZU5hbWluZ1Byb3BlcnR5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS51c2VOYW1pbmciKTsKKyAgICAgICAgaWYgKCh1c2VOYW1pbmdQcm9wZXJ0eSAhPSBudWxsKQorICAgICAgICAgICAgJiYgKHVzZU5hbWluZ1Byb3BlcnR5LmVxdWFscygiZmFsc2UiKSkpIHsKKyAgICAgICAgICAgIHVzZU5hbWluZyA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1c2VOYW1pbmc7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgTGlmZWN5Y2xlRXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcworICAgICAqIExpZmVjeWNsZSBoYXMgbm8gbGlzdGVuZXJzIHJlZ2lzdGVyZWQsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUxpc3RlbmVyW10gZmluZExpZmVjeWNsZUxpc3RlbmVycygpIHsKKworICAgICAgICByZXR1cm4gbGlmZWN5Y2xlLmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgTGlmZWN5Y2xlRXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb2YgdGhlIHB1YmxpYworICAgICAqIG1ldGhvZHMgb2YgdGhpcyBjb21wb25lbnQgYXJlIHV0aWxpemVkLiAgSXQgc2hvdWxkIGFsc28gc2VuZCBhCisgICAgICogTGlmZWN5Y2xlRXZlbnQgb2YgdHlwZSBTVEFSVF9FVkVOVCB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyB0aGlzIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmIChzdGFydGVkKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlcnZlci5zdGFydC5zdGFydGVkIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9TVEFSVF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCwgbnVsbCk7CisgICAgICAgIHN0YXJ0ZWQgPSB0cnVlOworCisgICAgICAgIC8vIFN0YXJ0IG91ciBkZWZpbmVkIFNlcnZpY2VzCisgICAgICAgIHN5bmNocm9uaXplZCAoc2VydmljZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VydmljZXNbaV0gaW5zdGFuY2VvZiBMaWZlY3ljbGUpCisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBzZXJ2aWNlc1tpXSkuc3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChBRlRFUl9TVEFSVF9FVkVOVCwgbnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgdGVybWluYXRlIHRoZSBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzCisgICAgICogY29tcG9uZW50LiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHRoZSBsYXN0IG9uZSBjYWxsZWQgb24gYSBnaXZlbgorICAgICAqIGluc3RhbmNlIG9mIHRoaXMgY29tcG9uZW50LiAgSXQgc2hvdWxkIGFsc28gc2VuZCBhIExpZmVjeWNsZUV2ZW50CisgICAgICogb2YgdHlwZSBTVE9QX0VWRU5UIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmICghc3RhcnRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQkVGT1JFX1NUT1BfRVZFTlQsIG51bGwpOworCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RPUF9FVkVOVCwgbnVsbCk7CisgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTsKKworICAgICAgICAvLyBTdG9wIG91ciBkZWZpbmVkIFNlcnZpY2VzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzZXJ2aWNlc1tpXSBpbnN0YW5jZW9mIExpZmVjeWNsZSkKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgc2VydmljZXNbaV0pLnN0b3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChBRlRFUl9TVE9QX0VWRU5ULCBudWxsKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhbGl6ZSgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJbnZva2UgYSBwcmUtc3RhcnR1cCBpbml0aWFsaXphdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGFsbG93IGNvbm5lY3RvcnMKKyAgICAgKiB0byBiaW5kIHRvIHJlc3RyaWN0ZWQgcG9ydHMgdW5kZXIgVW5peCBvcGVyYXRpbmcgZW52aXJvbm1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKQorICAgICAgICB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIAorICAgIHsKKyAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlcnZlci5pbml0aWFsaXplLmluaXRpYWxpemVkIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoSU5JVF9FVkVOVCwgbnVsbCk7CisgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKworICAgICAgICBpZiggb25hbWU9PW51bGwgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9uYW1lPW5ldyBPYmplY3ROYW1lKCAiQ2F0YWxpbmE6dHlwZT1TZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXJDb21wb25lbnQodGhpcywgb25hbWUsIG51bGwgKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFcnJvciByZWdpc3RlcmluZyAiLGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBSZWdpc3RlciBnbG9iYWwgU3RyaW5nIGNhY2hlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lMiA9IAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKG9uYW1lLmdldERvbWFpbigpICsgIjp0eXBlPVN0cmluZ0NhY2hlIik7CisgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlckNvbXBvbmVudChuZXcgU3RyaW5nQ2FjaGUoKSwgb25hbWUyLCBudWxsICk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHJlZ2lzdGVyaW5nICIsZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbml0aWFsaXplIG91ciBkZWZpbmVkIFNlcnZpY2VzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHNlcnZpY2VzW2ldLmluaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHR5cGU7CisgICAgcHJvdGVjdGVkIFN0cmluZyBkb21haW47CisgICAgcHJvdGVjdGVkIFN0cmluZyBzdWZmaXg7CisgICAgcHJvdGVjdGVkIE9iamVjdE5hbWUgb25hbWU7CisgICAgcHJvdGVjdGVkIE1CZWFuU2VydmVyIG1zZXJ2ZXI7CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBnZXRPYmplY3ROYW1lKCkgeworICAgICAgICByZXR1cm4gb25hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREb21haW4oKSB7CisgICAgICAgIHJldHVybiBkb21haW47CisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWUgcHJlUmVnaXN0ZXIoTUJlYW5TZXJ2ZXIgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG9uYW1lPW5hbWU7CisgICAgICAgIG1zZXJ2ZXI9c2VydmVyOworICAgICAgICBkb21haW49bmFtZS5nZXREb21haW4oKTsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9zdFJlZ2lzdGVyKEJvb2xlYW4gcmVnaXN0cmF0aW9uRG9uZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByZURlcmVnaXN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3N0RGVyZWdpc3RlcigpIHsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZFNlcnZpY2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZTAyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDYyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmU7CisKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlU3VwcG9ydDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuUmVnaXN0cmF0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkxpZmVjeWNsZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CisKKworLyoqCisgKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+U2VydmljZTwvY29kZT4gaW50ZXJmYWNlLiAgVGhlCisgKiBhc3NvY2lhdGVkIENvbnRhaW5lciBpcyBnZW5lcmFsbHkgYW4gaW5zdGFuY2Ugb2YgRW5naW5lLCBidXQgdGhpcyBpcworICogbm90IHJlcXVpcmVkLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICovCisKK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFNlcnZpY2UKKyAgICAgICAgaW1wbGVtZW50cyBMaWZlY3ljbGUsIFNlcnZpY2UsIE1CZWFuUmVnaXN0cmF0aW9uIAorIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3RhbmRhcmRTZXJ2aWNlLmNsYXNzKTsKKyAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29tcG9uZW50IGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZpY2UvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhpcyBzZXJ2aWNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByaXZhdGUgTGlmZWN5Y2xlU3VwcG9ydCBsaWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+U2VydmVyPC9jb2RlPiB0aGF0IG93bnMgdGhpcyBTZXJ2aWNlLCBpZiBhbnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXJ2ZXIgc2VydmVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIHN0YXJ0ZWQ/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IHN1cHBvcnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VTdXBwb3J0KHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIENvbm5lY3RvcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU2VydmljZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29ubmVjdG9yIGNvbm5lY3RvcnNbXSA9IG5ldyBDb25uZWN0b3JbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU2VydmljZS4gKEluIHRoZSBjYXNlIG9mIHRoZQorICAgICAqIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5FbWJlZGRlZCBzdWJjbGFzcywgdGhpcyBob2xkcyB0aGUgbW9zdAorICAgICAqIHJlY2VudGx5IGFkZGVkIEVuZ2luZS4pCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbnRhaW5lciBjb250YWluZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhpcyBjb21wb25lbnQgYmVlbiBpbml0aWFsaXplZD8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5Db250YWluZXI8L2NvZGU+IHRoYXQgaGFuZGxlcyByZXF1ZXN0cyBmb3IgYWxsCisgICAgICogPGNvZGU+Q29ubmVjdG9yczwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29udGFpbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8Y29kZT5Db250YWluZXI8L2NvZGU+IHRoYXQgaGFuZGxlcyByZXF1ZXN0cyBmb3IgYWxsCisgICAgICogPGNvZGU+Q29ubmVjdG9yczwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgU2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXIgVGhlIG5ldyBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGNvbnRhaW5lcikgeworCisgICAgICAgIENvbnRhaW5lciBvbGRDb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjsKKyAgICAgICAgaWYgKChvbGRDb250YWluZXIgIT0gbnVsbCkgJiYgKG9sZENvbnRhaW5lciBpbnN0YW5jZW9mIEVuZ2luZSkpCisgICAgICAgICAgICAoKEVuZ2luZSkgb2xkQ29udGFpbmVyKS5zZXRTZXJ2aWNlKG51bGwpOworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICAgICAgaWYgKCh0aGlzLmNvbnRhaW5lciAhPSBudWxsKSAmJiAodGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBFbmdpbmUpKQorICAgICAgICAgICAgKChFbmdpbmUpIHRoaXMuY29udGFpbmVyKS5zZXRTZXJ2aWNlKHRoaXMpOworICAgICAgICBpZiAoc3RhcnRlZCAmJiAodGhpcy5jb250YWluZXIgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgICh0aGlzLmNvbnRhaW5lciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIHRoaXMuY29udGFpbmVyKS5zdGFydCgpOworICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChjb25uZWN0b3JzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbm5lY3RvcnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgY29ubmVjdG9yc1tpXS5zZXRDb250YWluZXIodGhpcy5jb250YWluZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGFydGVkICYmIChvbGRDb250YWluZXIgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgIChvbGRDb250YWluZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBvbGRDb250YWluZXIpLnN0b3AoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHRoaXMgcHJvcGVydHkgY2hhbmdlIHRvIGludGVyZXN0ZWQgbGlzdGVuZXJzCisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJjb250YWluZXIiLCBvbGRDb250YWluZXIsIHRoaXMuY29udGFpbmVyKTsKKworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3ROYW1lIGdldENvbnRhaW5lck5hbWUoKSB7CisgICAgICAgIGlmKCBjb250YWluZXIgaW5zdGFuY2VvZiBDb250YWluZXJCYXNlICkgeworICAgICAgICAgICAgcmV0dXJuICgoQ29udGFpbmVyQmFzZSljb250YWluZXIpLmdldEpteE5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGlzIFNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5uYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoaXMgU2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgc2VydmljZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgPGNvZGU+U2VydmVyPC9jb2RlPiB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkIChpZiBhbnkpLgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2ZXIgZ2V0U2VydmVyKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5zZXJ2ZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPlNlcnZlcjwvY29kZT4gd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZCAoaWYgYW55KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2ZXIgVGhlIHNlcnZlciB0aGF0IG93bnMgdGhpcyBTZXJ2aWNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VydmVyKFNlcnZlciBzZXJ2ZXIpIHsKKworICAgICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBDb25uZWN0b3IgdG8gdGhlIHNldCBvZiBkZWZpbmVkIENvbm5lY3RvcnMsIGFuZCBhc3NvY2lhdGUgaXQKKyAgICAgKiB3aXRoIHRoaXMgU2VydmljZSdzIENvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0b3IgVGhlIENvbm5lY3RvciB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbm5lY3RvcihDb25uZWN0b3IgY29ubmVjdG9yKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChjb25uZWN0b3JzKSB7CisgICAgICAgICAgICBjb25uZWN0b3Iuc2V0Q29udGFpbmVyKHRoaXMuY29udGFpbmVyKTsKKyAgICAgICAgICAgIGNvbm5lY3Rvci5zZXRTZXJ2aWNlKHRoaXMpOworICAgICAgICAgICAgQ29ubmVjdG9yIHJlc3VsdHNbXSA9IG5ldyBDb25uZWN0b3JbY29ubmVjdG9ycy5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29ubmVjdG9ycywgMCwgcmVzdWx0cywgMCwgY29ubmVjdG9ycy5sZW5ndGgpOworICAgICAgICAgICAgcmVzdWx0c1tjb25uZWN0b3JzLmxlbmd0aF0gPSBjb25uZWN0b3I7CisgICAgICAgICAgICBjb25uZWN0b3JzID0gcmVzdWx0czsKKworICAgICAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yLmluaXRpYWxpemUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvbm5lY3Rvci5pbml0aWFsaXplIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhcnRlZCAmJiAoY29ubmVjdG9yIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjb25uZWN0b3IpLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDb25uZWN0b3Iuc3RhcnQiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlcG9ydCB0aGlzIHByb3BlcnR5IGNoYW5nZSB0byBpbnRlcmVzdGVkIGxpc3RlbmVycworICAgICAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImNvbm5lY3RvciIsIG51bGwsIGNvbm5lY3Rvcik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3ROYW1lW10gZ2V0Q29ubmVjdG9yTmFtZXMoKSB7CisgICAgICAgIE9iamVjdE5hbWUgcmVzdWx0c1tdID0gbmV3IE9iamVjdE5hbWVbY29ubmVjdG9ycy5sZW5ndGhdOworICAgICAgICBmb3IoIGludCBpPTA7IGk8cmVzdWx0cy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgIHJlc3VsdHNbaV09Y29ubmVjdG9yc1tpXS5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN1cHBvcnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZpbmQgYW5kIHJldHVybiB0aGUgc2V0IG9mIENvbm5lY3RvcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29ubmVjdG9yW10gZmluZENvbm5lY3RvcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIChjb25uZWN0b3JzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgQ29ubmVjdG9yIGZyb20gdGhlIHNldCBhc3NvY2lhdGVkIGZyb20gdGhpcworICAgICAqIFNlcnZpY2UuICBUaGUgcmVtb3ZlZCBDb25uZWN0b3Igd2lsbCBhbHNvIGJlIGRpc2Fzc29jaWF0ZWQgZnJvbSBvdXIKKyAgICAgKiBDb250YWluZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdG9yIFRoZSBDb25uZWN0b3IgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3RvcihDb25uZWN0b3IgY29ubmVjdG9yKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChjb25uZWN0b3JzKSB7CisgICAgICAgICAgICBpbnQgaiA9IC0xOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25uZWN0b3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3RvciA9PSBjb25uZWN0b3JzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIGogPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKHN0YXJ0ZWQgJiYgKGNvbm5lY3RvcnNbal0gaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNvbm5lY3RvcnNbal0pLnN0b3AoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvbm5lY3Rvci5zdG9wIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29ubmVjdG9yc1tqXS5zZXRDb250YWluZXIobnVsbCk7CisgICAgICAgICAgICBjb25uZWN0b3Iuc2V0U2VydmljZShudWxsKTsKKyAgICAgICAgICAgIGludCBrID0gMDsKKyAgICAgICAgICAgIENvbm5lY3RvciByZXN1bHRzW10gPSBuZXcgQ29ubmVjdG9yW2Nvbm5lY3RvcnMubGVuZ3RoIC0gMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbm5lY3RvcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBqKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2srK10gPSBjb25uZWN0b3JzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29ubmVjdG9ycyA9IHJlc3VsdHM7CisKKyAgICAgICAgICAgIC8vIFJlcG9ydCB0aGlzIHByb3BlcnR5IGNoYW5nZSB0byBpbnRlcmVzdGVkIGxpc3RlbmVycworICAgICAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImNvbm5lY3RvciIsIGNvbm5lY3RvciwgbnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN1cHBvcnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlN0YW5kYXJkU2VydmljZVsiKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldE5hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgTGlmZWN5Y2xlRXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcyAKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIExpZmVjeWNsZUV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLnJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJlcGFyZSBmb3IgdGhlIGJlZ2lubmluZyBvZiBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzCisgICAgICogY29tcG9uZW50LiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55IG9mIHRoZSBwdWJsaWMKKyAgICAgKiBtZXRob2RzIG9mIHRoaXMgY29tcG9uZW50IGFyZSB1dGlsaXplZC4gIEl0IHNob3VsZCBhbHNvIHNlbmQgYQorICAgICAqIExpZmVjeWNsZUV2ZW50IG9mIHR5cGUgU1RBUlRfRVZFTlQgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgdGhpcyBjb21wb25lbnQgZnJvbSBiZWluZyB1c2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSAmJiBzdGFydGVkKSB7CisgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2VydmljZS5zdGFydC5zdGFydGVkIikpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiggISBpbml0aWFsaXplZCApCisgICAgICAgICAgICBpbml0KCk7IAorCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RBUlRfRVZFTlQsIG51bGwpOworICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlcnZpY2Uuc3RhcnQubmFtZSIsIHRoaXMubmFtZSkpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisKKyAgICAgICAgLy8gU3RhcnQgb3VyIGRlZmluZWQgQ29udGFpbmVyIGZpcnN0CisgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChjb250YWluZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjb250YWluZXIpLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhcnQgb3VyIGRlZmluZWQgQ29ubmVjdG9ycyBzZWNvbmQKKyAgICAgICAgc3luY2hyb25pemVkIChjb25uZWN0b3JzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbm5lY3RvcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY29ubmVjdG9yc1tpXSBpbnN0YW5jZW9mIExpZmVjeWNsZSkKKyAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNvbm5lY3RvcnNbaV0pLnN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQUZURVJfU1RBUlRfRVZFTlQsIG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHRlcm1pbmF0ZSB0aGUgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB0aGUgbGFzdCBvbmUgY2FsbGVkIG9uIGEgZ2l2ZW4KKyAgICAgKiBpbnN0YW5jZSBvZiB0aGlzIGNvbXBvbmVudC4gIEl0IHNob3VsZCBhbHNvIHNlbmQgYSBMaWZlY3ljbGVFdmVudAorICAgICAqIG9mIHR5cGUgU1RPUF9FVkVOVCB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBuZWVkcyB0byBiZSByZXBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAoIXN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RPUF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgLy8gU3RvcCBvdXIgZGVmaW5lZCBDb25uZWN0b3JzIGZpcnN0CisgICAgICAgIHN5bmNocm9uaXplZCAoY29ubmVjdG9ycykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25uZWN0b3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdG9yc1tpXS5wYXVzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSGV1cmlzdGljOiBTbGVlcCBmb3IgYSB3aGlsZSB0byBlbnN1cmUgcGF1c2Ugb2YgdGhlIGNvbm5lY3RvcgorICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfQorCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RPUF9FVkVOVCwgbnVsbCk7CisgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuaW5mbworICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2VydmljZS5zdG9wLm5hbWUiLCB0aGlzLm5hbWUpKTsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworCisgICAgICAgIC8vIFN0b3Agb3VyIGRlZmluZWQgQ29udGFpbmVyIHNlY29uZAorICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY29udGFpbmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY29udGFpbmVyKS5zdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FIHBlcm8gLS0gV2h5IGNvbnRhaW5lciBzdG9wIGZpcnN0PyBLZWVwQWxpdmUgY29ubmV0aW9ucyBjYW4gc2VuZCByZXF1ZXN0ISAKKyAgICAgICAgLy8gU3RvcCBvdXIgZGVmaW5lZCBDb25uZWN0b3JzIGZpcnN0CisgICAgICAgIHN5bmNocm9uaXplZCAoY29ubmVjdG9ycykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25uZWN0b3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3RvcnNbaV0gaW5zdGFuY2VvZiBMaWZlY3ljbGUpCisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjb25uZWN0b3JzW2ldKS5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggb25hbWU9PWNvbnRyb2xsZXIgKSB7CisgICAgICAgICAgICAvLyB3ZSByZWdpc3RlcmVkIG91cnNlbGYgb24gaW5pdCgpLgorICAgICAgICAgICAgLy8gVGhhdCBzaG91bGQgYmUgdGhlIHR5cGljYWwgY2FzZSAtIHRoaXMgb2JqZWN0IGlzIGp1c3QgZm9yCisgICAgICAgICAgICAvLyBiYWNrd2FyZCBjb21wYXQsIG5vYm9keSBzaG91bGQgYm90aGVyIHRvIGxvYWQgaXQgZXhwbGljaXRlbHkKKyAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLnVucmVnaXN0ZXJDb21wb25lbnQob25hbWUpOworICAgICAgICB9CisgICAgICAgIAorCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChBRlRFUl9TVE9QX0VWRU5ULCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW52b2tlIGEgcHJlLXN0YXJ0dXAgaW5pdGlhbGl6YXRpb24uIFRoaXMgaXMgdXNlZCB0byBhbGxvdyBjb25uZWN0b3JzCisgICAgICogdG8gYmluZCB0byByZXN0cmljdGVkIHBvcnRzIHVuZGVyIFVuaXggb3BlcmF0aW5nIGVudmlyb25tZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkKKyAgICAgICAgICAgIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIFNlcnZpY2Ugc2hvdWxkbid0IGJlIHVzZWQgd2l0aCBlbWJlZGVkLCBzbyBpdCBkb2Vzbid0IG1hdHRlcgorICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlcnZpY2UuaW5pdGlhbGl6ZS5pbml0aWFsaXplZCIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CisKKyAgICAgICAgaWYoIG9uYW1lPT1udWxsICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBIYWNrIC0gU2VydmVyIHNob3VsZCBiZSBkZXByZWNhdGVkLi4uCisgICAgICAgICAgICAgICAgQ29udGFpbmVyIGVuZ2luZT10aGlzLmdldENvbnRhaW5lcigpOworICAgICAgICAgICAgICAgIGRvbWFpbj1lbmdpbmUuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIG9uYW1lPW5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1TZXJ2aWNlLHNlcnZpY2VOYW1lPSIrbmFtZSk7CisgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyPW9uYW1lOworICAgICAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlckNvbXBvbmVudCh0aGlzLCBvbmFtZSwgbnVsbCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2VydmljZS5yZWdpc3Rlci5mYWlsZWQiLGRvbWFpbiksZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGlmKCBzZXJ2ZXI9PW51bGwgKSB7CisgICAgICAgICAgICAvLyBSZWdpc3RlciB3aXRoIHRoZSBzZXJ2ZXIgCisgICAgICAgICAgICAvLyBIQUNLOiBTZXJ2ZXJGYWN0b3J5IHNob3VsZCBiZSByZW1vdmVkLi4uCisgICAgICAgICAgICAKKyAgICAgICAgICAgIFNlcnZlckZhY3RvcnkuZ2V0U2VydmVyKCkuYWRkU2VydmljZSh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgCisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBvdXIgZGVmaW5lZCBDb25uZWN0b3JzCisgICAgICAgIHN5bmNocm9uaXplZCAoY29ubmVjdG9ycykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29ubmVjdG9ycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JzW2ldLmluaXRpYWxpemUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICBpZiggc3RhcnRlZCApIHN0b3AoKTsKKyAgICAgICAgLy8gRklYTUUgdW5yZWdpc3RlciBzaG91bGQgYmUgaGVyZSBwcm9iYWJseSAtLSBzdG9wIGRvaW5nIHRoYXQgPworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbml0aWFsaXplKCk7CisgICAgICAgIH0gY2F0Y2goIFRocm93YWJsZSB0ICkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXJ2aWNlLmluaXRpYWxpemUuZmFpbGVkIixkb21haW4pLHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyB0eXBlOworICAgIHByb3RlY3RlZCBTdHJpbmcgZG9tYWluOworICAgIHByb3RlY3RlZCBTdHJpbmcgc3VmZml4OworICAgIHByb3RlY3RlZCBPYmplY3ROYW1lIG9uYW1lOworICAgIHByb3RlY3RlZCBPYmplY3ROYW1lIGNvbnRyb2xsZXI7CisgICAgcHJvdGVjdGVkIE1CZWFuU2VydmVyIG1zZXJ2ZXI7CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBnZXRPYmplY3ROYW1lKCkgeworICAgICAgICByZXR1cm4gb25hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREb21haW4oKSB7CisgICAgICAgIHJldHVybiBkb21haW47CisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWUgcHJlUmVnaXN0ZXIoTUJlYW5TZXJ2ZXIgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG9uYW1lPW5hbWU7CisgICAgICAgIG1zZXJ2ZXI9c2VydmVyOworICAgICAgICBkb21haW49bmFtZS5nZXREb21haW4oKTsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9zdFJlZ2lzdGVyKEJvb2xlYW4gcmVnaXN0cmF0aW9uRG9uZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByZURlcmVnaXN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3N0RGVyZWdpc3RlcigpIHsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkV3JhcHBlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIyYzU4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMTg2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmU7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2luZ2xlVGhyZWFkTW9kZWw7CitpbXBvcnQgamF2YXguc2VydmxldC5VbmF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkxpc3RlbmVyTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbk5vdGlmaWNhdGlvbkluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25Ccm9hZGNhc3RlclN1cHBvcnQ7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25FbWl0dGVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uRmlsdGVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXJTZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkluc3RhbmNlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5JbnN0YW5jZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuV3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlY3VyaXR5LlNlY3VyaXR5VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuRW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuSW5zdGFuY2VTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuSW50cm9zcGVjdGlvblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwubG9nLlN5c3RlbUxvZ0hhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CisKKy8qKgorICogU3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxiPldyYXBwZXI8L2I+IGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMKKyAqIGFuIGluZGl2aWR1YWwgc2VydmxldCBkZWZpbml0aW9uLiAgTm8gY2hpbGQgQ29udGFpbmVycyBhcmUgYWxsb3dlZCwgYW5kCisgKiB0aGUgcGFyZW50IENvbnRhaW5lciBtdXN0IGJlIGEgQ29udGV4dC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFdyYXBwZXIKKyAgICBleHRlbmRzIENvbnRhaW5lckJhc2UKKyAgICBpbXBsZW1lbnRzIFNlcnZsZXRDb25maWcsIFdyYXBwZXIsIE5vdGlmaWNhdGlvbkVtaXR0ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFN0YW5kYXJkV3JhcHBlci5jbGFzcyApOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9TRVJWTEVUX01FVEhPRFMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRVQiLCAiSEVBRCIsICJQT1NUIiB9OworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBTdGFuZGFyZFdyYXBwZXIgY29tcG9uZW50IHdpdGggdGhlIGRlZmF1bHQgYmFzaWMgVmFsdmUuCisgICAgICovCisgICAgcHVibGljIFN0YW5kYXJkV3JhcHBlcigpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICBzd1ZhbHZlPW5ldyBTdGFuZGFyZFdyYXBwZXJWYWx2ZSgpOworICAgICAgICBwaXBlbGluZS5zZXRCYXNpYyhzd1ZhbHZlKTsKKyAgICAgICAgYnJvYWRjYXN0ZXIgPSBuZXcgTm90aWZpY2F0aW9uQnJvYWRjYXN0ZXJTdXBwb3J0KCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGlzIHNlcnZsZXQgd2lsbCBiZWNvbWUgYXZhaWxhYmxlIChpbgorICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2gpLCBvciB6ZXJvIGlmIHRoZSBzZXJ2bGV0IGlzIGF2YWlsYWJsZS4KKyAgICAgKiBJZiB0aGlzIHZhbHVlIGVxdWFscyBMb25nLk1BWF9WQUxVRSwgdGhlIHVuYXZhaWxhYmlsaXR5IG9mIHRoaXMKKyAgICAgKiBzZXJ2bGV0IGlzIGNvbnNpZGVyZWQgcGVybWFuZW50LgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBhdmFpbGFibGUgPSAwTDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgYnJvYWRjYXN0ZXIgdGhhdCBzZW5kcyBqMmVlIG5vdGlmaWNhdGlvbnMuIAorICAgICAqLworICAgIHByaXZhdGUgTm90aWZpY2F0aW9uQnJvYWRjYXN0ZXJTdXBwb3J0IGJyb2FkY2FzdGVyID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgY291bnQgb2YgYWxsb2NhdGlvbnMgdGhhdCBhcmUgY3VycmVudGx5IGFjdGl2ZSAoZXZlbiBpZiB0aGV5CisgICAgICogYXJlIGZvciB0aGUgc2FtZSBpbnN0YW5jZSwgYXMgd2lsbCBiZSB0cnVlIG9uIGEgbm9uLVNUTSBzZXJ2bGV0KS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBjb3VudEFsbG9jYXRlZCA9IDA7CisKKworICAgIC8qKgorICAgICAqIFRoZSBmYWNhZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd3JhcHBlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0YW5kYXJkV3JhcHBlckZhY2FkZSBmYWNhZGUgPQorICAgICAgICBuZXcgU3RhbmRhcmRXcmFwcGVyRmFjYWRlKHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gc3RyaW5nIGZvciB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFdyYXBwZXIvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIChzaW5nbGUpIGluaXRpYWxpemVkIGluc3RhbmNlIG9mIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZsZXQgaW5zdGFuY2UgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3VwcG9ydCBvYmplY3QgZm9yIG91ciBpbnN0YW5jZSBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnN0YW5jZVN1cHBvcnQgaW5zdGFuY2VTdXBwb3J0ID0gbmV3IEluc3RhbmNlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbnRleHQtcmVsYXRpdmUgVVJJIG9mIHRoZSBKU1AgZmlsZSBmb3IgdGhpcyBzZXJ2bGV0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGpzcEZpbGUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9hZC1vbi1zdGFydHVwIG9yZGVyIHZhbHVlIChuZWdhdGl2ZSB2YWx1ZSBtZWFucyBsb2FkIG9uCisgICAgICogZmlyc3QgY2FsbCkgZm9yIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBsb2FkT25TdGFydHVwID0gLTE7CisKKworICAgIC8qKgorICAgICAqIE1hcHBpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd3JhcHBlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdCBtYXBwaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoaXMgc2VydmxldCwga2V5ZWQgYnkKKyAgICAgKiBwYXJhbWV0ZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXMgZm9yIHRoaXMgc2VydmxldCwga2V5ZWQgYnkgcm9sZSBuYW1lCisgICAgICogdXNlZCBpbiB0aGUgc2VydmxldC4gIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIHRoZSByb2xlIG5hbWUgb2YKKyAgICAgKiB0aGUgd2ViIGFwcGxpY2F0aW9uIGl0c2VsZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgcmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBydW4tYXMgaWRlbnRpdHkgZm9yIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBydW5BcyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbm90aWZpY2F0aW9uIHNlcXVlbmNlIG51bWJlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgc2VxdWVuY2VOdW1iZXIgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGZ1bGx5IHF1YWxpZmllZCBzZXJ2bGV0IGNsYXNzIG5hbWUgZm9yIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2bGV0Q2xhc3MgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoaXMgc2VydmxldCBpbXBsZW1lbnQgdGhlIFNpbmdsZVRocmVhZE1vZGVsIGludGVyZmFjZT8KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2luZ2xlVGhyZWFkTW9kZWwgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogQXJlIHdlIHVubG9hZGluZyBvdXIgc2VydmxldCBpbnN0YW5jZSBhdCB0aGUgbW9tZW50PworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB1bmxvYWRpbmcgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogTWF4aW11bSBudW1iZXIgb2YgU1RNIGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtYXhJbnN0YW5jZXMgPSAyMDsKKworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGluc3RhbmNlcyBjdXJyZW50bHkgbG9hZGVkIGZvciBhIFNUTSBzZXJ2bGV0LgorICAgICAqLworICAgIHByaXZhdGUgaW50IG5JbnN0YW5jZXMgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBTdGFjayBjb250YWluaW5nIHRoZSBTVE0gaW5zdGFuY2VzLgorICAgICAqLworICAgIHByaXZhdGUgU3RhY2sgaW5zdGFuY2VQb29sID0gbnVsbDsKKworICAgIAorICAgIC8qKgorICAgICAqIFdhaXQgdGltZSBmb3Igc2VydmxldCB1bmxvYWQgaW4gbXMuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHVubG9hZERlbGF5ID0gMjAwMDsKKyAgICAKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBTdGFuZGFyZFdyYXBwZXIgaXMgZm9yIHRoZSBKc3BTZXJ2bGV0CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzSnNwU2VydmxldDsKKworCisgICAgLyoqCisgICAgICogVGhlIE9iamVjdE5hbWUgb2YgdGhlIEpTUCBtb25pdG9yaW5nIG1iZWFuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3ROYW1lIGpzcE1vbml0b3JPTjsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIHN3YWxsb3cgU3lzdGVtLm91dAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzd2FsbG93T3V0cHV0ID0gZmFsc2U7CisKKyAgICAvLyBUbyBzdXBwb3J0IGpteCBhdHRyaWJ1dGVzCisgICAgcHJpdmF0ZSBTdGFuZGFyZFdyYXBwZXJWYWx2ZSBzd1ZhbHZlOworICAgIHByaXZhdGUgbG9uZyBsb2FkVGltZT0wOworICAgIHByaXZhdGUgaW50IGNsYXNzTG9hZFRpbWU9MDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTdGF0aWMgY2xhc3MgYXJyYXkgdXNlZCB3aGVuIHRoZSBTZWN1cml0eU1hbmFnZXIgaXMgdHVybmVkIG9uIGFuZCAKKyAgICAgKiA8Y29kZT5TZXJ2bGV0LmluaXQ8L2NvZGU+IGlzIGludm9rZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSBjbGFzc1R5cGUgPSBuZXcgQ2xhc3NbXXtTZXJ2bGV0Q29uZmlnLmNsYXNzfTsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTdGF0aWMgY2xhc3MgYXJyYXkgdXNlZCB3aGVuIHRoZSBTZWN1cml0eU1hbmFnZXIgaXMgdHVybmVkIG9uIGFuZCAKKyAgICAgKiA8Y29kZT5TZXJ2bGV0LnNlcnZpY2U8L2NvZGU+ICBpcyBpbnZva2VkLgorICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzc1tdIGNsYXNzVHlwZVVzZWRJblNlcnZpY2UgPSBuZXcgQ2xhc3NbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXF1ZXN0LmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlc3BvbnNlLmNsYXNzfTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBqc3BFeGNlcHRpb25DbGF6ejsKKyAgICAKKyAgICBzdGF0aWMgeworICAgICAgICB0cnkgeworICAgICAgICAgICAganNwRXhjZXB0aW9uQ2xhenogPSBDbGFzcy5mb3JOYW1lKCJqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBFeHBlY3RlZCBpZiBqc3AtYXBpIG5vdCBvbiBjbGFzc3BhdGgsIGVnIHdoZW4gZW1iZWRkaW5nCisgICAgICAgICAgICBqc3BFeGNlcHRpb25DbGF6eiA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXZhaWxhYmxlIGRhdGUvdGltZSBmb3IgdGhpcyBzZXJ2bGV0LCBpbiBtaWxsaXNlY29uZHMgc2luY2UKKyAgICAgKiB0aGUgZXBvY2guICBJZiB0aGlzIGRhdGUvdGltZSBpcyBMb25nLk1BWF9WQUxVRSwgaXQgaXMgY29uc2lkZXJlZCB0byBtZWFuCisgICAgICogdGhhdCB1bmF2YWlsYWJpbGl0eSBpcyBwZXJtYW5lbnQgYW5kIGFueSByZXF1ZXN0IGZvciB0aGlzIHNlcnZsZXQgd2lsbCByZXR1cm4KKyAgICAgKiBhbiBTQ19OT1RfRk9VTkQgZXJyb3IuICBJZiB0aGlzIGRhdGUvdGltZSBpcyBpbiB0aGUgZnV0dXJlLCBhbnkgcmVxdWVzdCBmb3IKKyAgICAgKiB0aGlzIHNlcnZsZXQgd2lsbCByZXR1cm4gYW4gU0NfU0VSVklDRV9VTkFWQUlMQUJMRSBlcnJvci4gIElmIGl0IGlzIHplcm8sCisgICAgICogdGhlIHNlcnZsZXQgaXMgY3VycmVudGx5IGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRBdmFpbGFibGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmF2YWlsYWJsZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXZhaWxhYmxlIGRhdGUvdGltZSBmb3IgdGhpcyBzZXJ2bGV0LCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlCisgICAgICogZXBvY2guICBJZiB0aGlzIGRhdGUvdGltZSBpcyBMb25nLk1BWF9WQUxVRSwgaXQgaXMgY29uc2lkZXJlZCB0byBtZWFuCisgICAgICogdGhhdCB1bmF2YWlsYWJpbGl0eSBpcyBwZXJtYW5lbnQgYW5kIGFueSByZXF1ZXN0IGZvciB0aGlzIHNlcnZsZXQgd2lsbCByZXR1cm4KKyAgICAgKiBhbiBTQ19OT1RfRk9VTkQgZXJyb3IuIElmIHRoaXMgZGF0ZS90aW1lIGlzIGluIHRoZSBmdXR1cmUsIGFueSByZXF1ZXN0IGZvcgorICAgICAqIHRoaXMgc2VydmxldCB3aWxsIHJldHVybiBhbiBTQ19TRVJWSUNFX1VOQVZBSUxBQkxFIGVycm9yLgorICAgICAqCisgICAgICogQHBhcmFtIGF2YWlsYWJsZSBUaGUgbmV3IGF2YWlsYWJsZSBkYXRlL3RpbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGUobG9uZyBhdmFpbGFibGUpIHsKKworICAgICAgICBsb25nIG9sZEF2YWlsYWJsZSA9IHRoaXMuYXZhaWxhYmxlOworICAgICAgICBpZiAoYXZhaWxhYmxlID4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpCisgICAgICAgICAgICB0aGlzLmF2YWlsYWJsZSA9IGF2YWlsYWJsZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy5hdmFpbGFibGUgPSAwTDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImF2YWlsYWJsZSIsIG5ldyBMb25nKG9sZEF2YWlsYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKHRoaXMuYXZhaWxhYmxlKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBhbGxvY2F0aW9ucyBvZiB0aGlzIHNlcnZsZXQsIGV2ZW4gaWYgdGhleQorICAgICAqIGFyZSBhbGwgZm9yIHRoZSBzYW1lIGluc3RhbmNlIChhcyB3aWxsIGJlIHRydWUgZm9yIHNlcnZsZXRzIHRoYXQgZG8KKyAgICAgKiBub3QgaW1wbGVtZW50IDxjb2RlPlNpbmdsZVRocmVhZE1vZGVsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvdW50QWxsb2NhdGVkKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jb3VudEFsbG9jYXRlZCk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5naW5lTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICgoU3RhbmRhcmRDb250ZXh0KWdldFBhcmVudCgpKS5nZXRFbmdpbmVOYW1lKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBDb250YWluZXIgaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSW5zdGFuY2VTdXBwb3J0IG9iamVjdCBmb3IgdGhpcyBXcmFwcGVyIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBJbnN0YW5jZVN1cHBvcnQgZ2V0SW5zdGFuY2VTdXBwb3J0KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5pbnN0YW5jZVN1cHBvcnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbnRleHQtcmVsYXRpdmUgVVJJIG9mIHRoZSBKU1AgZmlsZSBmb3IgdGhpcyBzZXJ2bGV0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SnNwRmlsZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuanNwRmlsZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29udGV4dC1yZWxhdGl2ZSBVUkkgb2YgdGhlIEpTUCBmaWxlIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ganNwRmlsZSBKU1AgZmlsZSBVUkkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKc3BGaWxlKFN0cmluZyBqc3BGaWxlKSB7CisKKyAgICAgICAgU3RyaW5nIG9sZEpzcEZpbGUgPSB0aGlzLmpzcEZpbGU7CisgICAgICAgIHRoaXMuanNwRmlsZSA9IGpzcEZpbGU7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJqc3BGaWxlIiwgb2xkSnNwRmlsZSwgdGhpcy5qc3BGaWxlKTsKKworICAgICAgICAvLyBFYWNoIGpzcC1maWxlIG5lZWRzIHRvIGJlIHJlcHJlc2VudGVkIGJ5IGl0cyBvd24gSnNwU2VydmxldCBhbmQKKyAgICAgICAgLy8gY29ycmVzcG9uZGluZyBKc3BNb25pdG9yaW5nIG1iZWFuLCBiZWNhdXNlIGl0IG1heSBiZSBpbml0aWFsaXplZAorICAgICAgICAvLyB3aXRoIGl0cyBvd24gaW5pdCBwYXJhbXMKKyAgICAgICAgaXNKc3BTZXJ2bGV0ID0gdHJ1ZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2FkLW9uLXN0YXJ0dXAgb3JkZXIgdmFsdWUgKG5lZ2F0aXZlIHZhbHVlIG1lYW5zCisgICAgICogbG9hZCBvbiBmaXJzdCBjYWxsKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExvYWRPblN0YXJ0dXAoKSB7CisKKyAgICAgICAgaWYgKGlzSnNwU2VydmxldCAmJiBsb2FkT25TdGFydHVwIDwgMCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEpzcFNlcnZsZXQgbXVzdCBhbHdheXMgYmUgcHJlbG9hZGVkLCBiZWNhdXNlIGl0cyBpbnN0YW5jZSBpcworICAgICAgICAgICAgICogdXNlZCBkdXJpbmcgcmVnaXN0ZXJKTVggKHdoZW4gcmVnaXN0ZXJpbmcgdGhlIEpTUAorICAgICAgICAgICAgICogbW9uaXRvcmluZyBtYmVhbikKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAodGhpcy5sb2FkT25TdGFydHVwKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2FkLW9uLXN0YXJ0dXAgb3JkZXIgdmFsdWUgKG5lZ2F0aXZlIHZhbHVlIG1lYW5zCisgICAgICogbG9hZCBvbiBmaXJzdCBjYWxsKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBOZXcgbG9hZC1vbi1zdGFydHVwIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9hZE9uU3RhcnR1cChpbnQgdmFsdWUpIHsKKworICAgICAgICBpbnQgb2xkTG9hZE9uU3RhcnR1cCA9IHRoaXMubG9hZE9uU3RhcnR1cDsKKyAgICAgICAgdGhpcy5sb2FkT25TdGFydHVwID0gdmFsdWU7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJsb2FkT25TdGFydHVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIob2xkTG9hZE9uU3RhcnR1cCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKHRoaXMubG9hZE9uU3RhcnR1cCkpOworCisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9hZC1vbi1zdGFydHVwIG9yZGVyIHZhbHVlIGZyb20gYSAocG9zc2libHkgbnVsbCkgc3RyaW5nLgorICAgICAqIFBlciB0aGUgc3BlY2lmaWNhdGlvbiwgYW55IG1pc3Npbmcgb3Igbm9uLW51bWVyaWMgdmFsdWUgaXMgY29udmVydGVkCisgICAgICogdG8gYSB6ZXJvLCBzbyB0aGF0IHRoaXMgc2VydmxldCB3aWxsIHN0aWxsIGJlIGxvYWRlZCBhdCBzdGFydHVwCisgICAgICogdGltZSwgYnV0IGluIGFuIGFyYml0cmFyeSBvcmRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBOZXcgbG9hZC1vbi1zdGFydHVwIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9hZE9uU3RhcnR1cFN0cmluZyhTdHJpbmcgdmFsdWUpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0TG9hZE9uU3RhcnR1cChJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzZXRMb2FkT25TdGFydHVwKDApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMb2FkT25TdGFydHVwU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyggZ2V0TG9hZE9uU3RhcnR1cCgpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBtYXhpbXVtIG51bWJlciBvZiBpbnN0YW5jZXMgdGhhdCB3aWxsIGJlIGFsbG9jYXRlZCB3aGVuIGEgc2luZ2xlCisgICAgICogdGhyZWFkIG1vZGVsIHNlcnZsZXQgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1heEluc3RhbmNlcygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMubWF4SW5zdGFuY2VzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnN0YW5jZXMgdGhhdCB3aWxsIGJlIGFsbG9jYXRlZCB3aGVuIGEgc2luZ2xlCisgICAgICogdGhyZWFkIG1vZGVsIHNlcnZsZXQgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXhJbnN0YW5jZXMgTmV3IHZhbHVlIG9mIG1heEluc3RhbmNlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heEluc3RhbmNlcyhpbnQgbWF4SW5zdGFuY2VzKSB7CisKKyAgICAgICAgaW50IG9sZE1heEluc3RhbmNlcyA9IHRoaXMubWF4SW5zdGFuY2VzOworICAgICAgICB0aGlzLm1heEluc3RhbmNlcyA9IG1heEluc3RhbmNlczsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm1heEluc3RhbmNlcyIsIG9sZE1heEluc3RhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhJbnN0YW5jZXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhcmVudCBDb250YWluZXIgb2YgdGhpcyBXcmFwcGVyLCBidXQgb25seSBpZiBpdCBpcyBhIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFByb3Bvc2VkIHBhcmVudCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoQ29udGFpbmVyIGNvbnRhaW5lcikgeworCisgICAgICAgIGlmICgoY29udGFpbmVyICE9IG51bGwpICYmCisgICAgICAgICAgICAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5ub3RDb250ZXh0IikpOworICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KSB7CisgICAgICAgICAgICBzd2FsbG93T3V0cHV0ID0gKChTdGFuZGFyZENvbnRleHQpY29udGFpbmVyKS5nZXRTd2FsbG93T3V0cHV0KCk7CisgICAgICAgICAgICB1bmxvYWREZWxheSA9ICgoU3RhbmRhcmRDb250ZXh0KWNvbnRhaW5lcikuZ2V0VW5sb2FkRGVsYXkoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRQYXJlbnQoY29udGFpbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBydW4tYXMgaWRlbnRpdHkgZm9yIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJ1bkFzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5ydW5Bcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcnVuLWFzIGlkZW50aXR5IGZvciB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcnVuQXMgTmV3IHJ1bi1hcyBpZGVudGl0eSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJ1bkFzKFN0cmluZyBydW5BcykgeworCisgICAgICAgIFN0cmluZyBvbGRSdW5BcyA9IHRoaXMucnVuQXM7CisgICAgICAgIHRoaXMucnVuQXMgPSBydW5BczsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInJ1bkFzIiwgb2xkUnVuQXMsIHRoaXMucnVuQXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBzZXJ2bGV0IGNsYXNzIG5hbWUgZm9yIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRDbGFzcygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuc2VydmxldENsYXNzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmdWxseSBxdWFsaWZpZWQgc2VydmxldCBjbGFzcyBuYW1lIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmxldENsYXNzIFNlcnZsZXQgY2xhc3MgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZsZXRDbGFzcyhTdHJpbmcgc2VydmxldENsYXNzKSB7CisKKyAgICAgICAgU3RyaW5nIG9sZFNlcnZsZXRDbGFzcyA9IHRoaXMuc2VydmxldENsYXNzOworICAgICAgICB0aGlzLnNlcnZsZXRDbGFzcyA9IHNlcnZsZXRDbGFzczsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInNlcnZsZXRDbGFzcyIsIG9sZFNlcnZsZXRDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2bGV0Q2xhc3MpOworICAgICAgICBpZiAoQ29uc3RhbnRzLkpTUF9TRVJWTEVUX0NMQVNTLmVxdWFscyhzZXJ2bGV0Q2xhc3MpKSB7CisgICAgICAgICAgICBpc0pzcFNlcnZsZXQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGlzIHNlcnZsZXQuICBUaGlzIGlzIGFuIGFsaWFzIGZvciB0aGUgbm9ybWFsCisgICAgICogPGNvZGU+Q29udGFpbmVyLnNldE5hbWUoKTwvY29kZT4gbWV0aG9kLCBhbmQgY29tcGxlbWVudHMgdGhlCisgICAgICogPGNvZGU+Z2V0U2VydmxldE5hbWUoKTwvY29kZT4gbWV0aG9kIHJlcXVpcmVkIGJ5IHRoZQorICAgICAqIDxjb2RlPlNlcnZsZXRDb25maWc8L2NvZGU+IGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgbmFtZSBvZiB0aGlzIHNlcnZsZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2bGV0TmFtZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHNldE5hbWUobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmxldCBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzCisgICAgICogY29tcG9uZW50IGltcGxlbWVudHMgdGhlIDxjb2RlPlNpbmdsZVRocmVhZE1vZGVsPC9jb2RlPiBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTaW5nbGVUaHJlYWRNb2RlbCgpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9hZFNlcnZsZXQoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHNpbmdsZVRocmVhZE1vZGVsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSXMgdGhpcyBzZXJ2bGV0IGN1cnJlbnRseSB1bmF2YWlsYWJsZT8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VuYXZhaWxhYmxlKCkgeworCisgICAgICAgIGlmIChhdmFpbGFibGUgPT0gMEwpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgZWxzZSBpZiAoYXZhaWxhYmxlIDw9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSB7CisgICAgICAgICAgICBhdmFpbGFibGUgPSAwTDsKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5hbWVzIG9mIHRoZSBtZXRob2RzIHN1cHBvcnRlZCBieSB0aGUgdW5kZXJseWluZyBzZXJ2bGV0LgorICAgICAqCisgICAgICogVGhpcyBpcyB0aGUgc2FtZSBzZXQgb2YgbWV0aG9kcyBpbmNsdWRlZCBpbiB0aGUgQWxsb3cgcmVzcG9uc2UgaGVhZGVyCisgICAgICogaW4gcmVzcG9uc2UgdG8gYW4gT1BUSU9OUyByZXF1ZXN0IG1ldGhvZCBwcm9jZXNzZWQgYnkgdGhlIHVuZGVybHlpbmcKKyAgICAgKiBzZXJ2bGV0LgorICAgICAqCisgICAgICogQHJldHVybiBBcnJheSBvZiBuYW1lcyBvZiB0aGUgbWV0aG9kcyBzdXBwb3J0ZWQgYnkgdGhlIHVuZGVybHlpbmcKKyAgICAgKiBzZXJ2bGV0CisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFNlcnZsZXRNZXRob2RzKCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIENsYXNzIHNlcnZsZXRDbGF6eiA9IGxvYWRTZXJ2bGV0KCkuZ2V0Q2xhc3MoKTsKKyAgICAgICAgaWYgKCFqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldENsYXp6KSkgeworICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfU0VSVkxFVF9NRVRIT0RTOworICAgICAgICB9CisKKyAgICAgICAgSGFzaFNldCBhbGxvdyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIGFsbG93LmFkZCgiVFJBQ0UiKTsKKyAgICAgICAgYWxsb3cuYWRkKCJPUFRJT05TIik7CisJCisgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBnZXRBbGxEZWNsYXJlZE1ldGhvZHMoc2VydmxldENsYXp6KTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBtZXRob2RzICE9IG51bGwgJiYgaTxtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBNZXRob2QgbSA9IG1ldGhvZHNbaV07CisJICAgIAorICAgICAgICAgICAgaWYgKG0uZ2V0TmFtZSgpLmVxdWFscygiZG9HZXQiKSkgeworICAgICAgICAgICAgICAgIGFsbG93LmFkZCgiR0VUIik7CisgICAgICAgICAgICAgICAgYWxsb3cuYWRkKCJIRUFEIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG0uZ2V0TmFtZSgpLmVxdWFscygiZG9Qb3N0IikpIHsKKyAgICAgICAgICAgICAgICBhbGxvdy5hZGQoIlBPU1QiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobS5nZXROYW1lKCkuZXF1YWxzKCJkb1B1dCIpKSB7CisgICAgICAgICAgICAgICAgYWxsb3cuYWRkKCJQVVQiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobS5nZXROYW1lKCkuZXF1YWxzKCJkb0RlbGV0ZSIpKSB7CisgICAgICAgICAgICAgICAgYWxsb3cuYWRkKCJERUxFVEUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ1tdIG1ldGhvZE5hbWVzID0gbmV3IFN0cmluZ1thbGxvdy5zaXplKCldOworICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBhbGxvdy50b0FycmF5KG1ldGhvZE5hbWVzKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEV4dHJhY3QgdGhlIHJvb3QgY2F1c2UgZnJvbSBhIHNlcnZsZXQgZXhjZXB0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlIFRoZSBzZXJ2bGV0IGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVGhyb3dhYmxlIGdldFJvb3RDYXVzZShTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgVGhyb3dhYmxlIHJvb3RDYXVzZSA9IGUuZ2V0Um9vdENhdXNlKCk7CisgICAgICAgIHJldHVybiBmaW5kUm9vdENhdXNlKGUsIHJvb3RDYXVzZSk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFdvcmsgdGhyb3VnaCB0aGUgcm9vdCBjYXVzZXMgdXNpbmcgc3BlY2lmaWMgbWV0aG9kcyBmb3Igd2VsbCBrbm93biB0eXBlcworICAgICAqIGFuZCBnZXRDYXVzZSgpIGZvciB0aGUgcmVzdC4gU3RvcCB3aGVuIHRoZSBuZXh0IHJvb3RDYXVzZSBpcyBudWxsIG9yCisgICAgICogYW4gZXhjZXB0aW9uIGlzIGZvdW5kIHRoYXQgaGFzIGl0c2VsZiBhcyBpdHMgb3duIHJvb3RDYXVzZS4gCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyb3dhYmxlIGZpbmRSb290Q2F1c2UoVGhyb3dhYmxlIHRoZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFRocm93YWJsZSB0aGVSb290Q2F1c2UpIHsKKyAgICAgICAgCisgICAgICAgIFRocm93YWJsZSBkZWVwZXJSb290Q2F1c2UgPSBudWxsOworCisgICAgICAgIGlmICh0aGVSb290Q2F1c2UgPT0gbnVsbCB8fCB0aGVSb290Q2F1c2UgPT0gdGhlRXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gdGhlRXhjZXB0aW9uOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAodGhlUm9vdENhdXNlIGluc3RhbmNlb2YgU2VydmxldEV4Y2VwdGlvbikgeworICAgICAgICAgICAgZGVlcGVyUm9vdENhdXNlID0gKChTZXJ2bGV0RXhjZXB0aW9uKSB0aGVSb290Q2F1c2UpLmdldFJvb3RDYXVzZSgpOworICAgICAgICB9IGVsc2UgaWYgKGpzcEV4Y2VwdGlvbkNsYXp6IT1udWxsICYmCisgICAgICAgICAgICAgICAganNwRXhjZXB0aW9uQ2xhenouaXNBc3NpZ25hYmxlRnJvbSh0aGVSb290Q2F1c2UuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgIGRlZXBlclJvb3RDYXVzZSA9IChUaHJvd2FibGUpSW50cm9zcGVjdGlvblV0aWxzLmdldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICB0aGVSb290Q2F1c2UsICJyb290Q2F1c2UiKTsgCisgICAgICAgIH0gZWxzZSBpZiAodGhlUm9vdENhdXNlIGluc3RhbmNlb2YgU1FMRXhjZXB0aW9uKSB7CisgICAgICAgICAgICBkZWVwZXJSb290Q2F1c2UgPSAoKFNRTEV4Y2VwdGlvbikgdGhlUm9vdENhdXNlKS5nZXROZXh0RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlZXBlclJvb3RDYXVzZSA9PSBudWxsKSB7CisgICAgICAgICAgICBkZWVwZXJSb290Q2F1c2UgPSB0aGVSb290Q2F1c2UuZ2V0Q2F1c2UoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGZpbmRSb290Q2F1c2UodGhlUm9vdENhdXNlLCBkZWVwZXJSb290Q2F1c2UpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVmdXNlIHRvIGFkZCBhIGNoaWxkIENvbnRhaW5lciwgYmVjYXVzZSBXcmFwcGVycyBhcmUgdGhlIGxvd2VzdCBsZXZlbAorICAgICAqIG9mIHRoZSBDb250YWluZXIgaGllcmFyY2h5LgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkIENoaWxkIGNvbnRhaW5lciB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKENvbnRhaW5lciBjaGlsZCkgeworCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5ub3RDaGlsZCIpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHNlcnZsZXQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoaXMgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHRvIGFkZAorICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvZiB0aGlzIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRJbml0UGFyYW1ldGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFkZEluaXRQYXJhbWV0ZXIiLCBuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGxpc3RlbmVyIGludGVyZXN0ZWQgaW4gSW5zdGFuY2VFdmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIG5ldyBsaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEluc3RhbmNlTGlzdGVuZXIoSW5zdGFuY2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGluc3RhbmNlU3VwcG9ydC5hZGRJbnN0YW5jZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbWFwcGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIFdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbmV3IHdyYXBwZXIgbWFwcGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIG1hcHBpbmcpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcHBpbmdzKSB7CisgICAgICAgICAgICBtYXBwaW5ncy5hZGQobWFwcGluZyk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRNYXBwaW5nIiwgbWFwcGluZyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSByZWNvcmQgdG8gdGhlIHNldCBvZiByZWNvcmRzIGZvcgorICAgICAqIHRoaXMgc2VydmxldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFJvbGUgbmFtZSB1c2VkIHdpdGhpbiB0aGlzIHNlcnZsZXQKKyAgICAgKiBAcGFyYW0gbGluayBSb2xlIG5hbWUgdXNlZCB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNlY3VyaXR5UmVmZXJlbmNlKFN0cmluZyBuYW1lLCBTdHJpbmcgbGluaykgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocmVmZXJlbmNlcykgeworICAgICAgICAgICAgcmVmZXJlbmNlcy5wdXQobmFtZSwgbGluayk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRTZWN1cml0eVJlZmVyZW5jZSIsIG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhbiBpbml0aWFsaXplZCBpbnN0YW5jZSBvZiB0aGlzIFNlcnZsZXQgdGhhdCBpcyByZWFkeSB0byBoYXZlCisgICAgICogaXRzIDxjb2RlPnNlcnZpY2UoKTwvY29kZT4gbWV0aG9kIGNhbGxlZC4gIElmIHRoZSBzZXJ2bGV0IGNsYXNzIGRvZXMKKyAgICAgKiBub3QgaW1wbGVtZW50IDxjb2RlPlNpbmdsZVRocmVhZE1vZGVsPC9jb2RlPiwgdGhlIChvbmx5KSBpbml0aWFsaXplZAorICAgICAqIGluc3RhbmNlIG1heSBiZSByZXR1cm5lZCBpbW1lZGlhdGVseS4gIElmIHRoZSBzZXJ2bGV0IGNsYXNzIGltcGxlbWVudHMKKyAgICAgKiA8Y29kZT5TaW5nbGVUaHJlYWRNb2RlbDwvY29kZT4sIHRoZSBXcmFwcGVyIGltcGxlbWVudGF0aW9uIG11c3QgZW5zdXJlCisgICAgICogdGhhdCB0aGlzIGluc3RhbmNlIGlzIG5vdCBhbGxvY2F0ZWQgYWdhaW4gdW50aWwgaXQgaXMgZGVhbGxvY2F0ZWQgYnkgYQorICAgICAqIGNhbGwgdG8gPGNvZGU+ZGVhbGxvY2F0ZSgpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiB0aGUgc2VydmxldCBpbml0KCkgbWV0aG9kIHRocmV3CisgICAgICogIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIGxvYWRpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXQgYWxsb2NhdGUoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSB1bmxvYWRpbmcgdGhpcyBzZXJ2bGV0LCB0aHJvdyBhbiBleGNlcHRpb24KKyAgICAgICAgaWYgKHVubG9hZGluZykKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci51bmxvYWRpbmciLCBnZXROYW1lKCkpKTsKKworICAgICAgICAvLyBJZiBub3QgU2luZ2xlVGhyZWFkZWRNb2RlbCwgcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlIGV2ZXJ5IHRpbWUKKyAgICAgICAgaWYgKCFzaW5nbGVUaHJlYWRNb2RlbCkgeworCisgICAgICAgICAgICAvLyBMb2FkIGFuZCBpbml0aWFsaXplIG91ciBpbnN0YW5jZSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBbGxvY2F0aW5nIG5vbi1TVE0gaW5zdGFuY2UiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlID0gbG9hZFNlcnZsZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlcnZsZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5hbGxvY2F0ZSIpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzaW5nbGVUaHJlYWRNb2RlbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCIgIFJldHVybmluZyBub24tU1RNIGluc3RhbmNlIik7CisgICAgICAgICAgICAgICAgY291bnRBbGxvY2F0ZWQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGluc3RhbmNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChpbnN0YW5jZVBvb2wpIHsKKworICAgICAgICAgICAgd2hpbGUgKGNvdW50QWxsb2NhdGVkID49IG5JbnN0YW5jZXMpIHsKKyAgICAgICAgICAgICAgICAvLyBBbGxvY2F0ZSBhIG5ldyBpbnN0YW5jZSBpZiBwb3NzaWJsZSwgb3IgZWxzZSB3YWl0CisgICAgICAgICAgICAgICAgaWYgKG5JbnN0YW5jZXMgPCBtYXhJbnN0YW5jZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUG9vbC5wdXNoKGxvYWRTZXJ2bGV0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbkluc3RhbmNlcysrOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5hbGxvY2F0ZSIpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBvb2wud2FpdCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCIgIFJldHVybmluZyBhbGxvY2F0ZWQgU1RNIGluc3RhbmNlIik7CisgICAgICAgICAgICBjb3VudEFsbG9jYXRlZCsrOworICAgICAgICAgICAgcmV0dXJuIChTZXJ2bGV0KSBpbnN0YW5jZVBvb2wucG9wKCk7CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhpcyBwcmV2aW91c2x5IGFsbG9jYXRlZCBzZXJ2bGV0IHRvIHRoZSBwb29sIG9mIGF2YWlsYWJsZQorICAgICAqIGluc3RhbmNlcy4gIElmIHRoaXMgc2VydmxldCBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQgU2luZ2xlVGhyZWFkTW9kZWwsCisgICAgICogbm8gYWN0aW9uIGlzIGFjdHVhbGx5IHJlcXVpcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZsZXQgVGhlIHNlcnZsZXQgdG8gYmUgcmV0dXJuZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIGRlYWxsb2NhdGlvbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWFsbG9jYXRlKFNlcnZsZXQgc2VydmxldCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIElmIG5vdCBTaW5nbGVUaHJlYWRNb2RlbCwgbm8gYWN0aW9uIGlzIHJlcXVpcmVkCisgICAgICAgIGlmICghc2luZ2xlVGhyZWFkTW9kZWwpIHsKKyAgICAgICAgICAgIGNvdW50QWxsb2NhdGVkLS07CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBVbmxvY2sgYW5kIGZyZWUgdGhpcyBpbnN0YW5jZQorICAgICAgICBzeW5jaHJvbml6ZWQgKGluc3RhbmNlUG9vbCkgeworICAgICAgICAgICAgY291bnRBbGxvY2F0ZWQtLTsKKyAgICAgICAgICAgIGluc3RhbmNlUG9vbC5wdXNoKHNlcnZsZXQpOworICAgICAgICAgICAgaW5zdGFuY2VQb29sLm5vdGlmeSgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIG5hbWUsCisgICAgICogaWYgYW55OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcmVxdWVzdGVkIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZmluZEluaXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFN0cmluZykgcGFyYW1ldGVycy5nZXQobmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIGRlZmluZWQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBmb3IgdGhpcworICAgICAqIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRJbml0UGFyYW1ldGVycygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW3BhcmFtZXRlcnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSBwYXJhbWV0ZXJzLmtleVNldCgpLnRvQXJyYXkocmVzdWx0cykpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWFwcGluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd3JhcHBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZE1hcHBpbmdzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobWFwcGluZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nW10pIG1hcHBpbmdzLnRvQXJyYXkobmV3IFN0cmluZ1ttYXBwaW5ncy5zaXplKCldKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlY3VyaXR5IHJvbGUgbGluayBmb3IgdGhlIHNwZWNpZmllZCBzZWN1cml0eSByb2xlCisgICAgICogcmVmZXJlbmNlIG5hbWUsIGlmIGFueTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIHVzZWQgd2l0aGluIHRoaXMgc2VydmxldAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZmluZFNlY3VyaXR5UmVmZXJlbmNlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChyZWZlcmVuY2VzKSB7CisgICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIHJlZmVyZW5jZXMuZ2V0KG5hbWUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBuYW1lcyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIHNlcnZsZXQsIGlmIGFueTsgb3RoZXJ3aXNlIHJldHVybiBhIHplcm8tbGVuZ3RoIGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kU2VjdXJpdHlSZWZlcmVuY2VzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocmVmZXJlbmNlcykgeworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9IG5ldyBTdHJpbmdbcmVmZXJlbmNlcy5zaXplKCldOworICAgICAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pIHJlZmVyZW5jZXMua2V5U2V0KCkudG9BcnJheShyZXN1bHRzKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRklYTUU6IEZvb2xpbmcgaW50cm9zcGVjdGlvbiAuLi4KKyAgICAgKi8KKyAgICBwdWJsaWMgV3JhcHBlciBmaW5kTWFwcGluZ09iamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIChXcmFwcGVyKSBnZXRNYXBwaW5nT2JqZWN0KCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2FkIGFuZCBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoaXMgc2VydmxldCwgaWYgdGhlcmUgaXMgbm90IGFscmVhZHkKKyAgICAgKiBhdCBsZWFzdCBvbmUgaW5pdGlhbGl6ZWQgaW5zdGFuY2UuICBUaGlzIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8KKyAgICAgKiBsb2FkIHNlcnZsZXRzIHRoYXQgYXJlIG1hcmtlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIGJlIGxvYWRlZAorICAgICAqIGF0IHNlcnZlciBzdGFydHVwIHRpbWUuCisgICAgICogPHA+CisgICAgICogPGI+SU1QTEVNRU5UQVRJT04gTk9URTwvYj46ICBTZXJ2bGV0cyB3aG9zZSBjbGFzc25hbWVzIGJlZ2luIHdpdGgKKyAgICAgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLjwvY29kZT4gKHNvLWNhbGxlZCAiY29udGFpbmVyIiBzZXJ2bGV0cykKKyAgICAgKiBhcmUgbG9hZGVkIGJ5IHRoZSBzYW1lIGNsYXNzbG9hZGVyIHRoYXQgbG9hZGVkIHRoaXMgY2xhc3MsIHJhdGhlciB0aGFuCisgICAgICogdGhlIGNsYXNzbG9hZGVyIGZvciB0aGUgY3VycmVudCB3ZWIgYXBwbGljYXRpb24uCisgICAgICogVGhpcyBnaXZlcyBzdWNoIGNsYXNzZXMgYWNjZXNzIHRvIENhdGFsaW5hIGludGVybmFscywgd2hpY2ggYXJlCisgICAgICogcHJldmVudGVkIGZvciBjbGFzc2VzIGxvYWRlZCBmb3Igd2ViIGFwcGxpY2F0aW9ucy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiB0aGUgc2VydmxldCBpbml0KCkgbWV0aG9kIHRocmV3CisgICAgICogIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBzb21lIG90aGVyIGxvYWRpbmcgcHJvYmxlbSBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbG9hZCgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgaW5zdGFuY2UgPSBsb2FkU2VydmxldCgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogTG9hZCBhbmQgaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIHNlcnZsZXQsIGlmIHRoZXJlIGlzIG5vdCBhbHJlYWR5CisgICAgICogYXQgbGVhc3Qgb25lIGluaXRpYWxpemVkIGluc3RhbmNlLiAgVGhpcyBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvCisgICAgICogbG9hZCBzZXJ2bGV0cyB0aGF0IGFyZSBtYXJrZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0byBiZSBsb2FkZWQKKyAgICAgKiBhdCBzZXJ2ZXIgc3RhcnR1cCB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2VydmxldCBsb2FkU2VydmxldCgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBpbnN0YW5jZSBvciBhbiBpbnN0YW5jZSBwb29sCisgICAgICAgIGlmICghc2luZ2xlVGhyZWFkTW9kZWwgJiYgKGluc3RhbmNlICE9IG51bGwpKQorICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOworCisgICAgICAgIFByaW50U3RyZWFtIG91dCA9IFN5c3RlbS5vdXQ7CisgICAgICAgIGlmIChzd2FsbG93T3V0cHV0KSB7CisgICAgICAgICAgICBTeXN0ZW1Mb2dIYW5kbGVyLnN0YXJ0Q2FwdHVyZSgpOworICAgICAgICB9CisKKyAgICAgICAgU2VydmxldCBzZXJ2bGV0OworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9uZyB0MT1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgInNlcnZsZXQiIGlzIHJlYWxseSBhIEpTUCBmaWxlLCBnZXQgdGhlIHJpZ2h0IGNsYXNzLgorICAgICAgICAgICAgLy8gSE9MRCBZT1VSIE5PU0UgLSB0aGlzIGlzIGEga2x1ZGdlIHRoYXQgYXZvaWRzIGhhdmluZyB0byBkbyBzcGVjaWFsCisgICAgICAgICAgICAvLyBjYXNlIENhdGFsaW5hLXNwZWNpZmljIGNvZGUgaW4gSmFzcGVyIC0gaXQgYWxzbyByZXF1aXJlcyB0aGF0IHRoZQorICAgICAgICAgICAgLy8gc2VydmxldCBwYXRoIGJlIHJlcGxhY2VkIGJ5IHRoZSA8anNwLWZpbGU+IGVsZW1lbnQgY29udGVudCBpbgorICAgICAgICAgICAgLy8gb3JkZXIgdG8gYmUgY29tcGxldGVseSBlZmZlY3RpdmUKKyAgICAgICAgICAgIFN0cmluZyBhY3R1YWxDbGFzcyA9IHNlcnZsZXRDbGFzczsKKyAgICAgICAgICAgIGlmICgoYWN0dWFsQ2xhc3MgPT0gbnVsbCkgJiYgKGpzcEZpbGUgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBXcmFwcGVyIGpzcFdyYXBwZXIgPSAoV3JhcHBlcikKKyAgICAgICAgICAgICAgICAgICAgKChDb250ZXh0KSBnZXRQYXJlbnQoKSkuZmluZENoaWxkKENvbnN0YW50cy5KU1BfU0VSVkxFVF9OQU1FKTsKKyAgICAgICAgICAgICAgICBpZiAoanNwV3JhcHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFjdHVhbENsYXNzID0ganNwV3JhcHBlci5nZXRTZXJ2bGV0Q2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTWVyZ2UgaW5pdCBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWVzW10gPSBqc3BXcmFwcGVyLmZpbmRJbml0UGFyYW1ldGVycygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtTmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmdldChwYXJhbU5hbWVzW2ldKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtTmFtZXNbaV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNwV3JhcHBlci5maW5kSW5pdFBhcmFtZXRlcihwYXJhbU5hbWVzW2ldKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENvbXBsYWluIGlmIG5vIHNlcnZsZXQgY2xhc3MgaGFzIGJlZW4gc3BlY2lmaWVkCisgICAgICAgICAgICBpZiAoYWN0dWFsQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVuYXZhaWxhYmxlKG51bGwpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5ub3RDbGFzcyIsIGdldE5hbWUoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBY3F1aXJlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBsb2FkZXIgdG8gYmUgdXNlZAorICAgICAgICAgICAgTG9hZGVyIGxvYWRlciA9IGdldExvYWRlcigpOworICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdW5hdmFpbGFibGUobnVsbCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLm1pc3NpbmdMb2FkZXIiLCBnZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBsb2FkZXIuZ2V0Q2xhc3NMb2FkZXIoKTsKKworICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGNsYXNzIGxvYWRlciBmb3IgYSBjb250YWluZXIgcHJvdmlkZWQgc2VydmxldAorICAgICAgICAgICAgLy8gIAorICAgICAgICAgICAgaWYgKGlzQ29udGFpbmVyUHJvdmlkZWRTZXJ2bGV0KGFjdHVhbENsYXNzKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgISAoKENvbnRleHQpZ2V0UGFyZW50KCkpLmdldFByaXZpbGVnZWQoKSApIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBhIHByaXZpbGVkZ2VkIGNvbnRleHQgLSB1c2luZyBpdHMgb3duCisgICAgICAgICAgICAgICAgLy8gY2xhc3MgbG9hZGVyIHdpbGwgd29yaywgc2luY2UgaXQncyBhIGNoaWxkIG9mIHRoZSBjb250YWluZXIKKyAgICAgICAgICAgICAgICAvLyBsb2FkZXIKKyAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBMb2FkIHRoZSBzcGVjaWZpZWQgc2VydmxldCBjbGFzcyBmcm9tIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBsb2FkZXIKKyAgICAgICAgICAgIENsYXNzIGNsYXNzQ2xhc3MgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBmY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZhY3R1YWxDbGFzcyA9IGFjdHVhbENsYXNzOworICAgICAgICAgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0NsYXNzID0gKENsYXNzKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmY2xhc3NMb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmNsYXNzTG9hZGVyLmxvYWRDbGFzcyhmYWN0dWFsQ2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGZhY3R1YWxDbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwYXgpeworICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGV4ID0gcGF4LmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbil7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pZXg7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkubG9nKCAiRXJyb3IgbG9hZGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmNsYXNzTG9hZGVyICsgIiAiICsgZmFjdHVhbENsYXNzLCBleCApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzQ2xhc3MgPSBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoYWN0dWFsQ2xhc3MpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NDbGFzcyA9IENsYXNzLmZvck5hbWUoYWN0dWFsQ2xhc3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdW5hdmFpbGFibGUobnVsbCk7CisgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5sb2coICJFcnJvciBsb2FkaW5nICIgKyBjbGFzc0xvYWRlciArICIgIiArIGFjdHVhbENsYXNzLCBlICk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLm1pc3NpbmdDbGFzcyIsIGFjdHVhbENsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2xhc3NDbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdW5hdmFpbGFibGUobnVsbCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLm1pc3NpbmdDbGFzcyIsIGFjdHVhbENsYXNzKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluc3RhbnRpYXRlIGFuZCBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBzZXJ2bGV0IGNsYXNzIGl0c2VsZgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXJ2bGV0ID0gKFNlcnZsZXQpIGNsYXNzQ2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdW5hdmFpbGFibGUobnVsbCk7CisgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgY29udGV4dCBDbGFzc0xvYWRlcgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5ub3RTZXJ2bGV0IiwgYWN0dWFsQ2xhc3MpLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgdW5hdmFpbGFibGUobnVsbCk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIEFkZGVkIGV4dHJhIGxvZyBzdGF0ZW1lbnQgZm9yIEJ1Z3ppbGxhIDM2NjMwOgorICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzY2MzAKKyAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIuaW5zdGFudGlhdGUiLCBhY3R1YWxDbGFzcyksIGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGNvbnRleHQgQ2xhc3NMb2FkZXIKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIuaW5zdGFudGlhdGUiLCBhY3R1YWxDbGFzcyksIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGVjayBpZiBsb2FkaW5nIHRoZSBzZXJ2bGV0IGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uIHNob3VsZCBiZQorICAgICAgICAgICAgLy8gYWxsb3dlZAorICAgICAgICAgICAgaWYgKCFpc1NlcnZsZXRBbGxvd2VkKHNlcnZsZXQpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5wcml2aWxlZ2VkU2VydmxldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ2xhc3MpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgQ29udGFpbmVyU2VydmxldCBpbnN0YW5jZXMKKyAgICAgICAgICAgIGlmICgoc2VydmxldCBpbnN0YW5jZW9mIENvbnRhaW5lclNlcnZsZXQpICYmCisgICAgICAgICAgICAgICAgICAoaXNDb250YWluZXJQcm92aWRlZFNlcnZsZXQoYWN0dWFsQ2xhc3MpIHx8CisgICAgICAgICAgICAgICAgICAgICgoQ29udGV4dClnZXRQYXJlbnQoKSkuZ2V0UHJpdmlsZWdlZCgpICkpIHsKKyAgICAgICAgICAgICAgICAoKENvbnRhaW5lclNlcnZsZXQpIHNlcnZsZXQpLnNldFdyYXBwZXIodGhpcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsYXNzTG9hZFRpbWU9KGludCkgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC10MSk7CisgICAgICAgICAgICAvLyBDYWxsIHRoZSBpbml0aWFsaXphdGlvbiBtZXRob2Qgb2YgdGhpcyBzZXJ2bGV0CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGluc3RhbmNlU3VwcG9ydC5maXJlSW5zdGFuY2VFdmVudChJbnN0YW5jZUV2ZW50LkJFRk9SRV9JTklUX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0KTsKKworICAgICAgICAgICAgICAgIGlmKCBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W117KChTZXJ2bGV0Q29uZmlnKWZhY2FkZSl9OworICAgICAgICAgICAgICAgICAgICBTZWN1cml0eVV0aWwuZG9Bc1ByaXZpbGVnZSgiaW5pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyk7CisgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQuaW5pdChmYWNhZGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEludm9rZSBqc3BJbml0IG9uIEpTUCBwYWdlcworICAgICAgICAgICAgICAgIGlmICgobG9hZE9uU3RhcnR1cCA+PSAwKSAmJiAoanNwRmlsZSAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnZva2luZyBqc3BJbml0CisgICAgICAgICAgICAgICAgICAgIER1bW15UmVxdWVzdCByZXEgPSBuZXcgRHVtbXlSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIHJlcS5zZXRTZXJ2bGV0UGF0aChqc3BGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxLnNldFF1ZXJ5U3RyaW5nKCJqc3BfcHJlY29tcGlsZT10cnVlIik7CisgICAgICAgICAgICAgICAgICAgIER1bW15UmVzcG9uc2UgcmVzID0gbmV3IER1bW15UmVzcG9uc2UoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W117cmVxLCByZXN9OworICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlVdGlsLmRvQXNQcml2aWxlZ2UoInNlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzVHlwZVVzZWRJblNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldC5zZXJ2aWNlKHJlcSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnN0YW5jZVN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5BRlRFUl9JTklUX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuYXZhaWxhYmxlRXhjZXB0aW9uIGYpIHsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZVN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5BRlRFUl9JTklUX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0LCBmKTsKKyAgICAgICAgICAgICAgICB1bmF2YWlsYWJsZShmKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBmOworICAgICAgICAgICAgfSBjYXRjaCAoU2VydmxldEV4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgaW5zdGFuY2VTdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfSU5JVF9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCwgZik7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlcnZsZXQgd2FudGVkIHRvIGJlIHVuYXZhaWxhYmxlIGl0IHdvdWxkIGhhdmUKKyAgICAgICAgICAgICAgICAvLyBzYWlkIHNvLCBzbyBkbyBub3QgY2FsbCB1bmF2YWlsYWJsZShudWxsKS4KKyAgICAgICAgICAgICAgICB0aHJvdyBmOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGYpIHsKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmxvZygiU3RhbmRhcmRXcmFwcGVyLlRocm93YWJsZSIsIGYgKTsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZVN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5BRlRFUl9JTklUX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0LCBmKTsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VydmxldCB3YW50ZWQgdG8gYmUgdW5hdmFpbGFibGUgaXQgd291bGQgaGF2ZQorICAgICAgICAgICAgICAgIC8vIHNhaWQgc28sIHNvIGRvIG5vdCBjYWxsIHVuYXZhaWxhYmxlKG51bGwpLgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5pbml0RXhjZXB0aW9uIiwgZ2V0TmFtZSgpKSwgZik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIG91ciBuZXdseSBpbml0aWFsaXplZCBpbnN0YW5jZQorICAgICAgICAgICAgc2luZ2xlVGhyZWFkTW9kZWwgPSBzZXJ2bGV0IGluc3RhbmNlb2YgU2luZ2xlVGhyZWFkTW9kZWw7CisgICAgICAgICAgICBpZiAoc2luZ2xlVGhyZWFkTW9kZWwpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VQb29sID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUG9vbCA9IG5ldyBTdGFjaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJsb2FkIiwgdGhpcyk7CisKKyAgICAgICAgICAgIGxvYWRUaW1lPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC10MTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzd2FsbG93T3V0cHV0KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxvZyA9IFN5c3RlbUxvZ0hhbmRsZXIuc3RvcENhcHR1cmUoKTsKKyAgICAgICAgICAgICAgICBpZiAobG9nICE9IG51bGwgJiYgbG9nLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2VydmxldENvbnRleHQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmxvZyhsb2cpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4obG9nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VydmxldDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIGZyb20gdGhpcyBzZXJ2bGV0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUluaXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMucmVtb3ZlKG5hbWUpOworICAgICAgICB9CisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgicmVtb3ZlSW5pdFBhcmFtZXRlciIsIG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaXN0ZW5lciBubyBsb25nZXIgaW50ZXJlc3RlZCBpbiBJbnN0YW5jZUV2ZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlSW5zdGFuY2VMaXN0ZW5lcihJbnN0YW5jZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgaW5zdGFuY2VTdXBwb3J0LnJlbW92ZUluc3RhbmNlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBtYXBwaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgd3JhcHBlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBwYXR0ZXJuIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1hcHBpbmcoU3RyaW5nIG1hcHBpbmcpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcHBpbmdzKSB7CisgICAgICAgICAgICBtYXBwaW5ncy5yZW1vdmUobWFwcGluZyk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJyZW1vdmVNYXBwaW5nIiwgbWFwcGluZyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgZm9yIHRoZSBzcGVjaWZpZWQgcm9sZSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgU2VjdXJpdHkgcm9sZSB1c2VkIHdpdGhpbiB0aGlzIHNlcnZsZXQgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlY3VyaXR5UmVmZXJlbmNlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChyZWZlcmVuY2VzKSB7CisgICAgICAgICAgICByZWZlcmVuY2VzLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoInJlbW92ZVNlY3VyaXR5UmVmZXJlbmNlIiwgbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKGdldFBhcmVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChnZXRQYXJlbnQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiU3RhbmRhcmRXcmFwcGVyWyIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYW4gVW5hdmFpbGFibGVFeGNlcHRpb24sIG1hcmtpbmcgdGhpcyBzZXJ2bGV0IGFzIHVuYXZhaWxhYmxlCisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdW5hdmFpbGFibGUgVGhlIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkLCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqICB0byBtYXJrIHRoaXMgc2VydmxldCBhcyBwZXJtYW5lbnRseSB1bmF2YWlsYWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuYXZhaWxhYmxlKFVuYXZhaWxhYmxlRXhjZXB0aW9uIHVuYXZhaWxhYmxlKSB7CisgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkubG9nKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLnVuYXZhaWxhYmxlIiwgZ2V0TmFtZSgpKSk7CisgICAgICAgIGlmICh1bmF2YWlsYWJsZSA9PSBudWxsKQorICAgICAgICAgICAgc2V0QXZhaWxhYmxlKExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgZWxzZSBpZiAodW5hdmFpbGFibGUuaXNQZXJtYW5lbnQoKSkKKyAgICAgICAgICAgIHNldEF2YWlsYWJsZShMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IHVuYXZhaWxhYmxlU2Vjb25kcyA9IHVuYXZhaWxhYmxlLmdldFVuYXZhaWxhYmxlU2Vjb25kcygpOworICAgICAgICAgICAgaWYgKHVuYXZhaWxhYmxlU2Vjb25kcyA8PSAwKQorICAgICAgICAgICAgICAgIHVuYXZhaWxhYmxlU2Vjb25kcyA9IDYwOyAgICAgICAgLy8gQXJiaXRyYXJ5IGRlZmF1bHQKKyAgICAgICAgICAgIHNldEF2YWlsYWJsZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVuYXZhaWxhYmxlU2Vjb25kcyAqIDEwMDBMKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVW5sb2FkIGFsbCBpbml0aWFsaXplZCBpbnN0YW5jZXMgb2YgdGhpcyBzZXJ2bGV0LCBhZnRlciBjYWxsaW5nIHRoZQorICAgICAqIDxjb2RlPmRlc3Ryb3koKTwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGluc3RhbmNlLiAgVGhpcyBjYW4gYmUgdXNlZCwKKyAgICAgKiBmb3IgZXhhbXBsZSwgcHJpb3IgdG8gc2h1dHRpbmcgZG93biB0aGUgZW50aXJlIHNlcnZsZXQgZW5naW5lLCBvcgorICAgICAqIHByaW9yIHRvIHJlbG9hZGluZyBhbGwgb2YgdGhlIGNsYXNzZXMgZnJvbSB0aGUgTG9hZGVyIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIG91ciBMb2FkZXIncyByZXBvc2l0b3J5LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgdGhlCisgICAgICogIGRlc3Ryb3koKSBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdW5sb2FkKCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYgd2UgaGF2ZSBuZXZlciBsb2FkZWQgdGhlIGluc3RhbmNlCisgICAgICAgIGlmICghc2luZ2xlVGhyZWFkTW9kZWwgJiYgKGluc3RhbmNlID09IG51bGwpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB1bmxvYWRpbmcgPSB0cnVlOworCisgICAgICAgIC8vIExvYWYgYSB3aGlsZSBpZiB0aGUgY3VycmVudCBpbnN0YW5jZSBpcyBhbGxvY2F0ZWQKKyAgICAgICAgLy8gKHBvc3NpYmx5IG1vcmUgdGhhbiBvbmNlIGlmIG5vbi1TVE0pCisgICAgICAgIGlmIChjb3VudEFsbG9jYXRlZCA+IDApIHsKKyAgICAgICAgICAgIGludCBuUmV0cmllcyA9IDA7CisgICAgICAgICAgICBsb25nIGRlbGF5ID0gdW5sb2FkRGVsYXkgLyAyMDsKKyAgICAgICAgICAgIHdoaWxlICgoblJldHJpZXMgPCAyMSkgJiYgKGNvdW50QWxsb2NhdGVkID4gMCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKG5SZXRyaWVzICUgMTApID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIud2FpdGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihjb3VudEFsbG9jYXRlZCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKGRlbGF5KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgblJldHJpZXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFByaW50U3RyZWFtIG91dCA9IFN5c3RlbS5vdXQ7CisgICAgICAgIGlmIChzd2FsbG93T3V0cHV0KSB7CisgICAgICAgICAgICBTeXN0ZW1Mb2dIYW5kbGVyLnN0YXJ0Q2FwdHVyZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FsbCB0aGUgc2VydmxldCBkZXN0cm95KCkgbWV0aG9kCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnN0YW5jZVN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQKKyAgICAgICAgICAgICAgKEluc3RhbmNlRXZlbnQuQkVGT1JFX0RFU1RST1lfRVZFTlQsIGluc3RhbmNlKTsKKworICAgICAgICAgICAgaWYoIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU2VjdXJpdHlVdGlsLmRvQXNQcml2aWxlZ2UoImRlc3Ryb3kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICBTZWN1cml0eVV0aWwucmVtb3ZlKGluc3RhbmNlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5zdGFuY2UuZGVzdHJveSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnN0YW5jZVN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQKKyAgICAgICAgICAgICAgKEluc3RhbmNlRXZlbnQuQUZURVJfREVTVFJPWV9FVkVOVCwgaW5zdGFuY2UpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgaW5zdGFuY2VTdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50CisgICAgICAgICAgICAgIChJbnN0YW5jZUV2ZW50LkFGVEVSX0RFU1RST1lfRVZFTlQsIGluc3RhbmNlLCB0KTsKKyAgICAgICAgICAgIGluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgICAgIGluc3RhbmNlUG9vbCA9IG51bGw7CisgICAgICAgICAgICBuSW5zdGFuY2VzID0gMDsKKyAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgidW5sb2FkIiwgdGhpcyk7CisgICAgICAgICAgICB1bmxvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLmRlc3Ryb3lFeGNlcHRpb24iLCBnZXROYW1lKCkpLAorICAgICAgICAgICAgICAgICB0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIFdyaXRlIGNhcHR1cmVkIG91dHB1dAorICAgICAgICAgICAgaWYgKHN3YWxsb3dPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbG9nID0gU3lzdGVtTG9nSGFuZGxlci5zdG9wQ2FwdHVyZSgpOworICAgICAgICAgICAgICAgIGlmIChsb2cgIT0gbnVsbCAmJiBsb2cubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRTZXJ2bGV0Q29udGV4dCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkubG9nKGxvZyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihsb2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRGVyZWdpc3RlciB0aGUgZGVzdHJveWVkIGluc3RhbmNlCisgICAgICAgIGluc3RhbmNlID0gbnVsbDsKKworICAgICAgICBpZiAoc2luZ2xlVGhyZWFkTW9kZWwgJiYgKGluc3RhbmNlUG9vbCAhPSBudWxsKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIWluc3RhbmNlUG9vbC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZWN1cml0eVV0aWwuZG9Bc1ByaXZpbGVnZSgiZGVzdHJveSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNlcnZsZXQpIGluc3RhbmNlUG9vbC5wb3AoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlVdGlsLnJlbW92ZShpbnN0YW5jZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKFNlcnZsZXQpIGluc3RhbmNlUG9vbC5wb3AoKSkuZGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZVBvb2wgPSBudWxsOworICAgICAgICAgICAgICAgIG5JbnN0YW5jZXMgPSAwOworICAgICAgICAgICAgICAgIHVubG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgidW5sb2FkIiwgdGhpcyk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLmRlc3Ryb3lFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKSksIHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5zdGFuY2VQb29sID0gbnVsbDsKKyAgICAgICAgICAgIG5JbnN0YW5jZXMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgc2luZ2xlVGhyZWFkTW9kZWwgPSBmYWxzZTsKKworICAgICAgICB1bmxvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJ1bmxvYWQiLCB0aGlzKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VydmxldENvbmZpZyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIG5hbWUsCisgICAgICogaWYgYW55OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHRvIHJldHJpZXZlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuIChmaW5kSW5pdFBhcmFtZXRlcihuYW1lKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBuYW1lcyBkZWZpbmVkIGZvciB0aGlzCisgICAgICogc2VydmxldC4gIElmIG5vbmUgYXJlIGRlZmluZWQsIGFuIGVtcHR5IEVudW1lcmF0aW9uIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRJbml0UGFyYW1ldGVyTmFtZXMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChwYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gKG5ldyBFbnVtZXJhdG9yKHBhcmFtZXRlcnMua2V5U2V0KCkpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlcnZsZXQgY29udGV4dCB3aXRoIHdoaWNoIHRoaXMgc2VydmxldCBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKKworICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBlbHNlIGlmICghKHBhcmVudCBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICgoKENvbnRleHQpIHBhcmVudCkuZ2V0U2VydmxldENvbnRleHQoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKGdldE5hbWUoKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRQcm9jZXNzaW5nVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHN3VmFsdmUuZ2V0UHJvY2Vzc2luZ1RpbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzaW5nVGltZShsb25nIHByb2Nlc3NpbmdUaW1lKSB7CisgICAgICAgIHN3VmFsdmUuc2V0UHJvY2Vzc2luZ1RpbWUocHJvY2Vzc2luZ1RpbWUpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldE1heFRpbWUoKSB7CisgICAgICAgIHJldHVybiBzd1ZhbHZlLmdldE1heFRpbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhUaW1lKGxvbmcgbWF4VGltZSkgeworICAgICAgICBzd1ZhbHZlLnNldE1heFRpbWUobWF4VGltZSk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0TWluVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHN3VmFsdmUuZ2V0TWluVGltZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1pblRpbWUobG9uZyBtaW5UaW1lKSB7CisgICAgICAgIHN3VmFsdmUuc2V0TWluVGltZShtaW5UaW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHN3VmFsdmUuZ2V0UmVxdWVzdENvdW50KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdENvdW50KGludCByZXF1ZXN0Q291bnQpIHsKKyAgICAgICAgc3dWYWx2ZS5zZXRSZXF1ZXN0Q291bnQocmVxdWVzdENvdW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEVycm9yQ291bnQoKSB7CisgICAgICAgIHJldHVybiBzd1ZhbHZlLmdldEVycm9yQ291bnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvckNvdW50KGludCBlcnJvckNvdW50KSB7CisgICAgICAgICAgIHN3VmFsdmUuc2V0RXJyb3JDb3VudChlcnJvckNvdW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmNyZW1lbnQgdGhlIGVycm9yIGNvdW50IHVzZWQgZm9yIG1vbml0b3JpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5jcmVtZW50RXJyb3JDb3VudCgpeworICAgICAgICBzd1ZhbHZlLnNldEVycm9yQ291bnQoc3dWYWx2ZS5nZXRFcnJvckNvdW50KCkgKyAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRMb2FkVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIGxvYWRUaW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvYWRUaW1lKGxvbmcgbG9hZFRpbWUpIHsKKyAgICAgICAgdGhpcy5sb2FkVGltZSA9IGxvYWRUaW1lOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q2xhc3NMb2FkVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzTG9hZFRpbWU7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBkZWZhdWx0IE1hcHBlciBpbXBsZW1lbnRhdGlvbiBpZiBub25lIGhhdmUgYmVlbiBjb25maWd1cmVkCisgICAgICogZXhwbGljaXRseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwZXJDbGFzcyBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGRlZmF1bHQgTWFwcGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdE1hcHBlcihTdHJpbmcgbWFwcGVyQ2xhc3MpIHsKKworICAgICAgICA7ICAgICAgIC8vIE5vIG5lZWQgZm9yIGEgZGVmYXVsdCBNYXBwZXIgb24gYSBXcmFwcGVyCisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWUgcmVwcmVzZW50cyBhCisgICAgICogY29udGFpbmVyIHByb3ZpZGVkIHNlcnZsZXQgY2xhc3MgdGhhdCBzaG91bGQgYmUgbG9hZGVkIGJ5IHRoZQorICAgICAqIHNlcnZlciBjbGFzcyBsb2FkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIE5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIGNoZWNrZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDb250YWluZXJQcm92aWRlZFNlcnZsZXQoU3RyaW5nIGNsYXNzbmFtZSkgeworCisgICAgICAgIGlmIChjbGFzc25hbWUuc3RhcnRzV2l0aCgib3JnLmFwYWNoZS5jYXRhbGluYS4iKSkgeworICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgY2xhenogPQorICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhjbGFzc25hbWUpOworICAgICAgICAgICAgcmV0dXJuIChDb250YWluZXJTZXJ2bGV0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBsb2FkaW5nIHRoaXMgc2VydmxldCBpcyBhbGxvd2VkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NlcnZsZXRBbGxvd2VkKE9iamVjdCBzZXJ2bGV0KSB7CisKKyAgICAgICAgaWYgKHNlcnZsZXQgaW5zdGFuY2VvZiBDb250YWluZXJTZXJ2bGV0KSB7CisgICAgICAgICAgICBpZiAoKChDb250ZXh0KSBnZXRQYXJlbnQoKSkuZ2V0UHJpdmlsZWdlZCgpCisgICAgICAgICAgICAgICAgfHwgKHNlcnZsZXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzCisgICAgICAgICAgICAgICAgICAgICgib3JnLmFwYWNoZS5jYXRhbGluYS5zZXJ2bGV0cy5JbnZva2VyU2VydmxldCIpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICh0cnVlKTsKKworICAgIH0KKworCisgICAgcHJpdmF0ZSBNZXRob2RbXSBnZXRBbGxEZWNsYXJlZE1ldGhvZHMoQ2xhc3MgYykgeworCisgICAgICAgIGlmIChjLmVxdWFscyhqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQuY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIE1ldGhvZFtdIHBhcmVudE1ldGhvZHMgPSBnZXRBbGxEZWNsYXJlZE1ldGhvZHMoYy5nZXRTdXBlcmNsYXNzKCkpOworCisgICAgICAgIE1ldGhvZFtdIHRoaXNNZXRob2RzID0gYy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgICAgICAgaWYgKHRoaXNNZXRob2RzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnRNZXRob2RzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwYXJlbnRNZXRob2RzICE9IG51bGwpICYmIChwYXJlbnRNZXRob2RzLmxlbmd0aCA+IDApKSB7CisgICAgICAgICAgICBNZXRob2RbXSBhbGxNZXRob2RzID0KKyAgICAgICAgICAgICAgICBuZXcgTWV0aG9kW3BhcmVudE1ldGhvZHMubGVuZ3RoICsgdGhpc01ldGhvZHMubGVuZ3RoXTsKKwkgICAgU3lzdGVtLmFycmF5Y29weShwYXJlbnRNZXRob2RzLCAwLCBhbGxNZXRob2RzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRNZXRob2RzLmxlbmd0aCk7CisJICAgIFN5c3RlbS5hcnJheWNvcHkodGhpc01ldGhvZHMsIDAsIGFsbE1ldGhvZHMsIHBhcmVudE1ldGhvZHMubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzTWV0aG9kcy5sZW5ndGgpOworCisJICAgIHRoaXNNZXRob2RzID0gYWxsTWV0aG9kczsKKwl9CisKKwlyZXR1cm4gdGhpc01ldGhvZHM7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogU3RhcnQgdGhpcyBjb21wb25lbnQsIHByZS1sb2FkaW5nIHRoZSBzZXJ2bGV0IGlmIHRoZSBsb2FkLW9uLXN0YXJ0dXAKKyAgICAgKiB2YWx1ZSBpcyBzZXQgYXBwcm9wcmlhdGVseS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIGEgZmF0YWwgZXJyb3Igb2NjdXJzIGR1cmluZyBzdGFydHVwCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAKKyAgICAgICAgLy8gU2VuZCBqMmVlLnN0YXRlLnN0YXJ0aW5nIG5vdGlmaWNhdGlvbiAKKyAgICAgICAgaWYgKHRoaXMuZ2V0T2JqZWN0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uKCJqMmVlLnN0YXRlLnN0YXJ0aW5nIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0T2JqZWN0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXIrKyk7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5zZW5kTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFN0YXJ0IHVwIHRoaXMgY29tcG9uZW50CisgICAgICAgIHN1cGVyLnN0YXJ0KCk7CisKKyAgICAgICAgaWYoIG9uYW1lICE9IG51bGwgKQorICAgICAgICAgICAgcmVnaXN0ZXJKTVgoKFN0YW5kYXJkQ29udGV4dClnZXRQYXJlbnQoKSk7CisgICAgICAgIAorICAgICAgICAvLyBMb2FkIGFuZCBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoaXMgc2VydmxldCBpZiByZXF1ZXN0ZWQKKyAgICAgICAgLy8gTU9WRUQgVE8gU3RhbmRhcmRDb250ZXh0IFNUQVJUKCkgTUVUSE9ECisKKyAgICAgICAgc2V0QXZhaWxhYmxlKDBMKTsKKyAgICAgICAgCisgICAgICAgIC8vIFNlbmQgajJlZS5zdGF0ZS5ydW5uaW5nIG5vdGlmaWNhdGlvbiAKKyAgICAgICAgaWYgKHRoaXMuZ2V0T2JqZWN0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSAKKyAgICAgICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uKCJqMmVlLnN0YXRlLnJ1bm5pbmciLCB0aGlzLmdldE9iamVjdE5hbWUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyKyspOworICAgICAgICAgICAgYnJvYWRjYXN0ZXIuc2VuZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3AgdGhpcyBjb21wb25lbnQsIGdyYWNlZnVsbHkgc2h1dHRpbmcgZG93biB0aGUgc2VydmxldCBpZiBpdCBoYXMKKyAgICAgKiBiZWVuIGluaXRpYWxpemVkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgYSBmYXRhbCBlcnJvciBvY2N1cnMgZHVyaW5nIHNodXRkb3duCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIHNldEF2YWlsYWJsZShMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIAorICAgICAgICAvLyBTZW5kIGoyZWUuc3RhdGUuc3RvcHBpbmcgbm90aWZpY2F0aW9uIAorICAgICAgICBpZiAodGhpcy5nZXRPYmplY3ROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IAorICAgICAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb24oImoyZWUuc3RhdGUuc3RvcHBpbmciLCB0aGlzLmdldE9iamVjdE5hbWUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyKyspOworICAgICAgICAgICAgYnJvYWRjYXN0ZXIuc2VuZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBTaHV0IGRvd24gb3VyIHNlcnZsZXQgaW5zdGFuY2UgKGlmIGl0IGhhcyBiZWVuIGluaXRpYWxpemVkKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdW5sb2FkKCk7CisgICAgICAgIH0gY2F0Y2ggKFNlcnZsZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5sb2coc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgKCJzdGFuZGFyZFdyYXBwZXIudW5sb2FkRXhjZXB0aW9uIiwgZ2V0TmFtZSgpKSwgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTaHV0IGRvd24gdGhpcyBjb21wb25lbnQKKyAgICAgICAgc3VwZXIuc3RvcCgpOworCisgICAgICAgIC8vIFNlbmQgajJlZS5zdGF0ZS5zdG9wcHBlZCBub3RpZmljYXRpb24gCisgICAgICAgIGlmICh0aGlzLmdldE9iamVjdE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gCisgICAgICAgICAgICAgICAgbmV3IE5vdGlmaWNhdGlvbigiajJlZS5zdGF0ZS5zdG9wcGVkIiwgdGhpcy5nZXRPYmplY3ROYW1lKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlcisrKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLnNlbmROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoIG9uYW1lICE9IG51bGwgKSB7CisgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS51bnJlZ2lzdGVyQ29tcG9uZW50KG9uYW1lKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gU2VuZCBqMmVlLm9iamVjdC5kZWxldGVkIG5vdGlmaWNhdGlvbiAKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSAKKyAgICAgICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uKCJqMmVlLm9iamVjdC5kZWxldGVkIiwgdGhpcy5nZXRPYmplY3ROYW1lKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlcisrKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLnNlbmROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0pzcFNlcnZsZXQgJiYganNwTW9uaXRvck9OICE9IG51bGwgKSB7CisgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS51bnJlZ2lzdGVyQ29tcG9uZW50KGpzcE1vbml0b3JPTik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVySk1YKFN0YW5kYXJkQ29udGV4dCBjdHgpIHsKKworICAgICAgICBTdHJpbmcgcGFyZW50TmFtZSA9IGN0eC5nZXROYW1lKCk7CisgICAgICAgIHBhcmVudE5hbWUgPSAoIiIuZXF1YWxzKHBhcmVudE5hbWUpKSA/ICIvIiA6IHBhcmVudE5hbWU7CisKKyAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gY3R4LmdldFBhcmVudCgpLmdldE5hbWUoKTsKKyAgICAgICAgaG9zdE5hbWUgPSAoaG9zdE5hbWU9PW51bGwpID8gIkRFRkFVTFQiIDogaG9zdE5hbWU7CisKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IGN0eC5nZXREb21haW4oKTsKKworICAgICAgICBTdHJpbmcgd2ViTW9kPSAiLy8iICsgaG9zdE5hbWUgKyBwYXJlbnROYW1lOworICAgICAgICBTdHJpbmcgb25hbWVTdHIgPSBkb21haW4gKyAiOmoyZWVUeXBlPVNlcnZsZXQsbmFtZT0iICsgZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIixXZWJNb2R1bGU9IiArIHdlYk1vZCArICIsSjJFRUFwcGxpY2F0aW9uPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZ2V0SjJFRUFwcGxpY2F0aW9uKCkgKyAiLEoyRUVTZXJ2ZXI9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5nZXRKMkVFU2VydmVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvbmFtZT1uZXcgT2JqZWN0TmFtZShvbmFtZVN0cik7CisgICAgICAgICAgICBjb250cm9sbGVyPW9uYW1lOworICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXJDb21wb25lbnQodGhpcywgb25hbWUsIG51bGwgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gU2VuZCBqMmVlLm9iamVjdC5jcmVhdGVkIG5vdGlmaWNhdGlvbiAKKyAgICAgICAgICAgIGlmICh0aGlzLmdldE9iamVjdE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiajJlZS5vYmplY3QuY3JlYXRlZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRPYmplY3ROYW1lKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXIrKyk7CisgICAgICAgICAgICAgICAgYnJvYWRjYXN0ZXIuc2VuZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7CisgICAgICAgICAgICBsb2cuaW5mbygiRXJyb3IgcmVnaXN0ZXJpbmcgc2VydmxldCB3aXRoIGpteCAiICsgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNKc3BTZXJ2bGV0KSB7CisgICAgICAgICAgICAvLyBSZWdpc3RlciBKU1AgbW9uaXRvcmluZyBtYmVhbgorICAgICAgICAgICAgb25hbWVTdHIgPSBkb21haW4gKyAiOnR5cGU9SnNwTW9uaXRvcixuYW1lPSIgKyBnZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgKyAiLFdlYk1vZHVsZT0iICsgd2ViTW9kCisgICAgICAgICAgICAgICAgICAgICAgICsgIixKMkVFQXBwbGljYXRpb249IiArIGN0eC5nZXRKMkVFQXBwbGljYXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICArICIsSjJFRVNlcnZlcj0iICsgY3R4LmdldEoyRUVTZXJ2ZXIoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAganNwTW9uaXRvck9OID0gbmV3IE9iamVjdE5hbWUob25hbWVTdHIpOworICAgICAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlckNvbXBvbmVudChpbnN0YW5jZSwganNwTW9uaXRvck9OLCBudWxsKTsKKyAgICAgICAgICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiRXJyb3IgcmVnaXN0ZXJpbmcgSlNQIG1vbml0b3Jpbmcgd2l0aCBqbXggIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorCisgICAgLyogUmVtb3ZlIGEgSk1YIG5vdGZpY2F0aW9uTGlzdGVuZXIgCisgICAgICogQHNlZSBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkVtaXR0ZXIjcmVtb3ZlTm90aWZpY2F0aW9uTGlzdGVuZXIoamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25MaXN0ZW5lciwgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25GaWx0ZXIsIGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTm90aWZpY2F0aW9uTGlzdGVuZXIoTm90aWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIsIAorICAgIAkJTm90aWZpY2F0aW9uRmlsdGVyIGZpbHRlciwgT2JqZWN0IG9iamVjdCkgdGhyb3dzIExpc3RlbmVyTm90Rm91bmRFeGNlcHRpb24geworICAgIAlicm9hZGNhc3Rlci5yZW1vdmVOb3RpZmljYXRpb25MaXN0ZW5lcihsaXN0ZW5lcixmaWx0ZXIsb2JqZWN0KTsKKyAgICAJCisgICAgfQorICAgIAorICAgIHByaXZhdGUgTUJlYW5Ob3RpZmljYXRpb25JbmZvW10gbm90aWZpY2F0aW9uSW5mbzsKKyAgICAKKyAgICAvKiBHZXQgSk1YIEJyb2FkY2FzdGVyIEluZm8KKyAgICAgKiBAVE9ETyB1c2UgU3RyaW5nTWFuYWdlciBmb3IgaW50ZXJuYXRpb25hbCBzdXBwb3J0IQorICAgICAqIEBUT0RPIFRoaXMgdHdvIGV2ZW50cyB3ZSBub3Qgc2VuZCBqMmVlLnN0YXRlLmZhaWxlZCBhbmQgajJlZS5hdHRyaWJ1dGUuY2hhbmdlZCEKKyAgICAgKiBAc2VlIGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uQnJvYWRjYXN0ZXIjZ2V0Tm90aWZpY2F0aW9uSW5mbygpCisgICAgICovCisgICAgcHVibGljIE1CZWFuTm90aWZpY2F0aW9uSW5mb1tdIGdldE5vdGlmaWNhdGlvbkluZm8oKSB7CisgICAgCQorICAgIAlpZihub3RpZmljYXRpb25JbmZvID09IG51bGwpIHsKKyAgICAJCW5vdGlmaWNhdGlvbkluZm8gPSBuZXcgTUJlYW5Ob3RpZmljYXRpb25JbmZvW117CisgICAgCQkJCW5ldyBNQmVhbk5vdGlmaWNhdGlvbkluZm8obmV3IFN0cmluZ1tdIHsKKyAgICAJCQkJImoyZWUub2JqZWN0LmNyZWF0ZWQifSwKKwkJCQkJTm90aWZpY2F0aW9uLmNsYXNzLmdldE5hbWUoKSwKKwkJCQkJInNlcnZsZXQgaXMgY3JlYXRlZCIKKyAgICAJCQkJKSwgCisJCQkJCW5ldyBNQmVhbk5vdGlmaWNhdGlvbkluZm8obmV3IFN0cmluZ1tdIHsKKwkJCQkJImoyZWUuc3RhdGUuc3RhcnRpbmcifSwKKwkJCQkJTm90aWZpY2F0aW9uLmNsYXNzLmdldE5hbWUoKSwKKwkJCQkJInNlcnZsZXQgaXMgc3RhcnRpbmciCisJCQkJCSksCisJCQkJCW5ldyBNQmVhbk5vdGlmaWNhdGlvbkluZm8obmV3IFN0cmluZ1tdIHsKKwkJCQkJImoyZWUuc3RhdGUucnVubmluZyJ9LAorCQkJCQlOb3RpZmljYXRpb24uY2xhc3MuZ2V0TmFtZSgpLAorCQkJCQkic2VydmxldCBpcyBydW5uaW5nIgorCQkJCQkpLAorCQkJCQluZXcgTUJlYW5Ob3RpZmljYXRpb25JbmZvKG5ldyBTdHJpbmdbXSB7CisJCQkJCSJqMmVlLnN0YXRlLnN0b3BwZWQifSwKKwkJCQkJTm90aWZpY2F0aW9uLmNsYXNzLmdldE5hbWUoKSwKKwkJCQkJInNlcnZsZXQgc3RhcnQgdG8gc3RvcHBlZCIKKwkJCQkJKSwKKwkJCQkJbmV3IE1CZWFuTm90aWZpY2F0aW9uSW5mbyhuZXcgU3RyaW5nW10geworCQkJCQkiajJlZS5vYmplY3Quc3RvcHBlZCJ9LAorCQkJCQlOb3RpZmljYXRpb24uY2xhc3MuZ2V0TmFtZSgpLAorCQkJCQkic2VydmxldCBpcyBzdG9wcGVkIgorCQkJCQkpLAorCQkJCQluZXcgTUJlYW5Ob3RpZmljYXRpb25JbmZvKG5ldyBTdHJpbmdbXSB7CisJCQkJCSJqMmVlLm9iamVjdC5kZWxldGVkIn0sCisJCQkJCU5vdGlmaWNhdGlvbi5jbGFzcy5nZXROYW1lKCksCisJCQkJCSJzZXJ2bGV0IGlzIGRlbGV0ZWQiCisJCQkJCSkKKyAgICAJCX07CisgICAgCQkKKyAgICAJfQorICAgIAkKKyAgICAJcmV0dXJuIG5vdGlmaWNhdGlvbkluZm87CisgICAgfQorICAgIAorICAgIAorICAgIC8qIEFkZCBhIEpNWC1Ob3RpZmljYXRpb25MaXN0ZW5lcgorICAgICAqIEBzZWUgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25Ccm9hZGNhc3RlciNhZGROb3RpZmljYXRpb25MaXN0ZW5lcihqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkxpc3RlbmVyLCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkZpbHRlciwgamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGROb3RpZmljYXRpb25MaXN0ZW5lcihOb3RpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lciwgCisgICAgICAgICAgICBOb3RpZmljYXRpb25GaWx0ZXIgZmlsdGVyLCBPYmplY3Qgb2JqZWN0KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAJYnJvYWRjYXN0ZXIuYWRkTm90aWZpY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIsZmlsdGVyLG9iamVjdCk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJlbW92ZSBhIEpNWC1Ob3RpZmljYXRpb25MaXN0ZW5lciAKKyAgICAgKiBAc2VlIGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uQnJvYWRjYXN0ZXIjcmVtb3ZlTm90aWZpY2F0aW9uTGlzdGVuZXIoamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25MaXN0ZW5lcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZmljYXRpb25MaXN0ZW5lcihOb3RpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgCisgICAgICAgIHRocm93cyBMaXN0ZW5lck5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAJYnJvYWRjYXN0ZXIucmVtb3ZlTm90aWZpY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBdHRyaWJ1dGVzCisgICAgICAgIAorICAgICAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V2ZW50UHJvdmlkZXIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0ZU1hbmFnZWFibGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aXN0aWNzUHJvdmlkZXIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgICAgIAorICAgICAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkV3JhcHBlckZhY2FkZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRXcmFwcGVyRmFjYWRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhhYzI3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkV3JhcHBlckZhY2FkZS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKKworCisvKioKKyAqIEZhY2FkZSBmb3IgdGhlIDxiPlN0YW5kYXJkV3JhcHBlcjwvYj4gb2JqZWN0LgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGFyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFN0YW5kYXJkV3JhcHBlckZhY2FkZQorICAgIGltcGxlbWVudHMgU2VydmxldENvbmZpZyB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgZmFjZWRlIGFyb3VuZCBhIFN0YW5kYXJkV3JhcHBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhbmRhcmRXcmFwcGVyRmFjYWRlKFN0YW5kYXJkV3JhcHBlciBjb25maWcpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLmNvbmZpZyA9IChTZXJ2bGV0Q29uZmlnKSBjb25maWc7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVkIGNvbmZpZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZsZXRDb25maWcgY29uZmlnID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VydmxldENvbmZpZyBNZXRob2RzCisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBjb25maWcuZ2V0U2VydmxldE5hbWUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKKyAgICAgICAgU2VydmxldENvbnRleHQgdGhlQ29udGV4dCA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgICAgICBpZiAoKHRoZUNvbnRleHQgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgICh0aGVDb250ZXh0IGluc3RhbmNlb2YgQXBwbGljYXRpb25Db250ZXh0KSkKKyAgICAgICAgICAgIHRoZUNvbnRleHQgPSAoKEFwcGxpY2F0aW9uQ29udGV4dCkgdGhlQ29udGV4dCkuZ2V0RmFjYWRlKCk7CisgICAgICAgIHJldHVybiAodGhlQ29udGV4dCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKG5hbWUpOworICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEluaXRQYXJhbWV0ZXJOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRXcmFwcGVyVmFsdmUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkV3JhcHBlclZhbHZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc5NWJlMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkV3JhcHBlclZhbHZlLmphdmEKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNsaWVudEFib3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuVmFsdmVCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLk1lc3NhZ2VCeXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmxvZy5TeXN0ZW1Mb2dIYW5kbGVyOworCisvKioKKyAqIFZhbHZlIHRoYXQgaW1wbGVtZW50cyB0aGUgZGVmYXVsdCBiYXNpYyBiZWhhdmlvciBmb3IgdGhlCisgKiA8Y29kZT5TdGFuZGFyZFdyYXBwZXI8L2NvZGU+IGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworZmluYWwgY2xhc3MgU3RhbmRhcmRXcmFwcGVyVmFsdmUKKyAgICBleHRlbmRzIFZhbHZlQmFzZSB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gU29tZSBKTVggc3RhdGlzdGljcy4gVGhpcyB2YXZsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBTdGFuZGFyZFdyYXBwZXIuCisgICAgLy8gV2UgZXhwb25zZSB0aGUgU3RhbmRhcmRXcmFwcGVyIGFzIEpNWCAoIGoyZWVUeXBlPVNlcnZsZXQgKS4gVGhlIGZpZWxkcworICAgIC8vIGFyZSBoZXJlIGZvciBwZXJmb3JtYW5jZS4KKyAgICBwcml2YXRlIHZvbGF0aWxlIGxvbmcgcHJvY2Vzc2luZ1RpbWU7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIG1heFRpbWU7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIG1pblRpbWUgPSBMb25nLk1BWF9WQUxVRTsKKyAgICBwcml2YXRlIHZvbGF0aWxlIGludCByZXF1ZXN0Q291bnQ7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgZXJyb3JDb3VudDsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgdGhlIHNlcnZsZXQgd2UgYXJlIG1hbmFnaW5nLCByZXNwZWN0aW5nIHRoZSBydWxlcyByZWdhcmRpbmcKKyAgICAgKiBzZXJ2bGV0IGxpZmVjeWNsZSBhbmQgU2luZ2xlVGhyZWFkTW9kZWwgc3VwcG9ydC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3QgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlIHRvIGJlIHByb2R1Y2VkCisgICAgICogQHBhcmFtIHZhbHZlQ29udGV4dCBWYWx2ZSBjb250ZXh0IHVzZWQgdG8gZm9yd2FyZCB0byB0aGUgbmV4dCBWYWx2ZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgaW52b2tlKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZXMgd2UgbWF5IG5lZWQKKyAgICAgICAgYm9vbGVhbiB1bmF2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICBUaHJvd2FibGUgdGhyb3dhYmxlID0gbnVsbDsKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgYSBSZXF1ZXN0IGF0dHJpYnV0ZS4uLgorICAgICAgICBsb25nIHQxPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICByZXF1ZXN0Q291bnQrKzsKKyAgICAgICAgU3RhbmRhcmRXcmFwcGVyIHdyYXBwZXIgPSAoU3RhbmRhcmRXcmFwcGVyKSBnZXRDb250YWluZXIoKTsKKyAgICAgICAgU2VydmxldCBzZXJ2bGV0ID0gbnVsbDsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIHdyYXBwZXIuZ2V0UGFyZW50KCk7CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayBmb3IgdGhlIGFwcGxpY2F0aW9uIGJlaW5nIG1hcmtlZCB1bmF2YWlsYWJsZQorICAgICAgICBpZiAoIWNvbnRleHQuZ2V0QXZhaWxhYmxlKCkpIHsKKyAgICAgICAgCXJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX1NFUlZJQ0VfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5pc1VuYXZhaWxhYmxlIikpOworICAgICAgICAgICAgdW5hdmFpbGFibGUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBzZXJ2bGV0IGJlaW5nIG1hcmtlZCB1bmF2YWlsYWJsZQorICAgICAgICBpZiAoIXVuYXZhaWxhYmxlICYmIHdyYXBwZXIuaXNVbmF2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuaW5mbyhzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5pc1VuYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIGxvbmcgYXZhaWxhYmxlID0gd3JhcHBlci5nZXRBdmFpbGFibGUoKTsKKyAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlID4gMEwpICYmIChhdmFpbGFibGUgPCBMb25nLk1BWF9WQUxVRSkpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZXREYXRlSGVhZGVyKCJSZXRyeS1BZnRlciIsIGF2YWlsYWJsZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfU0VSVklDRV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLmlzVW5hdmFpbGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGUgPT0gTG9uZy5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5ub3RGb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bmF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBBbGxvY2F0ZSBhIHNlcnZsZXQgaW5zdGFuY2UgdG8gcHJvY2VzcyB0aGlzIHJlcXVlc3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghdW5hdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICBzZXJ2bGV0ID0gd3JhcHBlci5hbGxvY2F0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChVbmF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZXJyb3IoCisgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLmFsbG9jYXRlRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIGUpOworICAgICAgICAgICAgbG9uZyBhdmFpbGFibGUgPSB3cmFwcGVyLmdldEF2YWlsYWJsZSgpOworICAgICAgICAgICAgaWYgKChhdmFpbGFibGUgPiAwTCkgJiYgKGF2YWlsYWJsZSA8IExvbmcuTUFYX1ZBTFVFKSkgeworICAgICAgICAgICAgCXJlc3BvbnNlLnNldERhdGVIZWFkZXIoIlJldHJ5LUFmdGVyIiwgYXZhaWxhYmxlKTsKKyAgICAgICAgICAgIAlyZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19TRVJWSUNFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIuaXNVbmF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlID09IExvbmcuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAJcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIubm90Rm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNlcnZsZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLmFsbG9jYXRlRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCBTdGFuZGFyZFdyYXBwZXIuZ2V0Um9vdENhdXNlKGUpKTsKKyAgICAgICAgICAgIHRocm93YWJsZSA9IGU7CisgICAgICAgICAgICBleGNlcHRpb24ocmVxdWVzdCwgcmVzcG9uc2UsIGUpOworICAgICAgICAgICAgc2VydmxldCA9IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIuYWxsb2NhdGVFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIGUpOworICAgICAgICAgICAgdGhyb3dhYmxlID0gZTsKKyAgICAgICAgICAgIGV4Y2VwdGlvbihyZXF1ZXN0LCByZXNwb25zZSwgZSk7CisgICAgICAgICAgICBzZXJ2bGV0ID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFja25vd2xlZ2UgdGhlIHJlcXVlc3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRBY2tub3dsZWRnZW1lbnQoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAJcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS53YXJuKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLmFja25vd2xlZGdlRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCBlKTsKKyAgICAgICAgICAgIHRocm93YWJsZSA9IGU7CisgICAgICAgICAgICBleGNlcHRpb24ocmVxdWVzdCwgcmVzcG9uc2UsIGUpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLmFja25vd2xlZGdlRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCBlKTsKKyAgICAgICAgICAgIHRocm93YWJsZSA9IGU7CisgICAgICAgICAgICBleGNlcHRpb24ocmVxdWVzdCwgcmVzcG9uc2UsIGUpOworICAgICAgICAgICAgc2VydmxldCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgTWVzc2FnZUJ5dGVzIHJlcXVlc3RQYXRoTUIgPSBudWxsOworICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXF1ZXN0UGF0aE1CID0gcmVxdWVzdC5nZXRSZXF1ZXN0UGF0aE1CKCk7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgIChBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuRElTUEFUQ0hFUl9UWVBFX0FUVFIsCisgICAgICAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LlJFUVVFU1RfSU5URUdFUik7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlCisgICAgICAgICAgICAoQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LkRJU1BBVENIRVJfUkVRVUVTVF9QQVRIX0FUVFIsCisgICAgICAgICAgICAgcmVxdWVzdFBhdGhNQik7CisgICAgICAgIC8vIENyZWF0ZSB0aGUgZmlsdGVyIGNoYWluIGZvciB0aGlzIHJlcXVlc3QKKyAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5IGZhY3RvcnkgPQorICAgICAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7CisgICAgICAgIEFwcGxpY2F0aW9uRmlsdGVyQ2hhaW4gZmlsdGVyQ2hhaW4gPQorICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVGaWx0ZXJDaGFpbihyZXF1ZXN0LCB3cmFwcGVyLCBzZXJ2bGV0KTsKKworICAgICAgICAvLyBDYWxsIHRoZSBmaWx0ZXIgY2hhaW4gZm9yIHRoaXMgcmVxdWVzdAorICAgICAgICAvLyBOT1RFOiBUaGlzIGFsc28gY2FsbHMgdGhlIHNlcnZsZXQncyBzZXJ2aWNlKCkgbWV0aG9kCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcganNwRmlsZSA9IHdyYXBwZXIuZ2V0SnNwRmlsZSgpOworICAgICAgICAgICAgaWYgKGpzcEZpbGUgIT0gbnVsbCkKKyAgICAgICAgICAgIAlyZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLkpTUF9GSUxFX0FUVFIsIGpzcEZpbGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgCXJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUik7CisgICAgICAgICAgICBpZiAoKHNlcnZsZXQgIT0gbnVsbCkgJiYgKGZpbHRlckNoYWluICE9IG51bGwpKSB7CisKKyAgICAgICAgICAgICAgICAvLyBTd2FsbG93IG91dHB1dCBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRTd2FsbG93T3V0cHV0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbUxvZ0hhbmRsZXIuc3RhcnRDYXB0dXJlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJDaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LmdldFJlcXVlc3QoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvZyA9IFN5c3RlbUxvZ0hhbmRsZXIuc3RvcENhcHR1cmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cgIT0gbnVsbCAmJiBsb2cubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRMb2dnZXIoKS5pbmZvKGxvZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJDaGFpbi5kb0ZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgKHJlcXVlc3QuZ2V0UmVxdWVzdCgpLCByZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUik7CisgICAgICAgIH0gY2F0Y2ggKENsaWVudEFib3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCXJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUik7CisgICAgICAgICAgICB0aHJvd2FibGUgPSBlOworICAgICAgICAgICAgZXhjZXB0aW9uKHJlcXVlc3QsIHJlc3BvbnNlLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAJcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5zZXJ2aWNlRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCBlKTsKKyAgICAgICAgICAgIHRocm93YWJsZSA9IGU7CisgICAgICAgICAgICBleGNlcHRpb24ocmVxdWVzdCwgcmVzcG9uc2UsIGUpOworICAgICAgICB9IGNhdGNoIChVbmF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIAlyZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShHbG9iYWxzLkpTUF9GSUxFX0FUVFIpOworICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLnNlcnZpY2VFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIGUpOworICAgICAgICAgICAgLy8gICAgICAgICAgICB0aHJvd2FibGUgPSBlOworICAgICAgICAgICAgLy8gICAgICAgICAgICBleGNlcHRpb24ocmVxdWVzdCwgcmVzcG9uc2UsIGUpOworICAgICAgICAgICAgd3JhcHBlci51bmF2YWlsYWJsZShlKTsKKyAgICAgICAgICAgIGxvbmcgYXZhaWxhYmxlID0gd3JhcHBlci5nZXRBdmFpbGFibGUoKTsKKyAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlID4gMEwpICYmIChhdmFpbGFibGUgPCBMb25nLk1BWF9WQUxVRSkpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZXREYXRlSGVhZGVyKCJSZXRyeS1BZnRlciIsIGF2YWlsYWJsZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfU0VSVklDRV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLmlzVW5hdmFpbGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZSA9PSBMb25nLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgCXJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5ub3RGb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIERvIG5vdCBzYXZlIGV4Y2VwdGlvbiBpbiAndGhyb3dhYmxlJywgYmVjYXVzZSB3ZQorICAgICAgICAgICAgLy8gZG8gbm90IHdhbnQgdG8gZG8gZXhjZXB0aW9uKHJlcXVlc3QsIHJlc3BvbnNlLCBlKSBwcm9jZXNzaW5nCisgICAgICAgIH0gY2F0Y2ggKFNlcnZsZXRFeGNlcHRpb24gZSkgeworICAgICAgICAJcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIFRocm93YWJsZSByb290Q2F1c2UgPSBTdGFuZGFyZFdyYXBwZXIuZ2V0Um9vdENhdXNlKGUpOworICAgICAgICAgICAgaWYgKCEocm9vdENhdXNlIGluc3RhbmNlb2YgQ2xpZW50QWJvcnRFeGNlcHRpb24pKSB7CisgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLnNlcnZpY2VFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCByb290Q2F1c2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3dhYmxlID0gZTsKKyAgICAgICAgICAgIGV4Y2VwdGlvbihyZXF1ZXN0LCByZXNwb25zZSwgZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShHbG9iYWxzLkpTUF9GSUxFX0FUVFIpOworICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLnNlcnZpY2VFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIGUpOworICAgICAgICAgICAgdGhyb3dhYmxlID0gZTsKKyAgICAgICAgICAgIGV4Y2VwdGlvbihyZXF1ZXN0LCByZXNwb25zZSwgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWxlYXNlIHRoZSBmaWx0ZXIgY2hhaW4gKGlmIGFueSkgZm9yIHRoaXMgcmVxdWVzdAorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGZpbHRlckNoYWluICE9IG51bGwpCisgICAgICAgICAgICAgICAgZmlsdGVyQ2hhaW4ucmVsZWFzZSgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLnJlbGVhc2VGaWx0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCBlKTsKKyAgICAgICAgICAgIGlmICh0aHJvd2FibGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93YWJsZSA9IGU7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uKHJlcXVlc3QsIHJlc3BvbnNlLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIERlYWxsb2NhdGUgdGhlIGFsbG9jYXRlZCBzZXJ2bGV0IGluc3RhbmNlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc2VydmxldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JhcHBlci5kZWFsbG9jYXRlKHNlcnZsZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLmRlYWxsb2NhdGVFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIGUpOworICAgICAgICAgICAgaWYgKHRocm93YWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3dhYmxlID0gZTsKKyAgICAgICAgICAgICAgICBleGNlcHRpb24ocmVxdWVzdCwgcmVzcG9uc2UsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhpcyBzZXJ2bGV0IGhhcyBiZWVuIG1hcmtlZCBwZXJtYW5lbnRseSB1bmF2YWlsYWJsZSwKKyAgICAgICAgLy8gdW5sb2FkIGl0IGFuZCByZWxlYXNlIHRoaXMgaW5zdGFuY2UKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICgoc2VydmxldCAhPSBudWxsKSAmJgorICAgICAgICAgICAgICAgICh3cmFwcGVyLmdldEF2YWlsYWJsZSgpID09IExvbmcuTUFYX1ZBTFVFKSkgeworICAgICAgICAgICAgICAgIHdyYXBwZXIudW5sb2FkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIudW5sb2FkRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCBlKTsKKyAgICAgICAgICAgIGlmICh0aHJvd2FibGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93YWJsZSA9IGU7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uKHJlcXVlc3QsIHJlc3BvbnNlLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb25nIHQyPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIGxvbmcgdGltZT10Mi10MTsKKyAgICAgICAgcHJvY2Vzc2luZ1RpbWUgKz0gdGltZTsKKyAgICAgICAgaWYoIHRpbWUgPiBtYXhUaW1lKSBtYXhUaW1lPXRpbWU7CisgICAgICAgIGlmKCB0aW1lIDwgbWluVGltZSkgbWluVGltZT10aW1lOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSGFuZGxlIHRoZSBzcGVjaWZpZWQgU2VydmxldEV4Y2VwdGlvbiBlbmNvdW50ZXJlZCB3aGlsZSBwcm9jZXNzaW5nCisgICAgICogdGhlIHNwZWNpZmllZCBSZXF1ZXN0IHRvIHByb2R1Y2UgdGhlIHNwZWNpZmllZCBSZXNwb25zZS4gIEFueQorICAgICAqIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciBkdXJpbmcgZ2VuZXJhdGlvbiBvZiB0aGUgZXhjZXB0aW9uIHJlcG9ydCBhcmUKKyAgICAgKiBsb2dnZWQgYW5kIHN3YWxsb3dlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UgYmVpbmcgZ2VuZXJhdGVkCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQgKHdoaWNoIHBvc3NpYmx5IHdyYXBzCisgICAgICogIGEgcm9vdCBjYXVzZSBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZXhjZXB0aW9uKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisgICAgCXJlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuRVhDRVBUSU9OX0FUVFIsIGV4Y2VwdGlvbik7CisgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRQcm9jZXNzaW5nVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NpbmdUaW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NpbmdUaW1lKGxvbmcgcHJvY2Vzc2luZ1RpbWUpIHsKKyAgICAgICAgdGhpcy5wcm9jZXNzaW5nVGltZSA9IHByb2Nlc3NpbmdUaW1lOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldE1heFRpbWUoKSB7CisgICAgICAgIHJldHVybiBtYXhUaW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1heFRpbWUobG9uZyBtYXhUaW1lKSB7CisgICAgICAgIHRoaXMubWF4VGltZSA9IG1heFRpbWU7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0TWluVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIG1pblRpbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWluVGltZShsb25nIG1pblRpbWUpIHsKKyAgICAgICAgdGhpcy5taW5UaW1lID0gbWluVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RDb3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0Q291bnQoaW50IHJlcXVlc3RDb3VudCkgeworICAgICAgICB0aGlzLnJlcXVlc3RDb3VudCA9IHJlcXVlc3RDb3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEVycm9yQ291bnQoKSB7CisgICAgICAgIHJldHVybiBlcnJvckNvdW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yQ291bnQoaW50IGVycm9yQ291bnQpIHsKKyAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gZXJyb3JDb3VudDsKKyAgICB9CisKKyAgICAvLyBEb24ndCByZWdpc3RlciBpbiBKTVgKKworICAgIHB1YmxpYyBPYmplY3ROYW1lIGNyZWF0ZU9iamVjdE5hbWUoU3RyaW5nIGRvbWFpbiwgT2JqZWN0TmFtZSBwYXJlbnQpCisgICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL21iZWFucy1kZXNjcmlwdG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzZGVkYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSw2OTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPG1iZWFucy1kZXNjcmlwdG9ycz4KKworICA8bWJlYW4gbmFtZT0iTmFtaW5nQ29udGV4dExpc3RlbmVyIgorICAgICAgICAgZGVzY3JpcHRpb249IkhlbHBlciBjbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgYW5kIHBvcHVsYXRlIHRoZSBKTkRJIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIGVhY2ggY29udGV4dCBhbmQgc2VydmVyIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJMaXN0ZW5lciIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5OYW1pbmdDb250ZXh0TGlzdGVuZXIiPgorICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgICAKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gbmFtZT0iU3RhbmRhcmRDb250ZXh0IgorICAgICAgICAgZGVzY3JpcHRpb249IlN0YW5kYXJkIENvbnRleHQgQ29tcG9uZW50IgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJDb250ZXh0IgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dCI+CisgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGxvd0xpbmtpbmciCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQWxsb3cgc3ltbGlua2luZyB0byBvdXRzaWRlIHRoZSB3ZWJhcHAgcm9vdCBkaXJlY3RvcnksIGlmIHRoZSB3ZWJhcHAgaXMgYW4gZXhwbG9kZWQgZGlyZWN0b3J5IgorICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImFudGlKQVJMb2NraW5nIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRha2UgY2FyZSB0byBub3QgbG9jayBqYXIgZmlsZXMiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIiAvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbnRpUmVzb3VyY2VMb2NraW5nIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRha2UgY2FyZSB0byBub3QgbG9jayByZXNvdXJjZXMiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIiAvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYWNoZU1heFNpemUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iTWF4aW11bSBjYWNoZSBzaXplIGluIEtCIgorICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNhY2hlVFRMIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRpbWUgaW50ZXJ2YWwgaW4gbXMgYmV0d2VlbiBjYWNoZSByZWZlc2hlcyIKKyAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYWNoaW5nQWxsb3dlZCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgd2UgY2FjaGUgc3RhdGljIHJlc291cmNlcyBmb3IgdGhpcyB3ZWJhcHAiCisgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2FzZVNlbnNpdGl2ZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgY2FzZSBzZW5zaXRpdml0eSBjaGVja3MgYmUgcGVyZm9ybWVkIgorICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNoaWxkcmVuIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9iamVjdCBuYW1lcyBvZiBhbGwgY2hpbGRyZW4iCisgICAgICAgICAgICAgICB0eXBlPSJbTGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsiLz4KKyAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29uZmlnRmlsZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJMb2NhdGlvbiBvZiB0aGUgY29udGV4dC54bWwgcmVzb3VyY2Ugb3IgZmlsZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb29raWVzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlNob3VsZCB3ZSBhdHRlbXB0IHRvIHVzZSBjb29raWVzIGZvciBzZXNzaW9uIGlkCisgICAgICAgICAgICAgICBjb21tdW5pY2F0aW9uPyIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tcGlsZXJDbGFzc3BhdGgiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGNvbXBpbGVyIGNsYXNzcGF0aCB0byB1c2UiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNyb3NzQ29udGV4dCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgd2UgYWxsb3cgdGhlIFNlcnZsZXRDb250ZXh0LmdldENvbnRleHQoKSBtZXRob2QgdG8gYWNjZXNzIHRoZSBjb250ZXh0IG9mIG90aGVyIHdlYiBhcHBsaWNhdGlvbnMgaW4gdGhpcyBzZXJ2ZXI/IgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0Q29udGV4dFhtbCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJMb2NhdGlvbiBvZiB0aGUgZGVmYXVsdCBjb250ZXh0LnhtbCByZXNvdXJjZSBvciBmaWxlIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0V2ViWG1sIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkxvY2F0aW9uIG9mIHRoZSBkZWZhdWx0IHdlYi54bWwgcmVzb3VyY2Ugb3IgZmlsZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVsZWdhdGUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXBsb3ltZW50RGVzY3JpcHRvciIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdHJpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yICIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jQmFzZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZG9jdW1lbnQgcm9vdCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24iCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImVuZ2luZU5hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iTmFtZSBvZiB0aGUgZW5naW5lIGRvbWFpbiwgaWYgZGlmZmVyZW50IGZyb20gdGhlIGNvbnRleHQgZG9tYWluIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJldmVudFByb3ZpZGVyIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkV2ZW50IHByb3ZpZGVyIHN1cHBvcnQgZm9yIHRoaXMgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iamF2YVZNcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgSmF2YSB2aXJ0dWFsIG1hY2hpbmVzIG9uIHdoaWNoIHRoaXMgbW9kdWxlIGlzIHJ1bm5pbmciCisgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7Ii8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImxvYWRlciIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBc3NvY2lhdGVkIGxvYWRlci4iCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLkxvYWRlciIgLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9nZ2VyIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkFzc29jaWF0ZWQgbG9nZ2VyLiIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyIgLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFuYWdlZFJlc291cmNlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtYW5hZ2VkIHJlc291cmNlIHRoaXMgTUJlYW4gaXMgYXNzb2NpYXRlZCB3aXRoIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYW5hZ2VyIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkFzc29jaWF0ZWQgbWFuYWdlci4iCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXIiIC8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9Im1hcHBpbmdPYmplY3QiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG9iamVjdCB1c2VkIGZvciBtYXBwaW5nIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJvYmplY3ROYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik5hbWUgb2YgdGhlIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3JpZ2luYWxEb2NCYXNlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBvcmlnaW5hbCBkb2N1bWVudCByb290IGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3ZlcnJpZGUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIERlZmF1bHRDb250ZXh0IG92ZXJyaWRlIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJlbnRDbGFzc0xvYWRlciIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJQYXJlbnQgY2xhc3MgbG9hZGVyLiIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5DbGFzc0xvYWRlciIgLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0icGF0aCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY29udGV4dCBwYXRoIGZvciB0aGlzIENvbnRleHQiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAgICAgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9InByaXZpbGVnZWQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQWNjZXNzIHRvIHRvbWNhdCBpbnRlcm5hbHMiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9InJlYWxtIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkFzc29jaWF0ZWQgcmVhbG0uIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbSIgLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVsb2FkYWJsZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgcmVsb2FkYWJsZSBmbGFnIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2F2ZUNvbmZpZyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgdGhlIGNvbmZpZ3VyYXRpb24gYmUgd3JpdHRlbiBhcyBuZWVkZWQgb24gc3RhcnR1cCIKKyAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXJ2ZXIiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIEoyRUUgU2VydmVyIHRoaXMgbW9kdWxlIGlzIGRlcGxveWVkIG9uIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXJ2bGV0cyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJKU1I3NyBsaXN0IG9mIHNlcnZsZXRzIgorICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZhLmxhbmcuU3RyaW5nOyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhcnR1cFRpbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGltZSAoaW4gbWlsbGlzZWNvbmRzKSBpdCB0b29rIHRvIHN0YXJ0IHRoaXMgY29udGV4dCIKKyAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhcnRUaW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRpbWUgKGluIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzAsIDAwOjAwOjAwKSB3aGVuIHRoaXMgY29udGV4dCB3YXMgc3RhcnRlZCIKKyAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3VtdWxhdGl2ZSBleGVjdXRpb24gdGltZXMgb2YgYWxsIHNlcnZsZXRzIGluIHRoaXMgY29udGV4dCIKKyAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGF0ZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDdXJyZW50IHN0YXRlIG9mIHRoaXMgY29tcG9uZW50IgorICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgICAgICAgICAgICAgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9InN0YXRlTWFuYWdlYWJsZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdGF0ZSBtYW5hZ2VtZW50IHN1cHBvcnQgZm9yIHRoaXMgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhdGlzdGljc1Byb3ZpZGVyIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlBlcmZvcm1hbmNlIHN0YXRpc3RpY3Mgc3VwcG9ydCBmb3IgdGhpcyBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGF0aWNSZXNvdXJjZXMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhdGljIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQuIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0IgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InN3YWxsb3dPdXRwdXQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRmxhZyB0byBzZXQgdG8gY2F1c2UgdGhlIHN5c3RlbS5vdXQgYW5kIHN5c3RlbS5lcnIgdG8gYmUgcmVkaXJlY3RlZCB0byB0aGUgbG9nZ2VyIHdoZW4gZXhlY3V0aW5nIGEgc2VydmxldCIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0idW5sb2FkRGVsYXkiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQW1vdW50IG9mIG1zIHRoYXQgdGhlIGNvbnRhaW5lciB3aWxsIHdhaXQgZm9yIHNlcnZsZXRzIHRvIHVubG9hZCIKKyAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0idGxkU2NhblRpbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGltZSBzcGVuZCBzY2FubmluZyBqYXJzIGZvciBUTERzIGZvciB0aGlzIGNvbnRleHQiCisgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InVzZU5hbWluZyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSBKTkRJIG5hbWluZyBjb250ZXh0IGZvciB0aGlzIGFwcGxpY2F0aW9uPyIKKyAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx2ZU9iamVjdE5hbWVzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9iamVjdE5hbWVzIGZvciB0aGUgdmFsdmVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgICAgIHR5cGU9IltMamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0id2VsY29tZUZpbGVzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSB3ZWxjb21lIGZpbGVzIGZvciB0aGlzIGNvbnRleHQiCisgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7IgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3b3JrRGlyIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBwYXRobmFtZSB0byB0aGUgd29yayBkaXJlY3RvcnkgZm9yIHRoaXMgY29udGV4dCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJhZGRWYWx2ZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBZGQgYSB2YWx2ZSB0byB0aGlzIENvbnRleHQiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJ2YWx2ZSIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik5ldyB2YWx2ZSB0byBiZSBhZGRlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZSIvPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVWYWx2ZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgYSB2YWx2ZSBmcm9tIHRoaXMgQ29udGV4dCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InZhbHZlIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iTmV3IHZhbHZlIHRvIGJlIHJlbW92ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmUiLz4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iYWRkTGlmZWN5Y2xlTGlzdGVuZXIiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQWRkIGEgbGlmZWN5Y2xlIGxpc3RlbmVyIHRvIHRoaXMgQ29udGV4dCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iTmV3IGxpZmVjeWNsZSBsaXN0ZW5lciB0byBiZSBhZGRlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lciIvPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVMaWZlY3ljbGVMaXN0ZW5lciIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgYSBsaWZlY3ljbGUgbGlzdGVuZXIgZnJvbSB0aGlzIENvbnRleHQiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik5ldyBsaWZlY3ljbGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lciIvPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZWxvYWQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVsb2FkIHRoZSB3ZWJhcHBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisgICAgCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImluaXQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVnaXN0ZXIgdGhlIGNvbnRleHQgaW50byB0aGUgcnVubmluZyBzZXJ2ZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gICBuYW1lPSJzdGFydCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdGFydCB0aGUgY29udGV4dCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisgICAgCisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0b3AgdGhlIGNvbnRleHQiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0iZGVzdHJveSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJEZXN0cm95IHRoZSBjb250ZXh0IgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAKKyAgICA8b3BlcmF0aW9uIG5hbWU9ImZpbmRNYXBwaW5nT2JqZWN0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJldHVybiBhbiBvYmplY3Qgd2hpY2ggbWF5IGJlIHV0aWxpemVkIGZvciBtYXBwaW5nIHRvIHRoaXMgY29tcG9uZW50IgorICAgICAgICAgICAgICAgaW1wYWN0PSJJTkZPIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0Ij4gICAgCisgICAgPC9vcGVyYXRpb24+ICAgIAorICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0iZmluZFN0YXRpY1Jlc291cmNlcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXR1cm4gdGhlIG5hbWluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViIGFwcGxpY2F0aW9uIgorICAgICAgICAgICAgICAgaW1wYWN0PSJJTkZPIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0Ij4gICAgCisgICAgPC9vcGVyYXRpb24+CisgICAgCisgIDwvbWJlYW4+CisgIAorICA8bWJlYW4gbmFtZT0iU3RhbmRhcmRDb250ZXh0VmFsdmUiCisgICAgICAgICBkZXNjcmlwdGlvbj0iVmFsdmUgdGhhdCBpbXBsZW1lbnRzIHRoZSBkZWZhdWx0IGJhc2ljIGJlaGF2aW9yIGZvciB0aGUKKyAgICAgICAgIFN0YW5kYXJkQ29udGV4dCBjb250YWluZXIgaW1wbGVtZW50YXRpb24iCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9IlZhbHZlIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dFZhbHZlIj4KKyAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgICAgCisgIDwvbWJlYW4+CisgIAorICA8bWJlYW4gbmFtZT0iU3RhbmRhcmRFbmdpbmUiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRFbmdpbmUiCisgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhbmRhcmQgRW5naW5lIENvbXBvbmVudCIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iRW5naW5lIj4KKyAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRIb3N0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik5hbWUgb2YgdGhlIGRlZmF1bHQgSG9zdCBmb3IgdGhpcyBFbmdpbmUiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWFuYWdlZFJlc291cmNlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtYW5hZ2VkIHJlc291cmNlIHRoaXMgTUJlYW4gaXMgYXNzb2NpYXRlZCB3aXRoIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVW5pcXVlIG5hbWUgb2YgdGhpcyBFbmdpbmUiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYmFzZURpciIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJCYXNlIGRpciBmb3IgdGhpcyBlbmdpbmUsIHR5cGljYWxseSBzYW1lIGFzIGNhdGFsaW5hLmJhc2Ugc3lzdGVtIHByb3BlcnR5IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Imp2bVJvdXRlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJvdXRlIHVzZWQgZm9yIGxvYWQgYmFsYW5jaW5nIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWFsbSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBc3NvY2lhdGVkIHJlYWxtLiIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG0iIC8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9InZhbHZlT2JqZWN0TmFtZXMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iT2JqZWN0TmFtZXMgZm9yIHRoZSB2YWx2ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7IgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRDaGlsZCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBZGQgYSB2aXJ0dWFsIGhvc3QiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJjaGlsZCIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ikhvc3Qgb2JqZWN0IgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lciIvPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RhcnQiIGRlc2NyaXB0aW9uPSJTdGFydCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIiBkZXNjcmlwdGlvbj0iU3RvcCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgICAKKyAgPC9tYmVhbj4KKworICAKKyAgPG1iZWFuIG5hbWU9IlN0YW5kYXJkRW5naW5lVmFsdmUiCisgICAgICAgICBkZXNjcmlwdGlvbj0iVmFsdmUgdGhhdCBpbXBsZW1lbnRzIHRoZSBkZWZhdWx0IGJhc2ljIGJlaGF2aW9yIGZvciB0aGUKKyAgICAgICAgIFN0YW5kYXJkRW5naW5lIGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iVmFsdmUiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRFbmdpbmVWYWx2ZSI+CisgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgICAgCisgIDwvbWJlYW4+CisgIAorICA8bWJlYW4gbmFtZT0iU3RhbmRhcmRIb3N0IgorICAgICAgICAgZGVzY3JpcHRpb249IlN0YW5kYXJkIEhvc3QgQ29tcG9uZW50IgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJIb3N0IgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdCI+CisgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJhcHBCYXNlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBhcHBsaWNhdGlvbiByb290IGZvciB0aGlzIEhvc3QiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImF1dG9EZXBsb3kiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGF1dG8gZGVwbG95IGZsYWcgZm9yIHRoaXMgSG9zdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb25maWdDbGFzcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY29uZmlndXJhdGlvbiBjbGFzcyBmb3IgY29udGV4dHMiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImRlcGxveU9uU3RhcnR1cCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGVwbG95IG9uIHN0YXJ0dXAgZmxhZyBmb3IgdGhpcyBIb3N0IgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXBsb3lYTUwiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iZGVwbG95IENvbnRleHQgWE1MIGNvbmZpZyBmaWxlcyBwcm9wZXJ0eSIKKyAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYW5hZ2VkUmVzb3VyY2UiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1hbmFnZWQgcmVzb3VyY2UgdGhpcyBNQmVhbiBpcyBhc3NvY2lhdGVkIHdpdGgiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ii8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVW5pcXVlIG5hbWUgb2YgdGhpcyBIb3N0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1bnBhY2tXQVJzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlVucGFjayBXQVJzIHByb3BlcnR5IgorICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9InhtbE5hbWVzcGFjZUF3YXJlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkF0dHJpYnV0ZSB2YWx1ZSB1c2VkIHRvIHR1cm4gb24vb2ZmIFhNTCBuYW1lc3BhY2UgYXdhcmVuZXNzIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ4bWxWYWxpZGF0aW9uIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkF0dHJpYnV0ZSB2YWx1ZSB1c2VkIHRvIHR1cm4gb24vb2ZmIFhNTCB2YWxpZGF0aW9uIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGlsZHJlbiIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJPYmplY3QgbmFtZXMgb2YgYWxsIGNoaWxkcmVuIgorICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7Ii8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImFsaWFzZXMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iSG9zdCBhbGlhc2VzIgorICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZhLmxhbmcuU3RyaW5nOyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWFsbSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBc3NvY2lhdGVkIHJlYWxtLiIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG0iIC8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9InZhbHZlTmFtZXMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmV0dXJuIHRoZSBNQmVhbiBOYW1lcyBvZiB0aGUgVmFsdmVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEhvc3QiCisgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7Ii8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9InZhbHZlT2JqZWN0TmFtZXMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmV0dXJuIHRoZSBNQmVhbiBPYmplY3ROYW1lcyBvZiB0aGUgVmFsdmVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEhvc3QiCisgICAgICAgICAgICAgICB0eXBlPSJbTGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsiLz4KKyAgICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0iYWRkQWxpYXMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQWRkIGFuIGFsaWFzIG5hbWUgdGhhdCBzaG91bGQgYmUgbWFwcGVkIHRvIHRoaXMgSG9zdCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImFsaWFzIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGFsaWFzIHRvIGJlIGFkZGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisgICAgCisgICAgPG9wZXJhdGlvbiBuYW1lPSJmaW5kQWxpYXNlcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXR1cm4gdGhlIHNldCBvZiBhbGlhcyBuYW1lcyBmb3IgdGhpcyBIb3N0IgorICAgICAgICAgICAgICAgaW1wYWN0PSJJTkZPIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0iW0xqYXZhLmxhbmcuU3RyaW5nOyIvPgorCisgICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRDaGlsZCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBZGQgYSBjb250ZXh0IgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJjaGlsZCIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkNvbnRleHQgdG8gYmUgYWRkZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyIi8+CisgICAgPC9vcGVyYXRpb24+CisgICAgICAKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0icmVtb3ZlQWxpYXMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYWxpYXMgbmFtZSBmcm9tIHRoZSBhbGlhc2VzIGZvciB0aGlzICBIb3N0IgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iYWxpYXMiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBbGlhcyBuYW1lIHRvIGJlIHJlbW92ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAKKyAgICA8b3BlcmF0aW9uIG5hbWU9InN0YXJ0IiBkZXNjcmlwdGlvbj0iU3RhcnQiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcCIgZGVzY3JpcHRpb249IlN0b3AiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0iaW5pdCIgZGVzY3JpcHRpb249IkluaXQiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0iZGVzdHJveSIgZGVzY3JpcHRpb249IkRlc3Ryb3kiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICA8L21iZWFuPgorICAKKyAgPG1iZWFuIG5hbWU9IlN0YW5kYXJkSG9zdFZhbHZlIgorICAgICAgICAgZGVzY3JpcHRpb249IlZhbHZlIHRoYXQgaW1wbGVtZW50cyB0aGUgZGVmYXVsdCBiYXNpYyBiZWhhdmlvciBmb3IgdGhlCisgICAgICAgICBTdGFuZGFyZEhvc3QgY29udGFpbmVyIGltcGxlbWVudGF0aW9uIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJWYWx2ZSIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3RWYWx2ZSI+CisgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICA8L21iZWFuPgorCisgIDxtYmVhbiBuYW1lPSJTdGFuZGFyZFNlcnZlciIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSJTdGFuZGFyZCBTZXJ2ZXIgQ29tcG9uZW50IgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJTZXJ2ZXIiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXIiPgorICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFuYWdlZFJlc291cmNlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtYW5hZ2VkIHJlc291cmNlIHRoaXMgTUJlYW4gaXMgYXNzb2NpYXRlZCB3aXRoIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3J0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRDUCBwb3J0IGZvciBzaHV0ZG93biBtZXNzYWdlcyIKKyAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzaHV0ZG93biIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaHV0ZG93biBwYXNzd29yZCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmljZU5hbWVzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9iamVjdCBuYW1lcyBvZiBhbGwgc2VydmljZXMgd2Uga25vdyBhYm91dCIKKyAgICAgICAgICAgICAgIHR5cGU9IltMamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOyIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXJ2ZXJJbmZvIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRvbWNhdCBzZXJ2ZXIgcmVsZWFzZSBpZGVudGlmaWVyIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0iYXdhaXQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iV2FpdCBmb3IgdGhlIHNodXRkb3duIG1lc3NhZ2UiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiIC8+CisKKyAgICA8b3BlcmF0aW9uIG5hbWU9InN0b3JlQ29uZmlnIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlNhdmUgY3VycmVudCBzdGF0ZSB0byBzZXJ2ZXIueG1sIGZpbGUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorCisgICAgPC9vcGVyYXRpb24+CisgICAgCisgIDwvbWJlYW4+CisKKyAgCisgIDxtYmVhbiBuYW1lPSJTdGFuZGFyZFNlcnZpY2UiCisgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhbmRhcmQgU2VydmljZSBDb21wb25lbnQiCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9IlNlcnZpY2UiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2aWNlIj4KKyAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9Im1hbmFnZWRSZXNvdXJjZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWFuYWdlZCByZXNvdXJjZSB0aGlzIE1CZWFuIGlzIGFzc29jaWF0ZWQgd2l0aCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5PYmplY3QiLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJVbmlxdWUgbmFtZSBvZiB0aGlzIFNlcnZpY2UiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbm5lY3Rvck5hbWVzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9iamVjdE5hbWVzIG9mIHRoZSBjb25uZWN0b3JzIgorICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7IgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlNlcnZsZXQgZW5naW5lIHRoYXQgd2lsbCBwcm9jZXNzIHRoZSByZXF1ZXN0cyIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyIiAvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXJOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9iamVjdE5hbWVzIG9mIHRoZSBlbmdpbmUiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWUiCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorCisgICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRDb25uZWN0b3IiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQWRkIGEgbmV3IGNvbm5lY3RvciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImNvbm5lY3RvciIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkNvbm5lY3RvciBvYmplY3QiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvciIvPgorICAgIDwvb3BlcmF0aW9uPgorICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0Q29ubmVjdG9yTmFtZXMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iZ2V0IGFsbCBKTVggY29ubmVjdG9yIG5hbWVzIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJbTGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsiPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RhcnQiIGRlc2NyaXB0aW9uPSJTdGFydCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIiBkZXNjcmlwdGlvbj0iU3RvcCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgIDwvbWJlYW4+CisKKyAgPG1iZWFuIG5hbWU9IlN0YW5kYXJkV3JhcHBlciIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSJXcmFwcGVyIHRoYXQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIHNlcnZsZXQgZGVmaW5pdGlvbiIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iV3JhcHBlciIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFdyYXBwZXIiPgorICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmdpbmVOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgICAgICAgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImV2ZW50UHJvdmlkZXIiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRXZlbnQgcHJvdmlkZXIgc3VwcG9ydCBmb3IgdGhpcyBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJvYmplY3ROYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik5hbWUgb2YgdGhlIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhdGVNYW5hZ2VhYmxlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0YXRlIG1hbmFnZW1lbnQgc3VwcG9ydCBmb3IgdGhpcyBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGF0aXN0aWNzUHJvdmlkZXIiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUGVyZm9ybWFuY2Ugc3RhdGlzdGljcyBzdXBwb3J0IGZvciB0aGlzIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZSBzZXJ2bGV0J3Mgc2VydmljZSBtZXRob2QiCisgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4VGltZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJNYXhpbXVtIHByb2Nlc3NpbmcgdGltZSBvZiBhIHJlcXVlc3QiCisgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWluVGltZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJNaW5pbXVtIHByb2Nlc3NpbmcgdGltZSBvZiBhIHJlcXVlc3QiCisgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVxdWVzdENvdW50IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik51bWJlciBvZiByZXF1ZXN0cyBwcm9jZXNzZWQgYnkgdGhpcyB3cmFwcGVyIgorICAgICAgICAgICAgICAgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXJyb3JDb3VudCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJFcnJvciBjb3VudCIKKyAgICAgICAgICAgICAgIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImxvYWRUaW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkxvYWQgdGltZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc0xvYWRUaW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkNsYXNzIGxvYWRpbmcgdGltZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8b3BlcmF0aW9uIG5hbWU9ImZpbmRNYXBwaW5ncyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXR1cm4gdGhlIG1hcHBpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdyYXBwZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IklORk8iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJbTGphdmEubGFuZy5TdHJpbmc7Ij4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAgICAgICAgICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0iZmluZE1hcHBpbmdPYmplY3QiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmV0dXJuIGFuIG9iamVjdCB3aGljaCBtYXkgYmUgdXRpbGl6ZWQgZm9yIG1hcHBpbmcgdG8gdGhpcyBjb21wb25lbnQiCisgICAgICAgICAgICAgICBpbXBhY3Q9IklORk8iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLldyYXBwZXIiPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICA8L21iZWFuPgorICAKKyAgPG1iZWFuIG5hbWU9IlN0YW5kYXJkV3JhcHBlclZhbHZlIgorICAgICAgICAgZGVzY3JpcHRpb249IlZhbHZlIHRoYXQgaW1wbGVtZW50cyB0aGUgZGVmYXVsdCBiYXNpYyBiZWhhdmlvciBmb3IgdGhlCisgICAgICAgICBTdGFuZGFyZFdyYXBwZXIgY29udGFpbmVyIGltcGxlbWVudGF0aW9uIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJWYWx2ZSIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFdyYXBwZXJWYWx2ZSI+CisgICAgICAgICAKKyAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4gIAorICAgICAgICAgICAgICAgICAgICAKKyAgPC9tYmVhbj4KKworPC9tYmVhbnMtZGVzY3JpcHRvcnM+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0FwcGxpY2F0aW9uUGFyYW1ldGVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0FwcGxpY2F0aW9uUGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhNDg4MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvQXBwbGljYXRpb25QYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisKKy8qKgorICogUmVwcmVzZW50YXRpb24gb2YgYSBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB0aGF0IGlzIGNvbmZpZ3VyZWQKKyAqIGluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlLCByYXRoZXIgdGhhbiB0aGUgYXBwbGljYXRpb24gZGVwbG95bWVudAorICogZGVzY3JpcHRvci4gIFRoaXMgaXMgY29udmVuaWVudCBmb3IgZXN0YWJsaXNoaW5nIGRlZmF1bHQgdmFsdWVzICh3aGljaAorICogbWF5IGJlIGNvbmZpZ3VyZWQgdG8gYWxsb3cgYXBwbGljYXRpb24gb3ZlcnJpZGVzIG9yIG5vdCkgd2l0aG91dCBoYXZpbmcKKyAqIHRvIG1vZGlmeSB0aGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIGl0c2VsZi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uUGFyYW1ldGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGVudmlyb25tZW50IGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgYXBwbGljYXRpb24gcGFyYW1ldGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRG9lcyB0aGlzIGFwcGxpY2F0aW9uIHBhcmFtZXRlciBhbGxvdyBvdmVycmlkZXMgYnkgdGhlIGFwcGxpY2F0aW9uCisgICAgICogZGVwbG95bWVudCBkZXNjcmlwdG9yPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBvdmVycmlkZSA9IHRydWU7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRPdmVycmlkZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm92ZXJyaWRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZShib29sZWFuIG92ZXJyaWRlKSB7CisgICAgICAgIHRoaXMub3ZlcnJpZGUgPSBvdmVycmlkZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIGFwcGxpY2F0aW9uIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkFwcGxpY2F0aW9uUGFyYW1ldGVyWyIpOworICAgICAgICBzYi5hcHBlbmQoIm5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChuYW1lKTsKKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBkZXNjcmlwdGlvbj0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChkZXNjcmlwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCIsIHZhbHVlPSIpOworICAgICAgICBzYi5hcHBlbmQodmFsdWUpOworICAgICAgICBzYi5hcHBlbmQoIiwgb3ZlcnJpZGU9Iik7CisgICAgICAgIHNiLmFwcGVuZChvdmVycmlkZSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvQ29udGV4dEVqYi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9Db250ZXh0RWpiLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUwZjkwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvQ29udGV4dEVqYi5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhbiBFSkIgcmVzb3VyY2UgcmVmZXJlbmNlIGZvciBhIHdlYiBhcHBsaWNhdGlvbiwgYXMKKyAqIHJlcHJlc2VudGVkIGluIGEgPGNvZGU+Jmx0O2VqYi1yZWYmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZQorICogZGVwbG95bWVudCBkZXNjcmlwdG9yLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaCAocGVyb0BhcGFjaGUub3JnKQorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dEVqYiBleHRlbmRzIFJlc291cmNlQmFzZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBFSkIgaG9tZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBob21lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9tZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmhvbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhvbWUoU3RyaW5nIGhvbWUpIHsKKyAgICAgICAgdGhpcy5ob21lID0gaG9tZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaW5rIHRvIGEgSjJFRSBFSkIgZGVmaW5pdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsaW5rID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGluaygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxpbmspOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIGxpbmspIHsKKyAgICAgICAgdGhpcy5saW5rID0gbGluazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgRUpCIHJlbW90ZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZW1vdGUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5yZW1vdGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZShTdHJpbmcgcmVtb3RlKSB7CisgICAgICAgIHRoaXMucmVtb3RlID0gcmVtb3RlOworICAgIH0KKworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJDb250ZXh0RWpiWyIpOworICAgICAgICBzYi5hcHBlbmQoIm5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXROYW1lKCkpOworICAgICAgICBpZiAoZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgZGVzY3JpcHRpb249Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldFR5cGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgdHlwZT0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChnZXRUeXBlKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChob21lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBob21lPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGhvbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChyZW1vdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIHJlbW90ZT0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChyZW1vdGUpOworICAgICAgICB9CisgICAgICAgIGlmIChsaW5rICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBsaW5rPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGxpbmspOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvQ29udGV4dEVudmlyb25tZW50LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRFbnZpcm9ubWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMDAyMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRFbnZpcm9ubWVudC5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudCBlbnRyeSwgYXMgcmVwcmVzZW50ZWQgaW4KKyAqIGFuIDxjb2RlPiZsdDtlbnYtZW50cnkmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb250ZXh0RW52aXJvbm1lbnQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZW52aXJvbm1lbnQgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhpcyBlbnZpcm9ubWVudCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERvZXMgdGhpcyBlbnZpcm9ubWVudCBlbnRyeSBhbGxvdyBvdmVycmlkZXMgYnkgdGhlIGFwcGxpY2F0aW9uCisgICAgICogZGVwbG95bWVudCBkZXNjcmlwdG9yPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBvdmVycmlkZSA9IHRydWU7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRPdmVycmlkZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm92ZXJyaWRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZShib29sZWFuIG92ZXJyaWRlKSB7CisgICAgICAgIHRoaXMub3ZlcnJpZGUgPSBvdmVycmlkZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHRoaXMgZW52aXJvbm1lbnQgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy50eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBlbnZpcm9ubWVudCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkNvbnRleHRFbnZpcm9ubWVudFsiKTsKKyAgICAgICAgc2IuYXBwZW5kKCJuYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQobmFtZSk7CisgICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgZGVzY3JpcHRpb249Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoZGVzY3JpcHRpb24pOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCB0eXBlPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHR5cGUpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgdmFsdWU9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiLCBvdmVycmlkZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKG92ZXJyaWRlKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTmFtaW5nUmVzb3VyY2VzIHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQgKGlmIGFueSkuCisgICAgICovCisgICAgcHJvdGVjdGVkIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMgPSBudWxsOworCisgICAgcHVibGljIE5hbWluZ1Jlc291cmNlcyBnZXROYW1pbmdSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5yZXNvdXJjZXMpOworICAgIH0KKworICAgIHZvaWQgc2V0TmFtaW5nUmVzb3VyY2VzKE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZXMgPSByZXNvdXJjZXM7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvQ29udGV4dExvY2FsRWpiLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRMb2NhbEVqYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMDA5YWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRMb2NhbEVqYi5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhIGxvY2FsIEVKQiByZXNvdXJjZSByZWZlcmVuY2UgZm9yIGEgd2ViIGFwcGxpY2F0aW9uLCBhcworICogcmVwcmVzZW50ZWQgaW4gYSA8Y29kZT4mbHQ7ZWpiLWxvY2FsLXJlZiZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlCisgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoIChwZXJvQGFwYWNoZS5vcmcpCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb250ZXh0TG9jYWxFamIgZXh0ZW5kcyBSZXNvdXJjZUJhc2UgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBFSkIgaG9tZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBob21lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9tZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmhvbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhvbWUoU3RyaW5nIGhvbWUpIHsKKyAgICAgICAgdGhpcy5ob21lID0gaG9tZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaW5rIHRvIGEgSjJFRSBFSkIgZGVmaW5pdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsaW5rID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGluaygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxpbmspOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIGxpbmspIHsKKyAgICAgICAgdGhpcy5saW5rID0gbGluazsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBFSkIgbG9jYWwgaW1wbGVtZW50YXRpb24gY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbG9jYWwgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxvY2FsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbChTdHJpbmcgbG9jYWwpIHsKKyAgICAgICAgdGhpcy5sb2NhbCA9IGxvY2FsOworICAgIH0KKworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJDb250ZXh0TG9jYWxFamJbIik7CisgICAgICAgIHNiLmFwcGVuZCgibmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldE5hbWUoKSk7CisgICAgICAgIGlmIChnZXREZXNjcmlwdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBkZXNjcmlwdGlvbj0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChnZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0VHlwZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCB0eXBlPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGdldFR5cGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhvbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGhvbWU9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoaG9tZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpbmsgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGxpbms9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQobGluayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxvY2FsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBsb2NhbD0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChsb2NhbCk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRSZXNvdXJjZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9Db250ZXh0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDRkMDNkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9Db250ZXh0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGEgcmVzb3VyY2UgcmVmZXJlbmNlIGZvciBhIHdlYiBhcHBsaWNhdGlvbiwgYXMKKyAqIHJlcHJlc2VudGVkIGluIGEgPGNvZGU+Jmx0O3Jlc291cmNlLXJlZiZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlCisgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoIChwZXJvQGFwYWNoZS5vcmcpCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb250ZXh0UmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZUJhc2UgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGF1dGhvcml6YXRpb24gcmVxdWlyZW1lbnQgZm9yIHRoaXMgcmVzb3VyY2UKKyAgICAgKiAoPGNvZGU+QXBwbGljYXRpb248L2NvZGU+IG9yIDxjb2RlPkNvbnRhaW5lcjwvY29kZT4pLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGF1dGggPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRoKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuYXV0aCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXV0aChTdHJpbmcgYXV0aCkgeworICAgICAgICB0aGlzLmF1dGggPSBhdXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzaGFyaW5nIHNjb3BlIG9mIHRoaXMgcmVzb3VyY2UgZmFjdG9yeSAoPGNvZGU+U2hhcmVhYmxlPC9jb2RlPgorICAgICAqIG9yIDxjb2RlPlVuc2hhcmVhYmxlPC9jb2RlPikuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2NvcGUgPSAiU2hhcmVhYmxlIjsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zY29wZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7CisgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJDb250ZXh0UmVzb3VyY2VbIik7CisgICAgICAgIHNiLmFwcGVuZCgibmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldE5hbWUoKSk7CisgICAgICAgIGlmIChnZXREZXNjcmlwdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBkZXNjcmlwdGlvbj0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChnZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0VHlwZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCB0eXBlPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGdldFR5cGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF1dGggIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGF1dGg9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoYXV0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjb3BlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBzY29wZT0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzY29wZSk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvQ29udGV4dFJlc291cmNlRW52UmVmLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRSZXNvdXJjZUVudlJlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjI5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRSZXNvdXJjZUVudlJlZi5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3k7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHJlc291cmNlIHJlZmVyZW5jZSwgYXMgcmVwcmVzZW50ZWQgaW4KKyAqIGFuIDxjb2RlPiZsdDtyZXMtZW52LXJlZnkmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoIChwZXJvQGFwYWNoZS5vcmcpCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb250ZXh0UmVzb3VyY2VFbnZSZWYgZXh0ZW5kcyBSZXNvdXJjZUJhc2UgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIERvZXMgdGhpcyBlbnZpcm9ubWVudCBlbnRyeSBhbGxvdyBvdmVycmlkZXMgYnkgdGhlIGFwcGxpY2F0aW9uCisgICAgICogZGVwbG95bWVudCBkZXNjcmlwdG9yPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBvdmVycmlkZSA9IHRydWU7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRPdmVycmlkZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm92ZXJyaWRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZShib29sZWFuIG92ZXJyaWRlKSB7CisgICAgICAgIHRoaXMub3ZlcnJpZGUgPSBvdmVycmlkZTsKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkNvbnRleHRSZXNvdXJjZUVudlJlZlsiKTsKKyAgICAgICAgc2IuYXBwZW5kKCJuYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKGdldFR5cGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgdHlwZT0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChnZXRUeXBlKCkpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiLCBvdmVycmlkZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKG92ZXJyaWRlKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRSZXNvdXJjZUxpbmsuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvQ29udGV4dFJlc291cmNlTGluay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOWZjZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRSZXNvdXJjZUxpbmsuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhIHJlc291cmNlIGxpbmsgZm9yIGEgd2ViIGFwcGxpY2F0aW9uLCBhcworICogcmVwcmVzZW50ZWQgaW4gYSA8Y29kZT4mbHQ7UmVzb3VyY2VMaW5rJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUKKyAqIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaCAoUGV0ZXIgUm9zc2JhY2ggKHBlcm9AYXBhY2hlLm9yZykpCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb250ZXh0UmVzb3VyY2VMaW5rIGV4dGVuZHMgUmVzb3VyY2VCYXNlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgIC8qKgorICAgICAqIFRoZSBnbG9iYWwgbmFtZSBvZiB0aGlzIHJlc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdsb2JhbCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEdsb2JhbCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmdsb2JhbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R2xvYmFsKFN0cmluZyBnbG9iYWwpIHsKKyAgICAgICAgdGhpcy5nbG9iYWwgPSBnbG9iYWw7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiQ29udGV4dFJlc291cmNlTGlua1siKTsKKyAgICAgICAgc2IuYXBwZW5kKCJuYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKGdldFR5cGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgdHlwZT0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChnZXRUeXBlKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRHbG9iYWwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgZ2xvYmFsPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGdldEdsb2JhbCgpKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9Db250ZXh0VHJhbnNhY3Rpb24uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvQ29udGV4dFRyYW5zYWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkM2I5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvQ29udGV4dFRyYW5zYWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3k7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiByZXNvdXJjZSByZWZlcmVuY2UsIGFzIHJlcHJlc2VudGVkIGluCisgKiBhbiA8Y29kZT4mbHQ7cmVzLWVudi1yZWZ5Jmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dFRyYW5zYWN0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIEhvbGRlciBmb3Igb3VyIGNvbmZpZ3VyZWQgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb25maWd1cmVkIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0KG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIGNvbmZpZ3VyZWQgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBwcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIHJlbW92ZSBhIGNvbmZpZ3VyZWQgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcHJvcGVydGllcy5yZW1vdmUobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlzdCBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBsaXN0UHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlRyYW5zYWN0aW9uWyIpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFRoZSBOYW1pbmdSZXNvdXJjZXMgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZCAoaWYgYW55KS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTmFtaW5nUmVzb3VyY2VzIHJlc291cmNlcyA9IG51bGw7CisKKyAgICBwdWJsaWMgTmFtaW5nUmVzb3VyY2VzIGdldE5hbWluZ1Jlc291cmNlcygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlc291cmNlcyk7CisgICAgfQorCisgICAgdm9pZCBzZXROYW1pbmdSZXNvdXJjZXMoTmFtaW5nUmVzb3VyY2VzIHJlc291cmNlcykgeworICAgICAgICB0aGlzLnJlc291cmNlcyA9IHJlc291cmNlczsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9FcnJvclBhZ2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvRXJyb3JQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI5ZWMxNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvRXJyb3JQYWdlLmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3k7CisKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5SZXF1ZXN0VXRpbDsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGFuIGVycm9yIHBhZ2UgZWxlbWVudCBmb3IgYSB3ZWIgYXBwbGljYXRpb24sCisgKiBhcyByZXByZXNlbnRlZCBpbiBhIDxjb2RlPiZsdDtlcnJvci1wYWdlJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUKKyAqIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEVycm9yUGFnZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXJyb3IgKHN0YXR1cykgY29kZSBmb3Igd2hpY2ggdGhpcyBlcnJvciBwYWdlIGlzIGFjdGl2ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBlcnJvckNvZGUgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXhjZXB0aW9uIHR5cGUgZm9yIHdoaWNoIHRoaXMgZXJyb3IgcGFnZSBpcyBhY3RpdmUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZXhjZXB0aW9uVHlwZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb250ZXh0LXJlbGF0aXZlIGxvY2F0aW9uIHRvIGhhbmRsZSB0aGlzIGVycm9yIG9yIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbiA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGVycm9yIGNvZGUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRFcnJvckNvZGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmVycm9yQ29kZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZXJyb3IgY29kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvckNvZGUgVGhlIG5ldyBlcnJvciBjb2RlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JDb2RlKGludCBlcnJvckNvZGUpIHsKKworICAgICAgICB0aGlzLmVycm9yQ29kZSA9IGVycm9yQ29kZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBlcnJvciBjb2RlIChoYWNrIGZvciBkZWZhdWx0IFhtbE1hcHBlciBkYXRhIHR5cGUpLgorICAgICAqCisgICAgICogQHBhcmFtIGVycm9yQ29kZSBUaGUgbmV3IGVycm9yIGNvZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvckNvZGUoU3RyaW5nIGVycm9yQ29kZSkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLmVycm9yQ29kZSA9IEludGVnZXIucGFyc2VJbnQoZXJyb3JDb2RlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRoaXMuZXJyb3JDb2RlID0gMDsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV4Y2VwdGlvbiB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uVHlwZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZXhjZXB0aW9uVHlwZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZXhjZXB0aW9uIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZSBUaGUgbmV3IGV4Y2VwdGlvbiB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uVHlwZShTdHJpbmcgZXhjZXB0aW9uVHlwZSkgeworCisgICAgICAgIHRoaXMuZXhjZXB0aW9uVHlwZSA9IGV4Y2VwdGlvblR5cGU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9jYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMubG9jYXRpb24pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBuZXcgbG9jYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKKworICAgICAgICAvLyAgICAgICAgaWYgKChsb2NhdGlvbiA9PSBudWxsKSB8fCAhbG9jYXRpb24uc3RhcnRzV2l0aCgiLyIpKQorICAgICAgICAvLyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgKCJFcnJvciBQYWdlIExvY2F0aW9uIG11c3Qgc3RhcnQgd2l0aCBhICcvJyIpOworICAgICAgICB0aGlzLmxvY2F0aW9uID0gUmVxdWVzdFV0aWwuVVJMRGVjb2RlKGxvY2F0aW9uKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlbmRlciBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkVycm9yUGFnZVsiKTsKKyAgICAgICAgaWYgKGV4Y2VwdGlvblR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCJlcnJvckNvZGU9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoZXJyb3JDb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiZXhjZXB0aW9uVHlwZT0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChleGNlcHRpb25UeXBlKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIiwgbG9jYXRpb249Iik7CisgICAgICAgIHNiLmFwcGVuZChsb2NhdGlvbik7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvRmlsdGVyRGVmLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0ZpbHRlckRlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZjRmZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0ZpbHRlckRlZi5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95OworCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisKKy8qKgorICogUmVwcmVzZW50YXRpb24gb2YgYSBmaWx0ZXIgZGVmaW5pdGlvbiBmb3IgYSB3ZWIgYXBwbGljYXRpb24sIGFzIHJlcHJlc2VudGVkCisgKiBpbiBhIDxjb2RlPiZsdDtmaWx0ZXImZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBGaWx0ZXJEZWYgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyBmaWx0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGlzcGxheU5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmRpc3BsYXlOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpIHsKKyAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGZpbHRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBmaWx0ZXJDbGFzcyA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbHRlckNsYXNzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZmlsdGVyQ2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlckNsYXNzKFN0cmluZyBmaWx0ZXJDbGFzcykgeworICAgICAgICB0aGlzLmZpbHRlckNsYXNzID0gZmlsdGVyQ2xhc3M7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIGZpbHRlciwgd2hpY2ggbXVzdCBiZSB1bmlxdWUgYW1vbmcgdGhlIGZpbHRlcnMKKyAgICAgKiBkZWZpbmVkIGZvciBhIHBhcnRpY3VsYXIgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGZpbHRlck5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRGaWx0ZXJOYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZmlsdGVyTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyTmFtZShTdHJpbmcgZmlsdGVyTmFtZSkgeworICAgICAgICB0aGlzLmZpbHRlck5hbWUgPSBmaWx0ZXJOYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGxhcmdlIGljb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsdGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGxhcmdlSWNvbiA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhcmdlSWNvbigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxhcmdlSWNvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyBsYXJnZUljb24pIHsKKyAgICAgICAgdGhpcy5sYXJnZUljb24gPSBsYXJnZUljb247CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoaXMgZmlsdGVyLCBrZXllZCBieQorICAgICAqIHBhcmFtZXRlciBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgTWFwIHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgcHVibGljIE1hcCBnZXRQYXJhbWV0ZXJNYXAoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhcmFtZXRlcnMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgc21hbGwgaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWx0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc21hbGxJY29uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U21hbGxJY29uKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuc21hbGxJY29uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTbWFsbEljb24oU3RyaW5nIHNtYWxsSWNvbikgeworICAgICAgICB0aGlzLnNtYWxsSWNvbiA9IHNtYWxsSWNvbjsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHRvIHRoZSBzZXQgb2YgcGFyYW1ldGVycyBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGlzIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgbmFtZQorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSW5pdFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisKKyAgICAgICAgcGFyYW1ldGVycy5wdXQobmFtZSwgdmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJGaWx0ZXJEZWZbIik7CisgICAgICAgIHNiLmFwcGVuZCgiZmlsdGVyTmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMuZmlsdGVyTmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBmaWx0ZXJDbGFzcz0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMuZmlsdGVyQ2xhc3MpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0ZpbHRlck1hcC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9GaWx0ZXJNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzBiM2FlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9GaWx0ZXJNYXAuamF2YQpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveTsKKworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlJlcXVlc3RVdGlsOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisKKy8qKgorICogUmVwcmVzZW50YXRpb24gb2YgYSBmaWx0ZXIgbWFwcGluZyBmb3IgYSB3ZWIgYXBwbGljYXRpb24sIGFzIHJlcHJlc2VudGVkCisgKiBpbiBhIDxjb2RlPiZsdDtmaWx0ZXItbWFwcGluZyZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIGRlcGxveW1lbnQKKyAqIGRlc2NyaXB0b3IuICBFYWNoIGZpbHRlciBtYXBwaW5nIG11c3QgY29udGFpbiBhIGZpbHRlciBuYW1lIHBsdXMgZWl0aGVyCisgKiBhIFVSTCBwYXR0ZXJuIG9yIGEgc2VydmxldCBuYW1lLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRmlsdGVyTWFwIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgZmlsdGVyIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBtYXBwaW5nIG1hdGNoZXMKKyAgICAgKiBhIHBhcnRpY3VsYXIgcmVxdWVzdC4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9SV0FSRCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9SV0FSRF9FUlJPUiA9MzsgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREUgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfRVJST1IgID0gNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0VSUk9SX0ZPUldBUkQgID02OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfRk9SV0FSRCAgPSA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1QgPSA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfRVJST1IgPSA5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfRVJST1JfRk9SV0FSRCA9IDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfRVJST1JfRk9SV0FSRF9JTkNMVURFID0gMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9FUlJPUl9JTkNMVURFID0gMTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9GT1JXQVJEID0gMTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9JTkNMVURFID0gMTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9GT1JXQVJEX0lOQ0xVREU9IDE1OworICAgIAorICAgIC8vIHJlcHJlc2VudHMgbm90aGluZyBoYXZpbmcgYmVlbiBzZXQuIFRoaXMgd2lsbCBiZSBzZWVuIAorICAgIC8vIGFzIGVxdWFsIHRvIGEgUkVRVUVTVAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RfU0VUID0gLTE7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgZGlzcGF0Y2hlck1hcHBpbmc9Tk9UX1NFVDsKKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyBmaWx0ZXJOYW1lID0gbnVsbDsgICAgCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbHRlck5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5maWx0ZXJOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJOYW1lKFN0cmluZyBmaWx0ZXJOYW1lKSB7CisgICAgICAgIHRoaXMuZmlsdGVyTmFtZSA9IGZpbHRlck5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBuYW1lIHRoaXMgbWFwcGluZyBtYXRjaGVzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNlcnZsZXROYW1lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zZXJ2bGV0TmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VydmxldE5hbWUoU3RyaW5nIHNlcnZsZXROYW1lKSB7CisgICAgICAgIHRoaXMuc2VydmxldE5hbWUgPSBzZXJ2bGV0TmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBVUkwgcGF0dGVybiB0aGlzIG1hcHBpbmcgbWF0Y2hlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1cmxQYXR0ZXJuID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJMUGF0dGVybigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnVybFBhdHRlcm4pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVSTFBhdHRlcm4oU3RyaW5nIHVybFBhdHRlcm4pIHsKKyAgICAgICAgdGhpcy51cmxQYXR0ZXJuID0gUmVxdWVzdFV0aWwuVVJMRGVjb2RlKHVybFBhdHRlcm4pOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgdXNlZCB0byBzZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIEZpbHRlck1hcAorICAgICAqIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2Ygd2hlbiBmaWx0ZXJzIHNob3VsZCBiZSBhcHBsaWVkOgorICAgICAqCisgICAgICogICAgICAgIEVSUk9SCisgICAgICogICAgICAgIEZPUldBUkQKKyAgICAgKiAgICAgICAgRk9SV0FSRF9FUlJPUgorICAgICAqICAgICAgICBJTkNMVURFCisgICAgICogICAgICAgIElOQ0xVREVfRVJST1IKKyAgICAgKiAgICAgICAgSU5DTFVERV9FUlJPUl9GT1JXQVJECisgICAgICogICAgICAgIFJFUVVFU1QKKyAgICAgKiAgICAgICAgUkVRVUVTVF9FUlJPUgorICAgICAqICAgICAgICBSRVFVRVNUX0VSUk9SX0lOQ0xVREUKKyAgICAgKiAgICAgICAgUkVRVUVTVF9FUlJPUl9GT1JXQVJEX0lOQ0xVREUKKyAgICAgKiAgICAgICAgUkVRVUVTVF9JTkNMVURFCisgICAgICogICAgICAgIFJFUVVFU1RfRk9SV0FSRCwKKyAgICAgKiAgICAgICAgUkVRVUVTVF9GT1JXQVJEX0lOQ0xVREUKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc3BhdGNoZXIoU3RyaW5nIGRpc3BhdGNoZXJTdHJpbmcpIHsKKyAgICAgICAgU3RyaW5nIGRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyU3RyaW5nLnRvVXBwZXJDYXNlKCk7CisgICAgICAgIAorICAgICAgICBpZiAoZGlzcGF0Y2hlci5lcXVhbHMoIkZPUldBUkQiKSkgeworCisgICAgICAgICAgICAvLyBhcHBseSBGT1JXQVJEIHRvIHRoZSBnbG9iYWwgZGlzcGF0Y2hlck1hcHBpbmcuCisgICAgICAgICAgICBzd2l0Y2ggKGRpc3BhdGNoZXJNYXBwaW5nKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOT1RfU0VUICA6ICBkaXNwYXRjaGVyTWFwcGluZyA9IEZPUldBUkQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRVJST1IgOiBkaXNwYXRjaGVyTWFwcGluZyA9IEZPUldBUkRfRVJST1I7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5DTFVERSAgOiAgZGlzcGF0Y2hlck1hcHBpbmcgPSBJTkNMVURFX0ZPUldBUkQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5DTFVERV9FUlJPUiAgOiAgZGlzcGF0Y2hlck1hcHBpbmcgPSBJTkNMVURFX0VSUk9SX0ZPUldBUkQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVCA6IGRpc3BhdGNoZXJNYXBwaW5nID0gUkVRVUVTVF9GT1JXQVJEOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJFUVVFU1RfRVJST1IgOiBkaXNwYXRjaGVyTWFwcGluZyA9IFJFUVVFU1RfRVJST1JfRk9SV0FSRDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUX0VSUk9SX0lOQ0xVREUgOiBkaXNwYXRjaGVyTWFwcGluZyA9IFJFUVVFU1RfRVJST1JfRk9SV0FSRF9JTkNMVURFOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJFUVVFU1RfSU5DTFVERSA6IGRpc3BhdGNoZXJNYXBwaW5nID0gUkVRVUVTVF9GT1JXQVJEX0lOQ0xVREU7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGRpc3BhdGNoZXIuZXF1YWxzKCJJTkNMVURFIikpIHsKKyAgICAgICAgICAgIC8vIGFwcGx5IElOQ0xVREUgdG8gdGhlIGdsb2JhbCBkaXNwYXRjaGVyTWFwcGluZy4KKyAgICAgICAgICAgIHN3aXRjaCAoZGlzcGF0Y2hlck1hcHBpbmcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5PVF9TRVQgIDogIGRpc3BhdGNoZXJNYXBwaW5nID0gSU5DTFVERTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFUlJPUiA6IGRpc3BhdGNoZXJNYXBwaW5nID0gSU5DTFVERV9FUlJPUjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGT1JXQVJEICA6ICBkaXNwYXRjaGVyTWFwcGluZyA9IElOQ0xVREVfRk9SV0FSRDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGT1JXQVJEX0VSUk9SICA6ICBkaXNwYXRjaGVyTWFwcGluZyA9IElOQ0xVREVfRVJST1JfRk9SV0FSRDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUIDogZGlzcGF0Y2hlck1hcHBpbmcgPSBSRVFVRVNUX0lOQ0xVREU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9FUlJPUiA6IGRpc3BhdGNoZXJNYXBwaW5nID0gUkVRVUVTVF9FUlJPUl9JTkNMVURFOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJFUVVFU1RfRVJST1JfRk9SV0FSRCA6IGRpc3BhdGNoZXJNYXBwaW5nID0gUkVRVUVTVF9FUlJPUl9GT1JXQVJEX0lOQ0xVREU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9GT1JXQVJEIDogZGlzcGF0Y2hlck1hcHBpbmcgPSBSRVFVRVNUX0ZPUldBUkRfSU5DTFVERTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZGlzcGF0Y2hlci5lcXVhbHMoIlJFUVVFU1QiKSkgeworICAgICAgICAgICAgLy8gYXBwbHkgUkVRVUVTVCB0byB0aGUgZ2xvYmFsIGRpc3BhdGNoZXJNYXBwaW5nLgorICAgICAgICAgICAgc3dpdGNoIChkaXNwYXRjaGVyTWFwcGluZykgeworICAgICAgICAgICAgICAgIGNhc2UgTk9UX1NFVCAgOiAgZGlzcGF0Y2hlck1hcHBpbmcgPSBSRVFVRVNUOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVSUk9SIDogZGlzcGF0Y2hlck1hcHBpbmcgPSBSRVFVRVNUX0VSUk9SOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZPUldBUkQgIDogIGRpc3BhdGNoZXJNYXBwaW5nID0gUkVRVUVTVF9GT1JXQVJEOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZPUldBUkRfRVJST1IgIDogIGRpc3BhdGNoZXJNYXBwaW5nID0gUkVRVUVTVF9FUlJPUl9GT1JXQVJEOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOQ0xVREUgIDogIGRpc3BhdGNoZXJNYXBwaW5nID0gUkVRVUVTVF9JTkNMVURFOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOQ0xVREVfRVJST1IgIDogIGRpc3BhdGNoZXJNYXBwaW5nID0gUkVRVUVTVF9FUlJPUl9JTkNMVURFOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOQ0xVREVfRk9SV0FSRCA6IGRpc3BhdGNoZXJNYXBwaW5nID0gUkVRVUVTVF9GT1JXQVJEX0lOQ0xVREU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5DTFVERV9FUlJPUl9GT1JXQVJEIDogZGlzcGF0Y2hlck1hcHBpbmcgPSBSRVFVRVNUX0VSUk9SX0ZPUldBUkRfSU5DTFVERTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gIGVsc2UgaWYgKGRpc3BhdGNoZXIuZXF1YWxzKCJFUlJPUiIpKSB7CisgICAgICAgICAgICAvLyBhcHBseSBFUlJPUiB0byB0aGUgZ2xvYmFsIGRpc3BhdGNoZXJNYXBwaW5nLgorICAgICAgICAgICAgc3dpdGNoIChkaXNwYXRjaGVyTWFwcGluZykgeworICAgICAgICAgICAgICAgIGNhc2UgTk9UX1NFVCAgOiAgZGlzcGF0Y2hlck1hcHBpbmcgPSBFUlJPUjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGT1JXQVJEICA6ICBkaXNwYXRjaGVyTWFwcGluZyA9IEZPUldBUkRfRVJST1I7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5DTFVERSAgOiAgZGlzcGF0Y2hlck1hcHBpbmcgPSBJTkNMVURFX0VSUk9SOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOQ0xVREVfRk9SV0FSRCA6IGRpc3BhdGNoZXJNYXBwaW5nID0gSU5DTFVERV9FUlJPUl9GT1JXQVJEOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJFUVVFU1QgOiBkaXNwYXRjaGVyTWFwcGluZyA9IFJFUVVFU1RfRVJST1I7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9JTkNMVURFIDogZGlzcGF0Y2hlck1hcHBpbmcgPSBSRVFVRVNUX0VSUk9SX0lOQ0xVREU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9GT1JXQVJEIDogZGlzcGF0Y2hlck1hcHBpbmcgPSBSRVFVRVNUX0VSUk9SX0ZPUldBUkQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9GT1JXQVJEX0lOQ0xVREUgOiBkaXNwYXRjaGVyTWFwcGluZyA9IFJFUVVFU1RfRVJST1JfRk9SV0FSRF9JTkNMVURFOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldERpc3BhdGNoZXJNYXBwaW5nKCkgeworICAgICAgICAvLyBwZXIgdGhlIFNSVi42LjIuNSBhYnNlbmNlIG9mIGFueSBkaXNwYXRjaGVyIGVsZW1lbnRzIGlzCisgICAgICAgIC8vIGVxdWl2ZWxhbnQgdG8gYSBSRVFVRVNUIHZhbHVlCisgICAgICAgIGlmIChkaXNwYXRjaGVyTWFwcGluZyA9PSBOT1RfU0VUKSByZXR1cm4gUkVRVUVTVDsKKyAgICAgICAgZWxzZSByZXR1cm4gZGlzcGF0Y2hlck1hcHBpbmc7IAorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlbmRlciBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkZpbHRlck1hcFsiKTsKKyAgICAgICAgc2IuYXBwZW5kKCJmaWx0ZXJOYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQodGhpcy5maWx0ZXJOYW1lKTsKKyAgICAgICAgaWYgKHNlcnZsZXROYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBzZXJ2bGV0TmFtZT0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzZXJ2bGV0TmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVybFBhdHRlcm4gIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIHVybFBhdHRlcm49Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQodXJsUGF0dGVybik7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9Mb2dpbkNvbmZpZy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9Mb2dpbkNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMTgzMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0xvZ2luQ29uZmlnLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3k7CisKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5SZXF1ZXN0VXRpbDsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGEgbG9naW4gY29uZmlndXJhdGlvbiBlbGVtZW50IGZvciBhIHdlYiBhcHBsaWNhdGlvbiwKKyAqIGFzIHJlcHJlc2VudGVkIGluIGEgPGNvZGU+Jmx0O2xvZ2luLWNvbmZpZyZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlCisgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBMb2dpbkNvbmZpZyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgTG9naW5Db25maWcgd2l0aCBkZWZhdWx0IHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIExvZ2luQ29uZmlnKCkgeworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBMb2dpbkNvbmZpZyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdXRoTWV0aG9kIFRoZSBhdXRoZW50aWNhdGlvbiBtZXRob2QKKyAgICAgKiBAcGFyYW0gcmVhbG1OYW1lIFRoZSByZWFsbSBuYW1lCisgICAgICogQHBhcmFtIGxvZ2luUGFnZSBUaGUgbG9naW4gcGFnZSBVUkkKKyAgICAgKiBAcGFyYW0gZXJyb3JQYWdlIFRoZSBlcnJvciBwYWdlIFVSSQorICAgICAqLworICAgIHB1YmxpYyBMb2dpbkNvbmZpZyhTdHJpbmcgYXV0aE1ldGhvZCwgU3RyaW5nIHJlYWxtTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvZ2luUGFnZSwgU3RyaW5nIGVycm9yUGFnZSkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHNldEF1dGhNZXRob2QoYXV0aE1ldGhvZCk7CisgICAgICAgIHNldFJlYWxtTmFtZShyZWFsbU5hbWUpOworICAgICAgICBzZXRMb2dpblBhZ2UobG9naW5QYWdlKTsKKyAgICAgICAgc2V0RXJyb3JQYWdlKGVycm9yUGFnZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXV0aGVudGljYXRpb24gbWV0aG9kIHRvIHVzZSBmb3IgYXBwbGljYXRpb24gbG9naW4uICBNdXN0IGJlCisgICAgICogQkFTSUMsIERJR0VTVCwgRk9STSwgb3IgQ0xJRU5ULUNFUlQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0aE1ldGhvZCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhNZXRob2QoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5hdXRoTWV0aG9kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRoTWV0aG9kKFN0cmluZyBhdXRoTWV0aG9kKSB7CisgICAgICAgIHRoaXMuYXV0aE1ldGhvZCA9IGF1dGhNZXRob2Q7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dC1yZWxhdGl2ZSBVUkkgb2YgdGhlIGVycm9yIHBhZ2UgZm9yIGZvcm0gbG9naW4uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JQYWdlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JQYWdlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZXJyb3JQYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvclBhZ2UoU3RyaW5nIGVycm9yUGFnZSkgeworICAgICAgICAvLyAgICAgICAgaWYgKChlcnJvclBhZ2UgPT0gbnVsbCkgfHwgIWVycm9yUGFnZS5zdGFydHNXaXRoKCIvIikpCisgICAgICAgIC8vICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAvLyAgICAgICAgICAgICAgICAoIkVycm9yIFBhZ2UgcmVzb3VyY2UgcGF0aCBtdXN0IHN0YXJ0IHdpdGggYSAnLyciKTsKKyAgICAgICAgdGhpcy5lcnJvclBhZ2UgPSBSZXF1ZXN0VXRpbC5VUkxEZWNvZGUoZXJyb3JQYWdlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb250ZXh0LXJlbGF0aXZlIFVSSSBvZiB0aGUgbG9naW4gcGFnZSBmb3IgZm9ybSBsb2dpbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsb2dpblBhZ2UgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRMb2dpblBhZ2UoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5sb2dpblBhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvZ2luUGFnZShTdHJpbmcgbG9naW5QYWdlKSB7CisgICAgICAgIC8vICAgICAgICBpZiAoKGxvZ2luUGFnZSA9PSBudWxsKSB8fCAhbG9naW5QYWdlLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgLy8gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgIC8vICAgICAgICAgICAgICAgICgiTG9naW4gUGFnZSByZXNvdXJjZSBwYXRoIG11c3Qgc3RhcnQgd2l0aCBhICcvJyIpOworICAgICAgICB0aGlzLmxvZ2luUGFnZSA9IFJlcXVlc3RVdGlsLlVSTERlY29kZShsb2dpblBhZ2UpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHJlYWxtIG5hbWUgdXNlZCB3aGVuIGNoYWxsZW5naW5nIHRoZSB1c2VyIGZvciBhdXRoZW50aWNhdGlvbgorICAgICAqIGNyZWRlbnRpYWxzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlYWxtTmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxtTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlYWxtTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVhbG1OYW1lKFN0cmluZyByZWFsbU5hbWUpIHsKKyAgICAgICAgdGhpcy5yZWFsbU5hbWUgPSByZWFsbU5hbWU7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiTG9naW5Db25maWdbIik7CisgICAgICAgIHNiLmFwcGVuZCgiYXV0aE1ldGhvZD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGF1dGhNZXRob2QpOworICAgICAgICBpZiAocmVhbG1OYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCByZWFsbU5hbWU9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQocmVhbG1OYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9naW5QYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBsb2dpblBhZ2U9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQobG9naW5QYWdlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyb3JQYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBlcnJvclBhZ2U9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoZXJyb3JQYWdlKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L01lc3NhZ2VEZXN0aW5hdGlvbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9NZXNzYWdlRGVzdGluYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzU1MjJjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9NZXNzYWdlRGVzdGluYXRpb24uamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveTsKKworCisvKioKKyAqIDxwPlJlcHJlc2VudGF0aW9uIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiBmb3IgYSB3ZWIgYXBwbGljYXRpb24sIGFzCisgKiByZXByZXNlbnRlZCBpbiBhIDxjb2RlPiZsdDttZXNzYWdlLWRlc3RpbmF0aW9uJmd0OzwvY29kZT4gZWxlbWVudAorICogaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIFRvbWNhdCA1LjAKKyAqLworCitwdWJsaWMgY2xhc3MgTWVzc2FnZURlc3RpbmF0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGRlc3RpbmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyBkZXN0aW5hdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkaXNwbGF5TmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGlzcGxheU5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBkaXNwbGF5TmFtZSkgeworICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFyZ2UgaWNvbiBvZiB0aGlzIGRlc3RpbmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGxhcmdlSWNvbiA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhcmdlSWNvbigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxhcmdlSWNvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyBsYXJnZUljb24pIHsKKyAgICAgICAgdGhpcy5sYXJnZUljb24gPSBsYXJnZUljb247CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIGRlc3RpbmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHNtYWxsIGljb24gb2YgdGhpcyBkZXN0aW5hdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzbWFsbEljb24gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRTbWFsbEljb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zbWFsbEljb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNtYWxsSWNvbihTdHJpbmcgc21hbGxJY29uKSB7CisgICAgICAgIHRoaXMuc21hbGxJY29uID0gc21hbGxJY29uOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIk1lc3NhZ2VEZXN0aW5hdGlvblsiKTsKKyAgICAgICAgc2IuYXBwZW5kKCJuYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQobmFtZSk7CisgICAgICAgIGlmIChkaXNwbGF5TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgZGlzcGxheU5hbWU9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoZGlzcGxheU5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChsYXJnZUljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGxhcmdlSWNvbj0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChsYXJnZUljb24pOworICAgICAgICB9CisgICAgICAgIGlmIChzbWFsbEljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIHNtYWxsSWNvbj0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzbWFsbEljb24pOworICAgICAgICB9CisgICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgZGVzY3JpcHRpb249Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoZGVzY3JpcHRpb24pOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvTWVzc2FnZURlc3RpbmF0aW9uUmVmLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L01lc3NhZ2VEZXN0aW5hdGlvblJlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYzYzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L01lc3NhZ2VEZXN0aW5hdGlvblJlZi5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKworLyoqCisgKiA8cD5SZXByZXNlbnRhdGlvbiBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIGZvciBhIHdlYiBhcHBsaWNhdGlvbiwKKyAqIGFzIHJlcHJlc2VudGVkIGluIGEgPGNvZGU+Jmx0O21lc3NhZ2UtZGVzdGluYXRpb24tcmVmJmd0OzwvY29kZT4gZWxlbWVudAorICogaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIFRvbWNhdCA1LjAKKyAqLworCitwdWJsaWMgY2xhc3MgTWVzc2FnZURlc3RpbmF0aW9uUmVmIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGRlc3RpbmF0aW9uIHJlZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGVzY3JpcHRpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGluayBvZiB0aGlzIGRlc3RpbmF0aW9uIHJlZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsaW5rID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGluaygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxpbmspOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIGxpbmspIHsKKyAgICAgICAgdGhpcy5saW5rID0gbGluazsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgZGVzdGluYXRpb24gcmVmLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgdGhpcyBkZXN0aW5hdGlvbiByZWYuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy50eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNhZ2Ugb2YgdGhpcyBkZXN0aW5hdGlvbiByZWYuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNhZ2UgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRVc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnVzYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2FnZShTdHJpbmcgdXNhZ2UpIHsKKyAgICAgICAgdGhpcy51c2FnZSA9IHVzYWdlOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIk1lc3NhZ2VEZXN0aW5hdGlvblsiKTsKKyAgICAgICAgc2IuYXBwZW5kKCJuYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQobmFtZSk7CisgICAgICAgIGlmIChsaW5rICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBsaW5rPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGxpbmspOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCB0eXBlPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHR5cGUpOworICAgICAgICB9CisgICAgICAgIGlmICh1c2FnZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgdXNhZ2U9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQodXNhZ2UpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgZGVzY3JpcHRpb249Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoZGVzY3JpcHRpb24pOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogVGhlIE5hbWluZ1Jlc291cmNlcyB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkIChpZiBhbnkpLgorICAgICAqLworICAgIHByb3RlY3RlZCBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gbnVsbDsKKworICAgIHB1YmxpYyBOYW1pbmdSZXNvdXJjZXMgZ2V0TmFtaW5nUmVzb3VyY2VzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucmVzb3VyY2VzKTsKKyAgICB9CisKKyAgICB2b2lkIHNldE5hbWluZ1Jlc291cmNlcyhOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L05hbWluZ1Jlc291cmNlcy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9OYW1pbmdSZXNvdXJjZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjU4YWU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9OYW1pbmdSZXNvdXJjZXMuamF2YQpAQCAtMCwwICsxLDcxMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveTsKKworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKworLyoqCisgKiBIb2xkcyBhbmQgbWFuYWdlcyB0aGUgbmFtaW5nIHJlc291cmNlcyBkZWZpbmVkIGluIHRoZSBKMkVFIEVudGVycHJpc2UgCisgKiBOYW1pbmcgQ29udGV4dCBhbmQgdGhlaXIgYXNzb2NpYXRlZCBKTkRJIGNvbnRleHQuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgTmFtaW5nUmVzb3VyY2VzIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBOYW1pbmdSZXNvdXJjZXMgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE5hbWluZ1Jlc291cmNlcygpIHsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVkIGNvbnRhaW5lciBvYmplY3QuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgY29udGFpbmVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogTGlzdCBvZiBuYW1pbmcgZW50cmllcywga2V5ZWQgYnkgbmFtZS4gVGhlIHZhbHVlIGlzIHRoZSBlbnRyeSB0eXBlLCBhcworICAgICAqIGRlY2xhcmVkIGJ5IHRoZSB1c2VyLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIGVudHJpZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBFSkIgcmVzb3VyY2UgcmVmZXJlbmNlcyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIGtleWVkIGJ5IG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIGVqYnMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZW52aXJvbm1lbnQgZW50cmllcyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIGtleWVkIGJ5IG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIGVudnMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9jYWwgIEVKQiByZXNvdXJjZSByZWZlcmVuY2VzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwga2V5ZWQgYnkKKyAgICAgKiBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBsb2NhbEVqYnMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2VzcyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sCisgICAgICoga2V5ZWQgYnkgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgbWRycyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwKKyAgICAgKiBrZXllZCBieSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCByZXNvdXJjZUVudlJlZnMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzb3VyY2UgcmVmZXJlbmNlcyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIGtleWVkIGJ5IG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIHJlc291cmNlcyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXNvdXJjZSBsaW5rcyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIGtleWVkIGJ5IG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIHJlc291cmNlTGlua3MgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNhY3Rpb24gZm9yIHRoaXMgd2ViYXBwLgorICAgICAqLworICAgIHByaXZhdGUgQ29udGV4dFRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uID0gbnVsbDsKKyAgICAKKworICAgIC8qKgorICAgICAqIFRoZSBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBzdXBwb3J0ID0gbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY29udGFpbmVyIHdpdGggd2hpY2ggdGhlIG5hbWluZyByZXNvdXJjZXMgYXJlIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRDb250YWluZXIoKSB7CisgICAgICAgIHJldHVybiBjb250YWluZXI7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbnRhaW5lciB3aXRoIHdoaWNoIHRoZSBuYW1pbmcgcmVzb3VyY2VzIGFyZSBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihPYmplY3QgY29udGFpbmVyKSB7CisgICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uKENvbnRleHRUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbikgeworICAgICAgICB0aGlzLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0cmFuc2FjdGlvbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIENvbnRleHRUcmFuc2FjdGlvbiBnZXRUcmFuc2FjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uOworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBFSkIgcmVzb3VyY2UgcmVmZXJlbmNlIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlamIgTmV3IEVKQiByZXNvdXJjZSByZWZlcmVuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFamIoQ29udGV4dEVqYiBlamIpIHsKKworICAgICAgICBpZiAoZW50cmllcy5jb250YWluc0tleShlamIuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW50cmllcy5wdXQoZWpiLmdldE5hbWUoKSwgZWpiLmdldFR5cGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKGVqYnMpIHsKKyAgICAgICAgICAgIGVqYi5zZXROYW1pbmdSZXNvdXJjZXModGhpcyk7CisgICAgICAgICAgICBlamJzLnB1dChlamIuZ2V0TmFtZSgpLCBlamIpOworICAgICAgICB9CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJlamIiLCBudWxsLCBlamIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZW52aXJvbm1lbnQgZW50cnkgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGVudmlyb25tZW50IE5ldyBlbnZpcm9ubWVudCBlbnRyeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEVudmlyb25tZW50KENvbnRleHRFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgeworCisgICAgICAgIGlmIChlbnRyaWVzLmNvbnRhaW5zS2V5KGVudmlyb25tZW50LmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIGlmIChmaW5kRW52aXJvbm1lbnQoZW52aXJvbm1lbnQuZ2V0TmFtZSgpKS5nZXRPdmVycmlkZSgpKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlRW52aXJvbm1lbnQoZW52aXJvbm1lbnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBlbnRyaWVzLnB1dChlbnZpcm9ubWVudC5nZXROYW1lKCksIGVudmlyb25tZW50LmdldFR5cGUoKSk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChlbnZzKSB7CisgICAgICAgICAgICBlbnZpcm9ubWVudC5zZXROYW1pbmdSZXNvdXJjZXModGhpcyk7CisgICAgICAgICAgICBlbnZzLnB1dChlbnZpcm9ubWVudC5nZXROYW1lKCksIGVudmlyb25tZW50KTsKKyAgICAgICAgfQorICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiZW52aXJvbm1lbnQiLCBudWxsLCBlbnZpcm9ubWVudCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGxvY2FsIEVKQiByZXNvdXJjZSByZWZlcmVuY2UgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGVqYiBOZXcgRUpCIHJlc291cmNlIHJlZmVyZW5jZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExvY2FsRWpiKENvbnRleHRMb2NhbEVqYiBlamIpIHsKKworICAgICAgICBpZiAoZW50cmllcy5jb250YWluc0tleShlamIuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW50cmllcy5wdXQoZWpiLmdldE5hbWUoKSwgZWpiLmdldFR5cGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2FsRWpicykgeworICAgICAgICAgICAgZWpiLnNldE5hbWluZ1Jlc291cmNlcyh0aGlzKTsKKyAgICAgICAgICAgIGxvY2FsRWpicy5wdXQoZWpiLmdldE5hbWUoKSwgZWpiKTsKKyAgICAgICAgfQorICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgibG9jYWxFamIiLCBudWxsLCBlamIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWRyIE5ldyBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2VEZXN0aW5hdGlvblJlZihNZXNzYWdlRGVzdGluYXRpb25SZWYgbWRyKSB7CisKKyAgICAgICAgaWYgKGVudHJpZXMuY29udGFpbnNLZXkobWRyLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVudHJpZXMucHV0KG1kci5nZXROYW1lKCksIG1kci5nZXRUeXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChtZHJzKSB7CisgICAgICAgICAgICBtZHIuc2V0TmFtaW5nUmVzb3VyY2VzKHRoaXMpOworICAgICAgICAgICAgbWRycy5wdXQobWRyLmdldE5hbWUoKSwgbWRyKTsKKyAgICAgICAgfQorICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgibWVzc2FnZURlc3RpbmF0aW9uUmVmIiwgbnVsbCwgbWRyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBzdXBwb3J0LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSByZXNvdXJjZSByZWZlcmVuY2UgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIE5ldyByZXNvdXJjZSByZWZlcmVuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZShDb250ZXh0UmVzb3VyY2UgcmVzb3VyY2UpIHsKKworICAgICAgICBpZiAoZW50cmllcy5jb250YWluc0tleShyZXNvdXJjZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbnRyaWVzLnB1dChyZXNvdXJjZS5nZXROYW1lKCksIHJlc291cmNlLmdldFR5cGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc291cmNlcykgeworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0TmFtaW5nUmVzb3VyY2VzKHRoaXMpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1dChyZXNvdXJjZS5nZXROYW1lKCksIHJlc291cmNlKTsKKyAgICAgICAgfQorICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicmVzb3VyY2UiLCBudWxsLCByZXNvdXJjZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIHJlc291cmNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVzb3VyY2VFbnZSZWYoQ29udGV4dFJlc291cmNlRW52UmVmIHJlc291cmNlKSB7CisKKyAgICAgICAgaWYgKGVudHJpZXMuY29udGFpbnNLZXkocmVzb3VyY2UuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW50cmllcy5wdXQocmVzb3VyY2UuZ2V0TmFtZSgpLCByZXNvdXJjZS5nZXRUeXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChsb2NhbEVqYnMpIHsKKyAgICAgICAgICAgIHJlc291cmNlLnNldE5hbWluZ1Jlc291cmNlcyh0aGlzKTsKKyAgICAgICAgICAgIHJlc291cmNlRW52UmVmcy5wdXQocmVzb3VyY2UuZ2V0TmFtZSgpLCByZXNvdXJjZSk7CisgICAgICAgIH0KKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInJlc291cmNlRW52UmVmIiwgbnVsbCwgcmVzb3VyY2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSByZXNvdXJjZSBsaW5rIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUxpbmsgTmV3IHJlc291cmNlIGxpbmsKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZUxpbmsoQ29udGV4dFJlc291cmNlTGluayByZXNvdXJjZUxpbmspIHsKKworICAgICAgICBpZiAoZW50cmllcy5jb250YWluc0tleShyZXNvdXJjZUxpbmsuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gcmVzb3VyY2VMaW5rLmdldFR5cGUoKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVudHJpZXMucHV0KHJlc291cmNlTGluay5nZXROYW1lKCksIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAocmVzb3VyY2VMaW5rcykgeworICAgICAgICAgICAgcmVzb3VyY2VMaW5rLnNldE5hbWluZ1Jlc291cmNlcyh0aGlzKTsKKyAgICAgICAgICAgIHJlc291cmNlTGlua3MucHV0KHJlc291cmNlTGluay5nZXROYW1lKCksIHJlc291cmNlTGluayk7CisgICAgICAgIH0KKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInJlc291cmNlTGluayIsIG51bGwsIHJlc291cmNlTGluayk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgRUpCIHJlc291cmNlIHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgaWYgYW55OworICAgICAqIG90aGVyd2lzZSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgZGVzaXJlZCBFSkIgcmVzb3VyY2UgcmVmZXJlbmNlCisgICAgICovCisgICAgcHVibGljIENvbnRleHRFamIgZmluZEVqYihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoZWpicykgeworICAgICAgICAgICAgcmV0dXJuICgoQ29udGV4dEVqYikgZWpicy5nZXQobmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmaW5lZCBFSkIgcmVzb3VyY2UgcmVmZXJlbmNlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKiBJZiB0aGVyZSBhcmUgbm9uZSwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dEVqYltdIGZpbmRFamJzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoZWpicykgeworICAgICAgICAgICAgQ29udGV4dEVqYiByZXN1bHRzW10gPSBuZXcgQ29udGV4dEVqYltlamJzLnNpemUoKV07CisgICAgICAgICAgICByZXR1cm4gKChDb250ZXh0RWpiW10pIGVqYnMudmFsdWVzKCkudG9BcnJheShyZXN1bHRzKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgaWYgYW55OworICAgICAqIG90aGVyd2lzZSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgZGVzaXJlZCBlbnZpcm9ubWVudCBlbnRyeQorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0RW52aXJvbm1lbnQgZmluZEVudmlyb25tZW50KFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChlbnZzKSB7CisgICAgICAgICAgICByZXR1cm4gKChDb250ZXh0RW52aXJvbm1lbnQpIGVudnMuZ2V0KG5hbWUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBkZWZpbmVkIGVudmlyb25tZW50IGVudHJpZXMgZm9yIHRoaXMgd2ViCisgICAgICogYXBwbGljYXRpb24uICBJZiBub25lIGhhdmUgYmVlbiBkZWZpbmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5CisgICAgICogaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIENvbnRleHRFbnZpcm9ubWVudFtdIGZpbmRFbnZpcm9ubWVudHMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChlbnZzKSB7CisgICAgICAgICAgICBDb250ZXh0RW52aXJvbm1lbnQgcmVzdWx0c1tdID0gbmV3IENvbnRleHRFbnZpcm9ubWVudFtlbnZzLnNpemUoKV07CisgICAgICAgICAgICByZXR1cm4gKChDb250ZXh0RW52aXJvbm1lbnRbXSkgZW52cy52YWx1ZXMoKS50b0FycmF5KHJlc3VsdHMpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2FsIEVKQiByZXNvdXJjZSByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIGlmIGFueTsKKyAgICAgKiBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGRlc2lyZWQgRUpCIHJlc291cmNlIHJlZmVyZW5jZQorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0TG9jYWxFamIgZmluZExvY2FsRWpiKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChsb2NhbEVqYnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKENvbnRleHRMb2NhbEVqYikgbG9jYWxFamJzLmdldChuYW1lKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWZpbmVkIGxvY2FsIEVKQiByZXNvdXJjZSByZWZlcmVuY2VzIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqIElmIHRoZXJlIGFyZSBub25lLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0TG9jYWxFamJbXSBmaW5kTG9jYWxFamJzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobG9jYWxFamJzKSB7CisgICAgICAgICAgICBDb250ZXh0TG9jYWxFamIgcmVzdWx0c1tdID0gbmV3IENvbnRleHRMb2NhbEVqYltsb2NhbEVqYnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIHJldHVybiAoKENvbnRleHRMb2NhbEVqYltdKSBsb2NhbEVqYnMudmFsdWVzKCkudG9BcnJheShyZXN1bHRzKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwKKyAgICAgKiBpZiBhbnk7IG90aGVyd2lzZSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgZGVzaXJlZCBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZQorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25SZWYgZmluZE1lc3NhZ2VEZXN0aW5hdGlvblJlZihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobWRycykgeworICAgICAgICAgICAgcmV0dXJuICgoTWVzc2FnZURlc3RpbmF0aW9uUmVmKSBtZHJzLmdldChuYW1lKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWZpbmVkIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKiBJZiB0aGVyZSBhcmUgbm9uZSwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uUmVmW10gZmluZE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtZHJzKSB7CisgICAgICAgICAgICBNZXNzYWdlRGVzdGluYXRpb25SZWYgcmVzdWx0c1tdID0KKyAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZURlc3RpbmF0aW9uUmVmW21kcnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIHJldHVybiAoKE1lc3NhZ2VEZXN0aW5hdGlvblJlZltdKSBtZHJzLnZhbHVlcygpLnRvQXJyYXkocmVzdWx0cykpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBpZiBhbnk7CisgICAgICogb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGRlc2lyZWQgcmVzb3VyY2UgcmVmZXJlbmNlCisgICAgICovCisgICAgcHVibGljIENvbnRleHRSZXNvdXJjZSBmaW5kUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc291cmNlcykgeworICAgICAgICAgICAgcmV0dXJuICgoQ29udGV4dFJlc291cmNlKSByZXNvdXJjZXMuZ2V0KG5hbWUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxpbmsgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIGlmIGFueTsKKyAgICAgKiBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgZGVzaXJlZCByZXNvdXJjZSBsaW5rCisgICAgICovCisgICAgcHVibGljIENvbnRleHRSZXNvdXJjZUxpbmsgZmluZFJlc291cmNlTGluayhTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocmVzb3VyY2VMaW5rcykgeworICAgICAgICAgICAgcmV0dXJuICgoQ29udGV4dFJlc291cmNlTGluaykgcmVzb3VyY2VMaW5rcy5nZXQobmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmaW5lZCByZXNvdXJjZSBsaW5rcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gIElmCisgICAgICogbm9uZSBoYXZlIGJlZW4gZGVmaW5lZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dFJlc291cmNlTGlua1tdIGZpbmRSZXNvdXJjZUxpbmtzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocmVzb3VyY2VMaW5rcykgeworICAgICAgICAgICAgQ29udGV4dFJlc291cmNlTGluayByZXN1bHRzW10gPSAKKyAgICAgICAgICAgICAgICBuZXcgQ29udGV4dFJlc291cmNlTGlua1tyZXNvdXJjZUxpbmtzLnNpemUoKV07CisgICAgICAgICAgICByZXR1cm4gKChDb250ZXh0UmVzb3VyY2VMaW5rW10pIHJlc291cmNlTGlua3MudmFsdWVzKCkKKyAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkocmVzdWx0cykpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmaW5lZCByZXNvdXJjZSByZWZlcmVuY2VzIGZvciB0aGlzIGFwcGxpY2F0aW9uLiAgSWYKKyAgICAgKiBub25lIGhhdmUgYmVlbiBkZWZpbmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0UmVzb3VyY2VbXSBmaW5kUmVzb3VyY2VzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocmVzb3VyY2VzKSB7CisgICAgICAgICAgICBDb250ZXh0UmVzb3VyY2UgcmVzdWx0c1tdID0gbmV3IENvbnRleHRSZXNvdXJjZVtyZXNvdXJjZXMuc2l6ZSgpXTsKKyAgICAgICAgICAgIHJldHVybiAoKENvbnRleHRSZXNvdXJjZVtdKSByZXNvdXJjZXMudmFsdWVzKCkudG9BcnJheShyZXN1bHRzKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIG5hbWUsIGlmIGFueTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGRlc2lyZWQgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlCisgICAgICovCisgICAgcHVibGljIENvbnRleHRSZXNvdXJjZUVudlJlZiBmaW5kUmVzb3VyY2VFbnZSZWYoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc291cmNlRW52UmVmcykgeworICAgICAgICAgICAgcmV0dXJuICgoQ29udGV4dFJlc291cmNlRW52UmVmKSByZXNvdXJjZUVudlJlZnMuZ2V0KG5hbWUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgbmFtZXMgZm9yIHRoaXMKKyAgICAgKiB3ZWIgYXBwbGljYXRpb24uICBJZiBub25lIGhhdmUgYmVlbiBzcGVjaWZpZWQsIGEgemVyby1sZW5ndGgKKyAgICAgKiBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dFJlc291cmNlRW52UmVmW10gZmluZFJlc291cmNlRW52UmVmcygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc291cmNlRW52UmVmcykgeworICAgICAgICAgICAgQ29udGV4dFJlc291cmNlRW52UmVmIHJlc3VsdHNbXSA9IG5ldyBDb250ZXh0UmVzb3VyY2VFbnZSZWZbcmVzb3VyY2VFbnZSZWZzLnNpemUoKV07CisgICAgICAgICAgICByZXR1cm4gKChDb250ZXh0UmVzb3VyY2VFbnZSZWZbXSkgcmVzb3VyY2VFbnZSZWZzLnZhbHVlcygpLnRvQXJyYXkocmVzdWx0cykpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBuYW1lIHNwZWNpZmllZCBhbHJlYWR5IGV4aXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICByZXR1cm4gKGVudHJpZXMuY29udGFpbnNLZXkobmFtZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IEVKQiByZXNvdXJjZSByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBFSkIgcmVzb3VyY2UgcmVmZXJlbmNlIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUVqYihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGVudHJpZXMucmVtb3ZlKG5hbWUpOworCisgICAgICAgIENvbnRleHRFamIgZWpiID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChlamJzKSB7CisgICAgICAgICAgICBlamIgPSAoQ29udGV4dEVqYikgZWpicy5yZW1vdmUobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVqYiAhPSBudWxsKSB7CisgICAgICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiZWpiIiwgZWpiLCBudWxsKTsKKyAgICAgICAgICAgIGVqYi5zZXROYW1pbmdSZXNvdXJjZXMobnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBlbnZpcm9ubWVudCBlbnRyeSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5IHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUVudmlyb25tZW50KFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgZW50cmllcy5yZW1vdmUobmFtZSk7CisKKyAgICAgICAgQ29udGV4dEVudmlyb25tZW50IGVudmlyb25tZW50ID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChlbnZzKSB7CisgICAgICAgICAgICBlbnZpcm9ubWVudCA9IChDb250ZXh0RW52aXJvbm1lbnQpIGVudnMucmVtb3ZlKG5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChlbnZpcm9ubWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiZW52aXJvbm1lbnQiLCBlbnZpcm9ubWVudCwgbnVsbCk7CisgICAgICAgICAgICBlbnZpcm9ubWVudC5zZXROYW1pbmdSZXNvdXJjZXMobnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBsb2NhbCBFSkIgcmVzb3VyY2UgcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgRUpCIHJlc291cmNlIHJlZmVyZW5jZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMb2NhbEVqYihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGVudHJpZXMucmVtb3ZlKG5hbWUpOworCisgICAgICAgIENvbnRleHRMb2NhbEVqYiBsb2NhbEVqYiA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAobG9jYWxFamJzKSB7CisgICAgICAgICAgICBsb2NhbEVqYiA9IChDb250ZXh0TG9jYWxFamIpIGVqYnMucmVtb3ZlKG5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChsb2NhbEVqYiAhPSBudWxsKSB7CisgICAgICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgibG9jYWxFamIiLCBsb2NhbEVqYiwgbnVsbCk7CisgICAgICAgICAgICBsb2NhbEVqYi5zZXROYW1pbmdSZXNvdXJjZXMobnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVzb3VyY2UgcmVmZXJlbmNlIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGVudHJpZXMucmVtb3ZlKG5hbWUpOworCisgICAgICAgIE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBtZHIgPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1kcnMpIHsKKyAgICAgICAgICAgIG1kciA9IChNZXNzYWdlRGVzdGluYXRpb25SZWYpIG1kcnMucmVtb3ZlKG5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChtZHIgIT0gbnVsbCkgeworICAgICAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm1lc3NhZ2VEZXN0aW5hdGlvblJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZHIsIG51bGwpOworICAgICAgICAgICAgbWRyLnNldE5hbWluZ1Jlc291cmNlcyhudWxsKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgc3VwcG9ydC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSByZXNvdXJjZSByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXNvdXJjZSByZWZlcmVuY2UgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBlbnRyaWVzLnJlbW92ZShuYW1lKTsKKworICAgICAgICBDb250ZXh0UmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc291cmNlcykgeworICAgICAgICAgICAgcmVzb3VyY2UgPSAoQ29udGV4dFJlc291cmNlKSByZXNvdXJjZXMucmVtb3ZlKG5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicmVzb3VyY2UiLCByZXNvdXJjZSwgbnVsbCk7CisgICAgICAgICAgICByZXNvdXJjZS5zZXROYW1pbmdSZXNvdXJjZXMobnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VFbnZSZWYoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBlbnRyaWVzLnJlbW92ZShuYW1lKTsKKworICAgICAgICBTdHJpbmcgdHlwZSA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAocmVzb3VyY2VFbnZSZWZzKSB7CisgICAgICAgICAgICB0eXBlID0gKFN0cmluZykgcmVzb3VyY2VFbnZSZWZzLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicmVzb3VyY2VFbnZSZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSArICI6IiArIHR5cGUsIG51bGwpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgcmVzb3VyY2UgbGluayB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHJlc291cmNlIGxpbmsgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VMaW5rKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgZW50cmllcy5yZW1vdmUobmFtZSk7CisKKyAgICAgICAgQ29udGV4dFJlc291cmNlTGluayByZXNvdXJjZUxpbmsgPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc291cmNlTGlua3MpIHsKKyAgICAgICAgICAgIHJlc291cmNlTGluayA9IChDb250ZXh0UmVzb3VyY2VMaW5rKSByZXNvdXJjZUxpbmtzLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzb3VyY2VMaW5rICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJyZXNvdXJjZUxpbmsiLCByZXNvdXJjZUxpbmssIG51bGwpOworICAgICAgICAgICAgcmVzb3VyY2VMaW5rLnNldE5hbWluZ1Jlc291cmNlcyhudWxsKTsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvUmVzb3VyY2VCYXNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L1Jlc291cmNlQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjEzNjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L1Jlc291cmNlQmFzZS5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisKKy8qKgorICogUmVwcmVzZW50YXRpb24gb2YgYW4gQ29udGV4dCBlbGVtZW50CisgKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaCAocGVyb0BhcGFjaGUub3JnKQorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VCYXNlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIENvbnRleHQgRWxlbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGVzY3JpcHRpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgY29udGV4dCBFbGVtZW50LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIEVKQiBiZWFuIGltcGxlbWVudGF0aW9uIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHR5cGUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudHlwZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSG9sZGVyIGZvciBvdXIgY29uZmlndXJlZCBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvbmZpZ3VyZWQgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXQobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgY29uZmlndXJlZCBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogcmVtb3ZlIGEgY29uZmlndXJlZCBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcgbmFtZSkgeworICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaXN0IHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGxpc3RQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydGllcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogVGhlIE5hbWluZ1Jlc291cmNlcyB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkIChpZiBhbnkpLgorICAgICAqLworICAgIHByb3RlY3RlZCBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gbnVsbDsKKworICAgIHB1YmxpYyBOYW1pbmdSZXNvdXJjZXMgZ2V0TmFtaW5nUmVzb3VyY2VzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucmVzb3VyY2VzKTsKKyAgICB9CisKKyAgICB2b2lkIHNldE5hbWluZ1Jlc291cmNlcyhOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L1NlY3VyaXR5Q29sbGVjdGlvbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9TZWN1cml0eUNvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDA0OTk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9TZWN1cml0eUNvbGxlY3Rpb24uamF2YQpAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveTsKKworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlJlcXVlc3RVdGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGEgd2ViIHJlc291cmNlIGNvbGxlY3Rpb24gZm9yIGEgd2ViIGFwcGxpY2F0aW9uJ3Mgc2VjdXJpdHkKKyAqIGNvbnN0cmFpbnQsIGFzIHJlcHJlc2VudGVkIGluIGEgPGNvZGU+Jmx0O3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uJmd0OzwvY29kZT4KKyAqIGVsZW1lbnQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAqIDxwPgorICogPGI+V0FSTklORzwvYj46ICBJdCBpcyBhc3N1bWVkIHRoYXQgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3Mgd2lsbCBiZSBjcmVhdGVkCisgKiBhbmQgbW9kaWZpZWQgb25seSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYSBzaW5nbGUgdGhyZWFkLCBiZWZvcmUgdGhlIGluc3RhbmNlCisgKiBpcyBtYWRlIHZpc2libGUgdG8gdGhlIHJlbWFpbmRlciBvZiB0aGUgYXBwbGljYXRpb24uICBBZnRlciB0aGF0LCBvbmx5IHJlYWQKKyAqIGFjY2VzcyBpcyBleHBlY3RlZC4gIFRoZXJlZm9yZSwgbm9uZSBvZiB0aGUgcmVhZCBhbmQgd3JpdGUgYWNjZXNzIHdpdGhpbgorICogdGhpcyBjbGFzcyBpcyBzeW5jaHJvbml6ZWQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZWN1cml0eUNvbGxlY3Rpb24gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNlY3VyaXR5Q29sbGVjdGlvbi5jbGFzcyk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgc2VjdXJpdHkgY29sbGVjdGlvbiBpbnN0YW5jZSB3aXRoIGRlZmF1bHQgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBTZWN1cml0eUNvbGxlY3Rpb24oKSB7CisKKyAgICAgICAgdGhpcyhudWxsLCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHNlY3VyaXR5IGNvbGxlY3Rpb24gaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGlzIHNlY3VyaXR5IGNvbGxlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VjdXJpdHlDb2xsZWN0aW9uKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgdGhpcyhuYW1lLCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHNlY3VyaXR5IGNvbGxlY3Rpb24gaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGlzIHNlY3VyaXR5IGNvbGxlY3Rpb24KKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhpcyBzZWN1cml0eSBjb2xsZWN0aW9uCisgICAgICovCisgICAgcHVibGljIFNlY3VyaXR5Q29sbGVjdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpb24gb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBIVFRQIG1ldGhvZHMgY292ZXJlZCBieSB0aGlzIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1ldGhvZHNbXSA9IG5ldyBTdHJpbmdbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgd2ViIHJlc291cmNlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBVUkwgcGF0dGVybnMgcHJvdGVjdGVkIGJ5IHRoaXMgc2VjdXJpdHkgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXR0ZXJuc1tdID0gbmV3IFN0cmluZ1swXTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5kZXNjcmlwdGlvbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgbmV3IGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLm5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5ldyBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gSFRUUCByZXF1ZXN0IG1ldGhvZCB0byBiZSBwYXJ0IG9mIHRoaXMgd2ViIHJlc291cmNlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTWV0aG9kKFN0cmluZyBtZXRob2QpIHsKKworICAgICAgICBpZiAobWV0aG9kID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW21ldGhvZHMubGVuZ3RoICsgMV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHJlc3VsdHNbaV0gPSBtZXRob2RzW2ldOworICAgICAgICByZXN1bHRzW21ldGhvZHMubGVuZ3RoXSA9IG1ldGhvZDsKKyAgICAgICAgbWV0aG9kcyA9IHJlc3VsdHM7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIFVSTCBwYXR0ZXJuIHRvIGJlIHBhcnQgb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7CisKKyAgICAgICAgaWYgKHBhdHRlcm4gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBCdWd6aWxsYSAzNDgwNTogYWRkIGZyaWVuZGx5IHdhcm5pbmcuCisgICAgICAgIGlmKHBhdHRlcm4uZW5kc1dpdGgoIioiKSkgeworICAgICAgICAgIGlmIChwYXR0ZXJuLmNoYXJBdChwYXR0ZXJuLmxlbmd0aCgpLTEpICE9ICcvJykgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgIGxvZy53YXJuKCJTdXNwaWNpb3VzIHVybCBwYXR0ZXJuOiBcIiIgKyBwYXR0ZXJuICsgIlwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICIgLSBzZWUgaHR0cDovL2phdmEuc3VuLmNvbS9hYm91dEphdmEvY29tbXVuaXR5cHJvY2Vzcy9maXJzdC9qc3IwNTMvc2VydmxldDIzX1BGRC5wZGYiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgc2VjdGlvbiAxMS4yIiApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBhdHRlcm4gPSBSZXF1ZXN0VXRpbC5VUkxEZWNvZGUocGF0dGVybik7CisgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW3BhdHRlcm5zLmxlbmd0aCArIDFdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHRzW2ldID0gcGF0dGVybnNbaV07CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0c1twYXR0ZXJucy5sZW5ndGhdID0gcGF0dGVybjsKKyAgICAgICAgcGF0dGVybnMgPSByZXN1bHRzOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QgbWV0aG9kIGlzCisgICAgICogcGFydCBvZiB0aGlzIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZCBSZXF1ZXN0IG1ldGhvZCB0byBjaGVjaworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGZpbmRNZXRob2QoU3RyaW5nIG1ldGhvZCkgeworCisgICAgICAgIGlmIChtZXRob2RzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWV0aG9kc1tpXS5lcXVhbHMobWV0aG9kKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBIVFRQIHJlcXVlc3QgbWV0aG9kcyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgd2ViCisgICAgICogcmVzb3VyY2UgY29sbGVjdGlvbiwgb3IgYSB6ZXJvLWxlbmd0aCBhcnJheSBpZiBhbGwgcmVxdWVzdCBtZXRob2RzCisgICAgICogYXJlIGluY2x1ZGVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kTWV0aG9kcygpIHsKKworICAgICAgICByZXR1cm4gKG1ldGhvZHMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gcGFydCBvZiB0aGlzIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9uPworICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gUGF0dGVybiB0byBiZSBjb21wYXJlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGZpbmRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXR0ZXJucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHBhdHRlcm5zW2ldLmVxdWFscyhwYXR0ZXJuKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBVUkwgcGF0dGVybnMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIHdlYiByZXNvdXJjZQorICAgICAqIGNvbGxlY3Rpb24uICBJZiBub25lIGhhdmUgYmVlbiBzcGVjaWZpZWQsIGEgemVyby1sZW5ndGggYXJyYXkgaXMKKyAgICAgKiByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZFBhdHRlcm5zKCkgeworCisgICAgICAgIHJldHVybiAocGF0dGVybnMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QgbWV0aG9kIGZyb20gdGhvc2UgdGhhdCBhcmUgcGFydAorICAgICAqIG9mIHRoaXMgd2ViIHJlc291cmNlIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kIFJlcXVlc3QgbWV0aG9kIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNZXRob2QoU3RyaW5nIG1ldGhvZCkgeworCisgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaW50IG4gPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWV0aG9kc1tpXS5lcXVhbHMobWV0aG9kKSkgeworICAgICAgICAgICAgICAgIG4gPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuID49IDApIHsKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW21ldGhvZHMubGVuZ3RoIC0gMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBuKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2orK10gPSBtZXRob2RzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWV0aG9kcyA9IHJlc3VsdHM7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgVVJMIHBhdHRlcm4gZnJvbSB0aG9zZSB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMKKyAgICAgKiB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIFBhdHRlcm4gdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhdHRlcm4oU3RyaW5nIHBhdHRlcm4pIHsKKworICAgICAgICBpZiAocGF0dGVybiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpbnQgbiA9IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocGF0dGVybnNbaV0uZXF1YWxzKHBhdHRlcm4pKSB7CisgICAgICAgICAgICAgICAgbiA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4gPj0gMCkgeworICAgICAgICAgICAgaW50IGogPSAwOworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9IG5ldyBTdHJpbmdbcGF0dGVybnMubGVuZ3RoIC0gMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gbikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tqKytdID0gcGF0dGVybnNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXR0ZXJucyA9IHJlc3VsdHM7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2VjdXJpdHkgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlNlY3VyaXR5Q29sbGVjdGlvblsiKTsKKyAgICAgICAgc2IuYXBwZW5kKG5hbWUpOworICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGRlc2NyaXB0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L1NlY3VyaXR5Q29uc3RyYWludC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9TZWN1cml0eUNvbnN0cmFpbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGE2MDRmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9TZWN1cml0eUNvbnN0cmFpbnQuamF2YQpAQCAtMCwwICsxLDQ2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisKKy8qKgorICogUmVwcmVzZW50YXRpb24gb2YgYSBzZWN1cml0eSBjb25zdHJhaW50IGVsZW1lbnQgZm9yIGEgd2ViIGFwcGxpY2F0aW9uLAorICogYXMgcmVwcmVzZW50ZWQgaW4gYSA8Y29kZT4mbHQ7c2VjdXJpdHktY29uc3RyYWludCZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlCisgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgKiA8cD4KKyAqIDxiPldBUk5JTkc8L2I+OiAgSXQgaXMgYXNzdW1lZCB0aGF0IGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHdpbGwgYmUgY3JlYXRlZAorICogYW5kIG1vZGlmaWVkIG9ubHkgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgc2luZ2xlIHRocmVhZCwgYmVmb3JlIHRoZSBpbnN0YW5jZQorICogaXMgbWFkZSB2aXNpYmxlIHRvIHRoZSByZW1haW5kZXIgb2YgdGhlIGFwcGxpY2F0aW9uLiAgQWZ0ZXIgdGhhdCwgb25seSByZWFkCisgKiBhY2Nlc3MgaXMgZXhwZWN0ZWQuICBUaGVyZWZvcmUsIG5vbmUgb2YgdGhlIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyB3aXRoaW4KKyAqIHRoaXMgY2xhc3MgaXMgc3luY2hyb25pemVkLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2VjdXJpdHlDb25zdHJhaW50IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzZWN1cml0eSBjb25zdHJhaW50IGluc3RhbmNlIHdpdGggZGVmYXVsdCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIFNlY3VyaXR5Q29uc3RyYWludCgpIHsKKworICAgICAgICBzdXBlcigpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogV2FzIHRoZSAiYWxsIHJvbGVzIiB3aWxkY2FyZCBpbmNsdWRlZCBpbiB0aGUgYXV0aG9yaXphdGlvbiBjb25zdHJhaW50cworICAgICAqIGZvciB0aGlzIHNlY3VyaXR5IGNvbnN0cmFpbnQ/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFsbFJvbGVzID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFdhcyBhbiBhdXRob3JpemF0aW9uIGNvbnN0cmFpbnQgaW5jbHVkZWQgaW4gdGhpcyBzZWN1cml0eSBjb25zdHJhaW50PworICAgICAqIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGRpc3Rpbmd1aXNoIHRoZSBjYXNlIHdoZXJlIGFuIGF1dGgtY29uc3RyYWludCB3aXRoCisgICAgICogbm8gcm9sZXMgKHNpZ25pZnlpbmcgbm8gZGlyZWN0IGFjY2VzcyBhdCBhbGwpIHdhcyByZXF1ZXN0ZWQsIHZlcnN1cworICAgICAqIGEgbGFjayBvZiBhdXRoLWNvbnN0cmFpbnQgd2hpY2ggaW1wbGllcyBubyBhY2Nlc3MgY29udHJvbCBjaGVja2luZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYXV0aENvbnN0cmFpbnQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiByb2xlcyBwZXJtaXR0ZWQgdG8gYWNjZXNzIHJlc291cmNlcyBwcm90ZWN0ZWQgYnkgdGhpcworICAgICAqIHNlY3VyaXR5IGNvbnN0cmFpbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0aFJvbGVzW10gPSBuZXcgU3RyaW5nWzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9ucyBwcm90ZWN0ZWQgYnkgdGhpcyBzZWN1cml0eQorICAgICAqIGNvbnN0cmFpbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBTZWN1cml0eUNvbGxlY3Rpb24gY29sbGVjdGlvbnNbXSA9IG5ldyBTZWN1cml0eUNvbGxlY3Rpb25bMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyBzZWN1cml0eSBjb25zdHJhaW50LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRpc3BsYXlOYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHVzZXIgZGF0YSBjb25zdHJhaW50IGZvciB0aGlzIHNlY3VyaXR5IGNvbnN0cmFpbnQuICBNdXN0IGJlIE5PTkUsCisgICAgICogSU5URUdSQUwsIG9yIENPTkZJREVOVElBTC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2VyQ29uc3RyYWludCA9ICJOT05FIjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFdhcyB0aGUgImFsbCByb2xlcyIgd2lsZGNhcmQgaW5jbHVkZWQgaW4gdGhpcyBhdXRoZW50aWNhdGlvbgorICAgICAqIGNvbnN0cmFpbnQ/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QWxsUm9sZXMoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmFsbFJvbGVzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhdXRob3JpemF0aW9uIGNvbnN0cmFpbnQgcHJlc2VudCBmbGFnIGZvciB0aGlzIHNlY3VyaXR5CisgICAgICogY29uc3RyYWludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBdXRoQ29uc3RyYWludCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuYXV0aENvbnN0cmFpbnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGF1dGhvcml6YXRpb24gY29uc3RyYWludCBwcmVzZW50IGZsYWcgZm9yIHRoaXMgc2VjdXJpdHkKKyAgICAgKiBjb25zdHJhaW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dGhDb25zdHJhaW50KGJvb2xlYW4gYXV0aENvbnN0cmFpbnQpIHsKKworICAgICAgICB0aGlzLmF1dGhDb25zdHJhaW50ID0gYXV0aENvbnN0cmFpbnQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlzcGxheSBuYW1lIG9mIHRoaXMgc2VjdXJpdHkgY29uc3RyYWludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5kaXNwbGF5TmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlzcGxheSBuYW1lIG9mIHRoaXMgc2VjdXJpdHkgY29uc3RyYWludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpIHsKKworICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlciBkYXRhIGNvbnN0cmFpbnQgZm9yIHRoaXMgc2VjdXJpdHkgY29uc3RyYWludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJDb25zdHJhaW50KCkgeworCisgICAgICAgIHJldHVybiAodXNlckNvbnN0cmFpbnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVzZXIgZGF0YSBjb25zdHJhaW50IGZvciB0aGlzIHNlY3VyaXR5IGNvbnN0cmFpbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlckNvbnN0cmFpbnQgVGhlIG5ldyB1c2VyIGRhdGEgY29uc3RyYWludAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJDb25zdHJhaW50KFN0cmluZyB1c2VyQ29uc3RyYWludCkgeworCisgICAgICAgIGlmICh1c2VyQ29uc3RyYWludCAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy51c2VyQ29uc3RyYWludCA9IHVzZXJDb25zdHJhaW50OworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGFuIGF1dGhvcml6YXRpb24gcm9sZSwgd2hpY2ggaXMgYSByb2xlIG5hbWUgdGhhdCB3aWxsIGJlCisgICAgICogcGVybWl0dGVkIGFjY2VzcyB0byB0aGUgcmVzb3VyY2VzIHByb3RlY3RlZCBieSB0aGlzIHNlY3VyaXR5IGNvbnN0cmFpbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXV0aFJvbGUgUm9sZSBuYW1lIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQXV0aFJvbGUoU3RyaW5nIGF1dGhSb2xlKSB7CisKKyAgICAgICAgaWYgKGF1dGhSb2xlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmICgiKiIuZXF1YWxzKGF1dGhSb2xlKSkgeworICAgICAgICAgICAgYWxsUm9sZXMgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW2F1dGhSb2xlcy5sZW5ndGggKyAxXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdXRoUm9sZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZXN1bHRzW2ldID0gYXV0aFJvbGVzW2ldOworICAgICAgICByZXN1bHRzW2F1dGhSb2xlcy5sZW5ndGhdID0gYXV0aFJvbGU7CisgICAgICAgIGF1dGhSb2xlcyA9IHJlc3VsdHM7CisgICAgICAgIGF1dGhDb25zdHJhaW50ID0gdHJ1ZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHdlYiByZXNvdXJjZSBjb2xsZWN0aW9uIHRvIHRob3NlIHByb3RlY3RlZCBieSB0aGlzCisgICAgICogc2VjdXJpdHkgY29uc3RyYWludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBuZXcgd2ViIHJlc291cmNlIGNvbGxlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb2xsZWN0aW9uKFNlY3VyaXR5Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7CisKKyAgICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgU2VjdXJpdHlDb2xsZWN0aW9uIHJlc3VsdHNbXSA9CisgICAgICAgICAgICBuZXcgU2VjdXJpdHlDb2xsZWN0aW9uW2NvbGxlY3Rpb25zLmxlbmd0aCArIDFdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbGxlY3Rpb25zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVzdWx0c1tpXSA9IGNvbGxlY3Rpb25zW2ldOworICAgICAgICByZXN1bHRzW2NvbGxlY3Rpb25zLmxlbmd0aF0gPSBjb2xsZWN0aW9uOworICAgICAgICBjb2xsZWN0aW9ucyA9IHJlc3VsdHM7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIHJvbGUgaXMgcGVybWl0dGVkIGFjY2VzcyB0bworICAgICAqIHRoZSByZXNvdXJjZXMgcHJvdGVjdGVkIGJ5IHRoaXMgc2VjdXJpdHkgY29uc3RyYWludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFJvbGUgbmFtZSB0byBiZSBjaGVja2VkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZmluZEF1dGhSb2xlKFN0cmluZyByb2xlKSB7CisKKyAgICAgICAgaWYgKHJvbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF1dGhSb2xlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHJvbGUuZXF1YWxzKGF1dGhSb2xlc1tpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Ygcm9sZXMgdGhhdCBhcmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGUgcmVzb3VyY2VzCisgICAgICogcHJvdGVjdGVkIGJ5IHRoaXMgc2VjdXJpdHkgY29uc3RyYWludC4gIElmIG5vbmUgaGF2ZSBiZWVuIGRlZmluZWQsCisgICAgICogYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZCAod2hpY2ggaW1wbGllcyB0aGF0IGFsbCBhdXRoZW50aWNhdGVkCisgICAgICogdXNlcnMgYXJlIHBlcm1pdHRlZCBhY2Nlc3MpLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kQXV0aFJvbGVzKCkgeworCisgICAgICAgIHJldHVybiAoYXV0aFJvbGVzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBuYW1lLCBpZiBhbnk7CisgICAgICogb3RoZXJ3aXNlLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBXZWIgcmVzb3VyY2UgY29sbGVjdGlvbiBuYW1lIHRvIHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBTZWN1cml0eUNvbGxlY3Rpb24gZmluZENvbGxlY3Rpb24oU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xsZWN0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGNvbGxlY3Rpb25zW2ldLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChjb2xsZWN0aW9uc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCBvZiB0aGUgd2ViIHJlc291cmNlIGNvbGxlY3Rpb25zIHByb3RlY3RlZCBieSB0aGlzCisgICAgICogc2VjdXJpdHkgY29uc3RyYWludC4gIElmIHRoZXJlIGFyZSBub25lLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzCisgICAgICogcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFNlY3VyaXR5Q29sbGVjdGlvbltdIGZpbmRDb2xsZWN0aW9ucygpIHsKKworICAgICAgICByZXR1cm4gKGNvbGxlY3Rpb25zKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY29udGV4dC1yZWxhdGl2ZSBVUkkgKGFuZAorICAgICAqIGFzc29jaWF0ZWQgSFRUUCBtZXRob2QpIGFyZSBwcm90ZWN0ZWQgYnkgdGhpcyBzZWN1cml0eSBjb25zdHJhaW50LgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBDb250ZXh0LXJlbGF0aXZlIFVSSSB0byBjaGVjaworICAgICAqIEBwYXJhbSBtZXRob2QgUmVxdWVzdCBtZXRob2QgYmVpbmcgdXNlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGluY2x1ZGVkKFN0cmluZyB1cmksIFN0cmluZyBtZXRob2QpIHsKKworICAgICAgICAvLyBXZSBjYW5ub3QgbWF0Y2ggd2l0aG91dCBhIHZhbGlkIHJlcXVlc3QgbWV0aG9kCisgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgICAgIC8vIENoZWNrIGFsbCBvZiB0aGUgY29sbGVjdGlvbnMgaW5jbHVkZWQgaW4gdGhpcyBjb25zdHJhaW50CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sbGVjdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghY29sbGVjdGlvbnNbaV0uZmluZE1ldGhvZChtZXRob2QpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm5zW10gPSBjb2xsZWN0aW9uc1tpXS5maW5kUGF0dGVybnMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGF0dGVybnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hQYXR0ZXJuKHVyaSwgcGF0dGVybnNbal0pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm8gY29sbGVjdGlvbiBpbmNsdWRlZCBpbiB0aGlzIGNvbnN0cmFpbnQgbWF0Y2hlcyB0aGlzIHJlcXVlc3QKKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHJvbGUgZnJvbSB0aGUgc2V0IG9mIHJvbGVzIHBlcm1pdHRlZCB0byBhY2Nlc3MKKyAgICAgKiB0aGUgcmVzb3VyY2VzIHByb3RlY3RlZCBieSB0aGlzIHNlY3VyaXR5IGNvbnN0cmFpbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXV0aFJvbGUgUm9sZSBuYW1lIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdXRoUm9sZShTdHJpbmcgYXV0aFJvbGUpIHsKKworICAgICAgICBpZiAoYXV0aFJvbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaW50IG4gPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdXRoUm9sZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhdXRoUm9sZXNbaV0uZXF1YWxzKGF1dGhSb2xlKSkgeworICAgICAgICAgICAgICAgIG4gPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuID49IDApIHsKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW2F1dGhSb2xlcy5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXV0aFJvbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gbikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tqKytdID0gYXV0aFJvbGVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0aFJvbGVzID0gcmVzdWx0czsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbiBmcm9tIHRob3NlIHByb3RlY3RlZCBieQorICAgICAqIHRoaXMgc2VjdXJpdHkgY29uc3RyYWludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFdlYiByZXNvdXJjZSBjb2xsZWN0aW9uIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb2xsZWN0aW9uKFNlY3VyaXR5Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7CisKKyAgICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaW50IG4gPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xsZWN0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb25zW2ldLmVxdWFscyhjb2xsZWN0aW9uKSkgeworICAgICAgICAgICAgICAgIG4gPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuID49IDApIHsKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIFNlY3VyaXR5Q29sbGVjdGlvbiByZXN1bHRzW10gPQorICAgICAgICAgICAgICAgIG5ldyBTZWN1cml0eUNvbGxlY3Rpb25bY29sbGVjdGlvbnMubGVuZ3RoIC0gMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbGxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gbikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tqKytdID0gY29sbGVjdGlvbnNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2xsZWN0aW9ucyA9IHJlc3VsdHM7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2VjdXJpdHkgY29uc3RyYWludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlNlY3VyaXR5Q29uc3RyYWludFsiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xsZWN0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChjb2xsZWN0aW9uc1tpXS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgcGF0aCBtYXRjaCB0aGUgc3BlY2lmaWVkIFVSTCBwYXR0ZXJuPworICAgICAqIFRoaXMgbWV0aG9kIGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgKGluIHRoZSBzYW1lIG9yZGVyKSBhcyB0aG9zZSB1c2VkCisgICAgICogZm9yIG1hcHBpbmcgcmVxdWVzdHMgdG8gc2VydmxldHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBDb250ZXh0LXJlbGF0aXZlIHJlcXVlc3QgcGF0aCB0byBiZSBjaGVja2VkCisgICAgICogIChtdXN0IHN0YXJ0IHdpdGggJy8nKQorICAgICAqIEBwYXJhbSBwYXR0ZXJuIFVSTCBwYXR0ZXJuIHRvIGJlIGNvbXBhcmVkIGFnYWluc3QKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuKFN0cmluZyBwYXRoLCBTdHJpbmcgcGF0dGVybikgeworCisgICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgYXJndW1lbnQgc3RyaW5ncworICAgICAgICBpZiAoKHBhdGggPT0gbnVsbCkgfHwgKHBhdGgubGVuZ3RoKCkgPT0gMCkpCisgICAgICAgICAgICBwYXRoID0gIi8iOworICAgICAgICBpZiAoKHBhdHRlcm4gPT0gbnVsbCkgfHwgKHBhdHRlcm4ubGVuZ3RoKCkgPT0gMCkpCisgICAgICAgICAgICBwYXR0ZXJuID0gIi8iOworCisgICAgICAgIC8vIENoZWNrIGZvciBleGFjdCBtYXRjaAorICAgICAgICBpZiAocGF0aC5lcXVhbHMocGF0dGVybikpCisgICAgICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgICAgIC8vIENoZWNrIGZvciBwYXRoIHByZWZpeCBtYXRjaGluZworICAgICAgICBpZiAocGF0dGVybi5zdGFydHNXaXRoKCIvIikgJiYgcGF0dGVybi5lbmRzV2l0aCgiLyoiKSkgeworICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc3Vic3RyaW5nKDAsIHBhdHRlcm4ubGVuZ3RoKCkgLSAyKTsKKyAgICAgICAgICAgIGlmIChwYXR0ZXJuLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsgIC8vICIvKiIgaXMgdGhlIHNhbWUgYXMgIi8iCisgICAgICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgiLyIpKQorICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmVxdWFscyhwYXRoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgICAgICBpbnQgc2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgaWYgKHNsYXNoIDw9IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBzbGFzaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGZvciBzdWZmaXggbWF0Y2hpbmcKKyAgICAgICAgaWYgKHBhdHRlcm4uc3RhcnRzV2l0aCgiKi4iKSkgeworICAgICAgICAgICAgaW50IHNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgaW50IHBlcmlvZCA9IHBhdGgubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgIGlmICgoc2xhc2ggPj0gMCkgJiYgKHBlcmlvZCA+IHNsYXNoKSAmJgorICAgICAgICAgICAgICAgIHBhdGguZW5kc1dpdGgocGF0dGVybi5zdWJzdHJpbmcoMSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHVuaXZlcnNhbCBtYXBwaW5nCisgICAgICAgIGlmIChwYXR0ZXJuLmVxdWFscygiLyIpKQorICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKworICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L21iZWFucy1kZXNjcmlwdG9ycy54bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L21iZWFucy1kZXNjcmlwdG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RjMTNiMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApAQCAtMCwwICsxLDE4NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8bWJlYW5zLWRlc2NyaXB0b3JzPgorCisgIDxtYmVhbiBuYW1lPSJDb250ZXh0RW52aXJvbm1lbnQiCisgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLkNvbnRleHRFbnZpcm9ubWVudE1CZWFuIgorICAgICAgICAgZGVzY3JpcHRpb249IlJlcHJlc2VudGF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGVudmlyb25tZW50IGVudHJ5IgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJSZXNvdXJjZXMiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RW52aXJvbm1lbnQiPgorICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGVudmlyb25tZW50IGVudHJ5IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBuYW1lIG9mIHRoaXMgZW52aXJvbm1lbnQgZW50cnkiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9Im92ZXJyaWRlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkRvZXMgdGhpcyBlbnZpcm9ubWVudCBlbnRyeSBhbGxvdyBvdmVycmlkZXMgYnkgdGhlCisgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHR5cGUgb2YgdGhpcyBlbnZpcm9ubWVudCBlbnRyeSIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHZhbHVlIG9mIHRoaXMgZW52aXJvbm1lbnQgZW50cnkiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgIDwvbWJlYW4+CisKKworICA8bWJlYW4gICAgICAgICBuYW1lPSJDb250ZXh0UmVzb3VyY2UiCisgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLkNvbnRleHRSZXNvdXJjZU1CZWFuIgorICAgICAgICAgZGVzY3JpcHRpb249IlJlcHJlc2VudGF0aW9uIG9mIGEgcmVzb3VyY2UgcmVmZXJlbmNlIGZvciBhIHdlYiBhcHBsaWNhdGlvbiIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iUmVzb3VyY2VzIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlIj4KKyAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXV0aCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgYXV0aG9yaXphdGlvbiByZXF1aXJlbWVudCBmb3IgdGhpcyByZXNvdXJjZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkZXNjcmlwdGlvbiIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhpcyByZXNvdXJjZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJuYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic2NvcGUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHNoYXJpbmcgc2NvcGUgb2YgdGhpcyByZXNvdXJjZSBmYWN0b3J5IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InR5cGUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHR5cGUgb2YgdGhpcyBlbnZpcm9ubWVudCBlbnRyeSIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgPC9tYmVhbj4KKyAgCisgIAorICAgPG1iZWFuICAgICAgICAgbmFtZT0iQ29udGV4dFJlc291cmNlTGluayIKKyAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLkNvbnRleHRSZXNvdXJjZUxpbmtNQmVhbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVwcmVzZW50YXRpb24gb2YgYSByZXNvdXJjZSBsaW5rIGZvciBhIHdlYiBhcHBsaWNhdGlvbiIKKyAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgIGdyb3VwPSJSZXNvdXJjZXMiCisgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlTGluayI+CisgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Imdsb2JhbCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZ2xvYmFsIG5hbWUgb2YgdGhpcyByZXNvdXJjZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJuYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idHlwZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgdHlwZSBvZiB0aGlzIHJlc291cmNlIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgIDwvbWJlYW4+CisgIAorICA8bWJlYW4gICAgICAgICBuYW1lPSJOYW1pbmdSZXNvdXJjZXMiCisgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLk5hbWluZ1Jlc291cmNlc01CZWFuIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJIb2xkcyBhbmQgbWFuYWdlcyB0aGUgbmFtaW5nIHJlc291cmNlcyBkZWZpbmVkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBKMkVFIEVudGVycHJpc2UgTmFtaW5nIENvbnRleHQgYW5kIHRoZWlyIGFzc29jaWF0ZWQgCisgICAgICAgICAgICAgICAgICAgICAgIEpOREkgY29udGV4dCIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IlJlc291cmNlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzIj4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJlbnZpcm9ubWVudHMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWVzIG9mIHRoZSBzZXQgb2YgZGVmaW5lZCBlbnZpcm9ubWVudCBlbnRyaWVzCisgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZhLmxhbmcuU3RyaW5nOyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyZXNvdXJjZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWVzIG9mIGFsbCB0aGUgZGVmaW5lZCByZXNvdXJjZSByZWZlcmVuY2VzCisgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIGFwcGxpY2F0aW9uLiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZhLmxhbmcuU3RyaW5nOyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyZXNvdXJjZUxpbmtzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lcyBvZiBhbGwgdGhlIGRlZmluZWQgcmVzb3VyY2UgbGluayByZWZlcmVuY2VzCisgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIGFwcGxpY2F0aW9uLiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZhLmxhbmcuU3RyaW5nOyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJhZGRFbnZpcm9ubWVudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQWRkIGFuIGVudmlyb25tZW50IGVudHJ5IGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW52TmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTmV3IGVudmlyb25tZW50IGVudHJ5IG5hbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idHlwZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTmV3IGVudmlyb25tZW50IGVudHJ5IHR5cGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik5ldyBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImFkZFJlc291cmNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJBZGQgYSByZXNvdXJjZSByZWZlcmVuY2UgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJyZXNvdXJjZU5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik5ldyByZXNvdXJjZSByZWZlcmVuY2UgbmFtZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJ0eXBlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJOZXcgcmVzb3VyY2UgcmVmZXJlbmNlIHR5cGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJhZGRSZXNvdXJjZUxpbmsiCisgICAgICAgICAgZGVzY3JpcHRpb249IkFkZCBhIHJlc291cmNlIGxpbmsgcmVmZXJlbmNlIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icmVzb3VyY2VMaW5rTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTmV3IHJlc291cmNlIHJlZmVyZW5jZSBuYW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InR5cGUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik5ldyByZXNvdXJjZSByZWZlcmVuY2UgdHlwZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZUVudmlyb25tZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgYW55IGVudmlyb25tZW50IGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJlbnZOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJOYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0byByZW1vdmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVSZXNvdXJjZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIGFueSByZXNvdXJjZSByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InJlc291cmNlTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTmFtZSBvZiB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlIHRvIHJlbW92ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZVJlc291cmNlTGluayIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIGFueSByZXNvdXJjZSBsaW5rIHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icmVzb3VyY2VMaW5rTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTmFtZSBvZiB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlIHRvIHJlbW92ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgIDwvbWJlYW4+CisKKworPC9tYmVhbnMtZGVzY3JpcHRvcnM+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L3BhY2thZ2UuaHRtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MTJmYTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDEwIEBACis8Ym9keT4KKworPHA+VGhpcyBwYWNrYWdlIGNvbnRhaW5zIEphdmEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudCBjb21wbGV4IGRhdGEgc3RydWN0dXJlcworZnJvbSB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlICg8Y29kZT53ZWIueG1sPC9jb2RlPikuCitJdCBpcyBhc3N1bWVkIHRoYXQgdGhlc2Ugb2JqZWN0cyB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGhpbiB0aGUgY29udGV4dCBvZgorYSBzaW5nbGUgdGhyZWFkLCBhbmQgdGhlbiByZWZlcmVuY2VkIGluIGEgcmVhZC1vbmx5IG1hbm5lciBzdWJzZXF1ZW50IHRvIHRoYXQKK3RpbWUuICBUaGVyZWZvcmUsIG5vIG11bHRpLXRocmVhZCBzeW5jaHJvbml6YXRpb24gaXMgdXRpbGl6ZWQgd2l0aGluIHRoZQoraW1wbGVtZW50YXRpb24gY2xhc3Nlcy48L3A+CisKKzwvYm9keT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sYXVuY2hlci9DYXRhbGluYUxhdW5jaEZpbHRlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xhdW5jaGVyL0NhdGFsaW5hTGF1bmNoRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwMDI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sYXVuY2hlci9DYXRhbGluYUxhdW5jaEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5sYXVuY2hlcjsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGF1bmNoZXIuTGF1bmNoQ29tbWFuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGF1bmNoZXIuTGF1bmNoRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisKKy8qKgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBMYXVuY2hGaWx0ZXIgaW50ZXJmYWNlLiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvCisgKiB1bmNvbmRpdGlvbmFsbHkgZm9yY2UgdGhlICJ3YWl0Zm9yY2hpbGQiIGF0dHJpYnV0ZSBmb3IgY2VydGFpbiBDYXRhbGluYQorICogYXBwbGljYXRpb25zIHRvIHRydWUuCisgKgorICogQGF1dGhvciBQYXRyaWNrIEx1YnkKKyAqLworcHVibGljIGNsYXNzIENhdGFsaW5hTGF1bmNoRmlsdGVyIGltcGxlbWVudHMgTGF1bmNoRmlsdGVyIHsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RhdGljIEZpZWxkcworCisgICAgLyoqCisgICAgICogVGhlIENhdGFsaW5hIGJvb3RzdHJhcCBjbGFzcyBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBDQVRBTElOQV9CT09UU1RSQVBfQ0xBU1NfTkFNRSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwIjsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWV0aG9kcworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgYWxsb3dzIGR5bmFtaWMgY29uZmlndXJhdGlvbiBhbmQgZXJyb3IgY2hlY2tpbmcgb2YgdGhlCisgICAgICogYXR0cmlidXRlcyBhbmQgbmVzdGVkIGVsZW1lbnRzIGluIGEgImxhdW5jaCIgdGFzayB0aGF0IGlzIGxhdW5jaGluZyBhCisgICAgICogQ2F0YWxpbmEgYXBwbGljYXRpb24uIFRoaXMgbWV0aG9kIGV2YWx1YXRlcyB0aGUgbmVzdGVkIGNvbW1hbmQgbGluZQorICAgICAqIGFyZ3VtZW50cyBhbmQsIGRlcGVuZGluZyBvbiB3aGljaCBjbGFzcyBpcyBzcGVjaWZpZWQgaW4gdGhlIHRhc2sncworICAgICAqICJjbGFzc25hbWUiIGF0dHJpYnV0ZSwgbWF5IGZvcmNlIHRoZSBhcHBsaWNhdGlvbiB0byBydW4KKyAgICAgKiBpbiB0aGUgZm9yZWdyb3VuZCBieSBmb3JjaW5nIHRoZSAid2FpdGZvcmNoaWxkIiBhdHRyaWJ1dGUgdG8gInRydWUiLgorICAgICAqCisgICAgICogQHBhcmFtIGxhdW5jaENvbW1hbmQgYSBjb25maWd1cmVkIGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgTGF1bmNoQ29tbWFuZH0KKyAgICAgKiAgY2xhc3MKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFueSBlcnJvcnMgb2NjdXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoTGF1bmNoQ29tbWFuZCBsYXVuY2hDb21tYW5kKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIC8vIEdldCBhdHRyaWJ1dGVzCisgICAgICAgIFN0cmluZyBtYWluQ2xhc3NOYW1lID0gbGF1bmNoQ29tbWFuZC5nZXRDbGFzc25hbWUoKTsKKyAgICAgICAgYm9vbGVhbiB3YWl0Rm9yQ2hpbGQgPSBsYXVuY2hDb21tYW5kLmdldFdhaXRmb3JjaGlsZCgpOworICAgICAgICBBcnJheUxpc3QgYXJnc0xpc3QgPSBsYXVuY2hDb21tYW5kLmdldEFyZ3MoKTsKKyAgICAgICAgU3RyaW5nW10gYXJncyA9IChTdHJpbmdbXSlhcmdzTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbYXJnc0xpc3Quc2l6ZSgpXSk7CisKKyAgICAgICAgLy8gRXZhbHVhdGUgbWFpbiBjbGFzcworICAgICAgICBpZiAoQ2F0YWxpbmFMYXVuY2hGaWx0ZXIuQ0FUQUxJTkFfQk9PVFNUUkFQX0NMQVNTX05BTUUuZXF1YWxzKG1haW5DbGFzc05hbWUpKSB7CisgICAgICAgICAgICAvLyBJZiAic3RhcnQiIGlzIG5vdCB0aGUgbGFzdCBhcmd1bWVudCwgbWFrZSAid2FpdGZvcmNoaWxkIiB0cnVlCisgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMCB8fCAhInN0YXJ0Ii5lcXVhbHMoYXJnc1thcmdzLmxlbmd0aCAtIDFdKSkgeworICAgICAgICAgICAgICAgIGxhdW5jaENvbW1hbmQuc2V0V2FpdGZvcmNoaWxkKHRydWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgInN0YXJ0IiBpcyB0aGUgbGFzdCBhcmd1bWVudCwgbWFrZSBzdXJlIHRoYXQgYWxsIG9mIHRoZQorICAgICAgICAgICAgLy8gcHJlY2VkaW5nIGFyZ3VtZW50cyBhcmUgT0sgZm9yIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGggLSAxOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIi1jb25maWciLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIG5leHQgYXJndW1lbnQgc2luY2UgaXQgc2hvdWxkIGJlIGEgZmlsZQorICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiBpICsgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbGF1bmNoQ29tbWFuZC5zZXRXYWl0Zm9yY2hpbGQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCItZGVidWciLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLW5vbmFtaW5nIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICBsYXVuY2hDb21tYW5kLnNldFdhaXRmb3JjaGlsZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9Db25zdGFudHMuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlODhhYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmxvYWRlcjsKKworCitwdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhY2thZ2UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIiOworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL0xvY2FTdHJpbmdzX2ZyLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL0xvY2FTdHJpbmdzX2ZyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMxOWFiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvTG9jYVN0cmluZ3NfZnIucHJvcGVydGllcwpAQCAtMCwwICsxLDMwIEBACitmaWxlQ2xhc3NMb2FkZXIuY2FuUmVhZD1MZSBy6WNlcHRhY2xlIChyZXBvc2l0b3J5KSB7MH0gbmUgcGV1dCDqdHJlIGx1CitmaWxlQ2xhc3NMb2FkZXIuZXhpc3RzPUxlIHLpY2VwdGFjbGUgKHJlcG9zaXRvcnkpIHswfSBuJydleGlzdGUgcGFzCitmaWxlQ2xhc3NMb2FkZXIuamFyRmlsZT1JbXBvc3NpYmxlIGRlIGxpcmUgbGUgZmljaGllciBKQVIgezB9CitmaWxlQ2xhc3NMb2FkZXIucmVzdHJpY3RlZD1JbXBvc3NpYmxlIGRlIGNoYXJnZXIgbGEgY2xhc3NlIHJlc3RyZWludGUgKHJlc3RyaWN0ZWQgY2xhc3MpIHswfQorc3RhbmRhcmRMb2FkZXIuYWRkUmVwb3NpdG9yeT1Bam91dCBkdSBy6WNlcHRhY2xlIChyZXBvc2l0b3J5KSB7MH0KK3N0YW5kYXJkTG9hZGVyLmFscmVhZHlTdGFydGVkPUxlIGNoYXJnZXVyIChsb2FkZXIpIGEgZOlq4CDpdOkgZOltYXJy6Qorc3RhbmRhcmRMb2FkZXIuY2hlY2tJbnRlcnZhbD1JbXBvc3NpYmxlIGRlIHLpZ2xlciBsJydpbnRlcnZhbCBkZSB26XJpZmljYXRpb24gZGUgcmVjaGFyZ2VtZW50IOAgezB9IHNlY29uZGVzCitzdGFuZGFyZExvYWRlci5ub3RDb250ZXh0PUltcG9zc2libGUgZCcnYXV0by1yZWNoYXJnZXIgc2FucyBxdWUgbGUgY29udGVuZXVyIG5lIHNvaXQgdW4gY29udGV4dGUKK3N0YW5kYXJkTG9hZGVyLm5vdFJlbG9hZGFiZT1Qcm9wcmnpdOkgZGUgcmVjaGFyZ2VtZW50IChyZWxvYWRhYmxlIHByb3BlcnR5KSBtaXNlIOAgZmF1eAorc3RhbmRhcmRMb2FkZXIubm90U3RhcnRlZD1MZSBjaGFyZ2V1ciAobG9hZGVyKSBuJydhIHBhcyBlbmNvcmUg6XTpIGTpbWFycukKK3N0YW5kYXJkTG9hZGVyLnJlbG9hZGFibGU9SW1wb3NzaWJsZSBkZSBtZXR0cmUgbGEgcHJvcHJp6XTpIGRlIHJlY2hhcmdlbWVudCAocmVsb2FkYWJsZSBwcm9wZXJ0eSkg4CB7MH0KK3N0YW5kYXJkTG9hZGVyLnJlbG9hZGluZz1MZXMgdulyaWZpY2F0aW9ucyBkZSByZWNoYXJnZW1lbnQgc29udCBhY3RpdullcyBwb3VyIGNlIGNvbnRleHRlCitzdGFuZGFyZExvYWRlci5yZW1vdmVSZXBvc2l0b3J5PVJldHJhaXQgZHUgculjZXB0YWNsZSAocmVwb3NpdG9yeSkgezB9CitzdGFuZGFyZExvYWRlci5zdGFydGluZz1E6W1hcnJhZ2UgZGUgY2UgY2hhcmdldXIgKGxvYWRlcikKK3N0YW5kYXJkTG9hZGVyLnN0b3BwaW5nPUFycup0IGRlIGNlIGNoYXJnZXVyIChsb2FkZXIpCit3ZWJhcHBMb2FkZXIuYWRkUmVwb3NpdG9yeT1Bam91dCBkdSBy6WNlcHRhY2xlIChyZXBvc2l0b3J5KSB7MH0KK3dlYmFwcExvYWRlci5kZXBsb3k9ROlwbG9pZW1lbnQgZGVzIGNsYXNzZXMgZGVzIHLpY2VwdGFjbGVzIChjbGFzcyByZXBvc2l0b3JpZXMpIHZlcnMgbGUgZG9zc2llciBkZSB0cmF2YWlsICh3b3JrIGRpcmVjdG9yeSkgezB9Cit3ZWJhcHBMb2FkZXIuamFyRGVwbG95PUTpcGxvaWVtZW50IGR1IEpBUiB7MH0gdmVycyB7MX0KK3dlYmFwcExvYWRlci5jbGFzc0RlcGxveT1E6XBsb2llbWVudCBkZXMgZmljaGllcnMgY2xhc3NlcyB7MH0gdmVycyB7MX0KK3dlYmFwcExvYWRlci5hbHJlYWR5U3RhcnRlZD1MZSBjaGFyZ2V1ciAobG9hZGVyKSBhIGTpauAg6XTpIGTpbWFycukKK3dlYmFwcExvYWRlci5jaGVja0ludGVydmFsPUltcG9zc2libGUgZGUgculnbGVyIGwnJ2ludGVydmFsIGRlIHbpcmlmaWNhdGlvbiBkZSByZWNoYXJnZW1lbnQg4CB7MH0gc2Vjb25kZXMKK3dlYmFwcExvYWRlci5ub3RDb250ZXh0PUltcG9zc2libGUgZCcnYXV0by1yZWNoYXJnZXIgc2FucyBxdWUgbGUgY29udGVuZXVyIG5lIHNvaXQgdW4gY29udGV4dGUKK3dlYmFwcExvYWRlci5ub3RSZWxvYWRhYmU9UHJvcHJp6XTpIGRlIHJlY2hhcmdlbWVudCAocmVsb2FkYWJsZSBwcm9wZXJ0eSkgbWlzZSDgIGZhdXgKK3dlYmFwcExvYWRlci5ub3RTdGFydGVkPUxlIGNoYXJnZXVyIChsb2FkZXIpIG4nJ2EgcGFzIGVuY29yZSDpdOkgZOltYXJy6Qord2ViYXBwTG9hZGVyLnJlbG9hZGFibGU9SW1wb3NzaWJsZSBkZSBtZXR0cmUgbGEgcHJvcHJp6XTpIGRlIHJlY2hhcmdlbWVudCAocmVsb2FkYWJsZSBwcm9wZXJ0eSkg4CB7MH0KK3dlYmFwcExvYWRlci5yZWxvYWRpbmc9TGVzIHbpcmlmaWNhdGlvbnMgZGUgcmVjaGFyZ2VtZW50IHNvbnQgYWN0aXbpZXMgcG91ciBjZSBjb250ZXh0ZQord2ViYXBwTG9hZGVyLnJlbW92ZVJlcG9zaXRvcnk9UmV0cmFpdCBkdSBy6WNlcHRhY2xlIChyZXBvc2l0b3J5KSB7MH0KK3dlYmFwcExvYWRlci5zdGFydGluZz1E6W1hcnJhZ2UgZGUgY2UgY2hhcmdldXIgKGxvYWRlcikKK3dlYmFwcExvYWRlci5zdG9wcGluZz1BcnLqdCBkZSBjZSBjaGFyZ2V1ciAobG9hZGVyKQord2ViYXBwTG9hZGVyLmZhaWxNb2RpZmllZENoZWNrPUVycmV1ciBkYW5zIGxlIHN1aXZpIGRlcyBtb2RpZmljYXRpb25zCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWU1MGYwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMCwwICsxLDMxIEBACitmaWxlQ2xhc3NMb2FkZXIuY2FuUmVhZD1SZXBvc2l0b3J5IHswfSBjYW5ub3QgYmUgcmVhZAorZmlsZUNsYXNzTG9hZGVyLmV4aXN0cz1SZXBvc2l0b3J5IHswfSBkb2VzIG5vdCBleGlzdAorZmlsZUNsYXNzTG9hZGVyLmphckZpbGU9Q2Fubm90IHJlYWQgSkFSIGZpbGUgezB9CitmaWxlQ2xhc3NMb2FkZXIucmVzdHJpY3RlZD1DYW5ub3QgbG9hZCByZXN0cmljdGVkIGNsYXNzIHswfQorc3RhbmRhcmRMb2FkZXIuYWRkUmVwb3NpdG9yeT1BZGRpbmcgcmVwb3NpdG9yeSB7MH0KK3N0YW5kYXJkTG9hZGVyLmFscmVhZHlTdGFydGVkPUxvYWRlciBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKK3N0YW5kYXJkTG9hZGVyLmNoZWNrSW50ZXJ2YWw9Q2Fubm90IHNldCByZWxvYWQgY2hlY2sgaW50ZXJ2YWwgdG8gezB9IHNlY29uZHMKK3N0YW5kYXJkTG9hZGVyLm5vdENvbnRleHQ9Q2Fubm90IGF1dG8tcmVsb2FkIHVubGVzcyBvdXIgQ29udGFpbmVyIGlzIGEgQ29udGV4dAorc3RhbmRhcmRMb2FkZXIubm90UmVsb2FkYWJlPVJlbG9hZGFibGUgcHJvcGVydHkgaXMgc2V0IHRvIGZhbHNlCitzdGFuZGFyZExvYWRlci5ub3RTdGFydGVkPUxvYWRlciBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQKK3N0YW5kYXJkTG9hZGVyLnJlbG9hZGFibGU9Q2Fubm90IHNldCByZWxvYWRhYmxlIHByb3BlcnR5IHRvIHswfQorc3RhbmRhcmRMb2FkZXIucmVsb2FkaW5nPVJlbG9hZGluZyBjaGVja3MgYXJlIGVuYWJsZWQgZm9yIHRoaXMgQ29udGV4dAorc3RhbmRhcmRMb2FkZXIucmVtb3ZlUmVwb3NpdG9yeT1SZW1vdmluZyByZXBvc2l0b3J5IHswfQorc3RhbmRhcmRMb2FkZXIuc3RhcnRpbmc9U3RhcnRpbmcgdGhpcyBMb2FkZXIKK3N0YW5kYXJkTG9hZGVyLnN0b3BwaW5nPVN0b3BwaW5nIHRoaXMgTG9hZGVyCit3ZWJhcHBDbGFzc0xvYWRlci5zdG9wcGVkPUlsbGVnYWwgYWNjZXNzOiB0aGlzIHdlYiBhcHBsaWNhdGlvbiBpbnN0YW5jZSBoYXMgYmVlbiBzdG9wcGVkIGFscmVhZHkuICBDb3VsZCBub3QgbG9hZCB7MH0uICBUaGUgZXZlbnR1YWwgZm9sbG93aW5nIHN0YWNrIHRyYWNlIGlzIGNhdXNlZCBieSBhbiBlcnJvciB0aHJvd24gZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBhcyB3ZWxsIGFzIHRvIGF0dGVtcHQgdG8gdGVybWluYXRlIHRoZSB0aHJlYWQgd2hpY2ggY2F1c2VkIHRoZSBpbGxlZ2FsIGFjY2VzcywgYW5kIGhhcyBubyBmdW5jdGlvbmFsIGltcGFjdC4KK3dlYmFwcExvYWRlci5hZGRSZXBvc2l0b3J5PUFkZGluZyByZXBvc2l0b3J5IHswfQord2ViYXBwTG9hZGVyLmRlcGxveT1EZXBsb3lpbmcgY2xhc3MgcmVwb3NpdG9yaWVzIHRvIHdvcmsgZGlyZWN0b3J5IHswfQord2ViYXBwTG9hZGVyLmphckRlcGxveT1EZXBsb3kgSkFSIHswfSB0byB7MX0KK3dlYmFwcExvYWRlci5jbGFzc0RlcGxveT1EZXBsb3kgY2xhc3MgZmlsZXMgezB9IHRvIHsxfQord2ViYXBwTG9hZGVyLmFscmVhZHlTdGFydGVkPUxvYWRlciBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKK3dlYmFwcExvYWRlci5jaGVja0ludGVydmFsPUNhbm5vdCBzZXQgcmVsb2FkIGNoZWNrIGludGVydmFsIHRvIHswfSBzZWNvbmRzCit3ZWJhcHBMb2FkZXIubm90Q29udGV4dD1DYW5ub3QgYXV0by1yZWxvYWQgdW5sZXNzIG91ciBDb250YWluZXIgaXMgYSBDb250ZXh0Cit3ZWJhcHBMb2FkZXIubm90UmVsb2FkYWJlPVJlbG9hZGFibGUgcHJvcGVydHkgaXMgc2V0IHRvIGZhbHNlCit3ZWJhcHBMb2FkZXIubm90U3RhcnRlZD1Mb2FkZXIgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCit3ZWJhcHBMb2FkZXIucmVsb2FkYWJsZT1DYW5ub3Qgc2V0IHJlbG9hZGFibGUgcHJvcGVydHkgdG8gezB9Cit3ZWJhcHBMb2FkZXIucmVsb2FkaW5nPVJlbG9hZGluZyBjaGVja3MgYXJlIGVuYWJsZWQgZm9yIHRoaXMgQ29udGV4dAord2ViYXBwTG9hZGVyLnJlbW92ZVJlcG9zaXRvcnk9UmVtb3ZpbmcgcmVwb3NpdG9yeSB7MH0KK3dlYmFwcExvYWRlci5zdGFydGluZz1TdGFydGluZyB0aGlzIExvYWRlcgord2ViYXBwTG9hZGVyLnN0b3BwaW5nPVN0b3BwaW5nIHRoaXMgTG9hZGVyCit3ZWJhcHBMb2FkZXIuZmFpbE1vZGlmaWVkQ2hlY2s9RXJyb3IgdHJhY2tpbmcgbW9kaWZpY2F0aW9ucwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3Yzk1YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMSBAQAorZmlsZUNsYXNzTG9hZGVyLmNhblJlYWQ9Tm8gc2UgcHVlZGUgbGVlciBlbCBSZXBvc2l0b3JpbyB7MH0KK2ZpbGVDbGFzc0xvYWRlci5leGlzdHM9Tm8gZXhpc3RlIGVsIFJlcG9zaXRvcmlvIHswfQorZmlsZUNsYXNzTG9hZGVyLmphckZpbGU9Tm8gcHVlZG8gbGVlciBhcmNoaXZvIEpBUiB7MH0KK2ZpbGVDbGFzc0xvYWRlci5yZXN0cmljdGVkPU5vIHB1ZWRvIGNhcmdhciBjbGFzZSByZXN0cmluZ2lkYSB7MH0KK3N0YW5kYXJkTG9hZGVyLmFkZFJlcG9zaXRvcnk9QfFhZGllbmRvIHJlcG9zaXRvcmlvIHswfQorc3RhbmRhcmRMb2FkZXIuYWxyZWFkeVN0YXJ0ZWQ9WWEgaGEgc2lkbyBhcnJhbmNhZG8gZWwgQ2FyZ2Fkb3IKK3N0YW5kYXJkTG9hZGVyLmNoZWNrSW50ZXJ2YWw9Tm8gcHVlZG8gcG9uZXIgZWwgaW50ZXJ2YWxvIGRlIHJldmlzafNuIGRlIHJlY2FyZ2EgYSB7MH0gc2VndW5kb3MKK3N0YW5kYXJkTG9hZGVyLm5vdENvbnRleHQ9Tm8gcHVlZG8gYXV0by1yZWNhcmdhciBhIG1lbm9zIHF1ZSBudWVzdHJvIENvbnRlbmVkb3Igc2VhIHVuIENvbnRleHRvCitzdGFuZGFyZExvYWRlci5ub3RSZWxvYWRhYmU9TGEgcHJvcGllZGFkIFJlY2FyZ2FibGUgZXN04SBwdWVzdGEgYSBmYWxzYQorc3RhbmRhcmRMb2FkZXIubm90U3RhcnRlZD1B+m4gbm8gc2UgaGEgYXJyYW5jYWRvIGVsIENhcmdhZG9yCitzdGFuZGFyZExvYWRlci5yZWxvYWRhYmxlPU5vIHB1ZWRvIHBvbmVyIGxhIHByb3BpZWRhZCByZWNhcmdhYmxlIGEgezB9CitzdGFuZGFyZExvYWRlci5yZWxvYWRpbmc9U2UgaGFuIGFjdGl2YWRvIGxhcyByZXZpc2lvbmVzIGRlIFJlY2FyZ2EgcGFyYSBlc3RlIENvbnRleHRvCitzdGFuZGFyZExvYWRlci5yZW1vdmVSZXBvc2l0b3J5PVF1aXRhbmRvIHJlcG9zaXRvcmlvIHswfQorc3RhbmRhcmRMb2FkZXIuc3RhcnRpbmc9QXJyYW5jYW5kbyBlc3RlIENhcmdhZG9yCitzdGFuZGFyZExvYWRlci5zdG9wcGluZz1QYXJhbmRvIGVzdGUgQ2FyZ2Fkb3IKK3dlYmFwcENsYXNzTG9hZGVyLnN0b3BwZWQ9QWNjZXNvIGlsZWdhbDogZXN0YSBpbnN0YW5jaWEgZGUgYXBsaWNhY2nzbiB3ZWIgeWEgaGEgc2lkbyBwYXJhZGEuICBDb3VsZCBub3QgbG9hZCB7MH0uICBMYSBldmVudHVhbCB0cmF6YSBkZSBwaWxhIHF1ZSBzaWd1ZSBoYSBzaWRvIG1vdGl2YWRhIHBvciB1biBlcnJvciBsYW56YWRvIGNvbiBtb3Rpdm9zIGRlIGRlcHVyYWNp824gYXPtIGNvbW8gcGFyYSBpbnRlbnRhciB0ZXJtaW5hciBlbCBoaWxvIHF1ZSBtb3RpdvMgZWwgYWNjZXNvIGlsZWdhbCB5IG5vIHRpZW5lIGltcGFjdG8gZnVuY2lvbmFsLgord2ViYXBwTG9hZGVyLmFkZFJlcG9zaXRvcnk9QfFhZGllbmRvIHJlcG9zaXRvcmlvIHswfQord2ViYXBwTG9hZGVyLmRlcGxveT1EZXNwbGVnYW5kbyByZXBvc2l0b3Jpb3MgZGUgY2xhc2UgZW4gZGlyZWN0b3JpbyBkZSB0cmFiYWpvIHswfQord2ViYXBwTG9hZGVyLmphckRlcGxveT1EZXNwbGllZ3VlIGRlbCBKQVIgezB9IGVuIHsxfQord2ViYXBwTG9hZGVyLmNsYXNzRGVwbG95PURlc3BsaWVndWUgZGUgYXJjaGl2b3MgZGUgY2xhc2UgezB9IGVuIHsxfQord2ViYXBwTG9hZGVyLmFscmVhZHlTdGFydGVkPVlhIHNlIGhhIGFycmFuY2FkbyBlbCBDYXJnYWRvcgord2ViYXBwTG9hZGVyLmNoZWNrSW50ZXJ2YWw9Tm8gcHVlZG8gcG9uZXIgZWwgaW50ZXJ2YWxvIGRlIHJldmlzafNuIGRlIHJlY2FyZ2EgYSB7MH0gc2VndW5kb3MKK3dlYmFwcExvYWRlci5ub3RDb250ZXh0PU5vIHB1ZWRvIGF1dG8tcmVjYXJnYXIgYSBtZW5vcyBxdWUgbnVlc3RybyBDb250ZW5lZG9yIHNlYSB1biBDb250ZXh0bword2ViYXBwTG9hZGVyLm5vdFJlbG9hZGFiZT1TZSBoYSBwdWVzdG8gbGEgcHJvcGllZGFkIFJlY2FyZ2FibGUgYSBmYWxzYQord2ViYXBwTG9hZGVyLm5vdFN0YXJ0ZWQ9QfpuIG5vIHNlIGhhIGFycmFuY2FkbyBlbCBDYXJnYWRvcgord2ViYXBwTG9hZGVyLnJlbG9hZGFibGU9Tm8gcHVlZG8gcG9uZXIgbGEgcHJvcGllZGFkIHJlY2FyZ2FibGUgYSB7MH0KK3dlYmFwcExvYWRlci5yZWxvYWRpbmc9U2UgaGFuIGFjdGl2YWRvIGxvcyBjaGVxdWVvcyBkZSBSZWNhcmdhIHBhcmEgZXN0ZSBDb250ZXh0bword2ViYXBwTG9hZGVyLnJlbW92ZVJlcG9zaXRvcnk9UXVpdGFuZG8gcmVwb3NpdG9yaW8gezB9Cit3ZWJhcHBMb2FkZXIuc3RhcnRpbmc9QXJyYW5jYW5kbyBlc3RlIENhcmdhZG9yCit3ZWJhcHBMb2FkZXIuc3RvcHBpbmc9UGFyYW5kbyBlc3RlIENhcmdhZG9yCit3ZWJhcHBMb2FkZXIuZmFpbE1vZGlmaWVkQ2hlY2s9TW9kaWZpY2FjaW9uZXMgZGUgcGlzdGEgZGUgZXJyb3IKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMWU1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzEgQEAKK2ZpbGVDbGFzc0xvYWRlci5jYW5SZWFkPVx1MzBlYVx1MzBkZFx1MzBiOFx1MzBjOFx1MzBlYSB7MH0gXHUzMDRjXHU4YWFkXHUzMDgxXHUzMDdlXHUzMDViXHUzMDkzCitmaWxlQ2xhc3NMb2FkZXIuZXhpc3RzPVx1MzBlYVx1MzBkZFx1MzBiOFx1MzBjOFx1MzBlYSB7MH0gXHUzMDRjXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDViXHUzMDkzCitmaWxlQ2xhc3NMb2FkZXIuamFyRmlsZT1KQVJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgezB9IFx1MzA0Y1x1OGFhZFx1MzA4MVx1MzA3ZVx1MzA1Ylx1MzA5MworZmlsZUNsYXNzTG9hZGVyLnJlc3RyaWN0ZWQ9XHU1MjM2XHU5NjUwXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwOTJcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkTG9hZGVyLmFkZFJlcG9zaXRvcnk9XHUzMGVhXHUzMGRkXHUzMGI4XHUzMGM4XHUzMGVhIHswfSBcdTMwOTJcdThmZmRcdTUyYTBcdTMwNTdcdTMwN2VcdTMwNTkKK3N0YW5kYXJkTG9hZGVyLmFscmVhZHlTdGFydGVkPVx1MzBlZFx1MzBmY1x1MzBjMFx1MzA2Zlx1NjVlMlx1MzA2Ylx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRMb2FkZXIuY2hlY2tJbnRlcnZhbD1cdTUxOGRcdTMwZWRcdTMwZmNcdTMwYzlcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk1OTNcdTk2OTRcdTMwOTJ7MH1cdTc5ZDJcdTMwNmJcdThhMmRcdTViOWFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkTG9hZGVyLm5vdENvbnRleHQ9XHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMDRjXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDAxXHU4MWVhXHU1MmQ1XHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZExvYWRlci5ub3RSZWxvYWRhYmU9cmVsb2FkYWJsZVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzA0Y2ZhbHNlXHUzMDZiXHU4YTJkXHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZExvYWRlci5ub3RTdGFydGVkPVx1MzBlZFx1MzBmY1x1MzBjMFx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRMb2FkZXIucmVsb2FkYWJsZT1yZWxvYWRhYmxlXHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMDkyIHswfSBcdTMwNmJcdThhMmRcdTViOWFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkTG9hZGVyLnJlbG9hZGluZz1cdTMwNTNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNmVcdTUxOGRcdTMwZWRcdTMwZmNcdTMwYzlcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwNmZcdTY3MDlcdTUyYjlcdTMwNjdcdTMwNTkKK3N0YW5kYXJkTG9hZGVyLnJlbW92ZVJlcG9zaXRvcnk9XHUzMGVhXHUzMGRkXHUzMGI4XHUzMGM4XHUzMGVhIHswfSBcdTMwOTJcdTUyNGFcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTkKK3N0YW5kYXJkTG9hZGVyLnN0YXJ0aW5nPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjMFx1MzA5Mlx1OGQ3N1x1NTJkNVx1MzA1N1x1MzA3ZVx1MzA1OQorc3RhbmRhcmRMb2FkZXIuc3RvcHBpbmc9XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGMwXHUzMDkyXHU1MDVjXHU2YjYyXHUzMDU3XHUzMDdlXHUzMDU5Cit3ZWJhcHBDbGFzc0xvYWRlci5zdG9wcGVkPVx1NGUwZFx1NmI2M1x1MzA2YVx1MzBhMlx1MzBhZlx1MzBiYlx1MzBiOTogXHUzMDUzXHUzMDZlV2ViXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHUzMGE0XHUzMGYzXHUzMGI5XHUzMGJmXHUzMGYzXHUzMGI5XHUzMDZmXHU2NWUyXHUzMDZiXHU1MDVjXHU2YjYyXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5ICBDb3VsZCBub3QgbG9hZCB7MH0uIFx1NGUwZFx1NmI2M1x1MzA2YVx1MzBhMlx1MzBhZlx1MzBiYlx1MzBiOVx1MzA5Mlx1NWYxNVx1MzA0ZFx1OGQ3N1x1MzA1M1x1MzA1N1x1MzA1Zlx1MzBiOVx1MzBlY1x1MzBjM1x1MzBjOVx1MzA5Mlx1N2Q0Mlx1NGU4Nlx1MzA1NVx1MzA1Ylx1MzAwMVx1NjI5NVx1MzA1Mlx1MzA4OVx1MzA4Y1x1MzA1Zlx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2Ylx1MzA4OFx1MzA4YVx1MzBjN1x1MzBkMFx1MzBjM1x1MzBiMFx1NzUyOFx1MzA2Ylx1NmIyMVx1MzA2ZVx1MzBiOVx1MzBiZlx1MzBjM1x1MzBhZlx1MzBjOFx1MzBlY1x1MzBmY1x1MzBiOVx1MzA0Y1x1NzUxZlx1NjIxMFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzA0Y1x1ZmYwY1x1NmE1Zlx1ODBmZFx1MzA2Ylx1NWY3MVx1OTdmZlx1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5Mword2ViYXBwTG9hZGVyLmFkZFJlcG9zaXRvcnk9XHUzMGVhXHUzMGRkXHUzMGI4XHUzMGM4XHUzMGVhIHswfSBcdTMwOTJcdThmZmRcdTUyYTBcdTMwNTdcdTMwN2VcdTMwNTkKK3dlYmFwcExvYWRlci5kZXBsb3k9XHUzMGFmXHUzMGU5XHUzMGI5XHUzMGVhXHUzMGRkXHUzMGI4XHUzMGM4XHUzMGVhXHUzMDkyXHU0ZjVjXHU2OTZkXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhIHswfSBcdTMwNmJcdTkxNGRcdTUwOTlcdTMwNTdcdTMwN2VcdTMwNTkKK3dlYmFwcExvYWRlci5qYXJEZXBsb3k9SkFSIHswfSBcdTMwOTIgezF9IFx1MzA2Ylx1OTE0ZFx1NTA5OVx1MzA1N1x1MzA3ZVx1MzA1OQord2ViYXBwTG9hZGVyLmNsYXNzRGVwbG95PVx1MzBhZlx1MzBlOVx1MzBiOVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiB7MH0gXHUzMDkyIHsxfSBcdTMwNmJcdTkxNGRcdTUwOTlcdTMwNTdcdTMwN2VcdTMwNTkKK3dlYmFwcExvYWRlci5hbHJlYWR5U3RhcnRlZD1cdTMwZWRcdTMwZmNcdTMwYzBcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3dlYmFwcExvYWRlci5jaGVja0ludGVydmFsPVx1NTE4ZFx1MzBlZFx1MzBmY1x1MzBjOVx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1OTU5M1x1OTY5NFx1MzA5MnswfVx1NzlkMlx1MzA2Ylx1OGEyZFx1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mword2ViYXBwTG9hZGVyLm5vdENvbnRleHQ9XHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMDRjXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDAxXHU4MWVhXHU1MmQ1XHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCit3ZWJhcHBMb2FkZXIubm90UmVsb2FkYWJlPXJlbG9hZGFibGVcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNGNmYWxzZVx1MzA2Ylx1OGEyZFx1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQord2ViYXBwTG9hZGVyLm5vdFN0YXJ0ZWQ9XHUzMGVkXHUzMGZjXHUzMGMwXHUzMDZmXHUzMDdlXHUzMDYwXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCit3ZWJhcHBMb2FkZXIucmVsb2FkYWJsZT1yZWxvYWRhYmxlXHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMDkyIHswfSBcdTMwNmJcdThhMmRcdTViOWFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK3dlYmFwcExvYWRlci5yZWxvYWRpbmc9XHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMDZmXHU2NzA5XHU1MmI5XHUzMDY3XHUzMDU5Cit3ZWJhcHBMb2FkZXIucmVtb3ZlUmVwb3NpdG9yeT1cdTMwZWFcdTMwZGRcdTMwYjhcdTMwYzhcdTMwZWEgezB9IFx1MzA5Mlx1NTI0YVx1OTY2NFx1MzA1N1x1MzA3ZVx1MzA1OQord2ViYXBwTG9hZGVyLnN0YXJ0aW5nPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjMFx1MzA5Mlx1OGQ3N1x1NTJkNVx1MzA1N1x1MzA3ZVx1MzA1OQord2ViYXBwTG9hZGVyLnN0b3BwaW5nPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjMFx1MzA5Mlx1NTA1Y1x1NmI2Mlx1MzA1N1x1MzA3ZVx1MzA1OQord2ViYXBwTG9hZGVyLmZhaWxNb2RpZmllZENoZWNrPVx1NTkwOVx1NjZmNFx1OGZmZFx1OGRlMVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9SZWxvYWRlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9SZWxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YzU4YjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL1JlbG9hZGVyLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmxvYWRlcjsKKworCisvKioKKyAqIEludGVybmFsIGludGVyZmFjZSB0aGF0IDxjb2RlPkNsYXNzTG9hZGVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbnMgbWF5CisgKiBvcHRpb25hbGx5IGltcGxlbWVudCB0byBzdXBwb3J0IHRoZSBhdXRvLXJlbG9hZCBmdW5jdGlvbmFsaXR5IG9mCisgKiB0aGUgY2xhc3Nsb2FkZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFJlbG9hZGVyIHsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHJlcG9zaXRvcnkgdG8gdGhlIHNldCBvZiBwbGFjZXMgdGhpcyBDbGFzc0xvYWRlciBjYW4gbG9vayBmb3IKKyAgICAgKiBjbGFzc2VzIHRvIGJlIGxvYWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXBvc2l0b3J5IE5hbWUgb2YgYSBzb3VyY2Ugb2YgY2xhc3NlcyB0byBiZSBsb2FkZWQsIHN1Y2ggYXMgYQorICAgICAqICBkaXJlY3RvcnkgcGF0aG5hbWUsIGEgSkFSIGZpbGUgcGF0aG5hbWUsIG9yIGEgWklQIGZpbGUgcGF0aG5hbWUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgcmVwb3NpdG9yeSBpcworICAgICAqICBpbnZhbGlkIG9yIGRvZXMgbm90IGV4aXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVwb3NpdG9yeShTdHJpbmcgcmVwb3NpdG9yeSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyBhcnJheSBvZiB0aGUgY3VycmVudCByZXBvc2l0b3JpZXMgZm9yIHRoaXMgY2xhc3MKKyAgICAgKiBsb2FkZXIuICBJZiB0aGVyZSBhcmUgbm8gcmVwb3NpdG9yaWVzLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzCisgICAgICogcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRSZXBvc2l0b3JpZXMoKTsKKworCisgICAgLyoqCisgICAgICogSGF2ZSBvbmUgb3IgbW9yZSBjbGFzc2VzIG9yIHJlc291cmNlcyBiZWVuIG1vZGlmaWVkIHNvIHRoYXQgYSByZWxvYWQKKyAgICAgKiBpcyBhcHByb3ByaWF0ZT8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtb2RpZmllZCgpOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvUmVzb3VyY2VFbnRyeS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9SZXNvdXJjZUVudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0OWQxYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvUmVzb3VyY2VFbnRyeS5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXI7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOworaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7CisKKy8qKgorICogUmVzb3VyY2UgZW50cnkuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlRW50cnkgeworCisKKyAgICAvKioKKyAgICAgKiBUaGUgImxhc3QgbW9kaWZpZWQiIHRpbWUgb2YgdGhlIG9yaWdpbiBmaWxlIGF0IHRoZSB0aW1lIHRoaXMgY2xhc3MKKyAgICAgKiB3YXMgbG9hZGVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGxhc3RNb2RpZmllZCA9IC0xOworCisKKyAgICAvKioKKyAgICAgKiBCaW5hcnkgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBiaW5hcnlDb250ZW50ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogTG9hZGVkIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBsb2FkZWRDbGFzcyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFVSTCBzb3VyY2UgZnJvbSB3aGVyZSB0aGUgb2JqZWN0IHdhcyBsb2FkZWQuCisgICAgICovCisgICAgcHVibGljIFVSTCBzb3VyY2UgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBVUkwgb2YgdGhlIGNvZGViYXNlIGZyb20gd2hlcmUgdGhlIG9iamVjdCB3YXMgbG9hZGVkLgorICAgICAqLworICAgIHB1YmxpYyBVUkwgY29kZUJhc2UgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBNYW5pZmVzdCAoaWYgdGhlIHJlc291cmNlIHdhcyBsb2FkZWQgZnJvbSBhIEpBUikuCisgICAgICovCisgICAgcHVibGljIE1hbmlmZXN0IG1hbmlmZXN0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQ2VydGlmaWNhdGVzIChpZiB0aGUgcmVzb3VyY2Ugd2FzIGxvYWRlZCBmcm9tIGEgSkFSKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMgPSBudWxsOworCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9TdGFuZGFyZENsYXNzTG9hZGVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL1N0YW5kYXJkQ2xhc3NMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWYwNTcwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9TdGFuZGFyZENsYXNzTG9hZGVyLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmxvYWRlcjsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKKworLyoqCisgKiBTdWJjbGFzcyBpbXBsZW1lbnRhdGlvbiBvZiA8Yj5qYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjwvYj4uIFRoZXJlIGFyZSBubworICogZnVuY3Rpb25hbCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoaXMgY2xhc3MgYW5kIDxiPmphdmEubmV0LlVSTENsYXNzTG9hZGVyPC9iPi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFN0YW5kYXJkQ2xhc3NMb2FkZXIKKyAgICBleHRlbmRzIFVSTENsYXNzTG9hZGVyCisgICAgaW1wbGVtZW50cyBTdGFuZGFyZENsYXNzTG9hZGVyTUJlYW4geworCisJcHVibGljIFN0YW5kYXJkQ2xhc3NMb2FkZXIoVVJMIHJlcG9zaXRvcmllc1tdKSB7CisgICAgICAgIHN1cGVyKHJlcG9zaXRvcmllcyk7CisgICAgfQorCisgICAgcHVibGljIFN0YW5kYXJkQ2xhc3NMb2FkZXIoVVJMIHJlcG9zaXRvcmllc1tdLCBDbGFzc0xvYWRlciBwYXJlbnQpIHsKKyAgICAgICAgc3VwZXIocmVwb3NpdG9yaWVzLCBwYXJlbnQpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL1N0YW5kYXJkQ2xhc3NMb2FkZXJNQmVhbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9TdGFuZGFyZENsYXNzTG9hZGVyTUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjlhODg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9TdGFuZGFyZENsYXNzTG9hZGVyTUJlYW4uamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyOworCisvKioKKyAqIE1CZWFuIGludGVyZmFjZSBmb3IgU3RhbmRhcmRDbGFzc0xvYWRlciwgdG8gYWxsb3cgSk1YIHJlbW90ZSBtYW5hZ2VtZW50LgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RhbmRhcmRDbGFzc0xvYWRlck1CZWFuIHsKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9XZWJhcHBDbGFzc0xvYWRlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9XZWJhcHBDbGFzc0xvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MzZjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL1dlYmFwcENsYXNzTG9hZGVyLmphdmEKQEAgLTAsMCArMSwyMzc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZVBlcm1pc3Npb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2U7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qb2xpY3k7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEuc3FsLkRyaXZlcjsKK2ltcG9ydCBqYXZhLnNxbC5Ecml2ZXJNYW5hZ2VyOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7CitpbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzLk5hbWU7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZUNsYXNzUGFpcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLkpuZGlQZXJtaXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuUmVzb3VyY2VBdHRyaWJ1dGVzOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuSW50cm9zcGVjdGlvblV0aWxzOworCisvKioKKyAqIFNwZWNpYWxpemVkIHdlYiBhcHBsaWNhdGlvbiBjbGFzcyBsb2FkZXIuCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgbG9hZGVyIGlzIGEgZnVsbCByZWltcGxlbWVudGF0aW9uIG9mIHRoZSAKKyAqIDxjb2RlPlVSTENsYXNzTG9hZGVyPC9jb2RlPiBmcm9tIHRoZSBKREsuIEl0IGlzIGRlc2luZ2VkIHRvIGJlIGZ1bGx5CisgKiBjb21wYXRpYmxlIHdpdGggYSBub3JtYWwgPGNvZGU+VVJMQ2xhc3NMb2FkZXI8L2NvZGU+LCBhbHRob3VnaCBpdHMgaW50ZXJuYWwKKyAqIGJlaGF2aW9yIG1heSBiZSBjb21wbGV0ZWx5IGRpZmZlcmVudC4KKyAqIDxwPgorICogPHN0cm9uZz5JTVBMRU1FTlRBVElPTiBOT1RFPC9zdHJvbmc+IC0gVGhpcyBjbGFzcyBsb2FkZXIgZmFpdGhmdWxseSBmb2xsb3dzIAorICogdGhlIGRlbGVnYXRpb24gbW9kZWwgcmVjb21tZW5kZWQgaW4gdGhlIHNwZWNpZmljYXRpb24uIFRoZSBzeXN0ZW0gY2xhc3MgCisgKiBsb2FkZXIgd2lsbCBiZSBxdWVyaWVkIGZpcnN0LCB0aGVuIHRoZSBsb2NhbCByZXBvc2l0b3JpZXMsIGFuZCBvbmx5IHRoZW4gCisgKiBkZWxlZ2F0aW9uIHRvIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyIHdpbGwgb2NjdXIuIFRoaXMgYWxsb3dzIHRoZSB3ZWIgCisgKiBhcHBsaWNhdGlvbiB0byBvdmVycmlkZSBhbnkgc2hhcmVkIGNsYXNzIGV4Y2VwdCB0aGUgY2xhc3NlcyBmcm9tIEoyU0UuCisgKiBTcGVjaWFsIGhhbmRsaW5nIGlzIHByb3ZpZGVkIGZyb20gdGhlIEpBWFAgWE1MIHBhcnNlciBpbnRlcmZhY2VzLCB0aGUgSk5ESQorICogaW50ZXJmYWNlcywgYW5kIHRoZSBjbGFzc2VzIGZyb20gdGhlIHNlcnZsZXQgQVBJLCB3aGljaCBhcmUgbmV2ZXIgbG9hZGVkIAorICogZnJvbSB0aGUgd2ViYXBwIHJlcG9zaXRvcnkuCisgKiA8cD4KKyAqIDxzdHJvbmc+SU1QTEVNRU5UQVRJT04gTk9URTwvc3Ryb25nPiAtIER1ZSB0byBsaW1pdGF0aW9ucyBpbiBKYXNwZXIgCisgKiBjb21waWxhdGlvbiB0ZWNobm9sb2d5LCBhbnkgcmVwb3NpdG9yeSB3aGljaCBjb250YWlucyBjbGFzc2VzIGZyb20gCisgKiB0aGUgc2VydmxldCBBUEkgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBjbGFzcyBsb2FkZXIuCisgKiA8cD4KKyAqIDxzdHJvbmc+SU1QTEVNRU5UQVRJT04gTk9URTwvc3Ryb25nPiAtIFRoZSBjbGFzcyBsb2FkZXIgZ2VuZXJhdGVzIHNvdXJjZQorICogVVJMcyB3aGljaCBpbmNsdWRlIHRoZSBmdWxsIEpBUiBVUkwgd2hlbiBhIGNsYXNzIGlzIGxvYWRlZCBmcm9tIGEgSkFSIGZpbGUsCisgKiB3aGljaCBhbGxvd3Mgc2V0dGluZyBzZWN1cml0eSBwZXJtaXNzaW9uIGF0IHRoZSBjbGFzcyBsZXZlbCwgZXZlbiB3aGVuIGEKKyAqIGNsYXNzIGlzIGNvbnRhaW5lZCBpbnNpZGUgYSBKQVIuCisgKiA8cD4KKyAqIDxzdHJvbmc+SU1QTEVNRU5UQVRJT04gTk9URTwvc3Ryb25nPiAtIExvY2FsIHJlcG9zaXRvcmllcyBhcmUgc2VhcmNoZWQgaW4KKyAqIHRoZSBvcmRlciB0aGV5IGFyZSBhZGRlZCB2aWEgdGhlIGluaXRpYWwgY29uc3RydWN0b3IgYW5kL29yIGFueSBzdWJzZXF1ZW50CisgKiBjYWxscyB0byA8Y29kZT5hZGRSZXBvc2l0b3J5KCk8L2NvZGU+IG9yIDxjb2RlPmFkZEphcigpPC9jb2RlPi4KKyAqIDxwPgorICogPHN0cm9uZz5JTVBMRU1FTlRBVElPTiBOT1RFPC9zdHJvbmc+IC0gTm8gY2hlY2sgZm9yIHNlYWxpbmcgdmlvbGF0aW9ucyBvcgorICogc2VjdXJpdHkgaXMgbWFkZSB1bmxlc3MgYSBzZWN1cml0eSBtYW5hZ2VyIGlzIHByZXNlbnQuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgV2ViYXBwQ2xhc3NMb2FkZXIKKyAgICBleHRlbmRzIFVSTENsYXNzTG9hZGVyCisgICAgaW1wbGVtZW50cyBSZWxvYWRlciwgTGlmZWN5Y2xlCisgeworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggV2ViYXBwQ2xhc3NMb2FkZXIuY2xhc3MgKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTkFCTEVfQ0xFQVJfUkVGRVJFTkNFUyA9IAorICAgICAgICBCb29sZWFuLnZhbHVlT2YoU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLmNhdGFsaW5hLmxvYWRlci5XZWJhcHBDbGFzc0xvYWRlci5FTkFCTEVfQ0xFQVJfUkVGRVJFTkNFUyIsICJ0cnVlIikpLmJvb2xlYW5WYWx1ZSgpOworCisgICAgcHJvdGVjdGVkIGNsYXNzIFByaXZpbGVnZWRGaW5kUmVzb3VyY2UKKyAgICAgICAgaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9uIHsKKworICAgICAgICBwcm90ZWN0ZWQgRmlsZSBmaWxlOworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGg7CisKKyAgICAgICAgUHJpdmlsZWdlZEZpbmRSZXNvdXJjZShGaWxlIGZpbGUsIFN0cmluZyBwYXRoKSB7CisgICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgICAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworICAgICAgICAgICAgcmV0dXJuIGZpbmRSZXNvdXJjZUludGVybmFsKGZpbGUsIHBhdGgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RhdGljIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIHRyaWdnZXIgY2xhc3NlcyB0aGF0IHdpbGwgY2F1c2UgYSBwcm9wb3NlZCByZXBvc2l0b3J5IG5vdAorICAgICAqIHRvIGJlIGFkZGVkIGlmIHRoaXMgY2xhc3MgaXMgdmlzaWJsZSB0byB0aGUgY2xhc3MgbG9hZGVyIHRoYXQgbG9hZGVkCisgICAgICogdGhpcyBmYWN0b3J5IGNsYXNzLiAgVHlwaWNhbGx5LCB0cmlnZ2VyIGNsYXNzZXMgd2lsbCBiZSBsaXN0ZWQgZm9yCisgICAgICogY29tcG9uZW50cyB0aGF0IGhhdmUgYmVlbiBpbnRlZ3JhdGVkIGludG8gdGhlIEpESyBmb3IgbGF0ZXIgdmVyc2lvbnMsCisgICAgICogYnV0IHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIEpBUiBmaWxlcyBhcmUgcmVxdWlyZWQgdG8gcnVuIG9uCisgICAgICogZWFybGllciB2ZXJzaW9ucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHRyaWdnZXJzID0geworICAgICAgICAiamF2YXguc2VydmxldC5TZXJ2bGV0IiwgICAgICAgICAgICAgICAgICAgIC8vIFNlcnZsZXQgQVBJCisgICAgICAgICJqYXZheC5zZXJ2bGV0LmpzcC5Kc3BQYWdlIiAgICAgICAgICAgICAgICAgLy8gSlNQIEFQSQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFNldCBvZiBwYWNrYWdlIG5hbWVzIHdoaWNoIGFyZSBub3QgYWxsb3dlZCB0byBiZSBsb2FkZWQgZnJvbSBhIHdlYmFwcAorICAgICAqIGNsYXNzIGxvYWRlciB3aXRob3V0IGRlbGVnYXRpbmcgZmlyc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBwYWNrYWdlVHJpZ2dlcnMgPSB7CisgICAgfTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworICAgIAorICAgIC8qKgorICAgICAqIFVzZSBhbnRpIEpBUiBsb2NraW5nIGNvZGUsIHdoaWNoIGRvZXMgVVJMIHJlcm91dGluZyB3aGVuIGFjY2Vzc2luZworICAgICAqIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBib29sZWFuIGFudGlKQVJMb2NraW5nID0gZmFsc2U7IAorICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBDbGFzc0xvYWRlciB3aXRoIG5vIGRlZmluZWQgcmVwb3NpdG9yaWVzIGFuZCBubworICAgICAqIHBhcmVudCBDbGFzc0xvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgV2ViYXBwQ2xhc3NMb2FkZXIoKSB7CisKKyAgICAgICAgc3VwZXIobmV3IFVSTFswXSk7CisgICAgICAgIHRoaXMucGFyZW50ID0gZ2V0UGFyZW50KCk7CisgICAgICAgIHN5c3RlbSA9IGdldFN5c3RlbUNsYXNzTG9hZGVyKCk7CisgICAgICAgIHNlY3VyaXR5TWFuYWdlciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKKworICAgICAgICBpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlZnJlc2hQb2xpY3koKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgQ2xhc3NMb2FkZXIgd2l0aCBubyBkZWZpbmVkIHJlcG9zaXRvcmllcyBhbmQgbm8KKyAgICAgKiBwYXJlbnQgQ2xhc3NMb2FkZXIuCisgICAgICovCisgICAgcHVibGljIFdlYmFwcENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudCkgeworCisgICAgICAgIHN1cGVyKG5ldyBVUkxbMF0sIHBhcmVudCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgIHRoaXMucGFyZW50ID0gZ2V0UGFyZW50KCk7CisgICAgICAgIAorICAgICAgICBzeXN0ZW0gPSBnZXRTeXN0ZW1DbGFzc0xvYWRlcigpOworICAgICAgICBzZWN1cml0eU1hbmFnZXIgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisKKyAgICAgICAgaWYgKHNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZWZyZXNoUG9saWN5KCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVkIGRpcmVjdG9yeSBjb250ZXh0IGdpdmluZyBhY2Nlc3MgdG8gdGhlIHJlc291cmNlcyBpbiB0aGlzCisgICAgICogd2ViYXBwLgorICAgICAqLworICAgIHByb3RlY3RlZCBEaXJDb250ZXh0IHJlc291cmNlcyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjYWNoZSBvZiBSZXNvdXJjZUVudHJ5IGZvciBjbGFzc2VzIGFuZCByZXNvdXJjZXMgd2UgaGF2ZSBsb2FkZWQsCisgICAgICoga2V5ZWQgYnkgcmVzb3VyY2UgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCByZXNvdXJjZUVudHJpZXMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiBub3QgZm91bmQgcmVzb3VyY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIG5vdEZvdW5kUmVzb3VyY2VzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHRoaXMgY2xhc3MgbG9hZGVyIGRlbGVnYXRlIHRvIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyCisgICAgICogPHN0cm9uZz5iZWZvcmU8L3N0cm9uZz4gc2VhcmNoaW5nIGl0cyBvd24gcmVwb3NpdG9yaWVzIChpLmUuIHRoZQorICAgICAqIHVzdWFsIEphdmEyIGRlbGVnYXRpb24gbW9kZWwpPyAgSWYgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwKKyAgICAgKiB0aGlzIGNsYXNzIGxvYWRlciB3aWxsIHNlYXJjaCBpdHMgb3duIHJlcG9zaXRvcmllcyBmaXJzdCwgYW5kCisgICAgICogZGVsZWdhdGUgdG8gdGhlIHBhcmVudCBvbmx5IGlmIHRoZSBjbGFzcyBvciByZXNvdXJjZSBpcyBub3QKKyAgICAgKiBmb3VuZCBsb2NhbGx5LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGRlbGVnYXRlID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIExhc3QgdGltZSBhIEpBUiB3YXMgYWNjZXNzZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgbGFzdEphckFjY2Vzc2VkID0gMEw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIGxvY2FsIHJlcG9zaXRvcmllcywgaW4gdGhlIG9yZGVyIHRoZXkgc2hvdWxkIGJlIHNlYXJjaGVkCisgICAgICogZm9yIGxvY2FsbHkgbG9hZGVkIGNsYXNzZXMgb3IgcmVzb3VyY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdbXSByZXBvc2l0b3JpZXMgPSBuZXcgU3RyaW5nWzBdOworCisKKyAgICAgLyoqCisgICAgICAqIFJlcG9zaXRvcmllcyBVUkxzLCB1c2VkIHRvIGNhY2hlIHRoZSByZXN1bHQgb2YgZ2V0VVJMcy4KKyAgICAgICovCisgICAgIHByb3RlY3RlZCBVUkxbXSByZXBvc2l0b3J5VVJMcyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFJlcG9zaXRvcmllcyB0cmFuc2xhdGVkIGFzIHBhdGggaW4gdGhlIHdvcmsgZGlyZWN0b3J5IChmb3IgSmFzcGVyCisgICAgICogb3JpZ2luYWxseSksIGJ1dCB3aGljaCBpcyB1c2VkIHRvIGdlbmVyYXRlIGZha2UgVVJMcyBzaG91bGQgZ2V0VVJMcyBiZQorICAgICAqIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZVtdIGZpbGVzID0gbmV3IEZpbGVbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIEpBUnMsIGluIHRoZSBvcmRlciB0aGV5IHNob3VsZCBiZSBzZWFyY2hlZAorICAgICAqIGZvciBsb2NhbGx5IGxvYWRlZCBjbGFzc2VzIG9yIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSmFyRmlsZVtdIGphckZpbGVzID0gbmV3IEphckZpbGVbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIEpBUnMsIGluIHRoZSBvcmRlciB0aGV5IHNob3VsZCBiZSBzZWFyY2hlZAorICAgICAqIGZvciBsb2NhbGx5IGxvYWRlZCBjbGFzc2VzIG9yIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZVtdIGphclJlYWxGaWxlcyA9IG5ldyBGaWxlWzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aCB3aGljaCB3aWxsIGJlIG1vbml0b3JlZCBmb3IgYWRkZWQgSmFyIGZpbGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgamFyUGF0aCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIEpBUnMsIGluIHRoZSBvcmRlciB0aGV5IHNob3VsZCBiZSBzZWFyY2hlZAorICAgICAqIGZvciBsb2NhbGx5IGxvYWRlZCBjbGFzc2VzIG9yIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gamFyTmFtZXMgPSBuZXcgU3RyaW5nWzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiBKQVJzIGxhc3QgbW9kaWZpZWQgZGF0ZXMsIGluIHRoZSBvcmRlciB0aGV5IHNob3VsZCBiZQorICAgICAqIHNlYXJjaGVkIGZvciBsb2NhbGx5IGxvYWRlZCBjbGFzc2VzIG9yIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZ1tdIGxhc3RNb2RpZmllZERhdGVzID0gbmV3IGxvbmdbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIHJlc291cmNlcyB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCB3aGVuIGNoZWNraW5nIGZvcgorICAgICAqIG1vZGlmaWNhdGlvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIHBhdGhzID0gbmV3IFN0cmluZ1swXTsKKworCisgICAgLyoqCisgICAgICogQSBsaXN0IG9mIHJlYWQgRmlsZSBhbmQgSm5kaSBQZXJtaXNzaW9uJ3MgcmVxdWlyZWQgaWYgdGhpcyBsb2FkZXIKKyAgICAgKiBpcyBmb3IgYSB3ZWIgYXBwbGljYXRpb24gY29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IHBlcm1pc3Npb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisKKyAgICAvKioKKyAgICAgKiBQYXRoIHdoZXJlIHJlc291cmNlcyBsb2FkZWQgZnJvbSBKQVJzIHdpbGwgYmUgZXh0cmFjdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGxvYWRlckRpciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBQZXJtaXNzaW9uQ29sbGVjdGlvbiBmb3IgZWFjaCBDb2RlU291cmNlIGZvciBhIHdlYgorICAgICAqIGFwcGxpY2F0aW9uIGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgbG9hZGVyUEMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBJbnN0YW5jZSBvZiB0aGUgU2VjdXJpdHlNYW5hZ2VyIGluc3RhbGxlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5TWFuYWdlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzc0xvYWRlciBwYXJlbnQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3lzdGVtIGNsYXNzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgc3lzdGVtID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZD8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEhhcyBleHRlcm5hbCByZXBvc2l0b3JpZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzRXh0ZXJuYWxSZXBvc2l0b3JpZXMgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIG5lZWQgY29udmVyc2lvbiBmb3IgcHJvcGVydGllcyBmaWxlcworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIG5lZWRDb252ZXJ0ID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEFsbCBwZXJtaXNzaW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBQZXJtaXNzaW9uIGFsbFBlcm1pc3Npb24gPSBuZXcgamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uKCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBHZXQgYXNzb2NpYXRlZCByZXNvdXJjZXMuCisgICAgICovCisgICAgcHVibGljIERpckNvbnRleHQgZ2V0UmVzb3VyY2VzKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlczsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlcyhEaXJDb250ZXh0IHJlc291cmNlcykgeworCisgICAgICAgIHRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlICJkZWxlZ2F0ZSBmaXJzdCIgZmxhZyBmb3IgdGhpcyBjbGFzcyBsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGVsZWdhdGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmRlbGVnYXRlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSAiZGVsZWdhdGUgZmlyc3QiIGZsYWcgZm9yIHRoaXMgY2xhc3MgbG9hZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGRlbGVnYXRlIFRoZSBuZXcgImRlbGVnYXRlIGZpcnN0IiBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVsZWdhdGUoYm9vbGVhbiBkZWxlZ2F0ZSkgeworCisgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBhbnRpSkFSTG9ja2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBbnRpSkFSTG9ja2luZygpIHsKKyAgICAgICAgcmV0dXJuIGFudGlKQVJMb2NraW5nOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYW50aUpBUkxvY2tpbmcgVGhlIGFudGlKQVJMb2NraW5nIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbnRpSkFSTG9ja2luZyhib29sZWFuIGFudGlKQVJMb2NraW5nKSB7CisgICAgICAgIHRoaXMuYW50aUpBUkxvY2tpbmcgPSBhbnRpSkFSTG9ja2luZzsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBJZiB0aGVyZSBpcyBhIEphdmEgU2VjdXJpdHlNYW5hZ2VyIGNyZWF0ZSBhIHJlYWQgRmlsZVBlcm1pc3Npb24KKyAgICAgKiBvciBKbmRpUGVybWlzc2lvbiBmb3IgdGhlIGZpbGUgZGlyZWN0b3J5IHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBmaWxlIGRpcmVjdG9yeSBwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUGVybWlzc2lvbihTdHJpbmcgcGF0aCkgeworICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIFBlcm1pc3Npb24gcGVybWlzc2lvbiA9IG51bGw7CisgICAgICAgICAgICBpZiggcGF0aC5zdGFydHNXaXRoKCJqbmRpOiIpIHx8IHBhdGguc3RhcnRzV2l0aCgiamFyOmpuZGk6IikgKSB7CisgICAgICAgICAgICAgICAgaWYgKCFwYXRoLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGggKyAiLyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlcm1pc3Npb24gPSBuZXcgSm5kaVBlcm1pc3Npb24ocGF0aCArICIqIik7CisgICAgICAgICAgICAgICAgYWRkUGVybWlzc2lvbihwZXJtaXNzaW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFwYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeworICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uID0gbmV3IEZpbGVQZXJtaXNzaW9uKHBhdGgsICJyZWFkIik7CisgICAgICAgICAgICAgICAgICAgIGFkZFBlcm1pc3Npb24ocGVybWlzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoICsgRmlsZS5zZXBhcmF0b3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlcm1pc3Npb24gPSBuZXcgRmlsZVBlcm1pc3Npb24ocGF0aCArICItIiwgInJlYWQiKTsKKyAgICAgICAgICAgICAgICBhZGRQZXJtaXNzaW9uKHBlcm1pc3Npb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJZiB0aGVyZSBpcyBhIEphdmEgU2VjdXJpdHlNYW5hZ2VyIGNyZWF0ZSBhIHJlYWQgRmlsZVBlcm1pc3Npb24KKyAgICAgKiBvciBKbmRpUGVybWlzc2lvbiBmb3IgVVJMLgorICAgICAqCisgICAgICogQHBhcmFtIHVybCBVUkwgZm9yIGEgZmlsZSBvciBkaXJlY3Rvcnkgb24gbG9jYWwgc3lzdGVtCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUGVybWlzc2lvbihVUkwgdXJsKSB7CisgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkUGVybWlzc2lvbih1cmwudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElmIHRoZXJlIGlzIGEgSmF2YSBTZWN1cml0eU1hbmFnZXIgY3JlYXRlIGEgUGVybWlzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwZXJtaXNzaW9uIFRoZSBwZXJtaXNzaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKKyAgICAgICAgaWYgKChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgJiYgKHBlcm1pc3Npb24gIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIHBlcm1pc3Npb25MaXN0LmFkZChwZXJtaXNzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBKQVIgcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEphclBhdGgoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuamFyUGF0aDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hhbmdlIHRoZSBKYXIgcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKYXJQYXRoKFN0cmluZyBqYXJQYXRoKSB7CisKKyAgICAgICAgdGhpcy5qYXJQYXRoID0gamFyUGF0aDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hhbmdlIHRoZSB3b3JrIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXb3JrRGlyKEZpbGUgd29ya0RpcikgeworICAgICAgICB0aGlzLmxvYWRlckRpciA9IG5ldyBGaWxlKHdvcmtEaXIsICJsb2FkZXIiKTsKKyAgICB9CisKKyAgICAgLyoqCisgICAgICAqIFV0aWxpdHkgbWV0aG9kIGZvciB1c2UgaW4gc3ViY2xhc3Nlcy4KKyAgICAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIExpZmVjeWNsZSBtZXRob2RzIHRvIGhhdmUgYW55IGVmZmVjdC4KKyAgICAgICovCisgICAgIHByb3RlY3RlZCB2b2lkIHNldFBhcmVudENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBjbCkgeworICAgICAgICAgcGFyZW50ID0gcGNsOworICAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlbG9hZGVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHJlcG9zaXRvcnkgdG8gdGhlIHNldCBvZiBwbGFjZXMgdGhpcyBDbGFzc0xvYWRlciBjYW4gbG9vayBmb3IKKyAgICAgKiBjbGFzc2VzIHRvIGJlIGxvYWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXBvc2l0b3J5IE5hbWUgb2YgYSBzb3VyY2Ugb2YgY2xhc3NlcyB0byBiZSBsb2FkZWQsIHN1Y2ggYXMgYQorICAgICAqICBkaXJlY3RvcnkgcGF0aG5hbWUsIGEgSkFSIGZpbGUgcGF0aG5hbWUsIG9yIGEgWklQIGZpbGUgcGF0aG5hbWUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgcmVwb3NpdG9yeSBpcworICAgICAqICBpbnZhbGlkIG9yIGRvZXMgbm90IGV4aXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVwb3NpdG9yeShTdHJpbmcgcmVwb3NpdG9yeSkgeworCisgICAgICAgIC8vIElnbm9yZSBhbnkgb2YgdGhlIHN0YW5kYXJkIHJlcG9zaXRvcmllcywgYXMgdGhleSBhcmUgc2V0IHVwIHVzaW5nCisgICAgICAgIC8vIGVpdGhlciBhZGRKYXIgb3IgYWRkUmVwb3NpdG9yeQorICAgICAgICBpZiAocmVwb3NpdG9yeS5zdGFydHNXaXRoKCIvV0VCLUlORi9saWIiKQorICAgICAgICAgICAgfHwgcmVwb3NpdG9yeS5zdGFydHNXaXRoKCIvV0VCLUlORi9jbGFzc2VzIikpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gQWRkIHRoaXMgcmVwb3NpdG9yeSB0byBvdXIgdW5kZXJseWluZyBjbGFzcyBsb2FkZXIKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHJlcG9zaXRvcnkpOworICAgICAgICAgICAgc3VwZXIuYWRkVVJMKHVybCk7CisgICAgICAgICAgICBoYXNFeHRlcm5hbFJlcG9zaXRvcmllcyA9IHRydWU7CisgICAgICAgICAgICByZXBvc2l0b3J5VVJMcyA9IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiSW52YWxpZCByZXBvc2l0b3J5OiAiICsgcmVwb3NpdG9yeSk7IAorICAgICAgICAgICAgaWFlLmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgcmVwb3NpdG9yeSB0byB0aGUgc2V0IG9mIHBsYWNlcyB0aGlzIENsYXNzTG9hZGVyIGNhbiBsb29rIGZvcgorICAgICAqIGNsYXNzZXMgdG8gYmUgbG9hZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcG9zaXRvcnkgTmFtZSBvZiBhIHNvdXJjZSBvZiBjbGFzc2VzIHRvIGJlIGxvYWRlZCwgc3VjaCBhcyBhCisgICAgICogIGRpcmVjdG9yeSBwYXRobmFtZSwgYSBKQVIgZmlsZSBwYXRobmFtZSwgb3IgYSBaSVAgZmlsZSBwYXRobmFtZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCByZXBvc2l0b3J5IGlzCisgICAgICogIGludmFsaWQgb3IgZG9lcyBub3QgZXhpc3QKKyAgICAgKi8KKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBhZGRSZXBvc2l0b3J5KFN0cmluZyByZXBvc2l0b3J5LCBGaWxlIGZpbGUpIHsKKworICAgICAgICAvLyBOb3RlIDogVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIChvZiBjb3Vyc2UpLCBidXQgSSB0aGluayB3ZSBzaG91bGQKKyAgICAgICAgLy8ga2VlcCB0aGlzIGEgYml0IGdlbmVyaWMKKworICAgICAgICBpZiAocmVwb3NpdG9yeSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiYWRkUmVwb3NpdG9yeSgiICsgcmVwb3NpdG9yeSArICIpIik7CisKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgLy8gQWRkIHRoaXMgcmVwb3NpdG9yeSB0byBvdXIgaW50ZXJuYWwgbGlzdAorICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3JlcG9zaXRvcmllcy5sZW5ndGggKyAxXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlcG9zaXRvcmllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0W2ldID0gcmVwb3NpdG9yaWVzW2ldOworICAgICAgICB9CisgICAgICAgIHJlc3VsdFtyZXBvc2l0b3JpZXMubGVuZ3RoXSA9IHJlcG9zaXRvcnk7CisgICAgICAgIHJlcG9zaXRvcmllcyA9IHJlc3VsdDsKKworICAgICAgICAvLyBBZGQgdGhlIGZpbGUgdG8gdGhlIGxpc3QKKyAgICAgICAgRmlsZVtdIHJlc3VsdDIgPSBuZXcgRmlsZVtmaWxlcy5sZW5ndGggKyAxXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQyW2ldID0gZmlsZXNbaV07CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0MltmaWxlcy5sZW5ndGhdID0gZmlsZTsKKyAgICAgICAgZmlsZXMgPSByZXN1bHQyOworCisgICAgfQorCisKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBhZGRKYXIoU3RyaW5nIGphciwgSmFyRmlsZSBqYXJGaWxlLCBGaWxlIGZpbGUpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGphciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoamFyRmlsZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiYWRkSmFyKCIgKyBqYXIgKyAiKSIpOworCisgICAgICAgIGludCBpOworCisgICAgICAgIGlmICgoamFyUGF0aCAhPSBudWxsKSAmJiAoamFyLnN0YXJ0c1dpdGgoamFyUGF0aCkpKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBqYXJOYW1lID0gamFyLnN1YnN0cmluZyhqYXJQYXRoLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIHdoaWxlIChqYXJOYW1lLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgICAgICAgICBqYXJOYW1lID0gamFyTmFtZS5zdWJzdHJpbmcoMSk7CisKKyAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbamFyTmFtZXMubGVuZ3RoICsgMV07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgamFyTmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBqYXJOYW1lc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdFtqYXJOYW1lcy5sZW5ndGhdID0gamFyTmFtZTsKKyAgICAgICAgICAgIGphck5hbWVzID0gcmVzdWx0OworCisgICAgICAgIH0KKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBSZWdpc3RlciB0aGUgSkFSIGZvciB0cmFja2luZworCisgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9CisgICAgICAgICAgICAgICAgKChSZXNvdXJjZUF0dHJpYnV0ZXMpIHJlc291cmNlcy5nZXRBdHRyaWJ1dGVzKGphcikpCisgICAgICAgICAgICAgICAgLmdldExhc3RNb2RpZmllZCgpOworCisgICAgICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3BhdGhzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gcGF0aHNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHRbcGF0aHMubGVuZ3RoXSA9IGphcjsKKyAgICAgICAgICAgIHBhdGhzID0gcmVzdWx0OworCisgICAgICAgICAgICBsb25nW10gcmVzdWx0MyA9IG5ldyBsb25nW2xhc3RNb2RpZmllZERhdGVzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxhc3RNb2RpZmllZERhdGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0M1tpXSA9IGxhc3RNb2RpZmllZERhdGVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0M1tsYXN0TW9kaWZpZWREYXRlcy5sZW5ndGhdID0gbGFzdE1vZGlmaWVkOworICAgICAgICAgICAgbGFzdE1vZGlmaWVkRGF0ZXMgPSByZXN1bHQzOworCisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSBKQVIgY3VycmVudGx5IGNvbnRhaW5zIGludmFsaWQgY2xhc3NlcywgZG9uJ3QgYWN0dWFsbHkgdXNlIGl0CisgICAgICAgIC8vIGZvciBjbGFzc2xvYWRpbmcKKyAgICAgICAgaWYgKCF2YWxpZGF0ZUphckZpbGUoZmlsZSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgSmFyRmlsZVtdIHJlc3VsdDIgPSBuZXcgSmFyRmlsZVtqYXJGaWxlcy5sZW5ndGggKyAxXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGphckZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQyW2ldID0gamFyRmlsZXNbaV07CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0MltqYXJGaWxlcy5sZW5ndGhdID0gamFyRmlsZTsKKyAgICAgICAgamFyRmlsZXMgPSByZXN1bHQyOworCisgICAgICAgIC8vIEFkZCB0aGUgZmlsZSB0byB0aGUgbGlzdAorICAgICAgICBGaWxlW10gcmVzdWx0NCA9IG5ldyBGaWxlW2phclJlYWxGaWxlcy5sZW5ndGggKyAxXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGphclJlYWxGaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0NFtpXSA9IGphclJlYWxGaWxlc1tpXTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQ0W2phclJlYWxGaWxlcy5sZW5ndGhdID0gZmlsZTsKKyAgICAgICAgamFyUmVhbEZpbGVzID0gcmVzdWx0NDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyBhcnJheSBvZiB0aGUgY3VycmVudCByZXBvc2l0b3JpZXMgZm9yIHRoaXMgY2xhc3MKKyAgICAgKiBsb2FkZXIuICBJZiB0aGVyZSBhcmUgbm8gcmVwb3NpdG9yaWVzLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzCisgICAgICogcmV0dXJuZWQuRm9yIHNlY3VyaXR5IHJlYXNvbiwgcmV0dXJucyBhIGNsb25lIG9mIHRoZSBBcnJheSAoc2luY2UgCisgICAgICogU3RyaW5nIGFyZSBpbW11dGFibGUpLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kUmVwb3NpdG9yaWVzKCkgeworCisgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKXJlcG9zaXRvcmllcy5jbG9uZSgpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSGF2ZSBvbmUgb3IgbW9yZSBjbGFzc2VzIG9yIHJlc291cmNlcyBiZWVuIG1vZGlmaWVkIHNvIHRoYXQgYSByZWxvYWQKKyAgICAgKiBpcyBhcHByb3ByaWF0ZT8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtb2RpZmllZCgpIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIm1vZGlmaWVkKCkiKTsKKworICAgICAgICAvLyBDaGVja2luZyBmb3IgbW9kaWZpZWQgbG9hZGVkIHJlc291cmNlcworICAgICAgICBpbnQgbGVuZ3RoID0gcGF0aHMubGVuZ3RoOworCisgICAgICAgIC8vIEEgcmFyZSByYWNlIGNvbmRpdGlvbiBjYW4gb2NjdXIgaW4gdGhlIHVwZGF0ZXMgb2YgdGhlIHR3byBhcnJheXMKKyAgICAgICAgLy8gSXQncyB0b3RhbGx5IG9rIGlmIHRoZSBsYXRlc3QgY2xhc3MgYWRkZWQgaXMgbm90IGNoZWNrZWQgKGl0IHdpbGwKKyAgICAgICAgLy8gYmUgY2hlY2tlZCB0aGUgbmV4dCB0aW1lCisgICAgICAgIGludCBsZW5ndGgyID0gbGFzdE1vZGlmaWVkRGF0ZXMubGVuZ3RoOworICAgICAgICBpZiAobGVuZ3RoID4gbGVuZ3RoMikKKyAgICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aDI7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9CisgICAgICAgICAgICAgICAgICAgICgoUmVzb3VyY2VBdHRyaWJ1dGVzKSByZXNvdXJjZXMuZ2V0QXR0cmlidXRlcyhwYXRoc1tpXSkpCisgICAgICAgICAgICAgICAgICAgIC5nZXRMYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkICE9IGxhc3RNb2RpZmllZERhdGVzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIAorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFJlc291cmNlICciICsgcGF0aHNbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIHdhcyBtb2RpZmllZDsgRGF0ZSBpcyBub3c6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5ldyBqYXZhLnV0aWwuRGF0ZShsYXN0TW9kaWZpZWQpICsgIiBXYXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5ldyBqYXZhLnV0aWwuRGF0ZShsYXN0TW9kaWZpZWREYXRlc1tpXSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCIgICAgUmVzb3VyY2UgJyIgKyBwYXRoc1tpXSArICInIGlzIG1pc3NpbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbGVuZ3RoID0gamFyTmFtZXMubGVuZ3RoOworCisgICAgICAgIC8vIENoZWNrIGlmIEpBUnMgaGF2ZSBiZWVuIGFkZGVkIG9yIHJlbW92ZWQKKyAgICAgICAgaWYgKGdldEphclBhdGgoKSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTmFtaW5nRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSByZXNvdXJjZXMubGlzdEJpbmRpbmdzKGdldEphclBhdGgoKSk7CisgICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSAmJiAoaSA8IGxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTmFtZUNsYXNzUGFpciBuY1BhaXIgPSAoTmFtZUNsYXNzUGFpcikgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuY1BhaXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgbm9uIEpBUnMgcHJlc2VudCBpbiB0aGUgbGliIGZvbGRlcgorICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoIi5qYXIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKGphck5hbWVzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWlzc2luZyBKQVIKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCIgICAgQWRkaXRpb25hbCBKQVJzIGhhdmUgYmVlbiBhZGRlZCA6ICciIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgIiciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOYW1lQ2xhc3NQYWlyIG5jUGFpciA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOYW1lQ2xhc3NQYWlyKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuY1BhaXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkaXRpb25hbCBub24tSkFSIGZpbGVzIGFyZSBhbGxvd2VkCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCgiLmphciIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgd2FzIG1vcmUgSkFScworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCIgICAgQWRkaXRpb25hbCBKQVJzIGhhdmUgYmVlbiBhZGRlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCBqYXJOYW1lcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgd2FzIGxlc3MgSkFScworICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiICAgIEFkZGl0aW9uYWwgSkFScyBoYXZlIGJlZW4gYWRkZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgRmFpbGVkIHRyYWNraW5nIG1vZGlmaWNhdGlvbnMgb2YgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0SmFyUGF0aCgpICsgIiciKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCIgICAgRmFpbGVkIHRyYWNraW5nIG1vZGlmaWNhdGlvbnMgb2YgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRKYXJQYXRoKCkgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIGNsYXNzZXMgaGF2ZSBiZWVuIG1vZGlmaWVkCisgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJXZWJhcHBDbGFzc0xvYWRlclxyXG4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCIgIGRlbGVnYXRlOiAiKTsKKyAgICAgICAgc2IuYXBwZW5kKGRlbGVnYXRlKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcclxuIik7CisgICAgICAgIHNiLmFwcGVuZCgiICByZXBvc2l0b3JpZXM6XHJcbiIpOworICAgICAgICBpZiAocmVwb3NpdG9yaWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwb3NpdG9yaWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgICAgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHJlcG9zaXRvcmllc1tpXSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcclxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMucGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLS0tLS0tLS0tLT4gUGFyZW50IENsYXNzbG9hZGVyOlxyXG4iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh0aGlzLnBhcmVudC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiXHJcbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xhc3NMb2FkZXIgTWV0aG9kcworCisKKyAgICAgLyoqCisgICAgICAqIEFkZCB0aGUgc3BlY2lmaWVkIFVSTCB0byB0aGUgY2xhc3Nsb2FkZXIuCisgICAgICAqLworICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRVUkwoVVJMIHVybCkgeworICAgICAgICAgc3VwZXIuYWRkVVJMKHVybCk7CisgICAgICAgICBoYXNFeHRlcm5hbFJlcG9zaXRvcmllcyA9IHRydWU7CisgICAgICAgICByZXBvc2l0b3J5VVJMcyA9IG51bGw7CisgICAgIH0KKworCisgICAgLyoqCisgICAgICogRmluZCB0aGUgc3BlY2lmaWVkIGNsYXNzIGluIG91ciBsb2NhbCByZXBvc2l0b3JpZXMsIGlmIHBvc3NpYmxlLiAgSWYKKyAgICAgKiBub3QgZm91bmQsIHRocm93IDxjb2RlPkNsYXNzTm90Rm91bmRFeGNlcHRpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgbG9hZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGNsYXNzIHdhcyBub3QgZm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZmluZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgZmluZENsYXNzKCIgKyBuYW1lICsgIikiKTsKKworICAgICAgICAvLyBDYW5ub3QgbG9hZCBhbnl0aGluZyBmcm9tIGxvY2FsIHJlcG9zaXRvcmllcyBpZiBjbGFzcyBsb2FkZXIgaXMgc3RvcHBlZAorICAgICAgICBpZiAoIXN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gKDEpIFBlcm1pc3Npb24gdG8gZGVmaW5lIHRoaXMgY2xhc3Mgd2hlbiB1c2luZyBhIFNlY3VyaXR5TWFuYWdlcgorICAgICAgICBpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBpID0gbmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiICAgICAgc2VjdXJpdHlNYW5hZ2VyLmNoZWNrUGFja2FnZURlZmluaXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlNYW5hZ2VyLmNoZWNrUGFja2FnZURlZmluaXRpb24obmFtZS5zdWJzdHJpbmcoMCxpKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiICAgICAgLS0+RXhjZXB0aW9uLS0+Q2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIsIHNlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSwgc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEFzayBvdXIgc3VwZXJjbGFzcyB0byBsb2NhdGUgdGhpcyBjbGFzcywgaWYgcG9zc2libGUKKyAgICAgICAgLy8gKHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIGl0IGlzIG5vdCBmb3VuZCkKKyAgICAgICAgQ2xhc3MgY2xhenogPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiICAgICAgZmluZENsYXNzSW50ZXJuYWwoIiArIG5hbWUgKyAiKSIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjbGF6eiA9IGZpbmRDbGFzc0ludGVybmFsKG5hbWUpOworICAgICAgICAgICAgfSBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWhhc0V4dGVybmFsUmVwb3NpdG9yaWVzKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGNuZmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGFjZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUsIGFjZSk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiICAgICAgLS0+UnVudGltZUV4Y2VwdGlvbiBSZXRocm93biIsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNsYXp6ID09IG51bGwpICYmIGhhc0V4dGVybmFsUmVwb3NpdG9yaWVzKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2xhenogPSBzdXBlci5maW5kQ2xhc3MobmFtZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGFjZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lLCBhY2UpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIiAgICAgIC0tPlJ1bnRpbWVFeGNlcHRpb24gUmV0aHJvd24iLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgLS0+IFJldHVybmluZyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiICAgIC0tPiBQYXNzaW5nIG9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gdGhlIGNsYXNzIHdlIGhhdmUgbG9jYXRlZAorICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIiAgICAgIFJldHVybmluZyBjbGFzcyAiICsgY2xhenopOworICAgICAgICBpZiAoKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSAmJiAoY2xhenogIT0gbnVsbCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIiAgICAgIExvYWRlZCBieSAiICsgY2xhenouZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIHJldHVybiAoY2xhenopOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgaW4gb3VyIGxvY2FsIHJlcG9zaXRvcnksIGFuZCByZXR1cm4gYQorICAgICAqIDxjb2RlPlVSTDwvY29kZT4gcmVmZXJpbmcgdG8gaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgcmVzb3VyY2UKKyAgICAgKiBjYW5ub3QgYmUgZm91bmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXNvdXJjZSB0byBiZSBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyBVUkwgZmluZFJlc291cmNlKGZpbmFsIFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgZmluZFJlc291cmNlKCIgKyBuYW1lICsgIikiKTsKKworICAgICAgICBVUkwgdXJsID0gbnVsbDsKKworICAgICAgICBSZXNvdXJjZUVudHJ5IGVudHJ5ID0gKFJlc291cmNlRW50cnkpIHJlc291cmNlRW50cmllcy5nZXQobmFtZSk7CisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICBlbnRyeSA9IGZpbmRSZXNvdXJjZUludGVybmFsKG5hbWUsIG5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICB1cmwgPSBlbnRyeS5zb3VyY2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHVybCA9PSBudWxsKSAmJiBoYXNFeHRlcm5hbFJlcG9zaXRvcmllcykKKyAgICAgICAgICAgIHVybCA9IHN1cGVyLmZpbmRSZXNvdXJjZShuYW1lKTsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgICAtLT4gUmV0dXJuaW5nICciICsgdXJsLnRvU3RyaW5nKCkgKyAiJyIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIC0tPiBSZXNvdXJjZSBub3QgZm91bmQsIHJldHVybmluZyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh1cmwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgPGNvZGU+VVJMczwvY29kZT4gcmVwcmVzZW50aW5nIGFsbCBvZiB0aGUKKyAgICAgKiByZXNvdXJjZXMgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gIElmIG5vIHJlc291cmNlcyB3aXRoIHRoaXMgbmFtZSBhcmUKKyAgICAgKiBmb3VuZCwgcmV0dXJuIGFuIGVtcHR5IGVudW1lcmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcmVzb3VyY2VzIHRvIGJlIGZvdW5kCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZmluZFJlc291cmNlcyhTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIiAgICBmaW5kUmVzb3VyY2VzKCIgKyBuYW1lICsgIikiKTsKKworICAgICAgICBWZWN0b3IgcmVzdWx0ID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIGludCBqYXJGaWxlc0xlbmd0aCA9IGphckZpbGVzLmxlbmd0aDsKKyAgICAgICAgaW50IHJlcG9zaXRvcmllc0xlbmd0aCA9IHJlcG9zaXRvcmllcy5sZW5ndGg7CisKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgLy8gTG9va2luZyBhdCB0aGUgcmVwb3NpdG9yaWVzCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXBvc2l0b3JpZXNMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbFBhdGggPSByZXBvc2l0b3JpZXNbaV0gKyBuYW1lOworICAgICAgICAgICAgICAgIHJlc291cmNlcy5sb29rdXAoZnVsbFBhdGgpOworICAgICAgICAgICAgICAgIC8vIE5vdGUgOiBOb3QgZ2V0dGluZyBhbiBleGNlcHRpb24gaGVyZSBtZWFucyB0aGUgcmVzb3VyY2Ugd2FzCisgICAgICAgICAgICAgICAgLy8gZm91bmQKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkRWxlbWVudChnZXRVUkkobmV3IEZpbGUoZmlsZXNbaV0sIG5hbWUpKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIExvb2tpbmcgYXQgdGhlIEpBUiBmaWxlcworICAgICAgICBzeW5jaHJvbml6ZWQgKGphckZpbGVzKSB7CisgICAgICAgICAgICBpZiAob3BlbkpBUnMoKSkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqYXJGaWxlc0xlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIEphckVudHJ5IGphckVudHJ5ID0gamFyRmlsZXNbaV0uZ2V0SmFyRW50cnkobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChqYXJFbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXJGYWtlVXJsID0gZ2V0VVJJKGphclJlYWxGaWxlc1tpXSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXJGYWtlVXJsID0gImphcjoiICsgamFyRmFrZVVybCArICIhLyIgKyBuYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRFbGVtZW50KG5ldyBVUkwoamFyRmFrZVVybCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZGluZyB0aGUgcmVzdWx0cyBvZiBhIGNhbGwgdG8gdGhlIHN1cGVyY2xhc3MKKyAgICAgICAgaWYgKGhhc0V4dGVybmFsUmVwb3NpdG9yaWVzKSB7CisKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIG90aGVyUmVzb3VyY2VQYXRocyA9IHN1cGVyLmZpbmRSZXNvdXJjZXMobmFtZSk7CisKKyAgICAgICAgICAgIHdoaWxlIChvdGhlclJlc291cmNlUGF0aHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkRWxlbWVudChvdGhlclJlc291cmNlUGF0aHMubmV4dEVsZW1lbnQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQuZWxlbWVudHMoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmluZCB0aGUgcmVzb3VyY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gIEEgcmVzb3VyY2UgaXMgc29tZSBkYXRhCisgICAgICogKGltYWdlcywgYXVkaW8sIHRleHQsIGV0Yy4pIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGJ5IGNsYXNzIGNvZGUgaW4gYQorICAgICAqIHdheSB0aGF0IGlzIGluZGVwZW5kZW50IG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgY29kZS4gIFRoZSBuYW1lIG9mIGEKKyAgICAgKiByZXNvdXJjZSBpcyBhICIvIi1zZXBhcmF0ZWQgcGF0aCBuYW1lIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuCisgICAgICogSWYgdGhlIHJlc291cmNlIGNhbm5vdCBiZSBmb3VuZCwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHNlYXJjaGVzIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIGFsZ29yaXRobSwgcmV0dXJuaW5nCisgICAgICogYXMgc29vbiBhcyBpdCBmaW5kcyB0aGUgYXBwcm9wcmlhdGUgVVJMLiAgSWYgdGhlIHJlc291cmNlIGNhbm5vdCBiZQorICAgICAqIGZvdW5kLCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+SWYgdGhlIDxjb2RlPmRlbGVnYXRlPC9jb2RlPiBwcm9wZXJ0eSBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sCisgICAgICogICAgIGNhbGwgdGhlIDxjb2RlPmdldFJlc291cmNlKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgcGFyZW50IGNsYXNzCisgICAgICogICAgIGxvYWRlciwgaWYgYW55LjwvbGk+CisgICAgICogPGxpPkNhbGwgPGNvZGU+ZmluZFJlc291cmNlKCk8L2NvZGU+IHRvIGZpbmQgdGhpcyByZXNvdXJjZSBpbiBvdXIKKyAgICAgKiAgICAgbG9jYWxseSBkZWZpbmVkIHJlcG9zaXRvcmllcy48L2xpPgorICAgICAqIDxsaT5DYWxsIHRoZSA8Y29kZT5nZXRSZXNvdXJjZSgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIHBhcmVudCBjbGFzcworICAgICAqICAgICBsb2FkZXIsIGlmIGFueS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXNvdXJjZSB0byByZXR1cm4gYSBVUkwgZm9yCisgICAgICovCisgICAgcHVibGljIFVSTCBnZXRSZXNvdXJjZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0UmVzb3VyY2UoIiArIG5hbWUgKyAiKSIpOworICAgICAgICBVUkwgdXJsID0gbnVsbDsKKworICAgICAgICAvLyAoMSkgRGVsZWdhdGUgdG8gcGFyZW50IGlmIHJlcXVlc3RlZAorICAgICAgICBpZiAoZGVsZWdhdGUpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgRGVsZWdhdGluZyB0byBwYXJlbnQgY2xhc3Nsb2FkZXIgIiArIHBhcmVudCk7CisgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBwYXJlbnQ7CisgICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpCisgICAgICAgICAgICAgICAgbG9hZGVyID0gc3lzdGVtOworICAgICAgICAgICAgdXJsID0gbG9hZGVyLmdldFJlc291cmNlKG5hbWUpOworICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgLS0+IFJldHVybmluZyAnIiArIHVybC50b1N0cmluZygpICsgIiciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHVybCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyAoMikgU2VhcmNoIGxvY2FsIHJlcG9zaXRvcmllcworICAgICAgICB1cmwgPSBmaW5kUmVzb3VyY2UobmFtZSk7CisgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTG9jYXRpbmcgdGhlIHJlcG9zaXRvcnkgZm9yIHNwZWNpYWwgaGFuZGxpbmcgaW4gdGhlIGNhc2UgCisgICAgICAgICAgICAvLyBvZiBhIEpBUgorICAgICAgICAgICAgaWYgKGFudGlKQVJMb2NraW5nKSB7CisgICAgICAgICAgICAgICAgUmVzb3VyY2VFbnRyeSBlbnRyeSA9IChSZXNvdXJjZUVudHJ5KSByZXNvdXJjZUVudHJpZXMuZ2V0KG5hbWUpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXBvc2l0b3J5ID0gZW50cnkuY29kZUJhc2UudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyZXBvc2l0b3J5LmVuZHNXaXRoKCIuamFyIikpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICghKG5hbWUuZW5kc1dpdGgoIi5jbGFzcyIpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgYmluYXJ5IGNvbnRlbnQgdG8gdGhlIHdvcmsgZGlyZWN0b3J5IGlmIG5vdCBwcmVzZW50CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHJlc291cmNlRmlsZSA9IG5ldyBGaWxlKGxvYWRlckRpciwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBnZXRVUkkocmVzb3VyY2VGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgLS0+IFJldHVybmluZyAnIiArIHVybC50b1N0cmluZygpICsgIiciKTsKKyAgICAgICAgICAgIHJldHVybiAodXJsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICgzKSBEZWxlZ2F0ZSB0byBwYXJlbnQgdW5jb25kaXRpb25hbGx5IGlmIG5vdCBhbHJlYWR5IGF0dGVtcHRlZAorICAgICAgICBpZiggIWRlbGVnYXRlICkgeworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gcGFyZW50OworICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIGxvYWRlciA9IHN5c3RlbTsKKyAgICAgICAgICAgIHVybCA9IGxvYWRlci5nZXRSZXNvdXJjZShuYW1lKTsKKyAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIC0tPiBSZXR1cm5pbmcgJyIgKyB1cmwudG9TdHJpbmcoKSArICInIik7CisgICAgICAgICAgICAgICAgcmV0dXJuICh1cmwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gKDQpIFJlc291cmNlIHdhcyBub3QgZm91bmQKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCIgIC0tPiBSZXNvdXJjZSBub3QgZm91bmQsIHJldHVybmluZyBudWxsIik7CisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIHJlc291cmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIGFuZCByZXR1cm4gYW4gaW5wdXQgc3RyZWFtCisgICAgICogdGhhdCBjYW4gYmUgdXNlZCBmb3IgcmVhZGluZyBpdC4gIFRoZSBzZWFyY2ggb3JkZXIgaXMgYXMgZGVzY3JpYmVkCisgICAgICogZm9yIDxjb2RlPmdldFJlc291cmNlKCk8L2NvZGU+LCBhZnRlciBjaGVja2luZyB0byBzZWUgaWYgdGhlIHJlc291cmNlCisgICAgICogZGF0YSBoYXMgYmVlbiBwcmV2aW91c2x5IGNhY2hlZC4gIElmIHRoZSByZXNvdXJjZSBjYW5ub3QgYmUgZm91bmQsCisgICAgICogcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gcmV0dXJuIGFuIGlucHV0IHN0cmVhbSBmb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0UmVzb3VyY2VBc1N0cmVhbSgiICsgbmFtZSArICIpIik7CisgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisKKyAgICAgICAgLy8gKDApIENoZWNrIGZvciBhIGNhY2hlZCBjb3B5IG9mIHRoaXMgcmVzb3VyY2UKKyAgICAgICAgc3RyZWFtID0gZmluZExvYWRlZFJlc291cmNlKG5hbWUpOworICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgLS0+IFJldHVybmluZyBzdHJlYW0gZnJvbSBjYWNoZSIpOworICAgICAgICAgICAgcmV0dXJuIChzdHJlYW0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gKDEpIERlbGVnYXRlIHRvIHBhcmVudCBpZiByZXF1ZXN0ZWQKKyAgICAgICAgaWYgKGRlbGVnYXRlKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIERlbGVnYXRpbmcgdG8gcGFyZW50IGNsYXNzbG9hZGVyICIgKyBwYXJlbnQpOworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gcGFyZW50OworICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIGxvYWRlciA9IHN5c3RlbTsKKyAgICAgICAgICAgIHN0cmVhbSA9IGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKG5hbWUpOworICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgLSBjYWNoZT8/PworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIC0tPiBSZXR1cm5pbmcgc3RyZWFtIGZyb20gcGFyZW50Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gKDIpIFNlYXJjaCBsb2NhbCByZXBvc2l0b3JpZXMKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFNlYXJjaGluZyBsb2NhbCByZXBvc2l0b3JpZXMiKTsKKyAgICAgICAgVVJMIHVybCA9IGZpbmRSZXNvdXJjZShuYW1lKTsKKyAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBGSVhNRSAtIGNhY2hlPz8/CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIC0tPiBSZXR1cm5pbmcgc3RyZWFtIGZyb20gbG9jYWwiKTsKKyAgICAgICAgICAgIHN0cmVhbSA9IGZpbmRMb2FkZWRSZXNvdXJjZShuYW1lKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGhhc0V4dGVybmFsUmVwb3NpdG9yaWVzICYmIChzdHJlYW0gPT0gbnVsbCkpCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgOyAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHN0cmVhbSk7CisgICAgICAgIH0KKworICAgICAgICAvLyAoMykgRGVsZWdhdGUgdG8gcGFyZW50IHVuY29uZGl0aW9uYWxseQorICAgICAgICBpZiAoIWRlbGVnYXRlKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIERlbGVnYXRpbmcgdG8gcGFyZW50IGNsYXNzbG9hZGVyIHVuY29uZGl0aW9uYWxseSAiICsgcGFyZW50KTsKKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IHBhcmVudDsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2FkZXIgPSBzeXN0ZW07CisgICAgICAgICAgICBzdHJlYW0gPSBsb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShuYW1lKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIEZJWE1FIC0gY2FjaGU/Pz8KKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAtLT4gUmV0dXJuaW5nIHN0cmVhbSBmcm9tIHBhcmVudCIpOworICAgICAgICAgICAgICAgIHJldHVybiAoc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vICg0KSBSZXNvdXJjZSB3YXMgbm90IGZvdW5kCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAtLT4gUmVzb3VyY2Ugbm90IGZvdW5kLCByZXR1cm5pbmcgbnVsbCIpOworICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gIFRoaXMgbWV0aG9kIHNlYXJjaGVzIGZvcgorICAgICAqIGNsYXNzZXMgaW4gdGhlIHNhbWUgbWFubmVyIGFzIDxjb2RlPmxvYWRDbGFzcyhTdHJpbmcsIGJvb2xlYW4pPC9jb2RlPgorICAgICAqIHdpdGggPGNvZGU+ZmFsc2U8L2NvZGU+IGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjbGFzcyB0byBiZSBsb2FkZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3Mgd2FzIG5vdCBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gKGxvYWRDbGFzcyhuYW1lLCBmYWxzZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgc2VhcmNoaW5nIHVzaW5nIHRoZSBmb2xsb3dpbmcKKyAgICAgKiBhbGdvcml0aG0gdW50aWwgaXQgZmluZHMgYW5kIHJldHVybnMgdGhlIGNsYXNzLiAgSWYgdGhlIGNsYXNzIGNhbm5vdAorICAgICAqIGJlIGZvdW5kLCByZXR1cm5zIDxjb2RlPkNsYXNzTm90Rm91bmRFeGNlcHRpb248L2NvZGU+LgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+Q2FsbCA8Y29kZT5maW5kTG9hZGVkQ2xhc3MoU3RyaW5nKTwvY29kZT4gdG8gY2hlY2sgaWYgdGhlCisgICAgICogICAgIGNsYXNzIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLiAgSWYgaXQgaGFzLCB0aGUgc2FtZQorICAgICAqICAgICA8Y29kZT5DbGFzczwvY29kZT4gb2JqZWN0IGlzIHJldHVybmVkLjwvbGk+CisgICAgICogPGxpPklmIHRoZSA8Y29kZT5kZWxlZ2F0ZTwvY29kZT4gcHJvcGVydHkgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LAorICAgICAqICAgICBjYWxsIHRoZSA8Y29kZT5sb2FkQ2xhc3MoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBwYXJlbnQgY2xhc3MKKyAgICAgKiAgICAgbG9hZGVyLCBpZiBhbnkuPC9saT4KKyAgICAgKiA8bGk+Q2FsbCA8Y29kZT5maW5kQ2xhc3MoKTwvY29kZT4gdG8gZmluZCB0aGlzIGNsYXNzIGluIG91ciBsb2NhbGx5CisgICAgICogICAgIGRlZmluZWQgcmVwb3NpdG9yaWVzLjwvbGk+CisgICAgICogPGxpPkNhbGwgdGhlIDxjb2RlPmxvYWRDbGFzcygpPC9jb2RlPiBtZXRob2Qgb2Ygb3VyIHBhcmVudAorICAgICAqICAgICBjbGFzcyBsb2FkZXIsIGlmIGFueS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogSWYgdGhlIGNsYXNzIHdhcyBmb3VuZCB1c2luZyB0aGUgYWJvdmUgc3RlcHMsIGFuZCB0aGUKKyAgICAgKiA8Y29kZT5yZXNvbHZlPC9jb2RlPiBmbGFnIGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGlzIG1ldGhvZCB3aWxsIHRoZW4KKyAgICAgKiBjYWxsIDxjb2RlPnJlc29sdmVDbGFzcyhDbGFzcyk8L2NvZGU+IG9uIHRoZSByZXN1bHRpbmcgQ2xhc3Mgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgbG9hZGVkCisgICAgICogQHBhcmFtIHJlc29sdmUgSWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiByZXNvbHZlIHRoZSBjbGFzcworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBjbGFzcyB3YXMgbm90IGZvdW5kCisgICAgICovCisgICAgcHVibGljIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgbmFtZSwgYm9vbGVhbiByZXNvbHZlKQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJsb2FkQ2xhc3MoIiArIG5hbWUgKyAiLCAiICsgcmVzb2x2ZSArICIpIik7CisgICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKworICAgICAgICAvLyBMb2cgYWNjZXNzIHRvIHN0b3BwZWQgY2xhc3Nsb2FkZXIKKyAgICAgICAgaWYgKCFzdGFydGVkKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJ3ZWJhcHBDbGFzc0xvYWRlci5zdG9wcGVkIiwgbmFtZSksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gKDApIENoZWNrIG91ciBwcmV2aW91c2x5IGxvYWRlZCBsb2NhbCBjbGFzcyBjYWNoZQorICAgICAgICBjbGF6eiA9IGZpbmRMb2FkZWRDbGFzczAobmFtZSk7CisgICAgICAgIGlmIChjbGF6eiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFJldHVybmluZyBjbGFzcyBmcm9tIGNhY2hlIik7CisgICAgICAgICAgICBpZiAocmVzb2x2ZSkKKyAgICAgICAgICAgICAgICByZXNvbHZlQ2xhc3MoY2xhenopOworICAgICAgICAgICAgcmV0dXJuIChjbGF6eik7CisgICAgICAgIH0KKworICAgICAgICAvLyAoMC4xKSBDaGVjayBvdXIgcHJldmlvdXNseSBsb2FkZWQgY2xhc3MgY2FjaGUKKyAgICAgICAgY2xhenogPSBmaW5kTG9hZGVkQ2xhc3MobmFtZSk7CisgICAgICAgIGlmIChjbGF6eiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFJldHVybmluZyBjbGFzcyBmcm9tIGNhY2hlIik7CisgICAgICAgICAgICBpZiAocmVzb2x2ZSkKKyAgICAgICAgICAgICAgICByZXNvbHZlQ2xhc3MoY2xhenopOworICAgICAgICAgICAgcmV0dXJuIChjbGF6eik7CisgICAgICAgIH0KKworICAgICAgICAvLyAoMC4yKSBUcnkgbG9hZGluZyB0aGUgY2xhc3Mgd2l0aCB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlciwgdG8gcHJldmVudAorICAgICAgICAvLyAgICAgICB0aGUgd2ViYXBwIGZyb20gb3ZlcnJpZGluZyBKMlNFIGNsYXNzZXMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsYXp6ID0gc3lzdGVtLmxvYWRDbGFzcyhuYW1lKTsKKyAgICAgICAgICAgIGlmIChjbGF6eiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVDbGFzcyhjbGF6eik7CisgICAgICAgICAgICAgICAgcmV0dXJuIChjbGF6eik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgIH0KKworICAgICAgICAvLyAoMC41KSBQZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGlzIGNsYXNzIHdoZW4gdXNpbmcgYSBTZWN1cml0eU1hbmFnZXIKKyAgICAgICAgaWYgKHNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgaSA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgIGlmIChpID49IDApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZWN1cml0eU1hbmFnZXIuY2hlY2tQYWNrYWdlQWNjZXNzKG5hbWUuc3Vic3RyaW5nKDAsaSkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvciA9ICJTZWN1cml0eSBWaW9sYXRpb24sIGF0dGVtcHQgdG8gdXNlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIlJlc3RyaWN0ZWQgQ2xhc3M6ICIgKyBuYW1lOworICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhlcnJvciwgc2UpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihlcnJvciwgc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gZGVsZWdhdGVMb2FkID0gZGVsZWdhdGUgfHwgZmlsdGVyKG5hbWUpOworCisgICAgICAgIC8vICgxKSBEZWxlZ2F0ZSB0byBvdXIgcGFyZW50IGlmIHJlcXVlc3RlZAorICAgICAgICBpZiAoZGVsZWdhdGVMb2FkKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIERlbGVnYXRpbmcgdG8gcGFyZW50IGNsYXNzbG9hZGVyMSAiICsgcGFyZW50KTsKKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IHBhcmVudDsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2FkZXIgPSBzeXN0ZW07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNsYXp6ID0gbG9hZGVyLmxvYWRDbGFzcyhuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgTG9hZGluZyBjbGFzcyBmcm9tIHBhcmVudCIpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVDbGFzcyhjbGF6eik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2xhenopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vICgyKSBTZWFyY2ggbG9jYWwgcmVwb3NpdG9yaWVzCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBTZWFyY2hpbmcgbG9jYWwgcmVwb3NpdG9yaWVzIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGF6eiA9IGZpbmRDbGFzcyhuYW1lKTsKKyAgICAgICAgICAgIGlmIChjbGF6eiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgTG9hZGluZyBjbGFzcyBmcm9tIGxvY2FsIHJlcG9zaXRvcnkiKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNsYXNzKGNsYXp6KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGNsYXp6KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKworICAgICAgICAvLyAoMykgRGVsZWdhdGUgdG8gcGFyZW50IHVuY29uZGl0aW9uYWxseQorICAgICAgICBpZiAoIWRlbGVnYXRlTG9hZCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBEZWxlZ2F0aW5nIHRvIHBhcmVudCBjbGFzc2xvYWRlciBhdCBlbmQ6ICIgKyBwYXJlbnQpOworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gcGFyZW50OworICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIGxvYWRlciA9IHN5c3RlbTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2xhenogPSBsb2FkZXIubG9hZENsYXNzKG5hbWUpOworICAgICAgICAgICAgICAgIGlmIChjbGF6eiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBMb2FkaW5nIGNsYXNzIGZyb20gcGFyZW50Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNsYXNzKGNsYXp6KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjbGF6eik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFBlcm1pc3Npb25zIGZvciBhIENvZGVTb3VyY2UuICBJZiB0aGlzIGluc3RhbmNlCisgICAgICogb2YgV2ViYXBwQ2xhc3NMb2FkZXIgaXMgZm9yIGEgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQsCisgICAgICogYWRkIHJlYWQgRmlsZVBlcm1pc3Npb24gb3IgSm5kaVBlcm1pc3Npb25zIGZvciB0aGUgYmFzZQorICAgICAqIGRpcmVjdG9yeSAoaWYgdW5wYWNrZWQpLAorICAgICAqIHRoZSBjb250ZXh0IFVSTCwgYW5kIGphciBmaWxlIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2RlU291cmNlIHdoZXJlIHRoZSBjb2RlIHdhcyBsb2FkZWQgZnJvbQorICAgICAqIEByZXR1cm4gUGVybWlzc2lvbkNvbGxlY3Rpb24gZm9yIENvZGVTb3VyY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGVybWlzc2lvbkNvbGxlY3Rpb24gZ2V0UGVybWlzc2lvbnMoQ29kZVNvdXJjZSBjb2RlU291cmNlKSB7CisKKyAgICAgICAgU3RyaW5nIGNvZGVVcmwgPSBjb2RlU291cmNlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKKyAgICAgICAgUGVybWlzc2lvbkNvbGxlY3Rpb24gcGM7CisgICAgICAgIGlmICgocGMgPSAoUGVybWlzc2lvbkNvbGxlY3Rpb24pbG9hZGVyUEMuZ2V0KGNvZGVVcmwpKSA9PSBudWxsKSB7CisgICAgICAgICAgICBwYyA9IHN1cGVyLmdldFBlcm1pc3Npb25zKGNvZGVTb3VyY2UpOworICAgICAgICAgICAgaWYgKHBjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJdGVyYXRvciBwZXJtcyA9IHBlcm1pc3Npb25MaXN0Lml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHBlcm1zLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uIHAgPSAoUGVybWlzc2lvbilwZXJtcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHBjLmFkZChwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9hZGVyUEMucHV0KGNvZGVVcmwscGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAocGMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZWFyY2ggcGF0aCBvZiBVUkxzIGZvciBsb2FkaW5nIGNsYXNzZXMgYW5kIHJlc291cmNlcy4KKyAgICAgKiBUaGlzIGluY2x1ZGVzIHRoZSBvcmlnaW5hbCBsaXN0IG9mIFVSTHMgc3BlY2lmaWVkIHRvIHRoZSBjb25zdHJ1Y3RvciwKKyAgICAgKiBhbG9uZyB3aXRoIGFueSBVUkxzIHN1YnNlcXVlbnRseSBhcHBlbmRlZCBieSB0aGUgYWRkVVJMKCkgbWV0aG9kLgorICAgICAqIEByZXR1cm4gdGhlIHNlYXJjaCBwYXRoIG9mIFVSTHMgZm9yIGxvYWRpbmcgY2xhc3NlcyBhbmQgcmVzb3VyY2VzLgorICAgICAqLworICAgIHB1YmxpYyBVUkxbXSBnZXRVUkxzKCkgeworCisgICAgICAgIGlmIChyZXBvc2l0b3J5VVJMcyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcmVwb3NpdG9yeVVSTHM7CisgICAgICAgIH0KKworICAgICAgICBVUkxbXSBleHRlcm5hbCA9IHN1cGVyLmdldFVSTHMoKTsKKworICAgICAgICBpbnQgZmlsZXNMZW5ndGggPSBmaWxlcy5sZW5ndGg7CisgICAgICAgIGludCBqYXJGaWxlc0xlbmd0aCA9IGphclJlYWxGaWxlcy5sZW5ndGg7CisgICAgICAgIGludCBsZW5ndGggPSBmaWxlc0xlbmd0aCArIGphckZpbGVzTGVuZ3RoICsgZXh0ZXJuYWwubGVuZ3RoOworICAgICAgICBpbnQgaTsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBVUkxbXSB1cmxzID0gbmV3IFVSTFtsZW5ndGhdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPCBmaWxlc0xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICB1cmxzW2ldID0gZ2V0VVJMKGZpbGVzW2ldLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCBmaWxlc0xlbmd0aCArIGphckZpbGVzTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIHVybHNbaV0gPSBnZXRVUkwoamFyUmVhbEZpbGVzW2kgLSBmaWxlc0xlbmd0aF0sIHRydWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVybHNbaV0gPSBleHRlcm5hbFtpIC0gZmlsZXNMZW5ndGggLSBqYXJGaWxlc0xlbmd0aF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXBvc2l0b3J5VVJMcyA9IHVybHM7CisKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlcG9zaXRvcnlVUkxzID0gbmV3IFVSTFswXTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXBvc2l0b3J5VVJMczsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlmZWN5Y2xlIGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaWZlY3ljbGUuIElmIHRoaXMgCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gbmV3IExpZmVjeWNsZUxpc3RlbmVyWzBdOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGUgY2xhc3MgbG9hZGVyLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgYSBsaWZlY3ljbGUgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVuY29kaW5nID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuY29kaW5nLmluZGV4T2YoIkVCQ0RJQyIpIT0tMSkgeworICAgICAgICAgICAgbmVlZENvbnZlcnQgPSB0cnVlOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIGNsYXNzIGxvYWRlci4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIGEgbGlmZWN5Y2xlIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDbGVhcmluZyByZWZlcmVuY2VzIHNob3VsZCBiZSBkb25lIGJlZm9yZSBzZXR0aW5nIHN0YXJ0ZWQgdG8KKyAgICAgICAgLy8gZmFsc2UsIGR1ZSB0byBwb3NzaWJsZSBzaWRlIGVmZmVjdHMKKyAgICAgICAgY2xlYXJSZWZlcmVuY2VzKCk7CisKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworCisgICAgICAgIGludCBsZW5ndGggPSBmaWxlcy5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZpbGVzW2ldID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGxlbmd0aCA9IGphckZpbGVzLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoamFyRmlsZXNbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBqYXJGaWxlc1tpXS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGphckZpbGVzW2ldID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIG5vdEZvdW5kUmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgIHJlc291cmNlRW50cmllcy5jbGVhcigpOworICAgICAgICByZXNvdXJjZXMgPSBudWxsOworICAgICAgICByZXBvc2l0b3JpZXMgPSBudWxsOworICAgICAgICByZXBvc2l0b3J5VVJMcyA9IG51bGw7CisgICAgICAgIGZpbGVzID0gbnVsbDsKKyAgICAgICAgamFyRmlsZXMgPSBudWxsOworICAgICAgICBqYXJSZWFsRmlsZXMgPSBudWxsOworICAgICAgICBqYXJQYXRoID0gbnVsbDsKKyAgICAgICAgamFyTmFtZXMgPSBudWxsOworICAgICAgICBsYXN0TW9kaWZpZWREYXRlcyA9IG51bGw7CisgICAgICAgIHBhdGhzID0gbnVsbDsKKyAgICAgICAgaGFzRXh0ZXJuYWxSZXBvc2l0b3JpZXMgPSBmYWxzZTsKKyAgICAgICAgcGFyZW50ID0gbnVsbDsKKworICAgICAgICBwZXJtaXNzaW9uTGlzdC5jbGVhcigpOworICAgICAgICBsb2FkZXJQQy5jbGVhcigpOworCisgICAgICAgIGlmIChsb2FkZXJEaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgZGVsZXRlRGlyKGxvYWRlckRpcik7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVXNlZCB0byBwZXJpb2RpY2FsbHkgc2lnbmFsIHRvIHRoZSBjbGFzc2xvYWRlciB0byByZWxlYXNlIAorICAgICAqIEpBUiByZXNvdXJjZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2VKQVJzKGJvb2xlYW4gZm9yY2UpIHsKKyAgICAgICAgaWYgKGphckZpbGVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGphckZpbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZSB8fCAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAobGFzdEphckFjY2Vzc2VkICsgOTAwMDApKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJGaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXJGaWxlc1tpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXJGaWxlc1tpXS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFyRmlsZXNbaV0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNsb3NlIEpBUiIsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworICAgIAorICAgIC8qKgorICAgICAqIENsZWFyIHJlZmVyZW5jZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYXJSZWZlcmVuY2VzKCkgeworCisgICAgICAgIC8vIFVucmVnaXN0ZXIgYW55IEpEQkMgZHJpdmVycyBsb2FkZWQgYnkgdGhpcyBjbGFzc2xvYWRlcgorICAgICAgICBFbnVtZXJhdGlvbiBkcml2ZXJzID0gRHJpdmVyTWFuYWdlci5nZXREcml2ZXJzKCk7CisgICAgICAgIHdoaWxlIChkcml2ZXJzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBEcml2ZXIgZHJpdmVyID0gKERyaXZlcikgZHJpdmVycy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKGRyaXZlci5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkgPT0gdGhpcykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIERyaXZlck1hbmFnZXIuZGVyZWdpc3RlckRyaXZlcihkcml2ZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJTUUwgZHJpdmVyIGRlcmVnaXN0cmF0aW9uIGZhaWxlZCIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gTnVsbCBvdXQgYW55IHN0YXRpYyBvciBmaW5hbCBmaWVsZHMgZnJvbSBsb2FkZWQgY2xhc3NlcywKKyAgICAgICAgLy8gYXMgYSB3b3JrYXJvdW5kIGZvciBhcHBhcmVudCBnYXJiYWdlIGNvbGxlY3Rpb24gYnVncworICAgICAgICBpZiAoRU5BQkxFX0NMRUFSX1JFRkVSRU5DRVMpIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGxvYWRlZENsYXNzZXMgPSAoKEhhc2hNYXApIHJlc291cmNlRW50cmllcy5jbG9uZSgpKS52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGxvYWRlZENsYXNzZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgUmVzb3VyY2VFbnRyeSBlbnRyeSA9IChSZXNvdXJjZUVudHJ5KSBsb2FkZWRDbGFzc2VzLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkubG9hZGVkQ2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IGVudHJ5LmxvYWRlZENsYXNzOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kcyA9IGZpZWxkLmdldE1vZGlmaWVycygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5nZXRUeXBlKCkuaXNQcmltaXRpdmUoKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChmaWVsZC5nZXROYW1lKCkuaW5kZXhPZigiJCIpICE9IC0xKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1vZGlmaWVyLmlzU3RhdGljKG1vZHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1vZGlmaWVyLmlzRmluYWwobW9kcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgoZmllbGQuZ2V0VHlwZSgpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJqYXZhLiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGZpZWxkLmdldFR5cGUoKS5nZXROYW1lKCkuc3RhcnRzV2l0aCgiamF2YXguIikpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsSW5zdGFuY2UoZmllbGQuZ2V0KG51bGwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnNldChudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXQgZmllbGQgIiArIGZpZWxkLmdldE5hbWUoKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdG8gbnVsbCBpbiBjbGFzcyAiICsgY2xhenouZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvdWxkIG5vdCBzZXQgZmllbGQgIiArIGZpZWxkLmdldE5hbWUoKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0byBudWxsIGluIGNsYXNzICIgKyBjbGF6ei5nZXROYW1lKCksIHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb3VsZCBub3QgY2xlYW4gZmllbGRzIGZvciBjbGFzcyAiICsgY2xhenouZ2V0TmFtZSgpLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gUmVtb3ZlIGVudHJpZXMgZm9yIHRoaXMgd2ViYXBwIGZyb20gdGhlIEpTUCBFTCBCZWFuSW5mbyBjYWNoZQorICAgICAgICBjbGVhbkVsQ2FjaGUoKTsKKyAgICAgICAgCisgICAgICAgIC8vIENsZWFyIHRoZSBJbnRyb3NwZWN0aW9uVXRpbHMgY2FjaGUuCisgICAgICAgIEludHJvc3BlY3Rpb25VdGlscy5jbGVhcigpOworICAgICAgICAKKyAgICAgICAgLy8gQ2xlYXIgdGhlIEludHJvc3BlY3Rpb25VdGlscyBjYWNoZSBmb3IgbW9kZWxlci4KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIudXRpbC5JbnRyb3NwZWN0aW9uVXRpbHMuY2xlYXIoKTsKKworICAgICAgICAvLyBDbGVhciB0aGUgY2xhc3Nsb2FkZXIgcmVmZXJlbmNlIGluIGNvbW1vbi1sb2dnaW5nCisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkucmVsZWFzZSh0aGlzKTsKKyAgICAgICAgCisgICAgICAgIC8vIENsZWFyIHRoZSBjbGFzc2xvYWRlciByZWZlcmVuY2UgaW4gdGhlIFZNJ3MgYmVhbiBpbnRyb3NwZWN0b3IKKyAgICAgICAgamF2YS5iZWFucy5JbnRyb3NwZWN0b3IuZmx1c2hDYWNoZXMoKTsKKworICAgIH0KKworCisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYW5FbENhY2hlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgbWFuYWdlckNsYXNzID0KKyAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLmNvbW1vbnMuZWwuQmVhbkluZm9NYW5hZ2VyIik7CisgICAgICAgICAgICBGaWVsZCBjYWNoZUZpZWxkID0KKyAgICAgICAgICAgICAgICBtYW5hZ2VyQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgibUJlYW5JbmZvTWFuYWdlckJ5Q2xhc3MiKTsKKyAgICAgICAgICAgIGNhY2hlRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIE1hcCBtYXAgPSAoTWFwKSBjYWNoZUZpZWxkLmdldChudWxsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU2V0IHZpY3RpbXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIENsYXNzIGNhY2hlZENsYXNzID0gKENsYXNzKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZihsb2FkZWRCeVRoaXNPckNoaWxkKGNhY2hlZENsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICB2aWN0aW1zLmFkZChjYWNoZWRDbGFzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBtYXAua2V5U2V0KCkucmVtb3ZlQWxsKHZpY3RpbXMpOworICAgICAgICAgICAgCisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvdWxkIG5vdCBjbGVhbiBFTCBjYWNoZSIsIHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIG51bGxJbnN0YW5jZShPYmplY3QgaW5zdGFuY2UpIHsKKyAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGluc3RhbmNlLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gZmllbGRzW2ldOworICAgICAgICAgICAgaW50IG1vZHMgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsKKyAgICAgICAgICAgIGlmIChmaWVsZC5nZXRUeXBlKCkuaXNQcmltaXRpdmUoKSAKKyAgICAgICAgICAgICAgICAgICAgfHwgKGZpZWxkLmdldE5hbWUoKS5pbmRleE9mKCIkIikgIT0gLTEpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKE1vZGlmaWVyLmlzU3RhdGljKG1vZHMpICYmIE1vZGlmaWVyLmlzRmluYWwobW9kcykpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRG9pbmcgc29tZXRoaW5nIHJlY3Vyc2l2ZWx5IGlzIHRvbyByaXNreQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBmaWVsZC5nZXQoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdmFsdWVDbGFzcyA9IHZhbHVlLmdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxvYWRlZEJ5VGhpc09yQ2hpbGQodmFsdWVDbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJOb3Qgc2V0dGluZyBmaWVsZCAiICsgZmllbGQuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRvIG51bGwgaW4gb2JqZWN0IG9mIGNsYXNzICIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5nZXRDbGFzcygpLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBiZWNhdXNlIHRoZSByZWZlcmVuY2VkIG9iamVjdCB3YXMgb2YgdHlwZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUNsYXNzLmdldE5hbWUoKSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2hpY2ggd2FzIG5vdCBsb2FkZWQgYnkgdGhpcyBXZWJhcHBDbGFzc0xvYWRlci4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnNldChpbnN0YW5jZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2V0IGZpZWxkICIgKyBmaWVsZC5nZXROYW1lKCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRvIG51bGwgaW4gY2xhc3MgIiArIGluc3RhbmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvdWxkIG5vdCBzZXQgZmllbGQgIiArIGZpZWxkLmdldE5hbWUoKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdG8gbnVsbCBpbiBvYmplY3QgaW5zdGFuY2Ugb2YgY2xhc3MgIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluc3RhbmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpLCB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERldGVybWluZSB3aGV0aGVyIGEgY2xhc3Mgd2FzIGxvYWRlZCBieSB0aGlzIGNsYXNzIGxvYWRlciBvciBvbmUgb2YKKyAgICAgKiBpdHMgY2hpbGQgY2xhc3MgbG9hZGVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsb2FkZWRCeVRoaXNPckNoaWxkKENsYXNzIGNsYXp6KQorICAgIHsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IGNsYXp6LmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgbnVsbCAhPSBjbGFzc0xvYWRlcjsgY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlci5nZXRQYXJlbnQoKSkgeworICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyLmVxdWFscyh0aGlzKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9ICAgIAorCisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHBlcmlvZGljYWxseSBzaWduYWwgdG8gdGhlIGNsYXNzbG9hZGVyIHRvIHJlbGVhc2UgSkFSIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBvcGVuSkFScygpIHsKKyAgICAgICAgaWYgKHN0YXJ0ZWQgJiYgKGphckZpbGVzLmxlbmd0aCA+IDApKSB7CisgICAgICAgICAgICBsYXN0SmFyQWNjZXNzZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGlmIChqYXJGaWxlc1swXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJGaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgamFyRmlsZXNbaV0gPSBuZXcgSmFyRmlsZShqYXJSZWFsRmlsZXNbaV0pOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZhaWxlZCB0byBvcGVuIEpBUiIsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmluZCBzcGVjaWZpZWQgY2xhc3MgaW4gbG9jYWwgcmVwb3NpdG9yaWVzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbG9hZGVkIGNsYXNzLCBvciBudWxsIGlmIHRoZSBjbGFzcyBpc24ndCBmb3VuZAorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzcyBmaW5kQ2xhc3NJbnRlcm5hbChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIGlmICghdmFsaWRhdGUobmFtZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKKworICAgICAgICBTdHJpbmcgdGVtcFBhdGggPSBuYW1lLnJlcGxhY2UoJy4nLCAnLycpOworICAgICAgICBTdHJpbmcgY2xhc3NQYXRoID0gdGVtcFBhdGggKyAiLmNsYXNzIjsKKworICAgICAgICBSZXNvdXJjZUVudHJ5IGVudHJ5ID0gbnVsbDsKKworICAgICAgICBlbnRyeSA9IGZpbmRSZXNvdXJjZUludGVybmFsKG5hbWUsIGNsYXNzUGF0aCk7CisKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKKworICAgICAgICBDbGFzcyBjbGF6eiA9IGVudHJ5LmxvYWRlZENsYXNzOworICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBjbGF6ejsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5iaW5hcnlDb250ZW50ID09IG51bGwgJiYgZW50cnkubG9hZGVkQ2xhc3MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKKworICAgICAgICAgICAgLy8gTG9va2luZyB1cCB0aGUgcGFja2FnZQorICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKKyAgICAgICAgICAgIGludCBwb3MgPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgICAgICBpZiAocG9zICE9IC0xKQorICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgcG9zKTsKKyAgICAKKyAgICAgICAgICAgIFBhY2thZ2UgcGtnID0gbnVsbDsKKyAgICAKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICBwa2cgPSBnZXRQYWNrYWdlKHBhY2thZ2VOYW1lKTsKKyAgICAKKyAgICAgICAgICAgICAgICAvLyBEZWZpbmUgdGhlIHBhY2thZ2UgKGlmIG51bGwpCisgICAgICAgICAgICAgICAgaWYgKHBrZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5tYW5pZmVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVQYWNrYWdlKHBhY2thZ2VOYW1lLCBudWxsLCBudWxsLCBudWxsLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZVBhY2thZ2UocGFja2FnZU5hbWUsIGVudHJ5Lm1hbmlmZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5jb2RlQmFzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworICAgIAorICAgICAgICAgICAgICAgIC8vIENoZWNraW5nIHNlYWxpbmcKKyAgICAgICAgICAgICAgICBpZiAocGtnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZWFsQ2hlY2sgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAocGtnLmlzU2VhbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYWxDaGVjayA9IHBrZy5pc1NlYWxlZChlbnRyeS5jb2RlQmFzZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWFsQ2hlY2sgPSAoZW50cnkubWFuaWZlc3QgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNQYWNrYWdlU2VhbGVkKHBhY2thZ2VOYW1lLCBlbnRyeS5tYW5pZmVzdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWFsQ2hlY2spCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIlNlYWxpbmcgdmlvbGF0aW9uIGxvYWRpbmcgIiArIG5hbWUgKyAiIDogUGFja2FnZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFja2FnZU5hbWUgKyAiIGlzIHNlYWxlZC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlbnRyeS5sb2FkZWRDbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xhenogPSBkZWZpbmVDbGFzcyhuYW1lLCBlbnRyeS5iaW5hcnlDb250ZW50LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuYmluYXJ5Q29udGVudC5sZW5ndGgsIAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvZGVTb3VyY2UoZW50cnkuY29kZUJhc2UsIGVudHJ5LmNlcnRpZmljYXRlcykpOworICAgICAgICAgICAgICAgIGVudHJ5LmxvYWRlZENsYXNzID0gY2xheno7CisgICAgICAgICAgICAgICAgZW50cnkuYmluYXJ5Q29udGVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgZW50cnkuc291cmNlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBlbnRyeS5jb2RlQmFzZSA9IG51bGw7CisgICAgICAgICAgICAgICAgZW50cnkubWFuaWZlc3QgPSBudWxsOworICAgICAgICAgICAgICAgIGVudHJ5LmNlcnRpZmljYXRlcyA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNsYXp6ID0gZW50cnkubG9hZGVkQ2xhc3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBjbGF6ejsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgc3BlY2lmaWVkIHJlc291cmNlIGluIGxvY2FsIHJlcG9zaXRvcmllcy4gVGhpcyBibG9jaworICAgICAqIHdpbGwgZXhlY3V0ZSB1bmRlciBhbiBBY2Nlc3NDb250cm9sLmRvUHJpdmlsZWdlIGJsb2NrLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbG9hZGVkIHJlc291cmNlLCBvciBudWxsIGlmIHRoZSByZXNvdXJjZSBpc24ndCBmb3VuZAorICAgICAqLworICAgIHByb3RlY3RlZCBSZXNvdXJjZUVudHJ5IGZpbmRSZXNvdXJjZUludGVybmFsKEZpbGUgZmlsZSwgU3RyaW5nIHBhdGgpeworICAgICAgICBSZXNvdXJjZUVudHJ5IGVudHJ5ID0gbmV3IFJlc291cmNlRW50cnkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVudHJ5LnNvdXJjZSA9IGdldFVSSShuZXcgRmlsZShmaWxlLCBwYXRoKSk7CisgICAgICAgICAgICBlbnRyeS5jb2RlQmFzZSA9IGdldFVSTChuZXcgRmlsZShmaWxlLCBwYXRoKSwgZmFsc2UpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gICAKKyAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIEZpbmQgc3BlY2lmaWVkIHJlc291cmNlIGluIGxvY2FsIHJlcG9zaXRvcmllcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGxvYWRlZCByZXNvdXJjZSwgb3IgbnVsbCBpZiB0aGUgcmVzb3VyY2UgaXNuJ3QgZm91bmQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VFbnRyeSBmaW5kUmVzb3VyY2VJbnRlcm5hbChTdHJpbmcgbmFtZSwgU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBpZiAoIXN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygid2ViYXBwQ2xhc3NMb2FkZXIuc3RvcHBlZCIsIG5hbWUpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChuYW1lID09IG51bGwpIHx8IChwYXRoID09IG51bGwpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgUmVzb3VyY2VFbnRyeSBlbnRyeSA9IChSZXNvdXJjZUVudHJ5KSByZXNvdXJjZUVudHJpZXMuZ2V0KG5hbWUpOworICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKworICAgICAgICBpbnQgY29udGVudExlbmd0aCA9IC0xOworICAgICAgICBJbnB1dFN0cmVhbSBiaW5hcnlTdHJlYW0gPSBudWxsOworCisgICAgICAgIGludCBqYXJGaWxlc0xlbmd0aCA9IGphckZpbGVzLmxlbmd0aDsKKyAgICAgICAgaW50IHJlcG9zaXRvcmllc0xlbmd0aCA9IHJlcG9zaXRvcmllcy5sZW5ndGg7CisKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCisgICAgICAgIGJvb2xlYW4gZmlsZU5lZWRDb252ZXJ0ID0gZmFsc2U7CisKKyAgICAgICAgZm9yIChpID0gMDsgKGVudHJ5ID09IG51bGwpICYmIChpIDwgcmVwb3NpdG9yaWVzTGVuZ3RoKTsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGxQYXRoID0gcmVwb3NpdG9yaWVzW2ldICsgcGF0aDsKKworICAgICAgICAgICAgICAgIE9iamVjdCBsb29rdXBSZXN1bHQgPSByZXNvdXJjZXMubG9va3VwKGZ1bGxQYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAobG9va3VwUmVzdWx0IGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGxvb2t1cFJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBOb3RlIDogTm90IGdldHRpbmcgYW4gZXhjZXB0aW9uIGhlcmUgbWVhbnMgdGhlIHJlc291cmNlIHdhcworICAgICAgICAgICAgICAgIC8vIGZvdW5kCisgICAgICAgICAgICAgICAgIGlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBQcml2aWxlZ2VkQWN0aW9uIGRwID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRmluZFJlc291cmNlKGZpbGVzW2ldLCBwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkgPSAoUmVzb3VyY2VFbnRyeSlBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChkcCk7CisgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gZmluZFJlc291cmNlSW50ZXJuYWwoZmlsZXNbaV0sIHBhdGgpOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBSZXNvdXJjZUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9CisgICAgICAgICAgICAgICAgICAgIChSZXNvdXJjZUF0dHJpYnV0ZXMpIHJlc291cmNlcy5nZXRBdHRyaWJ1dGVzKGZ1bGxQYXRoKTsKKyAgICAgICAgICAgICAgICBjb250ZW50TGVuZ3RoID0gKGludCkgYXR0cmlidXRlcy5nZXRDb250ZW50TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgZW50cnkubGFzdE1vZGlmaWVkID0gYXR0cmlidXRlcy5nZXRMYXN0TW9kaWZpZWQoKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisKKworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5U3RyZWFtID0gcmVzb3VyY2Uuc3RyZWFtQ29udGVudCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkQ29udmVydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoIi5wcm9wZXJ0aWVzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmVlZENvbnZlcnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGZ1bGwgcGF0aCBmb3IgbW9kaWZpY2F0aW9uIGNoZWNraW5nCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IE9ubHkgc3luY2luZyBvbiBhICdjb25zdGFudCcgb2JqZWN0IGlzIG5lZWRlZAorICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGFsbFBlcm1pc3Npb24pIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdbXSByZXN1bHQyID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGxvbmdbbGFzdE1vZGlmaWVkRGF0ZXMubGVuZ3RoICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGFzdE1vZGlmaWVkRGF0ZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQyW2pdID0gbGFzdE1vZGlmaWVkRGF0ZXNbal07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQyW2xhc3RNb2RpZmllZERhdGVzLmxlbmd0aF0gPSBlbnRyeS5sYXN0TW9kaWZpZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWREYXRlcyA9IHJlc3VsdDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbcGF0aHMubGVuZ3RoICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGF0aHMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbal0gPSBwYXRoc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtwYXRocy5sZW5ndGhdID0gZnVsbFBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRocyA9IHJlc3VsdDsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGVudHJ5ID09IG51bGwpICYmIChub3RGb3VuZFJlc291cmNlcy5jb250YWluc0tleShuYW1lKSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBKYXJFbnRyeSBqYXJFbnRyeSA9IG51bGw7CisKKyAgICAgICAgc3luY2hyb25pemVkIChqYXJGaWxlcykgeworCisgICAgICAgICAgICBpZiAoIW9wZW5KQVJzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IChlbnRyeSA9PSBudWxsKSAmJiAoaSA8IGphckZpbGVzTGVuZ3RoKTsgaSsrKSB7CisKKyAgICAgICAgICAgICAgICBqYXJFbnRyeSA9IGphckZpbGVzW2ldLmdldEphckVudHJ5KHBhdGgpOworCisgICAgICAgICAgICAgICAgaWYgKGphckVudHJ5ICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IG5ldyBSZXNvdXJjZUVudHJ5KCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5jb2RlQmFzZSA9IGdldFVSTChqYXJSZWFsRmlsZXNbaV0sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXJGYWtlVXJsID0gZ2V0VVJJKGphclJlYWxGaWxlc1tpXSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGphckZha2VVcmwgPSAiamFyOiIgKyBqYXJGYWtlVXJsICsgIiEvIiArIHBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zb3VyY2UgPSBuZXcgVVJMKGphckZha2VVcmwpOworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkubGFzdE1vZGlmaWVkID0gamFyUmVhbEZpbGVzW2ldLmxhc3RNb2RpZmllZCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGVudExlbmd0aCA9IChpbnQpIGphckVudHJ5LmdldFNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lm1hbmlmZXN0ID0gamFyRmlsZXNbaV0uZ2V0TWFuaWZlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmFyeVN0cmVhbSA9IGphckZpbGVzW2ldLmdldElucHV0U3RyZWFtKGphckVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IHJlc291cmNlcyBjb250YWluZWQgaW4gSkFSIHRvIHRoZSB3b3JrZGlyCisgICAgICAgICAgICAgICAgICAgIGlmIChhbnRpSkFSTG9ja2luZyAmJiAhKHBhdGguZW5kc1dpdGgoIi5jbGFzcyIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSByZXNvdXJjZUZpbGUgPSBuZXcgRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkZXJEaXIsIGphckVudHJ5LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXJGaWxlc1tpXS5lbnRyaWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFyRW50cnkgamFyRW50cnkyID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSmFyRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoamFyRW50cnkyLmlzRGlyZWN0b3J5KCkpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFqYXJFbnRyeTIuZ2V0TmFtZSgpLmVuZHNXaXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCIuY2xhc3MiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlRmlsZSA9IG5ldyBGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWRlckRpciwgamFyRW50cnkyLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvcyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzID0gamFyRmlsZXNbaV0uZ2V0SW5wdXRTdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphckVudHJ5Mik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IGlzLnJlYWQoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Mud3JpdGUoYnVmLCAwLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobm90Rm91bmRSZXNvdXJjZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbm90Rm91bmRSZXNvdXJjZXMucHV0KG5hbWUsIG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJpbmFyeVN0cmVhbSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICBieXRlW10gYmluYXJ5Q29udGVudCA9IG5ldyBieXRlW2NvbnRlbnRMZW5ndGhdOworCisgICAgICAgICAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4gPSBiaW5hcnlTdHJlYW0ucmVhZChiaW5hcnlDb250ZW50LCBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmFyeUNvbnRlbnQubGVuZ3RoIC0gcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuIDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBiaW5hcnlTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmaWxlTmVlZENvbnZlcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcoYmluYXJ5Q29udGVudCwwLHBvcyk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaW5hcnlDb250ZW50ID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW50cnkuYmluYXJ5Q29udGVudCA9IGJpbmFyeUNvbnRlbnQ7CisKKyAgICAgICAgICAgICAgICAvLyBUaGUgY2VydGlmaWNhdGVzIGFyZSBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgSmFyRW50cnkgCisgICAgICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCBpbnB1dCBzdHJlYW0gaGFzIGJlZW4gZnVsbHkgcmVhZAorICAgICAgICAgICAgICAgIGlmIChqYXJFbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmNlcnRpZmljYXRlcyA9IGphckVudHJ5LmdldENlcnRpZmljYXRlcygpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgdGhlIGVudHJ5IGluIHRoZSBsb2NhbCByZXNvdXJjZSByZXBvc2l0b3J5CisgICAgICAgIHN5bmNocm9uaXplZCAocmVzb3VyY2VFbnRyaWVzKSB7CisgICAgICAgICAgICAvLyBFbnN1cmVzIHRoYXQgYWxsIHRoZSB0aHJlYWRzIHdoaWNoIG1heSBiZSBpbiBhIHJhY2UgdG8gbG9hZAorICAgICAgICAgICAgLy8gYSBwYXJ0aWN1bGFyIGNsYXNzIGFsbCBlbmQgdXAgd2l0aCB0aGUgc2FtZSBSZXNvdXJjZUVudHJ5CisgICAgICAgICAgICAvLyBpbnN0YW5jZQorICAgICAgICAgICAgUmVzb3VyY2VFbnRyeSBlbnRyeTIgPSAoUmVzb3VyY2VFbnRyeSkgcmVzb3VyY2VFbnRyaWVzLmdldChuYW1lKTsKKyAgICAgICAgICAgIGlmIChlbnRyeTIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlc291cmNlRW50cmllcy5wdXQobmFtZSwgZW50cnkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbnRyeSA9IGVudHJ5MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlbnRyeTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcGFja2FnZSBuYW1lIGlzIHNlYWxlZCBhY2NvcmRpbmcgdG8gdGhlCisgICAgICogZ2l2ZW4gbWFuaWZlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNQYWNrYWdlU2VhbGVkKFN0cmluZyBuYW1lLCBNYW5pZmVzdCBtYW4pIHsKKworICAgICAgICBTdHJpbmcgcGF0aCA9IG5hbWUucmVwbGFjZSgnLicsICcvJykgKyAnLyc7CisgICAgICAgIEF0dHJpYnV0ZXMgYXR0ciA9IG1hbi5nZXRBdHRyaWJ1dGVzKHBhdGgpOyAKKyAgICAgICAgU3RyaW5nIHNlYWxlZCA9IG51bGw7CisgICAgICAgIGlmIChhdHRyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNlYWxlZCA9IGF0dHIuZ2V0VmFsdWUoTmFtZS5TRUFMRUQpOworICAgICAgICB9CisgICAgICAgIGlmIChzZWFsZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKChhdHRyID0gbWFuLmdldE1haW5BdHRyaWJ1dGVzKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZWFsZWQgPSBhdHRyLmdldFZhbHVlKE5hbWUuU0VBTEVEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2Uoc2VhbGVkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmluZHMgdGhlIHJlc291cmNlIHdpdGggdGhlIGdpdmVuIG5hbWUgaWYgaXQgaGFzIHByZXZpb3VzbHkgYmVlbgorICAgICAqIGxvYWRlZCBhbmQgY2FjaGVkIGJ5IHRoaXMgY2xhc3MgbG9hZGVyLCBhbmQgcmV0dXJuIGFuIGlucHV0IHN0cmVhbQorICAgICAqIHRvIHRoZSByZXNvdXJjZSBkYXRhLiAgSWYgdGhpcyByZXNvdXJjZSBoYXMgbm90IGJlZW4gY2FjaGVkLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHJlc291cmNlIHRvIHJldHVybgorICAgICAqLworICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBmaW5kTG9hZGVkUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBSZXNvdXJjZUVudHJ5IGVudHJ5ID0gKFJlc291cmNlRW50cnkpIHJlc291cmNlRW50cmllcy5nZXQobmFtZSk7CisgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZW50cnkuYmluYXJ5Q29udGVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW50cnkuYmluYXJ5Q29udGVudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmluZHMgdGhlIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUgaWYgaXQgaGFzIHByZXZpb3VzbHkgYmVlbgorICAgICAqIGxvYWRlZCBhbmQgY2FjaGVkIGJ5IHRoaXMgY2xhc3MgbG9hZGVyLCBhbmQgcmV0dXJuIHRoZSBDbGFzcyBvYmplY3QuCisgICAgICogSWYgdGhpcyBjbGFzcyBoYXMgbm90IGJlZW4gY2FjaGVkLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXNvdXJjZSB0byByZXR1cm4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZmluZExvYWRlZENsYXNzMChTdHJpbmcgbmFtZSkgeworCisgICAgICAgIFJlc291cmNlRW50cnkgZW50cnkgPSAoUmVzb3VyY2VFbnRyeSkgcmVzb3VyY2VFbnRyaWVzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS5sb2FkZWRDbGFzczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG51bGwpOyAgLy8gRklYTUUgLSBmaW5kTG9hZGVkUmVzb3VyY2UoKQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWZyZXNoIHRoZSBzeXN0ZW0gcG9saWN5IGZpbGUsIHRvIHBpY2sgdXAgZXZlbnR1YWwgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoUG9saWN5KCkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBUaGUgcG9saWN5IGZpbGUgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCB0byBhZGp1c3QgCisgICAgICAgICAgICAvLyBwZXJtaXNzaW9ucywgc28gd2UncmUgcmVsb2FkaW5nIGl0IHdoZW4gbG9hZGluZyBvciAKKyAgICAgICAgICAgIC8vIHJlbG9hZGluZyBhIENvbnRleHQKKyAgICAgICAgICAgIFBvbGljeSBwb2xpY3kgPSBQb2xpY3kuZ2V0UG9saWN5KCk7CisgICAgICAgICAgICBwb2xpY3kucmVmcmVzaCgpOworICAgICAgICB9IGNhdGNoIChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFNvbWUgcG9saWN5IGZpbGVzIG1heSByZXN0cmljdCB0aGlzLCBldmVuIGZvciB0aGUgY29yZSwKKyAgICAgICAgICAgIC8vIHNvIHRoaXMgZXhjZXB0aW9uIGlzIGlnbm9yZWQKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgY2xhc3Nlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBjbGFzcyBuYW1lCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjbGFzcyBzaG91bGQgYmUgZmlsdGVyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmaWx0ZXIoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIExvb2tpbmcgdXAgdGhlIHBhY2thZ2UKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKKyAgICAgICAgaW50IHBvcyA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKHBvcyAhPSAtMSkKKyAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgcG9zKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZVRyaWdnZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUuc3RhcnRzV2l0aChwYWNrYWdlVHJpZ2dlcnNbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSBhIGNsYXNzbmFtZS4gQXMgcGVyIFNSVi45LjcuMiwgd2UgbXVzdCByZXN0aWN0IGxvYWRpbmcgb2YgCisgICAgICogY2xhc3NlcyBmcm9tIEoyU0UgKGphdmEuKikgYW5kIGNsYXNzZXMgb2YgdGhlIHNlcnZsZXQgQVBJIAorICAgICAqIChqYXZheC5zZXJ2bGV0LiopLiBUaGF0IHNob3VsZCBlbmhhbmNlIHJvYnVzdG5lc3MgYW5kIHByZXZlbnQgYSBudW1iZXIKKyAgICAgKiBvZiB1c2VyIGVycm9yICh3aGVyZSBhbiBvbGRlciB2ZXJzaW9uIG9mIHNlcnZsZXQuamFyIHdvdWxkIGJlIHByZXNlbnQKKyAgICAgKiBpbiAvV0VCLUlORi9saWIpLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIGNsYXNzIG5hbWUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWUgaXMgdmFsaWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoImphdmEuIikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBzcGVjaWZpZWQgSkFSIGZpbGUsIGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgZG9lcworICAgICAqIG5vdCBjb250YWluIGFueSBvZiB0aGUgdHJpZ2dlciBjbGFzc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGphcmZpbGUgVGhlIEpBUiBmaWxlIHRvIGJlIGNoZWNrZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlSmFyRmlsZShGaWxlIGphcmZpbGUpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHRyaWdnZXJzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICBKYXJGaWxlIGphckZpbGUgPSBuZXcgSmFyRmlsZShqYXJmaWxlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmlnZ2Vycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xhenogPSBwYXJlbnQubG9hZENsYXNzKHRyaWdnZXJzW2ldKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUodHJpZ2dlcnNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgY2xhenogPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNsYXp6ID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHRyaWdnZXJzW2ldLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgQ2hlY2tpbmcgZm9yICIgKyBuYW1lKTsKKyAgICAgICAgICAgIEphckVudHJ5IGphckVudHJ5ID0gamFyRmlsZS5nZXRKYXJFbnRyeShuYW1lKTsKKyAgICAgICAgICAgIGlmIChqYXJFbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nLmluZm8oInZhbGlkYXRlSmFyRmlsZSgiICsgamFyZmlsZSArIAorICAgICAgICAgICAgICAgICAgICAiKSAtIGphciBub3QgbG9hZGVkLiBTZWUgU2VydmxldCBTcGVjIDIuMywgIgorICAgICAgICAgICAgICAgICAgICArICJzZWN0aW9uIDkuNy4yLiBPZmZlbmRpbmcgY2xhc3M6ICIgKyBuYW1lKTsKKyAgICAgICAgICAgICAgICBqYXJGaWxlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgamFyRmlsZS5jbG9zZSgpOworICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgVVJMLgorICAgICAqLworICAgIHByb3RlY3RlZCBVUkwgZ2V0VVJMKEZpbGUgZmlsZSwgYm9vbGVhbiBlbmNvZGVkKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKworICAgICAgICBGaWxlIHJlYWxGaWxlID0gZmlsZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWxGaWxlID0gcmVhbEZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfQorICAgICAgICBpZihlbmNvZGVkKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VVJJKHJlYWxGaWxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiByZWFsRmlsZS50b1VSTCgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCBVUkwuCisgICAgICovCisgICAgcHJvdGVjdGVkIFVSTCBnZXRVUkkoRmlsZSBmaWxlKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gZmlsZS50b1VSSSgpLnRvVVJMKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSwgaW5jbHVkaW5nIGFsbCBvZiBpdHMgY29udGVudHMgYW5kCisgICAgICogc3ViZGlyZWN0b3JpZXMgcmVjdXJzaXZlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGlyZWN0b3J5IHRvIGJlIGRlbGV0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGVsZXRlRGlyKEZpbGUgZGlyKSB7CisKKyAgICAgICAgU3RyaW5nIGZpbGVzW10gPSBkaXIubGlzdCgpOworICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgZmlsZXMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pOworICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGRlbGV0ZURpcihmaWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkaXIuZGVsZXRlKCk7CisKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL1dlYmFwcExvYWRlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9XZWJhcHBMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQzZjg2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9XZWJhcHBMb2FkZXIuamF2YQpAQCAtMCwwICsxLDEyNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXI7CisKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZVN1cHBvcnQ7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5SZWdpc3RyYXRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLkJpbmRpbmc7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVDbGFzc1BhaXI7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0VudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLkRpckNvbnRleHRVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuUmVzb3VyY2U7CisKKworLyoqCisgKiBDbGFzc2xvYWRlciBpbXBsZW1lbnRhdGlvbiB3aGljaCBpcyBzcGVjaWFsaXplZCBmb3IgaGFuZGxpbmcgd2ViCisgKiBhcHBsaWNhdGlvbnMgaW4gdGhlIG1vc3QgZWZmaWNpZW50IHdheSwgd2hpbGUgYmVpbmcgQ2F0YWxpbmEgYXdhcmUgKGFsbAorICogYWNjZXNzZXMgdG8gcmVzb3VyY2VzIGFyZSBtYWRlIHRocm91Z2ggdGhlIERpckNvbnRleHQgaW50ZXJmYWNlKS4KKyAqIFRoaXMgY2xhc3MgbG9hZGVyIHN1cHBvcnRzIGRldGVjdGlvbiBvZiBtb2RpZmllZAorICogSmF2YSBjbGFzc2VzLCB3aGljaCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgYXV0by1yZWxvYWQgc3VwcG9ydC4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBsb2FkZXIgaXMgY29uZmlndXJlZCBieSBhZGRpbmcgdGhlIHBhdGhuYW1lcyBvZiBkaXJlY3RvcmllcywKKyAqIEpBUiBmaWxlcywgYW5kIFpJUCBmaWxlcyB3aXRoIHRoZSA8Y29kZT5hZGRSZXBvc2l0b3J5KCk8L2NvZGU+IG1ldGhvZCwKKyAqIHByaW9yIHRvIGNhbGxpbmcgPGNvZGU+c3RhcnQoKTwvY29kZT4uICBXaGVuIGEgbmV3IGNsYXNzIGlzIHJlcXVpcmVkLAorICogdGhlc2UgcmVwb3NpdG9yaWVzIHdpbGwgYmUgY29uc3VsdGVkIGZpcnN0IHRvIGxvY2F0ZSB0aGUgY2xhc3MuICBJZiBpdAorICogaXMgbm90IHByZXNlbnQsIHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgV2ViYXBwTG9hZGVyCisgICAgaW1wbGVtZW50cyBMaWZlY3ljbGUsIExvYWRlciwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgTUJlYW5SZWdpc3RyYXRpb24gIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgV2ViYXBwTG9hZGVyIHdpdGggbm8gZGVmaW5lZCBwYXJlbnQgY2xhc3MgbG9hZGVyCisgICAgICogKHNvIHRoYXQgdGhlIGFjdHVhbCBwYXJlbnQgd2lsbCBiZSB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlcikuCisgICAgICovCisgICAgcHVibGljIFdlYmFwcExvYWRlcigpIHsKKworICAgICAgICB0aGlzKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgV2ViYXBwTG9hZGVyIHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyBsb2FkZXIKKyAgICAgKiB0byBiZSBkZWZpbmVkIGFzIHRoZSBwYXJlbnQgb2YgdGhlIENsYXNzTG9hZGVyIHdlIHVsdGltYXRlbHkgY3JlYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNsYXNzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBXZWJhcHBMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50KSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMucGFyZW50Q2xhc3NMb2FkZXIgPSBwYXJlbnQ7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogRmlyc3QgbG9hZCBvZiB0aGUgY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyBsb2FkZXIgYmVpbmcgbWFuYWdlZCBieSB0aGlzIExvYWRlciBjb21wb25lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBXZWJhcHBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIExvYWRlciBoYXMgYmVlbiBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSAiZm9sbG93IHN0YW5kYXJkIGRlbGVnYXRpb24gbW9kZWwiIGZsYWcgdGhhdCB3aWxsIGJlIHVzZWQgdG8KKyAgICAgKiBjb25maWd1cmUgb3VyIENsYXNzTG9hZGVyLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkZWxlZ2F0ZSA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBMb2FkZXIgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIuV2ViYXBwTG9hZGVyLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaWZlY3ljbGUgZXZlbnQgc3VwcG9ydCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIExpZmVjeWNsZVN1cHBvcnQgbGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZVN1cHBvcnQodGhpcyk7CisKKworICAgIC8qKgorICAgICAqIElmIG5vdCBzcGVjaWZpZWQsIHNob3VsZCB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlciBiZSB1c2VkIGFzIHRoZSBwYXJlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHVzZVN5c3RlbUNsYXNzTG9hZGVyQXNQYXJlbnQgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBDbGFzc0xvYWRlciBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkLgorICAgICAqIFRoaXMgY2xhc3Mgc2hvdWxkIGV4dGVuZCBXZWJhcHBDbGFzc0xvYWRlciwgb3RoZXJ3aXNlLCBhIGRpZmZlcmVudCAKKyAgICAgKiBsb2FkZXIgaW1wbGVtZW50YXRpb24gbXVzdCBiZSB1c2VkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGxvYWRlckNsYXNzID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcENsYXNzTG9hZGVyIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHBhcmVudCBjbGFzcyBsb2FkZXIgb2YgdGhlIGNsYXNzIGxvYWRlciB3ZSB3aWxsIGNyZWF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIHBhcmVudENsYXNzTG9hZGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlbG9hZGFibGUgZmxhZyBmb3IgdGhpcyBMb2FkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlbG9hZGFibGUgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiByZXBvc2l0b3JpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MgbG9hZGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlcG9zaXRvcmllc1tdID0gbmV3IFN0cmluZ1swXTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZD8KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQgc3VwcG9ydCA9IG5ldyBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQodGhpcyk7CisKKworICAgIC8qKgorICAgICAqIENsYXNzcGF0aCBzZXQgaW4gdGhlIGxvYWRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc3BhdGggPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBSZXBvc2l0b3JpZXMgdGhhdCBhcmUgc2V0IGluIHRoZSBsb2FkZXIsIGZvciBKTVguCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3QgbG9hZGVyUmVwb3NpdG9yaWVzID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSmF2YSBjbGFzcyBsb2FkZXIgdG8gYmUgdXNlZCBieSB0aGlzIENvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7CisKKyAgICAgICAgcmV0dXJuICgoQ2xhc3NMb2FkZXIpIGNsYXNzTG9hZGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIExvZ2dlciBoYXMgYmVlbiBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgeworCisgICAgICAgIHJldHVybiAoY29udGFpbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIExvZ2dlciBoYXMgYmVlbiBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgYXNzb2NpYXRlZCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGNvbnRhaW5lcikgeworCisgICAgICAgIC8vIERlcmVnaXN0ZXIgZnJvbSB0aGUgb2xkIENvbnRhaW5lciAoaWYgYW55KQorICAgICAgICBpZiAoKHRoaXMuY29udGFpbmVyICE9IG51bGwpICYmICh0aGlzLmNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgKChDb250ZXh0KSB0aGlzLmNvbnRhaW5lcikucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICAvLyBQcm9jZXNzIHRoaXMgcHJvcGVydHkgY2hhbmdlCisgICAgICAgIENvbnRhaW5lciBvbGRDb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjsKKyAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJjb250YWluZXIiLCBvbGRDb250YWluZXIsIHRoaXMuY29udGFpbmVyKTsKKworICAgICAgICAvLyBSZWdpc3RlciB3aXRoIHRoZSBuZXcgQ29udGFpbmVyIChpZiBhbnkpCisgICAgICAgIGlmICgodGhpcy5jb250YWluZXIgIT0gbnVsbCkgJiYgKHRoaXMuY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGV4dCkpIHsKKyAgICAgICAgICAgIHNldFJlbG9hZGFibGUoICgoQ29udGV4dCkgdGhpcy5jb250YWluZXIpLmdldFJlbG9hZGFibGUoKSApOworICAgICAgICAgICAgKChDb250ZXh0KSB0aGlzLmNvbnRhaW5lcikuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlICJmb2xsb3cgc3RhbmRhcmQgZGVsZWdhdGlvbiBtb2RlbCIgZmxhZyB1c2VkIHRvIGNvbmZpZ3VyZQorICAgICAqIG91ciBDbGFzc0xvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWxlZ2F0ZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZGVsZWdhdGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlICJmb2xsb3cgc3RhbmRhcmQgZGVsZWdhdGlvbiBtb2RlbCIgZmxhZyB1c2VkIHRvIGNvbmZpZ3VyZQorICAgICAqIG91ciBDbGFzc0xvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWxlZ2F0ZSBUaGUgbmV3IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWxlZ2F0ZShib29sZWFuIGRlbGVnYXRlKSB7CisKKyAgICAgICAgYm9vbGVhbiBvbGREZWxlZ2F0ZSA9IHRoaXMuZGVsZWdhdGU7CisgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImRlbGVnYXRlIiwgbmV3IEJvb2xlYW4ob2xkRGVsZWdhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbih0aGlzLmRlbGVnYXRlKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIExvYWRlciBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDbGFzc0xvYWRlciBjbGFzcyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9hZGVyQ2xhc3MoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmxvYWRlckNsYXNzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDbGFzc0xvYWRlciBjbGFzcyBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGxvYWRlckNsYXNzIFRoZSBuZXcgQ2xhc3NMb2FkZXIgY2xhc3MgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvYWRlckNsYXNzKFN0cmluZyBsb2FkZXJDbGFzcykgeworCisgICAgICAgIHRoaXMubG9hZGVyQ2xhc3MgPSBsb2FkZXJDbGFzczsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VTeXN0ZW1DbGFzc0xvYWRlckFzUGFyZW50IGZsYWcgZm9yIHRoaXMgTG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFVzZVN5c3RlbUNsYXNzTG9hZGVyQXNQYXJlbnQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gKHRoaXMudXNlU3lzdGVtQ2xhc3NMb2FkZXJBc1BhcmVudCk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVzZVN5c3RlbUNsYXNzTG9hZGVyQXNQYXJlbnQgZmxhZyBmb3IgdGhpcyBMb2FkZXIuCisgICAgICogCisgICAgICogQHBhcmFtIHVzZVN5c3RlbUNsYXNzTG9hZGVyQXNQYXJlbnQgVGhlIHVzZVN5c3RlbUNsYXNzTG9hZGVyQXNQYXJlbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZVN5c3RlbUNsYXNzTG9hZGVyQXNQYXJlbnQoCisgICAgICAgICAgICBib29sZWFuIHVzZVN5c3RlbUNsYXNzTG9hZGVyQXNQYXJlbnQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMudXNlU3lzdGVtQ2xhc3NMb2FkZXJBc1BhcmVudCA9IHVzZVN5c3RlbUNsYXNzTG9hZGVyQXNQYXJlbnQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlbG9hZGFibGUgZmxhZyBmb3IgdGhpcyBMb2FkZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UmVsb2FkYWJsZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucmVsb2FkYWJsZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVsb2FkYWJsZSBmbGFnIGZvciB0aGlzIExvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWxvYWRhYmxlIFRoZSBuZXcgcmVsb2FkYWJsZSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVsb2FkYWJsZShib29sZWFuIHJlbG9hZGFibGUpIHsKKworICAgICAgICAvLyBQcm9jZXNzIHRoaXMgcHJvcGVydHkgY2hhbmdlCisgICAgICAgIGJvb2xlYW4gb2xkUmVsb2FkYWJsZSA9IHRoaXMucmVsb2FkYWJsZTsKKyAgICAgICAgdGhpcy5yZWxvYWRhYmxlID0gcmVsb2FkYWJsZTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInJlbG9hZGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbihvbGRSZWxvYWRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odGhpcy5yZWxvYWRhYmxlKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN1cHBvcnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyByZXBvc2l0b3J5IHRvIHRoZSBzZXQgb2YgcmVwb3NpdG9yaWVzIGZvciB0aGlzIGNsYXNzIGxvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXBvc2l0b3J5IFJlcG9zaXRvcnkgdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSZXBvc2l0b3J5KFN0cmluZyByZXBvc2l0b3J5KSB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygid2ViYXBwTG9hZGVyLmFkZFJlcG9zaXRvcnkiLCByZXBvc2l0b3J5KSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBvc2l0b3JpZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5LmVxdWFscyhyZXBvc2l0b3JpZXNbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID0gbmV3IFN0cmluZ1tyZXBvc2l0b3JpZXMubGVuZ3RoICsgMV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwb3NpdG9yaWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVzdWx0c1tpXSA9IHJlcG9zaXRvcmllc1tpXTsKKyAgICAgICAgcmVzdWx0c1tyZXBvc2l0b3JpZXMubGVuZ3RoXSA9IHJlcG9zaXRvcnk7CisgICAgICAgIHJlcG9zaXRvcmllcyA9IHJlc3VsdHM7CisKKyAgICAgICAgaWYgKHN0YXJ0ZWQgJiYgKGNsYXNzTG9hZGVyICE9IG51bGwpKSB7CisgICAgICAgICAgICBjbGFzc0xvYWRlci5hZGRSZXBvc2l0b3J5KHJlcG9zaXRvcnkpOworICAgICAgICAgICAgaWYoIGxvYWRlclJlcG9zaXRvcmllcyAhPSBudWxsICkgbG9hZGVyUmVwb3NpdG9yaWVzLmFkZChyZXBvc2l0b3J5KTsKKyAgICAgICAgICAgIHNldENsYXNzUGF0aCgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgYSBwZXJpb2RpYyB0YXNrLCBzdWNoIGFzIHJlbG9hZGluZywgZXRjLiBUaGlzIG1ldGhvZCB3aWxsIGJlCisgICAgICogaW52b2tlZCBpbnNpZGUgdGhlIGNsYXNzbG9hZGluZyBjb250ZXh0IG9mIHRoaXMgY29udGFpbmVyLiBVbmV4cGVjdGVkCisgICAgICogdGhyb3dhYmxlcyB3aWxsIGJlIGNhdWdodCBhbmQgbG9nZ2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJhY2tncm91bmRQcm9jZXNzKCkgeworICAgICAgICBpZiAocmVsb2FkYWJsZSAmJiBtb2RpZmllZCgpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyCisgICAgICAgICAgICAgICAgICAgIChXZWJhcHBMb2FkZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICAoKFN0YW5kYXJkQ29udGV4dCkgY29udGFpbmVyKS5yZWxvYWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9hZGVyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRhaW5lci5nZXRMb2FkZXIoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbG9zZUpBUnMoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiByZXBvc2l0b3JpZXMgZGVmaW5lZCBmb3IgdGhpcyBjbGFzcyBsb2FkZXIuCisgICAgICogSWYgbm9uZSBhcmUgZGVmaW5lZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKiBGb3Igc2VjdXJpdHkgcmVhc29uLCByZXR1cm5zIGEgY2xvbmUgb2YgdGhlIEFycmF5IChzaW5jZSAKKyAgICAgKiBTdHJpbmcgYXJlIGltbXV0YWJsZSkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRSZXBvc2l0b3JpZXMoKSB7CisKKyAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pcmVwb3NpdG9yaWVzLmNsb25lKCkpOworCisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJlcG9zaXRvcmllcygpIHsKKyAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pcmVwb3NpdG9yaWVzLmNsb25lKCkpOworICAgIH0KKworICAgIC8qKiBFeHRyYSByZXBvc2l0b3JpZXMgZm9yIHRoaXMgbG9hZGVyCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXBvc2l0b3JpZXNTdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYj1uZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciggaW50IGk9MDsgaTxyZXBvc2l0b3JpZXMubGVuZ3RoIDsgaSsrICkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCByZXBvc2l0b3JpZXNbaV0pLmFwcGVuZCgiOiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRMb2FkZXJSZXBvc2l0b3JpZXMoKSB7CisgICAgICAgIGlmKCBsb2FkZXJSZXBvc2l0b3JpZXM9PW51bGwgKSByZXR1cm4gIG51bGw7CisgICAgICAgIFN0cmluZyByZXNbXT1uZXcgU3RyaW5nWyBsb2FkZXJSZXBvc2l0b3JpZXMuc2l6ZSgpXTsKKyAgICAgICAgbG9hZGVyUmVwb3NpdG9yaWVzLnRvQXJyYXkocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExvYWRlclJlcG9zaXRvcmllc1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIHJlcG9zaXRvcmllc1tdPWdldExvYWRlclJlcG9zaXRvcmllcygpOworICAgICAgICBTdHJpbmdCdWZmZXIgc2I9bmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IoIGludCBpPTA7IGk8cmVwb3NpdG9yaWVzLmxlbmd0aCA7IGkrKyApIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCggcmVwb3NpdG9yaWVzW2ldKS5hcHBlbmQoIjoiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIC8qKiAKKyAgICAgKiBDbGFzc3BhdGgsIGFzIHNldCBpbiBvcmcuYXBhY2hlLmNhdGFsaW5hLmpzcF9jbGFzc3BhdGggY29udGV4dAorICAgICAqIHByb3BlcnR5CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGUgaW50ZXJuYWwgcmVwb3NpdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBMb2FkZXIgYmVlbiBtb2RpZmllZCwKKyAgICAgKiBzdWNoIHRoYXQgdGhlIGxvYWRlZCBjbGFzc2VzIHNob3VsZCBiZSByZWxvYWRlZD8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtb2RpZmllZCgpIHsKKworICAgICAgICByZXR1cm4gKGNsYXNzTG9hZGVyLm1vZGlmaWVkKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHBlcmlvZGljYWxseSBzaWduYWwgdG8gdGhlIGNsYXNzbG9hZGVyIHRvIHJlbGVhc2UgSkFSIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZUpBUnMoYm9vbGVhbiBmb3JjZSkgeworICAgICAgICBpZiAoY2xhc3NMb2FkZXIgIT1udWxsKXsKKyAgICAgICAgICAgIGNsYXNzTG9hZGVyLmNsb3NlSkFScyhmb3JjZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBzdXBwb3J0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJXZWJhcHBMb2FkZXJbIik7CisgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZChjb250YWluZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcyAKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQ9ZmFsc2U7CisKKworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIGluaXRpYWxpemVkPXRydWU7CisKKyAgICAgICAgaWYoIG9uYW1lPT1udWxsICkgeworICAgICAgICAgICAgLy8gbm90IHJlZ2lzdGVyZWQgeWV0IC0gc3RhbmRhbG9uZSBvciBBUEkKKyAgICAgICAgICAgIGlmKCBjb250YWluZXIgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciBvdXJzZWxmLiBUaGUgY29udGFpbmVyIG11c3QgYmUgYSB3ZWJhcHAKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZENvbnRleHQgY3R4PShTdGFuZGFyZENvbnRleHQpY29udGFpbmVyOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGN0eC5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgICAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgICAgICAgICAgb25hbWU9bmV3IE9iamVjdE5hbWUoY3R4LmdldEVuZ2luZU5hbWUoKSArICI6dHlwZT1Mb2FkZXIscGF0aD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArICIsaG9zdD0iICsgY3R4LmdldFBhcmVudCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLnJlZ2lzdGVyQ29tcG9uZW50KHRoaXMsIG9uYW1lLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcj1vbmFtZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHJlZ2lzdGVyaW5nIGxvYWRlciIsIGUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggY29udGFpbmVyID09IG51bGwgKSB7CisgICAgICAgICAgICAvLyBKTVggY3JlYXRlZCB0aGUgbG9hZGVyCisgICAgICAgICAgICAvLyBUT0RPCisKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIGlmKCBjb250cm9sbGVyPT1vbmFtZSApIHsKKyAgICAgICAgICAgIC8vIFNlbGYtcmVnaXN0cmF0aW9uLCB1bmRvIGl0CisgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS51bnJlZ2lzdGVyQ29tcG9uZW50KG9uYW1lKTsKKyAgICAgICAgICAgIG9uYW1lID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgdGhpcyBjb21wb25lbnQsIGluaXRpYWxpemluZyBvdXIgYXNzb2NpYXRlZCBjbGFzcyBsb2FkZXIuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiBhIGxpZmVjeWNsZSBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiggISBpbml0aWFsaXplZCApIGluaXQoKTsKKyAgICAgICAgaWYgKHN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygid2ViYXBwTG9hZGVyLmFscmVhZHlTdGFydGVkIikpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJ3ZWJhcHBMb2FkZXIuc3RhcnRpbmciKSk7CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKworICAgICAgICBpZiAoY29udGFpbmVyLmdldFJlc291cmNlcygpID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKCJObyByZXNvdXJjZXMgZm9yICIgKyBjb250YWluZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFJlZ2lzdGVyIGEgc3RyZWFtIGhhbmRsZXIgZmFjdG9yeSBmb3IgdGhlIEpOREkgcHJvdG9jb2wKKyAgICAgICAgVVJMU3RyZWFtSGFuZGxlckZhY3Rvcnkgc3RyZWFtSGFuZGxlckZhY3RvcnkgPQorICAgICAgICAgICAgbmV3IERpckNvbnRleHRVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSgpOworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFVSTC5zZXRVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeShzdHJlYW1IYW5kbGVyRmFjdG9yeSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIExvZyBhbmQgY29udGludWUgYW55d2F5LCB0aGlzIGlzIG5vdCBjcml0aWNhbAorICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXJyb3IgcmVnaXN0ZXJpbmcgam5kaSBzdHJlYW0gaGFuZGxlciIsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGxpa2VseSBhIGR1YWwgcmVnaXN0cmF0aW9uCisgICAgICAgICAgICAgICAgbG9nLmluZm8oIkR1YWwgcmVnaXN0cmF0aW9uIG9mIGpuZGkgc3RyZWFtIGhhbmRsZXI6ICIgCisgICAgICAgICAgICAgICAgICAgICAgICAgKyB0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDb25zdHJ1Y3QgYSBjbGFzcyBsb2FkZXIgYmFzZWQgb24gb3VyIGN1cnJlbnQgcmVwb3NpdG9yaWVzIGxpc3QKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBjcmVhdGVDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgY2xhc3NMb2FkZXIuc2V0UmVzb3VyY2VzKGNvbnRhaW5lci5nZXRSZXNvdXJjZXMoKSk7CisgICAgICAgICAgICBjbGFzc0xvYWRlci5zZXREZWxlZ2F0ZSh0aGlzLmRlbGVnYXRlKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQpCisgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIuc2V0QW50aUpBUkxvY2tpbmcoKChTdGFuZGFyZENvbnRleHQpIGNvbnRhaW5lcikuZ2V0QW50aUpBUkxvY2tpbmcoKSk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwb3NpdG9yaWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIuYWRkUmVwb3NpdG9yeShyZXBvc2l0b3JpZXNbaV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDb25maWd1cmUgb3VyIHJlcG9zaXRvcmllcworICAgICAgICAgICAgc2V0UmVwb3NpdG9yaWVzKCk7CisgICAgICAgICAgICBzZXRDbGFzc1BhdGgoKTsKKworICAgICAgICAgICAgc2V0UGVybWlzc2lvbnMoKTsKKworICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKQorICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjbGFzc0xvYWRlcikuc3RhcnQoKTsKKworICAgICAgICAgICAgLy8gQmluZGluZyB0aGUgV2ViYXBwIGNsYXNzIGxvYWRlciB0byB0aGUgZGlyZWN0b3J5IGNvbnRleHQKKyAgICAgICAgICAgIERpckNvbnRleHRVUkxTdHJlYW1IYW5kbGVyLmJpbmQKKyAgICAgICAgICAgICAgICAoKENsYXNzTG9hZGVyKSBjbGFzc0xvYWRlciwgdGhpcy5jb250YWluZXIuZ2V0UmVzb3VyY2VzKCkpOworCisgICAgICAgICAgICBTdGFuZGFyZENvbnRleHQgY3R4PShTdGFuZGFyZENvbnRleHQpY29udGFpbmVyOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjdHguZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYgKHBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgICAgICB9ICAgCisgICAgICAgICAgICBPYmplY3ROYW1lIGNsb25hbWUgPSBuZXcgT2JqZWN0TmFtZQorICAgICAgICAgICAgICAgIChjdHguZ2V0RW5naW5lTmFtZSgpICsgIjp0eXBlPVdlYmFwcENsYXNzTG9hZGVyLHBhdGg9IgorICAgICAgICAgICAgICAgICArIHBhdGggKyAiLGhvc3Q9IiArIGN0eC5nZXRQYXJlbnQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXJDb21wb25lbnQoY2xhc3NMb2FkZXIsIGNsb25hbWUsIG51bGwpOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoICJMaWZlY3ljbGVFeGNlcHRpb24gIiwgdCApOworICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbigic3RhcnQ6ICIsIHQpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3AgdGhpcyBjb21wb25lbnQsIGZpbmFsaXppbmcgb3VyIGFzc29jaWF0ZWQgY2xhc3MgbG9hZGVyLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgYSBsaWZlY3ljbGUgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmICghc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJ3ZWJhcHBMb2FkZXIubm90U3RhcnRlZCIpKTsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygid2ViYXBwTG9hZGVyLnN0b3BwaW5nIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUT1BfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gZmFsc2U7CisKKyAgICAgICAgLy8gUmVtb3ZlIGNvbnRleHQgYXR0cmlidXRlcyBhcyBhcHByb3ByaWF0ZQorICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGV4dCkgeworICAgICAgICAgICAgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPQorICAgICAgICAgICAgICAgICgoQ29udGV4dCkgY29udGFpbmVyKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgICAgICAgICAgc2VydmxldENvbnRleHQucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuQ0xBU1NfUEFUSF9BVFRSKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRocm93IGF3YXkgb3VyIGN1cnJlbnQgY2xhc3MgbG9hZGVyCisgICAgICAgIGlmIChjbGFzc0xvYWRlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkKKyAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjbGFzc0xvYWRlcikuc3RvcCgpOworICAgICAgICBEaXJDb250ZXh0VVJMU3RyZWFtSGFuZGxlci51bmJpbmQoKENsYXNzTG9hZGVyKSBjbGFzc0xvYWRlcik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0YW5kYXJkQ29udGV4dCBjdHg9KFN0YW5kYXJkQ29udGV4dCljb250YWluZXI7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGN0eC5nZXRQYXRoKCk7CisgICAgICAgICAgICBpZiAocGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgcGF0aCA9ICIvIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9iamVjdE5hbWUgY2xvbmFtZSA9IG5ldyBPYmplY3ROYW1lCisgICAgICAgICAgICAgICAgKGN0eC5nZXRFbmdpbmVOYW1lKCkgKyAiOnR5cGU9V2ViYXBwQ2xhc3NMb2FkZXIscGF0aD0iCisgICAgICAgICAgICAgICAgICsgcGF0aCArICIsaG9zdD0iICsgY3R4LmdldFBhcmVudCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS51bnJlZ2lzdGVyQ29tcG9uZW50KGNsb25hbWUpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCAiTGlmZWN5Y2xlRXhjZXB0aW9uICIsIHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzTG9hZGVyID0gbnVsbDsKKworICAgICAgICBkZXN0cm95KCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHByb3BlcnR5IGNoYW5nZSBldmVudHMgZnJvbSBvdXIgYXNzb2NpYXRlZCBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHNvdXJjZSBvZiB0aGlzIGV2ZW50CisgICAgICAgIGlmICghKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQ29udGV4dCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gUHJvY2VzcyBhIHJlbGV2YW50IHByb3BlcnR5IGNoYW5nZQorICAgICAgICBpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKCJyZWxvYWRhYmxlIikpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2V0UmVsb2FkYWJsZQorICAgICAgICAgICAgICAgICAgICAoICgoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuYm9vbGVhblZhbHVlKCkgKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygid2ViYXBwTG9hZGVyLnJlbG9hZGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0TmV3VmFsdWUoKS50b1N0cmluZygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFzc29jaWF0ZWQgY2xhc3NMb2FkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBXZWJhcHBDbGFzc0xvYWRlciBjcmVhdGVDbGFzc0xvYWRlcigpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShsb2FkZXJDbGFzcyk7CisgICAgICAgIFdlYmFwcENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKKworICAgICAgICBpZiAocGFyZW50Q2xhc3NMb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHVzZVN5c3RlbUNsYXNzTG9hZGVyQXNQYXJlbnQpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnRDbGFzc0xvYWRlciA9IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhcmVudENsYXNzTG9hZGVyID0gY29udGFpbmVyLmdldFBhcmVudENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3NbXSBhcmdUeXBlcyA9IHsgQ2xhc3NMb2FkZXIuY2xhc3MgfTsKKyAgICAgICAgT2JqZWN0W10gYXJncyA9IHsgcGFyZW50Q2xhc3NMb2FkZXIgfTsKKyAgICAgICAgQ29uc3RydWN0b3IgY29uc3RyID0gY2xhenouZ2V0Q29uc3RydWN0b3IoYXJnVHlwZXMpOworICAgICAgICBjbGFzc0xvYWRlciA9IChXZWJhcHBDbGFzc0xvYWRlcikgY29uc3RyLm5ld0luc3RhbmNlKGFyZ3MpOworCisgICAgICAgIHJldHVybiBjbGFzc0xvYWRlcjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIGFzc29jaWF0ZWQgY2xhc3MgbG9hZGVyIHBlcm1pc3Npb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRQZXJtaXNzaW9ucygpIHsKKworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmICghKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFRlbGwgdGhlIGNsYXNzIGxvYWRlciB0aGUgcm9vdCBvZiB0aGUgY29udGV4dAorICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9CisgICAgICAgICAgICAoKENvbnRleHQpIGNvbnRhaW5lcikuZ2V0U2VydmxldENvbnRleHQoKTsKKworICAgICAgICAvLyBBc3NpZ25pbmcgcGVybWlzc2lvbnMgZm9yIHRoZSB3b3JrIGRpcmVjdG9yeQorICAgICAgICBGaWxlIHdvcmtEaXIgPQorICAgICAgICAgICAgKEZpbGUpIHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShHbG9iYWxzLldPUktfRElSX0FUVFIpOworICAgICAgICBpZiAod29ya0RpciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyB3b3JrRGlyUGF0aCA9IHdvcmtEaXIuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyLmFkZFBlcm1pc3Npb24KKyAgICAgICAgICAgICAgICAgICAgKG5ldyBGaWxlUGVybWlzc2lvbih3b3JrRGlyUGF0aCwgInJlYWQsd3JpdGUiKSk7CisgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIuYWRkUGVybWlzc2lvbgorICAgICAgICAgICAgICAgICAgICAobmV3IEZpbGVQZXJtaXNzaW9uKHdvcmtEaXJQYXRoICsgRmlsZS5zZXBhcmF0b3IgKyAiLSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkLHdyaXRlLGRlbGV0ZSIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIFVSTCByb290VVJMID0gc2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2UoIi8iKTsKKyAgICAgICAgICAgIGNsYXNzTG9hZGVyLmFkZFBlcm1pc3Npb24ocm9vdFVSTCk7CisKKyAgICAgICAgICAgIFN0cmluZyBjb250ZXh0Um9vdCA9IHNlcnZsZXRDb250ZXh0LmdldFJlYWxQYXRoKCIvIik7CisgICAgICAgICAgICBpZiAoY29udGV4dFJvb3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRSb290ID0gKG5ldyBGaWxlKGNvbnRleHRSb290KSkuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRlci5hZGRQZXJtaXNzaW9uKGNvbnRleHRSb290KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVVJMIGNsYXNzZXNVUkwgPSBzZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZSgiL1dFQi1JTkYvY2xhc3Nlcy8iKTsKKyAgICAgICAgICAgIGNsYXNzTG9hZGVyLmFkZFBlcm1pc3Npb24oY2xhc3Nlc1VSTCk7CisgICAgICAgICAgICBVUkwgbGliVVJMID0gc2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2UoIi9XRUItSU5GL2xpYi8iKTsKKyAgICAgICAgICAgIGNsYXNzTG9hZGVyLmFkZFBlcm1pc3Npb24obGliVVJMKTsKKworICAgICAgICAgICAgaWYgKGNvbnRleHRSb290ICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgIGlmIChsaWJVUkwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIHJvb3REaXIgPSBuZXcgRmlsZShjb250ZXh0Um9vdCk7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgbGliRGlyID0gbmV3IEZpbGUocm9vdERpciwgIldFQi1JTkYvbGliLyIpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBsaWJEaXIuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIuYWRkUGVybWlzc2lvbihwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgaWYgKHdvcmtEaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGliVVJMICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgbGliRGlyID0gbmV3IEZpbGUod29ya0RpciwgIldFQi1JTkYvbGliLyIpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGxpYkRpci5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIuYWRkUGVybWlzc2lvbihwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3Nlc1VSTCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGNsYXNzZXNEaXIgPSBuZXcgRmlsZSh3b3JrRGlyLCAiV0VCLUlORi9jbGFzc2VzLyIpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGNsYXNzZXNEaXIuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyLmFkZFBlcm1pc3Npb24ocGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZSB0aGUgcmVwb3NpdG9yaWVzIGZvciBvdXIgY2xhc3MgbG9hZGVyLCBiYXNlZCBvbiB0aGUKKyAgICAgKiBhc3NvY2lhdGVkIENvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFJlcG9zaXRvcmllcygpIHsKKworICAgICAgICBpZiAoIShjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPQorICAgICAgICAgICAgKChDb250ZXh0KSBjb250YWluZXIpLmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgICAgIGlmIChzZXJ2bGV0Q29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGxvYWRlclJlcG9zaXRvcmllcz1uZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIC8vIExvYWRpbmcgdGhlIHdvcmsgZGlyZWN0b3J5CisgICAgICAgIEZpbGUgd29ya0RpciA9CisgICAgICAgICAgICAoRmlsZSkgc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKEdsb2JhbHMuV09SS19ESVJfQVRUUik7CisgICAgICAgIGlmICh3b3JrRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKCJObyB3b3JrIGRpciBmb3IgIiArIHNlcnZsZXRDb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJ3ZWJhcHBMb2FkZXIuZGVwbG95Iiwgd29ya0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSkpOworCisgICAgICAgIGNsYXNzTG9hZGVyLnNldFdvcmtEaXIod29ya0Rpcik7CisKKyAgICAgICAgRGlyQ29udGV4dCByZXNvdXJjZXMgPSBjb250YWluZXIuZ2V0UmVzb3VyY2VzKCk7CisKKyAgICAgICAgLy8gU2V0dGluZyB1cCB0aGUgY2xhc3MgcmVwb3NpdG9yeSAoL1dFQi1JTkYvY2xhc3NlcyksIGlmIGl0IGV4aXN0cworCisgICAgICAgIFN0cmluZyBjbGFzc2VzUGF0aCA9ICIvV0VCLUlORi9jbGFzc2VzIjsKKyAgICAgICAgRGlyQ29udGV4dCBjbGFzc2VzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHJlc291cmNlcy5sb29rdXAoY2xhc3Nlc1BhdGgpOworICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERpckNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBjbGFzc2VzID0gKERpckNvbnRleHQpIG9iamVjdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gU2lsZW50IGNhdGNoOiBpdCdzIHZhbGlkIHRoYXQgbm8gL1dFQi1JTkYvY2xhc3NlcyBjb2xsZWN0aW9uCisgICAgICAgICAgICAvLyBleGlzdHMKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbGFzc2VzICE9IG51bGwpIHsKKworICAgICAgICAgICAgRmlsZSBjbGFzc1JlcG9zaXRvcnkgPSBudWxsOworCisgICAgICAgICAgICBTdHJpbmcgYWJzb2x1dGVDbGFzc2VzUGF0aCA9CisgICAgICAgICAgICAgICAgc2VydmxldENvbnRleHQuZ2V0UmVhbFBhdGgoY2xhc3Nlc1BhdGgpOworCisgICAgICAgICAgICBpZiAoYWJzb2x1dGVDbGFzc2VzUGF0aCAhPSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICBjbGFzc1JlcG9zaXRvcnkgPSBuZXcgRmlsZShhYnNvbHV0ZUNsYXNzZXNQYXRoKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIGNsYXNzUmVwb3NpdG9yeSA9IG5ldyBGaWxlKHdvcmtEaXIsIGNsYXNzZXNQYXRoKTsKKyAgICAgICAgICAgICAgICBjbGFzc1JlcG9zaXRvcnkubWtkaXJzKCk7CisgICAgICAgICAgICAgICAgY29weURpcihjbGFzc2VzLCBjbGFzc1JlcG9zaXRvcnkpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIndlYmFwcExvYWRlci5jbGFzc0RlcGxveSIsIGNsYXNzZXNQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1JlcG9zaXRvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKworCisgICAgICAgICAgICAvLyBBZGRpbmcgdGhlIHJlcG9zaXRvcnkgdG8gdGhlIGNsYXNzIGxvYWRlcgorICAgICAgICAgICAgY2xhc3NMb2FkZXIuYWRkUmVwb3NpdG9yeShjbGFzc2VzUGF0aCArICIvIiwgY2xhc3NSZXBvc2l0b3J5KTsKKyAgICAgICAgICAgIGxvYWRlclJlcG9zaXRvcmllcy5hZGQoY2xhc3Nlc1BhdGggKyAiLyIgKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0dGluZyB1cCB0aGUgSkFSIHJlcG9zaXRvcnkgKC9XRUItSU5GL2xpYiksIGlmIGl0IGV4aXN0cworCisgICAgICAgIFN0cmluZyBsaWJQYXRoID0gIi9XRUItSU5GL2xpYiI7CisKKyAgICAgICAgY2xhc3NMb2FkZXIuc2V0SmFyUGF0aChsaWJQYXRoKTsKKworICAgICAgICBEaXJDb250ZXh0IGxpYkRpciA9IG51bGw7CisgICAgICAgIC8vIExvb2tpbmcgdXAgZGlyZWN0b3J5IC9XRUItSU5GL2xpYiBpbiB0aGUgY29udGV4dAorICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHJlc291cmNlcy5sb29rdXAobGliUGF0aCk7CisgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGlyQ29udGV4dCkKKyAgICAgICAgICAgICAgICBsaWJEaXIgPSAoRGlyQ29udGV4dCkgb2JqZWN0OworICAgICAgICB9IGNhdGNoKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBTaWxlbnQgY2F0Y2g6IGl0J3MgdmFsaWQgdGhhdCBubyAvV0VCLUlORi9saWIgY29sbGVjdGlvbgorICAgICAgICAgICAgLy8gZXhpc3RzCisgICAgICAgIH0KKworICAgICAgICBpZiAobGliRGlyICE9IG51bGwpIHsKKworICAgICAgICAgICAgYm9vbGVhbiBjb3B5SmFycyA9IGZhbHNlOworICAgICAgICAgICAgU3RyaW5nIGFic29sdXRlTGliUGF0aCA9IHNlcnZsZXRDb250ZXh0LmdldFJlYWxQYXRoKGxpYlBhdGgpOworCisgICAgICAgICAgICBGaWxlIGRlc3REaXIgPSBudWxsOworCisgICAgICAgICAgICBpZiAoYWJzb2x1dGVMaWJQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0RGlyID0gbmV3IEZpbGUoYWJzb2x1dGVMaWJQYXRoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29weUphcnMgPSB0cnVlOworICAgICAgICAgICAgICAgIGRlc3REaXIgPSBuZXcgRmlsZSh3b3JrRGlyLCBsaWJQYXRoKTsKKyAgICAgICAgICAgICAgICBkZXN0RGlyLm1rZGlycygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBMb29raW5nIHVwIGRpcmVjdG9yeSAvV0VCLUlORi9saWIgaW4gdGhlIGNvbnRleHQKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTmFtaW5nRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSByZXNvdXJjZXMubGlzdEJpbmRpbmdzKGxpYlBhdGgpOworICAgICAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworCisgICAgICAgICAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBsaWJQYXRoICsgIi8iICsgYmluZGluZy5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZW5hbWUuZW5kc1dpdGgoIi5qYXIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgSkFSIGluIHRoZSB3b3JrIGRpcmVjdG9yeSwgYWx3YXlzICh0aGUgSkFSIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgZ2V0IGxvY2tlZCBvdGhlcndpc2UsIHdoaWNoIHdvdWxkIG1ha2UgaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3NzaWJsZSB0byB1cGRhdGUgaXQgb3IgcmVtb3ZlIGl0IGF0IHJ1bnRpbWUpCisgICAgICAgICAgICAgICAgICAgIEZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCBiaW5kaW5nLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJ3ZWJhcHBMb2FkZXIuamFyRGVwbG95IiwgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKworICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZSBqYXJSZXNvdXJjZSA9IChSZXNvdXJjZSkgYmluZGluZy5nZXRPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvcHlKYXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvcHkoamFyUmVzb3VyY2Uuc3RyZWFtQ29udGVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgSmFyRmlsZSBqYXJGaWxlID0gbmV3IEphckZpbGUoZGVzdEZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIuYWRkSmFyKGZpbGVuYW1lLCBqYXJGaWxlLCBkZXN0RmlsZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2F0Y2ggdGhlIGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlbXB0eSBqYXIgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGlnbm9yZSBhbmQgY29udGludXRlIGxvYWRpbmcgb3RoZXIgamFyIGZpbGVzIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGRpcgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBsb2FkZXJSZXBvc2l0b3JpZXMuYWRkKCBmaWxlbmFtZSApOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBTaWxlbnQgY2F0Y2g6IGl0J3MgdmFsaWQgdGhhdCBubyAvV0VCLUlORi9saWIgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgLy8gZXhpc3RzCisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXBwcm9wcmlhdGUgY29udGV4dCBhdHRyaWJ1dGUgZm9yIG91ciBjbGFzcyBwYXRoLiAgVGhpcworICAgICAqIGlzIHJlcXVpcmVkIG9ubHkgYmVjYXVzZSBKYXNwZXIgZGVwZW5kcyBvbiBpdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0Q2xhc3NQYXRoKCkgeworCisgICAgICAgIC8vIFZhbGlkYXRlIG91ciBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uCisgICAgICAgIGlmICghKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9CisgICAgICAgICAgICAoKENvbnRleHQpIGNvbnRhaW5lcikuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICAgICAgaWYgKHNlcnZsZXRDb250ZXh0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCkgeworICAgICAgICAgICAgU3RyaW5nIGJhc2VDbGFzc3BhdGggPSAKKyAgICAgICAgICAgICAgICAoKFN0YW5kYXJkQ29udGV4dCkgY29udGFpbmVyKS5nZXRDb21waWxlckNsYXNzcGF0aCgpOworICAgICAgICAgICAgaWYgKGJhc2VDbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlcnZsZXRDb250ZXh0LnNldEF0dHJpYnV0ZShHbG9iYWxzLkNMQVNTX1BBVEhfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUNsYXNzcGF0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGNsYXNzcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICAvLyBBc3NlbWJsZSB0aGUgY2xhc3MgcGF0aCBpbmZvcm1hdGlvbiBmcm9tIG91ciBjbGFzcyBsb2FkZXIgY2hhaW4KKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgaW50IGxheWVycyA9IDA7CisgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgd2hpbGUgKGxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIShsb2FkZXIgaW5zdGFuY2VvZiBVUkxDbGFzc0xvYWRlcikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY3A9Z2V0Q2xhc3NwYXRoKCBsb2FkZXIgKTsKKyAgICAgICAgICAgICAgICBpZiggY3A9PW51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCAiVW5rbm93biBsb2FkZXIgIiArIGxvYWRlciArICIgIiArIGxvYWRlci5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4gPiAwKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aC5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChjcCk7CisgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLy9jb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFVSTCByZXBvc2l0b3JpZXNbXSA9CisgICAgICAgICAgICAgICAgKChVUkxDbGFzc0xvYWRlcikgbG9hZGVyKS5nZXRVUkxzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcG9zaXRvcmllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyByZXBvc2l0b3J5ID0gcmVwb3NpdG9yaWVzW2ldLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkuc3RhcnRzV2l0aCgiZmlsZTovLyIpKQorICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gcmVwb3NpdG9yeS5zdWJzdHJpbmcoNyk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVwb3NpdG9yeS5zdGFydHNXaXRoKCJmaWxlOiIpKQorICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gcmVwb3NpdG9yeS5zdWJzdHJpbmcoNSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVwb3NpdG9yeS5zdGFydHNXaXRoKCJqbmRpOiIpKQorICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXRDb250ZXh0LmdldFJlYWxQYXRoKHJlcG9zaXRvcnkuc3Vic3RyaW5nKDUpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIGNsYXNzcGF0aC5hcHBlbmQocmVwb3NpdG9yeSk7CisgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9hZGVyID0gbG9hZGVyLmdldFBhcmVudCgpOworICAgICAgICAgICAgbGF5ZXJzKys7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmNsYXNzcGF0aD1jbGFzc3BhdGgudG9TdHJpbmcoKTsKKworICAgICAgICAvLyBTdG9yZSB0aGUgYXNzZW1ibGVkIGNsYXNzIHBhdGggYXMgYSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlCisgICAgICAgIHNlcnZsZXRDb250ZXh0LnNldEF0dHJpYnV0ZShHbG9iYWxzLkNMQVNTX1BBVEhfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aC50b1N0cmluZygpKTsKKworICAgIH0KKworICAgIC8vIHRyeSB0byBleHRyYWN0IHRoZSBjbGFzc3BhdGggZnJvbSBhIGxvYWRlciB0aGF0IGlzIG5vdCBVUkxDbGFzc0xvYWRlcgorICAgIHByaXZhdGUgU3RyaW5nIGdldENsYXNzcGF0aCggQ2xhc3NMb2FkZXIgbG9hZGVyICkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIG09bG9hZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXRDbGFzc3BhdGgiLCBuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICBpZiggbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJnZXRDbGFzc3BhdGggIiArIG0gKTsKKyAgICAgICAgICAgIGlmKCBtPT1udWxsICkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBPYmplY3Qgbz1tLmludm9rZSggbG9hZGVyLCBuZXcgT2JqZWN0W10ge30gKTsKKyAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJnb3RDbGFzc3BhdGggIiArIG8pOworICAgICAgICAgICAgaWYoIG8gaW5zdGFuY2VvZiBTdHJpbmcgKQorICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKW87CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0Q2xhc3NwYXRoICIsIGV4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3B5IGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY29weURpcihEaXJDb250ZXh0IHNyY0RpciwgRmlsZSBkZXN0RGlyKSB7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgTmFtaW5nRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBzcmNEaXIubGlzdCgiIik7CisgICAgICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBOYW1lQ2xhc3NQYWlyIG5jUGFpciA9CisgICAgICAgICAgICAgICAgICAgIChOYW1lQ2xhc3NQYWlyKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbmNQYWlyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gc3JjRGlyLmxvb2t1cChuYW1lKTsKKyAgICAgICAgICAgICAgICBGaWxlIGN1cnJlbnRGaWxlID0gbmV3IEZpbGUoZGVzdERpciwgbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gKChSZXNvdXJjZSkgb2JqZWN0KS5zdHJlYW1Db250ZW50KCk7CisgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGN1cnJlbnRGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjb3B5KGlzLCBvcykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnB1dFN0cmVhbSkgeworICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShjdXJyZW50RmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghY29weSgoSW5wdXRTdHJlYW0pIG9iamVjdCwgb3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGlyQ29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmlsZS5ta2RpcigpOworICAgICAgICAgICAgICAgICAgICBjb3B5RGlyKChEaXJDb250ZXh0KSBvYmplY3QsIGN1cnJlbnRGaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvcHkgYSBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgdGVtcCBkaXJlY3RvcnkuIFRoaXMgaXMgcmVxdWlyZWQgb25seQorICAgICAqIGJlY2F1c2UgSmFzcGVyIGRlcGVuZHMgb24gaXQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvcHkoSW5wdXRTdHJlYW0gaXMsIE91dHB1dFN0cmVhbSBvcykgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGludCBsZW4gPSBpcy5yZWFkKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG9zLndyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFdlYmFwcExvYWRlci5jbGFzcyApOworCisgICAgcHJpdmF0ZSBPYmplY3ROYW1lIG9uYW1lOworICAgIHByaXZhdGUgT2JqZWN0TmFtZSBjb250cm9sbGVyOworCisgICAgcHVibGljIE9iamVjdE5hbWUgcHJlUmVnaXN0ZXIoTUJlYW5TZXJ2ZXIgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG9uYW1lPW5hbWU7CisKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9zdFJlZ2lzdGVyKEJvb2xlYW4gcmVnaXN0cmF0aW9uRG9uZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByZURlcmVnaXN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3N0RGVyZWdpc3RlcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBnZXRDb250cm9sbGVyKCkgeworICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250cm9sbGVyKE9iamVjdE5hbWUgY29udHJvbGxlcikgeworICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYmM2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSw1OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8bWJlYW5zLWRlc2NyaXB0b3JzPgorCisgIDxtYmVhbiAgICAgICAgIG5hbWU9IldlYmFwcExvYWRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2xhc3Nsb2FkZXIgaW1wbGVtZW50YXRpb24gd2hpY2ggaXMgc3BlY2lhbGl6ZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsaW5nIHdlYiBhcHBsaWNhdGlvbnMiCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJMb2FkZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcExvYWRlciI+CisgICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkZWxlZ2F0ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlICdmb2xsb3cgc3RhbmRhcmQgZGVsZWdhdGlvbiBtb2RlbCcgZmxhZyB0aGF0IHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBjb25maWd1cmUgb3VyIENsYXNzTG9hZGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVsb2FkYWJsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHJlbG9hZGFibGUgZmxhZyBmb3IgdGhpcyBMb2FkZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyZXBvc2l0b3JpZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249IkV4dHJhIHJlcG9zaXRvcmllcyBtYW5hZ2VkIGJ5IHRoaXMgbG9hZGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVwb3NpdG9yaWVzU3RyaW5nIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJFeHRyYSByZXBvc2l0b3JpZXMgbWFuYWdlZCBieSB0aGlzIGxvYWRlciIKKyAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImxvYWRlclJlcG9zaXRvcmllcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVwb3NpdG9yaWVzIHNldCBpbiB0aGUgcmVhbCBsb2FkZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9IltMamF2YS5sYW5nLlN0cmluZzsiCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImxvYWRlclJlcG9zaXRvcmllc1N0cmluZyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVwb3NpdG9yaWVzIHNldCBpbiB0aGUgcmVhbCBsb2FkZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJ0b1N0cmluZyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSW5mbyBhYm91dCB0aGUgbG9hZGVyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJJTkZPIgorICAgICAgICAgICByZXR1cm5UeXBlPSJTdHJpbmciPgorICAgIDwvb3BlcmF0aW9uPgorICA8L21iZWFuPgorCisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iV2ViYXBwQ2xhc3NMb2FkZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNsYXNzbG9hZGVyIGltcGxlbWVudGF0aW9uIHdoaWNoIGlzIHNwZWNpYWxpemVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGluZyB3ZWIgYXBwbGljYXRpb25zIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iTG9hZGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmxvYWRlci5XZWJhcHBDbGFzc0xvYWRlciIgLz4KKworPC9tYmVhbnMtZGVzY3JpcHRvcnM+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZGFmMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApAQCAtMCwwICsxLDE1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8bWJlYW5zLWRlc2NyaXB0b3JzPgorCisgIDxtYmVhbiBuYW1lPSJHcm91cCIKKyAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuR3JvdXBNQmVhbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iR3JvdXAgZnJvbSBhIHVzZXIgZGF0YWJhc2UiCisgICAgICAgICAgICAgICBkb21haW49IlVzZXJzIgorICAgICAgICAgICAgICAgIGdyb3VwPSJHcm91cCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5Hcm91cCI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGVzY3JpcHRpb24iCisgICAgICAgICAgZGVzY3JpcHRpb249IkRlc2NyaXB0aW9uIG9mIHRoaXMgZ3JvdXAiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJncm91cG5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ikdyb3VwIG5hbWUgb2YgdGhpcyBncm91cCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJvbGVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lcyBvZiByb2xlcyBmb3IgdGhpcyBncm91cCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZhLmxhbmcuU3RyaW5nOyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ1c2VycyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZXMgb2YgdXNlciBtZW1iZXJzIG9mIHRoaXMgZ3JvdXAiCisgICAgICAgICAgICAgICAgIHR5cGU9IltMamF2YS5sYW5nLlN0cmluZzsiCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iYWRkUm9sZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQWRkIGEgbmV3IGF1dGhvcml6ZWQgcm9sZSBmb3IgdGhpcyBncm91cCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icm9sZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUm9sZSB0byBiZSBhZGRlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZVJvbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBhbiBvbGQgYXV0aG9yaXplZCByb2xlIGZvciB0aGlzIGdyb3VwIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJyb2xlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSb2xlIHRvIGJlIHJlbW92ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVSb2xlcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIGFsbCBhdXRob3JpemVkIHJvbGVzIGZvciB0aGlzIGdyb3VwIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iUm9sZSIKKyAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuUm9sZU1CZWFuIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJTZWN1cml0eSByb2xlIGZyb20gYSB1c2VyIGRhdGFiYXNlIgorICAgICAgICAgICAgICAgZG9tYWluPSJVc2VycyIKKyAgICAgICAgICAgICAgICBncm91cD0iUm9sZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5Sb2xlIj4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkZXNjcmlwdGlvbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRGVzY3JpcHRpb24gb2YgdGhpcyByb2xlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icm9sZW5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJvbGUgbmFtZSBvZiB0aGlzIHJvbGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICA8L21iZWFuPgorCisgIDxtYmVhbiAgICAgICAgIG5hbWU9IlVzZXIiCisgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLlVzZXJNQmVhbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVXNlciBmcm9tIGEgdXNlciBkYXRhYmFzZSIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iVXNlcnMiCisgICAgICAgICAgICAgICAgZ3JvdXA9IlVzZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlciI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZnVsbE5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGwgbmFtZSBvZiB0aGlzIHVzZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJncm91cHMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWVzIG9mIGdyb3VwcyB0aGlzIHVzZXIgaXMgYSBtZW1iZXIgb2YiCisgICAgICAgICAgICAgICAgIHR5cGU9IltMamF2YS5sYW5nLlN0cmluZzsiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwYXNzd29yZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUGFzc3dvcmQgb2YgdGhpcyB1c2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icm9sZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWVzIG9mIHJvbGVzIGZvciB0aGlzIHVzZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9IltMamF2YS5sYW5nLlN0cmluZzsiCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idXNlcm5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlVzZXIgbmFtZSBvZiB0aGlzIHVzZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJhZGRHcm91cCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQWRkIGEgbmV3IGdyb3VwIG1lbWJlcnNoaXAgZm9yIHRoaXMgdXNlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZ3JvdXBuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJHcm91cCBuYW1lIG9mIHRoZSBuZXcgZ3JvdXAiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJhZGRSb2xlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJBZGQgYSBuZXcgYXV0aG9yaXplZCByb2xlIGZvciB0aGlzIHVzZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InJvbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJvbGUgdG8gYmUgYWRkZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVHcm91cCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIGFuIG9sZCBncm91cCBtZW1iZXJzaGlwIGZvciB0aGlzIHVzZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Imdyb3VwbmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iR3JvdXAgbmFtZSBvZiB0aGUgb2xkIGdyb3VwIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0icmVtb3ZlR3JvdXBzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgYWxsIGdyb3VwIG1lbWJlcnNoaXBzIGZvciB0aGlzIHVzZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0icmVtb3ZlUm9sZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIGFuIG9sZCBhdXRob3JpemVkIHJvbGUgZm9yIHRoaXMgdXNlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icm9sZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUm9sZSB0byBiZSByZW1vdmVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0icmVtb3ZlUm9sZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBhbGwgYXV0aG9yaXplZCByb2xlcyBmb3IgdGhpcyB1c2VyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCisgIDwvbWJlYW4+CisKKzwvbWJlYW5zLWRlc2NyaXB0b3JzPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9DbGFzc05hbWVNQmVhbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9DbGFzc05hbWVNQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYzYyMjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL0NsYXNzTmFtZU1CZWFuLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnM7CisKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5CYXNlTW9kZWxNQmVhbjsKKworCisvKioKKyAqIDxwPkEgY29udmVuaWVuY2UgYmFzZSBjbGFzcyBmb3IgPHN0cm9uZz5Nb2RlbE1CZWFuPC9zdHJvbmc+IGltcGxlbWVudGF0aW9ucworICogd2hlcmUgdGhlIHVuZGVybHlpbmcgYmFzZSBjbGFzcyAoYW5kIHRoZXJlZm9yZSB0aGUgc2V0IG9mIHN1cHBvcnRlZAorICogcHJvcGVydGllcykgaXMgZGlmZmVyZW50IGZvciB2YXJ5aW5nIGltcGxlbWVudGF0aW9ucyBvZiBhIHN0YW5kYXJkCisgKiBpbnRlcmZhY2UuICBGb3IgQ2F0YWxpbmEsIHRoYXQgaW5jbHVkZXMgYXQgbGVhc3QgdGhlIGZvbGxvd2luZzoKKyAqIENvbm5lY3RvciwgTG9nZ2VyLCBSZWFsbSwgYW5kIFZhbHZlLiAgVGhpcyBjbGFzcyBjcmVhdGVzIGFuIGFydGlmaWNpYWwKKyAqIE1CZWFuIGF0dHJpYnV0ZSBuYW1lZCA8Y29kZT5jbGFzc05hbWU8L2NvZGU+LCB3aGljaCByZXBvcnRzIHRoZSBmdWxseQorICogcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IGFzIGl0cyB2YWx1ZS48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDbGFzc05hbWVNQmVhbiBleHRlbmRzIEJhc2VNb2RlbE1CZWFuIHsKKworCisgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgICAvKioKKyAgICAgICogQ29uc3RydWN0IGEgPGNvZGU+TW9kZWxNQmVhbjwvY29kZT4gd2l0aCBkZWZhdWx0CisgICAgICAqIDxjb2RlPk1vZGVsTUJlYW5JbmZvPC9jb2RlPiBpbmZvcm1hdGlvbi4KKyAgICAgICoKKyAgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZSBvZiBhbiBvYmplY3QKKyAgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgICogQGV4Y2VwdGlvbiBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiBpZiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICogIG9jY3VycworICAgICAgKi8KKyAgICAgcHVibGljIENsYXNzTmFtZU1CZWFuKCkKKyAgICAgICAgIHRocm93cyBNQmVhbkV4Y2VwdGlvbiwgUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24geworCisgICAgICAgICBzdXBlcigpOworCisgICAgIH0KKworCisgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgICAvKioKKyAgICAgICogUmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdAorICAgICAgKiBmb3IgdGhpcyBNQmVhbi4KKyAgICAgICovCisgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworCisgICAgICAgICByZXR1cm4gKHRoaXMucmVzb3VyY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCisgICAgIH0KKworCisgfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9Db25uZWN0b3JNQmVhbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9Db25uZWN0b3JNQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NmY1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL0Nvbm5lY3Rvck1CZWFuLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkluc3RhbmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlJlZmxlY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4uSW52YWxpZFRhcmdldE9iamVjdFR5cGVFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5JbnRyb3NwZWN0aW9uVXRpbHM7CisKKworLyoqCisgKiA8cD5BIDxzdHJvbmc+TW9kZWxNQmVhbjwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgKiA8Y29kZT5vcmcuYXBhY2hlLmNveW90ZS50b21jYXQ1LkNveW90ZUNvbm5lY3RvcjwvY29kZT4gY29tcG9uZW50LjwvcD4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbm5lY3Rvck1CZWFuIGV4dGVuZHMgQ2xhc3NOYW1lTUJlYW4geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgPGNvZGU+TW9kZWxNQmVhbjwvY29kZT4gd2l0aCBkZWZhdWx0CisgICAgICogPGNvZGU+TW9kZWxNQmVhbkluZm88L2NvZGU+IGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gb2JqZWN0CisgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIGlmIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29ubmVjdG9yTUJlYW4oKQorICAgICAgICB0aHJvd3MgTUJlYW5FeGNlcHRpb24sIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlcigpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMKKworCisgICAgLyoqCisgICAgICogT2J0YWluIGFuZCByZXR1cm4gdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgYXR0cmlidXRlIG9mIHRoaXMgTUJlYW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoaXMgYXR0cmlidXRlIGlzIG5vdAorICAgICAqICBzdXBwb3J0ZWQgYnkgdGhpcyBNQmVhbgorICAgICAqIEBleGNlcHRpb24gTUJlYW5FeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemVyIG9mIGFuIG9iamVjdAorICAgICAqICB0aHJvd3MgYW4gZXhjZXB0aW9uCisgICAgICogQGV4Y2VwdGlvbiBSZWZsZWN0aW9uRXhjZXB0aW9uIGlmIGEgSmF2YSByZWZsZWN0aW9uIGV4Y2VwdGlvbgorICAgICAqICBvY2N1cnMgd2hlbiBpbnZva2luZyB0aGUgZ2V0dGVyCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE1CZWFuRXhjZXB0aW9uLCBSZWZsZWN0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgaW5wdXQgcGFyYW1ldGVycworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgbmFtZSBpcyBudWxsIiksICJBdHRyaWJ1dGUgbmFtZSBpcyBudWxsIik7CisKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb25uZWN0b3IgY29ubmVjdG9yID0gKENvbm5lY3RvcikgZ2V0TWFuYWdlZFJlc291cmNlKCk7CisgICAgICAgICAgICByZXN1bHQgPSBJbnRyb3NwZWN0aW9uVXRpbHMuZ2V0UHJvcGVydHkoY29ubmVjdG9yLCBuYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRUYXJnZXRPYmplY3RUeXBlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgYXR0cmlidXRlIG9mIHRoaXMgTUJlYW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSBpZGVudGlmaWNhdGlvbiBvZiB0aGUgYXR0cmlidXRlIHRvIGJlIHNldAorICAgICAqICBhbmQgdGhlIG5ldyB2YWx1ZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QKKyAgICAgKiAgc3VwcG9ydGVkIGJ5IHRoaXMgTUJlYW4KKyAgICAgKiBAZXhjZXB0aW9uIE1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiBhbiBvYmplY3QKKyAgICAgKiAgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gUmVmbGVjdGlvbkV4Y2VwdGlvbiBpZiBhIEphdmEgcmVmbGVjdGlvbiBleGNlcHRpb24KKyAgICAgKiAgb2NjdXJzIHdoZW4gaW52b2tpbmcgdGhlIGdldHRlcgorICAgICAqLworICAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHJpYnV0ZSkKKyAgICAgICAgICAgIHRocm93cyBBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiwgTUJlYW5FeGNlcHRpb24sCisgICAgICAgICAgICBSZWZsZWN0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgaW5wdXQgcGFyYW1ldGVycworICAgICAgICBpZiAoYXR0cmlidXRlID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24obmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBpcyBudWxsIiksICJBdHRyaWJ1dGUgaXMgbnVsbCIpOworICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZS5nZXROYW1lKCk7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IGF0dHJpYnV0ZS5nZXRWYWx1ZSgpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgbmFtZSBpcyBudWxsIiksICJBdHRyaWJ1dGUgbmFtZSBpcyBudWxsIik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbm5lY3RvciBjb25uZWN0b3IgPSAoQ29ubmVjdG9yKSBnZXRNYW5hZ2VkUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgSW50cm9zcGVjdGlvblV0aWxzLnNldFByb3BlcnR5KGNvbm5lY3RvciwgbmFtZSwgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEludHJvc3BlY3Rpb25VdGlscy5zZXRQcm9wZXJ0eShjb25uZWN0b3IsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZih2YWx1ZSkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRUYXJnZXRPYmplY3RUeXBlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9Db250ZXh0RW52aXJvbm1lbnRNQmVhbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9Db250ZXh0RW52aXJvbm1lbnRNQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOGI4NDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL0NvbnRleHRFbnZpcm9ubWVudE1CZWFuLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zOworCisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUmVmbGVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQubW9kZWxtYmVhbi5JbnZhbGlkVGFyZ2V0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuQmFzZU1vZGVsTUJlYW47CisKKworLyoqCisgKiA8cD5BIDxzdHJvbmc+TW9kZWxNQmVhbjwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RW52aXJvbm1lbnQ8L2NvZGU+IGNvbXBvbmVudC48L3A+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb250ZXh0RW52aXJvbm1lbnRNQmVhbiBleHRlbmRzIEJhc2VNb2RlbE1CZWFuIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIDxjb2RlPk1vZGVsTUJlYW48L2NvZGU+IHdpdGggZGVmYXVsdAorICAgICAqIDxjb2RlPk1vZGVsTUJlYW5JbmZvPC9jb2RlPiBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTUJlYW5FeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemVyIG9mIGFuIG9iamVjdAorICAgICAqICB0aHJvd3MgYW4gZXhjZXB0aW9uCisgICAgICogQGV4Y2VwdGlvbiBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiBpZiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgb2NjdXJzCisgICAgICovCisgICAgcHVibGljIENvbnRleHRFbnZpcm9ubWVudE1CZWFuKCkKKyAgICAgICAgdGhyb3dzIE1CZWFuRXhjZXB0aW9uLCBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXR0cmlidXRlcworCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIGF0dHJpYnV0ZSBvZiB0aGlzIE1CZWFuLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZSBUaGUgaWRlbnRpZmljYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB0byBiZSBzZXQKKyAgICAgKiAgYW5kIHRoZSBuZXcgdmFsdWUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90CisgICAgICogIHN1cHBvcnRlZCBieSB0aGlzIE1CZWFuCisgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gb2JqZWN0CisgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFJlZmxlY3Rpb25FeGNlcHRpb24gaWYgYSBKYXZhIHJlZmxlY3Rpb24gZXhjZXB0aW9uCisgICAgICogIG9jY3VycyB3aGVuIGludm9raW5nIHRoZSBnZXR0ZXIKKyAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpCisgICAgICAgIHRocm93cyBBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiwgTUJlYW5FeGNlcHRpb24sCisgICAgICAgIFJlZmxlY3Rpb25FeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUpOworICAgICAgICAKKyAgICAgICAgQ29udGV4dEVudmlyb25tZW50IGNlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlID0gKENvbnRleHRFbnZpcm9ubWVudCkgZ2V0TWFuYWdlZFJlc291cmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkVGFyZ2V0T2JqZWN0VHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBjYW5ub3QgdXNlIHNpZGUtZWZlY3RzLiAgSXQncyByZW1vdmVkIGFuZCBhZGRlZCBiYWNrIGVhY2ggdGltZSAKKyAgICAgICAgLy8gdGhlcmUgaXMgYSBtb2RpZmljYXRpb24gaW4gYSByZXNvdXJjZS4KKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIG5yID0gY2UuZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIG5yLnJlbW92ZUVudmlyb25tZW50KGNlLmdldE5hbWUoKSk7CisgICAgICAgIG5yLmFkZEVudmlyb25tZW50KGNlKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL0NvbnRleHRSZXNvdXJjZUxpbmtNQmVhbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9Db250ZXh0UmVzb3VyY2VMaW5rTUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDM0NmJkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9Db250ZXh0UmVzb3VyY2VMaW5rTUJlYW4uamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnM7CisKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5JbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SZWZsZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5tb2RlbG1iZWFuLkludmFsaWRUYXJnZXRPYmplY3RUeXBlRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlTGluazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuQmFzZU1vZGVsTUJlYW47CisKKworLyoqCisgKiA8cD5BIDxzdHJvbmc+TW9kZWxNQmVhbjwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VMaW5rPC9jb2RlPiBjb21wb25lbnQuPC9wPgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dFJlc291cmNlTGlua01CZWFuIGV4dGVuZHMgQmFzZU1vZGVsTUJlYW4geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgPGNvZGU+TW9kZWxNQmVhbjwvY29kZT4gd2l0aCBkZWZhdWx0CisgICAgICogPGNvZGU+TW9kZWxNQmVhbkluZm88L2NvZGU+IGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gb2JqZWN0CisgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIGlmIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dFJlc291cmNlTGlua01CZWFuKCkKKyAgICAgICAgdGhyb3dzIE1CZWFuRXhjZXB0aW9uLCBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXR0cmlidXRlcworCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIGF0dHJpYnV0ZSBvZiB0aGlzIE1CZWFuLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZSBUaGUgaWRlbnRpZmljYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB0byBiZSBzZXQKKyAgICAgKiAgYW5kIHRoZSBuZXcgdmFsdWUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90CisgICAgICogIHN1cHBvcnRlZCBieSB0aGlzIE1CZWFuCisgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gb2JqZWN0CisgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFJlZmxlY3Rpb25FeGNlcHRpb24gaWYgYSBKYXZhIHJlZmxlY3Rpb24gZXhjZXB0aW9uCisgICAgICogIG9jY3VycyB3aGVuIGludm9raW5nIHRoZSBnZXR0ZXIKKyAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpCisgICAgICAgIHRocm93cyBBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiwgTUJlYW5FeGNlcHRpb24sCisgICAgICAgIFJlZmxlY3Rpb25FeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUpOworICAgICAgICAKKyAgICAgICAgQ29udGV4dFJlc291cmNlTGluayBjcmwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3JsID0gKENvbnRleHRSZXNvdXJjZUxpbmspIGdldE1hbmFnZWRSZXNvdXJjZSgpOworICAgICAgICB9IGNhdGNoIChJbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZFRhcmdldE9iamVjdFR5cGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gY2Fubm90IHVzZSBzaWRlLWVmZWN0cy4gIEl0J3MgcmVtb3ZlZCBhbmQgYWRkZWQgYmFjayBlYWNoIHRpbWUgCisgICAgICAgIC8vIHRoZXJlIGlzIGEgbW9kaWZpY2F0aW9uIGluIGEgcmVzb3VyY2UuCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBuciA9IGNybC5nZXROYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgbnIucmVtb3ZlUmVzb3VyY2VMaW5rKGNybC5nZXROYW1lKCkpOworICAgICAgICBuci5hZGRSZXNvdXJjZUxpbmsoY3JsKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL0NvbnRleHRSZXNvdXJjZU1CZWFuLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL0NvbnRleHRSZXNvdXJjZU1CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3YzkzOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvQ29udGV4dFJlc291cmNlTUJlYW4uamF2YQpAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnM7CisKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5JbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SZWZsZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5tb2RlbG1iZWFuLkludmFsaWRUYXJnZXRPYmplY3RUeXBlRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk5hbWluZ1Jlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5CYXNlTW9kZWxNQmVhbjsKKworCisvKioKKyAqIDxwPkEgPHN0cm9uZz5Nb2RlbE1CZWFuPC9zdHJvbmc+IGltcGxlbWVudGF0aW9uIGZvciB0aGUKKyAqIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZTwvY29kZT4gY29tcG9uZW50LjwvcD4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbnRleHRSZXNvdXJjZU1CZWFuIGV4dGVuZHMgQmFzZU1vZGVsTUJlYW4geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgPGNvZGU+TW9kZWxNQmVhbjwvY29kZT4gd2l0aCBkZWZhdWx0CisgICAgICogPGNvZGU+TW9kZWxNQmVhbkluZm88L2NvZGU+IGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gb2JqZWN0CisgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIGlmIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dFJlc291cmNlTUJlYW4oKQorICAgICAgICB0aHJvd3MgTUJlYW5FeGNlcHRpb24sIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlcigpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBdHRyaWJ1dGVzCisKKworICAgIC8qKgorICAgICAqIE9idGFpbiBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIGF0dHJpYnV0ZSBvZiB0aGlzIE1CZWFuLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QKKyAgICAgKiAgc3VwcG9ydGVkIGJ5IHRoaXMgTUJlYW4KKyAgICAgKiBAZXhjZXB0aW9uIE1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiBhbiBvYmplY3QKKyAgICAgKiAgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gUmVmbGVjdGlvbkV4Y2VwdGlvbiBpZiBhIEphdmEgcmVmbGVjdGlvbiBleGNlcHRpb24KKyAgICAgKiAgb2NjdXJzIHdoZW4gaW52b2tpbmcgdGhlIGdldHRlcgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24sIE1CZWFuRXhjZXB0aW9uLAorICAgICAgICBSZWZsZWN0aW9uRXhjZXB0aW9uIHsKKyAKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGlucHV0IHBhcmFtZXRlcnMKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdHRyaWJ1dGUgbmFtZSBpcyBudWxsIiksCisgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgbmFtZSBpcyBudWxsIik7CisKKyAgICAgICAgQ29udGV4dFJlc291cmNlIGNyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNyID0gKENvbnRleHRSZXNvdXJjZSkgZ2V0TWFuYWdlZFJlc291cmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkVGFyZ2V0T2JqZWN0VHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOworICAgICAgICBpZiAoImF1dGgiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIChjci5nZXRBdXRoKCkpOworICAgICAgICB9IGVsc2UgaWYgKCJkZXNjcmlwdGlvbiIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gKGNyLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICB9IGVsc2UgaWYgKCJuYW1lIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAoY3IuZ2V0TmFtZSgpKTsgICAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgaWYgKCJzY29wZSIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gKGNyLmdldFNjb3BlKCkpOyAgCisgICAgICAgIH0gZWxzZSBpZiAoInR5cGUiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIChjci5nZXRUeXBlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWUgPSAoU3RyaW5nKSBjci5nZXRQcm9wZXJ0eShuYW1lKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgYXR0cmlidXRlICIrbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgCisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIGF0dHJpYnV0ZSBvZiB0aGlzIE1CZWFuLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZSBUaGUgaWRlbnRpZmljYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB0byBiZSBzZXQKKyAgICAgKiAgYW5kIHRoZSBuZXcgdmFsdWUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90CisgICAgICogIHN1cHBvcnRlZCBieSB0aGlzIE1CZWFuCisgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gb2JqZWN0CisgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFJlZmxlY3Rpb25FeGNlcHRpb24gaWYgYSBKYXZhIHJlZmxlY3Rpb24gZXhjZXB0aW9uCisgICAgICogIG9jY3VycyB3aGVuIGludm9raW5nIHRoZSBnZXR0ZXIKKyAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpCisgICAgICAgIHRocm93cyBBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiwgTUJlYW5FeGNlcHRpb24sCisgICAgICAgIFJlZmxlY3Rpb25FeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCisgICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdHRyaWJ1dGUgaXMgbnVsbCIpLAorICAgICAgICAgICAgICAgICAiQXR0cmlidXRlIGlzIG51bGwiKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOworICAgICAgICBPYmplY3QgdmFsdWUgPSBhdHRyaWJ1dGUuZ2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdHRyaWJ1dGUgbmFtZSBpcyBudWxsIiksCisgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgbmFtZSBpcyBudWxsIik7IAorICAgICAgICAKKyAgICAgICAgQ29udGV4dFJlc291cmNlIGNyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNyID0gKENvbnRleHRSZXNvdXJjZSkgZ2V0TWFuYWdlZFJlc291cmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkVGFyZ2V0T2JqZWN0VHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoImF1dGgiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgY3Iuc2V0QXV0aCgoU3RyaW5nKXZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICgiZGVzY3JpcHRpb24iLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgY3Iuc2V0RGVzY3JpcHRpb24oKFN0cmluZyl2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIm5hbWUiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgY3Iuc2V0TmFtZSgoU3RyaW5nKXZhbHVlKTsgICAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgaWYgKCJzY29wZSIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICBjci5zZXRTY29wZSgoU3RyaW5nKXZhbHVlKTsgIAorICAgICAgICB9IGVsc2UgaWYgKCJ0eXBlIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIGNyLnNldFR5cGUoKFN0cmluZyl2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjci5zZXRQcm9wZXJ0eShuYW1lLCAiIit2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIGNhbm5vdCB1c2Ugc2lkZS1lZmVjdHMuICBJdCdzIHJlbW92ZWQgYW5kIGFkZGVkIGJhY2sgZWFjaCB0aW1lIAorICAgICAgICAvLyB0aGVyZSBpcyBhIG1vZGlmaWNhdGlvbiBpbiBhIHJlc291cmNlLgorICAgICAgICBOYW1pbmdSZXNvdXJjZXMgbnIgPSBjci5nZXROYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgbnIucmVtb3ZlUmVzb3VyY2UoY3IuZ2V0TmFtZSgpKTsKKyAgICAgICAgbnIuYWRkUmVzb3VyY2UoY3IpOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvRGVmYXVsdENvbnRleHRNQmVhbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9EZWZhdWx0Q29udGV4dE1CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0NmY0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvRGVmYXVsdENvbnRleHRNQmVhbi5qYXZhCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUxpbms7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLkJhc2VNb2RlbE1CZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLk1hbmFnZWRCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuY29tcGF0Lkpka0NvbXBhdDsKKworLyoqCisgKiA8cD5BIDxzdHJvbmc+TW9kZWxNQmVhbjwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmREZWZhdWx0Q29udGV4dDwvY29kZT4gY29tcG9uZW50LjwvcD4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlZmF1bHRDb250ZXh0TUJlYW4gZXh0ZW5kcyBCYXNlTW9kZWxNQmVhbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSA8Y29kZT5Nb2RlbE1CZWFuPC9jb2RlPiB3aXRoIGRlZmF1bHQKKyAgICAgKiA8Y29kZT5Nb2RlbE1CZWFuSW5mbzwvY29kZT4gaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiBhbiBvYmplY3QKKyAgICAgKiAgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24gaWYgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBEZWZhdWx0Q29udGV4dE1CZWFuKCkKKyAgICAgICAgdGhyb3dzIE1CZWFuRXhjZXB0aW9uLCBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgIH0KKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENsYXNzIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBKREsgY29tcGF0aWJpbGl0eSBzdXBwb3J0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmRrQ29tcGF0IGpka0NvbXBhdCA9IEpka0NvbXBhdC5nZXRKZGtDb21wYXQoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gcmVnaXN0cnkgZm9yIG91ciBtYW5hZ2VkIGJlYW5zLgorICAgICAqLworICAgIHByb3RlY3RlZCBSZWdpc3RyeSByZWdpc3RyeSA9IE1CZWFuVXRpbHMuY3JlYXRlUmVnaXN0cnkoKTsKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NYW5hZ2VkQmVhbjwvY29kZT4gaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGlzIE1CZWFuLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0KKyAgICAgICAgcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKCJEZWZhdWx0Q29udGV4dCIpOworCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBdHRyaWJ1dGVzCisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgTmFtaW5nUmVzb3VyY2VzIGdldE5hbWluZ1Jlc291cmNlcygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiAoKENvbnRleHQpdGhpcy5yZXNvdXJjZSkuZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUJlYW4gTmFtZXMgb2YgdGhlIHNldCBvZiBkZWZpbmVkIGVudmlyb25tZW50IGVudHJpZXMgZm9yICAKKyAgICAgKiB0aGlzIHdlYiBhcHBsaWNhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFbnZpcm9ubWVudHMoKSB7CisgICAgICAgIENvbnRleHRFbnZpcm9ubWVudFtdIGVudnMgPSBnZXROYW1pbmdSZXNvdXJjZXMoKS5maW5kRW52aXJvbm1lbnRzKCk7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShtYW5hZ2VkLmdldERvbWFpbigpLCBlbnZzW2ldKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBvYmplY3QgbmFtZSBmb3IgZW52aXJvbm1lbnQgIiArIGVudnNbaV0pOworICAgICAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7CisKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lcyBvZiBhbGwgdGhlIGRlZmluZWQgcmVzb3VyY2UgcmVmZXJlbmNlcyBmb3IgdGhpcworICAgICAqIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRSZXNvdXJjZXMoKSB7CisgICAgICAgIAorICAgICAgICBDb250ZXh0UmVzb3VyY2VbXSByZXNvdXJjZXMgPSBnZXROYW1pbmdSZXNvdXJjZXMoKS5maW5kUmVzb3VyY2VzKCk7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVPYmplY3ROYW1lKG1hbmFnZWQuZ2V0RG9tYWluKCksIHJlc291cmNlc1tpXSk7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQob25hbWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBjcmVhdGUgb2JqZWN0IG5hbWUgZm9yIHJlc291cmNlICIgKyByZXNvdXJjZXNbaV0pOworICAgICAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7CisKKyAgICB9CisKKyAgICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUJlYW4gTmFtZXMgb2YgYWxsIHRoZSBkZWZpbmVkIHJlc291cmNlIGxpbmtzIGZvciB0aGlzIAorICAgICAqIGFwcGxpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlTGlua3MoKSB7CisgICAgICAgIAorICAgICAgICBDb250ZXh0UmVzb3VyY2VMaW5rW10gbGlua3MgPSBnZXROYW1pbmdSZXNvdXJjZXMoKS5maW5kUmVzb3VyY2VMaW5rcygpOworICAgICAgICBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVPYmplY3ROYW1lKG1hbmFnZWQuZ2V0RG9tYWluKCksIGxpbmtzW2ldKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBvYmplY3QgbmFtZSBmb3IgcmVzb3VyY2UgIiArIGxpbmtzW2ldKTsKKyAgICAgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBpYWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pIHJlc3VsdHMudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdHMuc2l6ZSgpXSkpOworCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zCisKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBlbnZpcm9ubWVudCBlbnRyeSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW52TmFtZSBOZXcgZW52aXJvbm1lbnQgZW50cnkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgYWRkRW52aXJvbm1lbnQoU3RyaW5nIGVudk5hbWUsIFN0cmluZyB0eXBlKSAKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIENvbnRleHRFbnZpcm9ubWVudCBlbnYgPSBucmVzb3VyY2VzLmZpbmRFbnZpcm9ubWVudChlbnZOYW1lKTsKKyAgICAgICAgaWYgKGVudiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIGVudmlyb25tZW50IG5hbWUgLSBhbHJlYWR5IGV4aXN0cyAnIiArIGVudk5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIGVudiA9IG5ldyBDb250ZXh0RW52aXJvbm1lbnQoKTsKKyAgICAgICAgZW52LnNldE5hbWUoZW52TmFtZSk7CisgICAgICAgIGVudi5zZXRUeXBlKHR5cGUpOworICAgICAgICBucmVzb3VyY2VzLmFkZEVudmlyb25tZW50KGVudik7CisgICAgICAgIAorICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKCJDb250ZXh0RW52aXJvbm1lbnQiKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgZW52KTsKKyAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgCisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQWRkIGEgcmVzb3VyY2UgcmVmZXJlbmNlIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgTmV3IHJlc291cmNlIHJlZmVyZW5jZSBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhZGRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lLCBTdHJpbmcgdHlwZSkgCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIENvbnRleHRSZXNvdXJjZSByZXNvdXJjZSA9IG5yZXNvdXJjZXMuZmluZFJlc291cmNlKHJlc291cmNlTmFtZSk7CisgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIHJlc291cmNlIG5hbWUgLSBhbHJlYWR5IGV4aXN0cyciICsgcmVzb3VyY2VOYW1lICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICByZXNvdXJjZSA9IG5ldyBDb250ZXh0UmVzb3VyY2UoKTsKKyAgICAgICAgcmVzb3VyY2Uuc2V0TmFtZShyZXNvdXJjZU5hbWUpOworICAgICAgICByZXNvdXJjZS5zZXRUeXBlKHR5cGUpOworICAgICAgICBucmVzb3VyY2VzLmFkZFJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgCisgICAgICAgIC8vIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyBNQmVhbiBuYW1lCisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4oIkNvbnRleHRSZXNvdXJjZSIpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShtYW5hZ2VkLmdldERvbWFpbigpLCByZXNvdXJjZSk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIEFkZCBhIHJlc291cmNlIGxpbmsgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlTGlua05hbWUgTmV3IHJlc291cmNlIGxpbmsgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgYWRkUmVzb3VyY2VMaW5rKFN0cmluZyByZXNvdXJjZUxpbmtOYW1lLCBTdHJpbmcgZ2xvYmFsLCAKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUpIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIENvbnRleHRSZXNvdXJjZUxpbmsgcmVzb3VyY2VMaW5rID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yZXNvdXJjZXMuZmluZFJlc291cmNlTGluayhyZXNvdXJjZUxpbmtOYW1lKTsKKyAgICAgICAgaWYgKHJlc291cmNlTGluayAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIHJlc291cmNlIGxpbmsgbmFtZSAtIGFscmVhZHkgZXhpc3RzJyIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VMaW5rTmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzb3VyY2VMaW5rID0gbmV3IENvbnRleHRSZXNvdXJjZUxpbmsoKTsKKyAgICAgICAgcmVzb3VyY2VMaW5rLnNldEdsb2JhbChnbG9iYWwpOworICAgICAgICByZXNvdXJjZUxpbmsuc2V0TmFtZShyZXNvdXJjZUxpbmtOYW1lKTsKKyAgICAgICAgcmVzb3VyY2VMaW5rLnNldFR5cGUodHlwZSk7CisgICAgICAgIG5yZXNvdXJjZXMuYWRkUmVzb3VyY2VMaW5rKHJlc291cmNlTGluayk7CisgICAgICAgIAorICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKCJDb250ZXh0UmVzb3VyY2VMaW5rIik7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVPYmplY3ROYW1lKG1hbmFnZWQuZ2V0RG9tYWluKCksIHJlc291cmNlTGluayk7CisgICAgICAgIHJldHVybiAob25hbWUudG9TdHJpbmcoKSk7CisgICAgfSAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IGVudmlyb25tZW50IGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGVudk5hbWUgTmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRW52aXJvbm1lbnQoU3RyaW5nIGVudk5hbWUpIHsKKworICAgICAgICBOYW1pbmdSZXNvdXJjZXMgbnJlc291cmNlcyA9IGdldE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBpZiAobnJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ29udGV4dEVudmlyb25tZW50IGVudiA9IG5yZXNvdXJjZXMuZmluZEVudmlyb25tZW50KGVudk5hbWUpOworICAgICAgICBpZiAoZW52ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgZW52aXJvbm1lbnQgbmFtZSAnIiArIGVudk5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIG5yZXNvdXJjZXMucmVtb3ZlRW52aXJvbm1lbnQoZW52TmFtZSk7CisKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSByZXNvdXJjZSByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VOYW1lIE5hbWUgb2YgdGhlIHJlc291cmNlIHJlZmVyZW5jZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisKKyAgICAgICAgcmVzb3VyY2VOYW1lID0gT2JqZWN0TmFtZS51bnF1b3RlKHJlc291cmNlTmFtZSk7CisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDb250ZXh0UmVzb3VyY2UgcmVzb3VyY2UgPSBucmVzb3VyY2VzLmZpbmRSZXNvdXJjZShyZXNvdXJjZU5hbWUpOworICAgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiSW52YWxpZCByZXNvdXJjZSBuYW1lICciICsgcmVzb3VyY2VOYW1lICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICBucmVzb3VyY2VzLnJlbW92ZVJlc291cmNlKHJlc291cmNlTmFtZSk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgcmVzb3VyY2UgbGluayB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUxpbmtOYW1lIE5hbWUgb2YgdGhlIHJlc291cmNlIHJlZmVyZW5jZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZUxpbmsoU3RyaW5nIHJlc291cmNlTGlua05hbWUpIHsKKworICAgICAgICByZXNvdXJjZUxpbmtOYW1lID0gT2JqZWN0TmFtZS51bnF1b3RlKHJlc291cmNlTGlua05hbWUpOworICAgICAgICBOYW1pbmdSZXNvdXJjZXMgbnJlc291cmNlcyA9IGdldE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBpZiAobnJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ29udGV4dFJlc291cmNlTGluayByZXNvdXJjZSA9IG5yZXNvdXJjZXMuZmluZFJlc291cmNlTGluayhyZXNvdXJjZUxpbmtOYW1lKTsKKyAgICAgICAgaWYgKHJlc291cmNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgcmVzb3VyY2UgbmFtZSAnIiArIHJlc291cmNlTGlua05hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIG5yZXNvdXJjZXMucmVtb3ZlUmVzb3VyY2VMaW5rKHJlc291cmNlTGlua05hbWUpOworICAgIH0KKyAKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvR2xvYmFsUmVzb3VyY2VzTGlmZWN5Y2xlTGlzdGVuZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvR2xvYmFsUmVzb3VyY2VzTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmIyMGU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9HbG9iYWxSZXNvdXJjZXNMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuczsKKworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmF4Lm5hbWluZy5CaW5kaW5nOworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5Jbml0aWFsQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUm9sZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5MaWZlY3ljbGVMaXN0ZW5lcjwvY29kZT4gdGhhdCBpbnN0YW50aWF0ZXMgdGhlCisgKiBzZXQgb2YgTUJlYW5zIGFzc29jaWF0ZWQgd2l0aCBnbG9iYWwgSk5ESSByZXNvdXJjZXMgdGhhdCBhcmUgc3ViamVjdCB0bworICogbWFuYWdlbWVudC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIEdsb2JhbFJlc291cmNlc0xpZmVjeWNsZUxpc3RlbmVyCisgICAgaW1wbGVtZW50cyBMaWZlY3ljbGVMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEdsb2JhbFJlc291cmNlc0xpZmVjeWNsZUxpc3RlbmVyLmNsYXNzKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgb3duaW5nIENhdGFsaW5hIGNvbXBvbmVudCB0aGF0IHdlIGFyZSBhdHRhY2hlZCB0by4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlmZWN5Y2xlIGNvbXBvbmVudCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHJlZ2lzdHJ5IGZvciBvdXIgbWFuYWdlZCBiZWFucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gTUJlYW5VdGlscy5jcmVhdGVSZWdpc3RyeSgpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZUxpc3RlbmVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJpbWFyeSBlbnRyeSBwb2ludCBmb3Igc3RhcnR1cCBhbmQgc2h1dGRvd24gZXZlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgaWYgKExpZmVjeWNsZS5TVEFSVF9FVkVOVC5lcXVhbHMoZXZlbnQuZ2V0VHlwZSgpKSkgeworICAgICAgICAgICAgY29tcG9uZW50ID0gZXZlbnQuZ2V0TGlmZWN5Y2xlKCk7CisgICAgICAgICAgICBjcmVhdGVNQmVhbnMoKTsKKyAgICAgICAgfSBlbHNlIGlmIChMaWZlY3ljbGUuU1RPUF9FVkVOVC5lcXVhbHMoZXZlbnQuZ2V0VHlwZSgpKSkgeworICAgICAgICAgICAgZGVzdHJveU1CZWFucygpOworICAgICAgICAgICAgY29tcG9uZW50ID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIHRoZSBpbnRlcmVzdGluZyBnbG9iYWwgSk5ESSByZXNvdXJjZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTUJlYW5zKCkgeworCisgICAgICAgIC8vIExvb2sgdXAgb3VyIGdsb2JhbCBuYW1pbmcgY29udGV4dAorICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29udGV4dCA9IChDb250ZXh0KSAobmV3IEluaXRpYWxDb250ZXh0KCkpLmxvb2t1cCgiamF2YTovIik7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIk5vIGdsb2JhbCBuYW1pbmcgY29udGV4dCBkZWZpbmVkIGZvciBzZXJ2ZXIiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlY3Vyc2UgdGhyb3VnaCB0aGUgZGVmaW5lZCBnbG9iYWwgSk5ESSByZXNvdXJjZXMgY29udGV4dAorICAgICAgICB0cnkgeworICAgICAgICAgICAgY3JlYXRlTUJlYW5zKCIiLCBjb250ZXh0KTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiRXhjZXB0aW9uIHByb2Nlc3NpbmcgR2xvYmFsIEpOREkgUmVzb3VyY2VzIiwgZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIHRoZSBpbnRlcmVzdGluZyBnbG9iYWwgSk5ESSByZXNvdXJjZXMgaW4KKyAgICAgKiB0aGUgc3BlY2lmaWVkIG5hbWluZyBjb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBQcmVmaXggZm9yIGNvbXBsZXRlIG9iamVjdCBuYW1lIHBhdGhzCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBzY2FubmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIEpOREkgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1CZWFucyhTdHJpbmcgcHJlZml4LCBDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbnMgZm9yIEdsb2JhbCBKTkRJIFJlc291cmNlcyBpbiBDb250ZXh0ICciICsKKyAgICAgICAgICAgICAgICBwcmVmaXggKyAiJyIpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE5hbWluZ0VudW1lcmF0aW9uIGJpbmRpbmdzID0gY29udGV4dC5saXN0QmluZGluZ3MoIiIpOworICAgICAgICAgICAgd2hpbGUgKGJpbmRpbmdzLmhhc01vcmUoKSkgeworICAgICAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBiaW5kaW5ncy5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwcmVmaXggKyBiaW5kaW5nLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBjb250ZXh0Lmxvb2t1cChiaW5kaW5nLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hlY2tpbmcgcmVzb3VyY2UgIiArIG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1CZWFucyhuYW1lICsgIi8iLCAoQ29udGV4dCkgdmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBVc2VyRGF0YWJhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1CZWFucyhuYW1lLCAoVXNlckRhdGFiYXNlKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBjcmVhdGluZyBVc2VyRGF0YWJhc2UgTUJlYW5zIGZvciAiICsgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goIFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiUnVudGltZUV4Y2VwdGlvbiAiICsgZXgpOworICAgICAgICB9IGNhdGNoKCBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgIiArIGV4KTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBVc2VyRGF0YWJhc2UgYW5kIGl0cyBjb250ZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIENvbXBsZXRlIHJlc291cmNlIG5hbWUgb2YgdGhpcyBVc2VyRGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gZGF0YWJhc2UgVGhlIFVzZXJEYXRhYmFzZSB0byBiZSBwcm9jZXNzZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgTUJlYW5zCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTUJlYW5zKFN0cmluZyBuYW1lLCBVc2VyRGF0YWJhc2UgZGF0YWJhc2UpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW4gZm9yIHRoZSBVc2VyRGF0YWJhc2UgaXRzZWxmCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBVc2VyRGF0YWJhc2UgTUJlYW5zIGZvciByZXNvdXJjZSAiICsgbmFtZSk7CisgICAgICAgICAgICBsb2cuZGVidWcoIkRhdGFiYXNlPSIgKyBkYXRhYmFzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE1CZWFuVXRpbHMuY3JlYXRlTUJlYW4oZGF0YWJhc2UpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkNhbm5vdCBjcmVhdGUgVXNlckRhdGFiYXNlIE1CZWFuIGZvciByZXNvdXJjZSAiICsgbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFucyBmb3IgZWFjaCBkZWZpbmVkIFJvbGUKKyAgICAgICAgSXRlcmF0b3Igcm9sZXMgPSBkYXRhYmFzZS5nZXRSb2xlcygpOworICAgICAgICB3aGlsZSAocm9sZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBSb2xlIHJvbGUgPSAoUm9sZSkgcm9sZXMubmV4dCgpOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIENyZWF0aW5nIFJvbGUgTUJlYW4gZm9yIHJvbGUgIiArIHJvbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE1CZWFuVXRpbHMuY3JlYXRlTUJlYW4ocm9sZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIFJvbGUgTUJlYW4gZm9yIHJvbGUgIiArIHJvbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIGVhY2ggZGVmaW5lZCBHcm91cAorICAgICAgICBJdGVyYXRvciBncm91cHMgPSBkYXRhYmFzZS5nZXRHcm91cHMoKTsKKyAgICAgICAgd2hpbGUgKGdyb3Vwcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEdyb3VwIGdyb3VwID0gKEdyb3VwKSBncm91cHMubmV4dCgpOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIENyZWF0aW5nIEdyb3VwIE1CZWFuIGZvciBncm91cCAiICsgZ3JvdXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE1CZWFuVXRpbHMuY3JlYXRlTUJlYW4oZ3JvdXApID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBHcm91cCBNQmVhbiBmb3IgZ3JvdXAgIiArIGdyb3VwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW5zIGZvciBlYWNoIGRlZmluZWQgVXNlcgorICAgICAgICBJdGVyYXRvciB1c2VycyA9IGRhdGFiYXNlLmdldFVzZXJzKCk7CisgICAgICAgIHdoaWxlICh1c2Vycy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFVzZXIgdXNlciA9IChVc2VyKSB1c2Vycy5uZXh0KCk7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgQ3JlYXRpbmcgVXNlciBNQmVhbiBmb3IgdXNlciAiICsgdXNlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTUJlYW5VdGlscy5jcmVhdGVNQmVhbih1c2VyKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBjcmVhdGUgVXNlciBNQmVhbiBmb3IgdXNlciAiICsgdXNlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVzdHJveSB0aGUgTUJlYW5zIGZvciB0aGUgaW50ZXJlc3RpbmcgZ2xvYmFsIEpOREkgcmVzb3VyY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlc3Ryb3lNQmVhbnMoKSB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIkRlc3Ryb3lpbmcgTUJlYW5zIGZvciBHbG9iYWwgSk5ESSBSZXNvdXJjZXMiKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL0dyb3VwTUJlYW4uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvR3JvdXBNQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYTMxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL0dyb3VwTUJlYW4uamF2YQpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnM7CisKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Sb2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5CYXNlTW9kZWxNQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5NYW5hZ2VkQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmNvbXBhdC5KZGtDb21wYXQ7CisKKy8qKgorICogPHA+QSA8c3Ryb25nPk1vZGVsTUJlYW48L3N0cm9uZz4gaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICogPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Hcm91cDwvY29kZT4gY29tcG9uZW50LjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEdyb3VwTUJlYW4gZXh0ZW5kcyBCYXNlTW9kZWxNQmVhbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSA8Y29kZT5Nb2RlbE1CZWFuPC9jb2RlPiB3aXRoIGRlZmF1bHQKKyAgICAgKiA8Y29kZT5Nb2RlbE1CZWFuSW5mbzwvY29kZT4gaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiBhbiBvYmplY3QKKyAgICAgKiAgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24gaWYgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBHcm91cE1CZWFuKCkKKyAgICAgICAgdGhyb3dzIE1CZWFuRXhjZXB0aW9uLCBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xhc3MgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIEpESyBjb21wYXRpYmlsaXR5IHN1cHBvcnQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKZGtDb21wYXQgamRrQ29tcGF0ID0gSmRrQ29tcGF0LmdldEpka0NvbXBhdCgpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gcmVnaXN0cnkgZm9yIG91ciBtYW5hZ2VkIGJlYW5zLgorICAgICAqLworICAgIHByb3RlY3RlZCBSZWdpc3RyeSByZWdpc3RyeSA9IE1CZWFuVXRpbHMuY3JlYXRlUmVnaXN0cnkoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPk1CZWFuU2VydmVyPC9jb2RlPiBpbiB3aGljaCB3ZSBhcmUgcmVnaXN0ZXJlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IE1CZWFuVXRpbHMuY3JlYXRlU2VydmVyKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NYW5hZ2VkQmVhbjwvY29kZT4gaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGlzIE1CZWFuLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0KKyAgICAgICAgcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKCJHcm91cCIpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lcyBvZiBhbGwgYXV0aG9yaXplZCByb2xlcyBmb3IgdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Um9sZXMoKSB7CisKKyAgICAgICAgR3JvdXAgZ3JvdXAgPSAoR3JvdXApIHRoaXMucmVzb3VyY2U7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciByb2xlcyA9IGdyb3VwLmdldFJvbGVzKCk7CisgICAgICAgIHdoaWxlIChyb2xlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFJvbGUgcm9sZSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJvbGUgPSAoUm9sZSkgcm9sZXMubmV4dCgpOworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgcm9sZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQob25hbWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBjcmVhdGUgb2JqZWN0IG5hbWUgZm9yIHJvbGUgIiArIHJvbGUpOworICAgICAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUJlYW4gTmFtZXMgb2YgYWxsIHVzZXJzIHRoYXQgYXJlIG1lbWJlcnMgb2YgdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VXNlcnMoKSB7CisKKyAgICAgICAgR3JvdXAgZ3JvdXAgPSAoR3JvdXApIHRoaXMucmVzb3VyY2U7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciB1c2VycyA9IGdyb3VwLmdldFVzZXJzKCk7CisgICAgICAgIHdoaWxlICh1c2Vycy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFVzZXIgdXNlciA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHVzZXIgPSAoVXNlcikgdXNlcnMubmV4dCgpOworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgdXNlcik7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQob25hbWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBjcmVhdGUgb2JqZWN0IG5hbWUgZm9yIHVzZXIgIiArIHVzZXIpOworICAgICAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3BlcmF0aW9ucworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcge0BsaW5rIFJvbGV9IHRvIHRob3NlIHRoaXMgZ3JvdXAgYmVsb25ncyB0by4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlbmFtZSBSb2xlIG5hbWUgb2YgdGhlIG5ldyByb2xlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUm9sZShTdHJpbmcgcm9sZW5hbWUpIHsKKworICAgICAgICBHcm91cCBncm91cCA9IChHcm91cCkgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgaWYgKGdyb3VwID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBSb2xlIHJvbGUgPSBncm91cC5nZXRVc2VyRGF0YWJhc2UoKS5maW5kUm9sZShyb2xlbmFtZSk7CisgICAgICAgIGlmIChyb2xlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgcm9sZSBuYW1lICciICsgcm9sZW5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIGdyb3VwLmFkZFJvbGUocm9sZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHtAbGluayBSb2xlfSBmcm9tIHRob3NlIHRoaXMgZ3JvdXAgYmVsb25ncyB0by4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlbmFtZSBSb2xlIG5hbWUgb2YgdGhlIG9sZCByb2xlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUm9sZShTdHJpbmcgcm9sZW5hbWUpIHsKKworICAgICAgICBHcm91cCBncm91cCA9IChHcm91cCkgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgaWYgKGdyb3VwID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBSb2xlIHJvbGUgPSBncm91cC5nZXRVc2VyRGF0YWJhc2UoKS5maW5kUm9sZShyb2xlbmFtZSk7CisgICAgICAgIGlmIChyb2xlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgcm9sZSBuYW1lICciICsgcm9sZW5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIGdyb3VwLnJlbW92ZVJvbGUocm9sZSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9NQmVhbkZhY3RvcnkuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvTUJlYW5GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjYTdmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvTUJlYW5GYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMTE2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLlNpbmdsZVNpZ25PbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkNvbnRhaW5lckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRFbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcExvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkRhdGFTb3VyY2VSZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpEQkNSZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpORElSZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpBQVNSZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLk1lbW9yeVJlYWxtOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uVXNlckRhdGFiYXNlUmVhbG07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlN0YW5kYXJkTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQ29udGV4dENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuSG9zdENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5BY2Nlc3NMb2dWYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZW1vdGVBZGRyVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVtb3RlSG9zdFZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlcXVlc3REdW1wZXJWYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5WYWx2ZUJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuQmFzZU1vZGVsTUJlYW47CisKKworLyoqCisgKiA8cD5BIDxzdHJvbmc+TW9kZWxNQmVhbjwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXI8L2NvZGU+IGNvbXBvbmVudC48L3A+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBNQmVhbkZhY3RvcnkgZXh0ZW5kcyBCYXNlTW9kZWxNQmVhbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0gCisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKE1CZWFuRmFjdG9yeS5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+TUJlYW5TZXJ2ZXI8L2NvZGU+IGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBNQmVhblV0aWxzLmNyZWF0ZVNlcnZlcigpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIDxjb2RlPk1vZGVsTUJlYW48L2NvZGU+IHdpdGggZGVmYXVsdAorICAgICAqIDxjb2RlPk1vZGVsTUJlYW5JbmZvPC9jb2RlPiBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTUJlYW5FeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemVyIG9mIGFuIG9iamVjdAorICAgICAqICB0aHJvd3MgYW4gZXhjZXB0aW9uCisgICAgICogQGV4Y2VwdGlvbiBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiBpZiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgb2NjdXJzCisgICAgICovCisgICAgcHVibGljIE1CZWFuRmFjdG9yeSgpCisgICAgICAgIHRocm93cyBNQmVhbkV4Y2VwdGlvbiwgUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXR0cmlidXRlcworCisKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWFuYWdlZCBiZWFuIGRlZmluaXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgYmVhbiB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBNQmVhbiB0eXBlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaW5kT2JqZWN0TmFtZShTdHJpbmcgdHlwZSkgeworCisgICAgICAgIGlmICh0eXBlLmVxdWFscygib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dCIpKSB7CisgICAgICAgICAgICByZXR1cm4gIlN0YW5kYXJkQ29udGV4dCI7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEVuZ2luZSIpKSB7CisgICAgICAgICAgICByZXR1cm4gIkVuZ2luZSI7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3QiKSkgeworICAgICAgICAgICAgcmV0dXJuICJIb3N0IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExpdHRsZSBjb252ZW5pZW5jZSBtZXRob2QgdG8gcmVtb3ZlIHJlZHVuZGFudCBjb2RlCisgICAgICogd2hlbiByZXRyaWV2aW5nIHRoZSBwYXRoIHN0cmluZworICAgICAqCisgICAgICogQHBhcmFtIHQgcGF0aCBzdHJpbmcKKyAgICAgKiBAcmV0dXJuIGVtcHR5IHN0cmluZyBpZiB0PT1udWxsIHx8IHQuZXF1YWxzKCIvIikKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBnZXRQYXRoU3RyKFN0cmluZyB0KSB7CisgICAgICAgIGlmICh0ID09IG51bGwgfHwgdC5lcXVhbHMoIi8iKSkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0OworICAgIH0KKyAgICAKKyAgIC8qKgorICAgICAqIEdldCBQYXJlbnQgQ29udGFpbmVyQmFzZSB0byBhZGQgaXRzIGNoaWxkIGNvbXBvbmVudCAKKyAgICAgKiBmcm9tIHBhcmVudCdzIE9iamVjdE5hbWUKKyAgICAgKi8KKyAgICBwcml2YXRlIENvbnRhaW5lckJhc2UgZ2V0UGFyZW50Q29udGFpbmVyRnJvbVBhcmVudChPYmplY3ROYW1lIHBuYW1lKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgdHlwZSA9IHBuYW1lLmdldEtleVByb3BlcnR5KCJ0eXBlIik7CisgICAgICAgIFN0cmluZyBqMmVlVHlwZSA9IHBuYW1lLmdldEtleVByb3BlcnR5KCJqMmVlVHlwZSIpOworICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHBuYW1lKTsKKyAgICAgICAgU3RhbmRhcmRFbmdpbmUgZW5naW5lID0gKFN0YW5kYXJkRW5naW5lKSBzZXJ2aWNlLmdldENvbnRhaW5lcigpOworICAgICAgICBpZiAoKGoyZWVUeXBlIT1udWxsKSAmJiAoajJlZVR5cGUuZXF1YWxzKCJXZWJNb2R1bGUiKSkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcG5hbWUuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygyKTsKKyAgICAgICAgICAgIGludCBpID0gbmFtZS5pbmRleE9mKCIvIik7CisgICAgICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSBuYW1lLnN1YnN0cmluZygwLGkpOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBuYW1lLnN1YnN0cmluZyhpKTsKKyAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSBlbmdpbmUuZmluZENoaWxkKGhvc3ROYW1lKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoU3RyID0gZ2V0UGF0aFN0cihwYXRoKTsKKyAgICAgICAgICAgIFN0YW5kYXJkQ29udGV4dCBjb250ZXh0ID0gKFN0YW5kYXJkQ29udGV4dClob3N0LmZpbmRDaGlsZChwYXRoU3RyKTsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0OworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHR5cGUuZXF1YWxzKCJFbmdpbmUiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbmdpbmU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJIb3N0IikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSBwbmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICAgICAgICAgIFN0YW5kYXJkSG9zdCBob3N0ID0gKFN0YW5kYXJkSG9zdCkgZW5naW5lLmZpbmRDaGlsZChob3N0TmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhvc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIAorICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IFBhcmVudCBDb250YWluZXJCYXNlIHRvIGFkZCBpdHMgY2hpbGQgY29tcG9uZW50IAorICAgICAqIGZyb20gY2hpbGQgY29tcG9uZW50J3MgT2JqZWN0TmFtZSAgYXMgYSBTdHJpbmcKKyAgICAgKi8gICAgCisgICAgcHJpdmF0ZSBDb250YWluZXJCYXNlIGdldFBhcmVudENvbnRhaW5lckZyb21DaGlsZChPYmplY3ROYW1lIG9uYW1lKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICBTdHJpbmcgcGF0aCA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJwYXRoIik7CisgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2Uob25hbWUpOworICAgICAgICBTdGFuZGFyZEVuZ2luZSBlbmdpbmUgPSAoU3RhbmRhcmRFbmdpbmUpIHNlcnZpY2UuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIGlmIChob3N0TmFtZSA9PSBudWxsKSB7ICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gY2hpbGQncyBjb250YWluZXIgaXMgRW5naW5lCisgICAgICAgICAgICByZXR1cm4gZW5naW5lOworICAgICAgICB9IGVsc2UgaWYgKHBhdGggPT0gbnVsbCkgeyAgICAgIAorICAgICAgICAgICAgLy8gY2hpbGQncyBjb250YWluZXIgaXMgSG9zdAorICAgICAgICAgICAgU3RhbmRhcmRIb3N0IGhvc3QgPSAoU3RhbmRhcmRIb3N0KSBlbmdpbmUuZmluZENoaWxkKGhvc3ROYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBob3N0OworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGNoaWxkJ3MgY29udGFpbmVyIGlzIENvbnRleHQKKyAgICAgICAgICAgIFN0YW5kYXJkSG9zdCBob3N0ID0gKFN0YW5kYXJkSG9zdCkgZW5naW5lLmZpbmRDaGlsZChob3N0TmFtZSk7CisgICAgICAgICAgICBwYXRoID0gZ2V0UGF0aFN0cihwYXRoKTsKKyAgICAgICAgICAgIFN0YW5kYXJkQ29udGV4dCBjb250ZXh0ID0gKFN0YW5kYXJkQ29udGV4dCkgaG9zdC5maW5kQ2hpbGQocGF0aCk7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIAorICAgIHByaXZhdGUgU2VydmljZSBnZXRTZXJ2aWNlKE9iamVjdE5hbWUgb25hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgIAorICAgICAgICBTdHJpbmcgZG9tYWluID0gb25hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgIFNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJGYWN0b3J5LmdldFNlcnZlcigpOworICAgICAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBzZXJ2ZXIuZmluZFNlcnZpY2VzKCk7CisgICAgICAgIFN0YW5kYXJkU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc2VydmljZSA9IChTdGFuZGFyZFNlcnZpY2UpIHNlcnZpY2VzW2ldOworICAgICAgICAgICAgaWYgKGRvbWFpbi5lcXVhbHMoc2VydmljZS5nZXRPYmplY3ROYW1lKCkuZ2V0RG9tYWluKCkpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZXJ2aWNlLmdldE9iamVjdE5hbWUoKS5nZXREb21haW4oKS5lcXVhbHMoZG9tYWluKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiU2VydmljZSB3aXRoIHRoZSBkb21haW4gaXMgbm90IGZvdW5kIik7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICByZXR1cm4gc2VydmljZTsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQWNjZXNzTG9nZ2VyVmFsdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IE1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlQWNjZXNzTG9nZ2VyVmFsdmUoU3RyaW5nIHBhcmVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBwbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBBY2Nlc3NMb2dWYWx2ZSBpbnN0YW5jZQorICAgICAgICBBY2Nlc3NMb2dWYWx2ZSBhY2Nlc3NMb2dnZXIgPSBuZXcgQWNjZXNzTG9nVmFsdmUoKTsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXJCYXNlID0gZ2V0UGFyZW50Q29udGFpbmVyRnJvbVBhcmVudChwbmFtZSk7CisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIGNvbnRhaW5lckJhc2UuYWRkVmFsdmUoYWNjZXNzTG9nZ2VyKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGFjY2Vzc0xvZ2dlci5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgIHJldHVybiAob25hbWUudG9TdHJpbmcoKSk7CisKKyAgICB9CisgICAgICAgIAorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEFqcENvbm5lY3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgSVAgYWRkcmVzcyBvbiB3aGljaCB0byBiaW5kCisgICAgICogQHBhcmFtIHBvcnQgVENQIHBvcnQgbnVtYmVyIHRvIGxpc3RlbiBvbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlQWpwQ29ubmVjdG9yKFN0cmluZyBwYXJlbnQsIFN0cmluZyBhZGRyZXNzLCBpbnQgcG9ydCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbm5lY3RvcihwYXJlbnQsIGFkZHJlc3MsIHBvcnQsIHRydWUsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IERhdGFTb3VyY2UgUmVhbG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IE1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRGF0YVNvdXJjZVJlYWxtKFN0cmluZyBwYXJlbnQsIFN0cmluZyBkYXRhU291cmNlTmFtZSwgCisgICAgICAgIFN0cmluZyByb2xlTmFtZUNvbCwgU3RyaW5nIHVzZXJDcmVkQ29sLCBTdHJpbmcgdXNlck5hbWVDb2wsIAorICAgICAgICBTdHJpbmcgdXNlclJvbGVUYWJsZSwgU3RyaW5nIHVzZXJUYWJsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IERhdGFTb3VyY2VSZWFsbSBpbnN0YW5jZQorICAgICAgICBEYXRhU291cmNlUmVhbG0gcmVhbG0gPSBuZXcgRGF0YVNvdXJjZVJlYWxtKCk7CisgICAgICAgIHJlYWxtLnNldERhdGFTb3VyY2VOYW1lKGRhdGFTb3VyY2VOYW1lKTsKKyAgICAgICAgcmVhbG0uc2V0Um9sZU5hbWVDb2wocm9sZU5hbWVDb2wpOworICAgICAgICByZWFsbS5zZXRVc2VyQ3JlZENvbCh1c2VyQ3JlZENvbCk7CisgICAgICAgIHJlYWxtLnNldFVzZXJOYW1lQ29sKHVzZXJOYW1lQ29sKTsKKyAgICAgICAgcmVhbG0uc2V0VXNlclJvbGVUYWJsZSh1c2VyUm9sZVRhYmxlKTsKKyAgICAgICAgcmVhbG0uc2V0VXNlclRhYmxlKHVzZXJUYWJsZSk7CisKKyAgICAgICAgLy8gQWRkIHRoZSBuZXcgaW5zdGFuY2UgdG8gaXRzIHBhcmVudCBjb21wb25lbnQKKyAgICAgICAgT2JqZWN0TmFtZSBwbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgIENvbnRhaW5lckJhc2UgY29udGFpbmVyQmFzZSA9IGdldFBhcmVudENvbnRhaW5lckZyb21QYXJlbnQocG5hbWUpOworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBjb250YWluZXJCYXNlLnNldFJlYWxtKHJlYWxtKTsKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIE1CZWFuIG5hbWUKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IHJlYWxtLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgaWYgKG9uYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAob25hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSAgIAorCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEh0dHBDb25uZWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICogQHBhcmFtIGFkZHJlc3MgVGhlIElQIGFkZHJlc3Mgb24gd2hpY2ggdG8gYmluZAorICAgICAqIEBwYXJhbSBwb3J0IFRDUCBwb3J0IG51bWJlciB0byBsaXN0ZW4gb24KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUh0dHBDb25uZWN0b3IoU3RyaW5nIHBhcmVudCwgU3RyaW5nIGFkZHJlc3MsIGludCBwb3J0KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjcmVhdGVDb25uZWN0b3IocGFyZW50LCBhZGRyZXNzLCBwb3J0LCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBDb25uZWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICogQHBhcmFtIGFkZHJlc3MgVGhlIElQIGFkZHJlc3Mgb24gd2hpY2ggdG8gYmluZAorICAgICAqIEBwYXJhbSBwb3J0IFRDUCBwb3J0IG51bWJlciB0byBsaXN0ZW4gb24KKyAgICAgKiBAcGFyYW0gaXNBanAgQ3JlYXRlIGEgQUpQLzEuMyBDb25uZWN0b3IKKyAgICAgKiBAcGFyYW0gaXNTU0wgQ3JlYXRlIGEgc2VjdXJlIENvbm5lY3RvcgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUNvbm5lY3RvcihTdHJpbmcgcGFyZW50LCBTdHJpbmcgYWRkcmVzcywgaW50IHBvcnQsIGJvb2xlYW4gaXNBanAsIGJvb2xlYW4gaXNTU0wpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb25uZWN0b3IgcmV0b2JqOworICAgICAgICBpZiAoaXNBanApIHsKKyAgICAgICAgICAgIHJldG9iaiA9IG5ldyBDb25uZWN0b3IoIkFKUC8xLjMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldG9iaiA9IG5ldyBDb25uZWN0b3IoIkhUVFAvMS4xIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhZGRyZXNzIT1udWxsKSAmJiAoYWRkcmVzcy5sZW5ndGgoKT4wKSkgeworICAgICAgICAgICAgcmV0b2JqLnNldFByb3BlcnR5KCJhZGRyZXNzIiwgYWRkcmVzcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gU2V0IHBvcnQgbnVtYmVyCisgICAgICAgIHJldG9iai5zZXRQb3J0KHBvcnQpOworICAgICAgICAvLyBTZXQgU1NMCisgICAgICAgIHJldG9iai5zZXRTZWN1cmUoaXNTU0wpOworICAgICAgICByZXRvYmouc2V0U2NoZW1lKGlzU1NMID8gImh0dHBzIiA6ICJodHRwIik7CisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIC8vIEZJWCBNRSAtIGFkZENvbm5lY3RvciB3aWxsIGZhaWwKKyAgICAgICAgT2JqZWN0TmFtZSBwbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocG5hbWUpOworICAgICAgICBzZXJ2aWNlLmFkZENvbm5lY3RvcihyZXRvYmopOworICAgICAgICAKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIE1CZWFuIG5hbWUKKyAgICAgICAgT2JqZWN0TmFtZSBjb25hbWUgPSByZXRvYmouZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIChjb25hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgSHR0cHNDb25uZWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICogQHBhcmFtIGFkZHJlc3MgVGhlIElQIGFkZHJlc3Mgb24gd2hpY2ggdG8gYmluZAorICAgICAqIEBwYXJhbSBwb3J0IFRDUCBwb3J0IG51bWJlciB0byBsaXN0ZW4gb24KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUh0dHBzQ29ubmVjdG9yKFN0cmluZyBwYXJlbnQsIFN0cmluZyBhZGRyZXNzLCBpbnQgcG9ydCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjcmVhdGVDb25uZWN0b3IocGFyZW50LCBhZGRyZXNzLCBwb3J0LCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEpEQkMgUmVhbG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IE1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlSkRCQ1JlYWxtKFN0cmluZyBwYXJlbnQsIFN0cmluZyBkcml2ZXJOYW1lLCAKKyAgICAgICAgICAgIFN0cmluZyBjb25uZWN0aW9uTmFtZSwgU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCwKKyAgICAgICAgICAgIFN0cmluZyBjb25uZWN0aW9uVVJMKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgSkRCQ1JlYWxtIGluc3RhbmNlCisgICAgICAgIEpEQkNSZWFsbSByZWFsbSA9IG5ldyBKREJDUmVhbG0oKTsKKyAgICAgICAgcmVhbG0uc2V0RHJpdmVyTmFtZShkcml2ZXJOYW1lKTsKKyAgICAgICAgcmVhbG0uc2V0Q29ubmVjdGlvbk5hbWUoY29ubmVjdGlvbk5hbWUpOworICAgICAgICByZWFsbS5zZXRDb25uZWN0aW9uUGFzc3dvcmQoY29ubmVjdGlvblBhc3N3b3JkKTsKKyAgICAgICAgcmVhbG0uc2V0Q29ubmVjdGlvblVSTChjb25uZWN0aW9uVVJMKTsKKworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXJCYXNlID0gZ2V0UGFyZW50Q29udGFpbmVyRnJvbVBhcmVudChwbmFtZSk7CisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIGNvbnRhaW5lckJhc2Uuc2V0UmVhbG0ocmVhbG0pOworICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gcmVhbG0uZ2V0T2JqZWN0TmFtZSgpOworCisgICAgICAgIGlmIChvbmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gICAKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEpOREkgUmVhbG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IE1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudAorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uVVJMIFVSTCB0byBjb25uZWN0IHRvIGRpcmVjdG9yeQorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uTmFtZSBVc2VybmFtZSB0byB1c2UgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvblBhc3N3b3JkIFBhc3N3b3JkIHRvIGF1dGhlbnRpY2F0ZSB3aXRoCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVKTkRJUmVhbG0oU3RyaW5nIHBhcmVudCwgU3RyaW5nIGNvbm5lY3Rpb25VUkwsCisgICAgICAgICAgICBTdHJpbmcgY29ubmVjdGlvbk5hbWUsU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBKTkRJUmVhbG0gaW5zdGFuY2UKKyAgICAgICAgSk5ESVJlYWxtIHJlYWxtID0gbmV3IEpORElSZWFsbSgpOworICAgICAgICByZWFsbS5zZXRDb25uZWN0aW9uVVJMKGNvbm5lY3Rpb25VUkwpOworICAgICAgICByZWFsbS5zZXRDb25uZWN0aW9uTmFtZShjb25uZWN0aW9uTmFtZSk7CisgICAgICAgIHJlYWxtLnNldENvbm5lY3Rpb25QYXNzd29yZChjb25uZWN0aW9uUGFzc3dvcmQpOworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXJCYXNlID0gZ2V0UGFyZW50Q29udGFpbmVyRnJvbVBhcmVudChwbmFtZSk7CisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIGNvbnRhaW5lckJhc2Uuc2V0UmVhbG0ocmVhbG0pOworICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gcmVhbG0uZ2V0T2JqZWN0TmFtZSgpOworCisgICAgICAgIGlmIChvbmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gICAKKworCisgICAgfQorICAgIAorICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgSkFBUyBSZWFsbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVKQUFTUmVhbG0oU3RyaW5nIHBhcmVudCxTdHJpbmcgYXBwTmFtZSxTdHJpbmcgdXNlckNsYXNzTmFtZXMsU3RyaW5nIHJvbGVDbGFzc05hbWVzLFN0cmluZyB1c2VDb250ZXh0Q2xhc3NMb2FkZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgSkFBU1JlYWxtIGluc3RhbmNlCisgICAgICAgIEpBQVNSZWFsbSByZWFsbSA9IG5ldyBKQUFTUmVhbG0oKTsKKyAgICAgICAgcmVhbG0uc2V0VXNlckNsYXNzTmFtZXModXNlckNsYXNzTmFtZXMpOworICAgICAgICByZWFsbS5zZXRSb2xlQ2xhc3NOYW1lcyhyb2xlQ2xhc3NOYW1lcyk7CisgICAgICAgIGlmKCJ0cnVlIi5lcXVhbHModXNlQ29udGV4dENsYXNzTG9hZGVyKSB8fAorICAgICAgICAgICAgICAgICJUUlVFIi5lcXVhbHModXNlQ29udGV4dENsYXNzTG9hZGVyKSl7CisgICAgICAgICAgICByZWFsbS5zZXRVc2VDb250ZXh0Q2xhc3NMb2FkZXIodHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWFsbS5zZXRVc2VDb250ZXh0Q2xhc3NMb2FkZXIoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIE9iamVjdE5hbWUgcG5hbWUgPSBuZXcgT2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICBDb250YWluZXJCYXNlIGNvbnRhaW5lckJhc2UgPSBnZXRQYXJlbnRDb250YWluZXJGcm9tUGFyZW50KHBuYW1lKTsKKyAgICAgICAgLy8gQWRkIHRoZSBuZXcgaW5zdGFuY2UgdG8gaXRzIHBhcmVudCBjb21wb25lbnQKKyAgICAgICAgY29udGFpbmVyQmFzZS5zZXRSZWFsbShyZWFsbSk7CisgICAgICAgIC8vIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyBNQmVhbiBuYW1lCisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSByZWFsbS5nZXRPYmplY3ROYW1lKCk7CisKKyAgICAgICAgaWYgKG9uYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAob25hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSAgIAorCisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgTWVtb3J5IFJlYWxtLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU1lbW9yeVJlYWxtKFN0cmluZyBwYXJlbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTWVtb3J5UmVhbG0gaW5zdGFuY2UKKyAgICAgICAgTWVtb3J5UmVhbG0gcmVhbG0gPSBuZXcgTWVtb3J5UmVhbG0oKTsKKworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXJCYXNlID0gZ2V0UGFyZW50Q29udGFpbmVyRnJvbVBhcmVudChwbmFtZSk7CisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIGNvbnRhaW5lckJhc2Uuc2V0UmVhbG0ocmVhbG0pOworICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gcmVhbG0uZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICBpZiAob25hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9ICAgCisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBSZW1vdGUgQWRkcmVzcyBGaWx0ZXIgVmFsdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IE1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlUmVtb3RlQWRkclZhbHZlKFN0cmluZyBwYXJlbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBSZW1vdGVBZGRyVmFsdmUgaW5zdGFuY2UKKyAgICAgICAgUmVtb3RlQWRkclZhbHZlIHZhbHZlID0gbmV3IFJlbW90ZUFkZHJWYWx2ZSgpOworCisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIE9iamVjdE5hbWUgcG5hbWUgPSBuZXcgT2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICBDb250YWluZXJCYXNlIGNvbnRhaW5lckJhc2UgPSBnZXRQYXJlbnRDb250YWluZXJGcm9tUGFyZW50KHBuYW1lKTsKKyAgICAgICAgY29udGFpbmVyQmFzZS5hZGRWYWx2ZSh2YWx2ZSk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSB2YWx2ZS5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgIHJldHVybiAob25hbWUudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgUmVtb3RlIEhvc3QgRmlsdGVyIFZhbHZlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVJlbW90ZUhvc3RWYWx2ZShTdHJpbmcgcGFyZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgUmVtb3RlSG9zdFZhbHZlIGluc3RhbmNlCisgICAgICAgIFJlbW90ZUhvc3RWYWx2ZSB2YWx2ZSA9IG5ldyBSZW1vdGVIb3N0VmFsdmUoKTsKKworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXJCYXNlID0gZ2V0UGFyZW50Q29udGFpbmVyRnJvbVBhcmVudChwbmFtZSk7CisgICAgICAgIGNvbnRhaW5lckJhc2UuYWRkVmFsdmUodmFsdmUpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gdmFsdmUuZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBSZXF1ZXN0IER1bXBlciBWYWx2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVSZXF1ZXN0RHVtcGVyVmFsdmUoU3RyaW5nIHBhcmVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFJlcXVlc3REdW1wZXJWYWx2ZSBpbnN0YW5jZQorICAgICAgICBSZXF1ZXN0RHVtcGVyVmFsdmUgdmFsdmUgPSBuZXcgUmVxdWVzdER1bXBlclZhbHZlKCk7CisKKyAgICAgICAgLy8gQWRkIHRoZSBuZXcgaW5zdGFuY2UgdG8gaXRzIHBhcmVudCBjb21wb25lbnQKKyAgICAgICAgT2JqZWN0TmFtZSBwbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgIENvbnRhaW5lckJhc2UgY29udGFpbmVyQmFzZSA9IGdldFBhcmVudENvbnRhaW5lckZyb21QYXJlbnQocG5hbWUpOworICAgICAgICBjb250YWluZXJCYXNlLmFkZFZhbHZlKHZhbHZlKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IHZhbHZlLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IFNpbmdsZSBTaWduIE9uIFZhbHZlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVNpbmdsZVNpZ25PbihTdHJpbmcgcGFyZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU2luZ2xlU2lnbk9uIGluc3RhbmNlCisgICAgICAgIFNpbmdsZVNpZ25PbiB2YWx2ZSA9IG5ldyBTaW5nbGVTaWduT24oKTsKKworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXJCYXNlID0gZ2V0UGFyZW50Q29udGFpbmVyRnJvbVBhcmVudChwbmFtZSk7CisgICAgICAgIGNvbnRhaW5lckJhc2UuYWRkVmFsdmUodmFsdmUpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gdmFsdmUuZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworCisgICAgfQorICAgIAorICAgIAorICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IFN0YW5kYXJkQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICogQHBhcmFtIHBhdGggVGhlIGNvbnRleHQgcGF0aCBmb3IgdGhpcyBDb250ZXh0CisgICAgICogQHBhcmFtIGRvY0Jhc2UgRG9jdW1lbnQgYmFzZSBkaXJlY3RvcnkgKG9yIFdBUikgZm9yIHRoaXMgQ29udGV4dAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlU3RhbmRhcmRDb250ZXh0KFN0cmluZyBwYXJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkb2NCYXNlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIC8vIFhYWCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gUmVtb3ZlIGl0IG9uY2Ugc3VwcG9ydGVkIGJ5IHRoZSBhZG1pbgorICAgICAgICByZXR1cm4gCisgICAgICAgICAgICBjcmVhdGVTdGFuZGFyZENvbnRleHQocGFyZW50LHBhdGgsZG9jQmFzZSxmYWxzZSxmYWxzZSxmYWxzZSxmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgY29udGV4dCBwYXRoLCBnZXQgdGhlIGNvbmZpZyBmaWxlIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29uZmlnRmlsZShTdHJpbmcgcGF0aCkgeworICAgICAgICBTdHJpbmcgYmFzZW5hbWUgPSBudWxsOworICAgICAgICBpZiAocGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBiYXNlbmFtZSA9ICJST09UIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJhc2VuYW1lID0gcGF0aC5zdWJzdHJpbmcoMSkucmVwbGFjZSgnLycsICcjJyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChiYXNlbmFtZSk7CisgICAgfQorCisgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgU3RhbmRhcmRDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQKKyAgICAgKiBAcGFyYW0gcGF0aCBUaGUgY29udGV4dCBwYXRoIGZvciB0aGlzIENvbnRleHQKKyAgICAgKiBAcGFyYW0gZG9jQmFzZSBEb2N1bWVudCBiYXNlIGRpcmVjdG9yeSAob3IgV0FSKSBmb3IgdGhpcyBDb250ZXh0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVTdGFuZGFyZENvbnRleHQoU3RyaW5nIHBhcmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRvY0Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB4bWxWYWxpZGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4geG1sTmFtZXNwYWNlQXdhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB0bGRWYWxpZGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdGxkTmFtZXNwYWNlQXdhcmUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBTdGFuZGFyZENvbnRleHQgaW5zdGFuY2UKKyAgICAgICAgU3RhbmRhcmRDb250ZXh0IGNvbnRleHQgPSBuZXcgU3RhbmRhcmRDb250ZXh0KCk7CisgICAgICAgIHBhdGggPSBnZXRQYXRoU3RyKHBhdGgpOworICAgICAgICBjb250ZXh0LnNldFBhdGgocGF0aCk7CisgICAgICAgIGNvbnRleHQuc2V0RG9jQmFzZShkb2NCYXNlKTsKKyAgICAgICAgY29udGV4dC5zZXRYbWxWYWxpZGF0aW9uKHhtbFZhbGlkYXRpb24pOworICAgICAgICBjb250ZXh0LnNldFhtbE5hbWVzcGFjZUF3YXJlKHhtbE5hbWVzcGFjZUF3YXJlKTsKKyAgICAgICAgY29udGV4dC5zZXRUbGRWYWxpZGF0aW9uKHRsZFZhbGlkYXRpb24pOworICAgICAgICBjb250ZXh0LnNldFRsZE5hbWVzcGFjZUF3YXJlKHRsZE5hbWVzcGFjZUF3YXJlKTsKKyAgICAgICAgCisgICAgICAgIENvbnRleHRDb25maWcgY29udGV4dENvbmZpZyA9IG5ldyBDb250ZXh0Q29uZmlnKCk7CisgICAgICAgIGNvbnRleHQuYWRkTGlmZWN5Y2xlTGlzdGVuZXIoY29udGV4dENvbmZpZyk7CisKKyAgICAgICAgLy8gQWRkIHRoZSBuZXcgaW5zdGFuY2UgdG8gaXRzIHBhcmVudCBjb21wb25lbnQKKyAgICAgICAgT2JqZWN0TmFtZSBwbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgIE9iamVjdE5hbWUgZGVwbG95ZXIgPSBuZXcgT2JqZWN0TmFtZShwbmFtZS5nZXREb21haW4oKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6dHlwZT1EZXBsb3llcixob3N0PSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpKTsKKyAgICAgICAgaWYobXNlcnZlci5pc1JlZ2lzdGVyZWQoZGVwbG95ZXIpKSB7CisgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSBjb250ZXh0LmdldFBhdGgoKTsKKyAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKGRlcGxveWVyLCAiYWRkU2VydmljZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdCBbXSB7Y29udGV4dFBhdGh9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyBbXSB7ImphdmEubGFuZy5TdHJpbmcifSk7CisgICAgICAgICAgICBTdHJpbmcgY29uZmlnUGF0aCA9IChTdHJpbmcpbXNlcnZlci5nZXRBdHRyaWJ1dGUoZGVwbG95ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZ0Jhc2VOYW1lIik7CisgICAgICAgICAgICBTdHJpbmcgYmFzZU5hbWUgPSBnZXRDb25maWdGaWxlKGNvbnRleHRQYXRoKTsKKyAgICAgICAgICAgIEZpbGUgY29uZmlnRmlsZSA9IG5ldyBGaWxlKG5ldyBGaWxlKGNvbmZpZ1BhdGgpLCBiYXNlTmFtZSsiLnhtbCIpOworICAgICAgICAgICAgY29udGV4dC5zZXRDb25maWdGaWxlKGNvbmZpZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZGVwbG95ZXIsICJtYW5hZ2VBcHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtjb250ZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Im9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dCJ9KTsKKyAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKGRlcGxveWVyLCAicmVtb3ZlU2VydmljZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdCBbXSB7Y29udGV4dFBhdGh9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyBbXSB7ImphdmEubGFuZy5TdHJpbmcifSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2cud2FybigiRGVwbG95ZXIgbm90IGZvdW5kIGZvciAiK3BuYW1lLmdldEtleVByb3BlcnR5KCJob3N0IikpOworICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShwbmFtZSk7CisgICAgICAgICAgICBFbmdpbmUgZW5naW5lID0gKEVuZ2luZSkgc2VydmljZS5nZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSBlbmdpbmUuZmluZENoaWxkKHBuYW1lLmdldEtleVByb3BlcnR5KCJob3N0IikpOworICAgICAgICAgICAgaG9zdC5hZGRDaGlsZChjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyBNQmVhbiBuYW1lCisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjb250ZXh0LmdldEpteE5hbWUoKTsKKworICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBTdGFuZGFyZEVuZ2luZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICogQHBhcmFtIGVuZ2luZU5hbWUgVW5pcXVlIG5hbWUgb2YgdGhpcyBFbmdpbmUKKyAgICAgKiBAcGFyYW0gZGVmYXVsdEhvc3QgRGVmYXVsdCBob3N0bmFtZSBvZiB0aGlzIEVuZ2luZQorICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBVbmlxdWUgbmFtZSBvZiB0aGlzIFNlcnZpY2UKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKworICAgIHB1YmxpYyBWZWN0b3IgY3JlYXRlU3RhbmRhcmRFbmdpbmVTZXJ2aWNlKFN0cmluZyBwYXJlbnQsIAorICAgICAgICAgICAgU3RyaW5nIGVuZ2luZU5hbWUsIFN0cmluZyBkZWZhdWx0SG9zdCwgU3RyaW5nIHNlcnZpY2VOYW1lKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU3RhbmRhcmRTZXJ2aWNlIGluc3RhbmNlCisgICAgICAgIFN0YW5kYXJkU2VydmljZSBzZXJ2aWNlID0gbmV3IFN0YW5kYXJkU2VydmljZSgpOworICAgICAgICBzZXJ2aWNlLnNldE5hbWUoc2VydmljZU5hbWUpOworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU3RhbmRhcmRFbmdpbmUgaW5zdGFuY2UKKyAgICAgICAgU3RhbmRhcmRFbmdpbmUgZW5naW5lID0gbmV3IFN0YW5kYXJkRW5naW5lKCk7CisgICAgICAgIGVuZ2luZS5zZXROYW1lKGVuZ2luZU5hbWUpOworICAgICAgICBlbmdpbmUuc2V0RGVmYXVsdEhvc3QoZGVmYXVsdEhvc3QpOworICAgICAgICAvLyBOZWVkIHRvIHNldCBlbmdpbmUgYmVmb3JlIGFkZGluZyBpdCB0byBzZXJ2ZXIgaW4gb3JkZXIgdG8gc2V0IGRvbWFpbgorICAgICAgICBzZXJ2aWNlLnNldENvbnRhaW5lcihlbmdpbmUpOworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBTZXJ2ZXIgc2VydmVyID0gU2VydmVyRmFjdG9yeS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgc2VydmVyLmFkZFNlcnZpY2Uoc2VydmljZSk7CisgICAgICAgIFZlY3RvciBvbmFtZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIC8vIEZJWE1FIHNlcnZpY2UgJiBlbmdpbmUuZ2V0T2JqZWN0TmFtZQorICAgICAgICAvL09iamVjdE5hbWUgb25hbWUgPSBlbmdpbmUuZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gCisgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUoZW5naW5lTmFtZSwgZW5naW5lKTsKKyAgICAgICAgb25hbWVzLmFkZCgwLCBvbmFtZSk7CisgICAgICAgIC8vb25hbWUgPSBzZXJ2aWNlLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgb25hbWUgPSAKKyAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShlbmdpbmVOYW1lLCBzZXJ2aWNlKTsKKyAgICAgICAgb25hbWVzLmFkZCgxLCBvbmFtZSk7CisgICAgICAgIHJldHVybiAob25hbWVzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IFN0YW5kYXJkSG9zdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICogQHBhcmFtIG5hbWUgVW5pcXVlIG5hbWUgb2YgdGhpcyBIb3N0CisgICAgICogQHBhcmFtIGFwcEJhc2UgQXBwbGljYXRpb24gYmFzZSBkaXJlY3RvcnkgbmFtZQorICAgICAqIEBwYXJhbSBhdXRvRGVwbG95IFNob3VsZCB3ZSBhdXRvIGRlcGxveT8KKyAgICAgKiBAcGFyYW0gZGVwbG95T25TdGFydHVwIERlcGxveSBvbiBzZXJ2ZXIgc3RhcnR1cD8KKyAgICAgKiBAcGFyYW0gZGVwbG95WE1MIFNob3VsZCB3ZSBkZXBsb3kgQ29udGV4dCBYTUwgY29uZmlnIGZpbGVzIHByb3BlcnR5PworICAgICAqIEBwYXJhbSB1bnBhY2tXQVJzIFNob3VsZCB3ZSB1bnBhY2sgV0FScyB3aGVuIGF1dG8gZGVwbG95aW5nPworICAgICAqIEBwYXJhbSB4bWxOYW1lc3BhY2VBd2FyZSBTaG91bGQgd2UgdHVybiBvbi9vZmYgWE1MIG5hbWVzcGFjZSBhd2FyZW5lc3M/CisgICAgICogQHBhcmFtIHhtbFZhbGlkYXRpb24gU2hvdWxkIHdlIHR1cm4gb24vb2ZmIFhNTCB2YWxpZGF0aW9uPyAgICAgICAgCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVTdGFuZGFyZEhvc3QoU3RyaW5nIHBhcmVudCwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwcEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvRGVwbG95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVwbG95T25TdGFydHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVwbG95WE1MLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdW5wYWNrV0FScywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHhtbE5hbWVzcGFjZUF3YXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4geG1sVmFsaWRhdGlvbikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFN0YW5kYXJkSG9zdCBpbnN0YW5jZQorICAgICAgICBTdGFuZGFyZEhvc3QgaG9zdCA9IG5ldyBTdGFuZGFyZEhvc3QoKTsKKyAgICAgICAgaG9zdC5zZXROYW1lKG5hbWUpOworICAgICAgICBob3N0LnNldEFwcEJhc2UoYXBwQmFzZSk7CisgICAgICAgIGhvc3Quc2V0QXV0b0RlcGxveShhdXRvRGVwbG95KTsKKyAgICAgICAgaG9zdC5zZXREZXBsb3lPblN0YXJ0dXAoZGVwbG95T25TdGFydHVwKTsKKyAgICAgICAgaG9zdC5zZXREZXBsb3lYTUwoZGVwbG95WE1MKTsKKyAgICAgICAgaG9zdC5zZXRVbnBhY2tXQVJzKHVucGFja1dBUnMpOworICAgICAgICBob3N0LnNldFhtbE5hbWVzcGFjZUF3YXJlKHhtbE5hbWVzcGFjZUF3YXJlKTsKKyAgICAgICAgaG9zdC5zZXRYbWxWYWxpZGF0aW9uKHhtbFZhbGlkYXRpb24pOworICAKKyAgICAgICAgLy8gYWRkIEhvc3RDb25maWcgZm9yIGFjdGl2ZSByZWxvYWRpbmcKKyAgICAgICAgSG9zdENvbmZpZyBob3N0Q29uZmlnID0gbmV3IEhvc3RDb25maWcoKTsKKyAgICAgICAgaG9zdC5hZGRMaWZlY3ljbGVMaXN0ZW5lcihob3N0Q29uZmlnKTsKKworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShwbmFtZSk7CisgICAgICAgIEVuZ2luZSBlbmdpbmUgPSAoRW5naW5lKSBzZXJ2aWNlLmdldENvbnRhaW5lcigpOworICAgICAgICBlbmdpbmUuYWRkQ2hpbGQoaG9zdCk7CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIE1CZWFuIG5hbWUKKyAgICAgICAgcmV0dXJuIChob3N0LmdldE9iamVjdE5hbWUoKS50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IFN0YW5kYXJkTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVTdGFuZGFyZE1hbmFnZXIoU3RyaW5nIHBhcmVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFN0YW5kYXJkTWFuYWdlciBpbnN0YW5jZQorICAgICAgICBTdGFuZGFyZE1hbmFnZXIgbWFuYWdlciA9IG5ldyBTdGFuZGFyZE1hbmFnZXIoKTsKKworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXJCYXNlID0gZ2V0UGFyZW50Q29udGFpbmVyRnJvbVBhcmVudChwbmFtZSk7CisgICAgICAgIGlmIChjb250YWluZXJCYXNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lckJhc2Uuc2V0TWFuYWdlcihtYW5hZ2VyKTsKKyAgICAgICAgfSAKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG1hbmFnZXIuZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICBpZiAob25hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IFN0YW5kYXJkU2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICogQHBhcmFtIG5hbWUgVW5pcXVlIG5hbWUgb2YgdGhpcyBTdGFuZGFyZFNlcnZpY2UKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVN0YW5kYXJkU2VydmljZShTdHJpbmcgcGFyZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRvbWFpbikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFN0YW5kYXJkU2VydmljZSBpbnN0YW5jZQorICAgICAgICBTdGFuZGFyZFNlcnZpY2Ugc2VydmljZSA9IG5ldyBTdGFuZGFyZFNlcnZpY2UoKTsKKyAgICAgICAgc2VydmljZS5zZXROYW1lKG5hbWUpOworCisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIFNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJGYWN0b3J5LmdldFNlcnZlcigpOworICAgICAgICBzZXJ2ZXIuYWRkU2VydmljZShzZXJ2aWNlKTsKKworICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICByZXR1cm4gKHNlcnZpY2UuZ2V0T2JqZWN0TmFtZSgpLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyAgVXNlckRhdGFiYXNlUmVhbG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IE1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudAorICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgR2xvYmFsIEpOREkgcmVzb3VyY2UgbmFtZSBvZiB0aGUgYXNzb2NpYXRlZAorICAgICAqICBVc2VyRGF0YWJhc2UKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVVzZXJEYXRhYmFzZVJlYWxtKFN0cmluZyBwYXJlbnQsIFN0cmluZyByZXNvdXJjZU5hbWUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgVXNlckRhdGFiYXNlUmVhbG0gaW5zdGFuY2UKKyAgICAgICAgVXNlckRhdGFiYXNlUmVhbG0gcmVhbG0gPSBuZXcgVXNlckRhdGFiYXNlUmVhbG0oKTsKKyAgICAgICAgcmVhbG0uc2V0UmVzb3VyY2VOYW1lKHJlc291cmNlTmFtZSk7CisgICAgICAgIAorICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXJCYXNlID0gZ2V0UGFyZW50Q29udGFpbmVyRnJvbVBhcmVudChwbmFtZSk7CisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIGNvbnRhaW5lckJhc2Uuc2V0UmVhbG0ocmVhbG0pOworICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gcmVhbG0uZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICAvLyBGSVhNRSBnZXRPYmplY3ROYW1lKCkgcmV0dXJucyBudWxsCisgICAgICAgIC8vT2JqZWN0TmFtZSBvbmFtZSA9IAorICAgICAgICAvLyAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUocG5hbWUuZ2V0RG9tYWluKCksIHJlYWxtKTsKKyAgICAgICAgaWYgKG9uYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAob25hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSAgIAorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgV2ViIEFwcGxpY2F0aW9uIExvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVXZWJhcHBMb2FkZXIoU3RyaW5nIHBhcmVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFdlYmFwcExvYWRlciBpbnN0YW5jZQorICAgICAgICBXZWJhcHBMb2FkZXIgbG9hZGVyID0gbmV3IFdlYmFwcExvYWRlcigpOworCisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIE9iamVjdE5hbWUgcG5hbWUgPSBuZXcgT2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICBDb250YWluZXJCYXNlIGNvbnRhaW5lckJhc2UgPSBnZXRQYXJlbnRDb250YWluZXJGcm9tUGFyZW50KHBuYW1lKTsKKyAgICAgICAgaWYgKGNvbnRhaW5lckJhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgY29udGFpbmVyQmFzZS5zZXRMb2FkZXIobG9hZGVyKTsKKyAgICAgICAgfSAKKyAgICAgICAgLy8gRklYTUUgYWRkIExvYWRlci5nZXRPYmplY3ROYW1lCisgICAgICAgIC8vT2JqZWN0TmFtZSBvbmFtZSA9IGxvYWRlci5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSAKKyAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShwbmFtZS5nZXREb21haW4oKSwgbG9hZGVyKTsKKyAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXhpc3RpbmcgQ29ubmVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTUJlYW4gTmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIHJlbW92ZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYSBjb21wb25lbnQgY2Fubm90IGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb25uZWN0b3IoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCB0byBiZSByZW1vdmVkCisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShuYW1lKTsKKyAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShvbmFtZSk7CisgICAgICAgIFN0cmluZyBwb3J0ID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoInBvcnQiKTsKKyAgICAgICAgLy9TdHJpbmcgYWRkcmVzcyA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJhZGRyZXNzIik7CisKKyAgICAgICAgQ29ubmVjdG9yIGNvbm5zW10gPSAoQ29ubmVjdG9yW10pIHNlcnZpY2UuZmluZENvbm5lY3RvcnMoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbm5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgY29ubkFkZHJlc3MgPSBTdHJpbmcudmFsdWVPZihjb25uc1tpXS5nZXRQcm9wZXJ0eSgiYWRkcmVzcyIpKTsKKyAgICAgICAgICAgIFN0cmluZyBjb25uUG9ydCA9ICIiK2Nvbm5zW2ldLmdldFBvcnQoKTsKKworICAgICAgICAgICAgLy8gaWYgKCgoYWRkcmVzcy5lcXVhbHMoIm51bGwiKSkgJiYKKyAgICAgICAgICAgIGlmICgoY29ubkFkZHJlc3M9PW51bGwpICYmIHBvcnQuZXF1YWxzKGNvbm5Qb3J0KSkgeworICAgICAgICAgICAgICAgIHNlcnZpY2UucmVtb3ZlQ29ubmVjdG9yKGNvbm5zW2ldKTsKKyAgICAgICAgICAgICAgICBjb25uc1tpXS5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB9IGVsc2UgaWYgKGFkZHJlc3MuZXF1YWxzKGNvbm5BZGRyZXNzKSkKKyAgICAgICAgICAgIGlmIChwb3J0LmVxdWFscyhjb25uUG9ydCkpIHsKKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyBjb21wb25lbnQgZnJvbSBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICAgICAgICAgIHNlcnZpY2UucmVtb3ZlQ29ubmVjdG9yKGNvbm5zW2ldKTsKKyAgICAgICAgICAgICAgICBjb25uc1tpXS5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIGV4aXN0aW5nIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dE5hbWUgTUJlYW4gTmFtZSBvZiB0aGUgY29tb25lbnQgdG8gcmVtb3ZlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhIGNvbXBvbmVudCBjYW5ub3QgYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvbnRleHQoU3RyaW5nIGNvbnRleHROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBjb21wb25lbnQgdG8gYmUgcmVtb3ZlZAorICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoY29udGV4dE5hbWUpOworICAgICAgICBTdHJpbmcgZG9tYWluID0gb25hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgIFN0YW5kYXJkU2VydmljZSBzZXJ2aWNlID0gKFN0YW5kYXJkU2VydmljZSkgZ2V0U2VydmljZShvbmFtZSk7CisKKyAgICAgICAgRW5naW5lIGVuZ2luZSA9IChFbmdpbmUpIHNlcnZpY2UuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIFN0cmluZyBuYW1lID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIpOworICAgICAgICBpbnQgaSA9IG5hbWUuaW5kZXhPZigiLyIpOworICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSBuYW1lLnN1YnN0cmluZygwLGkpOworICAgICAgICBTdHJpbmcgcGF0aCA9IG5hbWUuc3Vic3RyaW5nKGkpOworICAgICAgICBPYmplY3ROYW1lIGRlcGxveWVyID0gbmV3IE9iamVjdE5hbWUoZG9tYWluKyI6dHlwZT1EZXBsb3llcixob3N0PSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7CisgICAgICAgIFN0cmluZyBwYXRoU3RyID0gZ2V0UGF0aFN0cihwYXRoKTsKKyAgICAgICAgaWYobXNlcnZlci5pc1JlZ2lzdGVyZWQoZGVwbG95ZXIpKSB7CisgICAgICAgICAgICBtc2VydmVyLmludm9rZShkZXBsb3llciwiYWRkU2VydmljZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde3BhdGhTdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLlN0cmluZyJ9KTsKKyAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKGRlcGxveWVyLCJ1bm1hbmFnZUFwcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3BhdGhTdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLlN0cmluZyJ9KTsKKyAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKGRlcGxveWVyLCJyZW1vdmVTZXJ2aWNlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3BhdGhTdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLlN0cmluZyJ9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZy53YXJuKCJEZXBsb3llciBub3QgZm91bmQgZm9yICIraG9zdE5hbWUpOworICAgICAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpIGVuZ2luZS5maW5kQ2hpbGQoaG9zdE5hbWUpOworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGhvc3QuZmluZENoaWxkKHBhdGhTdHIpOworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgY29tcG9uZW50IGZyb20gaXRzIHBhcmVudCBjb21wb25lbnQKKyAgICAgICAgICAgIGhvc3QucmVtb3ZlQ2hpbGQoY29udGV4dCk7CisgICAgICAgICAgICBpZihjb250ZXh0IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKFN0YW5kYXJkQ29udGV4dCljb250ZXh0KS5kZXN0cm95KCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKCJFcnJvciBkdXJpbmcgY29udGV4dCBbIiArIGNvbnRleHQuZ2V0TmFtZSgpICsgIl0gZGVzdHJveSAiLCBlKTsKKyAgICAgICAgICAgfQorICAgCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIGV4aXN0aW5nIEhvc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBNQmVhbiBOYW1lIG9mIHRoZSBjb21vbmVudCB0byByZW1vdmUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGEgY29tcG9uZW50IGNhbm5vdCBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlSG9zdChTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50IHRvIGJlIHJlbW92ZWQKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG5hbWUpOworICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKG9uYW1lKTsKKyAgICAgICAgRW5naW5lIGVuZ2luZSA9IChFbmdpbmUpIHNlcnZpY2UuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSBlbmdpbmUuZmluZENoaWxkKGhvc3ROYW1lKTsKKworICAgICAgICAvLyBSZW1vdmUgdGhpcyBjb21wb25lbnQgZnJvbSBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBpZihob3N0IT1udWxsKSB7CisgICAgICAgICAgICBpZihob3N0IGluc3RhbmNlb2YgU3RhbmRhcmRIb3N0KQorICAgICAgICAgICAgICAgICgoU3RhbmRhcmRIb3N0KWhvc3QpLmRlc3Ryb3koKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlbmdpbmUucmVtb3ZlQ2hpbGQoaG9zdCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIGV4aXN0aW5nIExvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE1CZWFuIE5hbWUgb2YgdGhlIGNvbW9uZW50IHRvIHJlbW92ZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYSBjb21wb25lbnQgY2Fubm90IGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMb2FkZXIoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShuYW1lKTsKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50IHRvIGJlIHJlbW92ZWQKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXIgPSBnZXRQYXJlbnRDb250YWluZXJGcm9tQ2hpbGQob25hbWUpOyAgICAKKyAgICAgICAgY29udGFpbmVyLnNldExvYWRlcihudWxsKTsKKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXhpc3RpbmcgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE1CZWFuIE5hbWUgb2YgdGhlIGNvbW9uZW50IHRvIHJlbW92ZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYSBjb21wb25lbnQgY2Fubm90IGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNYW5hZ2VyKFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUobmFtZSk7CisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCB0byBiZSByZW1vdmVkCisgICAgICAgIENvbnRhaW5lckJhc2UgY29udGFpbmVyID0gZ2V0UGFyZW50Q29udGFpbmVyRnJvbUNoaWxkKG9uYW1lKTsgICAgCisgICAgICAgIGNvbnRhaW5lci5zZXRNYW5hZ2VyKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXhpc3RpbmcgUmVhbG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBNQmVhbiBOYW1lIG9mIHRoZSBjb21vbmVudCB0byByZW1vdmUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGEgY29tcG9uZW50IGNhbm5vdCBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUmVhbG0oU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShuYW1lKTsKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50IHRvIGJlIHJlbW92ZWQKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXIgPSBnZXRQYXJlbnRDb250YWluZXJGcm9tQ2hpbGQob25hbWUpOyAKKyAgICAgICAgY29udGFpbmVyLnNldFJlYWxtKG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIGV4aXN0aW5nIFNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBNQmVhbiBOYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gcmVtb3ZlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhIGNvbXBvbmVudCBjYW5ub3QgYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlcnZpY2UoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCB0byBiZSByZW1vdmVkCisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShuYW1lKTsKKyAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoInNlcnZpY2VOYW1lIik7CisgICAgICAgIFNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJGYWN0b3J5LmdldFNlcnZlcigpOworICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZmluZFNlcnZpY2Uoc2VydmljZU5hbWUpOworCisgICAgICAgIC8vIFJlbW92ZSB0aGlzIGNvbXBvbmVudCBmcm9tIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIHNlcnZlci5yZW1vdmVTZXJ2aWNlKHNlcnZpY2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXhpc3RpbmcgVmFsdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBNQmVhbiBOYW1lIG9mIHRoZSBjb21vbmVudCB0byByZW1vdmUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGEgY29tcG9uZW50IGNhbm5vdCBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVmFsdmUoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCB0byBiZSByZW1vdmVkCisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShuYW1lKTsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXIgPSBnZXRQYXJlbnRDb250YWluZXJGcm9tQ2hpbGQob25hbWUpOworICAgICAgICBWYWx2ZVtdIHZhbHZlcyA9IChWYWx2ZVtdKWNvbnRhaW5lci5nZXRWYWx2ZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx2ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgdm9uYW1lID0gKChWYWx2ZUJhc2UpIHZhbHZlc1tpXSkuZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICAgICAgaWYgKHZvbmFtZS5lcXVhbHMob25hbWUpKSB7CisgICAgICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZVZhbHZlKHZhbHZlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL01CZWFuVXRpbHMuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvTUJlYW5VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNDZmMDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL01CZWFuVXRpbHMuamF2YQpAQCAtMCwwICsxLDE4NDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zOworCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5tb2RlbG1iZWFuLk1vZGVsTUJlYW47CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Hcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Sb2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVudmlyb25tZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VMaW5rOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk5hbWluZ1Jlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5WYWx2ZUJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuTWFuYWdlZEJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5JbnRyb3NwZWN0aW9uVXRpbHM7CisKKworLyoqCisgKiBQdWJsaWMgdXRpbGl0eSBtZXRob2RzIGluIHN1cHBvcnQgb2YgdGhlIHNlcnZlciBzaWRlIE1CZWFucyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgTUJlYW5VdGlscyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1CZWFuVXRpbHMuY2xhc3MpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgZXhjZXB0aW9ucyB0byB0aGUgbm9ybWFsIHJ1bGVzIHVzZWQgYnkKKyAgICAgKiA8Y29kZT5jcmVhdGVNYW5hZ2VkQmVhbigpPC9jb2RlPi4gIFRoZSBmaXJzdCBlbGVtZW50IG9mIGVhY2ggcGFpcgorICAgICAqIGlzIGEgY2xhc3MgbmFtZSwgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUgbWFuYWdlZCBiZWFuIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbnNbXVtdID0geworICAgICAgICB7ICJvcmcuYXBhY2hlLmFqcC50b21jYXQ0LkFqcDEzQ29ubmVjdG9yIiwKKyAgICAgICAgICAiQWpwMTNDb25uZWN0b3IiIH0sCisgICAgICAgIHsgIm9yZy5hcGFjaGUuY295b3RlLnRvbWNhdDQuQWpwMTNDb25uZWN0b3IiLAorICAgICAgICAgICJDb3lvdGVDb25uZWN0b3IiIH0sCisgICAgICAgIHsgIm9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnMuSkRCQ0dyb3VwIiwKKyAgICAgICAgICAiR3JvdXAiIH0sCisgICAgICAgIHsgIm9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnMuSkRCQ1JvbGUiLAorICAgICAgICAgICJSb2xlIiB9LAorICAgICAgICB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLkpEQkNVc2VyIiwKKyAgICAgICAgICAiVXNlciIgfSwKKyAgICAgICAgeyAib3JnLmFwYWNoZS5jYXRhbGluYS51c2Vycy5NZW1vcnlHcm91cCIsCisgICAgICAgICAgIkdyb3VwIiB9LAorICAgICAgICB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLk1lbW9yeVJvbGUiLAorICAgICAgICAgICJSb2xlIiB9LAorICAgICAgICB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLk1lbW9yeVVzZXIiLAorICAgICAgICAgICJVc2VyIiB9LAorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHJlZ2lzdHJ5IGZvciBvdXIgbWFuYWdlZCBiZWFucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBSZWdpc3RyeSByZWdpc3RyeSA9IGNyZWF0ZVJlZ2lzdHJ5KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NQmVhblNlcnZlcjwvY29kZT4gZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IGNyZWF0ZVNlcnZlcigpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RhdGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSA8Y29kZT5NYW5hZ2VkQmVhbjwvY29kZT4gdGhhdAorICAgICAqIGNvcnJlc3BvbmRzIHRvIHRoaXMgQ2F0YWxpbmEgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbXBvbmVudCBUaGUgY29tcG9uZW50IGZvciB3aGljaCB0byBjcmVhdGUgYSBuYW1lCisgICAgICovCisgICAgc3RhdGljIFN0cmluZyBjcmVhdGVNYW5hZ2VkTmFtZShPYmplY3QgY29tcG9uZW50KSB7CisKKyAgICAgICAgLy8gRGVhbCB3aXRoIGV4Y2VwdGlvbnMgdG8gdGhlIHN0YW5kYXJkIHJ1bGUKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY2xhc3NOYW1lLmVxdWFscyhleGNlcHRpb25zW2ldWzBdKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoZXhjZXB0aW9uc1tpXVsxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIHRoZSBzdGFuZGFyZCB0cmFuc2Zvcm1hdGlvbgorICAgICAgICBpbnQgcGVyaW9kID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChwZXJpb2QgPj0gMCkKKyAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcocGVyaW9kICsgMSk7CisgICAgICAgIHJldHVybiAoY2xhc3NOYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPkNvbm5lY3RvcjwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3RvciBUaGUgQ29ubmVjdG9yIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgTW9kZWxNQmVhbiBjcmVhdGVNQmVhbihDb25uZWN0b3IgY29ubmVjdG9yKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShjb25uZWN0b3IpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKGNvbm5lY3Rvcik7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgY29ubmVjdG9yKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPkNvbnRleHQ8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0IHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgTW9kZWxNQmVhbiBjcmVhdGVNQmVhbihDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBtbmFtZSA9IGNyZWF0ZU1hbmFnZWROYW1lKGNvbnRleHQpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKGNvbnRleHQpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIGNvbnRleHQpOworICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIkFscmVhZHkgcmVnaXN0ZXJlZCAiICsgb25hbWUpOworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZSwgcmVnaXN0ZXIsIGFuZCByZXR1cm4gYW4gTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Db250ZXh0RW52aXJvbm1lbnQ8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnZpcm9ubWVudCBUaGUgQ29udGV4dEVudmlyb25tZW50IHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgTW9kZWxNQmVhbiBjcmVhdGVNQmVhbihDb250ZXh0RW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBtbmFtZSA9IGNyZWF0ZU1hbmFnZWROYW1lKGVudmlyb25tZW50KTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbigiTWFuYWdlZEJlYW4gaXMgbm90IGZvdW5kIHdpdGggIittbmFtZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBNb2RlbE1CZWFuIG1iZWFuID0gbWFuYWdlZC5jcmVhdGVNQmVhbihlbnZpcm9ubWVudCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgZW52aXJvbm1lbnQpOworICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQoIG9uYW1lICkpICB7CisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbXNlcnZlci5yZWdpc3Rlck1CZWFuKG1iZWFuLCBvbmFtZSk7CisgICAgICAgIHJldHVybiAobWJlYW4pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUsIHJlZ2lzdGVyLCBhbmQgcmV0dXJuIGFuIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+Q29udGV4dFJlc291cmNlPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIENvbnRleHRSZXNvdXJjZSB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIE1vZGVsTUJlYW4gY3JlYXRlTUJlYW4oQ29udGV4dFJlc291cmNlIHJlc291cmNlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShyZXNvdXJjZSk7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oIk1hbmFnZWRCZWFuIGlzIG5vdCBmb3VuZCB3aXRoICIrbW5hbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgTW9kZWxNQmVhbiBtYmVhbiA9IG1hbmFnZWQuY3JlYXRlTUJlYW4ocmVzb3VyY2UpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIHJlc291cmNlKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPkNvbnRleHRSZXNvdXJjZUxpbms8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUxpbmsgVGhlIENvbnRleHRSZXNvdXJjZUxpbmsgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyBNb2RlbE1CZWFuIGNyZWF0ZU1CZWFuKENvbnRleHRSZXNvdXJjZUxpbmsgcmVzb3VyY2VMaW5rKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShyZXNvdXJjZUxpbmspOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKHJlc291cmNlTGluayk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgcmVzb3VyY2VMaW5rKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0gICAgCisgCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPkVuZ2luZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGVuZ2luZSBUaGUgRW5naW5lIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgTW9kZWxNQmVhbiBjcmVhdGVNQmVhbihFbmdpbmUgZW5naW5lKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShlbmdpbmUpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKGVuZ2luZSk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgZW5naW5lKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPkdyb3VwPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXAgVGhlIEdyb3VwIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgTW9kZWxNQmVhbiBjcmVhdGVNQmVhbihHcm91cCBncm91cCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUoZ3JvdXApOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKGdyb3VwKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBncm91cCk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZCggb25hbWUgKSkgIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtc2VydmVyLnJlZ2lzdGVyTUJlYW4obWJlYW4sIG9uYW1lKTsKKyAgICAgICAgcmV0dXJuIChtYmVhbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSwgcmVnaXN0ZXIsIGFuZCByZXR1cm4gYW4gTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Ib3N0PC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaG9zdCBUaGUgSG9zdCB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIE1vZGVsTUJlYW4gY3JlYXRlTUJlYW4oSG9zdCBob3N0KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShob3N0KTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbigiTWFuYWdlZEJlYW4gaXMgbm90IGZvdW5kIHdpdGggIittbmFtZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBNb2RlbE1CZWFuIG1iZWFuID0gbWFuYWdlZC5jcmVhdGVNQmVhbihob3N0KTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBob3N0KTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPkxvYWRlcjwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGxvYWRlciBUaGUgTG9hZGVyIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgTW9kZWxNQmVhbiBjcmVhdGVNQmVhbihMb2FkZXIgbG9hZGVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShsb2FkZXIpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKGxvYWRlcik7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgbG9hZGVyKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgLy8gc2lkZSBlZmZlY3Q6IHN0b3AgaXQKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKCBvbmFtZSApOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSwgcmVnaXN0ZXIsIGFuZCByZXR1cm4gYW4gTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5NYW5hZ2VyPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgTWFuYWdlciB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIE1vZGVsTUJlYW4gY3JlYXRlTUJlYW4oTWFuYWdlciBtYW5hZ2VyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShtYW5hZ2VyKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbigiTWFuYWdlZEJlYW4gaXMgbm90IGZvdW5kIHdpdGggIittbmFtZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBNb2RlbE1CZWFuIG1iZWFuID0gbWFuYWdlZC5jcmVhdGVNQmVhbihtYW5hZ2VyKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBtYW5hZ2VyKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPk1CZWFuRmFjdG9yeTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIE1CZWFuRmFjdG9yeSB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIE1vZGVsTUJlYW4gY3JlYXRlTUJlYW4oTUJlYW5GYWN0b3J5IGZhY3RvcnkpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBtbmFtZSA9IGNyZWF0ZU1hbmFnZWROYW1lKGZhY3RvcnkpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKGZhY3RvcnkpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIGZhY3RvcnkpOworICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUgKSkgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPk5hbWluZ1Jlc291cmNlczwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIFRoZSBOYW1pbmdSZXNvdXJjZXMgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyBNb2RlbE1CZWFuIGNyZWF0ZU1CZWFuKE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUocmVzb3VyY2UpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKHJlc291cmNlKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCByZXNvdXJjZSk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZCggb25hbWUgKSkgIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtc2VydmVyLnJlZ2lzdGVyTUJlYW4obWJlYW4sIG9uYW1lKTsKKyAgICAgICAgcmV0dXJuIChtYmVhbik7CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUsIHJlZ2lzdGVyLCBhbmQgcmV0dXJuIGFuIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+UmVhbG08L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFsbSBUaGUgUmVhbG0gdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyBNb2RlbE1CZWFuIGNyZWF0ZU1CZWFuKFJlYWxtIHJlYWxtKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShyZWFsbSk7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oIk1hbmFnZWRCZWFuIGlzIG5vdCBmb3VuZCB3aXRoICIrbW5hbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgTW9kZWxNQmVhbiBtYmVhbiA9IG1hbmFnZWQuY3JlYXRlTUJlYW4ocmVhbG0pOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIHJlYWxtKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFRoZSBSb2xlIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgTW9kZWxNQmVhbiBjcmVhdGVNQmVhbihSb2xlIHJvbGUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBtbmFtZSA9IGNyZWF0ZU1hbmFnZWROYW1lKHJvbGUpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKHJvbGUpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIHJvbGUpOworICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQoIG9uYW1lICkpICB7CisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbXNlcnZlci5yZWdpc3Rlck1CZWFuKG1iZWFuLCBvbmFtZSk7CisgICAgICAgIHJldHVybiAobWJlYW4pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUsIHJlZ2lzdGVyLCBhbmQgcmV0dXJuIGFuIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+U2VydmVyPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmVyIFRoZSBTZXJ2ZXIgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyBNb2RlbE1CZWFuIGNyZWF0ZU1CZWFuKFNlcnZlciBzZXJ2ZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBtbmFtZSA9IGNyZWF0ZU1hbmFnZWROYW1lKHNlcnZlcik7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oIk1hbmFnZWRCZWFuIGlzIG5vdCBmb3VuZCB3aXRoICIrbW5hbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgTW9kZWxNQmVhbiBtYmVhbiA9IG1hbmFnZWQuY3JlYXRlTUJlYW4oc2VydmVyKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBzZXJ2ZXIpOworICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQoIG9uYW1lICkpICB7CisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbXNlcnZlci5yZWdpc3Rlck1CZWFuKG1iZWFuLCBvbmFtZSk7CisgICAgICAgIHJldHVybiAobWJlYW4pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUsIHJlZ2lzdGVyLCBhbmQgcmV0dXJuIGFuIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+U2VydmljZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIFNlcnZpY2UgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyBNb2RlbE1CZWFuIGNyZWF0ZU1CZWFuKFNlcnZpY2Ugc2VydmljZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUoc2VydmljZSk7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oIk1hbmFnZWRCZWFuIGlzIG5vdCBmb3VuZCB3aXRoICIrbW5hbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgTW9kZWxNQmVhbiBtYmVhbiA9IG1hbmFnZWQuY3JlYXRlTUJlYW4oc2VydmljZSk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgc2VydmljZSk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZCggb25hbWUgKSkgIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtc2VydmVyLnJlZ2lzdGVyTUJlYW4obWJlYW4sIG9uYW1lKTsKKyAgICAgICAgcmV0dXJuIChtYmVhbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSwgcmVnaXN0ZXIsIGFuZCByZXR1cm4gYW4gTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Vc2VyPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlciBUaGUgVXNlciB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIE1vZGVsTUJlYW4gY3JlYXRlTUJlYW4oVXNlciB1c2VyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZSh1c2VyKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbigiTWFuYWdlZEJlYW4gaXMgbm90IGZvdW5kIHdpdGggIittbmFtZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBNb2RlbE1CZWFuIG1iZWFuID0gbWFuYWdlZC5jcmVhdGVNQmVhbih1c2VyKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCB1c2VyKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPlVzZXJEYXRhYmFzZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJEYXRhYmFzZSBUaGUgVXNlckRhdGFiYXNlIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgTW9kZWxNQmVhbiBjcmVhdGVNQmVhbihVc2VyRGF0YWJhc2UgdXNlckRhdGFiYXNlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZSh1c2VyRGF0YWJhc2UpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKHVzZXJEYXRhYmFzZSk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgdXNlckRhdGFiYXNlKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPlZhbHZlPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdmUgVGhlIFZhbHZlIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgTW9kZWxNQmVhbiBjcmVhdGVNQmVhbihWYWx2ZSB2YWx2ZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUodmFsdmUpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKHZhbHZlKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCB2YWx2ZSk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZCggb25hbWUgKSkgIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtc2VydmVyLnJlZ2lzdGVyTUJlYW4obWJlYW4sIG9uYW1lKTsKKyAgICAgICAgcmV0dXJuIChtYmVhbik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+T2JqZWN0TmFtZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Db25uZWN0b3I8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIGNvbm5lY3RvciBUaGUgQ29ubmVjdG9yIHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgc3RhdGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3RvciBjb25uZWN0b3IpCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBudWxsOworICAgICAgICBpZiAoY29ubmVjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpLmluZGV4T2YoIkNveW90ZUNvbm5lY3RvciIpID49IDAgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgSW50cm9zcGVjdGlvblV0aWxzLmdldFByb3BlcnR5KGNvbm5lY3RvciwgImFkZHJlc3MiKTsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyIHBvcnQgPSAoSW50ZWdlcikKKyAgICAgICAgICAgICAgICAgICAgSW50cm9zcGVjdGlvblV0aWxzLmdldFByb3BlcnR5KGNvbm5lY3RvciwgInBvcnQiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGRvbWFpbik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI6dHlwZT1Db25uZWN0b3IiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIixwb3J0PSIgKyBwb3J0KTsKKyAgICAgICAgICAgICAgICBpZiAoKGFkZHJlc3MgIT0gbnVsbCkgJiYgKGFkZHJlc3MubGVuZ3RoKCk+MCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsYWRkcmVzcz0iICsgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG5hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBjcmVhdGUgb2JqZWN0IG5hbWUgZm9yICIgKyBjb25uZWN0b3IrZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBvYmplY3QgbmFtZSBmb3IgIiArIGNvbm5lY3Rvcik7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIDxjb2RlPk9iamVjdE5hbWU8L2NvZGU+IGZvciB0aGlzCisgICAgICogPGNvZGU+Q29udGV4dDwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRvbWFpbiBEb21haW4gaW4gd2hpY2ggdGhpcyBuYW1lIGlzIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0byBiZSBuYW1lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGlmIGEgbmFtZSBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAqLworICAgIHN0YXRpYyBPYmplY3ROYW1lIGNyZWF0ZU9iamVjdE5hbWUoU3RyaW5nIGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBudWxsOworICAgICAgICBIb3N0IGhvc3QgPSAoSG9zdCljb250ZXh0LmdldFBhcmVudCgpOworICAgICAgICBTdHJpbmcgcGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpOworICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICBwYXRoID0gIi8iOworICAgICAgICAvLyBGSVhNRSAKKyAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6ajJlZVR5cGU9V2ViTW9kdWxlLG5hbWU9Ly8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QuZ2V0TmFtZSgpKyBwYXRoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsSjJFRUFwcGxpY2F0aW9uPW5vbmUsSjJFRVNlcnZlcj1ub25lIik7CisgICAgCisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+T2JqZWN0TmFtZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZG9tYWluIERvbWFpbiBpbiB3aGljaCB0aGlzIG5hbWUgaXMgdG8gYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSBlbnZpcm9ubWVudCBUaGUgQ29udGV4dEVudmlyb25tZW50IHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3ROYW1lIGNyZWF0ZU9iamVjdE5hbWUoU3RyaW5nIGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0RW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBudWxsOworICAgICAgICBPYmplY3QgY29udGFpbmVyID0gCisgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQuZ2V0TmFtaW5nUmVzb3VyY2VzKCkuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBTZXJ2ZXIpIHsKKyAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9RW52aXJvbm1lbnQiICsgCisgICAgICAgICAgICAgICAgICAgICAgICAiLHJlc291cmNldHlwZT1HbG9iYWwsbmFtZT0iICsgZW52aXJvbm1lbnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSB7ICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gKChDb250ZXh0KWNvbnRhaW5lcikuZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgICAgICBIb3N0IGhvc3QgPSAoSG9zdCkgKChDb250ZXh0KWNvbnRhaW5lcikuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPUVudmlyb25tZW50IiArIAorICAgICAgICAgICAgICAgICAgICAgICAgIixyZXNvdXJjZXR5cGU9Q29udGV4dCxwYXRoPSIgKyBwYXRoICsgCisgICAgICAgICAgICAgICAgICAgICAgICAiLGhvc3Q9IiArIGhvc3QuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIsbmFtZT0iICsgZW52aXJvbm1lbnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIDxjb2RlPk9iamVjdE5hbWU8L2NvZGU+IGZvciB0aGlzCisgICAgICogPGNvZGU+Q29udGV4dFJlc291cmNlPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZG9tYWluIERvbWFpbiBpbiB3aGljaCB0aGlzIG5hbWUgaXMgdG8gYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgQ29udGV4dFJlc291cmNlIHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3ROYW1lIGNyZWF0ZU9iamVjdE5hbWUoU3RyaW5nIGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0UmVzb3VyY2UgcmVzb3VyY2UpCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgcXVvdGVkUmVzb3VyY2VOYW1lID0gT2JqZWN0TmFtZS5xdW90ZShyZXNvdXJjZS5nZXROYW1lKCkpOworICAgICAgICBPYmplY3QgY29udGFpbmVyID0gCisgICAgICAgICAgICAgICAgcmVzb3VyY2UuZ2V0TmFtaW5nUmVzb3VyY2VzKCkuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBTZXJ2ZXIpIHsgICAgICAgIAorICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1SZXNvdXJjZSIgKworICAgICAgICAgICAgICAgICAgICAgICAgIixyZXNvdXJjZXR5cGU9R2xvYmFsLGNsYXNzPSIgKyByZXNvdXJjZS5nZXRUeXBlKCkgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIsbmFtZT0iICsgcXVvdGVkUmVzb3VyY2VOYW1lKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSB7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gKChDb250ZXh0KWNvbnRhaW5lcikuZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgICAgICBIb3N0IGhvc3QgPSAoSG9zdCkgKChDb250ZXh0KWNvbnRhaW5lcikuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPVJlc291cmNlIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiLHJlc291cmNldHlwZT1Db250ZXh0LHBhdGg9IiArIHBhdGggKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIsaG9zdD0iICsgaG9zdC5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIixjbGFzcz0iICsgcmVzb3VyY2UuZ2V0VHlwZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIsbmFtZT0iICsgcXVvdGVkUmVzb3VyY2VOYW1lKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKyAgCisgICAgCisgICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiA8Y29kZT5PYmplY3ROYW1lPC9jb2RlPiBmb3IgdGhpcworICAgICAqIDxjb2RlPkNvbnRleHRSZXNvdXJjZUxpbms8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIHJlc291cmNlTGluayBUaGUgQ29udGV4dFJlc291cmNlTGluayB0byBiZSBuYW1lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGlmIGEgbmFtZSBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0TmFtZSBjcmVhdGVPYmplY3ROYW1lKFN0cmluZyBkb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dFJlc291cmNlTGluayByZXNvdXJjZUxpbmspCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgcXVvdGVkUmVzb3VyY2VMaW5rTmFtZQorICAgICAgICAgICAgICAgID0gT2JqZWN0TmFtZS5xdW90ZShyZXNvdXJjZUxpbmsuZ2V0TmFtZSgpKTsgICAgICAgIAorICAgICAgICBPYmplY3QgY29udGFpbmVyID0gCisgICAgICAgICAgICAgICAgcmVzb3VyY2VMaW5rLmdldE5hbWluZ1Jlc291cmNlcygpLmdldENvbnRhaW5lcigpOworICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU2VydmVyKSB7ICAgICAgICAKKyAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9UmVzb3VyY2VMaW5rIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiLHJlc291cmNldHlwZT1HbG9iYWwiICsgCisgICAgICAgICAgICAgICAgICAgICAgICAiLG5hbWU9IiArIHF1b3RlZFJlc291cmNlTGlua05hbWUpOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpIHsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAoKENvbnRleHQpY29udGFpbmVyKS5nZXRQYXRoKCk7CisgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICAgICAgcGF0aCA9ICIvIjsKKyAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSAoKENvbnRleHQpY29udGFpbmVyKS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9UmVzb3VyY2VMaW5rIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiLHJlc291cmNldHlwZT1Db250ZXh0LHBhdGg9IiArIHBhdGggKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIsaG9zdD0iICsgaG9zdC5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIixuYW1lPSIgKyBxdW90ZWRSZXNvdXJjZUxpbmtOYW1lKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKyAgICAKKyAgICAKKyAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+T2JqZWN0TmFtZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5FbmdpbmU8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIGVuZ2luZSBUaGUgRW5naW5lIHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgc3RhdGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZ2luZSBlbmdpbmUpCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBudWxsOworICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPUVuZ2luZSIpOworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+T2JqZWN0TmFtZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Hcm91cDwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRvbWFpbiBEb21haW4gaW4gd2hpY2ggdGhpcyBuYW1lIGlzIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gZ3JvdXAgVGhlIEdyb3VwIHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgc3RhdGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwIGdyb3VwKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBuYW1lID0gbnVsbDsKKyAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1Hcm91cCxncm91cG5hbWU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lLnF1b3RlKGdyb3VwLmdldEdyb3VwbmFtZSgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLGRhdGFiYXNlPSIgKyBncm91cC5nZXRVc2VyRGF0YWJhc2UoKS5nZXRJZCgpKTsKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIDxjb2RlPk9iamVjdE5hbWU8L2NvZGU+IGZvciB0aGlzCisgICAgICogPGNvZGU+SG9zdDwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRvbWFpbiBEb21haW4gaW4gd2hpY2ggdGhpcyBuYW1lIGlzIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gaG9zdCBUaGUgSG9zdCB0byBiZSBuYW1lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGlmIGEgbmFtZSBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAqLworICAgIHN0YXRpYyBPYmplY3ROYW1lIGNyZWF0ZU9iamVjdE5hbWUoU3RyaW5nIGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb3N0IGhvc3QpCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBudWxsOworICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPUhvc3QsaG9zdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QuZ2V0TmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIDxjb2RlPk9iamVjdE5hbWU8L2NvZGU+IGZvciB0aGlzCisgICAgICogPGNvZGU+TG9hZGVyPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZG9tYWluIERvbWFpbiBpbiB3aGljaCB0aGlzIG5hbWUgaXMgdG8gYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSBsb2FkZXIgVGhlIExvYWRlciB0byBiZSBuYW1lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGlmIGEgbmFtZSBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAqLworICAgIHN0YXRpYyBPYmplY3ROYW1lIGNyZWF0ZU9iamVjdE5hbWUoU3RyaW5nIGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkZXIgbG9hZGVyKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBuYW1lID0gbnVsbDsKKyAgICAgICAgQ29udGFpbmVyIGNvbnRhaW5lciA9IGxvYWRlci5nZXRDb250YWluZXIoKTsKKworICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRW5naW5lKSB7CisgICAgICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPUxvYWRlciIpOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEhvc3QpIHsKKyAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9TG9hZGVyLGhvc3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9ICgoQ29udGV4dCljb250YWluZXIpLmdldFBhdGgoKTsKKyAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCgpIDwgMSkgeworICAgICAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBIb3N0IGhvc3QgPSAoSG9zdCkgY29udGFpbmVyLmdldFBhcmVudCgpOworICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1Mb2FkZXIscGF0aD0iICsgcGF0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLGhvc3Q9IiArIGhvc3QuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiA8Y29kZT5PYmplY3ROYW1lPC9jb2RlPiBmb3IgdGhpcworICAgICAqIDxjb2RlPk1hbmFnZXI8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIE1hbmFnZXIgdG8gYmUgbmFtZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBpZiBhIG5hbWUgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgT2JqZWN0TmFtZSBjcmVhdGVPYmplY3ROYW1lKFN0cmluZyBkb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFuYWdlciBtYW5hZ2VyKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBuYW1lID0gbnVsbDsKKyAgICAgICAgQ29udGFpbmVyIGNvbnRhaW5lciA9IG1hbmFnZXIuZ2V0Q29udGFpbmVyKCk7CisKKyAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEVuZ2luZSkgeworICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1NYW5hZ2VyIik7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSG9zdCkgeworICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1NYW5hZ2VyLGhvc3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9ICgoQ29udGV4dCljb250YWluZXIpLmdldFBhdGgoKTsKKyAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCgpIDwgMSkgeworICAgICAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBIb3N0IGhvc3QgPSAoSG9zdCkgY29udGFpbmVyLmdldFBhcmVudCgpOworICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1NYW5hZ2VyLHBhdGg9IiArIHBhdGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixob3N0PSIgKyBob3N0LmdldE5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiA8Y29kZT5PYmplY3ROYW1lPC9jb2RlPiBmb3IgdGhpcworICAgICAqIDxjb2RlPlNlcnZlcjwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRvbWFpbiBEb21haW4gaW4gd2hpY2ggdGhpcyBuYW1lIGlzIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSBOYW1pbmdSZXNvdXJjZXMgdG8gYmUgbmFtZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBpZiBhIG5hbWUgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgT2JqZWN0TmFtZSBjcmVhdGVPYmplY3ROYW1lKFN0cmluZyBkb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nUmVzb3VyY2VzIHJlc291cmNlcykKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBjb250YWluZXIgPSByZXNvdXJjZXMuZ2V0Q29udGFpbmVyKCk7ICAgICAgICAKKyAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFNlcnZlcikgeyAgICAgICAgCisgICAgICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPU5hbWluZ1Jlc291cmNlcyIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIscmVzb3VyY2V0eXBlPUdsb2JhbCIpOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpIHsgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAoKENvbnRleHQpY29udGFpbmVyKS5nZXRQYXRoKCk7CisgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICAgICAgcGF0aCA9ICIvIjsKKyAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSAoKENvbnRleHQpY29udGFpbmVyKS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9TmFtaW5nUmVzb3VyY2VzIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgIixyZXNvdXJjZXR5cGU9Q29udGV4dCxwYXRoPSIgKyBwYXRoICsgCisgICAgICAgICAgICAgICAgICAgICAgICAiLGhvc3Q9IiArIGhvc3QuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIDxjb2RlPk9iamVjdE5hbWU8L2NvZGU+IGZvciB0aGlzCisgICAgICogPGNvZGU+TUJlYW5GYWN0b3J5PC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZG9tYWluIERvbWFpbiBpbiB3aGljaCB0aGlzIG5hbWUgaXMgdG8gYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBNQmVhbkZhY3RvcnkgdG8gYmUgbmFtZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBpZiBhIG5hbWUgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgT2JqZWN0TmFtZSBjcmVhdGVPYmplY3ROYW1lKFN0cmluZyBkb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJlYW5GYWN0b3J5IGZhY3RvcnkpCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9TUJlYW5GYWN0b3J5Iik7CisKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiA8Y29kZT5PYmplY3ROYW1lPC9jb2RlPiBmb3IgdGhpcworICAgICAqIDxjb2RlPlJlYWxtPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZG9tYWluIERvbWFpbiBpbiB3aGljaCB0aGlzIG5hbWUgaXMgdG8gYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSByZWFsbSBUaGUgUmVhbG0gdG8gYmUgbmFtZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBpZiBhIG5hbWUgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgT2JqZWN0TmFtZSBjcmVhdGVPYmplY3ROYW1lKFN0cmluZyBkb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbG0gcmVhbG0pCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBudWxsOworICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gcmVhbG0uZ2V0Q29udGFpbmVyKCk7CisKKyAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEVuZ2luZSkgeworICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1SZWFsbSIpOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEhvc3QpIHsKKyAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9UmVhbG0saG9zdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXROYW1lKCkpOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gKChDb250ZXh0KWNvbnRhaW5lcikuZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPCAxKSB7CisgICAgICAgICAgICAgICAgcGF0aCA9ICIvIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSBjb250YWluZXIuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPVJlYWxtLHBhdGg9IiArIHBhdGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixob3N0PSIgKyBob3N0LmdldE5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+T2JqZWN0TmFtZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZG9tYWluIERvbWFpbiBpbiB3aGljaCB0aGlzIG5hbWUgaXMgdG8gYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSByb2xlIFRoZSBSb2xlIHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgc3RhdGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvbGUgcm9sZSkKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IG51bGw7CisgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9Um9sZSxyb2xlbmFtZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUuZ2V0Um9sZW5hbWUoKSArICIsZGF0YWJhc2U9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlLmdldFVzZXJEYXRhYmFzZSgpLmdldElkKCkpOworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+T2JqZWN0TmFtZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5TZXJ2ZXI8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIHNlcnZlciBUaGUgU2VydmVyIHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgc3RhdGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlciBzZXJ2ZXIpCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBudWxsOworICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPVNlcnZlciIpOworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+T2JqZWN0TmFtZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZG9tYWluIERvbWFpbiBpbiB3aGljaCB0aGlzIG5hbWUgaXMgdG8gYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBTZXJ2aWNlIHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgc3RhdGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSkKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IG51bGw7CisgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9U2VydmljZSxzZXJ2aWNlTmFtZT0iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5nZXROYW1lKCkpOworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+T2JqZWN0TmFtZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Vc2VyPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZG9tYWluIERvbWFpbiBpbiB3aGljaCB0aGlzIG5hbWUgaXMgdG8gYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSB1c2VyIFRoZSBVc2VyIHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgc3RhdGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgdXNlcikKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IG51bGw7CisgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9VXNlcix1c2VybmFtZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUucXVvdGUodXNlci5nZXRVc2VybmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLGRhdGFiYXNlPSIgKyB1c2VyLmdldFVzZXJEYXRhYmFzZSgpLmdldElkKCkpOworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+T2JqZWN0TmFtZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Vc2VyRGF0YWJhc2U8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIHVzZXJEYXRhYmFzZSBUaGUgVXNlckRhdGFiYXNlIHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgc3RhdGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhYmFzZSB1c2VyRGF0YWJhc2UpCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBudWxsOworICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPVVzZXJEYXRhYmFzZSxkYXRhYmFzZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhYmFzZS5nZXRJZCgpKTsKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIDxjb2RlPk9iamVjdE5hbWU8L2NvZGU+IGZvciB0aGlzCisgICAgICogPGNvZGU+VmFsdmU8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIHZhbHZlIFRoZSBWYWx2ZSB0byBiZSBuYW1lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGlmIGEgbmFtZSBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAqLworICAgIHN0YXRpYyBPYmplY3ROYW1lIGNyZWF0ZU9iamVjdE5hbWUoU3RyaW5nIGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHZlIHZhbHZlKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmKCB2YWx2ZSBpbnN0YW5jZW9mIFZhbHZlQmFzZSApIHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgbmFtZT0oKFZhbHZlQmFzZSl2YWx2ZSkuZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICAgICAgaWYoIG5hbWUgIT0gbnVsbCApCisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBudWxsOworICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZT12YWx2ZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgaW50IHBlcmlvZCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICBpZiAocGVyaW9kID49IDApCisgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKHBlcmlvZCArIDEpOworICAgICAgICBpZiggdmFsdmUgaW5zdGFuY2VvZiBDb250YWluZWQgKSB7CisgICAgICAgICAgICBjb250YWluZXIgPSAoKENvbnRhaW5lZCl2YWx2ZSkuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGNvbnRhaW5lciA9PSBudWxsICkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgbWJlYW4gZm9yIG5vbi1jb250YWluZWQgdmFsdmUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdmUpOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEVuZ2luZSkgeworICAgICAgICAgICAgU3RyaW5nIGxvY2FsPSIiOworICAgICAgICAgICAgaW50IHNlcSA9IGdldFNlcShsb2NhbCk7CisgICAgICAgICAgICBTdHJpbmcgZXh0PSIiOworICAgICAgICAgICAgaWYoIHNlcSA+IDAgKSB7CisgICAgICAgICAgICAgICAgZXh0PSIsc2VxPSIgKyBzZXE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPVZhbHZlLG5hbWU9IiArIGNsYXNzTmFtZSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ICsgbG9jYWwgKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBIb3N0KSB7CisgICAgICAgICAgICBTdHJpbmcgbG9jYWw9Iixob3N0PSIgK2NvbnRhaW5lci5nZXROYW1lKCk7CisgICAgICAgICAgICBpbnQgc2VxID0gZ2V0U2VxKGxvY2FsKTsKKyAgICAgICAgICAgIFN0cmluZyBleHQ9IiI7CisgICAgICAgICAgICBpZiggc2VxID4gMCApIHsKKyAgICAgICAgICAgICAgICBleHQ9IixzZXE9IiArIHNlcTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9VmFsdmUsbmFtZT0iICsgY2xhc3NOYW1lICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQgKyBsb2NhbCApOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gKChDb250ZXh0KWNvbnRhaW5lcikuZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPCAxKSB7CisgICAgICAgICAgICAgICAgcGF0aCA9ICIvIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSBjb250YWluZXIuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgbG9jYWw9IixwYXRoPSIgKyBwYXRoICsgIixob3N0PSIgKworICAgICAgICAgICAgICAgICAgICBob3N0LmdldE5hbWUoKTsKKyAgICAgICAgICAgIGludCBzZXEgPSBnZXRTZXEobG9jYWwpOworICAgICAgICAgICAgU3RyaW5nIGV4dD0iIjsKKyAgICAgICAgICAgIGlmKCBzZXEgPiAwICkgeworICAgICAgICAgICAgICAgIGV4dD0iLHNlcT0iICsgc2VxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1WYWx2ZSxuYW1lPSIgKyBjbGFzc05hbWUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dCArIGxvY2FsICk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisgICAgc3RhdGljIEhhc2h0YWJsZSBzZXE9bmV3IEhhc2h0YWJsZSgpOworICAgIHN0YXRpYyBpbnQgZ2V0U2VxKCBTdHJpbmcga2V5ICkgeworICAgICAgICBpbnQgaVtdPShpbnQgW10pc2VxLmdldCgga2V5ICk7CisgICAgICAgIGlmIChpID09IG51bGwgKSB7CisgICAgICAgICAgICBpPW5ldyBpbnRbMV07CisgICAgICAgICAgICBpWzBdPTA7CisgICAgICAgICAgICBzZXEucHV0KCBrZXksIGkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaVswXSsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpWzBdOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgY29uZmlndXJlIChpZiBuZWNlc3NhcnkpIGFuZCByZXR1cm4gdGhlIHJlZ2lzdHJ5IG9mCisgICAgICogbWFuYWdlZCBvYmplY3QgZGVzY3JpcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFJlZ2lzdHJ5IGNyZWF0ZVJlZ2lzdHJ5KCkgeworCisgICAgICAgIGlmIChyZWdpc3RyeSA9PSBudWxsKSB7CisgICAgICAgICAgICByZWdpc3RyeSA9IFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpOworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2w9U2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKworICAgICAgICAgICAgcmVnaXN0cnkubG9hZERlc2NyaXB0b3JzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucyIsICBjbCk7CisgICAgICAgICAgICByZWdpc3RyeS5sb2FkRGVzY3JpcHRvcnMoIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvciIsIGNsKTsKKyAgICAgICAgICAgIHJlZ2lzdHJ5LmxvYWREZXNjcmlwdG9ycygib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlIiwgY2wpOworICAgICAgICAgICAgcmVnaXN0cnkubG9hZERlc2NyaXB0b3JzKCJvcmcuYXBhY2hlLmNhdGFsaW5hIiwgY2wpOworICAgICAgICAgICAgcmVnaXN0cnkubG9hZERlc2NyaXB0b3JzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveSIsIGNsKTsKKyAgICAgICAgICAgIHJlZ2lzdHJ5LmxvYWREZXNjcmlwdG9ycygib3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIiLCBjbCk7CisgICAgICAgICAgICByZWdpc3RyeS5sb2FkRGVzY3JpcHRvcnMoIm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0iLCBjbCk7CisgICAgICAgICAgICByZWdpc3RyeS5sb2FkRGVzY3JpcHRvcnMoIm9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbiIsIGNsKTsKKyAgICAgICAgICAgIHJlZ2lzdHJ5LmxvYWREZXNjcmlwdG9ycygib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwIiwgY2wpOworICAgICAgICAgICAgcmVnaXN0cnkubG9hZERlc2NyaXB0b3JzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzIiwgY2wpOworICAgICAgICAgICAgcmVnaXN0cnkubG9hZERlc2NyaXB0b3JzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIiLCBjbCk7CisgICAgICAgICAgICByZWdpc3RyeS5sb2FkRGVzY3JpcHRvcnMoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yIiwgY2wpOworICAgICAgICAgICAgcmVnaXN0cnkubG9hZERlc2NyaXB0b3JzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcyIsICBjbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChyZWdpc3RyeSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgY29uZmlndXJlIChpZiBuZWNlc3NhcnkpIGFuZCByZXR1cm4gdGhlCisgICAgICogPGNvZGU+TUJlYW5TZXJ2ZXI8L2NvZGU+IHdpdGggd2hpY2ggd2Ugd2lsbCBiZQorICAgICAqIHJlZ2lzdGVyaW5nIG91ciA8Y29kZT5Nb2RlbE1CZWFuPC9jb2RlPiBpbXBsZW1lbnRhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgTUJlYW5TZXJ2ZXIgY3JlYXRlU2VydmVyKCkgeworCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbXNlcnZlciA9IFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLmdldE1CZWFuU2VydmVyKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAobXNlcnZlcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+Q29ubmVjdG9yPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdG9yIFRoZSBDb25uZWN0b3IgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGRlcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lNQmVhbihDb25uZWN0b3IgY29ubmVjdG9yLCBTZXJ2aWNlIHNlcnZpY2UpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGNvbm5lY3Rvci5zZXRTZXJ2aWNlKHNlcnZpY2UpOworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShjb25uZWN0b3IpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBjb25uZWN0b3IpOworICAgICAgICBjb25uZWN0b3Iuc2V0U2VydmljZShudWxsKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPkNvbnRleHQ8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0IHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95TUJlYW4oQ29udGV4dCBjb250ZXh0KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShjb250ZXh0KTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgY29udGV4dCk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkgKQorICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworCisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogRGVyZWdpc3RlciB0aGUgTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Db250ZXh0RW52aXJvbm1lbnQ8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnZpcm9ubWVudCBUaGUgQ29udGV4dEVudmlyb25tZW50IHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95TUJlYW4oQ29udGV4dEVudmlyb25tZW50IGVudmlyb25tZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShlbnZpcm9ubWVudCk7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIGVudmlyb25tZW50KTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lKSApCisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogRGVyZWdpc3RlciB0aGUgTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Db250ZXh0UmVzb3VyY2U8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgQ29udGV4dFJlc291cmNlIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95TUJlYW4oQ29udGV4dFJlc291cmNlIHJlc291cmNlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShyZXNvdXJjZSk7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIHJlc291cmNlKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lICkpCisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisKKyAgICB9CisgICAgIAorICAgIAorICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+Q29udGV4dFJlc291cmNlTGluazwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlTGluayBUaGUgQ29udGV4dFJlc291cmNlTGluayB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgZGVyZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZGVzdHJveU1CZWFuKENvbnRleHRSZXNvdXJjZUxpbmsgcmVzb3VyY2VMaW5rKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShyZXNvdXJjZUxpbmspOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCByZXNvdXJjZUxpbmspOworICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpICkKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKworICAgIH0gICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPkVuZ2luZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGVuZ2luZSBUaGUgRW5naW5lIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95TUJlYW4oRW5naW5lIGVuZ2luZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUoZW5naW5lKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgZW5naW5lKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lKSApCisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cCBUaGUgR3JvdXAgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGRlcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lNQmVhbihHcm91cCBncm91cCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUoZ3JvdXApOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBncm91cCk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkgKQorICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPkhvc3Q8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBob3N0IFRoZSBIb3N0IHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95TUJlYW4oSG9zdCBob3N0KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShob3N0KTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgaG9zdCk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkgKQorICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPkxvYWRlcjwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGxvYWRlciBUaGUgTG9hZGVyIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95TUJlYW4oTG9hZGVyIGxvYWRlcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUobG9hZGVyKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgbG9hZGVyKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lKSApCisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+TWFuYWdlcjwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIE1hbmFnZXIgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGRlcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lNQmVhbihNYW5hZ2VyIG1hbmFnZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBtbmFtZSA9IGNyZWF0ZU1hbmFnZWROYW1lKG1hbmFnZXIpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBtYW5hZ2VyKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lKSApCisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisKKyAgICB9CisgICAgCisgICAgCisgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPk5hbWluZ1Jlc291cmNlczwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlcyBUaGUgTmFtaW5nUmVzb3VyY2VzIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95TUJlYW4oTmFtaW5nUmVzb3VyY2VzIHJlc291cmNlcykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUocmVzb3VyY2VzKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgcmVzb3VyY2VzKTsKKyAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpICkKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPlJlYWxtPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhbG0gVGhlIFJlYWxtIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95TUJlYW4oUmVhbG0gcmVhbG0pCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBtbmFtZSA9IGNyZWF0ZU1hbmFnZWROYW1lKHJlYWxtKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgcmVhbG0pOworICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpICkKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVyZWdpc3RlciB0aGUgTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBUaGUgUm9sZSB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgZGVyZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZGVzdHJveU1CZWFuKFJvbGUgcm9sZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUocm9sZSk7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIHJvbGUpOworICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpICkKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVyZWdpc3RlciB0aGUgTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5TZXJ2ZXI8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2ZXIgVGhlIFNlcnZlciB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgZGVyZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZGVzdHJveU1CZWFuKFNlcnZlciBzZXJ2ZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBtbmFtZSA9IGNyZWF0ZU1hbmFnZWROYW1lKHNlcnZlcik7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIHNlcnZlcik7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkgKQorICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPlNlcnZpY2U8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBTZXJ2aWNlIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95TUJlYW4oU2VydmljZSBzZXJ2aWNlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShzZXJ2aWNlKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgc2VydmljZSk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkgKQorICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPlVzZXI8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyIFRoZSBVc2VyIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95TUJlYW4oVXNlciB1c2VyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZSh1c2VyKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgdXNlcik7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkgKQorICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPlVzZXJEYXRhYmFzZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJEYXRhYmFzZSBUaGUgVXNlckRhdGFiYXNlIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95TUJlYW4oVXNlckRhdGFiYXNlIHVzZXJEYXRhYmFzZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUodXNlckRhdGFiYXNlKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgdXNlckRhdGFiYXNlKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lKSApCisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+VmFsdmU8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx2ZSBUaGUgVmFsdmUgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGRlcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lNQmVhbihWYWx2ZSB2YWx2ZSwgQ29udGFpbmVyIGNvbnRhaW5lcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgKChDb250YWluZWQpdmFsdmUpLnNldENvbnRhaW5lcihjb250YWluZXIpOworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZSh2YWx2ZSk7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIHZhbHZlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICgoQ29udGFpbmVkKXZhbHZlKS5zZXRDb250YWluZXIobnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpICkgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvTWVtb3J5VXNlckRhdGFiYXNlTUJlYW4uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvTWVtb3J5VXNlckRhdGFiYXNlTUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDg4YTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9NZW1vcnlVc2VyRGF0YWJhc2VNQmVhbi5qYXZhCkBAIC0wLDAgKzEsNDA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuczsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUm9sZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuQmFzZU1vZGVsTUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuTWFuYWdlZEJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5jb21wYXQuSmRrQ29tcGF0OworCisvKioKKyAqIDxwPkEgPHN0cm9uZz5Nb2RlbE1CZWFuPC9zdHJvbmc+IGltcGxlbWVudGF0aW9uIGZvciB0aGUKKyAqIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnMuTWVtb3J5VXNlckRhdGFiYXNlPC9jb2RlPiBjb21wb25lbnQuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgTWVtb3J5VXNlckRhdGFiYXNlTUJlYW4gZXh0ZW5kcyBCYXNlTW9kZWxNQmVhbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSA8Y29kZT5Nb2RlbE1CZWFuPC9jb2RlPiB3aXRoIGRlZmF1bHQKKyAgICAgKiA8Y29kZT5Nb2RlbE1CZWFuSW5mbzwvY29kZT4gaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiBhbiBvYmplY3QKKyAgICAgKiAgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24gaWYgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBNZW1vcnlVc2VyRGF0YWJhc2VNQmVhbigpCisgICAgICAgIHRocm93cyBNQmVhbkV4Y2VwdGlvbiwgUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENsYXNzIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBKREsgY29tcGF0aWJpbGl0eSBzdXBwb3J0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmRrQ29tcGF0IGpka0NvbXBhdCA9IEpka0NvbXBhdC5nZXRKZGtDb21wYXQoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHJlZ2lzdHJ5IGZvciBvdXIgbWFuYWdlZCBiZWFucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVnaXN0cnkgcmVnaXN0cnkgPSBNQmVhblV0aWxzLmNyZWF0ZVJlZ2lzdHJ5KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NQmVhblNlcnZlcjwvY29kZT4gaW4gd2hpY2ggd2UgYXJlIHJlZ2lzdGVyZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBNQmVhblV0aWxzLmNyZWF0ZVNlcnZlcigpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+TWFuYWdlZEJlYW48L2NvZGU+IGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhpcyBNQmVhbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFuYWdlZEJlYW4gbWFuYWdlZCA9CisgICAgICAgIHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbigiTWVtb3J5VXNlckRhdGFiYXNlIik7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NYW5hZ2VkQmVhbjwvY29kZT4gaW5mb3JtYXRpb24gZGVzY3JpYmluZyBHcm91cCBNQmVhbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hbmFnZWRCZWFuIG1hbmFnZWRHcm91cCA9CisgICAgICAgIHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbigiR3JvdXAiKTsKKworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPk1hbmFnZWRCZWFuPC9jb2RlPiBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIEdyb3VwIE1CZWFucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFuYWdlZEJlYW4gbWFuYWdlZFJvbGUgPQorICAgICAgICByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4oIlJvbGUiKTsKKworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPk1hbmFnZWRCZWFuPC9jb2RlPiBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIFVzZXIgTUJlYW5zLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYW5hZ2VkQmVhbiBtYW5hZ2VkVXNlciA9CisgICAgICAgIHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbigiVXNlciIpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lcyBvZiBhbGwgZ3JvdXBzIGRlZmluZWQgaW4gdGhpcyBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0R3JvdXBzKCkgeworCisgICAgICAgIFVzZXJEYXRhYmFzZSBkYXRhYmFzZSA9IChVc2VyRGF0YWJhc2UpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciBncm91cHMgPSBkYXRhYmFzZS5nZXRHcm91cHMoKTsKKyAgICAgICAgd2hpbGUgKGdyb3Vwcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEdyb3VwIGdyb3VwID0gKEdyb3VwKSBncm91cHMubmV4dCgpOworICAgICAgICAgICAgcmVzdWx0cy5hZGQoZmluZEdyb3VwKGdyb3VwLmdldEdyb3VwbmFtZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pIHJlc3VsdHMudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdHMuc2l6ZSgpXSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1CZWFuIE5hbWVzIG9mIGFsbCByb2xlcyBkZWZpbmVkIGluIHRoaXMgZGF0YWJhc2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJvbGVzKCkgeworCisgICAgICAgIFVzZXJEYXRhYmFzZSBkYXRhYmFzZSA9IChVc2VyRGF0YWJhc2UpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciByb2xlcyA9IGRhdGFiYXNlLmdldFJvbGVzKCk7CisgICAgICAgIHdoaWxlIChyb2xlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFJvbGUgcm9sZSA9IChSb2xlKSByb2xlcy5uZXh0KCk7CisgICAgICAgICAgICByZXN1bHRzLmFkZChmaW5kUm9sZShyb2xlLmdldFJvbGVuYW1lKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUJlYW4gTmFtZXMgb2YgYWxsIHVzZXJzIGRlZmluZWQgaW4gdGhpcyBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VXNlcnMoKSB7CisKKyAgICAgICAgVXNlckRhdGFiYXNlIGRhdGFiYXNlID0gKFVzZXJEYXRhYmFzZSkgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEl0ZXJhdG9yIHVzZXJzID0gZGF0YWJhc2UuZ2V0VXNlcnMoKTsKKyAgICAgICAgd2hpbGUgKHVzZXJzLmhhc05leHQoKSkgeworICAgICAgICAgICAgVXNlciB1c2VyID0gKFVzZXIpIHVzZXJzLm5leHQoKTsKKyAgICAgICAgICAgIHJlc3VsdHMuYWRkKGZpbmRVc2VyKHVzZXIuZ2V0VXNlcm5hbWUoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBHcm91cCBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIE1CZWFuIE5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXBuYW1lIEdyb3VwIG5hbWUgb2YgdGhlIG5ldyBncm91cAorICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgbmV3IGdyb3VwCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVHcm91cChTdHJpbmcgZ3JvdXBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKworICAgICAgICBVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSAoVXNlckRhdGFiYXNlKSB0aGlzLnJlc291cmNlOworICAgICAgICBHcm91cCBncm91cCA9IGRhdGFiYXNlLmNyZWF0ZUdyb3VwKGdyb3VwbmFtZSwgZGVzY3JpcHRpb24pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVNQmVhbihncm91cCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiRXhjZXB0aW9uIGNyZWF0aW5nIGdyb3VwICIgKyBncm91cCArICIgTUJlYW4iKTsKKyAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoZmluZEdyb3VwKGdyb3VwbmFtZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgUm9sZSBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIE1CZWFuIE5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZW5hbWUgR3JvdXAgbmFtZSBvZiB0aGUgbmV3IGdyb3VwCisgICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBuZXcgZ3JvdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVJvbGUoU3RyaW5nIHJvbGVuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKworICAgICAgICBVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSAoVXNlckRhdGFiYXNlKSB0aGlzLnJlc291cmNlOworICAgICAgICBSb2xlIHJvbGUgPSBkYXRhYmFzZS5jcmVhdGVSb2xlKHJvbGVuYW1lLCBkZXNjcmlwdGlvbik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU1CZWFuKHJvbGUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkV4Y2VwdGlvbiBjcmVhdGluZyByb2xlICIgKyByb2xlICsgIiBNQmVhbiIpOworICAgICAgICAgICAgamRrQ29tcGF0LmNoYWluRXhjZXB0aW9uKGlhZSwgZSk7CisgICAgICAgICAgICB0aHJvdyBpYWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChmaW5kUm9sZShyb2xlbmFtZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgVXNlciBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIE1CZWFuIE5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlciBuYW1lIG9mIHRoZSBuZXcgdXNlcgorICAgICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzd29yZCBmb3IgdGhlIG5ldyB1c2VyCisgICAgICogQHBhcmFtIGZ1bGxOYW1lIEZ1bGwgbmFtZSBmb3IgdGhlIG5ldyB1c2VyCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVVc2VyKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbE5hbWUpIHsKKworICAgICAgICBVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSAoVXNlckRhdGFiYXNlKSB0aGlzLnJlc291cmNlOworICAgICAgICBVc2VyIHVzZXIgPSBkYXRhYmFzZS5jcmVhdGVVc2VyKHVzZXJuYW1lLCBwYXNzd29yZCwgZnVsbE5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVNQmVhbih1c2VyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJFeGNlcHRpb24gY3JlYXRpbmcgdXNlciAiICsgdXNlciArICIgTUJlYW4iKTsKKyAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoZmluZFVzZXIodXNlcm5hbWUpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lIGZvciB0aGUgc3BlY2lmaWVkIGdyb3VwIG5hbWUgKGlmIGFueSk7CisgICAgICogb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cG5hbWUgR3JvdXAgbmFtZSB0byBsb29rIHVwCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaW5kR3JvdXAoU3RyaW5nIGdyb3VwbmFtZSkgeworCisgICAgICAgIFVzZXJEYXRhYmFzZSBkYXRhYmFzZSA9IChVc2VyRGF0YWJhc2UpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIEdyb3VwIGdyb3VwID0gZGF0YWJhc2UuZmluZEdyb3VwKGdyb3VwbmFtZSk7CisgICAgICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZEdyb3VwLmdldERvbWFpbigpLCBncm91cCk7CisgICAgICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIG9iamVjdCBuYW1lIGZvciBncm91cCAiICsgZ3JvdXApOworICAgICAgICAgICAgamRrQ29tcGF0LmNoYWluRXhjZXB0aW9uKGlhZSwgZSk7CisgICAgICAgICAgICB0aHJvdyBpYWU7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lIGZvciB0aGUgc3BlY2lmaWVkIHJvbGUgbmFtZSAoaWYgYW55KTsKKyAgICAgKiBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGVuYW1lIFJvbGUgbmFtZSB0byBsb29rIHVwCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaW5kUm9sZShTdHJpbmcgcm9sZW5hbWUpIHsKKworICAgICAgICBVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSAoVXNlckRhdGFiYXNlKSB0aGlzLnJlc291cmNlOworICAgICAgICBSb2xlIHJvbGUgPSBkYXRhYmFzZS5maW5kUm9sZShyb2xlbmFtZSk7CisgICAgICAgIGlmIChyb2xlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShtYW5hZ2VkUm9sZS5nZXREb21haW4oKSwgcm9sZSk7CisgICAgICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIG9iamVjdCBuYW1lIGZvciByb2xlICIgKyByb2xlKTsKKyAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUJlYW4gTmFtZSBmb3IgdGhlIHNwZWNpZmllZCB1c2VyIG5hbWUgKGlmIGFueSk7CisgICAgICogb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VyIG5hbWUgdG8gbG9vayB1cAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZmluZFVzZXIoU3RyaW5nIHVzZXJuYW1lKSB7CisKKyAgICAgICAgVXNlckRhdGFiYXNlIGRhdGFiYXNlID0gKFVzZXJEYXRhYmFzZSkgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgVXNlciB1c2VyID0gZGF0YWJhc2UuZmluZFVzZXIodXNlcm5hbWUpOworICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZFVzZXIuZ2V0RG9tYWluKCksIHVzZXIpOworICAgICAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBvYmplY3QgbmFtZSBmb3IgdXNlciAiICsgdXNlcik7CisgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBlKTsKKyAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXhpc3RpbmcgZ3JvdXAgYW5kIGRlc3Ryb3kgdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXBuYW1lIEdyb3VwIG5hbWUgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlR3JvdXAoU3RyaW5nIGdyb3VwbmFtZSkgeworCisgICAgICAgIFVzZXJEYXRhYmFzZSBkYXRhYmFzZSA9IChVc2VyRGF0YWJhc2UpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIEdyb3VwIGdyb3VwID0gZGF0YWJhc2UuZmluZEdyb3VwKGdyb3VwbmFtZSk7CisgICAgICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1CZWFuVXRpbHMuZGVzdHJveU1CZWFuKGdyb3VwKTsKKyAgICAgICAgICAgIGRhdGFiYXNlLnJlbW92ZUdyb3VwKGdyb3VwKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJFeGNlcHRpb24gZGVzdHJveWluZyBncm91cCAiICsgZ3JvdXAgKyAiIE1CZWFuIik7CisgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBlKTsKKyAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXhpc3Rpbmcgcm9sZSBhbmQgZGVzdHJveSB0aGUgY29ycmVzcG9uZGluZyBNQmVhbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlbmFtZSBSb2xlIG5hbWUgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUm9sZShTdHJpbmcgcm9sZW5hbWUpIHsKKworICAgICAgICBVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSAoVXNlckRhdGFiYXNlKSB0aGlzLnJlc291cmNlOworICAgICAgICBSb2xlIHJvbGUgPSBkYXRhYmFzZS5maW5kUm9sZShyb2xlbmFtZSk7CisgICAgICAgIGlmIChyb2xlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgTUJlYW5VdGlscy5kZXN0cm95TUJlYW4ocm9sZSk7CisgICAgICAgICAgICBkYXRhYmFzZS5yZW1vdmVSb2xlKHJvbGUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkV4Y2VwdGlvbiBkZXN0cm95aW5nIHJvbGUgIiArIHJvbGUgKyAiIE1CZWFuIik7CisgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBlKTsKKyAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXhpc3RpbmcgdXNlciBhbmQgZGVzdHJveSB0aGUgY29ycmVzcG9uZGluZyBNQmVhbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VyIG5hbWUgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVXNlcihTdHJpbmcgdXNlcm5hbWUpIHsKKworICAgICAgICBVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSAoVXNlckRhdGFiYXNlKSB0aGlzLnJlc291cmNlOworICAgICAgICBVc2VyIHVzZXIgPSBkYXRhYmFzZS5maW5kVXNlcih1c2VybmFtZSk7CisgICAgICAgIGlmICh1c2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgTUJlYW5VdGlscy5kZXN0cm95TUJlYW4odXNlcik7CisgICAgICAgICAgICBkYXRhYmFzZS5yZW1vdmVVc2VyKHVzZXIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkV4Y2VwdGlvbiBkZXN0cm95aW5nIHVzZXIgIiArIHVzZXIgKyAiIE1CZWFuIik7CisgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBlKTsKKyAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvTmFtaW5nUmVzb3VyY2VzTUJlYW4uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvTmFtaW5nUmVzb3VyY2VzTUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2UxOGJlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9OYW1pbmdSZXNvdXJjZXNNQmVhbi5qYXZhCkBAIC0wLDAgKzEsMzM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlTGluazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuQmFzZU1vZGVsTUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuTWFuYWdlZEJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5jb21wYXQuSmRrQ29tcGF0OworCisvKioKKyAqIDxwPkEgPHN0cm9uZz5Nb2RlbE1CZWFuPC9zdHJvbmc+IGltcGxlbWVudGF0aW9uIGZvciB0aGUKKyAqIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk5hbWluZ1Jlc291cmNlczwvY29kZT4gY29tcG9uZW50LjwvcD4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIE5hbWluZ1Jlc291cmNlc01CZWFuIGV4dGVuZHMgQmFzZU1vZGVsTUJlYW4geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgPGNvZGU+TW9kZWxNQmVhbjwvY29kZT4gd2l0aCBkZWZhdWx0CisgICAgICogPGNvZGU+TW9kZWxNQmVhbkluZm88L2NvZGU+IGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gb2JqZWN0CisgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIGlmIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nUmVzb3VyY2VzTUJlYW4oKQorICAgICAgICB0aHJvd3MgTUJlYW5FeGNlcHRpb24sIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlcigpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDbGFzcyBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogSkRLIGNvbXBhdGliaWxpdHkgc3VwcG9ydAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpka0NvbXBhdCBqZGtDb21wYXQgPSBKZGtDb21wYXQuZ2V0SmRrQ29tcGF0KCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHJlZ2lzdHJ5IGZvciBvdXIgbWFuYWdlZCBiZWFucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVnaXN0cnkgcmVnaXN0cnkgPSBNQmVhblV0aWxzLmNyZWF0ZVJlZ2lzdHJ5KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NYW5hZ2VkQmVhbjwvY29kZT4gaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGlzIE1CZWFuLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0KKyAgICAgICAgcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKCJOYW1pbmdSZXNvdXJjZXMiKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXR0cmlidXRlcworICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lcyBvZiB0aGUgc2V0IG9mIGRlZmluZWQgZW52aXJvbm1lbnQgZW50cmllcyBmb3IgIAorICAgICAqIHRoaXMgd2ViIGFwcGxpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEVudmlyb25tZW50cygpIHsKKyAgICAgICAgQ29udGV4dEVudmlyb25tZW50W10gZW52cyA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTmFtaW5nUmVzb3VyY2VzKXRoaXMucmVzb3VyY2UpLmZpbmRFbnZpcm9ubWVudHMoKTsKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW52cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVPYmplY3ROYW1lKG1hbmFnZWQuZ2V0RG9tYWluKCksIGVudnNbaV0pOworICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIG9iamVjdCBuYW1lIGZvciBlbnZpcm9ubWVudCAiICsgZW52c1tpXSk7CisgICAgICAgICAgICAgICAgamRrQ29tcGF0LmNoYWluRXhjZXB0aW9uKGlhZSwgZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pKTsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1CZWFuIE5hbWVzIG9mIGFsbCB0aGUgZGVmaW5lZCByZXNvdXJjZSByZWZlcmVuY2VzIGZvciB0aGlzCisgICAgICogYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlcygpIHsKKyAgICAgICAgCisgICAgICAgIENvbnRleHRSZXNvdXJjZVtdIHJlc291cmNlcyA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTmFtaW5nUmVzb3VyY2VzKXRoaXMucmVzb3VyY2UpLmZpbmRSZXNvdXJjZXMoKTsKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgcmVzb3VyY2VzW2ldKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBvYmplY3QgbmFtZSBmb3IgcmVzb3VyY2UgIiArIHJlc291cmNlc1tpXSk7CisgICAgICAgICAgICAgICAgamRrQ29tcGF0LmNoYWluRXhjZXB0aW9uKGlhZSwgZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pKTsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1CZWFuIE5hbWVzIG9mIGFsbCB0aGUgZGVmaW5lZCByZXNvdXJjZSBsaW5rIHJlZmVyZW5jZXMgZm9yIAorICAgICAqIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlTGlua3MoKSB7CisgICAgICAgIAorICAgICAgICBDb250ZXh0UmVzb3VyY2VMaW5rW10gcmVzb3VyY2VMaW5rcyA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTmFtaW5nUmVzb3VyY2VzKXRoaXMucmVzb3VyY2UpLmZpbmRSZXNvdXJjZUxpbmtzKCk7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlTGlua3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShtYW5hZ2VkLmdldERvbWFpbigpLCByZXNvdXJjZUxpbmtzW2ldKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBvYmplY3QgbmFtZSBmb3IgcmVzb3VyY2UgIiArIHJlc291cmNlTGlua3NbaV0pOworICAgICAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7CisKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGlvbnMKKworCisgICAgLyoqCisgICAgICogQWRkIGFuIGVudmlyb25tZW50IGVudHJ5IGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnZOYW1lIE5ldyBlbnZpcm9ubWVudCBlbnRyeSBuYW1lCisgICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIG5ldyBlbnZpcm9ubWVudCBlbnRyeQorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG5ldyBlbnZpcm9ubWVudCBlbnRyeSAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGFkZEVudmlyb25tZW50KFN0cmluZyBlbnZOYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlKSAKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gKE5hbWluZ1Jlc291cmNlcykgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgaWYgKG5yZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgQ29udGV4dEVudmlyb25tZW50IGVudiA9IG5yZXNvdXJjZXMuZmluZEVudmlyb25tZW50KGVudk5hbWUpOworICAgICAgICBpZiAoZW52ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgZW52aXJvbm1lbnQgbmFtZSAtIGFscmVhZHkgZXhpc3RzICciICsgZW52TmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgZW52ID0gbmV3IENvbnRleHRFbnZpcm9ubWVudCgpOworICAgICAgICBlbnYuc2V0TmFtZShlbnZOYW1lKTsKKyAgICAgICAgZW52LnNldFR5cGUodHlwZSk7CisgICAgICAgIGVudi5zZXRWYWx1ZSh2YWx1ZSk7CisgICAgICAgIG5yZXNvdXJjZXMuYWRkRW52aXJvbm1lbnQoZW52KTsKKyAgICAgICAgCisgICAgICAgIC8vIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyBNQmVhbiBuYW1lCisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4oIkNvbnRleHRFbnZpcm9ubWVudCIpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShtYW5hZ2VkLmdldERvbWFpbigpLCBlbnYpOworICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICAKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgYSByZXNvdXJjZSByZWZlcmVuY2UgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlTmFtZSBOZXcgcmVzb3VyY2UgcmVmZXJlbmNlIG5hbWUKKyAgICAgKiBAcGFyYW0gdHlwZSBOZXcgcmVzb3VyY2UgcmVmZXJlbmNlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGFkZFJlc291cmNlKFN0cmluZyByZXNvdXJjZU5hbWUsIFN0cmluZyB0eXBlKSAKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIG5yZXNvdXJjZXMgPSAoTmFtaW5nUmVzb3VyY2VzKSB0aGlzLnJlc291cmNlOworICAgICAgICBpZiAobnJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBDb250ZXh0UmVzb3VyY2UgcmVzb3VyY2UgPSBucmVzb3VyY2VzLmZpbmRSZXNvdXJjZShyZXNvdXJjZU5hbWUpOworICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiSW52YWxpZCByZXNvdXJjZSBuYW1lIC0gYWxyZWFkeSBleGlzdHMnIiArIHJlc291cmNlTmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzb3VyY2UgPSBuZXcgQ29udGV4dFJlc291cmNlKCk7CisgICAgICAgIHJlc291cmNlLnNldE5hbWUocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgcmVzb3VyY2Uuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgbnJlc291cmNlcy5hZGRSZXNvdXJjZShyZXNvdXJjZSk7CisgICAgICAgIAorICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKCJDb250ZXh0UmVzb3VyY2UiKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgcmVzb3VyY2UpOworICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIEFkZCBhIHJlc291cmNlIGxpbmsgcmVmZXJlbmNlIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUxpbmtOYW1lIE5ldyByZXNvdXJjZSBsaW5rIHJlZmVyZW5jZSBuYW1lCisgICAgICogQHBhcmFtIHR5cGUgTmV3IHJlc291cmNlIGxpbmsgcmVmZXJlbmNlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGFkZFJlc291cmNlTGluayhTdHJpbmcgcmVzb3VyY2VMaW5rTmFtZSwgU3RyaW5nIHR5cGUpCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gKE5hbWluZ1Jlc291cmNlcykgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgaWYgKG5yZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgQ29udGV4dFJlc291cmNlTGluayByZXNvdXJjZUxpbmsgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBucmVzb3VyY2VzLmZpbmRSZXNvdXJjZUxpbmsocmVzb3VyY2VMaW5rTmFtZSk7CisgICAgICAgIGlmIChyZXNvdXJjZUxpbmsgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiSW52YWxpZCByZXNvdXJjZSBsaW5rIG5hbWUgLSBhbHJlYWR5IGV4aXN0cyciICsgCisgICAgICAgICAgICAgICAgcmVzb3VyY2VMaW5rTmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzb3VyY2VMaW5rID0gbmV3IENvbnRleHRSZXNvdXJjZUxpbmsoKTsKKyAgICAgICAgcmVzb3VyY2VMaW5rLnNldE5hbWUocmVzb3VyY2VMaW5rTmFtZSk7CisgICAgICAgIHJlc291cmNlTGluay5zZXRUeXBlKHR5cGUpOworICAgICAgICBucmVzb3VyY2VzLmFkZFJlc291cmNlTGluayhyZXNvdXJjZUxpbmspOworICAgICAgICAKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIE1CZWFuIG5hbWUKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbigiQ29udGV4dFJlc291cmNlTGluayIpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShtYW5hZ2VkLmdldERvbWFpbigpLCByZXNvdXJjZUxpbmspOworICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IGVudmlyb25tZW50IGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGVudk5hbWUgTmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRW52aXJvbm1lbnQoU3RyaW5nIGVudk5hbWUpIHsKKworICAgICAgICBOYW1pbmdSZXNvdXJjZXMgbnJlc291cmNlcyA9IChOYW1pbmdSZXNvdXJjZXMpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDb250ZXh0RW52aXJvbm1lbnQgZW52ID0gbnJlc291cmNlcy5maW5kRW52aXJvbm1lbnQoZW52TmFtZSk7CisgICAgICAgIGlmIChlbnYgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiSW52YWxpZCBlbnZpcm9ubWVudCBuYW1lICciICsgZW52TmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgbnJlc291cmNlcy5yZW1vdmVFbnZpcm9ubWVudChlbnZOYW1lKTsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IHJlc291cmNlIHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgTmFtZSBvZiB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlKFN0cmluZyByZXNvdXJjZU5hbWUpIHsKKworICAgICAgICByZXNvdXJjZU5hbWUgPSBPYmplY3ROYW1lLnVucXVvdGUocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIG5yZXNvdXJjZXMgPSAoTmFtaW5nUmVzb3VyY2VzKSB0aGlzLnJlc291cmNlOworICAgICAgICBpZiAobnJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ29udGV4dFJlc291cmNlIHJlc291cmNlID0gbnJlc291cmNlcy5maW5kUmVzb3VyY2UocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgaWYgKHJlc291cmNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgcmVzb3VyY2UgbmFtZSAnIiArIHJlc291cmNlTmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgbnJlc291cmNlcy5yZW1vdmVSZXNvdXJjZShyZXNvdXJjZU5hbWUpOworICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IHJlc291cmNlIGxpbmsgcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlTGlua05hbWUgTmFtZSBvZiB0aGUgcmVzb3VyY2UgbGluayByZWZlcmVuY2UgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VMaW5rKFN0cmluZyByZXNvdXJjZUxpbmtOYW1lKSB7CisKKyAgICAgICAgcmVzb3VyY2VMaW5rTmFtZSA9IE9iamVjdE5hbWUudW5xdW90ZShyZXNvdXJjZUxpbmtOYW1lKTsKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIG5yZXNvdXJjZXMgPSAoTmFtaW5nUmVzb3VyY2VzKSB0aGlzLnJlc291cmNlOworICAgICAgICBpZiAobnJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ29udGV4dFJlc291cmNlTGluayByZXNvdXJjZUxpbmsgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBucmVzb3VyY2VzLmZpbmRSZXNvdXJjZUxpbmsocmVzb3VyY2VMaW5rTmFtZSk7CisgICAgICAgIGlmIChyZXNvdXJjZUxpbmsgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiSW52YWxpZCByZXNvdXJjZSBMaW5rIG5hbWUgJyIgKyByZXNvdXJjZUxpbmtOYW1lICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICBucmVzb3VyY2VzLnJlbW92ZVJlc291cmNlTGluayhyZXNvdXJjZUxpbmtOYW1lKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvUm9sZU1CZWFuLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL1JvbGVNQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOGM3OGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL1JvbGVNQmVhbi5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zOworCisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLkJhc2VNb2RlbE1CZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLk1hbmFnZWRCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworCisKKy8qKgorICogPHA+QSA8c3Ryb25nPk1vZGVsTUJlYW48L3N0cm9uZz4gaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICogPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Sb2xlPC9jb2RlPiBjb21wb25lbnQuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUm9sZU1CZWFuIGV4dGVuZHMgQmFzZU1vZGVsTUJlYW4geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgPGNvZGU+TW9kZWxNQmVhbjwvY29kZT4gd2l0aCBkZWZhdWx0CisgICAgICogPGNvZGU+TW9kZWxNQmVhbkluZm88L2NvZGU+IGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gb2JqZWN0CisgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIGlmIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgUm9sZU1CZWFuKCkKKyAgICAgICAgdGhyb3dzIE1CZWFuRXhjZXB0aW9uLCBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHJlZ2lzdHJ5IGZvciBvdXIgbWFuYWdlZCBiZWFucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVnaXN0cnkgcmVnaXN0cnkgPSBNQmVhblV0aWxzLmNyZWF0ZVJlZ2lzdHJ5KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NQmVhblNlcnZlcjwvY29kZT4gaW4gd2hpY2ggd2UgYXJlIHJlZ2lzdGVyZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBNQmVhblV0aWxzLmNyZWF0ZVNlcnZlcigpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+TWFuYWdlZEJlYW48L2NvZGU+IGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhpcyBNQmVhbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFuYWdlZEJlYW4gbWFuYWdlZCA9CisgICAgICAgIHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbigiUm9sZSIpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zCisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9TZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9TZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjBjODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL1NlcnZlckxpZmVjeWNsZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxNDEyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuczsKKworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXJFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lckxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlTGluazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5MaWZlY3ljbGVMaXN0ZW5lcjwvY29kZT4gdGhhdAorICogaW5zdGFudGlhdGVzIHRoZSBzZXQgb2YgTUJlYW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tcG9uZW50cyBvZiBhCisgKiBydW5uaW5nIGluc3RhbmNlIG9mIENhdGFsaW5hLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcgorICAgIGltcGxlbWVudHMgQ29udGFpbmVyTGlzdGVuZXIsIExpZmVjeWNsZUxpc3RlbmVyLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lci5jbGFzcyk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBTZW1pY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgcGF0aHMgY29udGFpbmluZyBNQmVhbiBkZXNjaXB0b3IgcmVzb3VyY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRvcnMgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdG9ycygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmRlc2NyaXB0b3JzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9ycyhTdHJpbmcgZGVzY3JpcHRvcnMpIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdG9ycyA9IGRlc2NyaXB0b3JzOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb250YWluZXJMaXN0ZW5lciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEhhbmRsZSBhIDxjb2RlPkNvbnRhaW5lckV2ZW50PC9jb2RlPiBmcm9tIG9uZSBvZiB0aGUgQ29udGFpbmVycyB3ZSBhcmUKKyAgICAgKiBpbnRlcmVzdGVkIGluLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbnRhaW5lckV2ZW50KENvbnRhaW5lckV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyB0eXBlID0gZXZlbnQuZ2V0VHlwZSgpOworICAgICAgICAgICAgaWYgKENvbnRhaW5lci5BRERfQ0hJTERfRVZFTlQuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRhaW5lckFkZENoaWxkKGV2ZW50LmdldENvbnRhaW5lcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ29udGFpbmVyKSBldmVudC5nZXREYXRhKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChDb250YWluZXIuUkVNT1ZFX0NISUxEX0VWRU5ULmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NDb250YWluZXJSZW1vdmVDaGlsZChldmVudC5nZXRDb250YWluZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENvbnRhaW5lcikgZXZlbnQuZ2V0RGF0YSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiRXhjZXB0aW9uIHByb2Nlc3NpbmcgZXZlbnQgIiArIGV2ZW50LCBlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZUxpc3RlbmVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJpbWFyeSBlbnRyeSBwb2ludCBmb3Igc3RhcnR1cCBhbmQgc2h1dGRvd24gZXZlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgTGlmZWN5Y2xlIGxpZmVjeWNsZSA9IGV2ZW50LmdldExpZmVjeWNsZSgpOworICAgICAgICBpZiAoTGlmZWN5Y2xlLlNUQVJUX0VWRU5ULmVxdWFscyhldmVudC5nZXRUeXBlKCkpKSB7CisKKyAgICAgICAgICAgIGlmIChsaWZlY3ljbGUgaW5zdGFuY2VvZiBTZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVNQmVhbnMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2UgYXJlIGVtYmVkZGVkLgorICAgICAgICAgICAgaWYoIGxpZmVjeWNsZSBpbnN0YW5jZW9mIFNlcnZpY2UgKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgTUJlYW5GYWN0b3J5IGZhY3RvcnkgPSBuZXcgTUJlYW5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1CZWFucyhmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlTUJlYW5zKChTZXJ2aWNlKWxpZmVjeWNsZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNyZWF0ZSBtYmVhbiBmYWN0b3J5Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgLy8gSWdub3JlIGV2ZW50cyBmcm9tIFN0YW5kYXJkQ29udGV4dCBvYmplY3RzIHRvIGF2b2lkCisgICAgICAgICAgICAvLyByZXJlZ2lzdGVyaW5nIHRoZSBjb250ZXh0CisgICAgICAgICAgICBpZiAobGlmZWN5Y2xlIGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNyZWF0ZU1CZWFucygpOworICAgICAgICAgICAgKi8KKworICAgICAgICB9IGVsc2UgaWYgKExpZmVjeWNsZS5TVE9QX0VWRU5ULmVxdWFscyhldmVudC5nZXRUeXBlKCkpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChsaWZlY3ljbGUgaW5zdGFuY2VvZiBTZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdHJveU1CZWFucygoU2VydmVyKWxpZmVjeWNsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaWZlY3ljbGUgaW5zdGFuY2VvZiBTZXJ2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lNQmVhbnMoKFNlcnZpY2UpbGlmZWN5Y2xlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChNQmVhbkV4Y2VwdGlvbiB0KSB7CisKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHQuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlID0gdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJkZXN0cm95TUJlYW5zOiBNQmVhbkV4Y2VwdGlvbiIsIGUpOworCisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJkZXN0cm95TUJlYW5zOiBUaHJvd2FibGUiLCB0KTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRklYTUU6IFJNSSBhZGFwdG9yIHNob3VsZCBiZSBzdG9wcGVkOyBob3dldmVyLCB0aGlzIGlzCisgICAgICAgICAgICAvLyB1bmRvY3VtZW50ZWQgaW4gTVg0SiwgYW5kIHJlcG9ydHMgZXhpc3QgaW4gdGhlIE1YNEogYnVnIERCIHRoYXQKKyAgICAgICAgICAgIC8vIHRoaXMgZG9lc24ndCB3b3JrCisKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoQ29udGV4dC5SRUxPQURfRVZFTlQuZXF1YWxzKGV2ZW50LmdldFR5cGUoKSkpCisgICAgICAgICAgICB8fCAoTGlmZWN5Y2xlLlNUQVJUX0VWRU5ULmVxdWFscyhldmVudC5nZXRUeXBlKCkpKSkgeworCisgICAgICAgICAgICAvLyBHaXZlIGNvbnRleHQgYSBuZXcgaGFuZGxlIHRvIHRoZSBNQmVhbiBzZXJ2ZXIgaWYgdGhlCisgICAgICAgICAgICAvLyBjb250ZXh0IGhhcyBiZWVuIHJlbG9hZGVkIHNpbmNlIHJlbG9hZGluZyBjYXVzZXMgdGhlCisgICAgICAgICAgICAvLyBjb250ZXh0IHRvIGxvc2UgaXRzIHByZXZpb3VzIGhhbmRsZSB0byB0aGUgc2VydmVyCisgICAgICAgICAgICBpZiAobGlmZWN5Y2xlIGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnRleHQgaXMgcHJpdmlsZWdlZCwgZ2l2ZSBhIHJlZmVyZW5jZSB0byBpdAorICAgICAgICAgICAgICAgIC8vIGluIGEgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIFN0YW5kYXJkQ29udGV4dCBjb250ZXh0ID0gKFN0YW5kYXJkQ29udGV4dClsaWZlY3ljbGU7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0UHJpdmlsZWdlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKS5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgIChHbG9iYWxzLk1CRUFOX1JFR0lTVFJZX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVSZWdpc3RyeSgpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgKEdsb2JhbHMuTUJFQU5fU0VSVkVSX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVTZXJ2ZXIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEhhbmRsZSBhIDxjb2RlPlByb3BlcnR5Q2hhbmdlRXZlbnQ8L2NvZGU+IGZyb20gb25lIG9mIHRoZSBDb250YWluZXJzCisgICAgICogd2UgYXJlIGludGVyZXN0ZWQgaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCisgICAgICAgIGlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIENvbnRhaW5lcikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGFpbmVyUHJvcGVydHlDaGFuZ2UoKENvbnRhaW5lcikgZXZlbnQuZ2V0U291cmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRPbGRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROZXdWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFeGNlcHRpb24gaGFuZGxpbmcgQ29udGFpbmVyIHByb3BlcnR5IGNoYW5nZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9LyogZWxzZSBpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBEZWZhdWx0Q29udGV4dCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzRGVmYXVsdENvbnRleHRQcm9wZXJ0eUNoYW5nZQorICAgICAgICAgICAgICAgICAgICAoKERlZmF1bHRDb250ZXh0KSBldmVudC5nZXRTb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0T2xkVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5ld1ZhbHVlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBoYW5kbGluZyBEZWZhdWx0Q29udGV4dCBwcm9wZXJ0eSBjaGFuZ2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSovIGVsc2UgaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgTmFtaW5nUmVzb3VyY2VzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NOYW1pbmdSZXNvdXJjZXNQcm9wZXJ0eUNoYW5nZQorICAgICAgICAgICAgICAgICAgICAoKE5hbWluZ1Jlc291cmNlcykgZXZlbnQuZ2V0U291cmNlKCksCisgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE9sZFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROZXdWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFeGNlcHRpb24gaGFuZGxpbmcgTmFtaW5nUmVzb3VyY2VzIHByb3BlcnR5IGNoYW5nZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgU2VydmVyKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NTZXJ2ZXJQcm9wZXJ0eUNoYW5nZSgoU2VydmVyKSBldmVudC5nZXRTb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE9sZFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5ld1ZhbHVlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBoYW5kaW5nIFNlcnZlciBwcm9wZXJ0eSBjaGFuZ2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFNlcnZpY2UpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc1NlcnZpY2VQcm9wZXJ0eUNoYW5nZSgoU2VydmljZSkgZXZlbnQuZ2V0U291cmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE9sZFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROZXdWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFeGNlcHRpb24gaGFuZGluZyBTZXJ2aWNlIHByb3BlcnR5IGNoYW5nZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIE1CZWFucyB0aGF0IGNvcnJlc3BvbmQgdG8gZXZlcnkgZXhpc3Rpbmcgbm9kZSBvZiBvdXIgdHJlZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNQmVhbnMoKSB7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgTUJlYW5GYWN0b3J5IGZhY3RvcnkgPSBuZXcgTUJlYW5GYWN0b3J5KCk7CisgICAgICAgICAgICBjcmVhdGVNQmVhbnMoZmFjdG9yeSk7CisgICAgICAgICAgICBjcmVhdGVNQmVhbnMoU2VydmVyRmFjdG9yeS5nZXRTZXJ2ZXIoKSk7CisKKyAgICAgICAgfSBjYXRjaCAoTUJlYW5FeGNlcHRpb24gdCkgeworCisgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHQuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICBpZiAoZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGUgPSB0OworICAgICAgICAgICAgbG9nLmVycm9yKCJjcmVhdGVNQmVhbnM6IE1CZWFuRXhjZXB0aW9uIiwgZSk7CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKworICAgICAgICAgICAgbG9nLmVycm9yKCJjcmVhdGVNQmVhbnM6IFRocm93YWJsZSIsIHQpOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIHRoZSBzcGVjaWZpZWQgQ29ubmVjdG9yIGFuZCBpdHMgbmVzdGVkIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdG9yIENvbm5lY3RvciBmb3Igd2hpY2ggdG8gY3JlYXRlIE1CZWFucworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgTUJlYW4gY3JlYXRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNQmVhbnMoQ29ubmVjdG9yIGNvbm5lY3RvcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbiBmb3IgdGhlIENvbm5uZWN0b3IgaXRzZWxmCisvLyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorLy8gICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBDb25uZWN0b3IgIiArIGNvbm5lY3Rvcik7CisvLyAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVNQmVhbihjb25uZWN0b3IpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBDb250ZXh0IGFuZCBpdHMgbmVzdGVkIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0byBjcmVhdGUgTUJlYW5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBNQmVhbiBjcmVhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1CZWFucyhDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW4gZm9yIHRoZSBDb250ZXh0IGl0c2VsZgorLy8gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKy8vICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgQ29udGV4dCAiICsgY29udGV4dCk7CisvLyAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVNQmVhbihjb250ZXh0KTsKKyAgICAgICAgY29udGV4dC5hZGRDb250YWluZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQpIHsKKyAgICAgICAgICAgICgoU3RhbmRhcmRDb250ZXh0KSBjb250ZXh0KS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgKChTdGFuZGFyZENvbnRleHQpIGNvbnRleHQpLmFkZExpZmVjeWNsZUxpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIGNvbnRleHQgaXMgcHJpdmlsZWdlZCwgZ2l2ZSBhIHJlZmVyZW5jZSB0byBpdAorICAgICAgICAvLyBpbiBhIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUKKyAgICAgICAgaWYgKGNvbnRleHQuZ2V0UHJpdmlsZWdlZCgpKSB7CisgICAgICAgICAgICBjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkuc2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgKEdsb2JhbHMuTUJFQU5fUkVHSVNUUllfQVRUUiwKKyAgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVSZWdpc3RyeSgpKTsKKyAgICAgICAgICAgIGNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKS5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAoR2xvYmFscy5NQkVBTl9TRVJWRVJfQVRUUiwKKyAgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVTZXJ2ZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFucyBmb3IgdGhlIGFzc29jaWF0ZWQgbmVzdGVkIGNvbXBvbmVudHMKKyAgICAgICAgTG9hZGVyIGNMb2FkZXIgPSBjb250ZXh0LmdldExvYWRlcigpOworICAgICAgICBpZiAoY0xvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgTG9hZGVyICIgKyBjTG9hZGVyKTsKKyAgICAgICAgICAgIC8vTUJlYW5VdGlscy5jcmVhdGVNQmVhbihjTG9hZGVyKTsKKyAgICAgICAgfQorICAgICAgICBNYW5hZ2VyIGNNYW5hZ2VyID0gY29udGV4dC5nZXRNYW5hZ2VyKCk7CisgICAgICAgIGlmIChjTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgTWFuYWdlciAiICsgY01hbmFnZXIpOworICAgICAgICAgICAgLy9NQmVhblV0aWxzLmNyZWF0ZU1CZWFuKGNNYW5hZ2VyKTsKKyAgICAgICAgfQorICAgICAgICBSZWFsbSBoUmVhbG0gPSBjb250ZXh0LmdldFBhcmVudCgpLmdldFJlYWxtKCk7CisgICAgICAgIFJlYWxtIGNSZWFsbSA9IGNvbnRleHQuZ2V0UmVhbG0oKTsKKyAgICAgICAgaWYgKChjUmVhbG0gIT0gbnVsbCkgJiYgKGNSZWFsbSAhPSBoUmVhbG0pKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgUmVhbG0gIiArIGNSZWFsbSk7CisgICAgICAgICAgICAvL01CZWFuVXRpbHMuY3JlYXRlTUJlYW4oY1JlYWxtKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW5zIGZvciB0aGUgTmFtaW5nUmVzb3VyY2VzIChpZiBhbnkpCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMgPSBjb250ZXh0LmdldE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBjcmVhdGVNQmVhbnMocmVzb3VyY2VzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIHRoZSBzcGVjaWZpZWQgQ29udGV4dEVudmlyb25tZW50IGVudHJ5LgorICAgICAqCisgICAgICogQHBhcmFtIGVudmlyb25tZW50IENvbnRleHRFbnZpcm9ubWVudCBmb3Igd2hpY2ggdG8gY3JlYXRlIE1CZWFucworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgTUJlYW4gY3JlYXRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNQmVhbnMoQ29udGV4dEVudmlyb25tZW50IGVudmlyb25tZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFuIGZvciB0aGUgQ29udGV4dEVudmlyb25tZW50IGl0c2VsZgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW4gZm9yIENvbnRleHRFbnZpcm9ubWVudCAiICsgZW52aXJvbm1lbnQpOworICAgICAgICB9CisgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlTUJlYW4oZW52aXJvbm1lbnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBDb250ZXh0UmVzb3VyY2UgZW50cnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgQ29udGV4dFJlc291cmNlIGZvciB3aGljaCB0byBjcmVhdGUgTUJlYW5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBNQmVhbiBjcmVhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1CZWFucyhDb250ZXh0UmVzb3VyY2UgcmVzb3VyY2UpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW4gZm9yIHRoZSBDb250ZXh0UmVzb3VyY2UgaXRzZWxmCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgQ29udGV4dFJlc291cmNlICIgKyByZXNvdXJjZSk7CisgICAgICAgIH0KKyAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVNQmVhbihyZXNvdXJjZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgTUJlYW5zIGZvciB0aGUgc3BlY2lmaWVkIENvbnRleHRSZXNvdXJjZUxpbmsgZW50cnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VMaW5rIENvbnRleHRSZXNvdXJjZUxpbmsgZm9yIHdoaWNoIHRvIGNyZWF0ZSBNQmVhbnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIE1CZWFuIGNyZWF0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTUJlYW5zKENvbnRleHRSZXNvdXJjZUxpbmsgcmVzb3VyY2VMaW5rKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFuIGZvciB0aGUgQ29udGV4dFJlc291cmNlTGluayBpdHNlbGYKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBDb250ZXh0UmVzb3VyY2VMaW5rICIgKyByZXNvdXJjZUxpbmspOworICAgICAgICB9CisgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlTUJlYW4ocmVzb3VyY2VMaW5rKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIHRoZSBzcGVjaWZpZWQgRGVmYXVsdENvbnRleHQgYW5kIGl0cyBuZXN0ZWQgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkY29udGV4dCBEZWZhdWx0Q29udGV4dCBmb3Igd2hpY2ggdG8gY3JlYXRlIE1CZWFucworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgTUJlYW4gY3JlYXRpb24KKyAgICAgKi8KKyAgICAvKgorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1CZWFucyhEZWZhdWx0Q29udGV4dCBkY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbiBmb3IgdGhlIERlZmF1bHRDb250ZXh0IGl0c2VsZgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBEZWZhdWx0Q29udGV4dCAiICsgZGNvbnRleHQpOworICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU1CZWFuKGRjb250ZXh0KTsKKworICAgICAgICBkY29udGV4dC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW5zIGZvciB0aGUgYXNzb2NpYXRlZCBuZXN0ZWQgY29tcG9uZW50cworICAgICAgICBMb2FkZXIgZExvYWRlciA9IGRjb250ZXh0LmdldExvYWRlcigpOworICAgICAgICBpZiAoZExvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgTG9hZGVyICIgKyBkTG9hZGVyKTsKKyAgICAgICAgICAgIC8vTUJlYW5VdGlscy5jcmVhdGVNQmVhbihkTG9hZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIE1hbmFnZXIgZE1hbmFnZXIgPSBkY29udGV4dC5nZXRNYW5hZ2VyKCk7CisgICAgICAgIGlmIChkTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgTWFuYWdlciAiICsgZE1hbmFnZXIpOworICAgICAgICAgICAgLy9NQmVhblV0aWxzLmNyZWF0ZU1CZWFuKGRNYW5hZ2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW5zIGZvciB0aGUgTmFtaW5nUmVzb3VyY2VzIChpZiBhbnkpCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMgPSBkY29udGV4dC5nZXROYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgY3JlYXRlTUJlYW5zKHJlc291cmNlcyk7CisKKyAgICB9CisgICAgKi8KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIHRoZSBzcGVjaWZpZWQgRW5naW5lIGFuZCBpdHMgbmVzdGVkIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5naW5lIEVuZ2luZSBmb3Igd2hpY2ggdG8gY3JlYXRlIE1CZWFucworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgTUJlYW4gY3JlYXRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNQmVhbnMoRW5naW5lIGVuZ2luZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbiBmb3IgdGhlIEVuZ2luZSBpdHNlbGYKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBFbmdpbmUgIiArIGVuZ2luZSk7CisgICAgICAgIH0KKyAgICAgICAgLy9NQmVhblV0aWxzLmNyZWF0ZU1CZWFuKGVuZ2luZSk7CisgICAgICAgIGVuZ2luZS5hZGRDb250YWluZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgaWYgKGVuZ2luZSBpbnN0YW5jZW9mIFN0YW5kYXJkRW5naW5lKSB7CisgICAgICAgICAgICAoKFN0YW5kYXJkRW5naW5lKSBlbmdpbmUpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFucyBmb3IgdGhlIGFzc29jaWF0ZWQgbmVzdGVkIGNvbXBvbmVudHMKKyAgICAgICAgUmVhbG0gZVJlYWxtID0gZW5naW5lLmdldFJlYWxtKCk7CisgICAgICAgIGlmIChlUmVhbG0gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW4gZm9yIFJlYWxtICIgKyBlUmVhbG0pOworICAgICAgICAgICAgLy9NQmVhblV0aWxzLmNyZWF0ZU1CZWFuKGVSZWFsbSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFucyBmb3IgZWFjaCBjaGlsZCBIb3N0CisgICAgICAgIENvbnRhaW5lciBob3N0c1tdID0gZW5naW5lLmZpbmRDaGlsZHJlbigpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGhvc3RzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICBjcmVhdGVNQmVhbnMoKEhvc3QpIGhvc3RzW2pdKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBIb3N0IGFuZCBpdHMgbmVzdGVkIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaG9zdCBIb3N0IGZvciB3aGljaCB0byBjcmVhdGUgTUJlYW5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBNQmVhbiBjcmVhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1CZWFucyhIb3N0IGhvc3QpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW4gZm9yIHRoZSBIb3N0IGl0c2VsZgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW4gZm9yIEhvc3QgIiArIGhvc3QpOworICAgICAgICB9CisgICAgICAgIC8vTUJlYW5VdGlscy5jcmVhdGVNQmVhbihob3N0KTsKKyAgICAgICAgaG9zdC5hZGRDb250YWluZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgaWYgKGhvc3QgaW5zdGFuY2VvZiBTdGFuZGFyZEhvc3QpIHsKKyAgICAgICAgICAgICgoU3RhbmRhcmRIb3N0KSBob3N0KS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIHRoZSBhc3NvY2lhdGVkIG5lc3RlZCBjb21wb25lbnRzCisgICAgICAgIFJlYWxtIGVSZWFsbSA9IGhvc3QuZ2V0UGFyZW50KCkuZ2V0UmVhbG0oKTsKKyAgICAgICAgUmVhbG0gaFJlYWxtID0gaG9zdC5nZXRSZWFsbSgpOworICAgICAgICBpZiAoKGhSZWFsbSAhPSBudWxsKSAmJiAoaFJlYWxtICE9IGVSZWFsbSkpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBSZWFsbSAiICsgaFJlYWxtKTsKKyAgICAgICAgICAgIC8vTUJlYW5VdGlscy5jcmVhdGVNQmVhbihoUmVhbG0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIGVhY2ggY2hpbGQgQ29udGV4dAorICAgICAgICBDb250YWluZXIgY29udGV4dHNbXSA9IGhvc3QuZmluZENoaWxkcmVuKCk7CisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgY29udGV4dHMubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgIGNyZWF0ZU1CZWFucygoQ29udGV4dCkgY29udGV4dHNba10pOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgTUJlYW5zIGZvciBNQmVhbkZhY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmFjdG9yeSBNQmVhbkZhY3RvcnkgZm9yIHdoaWNoIHRvIGNyZWF0ZSBNQmVhbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgTUJlYW4gY3JlYXRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNQmVhbnMoTUJlYW5GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW4gZm9yIHRoZSBNQmVhbkZhY3RvcnkKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgTUJlYW5GYWN0b3J5ICIgKyBmYWN0b3J5KTsKKyAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVNQmVhbihmYWN0b3J5KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIHRoZSBzcGVjaWZpZWQgTmFtaW5nUmVzb3VyY2VzIGFuZCBpdHMKKyAgICAgKiBuZXN0ZWQgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgTmFtaW5nUmVzb3VyY2VzIGZvciB3aGljaCB0byBjcmVhdGUgTUJlYW5zCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTUJlYW5zKE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW4gZm9yIHRoZSBOYW1pbmdSZXNvdXJjZXMgaXRzZWxmCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgTmFtaW5nUmVzb3VyY2VzICIgKyByZXNvdXJjZXMpOworICAgICAgICB9CisgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlTUJlYW4ocmVzb3VyY2VzKTsKKyAgICAgICAgcmVzb3VyY2VzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIGVhY2ggY2hpbGQgZW52aXJvbm1lbnQgZW50cnkKKyAgICAgICAgQ29udGV4dEVudmlyb25tZW50IGVudmlyb25tZW50c1tdID0gcmVzb3VyY2VzLmZpbmRFbnZpcm9ubWVudHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnZpcm9ubWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNyZWF0ZU1CZWFucyhlbnZpcm9ubWVudHNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIGVhY2ggY2hpbGQgcmVzb3VyY2UgZW50cnkKKyAgICAgICAgQ29udGV4dFJlc291cmNlIGNyZXNvdXJjZXNbXSA9IHJlc291cmNlcy5maW5kUmVzb3VyY2VzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3Jlc291cmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY3JlYXRlTUJlYW5zKGNyZXNvdXJjZXNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIGVhY2ggY2hpbGQgcmVzb3VyY2UgbGluayBlbnRyeQorICAgICAgICBDb250ZXh0UmVzb3VyY2VMaW5rIGNyZXNvdXJjZWxpbmtzW10gPSByZXNvdXJjZXMuZmluZFJlc291cmNlTGlua3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjcmVzb3VyY2VsaW5rcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY3JlYXRlTUJlYW5zKGNyZXNvdXJjZWxpbmtzW2ldKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBTZXJ2ZXIgYW5kIGl0cyBuZXN0ZWQgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2ZXIgU2VydmVyIGZvciB3aGljaCB0byBjcmVhdGUgTUJlYW5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBNQmVhbiBjcmVhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1CZWFucyhTZXJ2ZXIgc2VydmVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFuIGZvciB0aGUgU2VydmVyIGl0c2VsZgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBTZXJ2ZXIgIiArIHNlcnZlcik7CisgICAgICAgIC8vTUJlYW5VdGlscy5jcmVhdGVNQmVhbihzZXJ2ZXIpOworICAgICAgICBpZiAoc2VydmVyIGluc3RhbmNlb2YgU3RhbmRhcmRTZXJ2ZXIpIHsKKyAgICAgICAgICAgICgoU3RhbmRhcmRTZXJ2ZXIpIHNlcnZlcikuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW5zIGZvciB0aGUgZ2xvYmFsIE5hbWluZ1Jlc291cmNlcyAoaWYgYW55KQorICAgICAgICBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gc2VydmVyLmdldEdsb2JhbE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNyZWF0ZU1CZWFucyhyZXNvdXJjZXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIGVhY2ggY2hpbGQgU2VydmljZQorICAgICAgICBTZXJ2aWNlIHNlcnZpY2VzW10gPSBzZXJ2ZXIuZmluZFNlcnZpY2VzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIEZJWE1FIC0gV2FycCBvYmplY3QgaGllcmFyY2h5IG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgICAgICAgICBpZiAoc2VydmljZXNbaV0uZ2V0Q29udGFpbmVyKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzCisgICAgICAgICAgICAgICAgKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci53YXJwLldhcnBFbmdpbmUiKSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNraXBwaW5nIE1CZWFuIGZvciBTZXJ2aWNlICIgKyBzZXJ2aWNlc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3JlYXRlTUJlYW5zKHNlcnZpY2VzW2ldKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBTZXJ2aWNlIGFuZCBpdHMgbmVzdGVkIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZSBTZXJ2aWNlIGZvciB3aGljaCB0byBjcmVhdGUgTUJlYW5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBNQmVhbiBjcmVhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1CZWFucyhTZXJ2aWNlIHNlcnZpY2UpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW4gZm9yIHRoZSBTZXJ2aWNlIGl0c2VsZgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBTZXJ2aWNlICIgKyBzZXJ2aWNlKTsKKyAgICAgICAgLy9NQmVhblV0aWxzLmNyZWF0ZU1CZWFuKHNlcnZpY2UpOworICAgICAgICBpZiAoc2VydmljZSBpbnN0YW5jZW9mIFN0YW5kYXJkU2VydmljZSkgeworICAgICAgICAgICAgKChTdGFuZGFyZFNlcnZpY2UpIHNlcnZpY2UpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFucyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgQ29ubmVjdG9ycworICAgICAgICBDb25uZWN0b3IgY29ubmVjdG9yc1tdID0gc2VydmljZS5maW5kQ29ubmVjdG9ycygpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbm5lY3RvcnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgIGNyZWF0ZU1CZWFucyhjb25uZWN0b3JzW2pdKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW4gZm9yIHRoZSBhc3NvY2lhdGVkIEVuZ2luZSBhbmQgZnJpZW5kcworICAgICAgICBFbmdpbmUgZW5naW5lID0gKEVuZ2luZSkgc2VydmljZS5nZXRDb250YWluZXIoKTsKKyAgICAgICAgaWYgKGVuZ2luZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjcmVhdGVNQmVhbnMoZW5naW5lKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKworCisgICAgLyoqCisgICAgICogRGVyZWdpc3RlciB0aGUgTUJlYW5zIGZvciB0aGUgc3BlY2lmaWVkIENvbm5lY3RvciBhbmQgaXRzIG5lc3RlZAorICAgICAqIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdG9yIENvbm5lY3RvciBmb3Igd2hpY2ggdG8gZGVyZWdpc3RlciBNQmVhbnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIE1CZWFuIGRlc3RydWN0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVzdHJveU1CZWFucyhDb25uZWN0b3IgY29ubmVjdG9yLCBTZXJ2aWNlIHNlcnZpY2UpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisvLyAgICAgICAgLy8gZGVyZWdpc3RlciB0aGUgTUJlYW4gZm9yIHRoZSBDb25uZWN0b3IgaXRzZWxmCisvLyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorLy8gICAgICAgICAgICBsb2cuZGVidWcoIkRlc3Ryb3lpbmcgTUJlYW4gZm9yIENvbm5lY3RvciAiICsgY29ubmVjdG9yKTsKKy8vICAgICAgICBNQmVhblV0aWxzLmRlc3Ryb3lNQmVhbihjb25uZWN0b3IsIHNlcnZpY2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbnMgZm9yIHRoZSBzcGVjaWZpZWQgQ29udGV4dCBhbmQgaXRzIG5lc3RlZAorICAgICAqIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0byBkZXJlZ2lzdGVyIE1CZWFucworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgTUJlYW4gZGVzdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXN0cm95TUJlYW5zKENvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRGVyZWdpc3RlciBvdXJzZWx2ZXMgYXMgYSBDb250YWluZXJMaXN0ZW5lcgorICAgICAgICBjb250ZXh0LnJlbW92ZUNvbnRhaW5lckxpc3RlbmVyKHRoaXMpOworCisgICAgICAgIC8vIERlc3Ryb3kgdGhlIE1CZWFucyBmb3IgdGhlIGFzc29jaWF0ZWQgbmVzdGVkIGNvbXBvbmVudHMKKyAgICAgICAgUmVhbG0gaFJlYWxtID0gY29udGV4dC5nZXRQYXJlbnQoKS5nZXRSZWFsbSgpOworICAgICAgICBSZWFsbSBjUmVhbG0gPSBjb250ZXh0LmdldFJlYWxtKCk7CisgICAgICAgIGlmICgoY1JlYWxtICE9IG51bGwpICYmIChjUmVhbG0gIT0gaFJlYWxtKSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzdHJveWluZyBNQmVhbiBmb3IgUmVhbG0gIiArIGNSZWFsbSk7CisgICAgICAgICAgICAvL01CZWFuVXRpbHMuZGVzdHJveU1CZWFuKGNSZWFsbSk7CisgICAgICAgIH0KKyAgICAgICAgTWFuYWdlciBjTWFuYWdlciA9IGNvbnRleHQuZ2V0TWFuYWdlcigpOworICAgICAgICBpZiAoY01hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzdHJveWluZyBNQmVhbiBmb3IgTWFuYWdlciAiICsgY01hbmFnZXIpOworICAgICAgICAgICAgLy9NQmVhblV0aWxzLmRlc3Ryb3lNQmVhbihjTWFuYWdlcik7CisgICAgICAgIH0KKyAgICAgICAgTG9hZGVyIGNMb2FkZXIgPSBjb250ZXh0LmdldExvYWRlcigpOworICAgICAgICBpZiAoY0xvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXN0cm95aW5nIE1CZWFuIGZvciBMb2FkZXIgIiArIGNMb2FkZXIpOworICAgICAgICAgICAgLy9NQmVhblV0aWxzLmRlc3Ryb3lNQmVhbihjTG9hZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlc3Ryb3kgdGhlIE1CZWFucyBmb3IgdGhlIE5hbWluZ1Jlc291cmNlcyAoaWYgYW55KQorICAgICAgICBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gY29udGV4dC5nZXROYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBkZXN0cm95TUJlYW5zKHJlc291cmNlcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhlIENvbnRleHQgaXRzZWxmCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzdHJveWluZyBNQmVhbiBmb3IgQ29udGV4dCAiICsgY29udGV4dCk7CisgICAgICAgIC8vTUJlYW5VdGlscy5kZXN0cm95TUJlYW4oY29udGV4dCk7CisgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KSB7CisgICAgICAgICAgICAoKFN0YW5kYXJkQ29udGV4dCkgY29udGV4dCkuCisgICAgICAgICAgICAgICAgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbnMgZm9yIHRoZSBzcGVjaWZpZWQgQ29udGV4dEVudmlyb25tZW50IGVudHJ5LgorICAgICAqCisgICAgICogQHBhcmFtIGVudmlyb25tZW50IENvbnRleHRFbnZpcm9ubWVudCBmb3Igd2hpY2ggdG8gZGVzdHJveSBNQmVhbnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIE1CZWFuIGRlc3RydWN0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVzdHJveU1CZWFucyhDb250ZXh0RW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIERlc3Ryb3kgdGhlIE1CZWFuIGZvciB0aGUgQ29udGV4dEVudmlyb25tZW50IGl0c2VsZgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzdHJveWluZyBNQmVhbiBmb3IgQ29udGV4dEVudmlyb25tZW50ICIgKyBlbnZpcm9ubWVudCk7CisgICAgICAgIH0KKyAgICAgICAgTUJlYW5VdGlscy5kZXN0cm95TUJlYW4oZW52aXJvbm1lbnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbnMgZm9yIHRoZSBzcGVjaWZpZWQgQ29udGV4dFJlc291cmNlIGVudHJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIENvbnRleHRSZXNvdXJjZSBmb3Igd2hpY2ggdG8gZGVzdHJveSBNQmVhbnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIE1CZWFuIGRlc3RydWN0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVzdHJveU1CZWFucyhDb250ZXh0UmVzb3VyY2UgcmVzb3VyY2UpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIERlc3Ryb3kgdGhlIE1CZWFuIGZvciB0aGUgQ29udGV4dFJlc291cmNlIGl0c2VsZgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzdHJveWluZyBNQmVhbiBmb3IgQ29udGV4dFJlc291cmNlICIgKyByZXNvdXJjZSk7CisgICAgICAgIH0KKyAgICAgICAgTUJlYW5VdGlscy5kZXN0cm95TUJlYW4ocmVzb3VyY2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbnMgZm9yIHRoZSBzcGVjaWZpZWQgQ29udGV4dFJlc291cmNlTGluayBlbnRyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUxpbmsgQ29udGV4dFJlc291cmNlTGluayBmb3Igd2hpY2ggdG8gZGVzdHJveSBNQmVhbnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIE1CZWFuIGRlc3RydWN0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVzdHJveU1CZWFucyhDb250ZXh0UmVzb3VyY2VMaW5rIHJlc291cmNlTGluaykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRGVzdHJveSB0aGUgTUJlYW4gZm9yIHRoZSBDb250ZXh0UmVzb3VyY2VMaW5rIGl0c2VsZgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzdHJveWluZyBNQmVhbiBmb3IgQ29udGV4dFJlc291cmNlTGluayAiICsgcmVzb3VyY2VMaW5rKTsKKyAgICAgICAgfQorICAgICAgICBNQmVhblV0aWxzLmRlc3Ryb3lNQmVhbihyZXNvdXJjZUxpbmspOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbnMgZm9yIHRoZSBzcGVjaWZpZWQgRGVmYXVsdENvbnRleHQgYW5kIGl0cyBuZXN0ZWQKKyAgICAgKiBjb21wb25lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGRjb250ZXh0IERlZmF1bHRDb250ZXh0IGZvciB3aGljaCB0byBkZXJlZ2lzdGVyIE1CZWFucworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgTUJlYW4gZGVzdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICAvKgorICAgIHByb3RlY3RlZCB2b2lkIGRlc3Ryb3lNQmVhbnMoRGVmYXVsdENvbnRleHQgZGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE1hbmFnZXIgZE1hbmFnZXIgPSBkY29udGV4dC5nZXRNYW5hZ2VyKCk7CisgICAgICAgIGlmIChkTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXN0cm95aW5nIE1CZWFuIGZvciBNYW5hZ2VyICIgKyBkTWFuYWdlcik7CisgICAgICAgICAgICAvL01CZWFuVXRpbHMuZGVzdHJveU1CZWFuKGRNYW5hZ2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIExvYWRlciBkTG9hZGVyID0gZGNvbnRleHQuZ2V0TG9hZGVyKCk7CisgICAgICAgIGlmIChkTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRlc3Ryb3lpbmcgTUJlYW4gZm9yIExvYWRlciAiICsgZExvYWRlcik7CisgICAgICAgICAgICAvL01CZWFuVXRpbHMuZGVzdHJveU1CZWFuKGRMb2FkZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGVzdHJveSB0aGUgTUJlYW5zIGZvciB0aGUgTmFtaW5nUmVzb3VyY2VzIChpZiBhbnkpCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMgPSBkY29udGV4dC5nZXROYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBkZXN0cm95TUJlYW5zKHJlc291cmNlcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhlIERlZmF1bHRDb250ZXh0IGl0c2VsZgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkRlc3Ryb3lpbmcgTUJlYW4gZm9yIENvbnRleHQgIiArIGRjb250ZXh0KTsKKyAgICAgICAgTUJlYW5VdGlscy5kZXN0cm95TUJlYW4oZGNvbnRleHQpOworICAgICAgICBkY29udGV4dC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworCisgICAgfQorICAgICovCisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBFbmdpbmUgYW5kIGl0cyBuZXN0ZWQKKyAgICAgKiBjb21wb25lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGVuZ2luZSBFbmdpbmUgZm9yIHdoaWNoIHRvIGRlc3Ryb3kgTUJlYW5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBNQmVhbiBkZXN0cnVjdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlc3Ryb3lNQmVhbnMoRW5naW5lIGVuZ2luZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRGVyZWdpc3RlciBvdXJzZWx2ZXMgYXMgYSBDb250YWluZXJMaXN0ZW5lcgorICAgICAgICBlbmdpbmUucmVtb3ZlQ29udGFpbmVyTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgLy8gRGVyZWdpc3RlciB0aGUgTUJlYW5zIGZvciBlYWNoIGNoaWxkIEhvc3QKKyAgICAgICAgQ29udGFpbmVyIGhvc3RzW10gPSBlbmdpbmUuZmluZENoaWxkcmVuKCk7CisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgaG9zdHMubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgIGRlc3Ryb3lNQmVhbnMoKEhvc3QpIGhvc3RzW2tdKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlcmVnaXN0ZXIgdGhlIE1CZWFucyBmb3IgdGhlIGFzc29jaWF0ZWQgbmVzdGVkIGNvbXBvbmVudHMKKyAgICAgICAgUmVhbG0gZVJlYWxtID0gZW5naW5lLmdldFJlYWxtKCk7CisgICAgICAgIGlmIChlUmVhbG0gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzdHJveWluZyBNQmVhbiBmb3IgUmVhbG0gIiArIGVSZWFsbSk7CisgICAgICAgICAgICAvL01CZWFuVXRpbHMuZGVzdHJveU1CZWFuKGVSZWFsbSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhlIEVuZ2luZSBpdHNlbGYKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIkRlc3Ryb3lpbmcgTUJlYW4gZm9yIEVuZ2luZSAiICsgZW5naW5lKTsKKyAgICAgICAgfQorICAgICAgICAvL01CZWFuVXRpbHMuZGVzdHJveU1CZWFuKGVuZ2luZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBIb3N0IGFuZCBpdHMgbmVzdGVkIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaG9zdCBIb3N0IGZvciB3aGljaCB0byBkZXN0cm95IE1CZWFucworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgTUJlYW4gZGVzdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXN0cm95TUJlYW5zKEhvc3QgaG9zdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRGVyZWdpc3RlciBvdXJzZWx2ZXMgYXMgYSBDb250YWluZXJMaXN0ZW5lcgorICAgICAgICBob3N0LnJlbW92ZUNvbnRhaW5lckxpc3RlbmVyKHRoaXMpOworCisgICAgICAgIC8vIERlcmVnaXN0ZXIgdGhlIE1CZWFucyBmb3IgZWFjaCBjaGlsZCBDb250ZXh0CisgICAgICAgIENvbnRhaW5lciBjb250ZXh0c1tdID0gaG9zdC5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBjb250ZXh0cy5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgZGVzdHJveU1CZWFucygoQ29udGV4dCkgY29udGV4dHNba10pOworICAgICAgICB9CisKKworICAgICAgICAvLyBEZXJlZ2lzdGVyIHRoZSBNQmVhbnMgZm9yIHRoZSBhc3NvY2lhdGVkIG5lc3RlZCBjb21wb25lbnRzCisgICAgICAgIFJlYWxtIGVSZWFsbSA9IGhvc3QuZ2V0UGFyZW50KCkuZ2V0UmVhbG0oKTsKKyAgICAgICAgUmVhbG0gaFJlYWxtID0gaG9zdC5nZXRSZWFsbSgpOworICAgICAgICBpZiAoKGhSZWFsbSAhPSBudWxsKSAmJiAoaFJlYWxtICE9IGVSZWFsbSkpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRlc3Ryb3lpbmcgTUJlYW4gZm9yIFJlYWxtICIgKyBoUmVhbG0pOworICAgICAgICAgICAgLy9NQmVhblV0aWxzLmRlc3Ryb3lNQmVhbihoUmVhbG0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGVyZWdpc3RlciB0aGUgTUJlYW4gZm9yIHRoZSBIb3N0IGl0c2VsZgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzdHJveWluZyBNQmVhbiBmb3IgSG9zdCAiICsgaG9zdCk7CisgICAgICAgIH0KKyAgICAgICAgLy9NQmVhblV0aWxzLmRlc3Ryb3lNQmVhbihob3N0KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVyZWdpc3RlciB0aGUgTUJlYW5zIGZvciB0aGUgc3BlY2lmaWVkIE5hbWluZ1Jlc291cmNlcyBhbmQgaXRzCisgICAgICogbmVzdGVkIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIE5hbWluZ1Jlc291cmNlcyBmb3Igd2hpY2ggdG8gZGVzdHJveSBNQmVhbnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIE1CZWFuIGRlc3RydWN0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVzdHJveU1CZWFucyhOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBEZXN0cm95IHRoZSBNQmVhbnMgZm9yIGVhY2ggY2hpbGQgcmVzb3VyY2UgZW50cnkKKyAgICAgICAgQ29udGV4dFJlc291cmNlIGNyZXNvdXJjZXNbXSA9IHJlc291cmNlcy5maW5kUmVzb3VyY2VzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3Jlc291cmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZGVzdHJveU1CZWFucyhjcmVzb3VyY2VzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlc3Ryb3kgdGhlIE1CZWFucyBmb3IgZWFjaCBjaGlsZCByZXNvdXJjZSBsaW5rIGVudHJ5CisgICAgICAgIENvbnRleHRSZXNvdXJjZUxpbmsgY3Jlc291cmNlbGlua3NbXSA9IHJlc291cmNlcy5maW5kUmVzb3VyY2VMaW5rcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNyZXNvdXJjZWxpbmtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBkZXN0cm95TUJlYW5zKGNyZXNvdXJjZWxpbmtzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlc3Ryb3kgdGhlIE1CZWFucyBmb3IgZWFjaCBjaGlsZCBlbnZpcm9ubWVudCBlbnRyeQorICAgICAgICBDb250ZXh0RW52aXJvbm1lbnQgZW52aXJvbm1lbnRzW10gPSByZXNvdXJjZXMuZmluZEVudmlyb25tZW50cygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudmlyb25tZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZGVzdHJveU1CZWFucyhlbnZpcm9ubWVudHNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGVzdHJveSB0aGUgTUJlYW4gZm9yIHRoZSBOYW1pbmdSZXNvdXJjZXMgaXRzZWxmCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXN0cm95aW5nIE1CZWFuIGZvciBOYW1pbmdSZXNvdXJjZXMgIiArIHJlc291cmNlcyk7CisgICAgICAgIH0KKyAgICAgICAgTUJlYW5VdGlscy5kZXN0cm95TUJlYW4ocmVzb3VyY2VzKTsKKyAgICAgICAgcmVzb3VyY2VzLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBTZXJ2ZXIgYW5kIGl0cyByZWxhdGVkCisgICAgICogY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2ZXIgU2VydmVyIGZvciB3aGljaCB0byBkZXN0cm95IE1CZWFucworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgTUJlYW4gZGVzdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXN0cm95TUJlYW5zKFNlcnZlciBzZXJ2ZXIpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIERlc3Ryb3kgdGhlIE1CZWFucyBmb3IgdGhlIGdsb2JhbCBOYW1pbmdSZXNvdXJjZXMgKGlmIGFueSkKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIHJlc291cmNlcyA9IHNlcnZlci5nZXRHbG9iYWxOYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBkZXN0cm95TUJlYW5zKHJlc291cmNlcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXN0cm95IHRoZSBNQmVhbnMgZm9yIGVhY2ggY2hpbGQgU2VydmljZQorICAgICAgICBTZXJ2aWNlIHNlcnZpY2VzW10gPSBzZXJ2ZXIuZmluZFNlcnZpY2VzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIEZJWE1FIC0gV2FycCBvYmplY3QgaGllcmFyY2h5IG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgICAgICAgICBpZiAoc2VydmljZXNbaV0uZ2V0Q29udGFpbmVyKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzCisgICAgICAgICAgICAgICAgKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci53YXJwLldhcnBFbmdpbmUiKSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNraXBwaW5nIE1CZWFuIGZvciBTZXJ2aWNlICIgKyBzZXJ2aWNlc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdHJveU1CZWFucyhzZXJ2aWNlc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXN0cm95IHRoZSBNQmVhbiBmb3IgdGhlIFNlcnZlciBpdHNlbGYKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIkRlc3Ryb3lpbmcgTUJlYW4gZm9yIFNlcnZlciAiICsgc2VydmVyKTsKKyAgICAgICAgfQorICAgICAgICAvL01CZWFuVXRpbHMuZGVzdHJveU1CZWFuKHNlcnZlcik7CisgICAgICAgIGlmIChzZXJ2ZXIgaW5zdGFuY2VvZiBTdGFuZGFyZFNlcnZlcikgeworICAgICAgICAgICAgKChTdGFuZGFyZFNlcnZlcikgc2VydmVyKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBTZXJ2aWNlIGFuZCBpdHMgbmVzdGVkCisgICAgICogY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFNlcnZpY2UgZm9yIHdoaWNoIHRvIGRlc3Ryb3kgTUJlYW5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBNQmVhbiBkZXN0cnVjdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlc3Ryb3lNQmVhbnMoU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBEZXJlZ2lzdGVyIHRoZSBNQmVhbnMgZm9yIHRoZSBhc3NvY2lhdGVkIEVuZ2luZQorICAgICAgICBFbmdpbmUgZW5naW5lID0gKEVuZ2luZSkgc2VydmljZS5nZXRDb250YWluZXIoKTsKKyAgICAgICAgaWYgKGVuZ2luZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvL2Rlc3Ryb3lNQmVhbnMoZW5naW5lKTsKKyAgICAgICAgfQorCisvLyAgICAgICAgLy8gRGVyZWdpc3RlciB0aGUgTUJlYW5zIGZvciB0aGUgY29ycmVzcG9uZGluZyBDb25uZWN0b3JzCisvLyAgICAgICAgQ29ubmVjdG9yIGNvbm5lY3RvcnNbXSA9IHNlcnZpY2UuZmluZENvbm5lY3RvcnMoKTsKKy8vICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbm5lY3RvcnMubGVuZ3RoOyBqKyspIHsKKy8vICAgICAgICAgICAgZGVzdHJveU1CZWFucyhjb25uZWN0b3JzW2pdLCBzZXJ2aWNlKTsKKy8vICAgICAgICB9CisKKyAgICAgICAgLy8gRGVyZWdpc3RlciB0aGUgTUJlYW4gZm9yIHRoZSBTZXJ2aWNlIGl0c2VsZgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzdHJveWluZyBNQmVhbiBmb3IgU2VydmljZSAiICsgc2VydmljZSk7CisgICAgICAgIH0KKyAgICAgICAgLy9NQmVhblV0aWxzLmRlc3Ryb3lNQmVhbihzZXJ2aWNlKTsKKyAgICAgICAgaWYgKHNlcnZpY2UgaW5zdGFuY2VvZiBTdGFuZGFyZFNlcnZpY2UpIHsKKyAgICAgICAgICAgICgoU3RhbmRhcmRTZXJ2aWNlKSBzZXJ2aWNlKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGFkZGl0aW9uIG9mIGEgbmV3IGNoaWxkIENvbnRhaW5lciB0byBhIHBhcmVudCBDb250YWluZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IFBhcmVudCBjb250YWluZXIKKyAgICAgKiBAcGFyYW0gY2hpbGQgQ2hpbGQgY29udGFpbmVyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NvbnRhaW5lckFkZENoaWxkKENvbnRhaW5lciBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lciBjaGlsZCkgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHJvY2VzcyBhZGRDaGlsZFtwYXJlbnQ9IiArIHBhcmVudCArICIsY2hpbGQ9IiArIGNoaWxkICsgIl0iKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29udGV4dCkgeworICAgICAgICAgICAgICAgIGNyZWF0ZU1CZWFucygoQ29udGV4dCkgY2hpbGQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIEVuZ2luZSkgeworICAgICAgICAgICAgICAgIGNyZWF0ZU1CZWFucygoRW5naW5lKSBjaGlsZCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgSG9zdCkgeworICAgICAgICAgICAgICAgIGNyZWF0ZU1CZWFucygoSG9zdCkgY2hpbGQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChNQmVhbkV4Y2VwdGlvbiB0KSB7CisgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHQuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICBpZiAoZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGUgPSB0OworICAgICAgICAgICAgbG9nLmVycm9yKCJwcm9jZXNzQ29udGFpbmVyQWRkQ2hpbGQ6IE1CZWFuRXhjZXB0aW9uIiwgZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoInByb2Nlc3NDb250YWluZXJBZGRDaGlsZDogVGhyb3dhYmxlIiwgdCk7CisgICAgICAgIH0KKworICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgb24gYSBDb250YWluZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb24gd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZAorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZAorICAgICAqIEBwYXJhbSBvbGRWYWx1ZSBUaGUgcHJldmlvdXMgdmFsdWUgKG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPikKKyAgICAgKiBAcGFyYW0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZSAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93bgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NDb250YWluZXJQcm9wZXJ0eUNoYW5nZShDb250YWluZXIgY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBuZXdWYWx1ZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cudHJhY2UoInByb3BlcnR5Q2hhbmdlW2NvbnRhaW5lcj0iICsgY29udGFpbmVyICsKKyAgICAgICAgICAgICAgICAiLHByb3BlcnR5TmFtZT0iICsgcHJvcGVydHlOYW1lICsKKyAgICAgICAgICAgICAgICAiLG9sZFZhbHVlPSIgKyBvbGRWYWx1ZSArCisgICAgICAgICAgICAgICAgIixuZXdWYWx1ZT0iICsgbmV3VmFsdWUgKyAiXSIpOworICAgICAgICB9CisgICAgICAgIGlmICgibG9hZGVyIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZW1vdmluZyBNQmVhbiBmb3IgTG9hZGVyICIgKyBvbGRWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1CZWFuVXRpbHMuZGVzdHJveU1CZWFuKChMb2FkZXIpIG9sZFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW4gZm9yIExvYWRlciAiICsgbmV3VmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU1CZWFuKChMb2FkZXIpIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgibG9nZ2VyIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZW1vdmluZyBNQmVhbiBmb3IgTG9nZ2VyICIgKyBvbGRWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgLy8gTUJlYW5VdGlscy5kZXN0cm95TUJlYW4oKExvZ2dlcikgb2xkVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgTG9nZ2VyICIgKyBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vTUJlYW5VdGlscy5jcmVhdGVNQmVhbigoTG9nZ2VyKSBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIm1hbmFnZXIiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlbW92aW5nIE1CZWFuIGZvciBNYW5hZ2VyICIgKyBvbGRWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vTUJlYW5VdGlscy5kZXN0cm95TUJlYW4oKE1hbmFnZXIpIG9sZFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW4gZm9yIE1hbmFnZXIgIiArIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9NQmVhblV0aWxzLmNyZWF0ZU1CZWFuKChNYW5hZ2VyKSBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoInJlYWxtIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZW1vdmluZyBNQmVhbiBmb3IgUmVhbG0gIiArIG9sZFZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5kZXN0cm95TUJlYW4oKFJlYWxtKSBvbGRWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBSZWFsbSAiICsgbmV3VmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL01CZWFuVXRpbHMuY3JlYXRlTUJlYW4oKFJlYWxtKSBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoInNlcnZpY2UiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlc3Ryb3lNQmVhbnMoKFNlcnZpY2UpIG9sZFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3JlYXRlTUJlYW5zKChTZXJ2aWNlKSBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIHByb3BlcnR5IGNoYW5nZSBldmVudCBvbiBhIERlZmF1bHRDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGRlZmF1bHRDb250ZXh0IFRoZSBEZWZhdWx0Q29udGV4dCBvbiB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCisgICAgICogQHBhcmFtIG9sZFZhbHVlIFRoZSBwcmV2aW91cyB2YWx1ZSAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQorICAgICAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIChtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4pCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duCisgICAgICovCisgICAgLyoKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRGVmYXVsdENvbnRleHRQcm9wZXJ0eUNoYW5nZShEZWZhdWx0Q29udGV4dCBkZWZhdWx0Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbmV3VmFsdWUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLnRyYWNlKCJwcm9wZXJ0eUNoYW5nZVtkZWZhdWx0Q29udGV4dD0iICsgZGVmYXVsdENvbnRleHQgKworICAgICAgICAgICAgICAgICIscHJvcGVydHlOYW1lPSIgKyBwcm9wZXJ0eU5hbWUgKworICAgICAgICAgICAgICAgICIsb2xkVmFsdWU9IiArIG9sZFZhbHVlICsKKyAgICAgICAgICAgICAgICAiLG5ld1ZhbHVlPSIgKyBuZXdWYWx1ZSArICJdIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCJsb2FkZXIiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlbW92aW5nIE1CZWFuIGZvciBMb2FkZXIgIiArIG9sZFZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5kZXN0cm95TUJlYW4oKExvYWRlcikgb2xkVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgTG9hZGVyICIgKyBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlTUJlYW4oKExvYWRlcikgbmV3VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCJsb2dnZXIiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlbW92aW5nIE1CZWFuIGZvciBMb2dnZXIgIiArIG9sZFZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9NQmVhblV0aWxzLmRlc3Ryb3lNQmVhbigoTG9nZ2VyKSBvbGRWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBMb2dnZXIgIiArIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9NQmVhblV0aWxzLmNyZWF0ZU1CZWFuKChMb2dnZXIpIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgibWFuYWdlciIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVtb3ZpbmcgTUJlYW4gZm9yIE1hbmFnZXIgIiArIG9sZFZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5kZXN0cm95TUJlYW4oKE1hbmFnZXIpIG9sZFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW4gZm9yIE1hbmFnZXIgIiArIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVNQmVhbigoTWFuYWdlcikgbmV3VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCJyZWFsbSIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7CisvLyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKy8vICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlbW92aW5nIE1CZWFuIGZvciBSZWFsbSAiICsgb2xkVmFsdWUpOworLy8gICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICAgICAgLy9NQmVhblV0aWxzLmRlc3Ryb3lNQmVhbigoUmVhbG0pIG9sZFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisvLyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKy8vICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBSZWFsbSAiICsgbmV3VmFsdWUpOworLy8gICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICAgICAgLy9NQmVhblV0aWxzLmNyZWF0ZU1CZWFuKChSZWFsbSkgbmV3VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCJzZXJ2aWNlIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0cm95TUJlYW5zKChTZXJ2aWNlKSBvbGRWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNyZWF0ZU1CZWFucygoU2VydmljZSkgbmV3VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9Ki8KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgcmVtb3ZhbCBvZiBhIGNoaWxkIENvbnRhaW5lciBmcm9tIGEgcGFyZW50IENvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgUGFyZW50IGNvbnRhaW5lcgorICAgICAqIEBwYXJhbSBjaGlsZCBDaGlsZCBjb250YWluZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ29udGFpbmVyUmVtb3ZlQ2hpbGQoQ29udGFpbmVyIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyIGNoaWxkKSB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9jZXNzIHJlbW92ZUNoaWxkW3BhcmVudD0iICsgcGFyZW50ICsgIixjaGlsZD0iICsKKyAgICAgICAgICAgICAgICBjaGlsZCArICJdIik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgY2hpbGQ7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0UHJpdmlsZWdlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKS5yZW1vdmVBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgIChHbG9iYWxzLk1CRUFOX1JFR0lTVFJZX0FUVFIpOworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkucmVtb3ZlQXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAoR2xvYmFscy5NQkVBTl9TRVJWRVJfQVRUUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFJlbW92aW5nIE1CZWFuIGZvciBDb250ZXh0ICIgKyBjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBkZXN0cm95TUJlYW5zKGNvbnRleHQpOworICAgICAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICgoU3RhbmRhcmRDb250ZXh0KSBjb250ZXh0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIEhvc3QpIHsKKyAgICAgICAgICAgICAgICBIb3N0IGhvc3QgPSAoSG9zdCkgY2hpbGQ7CisgICAgICAgICAgICAgICAgZGVzdHJveU1CZWFucyhob3N0KTsKKyAgICAgICAgICAgICAgICBpZiAoaG9zdCBpbnN0YW5jZW9mIFN0YW5kYXJkSG9zdCkgeworICAgICAgICAgICAgICAgICAgICAoKFN0YW5kYXJkSG9zdCkgaG9zdCkuCisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTUJlYW5FeGNlcHRpb24gdCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSB0LmdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBlID0gdDsKKyAgICAgICAgICAgIGxvZy5lcnJvcigicHJvY2Vzc0NvbnRhaW5lclJlbW92ZUNoaWxkOiBNQmVhbkV4Y2VwdGlvbiIsIGUpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJwcm9jZXNzQ29udGFpbmVyUmVtb3ZlQ2hpbGQ6IFRocm93YWJsZSIsIHQpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgb24gYSBOYW1pbmdSZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSBnbG9iYWwgbmFtaW5nIHJlc291cmNlcyBvbiB3aGljaCB0aGlzCisgICAgICogIGV2ZW50IG9jY3VycmVkCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCisgICAgICogQHBhcmFtIG9sZFZhbHVlIFRoZSBwcmV2aW91cyB2YWx1ZSAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQorICAgICAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIChtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4pCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc05hbWluZ1Jlc291cmNlc1Byb3BlcnR5Q2hhbmdlCisgICAgICAgIChOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzLCBTdHJpbmcgcHJvcGVydHlOYW1lLAorICAgICAgICAgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLnRyYWNlKCJwcm9wZXJ0eUNoYW5nZVtuYW1pbmdSZXNvdXJjZXM9IiArIHJlc291cmNlcyArCisgICAgICAgICAgICAgICAgIixwcm9wZXJ0eU5hbWU9IiArIHByb3BlcnR5TmFtZSArCisgICAgICAgICAgICAgICAgIixvbGRWYWx1ZT0iICsgb2xkVmFsdWUgKworICAgICAgICAgICAgICAgICIsbmV3VmFsdWU9IiArIG5ld1ZhbHVlICsgIl0iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FIC0gQWRkIG90aGVyIHJlc291cmNlIHR5cGVzIHdoZW4gc3VwcG9ydGVkIGJ5IGFkbWluIHRvb2wKKyAgICAgICAgaWYgKCJlbnZpcm9ubWVudCIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVzdHJveU1CZWFucygoQ29udGV4dEVudmlyb25tZW50KSBvbGRWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNyZWF0ZU1CZWFucygoQ29udGV4dEVudmlyb25tZW50KSBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoInJlc291cmNlIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0cm95TUJlYW5zKChDb250ZXh0UmVzb3VyY2UpIG9sZFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3JlYXRlTUJlYW5zKChDb250ZXh0UmVzb3VyY2UpIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgicmVzb3VyY2VMaW5rIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0cm95TUJlYW5zKChDb250ZXh0UmVzb3VyY2VMaW5rKSBvbGRWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNyZWF0ZU1CZWFucygoQ29udGV4dFJlc291cmNlTGluaykgbmV3VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgb24gYSBTZXJ2ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmVyIFRoZSBzZXJ2ZXIgb24gd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZAorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZAorICAgICAqIEBwYXJhbSBvbGRWYWx1ZSBUaGUgcHJldmlvdXMgdmFsdWUgKG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPikKKyAgICAgKiBAcGFyYW0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZSAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93bgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NTZXJ2ZXJQcm9wZXJ0eUNoYW5nZShTZXJ2ZXIgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBuZXdWYWx1ZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cudHJhY2UoInByb3BlcnR5Q2hhbmdlW3NlcnZlcj0iICsgc2VydmVyICsKKyAgICAgICAgICAgICAgICAiLHByb3BlcnR5TmFtZT0iICsgcHJvcGVydHlOYW1lICsKKyAgICAgICAgICAgICAgICAiLG9sZFZhbHVlPSIgKyBvbGRWYWx1ZSArCisgICAgICAgICAgICAgICAgIixuZXdWYWx1ZT0iICsgbmV3VmFsdWUgKyAiXSIpOworICAgICAgICB9CisgICAgICAgIGlmICgiZ2xvYmFsTmFtaW5nUmVzb3VyY2VzIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0cm95TUJlYW5zKChOYW1pbmdSZXNvdXJjZXMpIG9sZFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3JlYXRlTUJlYW5zKChOYW1pbmdSZXNvdXJjZXMpIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgic2VydmljZSIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVzdHJveU1CZWFucygoU2VydmljZSkgb2xkVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVNQmVhbnMoKFNlcnZpY2UpIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IG9uIGEgU2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlIG9uIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQKKyAgICAgKiBAcGFyYW0gb2xkVmFsdWUgVGhlIHByZXZpb3VzIHZhbHVlIChtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4pCisgICAgICogQHBhcmFtIG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgKG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPikKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzU2VydmljZVByb3BlcnR5Q2hhbmdlKFNlcnZpY2Ugc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbmV3VmFsdWUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLnRyYWNlKCJwcm9wZXJ0eUNoYW5nZVtzZXJ2aWNlPSIgKyBzZXJ2aWNlICsKKyAgICAgICAgICAgICAgICAiLHByb3BlcnR5TmFtZT0iICsgcHJvcGVydHlOYW1lICsKKyAgICAgICAgICAgICAgICAiLG9sZFZhbHVlPSIgKyBvbGRWYWx1ZSArCisgICAgICAgICAgICAgICAgIixuZXdWYWx1ZT0iICsgbmV3VmFsdWUgKyAiXSIpOworICAgICAgICB9CisgICAgICAgIGlmICgiY29ubmVjdG9yIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0cm95TUJlYW5zKChDb25uZWN0b3IpIG9sZFZhbHVlLCBzZXJ2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3JlYXRlTUJlYW5zKChDb25uZWN0b3IpIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgiY29udGFpbmVyIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0cm95TUJlYW5zKChFbmdpbmUpIG9sZFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3JlYXRlTUJlYW5zKChFbmdpbmUpIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvU3RhbmRhcmRDb250ZXh0TUJlYW4uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvU3RhbmRhcmRDb250ZXh0TUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGI0NTFiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9TdGFuZGFyZENvbnRleHRNQmVhbi5qYXZhCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVudmlyb25tZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VMaW5rOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk5hbWluZ1Jlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5CYXNlTW9kZWxNQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5NYW5hZ2VkQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmNvbXBhdC5KZGtDb21wYXQ7CisKKy8qKgorICogPHA+QSA8c3Ryb25nPk1vZGVsTUJlYW48L3N0cm9uZz4gaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICogPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDwvY29kZT4gY29tcG9uZW50LjwvcD4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFN0YW5kYXJkQ29udGV4dE1CZWFuIGV4dGVuZHMgQmFzZU1vZGVsTUJlYW4geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgPGNvZGU+TW9kZWxNQmVhbjwvY29kZT4gd2l0aCBkZWZhdWx0CisgICAgICogPGNvZGU+TW9kZWxNQmVhbkluZm88L2NvZGU+IGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gb2JqZWN0CisgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIGlmIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhbmRhcmRDb250ZXh0TUJlYW4oKQorICAgICAgICB0aHJvd3MgTUJlYW5FeGNlcHRpb24sIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlcigpOworCisgICAgfQorICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xhc3MgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIEpESyBjb21wYXRpYmlsaXR5IHN1cHBvcnQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKZGtDb21wYXQgamRrQ29tcGF0ID0gSmRrQ29tcGF0LmdldEpka0NvbXBhdCgpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiByZWdpc3RyeSBmb3Igb3VyIG1hbmFnZWQgYmVhbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gTUJlYW5VdGlscy5jcmVhdGVSZWdpc3RyeSgpOworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPk1hbmFnZWRCZWFuPC9jb2RlPiBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoaXMgTUJlYW4uCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hbmFnZWRCZWFuIG1hbmFnZWQgPQorICAgICAgICByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4oIlN0YW5kYXJkQ29udGV4dCIpOworCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBdHRyaWJ1dGVzCisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgTmFtaW5nUmVzb3VyY2VzIGdldE5hbWluZ1Jlc291cmNlcygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiAoKFN0YW5kYXJkQ29udGV4dCl0aGlzLnJlc291cmNlKS5nZXROYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1pbmcgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxvYWQoKSB7CisgICAgICAgIAorICAgICAgICAoKFN0YW5kYXJkQ29udGV4dCl0aGlzLnJlc291cmNlKS5yZWxvYWQoKTsKKyAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lcyBvZiB0aGUgc2V0IG9mIGRlZmluZWQgZW52aXJvbm1lbnQgZW50cmllcyBmb3IgIAorICAgICAqIHRoaXMgd2ViIGFwcGxpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEVudmlyb25tZW50cygpIHsKKyAgICAgICAgQ29udGV4dEVudmlyb25tZW50W10gZW52cyA9IGdldE5hbWluZ1Jlc291cmNlcygpLmZpbmRFbnZpcm9ubWVudHMoKTsKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW52cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVPYmplY3ROYW1lKG1hbmFnZWQuZ2V0RG9tYWluKCksIGVudnNbaV0pOworICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIG9iamVjdCBuYW1lIGZvciBlbnZpcm9ubWVudCAiICsgZW52c1tpXSk7CisgICAgICAgICAgICAgICAgamRrQ29tcGF0LmNoYWluRXhjZXB0aW9uKGlhZSwgZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pKTsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1CZWFuIE5hbWVzIG9mIGFsbCB0aGUgZGVmaW5lZCByZXNvdXJjZSByZWZlcmVuY2VzIGZvciB0aGlzCisgICAgICogYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlcygpIHsKKyAgICAgICAgCisgICAgICAgIENvbnRleHRSZXNvdXJjZVtdIHJlc291cmNlcyA9IGdldE5hbWluZ1Jlc291cmNlcygpLmZpbmRSZXNvdXJjZXMoKTsKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgcmVzb3VyY2VzW2ldKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBvYmplY3QgbmFtZSBmb3IgcmVzb3VyY2UgIiArIHJlc291cmNlc1tpXSk7CisgICAgICAgICAgICAgICAgamRrQ29tcGF0LmNoYWluRXhjZXB0aW9uKGlhZSwgZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pKTsKKworICAgIH0KKworICAgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lcyBvZiBhbGwgdGhlIGRlZmluZWQgcmVzb3VyY2UgbGlua3MgZm9yIHRoaXMgCisgICAgICogYXBwbGljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVzb3VyY2VMaW5rcygpIHsKKyAgICAgICAgCisgICAgICAgIENvbnRleHRSZXNvdXJjZUxpbmtbXSBsaW5rcyA9IGdldE5hbWluZ1Jlc291cmNlcygpLmZpbmRSZXNvdXJjZUxpbmtzKCk7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgbGlua3NbaV0pOworICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIG9iamVjdCBuYW1lIGZvciByZXNvdXJjZSAiICsgbGlua3NbaV0pOworICAgICAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtaW5nIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dCBnZXRTdGF0aWNSZXNvdXJjZXMoKSB7CisKKyAgICAgICAgcmV0dXJuICgoU3RhbmRhcmRDb250ZXh0KXRoaXMucmVzb3VyY2UpLmdldFJlc291cmNlcygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWxjb21lRmlsZXMoKSB7CisKKyAgICAgICAgcmV0dXJuICgoU3RhbmRhcmRDb250ZXh0KXRoaXMucmVzb3VyY2UpLmZpbmRXZWxjb21lRmlsZXMoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zCisKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBlbnZpcm9ubWVudCBlbnRyeSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW52TmFtZSBOZXcgZW52aXJvbm1lbnQgZW50cnkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgYWRkRW52aXJvbm1lbnQoU3RyaW5nIGVudk5hbWUsIFN0cmluZyB0eXBlKSAKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIENvbnRleHRFbnZpcm9ubWVudCBlbnYgPSBucmVzb3VyY2VzLmZpbmRFbnZpcm9ubWVudChlbnZOYW1lKTsKKyAgICAgICAgaWYgKGVudiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIGVudmlyb25tZW50IG5hbWUgLSBhbHJlYWR5IGV4aXN0cyAnIiArIGVudk5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIGVudiA9IG5ldyBDb250ZXh0RW52aXJvbm1lbnQoKTsKKyAgICAgICAgZW52LnNldE5hbWUoZW52TmFtZSk7CisgICAgICAgIGVudi5zZXRUeXBlKHR5cGUpOworICAgICAgICBucmVzb3VyY2VzLmFkZEVudmlyb25tZW50KGVudik7CisgICAgICAgIAorICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKCJDb250ZXh0RW52aXJvbm1lbnQiKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgZW52KTsKKyAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgCisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQWRkIGEgcmVzb3VyY2UgcmVmZXJlbmNlIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgTmV3IHJlc291cmNlIHJlZmVyZW5jZSBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhZGRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lLCBTdHJpbmcgdHlwZSkgCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIENvbnRleHRSZXNvdXJjZSByZXNvdXJjZSA9IG5yZXNvdXJjZXMuZmluZFJlc291cmNlKHJlc291cmNlTmFtZSk7CisgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIHJlc291cmNlIG5hbWUgLSBhbHJlYWR5IGV4aXN0cyciICsgcmVzb3VyY2VOYW1lICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICByZXNvdXJjZSA9IG5ldyBDb250ZXh0UmVzb3VyY2UoKTsKKyAgICAgICAgcmVzb3VyY2Uuc2V0TmFtZShyZXNvdXJjZU5hbWUpOworICAgICAgICByZXNvdXJjZS5zZXRUeXBlKHR5cGUpOworICAgICAgICBucmVzb3VyY2VzLmFkZFJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgCisgICAgICAgIC8vIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyBNQmVhbiBuYW1lCisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4oIkNvbnRleHRSZXNvdXJjZSIpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShtYW5hZ2VkLmdldERvbWFpbigpLCByZXNvdXJjZSk7CisgICAgICAgIHJldHVybiAob25hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQWRkIGEgcmVzb3VyY2UgbGluayBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VMaW5rTmFtZSBOZXcgcmVzb3VyY2UgbGluayBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhZGRSZXNvdXJjZUxpbmsoU3RyaW5nIHJlc291cmNlTGlua05hbWUsIFN0cmluZyBnbG9iYWwsIAorICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSkgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIG5yZXNvdXJjZXMgPSBnZXROYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgaWYgKG5yZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgQ29udGV4dFJlc291cmNlTGluayByZXNvdXJjZUxpbmsgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJlc291cmNlcy5maW5kUmVzb3VyY2VMaW5rKHJlc291cmNlTGlua05hbWUpOworICAgICAgICBpZiAocmVzb3VyY2VMaW5rICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgcmVzb3VyY2UgbGluayBuYW1lIC0gYWxyZWFkeSBleGlzdHMnIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUxpbmtOYW1lICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICByZXNvdXJjZUxpbmsgPSBuZXcgQ29udGV4dFJlc291cmNlTGluaygpOworICAgICAgICByZXNvdXJjZUxpbmsuc2V0R2xvYmFsKGdsb2JhbCk7CisgICAgICAgIHJlc291cmNlTGluay5zZXROYW1lKHJlc291cmNlTGlua05hbWUpOworICAgICAgICByZXNvdXJjZUxpbmsuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgbnJlc291cmNlcy5hZGRSZXNvdXJjZUxpbmsocmVzb3VyY2VMaW5rKTsKKyAgICAgICAgCisgICAgICAgIC8vIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyBNQmVhbiBuYW1lCisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4oIkNvbnRleHRSZXNvdXJjZUxpbmsiKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgcmVzb3VyY2VMaW5rKTsKKyAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICB9ICAgIAorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgZW52aXJvbm1lbnQgZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW52TmFtZSBOYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVFbnZpcm9ubWVudChTdHJpbmcgZW52TmFtZSkgeworCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDb250ZXh0RW52aXJvbm1lbnQgZW52ID0gbnJlc291cmNlcy5maW5kRW52aXJvbm1lbnQoZW52TmFtZSk7CisgICAgICAgIGlmIChlbnYgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiSW52YWxpZCBlbnZpcm9ubWVudCBuYW1lICciICsgZW52TmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgbnJlc291cmNlcy5yZW1vdmVFbnZpcm9ubWVudChlbnZOYW1lKTsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IHJlc291cmNlIHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgTmFtZSBvZiB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlKFN0cmluZyByZXNvdXJjZU5hbWUpIHsKKworICAgICAgICByZXNvdXJjZU5hbWUgPSBPYmplY3ROYW1lLnVucXVvdGUocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIG5yZXNvdXJjZXMgPSBnZXROYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgaWYgKG5yZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIENvbnRleHRSZXNvdXJjZSByZXNvdXJjZSA9IG5yZXNvdXJjZXMuZmluZFJlc291cmNlKHJlc291cmNlTmFtZSk7CisgICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIHJlc291cmNlIG5hbWUgJyIgKyByZXNvdXJjZU5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIG5yZXNvdXJjZXMucmVtb3ZlUmVzb3VyY2UocmVzb3VyY2VOYW1lKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSByZXNvdXJjZSBsaW5rIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlTGlua05hbWUgTmFtZSBvZiB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlTGluayhTdHJpbmcgcmVzb3VyY2VMaW5rTmFtZSkgeworCisgICAgICAgIHJlc291cmNlTGlua05hbWUgPSBPYmplY3ROYW1lLnVucXVvdGUocmVzb3VyY2VMaW5rTmFtZSk7CisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDb250ZXh0UmVzb3VyY2VMaW5rIHJlc291cmNlID0gbnJlc291cmNlcy5maW5kUmVzb3VyY2VMaW5rKHJlc291cmNlTGlua05hbWUpOworICAgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiSW52YWxpZCByZXNvdXJjZSBuYW1lICciICsgcmVzb3VyY2VMaW5rTmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgbnJlc291cmNlcy5yZW1vdmVSZXNvdXJjZUxpbmsocmVzb3VyY2VMaW5rTmFtZSk7CisgICAgfQorIAorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9TdGFuZGFyZEVuZ2luZU1CZWFuLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL1N0YW5kYXJkRW5naW5lTUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDIxZWZmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9TdGFuZGFyZEVuZ2luZU1CZWFuLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnM7CisKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLkJhc2VNb2RlbE1CZWFuOworCisKKy8qKgorICogPHA+QSA8c3Ryb25nPk1vZGVsTUJlYW48L3N0cm9uZz4gaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICogPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lPC9jb2RlPiBjb21wb25lbnQuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRFbmdpbmVNQmVhbiBleHRlbmRzIEJhc2VNb2RlbE1CZWFuIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSA8Y29kZT5Nb2RlbE1CZWFuPC9jb2RlPiB3aXRoIGRlZmF1bHQKKyAgICAgKiA8Y29kZT5Nb2RlbE1CZWFuSW5mbzwvY29kZT4gaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiBhbiBvYmplY3QKKyAgICAgKiAgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24gaWYgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBTdGFuZGFyZEVuZ2luZU1CZWFuKCkKKyAgICAgICAgdGhyb3dzIE1CZWFuRXhjZXB0aW9uLCBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBdHRyaWJ1dGVzCisKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zCisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9TdGFuZGFyZEhvc3RNQmVhbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9TdGFuZGFyZEhvc3RNQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYWE1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL1N0YW5kYXJkSG9zdE1CZWFuLmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zOworCisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5CYXNlTW9kZWxNQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5NYW5hZ2VkQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKKworCisvKioKKyAqIDxwPkEgPHN0cm9uZz5Nb2RlbE1CZWFuPC9zdHJvbmc+IGltcGxlbWVudGF0aW9uIGZvciB0aGUKKyAqIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3Q8L2NvZGU+IGNvbXBvbmVudC48L3A+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTdGFuZGFyZEhvc3RNQmVhbiBleHRlbmRzIEJhc2VNb2RlbE1CZWFuIHsKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NQmVhblNlcnZlcjwvY29kZT4gZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IE1CZWFuVXRpbHMuY3JlYXRlU2VydmVyKCk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgPGNvZGU+TW9kZWxNQmVhbjwvY29kZT4gd2l0aCBkZWZhdWx0CisgICAgICogPGNvZGU+TW9kZWxNQmVhbkluZm88L2NvZGU+IGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gb2JqZWN0CisgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIGlmIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhbmRhcmRIb3N0TUJlYW4oKQorICAgICAgICB0aHJvd3MgTUJlYW5FeGNlcHRpb24sIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlcigpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMKKworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGlvbnMKKworCisgICAvKioKKyAgICAgKiBBZGQgYW4gYWxpYXMgbmFtZSB0aGF0IHNob3VsZCBiZSBtYXBwZWQgdG8gdGhpcyBIb3N0CisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxpYXMgVGhlIGFsaWFzIHRvIGJlIGFkZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQWxpYXMoU3RyaW5nIGFsaWFzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdGFuZGFyZEhvc3QgaG9zdCA9IChTdGFuZGFyZEhvc3QpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIGhvc3QuYWRkQWxpYXMoYWxpYXMpOworCisgICAgfQorCisKKyAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGFsaWFzIG5hbWVzIGZvciB0aGlzIEhvc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIFtdIGZpbmRBbGlhc2VzKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RhbmRhcmRIb3N0IGhvc3QgPSAoU3RhbmRhcmRIb3N0KSB0aGlzLnJlc291cmNlOworICAgICAgICByZXR1cm4gaG9zdC5maW5kQWxpYXNlcygpOworCisgICAgfQorCisKKyAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUJlYW4gTmFtZXMgb2YgdGhlIFZhbHZlcyBhc3NvaWNhdGVkIHdpdGggdGhpcyBIb3N0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBbXSBnZXRWYWx2ZXMoKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBSZWdpc3RyeSByZWdpc3RyeSA9IE1CZWFuVXRpbHMuY3JlYXRlUmVnaXN0cnkoKTsKKyAgICAgICAgU3RhbmRhcmRIb3N0IGhvc3QgPSAoU3RhbmRhcmRIb3N0KSB0aGlzLnJlc291cmNlOworICAgICAgICBTdHJpbmcgbW5hbWUgPSBNQmVhblV0aWxzLmNyZWF0ZU1hbmFnZWROYW1lKGhvc3QpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisgICAgICAgIGlmIChtYW5hZ2VkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIFZhbHZlIFtdIHZhbHZlcyA9IGhvc3QuZ2V0VmFsdmVzKCk7CisgICAgICAgIFN0cmluZyBbXSBtYmVhbk5hbWVzID0gbmV3IFN0cmluZ1t2YWx2ZXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx2ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG1iZWFuTmFtZXNbaV0gPQorICAgICAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIHZhbHZlc1tpXSkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtYmVhbk5hbWVzOworCisgICAgfQorCisKKyAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGFsaWFzIG5hbWUgZnJvbSB0aGUgYWxpYXNlcyBmb3IgdGhpcyBIb3N0CisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxpYXMgQWxpYXMgbmFtZSB0byBiZSByZW1vdmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQWxpYXMoU3RyaW5nIGFsaWFzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdGFuZGFyZEhvc3QgaG9zdCA9IChTdGFuZGFyZEhvc3QpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIGhvc3QucmVtb3ZlQWxpYXMoYWxpYXMpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvU3RhbmRhcmRTZXJ2ZXJNQmVhbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9TdGFuZGFyZFNlcnZlck1CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI0ZWI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvU3RhbmRhcmRTZXJ2ZXJNQmVhbi5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zOworCisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkluc3RhbmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuQmFzZU1vZGVsTUJlYW47CisKKworLyoqCisgKiA8cD5BIDxzdHJvbmc+TW9kZWxNQmVhbjwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXI8L2NvZGU+IGNvbXBvbmVudC48L3A+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFNlcnZlck1CZWFuIGV4dGVuZHMgQmFzZU1vZGVsTUJlYW4geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgPGNvZGU+TW9kZWxNQmVhbjwvY29kZT4gd2l0aCBkZWZhdWx0CisgICAgICogPGNvZGU+TW9kZWxNQmVhbkluZm88L2NvZGU+IGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gb2JqZWN0CisgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIGlmIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhbmRhcmRTZXJ2ZXJNQmVhbigpCisgICAgICAgIHRocm93cyBNQmVhbkV4Y2VwdGlvbiwgUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXR0cmlidXRlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGlvbnMKKworCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoaXMgZW50aXJlIDxjb2RlPlNlcnZlcjwvY29kZT4KKyAgICAgKiBvdXQgdG8gdGhlIHNlcnZlci54bWwgY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBtYW5hZ2VkIHJlc291cmNlIG9iamVjdAorICAgICAqICBjYW5ub3QgYmUgZm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIE1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiB0aGUgb2JqZWN0IHRocm93cworICAgICAqICBhbiBleGNlcHRpb24sIG9yIHBlcnNpc3RlbmNlIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyByZXBvcnRlZAorICAgICAqICBieSB0aGUgcGVyc2lzdGVuY2UgbWVjaGFuaXNtCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3JlKCkgdGhyb3dzIEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24sCisgICAgICAgIE1CZWFuRXhjZXB0aW9uLCBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiB7CisKKyAgICAgICAgU2VydmVyIHNlcnZlciA9IFNlcnZlckZhY3RvcnkuZ2V0U2VydmVyKCk7CisgICAgICAgIGlmIChzZXJ2ZXIgaW5zdGFuY2VvZiBTdGFuZGFyZFNlcnZlcikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKFN0YW5kYXJkU2VydmVyKSBzZXJ2ZXIpLnN0b3JlQ29uZmlnKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlLCAiRXJyb3IgdXBkYXRpbmcgY29uZi9zZXJ2ZXIueG1sIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL1N0YW5kYXJkU2VydmljZU1CZWFuLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL1N0YW5kYXJkU2VydmljZU1CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxY2UwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvU3RhbmRhcmRTZXJ2aWNlTUJlYW4uamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuczsKKworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuQmFzZU1vZGVsTUJlYW47CisKKworLyoqCisgKiA8cD5BIDxzdHJvbmc+TW9kZWxNQmVhbjwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2aWNlPC9jb2RlPiBjb21wb25lbnQuPC9wPgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRTZXJ2aWNlTUJlYW4gZXh0ZW5kcyBCYXNlTW9kZWxNQmVhbiB7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIDxjb2RlPk1vZGVsTUJlYW48L2NvZGU+IHdpdGggZGVmYXVsdAorICAgICAqIDxjb2RlPk1vZGVsTUJlYW5JbmZvPC9jb2RlPiBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTUJlYW5FeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemVyIG9mIGFuIG9iamVjdAorICAgICAqICB0aHJvd3MgYW4gZXhjZXB0aW9uCisgICAgICogQGV4Y2VwdGlvbiBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiBpZiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFN0YW5kYXJkU2VydmljZU1CZWFuKCkKKyAgICAgICAgdGhyb3dzIE1CZWFuRXhjZXB0aW9uLCBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBdHRyaWJ1dGVzCisKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zCisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9Vc2VyTUJlYW4uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvVXNlck1CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkM2Q1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvVXNlck1CZWFuLmphdmEKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUm9sZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuQmFzZU1vZGVsTUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuTWFuYWdlZEJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5jb21wYXQuSmRrQ29tcGF0OworCisvKioKKyAqIDxwPkEgPHN0cm9uZz5Nb2RlbE1CZWFuPC9zdHJvbmc+IGltcGxlbWVudGF0aW9uIGZvciB0aGUKKyAqIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlcjwvY29kZT4gY29tcG9uZW50LjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFVzZXJNQmVhbiBleHRlbmRzIEJhc2VNb2RlbE1CZWFuIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIDxjb2RlPk1vZGVsTUJlYW48L2NvZGU+IHdpdGggZGVmYXVsdAorICAgICAqIDxjb2RlPk1vZGVsTUJlYW5JbmZvPC9jb2RlPiBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTUJlYW5FeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemVyIG9mIGFuIG9iamVjdAorICAgICAqICB0aHJvd3MgYW4gZXhjZXB0aW9uCisgICAgICogQGV4Y2VwdGlvbiBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiBpZiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFVzZXJNQmVhbigpCisgICAgICAgIHRocm93cyBNQmVhbkV4Y2VwdGlvbiwgUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENsYXNzIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBKREsgY29tcGF0aWJpbGl0eSBzdXBwb3J0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmRrQ29tcGF0IGpka0NvbXBhdCA9IEpka0NvbXBhdC5nZXRKZGtDb21wYXQoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHJlZ2lzdHJ5IGZvciBvdXIgbWFuYWdlZCBiZWFucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVnaXN0cnkgcmVnaXN0cnkgPSBNQmVhblV0aWxzLmNyZWF0ZVJlZ2lzdHJ5KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NQmVhblNlcnZlcjwvY29kZT4gaW4gd2hpY2ggd2UgYXJlIHJlZ2lzdGVyZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBNQmVhblV0aWxzLmNyZWF0ZVNlcnZlcigpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+TWFuYWdlZEJlYW48L2NvZGU+IGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhpcyBNQmVhbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFuYWdlZEJlYW4gbWFuYWdlZCA9CisgICAgICAgIHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbigiVXNlciIpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lcyBvZiBhbGwgZ3JvdXBzIHRoaXMgdXNlciBpcyBhIG1lbWJlciBvZi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0R3JvdXBzKCkgeworCisgICAgICAgIFVzZXIgdXNlciA9IChVc2VyKSB0aGlzLnJlc291cmNlOworICAgICAgICBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgSXRlcmF0b3IgZ3JvdXBzID0gdXNlci5nZXRHcm91cHMoKTsKKyAgICAgICAgd2hpbGUgKGdyb3Vwcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEdyb3VwIGdyb3VwID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZ3JvdXAgPSAoR3JvdXApIGdyb3Vwcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShtYW5hZ2VkLmdldERvbWFpbigpLCBncm91cCk7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQob25hbWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBjcmVhdGUgb2JqZWN0IG5hbWUgZm9yIGdyb3VwICIgKyBncm91cCk7CisgICAgICAgICAgICAgICAgamRrQ29tcGF0LmNoYWluRXhjZXB0aW9uKGlhZSwgZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lcyBvZiBhbGwgcm9sZXMgYXNzaWduZWQgdG8gdGhpcyB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRSb2xlcygpIHsKKworICAgICAgICBVc2VyIHVzZXIgPSAoVXNlcikgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEl0ZXJhdG9yIHJvbGVzID0gdXNlci5nZXRSb2xlcygpOworICAgICAgICB3aGlsZSAocm9sZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBSb2xlIHJvbGUgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByb2xlID0gKFJvbGUpIHJvbGVzLm5leHQoKTsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVPYmplY3ROYW1lKG1hbmFnZWQuZ2V0RG9tYWluKCksIHJvbGUpOworICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIG9iamVjdCBuYW1lIGZvciByb2xlICIgKyByb2xlKTsKKyAgICAgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBpYWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pIHJlc3VsdHMudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdHMuc2l6ZSgpXSkpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGlvbnMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHtAbGluayBHcm91cH0gdG8gdGhvc2UgdGhpcyB1c2VyIGJlbG9uZ3MgdG8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXBuYW1lIEdyb3VwIG5hbWUgb2YgdGhlIG5ldyBncm91cAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEdyb3VwKFN0cmluZyBncm91cG5hbWUpIHsKKworICAgICAgICBVc2VyIHVzZXIgPSAoVXNlcikgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgaWYgKHVzZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEdyb3VwIGdyb3VwID0gdXNlci5nZXRVc2VyRGF0YWJhc2UoKS5maW5kR3JvdXAoZ3JvdXBuYW1lKTsKKyAgICAgICAgaWYgKGdyb3VwID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgZ3JvdXAgbmFtZSAnIiArIGdyb3VwbmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgdXNlci5hZGRHcm91cChncm91cCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyB7QGxpbmsgUm9sZX0gdG8gdGhvc2UgdGhpcyB1c2VyIGJlbG9uZ3MgdG8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZW5hbWUgUm9sZSBuYW1lIG9mIHRoZSBuZXcgcm9sZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJvbGUoU3RyaW5nIHJvbGVuYW1lKSB7CisKKyAgICAgICAgVXNlciB1c2VyID0gKFVzZXIpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIGlmICh1c2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBSb2xlIHJvbGUgPSB1c2VyLmdldFVzZXJEYXRhYmFzZSgpLmZpbmRSb2xlKHJvbGVuYW1lKTsKKyAgICAgICAgaWYgKHJvbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiSW52YWxpZCByb2xlIG5hbWUgJyIgKyByb2xlbmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgdXNlci5hZGRSb2xlKHJvbGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB7QGxpbmsgR3JvdXB9IGZyb20gdGhvc2UgdGhpcyB1c2VyIGJlbG9uZ3MgdG8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXBuYW1lIEdyb3VwIG5hbWUgb2YgdGhlIG9sZCBncm91cAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUdyb3VwKFN0cmluZyBncm91cG5hbWUpIHsKKworICAgICAgICBVc2VyIHVzZXIgPSAoVXNlcikgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgaWYgKHVzZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEdyb3VwIGdyb3VwID0gdXNlci5nZXRVc2VyRGF0YWJhc2UoKS5maW5kR3JvdXAoZ3JvdXBuYW1lKTsKKyAgICAgICAgaWYgKGdyb3VwID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgZ3JvdXAgbmFtZSAnIiArIGdyb3VwbmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgdXNlci5yZW1vdmVHcm91cChncm91cCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHtAbGluayBSb2xlfSBmcm9tIHRob3NlIHRoaXMgdXNlciBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGVuYW1lIFJvbGUgbmFtZSBvZiB0aGUgb2xkIHJvbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSb2xlKFN0cmluZyByb2xlbmFtZSkgeworCisgICAgICAgIFVzZXIgdXNlciA9IChVc2VyKSB0aGlzLnJlc291cmNlOworICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgUm9sZSByb2xlID0gdXNlci5nZXRVc2VyRGF0YWJhc2UoKS5maW5kUm9sZShyb2xlbmFtZSk7CisgICAgICAgIGlmIChyb2xlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgcm9sZSBuYW1lICciICsgcm9sZW5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIHVzZXIucmVtb3ZlUm9sZShyb2xlKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL21iZWFucy1kZXNjcmlwdG9ycy54bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL21iZWFucy1kZXNjcmlwdG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1NDY0NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApAQCAtMCwwICsxLDQzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8bWJlYW5zLWRlc2NyaXB0b3JzPgorCisgIDxtYmVhbiAgICAgICAgIG5hbWU9Ik1CZWFuRmFjdG9yeSIKKyAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuTUJlYW5GYWN0b3J5IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJGYWN0b3J5IGZvciBNQmVhbnMgYW5kIGNvcnJlc3BvbmRpbmcgY29tcG9uZW50cyIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiPgorCisgICAgPCEtLSBJTVBMRU1FTlRBVElPTiBOT1RFIC0gYWxsIG9mIHRoZSBjcmVhdGVYeHh4eCBtZXRob2RzIGNyZWF0ZSBhIG5ldyAgLS0+CisgICAgPCEtLSBjb21wb25lbnQgYW5kIGF0dGFjaCBpdCB0byBDYXRhbGluYSdzIGNvbXBvbmVudCB0cmVlLiAgVGhlIHJldHVybiAgLS0+CisgICAgPCEtLSB2YWx1ZSBpcyB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gZm9yIHRoZSBuZXcgICAgLS0+CisgICAgPCEtLSBjb21wb25lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlQWNjZXNzTG9nZ2VyVmFsdmUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBBY2Nlc3NMb2dnZXJWYWx2ZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVBanBDb25uZWN0b3IiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBBanBDb25uZWN0b3IiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImFkZHJlc3MiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBJUCBhZGRyZXNzIG9uIHdoaWNoIHRvIGJpbmQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVENQIHBvcnQgbnVtYmVyIHRvIGxpc3RlbiBvbiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlRGF0YVNvdXJjZVJlYWxtIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSBuZXcgRGF0YVNvdXJjZSBSZWFsbSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGF0YVNvdXJjZU5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBKTkRJIG5hbWVkIEpEQkMgRGF0YVNvdXJjZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJyb2xlTmFtZUNvbCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGNvbHVtbiBpbiB0aGUgdXNlciByb2xlIHRhYmxlIHRoYXQgbmFtZXMgYSByb2xlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJDcmVkQ29sIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY29sdW1uIGluIHRoZSB1c2VyIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHVzZXIncworICAgICAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWVDb2wiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyUm9sZVRhYmxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgdGFibGUgdGhhdCBob2xkcyB0aGUgcmVsYXRpb24gYmV0d2VlbiB1c2VyJ3MgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICByb2xlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyVGFibGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSB0YWJsZSB0aGF0IGhvbGRzIHVzZXIgZGF0YSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZUZpbGVMb2dnZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBGaWxlTG9nZ2VyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZUh0dHBDb25uZWN0b3IiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBIdHRwQ29ubmVjdG9yIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICA8cGFyYW1ldGVyIG5hbWU9ImFkZHJlc3MiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBJUCBhZGRyZXNzIG9uIHdoaWNoIHRvIGJpbmQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVENQIHBvcnQgbnVtYmVyIHRvIGxpc3RlbiBvbiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlSHR0cHNDb25uZWN0b3IiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBIdHRwc0Nvbm5lY3RvciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iYWRkcmVzcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIElQIGFkZHJlc3Mgb24gd2hpY2ggdG8gYmluZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUQ1AgcG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVKREJDUmVhbG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBKREJDIFJlYWxtIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZUpORElSZWFsbSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgbmV3IEpOREkgUmVhbG0iCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImNvbm5lY3Rpb25VUkwiCisgICAgICAgICAgZGVzY3JpcHRpb249IkpuZGkgQ29ubmVjdGlvbiBVUkwiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iY29ubmVjdGlvbk5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvbm5lY3Rpb24gbmFtZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJjb25uZWN0aW9uUGFzc3dvcmQiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvbm5lY3Rpb24gcGFzc3dvcmQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVKQUFTUmVhbG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBKYWFzIFJlYWxtIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJhcHBOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJBcHAgbmFtZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyQ2xhc3NOYW1lcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVXNlcnMgY2xhc3MgbmFtZXMuIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InJvbGVDbGFzc05hbWVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSb2xlIGNsYXNzTmFtZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlQ29udGV4dENsYXNzTG9hZGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJXaGV0aGVyIHVzZSBjb250ZXh0IGNsYXNzbG9hZGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlTWVtb3J5UmVhbG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBNZW1vcnkgUmVhbG0iCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlUmVtb3RlQWRkclZhbHZlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSBuZXcgUmVtb3RlIEFkZHJlc3MgRmlsdGVyIFZhbHZlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZVJlbW90ZUhvc3RWYWx2ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgbmV3IFJlbW90ZSBIb3N0IEZpbHRlciBWYWx2ZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVSZXF1ZXN0RHVtcGVyVmFsdmUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBSZXF1ZXN0IER1bXBlciBWYWx2ZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVTaW5nbGVTaWduT24iCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBTaW5nbGUgU2lnbiBPbiBWYWx2ZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVTdGFuZGFyZENvbnRleHQiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBTdGFuZGFyZENvbnRleHQiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhdGgiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb250ZXh0IHBhdGggZm9yIHRoaXMgQ29udGV4dCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJkb2NCYXNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJEb2N1bWVudCBiYXNlIGRpcmVjdG9yeSAob3IgV0FSKSBmb3IgdGhzIENvbnRleHQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVTdGFuZGFyZEVuZ2luZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgbmV3IFN0YW5kYXJkRW5naW5lIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJVbmlxdWUgbmFtZSBvZiB0aGlzIEVuZ2luZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJkZWZhdWx0SG9zdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRGVmYXVsdCBob3N0IG5hbWUgZm9yIHRoaXMgRW5naW5lIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlU3RhbmRhcmRFbmdpbmVTZXJ2aWNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSBuZXcgU3RhbmRhcmRFbmdpbmUgYW5kIFN0YW5kYXJkU2VydmljZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBTZXJ2aWNlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImVuZ2luZU5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlVuaXF1ZSBuYW1lIG9mIHRoaXMgRW5naW5lIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImRlZmF1bHRIb3N0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJEZWZhdWx0IGhvc3QgbmFtZSBmb3IgdGhpcyBFbmdpbmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VydmljZU5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlVuaXF1ZSBuYW1lIG9mIHRoaXMgU2VydmljZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZVN0YW5kYXJkSG9zdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgbmV3IFN0YW5kYXJkSG9zdCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVW5pcXVlIG5hbWUgb2YgdGhpcyBIb3N0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImFwcEJhc2UiCisgICAgICAgICAgZGVzY3JpcHRpb249InNldCBob3N0IGRlcGxveW1lbnQgZGlyZWN0b3J5IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImF1dG9EZXBsb3kiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBhdXRvIGRlcGxveSBmbGFnIGZvciB0aGlzIEhvc3QiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+ICAgICAgICAgICAKKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGVwbG95T25TdGFydHVwIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGVwbG95IG9uIHN0YXJ0dXAgZmxhZyBmb3IgdGhpcyBIb3N0IgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJkZXBsb3lYTUwiCisgICAgICAgICAgZGVzY3JpcHRpb249ImRlcGxveSBDb250ZXh0IFhNTCBjb25maWcgZmlsZXMgcHJvcGVydHkiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+IAorICAgICAgPHBhcmFtZXRlciBuYW1lPSJ1bnBhY2tXQVJzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJVbnBhY2sgV0FScyBwcm9wZXJ0eSIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ieG1sTmFtZXNwYWNlQXdhcmUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkF0dHJpYnV0ZSB2YWx1ZSB1c2VkIHRvIHR1cm4gb24vb2ZmIFhNTCBuYW1lc3BhY2UgYXdhcmVuZXNzIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJ4bWxWYWxpZGF0aW9uIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkF0dHJpYnV0ZSB2YWx1ZSB1c2VkIHRvIHR1cm4gb24vb2ZmIFhNTCB2YWxpZGF0aW9uIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgIDwvb3BlcmF0aW9uPgorCisKKworCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZVN0YW5kYXJkTWFuYWdlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgbmV3IFN0YW5kYXJkTWFuYWdlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVTdGFuZGFyZFNlcnZpY2UiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBTdGFuZGFyZFNlcnZpY2UiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Im5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlVuaXF1ZSBuYW1lIG9mIHRoaXMgU2VydmljZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJkb21haW4iCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkb21haW4gb2YgdGhpcyBTZXJ2aWNlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlU3lzdGVtRXJyTG9nZ2VyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSBuZXcgU3lzdGVtIEVycm9yIExvZ2dlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVTeXN0ZW1PdXRMb2dnZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBTeXN0ZW0gT3V0cHV0IExvZ2dlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVVc2VyRGF0YWJhc2VSZWFsbSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgbmV3IFVzZXJEYXRhYmFzZSBSZWFsbSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icmVzb3VyY2VOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJHbG9iYWwgSk5ESSByZXNvdXJjZSBuYW1lIG9mIG91ciBVc2VyRGF0YWJhc2UgaW5zdGFuY2UiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVXZWJhcHBMb2FkZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBXZWIgQXBwbGljYXRpb24gTG9hZGVyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPCEtLSBJTVBMRU1FTlRBVElPTiBOT1RFIC0gYWxsIG9mIHRoZSByZW1vdmVYeHh4eCBtZXRob2RzIGNhdXNlIHRoZSAgICAgLS0+CisgICAgPCEtLSBjb3JyZXNwb25kaW5nIENhdGFsaW5hIGNvbXBvbmVudCAoYW5kIGFueSByZWxhdGVkIGNoaWxkICAgICAgICAgICAgLS0+CisgICAgPCEtLSBjb21wb25lbnRzIHRvIGJlIHN0b3BwZWQgKGlmIG5lY2Vzc2FyeSkgYW5kIHJlbW92ZWQsIGFuZCB0aGUgICAgICAgLS0+CisgICAgPCEtLSBjb3JyZXNwb25kaW5nIE1CZWFucyB0byBiZSBkZXN0cm95ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0icmVtb3ZlQ29ubmVjdG9yIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgYW4gZXhpc3RpbmcgQ29ubmVjdG9yIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgcmVtb3ZlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZUNvbnRleHQiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBhbiBleGlzdGluZyBDb250ZXh0IgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgcmVtb3ZlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZUhvc3QiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBhbiBleGlzdGluZyBIb3N0IgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgcmVtb3ZlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZUxvYWRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIGFuIGV4aXN0aW5nIExvYWRlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIHJlbW92ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVMb2dnZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBhbiBleGlzdGluZyBMb2dnZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Im5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSByZW1vdmVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0icmVtb3ZlTWFuYWdlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIGFuIGV4aXN0aW5nIE1hbmFnZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Im5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSByZW1vdmVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0icmVtb3ZlUmVhbG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBhbiBleGlzdGluZyBSZWFsbSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIHJlbW92ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVTZXJ2aWNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgYW4gZXhpc3RpbmcgU2VydmljZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIHJlbW92ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVWYWx2ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIGFuIGV4aXN0aW5nIFZhbHZlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgcmVtb3ZlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgIDwvbWJlYW4+CisKKzwvbWJlYW5zLWRlc2NyaXB0b3JzPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0NvbnN0YW50cy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MDdjNDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtOworCisKKy8qKgorICogTWFuaWZlc3QgY29uc3RhbnRzIGZvciB0aGlzIEphdmEgcGFja2FnZS4KKyAqCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb25zdGFudHMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtIjsKKyAgICAKKyAgICAgICAgLy8gQXV0aGVudGljYXRpb24gbWV0aG9kcyBmb3IgbG9naW4gY29uZmlndXJhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fTUVUSE9EID0gIkZPUk0iOworCisgICAgLy8gRm9ybSBiYXNlZCBhdXRoZW50aWNhdGlvbiBjb25zdGFudHMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX0FDVElPTiA9ICIval9zZWN1cml0eV9jaGVjayI7CisKKyAgICAvLyBVc2VyIGRhdGEgY29uc3RyYWludHMgZm9yIHRyYW5zcG9ydCBndWFyYW50ZWUKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FX1RSQU5TUE9SVCA9ICJOT05FIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFR1JBTF9UUkFOU1BPUlQgPSAiSU5URUdSQUwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJREVOVElBTF9UUkFOU1BPUlQgPSAiQ09ORklERU5USUFMIjsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0RhdGFTb3VyY2VSZWFsbS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0RhdGFTb3VyY2VSZWFsbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZjBjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vRGF0YVNvdXJjZVJlYWxtLmphdmEKQEAgLTAsMCArMSw2NjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbTsKKworCitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLkNvbnRleHRCaW5kaW5nczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworCisvKioKKyoKKyogSW1wbG1lbnRhdGlvbiBvZiA8Yj5SZWFsbTwvYj4gdGhhdCB3b3JrcyB3aXRoIGFueSBKREJDIEpOREkgRGF0YVNvdXJjZS4KKyogU2VlIHRoZSBKREJDUmVhbG0uaG93dG8gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gc2V0IHVwIHRoZSBkYXRhYmFzZSBhbmQKKyogZm9yIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyoKKyogQGF1dGhvciBHbGVubiBMLiBOaWVsc2VuCisqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorKiBAYXV0aG9yIENhcnNvbiBNY0RvbmFsZAorKiBAYXV0aG9yIElnbmFjaW8gT3J0ZWdhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyovCisKK3B1YmxpYyBjbGFzcyBEYXRhU291cmNlUmVhbG0KKyAgICBleHRlbmRzIFJlYWxtQmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZ2VuZXJhdGVkIHN0cmluZyBmb3IgdGhlIHJvbGVzIFByZXBhcmVkU3RhdGVtZW50CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJlcGFyZWRSb2xlcyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBnZW5lcmF0ZWQgc3RyaW5nIGZvciB0aGUgY3JlZGVudGlhbHMgUHJlcGFyZWRTdGF0ZW1lbnQKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcmVwYXJlZENyZWRlbnRpYWxzID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIEpOREkgSkRCQyBEYXRhU291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBkYXRhU291cmNlTmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUmVhbG0gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkRhdGFTb3VyY2VSZWFsbS8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBDb250ZXh0IGxvY2FsIGRhdGFzb3VyY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbG9jYWxEYXRhU291cmNlID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUmVhbG0gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZSA9ICJEYXRhU291cmNlUmVhbG0iOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29sdW1uIGluIHRoZSB1c2VyIHJvbGUgdGFibGUgdGhhdCBuYW1lcyBhIHJvbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJvbGVOYW1lQ29sID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbHVtbiBpbiB0aGUgdXNlciB0YWJsZSB0aGF0IGhvbGRzIHRoZSB1c2VyJ3MgY3JlZGludGlhbHMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHVzZXJDcmVkQ29sID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbHVtbiBpbiB0aGUgdXNlciB0YWJsZSB0aGF0IGhvbGRzIHRoZSB1c2VyJ3MgbmFtZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlck5hbWVDb2wgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGFibGUgdGhhdCBob2xkcyB0aGUgcmVsYXRpb24gYmV0d2VlbiB1c2VyJ3MgYW5kIHJvbGVzCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB1c2VyUm9sZVRhYmxlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHRhYmxlIHRoYXQgaG9sZHMgdXNlciBkYXRhLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlclRhYmxlID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgSk5ESSBKREJDIERhdGFTb3VyY2UuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFTb3VyY2VOYW1lKCkgeworICAgICAgICByZXR1cm4gZGF0YVNvdXJjZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBKTkRJIEpEQkMgRGF0YVNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhU291cmNlTmFtZSB0aGUgbmFtZSBvZiB0aGUgSk5ESSBKREJDIERhdGFTb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhU291cmNlTmFtZSggU3RyaW5nIGRhdGFTb3VyY2VOYW1lKSB7CisgICAgICB0aGlzLmRhdGFTb3VyY2VOYW1lID0gZGF0YVNvdXJjZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGlmIHRoZSBkYXRhc291cmNlIHdpbGwgYmUgbG9va2VkIHVwIGluIHRoZSB3ZWJhcHAgSk5ESSBDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldExvY2FsRGF0YVNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsRGF0YVNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdG8gdHJ1ZSB0byBjYXVzZSB0aGUgZGF0YXNvdXJjZSB0byBiZSBsb29rZWQgdXAgaW4gdGhlIHdlYmFwcCBKTkRJCisgICAgICogQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhbERhdGFTb3VyY2UgdGhlIG5ldyBmbGFnIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9jYWxEYXRhU291cmNlKGJvb2xlYW4gbG9jYWxEYXRhU291cmNlKSB7CisgICAgICB0aGlzLmxvY2FsRGF0YVNvdXJjZSA9IGxvY2FsRGF0YVNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbHVtbiBpbiB0aGUgdXNlciByb2xlIHRhYmxlIHRoYXQgbmFtZXMgYSByb2xlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSb2xlTmFtZUNvbCgpIHsKKyAgICAgICAgcmV0dXJuIHJvbGVOYW1lQ29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29sdW1uIGluIHRoZSB1c2VyIHJvbGUgdGFibGUgdGhhdCBuYW1lcyBhIHJvbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZU5hbWVDb2wgVGhlIGNvbHVtbiBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um9sZU5hbWVDb2woIFN0cmluZyByb2xlTmFtZUNvbCApIHsKKyAgICAgICAgdGhpcy5yb2xlTmFtZUNvbCA9IHJvbGVOYW1lQ29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29sdW1uIGluIHRoZSB1c2VyIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHVzZXIncyBjcmVkZW50aWFscy4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlckNyZWRDb2woKSB7CisgICAgICAgIHJldHVybiB1c2VyQ3JlZENvbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbHVtbiBpbiB0aGUgdXNlciB0YWJsZSB0aGF0IGhvbGRzIHRoZSB1c2VyJ3MgY3JlZGVudGlhbHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlckNyZWRDb2wgVGhlIGNvbHVtbiBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlckNyZWRDb2woIFN0cmluZyB1c2VyQ3JlZENvbCApIHsKKyAgICAgICB0aGlzLnVzZXJDcmVkQ29sID0gdXNlckNyZWRDb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzIG5hbWUuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lQ29sKCkgeworICAgICAgICByZXR1cm4gdXNlck5hbWVDb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlck5hbWVDb2wgVGhlIGNvbHVtbiBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlck5hbWVDb2woIFN0cmluZyB1c2VyTmFtZUNvbCApIHsKKyAgICAgICB0aGlzLnVzZXJOYW1lQ29sID0gdXNlck5hbWVDb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0YWJsZSB0aGF0IGhvbGRzIHRoZSByZWxhdGlvbiBiZXR3ZWVuIHVzZXIncyBhbmQgcm9sZXMuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJSb2xlVGFibGUoKSB7CisgICAgICAgIHJldHVybiB1c2VyUm9sZVRhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGFibGUgdGhhdCBob2xkcyB0aGUgcmVsYXRpb24gYmV0d2VlbiB1c2VyJ3MgYW5kIHJvbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJSb2xlVGFibGUgVGhlIHRhYmxlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyUm9sZVRhYmxlKCBTdHJpbmcgdXNlclJvbGVUYWJsZSApIHsKKyAgICAgICAgdGhpcy51c2VyUm9sZVRhYmxlID0gdXNlclJvbGVUYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRhYmxlIHRoYXQgaG9sZHMgdXNlciBkYXRhLi4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlclRhYmxlKCkgeworICAgICAgICByZXR1cm4gdXNlclRhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGFibGUgdGhhdCBob2xkcyB1c2VyIGRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlclRhYmxlIFRoZSB0YWJsZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlclRhYmxlKCBTdHJpbmcgdXNlclRhYmxlICkgeworICAgICAgdGhpcy51c2VyVGFibGUgPSB1c2VyVGFibGU7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kCisgICAgICogY3JlZGVudGlhbHMsIGlmIHRoZXJlIGlzIG9uZTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZXJyb3JzIHdpdGggdGhlIEpEQkMgY29ubmVjdGlvbiwgZXhlY3V0aW5nCisgICAgICogdGhlIHF1ZXJ5IG9yIGFueXRoaW5nIHdlIHJldHVybiBudWxsIChkb24ndCBhdXRoZW50aWNhdGUpLiBUaGlzCisgICAgICogZXZlbnQgaXMgYWxzbyBsb2dnZWQsIGFuZCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGNsb3NlZCBzbyB0aGF0CisgICAgICogYSBzdWJzZXF1ZW50IHJlcXVlc3Qgd2lsbCBhdXRvbWF0aWNhbGx5IHJlLW9wZW4gaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUgb2YgdGhlIFByaW5jaXBhbCB0byBsb29rIHVwCisgICAgICogQHBhcmFtIGNyZWRlbnRpYWxzIFBhc3N3b3JkIG9yIG90aGVyIGNyZWRlbnRpYWxzIHRvIHVzZSBpbgorICAgICAqICBhdXRoZW50aWNhdGluZyB0aGlzIHVzZXJuYW1lCisgICAgICovCisgICAgcHVibGljIFByaW5jaXBhbCBhdXRoZW50aWNhdGUoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgY3JlZGVudGlhbHMpIHsKKyAgICAJCisgICAgCS8vIE5vIHVzZXIgLSBjYW4ndCBwb3NzaWJseSBhdXRoZW50aWNhdGUsIGRvbid0IGJvdGhlciB0aGUgZGF0YWJhc2UgdGhlbgorICAgIAlpZiAodXNlcm5hbWUgPT0gbnVsbCkgeworICAgIAkJcmV0dXJuIG51bGw7CisgICAgCX0KKyAgICAgICAgCisgICAgCUNvbm5lY3Rpb24gZGJDb25uZWN0aW9uID0gbnVsbDsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSBoYXZlIGFuIG9wZW4gZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICAgICAgZGJDb25uZWN0aW9uID0gb3BlbigpOworICAgICAgICAgICAgaWYgKGRiQ29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGRiIGNvbm5lY3Rpb24gb3BlbiBmYWlscywgcmV0dXJuICJub3QgYXV0aGVudGljYXRlZCIKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQWNxdWlyZSBhIFByaW5jaXBhbCBvYmplY3QgZm9yIHRoaXMgdXNlcgorICAgICAgICAgICAgcmV0dXJuIGF1dGhlbnRpY2F0ZShkYkNvbm5lY3Rpb24sIHVzZXJuYW1lLCBjcmVkZW50aWFscyk7CisgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIExvZyB0aGUgcHJvYmxlbSBmb3IgcG9zdGVyaXR5CisgICAgICAgICAgICBjb250YWluZXJMb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJkYXRhU291cmNlUmVhbG0uZXhjZXB0aW9uIiksIGUpOworCisgICAgICAgICAgICAvLyBSZXR1cm4gIm5vdCBhdXRoZW50aWNhdGVkIiBmb3IgdGhpcyByZXF1ZXN0CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgIAljbG9zZShkYkNvbm5lY3Rpb24pOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kCisgICAgICogY3JlZGVudGlhbHMsIGlmIHRoZXJlIGlzIG9uZTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYkNvbm5lY3Rpb24gVGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gYmUgdXNlZAorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSBvZiB0aGUgUHJpbmNpcGFsIHRvIGxvb2sgdXAKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgUGFzc3dvcmQgb3Igb3RoZXIgY3JlZGVudGlhbHMgdG8gdXNlIGluCisgICAgICogIGF1dGhlbnRpY2F0aW5nIHRoaXMgdXNlcm5hbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJpbmNpcGFsIGF1dGhlbnRpY2F0ZShDb25uZWN0aW9uIGRiQ29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3JlZGVudGlhbHMpIHRocm93cyBTUUxFeGNlcHRpb257CisKKyAgICAgICAgU3RyaW5nIGRiQ3JlZGVudGlhbHMgPSBnZXRQYXNzd29yZChkYkNvbm5lY3Rpb24sIHVzZXJuYW1lKTsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgdXNlcidzIGNyZWRlbnRpYWxzCisgICAgICAgIGJvb2xlYW4gdmFsaWRhdGVkID0gZmFsc2U7CisgICAgICAgIGlmIChoYXNNZXNzYWdlRGlnZXN0KCkpIHsKKyAgICAgICAgICAgIC8vIEhleCBoYXNoZXMgc2hvdWxkIGJlIGNvbXBhcmVkIGNhc2UtaW5zZW5zaXRpdmUKKyAgICAgICAgICAgIHZhbGlkYXRlZCA9IChkaWdlc3QoY3JlZGVudGlhbHMpLmVxdWFsc0lnbm9yZUNhc2UoZGJDcmVkZW50aWFscykpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHZhbGlkYXRlZCA9IChkaWdlc3QoY3JlZGVudGlhbHMpLmVxdWFscyhkYkNyZWRlbnRpYWxzKSk7CisKKyAgICAgICAgaWYgKHZhbGlkYXRlZCkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5lckxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGNvbnRhaW5lckxvZy50cmFjZSgKKyAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJkYXRhU291cmNlUmVhbG0uYXV0aGVudGljYXRlU3VjY2VzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5lckxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGNvbnRhaW5lckxvZy50cmFjZSgKKyAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJkYXRhU291cmNlUmVhbG0uYXV0aGVudGljYXRlRmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gZ2V0Um9sZXMoZGJDb25uZWN0aW9uLCB1c2VybmFtZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSBzdWl0YWJsZSBQcmluY2lwYWwgZm9yIHRoaXMgdXNlcgorICAgICAgICByZXR1cm4gKG5ldyBHZW5lcmljUHJpbmNpcGFsKHRoaXMsIHVzZXJuYW1lLCBjcmVkZW50aWFscywgbGlzdCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGJDb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uIHRvIGJlIGNsb3NlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlKENvbm5lY3Rpb24gZGJDb25uZWN0aW9uKSB7CisKKyAgICAgICAgLy8gRG8gbm90aGluZyBpZiB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGNsb3NlZAorICAgICAgICBpZiAoZGJDb25uZWN0aW9uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gQ29tbWl0IGlmIG5vdCBhdXRvIGNvbW1pdHRlZAorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFkYkNvbm5lY3Rpb24uZ2V0QXV0b0NvbW1pdCgpKSB7CisgICAgICAgICAgICAgICAgZGJDb25uZWN0aW9uLmNvbW1pdCgpOworICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY29udGFpbmVyTG9nLmVycm9yKCJFeGNlcHRpb24gY29tbWl0dGluZyBjb25uZWN0aW9uIGJlZm9yZSBjbG9zaW5nOiIsIGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2xvc2UgdGhpcyBkYXRhYmFzZSBjb25uZWN0aW9uLCBhbmQgbG9nIGFueSBlcnJvcnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRiQ29ubmVjdGlvbi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY29udGFpbmVyTG9nLmVycm9yKHNtLmdldFN0cmluZygiZGF0YVNvdXJjZVJlYWxtLmNsb3NlIiksIGUpOyAvLyBKdXN0IGxvZyBpdCBoZXJlCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIHNwZWNpZmllZCBkYXRhYmFzZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBDb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZQorICAgICAqLworICAgIHByb3RlY3RlZCBDb25uZWN0aW9uIG9wZW4oKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IG51bGw7CisgICAgICAgICAgICBpZiAobG9jYWxEYXRhU291cmNlKSB7CisgICAgICAgICAgICAgICAgY29udGV4dCA9IENvbnRleHRCaW5kaW5ncy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgICAgIGNvbnRleHQgPSAoQ29udGV4dCkgY29udGV4dC5sb29rdXAoImNvbXAvZW52Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0YW5kYXJkU2VydmVyIHNlcnZlciA9IAorICAgICAgICAgICAgICAgICAgICAoU3RhbmRhcmRTZXJ2ZXIpIFNlcnZlckZhY3RvcnkuZ2V0U2VydmVyKCk7CisgICAgICAgICAgICAgICAgY29udGV4dCA9IHNlcnZlci5nZXRHbG9iYWxOYW1pbmdDb250ZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEYXRhU291cmNlIGRhdGFTb3VyY2UgPSAoRGF0YVNvdXJjZSljb250ZXh0Lmxvb2t1cChkYXRhU291cmNlTmFtZSk7CisJICAgIHJldHVybiBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIExvZyB0aGUgcHJvYmxlbSBmb3IgcG9zdGVyaXR5CisgICAgICAgICAgICBjb250YWluZXJMb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJkYXRhU291cmNlUmVhbG0uZXhjZXB0aW9uIiksIGUpOworICAgICAgICB9ICAKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc2hvcnQgbmFtZSBmb3IgdGhpcyBSZWFsbSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGFzc3dvcmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcmluY2lwYWwncyB1c2VyIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXNzd29yZChTdHJpbmcgdXNlcm5hbWUpIHsKKworICAgICAgICBDb25uZWN0aW9uIGRiQ29ubmVjdGlvbiA9IG51bGw7CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBhbiBvcGVuIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgZGJDb25uZWN0aW9uID0gb3BlbigpOworICAgICAgICBpZiAoZGJDb25uZWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgCXJldHVybiBnZXRQYXNzd29yZChkYkNvbm5lY3Rpb24sIHVzZXJuYW1lKTsgICAgICAgIAkKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlKGRiQ29ubmVjdGlvbik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXNzd29yZCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByaW5jaXBhbCdzIHVzZXIgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGJDb25uZWN0aW9uIFRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIGJlIHVzZWQKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUgZm9yIHdoaWNoIHBhc3N3b3JkIHNob3VsZCBiZSByZXRyaWV2ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhc3N3b3JkKENvbm5lY3Rpb24gZGJDb25uZWN0aW9uLCAKKwkJCQkJCQkJIFN0cmluZyB1c2VybmFtZSkgeworCisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bXQgPSBudWxsOworICAgICAgICBTdHJpbmcgZGJDcmVkZW50aWFscyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0bXQgPSBjcmVkZW50aWFscyhkYkNvbm5lY3Rpb24sIHVzZXJuYW1lKTsKKyAgICAgICAgICAgIHJzID0gc3RtdC5leGVjdXRlUXVlcnkoKTsKKyAgICAgICAgICAgIGlmIChycy5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBkYkNyZWRlbnRpYWxzID0gcnMuZ2V0U3RyaW5nKDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gKGRiQ3JlZGVudGlhbHMgIT0gbnVsbCkgPyBkYkNyZWRlbnRpYWxzLnRyaW0oKSA6IG51bGw7CisgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY29udGFpbmVyTG9nLmVycm9yKAorICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoImRhdGFTb3VyY2VSZWFsbS5nZXRQYXNzd29yZC5leGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgCXRyeSB7CisJICAgICAgICAgICAgaWYgKHJzICE9IG51bGwpIHsKKwkgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKwkgICAgICAgICAgICB9CisJICAgICAgICAgICAgaWYgKHN0bXQgIT0gbnVsbCkgeworCSAgICAgICAgICAgICAgICBzdG10LmNsb3NlKCk7CisJICAgICAgICAgICAgfQorICAgICAgICAJfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyTG9nLmVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJkYXRhU291cmNlUmVhbG0uZ2V0UGFzc3dvcmQuZXhjZXB0aW9uIiwKKyAgICAgICAgCQkgICAgICAgICAgICAgdXNlcm5hbWUpKTsKKyAgICAgICAgCQkKKyAgICAgICAgCX0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFByaW5jaXBhbCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHVzZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJpbmNpcGFsIGdldFByaW5jaXBhbChTdHJpbmcgdXNlcm5hbWUpIHsKKyAgICAJQ29ubmVjdGlvbiBkYkNvbm5lY3Rpb24gPSBvcGVuKCk7CisgICAgICAgIGlmIChkYkNvbm5lY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljUHJpbmNpcGFsKHRoaXMsdXNlcm5hbWUsIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgIAlyZXR1cm4gKG5ldyBHZW5lcmljUHJpbmNpcGFsKHRoaXMsCisgICAgICAgIAkJCXVzZXJuYW1lLAorCQkJCQlnZXRQYXNzd29yZChkYkNvbm5lY3Rpb24sIHVzZXJuYW1lKSwKKwkJCQkJZ2V0Um9sZXMoZGJDb25uZWN0aW9uLCB1c2VybmFtZSkpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgCWNsb3NlKGRiQ29ubmVjdGlvbik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcm9sZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB1c2VyIG5hbWUuCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lIGZvciB3aGljaCByb2xlcyBzaG91bGQgYmUgcmV0cmlldmVkCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBnZXRSb2xlcyhTdHJpbmcgdXNlcm5hbWUpIHsKKworICAgICAgICBDb25uZWN0aW9uIGRiQ29ubmVjdGlvbiA9IG51bGw7CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBhbiBvcGVuIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgZGJDb25uZWN0aW9uID0gb3BlbigpOworICAgICAgICBpZiAoZGJDb25uZWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSb2xlcyhkYkNvbm5lY3Rpb24sIHVzZXJuYW1lKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgCWNsb3NlKGRiQ29ubmVjdGlvbik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByb2xlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHVzZXIgbmFtZQorICAgICAqIEBwYXJhbSBkYkNvbm5lY3Rpb24gVGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gYmUgdXNlZAorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSBmb3Igd2hpY2ggcm9sZXMgc2hvdWxkIGJlIHJldHJpZXZlZAorICAgICAqLworICAgIHByb3RlY3RlZCBBcnJheUxpc3QgZ2V0Um9sZXMoQ29ubmVjdGlvbiBkYkNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lKSB7CisgICAgCQorICAgICAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdG10ID0gbnVsbDsKKyAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBudWxsOworICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAJCXN0bXQgPSByb2xlcyhkYkNvbm5lY3Rpb24sIHVzZXJuYW1lKTsKKyAgICAJCXJzID0gc3RtdC5leGVjdXRlUXVlcnkoKTsKKyAgICAJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgCQkKKyAgICAJCXdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAJCQlTdHJpbmcgcm9sZSA9IHJzLmdldFN0cmluZygxKTsKKyAgICAJCQlpZiAocm9sZSAhPSBudWxsKSB7CisgICAgCQkJCWxpc3QuYWRkKHJvbGUudHJpbSgpKTsKKyAgICAJCQl9CisgICAgCQl9CisgICAgCQlyZXR1cm4gbGlzdDsKKyAgICAJfSBjYXRjaChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY29udGFpbmVyTG9nLmVycm9yKAorICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygiZGF0YVNvdXJjZVJlYWxtLmdldFJvbGVzLmV4Y2VwdGlvbiIsIHVzZXJuYW1lKSk7CisgICAgICAgIH0KKyAgICAJZmluYWxseSB7CisgICAgICAgIAl0cnkgeworCSAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisJICAgICAgICAgICAgICAgIHJzLmNsb3NlKCk7CisJICAgICAgICAgICAgfQorCSAgICAgICAgICAgIGlmIChzdG10ICE9IG51bGwpIHsKKwkgICAgICAgICAgICAgICAgc3RtdC5jbG9zZSgpOworCSAgICAgICAgICAgIH0KKyAgICAgICAgCX0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckxvZy5lcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygiZGF0YVNvdXJjZVJlYWxtLmdldFJvbGVzLmV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUpKTsKKyAgICAgICAgCX0KKyAgICAgICAgfQorICAgIAkKKyAgICAJcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgUHJlcGFyZWRTdGF0ZW1lbnQgY29uZmlndXJlZCB0byBwZXJmb3JtIHRoZSBTRUxFQ1QgcmVxdWlyZWQKKyAgICAgKiB0byByZXRyaWV2ZSB1c2VyIGNyZWRlbnRpYWxzIGZvciB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGRiQ29ubmVjdGlvbiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byBiZSB1c2VkCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lIGZvciB3aGljaCBjcmVkZW50aWFscyBzaG91bGQgYmUgcmV0cmlldmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNRTEV4Y2VwdGlvbiBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByaXZhdGUgUHJlcGFyZWRTdGF0ZW1lbnQgY3JlZGVudGlhbHMoQ29ubmVjdGlvbiBkYkNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgY3JlZGVudGlhbHMgPQorICAgICAgICAgICAgZGJDb25uZWN0aW9uLnByZXBhcmVTdGF0ZW1lbnQocHJlcGFyZWRDcmVkZW50aWFscyk7CisKKyAgICAgICAgY3JlZGVudGlhbHMuc2V0U3RyaW5nKDEsIHVzZXJuYW1lKTsKKyAgICAgICAgcmV0dXJuIChjcmVkZW50aWFscyk7CisKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgUHJlcGFyZWRTdGF0ZW1lbnQgY29uZmlndXJlZCB0byBwZXJmb3JtIHRoZSBTRUxFQ1QgcmVxdWlyZWQKKyAgICAgKiB0byByZXRyaWV2ZSB1c2VyIHJvbGVzIGZvciB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGRiQ29ubmVjdGlvbiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byBiZSB1c2VkCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lIGZvciB3aGljaCByb2xlcyBzaG91bGQgYmUgcmV0cmlldmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNRTEV4Y2VwdGlvbiBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByaXZhdGUgUHJlcGFyZWRTdGF0ZW1lbnQgcm9sZXMoQ29ubmVjdGlvbiBkYkNvbm5lY3Rpb24sIFN0cmluZyB1c2VybmFtZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgcm9sZXMgPSAKKyAgICAgICAgICAgIGRiQ29ubmVjdGlvbi5wcmVwYXJlU3RhdGVtZW50KHByZXBhcmVkUm9sZXMpOworCisgICAgICAgIHJvbGVzLnNldFN0cmluZygxLCB1c2VybmFtZSk7CisgICAgICAgIHJldHVybiAocm9sZXMpOworCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqCisgICAgICogUHJlcGFyZSBmb3IgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcyBDb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHN0YXJ0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFBlcmZvcm0gbm9ybWFsIHN1cGVyY2xhc3MgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgc3VwZXIuc3RhcnQoKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIHJvbGVzIFByZXBhcmVkU3RhdGVtZW50IHN0cmluZworICAgICAgICBTdHJpbmdCdWZmZXIgdGVtcCA9IG5ldyBTdHJpbmdCdWZmZXIoIlNFTEVDVCAiKTsKKyAgICAgICAgdGVtcC5hcHBlbmQocm9sZU5hbWVDb2wpOworICAgICAgICB0ZW1wLmFwcGVuZCgiIEZST00gIik7CisgICAgICAgIHRlbXAuYXBwZW5kKHVzZXJSb2xlVGFibGUpOworICAgICAgICB0ZW1wLmFwcGVuZCgiIFdIRVJFICIpOworICAgICAgICB0ZW1wLmFwcGVuZCh1c2VyTmFtZUNvbCk7CisgICAgICAgIHRlbXAuYXBwZW5kKCIgPSA/Iik7CisgICAgICAgIHByZXBhcmVkUm9sZXMgPSB0ZW1wLnRvU3RyaW5nKCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBjcmVkZW50aWFscyBQcmVwYXJlZFN0YXRlbWVudCBzdHJpbmcKKyAgICAgICAgdGVtcCA9IG5ldyBTdHJpbmdCdWZmZXIoIlNFTEVDVCAiKTsKKyAgICAgICAgdGVtcC5hcHBlbmQodXNlckNyZWRDb2wpOworICAgICAgICB0ZW1wLmFwcGVuZCgiIEZST00gIik7CisgICAgICAgIHRlbXAuYXBwZW5kKHVzZXJUYWJsZSk7CisgICAgICAgIHRlbXAuYXBwZW5kKCIgV0hFUkUgIik7CisgICAgICAgIHRlbXAuYXBwZW5kKHVzZXJOYW1lQ29sKTsKKyAgICAgICAgdGVtcC5hcHBlbmQoIiA9ID8iKTsKKyAgICAgICAgcHJlcGFyZWRDcmVkZW50aWFscyA9IHRlbXAudG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgc2h1dCBkb3duIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgQ29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUGVyZm9ybSBub3JtYWwgc3VwZXJjbGFzcyBmaW5hbGl6YXRpb24KKyAgICAgICAgc3VwZXIuc3RvcCgpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9HZW5lcmljUHJpbmNpcGFsLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vR2VuZXJpY1ByaW5jaXBhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NmMwODIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vR2VuZXJpY1ByaW5jaXBhbC5qYXZhCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG07CisKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKKworCisvKioKKyAqIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5qYXZhLnNlY3VyaXR5LlByaW5jaXBhbDwvc3Ryb25nPiB0aGF0CisgKiBpcyBhdmFpbGFibGUgZm9yIHVzZSBieSA8Y29kZT5SZWFsbTwvY29kZT4gaW1wbGVtZW50YXRpb25zLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgR2VuZXJpY1ByaW5jaXBhbCBpbXBsZW1lbnRzIFByaW5jaXBhbCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgUHJpbmNpcGFsLCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBSZWFsbSwgZm9yIHRoZQorICAgICAqIHNwZWNpZmllZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhbG0gVGhlIFJlYWxtIHRoYXQgb3ducyB0aGlzIFByaW5jaXBhbAorICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1c2VybmFtZSBvZiB0aGUgdXNlciByZXByZXNlbnRlZCBieSB0aGlzIFByaW5jaXBhbAorICAgICAqIEBwYXJhbSBwYXNzd29yZCBDcmVkZW50aWFscyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIHVzZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgR2VuZXJpY1ByaW5jaXBhbChSZWFsbSByZWFsbSwgU3RyaW5nIG5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworCisgICAgICAgIHRoaXMocmVhbG0sIG5hbWUsIHBhc3N3b3JkLCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFByaW5jaXBhbCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgUmVhbG0sIGZvciB0aGUKKyAgICAgKiBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLCB3aXRoIHRoZSBzcGVjaWZpZWQgcm9sZSBuYW1lcworICAgICAqIChhcyBTdHJpbmdzKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFsbSBUaGUgUmVhbG0gdGhhdCBvd25zIHRoaXMgcHJpbmNpcGFsCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHVzZXJuYW1lIG9mIHRoZSB1c2VyIHJlcHJlc2VudGVkIGJ5IHRoaXMgUHJpbmNpcGFsCisgICAgICogQHBhcmFtIHBhc3N3b3JkIENyZWRlbnRpYWxzIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgdXNlcgorICAgICAqIEBwYXJhbSByb2xlcyBMaXN0IG9mIHJvbGVzIChtdXN0IGJlIFN0cmluZ3MpIHBvc3Nlc3NlZCBieSB0aGlzIHVzZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgR2VuZXJpY1ByaW5jaXBhbChSZWFsbSByZWFsbSwgU3RyaW5nIG5hbWUsIFN0cmluZyBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHJvbGVzKSB7CisgICAgICAgIHRoaXMocmVhbG0sIG5hbWUsIHBhc3N3b3JkLCByb2xlcywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFByaW5jaXBhbCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgUmVhbG0sIGZvciB0aGUKKyAgICAgKiBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLCB3aXRoIHRoZSBzcGVjaWZpZWQgcm9sZSBuYW1lcworICAgICAqIChhcyBTdHJpbmdzKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFsbSBUaGUgUmVhbG0gdGhhdCBvd25zIHRoaXMgcHJpbmNpcGFsCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHVzZXJuYW1lIG9mIHRoZSB1c2VyIHJlcHJlc2VudGVkIGJ5IHRoaXMgUHJpbmNpcGFsCisgICAgICogQHBhcmFtIHBhc3N3b3JkIENyZWRlbnRpYWxzIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgdXNlcgorICAgICAqIEBwYXJhbSByb2xlcyBMaXN0IG9mIHJvbGVzIChtdXN0IGJlIFN0cmluZ3MpIHBvc3Nlc3NlZCBieSB0aGlzIHVzZXIKKyAgICAgKiBAcGFyYW0gdXNlclByaW5jaXBhbCAtIHRoZSBwcmluY2lwYWwgdG8gYmUgcmV0dXJuZWQgZnJvbSB0aGUgcmVxdWVzdCAKKyAgICAgKiAgICAgICAgZ2V0VXNlclByaW5jaXBhbCBjYWxsIGlmIG5vdCBudWxsOyBpZiBudWxsLCB0aGlzIHdpbGwgYmUgcmV0dXJuZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgR2VuZXJpY1ByaW5jaXBhbChSZWFsbSByZWFsbSwgU3RyaW5nIG5hbWUsIFN0cmluZyBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHJvbGVzLCBQcmluY2lwYWwgdXNlclByaW5jaXBhbCkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMucmVhbG0gPSByZWFsbTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgICAgICB0aGlzLnVzZXJQcmluY2lwYWwgPSB1c2VyUHJpbmNpcGFsOworICAgICAgICBpZiAocm9sZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5yb2xlcyA9IG5ldyBTdHJpbmdbcm9sZXMuc2l6ZSgpXTsKKyAgICAgICAgICAgIHRoaXMucm9sZXMgPSAoU3RyaW5nW10pIHJvbGVzLnRvQXJyYXkodGhpcy5yb2xlcyk7CisgICAgICAgICAgICBpZiAodGhpcy5yb2xlcy5sZW5ndGggPiAwKQorICAgICAgICAgICAgICAgIEFycmF5cy5zb3J0KHRoaXMucm9sZXMpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHVzZXJuYW1lIG9mIHRoZSB1c2VyIHJlcHJlc2VudGVkIGJ5IHRoaXMgUHJpbmNpcGFsLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5uYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscyBmb3IgdGhlIHVzZXIgcmVwcmVzZW50ZWQgYnkKKyAgICAgKiB0aGlzIFByaW5jaXBhbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wYXNzd29yZCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgUmVhbG0gd2l0aCB3aGljaCB0aGlzIFByaW5jaXBhbCBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBSZWFsbSByZWFsbSA9IG51bGw7CisKKyAgICBwdWJsaWMgUmVhbG0gZ2V0UmVhbG0oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5yZWFsbSk7CisgICAgfQorCisgICAgdm9pZCBzZXRSZWFsbSggUmVhbG0gcmVhbG0gKSB7CisgICAgICAgIHRoaXMucmVhbG09cmVhbG07CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByb2xlc1tdID0gbmV3IFN0cmluZ1swXTsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRSb2xlcygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnJvbGVzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCB0byBiZSBleHBvc2VkIHRvIGFwcGxpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJpbmNpcGFsIHVzZXJQcmluY2lwYWwgPSBudWxsOworCisgICAgcHVibGljIFByaW5jaXBhbCBnZXRVc2VyUHJpbmNpcGFsKCkgeworICAgICAgICBpZiAodXNlclByaW5jaXBhbCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdXNlclByaW5jaXBhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgdXNlciByZXByZXNlbnRlZCBieSB0aGlzIFByaW5jaXBhbCBwb3NzZXNzIHRoZSBzcGVjaWZpZWQgcm9sZT8KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFJvbGUgdG8gYmUgdGVzdGVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzUm9sZShTdHJpbmcgcm9sZSkgeworCisgICAgICAgIGlmKCIqIi5lcXVhbHMocm9sZSkpIC8vIFNwZWNpYWwgMi40IHJvbGUgbWVhbmluZyBldmVyeW9uZQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChyb2xlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIChBcnJheXMuYmluYXJ5U2VhcmNoKHJvbGVzLCByb2xlKSA+PSAwKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LCB3aGljaCBleHBvc2VzIG9ubHkKKyAgICAgKiBpbmZvcm1hdGlvbiB0aGF0IHNob3VsZCBiZSBwdWJsaWMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJHZW5lcmljUHJpbmNpcGFsWyIpOworICAgICAgICBzYi5hcHBlbmQodGhpcy5uYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCIoIik7CisgICAgICAgIGZvciggaW50IGk9MDtpPHJvbGVzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCByb2xlc1tpXSkuYXBwZW5kKCIsIik7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCIpXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9KQUFTQ2FsbGJhY2tIYW5kbGVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vSkFBU0NhbGxiYWNrSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNzU3MmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vSkFBU0NhbGxiYWNrSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG07CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFjazsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlcjsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLk5hbWVDYWxsYmFjazsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLlBhc3N3b3JkQ2FsbGJhY2s7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5VbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgdGhlIEpBQVMgPGNvZGU+Q2FsbGJhY2tIYW5kbGVyPC9jb2RlPiBpbnRlcmZhY2UsCisgKiB1c2VkIHRvIG5lZ290aWF0ZSBkZWxpdmVyeSBvZiB0aGUgdXNlcm5hbWUgYW5kIGNyZWRlbnRpYWxzIHRoYXQgd2VyZQorICogc3BlY2lmaWVkIHRvIG91ciBjb25zdHJ1Y3Rvci4gIE5vIGludGVyYWN0aW9uIHdpdGggdGhlIHVzZXIgaXMgcmVxdWlyZWQKKyAqIChvciBwb3NzaWJsZSkuPC9wPgorICoKKyAqIDxwPlRoaXMgPGNvZGU+Q2FsbGJhY2tIYW5kbGVyPC9jb2RlPiB3aWxsIHByZS1kaWdlc3QgdGhlIHN1cHBsaWVkCisgKiBwYXNzd29yZCwgaWYgcmVxdWlyZWQgYnkgdGhlIDxjb2RlPiZsdDtSZWFsbSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gCisgKiA8Y29kZT5zZXJ2ZXIueG1sPC9jb2RlPi48L3A+CisgKiA8cD5BdCBwcmVzZW50LCA8Y29kZT5KQUFTQ2FsbGJhY2tIYW5kbGVyPC9jb2RlPiBrbm93cyBob3cgdG8gaGFuZGxlIGNhbGxiYWNrcyBvZgorICogdHlwZSA8Y29kZT5qYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLk5hbWVDYWxsYmFjazwvY29kZT4gYW5kCisgKiA8Y29kZT5qYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLlBhc3N3b3JkQ2FsbGJhY2s8L2NvZGU+LjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgQW5kcmV3IFIuIEphcXVpdGgKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEpBQVNDYWxsYmFja0hhbmRsZXIgaW1wbGVtZW50cyBDYWxsYmFja0hhbmRsZXIgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKQUFTQ2FsbGJhY2tIYW5kbGVyLmNsYXNzKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBjYWxsYmFjayBoYW5kbGVyIGNvbmZpZ3VyZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KKyAgICAgKiBOb3RlIHRoYXQgaWYgdGhlIDxjb2RlPkpBQVNSZWFsbTwvY29kZT4gaW5zdGFuY2Ugc3BlY2lmaWVzIGRpZ2VzdGVkIHBhc3N3b3JkcywKKyAgICAgKiB0aGUgPGNvZGU+cGFzc3dvcmQ8L2NvZGU+IHBhcmFtZXRlciB3aWxsIGJlIHByZS1kaWdlc3RlZCBoZXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWxtIE91ciBhc3NvY2lhdGVkIEpBQVNSZWFsbSBpbnN0YW5jZQorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSB0byBiZSBhdXRoZW50aWNhdGVkIHdpdGgKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzc3dvcmQgdG8gYmUgYXV0aGVudGljYXRlZCB3aXRoCisgICAgICovCisgICAgcHVibGljIEpBQVNDYWxsYmFja0hhbmRsZXIoSkFBU1JlYWxtIHJlYWxtLCBTdHJpbmcgdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5yZWFsbSA9IHJlYWxtOworICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7CisKKyAgICAgICAgaWYgKHJlYWxtLmhhc01lc3NhZ2VEaWdlc3QoKSkgeworICAgICAgICAgICAgdGhpcy5wYXNzd29yZCA9IHJlYWxtLmRpZ2VzdChwYXNzd29yZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworICAgIC8qKgorICAgICAqIFRoZSBwYXNzd29yZCB0byBiZSBhdXRoZW50aWNhdGVkIHdpdGguCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhc3NvY2lhdGVkIDxjb2RlPkpBQVNSZWFsbTwvY29kZT4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIEpBQVNSZWFsbSByZWFsbSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSB1c2VybmFtZSB0byBiZSBhdXRoZW50aWNhdGVkIHdpdGguCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB1c2VybmFtZSA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgaW5mb3JtYXRpb24gcmVxdWVzdGVkIGluIHRoZSBwcm92aWRlZCA8Y29kZT5DYWxsYmFja3M8L2NvZGU+LgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb25seSByZWNvZ25pemVzIDxjb2RlPk5hbWVDYWxsYmFjazwvY29kZT4gYW5kCisgICAgICogPGNvZGU+UGFzc3dvcmRDYWxsYmFjazwvY29kZT4gaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrcyBUaGUgc2V0IG9mIDxjb2RlPkNhbGxiYWNrPC9jb2RlPnMgdG8gYmUgcHJvY2Vzc2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkQ2FsbGJhY2tFeGNlcHRpb24gaWYgdGhlIGxvZ2luIG1ldGhvZCByZXF1ZXN0cworICAgICAqICBhbiB1bnN1cHBvcnRlZCBjYWxsYmFjayB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlKENhbGxiYWNrIGNhbGxiYWNrc1tdKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFVuc3VwcG9ydGVkQ2FsbGJhY2tFeGNlcHRpb24geworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7CisKKyAgICAgICAgICAgIGlmIChjYWxsYmFja3NbaV0gaW5zdGFuY2VvZiBOYW1lQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBpZiAocmVhbG0uZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmVhbG0uZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkudHJhY2Uoc20uZ2V0U3RyaW5nKCJqYWFzQ2FsbGJhY2sudXNlcm5hbWUiLCB1c2VybmFtZSkpOworICAgICAgICAgICAgICAgICgoTmFtZUNhbGxiYWNrKSBjYWxsYmFja3NbaV0pLnNldE5hbWUodXNlcm5hbWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjYWxsYmFja3NbaV0gaW5zdGFuY2VvZiBQYXNzd29yZENhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgY2hhcltdIHBhc3N3b3JkY29udGVudHM7CisgICAgICAgICAgICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRjb250ZW50cyA9IHBhc3N3b3JkLnRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRjb250ZW50cyA9IG5ldyBjaGFyWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAoKFBhc3N3b3JkQ2FsbGJhY2spIGNhbGxiYWNrc1tpXSkuc2V0UGFzc3dvcmQKKyAgICAgICAgICAgICAgICAgICAgKHBhc3N3b3JkY29udGVudHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDYWxsYmFja0V4Y2VwdGlvbihjYWxsYmFja3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0pBQVNNZW1vcnlMb2dpbk1vZHVsZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0pBQVNNZW1vcnlMb2dpbk1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OThhZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vSkFBU01lbW9yeUxvZ2luTW9kdWxlLmphdmEKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbTsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0OworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2s7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXI7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5OYW1lQ2FsbGJhY2s7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5QYXNzd29yZENhbGxiYWNrOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suVW5zdXBwb3J0ZWRDYWxsYmFja0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkZhaWxlZExvZ2luRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uTG9naW5FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5zcGkuTG9naW5Nb2R1bGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LlNlY3VyaXR5Q29uc3RyYWludDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuUmVxdWVzdFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIHRoZSBKQUFTIDxzdHJvbmc+TG9naW5Nb2R1bGU8L3N0cm9uZz4gaW50ZXJmYWNlLAorICogcHJpbWFyaWx5IGZvciB1c2UgaW4gdGVzdGluZyA8Y29kZT5KQUFTUmVhbG08L2NvZGU+LiAgSXQgdXRpbGl6ZXMgYW4KKyAqIFhNTC1mb3JtYXQgZGF0YSBmaWxlIG9mIHVzZXJuYW1lL3Bhc3N3b3JkL3JvbGUgaW5mb3JtYXRpb24gaWRlbnRpY2FsIHRvCisgKiB0aGF0IHN1cHBvcnRlZCBieSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLk1lbW9yeVJlYWxtPC9jb2RlPgorICogKGV4Y2VwdCB0aGF0IGRpZ2VzdGVkIHBhc3N3b3JkcyBhcmUgbm90IHN1cHBvcnRlZCkuPC9wPgorICoKKyAqIDxwPlRoaXMgY2xhc3MgcmVjb2duaXplcyB0aGUgZm9sbG93aW5nIHN0cmluZy12YWx1ZWQgb3B0aW9ucywgd2hpY2ggYXJlCisgKiBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAoYW5kIHBhc3NlZCB0byBvdXIgY29uc3RydWN0b3IgaW4KKyAqIHRoZSA8Y29kZT5vcHRpb25zPC9jb2RlPiBhcmd1bWVudDo8L3A+CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5kZWJ1Zzwvc3Ryb25nPiAtIFNldCB0byAidHJ1ZSIgdG8gZ2V0IGRlYnVnZ2luZyBtZXNzYWdlcworICogICAgIGdlbmVyYXRlZCB0byBTeXN0ZW0ub3V0LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LjwvbGk+CisgKiA8bGk+PHN0cm9uZz5wYXRobmFtZTwvc3Ryb25nPiAtIFJlbGF0aXZlICh0byB0aGUgcGF0aG5hbWUgc3BlY2lmaWVkIGJ5IHRoZQorICogICAgICJjYXRhbGluYS5iYXNlIiBzeXN0ZW0gcHJvcGVydHkpIG9yIGFic29sdXRlIHBhaHRuYW1lIHRvIHRoZQorICogICAgIFhNTCBmaWxlIGNvbnRhaW5pbmcgb3VyIHVzZXIgaW5mb3JtYXRpb24sIGluIHRoZSBmb3JtYXQgc3VwcG9ydGVkIGJ5CisgKiAgICAge0BsaW5rIE1lbW9yeVJlYWxtfS4gIFRoZSBkZWZhdWx0IHZhbHVlIG1hdGNoZXMgdGhlIE1lbW9yeVJlYWxtCisgKiAgICAgZGVmYXVsdC48L2xpPgorICogPC91bD4KKyAqCisgKiA8cD48c3Ryb25nPklNUExFTUVOVEFUSU9OIE5PVEU8L3N0cm9uZz4gLSBUaGlzIGNsYXNzIGltcGxlbWVudHMKKyAqIDxjb2RlPlJlYWxtPC9jb2RlPiBvbmx5IHRvIHNhdGlzZnkgdGhlIGNhbGxpbmcgcmVxdWlyZW1lbnRzIG9mIHRoZQorICogPGNvZGU+R2VuZXJpY1ByaW5jaXBhbDwvY29kZT4gY29uc3RydWN0b3IuICBJdCBkb2VzIG5vdCBhY3R1YWxseSBwZXJmb3JtCisgKiB0aGUgZnVuY3Rpb25hbGl0eSByZXF1aXJlZCBvZiBhIDxjb2RlPlJlYWxtPC9jb2RlPiBpbXBsZW1lbnRhdGlvbi48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBKQUFTTWVtb3J5TG9naW5Nb2R1bGUgZXh0ZW5kcyBNZW1vcnlSZWFsbSBpbXBsZW1lbnRzIExvZ2luTW9kdWxlLCBSZWFsbSB7CisgICAgLy8gV2UgbmVlZCB0byBleHRlbmQgTWVtb3J5UmVhbG0gdG8gYXZvaWQgY2xhc3MgY2FzdAorCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBQVNNZW1vcnlMb2dpbk1vZHVsZS5jbGFzcyk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGNhbGxiYWNrIGhhbmRsZXIgcmVzcG9uc2libGUgZm9yIGFuc3dlcmluZyBvdXIgcmVxdWVzdHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIENhbGxiYWNrSGFuZGxlciBjYWxsYmFja0hhbmRsZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBIYXMgb3VyIG93biA8Y29kZT5jb21taXQoKTwvY29kZT4gcmV0dXJuZWQgc3VjY2Vzc2Z1bGx5PworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNvbW1pdHRlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyA8Y29kZT5Mb2dpbk1vZHVsZTwvY29kZT4uCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hcCBvcHRpb25zID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhuYW1lIHRvIHRoZSBYTUwgY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aG5hbWUgPSAiY29uZi90b21jYXQtdXNlcnMueG1sIjsKKworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPlByaW5jaXBhbDwvY29kZT4gaWRlbnRpZmllZCBieSBvdXIgdmFsaWRhdGlvbiwgb3IKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB2YWxpZGF0aW9uIGZhbGllZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJpbmNpcGFsIHByaW5jaXBhbCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgPGNvZGU+UHJpbmNpcGFsczwvY29kZT4gbG9hZGVkIGZyb20gb3VyIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCBwcmluY2lwYWxzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RhdGUgaW5mb3JtYXRpb24gdGhhdCBpcyBzaGFyZWQgd2l0aCBvdGhlciBjb25maWd1cmVkCisgICAgICogPGNvZGU+TG9naW5Nb2R1bGU8L2NvZGU+IGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFwIHNoYXJlZFN0YXRlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHN1YmplY3QgZm9yIHdoaWNoIHdlIGFyZSBwZXJmb3JtaW5nIGF1dGhlbnRpY2F0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdWJqZWN0IHN1YmplY3QgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIHB1YmxpYyBKQUFTTWVtb3J5TG9naW5Nb2R1bGUoKSB7CisgICAgICAgIGxvZy5kZWJ1ZygiTUVNT1JZIExPR0lOIE1PRFVMRSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBoYXNlIDIgb2YgYXV0aGVudGljYXRpbmcgYSA8Y29kZT5TdWJqZWN0PC9jb2RlPiB3aGVuIFBoYXNlIDEKKyAgICAgKiBmYWlscy4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpZiB0aGUgPGNvZGU+TG9naW5Db250ZXh0PC9jb2RlPgorICAgICAqIGZhaWxlZCBzb21ld2hlcmUgaW4gdGhlIG92ZXJhbGwgYXV0aGVudGljYXRpb24gY2hhaW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbWV0aG9kIHN1Y2NlZWRlZCwgb3IKKyAgICAgKiAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoaXMgPGNvZGU+TG9naW5Nb2R1bGU8L2NvZGU+IHNob3VsZCBiZQorICAgICAqICBpZ25vcmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExvZ2luRXhjZXB0aW9uIGlmIHRoZSBhYm9ydCBmYWlscworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFib3J0KCkgdGhyb3dzIExvZ2luRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJZiBvdXIgYXV0aGVudGljYXRpb24gd2FzIG5vdCBzdWNjZXNzZnVsLCBqdXN0IHJldHVybiBmYWxzZQorICAgICAgICBpZiAocHJpbmNpcGFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgICAgICAvLyBDbGVhbiB1cCBpZiBvdmVyYWxsIGF1dGhlbnRpY2F0aW9uIGZhaWxlZAorICAgICAgICBpZiAoY29tbWl0dGVkKQorICAgICAgICAgICAgbG9nb3V0KCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29tbWl0dGVkID0gZmFsc2U7CisgICAgICAgICAgICBwcmluY2lwYWwgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGxvZy5kZWJ1ZygiQWJvcnQiKTsKKyAgICAgICAgcmV0dXJuICh0cnVlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGhhc2UgMiBvZiBhdXRoZW50aWNhdGluZyBhIDxjb2RlPlN1YmplY3Q8L2NvZGU+IHdoZW4gUGhhc2UgMQorICAgICAqIHdhcyBzdWNjZXNzZnVsLiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIHRoZSA8Y29kZT5Mb2dpbkNvbnRleHQ8L2NvZGU+CisgICAgICogc3VjY2VlZGVkIGluIHRoZSBvdmVyYWxsIGF1dGhlbnRpY2F0aW9uIGNoYWluLgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXV0aGVudGljYXRpb24gc3VjY2VlZGVkLCBvcgorICAgICAqICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhpcyA8Y29kZT5Mb2dpbk1vZHVsZTwvY29kZT4gc2hvdWxkIGJlCisgICAgICogIGlnbm9yZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTG9naW5FeGNlcHRpb24gaWYgdGhlIGNvbW1pdCBmYWlscworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdCgpIHRocm93cyBMb2dpbkV4Y2VwdGlvbiB7CisgICAgICAgIGxvZy5kZWJ1ZygiY29tbWl0ICIgKyBwcmluY2lwYWwpOworCisgICAgICAgIC8vIElmIGF1dGhlbnRpY2F0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bCwganVzdCByZXR1cm4gZmFsc2UKKyAgICAgICAgaWYgKHByaW5jaXBhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICAgICAgLy8gQWRkIG91ciBQcmluY2lwYWwgdG8gdGhlIFN1YmplY3QgaWYgbmVlZGVkCisgICAgICAgIGlmICghc3ViamVjdC5nZXRQcmluY2lwYWxzKCkuY29udGFpbnMocHJpbmNpcGFsKSkKKyAgICAgICAgICAgIHN1YmplY3QuZ2V0UHJpbmNpcGFscygpLmFkZChwcmluY2lwYWwpOworCisgICAgICAgIGNvbW1pdHRlZCA9IHRydWU7CisgICAgICAgIHJldHVybiAodHJ1ZSk7CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNlY3VyaXR5Q29uc3RyYWludHMgY29uZmlndXJlZCB0byBndWFyZCB0aGUgcmVxdWVzdCBVUkkgZm9yCisgICAgICogdGhpcyByZXF1ZXN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzdWNoIGNvbnN0cmFpbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGUgUmVxdWVzdCBpcyBtYXBwZWQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VjdXJpdHlDb25zdHJhaW50IFtdIGZpbmRTZWN1cml0eUNvbnN0cmFpbnRzKFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbnVsbDsKKyAgICAgICAgLy8gQXJlIHRoZXJlIGFueSBkZWZpbmVkIHNlY3VyaXR5IGNvbnN0cmFpbnRzPworICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgY29uc3RyYWludHNbXSA9IGNvbnRleHQuZmluZENvbnN0cmFpbnRzKCk7CisgICAgICAgIGlmICgoY29uc3RyYWludHMgPT0gbnVsbCkgfHwgKGNvbnN0cmFpbnRzLmxlbmd0aCA9PSAwKSkgeworICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldExvZ2dlcigpLmRlYnVnKCIgIE5vIGFwcGxpY2FibGUgY29uc3RyYWludHMgZGVmaW5lZCIpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGVhY2ggZGVmaW5lZCBzZWN1cml0eSBjb25zdHJhaW50CisgICAgICAgIFN0cmluZyB1cmkgPSByZXF1ZXN0LmdldERlY29kZWRSZXF1ZXN0VVJJKCk7CisgICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKTsKKyAgICAgICAgaWYgKGNvbnRleHRQYXRoLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgIHVyaSA9IHVyaS5zdWJzdHJpbmcoY29udGV4dFBhdGgubGVuZ3RoKCkpOworICAgICAgICB1cmkgPSBSZXF1ZXN0VXRpbC5VUkxEZWNvZGUodXJpKTsgLy8gQmVmb3JlIGNoZWNraW5nIGNvbnN0cmFpbnRzCisgICAgICAgIFN0cmluZyBtZXRob2QgPSByZXF1ZXN0LmdldE1ldGhvZCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TG9nZ2VyKCkuZGVidWcoIiAgQ2hlY2tpbmcgY29uc3RyYWludCAnIiArIGNvbnN0cmFpbnRzW2ldICsKKyAgICAgICAgICAgICAgICAgICAgIicgYWdhaW5zdCAiICsgbWV0aG9kICsgIiAiICsgdXJpICsgIiAtLT4gIiArCisgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzW2ldLmluY2x1ZGVkKHVyaSwgbWV0aG9kKSk7CisgICAgICAgICAgICBpZiAoY29uc3RyYWludHNbaV0uaW5jbHVkZWQodXJpLCBtZXRob2QpKSB7CisgICAgICAgICAgICAgICAgaWYocmVzdWx0cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKGNvbnN0cmFpbnRzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIGFwcGxpY2FibGUgc2VjdXJpdHkgY29uc3RyYWludCB3YXMgZm91bmQKKyAgICAgICAgaWYgKGNvbnRleHQuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRleHQuZ2V0TG9nZ2VyKCkuZGVidWcoIiAgTm8gYXBwbGljYWJsZSBjb25zdHJhaW50IGxvY2F0ZWQiKTsKKyAgICAgICAgaWYocmVzdWx0cyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIFNlY3VyaXR5Q29uc3RyYWludCBbXSBhcnJheSA9IG5ldyBTZWN1cml0eUNvbnN0cmFpbnRbcmVzdWx0cy5zaXplKCldOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHMudG9BcnJheSgpLCAwLCBhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIGFycmF5OworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMgPGNvZGU+TG9naW5Nb2R1bGU8L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3ViamVjdCBUaGUgPGNvZGU+U3ViamVjdDwvY29kZT4gdG8gYmUgYXV0aGVudGljYXRlZAorICAgICAqIEBwYXJhbSBjYWxsYmFja0hhbmRsZXIgQSA8Y29kZT5DYWxsYmFja0hhbmRsZXI8L2NvZGU+IGZvciBjb21tdW5pY2F0aW5nCisgICAgICogIHdpdGggdGhlIGVuZCB1c2VyIGFzIG5lY2Vzc2FyeQorICAgICAqIEBwYXJhbSBzaGFyZWRTdGF0ZSBTdGF0ZSBpbmZvcm1hdGlvbiBzaGFyZWQgd2l0aCBvdGhlcgorICAgICAqICA8Y29kZT5Mb2dpbk1vZHVsZTwvY29kZT4gaW5zdGFuY2VzCisgICAgICogQHBhcmFtIG9wdGlvbnMgQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBzcGVjaWZpYworICAgICAqICA8Y29kZT5Mb2dpbk1vZHVsZTwvY29kZT4gaW5zdGFuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN1YmplY3Qgc3ViamVjdCwgQ2FsbGJhY2tIYW5kbGVyIGNhbGxiYWNrSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBzaGFyZWRTdGF0ZSwgTWFwIG9wdGlvbnMpIHsKKyAgICAgICAgbG9nLmRlYnVnKCJJbml0Iik7CisKKyAgICAgICAgLy8gU2F2ZSBjb25maWd1cmF0aW9uIHZhbHVlcworICAgICAgICB0aGlzLnN1YmplY3QgPSBzdWJqZWN0OworICAgICAgICB0aGlzLmNhbGxiYWNrSGFuZGxlciA9IGNhbGxiYWNrSGFuZGxlcjsKKyAgICAgICAgdGhpcy5zaGFyZWRTdGF0ZSA9IHNoYXJlZFN0YXRlOworICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworCisgICAgICAgIC8vIFBlcmZvcm0gaW5zdGFuY2Utc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgaWYgKG9wdGlvbnMuZ2V0KCJwYXRobmFtZSIpICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnBhdGhuYW1lID0gKFN0cmluZykgb3B0aW9ucy5nZXQoInBhdGhuYW1lIik7CisKKyAgICAgICAgLy8gTG9hZCBvdXIgZGVmaW5lZCBQcmluY2lwYWxzCisgICAgICAgIGxvYWQoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGhhc2UgMSBvZiBhdXRoZW50aWNhdGluZyBhIDxjb2RlPlN1YmplY3Q8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXV0aGVudGljYXRpb24gc3VjY2VlZGVkLCBvcgorICAgICAqICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhpcyA8Y29kZT5Mb2dpbk1vZHVsZTwvY29kZT4gc2hvdWxkIGJlCisgICAgICogIGlnbm9yZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTG9naW5FeGNlcHRpb24gaWYgdGhlIGF1dGhlbnRpY2F0aW9uIGZhaWxzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbG9naW4oKSB0aHJvd3MgTG9naW5FeGNlcHRpb24geworCisgICAgICAgIC8vIFNldCB1cCBvdXIgQ2FsbGJhY2tIYW5kbGVyIHJlcXVlc3RzCisgICAgICAgIGlmIChjYWxsYmFja0hhbmRsZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBMb2dpbkV4Y2VwdGlvbigiTm8gQ2FsbGJhY2tIYW5kbGVyIHNwZWNpZmllZCIpOworICAgICAgICBDYWxsYmFjayBjYWxsYmFja3NbXSA9IG5ldyBDYWxsYmFja1syXTsKKyAgICAgICAgY2FsbGJhY2tzWzBdID0gbmV3IE5hbWVDYWxsYmFjaygiVXNlcm5hbWU6ICIpOworICAgICAgICBjYWxsYmFja3NbMV0gPSBuZXcgUGFzc3dvcmRDYWxsYmFjaygiUGFzc3dvcmQ6ICIsIGZhbHNlKTsKKworICAgICAgICAvLyBJbnRlcmFjdCB3aXRoIHRoZSB1c2VyIHRvIHJldHJpZXZlIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQKKyAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhbGxiYWNrSGFuZGxlci5oYW5kbGUoY2FsbGJhY2tzKTsKKyAgICAgICAgICAgIHVzZXJuYW1lID0gKChOYW1lQ2FsbGJhY2spIGNhbGxiYWNrc1swXSkuZ2V0TmFtZSgpOworICAgICAgICAgICAgcGFzc3dvcmQgPQorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcoKChQYXNzd29yZENhbGxiYWNrKSBjYWxsYmFja3NbMV0pLmdldFBhc3N3b3JkKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTG9naW5FeGNlcHRpb24oZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDYWxsYmFja0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTG9naW5FeGNlcHRpb24oZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgd2UgaGF2ZSByZWNlaXZlZAorICAgICAgICBwcmluY2lwYWwgPSBzdXBlci5hdXRoZW50aWNhdGUodXNlcm5hbWUsIHBhc3N3b3JkKTsKKworICAgICAgICBsb2cuZGVidWcoImxvZ2luICIgKyB1c2VybmFtZSArICIgIiArIHByaW5jaXBhbCk7CisKKyAgICAgICAgLy8gUmVwb3J0IHJlc3VsdHMgYmFzZWQgb24gc3VjY2VzcyBvciBmYWlsdXJlCisgICAgICAgIGlmIChwcmluY2lwYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldworICAgICAgICAgICAgICAgIEZhaWxlZExvZ2luRXhjZXB0aW9uKCJVc2VybmFtZSBvciBwYXNzd29yZCBpcyBpbmNvcnJlY3QiKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2cgb3V0IHRoaXMgdXNlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW4gYWxsIGNhc2VzIGJlY2F1c2UgdGhpZQorICAgICAqICA8Y29kZT5Mb2dpbk1vZHVsZTwvY29kZT4gc2hvdWxkIG5vdCBiZSBpZ25vcmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExvZ2luRXhjZXB0aW9uIGlmIGxvZ2dpbmcgb3V0IGZhaWxlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGxvZ291dCgpIHRocm93cyBMb2dpbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3ViamVjdC5nZXRQcmluY2lwYWxzKCkucmVtb3ZlKHByaW5jaXBhbCk7CisgICAgICAgIGNvbW1pdHRlZCA9IGZhbHNlOworICAgICAgICBwcmluY2lwYWwgPSBudWxsOworICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlYWxtIE1ldGhvZHMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgY29udGVudHMgb2Ygb3VyIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkKCkgeworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBleGlzdGVuY2Ugb2Ygb3VyIGNvbmZpZ3VyYXRpb24gZmlsZQorICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRobmFtZSk7CisgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksIHBhdGhuYW1lKTsKKyAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpIHx8ICFmaWxlLmNhblJlYWQoKSkgeworICAgICAgICAgICAgbG9nLndhcm4oIkNhbm5vdCBsb2FkIGNvbmZpZ3VyYXRpb24gZmlsZSAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2FkIHRoZSBjb250ZW50cyBvZiBvdXIgY29uZmlndXJhdGlvbiBmaWxlCisgICAgICAgIERpZ2VzdGVyIGRpZ2VzdGVyID0gbmV3IERpZ2VzdGVyKCk7CisgICAgICAgIGRpZ2VzdGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlU2V0KG5ldyBNZW1vcnlSdWxlU2V0KCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGlnZXN0ZXIucHVzaCh0aGlzKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLnBhcnNlKGZpbGUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLndhcm4oIkVycm9yIHByb2Nlc3NpbmcgY29uZmlndXJhdGlvbiBmaWxlICIgKworICAgICAgICAgICAgICAgIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZGlnZXN0ZXIucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0pBQVNSZWFsbS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0pBQVNSZWFsbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmODBjNWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vSkFBU1JlYWxtLmphdmEKQEAgLTAsMCArMSw1NjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbTsKKworCitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3Q7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5BY2NvdW50RXhwaXJlZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkNyZWRlbnRpYWxFeHBpcmVkRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uRmFpbGVkTG9naW5FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5Mb2dpbkNvbnRleHQ7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5Mb2dpbkV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisKKy8qKgorICogPHA+SW1wbG1lbnRhdGlvbiBvZiA8Yj5SZWFsbTwvYj4gdGhhdCBhdXRoZW50aWNhdGVzIHVzZXJzIHZpYSB0aGUgPGVtPkphdmEKKyAqIEF1dGhlbnRpY2F0aW9uIGFuZCBBdXRob3JpemF0aW9uIFNlcnZpY2U8L2VtPiAoSkFBUykuICBKQUFTIHN1cHBvcnQgcmVxdWlyZXMKKyAqIGVpdGhlciBKREsgMS40ICh3aGljaCBpbmNsdWRlcyBpdCBhcyBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBwbGF0Zm9ybSkgb3IKKyAqIEpESyAxLjMgKHdpdGggdGhlIHBsdWctaW4gPGNvZGU+amFhcy5qYXI8L2NvZGU+IGZpbGUpLjwvcD4KKyAqCisgKiA8cD5UaGUgdmFsdWUgY29uZmlndXJlZCBmb3IgdGhlIDxjb2RlPmFwcE5hbWU8L2NvZGU+IHByb3BlcnR5IGlzIHBhc3NlZCB0bworICogdGhlIDxjb2RlPmphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uTG9naW5Db250ZXh0PC9jb2RlPiBjb25zdHJ1Y3RvciwgdG8KKyAqIHNwZWNpZnkgdGhlIDxlbT5hcHBsaWNhdGlvbiBuYW1lPC9lbT4gdXNlZCB0byBzZWxlY3QgdGhlIHNldCBvZiByZWxldmFudAorICogPGNvZGU+TG9naW5Nb2R1bGVzPC9jb2RlPiByZXF1aXJlZC48L3A+CisgKgorICogPHA+VGhlIEpBQVMgU3BlY2lmaWNhdGlvbiBkZXNjcmliZXMgdGhlIHJlc3VsdCBvZiBhIHN1Y2Nlc3NmdWwgbG9naW4gYXMgYQorICogPGNvZGU+amF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0PC9jb2RlPiBpbnN0YW5jZSwgd2hpY2ggY2FuIGNvbnRhaW4gemVybworICogb3IgbW9yZSA8Y29kZT5qYXZhLnNlY3VyaXR5LlByaW5jaXBhbDwvY29kZT4gb2JqZWN0cyBpbiB0aGUgcmV0dXJuIHZhbHVlCisgKiBvZiB0aGUgPGNvZGU+U3ViamVjdC5nZXRQcmluY2lwYWxzKCk8L2NvZGU+IG1ldGhvZC4gIEhvd2V2ZXIsIGl0IHByb3ZpZGVzCisgKiBubyBndWlkYW5jZSBvbiBob3cgdG8gZGlzdGluZ3Vpc2ggUHJpbmNpcGFscyB0aGF0IGRlc2NyaWJlIHRoZSBpbmRpdmlkdWFsCisgKiB1c2VyIChhbmQgYXJlIHRodXMgYXBwcm9wcmlhdGUgdG8gcmV0dXJuIGFzIHRoZSB2YWx1ZSBvZgorICogcmVxdWVzdC5nZXRVc2VyUHJpbmNpcGFsKCkgaW4gYSB3ZWIgYXBwbGljYXRpb24pIGZyb20gdGhlIFByaW5jaXBhbChzKQorICogdGhhdCBkZXNjcmliZSB0aGUgYXV0aG9yaXplZCByb2xlcyBmb3IgdGhpcyB1c2VyLiAgVG8gbWFpbnRhaW4gYXMgbXVjaAorICogaW5kZXBlbmRlbmNlIGFzIHBvc3NpYmxlIGZyb20gdGhlIHVuZGVybHlpbmcgPGNvZGU+TG9naW5NZXRob2Q8L2NvZGU+CisgKiBpbXBsZW1lbnRhdGlvbiBleGVjdXRlZCBieSBKQUFTLCB0aGUgZm9sbG93aW5nIHBvbGljeSBpcyBpbXBsZW1lbnRlZCBieQorICogdGhpcyBSZWFsbTo8L3A+CisgKiA8dWw+CisgKiA8bGk+VGhlIEpBQVMgPGNvZGU+TG9naW5Nb2R1bGU8L2NvZGU+IGlzIGFzc3VtZWQgdG8gcmV0dXJuIGEKKyAqICAgICA8Y29kZT5TdWJqZWN0PC9jb2RlPiB3aXRoIGF0IGxlYXN0IG9uZSA8Y29kZT5QcmluY2lwYWw8L2NvZGU+IGluc3RhbmNlCisgKiAgICAgcmVwcmVzZW50aW5nIHRoZSB1c2VyIGhpbXNlbGYgb3IgaGVyc2VsZiwgYW5kIHplcm8gb3IgbW9yZSBzZXBhcmF0ZQorICogICAgIDxjb2RlPlByaW5jaXBhbHM8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgc2VjdXJpdHkgcm9sZXMgYXV0aG9yaXplZAorICogICAgIGZvciB0aGlzIHVzZXIuPC9saT4KKyAqIDxsaT5PbiB0aGUgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIHVzZXIsIHRoZSBQcmluY2lwYWwKKyAqICAgICBuYW1lIGlzIGFuIGFwcHJvcHJpYXRlIHZhbHVlIHRvIHJldHVybiB2aWEgdGhlIFNlcnZsZXQgQVBJIG1ldGhvZAorICogICAgIDxjb2RlPkh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRSZW1vdGVVc2VyKCk8L2NvZGU+LjwvbGk+CisgKiA8bGk+T24gdGhlIDxjb2RlPlByaW5jaXBhbHM8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgc2VjdXJpdHkgcm9sZXMsIHRoZQorICogICAgIG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcml6ZWQgc2VjdXJpdHkgcm9sZS48L2xpPgorICogPGxpPlRoaXMgUmVhbG0gd2lsbCBiZSBjb25maWd1cmVkIHdpdGggdHdvIGxpc3RzIG9mIGZ1bGx5IHF1YWxpZmllZCBKYXZhCisgKiAgICAgY2xhc3MgbmFtZXMgb2YgY2xhc3NlcyB0aGF0IGltcGxlbWVudAorICogICAgIDxjb2RlPmphdmEuc2VjdXJpdHkuUHJpbmNpcGFsPC9jb2RlPiAtIG9uZSB0aGF0IGlkZW50aWZpZXMgY2xhc3MoZXMpCisgKiAgICAgcmVwcmVzZW50aW5nIGEgdXNlciwgYW5kIG9uZSB0aGF0IGlkZW50aWZpZXMgY2xhc3MoZXMpIHJlcHJlc2VudGluZworICogICAgIGEgc2VjdXJpdHkgcm9sZS48L2xpPgorICogPGxpPkFzIHRoaXMgUmVhbG0gaXRlcmF0ZXMgb3ZlciB0aGUgPGNvZGU+UHJpbmNpcGFsczwvY29kZT4gcmV0dXJuZWQgYnkKKyAqICAgICA8Y29kZT5TdWJqZWN0LmdldFByaW5jaXBhbHMoKTwvY29kZT4sIGl0IHdpbGwgaWRlbnRpZnkgdGhlIGZpcnN0CisgKiAgICAgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiB0aGF0IG1hdGNoZXMgdGhlICJ1c2VyIGNsYXNzZXMiIGxpc3QgYXMgdGhlCisgKiAgICAgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiBmb3IgdGhpcyB1c2VyLjwvbGk+CisgKiA8bGk+QXMgdGhpcyBSZWFsbSBpdGVyYXRlcyBvdmVyIHRoZSA8Y29kZT5QcmluY3BhbHM8L2NvZGU+IHJldHVybmVkIGJ5CisgKiAgICAgPGNvZGU+U3ViamVjdC5nZXRQcmluY2lwYWxzKCk8L2NvZGU+LCBpdCB3aWxsIGFjY3VtdWxhdGUgdGhlIHNldCBvZgorICogICAgIGFsbCA8Y29kZT5QcmluY2lwYWxzPC9jb2RlPiBtYXRjaGluZyB0aGUgInJvbGUgY2xhc3NlcyIgbGlzdCBhcworICogICAgIGlkZW50aWZ5aW5nIHRoZSBzZWN1cml0eSByb2xlcyBmb3IgdGhpcyB1c2VyLjwvbGk+CisgKiA8bGk+SXQgaXMgYSBjb25maWd1cmF0aW9uIGVycm9yIGZvciB0aGUgSkFBUyBsb2dpbiBtZXRob2QgdG8gcmV0dXJuIGEKKyAqICAgICB2YWxpZGF0ZWQgPGNvZGU+U3ViamVjdDwvY29kZT4gd2l0aG91dCBhIDxjb2RlPlByaW5jaXBhbDwvY29kZT4gdGhhdAorICogICAgIG1hdGNoZXMgdGhlICJ1c2VyIGNsYXNzZXMiIGxpc3QuPC9saT4KKyAqIDxsaT5CeSBkZWZhdWx0LCB0aGUgZW5jbG9zaW5nIENvbnRhaW5lcidzIG5hbWUgc2VydmVzIGFzIHRoZQorICogICAgIGFwcGxpY2F0aW9uIG5hbWUgdXNlZCB0byBvYnRhaW4gdGhlIEpBQVMgTG9naW5Db250ZXh0ICgiQ2F0YWxpbmEiIGluCisgKiAgICAgYSBkZWZhdWx0IGluc3RhbGxhdGlvbikuIFRvbWNhdCBtdXN0IGJlIGFibGUgdG8gZmluZCBhbiBhcHBsaWNhdGlvbgorICogICAgIHdpdGggdGhpcyBuYW1lIGluIHRoZSBKQUFTIGNvbmZpZ3VyYXRpb24gZmlsZS4gSGVyZSBpcyBhIGh5cG90aGV0aWNhbAorICogICAgIEpBQVMgY29uZmlndXJhdGlvbiBmaWxlIGVudHJ5IGZvciBhIGRhdGFiYXNlLW9yaWVudGVkIGxvZ2luIG1vZHVsZSB0aGF0IHVzZXMgCisgKiAgICAgYSBUb21jYXQtbWFuYWdlZCBKTkRJIGRhdGFiYXNlIHJlc291cmNlOgorICogICAgIDxibG9ja3F1b3RlPjxwcmU+Q2F0YWxpbmEgeworb3JnLmZvb2Jhci5hdXRoLkRhdGFiYXNlTG9naW5Nb2R1bGUgUkVRVUlSRUQKKyAgICBKTkRJX1JFU09VUkNFPWpkYmMvQXV0aERCCisgIFVTRVJfVEFCTEU9dXNlcnMKKyAgVVNFUl9JRF9DT0xVTU49aWQKKyAgVVNFUl9OQU1FX0NPTFVNTj1uYW1lCisgIFVTRVJfQ1JFREVOVElBTF9DT0xVTU49cGFzc3dvcmQKKyAgUk9MRV9UQUJMRT1yb2xlcworICBST0xFX05BTUVfQ09MVU1OPW5hbWUKKyAgUFJJTkNJUEFMX0ZBQ1RPUlk9b3JnLmZvb2Jhci5hdXRoLmltcGwuU2ltcGxlUHJpbmNpcGFsRmFjdG9yeTsKK307PC9wcmU+PC9ibG9ja3F1b3RlPjwvbGk+CisgKiA8bGk+VG8gc2V0IHRoZSBKQUFTIGNvbmZpZ3VyYXRpb24gZmlsZQorICogICAgIGxvY2F0aW9uLCBzZXQgdGhlIDxjb2RlPkNBVEFMSU5BX09QVFM8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlCisgKiAgICAgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nOgorPGJsb2NrcXVvdGU+PGNvZGU+Q0FUQUxJTkFfT1BUUz0iLURqYXZhLnNlY3VyaXR5LmF1dGgubG9naW4uY29uZmlnPSRDQVRBTElOQV9IT01FL2NvbmYvamFhcy5jb25maWciPC9jb2RlPjwvYmxvY2txdW90ZT4KKyAqIDwvbGk+CisgKiA8bGk+QXMgcGFydCBvZiB0aGUgbG9naW4gcHJvY2VzcywgSkFBU1JlYWxtIHJlZ2lzdGVycyBpdHMgb3duIDxjb2RlPkNhbGxiYWNrSGFuZGxlcjwvY29kZT4sCisgKiAgICAgY2FsbGVkICh1bnN1cnByaXNpbmdseSkgPGNvZGU+SkFBU0NhbGxiYWNrSGFuZGxlcjwvY29kZT4uIFRoaXMgaGFuZGxlciBzdXBwbGllcyB0aGUgCisgKiAgICAgSFRUUCByZXF1ZXN0cydzIHVzZXJuYW1lIGFuZCBjcmVkZW50aWFscyB0byB0aGUgdXNlci1zdXBwbGllZCA8Y29kZT5Mb2dpbk1vZHVsZTwvY29kZT48L2xpPgorICogPGxpPkFzIHdpdGggb3RoZXIgPGNvZGU+UmVhbG08L2NvZGU+IGltcGxlbWVudGF0aW9ucywgZGlnZXN0ZWQgcGFzc3dvcmRzIGFyZSBzdXBwb3J0ZWQgaWYKKyAqICAgICB0aGUgPGNvZGU+Jmx0O1JlYWxtJmd0OzwvY29kZT4gZWxlbWVudCBpbiA8Y29kZT5zZXJ2ZXIueG1sPC9jb2RlPiBjb250YWlucyBhIAorICogICAgIDxjb2RlPmRpZ2VzdDwvY29kZT4gYXR0cmlidXRlOyA8Y29kZT5KQUFTQ2FsbGJhY2tIYW5kbGVyPC9jb2RlPiB3aWxsIGRpZ2VzdCB0aGUgcGFzc3dvcmQKKyAqICAgICBwcmlvciB0byBwYXNzaW5nIGl0IGJhY2sgdG8gdGhlIDxjb2RlPkxvZ2luTW9kdWxlPC9jb2RlPjwvbGk+ICAKKyogPC91bD4KKyoKKyogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisqIEBhdXRob3IgWW9hdiBTaGFwaXJhCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBKQUFTUmVhbG0KKyAgICBleHRlbmRzIFJlYWxtQmFzZQorIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSkFBU1JlYWxtLmNsYXNzKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXBwbGljYXRpb24gbmFtZSBwYXNzZWQgdG8gdGhlIEpBQVMgPGNvZGU+TG9naW5Db250ZXh0PC9jb2RlPiwKKyAgICAgKiB3aGljaCB1c2VzIGl0IHRvIHNlbGVjdCB0aGUgc2V0IG9mIHJlbGV2YW50IDxjb2RlPkxvZ2luTW9kdWxlPC9jb2RlPnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBhcHBOYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyA8Y29kZT5SZWFsbTwvY29kZT4gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpBQVNSZWFsbS8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIDxjb2RlPlJlYWxtPC9jb2RlPiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lID0gIkpBQVNSZWFsbSI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIHJvbGUgY2xhc3MgbmFtZXMsIHNwbGl0IG91dCBmb3IgZWFzeSBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBMaXN0IHJvbGVDbGFzc2VzID0gbmV3IEFycmF5TGlzdCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIHVzZXIgY2xhc3MgbmFtZXMsIHNwbGl0IG91dCBmb3IgZWFzeSBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBMaXN0IHVzZXJDbGFzc2VzID0gbmV3IEFycmF5TGlzdCgpOworCisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHVzZSBjb250ZXh0IENsYXNzTG9hZGVyIG9yIGRlZmF1bHQgQ2xhc3NMb2FkZXIuCisgICAgICogVHJ1ZSBtZWFucyB1c2UgY29udGV4dCBDbGFzc0xvYWRlciwgYW5kIFRydWUgaXMgdGhlIGRlZmF1bHQKKyAgICAgKiB2YWx1ZS4KKyAgICAgKi8KKyAgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlQ29udGV4dENsYXNzTG9hZGVyID0gdHJ1ZTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICAKKyAgICAvKioKKyAgICAgKiBzZXR0ZXIgZm9yIHRoZSA8Y29kZT5hcHBOYW1lPC9jb2RlPiBtZW1iZXIgdmFyaWFibGUKKyAgICAgKiBAZGVwcmVjYXRlZCBKQUFTIHNob3VsZCB1c2UgdGhlIDxjb2RlPkVuZ2luZTwvY29kZT4gKGRvbWFpbikgbmFtZSBhbmQgd2VicHAvaG9zdCBvdmVycmlkZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcHBOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGFwcE5hbWUgPSBuYW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBnZXR0ZXIgZm9yIHRoZSA8Y29kZT5hcHBOYW1lPC9jb2RlPiBtZW1iZXIgdmFyaWFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFwcE5hbWUoKSB7CisgICAgICAgIHJldHVybiBhcHBOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0byB1c2UgdGhlIGNvbnRleHQgb3IgZGVmYXVsdCBDbGFzc0xvYWRlci4KKyAgICAgKiBUcnVlIG1lYW5zIHVzZSBjb250ZXh0IENsYXNzTG9hZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZUNvbnRleHQgVHJ1ZSBtZWFucyB1c2UgY29udGV4dCBDbGFzc0xvYWRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZUNvbnRleHRDbGFzc0xvYWRlcihib29sZWFuIHVzZUNvbnRleHQpIHsKKyAgICAgIHVzZUNvbnRleHRDbGFzc0xvYWRlciA9IHVzZUNvbnRleHQ7CisgICAgICBsb2cuaW5mbygiU2V0dGluZyB1c2VDb250ZXh0Q2xhc3NMb2FkZXIgPSAiICsgdXNlQ29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRvIHVzZSB0aGUgY29udGV4dCBvciBkZWZhdWx0IENsYXNzTG9hZGVyLgorICAgICAqIFRydWUgbWVhbnMgdG8gdXNlIHRoZSBjb250ZXh0IENsYXNzTG9hZGVyLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgb2YgdXNlQ29udGV4dENsYXNzTG9hZGVyCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNVc2VDb250ZXh0Q2xhc3NMb2FkZXIoKSB7CisJcmV0dXJuIHVzZUNvbnRleHRDbGFzc0xvYWRlcjsKKyAgICB9IAorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgc3VwZXIuc2V0Q29udGFpbmVyKGNvbnRhaW5lcik7CisKKyAgICAgICAgaWYoIGFwcE5hbWU9PW51bGwgICkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWU9Y29udGFpbmVyLmdldE5hbWUoKTsKKyAgICAgICAgICAgIG5hbWUgPSBtYWtlTGVnYWxGb3JKQUFTKG5hbWUpOworCisgICAgICAgICAgICBhcHBOYW1lPW5hbWU7CisKKyAgICAgICAgICAgIGxvZy5pbmZvKCJTZXQgSkFBUyBhcHAgbmFtZSAiICsgYXBwTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAgLyoqCisgICAgICAqIENvbW1hLWRlbGltaXRlZCBsaXN0IG9mIDxjb2RlPmphdmEuc2VjdXJpdHkuUHJpbmNpcGFsPC9jb2RlPiBjbGFzc2VzCisgICAgICAqIHRoYXQgcmVwcmVzZW50IHNlY3VyaXR5IHJvbGVzLgorICAgICAgKi8KKyAgICAgcHJvdGVjdGVkIFN0cmluZyByb2xlQ2xhc3NOYW1lcyA9IG51bGw7CisgICAgIAorICAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGVDbGFzc05hbWVzKCkgeworICAgICAgICAgcmV0dXJuICh0aGlzLnJvbGVDbGFzc05hbWVzKTsKKyAgICAgfQorICAgICAKKyAgICAgLyoqCisgICAgICAqIFNldHMgdGhlIGxpc3Qgb2YgY29tbWEtZGVsaW1pdGVkIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgCisgICAgICAqIHJvbGVzLiBUaGUgY2xhc3NlcyBpbiB0aGUgbGlzdCBtdXN0IGltcGxlbWVudCA8Y29kZT5qYXZhLnNlY3VyaXR5LlByaW5jaXBhbDwvY29kZT4uCisgICAgICAqIFdoZW4gdGhpcyBhY2Nlc3NvciBpcyBjYWxsZWQgKGZvciBleGFtcGxlLCBieSBhIDxjb2RlPkRpZ2VzdGVyPC9jb2RlPgorICAgICAgKiBpbnN0YW5jZSBwYXJzaW5nIHRoZQorICAgICAgKiBjb25maWd1cmF0aW9uIGZpbGUpLCBpdCB3aWxsIHBhcnNlIHRoZSBjbGFzcyBuYW1lcyBhbmQgc3RvcmUgdGhlIHJlc3VsdGluZworICAgICAgKiBzdHJpbmcocykgaW50byB0aGUgPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBmaWVsZCA8L2NvZGU+cm9sZUNsYXNzZXM8L2NvZGU+LgorICAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgc2V0Um9sZUNsYXNzTmFtZXMoU3RyaW5nIHJvbGVDbGFzc05hbWVzKSB7CisgICAgICAgICB0aGlzLnJvbGVDbGFzc05hbWVzID0gcm9sZUNsYXNzTmFtZXM7CisgICAgICAgICBwYXJzZUNsYXNzTmFtZXMocm9sZUNsYXNzTmFtZXMsIHJvbGVDbGFzc2VzKTsKKyAgICAgfQorICAgICAKKyAgICAgLyoqCisgICAgICAqIFBhcnNlcyBhIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIGNsYXNzIG5hbWVzLCBhbmQgc3RvcmUgdGhlIGNsYXNzIG5hbWVzCisgICAgICAqIGluIHRoZSBwcm92aWRlZCBMaXN0LiBFYWNoIGNsYXNzIG11c3QgaW1wbGVtZW50IDxjb2RlPmphdmEuc2VjdXJpdHkuUHJpbmNpcGFsPC9jb2RlPi4KKyAgICAgICogCisgICAgICAqIEBwYXJhbSBjbGFzc05hbWVzU3RyaW5nIGEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWVzLgorICAgICAgKiBAcGFyYW0gY2xhc3NOYW1lc0xpc3QgdGhlIGxpc3QgaW4gd2hpY2ggdGhlIGNsYXNzIG5hbWVzIHdpbGwgYmUgc3RvcmVkLgorICAgICAgKiAgICAgICAgVGhlIGxpc3QgaXMgY2xlYXJlZCBiZWZvcmUgYmVpbmcgcG9wdWxhdGVkLiAKKyAgICAgICovCisgICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlQ2xhc3NOYW1lcyhTdHJpbmcgY2xhc3NOYW1lc1N0cmluZywgTGlzdCBjbGFzc05hbWVzTGlzdCkgeworICAgICAgICAgY2xhc3NOYW1lc0xpc3QuY2xlYXIoKTsKKyAgICAgICAgIGlmIChjbGFzc05hbWVzU3RyaW5nID09IG51bGwpIHJldHVybjsKKyAgICAgICAgIAorICAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lcyA9IGNsYXNzTmFtZXNTdHJpbmcuc3BsaXQoIlsgXSosWyBdKiIpOworICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lc1tpXS5sZW5ndGgoKT09MCkgY29udGludWU7ICAgICAgICAKKyAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICBDbGFzcyBwcmluY2lwYWxDbGFzcyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lc1tpXSk7CisgICAgICAgICAgICAgICAgIGlmIChQcmluY2lwYWwuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwcmluY2lwYWxDbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZXNMaXN0LmFkZChjbGFzc05hbWVzW2ldKTsKKyAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3MgIitjbGFzc05hbWVzW2ldKyIgaXMgbm90IGltcGxlbWVudGluZyAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhLnNlY3VyaXR5LlByaW5jaXBhbCEgQ2xhc3Mgbm90IGFkZGVkLiIpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3MgIitjbGFzc05hbWVzW2ldKyIgbm90IGZvdW5kISBDbGFzcyBub3QgYWRkZWQuIik7CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICB9CisgICAgIAorICAgICAvKioKKyAgICAgICogQ29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgPGNvZGU+amF2YS5zZWN1cml0eS5QcmluY2lwYWw8L2NvZGU+IGNsYXNzZXMKKyAgICAgICogdGhhdCByZXByZXNlbnQgaW5kaXZpZHVhbCB1c2Vycy4KKyAgICAgICovCisgICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlckNsYXNzTmFtZXMgPSBudWxsOworICAgICAKKyAgICAgcHVibGljIFN0cmluZyBnZXRVc2VyQ2xhc3NOYW1lcygpIHsKKyAgICAgICAgIHJldHVybiAodGhpcy51c2VyQ2xhc3NOYW1lcyk7CisgICAgIH0KKyAgICAgCisgICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxpc3Qgb2YgY29tbWEtZGVsaW1pdGVkIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgaW5kaXZpZHVhbAorICAgICAqIHVzZXJzLiBUaGUgY2xhc3NlcyBpbiB0aGUgbGlzdCBtdXN0IGltcGxlbWVudCA8Y29kZT5qYXZhLnNlY3VyaXR5LlByaW5jaXBhbDwvY29kZT4uCisgICAgICogV2hlbiB0aGlzIGFjY2Vzc29yIGlzIGNhbGxlZCAoZm9yIGV4YW1wbGUsIGJ5IGEgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+CisgICAgICogaW5zdGFuY2UgcGFyc2luZyB0aGUKKyAgICAgKiBjb25maWd1cmF0aW9uIGZpbGUpLCBpdCB3aWxsIHBhcnNlIHRoZSBjbGFzcyBuYW1lcyBhbmQgc3RvcmUgdGhlIHJlc3VsdGluZworICAgICAqIHN0cmluZyhzKSBpbnRvIHRoZSA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+IGZpZWxkIDwvY29kZT51c2VyQ2xhc3NlczwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlckNsYXNzTmFtZXMoU3RyaW5nIHVzZXJDbGFzc05hbWVzKSB7CisgICAgICAgIHRoaXMudXNlckNsYXNzTmFtZXMgPSB1c2VyQ2xhc3NOYW1lczsKKyAgICAgICAgcGFyc2VDbGFzc05hbWVzKHVzZXJDbGFzc05hbWVzLCB1c2VyQ2xhc3Nlcyk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5QcmluY2lwYWw8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lIGFuZAorICAgICAqIGNyZWRlbnRpYWxzLCBpZiB0aGVyZSBpcyBvbmU7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVycm9ycyB3aXRoIHRoZSBKREJDIGNvbm5lY3Rpb24sIGV4ZWN1dGluZworICAgICAqIHRoZSBxdWVyeSBvciBhbnl0aGluZyB3ZSByZXR1cm4gbnVsbCAoZG9uJ3QgYXV0aGVudGljYXRlKS4gVGhpcworICAgICAqIGV2ZW50IGlzIGFsc28gbG9nZ2VkLCBhbmQgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgc28gdGhhdAorICAgICAqIGEgc3Vic2VxdWVudCByZXF1ZXN0IHdpbGwgYXV0b21hdGljYWxseSByZS1vcGVuIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lIG9mIHRoZSA8Y29kZT5QcmluY2lwYWw8L2NvZGU+IHRvIGxvb2sgdXAKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgUGFzc3dvcmQgb3Igb3RoZXIgY3JlZGVudGlhbHMgdG8gdXNlIGluCisgICAgICogIGF1dGhlbnRpY2F0aW5nIHRoaXMgdXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbmNpcGFsIGF1dGhlbnRpY2F0ZShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBjcmVkZW50aWFscykgeworCisgICAgICAgIC8vIEVzdGFibGlzaCBhIExvZ2luQ29udGV4dCB0byB1c2UgZm9yIGF1dGhlbnRpY2F0aW9uCisgICAgICAgIHRyeSB7CisgICAgICAgIExvZ2luQ29udGV4dCBsb2dpbkNvbnRleHQgPSBudWxsOworICAgICAgICBpZiggYXBwTmFtZT09bnVsbCApIGFwcE5hbWU9IlRvbWNhdCI7CisKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiamFhc1JlYWxtLmJlZ2luTG9naW4iLCB1c2VybmFtZSwgYXBwTmFtZSkpOworCisgICAgICAgIC8vIFdoYXQgaWYgdGhlIExvZ2luTW9kdWxlIGlzIGluIHRoZSBjb250YWluZXIgY2xhc3MgbG9hZGVyID8KKyAgICAgICAgQ2xhc3NMb2FkZXIgb2NsID0gbnVsbDsKKworICAgICAgICBpZiAoaXNVc2VDb250ZXh0Q2xhc3NMb2FkZXIoKSkgeworICAgICAgICAgIG9jbD1UaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2dpbkNvbnRleHQgPSBuZXcgTG9naW5Db250ZXh0CisgICAgICAgICAgICAgICAgKGFwcE5hbWUsIG5ldyBKQUFTQ2FsbGJhY2tIYW5kbGVyKHRoaXMsIHVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscykpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiamFhc1JlYWxtLnVuZXhwZWN0ZWRFcnJvciIpLCBlKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiggaXNVc2VDb250ZXh0Q2xhc3NMb2FkZXIoKSkgeworICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihvY2wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJMb2dpbiBjb250ZXh0IGNyZWF0ZWQgIiArIHVzZXJuYW1lKTsKKworICAgICAgICAvLyBOZWdvdGlhdGUgYSBsb2dpbiB2aWEgdGhpcyBMb2dpbkNvbnRleHQKKyAgICAgICAgU3ViamVjdCBzdWJqZWN0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZ2luQ29udGV4dC5sb2dpbigpOworICAgICAgICAgICAgc3ViamVjdCA9IGxvZ2luQ29udGV4dC5nZXRTdWJqZWN0KCk7CisgICAgICAgICAgICBpZiAoc3ViamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJqYWFzUmVhbG0uZmFpbGVkTG9naW4iLCB1c2VybmFtZSkpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEFjY291bnRFeHBpcmVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJqYWFzUmVhbG0uYWNjb3VudEV4cGlyZWQiLCB1c2VybmFtZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoQ3JlZGVudGlhbEV4cGlyZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImphYXNSZWFsbS5jcmVkZW50aWFsRXhwaXJlZCIsIHVzZXJuYW1lKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9IGNhdGNoIChGYWlsZWRMb2dpbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiamFhc1JlYWxtLmZhaWxlZExvZ2luIiwgdXNlcm5hbWUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKExvZ2luRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiamFhc1JlYWxtLmxvZ2luRXhjZXB0aW9uIiwgdXNlcm5hbWUpLCBlKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJqYWFzUmVhbG0udW5leHBlY3RlZEVycm9yIiksIGUpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImphYXNSZWFsbS5sb2dpbkNvbnRleHRDcmVhdGVkIiwgdXNlcm5hbWUpKTsKKworICAgICAgICAvLyBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIFByaW5jaXBhbCBmb3IgdGhpcyBhdXRoZW50aWNhdGVkIFN1YmplY3QKKyAgICAgICAgUHJpbmNpcGFsIHByaW5jaXBhbCA9IGNyZWF0ZVByaW5jaXBhbCh1c2VybmFtZSwgc3ViamVjdCk7CisgICAgICAgIGlmIChwcmluY2lwYWwgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiamFhc1JlYWxtLmF1dGhlbnRpY2F0ZUZhaWx1cmUiLCB1c2VybmFtZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImphYXNSZWFsbS5hdXRoZW50aWNhdGVTdWNjZXNzIiwgdXNlcm5hbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAocHJpbmNpcGFsKTsKKyAgICAgICAgfSBjYXRjaCggVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvciggImVycm9yICIsIHQpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzaG9ydCBuYW1lIGZvciB0aGlzIDxjb2RlPlJlYWxtPC9jb2RlPiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXNzd29yZCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByaW5jaXBhbCdzIHVzZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhc3N3b3JkKFN0cmluZyB1c2VybmFtZSkgeworCisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHVzZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJpbmNpcGFsIGdldFByaW5jaXBhbChTdHJpbmcgdXNlcm5hbWUpIHsKKworICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJZGVudGlmeSBhbmQgcmV0dXJuIGEgPGNvZGU+amF2YS5zZWN1cml0eS5QcmluY2lwYWw8L2NvZGU+IGluc3RhbmNlCisgICAgICogcmVwcmVzZW50aW5nIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIgZm9yIHRoZSBzcGVjaWZpZWQgPGNvZGU+U3ViamVjdDwvY29kZT4uCisgICAgICogVGhlIFByaW5jaXBhbCBpcyBjb25zdHJ1Y3RlZCBieSBzY2FubmluZyB0aGUgbGlzdCBvZiBQcmluY2lwYWxzIHJldHVybmVkCisgICAgICogYnkgdGhlIEpBQVNMb2dpbk1vZHVsZS4gVGhlIGZpcnN0IDxjb2RlPlByaW5jaXBhbDwvY29kZT4gb2JqZWN0IHRoYXQgbWF0Y2hlcworICAgICAqIG9uZSBvZiB0aGUgY2xhc3MgbmFtZXMgc3VwcGxpZWQgYXMgYSAidXNlciBjbGFzcyIgaXMgdGhlIHVzZXIgUHJpbmNpcGFsLgorICAgICAqIFRoaXMgb2JqZWN0IGlzIHJldHVybmVkIHRvIHRoYSBjYWxsZXIuCisgICAgICogQW55IHJlbWFpbmluZyBwcmluY2lwYWwgb2JqZWN0cyByZXR1cm5lZCBieSB0aGUgTG9naW5Nb2R1bGVzIGFyZSBtYXBwZWQgdG8gIAorICAgICAqIHJvbGVzLCBidXQgb25seSBpZiB0aGVpciByZXNwZWN0aXZlIGNsYXNzZXMgbWF0Y2ggb25lIG9mIHRoZSAicm9sZSBjbGFzcyIgY2xhc3Nlcy4gCisgICAgICogSWYgYSB1c2VyIFByaW5jaXBhbCBjYW5ub3QgYmUgY29uc3RydWN0ZWQsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3ViamVjdCBUaGUgPGNvZGU+U3ViamVjdDwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBsb2dnZWQtaW4gdXNlcgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmluY2lwYWwgY3JlYXRlUHJpbmNpcGFsKFN0cmluZyB1c2VybmFtZSwgU3ViamVjdCBzdWJqZWN0KSB7CisgICAgICAgIC8vIFByZXBhcmUgdG8gc2NhbiB0aGUgUHJpbmNpcGFscyBmb3IgdGhpcyBTdWJqZWN0CisKKyAgICAgICAgTGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgUHJpbmNpcGFsIHVzZXJQcmluY2lwYWwgPSBudWxsOworCisgICAgICAgIC8vIFNjYW4gdGhlIFByaW5jaXBhbHMgZm9yIHRoaXMgU3ViamVjdAorICAgICAgICBJdGVyYXRvciBwcmluY2lwYWxzID0gc3ViamVjdC5nZXRQcmluY2lwYWxzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKHByaW5jaXBhbHMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBQcmluY2lwYWwgcHJpbmNpcGFsID0gKFByaW5jaXBhbCkgcHJpbmNpcGFscy5uZXh0KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBwcmluY2lwYWxDbGFzcyA9IHByaW5jaXBhbC5nZXRDbGFzcygpLmdldE5hbWUoKTsKKworICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImphYXNSZWFsbS5jaGVja1ByaW5jaXBhbCIsIHByaW5jaXBhbCwgcHJpbmNpcGFsQ2xhc3MpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHVzZXJQcmluY2lwYWwgPT0gbnVsbCAmJiB1c2VyQ2xhc3Nlcy5jb250YWlucyhwcmluY2lwYWxDbGFzcykpIHsKKyAgICAgICAgICAgICAgICB1c2VyUHJpbmNpcGFsID0gcHJpbmNpcGFsOworICAgICAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiamFhc1JlYWxtLnVzZXJQcmluY2lwYWxTdWNjZXNzIiwgcHJpbmNpcGFsLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHJvbGVDbGFzc2VzLmNvbnRhaW5zKHByaW5jaXBhbENsYXNzKSkgeworICAgICAgICAgICAgICAgIHJvbGVzLmFkZChwcmluY2lwYWwuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImphYXNSZWFsbS5yb2xlUHJpbmNpcGFsQWRkIiwgcHJpbmNpcGFsLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFByaW50IGZhaWx1cmUgbWVzc2FnZSBpZiBuZWVkZWQKKyAgICAgICAgaWYgKHVzZXJQcmluY2lwYWwgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiamFhc1JlYWxtLnVzZXJQcmluY2lwYWxGYWlsdXJlIikpOworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImphYXNSZWFsbS5yb2xlUHJpbmNpcGFsRmFpbHVyZSIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChyb2xlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJqYWFzUmVhbG0ucm9sZVByaW5jaXBhbEZhaWx1cmUiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSByZXN1bHRpbmcgUHJpbmNpcGFsIGZvciBvdXIgYXV0aGVudGljYXRlZCB1c2VyCisgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY1ByaW5jaXBhbCh0aGlzLCB1c2VybmFtZSwgbnVsbCwgcm9sZXMsIHVzZXJQcmluY2lwYWwpOworICAgIH0KKworICAgICAvKioKKyAgICAgICogRW5zdXJlIHRoZSBnaXZlbiBuYW1lIGlzIGxlZ2FsIGZvciBKQUFTIGNvbmZpZ3VyYXRpb24uCisgICAgICAqIEFkZGVkIGZvciBCdWd6aWxsYSAzMDg2OSwgbWFkZSBwcm90ZWN0ZWQgZm9yIGVhc3kgY3VzdG9taXphdGlvbgorICAgICAgKiBpbiBjYXNlIG15IGltcGxlbWVudGF0aW9uIGlzIGluc3VmZmljaWVudCwgd2hpY2ggSSB0aGluayBpcworICAgICAgKiB2ZXJ5IGxpa2VseS4KKyAgICAgICoKKyAgICAgICogQHBhcmFtIHNyYyBUaGUgbmFtZSB0byB2YWxpZGF0ZQorICAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIHRoYXQncyBhIHZhbGlkIEpBQVMgcmVhbG0gbmFtZQorICAgICAgKi8KKyAgICAgcHJvdGVjdGVkIFN0cmluZyBtYWtlTGVnYWxGb3JKQUFTKGZpbmFsIFN0cmluZyBzcmMpIHsKKyAgICAgICAgIFN0cmluZyByZXN1bHQgPSBzcmM7CisgICAgICAgICAKKyAgICAgICAgIC8vIERlZmF1bHQgbmFtZSBpcyAib3RoZXIiIHBlciBKQUFTIHNwZWMKKyAgICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgcmVzdWx0ID0gIm90aGVyIjsKKyAgICAgICAgIH0KKworICAgICAgICAgLy8gU3RyaXAgbGVhZGluZyBzbGFzaCBpZiBwcmVzZW50LCBhcyBTdW4gSkFBUyBpbXBsCisgICAgICAgICAvLyBiYXJmcyBvbiBpdCAoc2VlIEJ1Z3ppbGxhIDMwODY5IGJ1ZyByZXBvcnQpLgorICAgICAgICAgaWYocmVzdWx0LnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoMSk7CisgICAgICAgICB9CisKKyAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqCisgICAgICogUHJlcGFyZSBmb3IgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcyA8Y29kZT5Db21wb25lbnQ8L2NvZGU+LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgaXQgZnJvbSBiZWluZyBzdGFydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQZXJmb3JtIG5vcm1hbCBzdXBlcmNsYXNzIGluaXRpYWxpemF0aW9uCisgICAgICAgIHN1cGVyLnN0YXJ0KCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgc2h1dCBkb3duIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgPGNvZGU+Q29tcG9uZW50PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFBlcmZvcm0gbm9ybWFsIHN1cGVyY2xhc3MgZmluYWxpemF0aW9uCisgICAgICAgIHN1cGVyLnN0b3AoKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vSkRCQ1JlYWxtLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vSkRCQ1JlYWxtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2NGFkNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9KREJDUmVhbG0uamF2YQpAQCAtMCwwICsxLDc5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtOworCisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLkRyaXZlcjsKK2ltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworCisvKioKKyoKKyogSW1wbG1lbnRhdGlvbiBvZiA8Yj5SZWFsbTwvYj4gdGhhdCB3b3JrcyB3aXRoIGFueSBKREJDIHN1cHBvcnRlZCBkYXRhYmFzZS4KKyogU2VlIHRoZSBKREJDUmVhbG0uaG93dG8gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gc2V0IHVwIHRoZSBkYXRhYmFzZSBhbmQKKyogZm9yIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyoKKyogPHA+PHN0cm9uZz5UT0RPPC9zdHJvbmc+IC0gU3VwcG9ydCBjb25uZWN0aW9uIHBvb2xpbmcgKGluY2x1ZGluZyBtZXNzYWdlCisqIGZvcm1hdCBvYmplY3RzKSBzbyB0aGF0IDxjb2RlPmF1dGhlbnRpY2F0ZSgpPC9jb2RlPiwKKyogPGNvZGU+Z2V0UGFzc3dvcmQoKTwvY29kZT4gYW5kIDxjb2RlPnJvbGVzKCk8L2NvZGU+ICBkbyBub3QgaGF2ZSB0byBiZQorKiBzeW5jaHJvbml6ZWQgYW5kIHdvdWxkIGZpeCB0aGUgdWdseSBjb25uZWN0aW9uIGxvZ2ljLiA8L3A+CisqCisqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorKiBAYXV0aG9yIENhcnNvbiBNY0RvbmFsZAorKiBAYXV0aG9yIElnbmFjaW8gT3J0ZWdhCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisqLworCitwdWJsaWMgY2xhc3MgSkRCQ1JlYWxtCisgICAgZXh0ZW5kcyBSZWFsbUJhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbm5lY3Rpb24gdXNlcm5hbWUgdG8gdXNlIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvbk5hbWUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29ubmVjdGlvbiBVUkwgdG8gdXNlIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvblBhc3N3b3JkID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbm5lY3Rpb24gVVJMIHRvIHVzZSB3aGVuIHRyeWluZyB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25VUkwgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbm5lY3Rpb24gZGJDb25uZWN0aW9uID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogSW5zdGFuY2Ugb2YgdGhlIEpEQkMgRHJpdmVyIGNsYXNzIHdlIHVzZSBhcyBhIGNvbm5lY3Rpb24gZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRHJpdmVyIGRyaXZlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBKREJDIGRyaXZlciB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJOYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBSZWFsbSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkRCQ1JlYWxtLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUmVhbG0gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZSA9ICJKREJDUmVhbG0iOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgUHJlcGFyZWRTdGF0ZW1lbnQgdG8gdXNlIGZvciBhdXRoZW50aWNhdGluZyB1c2Vycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZWRDcmVkZW50aWFscyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBQcmVwYXJlZFN0YXRlbWVudCB0byB1c2UgZm9yIGlkZW50aWZ5aW5nIHRoZSByb2xlcyBmb3IKKyAgICAgKiBhIHNwZWNpZmllZCB1c2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlZFJvbGVzID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbHVtbiBpbiB0aGUgdXNlciByb2xlIHRhYmxlIHRoYXQgbmFtZXMgYSByb2xlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByb2xlTmFtZUNvbCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzIGNyZWRpbnRpYWxzCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB1c2VyQ3JlZENvbCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzIG5hbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHVzZXJOYW1lQ29sID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHJlbGF0aW9uIGJldHdlZW4gdXNlcidzIGFuZCByb2xlcworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlclJvbGVUYWJsZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSB0YWJsZSB0aGF0IGhvbGRzIHVzZXIgZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHVzZXJUYWJsZSA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VybmFtZSB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25OYW1lKCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvbk5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VybmFtZSB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbk5hbWUgVXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uTmFtZShTdHJpbmcgY29ubmVjdGlvbk5hbWUpIHsKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uTmFtZSA9IGNvbm5lY3Rpb25OYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGFzc3dvcmQgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uUGFzc3dvcmQoKSB7CisgICAgICAgIHJldHVybiBjb25uZWN0aW9uUGFzc3dvcmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXNzd29yZCB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvblBhc3N3b3JkIFVzZXIgcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUGFzc3dvcmQoU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCkgeworICAgICAgICB0aGlzLmNvbm5lY3Rpb25QYXNzd29yZCA9IGNvbm5lY3Rpb25QYXNzd29yZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFVSTCB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25VUkwoKSB7CisgICAgICAgIHJldHVybiBjb25uZWN0aW9uVVJMOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgVVJMIHRvIHVzZSB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uVVJMIFRoZSBuZXcgY29ubmVjdGlvbiBVUkwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uVVJMKCBTdHJpbmcgY29ubmVjdGlvblVSTCApIHsKKyAgICAgIHRoaXMuY29ubmVjdGlvblVSTCA9IGNvbm5lY3Rpb25VUkw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBKREJDIGRyaXZlciB0aGF0IHdpbGwgYmUgdXNlZC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGRyaXZlck5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBKREJDIGRyaXZlciB0aGF0IHdpbGwgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkcml2ZXJOYW1lIFRoZSBkcml2ZXIgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERyaXZlck5hbWUoIFN0cmluZyBkcml2ZXJOYW1lICkgeworICAgICAgdGhpcy5kcml2ZXJOYW1lID0gZHJpdmVyTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbHVtbiBpbiB0aGUgdXNlciByb2xlIHRhYmxlIHRoYXQgbmFtZXMgYSByb2xlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSb2xlTmFtZUNvbCgpIHsKKyAgICAgICAgcmV0dXJuIHJvbGVOYW1lQ29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29sdW1uIGluIHRoZSB1c2VyIHJvbGUgdGFibGUgdGhhdCBuYW1lcyBhIHJvbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZU5hbWVDb2wgVGhlIGNvbHVtbiBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um9sZU5hbWVDb2woIFN0cmluZyByb2xlTmFtZUNvbCApIHsKKyAgICAgICAgdGhpcy5yb2xlTmFtZUNvbCA9IHJvbGVOYW1lQ29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29sdW1uIGluIHRoZSB1c2VyIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHVzZXIncyBjcmVkZW50aWFscy4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlckNyZWRDb2woKSB7CisgICAgICAgIHJldHVybiB1c2VyQ3JlZENvbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbHVtbiBpbiB0aGUgdXNlciB0YWJsZSB0aGF0IGhvbGRzIHRoZSB1c2VyJ3MgY3JlZGVudGlhbHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlckNyZWRDb2wgVGhlIGNvbHVtbiBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlckNyZWRDb2woIFN0cmluZyB1c2VyQ3JlZENvbCApIHsKKyAgICAgICB0aGlzLnVzZXJDcmVkQ29sID0gdXNlckNyZWRDb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzIG5hbWUuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lQ29sKCkgeworICAgICAgICByZXR1cm4gdXNlck5hbWVDb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlck5hbWVDb2wgVGhlIGNvbHVtbiBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlck5hbWVDb2woIFN0cmluZyB1c2VyTmFtZUNvbCApIHsKKyAgICAgICB0aGlzLnVzZXJOYW1lQ29sID0gdXNlck5hbWVDb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0YWJsZSB0aGF0IGhvbGRzIHRoZSByZWxhdGlvbiBiZXR3ZWVuIHVzZXIncyBhbmQgcm9sZXMuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJSb2xlVGFibGUoKSB7CisgICAgICAgIHJldHVybiB1c2VyUm9sZVRhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGFibGUgdGhhdCBob2xkcyB0aGUgcmVsYXRpb24gYmV0d2VlbiB1c2VyJ3MgYW5kIHJvbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJSb2xlVGFibGUgVGhlIHRhYmxlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyUm9sZVRhYmxlKCBTdHJpbmcgdXNlclJvbGVUYWJsZSApIHsKKyAgICAgICAgdGhpcy51c2VyUm9sZVRhYmxlID0gdXNlclJvbGVUYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRhYmxlIHRoYXQgaG9sZHMgdXNlciBkYXRhLi4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlclRhYmxlKCkgeworICAgICAgICByZXR1cm4gdXNlclRhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGFibGUgdGhhdCBob2xkcyB1c2VyIGRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlclRhYmxlIFRoZSB0YWJsZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlclRhYmxlKCBTdHJpbmcgdXNlclRhYmxlICkgeworICAgICAgdGhpcy51c2VyVGFibGUgPSB1c2VyVGFibGU7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kCisgICAgICogY3JlZGVudGlhbHMsIGlmIHRoZXJlIGlzIG9uZTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZXJyb3JzIHdpdGggdGhlIEpEQkMgY29ubmVjdGlvbiwgZXhlY3V0aW5nCisgICAgICogdGhlIHF1ZXJ5IG9yIGFueXRoaW5nIHdlIHJldHVybiBudWxsIChkb24ndCBhdXRoZW50aWNhdGUpLiBUaGlzCisgICAgICogZXZlbnQgaXMgYWxzbyBsb2dnZWQsIGFuZCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGNsb3NlZCBzbyB0aGF0CisgICAgICogYSBzdWJzZXF1ZW50IHJlcXVlc3Qgd2lsbCBhdXRvbWF0aWNhbGx5IHJlLW9wZW4gaXQuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSBvZiB0aGUgUHJpbmNpcGFsIHRvIGxvb2sgdXAKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgUGFzc3dvcmQgb3Igb3RoZXIgY3JlZGVudGlhbHMgdG8gdXNlIGluCisgICAgICogIGF1dGhlbnRpY2F0aW5nIHRoaXMgdXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFByaW5jaXBhbCBhdXRoZW50aWNhdGUoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgY3JlZGVudGlhbHMpIHsKKworICAgICAgICAvLyBOdW1iZXIgb2YgdHJpZXMgaXMgdGhlIG51bWViciBvZiBhdHRlbXB0cyB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZQorICAgICAgICAvLyBkdXJpbmcgdGhpcyBsb2dpbiBhdHRlbXB0IChpZiB3ZSBuZWVkIHRvIG9wZW4gdGhlIGRhdGFiYXNlKQorICAgICAgICAvLyBUaGlzIG5lZWRzIHJld3JpdHRlbiB3dXRoIGJldHRlciBwb29saW5nIHN1cHBvcnQsIHRoZSBleGlzdGluZyBjb2RlCisgICAgICAgIC8vIG5lZWRzIHNpZ25hdHVyZSBjaGFuZ2VzIHNpbmNlIHRoZSBQcmVwYXJlZCBzdGF0ZW1lbnRzIG5lZWRzIGNhY2hlZAorICAgICAgICAvLyB3aXRoIHRoZSBjb25uZWN0aW9ucy4KKyAgICAgICAgLy8gVGhlIGNvZGUgYmVsb3cgd2lsbCB0cnkgdHdpY2UgaWYgdGhlcmUgaXMgYSBTUUxFeGNlcHRpb24gc28gdGhlCisgICAgICAgIC8vIGNvbm5lY3Rpb24gbWF5IHRyeSB0byBiZSBvcGVuZWQgYWdhaW4uIE9uIG5vcm1hbCBjb25kaXRpb25zIChpbmNsdWRpbmcKKyAgICAgICAgLy8gaW52YWxpZCBsb2dpbiAtIHRoZSBhYm92ZSBpcyBvbmx5IHVzZWQgb25jZS4KKyAgICAgICAgaW50IG51bWJlck9mVHJpZXMgPSAyOworICAgICAgICB3aGlsZSAobnVtYmVyT2ZUcmllcz4wKSB7CisgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBhbiBvcGVuIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICBvcGVuKCk7CisKKyAgICAgICAgICAgICAgICAvLyBBY3F1aXJlIGEgUHJpbmNpcGFsIG9iamVjdCBmb3IgdGhpcyB1c2VyCisgICAgICAgICAgICAgICAgUHJpbmNpcGFsIHByaW5jaXBhbCA9IGF1dGhlbnRpY2F0ZShkYkNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSwgY3JlZGVudGlhbHMpOworCisKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIFByaW5jaXBhbCAoaWYgYW55KQorICAgICAgICAgICAgICAgIHJldHVybiAocHJpbmNpcGFsKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgcHJvYmxlbSBmb3IgcG9zdGVyaXR5CisgICAgICAgICAgICAgICAgY29udGFpbmVyTG9nLmVycm9yKHNtLmdldFN0cmluZygiamRiY1JlYWxtLmV4Y2VwdGlvbiIpLCBlKTsKKworICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBjb25uZWN0aW9uIHNvIHRoYXQgaXQgZ2V0cyByZW9wZW5lZCBuZXh0IHRpbWUKKyAgICAgICAgICAgICAgICBpZiAoZGJDb25uZWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNsb3NlKGRiQ29ubmVjdGlvbik7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtYmVyT2ZUcmllcy0tOworICAgICAgICB9CisKKyAgICAgICAgLy8gV29yc3QgY2FzZSBzY2VuYXJpbworICAgICAgICByZXR1cm4gbnVsbDsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFByaW5jaXBhbCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCB1c2VybmFtZSBhbmQKKyAgICAgKiBjcmVkZW50aWFscywgaWYgdGhlcmUgaXMgb25lOyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGRiQ29ubmVjdGlvbiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byBiZSB1c2VkCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lIG9mIHRoZSBQcmluY2lwYWwgdG8gbG9vayB1cAorICAgICAqIEBwYXJhbSBjcmVkZW50aWFscyBQYXNzd29yZCBvciBvdGhlciBjcmVkZW50aWFscyB0byB1c2UgaW4KKyAgICAgKiAgYXV0aGVudGljYXRpbmcgdGhpcyB1c2VybmFtZQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgUHJpbmNpcGFsIGF1dGhlbnRpY2F0ZShDb25uZWN0aW9uIGRiQ29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3JlZGVudGlhbHMpIHsKKworICAgICAgICAvLyBObyB1c2VyIC0gY2FuJ3QgcG9zc2libHkgYXV0aGVudGljYXRlCisgICAgICAgIGlmICh1c2VybmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgdXNlcidzIGNyZWRlbnRpYWxzCisgICAgICAgIFN0cmluZyBkYkNyZWRlbnRpYWxzID0gZ2V0UGFzc3dvcmQodXNlcm5hbWUpOworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSB1c2VyJ3MgY3JlZGVudGlhbHMKKyAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKGhhc01lc3NhZ2VEaWdlc3QoKSkgeworICAgICAgICAgICAgLy8gSGV4IGhhc2hlcyBzaG91bGQgYmUgY29tcGFyZWQgY2FzZS1pbnNlbnNpdGl2ZQorICAgICAgICAgICAgdmFsaWRhdGVkID0gKGRpZ2VzdChjcmVkZW50aWFscykuZXF1YWxzSWdub3JlQ2FzZShkYkNyZWRlbnRpYWxzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWxpZGF0ZWQgPSAoZGlnZXN0KGNyZWRlbnRpYWxzKS5lcXVhbHMoZGJDcmVkZW50aWFscykpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZhbGlkYXRlZCkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5lckxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGNvbnRhaW5lckxvZy50cmFjZShzbS5nZXRTdHJpbmcoImpkYmNSZWFsbS5hdXRoZW50aWNhdGVTdWNjZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyTG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgY29udGFpbmVyTG9nLnRyYWNlKHNtLmdldFN0cmluZygiamRiY1JlYWxtLmF1dGhlbnRpY2F0ZUZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBBcnJheUxpc3Qgcm9sZXMgPSBnZXRSb2xlcyh1c2VybmFtZSk7CisgICAgICAgIAorICAgICAgICAvLyBDcmVhdGUgYW5kIHJldHVybiBhIHN1aXRhYmxlIFByaW5jaXBhbCBmb3IgdGhpcyB1c2VyCisgICAgICAgIHJldHVybiAobmV3IEdlbmVyaWNQcmluY2lwYWwodGhpcywgdXNlcm5hbWUsIGNyZWRlbnRpYWxzLCByb2xlcykpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGJDb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uIHRvIGJlIGNsb3NlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlKENvbm5lY3Rpb24gZGJDb25uZWN0aW9uKSB7CisKKyAgICAgICAgLy8gRG8gbm90aGluZyBpZiB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGNsb3NlZAorICAgICAgICBpZiAoZGJDb25uZWN0aW9uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gQ2xvc2Ugb3VyIHByZXBhcmVkIHN0YXRlbWVudHMgKGlmIGFueSkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZXBhcmVkQ3JlZGVudGlhbHMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGYpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnByZXBhcmVkQ3JlZGVudGlhbHMgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZXBhcmVkUm9sZXMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGYpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnByZXBhcmVkUm9sZXMgPSBudWxsOworCisKKyAgICAgICAgLy8gQ2xvc2UgdGhpcyBkYXRhYmFzZSBjb25uZWN0aW9uLCBhbmQgbG9nIGFueSBlcnJvcnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRiQ29ubmVjdGlvbi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY29udGFpbmVyTG9nLndhcm4oc20uZ2V0U3RyaW5nKCJqZGJjUmVhbG0uY2xvc2UiKSwgZSk7IC8vIEp1c3QgbG9nIGl0IGhlcmUKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgdGhpcy5kYkNvbm5lY3Rpb24gPSBudWxsOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFByZXBhcmVkU3RhdGVtZW50IGNvbmZpZ3VyZWQgdG8gcGVyZm9ybSB0aGUgU0VMRUNUIHJlcXVpcmVkCisgICAgICogdG8gcmV0cmlldmUgdXNlciBjcmVkZW50aWFscyBmb3IgdGhlIHNwZWNpZmllZCB1c2VybmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYkNvbm5lY3Rpb24gVGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gYmUgdXNlZAorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSBmb3Igd2hpY2ggY3JlZGVudGlhbHMgc2hvdWxkIGJlIHJldHJpZXZlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTUUxFeGNlcHRpb24gaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJlcGFyZWRTdGF0ZW1lbnQgY3JlZGVudGlhbHMoQ29ubmVjdGlvbiBkYkNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHByZXBhcmVkQ3JlZGVudGlhbHMgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiU0VMRUNUICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHVzZXJDcmVkQ29sKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIEZST00gIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodXNlclRhYmxlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIFdIRVJFICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHVzZXJOYW1lQ29sKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiID0gPyIpOworCisgICAgICAgICAgICBpZihjb250YWluZXJMb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRhaW5lckxvZy5kZWJ1ZygiY3JlZGVudGlhbHMgcXVlcnk6ICIgKyBzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJlcGFyZWRDcmVkZW50aWFscyA9CisgICAgICAgICAgICAgICAgZGJDb25uZWN0aW9uLnByZXBhcmVTdGF0ZW1lbnQoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodXNlcm5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcHJlcGFyZWRDcmVkZW50aWFscy5zZXROdWxsKDEsamF2YS5zcWwuVHlwZXMuVkFSQ0hBUik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmVwYXJlZENyZWRlbnRpYWxzLnNldFN0cmluZygxLCB1c2VybmFtZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHByZXBhcmVkQ3JlZGVudGlhbHMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc2hvcnQgbmFtZSBmb3IgdGhpcyBSZWFsbSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXNzd29yZCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByaW5jaXBhbCdzIHVzZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIFN0cmluZyBnZXRQYXNzd29yZChTdHJpbmcgdXNlcm5hbWUpIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSB1c2VyJ3MgY3JlZGVudGlhbHMKKyAgICAgICAgU3RyaW5nIGRiQ3JlZGVudGlhbHMgPSBudWxsOworICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdG10ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKworICAgICAgICAvLyBOdW1iZXIgb2YgdHJpZXMgaXMgdGhlIG51bWViciBvZiBhdHRlbXB0cyB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZQorICAgICAgICAvLyBkdXJpbmcgdGhpcyBsb2dpbiBhdHRlbXB0IChpZiB3ZSBuZWVkIHRvIG9wZW4gdGhlIGRhdGFiYXNlKQorICAgICAgICAvLyBUaGlzIG5lZWRzIHJld3JpdHRlbiB3dXRoIGJldHRlciBwb29saW5nIHN1cHBvcnQsIHRoZSBleGlzdGluZyBjb2RlCisgICAgICAgIC8vIG5lZWRzIHNpZ25hdHVyZSBjaGFuZ2VzIHNpbmNlIHRoZSBQcmVwYXJlZCBzdGF0ZW1lbnRzIG5lZWRzIGNhY2hlZAorICAgICAgICAvLyB3aXRoIHRoZSBjb25uZWN0aW9ucy4KKyAgICAgICAgLy8gVGhlIGNvZGUgYmVsb3cgd2lsbCB0cnkgdHdpY2UgaWYgdGhlcmUgaXMgYSBTUUxFeGNlcHRpb24gc28gdGhlCisgICAgICAgIC8vIGNvbm5lY3Rpb24gbWF5IHRyeSB0byBiZSBvcGVuZWQgYWdhaW4uIE9uIG5vcm1hbCBjb25kaXRpb25zIChpbmNsdWRpbmcKKyAgICAgICAgLy8gaW52YWxpZCBsb2dpbiAtIHRoZSBhYm92ZSBpcyBvbmx5IHVzZWQgb25jZS4KKyAgICAgICAgaW50IG51bWJlck9mVHJpZXMgPSAyOworICAgICAgICB3aGlsZSAobnVtYmVyT2ZUcmllcz4wKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGhhdmUgYW4gb3BlbiBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgb3BlbigpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0bXQgPSBjcmVkZW50aWFscyhkYkNvbm5lY3Rpb24sIHVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcnMgPSBzdG10LmV4ZWN1dGVRdWVyeSgpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGJDcmVkZW50aWFscyA9IHJzLmdldFN0cmluZygxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBycyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYkNyZWRlbnRpYWxzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGRiQ3JlZGVudGlhbHMgPSBkYkNyZWRlbnRpYWxzLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRiQ3JlZGVudGlhbHM7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChycyE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckxvZy53YXJuKHNtLmdldFN0cmluZygiamRiY1JlYWxtLmFibm9ybWFsQ2xvc2VSZXN1bHRTZXQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGJDb25uZWN0aW9uLmNvbW1pdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gTG9nIHRoZSBwcm9ibGVtIGZvciBwb3N0ZXJpdHkKKyAgICAgICAgICAgICAgICBjb250YWluZXJMb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJqZGJjUmVhbG0uZXhjZXB0aW9uIiksIGUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBjb25uZWN0aW9uIHNvIHRoYXQgaXQgZ2V0cyByZW9wZW5lZCBuZXh0IHRpbWUKKyAgICAgICAgICAgICAgICBpZiAoZGJDb25uZWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNsb3NlKGRiQ29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG51bWJlck9mVHJpZXMtLTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdXNlciBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmluY2lwYWwgZ2V0UHJpbmNpcGFsKFN0cmluZyB1c2VybmFtZSkgeworCisgICAgICAgIHJldHVybiAobmV3IEdlbmVyaWNQcmluY2lwYWwodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXNzd29yZCh1c2VybmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Um9sZXModXNlcm5hbWUpKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcm9sZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBndmVuIHVzZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IGdldFJvbGVzKFN0cmluZyB1c2VybmFtZSkgeworICAgICAgICAKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtdCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisKKyAgICAgICAgLy8gTnVtYmVyIG9mIHRyaWVzIGlzIHRoZSBudW1lYnIgb2YgYXR0ZW1wdHMgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UKKyAgICAgICAgLy8gZHVyaW5nIHRoaXMgbG9naW4gYXR0ZW1wdCAoaWYgd2UgbmVlZCB0byBvcGVuIHRoZSBkYXRhYmFzZSkKKyAgICAgICAgLy8gVGhpcyBuZWVkcyByZXdyaXR0ZW4gd3V0aCBiZXR0ZXIgcG9vbGluZyBzdXBwb3J0LCB0aGUgZXhpc3RpbmcgY29kZQorICAgICAgICAvLyBuZWVkcyBzaWduYXR1cmUgY2hhbmdlcyBzaW5jZSB0aGUgUHJlcGFyZWQgc3RhdGVtZW50cyBuZWVkcyBjYWNoZWQKKyAgICAgICAgLy8gd2l0aCB0aGUgY29ubmVjdGlvbnMuCisgICAgICAgIC8vIFRoZSBjb2RlIGJlbG93IHdpbGwgdHJ5IHR3aWNlIGlmIHRoZXJlIGlzIGEgU1FMRXhjZXB0aW9uIHNvIHRoZQorICAgICAgICAvLyBjb25uZWN0aW9uIG1heSB0cnkgdG8gYmUgb3BlbmVkIGFnYWluLiBPbiBub3JtYWwgY29uZGl0aW9ucyAoaW5jbHVkaW5nCisgICAgICAgIC8vIGludmFsaWQgbG9naW4gLSB0aGUgYWJvdmUgaXMgb25seSB1c2VkIG9uY2UuCisgICAgICAgIGludCBudW1iZXJPZlRyaWVzID0gMjsKKyAgICAgICAgd2hpbGUgKG51bWJlck9mVHJpZXM+MCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSBoYXZlIGFuIG9wZW4gZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICAgICAgICAgIG9wZW4oKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBBY2N1bXVsYXRlIHRoZSB1c2VyJ3Mgcm9sZXMKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHJvbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgICAgICBzdG10ID0gcm9sZXMoZGJDb25uZWN0aW9uLCB1c2VybmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJzID0gc3RtdC5leGVjdXRlUXVlcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvbGUgPSBycy5nZXRTdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCE9cm9sZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVMaXN0LmFkZChyb2xlLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlTGlzdCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChycyE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckxvZy53YXJuKHNtLmdldFN0cmluZygiamRiY1JlYWxtLmFibm9ybWFsQ2xvc2VSZXN1bHRTZXQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGJDb25uZWN0aW9uLmNvbW1pdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gTG9nIHRoZSBwcm9ibGVtIGZvciBwb3N0ZXJpdHkKKyAgICAgICAgICAgICAgICBjb250YWluZXJMb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJqZGJjUmVhbG0uZXhjZXB0aW9uIiksIGUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBjb25uZWN0aW9uIHNvIHRoYXQgaXQgZ2V0cyByZW9wZW5lZCBuZXh0IHRpbWUKKyAgICAgICAgICAgICAgICBpZiAoZGJDb25uZWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNsb3NlKGRiQ29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG51bWJlck9mVHJpZXMtLTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIE9wZW4gKGlmIG5lY2Vzc2FyeSkgYW5kIHJldHVybiBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gZm9yIHVzZSBieQorICAgICAqIHRoaXMgUmVhbG0uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNRTEV4Y2VwdGlvbiBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCBDb25uZWN0aW9uIG9wZW4oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgY29ubmVjdGlvbiBhbHJlYWR5IG9wZW4KKyAgICAgICAgaWYgKGRiQ29ubmVjdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChkYkNvbm5lY3Rpb24pOworCisgICAgICAgIC8vIEluc3RhbnRpYXRlIG91ciBkYXRhYmFzZSBkcml2ZXIgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChkcml2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoZHJpdmVyTmFtZSk7CisgICAgICAgICAgICAgICAgZHJpdmVyID0gKERyaXZlcikgY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNRTEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBPcGVuIGEgbmV3IGNvbm5lY3Rpb24KKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmIChjb25uZWN0aW9uTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgcHJvcHMucHV0KCJ1c2VyIiwgY29ubmVjdGlvbk5hbWUpOworICAgICAgICBpZiAoY29ubmVjdGlvblBhc3N3b3JkICE9IG51bGwpCisgICAgICAgICAgICBwcm9wcy5wdXQoInBhc3N3b3JkIiwgY29ubmVjdGlvblBhc3N3b3JkKTsKKyAgICAgICAgZGJDb25uZWN0aW9uID0gZHJpdmVyLmNvbm5lY3QoY29ubmVjdGlvblVSTCwgcHJvcHMpOworICAgICAgICBkYkNvbm5lY3Rpb24uc2V0QXV0b0NvbW1pdChmYWxzZSk7CisgICAgICAgIHJldHVybiAoZGJDb25uZWN0aW9uKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVsZWFzZSBvdXIgdXNlIG9mIHRoaXMgY29ubmVjdGlvbiBzbyB0aGF0IGl0IGNhbiBiZSByZWN5Y2xlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYkNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gYmUgcmVsZWFzZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWxlYXNlKENvbm5lY3Rpb24gZGJDb25uZWN0aW9uKSB7CisKKyAgICAgICAgOyAvLyBOTy1PUCBzaW5jZSB3ZSBhcmUgbm90IHBvb2xpbmcgYW55dGhpbmcKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgUHJlcGFyZWRTdGF0ZW1lbnQgY29uZmlndXJlZCB0byBwZXJmb3JtIHRoZSBTRUxFQ1QgcmVxdWlyZWQKKyAgICAgKiB0byByZXRyaWV2ZSB1c2VyIHJvbGVzIGZvciB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGRiQ29ubmVjdGlvbiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byBiZSB1c2VkCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lIGZvciB3aGljaCByb2xlcyBzaG91bGQgYmUgcmV0cmlldmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNRTEV4Y2VwdGlvbiBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUHJlcGFyZWRTdGF0ZW1lbnQgcm9sZXMoQ29ubmVjdGlvbiBkYkNvbm5lY3Rpb24sCisgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworCisgICAgICAgIGlmIChwcmVwYXJlZFJvbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlNFTEVDVCAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChyb2xlTmFtZUNvbCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBGUk9NICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHVzZXJSb2xlVGFibGUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgV0hFUkUgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodXNlck5hbWVDb2wpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgPSA/Iik7CisgICAgICAgICAgICBwcmVwYXJlZFJvbGVzID0KKyAgICAgICAgICAgICAgICBkYkNvbm5lY3Rpb24ucHJlcGFyZVN0YXRlbWVudChzYi50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByZXBhcmVkUm9sZXMuc2V0U3RyaW5nKDEsIHVzZXJuYW1lKTsKKyAgICAgICAgcmV0dXJuIChwcmVwYXJlZFJvbGVzKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqCisgICAgICogUHJlcGFyZSBmb3IgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcyBDb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHN0YXJ0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFBlcmZvcm0gbm9ybWFsIHN1cGVyY2xhc3MgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgc3VwZXIuc3RhcnQoKTsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHdlIGNhbiBvcGVuIG91ciBjb25uZWN0aW9uIC0gYnV0IGxldCB0b21jYXQKKyAgICAgICAgLy8gc3RhcnR1cCBpbiBjYXNlIHRoZSBkYXRhYmFzZSBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3BlbigpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY29udGFpbmVyTG9nLmVycm9yKHNtLmdldFN0cmluZygiamRiY1JlYWxtLm9wZW4iKSwgZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSBzaHV0IGRvd24gYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcyBDb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBuZWVkcyB0byBiZSByZXBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQZXJmb3JtIG5vcm1hbCBzdXBlcmNsYXNzIGZpbmFsaXphdGlvbgorICAgICAgICBzdXBlci5zdG9wKCk7CisKKyAgICAgICAgLy8gQ2xvc2UgYW55IG9wZW4gREIgY29ubmVjdGlvbgorICAgICAgICBjbG9zZSh0aGlzLmRiQ29ubmVjdGlvbik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0pORElSZWFsbS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0pORElSZWFsbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNGMzN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vSk5ESVJlYWxtLmphdmEKQEAgLTAsMCArMSwxODE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5Db21tdW5pY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5Db21wb3NpdGVOYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5JbnZhbGlkTmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lUGFyc2VyOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuQXR0cmlidXRlczsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5Jbml0aWFsRGlyQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LlNlYXJjaENvbnRyb2xzOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuU2VhcmNoUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5CYXNlNjQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuQnl0ZUNodW5rOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLkNoYXJDaHVuazsKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPlJlYWxtPC9zdHJvbmc+IHRoYXQgd29ya3Mgd2l0aCBhIGRpcmVjdG9yeQorICogc2VydmVyIGFjY2Vzc2VkIHZpYSB0aGUgSmF2YSBOYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UgKEpOREkpIEFQSXMuCisgKiBUaGUgZm9sbG93aW5nIGNvbnN0cmFpbnRzIGFyZSBpbXBvc2VkIG9uIHRoZSBkYXRhIHN0cnVjdHVyZSBpbiB0aGUKKyAqIHVuZGVybHlpbmcgZGlyZWN0b3J5IHNlcnZlcjo8L3A+CisgKiA8dWw+CisgKgorICogPGxpPkVhY2ggdXNlciB0aGF0IGNhbiBiZSBhdXRoZW50aWNhdGVkIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGluZGl2aWR1YWwKKyAqICAgICBlbGVtZW50IGluIHRoZSB0b3AgbGV2ZWwgPGNvZGU+RGlyQ29udGV4dDwvY29kZT4gdGhhdCBpcyBhY2Nlc3NlZAorICogICAgIHZpYSB0aGUgPGNvZGU+Y29ubmVjdGlvblVSTDwvY29kZT4gcHJvcGVydHkuPC9saT4KKyAqCisgKiA8bGk+SWYgYSBzb2NrZXQgY29ubmVjdGlvbiBjYW4gbm90IGJlIG1hZGUgdG8gdGhlIDxjb2RlPmNvbm5lY3RVUkw8L2NvZGU+CisgKiAgICAgYW4gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gdXNlIHRoZSA8Y29kZT5hbHRlcm5hdGVVUkw8L2NvZGU+IGlmIGl0CisgKiAgICAgZXhpc3RzLjwvbGk+CisgKgorICogPGxpPkVhY2ggdXNlciBlbGVtZW50IGhhcyBhIGRpc3Rpbmd1aXNoZWQgbmFtZSB0aGF0IGNhbiBiZSBmb3JtZWQgYnkKKyAqICAgICBzdWJzdGl0dXRpbmcgdGhlIHByZXNlbnRlZCB1c2VybmFtZSBpbnRvIGEgcGF0dGVybiBjb25maWd1cmVkIGJ5IHRoZQorICogICAgIDxjb2RlPnVzZXJQYXR0ZXJuPC9jb2RlPiBwcm9wZXJ0eS48L2xpPgorICoKKyAqIDxsaT5BbHRlcm5hdGl2ZWx5LCBpZiB0aGUgPGNvZGU+dXNlclBhdHRlcm48L2NvZGU+IHByb3BlcnR5IGlzIG5vdAorICogICAgIHNwZWNpZmllZCwgYSB1bmlxdWUgZWxlbWVudCBjYW4gYmUgbG9jYXRlZCBieSBzZWFyY2hpbmcgdGhlIGRpcmVjdG9yeQorICogICAgIGNvbnRleHQuIEluIHRoaXMgY2FzZToKKyAqICAgICA8dWw+CisgKiAgICAgPGxpPlRoZSA8Y29kZT51c2VyU2VhcmNoPC9jb2RlPiBwYXR0ZXJuIHNwZWNpZmllcyB0aGUgc2VhcmNoIGZpbHRlcgorICogICAgICAgICBhZnRlciBzdWJzdGl0dXRpb24gb2YgdGhlIHVzZXJuYW1lLjwvbGk+CisgKiAgICAgPGxpPlRoZSA8Y29kZT51c2VyQmFzZTwvY29kZT4gcHJvcGVydHkgY2FuIGJlIHNldCB0byB0aGUgZWxlbWVudCB0aGF0CisgKiAgICAgICAgIGlzIHRoZSBiYXNlIG9mIHRoZSBzdWJ0cmVlIGNvbnRhaW5pbmcgdXNlcnMuICBJZiBub3Qgc3BlY2lmaWVkLAorICogICAgICAgICB0aGUgc2VhcmNoIGJhc2UgaXMgdGhlIHRvcC1sZXZlbCBjb250ZXh0LjwvbGk+CisgKiAgICAgPGxpPlRoZSA8Y29kZT51c2VyU3VidHJlZTwvY29kZT4gcHJvcGVydHkgY2FuIGJlIHNldCB0bworICogICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3Ugd2lzaCB0byBzZWFyY2ggdGhlIGVudGlyZSBzdWJ0cmVlIG9mIHRoZQorICogICAgICAgICBkaXJlY3RvcnkgY29udGV4dC4gIFRoZSBkZWZhdWx0IHZhbHVlIG9mIDxjb2RlPmZhbHNlPC9jb2RlPgorICogICAgICAgICByZXF1ZXN0cyBhIHNlYXJjaCBvZiBvbmx5IHRoZSBjdXJyZW50IGxldmVsLjwvbGk+CisgKiAgICA8L3VsPgorICogPC9saT4KKyAqCisgKiA8bGk+VGhlIHVzZXIgbWF5IGJlIGF1dGhlbnRpY2F0ZWQgYnkgYmluZGluZyB0byB0aGUgZGlyZWN0b3J5IHdpdGggdGhlCisgKiAgICAgIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBwcmVzZW50ZWQuIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiB0aGUKKyAqICAgICAgPGNvZGU+dXNlclBhc3N3b3JkPC9jb2RlPiBwcm9wZXJ0eSBpcyBub3Qgc3BlY2lmaWVkLjwvbGk+CisgKgorICogPGxpPlRoZSB1c2VyIG1heSBiZSBhdXRoZW50aWNhdGVkIGJ5IHJldHJpZXZpbmcgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZQorICogICAgIGZyb20gdGhlIGRpcmVjdG9yeSBhbmQgY29tcGFyaW5nIGl0IGV4cGxpY2l0bHkgd2l0aCB0aGUgdmFsdWUgcHJlc2VudGVkCisgKiAgICAgYnkgdGhlIHVzZXIuIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiB0aGUgPGNvZGU+dXNlclBhc3N3b3JkPC9jb2RlPgorICogICAgIHByb3BlcnR5IGlzIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZToKKyAqICAgICA8dWw+CisgKiAgICAgPGxpPlRoZSBlbGVtZW50IGZvciB0aGlzIHVzZXIgbXVzdCBjb250YWluIGFuIGF0dHJpYnV0ZSBuYW1lZCBieSB0aGUKKyAqICAgICAgICAgPGNvZGU+dXNlclBhc3N3b3JkPC9jb2RlPiBwcm9wZXJ0eS4KKyAqICAgICA8bGk+VGhlIHZhbHVlIG9mIHRoZSB1c2VyIHBhc3N3b3JkIGF0dHJpYnV0ZSBpcyBlaXRoZXIgYSBjbGVhcnRleHQKKyAqICAgICAgICAgU3RyaW5nLCBvciB0aGUgcmVzdWx0IG9mIHBhc3NpbmcgYSBjbGVhcnRleHQgU3RyaW5nIHRocm91Z2ggdGhlCisgKiAgICAgICAgIDxjb2RlPlJlYWxtQmFzZS5kaWdlc3QoKTwvY29kZT4gbWV0aG9kICh1c2luZyB0aGUgc3RhbmRhcmQgZGlnZXN0CisgKiAgICAgICAgIHN1cHBvcnQgaW5jbHVkZWQgaW4gPGNvZGU+UmVhbG1CYXNlPC9jb2RlPikuCisgKiAgICAgPGxpPlRoZSB1c2VyIGlzIGNvbnNpZGVyZWQgdG8gYmUgYXV0aGVudGljYXRlZCBpZiB0aGUgcHJlc2VudGVkCisgKiAgICAgICAgIGNyZWRlbnRpYWxzIChhZnRlciBiZWluZyBwYXNzZWQgdGhyb3VnaAorICogICAgICAgICA8Y29kZT5SZWFsbUJhc2UuZGlnZXN0KCk8L2NvZGU+KSBhcmUgZXF1YWwgdG8gdGhlIHJldHJpZXZlZCB2YWx1ZQorICogICAgICAgICBmb3IgdGhlIHVzZXIgcGFzc3dvcmQgYXR0cmlidXRlLjwvbGk+CisgKiAgICAgPC91bD48L2xpPgorICoKKyAqIDxsaT5FYWNoIGdyb3VwIG9mIHVzZXJzIHRoYXQgaGFzIGJlZW4gYXNzaWduZWQgYSBwYXJ0aWN1bGFyIHJvbGUgbWF5IGJlCisgKiAgICAgcmVwcmVzZW50ZWQgYnkgYW4gaW5kaXZpZHVhbCBlbGVtZW50IGluIHRoZSB0b3AgbGV2ZWwKKyAqICAgICA8Y29kZT5EaXJDb250ZXh0PC9jb2RlPiB0aGF0IGlzIGFjY2Vzc2VkIHZpYSB0aGUKKyAqICAgICA8Y29kZT5jb25uZWN0aW9uVVJMPC9jb2RlPiBwcm9wZXJ0eS4gIFRoaXMgZWxlbWVudCBoYXMgdGhlIGZvbGxvd2luZworICogICAgIGNoYXJhY3RlcmlzdGljczoKKyAqICAgICA8dWw+CisgKiAgICAgPGxpPlRoZSBzZXQgb2YgYWxsIHBvc3NpYmxlIGdyb3VwcyBvZiBpbnRlcmVzdCBjYW4gYmUgc2VsZWN0ZWQgYnkgYQorICogICAgICAgICBzZWFyY2ggcGF0dGVybiBjb25maWd1cmVkIGJ5IHRoZSA8Y29kZT5yb2xlU2VhcmNoPC9jb2RlPgorICogICAgICAgICBwcm9wZXJ0eS48L2xpPgorICogICAgIDxsaT5UaGUgPGNvZGU+cm9sZVNlYXJjaDwvY29kZT4gcGF0dGVybiBvcHRpb25hbGx5IGluY2x1ZGVzIHBhdHRlcm4KKyAqICAgICAgICAgcmVwbGFjZW1lbnRzICJ7MH0iIGZvciB0aGUgZGlzdGluZ3Vpc2hlZCBuYW1lLCBhbmQvb3IgInsxfSIgZm9yCisgKiAgICAgICAgIHRoZSB1c2VybmFtZSwgb2YgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlciBmb3Igd2hpY2ggcm9sZXMgd2lsbCBiZQorICogICAgICAgICByZXRyaWV2ZWQuPC9saT4KKyAqICAgICA8bGk+VGhlIDxjb2RlPnJvbGVCYXNlPC9jb2RlPiBwcm9wZXJ0eSBjYW4gYmUgc2V0IHRvIHRoZSBlbGVtZW50IHRoYXQKKyAqICAgICAgICAgaXMgdGhlIGJhc2Ugb2YgdGhlIHNlYXJjaCBmb3IgbWF0Y2hpbmcgcm9sZXMuICBJZiBub3Qgc3BlY2lmaWVkLAorICogICAgICAgICB0aGUgZW50aXJlIGNvbnRleHQgd2lsbCBiZSBzZWFyY2hlZC48L2xpPgorICogICAgIDxsaT5UaGUgPGNvZGU+cm9sZVN1YnRyZWU8L2NvZGU+IHByb3BlcnR5IGNhbiBiZSBzZXQgdG8KKyAqICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdpc2ggdG8gc2VhcmNoIHRoZSBlbnRpcmUgc3VidHJlZSBvZiB0aGUKKyAqICAgICAgICAgZGlyZWN0b3J5IGNvbnRleHQuICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiA8Y29kZT5mYWxzZTwvY29kZT4KKyAqICAgICAgICAgcmVxdWVzdHMgYSBzZWFyY2ggb2Ygb25seSB0aGUgY3VycmVudCBsZXZlbC48L2xpPgorICogICAgIDxsaT5UaGUgZWxlbWVudCBpbmNsdWRlcyBhbiBhdHRyaWJ1dGUgKHdob3NlIG5hbWUgaXMgY29uZmlndXJlZCBieQorICogICAgICAgICB0aGUgPGNvZGU+cm9sZU5hbWU8L2NvZGU+IHByb3BlcnR5KSBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZQorICogICAgICAgICByb2xlIHJlcHJlc2VudGVkIGJ5IHRoaXMgZWxlbWVudC48L2xpPgorICogICAgIDwvdWw+PC9saT4KKyAqCisgKiA8bGk+SW4gYWRkaXRpb24sIHJvbGVzIG1heSBiZSByZXByZXNlbnRlZCBieSB0aGUgdmFsdWVzIG9mIGFuIGF0dHJpYnV0ZQorICogaW4gdGhlIHVzZXIncyBlbGVtZW50IHdob3NlIG5hbWUgaXMgY29uZmlndXJlZCBieSB0aGUKKyAqIDxjb2RlPnVzZXJSb2xlTmFtZTwvY29kZT4gcHJvcGVydHkuPC9saT4KKyAqCisgKiA8bGk+Tm90ZSB0aGF0IHRoZSBzdGFuZGFyZCA8Y29kZT4mbHQ7c2VjdXJpdHktcm9sZS1yZWYmZ3Q7PC9jb2RlPiBlbGVtZW50IGluCisgKiAgICAgdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byByZWZlcgorICogICAgIHRvIHJvbGVzIHByb2dyYW1tYXRpY2FsbHkgYnkgbmFtZXMgb3RoZXIgdGhhbiB0aG9zZSB1c2VkIGluIHRoZQorICogICAgIGRpcmVjdG9yeSBzZXJ2ZXIgaXRzZWxmLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIDxwPjxzdHJvbmc+VE9ETzwvc3Ryb25nPiAtIFN1cHBvcnQgY29ubmVjdGlvbiBwb29saW5nIChpbmNsdWRpbmcgbWVzc2FnZQorICogZm9ybWF0IG9iamVjdHMpIHNvIHRoYXQgPGNvZGU+YXV0aGVudGljYXRlKCk8L2NvZGU+IGRvZXMgbm90IGhhdmUgdG8gYmUKKyAqIHN5bmNocm9uaXplZC48L3A+CisgKgorICogPHA+PHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+IC0gVGhlcmUgaXMgYSByZXBvcnRlZCBidWcgYWdhaW5zdCB0aGUgTmV0c2NhcGUKKyAqIHByb3ZpZGVyIGNvZGUgKGNvbS5uZXRzY2FwZS5qbmRpLmxkYXAuTGRhcENvbnRleHRGYWN0b3J5KSB3aXRoIHJlc3BlY3QgdG8KKyAqIHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkIGEgbm9uLWV4aXN0aW5nIHVzZXIuIFRoZQorICogcmVwb3J0IGlzIGhlcmU6IGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTEyMTAgLgorICogV2l0aCBsdWNrLCBOZXRzY2FwZSBoYXMgdXBkYXRlZCB0aGVpciBwcm92aWRlciBjb2RlIGFuZCB0aGlzIGlzIG5vdCBhbgorICogaXNzdWUuIDwvcD4KKyAqCisgKiBAYXV0aG9yIEpvaG4gSG9sbWFuCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEpORElSZWFsbSBleHRlbmRzIFJlYWxtQmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogIFRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uIHRvIHVzZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYXV0aGVudGljYXRpb24gPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIGNvbm5lY3Rpb24gdXNlcm5hbWUgZm9yIHRoZSBzZXJ2ZXIgd2Ugd2lsbCBjb250YWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvbk5hbWUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29ubmVjdGlvbiBwYXNzd29yZCBmb3IgdGhlIHNlcnZlciB3ZSB3aWxsIGNvbnRhY3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uUGFzc3dvcmQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29ubmVjdGlvbiBVUkwgZm9yIHRoZSBzZXJ2ZXIgd2Ugd2lsbCBjb250YWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvblVSTCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBkaXJlY3RvcnkgY29udGV4dCBsaW5raW5nIHVzIHRvIG91ciBkaXJlY3Rvcnkgc2VydmVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBEaXJDb250ZXh0IGNvbnRleHQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSk5ESSBjb250ZXh0IGZhY3RvcnkgdXNlZCB0byBhY3F1aXJlIG91ciBJbml0aWFsQ29udGV4dC4gIEJ5CisgICAgICogZGVmYXVsdCwgYXNzdW1lcyB1c2Ugb2YgYW4gTERBUCBzZXJ2ZXIgdXNpbmcgdGhlIHN0YW5kYXJkIEpOREkgTERBUAorICAgICAqIHByb3ZpZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29udGV4dEZhY3RvcnkgPSAiY29tLnN1bi5qbmRpLmxkYXAuTGRhcEN0eEZhY3RvcnkiOworCisgICAgCisgICAgLyoqCisgICAgICogSG93IGFsaWFzZXMgc2hvdWxkIGJlIGRlcmVmZXJlbmNlZCBkdXJpbmcgc2VhcmNoIG9wZXJhdGlvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBkZXJlZkFsaWFzZXMgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdGhhdCBob2xkcyB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgcHJvcGVydHkgZm9yIHNwZWNpZnlpbmcgCisgICAgICogdGhlIG1hbm5lciBpbiB3aGljaCBhbGlhc2VzIHNob3VsZCBiZSBkZXJlZmVyZW5jZWQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVSRUZfQUxJQVNFUyA9ICJqYXZhLm5hbWluZy5sZGFwLmRlcmVmQWxpYXNlcyI7CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KTkRJUmVhbG0vMS4wIjsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBSZWFsbSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lID0gIkpORElSZWFsbSI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBwcm90b2NvbCB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIHRoZQorICAgICAqIGRpcmVjdG9yeSBzZXJ2ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEhvdyBzaG91bGQgd2UgaGFuZGxlIHJlZmVycmFscz8gIE1pY3Jvc29mdCBBY3RpdmUgRGlyZWN0b3J5IGNhbid0IGhhbmRsZQorICAgICAqIHRoZSBkZWZhdWx0IGNhc2UsIHNvIGFuIGFwcGxpY2F0aW9uIGF1dGhlbnRpY2F0aW5nIGFnYWluc3QgQUQgbXVzdAorICAgICAqIHNldCByZWZlcnJhbHMgdG8gImZvbGxvdyIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByZWZlcnJhbHMgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFzZSBlbGVtZW50IGZvciB1c2VyIHNlYXJjaGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlckJhc2UgPSAiIjsKKworCisgICAgLyoqCisgICAgICogVGhlIG1lc3NhZ2UgZm9ybWF0IHVzZWQgdG8gc2VhcmNoIGZvciBhIHVzZXIsIHdpdGggInswfSIgbWFya2luZworICAgICAqIHRoZSBzcG90IHdoZXJlIHRoZSB1c2VybmFtZSBnb2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlclNlYXJjaCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBNZXNzYWdlRm9ybWF0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQKKyAgICAgKiA8Y29kZT51c2VyU2VhcmNoPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCB1c2VyU2VhcmNoRm9ybWF0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIHNlYXJjaCB0aGUgZW50aXJlIHN1YnRyZWUgZm9yIG1hdGNoaW5nIHVzZXJzPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHVzZXJTdWJ0cmVlID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhdHRyaWJ1dGUgbmFtZSB1c2VkIHRvIHJldHJpZXZlIHRoZSB1c2VyIHBhc3N3b3JkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlclBhc3N3b3JkID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQSBzdHJpbmcgb2YgTERBUCB1c2VyIHBhdHRlcm5zIG9yIHBhdGhzLCAiOiItc2VwYXJhdGVkCisgICAgICogVGhlc2Ugd2lsbCBiZSB1c2VkIHRvIGZvcm0gdGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSBvZiBhCisgICAgICogdXNlciwgd2l0aCAiezB9IiBtYXJraW5nIHRoZSBzcG90IHdoZXJlIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUKKyAgICAgKiBnb2VzLgorICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byB1c2VyUGF0dGVybiwgYnV0IGFsbG93cyBmb3IgbXVsdGlwbGUgc2VhcmNoZXMKKyAgICAgKiBmb3IgYSB1c2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdbXSB1c2VyUGF0dGVybkFycmF5ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIG1lc3NhZ2UgZm9ybWF0IHVzZWQgdG8gZm9ybSB0aGUgZGlzdGluZ3Vpc2hlZCBuYW1lIG9mIGEKKyAgICAgKiB1c2VyLCB3aXRoICJ7MH0iIG1hcmtpbmcgdGhlIHNwb3Qgd2hlcmUgdGhlIHNwZWNpZmllZCB1c2VybmFtZQorICAgICAqIGdvZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB1c2VyUGF0dGVybiA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEFuIGFycmF5IG9mIE1lc3NhZ2VGb3JtYXQgb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQKKyAgICAgKiA8Y29kZT51c2VyUGF0dGVybkFycmF5PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdFtdIHVzZXJQYXR0ZXJuRm9ybWF0QXJyYXkgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFzZSBlbGVtZW50IGZvciByb2xlIHNlYXJjaGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcm9sZUJhc2UgPSAiIjsKKworCisgICAgLyoqCisgICAgICogVGhlIE1lc3NhZ2VGb3JtYXQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudAorICAgICAqIDxjb2RlPnJvbGVTZWFyY2g8L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IHJvbGVGb3JtYXQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgaW4gdGhlIHVzZXIncyBlbnRyeSBjb250YWluaW5nCisgICAgICogcm9sZXMgZm9yIHRoYXQgdXNlcgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlclJvbGVOYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBjb250YWluaW5nIHJvbGVzIGhlbGQgZWxzZXdoZXJlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByb2xlTmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBtZXNzYWdlIGZvcm1hdCB1c2VkIHRvIHNlbGVjdCByb2xlcyBmb3IgYSB1c2VyLCB3aXRoICJ7MH0iIG1hcmtpbmcKKyAgICAgKiB0aGUgc3BvdCB3aGVyZSB0aGUgZGlzdGluZ3Vpc2hlZCBuYW1lIG9mIHRoZSB1c2VyIGdvZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByb2xlU2VhcmNoID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIHNlYXJjaCB0aGUgZW50aXJlIHN1YnRyZWUgZm9yIG1hdGNoaW5nIG1lbWJlcnNoaXBzPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHJvbGVTdWJ0cmVlID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBBbiBhbHRlcm5hdGUgVVJMLCB0byB3aGljaCwgd2Ugc2hvdWxkIGNvbm5lY3QgaWYgY29ubmVjdGlvblVSTCBmYWlscy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFsdGVybmF0ZVVSTDsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgY29ubmVjdGlvbiBhdHRlbXB0cy4gIElmIGdyZWF0ZXIgdGhhbiB6ZXJvIHdlIHVzZSB0aGUKKyAgICAgKiBhbHRlcm5hdGUgdXJsLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY29ubmVjdGlvbkF0dGVtcHQgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgdXNlciBwYXR0ZXJuIHRvIGJlIHVzZWQgZm9yIGxvb2t1cCBhbmQgYmluZGluZyBvZiBhIHVzZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBjdXJVc2VyUGF0dGVybiA9IDA7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbiB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRoZW50aWNhdGlvbigpIHsKKworICAgICAgICByZXR1cm4gYXV0aGVudGljYXRpb247CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24gdG8gdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGF1dGhlbnRpY2F0aW9uIFRoZSBhdXRoZW50aWNhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dGhlbnRpY2F0aW9uKFN0cmluZyBhdXRoZW50aWNhdGlvbikgeworCisgICAgICAgIHRoaXMuYXV0aGVudGljYXRpb24gPSBhdXRoZW50aWNhdGlvbjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29ubmVjdGlvbiB1c2VybmFtZSBmb3IgdGhpcyBSZWFsbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25OYW1lKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jb25uZWN0aW9uTmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29ubmVjdGlvbiB1c2VybmFtZSBmb3IgdGhpcyBSZWFsbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uTmFtZSBUaGUgbmV3IGNvbm5lY3Rpb24gdXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uTmFtZShTdHJpbmcgY29ubmVjdGlvbk5hbWUpIHsKKworICAgICAgICB0aGlzLmNvbm5lY3Rpb25OYW1lID0gY29ubmVjdGlvbk5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29ubmVjdGlvbiBwYXNzd29yZCBmb3IgdGhpcyBSZWFsbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25QYXNzd29yZCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29ubmVjdGlvblBhc3N3b3JkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb25uZWN0aW9uIHBhc3N3b3JkIGZvciB0aGlzIFJlYWxtLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25QYXNzd29yZCBUaGUgbmV3IGNvbm5lY3Rpb24gcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUGFzc3dvcmQoU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCkgeworCisgICAgICAgIHRoaXMuY29ubmVjdGlvblBhc3N3b3JkID0gY29ubmVjdGlvblBhc3N3b3JkOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbm5lY3Rpb24gVVJMIGZvciB0aGlzIFJlYWxtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvblVSTCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29ubmVjdGlvblVSTCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29ubmVjdGlvbiBVUkwgZm9yIHRoaXMgUmVhbG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvblVSTCBUaGUgbmV3IGNvbm5lY3Rpb24gVVJMCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblVSTChTdHJpbmcgY29ubmVjdGlvblVSTCkgeworCisgICAgICAgIHRoaXMuY29ubmVjdGlvblVSTCA9IGNvbm5lY3Rpb25VUkw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSk5ESSBjb250ZXh0IGZhY3RvcnkgZm9yIHRoaXMgUmVhbG0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0RmFjdG9yeSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29udGV4dEZhY3RvcnkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEpOREkgY29udGV4dCBmYWN0b3J5IGZvciB0aGlzIFJlYWxtLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHRGYWN0b3J5IFRoZSBuZXcgY29udGV4dCBmYWN0b3J5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dEZhY3RvcnkoU3RyaW5nIGNvbnRleHRGYWN0b3J5KSB7CisKKyAgICAgICAgdGhpcy5jb250ZXh0RmFjdG9yeSA9IGNvbnRleHRGYWN0b3J5OworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZXJlZkFsaWFzZXMgc2V0dGluZyB0byBiZSB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlcmVmQWxpYXNlcygpIHsKKyAgICAgICAgcmV0dXJuIGRlcmVmQWxpYXNlczsKKyAgICB9ICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIGZvciBkZXJlZkFsaWFzZXMgdG8gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyB0aGUgZGlyZWN0b3J5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBkZXJlZkFsaWFzZXMgTmV3IHZhbHVlIG9mIHByb3BlcnR5IGRlcmVmQWxpYXNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXJlZkFsaWFzZXMoamF2YS5sYW5nLlN0cmluZyBkZXJlZkFsaWFzZXMpIHsKKyAgICAgIHRoaXMuZGVyZWZBbGlhc2VzID0gZGVyZWZBbGlhc2VzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJvdG9jb2wgdG8gYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgeworCisgICAgICAgIHJldHVybiBwcm90b2NvbDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJvdG9jb2wgZm9yIHRoaXMgUmVhbG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdG9jb2wgVGhlIG5ldyBwcm90b2NvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm90b2NvbChTdHJpbmcgcHJvdG9jb2wpIHsKKworICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2V0dGluZ3MgZm9yIGhhbmRsaW5nIEpOREkgcmVmZXJyYWxzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJyYWxzICgpIHsKKyAgICAgICAgcmV0dXJuIHJlZmVycmFsczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEhvdyBkbyB3ZSBoYW5kbGUgSk5ESSByZWZlcnJhbHM/IGlnbm9yZSwgZm9sbG93LCBvciB0aHJvdworICAgICAqIChzZWUgamF2YXgubmFtaW5nLkNvbnRleHQuUkVGRVJSQUwgZm9yIG1vcmUgaW5mb3JtYXRpb24pLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZmVycmFscyAoU3RyaW5nIHJlZmVycmFscykgeworICAgICAgICB0aGlzLnJlZmVycmFscyA9IHJlZmVycmFsczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYmFzZSBlbGVtZW50IGZvciB1c2VyIHNlYXJjaGVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlckJhc2UoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnVzZXJCYXNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBiYXNlIGVsZW1lbnQgZm9yIHVzZXIgc2VhcmNoZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlckJhc2UgVGhlIG5ldyBiYXNlIGVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyQmFzZShTdHJpbmcgdXNlckJhc2UpIHsKKworICAgICAgICB0aGlzLnVzZXJCYXNlID0gdXNlckJhc2U7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWVzc2FnZSBmb3JtYXQgcGF0dGVybiBmb3Igc2VsZWN0aW5nIHVzZXJzIGluIHRoaXMgUmVhbG0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyU2VhcmNoKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy51c2VyU2VhcmNoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtZXNzYWdlIGZvcm1hdCBwYXR0ZXJuIGZvciBzZWxlY3RpbmcgdXNlcnMgaW4gdGhpcyBSZWFsbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyU2VhcmNoIFRoZSBuZXcgdXNlciBzZWFyY2ggcGF0dGVybgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJTZWFyY2goU3RyaW5nIHVzZXJTZWFyY2gpIHsKKworICAgICAgICB0aGlzLnVzZXJTZWFyY2ggPSB1c2VyU2VhcmNoOworICAgICAgICBpZiAodXNlclNlYXJjaCA9PSBudWxsKQorICAgICAgICAgICAgdXNlclNlYXJjaEZvcm1hdCA9IG51bGw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVzZXJTZWFyY2hGb3JtYXQgPSBuZXcgTWVzc2FnZUZvcm1hdCh1c2VyU2VhcmNoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSAic2VhcmNoIHN1YnRyZWUgZm9yIHVzZXJzIiBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFVzZXJTdWJ0cmVlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy51c2VyU3VidHJlZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgInNlYXJjaCBzdWJ0cmVlIGZvciB1c2VycyIgZmxhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyU3VidHJlZSBUaGUgbmV3IHNlYXJjaCBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlclN1YnRyZWUoYm9vbGVhbiB1c2VyU3VidHJlZSkgeworCisgICAgICAgIHRoaXMudXNlclN1YnRyZWUgPSB1c2VyU3VidHJlZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VyIHJvbGUgbmFtZSBhdHRyaWJ1dGUgbmFtZSBmb3IgdGhpcyBSZWFsbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJSb2xlTmFtZSgpIHsKKworICAgICAgICByZXR1cm4gdXNlclJvbGVOYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VyIHJvbGUgbmFtZSBhdHRyaWJ1dGUgbmFtZSBmb3IgdGhpcyBSZWFsbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyUm9sZU5hbWUgVGhlIG5ldyB1c2VyUm9sZSBuYW1lIGF0dHJpYnV0ZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlclJvbGVOYW1lKFN0cmluZyB1c2VyUm9sZU5hbWUpIHsKKworICAgICAgICB0aGlzLnVzZXJSb2xlTmFtZSA9IHVzZXJSb2xlTmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBiYXNlIGVsZW1lbnQgZm9yIHJvbGUgc2VhcmNoZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSb2xlQmFzZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucm9sZUJhc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJhc2UgZWxlbWVudCBmb3Igcm9sZSBzZWFyY2hlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlQmFzZSBUaGUgbmV3IGJhc2UgZWxlbWVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVCYXNlKFN0cmluZyByb2xlQmFzZSkgeworCisgICAgICAgIHRoaXMucm9sZUJhc2UgPSByb2xlQmFzZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByb2xlIG5hbWUgYXR0cmlidXRlIG5hbWUgZm9yIHRoaXMgUmVhbG0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSb2xlTmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucm9sZU5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJvbGUgbmFtZSBhdHRyaWJ1dGUgbmFtZSBmb3IgdGhpcyBSZWFsbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlTmFtZSBUaGUgbmV3IHJvbGUgbmFtZSBhdHRyaWJ1dGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVOYW1lKFN0cmluZyByb2xlTmFtZSkgeworCisgICAgICAgIHRoaXMucm9sZU5hbWUgPSByb2xlTmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtZXNzYWdlIGZvcm1hdCBwYXR0ZXJuIGZvciBzZWxlY3Rpbmcgcm9sZXMgaW4gdGhpcyBSZWFsbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGVTZWFyY2goKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJvbGVTZWFyY2gpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1lc3NhZ2UgZm9ybWF0IHBhdHRlcm4gZm9yIHNlbGVjdGluZyByb2xlcyBpbiB0aGlzIFJlYWxtLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGVTZWFyY2ggVGhlIG5ldyByb2xlIHNlYXJjaCBwYXR0ZXJuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um9sZVNlYXJjaChTdHJpbmcgcm9sZVNlYXJjaCkgeworCisgICAgICAgIHRoaXMucm9sZVNlYXJjaCA9IHJvbGVTZWFyY2g7CisgICAgICAgIGlmIChyb2xlU2VhcmNoID09IG51bGwpCisgICAgICAgICAgICByb2xlRm9ybWF0ID0gbnVsbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcm9sZUZvcm1hdCA9IG5ldyBNZXNzYWdlRm9ybWF0KHJvbGVTZWFyY2gpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlICJzZWFyY2ggc3VidHJlZSBmb3Igcm9sZXMiIGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Um9sZVN1YnRyZWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJvbGVTdWJ0cmVlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSAic2VhcmNoIHN1YnRyZWUgZm9yIHJvbGVzIiBmbGFnLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGVTdWJ0cmVlIFRoZSBuZXcgc2VhcmNoIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xlU3VidHJlZShib29sZWFuIHJvbGVTdWJ0cmVlKSB7CisKKyAgICAgICAgdGhpcy5yb2xlU3VidHJlZSA9IHJvbGVTdWJ0cmVlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhc3N3b3JkIGF0dHJpYnV0ZSB1c2VkIHRvIHJldHJpZXZlIHRoZSB1c2VyIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlclBhc3N3b3JkKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy51c2VyUGFzc3dvcmQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhc3N3b3JkIGF0dHJpYnV0ZSB1c2VkIHRvIHJldHJpZXZlIHRoZSB1c2VyIHBhc3N3b3JkLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJQYXNzd29yZCBUaGUgbmV3IHBhc3N3b3JkIGF0dHJpYnV0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJQYXNzd29yZChTdHJpbmcgdXNlclBhc3N3b3JkKSB7CisKKyAgICAgICAgdGhpcy51c2VyUGFzc3dvcmQgPSB1c2VyUGFzc3dvcmQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWVzc2FnZSBmb3JtYXQgcGF0dGVybiBmb3Igc2VsZWN0aW5nIHVzZXJzIGluIHRoaXMgUmVhbG0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyUGF0dGVybigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMudXNlclBhdHRlcm4pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1lc3NhZ2UgZm9ybWF0IHBhdHRlcm4gZm9yIHNlbGVjdGluZyB1c2VycyBpbiB0aGlzIFJlYWxtLgorICAgICAqIFRoaXMgbWF5IGJlIG9uZSBzaW1wbGUgcGF0dGVybiwgb3IgbXVsdGlwbGUgcGF0dGVybnMgdG8gYmUgdHJpZWQsCisgICAgICogc2VwYXJhdGVkIGJ5IHBhcmVudGhlc2VzLiAoZm9yIGV4YW1wbGUsIGVpdGhlciAiY249ezB9Iiwgb3IKKyAgICAgKiAiKGNuPXswfSkoY249ezB9LG89bXlvcmcpIiBGdWxsIExEQVAgc2VhcmNoIHN0cmluZ3MgYXJlIGFsc28gc3VwcG9ydGVkLAorICAgICAqIGJ1dCBvbmx5IHRoZSAiT1IiLCAifCIgc3ludGF4LCBzbyAiKHwoY249ezB9KShjbj17MH0sbz1teW9yZykpIiBpcworICAgICAqIGFsc28gdmFsaWQuIENvbXBsZXggc2VhcmNoIHN0cmluZ3Mgd2l0aCAmLCBldGMgYXJlIE5PVCBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlclBhdHRlcm4gVGhlIG5ldyB1c2VyIHBhdHRlcm4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyUGF0dGVybihTdHJpbmcgdXNlclBhdHRlcm4pIHsKKworICAgICAgICB0aGlzLnVzZXJQYXR0ZXJuID0gdXNlclBhdHRlcm47CisgICAgICAgIGlmICh1c2VyUGF0dGVybiA9PSBudWxsKQorICAgICAgICAgICAgdXNlclBhdHRlcm5BcnJheSA9IG51bGw7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdXNlclBhdHRlcm5BcnJheSA9IHBhcnNlVXNlclBhdHRlcm5TdHJpbmcodXNlclBhdHRlcm4pOworICAgICAgICAgICAgaW50IGxlbiA9IHRoaXMudXNlclBhdHRlcm5BcnJheS5sZW5ndGg7CisgICAgICAgICAgICB1c2VyUGF0dGVybkZvcm1hdEFycmF5ID0gbmV3IE1lc3NhZ2VGb3JtYXRbbGVuXTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgdXNlclBhdHRlcm5Gb3JtYXRBcnJheVtpXSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBNZXNzYWdlRm9ybWF0KHVzZXJQYXR0ZXJuQXJyYXlbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXR0ZXIgZm9yIHByb3BlcnR5IGFsdGVybmF0ZVVSTC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVmFsdWUgb2YgcHJvcGVydHkgYWx0ZXJuYXRlVVJMLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRlVVJMKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmFsdGVybmF0ZVVSTDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSBhbHRlcm5hdGVVUkwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWx0ZXJuYXRlVVJMIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSBhbHRlcm5hdGVVUkwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWx0ZXJuYXRlVVJMKFN0cmluZyBhbHRlcm5hdGVVUkwpIHsKKworICAgICAgICB0aGlzLmFsdGVybmF0ZVVSTCA9IGFsdGVybmF0ZVVSTDsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWFsbSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lIGFuZAorICAgICAqIGNyZWRlbnRpYWxzLCBpZiB0aGVyZSBpcyBvbmU7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVycm9ycyB3aXRoIHRoZSBKREJDIGNvbm5lY3Rpb24sIGV4ZWN1dGluZworICAgICAqIHRoZSBxdWVyeSBvciBhbnl0aGluZyB3ZSByZXR1cm4gbnVsbCAoZG9uJ3QgYXV0aGVudGljYXRlKS4gVGhpcworICAgICAqIGV2ZW50IGlzIGFsc28gbG9nZ2VkLCBhbmQgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgc28gdGhhdAorICAgICAqIGEgc3Vic2VxdWVudCByZXF1ZXN0IHdpbGwgYXV0b21hdGljYWxseSByZS1vcGVuIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lIG9mIHRoZSBQcmluY2lwYWwgdG8gbG9vayB1cAorICAgICAqIEBwYXJhbSBjcmVkZW50aWFscyBQYXNzd29yZCBvciBvdGhlciBjcmVkZW50aWFscyB0byB1c2UgaW4KKyAgICAgKiAgYXV0aGVudGljYXRpbmcgdGhpcyB1c2VybmFtZQorICAgICAqLworICAgIHB1YmxpYyBQcmluY2lwYWwgYXV0aGVudGljYXRlKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIGNyZWRlbnRpYWxzKSB7CisKKyAgICAgICAgRGlyQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKyAgICAgICAgUHJpbmNpcGFsIHByaW5jaXBhbCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIGRpcmVjdG9yeSBjb250ZXh0IGF2YWlsYWJsZQorICAgICAgICAgICAgY29udGV4dCA9IG9wZW4oKTsKKworICAgICAgICAgICAgLy8gT2NjYXNzaW9uYWxseSB0aGUgZGlyZWN0b3J5IGNvbnRleHQgd2lsbCB0aW1lb3V0LiAgVHJ5IG9uZSBtb3JlCisgICAgICAgICAgICAvLyB0aW1lIGJlZm9yZSBnaXZpbmcgdXAuCisgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgLy8gQXV0aGVudGljYXRlIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUgaWYgcG9zc2libGUKKyAgICAgICAgICAgICAgICBwcmluY2lwYWwgPSBhdXRoZW50aWNhdGUoY29udGV4dCwgdXNlcm5hbWUsIGNyZWRlbnRpYWxzKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoQ29tbXVuaWNhdGlvbkV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgICAgICAvLyBsb2cgdGhlIGV4Y2VwdGlvbiBzbyB3ZSBrbm93IGl0J3MgdGhlcmUuCisgICAgICAgICAgICAgICAgY29udGFpbmVyTG9nLndhcm4oc20uZ2V0U3RyaW5nKCJqbmRpUmVhbG0uZXhjZXB0aW9uIiksIGUpOworCisgICAgICAgICAgICAgICAgLy8gY2xvc2UgdGhlIGNvbm5lY3Rpb24gc28gd2Uga25vdyBpdCB3aWxsIGJlIHJlb3BlbmVkLgorICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNsb3NlKGNvbnRleHQpOworCisgICAgICAgICAgICAgICAgLy8gb3BlbiBhIG5ldyBkaXJlY3RvcnkgY29udGV4dC4KKyAgICAgICAgICAgICAgICBjb250ZXh0ID0gb3BlbigpOworCisgICAgICAgICAgICAgICAgLy8gVHJ5IHRoZSBhdXRoZW50aWNhdGlvbiBhZ2Fpbi4KKyAgICAgICAgICAgICAgICBwcmluY2lwYWwgPSBhdXRoZW50aWNhdGUoY29udGV4dCwgdXNlcm5hbWUsIGNyZWRlbnRpYWxzKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIC8vIGxvZyB0aGUgZXhjZXB0aW9uIHNvIHdlIGtub3cgaXQncyB0aGVyZS4KKyAgICAgICAgICAgICAgICBjb250YWluZXJMb2cud2FybihzbS5nZXRTdHJpbmcoImpuZGlSZWFsbS5leGNlcHRpb24iKSwgZSk7CisKKyAgICAgICAgICAgICAgICAvLyBjbG9zZSB0aGUgY29ubmVjdGlvbiBzbyB3ZSBrbm93IGl0IHdpbGwgYmUgcmVvcGVuZWQuCisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UoY29udGV4dCk7CisKKyAgICAgICAgICAgICAgICAvLyBvcGVuIGEgbmV3IGRpcmVjdG9yeSBjb250ZXh0LgorICAgICAgICAgICAgICAgIGNvbnRleHQgPSBvcGVuKCk7CisKKyAgICAgICAgICAgICAgICAvLyBUcnkgdGhlIGF1dGhlbnRpY2F0aW9uIGFnYWluLgorICAgICAgICAgICAgICAgIHByaW5jaXBhbCA9IGF1dGhlbnRpY2F0ZShjb250ZXh0LCB1c2VybmFtZSwgY3JlZGVudGlhbHMpOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gUmVsZWFzZSB0aGlzIGNvbnRleHQKKyAgICAgICAgICAgIHJlbGVhc2UoY29udGV4dCk7CisKKyAgICAgICAgICAgIC8vIFJldHVybiB0aGUgYXV0aGVudGljYXRlZCBQcmluY2lwYWwgKGlmIGFueSkKKyAgICAgICAgICAgIHJldHVybiAocHJpbmNpcGFsKTsKKworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAvLyBMb2cgdGhlIHByb2JsZW0gZm9yIHBvc3Rlcml0eQorICAgICAgICAgICAgY29udGFpbmVyTG9nLmVycm9yKHNtLmdldFN0cmluZygiam5kaVJlYWxtLmV4Y2VwdGlvbiIpLCBlKTsKKworICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGNvbm5lY3Rpb24gc28gdGhhdCBpdCBnZXRzIHJlb3BlbmVkIG5leHQgdGltZQorICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjbG9zZShjb250ZXh0KTsKKworICAgICAgICAgICAgLy8gUmV0dXJuICJub3QgYXV0aGVudGljYXRlZCIgZm9yIHRoaXMgcmVxdWVzdAorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kCisgICAgICogY3JlZGVudGlhbHMsIGlmIHRoZXJlIGlzIG9uZTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBkaXJlY3RvcnkgY29udGV4dAorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSBvZiB0aGUgUHJpbmNpcGFsIHRvIGxvb2sgdXAKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgUGFzc3dvcmQgb3Igb3RoZXIgY3JlZGVudGlhbHMgdG8gdXNlIGluCisgICAgICogIGF1dGhlbnRpY2F0aW5nIHRoaXMgdXNlcm5hbWUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgZGlyZWN0b3J5IHNlcnZlciBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFByaW5jaXBhbCBhdXRoZW50aWNhdGUoRGlyQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjcmVkZW50aWFscykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHVzZXJuYW1lID09IG51bGwgfHwgdXNlcm5hbWUuZXF1YWxzKCIiKQorICAgICAgICAgICAgfHwgY3JlZGVudGlhbHMgPT0gbnVsbCB8fCBjcmVkZW50aWFscy5lcXVhbHMoIiIpKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICBpZiAodXNlclBhdHRlcm5BcnJheSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGN1clVzZXJQYXR0ZXJuID0gMDsKKyAgICAgICAgICAgICAgICAgY3VyVXNlclBhdHRlcm4gPCB1c2VyUGF0dGVybkZvcm1hdEFycmF5Lmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgY3VyVXNlclBhdHRlcm4rKykgeworICAgICAgICAgICAgICAgIC8vIFJldHJpZXZlIHVzZXIgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICBVc2VyIHVzZXIgPSBnZXRVc2VyKGNvbnRleHQsIHVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodXNlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgdXNlcidzIGNyZWRlbnRpYWxzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDcmVkZW50aWFscyhjb250ZXh0LCB1c2VyLCBjcmVkZW50aWFscykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWFyY2ggZm9yIGFkZGl0aW9uYWwgcm9sZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHJvbGVzID0gZ2V0Um9sZXMoY29udGV4dCwgdXNlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgR2VuZXJpY1ByaW5jaXBhbCh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWROYW1lRXhjZXB0aW9uIGluZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nIHRoZSBwcm9ibGVtIGZvciBwb3N0ZXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckxvZy53YXJuKHNtLmdldFN0cmluZygiam5kaVJlYWxtLmV4Y2VwdGlvbiIpLCBpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlOyB0aGlzIGlzIHByb2JhYmx5IGR1ZSB0byBhIG5hbWUgbm90IGZpdHRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZWFyY2ggcGF0aCBmb3JtYXQgZXhhY3RseSwgYXMgaW4gYSBmdWxseS0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1YWxpZmllZCBuYW1lIGJlaW5nIG11bmdlZCBpbnRvIGEgc2VhcmNoIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgYWxyZWFkeSBjb250YWlucyBjbj0gb3IgdmljZS12ZXJzYQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBSZXRyaWV2ZSB1c2VyIGluZm9ybWF0aW9uCisgICAgICAgICAgICBVc2VyIHVzZXIgPSBnZXRVc2VyKGNvbnRleHQsIHVzZXJuYW1lKTsKKyAgICAgICAgICAgIGlmICh1c2VyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHVzZXIncyBjcmVkZW50aWFscworICAgICAgICAgICAgaWYgKCFjaGVja0NyZWRlbnRpYWxzKGNvbnRleHQsIHVzZXIsIGNyZWRlbnRpYWxzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgICAgICAvLyBTZWFyY2ggZm9yIGFkZGl0aW9uYWwgcm9sZXMKKyAgICAgICAgICAgIExpc3Qgcm9sZXMgPSBnZXRSb2xlcyhjb250ZXh0LCB1c2VyKTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSBzdWl0YWJsZSBQcmluY2lwYWwgZm9yIHRoaXMgdXNlcgorICAgICAgICAgICAgcmV0dXJuIChuZXcgR2VuZXJpY1ByaW5jaXBhbCh0aGlzLCB1c2VybmFtZSwgY3JlZGVudGlhbHMsIHJvbGVzKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFVzZXIgb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIKKyAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUsIGlmIGZvdW5kIGluIHRoZSBkaXJlY3Rvcnk7CisgICAgICogb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIElmIHRoZSA8Y29kZT51c2VyUGFzc3dvcmQ8L2NvZGU+IGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlIGlzCisgICAgICogc3BlY2lmaWVkLCB0aGUgdmFsdWUgb2YgdGhhdCBhdHRyaWJ1dGUgaXMgcmV0cmlldmVkIGZyb20gdGhlCisgICAgICogdXNlcidzIGRpcmVjdG9yeSBlbnRyeS4gSWYgdGhlIDxjb2RlPnVzZXJSb2xlTmFtZTwvY29kZT4KKyAgICAgKiBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsIGFsbCB2YWx1ZXMgb2YgdGhhdAorICAgICAqIGF0dHJpYnV0ZSBhcmUgcmV0cmlldmVkIGZyb20gdGhlIGRpcmVjdG9yeSBlbnRyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBkaXJlY3RvcnkgY29udGV4dAorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSB0byBiZSBsb29rZWQgdXAKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgZGlyZWN0b3J5IHNlcnZlciBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVXNlciBnZXRVc2VyKERpckNvbnRleHQgY29udGV4dCwgU3RyaW5nIHVzZXJuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBVc2VyIHVzZXIgPSBudWxsOworCisgICAgICAgIC8vIEdldCBhdHRyaWJ1dGVzIHRvIHJldHJpZXZlIGZyb20gdXNlciBlbnRyeQorICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgaWYgKHVzZXJQYXNzd29yZCAhPSBudWxsKQorICAgICAgICAgICAgbGlzdC5hZGQodXNlclBhc3N3b3JkKTsKKyAgICAgICAgaWYgKHVzZXJSb2xlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgbGlzdC5hZGQodXNlclJvbGVOYW1lKTsKKyAgICAgICAgU3RyaW5nW10gYXR0cklkcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOworICAgICAgICBsaXN0LnRvQXJyYXkoYXR0cklkcyk7CisKKyAgICAgICAgLy8gVXNlIHBhdHRlcm4gb3Igc2VhcmNoIGZvciB1c2VyIGVudHJ5CisgICAgICAgIGlmICh1c2VyUGF0dGVybkZvcm1hdEFycmF5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHVzZXIgPSBnZXRVc2VyQnlQYXR0ZXJuKGNvbnRleHQsIHVzZXJuYW1lLCBhdHRySWRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVzZXIgPSBnZXRVc2VyQnlTZWFyY2goY29udGV4dCwgdXNlcm5hbWUsIGF0dHJJZHMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHVzZXI7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhlIDxjb2RlPlVzZXJQYXR0ZXJuPC9jb2RlPiBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSB0bworICAgICAqIGxvY2F0ZSB0aGUgZGlyZWN0b3J5IGVudHJ5IGZvciB0aGUgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB1c2VybmFtZSBhbmQgcmV0dXJuIGEgVXNlciBvYmplY3Q7IG90aGVyd2lzZSByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBkaXJlY3RvcnkgY29udGV4dAorICAgICAqIEBwYXJhbSB1c2VybmFtZSBUaGUgdXNlcm5hbWUKKyAgICAgKiBAcGFyYW0gYXR0cklkcyBTdHJpbmdbXWNvbnRhaW5pbmcgbmFtZXMgb2YgYXR0cmlidXRlcyB0bworICAgICAqIHJldHJpZXZlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBkaXJlY3Rvcnkgc2VydmVyIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCBVc2VyIGdldFVzZXJCeVBhdHRlcm4oRGlyQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBhdHRySWRzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAodXNlcm5hbWUgPT0gbnVsbCB8fCB1c2VyUGF0dGVybkZvcm1hdEFycmF5W2N1clVzZXJQYXR0ZXJuXSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAvLyBGb3JtIHRoZSBkbiBmcm9tIHRoZSB1c2VyIHBhdHRlcm4KKyAgICAgICAgU3RyaW5nIGRuID0gdXNlclBhdHRlcm5Gb3JtYXRBcnJheVtjdXJVc2VyUGF0dGVybl0uZm9ybWF0KG5ldyBTdHJpbmdbXSB7IHVzZXJuYW1lIH0pOworCisgICAgICAgIC8vIEdldCByZXF1aXJlZCBhdHRyaWJ1dGVzIGZyb20gdXNlciBlbnRyeQorICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGF0dHJzID0gY29udGV4dC5nZXRBdHRyaWJ1dGVzKGRuLCBhdHRySWRzKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0dHJzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIC8vIFJldHJpZXZlIHZhbHVlIG9mIHVzZXJQYXNzd29yZAorICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSBudWxsOworICAgICAgICBpZiAodXNlclBhc3N3b3JkICE9IG51bGwpCisgICAgICAgICAgICBwYXNzd29yZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHVzZXJQYXNzd29yZCwgYXR0cnMpOworCisgICAgICAgIC8vIFJldHJpZXZlIHZhbHVlcyBvZiB1c2VyUm9sZU5hbWUgYXR0cmlidXRlCisgICAgICAgIEFycmF5TGlzdCByb2xlcyA9IG51bGw7CisgICAgICAgIGlmICh1c2VyUm9sZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJvbGVzID0gYWRkQXR0cmlidXRlVmFsdWVzKHVzZXJSb2xlTmFtZSwgYXR0cnMsIHJvbGVzKTsKKworICAgICAgICByZXR1cm4gbmV3IFVzZXIodXNlcm5hbWUsIGRuLCBwYXNzd29yZCwgcm9sZXMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VhcmNoIHRoZSBkaXJlY3RvcnkgdG8gcmV0dXJuIGEgVXNlciBvYmplY3QgY29udGFpbmluZworICAgICAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyIHdpdGggdGhlIHNwZWNpZmllZCB1c2VybmFtZSwgaWYKKyAgICAgKiBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGRpcmVjdG9yeSBjb250ZXh0CisgICAgICogQHBhcmFtIHVzZXJuYW1lIFRoZSB1c2VybmFtZQorICAgICAqIEBwYXJhbSBhdHRySWRzIFN0cmluZ1tdY29udGFpbmluZyBuYW1lcyBvZiBhdHRyaWJ1dGVzIHRvIHJldHJpZXZlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBkaXJlY3Rvcnkgc2VydmVyIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCBVc2VyIGdldFVzZXJCeVNlYXJjaChEaXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGF0dHJJZHMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIGlmICh1c2VybmFtZSA9PSBudWxsIHx8IHVzZXJTZWFyY2hGb3JtYXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgLy8gRm9ybSB0aGUgc2VhcmNoIGZpbHRlcgorICAgICAgICBTdHJpbmcgZmlsdGVyID0gdXNlclNlYXJjaEZvcm1hdC5mb3JtYXQobmV3IFN0cmluZ1tdIHsgdXNlcm5hbWUgfSk7CisKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBzZWFyY2ggY29udHJvbHMKKyAgICAgICAgU2VhcmNoQ29udHJvbHMgY29uc3RyYWludHMgPSBuZXcgU2VhcmNoQ29udHJvbHMoKTsKKworICAgICAgICBpZiAodXNlclN1YnRyZWUpIHsKKyAgICAgICAgICAgIGNvbnN0cmFpbnRzLnNldFNlYXJjaFNjb3BlKFNlYXJjaENvbnRyb2xzLlNVQlRSRUVfU0NPUEUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29uc3RyYWludHMuc2V0U2VhcmNoU2NvcGUoU2VhcmNoQ29udHJvbHMuT05FTEVWRUxfU0NPUEUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3BlY2lmeSB0aGUgYXR0cmlidXRlcyB0byBiZSByZXRyaWV2ZWQKKyAgICAgICAgaWYgKGF0dHJJZHMgPT0gbnVsbCkKKyAgICAgICAgICAgIGF0dHJJZHMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICBjb25zdHJhaW50cy5zZXRSZXR1cm5pbmdBdHRyaWJ1dGVzKGF0dHJJZHMpOworCisgICAgICAgIE5hbWluZ0VudW1lcmF0aW9uIHJlc3VsdHMgPQorICAgICAgICAgICAgY29udGV4dC5zZWFyY2godXNlckJhc2UsIGZpbHRlciwgY29uc3RyYWludHMpOworCisKKyAgICAgICAgLy8gRmFpbCBpZiBubyBlbnRyaWVzIGZvdW5kCisgICAgICAgIGlmIChyZXN1bHRzID09IG51bGwgfHwgIXJlc3VsdHMuaGFzTW9yZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IHJlc3VsdCBmb3IgdGhlIGZpcnN0IGVudHJ5IGZvdW5kCisgICAgICAgIFNlYXJjaFJlc3VsdCByZXN1bHQgPSAoU2VhcmNoUmVzdWx0KXJlc3VsdHMubmV4dCgpOworCisgICAgICAgIC8vIENoZWNrIG5vIGZ1cnRoZXIgZW50cmllcyB3ZXJlIGZvdW5kCisgICAgICAgIGlmIChyZXN1bHRzLmhhc01vcmUoKSkgeworICAgICAgICAgICAgaWYoY29udGFpbmVyTG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBjb250YWluZXJMb2cuaW5mbygidXNlcm5hbWUgIiArIHVzZXJuYW1lICsgIiBoYXMgbXVsdGlwbGUgZW50cmllcyIpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCB0aGUgZW50cnkncyBkaXN0aW5ndWlzaGVkIG5hbWUKKyAgICAgICAgTmFtZVBhcnNlciBwYXJzZXIgPSBjb250ZXh0LmdldE5hbWVQYXJzZXIoIiIpOworICAgICAgICBOYW1lIGNvbnRleHROYW1lID0gcGFyc2VyLnBhcnNlKGNvbnRleHQuZ2V0TmFtZUluTmFtZXNwYWNlKCkpOworICAgICAgICBOYW1lIGJhc2VOYW1lID0gcGFyc2VyLnBhcnNlKHVzZXJCYXNlKTsKKworICAgICAgICAvLyBCdWd6aWxsYSAzMjI2OQorICAgICAgICBOYW1lIGVudHJ5TmFtZSA9IHBhcnNlci5wYXJzZShuZXcgQ29tcG9zaXRlTmFtZShyZXN1bHQuZ2V0TmFtZSgpKS5nZXQoMCkpOworCisgICAgICAgIE5hbWUgbmFtZSA9IGNvbnRleHROYW1lLmFkZEFsbChiYXNlTmFtZSk7CisgICAgICAgIG5hbWUgPSBuYW1lLmFkZEFsbChlbnRyeU5hbWUpOworICAgICAgICBTdHJpbmcgZG4gPSBuYW1lLnRvU3RyaW5nKCk7CisKKyAgICAgICAgaWYgKGNvbnRhaW5lckxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgY29udGFpbmVyTG9nLnRyYWNlKCIgIGVudHJ5IGZvdW5kIGZvciAiICsgdXNlcm5hbWUgKyAiIHdpdGggZG4gIiArIGRuKTsKKworICAgICAgICAvLyBHZXQgdGhlIGVudHJ5J3MgYXR0cmlidXRlcworICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzID0gcmVzdWx0LmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgaWYgKGF0dHJzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBSZXRyaWV2ZSB2YWx1ZSBvZiB1c2VyUGFzc3dvcmQKKyAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKKyAgICAgICAgaWYgKHVzZXJQYXNzd29yZCAhPSBudWxsKQorICAgICAgICAgICAgcGFzc3dvcmQgPSBnZXRBdHRyaWJ1dGVWYWx1ZSh1c2VyUGFzc3dvcmQsIGF0dHJzKTsKKworICAgICAgICAvLyBSZXRyaWV2ZSB2YWx1ZXMgb2YgdXNlclJvbGVOYW1lIGF0dHJpYnV0ZQorICAgICAgICBBcnJheUxpc3Qgcm9sZXMgPSBudWxsOworICAgICAgICBpZiAodXNlclJvbGVOYW1lICE9IG51bGwpCisgICAgICAgICAgICByb2xlcyA9IGFkZEF0dHJpYnV0ZVZhbHVlcyh1c2VyUm9sZU5hbWUsIGF0dHJzLCByb2xlcyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBVc2VyKHVzZXJuYW1lLCBkbiwgcGFzc3dvcmQsIHJvbGVzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIFVzZXIgY2FuIGJlIGF1dGhlbnRpY2F0ZWQgd2l0aCB0aGUKKyAgICAgKiBnaXZlbiBjcmVkZW50aWFscy4gSWYgdGhlIDxjb2RlPnVzZXJQYXNzd29yZDwvY29kZT4KKyAgICAgKiBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsIHRoZSBjcmVkZW50aWFscworICAgICAqIHByZXZpb3VzbHkgcmV0cmlldmVkIGZyb20gdGhlIGRpcmVjdG9yeSBhcmUgY29tcGFyZWQgZXhwbGljaXRseQorICAgICAqIHdpdGggdGhvc2UgcHJlc2VudGVkIGJ5IHRoZSB1c2VyLiBPdGhlcndpc2UgdGhlIHByZXNlbnRlZAorICAgICAqIGNyZWRlbnRpYWxzIGFyZSBjaGVja2VkIGJ5IGJpbmRpbmcgdG8gdGhlIGRpcmVjdG9yeSBhcyB0aGUKKyAgICAgKiB1c2VyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGRpcmVjdG9yeSBjb250ZXh0CisgICAgICogQHBhcmFtIHVzZXIgVGhlIFVzZXIgdG8gYmUgYXV0aGVudGljYXRlZAorICAgICAqIEBwYXJhbSBjcmVkZW50aWFscyBUaGUgY3JlZGVudGlhbHMgcHJlc2VudGVkIGJ5IHRoZSB1c2VyCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIGRpcmVjdG9yeSBzZXJ2ZXIgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tDcmVkZW50aWFscyhEaXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlciB1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjcmVkZW50aWFscykKKyAgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgICBib29sZWFuIHZhbGlkYXRlZCA9IGZhbHNlOworCisgICAgICAgICBpZiAodXNlclBhc3N3b3JkID09IG51bGwpIHsKKyAgICAgICAgICAgICB2YWxpZGF0ZWQgPSBiaW5kQXNVc2VyKGNvbnRleHQsIHVzZXIsIGNyZWRlbnRpYWxzKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgdmFsaWRhdGVkID0gY29tcGFyZUNyZWRlbnRpYWxzKGNvbnRleHQsIHVzZXIsIGNyZWRlbnRpYWxzKTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKGNvbnRhaW5lckxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgaWYgKHZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICBjb250YWluZXJMb2cudHJhY2Uoc20uZ2V0U3RyaW5nKCJqbmRpUmVhbG0uYXV0aGVudGljYXRlU3VjY2VzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci51c2VybmFtZSkpOworICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIGNvbnRhaW5lckxvZy50cmFjZShzbS5nZXRTdHJpbmcoImpuZGlSZWFsbS5hdXRoZW50aWNhdGVGYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnVzZXJuYW1lKSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgcmV0dXJuICh2YWxpZGF0ZWQpOworICAgICB9CisKKworCisgICAgLyoqCisgICAgICogQ2hlY2sgd2hldGhlciB0aGUgY3JlZGVudGlhbHMgcHJlc2VudGVkIGJ5IHRoZSB1c2VyIG1hdGNoIHRob3NlCisgICAgICogcmV0cmlldmVkIGZyb20gdGhlIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBkaXJlY3RvcnkgY29udGV4dAorICAgICAqIEBwYXJhbSBpbmZvIFRoZSBVc2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgQXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgZGlyZWN0b3J5IHNlcnZlciBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb21wYXJlQ3JlZGVudGlhbHMoRGlyQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjcmVkZW50aWFscykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGluZm8gPT0gbnVsbCB8fCBjcmVkZW50aWFscyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gaW5mby5wYXNzd29yZDsKKyAgICAgICAgaWYgKHBhc3N3b3JkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgY3JlZGVudGlhbHMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyCisgICAgICAgIGlmIChjb250YWluZXJMb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lckxvZy50cmFjZSgiICB2YWxpZGF0aW5nIGNyZWRlbnRpYWxzIik7CisKKyAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKGhhc01lc3NhZ2VEaWdlc3QoKSkgeworICAgICAgICAgICAgLy8gaVBsYW5ldCBzdXBwb3J0IGlmIHRoZSB2YWx1ZXMgc3RhcnRzIHdpdGgge1NIQTF9CisgICAgICAgICAgICAvLyBUaGUgc3RyaW5nIGlzIGluIGEgZm9ybWF0IGNvbXBhdGlibGUgd2l0aCBCYXNlNjQuZW5jb2RlIG5vdAorICAgICAgICAgICAgLy8gdGhlIEhleCBlbmNvZGluZyBvZiB0aGUgcGFyZW50IGNsYXNzLgorICAgICAgICAgICAgaWYgKHBhc3N3b3JkLnN0YXJ0c1dpdGgoIntTSEF9IikpIHsKKyAgICAgICAgICAgICAgICAvKiBzeW5jIHNpbmNlIHN1cGVyLmRpZ2VzdCgpIGRvZXMgdGhpcyBzYW1lIHRoaW5nICovCisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkID0gcGFzc3dvcmQuc3Vic3RyaW5nKDUpOworICAgICAgICAgICAgICAgICAgICBtZC5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICBtZC51cGRhdGUoY3JlZGVudGlhbHMuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaWdlc3RlZFBhc3N3b3JkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcoQmFzZTY0LmVuY29kZShtZC5kaWdlc3QoKSkpOworICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWQgPSBwYXNzd29yZC5lcXVhbHMoZGlnZXN0ZWRQYXNzd29yZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzd29yZC5zdGFydHNXaXRoKCJ7U1NIQX0iKSkgeworICAgICAgICAgICAgICAgIC8vIEJ1Z3ppbGxhIDMyOTM4CisgICAgICAgICAgICAgICAgLyogc3luYyBzaW5jZSBzdXBlci5kaWdlc3QoKSBkb2VzIHRoaXMgc2FtZSB0aGluZyAqLworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCA9IHBhc3N3b3JkLnN1YnN0cmluZyg2KTsKKworICAgICAgICAgICAgICAgICAgICBtZC5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICBtZC51cGRhdGUoY3JlZGVudGlhbHMuZ2V0Qnl0ZXMoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVjb2RlIHN0b3JlZCBwYXNzd29yZC4KKyAgICAgICAgICAgICAgICAgICAgQnl0ZUNodW5rIHB3YmMgPSBuZXcgQnl0ZUNodW5rKHBhc3N3b3JkLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB3YmMuYXBwZW5kKHBhc3N3b3JkLmdldEJ5dGVzKCksIDAsIHBhc3N3b3JkLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyTG9nLmVycm9yKCJDb3VsZCBub3QgYXBwZW5kIHBhc3N3b3JkIGJ5dGVzIHRvIGNodW5rOiAiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENoYXJDaHVuayBkZWNvZGVkID0gbmV3IENoYXJDaHVuaygpOworICAgICAgICAgICAgICAgICAgICBCYXNlNjQuZGVjb2RlKHB3YmMsIGRlY29kZWQpOworICAgICAgICAgICAgICAgICAgICBjaGFyW10gcHdhcnJheSA9IGRlY29kZWQuZ2V0QnVmZmVyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU3BsaXQgZGVjb2RlZCBwYXNzd29yZCBpbnRvIGhhc2ggYW5kIHNhbHQuCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzYWx0cG9zID0gMjA7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBoYXNoID0gbmV3IGJ5dGVbc2FsdHBvc107CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTwgaGFzaC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFzaFtpXSA9IChieXRlKSBwd2FycmF5W2ldOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHNhbHQgPSBuZXcgYnl0ZVtwd2FycmF5Lmxlbmd0aCAtIHNhbHRwb3NdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8IHNhbHQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBzYWx0W2ldID0gKGJ5dGUpcHdhcnJheVtpK3NhbHRwb3NdOworCisgICAgICAgICAgICAgICAgICAgIG1kLnVwZGF0ZShzYWx0KTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRwID0gbWQuZGlnZXN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkID0gQXJyYXlzLmVxdWFscyhkcCwgaGFzaCk7CisgICAgICAgICAgICAgICAgfSAvLyBFbmQgc3luY2hyb25pemVkKHRoaXMpIGJsb2NrCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEhleCBoYXNoZXMgc2hvdWxkIGJlIGNvbXBhcmVkIGNhc2UtaW5zZW5zaXRpdmUKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZWQgPSAoZGlnZXN0KGNyZWRlbnRpYWxzKS5lcXVhbHNJZ25vcmVDYXNlKHBhc3N3b3JkKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdmFsaWRhdGVkID0gKGRpZ2VzdChjcmVkZW50aWFscykuZXF1YWxzKHBhc3N3b3JkKSk7CisgICAgICAgIHJldHVybiAodmFsaWRhdGVkKTsKKworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBDaGVjayBjcmVkZW50aWFscyBieSBiaW5kaW5nIHRvIHRoZSBkaXJlY3RvcnkgYXMgdGhlIHVzZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBkaXJlY3RvcnkgY29udGV4dAorICAgICAqIEBwYXJhbSB1c2VyIFRoZSBVc2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgQXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgZGlyZWN0b3J5IHNlcnZlciBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICAgcHJvdGVjdGVkIGJvb2xlYW4gYmluZEFzVXNlcihEaXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlciB1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjcmVkZW50aWFscykKKyAgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICAgQXR0cmlidXRlcyBhdHRyOworCisgICAgICAgICBpZiAoY3JlZGVudGlhbHMgPT0gbnVsbCB8fCB1c2VyID09IG51bGwpCisgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICAgICAgIFN0cmluZyBkbiA9IHVzZXIuZG47CisgICAgICAgICBpZiAoZG4gPT0gbnVsbCkKKyAgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGNyZWRlbnRpYWxzIHNwZWNpZmllZCBieSB0aGUgdXNlcgorICAgICAgICAgaWYgKGNvbnRhaW5lckxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgY29udGFpbmVyTG9nLnRyYWNlKCIgIHZhbGlkYXRpbmcgY3JlZGVudGlhbHMgYnkgYmluZGluZyBhcyB0aGUgdXNlciIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHVwIHNlY3VyaXR5IGVudmlyb25tZW50IHRvIGJpbmQgYXMgdGhlIHVzZXIKKyAgICAgICAgY29udGV4dC5hZGRUb0Vudmlyb25tZW50KENvbnRleHQuU0VDVVJJVFlfUFJJTkNJUEFMLCBkbik7CisgICAgICAgIGNvbnRleHQuYWRkVG9FbnZpcm9ubWVudChDb250ZXh0LlNFQ1VSSVRZX0NSRURFTlRJQUxTLCBjcmVkZW50aWFscyk7CisKKyAgICAgICAgLy8gRWxpY2l0IGFuIExEQVAgYmluZCBvcGVyYXRpb24KKyAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjb250YWluZXJMb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRhaW5lckxvZy50cmFjZSgiICBiaW5kaW5nIGFzICIgICsgZG4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0ciA9IGNvbnRleHQuZ2V0QXR0cmlidXRlcygiIiwgbnVsbCk7CisgICAgICAgICAgICB2YWxpZGF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyTG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBjb250YWluZXJMb2cudHJhY2UoIiAgYmluZCBhdHRlbXB0IGZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgc2VjdXJpdHkgZW52aXJvbm1lbnQKKyAgICAgICAgaWYgKGNvbm5lY3Rpb25OYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRleHQuYWRkVG9FbnZpcm9ubWVudChDb250ZXh0LlNFQ1VSSVRZX1BSSU5DSVBBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUZyb21FbnZpcm9ubWVudChDb250ZXh0LlNFQ1VSSVRZX1BSSU5DSVBBTCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29ubmVjdGlvblBhc3N3b3JkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRleHQuYWRkVG9FbnZpcm9ubWVudChDb250ZXh0LlNFQ1VSSVRZX0NSRURFTlRJQUxTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25QYXNzd29yZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUZyb21FbnZpcm9ubWVudChDb250ZXh0LlNFQ1VSSVRZX0NSRURFTlRJQUxTKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAodmFsaWRhdGVkKTsKKyAgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBMaXN0IG9mIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gVXNlci4gIEFueQorICAgICAqIHJvbGVzIHByZXNlbnQgaW4gdGhlIHVzZXIncyBkaXJlY3RvcnkgZW50cnkgYXJlIHN1cHBsZW1lbnRlZCBieQorICAgICAqIGEgZGlyZWN0b3J5IHNlYXJjaC4gSWYgbm8gcm9sZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIsCisgICAgICogYSB6ZXJvLWxlbmd0aCBMaXN0IGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGRpcmVjdG9yeSBjb250ZXh0IHdlIGFyZSBzZWFyY2hpbmcKKyAgICAgKiBAcGFyYW0gdXNlciBUaGUgVXNlciB0byBiZSBjaGVja2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIGRpcmVjdG9yeSBzZXJ2ZXIgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIExpc3QgZ2V0Um9sZXMoRGlyQ29udGV4dCBjb250ZXh0LCBVc2VyIHVzZXIpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIGlmICh1c2VyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIFN0cmluZyBkbiA9IHVzZXIuZG47CisgICAgICAgIFN0cmluZyB1c2VybmFtZSA9IHVzZXIudXNlcm5hbWU7CisKKyAgICAgICAgaWYgKGRuID09IG51bGwgfHwgdXNlcm5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgaWYgKGNvbnRhaW5lckxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgY29udGFpbmVyTG9nLnRyYWNlKCIgIGdldFJvbGVzKCIgKyBkbiArICIpIik7CisKKyAgICAgICAgLy8gU3RhcnQgd2l0aCByb2xlcyByZXRyaWV2ZWQgZnJvbSB0aGUgdXNlciBlbnRyeQorICAgICAgICBBcnJheUxpc3QgbGlzdCA9IHVzZXIucm9sZXM7CisgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBcmUgd2UgY29uZmlndXJlZCB0byBkbyByb2xlIHNlYXJjaGVzPworICAgICAgICBpZiAoKHJvbGVGb3JtYXQgPT0gbnVsbCkgfHwgKHJvbGVOYW1lID09IG51bGwpKQorICAgICAgICAgICAgcmV0dXJuIChsaXN0KTsKKworICAgICAgICAvLyBTZXQgdXAgcGFyYW1ldGVycyBmb3IgYW4gYXBwcm9wcmlhdGUgc2VhcmNoCisgICAgICAgIFN0cmluZyBmaWx0ZXIgPSByb2xlRm9ybWF0LmZvcm1hdChuZXcgU3RyaW5nW10geyBkb1JGQzIyNTRFbmNvZGluZyhkbiksIHVzZXJuYW1lIH0pOworICAgICAgICBTZWFyY2hDb250cm9scyBjb250cm9scyA9IG5ldyBTZWFyY2hDb250cm9scygpOworICAgICAgICBpZiAocm9sZVN1YnRyZWUpCisgICAgICAgICAgICBjb250cm9scy5zZXRTZWFyY2hTY29wZShTZWFyY2hDb250cm9scy5TVUJUUkVFX1NDT1BFKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29udHJvbHMuc2V0U2VhcmNoU2NvcGUoU2VhcmNoQ29udHJvbHMuT05FTEVWRUxfU0NPUEUpOworICAgICAgICBjb250cm9scy5zZXRSZXR1cm5pbmdBdHRyaWJ1dGVzKG5ldyBTdHJpbmdbXSB7cm9sZU5hbWV9KTsKKworICAgICAgICAvLyBQZXJmb3JtIHRoZSBjb25maWd1cmVkIHNlYXJjaCBhbmQgcHJvY2VzcyB0aGUgcmVzdWx0cworICAgICAgICBOYW1pbmdFbnVtZXJhdGlvbiByZXN1bHRzID0KKyAgICAgICAgICAgIGNvbnRleHQuc2VhcmNoKHJvbGVCYXNlLCBmaWx0ZXIsIGNvbnRyb2xzKTsKKyAgICAgICAgaWYgKHJlc3VsdHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobGlzdCk7ICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQganVzdCBpbiBjYXNlIC4uLgorICAgICAgICB3aGlsZSAocmVzdWx0cy5oYXNNb3JlKCkpIHsKKyAgICAgICAgICAgIFNlYXJjaFJlc3VsdCByZXN1bHQgPSAoU2VhcmNoUmVzdWx0KSByZXN1bHRzLm5leHQoKTsKKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSByZXN1bHQuZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgaWYgKGF0dHJzID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBsaXN0ID0gYWRkQXR0cmlidXRlVmFsdWVzKHJvbGVOYW1lLCBhdHRycywgbGlzdCk7CisgICAgICAgIH0KKworCisgICAgICAgIGlmIChjb250YWluZXJMb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRhaW5lckxvZy50cmFjZSgiICBSZXR1cm5pbmcgIiArIGxpc3Quc2l6ZSgpICsgIiByb2xlcyIpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxsaXN0LnNpemUoKTsgaSsrKQorICAgICAgICAgICAgICAgICAgICBjb250YWluZXJMb2cudHJhY2UoICAiICBGb3VuZCByb2xlICIgKyBsaXN0LmdldChpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnRhaW5lckxvZy50cmFjZSgiICBnZXRSb2xlcyBhYm91dCB0byByZXR1cm4gbnVsbCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAobGlzdCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRySWQgQXR0cmlidXRlIG5hbWUKKyAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBjb250YWluaW5nIHRoZSByZXF1aXJlZCB2YWx1ZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBkaXJlY3Rvcnkgc2VydmVyIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBhdHRySWQsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIGlmIChjb250YWluZXJMb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lckxvZy50cmFjZSgiICByZXRyaWV2aW5nIGF0dHJpYnV0ZSAiICsgYXR0cklkKTsKKworICAgICAgICBpZiAoYXR0cklkID09IG51bGwgfHwgYXR0cnMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gYXR0cnMuZ2V0KGF0dHJJZCk7CisgICAgICAgIGlmIChhdHRyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBPYmplY3QgdmFsdWUgPSBhdHRyLmdldCgpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIFN0cmluZyB2YWx1ZVN0cmluZyA9IG51bGw7CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGJ5dGVbXSkKKyAgICAgICAgICAgIHZhbHVlU3RyaW5nID0gbmV3IFN0cmluZygoYnl0ZVtdKSB2YWx1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTsKKworICAgICAgICByZXR1cm4gdmFsdWVTdHJpbmc7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIEFkZCB2YWx1ZXMgb2YgYSBzcGVjaWZpZWQgYXR0cmlidXRlIHRvIGEgbGlzdAorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJJZCBBdHRyaWJ1dGUgbmFtZQorICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIGNvbnRhaW5pbmcgdGhlIG5ldyB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gdmFsdWVzIEFycmF5TGlzdCBjb250YWluaW5nIHZhbHVlcyBmb3VuZCBzbyBmYXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgZGlyZWN0b3J5IHNlcnZlciBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdCBhZGRBdHRyaWJ1dGVWYWx1ZXMoU3RyaW5nIGF0dHJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHZhbHVlcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbnsKKworICAgICAgICBpZiAoY29udGFpbmVyTG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBjb250YWluZXJMb2cudHJhY2UoIiAgcmV0cmlldmluZyB2YWx1ZXMgZm9yIGF0dHJpYnV0ZSAiICsgYXR0cklkKTsKKyAgICAgICAgaWYgKGF0dHJJZCA9PSBudWxsIHx8IGF0dHJzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdmFsdWVzOworICAgICAgICBpZiAodmFsdWVzID09IG51bGwpCisgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gYXR0cnMuZ2V0KGF0dHJJZCk7CisgICAgICAgIGlmIChhdHRyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHZhbHVlcyk7CisgICAgICAgIE5hbWluZ0VudW1lcmF0aW9uIGUgPSBhdHRyLmdldEFsbCgpOworICAgICAgICB3aGlsZShlLmhhc01vcmUoKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZyllLm5leHQoKTsKKyAgICAgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhbnkgb3BlbiBjb25uZWN0aW9uIHRvIHRoZSBkaXJlY3Rvcnkgc2VydmVyIGZvciB0aGlzIFJlYWxtLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGRpcmVjdG9yeSBjb250ZXh0IHRvIGJlIGNsb3NlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlKERpckNvbnRleHQgY29udGV4dCkgeworCisgICAgICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gb3BlbmVkIGNvbm5lY3Rpb24KKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBDbG9zZSBvdXIgb3BlbmVkIGNvbm5lY3Rpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjb250YWluZXJMb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBjb250YWluZXJMb2cuZGVidWcoIkNsb3NpbmcgZGlyZWN0b3J5IGNvbnRleHQiKTsKKyAgICAgICAgICAgIGNvbnRleHQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lckxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImpuZGlSZWFsbS5jbG9zZSIpLCBlKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmNvbnRleHQgPSBudWxsOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzaG9ydCBuYW1lIGZvciB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJpbmNpcGFsJ3MgdXNlciBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFzc3dvcmQoU3RyaW5nIHVzZXJuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdXNlciBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmluY2lwYWwgZ2V0UHJpbmNpcGFsKFN0cmluZyB1c2VybmFtZSkgeworCisgICAgICAgIERpckNvbnRleHQgY29udGV4dCA9IG51bGw7CisgICAgICAgIFByaW5jaXBhbCBwcmluY2lwYWwgPSBudWxsOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSBkaXJlY3RvcnkgY29udGV4dCBhdmFpbGFibGUKKyAgICAgICAgICAgIGNvbnRleHQgPSBvcGVuKCk7CisKKyAgICAgICAgICAgIC8vIE9jY2Fzc2lvbmFsbHkgdGhlIGRpcmVjdG9yeSBjb250ZXh0IHdpbGwgdGltZW91dC4gIFRyeSBvbmUgbW9yZQorICAgICAgICAgICAgLy8gdGltZSBiZWZvcmUgZ2l2aW5nIHVwLgorICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIC8vIEF1dGhlbnRpY2F0ZSB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lIGlmIHBvc3NpYmxlCisgICAgICAgICAgICAgICAgcHJpbmNpcGFsID0gZ2V0UHJpbmNpcGFsKGNvbnRleHQsIHVzZXJuYW1lKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoQ29tbXVuaWNhdGlvbkV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgICAgICAvLyBsb2cgdGhlIGV4Y2VwdGlvbiBzbyB3ZSBrbm93IGl0J3MgdGhlcmUuCisgICAgICAgICAgICAgICAgY29udGFpbmVyTG9nLndhcm4oc20uZ2V0U3RyaW5nKCJqbmRpUmVhbG0uZXhjZXB0aW9uIiksIGUpOworCisgICAgICAgICAgICAgICAgLy8gY2xvc2UgdGhlIGNvbm5lY3Rpb24gc28gd2Uga25vdyBpdCB3aWxsIGJlIHJlb3BlbmVkLgorICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNsb3NlKGNvbnRleHQpOworCisgICAgICAgICAgICAgICAgLy8gb3BlbiBhIG5ldyBkaXJlY3RvcnkgY29udGV4dC4KKyAgICAgICAgICAgICAgICBjb250ZXh0ID0gb3BlbigpOworCisgICAgICAgICAgICAgICAgLy8gVHJ5IHRoZSBhdXRoZW50aWNhdGlvbiBhZ2Fpbi4KKyAgICAgICAgICAgICAgICBwcmluY2lwYWwgPSBnZXRQcmluY2lwYWwoY29udGV4dCwgdXNlcm5hbWUpOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gUmVsZWFzZSB0aGlzIGNvbnRleHQKKyAgICAgICAgICAgIHJlbGVhc2UoY29udGV4dCk7CisKKyAgICAgICAgICAgIC8vIFJldHVybiB0aGUgYXV0aGVudGljYXRlZCBQcmluY2lwYWwgKGlmIGFueSkKKyAgICAgICAgICAgIHJldHVybiAocHJpbmNpcGFsKTsKKworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAvLyBMb2cgdGhlIHByb2JsZW0gZm9yIHBvc3Rlcml0eQorICAgICAgICAgICAgY29udGFpbmVyTG9nLmVycm9yKHNtLmdldFN0cmluZygiam5kaVJlYWxtLmV4Y2VwdGlvbiIpLCBlKTsKKworICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGNvbm5lY3Rpb24gc28gdGhhdCBpdCBnZXRzIHJlb3BlbmVkIG5leHQgdGltZQorICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjbG9zZShjb250ZXh0KTsKKworICAgICAgICAgICAgLy8gUmV0dXJuICJub3QgYXV0aGVudGljYXRlZCIgZm9yIHRoaXMgcmVxdWVzdAorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB1c2VyIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBQcmluY2lwYWwgZ2V0UHJpbmNpcGFsKERpckNvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIFVzZXIgdXNlciA9IGdldFVzZXIoY29udGV4dCwgdXNlcm5hbWUpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljUHJpbmNpcGFsKHRoaXMsIHVzZXIudXNlcm5hbWUsIHVzZXIucGFzc3dvcmQgLAorICAgICAgICAgICAgICAgIGdldFJvbGVzKGNvbnRleHQsIHVzZXIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIChpZiBuZWNlc3NhcnkpIGFuZCByZXR1cm4gYSBjb25uZWN0aW9uIHRvIHRoZSBjb25maWd1cmVkCisgICAgICogZGlyZWN0b3J5IHNlcnZlciBmb3IgdGhpcyBSZWFsbS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgZGlyZWN0b3J5IHNlcnZlciBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlyQ29udGV4dCBvcGVuKCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRG8gbm90aGluZyBpZiB0aGVyZSBpcyBhIGRpcmVjdG9yeSBzZXJ2ZXIgY29ubmVjdGlvbiBhbHJlYWR5IG9wZW4KKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoY29udGV4dCk7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIGRpcmVjdG9yeSBjb250ZXh0IGF2YWlsYWJsZQorICAgICAgICAgICAgY29udGV4dCA9IG5ldyBJbml0aWFsRGlyQ29udGV4dChnZXREaXJlY3RvcnlDb250ZXh0RW52aXJvbm1lbnQoKSk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgY29ubmVjdGlvbkF0dGVtcHQgPSAxOworCisgICAgICAgICAgICAvLyBsb2cgdGhlIGZpcnN0IGV4Y2VwdGlvbi4KKyAgICAgICAgICAgIGNvbnRhaW5lckxvZy53YXJuKHNtLmdldFN0cmluZygiam5kaVJlYWxtLmV4Y2VwdGlvbiIpLCBlKTsKKworICAgICAgICAgICAgLy8gVHJ5IGNvbm5lY3RpbmcgdG8gdGhlIGFsdGVybmF0ZSB1cmwuCisgICAgICAgICAgICBjb250ZXh0ID0gbmV3IEluaXRpYWxEaXJDb250ZXh0KGdldERpcmVjdG9yeUNvbnRleHRFbnZpcm9ubWVudCgpKTsKKworICAgICAgICB9IGZpbmFsbHkgeworCisgICAgICAgICAgICAvLyByZXNldCBpdCBpbiBjYXNlIHRoZSBjb25uZWN0aW9uIHRpbWVzIG91dC4KKyAgICAgICAgICAgIC8vIHRoZSBwcmltYXJ5IG1heSBjb21lIGJhY2suCisgICAgICAgICAgICBjb25uZWN0aW9uQXR0ZW1wdCA9IDA7CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoY29udGV4dCk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgb3VyIGRpcmVjdG9yeSBjb250ZXh0IGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGphdmEudXRpbC5IYXNodGFibGUgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBkaXJlY3RvcnkgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldERpcmVjdG9yeUNvbnRleHRFbnZpcm9ubWVudCgpIHsKKworICAgICAgICBIYXNodGFibGUgZW52ID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgICAgIC8vIENvbmZpZ3VyZSBvdXIgZGlyZWN0b3J5IGNvbnRleHQgZW52aXJvbm1lbnQuCisgICAgICAgIGlmIChjb250YWluZXJMb2cuaXNEZWJ1Z0VuYWJsZWQoKSAmJiBjb25uZWN0aW9uQXR0ZW1wdCA9PSAwKQorICAgICAgICAgICAgY29udGFpbmVyTG9nLmRlYnVnKCJDb25uZWN0aW5nIHRvIFVSTCAiICsgY29ubmVjdGlvblVSTCk7CisgICAgICAgIGVsc2UgaWYgKGNvbnRhaW5lckxvZy5pc0RlYnVnRW5hYmxlZCgpICYmIGNvbm5lY3Rpb25BdHRlbXB0ID4gMCkKKyAgICAgICAgICAgIGNvbnRhaW5lckxvZy5kZWJ1ZygiQ29ubmVjdGluZyB0byBVUkwgIiArIGFsdGVybmF0ZVVSTCk7CisgICAgICAgIGVudi5wdXQoQ29udGV4dC5JTklUSUFMX0NPTlRFWFRfRkFDVE9SWSwgY29udGV4dEZhY3RvcnkpOworICAgICAgICBpZiAoY29ubmVjdGlvbk5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIGVudi5wdXQoQ29udGV4dC5TRUNVUklUWV9QUklOQ0lQQUwsIGNvbm5lY3Rpb25OYW1lKTsKKyAgICAgICAgaWYgKGNvbm5lY3Rpb25QYXNzd29yZCAhPSBudWxsKQorICAgICAgICAgICAgZW52LnB1dChDb250ZXh0LlNFQ1VSSVRZX0NSRURFTlRJQUxTLCBjb25uZWN0aW9uUGFzc3dvcmQpOworICAgICAgICBpZiAoY29ubmVjdGlvblVSTCAhPSBudWxsICYmIGNvbm5lY3Rpb25BdHRlbXB0ID09IDApCisgICAgICAgICAgICBlbnYucHV0KENvbnRleHQuUFJPVklERVJfVVJMLCBjb25uZWN0aW9uVVJMKTsKKyAgICAgICAgZWxzZSBpZiAoYWx0ZXJuYXRlVVJMICE9IG51bGwgJiYgY29ubmVjdGlvbkF0dGVtcHQgPiAwKQorICAgICAgICAgICAgZW52LnB1dChDb250ZXh0LlBST1ZJREVSX1VSTCwgYWx0ZXJuYXRlVVJMKTsKKyAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uICE9IG51bGwpCisgICAgICAgICAgICBlbnYucHV0KENvbnRleHQuU0VDVVJJVFlfQVVUSEVOVElDQVRJT04sIGF1dGhlbnRpY2F0aW9uKTsKKyAgICAgICAgaWYgKHByb3RvY29sICE9IG51bGwpCisgICAgICAgICAgICBlbnYucHV0KENvbnRleHQuU0VDVVJJVFlfUFJPVE9DT0wsIHByb3RvY29sKTsKKyAgICAgICAgaWYgKHJlZmVycmFscyAhPSBudWxsKQorICAgICAgICAgICAgZW52LnB1dChDb250ZXh0LlJFRkVSUkFMLCByZWZlcnJhbHMpOworICAgICAgICBpZiAoZGVyZWZBbGlhc2VzICE9IG51bGwpCisgICAgICAgICAgICBlbnYucHV0KEpORElSZWFsbS5ERVJFRl9BTElBU0VTLCBkZXJlZkFsaWFzZXMpOworCisgICAgICAgIHJldHVybiBlbnY7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbGVhc2Ugb3VyIHVzZSBvZiB0aGlzIGNvbm5lY3Rpb24gc28gdGhhdCBpdCBjYW4gYmUgcmVjeWNsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgZGlyZWN0b3J5IGNvbnRleHQgdG8gcmVsZWFzZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlbGVhc2UoRGlyQ29udGV4dCBjb250ZXh0KSB7CisKKyAgICAgICAgOyAvLyBOTy1PUCBzaW5jZSB3ZSBhcmUgbm90IHBvb2xpbmcgYW55dGhpbmcKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgQ29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgaXQgZnJvbSBiZWluZyBzdGFydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQZXJmb3JtIG5vcm1hbCBzdXBlcmNsYXNzIGluaXRpYWxpemF0aW9uCisgICAgICAgIHN1cGVyLnN0YXJ0KCk7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB3ZSBjYW4gb3BlbiBvdXIgY29ubmVjdGlvbgorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3BlbigpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbihzbS5nZXRTdHJpbmcoImpuZGlSZWFsbS5vcGVuIiksIGUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgc2h1dCBkb3duIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgQ29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUGVyZm9ybSBub3JtYWwgc3VwZXJjbGFzcyBmaW5hbGl6YXRpb24KKyAgICAgICAgc3VwZXIuc3RvcCgpOworCisgICAgICAgIC8vIENsb3NlIGFueSBvcGVuIGRpcmVjdG9yeSBzZXJ2ZXIgY29ubmVjdGlvbgorICAgICAgICBjbG9zZSh0aGlzLmNvbnRleHQpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBzdHJpbmcgY29udGFpbmluZyBMREFQIHBhdHRlcm5zIGZvciB1c2VyIGxvY2F0aW9ucyAoc2VwYXJhdGVkIGJ5CisgICAgICogcGFyZW50aGVzZXMgaW4gYSBwc2V1ZG8tTERBUCBzZWFyY2ggc3RyaW5nIGZvcm1hdCAtCisgICAgICogIihsb2NhdGlvbjEpKGxvY2F0aW9uMikiLCByZXR1cm5zIGFuIGFycmF5IG9mIHRob3NlIHBhdGhzLiAgUmVhbCBMREFQCisgICAgICogc2VhcmNoIHN0cmluZ3MgYXJlIHN1cHBvcnRlZCBhcyB3ZWxsICh0aG91Z2ggb25seSB0aGUgInwiICJPUiIgdHlwZSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlclBhdHRlcm5TdHJpbmcgLSBhIHN0cmluZyBMREFQIHNlYXJjaCBwYXRocyBzdXJyb3VuZGVkIGJ5CisgICAgICogcGFyZW50aGVzZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gcGFyc2VVc2VyUGF0dGVyblN0cmluZyhTdHJpbmcgdXNlclBhdHRlcm5TdHJpbmcpIHsKKworICAgICAgICBpZiAodXNlclBhdHRlcm5TdHJpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0IHBhdGhMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgaW50IHN0YXJ0UGFyZW5Mb2MgPSB1c2VyUGF0dGVyblN0cmluZy5pbmRleE9mKCcoJyk7CisgICAgICAgICAgICBpZiAoc3RhcnRQYXJlbkxvYyA9PSAtMSkgeworICAgICAgICAgICAgICAgIC8vIG5vIHBhcmVucyBoZXJlOyByZXR1cm4gd2hvbGUgdGhpbmcKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHt1c2VyUGF0dGVyblN0cmluZ307CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc3RhcnRpbmdQb2ludCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoc3RhcnRQYXJlbkxvYyA+IC0xKSB7CisgICAgICAgICAgICAgICAgaW50IGVuZFBhcmVuTG9jID0gMDsKKyAgICAgICAgICAgICAgICAvLyB3ZWVkIG91dCBlc2NhcGVkIG9wZW4gcGFyZW5zIGFuZCBwYXJlbnMgZW5jbG9zaW5nIHRoZQorICAgICAgICAgICAgICAgIC8vIHdob2xlIHN0YXRlbWVudCAoaW4gdGhlIGNhc2Ugb2YgdmFsaWQgTERBUCBzZWFyY2gKKyAgICAgICAgICAgICAgICAvLyBzdHJpbmdzOiAofChzb21ldGhpbmcpKHNvbWV0aGluZ2Vsc2UpKQorICAgICAgICAgICAgICAgIHdoaWxlICggKHVzZXJQYXR0ZXJuU3RyaW5nLmNoYXJBdChzdGFydFBhcmVuTG9jICsgMSkgPT0gJ3wnKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXJ0UGFyZW5Mb2MgIT0gMCAmJiB1c2VyUGF0dGVyblN0cmluZy5jaGFyQXQoc3RhcnRQYXJlbkxvYyAtIDEpID09ICdcXCcpICkgeworICAgICAgICAgICAgICAgICAgICBzdGFydFBhcmVuTG9jID0gdXNlclBhdHRlcm5TdHJpbmcuaW5kZXhPZigiKCIsIHN0YXJ0UGFyZW5Mb2MrMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVuZFBhcmVuTG9jID0gdXNlclBhdHRlcm5TdHJpbmcuaW5kZXhPZigiKSIsIHN0YXJ0UGFyZW5Mb2MrMSk7CisgICAgICAgICAgICAgICAgLy8gd2VlZCBvdXQgZXNjYXBlZCBlbmQtcGFyZW5zCisgICAgICAgICAgICAgICAgd2hpbGUgKHVzZXJQYXR0ZXJuU3RyaW5nLmNoYXJBdChlbmRQYXJlbkxvYyAtIDEpID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgICAgZW5kUGFyZW5Mb2MgPSB1c2VyUGF0dGVyblN0cmluZy5pbmRleE9mKCIpIiwgZW5kUGFyZW5Mb2MrMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBuZXh0UGF0aFBhcnQgPSB1c2VyUGF0dGVyblN0cmluZy5zdWJzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgKHN0YXJ0UGFyZW5Mb2MrMSwgZW5kUGFyZW5Mb2MpOworICAgICAgICAgICAgICAgIHBhdGhMaXN0LmFkZChuZXh0UGF0aFBhcnQpOworICAgICAgICAgICAgICAgIHN0YXJ0aW5nUG9pbnQgPSBlbmRQYXJlbkxvYysxOworICAgICAgICAgICAgICAgIHN0YXJ0UGFyZW5Mb2MgPSB1c2VyUGF0dGVyblN0cmluZy5pbmRleE9mKCcoJywgc3RhcnRpbmdQb2ludCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKFN0cmluZ1tdKXBhdGhMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tdIHt9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2l2ZW4gYW4gTERBUCBzZWFyY2ggc3RyaW5nLCByZXR1cm5zIHRoZSBzdHJpbmcgd2l0aCBjZXJ0YWluIGNoYXJhY3RlcnMKKyAgICAgKiBlc2NhcGVkIGFjY29yZGluZyB0byBSRkMgMjI1NCBndWlkZWxpbmVzLgorICAgICAqIFRoZSBjaGFyYWN0ZXIgbWFwcGluZyBpcyBhcyBmb2xsb3dzOgorICAgICAqICAgICBjaGFyIC0+ICBSZXBsYWNlbWVudAorICAgICAqICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqICAgICAqICAtPiBcMmEKKyAgICAgKiAgICAgKCAgLT4gXDI4CisgICAgICogICAgICkgIC0+IFwyOQorICAgICAqICAgICBcICAtPiBcNWMKKyAgICAgKiAgICAgXDAgLT4gXDAwCisgICAgICogQHBhcmFtIGluU3RyaW5nIHN0cmluZyB0byBlc2NhcGUgYWNjb3JkaW5nIHRvIFJGQyAyMjU0IGd1aWRlbGluZXMKKyAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgZXNjYXBlZC9lbmNvZGVkIHJlc3VsdAorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZG9SRkMyMjU0RW5jb2RpbmcoU3RyaW5nIGluU3RyaW5nKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKGluU3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpblN0cmluZy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBpblN0cmluZy5jaGFyQXQoaSk7CisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxcNWMiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnKic6CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxcMmEiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnKCc6CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxcMjgiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnKSc6CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxcMjkiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJcXDAwIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBDbGFzc2VzCisKKy8qKgorICogQSBwcml2YXRlIGNsYXNzIHJlcHJlc2VudGluZyBhIFVzZXIKKyAqLworY2xhc3MgVXNlciB7CisgICAgU3RyaW5nIHVzZXJuYW1lID0gbnVsbDsKKyAgICBTdHJpbmcgZG4gPSBudWxsOworICAgIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisgICAgQXJyYXlMaXN0IHJvbGVzID0gbnVsbDsKKworCisgICAgVXNlcihTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBkbiwgU3RyaW5nIHBhc3N3b3JkLCBBcnJheUxpc3Qgcm9sZXMpIHsKKyAgICAgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworICAgICAgICB0aGlzLmRuID0gZG47CisgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICAgICAgdGhpcy5yb2xlcyA9IHJvbGVzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmOTBmODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw3MiBAQAorIyAkSWQkCisKKyMgbGFuZ3VhZ2UKKworIyBwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0KKworamFhc1JlYWxtLmJlZ2luTG9naW49SkFBU1JlYWxtIGxvZ2luIHJlcXVlc3RlZCBmb3IgdXNlcm5hbWUgInswfSIgdXNpbmcgTG9naW5Db250ZXh0IGZvciBhcHBsaWNhdGlvbiAiezF9IgoramFhc1JlYWxtLmFjY291bnRFeHBpcmVkPVVzZXJuYW1lICJ7MH0iIE5PVCBhdXRoZW50aWNhdGVkIGR1ZSB0byBleHBpcmVkIGFjY291bnQKK2phYXNSZWFsbS5hdXRoZW50aWNhdGVGYWlsdXJlPVVzZXJuYW1lICJ7MH0iIE5PVCBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZAoramFhc1JlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9VXNlcm5hbWUgInswfSIgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQgYXMgUHJpbmNpcGFsICJ7MX0iIC0tIFN1YmplY3Qgd2FzIGNyZWF0ZWQgdG9vCitqYWFzUmVhbG0uY3JlZGVudGlhbEV4cGlyZWQ9VXNlcm5hbWUgInswfSIgTk9UIGF1dGhlbnRpY2F0ZWQgZHVlIHRvIGV4cGlyZWQgY3JlZGVudGlhbAoramFhc1JlYWxtLmZhaWxlZExvZ2luPVVzZXJuYW1lICJ7MH0iIE5PVCBhdXRoZW50aWNhdGVkIGR1ZSB0byBmYWlsZWQgbG9naW4KK2phYXNSZWFsbS5sb2dpbkV4Y2VwdGlvbj1Mb2dpbiBleGNlcHRpb24gYXV0aGVudGljYXRpbmcgdXNlcm5hbWUgInswfSIKK2phYXNSZWFsbS51bmV4cGVjdGVkRXJyb3I9VW5leHBlY3RlZCBlcnJvcgoramFhc1JlYWxtLmxvZ2luQ29udGV4dENyZWF0ZWQ9SkFBUyBMb2dpbkNvbnRleHQgY3JlYXRlZCBmb3IgdXNlcm5hbWUgInswfSIKK2phYXNSZWFsbS51c2VyUHJpbmNpcGFsU3VjY2Vzcz1TdWJqZWN0IGZvciB1c2VybmFtZSAiezB9IiByZXR1cm5lZCB1c2VyIFByaW5jaXBhbCAiezF9IgoramFhc1JlYWxtLnVzZXJQcmluY2lwYWxGYWlsdXJlPVN1YmplY3QgZm9yIHVzZXJuYW1lICJ7MH0iIGRpZCBub3QgcmV0dXJuIGEgdmFsaWQgdXNlciBQcmluY2lwYWwKK2phYXNSZWFsbS5jYWNoZVByaW5jaXBhbD1Vc2VyIFByaW5jaXBhbCAiezB9IiBjYWNoZWQ7IGhhcyB7MX0gcm9sZSBQcmluY2lwYWwocykKK2phYXNSZWFsbS5jaGVja1ByaW5jaXBhbD1DaGVja2luZyBQcmluY2lwYWwgInswfSIgW3sxfV0KK2phYXNSZWFsbS51c2VyUHJpbmNpcGFsU3VjY2Vzcz1QcmluY2lwYWwgInswfSIgaXMgYSB2YWxpZCB1c2VyIGNsYXNzLiBXZSB3aWxsIHVzZSB0aGlzIGFzIHRoZSB1c2VyIFByaW5jaXBhbC4KK2phYXNSZWFsbS51c2VyUHJpbmNpcGFsRmFpbHVyZT1ObyB2YWxpZCB1c2VyIFByaW5jaXBhbCBmb3VuZAoramFhc1JlYWxtLnJvbGVQcmluY2lwYWxBZGQ9QWRkaW5nIHJvbGUgUHJpbmNpcGFsICJ7MH0iIHRvIHRoaXMgdXNlciBQcmluY2lwYWwnJ3Mgcm9sZXMKK2phYXNSZWFsbS5yb2xlUHJpbmNpcGFsU3VjY2Vzcz17MH0gcm9sZSBQcmluY2lwYWwocykgZm91bmQKK2phYXNSZWFsbS5yb2xlUHJpbmNpcGFsRmFpbHVyZT1ObyB2YWxpZCByb2xlIFByaW5jaXBhbHMgZm91bmQuCitqYWFzUmVhbG0uaXNJblJvbGUuc3RhcnQ9Q2hlY2tpbmcgaWYgdXNlciBQcmluY2lwYWwgInswfSIgcG9zc2Vzc2VzIHJvbGUgInsxfSIKK2phYXNSZWFsbS5pc0luUm9sZS5ub1ByaW5jaXBhbE9yUm9sZT1ObyByb2xlcyBQcmluY2lwYWxzIGZvdW5kLiBVc2VyIFByaW5jaXBhbCBvciBTdWJqZWN0IGlzIG51bGwsIG9yIHVzZXIgUHJpbmNpcGFsIG5vdCBpbiBjYWNoZQoramFhc1JlYWxtLmlzSW5Sb2xlLnByaW5jaXBhbENhY2hlZD1Vc2VyIFByaW5jaXBhbCBoYXMgezB9IHJvbGUgUHJpbmNpcGFsKHMpCitqYWFzUmVhbG0uaXNJblJvbGUucG9zc2Vzc2VzUm9sZT1Vc2VyIFByaW5jaXBhbCBoYXMgYSByb2xlIFByaW5jaXBhbCBjYWxsZWQgInswfSIKK2phYXNSZWFsbS5pc0luUm9sZS5tYXRjaD1NYXRjaGluZyByb2xlIFByaW5jaXBhbCBmb3VuZC4KK2phYXNSZWFsbS5pc0luUm9sZS5ub01hdGNoPU1hdGNoaW5nIHJvbGUgUHJpbmNpcGFsIE5PVCBmb3VuZC4KK2phYXNDYWxsYmFjay5kaWdlc3RwYXNzd29yZD1EaWdlc3RlZCBwYXNzd29yZCAiezB9IiBhcyAiezF9IgoramFhc0NhbGxiYWNrLnVzZXJuYW1lPVJldHVybmVkIHVzZXJuYW1lICJ7MH0iCitqYWFzQ2FsbGJhY2sucGFzc3dvcmQ9UmV0dXJuZWQgcGFzc3dvcmQgInswfSIKK2pkYmNSZWFsbS5hdXRoZW50aWNhdGVGYWlsdXJlPVVzZXJuYW1lIHswfSBOT1Qgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQKK2pkYmNSZWFsbS5hdXRoZW50aWNhdGVTdWNjZXNzPVVzZXJuYW1lIHswfSBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZAoramRiY1JlYWxtLmNsb3NlPUV4Y2VwdGlvbiBjbG9zaW5nIGRhdGFiYXNlIGNvbm5lY3Rpb24KK2pkYmNSZWFsbS5leGNlcHRpb249RXhjZXB0aW9uIHBlcmZvcm1pbmcgYXV0aGVudGljYXRpb24KK2pkYmNSZWFsbS5nZXRQYXNzd29yZC5leGNlcHRpb249RXhjZXB0aW9uIHJldHJpZXZpbmcgcGFzc3dvcmQgZm9yICJ7MH0iCitqZGJjUmVhbG0uZ2V0Um9sZXMuZXhjZXB0aW9uPUV4Y2VwdGlvbiByZXRyaWV2aW5nIHJvbGVzIGZvciAiezB9IgoramRiY1JlYWxtLm9wZW49RXhjZXB0aW9uIG9wZW5pbmcgZGF0YWJhc2UgY29ubmVjdGlvbgoram5kaVJlYWxtLmF1dGhlbnRpY2F0ZUZhaWx1cmU9VXNlcm5hbWUgezB9IE5PVCBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZAoram5kaVJlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9VXNlcm5hbWUgezB9IHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkCitqbmRpUmVhbG0uY2xvc2U9RXhjZXB0aW9uIGNsb3NpbmcgZGlyZWN0b3J5IHNlcnZlciBjb25uZWN0aW9uCitqbmRpUmVhbG0uZXhjZXB0aW9uPUV4Y2VwdGlvbiBwZXJmb3JtaW5nIGF1dGhlbnRpY2F0aW9uCitqbmRpUmVhbG0ub3Blbj1FeGNlcHRpb24gb3BlbmluZyBkaXJlY3Rvcnkgc2VydmVyIGNvbm5lY3Rpb24KK21lbW9yeVJlYWxtLmF1dGhlbnRpY2F0ZUZhaWx1cmU9VXNlcm5hbWUgezB9IE5PVCBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZAorbWVtb3J5UmVhbG0uYXV0aGVudGljYXRlU3VjY2Vzcz1Vc2VybmFtZSB7MH0gc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQKK21lbW9yeVJlYWxtLmxvYWRFeGlzdD1NZW1vcnkgZGF0YWJhc2UgZmlsZSB7MH0gY2Fubm90IGJlIHJlYWQKK21lbW9yeVJlYWxtLmxvYWRQYXRoPUxvYWRpbmcgdXNlcnMgZnJvbSBtZW1vcnkgZGF0YWJhc2UgZmlsZSB7MH0KK21lbW9yeVJlYWxtLnJlYWRYbWw9RXhjZXB0aW9uIHdoaWxlIHJlYWRpbmcgbWVtb3J5IGRhdGFiYXNlIGZpbGUKK3JlYWxtQmFzZS5hbGdvcml0aG09SW52YWxpZCBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gezB9IHNwZWNpZmllZAorcmVhbG1CYXNlLmFscmVhZHlTdGFydGVkPVRoaXMgUmVhbG0gaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCityZWFsbUJhc2UuZGlnZXN0PUVycm9yIGRpZ2VzdGluZyB1c2VyIGNyZWRlbnRpYWxzCityZWFsbUJhc2UuZm9yYmlkZGVuPUFjY2VzcyB0byB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGhhcyBiZWVuIGRlbmllZAorcmVhbG1CYXNlLmhhc1JvbGVGYWlsdXJlPVVzZXJuYW1lIHswfSBkb2VzIE5PVCBoYXZlIHJvbGUgezF9CityZWFsbUJhc2UuaGFzUm9sZVN1Y2Nlc3M9VXNlcm5hbWUgezB9IGhhcyByb2xlIHsxfQorcmVhbG1CYXNlLm5vdEF1dGhlbnRpY2F0ZWQ9Q29uZmlndXJhdGlvbiBlcnJvcjogIENhbm5vdCBwZXJmb3JtIGFjY2VzcyBjb250cm9sIHdpdGhvdXQgYW4gYXV0aGVudGljYXRlZCBwcmluY2lwYWwKK3JlYWxtQmFzZS5ub3RTdGFydGVkPVRoaXMgUmVhbG0gaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCityZWFsbUJhc2UuYXV0aGVudGljYXRlRmFpbHVyZT1Vc2VybmFtZSB7MH0gTk9UIHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkCityZWFsbUJhc2UuYXV0aGVudGljYXRlU3VjY2Vzcz1Vc2VybmFtZSB7MH0gc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQKK3VzZXJEYXRhYmFzZVJlYWxtLmF1dGhlbnRpY2F0ZUVycm9yPUxvZ2luIGNvbmZpZ3VyYXRpb24gZXJyb3IgYXV0aGVudGljYXRpbmcgdXNlcm5hbWUgezB9Cit1c2VyRGF0YWJhc2VSZWFsbS5sb29rdXA9RXhjZXB0aW9uIGxvb2tpbmcgdXAgVXNlckRhdGFiYXNlIHVuZGVyIGtleSB7MH0KK3VzZXJEYXRhYmFzZVJlYWxtLm5vRGF0YWJhc2U9Tm8gVXNlckRhdGFiYXNlIGNvbXBvbmVudCBmb3VuZCB1bmRlciBrZXkgezB9Cit1c2VyRGF0YWJhc2VSZWFsbS5ub0VuZ2luZT1ObyBFbmdpbmUgY29tcG9uZW50IGZvdW5kIGluIGNvbnRhaW5lciBoaWVyYXJjaHkKK3VzZXJEYXRhYmFzZVJlYWxtLm5vR2xvYmFsPU5vIGdsb2JhbCBKTkRJIHJlc291cmNlcyBjb250ZXh0IGZvdW5kCitkYXRhU291cmNlUmVhbG0uYXV0aGVudGljYXRlRmFpbHVyZT1Vc2VybmFtZSB7MH0gTk9UIHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkCitkYXRhU291cmNlUmVhbG0uYXV0aGVudGljYXRlU3VjY2Vzcz1Vc2VybmFtZSB7MH0gc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQKK2RhdGFTb3VyY2VSZWFsbS5jbG9zZT1FeGNlcHRpb24gY2xvc2luZyBkYXRhYmFzZSBjb25uZWN0aW9uCitkYXRhU291cmNlUmVhbG0uZXhjZXB0aW9uPUV4Y2VwdGlvbiBwZXJmb3JtaW5nIGF1dGhlbnRpY2F0aW9uCitkYXRhU291cmNlUmVhbG0uZ2V0UGFzc3dvcmQuZXhjZXB0aW9uPUV4Y2VwdGlvbiByZXRyaWV2aW5nIHBhc3N3b3JkIGZvciAiezB9IgorZGF0YVNvdXJjZVJlYWxtLmdldFJvbGVzLmV4Y2VwdGlvbj1FeGNlcHRpb24gcmV0cmlldmluZyByb2xlcyBmb3IgInswfSIKK2RhdGFTb3VyY2VSZWFsbS5vcGVuPUV4Y2VwdGlvbiBvcGVuaW5nIGRhdGFiYXNlIGNvbm5lY3Rpb24KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDVmMzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDcgQEAKKyMgJElkJAorCisjIGxhbmd1YWdlIGVzCisKKyMgcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtCisKK2phYXNSZWFsbS5hY2NvdW50RXhwaXJlZD1FbCB1c3VhcmlvIHswfSBOTyBoYSBzaWRvIGF1dGVudGlmaWNhZG8gcG9ycXVlIGhhIGV4cGlyYWRvIHN1IGN1ZW50YQoramFhc1JlYWxtLmF1dGhlbnRpY2F0ZWRTdWNjZXNzPUVsIHVzdWFyaW8gezB9IGhhIHNpZG8gYXV0ZW50aWZpY2FkbyBjb24g6XhpdG8KK2phYXNSZWFsbS5jcmVkZW50aWFsRXhwaXJlZD1FbCB1c3VhcmlvIHswfSBOTyBoYSBzaWRvIGF1dGVudGlmaWNhZG8gcG9ycXVlIGhhIGV4cGlyYWRvIHN1IGNyZWRlbmNpYWwKK2phYXNSZWFsbS5mYWlsZWRMb2dpbj1FbCB1c3VhcmlvIHswfSBOTyBoYSBzaWRvIGF1dGVudGlmaWNhZG8gcG9ycXVlIGhhIGZhbGxhZG8gZWwgbG9naW4KK2phYXNSZWFsbS5sb2dpbkV4Y2VwdGlvbj1FeGNlcGNp824gZGUgTG9naW4gYXV0ZW50aWNhbmRvIG5vbWJyZSBkZSB1c3VhcmlvIHswfQoramFhc1JlYWxtLnVuZXhwZWN0ZWRFcnJvcj1FcnJvciBpbmVzcGVyYWRvCitqZGJjUmVhbG0uYXV0aGVudGljYXRlRmFpbHVyZT1FbCB1c3VhcmlvIHswfSBOTyBoYSBzaWRvIGF1dGVudGlmaWNhZG8gY29ycmVjdGFtZW50ZQoramRiY1JlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9RWwgdXN1YXJpbyB7MH0gaGEgc2lkbyBhdXRlbnRpZmljYWRvIGNvcnJlY3RhbWVudGUKK2pkYmNSZWFsbS5jbG9zZT1FeGNlcGNp824gYWwgY2VycmFyIGxhIGNvbmV4afNuIGEgbGEgYmFzZSBkZSBkYXRvcworamRiY1JlYWxtLmV4Y2VwdGlvbj1FeGNlcGNp824gYWwgcmVhbGl6YXIgbGEgYXV0ZW50aWZpY2FjafNuCitqZGJjUmVhbG0ub3Blbj1FeGNlcGNp824gYWJyaWVuZG8gbGEgY29uZXhp824gYSBsYSBiYXNlIGRlIGRhdG9zCitqbmRpUmVhbG0uYXV0aGVudGljYXRlRmFpbHVyZT1BdXRlbnRpZmljYWNp824gZmFsbGlkYSBwYXJhIGVsIHVzdWFyaW8gezB9CitqbmRpUmVhbG0uYXV0aGVudGljYXRlU3VjY2Vzcz1BdXRlbnRpZmljYWNp824gY29ycmVjdGEgcGFyYSBlbCB1c3VhcmlvIHswfQoram5kaVJlYWxtLmNsb3NlPUV4Y2VwY2nzbiBhbCBjZXJyYXIgbGEgY29uZXhp824gYWwgc2Vydmlkb3IgZGUgZGlyZWN0b3Jpbworam5kaVJlYWxtLmV4Y2VwdGlvbj1FeGNlcGNp824gYWwgcmVhbGl6YXIgbGEgYXV0ZW50aWZpY2FjafNuCitqbmRpUmVhbG0ub3Blbj1FeGNlcGNp824gYWwgYWJyaXIgbGEgY29uZXhp824gYWwgc2Vydmlkb3IgZGUgZGlyZWN0b3JpbworbWVtb3J5UmVhbG0uYXV0aGVudGljYXRlRmFpbHVyZT1BdXRlbnRpZmljYWNp824gZmFsbGlkYSBwYXJhIGVsIHVzdWFyaW8gezB9CittZW1vcnlSZWFsbS5hdXRoZW50aWNhdGVTdWNjZXNzPUF1dGVudGlmaWNhY2nzbiBjb3JyZWN0YSBwYXJhIGVsIHVzdWFyaW8gezB9CittZW1vcnlSZWFsbS5sb2FkRXhpc3Q9RWwgZmljaGVybyBkZSB1c3VhcmlvcyB7MH0gbm8gaGEgcG9kaWRvIHNlciBsZe1kbworbWVtb3J5UmVhbG0ubG9hZFBhdGg9Q2FyZ2FuZG8gbG9zIHVzdWFyaW9zIGRlc2RlIGVsIGZpY2hlcm8gezB9CittZW1vcnlSZWFsbS5yZWFkWG1sPUV4Y2VwY2nzbiBtaWVudHJhcyBzZSBsZe1hIGVsIGZpY2hlcm8gZGUgdXN1YXJpb3MKK3JlYWxtQmFzZS5hbGdvcml0aG09RWwgYWxnb3JpdG1vIHJlc3VtZW4gKGRpZ2VzdCkgezB9IGVzIGluduFsaWRvCityZWFsbUJhc2UuYWxyZWFkeVN0YXJ0ZWQ9RXN0ZSBkb21pbmlvIHlhIGhhIHNpZG8gaW5pY2lhbGl6YWRvCityZWFsbUJhc2UuZGlnZXN0PUVycm9yIHByb2Nlc2FuZG8gbGFzIGNyZWRlbmNpYWxlcyBkZWwgdXN1YXJpbworcmVhbG1CYXNlLmZvcmJpZGRlbj1FbCBhY2Nlc28gYWwgcmVjdXJzbyBwZWRpZG8gaGEgc2lkbyBkZW5lZ2FkbworcmVhbG1CYXNlLmhhc1JvbGVGYWlsdXJlPUVsIHVzdWFyaW8gezB9IE5PIGRlc2VtcGXxYSBlbCBwYXBlbCBkZSB7MX0KK3JlYWxtQmFzZS5oYXNSb2xlU3VjY2Vzcz1FbCB1c3VhcmlvIHswfSBkZXNlbXBl8WEgZWwgcGFwZWwgZGUgezF9CityZWFsbUJhc2Uubm90QXV0aGVudGljYXRlZD1FcnJvciBkZSBDb25maWd1cmFjafNuOiBObyBzZSBwdWVkZW4gcmVhbGl6YXIgZnVuY2lvbmVzIGRlIGNvbnRyb2wgZGUgYWNjZXNvIHNpbiB1biBwcmluY2lwYWwgYXV0ZW50aWZpY2FkbworcmVhbG1CYXNlLm5vdFN0YXJ0ZWQ9RXN0ZSBkb21pbmlvIGH6biBubyBoYSBzaWRvIGluaWNpYWxpemFkbworcmVhbG1CYXNlLmF1dGhlbnRpY2F0ZUZhaWx1cmU9Tm9tYnJlIGRlIHVzdWFyaW8gezB9IE5PIGF1dGVudGljYWRvIGNvbiDpeGl0bworcmVhbG1CYXNlLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9Tm9tYnJlIGRlIHVzdWFyaW8gezB9IGF1dGVudGljYWRvIGNvbiDpeGl0bwordXNlckRhdGFiYXNlUmVhbG0uYXV0aGVudGljYXRlRXJyb3I9RXJyb3IgZGUgY29uZmlndXJhY2nzbiBkZSBMb2dpbiBhdXRlbnRpY2FuZG8gbm9tYnJlIGRlIHVzdWFyaW8gezB9Cit1c2VyRGF0YWJhc2VSZWFsbS5sb29rdXA9RXhjZXBjafNuIGJ1c2NhbmRvIGVuIEJhc2UgZGUgZGF0b3MgZGUgVXN1YXJpbyBtZWRpYW50ZSBsYSBjbGF2ZSB7MH0KK3VzZXJEYXRhYmFzZVJlYWxtLm5vRGF0YWJhc2U9Tm8gc2UgaGEgaGFsbGFkbyBjb21wb25lbnRlIGRlIEJhc2UgZGUgZGF0b3MgZGUgVXN1YXJpbyBtZWRpYW50ZSBsYSBjbGF2ZSB7MH0KK3VzZXJEYXRhYmFzZVJlYWxtLm5vRW5naW5lPU5vIHNlIGhhIGhhbGxhZG8gY29tcG9uZW50ZSBkZSBNb3RvciBlbiBqZXJhcnF17WEgZGUgY29udGVuZWRvcgordXNlckRhdGFiYXNlUmVhbG0ubm9HbG9iYWw9Tm8gc2UgaGEgaGFsbGFkbyBjb250ZXh0byBkZSByZWN1cnNvcyBnbG9iYWxlcyBKTkRJCitkYXRhU291cmNlUmVhbG0uYXV0aGVudGljYXRlRmFpbHVyZT1Ob21icmUgZGUgdXN1YXJpbyB7MH0gTk8gYXV0ZW50aWNhZG8gY29uIOl4aXRvCitkYXRhU291cmNlUmVhbG0uYXV0aGVudGljYXRlU3VjY2Vzcz1Ob21icmUgZGUgdXN1YXJpbyB7MH0gYXV0ZW50aWNhZG8gY29uIOl4aXRvCitkYXRhU291cmNlUmVhbG0uY2xvc2U9RXhjZXBjafNuIGNlcnJhbmRvIGNvbmV4afNuIGEgYmFzZSBkZSBkYXRvcworZGF0YVNvdXJjZVJlYWxtLmV4Y2VwdGlvbj1FeGNlcGNp824gcmVhbGl6YW5kbyBhdXRlbnRpY2FjafNuCitkYXRhU291cmNlUmVhbG0ub3Blbj1FeGNlcGNp824gYWJyaWVuZG8gY29uZXhp824gYSBiYXNlIGRlIGRhdG9zCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZiM2JhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpAQCAtMCwwICsxLDQxIEBACisjICRJZCQKKworIyBsYW5ndWFnZQorCisjIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbQorCitqYWFzUmVhbG0uYWNjb3VudEV4cGlyZWQ9bGUgbm9tIGQnJ3V0aWxpc2F0ZXVyIHswfSBOJydBIFBBUyDpdOkgYXV0aGVudGlmaekgY2FyIGxlIGNvbXB0ZSBhIGV4cGly6QoramFhc1JlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9bGUgbm9tIGQnJ3V0aWxpc2F0ZXVyIHswfSBhIOl06SBhdXRoZW50aWZp6SBhdmVjIHN1Y2PocworamFhc1JlYWxtLmNyZWRlbnRpYWxFeHBpcmVkPWxlIG5vbSBkJyd1dGlsaXNhdGV1ciB7MH0gTicnQSBQQVMg6XTpIGF1dGhlbnRpZmnpIGNhciBzb24gY3LpZGl0IGEgZXhwaXLpIChleHBpcmVkIGNyZWRlbnRpYWwpCitqYWFzUmVhbG0uZmFpbGVkTG9naW49bGUgbm9tIGQnJ3V0aWxpc2F0ZXVyIHswfSBOJydBIFBBUyDpdOkgYXV0aGVudGlmaekgY2FyIHNvbiBjb250cvRsZSBkJydhY2PocyAobG9naW4pIGEg6WNob3XpCitqYWFzUmVhbG0ubG9naW5FeGNlcHRpb249RXhjZXB0aW9uIGxvcnMgZGUgbCcnYXV0aGVudGlmaWNhdGlvbiBwYXIgbG9naW4gZHUgbm9tIGQnJ3V0aWxpc2F0ZXVyIHswfQoramRiY1JlYWxtLmF1dGhlbnRpY2F0ZUZhaWx1cmU9bGUgbm9tIGQnJ3V0aWxpc2F0ZXVyIHswfSBOJydBIFBBUyDpdOkgYXV0aGVudGlmaekKK2pkYmNSZWFsbS5hdXRoZW50aWNhdGVTdWNjZXNzPWxlIG5vbSBkJyd1dGlsaXNhdGV1ciB7MH0gYSDpdOkgYXV0aGVudGlmaekgYXZlYyBzdWNj6HMKK2pkYmNSZWFsbS5jbG9zZT1FeGNlcHRpb24gbG9ycyBkZSBsYSBmZXJtZXR1cmUgZGUgbGEgY29ubmV4aW9uIOAgbGEgYmFzZSBkZSBkb25u6WVzCitqZGJjUmVhbG0uZXhjZXB0aW9uPUV4Y2VwdGlvbiBwZW5kYW50IGxlIHRyYWl0ZW1lbnQgZGUgbCcnYXV0aGVudGlmaWNhdGlvbgoramRiY1JlYWxtLm9wZW49RXhjZXB0aW9uIGxvcnMgZGUgbCcnb3V2ZXJ0dXJlIGRlIGxhIGJhc2UgZGUgZG9ubullcworam5kaVJlYWxtLmF1dGhlbnRpY2F0ZUZhaWx1cmU9TGUgbm9tIGQnJ3V0aWxpc2F0ZXVyIHswfSBOJydBIFBBUyDpdOkgYXV0aGVudGlmaekKK2puZGlSZWFsbS5hdXRoZW50aWNhdGVTdWNjZXNzPUxlIG5vbSBkJyd1dGlsaXNhdGV1ciB7MH0gYSDpdOkgYXV0aGVudGlmaekgYXZlYyBzdWNj6HMKK2puZGlSZWFsbS5jbG9zZT1FeGNlcHRpb24gbG9ycyBkZSBsYSBmZXJtZXR1cmUgZGUgbGEgY29ubmV4aW9uIGF1IHNlcnZldXIgZCcnYWNj6HMgKGRpcmVjdG9yeSBzZXJ2ZXIpCitqbmRpUmVhbG0uZXhjZXB0aW9uPUV4Y2VwdGlvbiBwZW5kYW50IGxlIHRyYWl0ZW1lbnQgZGUgbCcnYXV0aGVudGlmaWNhdGlvbgoram5kaVJlYWxtLm9wZW49RXhjZXB0aW9uIGxvcnMgZGUgbCcnb3V2ZXJ0dXJlIGRlIGxhIGNvbm5leGlvbiBhdSBzZXJ2ZXVyIGQnJ2FjY+hzIChkaXJlY3Rvcnkgc2VydmVyKQorbWVtb3J5UmVhbG0uYXV0aGVudGljYXRlRmFpbHVyZT1sZSBub20gZCcndXRpbGlzYXRldXIgezB9IE4nJ0EgUEFTIOl06SBhdXRoZW50aWZp6QorbWVtb3J5UmVhbG0uYXV0aGVudGljYXRlU3VjY2Vzcz1sZSBub20gZCcndXRpbGlzYXRldXIgezB9IGEg6XTpIGF1dGhlbnRpZmnpIGF2ZWMgc3VjY+hzCittZW1vcnlSZWFsbS5sb2FkRXhpc3Q9TGUgZmljaGllciBiYXNlIGRlIGRvbm7pZXMgbeltb2lyZSAobWVtb3J5IGRhdGFiYXNlKSB7MH0gbmUgcGV1dCDqdHJlIGx1CittZW1vcnlSZWFsbS5sb2FkUGF0aD1DaGFyZ2VtZW50IGRlcyB1dGlsaXNhdGV1cnMgZGVwdWlzIGxlIGZpY2hpZXIgYmFzZSBkZSBkb25u6WVzIG3pbW9pcmUgKG1lbW9yeSBkYXRhYmFzZSkgezB9CittZW1vcnlSZWFsbS5yZWFkWG1sPUV4Y2VwdGlvbiBsb3JzIGRlIGxhIGxlY3R1cmUgZHUgZmljaGllciBiYXNlIGRlIGRvbm7pZXMgbeltb2lyZSAobWVtb3J5IGRhdGFiYXNlKQorcmVhbG1CYXNlLmFsZ29yaXRobT1MJydhbGdvcml0aG1lIGQnJ2VtcHJlaW50ZSBkZSBtZXNzYWdlIChtZXNzYWdlIGRpZ2VzdCkgezB9IGluZGlxdekgZXN0IGludmFsaWRlCityZWFsbUJhc2UuYWxyZWFkeVN0YXJ0ZWQ9Q2Ugcm95YXVtZSAoUmVhbG0pIGEgZOlq4CDpdOkgZOltYXJy6QorcmVhbG1CYXNlLmRpZ2VzdD1FcnJldXIgbG9ycyBkdSB0cmFpdGVtZW50IGRlcyBlbXByZWludGVzIChkaWdlc3QpIGRlcyBjculkaXRzIHV0aWxpc2F0ZXVyICh1c2VyIGNyZWRlbnRpYWxzKQorcmVhbG1CYXNlLmZvcmJpZGRlbj1MJydhY2PocyDgIGxhIHJlc3NvdXJjZSBkZW1hbmTpZSBhIOl06SBpbnRlcmRpdAorcmVhbG1CYXNlLmhhc1JvbGVGYWlsdXJlPUxlIG5vbSBkJyd1dGlsaXNhdGV1ciB7MH0gTicnQSBQQVMgZGUgcvRsZSB7MX0KK3JlYWxtQmFzZS5oYXNSb2xlU3VjY2Vzcz1MZSBub20gZCcndXRpbGlzYXRldXIgezB9IGEgcG91ciBy9GxlIHsxfQorcmVhbG1CYXNlLm5vdEF1dGhlbnRpY2F0ZWQ9RXJyZXVyIGRlIGNvbmZpZ3VyYXRpb246ICBJbXBvc3NpYmxlIGRlIGNvbmR1aXJlIHVuIGNvbnRy9GxlIGQnJ2FjY+hzIHNhbnMgdW4gYXV0aGVudGlmaekgcHJpbmNpcGFsIChhdXRoZW50aWNhdGVkIHByaW5jaXBhbCkKK3JlYWxtQmFzZS5ub3RTdGFydGVkPUNlIHJveWF1bWUgKFJlYWxtKSBuJydhIHBhcyBlbmNvcmUg6XTpIGTpbWFycukKK3JlYWxtQmFzZS5hdXRoZW50aWNhdGVGYWlsdXJlPUxlIG5vbSBkJyd1dGlsaXNhdGV1ciB7MH0gTicnQSBQQVMg6XTpIGF1dGhlbnRpZmnpCityZWFsbUJhc2UuYXV0aGVudGljYXRlU3VjY2Vzcz1MZSBub20gZCcndXRpbGlzYXRldXIgezB9IGEg6XTpIGF1dGhlbnRpZmnpIGF2ZWMgc3VjY+hzCit1c2VyRGF0YWJhc2VSZWFsbS5hdXRoZW50aWNhdGVFcnJvcj1FcnJldXIgZGUgY29uZmlndXJhdGlvbiBkdSBjb250cvRsZSBkJydhY2PocyAobG9naW4pIGxvcnMgZGUgbCcnYXV0aGVudGlmaWNhdGlvbiBkdSBub20gZCcndXRpbGlzYXRldXIgezB9Cit1c2VyRGF0YWJhc2VSZWFsbS5sb29rdXA9RXhjZXB0aW9uIGxvcnMgZGUgbGEgcmVjaGVyY2hlIGRhbnMgbGEgYmFzZSBkZSBkb25u6WVzIHV0aWxpc2F0ZXVycyBhdmVjIGxhIGNsZWYgezB9Cit1c2VyRGF0YWJhc2VSZWFsbS5ub0RhdGFiYXNlPUF1Y3VuIGNvbXBvc2FudCBiYXNlIGRlIGRvbm7pZXMgdXRpbGlzYXRldXJzIHRyb3V26SBwb3VyIGxhIGNsZWYgezB9Cit1c2VyRGF0YWJhc2VSZWFsbS5ub0VuZ2luZT1BdWN1biBjb21wb3NhbnQgbW90ZXVyIChlbmdpbmUgY29tcG9uZW50KSB0cm91dukgZGFucyBsYSBoaelyYXJjaGllIGRlcyBjb250ZW5ldXJzCit1c2VyRGF0YWJhc2VSZWFsbS5ub0dsb2JhbD1BdWN1bmUgcmVzc291cmNlIGdsb2JhbGUgSk5ESSB0cm91dullCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjZjIwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpAQCAtMCwwICsxLDQ3IEBACisjICRJZCQKKworIyBsYW5ndWFnZSBqYQorCisjIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbQorCitqYWFzUmVhbG0uYWNjb3VudEV4cGlyZWQ9XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkIHswfSBcdTMwNmZcdTMwYTJcdTMwYWJcdTMwYTZcdTMwZjNcdTMwYzhcdTMwNmVcdTY3MWZcdTk2NTBcdTMwNGNcdTUyMDdcdTMwOGNcdTMwNjZcdTMwNDRcdTMwOGJcdTMwNWZcdTMwODFcdTMwNmJcdThhOGRcdThhM2NcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTMKK2phYXNSZWFsbS5hdXRoZW50aWNhdGVTdWNjZXNzPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZCB7MH0gXHUzMDZmXHU4YThkXHU4YTNjXHUzMDZiXHU2MjEwXHU1MjlmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitqYWFzUmVhbG0uY3JlZGVudGlhbEV4cGlyZWQ9XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkIHswfSBcdTMwNmZcdThhM2NcdTY2MGVcdTY2ZjhcdTMwNmVcdTY3MWZcdTk2NTBcdTMwNGNcdTUyMDdcdTMwOGNcdTMwNWZcdTMwNWZcdTMwODFcdTMwNmJcdThhOGRcdThhM2NcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTMKK2phYXNSZWFsbS5mYWlsZWRMb2dpbj1cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGQgezB9IFx1MzA2Zlx1MzBlZFx1MzBiMFx1MzBhNFx1MzBmM1x1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA1Zlx1MzA1Zlx1MzA4MVx1MzA2Ylx1OGE4ZFx1OGEzY1x1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1ZgoramFhc1JlYWxtLmxvZ2luRXhjZXB0aW9uPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZCB7MH0gXHUzMDZlXHU4YThkXHU4YTNjXHU0ZTJkXHUzMDZiXHUzMGVkXHUzMGIwXHUzMGE0XHUzMGYzXHU0ZjhiXHU1OTE2XHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitqYWFzUmVhbG0udW5leHBlY3RlZEVycm9yPVx1NGU4OFx1NmUyY1x1MzA1N1x1MzA2YVx1MzA0NFx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OQoramRiY1JlYWxtLmF1dGhlbnRpY2F0ZUZhaWx1cmU9XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkIHswfSBcdTMwNmZcdThhOGRcdThhM2NcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2pkYmNSZWFsbS5hdXRoZW50aWNhdGVTdWNjZXNzPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZCB7MH0gXHUzMDZmXHU4YThkXHU4YTNjXHUzMDZiXHU2MjEwXHU1MjlmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitqZGJjUmVhbG0uY2xvc2U9XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHU2M2E1XHU3ZDlhXHUzMGFmXHUzMGVkXHUzMGZjXHUzMGJhXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitqZGJjUmVhbG0uZXhjZXB0aW9uPVx1OGE4ZFx1OGEzY1x1NWI5Zlx1ODg0Y1x1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQoramRiY1JlYWxtLm9wZW49XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHU2M2E1XHU3ZDlhXHUzMGFhXHUzMGZjXHUzMGQ3XHUzMGYzXHU0ZTJkXHUzMDZiXHU0ZjhiXHU1OTE2XHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitqbmRpUmVhbG0uYXV0aGVudGljYXRlRmFpbHVyZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGQgezB9IFx1MzA2Zlx1OGE4ZFx1OGEzY1x1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zgoram5kaVJlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkIHswfSBcdTMwNmZcdThhOGRcdThhM2NcdTMwNmJcdTYyMTBcdTUyOWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2puZGlSZWFsbS5jbG9zZT1cdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwYjVcdTMwZmNcdTMwZDBcdTYzYTVcdTdkOWFcdTMwYWZcdTMwZWRcdTMwZmNcdTMwYmFcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK2puZGlSZWFsbS5leGNlcHRpb249XHU4YThkXHU4YTNjXHU1YjlmXHU4ODRjXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitqbmRpUmVhbG0ub3Blbj1cdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwYjVcdTMwZmNcdTMwZDBcdTYzYTVcdTdkOWFcdTMwYWFcdTMwZmNcdTMwZDdcdTMwZjNcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK21lbW9yeVJlYWxtLmF1dGhlbnRpY2F0ZUZhaWx1cmU9XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkIHswfSBcdTMwNmZcdThhOGRcdThhM2NcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK21lbW9yeVJlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkIHswfSBcdTMwNmZcdThhOGRcdThhM2NcdTMwNmJcdTYyMTBcdTUyOWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK21lbW9yeVJlYWxtLmxvYWRFeGlzdD1cdTMwZTFcdTMwZTJcdTMwZWFcdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgezB9IFx1MzA5Mlx1OGFhZFx1MzA4MFx1MzA1M1x1MzA2OFx1MzA0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworbWVtb3J5UmVhbG0ubG9hZFBhdGg9XHUzMGUxXHUzMGUyXHUzMGVhXHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViIHswfSBcdTMwNGJcdTMwODlcdTMwZTZcdTMwZmNcdTMwYjZcdTMwOTJcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNTdcdTMwN2VcdTMwNTkKK21lbW9yeVJlYWxtLnJlYWRYbWw9XHUzMGUxXHUzMGUyXHUzMGVhXHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHU4YWFkXHUzMDdmXHU4ZmJjXHUzMDdmXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CityZWFsbUJhc2UuYWxnb3JpdGhtPVx1NzEyMVx1NTJiOVx1MzA2YVx1MzBlMVx1MzBjM1x1MzBiYlx1MzBmY1x1MzBiOFx1MzBjMFx1MzBhNFx1MzBiOFx1MzBhN1x1MzBiOVx1MzBjOFx1MzBhMlx1MzBlYlx1MzBiNFx1MzBlYVx1MzBiYVx1MzBlMCB7MH0gXHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CityZWFsbUJhc2UuYWxyZWFkeVN0YXJ0ZWQ9XHUzMDUzXHUzMDZlXHUzMGVjXHUzMGViXHUzMGUwXHUzMDZmXHU2NWUyXHUzMDZiXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CityZWFsbUJhc2UuZGlnZXN0PVx1MzBlNlx1MzBmY1x1MzBiNlx1MzA2ZVx1OGEzY1x1NjYwZVx1NjZmOFx1MzA2ZVx1MzBjMFx1MzBhNFx1MzBiOFx1MzBhN1x1MzBiOVx1MzBjOFx1MzBhOFx1MzBlOVx1MzBmYworcmVhbG1CYXNlLmZvcmJpZGRlbj1cdTg5ODFcdTZjNDJcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwNzhcdTMwNmVcdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjlcdTMwNGNcdTYyZDJcdTU0MjZcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWYKK3JlYWxtQmFzZS5oYXNSb2xlRmFpbHVyZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGQgezB9IFx1MzA2Zlx1MzBlZFx1MzBmY1x1MzBlYiB7MX0gXHUzMDkyXHU2MzAxXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCityZWFsbUJhc2UuaGFzUm9sZVN1Y2Nlc3M9XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkIHswfSBcdTMwNmZcdTMwZWRcdTMwZmNcdTMwZWIgezF9IFx1MzA5Mlx1NjMwMVx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorcmVhbG1CYXNlLm5vdEF1dGhlbnRpY2F0ZWQ9XHU4YTJkXHU1YjlhXHUzMGE4XHUzMGU5XHUzMGZjOiAgXHU4YThkXHU4YTNjXHUzMDU1XHUzMDhjXHUzMDVmXHU0ZTNiXHU0ZjUzXHUzMDZhXHUzMDU3XHUzMDY3XHUzMDZmXHUzMGEyXHUzMGFmXHUzMGJiXHUzMGI5XHU1MjM2XHU1ZmExXHUzMDRjXHU1YjlmXHU4ODRjXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCityZWFsbUJhc2Uubm90U3RhcnRlZD1cdTMwNTNcdTMwNmVcdTMwZWNcdTMwZWJcdTMwZTBcdTMwNmZcdTMwN2VcdTMwNjBcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK3JlYWxtQmFzZS5hdXRoZW50aWNhdGVGYWlsdXJlPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZCB7MH0gXHUzMDZmXHU4YThkXHU4YTNjXHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCityZWFsbUJhc2UuYXV0aGVudGljYXRlU3VjY2Vzcz1cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGQgezB9IFx1MzA2Zlx1OGE4ZFx1OGEzY1x1MzA2Ylx1NjIxMFx1NTI5Zlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgordXNlckRhdGFiYXNlUmVhbG0uYXV0aGVudGljYXRlRXJyb3I9XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkIHswfSBcdTMwOTJcdThhOGRcdThhM2NcdTRlMmRcdTMwNmJcdTMwZWRcdTMwYjBcdTMwYTRcdTMwZjNcdThhMmRcdTViOWFcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK3VzZXJEYXRhYmFzZVJlYWxtLmxvb2t1cD1cdTMwYWRcdTMwZmMgezB9IFx1MzA2N1x1MzBlNlx1MzBmY1x1MzBiNlx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOVx1MzA5Mlx1NjkxY1x1N2QyMlx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQordXNlckRhdGFiYXNlUmVhbG0ubm9EYXRhYmFzZT1cdTMwYWRcdTMwZmMgezB9IFx1MzA2N1x1MzBlNlx1MzBmY1x1MzBiNlx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOVx1MzBiM1x1MzBmM1x1MzBkZFx1MzBmY1x1MzBjZFx1MzBmM1x1MzBjOFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MwordXNlckRhdGFiYXNlUmVhbG0ubm9FbmdpbmU9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHU5NjhlXHU1YzY0XHU0ZTJkXHUzMDZiXHUzMGE4XHUzMGYzXHUzMGI4XHUzMGYzXHUzMGIzXHUzMGYzXHUzMGRkXHUzMGZjXHUzMGNkXHUzMGYzXHUzMGM4XHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCit1c2VyRGF0YWJhc2VSZWFsbS5ub0dsb2JhbD1cdTMwYjBcdTMwZWRcdTMwZmNcdTMwZDBcdTMwZWJcdTMwNmFKTkRJXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitkYXRhU291cmNlUmVhbG0uYXV0aGVudGljYXRlRmFpbHVyZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGQgezB9IFx1MzA2Zlx1OGE4ZFx1OGEzY1x1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorZGF0YVNvdXJjZVJlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkIHswfSBcdTMwNmZcdThhOGRcdThhM2NcdTMwNmJcdTYyMTBcdTUyOWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2RhdGFTb3VyY2VSZWFsbS5jbG9zZT1cdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTYzYTVcdTdkOWFcdTMwOTJcdTMwYWZcdTMwZWRcdTMwZmNcdTMwYmFcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK2RhdGFTb3VyY2VSZWFsbS5leGNlcHRpb249XHU4YThkXHU4YTNjXHUzMDkyXHU1YjlmXHU4ODRjXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitkYXRhU291cmNlUmVhbG0ub3Blbj1cdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTYzYTVcdTdkOWFcdTMwOTJcdTMwYWFcdTMwZmNcdTMwZDdcdTMwZjNcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9NZW1vcnlSZWFsbS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL01lbW9yeVJlYWxtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhN2E3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9NZW1vcnlSZWFsbS5qYXZhCkBAIC0wLDAgKzEsMzI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG07CisKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKKworCisvKioKKyAqIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiA8Yj5SZWFsbTwvYj4gdGhhdCByZWFkcyBhbiBYTUwgZmlsZSB0byBjb25maWd1cmUKKyAqIHRoZSB2YWxpZCB1c2VycywgcGFzc3dvcmRzLCBhbmQgcm9sZXMuICBUaGUgZmlsZSBmb3JtYXQgKGFuZCBkZWZhdWx0IGZpbGUKKyAqIGxvY2F0aW9uKSBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgVG9tY2F0IDMuWC4KKyAqIDxwPgorICogPHN0cm9uZz5JTVBMRU1FTlRBVElPTiBOT1RFPC9zdHJvbmc+OiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGluLW1lbW9yeQorICogY29sbGVjdGlvbiByZXByZXNlbnRpbmcgb3VyIGRlZmluZWQgdXNlcnMgKGFuZCB0aGVpciByb2xlcykgaXMgaW5pdGlhbGl6ZWQKKyAqIGF0IGFwcGxpY2F0aW9uIHN0YXJ0dXAgYW5kIG5ldmVyIG1vZGlmaWVkIGFnYWluLiAgVGhlcmVmb3JlLCBubyB0aHJlYWQKKyAqIHN5bmNocm9uaXphdGlvbiBpcyBwZXJmb3JtZWQgYXJvdW5kIGFjY2Vzc2VzIHRvIHRoZSBwcmluY2lwYWxzIGNvbGxlY3Rpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBNZW1vcnlSZWFsbSAgZXh0ZW5kcyBSZWFsbUJhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1lbW9yeVJlYWxtLmNsYXNzKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgRGlnZXN0ZXIgd2Ugd2lsbCB1c2UgdG8gcHJvY2VzcyBpbi1tZW1vcnkgZGF0YWJhc2UgZmlsZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLk1lbW9yeVJlYWxtLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUmVhbG0gaW1wbGVtZW50YXRpb24uCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lID0gIk1lbW9yeVJlYWxtIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHBhdGhuYW1lIChhYnNvbHV0ZSBvciByZWxhdGl2ZSB0byBDYXRhbGluYSdzIGN1cnJlbnQgd29ya2luZworICAgICAqIGRpcmVjdG9yeSkgb2YgdGhlIFhNTCBmaWxlIGNvbnRhaW5pbmcgb3VyIGRhdGFiYXNlIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhdGhuYW1lID0gImNvbmYvdG9tY2F0LXVzZXJzLnhtbCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgdmFsaWQgUHJpbmNpcGFscyBmb3IgdGhpcyBSZWFsbSwga2V5ZWQgYnkgdXNlciBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgTWFwIHByaW5jaXBhbHMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gaW5mbzsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXRobmFtZSBvZiBvdXIgWE1MIGZpbGUgY29udGFpbmluZyB1c2VyIGRlZmluaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHBhdGhuYW1lOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGhuYW1lIG9mIG91ciBYTUwgZmlsZSBjb250YWluaW5nIHVzZXIgZGVmaW5pdGlvbnMuICBJZiBhCisgICAgICogcmVsYXRpdmUgcGF0aG5hbWUgaXMgc3BlY2lmaWVkLCBpdCBpcyByZXNvbHZlZCBhZ2FpbnN0ICJjYXRhbGluYS5iYXNlIi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRobmFtZSBUaGUgbmV3IHBhdGhuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0aG5hbWUoU3RyaW5nIHBhdGhuYW1lKSB7CisKKyAgICAgICAgdGhpcy5wYXRobmFtZSA9IHBhdGhuYW1lOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kCisgICAgICogY3JlZGVudGlhbHMsIGlmIHRoZXJlIGlzIG9uZTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSBvZiB0aGUgUHJpbmNpcGFsIHRvIGxvb2sgdXAKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgUGFzc3dvcmQgb3Igb3RoZXIgY3JlZGVudGlhbHMgdG8gdXNlIGluCisgICAgICogIGF1dGhlbnRpY2F0aW5nIHRoaXMgdXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbmNpcGFsIGF1dGhlbnRpY2F0ZShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBjcmVkZW50aWFscykgeworCisgICAgICAgIEdlbmVyaWNQcmluY2lwYWwgcHJpbmNpcGFsID0KKyAgICAgICAgICAgIChHZW5lcmljUHJpbmNpcGFsKSBwcmluY2lwYWxzLmdldCh1c2VybmFtZSk7CisKKyAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHByaW5jaXBhbCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoaGFzTWVzc2FnZURpZ2VzdCgpKSB7CisgICAgICAgICAgICAgICAgLy8gSGV4IGhhc2hlcyBzaG91bGQgYmUgY29tcGFyZWQgY2FzZS1pbnNlbnNpdGl2ZQorICAgICAgICAgICAgICAgIHZhbGlkYXRlZCA9IChkaWdlc3QoY3JlZGVudGlhbHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKHByaW5jaXBhbC5nZXRQYXNzd29yZCgpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhbGlkYXRlZCA9CisgICAgICAgICAgICAgICAgICAgIChkaWdlc3QoY3JlZGVudGlhbHMpLmVxdWFscyhwcmluY2lwYWwuZ2V0UGFzc3dvcmQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHZhbGlkYXRlZCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIm1lbW9yeVJlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3MiLCB1c2VybmFtZSkpOworICAgICAgICAgICAgcmV0dXJuIChwcmluY2lwYWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIm1lbW9yeVJlYWxtLmF1dGhlbnRpY2F0ZUZhaWx1cmUiLCB1c2VybmFtZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHVzZXIgdG8gdGhlIGluLW1lbW9yeSBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VyJ3MgdXNlcm5hbWUKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVXNlcidzIHBhc3N3b3JkIChjbGVhciB0ZXh0KQorICAgICAqIEBwYXJhbSByb2xlcyBDb21tYS1kZWxpbWl0ZWQgc2V0IG9mIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIKKyAgICAgKi8KKyAgICB2b2lkIGFkZFVzZXIoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQsIFN0cmluZyByb2xlcykgeworCisgICAgICAgIC8vIEFjY3VtdWxhdGUgdGhlIGxpc3Qgb2Ygcm9sZXMgZm9yIHRoaXMgdXNlcgorICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgcm9sZXMgKz0gIiwiOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IGNvbW1hID0gcm9sZXMuaW5kZXhPZignLCcpOworICAgICAgICAgICAgaWYgKGNvbW1hIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFN0cmluZyByb2xlID0gcm9sZXMuc3Vic3RyaW5nKDAsIGNvbW1hKS50cmltKCk7CisgICAgICAgICAgICBsaXN0LmFkZChyb2xlKTsKKyAgICAgICAgICAgIHJvbGVzID0gcm9sZXMuc3Vic3RyaW5nKGNvbW1hICsgMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb25zdHJ1Y3QgYW5kIGNhY2hlIHRoZSBQcmluY2lwYWwgZm9yIHRoaXMgdXNlcgorICAgICAgICBHZW5lcmljUHJpbmNpcGFsIHByaW5jaXBhbCA9CisgICAgICAgICAgICBuZXcgR2VuZXJpY1ByaW5jaXBhbCh0aGlzLCB1c2VybmFtZSwgcGFzc3dvcmQsIGxpc3QpOworICAgICAgICBwcmluY2lwYWxzLnB1dCh1c2VybmFtZSwgcHJpbmNpcGFsKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvbmZpZ3VyZWQgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IHRvIHVzZSBmb3IgcHJvY2Vzc2luZworICAgICAqIHRoZSBYTUwgaW5wdXQgZmlsZSwgY3JlYXRpbmcgYSBuZXcgb25lIGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIERpZ2VzdGVyIGdldERpZ2VzdGVyKCkgeworCisgICAgICAgIGlmIChkaWdlc3RlciA9PSBudWxsKSB7CisgICAgICAgICAgICBkaWdlc3RlciA9IG5ldyBEaWdlc3RlcigpOworICAgICAgICAgICAgZGlnZXN0ZXIuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisgICAgICAgICAgICBkaWdlc3Rlci5hZGRSdWxlU2V0KG5ldyBNZW1vcnlSdWxlU2V0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoZGlnZXN0ZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzaG9ydCBuYW1lIGZvciB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJpbmNpcGFsJ3MgdXNlciBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFzc3dvcmQoU3RyaW5nIHVzZXJuYW1lKSB7CisKKyAgICAgICAgR2VuZXJpY1ByaW5jaXBhbCBwcmluY2lwYWwgPQorICAgICAgICAgICAgKEdlbmVyaWNQcmluY2lwYWwpIHByaW5jaXBhbHMuZ2V0KHVzZXJuYW1lKTsKKyAgICAgICAgaWYgKHByaW5jaXBhbCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKHByaW5jaXBhbC5nZXRQYXNzd29yZCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB1c2VyIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByaW5jaXBhbCBnZXRQcmluY2lwYWwoU3RyaW5nIHVzZXJuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuIChQcmluY2lwYWwpIHByaW5jaXBhbHMuZ2V0KHVzZXJuYW1lKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHByaW5jaXBhbHMgZm9yIHRoaXMgcmVhbG0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBwcmluY2lwYWxzLCBrZXllZCBieSB1c2VyIG5hbWUgKGEgU3RyaW5nKQorICAgICAqLworICAgIHByb3RlY3RlZCBNYXAgZ2V0UHJpbmNpcGFscygpIHsKKyAgICAgICAgcmV0dXJuIHByaW5jaXBhbHM7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJlcGFyZSBmb3IgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcyBDb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHN0YXJ0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQZXJmb3JtIG5vcm1hbCBzdXBlcmNsYXNzIGluaXRpYWxpemF0aW9uCisgICAgICAgIHN1cGVyLnN0YXJ0KCk7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGV4aXN0ZW5jZSBvZiBvdXIgZGF0YWJhc2UgZmlsZQorICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRobmFtZSk7CisgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksIHBhdGhuYW1lKTsKKyAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpIHx8ICFmaWxlLmNhblJlYWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJtZW1vcnlSZWFsbS5sb2FkRXhpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworCisgICAgICAgIC8vIExvYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhYmFzZSBmaWxlCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIm1lbW9yeVJlYWxtLmxvYWRQYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgICBEaWdlc3RlciBkaWdlc3RlciA9IGdldERpZ2VzdGVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRpZ2VzdGVyKSB7CisgICAgICAgICAgICAgICAgZGlnZXN0ZXIucHVzaCh0aGlzKTsKKyAgICAgICAgICAgICAgICBkaWdlc3Rlci5wYXJzZShmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJtZW1vcnlSZWFsbS5yZWFkWG1sIiksIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZGlnZXN0ZXIucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHNodXQgZG93biBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzIENvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQZXJmb3JtIG5vcm1hbCBzdXBlcmNsYXNzIGZpbmFsaXphdGlvbgorICAgICAgICBzdXBlci5zdG9wKCk7CisKKyAgICAgICAgLy8gTm8gc2h1dGRvd24gYWN0aXZpdGllcyByZXF1aXJlZAorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9NZW1vcnlSdWxlU2V0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vTWVtb3J5UnVsZVNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OGNlZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vTWVtb3J5UnVsZVNldC5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG07CisKKworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuRGlnZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5SdWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuUnVsZVNldEJhc2U7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKKworCisvKioKKyAqIDxwPjxzdHJvbmc+UnVsZVNldDwvc3Ryb25nPiBmb3IgcmVjb2duaXppbmcgdGhlIHVzZXJzIGRlZmluZWQgaW4gdGhlCisgKiBYTUwgZmlsZSBwcm9jZXNzZWQgYnkgPGNvZGU+TWVtb3J5UmVhbG08L2NvZGU+LjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIE1lbW9yeVJ1bGVTZXQgZXh0ZW5kcyBSdWxlU2V0QmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXggdG8gdXNlIGZvciByZWNvZ25pemluZyBvdXIgZWxlbWVudHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwcmVmaXggPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+UnVsZVNldDwvY29kZT4gd2l0aCB0aGUgZGVmYXVsdAorICAgICAqIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4LgorICAgICAqLworICAgIHB1YmxpYyBNZW1vcnlSdWxlU2V0KCkgeworCisgICAgICAgIHRoaXMoInRvbWNhdC11c2Vycy8iKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+UnVsZVNldDwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFByZWZpeCBmb3IgbWF0Y2hpbmcgcGF0dGVybiBydWxlcyAoaW5jbHVkaW5nIHRoZQorICAgICAqICB0cmFpbGluZyBzbGFzaCBjaGFyYWN0ZXIpCisgICAgICovCisgICAgcHVibGljIE1lbW9yeVJ1bGVTZXQoU3RyaW5nIHByZWZpeCkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbnVsbDsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiA8cD5BZGQgdGhlIHNldCBvZiBSdWxlIGluc3RhbmNlcyBkZWZpbmVkIGluIHRoaXMgUnVsZVNldCB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IGluc3RhbmNlLCBhc3NvY2lhdGluZyB0aGVtIHdpdGgKKyAgICAgKiBvdXIgbmFtZXNwYWNlIFVSSSAoaWYgYW55KS4gIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAorICAgICAqIGJ5IGEgRGlnZXN0ZXIgaW5zdGFuY2UuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGRpZ2VzdGVyIERpZ2VzdGVyIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBuZXcgUnVsZSBpbnN0YW5jZXMKKyAgICAgKiAgc2hvdWxkIGJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJ1bGVJbnN0YW5jZXMoRGlnZXN0ZXIgZGlnZXN0ZXIpIHsKKworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJ1c2VyIiwgbmV3IE1lbW9yeVVzZXJSdWxlKCkpOworCisgICAgfQorCisKK30KKworCisvKioKKyAqIFByaXZhdGUgY2xhc3MgdXNlZCB3aGVuIHBhcnNpbmcgdGhlIFhNTCBkYXRhYmFzZSBmaWxlLgorICovCitmaW5hbCBjbGFzcyBNZW1vcnlVc2VyUnVsZSBleHRlbmRzIFJ1bGUgeworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5SdWxlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtb3J5VXNlclJ1bGUoKSB7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgPGNvZGU+Jmx0O3VzZXImZ3Q7PC9jb2RlPiBlbGVtZW50IGZyb20gdGhlIFhNTCBkYXRhYmFzZSBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgVGhlIGF0dHJpYnV0ZSBsaXN0IGZvciB0aGlzIGVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIik7CisgICAgICAgIGlmICh1c2VybmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB1c2VybmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVzZXJuYW1lIik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicGFzc3dvcmQiKTsKKyAgICAgICAgU3RyaW5nIHJvbGVzID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicm9sZXMiKTsKKworICAgICAgICBNZW1vcnlSZWFsbSByZWFsbSA9CisgICAgICAgICAgICAoTWVtb3J5UmVhbG0pIGRpZ2VzdGVyLnBlZWsoZGlnZXN0ZXIuZ2V0Q291bnQoKSAtIDEpOworICAgICAgICByZWFsbS5hZGRVc2VyKHVzZXJuYW1lLCBwYXNzd29yZCwgcm9sZXMpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9SZWFsbUJhc2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9SZWFsbUJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzAzNTdkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL1JlYWxtQmFzZS5qYXZhCkBAIC0wLDAgKzEsMTQzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtOworCisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZVN1cHBvcnQ7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5SZWdpc3RyYXRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkNvbnRhaW5lckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTG9naW5Db25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuU2VjdXJpdHlDb25zdHJhaW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LlNlY3VyaXR5Q29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuSGV4VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkxpZmVjeWNsZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLk1ENUVuY29kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CisKKy8qKgorICogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIDxiPlJlYWxtPC9iPiB0aGF0IHJlYWRzIGFuIFhNTCBmaWxlIHRvIGNvbmZpZ3VyZQorICogdGhlIHZhbGlkIHVzZXJzLCBwYXNzd29yZHMsIGFuZCByb2xlcy4gIFRoZSBmaWxlIGZvcm1hdCAoYW5kIGRlZmF1bHQgZmlsZQorICogbG9jYXRpb24pIGFyZSBpZGVudGljYWwgdG8gdGhvc2UgY3VycmVudGx5IHN1cHBvcnRlZCBieSBUb21jYXQgMy5YLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVhbG1CYXNlCisgICAgaW1wbGVtZW50cyBMaWZlY3ljbGUsIFJlYWxtLCBNQmVhblJlZ2lzdHJhdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUmVhbG1CYXNlLmNsYXNzKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBSZWFsbSBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQ29udGFpbmVyIGxvZworICAgICAqLworICAgIHByb3RlY3RlZCBMb2cgY29udGFpbmVyTG9nID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRGlnZXN0IGFsZ29yaXRobSB1c2VkIGluIHN0b3JpbmcgcGFzc3dvcmRzIGluIGEgbm9uLXBsYWludGV4dCBmb3JtYXQuCisgICAgICogVmFsaWQgdmFsdWVzIGFyZSB0aG9zZSBhY2NlcHRlZCBmb3IgdGhlIGFsZ29yaXRobSBuYW1lIGJ5IHRoZQorICAgICAqIE1lc3NhZ2VEaWdlc3QgY2xhc3MsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGRpZ2VzdGluZyBzaG91bGQKKyAgICAgKiBiZSBwZXJmb3JtZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBkaWdlc3QgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIGVuY29kaW5nIGNoYXJzZXQgZm9yIHRoZSBkaWdlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBkaWdlc3RFbmNvZGluZyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUmVhbG0gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLlJlYWxtQmFzZS8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTWVzc2FnZURpZ2VzdCBvYmplY3QgZm9yIGRpZ2VzdGluZyB1c2VyIGNyZWRlbnRpYWxzIChwYXNzd29yZHMpLgorICAgICAqLworICAgIHByb3RlY3RlZCBNZXNzYWdlRGlnZXN0IG1kID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIE1ENSBoZWxwZXIgb2JqZWN0IGZvciB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTUQ1RW5jb2RlciBtZDVFbmNvZGVyID0gbmV3IE1ENUVuY29kZXIoKTsKKworCisgICAgLyoqCisgICAgICogTUQ1IG1lc3NhZ2UgZGlnZXN0IHByb3ZpZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgTWVzc2FnZURpZ2VzdCBtZDVIZWxwZXI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIHN0YXJ0ZWQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQgc3VwcG9ydCA9IG5ldyBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQodGhpcyk7CisKKworICAgIC8qKgorICAgICAqIFNob3VsZCB3ZSB2YWxpZGF0ZSBjbGllbnQgY2VydGlmaWNhdGUgY2hhaW5zIHdoZW4gdGhleSBhcmUgcHJlc2VudGVkPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlID0gdHJ1ZTsKKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBhbGwgcm9sZSBtb2RlLgorICAgICAqLworICAgIHByb3RlY3RlZCBBbGxSb2xlc01vZGUgYWxsUm9sZXNNb2RlID0gQWxsUm9sZXNNb2RlLlNUUklDVF9NT0RFOworICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBSZWFsbSBoYXMgYmVlbiBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgeworCisgICAgICAgIHJldHVybiAoY29udGFpbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIFJlYWxtIGhhcyBiZWVuIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBhc3NvY2lhdGVkIENvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgY29udGFpbmVyKSB7CisKKyAgICAgICAgQ29udGFpbmVyIG9sZENvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyOworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImNvbnRhaW5lciIsIG9sZENvbnRhaW5lciwgdGhpcy5jb250YWluZXIpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhbGwgcm9sZXMgbW9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsbFJvbGVzTW9kZSgpIHsKKworICAgICAgICByZXR1cm4gYWxsUm9sZXNNb2RlLnRvU3RyaW5nKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWxsIHJvbGVzIG1vZGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxsUm9sZXNNb2RlKFN0cmluZyBhbGxSb2xlc01vZGUpIHsKKworICAgICAgICB0aGlzLmFsbFJvbGVzTW9kZSA9IEFsbFJvbGVzTW9kZS50b01vZGUoYWxsUm9sZXNNb2RlKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlnZXN0IGFsZ29yaXRobSAgdXNlZCBmb3Igc3RvcmluZyBjcmVkZW50aWFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERpZ2VzdCgpIHsKKworICAgICAgICByZXR1cm4gZGlnZXN0OworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpZ2VzdCBhbGdvcml0aG0gdXNlZCBmb3Igc3RvcmluZyBjcmVkZW50aWFscy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaWdlc3QgVGhlIG5ldyBkaWdlc3QgYWxnb3JpdGhtCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlnZXN0KFN0cmluZyBkaWdlc3QpIHsKKworICAgICAgICB0aGlzLmRpZ2VzdCA9IGRpZ2VzdDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRpZ2VzdCBlbmNvZGluZyBjaGFyc2V0LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY2hhcnNldCAobWF5IGJlIG51bGwpIGZvciBwbGF0Zm9ybSBkZWZhdWx0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaWdlc3RFbmNvZGluZygpIHsKKyAgICAgICAgcmV0dXJuIGRpZ2VzdEVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRpZ2VzdCBlbmNvZGluZyBjaGFyc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGNoYXJzZXQgVGhlIGNoYXJzZXQgKG51bGwgZm9yIHBsYXRmb3JtIGRlZmF1bHQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlnZXN0RW5jb2RpbmcoU3RyaW5nIGNoYXJzZXQpIHsKKyAgICAgICAgZGlnZXN0RW5jb2RpbmcgPSBjaGFyc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gaW5mbzsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSAidmFsaWRhdGUgY2VydGlmaWNhdGUgY2hhaW5zIiBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFZhbGlkYXRlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy52YWxpZGF0ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgInZhbGlkYXRlIGNlcnRpZmljYXRlIGNoYWlucyIgZmxhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWxpZGF0ZSBUaGUgbmV3IHZhbGlkYXRlIGNlcnRpZmljYXRlIGNoYWlucyBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGUoYm9vbGVhbiB2YWxpZGF0ZSkgeworCisgICAgICAgIHRoaXMudmFsaWRhdGUgPSB2YWxpZGF0ZTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIAorICAgIC8qKgorICAgICAqIEFkZCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgc3VwcG9ydC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kCisgICAgICogY3JlZGVudGlhbHMsIGlmIHRoZXJlIGlzIG9uZTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSBvZiB0aGUgUHJpbmNpcGFsIHRvIGxvb2sgdXAKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgUGFzc3dvcmQgb3Igb3RoZXIgY3JlZGVudGlhbHMgdG8gdXNlIGluCisgICAgICogIGF1dGhlbnRpY2F0aW5nIHRoaXMgdXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbmNpcGFsIGF1dGhlbnRpY2F0ZShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBjcmVkZW50aWFscykgeworCisgICAgICAgIFN0cmluZyBzZXJ2ZXJDcmVkZW50aWFscyA9IGdldFBhc3N3b3JkKHVzZXJuYW1lKTsKKworICAgICAgICBib29sZWFuIHZhbGlkYXRlZCA7CisgICAgICAgIGlmICggc2VydmVyQ3JlZGVudGlhbHMgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIHZhbGlkYXRlZCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYoaGFzTWVzc2FnZURpZ2VzdCgpKSB7CisgICAgICAgICAgICB2YWxpZGF0ZWQgPSBzZXJ2ZXJDcmVkZW50aWFscy5lcXVhbHNJZ25vcmVDYXNlKGRpZ2VzdChjcmVkZW50aWFscykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsaWRhdGVkID0gc2VydmVyQ3JlZGVudGlhbHMuZXF1YWxzKGNyZWRlbnRpYWxzKTsKKyAgICAgICAgfQorICAgICAgICBpZighIHZhbGlkYXRlZCApIHsKKyAgICAgICAgICAgIGlmIChjb250YWluZXJMb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRhaW5lckxvZy50cmFjZShzbS5nZXRTdHJpbmcoInJlYWxtQmFzZS5hdXRoZW50aWNhdGVGYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29udGFpbmVyTG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lckxvZy50cmFjZShzbS5nZXRTdHJpbmcoInJlYWxtQmFzZS5hdXRoZW50aWNhdGVTdWNjZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBnZXRQcmluY2lwYWwodXNlcm5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kCisgICAgICogY3JlZGVudGlhbHMsIGlmIHRoZXJlIGlzIG9uZTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSBvZiB0aGUgUHJpbmNpcGFsIHRvIGxvb2sgdXAKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgUGFzc3dvcmQgb3Igb3RoZXIgY3JlZGVudGlhbHMgdG8gdXNlIGluCisgICAgICogIGF1dGhlbnRpY2F0aW5nIHRoaXMgdXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbmNpcGFsIGF1dGhlbnRpY2F0ZShTdHJpbmcgdXNlcm5hbWUsIGJ5dGVbXSBjcmVkZW50aWFscykgeworCisgICAgICAgIHJldHVybiAoYXV0aGVudGljYXRlKHVzZXJuYW1lLCBjcmVkZW50aWFscy50b1N0cmluZygpKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lLCB3aGljaAorICAgICAqIG1hdGNoZXMgdGhlIGRpZ2VzdCBjYWxjdWxhdGVkIHVzaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIHVzaW5nIHRoZQorICAgICAqIG1ldGhvZCBkZXNjcmliZWQgaW4gUkZDIDIwNjk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUgb2YgdGhlIFByaW5jaXBhbCB0byBsb29rIHVwCisgICAgICogQHBhcmFtIGNsaWVudERpZ2VzdCBEaWdlc3Qgd2hpY2ggaGFzIGJlZW4gc3VibWl0dGVkIGJ5IHRoZSBjbGllbnQKKyAgICAgKiBAcGFyYW0gbk9uY2UgVW5pcXVlIChvciBzdXBwb3NlZGx5IHVuaXF1ZSkgdG9rZW4gd2hpY2ggaGFzIGJlZW4gdXNlZAorICAgICAqIGZvciB0aGlzIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcmVhbG0gUmVhbG0gbmFtZQorICAgICAqIEBwYXJhbSBtZDVhMiBTZWNvbmQgTUQ1IGRpZ2VzdCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgZGlnZXN0IDoKKyAgICAgKiBNRDUoTWV0aG9kICsgIjoiICsgdXJpKQorICAgICAqLworICAgIHB1YmxpYyBQcmluY2lwYWwgYXV0aGVudGljYXRlKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIGNsaWVudERpZ2VzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbk9uY2UsIFN0cmluZyBuYywgU3RyaW5nIGNub25jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcW9wLCBTdHJpbmcgcmVhbG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1kNWEyKSB7CisKKyAgICAgICAgU3RyaW5nIG1kNWExID0gZ2V0RGlnZXN0KHVzZXJuYW1lLCByZWFsbSk7CisgICAgICAgIGlmIChtZDVhMSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIFN0cmluZyBzZXJ2ZXJEaWdlc3RWYWx1ZSA9IG1kNWExICsgIjoiICsgbk9uY2UgKyAiOiIgKyBuYyArICI6IgorICAgICAgICAgICAgKyBjbm9uY2UgKyAiOiIgKyBxb3AgKyAiOiIgKyBtZDVhMjsKKworICAgICAgICBieXRlW10gdmFsdWVCeXRlcyA9IG51bGw7CisgICAgICAgIGlmKGdldERpZ2VzdEVuY29kaW5nKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdmFsdWVCeXRlcyA9IHNlcnZlckRpZ2VzdFZhbHVlLmdldEJ5dGVzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHZhbHVlQnl0ZXMgPSBzZXJ2ZXJEaWdlc3RWYWx1ZS5nZXRCeXRlcyhnZXREaWdlc3RFbmNvZGluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJJbGxlZ2FsIGRpZ2VzdEVuY29kaW5nOiAiICsgZ2V0RGlnZXN0RW5jb2RpbmcoKSwgdWVlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHVlZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHNlcnZlckRpZ2VzdCA9IG51bGw7CisgICAgICAgIC8vIEJ1Z3ppbGxhIDMyMTM3CisgICAgICAgIHN5bmNocm9uaXplZChtZDVIZWxwZXIpIHsKKyAgICAgICAgICAgIHNlcnZlckRpZ2VzdCA9IG1kNUVuY29kZXIuZW5jb2RlKG1kNUhlbHBlci5kaWdlc3QodmFsdWVCeXRlcykpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIkRpZ2VzdCA6ICIgKyBjbGllbnREaWdlc3QgKyAiIFVzZXJuYW1lOiIgKyB1c2VybmFtZSAKKyAgICAgICAgICAgICAgICAgICAgKyAiIENsaWVudFNpZ2VzdDoiICsgY2xpZW50RGlnZXN0ICsgIiBuT25jZToiICsgbk9uY2UgCisgICAgICAgICAgICAgICAgICAgICsgIiBuYzoiICsgbmMgKyAiIGNub25jZToiICsgY25vbmNlICsgIiBxb3A6IiArIHFvcCAKKyAgICAgICAgICAgICAgICAgICAgKyAiIHJlYWxtOiIgKyByZWFsbSArICJtZDVhMjoiICsgbWQ1YTIgCisgICAgICAgICAgICAgICAgICAgICsgIiBTZXJ2ZXIgZGlnZXN0OiIgKyBzZXJ2ZXJEaWdlc3QpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoc2VydmVyRGlnZXN0LmVxdWFscyhjbGllbnREaWdlc3QpKQorICAgICAgICAgICAgcmV0dXJuIGdldFByaW5jaXBhbCh1c2VybmFtZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFByaW5jaXBhbCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBjaGFpbiBvZiBYNTA5CisgICAgICogY2xpZW50IGNlcnRpZmljYXRlcy4gIElmIHRoZXJlIGlzIG5vbmUsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjZXJ0cyBBcnJheSBvZiBjbGllbnQgY2VydGlmaWNhdGVzLCB3aXRoIHRoZSBmaXJzdCBvbmUgaW4KKyAgICAgKiAgdGhlIGFycmF5IGJlaW5nIHRoZSBjZXJ0aWZpY2F0ZSBvZiB0aGUgY2xpZW50IGl0c2VsZi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbmNpcGFsIGF1dGhlbnRpY2F0ZShYNTA5Q2VydGlmaWNhdGUgY2VydHNbXSkgeworCisgICAgICAgIGlmICgoY2VydHMgPT0gbnVsbCkgfHwgKGNlcnRzLmxlbmd0aCA8IDEpKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAvLyBDaGVjayB0aGUgdmFsaWRpdHkgb2YgZWFjaCBjZXJ0aWZpY2F0ZSBpbiB0aGUgY2hhaW4KKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJBdXRoZW50aWNhdGluZyBjbGllbnQgY2VydGlmaWNhdGUgY2hhaW4iKTsKKyAgICAgICAgaWYgKHZhbGlkYXRlKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNlcnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBDaGVja2luZyB2YWxpZGl0eSBmb3IgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgY2VydHNbaV0uZ2V0U3ViamVjdEROKCkuZ2V0TmFtZSgpICsgIiciKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjZXJ0c1tpXS5jaGVja1ZhbGlkaXR5KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFZhbGlkaXR5IGV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGNsaWVudCBQcmluY2lwYWwgaW4gb3VyIGRhdGFiYXNlCisgICAgICAgIHJldHVybiAoZ2V0UHJpbmNpcGFsKGNlcnRzWzBdKSk7CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIGEgcGVyaW9kaWMgdGFzaywgc3VjaCBhcyByZWxvYWRpbmcsIGV0Yy4gVGhpcyBtZXRob2Qgd2lsbCBiZQorICAgICAqIGludm9rZWQgaW5zaWRlIHRoZSBjbGFzc2xvYWRpbmcgY29udGV4dCBvZiB0aGlzIGNvbnRhaW5lci4gVW5leHBlY3RlZAorICAgICAqIHRocm93YWJsZXMgd2lsbCBiZSBjYXVnaHQgYW5kIGxvZ2dlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiYWNrZ3JvdW5kUHJvY2VzcygpIHsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU2VjdXJpdHlDb25zdHJhaW50cyBjb25maWd1cmVkIHRvIGd1YXJkIHRoZSByZXF1ZXN0IFVSSSBmb3IKKyAgICAgKiB0aGlzIHJlcXVlc3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHN1Y2ggY29uc3RyYWludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRoZSBSZXF1ZXN0IGlzIG1hcHBlZCB0bworICAgICAqLworICAgIHB1YmxpYyBTZWN1cml0eUNvbnN0cmFpbnQgW10gZmluZFNlY3VyaXR5Q29uc3RyYWludHMoUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0KSB7CisKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBudWxsOworICAgICAgICAvLyBBcmUgdGhlcmUgYW55IGRlZmluZWQgc2VjdXJpdHkgY29uc3RyYWludHM/CisgICAgICAgIFNlY3VyaXR5Q29uc3RyYWludCBjb25zdHJhaW50c1tdID0gY29udGV4dC5maW5kQ29uc3RyYWludHMoKTsKKyAgICAgICAgaWYgKChjb25zdHJhaW50cyA9PSBudWxsKSB8fCAoY29uc3RyYWludHMubGVuZ3RoID09IDApKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIE5vIGFwcGxpY2FibGUgY29uc3RyYWludHMgZGVmaW5lZCIpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGVhY2ggZGVmaW5lZCBzZWN1cml0eSBjb25zdHJhaW50CisgICAgICAgIFN0cmluZyB1cmkgPSByZXF1ZXN0LmdldFJlcXVlc3RQYXRoTUIoKS50b1N0cmluZygpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIG1ldGhvZCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCk7CisgICAgICAgIGludCBpOworICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU2VjdXJpdHlDb2xsZWN0aW9uIFtdIGNvbGxlY3Rpb24gPSBjb25zdHJhaW50c1tpXS5maW5kQ29sbGVjdGlvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSWYgY29sbGVjdGlvbiBpcyBudWxsLCBjb250aW51ZSB0byBhdm9pZCBhbiBOUEUKKyAgICAgICAgICAgIC8vIFNlZSBCdWd6aWxsYSAzMDYyNAorICAgICAgICAgICAgaWYgKCBjb2xsZWN0aW9uID09IG51bGwpIHsKKwkJY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBDaGVja2luZyBjb25zdHJhaW50ICciICsgY29uc3RyYWludHNbaV0gKworICAgICAgICAgICAgICAgICAgICAiJyBhZ2FpbnN0ICIgKyBtZXRob2QgKyAiICIgKyB1cmkgKyAiIC0tPiAiICsKKyAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHNbaV0uaW5jbHVkZWQodXJpLCBtZXRob2QpKTsKKwkgICAgfQorCisgICAgICAgICAgICBmb3IoaW50IGo9MDsgaiA8IGNvbGxlY3Rpb24ubGVuZ3RoOyBqKyspeworICAgICAgICAgICAgICAgIFN0cmluZyBbXSBwYXR0ZXJucyA9IGNvbGxlY3Rpb25bal0uZmluZFBhdHRlcm5zKCk7CisgCisgICAgICAgICAgICAgICAgLy8gSWYgcGF0dGVybnMgaXMgbnVsbCwgY29udGludWUgdG8gYXZvaWQgYW4gTlBFCisgICAgICAgICAgICAgICAgLy8gU2VlIEJ1Z3ppbGxhIDMwNjI0CisgICAgICAgICAgICAgICAgaWYgKCBwYXR0ZXJucyA9PSBudWxsKSB7CisJCSAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IoaW50IGs9MDsgayA8IHBhdHRlcm5zLmxlbmd0aDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKHVyaS5lcXVhbHMocGF0dGVybnNba10pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihjb2xsZWN0aW9uW2pdLmZpbmRNZXRob2QobWV0aG9kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3VsdHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChjb25zdHJhaW50c1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihmb3VuZCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNUb0FycmF5KHJlc3VsdHMpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGxvbmdlc3QgPSAtMTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFNlY3VyaXR5Q29sbGVjdGlvbiBbXSBjb2xsZWN0aW9uID0gY29uc3RyYWludHNbaV0uZmluZENvbGxlY3Rpb25zKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIElmIGNvbGxlY3Rpb24gaXMgbnVsbCwgY29udGludWUgdG8gYXZvaWQgYW4gTlBFCisgICAgICAgICAgICAvLyBTZWUgQnVnemlsbGEgMzA2MjQKKyAgICAgICAgICAgIGlmICggY29sbGVjdGlvbiA9PSBudWxsKSB7CisJCWNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgQ2hlY2tpbmcgY29uc3RyYWludCAnIiArIGNvbnN0cmFpbnRzW2ldICsKKyAgICAgICAgICAgICAgICAgICAgIicgYWdhaW5zdCAiICsgbWV0aG9kICsgIiAiICsgdXJpICsgIiAtLT4gIiArCisgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzW2ldLmluY2x1ZGVkKHVyaSwgbWV0aG9kKSk7CisJICAgIH0KKworICAgICAgICAgICAgZm9yKGludCBqPTA7IGogPCBjb2xsZWN0aW9uLmxlbmd0aDsgaisrKXsKKyAgICAgICAgICAgICAgICBTdHJpbmcgW10gcGF0dGVybnMgPSBjb2xsZWN0aW9uW2pdLmZpbmRQYXR0ZXJucygpOworCisgICAgICAgICAgICAgICAgLy8gSWYgcGF0dGVybnMgaXMgbnVsbCwgY29udGludWUgdG8gYXZvaWQgYW4gTlBFCisgICAgICAgICAgICAgICAgLy8gU2VlIEJ1Z3ppbGxhIDMwNjI0CisgICAgICAgICAgICAgICAgaWYgKCBwYXR0ZXJucyA9PSBudWxsKSB7CisJCSAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBib29sZWFuIG1hdGNoZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gLTE7CisgICAgICAgICAgICAgICAgZm9yKGludCBrPTA7IGsgPCBwYXR0ZXJucy5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IHBhdHRlcm5zW2tdOworICAgICAgICAgICAgICAgICAgICBpZihwYXR0ZXJuLnN0YXJ0c1dpdGgoIi8iKSAmJiBwYXR0ZXJuLmVuZHNXaXRoKCIvKiIpICYmIAorICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLmxlbmd0aCgpID49IGxvbmdlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhdHRlcm4ubGVuZ3RoKCkgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHBhdHRlcm4ubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYocGF0dGVybi5yZWdpb25NYXRjaGVzKDAsdXJpLDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4ubGVuZ3RoKCktMSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF0dGVybi5sZW5ndGgoKS0yID09IHVyaS5sZW5ndGgoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLnJlZ2lvbk1hdGNoZXMoMCx1cmksMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5sZW5ndGgoKS0yKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBwYXR0ZXJuLmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKG1hdGNoZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZihsZW5ndGggPiBsb25nZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXN1bHRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nZXN0ID0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKGNvbGxlY3Rpb25bal0uZmluZE1ldGhvZChtZXRob2QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXN1bHRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoY29uc3RyYWludHNbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoZm91bmQpIHsKKyAgICAgICAgICAgIHJldHVybiAgcmVzdWx0c1RvQXJyYXkocmVzdWx0cyk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFNlY3VyaXR5Q29sbGVjdGlvbiBbXSBjb2xsZWN0aW9uID0gY29uc3RyYWludHNbaV0uZmluZENvbGxlY3Rpb25zKCk7CisKKyAgICAgICAgICAgIC8vIElmIGNvbGxlY3Rpb24gaXMgbnVsbCwgY29udGludWUgdG8gYXZvaWQgYW4gTlBFCisgICAgICAgICAgICAvLyBTZWUgQnVnemlsbGEgMzA2MjQKKyAgICAgICAgICAgIGlmICggY29sbGVjdGlvbiA9PSBudWxsKSB7CisJCWNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgQ2hlY2tpbmcgY29uc3RyYWludCAnIiArIGNvbnN0cmFpbnRzW2ldICsKKyAgICAgICAgICAgICAgICAgICAgIicgYWdhaW5zdCAiICsgbWV0aG9kICsgIiAiICsgdXJpICsgIiAtLT4gIiArCisgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzW2ldLmluY2x1ZGVkKHVyaSwgbWV0aG9kKSk7CisJICAgIH0KKworICAgICAgICAgICAgYm9vbGVhbiBtYXRjaGVkID0gZmFsc2U7CisgICAgICAgICAgICBpbnQgcG9zID0gLTE7CisgICAgICAgICAgICBmb3IoaW50IGo9MDsgaiA8IGNvbGxlY3Rpb24ubGVuZ3RoOyBqKyspeworICAgICAgICAgICAgICAgIFN0cmluZyBbXSBwYXR0ZXJucyA9IGNvbGxlY3Rpb25bal0uZmluZFBhdHRlcm5zKCk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiBwYXR0ZXJucyBpcyBudWxsLCBjb250aW51ZSB0byBhdm9pZCBhbiBOUEUKKyAgICAgICAgICAgICAgICAvLyBTZWUgQnVnemlsbGEgMzA2MjQKKyAgICAgICAgICAgICAgICBpZiAoIHBhdHRlcm5zID09IG51bGwpIHsKKwkJICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcihpbnQgaz0wOyBrIDwgcGF0dGVybnMubGVuZ3RoICYmICFtYXRjaGVkOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBwYXR0ZXJuc1trXTsKKyAgICAgICAgICAgICAgICAgICAgaWYocGF0dGVybi5zdGFydHNXaXRoKCIqLiIpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzbGFzaCA9IHVyaS5sYXN0SW5kZXhPZigiLyIpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvdCA9IHVyaS5sYXN0SW5kZXhPZigiLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2xhc2ggPj0gMCAmJiBkb3QgPiBzbGFzaCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90ICE9IHVyaS5sZW5ndGgoKS0xICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmkubGVuZ3RoKCktZG90ID09IHBhdHRlcm4ubGVuZ3RoKCktMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhdHRlcm4ucmVnaW9uTWF0Y2hlcygxLHVyaSxkb3QsdXJpLmxlbmd0aCgpLWRvdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYobWF0Y2hlZCkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZihjb2xsZWN0aW9uW3Bvc10uZmluZE1ldGhvZChtZXRob2QpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKHJlc3VsdHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChjb25zdHJhaW50c1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoZm91bmQpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHRzVG9BcnJheShyZXN1bHRzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU2VjdXJpdHlDb2xsZWN0aW9uIFtdIGNvbGxlY3Rpb24gPSBjb25zdHJhaW50c1tpXS5maW5kQ29sbGVjdGlvbnMoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSWYgY29sbGVjdGlvbiBpcyBudWxsLCBjb250aW51ZSB0byBhdm9pZCBhbiBOUEUKKyAgICAgICAgICAgIC8vIFNlZSBCdWd6aWxsYSAzMDYyNAorICAgICAgICAgICAgaWYgKCBjb2xsZWN0aW9uID09IG51bGwpIHsKKwkJY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBDaGVja2luZyBjb25zdHJhaW50ICciICsgY29uc3RyYWludHNbaV0gKworICAgICAgICAgICAgICAgICAgICAiJyBhZ2FpbnN0ICIgKyBtZXRob2QgKyAiICIgKyB1cmkgKyAiIC0tPiAiICsKKyAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHNbaV0uaW5jbHVkZWQodXJpLCBtZXRob2QpKTsKKwkgICAgfQorCisgICAgICAgICAgICBmb3IoaW50IGo9MDsgaiA8IGNvbGxlY3Rpb24ubGVuZ3RoOyBqKyspeworICAgICAgICAgICAgICAgIFN0cmluZyBbXSBwYXR0ZXJucyA9IGNvbGxlY3Rpb25bal0uZmluZFBhdHRlcm5zKCk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiBwYXR0ZXJucyBpcyBudWxsLCBjb250aW51ZSB0byBhdm9pZCBhbiBOUEUKKyAgICAgICAgICAgICAgICAvLyBTZWUgQnVnemlsbGEgMzA2MjQKKyAgICAgICAgICAgICAgICBpZiAoIHBhdHRlcm5zID09IG51bGwpIHsKKwkJICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2xlYW4gbWF0Y2hlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvcihpbnQgaz0wOyBrIDwgcGF0dGVybnMubGVuZ3RoICYmICFtYXRjaGVkOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBwYXR0ZXJuc1trXTsKKyAgICAgICAgICAgICAgICAgICAgaWYocGF0dGVybi5lcXVhbHMoIi8iKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihtYXRjaGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKHJlc3VsdHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKGNvbnN0cmFpbnRzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihyZXN1bHRzID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIE5vIGFwcGxpY2FibGUgc2VjdXJpdHkgY29uc3RyYWludCB3YXMgZm91bmQKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgTm8gYXBwbGljYWJsZSBjb25zdHJhaW50IGxvY2F0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0c1RvQXJyYXkocmVzdWx0cyk7CisgICAgfQorIAorICAgIC8qKgorICAgICAqIENvbnZlcnQgYW4gQXJyYXlMaXN0IHRvIGEgU2VjdXJpdHlDb250cmFpbnQgW10uCisgICAgICovCisgICAgcHJpdmF0ZSBTZWN1cml0eUNvbnN0cmFpbnQgW10gcmVzdWx0c1RvQXJyYXkoQXJyYXlMaXN0IHJlc3VsdHMpIHsKKyAgICAgICAgaWYocmVzdWx0cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgW10gYXJyYXkgPSBuZXcgU2VjdXJpdHlDb25zdHJhaW50W3Jlc3VsdHMuc2l6ZSgpXTsKKyAgICAgICAgcmVzdWx0cy50b0FycmF5KGFycmF5KTsKKyAgICAgICAgcmV0dXJuIGFycmF5OworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFBlcmZvcm0gYWNjZXNzIGNvbnRyb2wgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBhdXRob3JpemF0aW9uIGNvbnN0cmFpbnQuCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY29uc3RyYWludCBpcyBzYXRpc2ZpZWQgYW5kIHByb2Nlc3NpbmcKKyAgICAgKiBzaG91bGQgY29udGludWUsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSBjb25zdHJhaW50cyBTZWN1cml0eSBjb25zdHJhaW50IHdlIGFyZSBlbmZvcmNpbmcKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0byB3aGljaCBjbGllbnQgb2YgdGhpcyBjbGFzcyBpcyBhdHRhY2hlZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1Jlc291cmNlUGVybWlzc2lvbihSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgW11jb25zdHJhaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChjb25zdHJhaW50cyA9PSBudWxsIHx8IGNvbnN0cmFpbnRzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKworICAgICAgICAvLyBTcGVjaWZpY2FsbHkgYWxsb3cgYWNjZXNzIHRvIHRoZSBmb3JtIGxvZ2luIGFuZCBmb3JtIGVycm9yIHBhZ2VzCisgICAgICAgIC8vIGFuZCB0aGUgImpfc2VjdXJpdHlfY2hlY2siIGFjdGlvbgorICAgICAgICBMb2dpbkNvbmZpZyBjb25maWcgPSBjb250ZXh0LmdldExvZ2luQ29uZmlnKCk7CisgICAgICAgIGlmICgoY29uZmlnICE9IG51bGwpICYmCisgICAgICAgICAgICAoQ29uc3RhbnRzLkZPUk1fTUVUSE9ELmVxdWFscyhjb25maWcuZ2V0QXV0aE1ldGhvZCgpKSkpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0VVJJID0gcmVxdWVzdC5nZXRSZXF1ZXN0UGF0aE1CKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZyBsb2dpblBhZ2UgPSBjb25maWcuZ2V0TG9naW5QYWdlKCk7CisgICAgICAgICAgICBpZiAobG9naW5QYWdlLmVxdWFscyhyZXF1ZXN0VVJJKSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgQWxsb3cgYWNjZXNzIHRvIGxvZ2luIHBhZ2UgIiArIGxvZ2luUGFnZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBlcnJvclBhZ2UgPSBjb25maWcuZ2V0RXJyb3JQYWdlKCk7CisgICAgICAgICAgICBpZiAoZXJyb3JQYWdlLmVxdWFscyhyZXF1ZXN0VVJJKSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgQWxsb3cgYWNjZXNzIHRvIGVycm9yIHBhZ2UgIiArIGVycm9yUGFnZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXF1ZXN0VVJJLmVuZHNXaXRoKENvbnN0YW50cy5GT1JNX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIEFsbG93IGFjY2VzcyB0byB1c2VybmFtZS9wYXNzd29yZCBzdWJtaXNzaW9uIik7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFdoaWNoIHVzZXIgcHJpbmNpcGFsIGhhdmUgd2UgYWxyZWFkeSBhdXRoZW50aWNhdGVkPworICAgICAgICBQcmluY2lwYWwgcHJpbmNpcGFsID0gcmVxdWVzdC5nZXRQcmluY2lwYWwoKTsKKyAgICAgICAgYm9vbGVhbiBzdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBkZW55ZnJvbWFsbCA9IGZhbHNlOworICAgICAgICBmb3IoaW50IGk9MDsgaSA8IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgY29uc3RyYWludCA9IGNvbnN0cmFpbnRzW2ldOworCisgICAgICAgICAgICBTdHJpbmcgcm9sZXNbXTsKKyAgICAgICAgICAgIGlmIChjb25zdHJhaW50LmdldEFsbFJvbGVzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyAqIG1lYW5zIGFsbCByb2xlcyBkZWZpbmVkIGluIHdlYi54bWwKKyAgICAgICAgICAgICAgICByb2xlcyA9IHJlcXVlc3QuZ2V0Q29udGV4dCgpLmZpbmRTZWN1cml0eVJvbGVzKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJvbGVzID0gY29uc3RyYWludC5maW5kQXV0aFJvbGVzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyb2xlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJvbGVzID0gbmV3IFN0cmluZ1swXTsKKworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBDaGVja2luZyByb2xlcyAiICsgcHJpbmNpcGFsKTsKKworICAgICAgICAgICAgaWYgKHJvbGVzLmxlbmd0aCA9PSAwICYmICFjb25zdHJhaW50LmdldEFsbFJvbGVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZihjb25zdHJhaW50LmdldEF1dGhDb25zdHJhaW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gcm9sZXMgIik7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOyAvLyBObyBsaXN0ZWQgcm9sZXMgbWVhbnMgbm8gYWNjZXNzIGF0IGFsbAorICAgICAgICAgICAgICAgICAgICBkZW55ZnJvbWFsbCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhc3NpbmcgYWxsIGFjY2VzcyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocHJpbmNpcGFsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBObyB1c2VyIGF1dGhlbnRpY2F0ZWQsIGNhbm5vdCBncmFudCBhY2Nlc3MiKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZighZGVueWZyb21hbGwpIHsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcm9sZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1JvbGUocHJpbmNpcGFsLCByb2xlc1tqXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiTm8gcm9sZSBmb3VuZDogICIgKyByb2xlc1tqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGFsbFJvbGVzTW9kZSAhPSBBbGxSb2xlc01vZGUuU1RSSUNUX01PREUgJiYgIXN0YXR1cyAmJiBwcmluY2lwYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGVja2luZyBmb3IgYWxsIHJvbGVzIG1vZGU6ICIgKyBhbGxSb2xlc01vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGFuIGFsbCByb2xlcyhyb2xlLW5hbWU9IioiKQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFNlY3VyaXR5Q29uc3RyYWludCBjb25zdHJhaW50ID0gY29uc3RyYWludHNbaV07CisgICAgICAgICAgICAgICAgU3RyaW5nIHJvbGVzW107CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFsbCByb2xlcyBtb2RlIGV4aXN0cywgc2V0cworICAgICAgICAgICAgICAgIGlmIChjb25zdHJhaW50LmdldEFsbFJvbGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsbFJvbGVzTW9kZSA9PSBBbGxSb2xlc01vZGUuQVVUSF9PTkxZX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiR3JhbnRpbmcgYWNjZXNzIGZvciByb2xlLW5hbWU9KiwgYXV0aC1vbmx5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIEZvciBBbGxSb2xlc01vZGUuU1RSSUNUX0FVVEhfT05MWV9NT0RFIHRoZXJlIG11c3QgYmUgemVybyByb2xlcworICAgICAgICAgICAgICAgICAgICByb2xlcyA9IHJlcXVlc3QuZ2V0Q29udGV4dCgpLmZpbmRTZWN1cml0eVJvbGVzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyb2xlcy5sZW5ndGggPT0gMCAmJiBhbGxSb2xlc01vZGUgPT0gQWxsUm9sZXNNb2RlLlNUUklDVF9BVVRIX09OTFlfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJHcmFudGluZyBhY2Nlc3MgZm9yIHJvbGUtbmFtZT0qLCBzdHJpY3QgYXV0aC1vbmx5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFJldHVybiBhICJGb3JiaWRkZW4iIG1lc3NhZ2UgZGVueWluZyBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZQorICAgICAgICBpZighc3RhdHVzKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19GT1JCSURERU4sCisgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVhbG1CYXNlLmZvcmJpZGRlbiIpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIFByaW5jaXBhbCBoYXMgdGhlIHNwZWNpZmllZAorICAgICAqIHNlY3VyaXR5IHJvbGUsIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGlzIFJlYWxtOyBvdGhlcndpc2UgcmV0dXJuCisgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+LiAgVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgUmVhbG0KKyAgICAgKiBpbXBsZW1lbnRhdGlvbnMsIGJ1dCB0aGUgZGVmYXVsdCBpcyBhZGVxdWF0ZSB3aGVuIGFuIGluc3RhbmNlIG9mCisgICAgICogPGNvZGU+R2VuZXJpY1ByaW5jaXBhbDwvY29kZT4gaXMgdXNlZCB0byByZXByZXNlbnQgYXV0aGVudGljYXRlZAorICAgICAqIFByaW5jaXBhbHMgZnJvbSB0aGlzIFJlYWxtLgorICAgICAqCisgICAgICogQHBhcmFtIHByaW5jaXBhbCBQcmluY2lwYWwgZm9yIHdob20gdGhlIHJvbGUgaXMgdG8gYmUgY2hlY2tlZAorICAgICAqIEBwYXJhbSByb2xlIFNlY3VyaXR5IHJvbGUgdG8gYmUgY2hlY2tlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1JvbGUoUHJpbmNpcGFsIHByaW5jaXBhbCwgU3RyaW5nIHJvbGUpIHsKKworICAgICAgICAvLyBTaG91bGQgYmUgb3ZlcnJpdGVuIGluIEpBQVNSZWFsbSAtIHRvIGF2b2lkIHByZXR0eSBpbmVmZmljaWVudCBjb252ZXJzaW9ucworICAgICAgICBpZiAoKHByaW5jaXBhbCA9PSBudWxsKSB8fCAocm9sZSA9PSBudWxsKSB8fAorICAgICAgICAgICAgIShwcmluY2lwYWwgaW5zdGFuY2VvZiBHZW5lcmljUHJpbmNpcGFsKSkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgICAgIEdlbmVyaWNQcmluY2lwYWwgZ3AgPSAoR2VuZXJpY1ByaW5jaXBhbCkgcHJpbmNpcGFsOworICAgICAgICBpZiAoIShncC5nZXRSZWFsbSgpID09IHRoaXMpKSB7CisgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRpZmZlcmVudCByZWFsbSAiICsgdGhpcyArICIgIiArIGdwLmdldFJlYWxtKCkpOy8vICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZ3AuaGFzUm9sZShyb2xlKTsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHByaW5jaXBhbC5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoInJlYWxtQmFzZS5oYXNSb2xlU3VjY2VzcyIsIG5hbWUsIHJvbGUpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJyZWFsbUJhc2UuaGFzUm9sZUZhaWx1cmUiLCBuYW1lLCByb2xlKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChyZXN1bHQpOworCisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogRW5mb3JjZSBhbnkgdXNlciBkYXRhIGNvbnN0cmFpbnQgcmVxdWlyZWQgYnkgdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQKKyAgICAgKiBndWFyZGluZyB0aGlzIHJlcXVlc3QgVVJJLiAgUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY29uc3RyYWludAorICAgICAqIHdhcyBub3QgdmlvbGF0ZWQgYW5kIHByb2Nlc3Npbmcgc2hvdWxkIGNvbnRpbnVlLCBvciA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgKiBpZiB3ZSBoYXZlIGNyZWF0ZWQgYSByZXNwb25zZSBhbHJlYWR5LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKiBAcGFyYW0gY29uc3RyYWludHMgU2VjdXJpdHkgY29uc3RyYWludCBiZWluZyBjaGVja2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNVc2VyRGF0YVBlcm1pc3Npb24oUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlDb25zdHJhaW50IFtdY29uc3RyYWludHMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gSXMgdGhlcmUgYSByZWxldmFudCB1c2VyIGRhdGEgY29uc3RyYWludD8KKyAgICAgICAgaWYgKGNvbnN0cmFpbnRzID09IG51bGwgfHwgY29uc3RyYWludHMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgTm8gYXBwbGljYWJsZSBzZWN1cml0eSBjb25zdHJhaW50IGRlZmluZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yKGludCBpPTA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU2VjdXJpdHlDb25zdHJhaW50IGNvbnN0cmFpbnQgPSBjb25zdHJhaW50c1tpXTsKKyAgICAgICAgICAgIFN0cmluZyB1c2VyQ29uc3RyYWludCA9IGNvbnN0cmFpbnQuZ2V0VXNlckNvbnN0cmFpbnQoKTsKKyAgICAgICAgICAgIGlmICh1c2VyQ29uc3RyYWludCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgTm8gYXBwbGljYWJsZSB1c2VyIGRhdGEgY29uc3RyYWludCBkZWZpbmVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1c2VyQ29uc3RyYWludC5lcXVhbHMoQ29uc3RhbnRzLk5PTkVfVFJBTlNQT1JUKSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFVzZXIgZGF0YSBjb25zdHJhaW50IGhhcyBubyByZXN0cmljdGlvbnMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHJlcXVlc3QgYWdhaW5zdCB0aGUgdXNlciBkYXRhIGNvbnN0cmFpbnQKKyAgICAgICAgaWYgKHJlcXVlc3QuZ2V0UmVxdWVzdCgpLmlzU2VjdXJlKCkpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgVXNlciBkYXRhIGNvbnN0cmFpbnQgYWxyZWFkeSBzYXRpc2ZpZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB2YXJpYWJsZXMgd2UgbmVlZCB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGFjdGlvbgorICAgICAgICBpbnQgcmVkaXJlY3RQb3J0ID0gcmVxdWVzdC5nZXRDb25uZWN0b3IoKS5nZXRSZWRpcmVjdFBvcnQoKTsKKworICAgICAgICAvLyBJcyByZWRpcmVjdGluZyBkaXNhYmxlZD8KKyAgICAgICAgaWYgKHJlZGlyZWN0UG9ydCA8PSAwKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFNTTCByZWRpcmVjdCBpcyBkaXNhYmxlZCIpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfRk9SQklEREVOLAorICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlZGlyZWN0IHRvIHRoZSBjb3JyZXNwb25kaW5nIFNTTCBwb3J0CisgICAgICAgIFN0cmluZ0J1ZmZlciBmaWxlID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmcgcHJvdG9jb2wgPSAiaHR0cHMiOworICAgICAgICBTdHJpbmcgaG9zdCA9IHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpOworICAgICAgICAvLyBQcm90b2NvbAorICAgICAgICBmaWxlLmFwcGVuZChwcm90b2NvbCkuYXBwZW5kKCI6Ly8iKS5hcHBlbmQoaG9zdCk7CisgICAgICAgIC8vIEhvc3Qgd2l0aCBwb3J0CisgICAgICAgIGlmKHJlZGlyZWN0UG9ydCAhPSA0NDMpIHsKKyAgICAgICAgICAgIGZpbGUuYXBwZW5kKCI6IikuYXBwZW5kKHJlZGlyZWN0UG9ydCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVVJJCisgICAgICAgIGZpbGUuYXBwZW5kKHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKTsKKyAgICAgICAgU3RyaW5nIHJlcXVlc3RlZFNlc3Npb25JZCA9IHJlcXVlc3QuZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCk7CisgICAgICAgIGlmICgocmVxdWVzdGVkU2Vzc2lvbklkICE9IG51bGwpICYmCisgICAgICAgICAgICByZXF1ZXN0LmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpKSB7CisgICAgICAgICAgICBmaWxlLmFwcGVuZCgiO2pzZXNzaW9uaWQ9Iik7CisgICAgICAgICAgICBmaWxlLmFwcGVuZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKTsKKyAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbGUuYXBwZW5kKCc/Jyk7CisgICAgICAgICAgICBmaWxlLmFwcGVuZChxdWVyeVN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFJlZGlyZWN0aW5nIHRvICIgKyBmaWxlLnRvU3RyaW5nKCkpOworICAgICAgICByZXNwb25zZS5zZW5kUmVkaXJlY3QoZmlsZS50b1N0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN1cHBvcnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcyAKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb2YgdGhlIHB1YmxpYworICAgICAqIG1ldGhvZHMgb2YgdGhpcyBjb21wb25lbnQgYXJlIHV0aWxpemVkLiAgSXQgc2hvdWxkIGFsc28gc2VuZCBhCisgICAgICogTGlmZWN5Y2xlRXZlbnQgb2YgdHlwZSBTVEFSVF9FVkVOVCB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyB0aGlzIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmIChzdGFydGVkKSB7CisgICAgICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygicmVhbG1CYXNlLmFscmVhZHlTdGFydGVkIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmKCAhaW5pdGlhbGl6ZWQgKSB7CisgICAgICAgICAgICBpbml0KCk7CisgICAgICAgIH0KKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCwgbnVsbCk7CisgICAgICAgIHN0YXJ0ZWQgPSB0cnVlOworCisgICAgICAgIC8vIENyZWF0ZSBhIE1lc3NhZ2VEaWdlc3QgaW5zdGFuY2UgZm9yIGNyZWRlbnRpYWxzLCBpZiBkZXNpcmVkCisgICAgICAgIGlmIChkaWdlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtZCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoZGlnZXN0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJyZWFsbUJhc2UuYWxnb3JpdGhtIiwgZGlnZXN0KSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSB0ZXJtaW5hdGUgdGhlIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdGhlIGxhc3Qgb25lIGNhbGxlZCBvbiBhIGdpdmVuCisgICAgICogaW5zdGFuY2Ugb2YgdGhpcyBjb21wb25lbnQuICBJdCBzaG91bGQgYWxzbyBzZW5kIGEgTGlmZWN5Y2xlRXZlbnQKKyAgICAgKiBvZiB0eXBlIFNUT1BfRVZFTlQgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkKKyAgICAgICAgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKCFzdGFydGVkKSB7CisgICAgICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygicmVhbG1CYXNlLm5vdFN0YXJ0ZWQiKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVE9QX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworCisgICAgICAgIC8vIENsZWFuIHVwIGFsbG9jYXRlZCByZXNvdXJjZXMKKyAgICAgICAgbWQgPSBudWxsOworICAgICAgICAKKyAgICAgICAgZGVzdHJveSgpOworICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgIAorICAgICAgICAvLyB1bnJlZ2lzdGVyIHRoaXMgcmVhbG0KKyAgICAgICAgaWYgKCBvbmFtZSE9bnVsbCApIHsgICAKKyAgICAgICAgICAgIHRyeSB7ICAgCisgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkudW5yZWdpc3RlckNvbXBvbmVudChvbmFtZSk7IAorICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoICJ1bnJlZ2lzdGVyaW5nIHJlYWxtICIgKyBvbmFtZSApOyAgIAorICAgICAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeyAgIAorICAgICAgICAgICAgICAgIGxvZy5lcnJvciggIkNhbid0IHVucmVnaXN0ZXIgcmVhbG0gIiArIG9uYW1lLCBleCk7ICAgCisgICAgICAgICAgICB9ICAgICAgCisgICAgICAgIH0KKyAgICAgICAgICAKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRGlnZXN0IHRoZSBwYXNzd29yZCB1c2luZyB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobSBhbmQKKyAgICAgKiBjb252ZXJ0IHRoZSByZXN1bHQgdG8gYSBjb3JyZXNwb25kaW5nIGhleGFkZWNpbWFsIHN0cmluZy4KKyAgICAgKiBJZiBleGNlcHRpb24sIHRoZSBwbGFpbiBjcmVkZW50aWFscyBzdHJpbmcgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgUGFzc3dvcmQgb3Igb3RoZXIgY3JlZGVudGlhbHMgdG8gdXNlIGluCisgICAgICogIGF1dGhlbnRpY2F0aW5nIHRoaXMgdXNlcm5hbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRpZ2VzdChTdHJpbmcgY3JlZGVudGlhbHMpICB7CisKKyAgICAgICAgLy8gSWYgbm8gTWVzc2FnZURpZ2VzdCBpbnN0YW5jZSBpcyBzcGVjaWZpZWQsIHJldHVybiB1bmNoYW5nZWQKKyAgICAgICAgaWYgKGhhc01lc3NhZ2VEaWdlc3QoKSA9PSBmYWxzZSkKKyAgICAgICAgICAgIHJldHVybiAoY3JlZGVudGlhbHMpOworCisgICAgICAgIC8vIERpZ2VzdCB0aGUgdXNlciBjcmVkZW50aWFscyBhbmQgcmV0dXJuIGFzIGhleGFkZWNpbWFsCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtZC5yZXNldCgpOworICAgIAorICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYoZ2V0RGlnZXN0RW5jb2RpbmcoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gY3JlZGVudGlhbHMuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBjcmVkZW50aWFscy5nZXRCeXRlcyhnZXREaWdlc3RFbmNvZGluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiSWxsZWdhbCBkaWdlc3RFbmNvZGluZzogIiArIGdldERpZ2VzdEVuY29kaW5nKCksIHVlZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHVlZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1kLnVwZGF0ZShieXRlcyk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gKEhleFV0aWxzLmNvbnZlcnQobWQuZGlnZXN0KCkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygicmVhbG1CYXNlLmRpZ2VzdCIpLCBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGNyZWRlbnRpYWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzTWVzc2FnZURpZ2VzdCgpIHsKKyAgICAgICAgcmV0dXJuICEobWQgPT0gbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaWdlc3QgYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHByaW5jaXBhbCdzIHVzZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERpZ2VzdChTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyByZWFsbU5hbWUpIHsKKyAgICAgICAgaWYgKG1kNUhlbHBlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1kNUhlbHBlciA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvdWxkbid0IGdldCBNRDUgZGlnZXN0OiAiLCBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgCWlmIChoYXNNZXNzYWdlRGlnZXN0KCkpIHsKKyAgICAJCS8vIFVzZSBwcmUtZ2VuZXJhdGVkIGRpZ2VzdAorICAgIAkJcmV0dXJuIGdldFBhc3N3b3JkKHVzZXJuYW1lKTsKKyAgICAJfQorICAgIAkKKyAgICAgICAgU3RyaW5nIGRpZ2VzdFZhbHVlID0gdXNlcm5hbWUgKyAiOiIgKyByZWFsbU5hbWUgKyAiOiIKKyAgICAgICAgICAgICsgZ2V0UGFzc3dvcmQodXNlcm5hbWUpOworCisgICAgICAgIGJ5dGVbXSB2YWx1ZUJ5dGVzID0gbnVsbDsKKyAgICAgICAgaWYoZ2V0RGlnZXN0RW5jb2RpbmcoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB2YWx1ZUJ5dGVzID0gZGlnZXN0VmFsdWUuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdmFsdWVCeXRlcyA9IGRpZ2VzdFZhbHVlLmdldEJ5dGVzKGdldERpZ2VzdEVuY29kaW5nKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIklsbGVnYWwgZGlnZXN0RW5jb2Rpbmc6ICIgKyBnZXREaWdlc3RFbmNvZGluZygpLCB1ZWUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odWVlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gZGlnZXN0ID0gbnVsbDsKKyAgICAgICAgLy8gQnVnemlsbGEgMzIxMzcKKyAgICAgICAgc3luY2hyb25pemVkKG1kNUhlbHBlcikgeworICAgICAgICAgICAgZGlnZXN0ID0gbWQ1SGVscGVyLmRpZ2VzdCh2YWx1ZUJ5dGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtZDVFbmNvZGVyLmVuY29kZShkaWdlc3QpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc2hvcnQgbmFtZSBmb3IgdGhpcyBSZWFsbSBpbXBsZW1lbnRhdGlvbiwgZm9yIHVzZSBpbgorICAgICAqIGxvZyBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWUoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXNzd29yZCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByaW5jaXBhbCdzIHVzZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBhc3N3b3JkKFN0cmluZyB1c2VybmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY2VydGlmaWNhdGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByaW5jaXBhbCBnZXRQcmluY2lwYWwoWDUwOUNlcnRpZmljYXRlIHVzZXJjZXJ0KSB7CisgICAgICAgIHJldHVybihnZXRQcmluY2lwYWwodXNlcmNlcnQuZ2V0U3ViamVjdEROKCkuZ2V0TmFtZSgpKSk7CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB1c2VyIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFByaW5jaXBhbCBnZXRQcmluY2lwYWwoU3RyaW5nIHVzZXJuYW1lKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YXRpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIERpZ2VzdCBwYXNzd29yZCB1c2luZyB0aGUgYWxnb3JpdGhtIGVzcGVjaWZpY2llZCBhbmQKKyAgICAgKiBjb252ZXJ0IHRoZSByZXN1bHQgdG8gYSBjb3JyZXNwb25kaW5nIGhleCBzdHJpbmcuCisgICAgICogSWYgZXhjZXB0aW9uLCB0aGUgcGxhaW4gY3JlZGVudGlhbHMgc3RyaW5nIGlzIHJldHVybmVkCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgUGFzc3dvcmQgb3Igb3RoZXIgY3JlZGVudGlhbHMgdG8gdXNlIGluCisgICAgICogIGF1dGhlbnRpY2F0aW5nIHRoaXMgdXNlcm5hbWUKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtIEFsZ29yaXRobSB1c2VkIHRvIGRvIHRoZSBkaWdlc3QKKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgQ2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBzdHJpbmcgdG8gZGlnZXN0CisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRGlnZXN0KFN0cmluZyBjcmVkZW50aWFscywgU3RyaW5nIGFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIE9idGFpbiBhIG5ldyBtZXNzYWdlIGRpZ2VzdCB3aXRoICJkaWdlc3QiIGVuY3J5cHRpb24KKyAgICAgICAgICAgIE1lc3NhZ2VEaWdlc3QgbWQgPQorICAgICAgICAgICAgICAgIChNZXNzYWdlRGlnZXN0KSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKGFsZ29yaXRobSkuY2xvbmUoKTsKKworICAgICAgICAgICAgLy8gZW5jb2RlIHRoZSBjcmVkZW50aWFscworICAgICAgICAgICAgLy8gU2hvdWxkIHVzZSB0aGUgZGlnZXN0RW5jb2RpbmcsIGJ1dCB0aGF0J3Mgbm90IGEgc3RhdGljIGZpZWxkCisgICAgICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1kLnVwZGF0ZShjcmVkZW50aWFscy5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWQudXBkYXRlKGNyZWRlbnRpYWxzLmdldEJ5dGVzKGVuY29kaW5nKSk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEaWdlc3QgdGhlIGNyZWRlbnRpYWxzIGFuZCByZXR1cm4gYXMgaGV4YWRlY2ltYWwKKyAgICAgICAgICAgIHJldHVybiAoSGV4VXRpbHMuY29udmVydChtZC5kaWdlc3QoKSkpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgbG9nLmVycm9yKGV4KTsKKyAgICAgICAgICAgIHJldHVybiBjcmVkZW50aWFsczsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaWdlc3QgcGFzc3dvcmQgdXNpbmcgdGhlIGFsZ29yaXRobSBlc3BlY2lmaWNpZWQgYW5kCisgICAgICogY29udmVydCB0aGUgcmVzdWx0IHRvIGEgY29ycmVzcG9uZGluZyBoZXggc3RyaW5nLgorICAgICAqIElmIGV4Y2VwdGlvbiwgdGhlIHBsYWluIGNyZWRlbnRpYWxzIHN0cmluZyBpcyByZXR1cm5lZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKworICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBudWxsOworICAgICAgICBpbnQgZmlyc3RDcmVkZW50aWFsQXJnID0gMjsKKyAgICAgICAgCisgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDQgJiYgYXJnc1syXS5lcXVhbHNJZ25vcmVDYXNlKCItZSIpKSB7CisgICAgICAgICAgICBlbmNvZGluZyA9IGFyZ3NbM107CisgICAgICAgICAgICBmaXJzdENyZWRlbnRpYWxBcmcgPSA0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZihhcmdzLmxlbmd0aCA+IGZpcnN0Q3JlZGVudGlhbEFyZyAmJiBhcmdzWzBdLmVxdWFsc0lnbm9yZUNhc2UoIi1hIikpIHsKKyAgICAgICAgICAgIGZvcihpbnQgaT1maXJzdENyZWRlbnRpYWxBcmc7IGkgPCBhcmdzLmxlbmd0aCA7IGkrKyl7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChhcmdzW2ldKyI6Iik7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKERpZ2VzdChhcmdzW2ldLCBhcmdzWzFdLCBlbmNvZGluZykpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuCisgICAgICAgICAgICAgICAgKCJVc2FnZTogUmVhbG1CYXNlIC1hIDxhbGdvcml0aG0+IFstZSA8ZW5jb2Rpbmc+XSA8Y3JlZGVudGlhbHM+Iik7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gSk1YIGFuZCBSZWdpc3RyYXRpb24gIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHJvdGVjdGVkIFN0cmluZyB0eXBlOworICAgIHByb3RlY3RlZCBTdHJpbmcgZG9tYWluOworICAgIHByb3RlY3RlZCBTdHJpbmcgaG9zdDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGg7CisgICAgcHJvdGVjdGVkIE9iamVjdE5hbWUgb25hbWU7CisgICAgcHJvdGVjdGVkIE9iamVjdE5hbWUgY29udHJvbGxlcjsKKyAgICBwcm90ZWN0ZWQgTUJlYW5TZXJ2ZXIgbXNlcnZlcjsKKworICAgIHB1YmxpYyBPYmplY3ROYW1lIGdldENvbnRyb2xsZXIoKSB7CisgICAgICAgIHJldHVybiBjb250cm9sbGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRyb2xsZXIoT2JqZWN0TmFtZSBjb250cm9sbGVyKSB7CisgICAgICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWUgZ2V0T2JqZWN0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG9uYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gZG9tYWluOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWUgcHJlUmVnaXN0ZXIoTUJlYW5TZXJ2ZXIgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG9uYW1lPW5hbWU7CisgICAgICAgIG1zZXJ2ZXI9c2VydmVyOworICAgICAgICBkb21haW49bmFtZS5nZXREb21haW4oKTsKKworICAgICAgICB0eXBlPW5hbWUuZ2V0S2V5UHJvcGVydHkoInR5cGUiKTsKKyAgICAgICAgaG9zdD1uYW1lLmdldEtleVByb3BlcnR5KCJob3N0Iik7CisgICAgICAgIHBhdGg9bmFtZS5nZXRLZXlQcm9wZXJ0eSgicGF0aCIpOworCisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3RSZWdpc3RlcihCb29sZWFuIHJlZ2lzdHJhdGlvbkRvbmUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXJlZ2lzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9zdERlcmVnaXN0ZXIoKSB7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZWQ9ZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMgUmVhbG0uICBJZiBpdCdzIGFscmVhZHkgYmVlbgorICAgICAqIGluaXRpYWxpemVkLCBkbyBub3RoaW5nLgorICAgICAqLyAgICAKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgICAgICAvLyBCdWd6aWxsYSAzOTg3NTogaWYgYWxyZWFkeSBpbml0aWFsaXplZCwgZG8gbm90aGluZworICAgICAgICBpZiggaW5pdGlhbGl6ZWQgJiYgY29udGFpbmVyICE9IG51bGwgKSByZXR1cm47CisKKyAgICAgICAgLy8gV2Ugd2FudCBsb2dnZXIgYXMgc29vbiBhcyBwb3NzaWJsZQorICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY29udGFpbmVyTG9nID0gY29udGFpbmVyLmdldExvZ2dlcigpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbml0aWFsaXplZD10cnVlOworICAgICAgICBpZiggY29udGFpbmVyPT0gbnVsbCApIHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgcGFyZW50PW51bGw7CisgICAgICAgICAgICAvLyBSZWdpc3RlciB3aXRoIHRoZSBwYXJlbnQKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYoIGhvc3QgPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsCisgICAgICAgICAgICAgICAgICAgIHBhcmVudD1uZXcgT2JqZWN0TmFtZShkb21haW4gKyI6dHlwZT1FbmdpbmUiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoIHBhdGg9PW51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudD1uZXcgT2JqZWN0TmFtZShkb21haW4gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6dHlwZT1Ib3N0LGhvc3Q9IiArIGhvc3QpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudD1uZXcgT2JqZWN0TmFtZShkb21haW4gKyI6ajJlZVR5cGU9V2ViTW9kdWxlLG5hbWU9Ly8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0ICsgcGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZChwYXJlbnQgKSkgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlZ2lzdGVyIHdpdGggIiArIHBhcmVudCk7CisgICAgICAgICAgICAgICAgICAgIG1zZXJ2ZXIuc2V0QXR0cmlidXRlKHBhcmVudCwgbmV3IEF0dHJpYnV0ZSgicmVhbG0iLCB0aGlzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlBhcmVudCBub3QgYXZhaWxhYmxlIHlldDogIiArIHBhcmVudCk7ICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoIG9uYW1lPT1udWxsICkgeworICAgICAgICAgICAgLy8gcmVnaXN0ZXIKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ29udGFpbmVyQmFzZSBjYj0oQ29udGFpbmVyQmFzZSljb250YWluZXI7CisgICAgICAgICAgICAgICAgb25hbWU9bmV3IE9iamVjdE5hbWUoY2IuZ2V0RG9tYWluKCkrIjp0eXBlPVJlYWxtIiArIGNiLmdldENvbnRhaW5lclN1ZmZpeCgpKTsKKyAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS5yZWdpc3RlckNvbXBvbmVudCh0aGlzLCBvbmFtZSwgbnVsbCApOworICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlZ2lzdGVyIFJlYWxtICIrb25hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoICJDYW4ndCByZWdpc3RlciAiICsgb25hbWUsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQWxsUm9sZXNNb2RlIHsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgICAgIC8qKiBVc2UgdGhlIHN0cmljdCBzZXJ2bGV0IHNwZWMgaW50ZXJwcmV0YXRpb24gd2hpY2ggcmVxdWlyZXMgdGhhdCB0aGUgdXNlcgorICAgICAgICAgKiBoYXZlIG9uZSBvZiB0aGUgd2ViLWFwcC9zZWN1cml0eS1yb2xlL3JvbGUtbmFtZSAKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWxsUm9sZXNNb2RlIFNUUklDVF9NT0RFID0gbmV3IEFsbFJvbGVzTW9kZSgic3RyaWN0Iik7CisgICAgICAgIC8qKiBBbGxvdyBhbnkgYXV0aGVudGljYXRlZCB1c2VyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFsbFJvbGVzTW9kZSBBVVRIX09OTFlfTU9ERSA9IG5ldyBBbGxSb2xlc01vZGUoImF1dGhPbmx5Iik7CisgICAgICAgIC8qKiBBbGxvdyBhbnkgYXV0aGVudGljYXRlZCB1c2VyIG9ubHkgaWYgdGhlcmUgYXJlIG5vIHdlYi1hcHAvc2VjdXJpdHktcm9sZXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWxsUm9sZXNNb2RlIFNUUklDVF9BVVRIX09OTFlfTU9ERSA9IG5ldyBBbGxSb2xlc01vZGUoInN0cmljdEF1dGhPbmx5Iik7CisgICAgICAgIAorICAgICAgICBzdGF0aWMgQWxsUm9sZXNNb2RlIHRvTW9kZShTdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgQWxsUm9sZXNNb2RlIG1vZGU7CisgICAgICAgICAgICBpZiggbmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNUUklDVF9NT0RFLm5hbWUpICkKKyAgICAgICAgICAgICAgICBtb2RlID0gU1RSSUNUX01PREU7CisgICAgICAgICAgICBlbHNlIGlmKCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVVUSF9PTkxZX01PREUubmFtZSkgKQorICAgICAgICAgICAgICAgIG1vZGUgPSBBVVRIX09OTFlfTU9ERTsKKyAgICAgICAgICAgIGVsc2UgaWYoIG5hbWUuZXF1YWxzSWdub3JlQ2FzZShTVFJJQ1RfQVVUSF9PTkxZX01PREUubmFtZSkgKQorICAgICAgICAgICAgICAgIG1vZGUgPSBTVFJJQ1RfQVVUSF9PTkxZX01PREU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5rbm93biBtb2RlLCBtdXN0IGJlIG9uZSBvZjogc3RyaWN0LCBhdXRoT25seSwgc3RyaWN0QXV0aE9ubHkiKTsKKyAgICAgICAgICAgIHJldHVybiBtb2RlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEFsbFJvbGVzTW9kZShTdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQorICAgICAgICB7CisgICAgICAgICAgICBib29sZWFuIGVxdWFscyA9IGZhbHNlOworICAgICAgICAgICAgaWYoIG8gaW5zdGFuY2VvZiBBbGxSb2xlc01vZGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFsbFJvbGVzTW9kZSBtb2RlID0gKEFsbFJvbGVzTW9kZSkgbzsKKyAgICAgICAgICAgICAgICBlcXVhbHMgPSBuYW1lLmVxdWFscyhtb2RlLm5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVxdWFsczsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5hbWUuaGFzaENvZGUoKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9Vc2VyRGF0YWJhc2VSZWFsbS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL1VzZXJEYXRhYmFzZVJlYWxtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyMDJkNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9Vc2VyRGF0YWJhc2VSZWFsbS5qYXZhCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG07CisKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUm9sZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtfSB0aGF0IGlzIGJhc2VkIG9uIGFuIGltcGxlbWVudGF0aW9uIG9mCisgKiB7QGxpbmsgVXNlckRhdGFiYXNlfSBtYWRlIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBnbG9iYWwgSk5ESSByZXNvdXJjZXMKKyAqIGNvbmZpZ3VyZWQgZm9yIHRoaXMgaW5zdGFuY2Ugb2YgQ2F0YWxpbmEuICBTZXQgdGhlIDxjb2RlPnJlc291cmNlTmFtZTwvY29kZT4KKyAqIHBhcmFtZXRlciB0byB0aGUgZ2xvYmFsIEpOREkgcmVzb3VyY2VzIG5hbWUgZm9yIHRoZSBjb25maWd1cmVkIGluc3RhbmNlCisgKiBvZiA8Y29kZT5Vc2VyRGF0YWJhc2U8L2NvZGU+IHRoYXQgd2Ugc2hvdWxkIGNvbnN1bHQuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgY2xhc3MgVXNlckRhdGFiYXNlUmVhbG0KKyAgICBleHRlbmRzIFJlYWxtQmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+VXNlckRhdGFiYXNlPC9jb2RlPiB3ZSB3aWxsIHVzZSB0byBhdXRoZW50aWNhdGUgdXNlcnMKKyAgICAgKiBhbmQgaWRlbnRpZnkgYXNzb2NpYXRlZCByb2xlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVXNlckRhdGFiYXNlIGRhdGFiYXNlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBSZWFsbSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5Vc2VyRGF0YWJhc2VSZWFsbS8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWUgPSAiVXNlckRhdGFiYXNlUmVhbG0iOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZ2xvYmFsIEpOREkgbmFtZSBvZiB0aGUgPGNvZGU+VXNlckRhdGFiYXNlPC9jb2RlPiByZXNvdXJjZQorICAgICAqIHdlIHdpbGwgYmUgdXRpbGl6aW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VOYW1lID0gIlVzZXJEYXRhYmFzZSI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUmVhbG0gaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiBpbmZvOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGdsb2JhbCBKTkRJIG5hbWUgb2YgdGhlIDxjb2RlPlVzZXJEYXRhYmFzZTwvY29kZT4gcmVzb3VyY2UKKyAgICAgKiB3ZSB3aWxsIGJlIHVzaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgeworCisgICAgICAgIHJldHVybiByZXNvdXJjZU5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ2xvYmFsIEpOREkgbmFtZSBvZiB0aGUgPGNvZGU+VXNlckRhdGFiYXNlPC9jb2RlPiByZXNvdXJjZQorICAgICAqIHdlIHdpbGwgYmUgdXNpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VOYW1lIFRoZSBuZXcgZ2xvYmFsIEpOREkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlTmFtZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisKKyAgICAgICAgdGhpcy5yZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWU7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBQcmluY2lwYWwgaGFzIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBzZWN1cml0eSByb2xlLCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBSZWFsbTsgb3RoZXJ3aXNlIHJldHVybgorICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+CisgICAgICogaWYgdGhlIDxjb2RlPlVzZXI8L2NvZGU+IGhhcyB0aGUgcm9sZSwgb3IgaWYgYW55IDxjb2RlPkdyb3VwPC9jb2RlPgorICAgICAqIHRoYXQgdGhlIDxjb2RlPlVzZXI8L2NvZGU+IGlzIGEgbWVtYmVyIG9mIGhhcyB0aGUgcm9sZS4gCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJpbmNpcGFsIFByaW5jaXBhbCBmb3Igd2hvbSB0aGUgcm9sZSBpcyB0byBiZSBjaGVja2VkCisgICAgICogQHBhcmFtIHJvbGUgU2VjdXJpdHkgcm9sZSB0byBiZSBjaGVja2VkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzUm9sZShQcmluY2lwYWwgcHJpbmNpcGFsLCBTdHJpbmcgcm9sZSkgeworICAgICAgICBpZiggcHJpbmNpcGFsIGluc3RhbmNlb2YgR2VuZXJpY1ByaW5jaXBhbCkgeworICAgICAgICAgICAgR2VuZXJpY1ByaW5jaXBhbCBncCA9IChHZW5lcmljUHJpbmNpcGFsKXByaW5jaXBhbDsKKyAgICAgICAgICAgIGlmKGdwLmdldFVzZXJQcmluY2lwYWwoKSBpbnN0YW5jZW9mIFVzZXIpIHsKKyAgICAgICAgICAgICAgICBwcmluY2lwYWwgPSBncC5nZXRVc2VyUHJpbmNpcGFsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoISAocHJpbmNpcGFsIGluc3RhbmNlb2YgVXNlcikgKSB7CisgICAgICAgICAgICAvL1BsYXkgbmljZSB3aXRoIFNTTyBhbmQgbWl4ZWQgUmVhbG1zCisgICAgICAgICAgICByZXR1cm4gc3VwZXIuaGFzUm9sZShwcmluY2lwYWwsIHJvbGUpOworICAgICAgICB9CisgICAgICAgIGlmKCIqIi5lcXVhbHMocm9sZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYocm9sZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgVXNlciB1c2VyID0gKFVzZXIpcHJpbmNpcGFsOworICAgICAgICBSb2xlIGRicm9sZSA9IGRhdGFiYXNlLmZpbmRSb2xlKHJvbGUpOworICAgICAgICBpZihkYnJvbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAKKyAgICAgICAgfQorICAgICAgICBpZih1c2VyLmlzSW5Sb2xlKGRicm9sZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIEl0ZXJhdG9yIGdyb3VwcyA9IHVzZXIuZ2V0R3JvdXBzKCk7CisgICAgICAgIHdoaWxlKGdyb3Vwcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEdyb3VwIGdyb3VwID0gKEdyb3VwKWdyb3Vwcy5uZXh0KCk7CisgICAgICAgICAgICBpZihncm91cC5pc0luUm9sZShkYnJvbGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwkJCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHNob3J0IG5hbWUgZm9yIHRoaXMgUmVhbG0gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lKCkgeworCisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGFzc3dvcmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcmluY2lwYWwncyB1c2VyIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXNzd29yZChTdHJpbmcgdXNlcm5hbWUpIHsKKworICAgICAgICBVc2VyIHVzZXIgPSBkYXRhYmFzZS5maW5kVXNlcih1c2VybmFtZSk7CisKKyAgICAgICAgaWYgKHVzZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gCisKKyAgICAgICAgcmV0dXJuICh1c2VyLmdldFBhc3N3b3JkKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFByaW5jaXBhbCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHVzZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJpbmNpcGFsIGdldFByaW5jaXBhbChTdHJpbmcgdXNlcm5hbWUpIHsKKworICAgICAgICBVc2VyIHVzZXIgPSBkYXRhYmFzZS5maW5kVXNlcih1c2VybmFtZSk7CisgICAgICAgIGlmKHVzZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBMaXN0IHJvbGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciB1cm9sZXMgPSB1c2VyLmdldFJvbGVzKCk7CisgICAgICAgIHdoaWxlKHVyb2xlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFJvbGUgcm9sZSA9IChSb2xlKXVyb2xlcy5uZXh0KCk7CisgICAgICAgICAgICByb2xlcy5hZGQocm9sZS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEl0ZXJhdG9yIGdyb3VwcyA9IHVzZXIuZ2V0R3JvdXBzKCk7CisgICAgICAgIHdoaWxlKGdyb3Vwcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEdyb3VwIGdyb3VwID0gKEdyb3VwKWdyb3Vwcy5uZXh0KCk7CisgICAgICAgICAgICB1cm9sZXMgPSBncm91cC5nZXRSb2xlcygpOworICAgICAgICAgICAgd2hpbGUodXJvbGVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFJvbGUgcm9sZSA9IChSb2xlKXVyb2xlcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgcm9sZXMuYWRkKHJvbGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEdlbmVyaWNQcmluY2lwYWwodGhpcywgdXNlcm5hbWUsIHVzZXIuZ2V0UGFzc3dvcmQoKSwgcm9sZXMsIHVzZXIpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgQ29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgaXQgZnJvbSBiZWluZyBzdGFydGVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUGVyZm9ybSBub3JtYWwgc3VwZXJjbGFzcyBpbml0aWFsaXphdGlvbgorICAgICAgICBzdXBlci5zdGFydCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdGFuZGFyZFNlcnZlciBzZXJ2ZXIgPSAoU3RhbmRhcmRTZXJ2ZXIpIFNlcnZlckZhY3RvcnkuZ2V0U2VydmVyKCk7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBzZXJ2ZXIuZ2V0R2xvYmFsTmFtaW5nQ29udGV4dCgpOworICAgICAgICAgICAgZGF0YWJhc2UgPSAoVXNlckRhdGFiYXNlKSBjb250ZXh0Lmxvb2t1cChyZXNvdXJjZU5hbWUpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgY29udGFpbmVyTG9nLmVycm9yKHNtLmdldFN0cmluZygidXNlckRhdGFiYXNlUmVhbG0ubG9va3VwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgICAgIGRhdGFiYXNlID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInVzZXJEYXRhYmFzZVJlYWxtLm5vRGF0YWJhc2UiLCByZXNvdXJjZU5hbWUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHNodXQgZG93biBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzIENvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQZXJmb3JtIG5vcm1hbCBzdXBlcmNsYXNzIGZpbmFsaXphdGlvbgorICAgICAgICBzdXBlci5zdG9wKCk7CisKKyAgICAgICAgLy8gUmVsZWFzZSByZWZlcmVuY2UgdG8gb3VyIHVzZXIgZGF0YWJhc2UKKyAgICAgICAgZGF0YWJhc2UgPSBudWxsOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL21iZWFucy1kZXNjcmlwdG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlYjNiNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCkBAIC0wLDAgKzEsMjk4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxtYmVhbnMtZGVzY3JpcHRvcnM+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iRGF0YVNvdXJjZVJlYWxtIgorICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5DbGFzc05hbWVNQmVhbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSW1wbGVtZW50YXRpb24gb2YgUmVhbG0gdGhhdCB3b3JrcyB3aXRoIGFueSBKTkRJIGNvbmZpZ3VyZWQgRGF0YVNvdXJjZSIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IlJlYWxtIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkRhdGFTb3VyY2VSZWFsbSI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGF0YVNvdXJjZU5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBKTkRJIG5hbWVkIEpEQkMgRGF0YVNvdXJjZSBmb3IgeW91ciBkYXRhYmFzZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRpZ2VzdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRGlnZXN0IGFsZ29yaXRobSB1c2VkIGluIHN0b3JpbmcgcGFzc3dvcmRzIGluIGEKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1wbGFpbnRleHQgZm9ybWF0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibG9jYWxEYXRhU291cmNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb25maWd1cmVzIGlmIHRoZSBEYXRhU291cmNlIGlzIGxvY2FsIHRvIHRoZSB3ZWJhcHAiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyb2xlTmFtZUNvbCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGNvbHVtbiBpbiB0aGUgdXNlciByb2xlIHRhYmxlIHRoYXQgbmFtZXMgYSByb2xlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idXNlckNyZWRDb2wiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzCisgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InVzZXJOYW1lQ29sIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY29sdW1uIGluIHRoZSB1c2VyIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHVzZXIncworICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ1c2VyUm9sZVRhYmxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgdGFibGUgdGhhdCBob2xkcyB0aGUgcmVsYXRpb24gYmV0d2VlbiB1c2VyJ3MgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICByb2xlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InVzZXJUYWJsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHRhYmxlIHRoYXQgaG9sZHMgdXNlciBkYXRhIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKworICAgIDxvcGVyYXRpb24gbmFtZT0ic3RhcnQiIGRlc2NyaXB0aW9uPSJTdGFydCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIiBkZXNjcmlwdGlvbj0iU3RvcCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0iSW5pdCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJkZXN0cm95IiBkZXNjcmlwdGlvbj0iRGVzdHJveSIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gICAgICAgICBuYW1lPSJKQUFTUmVhbG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IkltcGxtZW50YXRpb24gb2YgUmVhbG0gdGhhdCBhdXRoZW50aWNhdGVzIHVzZXJzIHZpYSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgSmF2YSBBdXRoZW50aWNhdGlvbiBhbmQgQXV0aG9yaXphdGlvbiBTZXJ2aWNlIChKQUFTKSIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IlJlYWxtIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpBQVNSZWFsbSI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXBwTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGFwcGxpY2F0aW9uIG5hbWUgcGFzc2VkIHRvIHRoZSBKQUFTIExvZ2luQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdXNlcyBpdCB0byBzZWxlY3QgdGhlIHNldCBvZiByZWxldmFudAorICAgICAgICAgICAgICAgICAgICAgICBMb2dpbk1vZHVsZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkaWdlc3QiCisgICAgICAgICAgZGVzY3JpcHRpb249IkRpZ2VzdCBhbGdvcml0aG0gdXNlZCBpbiBzdG9yaW5nIHBhc3N3b3JkcyBpbiBhCisgICAgICAgICAgICAgICAgICAgICAgIG5vbi1wbGFpbnRleHQgZm9ybWF0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icm9sZUNsYXNzTmFtZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIGphdmF4LnNlY3VyaXR5LlByaW5jaXBhbCBjbGFzc2VzCisgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcmVwcmVzZW50IHNlY3VyaXR5IHJvbGVzIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idXNlckNsYXNzTmFtZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIGphdmF4LnNlY3VyaXR5LlByaW5jaXBhbCBjbGFzc2VzCisgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcmVwcmVzZW50IGluZGl2aWR1YWwgdXNlcnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ2YWxpZGF0ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU2hvdWxkIHdlIHZhbGlkYXRlIGNsaWVudCBjZXJ0aWZpY2F0ZSBjaGFpbnMgd2hlbiB0aGV5CisgICAgICAgICAgICAgICAgICAgICAgIGFyZSBwcmVzZW50ZWQ/IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKworICAgIDxvcGVyYXRpb24gbmFtZT0ic3RhcnQiIGRlc2NyaXB0aW9uPSJTdGFydCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIiBkZXNjcmlwdGlvbj0iU3RvcCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0iSW5pdCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJkZXN0cm95IiBkZXNjcmlwdGlvbj0iRGVzdHJveSIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgIDwvbWJlYW4+CisKKworICA8bWJlYW4gICAgICAgICBuYW1lPSJKREJDUmVhbG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IkltcGxlbWVudGF0aW9uIG9mIFJlYWxtIHRoYXQgd29ya3Mgd2l0aCBhbnkgSkRCQworICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgZGF0YWJhc2UiCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJSZWFsbSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG0iPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3Rpb25OYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY29ubmVjdGlvbiB1c2VybmFtZSB0byB1c2Ugd2hlbiB0cnlpbmcgdG8gY29ubmVjdCB0bworICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0YWJhc2UiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0aW9uUGFzc3dvcmQiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb25uZWN0aW9uIFVSTCB0byB1c2Ugd2hlbiB0cnlpbmcgdG8gY29ubmVjdCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0aW9uVVJMIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY29ubmVjdGlvbiBVUkwgdG8gdXNlIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGlnZXN0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJEaWdlc3QgYWxnb3JpdGhtIHVzZWQgaW4gc3RvcmluZyBwYXNzd29yZHMgaW4gYQorICAgICAgICAgICAgICAgICAgICAgICBub24tcGxhaW50ZXh0IGZvcm1hdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRyaXZlck5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBKREJDIGRyaXZlciB0byB1c2UiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyb2xlTmFtZUNvbCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGNvbHVtbiBpbiB0aGUgdXNlciByb2xlIHRhYmxlIHRoYXQgbmFtZXMgYSByb2xlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idXNlckNyZWRDb2wiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzCisgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idXNlck5hbWVDb2wiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzCisgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idXNlclJvbGVUYWJsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHJlbGF0aW9uIGJldHdlZW4gdXNlcidzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICByb2xlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InVzZXJUYWJsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHRhYmxlIHRoYXQgaG9sZHMgdXNlciBkYXRhIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKworICAgIDxvcGVyYXRpb24gbmFtZT0ic3RhcnQiIGRlc2NyaXB0aW9uPSJTdGFydCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIiBkZXNjcmlwdGlvbj0iU3RvcCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0iSW5pdCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJkZXN0cm95IiBkZXNjcmlwdGlvbj0iRGVzdHJveSIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iSk5ESVJlYWxtIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJJbXBsZW1lbnRhdGlvbiBvZiBSZWFsbSB0aGF0IHdvcmtzIHdpdGggYSBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyIGFjY2Vzc2VkIHZpYSB0aGUgSmF2YSBOYW1pbmcgYW5kIERpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UgKEpOREkpIEFQSXMiCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJSZWFsbSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KTkRJUmVhbG0iPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3Rpb25OYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY29ubmVjdGlvbiB1c2VybmFtZSBmb3IgdGhlIHNlcnZlciB3ZSB3aWxsIGNvbnRhY3QiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0aW9uUGFzc3dvcmQiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb25uZWN0aW9uIHBhc3N3b3JkIGZvciB0aGUgc2VydmVyIHdlIHdpbGwgY29udGFjdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3Rpb25VUkwiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb25uZWN0aW9uIFVSTCBmb3IgdGhlIHNlcnZlciB3ZSB3aWxsIGNvbnRhY3QiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb250ZXh0RmFjdG9yeSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIEpOREkgY29udGV4dCBmYWN0b3J5IGZvciB0aGlzIFJlYWxtIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGlnZXN0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJEaWdlc3QgYWxnb3JpdGhtIHVzZWQgaW4gc3RvcmluZyBwYXNzd29yZHMgaW4gYQorICAgICAgICAgICAgICAgICAgICAgICBub24tcGxhaW50ZXh0IGZvcm1hdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJvbGVCYXNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgYmFzZSBlbGVtZW50IGZvciByb2xlIHNlYXJjaGVzIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icm9sZU5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgY29udGFpbmluZyByb2xlcyBoZWxkIGVsc2V3aGVyZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJvbGVTZWFyY2giCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtZXNzYWdlIGZvcm1hdCB1c2VkIHRvIHNlbGVjdCByb2xlcyBmb3IgYSB1c2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icm9sZVN1YnRyZWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlNob3VsZCB3ZSBzZWFyY2ggdGhlIGVudGlyZSBzdWJ0cmVlIGZvciBtYXRjaGluZworICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzaGlwcz8iCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ1c2VyQmFzZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGJhc2UgZWxlbWVudCBmb3IgdXNlciBzZWFyY2hlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InVzZXJQYXNzd29yZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGF0dHJpYnV0ZSBuYW1lIHVzZWQgdG8gcmV0cmlldmUgdGhlIHVzZXIgcGFzc3dvcmQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ1c2VyUGF0dGVybiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1lc3NhZ2UgZm9ybWF0IHVzZWQgdG8gc2VsZWN0IGEgdXNlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ1c2VyUm9sZU5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgaW4gdGhlIHVzZXIncyBlbnRyeSBjb250YWluaW5nCisgICAgICAgICAgICAgICAgICAgICAgIHJvbGVzIGZvciB0aGF0IHVzZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgPGF0dHJpYnV0ZSAgIG5hbWU9InVzZXJTZWFyY2giCisgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1lc3NhZ2UgZm9ybWF0IHVzZWQgdG8gc2VhcmNoIGZvciBhIHVzZXIiCisgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InVzZXJTdWJ0cmVlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgd2Ugc2VhcmNoIHRoZSBlbnRpcmUgc3VidHJlZSBmb3IgbWF0Y2hpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgdXNlcnM/IgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKworICAgIDxvcGVyYXRpb24gbmFtZT0ic3RhcnQiIGRlc2NyaXB0aW9uPSJTdGFydCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIiBkZXNjcmlwdGlvbj0iU3RvcCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0iSW5pdCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJkZXN0cm95IiBkZXNjcmlwdGlvbj0iRGVzdHJveSIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iTWVtb3J5UmVhbG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IlNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBSZWFsbSB0aGF0IHJlYWRzIGFuIFhNTCBmaWxlIHRvCisgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZSB0aGUgdmFsaWQgdXNlcnMsIHBhc3N3b3JkcywgYW5kIHJvbGVzIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iUmVhbG0iCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uTWVtb3J5UmVhbG0iPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InBhdGhuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgcGF0aG5hbWUgb2YgdGhlIFhNTCBmaWxlIGNvbnRhaW5pbmcgb3VyIGRhdGFiYXNlCisgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8b3BlcmF0aW9uIG5hbWU9InN0YXJ0IiBkZXNjcmlwdGlvbj0iU3RhcnQiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcCIgZGVzY3JpcHRpb249IlN0b3AiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0iaW5pdCIgZGVzY3JpcHRpb249IkluaXQiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0iZGVzdHJveSIgZGVzY3JpcHRpb249IkRlc3Ryb3kiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorCisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iVXNlckRhdGFiYXNlUmVhbG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlYWxtIGNvbm5lY3RlZCB0byBhIFVzZXJEYXRhYmFzZSBhcyBhIGdsb2JhbCBKTkRJCisgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iUmVhbG0iCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uVXNlckRhdGFiYXNlUmVhbG0iPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlc291cmNlTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGdsb2JhbCBKTkRJIG5hbWUgb2YgdGhlIFVzZXJEYXRhYmFzZSByZXNvdXJjZSB0byB1c2UiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICA8L21iZWFuPgorCis8L21iZWFucy1kZXNjcmlwdG9ycz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9wYWNrYWdlLmh0bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZWZjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsNjQgQEAKKzxib2R5PgorCis8cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgPGNvZGU+UmVhbG08L2NvZGU+IGltcGxlbWVudGF0aW9ucyBmb3IgdGhlCit2YXJpb3VzIHN1cHBvcnRlZCByZWFsbSB0ZWNobm9sb2dpZXMgZm9yIGF1dGhlbnRpY2F0aW5nIHVzZXJzIGFuZAoraWRlbnRpZnlpbmcgdGhlaXIgYXNzb2NpYXRlZCByb2xlcy4gIFRoZSA8Y29kZT5SZWFsbTwvY29kZT4gdGhhdCBpcworYXNzb2NpYXRlZCB3aXRoIGEgd2ViIGFwcGxpY2F0aW9uJ3MgPGNvZGU+Q29udGV4dDwvY29kZT4gKG9yIGEgaGllcmFyY2hpY2FsbHkKK3N1cGVyaW9yIENvbnRhaW5lcikgaXMgdXNlZCB0byByZXNvbHZlIGF1dGhlbnRpY2F0aW9uIGFuZCByb2xlIHByZXNlbmNlCitxdWVzdGlvbnMgd2hlbiBhIHdlYiBhcHBsaWNhdGlvbiB1c2VzIGNvbnRhaW5lciBtYW5hZ2VkIHNlY3VyaXR5IGFzIGRlc2NyaWJlZAoraW4gdGhlIFNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24sIHZlcnNpb24gMi4yLjwvcD4KKworPHA+VGhlIGltcGxlbWVudGF0aW9ucyBzaGFyZSBhIGNvbW1vbiBiYXNlIGNsYXNzIHRoYXQgc3VwcG9ydHMgYmFzaWMKK2Z1bmN0aW9uYWxpdHkgZm9yIGFsbCBvZiB0aGUgc3RhbmRhcmQgPGNvZGU+UmVhbG08L2NvZGU+IGltcGxlbWVudGF0aW9ucywKK2FuZCBjYW4gYmUgY29uZmlndXJlZCBieSBzZXR0aW5nIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyAoZGVmYXVsdCB2YWx1ZXMKK2FyZSBpbiBzcXVhcmUgYnJhY2tldHMpOjwvcD4KKzx1bD4KKzxsaT48Yj5kZWJ1ZzwvYj4gLSBEZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIGZvciB0aGlzIGNvbXBvbmVudC4gWzBdPC9saT4KKzwvdWw+CisKKzxwPlRoZSBzdGFuZGFyZCA8Y29kZT5SZWFsbTwvY29kZT4gaW1wbGVtZW50YXRpb25zIHRoYXQgYXJlIGN1cnJlbnRseQorYXZhaWxhYmxlIGluY2x1ZGUgdGhlIGZvbGxvd2luZyAod2l0aCBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcworYXMgc3BlY2lmaWVkKTo8L3A+Cis8dWw+Cis8bGk+PGI+SkRCQ1JlYWxtPC9iPiAtIEltcGxlbWVudGF0aW9uIG9mIDxjb2RlPlJlYWxtPC9jb2RlPiB0aGF0IG9wZXJhdGVzCisgICAgZnJvbSBkYXRhIHN0b3JlZCBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGhhdCBpcyBhY2Nlc3NlZCB2aWEgYSBKREJDCisgICAgZHJpdmVyLiAgVGhlIG5hbWUgb2YgdGhlIGRyaXZlciwgZGF0YWJhc2UgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiwgYW5kCisgICAgdGhlIG5hbWVzIG9mIHRoZSByZWxldmFudCB0YWJsZXMgYW5kIGNvbHVtbnMgYXJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUKKyAgICBmb2xsb3dpbmcgYWRkaXRpb25hbCBwcm9wZXJ0aWVzOgorICAgIDx1bD4KKyAgICA8bGk+PGI+Y29ubmVjdGlvblVSTDwvYj4gLSBUaGUgVVJMIHRvIHVzZSB3aGVuIGNvbm5lY3RpbmcgdG8gdGhpcyBkYXRhYmFzZS4KKyAgICAgICAgW1JFUVVJUkVEIC0gTk8gREVGQVVMVF08L2xpPgorICAgIDxsaT48Yj5kcml2ZXJOYW1lPC9iPiAtIEZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIEpEQkMgZHJpdmVyCisgICAgICAgIHRvIGJlIHVzZWQuICBbUkVRVUlSRUQgLSBOTyBERUZBVUxUXTwvbGk+CisgICAgPGxpPjxiPnJvbGVOYW1lQ29sPC9iPiAtIE5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiB0aGF0IGNvbnRhaW5zIHJvbGUKKyAgICAgICAgbmFtZXMuICBbUkVRVUlSRUQgLSBOTyBERUZBVUxUXTwvbGk+CisgICAgPGxpPjxiPnVzZXJDcmVkQ29sPC9iPiAtIE5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiB0aGF0IGNvbnRhaW5zIHRoZQorICAgICAgICB1c2VyJ3MgY3JlZGVudGlhbHMgKGkuZS4gcGFzc3dvcmQpIGluIGNsZWFydGV4dC4gIFtSRVFVSVJFRCAtCisgICAgICAgIE5PIERFRkFVTFRdPC9saT4KKyAgICA8bGk+PGI+dXNlck5hbWVDb2w8L2I+IC0gTmFtZSBvZiB0aGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgY29udGFpbnMgdGhlCisgICAgICAgIHVzZXIncyBsb2dvbiB1c2VybmFtZS4gIFtSRVFVSVJFRCAtIE5PIERFRkFVTFRdPC9saT4KKyAgICA8bGk+PGI+dXNlclJvbGVUYWJsZTwvYj4gLSBOYW1lIG9mIHRoZSBkYXRhYmFzZSB0YWJsZSBjb250YWluaW5nIHVzZXIKKyAgICAgICAgcm9sZSBpbmZvcm1hdGlvbi4gIFRoaXMgdGFibGUgbXVzdCBpbmNsdWRlIHRoZSBjb2x1bW5zIHNwZWNpZmllZCBieQorICAgICAgICB0aGUgPGNvZGU+dXNlck5hbWVDb2w8L2NvZGU+IGFuZCA8Y29kZT5yb2xlTmFtZUNvbDwvY29kZT4gcHJvcGVydGllcy4KKyAgICAgICAgW1JFUVVJUkVEIC0gTk8gREVGQVVMVF08L2xpPgorICAgIDxsaT48Yj51c2VyVGFibGU8L2I+IC0gTmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUgY29udGFpbmluZyB1c2VyCisgICAgICAgIGluZm9ybWF0aW9uLiAgVGhpcyB0YWJsZSBtdXN0IGluY2x1ZGUgdGhlIGNvbHVtbnMgc3BlY2lmaWVkIGJ5IHRoZQorICAgICAgICA8Y29kZT51c2VyTmFtZUNvbDwvY29kZT4gYW5kIDxjb2RlPnVzZXJDcmVkQ29sPC9jb2RlPiBwcm9wZXJ0aWVzLgorICAgICAgICBbUkVRVUlSRUQgLSBOTyBERUZBVUxUXTwvbGk+CisgICAgPC91bD4KKyAgICA8L2xpPgorPGxpPjxiPk1lbW9yeVJlYWxtPC9iPiAtIEltcGxlbWVudGF0aW9uIG9mIDxjb2RlPlJlYWxtPC9jb2RlPiB0aGF0IHVzZXMgdGhlCisgICAgY29udGVudHMgb2YgYSBzaW1wbGUgWE1MIGZpbGUgKDxjb2RlPmNvbmYvdG9tY2F0LXVzZXJzLnhtbDwvY29kZT4pIGFzIHRoZQorICAgIGxpc3Qgb2YgdmFsaWQgdXNlcnMgYW5kIHRoZWlyIHJvbGVzLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBwcmltYXJpbHkgdG8KKyAgICBkZW1vbnN0cmF0ZSB0aGF0IHRoZSBhdXRoZW50aWNhdGlvbiB0ZWNobm9sb2d5IGZ1bmN0aW9ucyBjb3JyZWN0bHksIGFuZCBpcworICAgIG5vdCBhbnRpY2lwYXRlZCBhcyBhZGVxdWF0ZSBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzZS4gIFRoaXMgY29tcG9uZW50CisgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXM6CisgICAgPHVsPgorICAgIDxsaT48Yj5wYXRobmFtZTwvYj4gLSBQYXRobmFtZSBvZiB0aGUgWE1MIGZpbGUgY29udGFpbmluZyBvdXIgdXNlciBhbmQKKyAgICAgICAgcm9sZSBpbmZvcm1hdGlvbi4gIElmIGEgcmVsYXRpdmUgcGF0aG5hbWUgaXMgc3BlY2lmaWVkLCBpdCBpcyByZXNvbHZlZAorICAgICAgICBhZ2FpbnN0IHRoZSBwYXRobmFtZSBzcGVjaWZpZWQgYnkgdGhlICJjYXRhbGluYS5ob21lIiBzeXN0ZW0gcHJvcGVydHkuCisgICAgICAgIFtjb25mL3RvbWNhdC11c2Vycy54bWxdPC9saT4KKyAgICA8L3VsPgorPC91bD4KKworPC9ib2R5PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0M2ZkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VjdXJpdHkvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyIEBACitTZWN1cml0eVV0aWwuZG9Bc1ByaXZpbGVnZT1BbiBleGNlcHRpb24gb2NjdXJzIHdoZW4gcnVubmluZyB0aGUgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbiBibG9jay4KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNWFhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VjdXJpdHkvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyIEBACitTZWN1cml0eVV0aWwuZG9Bc1ByaXZpbGVnZT1IYSB0ZW5pZG8gbHVnYXIgdW5hIGV4Y2VwY2nzbiBhbCBlamVjdXRhciBlbCBibG9xdWUgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbi4KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOTkwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VjdXJpdHkvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyIEBACitTZWN1cml0eVV0aWwuZG9Bc1ByaXZpbGVnZT1VbmUgZXhjZXB0aW9uIHMnJ2VzdCBwcm9kdWl0ZSBsb3JzIGRlIGwnJ2V46WN1dGlvbiBkdSBibG9jICJQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIi4KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNGFmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VjdXJpdHkvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyIEBACitTZWN1cml0eVV0aWwuZG9Bc1ByaXZpbGVnZT1Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uXHUzMGQ2XHUzMGVkXHUzMGMzXHUzMGFmXHUzMDkyXHU1YjlmXHU4ODRjXHU0ZTJkXHUzMDZiXHU0ZjhiXHU1OTE2XHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZWN1cml0eS9TZWN1cml0eUNsYXNzTG9hZC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L1NlY3VyaXR5Q2xhc3NMb2FkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmOTUxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZWN1cml0eS9TZWN1cml0eUNsYXNzTG9hZC5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VjdXJpdHk7CisKKy8qKgorICogU3RhdGljIGNsYXNzIHVzZWQgdG8gcHJlbG9hZCBqYXZhIGNsYXNzZXMgd2hlbiB1c2luZyB0aGUKKyAqIEphdmEgU2VjdXJpdHlNYW5hZ2VyIHNvIHRoYXQgdGhlIGRlZmluZUNsYXNzSW5QYWNrYWdlCisgKiBSdW50aW1lUGVybWlzc2lvbiBkb2VzIG5vdCB0cmlnZ2VyIGFuIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24uCisgKgorICogQGF1dGhvciBHbGVubiBMLiBOaWVsc2VuCisgKiBAYXV0aG9yIEplYW4tRnJhbmNvaXMgQXJjYW5kCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZWN1cml0eUNsYXNzTG9hZCB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VjdXJpdHlDbGFzc0xvYWQoQ2xhc3NMb2FkZXIgbG9hZGVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiggU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpID09IG51bGwgKXsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbG9hZENvcmVQYWNrYWdlKGxvYWRlcik7CisgICAgICAgIGxvYWRMb2FkZXJQYWNrYWdlKGxvYWRlcik7CisgICAgICAgIGxvYWRTZXNzaW9uUGFja2FnZShsb2FkZXIpOworICAgICAgICBsb2FkVXRpbFBhY2thZ2UobG9hZGVyKTsKKyAgICAgICAgbG9hZEphdmF4UGFja2FnZShsb2FkZXIpOworICAgICAgICBsb2FkQ295b3RlUGFja2FnZShsb2FkZXIpOyAgICAgICAgCisgICAgICAgIGxvYWRIdHRwMTFQYWNrYWdlKGxvYWRlcik7ICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgdm9pZCBsb2FkQ29yZVBhY2thZ2UoQ2xhc3NMb2FkZXIgbG9hZGVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGJhc2VQYWNrYWdlID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuIjsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiY29yZS5BcHBsaWNhdGlvbkNvbnRleHRGYWNhZGUkMSIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJjb3JlLkFwcGxpY2F0aW9uRGlzcGF0Y2hlciRQcml2aWxlZ2VkRm9yd2FyZCIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJjb3JlLkFwcGxpY2F0aW9uRGlzcGF0Y2hlciRQcml2aWxlZ2VkSW5jbHVkZSIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJjb3JlLkNvbnRhaW5lckJhc2UkUHJpdmlsZWdlZEFkZENoaWxkIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgImNvcmUuU3RhbmRhcmRXcmFwcGVyJDEiKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiY29yZS5BcHBsaWNhdGlvbkh0dHBSZXF1ZXN0JEF0dHJpYnV0ZU5hbWVzRW51bWVyYXRvciIpOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIGxvYWRMb2FkZXJQYWNrYWdlKENsYXNzTG9hZGVyIGxvYWRlcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBiYXNlUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLiI7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgImxvYWRlci5XZWJhcHBDbGFzc0xvYWRlciRQcml2aWxlZ2VkRmluZFJlc291cmNlIik7CisgICAgfQorICAgIAorICAgIAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgbG9hZFNlc3Npb25QYWNrYWdlKENsYXNzTG9hZGVyIGxvYWRlcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBiYXNlUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLiI7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArICJzZXNzaW9uLlN0YW5kYXJkU2Vzc2lvbiIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJzZXNzaW9uLlN0YW5kYXJkU2Vzc2lvbiQxIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgInNlc3Npb24uU3RhbmRhcmRNYW5hZ2VyJFByaXZpbGVnZWREb1VubG9hZCIpOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIGxvYWRVdGlsUGFja2FnZShDbGFzc0xvYWRlciBsb2FkZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYmFzZVBhY2thZ2UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS4iOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKyAidXRpbC5VUkwiKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyhiYXNlUGFja2FnZSArICJ1dGlsLkVudW1lcmF0b3IiKTsKKyAgICB9CisgICAgCisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgdm9pZCBsb2FkSmF2YXhQYWNrYWdlKENsYXNzTG9hZGVyIGxvYWRlcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoImphdmF4LnNlcnZsZXQuaHR0cC5Db29raWUiKTsKKyAgICB9CisgICAgCisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIGxvYWRIdHRwMTFQYWNrYWdlKENsYXNzTG9hZGVyIGxvYWRlcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBiYXNlUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNveW90ZS5odHRwMTEuIjsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyhiYXNlUGFja2FnZSArICJIdHRwMTFQcm9jZXNzb3IkMSIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzKGJhc2VQYWNrYWdlICsgIkludGVybmFsT3V0cHV0QnVmZmVyJDEiKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyhiYXNlUGFja2FnZSArICJJbnRlcm5hbE91dHB1dEJ1ZmZlciQyIik7CisgICAgfQorICAgIAorICAgIAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgbG9hZENveW90ZVBhY2thZ2UoQ2xhc3NMb2FkZXIgbG9hZGVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGJhc2VQYWNrYWdlID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLiI7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIlJlcXVlc3RGYWNhZGUkR2V0QXR0cmlidXRlUHJpdmlsZWdlZEFjdGlvbiIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJSZXF1ZXN0RmFjYWRlJEdldFBhcmFtZXRlck1hcFByaXZpbGVnZWRBY3Rpb24iKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiUmVxdWVzdEZhY2FkZSRHZXRSZXF1ZXN0RGlzcGF0Y2hlclByaXZpbGVnZWRBY3Rpb24iKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiUmVxdWVzdEZhY2FkZSRHZXRQYXJhbWV0ZXJQcml2aWxlZ2VkQWN0aW9uIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIlJlcXVlc3RGYWNhZGUkR2V0UGFyYW1ldGVyTmFtZXNQcml2aWxlZ2VkQWN0aW9uIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIlJlcXVlc3RGYWNhZGUkR2V0UGFyYW1ldGVyVmFsdWVQcml2aWxlZ2VkQWN0aW9uIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIlJlcXVlc3RGYWNhZGUkR2V0Q2hhcmFjdGVyRW5jb2RpbmdQcml2aWxlZ2VkQWN0aW9uIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIlJlcXVlc3RGYWNhZGUkR2V0SGVhZGVyc1ByaXZpbGVnZWRBY3Rpb24iKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiUmVxdWVzdEZhY2FkZSRHZXRIZWFkZXJOYW1lc1ByaXZpbGVnZWRBY3Rpb24iKTsgIAorICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJSZXF1ZXN0RmFjYWRlJEdldENvb2tpZXNQcml2aWxlZ2VkQWN0aW9uIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIlJlcXVlc3RGYWNhZGUkR2V0TG9jYWxlUHJpdmlsZWdlZEFjdGlvbiIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJSZXF1ZXN0RmFjYWRlJEdldExvY2FsZXNQcml2aWxlZ2VkQWN0aW9uIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIlJlc3BvbnNlRmFjYWRlJFNldENvbnRlbnRUeXBlUHJpdmlsZWdlZEFjdGlvbiIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKyAKKyAgICAgICAgICAgICAiUmVzcG9uc2VGYWNhZGUkRGF0ZUhlYWRlclByaXZpbGVnZWRBY3Rpb24iKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiUmVxdWVzdEZhY2FkZSRHZXRTZXNzaW9uUHJpdmlsZWdlZEFjdGlvbiIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJSZXNwb25zZUZhY2FkZSQxIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIk91dHB1dEJ1ZmZlciQxIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIkNveW90ZUlucHV0U3RyZWFtJDEiKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiQ295b3RlSW5wdXRTdHJlYW0kMiIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJDb3lvdGVJbnB1dFN0cmVhbSQzIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIkNveW90ZUlucHV0U3RyZWFtJDQiKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiQ295b3RlSW5wdXRTdHJlYW0kNSIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJJbnB1dEJ1ZmZlciQxIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIlJlc3BvbnNlJDEiKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiUmVzcG9uc2UkMiIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJSZXNwb25zZSQzIik7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZWN1cml0eS9TZWN1cml0eUNvbmZpZy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L1NlY3VyaXR5Q29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwOGQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZWN1cml0eS9TZWN1cml0eUNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zZWN1cml0eTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNhdGFsaW5hUHJvcGVydGllczsKKworLyoqCisgKiBVdGlsIGNsYXNzIHRvIHByb3RlY3QgQ2F0YWxpbmEgYWdhaW5zdCBwYWNrYWdlIGFjY2VzcyBhbmQgaW5zZXJ0aW9uLgorICogVGhlIGNvZGUgYXJlIGJlZW4gbW92ZWQgZnJvbSBDYXRhbGluYS5qYXZhCisgKiBAYXV0aG9yIHRoZSBDYXRhbGluYS5qYXZhIGF1dGhvcnMKKyAqIEBhdXRob3IgSmVhbi1GcmFuY29pcyBBcmNhbmQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNlY3VyaXR5Q29uZmlneworICAgIHByaXZhdGUgc3RhdGljIFNlY3VyaXR5Q29uZmlnIHNpbmdsZXRvbiA9IG51bGw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggU2VjdXJpdHlDb25maWcuY2xhc3MgKTsKKworICAgIAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQUNLQUdFX0FDQ0VTUyA9ICAic3VuLiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJvcmcuYXBhY2hlLmNhdGFsaW5hLiIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsb3JnLmFwYWNoZS5qYXNwZXIuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLG9yZy5hcGFjaGUuY295b3RlLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIixvcmcuYXBhY2hlLnRvbWNhdC4iOworICAgIAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQUNLQUdFX0RFRklOSVRJT049ICJqYXZhLixzdW4uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLG9yZy5hcGFjaGUuY2F0YWxpbmEuIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIixvcmcuYXBhY2hlLmNveW90ZS4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsb3JnLmFwYWNoZS50b21jYXQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLG9yZy5hcGFjaGUuamFzcGVyLiI7CisgICAgLyoqCisgICAgICogTGlzdCBvZiBwcm90ZWN0ZWQgcGFja2FnZSBmcm9tIGNvbmYvY2F0YWxpbmEucHJvcGVydGllcworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VEZWZpbml0aW9uOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIExpc3Qgb2YgcHJvdGVjdGVkIHBhY2thZ2UgZnJvbSBjb25mL2NhdGFsaW5hLnByb3BlcnRpZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYWNrYWdlQWNjZXNzOyAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlY3VyaXR5Q29uZmlnKCl7ICAKKyAgICAgICAgdHJ5eworICAgICAgICAgICAgcGFja2FnZURlZmluaXRpb24gPSBDYXRhbGluYVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoInBhY2thZ2UuZGVmaW5pdGlvbiIpOworICAgICAgICAgICAgcGFja2FnZUFjY2VzcyA9IENhdGFsaW5hUHJvcGVydGllcy5nZXRQcm9wZXJ0eSgicGFja2FnZS5hY2Nlc3MiKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLkV4Y2VwdGlvbiBleCl7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5hYmxlIHRvIGxvYWQgcHJvcGVydGllcyB1c2luZyBDYXRhbGluYVByb3BlcnRpZXMiLCBleCk7IAorICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzLgorICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlY3VyaXR5Q29uZmlnIG5ld0luc3RhbmNlKCl7CisgICAgICAgIGlmIChzaW5nbGV0b24gPT0gbnVsbCl7CisgICAgICAgICAgICBzaW5nbGV0b24gPSBuZXcgU2VjdXJpdHlDb25maWcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2luZ2xldG9uOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlY3VyaXR5IHBhY2thZ2UuYWNjZXNzIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VBY2Nlc3MoKXsKKyAgICAgICAgLy8gSWYgY2F0YWxpbmEucHJvcGVydGllcyBpcyBtaXNzaW5nLCBwcm90ZWN0IGFsbCBieSBkZWZhdWx0LgorICAgICAgICBpZiAocGFja2FnZUFjY2VzcyA9PSBudWxsKXsKKyAgICAgICAgICAgIHNldFNlY3VyaXR5UHJvcGVydHkoInBhY2thZ2UuYWNjZXNzIiwgUEFDS0FHRV9BQ0NFU1MpOyAgIAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0U2VjdXJpdHlQcm9wZXJ0eSgicGFja2FnZS5hY2Nlc3MiLCBwYWNrYWdlQWNjZXNzKTsgICAKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlY3VyaXR5IHBhY2thZ2UuZGVmaW5pdGlvbiB2YWx1ZS4KKyAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgc2V0UGFja2FnZURlZmluaXRpb24oKXsKKyAgICAgICAgLy8gSWYgY2F0YWxpbmEucHJvcGVydGllcyBpcyBtaXNzaW5nLCBwcm90ZWN0IGFsbCBieSBkZWZhdWx0LgorICAgICAgICAgaWYgKHBhY2thZ2VEZWZpbml0aW9uID09IG51bGwpeworICAgICAgICAgICAgc2V0U2VjdXJpdHlQcm9wZXJ0eSgicGFja2FnZS5kZWZpbml0aW9uIiwgUEFDS0FHRV9ERUZJTklUSU9OKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRTZWN1cml0eVByb3BlcnR5KCJwYWNrYWdlLmRlZmluaXRpb24iLCBwYWNrYWdlRGVmaW5pdGlvbik7CisgICAgICAgICB9CisgICAgfQorICAgICAKKyAgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcm9wZXIgc2VjdXJpdHkgcHJvcGVydHkKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyB0aGUgcGFja2FnZS4qIHByb3BlcnR5LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgdm9pZCBzZXRTZWN1cml0eVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0aWVzLCBTdHJpbmcgcGFja2FnZUxpc3QpeworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgU3RyaW5nIGRlZmluaXRpb24gPSBTZWN1cml0eS5nZXRQcm9wZXJ0eShwcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIGlmKCBkZWZpbml0aW9uICE9IG51bGwgJiYgZGVmaW5pdGlvbi5sZW5ndGgoKSA+IDAgKXsKKyAgICAgICAgICAgICAgICBkZWZpbml0aW9uICs9ICIsIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2VjdXJpdHkuc2V0UHJvcGVydHkocHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAvLyBGSVggTUUgcGFja2FnZSAiamF2YXguIiB3YXMgcmVtb3ZlZCB0byBwcmV2ZW50IEhvdFNwb3QKKyAgICAgICAgICAgICAgICAvLyBmYXRhbCBpbnRlcm5hbCBlcnJvcnMKKyAgICAgICAgICAgICAgICBkZWZpbml0aW9uICsgcGFja2FnZUxpc3QpOyAgICAgIAorICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorfQorCisKKworCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VjdXJpdHkvU2VjdXJpdHlVdGlsLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VjdXJpdHkvU2VjdXJpdHlVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlNzg4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZWN1cml0eS9TZWN1cml0eVV0aWwuamF2YQpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VjdXJpdHk7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CisvKioKKyAqIFRoaXMgdXRpbGl0eSBjbGFzcyBhc3NvY2lhdGVzIGEgPGNvZGU+U3ViamVjdDwvY29kZT4gdG8gdGhlIGN1cnJlbnQgCisgKiA8Y29kZT5BY2Nlc3NDb250cm9sQ29udGV4dDwvY29kZT4uIFdoZW4gYSA8Y29kZT5TZWN1cml0eU1hbmFnZXI8L2NvZGU+IGlzCisgKiB1c2VkLCAqIHRoZSBjb250YWluZXIgd2lsbCBhbHdheXMgYXNzb2NpYXRlIHRoZSBjYWxsZWQgdGhyZWFkIHdpdGggYW4gCisgKiBBY2Nlc3NDb250cm9sQ29udGV4dCAqIGNvbnRhaW5pbmcgb25seSB0aGUgcHJpbmNpcGFsIG9mIHRoZSByZXF1ZXN0ZWQKKyAqIFNlcnZsZXQvRmlsdGVyLgorICoKKyAqIFRoaXMgY2xhc3MgdXNlcyByZWZsZWN0aW9uIHRvIGludm9rZSB0aGUgaW52b2tlIG1ldGhvZHMuCisgKgorICogQGF1dGhvciBKZWFuLUZyYW5jb2lzIEFyY2FuZAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZWN1cml0eVV0aWx7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOSVQ9IDA7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNFUlZJQ0UgPSAxOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBET0ZJTFRFUiA9IDE7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IERFU1RST1kgPSAyOworICAgIAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJTklUX01FVEhPRCA9ICJpbml0IjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRE9GSUxURVJfTUVUSE9EID0gImRvRmlsdGVyIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9NRVRIT0QgPSAic2VydmljZSI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFU1RST1lfTUVUSE9EID0gImRlc3Ryb3kiOworICAgCisgICAgLyoqCisgICAgICogQ2FjaGUgZXZlcnkgb2JqZWN0IGZvciB3aGljaCB3ZSBhcmUgY3JlYXRpbmcgbWV0aG9kIG9uIGl0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgb2JqZWN0Q2FjaGUgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggU2VjdXJpdHlVdGlsLmNsYXNzICk7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBBQ0tBR0UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5zZWN1cml0eSI7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwYWNrYWdlRGVmaW5pdGlvbkVuYWJsZWQgPSAgCisgICAgICAgICAoU3lzdGVtLmdldFByb3BlcnR5KCJwYWNrYWdlLmRlZmluaXRpb24iKSA9PSBudWxsICYmIAorICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhY2thZ2UuYWNjZXNzIikgID09IG51bGwpID8gZmFsc2UgOiB0cnVlOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgcmVzb3VyY2VzIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihQQUNLQUdFKTsgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUGVyZm9ybSB3b3JrIGFzIGEgcGFydGljdWxhciA8L2NvZGU+U3ViamVjdDwvY29kZT4uIEhlcmUgdGhlIHdvcmsKKyAgICAgKiB3aWxsIGJlIGdyYW50ZWQgdG8gYSA8Y29kZT5udWxsPC9jb2RlPiBzdWJqZWN0LiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBtZXRob2QgdG8gYXBwbHkgdGhlIHNlY3VyaXR5IHJlc3RyaWN0aW9uCisgICAgICogQHBhcmFtIHRhcmdldE9iamVjdCB0aGUgPGNvZGU+U2VydmxldDwvY29kZT4gb24gd2hpY2ggdGhlIG1ldGhvZCB3aWxsCisgICAgICogYmUgY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkb0FzUHJpdmlsZWdlKGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXJ2bGV0IHRhcmdldE9iamVjdCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257CisgICAgICAgICBkb0FzUHJpdmlsZWdlKG1ldGhvZE5hbWUsIHRhcmdldE9iamVjdCwgbnVsbCwgbnVsbCwgbnVsbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHdvcmsgYXMgYSBwYXJ0aWN1bGFyIDwvY29kZT5TdWJqZWN0PC9jb2RlPi4gSGVyZSB0aGUgd29yaworICAgICAqIHdpbGwgYmUgZ3JhbnRlZCB0byBhIDxjb2RlPm51bGw8L2NvZGU+IHN1YmplY3QuIAorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG1ldGhvZCB0byBhcHBseSB0aGUgc2VjdXJpdHkgcmVzdHJpY3Rpb24KKyAgICAgKiBAcGFyYW0gdGFyZ2V0T2JqZWN0IHRoZSA8Y29kZT5TZXJ2bGV0PC9jb2RlPiBvbiB3aGljaCB0aGUgbWV0aG9kIHdpbGwKKyAgICAgKiBiZSBjYWxsZWQuCisgICAgICogQHBhcmFtIHRhcmdldFR5cGUgPGNvZGU+Q2xhc3M8L2NvZGU+IGFycmF5IHVzZWQgdG8gaW5zdGFuY2lhdGUgYSBpCisgICAgICogPGNvZGU+TWV0aG9kPC9jb2RlPiBvYmplY3QuCisgICAgICogQHBhcmFtIHRhcmdldEFyZ3VtZW50cyA8Y29kZT5PYmplY3Q8L2NvZGU+IGFycmF5IGNvbnRhaW5zIHRoZSBydW50aW1lIAorICAgICAqIHBhcmFtZXRlcnMgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRvQXNQcml2aWxlZ2UoZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlcnZsZXQgdGFyZ2V0T2JqZWN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc1tdIHRhcmdldFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gdGFyZ2V0QXJndW1lbnRzKSAKKyAgICAgICAgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257ICAgIAorCisgICAgICAgICBkb0FzUHJpdmlsZWdlKG1ldGhvZE5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRPYmplY3QsIAorICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QXJndW1lbnRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUGVyZm9ybSB3b3JrIGFzIGEgcGFydGljdWxhciA8L2NvZGU+U3ViamVjdDwvY29kZT4uIEhlcmUgdGhlIHdvcmsKKyAgICAgKiB3aWxsIGJlIGdyYW50ZWQgdG8gYSA8Y29kZT5udWxsPC9jb2RlPiBzdWJqZWN0LiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBtZXRob2QgdG8gYXBwbHkgdGhlIHNlY3VyaXR5IHJlc3RyaWN0aW9uCisgICAgICogQHBhcmFtIHRhcmdldE9iamVjdCB0aGUgPGNvZGU+U2VydmxldDwvY29kZT4gb24gd2hpY2ggdGhlIG1ldGhvZCB3aWxsCisgICAgICogYmUgY2FsbGVkLgorICAgICAqIEBwYXJhbSB0YXJnZXRUeXBlIDxjb2RlPkNsYXNzPC9jb2RlPiBhcnJheSB1c2VkIHRvIGluc3RhbmNpYXRlIGEgCisgICAgICogPGNvZGU+TWV0aG9kPC9jb2RlPiBvYmplY3QuCisgICAgICogQHBhcmFtIHRhcmdldEFyZ3VtZW50cyA8Y29kZT5PYmplY3Q8L2NvZGU+IGFycmF5IGNvbnRhaW5zIHRoZSAKKyAgICAgKiBydW50aW1lIHBhcmFtZXRlcnMgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHByaW5jaXBhbCB0aGUgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiB0byB3aGljaCB0aGUgc2VjdXJpdHkgCisgICAgICogcHJpdmlsZWdlIGFwcGx5Li4KKyAgICAgKi8gICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRvQXNQcml2aWxlZ2UoZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlcnZsZXQgdGFyZ2V0T2JqZWN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc1tdIHRhcmdldFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gdGFyZ2V0QXJndW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW5jaXBhbCBwcmluY2lwYWwpIAorICAgICAgICB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKKworICAgICAgICBNZXRob2QgbWV0aG9kID0gbnVsbDsKKyAgICAgICAgTWV0aG9kW10gbWV0aG9kc0NhY2hlID0gbnVsbDsKKyAgICAgICAgaWYob2JqZWN0Q2FjaGUuY29udGFpbnNLZXkodGFyZ2V0T2JqZWN0KSl7CisgICAgICAgICAgICBtZXRob2RzQ2FjaGUgPSAoTWV0aG9kW10pb2JqZWN0Q2FjaGUuZ2V0KHRhcmdldE9iamVjdCk7CisgICAgICAgICAgICBtZXRob2QgPSBmaW5kTWV0aG9kKG1ldGhvZHNDYWNoZSwgbWV0aG9kTmFtZSk7CisgICAgICAgICAgICBpZiAobWV0aG9kID09IG51bGwpeworICAgICAgICAgICAgICAgIG1ldGhvZCA9IGNyZWF0ZU1ldGhvZEFuZENhY2hlSXQobWV0aG9kc0NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWV0aG9kID0gY3JlYXRlTWV0aG9kQW5kQ2FjaGVJdChtZXRob2RzQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VHlwZSk7ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBleGVjdXRlKG1ldGhvZCwgdGFyZ2V0T2JqZWN0LCB0YXJnZXRBcmd1bWVudHMsIHByaW5jaXBhbCk7CisgICAgfQorIAorICAgIAorICAgIC8qKgorICAgICAqIFBlcmZvcm0gd29yayBhcyBhIHBhcnRpY3VsYXIgPC9jb2RlPlN1YmplY3Q8L2NvZGU+LiBIZXJlIHRoZSB3b3JrCisgICAgICogd2lsbCBiZSBncmFudGVkIHRvIGEgPGNvZGU+bnVsbDwvY29kZT4gc3ViamVjdC4gCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbWV0aG9kIHRvIGFwcGx5IHRoZSBzZWN1cml0eSByZXN0cmljdGlvbgorICAgICAqIEBwYXJhbSB0YXJnZXRPYmplY3QgdGhlIDxjb2RlPkZpbHRlcjwvY29kZT4gb24gd2hpY2ggdGhlIG1ldGhvZCB3aWxsIAorICAgICAqIGJlIGNhbGxlZC4KKyAgICAgKi8gICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRvQXNQcml2aWxlZ2UoZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbHRlciB0YXJnZXRPYmplY3QpIAorICAgICAgICB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKKworICAgICAgICAgZG9Bc1ByaXZpbGVnZShtZXRob2ROYW1lLCB0YXJnZXRPYmplY3QsIG51bGwsIG51bGwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorIAorICAgIAorICAgIC8qKgorICAgICAqIFBlcmZvcm0gd29yayBhcyBhIHBhcnRpY3VsYXIgPC9jb2RlPlN1YmplY3Q8L2NvZGU+LiBIZXJlIHRoZSB3b3JrCisgICAgICogd2lsbCBiZSBncmFudGVkIHRvIGEgPGNvZGU+bnVsbDwvY29kZT4gc3ViamVjdC4gCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbWV0aG9kIHRvIGFwcGx5IHRoZSBzZWN1cml0eSByZXN0cmljdGlvbgorICAgICAqIEBwYXJhbSB0YXJnZXRPYmplY3QgdGhlIDxjb2RlPkZpbHRlcjwvY29kZT4gb24gd2hpY2ggdGhlIG1ldGhvZCB3aWxsIAorICAgICAqIGJlIGNhbGxlZC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0VHlwZSA8Y29kZT5DbGFzczwvY29kZT4gYXJyYXkgdXNlZCB0byBpbnN0YW5jaWF0ZSBhCisgICAgICogPGNvZGU+TWV0aG9kPC9jb2RlPiBvYmplY3QuCisgICAgICogQHBhcmFtIHRhcmdldEFyZ3VtZW50cyA8Y29kZT5PYmplY3Q8L2NvZGU+IGFycmF5IGNvbnRhaW5zIHRoZSAKKyAgICAgKiBydW50aW1lIHBhcmFtZXRlcnMgaW5zdGFuY2UuCisgICAgICovICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkb0FzUHJpdmlsZWdlKGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWx0ZXIgdGFyZ2V0T2JqZWN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc1tdIHRhcmdldFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gdGFyZ2V0QXJndW1lbnRzKSAKKyAgICAgICAgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257CisgICAgICAgIE1ldGhvZCBtZXRob2QgPSBudWxsOworCisgICAgICAgIE1ldGhvZFtdIG1ldGhvZHNDYWNoZSA9IG51bGw7CisgICAgICAgIGlmKG9iamVjdENhY2hlLmNvbnRhaW5zS2V5KHRhcmdldE9iamVjdCkpeworICAgICAgICAgICAgbWV0aG9kc0NhY2hlID0gKE1ldGhvZFtdKW9iamVjdENhY2hlLmdldCh0YXJnZXRPYmplY3QpOworICAgICAgICAgICAgbWV0aG9kID0gZmluZE1ldGhvZChtZXRob2RzQ2FjaGUsIG1ldGhvZE5hbWUpOworICAgICAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKXsKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBjcmVhdGVNZXRob2RBbmRDYWNoZUl0KG1ldGhvZHNDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1ldGhvZCA9IGNyZWF0ZU1ldGhvZEFuZENhY2hlSXQobWV0aG9kc0NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFR5cGUpOyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgZXhlY3V0ZShtZXRob2QsIHRhcmdldE9iamVjdCwgdGFyZ2V0QXJndW1lbnRzLCBudWxsKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUGVyZm9ybSB3b3JrIGFzIGEgcGFydGljdWxhciA8L2NvZGU+U3ViamVjdDwvY29kZT4uIEhlcmUgdGhlIHdvcmsKKyAgICAgKiB3aWxsIGJlIGdyYW50ZWQgdG8gYSA8Y29kZT5udWxsPC9jb2RlPiBzdWJqZWN0LiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBtZXRob2QgdG8gYXBwbHkgdGhlIHNlY3VyaXR5IHJlc3RyaWN0aW9uCisgICAgICogQHBhcmFtIHRhcmdldE9iamVjdCB0aGUgPGNvZGU+U2VydmxldDwvY29kZT4gb24gd2hpY2ggdGhlIG1ldGhvZCB3aWxsCisgICAgICogYmUgY2FsbGVkLgorICAgICAqIEBwYXJhbSB0YXJnZXRBcmd1bWVudHMgPGNvZGU+T2JqZWN0PC9jb2RlPiBhcnJheSBjb250YWlucyB0aGUgCisgICAgICogcnVudGltZSBwYXJhbWV0ZXJzIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSBwcmluY2lwYWwgdGhlIDxjb2RlPlByaW5jaXBhbDwvY29kZT4gdG8gd2hpY2ggdGhlIHNlY3VyaXR5IAorICAgICAqIHByaXZpbGVnZSBhcHBsaWVzCisgICAgICovICAgIAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZXhlY3V0ZShmaW5hbCBNZXRob2QgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdGFyZ2V0T2JqZWN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gdGFyZ2V0QXJndW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmluY2lwYWwgcHJpbmNpcGFsKSAKKyAgICAgICAgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257CisgICAgICAgCisgICAgICAgIHRyeXsgICAKKyAgICAgICAgICAgIFN1YmplY3Qgc3ViamVjdCA9IG51bGw7CisgICAgICAgICAgICBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIHBlYSA9IG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCl7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZSh0YXJnZXRPYmplY3QsIHRhcmdldEFyZ3VtZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgYWx3YXlzIHRoZSByZXF1ZXN0IG9iamVjdAorICAgICAgICAgICAgaWYgKHRhcmdldEFyZ3VtZW50cyAhPSBudWxsIAorICAgICAgICAgICAgICAgICAgICAmJiB0YXJnZXRBcmd1bWVudHNbMF0gaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlcXVlc3QpeworICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlcXVlc3QpdGFyZ2V0QXJndW1lbnRzWzBdOworCisgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNTdWJqZWN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbihmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgICAgIHN1YmplY3QgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgIChTdWJqZWN0KXNlc3Npb24uZ2V0QXR0cmlidXRlKEdsb2JhbHMuU1VCSkVDVF9BVFRSKTsKKyAgICAgICAgICAgICAgICAgICAgaGFzU3ViamVjdCA9IChzdWJqZWN0ICE9IG51bGwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0ID09IG51bGwpeworICAgICAgICAgICAgICAgICAgICBzdWJqZWN0ID0gbmV3IFN1YmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChwcmluY2lwYWwgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmdldFByaW5jaXBhbHMoKS5hZGQocHJpbmNpcGFsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwgJiYgIWhhc1N1YmplY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoR2xvYmFscy5TVUJKRUNUX0FUVFIsIHN1YmplY3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3ViamVjdC5kb0FzUHJpdmlsZWdlZChzdWJqZWN0LCBwZWEsIG51bGwpOyAgICAgICAKKyAgICAgICB9IGNhdGNoKCBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHBlKSB7CisgICAgICAgICAgICBUaHJvd2FibGUgZSA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbilwZS5nZXRFeGNlcHRpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIlNlY3VyaXR5VXRpbC5kb0FzUHJpdmlsZWdlIiksIGUpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBVbmF2YWlsYWJsZUV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvdyAoVW5hdmFpbGFibGVFeGNlcHRpb24pIGU7CisgICAgICAgICAgICBlbHNlIGlmIChlIGluc3RhbmNlb2YgU2VydmxldEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvdyAoU2VydmxldEV4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIGU7CisgICAgICAgICAgICBlbHNlIGlmIChlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0gIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBGaW5kIGEgbWV0aG9kIHN0b3JlZCB3aXRoaW4gdGhlIGNhY2hlLgorICAgICAqIEBwYXJhbSBtZXRob2RzQ2FjaGUgdGhlIGNhY2hlIHVzZWQgdG8gc3RvcmUgbWV0aG9kIGluc3RhbmNlCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG1ldGhvZCB0byBhcHBseSB0aGUgc2VjdXJpdHkgcmVzdHJpY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRob2QgaW5zdGFuY2UsIG51bGwgaWYgbm90IHlldCBjcmVhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBmaW5kTWV0aG9kKE1ldGhvZFtdIG1ldGhvZHNDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSl7CisgICAgICAgIGlmIChtZXRob2ROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSU5JVF9NRVRIT0QpIAorICAgICAgICAgICAgICAgICYmIG1ldGhvZHNDYWNoZVtJTklUXSAhPSBudWxsKXsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2RzQ2FjaGVbSU5JVF07CisgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kTmFtZS5lcXVhbHNJZ25vcmVDYXNlKERFU1RST1lfTUVUSE9EKSAKKyAgICAgICAgICAgICAgICAmJiBtZXRob2RzQ2FjaGVbREVTVFJPWV0gIT0gbnVsbCl7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kc0NhY2hlW0RFU1RST1ldOyAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTRVJWSUNFX01FVEhPRCkgCisgICAgICAgICAgICAgICAgJiYgbWV0aG9kc0NhY2hlW1NFUlZJQ0VdICE9IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZHNDYWNoZVtTRVJWSUNFXTsKKyAgICAgICAgfSBlbHNlIGlmIChtZXRob2ROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRE9GSUxURVJfTUVUSE9EKSAKKyAgICAgICAgICAgICAgICAmJiBtZXRob2RzQ2FjaGVbRE9GSUxURVJdICE9IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZHNDYWNoZVtET0ZJTFRFUl07ICAgICAgICAgIAorICAgICAgICB9IAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBtZXRob2QgYW5kIGNhY2hlIGl0IGZvciBmdXJ0aGVyIHJlLXVzZS4KKyAgICAgKiBAcGFyYW0gbWV0aG9kc0NhY2hlIHRoZSBjYWNoZSB1c2VkIHRvIHN0b3JlIG1ldGhvZCBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBtZXRob2QgdG8gYXBwbHkgdGhlIHNlY3VyaXR5IHJlc3RyaWN0aW9uCisgICAgICogQHBhcmFtIHRhcmdldE9iamVjdCB0aGUgPGNvZGU+U2VydmxldDwvY29kZT4gb24gd2hpY2ggdGhlIG1ldGhvZCB3aWxsCisgICAgICogYmUgY2FsbGVkLgorICAgICAqIEBwYXJhbSB0YXJnZXRUeXBlIDxjb2RlPkNsYXNzPC9jb2RlPiBhcnJheSB1c2VkIHRvIGluc3RhbmNpYXRlIGEgCisgICAgICogPGNvZGU+TWV0aG9kPC9jb2RlPiBvYmplY3QuCisgICAgICogQHJldHVybiB0aGUgbWV0aG9kIGluc3RhbmNlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBjcmVhdGVNZXRob2RBbmRDYWNoZUl0KE1ldGhvZFtdIG1ldGhvZHNDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdGFyZ2V0T2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzW10gdGFyZ2V0VHlwZSkgCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICAKKyAgICAgICAgaWYgKCBtZXRob2RzQ2FjaGUgPT0gbnVsbCl7CisgICAgICAgICAgICBtZXRob2RzQ2FjaGUgPSBuZXcgTWV0aG9kWzNdOworICAgICAgICB9ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIE1ldGhvZCBtZXRob2QgPSAKKyAgICAgICAgICAgIHRhcmdldE9iamVjdC5nZXRDbGFzcygpLmdldE1ldGhvZChtZXRob2ROYW1lLCB0YXJnZXRUeXBlKTsgCisKKyAgICAgICAgaWYgKG1ldGhvZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJTklUX01FVEhPRCkpeworICAgICAgICAgICAgbWV0aG9kc0NhY2hlW0lOSVRdID0gbWV0aG9kOworICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShERVNUUk9ZX01FVEhPRCkpeworICAgICAgICAgICAgbWV0aG9kc0NhY2hlW0RFU1RST1ldID0gbWV0aG9kOworICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTRVJWSUNFX01FVEhPRCkpeworICAgICAgICAgICAgbWV0aG9kc0NhY2hlW1NFUlZJQ0VdID0gbWV0aG9kOworICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShET0ZJTFRFUl9NRVRIT0QpKXsKKyAgICAgICAgICAgIG1ldGhvZHNDYWNoZVtET0ZJTFRFUl0gPSBtZXRob2Q7CisgICAgICAgIH0gCisgICAgICAgICAKKyAgICAgICAgb2JqZWN0Q2FjaGUucHV0KHRhcmdldE9iamVjdCwgbWV0aG9kc0NhY2hlICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBvYmplY3QgZnJvbSB0aGUgY2FjaGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FjaGVkT2JqZWN0IFRoZSBvYmplY3QgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZShPYmplY3QgY2FjaGVkT2JqZWN0KXsKKyAgICAgICAgb2JqZWN0Q2FjaGUucmVtb3ZlKGNhY2hlZE9iamVjdCk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgPGNvZGU+U2VjdXJpdHlNYW5hZ2VyPC9jb2RlPiBvbmx5IGlmIFNlY3VyaXR5IGlzIGVuYWJsZWQgQU5ECisgICAgICogcGFja2FnZSBwcm90ZWN0aW9uIG1lY2hhbmlzbSBpcyBlbmFibGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpeworICAgICAgICBpZiAocGFja2FnZURlZmluaXRpb25FbmFibGVkICYmIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSAgbnVsbCl7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0NHSVNlcnZsZXQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9DR0lTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QzMmFmMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9DR0lTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxOTYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VydmxldHM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlVuYXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5JT1Rvb2xzOworCisKKy8qKgorICogIENHSS1pbnZva2luZyBzZXJ2bGV0IGZvciB3ZWIgYXBwbGljYXRpb25zLCB1c2VkIHRvIGV4ZWN1dGUgc2NyaXB0cyB3aGljaAorICogIGNvbXBseSB0byB0aGUgQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlIChDR0kpIHNwZWNpZmljYXRpb24gYW5kIGFyZSBuYW1lZAorICogIGluIHRoZSBwYXRoLWluZm8gdXNlZCB0byBpbnZva2UgdGhpcyBzZXJ2bGV0LgorICoKKyAqIDxwPgorICogPGk+Tm90ZTogVGhpcyBjb2RlIGNvbXBpbGVzIGFuZCBldmVuIHdvcmtzIGZvciBzaW1wbGUgQ0dJIGNhc2VzLgorICogICAgICAgICAgRXhoYXVzdGl2ZSB0ZXN0aW5nIGhhcyBub3QgYmVlbiBkb25lLiAgUGxlYXNlIGNvbnNpZGVyIGl0IGJldGEKKyAqICAgICAgICAgIHF1YWxpdHkuICBGZWVkYmFjayBpcyBhcHByZWNpYXRlZCB0byB0aGUgYXV0aG9yIChzZWUgYmVsb3cpLjwvaT4KKyAqIDwvcD4KKyAqIDxwPgorICoKKyAqIDxiPkV4YW1wbGU8L2I+Ojxicj4KKyAqIElmIGFuIGluc3RhbmNlIG9mIHRoaXMgc2VydmxldCB3YXMgbWFwcGVkICh1c2luZworICogICAgICAgPGNvZGU+Jmx0O3dlYi1hcHAmZ3Q7L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4pIHRvOgorICogPC9wPgorICogPHA+CisgKiA8Y29kZT4KKyAqICZsdDt3ZWItYXBwJmd0Oy9jZ2ktYmluLyoKKyAqIDwvY29kZT4KKyAqIDwvcD4KKyAqIDxwPgorICogdGhlbiB0aGUgZm9sbG93aW5nIHJlcXVlc3Q6CisgKiA8L3A+CisgKiA8cD4KKyAqIDxjb2RlPgorICogaHR0cDovL2xvY2FsaG9zdDo4MDgwLyZsdDt3ZWItYXBwJmd0Oy9jZ2ktYmluL2RpcjEvc2NyaXB0L3BhdGhpbmZvMQorICogPC9jb2RlPgorICogPC9wPgorICogPHA+CisgKiB3b3VsZCByZXN1bHQgaW4gdGhlIGV4ZWN1dGlvbiBvZiB0aGUgc2NyaXB0CisgKiA8L3A+CisgKiA8cD4KKyAqIDxjb2RlPgorICogJmx0O3dlYi1hcHAtcm9vdCZndDsvV0VCLUlORi9jZ2kvZGlyMS9zY3JpcHQKKyAqIDwvY29kZT4KKyAqIDwvcD4KKyAqIDxwPgorICogd2l0aCB0aGUgc2NyaXB0J3MgPGNvZGU+UEFUSF9JTkZPPC9jb2RlPiBzZXQgdG8gPGNvZGU+L3BhdGhpbmZvMTwvY29kZT4uCisgKiA8L3A+CisgKiA8cD4KKyAqIFJlY29tbWVuZGF0aW9uOiAgSG91c2UgYWxsIHlvdXIgQ0dJIHNjcmlwdHMgdW5kZXIKKyAqIDxjb2RlPiZsdDt3ZWJhcHAmZ3Q7L1dFQi1JTkYvY2dpPC9jb2RlPi4gIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB5b3UgZG8gbm90CisgKiBhY2NpZGVudGFsbHkgZXhwb3NlIHlvdXIgY2dpIHNjcmlwdHMnIGNvZGUgdG8gdGhlIG91dHNpZGUgd29ybGQgYW5kIHRoYXQKKyAqIHlvdXIgY2dpcyB3aWxsIGJlIGNsZWFubHkgZW5zY29uY2VkIHVuZGVybmVhdGggdGhlIFdFQi1JTkYgKGkuZS4sCisgKiBub24tY29udGVudCkgYXJlYS4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhlIGRlZmF1bHQgQ0dJIGxvY2F0aW9uIGlzIG1lbnRpb25lZCBhYm92ZS4gIFlvdSBoYXZlIHRoZSBmbGV4aWJpbGl0eSB0bworICogcHV0IENHSXMgd2hlcmV2ZXIgeW91IHdhbnQsIGhvd2V2ZXI6CisgKiA8L3A+CisgKiA8cD4KKyAqICAgVGhlIENHSSBzZWFyY2ggcGF0aCB3aWxsIHN0YXJ0IGF0CisgKiAgIHdlYkFwcFJvb3REaXIgKyBGaWxlLnNlcGFyYXRvciArIGNnaVBhdGhQcmVmaXgKKyAqICAgKG9yIHdlYkFwcFJvb3REaXIgYWxvbmUgaWYgY2dpUGF0aFByZWZpeCBpcworICogICBudWxsKS4KKyAqIDwvcD4KKyAqIDxwPgorICogICBjZ2lQYXRoUHJlZml4IGlzIGRlZmluZWQgYnkgc2V0dGluZworICogICB0aGlzIHNlcnZsZXQncyBjZ2lQYXRoUHJlZml4IGluaXQgcGFyYW1ldGVyCisgKiA8L3A+CisgKgorICogPHA+CisgKgorICogPEI+Q0dJIFNwZWNpZmljYXRpb248L0I+Ojxicj4gZGVyaXZlZCBmcm9tCisgKiA8YSBocmVmPSJodHRwOi8vY2dpLXNwZWMuZ29sdXguY29tIj5odHRwOi8vY2dpLXNwZWMuZ29sdXguY29tPC9hPi4KKyAqIEEgd29yay1pbi1wcm9ncmVzcyAmIGV4cGlyZWQgSW50ZXJuZXQgRHJhZnQuICBOb3RlIG5vIGFjdHVhbCBSRkMgZGVzY3JpYmluZworICogdGhlIENHSSBzcGVjaWZpY2F0aW9uIGV4aXN0cy4gIFdoZXJlIHRoZSBiZWhhdmlvciBvZiB0aGlzIHNlcnZsZXQgZGlmZmVycworICogZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBjaXRlZCBhYm92ZSwgaXQgaXMgZWl0aGVyIGRvY3VtZW50ZWQgaGVyZSwgYSBidWcsCisgKiBvciBhbiBpbnN0YW5jZSB3aGVyZSB0aGUgc3BlY2lmaWNhdGlvbiBjaXRlZCBkaWZmZXJzIGZyb20gQmVzdAorICogQ29tbXVuaXR5IFByYWN0aWNlIChCQ1ApLgorICogU3VjaCBpbnN0YW5jZXMgc2hvdWxkIGJlIHdlbGwtZG9jdW1lbnRlZCBoZXJlLiAgUGxlYXNlIGVtYWlsIHRoZQorICogPGEgaHJlZj0ibWFpbHRvOnRvbWNhdC1kZXZAamFrYXJ0YS5hcGFjaGUub3JnIj5KYWthcnRhIFRvbWNhdCBncm91cCBbdG9tY2F0LWRldkBqYWthcnRhLmFwYWNoZS5vcmddPC9hPgorICogd2l0aCBhbWVuZG1lbnRzLgorICoKKyAqIDwvcD4KKyAqIDxwPgorICoKKyAqIDxiPkNhbm9uaWNhbCBtZXRhdmFyaWFibGVzPC9iPjo8YnI+CisgKiBUaGUgQ0dJIHNwZWNpZmljYXRpb24gZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNhbm9uaWNhbCBtZXRhdmFyaWFibGVzOgorICogPGJyPgorICogW2V4Y2VycHQgZnJvbSBDR0kgc3BlY2lmaWNhdGlvbl0KKyAqIDxQUkU+CisgKiAgQVVUSF9UWVBFCisgKiAgQ09OVEVOVF9MRU5HVEgKKyAqICBDT05URU5UX1RZUEUKKyAqICBHQVRFV0FZX0lOVEVSRkFDRQorICogIFBBVEhfSU5GTworICogIFBBVEhfVFJBTlNMQVRFRAorICogIFFVRVJZX1NUUklORworICogIFJFTU9URV9BRERSCisgKiAgUkVNT1RFX0hPU1QKKyAqICBSRU1PVEVfSURFTlQKKyAqICBSRU1PVEVfVVNFUgorICogIFJFUVVFU1RfTUVUSE9ECisgKiAgU0NSSVBUX05BTUUKKyAqICBTRVJWRVJfTkFNRQorICogIFNFUlZFUl9QT1JUCisgKiAgU0VSVkVSX1BST1RPQ09MCisgKiAgU0VSVkVSX1NPRlRXQVJFCisgKiA8L1BSRT4KKyAqIDxwPgorICogTWV0YXZhcmlhYmxlcyB3aXRoIG5hbWVzIGJlZ2lubmluZyB3aXRoIHRoZSBwcm90b2NvbCBuYW1lICg8RU0+ZS5nLjwvRU0+LAorICogIkhUVFBfQUNDRVBUIikgYXJlIGFsc28gY2Fub25pY2FsIGluIHRoZWlyIGRlc2NyaXB0aW9uIG9mIHJlcXVlc3QgaGVhZGVyCisgKiBmaWVsZHMuICBUaGUgbnVtYmVyIGFuZCBtZWFuaW5nIG9mIHRoZXNlIGZpZWxkcyBtYXkgY2hhbmdlIGluZGVwZW5kZW50bHkKKyAqIG9mIHRoaXMgc3BlY2lmaWNhdGlvbi4gIChTZWUgYWxzbyBzZWN0aW9uIDYuMS41IFtvZiB0aGUgQ0dJIHNwZWNpZmljYXRpb25dLikKKyAqIDwvcD4KKyAqIFtlbmQgZXhjZXJwdF0KKyAqCisgKiA8L3A+CisgKiA8aDI+IEltcGxlbWVudGF0aW9uIG5vdGVzPC9oMj4KKyAqIDxwPgorICoKKyAqIDxiPnN0YW5kYXJkIGlucHV0IGhhbmRsaW5nPC9iPjogSWYgeW91ciBzY3JpcHQgYWNjZXB0cyBzdGFuZGFyZCBpbnB1dCwKKyAqIHRoZW4gdGhlIGNsaWVudCBtdXN0IHN0YXJ0IHNlbmRpbmcgaW5wdXQgd2l0aGluIGEgY2VydGFpbiB0aW1lb3V0IHBlcmlvZCwKKyAqIG90aGVyd2lzZSB0aGUgc2VydmxldCB3aWxsIGFzc3VtZSBubyBpbnB1dCBpcyBjb21pbmcgYW5kIGNhcnJ5IG9uIHJ1bm5pbmcKKyAqIHRoZSBzY3JpcHQuICBUaGUgc2NyaXB0J3MgdGhlIHN0YW5kYXJkIGlucHV0IHdpbGwgYmUgY2xvc2VkIGFuZCBoYW5kbGluZyBvZgorICogYW55IGZ1cnRoZXIgaW5wdXQgZnJvbSB0aGUgY2xpZW50IGlzIHVuZGVmaW5lZC4gIE1vc3QgbGlrZWx5IGl0IHdpbGwgYmUKKyAqIGlnbm9yZWQuICBJZiB0aGlzIGJlaGF2aW9yIGJlY29tZXMgdW5kZXNpcmFibGUsIHRoZW4gdGhpcyBzZXJ2bGV0IG5lZWRzCisgKiB0byBiZSBlbmhhbmNlZCB0byBoYW5kbGUgdGhyZWFkaW5nIG9mIHRoZSBzcGF3bmVkIHByb2Nlc3MnIHN0ZGluLCBzdGRvdXQsCisgKiBhbmQgc3RkZXJyICh3aGljaCBzaG91bGQgbm90IGJlIHRvbyBoYXJkKS4KKyAqIDxicj4KKyAqIElmIHlvdSBmaW5kIHlvdXIgY2dpIHNjcmlwdHMgYXJlIHRpbWluZyBvdXQgcmVjZWl2aW5nIGlucHV0LCB5b3UgY2FuIHNldAorICogdGhlIGluaXQgcGFyYW1ldGVyIDxjb2RlPjwvY29kZT4gb2YgeW91ciB3ZWJhcHBzJyBjZ2ktaGFuZGxpbmcgc2VydmxldAorICogdG8gYmUKKyAqIDwvcD4KKyAqIDxwPgorICoKKyAqIDxiPk1ldGF2YXJpYWJsZSBWYWx1ZXM8L2I+OiBBY2NvcmRpbmcgdG8gdGhlIENHSSBzcGVjaWZpY2lvbiwKKyAqIGltcGxlbWVudGF0aW9ucyBtYXkgY2hvb3NlIHRvIHJlcHJlc2VudCBib3RoIG51bGwgb3IgbWlzc2luZyB2YWx1ZXMgaW4gYW4KKyAqIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIG1hbm5lciwgYnV0IG11c3QgZGVmaW5lIHRoYXQgbWFubmVyLiAgVGhpcworICogaW1wbGVtZW50YXRpb24gY2hvb3NlcyB0byBhbHdheXMgZGVmaW5lIGFsbCByZXF1aXJlZCBtZXRhdmFyaWFibGVzLCBidXQKKyAqIHNldCB0aGUgdmFsdWUgdG8gIiIgZm9yIGFsbCBtZXRhdmFyaWFibGVzIHdob3NlIHZhbHVlIGlzIGVpdGhlciBudWxsIG9yCisgKiB1bmRlZmluZWQuICBQQVRIX1RSQU5TTEFURUQgaXMgdGhlIHNvbGUgZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSwgYXMgcGVyIHRoZQorICogQ0dJIFNwZWNpZmljYXRpb24uCisgKgorICogPC9wPgorICogPHA+CisgKgorICogPGI+TlBIIC0tICBOb24tcGFyc2VkLWhlYWRlciBpbXBsZW1lbnRhdGlvbjwvYj46ICBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMKKyAqIG5vdCBzdXBwb3J0IHRoZSBDR0kgTlBIIGNvbmNlcHQsIHdoZXJlYnkgc2VydmVyIGVuc3VyZXMgdGhhdCB0aGUgZGF0YQorICogc3VwcGxpZWQgdG8gdGhlIHNjcmlwdCBhcmUgcHJlY2Vpc2VseSBhcyBzdXBwbGllZCBieSB0aGUgY2xpZW50IGFuZAorICogdW5hbHRlcmVkIGJ5IHRoZSBzZXJ2ZXIuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSBmdW5jdGlvbiBvZiBhIHNlcnZsZXQgY29udGFpbmVyIChpbmNsdWRpbmcgVG9tY2F0KSBpcyBzcGVjaWZpY2FsbHkKKyAqIGRlc2lnbmVkIHRvIHBhcnNlIGFuZCBwb3NzaWJsZSBhbHRlciBDR0ktc3BlY2lmaWMgdmFyaWFibGVzLCBhbmQgYXMKKyAqIHN1Y2ggbWFrZXMgTlBIIGZ1bmN0aW9uYWxpdHkgZGlmZmljdWx0IHRvIHN1cHBvcnQuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSBDR0kgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCBjb21wbGlhbnQgc2VydmVycyBNQVkgc3VwcG9ydCBOUEggb3V0cHV0LgorICogSXQgZG9lcyBub3Qgc3RhdGUgc2VydmVycyBNVVNUIHN1cHBvcnQgTlBIIG91dHB1dCB0byBiZSB1bmNvbmRpdGlvbmFsbHkKKyAqIGNvbXBsaWFudC4gIFRodXMsIHRoaXMgaW1wbGVtZW50YXRpb24gbWFpbnRhaW5zIHVuY29uZGl0aW9uYWwgY29tcGxpYW5jZQorICogd2l0aCB0aGUgc3BlY2lmaWNhdGlvbiB0aG91Z2ggTlBIIHN1cHBvcnQgaXMgbm90IHByZXNlbnQuCisgKiA8L3A+CisgKiA8cD4KKyAqCisgKiBUaGUgQ0dJIHNwZWNpZmljYXRpb24gaXMgbG9jYXRlZCBhdAorICogPGEgaHJlZj0iaHR0cDovL2NnaS1zcGVjLmdvbHV4LmNvbSI+aHR0cDovL2NnaS1zcGVjLmdvbHV4LmNvbTwvYT4uCisgKgorICogPC9wPgorICogPHA+CisgKiA8aDM+VE9ETzo8L2gzPgorICogPHVsPgorICogPGxpPiBTdXBwb3J0IGZvciBzZXR0aW5nIGhlYWRlcnMgKGZvciBleGFtcGxlLCBMb2NhdGlvbiBoZWFkZXJzIGRvbid0IHdvcmspCisgKiA8bGk+IFN1cHBvcnQgZm9yIGNvbGxhcHNpbmcgbXVsdGlwbGUgaGVhZGVyIGxpbmVzIChwZXIgUkZDIDI2MTYpCisgKiA8bGk+IEVuc3VyZSBoYW5kbGluZyBvZiBQT1NUIG1ldGhvZCBkb2VzIG5vdCBpbnRlcmZlcmUgd2l0aCAyLjMgRmlsdGVycworICogPGxpPiBSZWZhY3RvciBzb21lIGRlYnVnIGNvZGUgb3V0IG9mIGNvcmUKKyAqIDxsaT4gRW5zdXJlIGhlYWRlciBoYW5kbGluZyBwcmVzZXJ2ZXMgZW5jb2RpbmcKKyAqIDxsaT4gUG9zc2libHkgcmV3cml0ZSBDR0lSdW5uZXIucnVuKCk/CisgKiA8bGk+IFBvc3NpYmx5IHJlZmFjdG9yIENHSVJ1bm5lciBhbmQgQ0dJRW52aXJvbm1lbnQgYXMgbm9uLWlubmVyIGNsYXNzZXM/CisgKiA8bGk+IERvY3VtZW50IGhhbmRsaW5nIG9mIGNnaSBzdGRpbiB3aGVuIHRoZXJlIGlzIG5vIHN0ZGluCisgKiA8bGk+IFJldmlzaXQgSU9FeGNlcHRpb24gaGFuZGxpbmcgaW4gQ0dJUnVubmVyLnJ1bigpCisgKiA8bGk+IEJldHRlciBkb2N1bWVudGF0aW9uCisgKiA8bGk+IENvbmZpcm0gdXNlIG9mIFNlcnZsZXRJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSBpbiBDR0lSdW5uZXIucnVuKCkgaXMKKyAqICAgICAgbm90IG5lZWRlZAorICogPGxpPiBNYWtlIGNoZWNraW5nIGZvciAiLiIgYW5kICIuLiIgaW4gc2VydmxldCAmIGNnaSBQQVRIX0lORk8gbGVzcworICogICAgICBkcmFjb25pYW4KKyAqIDxsaT4gW2FkZCBtb3JlIHRvIHRoaXMgVE9ETyBsaXN0XQorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBUIERlbmdsZXIgW3Jvb3RAbWFydGluZGVuZ2xlci5jb21dCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICogQHNpbmNlIFRvbWNhdCA0LjAKKyAqCisgKi8KKworCitwdWJsaWMgZmluYWwgY2xhc3MgQ0dJU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIC8qIHNvbWUgdmFycyBiZWxvdyBjb3BpZWQgZnJvbSBDcmFpZyBSLiBNY0NsYW5haGFuJ3MgSW52b2tlclNlcnZsZXQgKi8KKworICAgIC8qKiB0aGUgZGVidWdnaW5nIGRldGFpbCBsZXZlbCBmb3IgdGhpcyBzZXJ2bGV0LiAqLworICAgIHByaXZhdGUgaW50IGRlYnVnID0gMDsKKworICAgIC8qKgorICAgICAqICBUaGUgQ0dJIHNlYXJjaCBwYXRoIHdpbGwgc3RhcnQgYXQKKyAgICAgKiAgICB3ZWJBcHBSb290RGlyICsgRmlsZS5zZXBhcmF0b3IgKyBjZ2lQYXRoUHJlZml4CisgICAgICogICAgKG9yIHdlYkFwcFJvb3REaXIgYWxvbmUgaWYgY2dpUGF0aFByZWZpeCBpcworICAgICAqICAgIG51bGwpCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY2dpUGF0aFByZWZpeCA9IG51bGw7CisKKyAgICAvKiogdGhlIGV4ZWN1dGFibGUgdG8gdXNlIHdpdGggdGhlIHNjcmlwdCAqLworICAgIHByaXZhdGUgU3RyaW5nIGNnaUV4ZWN1dGFibGUgPSAicGVybCI7CisgICAgCisgICAgLyoqIHRoZSBlbmNvZGluZyB0byB1c2UgZm9yIHBhcmFtZXRlcnMgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXJhbWV0ZXJFbmNvZGluZyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVURi04Iik7CisKKyAgICAvKiogb2JqZWN0IHVzZWQgdG8gZW5zdXJlIG11bHRpcGxlIHRocmVhZHMgZG9uJ3QgdHJ5IHRvIGV4cGFuZCBzYW1lIGZpbGUgKi8KKyAgICBzdGF0aWMgT2JqZWN0IGV4cGFuZEZpbGVMb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgLyoqIHRoZSBzaGVsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBDR0kgc2NyaXB0ICovCisgICAgc3RhdGljIEhhc2h0YWJsZSBzaGVsbEVudiA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgaW5zdGFuY2UgdmFyaWFibGVzLgorICAgICAqIDxQPgorICAgICAqIE1vZGlmaWVkIGZyb20gQ3JhaWcgUi4gTWNDbGFuYWhhbidzIEludm9rZXJTZXJ2bGV0CisgICAgICogPC9QPgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyAgICAgICAgICAgICAgICAgICAgYSA8Y29kZT5TZXJ2bGV0Q29uZmlnPC9jb2RlPiBvYmplY3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBzZXJ2bGV0J3MKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGFuZCBpbml0aWFsaXphdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiAgICAgIGlmIGFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgdGhhdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmVyZXMgd2l0aCB0aGUgc2VydmxldCdzIG5vcm1hbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5pbml0KGNvbmZpZyk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgd2Ugd2VyZSBub3QgYWNjZXNzZWQgdXNpbmcgdGhlIGludm9rZXIgc2VydmxldAorICAgICAgICBTdHJpbmcgc2VydmxldE5hbWUgPSBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0U2VydmxldE5hbWUoKTsKKyAgICAgICAgaWYgKHNlcnZsZXROYW1lID09IG51bGwpCisgICAgICAgICAgICBzZXJ2bGV0TmFtZSA9ICIiOworICAgICAgICBpZiAoc2VydmxldE5hbWUuc3RhcnRzV2l0aCgib3JnLmFwYWNoZS5jYXRhbGluYS5JTlZPS0VSLiIpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuYXZhaWxhYmxlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJDYW5ub3QgaW52b2tlIENHSVNlcnZsZXQgdGhyb3VnaCB0aGUgaW52b2tlciIpOworCisgICAgICAgIGJvb2xlYW4gcGFzc1NoZWxsRW52aXJvbm1lbnQgPSBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIC8vIFNldCBvdXIgcHJvcGVydGllcyBmcm9tIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJkZWJ1ZyIpOworICAgICAgICAgICAgZGVidWcgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgICAgIGNnaVBhdGhQcmVmaXggPQorICAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJjZ2lQYXRoUHJlZml4Iik7CisgICAgICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJwYXNzU2hlbGxFbnZpcm9ubWVudCIpOworICAgICAgICAgICAgcGFzc1NoZWxsRW52aXJvbm1lbnQgPSBCb29sZWFuLnZhbHVlT2YodmFsdWUpLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgLy9OT09QCisgICAgICAgIH0KKworICAgICAgICBpZiAocGFzc1NoZWxsRW52aXJvbm1lbnQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2hlbGxFbnYucHV0QWxsKGdldFNoZWxsRW52aXJvbm1lbnQoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICBTZXJ2bGV0RXhjZXB0aW9uIGUgPSBuZXcgU2VydmxldEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcmVhZCBzaGVsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMiLCBpb2UpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJleGVjdXRhYmxlIik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjZ2lFeGVjdXRhYmxlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJwYXJhbWV0ZXJFbmNvZGluZyIpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFyYW1ldGVyRW5jb2RpbmcgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFByaW50cyBvdXQgaW1wb3J0YW50IFNlcnZsZXQgQVBJIGFuZCBjb250YWluZXIgaW5mb3JtYXRpb24KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIENvcGllZCBmcm9tIFNub29wQWxsU2VydmxldCBieSBDcmFpZyBSLiBNY0NsYW5haGFuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtICBvdXQgICAgU2VydmxldE91dHB1dFN0cmVhbSBhcyB0YXJnZXQgb2YgdGhlIGluZm9ybWF0aW9uCisgICAgICogQHBhcmFtICByZXEgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IG9iamVjdCB1c2VkIGFzIHNvdXJjZSBvZiBpbmZvcm1hdGlvbgorICAgICAqIEBwYXJhbSAgcmVzICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2Ugb2JqZWN0IGN1cnJlbnRseSBub3QgdXNlZCBidXQgY291bGQKKyAgICAgKiAgICAgICAgICAgICAgICBwcm92aWRlIGZ1dHVyZSBpbmZvcm1hdGlvbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIGlmIGEgd3JpdGUgb3BlcmF0aW9uIGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByaW50U2VydmxldEVudmlyb25tZW50KFNlcnZsZXRPdXRwdXRTdHJlYW0gb3V0LAorICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBEb2N1bWVudCB0aGUgcHJvcGVydGllcyBmcm9tIFNlcnZsZXRSZXF1ZXN0CisgICAgICAgIG91dC5wcmludGxuKCI8aDE+U2VydmxldFJlcXVlc3QgUHJvcGVydGllczwvaDE+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8dWw+Iik7CisgICAgICAgIEVudW1lcmF0aW9uIGF0dHJzID0gcmVxLmdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgICAgIHdoaWxlIChhdHRycy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGF0dHIgPSAoU3RyaW5nKSBhdHRycy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5hdHRyaWJ1dGU8L2I+ICIgKyBhdHRyICsgIiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldEF0dHJpYnV0ZShhdHRyKSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5jaGFyYWN0ZXJFbmNvZGluZzwvYj4gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldENoYXJhY3RlckVuY29kaW5nKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPGxpPjxiPmNvbnRlbnRMZW5ndGg8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgIHJlcS5nZXRDb250ZW50TGVuZ3RoKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPGxpPjxiPmNvbnRlbnRUeXBlPC9iPiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICByZXEuZ2V0Q29udGVudFR5cGUoKSk7CisgICAgICAgIEVudW1lcmF0aW9uIGxvY2FsZXMgPSByZXEuZ2V0TG9jYWxlcygpOworICAgICAgICB3aGlsZSAobG9jYWxlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSA9IChMb2NhbGUpIGxvY2FsZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+bG9jYWxlPC9iPiA9ICIgKyBsb2NhbGUpOworICAgICAgICB9CisgICAgICAgIEVudW1lcmF0aW9uIHBhcmFtcyA9IHJlcS5nZXRQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICB3aGlsZSAocGFyYW1zLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW0gPSAoU3RyaW5nKSBwYXJhbXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZXNbXSA9IHJlcS5nZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW0pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5wYXJhbWV0ZXI8L2I+ICIgKyBwYXJhbSArICIgPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0pOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+cHJvdG9jb2w8L2I+ID0gIiArIHJlcS5nZXRQcm90b2NvbCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5yZW1vdGVBZGRyPC9iPiA9ICIgKyByZXEuZ2V0UmVtb3RlQWRkcigpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5yZW1vdGVIb3N0PC9iPiA9ICIgKyByZXEuZ2V0UmVtb3RlSG9zdCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5zY2hlbWU8L2I+ID0gIiArIHJlcS5nZXRTY2hlbWUoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+c2VjdXJlPC9iPiA9ICIgKyByZXEuaXNTZWN1cmUoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+c2VydmVyTmFtZTwvYj4gPSAiICsgcmVxLmdldFNlcnZlck5hbWUoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+c2VydmVyUG9ydDwvYj4gPSAiICsgcmVxLmdldFNlcnZlclBvcnQoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8L3VsPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGhyPiIpOworCisgICAgICAgIC8vIERvY3VtZW50IHRoZSBwcm9wZXJ0aWVzIGZyb20gSHR0cFNlcnZsZXRSZXF1ZXN0CisgICAgICAgIG91dC5wcmludGxuKCI8aDE+SHR0cFNlcnZsZXRSZXF1ZXN0IFByb3BlcnRpZXM8L2gxPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPHVsPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGxpPjxiPmF1dGhUeXBlPC9iPiA9ICIgKyByZXEuZ2V0QXV0aFR5cGUoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+Y29udGV4dFBhdGg8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgIHJlcS5nZXRDb250ZXh0UGF0aCgpKTsKKyAgICAgICAgQ29va2llIGNvb2tpZXNbXSA9IHJlcS5nZXRDb29raWVzKCk7CisgICAgICAgIGlmIChjb29raWVzIT1udWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5jb29raWU8L2I+ICIgKyBjb29raWVzW2ldLmdldE5hbWUoKSArIiA9ICIgK2Nvb2tpZXNbaV0uZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgRW51bWVyYXRpb24gaGVhZGVycyA9IHJlcS5nZXRIZWFkZXJOYW1lcygpOworICAgICAgICB3aGlsZSAoaGVhZGVycy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9IChTdHJpbmcpIGhlYWRlcnMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+aGVhZGVyPC9iPiAiICsgaGVhZGVyICsgIiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldEhlYWRlcihoZWFkZXIpKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbigiPGxpPjxiPm1ldGhvZDwvYj4gPSAiICsgcmVxLmdldE1ldGhvZCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48YSBuYW1lPVwicGF0aEluZm9cIj48Yj5wYXRoSW5mbzwvYj48L2E+ID0gIgorICAgICAgICAgICAgICAgICAgICArIHJlcS5nZXRQYXRoSW5mbygpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5wYXRoVHJhbnNsYXRlZDwvYj4gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldFBhdGhUcmFuc2xhdGVkKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPGxpPjxiPnF1ZXJ5U3RyaW5nPC9iPiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICByZXEuZ2V0UXVlcnlTdHJpbmcoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+cmVtb3RlVXNlcjwvYj4gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldFJlbW90ZVVzZXIoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+cmVxdWVzdGVkU2Vzc2lvbklkPC9iPiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICByZXEuZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPGxpPjxiPnJlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWU8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgIHJlcS5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+cmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTDwvYj4gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxLmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5yZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZDwvYj4gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxLmlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+cmVxdWVzdFVSSTwvYj4gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+c2VydmxldFBhdGg8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgIHJlcS5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj51c2VyUHJpbmNpcGFsPC9iPiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICByZXEuZ2V0VXNlclByaW5jaXBhbCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvdWw+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8aHI+Iik7CisKKyAgICAgICAgLy8gRG9jdW1lbnQgdGhlIHNlcnZsZXQgcmVxdWVzdCBhdHRyaWJ1dGVzCisgICAgICAgIG91dC5wcmludGxuKCI8aDE+U2VydmxldFJlcXVlc3QgQXR0cmlidXRlczwvaDE+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8dWw+Iik7CisgICAgICAgIGF0dHJzID0gcmVxLmdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgICAgIHdoaWxlIChhdHRycy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGF0dHIgPSAoU3RyaW5nKSBhdHRycy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj4iICsgYXR0ciArICI8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEuZ2V0QXR0cmlidXRlKGF0dHIpKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbigiPC91bD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxocj4iKTsKKworICAgICAgICAvLyBQcm9jZXNzIHRoZSBjdXJyZW50IHNlc3Npb24gKGlmIHRoZXJlIGlzIG9uZSkKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcS5nZXRTZXNzaW9uKGZhbHNlKTsKKyAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworCisgICAgICAgICAgICAvLyBEb2N1bWVudCB0aGUgc2Vzc2lvbiBwcm9wZXJ0aWVzCisgICAgICAgICAgICBvdXQucHJpbnRsbigiPGgxPkh0dHBTZXNzaW9uIFByb3BlcnRpZXM8L2gxPiIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjx1bD4iKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+aWQ8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldElkKCkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5jcmVhdGlvblRpbWU8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShzZXNzaW9uLmdldENyZWF0aW9uVGltZSgpKSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiPGxpPjxiPmxhc3RBY2Nlc3NlZFRpbWU8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShzZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWUoKSkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5tYXhJbmFjdGl2ZUludGVydmFsPC9iPiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRNYXhJbmFjdGl2ZUludGVydmFsKCkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjwvdWw+Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiPGhyPiIpOworCisgICAgICAgICAgICAvLyBEb2N1bWVudCB0aGUgc2Vzc2lvbiBhdHRyaWJ1dGVzCisgICAgICAgICAgICBvdXQucHJpbnRsbigiPGgxPkh0dHBTZXNzaW9uIEF0dHJpYnV0ZXM8L2gxPiIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjx1bD4iKTsKKyAgICAgICAgICAgIGF0dHJzID0gc2Vzc2lvbi5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgICAgICAgICAgd2hpbGUgKGF0dHJzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHIgPSAoU3RyaW5nKSBhdHRycy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+IiArIGF0dHIgKyAiPC9iPiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKGF0dHIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8L3VsPiIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjxocj4iKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gRG9jdW1lbnQgdGhlIHNlcnZsZXQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzCisgICAgICAgIG91dC5wcmludGxuKCI8aDE+U2VydmxldENvbmZpZyBQcm9wZXJ0aWVzPC9oMT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjx1bD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5zZXJ2bGV0TmFtZTwvYj4gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbmZpZygpLmdldFNlcnZsZXROYW1lKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPC91bD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxocj4iKTsKKworICAgICAgICAvLyBEb2N1bWVudCB0aGUgc2VydmxldCBjb25maWd1cmF0aW9uIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgb3V0LnByaW50bG4oIjxoMT5TZXJ2bGV0Q29uZmlnIEluaXRpYWxpemF0aW9uIFBhcmFtZXRlcnM8L2gxPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPHVsPiIpOworICAgICAgICBwYXJhbXMgPSBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIHdoaWxlIChwYXJhbXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbSA9IChTdHJpbmcpIHBhcmFtcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIocGFyYW0pOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj4iICsgcGFyYW0gKyAiPC9iPiA9ICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIjwvdWw+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8aHI+Iik7CisKKyAgICAgICAgLy8gRG9jdW1lbnQgdGhlIHNlcnZsZXQgY29udGV4dCBwcm9wZXJ0aWVzCisgICAgICAgIG91dC5wcmludGxuKCI8aDE+U2VydmxldENvbnRleHQgUHJvcGVydGllczwvaDE+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8dWw+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+bWFqb3JWZXJzaW9uPC9iPiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldE1ham9yVmVyc2lvbigpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5taW5vclZlcnNpb248L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0TWlub3JWZXJzaW9uKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPGxpPjxiPnJlYWxQYXRoKCcvJyk8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVhbFBhdGgoIi8iKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+c2VydmVySW5mbzwvYj4gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRTZXJ2ZXJJbmZvKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPC91bD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxocj4iKTsKKworICAgICAgICAvLyBEb2N1bWVudCB0aGUgc2VydmxldCBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgb3V0LnByaW50bG4oIjxoMT5TZXJ2bGV0Q29udGV4dCBJbml0aWFsaXphdGlvbiBQYXJhbWV0ZXJzPC9oMT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjx1bD4iKTsKKyAgICAgICAgcGFyYW1zID0gZ2V0U2VydmxldENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgd2hpbGUgKHBhcmFtcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHBhcmFtID0gKFN0cmluZykgcGFyYW1zLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIocGFyYW0pOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj4iICsgcGFyYW0gKyAiPC9iPiA9ICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIjwvdWw+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8aHI+Iik7CisKKyAgICAgICAgLy8gRG9jdW1lbnQgdGhlIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGVzCisgICAgICAgIG91dC5wcmludGxuKCI8aDE+U2VydmxldENvbnRleHQgQXR0cmlidXRlczwvaDE+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8dWw+Iik7CisgICAgICAgIGF0dHJzID0gZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgICAgICB3aGlsZSAoYXR0cnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBhdHRyID0gKFN0cmluZykgYXR0cnMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+IiArIGF0dHIgKyAiPC9iPiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGUoYXR0cikpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludGxuKCI8L3VsPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGhyPiIpOworCisKKworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyBDR0kgR2F0ZXdheSBzZXJ2aWNlIC0tIGRlbGVnYXRlcyB0byA8Y29kZT5kb0dldDwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgcmVxICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHBhc3NlZCBpbiBieSBzZXJ2bGV0IGNvbnRhaW5lcgorICAgICAqIEBwYXJhbSAgcmVzICAgSHR0cFNlcnZsZXRSZXNwb25zZSBwYXNzZWQgaW4gYnkgc2VydmxldCBjb250YWluZXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIFNlcnZsZXRFeGNlcHRpb24gIGlmIGEgc2VydmxldC1zcGVjaWZpYyBleGNlcHRpb24gb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIGlmIGEgcmVhZC93cml0ZSBleGNlcHRpb24gb2NjdXJzCisgICAgICoKKyAgICAgKiBAc2VlIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldAorICAgICAqCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBkb0dldChyZXEsIHJlcyk7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIENHSSBHYXRld2F5IHNlcnZpY2UKKyAgICAgKgorICAgICAqIEBwYXJhbSAgcmVxICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHBhc3NlZCBpbiBieSBzZXJ2bGV0IGNvbnRhaW5lcgorICAgICAqIEBwYXJhbSAgcmVzICAgSHR0cFNlcnZsZXRSZXNwb25zZSBwYXNzZWQgaW4gYnkgc2VydmxldCBjb250YWluZXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIFNlcnZsZXRFeGNlcHRpb24gIGlmIGEgc2VydmxldC1zcGVjaWZpYyBleGNlcHRpb24gb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIGlmIGEgcmVhZC93cml0ZSBleGNlcHRpb24gb2NjdXJzCisgICAgICoKKyAgICAgKiBAc2VlIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldAorICAgICAqCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgd2Ugd2VyZSBub3QgYWNjZXNzZWQgdXNpbmcgdGhlIGludm9rZXIgc2VydmxldAorICAgICAgICBpZiAocmVxLmdldEF0dHJpYnV0ZShHbG9iYWxzLklOVk9LRURfQVRUUikgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbmF2YWlsYWJsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiQ2Fubm90IGludm9rZSBDR0lTZXJ2bGV0IHRocm91Z2ggdGhlIGludm9rZXIiKTsKKworICAgICAgICBDR0lFbnZpcm9ubWVudCBjZ2lFbnYgPSBuZXcgQ0dJRW52aXJvbm1lbnQocmVxLCBnZXRTZXJ2bGV0Q29udGV4dCgpKTsKKworICAgICAgICBpZiAoY2dpRW52LmlzVmFsaWQoKSkgeworICAgICAgICAgICAgQ0dJUnVubmVyIGNnaSA9IG5ldyBDR0lSdW5uZXIoY2dpRW52LmdldENvbW1hbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNnaUVudi5nZXRFbnZpcm9ubWVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2dpRW52LmdldFdvcmtpbmdEaXJlY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNnaUVudi5nZXRQYXJhbWV0ZXJzKCkpOworICAgICAgICAgICAgLy9pZiBQT1NULCB3ZSBuZWVkIHRvIGNnaS5zZXRJbnB1dAorICAgICAgICAgICAgLy9SRU1JTkQ6IGhvdyBkb2VzIHRoaXMgaW50ZXJhY3Qgd2l0aCBTZXJ2bGV0IEFQSSAyLjMncyBGaWx0ZXJzPyEKKyAgICAgICAgICAgIGlmICgiUE9TVCIuZXF1YWxzKHJlcS5nZXRNZXRob2QoKSkpIHsKKyAgICAgICAgICAgICAgICBjZ2kuc2V0SW5wdXQocmVxLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2dpLnNldFJlc3BvbnNlKHJlcyk7CisgICAgICAgICAgICBjZ2kucnVuKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWNnaUVudi5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJlcy5zZXRTdGF0dXMoNDA0KTsKKyAgICAgICAgfQorIAorICAgICAgICBpZiAoZGVidWcgPj0gMTApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU2VydmxldE91dHB1dFN0cmVhbSBvdXQgPSByZXMuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjxIVE1MPjxIRUFEPjxUSVRMRT4kTmFtZSQ8L1RJVExFPjwvSEVBRD4iKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPEJPRFk+JEhlYWRlciQ8cD4iKTsKKworICAgICAgICAgICAgICAgIGlmIChjZ2lFbnYuaXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGNnaUVudi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPEgzPiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiQ0dJIHNjcmlwdCBub3QgZm91bmQgb3Igbm90IHNwZWNpZmllZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjwvSDM+Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCI8SDQ+Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJDaGVjayB0aGUgPGI+SHR0cFNlcnZsZXRSZXF1ZXN0ICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPGEgaHJlZj1cIiNwYXRoSW5mb1wiPnBhdGhJbmZvPC9hPjwvYj4gIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJwcm9wZXJ0eSB0byBzZWUgaWYgaXQgaXMgd2hhdCB5b3UgbWVhbnQgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJpdCB0byBiZS4gIFlvdSBtdXN0IHNwZWNpZnkgYW4gZXhpc3RhbnQgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJhbmQgZXhlY3V0YWJsZSBmaWxlIGFzIHBhcnQgb2YgdGhlICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigicGF0aC1pbmZvLiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPC9IND4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjxIND4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIkZvciBhIGdvb2QgZGlzY3Vzc2lvbiBvZiBob3cgQ0dJIHNjcmlwdHMgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJ3b3JrIGFuZCB3aGF0IHRoZWlyIGVudmlyb25tZW50IHZhcmlhYmxlcyAiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIm1lYW4sIHBsZWFzZSB2aXNpdCB0aGUgPGEgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJocmVmPVwiaHR0cDovL2NnaS1zcGVjLmdvbHV4LmNvbVwiPkNHSSAiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIlNwZWNpZmljYXRpb24gcGFnZTwvYT4uIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCI8L0g0PiIpOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpbnRTZXJ2bGV0RW52aXJvbm1lbnQob3V0LCByZXEsIHJlcyk7CisKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPC9CT0RZPjwvSFRNTD4iKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgfQorCisgICAgICAgIH0gLy9kZWJ1Z2dpbmcKKworCisgICAgfSAvL2RvR2V0CisKKworCisgICAgLyoqIEZvciBmdXR1cmUgdGVzdGluZyB1c2Ugb25seTsgZG9lcyBub3RoaW5nIHJpZ2h0IG5vdyAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIkSGVhZGVyJCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbGwgc2hlbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBIYXZlIHRvIGRvIGl0IHRoaXMgcmF0aGVyIHVnbHkgd2F5CisgICAgICogYXMgdGhlIEFQSSB0byBvYnRhaW4gaXMgbm90IGF2YWlsYWJsZSBpbiAxLjQgYW5kIGVhcmxpZXIgQVBJcy4KKyAgICAgKgorICAgICAqIFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnJnYWdub24uY29tL2phdmFkZXRhaWxzL2phdmEtMDE1MC5odG1sIj5SZWFkIGVudmlyb25tZW50CisgICAgICogdmFyaWFibGVzIGZyb20gYW4gYXBwbGljYXRpb248L2E+IGZvciBvcmlnaW5hbCBzb3VyY2UgYW5kIGFydGljbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgZ2V0U2hlbGxFbnZpcm9ubWVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEhhc2h0YWJsZSBlbnZWYXJzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBQcm9jZXNzIHAgPSBudWxsOworICAgICAgICBSdW50aW1lIHIgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKKyAgICAgICAgU3RyaW5nIE9TID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgYm9vbGVhbiBpZ25vcmVDYXNlOworCisgICAgICAgIGlmIChPUy5pbmRleE9mKCJ3aW5kb3dzIDkiKSA+IC0xKSB7CisgICAgICAgICAgICBwID0gci5leGVjKCAiY29tbWFuZC5jb20gL2Mgc2V0IiApOworICAgICAgICAgICAgaWdub3JlQ2FzZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoIChPUy5pbmRleE9mKCJudCIpID4gLTEpCisgICAgICAgICAgICAgICAgfHwgKE9TLmluZGV4T2YoIndpbmRvd3MgMjAiKSA+IC0xKQorICAgICAgICAgICAgICAgIHx8IChPUy5pbmRleE9mKCJ3aW5kb3dzIHhwIikgPiAtMSkgKSB7CisgICAgICAgICAgICAvLyB0aGFua3MgdG8gSnVhbkZyYW4gZm9yIHRoZSB4cCBmaXghCisgICAgICAgICAgICBwID0gci5leGVjKCAiY21kLmV4ZSAvYyBzZXQiICk7CisgICAgICAgICAgICBpZ25vcmVDYXNlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG91ciBsYXN0IGhvcGUsIHdlIGFzc3VtZSBVbml4ICh0aGFua3MgdG8gSC4gV2FyZSBmb3IgdGhlIGZpeCkKKyAgICAgICAgICAgIHAgPSByLmV4ZWMoICJlbnYiICk7CisgICAgICAgICAgICBpZ25vcmVDYXNlID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcgorICAgICAgICAgICAgKCBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIHAuZ2V0SW5wdXRTdHJlYW0oKSApICk7CisgICAgICAgIFN0cmluZyBsaW5lOworICAgICAgICB3aGlsZSggKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsICkgeworICAgICAgICAgICAgaW50IGlkeCA9IGxpbmUuaW5kZXhPZiggJz0nICk7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gbGluZS5zdWJzdHJpbmcoIDAsIGlkeCApOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbGluZS5zdWJzdHJpbmcoIGlkeCsxICk7CisgICAgICAgICAgICBpZiAoaWdub3JlQ2FzZSkgeworICAgICAgICAgICAgICAgIGtleSA9IGtleS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW52VmFycy5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVudlZhcnM7CisgICAgfQorCisKKworCisKKworCisgICAgLyoqCisgICAgICogRW5jYXBzdWxhdGVzIHRoZSBDR0kgZW52aXJvbm1lbnQgYW5kIHJ1bGVzIHRvIGRlcml2ZQorICAgICAqIHRoYXQgZW52aXJvbm1lbnQgZnJvbSB0aGUgc2VydmxldCBjb250YWluZXIgYW5kIHJlcXVlc3QgaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAdmVyc2lvbiAgJFJldmlzaW9uJCwgJERhdGUkCisgICAgICogQHNpbmNlICAgIFRvbWNhdCA0LjAKKyAgICAgKgorICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBDR0lFbnZpcm9ubWVudCB7CisKKworICAgICAgICAvKiogY29udGV4dCBvZiB0aGUgZW5jbG9zaW5nIHNlcnZsZXQgKi8KKyAgICAgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworICAgICAgICAvKiogY29udGV4dCBwYXRoIG9mIGVuY2xvc2luZyBzZXJ2bGV0ICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNvbnRleHRQYXRoID0gbnVsbDsKKworICAgICAgICAvKiogc2VydmxldCBVUkkgb2YgdGhlIGVuY2xvc2luZyBzZXJ2bGV0ICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHNlcnZsZXRQYXRoID0gbnVsbDsKKworICAgICAgICAvKiogcGF0aEluZm8gZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aEluZm8gPSBudWxsOworCisgICAgICAgIC8qKiByZWFsIGZpbGUgc3lzdGVtIGRpcmVjdG9yeSBvZiB0aGUgZW5jbG9zaW5nIHNlcnZsZXQncyB3ZWIgYXBwICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHdlYkFwcFJvb3REaXIgPSBudWxsOworCisgICAgICAgIC8qKiB0ZW1wZGlyIGZvciBjb250ZXh0IC0gdXNlZCB0byBleHBhbmQgc2NyaXB0cyBpbiB1bmV4cGFuZGVkIHdhcnMgKi8KKyAgICAgICAgcHJpdmF0ZSBGaWxlIHRtcERpciA9IG51bGw7CisKKyAgICAgICAgLyoqIGRlcml2ZWQgY2dpIGVudmlyb25tZW50ICovCisgICAgICAgIHByaXZhdGUgSGFzaHRhYmxlIGVudiA9IG51bGw7CisKKyAgICAgICAgLyoqIGNnaSBjb21tYW5kIHRvIGJlIGludm9rZWQgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29tbWFuZCA9IG51bGw7CisKKyAgICAgICAgLyoqIGNnaSBjb21tYW5kJ3MgZGVzaXJlZCB3b3JraW5nIGRpcmVjdG9yeSAqLworICAgICAgICBwcml2YXRlIEZpbGUgd29ya2luZ0RpcmVjdG9yeSA9IG51bGw7CisKKyAgICAgICAgLyoqIGNnaSBjb21tYW5kJ3MgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3QgY21kTGluZVBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgLyoqIHdoZXRoZXIgb3Igbm90IHRoaXMgb2JqZWN0IGlzIHZhbGlkIG9yIG5vdCAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgQ0dJRW52aXJvbm1lbnQgYW5kIGRlcml2ZXMgdGhlIG5lY2Vzc2FyeSBlbnZpcm9ubWVudCwKKyAgICAgICAgICogcXVlcnkgcGFyYW1ldGVycywgd29ya2luZyBkaXJlY3RvcnksIGNnaSBjb21tYW5kLCBldGMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgcmVxICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCBmb3IgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgdGhlIFNlcnZsZXQgQVBJCisgICAgICAgICAqIEBwYXJhbSAgY29udGV4dCAgIFNlcnZsZXRDb250ZXh0IGZvciBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgU2VydmxldCBBUEkKKyAgICAgICAgICoKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBDR0lFbnZpcm9ubWVudChIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHNldHVwRnJvbUNvbnRleHQoY29udGV4dCk7CisgICAgICAgICAgICBzZXR1cEZyb21SZXF1ZXN0KHJlcSk7CisKKyAgICAgICAgICAgIHRoaXMudmFsaWQgPSBzZXRDR0lFbnZpcm9ubWVudChyZXEpOworCisgICAgICAgICAgICBpZiAodGhpcy52YWxpZCkgeworICAgICAgICAgICAgICAgIHdvcmtpbmdEaXJlY3RvcnkgPSBuZXcgRmlsZShjb21tYW5kLnN1YnN0cmluZygwLAorICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisKKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlcyB0aGUgU2VydmxldENvbnRleHQgdG8gc2V0IHNvbWUgQ0dJIHZhcmlhYmxlcworICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGNvbnRleHQgICBTZXJ2bGV0Q29udGV4dCBmb3IgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgIFNlcnZsZXQgQVBJCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cEZyb21Db250ZXh0KFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICB0aGlzLndlYkFwcFJvb3REaXIgPSBjb250ZXh0LmdldFJlYWxQYXRoKCIvIik7CisgICAgICAgICAgICB0aGlzLnRtcERpciA9IChGaWxlKSBjb250ZXh0LmdldEF0dHJpYnV0ZShHbG9iYWxzLldPUktfRElSX0FUVFIpOworICAgICAgICB9CisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VzIHRoZSBIdHRwU2VydmxldFJlcXVlc3QgdG8gc2V0IG1vc3QgQ0dJIHZhcmlhYmxlcworICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIHJlcSAgIEh0dHBTZXJ2bGV0UmVxdWVzdCBmb3IgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkKKyAgICAgICAgICogICAgICAgICAgICAgICB0aGUgU2VydmxldCBBUEkKKyAgICAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIAorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBGcm9tUmVxdWVzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxKQorICAgICAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9IHJlcS5nZXRDb250ZXh0UGF0aCgpOworICAgICAgICAgICAgdGhpcy5zZXJ2bGV0UGF0aCA9IHJlcS5nZXRTZXJ2bGV0UGF0aCgpOworICAgICAgICAgICAgdGhpcy5wYXRoSW5mbyA9IHJlcS5nZXRQYXRoSW5mbygpOworICAgICAgICAgICAgLy8gSWYgZ2V0UGF0aEluZm8oKSByZXR1cm5zIG51bGwsIG11c3QgYmUgdXNpbmcgZXh0ZW5zaW9uIG1hcHBpbmcKKyAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgcGF0aEluZm8gc2hvdWxkIGJlIHNhbWUgYXMgc2VydmxldFBhdGgKKyAgICAgICAgICAgIGlmICh0aGlzLnBhdGhJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnBhdGhJbmZvID0gdGhpcy5zZXJ2bGV0UGF0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSWYgdGhlIHJlcXVlc3QgbWV0aG9kIGlzIEdFVCwgUE9TVCBvciBIRUFEIGFuZCB0aGUgcXVlcnkgc3RyaW5nCisgICAgICAgICAgICAvLyBkb2VzIG5vdCBjb250YWluIGFuIHVuZW5jb2RlZCAiPSIgdGhpcyBpcyBhbiBpbmRleGVkIHF1ZXJ5LgorICAgICAgICAgICAgLy8gVGhlIHBhcnNlZCBxdWVyeSBzdHJpbmcgYmVjb21lcyB0aGUgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIC8vIGZvciB0aGUgY2dpIGNvbW1hbmQuCisgICAgICAgICAgICBpZiAocmVxLmdldE1ldGhvZCgpLmVxdWFscygiR0VUIikKKyAgICAgICAgICAgICAgICB8fCByZXEuZ2V0TWV0aG9kKCkuZXF1YWxzKCJQT1NUIikKKyAgICAgICAgICAgICAgICB8fCByZXEuZ2V0TWV0aG9kKCkuZXF1YWxzKCJIRUFEIikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcXMgPSByZXEuZ2V0UXVlcnlTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAocXMgIT0gbnVsbCAmJiBxcy5pbmRleE9mKCI9IikgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHFzVG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihxcywgIisiKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBxc1Rva2Vucy5oYXNNb3JlVG9rZW5zKCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbWRMaW5lUGFyYW1ldGVycy5hZGQoVVJMRGVjb2Rlci5kZWNvZGUocXNUb2tlbnMubmV4dFRva2VuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyRW5jb2RpbmcpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc29sdmVzIGNvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNnaSBzY3JpcHQuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBFeGFtcGxlIFVSSToKKyAgICAgICAgICogPFBSRT4gL3NlcnZsZXQvY2dpZ2F0ZXdheS9kaXIxL3JlYWxDR0lzY3JpcHQvcGF0aGluZm8xIDwvUFJFPgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxMST48Yj5wYXRoPC9iPiA9ICRDQVRBTElOQV9IT01FL215d2ViYXBwL2RpcjEvcmVhbENHSXNjcmlwdAorICAgICAgICAgKiA8TEk+PGI+c2NyaXB0TmFtZTwvYj4gPSAvc2VydmxldC9jZ2lnYXRld2F5L2RpcjEvcmVhbENHSXNjcmlwdAorICAgICAgICAgKiA8TEk+PGI+Y2dpTmFtZTwvYj4gPSAvZGlyMS9yZWFsQ0dJc2NyaXB0CisgICAgICAgICAqIDxMST48Yj5uYW1lPC9iPiA9IHJlYWxDR0lzY3JpcHQKKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogQ0dJIHNlYXJjaCBhbGdvcml0aG06IHNlYXJjaCB0aGUgcmVhbCBwYXRoIGJlbG93CisgICAgICAgICAqICAgICZsdDtteS13ZWJhcHAtcm9vdCZndDsgYW5kIGZpbmQgdGhlIGZpcnN0IG5vbi1kaXJlY3RvcnkgaW4KKyAgICAgICAgICogICAgdGhlIGdldFBhdGhUcmFuc2xhdGVkKCIvIiksIHJlYWRpbmcvc2VhcmNoaW5nIGZyb20gbGVmdC10by1yaWdodC4KKyAgICAgICAgICo8L3A+CisgICAgICAgICAqPHA+CisgICAgICAgICAqICAgVGhlIENHSSBzZWFyY2ggcGF0aCB3aWxsIHN0YXJ0IGF0CisgICAgICAgICAqICAgd2ViQXBwUm9vdERpciArIEZpbGUuc2VwYXJhdG9yICsgY2dpUGF0aFByZWZpeAorICAgICAgICAgKiAgIChvciB3ZWJBcHBSb290RGlyIGFsb25lIGlmIGNnaVBhdGhQcmVmaXggaXMKKyAgICAgICAgICogICBudWxsKS4KKyAgICAgICAgICo8L3A+CisgICAgICAgICAqPHA+CisgICAgICAgICAqICAgY2dpUGF0aFByZWZpeCBpcyBkZWZpbmVkIGJ5IHNldHRpbmcKKyAgICAgICAgICogICB0aGlzIHNlcnZsZXQncyBjZ2lQYXRoUHJlZml4IGluaXQgcGFyYW1ldGVyCisgICAgICAgICAqCisgICAgICAgICAqPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGF0aEluZm8gICAgICAgU3RyaW5nIGZyb20gSHR0cFNlcnZsZXRSZXF1ZXN0LmdldFBhdGhJbmZvKCkKKyAgICAgICAgICogQHBhcmFtIHdlYkFwcFJvb3REaXIgIFN0cmluZyBmcm9tIGNvbnRleHQuZ2V0UmVhbFBhdGgoIi8iKQorICAgICAgICAgKiBAcGFyYW0gY29udGV4dFBhdGggICAgU3RyaW5nIGFzIGZyb20KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpCisgICAgICAgICAqIEBwYXJhbSBzZXJ2bGV0UGF0aCAgICBTdHJpbmcgYXMgZnJvbQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkKKyAgICAgICAgICogQHBhcmFtIGNnaVBhdGhQcmVmaXggIHN1YmRpcmVjdG9yeSBvZiB3ZWJBcHBSb290RGlyIGJlbG93IHdoaWNoCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgd2ViIGFwcCdzIENHSXMgbWF5IGJlIHN0b3JlZDsgY2FuIGJlIG51bGwuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICBUaGUgQ0dJIHNlYXJjaCBwYXRoIHdpbGwgc3RhcnQgYXQKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgIHdlYkFwcFJvb3REaXIgKyBGaWxlLnNlcGFyYXRvciArIGNnaVBhdGhQcmVmaXgKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgIChvciB3ZWJBcHBSb290RGlyIGFsb25lIGlmIGNnaVBhdGhQcmVmaXggaXMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgIG51bGwpLiAgY2dpUGF0aFByZWZpeCBpcyBkZWZpbmVkIGJ5IHNldHRpbmcKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBzZXJ2bGV0J3MgY2dpUGF0aFByZWZpeCBpbml0IHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT4KKyAgICAgICAgICogPGNvZGU+cGF0aDwvY29kZT4gLSAgICBmdWxsIGZpbGUtc3lzdGVtIHBhdGggdG8gdmFsaWQgY2dpIHNjcmlwdCwKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBudWxsIGlmIG5vIGNnaSB3YXMgZm91bmQKKyAgICAgICAgICogPGxpPgorICAgICAgICAgKiA8Y29kZT5zY3JpcHROYW1lPC9jb2RlPiAtCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgQ0dJIHZhcmlhYmxlIFNDUklQVF9OQU1FOyB0aGUgZnVsbCBVUkwgcGF0aAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIHZhbGlkIGNnaSBzY3JpcHQgb3IgbnVsbCBpZiBubyBjZ2kgd2FzCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQKKyAgICAgICAgICogPGxpPgorICAgICAgICAgKiA8Y29kZT5jZ2lOYW1lPC9jb2RlPiAtIHNlcnZsZXQgcGF0aEluZm8gZnJhZ21lbnQgY29ycmVzcG9uZGluZyB0bworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjZ2kgc2NyaXB0IGl0c2VsZiwgb3IgbnVsbCBpZiBub3QgZm91bmQKKyAgICAgICAgICogPGxpPgorICAgICAgICAgKiA8Y29kZT5uYW1lPC9jb2RlPiAtICAgIHNpbXBsZSBuYW1lIChubyBkaXJlY3Rvcmllcykgb2YgdGhlCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgY2dpIHNjcmlwdCwgb3IgbnVsbCBpZiBubyBjZ2kgd2FzIGZvdW5kCisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBUb21jYXQgNC4wCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZmluZENHSShTdHJpbmcgcGF0aEluZm8sIFN0cmluZyB3ZWJBcHBSb290RGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGgsIFN0cmluZyBzZXJ2bGV0UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNnaVBhdGhQcmVmaXgpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBzY3JpcHRuYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBjZ2luYW1lID0gIiI7CisKKyAgICAgICAgICAgIGlmICgod2ViQXBwUm9vdERpciAhPSBudWxsKQorICAgICAgICAgICAgICAgICYmICh3ZWJBcHBSb290RGlyLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSA9PQorICAgICAgICAgICAgICAgICAgICAod2ViQXBwUm9vdERpci5sZW5ndGgoKSAtIDEpKSkgeworICAgICAgICAgICAgICAgICAgICAvL3N0cmlwIHRoZSB0cmFpbGluZyAiLyIgZnJvbSB0aGUgd2ViQXBwUm9vdERpcgorICAgICAgICAgICAgICAgICAgICB3ZWJBcHBSb290RGlyID0KKyAgICAgICAgICAgICAgICAgICAgd2ViQXBwUm9vdERpci5zdWJzdHJpbmcoMCwgKHdlYkFwcFJvb3REaXIubGVuZ3RoKCkgLSAxKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjZ2lQYXRoUHJlZml4ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3ZWJBcHBSb290RGlyID0gd2ViQXBwUm9vdERpciArIEZpbGUuc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICsgY2dpUGF0aFByZWZpeDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRlYnVnID49IDIpIHsKKyAgICAgICAgICAgICAgICBsb2coImZpbmRDR0k6IHBhdGg9IiArIHBhdGhJbmZvICsgIiwgIiArIHdlYkFwcFJvb3REaXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGaWxlIGN1cnJlbnRMb2NhdGlvbiA9IG5ldyBGaWxlKHdlYkFwcFJvb3REaXIpOworICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIGRpcldhbGtlciA9CisgICAgICAgICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGhJbmZvLCAiLyIpOworICAgICAgICAgICAgaWYgKGRlYnVnID49IDMpIHsKKyAgICAgICAgICAgICAgICBsb2coImZpbmRDR0k6IGN1cnJlbnRMb2M9IiArIGN1cnJlbnRMb2NhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoIWN1cnJlbnRMb2NhdGlvbi5pc0ZpbGUoKSAmJiBkaXJXYWxrZXIuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gMykgeworICAgICAgICAgICAgICAgICAgICBsb2coImZpbmRDR0k6IGN1cnJlbnRMb2M9IiArIGN1cnJlbnRMb2NhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBuZXh0RWxlbWVudCA9IChTdHJpbmcpIGRpcldhbGtlci5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGN1cnJlbnRMb2NhdGlvbiA9IG5ldyBGaWxlKGN1cnJlbnRMb2NhdGlvbiwgbmV4dEVsZW1lbnQpOworICAgICAgICAgICAgICAgIGNnaW5hbWUgPSBjZ2luYW1lICsgIi8iICsgbmV4dEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWN1cnJlbnRMb2NhdGlvbi5pc0ZpbGUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyBudWxsLCBudWxsLCBudWxsLCBudWxsIH07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiZmluZENHSTogRk9VTkQgY2dpIGF0ICIgKyBjdXJyZW50TG9jYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRoID0gY3VycmVudExvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgIG5hbWUgPSBjdXJyZW50TG9jYXRpb24uZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgaWYgKCIuIi5lcXVhbHMoY29udGV4dFBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNjcmlwdG5hbWUgPSBzZXJ2bGV0UGF0aDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzY3JpcHRuYW1lID0gY29udGV4dFBhdGggKyBzZXJ2bGV0UGF0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFzZXJ2bGV0UGF0aC5lcXVhbHMoY2dpbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0bmFtZSA9IHNjcmlwdG5hbWUgKyBjZ2luYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRlYnVnID49IDEpIHsKKyAgICAgICAgICAgICAgICBsb2coImZpbmRDR0kgY2FsYzogbmFtZT0iICsgbmFtZSArICIsIHBhdGg9IiArIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBzY3JpcHRuYW1lPSIgKyBzY3JpcHRuYW1lICsgIiwgY2dpbmFtZT0iICsgY2dpbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgcGF0aCwgc2NyaXB0bmFtZSwgY2dpbmFtZSwgbmFtZSB9OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgdGhlIENHSSBlbnZpcm9ubWVudCB0byBiZSBzdXBwbGllZCB0byB0aGUgaW52b2tlZCBDR0kKKyAgICAgICAgICogc2NyaXB0OyByZWxpZXMgaGVhdmxpeSBvbiBTZXJ2bGV0IEFQSSBtZXRob2RzIGFuZCBmaW5kQ0dJCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgICByZXEgcmVxdWVzdCBhc3NvY2lhdGVkIHdpdGggdGhlIENHSQorICAgICAgICAgKiAgICAgICAgICAgaW52b2thdGlvbgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuICAgdHJ1ZSBpZiBlbnZpcm9ubWVudCB3YXMgc2V0IE9LLCBmYWxzZSBpZiB0aGVyZQorICAgICAgICAgKiAgICAgICAgICAgd2FzIGEgcHJvYmxlbSBhbmQgbm8gZW52aXJvbm1lbnQgd2FzIHNldAorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2V0Q0dJRW52aXJvbm1lbnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIHNsaWdodGx5IHVnbHk7IGMnZXN0IGxhIHZpZS4KKyAgICAgICAgICAgICAqICJZb3UgY2Fubm90IHN0b3AgW3VnbGluZXNzXSwgeW91IGNhbiBvbmx5IGhvcGUgdG8gY29udGFpbiBbaXRdIgorICAgICAgICAgICAgICogKGFwb2xvZ2llcyB0byBNYXJ2IEFsYmVydCByZWdhcmRpbmcgTUopCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgSGFzaHRhYmxlIGVudnAgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAgICAgICAgIC8vIEFkZCB0aGUgc2hlbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIChpZiBhbnkpCisgICAgICAgICAgICBlbnZwLnB1dEFsbChzaGVsbEVudik7CisKKyAgICAgICAgICAgIC8vIEFkZCB0aGUgQ0dJIGVudmlyb25tZW50IHZhcmlhYmxlcworICAgICAgICAgICAgU3RyaW5nIHNQYXRoSW5mb09yaWcgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHNQYXRoVHJhbnNsYXRlZE9yaWcgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHNQYXRoSW5mb0NHSSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgc1BhdGhUcmFuc2xhdGVkQ0dJID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBzQ0dJRnVsbFBhdGggPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHNDR0lTY3JpcHROYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBzQ0dJRnVsbE5hbWUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHNDR0lOYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZ1tdIHNDR0lOYW1lczsKKworCisgICAgICAgICAgICBzUGF0aEluZm9PcmlnID0gdGhpcy5wYXRoSW5mbzsKKyAgICAgICAgICAgIHNQYXRoSW5mb09yaWcgPSBzUGF0aEluZm9PcmlnID09IG51bGwgPyAiIiA6IHNQYXRoSW5mb09yaWc7CisKKyAgICAgICAgICAgIHNQYXRoVHJhbnNsYXRlZE9yaWcgPSByZXEuZ2V0UGF0aFRyYW5zbGF0ZWQoKTsKKyAgICAgICAgICAgIHNQYXRoVHJhbnNsYXRlZE9yaWcgPQorICAgICAgICAgICAgICAgIHNQYXRoVHJhbnNsYXRlZE9yaWcgPT0gbnVsbCA/ICIiIDogc1BhdGhUcmFuc2xhdGVkT3JpZzsKKworICAgICAgICAgICAgaWYgKHdlYkFwcFJvb3REaXIgPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgYXBwIGhhcyBub3QgYmVlbiBkZXBsb3llZCBpbiBleHBsb2RlZCBmb3JtCisgICAgICAgICAgICAgICAgd2ViQXBwUm9vdERpciA9IHRtcERpci50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGV4cGFuZENHSVNjcmlwdCgpOworICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc0NHSU5hbWVzID0gZmluZENHSShzUGF0aEluZm9PcmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJBcHBSb290RGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNnaVBhdGhQcmVmaXgpOworCisgICAgICAgICAgICBzQ0dJRnVsbFBhdGggPSBzQ0dJTmFtZXNbMF07CisgICAgICAgICAgICBzQ0dJU2NyaXB0TmFtZSA9IHNDR0lOYW1lc1sxXTsKKyAgICAgICAgICAgIHNDR0lGdWxsTmFtZSA9IHNDR0lOYW1lc1syXTsKKyAgICAgICAgICAgIHNDR0lOYW1lID0gc0NHSU5hbWVzWzNdOworCisgICAgICAgICAgICBpZiAoc0NHSUZ1bGxQYXRoID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBzQ0dJU2NyaXB0TmFtZSA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgc0NHSUZ1bGxOYW1lID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBzQ0dJTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbnZwLnB1dCgiU0VSVkVSX1NPRlRXQVJFIiwgIlRPTUNBVCIpOworCisgICAgICAgICAgICBlbnZwLnB1dCgiU0VSVkVSX05BTUUiLCBudWxsc1RvQmxhbmtzKHJlcS5nZXRTZXJ2ZXJOYW1lKCkpKTsKKworICAgICAgICAgICAgZW52cC5wdXQoIkdBVEVXQVlfSU5URVJGQUNFIiwgIkNHSS8xLjEiKTsKKworICAgICAgICAgICAgZW52cC5wdXQoIlNFUlZFUl9QUk9UT0NPTCIsIG51bGxzVG9CbGFua3MocmVxLmdldFByb3RvY29sKCkpKTsKKworICAgICAgICAgICAgaW50IHBvcnQgPSByZXEuZ2V0U2VydmVyUG9ydCgpOworICAgICAgICAgICAgSW50ZWdlciBpUG9ydCA9IChwb3J0ID09IDAgPyBuZXcgSW50ZWdlcigtMSkgOiBuZXcgSW50ZWdlcihwb3J0KSk7CisgICAgICAgICAgICBlbnZwLnB1dCgiU0VSVkVSX1BPUlQiLCBpUG9ydC50b1N0cmluZygpKTsKKworICAgICAgICAgICAgZW52cC5wdXQoIlJFUVVFU1RfTUVUSE9EIiwgbnVsbHNUb0JsYW5rcyhyZXEuZ2V0TWV0aG9kKCkpKTsKKworICAgICAgICAgICAgZW52cC5wdXQoIlJFUVVFU1RfVVJJIiwgbnVsbHNUb0JsYW5rcyhyZXEuZ2V0UmVxdWVzdFVSSSgpKSk7CisKKworICAgICAgICAgICAgLyotCisgICAgICAgICAgICAgKiBQQVRIX0lORk8gc2hvdWxkIGJlIGRldGVybWluZWQgYnkgdXNpbmcgc0NHSUZ1bGxOYW1lOgorICAgICAgICAgICAgICogMSkgTGV0IHNDR0lGdWxsTmFtZSBub3QgZW5kIGluIGEgIi8iIChzZWUgbWV0aG9kIGZpbmRDR0kpCisgICAgICAgICAgICAgKiAyKSBMZXQgc0NHSUZ1bGxOYW1lIGVxdWFsIHRoZSBwYXRoSW5mbyBmcmFnbWVudCB3aGljaAorICAgICAgICAgICAgICogICAgY29ycmVzcG9uZHMgdG8gdGhlIGFjdHVhbCBjZ2kgc2NyaXB0LgorICAgICAgICAgICAgICogMykgVGh1cywgUEFUSF9JTkZPID0gcmVxdWVzdC5nZXRQYXRoSW5mbygpLnN1YnN0cmluZygKKyAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNDR0lGdWxsTmFtZS5sZW5ndGgoKSkKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAoc2VlIG1ldGhvZCBmaW5kQ0dJLCB3aGVyZSB0aGUgcmVhbCB3b3JrIGlzIGRvbmUpCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocGF0aEluZm8gPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IChwYXRoSW5mby5zdWJzdHJpbmcoc0NHSUZ1bGxOYW1lLmxlbmd0aCgpKS5sZW5ndGgoKSA8PSAwKSkgeworICAgICAgICAgICAgICAgIHNQYXRoSW5mb0NHSSA9ICIiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzUGF0aEluZm9DR0kgPSBwYXRoSW5mby5zdWJzdHJpbmcoc0NHSUZ1bGxOYW1lLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVudnAucHV0KCJQQVRIX0lORk8iLCBzUGF0aEluZm9DR0kpOworCisKKyAgICAgICAgICAgIC8qLQorICAgICAgICAgICAgICogUEFUSF9UUkFOU0xBVEVEIG11c3QgYmUgZGV0ZXJtaW5lZCBhZnRlciBQQVRIX0lORk8gKGFuZCB0aGUKKyAgICAgICAgICAgICAqIGltcGxpZWQgcmVhbCBjZ2ktc2NyaXB0KSBoYXMgYmVlbiB0YWtlbiBpbnRvIGFjY291bnQuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlczoKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBzZXJ2bGV0IGluZm8gICA9IC9zZXJ2bGV0L2NnaWd3L2RpcjEvZGlyMi9jZ2kxL3RyYW5zMS90cmFuczIKKyAgICAgICAgICAgICAqIGNnaWZ1bGxwYXRoICAgID0gL3NlcnZsZXQvY2dpZ3cvZGlyMS9kaXIyL2NnaTEKKyAgICAgICAgICAgICAqIHBhdGhfaW5mbyAgICAgID0gL3RyYW5zMS90cmFuczIKKyAgICAgICAgICAgICAqIHdlYkFwcFJvb3REaXIgID0gc2VydmxldENvbnRleHQuZ2V0UmVhbFBhdGgoIi8iKQorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIHBhdGhfdHJhbnNsYXRlZCA9IHNlcnZsZXRDb250ZXh0LmdldFJlYWxQYXRoKCIvdHJhbnMxL3RyYW5zMiIpCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhhdCBpcywgUEFUSF9UUkFOU0xBVEVEID0gd2ViQXBwUm9vdERpciArIHNQYXRoSW5mb0NHSQorICAgICAgICAgICAgICogKHVubGVzcyBzUGF0aEluZm9DR0kgaXMgbnVsbCBvciBibGFuaywgdGhlbiB0aGUgQ0dJCisgICAgICAgICAgICAgKiBzcGVjaWZpY2F0aW9uIGRpY3RhdGVzIHRoYXQgdGhlIFBBVEhfVFJBTlNMQVRFRCBtZXRhdmFyaWFibGUKKyAgICAgICAgICAgICAqIFNIT1VMRCBOT1QgYmUgZGVmaW5lZC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzUGF0aEluZm9DR0kgIT0gbnVsbCAmJiAhKCIiLmVxdWFscyhzUGF0aEluZm9DR0kpKSkgeworICAgICAgICAgICAgICAgIHNQYXRoVHJhbnNsYXRlZENHSSA9IGNvbnRleHQuZ2V0UmVhbFBhdGgoc1BhdGhJbmZvQ0dJKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc1BhdGhUcmFuc2xhdGVkQ0dJID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzUGF0aFRyYW5zbGF0ZWRDR0kgPT0gbnVsbCB8fCAiIi5lcXVhbHMoc1BhdGhUcmFuc2xhdGVkQ0dJKSkgeworICAgICAgICAgICAgICAgIC8vTk9PUAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbnZwLnB1dCgiUEFUSF9UUkFOU0xBVEVEIiwgbnVsbHNUb0JsYW5rcyhzUGF0aFRyYW5zbGF0ZWRDR0kpKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBlbnZwLnB1dCgiU0NSSVBUX05BTUUiLCBudWxsc1RvQmxhbmtzKHNDR0lTY3JpcHROYW1lKSk7CisKKyAgICAgICAgICAgIGVudnAucHV0KCJRVUVSWV9TVFJJTkciLCBudWxsc1RvQmxhbmtzKHJlcS5nZXRRdWVyeVN0cmluZygpKSk7CisKKyAgICAgICAgICAgIGVudnAucHV0KCJSRU1PVEVfSE9TVCIsIG51bGxzVG9CbGFua3MocmVxLmdldFJlbW90ZUhvc3QoKSkpOworCisgICAgICAgICAgICBlbnZwLnB1dCgiUkVNT1RFX0FERFIiLCBudWxsc1RvQmxhbmtzKHJlcS5nZXRSZW1vdGVBZGRyKCkpKTsKKworICAgICAgICAgICAgZW52cC5wdXQoIkFVVEhfVFlQRSIsIG51bGxzVG9CbGFua3MocmVxLmdldEF1dGhUeXBlKCkpKTsKKworICAgICAgICAgICAgZW52cC5wdXQoIlJFTU9URV9VU0VSIiwgbnVsbHNUb0JsYW5rcyhyZXEuZ2V0UmVtb3RlVXNlcigpKSk7CisKKyAgICAgICAgICAgIGVudnAucHV0KCJSRU1PVEVfSURFTlQiLCAiIik7IC8vbm90IG5lY2Vzc2FyeSBmb3IgZnVsbCBjb21wbGlhbmNlCisKKyAgICAgICAgICAgIGVudnAucHV0KCJDT05URU5UX1RZUEUiLCBudWxsc1RvQmxhbmtzKHJlcS5nZXRDb250ZW50VHlwZSgpKSk7CisKKworICAgICAgICAgICAgLyogTm90ZSBDR0kgc3BlYyBzYXlzIENPTlRFTlRfTEVOR1RIIG11c3QgYmUgTlVMTCAoIiIpIG9yIHVuZGVmaW5lZAorICAgICAgICAgICAgICogaWYgdGhlcmUgaXMgbm8gY29udGVudCwgc28gd2UgY2Fubm90IHB1dCAwIG9yIC0xIGluIGFzIHBlciB0aGUKKyAgICAgICAgICAgICAqIFNlcnZsZXQgQVBJIHNwZWMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludCBjb250ZW50TGVuZ3RoID0gcmVxLmdldENvbnRlbnRMZW5ndGgoKTsKKyAgICAgICAgICAgIFN0cmluZyBzQ29udGVudExlbmd0aCA9IChjb250ZW50TGVuZ3RoIDw9IDAgPyAiIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBJbnRlZ2VyKGNvbnRlbnRMZW5ndGgpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGVudnAucHV0KCJDT05URU5UX0xFTkdUSCIsIHNDb250ZW50TGVuZ3RoKTsKKworCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBoZWFkZXJzID0gcmVxLmdldEhlYWRlck5hbWVzKCk7CisgICAgICAgICAgICBTdHJpbmcgaGVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgIHdoaWxlIChoZWFkZXJzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgaGVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBoZWFkZXIgPSAoKFN0cmluZykgaGVhZGVycy5uZXh0RWxlbWVudCgpKS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgICAgIC8vUkVNSU5EOiByZXdyaXRlIG11bHRpcGxlIGhlYWRlcnMgYXMgaWYgcmVjZWl2ZWQgYXMgc2luZ2xlCisgICAgICAgICAgICAgICAgLy9SRU1JTkQ6IGNoYW5nZSBjaGFyYWN0ZXIgc2V0CisgICAgICAgICAgICAgICAgLy9SRU1JTkQ6IEkgZm9yZ290IHdoYXQgdGhlIHByZXZpb3VzIFJFTUlORCBtZWFucworICAgICAgICAgICAgICAgIGlmICgiQVVUSE9SSVpBVElPTiIuZXF1YWxzSWdub3JlQ2FzZShoZWFkZXIpIHx8CisgICAgICAgICAgICAgICAgICAgICJQUk9YWV9BVVRIT1JJWkFUSU9OIi5lcXVhbHNJZ25vcmVDYXNlKGhlYWRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9OT09QIHBlciBDR0kgc3BlY2lmaWNhdGlvbiBzZWN0aW9uIDExLjIKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlbnZwLnB1dCgiSFRUUF8iICsgaGVhZGVyLnJlcGxhY2UoJy0nLCAnXycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEuZ2V0SGVhZGVyKGhlYWRlcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRmlsZSBmQ0dJRnVsbFBhdGggPSBuZXcgRmlsZShzQ0dJRnVsbFBhdGgpOworICAgICAgICAgICAgY29tbWFuZCA9IGZDR0lGdWxsUGF0aC5nZXRDYW5vbmljYWxQYXRoKCk7CisKKyAgICAgICAgICAgIGVudnAucHV0KCJYX1RPTUNBVF9TQ1JJUFRfUEFUSCIsIGNvbW1hbmQpOyAgLy9mb3Iga2lja3MKKworICAgICAgICAgICAgZW52cC5wdXQoIlNDUklQVF9GSUxFTkFNRSIsIGNvbW1hbmQpOyAvLyBmb3IgUEhQCisKKyAgICAgICAgICAgIHRoaXMuZW52ID0gZW52cDsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBFeHRyYWN0cyByZXF1ZXN0ZWQgcmVzb3VyY2UgZnJvbSB3ZWIgYXBwIGFyY2hpdmUgdG8gY29udGV4dCB3b3JrIAorICAgICAgICAgKiBkaXJlY3RvcnkgdG8gZW5hYmxlIENHSSBzY3JpcHQgdG8gYmUgZXhlY3V0ZWQuCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBleHBhbmRDR0lTY3JpcHQoKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc3JjUGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBkZXN0UGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKworICAgICAgICAgICAgLy8gcGF0aHMgZGVwZW5kIG9uIG1hcHBpbmcKKyAgICAgICAgICAgIGlmIChjZ2lQYXRoUHJlZml4ID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgc3JjUGF0aC5hcHBlbmQocGF0aEluZm8pOworICAgICAgICAgICAgICAgIGlzID0gY29udGV4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKHNyY1BhdGgudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZGVzdFBhdGguYXBwZW5kKHRtcERpcik7CisgICAgICAgICAgICAgICAgZGVzdFBhdGguYXBwZW5kKHBhdGhJbmZvKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZXNzZW50aWFsbHkgc2FtZSBzZWFyY2ggYWxnb3JpdGhtIGFzIGZpbmRDR0koKQorICAgICAgICAgICAgICAgIHNyY1BhdGguYXBwZW5kKGNnaVBhdGhQcmVmaXgpOworICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBwYXRoV2Fsa2VyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIgKHBhdGhJbmZvLCAiLyIpOworICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHdpdGggZmlyc3QgZWxlbWVudAorICAgICAgICAgICAgICAgIHdoaWxlIChwYXRoV2Fsa2VyLmhhc01vcmVFbGVtZW50cygpICYmIChpcyA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICBzcmNQYXRoLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgICAgICAgICBzcmNQYXRoLmFwcGVuZChwYXRoV2Fsa2VyLm5leHRFbGVtZW50KCkpOworICAgICAgICAgICAgICAgICAgICBpcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbShzcmNQYXRoLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXN0UGF0aC5hcHBlbmQodG1wRGlyKTsKKyAgICAgICAgICAgICAgICBkZXN0UGF0aC5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgICAgICBkZXN0UGF0aC5hcHBlbmQoc3JjUGF0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgYW55dGhpbmcsIGdpdmUgdXAgbm93CisgICAgICAgICAgICAgICAgaWYgKGRlYnVnID49IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJleHBhbmRDR0lTY3JpcHQ6IHNvdXJjZSAnIiArIHNyY1BhdGggKyAiJyBub3QgZm91bmQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZGVzdFBhdGgudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIC8vIERvbid0IG5lZWQgdG8gZXhwYW5kIGlmIGl0IGFscmVhZHkgZXhpc3RzCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSAKKworICAgICAgICAgICAgLy8gY3JlYXRlIGRpcmVjdG9yaWVzCisgICAgICAgICAgICBTdHJpbmcgZGlyUGF0aCA9IG5ldyBTdHJpbmcgKGRlc3RQYXRoLnRvU3RyaW5nKCkuc3Vic3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAwLGRlc3RQYXRoLnRvU3RyaW5nKCkubGFzdEluZGV4T2YoIi8iKSkpOworICAgICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShkaXJQYXRoKTsKKyAgICAgICAgICAgIGRpci5ta2RpcnMoKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGV4cGFuZEZpbGVMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBmaWxlIGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmaWxlCisgICAgICAgICAgICAgICAgICAgIGlmICghZi5jcmVhdGVOZXdGaWxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgZGF0YQorICAgICAgICAgICAgICAgICAgICBJT1Rvb2xzLmZsb3coaXMsIGZvcyk7CisgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJleHBhbmRDR0lTY3JpcHQ6IGV4cGFuZGVkICciICsgc3JjUGF0aCArICInIHRvICciICsgZGVzdFBhdGggKyAiJyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgLy8gZGVsZXRlIGluIGNhc2UgZmlsZSBpcyBjb3JydXB0ZWQgCisgICAgICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcmludCBpbXBvcnRhbnQgQ0dJIGVudmlyb25tZW50IGluZm9ybWF0aW9uIGluIGEgZWFzeS10by1yZWFkIEhUTUwKKyAgICAgICAgICogdGFibGUKKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiAgSFRNTCBzdHJpbmcgY29udGFpbmluZyBDR0kgZW52aXJvbm1lbnQgaW5mbworICAgICAgICAgKgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgICAgICBzYi5hcHBlbmQoIjxUQUJMRSBib3JkZXI9Mj4iKTsKKworICAgICAgICAgICAgc2IuYXBwZW5kKCI8dHI+PHRoIGNvbHNwYW49MiBiZ2NvbG9yPWdyZXk+Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoIkNHSUVudmlyb25tZW50IEluZm88L3RoPjwvdHI+Iik7CisKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZD5EZWJ1ZyBMZXZlbDwvdGQ+PHRkPiIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGRlYnVnKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48L3RyPiIpOworCisgICAgICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGQ+VmFsaWRpdHk6PC90ZD48dGQ+Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoaXNWYWxpZCgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48L3RyPiIpOworCisgICAgICAgICAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZW52ayA9IGVudi5rZXlzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGVudmsuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKSBlbnZrLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZD4iKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHMpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjwvdGQ+PHRkPiIpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYmxhbmtzVG9TdHJpbmcoKFN0cmluZykgZW52LmdldChzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbd2lsbCBiZSBzZXQgdG8gYmxhbmtdIikpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjwvdGQ+PC90cj4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZCBjb2xzcGFuPTI+PEhSPjwvdGQ+PC90cj4iKTsKKworICAgICAgICAgICAgc2IuYXBwZW5kKCI8dHI+PHRkPkRlcml2ZWQgQ29tbWFuZDwvdGQ+PHRkPiIpOworICAgICAgICAgICAgc2IuYXBwZW5kKG51bGxzVG9CbGFua3MoY29tbWFuZCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI8L3RkPjwvdHI+Iik7CisKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZD5Xb3JraW5nIERpcmVjdG9yeTwvdGQ+PHRkPiIpOworICAgICAgICAgICAgaWYgKHdvcmtpbmdEaXJlY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh3b3JraW5nRGlyZWN0b3J5LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKCI8L3RkPjwvdHI+Iik7CisKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZD5Db21tYW5kIExpbmUgUGFyYW1zPC90ZD48dGQ+Iik7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBjbWRMaW5lUGFyYW1ldGVycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbSA9IChTdHJpbmcpIGNtZExpbmVQYXJhbWV0ZXJzLmdldChpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxwPiIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYXJhbSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8L3A+Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoIjwvdGQ+PC90cj4iKTsKKworICAgICAgICAgICAgc2IuYXBwZW5kKCI8L1RBQkxFPjxwPmVuZC4iKTsKKworICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgZGVyaXZlZCBjb21tYW5kIHN0cmluZworICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuICBjb21tYW5kIHN0cmluZworICAgICAgICAgKgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb21tYW5kKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmQ7CisgICAgICAgIH0KKworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgZGVyaXZlZCBDR0kgd29ya2luZyBkaXJlY3RvcnkKKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiAgd29ya2luZyBkaXJlY3RvcnkKKyAgICAgICAgICoKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBGaWxlIGdldFdvcmtpbmdEaXJlY3RvcnkoKSB7CisgICAgICAgICAgICByZXR1cm4gd29ya2luZ0RpcmVjdG9yeTsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyBkZXJpdmVkIENHSSBlbnZpcm9ubWVudAorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuICAgQ0dJIGVudmlyb25tZW50CisgICAgICAgICAqCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldEVudmlyb25tZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIGVudjsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyBkZXJpdmVkIENHSSBxdWVyeSBwYXJhbWV0ZXJzCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gICBDR0kgcXVlcnkgcGFyYW1ldGVycworICAgICAgICAgKgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBnZXRQYXJhbWV0ZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIGNtZExpbmVQYXJhbWV0ZXJzOworICAgICAgICB9CisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHZhbGlkaXR5IHN0YXR1cworICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuICAgdHJ1ZSBpZiB0aGlzIGVudmlyb25tZW50IGlzIHZhbGlkLCBmYWxzZQorICAgICAgICAgKiAgICAgICAgICAgb3RoZXJ3aXNlCisgICAgICAgICAqCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbGlkOworICAgICAgICB9CisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZXJ0cyBudWxsIHN0cmluZ3MgdG8gYmxhbmsgc3RyaW5ncyAoIiIpCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgICBzIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgaWYgbmVjZXNzYXJ5CisgICAgICAgICAqIEByZXR1cm4gICBhIG5vbi1udWxsIHN0cmluZywgZWl0aGVyIHRoZSBvcmlnaW5hbCBvciB0aGUgZW1wdHkgc3RyaW5nCisgICAgICAgICAqICAgICAgICAgICAoIiIpIGlmIHRoZSBvcmlnaW5hbCB3YXMgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgbnVsbHNUb0JsYW5rcyhTdHJpbmcgcykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxzVG9TdHJpbmcocywgIiIpOworICAgICAgICB9CisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZXJ0cyBudWxsIHN0cmluZ3MgdG8gYW5vdGhlciBzdHJpbmcKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICAgIGNvdWxkQmVOdWxsIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgaWYgbmVjZXNzYXJ5CisgICAgICAgICAqIEBwYXJhbSAgICBzdWJGb3JOdWxscyBzdHJpbmcgdG8gcmV0dXJuIGluc3RlYWQgb2YgYSBudWxsIHN0cmluZworICAgICAgICAgKiBAcmV0dXJuICAgYSBub24tbnVsbCBzdHJpbmcsIGVpdGhlciB0aGUgb3JpZ2luYWwgb3IgdGhlIHN1YnN0aXR1dGUKKyAgICAgICAgICogICAgICAgICAgIHN0cmluZyBpZiB0aGUgb3JpZ2luYWwgd2FzIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIG51bGxzVG9TdHJpbmcoU3RyaW5nIGNvdWxkQmVOdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1YkZvck51bGxzKSB7CisgICAgICAgICAgICByZXR1cm4gKGNvdWxkQmVOdWxsID09IG51bGwgPyBzdWJGb3JOdWxscyA6IGNvdWxkQmVOdWxsKTsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydHMgYmxhbmsgc3RyaW5ncyB0byBhbm90aGVyIHN0cmluZworICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gICAgY291bGRCZUJsYW5rIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgaWYgbmVjZXNzYXJ5CisgICAgICAgICAqIEBwYXJhbSAgICBzdWJGb3JCbGFua3Mgc3RyaW5nIHRvIHJldHVybiBpbnN0ZWFkIG9mIGEgYmxhbmsgc3RyaW5nCisgICAgICAgICAqIEByZXR1cm4gICBhIG5vbi1udWxsIHN0cmluZywgZWl0aGVyIHRoZSBvcmlnaW5hbCBvciB0aGUgc3Vic3RpdHV0ZQorICAgICAgICAgKiAgICAgICAgICAgc3RyaW5nIGlmIHRoZSBvcmlnaW5hbCB3YXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgZW1wdHkgKCIiKQorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBibGFua3NUb1N0cmluZyhTdHJpbmcgY291bGRCZUJsYW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3ViRm9yQmxhbmtzKSB7CisgICAgICAgICAgICByZXR1cm4gKCgiIi5lcXVhbHMoY291bGRCZUJsYW5rKSB8fCBjb3VsZEJlQmxhbmsgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgPyBzdWJGb3JCbGFua3MKKyAgICAgICAgICAgICAgICAgICAgOiBjb3VsZEJlQmxhbmspOworICAgICAgICB9CisKKworCisgICAgfSAvL2NsYXNzIENHSUVudmlyb25tZW50CisKKworCisKKworCisgICAgLyoqCisgICAgICogRW5jYXBzdWxhdGVzIHRoZSBrbm93bGVkZ2Ugb2YgaG93IHRvIHJ1biBhIENHSSBzY3JpcHQsIGdpdmVuIHRoZQorICAgICAqIHNjcmlwdCdzIGRlc2lyZWQgZW52aXJvbm1lbnQgYW5kIChvcHRpb25hbGx5KSBpbnB1dC9vdXRwdXQgc3RyZWFtcworICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBFeHBvc2VzIGEgPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QgdXNlZCB0byBhY3R1YWxseSBpbnZva2UgdGhlCisgICAgICogQ0dJLgorICAgICAqCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqCisgICAgICogVGhlIENHSSBlbnZpcm9ubWVudCBhbmQgc2V0dGluZ3MgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaW5mb3JtYXRpb24KKyAgICAgKiBwYXNzZWQgdG8gdGhlIGNvbnN0dWN0b3IuCisgICAgICoKKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zIGNhbiBiZSBzZXQgYnkgdGhlIDxjb2RlPnNldElucHV0PC9jb2RlPgorICAgICAqIGFuZCA8Y29kZT5zZXRSZXNwb25zZTwvY29kZT4gbWV0aG9kcywgcmVzcGVjdGl2ZWx5LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEB2ZXJzaW9uICAgJFJldmlzaW9uJCwgJERhdGUkCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgY2xhc3MgQ0dJUnVubmVyIHsKKworICAgICAgICAvKiogc2NyaXB0L2NvbW1hbmQgdG8gYmUgZXhlY3V0ZWQgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29tbWFuZCA9IG51bGw7CisKKyAgICAgICAgLyoqIGVudmlyb25tZW50IHVzZWQgd2hlbiBpbnZva2luZyB0aGUgY2dpIHNjcmlwdCAqLworICAgICAgICBwcml2YXRlIEhhc2h0YWJsZSBlbnYgPSBudWxsOworCisgICAgICAgIC8qKiB3b3JraW5nIGRpcmVjdG9yeSB1c2VkIHdoZW4gaW52b2tpbmcgdGhlIGNnaSBzY3JpcHQgKi8KKyAgICAgICAgcHJpdmF0ZSBGaWxlIHdkID0gbnVsbDsKKworICAgICAgICAvKiogY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIHRoZSBpbnZva2VkIHNjcmlwdCAqLworICAgICAgICBwcml2YXRlIEFycmF5TGlzdCBwYXJhbXMgPSBudWxsOworCisgICAgICAgIC8qKiBzdGRpbiB0byBiZSBwYXNzZWQgdG8gY2dpIHNjcmlwdCAqLworICAgICAgICBwcml2YXRlIElucHV0U3RyZWFtIHN0ZGluID0gbnVsbDsKKworICAgICAgICAvKiogcmVzcG9uc2Ugb2JqZWN0IHVzZWQgdG8gc2V0IGhlYWRlcnMgJiBnZXQgb3V0cHV0IHN0cmVhbSAqLworICAgICAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisgICAgICAgIC8qKiBib29sZWFuIHRyYWNraW5nIHdoZXRoZXIgdGhpcyBvYmplY3QgaGFzIGVub3VnaCBpbmZvIHRvIHJ1bigpICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiByZWFkeVRvUnVuID0gZmFsc2U7CisKKworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqICBDcmVhdGVzIGEgQ0dJUnVubmVyIGFuZCBpbml0aWFsaXplcyBpdHMgZW52aXJvbm1lbnQsIHdvcmtpbmcKKyAgICAgICAgICogIGRpcmVjdG9yeSwgYW5kIHF1ZXJ5IHBhcmFtZXRlcnMuCisgICAgICAgICAqICA8QlI+CisgICAgICAgICAqICBJbnB1dC9vdXRwdXQgc3RyZWFtcyAob3B0aW9uYWwpIGFyZSBzZXQgdXNpbmcgdGhlCisgICAgICAgICAqICA8Y29kZT5zZXRJbnB1dDwvY29kZT4gYW5kIDxjb2RlPnNldFJlc3BvbnNlPC9jb2RlPiBtZXRob2RzLAorICAgICAgICAgKiAgcmVzcGVjdGl2ZWx5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGNvbW1hbmQgIHN0cmluZyBmdWxsIHBhdGggdG8gY29tbWFuZCB0byBiZSBleGVjdXRlZAorICAgICAgICAgKiBAcGFyYW0gIGVudiAgICAgIEhhc2h0YWJsZSB3aXRoIHRoZSBkZXNpcmVkIHNjcmlwdCBlbnZpcm9ubWVudAorICAgICAgICAgKiBAcGFyYW0gIHdkICAgICAgIEZpbGUgd2l0aCB0aGUgc2NyaXB0J3MgZGVzaXJlZCB3b3JraW5nIGRpcmVjdG9yeQorICAgICAgICAgKiBAcGFyYW0gIHBhcmFtcyAgIEFycmF5TGlzdCB3aXRoIHRoZSBzY3JpcHQncyBxdWVyeSBjb21tYW5kIGxpbmUKKyAgICAgICAgICogICAgICAgICAgICAgICAgICBwYXJhbXRlcnMgYXMgc3RyaW5ncworICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIENHSVJ1bm5lcihTdHJpbmcgY29tbWFuZCwgSGFzaHRhYmxlIGVudiwgRmlsZSB3ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgcGFyYW1zKSB7CisgICAgICAgICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kOworICAgICAgICAgICAgdGhpcy5lbnYgPSBlbnY7CisgICAgICAgICAgICB0aGlzLndkID0gd2Q7CisgICAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKKyAgICAgICAgICAgIHVwZGF0ZVJlYWR5U3RhdHVzKCk7CisgICAgICAgIH0KKworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyAmIHNldHMgcmVhZHkgc3RhdHVzCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZWFkeVN0YXR1cygpIHsKKyAgICAgICAgICAgIGlmIChjb21tYW5kICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBlbnYgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHdkICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBwYXJhbXMgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHJlc3BvbnNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWFkeVRvUnVuID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVhZHlUb1J1biA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHJlYWR5IHN0YXR1cworICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuICAgZmFsc2UgaWYgbm90IHJlYWR5ICg8Y29kZT5ydW48L2NvZGU+IHdpbGwgdGhyb3cKKyAgICAgICAgICogICAgICAgICAgIGFuIGV4Y2VwdGlvbiksIHRydWUgaWYgcmVhZHkKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVhZHkoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVhZHlUb1J1bjsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyBIdHRwU2VydmxldFJlc3BvbnNlIG9iamVjdCB1c2VkIHRvIHNldCBoZWFkZXJzIGFuZCBzZW5kCisgICAgICAgICAqIG91dHB1dCB0bworICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIHJlc3BvbnNlICAgSHR0cFNlcnZsZXRSZXNwb25zZSB0byBiZSB1c2VkCisgICAgICAgICAqCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSZXNwb25zZShIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisgICAgICAgICAgICB1cGRhdGVSZWFkeVN0YXR1cygpOworICAgICAgICB9CisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHN0YW5kYXJkIGlucHV0IHRvIGJlIHBhc3NlZCBvbiB0byB0aGUgaW52b2tlZCBjZ2kgc2NyaXB0CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgc3RkaW4gICBJbnB1dFN0cmVhbSB0byBiZSB1c2VkCisgICAgICAgICAqCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChJbnB1dFN0cmVhbSBzdGRpbikgeworICAgICAgICAgICAgdGhpcy5zdGRpbiA9IHN0ZGluOworICAgICAgICAgICAgdXBkYXRlUmVhZHlTdGF0dXMoKTsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydHMgYSBIYXNodGFibGUgdG8gYSBTdHJpbmcgYXJyYXkgYnkgY29udmVydGluZyBlYWNoCisgICAgICAgICAqIGtleS92YWx1ZSBwYWlyIGluIHRoZSBIYXNodGFibGUgdG8gYSBTdHJpbmcgaW4gdGhlIGZvcm0KKyAgICAgICAgICogImtleT12YWx1ZSIgKGhhc2hrZXkgKyAiPSIgKyBoYXNoLmdldChoYXNoa2V5KS50b1N0cmluZygpKQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGggICBIYXNodGFibGUgdG8gY29udmVydAorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuICAgICBjb252ZXJ0ZWQgc3RyaW5nIGFycmF5CisgICAgICAgICAqCisgICAgICAgICAqIEBleGNlcHRpb24gIE51bGxQb2ludGVyRXhjZXB0aW9uICAgaWYgYSBoYXNoIGtleSBoYXMgYSBudWxsIHZhbHVlCisgICAgICAgICAqCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gaGFzaFRvU3RyaW5nQXJyYXkoSGFzaHRhYmxlIGgpCisgICAgICAgICAgICB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24geworICAgICAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gaC5rZXlzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrID0gZS5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgdi5hZGQoayArICI9IiArIGguZ2V0KGspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZ1tdIHN0ckFyciA9IG5ldyBTdHJpbmdbdi5zaXplKCldOworICAgICAgICAgICAgdi5jb3B5SW50byhzdHJBcnIpOworICAgICAgICAgICAgcmV0dXJuIHN0ckFycjsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKioKKyAgICAgICAgICogRXhlY3V0ZXMgYSBDR0kgc2NyaXB0IHdpdGggdGhlIGRlc2lyZWQgZW52aXJvbm1lbnQsIGN1cnJlbnQgd29ya2luZworICAgICAgICAgKiBkaXJlY3RvcnksIGFuZCBpbnB1dC9vdXRwdXQgc3RyZWFtcworICAgICAgICAgKgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhpcyBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgQ0dJIHNwZWNpZmljYXRpb24gcmVjb21tZWRhdGlvbnM6CisgICAgICAgICAqIDxVTD4KKyAgICAgICAgICogPExJPiBTZXJ2ZXJzIFNIT1VMRCBwcm92aWRlIHRoZSAiPGNvZGU+cXVlcnk8L2NvZGU+IiBjb21wb25lbnQgb2YKKyAgICAgICAgICogICAgICB0aGUgc2NyaXB0LVVSSSBhcyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRvIHNjcmlwdHMgaWYgaXQKKyAgICAgICAgICogICAgICBkb2VzIG5vdCBjb250YWluIGFueSB1bmVuY29kZWQgIj0iIGNoYXJhY3RlcnMgYW5kIHRoZQorICAgICAgICAgKiAgICAgIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgY2FuIGJlIGdlbmVyYXRlZCBpbiBhbiB1bmFtYmlndW91cworICAgICAgICAgKiAgICAgIG1hbm5lci4KKyAgICAgICAgICogPExJPiBTZXJ2ZXJzIFNIT1VMRCBzZXQgdGhlIEFVVEhfVFlQRSBtZXRhdmFyaWFibGUgdG8gdGhlIHZhbHVlCisgICAgICAgICAqICAgICAgb2YgdGhlICI8Y29kZT5hdXRoLXNjaGVtZTwvY29kZT4iIHRva2VuIG9mIHRoZQorICAgICAgICAgKiAgICAgICI8Y29kZT5BdXRob3JpemF0aW9uPC9jb2RlPiIgaWYgaXQgd2FzIHN1cHBsaWVkIGFzIHBhcnQgb2YgdGhlCisgICAgICAgICAqICAgICAgcmVxdWVzdCBoZWFkZXIuICBTZWUgPGNvZGU+Z2V0Q0dJRW52aXJvbm1lbnQ8L2NvZGU+IG1ldGhvZC4KKyAgICAgICAgICogPExJPiBXaGVyZSBhcHBsaWNhYmxlLCBzZXJ2ZXJzIFNIT1VMRCBzZXQgdGhlIGN1cnJlbnQgd29ya2luZworICAgICAgICAgKiAgICAgIGRpcmVjdG9yeSB0byB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBzY3JpcHQgaXMgbG9jYXRlZAorICAgICAgICAgKiAgICAgIGJlZm9yZSBpbnZva2luZyBpdC4KKyAgICAgICAgICogPExJPiBTZXJ2ZXIgaW1wbGVtZW50YXRpb25zIFNIT1VMRCBkZWZpbmUgdGhlaXIgYmVoYXZpb3IgZm9yIHRoZQorICAgICAgICAgKiAgICAgIGZvbGxvd2luZyBjYXNlczoKKyAgICAgICAgICogICAgIDx1bD4KKyAgICAgICAgICogICAgIDxMST4gPHU+QWxsb3dlZCBjaGFyYWN0ZXJzIGluIHBhdGhJbmZvPC91PjogIFRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICogICAgICAgICAgICAgZG9lcyBub3QgYWxsb3cgQVNDSUkgTlVMIG5vciBhbnkgY2hhcmFjdGVyIHdoaWNoIGNhbm5vdAorICAgICAgICAgKiAgICAgICAgICAgICBiZSBVUkwtZW5jb2RlZCBhY2NvcmRpbmcgdG8gaW50ZXJuZXQgc3RhbmRhcmRzOworICAgICAgICAgKiAgICAgPExJPiA8dT5BbGxvd2VkIGNoYXJhY3RlcnMgaW4gcGF0aCBzZWdtZW50czwvdT46IFRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgYWxsb3cgbm9uLXRlcm1pbmFsIE5VTEwKKyAgICAgICAgICogICAgICAgICAgICAgc2VnbWVudHMgaW4gdGhlIHRoZSBwYXRoIC0tIElPRXhjZXB0aW9ucyBtYXkgYmUgdGhyb3duOworICAgICAgICAgKiAgICAgPExJPiA8dT4iPGNvZGU+LjwvY29kZT4iIGFuZCAiPGNvZGU+Li48L2NvZGU+IiBwYXRoCisgICAgICAgICAqICAgICAgICAgICAgIHNlZ21lbnRzPC91PjoKKyAgICAgICAgICogICAgICAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBhbGxvdyAiPGNvZGU+LjwvY29kZT4iIGFuZAorICAgICAgICAgKiAgICAgICAgICAgICAiPGNvZGU+Li48L2NvZGU+IiBpbiB0aGUgdGhlIHBhdGgsIGFuZCBzdWNoIGNoYXJhY3RlcnMKKyAgICAgICAgICogICAgICAgICAgICAgd2lsbCByZXN1bHQgaW4gYW4gSU9FeGNlcHRpb24gYmVpbmcgdGhyb3duOworICAgICAgICAgKiAgICAgPExJPiA8dT5JbXBsZW1lbnRhdGlvbiBsaW1pdGF0aW9uczwvdT46IFRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICogICAgICAgICAgICAgZG9lcyBub3QgaW1wb3NlIGFueSBsaW1pdGF0aW9ucyBleGNlcHQgYXMgZG9jdW1lbnRlZAorICAgICAgICAgKiAgICAgICAgICAgICBhYm92ZS4gIFRoaXMgaW1wbGVtZW50YXRpb24gbWF5IGJlIGxpbWl0ZWQgYnkgdGhlCisgICAgICAgICAqICAgICAgICAgICAgIHNlcnZsZXQgY29udGFpbmVyIHVzZWQgdG8gaG91c2UgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICogICAgICAgICAgICAgSW4gcGFydGljdWxhciwgYWxsIHRoZSBwcmltYXJ5IENHSSB2YXJpYWJsZSB2YWx1ZXMKKyAgICAgICAgICogICAgICAgICAgICAgYXJlIGRlcml2ZWQgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZnJvbSB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgY29udGFpbmVyJ3MgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlcnZsZXQgQVBJIG1ldGhvZHMuCisgICAgICAgICAqICAgICA8L3VsPgorICAgICAgICAgKiA8L1VMPgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgcHJvYmxlbXMgZHVyaW5nIHJlYWRpbmcvd3JpdGluZyBvY2N1cgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICAgIGphdmEubGFuZy5SdW50aW1lI2V4ZWMoU3RyaW5nIGNvbW1hbmQsIFN0cmluZ1tdIGVudnAsCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRpcikKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSRU1JTkQ6ICB0aGlzIG1ldGhvZCBmZWVscyB0b28gYmlnOyBzaG91bGQgaXQgYmUgcmUtd3JpdHRlbj8KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBpZiAoIWlzUmVhZHkoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogbm90IHJlYWR5IHRvIHJ1bi4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRlYnVnID49IDEgKSB7CisgICAgICAgICAgICAgICAgbG9nKCJydW5DR0koZW52cD1bIiArIGVudiArICJdLCBjb21tYW5kPSIgKyBjb21tYW5kICsgIikiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChjb21tYW5kLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IgKyAiLiIgKyBGaWxlLnNlcGFyYXRvcikgPj0gMCkKKyAgICAgICAgICAgICAgICB8fCAoY29tbWFuZC5pbmRleE9mKEZpbGUuc2VwYXJhdG9yICsgIi4uIikgPj0gMCkKKyAgICAgICAgICAgICAgICB8fCAoY29tbWFuZC5pbmRleE9mKCIuLiIgKyBGaWxlLnNlcGFyYXRvcikgPj0gMCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24odGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJJbGxlZ2FsIENoYXJhY3RlciBpbiBDR0kgY29tbWFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInBhdGggKCcuJyBvciAnLi4nKSBkZXRlY3RlZC4gIE5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJ1bm5pbmcgQ0dJIFsiICsgY29tbWFuZCArICJdLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBvcmlnaW5hbCBjb250ZW50L3N0cnVjdHVyZSBvZiB0aGlzIHNlY3Rpb24gdGFrZW4gZnJvbQorICAgICAgICAgICAgICogaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyLworICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVnUGFyYWRlL2J1Z3MvNDIxNjg4NC5odG1sCisgICAgICAgICAgICAgKiB3aXRoIG1ham9yIG1vZGlmaWNhdGlvbnMgYnkgTWFydGluIERlbmdsZXIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgUnVudGltZSBydCA9IG51bGw7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBjZ2lPdXRwdXQgPSBudWxsOworICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgY29tbWFuZHNTdGRFcnIgPSBudWxsOworICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gY29tbWFuZHNTdGRJbiA9IG51bGw7CisgICAgICAgICAgICBQcm9jZXNzIHByb2MgPSBudWxsOworICAgICAgICAgICAgaW50IGJ1ZlJlYWQgPSAtMTsKKworICAgICAgICAgICAgLy9jcmVhdGUgcXVlcnkgYXJndW1lbnRzCisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgY21kQW5kQXJncyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGlmIChjb21tYW5kLmluZGV4T2YoIiAiKSA8IDApIHsKKyAgICAgICAgICAgICAgICBjbWRBbmRBcmdzLmFwcGVuZChjb21tYW5kKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU3BhY2VzIHVzZWQgYXMgZGVsaW1pdGVyLCBzbyBuZWVkIHRvIHVzZSBxdW90ZXMKKyAgICAgICAgICAgICAgICBjbWRBbmRBcmdzLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgICAgICBjbWRBbmRBcmdzLmFwcGVuZChjb21tYW5kKTsKKyAgICAgICAgICAgICAgICBjbWRBbmRBcmdzLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgcGFyYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgY21kQW5kQXJncy5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW0gPSAoU3RyaW5nKSBwYXJhbXMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5pbmRleE9mKCIgIikgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNtZEFuZEFyZ3MuYXBwZW5kKHBhcmFtKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBTcGFjZXMgdXNlZCBhcyBkZWxpbWl0ZXIsIHNvIG5lZWQgdG8gdXNlIHF1b3RlcworICAgICAgICAgICAgICAgICAgICBjbWRBbmRBcmdzLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgY21kQW5kQXJncy5hcHBlbmQocGFyYW0pOworICAgICAgICAgICAgICAgICAgICBjbWRBbmRBcmdzLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBjb21tYW5kID0gbmV3IFN0cmluZ0J1ZmZlcihjZ2lFeGVjdXRhYmxlKTsKKyAgICAgICAgICAgIGNvbW1hbmQuYXBwZW5kKCIgIik7CisgICAgICAgICAgICBjb21tYW5kLmFwcGVuZChjbWRBbmRBcmdzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgY21kQW5kQXJncyA9IGNvbW1hbmQ7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcnQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKKyAgICAgICAgICAgICAgICBwcm9jID0gcnQuZXhlYyhjbWRBbmRBcmdzLnRvU3RyaW5nKCksIGhhc2hUb1N0cmluZ0FycmF5KGVudiksIHdkKTsKKyAgICAKKyAgICAgICAgICAgICAgICBTdHJpbmcgc0NvbnRlbnRMZW5ndGggPSAoU3RyaW5nKSBlbnYuZ2V0KCJDT05URU5UX0xFTkdUSCIpOworCisgICAgICAgICAgICAgICAgaWYoISIiLmVxdWFscyhzQ29udGVudExlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZHNTdGRJbiA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShwcm9jLmdldE91dHB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICAgICAgSU9Ub29scy5mbG93KHN0ZGluLCBjb21tYW5kc1N0ZEluKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZHNTdGRJbi5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICBjb21tYW5kc1N0ZEluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogd2Ugd2FudCB0byB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBleGl0LCAgUHJvY2Vzcy53YWl0Rm9yKCkKKyAgICAgICAgICAgICAgICAgKiBpcyB1c2VsZXNzIGluIG91ciBzaXR1YXRpb247IHNlZQorICAgICAgICAgICAgICAgICAqIGh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci8KKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWdQYXJhZGUvYnVncy80MjIzNjUwLmh0bWwKKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb21tYW5kc1N0ZEVyciA9IG5ldyBCdWZmZXJlZFJlYWRlcgorICAgICAgICAgICAgICAgICAgICAobmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2MuZ2V0RXJyb3JTdHJlYW0oKSkpOworICAgICAgICAgICAgICAgIGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIHN0ZEVyclJkciA9IGNvbW1hbmRzU3RkRXJyIDsKKworICAgICAgICAgICAgICAgIG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1biAoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kVG9Mb2coc3RkRXJyUmRyKSA7CisgICAgICAgICAgICAgICAgICAgIH0gOworICAgICAgICAgICAgICAgIH0uc3RhcnQoKSA7CisKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBjZ2lIZWFkZXJTdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICBuZXcgSFRUUEhlYWRlcklucHV0U3RyZWFtKHByb2MuZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgY2dpSGVhZGVyUmVhZGVyID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjZ2lIZWFkZXJTdHJlYW0pKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHdoaWxlIChpc1J1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGhlYWRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoKGxpbmUgPSBjZ2lIZWFkZXJSZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhKCIiLmVxdWFscyhsaW5lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coInJ1bkNHSTogYWRkSGVhZGVyKFwiIiArIGxpbmUgKyAiXCIpIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoIkhUVFAiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoZ2V0U0NGcm9tSHR0cFN0YXR1c0xpbmUobGluZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5pbmRleE9mKCI6IikgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVhZGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUuaW5kZXhPZigiOiIpKS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YoIjoiKSArIDEpLnRyaW0oKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIuZXF1YWxzSWdub3JlQ2FzZSgic3RhdHVzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhnZXRTQ0Zyb21DR0lTdGF0dXNIZWFkZXIodmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcihoZWFkZXIgLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coInJ1bkNHSTogYmFkIGhlYWRlciBsaW5lIFwiIiArIGxpbmUgKyAiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAvL3dyaXRlIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJCdWYgPSBuZXcgYnl0ZVsyMDQ4XTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNnaU91dHB1dCA9IHByb2MuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChidWZSZWFkID0gY2dpT3V0cHV0LnJlYWQoYkJ1ZikpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coInJ1bkNHSTogb3V0cHV0ICIgKyBidWZSZWFkICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIG9mIGRhdGEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYkJ1ZiwgMCwgYnVmUmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGNvbnN1bWUgYW55IGxlZnRvdmVyIGJ5dGUgaWYgc29tZXRoaW5nIGJhZCBoYXBwZW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1Y2ggYXMgYSBzb2NrZXQgZGlzY29ubmVjdCBvbiB0aGUgc2VydmxldCBzaWRlOyBvdGhlcndpc2UsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dGVybmFsIHByb2Nlc3MgY291bGQgaGFuZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWZSZWFkICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoYnVmUmVhZCA9IGNnaU91dHB1dC5yZWFkKGJCdWYpKSAhPSAtMSkge30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvYy5leGl0VmFsdWUoKTsgLy8gVGhyb3dzIGV4Y2VwdGlvbiBpZiBhbGl2ZQorICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaXNSdW5uaW5nID0gZmFsc2U7CisgICAgCisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvL3JlcGxhY2VtZW50IGZvciBQcm9jZXNzLndhaXRGb3IoKQorICAgIAorICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBvdXRwdXQgc3RyZWFtIHVzZWQKKyAgICAgICAgICAgICAgICBjZ2lPdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICBsb2cgKCJDYXVnaHQgZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseXsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPiA0KSB7CisgICAgICAgICAgICAgICAgICAgIGxvZyAoIlJ1bm5pbmcgZmluYWxseSBibG9jayIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvYyAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICAgICAgcHJvYy5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgICAgIHByb2MgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXJzZXMgdGhlIFN0YXR1cy1MaW5lIGFuZCBleHRyYWN0cyB0aGUgc3RhdHVzIGNvZGUuCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gbGluZSBUaGUgSFRUUCBTdGF0dXMtTGluZSAoUkZDMjYxNiwgc2VjdGlvbiA2LjEpCisgICAgICAgICAqIEByZXR1cm4gVGhlIGV4dHJhY3RlZCBzdGF0dXMgY29kZSBvciB0aGUgY29kZSByZXByZXNlbnRpbmcgYW4KKyAgICAgICAgICogaW50ZXJuYWwgZXJyb3IgaWYgYSB2YWxpZCBzdGF0dXMgY29kZSBjYW5ub3QgYmUgZXh0cmFjdGVkLiAKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaW50IGdldFNDRnJvbUh0dHBTdGF0dXNMaW5lKFN0cmluZyBsaW5lKSB7CisgICAgICAgICAgICBpbnQgc3RhdHVzU3RhcnQgPSBsaW5lLmluZGV4T2YoJyAnKSArIDE7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChzdGF0dXNTdGFydCA8IDEgfHwgbGluZS5sZW5ndGgoKSA8IHN0YXR1c1N0YXJ0ICsgMykgeworICAgICAgICAgICAgICAgIC8vIE5vdCBhIHZhbGlkIEhUVFAgU3RhdHVzLUxpbmUKKyAgICAgICAgICAgICAgICBsb2cgKCJydW5DR0k6IGludmFsaWQgSFRUUCBTdGF0dXMtTGluZToiICsgbGluZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgc3RhdHVzID0gbGluZS5zdWJzdHJpbmcoc3RhdHVzU3RhcnQsIHN0YXR1c1N0YXJ0ICsgMyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBzdGF0dXNDb2RlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdGF0dXNDb2RlID0gSW50ZWdlci5wYXJzZUludChzdGF0dXMpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgICAgICAgICAgIC8vIE5vdCBhIHZhbGlkIHN0YXR1cyBjb2RlCisgICAgICAgICAgICAgICAgbG9nICgicnVuQ0dJOiBpbnZhbGlkIHN0YXR1cyBjb2RlOiIgKyBzdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybiBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIHN0YXR1c0NvZGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUGFyc2VzIHRoZSBDR0kgU3RhdHVzIEhlYWRlciB2YWx1ZSBhbmQgZXh0cmFjdHMgdGhlIHN0YXR1cyBjb2RlLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSBDR0kgU3RhdHVzIHZhbHVlIG9mIHRoZSBmb3JtIDxjb2RlPgorICAgICAgICAgKiAgICAgICAgICAgICBkaWdpdCBkaWdpdCBkaWdpdCBTUCByZWFzb24tcGhyYXNlPC9jb2RlPgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBleHRyYWN0ZWQgc3RhdHVzIGNvZGUgb3IgdGhlIGNvZGUgcmVwcmVzZW50aW5nIGFuCisgICAgICAgICAqIGludGVybmFsIGVycm9yIGlmIGEgdmFsaWQgc3RhdHVzIGNvZGUgY2Fubm90IGJlIGV4dHJhY3RlZC4gCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGludCBnZXRTQ0Zyb21DR0lTdGF0dXNIZWFkZXIoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPCAzKSB7CisgICAgICAgICAgICAgICAgLy8gTm90IGEgdmFsaWQgc3RhdHVzIHZhbHVlCisgICAgICAgICAgICAgICAgbG9nICgicnVuQ0dJOiBpbnZhbGlkIHN0YXR1cyB2YWx1ZToiICsgdmFsdWUpOworICAgICAgICAgICAgICAgIHJldHVybiBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHN0YXR1cyA9IHZhbHVlLnN1YnN0cmluZygwLCAzKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IHN0YXR1c0NvZGU7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBJbnRlZ2VyLnBhcnNlSW50KHN0YXR1cyk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgICAgICAgLy8gTm90IGEgdmFsaWQgc3RhdHVzIGNvZGUKKyAgICAgICAgICAgICAgICBsb2cgKCJydW5DR0k6IGludmFsaWQgc3RhdHVzIGNvZGU6IiArIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gc3RhdHVzQ29kZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNlbmRUb0xvZyhCdWZmZXJlZFJlYWRlciByZHIpIHsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKKyAgICAgICAgICAgIGludCBsaW5lQ291bnQgPSAwIDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gcmRyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJydW5DR0kgKHN0ZGVycik6IiArICBsaW5lKSA7CisgICAgICAgICAgICAgICAgICAgIGxpbmVDb3VudCsrIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nKCJzZW5kVG9Mb2cgZXJyb3IiLCBlKSA7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJkci5jbG9zZSgpIDsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBjZSkgeworICAgICAgICAgICAgICAgICAgICBsb2coInNlbmRUb0xvZyBlcnJvciIsIGNlKSA7CisgICAgICAgICAgICAgICAgfSA7CisgICAgICAgICAgICB9IDsKKyAgICAgICAgICAgIGlmICggbGluZUNvdW50ID4gMCAmJiBkZWJ1ZyA+IDIpIHsKKyAgICAgICAgICAgICAgICBsb2coInJ1bkNHSTogIiArIGxpbmVDb3VudCArICIgbGluZXMgcmVjZWl2ZWQgb24gc3RkZXJyIikgOworICAgICAgICAgICAgfSA7CisgICAgICAgIH0KKyAgICB9IC8vY2xhc3MgQ0dJUnVubmVyCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGFuIGlucHV0IHN0cmVhbSBzcGVjaWZpY2FsbHkgZm9yIHJlYWRpbmcgSFRUUCBoZWFkZXJzLiBJdCByZWFkcworICAgICAqIHVwdG8gYW5kIGluY2x1ZGluZyB0aGUgdHdvIGJsYW5rIGxpbmVzIHRlcm1pbmF0aW5nIHRoZSBoZWFkZXJzLiBJdAorICAgICAqIGFsbG93cyB0aGUgY29udGVudCB0byBiZSByZWFkIHVzaW5nIGJ5dGVzIG9yIGNoYXJhY3RlcnMgYXMgYXBwcm9wcmlhdGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGNsYXNzIEhUVFBIZWFkZXJJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NIQVJBQ1RFUiA9IDA7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9GSVJTVF9DUiA9IDE7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9GSVJTVF9MRiA9IDI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9TRUNPTkRfQ1IgPSAzOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSEVBREVSX0VORCA9IDQ7CisgICAgICAgIAorICAgICAgICBwcml2YXRlIElucHV0U3RyZWFtIGlucHV0OworICAgICAgICBwcml2YXRlIGludCBzdGF0ZTsKKyAgICAgICAgCisgICAgICAgIEhUVFBIZWFkZXJJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSB0aGVJbnB1dCkgeworICAgICAgICAgICAgaW5wdXQgPSB0aGVJbnB1dDsKKyAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfQ0hBUkFDVEVSOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNyZWFkKCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfSEVBREVSX0VORCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGkgPSBpbnB1dC5yZWFkKCk7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc3RhdGUKKyAgICAgICAgICAgIC8vIFN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGlzCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gICAgLS0tLS0tLS0+LS0tLS0tLS0KKyAgICAgICAgICAgIC8vICAgfCAgICAgIChDUikgICAgICAgfAorICAgICAgICAgICAgLy8gICB8ICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAvLyAgQ1IxLS0tPi0tLSAgICAgICAgIHwKKyAgICAgICAgICAgIC8vICAgfCAgICAgICAgfCAgICAgICAgfAorICAgICAgICAgICAgLy8gICBeKENSKSAgICB8KExGKSAgICB8CisgICAgICAgICAgICAvLyAgIHwgICAgICAgIHwgICAgICAgIHwKKyAgICAgICAgICAgIC8vIENIQVItLS0+LS1MRjEtLS0+LS1FT0gKKyAgICAgICAgICAgIC8vICAgICAgKExGKSAgfCAgKExGKSAgfAorICAgICAgICAgICAgLy8gICAgICAgICAgICB8KENSKSAgICBeKExGKQorICAgICAgICAgICAgLy8gICAgICAgICAgICB8ICAgICAgICB8CisgICAgICAgICAgICAvLyAgICAgICAgICAoQ1IyKS0tPi0tLQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaSA9PSAxMCkgeworICAgICAgICAgICAgICAgIC8vIExGCisgICAgICAgICAgICAgICAgc3dpdGNoKHN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQ0hBUkFDVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9GSVJTVF9MRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0ZJUlNUX0NSOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9GSVJTVF9MRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0ZJUlNUX0xGOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1NFQ09ORF9DUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfSEVBREVSX0VORDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IDEzKSB7CisgICAgICAgICAgICAgICAgLy8gQ1IKKyAgICAgICAgICAgICAgICBzd2l0Y2goc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9DSEFSQUNURVI6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0ZJUlNUX0NSOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfRklSU1RfQ1I6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0hFQURFUl9FTkQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9GSVJTVF9MRjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfU0VDT05EX0NSOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfQ0hBUkFDVEVSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gaTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0gIC8vIGNsYXNzIEhUVFBIZWFkZXJJbnB1dFN0cmVhbQorCit9IC8vY2xhc3MgQ0dJU2VydmxldApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0NvbnN0YW50cy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MTZkYTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlcnZsZXRzOworCisKK3B1YmxpYyBjbGFzcyBDb25zdGFudHMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlcnZsZXRzIjsKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvRGVmYXVsdFNlcnZsZXQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9EZWZhdWx0U2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYmU2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvRGVmYXVsdFNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDIyNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VydmxldHM7CisKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lQ2xhc3NQYWlyOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5SZXF1ZXN0VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU2VydmVySW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuVVJMRW5jb2RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuQ2FjaGVFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuUHJveHlEaXJDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuUmVzb3VyY2VBdHRyaWJ1dGVzOworCisKKy8qKgorICogVGhlIGRlZmF1bHQgcmVzb3VyY2Utc2VydmluZyBzZXJ2bGV0IGZvciBtb3N0IHdlYiBhcHBsaWNhdGlvbnMsCisgKiB1c2VkIHRvIHNlcnZlIHN0YXRpYyByZXNvdXJjZXMgc3VjaCBhcyBIVE1MIHBhZ2VzIGFuZCBpbWFnZXMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBEZWZhdWx0U2VydmxldAorICAgIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgZm9yIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGRlYnVnID0gMDsKKworCisgICAgLyoqCisgICAgICogVGhlIGlucHV0IGJ1ZmZlciBzaXplIHRvIHVzZSB3aGVuIHNlcnZpbmcgcmVzb3VyY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgaW5wdXQgPSAyMDQ4OworCisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgd2UgZ2VuZXJhdGUgZGlyZWN0b3J5IGxpc3RpbmdzPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGxpc3RpbmdzID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFJlYWQgb25seSBmbGFnLiBCeSBkZWZhdWx0LCBpdCdzIHNldCB0byB0cnVlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWRPbmx5ID0gdHJ1ZTsKKworCisgICAgLyoqCisgICAgICogVGhlIG91dHB1dCBidWZmZXIgc2l6ZSB0byB1c2Ugd2hlbiBzZXJ2aW5nIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG91dHB1dCA9IDIwNDg7CisKKworICAgIC8qKgorICAgICAqIEFycmF5IGNvbnRhaW5pbmcgdGhlIHNhZmUgY2hhcmFjdGVycyBzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBVUkxFbmNvZGVyIHVybEVuY29kZXI7CisKKworICAgIC8qKgorICAgICAqIEFsbG93IGN1c3RvbWl6ZWQgZGlyZWN0b3J5IGxpc3RpbmcgcGVyIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nICBsb2NhbFhzbHRGaWxlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQWxsb3cgY3VzdG9taXplZCBkaXJlY3RvcnkgbGlzdGluZyBwZXIgaW5zdGFuY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyAgZ2xvYmFsWHNsdEZpbGUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBbGxvdyBhIHJlYWRtZSBmaWxlIHRvIGJlIGluY2x1ZGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVhZG1lRmlsZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFByb3h5IGRpcmVjdG9yeSBjb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcm94eURpckNvbnRleHQgcmVzb3VyY2VzID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRmlsZSBlbmNvZGluZyB0byBiZSB1c2VkIHdoZW4gcmVhZGluZyBzdGF0aWMgZmlsZXMuIElmIG5vbmUgaXMgc3BlY2lmaWVkCisgICAgICogdGhlIHBsYXRmb3JtIGRlZmF1bHQgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpbGVFbmNvZGluZyA9IG51bGw7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogTWluaW11bSBzaXplIGZvciBzZW5kZmlsZSB1c2FnZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHNlbmRmaWxlU2l6ZSA9IDQ4ICogMTAyNDsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBGdWxsIHJhbmdlIG1hcmtlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIEFycmF5TGlzdCBGVUxMID0gbmV3IEFycmF5TGlzdCgpOworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YXRpYyBJbml0aWFsaXplcgorCisKKyAgICAvKioKKyAgICAgKiBHTVQgdGltZXpvbmUgLSBhbGwgSFRUUCBkYXRlcyBhcmUgb24gR01UCisgICAgICovCisgICAgc3RhdGljIHsKKyAgICAgICAgdXJsRW5jb2RlciA9IG5ldyBVUkxFbmNvZGVyKCk7CisgICAgICAgIHVybEVuY29kZXIuYWRkU2FmZUNoYXJhY3RlcignLScpOworICAgICAgICB1cmxFbmNvZGVyLmFkZFNhZmVDaGFyYWN0ZXIoJ18nKTsKKyAgICAgICAgdXJsRW5jb2Rlci5hZGRTYWZlQ2hhcmFjdGVyKCcuJyk7CisgICAgICAgIHVybEVuY29kZXIuYWRkU2FmZUNoYXJhY3RlcignKicpOworICAgICAgICB1cmxFbmNvZGVyLmFkZFNhZmVDaGFyYWN0ZXIoJy8nKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE1JTUUgbXVsdGlwYXJ0IHNlcGFyYXRpb24gc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgbWltZVNlcGFyYXRpb24gPSAiQ0FUQUxJTkFfTUlNRV9CT1VOREFSWSI7CisKKworICAgIC8qKgorICAgICAqIEpOREkgcmVzb3VyY2VzIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VTX0pORElfTkFNRSA9ICJqYXZhOi9jb21wL1Jlc291cmNlcyI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIFNpemUgb2YgZmlsZSB0cmFuc2ZlciBidWZmZXIgaW4gYnl0ZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA0MDk2OworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRmluYWxpemUgdGhpcyBzZXJ2bGV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFNldCBvdXIgcHJvcGVydGllcyBmcm9tIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJkZWJ1ZyIpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKCJEZWZhdWx0U2VydmxldC5pbml0OiBjb3VsZG4ndCByZWFkIGRlYnVnIGZyb20gIiArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJpbnB1dCIpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnB1dCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKCJEZWZhdWx0U2VydmxldC5pbml0OiBjb3VsZG4ndCByZWFkIGlucHV0IGZyb20gIiArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJsaXN0aW5ncyIpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsaXN0aW5ncyA9IChuZXcgQm9vbGVhbih2YWx1ZSkpLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKCJEZWZhdWx0U2VydmxldC5pbml0OiBjb3VsZG4ndCByZWFkIGxpc3RpbmdzIGZyb20gIiArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJyZWFkb25seSIpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWFkT25seSA9IChuZXcgQm9vbGVhbih2YWx1ZSkpLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKCJEZWZhdWx0U2VydmxldC5pbml0OiBjb3VsZG4ndCByZWFkIHJlYWRvbmx5IGZyb20gIiArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJvdXRwdXQiKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkRlZmF1bHRTZXJ2bGV0LmluaXQ6IGNvdWxkbid0IHJlYWQgb3V0cHV0IGZyb20gIiArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJzZW5kZmlsZVNpemUiKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VuZGZpbGVTaXplID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSkgKiAxMDI0OworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKCJEZWZhdWx0U2VydmxldC5pbml0OiBjb3VsZG4ndCByZWFkIHNlbmRmaWxlU2l6ZSBmcm9tICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsdWUgPSBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0SW5pdFBhcmFtZXRlcigiZmlsZUVuY29kaW5nIik7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbGVFbmNvZGluZyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKCJEZWZhdWx0U2VydmxldC5pbml0OiBjb3VsZG4ndCByZWFkIGZpbGVFbmNvZGluZyBmcm9tICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBnbG9iYWxYc2x0RmlsZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJnbG9iYWxYc2x0RmlsZSIpOworICAgICAgICBsb2NhbFhzbHRGaWxlID0gZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoImxvY2FsWHNsdEZpbGUiKTsKKyAgICAgICAgcmVhZG1lRmlsZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJyZWFkbWVGaWxlIik7CisKKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrIG9uIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHNpemVzCisgICAgICAgIGlmIChpbnB1dCA8IDI1NikKKyAgICAgICAgICAgIGlucHV0ID0gMjU2OworICAgICAgICBpZiAob3V0cHV0IDwgMjU2KQorICAgICAgICAgICAgb3V0cHV0ID0gMjU2OworCisgICAgICAgIGlmIChkZWJ1ZyA+IDApIHsKKyAgICAgICAgICAgIGxvZygiRGVmYXVsdFNlcnZsZXQuaW5pdDogIGlucHV0IGJ1ZmZlciBzaXplPSIgKyBpbnB1dCArCisgICAgICAgICAgICAgICAgIiwgb3V0cHV0IGJ1ZmZlciBzaXplPSIgKyBvdXRwdXQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTG9hZCB0aGUgcHJveHkgZGlyIGNvbnRleHQuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNvdXJjZXMgPSAoUHJveHlEaXJDb250ZXh0KSBnZXRTZXJ2bGV0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShHbG9iYWxzLlJFU09VUkNFU19BVFRSKTsKKyAgICAgICAgfSBjYXRjaChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRmFpbGVkIDogTm90IHRoZSByaWdodCB0eXBlCisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0KKyAgICAgICAgICAgICAgICAgICAgKFByb3h5RGlyQ29udGV4dCkgbmV3IEluaXRpYWxDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgLmxvb2t1cChSRVNPVVJDRVNfSk5ESV9OQU1FKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gRmFpbGVkCisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEZhaWxlZCA6IE5vdCB0aGUgcmlnaHQgdHlwZQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5hdmFpbGFibGVFeGNlcHRpb24oIk5vIHJlc291cmNlcyIpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlbGF0aXZlIHBhdGggYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmxldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbGF0aXZlUGF0aChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIC8vIEFyZSB3ZSBiZWluZyBwcm9jZXNzZWQgYnkgYSBSZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCk/CisgICAgICAgIGlmIChyZXF1ZXN0LmdldEF0dHJpYnV0ZShHbG9iYWxzLklOQ0xVREVfUkVRVUVTVF9VUklfQVRUUikgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxzLklOQ0xVREVfUEFUSF9JTkZPX0FUVFIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxzLklOQ0xVREVfU0VSVkxFVF9QQVRIX0FUVFIpOworICAgICAgICAgICAgaWYgKChyZXN1bHQgPT0gbnVsbCkgfHwgKHJlc3VsdC5lcXVhbHMoIiIpKSkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiLyI7CisgICAgICAgICAgICByZXR1cm4gKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBObywgZXh0cmFjdCB0aGUgZGVzaXJlZCBwYXRoIGRpcmVjdGx5IGZyb20gdGhlIHJlcXVlc3QKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHJlcXVlc3QuZ2V0UGF0aEluZm8oKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQgPSByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXN1bHQgPT0gbnVsbCkgfHwgKHJlc3VsdC5lcXVhbHMoIiIpKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gIi8iOworICAgICAgICB9CisgICAgICAgIHJldHVybiAocmVzdWx0KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIEdFVCByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQtc3BlY2lmaWVkIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gU2VydmUgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSwgaW5jbHVkaW5nIHRoZSBkYXRhIGNvbnRlbnQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlcnZlUmVzb3VyY2UocmVxdWVzdCwgcmVzcG9uc2UsIHRydWUpOworICAgICAgICB9IGNhdGNoKCBJT0V4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgIC8vIHdlIHByb2JhYmx5IGhhdmUgdGhpcyBjaGVjayBzb21ld2hlcmUgZWxzZSB0b28uCisgICAgICAgICAgICBpZiggZXguZ2V0TWVzc2FnZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBleC5nZXRNZXNzYWdlKCkuaW5kZXhPZigiQnJva2VuIHBpcGUiKSA+PSAwICkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpdC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBIRUFEIHJlcXVlc3QgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldC1zcGVjaWZpZWQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9IZWFkKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFNlcnZlIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UsIHdpdGhvdXQgdGhlIGRhdGEgY29udGVudAorICAgICAgICBzZXJ2ZVJlc291cmNlKHJlcXVlc3QsIHJlc3BvbnNlLCBmYWxzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBQT1NUIHJlcXVlc3QgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldC1zcGVjaWZpZWQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBkb0dldChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgUE9TVCByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcSBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3AgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmllZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb1B1dChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHJlYWRPbmx5KSB7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0ZPUkJJRERFTik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFJlbGF0aXZlUGF0aChyZXEpOworCisgICAgICAgIGJvb2xlYW4gZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc291cmNlcy5sb29rdXAocGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGlzdHMgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKKworICAgICAgICAvLyBUZW1wLiBjb250ZW50IGZpbGUgdXNlZCB0byBzdXBwb3J0IHBhcnRpYWwgUFVUCisgICAgICAgIEZpbGUgY29udGVudEZpbGUgPSBudWxsOworCisgICAgICAgIFJhbmdlIHJhbmdlID0gcGFyc2VDb250ZW50UmFuZ2UocmVxLCByZXNwKTsKKworICAgICAgICBJbnB1dFN0cmVhbSByZXNvdXJjZUlucHV0U3RyZWFtID0gbnVsbDsKKworICAgICAgICAvLyBBcHBlbmQgZGF0YSBzcGVjaWZpZWQgaW4gcmFuZ2VzIHRvIGV4aXN0aW5nIGNvbnRlbnQgZm9yIHRoaXMKKyAgICAgICAgLy8gcmVzb3VyY2UgLSBjcmVhdGUgYSB0ZW1wLiBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlc3lzdGVtIHRvCisgICAgICAgIC8vIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24KKyAgICAgICAgLy8gQXNzdW1lIGp1c3Qgb25lIHJhbmdlIGlzIHNwZWNpZmllZCBmb3Igbm93CisgICAgICAgIGlmIChyYW5nZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250ZW50RmlsZSA9IGV4ZWN1dGVQYXJ0aWFsUHV0KHJlcSwgcmFuZ2UsIHBhdGgpOworICAgICAgICAgICAgcmVzb3VyY2VJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oY29udGVudEZpbGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzb3VyY2VJbnB1dFN0cmVhbSA9IHJlcS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlc291cmNlIG5ld1Jlc291cmNlID0gbmV3IFJlc291cmNlKHJlc291cmNlSW5wdXRTdHJlYW0pOworICAgICAgICAgICAgLy8gRklYTUU6IEFkZCBhdHRyaWJ1dGVzCisgICAgICAgICAgICBpZiAoZXhpc3RzKSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLnJlYmluZChwYXRoLCBuZXdSZXNvdXJjZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc291cmNlcy5iaW5kKHBhdGgsIG5ld1Jlc291cmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBCdWd6aWxsYSA0MDMyNjogYXQgdGhpcyBwb2ludCBjb250ZW50IGZpbGUgc2hvdWxkIGJlIHNhZmUgdG8gZGVsZXRlCisgICAgICAgIC8vIGFzIGl0J3Mgbm8gbG9uZ2VyIHJlZmVyZW5jZWQuICBMZXQncyBub3QgcmVseSBvbiBkZWxldGVPbkV4aXQgYmVjYXVzZQorICAgICAgICAvLyBpdCdzIGEgbWVtb3J5IGxlYWssIGFzIG5vdGVkIGluIHRoaXMgQnVnemlsbGEgaXNzdWUuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb250ZW50RmlsZS5kZWxldGUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiRGVmYXVsdFNlcnZsZXQuZG9QdXQ6IGNvdWxkbid0IGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIGlmIChleGlzdHMpIHsKKyAgICAgICAgICAgICAgICByZXNwLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PX0NPTlRFTlQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXNwLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0NSRUFURUQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19DT05GTElDVCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSGFuZGxlIGEgcGFydGlhbCBQVVQuICBOZXcgY29udGVudCBzcGVjaWZpZWQgaW4gcmVxdWVzdCBpcyBhcHBlbmRlZCB0bworICAgICAqIGV4aXN0aW5nIGNvbnRlbnQgaW4gb2xkUmV2aXNpb25Db250ZW50IChpZiBwcmVzZW50KS4gVGhpcyBjb2RlIGRvZXMKKyAgICAgKiBub3Qgc3VwcG9ydCBzaW11bHRhbmVvdXMgcGFydGlhbCB1cGRhdGVzIHRvIHRoZSBzYW1lIHJlc291cmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGV4ZWN1dGVQYXJ0aWFsUHV0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIFJhbmdlIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIEFwcGVuZCBkYXRhIHNwZWNpZmllZCBpbiByYW5nZXMgdG8gZXhpc3RpbmcgY29udGVudCBmb3IgdGhpcworICAgICAgICAvLyByZXNvdXJjZSAtIGNyZWF0ZSBhIHRlbXAuIGZpbGUgb24gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gdG8KKyAgICAgICAgLy8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbgorICAgICAgICBGaWxlIHRlbXBEaXIgPSAoRmlsZSkgZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICgiamF2YXguc2VydmxldC5jb250ZXh0LnRlbXBkaXIiKTsKKyAgICAgICAgLy8gQ29udmVydCBhbGwgJy8nIGNoYXJhY3RlcnMgdG8gJy4nIGluIHJlc291cmNlUGF0aAorICAgICAgICBTdHJpbmcgY29udmVydGVkUmVzb3VyY2VQYXRoID0gcGF0aC5yZXBsYWNlKCcvJywgJy4nKTsKKyAgICAgICAgRmlsZSBjb250ZW50RmlsZSA9IG5ldyBGaWxlKHRlbXBEaXIsIGNvbnZlcnRlZFJlc291cmNlUGF0aCk7CisgICAgICAgIGNvbnRlbnRGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKKworICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhbmRBY2Nlc3NDb250ZW50RmlsZSA9CisgICAgICAgICAgICBuZXcgUmFuZG9tQWNjZXNzRmlsZShjb250ZW50RmlsZSwgInJ3Iik7CisKKyAgICAgICAgUmVzb3VyY2Ugb2xkUmVzb3VyY2UgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IG9iaiA9IHJlc291cmNlcy5sb29rdXAocGF0aCk7CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVzb3VyY2UpCisgICAgICAgICAgICAgICAgb2xkUmVzb3VyY2UgPSAoUmVzb3VyY2UpIG9iajsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiRGVmYXVsdFNlcnZsZXQuZXhlY3V0ZVBhcnRpYWxQdXQ6IGNvdWxkbid0IGZpbmQgcmVzb3VyY2UgYXQgIiArIHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBkYXRhIGluIG9sZFJldmlzaW9uQ29udGVudCB0byBjb250ZW50RmlsZQorICAgICAgICBpZiAob2xkUmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBidWZPbGRSZXZTdHJlYW0gPQorICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG9sZFJlc291cmNlLnN0cmVhbUNvbnRlbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUZGRVJfU0laRSk7CisKKyAgICAgICAgICAgIGludCBudW1CeXRlc1JlYWQ7CisgICAgICAgICAgICBieXRlW10gY29weUJ1ZmZlciA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKKyAgICAgICAgICAgIHdoaWxlICgobnVtQnl0ZXNSZWFkID0gYnVmT2xkUmV2U3RyZWFtLnJlYWQoY29weUJ1ZmZlcikpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgcmFuZEFjY2Vzc0NvbnRlbnRGaWxlLndyaXRlKGNvcHlCdWZmZXIsIDAsIG51bUJ5dGVzUmVhZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1Zk9sZFJldlN0cmVhbS5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmFuZEFjY2Vzc0NvbnRlbnRGaWxlLnNldExlbmd0aChyYW5nZS5sZW5ndGgpOworCisgICAgICAgIC8vIEFwcGVuZCBkYXRhIGluIHJlcXVlc3QgaW5wdXQgc3RyZWFtIHRvIGNvbnRlbnRGaWxlCisgICAgICAgIHJhbmRBY2Nlc3NDb250ZW50RmlsZS5zZWVrKHJhbmdlLnN0YXJ0KTsKKyAgICAgICAgaW50IG51bUJ5dGVzUmVhZDsKKyAgICAgICAgYnl0ZVtdIHRyYW5zZmVyQnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOworICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIHJlcXVlc3RCdWZJblN0cmVhbSA9CisgICAgICAgICAgICBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShyZXEuZ2V0SW5wdXRTdHJlYW0oKSwgQlVGRkVSX1NJWkUpOworICAgICAgICB3aGlsZSAoKG51bUJ5dGVzUmVhZCA9IHJlcXVlc3RCdWZJblN0cmVhbS5yZWFkKHRyYW5zZmVyQnVmZmVyKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIHJhbmRBY2Nlc3NDb250ZW50RmlsZS53cml0ZSh0cmFuc2ZlckJ1ZmZlciwgMCwgbnVtQnl0ZXNSZWFkKTsKKyAgICAgICAgfQorICAgICAgICByYW5kQWNjZXNzQ29udGVudEZpbGUuY2xvc2UoKTsKKyAgICAgICAgcmVxdWVzdEJ1ZkluU3RyZWFtLmNsb3NlKCk7CisKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRGaWxlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgUE9TVCByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcSBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3AgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmllZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0RlbGV0ZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHJlYWRPbmx5KSB7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0ZPUkJJRERFTik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFJlbGF0aXZlUGF0aChyZXEpOworCisgICAgICAgIGJvb2xlYW4gZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc291cmNlcy5sb29rdXAocGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGlzdHMgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleGlzdHMpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLnVuYmluZChwYXRoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmVzcC5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT19DT05URU5UKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19NRVRIT0RfTk9UX0FMTE9XRUQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBjb25kaXRpb25zIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9uYWwgSWYgaGVhZGVycyBhcmUKKyAgICAgKiBzYXRpc2ZpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSByZXNvdXJjZUF0dHJpYnV0ZXMgVGhlIHJlc291cmNlIGluZm9ybWF0aW9uCisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIHJlc291cmNlIG1lZXRzIGFsbCB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbnMsCisgICAgICogYW5kIGZhbHNlIGlmIGFueSBvZiB0aGUgY29uZGl0aW9ucyBpcyBub3Qgc2F0aXNmaWVkLCBpbiB3aGljaCBjYXNlCisgICAgICogcmVxdWVzdCBwcm9jZXNzaW5nIGlzIHN0b3BwZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0lmSGVhZGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIGNoZWNrSWZNYXRjaChyZXF1ZXN0LCByZXNwb25zZSwgcmVzb3VyY2VBdHRyaWJ1dGVzKQorICAgICAgICAgICAgJiYgY2hlY2tJZk1vZGlmaWVkU2luY2UocmVxdWVzdCwgcmVzcG9uc2UsIHJlc291cmNlQXR0cmlidXRlcykKKyAgICAgICAgICAgICYmIGNoZWNrSWZOb25lTWF0Y2gocmVxdWVzdCwgcmVzcG9uc2UsIHJlc291cmNlQXR0cmlidXRlcykKKyAgICAgICAgICAgICYmIGNoZWNrSWZVbm1vZGlmaWVkU2luY2UocmVxdWVzdCwgcmVzcG9uc2UsIHJlc291cmNlQXR0cmlidXRlcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgRVRhZyBhc3NvY2lhdGVkIHdpdGggYSBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlQXR0cmlidXRlcyBUaGUgcmVzb3VyY2UgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVUYWcoUmVzb3VyY2VBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgeworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgaWYgKChyZXN1bHQgPSByZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0RVRhZyh0cnVlKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBlbHNlIGlmICgocmVzdWx0ID0gcmVzb3VyY2VBdHRyaWJ1dGVzLmdldEVUYWcoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAiVy9cIiIgKyByZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0Q29udGVudExlbmd0aCgpICsgIi0iCisgICAgICAgICAgICAgICAgKyByZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0TGFzdE1vZGlmaWVkKCkgKyAiXCIiOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVUkwgcmV3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIHdoaWNoIGhhcyB0byBiZSByZXdpdGVuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByZXdyaXRlVXJsKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHJldHVybiB1cmxFbmNvZGVyLmVuY29kZSggcGF0aCApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGlzcGxheSB0aGUgc2l6ZSBvZiBhIGZpbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGlzcGxheVNpemUoU3RyaW5nQnVmZmVyIGJ1ZiwgaW50IGZpbGVzaXplKSB7CisKKyAgICAgICAgaW50IGxlZnRzaWRlID0gZmlsZXNpemUgLyAxMDI0OworICAgICAgICBpbnQgcmlnaHRzaWRlID0gKGZpbGVzaXplICUgMTAyNCkgLyAxMDM7ICAvLyBtYWtlcyAxIGRpZ2l0CisgICAgICAgIC8vIFRvIGF2b2lkIDAuMCBmb3Igbm9uLXplcm8gZmlsZSwgd2UgYnVtcCB0byAwLjEKKyAgICAgICAgaWYgKGxlZnRzaWRlID09IDAgJiYgcmlnaHRzaWRlID09IDAgJiYgZmlsZXNpemUgIT0gMCkKKyAgICAgICAgICAgIHJpZ2h0c2lkZSA9IDE7CisgICAgICAgIGJ1Zi5hcHBlbmQobGVmdHNpZGUpLmFwcGVuZCgiLiIpLmFwcGVuZChyaWdodHNpZGUpOworICAgICAgICBidWYuYXBwZW5kKCIgS0IiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VydmUgdGhlIHNwZWNpZmllZCByZXNvdXJjZSwgb3B0aW9uYWxseSBpbmNsdWRpbmcgdGhlIGRhdGEgY29udGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHBhcmFtIGNvbnRlbnQgU2hvdWxkIHRoZSBjb250ZW50IGJlIGluY2x1ZGVkPworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldC1zcGVjaWZpZWQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2VydmVSZXNvdXJjZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNvbnRlbnQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBwYXRoCisgICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UmVsYXRpdmVQYXRoKHJlcXVlc3QpOworICAgICAgICBpZiAoZGVidWcgPiAwKSB7CisgICAgICAgICAgICBpZiAoY29udGVudCkKKyAgICAgICAgICAgICAgICBsb2coIkRlZmF1bHRTZXJ2bGV0LnNlcnZlUmVzb3VyY2U6ICBTZXJ2aW5nIHJlc291cmNlICciICsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCArICInIGhlYWRlcnMgYW5kIGRhdGEiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsb2coIkRlZmF1bHRTZXJ2bGV0LnNlcnZlUmVzb3VyY2U6ICBTZXJ2aW5nIHJlc291cmNlICciICsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCArICInIGhlYWRlcnMgb25seSIpOworICAgICAgICB9CisKKyAgICAgICAgQ2FjaGVFbnRyeSBjYWNoZUVudHJ5ID0gcmVzb3VyY2VzLmxvb2t1cENhY2hlKHBhdGgpOworCisgICAgICAgIGlmICghY2FjaGVFbnRyeS5leGlzdHMpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluY2x1ZGVkIHNvIHdlIGNhbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIAorICAgICAgICAgICAgLy8gbWlzc2luZyByZXNvdXJjZSBuYW1lIGluIHRoZSBlcnJvcgorICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RVcmkgPSAoU3RyaW5nKSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFscy5JTkNMVURFX1JFUVVFU1RfVVJJX0FUVFIpOworICAgICAgICAgICAgaWYgKHJlcXVlc3RVcmkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RVcmkgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UncmUgaW5jbHVkZWQsIGFuZCB0aGUgcmVzcG9uc2Uuc2VuZEVycm9yKCkgYmVsb3cgaXMgZ29pbmcKKyAgICAgICAgICAgICAgICAvLyB0byBiZSBpZ25vcmVkIGJ5IHRoZSByZXNvdXJjZSB0aGF0IGlzIGluY2x1ZGluZyB1cy4KKyAgICAgICAgICAgICAgICAvLyBUaGVyZWZvcmUsIHRoZSBvbmx5IHdheSB3ZSBjYW4gbGV0IHRoZSBpbmNsdWRpbmcgcmVzb3VyY2UKKyAgICAgICAgICAgICAgICAvLyBrbm93IGlzIGJ5IGluY2x1ZGluZyB3YXJuaW5nIG1lc3NhZ2UgaW4gcmVzcG9uc2UKKyAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRXcml0ZXIoKS53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJkZWZhdWx0U2VydmxldC5taXNzaW5nUmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VXJpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VXJpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSByZXNvdXJjZSBpcyBub3QgYSBjb2xsZWN0aW9uLCBhbmQgdGhlIHJlc291cmNlIHBhdGgKKyAgICAgICAgLy8gZW5kcyB3aXRoICIvIiBvciAiXCIsIHJldHVybiBOT1QgRk9VTkQKKyAgICAgICAgaWYgKGNhY2hlRW50cnkuY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgiLyIpIHx8IChwYXRoLmVuZHNXaXRoKCJcXCIpKSkgeworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluY2x1ZGVkIHNvIHdlIGNhbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIAorICAgICAgICAgICAgICAgIC8vIG1pc3NpbmcgcmVzb3VyY2UgbmFtZSBpbiB0aGUgZXJyb3IKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVxdWVzdFVyaSA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxzLklOQ0xVREVfUkVRVUVTVF9VUklfQVRUUik7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RVcmkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VXJpID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVyaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbmRpdGlvbnMgc3BlY2lmaWVkIGluIHRoZSBvcHRpb25hbCBJZiBoZWFkZXJzIGFyZQorICAgICAgICAvLyBzYXRpc2ZpZWQuCisgICAgICAgIGlmIChjYWNoZUVudHJ5LmNvbnRleHQgPT0gbnVsbCkgeworCisgICAgICAgICAgICAvLyBDaGVja2luZyBJZiBoZWFkZXJzCisgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVkID0KKyAgICAgICAgICAgICAgICAocmVxdWVzdC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5JTkNMVURFX0NPTlRFWFRfUEFUSF9BVFRSKSAhPSBudWxsKTsKKyAgICAgICAgICAgIGlmICghaW5jbHVkZWQKKyAgICAgICAgICAgICAgICAmJiAhY2hlY2tJZkhlYWRlcnMocmVxdWVzdCwgcmVzcG9uc2UsIGNhY2hlRW50cnkuYXR0cmlidXRlcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmQgY29udGVudCB0eXBlLgorICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBjYWNoZUVudHJ5LmF0dHJpYnV0ZXMuZ2V0TWltZVR5cGUoKTsKKyAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gZ2V0U2VydmxldENvbnRleHQoKS5nZXRNaW1lVHlwZShjYWNoZUVudHJ5Lm5hbWUpOworICAgICAgICAgICAgY2FjaGVFbnRyeS5hdHRyaWJ1dGVzLnNldE1pbWVUeXBlKGNvbnRlbnRUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEFycmF5TGlzdCByYW5nZXMgPSBudWxsOworICAgICAgICBsb25nIGNvbnRlbnRMZW5ndGggPSAtMUw7CisKKyAgICAgICAgaWYgKGNhY2hlRW50cnkuY29udGV4dCAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIFNraXAgZGlyZWN0b3J5IGxpc3RpbmdzIGlmIHdlIGhhdmUgYmVlbiBjb25maWd1cmVkIHRvCisgICAgICAgICAgICAvLyBzdXBwcmVzcyB0aGVtCisgICAgICAgICAgICBpZiAoIWxpc3RpbmdzKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGVudFR5cGUgPSAidGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiOworCisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIC8vIFBhcnNlIHJhbmdlIHNwZWNpZmllcgorCisgICAgICAgICAgICByYW5nZXMgPSBwYXJzZVJhbmdlKHJlcXVlc3QsIHJlc3BvbnNlLCBjYWNoZUVudHJ5LmF0dHJpYnV0ZXMpOworCisgICAgICAgICAgICAvLyBFVGFnIGhlYWRlcgorICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJFVGFnIiwgZ2V0RVRhZyhjYWNoZUVudHJ5LmF0dHJpYnV0ZXMpKTsKKworICAgICAgICAgICAgLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiTGFzdC1Nb2RpZmllZCIsCisgICAgICAgICAgICAgICAgICAgIGNhY2hlRW50cnkuYXR0cmlidXRlcy5nZXRMYXN0TW9kaWZpZWRIdHRwKCkpOworCisgICAgICAgICAgICAvLyBHZXQgY29udGVudCBsZW5ndGgKKyAgICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSBjYWNoZUVudHJ5LmF0dHJpYnV0ZXMuZ2V0Q29udGVudExlbmd0aCgpOworICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciB6ZXJvIGxlbmd0aCBmaWxlcywgd2hpY2ggd291bGQgY2F1c2UgYQorICAgICAgICAgICAgLy8gKHNpbGVudCkgSVNFIHdoZW4gc2V0dGluZyB0aGUgb3V0cHV0IGJ1ZmZlciBzaXplCisgICAgICAgICAgICBpZiAoY29udGVudExlbmd0aCA9PSAwTCkgeworICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgU2VydmxldE91dHB1dFN0cmVhbSBvc3RyZWFtID0gbnVsbDsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbnVsbDsKKworICAgICAgICBpZiAoY29udGVudCkgeworCisgICAgICAgICAgICAvLyBUcnlpbmcgdG8gcmV0cmlldmUgdGhlIHNlcnZsZXQgb3V0cHV0IHN0cmVhbQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9zdHJlYW0gPSByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgaXQgZmFpbHMsIHdlIHRyeSB0byBnZXQgYSBXcml0ZXIgaW5zdGVhZCBpZiB3ZSdyZQorICAgICAgICAgICAgICAgIC8vIHRyeWluZyB0byBzZXJ2ZSBhIHRleHQgZmlsZQorICAgICAgICAgICAgICAgIGlmICggKGNvbnRlbnRUeXBlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICB8fCAoY29udGVudFR5cGUuc3RhcnRzV2l0aCgidGV4dCIpKQorICAgICAgICAgICAgICAgICAgICAgfHwgKGNvbnRlbnRUeXBlLmVuZHNXaXRoKCJ4bWwiKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBpZiAoIChjYWNoZUVudHJ5LmNvbnRleHQgIT0gbnVsbCkgCisgICAgICAgICAgICAgICAgfHwgKCAoKHJhbmdlcyA9PSBudWxsKSB8fCAocmFuZ2VzLmlzRW1wdHkoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAocmVxdWVzdC5nZXRIZWFkZXIoIlJhbmdlIikgPT0gbnVsbCkgKQorICAgICAgICAgICAgICAgIHx8IChyYW5nZXMgPT0gRlVMTCkgKSB7CisKKyAgICAgICAgICAgIC8vIFNldCB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0IGhlYWRlcnMKKyAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJEZWZhdWx0U2VydmxldC5zZXJ2ZUZpbGU6ICBjb250ZW50VHlwZT0nIiArCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSArICInIik7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChjYWNoZUVudHJ5LnJlc291cmNlICE9IG51bGwpICYmIChjb250ZW50TGVuZ3RoID49IDApKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJEZWZhdWx0U2VydmxldC5zZXJ2ZUZpbGU6ICBjb250ZW50TGVuZ3RoPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudExlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggPCBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50TGVuZ3RoKChpbnQpIGNvbnRlbnRMZW5ndGgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgY29udGVudC1sZW5ndGggYXMgU3RyaW5nIHRvIGJlIGFibGUgdG8gdXNlIGEgbG9uZworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoImNvbnRlbnQtbGVuZ3RoIiwgIiIgKyBjb250ZW50TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIElucHV0U3RyZWFtIHJlbmRlclJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICBpZiAoY2FjaGVFbnRyeS5jb250ZXh0ICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgIGlmIChjb250ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNlcnZlIHRoZSBkaXJlY3RvcnkgYnJvd3NlcgorICAgICAgICAgICAgICAgICAgICByZW5kZXJSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSwgY2FjaGVFbnRyeSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENvcHkgdGhlIGlucHV0IHN0cmVhbSB0byBvdXIgb3V0cHV0IHN0cmVhbSAoaWYgcmVxdWVzdGVkKQorICAgICAgICAgICAgaWYgKGNvbnRlbnQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRCdWZmZXJTaXplKG91dHB1dCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW50IGNhdGNoCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja1NlbmRmaWxlKHJlcXVlc3QsIHJlc3BvbnNlLCBjYWNoZUVudHJ5LCBjb250ZW50TGVuZ3RoLCBudWxsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkoY2FjaGVFbnRyeSwgcmVuZGVyUmVzdWx0LCBvc3RyZWFtKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb3B5KGNhY2hlRW50cnksIHJlbmRlclJlc3VsdCwgd3JpdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgaWYgKChyYW5nZXMgPT0gbnVsbCkgfHwgKHJhbmdlcy5pc0VtcHR5KCkpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gUGFydGlhbCBjb250ZW50IHJlc3BvbnNlLgorCisgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19QQVJUSUFMX0NPTlRFTlQpOworCisgICAgICAgICAgICBpZiAocmFuZ2VzLnNpemUoKSA9PSAxKSB7CisKKyAgICAgICAgICAgICAgICBSYW5nZSByYW5nZSA9IChSYW5nZSkgcmFuZ2VzLmdldCgwKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoIkNvbnRlbnQtUmFuZ2UiLCAiYnl0ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJhbmdlLnN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi0iICsgcmFuZ2UuZW5kICsgIi8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmFuZ2UubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBsb25nIGxlbmd0aCA9IHJhbmdlLmVuZCAtIHJhbmdlLnN0YXJ0ICsgMTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudExlbmd0aCgoaW50KSBsZW5ndGgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgY29udGVudC1sZW5ndGggYXMgU3RyaW5nIHRvIGJlIGFibGUgdG8gdXNlIGEgbG9uZworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoImNvbnRlbnQtbGVuZ3RoIiwgIiIgKyBsZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkRlZmF1bHRTZXJ2bGV0LnNlcnZlRmlsZTogIGNvbnRlbnRUeXBlPSciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSArICInIik7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0QnVmZmVyU2l6ZShvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW50IGNhdGNoCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9zdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja1NlbmRmaWxlKHJlcXVlc3QsIHJlc3BvbnNlLCBjYWNoZUVudHJ5LCByYW5nZS5lbmQgLSByYW5nZS5zdGFydCArIDEsIHJhbmdlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5KGNhY2hlRW50cnksIG9zdHJlYW0sIHJhbmdlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkoY2FjaGVFbnRyeSwgd3JpdGVyLCByYW5nZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgibXVsdGlwYXJ0L2J5dGVyYW5nZXM7IGJvdW5kYXJ5PSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1pbWVTZXBhcmF0aW9uKTsKKworICAgICAgICAgICAgICAgIGlmIChjb250ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRCdWZmZXJTaXplKG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaWxlbnQgY2F0Y2gKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob3N0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5KGNhY2hlRW50cnksIG9zdHJlYW0sIHJhbmdlcy5pdGVyYXRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5KGNhY2hlRW50cnksIHdyaXRlciwgcmFuZ2VzLml0ZXJhdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIGNvbnRlbnQtcmFuZ2UgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKiBAcmV0dXJuIFJhbmdlCisgICAgICovCisgICAgcHJvdGVjdGVkIFJhbmdlIHBhcnNlQ29udGVudFJhbmdlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIFJldHJpZXZpbmcgdGhlIGNvbnRlbnQtcmFuZ2UgaGVhZGVyIChpZiBhbnkgaXMgc3BlY2lmaWVkCisgICAgICAgIFN0cmluZyByYW5nZUhlYWRlciA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJDb250ZW50LVJhbmdlIik7CisKKyAgICAgICAgaWYgKHJhbmdlSGVhZGVyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBieXRlcyBpcyB0aGUgb25seSByYW5nZSB1bml0IHN1cHBvcnRlZAorICAgICAgICBpZiAoIXJhbmdlSGVhZGVyLnN0YXJ0c1dpdGgoImJ5dGVzIikpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmFuZ2VIZWFkZXIgPSByYW5nZUhlYWRlci5zdWJzdHJpbmcoNikudHJpbSgpOworCisgICAgICAgIGludCBkYXNoUG9zID0gcmFuZ2VIZWFkZXIuaW5kZXhPZignLScpOworICAgICAgICBpbnQgc2xhc2hQb3MgPSByYW5nZUhlYWRlci5pbmRleE9mKCcvJyk7CisKKyAgICAgICAgaWYgKGRhc2hQb3MgPT0gLTEpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNsYXNoUG9zID09IC0xKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFJhbmdlIHJhbmdlID0gbmV3IFJhbmdlKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJhbmdlLnN0YXJ0ID0gTG9uZy5wYXJzZUxvbmcocmFuZ2VIZWFkZXIuc3Vic3RyaW5nKDAsIGRhc2hQb3MpKTsKKyAgICAgICAgICAgIHJhbmdlLmVuZCA9CisgICAgICAgICAgICAgICAgTG9uZy5wYXJzZUxvbmcocmFuZ2VIZWFkZXIuc3Vic3RyaW5nKGRhc2hQb3MgKyAxLCBzbGFzaFBvcykpOworICAgICAgICAgICAgcmFuZ2UubGVuZ3RoID0gTG9uZy5wYXJzZUxvbmcKKyAgICAgICAgICAgICAgICAocmFuZ2VIZWFkZXIuc3Vic3RyaW5nKHNsYXNoUG9zICsgMSwgcmFuZ2VIZWFkZXIubGVuZ3RoKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFyYW5nZS52YWxpZGF0ZSgpKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByYW5nZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIHJhbmdlIGhlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHJldHVybiBWZWN0b3Igb2YgcmFuZ2VzCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBwYXJzZVJhbmdlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIENoZWNraW5nIElmLVJhbmdlCisgICAgICAgIFN0cmluZyBoZWFkZXJWYWx1ZSA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJJZi1SYW5nZSIpOworCisgICAgICAgIGlmIChoZWFkZXJWYWx1ZSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIGxvbmcgaGVhZGVyVmFsdWVUaW1lID0gKC0xTCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGhlYWRlclZhbHVlVGltZSA9IHJlcXVlc3QuZ2V0RGF0ZUhlYWRlcigiSWYtUmFuZ2UiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgZVRhZyA9IGdldEVUYWcocmVzb3VyY2VBdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gcmVzb3VyY2VBdHRyaWJ1dGVzLmdldExhc3RNb2RpZmllZCgpOworCisgICAgICAgICAgICBpZiAoaGVhZGVyVmFsdWVUaW1lID09ICgtMUwpKSB7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgRVRhZyB0aGUgY2xpZW50IGdhdmUgZG9lcyBub3QgbWF0Y2ggdGhlIGVudGl0eQorICAgICAgICAgICAgICAgIC8vIGV0YWcsIHRoZW4gdGhlIGVudGlyZSBlbnRpdHkgaXMgcmV0dXJuZWQuCisgICAgICAgICAgICAgICAgaWYgKCFlVGFnLmVxdWFscyhoZWFkZXJWYWx1ZS50cmltKCkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRlVMTDsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGVudGl0eSB0aGUgY2xpZW50IGdvdCBpcyBvbGRlciB0aGFuCisgICAgICAgICAgICAgICAgLy8gdGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIGVudGl0eSwgdGhlIGVudGlyZSBlbnRpdHkKKyAgICAgICAgICAgICAgICAvLyBpcyByZXR1cm5lZC4KKyAgICAgICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkID4gKGhlYWRlclZhbHVlVGltZSArIDEwMDApKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRlVMTDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBsb25nIGZpbGVMZW5ndGggPSByZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0Q29udGVudExlbmd0aCgpOworCisgICAgICAgIGlmIChmaWxlTGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBSZXRyaWV2aW5nIHRoZSByYW5nZSBoZWFkZXIgKGlmIGFueSBpcyBzcGVjaWZpZWQKKyAgICAgICAgU3RyaW5nIHJhbmdlSGVhZGVyID0gcmVxdWVzdC5nZXRIZWFkZXIoIlJhbmdlIik7CisKKyAgICAgICAgaWYgKHJhbmdlSGVhZGVyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgLy8gYnl0ZXMgaXMgdGhlIG9ubHkgcmFuZ2UgdW5pdCBzdXBwb3J0ZWQgKGFuZCBJIGRvbid0IHNlZSB0aGUgcG9pbnQKKyAgICAgICAgLy8gb2YgYWRkaW5nIG5ldyBvbmVzKS4KKyAgICAgICAgaWYgKCFyYW5nZUhlYWRlci5zdGFydHNXaXRoKCJieXRlcyIpKSB7CisgICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoIkNvbnRlbnQtUmFuZ2UiLCAiYnl0ZXMgKi8iICsgZmlsZUxlbmd0aCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19SRVFVRVNURURfUkFOR0VfTk9UX1NBVElTRklBQkxFKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmFuZ2VIZWFkZXIgPSByYW5nZUhlYWRlci5zdWJzdHJpbmcoNik7CisKKyAgICAgICAgLy8gVmVjdG9yIHdoaWNoIHdpbGwgY29udGFpbiBhbGwgdGhlIHJhbmdlcyB3aGljaCBhcmUgc3VjY2Vzc2Z1bGx5CisgICAgICAgIC8vIHBhcnNlZC4KKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIGNvbW1hVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihyYW5nZUhlYWRlciwgIiwiKTsKKworICAgICAgICAvLyBQYXJzaW5nIHRoZSByYW5nZSBsaXN0CisgICAgICAgIHdoaWxlIChjb21tYVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyByYW5nZURlZmluaXRpb24gPSBjb21tYVRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7CisKKyAgICAgICAgICAgIFJhbmdlIGN1cnJlbnRSYW5nZSA9IG5ldyBSYW5nZSgpOworICAgICAgICAgICAgY3VycmVudFJhbmdlLmxlbmd0aCA9IGZpbGVMZW5ndGg7CisKKyAgICAgICAgICAgIGludCBkYXNoUG9zID0gcmFuZ2VEZWZpbml0aW9uLmluZGV4T2YoJy0nKTsKKworICAgICAgICAgICAgaWYgKGRhc2hQb3MgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoIkNvbnRlbnQtUmFuZ2UiLCAiYnl0ZXMgKi8iICsgZmlsZUxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX1JFUVVFU1RFRF9SQU5HRV9OT1RfU0FUSVNGSUFCTEUpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGFzaFBvcyA9PSAwKSB7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBsb25nIG9mZnNldCA9IExvbmcucGFyc2VMb25nKHJhbmdlRGVmaW5pdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSYW5nZS5zdGFydCA9IGZpbGVMZW5ndGggKyBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSYW5nZS5lbmQgPSBmaWxlTGVuZ3RoIC0gMTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoIkNvbnRlbnQtUmFuZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzICovIiArIGZpbGVMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgLlNDX1JFUVVFU1RFRF9SQU5HRV9OT1RfU0FUSVNGSUFCTEUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmFuZ2Uuc3RhcnQgPSBMb25nLnBhcnNlTG9uZworICAgICAgICAgICAgICAgICAgICAgICAgKHJhbmdlRGVmaW5pdGlvbi5zdWJzdHJpbmcoMCwgZGFzaFBvcykpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGFzaFBvcyA8IHJhbmdlRGVmaW5pdGlvbi5sZW5ndGgoKSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmFuZ2UuZW5kID0gTG9uZy5wYXJzZUxvbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmFuZ2VEZWZpbml0aW9uLnN1YnN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGFzaFBvcyArIDEsIHJhbmdlRGVmaW5pdGlvbi5sZW5ndGgoKSkpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmFuZ2UuZW5kID0gZmlsZUxlbmd0aCAtIDE7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJDb250ZW50LVJhbmdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcyAqLyIgKyBmaWxlTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAgICAgIC5TQ19SRVFVRVNURURfUkFOR0VfTk9UX1NBVElTRklBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghY3VycmVudFJhbmdlLnZhbGlkYXRlKCkpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoIkNvbnRlbnQtUmFuZ2UiLCAiYnl0ZXMgKi8iICsgZmlsZUxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX1JFUVVFU1RFRF9SQU5HRV9OT1RfU0FUSVNGSUFCTEUpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQuYWRkKGN1cnJlbnRSYW5nZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiAgRGVjaWRlIHdoaWNoIHdheSB0byByZW5kZXIuIEhUTUwgb3IgWE1MLgorICAgICAqLworICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSByZW5kZXIKKyAgICAgICAgKFN0cmluZyBjb250ZXh0UGF0aCwgQ2FjaGVFbnRyeSBjYWNoZUVudHJ5KSB7CisgICAgICAgIElucHV0U3RyZWFtIHhzbHRJbnB1dFN0cmVhbSA9CisgICAgICAgICAgICBmaW5kWHNsdElucHV0U3RyZWFtKGNhY2hlRW50cnkuY29udGV4dCk7CisKKyAgICAgICAgaWYgKHhzbHRJbnB1dFN0cmVhbT09bnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJlbmRlckh0bWwoY29udGV4dFBhdGgsIGNhY2hlRW50cnkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlbmRlclhtbChjb250ZXh0UGF0aCwgY2FjaGVFbnRyeSwgeHNsdElucHV0U3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIElucHV0U3RyZWFtIHRvIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRlbnRzCisgICAgICogb2YgdGhpcyBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGggQ29udGV4dCBwYXRoIHRvIHdoaWNoIG91ciBpbnRlcm5hbCBwYXRocyBhcmUKKyAgICAgKiAgcmVsYXRpdmUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gcmVuZGVyWG1sKFN0cmluZyBjb250ZXh0UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlRW50cnkgY2FjaGVFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHhzbHRJbnB1dFN0cmVhbSkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBzYi5hcHBlbmQoIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPGxpc3RpbmcgIik7CisgICAgICAgIHNiLmFwcGVuZCgiIGNvbnRleHRQYXRoPSciKTsKKyAgICAgICAgc2IuYXBwZW5kKGNvbnRleHRQYXRoKTsKKyAgICAgICAgc2IuYXBwZW5kKCInIik7CisgICAgICAgIHNiLmFwcGVuZCgiIGRpcmVjdG9yeT0nIik7CisgICAgICAgIHNiLmFwcGVuZChjYWNoZUVudHJ5Lm5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIicgIik7CisgICAgICAgIHNiLmFwcGVuZCgiIGhhc1BhcmVudD0nIikuYXBwZW5kKCFjYWNoZUVudHJ5Lm5hbWUuZXF1YWxzKCIvIikpOworICAgICAgICBzYi5hcHBlbmQoIic+Iik7CisKKyAgICAgICAgc2IuYXBwZW5kKCI8ZW50cmllcz4iKTsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBSZW5kZXIgdGhlIGRpcmVjdG9yeSBlbnRyaWVzIHdpdGhpbiB0aGlzIGRpcmVjdG9yeQorICAgICAgICAgICAgTmFtaW5nRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSByZXNvdXJjZXMubGlzdChjYWNoZUVudHJ5Lm5hbWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyByZXdyaXRlVXJsKGNvbnRleHRQYXRoKSBpcyBleHBlbnNpdmUuIGNhY2hlIHJlc3VsdCBmb3IgbGF0ZXIgcmV1c2UKKyAgICAgICAgICAgIFN0cmluZyByZXdyaXR0ZW5Db250ZXh0UGF0aCA9ICByZXdyaXRlVXJsKGNvbnRleHRQYXRoKTsKKworICAgICAgICAgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7CisKKyAgICAgICAgICAgICAgICBOYW1lQ2xhc3NQYWlyIG5jUGFpciA9IChOYW1lQ2xhc3NQYWlyKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUgPSBuY1BhaXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIFN0cmluZyB0cmltbWVkID0gcmVzb3VyY2VOYW1lLyouc3Vic3RyaW5nKHRyaW0pKi87CisgICAgICAgICAgICAgICAgaWYgKHRyaW1tZWQuZXF1YWxzSWdub3JlQ2FzZSgiV0VCLUlORiIpIHx8CisgICAgICAgICAgICAgICAgICAgIHRyaW1tZWQuZXF1YWxzSWdub3JlQ2FzZSgiTUVUQS1JTkYiKSB8fAorICAgICAgICAgICAgICAgICAgICB0cmltbWVkLmVxdWFsc0lnbm9yZUNhc2UobG9jYWxYc2x0RmlsZSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgQ2FjaGVFbnRyeSBjaGlsZENhY2hlRW50cnkgPQorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMubG9va3VwQ2FjaGUoY2FjaGVFbnRyeS5uYW1lICsgcmVzb3VyY2VOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNoaWxkQ2FjaGVFbnRyeS5leGlzdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8ZW50cnkiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiB0eXBlPSciKQorICAgICAgICAgICAgICAgICAgLmFwcGVuZCgoY2hpbGRDYWNoZUVudHJ5LmNvbnRleHQgIT0gbnVsbCk/ImRpciI6ImZpbGUiKQorICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiJyIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHVybFBhdGg9JyIpCisgICAgICAgICAgICAgICAgICAuYXBwZW5kKHJld3JpdHRlbkNvbnRleHRQYXRoKQorICAgICAgICAgICAgICAgICAgLmFwcGVuZChyZXdyaXRlVXJsKGNhY2hlRW50cnkubmFtZSArIHJlc291cmNlTmFtZSkpCisgICAgICAgICAgICAgICAgICAuYXBwZW5kKChjaGlsZENhY2hlRW50cnkuY29udGV4dCAhPSBudWxsKT8iLyI6IiIpCisgICAgICAgICAgICAgICAgICAuYXBwZW5kKCInIik7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkQ2FjaGVFbnRyeS5yZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNpemU9JyIpCisgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChyZW5kZXJTaXplKGNoaWxkQ2FjaGVFbnRyeS5hdHRyaWJ1dGVzLmdldENvbnRlbnRMZW5ndGgoKSkpCisgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiJyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBkYXRlPSciKQorICAgICAgICAgICAgICAgICAgLmFwcGVuZChjaGlsZENhY2hlRW50cnkuYXR0cmlidXRlcy5nZXRMYXN0TW9kaWZpZWRIdHRwKCkpCisgICAgICAgICAgICAgICAgICAuYXBwZW5kKCInIik7CisKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIj4iKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoUmVxdWVzdFV0aWwuZmlsdGVyKHRyaW1tZWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRDYWNoZUVudHJ5LmNvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8L2VudHJ5PiIpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nCisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisKKyAgICAgICAgc2IuYXBwZW5kKCI8L2VudHJpZXM+Iik7CisKKyAgICAgICAgU3RyaW5nIHJlYWRtZSA9IGdldFJlYWRtZShjYWNoZUVudHJ5LmNvbnRleHQpOworCisgICAgICAgIGlmIChyZWFkbWUhPW51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPHJlYWRtZT48IVtDREFUQVsiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChyZWFkbWUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCJdXT48L3JlYWRtZT4iKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgc2IuYXBwZW5kKCI8L2xpc3Rpbmc+Iik7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBTb3VyY2UgeG1sU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKHNiLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIFNvdXJjZSB4c2xTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKHhzbHRJbnB1dFN0cmVhbSk7CisgICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKHhzbFNvdXJjZSk7CisKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3NXcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHN0cmVhbSwgIlVURjgiKTsKKyAgICAgICAgICAgIFN0cmVhbVJlc3VsdCBvdXQgPSBuZXcgU3RyZWFtUmVzdWx0KG9zV3JpdGVyKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSh4bWxTb3VyY2UsIG91dCk7CisgICAgICAgICAgICBvc1dyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgcmV0dXJuIChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc3RyZWFtLnRvQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiZGlyZWN0b3J5IHRyYW5zZm9ybSBmYWlsdXJlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuIHJlbmRlckh0bWwoY29udGV4dFBhdGgsIGNhY2hlRW50cnkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIElucHV0U3RyZWFtIHRvIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRlbnRzCisgICAgICogb2YgdGhpcyBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGggQ29udGV4dCBwYXRoIHRvIHdoaWNoIG91ciBpbnRlcm5hbCBwYXRocyBhcmUKKyAgICAgKiAgcmVsYXRpdmUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gcmVuZGVySHRtbAorICAgICAgICAoU3RyaW5nIGNvbnRleHRQYXRoLCBDYWNoZUVudHJ5IGNhY2hlRW50cnkpIHsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IGNhY2hlRW50cnkubmFtZTsKKworICAgICAgICAvLyBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byB0cmltIGZyb20gdGhlIGJlZ2lubmluZ3Mgb2YgZmlsZW5hbWVzCisgICAgICAgIGludCB0cmltID0gbmFtZS5sZW5ndGgoKTsKKyAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKCIvIikpCisgICAgICAgICAgICB0cmltICs9IDE7CisgICAgICAgIGlmIChuYW1lLmVxdWFscygiLyIpKQorICAgICAgICAgICAgdHJpbSA9IDE7CisKKyAgICAgICAgLy8gUHJlcGFyZSBhIHdyaXRlciB0byBhIGJ1ZmZlcmVkIGFyZWEKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIG9zV3JpdGVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9zV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihzdHJlYW0sICJVVEY4Iik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICBvc1dyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3NXcml0ZXIpOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgCisgICAgICAgIC8vIHJld3JpdGVVcmwoY29udGV4dFBhdGgpIGlzIGV4cGVuc2l2ZS4gY2FjaGUgcmVzdWx0IGZvciBsYXRlciByZXVzZQorICAgICAgICBTdHJpbmcgcmV3cml0dGVuQ29udGV4dFBhdGggPSAgcmV3cml0ZVVybChjb250ZXh0UGF0aCk7CisKKyAgICAgICAgLy8gUmVuZGVyIHRoZSBwYWdlIGhlYWRlcgorICAgICAgICBzYi5hcHBlbmQoIjxodG1sPlxyXG4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8aGVhZD5cclxuIik7CisgICAgICAgIHNiLmFwcGVuZCgiPHRpdGxlPiIpOworICAgICAgICBzYi5hcHBlbmQoc20uZ2V0U3RyaW5nKCJkaXJlY3RvcnkudGl0bGUiLCBuYW1lKSk7CisgICAgICAgIHNiLmFwcGVuZCgiPC90aXRsZT5cclxuIik7CisgICAgICAgIHNiLmFwcGVuZCgiPFNUWUxFPjwhLS0iKTsKKyAgICAgICAgc2IuYXBwZW5kKG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5Ub21jYXRDU1MuVE9NQ0FUX0NTUyk7CisgICAgICAgIHNiLmFwcGVuZCgiLS0+PC9TVFlMRT4gIik7CisgICAgICAgIHNiLmFwcGVuZCgiPC9oZWFkPlxyXG4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8Ym9keT4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8aDE+Iik7CisgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImRpcmVjdG9yeS50aXRsZSIsIG5hbWUpKTsKKworICAgICAgICAvLyBSZW5kZXIgdGhlIGxpbmsgdG8gb3VyIHBhcmVudCAoaWYgcmVxdWlyZWQpCisgICAgICAgIFN0cmluZyBwYXJlbnREaXJlY3RvcnkgPSBuYW1lOworICAgICAgICBpZiAocGFyZW50RGlyZWN0b3J5LmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIHBhcmVudERpcmVjdG9yeSA9CisgICAgICAgICAgICAgICAgcGFyZW50RGlyZWN0b3J5LnN1YnN0cmluZygwLCBwYXJlbnREaXJlY3RvcnkubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2xhc2ggPSBwYXJlbnREaXJlY3RvcnkubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgaWYgKHNsYXNoID49IDApIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXJlbnQgPSBuYW1lLnN1YnN0cmluZygwLCBzbGFzaCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAtIDxhIGhyZWY9XCIiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChyZXdyaXR0ZW5Db250ZXh0UGF0aCk7CisgICAgICAgICAgICBpZiAocGFyZW50LmVxdWFscygiIikpCisgICAgICAgICAgICAgICAgcGFyZW50ID0gIi8iOworICAgICAgICAgICAgc2IuYXBwZW5kKHJld3JpdGVVcmwocGFyZW50KSk7CisgICAgICAgICAgICBpZiAoIXBhcmVudC5lbmRzV2l0aCgiLyIpKQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgc2IuYXBwZW5kKCJcIj4iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPGI+Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoc20uZ2V0U3RyaW5nKCJkaXJlY3RvcnkucGFyZW50IiwgcGFyZW50KSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjwvYj4iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPC9hPiIpOworICAgICAgICB9CisKKyAgICAgICAgc2IuYXBwZW5kKCI8L2gxPiIpOworICAgICAgICBzYi5hcHBlbmQoIjxIUiBzaXplPVwiMVwiIG5vc2hhZGU9XCJub3NoYWRlXCI+Iik7CisKKyAgICAgICAgc2IuYXBwZW5kKCI8dGFibGUgd2lkdGg9XCIxMDAlXCIgY2VsbHNwYWNpbmc9XCIwXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICIgY2VsbHBhZGRpbmc9XCI1XCIgYWxpZ249XCJjZW50ZXJcIj5cclxuIik7CisKKyAgICAgICAgLy8gUmVuZGVyIHRoZSBjb2x1bW4gaGVhZGluZ3MKKyAgICAgICAgc2IuYXBwZW5kKCI8dHI+XHJcbiIpOworICAgICAgICBzYi5hcHBlbmQoIjx0ZCBhbGlnbj1cImxlZnRcIj48Zm9udCBzaXplPVwiKzFcIj48c3Ryb25nPiIpOworICAgICAgICBzYi5hcHBlbmQoc20uZ2V0U3RyaW5nKCJkaXJlY3RvcnkuZmlsZW5hbWUiKSk7CisgICAgICAgIHNiLmFwcGVuZCgiPC9zdHJvbmc+PC9mb250PjwvdGQ+XHJcbiIpOworICAgICAgICBzYi5hcHBlbmQoIjx0ZCBhbGlnbj1cImNlbnRlclwiPjxmb250IHNpemU9XCIrMVwiPjxzdHJvbmc+Iik7CisgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImRpcmVjdG9yeS5zaXplIikpOworICAgICAgICBzYi5hcHBlbmQoIjwvc3Ryb25nPjwvZm9udD48L3RkPlxyXG4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8dGQgYWxpZ249XCJyaWdodFwiPjxmb250IHNpemU9XCIrMVwiPjxzdHJvbmc+Iik7CisgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImRpcmVjdG9yeS5sYXN0TW9kaWZpZWQiKSk7CisgICAgICAgIHNiLmFwcGVuZCgiPC9zdHJvbmc+PC9mb250PjwvdGQ+XHJcbiIpOworICAgICAgICBzYi5hcHBlbmQoIjwvdHI+Iik7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gUmVuZGVyIHRoZSBkaXJlY3RvcnkgZW50cmllcyB3aXRoaW4gdGhpcyBkaXJlY3RvcnkKKyAgICAgICAgICAgIE5hbWluZ0VudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcmVzb3VyY2VzLmxpc3QoY2FjaGVFbnRyeS5uYW1lKTsKKyAgICAgICAgICAgIGJvb2xlYW4gc2hhZGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworCisgICAgICAgICAgICAgICAgTmFtZUNsYXNzUGFpciBuY1BhaXIgPSAoTmFtZUNsYXNzUGFpcikgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lID0gbmNQYWlyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHJpbW1lZCA9IHJlc291cmNlTmFtZS8qLnN1YnN0cmluZyh0cmltKSovOworICAgICAgICAgICAgICAgIGlmICh0cmltbWVkLmVxdWFsc0lnbm9yZUNhc2UoIldFQi1JTkYiKSB8fAorICAgICAgICAgICAgICAgICAgICB0cmltbWVkLmVxdWFsc0lnbm9yZUNhc2UoIk1FVEEtSU5GIikpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgQ2FjaGVFbnRyeSBjaGlsZENhY2hlRW50cnkgPQorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMubG9va3VwQ2FjaGUoY2FjaGVFbnRyeS5uYW1lICsgcmVzb3VyY2VOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNoaWxkQ2FjaGVFbnRyeS5leGlzdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8dHIiKTsKKyAgICAgICAgICAgICAgICBpZiAoc2hhZGUpCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIGJnY29sb3I9XCIjZWVlZWVlXCIiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIj5cclxuIik7CisgICAgICAgICAgICAgICAgc2hhZGUgPSAhc2hhZGU7CisKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjx0ZCBhbGlnbj1cImxlZnRcIj4mbmJzcDsmbmJzcDtcclxuIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8YSBocmVmPVwiIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHJld3JpdHRlbkNvbnRleHRQYXRoKTsKKyAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWUgPSByZXdyaXRlVXJsKG5hbWUgKyByZXNvdXJjZU5hbWUpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChyZXNvdXJjZU5hbWUpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZENhY2hlRW50cnkuY29udGV4dCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlwiPjx0dD4iKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoUmVxdWVzdFV0aWwuZmlsdGVyKHRyaW1tZWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRDYWNoZUVudHJ5LmNvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8L3R0PjwvYT48L3RkPlxyXG4iKTsKKworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPHRkIGFsaWduPVwicmlnaHRcIj48dHQ+Iik7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkQ2FjaGVFbnRyeS5jb250ZXh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJm5ic3A7Iik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocmVuZGVyU2l6ZShjaGlsZENhY2hlRW50cnkuYXR0cmlidXRlcy5nZXRDb250ZW50TGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjwvdHQ+PC90ZD5cclxuIik7CisKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjx0ZCBhbGlnbj1cInJpZ2h0XCI+PHR0PiIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjaGlsZENhY2hlRW50cnkuYXR0cmlidXRlcy5nZXRMYXN0TW9kaWZpZWRIdHRwKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC90dD48L3RkPlxyXG4iKTsKKworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC90cj5cclxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nCisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVuZGVyIHRoZSBwYWdlIGZvb3RlcgorICAgICAgICBzYi5hcHBlbmQoIjwvdGFibGU+XHJcbiIpOworCisgICAgICAgIHNiLmFwcGVuZCgiPEhSIHNpemU9XCIxXCIgbm9zaGFkZT1cIm5vc2hhZGVcIj4iKTsKKworICAgICAgICBTdHJpbmcgcmVhZG1lID0gZ2V0UmVhZG1lKGNhY2hlRW50cnkuY29udGV4dCk7CisgICAgICAgIGlmIChyZWFkbWUhPW51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChyZWFkbWUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI8SFIgc2l6ZT1cIjFcIiBub3NoYWRlPVwibm9zaGFkZVwiPiIpOworICAgICAgICB9CisKKyAgICAgICAgc2IuYXBwZW5kKCI8aDM+IikuYXBwZW5kKFNlcnZlckluZm8uZ2V0U2VydmVySW5mbygpKS5hcHBlbmQoIjwvaDM+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPC9ib2R5PlxyXG4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8L2h0bWw+XHJcbiIpOworCisgICAgICAgIC8vIFJldHVybiBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIHVuZGVybHlpbmcgYnl0ZXMKKyAgICAgICAgd3JpdGVyLndyaXRlKHNiLnRvU3RyaW5nKCkpOworICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgcmV0dXJuIChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc3RyZWFtLnRvQnl0ZUFycmF5KCkpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVuZGVyIHRoZSBzcGVjaWZpZWQgZmlsZSBzaXplIChpbiBieXRlcykuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZSBGaWxlIHNpemUgKGluIGJ5dGVzKQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVuZGVyU2l6ZShsb25nIHNpemUpIHsKKworICAgICAgICBsb25nIGxlZnRTaWRlID0gc2l6ZSAvIDEwMjQ7CisgICAgICAgIGxvbmcgcmlnaHRTaWRlID0gKHNpemUgJSAxMDI0KSAvIDEwMzsgICAvLyBNYWtlcyAxIGRpZ2l0CisgICAgICAgIGlmICgobGVmdFNpZGUgPT0gMCkgJiYgKHJpZ2h0U2lkZSA9PSAwKSAmJiAoc2l6ZSA+IDApKQorICAgICAgICAgICAgcmlnaHRTaWRlID0gMTsKKworICAgICAgICByZXR1cm4gKCIiICsgbGVmdFNpZGUgKyAiLiIgKyByaWdodFNpZGUgKyAiIGtiIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmVhZG1lIGZpbGUgYXMgYSBzdHJpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZWFkbWUoRGlyQ29udGV4dCBkaXJlY3RvcnkpIHsKKyAgICAgICAgaWYgKHJlYWRtZUZpbGUhPW51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGRpcmVjdG9yeS5sb29rdXAocmVhZG1lRmlsZSk7CisKKyAgICAgICAgICAgICAgICBpZiAob2JqIT1udWxsICYmIG9iaiBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gKChSZXNvdXJjZSlvYmopLnN0cmVhbUNvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29weVJhbmdlKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpbnRXcml0ZXIoYnVmZmVyKSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgbG9nKCJEZWZhdWx0U2VydmxldC5nZXRSZWFkbWU6IElPIGV4Y2VwdGlvbjogIiArIGlvZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBuZSkgeworICAgICAgICAgICAgICAgICBsb2coIkRlZmF1bHRTZXJ2bGV0LmdldFJlYWRtZTogTmFtaW5nIGV4Y2VwdGlvbjogIiArIG5lLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHhzbCB0ZW1wbGF0ZSBpbnB1dHN0cmVhbSAoaWYgcG9zc2libGUpCisgICAgICovCisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGZpbmRYc2x0SW5wdXRTdHJlYW0oRGlyQ29udGV4dCBkaXJlY3RvcnkpIHsKKworICAgICAgICBpZiAobG9jYWxYc2x0RmlsZSE9bnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gZGlyZWN0b3J5Lmxvb2t1cChsb2NhbFhzbHRGaWxlKTsKKyAgICAgICAgICAgICAgICBpZiAob2JqIT1udWxsICYmIG9iaiBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gKChSZXNvdXJjZSlvYmopLnN0cmVhbUNvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzIT1udWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgbG9nKCJEZWZhdWx0U2VydmxldC5maW5kWHNsdElucHV0U3RyZWFtOiBJTyBleGNlcHRpb246ICIgKyBpb2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBuZSkgeworICAgICAgICAgICAgICAgIGxvZygiRGVmYXVsdFNlcnZsZXQuZmluZFhzbHRJbnB1dFN0cmVhbTogTmFtaW5nIGV4Y2VwdGlvbjogIiArIG5lLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogIE9wZW4gYW5kIHJlYWQgaW4gZmlsZSBpbiBvbmUgZmVsbCBzd29vcCB0byByZWR1Y2UgY2hhbmNlCisgICAgICAgICAqICBjaGFuY2Ugb2YgbGVhdmluZyBoYW5kbGUgb3Blbi4KKyAgICAgICAgICovCisgICAgICAgIGlmIChnbG9iYWxYc2x0RmlsZSE9bnVsbCkgeworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZ2xvYmFsWHNsdEZpbGUpOworICAgICAgICAgICAgICAgIGlmIChmLmV4aXN0cygpKXsKKyAgICAgICAgICAgICAgICAgICAgZmlzID1uZXcgRmlsZUlucHV0U3RyZWFtKGYpOworICAgICAgICAgICAgICAgICAgICBieXRlIGJbXSA9IG5ldyBieXRlWyhpbnQpZi5sZW5ndGgoKV07IC8qIGRhbmdlciEgKi8KKyAgICAgICAgICAgICAgICAgICAgZmlzLnJlYWQoYik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZygiRGVmYXVsdFNlcnZsZXQuZmluZFhzbHRJbnB1dFN0cmVhbTogY2FuJ3QgcmVhZCAiCisgICAgICAgICAgICAgICAgICAgICsgZ2xvYmFsWHNsdEZpbGUpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlzIT1udWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIkRlZmF1bHRTZXJ2bGV0LmZpbmRYc2x0SW5wdXRTdHJlYW06ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBleGNlcHRpb24gY2xvc2luZyBpbnB1dCBzdHJlYW06ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHNlbmRmaWxlIGNhbiBiZSB1c2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrU2VuZGZpbGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZUVudHJ5IGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGVuZ3RoLCBSYW5nZSByYW5nZSkgeworICAgICAgICBpZiAoKHNlbmRmaWxlU2l6ZSA+IDApCisgICAgICAgICAgICAmJiAoZW50cnkucmVzb3VyY2UgIT0gbnVsbCkKKyAgICAgICAgICAgICYmICgobGVuZ3RoID4gc2VuZGZpbGVTaXplKSB8fCAoZW50cnkucmVzb3VyY2UuZ2V0Q29udGVudCgpID09IG51bGwpKQorICAgICAgICAgICAgJiYgKGVudHJ5LmF0dHJpYnV0ZXMuZ2V0Q2Fub25pY2FsUGF0aCgpICE9IG51bGwpCisgICAgICAgICAgICAmJiAoQm9vbGVhbi5UUlVFID09IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJvcmcuYXBhY2hlLnRvbWNhdC5zZW5kZmlsZS5zdXBwb3J0IikpCisgICAgICAgICAgICAmJiAocmVxdWVzdC5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3RGYWNhZGUiKSkKKyAgICAgICAgICAgICYmIChyZXNwb25zZS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlRmFjYWRlIikpKSB7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgib3JnLmFwYWNoZS50b21jYXQuc2VuZGZpbGUuZmlsZW5hbWUiLCBlbnRyeS5hdHRyaWJ1dGVzLmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgICAgICAgICBpZiAocmFuZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJvcmcuYXBhY2hlLnRvbWNhdC5zZW5kZmlsZS5zdGFydCIsIG5ldyBMb25nKDBMKSk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIm9yZy5hcGFjaGUudG9tY2F0LnNlbmRmaWxlLmVuZCIsIG5ldyBMb25nKGxlbmd0aCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgib3JnLmFwYWNoZS50b21jYXQuc2VuZGZpbGUuc3RhcnQiLCBuZXcgTG9uZyhyYW5nZS5zdGFydCkpOworICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJvcmcuYXBhY2hlLnRvbWNhdC5zZW5kZmlsZS5lbmQiLCBuZXcgTG9uZyhyYW5nZS5lbmQgKyAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgib3JnLmFwYWNoZS50b21jYXQuc2VuZGZpbGUudG9rZW4iLCB0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBpZi1tYXRjaCBjb25kaXRpb24gaXMgc2F0aXNmaWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VJbmZvIEZpbGUgb2JqZWN0CisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIHJlc291cmNlIG1lZXRzIHRoZSBzcGVjaWZpZWQgY29uZGl0aW9uLAorICAgICAqIGFuZCBmYWxzZSBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQsIGluIHdoaWNoIGNhc2UgcmVxdWVzdAorICAgICAqIHByb2Nlc3NpbmcgaXMgc3RvcHBlZAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrSWZNYXRjaChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBlVGFnID0gZ2V0RVRhZyhyZXNvdXJjZUF0dHJpYnV0ZXMpOworICAgICAgICBTdHJpbmcgaGVhZGVyVmFsdWUgPSByZXF1ZXN0LmdldEhlYWRlcigiSWYtTWF0Y2giKTsKKyAgICAgICAgaWYgKGhlYWRlclZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChoZWFkZXJWYWx1ZS5pbmRleE9mKCcqJykgPT0gLTEpIHsKKworICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBjb21tYVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIKKyAgICAgICAgICAgICAgICAgICAgKGhlYWRlclZhbHVlLCAiLCIpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gY29uZGl0aW9uU2F0aXNmaWVkID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoIWNvbmRpdGlvblNhdGlzZmllZCAmJiBjb21tYVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRUb2tlbiA9IGNvbW1hVG9rZW5pemVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRva2VuLnRyaW0oKS5lcXVhbHMoZVRhZykpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25TYXRpc2ZpZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIG5vbmUgb2YgdGhlIGdpdmVuIEVUYWdzIG1hdGNoLCA0MTIgUHJlY29kaXRpb24gZmFpbGVkIGlzCisgICAgICAgICAgICAgICAgLy8gc2VudCBiYWNrCisgICAgICAgICAgICAgICAgaWYgKCFjb25kaXRpb25TYXRpc2ZpZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19QUkVDT05ESVRJT05fRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgaWYtbW9kaWZpZWQtc2luY2UgY29uZGl0aW9uIGlzIHNhdGlzZmllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHBhcmFtIHJlc291cmNlSW5mbyBGaWxlIG9iamVjdAorICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoZSByZXNvdXJjZSBtZWV0cyB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbiwKKyAgICAgKiBhbmQgZmFsc2UgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3Qgc2F0aXNmaWVkLCBpbiB3aGljaCBjYXNlIHJlcXVlc3QKKyAgICAgKiBwcm9jZXNzaW5nIGlzIHN0b3BwZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0lmTW9kaWZpZWRTaW5jZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvbmcgaGVhZGVyVmFsdWUgPSByZXF1ZXN0LmdldERhdGVIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIik7CisgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IHJlc291cmNlQXR0cmlidXRlcy5nZXRMYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIGlmIChoZWFkZXJWYWx1ZSAhPSAtMSkgeworCisgICAgICAgICAgICAgICAgLy8gSWYgYW4gSWYtTm9uZS1NYXRjaCBoZWFkZXIgaGFzIGJlZW4gc3BlY2lmaWVkLCBpZiBtb2RpZmllZCBzaW5jZQorICAgICAgICAgICAgICAgIC8vIGlzIGlnbm9yZWQuCisgICAgICAgICAgICAgICAgaWYgKChyZXF1ZXN0LmdldEhlYWRlcigiSWYtTm9uZS1NYXRjaCIpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIChsYXN0TW9kaWZpZWQgPCBoZWFkZXJWYWx1ZSArIDEwMDApKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlbnRpdHkgaGFzIG5vdCBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBkYXRlCisgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBieSB0aGUgY2xpZW50LiBUaGlzIGlzIG5vdCBhbiBlcnJvciBjYXNlLgorICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfTU9ESUZJRUQpOworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkVUYWciLCBnZXRFVGFnKHJlc291cmNlQXR0cmlidXRlcykpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlsbGVnYWxBcmd1bWVudCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBpZi1ub25lLW1hdGNoIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSByZXNvdXJjZUluZm8gRmlsZSBvYmplY3QKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgbWVldHMgdGhlIHNwZWNpZmllZCBjb25kaXRpb24sCisgICAgICogYW5kIGZhbHNlIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IHNhdGlzZmllZCwgaW4gd2hpY2ggY2FzZSByZXF1ZXN0CisgICAgICogcHJvY2Vzc2luZyBpcyBzdG9wcGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tJZk5vbmVNYXRjaChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIGVUYWcgPSBnZXRFVGFnKHJlc291cmNlQXR0cmlidXRlcyk7CisgICAgICAgIFN0cmluZyBoZWFkZXJWYWx1ZSA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIik7CisgICAgICAgIGlmIChoZWFkZXJWYWx1ZSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIGJvb2xlYW4gY29uZGl0aW9uU2F0aXNmaWVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICghaGVhZGVyVmFsdWUuZXF1YWxzKCIqIikpIHsKKworICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBjb21tYVRva2VuaXplciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoaGVhZGVyVmFsdWUsICIsIik7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoIWNvbmRpdGlvblNhdGlzZmllZCAmJiBjb21tYVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRUb2tlbiA9IGNvbW1hVG9rZW5pemVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRva2VuLnRyaW0oKS5lcXVhbHMoZVRhZykpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25TYXRpc2ZpZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25kaXRpb25TYXRpc2ZpZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29uZGl0aW9uU2F0aXNmaWVkKSB7CisKKyAgICAgICAgICAgICAgICAvLyBGb3IgR0VUIGFuZCBIRUFELCB3ZSBzaG91bGQgcmVzcG9uZCB3aXRoCisgICAgICAgICAgICAgICAgLy8gMzA0IE5vdCBNb2RpZmllZC4KKyAgICAgICAgICAgICAgICAvLyBGb3IgZXZlcnkgb3RoZXIgbWV0aG9kLCA0MTIgUHJlY29uZGl0aW9uIEZhaWxlZCBpcyBzZW50CisgICAgICAgICAgICAgICAgLy8gYmFjay4KKyAgICAgICAgICAgICAgICBpZiAoICgiR0VUIi5lcXVhbHMocmVxdWVzdC5nZXRNZXRob2QoKSkpCisgICAgICAgICAgICAgICAgICAgICB8fCAoIkhFQUQiLmVxdWFscyhyZXF1ZXN0LmdldE1ldGhvZCgpKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9NT0RJRklFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiRVRhZyIsIGdldEVUYWcocmVzb3VyY2VBdHRyaWJ1dGVzKSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfUFJFQ09ORElUSU9OX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBpZi11bm1vZGlmaWVkLXNpbmNlIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSByZXNvdXJjZUluZm8gRmlsZSBvYmplY3QKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgbWVldHMgdGhlIHNwZWNpZmllZCBjb25kaXRpb24sCisgICAgICogYW5kIGZhbHNlIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IHNhdGlzZmllZCwgaW4gd2hpY2ggY2FzZSByZXF1ZXN0CisgICAgICogcHJvY2Vzc2luZyBpcyBzdG9wcGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tJZlVubW9kaWZpZWRTaW5jZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IHJlc291cmNlQXR0cmlidXRlcy5nZXRMYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIGxvbmcgaGVhZGVyVmFsdWUgPSByZXF1ZXN0LmdldERhdGVIZWFkZXIoIklmLVVubW9kaWZpZWQtU2luY2UiKTsKKyAgICAgICAgICAgIGlmIChoZWFkZXJWYWx1ZSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGlmICggbGFzdE1vZGlmaWVkID49IChoZWFkZXJWYWx1ZSArIDEwMDApKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlbnRpdHkgaGFzIG5vdCBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBkYXRlCisgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBieSB0aGUgY2xpZW50LiBUaGlzIGlzIG5vdCBhbiBlcnJvciBjYXNlLgorICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19QUkVDT05ESVRJT05fRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWxsZWdhbEFyZ3VtZW50KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29weSB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZAorICAgICAqIG91dHB1dCBzdHJlYW0sIGFuZCBlbnN1cmUgdGhhdCBib3RoIHN0cmVhbXMgYXJlIGNsb3NlZCBiZWZvcmUgcmV0dXJuaW5nCisgICAgICogKGV2ZW4gaW4gdGhlIGZhY2Ugb2YgYW4gZXhjZXB0aW9uKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUluZm8gVGhlIHJlc291cmNlIGluZm9ybWF0aW9uCisgICAgICogQHBhcmFtIG9zdHJlYW0gVGhlIG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgdG8KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNvcHkoQ2FjaGVFbnRyeSBjYWNoZUVudHJ5LCBJbnB1dFN0cmVhbSBpcywKKyAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0T3V0cHV0U3RyZWFtIG9zdHJlYW0pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgSU9FeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgSW5wdXRTdHJlYW0gcmVzb3VyY2VJbnB1dFN0cmVhbSA9IG51bGw7CisKKyAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBJZiB0aGUgYmluYXJ5IGNvbnRlbnQgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQsIHNlbmQKKyAgICAgICAgLy8gaXQgZGlyZWN0bHkKKyAgICAgICAgaWYgKGNhY2hlRW50cnkucmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgYnl0ZSBidWZmZXJbXSA9IGNhY2hlRW50cnkucmVzb3VyY2UuZ2V0Q29udGVudCgpOworICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3N0cmVhbS53cml0ZShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc291cmNlSW5wdXRTdHJlYW0gPSBjYWNoZUVudHJ5LnJlc291cmNlLnN0cmVhbUNvbnRlbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc291cmNlSW5wdXRTdHJlYW0gPSBpczsKKyAgICAgICAgfQorCisgICAgICAgIElucHV0U3RyZWFtIGlzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbQorICAgICAgICAgICAgKHJlc291cmNlSW5wdXRTdHJlYW0sIGlucHV0KTsKKworICAgICAgICAvLyBDb3B5IHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgZXhjZXB0aW9uID0gY29weVJhbmdlKGlzdHJlYW0sIG9zdHJlYW0pOworCisgICAgICAgIC8vIENsZWFuIHVwIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiRGVmYXVsdFNlcnZsZXQuY29weTogZXhjZXB0aW9uIGNsb3NpbmcgaW5wdXQgc3RyZWFtOiAiCisgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXRocm93IGFueSBleGNlcHRpb24gdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBvdXRwdXQgc3RyZWFtLCBhbmQgZW5zdXJlIHRoYXQgYm90aCBzdHJlYW1zIGFyZSBjbG9zZWQgYmVmb3JlIHJldHVybmluZworICAgICAqIChldmVuIGluIHRoZSBmYWNlIG9mIGFuIGV4Y2VwdGlvbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VJbmZvIFRoZSByZXNvdXJjZSBpbmZvCisgICAgICogQHBhcmFtIHdyaXRlciBUaGUgd3JpdGVyIHRvIHdyaXRlIHRvCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5KENhY2hlRW50cnkgY2FjaGVFbnRyeSwgSW5wdXRTdHJlYW0gaXMsIFByaW50V3JpdGVyIHdyaXRlcikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBJT0V4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworCisgICAgICAgIElucHV0U3RyZWFtIHJlc291cmNlSW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICBpZiAoY2FjaGVFbnRyeS5yZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZUlucHV0U3RyZWFtID0gY2FjaGVFbnRyeS5yZXNvdXJjZS5zdHJlYW1Db250ZW50KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNvdXJjZUlucHV0U3RyZWFtID0gaXM7CisgICAgICAgIH0KKworICAgICAgICBSZWFkZXIgcmVhZGVyOworICAgICAgICBpZiAoZmlsZUVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyZXNvdXJjZUlucHV0U3RyZWFtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyZXNvdXJjZUlucHV0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVFbmNvZGluZyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3B5IHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgZXhjZXB0aW9uID0gY29weVJhbmdlKHJlYWRlciwgd3JpdGVyKTsKKworICAgICAgICAvLyBDbGVhbiB1cCB0aGUgcmVhZGVyCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiRGVmYXVsdFNlcnZsZXQuY29weTogZXhjZXB0aW9uIGNsb3NpbmcgcmVhZGVyOiAiCisgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXRocm93IGFueSBleGNlcHRpb24gdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBvdXRwdXQgc3RyZWFtLCBhbmQgZW5zdXJlIHRoYXQgYm90aCBzdHJlYW1zIGFyZSBjbG9zZWQgYmVmb3JlIHJldHVybmluZworICAgICAqIChldmVuIGluIHRoZSBmYWNlIG9mIGFuIGV4Y2VwdGlvbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VJbmZvIFRoZSBSZXNvdXJjZUluZm8gb2JqZWN0CisgICAgICogQHBhcmFtIG9zdHJlYW0gVGhlIG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgdG8KKyAgICAgKiBAcGFyYW0gcmFuZ2UgUmFuZ2UgdGhlIGNsaWVudCB3YW50ZWQgdG8gcmV0cmlldmUKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5KENhY2hlRW50cnkgY2FjaGVFbnRyeSwgU2VydmxldE91dHB1dFN0cmVhbSBvc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIFJhbmdlIHJhbmdlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIElPRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gcmVzb3VyY2VJbnB1dFN0cmVhbSA9IGNhY2hlRW50cnkucmVzb3VyY2Uuc3RyZWFtQ29udGVudCgpOworICAgICAgICBJbnB1dFN0cmVhbSBpc3RyZWFtID0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHJlc291cmNlSW5wdXRTdHJlYW0sIGlucHV0KTsKKyAgICAgICAgZXhjZXB0aW9uID0gY29weVJhbmdlKGlzdHJlYW0sIG9zdHJlYW0sIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpOworCisgICAgICAgIC8vIENsZWFuIHVwIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiRGVmYXVsdFNlcnZsZXQuY29weTogZXhjZXB0aW9uIGNsb3NpbmcgaW5wdXQgc3RyZWFtOiAiCisgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXRocm93IGFueSBleGNlcHRpb24gdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBvdXRwdXQgc3RyZWFtLCBhbmQgZW5zdXJlIHRoYXQgYm90aCBzdHJlYW1zIGFyZSBjbG9zZWQgYmVmb3JlIHJldHVybmluZworICAgICAqIChldmVuIGluIHRoZSBmYWNlIG9mIGFuIGV4Y2VwdGlvbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VJbmZvIFRoZSBSZXNvdXJjZUluZm8gb2JqZWN0CisgICAgICogQHBhcmFtIHdyaXRlciBUaGUgd3JpdGVyIHRvIHdyaXRlIHRvCisgICAgICogQHBhcmFtIHJhbmdlIFJhbmdlIHRoZSBjbGllbnQgd2FudGVkIHRvIHJldHJpZXZlCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY29weShDYWNoZUVudHJ5IGNhY2hlRW50cnksIFByaW50V3JpdGVyIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICBSYW5nZSByYW5nZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBJT0V4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworCisgICAgICAgIElucHV0U3RyZWFtIHJlc291cmNlSW5wdXRTdHJlYW0gPSBjYWNoZUVudHJ5LnJlc291cmNlLnN0cmVhbUNvbnRlbnQoKTsKKworICAgICAgICBSZWFkZXIgcmVhZGVyOworICAgICAgICBpZiAoZmlsZUVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyZXNvdXJjZUlucHV0U3RyZWFtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyZXNvdXJjZUlucHV0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVFbmNvZGluZyk7CisgICAgICAgIH0KKworICAgICAgICBleGNlcHRpb24gPSBjb3B5UmFuZ2UocmVhZGVyLCB3cml0ZXIsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpOworCisgICAgICAgIC8vIENsZWFuIHVwIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKCJEZWZhdWx0U2VydmxldC5jb3B5OiBleGNlcHRpb24gY2xvc2luZyByZWFkZXI6ICIKKyAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldGhyb3cgYW55IGV4Y2VwdGlvbiB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29weSB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZAorICAgICAqIG91dHB1dCBzdHJlYW0sIGFuZCBlbnN1cmUgdGhhdCBib3RoIHN0cmVhbXMgYXJlIGNsb3NlZCBiZWZvcmUgcmV0dXJuaW5nCisgICAgICogKGV2ZW4gaW4gdGhlIGZhY2Ugb2YgYW4gZXhjZXB0aW9uKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUluZm8gVGhlIFJlc291cmNlSW5mbyBvYmplY3QKKyAgICAgKiBAcGFyYW0gb3N0cmVhbSBUaGUgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0bworICAgICAqIEBwYXJhbSByYW5nZXMgRW51bWVyYXRpb24gb2YgdGhlIHJhbmdlcyB0aGUgY2xpZW50IHdhbnRlZCB0byByZXRyaWV2ZQorICAgICAqIEBwYXJhbSBjb250ZW50VHlwZSBDb250ZW50IHR5cGUgb2YgdGhlIHJlc291cmNlCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY29weShDYWNoZUVudHJ5IGNhY2hlRW50cnksIFNlcnZsZXRPdXRwdXRTdHJlYW0gb3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciByYW5nZXMsIFN0cmluZyBjb250ZW50VHlwZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBJT0V4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworCisgICAgICAgIHdoaWxlICggKGV4Y2VwdGlvbiA9PSBudWxsKSAmJiAocmFuZ2VzLmhhc05leHQoKSkgKSB7CisKKyAgICAgICAgICAgIElucHV0U3RyZWFtIHJlc291cmNlSW5wdXRTdHJlYW0gPSBjYWNoZUVudHJ5LnJlc291cmNlLnN0cmVhbUNvbnRlbnQoKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGlzdHJlYW0gPQorICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHJlc291cmNlSW5wdXRTdHJlYW0sIGlucHV0KTsKKworICAgICAgICAgICAgUmFuZ2UgY3VycmVudFJhbmdlID0gKFJhbmdlKSByYW5nZXMubmV4dCgpOworCisgICAgICAgICAgICAvLyBXcml0aW5nIE1JTUUgaGVhZGVyLgorICAgICAgICAgICAgb3N0cmVhbS5wcmludGxuKCk7CisgICAgICAgICAgICBvc3RyZWFtLnByaW50bG4oIi0tIiArIG1pbWVTZXBhcmF0aW9uKTsKKyAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIG9zdHJlYW0ucHJpbnRsbigiQ29udGVudC1UeXBlOiAiICsgY29udGVudFR5cGUpOworICAgICAgICAgICAgb3N0cmVhbS5wcmludGxuKCJDb250ZW50LVJhbmdlOiBieXRlcyAiICsgY3VycmVudFJhbmdlLnN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICArICItIiArIGN1cnJlbnRSYW5nZS5lbmQgKyAiLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY3VycmVudFJhbmdlLmxlbmd0aCk7CisgICAgICAgICAgICBvc3RyZWFtLnByaW50bG4oKTsKKworICAgICAgICAgICAgLy8gUHJpbnRpbmcgY29udGVudAorICAgICAgICAgICAgZXhjZXB0aW9uID0gY29weVJhbmdlKGlzdHJlYW0sIG9zdHJlYW0sIGN1cnJlbnRSYW5nZS5zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmFuZ2UuZW5kKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZygiRGVmYXVsdFNlcnZsZXQuY29weTogZXhjZXB0aW9uIGNsb3NpbmcgaW5wdXQgc3RyZWFtOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBvc3RyZWFtLnByaW50bG4oKTsKKyAgICAgICAgb3N0cmVhbS5wcmludCgiLS0iICsgbWltZVNlcGFyYXRpb24gKyAiLS0iKTsKKworICAgICAgICAvLyBSZXRocm93IGFueSBleGNlcHRpb24gdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBvdXRwdXQgc3RyZWFtLCBhbmQgZW5zdXJlIHRoYXQgYm90aCBzdHJlYW1zIGFyZSBjbG9zZWQgYmVmb3JlIHJldHVybmluZworICAgICAqIChldmVuIGluIHRoZSBmYWNlIG9mIGFuIGV4Y2VwdGlvbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VJbmZvIFRoZSBSZXNvdXJjZUluZm8gb2JqZWN0CisgICAgICogQHBhcmFtIHdyaXRlciBUaGUgd3JpdGVyIHRvIHdyaXRlIHRvCisgICAgICogQHBhcmFtIHJhbmdlcyBFbnVtZXJhdGlvbiBvZiB0aGUgcmFuZ2VzIHRoZSBjbGllbnQgd2FudGVkIHRvIHJldHJpZXZlCisgICAgICogQHBhcmFtIGNvbnRlbnRUeXBlIENvbnRlbnQgdHlwZSBvZiB0aGUgcmVzb3VyY2UKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5KENhY2hlRW50cnkgY2FjaGVFbnRyeSwgUHJpbnRXcml0ZXIgd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHJhbmdlcywgU3RyaW5nIGNvbnRlbnRUeXBlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIElPRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisKKyAgICAgICAgd2hpbGUgKCAoZXhjZXB0aW9uID09IG51bGwpICYmIChyYW5nZXMuaGFzTmV4dCgpKSApIHsKKworICAgICAgICAgICAgSW5wdXRTdHJlYW0gcmVzb3VyY2VJbnB1dFN0cmVhbSA9IGNhY2hlRW50cnkucmVzb3VyY2Uuc3RyZWFtQ29udGVudCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBSZWFkZXIgcmVhZGVyOworICAgICAgICAgICAgaWYgKGZpbGVFbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHJlc291cmNlSW5wdXRTdHJlYW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVzb3VyY2VJbnB1dFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUVuY29kaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUmFuZ2UgY3VycmVudFJhbmdlID0gKFJhbmdlKSByYW5nZXMubmV4dCgpOworCisgICAgICAgICAgICAvLyBXcml0aW5nIE1JTUUgaGVhZGVyLgorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCItLSIgKyBtaW1lU2VwYXJhdGlvbik7CisgICAgICAgICAgICBpZiAoY29udGVudFR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQ29udGVudC1UeXBlOiAiICsgY29udGVudFR5cGUpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkNvbnRlbnQtUmFuZ2U6IGJ5dGVzICIgKyBjdXJyZW50UmFuZ2Uuc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi0iICsgY3VycmVudFJhbmdlLmVuZCArICIvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50UmFuZ2UubGVuZ3RoKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCk7CisKKyAgICAgICAgICAgIC8vIFByaW50aW5nIGNvbnRlbnQKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGNvcHlSYW5nZShyZWFkZXIsIHdyaXRlciwgY3VycmVudFJhbmdlLnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSYW5nZS5lbmQpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2coIkRlZmF1bHRTZXJ2bGV0LmNvcHk6IGV4Y2VwdGlvbiBjbG9zaW5nIHJlYWRlcjogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCItLSIgKyBtaW1lU2VwYXJhdGlvbiArICItLSIpOworCisgICAgICAgIC8vIFJldGhyb3cgYW55IGV4Y2VwdGlvbiB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29weSB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZAorICAgICAqIG91dHB1dCBzdHJlYW0sIGFuZCBlbnN1cmUgdGhhdCBib3RoIHN0cmVhbXMgYXJlIGNsb3NlZCBiZWZvcmUgcmV0dXJuaW5nCisgICAgICogKGV2ZW4gaW4gdGhlIGZhY2Ugb2YgYW4gZXhjZXB0aW9uKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpc3RyZWFtIFRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tCisgICAgICogQHBhcmFtIG9zdHJlYW0gVGhlIG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgdG8KKyAgICAgKiBAcmV0dXJuIEV4Y2VwdGlvbiB3aGljaCBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZworICAgICAqLworICAgIHByb3RlY3RlZCBJT0V4Y2VwdGlvbiBjb3B5UmFuZ2UoSW5wdXRTdHJlYW0gaXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0T3V0cHV0U3RyZWFtIG9zdHJlYW0pIHsKKworICAgICAgICAvLyBDb3B5IHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgSU9FeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgYnl0ZSBidWZmZXJbXSA9IG5ldyBieXRlW2lucHV0XTsKKyAgICAgICAgaW50IGxlbiA9IGJ1ZmZlci5sZW5ndGg7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxlbiA9IGlzdHJlYW0ucmVhZChidWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG9zdHJlYW0ud3JpdGUoYnVmZmVyLCAwLCBsZW4pOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICAgICAgbGVuID0gLTE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29weSB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZAorICAgICAqIG91dHB1dCBzdHJlYW0sIGFuZCBlbnN1cmUgdGhhdCBib3RoIHN0cmVhbXMgYXJlIGNsb3NlZCBiZWZvcmUgcmV0dXJuaW5nCisgICAgICogKGV2ZW4gaW4gdGhlIGZhY2Ugb2YgYW4gZXhjZXB0aW9uKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFkZXIgVGhlIHJlYWRlciB0byByZWFkIGZyb20KKyAgICAgKiBAcGFyYW0gd3JpdGVyIFRoZSB3cml0ZXIgdG8gd3JpdGUgdG8KKyAgICAgKiBAcmV0dXJuIEV4Y2VwdGlvbiB3aGljaCBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZworICAgICAqLworICAgIHByb3RlY3RlZCBJT0V4Y2VwdGlvbiBjb3B5UmFuZ2UoUmVhZGVyIHJlYWRlciwgUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisKKyAgICAgICAgLy8gQ29weSB0aGUgaW5wdXQgc3RyZWFtIHRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgIElPRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIGNoYXIgYnVmZmVyW10gPSBuZXcgY2hhcltpbnB1dF07CisgICAgICAgIGludCBsZW4gPSBidWZmZXIubGVuZ3RoOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsZW4gPSByZWFkZXIucmVhZChidWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShidWZmZXIsIDAsIGxlbik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICBsZW4gPSAtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhjZXB0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbSB0byB0aGUgc3BlY2lmaWVkCisgICAgICogb3V0cHV0IHN0cmVhbSwgYW5kIGVuc3VyZSB0aGF0IGJvdGggc3RyZWFtcyBhcmUgY2xvc2VkIGJlZm9yZSByZXR1cm5pbmcKKyAgICAgKiAoZXZlbiBpbiB0aGUgZmFjZSBvZiBhbiBleGNlcHRpb24pLgorICAgICAqCisgICAgICogQHBhcmFtIGlzdHJlYW0gVGhlIGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20KKyAgICAgKiBAcGFyYW0gb3N0cmVhbSBUaGUgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0bworICAgICAqIEBwYXJhbSBzdGFydCBTdGFydCBvZiB0aGUgcmFuZ2Ugd2hpY2ggd2lsbCBiZSBjb3BpZWQKKyAgICAgKiBAcGFyYW0gZW5kIEVuZCBvZiB0aGUgcmFuZ2Ugd2hpY2ggd2lsbCBiZSBjb3BpZWQKKyAgICAgKiBAcmV0dXJuIEV4Y2VwdGlvbiB3aGljaCBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZworICAgICAqLworICAgIHByb3RlY3RlZCBJT0V4Y2VwdGlvbiBjb3B5UmFuZ2UoSW5wdXRTdHJlYW0gaXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0T3V0cHV0U3RyZWFtIG9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKKworICAgICAgICBpZiAoZGVidWcgPiAxMCkKKyAgICAgICAgICAgIGxvZygiU2VydmluZyBieXRlczoiICsgc3RhcnQgKyAiLSIgKyBlbmQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpc3RyZWFtLnNraXAoc3RhcnQpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAgfQorCisgICAgICAgIElPRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIGxvbmcgYnl0ZXNUb1JlYWQgPSBlbmQgLSBzdGFydCArIDE7CisKKyAgICAgICAgYnl0ZSBidWZmZXJbXSA9IG5ldyBieXRlW2lucHV0XTsKKyAgICAgICAgaW50IGxlbiA9IGJ1ZmZlci5sZW5ndGg7CisgICAgICAgIHdoaWxlICggKGJ5dGVzVG9SZWFkID4gMCkgJiYgKGxlbiA+PSBidWZmZXIubGVuZ3RoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsZW4gPSBpc3RyZWFtLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXNUb1JlYWQgPj0gbGVuKSB7CisgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0ud3JpdGUoYnVmZmVyLCAwLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBieXRlc1RvUmVhZCAtPSBsZW47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3N0cmVhbS53cml0ZShidWZmZXIsIDAsIChpbnQpIGJ5dGVzVG9SZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXNUb1JlYWQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICAgICAgICAgIGxlbiA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxlbiA8IGJ1ZmZlci5sZW5ndGgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZXhjZXB0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbSB0byB0aGUgc3BlY2lmaWVkCisgICAgICogb3V0cHV0IHN0cmVhbSwgYW5kIGVuc3VyZSB0aGF0IGJvdGggc3RyZWFtcyBhcmUgY2xvc2VkIGJlZm9yZSByZXR1cm5pbmcKKyAgICAgKiAoZXZlbiBpbiB0aGUgZmFjZSBvZiBhbiBleGNlcHRpb24pLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlciBUaGUgcmVhZGVyIHRvIHJlYWQgZnJvbQorICAgICAqIEBwYXJhbSB3cml0ZXIgVGhlIHdyaXRlciB0byB3cml0ZSB0bworICAgICAqIEBwYXJhbSBzdGFydCBTdGFydCBvZiB0aGUgcmFuZ2Ugd2hpY2ggd2lsbCBiZSBjb3BpZWQKKyAgICAgKiBAcGFyYW0gZW5kIEVuZCBvZiB0aGUgcmFuZ2Ugd2hpY2ggd2lsbCBiZSBjb3BpZWQKKyAgICAgKiBAcmV0dXJuIEV4Y2VwdGlvbiB3aGljaCBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZworICAgICAqLworICAgIHByb3RlY3RlZCBJT0V4Y2VwdGlvbiBjb3B5UmFuZ2UoUmVhZGVyIHJlYWRlciwgUHJpbnRXcml0ZXIgd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQsIGxvbmcgZW5kKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5za2lwKHN0YXJ0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGU7CisgICAgICAgIH0KKworICAgICAgICBJT0V4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworICAgICAgICBsb25nIGJ5dGVzVG9SZWFkID0gZW5kIC0gc3RhcnQgKyAxOworCisgICAgICAgIGNoYXIgYnVmZmVyW10gPSBuZXcgY2hhcltpbnB1dF07CisgICAgICAgIGludCBsZW4gPSBidWZmZXIubGVuZ3RoOworICAgICAgICB3aGlsZSAoIChieXRlc1RvUmVhZCA+IDApICYmIChsZW4gPj0gYnVmZmVyLmxlbmd0aCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbGVuID0gcmVhZGVyLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXNUb1JlYWQgPj0gbGVuKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShidWZmZXIsIDAsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzVG9SZWFkIC09IGxlbjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoYnVmZmVyLCAwLCAoaW50KSBieXRlc1RvUmVhZCk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzVG9SZWFkID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICBsZW4gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZW4gPCBidWZmZXIubGVuZ3RoKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKKworICAgIH0KKworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmFuZ2UgSW5uZXIgQ2xhc3MKKworCisgICAgcHJvdGVjdGVkIGNsYXNzIFJhbmdlIHsKKworICAgICAgICBwdWJsaWMgbG9uZyBzdGFydDsKKyAgICAgICAgcHVibGljIGxvbmcgZW5kOworICAgICAgICBwdWJsaWMgbG9uZyBsZW5ndGg7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZhbGlkYXRlIHJhbmdlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7CisgICAgICAgICAgICBpZiAoZW5kID49IGxlbmd0aCkKKyAgICAgICAgICAgICAgICBlbmQgPSBsZW5ndGggLSAxOworICAgICAgICAgICAgcmV0dXJuICggKHN0YXJ0ID49IDApICYmIChlbmQgPj0gMCkgJiYgKHN0YXJ0IDw9IGVuZCkKKyAgICAgICAgICAgICAgICAgICAgICYmIChsZW5ndGggPiAwKSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgICAgIGVuZCA9IDA7CisgICAgICAgICAgICBsZW5ndGggPSAwOworICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0ludm9rZXJIdHRwUmVxdWVzdC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0ludm9rZXJIdHRwUmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZjE0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvSW52b2tlckh0dHBSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zZXJ2bGV0czsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcjsKKworCisvKioKKyAqIFdyYXBwZXIgYXJvdW5kIGEgPGNvZGU+amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDwvY29kZT4KKyAqIHV0aWxpemVkIHdoZW4gPGNvZGU+SW52b2tlclNlcnZsZXQ8L2NvZGU+IHByb2Nlc3NlcyB0aGUgaW5pdGlhbCByZXF1ZXN0CisgKiBmb3IgYW4gaW52b2tlZCBzZXJ2bGV0LiAgU3Vic2VxdWVudCByZXF1ZXN0cyB3aWxsIGJlIG1hcHBlZCBkaXJlY3RseQorICogdG8gdGhlIHNlcnZsZXQsIGJlY2F1c2UgYSBuZXcgc2VydmxldCBtYXBwaW5nIHdpbGwgaGF2ZSBiZWVuIGNyZWF0ZWQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK2NsYXNzIEludm9rZXJIdHRwUmVxdWVzdCBleHRlbmRzIEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHdyYXBwZWQgcmVxdWVzdCBhcm91bmQgdGhlIHNwZWNpZmllZCBzZXJ2bGV0IHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IGJlaW5nIHdyYXBwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgSW52b2tlckh0dHBSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIocmVxdWVzdCk7CisgICAgICAgIHRoaXMucGF0aEluZm8gPSByZXF1ZXN0LmdldFBhdGhJbmZvKCk7CisgICAgICAgIHRoaXMucGF0aFRyYW5zbGF0ZWQgPSByZXF1ZXN0LmdldFBhdGhUcmFuc2xhdGVkKCk7CisgICAgICAgIHRoaXMucmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworICAgICAgICB0aGlzLnNlcnZsZXRQYXRoID0gcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc2VydmxldHMuSW52b2tlckh0dHBSZXF1ZXN0LzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBwYXRoIGluZm9ybWF0aW9uIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXRoSW5mbyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSB0cmFuc2xhdGVkIHBhdGggaW5mb3JtYXRpb24gZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGhUcmFuc2xhdGVkID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgVVJJIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByZXF1ZXN0VVJJID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZsZXQgcGF0aCBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc2VydmxldFBhdGggPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSHR0cFNlcnZsZXRSZXF1ZXN0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPmdldFBhdGhJbmZvKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgd3JhcHBlZCByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhdGhJbmZvKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPmdldFBhdGhUcmFuc2xhdGVkKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUKKyAgICAgKiB3cmFwcGVkIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoVHJhbnNsYXRlZCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucGF0aFRyYW5zbGF0ZWQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGUgPGNvZGU+Z2V0UmVxdWVzdFVSSSgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIHdyYXBwZWQgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RVUkkoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlcXVlc3RVUkkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGUgPGNvZGU+Z2V0U2VydmxldFBhdGgoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSB3cmFwcGVkCisgICAgICogcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRQYXRoKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5zZXJ2bGV0UGF0aCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggaW5mb3JtYXRpb24gZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoSW5mbyBUaGUgbmV3IHBhdGggaW5mbworICAgICAqLworICAgIHZvaWQgc2V0UGF0aEluZm8oU3RyaW5nIHBhdGhJbmZvKSB7CisKKyAgICAgICAgdGhpcy5wYXRoSW5mbyA9IHBhdGhJbmZvOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRyYW5zbGF0ZWQgcGF0aCBpbmZvIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aFRyYW5zbGF0ZWQgVGhlIG5ldyB0cmFuc2xhdGVkIHBhdGggaW5mbworICAgICAqLworICAgIHZvaWQgc2V0UGF0aFRyYW5zbGF0ZWQoU3RyaW5nIHBhdGhUcmFuc2xhdGVkKSB7CisKKyAgICAgICAgdGhpcy5wYXRoVHJhbnNsYXRlZCA9IHBhdGhUcmFuc2xhdGVkOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlcXVlc3QgVVJJIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdFVSSSBUaGUgbmV3IHJlcXVlc3QgVVJJCisgICAgICovCisgICAgdm9pZCBzZXRSZXF1ZXN0VVJJKFN0cmluZyByZXF1ZXN0VVJJKSB7CisKKyAgICAgICAgdGhpcy5yZXF1ZXN0VVJJID0gcmVxdWVzdFVSSTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZXJ2bGV0IHBhdGggZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2bGV0UGF0aCBUaGUgbmV3IHNlcnZsZXQgcGF0aAorICAgICAqLworICAgIHZvaWQgc2V0U2VydmxldFBhdGgoU3RyaW5nIHNlcnZsZXRQYXRoKSB7CisKKyAgICAgICAgdGhpcy5zZXJ2bGV0UGF0aCA9IHNlcnZsZXRQYXRoOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9JbnZva2VyU2VydmxldC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0ludm9rZXJTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkNDQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9JbnZva2VyU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsNDk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VydmxldHM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lclNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLldyYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CisKKworLyoqCisgKiBUaGUgZGVmYXVsdCBzZXJ2bGV0LWludm9raW5nIHNlcnZsZXQgZm9yIG1vc3Qgd2ViIGFwcGxpY2F0aW9ucywKKyAqIHVzZWQgdG8gc2VydmUgcmVxdWVzdHMgdG8gc2VydmxldHMgdGhhdCBoYXZlIG5vdCBiZWVuIHJlZ2lzdGVyZWQKKyAqIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgSW52b2tlclNlcnZsZXQKKyAgICBleHRlbmRzIEh0dHBTZXJ2bGV0IGltcGxlbWVudHMgQ29udGFpbmVyU2VydmxldCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29udGV4dCBjb250YWluZXIgYXNzb2NpYXRlZCB3aXRoIG91ciB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBDb250ZXh0IGNvbnRleHQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVidWdnaW5nIGRldGFpbCBsZXZlbCBmb3IgdGhpcyBzZXJ2bGV0LgorICAgICAqLworICAgIHByaXZhdGUgaW50IGRlYnVnID0gMDsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBXcmFwcGVyIGNvbnRhaW5lciBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2bGV0LgorICAgICAqLworICAgIHByaXZhdGUgV3JhcHBlciB3cmFwcGVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29udGFpbmVyU2VydmxldCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgV3JhcHBlciB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBXcmFwcGVyIGdldFdyYXBwZXIoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLndyYXBwZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFdyYXBwZXIgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cmFwcGVyIFRoZSBuZXcgd3JhcHBlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdyYXBwZXIoV3JhcHBlciB3cmFwcGVyKSB7CisKKyAgICAgICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKKyAgICAgICAgaWYgKHdyYXBwZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGNvbnRleHQgPSBudWxsOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb250ZXh0ID0gKENvbnRleHQpIHdyYXBwZXIuZ2V0UGFyZW50KCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBGaW5hbGl6ZSB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKworICAgICAgICA7ICAgICAgIC8vIE5vIGFjdGlvbnMgbmVjZXNzYXJ5CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBHRVQgcmVxdWVzdCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmllZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHNlcnZlUmVxdWVzdChyZXF1ZXN0LCByZXNwb25zZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBIRUFEIHJlcXVlc3QgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldC1zcGVjaWZpZWQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9IZWFkKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHNlcnZlUmVxdWVzdChyZXF1ZXN0LCByZXNwb25zZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBQT1NUIHJlcXVlc3QgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldC1zcGVjaWZpZWQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHNlcnZlUmVxdWVzdChyZXF1ZXN0LCByZXNwb25zZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhpcyBzZXJ2bGV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgb3VyIENvbnRhaW5lclNlcnZsZXQgcHJvcGVydGllcyBoYXZlIGJlZW4gc2V0CisgICAgICAgIGlmICgod3JhcHBlciA9PSBudWxsKSB8fCAoY29udGV4dCA9PSBudWxsKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbmF2YWlsYWJsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImludm9rZXJTZXJ2bGV0Lm5vV3JhcHBlciIpKTsKKworICAgICAgICAvLyBTZXQgb3VyIHByb3BlcnRpZXMgZnJvbSB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycworICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsdWUgPSBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0SW5pdFBhcmFtZXRlcigiZGVidWciKTsKKyAgICAgICAgICAgIGRlYnVnID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICBsb2coImluaXQ6IEFzc29jaWF0ZWQgd2l0aCBDb250ZXh0ICciICsgY29udGV4dC5nZXRQYXRoKCkgKyAiJyIpOworCisgICAgfQorCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTZXJ2ZSB0aGUgc3BlY2lmaWVkIHJlcXVlc3QsIGNyZWF0aW5nIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLgorICAgICAqIEFmdGVyIHRoZSBmaXJzdCB0aW1lIGEgcGFydGljdWxhciBzZXJ2bGV0IGNsYXNzIGlzIHJlcXVlc3RlZCwgaXQgd2lsbAorICAgICAqIGJlIHNlcnZlZCBkaXJlY3RseSAobGlrZSBhbnkgcmVnaXN0ZXJlZCBzZXJ2bGV0KSBiZWNhdXNlIGl0IHdpbGwgaGF2ZQorICAgICAqIGJlZW4gcmVnaXN0ZXJlZCBhbmQgbWFwcGVkIGluIG91ciBhc3NvY2lhdGVkIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldC1zcGVjaWZpZWQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VydmVSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIERpc2FsbG93IGNhbGxpbmcgdGhpcyBzZXJ2bGV0IHZpYSBhIG5hbWVkIGRpc3BhdGNoZXIKKyAgICAgICAgaWYgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKEdsb2JhbHMuTkFNRURfRElTUEFUQ0hFUl9BVFRSKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJpbnZva2VyU2VydmxldC5ub3ROYW1lZCIpKTsKKworICAgICAgICAvLyBJZGVudGlmeSB0aGUgaW5wdXQgcGFyYW1ldGVycyBhbmQgb3VyICJpbmNsdWRlZCIgc3RhdGUKKyAgICAgICAgU3RyaW5nIGluUmVxdWVzdFVSSSA9IG51bGw7CisgICAgICAgIFN0cmluZyBpblNlcnZsZXRQYXRoID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGluUGF0aEluZm8gPSBudWxsOworICAgICAgICBib29sZWFuIGluY2x1ZGVkID0KKyAgICAgICAgICAgIChyZXF1ZXN0LmdldEF0dHJpYnV0ZShHbG9iYWxzLklOQ0xVREVfUkVRVUVTVF9VUklfQVRUUikgIT0gbnVsbCk7CisKKyAgICAgICAgaWYgKGluY2x1ZGVkKSB7CisgICAgICAgICAgICBpblJlcXVlc3RVUkkgPQorICAgICAgICAgICAgICAgIChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKEdsb2JhbHMuSU5DTFVERV9SRVFVRVNUX1VSSV9BVFRSKTsKKyAgICAgICAgICAgIGluU2VydmxldFBhdGggPQorICAgICAgICAgICAgICAgIChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKEdsb2JhbHMuSU5DTFVERV9TRVJWTEVUX1BBVEhfQVRUUik7CisgICAgICAgICAgICBpblBhdGhJbmZvID0KKyAgICAgICAgICAgICAgICAoU3RyaW5nKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShHbG9iYWxzLklOQ0xVREVfUEFUSF9JTkZPX0FUVFIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5SZXF1ZXN0VVJJID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisgICAgICAgICAgICBpblNlcnZsZXRQYXRoID0gcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpOworICAgICAgICAgICAgaW5QYXRoSW5mbyA9IHJlcXVlc3QuZ2V0UGF0aEluZm8oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVidWcgPj0gMSkgeworICAgICAgICAgICAgbG9nKCJpbmNsdWRlZD0nIiArIGluY2x1ZGVkICsgIicsIHJlcXVlc3RVUkk9JyIgKworICAgICAgICAgICAgICAgIGluUmVxdWVzdFVSSSArICInIik7CisgICAgICAgICAgICBsb2coIiAgc2VydmxldFBhdGg9JyIgKyBpblNlcnZsZXRQYXRoICsgIicsIHBhdGhJbmZvPSciICsKKyAgICAgICAgICAgICAgICBpblBhdGhJbmZvICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1ha2Ugc3VyZSBhIHNlcnZsZXQgbmFtZSBvciBjbGFzcyBuYW1lIHdhcyBzcGVjaWZpZWQKKyAgICAgICAgaWYgKGluUGF0aEluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICAgICAgbG9nKCJJbnZhbGlkIHBhdGhJbmZvICciICsgaW5QYXRoSW5mbyArICInIik7CisgICAgICAgICAgICBpZiAoaW5jbHVkZWQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiaW52b2tlclNlcnZsZXQuaW52YWxpZFBhdGgiLCBpblJlcXVlc3RVUkkpKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZXF1ZXN0VVJJKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZGVudGlmeSB0aGUgb3V0Z29pbmcgc2VydmxldCBuYW1lIG9yIGNsYXNzLCBhbmQgb3V0Z29pbmcgcGF0aCBpbmZvCisgICAgICAgIFN0cmluZyBwYXRoSW5mbyA9IGluUGF0aEluZm87CisgICAgICAgIFN0cmluZyBzZXJ2bGV0Q2xhc3MgPSBwYXRoSW5mby5zdWJzdHJpbmcoMSk7CisgICAgICAgIGludCBzbGFzaCA9IHNlcnZsZXRDbGFzcy5pbmRleE9mKCcvJyk7CisgICAgICAgIC8vICAgICAgICBpZiAoZGVidWcgPj0gMikKKyAgICAgICAgLy8gICAgICAgICAgICBsb2coIiAgQ2FsY3VsYXRpbmcgd2l0aCBzZXJ2bGV0Q2xhc3M9JyIgKyBzZXJ2bGV0Q2xhc3MgKworICAgICAgICAvLyAgICAgICAgICAgICAgICAiJywgcGF0aEluZm89JyIgKyBwYXRoSW5mbyArICInLCBzbGFzaD0iICsgc2xhc2gpOworICAgICAgICBpZiAoc2xhc2ggPj0gMCkgeworICAgICAgICAgICAgcGF0aEluZm8gPSBzZXJ2bGV0Q2xhc3Muc3Vic3RyaW5nKHNsYXNoKTsKKyAgICAgICAgICAgIHNlcnZsZXRDbGFzcyA9IHNlcnZsZXRDbGFzcy5zdWJzdHJpbmcoMCwgc2xhc2gpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGF0aEluZm8gPSAiIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXJ2bGV0Q2xhc3Muc3RhcnRzV2l0aCgib3JnLmFwYWNoZS5jYXRhbGluYSIpKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZXF1ZXN0VVJJKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgbG9nKCJQcm9jZXNzaW5nIHNlcnZsZXQgJyIgKyBzZXJ2bGV0Q2xhc3MgKworICAgICAgICAgICAgICAgICInIHdpdGggcGF0aCBpbmZvICciICsgcGF0aEluZm8gKyAiJyIpOworICAgICAgICBTdHJpbmcgbmFtZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLklOVk9LRVIuIiArIHNlcnZsZXRDbGFzczsKKyAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBpblNlcnZsZXRQYXRoICsgIi8iICsgc2VydmxldENsYXNzICsgIi8qIjsKKyAgICAgICAgV3JhcHBlciB3cmFwcGVyID0gbnVsbDsKKworICAgICAgICAvLyBTeW5jaHJvbml6ZSB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgd2hlbiBtdWx0aXBsZSByZXF1ZXN0cworICAgICAgICAvLyB0cnkgdG8gaW5pdGlhbGl6ZSB0aGUgc2FtZSBzZXJ2bGV0IGF0IHRoZSBzYW1lIHRpbWUKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisKKyAgICAgICAgICAgIC8vIEFyZSB3ZSByZWZlcmVuY2luZyBhbiBleGlzdGluZyBzZXJ2bGV0IGNsYXNzIG9yIG5hbWU/CisgICAgICAgICAgICB3cmFwcGVyID0gKFdyYXBwZXIpIGNvbnRleHQuZmluZENoaWxkKHNlcnZsZXRDbGFzcyk7CisgICAgICAgICAgICBpZiAod3JhcHBlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHdyYXBwZXIgPSAoV3JhcHBlcikgY29udGV4dC5maW5kQ2hpbGQobmFtZSk7CisgICAgICAgICAgICBpZiAod3JhcHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFjdHVhbFNlcnZsZXRDbGFzcyA9IHdyYXBwZXIuZ2V0U2VydmxldENsYXNzKCk7CisgICAgICAgICAgICAgICAgaWYgKChhY3R1YWxTZXJ2bGV0Q2xhc3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKGFjdHVhbFNlcnZsZXRDbGFzcy5zdGFydHNXaXRoCisgICAgICAgICAgICAgICAgICAgICAgICAoIm9yZy5hcGFjaGUuY2F0YWxpbmEiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZXF1ZXN0VVJJKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJVc2luZyB3cmFwcGVyIGZvciBzZXJ2bGV0ICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpICsgIicgd2l0aCBtYXBwaW5nICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gKyAiJyIpOworICAgICAgICAgICAgICAgIGNvbnRleHQuYWRkU2VydmxldE1hcHBpbmcocGF0dGVybiwgd3JhcHBlci5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBObywgY3JlYXRlIGEgbmV3IHdyYXBwZXIgZm9yIHRoZSBzcGVjaWZpZWQgc2VydmxldCBjbGFzcworICAgICAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJDcmVhdGluZyB3cmFwcGVyIGZvciAnIiArIHNlcnZsZXRDbGFzcyArCisgICAgICAgICAgICAgICAgICAgICAgICAiJyB3aXRoIG1hcHBpbmcgJyIgKyBwYXR0ZXJuICsgIiciKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIgPSBjb250ZXh0LmNyZWF0ZVdyYXBwZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5zZXROYW1lKG5hbWUpOworICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLnNldExvYWRPblN0YXJ0dXAoMSk7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuc2V0U2VydmxldENsYXNzKHNlcnZsZXRDbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYWRkQ2hpbGQod3JhcHBlcik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYWRkU2VydmxldE1hcHBpbmcocGF0dGVybiwgbmFtZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKHNtLmdldFN0cmluZygiaW52b2tlclNlcnZsZXQuY2Fubm90Q3JlYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlcXVlc3RVUkkpLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZW1vdmVTZXJ2bGV0TWFwcGluZyhwYXR0ZXJuKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZW1vdmVDaGlsZCh3cmFwcGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJpbnZva2VyU2VydmxldC5jYW5ub3RDcmVhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZXF1ZXN0VVJJKSwgdCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUmVxdWVzdFVSSSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhIHJlcXVlc3Qgd3JhcHBlciB0byBwYXNzIG9uIHRvIHRoZSBpbnZva2VkIHNlcnZsZXQKKyAgICAgICAgSW52b2tlckh0dHBSZXF1ZXN0IHdyZXF1ZXN0ID0KKyAgICAgICAgICAgIG5ldyBJbnZva2VySHR0cFJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgIHdyZXF1ZXN0LnNldFJlcXVlc3RVUkkoaW5SZXF1ZXN0VVJJKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihpblNlcnZsZXRQYXRoKTsKKyAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIHNiLmFwcGVuZChzZXJ2bGV0Q2xhc3MpOworICAgICAgICB3cmVxdWVzdC5zZXRTZXJ2bGV0UGF0aChzYi50b1N0cmluZygpKTsKKyAgICAgICAgaWYgKChwYXRoSW5mbyA9PSBudWxsKSB8fCAocGF0aEluZm8ubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgd3JlcXVlc3Quc2V0UGF0aEluZm8obnVsbCk7CisgICAgICAgICAgICB3cmVxdWVzdC5zZXRQYXRoVHJhbnNsYXRlZChudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyZXF1ZXN0LnNldFBhdGhJbmZvKHBhdGhJbmZvKTsKKyAgICAgICAgICAgIHdyZXF1ZXN0LnNldFBhdGhUcmFuc2xhdGVkCisgICAgICAgICAgICAgICAgKGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVhbFBhdGgocGF0aEluZm8pKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFsbG9jYXRlIGEgc2VydmxldCBpbnN0YW5jZSB0byBwZXJmb3JtIHRoaXMgcmVxdWVzdAorICAgICAgICBTZXJ2bGV0IGluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgaWYgKGRlYnVnID49IDIpCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBsb2coIiAgQWxsb2NhdGluZyBzZXJ2bGV0IGluc3RhbmNlIik7CisgICAgICAgICAgICBpbnN0YW5jZSA9IHdyYXBwZXIuYWxsb2NhdGUoKTsKKyAgICAgICAgfSBjYXRjaCAoU2VydmxldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coc20uZ2V0U3RyaW5nKCJpbnZva2VyU2VydmxldC5hbGxvY2F0ZSIsIGluUmVxdWVzdFVSSSksIGUpOworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVTZXJ2bGV0TWFwcGluZyhwYXR0ZXJuKTsKKyAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlQ2hpbGQod3JhcHBlcik7CisgICAgICAgICAgICBUaHJvd2FibGUgcm9vdENhdXNlID0gZS5nZXRSb290Q2F1c2UoKTsKKyAgICAgICAgICAgIGlmIChyb290Q2F1c2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByb290Q2F1c2UgPSBlOworICAgICAgICAgICAgaWYgKHJvb3RDYXVzZSBpbnN0YW5jZW9mIENsYXNzTm90Rm91bmRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUmVxdWVzdFVSSSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIGlmIChyb290Q2F1c2UgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbikgcm9vdENhdXNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChyb290Q2F1c2UgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIHJvb3RDYXVzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdENhdXNlIGluc3RhbmNlb2YgU2VydmxldEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93IChTZXJ2bGV0RXhjZXB0aW9uKSByb290Q2F1c2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImludm9rZXJTZXJ2bGV0LmFsbG9jYXRlIiwgaW5SZXF1ZXN0VVJJKSwKKyAgICAgICAgICAgICAgICAgICAgIHJvb3RDYXVzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBsb2coc20uZ2V0U3RyaW5nKCJpbnZva2VyU2VydmxldC5hbGxvY2F0ZSIsIGluUmVxdWVzdFVSSSksIGUpOworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVTZXJ2bGV0TWFwcGluZyhwYXR0ZXJuKTsKKyAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlQ2hpbGQod3JhcHBlcik7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImludm9rZXJTZXJ2bGV0LmFsbG9jYXRlIiwgaW5SZXF1ZXN0VVJJKSwgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBZnRlciBsb2FkaW5nIHRoZSB3cmFwcGVyLCByZXN0b3JlIHNvbWUgb2YgdGhlIGZpZWxkcyB3aGVuIGluY2x1ZGluZworICAgICAgICBpZiAoaW5jbHVkZWQpIHsKKyAgICAgICAgICAgIHdyZXF1ZXN0LnNldFJlcXVlc3RVUkkocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICAgICAgd3JlcXVlc3Quc2V0UGF0aEluZm8ocmVxdWVzdC5nZXRQYXRoSW5mbygpKTsKKyAgICAgICAgICAgIHdyZXF1ZXN0LnNldFNlcnZsZXRQYXRoKHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnZva2UgdGhlIHNlcnZpY2UoKSBtZXRob2Qgb2YgdGhlIGFsbG9jYXRlZCBzZXJ2bGV0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcganNwRmlsZSA9IHdyYXBwZXIuZ2V0SnNwRmlsZSgpOworICAgICAgICAgICAgaWYgKGpzcEZpbGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLkpTUF9GSUxFX0FUVFIsIGpzcEZpbGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUik7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLklOVk9LRURfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgICAgICAgICAvLyAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAyKQorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgbG9nKCIgIENhbGxpbmcgc2VydmljZSgpIG1ldGhvZCwganNwRmlsZT0iICsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBqc3BGaWxlKTsKKyAgICAgICAgICAgIGluc3RhbmNlLnNlcnZpY2Uod3JlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSU5WT0tFRF9BVFRSKTsKKyAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgaWYgKGRlYnVnID49IDIpCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBsb2coIiAgc2VydmljZSgpIG1ldGhvZCBJT0V4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5JTlZPS0VEX0FUVFIpOworICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd3JhcHBlci5kZWFsbG9jYXRlKGluc3RhbmNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBmKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoVW5hdmFpbGFibGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gICAgICAgICAgICBpZiAoZGVidWcgPj0gMikKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGxvZygiICBzZXJ2aWNlKCkgbWV0aG9kIFVuYXZhaWxhYmxlRXhjZXB0aW9uIiwgZSk7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZVNlcnZsZXRNYXBwaW5nKHBhdHRlcm4pOworICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5JTlZPS0VEX0FUVFIpOworICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd3JhcHBlci5kZWFsbG9jYXRlKGluc3RhbmNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBmKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoU2VydmxldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAyKQorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgbG9nKCIgIHNlcnZpY2UoKSBtZXRob2QgU2VydmxldEV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5JTlZPS0VEX0FUVFIpOworICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd3JhcHBlci5kZWFsbG9jYXRlKGluc3RhbmNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBmKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAyKQorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgbG9nKCIgIHNlcnZpY2UoKSBtZXRob2QgUnVudGltZUV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5JTlZPS0VEX0FUVFIpOworICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd3JhcHBlci5kZWFsbG9jYXRlKGluc3RhbmNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBmKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgaWYgKGRlYnVnID49IDIpCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBsb2coIiAgc2VydmljZSgpIG1ldGhvZCBUaHJvd2FibGUiLCBlKTsKKyAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSU5WT0tFRF9BVFRSKTsKKyAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdyYXBwZXIuZGVhbGxvY2F0ZShpbnN0YW5jZSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZikgeworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJJbnZva2VyIHNlcnZpY2UoKSBleGNlcHRpb24iLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlYWxsb2NhdGUgdGhlIGFsbG9jYXRlZCBzZXJ2bGV0IGluc3RhbmNlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAyKQorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgbG9nKCIgIGRlYWxsb2NhdGUgc2VydmxldCBpbnN0YW5jZSIpOworICAgICAgICAgICAgd3JhcHBlci5kZWFsbG9jYXRlKGluc3RhbmNlKTsKKyAgICAgICAgfSBjYXRjaCAoU2VydmxldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coc20uZ2V0U3RyaW5nKCJpbnZva2VyU2VydmxldC5kZWFsbG9jYXRlIiwgaW5SZXF1ZXN0VVJJKSwgZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgbG9nKHNtLmdldFN0cmluZygiaW52b2tlclNlcnZsZXQuZGVhbGxvY2F0ZSIsIGluUmVxdWVzdFVSSSksIGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJpbnZva2VyU2VydmxldC5kZWFsbG9jYXRlIiwgaW5SZXF1ZXN0VVJJKSwgZSk7CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRjMjk3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMCwwICsxLDE5IEBACitkZWZhdWx0U2VydmxldC5taXNzaW5nUmVzb3VyY2U9VGhlIHJlcXVlc3RlZCByZXNvdXJjZSAoezB9KSBpcyBub3QgYXZhaWxhYmxlCitkZWZhdWx0c2VydmxldC5kaXJlY3RvcnlsaXN0aW5nZm9yPURpcmVjdG9yeSBMaXN0aW5nIGZvcjoKK2RlZmF1bHRzZXJ2bGV0LnVwdG89VXAgdG86CitkZWZhdWx0c2VydmxldC5zdWJkaXJlY3Rvcmllcz1TdWJkaXJlY3RvcmllczoKK2RlZmF1bHRzZXJ2bGV0LmZpbGVzPUZpbGVzOgoraW52b2tlclNlcnZsZXQuYWxsb2NhdGU9Q2Fubm90IGFsbG9jYXRlIHNlcnZsZXQgaW5zdGFuY2UgZm9yIHBhdGggezB9CitpbnZva2VyU2VydmxldC5jYW5ub3RDcmVhdGU9Q2Fubm90IGNyZWF0ZSBzZXJ2bGV0IHdyYXBwZXIgZm9yIHBhdGggezB9CitpbnZva2VyU2VydmxldC5kZWFsbG9jYXRlPUNhbm5vdCBkZWFsbG9jYXRlIHNlcnZsZXQgaW5zdGFuY2UgZm9yIHBhdGggezB9CitpbnZva2VyU2VydmxldC5pbnZhbGlkUGF0aD1ObyBzZXJ2bGV0IG5hbWUgb3IgY2xhc3Mgd2FzIHNwZWNpZmllZCBpbiBwYXRoIHswfQoraW52b2tlclNlcnZsZXQubm90TmFtZWQ9Q2Fubm90IGNhbGwgaW52b2tlciBzZXJ2bGV0IHdpdGggYSBuYW1lZCBkaXNwYXRjaGVyCitpbnZva2VyU2VydmxldC5ub1dyYXBwZXI9Q29udGFpbmVyIGhhcyBub3QgY2FsbGVkIHNldFdyYXBwZXIoKSBmb3IgdGhpcyBzZXJ2bGV0Cit3ZWJkYXZzZXJ2bGV0LmpheHBmYWlsZWQ9SkFYUCBpbml0aWFsaXphdGlvbiBmYWlsZWQKK2RpcmVjdG9yeS5maWxlbmFtZT1GaWxlbmFtZQorZGlyZWN0b3J5Lmxhc3RNb2RpZmllZD1MYXN0IE1vZGlmaWVkCitkaXJlY3RvcnkucGFyZW50PVVwIFRvIHswfQorZGlyZWN0b3J5LnNpemU9U2l6ZQorZGlyZWN0b3J5LnRpdGxlPURpcmVjdG9yeSBMaXN0aW5nIEZvciB7MH0KK2RpcmVjdG9yeS52ZXJzaW9uPVRvbWNhdCBDYXRhbGluYSB2ZXJzaW9uIDQuMAorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1NWY2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDE4IEBACitkZWZhdWx0c2VydmxldC5kaXJlY3RvcnlsaXN0aW5nZm9yPUxpc3RhZG8gZGUgRGlyZWN0b3JpbyBwYXJhOgorZGVmYXVsdHNlcnZsZXQudXB0bz1BdHLhcyBhOgorZGVmYXVsdHNlcnZsZXQuc3ViZGlyZWN0b3JpZXM9U3ViZGlyZWN0b3Jpb3M6CitkZWZhdWx0c2VydmxldC5maWxlcz1BcmNoaXZvczoKK2ludm9rZXJTZXJ2bGV0LmFsbG9jYXRlPU5vIHB1ZWRvIHJlc2VydmFyIGVzcGFjaW8gcGFyYSBpbnN0YW5jaWEgZGUgc2VydmxldCBwYXJhIHRyYXllY3RvcmlhIHswfQoraW52b2tlclNlcnZsZXQuY2Fubm90Q3JlYXRlPU5vIHB1ZWRvIGNyZWFyIGFycm9wYWRvciAod3JhcHBlcikgZGUgc2VydmxldCBwYXJhIHRyYXllY3RvcmlhIHswfQoraW52b2tlclNlcnZsZXQuZGVhbGxvY2F0ZT1ObyBwdWVkbyByZWN1cGVyYXIgaW5zdGFuY2lhIGRlIHNlcnZsZXQgcGFyYSB0cmF5ZWN0b3JpYSB7MH0KK2ludm9rZXJTZXJ2bGV0LmludmFsaWRQYXRoPU5vIHNlIGhhIGVzcGVjaWZpY2FkbyBub21icmUgZGUgc2VydmxldCBvIGNsYXNlIGVuIHRyYXllY3RvcmlhIHswfQoraW52b2tlclNlcnZsZXQubm90TmFtZWQ9Tm8gcHVlZG8gbGxhbWFyIGEgc2VydmxldCBpbnZvY2Fkb3IgbWVkaWFudGUgdW4gZGVzcGFjaGFkb3Igbm9tYnJhZG8gKG5hbWVkKQoraW52b2tlclNlcnZsZXQubm9XcmFwcGVyPUVsIENvbnRlbmVkb3Igbm8gaGEgbGxhbWFkbyBhIHNldFdyYXBwZXIoKSBwYXJhIGVzdGUgc2VydmxldAord2ViZGF2c2VydmxldC5qYXhwZmFpbGVkPUZhbGzzIGxhIGluaWNpYWxpemFjafNuIGRlIEpBWFAKK2RpcmVjdG9yeS5maWxlbmFtZT1Ob21icmUgZGUgQXJjaGl2bworZGlyZWN0b3J5Lmxhc3RNb2RpZmllZD3abHRpbWEgTW9kaWZpY2FjafNuCitkaXJlY3RvcnkucGFyZW50PUF0cuFzIEEgezB9CitkaXJlY3Rvcnkuc2l6ZT1NZWRpZGEKK2RpcmVjdG9yeS50aXRsZT1MaXN0YWRvIGRlIERpcmVjdG9yaW8gUGFyYSB7MH0KK2RpcmVjdG9yeS52ZXJzaW9uPVRvbWNhdCBDYXRhbGluYSB2ZXJzafNuIDQuMAorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5NGUwNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpAQCAtMCwwICsxLDE4IEBACitkZWZhdWx0c2VydmxldC5kaXJlY3RvcnlsaXN0aW5nZm9yPUxpc3RlIGR1IHLpcGVydG9pcmUgcG91ciA6CitkZWZhdWx0c2VydmxldC51cHRvPUp1c3F1JyfgOgorZGVmYXVsdHNlcnZsZXQuc3ViZGlyZWN0b3JpZXM9U291cy1y6XBlcnRvaXJlczoKK2RlZmF1bHRzZXJ2bGV0LmZpbGVzPUZpY2hpZXJzOgoraW52b2tlclNlcnZsZXQuYWxsb2NhdGU9SW1wb3NzaWJsZSBkJydhbGxvdWVyIHVuZSBpbnN0YW5jZSBkZSBzZXJ2bGV0IHBvdXIgbGUgY2hlbWluIHswfQoraW52b2tlclNlcnZsZXQuY2Fubm90Q3JlYXRlPUltcG9zc2libGUgZGUgY3LpZXIgdW4gZW5yb2JldXIgKHdyYXBwZXIpIGRlIHNlcnZsZXQgcG91ciBsZSBjaGVtaW4gezB9CitpbnZva2VyU2VydmxldC5kZWFsbG9jYXRlPUltcG9zc2libGUgZGUgZOlzYWxsb3VlciB1bmUgaW5zdGFuY2UgZGUgc2VydmxldCBwb3VyIGxlIGNoZW1pbiB7MH0KK2ludm9rZXJTZXJ2bGV0LmludmFsaWRQYXRoPUF1Y3VuIG5vbSBkZSBzZXJ2bGV0IG91IGRlIGNsYXNzZSBuJydhIOl06SBzcOljaWZp6SBwb3VyIGxlIGNoZW1pbiB7MH0KK2ludm9rZXJTZXJ2bGV0Lm5vdE5hbWVkPUltcG9zc2libGUgZCcnYXBwZWxlciBsZSBk6WzpZ3XpIChpbnZva2VyKSBkZSBzZXJ2bGV0IGF2ZWMgdW4gYWlndWlsbGV1ciAoZGlzcGF0Y2hlcikgbm9tbekKK2ludm9rZXJTZXJ2bGV0Lm5vV3JhcHBlcj1MZSBjb250ZW5ldXIgbicnYSBwYXMgYXBwZWzpICJzZXRXcmFwcGVyKCkiIHBvdXIgY2V0dGUgc2VydmxldAord2ViZGF2c2VydmxldC5qYXhwZmFpbGVkPUVycmV1ciBkJydpbml0aWFsaXNhdGlvbiBkZSBKQVhQCitkaXJlY3RvcnkuZmlsZW5hbWU9Tm9tIGRlIGZpY2hpZXIKK2RpcmVjdG9yeS5sYXN0TW9kaWZpZWQ9RGVybmnocmUgbW9kaWZpY2F0aW9uCitkaXJlY3RvcnkucGFyZW50PUp1c3F1JyfgIHswfQorZGlyZWN0b3J5LnNpemU9VGFpbGxlCitkaXJlY3RvcnkudGl0bGU9TGlzdGUgZHUgculwZXJ0b2lyZSBwb3VyIHswfQorZGlyZWN0b3J5LnZlcnNpb249VG9tY2F0IENhdGFsaW5hIHZlcnNpb24gNC4wCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDgwMmMzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTggQEAKK2RlZmF1bHRzZXJ2bGV0LmRpcmVjdG9yeWxpc3Rpbmdmb3I9XHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMDZlXHU0ZTAwXHU4OWE3OiAKK2RlZmF1bHRzZXJ2bGV0LnVwdG89XHU4OWFhXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhOiAKK2RlZmF1bHRzZXJ2bGV0LnN1YmRpcmVjdG9yaWVzPVx1MzBiNVx1MzBkNlx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYToKK2RlZmF1bHRzZXJ2bGV0LmZpbGVzPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYjoKK2ludm9rZXJTZXJ2bGV0LmFsbG9jYXRlPVx1MzBkMVx1MzBiOSB7MH0gXHUzMDZiXHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHUzMGE0XHUzMGYzXHUzMGI5XHUzMGJmXHUzMGYzXHUzMGI5XHUzMDkyXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2XHUzMDg5XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzCitpbnZva2VyU2VydmxldC5jYW5ub3RDcmVhdGU9XHUzMGQxXHUzMGI5IHswfSBcdTMwNmJcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTMwZTlcdTMwYzNcdTMwZDFcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2ludm9rZXJTZXJ2bGV0LmRlYWxsb2NhdGU9XHUzMGQxXHUzMGI5IHswfSBcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTMwYTRcdTMwZjNcdTMwYjlcdTMwYmZcdTMwZjNcdTMwYjlcdTMwNmVcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjZcdTMwOTJcdTg5ZTNcdTk2NjRcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2ludm9rZXJTZXJ2bGV0LmludmFsaWRQYXRoPVx1MzBkMVx1MzBiOSB7MH0gXHUzMDZiXHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHU1NDBkXHU1M2M4XHUzMDZmXHUzMGFmXHUzMGU5XHUzMGI5XHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitpbnZva2VyU2VydmxldC5ub3ROYW1lZD1cdTMwNWRcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNmVcdTMwYzdcdTMwYTNcdTMwYjlcdTMwZDFcdTMwYzNcdTMwYzFcdTMwZTNcdTMwNjdcdTMwYTRcdTMwZjNcdTMwZGNcdTMwZmNcdTMwYWJcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTMwOTJcdTU0N2NcdTMwNzNcdTUxZmFcdTMwNWJcdTMwN2VcdTMwNWJcdTMwOTMKK2ludm9rZXJTZXJ2bGV0Lm5vV3JhcHBlcj1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwNmZcdTMwNTNcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTMwNmJcdTViZmVcdTMwNTdcdTMwNjZcdTU0N2NcdTMwNzNcdTUxZmFcdTMwNTVcdTMwOGNcdTMwNWZzZXRXcmFwcGVyKClcdTMwOTJcdTYzMDFcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK3dlYmRhdnNlcnZsZXQuamF4cGZhaWxlZD1KQVhQXHUzMDZlXHU1MjFkXHU2NzFmXHU1MzE2XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitkaXJlY3RvcnkuZmlsZW5hbWU9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU1NDBkCitkaXJlY3RvcnkubGFzdE1vZGlmaWVkPVx1NjcwMFx1N2Q0Mlx1NjZmNFx1NjViMAorZGlyZWN0b3J5LnBhcmVudD17MH0gXHUzMDZiXHU3OWZiXHU1MmQ1CitkaXJlY3Rvcnkuc2l6ZT1cdTMwYjVcdTMwYTRcdTMwYmEKK2RpcmVjdG9yeS50aXRsZT17MH0gXHUzMDZlXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMDZlXHU0ZTAwXHU4OWE3CitkaXJlY3RvcnkudmVyc2lvbj1Ub21jYXQgQ2F0YWxpbmEgXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzIDQuMAorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvV2ViZGF2U2VydmxldC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL1dlYmRhdlNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmRlMDNkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL1dlYmRhdlNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDMwNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VydmxldHM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZUNsYXNzUGFpcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkRPTVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTUQ1RW5jb2RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuUmVxdWVzdFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlhNTFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuQ2FjaGVFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLlJlc291cmNlQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmh0dHAuRmFzdEh0dHBEYXRlRm9ybWF0OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKworCisvKioKKyAqIFNlcnZsZXQgd2hpY2ggYWRkcyBzdXBwb3J0IGZvciBXZWJEQVYgbGV2ZWwgMi4gQWxsIHRoZSBiYXNpYyBIVFRQIHJlcXVlc3RzCisgKiBhcmUgaGFuZGxlZCBieSB0aGUgRGVmYXVsdFNlcnZsZXQuCisgKgorICogQ2hlY2sgb3V0IGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDAxNjAgZm9yIGEgRmlsdGVyCisgKiB0aGF0IGFsbG93cyB5b3UgdG8gbWFwIHRoaXMgc2VydmxldCBhbnl3aGVyZSBpbnNpZGUgYSB3ZWIgYXBwbGljYXRpb24sIG5vdCBqdXN0CisgKiB0aGUgLyogVVJMIHBhdHRlcm4uCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgV2ViZGF2U2VydmxldCAgZXh0ZW5kcyBEZWZhdWx0U2VydmxldCB7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9IRUFEID0gIkhFQUQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfUFJPUEZJTkQgPSAiUFJPUEZJTkQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfUFJPUFBBVENIID0gIlBST1BQQVRDSCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9NS0NPTCA9ICJNS0NPTCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9DT1BZID0gIkNPUFkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfTU9WRSA9ICJNT1ZFIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0xPQ0sgPSAiTE9DSyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9VTkxPQ0sgPSAiVU5MT0NLIjsKKworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBkZXB0aCBpcyBpbmZpbml0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5GSU5JVFkgPSAzOyAvLyBUbyBsaW1pdCB0cmVlIGJyb3dzaW5nIGEgYml0CisKKworICAgIC8qKgorICAgICAqIFBST1BGSU5EIC0gU3BlY2lmeSBhIHByb3BlcnR5IG1hc2suCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTkRfQllfUFJPUEVSVFkgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBQUk9QRklORCAtIERpc3BsYXkgYWxsIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTkRfQUxMX1BST1AgPSAxOworCisKKyAgICAvKioKKyAgICAgKiBQUk9QRklORCAtIFJldHVybiBwcm9wZXJ0eSBuYW1lcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklORF9QUk9QRVJUWV9OQU1FUyA9IDI7CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBsb2NrLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NLX0NSRUFUSU9OID0gMDsKKworCisgICAgLyoqCisgICAgICogUmVmcmVzaCBsb2NrLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NLX1JFRlJFU0ggPSAxOworCisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGxvY2sgdGltZW91dCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9USU1FT1VUID0gMzYwMDsKKworCisgICAgLyoqCisgICAgICogTWF4aW11bSBsb2NrIHRpbWVvdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9USU1FT1VUID0gNjA0ODAwOworCisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IG5hbWVzcGFjZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX05BTUVTUEFDRSA9ICJEQVY6IjsKKworCisgICAgLyoqCisgICAgICogU2ltcGxlIGRhdGUgZm9ybWF0IGZvciB0aGUgY3JlYXRpb24gZGF0ZSBJU08gcmVwcmVzZW50YXRpb24gKHBhcnRpYWwpLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBjcmVhdGlvbkRhdGVGb3JtYXQgPQorICAgICAgICBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzJ1onIik7CisKKworICAgICAvKioKKyAgICAgKiBNRDUgbWVzc2FnZSBkaWdlc3QgcHJvdmlkZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBNZXNzYWdlRGlnZXN0IG1kNUhlbHBlcjsKKworCisgICAgLyoqCisgICAgICogVGhlIE1ENSBoZWxwZXIgb2JqZWN0IGZvciB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTUQ1RW5jb2RlciBtZDVFbmNvZGVyID0gbmV3IE1ENUVuY29kZXIoKTsKKworCisgICAgLyoqIFN0YXRpYyBpbml0aWFsaXplcnMgZm9yIHRoZSBHTVQgdGltZSB6b25lLiAqLworICAgIHN0YXRpYyB7CisgICAgICAgIGNyZWF0aW9uRGF0ZUZvcm1hdC5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFJlcG9zaXRvcnkgb2YgdGhlIGxvY2tzIHB1dCBvbiBzaW5nbGUgcmVzb3VyY2VzLgorICAgICAqIDxwPgorICAgICAqIEtleSA6IHBhdGggPGJyIC8+CisgICAgICogVmFsdWUgOiBMb2NrSW5mbworICAgICAqLworICAgIHByaXZhdGUgTWFwIHJlc291cmNlTG9ja3MgPSBuZXcgSGFzaHRhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIFJlcG9zaXRvcnkgb2YgdGhlIGxvY2stbnVsbCByZXNvdXJjZXMuCisgICAgICogPHA+CisgICAgICogS2V5IDogcGF0aCBvZiB0aGUgY29sbGVjdGlvbiBjb250YWluaW5nIHRoZSBsb2NrLW51bGwgcmVzb3VyY2U8YnI+CisgICAgICogVmFsdWUgOiBWZWN0b3Igb2YgbG9jay1udWxsIHJlc291cmNlIHdoaWNoIGFyZSBtZW1iZXJzIG9mIHRoZQorICAgICAqIGNvbGxlY3Rpb24uIEVhY2ggZWxlbWVudCBvZiB0aGUgVmVjdG9yIGlzIHRoZSBwYXRoIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBsb2NrLW51bGwgcmVzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBNYXAgbG9ja051bGxSZXNvdXJjZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIFZlY3RvciBvZiB0aGUgaGVyaXRhYmxlIGxvY2tzLgorICAgICAqIDxwPgorICAgICAqIEtleSA6IHBhdGggPGJyPgorICAgICAqIFZhbHVlIDogTG9ja0luZm8KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QgY29sbGVjdGlvbkxvY2tzID0gbmV3IFZlY3RvcigpOworCisKKyAgICAvKioKKyAgICAgKiBTZWNyZXQgaW5mb3JtYXRpb24gdXNlZCB0byBnZW5lcmF0ZSByZWFzb25hYmx5IHNlY3VyZSBsb2NrIGlkcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzZWNyZXQgPSAiY2F0YWxpbmEiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5pbml0KCk7CisKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbHVlID0gZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoInNlY3JldCIpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZWNyZXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiV2ViZGF2U2VydmxldC5pbml0OiBlcnJvciByZWFkaW5nIHNlY3JldCBmcm9tICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIExvYWQgdGhlIE1ENSBoZWxwZXIgdXNlZCB0byBjYWxjdWxhdGUgc2lnbmF0dXJlcy4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1kNUhlbHBlciA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuYXZhaWxhYmxlRXhjZXB0aW9uKCJObyBNRDUiKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIEpBWFAgZG9jdW1lbnQgYnVpbGRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRG9jdW1lbnRCdWlsZGVyIGdldERvY3VtZW50QnVpbGRlcigpCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IG51bGw7CisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgICAgIGRvY3VtZW50QnVpbGRlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIH0gY2F0Y2goUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIndlYmRhdnNlcnZsZXQuamF4cGZhaWxlZCIpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZG9jdW1lbnRCdWlsZGVyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSGFuZGxlcyB0aGUgc3BlY2lhbCBXZWJEQVYgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbWV0aG9kID0gcmVxLmdldE1ldGhvZCgpOworCisgICAgICAgIGlmIChkZWJ1ZyA+IDApIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UmVsYXRpdmVQYXRoKHJlcSk7CisgICAgICAgICAgICBsb2coIlsiICsgbWV0aG9kICsgIl0gIiArIHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1ldGhvZC5lcXVhbHMoTUVUSE9EX1BST1BGSU5EKSkgeworICAgICAgICAgICAgZG9Qcm9wZmluZChyZXEsIHJlc3ApOworICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZC5lcXVhbHMoTUVUSE9EX1BST1BQQVRDSCkpIHsKKyAgICAgICAgICAgIGRvUHJvcHBhdGNoKHJlcSwgcmVzcCk7CisgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kLmVxdWFscyhNRVRIT0RfTUtDT0wpKSB7CisgICAgICAgICAgICBkb01rY29sKHJlcSwgcmVzcCk7CisgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kLmVxdWFscyhNRVRIT0RfQ09QWSkpIHsKKyAgICAgICAgICAgIGRvQ29weShyZXEsIHJlc3ApOworICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZC5lcXVhbHMoTUVUSE9EX01PVkUpKSB7CisgICAgICAgICAgICBkb01vdmUocmVxLCByZXNwKTsKKyAgICAgICAgfSBlbHNlIGlmIChtZXRob2QuZXF1YWxzKE1FVEhPRF9MT0NLKSkgeworICAgICAgICAgICAgZG9Mb2NrKHJlcSwgcmVzcCk7CisgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kLmVxdWFscyhNRVRIT0RfVU5MT0NLKSkgeworICAgICAgICAgICAgZG9VbmxvY2socmVxLCByZXNwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIERlZmF1bHRTZXJ2bGV0IHByb2Nlc3NpbmcKKyAgICAgICAgICAgIHN1cGVyLnNlcnZpY2UocmVxLCByZXNwKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgY29uZGl0aW9ucyBzcGVjaWZpZWQgaW4gdGhlIG9wdGlvbmFsIElmIGhlYWRlcnMgYXJlCisgICAgICogc2F0aXNmaWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VBdHRyaWJ1dGVzIFRoZSByZXNvdXJjZSBpbmZvcm1hdGlvbgorICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoZSByZXNvdXJjZSBtZWV0cyBhbGwgdGhlIHNwZWNpZmllZCBjb25kaXRpb25zLAorICAgICAqIGFuZCBmYWxzZSBpZiBhbnkgb2YgdGhlIGNvbmRpdGlvbnMgaXMgbm90IHNhdGlzZmllZCwgaW4gd2hpY2ggY2FzZQorICAgICAqIHJlcXVlc3QgcHJvY2Vzc2luZyBpcyBzdG9wcGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tJZkhlYWRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmICghc3VwZXIuY2hlY2tJZkhlYWRlcnMocmVxdWVzdCwgcmVzcG9uc2UsIHJlc291cmNlQXR0cmlidXRlcykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gVE9ETyA6IENoZWNraW5nIHRoZSBXZWJEQVYgSWYgaGVhZGVyCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPUFRJT05TIE1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXEgVGhlIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcmVzcCBUaGUgcmVzcG9uc2UKKyAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBJTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb09wdGlvbnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIHJlc3AuYWRkSGVhZGVyKCJEQVYiLCAiMSwyIik7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIG1ldGhvZHNBbGxvd2VkID0gZGV0ZXJtaW5lTWV0aG9kc0FsbG93ZWQocmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEpOworCisgICAgICAgIHJlc3AuYWRkSGVhZGVyKCJBbGxvdyIsIG1ldGhvZHNBbGxvd2VkLnRvU3RyaW5nKCkpOworICAgICAgICByZXNwLmFkZEhlYWRlcigiTVMtQXV0aG9yLVZpYSIsICJEQVYiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUFJPUEZJTkQgTWV0aG9kLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRvUHJvcGZpbmQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmICghbGlzdGluZ3MpIHsKKyAgICAgICAgICAgIC8vIEdldCBhbGxvd2VkIG1ldGhvZHMKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBtZXRob2RzQWxsb3dlZCA9IGRldGVybWluZU1ldGhvZHNBbGxvd2VkKHJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcSk7CisKKyAgICAgICAgICAgIHJlc3AuYWRkSGVhZGVyKCJBbGxvdyIsIG1ldGhvZHNBbGxvd2VkLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX01FVEhPRF9OT1RfQUxMT1dFRCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFJlbGF0aXZlUGF0aChyZXEpOworICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgiLyIpKQorICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSAxKTsKKworICAgICAgICBpZiAoKHBhdGgudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCIvV0VCLUlORiIpKSB8fAorICAgICAgICAgICAgKHBhdGgudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCIvTUVUQS1JTkYiKSkpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19GT1JCSURERU4pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvcGVydGllcyB3aGljaCBhcmUgdG8gYmUgZGlzcGxheWVkLgorICAgICAgICBMaXN0IHByb3BlcnRpZXMgPSBudWxsOworICAgICAgICAvLyBQcm9wZmluZCBkZXB0aAorICAgICAgICBpbnQgZGVwdGggPSBJTkZJTklUWTsKKyAgICAgICAgLy8gUHJvcGZpbmQgdHlwZQorICAgICAgICBpbnQgdHlwZSA9IEZJTkRfQUxMX1BST1A7CisKKyAgICAgICAgU3RyaW5nIGRlcHRoU3RyID0gcmVxLmdldEhlYWRlcigiRGVwdGgiKTsKKworICAgICAgICBpZiAoZGVwdGhTdHIgPT0gbnVsbCkgeworICAgICAgICAgICAgZGVwdGggPSBJTkZJTklUWTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChkZXB0aFN0ci5lcXVhbHMoIjAiKSkgeworICAgICAgICAgICAgICAgIGRlcHRoID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVwdGhTdHIuZXF1YWxzKCIxIikpIHsKKyAgICAgICAgICAgICAgICBkZXB0aCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlcHRoU3RyLmVxdWFscygiaW5maW5pdHkiKSkgeworICAgICAgICAgICAgICAgIGRlcHRoID0gSU5GSU5JVFk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBOb2RlIHByb3BOb2RlID0gbnVsbDsKKworICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyID0gZ2V0RG9jdW1lbnRCdWlsZGVyKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRCdWlsZGVyLnBhcnNlCisgICAgICAgICAgICAgICAgKG5ldyBJbnB1dFNvdXJjZShyZXEuZ2V0SW5wdXRTdHJlYW0oKSkpOworCisgICAgICAgICAgICAvLyBHZXQgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQKKyAgICAgICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAgICAgICAgICAgIE5vZGVMaXN0IGNoaWxkTGlzdCA9IHJvb3RFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBOb2RlIGN1cnJlbnROb2RlID0gY2hpbGRMaXN0Lml0ZW0oaSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmdldE5vZGVOYW1lKCkuZW5kc1dpdGgoInByb3AiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEZJTkRfQllfUFJPUEVSVFk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wTm9kZSA9IGN1cnJlbnROb2RlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5nZXROb2RlTmFtZSgpLmVuZHNXaXRoKCJwcm9wbmFtZSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRklORF9QUk9QRVJUWV9OQU1FUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZU5hbWUoKS5lbmRzV2l0aCgiYWxscHJvcCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRklORF9BTExfUFJPUDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIE1vc3QgbGlrZWx5IHRoZXJlIHdhcyBubyBjb250ZW50IDogd2UgdXNlIHRoZSBkZWZhdWx0cy4KKyAgICAgICAgICAgIC8vIFRPRE8gOiBFbmhhbmNlIHRoYXQgIQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGUgPT0gRklORF9CWV9QUk9QRVJUWSkgeworICAgICAgICAgICAgcHJvcGVydGllcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgIE5vZGVMaXN0IGNoaWxkTGlzdCA9IHByb3BOb2RlLmdldENoaWxkTm9kZXMoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBOb2RlIGN1cnJlbnROb2RlID0gY2hpbGRMaXN0Lml0ZW0oaSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5vZGVOYW1lID0gY3VycmVudE5vZGUuZ2V0Tm9kZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZS5pbmRleE9mKCc6JykgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IG5vZGVOYW1lLnN1YnN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub2RlTmFtZS5pbmRleE9mKCc6JykgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IG5vZGVOYW1lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGhyZWYgaXMgYSBsaXZlIHByb3BlcnR5IHdoaWNoIGlzIGhhbmRsZWQgZGlmZmVyZW50bHkKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5hZGQocHJvcGVydHlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGV4aXN0cyA9IHRydWU7CisgICAgICAgIE9iamVjdCBvYmplY3QgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqZWN0ID0gcmVzb3VyY2VzLmxvb2t1cChwYXRoKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4aXN0cyA9IGZhbHNlOworICAgICAgICAgICAgaW50IHNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgaWYgKHNsYXNoICE9IC0xKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmVudFBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBzbGFzaCk7CisgICAgICAgICAgICAgICAgTGlzdCBjdXJyZW50TG9ja051bGxSZXNvdXJjZXMgPQorICAgICAgICAgICAgICAgICAgICAoTGlzdCkgbG9ja051bGxSZXNvdXJjZXMuZ2V0KHBhcmVudFBhdGgpOworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TG9ja051bGxSZXNvdXJjZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gY3VycmVudExvY2tOdWxsUmVzb3VyY2VzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2tOdWxsUGF0aCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2tOdWxsUGF0aC5lcXVhbHMocGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLnNldFN0YXR1cyhXZWJkYXZTdGF0dXMuU0NfTVVMVElfU1RBVFVTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbDsgY2hhcnNldD1VVEYtOCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBtdWx0aXN0YXR1cyBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIgZ2VuZXJhdGVkWE1MID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhNTFdyaXRlcihyZXNwLmdldFdyaXRlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVYTUxIZWFkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudWxsLCAibXVsdGlzdGF0dXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdlbmVyYXRlTmFtZXNwYWNlRGVjbGFyYXRpb25zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VMb2NrTnVsbFByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcSwgZ2VuZXJhdGVkWE1MLCBsb2NrTnVsbFBhdGgsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJtdWx0aXN0YXR1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLnNlbmREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFleGlzdHMpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5ELCBwYXRoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3Auc2V0U3RhdHVzKFdlYmRhdlN0YXR1cy5TQ19NVUxUSV9TVEFUVVMpOworCisgICAgICAgIHJlc3Auc2V0Q29udGVudFR5cGUoInRleHQveG1sOyBjaGFyc2V0PVVURi04Iik7CisKKyAgICAgICAgLy8gQ3JlYXRlIG11bHRpc3RhdHVzIG9iamVjdAorICAgICAgICBYTUxXcml0ZXIgZ2VuZXJhdGVkWE1MID0gbmV3IFhNTFdyaXRlcihyZXNwLmdldFdyaXRlcigpKTsKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlWE1MSGVhZGVyKCk7CisKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAibXVsdGlzdGF0dXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZW5lcmF0ZU5hbWVzcGFjZURlY2xhcmF0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5PUEVOSU5HKTsKKworICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgcGFyc2VQcm9wZXJ0aWVzKHJlcSwgZ2VuZXJhdGVkWE1MLCBwYXRoLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhlIHN0YWNrIGFsd2F5cyBjb250YWlucyB0aGUgb2JqZWN0IG9mIHRoZSBjdXJyZW50IGxldmVsCisgICAgICAgICAgICBTdGFjayBzdGFjayA9IG5ldyBTdGFjaygpOworICAgICAgICAgICAgc3RhY2sucHVzaChwYXRoKTsKKworICAgICAgICAgICAgLy8gU3RhY2sgb2YgdGhlIG9iamVjdHMgb25lIGxldmVsIGJlbG93CisgICAgICAgICAgICBTdGFjayBzdGFja0JlbG93ID0gbmV3IFN0YWNrKCk7CisKKyAgICAgICAgICAgIHdoaWxlICgoIXN0YWNrLmlzRW1wdHkoKSkgJiYgKGRlcHRoID49IDApKSB7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFBhdGggPSAoU3RyaW5nKSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgICBwYXJzZVByb3BlcnRpZXMocmVxLCBnZW5lcmF0ZWRYTUwsIGN1cnJlbnRQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBwcm9wZXJ0aWVzKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IHJlc291cmNlcy5sb29rdXAoY3VycmVudFBhdGgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgob2JqZWN0IGluc3RhbmNlb2YgRGlyQ29udGV4dCkgJiYgKGRlcHRoID4gMCkpIHsKKworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSByZXNvdXJjZXMubGlzdChjdXJyZW50UGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lQ2xhc3NQYWlyIG5jUGFpciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOYW1lQ2xhc3NQYWlyKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdQYXRoID0gY3VycmVudFBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobmV3UGF0aC5lbmRzV2l0aCgiLyIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0aCArPSAiLyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0aCArPSBuY1BhaXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrQmVsb3cucHVzaChuZXdQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiV2ViZGF2U2VydmxldDogbmFtaW5nIGV4Y2VwdGlvbiBwcm9jZXNzaW5nICIgKyBjdXJyZW50UGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBEaXNwbGF5aW5nIHRoZSBsb2NrLW51bGwgcmVzb3VyY2VzIHByZXNlbnQgaW4gdGhhdAorICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0aW9uCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NrUGF0aCA9IGN1cnJlbnRQYXRoOworICAgICAgICAgICAgICAgICAgICBpZiAobG9ja1BhdGguZW5kc1dpdGgoIi8iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tQYXRoID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrUGF0aC5zdWJzdHJpbmcoMCwgbG9ja1BhdGgubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgTGlzdCBjdXJyZW50TG9ja051bGxSZXNvdXJjZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKExpc3QpIGxvY2tOdWxsUmVzb3VyY2VzLmdldChsb2NrUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TG9ja051bGxSZXNvdXJjZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGN1cnJlbnRMb2NrTnVsbFJlc291cmNlcy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2tOdWxsUGF0aCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlTG9ja051bGxQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXEsIGdlbmVyYXRlZFhNTCwgbG9ja051bGxQYXRoLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdGFjay5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVwdGgtLTsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2sgPSBzdGFja0JlbG93OworICAgICAgICAgICAgICAgICAgICBzdGFja0JlbG93ID0gbmV3IFN0YWNrKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLnNlbmREYXRhKCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgIm11bHRpc3RhdHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgZ2VuZXJhdGVkWE1MLnNlbmREYXRhKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBST1BQQVRDSCBNZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9Qcm9wcGF0Y2goSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHJlYWRPbmx5KSB7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfRk9SQklEREVOKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0xvY2tlZChyZXEpKSB7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfTE9DS0VEKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3Auc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0lNUExFTUVOVEVEKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTUtDT0wgTWV0aG9kLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRvTWtjb2woSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChyZWFkT25seSkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0ZPUkJJRERFTik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNMb2NrZWQocmVxKSkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0xPQ0tFRCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFJlbGF0aXZlUGF0aChyZXEpOworCisgICAgICAgIGlmICgocGF0aC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIi9XRUItSU5GIikpIHx8CisgICAgICAgICAgICAocGF0aC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIi9NRVRBLUlORiIpKSkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0ZPUkJJRERFTik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGV4aXN0cyA9IHRydWU7CisgICAgICAgIE9iamVjdCBvYmplY3QgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqZWN0ID0gcmVzb3VyY2VzLmxvb2t1cChwYXRoKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4aXN0cyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FuJ3QgY3JlYXRlIGEgY29sbGVjdGlvbiBpZiBhIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIGF0IHRoZSBnaXZlbgorICAgICAgICAvLyBwYXRoCisgICAgICAgIGlmIChleGlzdHMpIHsKKyAgICAgICAgICAgIC8vIEdldCBhbGxvd2VkIG1ldGhvZHMKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBtZXRob2RzQWxsb3dlZCA9IGRldGVybWluZU1ldGhvZHNBbGxvd2VkKHJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcSk7CisKKyAgICAgICAgICAgIHJlc3AuYWRkSGVhZGVyKCJBbGxvdyIsIG1ldGhvZHNBbGxvd2VkLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfTUVUSE9EX05PVF9BTExPV0VEKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXEuZ2V0SW5wdXRTdHJlYW0oKS5hdmFpbGFibGUoKSA+IDApIHsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPSBnZXREb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2N1bWVudEJ1aWxkZXIucGFyc2UKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBJbnB1dFNvdXJjZShyZXEuZ2V0SW5wdXRTdHJlYW0oKSkpOworICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBQcm9jZXNzIHRoaXMgcmVxdWVzdCBib2R5CisgICAgICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX05PVF9JTVBMRU1FTlRFRCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB9IGNhdGNoKFNBWEV4Y2VwdGlvbiBzYXhlKSB7CisgICAgICAgICAgICAgICAgLy8gUGFyc2UgZXJyb3IgLSBhc3N1bWUgaW52YWxpZCBjb250ZW50CisgICAgICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0JBRF9SRVFVRVNUKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNvdXJjZXMuY3JlYXRlU3ViY29udGV4dChwYXRoKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19DT05GTElDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYmRhdlN0YXR1cy5nZXRTdGF0dXNUZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViZGF2U3RhdHVzLlNDX0NPTkZMSUNUKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNwLnNldFN0YXR1cyhXZWJkYXZTdGF0dXMuU0NfQ1JFQVRFRCk7CisgICAgICAgICAgICAvLyBSZW1vdmluZyBhbnkgbG9jay1udWxsIHJlc291cmNlIHdoaWNoIHdvdWxkIGJlIHByZXNlbnQKKyAgICAgICAgICAgIGxvY2tOdWxsUmVzb3VyY2VzLnJlbW92ZShwYXRoKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBERUxFVEUgTWV0aG9kLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRvRGVsZXRlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocmVhZE9ubHkpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19GT1JCSURERU4pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzTG9ja2VkKHJlcSkpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19MT0NLRUQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZGVsZXRlUmVzb3VyY2UocmVxLCByZXNwKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIFBPU1QgcmVxdWVzdCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXEgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldC1zcGVjaWZpZWQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9QdXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChpc0xvY2tlZChyZXEpKSB7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfTE9DS0VEKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN1cGVyLmRvUHV0KHJlcSwgcmVzcCk7CisKKyAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRSZWxhdGl2ZVBhdGgocmVxKTsKKworICAgICAgICAvLyBSZW1vdmluZyBhbnkgbG9jay1udWxsIHJlc291cmNlIHdoaWNoIHdvdWxkIGJlIHByZXNlbnQKKyAgICAgICAgbG9ja051bGxSZXNvdXJjZXMucmVtb3ZlKHBhdGgpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQ09QWSBNZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9Db3B5KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocmVhZE9ubHkpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19GT1JCSURERU4pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY29weVJlc291cmNlKHJlcSwgcmVzcCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE1PVkUgTWV0aG9kLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRvTW92ZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHJlYWRPbmx5KSB7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfRk9SQklEREVOKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0xvY2tlZChyZXEpKSB7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfTE9DS0VEKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UmVsYXRpdmVQYXRoKHJlcSk7CisKKyAgICAgICAgaWYgKGNvcHlSZXNvdXJjZShyZXEsIHJlc3ApKSB7CisgICAgICAgICAgICBkZWxldGVSZXNvdXJjZShwYXRoLCByZXEsIHJlc3AsIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMT0NLIE1ldGhvZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0xvY2soSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChyZWFkT25seSkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0ZPUkJJRERFTik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNMb2NrZWQocmVxKSkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0xPQ0tFRCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBMb2NrSW5mbyBsb2NrID0gbmV3IExvY2tJbmZvKCk7CisKKyAgICAgICAgLy8gUGFyc2luZyBsb2NrIHJlcXVlc3QKKworICAgICAgICAvLyBQYXJzaW5nIGRlcHRoIGhlYWRlcgorCisgICAgICAgIFN0cmluZyBkZXB0aFN0ciA9IHJlcS5nZXRIZWFkZXIoIkRlcHRoIik7CisKKyAgICAgICAgaWYgKGRlcHRoU3RyID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvY2suZGVwdGggPSBJTkZJTklUWTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChkZXB0aFN0ci5lcXVhbHMoIjAiKSkgeworICAgICAgICAgICAgICAgIGxvY2suZGVwdGggPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2NrLmRlcHRoID0gSU5GSU5JVFk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJzaW5nIHRpbWVvdXQgaGVhZGVyCisKKyAgICAgICAgaW50IGxvY2tEdXJhdGlvbiA9IERFRkFVTFRfVElNRU9VVDsKKyAgICAgICAgU3RyaW5nIGxvY2tEdXJhdGlvblN0ciA9IHJlcS5nZXRIZWFkZXIoIlRpbWVvdXQiKTsKKyAgICAgICAgaWYgKGxvY2tEdXJhdGlvblN0ciA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2NrRHVyYXRpb24gPSBERUZBVUxUX1RJTUVPVVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgY29tbWFQb3MgPSBsb2NrRHVyYXRpb25TdHIuaW5kZXhPZigiLCIpOworICAgICAgICAgICAgLy8gSWYgbXVsdGlwbGUgdGltZW91dHMsIGp1c3QgdXNlIHRoZSBmaXJzdAorICAgICAgICAgICAgaWYgKGNvbW1hUG9zICE9IC0xKSB7CisgICAgICAgICAgICAgICAgbG9ja0R1cmF0aW9uU3RyID0gbG9ja0R1cmF0aW9uU3RyLnN1YnN0cmluZygwLGNvbW1hUG9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2NrRHVyYXRpb25TdHIuc3RhcnRzV2l0aCgiU2Vjb25kLSIpKSB7CisgICAgICAgICAgICAgICAgbG9ja0R1cmF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgKG5ldyBJbnRlZ2VyKGxvY2tEdXJhdGlvblN0ci5zdWJzdHJpbmcoNykpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9ja0R1cmF0aW9uU3RyLmVxdWFsc0lnbm9yZUNhc2UoImluZmluaXR5IikpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9ja0R1cmF0aW9uID0gTUFYX1RJTUVPVVQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tEdXJhdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBJbnRlZ2VyKGxvY2tEdXJhdGlvblN0cikpLmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrRHVyYXRpb24gPSBNQVhfVElNRU9VVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2NrRHVyYXRpb24gPT0gMCkgeworICAgICAgICAgICAgICAgIGxvY2tEdXJhdGlvbiA9IERFRkFVTFRfVElNRU9VVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2NrRHVyYXRpb24gPiBNQVhfVElNRU9VVCkgeworICAgICAgICAgICAgICAgIGxvY2tEdXJhdGlvbiA9IE1BWF9USU1FT1VUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvY2suZXhwaXJlc0F0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAobG9ja0R1cmF0aW9uICogMTAwMCk7CisKKyAgICAgICAgaW50IGxvY2tSZXF1ZXN0VHlwZSA9IExPQ0tfQ1JFQVRJT047CisKKyAgICAgICAgTm9kZSBsb2NrSW5mb05vZGUgPSBudWxsOworCisgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPSBnZXREb2N1bWVudEJ1aWxkZXIoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2N1bWVudEJ1aWxkZXIucGFyc2UobmV3IElucHV0U291cmNlCisgICAgICAgICAgICAgICAgKHJlcS5nZXRJbnB1dFN0cmVhbSgpKSk7CisKKyAgICAgICAgICAgIC8vIEdldCB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkb2N1bWVudAorICAgICAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOworICAgICAgICAgICAgbG9ja0luZm9Ob2RlID0gcm9vdEVsZW1lbnQ7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvY2tSZXF1ZXN0VHlwZSA9IExPQ0tfUkVGUkVTSDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsb2NrSW5mb05vZGUgIT0gbnVsbCkgeworCisgICAgICAgICAgICAvLyBSZWFkaW5nIGxvY2sgaW5mb3JtYXRpb24KKworICAgICAgICAgICAgTm9kZUxpc3QgY2hpbGRMaXN0ID0gbG9ja0luZm9Ob2RlLmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdHJXcml0ZXIgPSBudWxsOworICAgICAgICAgICAgRE9NV3JpdGVyIGRvbVdyaXRlciA9IG51bGw7CisKKyAgICAgICAgICAgIE5vZGUgbG9ja1Njb3BlTm9kZSA9IG51bGw7CisgICAgICAgICAgICBOb2RlIGxvY2tUeXBlTm9kZSA9IG51bGw7CisgICAgICAgICAgICBOb2RlIGxvY2tPd25lck5vZGUgPSBudWxsOworCisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBjaGlsZExpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIE5vZGUgY3VycmVudE5vZGUgPSBjaGlsZExpc3QuaXRlbShpKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBjdXJyZW50Tm9kZS5nZXROb2RlTmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUuZW5kc1dpdGgoImxvY2tzY29wZSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrU2NvcGVOb2RlID0gY3VycmVudE5vZGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lLmVuZHNXaXRoKCJsb2NrdHlwZSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrVHlwZU5vZGUgPSBjdXJyZW50Tm9kZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUuZW5kc1dpdGgoIm93bmVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tPd25lck5vZGUgPSBjdXJyZW50Tm9kZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsb2NrU2NvcGVOb2RlICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgIGNoaWxkTGlzdCA9IGxvY2tTY29wZU5vZGUuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGNoaWxkTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgY3VycmVudE5vZGUgPSBjaGlsZExpc3QuaXRlbShpKTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREU6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wU2NvcGUgPSBjdXJyZW50Tm9kZS5nZXROb2RlTmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBTY29wZS5pbmRleE9mKCc6JykgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLnNjb3BlID0gdGVtcFNjb3BlLnN1YnN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVtcFNjb3BlLmluZGV4T2YoJzonKSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLnNjb3BlID0gdGVtcFNjb3BlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobG9jay5zY29wZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEJhZCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgIHJlc3Auc2V0U3RhdHVzKFdlYmRhdlN0YXR1cy5TQ19CQURfUkVRVUVTVCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEJhZCByZXF1ZXN0CisgICAgICAgICAgICAgICAgcmVzcC5zZXRTdGF0dXMoV2ViZGF2U3RhdHVzLlNDX0JBRF9SRVFVRVNUKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxvY2tUeXBlTm9kZSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICBjaGlsZExpc3QgPSBsb2NrVHlwZU5vZGUuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGNoaWxkTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgY3VycmVudE5vZGUgPSBjaGlsZExpc3QuaXRlbShpKTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREU6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wVHlwZSA9IGN1cnJlbnROb2RlLmdldE5vZGVOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFR5cGUuaW5kZXhPZignOicpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jay50eXBlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFR5cGUuc3Vic3RyaW5nKHRlbXBUeXBlLmluZGV4T2YoJzonKSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLnR5cGUgPSB0ZW1wVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxvY2sudHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEJhZCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgIHJlc3Auc2V0U3RhdHVzKFdlYmRhdlN0YXR1cy5TQ19CQURfUkVRVUVTVCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEJhZCByZXF1ZXN0CisgICAgICAgICAgICAgICAgcmVzcC5zZXRTdGF0dXMoV2ViZGF2U3RhdHVzLlNDX0JBRF9SRVFVRVNUKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxvY2tPd25lck5vZGUgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgY2hpbGRMaXN0ID0gbG9ja093bmVyTm9kZS5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgTm9kZSBjdXJyZW50Tm9kZSA9IGNoaWxkTGlzdC5pdGVtKGkpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sub3duZXIgKz0gY3VycmVudE5vZGUuZ2V0Tm9kZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cldyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbVdyaXRlciA9IG5ldyBET01Xcml0ZXIoc3RyV3JpdGVyLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbVdyaXRlci5zZXRRdWFsaWZpZWROYW1lcyhmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkb21Xcml0ZXIucHJpbnQoY3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9jay5vd25lciArPSBzdHJXcml0ZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxvY2sub3duZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBCYWQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICByZXNwLnNldFN0YXR1cyhXZWJkYXZTdGF0dXMuU0NfQkFEX1JFUVVFU1QpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2NrLm93bmVyID0gbmV3IFN0cmluZygpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFJlbGF0aXZlUGF0aChyZXEpOworCisgICAgICAgIGxvY2sucGF0aCA9IHBhdGg7CisKKyAgICAgICAgYm9vbGVhbiBleGlzdHMgPSB0cnVlOworICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9iamVjdCA9IHJlc291cmNlcy5sb29rdXAocGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGlzdHMgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsb2NrUmVxdWVzdFR5cGUgPT0gTE9DS19DUkVBVElPTikgeworCisgICAgICAgICAgICAvLyBHZW5lcmF0aW5nIGxvY2sgaWQKKyAgICAgICAgICAgIFN0cmluZyBsb2NrVG9rZW5TdHIgPSByZXEuZ2V0U2VydmxldFBhdGgoKSArICItIiArIGxvY2sudHlwZSArICItIgorICAgICAgICAgICAgICAgICsgbG9jay5zY29wZSArICItIiArIHJlcS5nZXRVc2VyUHJpbmNpcGFsKCkgKyAiLSIKKyAgICAgICAgICAgICAgICArIGxvY2suZGVwdGggKyAiLSIgKyBsb2NrLm93bmVyICsgIi0iICsgbG9jay50b2tlbnMgKyAiLSIKKyAgICAgICAgICAgICAgICArIGxvY2suZXhwaXJlc0F0ICsgIi0iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLSIKKyAgICAgICAgICAgICAgICArIHNlY3JldDsKKyAgICAgICAgICAgIFN0cmluZyBsb2NrVG9rZW4gPQorICAgICAgICAgICAgICAgIG1kNUVuY29kZXIuZW5jb2RlKG1kNUhlbHBlci5kaWdlc3QobG9ja1Rva2VuU3RyLmdldEJ5dGVzKCkpKTsKKworICAgICAgICAgICAgaWYgKCAoZXhpc3RzKSAmJiAob2JqZWN0IGluc3RhbmNlb2YgRGlyQ29udGV4dCkgJiYKKyAgICAgICAgICAgICAgICAgKGxvY2suZGVwdGggPT0gSU5GSU5JVFkpICkgeworCisgICAgICAgICAgICAgICAgLy8gTG9ja2luZyBhIGNvbGxlY3Rpb24gKGFuZCBhbGwgaXRzIG1lbWJlciByZXNvdXJjZXMpCisKKyAgICAgICAgICAgICAgICAvLyBDaGVja2luZyBpZiBhIGNoaWxkIHJlc291cmNlIG9mIHRoaXMgY29sbGVjdGlvbiBpcworICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgbG9ja2VkCisgICAgICAgICAgICAgICAgTGlzdCBsb2NrUGF0aHMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbkxvY2tzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvY2tJbmZvIGN1cnJlbnRMb2NrID0gKExvY2tJbmZvKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2NrLmhhc0V4cGlyZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VMb2Nrcy5yZW1vdmUoY3VycmVudExvY2sucGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIChjdXJyZW50TG9jay5wYXRoLnN0YXJ0c1dpdGgobG9jay5wYXRoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKGN1cnJlbnRMb2NrLmlzRXhjbHVzaXZlKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NrLmlzRXhjbHVzaXZlKCkpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY2hpbGQgY29sbGVjdGlvbiBvZiB0aGlzIGNvbGxlY3Rpb24gaXMgbG9ja2VkCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrUGF0aHMuYWRkKGN1cnJlbnRMb2NrLnBhdGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gWWlrZXM6IG1vZGlmeWluZyB0aGUgY29sbGVjdGlvbiBub3QgYnkgdGhlIGl0ZXJhdG9yJ3Mgb2JqZWN0LAorICAgICAgICAgICAgICAgIC8vIGJ1dCBieSBvbmUgb2YgaXRzIGF0dHJpYnV0ZXMuICBUaGF0IG1lYW5zIHdlIGNhbid0IHVzZSBhCisgICAgICAgICAgICAgICAgLy8gbm9ybWFsIGphdmEudXRpbC5JdGVyYXRvciBoZXJlLCBiZWNhdXNlIEl0ZXJhdG9yIGlzIGZhaWwtZmFzdC4gOygKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBsb2Nrc0xpc3QgPSBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihyZXNvdXJjZUxvY2tzLnZhbHVlcygpKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAobG9ja3NMaXN0Lmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIExvY2tJbmZvIGN1cnJlbnRMb2NrID0gKExvY2tJbmZvKSBsb2Nrc0xpc3QubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2NrLmhhc0V4cGlyZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VMb2Nrcy5yZW1vdmUoY3VycmVudExvY2sucGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIChjdXJyZW50TG9jay5wYXRoLnN0YXJ0c1dpdGgobG9jay5wYXRoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKGN1cnJlbnRMb2NrLmlzRXhjbHVzaXZlKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NrLmlzRXhjbHVzaXZlKCkpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY2hpbGQgcmVzb3VyY2Ugb2YgdGhpcyBjb2xsZWN0aW9uIGlzIGxvY2tlZAorICAgICAgICAgICAgICAgICAgICAgICAgbG9ja1BhdGhzLmFkZChjdXJyZW50TG9jay5wYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghbG9ja1BhdGhzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBPbmUgb2YgdGhlIGNoaWxkIHBhdGhzIHdhcyBsb2NrZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgZ2VuZXJhdGUgYSBtdWx0aXN0YXR1cyBlcnJvciByZXBvcnQKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZXRTdGF0dXMoV2ViZGF2U3RhdHVzLlNDX0NPTkZMSUNUKTsKKworICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIgZ2VuZXJhdGVkWE1MID0gbmV3IFhNTFdyaXRlcigpOworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVYTUxIZWFkZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCwgIm11bHRpc3RhdHVzIiArIGdlbmVyYXRlTmFtZXNwYWNlRGVjbGFyYXRpb25zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk9QRU5JTkcpOworCisKKyAgICAgICAgICAgICAgICAgICAgaXRlciA9IGxvY2tQYXRocy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInJlc3BvbnNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiaHJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoKFN0cmluZykgaXRlci5uZXh0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiaHJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN0YXR1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIkhUVFAvMS4xICIgKyBXZWJkYXZTdGF0dXMuU0NfTE9DS0VECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIiArIFdlYmRhdlN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0YXR1c1RleHQoV2ViZGF2U3RhdHVzLlNDX0xPQ0tFRCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3RhdHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJyZXNwb25zZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgIm11bHRpc3RhdHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgICAgICAgICBXcml0ZXIgd3JpdGVyID0gcmVzcC5nZXRXcml0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGdlbmVyYXRlZFhNTC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYm9vbGVhbiBhZGRMb2NrID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIC8vIENoZWNraW5nIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBzaGFyZWQgbG9jayBvbiB0aGlzIHBhdGgKKyAgICAgICAgICAgICAgICBpdGVyID0gY29sbGVjdGlvbkxvY2tzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvY2tJbmZvIGN1cnJlbnRMb2NrID0gKExvY2tJbmZvKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2NrLnBhdGguZXF1YWxzKGxvY2sucGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TG9jay5pc0V4Y2x1c2l2ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0xPQ0tFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jay5pc0V4Y2x1c2l2ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19MT0NLRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9jay50b2tlbnMuYWRkKGxvY2tUb2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrID0gY3VycmVudExvY2s7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRMb2NrID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYWRkTG9jaykgeworICAgICAgICAgICAgICAgICAgICBsb2NrLnRva2Vucy5hZGQobG9ja1Rva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbkxvY2tzLmFkZChsb2NrKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAvLyBMb2NraW5nIGEgc2luZ2xlIHJlc291cmNlCisKKyAgICAgICAgICAgICAgICAvLyBSZXRyaWV2aW5nIGFuIGFscmVhZHkgZXhpc3RpbmcgbG9jayBvbiB0aGF0IHJlc291cmNlCisgICAgICAgICAgICAgICAgTG9ja0luZm8gcHJlc2VudExvY2sgPSAoTG9ja0luZm8pIHJlc291cmNlTG9ja3MuZ2V0KGxvY2sucGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRMb2NrICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKHByZXNlbnRMb2NrLmlzRXhjbHVzaXZlKCkpIHx8IChsb2NrLmlzRXhjbHVzaXZlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBlaXRoZXIgbG9jayBpcyBleGNsdXNpdmUsIHRoZSBsb2NrIGNhbid0IGJlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBncmFudGVkCisgICAgICAgICAgICAgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfUFJFQ09ORElUSU9OX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50TG9jay50b2tlbnMuYWRkKGxvY2tUb2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrID0gcHJlc2VudExvY2s7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgbG9jay50b2tlbnMuYWRkKGxvY2tUb2tlbik7CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTG9ja3MucHV0KGxvY2sucGF0aCwgbG9jayk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tpbmcgaWYgYSByZXNvdXJjZSBleGlzdHMgYXQgdGhpcyBwYXRoCisgICAgICAgICAgICAgICAgICAgIGV4aXN0cyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSByZXNvdXJjZXMubG9va3VwKHBhdGgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdHMpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gIkNyZWF0aW5nIiBhIGxvY2stbnVsbCByZXNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNsYXNoID0gbG9jay5wYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyZW50UGF0aCA9IGxvY2sucGF0aC5zdWJzdHJpbmcoMCwgc2xhc2gpOworCisgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGxvY2tOdWxscyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExpc3QpIGxvY2tOdWxsUmVzb3VyY2VzLmdldChwYXJlbnRQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NrTnVsbHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tOdWxscyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrTnVsbFJlc291cmNlcy5wdXQocGFyZW50UGF0aCwgbG9ja051bGxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgbG9ja051bGxzLmFkZChsb2NrLnBhdGgpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBMb2NrLVRva2VuIGhlYWRlciBhcyBieSBSRkMgMjUxOCA4LjEwLjEKKyAgICAgICAgICAgICAgICAgICAgLy8gLSBvbmx5IGRvIHRoaXMgZm9yIG5ld2x5IGNyZWF0ZWQgbG9ja3MKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5hZGRIZWFkZXIoIkxvY2stVG9rZW4iLCAiPG9wYXF1ZWxvY2t0b2tlbjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbG9ja1Rva2VuICsgIj4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvY2tSZXF1ZXN0VHlwZSA9PSBMT0NLX1JFRlJFU0gpIHsKKworICAgICAgICAgICAgU3RyaW5nIGlmSGVhZGVyID0gcmVxLmdldEhlYWRlcigiSWYiKTsKKyAgICAgICAgICAgIGlmIChpZkhlYWRlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIGlmSGVhZGVyID0gIiI7CisKKyAgICAgICAgICAgIC8vIENoZWNraW5nIHJlc291cmNlIGxvY2tzCisKKyAgICAgICAgICAgIExvY2tJbmZvIHRvUmVuZXcgPSAoTG9ja0luZm8pIHJlc291cmNlTG9ja3MuZ2V0KHBhdGgpOworICAgICAgICAgICAgaWYgKGxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIEF0IGxlYXN0IG9uZSBvZiB0aGUgdG9rZW5zIG9mIHRoZSBsb2NrcyBtdXN0IGhhdmUgYmVlbiBnaXZlbgorICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB0b1JlbmV3LnRva2Vucy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlmSGVhZGVyLmluZGV4T2YodG9rZW4pICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b1JlbmV3LmV4cGlyZXNBdCA9IGxvY2suZXhwaXJlc0F0OworICAgICAgICAgICAgICAgICAgICAgICAgbG9jayA9IHRvUmVuZXc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2tpbmcgaW5oZXJpdGFibGUgY29sbGVjdGlvbiBsb2NrcworICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb25Mb2Nrcy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgdG9SZW5ldyA9IChMb2NrSW5mbykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKHBhdGguZXF1YWxzKHRvUmVuZXcucGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgdG9rZW5JdGVyID0gdG9SZW5ldy50b2tlbnMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRva2VuSXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IChTdHJpbmcpIHRva2VuSXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWZIZWFkZXIuaW5kZXhPZih0b2tlbikgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1JlbmV3LmV4cGlyZXNBdCA9IGxvY2suZXhwaXJlc0F0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sgPSB0b1JlbmV3OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB0aGUgc3RhdHVzLCB0aGVuIGdlbmVyYXRlIHRoZSBYTUwgcmVzcG9uc2UgY29udGFpbmluZworICAgICAgICAvLyB0aGUgbG9jayBpbmZvcm1hdGlvbgorICAgICAgICBYTUxXcml0ZXIgZ2VuZXJhdGVkWE1MID0gbmV3IFhNTFdyaXRlcigpOworICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVYTUxIZWFkZXIoKTsKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdlbmVyYXRlTmFtZXNwYWNlRGVjbGFyYXRpb25zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk9QRU5JTkcpOworCisgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImxvY2tkaXNjb3ZlcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5PUEVOSU5HKTsKKworICAgICAgICBsb2NrLnRvWE1MKGdlbmVyYXRlZFhNTCk7CisKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAibG9ja2Rpc2NvdmVyeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3AiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgcmVzcC5zZXRTdGF0dXMoV2ViZGF2U3RhdHVzLlNDX09LKTsKKyAgICAgICAgcmVzcC5zZXRDb250ZW50VHlwZSgidGV4dC94bWw7IGNoYXJzZXQ9VVRGLTgiKTsKKyAgICAgICAgV3JpdGVyIHdyaXRlciA9IHJlc3AuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci53cml0ZShnZW5lcmF0ZWRYTUwudG9TdHJpbmcoKSk7CisgICAgICAgIHdyaXRlci5jbG9zZSgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVTkxPQ0sgTWV0aG9kLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRvVW5sb2NrKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocmVhZE9ubHkpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19GT1JCSURERU4pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzTG9ja2VkKHJlcSkpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19MT0NLRUQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRSZWxhdGl2ZVBhdGgocmVxKTsKKworICAgICAgICBTdHJpbmcgbG9ja1Rva2VuSGVhZGVyID0gcmVxLmdldEhlYWRlcigiTG9jay1Ub2tlbiIpOworICAgICAgICBpZiAobG9ja1Rva2VuSGVhZGVyID09IG51bGwpCisgICAgICAgICAgICBsb2NrVG9rZW5IZWFkZXIgPSAiIjsKKworICAgICAgICAvLyBDaGVja2luZyByZXNvdXJjZSBsb2NrcworCisgICAgICAgIExvY2tJbmZvIGxvY2sgPSAoTG9ja0luZm8pIHJlc291cmNlTG9ja3MuZ2V0KHBhdGgpOworICAgICAgICBJdGVyYXRvciBpdGVyID0gbnVsbDsKKyAgICAgICAgaWYgKGxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gQXQgbGVhc3Qgb25lIG9mIHRoZSB0b2tlbnMgb2YgdGhlIGxvY2tzIG11c3QgaGF2ZSBiZWVuIGdpdmVuCisgICAgICAgICAgICBpdGVyID0gbG9jay50b2tlbnMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChsb2NrVG9rZW5IZWFkZXIuaW5kZXhPZih0b2tlbikgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsb2NrLnRva2Vucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXNvdXJjZUxvY2tzLnJlbW92ZShwYXRoKTsKKyAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyBhbnkgbG9jay1udWxsIHJlc291cmNlIHdoaWNoIHdvdWxkIGJlIHByZXNlbnQKKyAgICAgICAgICAgICAgICBsb2NrTnVsbFJlc291cmNlcy5yZW1vdmUocGF0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNraW5nIGluaGVyaXRhYmxlIGNvbGxlY3Rpb24gbG9ja3MKKyAgICAgICAgaXRlciA9IGNvbGxlY3Rpb25Mb2Nrcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGxvY2sgPSAoTG9ja0luZm8pIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKHBhdGguZXF1YWxzKGxvY2sucGF0aCkpIHsKKyAgICAgICAgICAgICAgICBJdGVyYXRvciB0b2tlbkl0ZXIgPSBsb2NrLnRva2Vucy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlbkl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IChTdHJpbmcpIHRva2VuSXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2NrVG9rZW5IZWFkZXIuaW5kZXhPZih0b2tlbikgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuSXRlci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxvY2sudG9rZW5zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyBhbnkgbG9jay1udWxsIHJlc291cmNlIHdoaWNoIHdvdWxkIGJlIHByZXNlbnQKKyAgICAgICAgICAgICAgICAgICAgbG9ja051bGxSZXNvdXJjZXMucmVtb3ZlKHBhdGgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVzcC5zZXRTdGF0dXMoV2ViZGF2U3RhdHVzLlNDX05PX0NPTlRFTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvbnRleHQtcmVsYXRpdmUgcGF0aCwgYmVnaW5uaW5nIHdpdGggYSAiLyIsIHRoYXQgcmVwcmVzZW50cworICAgICAqIHRoZSBjYW5vbmljYWwgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWVkIHBhdGggYWZ0ZXIgIi4uIiBhbmQgIi4iIGVsZW1lbnRzCisgICAgICogYXJlIHJlc29sdmVkIG91dC4gIElmIHRoZSBzcGVjaWZpZWQgcGF0aCBhdHRlbXB0cyB0byBnbyBvdXRzaWRlIHRoZQorICAgICAqIGJvdW5kYXJpZXMgb2YgdGhlIGN1cnJlbnQgY29udGV4dCAoaS5lLiB0b28gbWFueSAiLi4iIHBhdGggZWxlbWVudHMKKyAgICAgKiBhcmUgcHJlc2VudCksIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggUGF0aCB0byBiZSBub3JtYWxpemVkCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYSBwbGFjZSBmb3IgdGhlIG5vcm1hbGl6ZWQgcGF0aAorICAgICAgICBTdHJpbmcgbm9ybWFsaXplZCA9IHBhdGg7CisKKyAgICAgICAgaWYgKG5vcm1hbGl6ZWQuZXF1YWxzKCIvLiIpKSB7CisgICAgICAgICAgICByZXR1cm4gIi8iOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBzbGFzaGVzIGFuZCBhZGQgbGVhZGluZyBzbGFzaCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKG5vcm1hbGl6ZWQuaW5kZXhPZignXFwnKSA+PSAwKSB7CisgICAgICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5yZXBsYWNlKCdcXCcsICcvJyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICBub3JtYWxpemVkID0gIi8iICsgbm9ybWFsaXplZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8vIiBpbiB0aGUgbm9ybWFsaXplZCBwYXRoCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBub3JtYWxpemVkLmluZGV4T2YoIi8vIik7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zdWJzdHJpbmcoMCwgaW5kZXgpICsKKyAgICAgICAgICAgICAgICBub3JtYWxpemVkLnN1YnN0cmluZyhpbmRleCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzb2x2ZSBvY2N1cnJlbmNlcyBvZiAiLy4vIiBpbiB0aGUgbm9ybWFsaXplZCBwYXRoCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBub3JtYWxpemVkLmluZGV4T2YoIi8uLyIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDAsIGluZGV4KSArCisgICAgICAgICAgICAgICAgbm9ybWFsaXplZC5zdWJzdHJpbmcoaW5kZXggKyAyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8uLi8iIGluIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IG5vcm1hbGl6ZWQuaW5kZXhPZigiLy4uLyIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOyAgLy8gVHJ5aW5nIHRvIGdvIG91dHNpZGUgb3VyIGNvbnRleHQKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGluZGV4MiA9IG5vcm1hbGl6ZWQubGFzdEluZGV4T2YoJy8nLCBpbmRleCAtIDEpOworICAgICAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDAsIGluZGV4MikgKworICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQuc3Vic3RyaW5nKGluZGV4ICsgMyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gdGhlIG5vcm1hbGl6ZWQgcGF0aCB0aGF0IHdlIGhhdmUgY29tcGxldGVkCisgICAgICAgIHJldHVybiAobm9ybWFsaXplZCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRlTmFtZXNwYWNlRGVjbGFyYXRpb25zKCkgeworICAgICAgICByZXR1cm4gIiB4bWxucz1cIiIgKyBERUZBVUxUX05BTUVTUEFDRSArICJcIiI7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0byBzZWUgaWYgYSByZXNvdXJjZSBpcyBjdXJyZW50bHkgd3JpdGUgbG9ja2VkLiBUaGUgbWV0aG9kCisgICAgICogd2lsbCBsb29rIGF0IHRoZSAiSWYiIGhlYWRlciB0byBtYWtlIHN1cmUgdGhlIGNsaWVudAorICAgICAqIGhhcyBnaXZlIHRoZSBhcHByb3ByaWF0ZSBsb2NrIHRva2Vucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXEgU2VydmxldCByZXF1ZXN0CisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIHJlc291cmNlIGlzIGxvY2tlZCAoYW5kIG5vIGFwcHJvcHJpYXRlCisgICAgICogbG9jayB0b2tlbiBoYXMgYmVlbiBmb3VuZCBmb3IgYXQgbGVhc3Qgb25lIG9mIHRoZSBub24tc2hhcmVkIGxvY2tzIHdoaWNoCisgICAgICogYXJlIHByZXNlbnQgb24gdGhlIHJlc291cmNlKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2NrZWQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFJlbGF0aXZlUGF0aChyZXEpOworCisgICAgICAgIFN0cmluZyBpZkhlYWRlciA9IHJlcS5nZXRIZWFkZXIoIklmIik7CisgICAgICAgIGlmIChpZkhlYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBpZkhlYWRlciA9ICIiOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGxvY2tUb2tlbkhlYWRlciA9IHJlcS5nZXRIZWFkZXIoIkxvY2stVG9rZW4iKTsKKyAgICAgICAgaWYgKGxvY2tUb2tlbkhlYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2NrVG9rZW5IZWFkZXIgPSAiIjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpc0xvY2tlZChwYXRoLCBpZkhlYWRlciArIGxvY2tUb2tlbkhlYWRlcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0byBzZWUgaWYgYSByZXNvdXJjZSBpcyBjdXJyZW50bHkgd3JpdGUgbG9ja2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gaWZIZWFkZXIgIklmIiBIVFRQIGhlYWRlciB3aGljaCB3YXMgaW5jbHVkZWQgaW4gdGhlIHJlcXVlc3QKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgaXMgbG9ja2VkIChhbmQgbm8gYXBwcm9wcmlhdGUKKyAgICAgKiBsb2NrIHRva2VuIGhhcyBiZWVuIGZvdW5kIGZvciBhdCBsZWFzdCBvbmUgb2YgdGhlIG5vbi1zaGFyZWQgbG9ja3Mgd2hpY2gKKyAgICAgKiBhcmUgcHJlc2VudCBvbiB0aGUgcmVzb3VyY2UpLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0xvY2tlZChTdHJpbmcgcGF0aCwgU3RyaW5nIGlmSGVhZGVyKSB7CisgICAgICAgIC8vIENoZWNraW5nIHJlc291cmNlIGxvY2tzCisgICAgICAgIExvY2tJbmZvIGxvY2sgPSAoTG9ja0luZm8pIHJlc291cmNlTG9ja3MuZ2V0KHBhdGgpOworICAgICAgICBpZiAoKGxvY2sgIT0gbnVsbCkgJiYgKGxvY2suaGFzRXhwaXJlZCgpKSkgeworICAgICAgICAgICAgcmVzb3VyY2VMb2Nrcy5yZW1vdmUocGF0aCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBBdCBsZWFzdCBvbmUgb2YgdGhlIHRva2VucyBvZiB0aGUgbG9ja3MgbXVzdCBoYXZlIGJlZW4gZ2l2ZW4KKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBsb2NrLnRva2Vucy5pdGVyYXRvcigpOworICAgICAgICAgICAgYm9vbGVhbiB0b2tlbk1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoaWZIZWFkZXIuaW5kZXhPZih0b2tlbikgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5NYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXRva2VuTWF0Y2gpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNraW5nIGluaGVyaXRhYmxlIGNvbGxlY3Rpb24gbG9ja3MKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb25Mb2Nrcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGxvY2sgPSAoTG9ja0luZm8pIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGxvY2suaGFzRXhwaXJlZCgpKSB7CisgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5zdGFydHNXaXRoKGxvY2sucGF0aCkpIHsKKyAgICAgICAgICAgICAgICBJdGVyYXRvciB0b2tlbkl0ZXIgPSBsb2NrLnRva2Vucy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gdG9rZW5NYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlbkl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IChTdHJpbmcpIHRva2VuSXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpZkhlYWRlci5pbmRleE9mKHRva2VuKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5NYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIXRva2VuTWF0Y2gpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29weSBhIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcSBTZXJ2bGV0IHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcmVzcCBTZXJ2bGV0IHJlc3BvbnNlCisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIGNvcHkgaXMgc3VjY2Vzc2Z1bAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjb3B5UmVzb3VyY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQYXJzaW5nIGRlc3RpbmF0aW9uIGhlYWRlcgorCisgICAgICAgIFN0cmluZyBkZXN0aW5hdGlvblBhdGggPSByZXEuZ2V0SGVhZGVyKCJEZXN0aW5hdGlvbiIpOworCisgICAgICAgIGlmIChkZXN0aW5hdGlvblBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0JBRF9SRVFVRVNUKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSB1cmwgZW5jb2RpbmcgZnJvbSBkZXN0aW5hdGlvbgorICAgICAgICBkZXN0aW5hdGlvblBhdGggPSBSZXF1ZXN0VXRpbC5VUkxEZWNvZGUoZGVzdGluYXRpb25QYXRoLCAiVVRGOCIpOworCisgICAgICAgIGludCBwcm90b2NvbEluZGV4ID0gZGVzdGluYXRpb25QYXRoLmluZGV4T2YoIjovLyIpOworICAgICAgICBpZiAocHJvdG9jb2xJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgRGVzdGluYXRpb24gVVJMIGNvbnRhaW5zIHRoZSBwcm90b2NvbCwgd2UgY2FuIHNhZmVseQorICAgICAgICAgICAgLy8gdHJpbSBldmVyeXRoaW5nIHVwdG8gdGhlIGZpcnN0ICIvIiBjaGFyYWN0ZXIgYWZ0ZXIgIjovLyIKKyAgICAgICAgICAgIGludCBmaXJzdFNlcGFyYXRvciA9CisgICAgICAgICAgICAgICAgZGVzdGluYXRpb25QYXRoLmluZGV4T2YoIi8iLCBwcm90b2NvbEluZGV4ICsgNCk7CisgICAgICAgICAgICBpZiAoZmlyc3RTZXBhcmF0b3IgPCAwKSB7CisgICAgICAgICAgICAgICAgZGVzdGluYXRpb25QYXRoID0gIi8iOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBhdGggPSBkZXN0aW5hdGlvblBhdGguc3Vic3RyaW5nKGZpcnN0U2VwYXJhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBob3N0TmFtZSA9IHJlcS5nZXRTZXJ2ZXJOYW1lKCk7CisgICAgICAgICAgICBpZiAoKGhvc3ROYW1lICE9IG51bGwpICYmIChkZXN0aW5hdGlvblBhdGguc3RhcnRzV2l0aChob3N0TmFtZSkpKSB7CisgICAgICAgICAgICAgICAgZGVzdGluYXRpb25QYXRoID0gZGVzdGluYXRpb25QYXRoLnN1YnN0cmluZyhob3N0TmFtZS5sZW5ndGgoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBwb3J0SW5kZXggPSBkZXN0aW5hdGlvblBhdGguaW5kZXhPZigiOiIpOworICAgICAgICAgICAgaWYgKHBvcnRJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgZGVzdGluYXRpb25QYXRoID0gZGVzdGluYXRpb25QYXRoLnN1YnN0cmluZyhwb3J0SW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25QYXRoLnN0YXJ0c1dpdGgoIjoiKSkgeworICAgICAgICAgICAgICAgIGludCBmaXJzdFNlcGFyYXRvciA9IGRlc3RpbmF0aW9uUGF0aC5pbmRleE9mKCIvIik7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0U2VwYXJhdG9yIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBhdGggPSAiLyI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25QYXRoID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUGF0aC5zdWJzdHJpbmcoZmlyc3RTZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vcm1hbGlzZSBkZXN0aW5hdGlvbiBwYXRoIChyZW1vdmUgJy4nIGFuZCAnLi4nKQorICAgICAgICBkZXN0aW5hdGlvblBhdGggPSBub3JtYWxpemUoZGVzdGluYXRpb25QYXRoKTsKKworICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSByZXEuZ2V0Q29udGV4dFBhdGgoKTsKKyAgICAgICAgaWYgKChjb250ZXh0UGF0aCAhPSBudWxsKSAmJgorICAgICAgICAgICAgKGRlc3RpbmF0aW9uUGF0aC5zdGFydHNXaXRoKGNvbnRleHRQYXRoKSkpIHsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uUGF0aCA9IGRlc3RpbmF0aW9uUGF0aC5zdWJzdHJpbmcoY29udGV4dFBhdGgubGVuZ3RoKCkpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHBhdGhJbmZvID0gcmVxLmdldFBhdGhJbmZvKCk7CisgICAgICAgIGlmIChwYXRoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgc2VydmxldFBhdGggPSByZXEuZ2V0U2VydmxldFBhdGgoKTsKKyAgICAgICAgICAgIGlmICgoc2VydmxldFBhdGggIT0gbnVsbCkgJiYKKyAgICAgICAgICAgICAgICAoZGVzdGluYXRpb25QYXRoLnN0YXJ0c1dpdGgoc2VydmxldFBhdGgpKSkgeworICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUGF0aCA9IGRlc3RpbmF0aW9uUGF0aAorICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKHNlcnZsZXRQYXRoLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWJ1ZyA+IDApCisgICAgICAgICAgICBsb2coIkRlc3QgcGF0aCA6IiArIGRlc3RpbmF0aW9uUGF0aCk7CisKKyAgICAgICAgaWYgKChkZXN0aW5hdGlvblBhdGgudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCIvV0VCLUlORiIpKSB8fAorICAgICAgICAgICAgKGRlc3RpbmF0aW9uUGF0aC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIi9NRVRBLUlORiIpKSkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0ZPUkJJRERFTik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFJlbGF0aXZlUGF0aChyZXEpOworCisgICAgICAgIGlmICgocGF0aC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIi9XRUItSU5GIikpIHx8CisgICAgICAgICAgICAocGF0aC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIi9NRVRBLUlORiIpKSkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0ZPUkJJRERFTik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzdGluYXRpb25QYXRoLmVxdWFscyhwYXRoKSkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0ZPUkJJRERFTik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJzaW5nIG92ZXJ3cml0ZSBoZWFkZXIKKworICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSA9IHRydWU7CisgICAgICAgIFN0cmluZyBvdmVyd3JpdGVIZWFkZXIgPSByZXEuZ2V0SGVhZGVyKCJPdmVyd3JpdGUiKTsKKworICAgICAgICBpZiAob3ZlcndyaXRlSGVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChvdmVyd3JpdGVIZWFkZXIuZXF1YWxzSWdub3JlQ2FzZSgiVCIpKSB7CisgICAgICAgICAgICAgICAgb3ZlcndyaXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3ZlcndyaXRlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBPdmVyd3JpdGluZyB0aGUgZGVzdGluYXRpb24KKworICAgICAgICBib29sZWFuIGV4aXN0cyA9IHRydWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNvdXJjZXMubG9va3VwKGRlc3RpbmF0aW9uUGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGlzdHMgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdmVyd3JpdGUpIHsKKworICAgICAgICAgICAgLy8gRGVsZXRlIGRlc3RpbmF0aW9uIHJlc291cmNlLCBpZiBpdCBleGlzdHMKKyAgICAgICAgICAgIGlmIChleGlzdHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWRlbGV0ZVJlc291cmNlKGRlc3RpbmF0aW9uUGF0aCwgcmVxLCByZXNwLCB0cnVlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXNwLnNldFN0YXR1cyhXZWJkYXZTdGF0dXMuU0NfQ1JFQVRFRCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8gSWYgdGhlIGRlc3RpbmF0aW9uIGV4aXN0cywgdGhlbiBpdCdzIGEgY29uZmxpY3QKKyAgICAgICAgICAgIGlmIChleGlzdHMpIHsKKyAgICAgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfUFJFQ09ORElUSU9OX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBDb3B5aW5nIHNvdXJjZSB0byBkZXN0aW5hdGlvbgorCisgICAgICAgIEhhc2h0YWJsZSBlcnJvckxpc3QgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBjb3B5UmVzb3VyY2UocmVzb3VyY2VzLCBlcnJvckxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIGRlc3RpbmF0aW9uUGF0aCk7CisKKyAgICAgICAgaWYgKCghcmVzdWx0KSB8fCAoIWVycm9yTGlzdC5pc0VtcHR5KCkpKSB7CisKKyAgICAgICAgICAgIHNlbmRSZXBvcnQocmVxLCByZXNwLCBlcnJvckxpc3QpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmluZyBhbnkgbG9jay1udWxsIHJlc291cmNlIHdoaWNoIHdvdWxkIGJlIHByZXNlbnQgYXQKKyAgICAgICAgLy8gdGhlIGRlc3RpbmF0aW9uIHBhdGgKKyAgICAgICAgbG9ja051bGxSZXNvdXJjZXMucmVtb3ZlKGRlc3RpbmF0aW9uUGF0aCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvcHkgYSBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlcyBSZXNvdXJjZXMgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZAorICAgICAqIEBwYXJhbSBlcnJvckxpc3QgSGFzaHRhYmxlIGNvbnRhaW5pbmcgdGhlIGxpc3Qgb2YgZXJyb3JzIHdoaWNoIG9jY3VycmVkCisgICAgICogZHVyaW5nIHRoZSBjb3B5IG9wZXJhdGlvbgorICAgICAqIEBwYXJhbSBzb3VyY2UgUGF0aCBvZiB0aGUgcmVzb3VyY2UgdG8gYmUgY29waWVkCisgICAgICogQHBhcmFtIGRlc3QgRGVzdGluYXRpb24gcGF0aAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjb3B5UmVzb3VyY2UoRGlyQ29udGV4dCByZXNvdXJjZXMsIEhhc2h0YWJsZSBlcnJvckxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlLCBTdHJpbmcgZGVzdCkgeworCisgICAgICAgIGlmIChkZWJ1ZyA+IDEpCisgICAgICAgICAgICBsb2coIkNvcHk6ICIgKyBzb3VyY2UgKyAiIFRvOiAiICsgZGVzdCk7CisKKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmplY3QgPSByZXNvdXJjZXMubG9va3VwKHNvdXJjZSk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGlyQ29udGV4dCkgeworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlc291cmNlcy5jcmVhdGVTdWJjb250ZXh0KGRlc3QpOworICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlcnJvckxpc3QucHV0CisgICAgICAgICAgICAgICAgICAgIChkZXN0LCBuZXcgSW50ZWdlcihXZWJkYXZTdGF0dXMuU0NfQ09ORkxJQ1QpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTmFtaW5nRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSByZXNvdXJjZXMubGlzdChzb3VyY2UpOworICAgICAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBOYW1lQ2xhc3NQYWlyIG5jUGFpciA9IChOYW1lQ2xhc3NQYWlyKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2hpbGREZXN0ID0gZGVzdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZERlc3QuZXF1YWxzKCIvIikpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERlc3QgKz0gIi8iOworICAgICAgICAgICAgICAgICAgICBjaGlsZERlc3QgKz0gbmNQYWlyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoaWxkU3JjID0gc291cmNlOworICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkU3JjLmVxdWFscygiLyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRTcmMgKz0gIi8iOworICAgICAgICAgICAgICAgICAgICBjaGlsZFNyYyArPSBuY1BhaXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBjb3B5UmVzb3VyY2UocmVzb3VyY2VzLCBlcnJvckxpc3QsIGNoaWxkU3JjLCBjaGlsZERlc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXJyb3JMaXN0LnB1dAorICAgICAgICAgICAgICAgICAgICAoZGVzdCwgbmV3IEludGVnZXIoV2ViZGF2U3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUikpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuYmluZChkZXN0LCBvYmplY3QpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yTGlzdC5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIChzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoV2ViZGF2U3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnJvckxpc3QucHV0CisgICAgICAgICAgICAgICAgICAgIChzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihXZWJkYXZTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVsZXRlIGEgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxIFNlcnZsZXQgcmVxdWVzdAorICAgICAqIEBwYXJhbSByZXNwIFNlcnZsZXQgcmVzcG9uc2UKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgY29weSBpcyBzdWNjZXNzZnVsCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRlbGV0ZVJlc291cmNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFJlbGF0aXZlUGF0aChyZXEpOworCisgICAgICAgIHJldHVybiBkZWxldGVSZXNvdXJjZShwYXRoLCByZXEsIHJlc3AsIHRydWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZWxldGUgYSByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHJlc291cmNlIHdoaWNoIGlzIHRvIGJlIGRlbGV0ZWQKKyAgICAgKiBAcGFyYW0gcmVxIFNlcnZsZXQgcmVxdWVzdAorICAgICAqIEBwYXJhbSByZXNwIFNlcnZsZXQgcmVzcG9uc2UKKyAgICAgKiBAcGFyYW0gc2V0U3RhdHVzIFNob3VsZCB0aGUgcmVzcG9uc2Ugc3RhdHVzIGJlIHNldCBvbiBzdWNjZXNzZnVsCisgICAgICogICAgICAgICAgICAgICAgICBjb21wbGV0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRlbGV0ZVJlc291cmNlKFN0cmluZyBwYXRoLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3AsIGJvb2xlYW4gc2V0U3RhdHVzKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmICgocGF0aC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIi9XRUItSU5GIikpIHx8CisgICAgICAgICAgICAocGF0aC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIi9NRVRBLUlORiIpKSkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0ZPUkJJRERFTik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgaWZIZWFkZXIgPSByZXEuZ2V0SGVhZGVyKCJJZiIpOworICAgICAgICBpZiAoaWZIZWFkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGlmSGVhZGVyID0gIiI7CisKKyAgICAgICAgU3RyaW5nIGxvY2tUb2tlbkhlYWRlciA9IHJlcS5nZXRIZWFkZXIoIkxvY2stVG9rZW4iKTsKKyAgICAgICAgaWYgKGxvY2tUb2tlbkhlYWRlciA9PSBudWxsKQorICAgICAgICAgICAgbG9ja1Rva2VuSGVhZGVyID0gIiI7CisKKyAgICAgICAgaWYgKGlzTG9ja2VkKHBhdGgsIGlmSGVhZGVyICsgbG9ja1Rva2VuSGVhZGVyKSkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0xPQ0tFRCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGV4aXN0cyA9IHRydWU7CisgICAgICAgIE9iamVjdCBvYmplY3QgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqZWN0ID0gcmVzb3VyY2VzLmxvb2t1cChwYXRoKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4aXN0cyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFleGlzdHMpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19OT1RfRk9VTkQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBjb2xsZWN0aW9uID0gKG9iamVjdCBpbnN0YW5jZW9mIERpckNvbnRleHQpOworCisgICAgICAgIGlmICghY29sbGVjdGlvbikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMudW5iaW5kKHBhdGgpOworICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIEhhc2h0YWJsZSBlcnJvckxpc3QgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAgICAgICAgIGRlbGV0ZUNvbGxlY3Rpb24ocmVxLCByZXNvdXJjZXMsIHBhdGgsIGVycm9yTGlzdCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlc291cmNlcy51bmJpbmQocGF0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGVycm9yTGlzdC5wdXQocGF0aCwgbmV3IEludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgKFdlYmRhdlN0YXR1cy5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFlcnJvckxpc3QuaXNFbXB0eSgpKSB7CisKKyAgICAgICAgICAgICAgICBzZW5kUmVwb3J0KHJlcSwgcmVzcCwgZXJyb3JMaXN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGlmIChzZXRTdGF0dXMpIHsKKyAgICAgICAgICAgIHJlc3Auc2V0U3RhdHVzKFdlYmRhdlN0YXR1cy5TQ19OT19DT05URU5UKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVsZXRlcyBhIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIFJlc291cmNlcyBpbXBsZW1lbnRhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIHRoZSBjb2xsZWN0aW9uIHRvIGJlIGRlbGV0ZWQKKyAgICAgKiBAcGFyYW0gZXJyb3JMaXN0IENvbnRhaW5zIHRoZSBsaXN0IG9mIHRoZSBlcnJvcnMgd2hpY2ggb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlQ29sbGVjdGlvbihIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpckNvbnRleHQgcmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoLCBIYXNodGFibGUgZXJyb3JMaXN0KSB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMSkKKyAgICAgICAgICAgIGxvZygiRGVsZXRlOiIgKyBwYXRoKTsKKworICAgICAgICBpZiAoKHBhdGgudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCIvV0VCLUlORiIpKSB8fAorICAgICAgICAgICAgKHBhdGgudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCIvTUVUQS1JTkYiKSkpIHsKKyAgICAgICAgICAgIGVycm9yTGlzdC5wdXQocGF0aCwgbmV3IEludGVnZXIoV2ViZGF2U3RhdHVzLlNDX0ZPUkJJRERFTikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGlmSGVhZGVyID0gcmVxLmdldEhlYWRlcigiSWYiKTsKKyAgICAgICAgaWYgKGlmSGVhZGVyID09IG51bGwpCisgICAgICAgICAgICBpZkhlYWRlciA9ICIiOworCisgICAgICAgIFN0cmluZyBsb2NrVG9rZW5IZWFkZXIgPSByZXEuZ2V0SGVhZGVyKCJMb2NrLVRva2VuIik7CisgICAgICAgIGlmIChsb2NrVG9rZW5IZWFkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvY2tUb2tlbkhlYWRlciA9ICIiOworCisgICAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVudW1lcmF0aW9uID0gcmVzb3VyY2VzLmxpc3QocGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIldlYmRhdlNlcnZsZXQ6IG5hbWluZyBleGNlcHRpb24gbGlzdGluZyByZXNvdXJjZXMgZm9yICIgKyBwYXRoKTsKKyAgICAgICAgICAgIGVycm9yTGlzdC5wdXQocGF0aCwgbmV3IEludGVnZXIKKyAgICAgICAgICAgICAgICAoV2ViZGF2U3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBOYW1lQ2xhc3NQYWlyIG5jUGFpciA9IChOYW1lQ2xhc3NQYWlyKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIGNoaWxkTmFtZSA9IHBhdGg7CisgICAgICAgICAgICBpZiAoIWNoaWxkTmFtZS5lcXVhbHMoIi8iKSkgeworICAgICAgICAgICAgICAgIGNoaWxkTmFtZSArPSAiLyI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNoaWxkTmFtZSArPSBuY1BhaXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKGlzTG9ja2VkKGNoaWxkTmFtZSwgaWZIZWFkZXIgKyBsb2NrVG9rZW5IZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JMaXN0LnB1dChjaGlsZE5hbWUsIG5ldyBJbnRlZ2VyKFdlYmRhdlN0YXR1cy5TQ19MT0NLRUQpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHJlc291cmNlcy5sb29rdXAoY2hpbGROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERpckNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUNvbGxlY3Rpb24ocmVxLCByZXNvdXJjZXMsIGNoaWxkTmFtZSwgZXJyb3JMaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMudW5iaW5kKGNoaWxkTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBEaXJDb250ZXh0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90IGEgY29sbGVjdGlvbiwgdGhlbiBpdCdzIGFuIHVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTGlzdC5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoaWxkTmFtZSwgbmV3IEludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJkYXZTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlcnJvckxpc3QucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAoY2hpbGROYW1lLCBuZXcgSW50ZWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJkYXZTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VuZCBhIG11bHRpc3RhdHVzIGVsZW1lbnQgY29udGFpbmluZyBhIGNvbXBsZXRlIGVycm9yIHJlcG9ydCB0byB0aGUKKyAgICAgKiBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxIFNlcnZsZXQgcmVxdWVzdAorICAgICAqIEBwYXJhbSByZXNwIFNlcnZsZXQgcmVzcG9uc2UKKyAgICAgKiBAcGFyYW0gZXJyb3JzIFRoZSBlcnJvcnMgdG8gYmUgZGlzcGxheWVkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRSZXBvcnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBlcnJvcnMpCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcC5zZXRTdGF0dXMoV2ViZGF2U3RhdHVzLlNDX01VTFRJX1NUQVRVUyk7CisKKyAgICAgICAgU3RyaW5nIGFic29sdXRlVXJpID0gcmVxLmdldFJlcXVlc3RVUkkoKTsKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IGdldFJlbGF0aXZlUGF0aChyZXEpOworCisgICAgICAgIFhNTFdyaXRlciBnZW5lcmF0ZWRYTUwgPSBuZXcgWE1MV3JpdGVyKCk7CisgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVhNTEhlYWRlcigpOworCisgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgIm11bHRpc3RhdHVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2VuZXJhdGVOYW1lc3BhY2VEZWNsYXJhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuT1BFTklORyk7CisKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGVycm9ycy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBlcnJvclBhdGggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGludCBlcnJvckNvZGUgPSAoKEludGVnZXIpIGVycm9ycy5nZXQoZXJyb3JQYXRoKSkuaW50VmFsdWUoKTsKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicmVzcG9uc2UiLCBYTUxXcml0ZXIuT1BFTklORyk7CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImhyZWYiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBTdHJpbmcgdG9BcHBlbmQgPSBlcnJvclBhdGguc3Vic3RyaW5nKHJlbGF0aXZlUGF0aC5sZW5ndGgoKSk7CisgICAgICAgICAgICBpZiAoIXRvQXBwZW5kLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgIHRvQXBwZW5kID0gIi8iICsgdG9BcHBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVUZXh0KGFic29sdXRlVXJpICsgdG9BcHBlbmQpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiaHJlZiIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN0YXR1cyIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTAorICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIkhUVFAvMS4xICIgKyBlcnJvckNvZGUgKyAiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV2ViZGF2U3RhdHVzLmdldFN0YXR1c1RleHQoZXJyb3JDb2RlKSk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInJlc3BvbnNlIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICB9CisKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAibXVsdGlzdGF0dXMiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgV3JpdGVyIHdyaXRlciA9IHJlc3AuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci53cml0ZShnZW5lcmF0ZWRYTUwudG9TdHJpbmcoKSk7CisgICAgICAgIHdyaXRlci5jbG9zZSgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9wZmluZCBoZWxwZXIgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcSBUaGUgc2VydmxldCByZXF1ZXN0CisgICAgICogQHBhcmFtIHJlc291cmNlcyBSZXNvdXJjZXMgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gZ2VuZXJhdGVkWE1MIFhNTCByZXNwb25zZSB0byB0aGUgUHJvcGZpbmQgcmVxdWVzdAorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIGN1cnJlbnQgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gdHlwZSBQcm9wZmluZCB0eXBlCisgICAgICogQHBhcmFtIHByb3BlcnRpZXNWZWN0b3IgSWYgdGhlIHByb3BmaW5kIHR5cGUgaXMgZmluZCBwcm9wZXJ0aWVzIGJ5CisgICAgICogbmFtZSwgdGhlbiB0aGlzIFZlY3RvciBjb250YWlucyB0aG9zZSBwcm9wZXJ0aWVzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUHJvcGVydGllcyhIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyIGdlbmVyYXRlZFhNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoLCBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgcHJvcGVydGllc1ZlY3RvcikgeworCisgICAgICAgIC8vIEV4Y2x1ZGUgYW55IHJlc291cmNlIGluIHRoZSAvV0VCLUlORiBhbmQgL01FVEEtSU5GIHN1YmRpcmVjdG9yaWVzCisgICAgICAgIC8vICh0aGUgInRvVXBwZXJDYXNlKCkiIGF2b2lkcyBwcm9ibGVtcyBvbiBXaW5kb3dzIHN5c3RlbXMpCisgICAgICAgIGlmIChwYXRoLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aCgiL1dFQi1JTkYiKSB8fAorICAgICAgICAgICAgcGF0aC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIi9NRVRBLUlORiIpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIENhY2hlRW50cnkgY2FjaGVFbnRyeSA9IHJlc291cmNlcy5sb29rdXBDYWNoZShwYXRoKTsKKworICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJyZXNwb25zZSIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgU3RyaW5nIHN0YXR1cyA9IG5ldyBTdHJpbmcoIkhUVFAvMS4xICIgKyBXZWJkYXZTdGF0dXMuU0NfT0sgKyAiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXZWJkYXZTdGF0dXMuZ2V0U3RhdHVzVGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViZGF2U3RhdHVzLlNDX09LKSk7CisKKyAgICAgICAgLy8gR2VuZXJhdGluZyBocmVmIGVsZW1lbnQKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiaHJlZiIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKworICAgICAgICBTdHJpbmcgaHJlZiA9IHJlcS5nZXRDb250ZXh0UGF0aCgpICsgcmVxLmdldFNlcnZsZXRQYXRoKCk7CisgICAgICAgIGlmICgoaHJlZi5lbmRzV2l0aCgiLyIpKSAmJiAocGF0aC5zdGFydHNXaXRoKCIvIikpKQorICAgICAgICAgICAgaHJlZiArPSBwYXRoLnN1YnN0cmluZygxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaHJlZiArPSBwYXRoOworICAgICAgICBpZiAoKGNhY2hlRW50cnkuY29udGV4dCAhPSBudWxsKSAmJiAoIWhyZWYuZW5kc1dpdGgoIi8iKSkpCisgICAgICAgICAgICBocmVmICs9ICIvIjsKKworICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVUZXh0KHJld3JpdGVVcmwoaHJlZikpOworCisgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImhyZWYiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgU3RyaW5nIHJlc291cmNlTmFtZSA9IHBhdGg7CisgICAgICAgIGludCBsYXN0U2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgIGlmIChsYXN0U2xhc2ggIT0gLTEpCisgICAgICAgICAgICByZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWUuc3Vic3RyaW5nKGxhc3RTbGFzaCArIDEpOworCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworCisgICAgICAgIGNhc2UgRklORF9BTExfUFJPUCA6CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3BzdGF0IiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcCIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkKKyAgICAgICAgICAgICAgICAobnVsbCwgImNyZWF0aW9uZGF0ZSIsCisgICAgICAgICAgICAgICAgIGdldElTT0NyZWF0aW9uRGF0ZShjYWNoZUVudHJ5LmF0dHJpYnV0ZXMuZ2V0Q3JlYXRpb24oKSkpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiZGlzcGxheW5hbWUiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVEYXRhKHJlc291cmNlTmFtZSk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJkaXNwbGF5bmFtZSIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgIGlmIChjYWNoZUVudHJ5LnJlc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAobnVsbCwgImdldGxhc3Rtb2RpZmllZCIsIEZhc3RIdHRwRGF0ZUZvcm1hdC5mb3JtYXREYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FjaGVFbnRyeS5hdHRyaWJ1dGVzLmdldExhc3RNb2RpZmllZCgpLCBudWxsKSk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgKG51bGwsICJnZXRjb250ZW50bGVuZ3RoIiwKKyAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGNhY2hlRW50cnkuYXR0cmlidXRlcy5nZXRDb250ZW50TGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldE1pbWVUeXBlCisgICAgICAgICAgICAgICAgICAgIChjYWNoZUVudHJ5Lm5hbWUpOworICAgICAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5KG51bGwsICJnZXRjb250ZW50dHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkobnVsbCwgImdldGV0YWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVUYWcoY2FjaGVFbnRyeS5hdHRyaWJ1dGVzKSk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicmVzb3VyY2V0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicmVzb3VyY2V0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJjb2xsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJyZXNvdXJjZXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVQcm9wZXJ0eShudWxsLCAic291cmNlIiwgIiIpOworCisgICAgICAgICAgICBTdHJpbmcgc3VwcG9ydGVkTG9ja3MgPSAiPGxvY2tlbnRyeT4iCisgICAgICAgICAgICAgICAgKyAiPGxvY2tzY29wZT48ZXhjbHVzaXZlLz48L2xvY2tzY29wZT4iCisgICAgICAgICAgICAgICAgKyAiPGxvY2t0eXBlPjx3cml0ZS8+PC9sb2NrdHlwZT4iCisgICAgICAgICAgICAgICAgKyAiPC9sb2NrZW50cnk+IiArICI8bG9ja2VudHJ5PiIKKyAgICAgICAgICAgICAgICArICI8bG9ja3Njb3BlPjxzaGFyZWQvPjwvbG9ja3Njb3BlPiIKKyAgICAgICAgICAgICAgICArICI8bG9ja3R5cGU+PHdyaXRlLz48L2xvY2t0eXBlPiIKKyAgICAgICAgICAgICAgICArICI8L2xvY2tlbnRyeT4iOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3VwcG9ydGVkbG9jayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVRleHQoc3VwcG9ydGVkTG9ja3MpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3VwcG9ydGVkbG9jayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgZ2VuZXJhdGVMb2NrRGlzY292ZXJ5KHBhdGgsIGdlbmVyYXRlZFhNTCk7CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3AiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVUZXh0KHN0YXR1cyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wc3RhdCIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGSU5EX1BST1BFUlRZX05BTUVTIDoKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcHN0YXQiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJjcmVhdGlvbmRhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJkaXNwbGF5bmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgIGlmIChjYWNoZUVudHJ5LnJlc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJnZXRjb250ZW50bGFuZ3VhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImdldGNvbnRlbnRsZW5ndGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImdldGNvbnRlbnR0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJnZXRldGFnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJnZXRsYXN0bW9kaWZpZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicmVzb3VyY2V0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic291cmNlIiwgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAibG9ja2Rpc2NvdmVyeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcCIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN0YXR1cyIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVRleHQoc3RhdHVzKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN0YXR1cyIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3BzdGF0IiwgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZJTkRfQllfUFJPUEVSVFkgOgorCisgICAgICAgICAgICBMaXN0IHByb3BlcnRpZXNOb3RGb3VuZCA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGxpc3Qgb2YgcHJvcGVydGllcworCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wc3RhdCIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3AiLCBYTUxXcml0ZXIuT1BFTklORyk7CisKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBwcm9wZXJ0aWVzVmVjdG9yLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKKworICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoImNyZWF0aW9uZGF0ZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCwgImNyZWF0aW9uZGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SVNPQ3JlYXRpb25EYXRlKGNhY2hlRW50cnkuYXR0cmlidXRlcy5nZXRDcmVhdGlvbigpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoImRpc3BsYXluYW1lIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwsICJkaXNwbGF5bmFtZSIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRGF0YShyZXNvdXJjZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCwgImRpc3BsYXluYW1lIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKCJnZXRjb250ZW50bGFuZ3VhZ2UiKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVFbnRyeS5jb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNOb3RGb3VuZC5hZGQocHJvcGVydHkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiZ2V0Y29udGVudGxhbmd1YWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoImdldGNvbnRlbnRsZW5ndGgiKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVFbnRyeS5jb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNOb3RGb3VuZC5hZGQocHJvcGVydHkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCwgImdldGNvbnRlbnRsZW5ndGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nLnZhbHVlT2YoY2FjaGVFbnRyeS5hdHRyaWJ1dGVzLmdldENvbnRlbnRMZW5ndGgoKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKCJnZXRjb250ZW50dHlwZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZUVudHJ5LmNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc05vdEZvdW5kLmFkZChwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudWxsLCAiZ2V0Y29udGVudHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldE1pbWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYWNoZUVudHJ5Lm5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKCJnZXRldGFnIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlRW50cnkuY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzTm90Rm91bmQuYWRkKHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwsICJnZXRldGFnIiwgZ2V0RVRhZyhjYWNoZUVudHJ5LmF0dHJpYnV0ZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKCJnZXRsYXN0bW9kaWZpZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVFbnRyeS5jb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNOb3RGb3VuZC5hZGQocHJvcGVydHkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCwgImdldGxhc3Rtb2RpZmllZCIsIEZhc3RIdHRwRGF0ZUZvcm1hdC5mb3JtYXREYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FjaGVFbnRyeS5hdHRyaWJ1dGVzLmdldExhc3RNb2RpZmllZCgpLCBudWxsKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscygicmVzb3VyY2V0eXBlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlRW50cnkuY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJyZXNvdXJjZXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJjb2xsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicmVzb3VyY2V0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicmVzb3VyY2V0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoInNvdXJjZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5KG51bGwsICJzb3VyY2UiLCAiIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoInN1cHBvcnRlZGxvY2siKSkgeworICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRMb2NrcyA9ICI8bG9ja2VudHJ5PiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjxsb2Nrc2NvcGU+PGV4Y2x1c2l2ZS8+PC9sb2Nrc2NvcGU+IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGxvY2t0eXBlPjx3cml0ZS8+PC9sb2NrdHlwZT4iCisgICAgICAgICAgICAgICAgICAgICAgICArICI8L2xvY2tlbnRyeT4iICsgIjxsb2NrZW50cnk+IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGxvY2tzY29wZT48c2hhcmVkLz48L2xvY2tzY29wZT4iCisgICAgICAgICAgICAgICAgICAgICAgICArICI8bG9ja3R5cGU+PHdyaXRlLz48L2xvY2t0eXBlPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvbG9ja2VudHJ5PiI7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN1cHBvcnRlZGxvY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlVGV4dChzdXBwb3J0ZWRMb2Nrcyk7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN1cHBvcnRlZGxvY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscygibG9ja2Rpc2NvdmVyeSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZ2VuZXJhdGVMb2NrRGlzY292ZXJ5KHBhdGgsIGdlbmVyYXRlZFhNTCkpCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzTm90Rm91bmQuYWRkKHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzTm90Rm91bmQuYWRkKHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcCIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN0YXR1cyIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVRleHQoc3RhdHVzKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN0YXR1cyIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3BzdGF0IiwgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgICAgICAgICBpZiAocHJvcGVydGllc05vdEZvdW5kLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RyaW5nKCJIVFRQLzEuMSAiICsgV2ViZGF2U3RhdHVzLlNDX05PVF9GT1VORAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICIgKyBXZWJkYXZTdGF0dXMuZ2V0U3RhdHVzVGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdlYmRhdlN0YXR1cy5TQ19OT1RfRk9VTkQpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wc3RhdCIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEl0ZXJhdG9yIG5vdEZvdW5kSXRlciA9IHByb3BlcnRpZXNOb3RGb3VuZC5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChub3RGb3VuZEl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIChudWxsLCAoU3RyaW5nKSBub3RGb3VuZEl0ZXIubmV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN0YXR1cyIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVUZXh0KHN0YXR1cyk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3RhdHVzIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3BzdGF0IiwgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJyZXNwb25zZSIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvcGZpbmQgaGVscGVyIG1ldGhvZC4gRGlzcGF5cyB0aGUgcHJvcGVydGllcyBvZiBhIGxvY2stbnVsbCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgUmVzb3VyY2VzIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250ZXh0CisgICAgICogQHBhcmFtIGdlbmVyYXRlZFhNTCBYTUwgcmVzcG9uc2UgdG8gdGhlIFByb3BmaW5kIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSBjdXJyZW50IHJlc291cmNlCisgICAgICogQHBhcmFtIHR5cGUgUHJvcGZpbmQgdHlwZQorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzVmVjdG9yIElmIHRoZSBwcm9wZmluZCB0eXBlIGlzIGZpbmQgcHJvcGVydGllcyBieQorICAgICAqIG5hbWUsIHRoZW4gdGhpcyBWZWN0b3IgY29udGFpbnMgdGhvc2UgcHJvcGVydGllcworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZUxvY2tOdWxsUHJvcGVydGllcyhIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIgZ2VuZXJhdGVkWE1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCwgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgcHJvcGVydGllc1ZlY3RvcikgeworCisgICAgICAgIC8vIEV4Y2x1ZGUgYW55IHJlc291cmNlIGluIHRoZSAvV0VCLUlORiBhbmQgL01FVEEtSU5GIHN1YmRpcmVjdG9yaWVzCisgICAgICAgIC8vICh0aGUgInRvVXBwZXJDYXNlKCkiIGF2b2lkcyBwcm9ibGVtcyBvbiBXaW5kb3dzIHN5c3RlbXMpCisgICAgICAgIGlmIChwYXRoLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aCgiL1dFQi1JTkYiKSB8fAorICAgICAgICAgICAgcGF0aC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIi9NRVRBLUlORiIpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFJldHJpZXZpbmcgdGhlIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2NrLW51bGwgcmVzb3VyY2UKKyAgICAgICAgTG9ja0luZm8gbG9jayA9IChMb2NrSW5mbykgcmVzb3VyY2VMb2Nrcy5nZXQocGF0aCk7CisKKyAgICAgICAgaWYgKGxvY2sgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJyZXNwb25zZSIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgU3RyaW5nIHN0YXR1cyA9IG5ldyBTdHJpbmcoIkhUVFAvMS4xICIgKyBXZWJkYXZTdGF0dXMuU0NfT0sgKyAiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXZWJkYXZTdGF0dXMuZ2V0U3RhdHVzVGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViZGF2U3RhdHVzLlNDX09LKSk7CisKKyAgICAgICAgLy8gR2VuZXJhdGluZyBocmVmIGVsZW1lbnQKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiaHJlZiIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKworICAgICAgICBTdHJpbmcgYWJzb2x1dGVVcmkgPSByZXEuZ2V0UmVxdWVzdFVSSSgpOworICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gZ2V0UmVsYXRpdmVQYXRoKHJlcSk7CisgICAgICAgIFN0cmluZyB0b0FwcGVuZCA9IHBhdGguc3Vic3RyaW5nKHJlbGF0aXZlUGF0aC5sZW5ndGgoKSk7CisgICAgICAgIGlmICghdG9BcHBlbmQuc3RhcnRzV2l0aCgiLyIpKQorICAgICAgICAgICAgdG9BcHBlbmQgPSAiLyIgKyB0b0FwcGVuZDsKKworICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVUZXh0KHJld3JpdGVVcmwobm9ybWFsaXplKGFic29sdXRlVXJpICsgdG9BcHBlbmQpKSk7CisKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiaHJlZiIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lID0gcGF0aDsKKyAgICAgICAgaW50IGxhc3RTbGFzaCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgaWYgKGxhc3RTbGFzaCAhPSAtMSkKKyAgICAgICAgICAgIHJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZS5zdWJzdHJpbmcobGFzdFNsYXNoICsgMSk7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisKKyAgICAgICAgY2FzZSBGSU5EX0FMTF9QUk9QIDoKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcHN0YXQiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVQcm9wZXJ0eQorICAgICAgICAgICAgICAgIChudWxsLCAiY3JlYXRpb25kYXRlIiwKKyAgICAgICAgICAgICAgICAgZ2V0SVNPQ3JlYXRpb25EYXRlKGxvY2suY3JlYXRpb25EYXRlLmdldFRpbWUoKSkpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudAorICAgICAgICAgICAgICAgIChudWxsLCAiZGlzcGxheW5hbWUiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVEYXRhKHJlc291cmNlTmFtZSk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50CisgICAgICAgICAgICAgICAgKG51bGwsICJkaXNwbGF5bmFtZSIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5KG51bGwsICJnZXRsYXN0bW9kaWZpZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFzdEh0dHBEYXRlRm9ybWF0LmZvcm1hdERhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NrLmNyZWF0aW9uRGF0ZS5nZXRUaW1lKCksIG51bGwpKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5CisgICAgICAgICAgICAgICAgKG51bGwsICJnZXRjb250ZW50bGVuZ3RoIiwgU3RyaW5nLnZhbHVlT2YoMCkpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkobnVsbCwgImdldGNvbnRlbnR0eXBlIiwgIiIpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkobnVsbCwgImdldGV0YWciLCAiIik7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJyZXNvdXJjZXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJsb2NrLW51bGwiLCBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJyZXNvdXJjZXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5KG51bGwsICJzb3VyY2UiLCAiIik7CisKKyAgICAgICAgICAgIFN0cmluZyBzdXBwb3J0ZWRMb2NrcyA9ICI8bG9ja2VudHJ5PiIKKyAgICAgICAgICAgICAgICArICI8bG9ja3Njb3BlPjxleGNsdXNpdmUvPjwvbG9ja3Njb3BlPiIKKyAgICAgICAgICAgICAgICArICI8bG9ja3R5cGU+PHdyaXRlLz48L2xvY2t0eXBlPiIKKyAgICAgICAgICAgICAgICArICI8L2xvY2tlbnRyeT4iICsgIjxsb2NrZW50cnk+IgorICAgICAgICAgICAgICAgICsgIjxsb2Nrc2NvcGU+PHNoYXJlZC8+PC9sb2Nrc2NvcGU+IgorICAgICAgICAgICAgICAgICsgIjxsb2NrdHlwZT48d3JpdGUvPjwvbG9ja3R5cGU+IgorICAgICAgICAgICAgICAgICsgIjwvbG9ja2VudHJ5PiI7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdXBwb3J0ZWRsb2NrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlVGV4dChzdXBwb3J0ZWRMb2Nrcyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdXBwb3J0ZWRsb2NrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgICAgICAgICBnZW5lcmF0ZUxvY2tEaXNjb3ZlcnkocGF0aCwgZ2VuZXJhdGVkWE1MKTsKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcCIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN0YXR1cyIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVRleHQoc3RhdHVzKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN0YXR1cyIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3BzdGF0IiwgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZJTkRfUFJPUEVSVFlfTkFNRVMgOgorCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wc3RhdCIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3AiLCBYTUxXcml0ZXIuT1BFTklORyk7CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImNyZWF0aW9uZGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImRpc3BsYXluYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiZ2V0Y29udGVudGxhbmd1YWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiZ2V0Y29udGVudGxlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImdldGNvbnRlbnR0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiZ2V0ZXRhZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImdldGxhc3Rtb2RpZmllZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInJlc291cmNldHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImxvY2tkaXNjb3ZlcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3AiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVUZXh0KHN0YXR1cyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wc3RhdCIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGSU5EX0JZX1BST1BFUlRZIDoKKworICAgICAgICAgICAgTGlzdCBwcm9wZXJ0aWVzTm90Rm91bmQgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBsaXN0IG9mIHByb3BlcnRpZXMKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcHN0YXQiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworCisgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gcHJvcGVydGllc1ZlY3Rvci5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuZXF1YWxzKCJjcmVhdGlvbmRhdGUiKSkgeworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwsICJjcmVhdGlvbmRhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldElTT0NyZWF0aW9uRGF0ZShsb2NrLmNyZWF0aW9uRGF0ZS5nZXRUaW1lKCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscygiZGlzcGxheW5hbWUiKSkgeworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCwgImRpc3BsYXluYW1lIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVEYXRhKHJlc291cmNlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIChudWxsLCAiZGlzcGxheW5hbWUiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoImdldGNvbnRlbnRsYW5ndWFnZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImdldGNvbnRlbnRsYW5ndWFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKCJnZXRjb250ZW50bGVuZ3RoIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgIChudWxsLCAiZ2V0Y29udGVudGxlbmd0aCIsIChTdHJpbmcudmFsdWVPZigwKSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKCJnZXRjb250ZW50dHlwZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCwgImdldGNvbnRlbnR0eXBlIiwgIiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKCJnZXRldGFnIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkobnVsbCwgImdldGV0YWciLCAiIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoImdldGxhc3Rtb2RpZmllZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCwgImdldGxhc3Rtb2RpZmllZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RIdHRwRGF0ZUZvcm1hdC5mb3JtYXREYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2suY3JlYXRpb25EYXRlLmdldFRpbWUoKSwgbnVsbCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKCJyZXNvdXJjZXR5cGUiKSkgeworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJyZXNvdXJjZXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAibG9jay1udWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInJlc291cmNldHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKCJzb3VyY2UiKSkgeworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVQcm9wZXJ0eShudWxsLCAic291cmNlIiwgIiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKCJzdXBwb3J0ZWRsb2NrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkTG9ja3MgPSAiPGxvY2tlbnRyeT4iCisgICAgICAgICAgICAgICAgICAgICAgICArICI8bG9ja3Njb3BlPjxleGNsdXNpdmUvPjwvbG9ja3Njb3BlPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjxsb2NrdHlwZT48d3JpdGUvPjwvbG9ja3R5cGU+IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9sb2NrZW50cnk+IiArICI8bG9ja2VudHJ5PiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjxsb2Nrc2NvcGU+PHNoYXJlZC8+PC9sb2Nrc2NvcGU+IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGxvY2t0eXBlPjx3cml0ZS8+PC9sb2NrdHlwZT4iCisgICAgICAgICAgICAgICAgICAgICAgICArICI8L2xvY2tlbnRyeT4iOworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdXBwb3J0ZWRsb2NrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVRleHQoc3VwcG9ydGVkTG9ja3MpOworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdXBwb3J0ZWRsb2NrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoImxvY2tkaXNjb3ZlcnkiKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWdlbmVyYXRlTG9ja0Rpc2NvdmVyeShwYXRoLCBnZW5lcmF0ZWRYTUwpKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc05vdEZvdW5kLmFkZChwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc05vdEZvdW5kLmFkZChwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3AiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVUZXh0KHN0YXR1cyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wc3RhdCIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNOb3RGb3VuZC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0cmluZygiSFRUUC8xLjEgIiArIFdlYmRhdlN0YXR1cy5TQ19OT1RfRk9VTkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAiICsgV2ViZGF2U3RhdHVzLmdldFN0YXR1c1RleHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJkYXZTdGF0dXMuU0NfTk9UX0ZPVU5EKSk7CisKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wc3RhdCIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworCisgICAgICAgICAgICAgICAgSXRlcmF0b3Igbm90Rm91bmRJdGVyID0gcHJvcGVydGllc05vdEZvdW5kLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKG5vdEZvdW5kSXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwsIChTdHJpbmcpIG5vdEZvdW5kSXRlci5uZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3AiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3RhdHVzIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVRleHQoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcHN0YXQiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInJlc3BvbnNlIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcmludCB0aGUgbG9jayBkaXNjb3ZlcnkgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFBhdGgKKyAgICAgKiBAcGFyYW0gZ2VuZXJhdGVkWE1MIFhNTCBkYXRhIHRvIHdoaWNoIHRoZSBsb2NrcyBpbmZvIHdpbGwgYmUgYXBwZW5kZWQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIGxvY2sgd2FzIGRpc3BsYXllZAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZUxvY2tEaXNjb3ZlcnkKKyAgICAgICAgKFN0cmluZyBwYXRoLCBYTUxXcml0ZXIgZ2VuZXJhdGVkWE1MKSB7CisgICAgICAgIGJvb2xlYW4gd3JvdGVTdGFydCA9IGZhbHNlOworCisgICAgICAgIExvY2tJbmZvIHJlc291cmNlTG9jayA9IChMb2NrSW5mbykgcmVzb3VyY2VMb2Nrcy5nZXQocGF0aCk7CisgICAgICAgIGlmIChyZXNvdXJjZUxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JvdGVTdGFydCA9IHRydWU7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJsb2NrZGlzY292ZXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgcmVzb3VyY2VMb2NrLnRvWE1MKGdlbmVyYXRlZFhNTCk7CisgICAgICAgIH0KKworICAgICAgICBJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbkxvY2tzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgTG9ja0luZm8gY3VycmVudExvY2sgPSAoTG9ja0luZm8pIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChjdXJyZW50TG9jay5wYXRoKSkgeworICAgICAgICAgICAgICAgIGlmICghd3JvdGVTdGFydCkgeworICAgICAgICAgICAgICAgICAgICB3cm90ZVN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAibG9ja2Rpc2NvdmVyeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJyZW50TG9jay50b1hNTChnZW5lcmF0ZWRYTUwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHdyb3RlU3RhcnQpIHsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImxvY2tkaXNjb3ZlcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IGNyZWF0aW9uIGRhdGUgaW4gSVNPIGZvcm1hdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRJU09DcmVhdGlvbkRhdGUobG9uZyBjcmVhdGlvbkRhdGUpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGNyZWF0aW9uRGF0ZVZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcgorICAgICAgICAgICAgKGNyZWF0aW9uRGF0ZUZvcm1hdC5mb3JtYXQKKyAgICAgICAgICAgICAobmV3IERhdGUoY3JlYXRpb25EYXRlKSkpOworICAgICAgICAvKgorICAgICAgICBpbnQgb2Zmc2V0ID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lWm9uZSgpLmdldFJhd09mZnNldCgpCisgICAgICAgICAgICAvIDM2MDAwMDA7IC8vIEZJWE1FID8KKyAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgICAgIGNyZWF0aW9uRGF0ZVZhbHVlLmFwcGVuZCgiLSIpOworICAgICAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKKyAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICAgICAgICBjcmVhdGlvbkRhdGVWYWx1ZS5hcHBlbmQoIisiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCAxMCkKKyAgICAgICAgICAgICAgICBjcmVhdGlvbkRhdGVWYWx1ZS5hcHBlbmQoIjAiKTsKKyAgICAgICAgICAgIGNyZWF0aW9uRGF0ZVZhbHVlLmFwcGVuZChvZmZzZXQgKyAiOjAwIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjcmVhdGlvbkRhdGVWYWx1ZS5hcHBlbmQoIloiKTsKKyAgICAgICAgfQorICAgICAgICAqLworICAgICAgICByZXR1cm4gY3JlYXRpb25EYXRlVmFsdWUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHRoZSBtZXRob2RzIG5vcm1hbGx5IGFsbG93ZWQgZm9yIHRoZSByZXNvdXJjZS4KKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGRldGVybWluZU1ldGhvZHNBbGxvd2VkKERpckNvbnRleHQgcmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgbWV0aG9kc0FsbG93ZWQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJvb2xlYW4gZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFJlbGF0aXZlUGF0aChyZXEpOworCisgICAgICAgICAgICBvYmplY3QgPSByZXNvdXJjZXMubG9va3VwKHBhdGgpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXhpc3RzID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWV4aXN0cykgeworICAgICAgICAgICAgbWV0aG9kc0FsbG93ZWQuYXBwZW5kKCJPUFRJT05TLCBNS0NPTCwgUFVULCBMT0NLIik7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kc0FsbG93ZWQ7CisgICAgICAgIH0KKworICAgICAgICBtZXRob2RzQWxsb3dlZC5hcHBlbmQoIk9QVElPTlMsIEdFVCwgSEVBRCwgUE9TVCwgREVMRVRFLCBUUkFDRSIpOworICAgICAgICBtZXRob2RzQWxsb3dlZC5hcHBlbmQoIiwgUFJPUFBBVENILCBDT1BZLCBNT1ZFLCBMT0NLLCBVTkxPQ0siKTsKKworICAgICAgICBpZiAobGlzdGluZ3MpIHsKKyAgICAgICAgICAgIG1ldGhvZHNBbGxvd2VkLmFwcGVuZCgiLCBQUk9QRklORCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRGlyQ29udGV4dCkpIHsKKyAgICAgICAgICAgIG1ldGhvZHNBbGxvd2VkLmFwcGVuZCgiLCBQVVQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtZXRob2RzQWxsb3dlZDsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgTG9ja0luZm8gSW5uZXIgQ2xhc3MKKworCisgICAgLyoqCisgICAgICogSG9sZHMgYSBsb2NrIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgTG9ja0luZm8geworCisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMb2NrSW5mbygpIHsKKworICAgICAgICB9CisKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAgICAgU3RyaW5nIHBhdGggPSAiLyI7CisgICAgICAgIFN0cmluZyB0eXBlID0gIndyaXRlIjsKKyAgICAgICAgU3RyaW5nIHNjb3BlID0gImV4Y2x1c2l2ZSI7CisgICAgICAgIGludCBkZXB0aCA9IDA7CisgICAgICAgIFN0cmluZyBvd25lciA9ICIiOworICAgICAgICBMaXN0IHRva2VucyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgbG9uZyBleHBpcmVzQXQgPSAwOworICAgICAgICBEYXRlIGNyZWF0aW9uRGF0ZSA9IG5ldyBEYXRlKCk7CisKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGxvY2sgdG9rZW4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gICJUeXBlOiIgKyB0eXBlICsgIlxuIjsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiU2NvcGU6IiArIHNjb3BlICsgIlxuIjsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiRGVwdGg6IiArIGRlcHRoICsgIlxuIjsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiT3duZXI6IiArIG93bmVyICsgIlxuIjsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiRXhwaXJhdGlvbjoiCisgICAgICAgICAgICAgICAgKyBGYXN0SHR0cERhdGVGb3JtYXQuZm9ybWF0RGF0ZShleHBpcmVzQXQsIG51bGwpICsgIlxuIjsKKworICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IHRva2Vucy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICJUb2tlbjoiICsgaXRlci5uZXh0KCkgKyAiXG4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBsb2NrIGhhcyBleHBpcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRXhwaXJlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPiBleHBpcmVzQXQpOworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGxvY2sgaXMgZXhjbHVzaXZlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFeGNsdXNpdmUoKSB7CisKKyAgICAgICAgICAgIHJldHVybiAoc2NvcGUuZXF1YWxzKCJleGNsdXNpdmUiKSk7CisKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBsb2NrIHRva2VuLiBUaGlzIG1ldGhvZCB3aWxsCisgICAgICAgICAqIGFwcGVuZCBhbiBYTUwgZnJhZ21lbnQgdG8gdGhlIGdpdmVuIFhNTCB3cml0ZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB0b1hNTChYTUxXcml0ZXIgZ2VuZXJhdGVkWE1MKSB7CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImFjdGl2ZWxvY2siLCBYTUxXcml0ZXIuT1BFTklORyk7CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImxvY2t0eXBlIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCB0eXBlLCBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJsb2NrdHlwZSIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAibG9ja3Njb3BlIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCBzY29wZSwgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAibG9ja3Njb3BlIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJkZXB0aCIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgIGlmIChkZXB0aCA9PSBJTkZJTklUWSkgeworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVRleHQoIkluZmluaXR5Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVRleHQoIjAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImRlcHRoIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJvd25lciIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVRleHQob3duZXIpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAib3duZXIiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInRpbWVvdXQiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBsb25nIHRpbWVvdXQgPSAoZXhwaXJlc0F0IC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpIC8gMTAwMDsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVRleHQoIlNlY29uZC0iICsgdGltZW91dCk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJ0aW1lb3V0IiwgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJsb2NrdG9rZW4iLCBYTUxXcml0ZXIuT1BFTklORyk7CisKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB0b2tlbnMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImhyZWYiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlVGV4dCgib3BhcXVlbG9ja3Rva2VuOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaXRlci5uZXh0KCkpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImhyZWYiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJsb2NrdG9rZW4iLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImFjdGl2ZWxvY2siLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgfQorCisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0eSBJbm5lciBDbGFzcworCisKKyAgICBwcml2YXRlIGNsYXNzIFByb3BlcnR5IHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsdWU7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZXNwYWNlOworICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWVzcGFjZUFiYnJldjsKKyAgICAgICAgcHVibGljIGludCBzdGF0dXMgPSBXZWJkYXZTdGF0dXMuU0NfT0s7CisKKyAgICB9CisKKworfTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgV2ViZGF2U3RhdHVzIENsYXNzCisKKworLyoqCisgKiBXcmFwcyB0aGUgSHR0cFNlcnZsZXRSZXNwb25zZSBjbGFzcyB0byBhYnN0cmFjdCB0aGUKKyAqIHNwZWNpZmljIHByb3RvY29sIHVzZWQuICBUbyBzdXBwb3J0IG90aGVyIHByb3RvY29scworICogd2Ugd291bGQgb25seSBuZWVkIHRvIG1vZGlmeSB0aGlzIGNsYXNzIGFuZCB0aGUKKyAqIFdlYkRhdlJldENvZGUgY2xhc3Nlcy4KKyAqCisgKiBAYXV0aG9yICAgICAgICAgICAgICBNYXJjIEVhZGR5CisgKiBAdmVyc2lvbiAgICAgICAgICAgICAxLjAsIDE2IE5vdiAxOTk3CisgKi8KK2NsYXNzIFdlYmRhdlN0YXR1cyB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGlzIEhhc2h0YWJsZSBjb250YWlucyB0aGUgbWFwcGluZyBvZiBIVFRQIGFuZCBXZWJEQVYKKyAgICAgKiBzdGF0dXMgY29kZXMgdG8gZGVzY3JpcHRpdmUgdGV4dC4gIFRoaXMgaXMgYSBzdGF0aWMKKyAgICAgKiB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgbWFwU3RhdHVzQ29kZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIVFRQIFN0YXR1cyBDb2RlcworCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMjAwKSBpbmRpY2F0aW5nIHRoZSByZXF1ZXN0IHN1Y2NlZWRlZCBub3JtYWxseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19PSyA9IEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0s7CisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgyMDEpIGluZGljYXRpbmcgdGhlIHJlcXVlc3Qgc3VjY2VlZGVkIGFuZCBjcmVhdGVkCisgICAgICogYSBuZXcgcmVzb3VyY2Ugb24gdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19DUkVBVEVEID0gSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19DUkVBVEVEOworCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMjAyKSBpbmRpY2F0aW5nIHRoYXQgYSByZXF1ZXN0IHdhcyBhY2NlcHRlZCBmb3IKKyAgICAgKiBwcm9jZXNzaW5nLCBidXQgd2FzIG5vdCBjb21wbGV0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfQUNDRVBURUQgPSBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0FDQ0VQVEVEOworCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMjA0KSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3Qgc3VjY2VlZGVkIGJ1dCB0aGF0CisgICAgICogdGhlcmUgd2FzIG5vIG5ldyBpbmZvcm1hdGlvbiB0byByZXR1cm4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTk9fQ09OVEVOVCA9IEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9fQ09OVEVOVDsKKworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDMwMSkgaW5kaWNhdGluZyB0aGF0IHRoZSByZXNvdXJjZSBoYXMgcGVybWFuZW50bHkKKyAgICAgKiBtb3ZlZCB0byBhIG5ldyBsb2NhdGlvbiwgYW5kIHRoYXQgZnV0dXJlIHJlZmVyZW5jZXMgc2hvdWxkIHVzZSBhCisgICAgICogbmV3IFVSSSB3aXRoIHRoZWlyIHJlcXVlc3RzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX01PVkVEX1BFUk1BTkVOVExZID0KKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19NT1ZFRF9QRVJNQU5FTlRMWTsKKworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDMwMikgaW5kaWNhdGluZyB0aGF0IHRoZSByZXNvdXJjZSBoYXMgdGVtcG9yYXJpbHkKKyAgICAgKiBtb3ZlZCB0byBhbm90aGVyIGxvY2F0aW9uLCBidXQgdGhhdCBmdXR1cmUgcmVmZXJlbmNlcyBzaG91bGQKKyAgICAgKiBzdGlsbCB1c2UgdGhlIG9yaWdpbmFsIFVSSSB0byBhY2Nlc3MgdGhlIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX01PVkVEX1RFTVBPUkFSSUxZID0KKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19NT1ZFRF9URU1QT1JBUklMWTsKKworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDMwNCkgaW5kaWNhdGluZyB0aGF0IGEgY29uZGl0aW9uYWwgR0VUIG9wZXJhdGlvbgorICAgICAqIGZvdW5kIHRoYXQgdGhlIHJlc291cmNlIHdhcyBhdmFpbGFibGUgYW5kIG5vdCBtb2RpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19OT1RfTU9ESUZJRUQgPQorICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9NT0RJRklFRDsKKworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQwMCkgaW5kaWNhdGluZyB0aGUgcmVxdWVzdCBzZW50IGJ5IHRoZSBjbGllbnQgd2FzCisgICAgICogc3ludGFjdGljYWxseSBpbmNvcnJlY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfQkFEX1JFUVVFU1QgPQorICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUOworCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDAxKSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3QgcmVxdWlyZXMgSFRUUAorICAgICAqIGF1dGhlbnRpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1VOQVVUSE9SSVpFRCA9CisgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEOworCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDAzKSBpbmRpY2F0aW5nIHRoZSBzZXJ2ZXIgdW5kZXJzdG9vZCB0aGUgcmVxdWVzdAorICAgICAqIGJ1dCByZWZ1c2VkIHRvIGZ1bGZpbGwgaXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfRk9SQklEREVOID0gSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19GT1JCSURERU47CisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MDQpIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGlzIG5vdAorICAgICAqIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19OT1RfRk9VTkQgPSBIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORDsKKworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDUwMCkgaW5kaWNhdGluZyBhbiBlcnJvciBpbnNpZGUgdGhlIEhUVFAgc2VydmljZQorICAgICAqIHdoaWNoIHByZXZlbnRlZCBpdCBmcm9tIGZ1bGZpbGxpbmcgdGhlIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SID0KKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg1MDEpIGluZGljYXRpbmcgdGhlIEhUVFAgc2VydmljZSBkb2VzIG5vdCBzdXBwb3J0CisgICAgICogdGhlIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIHRvIGZ1bGZpbGwgdGhlIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTk9UX0lNUExFTUVOVEVEID0KKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfSU1QTEVNRU5URUQ7CisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg1MDIpIGluZGljYXRpbmcgdGhhdCB0aGUgSFRUUCBzZXJ2ZXIgcmVjZWl2ZWQgYW4KKyAgICAgKiBpbnZhbGlkIHJlc3BvbnNlIGZyb20gYSBzZXJ2ZXIgaXQgY29uc3VsdGVkIHdoZW4gYWN0aW5nIGFzIGEKKyAgICAgKiBwcm94eSBvciBnYXRld2F5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0JBRF9HQVRFV0FZID0KKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfR0FURVdBWTsKKworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDUwMykgaW5kaWNhdGluZyB0aGF0IHRoZSBIVFRQIHNlcnZpY2UgaXMKKyAgICAgKiB0ZW1wb3JhcmlseSBvdmVybG9hZGVkLCBhbmQgdW5hYmxlIHRvIGhhbmRsZSB0aGUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19TRVJWSUNFX1VOQVZBSUxBQkxFID0KKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19TRVJWSUNFX1VOQVZBSUxBQkxFOworCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMTAwKSBpbmRpY2F0aW5nIHRoZSBjbGllbnQgbWF5IGNvbnRpbnVlIHdpdGgKKyAgICAgKiBpdHMgcmVxdWVzdC4gIFRoaXMgaW50ZXJpbSByZXNwb25zZSBpcyB1c2VkIHRvIGluZm9ybSB0aGUKKyAgICAgKiBjbGllbnQgdGhhdCB0aGUgaW5pdGlhbCBwYXJ0IG9mIHRoZSByZXF1ZXN0IGhhcyBiZWVuCisgICAgICogcmVjZWl2ZWQgYW5kIGhhcyBub3QgeWV0IGJlZW4gcmVqZWN0ZWQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19DT05USU5VRSA9IDEwMDsKKworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQwNSkgaW5kaWNhdGluZyB0aGUgbWV0aG9kIHNwZWNpZmllZCBpcyBub3QKKyAgICAgKiBhbGxvd2VkIGZvciB0aGUgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTUVUSE9EX05PVF9BTExPV0VEID0gNDA1OworCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDA5KSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3QgY291bGQgbm90IGJlCisgICAgICogY29tcGxldGVkIGR1ZSB0byBhIGNvbmZsaWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCisgICAgICogcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfQ09ORkxJQ1QgPSA0MDk7CisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MTIpIGluZGljYXRpbmcgdGhlIHByZWNvbmRpdGlvbiBnaXZlbiBpbiBvbmUKKyAgICAgKiBvciBtb3JlIG9mIHRoZSByZXF1ZXN0LWhlYWRlciBmaWVsZHMgZXZhbHVhdGVkIHRvIGZhbHNlCisgICAgICogd2hlbiBpdCB3YXMgdGVzdGVkIG9uIHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfUFJFQ09ORElUSU9OX0ZBSUxFRCA9IDQxMjsKKworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQxMykgaW5kaWNhdGluZyB0aGUgc2VydmVyIGlzIHJlZnVzaW5nIHRvCisgICAgICogcHJvY2VzcyBhIHJlcXVlc3QgYmVjYXVzZSB0aGUgcmVxdWVzdCBlbnRpdHkgaXMgbGFyZ2VyCisgICAgICogdGhhbiB0aGUgc2VydmVyIGlzIHdpbGxpbmcgb3IgYWJsZSB0byBwcm9jZXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1JFUVVFU1RfVE9PX0xPTkcgPSA0MTM7CisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MTUpIGluZGljYXRpbmcgdGhlIHNlcnZlciBpcyByZWZ1c2luZyB0byBzZXJ2aWNlCisgICAgICogdGhlIHJlcXVlc3QgYmVjYXVzZSB0aGUgZW50aXR5IG9mIHRoZSByZXF1ZXN0IGlzIGluIGEgZm9ybWF0CisgICAgICogbm90IHN1cHBvcnRlZCBieSB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGZvciB0aGUgcmVxdWVzdGVkCisgICAgICogbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1VOU1VQUE9SVEVEX01FRElBX1RZUEUgPSA0MTU7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV4dGVuZGVkIFdlYkRhdiBzdGF0dXMgY29kZQorCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMjA3KSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlc3BvbnNlIHJlcXVpcmVzCisgICAgICogcHJvdmlkaW5nIHN0YXR1cyBmb3IgbXVsdGlwbGUgaW5kZXBlbmRlbnQgb3BlcmF0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19NVUxUSV9TVEFUVVMgPSAyMDc7CisgICAgLy8gVGhpcyBvbmUgY29saWRlcyB3aXRoIEhUVFAgMS4xCisgICAgLy8gIjIwNyBQYXJpdGFsIFVwZGF0ZSBPSyIKKworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQxOCkgaW5kaWNhdGluZyB0aGUgZW50aXR5IGJvZHkgc3VibWl0dGVkIHdpdGgKKyAgICAgKiB0aGUgUEFUQ0ggbWV0aG9kIHdhcyBub3QgdW5kZXJzdG9vZCBieSB0aGUgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfVU5QUk9DRVNTQUJMRV9FTlRJVFkgPSA0MTg7CisgICAgLy8gVGhpcyBvbmUgY29saWRlcyB3aXRoIEhUVFAgMS4xCisgICAgLy8gIjQxOCBSZWF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkIgorCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDE5KSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlc291cmNlIGRvZXMgbm90IGhhdmUKKyAgICAgKiBzdWZmaWNpZW50IHNwYWNlIHRvIHJlY29yZCB0aGUgc3RhdGUgb2YgdGhlIHJlc291cmNlIGFmdGVyIHRoZQorICAgICAqIGV4ZWN1dGlvbiBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19JTlNVRkZJQ0lFTlRfU1BBQ0VfT05fUkVTT1VSQ0UgPSA0MTk7CisgICAgLy8gVGhpcyBvbmUgY29saWRlcyB3aXRoIEhUVFAgMS4xCisgICAgLy8gIjQxOSBQcm94eSBSZWF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkIgorCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDIwKSBpbmRpY2F0aW5nIHRoZSBtZXRob2Qgd2FzIG5vdCBleGVjdXRlZCBvbgorICAgICAqIGEgcGFydGljdWxhciByZXNvdXJjZSB3aXRoaW4gaXRzIHNjb3BlIGJlY2F1c2Ugc29tZSBwYXJ0IG9mCisgICAgICogdGhlIG1ldGhvZCdzIGV4ZWN1dGlvbiBmYWlsZWQgY2F1c2luZyB0aGUgZW50aXJlIG1ldGhvZCB0byBiZQorICAgICAqIGFib3J0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTUVUSE9EX0ZBSUxVUkUgPSA0MjA7CisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MjMpIGluZGljYXRpbmcgdGhlIGRlc3RpbmF0aW9uIHJlc291cmNlIG9mIGEKKyAgICAgKiBtZXRob2QgaXMgbG9ja2VkLCBhbmQgZWl0aGVyIHRoZSByZXF1ZXN0IGRpZCBub3QgY29udGFpbiBhCisgICAgICogdmFsaWQgTG9jay1JbmZvIGhlYWRlciwgb3IgdGhlIExvY2stSW5mbyBoZWFkZXIgaWRlbnRpZmllcworICAgICAqIGEgbG9jayBoZWxkIGJ5IGFub3RoZXIgcHJpbmNpcGFsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0xPQ0tFRCA9IDQyMzsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluaXRpYWxpemVyCisKKworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIEhUVFAgMS4wIHRhdHVzIENvZGUKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19PSywgIk9LIik7CisgICAgICAgIGFkZFN0YXR1c0NvZGVNYXAoU0NfQ1JFQVRFRCwgIkNyZWF0ZWQiKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19BQ0NFUFRFRCwgIkFjY2VwdGVkIik7CisgICAgICAgIGFkZFN0YXR1c0NvZGVNYXAoU0NfTk9fQ09OVEVOVCwgIk5vIENvbnRlbnQiKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19NT1ZFRF9QRVJNQU5FTlRMWSwgIk1vdmVkIFBlcm1hbmVudGx5Iik7CisgICAgICAgIGFkZFN0YXR1c0NvZGVNYXAoU0NfTU9WRURfVEVNUE9SQVJJTFksICJNb3ZlZCBUZW1wb3JhcmlseSIpOworICAgICAgICBhZGRTdGF0dXNDb2RlTWFwKFNDX05PVF9NT0RJRklFRCwgIk5vdCBNb2RpZmllZCIpOworICAgICAgICBhZGRTdGF0dXNDb2RlTWFwKFNDX0JBRF9SRVFVRVNULCAiQmFkIFJlcXVlc3QiKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19VTkFVVEhPUklaRUQsICJVbmF1dGhvcml6ZWQiKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19GT1JCSURERU4sICJGb3JiaWRkZW4iKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19OT1RfRk9VTkQsICJOb3QgRm91bmQiKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19OT1RfSU1QTEVNRU5URUQsICJOb3QgSW1wbGVtZW50ZWQiKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19CQURfR0FURVdBWSwgIkJhZCBHYXRld2F5Iik7CisgICAgICAgIGFkZFN0YXR1c0NvZGVNYXAoU0NfU0VSVklDRV9VTkFWQUlMQUJMRSwgIlNlcnZpY2UgVW5hdmFpbGFibGUiKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19DT05USU5VRSwgIkNvbnRpbnVlIik7CisgICAgICAgIGFkZFN0YXR1c0NvZGVNYXAoU0NfTUVUSE9EX05PVF9BTExPV0VELCAiTWV0aG9kIE5vdCBBbGxvd2VkIik7CisgICAgICAgIGFkZFN0YXR1c0NvZGVNYXAoU0NfQ09ORkxJQ1QsICJDb25mbGljdCIpOworICAgICAgICBhZGRTdGF0dXNDb2RlTWFwKFNDX1BSRUNPTkRJVElPTl9GQUlMRUQsICJQcmVjb25kaXRpb24gRmFpbGVkIik7CisgICAgICAgIGFkZFN0YXR1c0NvZGVNYXAoU0NfUkVRVUVTVF9UT09fTE9ORywgIlJlcXVlc3QgVG9vIExvbmciKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19VTlNVUFBPUlRFRF9NRURJQV9UWVBFLCAiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZSIpOworICAgICAgICAvLyBXZWJEYXYgU3RhdHVzIENvZGVzCisgICAgICAgIGFkZFN0YXR1c0NvZGVNYXAoU0NfTVVMVElfU1RBVFVTLCAiTXVsdGktU3RhdHVzIik7CisgICAgICAgIGFkZFN0YXR1c0NvZGVNYXAoU0NfVU5QUk9DRVNTQUJMRV9FTlRJVFksICJVbnByb2Nlc3NhYmxlIEVudGl0eSIpOworICAgICAgICBhZGRTdGF0dXNDb2RlTWFwKFNDX0lOU1VGRklDSUVOVF9TUEFDRV9PTl9SRVNPVVJDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSW5zdWZmaWNpZW50IFNwYWNlIE9uIFJlc291cmNlIik7CisgICAgICAgIGFkZFN0YXR1c0NvZGVNYXAoU0NfTUVUSE9EX0ZBSUxVUkUsICJNZXRob2QgRmFpbHVyZSIpOworICAgICAgICBhZGRTdGF0dXNDb2RlTWFwKFNDX0xPQ0tFRCwgIkxvY2tlZCIpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEhUVFAgc3RhdHVzIHRleHQgZm9yIHRoZSBIVFRQIG9yIFdlYkRhdiBzdGF0dXMgY29kZQorICAgICAqIHNwZWNpZmllZCBieSBsb29raW5nIGl0IHVwIGluIHRoZSBzdGF0aWMgbWFwcGluZy4gIFRoaXMgaXMgYQorICAgICAqIHN0YXRpYyBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgIG5IdHRwU3RhdHVzQ29kZSBbSU5dIEhUVFAgb3IgV2ViREFWIHN0YXR1cyBjb2RlCisgICAgICogQHJldHVybiAgQSBzdHJpbmcgd2l0aCBhIHNob3J0IGRlc2NyaXB0aXZlIHBocmFzZSBmb3IgdGhlCisgICAgICogICAgICAgICAgICAgICAgICBIVFRQIHN0YXR1cyBjb2RlIChlLmcuLCAiT0siKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdGF0dXNUZXh0KGludCBuSHR0cFN0YXR1c0NvZGUpIHsKKyAgICAgICAgSW50ZWdlciBpbnRLZXkgPSBuZXcgSW50ZWdlcihuSHR0cFN0YXR1c0NvZGUpOworCisgICAgICAgIGlmICghbWFwU3RhdHVzQ29kZXMuY29udGFpbnNLZXkoaW50S2V5KSkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIG1hcFN0YXR1c0NvZGVzLmdldChpbnRLZXkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldyBzdGF0dXMgY29kZSAtPiBzdGF0dXMgdGV4dCBtYXBwaW5nLiAgVGhpcyBpcyBhIHN0YXRpYworICAgICAqIG1ldGhvZCBiZWNhdXNlIHRoZSBtYXBwaW5nIGlzIGEgc3RhdGljIHZhcmlhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtICAgbktleSAgICBbSU5dIEhUVFAgb3IgV2ViREFWIHN0YXR1cyBjb2RlCisgICAgICogQHBhcmFtICAgc3RyVmFsICBbSU5dIEhUVFAgc3RhdHVzIHRleHQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFN0YXR1c0NvZGVNYXAoaW50IG5LZXksIFN0cmluZyBzdHJWYWwpIHsKKyAgICAgICAgbWFwU3RhdHVzQ29kZXMucHV0KG5ldyBJbnRlZ2VyKG5LZXkpLCBzdHJWYWwpOworICAgIH0KKworfTsKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL3BhY2thZ2UuaHRtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5Mjg0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPGJvZHk+CisKKzxwPlRoaXMgcGFja2FnZSBjb250YWlucyA8Y29kZT5TZXJ2bGV0czwvY29kZT4gdGhhdCBpbXBsZW1lbnQgc29tZSBvZiB0aGUKK3N0YW5kYXJkIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgdGhlIENhdGFsaW5hIHNlcnZsZXQgY29udGFpbmVyLiAgQmVjYXVzZQordGhlc2Ugc2VydmxldHMgYXJlIGluIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hPC9jb2RlPiBwYWNrYWdlIGhpZXJhcmNoeSwKK3RoZXkgYXJlIGluIHRoZSBwcml2aWxlZ2VkIHBvc2l0aW9uIG9mIGJlaW5nIGFibGUgdG8gcmVmZXJlbmNlIGludGVybmFsIHNlcnZlcgorZGF0YSBzdHJ1Y3R1cmVzLCB3aGljaCBhcHBsaWNhdGlvbiBsZXZlbCBzZXJ2bGV0cyBhcmUgcHJldmVudGVkIGZyb20KK2FjY2Vzc2luZyAoYnkgdGhlIGFwcGxpY2F0aW9uIGNsYXNzIGxvYWRlciBpbXBsZW1lbnRhdGlvbikuPC9wPgorCis8cD5UbyB0aGUgZXh0ZW50IHRoYXQgdGhlc2Ugc2VydmxldHMgZGVwZW5kIHVwb24gaW50ZXJuYWwgQ2F0YWxpbmEgZGF0YQorc3RydWN0dXJlcywgdGhleSBhcmUgb2J2aW91c2x5IG5vdCBwb3J0YWJsZSB0byBvdGhlciBzZXJ2bGV0IGNvbnRhaW5lcgorZW52aXJvbm1lbnRzLiAgSG93ZXZlciwgdGhleSBjYW4gYmUgdXNlZCBhcyBtb2RlbHMgZm9yIGNyZWF0aW5nIGFwcGxpY2F0aW9uCitsZXZlbCBzZXJ2bGV0cyB0aGF0IHByb3ZpZGUgc2ltaWxhciBjYXBhYmlsaXRpZXMgLS0gbW9zdCBvYnZpb3VzbHkgdGhlCis8YSBocmVmPSJEZWZhdWx0U2VydmxldC5odG1sIj5EZWZhdWx0U2VydmxldDwvYT4gaW1wbGVtZW50YXRpb24sIHdoaWNoCitzZXJ2ZXMgc3RhdGljIHJlc291cmNlcyB3aGVuIENhdGFsaW5hIHJ1bnMgc3RhbmQtYWxvbmUuPC9wPgorCis8L2JvZHk+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9Db25zdGFudHMuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NTQ2ODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbjsKKworLyoqCisgKiBNYW5pZmVzdCBjb25zdGFudHMgZm9yIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb248L2NvZGU+CisgKiBwYWNrYWdlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICovCisKK3B1YmxpYyBjbGFzcyBDb25zdGFudHMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24iOworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9GaWxlU3RvcmUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0ZpbGVTdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZTQ1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9GaWxlU3RvcmUuamF2YQpAQCAtMCwwICsxLDQ0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb247CisKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuQ3VzdG9tT2JqZWN0SW5wdXRTdHJlYW07CisKKworLyoqCisgKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGI+U3RvcmU8L2I+IGludGVyZmFjZSB0aGF0IHV0aWxpemVzCisgKiBhIGZpbGUgcGVyIHNhdmVkIFNlc3Npb24gaW4gYSBjb25maWd1cmVkIGRpcmVjdG9yeS4gIFNlc3Npb25zIHRoYXQgYXJlCisgKiBzYXZlZCBhcmUgc3RpbGwgc3ViamVjdCB0byBiZWluZyBleHBpcmVkIGJhc2VkIG9uIGluYWN0aXZpdHkuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBGaWxlU3RvcmUKKyAgICBleHRlbmRzIFN0b3JlQmFzZSBpbXBsZW1lbnRzIFN0b3JlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIC8qKgorICAgICAqIFRoZSBleHRlbnNpb24gdG8gdXNlIGZvciBzZXJpYWxpemVkIHNlc3Npb24gZmlsZW5hbWVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0VYVCA9ICIuc2Vzc2lvbiI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBTZXNzaW9ucyBhcmUgc3RvcmVkLgorICAgICAqIFRoaXMgbWF5IGJlIGFuIGFic29sdXRlIHBhdGhuYW1lLCBvciBhIHJlbGF0aXZlIHBhdGggdGhhdCBpcworICAgICAqIHJlc29sdmVkIGFnYWluc3QgdGhlIHRlbXBvcmFyeSB3b3JrIGRpcmVjdG9yeSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkaXJlY3RvcnkgPSAiLiI7CisKKworICAgIC8qKgorICAgICAqIEEgRmlsZSByZXByZXNlbnRpbmcgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBTZXNzaW9ucyBhcmUgc3RvcmVkLgorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBkaXJlY3RvcnlGaWxlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAiRmlsZVN0b3JlLzEuMCI7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIHRvIHJlZ2lzdGVyIGZvciB0aGlzIFN0b3JlLCB1c2VkIGZvciBsb2dnaW5nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzdG9yZU5hbWUgPSAiZmlsZVN0b3JlIjsKKworICAgIC8qKgorICAgICAqIE5hbWUgdG8gcmVnaXN0ZXIgZm9yIHRoZSBiYWNrZ3JvdW5kIHRocmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGhyZWFkTmFtZSA9ICJGaWxlU3RvcmUiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaXJlY3RvcnkgcGF0aCBmb3IgdGhpcyBTdG9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERpcmVjdG9yeSgpIHsKKworICAgICAgICByZXR1cm4gKGRpcmVjdG9yeSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlyZWN0b3J5IHBhdGggZm9yIHRoaXMgU3RvcmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBUaGUgbmV3IGRpcmVjdG9yeSBwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5KFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgU3RyaW5nIG9sZERpcmVjdG9yeSA9IHRoaXMuZGlyZWN0b3J5OworICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IHBhdGg7CisgICAgICAgIHRoaXMuZGlyZWN0b3J5RmlsZSA9IG51bGw7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJkaXJlY3RvcnkiLCBvbGREaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0b3J5KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgU3RvcmUgaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRocmVhZCBuYW1lIGZvciB0aGlzIFN0b3JlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGhyZWFkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuKHRocmVhZE5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBmb3IgdGhpcyBTdG9yZSwgdXNlZCBmb3IgbG9nZ2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuKHN0b3JlTmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBTZXNzaW9ucyBwcmVzZW50IGluIHRoaXMgU3RvcmUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIGxpc3Qgb2YgZmlsZXMgaW4gb3VyIHN0b3JhZ2UgZGlyZWN0b3J5CisgICAgICAgIEZpbGUgZmlsZSA9IGRpcmVjdG9yeSgpOworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBmaWxlc1tdID0gZmlsZS5saXN0KCk7CisKKyAgICAgICAgLy8gRmlndXJlIG91dCB3aGljaCBmaWxlcyBhcmUgc2Vzc2lvbnMKKyAgICAgICAgaW50IGtleWNvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmVuZHNXaXRoKEZJTEVfRVhUKSkgeworICAgICAgICAgICAgICAgIGtleWNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChrZXljb3VudCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIG9mIHRoZSBTZXNzaW9ucyBpbiB0aGlzIFN0b3JlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIFN0cmluZ1tdIGtleXMgPSBrZXlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcmVtb3ZlKGtleXNbaV0pOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBzZXNzaW9uIGlkZW50aWZpZXJzIG9mIGFsbCBTZXNzaW9ucworICAgICAqIGN1cnJlbnRseSBzYXZlZCBpbiB0aGlzIFN0b3JlLiAgSWYgdGhlcmUgYXJlIG5vIHN1Y2ggU2Vzc2lvbnMsIGEKKyAgICAgKiB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGtleXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIGxpc3Qgb2YgZmlsZXMgaW4gb3VyIHN0b3JhZ2UgZGlyZWN0b3J5CisgICAgICAgIEZpbGUgZmlsZSA9IGRpcmVjdG9yeSgpOworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG5ldyBTdHJpbmdbMF0pOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGZpbGVzW10gPSBmaWxlLmxpc3QoKTsKKyAgICAgICAgCisgICAgICAgIC8vIEJ1Z3ppbGxhIDMyMTMwCisgICAgICAgIGlmKChmaWxlcyA9PSBudWxsKSB8fCAoZmlsZXMubGVuZ3RoIDwgMSkpIHsKKyAgICAgICAgICAgIHJldHVybiAobmV3IFN0cmluZ1swXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBCdWlsZCBhbmQgcmV0dXJuIHRoZSBsaXN0IG9mIHNlc3Npb24gaWRlbnRpZmllcnMKKyAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGludCBuID0gRklMRV9FWFQubGVuZ3RoKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmaWxlc1tpXS5lbmRzV2l0aChGSUxFX0VYVCkpIHsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChmaWxlc1tpXS5zdWJzdHJpbmcoMCwgZmlsZXNbaV0ubGVuZ3RoKCkgLSBuKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2FkIGFuZCByZXR1cm4gdGhlIFNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbgorICAgICAqIGlkZW50aWZpZXIgZnJvbSB0aGlzIFN0b3JlLCB3aXRob3V0IHJlbW92aW5nIGl0LiAgSWYgdGhlcmUgaXMgbm8KKyAgICAgKiBzdWNoIHN0b3JlZCBTZXNzaW9uLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgU2Vzc2lvbiBpZGVudGlmaWVyIG9mIHRoZSBzZXNzaW9uIHRvIGxvYWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhIGRlc2VyaWFsaXphdGlvbiBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgU2Vzc2lvbiBsb2FkKFN0cmluZyBpZCkKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBPcGVuIGFuIGlucHV0IHN0cmVhbSB0byB0aGUgc3BlY2lmaWVkIHBhdGhuYW1lLCBpZiBhbnkKKyAgICAgICAgRmlsZSBmaWxlID0gZmlsZShpZCk7CisgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoISBmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIGlmIChtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZGVidWcoc20uZ2V0U3RyaW5nKGdldFN0b3JlTmFtZSgpKyIubG9hZGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCBmaWxlLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICAgIH0KKworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKKyAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbnVsbDsKKyAgICAgICAgTG9hZGVyIGxvYWRlciA9IG51bGw7CisgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZpcyk7CisgICAgICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gbWFuYWdlci5nZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2FkZXIgPSBjb250YWluZXIuZ2V0TG9hZGVyKCk7CisgICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBsb2FkZXIuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgIGlmIChjbGFzc0xvYWRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIG9pcyA9IG5ldyBDdXN0b21PYmplY3RJbnB1dFN0cmVhbShiaXMsIGNsYXNzTG9hZGVyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmlzKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5kZWJ1ZygiTm8gcGVyc2lzdGVkIGRhdGEgZmlsZSBmb3VuZCIpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKG9pcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgb2lzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZikgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9pcyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0YW5kYXJkU2Vzc2lvbiBzZXNzaW9uID0KKyAgICAgICAgICAgICAgICAoU3RhbmRhcmRTZXNzaW9uKSBtYW5hZ2VyLmNyZWF0ZUVtcHR5U2Vzc2lvbigpOworICAgICAgICAgICAgc2Vzc2lvbi5yZWFkT2JqZWN0RGF0YShvaXMpOworICAgICAgICAgICAgc2Vzc2lvbi5zZXRNYW5hZ2VyKG1hbmFnZXIpOworICAgICAgICAgICAgcmV0dXJuIChzZXNzaW9uKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIENsb3NlIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAgICAgIGlmIChvaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGYpIHsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBTZXNzaW9uIHdpdGggdGhlIHNwZWNpZmllZCBzZXNzaW9uIGlkZW50aWZpZXIgZnJvbQorICAgICAqIHRoaXMgU3RvcmUsIGlmIHByZXNlbnQuICBJZiBubyBzdWNoIFNlc3Npb24gaXMgcHJlc2VudCwgdGhpcyBtZXRob2QKKyAgICAgKiB0YWtlcyBubyBhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgU2Vzc2lvbiBpZGVudGlmaWVyIG9mIHRoZSBTZXNzaW9uIHRvIGJlIHJlbW92ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgRmlsZSBmaWxlID0gZmlsZShpZCk7CisgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmRlYnVnKHNtLmdldFN0cmluZyhnZXRTdG9yZU5hbWUoKSsiLnJlbW92aW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgfQorICAgICAgICBmaWxlLmRlbGV0ZSgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBzcGVjaWZpZWQgU2Vzc2lvbiBpbnRvIHRoaXMgU3RvcmUuICBBbnkgcHJldmlvdXNseSBzYXZlZAorICAgICAqIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBzZXNzaW9uIGlkZW50aWZpZXIgaXMgcmVwbGFjZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiBTZXNzaW9uIHRvIGJlIHNhdmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzYXZlKFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBPcGVuIGFuIG91dHB1dCBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZCBwYXRobmFtZSwgaWYgYW55CisgICAgICAgIEZpbGUgZmlsZSA9IGZpbGUoc2Vzc2lvbi5nZXRJZEludGVybmFsKCkpOworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5kZWJ1ZyhzbS5nZXRTdHJpbmcoZ2V0U3RvcmVOYW1lKCkrIi5zYXZpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldElkSW50ZXJuYWwoKSwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgICB9CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKKyAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGZvcykpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAob29zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICgoU3RhbmRhcmRTZXNzaW9uKXNlc3Npb24pLndyaXRlT2JqZWN0RGF0YShvb3MpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcGF0aG5hbWUgdG8gb3VyCisgICAgICogc2Vzc2lvbiBwZXJzaXN0ZW5jZSBkaXJlY3RvcnksIGlmIGFueS4gIFRoZSBkaXJlY3Rvcnkgd2lsbCBiZQorICAgICAqIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgZGlyZWN0b3J5KCkgeworCisgICAgICAgIGlmICh0aGlzLmRpcmVjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmRpcmVjdG9yeUZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTk9URTogIFJhY2UgY29uZGl0aW9uIGlzIGhhcm1sZXNzLCBzbyBkbyBub3Qgc3luY2hyb25pemUKKyAgICAgICAgICAgIHJldHVybiAodGhpcy5kaXJlY3RvcnlGaWxlKTsKKyAgICAgICAgfQorICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh0aGlzLmRpcmVjdG9yeSk7CisgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBtYW5hZ2VyLmdldENvbnRhaW5lcigpOworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9CisgICAgICAgICAgICAgICAgICAgICgoQ29udGV4dCkgY29udGFpbmVyKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgICAgICAgICAgICAgIEZpbGUgd29yayA9IChGaWxlKQorICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5XT1JLX0RJUl9BVFRSKTsKKyAgICAgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUod29yaywgdGhpcy5kaXJlY3RvcnkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiUGFyZW50IENvbnRhaW5lciBpcyBub3QgYSBDb250ZXh0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpIHx8ICFmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICBmaWxlLm1rZGlycygpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZGlyZWN0b3J5RmlsZSA9IGZpbGU7CisgICAgICAgIHJldHVybiAoZmlsZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcGF0aG5hbWUgdG8gb3VyCisgICAgICogc2Vzc2lvbiBwZXJzaXN0ZW5jZSBmaWxlLCBpZiBhbnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgVGhlIElEIG9mIHRoZSBTZXNzaW9uIHRvIGJlIHJldHJpZXZlZC4gVGhpcyBpcworICAgICAqICAgIHVzZWQgaW4gdGhlIGZpbGUgbmFtaW5nLgorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBmaWxlKFN0cmluZyBpZCkgeworCisgICAgICAgIGlmICh0aGlzLmRpcmVjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGlkICsgRklMRV9FWFQ7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpcmVjdG9yeSgpLCBmaWxlbmFtZSk7CisgICAgICAgIHJldHVybiAoZmlsZSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vSkRCQ1N0b3JlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9KREJDU3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODVmODVlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vSkRCQ1N0b3JlLmphdmEKQEAgLTAsMCArMSw5ODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5DdXN0b21PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuRHJpdmVyOworaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+U3RvcmU8L2NvZGU+IGludGVyZmFjZSB0aGF0IHN0b3JlcworICogc2VyaWFsaXplZCBzZXNzaW9uIG9iamVjdHMgaW4gYSBkYXRhYmFzZS4gIFNlc3Npb25zIHRoYXQgYXJlCisgKiBzYXZlZCBhcmUgc3RpbGwgc3ViamVjdCB0byBiZWluZyBleHBpcmVkIGJhc2VkIG9uIGluYWN0aXZpdHkuCisgKgorICogQGF1dGhvciBCaXAgVGhlbGluCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSkRCQ1N0b3JlCisgICAgICAgIGV4dGVuZHMgU3RvcmVCYXNlIGltcGxlbWVudHMgU3RvcmUgeworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgaW5mbyA9ICJKREJDU3RvcmUvMS4wIjsKKworICAgIC8qKgorICAgICAqIENvbnRleHQgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBTdG9yZQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOworCisgICAgLyoqCisgICAgICogTmFtZSB0byByZWdpc3RlciBmb3IgdGhpcyBTdG9yZSwgdXNlZCBmb3IgbG9nZ2luZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBzdG9yZU5hbWUgPSAiSkRCQ1N0b3JlIjsKKworICAgIC8qKgorICAgICAqIE5hbWUgdG8gcmVnaXN0ZXIgZm9yIHRoZSBiYWNrZ3JvdW5kIHRocmVhZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRocmVhZE5hbWUgPSAiSkRCQ1N0b3JlIjsKKworICAgIC8qKgorICAgICAqIFRoZSBjb25uZWN0aW9uIHVzZXJuYW1lIHRvIHVzZSB3aGVuIHRyeWluZyB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25OYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbm5lY3Rpb24gVVJMIHRvIHVzZSB3aGVuIHRyeWluZyB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0aW9uIHN0cmluZyB0byB1c2Ugd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBEQi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25VUkwgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBDb25uZWN0aW9uIGRiQ29ubmVjdGlvbiA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW5jZSBvZiB0aGUgSkRCQyBEcml2ZXIgY2xhc3Mgd2UgdXNlIGFzIGEgY29ubmVjdGlvbiBmYWN0b3J5LgorICAgICAqLworICAgIHByb3RlY3RlZCBEcml2ZXIgZHJpdmVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIERyaXZlciB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJOYW1lID0gbnVsbDsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGFibGUgJiBjb2xzCisKKyAgICAvKioKKyAgICAgKiBUYWJsZSB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzZXNzaW9uVGFibGUgPSAidG9tY2F0JHNlc3Npb25zIjsKKworICAgIC8qKgorICAgICAqIENvbHVtbiB0byB1c2UgZm9yIC9FbmdpbmUvSG9zdC9Db250ZXh0IG5hbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlc3Npb25BcHBDb2wgPSAiYXBwIjsKKworICAgIC8qKgorICAgICAqIElkIGNvbHVtbiB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzZXNzaW9uSWRDb2wgPSAiaWQiOworCisgICAgLyoqCisgICAgICogRGF0YSBjb2x1bW4gdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc2Vzc2lvbkRhdGFDb2wgPSAiZGF0YSI7CisKKyAgICAvKioKKyAgICAgKiBJcyBWYWxpZCBjb2x1bW4gdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc2Vzc2lvblZhbGlkQ29sID0gInZhbGlkIjsKKworICAgIC8qKgorICAgICAqIE1heCBJbmFjdGl2ZSBjb2x1bW4gdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc2Vzc2lvbk1heEluYWN0aXZlQ29sID0gIm1heGluYWN0aXZlIjsKKworICAgIC8qKgorICAgICAqIExhc3QgQWNjZXNzZWQgY29sdW1uIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlc3Npb25MYXN0QWNjZXNzZWRDb2wgPSAibGFzdGFjY2VzcyI7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNRTCBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFZhcmlhYmxlIHRvIGhvbGQgdGhlIDxjb2RlPmdldFNpemUoKTwvY29kZT4gcHJlcGFyZWQgc3RhdGVtZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlZFNpemVTcWwgPSBudWxsOworCisgICAgLyoqCisgICAgICogVmFyaWFibGUgdG8gaG9sZCB0aGUgPGNvZGU+a2V5cygpPC9jb2RlPiBwcmVwYXJlZCBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVkS2V5c1NxbCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBWYXJpYWJsZSB0byBob2xkIHRoZSA8Y29kZT5zYXZlKCk8L2NvZGU+IHByZXBhcmVkIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZWRTYXZlU3FsID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFZhcmlhYmxlIHRvIGhvbGQgdGhlIDxjb2RlPmNsZWFyKCk8L2NvZGU+IHByZXBhcmVkIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZWRDbGVhclNxbCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBWYXJpYWJsZSB0byBob2xkIHRoZSA8Y29kZT5yZW1vdmUoKTwvY29kZT4gcHJlcGFyZWQgc3RhdGVtZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlZFJlbW92ZVNxbCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBWYXJpYWJsZSB0byBob2xkIHRoZSA8Y29kZT5sb2FkKCk8L2NvZGU+IHByZXBhcmVkIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZWRMb2FkU3FsID0gbnVsbDsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpbmZvIGZvciB0aGlzIFN0b3JlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgZm9yIHRoaXMgaW5zdGFuY2UgKGJ1aWx0IGZyb20gY29udGFpbmVyIG5hbWUpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gbWFuYWdlci5nZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgIFN0cmluZyBjb250ZXh0TmFtZSA9IGNvbnRhaW5lci5nZXROYW1lKCk7CisgICAgICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSAiIjsKKyAgICAgICAgICAgIFN0cmluZyBlbmdpbmVOYW1lID0gIiI7CisKKyAgICAgICAgICAgIGlmIChjb250YWluZXIuZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRhaW5lciBob3N0ID0gY29udGFpbmVyLmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgIGhvc3ROYW1lID0gaG9zdC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKGhvc3QuZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlbmdpbmVOYW1lID0gaG9zdC5nZXRQYXJlbnQoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSA9ICIvIiArIGVuZ2luZU5hbWUgKyAiLyIgKyBob3N0TmFtZSArIGNvbnRleHROYW1lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGhyZWFkIG5hbWUgZm9yIHRoaXMgU3RvcmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUaHJlYWROYW1lKCkgeworICAgICAgICByZXR1cm4gKHRocmVhZE5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBmb3IgdGhpcyBTdG9yZSwgdXNlZCBmb3IgbG9nZ2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIChzdG9yZU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZHJpdmVyIGZvciB0aGlzIFN0b3JlLgorICAgICAqCisgICAgICogQHBhcmFtIGRyaXZlck5hbWUgVGhlIG5ldyBkcml2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREcml2ZXJOYW1lKFN0cmluZyBkcml2ZXJOYW1lKSB7CisgICAgICAgIFN0cmluZyBvbGREcml2ZXJOYW1lID0gdGhpcy5kcml2ZXJOYW1lOworICAgICAgICB0aGlzLmRyaXZlck5hbWUgPSBkcml2ZXJOYW1lOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiZHJpdmVyTmFtZSIsCisgICAgICAgICAgICAgICAgb2xkRHJpdmVyTmFtZSwKKyAgICAgICAgICAgICAgICB0aGlzLmRyaXZlck5hbWUpOworICAgICAgICB0aGlzLmRyaXZlck5hbWUgPSBkcml2ZXJOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZHJpdmVyIGZvciB0aGlzIFN0b3JlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmRyaXZlck5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlcm5hbWUgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25OYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlcm5hbWUgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25OYW1lIFVzZXJuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbk5hbWUoU3RyaW5nIGNvbm5lY3Rpb25OYW1lKSB7CisgICAgICAgIHRoaXMuY29ubmVjdGlvbk5hbWUgPSBjb25uZWN0aW9uTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhc3N3b3JkIHRvIHVzZSB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvblBhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvblBhc3N3b3JkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFzc3dvcmQgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25QYXNzd29yZCBVc2VyIHBhc3N3b3JkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblBhc3N3b3JkKFN0cmluZyBjb25uZWN0aW9uUGFzc3dvcmQpIHsKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uUGFzc3dvcmQgPSBjb25uZWN0aW9uUGFzc3dvcmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDb25uZWN0aW9uIFVSTCBmb3IgdGhpcyBTdG9yZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uVVJMIFRoZSBuZXcgQ29ubmVjdGlvbiBVUkwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uVVJMKFN0cmluZyBjb25uZWN0aW9uVVJMKSB7CisgICAgICAgIFN0cmluZyBvbGRDb25uU3RyaW5nID0gdGhpcy5jb25uZWN0aW9uVVJMOworICAgICAgICB0aGlzLmNvbm5lY3Rpb25VUkwgPSBjb25uZWN0aW9uVVJMOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiY29ubmVjdGlvblVSTCIsCisgICAgICAgICAgICAgICAgb2xkQ29ublN0cmluZywKKyAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25VUkwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29ubmVjdGlvbiBVUkwgZm9yIHRoaXMgU3RvcmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uVVJMKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuY29ubmVjdGlvblVSTCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0YWJsZSBmb3IgdGhpcyBTdG9yZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uVGFibGUgVGhlIG5ldyB0YWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25UYWJsZShTdHJpbmcgc2Vzc2lvblRhYmxlKSB7CisgICAgICAgIFN0cmluZyBvbGRTZXNzaW9uVGFibGUgPSB0aGlzLnNlc3Npb25UYWJsZTsKKyAgICAgICAgdGhpcy5zZXNzaW9uVGFibGUgPSBzZXNzaW9uVGFibGU7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJzZXNzaW9uVGFibGUiLAorICAgICAgICAgICAgICAgIG9sZFNlc3Npb25UYWJsZSwKKyAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb25UYWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0YWJsZSBmb3IgdGhpcyBTdG9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25UYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlc3Npb25UYWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBBcHAgY29sdW1uIGZvciB0aGUgdGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbkFwcENvbCB0aGUgY29sdW1uIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uQXBwQ29sKFN0cmluZyBzZXNzaW9uQXBwQ29sKSB7CisgICAgICAgIFN0cmluZyBvbGRTZXNzaW9uQXBwQ29sID0gdGhpcy5zZXNzaW9uQXBwQ29sOworICAgICAgICB0aGlzLnNlc3Npb25BcHBDb2wgPSBzZXNzaW9uQXBwQ29sOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgic2Vzc2lvbkFwcENvbCIsCisgICAgICAgICAgICAgICAgb2xkU2Vzc2lvbkFwcENvbCwKKyAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb25BcHBDb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgd2ViIGFwcGxpY2F0aW9uIG5hbWUgY29sdW1uIGZvciB0aGUgdGFibGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uQXBwQ29sKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuc2Vzc2lvbkFwcENvbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBJZCBjb2x1bW4gZm9yIHRoZSB0YWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uSWRDb2wgdGhlIGNvbHVtbiBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbklkQ29sKFN0cmluZyBzZXNzaW9uSWRDb2wpIHsKKyAgICAgICAgU3RyaW5nIG9sZFNlc3Npb25JZENvbCA9IHRoaXMuc2Vzc2lvbklkQ29sOworICAgICAgICB0aGlzLnNlc3Npb25JZENvbCA9IHNlc3Npb25JZENvbDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInNlc3Npb25JZENvbCIsCisgICAgICAgICAgICAgICAgb2xkU2Vzc2lvbklkQ29sLAorICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbklkQ29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIElkIGNvbHVtbiBmb3IgdGhlIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2Vzc2lvbklkQ29sKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuc2Vzc2lvbklkQ29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIERhdGEgY29sdW1uIGZvciB0aGUgdGFibGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uRGF0YUNvbCB0aGUgY29sdW1uIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uRGF0YUNvbChTdHJpbmcgc2Vzc2lvbkRhdGFDb2wpIHsKKyAgICAgICAgU3RyaW5nIG9sZFNlc3Npb25EYXRhQ29sID0gdGhpcy5zZXNzaW9uRGF0YUNvbDsKKyAgICAgICAgdGhpcy5zZXNzaW9uRGF0YUNvbCA9IHNlc3Npb25EYXRhQ29sOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgic2Vzc2lvbkRhdGFDb2wiLAorICAgICAgICAgICAgICAgIG9sZFNlc3Npb25EYXRhQ29sLAorICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbkRhdGFDb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGF0YSBjb2x1bW4gZm9yIHRoZSB0YWJsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2Vzc2lvbkRhdGFDb2woKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zZXNzaW9uRGF0YUNvbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBJcyBWYWxpZCBjb2x1bW4gZm9yIHRoZSB0YWJsZQorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb25WYWxpZENvbCBUaGUgY29sdW1uIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uVmFsaWRDb2woU3RyaW5nIHNlc3Npb25WYWxpZENvbCkgeworICAgICAgICBTdHJpbmcgb2xkU2Vzc2lvblZhbGlkQ29sID0gdGhpcy5zZXNzaW9uVmFsaWRDb2w7CisgICAgICAgIHRoaXMuc2Vzc2lvblZhbGlkQ29sID0gc2Vzc2lvblZhbGlkQ29sOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgic2Vzc2lvblZhbGlkQ29sIiwKKyAgICAgICAgICAgICAgICBvbGRTZXNzaW9uVmFsaWRDb2wsCisgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uVmFsaWRDb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSXMgVmFsaWQgY29sdW1uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uVmFsaWRDb2woKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zZXNzaW9uVmFsaWRDb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgTWF4IEluYWN0aXZlIGNvbHVtbiBmb3IgdGhlIHRhYmxlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbk1heEluYWN0aXZlQ29sIFRoZSBjb2x1bW4gbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25NYXhJbmFjdGl2ZUNvbChTdHJpbmcgc2Vzc2lvbk1heEluYWN0aXZlQ29sKSB7CisgICAgICAgIFN0cmluZyBvbGRTZXNzaW9uTWF4SW5hY3RpdmVDb2wgPSB0aGlzLnNlc3Npb25NYXhJbmFjdGl2ZUNvbDsKKyAgICAgICAgdGhpcy5zZXNzaW9uTWF4SW5hY3RpdmVDb2wgPSBzZXNzaW9uTWF4SW5hY3RpdmVDb2w7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJzZXNzaW9uTWF4SW5hY3RpdmVDb2wiLAorICAgICAgICAgICAgICAgIG9sZFNlc3Npb25NYXhJbmFjdGl2ZUNvbCwKKyAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb25NYXhJbmFjdGl2ZUNvbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNYXggSW5hY3RpdmUgY29sdW1uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uTWF4SW5hY3RpdmVDb2woKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zZXNzaW9uTWF4SW5hY3RpdmVDb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgTGFzdCBBY2Nlc3NlZCBjb2x1bW4gZm9yIHRoZSB0YWJsZQorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb25MYXN0QWNjZXNzZWRDb2wgVGhlIGNvbHVtbiBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbkxhc3RBY2Nlc3NlZENvbChTdHJpbmcgc2Vzc2lvbkxhc3RBY2Nlc3NlZENvbCkgeworICAgICAgICBTdHJpbmcgb2xkU2Vzc2lvbkxhc3RBY2Nlc3NlZENvbCA9IHRoaXMuc2Vzc2lvbkxhc3RBY2Nlc3NlZENvbDsKKyAgICAgICAgdGhpcy5zZXNzaW9uTGFzdEFjY2Vzc2VkQ29sID0gc2Vzc2lvbkxhc3RBY2Nlc3NlZENvbDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInNlc3Npb25MYXN0QWNjZXNzZWRDb2wiLAorICAgICAgICAgICAgICAgIG9sZFNlc3Npb25MYXN0QWNjZXNzZWRDb2wsCisgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uTGFzdEFjY2Vzc2VkQ29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExhc3QgQWNjZXNzZWQgY29sdW1uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uTGFzdEFjY2Vzc2VkQ29sKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuc2Vzc2lvbkxhc3RBY2Nlc3NlZENvbCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgc2Vzc2lvbiBpZGVudGlmaWVycyBvZiBhbGwgU2Vzc2lvbnMKKyAgICAgKiBjdXJyZW50bHkgc2F2ZWQgaW4gdGhpcyBTdG9yZS4gIElmIHRoZXJlIGFyZSBubyBzdWNoIFNlc3Npb25zLCBhCisgICAgICogemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBrZXlzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzdWx0U2V0IHJzdCA9IG51bGw7CisgICAgICAgIFN0cmluZyBrZXlzW10gPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBudW1iZXJPZlRyaWVzID0gMjsKKyAgICAgICAgICAgIHdoaWxlIChudW1iZXJPZlRyaWVzID4gMCkgeworCisgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBfY29ubiA9IGdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoX2Nvbm4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBTdHJpbmdbMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJlcGFyZWRLZXlzU3FsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXlzU3FsID0gIlNFTEVDVCAiICsgc2Vzc2lvbklkQ29sICsgIiBGUk9NICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXNzaW9uVGFibGUgKyAiIFdIRVJFICIgKyBzZXNzaW9uQXBwQ29sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiA9ID8iOworICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRLZXlzU3FsID0gX2Nvbm4ucHJlcGFyZVN0YXRlbWVudChrZXlzU3FsKTsKKwkJCQkJfQorCisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkS2V5c1NxbC5zZXRTdHJpbmcoMSwgZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcnN0ID0gcHJlcGFyZWRLZXlzU3FsLmV4ZWN1dGVRdWVyeSgpOworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgdG1wa2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnN0Lm5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGtleXMuYWRkKHJzdC5nZXRTdHJpbmcoMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGtleXMgPSAoU3RyaW5nW10pIHRtcGtleXMudG9BcnJheShuZXcgU3RyaW5nW3RtcGtleXMuc2l6ZSgpXSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEJyZWFrIG91dCBhZnRlciB0aGUgZmluYWxseSBibG9jaworICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlRyaWVzID0gMDsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZyhnZXRTdG9yZU5hbWUoKSArICIuU1FMRXhjZXB0aW9uIiwgZSkpOworICAgICAgICAgICAgICAgICAgICBrZXlzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGNvbm5lY3Rpb24gc28gdGhhdCBpdCBnZXRzIHJlb3BlbmVkIG5leHQgdGltZQorICAgICAgICAgICAgICAgICAgICBpZiAoZGJDb25uZWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShkYkNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByc3QuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UoX2Nvbm4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBudW1iZXJPZlRyaWVzLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKGtleXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgYSBjb3VudCBvZiBhbGwgU2Vzc2lvbnMKKyAgICAgKiBjdXJyZW50bHkgc2F2ZWQgaW4gdGhpcyBTdG9yZS4gIElmIHRoZXJlIGFyZSBubyBTZXNzaW9ucywKKyAgICAgKiA8Y29kZT4wPC9jb2RlPiBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHNpemUgPSAwOworICAgICAgICBSZXN1bHRTZXQgcnN0ID0gbnVsbDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBudW1iZXJPZlRyaWVzID0gMjsKKyAgICAgICAgICAgIHdoaWxlIChudW1iZXJPZlRyaWVzID4gMCkgeworICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gX2Nvbm4gPSBnZXRDb25uZWN0aW9uKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoX2Nvbm4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHNpemUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVwYXJlZFNpemVTcWwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNpemVTcWwgPSAiU0VMRUNUIENPVU5UKCIgKyBzZXNzaW9uSWRDb2wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSBGUk9NICIgKyBzZXNzaW9uVGFibGUgKyAiIFdIRVJFICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXNzaW9uQXBwQ29sICsgIiA9ID8iOworICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRTaXplU3FsID0gX2Nvbm4ucHJlcGFyZVN0YXRlbWVudChzaXplU3FsKTsKKwkJCQkJfQorCisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkU2l6ZVNxbC5zZXRTdHJpbmcoMSwgZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcnN0ID0gcHJlcGFyZWRTaXplU3FsLmV4ZWN1dGVRdWVyeSgpOworICAgICAgICAgICAgICAgICAgICBpZiAocnN0Lm5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHJzdC5nZXRJbnQoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gQnJlYWsgb3V0IGFmdGVyIHRoZSBmaW5hbGx5IGJsb2NrCisgICAgICAgICAgICAgICAgICAgIG51bWJlck9mVHJpZXMgPSAwOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKGdldFN0b3JlTmFtZSgpICsgIi5TUUxFeGNlcHRpb24iLCBlKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYkNvbm5lY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGRiQ29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyc3QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByc3QuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UoX2Nvbm4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBudW1iZXJPZlRyaWVzLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChzaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBTZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgaWQgPGNvZGU+aWQ8L2NvZGU+LgorICAgICAqIElmIG5vIHN1Y2ggc2Vzc2lvbiBpcyBmb3VuZCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCBhIHZhbHVlIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPgorICAgICAqIEByZXR1cm4gdGhlIHN0b3JlZCA8Y29kZT5TZXNzaW9uPC9jb2RlPgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uIGxvYWQoU3RyaW5nIGlkKQorICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzdWx0U2V0IHJzdCA9IG51bGw7CisgICAgICAgIFN0YW5kYXJkU2Vzc2lvbiBfc2Vzc2lvbiA9IG51bGw7CisgICAgICAgIExvYWRlciBsb2FkZXIgPSBudWxsOworICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7CisgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG51bGw7CisgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlzID0gbnVsbDsKKyAgICAgICAgQ29udGFpbmVyIGNvbnRhaW5lciA9IG1hbmFnZXIuZ2V0Q29udGFpbmVyKCk7CisgCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IG51bWJlck9mVHJpZXMgPSAyOworICAgICAgICAgICAgd2hpbGUgKG51bWJlck9mVHJpZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBfY29ubiA9IGdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoX2Nvbm4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVwYXJlZExvYWRTcWwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvYWRTcWwgPSAiU0VMRUNUICIgKyBzZXNzaW9uSWRDb2wgKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2Vzc2lvbkRhdGFDb2wgKyAiIEZST00gIiArIHNlc3Npb25UYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgV0hFUkUgIiArIHNlc3Npb25JZENvbCArICIgPSA/IEFORCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2Vzc2lvbkFwcENvbCArICIgPSA/IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkTG9hZFNxbCA9IF9jb25uLnByZXBhcmVTdGF0ZW1lbnQobG9hZFNxbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZExvYWRTcWwuc2V0U3RyaW5nKDEsIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRMb2FkU3FsLnNldFN0cmluZygyLCBnZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICByc3QgPSBwcmVwYXJlZExvYWRTcWwuZXhlY3V0ZVF1ZXJ5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyc3QubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShyc3QuZ2V0QmluYXJ5U3RyZWFtKDIpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyID0gY29udGFpbmVyLmdldExvYWRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBsb2FkZXIuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc0xvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lzID0gbmV3IEN1c3RvbU9iamVjdElucHV0U3RyZWFtKGJpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmRlYnVnKHNtLmdldFN0cmluZyhnZXRTdG9yZU5hbWUoKSArICIubG9hZGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwgc2Vzc2lvblRhYmxlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zZXNzaW9uID0gKFN0YW5kYXJkU2Vzc2lvbikgbWFuYWdlci5jcmVhdGVFbXB0eVNlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zZXNzaW9uLnJlYWRPYmplY3REYXRhKG9pcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBfc2Vzc2lvbi5zZXRNYW5hZ2VyKG1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmRlYnVnKGdldFN0b3JlTmFtZSgpICsgIjogTm8gcGVyc2lzdGVkIGRhdGEgb2JqZWN0IGZvdW5kIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gQnJlYWsgb3V0IGFmdGVyIHRoZSBmaW5hbGx5IGJsb2NrCisgICAgICAgICAgICAgICAgICAgIG51bWJlck9mVHJpZXMgPSAwOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKGdldFN0b3JlTmFtZSgpICsgIi5TUUxFeGNlcHRpb24iLCBlKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYkNvbm5lY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGRiQ29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzdC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZShfY29ubik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG51bWJlck9mVHJpZXMtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoX3Nlc3Npb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgU2Vzc2lvbiB3aXRoIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiBpZGVudGlmaWVyIGZyb20KKyAgICAgKiB0aGlzIFN0b3JlLCBpZiBwcmVzZW50LiAgSWYgbm8gc3VjaCBTZXNzaW9uIGlzIHByZXNlbnQsIHRoaXMgbWV0aG9kCisgICAgICogdGFrZXMgbm8gYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIFNlc3Npb24gaWRlbnRpZmllciBvZiB0aGUgU2Vzc2lvbiB0byBiZSByZW1vdmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IG51bWJlck9mVHJpZXMgPSAyOworICAgICAgICAgICAgd2hpbGUgKG51bWJlck9mVHJpZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBfY29ubiA9IGdldENvbm5lY3Rpb24oKTsKKworICAgICAgICAgICAgICAgIGlmIChfY29ubiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJlcGFyZWRSZW1vdmVTcWwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbW92ZVNxbCA9ICJERUxFVEUgRlJPTSAiICsgc2Vzc2lvblRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBXSEVSRSAiICsgc2Vzc2lvbklkQ29sICsgIiA9ID8gIEFORCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2Vzc2lvbkFwcENvbCArICIgPSA/IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkUmVtb3ZlU3FsID0gX2Nvbm4ucHJlcGFyZVN0YXRlbWVudChyZW1vdmVTcWwpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRSZW1vdmVTcWwuc2V0U3RyaW5nKDEsIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRSZW1vdmVTcWwuc2V0U3RyaW5nKDIsIGdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkUmVtb3ZlU3FsLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQnJlYWsgb3V0IGFmdGVyIHRoZSBmaW5hbGx5IGJsb2NrCisgICAgICAgICAgICAgICAgICAgIG51bWJlck9mVHJpZXMgPSAwOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKGdldFN0b3JlTmFtZSgpICsgIi5TUUxFeGNlcHRpb24iLCBlKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYkNvbm5lY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGRiQ29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZShfY29ubik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG51bWJlck9mVHJpZXMtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZGVidWcoc20uZ2V0U3RyaW5nKGdldFN0b3JlTmFtZSgpICsgIi5yZW1vdmluZyIsIGlkLCBzZXNzaW9uVGFibGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbGwgb2YgdGhlIFNlc3Npb25zIGluIHRoaXMgU3RvcmUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbnVtYmVyT2ZUcmllcyA9IDI7CisgICAgICAgICAgICB3aGlsZSAobnVtYmVyT2ZUcmllcyA+IDApIHsKKyAgICAgICAgICAgICAgICBDb25uZWN0aW9uIF9jb25uID0gZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChfY29ubiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJlcGFyZWRDbGVhclNxbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xlYXJTcWwgPSAiREVMRVRFIEZST00gIiArIHNlc3Npb25UYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgV0hFUkUgIiArIHNlc3Npb25BcHBDb2wgKyAiID0gPyI7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZENsZWFyU3FsID0gX2Nvbm4ucHJlcGFyZVN0YXRlbWVudChjbGVhclNxbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZENsZWFyU3FsLnNldFN0cmluZygxLCBnZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZENsZWFyU3FsLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQnJlYWsgb3V0IGFmdGVyIHRoZSBmaW5hbGx5IGJsb2NrCisgICAgICAgICAgICAgICAgICAgIG51bWJlck9mVHJpZXMgPSAwOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKGdldFN0b3JlTmFtZSgpICsgIi5TUUxFeGNlcHRpb24iLCBlKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYkNvbm5lY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGRiQ29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZShfY29ubik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG51bWJlck9mVHJpZXMtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmUgYSBzZXNzaW9uIHRvIHRoZSBTdG9yZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSBzZXNzaW9uIHRvIGJlIHN0b3JlZAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmUoU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbnVsbDsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG51bGw7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpcyA9IG51bGw7CisgICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBudW1iZXJPZlRyaWVzID0gMjsKKyAgICAgICAgICAgIHdoaWxlIChudW1iZXJPZlRyaWVzID4gMCkgeworICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gX2Nvbm4gPSBnZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKF9jb25uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIHNlc3Npb25zIGFscmVhZHkgZXhpc3QgaW4gREIsIHJlbW92ZSBhbmQgaW5zZXJ0IGFnYWluLgorICAgICAgICAgICAgICAgIC8vIFRPRE86CisgICAgICAgICAgICAgICAgLy8gKiBDaGVjayBpZiBJRCBleGlzdHMgaW4gZGF0YWJhc2UgYW5kIGlmIHNvIHVzZSBVUERBVEUuCisgICAgICAgICAgICAgICAgcmVtb3ZlKHNlc3Npb24uZ2V0SWRJbnRlcm5hbCgpKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oYm9zKSk7CisKKyAgICAgICAgICAgICAgICAgICAgKChTdGFuZGFyZFNlc3Npb24pIHNlc3Npb24pLndyaXRlT2JqZWN0RGF0YShvb3MpOworICAgICAgICAgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgb29zID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIG9icyA9IGJvcy50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IG9icy5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvYnMsIDAsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGJpcywgc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXBhcmVkU2F2ZVNxbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2F2ZVNxbCA9ICJJTlNFUlQgSU5UTyAiICsgc2Vzc2lvblRhYmxlICsgIiAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXNzaW9uSWRDb2wgKyAiLCAiICsgc2Vzc2lvbkFwcENvbCArICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2Vzc2lvbkRhdGFDb2wgKyAiLCAiICsgc2Vzc2lvblZhbGlkQ29sCisgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsICIgKyBzZXNzaW9uTWF4SW5hY3RpdmVDb2wgKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlc3Npb25MYXN0QWNjZXNzZWRDb2wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgVkFMVUVTICg/LCA/LCA/LCA/LCA/LCA/KSI7CisgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkU2F2ZVNxbCA9IF9jb25uLnByZXBhcmVTdGF0ZW1lbnQoc2F2ZVNxbCk7CisJCQkJCX0KKworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZFNhdmVTcWwuc2V0U3RyaW5nKDEsIHNlc3Npb24uZ2V0SWRJbnRlcm5hbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRTYXZlU3FsLnNldFN0cmluZygyLCBnZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZFNhdmVTcWwuc2V0QmluYXJ5U3RyZWFtKDMsIGluLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRTYXZlU3FsLnNldFN0cmluZyg0LCBzZXNzaW9uLmlzVmFsaWQoKSA/ICIxIiA6ICIwIik7CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkU2F2ZVNxbC5zZXRJbnQoNSwgc2Vzc2lvbi5nZXRNYXhJbmFjdGl2ZUludGVydmFsKCkpOworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZFNhdmVTcWwuc2V0TG9uZyg2LCBzZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkU2F2ZVNxbC5leGVjdXRlKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEJyZWFrIG91dCBhZnRlciB0aGUgZmluYWxseSBibG9jaworICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlRyaWVzID0gMDsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZyhnZXRTdG9yZU5hbWUoKSArICIuU1FMRXhjZXB0aW9uIiwgZSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGJDb25uZWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShkYkNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvb3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UoX2Nvbm4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBudW1iZXJPZlRyaWVzLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmRlYnVnKHNtLmdldFN0cmluZyhnZXRTdG9yZU5hbWUoKSArICIuc2F2aW5nIiwKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJZEludGVybmFsKCksIHNlc3Npb25UYWJsZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGUgY29ubmVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdG9yZSwgaWYgaXQncworICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGNsb3NlZCB0cnkgdG8gcmVvcGVuIGl0LgorICAgICAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGNvbm5lY3Rpb24gY291bGQgbm90IGJlIGVzdGFibGlzaGVkLgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT5Db25uZWN0aW9uPC9jb2RlPiBpZiB0aGUgY29ubmVjdGlvbiBzdWNlZWRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZGJDb25uZWN0aW9uID09IG51bGwgfHwgZGJDb25uZWN0aW9uLmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmluZm8oc20uZ2V0U3RyaW5nKGdldFN0b3JlTmFtZSgpICsgIi5jaGVja0Nvbm5lY3Rpb25EQkNsb3NlZCIpKTsKKyAgICAgICAgICAgICAgICBvcGVuKCk7CisgICAgICAgICAgICAgICAgaWYgKGRiQ29ubmVjdGlvbiA9PSBudWxsIHx8IGRiQ29ubmVjdGlvbi5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuaW5mbyhzbS5nZXRTdHJpbmcoZ2V0U3RvcmVOYW1lKCkgKyAiLmNoZWNrQ29ubmVjdGlvbkRCUmVPcGVuRmFpbCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoZ2V0U3RvcmVOYW1lKCkgKyAiLmNoZWNrQ29ubmVjdGlvblNRTEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIGV4LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkYkNvbm5lY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbiAoaWYgbmVjZXNzYXJ5KSBhbmQgcmV0dXJuIGEgZGF0YWJhc2UgY29ubmVjdGlvbiBmb3IgdXNlIGJ5CisgICAgICogdGhpcyBSZWFsbS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU1FMRXhjZXB0aW9uIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbm5lY3Rpb24gb3BlbigpIHRocm93cyBTUUxFeGNlcHRpb24geworCisgICAgICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBjb25uZWN0aW9uIGFscmVhZHkgb3BlbgorICAgICAgICBpZiAoZGJDb25uZWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGRiQ29ubmVjdGlvbik7CisKKyAgICAgICAgLy8gSW5zdGFudGlhdGUgb3VyIGRhdGFiYXNlIGRyaXZlciBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKGRyaXZlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShkcml2ZXJOYW1lKTsKKyAgICAgICAgICAgICAgICBkcml2ZXIgPSAoRHJpdmVyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKGdldFN0b3JlTmFtZSgpICsgIi5jaGVja0Nvbm5lY3Rpb25DbGFzc05vdEZvdW5kRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZyhnZXRTdG9yZU5hbWUoKSArICIuY2hlY2tDb25uZWN0aW9uQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBleC50b1N0cmluZygpKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoZ2V0U3RvcmVOYW1lKCkgKyAiLmNoZWNrQ29ubmVjdGlvbkNsYXNzTm90Rm91bmRFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXgudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gT3BlbiBhIG5ldyBjb25uZWN0aW9uCisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBpZiAoY29ubmVjdGlvbk5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHByb3BzLnB1dCgidXNlciIsIGNvbm5lY3Rpb25OYW1lKTsKKyAgICAgICAgaWYgKGNvbm5lY3Rpb25QYXNzd29yZCAhPSBudWxsKQorICAgICAgICAgICAgcHJvcHMucHV0KCJwYXNzd29yZCIsIGNvbm5lY3Rpb25QYXNzd29yZCk7CisgICAgICAgIGRiQ29ubmVjdGlvbiA9IGRyaXZlci5jb25uZWN0KGNvbm5lY3Rpb25VUkwsIHByb3BzKTsKKyAgICAgICAgZGJDb25uZWN0aW9uLnNldEF1dG9Db21taXQodHJ1ZSk7CisgICAgICAgIHJldHVybiAoZGJDb25uZWN0aW9uKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYkNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gYmUgY2xvc2VkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2xvc2UoQ29ubmVjdGlvbiBkYkNvbm5lY3Rpb24pIHsKKworICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIGFscmVhZHkgY2xvc2VkCisgICAgICAgIGlmIChkYkNvbm5lY3Rpb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBDbG9zZSBvdXIgcHJlcGFyZWQgc3RhdGVtZW50cyAoaWYgYW55KQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlcGFyZWRTaXplU3FsLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBmKSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5wcmVwYXJlZFNpemVTcWwgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVwYXJlZEtleXNTcWwuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGYpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnByZXBhcmVkS2V5c1NxbCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZXBhcmVkU2F2ZVNxbC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZikgeworICAgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIHRoaXMucHJlcGFyZWRTYXZlU3FsID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlcGFyZWRDbGVhclNxbC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZikgeworICAgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgICAKKwkJdHJ5IHsKKyAgICAgICAgICAgIHByZXBhcmVkUmVtb3ZlU3FsLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBmKSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5wcmVwYXJlZFJlbW92ZVNxbCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZXBhcmVkTG9hZFNxbC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZikgeworICAgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIHRoaXMucHJlcGFyZWRMb2FkU3FsID0gbnVsbDsKKworICAgICAgICAvLyBDbG9zZSB0aGlzIGRhdGFiYXNlIGNvbm5lY3Rpb24sIGFuZCBsb2cgYW55IGVycm9ycworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGJDb25uZWN0aW9uLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZyhnZXRTdG9yZU5hbWUoKSArICIuY2xvc2UiLCBlLnRvU3RyaW5nKCkpKTsgLy8gSnVzdCBsb2cgaXQgaGVyZQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdGhpcy5kYkNvbm5lY3Rpb24gPSBudWxsOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBjb25uZWN0aW9uLCBub3QgbmVlZGVkIGhlcmUgc2luY2UgdGhlCisgICAgICogY29ubmVjdGlvbiBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgY29ubmVjdGlvbiBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm4gVGhlIGNvbm5lY3Rpb24gdG8gYmUgcmVsZWFzZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWxlYXNlKENvbm5lY3Rpb24gY29ubikgeworICAgICAgICA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIG9uY2Ugd2hlbiB0aGlzIFN0b3JlIGlzIGZpcnN0IHN0YXJ0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc3RhcnQoKTsKKworICAgICAgICAvLyBPcGVuIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlCisgICAgICAgIHRoaXMuZGJDb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgdGVybWluYXRlIGV2ZXJ5dGhpbmcgYXNzb2NpYXRlZCB3aXRoIG91ciBkYi4KKyAgICAgKiBDYWxsZWQgb25jZSB3aGVuIHRoaXMgU3RvcmUgaXMgc3RvcGluZy4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc3RvcCgpOworCisgICAgICAgIC8vIENsb3NlIGFuZCByZWxlYXNlIGV2ZXJ5dGhpbmcgYXNzb2NpYXRlZCB3aXRoIG91ciBkYi4KKyAgICAgICAgaWYgKGRiQ29ubmVjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRiQ29ubmVjdGlvbi5jb21taXQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xvc2UoZGJDb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1YTYyYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNjcgQEAKK2FwcGxpY2F0aW9uU2Vzc2lvbi5zZXNzaW9uLmlzZT1pbnZhbGlkIHNlc3Npb24gc3RhdGUKK2FwcGxpY2F0aW9uU2Vzc2lvbi52YWx1ZS5pYWU9bnVsbCB2YWx1ZQorZmlsZVN0b3JlLmFscmVhZHlTdGFydGVkPUZpbGUgU3RvcmUgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCitmaWxlU3RvcmUubm90U3RhcnRlZD1GaWxlIFN0b3JlIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZAorZmlsZVN0b3JlLnNhdmluZz1TYXZpbmcgU2Vzc2lvbiB7MH0gdG8gZmlsZSB7MX0KK2ZpbGVTdG9yZS5sb2FkaW5nPUxvYWRpbmcgU2Vzc2lvbiB7MH0gZnJvbSBmaWxlIHsxfQorZmlsZVN0b3JlLnJlbW92aW5nPVJlbW92aW5nIFNlc3Npb24gezB9IGF0IGZpbGUgezF9CitKREJDU3RvcmUuYWxyZWFkeVN0YXJ0ZWQ9SkRCQyBTdG9yZSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKK0pEQkNTdG9yZS5jbG9zZT1FeGNlcHRpb24gY2xvc2luZyBkYXRhYmFzZSBjb25uZWN0aW9uIHswfQorSkRCQ1N0b3JlLm5vdFN0YXJ0ZWQ9SkRCQyBTdG9yZSBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQKK0pEQkNTdG9yZS5zYXZpbmc9U2F2aW5nIFNlc3Npb24gezB9IHRvIGRhdGFiYXNlIHsxfQorSkRCQ1N0b3JlLmxvYWRpbmc9TG9hZGluZyBTZXNzaW9uIHswfSBmcm9tIGRhdGFiYXNlIHsxfQorSkRCQ1N0b3JlLnJlbW92aW5nPVJlbW92aW5nIFNlc3Npb24gezB9IGF0IGRhdGFiYXNlIHsxfQorSkRCQ1N0b3JlLlNRTEV4Y2VwdGlvbj1TUUwgRXJyb3IgezB9CitKREJDU3RvcmUuY2hlY2tDb25uZWN0aW9uREJDbG9zZWQ9VGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gaXMgbnVsbCBvciB3YXMgZm91bmQgdG8gYmUgY2xvc2VkLiBUcnlpbmcgdG8gcmUtb3BlbiBpdC4KK0pEQkNTdG9yZS5jaGVja0Nvbm5lY3Rpb25EQlJlT3BlbkZhaWw9VGhlIHJlLW9wZW4gb24gdGhlIGRhdGFiYXNlIGZhaWxlZC4gVGhlIGRhdGFiYXNlIGNvdWxkIGJlIGRvd24uCitKREJDU3RvcmUuY2hlY2tDb25uZWN0aW9uU1FMRXhjZXB0aW9uPUEgU1FMIGV4Y2VwdGlvbiBvY2N1cnJlZCB7MH0KK0pEQkNTdG9yZS5jaGVja0Nvbm5lY3Rpb25DbGFzc05vdEZvdW5kRXhjZXB0aW9uPUpEQkMgZHJpdmVyIGNsYXNzIG5vdCBmb3VuZCB7MH0KK21hbmFnZXJCYXNlLmNvbXBsZXRlPVNlZWRpbmcgb2YgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaGFzIGJlZW4gY29tcGxldGVkCittYW5hZ2VyQmFzZS5nZXR0aW5nPUdldHRpbmcgbWVzc2FnZSBkaWdlc3QgY29tcG9uZW50IGZvciBhbGdvcml0aG0gezB9CittYW5hZ2VyQmFzZS5nb3R0ZW49Q29tcGxldGVkIGdldHRpbmcgbWVzc2FnZSBkaWdlc3QgY29tcG9uZW50CittYW5hZ2VyQmFzZS5yYW5kb209RXhjZXB0aW9uIGluaXRpYWxpemluZyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvZiBjbGFzcyB7MH0KK21hbmFnZXJCYXNlLnNlZWRpbmc9U2VlZGluZyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBjbGFzcyB7MH0KK3NlcnZlclNlc3Npb24udmFsdWUuaWFlPW51bGwgdmFsdWUKK3N0YW5kYXJkTWFuYWdlci5hbHJlYWR5U3RhcnRlZD1NYW5hZ2VyIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorc3RhbmRhcmRNYW5hZ2VyLmNyZWF0ZVNlc3Npb24uaXNlPWNyZWF0ZVNlc3Npb246IFRvbyBtYW55IGFjdGl2ZSBzZXNzaW9ucworc3RhbmRhcmRNYW5hZ2VyLmV4cGlyZUV4Y2VwdGlvbj1wcm9jZXNzc0V4cGlyZTogIEV4Y2VwdGlvbiBkdXJpbmcgc2Vzc2lvbiBleHBpcmF0aW9uCitzdGFuZGFyZE1hbmFnZXIubG9hZGluZz1Mb2FkaW5nIHBlcnNpc3RlZCBzZXNzaW9ucyBmcm9tIHswfQorc3RhbmRhcmRNYW5hZ2VyLmxvYWRpbmcuY25mZT1DbGFzc05vdEZvdW5kRXhjZXB0aW9uIHdoaWxlIGxvYWRpbmcgcGVyc2lzdGVkIHNlc3Npb25zOiB7MH0KK3N0YW5kYXJkTWFuYWdlci5sb2FkaW5nLmlvZT1JT0V4Y2VwdGlvbiB3aGlsZSBsb2FkaW5nIHBlcnNpc3RlZCBzZXNzaW9uczogezB9CitzdGFuZGFyZE1hbmFnZXIubm90U3RhcnRlZD1NYW5hZ2VyIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZAorc3RhbmRhcmRNYW5hZ2VyLnNlc3Npb25UaW1lb3V0PUludmFsaWQgc2Vzc2lvbiB0aW1lb3V0IHNldHRpbmcgezB9CitzdGFuZGFyZE1hbmFnZXIudW5sb2FkaW5nPVNhdmluZyBwZXJzaXN0ZWQgc2Vzc2lvbnMgdG8gezB9CitzdGFuZGFyZE1hbmFnZXIudW5sb2FkaW5nLmlvZT1JT0V4Y2VwdGlvbiB3aGlsZSBzYXZpbmcgcGVyc2lzdGVkIHNlc3Npb25zOiB7MH0KK3N0YW5kYXJkTWFuYWdlci5tYW5hZ2VyTG9hZD1FeGNlcHRpb24gbG9hZGluZyBzZXNzaW9ucyBmcm9tIHBlcnNpc3RlbnQgc3RvcmFnZQorc3RhbmRhcmRNYW5hZ2VyLm1hbmFnZXJVbmxvYWQ9RXhjZXB0aW9uIHVubG9hZGluZyBzZXNzaW9ucyB0byBwZXJzaXN0ZW50IHN0b3JhZ2UKK3N0YW5kYXJkU2Vzc2lvbi5hdHRyaWJ1dGVFdmVudD1TZXNzaW9uIGF0dHJpYnV0ZSBldmVudCBsaXN0ZW5lciB0aHJldyBleGNlcHRpb24KK3N0YW5kYXJkU2Vzc2lvbi5iaW5kaW5nRXZlbnQ9U2Vzc2lvbiBiaW5kaW5nIGV2ZW50IGxpc3RlbmVyIHRocmV3IGV4Y2VwdGlvbgorc3RhbmRhcmRTZXNzaW9uLmludmFsaWRhdGUuaXNlPWludmFsaWRhdGU6IFNlc3Npb24gYWxyZWFkeSBpbnZhbGlkYXRlZAorc3RhbmRhcmRTZXNzaW9uLmlzTmV3LmlzZT1pc05ldzogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uZ2V0QXR0cmlidXRlLmlzZT1nZXRBdHRyaWJ1dGU6IFNlc3Npb24gYWxyZWFkeSBpbnZhbGlkYXRlZAorc3RhbmRhcmRTZXNzaW9uLmdldEF0dHJpYnV0ZU5hbWVzLmlzZT1nZXRBdHRyaWJ1dGVOYW1lczogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uZ2V0Q3JlYXRpb25UaW1lLmlzZT1nZXRDcmVhdGlvblRpbWU6IFNlc3Npb24gYWxyZWFkeSBpbnZhbGlkYXRlZAorc3RhbmRhcmRTZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWUuaXNlPWdldExhc3RBY2Nlc3NlZFRpbWU6IFNlc3Npb24gYWxyZWFkeSBpbnZhbGlkYXRlZAorc3RhbmRhcmRTZXNzaW9uLmdldElkLmlzZT1nZXRJZDogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbC5pc2U9Z2V0TWF4SW5hY3RpdmVJbnRlcnZhbDogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uZ2V0VmFsdWVOYW1lcy5pc2U9Z2V0VmFsdWVOYW1lczogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24ubm90U2VyaWFsaXphYmxlPUNhbm5vdCBzZXJpYWxpemUgc2Vzc2lvbiBhdHRyaWJ1dGUgezB9IGZvciBzZXNzaW9uIHsxfQorc3RhbmRhcmRTZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZS5pc2U9cmVtb3ZlQXR0cmlidXRlOiBTZXNzaW9uIGFscmVhZHkgaW52YWxpZGF0ZWQKK3N0YW5kYXJkU2Vzc2lvbi5zZXNzaW9uRXZlbnQ9U2Vzc2lvbiBldmVudCBsaXN0ZW5lciB0aHJldyBleGNlcHRpb24KK3N0YW5kYXJkU2Vzc2lvbi5zZXRBdHRyaWJ1dGUuaWFlPXNldEF0dHJpYnV0ZTogTm9uLXNlcmlhbGl6YWJsZSBhdHRyaWJ1dGUKK3N0YW5kYXJkU2Vzc2lvbi5zZXRBdHRyaWJ1dGUuaXNlPXNldEF0dHJpYnV0ZTogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uc2V0QXR0cmlidXRlLm5hbWVudWxsPXNldEF0dHJpYnV0ZTogbmFtZSBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwKK3N0YW5kYXJkU2Vzc2lvbi5zZXNzaW9uQ3JlYXRlZD1DcmVhdGVkIFNlc3Npb24gaWQgPSB7MH0KK3BlcnNpc3RlbnRNYW5hZ2VyLmxvYWRpbmc9TG9hZGluZyB7MH0gcGVyc2lzdGVkIHNlc3Npb25zCitwZXJzaXN0ZW50TWFuYWdlci51bmxvYWRpbmc9U2F2aW5nIHswfSBwZXJzaXN0ZWQgc2Vzc2lvbnMKK3BlcnNpc3RlbnRNYW5hZ2VyLmV4cGlyaW5nPUV4cGlyaW5nIHswfSBzZXNzaW9ucyBiZWZvcmUgc2F2aW5nIHRoZW0KK3BlcnNpc3RlbnRNYW5hZ2VyLmRlc2VyaWFsaXplRXJyb3I9RXJyb3IgZGVzZXJpYWxpemluZyBTZXNzaW9uIHswfTogezF9CitwZXJzaXN0ZW50TWFuYWdlci5zZXJpYWxpemVFcnJvcj1FcnJvciBzZXJpYWxpemluZyBTZXNzaW9uIHswfTogezF9CitwZXJzaXN0ZW50TWFuYWdlci5zd2FwTWF4SWRsZT1Td2FwcGluZyBzZXNzaW9uIHswfSB0byBTdG9yZSwgaWRsZSBmb3IgezF9IHNlY29uZHMKK3BlcnNpc3RlbnRNYW5hZ2VyLmJhY2t1cE1heElkbGU9QmFja2luZyB1cCBzZXNzaW9uIHswfSB0byBTdG9yZSwgaWRsZSBmb3IgezF9IHNlY29uZHMKK3BlcnNpc3RlbnRNYW5hZ2VyLmJhY2t1cEV4Y2VwdGlvbj1FeGNlcHRpb24gb2NjdXJyZWQgd2hlbiBiYWNraW5nIHVwIFNlc3Npb24gezB9OiB7MX0KK3BlcnNpc3RlbnRNYW5hZ2VyLnRvb01hbnlBY3RpdmU9VG9vIG1hbnkgYWN0aXZlIHNlc3Npb25zLCB7MH0sIGxvb2tpbmcgZm9yIGlkbGUgc2Vzc2lvbnMgdG8gc3dhcCBvdXQKK3BlcnNpc3RlbnRNYW5hZ2VyLnN3YXBUb29NYW55QWN0aXZlPVN3YXBwaW5nIG91dCBzZXNzaW9uIHswfSwgaWRsZSBmb3IgezF9IHNlY29uZHMgdG9vIG1hbnkgc2Vzc2lvbnMgYWN0aXZlCitwZXJzaXN0ZW50TWFuYWdlci5wcm9jZXNzU3dhcHM9Q2hlY2tpbmcgZm9yIHNlc3Npb25zIHRvIHN3YXAgb3V0LCB7MH0gYWN0aXZlIHNlc3Npb25zIGluIG1lbW9yeQorcGVyc2lzdGVudE1hbmFnZXIuYWN0aXZlU2Vzc2lvbj1TZXNzaW9uIHswfSBoYXMgYmVlbiBpZGxlIGZvciB7MX0gc2Vjb25kcworcGVyc2lzdGVudE1hbmFnZXIuc3dhcEluPVN3YXBwaW5nIHNlc3Npb24gezB9IGluIGZyb20gU3RvcmUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwMjc5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNjYgQEAKK2FwcGxpY2F0aW9uU2Vzc2lvbi5zZXNzaW9uLmlzZT1lc3RhZG8gaW524WxpZG8gZGUgc2VzafNuCithcHBsaWNhdGlvblNlc3Npb24udmFsdWUuaWFlPXZhbG9yIG51bG8KK2ZpbGVTdG9yZS5hbHJlYWR5U3RhcnRlZD1ZYSBoYSBzaWRvIGFycmFuY2FkbyBlbCBBbG1hY+luIGRlIEFyY2hpdm9zCitmaWxlU3RvcmUubm90U3RhcnRlZD1B+m4gbm8gc2UgaGEgYXJyYW5jYWRvIGVsIEFsbWFj6W4gZGUgQXJjaGl2b3MKK2ZpbGVTdG9yZS5zYXZpbmc9U2FsdmFuZG8gU2VzafNuIHswfSBlbiBhcmNoaXZvIHsxfQorZmlsZVN0b3JlLmxvYWRpbmc9Q2FyZ2FuZG8gU2VzafNuIHswfSBkZXNkZSBhcmNoaXZvIHsxfQorZmlsZVN0b3JlLnJlbW92aW5nPVF1aXRhbmRvIFNlc2nzbiB7MH0gZW4gYXJjaGl2byB7MX0KK0pEQkNTdG9yZS5hbHJlYWR5U3RhcnRlZD1ZYSBoYSBzaWRvIGFycmFuY2FkbyBlbCBBbG1hY+luIEpEQkMKK0pEQkNTdG9yZS5jbG9zZT1FeGNlcGNp824gY2VycmFuZG8gY29uZXhp824gYSBiYXNlIGRlIGRhdG9zIHswfQorSkRCQ1N0b3JlLm5vdFN0YXJ0ZWQ9QfpuIG5vIHNlIGhhIGFycmFuY2FkbyBlbCBBbG1hY+luIEpEQkMKK0pEQkNTdG9yZS5zYXZpbmc9U2FsdmFuZG8gU2VzafNuIHswfSBlbiBiYXNlIGRlIGRhdG9zIHsxfQorSkRCQ1N0b3JlLmxvYWRpbmc9Q2FyZ2FuZG8gU2VzafNuIHswfSBkZXNkZSBiYXNlIGRlIGRhdG9zIHsxfQorSkRCQ1N0b3JlLnJlbW92aW5nPVF1aXRhbmRvIFNlc2nzbiB7MH0gZW4gYmFzZSBkZSBkYXRvcyB7MX0KK0pEQkNTdG9yZS5TUUxFeGNlcHRpb249RXJyb3IgU1FMIHswfQorSkRCQ1N0b3JlLmNoZWNrQ29ubmVjdGlvbkRCQ2xvc2VkPUxhIGNvbmV4afNuYSBhIGJhc2UgZGUgZGF0b3MgZXMgbnVsYSBvIGVzdOEgY2VycmFkYS4gSW50ZW50YW5kbyByZWFicmlybGEuCitKREJDU3RvcmUuY2hlY2tDb25uZWN0aW9uREJSZU9wZW5GYWlsPUZhbGzzIGxhIHJlYXBlcnR1cmEgZGUgbGEgYmFzZSBkZSBkYXRvcy4gUHVlZGUgcXVlIGxhIGJhc2UgZGUgZGF0b3MgZXN06SBjYe1kYS4KK0pEQkNTdG9yZS5jaGVja0Nvbm5lY3Rpb25TUUxFeGNlcHRpb249SGEgdGVuaWRvIGx1Z2FyIHVuYSBleGNlcGNp824gU1FMIHswfQorSkRCQ1N0b3JlLmNoZWNrQ29ubmVjdGlvbkNsYXNzTm90Rm91bmRFeGNlcHRpb249Tm8gc2UgaGEgaGFsbGFkbyBsYSBjbGFzZSBkZWwgbWFuZWphZG9yIChkcml2ZXIpIEpEQkMgezB9CittYW5hZ2VyQmFzZS5jb21wbGV0ZT1TZSBoYSBjb21wbGV0YWRvIGxhIHNpZW1icmEgZGVsIGdlbmVyYWRvciBkZSBu+m1lcm9zIGFsZWF0b3Jpb3MKK21hbmFnZXJCYXNlLmdldHRpbmc9T2J0ZW5pZW5kbyBtZW5zYWplIGRlIGNvbXBvbmVudGUgZGUgcmVzdW1lbiAoZGlnZXN0KSBwYXJhIGFsZ29yaXRtbyB7MH0KK21hbmFnZXJCYXNlLmdvdHRlbj1Db21wbGV0YWRhIGxhIG9idGVuY2nzbiBkZSBtZW5zYWplIGRlIGNvbXBvbmVudGUgZGUgcmVzdW1lbiAoZGlnZXN0KQorbWFuYWdlckJhc2UucmFuZG9tPUV4Y2VwY2nzbiBpbmljaWFsaXphbmRvIGdlbmVyYWRvciBkZSBu+m1lcm9zIGFsZWF0b3Jpb3MgZGUgY2xhc2UgezB9CittYW5hZ2VyQmFzZS5zZWVkaW5nPVNlbWJyYW5kbyBjbGFzZSBkZSBnZW5lcmFkb3IgZGUgbvptZXJvcyBhbGVhdG9yaW9zIHswfQorc2VydmVyU2Vzc2lvbi52YWx1ZS5pYWU9dmFsb3IgbnVsbworc3RhbmRhcmRNYW5hZ2VyLmFscmVhZHlTdGFydGVkPVlhIGhhIHNpZG8gYXJyYW5jYWRvIGVsIEdlc3Rvcgorc3RhbmRhcmRNYW5hZ2VyLmNyZWF0ZVNlc3Npb24uaXNlPWNyZWF0ZVNlc3Npb246IERlbWFzaWFkYXMgc2VzaW9uZXMgYWN0aXZhcworc3RhbmRhcmRNYW5hZ2VyLmV4cGlyZUV4Y2VwdGlvbj1wcm9jZXNzc0V4cGlyZTogRXhjZXBjafNuIGR1cmFudGUgbGEgZXhwaXJhY2nzbiBkZSBzZXNp824KK3N0YW5kYXJkTWFuYWdlci5sb2FkaW5nPUNhcmdhbmRvIHNlc2lvbmVzIHBlcnNpc3RpZGFzIGRlc2RlIHswfQorc3RhbmRhcmRNYW5hZ2VyLmxvYWRpbmcuY25mZT1DbGFzc05vdEZvdW5kRXhjZXB0aW9uIGFsIGNhcmdhciBzZXNpb25lcyBwZXJzaXN0aWRhczogezB9CitzdGFuZGFyZE1hbmFnZXIubG9hZGluZy5pb2U9SU9FeGNlcHRpb24gYWwgY2FyZ2FyIHNlc2lvbmVzIHBlcnNpc3RpZGFzOiB7MH0KK3N0YW5kYXJkTWFuYWdlci5ub3RTdGFydGVkPUH6biBubyBzZSBoYSBhcnJhbmNhZG8gZWwgR2VzdG9yCitzdGFuZGFyZE1hbmFnZXIuc2Vzc2lvblRpbWVvdXQ9VmFsb3IgaW524WxpZG8gZGUgVGllbXBvIEFnb3RhZG8gZGUgc2VzafNuIHswfQorc3RhbmRhcmRNYW5hZ2VyLnVubG9hZGluZz1TYWx2YW5kbyBzZXNpb25lcyBwZXJzaXN0aWRhcyBhIHswfQorc3RhbmRhcmRNYW5hZ2VyLnVubG9hZGluZy5pb2U9SU9FeGNlcHRpb24gYWwgc2FsdmFyIHNlc2lvbmVzIHBlcnNpc3RpZGFzOiB7MH0KK3N0YW5kYXJkTWFuYWdlci5tYW5hZ2VyTG9hZD1FeGNlcGNp824gY2FyZ2FuZG8gc2VzaW9uZXMgZGVzZGUgYWxtYWNlbmFtaWVudG8gcGVyc2lzdGVudGUKK3N0YW5kYXJkTWFuYWdlci5tYW5hZ2VyVW5sb2FkPUV4Y2VwY2nzbiBkZXNjYXJnYW5kbyBzZXNpb25lcyBhIGFsbWFjZW5hbWllbnRvIHBlcnNpc3RlbnRlCitzdGFuZGFyZFNlc3Npb24uYXR0cmlidXRlRXZlbnQ9RWwgZXNjdWNoYWRvciBkZSBldmVudG9zIGRlIGF0cmlidXRvIGRlIFNlc2nzbiBsYW568yB1bmEgZXhjZXBjafNuCitzdGFuZGFyZFNlc3Npb24uaW52YWxpZGF0ZS5pc2U9aW52YWxpZGF0ZTogTGEgU2VzafNuIHlhIGhhIHNpZG8gaW52YWxpZGFkYQorc3RhbmRhcmRTZXNzaW9uLmlzTmV3LmlzZT1pc05ldzogTGEgU2VzafNuIHlhIGhhIHNpZG8gaW52YWxpZGFkYQorc3RhbmRhcmRTZXNzaW9uLmdldEF0dHJpYnV0ZS5pc2U9Z2V0QXR0cmlidXRlOiBMYSBTZXNp824geWEgaGEgc2lkbyBpbnZhbGlkYWRhCitzdGFuZGFyZFNlc3Npb24uZ2V0QXR0cmlidXRlTmFtZXMuaXNlPWdldEF0dHJpYnV0ZU5hbWVzOiBMYSBTZXNp824geWEgaGEgc2lkbyBpbnZhbGlkYWRhCitzdGFuZGFyZFNlc3Npb24uZ2V0Q3JlYXRpb25UaW1lLmlzZT1nZXRDcmVhdGlvblRpbWU6IExhIFNlc2nzbiB5YSBoYSBzaWRvIGludmFsaWRhZGEKK3N0YW5kYXJkU2Vzc2lvbi5nZXRMYXN0QWNjZXNzZWRUaW1lLmlzZT1nZXRMYXN0QWNjZXNzZWRUaW1lOiBMYSBTZXNp824geWEgaGEgc2lkbyBpbnZhbGlkYWRhCitzdGFuZGFyZFNlc3Npb24uZ2V0SWQuaXNlPWdldElkOiBMYSBTZXNp824geWEgaGEgc2lkbyBpbnZhbGlkYWRhCitzdGFuZGFyZFNlc3Npb24uZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbC5pc2U9Z2V0TWF4SW5hY3RpdmVJbnRlcnZhbDogTGEgU2VzafNuIHlhIGhhIHNpZG8gaW52YWxpZGFkYQorc3RhbmRhcmRTZXNzaW9uLmdldFZhbHVlTmFtZXMuaXNlPWdldFZhbHVlTmFtZXM6IExhIFNlc2nzbiB5YSBoYSBzaWRvIGludmFsaWRhZGEKK3N0YW5kYXJkU2Vzc2lvbi5ub3RTZXJpYWxpemFibGU9Tm8gcHVlZG8gc2VyaWFsaXphciBhdHJpYnV0byBkZSBzZXNp824gezB9IHBhcmEgc2VzafNuIHsxfQorc3RhbmRhcmRTZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZS5pc2U9cmVtb3ZlQXR0cmlidXRlOiBMYSBTZXNp824geWEgaGEgc2lkbyBpbnZhbGlkYWRhCitzdGFuZGFyZFNlc3Npb24uc2Vzc2lvbkV2ZW50PUVsIGVzY3VjaGFkb3IgZGUgZXZlbnRvIGRlIFNlc2nzbiBsYW568yB1bmEgZXhlY3BjafNuCitzdGFuZGFyZFNlc3Npb24uc2V0QXR0cmlidXRlLmlhZT1zZXRBdHRyaWJ1dGU6IEF0cmlidXRvIG5vIHNlcmlhbGl6YWJsZQorc3RhbmRhcmRTZXNzaW9uLnNldEF0dHJpYnV0ZS5pc2U9c2V0QXR0cmlidXRlOiBMYSBTZXNp824geWEgaGEgc2lkbyBpbnZhbGlkYWRhCitzdGFuZGFyZFNlc3Npb24uc2V0QXR0cmlidXRlLm5hbWVudWxsPXNldEF0dHJpYnV0ZTogZWwgbnVldm8gcGFy4W1ldHJvIG5vIHB1ZWRlIHNlciBudWxvCitzdGFuZGFyZFNlc3Npb24uc2Vzc2lvbkNyZWF0ZWQ9Q3JlYWRhIFNlc2nzbiBpZCA9IHswfQorcGVyc2lzdGVudE1hbmFnZXIubG9hZGluZz1DYXJnYW5kbyB7MH0gc2VzaW9uZXMgcGVyc2lzdGlkYXMKK3BlcnNpc3RlbnRNYW5hZ2VyLnVubG9hZGluZz1TYWx2YW5kbyB7MH0gc2VzaW9uZXMgcGVyc2lzdGlkYXMKK3BlcnNpc3RlbnRNYW5hZ2VyLmV4cGlyaW5nPUV4cGlyYW5kbyB7MH0gc2VzaW9uZXMgYW50ZXMgZGUgc2FsdmFybGFzCitwZXJzaXN0ZW50TWFuYWdlci5kZXNlcmlhbGl6ZUVycm9yPUVycm9yIGRlcy1zZXJpYWxpemFuZG8gU2VzafNuIHswfTogezF9CitwZXJzaXN0ZW50TWFuYWdlci5zZXJpYWxpemVFcnJvcj1FcnJvciBzZXJpYWxpemFuZG8gU2VzafNuIHswfTogezF9CitwZXJzaXN0ZW50TWFuYWdlci5zd2FwTWF4SWRsZT1JbnRlcmNhbWJpYW5kbyBzZXNp824gezB9IGEgZnVlcmEgYSBBbG1hY+luLCBvY2lvc2EgZHVyYW50ZSB7MX0gc2VndW5kb3MKK3BlcnNpc3RlbnRNYW5hZ2VyLmJhY2t1cE1heElkbGU9UmVzcGFsZGFuZG8gc2VzafNuIHswfSBhIEFsbWFj6W4sIG9jaW9zYSBkdXJhbnRlIHsxfSBzZWd1bmRvcworcGVyc2lzdGVudE1hbmFnZXIuYmFja3VwRXhjZXB0aW9uPUhhIHRlbmlkbyBsdWdhciB1bmEgZXhjZXBjafNuIGFsIHJlc3BhbGRhciBsYSBTZXNp824gezB9OiB7MX0KK3BlcnNpc3RlbnRNYW5hZ2VyLnRvb01hbnlBY3RpdmU9RGVtYXNpYWRhcyBzZXNpb25lcyBhY3RpdmFzLCB7MH0sIGJ1c2NhbmRvIHNlc2lvbmVzIG9jaW9zYXMgcGFyYSBpbnRlcmNhbWJpYXIKK3BlcnNpc3RlbnRNYW5hZ2VyLnN3YXBUb29NYW55QWN0aXZlPUludGVyY2FtYmlhbmRvIHNlc2nzbiB7MH0gYSBmdWVyYSwgb2Npb3NhIGR1cmFudGUgezF9IHNlZ3VuZG9zOiBEZW1hc2lhZGFzIHNlc2lvbmVzIGFjdGl2YXMKK3BlcnNpc3RlbnRNYW5hZ2VyLnByb2Nlc3NTd2Fwcz1NaXJhbmRvIHF16SBzZXNpb25lcyBpbnRlcmNhbWJpYXIgYSBmdWVyYSwgezB9IHNlc2lvbmVzIGFjdGl2YXMgZW4gbWVtb3JpYQorcGVyc2lzdGVudE1hbmFnZXIuYWN0aXZlU2Vzc2lvbj1MYSBzZXNp824gezB9IGhhIGVzdGFkbyBvY2lvc2EgZHVyYW50ZSB7MX0gc2VndW5kb3MKK3BlcnNpc3RlbnRNYW5hZ2VyLnN3YXBJbj1JbnRlcmNhbWJpYW5kbyBzZXNp824gezB9IGEgZGVudHJvIGRlc2RlIEFsbWFj6W4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5YjY5MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNjUgQEAKK2FwcGxpY2F0aW9uU2Vzc2lvbi5zZXNzaW9uLmlzZT3pdGF0IGRlIHNlc3Npb24gaW52YWxpZGUKK2FwcGxpY2F0aW9uU2Vzc2lvbi52YWx1ZS5pYWU9dmFsZXVyIG51bGxlCitmaWxlU3RvcmUuYWxyZWFkeVN0YXJ0ZWQ9TGUgIkZpbGUgU3RvcmUiIGEgZOlq4CDpdOkgZOltYXJy6QorZmlsZVN0b3JlLm5vdFN0YXJ0ZWQ9TGUgIkZpbGUgU3RvcmUiIG4nJ2EgcGFzIGVuY29yZSDpdOkgZOltYXJy6QorZmlsZVN0b3JlLnNhdmluZz1TYXV2ZWdhcmRlIGRlIGxhIFNlc3Npb24gezB9IHZlcnMgbGUgZmljaGllciB7MX0KK2ZpbGVTdG9yZS5sb2FkaW5nPUNoYXJnZW1lbnQgZGUgbGEgU2Vzc2lvbiB7MH0gZGVwdWlzIGxlIGZpY2hpZXIgezF9CitmaWxlU3RvcmUucmVtb3Zpbmc9UmV0cmFpdCBkZSBsYSBTZXNzaW9uIHswfSBkdSBmaWNoaWVyIHsxfQorSkRCQ1N0b3JlLmFscmVhZHlTdGFydGVkPUxlICJKREJDIFN0b3JlIiBhIGTpauAg6XTpIGTpbWFycukKK0pEQkNTdG9yZS5ub3RTdGFydGVkPUxlICJKREJDIFN0b3JlIiBuJydhIHBhcyBlbmNvcmUg6XTpIGTpbWFycukKK0pEQkNTdG9yZS5zYXZpbmc9U2F1dmVnYXJkZSBkZSBsYSBTZXNzaW9uIHswfSB2ZXJzIGxhIGJhc2UgZGUgZG9ubullcyB7MX0KK0pEQkNTdG9yZS5sb2FkaW5nPUNoYXJnZW1lbnQgZGUgbGEgU2Vzc2lvbiB7MH0gZGVwdWlzIGxhIGJhc2UgZGUgZG9ubullcyB7MX0KK0pEQkNTdG9yZS5yZW1vdmluZz1SZXRyYWl0IGRlIGxhIFNlc3Npb24gezB9IGRlIGxhIGJhc2UgZGUgZG9ubullcyB7MX0KK0pEQkNTdG9yZS5TUUxFeGNlcHRpb249RXJyZXVyIFNRTCB7MH0KK0pEQkNTdG9yZS5jaGVja0Nvbm5lY3Rpb25EQkNsb3NlZD1MYSBjb25uZXhpb24g4CBsYSBiYXNlIGRlIGRvbm7pZXMgZXN0IG51bGxlIG91IGEg6XTpIHRyb3V26SBmZXJt6S4gVGVudGF0aXZlIGRlIHLpb3V2ZXJ0dXJlLgorSkRCQ1N0b3JlLmNoZWNrQ29ubmVjdGlvbkRCUmVPcGVuRmFpbD1MYSB0ZW50YXRpdmUgZGUgculvdXZlcnR1cmUgcmUtb3BlbiBkZSBsYSBiYXNlIGRlIGRvbm7pZXMgYSDpY2hvdekuIExhIGJhc2UgZGUgZG9ubullcyBlc3QgcGV1dCDqdHJlIGFycul06WUuCitKREJDU3RvcmUuY2hlY2tDb25uZWN0aW9uU1FMRXhjZXB0aW9uPVVuZSBleGNlcHRpb24gU1FMIHMnJ2VzdCBwcm9kdWl0ZSB7MH0KK0pEQkNTdG9yZS5jaGVja0Nvbm5lY3Rpb25DbGFzc05vdEZvdW5kRXhjZXB0aW9uPUxhIGNsYXNzZSBkdSBkcml2ZXIgSkRCQyBuJydhIHBhcyDpdOkgdHJvdXbpZSB7MH0KK21hbmFnZXJCYXNlLmNvbXBsZXRlPUwnJ2FsaW1lbnRhdGlvbiBkdSBn6W7pcmF0ZXVyIGRlIG5vbWJyZSBhbOlhdG9pcmUgZXN0IHRlcm1pbukKK21hbmFnZXJCYXNlLmdldHRpbmc9UHJpc2UgZHUgY29tcG9zYW50IGQnJ2FsZ29yaXRobWUgZW1wcmVpbnRlIGRlIG1lc3NhZ2UgKG1lc3NhZ2UgZGlnZXN0KSBwb3VyIGwnJ2FsZ29yaXRobWUgezB9CittYW5hZ2VyQmFzZS5nb3R0ZW49UHJpc2UgZHUgY29tcG9zYW50IGQnJ2FsZ29yaXRobWUgZW1wcmVpbnRlIGRlIG1lc3NhZ2UgKG1lc3NhZ2UgZGlnZXN0KSB0ZXJtaW7pZQorbWFuYWdlckJhc2UucmFuZG9tPUV4Y2VwdGlvbiBkdXJhbnQgbCcnaW5pdGlhbGlzYXRpb24gZGUgbGEgY2xhc3NlIGR1IGfpbulyYXRldXIgZGUgbm9tYnJlIGFs6WF0b2lyZSB7MH0KK21hbmFnZXJCYXNlLnNlZWRpbmc9QWxpbWVudGF0aW9uIGRlIGxhIGNsYXNzZSBkdSBn6W7pcmF0ZXVyIGRlIG5vbWJyZSBhbOlhdG9pcmUgezB9CitzZXJ2ZXJTZXNzaW9uLnZhbHVlLmlhZT12YWxldXIgbnVsbGUKK3N0YW5kYXJkTWFuYWdlci5hbHJlYWR5U3RhcnRlZD1MZSAiTWFuYWdlciIgYSDpdOkgZOltYXJy6Qorc3RhbmRhcmRNYW5hZ2VyLmNyZWF0ZVNlc3Npb24uaXNlPSJjcmVhdGVTZXNzaW9uIjogVHJvcCBkZSBzZXNzaW9ucyBhY3RpdmVzCitzdGFuZGFyZE1hbmFnZXIuZXhwaXJlRXhjZXB0aW9uPSJwcm9jZXNzc0V4cGlyZSI6ICBFeGNlcHRpb24gbG9ycyBkZSBsJydleHBpcmF0aW9uIGRlIGxhIHNlc3Npb24KK3N0YW5kYXJkTWFuYWdlci5sb2FkaW5nPUNoYXJnZW1lbnQgZGVzIHNlc3Npb25zIHF1aSBvbnQgcGVyc2lzdOlzIGRlcHVpcyB7MH0KK3N0YW5kYXJkTWFuYWdlci5sb2FkaW5nLmNuZmU9IkNsYXNzTm90Rm91bmRFeGNlcHRpb24iIGxvcnMgZHUgY2hhcmdlbWVudCBkZSBzZXNzaW9ucyBwZXJzaXN0YW50ZXM6IHswfQorc3RhbmRhcmRNYW5hZ2VyLmxvYWRpbmcuaW9lPSJJT0V4Y2VwdGlvbiIgbG9ycyBkdSBjaGFyZ2VtZW50IGRlcyBzZXNzaW9ucyBwZXJzaXN0YW50ZXM6IHswfQorc3RhbmRhcmRNYW5hZ2VyLm5vdFN0YXJ0ZWQ9TGUgIk1hbmFnZXIiIG4nJ2EgcGFzIGVuY29yZSDpdOkgZOltYXJy6Qorc3RhbmRhcmRNYW5hZ2VyLnNlc3Npb25UaW1lb3V0PVLpZ2xhZ2UgZHUgZOlsYWkgZCcnaW5hY3Rpdml06SAodGltZW91dCkgZGUgc2Vzc2lvbiBpbnZhbGlkZSB7MH0KK3N0YW5kYXJkTWFuYWdlci51bmxvYWRpbmc9U2F1dmVnYXJkZSBkZXMgc2Vzc2lvbnMgYXlhbnQgcGVyc2lzdOllcyB2ZXJzIHswfQorc3RhbmRhcmRNYW5hZ2VyLnVubG9hZGluZy5pb2U9IklPRXhjZXB0aW9uIiBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZGUgc2Vzc2lvbnMgcGVyc2lzdGFudGVzOiB7MH0KK3N0YW5kYXJkTWFuYWdlci5tYW5hZ2VyTG9hZD1FeGNlcHRpb24gYXUgY2hhcmdlbWVudCBkZXMgc2Vzc2lvbnMgZGVwdWlzIGxlIHN0b2NrYWdlIHBlcnNpc3RhbnQgKHBlcnNpc3RlbnQgc3RvcmFnZSkKK3N0YW5kYXJkTWFuYWdlci5tYW5hZ2VyVW5sb2FkPUV4Y2VwdGlvbiBhdSBk6WNoYXJnZW1lbnQgZGVzIHNlc3Npb25zIHZlcnMgbGUgc3RvY2thZ2UgcGVyc2lzdGFudCAocGVyc2lzdGVudCBzdG9yYWdlKQorc3RhbmRhcmRTZXNzaW9uLmF0dHJpYnV0ZUV2ZW50PUwnJ+ljb3V0ZXVyIGQnJ+l26G5lbWVudCBBdHRyaWJ1dCBkZSBTZXNzaW9uIChhdHRyaWJ1dGUgZXZlbnQgbGlzdGVuZXIpIGEgZ+lu6XLpIHVuZSBleGNlcHRpb24KK3N0YW5kYXJkU2Vzc2lvbi5pbnZhbGlkYXRlLmlzZT0iaW52YWxpZGF0ZSI6IFNlc3Npb24gZOlq4CBpbnZhbGlk6WUKK3N0YW5kYXJkU2Vzc2lvbi5pc05ldy5pc2U9ImlzTmV3IjogU2Vzc2lvbiBk6WrgIGludmFsaWTpZQorc3RhbmRhcmRTZXNzaW9uLmdldEF0dHJpYnV0ZS5pc2U9ImdldEF0dHJpYnV0ZSI6IFNlc3Npb24gZOlq4CBpbnZhbGlk6WUKK3N0YW5kYXJkU2Vzc2lvbi5nZXRBdHRyaWJ1dGVOYW1lcy5pc2U9ImdldEF0dHJpYnV0ZU5hbWVzIjogU2Vzc2lvbiBk6WrgIGludmFsaWTpZQorc3RhbmRhcmRTZXNzaW9uLmdldENyZWF0aW9uVGltZS5pc2U9ImdldENyZWF0aW9uVGltZSI6IFNlc3Npb24gZOlq4CBpbnZhbGlk6WUKK3N0YW5kYXJkU2Vzc2lvbi5nZXRMYXN0QWNjZXNzZWRUaW1lLmlzZT0iZ2V0TGFzdEFjY2Vzc2VkVGltZSI6IFNlc3Npb24gZFx1MDBFOWpcdTAwRTAgaW52YWxpZFx1MDBFOWUKK3N0YW5kYXJkU2Vzc2lvbi5nZXRJZC5pc2U9Z2V0SWQ6IFNlc3Npb24gZOlq4CBpbnZhbGlk6WUKK3N0YW5kYXJkU2Vzc2lvbi5nZXRNYXhJbmFjdGl2ZUludGVydmFsLmlzZT0iZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCI6IFNlc3Npb24gZOlq4CBpbnZhbGlk6WUKK3N0YW5kYXJkU2Vzc2lvbi5nZXRWYWx1ZU5hbWVzLmlzZT0iZ2V0VmFsdWVOYW1lcyI6IFNlc3Npb24gZOlq4CBpbnZhbGlk6WUKK3N0YW5kYXJkU2Vzc2lvbi5ub3RTZXJpYWxpemFibGU9SW1wb3NzaWJsZSBkZSBz6XJpYWxpc2VyIGwnJ2F0dHJpYnV0IGRlIHNlc3Npb24gezB9IHBvdXIgbGEgc2Vzc2lvbiB7MX0KK3N0YW5kYXJkU2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUuaXNlPSJyZW1vdmVBdHRyaWJ1dGUiOiBTZXNzaW9uIGTpauAgaW52YWxpZOllCitzdGFuZGFyZFNlc3Npb24uc2Vzc2lvbkV2ZW50PUwnJ+ljb3V0ZXVyIGQnJ+l26G5lbWVudCBkZSBzZXNzaW9uIChzZXNzaW9uIGV2ZW50IGxpc3RlbmVyKSBhIGfpbuly6SB1bmUgZXhjZXB0aW9uCitzdGFuZGFyZFNlc3Npb24uc2V0QXR0cmlidXRlLmlhZT0ic2V0QXR0cmlidXRlIjogYXR0cmlidXQgbm9uIHPpcmlhbGlzYWJsZQorc3RhbmRhcmRTZXNzaW9uLnNldEF0dHJpYnV0ZS5pc2U9InNldEF0dHJpYnV0ZSI6IFNlc3Npb24gZOlq4CBpbnZhbGlk6WUKK3N0YW5kYXJkU2Vzc2lvbi5zZXRBdHRyaWJ1dGUubmFtZW51bGw9InNldEF0dHJpYnV0ZSI6IGxlIG5vbSBkZSBwYXJhbeh0cmUgbmUgcGV1dCDqdHJlIG51bAorc3RhbmRhcmRTZXNzaW9uLnNlc3Npb25DcmVhdGVkPUNy6WF0aW9uIGRlIGwnJ0lkIGRlIFNlc3Npb24gPSB7MH0KK3BlcnNpc3RlbnRNYW5hZ2VyLmxvYWRpbmc9Q2hhcmdlbWVudCBkZSB7MH0gc2Vzc2lvbnMgcGVyc2lzdGFudGVzCitwZXJzaXN0ZW50TWFuYWdlci51bmxvYWRpbmc9U2F1dmVnYXJkZSBkZSB7MH0gc2Vzc2lvbnMgcGVyc2lzdGFudGVzCitwZXJzaXN0ZW50TWFuYWdlci5leHBpcmluZz1FeHBpcmF0aW9uIGRlIHswfSBzZXNzaW9ucyBhdmFudCBsZXVyIHNhdXZlZ2FyZGUKK3BlcnNpc3RlbnRNYW5hZ2VyLmRlc2VyaWFsaXplRXJyb3I9RXJyZXVyIGxvcnMgZGUgbGEgZOlz6XJpYWxpc2F0aW9uIGRlIGxhIHNlc3Npb24gezB9OiB7MX0KK3BlcnNpc3RlbnRNYW5hZ2VyLnNlcmlhbGl6ZUVycm9yPUVycmV1ciBsb3JzIGRlIGxhIHPpcmlhbGlzYXRpb24gZGUgbGEgc2Vzc2lvbiB7MH06IHsxfQorcGVyc2lzdGVudE1hbmFnZXIuc3dhcE1heElkbGU9QmFzY3VsZW1lbnQgZGUgbGEgc2Vzc2lvbiB7MH0gdmVycyBsZSBzdG9ja2FnZSAoU3RvcmUpLCBlbiBhdHRlbnRlIHBvdXIgezF9IHNlY29uZGVzCitwZXJzaXN0ZW50TWFuYWdlci5iYWNrdXBNYXhJZGxlPVNhdXZlZ2FyZGUgZGUgbGEgc2Vzc2lvbiB7MH0gdmVycyBsZSBzdG9ja2FnZSAoU3RvcmUpLCBlbiBhdHRlbnRlIHBvdXIgezF9IHNlY29uZGVzCitwZXJzaXN0ZW50TWFuYWdlci5iYWNrdXBFeGNlcHRpb249RXhjZXB0aW9uIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkZSBsYSBzZXNzaW9uIHswfTogezF9CitwZXJzaXN0ZW50TWFuYWdlci50b29NYW55QWN0aXZlPVRyb3AgZGUgc2Vzc2lvbnMgYWN0aXZlcywgezB9LCDgIGxhIHJlY2hlcmNoZSBkZSBzZXNzaW9ucyBlbiBhdHRlbnRlIHBvdXIgYmFzY3VsZW1lbnQgdmVycyBzdG9ja2FnZSAoc3dhcCBvdXQpCitwZXJzaXN0ZW50TWFuYWdlci5zd2FwVG9vTWFueUFjdGl2ZT1CYXNjdWxlbWVudCB2ZXJzIHN0b2NrYWdlIChzd2FwIG91dCkgZGUgbGEgc2Vzc2lvbiB7MH0sIGVuIGF0dGVudGUgcG91ciB7MX0gc2Vjb25kZXMgdHJvcCBkZSBzZXNzaW9ucyBhY3RpdmVzCitwZXJzaXN0ZW50TWFuYWdlci5wcm9jZXNzU3dhcHM9UmVjaGVyY2hlIGRlIHNlc3Npb25zIOAgYmFzY3VsZXIgdmVycyBzdG9ja2FnZSAoc3dhcCBvdXQpLCB7MH0gc2Vzc2lvbnMgYWN0aXZlcyBlbiBt6W1vaXJlCitwZXJzaXN0ZW50TWFuYWdlci5hY3RpdmVTZXNzaW9uPUxhIHNlc3Npb24gezB9IGEg6XTpIGVuIGF0dGVudGUgZHVyYW50IHsxfSBzZWNvbmRlcworcGVyc2lzdGVudE1hbmFnZXIuc3dhcEluPUJhc2N1bGVtZW50IGRlcHVpcyBsZSBzdG9ja2FnZSAoc3dhcCBpbikgZGUgbGEgc2Vzc2lvbiB7MH0KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmNzYyMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNjcgQEAKK2FwcGxpY2F0aW9uU2Vzc2lvbi5zZXNzaW9uLmlzZT1cdTcxMjFcdTUyYjlcdTMwNmFcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTcyYjZcdTYxNGJcdTMwNjdcdTMwNTkKK2FwcGxpY2F0aW9uU2Vzc2lvbi52YWx1ZS5pYWU9bnVsbFx1NTAyNFx1MzA2N1x1MzA1OQorZmlsZVN0b3JlLmFscmVhZHlTdGFydGVkPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzBiOVx1MzBjOFx1MzBhMlx1MzA0Y1x1NjVlMlx1MzA2Ylx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorZmlsZVN0b3JlLm5vdFN0YXJ0ZWQ9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMGI5XHUzMGM4XHUzMGEyXHUzMDRjXHUzMDdlXHUzMDYwXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitmaWxlU3RvcmUuc2F2aW5nPVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViIHsxfSBcdTMwNmJcdTRmZGRcdTViNThcdTMwNTdcdTMwN2VcdTMwNTkKK2ZpbGVTdG9yZS5sb2FkaW5nPVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViIHsxfSBcdTMwNGJcdTMwODlcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNTdcdTMwN2VcdTMwNTkKK2ZpbGVTdG9yZS5yZW1vdmluZz1cdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjMgezB9IFx1MzA5Mlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiB7MX0gXHUzMDRiXHUzMDg5XHU1MjRhXHU5NjY0XHUzMDU3XHUzMDdlXHUzMDU5CitKREJDU3RvcmUuYWxyZWFkeVN0YXJ0ZWQ9SkRCQ1x1MzBiOVx1MzBjOFx1MzBhMlx1MzA2Zlx1NjVlMlx1MzA2Ylx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorSkRCQ1N0b3JlLmNsb3NlPVx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOVx1NjNhNVx1N2Q5YSB7MH0gXHUzMDkyXHUzMGFmXHUzMGVkXHUzMGZjXHUzMGJhXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitKREJDU3RvcmUubm90U3RhcnRlZD1KREJDXHUzMGI5XHUzMGM4XHUzMGEyXHUzMDZmXHUzMDdlXHUzMDYwXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDdlXHUzMDViXHUzMDkzCitKREJDU3RvcmUuc2F2aW5nPVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5IHsxfSBcdTMwNmJcdTRmZGRcdTViNThcdTMwNTdcdTMwN2VcdTMwNTkKK0pEQkNTdG9yZS5sb2FkaW5nPVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5IHsxfSBcdTMwNGJcdTMwODlcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNTdcdTMwN2VcdTMwNTkKK0pEQkNTdG9yZS5yZW1vdmluZz0gXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzIHswfSBcdTMwOTJcdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjkgezF9IFx1MzA0Ylx1MzA4OVx1NTI0YVx1OTY2NFx1MzA1N1x1MzA3ZVx1MzA1OQorSkRCQ1N0b3JlLlNRTEV4Y2VwdGlvbj1TUUxcdTMwYThcdTMwZTlcdTMwZmMgezB9CitKREJDU3RvcmUuY2hlY2tDb25uZWN0aW9uREJDbG9zZWQ9XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHU2M2E1XHU3ZDlhXHUzMDRjbnVsbFx1MzA2N1x1MzA0Mlx1MzA4Ylx1MzA0Ylx1MzAwMVx1MzBhZlx1MzBlZFx1MzBmY1x1MzBiYVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzA2ZVx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMlx1NTE4ZFx1MzBhYVx1MzBmY1x1MzBkN1x1MzBmM1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMgorSkRCQ1N0b3JlLmNoZWNrQ29ubmVjdGlvbkRCUmVPcGVuRmFpbD1cdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTMwNmVcdTUxOGRcdTMwYWFcdTMwZmNcdTMwZDdcdTMwZjNcdTMwNGNcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDJcdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTMwNGNcdTMwYzBcdTMwYTZcdTMwZjNcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwNGJcdTMwODJcdTMwNTdcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIKK0pEQkNTdG9yZS5jaGVja0Nvbm5lY3Rpb25TUUxFeGNlcHRpb249U1FMXHU0ZjhiXHU1OTE2XHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmIHswfQorSkRCQ1N0b3JlLmNoZWNrQ29ubmVjdGlvbkNsYXNzTm90Rm91bmRFeGNlcHRpb249SkRCQ1x1MzBjOVx1MzBlOVx1MzBhNFx1MzBkMFx1MzBhZlx1MzBlOVx1MzBiOVx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MyB7MH0KK21hbmFnZXJCYXNlLmNvbXBsZXRlPVx1NGU3MVx1NjU3MFx1NzY3YVx1NzUxZlx1NTY2OFx1MzA2ZVx1MzBiN1x1MzBmY1x1MzBjOVx1MzA2ZVx1NzUxZlx1NjIxMFx1MzA0Y1x1NWI4Y1x1NGU4Nlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlckJhc2UuZ2V0dGluZz1cdTMwYTJcdTMwZWJcdTMwYjRcdTMwZWFcdTMwYmFcdTMwZTAgezB9IFx1MzA2ZVx1MzBlMVx1MzBjM1x1MzBiYlx1MzBmY1x1MzBiOFx1MzBjMFx1MzBhNFx1MzBiOFx1MzBhN1x1MzBiOVx1MzBjOFx1MzBiM1x1MzBmM1x1MzBkZFx1MzBmY1x1MzBjZFx1MzBmM1x1MzBjOFx1MzA5Mlx1NTNkNlx1NWY5N1x1MzA1N1x1MzA3ZVx1MzA1OQorbWFuYWdlckJhc2UuZ290dGVuPVx1MzBlMVx1MzBjM1x1MzBiYlx1MzBmY1x1MzBiOFx1MzBjMFx1MzBhNFx1MzBiOFx1MzBhN1x1MzBiOVx1MzBjOFx1MzBiM1x1MzBmM1x1MzBkZFx1MzBmY1x1MzBjZFx1MzBmM1x1MzBjOFx1MzA2ZVx1NTNkNlx1NWY5N1x1MzA5Mlx1NWI4Y1x1NGU4Nlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlckJhc2UucmFuZG9tPVx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDZlXHU0ZTcxXHU2NTcwXHU3NjdhXHU3NTFmXHU1NjY4XHUzMDZlXHU1MjFkXHU2NzFmXHU1MzE2XHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CittYW5hZ2VyQmFzZS5zZWVkaW5nPVx1NGU3MVx1NjU3MFx1NzY3YVx1NzUxZlx1NTY2OFx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDZlXHUzMGI3XHUzMGZjXHUzMGM5XHUzMDkyXHU3NTFmXHU2MjEwXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzZXJ2ZXJTZXNzaW9uLnZhbHVlLmlhZT1udWxsXHU1MDI0XHUzMDY3XHUzMDU5CitzdGFuZGFyZE1hbmFnZXIuYWxyZWFkeVN0YXJ0ZWQ9XHUzMGRlXHUzMGNkXHUzMGZjXHUzMGI4XHUzMGUzXHUzMDZmXHU2NWUyXHUzMDZiXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZE1hbmFnZXIuY3JlYXRlU2Vzc2lvbi5pc2U9Y3JlYXRlU2Vzc2lvbjogXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQ2XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDRjXHU1OTFhXHUzMDU5XHUzMDRlXHUzMDdlXHUzMDU5CitzdGFuZGFyZE1hbmFnZXIuZXhwaXJlRXhjZXB0aW9uPXByb2Nlc3NzRXhwaXJlOiBcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmVcdTdkNDJcdTRlODZcdTUxZTZcdTc0MDZcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK3N0YW5kYXJkTWFuYWdlci5sb2FkaW5nPXswfSBcdTMwNGJcdTMwODlcdTYzMDFcdTdkOWFcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3N0YW5kYXJkTWFuYWdlci5sb2FkaW5nLmNuZmU9XHU2MzAxXHU3ZDlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHUzMGVkXHUzMGZjXHUzMGM5XHU0ZTJkXHUzMDZiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvblx1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZjogezB9CitzdGFuZGFyZE1hbmFnZXIubG9hZGluZy5pb2U9XHU2MzAxXHU3ZDlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHUzMGVkXHUzMGZjXHUzMGM5XHU0ZTJkXHUzMDZlSU9FeGNlcHRpb25cdTMwNjdcdTMwNTk6IHswfQorc3RhbmRhcmRNYW5hZ2VyLm5vdFN0YXJ0ZWQ9XHUzMGRlXHUzMGNkXHUzMGZjXHUzMGI4XHUzMGUzXHUzMDZmXHUzMDdlXHUzMDYwXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZE1hbmFnZXIuc2Vzc2lvblRpbWVvdXQ9XHU3MTIxXHU1MmI5XHUzMDZhXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGJmXHUzMGE0XHUzMGUwXHUzMGEyXHUzMGE2XHUzMGM4XHU4YTJkXHU1YjlhXHUzMDY3XHUzMDU5IHswfQorc3RhbmRhcmRNYW5hZ2VyLnVubG9hZGluZz1cdTYzMDFcdTdkOWFcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTIgezB9IFx1MzA2Ylx1NGZkZFx1NWI1OFx1MzA1N1x1MzA3ZVx1MzA1OQorc3RhbmRhcmRNYW5hZ2VyLnVubG9hZGluZy5pb2U9XHU2MzAxXHU3ZDlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU0ZmRkXHU1YjU4XHU0ZTJkXHUzMDZlSU9FeGNlcHRpb25cdTMwNjdcdTMwNTk6IHswfQorc3RhbmRhcmRNYW5hZ2VyLm1hbmFnZXJMb2FkPVx1NmMzOFx1N2Q5YVx1OGExOFx1NjFiNlx1ODhjNVx1N2Y2ZVx1MzA0Ylx1MzA4OVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorc3RhbmRhcmRNYW5hZ2VyLm1hbmFnZXJVbmxvYWQ9XHU2YzM4XHU3ZDlhXHU4YTE4XHU2MWI2XHU4OGM1XHU3ZjZlXHUzMDZiXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHUzMGEyXHUzMGYzXHUzMGVkXHUzMGZjXHUzMGM5XHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitzdGFuZGFyZFNlc3Npb24uYXR0cmlidXRlRXZlbnQ9XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHU1YzVlXHU2MDI3XHUzMGE0XHUzMGQ5XHUzMGYzXHUzMGM4XHUzMGVhXHUzMGI5XHUzMGNhXHUzMDRjXHU0ZjhiXHU1OTE2XHUzMDkyXHU2Mjk1XHUzMDUyXHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZFNlc3Npb24uYmluZGluZ0V2ZW50PVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBkMFx1MzBhNFx1MzBmM1x1MzBjN1x1MzBhM1x1MzBmM1x1MzBiMFx1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1MzBlYVx1MzBiOVx1MzBjYVx1MzA0Y1x1NGY4Ylx1NTkxNlx1MzA5Mlx1NjI5NVx1MzA1Mlx1MzA3ZVx1MzA1N1x1MzA1Zgorc3RhbmRhcmRTZXNzaW9uLmludmFsaWRhdGUuaXNlPWludmFsaWRhdGU6IFx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2Zlx1NjVlMlx1MzA2Ylx1NzEyMVx1NTJiOVx1NTMxNlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRTZXNzaW9uLmlzTmV3LmlzZT1pc05ldzogXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHU2NWUyXHUzMDZiXHU3MTIxXHU1MmI5XHU1MzE2XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZFNlc3Npb24uZ2V0QXR0cmlidXRlLmlzZT1nZXRBdHRyaWJ1dGU6IFx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2Zlx1NjVlMlx1MzA2Ylx1NzEyMVx1NTJiOVx1NTMxNlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRTZXNzaW9uLmdldEF0dHJpYnV0ZU5hbWVzLmlzZT1nZXRBdHRyaWJ1dGVOYW1lczogXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHU2NWUyXHUzMDZiXHU3MTIxXHU1MmI5XHU1MzE2XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZFNlc3Npb24uZ2V0Q3JlYXRpb25UaW1lLmlzZT1nZXRDcmVhdGlvblRpbWU6IFx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2Zlx1NjVlMlx1MzA2Ylx1NzEyMVx1NTJiOVx1NTMxNlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRTZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWUuaXNlPWdldExhc3RBY2Nlc3NlZFRpbWU6IFx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2Zlx1NjVlMlx1MzA2Ylx1NzEyMVx1NTJiOVx1NTMxNlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRTZXNzaW9uLmdldElkLmlzZT1nZXRJZDogXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHU2NWUyXHUzMDZiXHU3MTIxXHU1MmI5XHU1MzE2XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZFNlc3Npb24uZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbC5pc2U9Z2V0TWF4SW5hY3RpdmVJbnRlcnZhbDogXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHU2NWUyXHUzMDZiXHU3MTIxXHU1MmI5XHU1MzE2XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZFNlc3Npb24uZ2V0VmFsdWVOYW1lcy5pc2U9Z2V0VmFsdWVOYW1lczogXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHU2NWUyXHUzMDZiXHU3MTIxXHU1MmI5XHU1MzE2XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZFNlc3Npb24ubm90U2VyaWFsaXphYmxlPVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MX0gXHUzMDZlXHUzMDVmXHUzMDgxXHUzMDZiXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHU1YzVlXHU2MDI3IHswfSBcdTMwOTJcdTMwYjdcdTMwZWFcdTMwYTJcdTMwZTlcdTMwYTRcdTMwYmFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkU2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUuaXNlPXJlbW92ZUF0dHJpYnV0ZTogXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHU2NWUyXHUzMDZiXHU3MTIxXHU1MmI5XHU1MzE2XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZFNlc3Npb24uc2Vzc2lvbkV2ZW50PVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1MzBlYVx1MzBiOVx1MzBjYVx1MzA0Y1x1NGY4Ylx1NTkxNlx1MzA5Mlx1NjI5NVx1MzA1Mlx1MzA3ZVx1MzA1N1x1MzA1Zgorc3RhbmRhcmRTZXNzaW9uLnNldEF0dHJpYnV0ZS5pYWU9c2V0QXR0cmlidXRlOiBcdTMwYjdcdTMwZWFcdTMwYTJcdTMwZTlcdTMwYTRcdTMwYmFcdTMwNjdcdTMwNGRcdTMwNmFcdTMwNDRcdTVjNWVcdTYwMjdcdTMwNjdcdTMwNTkKK3N0YW5kYXJkU2Vzc2lvbi5zZXRBdHRyaWJ1dGUuaXNlPXNldEF0dHJpYnV0ZTogXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHU2NWUyXHUzMDZiXHU3MTIxXHU1MmI5XHU1MzE2XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZFNlc3Npb24uc2V0QXR0cmlidXRlLm5hbWVudWxsPXNldEF0dHJpYnV0ZTogbmFtZVx1MzBkMVx1MzBlOVx1MzBlMVx1MzBiZlx1MzA2Zm51bGxcdTMwNjdcdTMwNDJcdTMwNjNcdTMwNjZcdTMwNmZcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkU2Vzc2lvbi5zZXNzaW9uQ3JlYXRlZD1cdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNJRCA9IHswfSBcdTMwOTJcdTc1MWZcdTYyMTBcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK3BlcnNpc3RlbnRNYW5hZ2VyLmxvYWRpbmc9ezB9IFx1MzA2ZVx1NjMwMVx1N2Q5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA1N1x1MzA3ZVx1MzA1OQorcGVyc2lzdGVudE1hbmFnZXIudW5sb2FkaW5nPXswfSBcdTMwNmVcdTYzMDFcdTdkOWFcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTRmZGRcdTViNThcdTMwNTdcdTMwN2VcdTMwNTkKK3BlcnNpc3RlbnRNYW5hZ2VyLmV4cGlyaW5nPSB7MH0gXHUzMDZlXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU0ZmRkXHU1YjU4XHUzMDU5XHUzMDhiXHU1MjRkXHUzMDZiXHU2NzFmXHU5NjUwXHU1MjA3XHUzMDhjXHUzMDZiXHUzMDZhXHUzMDhhXHUzMDdlXHUzMDU3XHUzMDVmCitwZXJzaXN0ZW50TWFuYWdlci5kZXNlcmlhbGl6ZUVycm9yPVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHUzMGM3XHUzMGI3XHUzMGVhXHUzMGEyXHUzMGU5XHUzMGE0XHUzMGJhXHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5OiB7MX0KK3BlcnNpc3RlbnRNYW5hZ2VyLnNlcmlhbGl6ZUVycm9yPVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHUzMGI3XHUzMGVhXHUzMGEyXHUzMGU5XHUzMGE0XHUzMGJhXHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5OiB7MX0KK3BlcnNpc3RlbnRNYW5hZ2VyLnN3YXBNYXhJZGxlPXsxfVx1NzlkMlx1OTU5M1x1MzBhMlx1MzBhNFx1MzBjOVx1MzBlYlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHU0ZmRkXHU1YjU4XHUzMDU5XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDZiXHUzMGI5XHUzMGVmXHUzMGMzXHUzMGQ3XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitwZXJzaXN0ZW50TWFuYWdlci5iYWNrdXBNYXhJZGxlPXsxfVx1NzlkMlx1OTU5M1x1MzBhMlx1MzBhNFx1MzBjOVx1MzBlYlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHU0ZmRkXHU1YjU4XHUzMDU5XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDZiXHUzMGQwXHUzMGMzXHUzMGFmXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitwZXJzaXN0ZW50TWFuYWdlci5iYWNrdXBFeGNlcHRpb249XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzIHswfSBcdTMwOTJcdTMwZDBcdTMwYzNcdTMwYWZcdTMwYTJcdTMwYzNcdTMwZDdcdTMwNTlcdTMwOGJcdTY2NDJcdTMwNmJcdTRmOGJcdTU5MTZcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWY6IHsxfQorcGVyc2lzdGVudE1hbmFnZXIudG9vTWFueUFjdGl2ZT1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDZcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNGNcdTU5MWFcdTMwNTlcdTMwNGVcdTMwN2VcdTMwNTlcdTMwMDF7MH1cdTMwMDFcdTMwYjlcdTMwZWZcdTMwYzNcdTMwZDdcdTMwYTJcdTMwYTZcdTMwYzhcdTMwNTlcdTMwOGJcdTMwNWZcdTMwODFcdTMwNmJcdTMwYTJcdTMwYTRcdTMwYzlcdTMwZWJcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTYzYTJcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3BlcnNpc3RlbnRNYW5hZ2VyLnN3YXBUb29NYW55QWN0aXZlPVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA0Y1x1NTkxYVx1MzA1OVx1MzA0ZVx1MzA4Ylx1MzA2ZVx1MzA2N1x1MzAwMXsxfVx1NzlkMlx1MzBhMlx1MzBhNFx1MzBjOVx1MzBlYlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHUzMGI5XHUzMGVmXHUzMGMzXHUzMGQ3XHUzMGEyXHUzMGE2XHUzMGM4XHUzMDU3XHUzMDdlXHUzMDU5CitwZXJzaXN0ZW50TWFuYWdlci5wcm9jZXNzU3dhcHM9XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHUzMGI5XHUzMGVmXHUzMGMzXHUzMGQ3XHUzMDU5XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDZiXHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5LCBcdTMwZTFcdTMwZTJcdTMwZWFcdTRlMmRcdTMwNmIgezB9IFx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkNlx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA0Y1x1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1OQorcGVyc2lzdGVudE1hbmFnZXIuYWN0aXZlU2Vzc2lvbj1cdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjMgezB9IFx1MzA2ZnsxfVx1NzlkMlx1OTU5M1x1MzBhMlx1MzBhNFx1MzBjOVx1MzBlYlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorcGVyc2lzdGVudE1hbmFnZXIuc3dhcEluPVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHUzMGI5XHUzMGVmXHUzMGMzXHUzMGQ3XHUzMGE0XHUzMGYzXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9NYW5hZ2VyQmFzZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vTWFuYWdlckJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmFiYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vTWFuYWdlckJhc2UuamF2YQpAQCAtMCwwICsxLDEyNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uOworCisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZVN1cHBvcnQ7CitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5SZWdpc3RyYXRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKKworCisvKioKKyAqIE1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxiPk1hbmFnZXI8L2I+IGludGVyZmFjZSB0aGF0IHN1cHBvcnRzCisgKiBubyBzZXNzaW9uIHBlcnNpc3RlbmNlIG9yIGRpc3RyaWJ1dGFibGUgY2FwYWJpbGl0aWVzLiAgVGhpcyBjbGFzcyBtYXkKKyAqIGJlIHN1YmNsYXNzZWQgdG8gY3JlYXRlIG1vcmUgc29waGlzdGljYXRlZCBNYW5hZ2VyIGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIE1hbmFnZXJCYXNlIGltcGxlbWVudHMgTWFuYWdlciwgTUJlYW5SZWdpc3RyYXRpb24geworICAgIHByb3RlY3RlZCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWFuYWdlckJhc2UuY2xhc3MpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICBwcm90ZWN0ZWQgRGF0YUlucHV0U3RyZWFtIHJhbmRvbUlTPW51bGw7CisgICAgcHJvdGVjdGVkIFN0cmluZyBkZXZSYW5kb21Tb3VyY2U9Ii9kZXYvdXJhbmRvbSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gdG8gdXNlIGlmIHdlIGNhbm5vdCB1c2UKKyAgICAgKiB0aGUgcmVxdWVzdGVkIG9uZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FMR09SSVRITSA9ICJNRDUiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtIHRvIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHNlc3Npb24KKyAgICAgKiBpZGVudGlmaWVycy4gIFRoaXMgbXVzdCBiZSBhbiBhbGdvcml0aG0gc3VwcG9ydGVkIGJ5IHRoZQorICAgICAqIDxjb2RlPmphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDwvY29kZT4gY2xhc3Mgb24geW91ciBwbGF0Zm9ybS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFsZ29yaXRobSA9IERFRkFVTFRfQUxHT1JJVEhNOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBNYW5hZ2VyIGlzIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbnRhaW5lciBjb250YWluZXI7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTWVzc2FnZURpZ2VzdCBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkIHdoZW4KKyAgICAgKiBjcmVhdGluZyBzZXNzaW9uIGlkZW50aWZpZXJzLgorICAgICAqLworICAgIHByb3RlY3RlZCBNZXNzYWdlRGlnZXN0IGRpZ2VzdCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBkaXN0cmlidXRhYmxlIGZsYWcgZm9yIFNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyBNYW5hZ2VyLiAgSWYgdGhpcworICAgICAqIGZsYWcgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCBhbnkgdXNlciBhdHRyaWJ1dGVzIGFkZGVkIHRvIGEKKyAgICAgKiBzZXNzaW9uIGNvbnRyb2xsZWQgYnkgdGhpcyBNYW5hZ2VyIG11c3QgYmUgU2VyaWFsaXphYmxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGRpc3RyaWJ1dGFibGU7CisKKworICAgIC8qKgorICAgICAqIEEgU3RyaW5nIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB1c2VkIHRvIGluY3JlYXNlIHRoZSBlbnRyb3B5IG9mCisgICAgICogdGhlIGluaXRpYWxpemF0aW9uIG9mIG91ciByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGVudHJvcHkgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gc3RyaW5nIGZvciB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIk1hbmFnZXJCYXNlLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IG1heGltdW0gaW5hY3RpdmUgaW50ZXJ2YWwgZm9yIFNlc3Npb25zIGNyZWF0ZWQgYnkKKyAgICAgKiB0aGlzIE1hbmFnZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtYXhJbmFjdGl2ZUludGVydmFsID0gNjA7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXNzaW9uIGlkIGxlbmd0aCBvZiBTZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgTWFuYWdlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHNlc3Npb25JZExlbmd0aCA9IDE2OworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgbmFtZSBvZiB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24gKGZvciBsb2dnaW5nKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBuYW1lID0gIk1hbmFnZXJCYXNlIjsKKworCisgICAgLyoqCisgICAgICogQSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIHNlc3Npb24gaWRlbnRpZmllcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJhbmRvbSByYW5kb20gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBjbGFzcyB0byBiZSB1c2VkCisgICAgICogd2hlbiBnZW5lcmF0aW5nIHNlc3Npb24gaWRlbnRpZmllcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByYW5kb21DbGFzcyA9ICJqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBsb25nZXN0IHRpbWUgKGluIHNlY29uZHMpIHRoYXQgYW4gZXhwaXJlZCBzZXNzaW9uIGhhZCBiZWVuIGFsaXZlLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgc2Vzc2lvbk1heEFsaXZlVGltZTsKKworCisgICAgLyoqCisgICAgICogQXZlcmFnZSB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IGV4cGlyZWQgc2Vzc2lvbnMgaGFkIGJlZW4gYWxpdmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBzZXNzaW9uQXZlcmFnZUFsaXZlVGltZTsKKworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIHNlc3Npb25zIHRoYXQgaGF2ZSBleHBpcmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgZXhwaXJlZFNlc3Npb25zID0gMDsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBjdXJyZW50bHkgYWN0aXZlIFNlc3Npb25zIGZvciB0aGlzIE1hbmFnZXIsIGtleWVkIGJ5CisgICAgICogc2Vzc2lvbiBpZGVudGlmaWVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIHNlc3Npb25zID0gbmV3IEhhc2hNYXAoKTsKKworICAgIC8vIE51bWJlciBvZiBzZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgbWFuYWdlcgorICAgIHByb3RlY3RlZCBpbnQgc2Vzc2lvbkNvdW50ZXI9MDsKKworICAgIHByb3RlY3RlZCBpbnQgbWF4QWN0aXZlPTA7CisKKyAgICAvLyBudW1iZXIgb2YgZHVwbGljYXRlZCBzZXNzaW9uIGlkcyAtIGFueXRoaW5nID4wIG1lYW5zIHdlIGhhdmUgcHJvYmxlbXMKKyAgICBwcm90ZWN0ZWQgaW50IGR1cGxpY2F0ZXM9MDsKKworICAgIHByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVkPWZhbHNlOworICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3NpbmcgdGltZSBkdXJpbmcgc2Vzc2lvbiBleHBpcmF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIHByb2Nlc3NpbmdUaW1lID0gMDsKKworICAgIC8qKgorICAgICAqIEl0ZXJhdGlvbiBjb3VudCBmb3IgYmFja2dyb3VuZCBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGNvdW50ID0gMDsKKworCisgICAgLyoqCisgICAgICogRnJlcXVlbmN5IG9mIHRoZSBzZXNzaW9uIGV4cGlyYXRpb24sIGFuZCByZWxhdGVkIG1hbmFnZXIgb3BlcmF0aW9ucy4KKyAgICAgKiBNYW5hZ2VyIG9wZXJhdGlvbnMgd2lsbCBiZSBkb25lIG9uY2UgZm9yIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mCisgICAgICogYmFja2dyb25kUHJvY2VzcyBjYWxscyAoaWUsIHRoZSBsb3dlciB0aGUgYW1vdW50LCB0aGUgbW9zdCBvZnRlbiB0aGUKKyAgICAgKiBjaGVja3Mgd2lsbCBvY2N1cikuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBwcm9jZXNzRXhwaXJlc0ZyZXF1ZW5jeSA9IDY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IHN1cHBvcnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VTdXBwb3J0KHRoaXMpOworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VjdXJpdHkgY2xhc3NlcworCisKKyAgICBwcml2YXRlIGNsYXNzIFByaXZpbGVnZWRTZXRSYW5kb21GaWxlIGltcGxlbWVudHMgUHJpdmlsZWdlZEFjdGlvbnsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCl7ICAgICAgICAgICAgICAgCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpbGUgZj1uZXcgRmlsZSggZGV2UmFuZG9tU291cmNlICk7CisgICAgICAgICAgICAgICAgaWYoICEgZi5leGlzdHMoKSApIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIHJhbmRvbUlTPSBuZXcgRGF0YUlucHV0U3RyZWFtKCBuZXcgRmlsZUlucHV0U3RyZWFtKGYpKTsKKyAgICAgICAgICAgICAgICByYW5kb21JUy5yZWFkTG9uZygpOworICAgICAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyggIk9wZW5pbmcgIiArIGRldlJhbmRvbVNvdXJjZSApOworICAgICAgICAgICAgICAgIHJldHVybiByYW5kb21JUzsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSBmb3IgdGhpcyBNYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxnb3JpdGhtKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5hbGdvcml0aG0pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSBmb3IgdGhpcyBNYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIGFsZ29yaXRobSBUaGUgbmV3IG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFsZ29yaXRobShTdHJpbmcgYWxnb3JpdGhtKSB7CisKKyAgICAgICAgU3RyaW5nIG9sZEFsZ29yaXRobSA9IHRoaXMuYWxnb3JpdGhtOworICAgICAgICB0aGlzLmFsZ29yaXRobSA9IGFsZ29yaXRobTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImFsZ29yaXRobSIsIG9sZEFsZ29yaXRobSwgdGhpcy5hbGdvcml0aG0pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENvbnRhaW5lciB3aXRoIHdoaWNoIHRoaXMgTWFuYWdlciBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jb250YWluZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENvbnRhaW5lciB3aXRoIHdoaWNoIHRoaXMgTWFuYWdlciBpcyBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgbmV3bHkgYXNzb2NpYXRlZCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGNvbnRhaW5lcikgeworCisgICAgICAgIENvbnRhaW5lciBvbGRDb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjsKKyAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJjb250YWluZXIiLCBvbGRDb250YWluZXIsIHRoaXMuY29udGFpbmVyKTsKKyAgICB9CisKKworICAgIC8qKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1lc3NhZ2VEaWdlc3Qgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIGNhbGN1bGF0aW5nCisgICAgICogc2Vzc2lvbiBpZGVudGlmaWVycy4gIElmIG5vbmUgaGFzIGJlZW4gY3JlYXRlZCB5ZXQsIGluaXRpYWxpemUKKyAgICAgKiBvbmUgdGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWVzc2FnZURpZ2VzdCBnZXREaWdlc3QoKSB7CisKKyAgICAgICAgaWYgKHRoaXMuZGlnZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvbmcgdDE9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygibWFuYWdlckJhc2UuZ2V0dGluZyIsIGFsZ29yaXRobSkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGlzLmRpZ2VzdCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygibWFuYWdlckJhc2UuZGlnZXN0IiwgYWxnb3JpdGhtKSwgZSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWdlc3QgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKERFRkFVTFRfQUxHT1JJVEhNKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZikgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJtYW5hZ2VyQmFzZS5kaWdlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUxHT1JJVEhNKSwgZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlnZXN0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygibWFuYWdlckJhc2UuZ290dGVuIikpOworICAgICAgICAgICAgbG9uZyB0Mj1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXREaWdlc3QoKSAiICsgKHQyLXQxKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHRoaXMuZGlnZXN0KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaXN0cmlidXRhYmxlIGZsYWcgZm9yIHRoZSBzZXNzaW9ucyBzdXBwb3J0ZWQgYnkKKyAgICAgKiB0aGlzIE1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGlzdHJpYnV0YWJsZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZGlzdHJpYnV0YWJsZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlzdHJpYnV0YWJsZSBmbGFnIGZvciB0aGUgc2Vzc2lvbnMgc3VwcG9ydGVkIGJ5IHRoaXMKKyAgICAgKiBNYW5hZ2VyLiAgSWYgdGhpcyBmbGFnIGlzIHNldCwgYWxsIHVzZXIgZGF0YSBvYmplY3RzIGFkZGVkIHRvCisgICAgICogc2Vzc2lvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWFuYWdlciBtdXN0IGltcGxlbWVudCBTZXJpYWxpemFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlzdHJpYnV0YWJsZSBUaGUgbmV3IGRpc3RyaWJ1dGFibGUgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc3RyaWJ1dGFibGUoYm9vbGVhbiBkaXN0cmlidXRhYmxlKSB7CisKKyAgICAgICAgYm9vbGVhbiBvbGREaXN0cmlidXRhYmxlID0gdGhpcy5kaXN0cmlidXRhYmxlOworICAgICAgICB0aGlzLmRpc3RyaWJ1dGFibGUgPSBkaXN0cmlidXRhYmxlOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiZGlzdHJpYnV0YWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKG9sZERpc3RyaWJ1dGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbih0aGlzLmRpc3RyaWJ1dGFibGUpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlbnRyb3B5IGluY3JlYXNlciB2YWx1ZSwgb3IgY29tcHV0ZSBhIHNlbWktdXNlZnVsIHZhbHVlCisgICAgICogaWYgdGhpcyBTdHJpbmcgaGFzIG5vdCB5ZXQgYmVlbiBzZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFbnRyb3B5KCkgeworCisgICAgICAgIC8vIENhbGN1bGF0ZSBhIHNlbWktdXNlZnVsIHZhbHVlIGlmIHRoaXMgaGFzIG5vdCBiZWVuIHNldAorICAgICAgICBpZiAodGhpcy5lbnRyb3B5ID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFVzZSBBUFIgdG8gZ2V0IGEgY3J5cHRvIHNlY3VyZSBlbnRyb3B5IHZhbHVlCisgICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbMzJdOworICAgICAgICAgICAgYm9vbGVhbiBhcHIgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSAicmFuZG9tIjsKKyAgICAgICAgICAgICAgICBDbGFzcyBwYXJhbVR5cGVzW10gPSBuZXcgQ2xhc3NbMl07CisgICAgICAgICAgICAgICAgcGFyYW1UeXBlc1swXSA9IHJlc3VsdC5nZXRDbGFzcygpOworICAgICAgICAgICAgICAgIHBhcmFtVHlwZXNbMV0gPSBpbnQuY2xhc3M7CisgICAgICAgICAgICAgICAgT2JqZWN0IHBhcmFtVmFsdWVzW10gPSBuZXcgT2JqZWN0WzJdOworICAgICAgICAgICAgICAgIHBhcmFtVmFsdWVzWzBdID0gcmVzdWx0OworICAgICAgICAgICAgICAgIHBhcmFtVmFsdWVzWzFdID0gbmV3IEludGVnZXIoMzIpOworICAgICAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnRvbWNhdC5qbmkuT1MiKQorICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtVHlwZXMpOworICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2UobnVsbCwgcGFyYW1WYWx1ZXMpOworICAgICAgICAgICAgICAgIGFwciA9IHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFwcikgeworICAgICAgICAgICAgICAgIHNldEVudHJvcHkobmV3IFN0cmluZyhyZXN1bHQpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2V0RW50cm9weSh0aGlzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmVudHJvcHkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGVudHJvcHkgaW5jcmVhc2VyIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGVudHJvcHkgVGhlIG5ldyBlbnRyb3B5IGluY3JlYXNlciB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudHJvcHkoU3RyaW5nIGVudHJvcHkpIHsKKworICAgICAgICBTdHJpbmcgb2xkRW50cm9weSA9IGVudHJvcHk7CisgICAgICAgIHRoaXMuZW50cm9weSA9IGVudHJvcHk7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJlbnRyb3B5Iiwgb2xkRW50cm9weSwgdGhpcy5lbnRyb3B5KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IG1heGltdW0gaW5hY3RpdmUgaW50ZXJ2YWwgKGluIHNlY29uZHMpCisgICAgICogZm9yIFNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyBNYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMubWF4SW5hY3RpdmVJbnRlcnZhbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVmYXVsdCBtYXhpbXVtIGluYWN0aXZlIGludGVydmFsIChpbiBzZWNvbmRzKQorICAgICAqIGZvciBTZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlcnZhbCBUaGUgbmV3IGRlZmF1bHQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhJbmFjdGl2ZUludGVydmFsKGludCBpbnRlcnZhbCkgeworCisgICAgICAgIGludCBvbGRNYXhJbmFjdGl2ZUludGVydmFsID0gdGhpcy5tYXhJbmFjdGl2ZUludGVydmFsOworICAgICAgICB0aGlzLm1heEluYWN0aXZlSW50ZXJ2YWwgPSBpbnRlcnZhbDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm1heEluYWN0aXZlSW50ZXJ2YWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihvbGRNYXhJbmFjdGl2ZUludGVydmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIodGhpcy5tYXhJbmFjdGl2ZUludGVydmFsKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNlc3Npb24gaWQgbGVuZ3RoIChpbiBieXRlcykgb2YgU2Vzc2lvbnMgY3JlYXRlZCBieQorICAgICAqIHRoaXMgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24gaWQgbGVuZ3RoCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZXNzaW9uSWRMZW5ndGgoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlc3Npb25JZExlbmd0aCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlc3Npb24gaWQgbGVuZ3RoIChpbiBieXRlcykgZm9yIFNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcworICAgICAqIE1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWRMZW5ndGggVGhlIHNlc3Npb24gaWQgbGVuZ3RoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbklkTGVuZ3RoKGludCBpZExlbmd0aCkgeworCisgICAgICAgIGludCBvbGRTZXNzaW9uSWRMZW5ndGggPSB0aGlzLnNlc3Npb25JZExlbmd0aDsKKyAgICAgICAgdGhpcy5zZXNzaW9uSWRMZW5ndGggPSBpZExlbmd0aDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInNlc3Npb25JZExlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKG9sZFNlc3Npb25JZExlbmd0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKHRoaXMuc2Vzc2lvbklkTGVuZ3RoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVzY3JpcHRpdmUgc2hvcnQgbmFtZSBvZiB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKyAgICAvKiogCisgICAgICogVXNlIC9kZXYvcmFuZG9tLXR5cGUgc3BlY2lhbCBkZXZpY2UuIFRoaXMgaXMgbmV3IGNvZGUsIGJ1dCBtYXkgcmVkdWNlCisgICAgICogdGhlIGJpZyBkZWxheSBpbiBnZW5lcmF0aW5nIHRoZSByYW5kb20uCisgICAgICoKKyAgICAgKiAgWW91IG11c3Qgc3BlY2lmeSBhIHBhdGggdG8gYSByYW5kb20gZ2VuZXJhdG9yIGZpbGUuIFVzZSAvZGV2L3VyYW5kb20KKyAgICAgKiAgZm9yIGxpbnV4ICggb3Igc2ltaWxhciApIHN5c3RlbXMuIFVzZSAvZGV2L3JhbmRvbSBmb3IgbWF4aW11bSBzZWN1cml0eQorICAgICAqICAoIGl0IG1heSBibG9jayBpZiBub3QgZW5vdWdoICJyYW5kb20iIGV4aXN0ICkuIFlvdSBjYW4gYWxzbyB1c2UKKyAgICAgKiAgYSBwaXBlIHRoYXQgZ2VuZXJhdGVzIHJhbmRvbS4KKyAgICAgKgorICAgICAqICBUaGUgY29kZSB3aWxsIGNoZWNrIGlmIHRoZSBmaWxlIGV4aXN0cywgYW5kIGRlZmF1bHQgdG8gamF2YSBSYW5kb20KKyAgICAgKiAgaWYgbm90IGZvdW5kLiBUaGVyZSBpcyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGRpZmZlcmVuY2UsIHZlcnkKKyAgICAgKiAgdmlzaWJsZSBvbiB0aGUgZmlyc3QgY2FsbCB0byBnZXRTZXNzaW9uICggbGlrZSBpbiB0aGUgZmlyc3QgSlNQICkKKyAgICAgKiAgLSBzbyB1c2UgaXQgaWYgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJhbmRvbUZpbGUoIFN0cmluZyBzICkgeworICAgICAgICAvLyBhcyBhIGhhY2ssIHlvdSBjYW4gdXNlIGEgc3RhdGljIGZpbGUgLSBhbmQgZ2VuYXJhdGUgdGhlIHNhbWUKKyAgICAgICAgLy8gc2Vzc2lvbiBpZHMgKCBnb29kIGZvciBzdHJhbmdlIGRlYnVnZ2luZyApCisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgICByYW5kb21JUyA9IChEYXRhSW5wdXRTdHJlYW0pQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRTZXRSYW5kb21GaWxlKCkpOyAgICAgICAgICAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICBkZXZSYW5kb21Tb3VyY2U9czsKKyAgICAgICAgICAgICAgICBGaWxlIGY9bmV3IEZpbGUoIGRldlJhbmRvbVNvdXJjZSApOworICAgICAgICAgICAgICAgIGlmKCAhIGYuZXhpc3RzKCkgKSByZXR1cm47CisgICAgICAgICAgICAgICAgcmFuZG9tSVM9IG5ldyBEYXRhSW5wdXRTdHJlYW0oIG5ldyBGaWxlSW5wdXRTdHJlYW0oZikpOworICAgICAgICAgICAgICAgIHJhbmRvbUlTLnJlYWRMb25nKCk7CisgICAgICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiT3BlbmluZyAiICsgZGV2UmFuZG9tU291cmNlICk7CisgICAgICAgICAgICB9IGNhdGNoKCBJT0V4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByYW5kb21JUy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJGYWlsZWQgdG8gY2xvc2UgcmFuZG9tSVMuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJhbmRvbUlTPW51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJhbmRvbUZpbGUoKSB7CisgICAgICAgIHJldHVybiBkZXZSYW5kb21Tb3VyY2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGluc3RhbmNlIHdlIHNob3VsZCB1c2UgZm9yCisgICAgICogZ2VuZXJhdGluZyBzZXNzaW9uIGlkZW50aWZpZXJzLiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBnZW5lcmF0b3IKKyAgICAgKiBjdXJyZW50bHkgZGVmaW5lZCwgY29uc3RydWN0IGFuZCBzZWVkIGEgbmV3IG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmFuZG9tIGdldFJhbmRvbSgpIHsKKyAgICAgICAgaWYgKHRoaXMucmFuZG9tID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbmV3IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHNlZWQKKyAgICAgICAgICAgIGxvbmcgc2VlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgbG9uZyB0MSA9IHNlZWQ7CisgICAgICAgICAgICBjaGFyIGVudHJvcHlbXSA9IGdldEVudHJvcHkoKS50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyb3B5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbG9uZyB1cGRhdGUgPSAoKGJ5dGUpIGVudHJvcHlbaV0pIDw8ICgoaSAlIDgpICogOCk7CisgICAgICAgICAgICAgICAgc2VlZCBePSB1cGRhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCBhbmQgc2VlZCBhIG5ldyByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShyYW5kb21DbGFzcyk7CisgICAgICAgICAgICAgICAgdGhpcy5yYW5kb20gPSAoUmFuZG9tKSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIHRoaXMucmFuZG9tLnNldFNlZWQoc2VlZCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgc2ltcGxlIGNhc2UKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJtYW5hZ2VyQmFzZS5yYW5kb20iLCByYW5kb21DbGFzcyksCisgICAgICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgICAgICAgICB0aGlzLnJhbmRvbSA9IG5ldyBqYXZhLnV0aWwuUmFuZG9tKCk7CisgICAgICAgICAgICAgICAgdGhpcy5yYW5kb20uc2V0U2VlZChzZWVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9uZyB0Mj1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBpZiggKHQyLXQxKSA+IDEwMCApCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIm1hbmFnZXJCYXNlLnNlZWRpbmciLCByYW5kb21DbGFzcykgKyAiICIgKyAodDItdDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuICh0aGlzLnJhbmRvbSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJhbmRvbUNsYXNzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5yYW5kb21DbGFzcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgY2xhc3MgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByYW5kb21DbGFzcyBUaGUgbmV3IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGNsYXNzIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSYW5kb21DbGFzcyhTdHJpbmcgcmFuZG9tQ2xhc3MpIHsKKworICAgICAgICBTdHJpbmcgb2xkUmFuZG9tQ2xhc3MgPSB0aGlzLnJhbmRvbUNsYXNzOworICAgICAgICB0aGlzLnJhbmRvbUNsYXNzID0gcmFuZG9tQ2xhc3M7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJyYW5kb21DbGFzcyIsIG9sZFJhbmRvbUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmRvbUNsYXNzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHNlc3Npb25zIHRoYXQgaGF2ZSBleHBpcmVkLgorICAgICAqCisgICAgICogQHJldHVybiBOdW1iZXIgb2Ygc2Vzc2lvbnMgdGhhdCBoYXZlIGV4cGlyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEV4cGlyZWRTZXNzaW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGV4cGlyZWRTZXNzaW9uczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBzZXNzaW9ucyB0aGF0IGhhdmUgZXhwaXJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHBpcmVkU2Vzc2lvbnMgTnVtYmVyIG9mIHNlc3Npb25zIHRoYXQgaGF2ZSBleHBpcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhwaXJlZFNlc3Npb25zKGludCBleHBpcmVkU2Vzc2lvbnMpIHsKKyAgICAgICAgdGhpcy5leHBpcmVkU2Vzc2lvbnMgPSBleHBpcmVkU2Vzc2lvbnM7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0UHJvY2Vzc2luZ1RpbWUoKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzaW5nVGltZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NpbmdUaW1lKGxvbmcgcHJvY2Vzc2luZ1RpbWUpIHsKKyAgICAgICAgdGhpcy5wcm9jZXNzaW5nVGltZSA9IHByb2Nlc3NpbmdUaW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiBtYW5hZ2VyIGNoZWNrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFByb2Nlc3NFeHBpcmVzRnJlcXVlbmN5KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5wcm9jZXNzRXhwaXJlc0ZyZXF1ZW5jeSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1hbmFnZXIgY2hlY2tzIGZyZXF1ZW5jeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9jZXNzRXhwaXJlc0ZyZXF1ZW5jeSB0aGUgbmV3IG1hbmFnZXIgY2hlY2tzIGZyZXF1ZW5jeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NFeHBpcmVzRnJlcXVlbmN5KGludCBwcm9jZXNzRXhwaXJlc0ZyZXF1ZW5jeSkgeworCisgICAgICAgIGlmIChwcm9jZXNzRXhwaXJlc0ZyZXF1ZW5jeSA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgb2xkUHJvY2Vzc0V4cGlyZXNGcmVxdWVuY3kgPSB0aGlzLnByb2Nlc3NFeHBpcmVzRnJlcXVlbmN5OworICAgICAgICB0aGlzLnByb2Nlc3NFeHBpcmVzRnJlcXVlbmN5ID0gcHJvY2Vzc0V4cGlyZXNGcmVxdWVuY3k7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJwcm9jZXNzRXhwaXJlc0ZyZXF1ZW5jeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKG9sZFByb2Nlc3NFeHBpcmVzRnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIodGhpcy5wcm9jZXNzRXhwaXJlc0ZyZXF1ZW5jeSkpOworCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEltcGxlbWVudHMgdGhlIE1hbmFnZXIgaW50ZXJmYWNlLCBkaXJlY3QgY2FsbCB0byBwcm9jZXNzRXhwaXJlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJhY2tncm91bmRQcm9jZXNzKCkgeworICAgICAgICBjb3VudCA9IChjb3VudCArIDEpICUgcHJvY2Vzc0V4cGlyZXNGcmVxdWVuY3k7CisgICAgICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICAgICAgcHJvY2Vzc0V4cGlyZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZhbGlkYXRlIGFsbCBzZXNzaW9ucyB0aGF0IGhhdmUgZXhwaXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzRXhwaXJlcygpIHsKKworICAgICAgICBsb25nIHRpbWVOb3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uc1tdID0gZmluZFNlc3Npb25zKCk7CisgICAgICAgIGludCBleHBpcmVIZXJlID0gMCA7CisgICAgICAgIAorICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgZXhwaXJlIHNlc3Npb25zICIgKyBnZXROYW1lKCkgKyAiIGF0ICIgKyB0aW1lTm93ICsgIiBzZXNzaW9uY291bnQgIiArIHNlc3Npb25zLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vzc2lvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghc2Vzc2lvbnNbaV0uaXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgZXhwaXJlSGVyZSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvbmcgdGltZUVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICBsb2cuZGVidWcoIkVuZCBleHBpcmUgc2Vzc2lvbnMgIiArIGdldE5hbWUoKSArICIgcHJvY2Vzc2luZ1RpbWUgIiArICh0aW1lRW5kIC0gdGltZU5vdykgKyAiIGV4cGlyZWQgc2Vzc2lvbnM6ICIgKyBleHBpcmVIZXJlKTsKKyAgICAgICAgcHJvY2Vzc2luZ1RpbWUgKz0gKCB0aW1lRW5kIC0gdGltZU5vdyApOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgaWYoIG9uYW1lICE9IG51bGwgKQorICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkudW5yZWdpc3RlckNvbXBvbmVudChvbmFtZSk7CisgICAgICAgIGluaXRpYWxpemVkPWZhbHNlOworICAgICAgICBvbmFtZSA9IG51bGw7CisgICAgICAgIC8vIERvbid0IGNsZWFyIGxvZyBzaW5jZSBpdCBpcyByZXF1aXJlZCBpbiBjYXNlIGF0dHJpYnV0ZXMgYXJlIGNoYW5nZWQKKyAgICAgICAgLy8gKGVnIHZpYSBKTVgpIHdoaWxzdCB0aGUgbWFuYWdlciBpcyBzdG9wcGVkLgorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgICAgICBpZiggaW5pdGlhbGl6ZWQgKSByZXR1cm47CisgICAgICAgIGluaXRpYWxpemVkPXRydWU7ICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIFJlLWluaXRpYWxpc2UgdGhlIGxvZyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBvbiByZWxvYWQgaW4gY2FzZSBpdAorICAgICAgICAvLyB3YXMgbG9hZGVkIGJ5IHRoZSB3ZWJhcHAgY2xhc3Nsb2FkZXIKKyAgICAgICAgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWFuYWdlckJhc2UuY2xhc3MpOworICAgICAgICAKKyAgICAgICAgaWYoIG9uYW1lPT1udWxsICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdGFuZGFyZENvbnRleHQgY3R4PShTdGFuZGFyZENvbnRleHQpdGhpcy5nZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgICAgICBkb21haW49Y3R4LmdldEVuZ2luZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBkaXN0cmlidXRhYmxlID0gY3R4LmdldERpc3RyaWJ1dGFibGUoKTsKKyAgICAgICAgICAgICAgICBTdGFuZGFyZEhvc3QgaHN0PShTdGFuZGFyZEhvc3QpY3R4LmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gY3R4LmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICBpZiAocGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgICAgIG9uYW1lPW5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1NYW5hZ2VyLHBhdGg9IgorICAgICAgICAgICAgICAgICsgcGF0aCArICIsaG9zdD0iICsgaHN0LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkucmVnaXN0ZXJDb21wb25lbnQodGhpcywgb25hbWUsIG51bGwgKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFcnJvciByZWdpc3RlcmluZyAiLGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBJbml0aWFsaXplIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbgorICAgICAgICBnZXRSYW5kb21CeXRlcyhuZXcgYnl0ZVsxNl0pOworICAgICAgICAKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlJlZ2lzdGVyaW5nICIgKyBvbmFtZSApOworICAgICAgICAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoaXMgU2Vzc2lvbiB0byB0aGUgc2V0IG9mIGFjdGl2ZSBTZXNzaW9ucyBmb3IgdGhpcyBNYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChTZXNzaW9uIHNlc3Npb24pIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHNlc3Npb25zKSB7CisgICAgICAgICAgICBzZXNzaW9ucy5wdXQoc2Vzc2lvbi5nZXRJZEludGVybmFsKCksIHNlc3Npb24pOworICAgICAgICAgICAgaWYoIHNlc3Npb25zLnNpemUoKSA+IG1heEFjdGl2ZSApIHsKKyAgICAgICAgICAgICAgICBtYXhBY3RpdmU9c2Vzc2lvbnMuc2l6ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN1cHBvcnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbmQgcmV0dXJuIGEgbmV3IHNlc3Npb24gb2JqZWN0LCBiYXNlZCBvbiB0aGUgZGVmYXVsdAorICAgICAqIHNldHRpbmdzIHNwZWNpZmllZCBieSB0aGlzIE1hbmFnZXIncyBwcm9wZXJ0aWVzLiAgVGhlIHNlc3Npb24KKyAgICAgKiBpZCB3aWxsIGJlIGFzc2lnbmVkIGJ5IHRoaXMgbWV0aG9kLCBhbmQgYXZhaWxhYmxlIHZpYSB0aGUgZ2V0SWQoKQorICAgICAqIG1ldGhvZCBvZiB0aGUgcmV0dXJuZWQgc2Vzc2lvbi4gIElmIGEgbmV3IHNlc3Npb24gY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKiBmb3IgYW55IHJlYXNvbiwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgbmV3IHNlc3Npb24gY2Fubm90IGJlCisgICAgICogIGluc3RhbnRpYXRlZCBmb3IgYW55IHJlYXNvbgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICovCisgICAgcHVibGljIFNlc3Npb24gY3JlYXRlU2Vzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVNlc3Npb24obnVsbCk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbmQgcmV0dXJuIGEgbmV3IHNlc3Npb24gb2JqZWN0LCBiYXNlZCBvbiB0aGUgZGVmYXVsdAorICAgICAqIHNldHRpbmdzIHNwZWNpZmllZCBieSB0aGlzIE1hbmFnZXIncyBwcm9wZXJ0aWVzLiAgVGhlIHNlc3Npb24KKyAgICAgKiBpZCBzcGVjaWZpZWQgd2lsbCBiZSB1c2VkIGFzIHRoZSBzZXNzaW9uIGlkLiAgCisgICAgICogSWYgYSBuZXcgc2Vzc2lvbiBjYW5ub3QgYmUgY3JlYXRlZCBmb3IgYW55IHJlYXNvbiwgcmV0dXJuIAorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQgd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIHRoZQorICAgICAqICBuZXcgc2Vzc2lvbjsgaWYgPGNvZGU+bnVsbDwvY29kZT4sIGEgbmV3IHNlc3Npb24gaWQgd2lsbCBiZQorICAgICAqICBnZW5lcmF0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIG5ldyBzZXNzaW9uIGNhbm5vdCBiZQorICAgICAqICBpbnN0YW50aWF0ZWQgZm9yIGFueSByZWFzb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKFN0cmluZyBzZXNzaW9uSWQpIHsKKyAgICAgICAgCisgICAgICAgIC8vIFJlY3ljbGUgb3IgY3JlYXRlIGEgU2Vzc2lvbiBpbnN0YW5jZQorICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBjcmVhdGVFbXB0eVNlc3Npb24oKTsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBuZXcgc2Vzc2lvbiBhbmQgcmV0dXJuIGl0CisgICAgICAgIHNlc3Npb24uc2V0TmV3KHRydWUpOworICAgICAgICBzZXNzaW9uLnNldFZhbGlkKHRydWUpOworICAgICAgICBzZXNzaW9uLnNldENyZWF0aW9uVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIHNlc3Npb24uc2V0TWF4SW5hY3RpdmVJbnRlcnZhbCh0aGlzLm1heEluYWN0aXZlSW50ZXJ2YWwpOworICAgICAgICBpZiAoc2Vzc2lvbklkID09IG51bGwpIHsKKyAgICAgICAgICAgIHNlc3Npb25JZCA9IGdlbmVyYXRlU2Vzc2lvbklkKCk7CisgICAgICAgIC8vIEZJWE1FIFdIeSB3ZSBuZWVkIG5vIGR1cGxpY2F0aW9uIGNoZWNrPworICAgICAgICAvKiAgICAgICAgIAorICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc2Vzc2lvbnMpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoc2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCkgIT0gbnVsbCkgeyAvLyBHdWFyYW50ZWUKKyAgICAgICAgICAgICAgICAgICAgLy8gdW5pcXVlbmVzcworICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVzKys7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IGdlbmVyYXRlU2Vzc2lvbklkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAqLworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBGSVhNRTogQ29kZSB0byBiZSB1c2VkIGluIGNhc2Ugcm91dGUgcmVwbGFjZW1lbnQgaXMgbmVlZGVkCisgICAgICAgICAgICAvKgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIGp2bVJvdXRlID0gZ2V0SnZtUm91dGUoKTsKKyAgICAgICAgICAgIGlmIChnZXRKdm1Sb3V0ZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVxdWVzdEp2bVJvdXRlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBzZXNzaW9uSWQuaW5kZXhPZigiLiIpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEp2bVJvdXRlID0gc2Vzc2lvbklkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZyhpbmRleCArIDEsIHNlc3Npb25JZC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0SnZtUm91dGUgIT0gbnVsbCAmJiAhcmVxdWVzdEp2bVJvdXRlLmVxdWFscyhqdm1Sb3V0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gc2Vzc2lvbklkLnN1YnN0cmluZygwLCBpbmRleCkgKyAiLiIgKyBqdm1Sb3V0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqLworICAgICAgICB9CisgICAgICAgIHNlc3Npb24uc2V0SWQoc2Vzc2lvbklkKTsKKyAgICAgICAgc2Vzc2lvbkNvdW50ZXIrKzsKKworICAgICAgICByZXR1cm4gKHNlc3Npb24pOworCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEdldCBhIHNlc3Npb24gZnJvbSB0aGUgcmVjeWNsZWQgb25lcyBvciBjcmVhdGUgYSBuZXcgZW1wdHkgb25lLgorICAgICAqIFRoZSBQZXJzaXN0ZW50TWFuYWdlciBtYW5hZ2VyIGRvZXMgbm90IG5lZWQgdG8gY3JlYXRlIHNlc3Npb24gZGF0YQorICAgICAqIGJlY2F1c2UgaXQgcmVhZHMgaXQgZnJvbSB0aGUgU3RvcmUuCisgICAgICovCisgICAgcHVibGljIFNlc3Npb24gY3JlYXRlRW1wdHlTZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gKGdldE5ld1Nlc3Npb24oKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFjdGl2ZSBTZXNzaW9uLCBhc3NvY2lhdGVkIHdpdGggdGhpcyBNYW5hZ2VyLCB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBzZXNzaW9uIGlkIChpZiBhbnkpOyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGlkIFRoZSBzZXNzaW9uIGlkIGZvciB0aGUgc2Vzc2lvbiB0byBiZSByZXR1cm5lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBuZXcgc2Vzc2lvbiBjYW5ub3QgYmUKKyAgICAgKiAgaW5zdGFudGlhdGVkIGZvciBhbnkgcmVhc29uCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzIHdoaWxlCisgICAgICogIHByb2Nlc3NpbmcgdGhpcyByZXF1ZXN0CisgICAgICovCisgICAgcHVibGljIFNlc3Npb24gZmluZFNlc3Npb24oU3RyaW5nIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChpZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgc3luY2hyb25pemVkIChzZXNzaW9ucykgeworICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gKFNlc3Npb24pIHNlc3Npb25zLmdldChpZCk7CisgICAgICAgICAgICByZXR1cm4gKHNlc3Npb24pOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGFjdGl2ZSBTZXNzaW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBNYW5hZ2VyLgorICAgICAqIElmIHRoaXMgTWFuYWdlciBoYXMgbm8gYWN0aXZlIFNlc3Npb25zLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uW10gZmluZFNlc3Npb25zKCkgeworCisgICAgICAgIFNlc3Npb24gcmVzdWx0c1tdID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChzZXNzaW9ucykgeworICAgICAgICAgICAgcmVzdWx0cyA9IG5ldyBTZXNzaW9uW3Nlc3Npb25zLnNpemUoKV07CisgICAgICAgICAgICByZXN1bHRzID0gKFNlc3Npb25bXSkgc2Vzc2lvbnMudmFsdWVzKCkudG9BcnJheShyZXN1bHRzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHJlc3VsdHMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhpcyBTZXNzaW9uIGZyb20gdGhlIGFjdGl2ZSBTZXNzaW9ucyBmb3IgdGhpcyBNYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKFNlc3Npb24gc2Vzc2lvbikgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoc2Vzc2lvbnMpIHsKKyAgICAgICAgICAgIHNlc3Npb25zLnJlbW92ZShzZXNzaW9uLmdldElkSW50ZXJuYWwoKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN1cHBvcnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBHZXQgbmV3IHNlc3Npb24gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZG9Mb2FkKCkgbWV0aG9kLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdGFuZGFyZFNlc3Npb24gZ2V0TmV3U2Vzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdGFuZGFyZFNlc3Npb24odGhpcyk7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBnZXRSYW5kb21CeXRlcyhieXRlIGJ5dGVzW10pIHsKKyAgICAgICAgLy8gR2VuZXJhdGUgYSBieXRlIGFycmF5IGNvbnRhaW5pbmcgYSBzZXNzaW9uIGlkZW50aWZpZXIKKyAgICAgICAgaWYgKGRldlJhbmRvbVNvdXJjZSAhPSBudWxsICYmIHJhbmRvbUlTID09IG51bGwpIHsKKyAgICAgICAgICAgIHNldFJhbmRvbUZpbGUoZGV2UmFuZG9tU291cmNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmFuZG9tSVMgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gcmFuZG9tSVMucmVhZChieXRlcyk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSBieXRlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJHb3QgIiArIGxlbiArICIgIiArIGJ5dGVzLmxlbmd0aCApOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZSYW5kb21Tb3VyY2UgPSBudWxsOworICAgICAgICAgICAgCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJhbmRvbUlTLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKCJGYWlsZWQgdG8gY2xvc2UgcmFuZG9tSVMuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJhbmRvbUlTID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBnZXRSYW5kb20oKS5uZXh0Qnl0ZXMoYnl0ZXMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgYW5kIHJldHVybiBhIG5ldyBzZXNzaW9uIGlkZW50aWZpZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBTdHJpbmcgZ2VuZXJhdGVTZXNzaW9uSWQoKSB7CisKKyAgICAgICAgYnl0ZSByYW5kb21bXSA9IG5ldyBieXRlWzE2XTsKKyAgICAgICAgU3RyaW5nIGp2bVJvdXRlID0gZ2V0SnZtUm91dGUoKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7CisKKyAgICAgICAgLy8gUmVuZGVyIHRoZSByZXN1bHQgYXMgYSBTdHJpbmcgb2YgaGV4YWRlY2ltYWwgZGlnaXRzCisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCByZXN1bHRMZW5CeXRlcyA9IDA7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgZHVwbGljYXRlcysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAocmVzdWx0TGVuQnl0ZXMgPCB0aGlzLnNlc3Npb25JZExlbmd0aCkgeworICAgICAgICAgICAgICAgIGdldFJhbmRvbUJ5dGVzKHJhbmRvbSk7CisgICAgICAgICAgICAgICAgcmFuZG9tID0gZ2V0RGlnZXN0KCkuZGlnZXN0KHJhbmRvbSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7CisgICAgICAgICAgICAgICAgaiA8IHJhbmRvbS5sZW5ndGggJiYgcmVzdWx0TGVuQnl0ZXMgPCB0aGlzLnNlc3Npb25JZExlbmd0aDsKKyAgICAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZSBiMSA9IChieXRlKSAoKHJhbmRvbVtqXSAmIDB4ZjApID4+IDQpOworICAgICAgICAgICAgICAgICAgICBieXRlIGIyID0gKGJ5dGUpIChyYW5kb21bal0gJiAweDBmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGIxIDwgMTApCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKSAoJzAnICsgYjEpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoY2hhcikgKCdBJyArIChiMSAtIDEwKSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYjIgPCAxMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpICgnMCcgKyBiMikpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKSAoJ0EnICsgKGIyIC0gMTApKSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdExlbkJ5dGVzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGp2bVJvdXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCcuJykuYXBwZW5kKGp2bVJvdXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IGJ1ZmZlci50b1N0cmluZygpOworICAgICAgICB9IHdoaWxlIChzZXNzaW9ucy5jb250YWluc0tleShyZXN1bHQpKTsKKyAgICAgICAgcmV0dXJuIChyZXN1bHQpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGVuY2xvc2luZyBFbmdpbmUgZm9yIHRoaXMgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gRW5naW5lIG9iamVjdCAob3IgbnVsbCkuCisgICAgICovCisgICAgcHVibGljIEVuZ2luZSBnZXRFbmdpbmUoKSB7CisgICAgICAgIEVuZ2luZSBlID0gbnVsbDsKKyAgICAgICAgZm9yIChDb250YWluZXIgYyA9IGdldENvbnRhaW5lcigpOyBlID09IG51bGwgJiYgYyAhPSBudWxsIDsgYyA9IGMuZ2V0UGFyZW50KCkpIHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYyBpbnN0YW5jZW9mIEVuZ2luZSkgeworICAgICAgICAgICAgICAgIGUgPSAoRW5naW5lKWM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgSnZtUm91dGUgZm9yIHRoZSBlbmNsb3NpbmcgRW5naW5lLgorICAgICAqIEByZXR1cm4gdGhlIEp2bVJvdXRlIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRKdm1Sb3V0ZSgpIHsKKyAgICAgICAgRW5naW5lIGUgPSBnZXRFbmdpbmUoKTsKKyAgICAgICAgcmV0dXJuIGUgPT0gbnVsbCA/IG51bGwgOiBlLmdldEp2bVJvdXRlKCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbkNvdW50ZXIoaW50IHNlc3Npb25Db3VudGVyKSB7CisgICAgICAgIHRoaXMuc2Vzc2lvbkNvdW50ZXIgPSBzZXNzaW9uQ291bnRlcjsKKyAgICB9CisKKworICAgIC8qKiAKKyAgICAgKiBUb3RhbCBzZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgbWFuYWdlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc2Vzc2lvbnMgY3JlYXRlZAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2Vzc2lvbkNvdW50ZXIoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uQ291bnRlcjsKKyAgICB9CisKKworICAgIC8qKiAKKyAgICAgKiBOdW1iZXIgb2YgZHVwbGljYXRlZCBzZXNzaW9uIElEcyBnZW5lcmF0ZWQgYnkgdGhlIHJhbmRvbSBzb3VyY2UuCisgICAgICogQW55dGhpbmcgYmlnZ2VyIHRoYW4gMCBtZWFucyBwcm9ibGVtcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNvdW50IG9mIGR1cGxpY2F0ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldER1cGxpY2F0ZXMoKSB7CisgICAgICAgIHJldHVybiBkdXBsaWNhdGVzOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0RHVwbGljYXRlcyhpbnQgZHVwbGljYXRlcykgeworICAgICAgICB0aGlzLmR1cGxpY2F0ZXMgPSBkdXBsaWNhdGVzOworICAgIH0KKworCisgICAgLyoqIAorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMKKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIHNlc3Npb25zIGFjdGl2ZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QWN0aXZlU2Vzc2lvbnMoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9ucy5zaXplKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNYXggbnVtYmVyIG9mIGNvbmN1cnJlbnQgYWN0aXZlIHNlc3Npb25zCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBoaWdoZXN0IG51bWJlciBvZiBjb25jdXJyZW50IGFjdGl2ZSBzZXNzaW9ucworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4QWN0aXZlKCkgeworICAgICAgICByZXR1cm4gbWF4QWN0aXZlOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0TWF4QWN0aXZlKGludCBtYXhBY3RpdmUpIHsKKyAgICAgICAgdGhpcy5tYXhBY3RpdmUgPSBtYXhBY3RpdmU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsb25nZXN0IHRpbWUgKGluIHNlY29uZHMpIHRoYXQgYW4gZXhwaXJlZCBzZXNzaW9uIGhhZCBiZWVuCisgICAgICogYWxpdmUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIExvbmdlc3QgdGltZSAoaW4gc2Vjb25kcykgdGhhdCBhbiBleHBpcmVkIHNlc3Npb24gaGFkIGJlZW4KKyAgICAgKiBhbGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNlc3Npb25NYXhBbGl2ZVRpbWUoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uTWF4QWxpdmVUaW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbG9uZ2VzdCB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IGFuIGV4cGlyZWQgc2Vzc2lvbiBoYWQgYmVlbgorICAgICAqIGFsaXZlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb25NYXhBbGl2ZVRpbWUgTG9uZ2VzdCB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IGFuIGV4cGlyZWQKKyAgICAgKiBzZXNzaW9uIGhhZCBiZWVuIGFsaXZlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25NYXhBbGl2ZVRpbWUoaW50IHNlc3Npb25NYXhBbGl2ZVRpbWUpIHsKKyAgICAgICAgdGhpcy5zZXNzaW9uTWF4QWxpdmVUaW1lID0gc2Vzc2lvbk1heEFsaXZlVGltZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGF2ZXJhZ2UgdGltZSAoaW4gc2Vjb25kcykgdGhhdCBleHBpcmVkIHNlc3Npb25zIGhhZCBiZWVuCisgICAgICogYWxpdmUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEF2ZXJhZ2UgdGltZSAoaW4gc2Vjb25kcykgdGhhdCBleHBpcmVkIHNlc3Npb25zIGhhZCBiZWVuCisgICAgICogYWxpdmUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZXNzaW9uQXZlcmFnZUFsaXZlVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb25BdmVyYWdlQWxpdmVUaW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYXZlcmFnZSB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IGV4cGlyZWQgc2Vzc2lvbnMgaGFkIGJlZW4KKyAgICAgKiBhbGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uQXZlcmFnZUFsaXZlVGltZSBBdmVyYWdlIHRpbWUgKGluIHNlY29uZHMpIHRoYXQgZXhwaXJlZAorICAgICAqIHNlc3Npb25zIGhhZCBiZWVuIGFsaXZlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25BdmVyYWdlQWxpdmVUaW1lKGludCBzZXNzaW9uQXZlcmFnZUFsaXZlVGltZSkgeworICAgICAgICB0aGlzLnNlc3Npb25BdmVyYWdlQWxpdmVUaW1lID0gc2Vzc2lvbkF2ZXJhZ2VBbGl2ZVRpbWU7CisgICAgfQorCisKKyAgICAvKiogCisgICAgICogRm9yIGRlYnVnZ2luZzogcmV0dXJuIGEgbGlzdCBvZiBhbGwgc2Vzc2lvbiBpZHMgY3VycmVudGx5IGFjdGl2ZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBsaXN0U2Vzc2lvbklkcygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiPW5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgSXRlcmF0b3Iga2V5cz1zZXNzaW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSgga2V5cy5oYXNOZXh0KCkgKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoa2V5cy5uZXh0KCkpLmFwcGVuZCgiICIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworCisgICAgLyoqIAorICAgICAqIEZvciBkZWJ1Z2dpbmc6IGdldCBhIHNlc3Npb24gYXR0cmlidXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbklkCisgICAgICogQHBhcmFtIGtleQorICAgICAqIEByZXR1cm4gVGhlIGF0dHJpYnV0ZSB2YWx1ZSwgaWYgZm91bmQsIG51bGwgb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uQXR0cmlidXRlKCBTdHJpbmcgc2Vzc2lvbklkLCBTdHJpbmcga2V5ICkgeworICAgICAgICBTZXNzaW9uIHM9KFNlc3Npb24pc2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCk7CisgICAgICAgIGlmKCBzPT1udWxsICkgeworICAgICAgICAgICAgaWYobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiU2Vzc2lvbiBub3QgZm91bmQgIiArIHNlc3Npb25JZCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBPYmplY3Qgbz1zLmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoa2V5KTsKKyAgICAgICAgaWYoIG89PW51bGwgKSByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gc2Vzc2lvbiBpZC4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBpcyBvcmdhbml6ZWQgYXMgYSBIYXNoTWFwLCBtYXBwaW5nIAorICAgICAqIHNlc3Npb24gYXR0cmlidXRlIG5hbWVzIHRvIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlaXIgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb25JZCBTZXNzaW9uIGlkCisgICAgICogCisgICAgICogQHJldHVybiBIYXNoTWFwIG1hcHBpbmcgc2Vzc2lvbiBhdHRyaWJ1dGUgbmFtZXMgdG8gdGhlIFN0cmluZworICAgICAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZWlyIHZhbHVlcywgb3IgbnVsbCBpZiBubyBzZXNzaW9uIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIGlkIGV4aXN0cywgb3IgaWYgdGhlIHNlc3Npb24gZG9lcyBub3QgaGF2ZSBhbnkgYXR0cmlidXRlcworICAgICAqLworICAgIHB1YmxpYyBIYXNoTWFwIGdldFNlc3Npb24oU3RyaW5nIHNlc3Npb25JZCkgeworICAgICAgICBTZXNzaW9uIHMgPSAoU2Vzc2lvbikgc2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCk7CisgICAgICAgIGlmIChzID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmluZm8oIlNlc3Npb24gbm90IGZvdW5kICIgKyBzZXNzaW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBFbnVtZXJhdGlvbiBlZSA9IHMuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgICAgIGlmIChlZSA9PSBudWxsIHx8ICFlZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHdoaWxlIChlZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgZWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIG1hcC5wdXQoYXR0ck5hbWUsIGdldFNlc3Npb25BdHRyaWJ1dGUoc2Vzc2lvbklkLCBhdHRyTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGV4cGlyZVNlc3Npb24oIFN0cmluZyBzZXNzaW9uSWQgKSB7CisgICAgICAgIFNlc3Npb24gcz0oU2Vzc2lvbilzZXNzaW9ucy5nZXQoc2Vzc2lvbklkKTsKKyAgICAgICAgaWYoIHM9PW51bGwgKSB7CisgICAgICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJTZXNzaW9uIG5vdCBmb3VuZCAiICsgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzLmV4cGlyZSgpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRMYXN0QWNjZXNzZWRUaW1lKCBTdHJpbmcgc2Vzc2lvbklkICkgeworICAgICAgICBTZXNzaW9uIHM9KFNlc3Npb24pc2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCk7CisgICAgICAgIGlmKCBzPT1udWxsICkgeworICAgICAgICAgICAgbG9nLmluZm8oIlNlc3Npb24gbm90IGZvdW5kICIgKyBzZXNzaW9uSWQpOworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgRGF0ZShzLmdldExhc3RBY2Nlc3NlZFRpbWUoKSkudG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEpNWCBhbmQgUmVnaXN0cmF0aW9uICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHByb3RlY3RlZCBTdHJpbmcgZG9tYWluOworICAgIHByb3RlY3RlZCBPYmplY3ROYW1lIG9uYW1lOworICAgIHByb3RlY3RlZCBNQmVhblNlcnZlciBtc2VydmVyOworCisgICAgcHVibGljIE9iamVjdE5hbWUgZ2V0T2JqZWN0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG9uYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gZG9tYWluOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3ROYW1lIHByZVJlZ2lzdGVyKE1CZWFuU2VydmVyIHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBvbmFtZT1uYW1lOworICAgICAgICBtc2VydmVyPXNlcnZlcjsKKyAgICAgICAgZG9tYWluPW5hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3RSZWdpc3RlcihCb29sZWFuIHJlZ2lzdHJhdGlvbkRvbmUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXJlZ2lzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9zdERlcmVnaXN0ZXIoKSB7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9QZXJzaXN0ZW50TWFuYWdlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vUGVyc2lzdGVudE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTU5YzdkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vUGVyc2lzdGVudE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbjsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGI+TWFuYWdlcjwvYj4gaW50ZXJmYWNlIHRoYXQgbWFrZXMgdXNlIG9mCisgKiBhIFN0b3JlIHRvIHN3YXAgYWN0aXZlIFNlc3Npb25zIHRvIGRpc2suIEl0IGNhbiBiZSBjb25maWd1cmVkIHRvCisgKiBhY2hpZXZlIHNldmVyYWwgZGlmZmVyZW50IGdvYWxzOgorICoKKyAqIDxsaT5QZXJzaXN0IHNlc3Npb25zIGFjcm9zcyByZXN0YXJ0cyBvZiB0aGUgQ29udGFpbmVyPC9saT4KKyAqIDxsaT5GYXVsdCB0b2xlcmFuY2UsIGtlZXAgc2Vzc2lvbnMgYmFja2VkIHVwIG9uIGRpc2sgdG8gYWxsb3cKKyAqICAgICByZWNvdmVyeSBpbiB0aGUgZXZlbnQgb2YgdW5wbGFubmVkIHJlc3RhcnRzLjwvbGk+CisgKiA8bGk+TGltaXQgdGhlIG51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMga2VwdCBpbiBtZW1vcnkgYnkKKyAqICAgICBzd2FwcGluZyBsZXNzIGFjdGl2ZSBzZXNzaW9ucyBvdXQgdG8gZGlzay48L2xpPgorICoKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIEBhdXRob3IgS2llZiBNb3JyaXMgKGtpZWZAa2llZi5jb20pCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFBlcnNpc3RlbnRNYW5hZ2VyIGV4dGVuZHMgUGVyc2lzdGVudE1hbmFnZXJCYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIlBlcnNpc3RlbnRNYW5hZ2VyLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBuYW1lIG9mIHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbiAoZm9yIGxvZ2dpbmcpLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIG5hbWUgPSAiUGVyc2lzdGVudE1hbmFnZXIiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVzY3JpcHRpdmUgc2hvcnQgbmFtZSBvZiB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisgfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9QZXJzaXN0ZW50TWFuYWdlckJhc2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL1BlcnNpc3RlbnRNYW5hZ2VyQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YzllNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9QZXJzaXN0ZW50TWFuYWdlckJhc2UuamF2YQpAQCAtMCwwICsxLDExMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uOworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5MaWZlY3ljbGVTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zZWN1cml0eS5TZWN1cml0eVV0aWw7CisvKioKKyAqIEV4dGVuZHMgdGhlIDxiPk1hbmFnZXJCYXNlPC9iPiBjbGFzcyB0byBpbXBsZW1lbnQgbW9zdCBvZiB0aGUKKyAqIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQgYnkgYSBNYW5hZ2VyIHdoaWNoIHN1cHBvcnRzIGFueSBraW5kIG9mCisgKiBwZXJzaXN0ZW5jZSwgZXZlbiBpZiBvbmx5Zm9yICByZXN0YXJ0cy4KKyAqIDxwPgorICogPGI+SU1QTEVNRU5UQVRJT04gTk9URTwvYj46ICBDb3JyZWN0IGJlaGF2aW9yIG9mIHNlc3Npb24gc3RvcmluZyBhbmQKKyAqIHJlbG9hZGluZyBkZXBlbmRzIHVwb24gZXh0ZXJuYWwgY2FsbHMgdG8gdGhlIDxjb2RlPnN0YXJ0KCk8L2NvZGU+IGFuZAorICogPGNvZGU+c3RvcCgpPC9jb2RlPiBtZXRob2RzIG9mIHRoaXMgY2xhc3MgYXQgdGhlIGNvcnJlY3QgdGltZXMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIEplYW4tRnJhbmNvaXMgQXJjYW5kCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQZXJzaXN0ZW50TWFuYWdlckJhc2UKKyAgICBleHRlbmRzIE1hbmFnZXJCYXNlCisgICAgaW1wbGVtZW50cyBMaWZlY3ljbGUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBlcnNpc3RlbnRNYW5hZ2VyQmFzZS5jbGFzcyk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlY3VyaXR5IENsYXNzZXMKKworICAgIHByaXZhdGUgY2xhc3MgUHJpdmlsZWdlZFN0b3JlQ2xlYXIKKyAgICAgICAgaW1wbGVtZW50cyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIHsKKworICAgICAgICBQcml2aWxlZ2VkU3RvcmVDbGVhcigpIHsgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgICAgc3RvcmUuY2xlYXIoKTsKKyAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0gICAKKyAgICAgCisgICAgcHJpdmF0ZSBjbGFzcyBQcml2aWxlZ2VkU3RvcmVSZW1vdmUKKyAgICAgICAgaW1wbGVtZW50cyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBpZDsgICAgCisgICAgICAgICAgICAKKyAgICAgICAgUHJpdmlsZWdlZFN0b3JlUmVtb3ZlKFN0cmluZyBpZCkgeyAgICAgCisgICAgICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBFeGNlcHRpb257CisgICAgICAgICAgIHN0b3JlLnJlbW92ZShpZCk7CisgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9ICAgCisgICAgIAorICAgIHByaXZhdGUgY2xhc3MgUHJpdmlsZWdlZFN0b3JlTG9hZAorICAgICAgICBpbXBsZW1lbnRzIFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24geworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGlkOyAgICAKKyAgICAgICAgICAgIAorICAgICAgICBQcml2aWxlZ2VkU3RvcmVMb2FkKFN0cmluZyBpZCkgeyAgICAgCisgICAgICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBFeGNlcHRpb257CisgICAgICAgICAgIHJldHVybiBzdG9yZS5sb2FkKGlkKTsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfSAgIAorICAgICAgICAgIAorICAgIHByaXZhdGUgY2xhc3MgUHJpdmlsZWdlZFN0b3JlU2F2ZQorICAgICAgICBpbXBsZW1lbnRzIFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24geworCisgICAgICAgIHByaXZhdGUgU2Vzc2lvbiBzZXNzaW9uOyAgICAKKyAgICAgICAgICAgIAorICAgICAgICBQcml2aWxlZ2VkU3RvcmVTYXZlKFNlc3Npb24gc2Vzc2lvbikgeyAgICAgCisgICAgICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICAgICBzdG9yZS5zYXZlKHNlc3Npb24pOworICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfSAgIAorICAgICAKKyAgICBwcml2YXRlIGNsYXNzIFByaXZpbGVnZWRTdG9yZUtleXMKKyAgICAgICAgaW1wbGVtZW50cyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIHsKKworICAgICAgICBQcml2aWxlZ2VkU3RvcmVLZXlzKCkgeyAgICAgCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBFeGNlcHRpb257CisgICAgICAgICAgIHJldHVybiBzdG9yZS5rZXlzKCk7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJQZXJzaXN0ZW50TWFuYWdlckJhc2UvMS4xIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGxpZmVjeWNsZSBldmVudCBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlmZWN5Y2xlU3VwcG9ydCBsaWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBTZXNzaW9ucyBhbGxvd2VkLCBvciAtMSBmb3Igbm8gbGltaXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtYXhBY3RpdmVTZXNzaW9ucyA9IC0xOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgbmFtZSBvZiB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24gKGZvciBsb2dnaW5nKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZSA9ICJQZXJzaXN0ZW50TWFuYWdlckJhc2UiOworCisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhpcyBjb21wb25lbnQgYmVlbiBzdGFydGVkIHlldD8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFN0b3JlIG9iamVjdCB3aGljaCB3aWxsIG1hbmFnZSB0aGUgU2Vzc2lvbiBzdG9yZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RvcmUgc3RvcmUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHNhdmUgYW5kIHJlbG9hZCBzZXNzaW9ucyB3aGVuIHRoZSBNYW5hZ2VyIDxjb2RlPnVubG9hZDwvY29kZT4KKyAgICAgKiBhbmQgPGNvZGU+bG9hZDwvY29kZT4gbWV0aG9kcyBhcmUgY2FsbGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHNhdmVPblJlc3RhcnQgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBIb3cgbG9uZyBhIHNlc3Npb24gbXVzdCBiZSBpZGxlIGJlZm9yZSBpdCBzaG91bGQgYmUgYmFja2VkIHVwLgorICAgICAqIC0xIG1lYW5zIHNlc3Npb25zIHdvbid0IGJlIGJhY2tlZCB1cC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG1heElkbGVCYWNrdXAgPSAtMTsKKworCisgICAgLyoqCisgICAgICogTWluaW11bSB0aW1lIGEgc2Vzc2lvbiBtdXN0IGJlIGlkbGUgYmVmb3JlIGl0IGlzIHN3YXBwZWQgdG8gZGlzay4KKyAgICAgKiBUaGlzIG92ZXJyaWRlcyBtYXhBY3RpdmVTZXNzaW9ucywgdG8gcHJldmVudCB0aHJhc2hpbmcgaWYgdGhlcmUgYXJlIGxvdHMKKyAgICAgKiBvZiBhY3RpdmUgc2Vzc2lvbnMuIFNldHRpbmcgdG8gLTEgbWVhbnMgaXQncyBpZ25vcmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgbWluSWRsZVN3YXAgPSAtMTsKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIHRpbWUgYSBzZXNzaW9uIG1heSBiZSBpZGxlIGJlZm9yZSBpdCBzaG91bGQgYmUgc3dhcHBlZAorICAgICAqIHRvIGZpbGUganVzdCBvbiBnZW5lcmFsIHByaW5jaXBsZS4gU2V0dGluZyB0aGlzIHRvIC0xIG1lYW5zIHNlc3Npb25zCisgICAgICogc2hvdWxkIG5vdCBiZSBmb3JjZWQgb3V0LgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgbWF4SWRsZVN3YXAgPSAtMTsKKworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIHNlc3Npb24gY3JlYXRpb25zIHRoYXQgZmFpbGVkIGR1ZSB0byBtYXhBY3RpdmVTZXNzaW9ucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHJlamVjdGVkU2Vzc2lvbnMgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzaW5nIHRpbWUgZHVyaW5nIHNlc3Npb24gZXhwaXJhdGlvbiBhbmQgcGFzc2l2YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgcHJvY2Vzc2luZ1RpbWUgPSAwOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIAorICAKKworCisgICAgLyoqCisJICogSW5kaWNhdGVzIGhvdyBtYW55IHNlY29uZHMgb2xkIGEgc2Vzc2lvbiBjYW4gZ2V0LCBhZnRlciBpdHMgbGFzdCB1c2UgaW4gYQorCSAqIHJlcXVlc3QsIGJlZm9yZSBpdCBzaG91bGQgYmUgYmFja2VkIHVwIHRvIHRoZSBzdG9yZS4gLTEgbWVhbnMgc2Vzc2lvbnMKKwkgKiBhcmUgbm90IGJhY2tlZCB1cC4KKwkgKi8KKyAgICBwdWJsaWMgaW50IGdldE1heElkbGVCYWNrdXAoKSB7CisKKyAgICAgICAgcmV0dXJuIG1heElkbGVCYWNrdXA7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG9wdGlvbiB0byBiYWNrIHNlc3Npb25zIHVwIHRvIHRoZSBTdG9yZSBhZnRlciB0aGV5CisgICAgICogYXJlIHVzZWQgaW4gYSByZXF1ZXN0LiBTZXNzaW9ucyByZW1haW4gYXZhaWxhYmxlIGluIG1lbW9yeQorICAgICAqIGFmdGVyIGJlaW5nIGJhY2tlZCB1cCwgc28gdGhleSBhcmUgbm90IHBhc3NpdmF0ZWQgYXMgdGhleSBhcmUKKyAgICAgKiB3aGVuIHN3YXBwZWQgb3V0LiBUaGUgdmFsdWUgc2V0IGluZGljYXRlcyBob3cgb2xkIGEgc2Vzc2lvbgorICAgICAqIG1heSBnZXQgKHNpbmNlIGl0cyBsYXN0IHVzZSkgYmVmb3JlIGl0IG11c3QgYmUgYmFja2VkIHVwOiAtMQorICAgICAqIG1lYW5zIHNlc3Npb25zIGFyZSBub3QgYmFja2VkIHVwLgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhIGhhcmQgbGltaXQ6IHNlc3Npb25zIGFyZSBjaGVja2VkCisgICAgICogYWdhaW5zdCB0aGlzIGFnZSBsaW1pdCBwZXJpb2RpY2FsbHkgYWNjb3JkaW5nIHRvIDxiPnByb2Nlc3NFeHBpcmVzRnJlcXVlbmN5PC9iPi4KKyAgICAgKiBUaGlzIHZhbHVlIHNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGluZGljYXRlIHdoZW4gYSBzZXNzaW9uIGlzCisgICAgICogcmlwZSBmb3IgYmFja2luZyB1cC4KKyAgICAgKiA8cD4KKyAgICAgKiBTbyBpdCBpcyBwb3NzaWJsZSB0aGF0IGEgc2Vzc2lvbiBtYXkgYmUgaWRsZSBmb3IgbWF4SWRsZUJhY2t1cCArCisgICAgICogcHJvY2Vzc0V4cGlyZXNGcmVxdWVuY3kgKiBlbmdpbmUuYmFja2dyb3VuZFByb2Nlc3NvckRlbGF5IHNlY29uZHMsIHBsdXMgdGhlIHRpbWUgaXQgdGFrZXMgdG8gaGFuZGxlIG90aGVyCisgICAgICogc2Vzc2lvbiBleHBpcmF0aW9uLCBzd2FwcGluZywgZXRjLiB0YXNrcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYWNrdXAgVGhlIG51bWJlciBvZiBzZWNvbmRzIGFmdGVyIHRoZWlyIGxhc3QgYWNjZXNzZWQKKyAgICAgKiB0aW1lIHdoZW4gdGhleSBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGUgU3RvcmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWF4SWRsZUJhY2t1cCAoaW50IGJhY2t1cCkgeworCisgICAgICAgIGlmIChiYWNrdXAgPT0gdGhpcy5tYXhJZGxlQmFja3VwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpbnQgb2xkQmFja3VwID0gdGhpcy5tYXhJZGxlQmFja3VwOworICAgICAgICB0aGlzLm1heElkbGVCYWNrdXAgPSBiYWNrdXA7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJtYXhJZGxlQmFja3VwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIob2xkQmFja3VwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIodGhpcy5tYXhJZGxlQmFja3VwKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggYSBzZXNzaW9uIHNob3VsZCBiZSBzd2FwcGVkIG91dCBvZgorICAgICAqIG1lbW9yeSB0byBkaXNrLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4SWRsZVN3YXAoKSB7CisKKyAgICAgICAgcmV0dXJuIG1heElkbGVTd2FwOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0aW1lIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggYSBzZXNzaW9uIHNob3VsZCBiZSBzd2FwcGVkIG91dCBvZgorICAgICAqIG1lbW9yeSB0byBkaXNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heElkbGVTd2FwKGludCBtYXgpIHsKKworICAgICAgICBpZiAobWF4ID09IHRoaXMubWF4SWRsZVN3YXApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGludCBvbGRNYXhJZGxlU3dhcCA9IHRoaXMubWF4SWRsZVN3YXA7CisgICAgICAgIHRoaXMubWF4SWRsZVN3YXAgPSBtYXg7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJtYXhJZGxlU3dhcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKG9sZE1heElkbGVTd2FwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIodGhpcy5tYXhJZGxlU3dhcCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWluaW11bSB0aW1lIGluIHNlY29uZHMgdGhhdCBhIHNlc3Npb24gbXVzdCBiZSBpZGxlIGJlZm9yZQorICAgICAqIGl0IGNhbiBiZSBzd2FwcGVkIG91dCBvZiBtZW1vcnksIG9yIC0xIGlmIGl0IGNhbiBiZSBzd2FwcGVkIG91dAorICAgICAqIGF0IGFueSB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWluSWRsZVN3YXAoKSB7CisKKyAgICAgICAgcmV0dXJuIG1pbklkbGVTd2FwOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtaW5pbXVtIHRpbWUgaW4gc2Vjb25kcyB0aGF0IGEgc2Vzc2lvbiBtdXN0IGJlIGlkbGUgYmVmb3JlCisgICAgICogaXQgY2FuIGJlIHN3YXBwZWQgb3V0IG9mIG1lbW9yeSBkdWUgdG8gbWF4QWN0aXZlU2Vzc2lvbi4gU2V0IGl0IHRvIC0xCisgICAgICogaWYgaXQgY2FuIGJlIHN3YXBwZWQgb3V0IGF0IGFueSB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1pbklkbGVTd2FwKGludCBtaW4pIHsKKworICAgICAgICBpZiAodGhpcy5taW5JZGxlU3dhcCA9PSBtaW4pCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGludCBvbGRNaW5JZGxlU3dhcCA9IHRoaXMubWluSWRsZVN3YXA7CisgICAgICAgIHRoaXMubWluSWRsZVN3YXAgPSBtaW47CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJtaW5JZGxlU3dhcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKG9sZE1pbklkbGVTd2FwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIodGhpcy5taW5JZGxlU3dhcCkpOworCisgICAgfQorCisKKyAgICAvKioKKwkgKiBTZXQgdGhlIENvbnRhaW5lciB3aXRoIHdoaWNoIHRoaXMgTWFuYWdlciBoYXMgYmVlbiBhc3NvY2lhdGVkLiBJZiBpdCBpcyBhCisJICogQ29udGV4dCAodGhlIHVzdWFsIGNhc2UpLCBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlIHNlc3Npb24gdGltZW91dAorCSAqIHByb3BlcnR5LgorCSAqIAorCSAqIEBwYXJhbSBjb250YWluZXIKKwkgKiAgICAgICAgICAgIFRoZSBhc3NvY2lhdGVkIENvbnRhaW5lcgorCSAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgY29udGFpbmVyKSB7CisKKyAgICAgICAgLy8gRGUtcmVnaXN0ZXIgZnJvbSB0aGUgb2xkIENvbnRhaW5lciAoaWYgYW55KQorICAgICAgICBpZiAoKHRoaXMuY29udGFpbmVyICE9IG51bGwpICYmICh0aGlzLmNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgKChDb250ZXh0KSB0aGlzLmNvbnRhaW5lcikucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICAvLyBEZWZhdWx0IHByb2Nlc3NpbmcgcHJvdmlkZWQgYnkgb3VyIHN1cGVyY2xhc3MKKyAgICAgICAgc3VwZXIuc2V0Q29udGFpbmVyKGNvbnRhaW5lcik7CisKKyAgICAgICAgLy8gUmVnaXN0ZXIgd2l0aCB0aGUgbmV3IENvbnRhaW5lciAoaWYgYW55KQorICAgICAgICBpZiAoKHRoaXMuY29udGFpbmVyICE9IG51bGwpICYmICh0aGlzLmNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpKSB7CisgICAgICAgICAgICBzZXRNYXhJbmFjdGl2ZUludGVydmFsCisgICAgICAgICAgICAgICAgKCAoKENvbnRleHQpIHRoaXMuY29udGFpbmVyKS5nZXRTZXNzaW9uVGltZW91dCgpKjYwICk7CisgICAgICAgICAgICAoKENvbnRleHQpIHRoaXMuY29udGFpbmVyKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlLCBpZiB0aGUgc2Vzc2lvbiBpZCBpcyBsb2FkZWQgaW4gbWVtb3J5CisgICAgICogb3RoZXJ3aXNlIGZhbHNlIGlzIHJldHVybmVkCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgVGhlIHNlc3Npb24gaWQgZm9yIHRoZSBzZXNzaW9uIHRvIGJlIHNlYXJjaGVkIGZvcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTG9hZGVkKCBTdHJpbmcgaWQgKXsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICggc3VwZXIuZmluZFNlc3Npb24oaWQpICE9IG51bGwgKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoImNoZWNraW5nIGlzTG9hZGVkIGZvciBpZCwgIiArIGlkICsgIiwgIitlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgU2Vzc2lvbnMgYWxsb3dlZCwgb3IgLTEgZm9yCisgICAgICogbm8gbGltaXQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhBY3RpdmVTZXNzaW9ucygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMubWF4QWN0aXZlU2Vzc2lvbnMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZXMgU2Vzc2lvbnMgYWxsb3dlZCwgb3IgLTEgZm9yCisgICAgICogbm8gbGltaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWF4IFRoZSBuZXcgbWF4aW11bSBudW1iZXIgb2Ygc2Vzc2lvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhBY3RpdmVTZXNzaW9ucyhpbnQgbWF4KSB7CisKKyAgICAgICAgaW50IG9sZE1heEFjdGl2ZVNlc3Npb25zID0gdGhpcy5tYXhBY3RpdmVTZXNzaW9uczsKKyAgICAgICAgdGhpcy5tYXhBY3RpdmVTZXNzaW9ucyA9IG1heDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm1heEFjdGl2ZVNlc3Npb25zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIob2xkTWF4QWN0aXZlU2Vzc2lvbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcih0aGlzLm1heEFjdGl2ZVNlc3Npb25zKSk7CisKKyAgICB9CisKKworICAgIC8qKiAKKyAgICAgKiBOdW1iZXIgb2Ygc2Vzc2lvbiBjcmVhdGlvbnMgdGhhdCBmYWlsZWQgZHVlIHRvIG1heEFjdGl2ZVNlc3Npb25zLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY291bnQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlamVjdGVkU2Vzc2lvbnMoKSB7CisgICAgICAgIHJldHVybiByZWplY3RlZFNlc3Npb25zOworICAgIH0KKworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFJlamVjdGVkU2Vzc2lvbnMoaW50IHJlamVjdGVkU2Vzc2lvbnMpIHsKKyAgICAgICAgdGhpcy5yZWplY3RlZFNlc3Npb25zID0gcmVqZWN0ZWRTZXNzaW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlc2NyaXB0aXZlIHNob3J0IG5hbWUgb2YgdGhpcyBNYW5hZ2VyIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN0YXJ0ZWQgc3RhdHVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU3RhcnRlZCgpIHsKKworICAgICAgICByZXR1cm4gc3RhcnRlZDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdGFydGVkIGZsYWcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTdGFydGVkKGJvb2xlYW4gc3RhcnRlZCkgeworCisgICAgICAgIHRoaXMuc3RhcnRlZCA9IHN0YXJ0ZWQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgU3RvcmUgb2JqZWN0IHdoaWNoIHdpbGwgbWFuYWdlIHBlcnNpc3RlbnQgU2Vzc2lvbgorICAgICAqIHN0b3JhZ2UgZm9yIHRoaXMgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdG9yZSB0aGUgYXNzb2NpYXRlZCBTdG9yZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlKFN0b3JlIHN0b3JlKSB7CisgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKKyAgICAgICAgc3RvcmUuc2V0TWFuYWdlcih0aGlzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBTdG9yZSBvYmplY3Qgd2hpY2ggbWFuYWdlcyBwZXJzaXN0ZW50IFNlc3Npb24KKyAgICAgKiBzdG9yYWdlIGZvciB0aGlzIE1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIFN0b3JlIGdldFN0b3JlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5zdG9yZSk7CisKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgc2Vzc2lvbnMgYXJlIHNhdmVkIHdoZW4gdGhlIE1hbmFnZXIgaXMgc2h1dCBkb3duCisgICAgICogcHJvcGVybHkuIFRoaXMgcmVxdWlyZXMgdGhlIHVubG9hZCgpIG1ldGhvZCB0byBiZSBjYWxsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U2F2ZU9uUmVzdGFydCgpIHsKKworICAgICAgICByZXR1cm4gc2F2ZU9uUmVzdGFydDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvcHRpb24gdG8gc2F2ZSBzZXNzaW9ucyB0byB0aGUgU3RvcmUgd2hlbiB0aGUgTWFuYWdlciBpcworICAgICAqIHNodXQgZG93biwgdGhlbiBsb2FkZWQgd2hlbiB0aGUgTWFuYWdlciBzdGFydHMgYWdhaW4uIElmIHNldCB0bworICAgICAqIGZhbHNlLCBhbnkgc2Vzc2lvbnMgZm91bmQgaW4gdGhlIFN0b3JlIG1heSBzdGlsbCBiZSBwaWNrZWQgdXAgd2hlbgorICAgICAqIHRoZSBNYW5hZ2VyIGlzIHN0YXJ0ZWQgYWdhaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2F2ZU9uUmVzdGFydCB0cnVlIGlmIHNlc3Npb25zIHNob3VsZCBiZSBzYXZlZCBvbiByZXN0YXJ0LCBmYWxzZSBpZgorICAgICAqICAgICB0aGV5IHNob3VsZCBiZSBpZ25vcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNhdmVPblJlc3RhcnQoYm9vbGVhbiBzYXZlT25SZXN0YXJ0KSB7CisKKyAgICAgICAgaWYgKHNhdmVPblJlc3RhcnQgPT0gdGhpcy5zYXZlT25SZXN0YXJ0KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGJvb2xlYW4gb2xkU2F2ZU9uUmVzdGFydCA9IHRoaXMuc2F2ZU9uUmVzdGFydDsKKyAgICAgICAgdGhpcy5zYXZlT25SZXN0YXJ0ID0gc2F2ZU9uUmVzdGFydDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInNhdmVPblJlc3RhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbihvbGRTYXZlT25SZXN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odGhpcy5zYXZlT25SZXN0YXJ0KSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDbGVhciBhbGwgc2Vzc2lvbnMgZnJvbSB0aGUgU3RvcmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJTdG9yZSgpIHsKKworICAgICAgICBpZiAoc3RvcmUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB0cnkgeyAgICAgCisgICAgICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpeworICAgICAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRTdG9yZUNsZWFyKCkpOworICAgICAgICAgICAgICAgIH1jYXRjaChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IGV4LmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBjbGVhcmluZyB0aGUgU3RvcmU6ICIgKyBleGNlcHRpb24pOworICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdG9yZS5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBjbGVhcmluZyB0aGUgU3RvcmU6ICIgKyBlKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW1wbGVtZW50cyB0aGUgTWFuYWdlciBpbnRlcmZhY2UsIGRpcmVjdCBjYWxsIHRvIHByb2Nlc3NFeHBpcmVzIGFuZCBwcm9jZXNzUGVyc2lzdGVuY2VDaGVja3MKKyAgICAgKi8KKwlwdWJsaWMgdm9pZCBwcm9jZXNzRXhwaXJlcygpIHsKKwkJCisgICAgICAgIGxvbmcgdGltZU5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBTZXNzaW9uIHNlc3Npb25zW10gPSBmaW5kU2Vzc2lvbnMoKTsKKyAgICAgICAgaW50IGV4cGlyZUhlcmUgPSAwIDsKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgbG9nLmRlYnVnKCJTdGFydCBleHBpcmUgc2Vzc2lvbnMgIiArIGdldE5hbWUoKSArICIgYXQgIiArIHRpbWVOb3cgKyAiIHNlc3Npb25jb3VudCAiICsgc2Vzc2lvbnMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXNzaW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCFzZXNzaW9uc1tpXS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICBleHBpcmVkU2Vzc2lvbnMrKzsKKyAgICAgICAgICAgICAgICBleHBpcmVIZXJlKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJvY2Vzc1BlcnNpc3RlbmNlQ2hlY2tzKCk7CisgICAgICAgIGlmICgoZ2V0U3RvcmUoKSAhPSBudWxsKSAmJiAoZ2V0U3RvcmUoKSBpbnN0YW5jZW9mIFN0b3JlQmFzZSkpIHsKKyAgICAgICAgICAgICgoU3RvcmVCYXNlKSBnZXRTdG9yZSgpKS5wcm9jZXNzRXhwaXJlcygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBsb25nIHRpbWVFbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgbG9nLmRlYnVnKCJFbmQgZXhwaXJlIHNlc3Npb25zICIgKyBnZXROYW1lKCkgKyAiIHByb2Nlc3NpbmdUaW1lICIgKyAodGltZUVuZCAtIHRpbWVOb3cpICsgIiBleHBpcmVkIHNlc3Npb25zOiAiICsgZXhwaXJlSGVyZSk7CisgICAgICAgIHByb2Nlc3NpbmdUaW1lICs9ICh0aW1lRW5kIC0gdGltZU5vdyk7CisgCQkKKwl9CisKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgYmFja2dyb3VuZCB0aHJlYWQgYWZ0ZXIgYWN0aXZlIHNlc3Npb25zIGhhdmUgYmVlbiBjaGVja2VkCisgICAgICogZm9yIGV4cGlyYXRpb24sIHRvIGFsbG93IHNlc3Npb25zIHRvIGJlIHN3YXBwZWQgb3V0LCBiYWNrZWQgdXAsIGV0Yy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzUGVyc2lzdGVuY2VDaGVja3MoKSB7CisKKyAgICAgICAgcHJvY2Vzc01heElkbGVTd2FwcygpOworICAgICAgICBwcm9jZXNzTWF4QWN0aXZlU3dhcHMoKTsKKyAgICAgICAgcHJvY2Vzc01heElkbGVCYWNrdXBzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWN0aXZlIFNlc3Npb24sIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1hbmFnZXIsIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIHNlc3Npb24gaWQgKGlmIGFueSk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogVGhpcyBtZXRob2QgY2hlY2tzIHRoZSBwZXJzaXN0ZW5jZSBzdG9yZSBpZiBwZXJzaXN0ZW5jZSBpcyBlbmFibGVkLAorICAgICAqIG90aGVyd2lzZSBqdXN0IHVzZXMgdGhlIGZ1bmN0aW9uYWxpdHkgZnJvbSBNYW5hZ2VyQmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCBUaGUgc2Vzc2lvbiBpZCBmb3IgdGhlIHNlc3Npb24gdG8gYmUgcmV0dXJuZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgbmV3IHNlc3Npb24gY2Fubm90IGJlCisgICAgICogIGluc3RhbnRpYXRlZCBmb3IgYW55IHJlYXNvbgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycyB3aGlsZQorICAgICAqICBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdAorICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uIGZpbmRTZXNzaW9uKFN0cmluZyBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBzdXBlci5maW5kU2Vzc2lvbihpZCk7CisgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHNlc3Npb24pOworCisgICAgICAgIC8vIFNlZSBpZiB0aGUgU2Vzc2lvbiBpcyBpbiB0aGUgU3RvcmUKKyAgICAgICAgc2Vzc2lvbiA9IHN3YXBJbihpZCk7CisgICAgICAgIHJldHVybiAoc2Vzc2lvbik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhpcyBTZXNzaW9uIGZyb20gdGhlIGFjdGl2ZSBTZXNzaW9ucyBmb3IgdGhpcyBNYW5hZ2VyLAorICAgICAqIGJ1dCBub3QgZnJvbSB0aGUgU3RvcmUuIChVc2VkIGJ5IHRoZSBQZXJzaXN0ZW50VmFsdmUpCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiBTZXNzaW9uIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTdXBlcihTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgc3VwZXIucmVtb3ZlIChzZXNzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGFsbCBzZXNzaW9ucyBmb3VuZCBpbiB0aGUgcGVyc2lzdGVuY2UgbWVjaGFuaXNtLCBhc3N1bWluZworICAgICAqIHRoZXkgYXJlIG1hcmtlZCBhcyB2YWxpZCBhbmQgaGF2ZSBub3QgcGFzc2VkIHRoZWlyIGV4cGlyYXRpb24KKyAgICAgKiBsaW1pdC4gSWYgcGVyc2lzdGVuY2UgaXMgbm90IHN1cHBvcnRlZCwgdGhpcyBtZXRob2QgcmV0dXJucworICAgICAqIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IGJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgYnkgdGhlIE1pZGRsZU1hbmFnZXIKKyAgICAgKiBjbGFzcy4gSW4gb3JkZXIgdG8gdXNlIGl0LCBhIHN1YmNsYXNzIG11c3Qgc3BlY2lmaWNhbGx5IGNhbGwgaXQsCisgICAgICogZm9yIGV4YW1wbGUgaW4gdGhlIHN0YXJ0KCkgYW5kL29yIHByb2Nlc3NQZXJzaXN0ZW5jZUNoZWNrcygpIG1ldGhvZHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZCgpIHsKKworICAgICAgICAvLyBJbml0aWFsaXplIG91ciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMKKyAgICAgICAgc2Vzc2lvbnMuY2xlYXIoKTsKKworICAgICAgICBpZiAoc3RvcmUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTdHJpbmdbXSBpZHMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKXsKKyAgICAgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgICAgIGlkcyA9IChTdHJpbmdbXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkU3RvcmVLZXlzKCkpOworICAgICAgICAgICAgICAgIH1jYXRjaChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IGV4LmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBpbiB0aGUgU3RvcmUgZHVyaW5nIGxvYWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWRzID0gc3RvcmUua2V5cygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkNhbid0IGxvYWQgc2Vzc2lvbnMgZnJvbSBzdG9yZSwgIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBuID0gaWRzLmxlbmd0aDsKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJwZXJzaXN0ZW50TWFuYWdlci5sb2FkaW5nIiwgU3RyaW5nLnZhbHVlT2YobikpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3dhcEluKGlkc1tpXSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgbG9hZCBzZXNzaW9uIGZyb20gc3RvcmUsICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGlzIFNlc3Npb24gZnJvbSB0aGUgYWN0aXZlIFNlc3Npb25zIGZvciB0aGlzIE1hbmFnZXIsCisgICAgICogYW5kIGZyb20gdGhlIFN0b3JlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKFNlc3Npb24gc2Vzc2lvbikgeworCisgICAgICAgIHN1cGVyLnJlbW92ZSAoc2Vzc2lvbik7CisKKyAgICAgICAgaWYgKHN0b3JlICE9IG51bGwpeworICAgICAgICAgICAgcmVtb3ZlU2Vzc2lvbihzZXNzaW9uLmdldElkSW50ZXJuYWwoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhpcyBTZXNzaW9uIGZyb20gdGhlIGFjdGl2ZSBTZXNzaW9ucyBmb3IgdGhpcyBNYW5hZ2VyLAorICAgICAqIGFuZCBmcm9tIHRoZSBTdG9yZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCBTZXNzaW9uJ3MgaWQgdG8gYmUgcmVtb3ZlZAorICAgICAqLyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZXNzaW9uKFN0cmluZyBpZCl7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpeworICAgICAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRTdG9yZVJlbW92ZShpZCkpOworICAgICAgICAgICAgICAgIH1jYXRjaChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IGV4LmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBpbiB0aGUgU3RvcmUgZHVyaW5nIHJlbW92ZVNlc3Npb246ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIHN0b3JlLnJlbW92ZShpZCk7CisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiRXhjZXB0aW9uIHJlbW92aW5nIHNlc3Npb24gICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIGFsbCBjdXJyZW50bHkgYWN0aXZlIHNlc3Npb25zIGluIHRoZSBhcHByb3ByaWF0ZSBwZXJzaXN0ZW5jZQorICAgICAqIG1lY2hhbmlzbSwgaWYgYW55LiAgSWYgcGVyc2lzdGVuY2UgaXMgbm90IHN1cHBvcnRlZCwgdGhpcyBtZXRob2QKKyAgICAgKiByZXR1cm5zIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IGJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgYnkgdGhlIE1pZGRsZU1hbmFnZXIKKyAgICAgKiBjbGFzcy4gSW4gb3JkZXIgdG8gdXNlIGl0LCBhIHN1YmNsYXNzIG11c3Qgc3BlY2lmaWNhbGx5IGNhbGwgaXQsCisgICAgICogZm9yIGV4YW1wbGUgaW4gdGhlIHN0b3AoKSBhbmQvb3IgcHJvY2Vzc1BlcnNpc3RlbmNlQ2hlY2tzKCkgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmxvYWQoKSB7CisKKyAgICAgICAgaWYgKHN0b3JlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uc1tdID0gZmluZFNlc3Npb25zKCk7CisgICAgICAgIGludCBuID0gc2Vzc2lvbnMubGVuZ3RoOworICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoInBlcnNpc3RlbnRNYW5hZ2VyLnVubG9hZGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKG4pKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN3YXBPdXQoc2Vzc2lvbnNbaV0pOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIDsgICAvLyBUaGlzIGlzIGxvZ2dlZCBpbiB3cml0ZVNlc3Npb24oKQorICAgICAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogTG9vayBmb3IgYSBzZXNzaW9uIGluIHRoZSBTdG9yZSBhbmQsIGlmIGZvdW5kLCByZXN0b3JlCisgICAgICogaXQgaW4gdGhlIE1hbmFnZXIncyBsaXN0IG9mIGFjdGl2ZSBzZXNzaW9ucyBpZiBhcHByb3ByaWF0ZS4KKyAgICAgKiBUaGUgc2Vzc2lvbiB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgU3RvcmUgYWZ0ZXIgc3dhcHBpbmcKKyAgICAgKiBpbiwgYnV0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBhY3RpdmUgc2Vzc2lvbiBsaXN0IGlmIGl0CisgICAgICogaXMgaW52YWxpZCBvciBwYXN0IGl0cyBleHBpcmF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTZXNzaW9uIHN3YXBJbihTdHJpbmcgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHN0b3JlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKXsKKyAgICAgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gPSAoU2Vzc2lvbikgCisgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRTdG9yZUxvYWQoaWQpKTsKKyAgICAgICAgICAgICAgICB9Y2F0Y2goUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBleCl7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBleC5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFeGNlcHRpb24gaW4gdGhlIFN0b3JlIGR1cmluZyBzd2FwSW46ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbilleGNlcHRpb247CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pZXhjZXB0aW9uOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IHN0b3JlLmxvYWQoaWQpOworICAgICAgICAgICAgfSAgIAorICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInBlcnNpc3RlbnRNYW5hZ2VyLmRlc2VyaWFsaXplRXJyb3IiLCBpZCwgZSkpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInBlcnNpc3RlbnRNYW5hZ2VyLmRlc2VyaWFsaXplRXJyb3IiLCBpZCwgZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgaWYgKCFzZXNzaW9uLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJzZXNzaW9uIHN3YXBwZWQgaW4gaXMgaW52YWxpZCBvciBleHBpcmVkIik7CisgICAgICAgICAgICBzZXNzaW9uLmV4cGlyZSgpOworICAgICAgICAgICAgcmVtb3ZlU2Vzc2lvbihpZCk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJwZXJzaXN0ZW50TWFuYWdlci5zd2FwSW4iLCBpZCkpOworCisgICAgICAgIHNlc3Npb24uc2V0TWFuYWdlcih0aGlzKTsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBsaXN0ZW5lcnMga25vdyBhYm91dCBpdC4KKyAgICAgICAgKChTdGFuZGFyZFNlc3Npb24pc2Vzc2lvbikudGVsbE5ldygpOworICAgICAgICBhZGQoc2Vzc2lvbik7CisgICAgICAgICgoU3RhbmRhcmRTZXNzaW9uKXNlc3Npb24pLmFjdGl2YXRlKCk7CisgICAgICAgIHNlc3Npb24uZW5kQWNjZXNzKCk7CisKKyAgICAgICAgcmV0dXJuIChzZXNzaW9uKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzZXNzaW9uIGZyb20gdGhlIE1hbmFnZXIncyBsaXN0IG9mIGFjdGl2ZQorICAgICAqIHNlc3Npb25zIGFuZCB3cml0ZSBpdCBvdXQgdG8gdGhlIFN0b3JlLiBJZiB0aGUgc2Vzc2lvbgorICAgICAqIGlzIHBhc3QgaXRzIGV4cGlyYXRpb24gb3IgaW52YWxpZCwgdGhpcyBtZXRob2QgZG9lcworICAgICAqIG5vdGhpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiBUaGUgU2Vzc2lvbiB0byB3cml0ZSBvdXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3dhcE91dChTZXNzaW9uIHNlc3Npb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHN0b3JlID09IG51bGwgfHwgIXNlc3Npb24uaXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAoKFN0YW5kYXJkU2Vzc2lvbilzZXNzaW9uKS5wYXNzaXZhdGUoKTsKKyAgICAgICAgd3JpdGVTZXNzaW9uKHNlc3Npb24pOworICAgICAgICBzdXBlci5yZW1vdmUoc2Vzc2lvbik7CisgICAgICAgIHNlc3Npb24ucmVjeWNsZSgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgcHJvdmlkZWQgc2Vzc2lvbiB0byB0aGUgU3RvcmUgd2l0aG91dCBtb2RpZnlpbmcKKyAgICAgKiB0aGUgY29weSBpbiBtZW1vcnkgb3IgdHJpZ2dlcmluZyBwYXNzaXZhdGlvbiBldmVudHMuIERvZXMKKyAgICAgKiBub3RoaW5nIGlmIHRoZSBzZXNzaW9uIGlzIGludmFsaWQgb3IgcGFzdCBpdHMgZXhwaXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNlc3Npb24oU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChzdG9yZSA9PSBudWxsIHx8ICFzZXNzaW9uLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSl7CisgICAgICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZFN0b3JlU2F2ZShzZXNzaW9uKSk7CisgICAgICAgICAgICAgICAgfWNhdGNoKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gZXguZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXhjZXB0aW9uIGluIHRoZSBTdG9yZSBkdXJpbmcgd3JpdGVTZXNzaW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICBzdG9yZS5zYXZlKHNlc3Npb24pOworICAgICAgICAgICAgfSAgIAorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgKCJwZXJzaXN0ZW50TWFuYWdlci5zZXJpYWxpemVFcnJvciIsIHNlc3Npb24uZ2V0SWRJbnRlcm5hbCgpLCBlKSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcyAKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgPGNvZGU+Y29uZmlndXJlKCk8L2NvZGU+LAorICAgICAqIGFuZCBiZWZvcmUgYW55IG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgY29tcG9uZW50IGFyZSB1dGlsaXplZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IHByZXZlbnRzIHRoaXMgY29tcG9uZW50IGZyb20gYmVpbmcgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygic3RhbmRhcmRNYW5hZ2VyLmFscmVhZHlTdGFydGVkIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmKCAhIGluaXRpYWxpemVkICkKKyAgICAgICAgICAgIGluaXQoKTsKKyAgICAgICAgCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKworICAgICAgICAvLyBGb3JjZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3JjZSByYW5kb20gbnVtYmVyIGluaXRpYWxpemF0aW9uIHN0YXJ0aW5nIik7CisgICAgICAgIGdlbmVyYXRlU2Vzc2lvbklkKCk7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm9yY2UgcmFuZG9tIG51bWJlciBpbml0aWFsaXphdGlvbiBjb21wbGV0ZWQiKTsKKworICAgICAgICBpZiAoc3RvcmUgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvZy5lcnJvcigiTm8gU3RvcmUgY29uZmlndXJlZCwgcGVyc2lzdGVuY2UgZGlzYWJsZWQiKTsKKyAgICAgICAgZWxzZSBpZiAoc3RvcmUgaW5zdGFuY2VvZiBMaWZlY3ljbGUpCisgICAgICAgICAgICAoKExpZmVjeWNsZSlzdG9yZSkuc3RhcnQoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSB0ZXJtaW5hdGUgdGhlIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdGhlIGxhc3Qgb25lIGNhbGxlZCBvbiBhIGdpdmVuCisgICAgICogaW5zdGFuY2Ugb2YgdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBuZWVkcyB0byBiZSByZXBvcnRlZAorICAgICAqLworICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RvcHBpbmciKTsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAoIWlzU3RhcnRlZCgpKSB7CisgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoInN0YW5kYXJkTWFuYWdlci5ub3RTdGFydGVkIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUT1BfRVZFTlQsIG51bGwpOworICAgICAgICBzZXRTdGFydGVkKGZhbHNlKTsKKworICAgICAgICBpZiAoZ2V0U3RvcmUoKSAhPSBudWxsICYmIHNhdmVPblJlc3RhcnQpIHsKKyAgICAgICAgICAgIHVubG9hZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRXhwaXJlIGFsbCBhY3RpdmUgc2Vzc2lvbnMKKyAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbnNbXSA9IGZpbmRTZXNzaW9ucygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXNzaW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0YW5kYXJkU2Vzc2lvbiBzZXNzaW9uID0gKFN0YW5kYXJkU2Vzc2lvbikgc2Vzc2lvbnNbaV07CisgICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uLmlzVmFsaWQoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5leHBpcmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRTdG9yZSgpICE9IG51bGwgJiYgZ2V0U3RvcmUoKSBpbnN0YW5jZW9mIExpZmVjeWNsZSkKKyAgICAgICAgICAgICgoTGlmZWN5Y2xlKWdldFN0b3JlKCkpLnN0b3AoKTsKKworICAgICAgICAvLyBSZXF1aXJlIGEgbmV3IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGlmIHdlIGFyZSByZXN0YXJ0ZWQKKyAgICAgICAgdGhpcy5yYW5kb20gPSBudWxsOworCisgICAgICAgIGlmKCBpbml0aWFsaXplZCApCisgICAgICAgICAgICBkZXN0cm95KCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHByb3BlcnR5IGNoYW5nZSBldmVudHMgZnJvbSBvdXIgYXNzb2NpYXRlZCBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHNvdXJjZSBvZiB0aGlzIGV2ZW50CisgICAgICAgIGlmICghKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQ29udGV4dCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gUHJvY2VzcyBhIHJlbGV2YW50IHByb3BlcnR5IGNoYW5nZQorICAgICAgICBpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKCJzZXNzaW9uVGltZW91dCIpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNldE1heEluYWN0aXZlSW50ZXJ2YWwKKyAgICAgICAgICAgICAgICAgICAgKCAoKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmludFZhbHVlKCkqNjAgKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRNYW5hZ2VyLnNlc3Npb25UaW1lb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5ld1ZhbHVlKCkudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTd2FwIGlkbGUgc2Vzc2lvbnMgb3V0IHRvIFN0b3JlIGlmIHRoZXkgYXJlIGlkbGUgdG9vIGxvbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc01heElkbGVTd2FwcygpIHsKKworICAgICAgICBpZiAoIWlzU3RhcnRlZCgpIHx8IG1heElkbGVTd2FwIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTZXNzaW9uIHNlc3Npb25zW10gPSBmaW5kU2Vzc2lvbnMoKTsKKyAgICAgICAgbG9uZyB0aW1lTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgLy8gU3dhcCBvdXQgYWxsIHNlc3Npb25zIGlkbGUgbG9uZ2VyIHRoYW4gbWF4SWRsZVN3YXAKKyAgICAgICAgLy8gRklYTUU6IFdoYXQncyBwcmV2ZW50aW5nIHVzIGZyb20gbWFuZ2xpbmcgYSBzZXNzaW9uIGR1cmluZworICAgICAgICAvLyBhIHJlcXVlc3Q/CisgICAgICAgIGlmIChtYXhJZGxlU3dhcCA+PSAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlc3Npb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RhbmRhcmRTZXNzaW9uIHNlc3Npb24gPSAoU3RhbmRhcmRTZXNzaW9uKSBzZXNzaW9uc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoIXNlc3Npb24uaXNWYWxpZCgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpbnQgdGltZUlkbGUgPSAvLyBUcnVuY2F0ZSwgZG8gbm90IHJvdW5kIHVwCisgICAgICAgICAgICAgICAgICAgIChpbnQpICgodGltZU5vdyAtIHNlc3Npb24uZ2V0TGFzdEFjY2Vzc2VkVGltZSgpKSAvIDEwMDBMKTsKKyAgICAgICAgICAgICAgICBpZiAodGltZUlkbGUgPiBtYXhJZGxlU3dhcCAmJiB0aW1lSWRsZSA+IG1pbklkbGVTd2FwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInBlcnNpc3RlbnRNYW5hZ2VyLnN3YXBNYXhJZGxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJZEludGVybmFsKCksIG5ldyBJbnRlZ2VyKHRpbWVJZGxlKSkpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dhcE91dChzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgOyAgIC8vIFRoaXMgaXMgbG9nZ2VkIGluIHdyaXRlU2Vzc2lvbigpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3dhcCBpZGxlIHNlc3Npb25zIG91dCB0byBTdG9yZSBpZiB0b28gbWFueSBhcmUgYWN0aXZlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc01heEFjdGl2ZVN3YXBzKCkgeworCisgICAgICAgIGlmICghaXNTdGFydGVkKCkgfHwgZ2V0TWF4QWN0aXZlU2Vzc2lvbnMoKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uc1tdID0gZmluZFNlc3Npb25zKCk7CisKKyAgICAgICAgLy8gRklYTUU6IFNtYXJ0ZXIgYWxnb3JpdGhtIChMUlUpCisgICAgICAgIGlmIChnZXRNYXhBY3RpdmVTZXNzaW9ucygpID49IHNlc3Npb25zLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAoInBlcnNpc3RlbnRNYW5hZ2VyLnRvb01hbnlBY3RpdmUiLAorICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihzZXNzaW9ucy5sZW5ndGgpKSk7CisKKyAgICAgICAgaW50IHRvc3dhcCA9IHNlc3Npb25zLmxlbmd0aCAtIGdldE1heEFjdGl2ZVNlc3Npb25zKCk7CisgICAgICAgIGxvbmcgdGltZU5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vzc2lvbnMubGVuZ3RoICYmIHRvc3dhcCA+IDA7IGkrKykgeworICAgICAgICAgICAgaW50IHRpbWVJZGxlID0gLy8gVHJ1bmNhdGUsIGRvIG5vdCByb3VuZCB1cAorICAgICAgICAgICAgICAgIChpbnQpICgodGltZU5vdyAtIHNlc3Npb25zW2ldLmdldExhc3RBY2Nlc3NlZFRpbWUoKSkgLyAxMDAwTCk7CisgICAgICAgICAgICBpZiAodGltZUlkbGUgPiBtaW5JZGxlU3dhcCkgeworICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAoInBlcnNpc3RlbnRNYW5hZ2VyLnN3YXBUb29NYW55QWN0aXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uc1tpXS5nZXRJZEludGVybmFsKCksIG5ldyBJbnRlZ2VyKHRpbWVJZGxlKSkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN3YXBPdXQoc2Vzc2lvbnNbaV0pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgOyAgIC8vIFRoaXMgaXMgbG9nZ2VkIGluIHdyaXRlU2Vzc2lvbigpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRvc3dhcC0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJhY2sgdXAgaWRsZSBzZXNzaW9ucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTWF4SWRsZUJhY2t1cHMoKSB7CisKKyAgICAgICAgaWYgKCFpc1N0YXJ0ZWQoKSB8fCBtYXhJZGxlQmFja3VwIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTZXNzaW9uIHNlc3Npb25zW10gPSBmaW5kU2Vzc2lvbnMoKTsKKyAgICAgICAgbG9uZyB0aW1lTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgLy8gQmFjayB1cCBhbGwgc2Vzc2lvbnMgaWRsZSBsb25nZXIgdGhhbiBtYXhJZGxlQmFja3VwCisgICAgICAgIGlmIChtYXhJZGxlQmFja3VwID49IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vzc2lvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdGFuZGFyZFNlc3Npb24gc2Vzc2lvbiA9IChTdGFuZGFyZFNlc3Npb24pIHNlc3Npb25zW2ldOworICAgICAgICAgICAgICAgIGlmICghc2Vzc2lvbi5pc1ZhbGlkKCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGludCB0aW1lSWRsZSA9IC8vIFRydW5jYXRlLCBkbyBub3Qgcm91bmQgdXAKKyAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0aW1lTm93IC0gc2Vzc2lvbi5nZXRMYXN0QWNjZXNzZWRUaW1lKCkpIC8gMTAwMEwpOworICAgICAgICAgICAgICAgIGlmICh0aW1lSWRsZSA+IG1heElkbGVCYWNrdXApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgicGVyc2lzdGVudE1hbmFnZXIuYmFja3VwTWF4SWRsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJZEludGVybmFsKCksIG5ldyBJbnRlZ2VyKHRpbWVJZGxlKSkpOworCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgICAvLyBUaGlzIGlzIGxvZ2dlZCBpbiB3cml0ZVNlc3Npb24oKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL1N0YW5kYXJkTWFuYWdlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vU3RhbmRhcmRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExZWJlNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL1N0YW5kYXJkTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNzUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbjsKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5DdXN0b21PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VjdXJpdHkuU2VjdXJpdHlVdGlsOworLyoqCisgKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGI+TWFuYWdlcjwvYj4gaW50ZXJmYWNlIHRoYXQgcHJvdmlkZXMKKyAqIHNpbXBsZSBzZXNzaW9uIHBlcnNpc3RlbmNlIGFjcm9zcyByZXN0YXJ0cyBvZiB0aGlzIGNvbXBvbmVudCAoc3VjaCBhcworICogd2hlbiB0aGUgZW50aXJlIHNlcnZlciBpcyBzaHV0IGRvd24gYW5kIHJlc3RhcnRlZCwgb3Igd2hlbiBhIHBhcnRpY3VsYXIKKyAqIHdlYiBhcHBsaWNhdGlvbiBpcyByZWxvYWRlZC4KKyAqIDxwPgorICogPGI+SU1QTEVNRU5UQVRJT04gTk9URTwvYj46ICBDb3JyZWN0IGJlaGF2aW9yIG9mIHNlc3Npb24gc3RvcmluZyBhbmQKKyAqIHJlbG9hZGluZyBkZXBlbmRzIHVwb24gZXh0ZXJuYWwgY2FsbHMgdG8gdGhlIDxjb2RlPnN0YXJ0KCk8L2NvZGU+IGFuZAorICogPGNvZGU+c3RvcCgpPC9jb2RlPiBtZXRob2RzIG9mIHRoaXMgY2xhc3MgYXQgdGhlIGNvcnJlY3QgdGltZXMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIEplYW4tRnJhbmNvaXMgQXJjYW5kCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTdGFuZGFyZE1hbmFnZXIKKyAgICBleHRlbmRzIE1hbmFnZXJCYXNlCisgICAgaW1wbGVtZW50cyBMaWZlY3ljbGUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgeworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZWN1cml0eSBDbGFzc2VzCisgICAgcHJpdmF0ZSBjbGFzcyBQcml2aWxlZ2VkRG9Mb2FkCisgICAgICAgIGltcGxlbWVudHMgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbiB7CisKKyAgICAgICAgUHJpdmlsZWdlZERvTG9hZCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgICAgZG9Mb2FkKCk7CisgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBQcml2aWxlZ2VkRG9VbmxvYWQKKyAgICAgICAgaW1wbGVtZW50cyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIHsKKworICAgICAgICBQcml2aWxlZ2VkRG9VbmxvYWQoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBFeGNlcHRpb257CisgICAgICAgICAgICBkb1VubG9hZCgpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAiU3RhbmRhcmRNYW5hZ2VyLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaWZlY3ljbGUgZXZlbnQgc3VwcG9ydCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIExpZmVjeWNsZVN1cHBvcnQgbGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZVN1cHBvcnQodGhpcyk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgU2Vzc2lvbnMgYWxsb3dlZCwgb3IgLTEgZm9yIG5vIGxpbWl0LgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgbWF4QWN0aXZlU2Vzc2lvbnMgPSAtMTsKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIG5hbWUgb2YgdGhpcyBNYW5hZ2VyIGltcGxlbWVudGF0aW9uIChmb3IgbG9nZ2luZykuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbmFtZSA9ICJTdGFuZGFyZE1hbmFnZXIiOworCisKKyAgICAvKioKKyAgICAgKiBQYXRoIG5hbWUgb2YgdGhlIGRpc2sgZmlsZSBpbiB3aGljaCBhY3RpdmUgc2Vzc2lvbnMgYXJlIHNhdmVkCisgICAgICogd2hlbiB3ZSBzdG9wLCBhbmQgZnJvbSB3aGljaCB0aGVzZSBzZXNzaW9ucyBhcmUgbG9hZGVkIHdoZW4gd2Ugc3RhcnQuCisgICAgICogQSA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBubyBwZXJzaXN0ZW5jZSBpcyBkZXNpcmVkLgorICAgICAqIElmIHRoaXMgcGF0aG5hbWUgaXMgcmVsYXRpdmUsIGl0IHdpbGwgYmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGUKKyAgICAgKiB0ZW1wb3Jhcnkgd29ya2luZyBkaXJlY3RvcnkgcHJvdmlkZWQgYnkgb3VyIGNvbnRleHQsIGF2YWlsYWJsZSB2aWEKKyAgICAgKiB0aGUgPGNvZGU+amF2YXguc2VydmxldC5jb250ZXh0LnRlbXBkaXI8L2NvZGU+IGNvbnRleHQgYXR0cmlidXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aG5hbWUgPSAiU0VTU0lPTlMuc2VyIjsKKworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZCB5ZXQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2Ygc2Vzc2lvbiBjcmVhdGlvbnMgdGhhdCBmYWlsZWQgZHVlIHRvIG1heEFjdGl2ZVNlc3Npb25zLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgcmVqZWN0ZWRTZXNzaW9ucyA9IDA7CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NpbmcgdGltZSBkdXJpbmcgc2Vzc2lvbiBleHBpcmF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIHByb2Nlc3NpbmdUaW1lID0gMDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBNYW5hZ2VyIGhhcyBiZWVuIGFzc29jaWF0ZWQuICBJZgorICAgICAqIGl0IGlzIGEgQ29udGV4dCAodGhlIHVzdWFsIGNhc2UpLCBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlIHNlc3Npb24KKyAgICAgKiB0aW1lb3V0IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgYXNzb2NpYXRlZCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGNvbnRhaW5lcikgeworCisgICAgICAgIC8vIERlLXJlZ2lzdGVyIGZyb20gdGhlIG9sZCBDb250YWluZXIgKGlmIGFueSkKKyAgICAgICAgaWYgKCh0aGlzLmNvbnRhaW5lciAhPSBudWxsKSAmJiAodGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSkKKyAgICAgICAgICAgICgoQ29udGV4dCkgdGhpcy5jb250YWluZXIpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgLy8gRGVmYXVsdCBwcm9jZXNzaW5nIHByb3ZpZGVkIGJ5IG91ciBzdXBlcmNsYXNzCisgICAgICAgIHN1cGVyLnNldENvbnRhaW5lcihjb250YWluZXIpOworCisgICAgICAgIC8vIFJlZ2lzdGVyIHdpdGggdGhlIG5ldyBDb250YWluZXIgKGlmIGFueSkKKyAgICAgICAgaWYgKCh0aGlzLmNvbnRhaW5lciAhPSBudWxsKSAmJiAodGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSkgeworICAgICAgICAgICAgc2V0TWF4SW5hY3RpdmVJbnRlcnZhbAorICAgICAgICAgICAgICAgICggKChDb250ZXh0KSB0aGlzLmNvbnRhaW5lcikuZ2V0U2Vzc2lvblRpbWVvdXQoKSo2MCApOworICAgICAgICAgICAgKChDb250ZXh0KSB0aGlzLmNvbnRhaW5lcikuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBNYW5hZ2VyIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBTZXNzaW9ucyBhbGxvd2VkLCBvciAtMSBmb3IKKyAgICAgKiBubyBsaW1pdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1heEFjdGl2ZVNlc3Npb25zKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5tYXhBY3RpdmVTZXNzaW9ucyk7CisKKyAgICB9CisKKworICAgIC8qKiBOdW1iZXIgb2Ygc2Vzc2lvbiBjcmVhdGlvbnMgdGhhdCBmYWlsZWQgZHVlIHRvIG1heEFjdGl2ZVNlc3Npb25zCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjb3VudAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVqZWN0ZWRTZXNzaW9ucygpIHsKKyAgICAgICAgcmV0dXJuIHJlamVjdGVkU2Vzc2lvbnM7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWplY3RlZFNlc3Npb25zKGludCByZWplY3RlZFNlc3Npb25zKSB7CisgICAgICAgIHRoaXMucmVqZWN0ZWRTZXNzaW9ucyA9IHJlamVjdGVkU2Vzc2lvbnM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZXMgU2Vzc2lvbnMgYWxsb3dlZCwgb3IgLTEgZm9yCisgICAgICogbm8gbGltaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWF4IFRoZSBuZXcgbWF4aW11bSBudW1iZXIgb2Ygc2Vzc2lvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhBY3RpdmVTZXNzaW9ucyhpbnQgbWF4KSB7CisKKyAgICAgICAgaW50IG9sZE1heEFjdGl2ZVNlc3Npb25zID0gdGhpcy5tYXhBY3RpdmVTZXNzaW9uczsKKyAgICAgICAgdGhpcy5tYXhBY3RpdmVTZXNzaW9ucyA9IG1heDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm1heEFjdGl2ZVNlc3Npb25zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIob2xkTWF4QWN0aXZlU2Vzc2lvbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcih0aGlzLm1heEFjdGl2ZVNlc3Npb25zKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVzY3JpcHRpdmUgc2hvcnQgbmFtZSBvZiB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2Vzc2lvbiBwZXJzaXN0ZW5jZSBwYXRobmFtZSwgaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhdGhuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZXNzaW9uIHBlcnNpc3RlbmNlIHBhdGhuYW1lIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuICBJZiBubworICAgICAqIHBlcnNpc3RlbmNlIHN1cHBvcnQgaXMgZGVzaXJlZCwgc2V0IHRoZSBwYXRobmFtZSB0byA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRobmFtZSBOZXcgc2Vzc2lvbiBwZXJzaXN0ZW5jZSBwYXRobmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdGhuYW1lKFN0cmluZyBwYXRobmFtZSkgeworCisgICAgICAgIFN0cmluZyBvbGRQYXRobmFtZSA9IHRoaXMucGF0aG5hbWU7CisgICAgICAgIHRoaXMucGF0aG5hbWUgPSBwYXRobmFtZTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInBhdGhuYW1lIiwgb2xkUGF0aG5hbWUsIHRoaXMucGF0aG5hbWUpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbmQgcmV0dXJuIGEgbmV3IHNlc3Npb24gb2JqZWN0LCBiYXNlZCBvbiB0aGUgZGVmYXVsdAorICAgICAqIHNldHRpbmdzIHNwZWNpZmllZCBieSB0aGlzIE1hbmFnZXIncyBwcm9wZXJ0aWVzLiAgVGhlIHNlc3Npb24KKyAgICAgKiBpZCB3aWxsIGJlIGFzc2lnbmVkIGJ5IHRoaXMgbWV0aG9kLCBhbmQgYXZhaWxhYmxlIHZpYSB0aGUgZ2V0SWQoKQorICAgICAqIG1ldGhvZCBvZiB0aGUgcmV0dXJuZWQgc2Vzc2lvbi4gIElmIGEgbmV3IHNlc3Npb24gY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKiBmb3IgYW55IHJlYXNvbiwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBuZXcgc2Vzc2lvbiBjYW5ub3QgYmUKKyAgICAgKiAgaW5zdGFudGlhdGVkIGZvciBhbnkgcmVhc29uCisgICAgICovCisgICAgcHVibGljIFNlc3Npb24gY3JlYXRlU2Vzc2lvbihTdHJpbmcgc2Vzc2lvbklkKSB7CisKKyAgICAgICAgaWYgKChtYXhBY3RpdmVTZXNzaW9ucyA+PSAwKSAmJgorICAgICAgICAgICAgKHNlc3Npb25zLnNpemUoKSA+PSBtYXhBY3RpdmVTZXNzaW9ucykpIHsKKyAgICAgICAgICAgIHJlamVjdGVkU2Vzc2lvbnMrKzsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZE1hbmFnZXIuY3JlYXRlU2Vzc2lvbi5pc2UiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHN1cGVyLmNyZWF0ZVNlc3Npb24oc2Vzc2lvbklkKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExvYWQgYW55IGN1cnJlbnRseSBhY3RpdmUgc2Vzc2lvbnMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgdW5sb2FkZWQKKyAgICAgKiB0byB0aGUgYXBwcm9wcmlhdGUgcGVyc2lzdGVuY2UgbWVjaGFuaXNtLCBpZiBhbnkuICBJZiBwZXJzaXN0ZW5jZSBpcyBub3QKKyAgICAgKiBzdXBwb3J0ZWQsIHRoaXMgbWV0aG9kIHJldHVybnMgd2l0aG91dCBkb2luZyBhbnl0aGluZy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhIHNlcmlhbGl6ZWQgY2xhc3MgY2Fubm90IGJlCisgICAgICogIGZvdW5kIGR1cmluZyB0aGUgcmVsb2FkCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZCgpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSl7CisgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoIG5ldyBQcml2aWxlZ2VkRG9Mb2FkKCkgKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBleC5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbil7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChDbGFzc05vdEZvdW5kRXhjZXB0aW9uKWV4Y2VwdGlvbjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKWV4Y2VwdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVucmVwb3J0ZWQgZXhjZXB0aW9uIGluIGxvYWQoKSAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGV4Y2VwdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb0xvYWQoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogTG9hZCBhbnkgY3VycmVudGx5IGFjdGl2ZSBzZXNzaW9ucyB0aGF0IHdlcmUgcHJldmlvdXNseSB1bmxvYWRlZAorICAgICAqIHRvIHRoZSBhcHByb3ByaWF0ZSBwZXJzaXN0ZW5jZSBtZWNoYW5pc20sIGlmIGFueS4gIElmIHBlcnNpc3RlbmNlIGlzIG5vdAorICAgICAqIHN1cHBvcnRlZCwgdGhpcyBtZXRob2QgcmV0dXJucyB3aXRob3V0IGRvaW5nIGFueXRoaW5nLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIGEgc2VyaWFsaXplZCBjbGFzcyBjYW5ub3QgYmUKKyAgICAgKiAgZm91bmQgZHVyaW5nIHRoZSByZWxvYWQKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0xvYWQoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlN0YXJ0OiBMb2FkaW5nIHBlcnNpc3RlZCBzZXNzaW9ucyIpOworCisgICAgICAgIC8vIEluaXRpYWxpemUgb3VyIGludGVybmFsIGRhdGEgc3RydWN0dXJlcworICAgICAgICBzZXNzaW9ucy5jbGVhcigpOworCisgICAgICAgIC8vIE9wZW4gYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQgcGF0aG5hbWUsIGlmIGFueQorICAgICAgICBGaWxlIGZpbGUgPSBmaWxlKCk7CisgICAgICAgIGlmIChmaWxlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoInN0YW5kYXJkTWFuYWdlci5sb2FkaW5nIiwgcGF0aG5hbWUpKTsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG51bGw7CisgICAgICAgIExvYWRlciBsb2FkZXIgPSBudWxsOworICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmaXMpOworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGxvYWRlciA9IGNvbnRhaW5lci5nZXRMb2FkZXIoKTsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciA9IGxvYWRlci5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgY3VzdG9tIG9iamVjdCBpbnB1dCBzdHJlYW0gZm9yIGNsYXNzIGxvYWRlciAiKTsKKyAgICAgICAgICAgICAgICBvaXMgPSBuZXcgQ3VzdG9tT2JqZWN0SW5wdXRTdHJlYW0oYmlzLCBjbGFzc0xvYWRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBzdGFuZGFyZCBvYmplY3QgaW5wdXQgc3RyZWFtIik7CisgICAgICAgICAgICAgICAgb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBwZXJzaXN0ZWQgZGF0YSBmaWxlIGZvdW5kIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkTWFuYWdlci5sb2FkaW5nLmlvZSIsIGUpLCBlKTsKKyAgICAgICAgICAgIGlmIChvaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGYpIHsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvaXMgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvYWQgdGhlIHByZXZpb3VzbHkgdW5sb2FkZWQgYWN0aXZlIHNlc3Npb25zCisgICAgICAgIHN5bmNocm9uaXplZCAoc2Vzc2lvbnMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBvaXMucmVhZE9iamVjdCgpOworICAgICAgICAgICAgICAgIGludCBuID0gY291bnQuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTG9hZGluZyAiICsgbiArICIgcGVyc2lzdGVkIHNlc3Npb25zIik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRTZXNzaW9uIHNlc3Npb24gPSBnZXROZXdTZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24ucmVhZE9iamVjdERhdGEob2lzKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRNYW5hZ2VyKHRoaXMpOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9ucy5wdXQoc2Vzc2lvbi5nZXRJZEludGVybmFsKCksIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmFjdGl2YXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZW5kQWNjZXNzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkTWFuYWdlci5sb2FkaW5nLmNuZmUiLCBlKSwgZSk7CisgICAgICAgICAgICAgICAgaWYgKG9pcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZikgeworICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9pcyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkTWFuYWdlci5sb2FkaW5nLmlvZSIsIGUpLCBlKTsKKyAgICAgICAgICAgICAgICBpZiAob2lzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb2lzID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGlucHV0IHN0cmVhbQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvaXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGYpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlZAorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgcGVyc2lzdGVudCBzdG9yYWdlIGZpbGUKKyAgICAgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkgKQorICAgICAgICAgICAgICAgICAgICBmaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJGaW5pc2g6IExvYWRpbmcgcGVyc2lzdGVkIHNlc3Npb25zIik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTYXZlIGFueSBjdXJyZW50bHkgYWN0aXZlIHNlc3Npb25zIGluIHRoZSBhcHByb3ByaWF0ZSBwZXJzaXN0ZW5jZQorICAgICAqIG1lY2hhbmlzbSwgaWYgYW55LiAgSWYgcGVyc2lzdGVuY2UgaXMgbm90IHN1cHBvcnRlZCwgdGhpcyBtZXRob2QKKyAgICAgKiByZXR1cm5zIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpeworICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKCBuZXcgUHJpdmlsZWdlZERvVW5sb2FkKCkgKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBleC5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgSU9FeGNlcHRpb24peworICAgICAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pZXhjZXB0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5yZXBvcnRlZCBleGNlcHRpb24gaW4gdW5Mb2FkKCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBleGNlcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9VbmxvYWQoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2F2ZSBhbnkgY3VycmVudGx5IGFjdGl2ZSBzZXNzaW9ucyBpbiB0aGUgYXBwcm9wcmlhdGUgcGVyc2lzdGVuY2UKKyAgICAgKiBtZWNoYW5pc20sIGlmIGFueS4gIElmIHBlcnNpc3RlbmNlIGlzIG5vdCBzdXBwb3J0ZWQsIHRoaXMgbWV0aG9kCisgICAgICogcmV0dXJucyB3aXRob3V0IGRvaW5nIGFueXRoaW5nLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9VbmxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5sb2FkaW5nIHBlcnNpc3RlZCBzZXNzaW9ucyIpOworCisgICAgICAgIC8vIE9wZW4gYW4gb3V0cHV0IHN0cmVhbSB0byB0aGUgc3BlY2lmaWVkIHBhdGhuYW1lLCBpZiBhbnkKKyAgICAgICAgRmlsZSBmaWxlID0gZmlsZSgpOworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZE1hbmFnZXIudW5sb2FkaW5nIiwgcGF0aG5hbWUpKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOworICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZm9zKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkTWFuYWdlci51bmxvYWRpbmcuaW9lIiwgZSksIGUpOworICAgICAgICAgICAgaWYgKG9vcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZikgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9vcyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgLy8gV3JpdGUgdGhlIG51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMsIGZvbGxvd2VkIGJ5IHRoZSBkZXRhaWxzCisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNlc3Npb25zKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmxvYWRpbmcgIiArIHNlc3Npb25zLnNpemUoKSArICIgc2Vzc2lvbnMiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb29zLndyaXRlT2JqZWN0KG5ldyBJbnRlZ2VyKHNlc3Npb25zLnNpemUoKSkpOworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGVsZW1lbnRzID0gc2Vzc2lvbnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZWxlbWVudHMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkU2Vzc2lvbiBzZXNzaW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChTdGFuZGFyZFNlc3Npb24pIGVsZW1lbnRzLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICgoU3RhbmRhcmRTZXNzaW9uKSBzZXNzaW9uKS5wYXNzaXZhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi53cml0ZU9iamVjdERhdGEob29zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRNYW5hZ2VyLnVubG9hZGluZy5pb2UiLCBlKSwgZSk7CisgICAgICAgICAgICAgICAgaWYgKG9vcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZikgeworICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9vcyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGbHVzaCBhbmQgY2xvc2UgdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9vcy5mbHVzaCgpOworICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgICAgICBvb3MgPSBudWxsOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAob29zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb29zID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBFeHBpcmUgYWxsIHRoZSBzZXNzaW9ucyB3ZSBqdXN0IHdyb3RlCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhwaXJpbmcgIiArIGxpc3Quc2l6ZSgpICsgIiBwZXJzaXN0ZWQgc2Vzc2lvbnMiKTsKKyAgICAgICAgSXRlcmF0b3IgZXhwaXJlcyA9IGxpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGV4cGlyZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdGFuZGFyZFNlc3Npb24gc2Vzc2lvbiA9IChTdGFuZGFyZFNlc3Npb24pIGV4cGlyZXMubmV4dCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmV4cGlyZShmYWxzZSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZWN5Y2xlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlVubG9hZGluZyBjb21wbGV0ZSIpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlmZWN5Y2xlIGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaWZlY3ljbGUuIElmIHRoaXMKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIDxjb2RlPmNvbmZpZ3VyZSgpPC9jb2RlPiwKKyAgICAgKiBhbmQgYmVmb3JlIGFueSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhlIGNvbXBvbmVudCBhcmUgdXRpbGl6ZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyB0aGlzIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIGlmKCAhIGluaXRpYWxpemVkICkKKyAgICAgICAgICAgIGluaXQoKTsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAoc3RhcnRlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKworICAgICAgICAvLyBGb3JjZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3JjZSByYW5kb20gbnVtYmVyIGluaXRpYWxpemF0aW9uIHN0YXJ0aW5nIik7CisgICAgICAgIGdlbmVyYXRlU2Vzc2lvbklkKCk7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm9yY2UgcmFuZG9tIG51bWJlciBpbml0aWFsaXphdGlvbiBjb21wbGV0ZWQiKTsKKworICAgICAgICAvLyBMb2FkIHVubG9hZGVkIHNlc3Npb25zLCBpZiBhbnkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvYWQoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkTWFuYWdlci5tYW5hZ2VyTG9hZCIpLCB0KTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHRlcm1pbmF0ZSB0aGUgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB0aGUgbGFzdCBvbmUgY2FsbGVkIG9uIGEgZ2l2ZW4KKyAgICAgKiBpbnN0YW5jZSBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RvcHBpbmciKTsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAoIXN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRNYW5hZ2VyLm5vdFN0YXJ0ZWQiKSk7CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RPUF9FVkVOVCwgbnVsbCk7CisgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTsKKworICAgICAgICAvLyBXcml0ZSBvdXQgc2Vzc2lvbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVubG9hZCgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRNYW5hZ2VyLm1hbmFnZXJVbmxvYWQiKSwgdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBFeHBpcmUgYWxsIGFjdGl2ZSBzZXNzaW9ucworICAgICAgICBTZXNzaW9uIHNlc3Npb25zW10gPSBmaW5kU2Vzc2lvbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXNzaW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gc2Vzc2lvbnNbaV07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmV4cGlyZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAvLyBNZWFzdXJlIGFnYWluc3QgbWVtb3J5IGxlYWtpbmcgaWYgcmVmZXJlbmNlcyB0byB0aGUgc2Vzc2lvbgorICAgICAgICAgICAgICAgIC8vIG9iamVjdCBhcmUga2VwdCBpbiBhIHNoYXJlZCBmaWVsZCBzb21ld2hlcmUKKyAgICAgICAgICAgICAgICBzZXNzaW9uLnJlY3ljbGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcXVpcmUgYSBuZXcgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaWYgd2UgYXJlIHJlc3RhcnRlZAorICAgICAgICB0aGlzLnJhbmRvbSA9IG51bGw7CisKKyAgICAgICAgaWYoIGluaXRpYWxpemVkICkgeworICAgICAgICAgICAgZGVzdHJveSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGZyb20gb3VyIGFzc29jaWF0ZWQgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgcHJvcGVydHkgY2hhbmdlIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBzb3VyY2Ugb2YgdGhpcyBldmVudAorICAgICAgICBpZiAoIShldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFByb2Nlc3MgYSByZWxldmFudCBwcm9wZXJ0eSBjaGFuZ2UKKyAgICAgICAgaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscygic2Vzc2lvblRpbWVvdXQiKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXRNYXhJbmFjdGl2ZUludGVydmFsCisgICAgICAgICAgICAgICAgICAgICggKChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpKS5pbnRWYWx1ZSgpKjYwICk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkTWFuYWdlci5zZXNzaW9uVGltZW91dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROZXdWYWx1ZSgpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwYXRobmFtZSB0byBvdXIKKyAgICAgKiBwZXJzaXN0ZW5jZSBmaWxlLCBpZiBhbnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgZmlsZSgpIHsKKworICAgICAgICBpZiAoKHBhdGhuYW1lID09IG51bGwpIHx8IChwYXRobmFtZS5sZW5ndGgoKSA9PSAwKSkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGhuYW1lKTsKKyAgICAgICAgaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9CisgICAgICAgICAgICAgICAgICAgICgoQ29udGV4dCkgY29udGFpbmVyKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgICAgICAgICAgICAgIEZpbGUgdGVtcGRpciA9IChGaWxlKQorICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5XT1JLX0RJUl9BVFRSKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcGRpciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUodGVtcGRpciwgcGF0aG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisvLyAgICAgICAgaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkKKy8vICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgcmV0dXJuIChmaWxlKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL1N0YW5kYXJkU2Vzc2lvbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vU3RhbmRhcmRTZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYyZjBkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL1N0YW5kYXJkU2Vzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMTcyMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb247CisKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0OworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Ob3RTZXJpYWxpemFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkJpbmRpbmdFdmVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25FdmVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25MaXN0ZW5lcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlc3Npb25FdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlc3Npb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuRW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VjdXJpdHkuU2VjdXJpdHlVdGlsOworCisvKioKKyAqIFN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Yj5TZXNzaW9uPC9iPiBpbnRlcmZhY2UuICBUaGlzIG9iamVjdCBpcworICogc2VyaWFsaXphYmxlLCBzbyB0aGF0IGl0IGNhbiBiZSBzdG9yZWQgaW4gcGVyc2lzdGVudCBzdG9yYWdlIG9yIHRyYW5zZmVycmVkCisgKiB0byBhIGRpZmZlcmVudCBKVk0gZm9yIGRpc3RyaWJ1dGFibGUgc2Vzc2lvbiBzdXBwb3J0LgorICogPHA+CisgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFPC9iPjogIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBib3RoIHRoZQorICogaW50ZXJuYWwgKFNlc3Npb24pIGFuZCBhcHBsaWNhdGlvbiBsZXZlbCAoSHR0cFNlc3Npb24pIHZpZXcgb2YgdGhlIHNlc3Npb24uCisgKiBIb3dldmVyLCBiZWNhdXNlIHRoZSBjbGFzcyBpdHNlbGYgaXMgbm90IGRlY2xhcmVkIHB1YmxpYywgSmF2YSBsb2dpYyBvdXRzaWRlCisgKiBvZiB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uPC9jb2RlPiBwYWNrYWdlIGNhbm5vdCBjYXN0IGFuCisgKiBIdHRwU2Vzc2lvbiB2aWV3IG9mIHRoaXMgaW5zdGFuY2UgYmFjayB0byBhIFNlc3Npb24gdmlldy4KKyAqIDxwPgorICogPGI+SU1QTEVNRU5UQVRJT04gTk9URTwvYj46ICBJZiB5b3UgYWRkIGZpZWxkcyB0byB0aGlzIGNsYXNzLCB5b3UgbXVzdAorICogbWFrZSBzdXJlIHRoYXQgeW91IGNhcnJ5IHRoZW0gb3ZlciBpbiB0aGUgcmVhZC93cml0ZU9iamVjdCBtZXRob2RzIHNvCisgKiB0aGF0IHRoaXMgY2xhc3MgaXMgcHJvcGVybHkgc2VyaWFsaXplZC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgU2VhbiBMZWdhc3NpY2sKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpvbkBsYXRjaGtleS5jb20iPkpvbiBTLiBTdGV2ZW5zPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRTZXNzaW9uCisgICAgaW1wbGVtZW50cyBIdHRwU2Vzc2lvbiwgU2Vzc2lvbiwgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBTZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIE1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgbWFuYWdlciB3aXRoIHdoaWNoIHRoaXMgU2Vzc2lvbiBpcyBhc3NvY2lhdGVkCisgICAgICovCisgICAgcHVibGljIFN0YW5kYXJkU2Vzc2lvbihNYW5hZ2VyIG1hbmFnZXIpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVHlwZSBhcnJheS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9BUlJBWVtdID0gbmV3IFN0cmluZ1swXTsKKworCisgICAgLyoqCisgICAgICogVGhlIGR1bW15IGF0dHJpYnV0ZSB2YWx1ZSBzZXJpYWxpemVkIHdoZW4gYSBOb3RTZXJpYWxpemFibGVFeGNlcHRpb24gaXMKKyAgICAgKiBlbmNvdW50ZXJlZCBpbiA8Y29kZT53cml0ZU9iamVjdCgpPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfU0VSSUFMSVpFRCA9CisgICAgICAgICJfX19OT1RfU0VSSUFMSVpBQkxFX0VYQ0VQVElPTl9fXyI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb2xsZWN0aW9uIG9mIHVzZXIgZGF0YSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNlc3Npb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXV0aGVudGljYXRpb24gdHlwZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSBvdXIgY2FjaGVkIFByaW5jaXBhbCwKKyAgICAgKiBpZiBhbnkuICBOT1RFOiAgVGhpcyB2YWx1ZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHNlcmlhbGl6ZWQKKyAgICAgKiB2ZXJzaW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgU3RyaW5nIGF1dGhUeXBlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPmphdmEubGFuZy5NZXRob2Q8L2NvZGU+IGZvciB0aGUKKyAgICAgKiA8Y29kZT5maXJlQ29udGFpbmVyRXZlbnQoKTwvY29kZT4gbWV0aG9kIG9mIHRoZQorICAgICAqIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ8L2NvZGU+IG1ldGhvZCwKKyAgICAgKiBpZiBvdXIgQ29udGV4dCBpbXBsZW1lbnRhdGlvbiBpcyBvZiB0aGlzIGNsYXNzLiAgVGhpcyB2YWx1ZSBpcworICAgICAqIGNvbXB1dGVkIGR5bmFtaWNhbGx5IHRoZSBmaXJzdCB0aW1lIGl0IGlzIG5lZWRlZCwgb3IgYWZ0ZXIKKyAgICAgKiBhIHNlc3Npb24gcmVsb2FkIChzaW5jZSBpdCBpcyBkZWNsYXJlZCB0cmFuc2llbnQpLgorICAgICAqLworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgTWV0aG9kIGNvbnRhaW5lckV2ZW50TWV0aG9kID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIG1ldGhvZCBzaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5maXJlQ29udGFpbmVyRXZlbnQ8L2NvZGU+IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIGNvbnRhaW5lckV2ZW50VHlwZXNbXSA9CisgICAgeyBTdHJpbmcuY2xhc3MsIE9iamVjdC5jbGFzcyB9OworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGltZSB0aGlzIHNlc3Npb24gd2FzIGNyZWF0ZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCwKKyAgICAgKiBKYW51YXJ5IDEsIDE5NzAgR01ULgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGNyZWF0aW9uVGltZSA9IDBMOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgb2YgYXR0cmlidXRlIG5hbWVzIHdoaWNoIGFyZSBub3QgYWxsb3dlZCB0byBiZSBwZXJzaXN0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gZXhjbHVkZWRBdHRyaWJ1dGVzID0geworICAgICAgICBHbG9iYWxzLlNVQkpFQ1RfQVRUUgorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZyBhIHNlc3Npb24gZXhwaXJhdGlvbiwgc28gYnlwYXNzCisgICAgICogY2VydGFpbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gdGVzdHMuICBOT1RFOiAgVGhpcyB2YWx1ZSBpcyBub3QKKyAgICAgKiBpbmNsdWRlZCBpbiB0aGUgc2VyaWFsaXplZCB2ZXJzaW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgYm9vbGVhbiBleHBpcmluZyA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmFjYWRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlc3Npb24uICBOT1RFOiAgVGhpcyB2YWx1ZSBpcyBub3QKKyAgICAgKiBpbmNsdWRlZCBpbiB0aGUgc2VyaWFsaXplZCB2ZXJzaW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgU3RhbmRhcmRTZXNzaW9uRmFjYWRlIGZhY2FkZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXNzaW9uIGlkZW50aWZpZXIgb2YgdGhpcyBTZXNzaW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoaXMgU2Vzc2lvbiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIlN0YW5kYXJkU2Vzc2lvbi8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFzdCBhY2Nlc3NlZCB0aW1lIGZvciB0aGlzIFNlc3Npb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgbGFzdEFjY2Vzc2VkVGltZSA9IGNyZWF0aW9uVGltZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlc3Npb24gZXZlbnQgbGlzdGVuZXJzIGZvciB0aGlzIFNlc3Npb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBBcnJheUxpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTWFuYWdlciB3aXRoIHdoaWNoIHRoaXMgU2Vzc2lvbiBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgTWFuYWdlciBtYW5hZ2VyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gdGltZSBpbnRlcnZhbCwgaW4gc2Vjb25kcywgYmV0d2VlbiBjbGllbnQgcmVxdWVzdHMgYmVmb3JlCisgICAgICogdGhlIHNlcnZsZXQgY29udGFpbmVyIG1heSBpbnZhbGlkYXRlIHRoaXMgc2Vzc2lvbi4gIEEgbmVnYXRpdmUgdGltZQorICAgICAqIGluZGljYXRlcyB0aGF0IHRoZSBzZXNzaW9uIHNob3VsZCBuZXZlciB0aW1lIG91dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG1heEluYWN0aXZlSW50ZXJ2YWwgPSAtMTsKKworCisgICAgLyoqCisgICAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBzZXNzaW9uIGlzIG5ldyBvciBub3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXcgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBzZXNzaW9uIGlzIHZhbGlkIG9yIG5vdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXNzaW9uIGJ5IENhdGFsaW5hIGNvbXBvbmVudHMKKyAgICAgKiBhbmQgZXZlbnQgbGlzdGVuZXJzLiAgPGI+SU1QTEVNRU5UQVRJT04gTk9URTo8L2I+IFRoaXMgb2JqZWN0IGlzCisgICAgICogPGVtPm5vdDwvZW0+IHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3Mgc2Vzc2lvbiBzZXJpYWxpemF0aW9ucyEKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IE1hcCBub3RlcyA9IG5ldyBIYXNodGFibGUoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlc3Npb24sIGlmIGFueS4KKyAgICAgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFOjwvYj4gIFRoaXMgb2JqZWN0IGlzIDxpPm5vdDwvaT4gc2F2ZWQgYW5kCisgICAgICogcmVzdG9yZWQgYWNyb3NzIHNlc3Npb24gc2VyaWFsaXphdGlvbnMhCisgICAgICovCisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBQcmluY2lwYWwgcHJpbmNpcGFsID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogVGhlIEhUVFAgc2Vzc2lvbiBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBIdHRwU2Vzc2lvbkNvbnRleHQgc2Vzc2lvbkNvbnRleHQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LiAgTk9URTogIFRoaXMgdmFsdWUKKyAgICAgKiBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBzdXBwb3J0ID0KKyAgICAgICAgbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgYWNjZXNzZWQgdGltZSBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIHRoaXNBY2Nlc3NlZFRpbWUgPSBjcmVhdGlvblRpbWU7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhY2Nlc3MgY291bnQgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IGludCBhY2Nlc3NDb3VudCA9IDA7CisKKyAgICBwcml2YXRlIE9iamVjdCBsb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2Vzc2lvbiBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXV0aGVudGljYXRpb24gdHlwZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSBvdXIgY2FjaGVkCisgICAgICogUHJpbmNpcGFsLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRoVHlwZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuYXV0aFR5cGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgdXNlZCB0byBhdXRoZW50aWNhdGUgb3VyIGNhY2hlZAorICAgICAqIFByaW5jaXBhbCwgaWYgYW55LgorICAgICAqCisgICAgICogQHBhcmFtIGF1dGhUeXBlIFRoZSBuZXcgY2FjaGVkIGF1dGhlbnRpY2F0aW9uIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRoVHlwZShTdHJpbmcgYXV0aFR5cGUpIHsKKworICAgICAgICBTdHJpbmcgb2xkQXV0aFR5cGUgPSB0aGlzLmF1dGhUeXBlOworICAgICAgICB0aGlzLmF1dGhUeXBlID0gYXV0aFR5cGU7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJhdXRoVHlwZSIsIG9sZEF1dGhUeXBlLCB0aGlzLmF1dGhUeXBlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjcmVhdGlvbiB0aW1lIGZvciB0aGlzIHNlc3Npb24uICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlCisgICAgICogTWFuYWdlciB3aGVuIGFuIGV4aXN0aW5nIFNlc3Npb24gaW5zdGFuY2UgaXMgcmV1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWUgVGhlIG5ldyBjcmVhdGlvbiB0aW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q3JlYXRpb25UaW1lKGxvbmcgdGltZSkgeworCisgICAgICAgIHRoaXMuY3JlYXRpb25UaW1lID0gdGltZTsKKyAgICAgICAgdGhpcy5sYXN0QWNjZXNzZWRUaW1lID0gdGltZTsKKyAgICAgICAgdGhpcy50aGlzQWNjZXNzZWRUaW1lID0gdGltZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXNzaW9uIGlkZW50aWZpZXIgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5pZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyIGZvciB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJZEludGVybmFsKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5pZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyIGZvciB0aGlzIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgVGhlIG5ldyBzZXNzaW9uIGlkZW50aWZpZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKworICAgICAgICBpZiAoKHRoaXMuaWQgIT0gbnVsbCkgJiYgKG1hbmFnZXIgIT0gbnVsbCkpCisgICAgICAgICAgICBtYW5hZ2VyLnJlbW92ZSh0aGlzKTsKKworICAgICAgICB0aGlzLmlkID0gaWQ7CisKKyAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIG1hbmFnZXIuYWRkKHRoaXMpOworICAgICAgICB0ZWxsTmV3KCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbmZvcm0gdGhlIGxpc3RlbmVycyBhYm91dCB0aGUgbmV3IHNlc3Npb24uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZWxsTmV3KCkgeworCisgICAgICAgIC8vIE5vdGlmeSBpbnRlcmVzdGVkIHNlc3Npb24gZXZlbnQgbGlzdGVuZXJzCisgICAgICAgIGZpcmVTZXNzaW9uRXZlbnQoU2Vzc2lvbi5TRVNTSU9OX0NSRUFURURfRVZFTlQsIG51bGwpOworCisgICAgICAgIC8vIE5vdGlmeSBpbnRlcmVzdGVkIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVycworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgbWFuYWdlci5nZXRDb250YWluZXIoKTsKKyAgICAgICAgT2JqZWN0IGxpc3RlbmVyc1tdID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbkxpZmVjeWNsZUxpc3RlbmVycygpOworICAgICAgICBpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEh0dHBTZXNzaW9uRXZlbnQgZXZlbnQgPQorICAgICAgICAgICAgICAgIG5ldyBIdHRwU2Vzc2lvbkV2ZW50KGdldFNlc3Npb24oKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghKGxpc3RlbmVyc1tpXSBpbnN0YW5jZW9mIEh0dHBTZXNzaW9uTGlzdGVuZXIpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBIdHRwU2Vzc2lvbkxpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXNzaW9uTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTZXNzaW9uQ3JlYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnNlc3Npb25DcmVhdGVkKGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXJTZXNzaW9uQ3JlYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclNlc3Npb25DcmVhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5lcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLnNlc3Npb25FdmVudCIpLCB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgU2Vzc2lvbiBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsYXN0IHRpbWUgdGhlIGNsaWVudCBzZW50IGEgcmVxdWVzdCBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIHNlc3Npb24sIGFzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0LCBKYW51YXJ5IDEsIDE5NzAKKyAgICAgKiBHTVQuICBBY3Rpb25zIHRoYXQgeW91ciBhcHBsaWNhdGlvbiB0YWtlcywgc3VjaCBhcyBnZXR0aW5nIG9yIHNldHRpbmcKKyAgICAgKiBhIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2Vzc2lvbiwgZG8gbm90IGFmZmVjdCB0aGUgYWNjZXNzIHRpbWUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TGFzdEFjY2Vzc2VkVGltZSgpIHsKKworICAgICAgICBpZiAoICFpc1ZhbGlkKCkgKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uZ2V0TGFzdEFjY2Vzc2VkVGltZS5pc2UiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHRoaXMubGFzdEFjY2Vzc2VkVGltZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsYXN0IGNsaWVudCBhY2Nlc3MgdGltZSB3aXRob3V0IGludmFsaWRhdGlvbiBjaGVjaworICAgICAqIEBzZWUgI2dldExhc3RBY2Nlc3NlZFRpbWUoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRMYXN0QWNjZXNzZWRUaW1lSW50ZXJuYWwoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5sYXN0QWNjZXNzZWRUaW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1hbmFnZXIgd2l0aGluIHdoaWNoIHRoaXMgU2Vzc2lvbiBpcyB2YWxpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFuYWdlciBnZXRNYW5hZ2VyKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5tYW5hZ2VyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBNYW5hZ2VyIHdpdGhpbiB3aGljaCB0aGlzIFNlc3Npb24gaXMgdmFsaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgbmV3IE1hbmFnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKE1hbmFnZXIgbWFuYWdlcikgeworCisgICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWF4aW11bSB0aW1lIGludGVydmFsLCBpbiBzZWNvbmRzLCBiZXR3ZWVuIGNsaWVudCByZXF1ZXN0cworICAgICAqIGJlZm9yZSB0aGUgc2VydmxldCBjb250YWluZXIgd2lsbCBpbnZhbGlkYXRlIHRoZSBzZXNzaW9uLiAgQSBuZWdhdGl2ZQorICAgICAqIHRpbWUgaW5kaWNhdGVzIHRoYXQgdGhlIHNlc3Npb24gc2hvdWxkIG5ldmVyIHRpbWUgb3V0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMubWF4SW5hY3RpdmVJbnRlcnZhbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWF4aW11bSB0aW1lIGludGVydmFsLCBpbiBzZWNvbmRzLCBiZXR3ZWVuIGNsaWVudCByZXF1ZXN0cworICAgICAqIGJlZm9yZSB0aGUgc2VydmxldCBjb250YWluZXIgd2lsbCBpbnZhbGlkYXRlIHRoZSBzZXNzaW9uLiAgQSBuZWdhdGl2ZQorICAgICAqIHRpbWUgaW5kaWNhdGVzIHRoYXQgdGhlIHNlc3Npb24gc2hvdWxkIG5ldmVyIHRpbWUgb3V0LgorICAgICAqCisgICAgICogQHBhcmFtIGludGVydmFsIFRoZSBuZXcgbWF4aW11bSBpbnRlcnZhbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heEluYWN0aXZlSW50ZXJ2YWwoaW50IGludGVydmFsKSB7CisKKyAgICAgICAgdGhpcy5tYXhJbmFjdGl2ZUludGVydmFsID0gaW50ZXJ2YWw7CisgICAgICAgIGlmIChpc1ZhbGlkICYmIGludGVydmFsID09IDApIHsKKyAgICAgICAgICAgIGV4cGlyZSgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+aXNOZXc8L2NvZGU+IGZsYWcgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpc05ldyBUaGUgbmV3IHZhbHVlIGZvciB0aGUgPGNvZGU+aXNOZXc8L2NvZGU+IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROZXcoYm9vbGVhbiBpc05ldykgeworCisgICAgICAgIHRoaXMuaXNOZXcgPSBpc05ldzsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNlc3Npb24uCisgICAgICogVGhpcyBwcm92aWRlcyBhbiA8Y29kZT5BdXRoZW50aWNhdG9yPC9jb2RlPiB3aXRoIGEgbWVhbnMgdG8gY2FjaGUgYQorICAgICAqIHByZXZpb3VzbHkgYXV0aGVudGljYXRlZCBQcmluY2lwYWwsIGFuZCBhdm9pZCBwb3RlbnRpYWxseSBleHBlbnNpdmUKKyAgICAgKiA8Y29kZT5SZWFsbS5hdXRoZW50aWNhdGUoKTwvY29kZT4gY2FsbHMgb24gZXZlcnkgcmVxdWVzdC4gIElmIHRoZXJlCisgICAgICogaXMgbm8gY3VycmVudCBhc3NvY2lhdGVkIFByaW5jaXBhbCwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0UHJpbmNpcGFsKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5wcmluY2lwYWwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFsIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU2Vzc2lvbi4KKyAgICAgKiBUaGlzIHByb3ZpZGVzIGFuIDxjb2RlPkF1dGhlbnRpY2F0b3I8L2NvZGU+IHdpdGggYSBtZWFucyB0byBjYWNoZSBhCisgICAgICogcHJldmlvdXNseSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCwgYW5kIGF2b2lkIHBvdGVudGlhbGx5IGV4cGVuc2l2ZQorICAgICAqIDxjb2RlPlJlYWxtLmF1dGhlbnRpY2F0ZSgpPC9jb2RlPiBjYWxscyBvbiBldmVyeSByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHByaW5jaXBhbCBUaGUgbmV3IFByaW5jaXBhbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW5jaXBhbChQcmluY2lwYWwgcHJpbmNpcGFsKSB7CisKKyAgICAgICAgUHJpbmNpcGFsIG9sZFByaW5jaXBhbCA9IHRoaXMucHJpbmNpcGFsOworICAgICAgICB0aGlzLnByaW5jaXBhbCA9IHByaW5jaXBhbDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInByaW5jaXBhbCIsIG9sZFByaW5jaXBhbCwgdGhpcy5wcmluY2lwYWwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPkh0dHBTZXNzaW9uPC9jb2RlPiBmb3Igd2hpY2ggdGhpcyBvYmplY3QKKyAgICAgKiBpcyB0aGUgZmFjYWRlLgorICAgICAqLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKCkgeworCisgICAgICAgIGlmIChmYWNhZGUgPT0gbnVsbCl7CisgICAgICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpeworICAgICAgICAgICAgICAgIGZpbmFsIFN0YW5kYXJkU2Vzc2lvbiBmc2Vzc2lvbiA9IHRoaXM7CisgICAgICAgICAgICAgICAgZmFjYWRlID0gKFN0YW5kYXJkU2Vzc2lvbkZhY2FkZSlBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGFuZGFyZFNlc3Npb25GYWNhZGUoZnNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZhY2FkZSA9IG5ldyBTdGFuZGFyZFNlc3Npb25GYWNhZGUodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChmYWNhZGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPmlzVmFsaWQ8L2NvZGU+IGZsYWcgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgeworCisgICAgICAgIGlmICh0aGlzLmV4cGlyaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdGhpcy5pc1ZhbGlkICkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFjY2Vzc0NvdW50ID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWF4SW5hY3RpdmVJbnRlcnZhbCA+PSAwKSB7IAorICAgICAgICAgICAgbG9uZyB0aW1lTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpbnQgdGltZUlkbGUgPSAoaW50KSAoKHRpbWVOb3cgLSB0aGlzQWNjZXNzZWRUaW1lKSAvIDEwMDBMKTsKKyAgICAgICAgICAgIGlmICh0aW1lSWRsZSA+PSBtYXhJbmFjdGl2ZUludGVydmFsKSB7CisgICAgICAgICAgICAgICAgZXhwaXJlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmlzVmFsaWQpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8Y29kZT5pc1ZhbGlkPC9jb2RlPiBmbGFnIGZvciB0aGlzIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXNWYWxpZCBUaGUgbmV3IHZhbHVlIGZvciB0aGUgPGNvZGU+aXNWYWxpZDwvY29kZT4gZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkKGJvb2xlYW4gaXNWYWxpZCkgeworCisgICAgICAgIHRoaXMuaXNWYWxpZCA9IGlzVmFsaWQ7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlc3Npb24gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBhY2Nlc3NlZCB0aW1lIGluZm9ybWF0aW9uIGZvciB0aGlzIHNlc3Npb24uICBUaGlzIG1ldGhvZAorICAgICAqIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIGNvbnRleHQgd2hlbiBhIHJlcXVlc3QgY29tZXMgaW4gZm9yIGEgcGFydGljdWxhcgorICAgICAqIHNlc3Npb24sIGV2ZW4gaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHJlZmVyZW5jZSBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhY2Nlc3MoKSB7CisKKyAgICAgICAgdGhpcy5sYXN0QWNjZXNzZWRUaW1lID0gdGhpcy50aGlzQWNjZXNzZWRUaW1lOworICAgICAgICB0aGlzLnRoaXNBY2Nlc3NlZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBldmFsdWF0ZUlmVmFsaWQoKTsKKworICAgICAgICBpZiAoR2xvYmFscy5TVFJJQ1RfU0VSVkxFVF9DT01QTElBTkNFKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3NDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVuZCB0aGUgYWNjZXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZEFjY2VzcygpIHsKKworICAgICAgICBpc05ldyA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgaWYgKEdsb2JhbHMuU1RSSUNUX1NFUlZMRVRfQ09NUExJQU5DRSkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7CisgICAgICAgICAgICAgICAgYWNjZXNzQ291bnQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgc2Vzc2lvbiBldmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTZXNzaW9uTGlzdGVuZXIoU2Vzc2lvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gdGhlIGludGVybmFsIHByb2Nlc3NpbmcgcmVxdWlyZWQgdG8gaW52YWxpZGF0ZSB0aGlzIHNlc3Npb24sCisgICAgICogd2l0aG91dCB0cmlnZ2VyaW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2Vzc2lvbiBoYXMgYWxyZWFkeSBleHBpcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cGlyZSgpIHsKKworICAgICAgICBleHBpcmUodHJ1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gdGhlIGludGVybmFsIHByb2Nlc3NpbmcgcmVxdWlyZWQgdG8gaW52YWxpZGF0ZSB0aGlzIHNlc3Npb24sCisgICAgICogd2l0aG91dCB0cmlnZ2VyaW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2Vzc2lvbiBoYXMgYWxyZWFkeSBleHBpcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIG5vdGlmeSBTaG91bGQgd2Ugbm90aWZ5IGxpc3RlbmVycyBhYm91dCB0aGUgZGVtaXNlIG9mCisgICAgICogIHRoaXMgc2Vzc2lvbj8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleHBpcmUoYm9vbGVhbiBub3RpZnkpIHsKKworICAgICAgICAvLyBNYXJrIHRoaXMgc2Vzc2lvbiBhcyAiYmVpbmcgZXhwaXJlZCIgaWYgbmVlZGVkCisgICAgICAgIGlmIChleHBpcmluZykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKworICAgICAgICAgICAgaWYgKG1hbmFnZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGV4cGlyaW5nID0gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgICAgICAvLyBOb3RpZnkgaW50ZXJlc3RlZCBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMKKyAgICAgICAgICAgIC8vIEZJWE1FIC0gQXNzdW1lcyB3ZSBjYWxsIGxpc3RlbmVycyBpbiByZXZlcnNlIG9yZGVyCisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgbWFuYWdlci5nZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgIE9iamVjdCBsaXN0ZW5lcnNbXSA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25MaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIGlmIChub3RpZnkgJiYgKGxpc3RlbmVycyAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIEh0dHBTZXNzaW9uRXZlbnQgZXZlbnQgPQorICAgICAgICAgICAgICAgICAgICBuZXcgSHR0cFNlc3Npb25FdmVudChnZXRTZXNzaW9uKCkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBqID0gKGxpc3RlbmVycy5sZW5ndGggLSAxKSAtIGk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKGxpc3RlbmVyc1tqXSBpbnN0YW5jZW9mIEh0dHBTZXNzaW9uTGlzdGVuZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIEh0dHBTZXNzaW9uTGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXNzaW9uTGlzdGVuZXIpIGxpc3RlbmVyc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTZXNzaW9uRGVzdHJveWVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZXNzaW9uRGVzdHJveWVkKGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclNlc3Npb25EZXN0cm95ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclNlc3Npb25EZXN0cm95ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uc2Vzc2lvbkV2ZW50IiksIHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYWNjZXNzQ291bnQgPSAwOworICAgICAgICAgICAgc2V0VmFsaWQoZmFsc2UpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29tcHV0ZSBob3cgbG9uZyB0aGlzIHNlc3Npb24gaGFzIGJlZW4gYWxpdmUsIGFuZCB1cGRhdGUKKyAgICAgICAgICAgICAqIHNlc3Npb24gbWFuYWdlcidzIHJlbGF0ZWQgcHJvcGVydGllcyBhY2NvcmRpbmdseQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBsb25nIHRpbWVOb3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGludCB0aW1lQWxpdmUgPSAoaW50KSAoKHRpbWVOb3cgLSBjcmVhdGlvblRpbWUpLzEwMDApOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVBbGl2ZSA+IG1hbmFnZXIuZ2V0U2Vzc2lvbk1heEFsaXZlVGltZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuc2V0U2Vzc2lvbk1heEFsaXZlVGltZSh0aW1lQWxpdmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbnVtRXhwaXJlZCA9IG1hbmFnZXIuZ2V0RXhwaXJlZFNlc3Npb25zKCk7CisgICAgICAgICAgICAgICAgbnVtRXhwaXJlZCsrOworICAgICAgICAgICAgICAgIG1hbmFnZXIuc2V0RXhwaXJlZFNlc3Npb25zKG51bUV4cGlyZWQpOworICAgICAgICAgICAgICAgIGludCBhdmVyYWdlID0gbWFuYWdlci5nZXRTZXNzaW9uQXZlcmFnZUFsaXZlVGltZSgpOworICAgICAgICAgICAgICAgIGF2ZXJhZ2UgPSAoKGF2ZXJhZ2UgKiAobnVtRXhwaXJlZC0xKSkgKyB0aW1lQWxpdmUpL251bUV4cGlyZWQ7CisgICAgICAgICAgICAgICAgbWFuYWdlci5zZXRTZXNzaW9uQXZlcmFnZUFsaXZlVGltZShhdmVyYWdlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgc2Vzc2lvbiBmcm9tIG91ciBtYW5hZ2VyJ3MgYWN0aXZlIHNlc3Npb25zCisgICAgICAgICAgICBtYW5hZ2VyLnJlbW92ZSh0aGlzKTsKKworICAgICAgICAgICAgLy8gTm90aWZ5IGludGVyZXN0ZWQgc2Vzc2lvbiBldmVudCBsaXN0ZW5lcnMKKyAgICAgICAgICAgIGlmIChub3RpZnkpIHsKKyAgICAgICAgICAgICAgICBmaXJlU2Vzc2lvbkV2ZW50KFNlc3Npb24uU0VTU0lPTl9ERVNUUk9ZRURfRVZFTlQsIG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXZSBoYXZlIGNvbXBsZXRlZCBleHBpcmUgb2YgdGhpcyBzZXNzaW9uCisgICAgICAgICAgICBleHBpcmluZyA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBVbmJpbmQgYW55IG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbgorICAgICAgICAgICAgU3RyaW5nIGtleXNbXSA9IGtleXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGVJbnRlcm5hbChrZXlzW2ldLCBub3RpZnkpOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGVyZm9ybSB0aGUgaW50ZXJuYWwgcHJvY2Vzc2luZyByZXF1aXJlZCB0byBwYXNzaXZhdGUKKyAgICAgKiB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFzc2l2YXRlKCkgeworCisgICAgICAgIC8vIE5vdGlmeSBpbnRlcmVzdGVkIHNlc3Npb24gZXZlbnQgbGlzdGVuZXJzCisgICAgICAgIGZpcmVTZXNzaW9uRXZlbnQoU2Vzc2lvbi5TRVNTSU9OX1BBU1NJVkFURURfRVZFTlQsIG51bGwpOworCisgICAgICAgIC8vIE5vdGlmeSBBY3RpdmF0aW9uTGlzdGVuZXJzCisgICAgICAgIEh0dHBTZXNzaW9uRXZlbnQgZXZlbnQgPSBudWxsOworICAgICAgICBTdHJpbmcga2V5c1tdID0ga2V5cygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldChrZXlzW2ldKTsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lcikgeworICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBIdHRwU2Vzc2lvbkV2ZW50KGdldFNlc3Npb24oKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgKChIdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lcilhdHRyaWJ1dGUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2Vzc2lvbldpbGxQYXNzaXZhdGUoZXZlbnQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5hdHRyaWJ1dGVFdmVudCIpLCB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGVyZm9ybSBpbnRlcm5hbCBwcm9jZXNzaW5nIHJlcXVpcmVkIHRvIGFjdGl2YXRlIHRoaXMKKyAgICAgKiBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgeworCisgICAgICAgIC8vIE5vdGlmeSBpbnRlcmVzdGVkIHNlc3Npb24gZXZlbnQgbGlzdGVuZXJzCisgICAgICAgIGZpcmVTZXNzaW9uRXZlbnQoU2Vzc2lvbi5TRVNTSU9OX0FDVElWQVRFRF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgLy8gTm90aWZ5IEFjdGl2YXRpb25MaXN0ZW5lcnMKKyAgICAgICAgSHR0cFNlc3Npb25FdmVudCBldmVudCA9IG51bGw7CisgICAgICAgIFN0cmluZyBrZXlzW10gPSBrZXlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgT2JqZWN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KGtleXNbaV0pOworICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSBpbnN0YW5jZW9mIEh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IEh0dHBTZXNzaW9uRXZlbnQoZ2V0U2Vzc2lvbigpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAoKEh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyKWF0dHJpYnV0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXNzaW9uRGlkQWN0aXZhdGUoZXZlbnQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5hdHRyaWJ1dGVFdmVudCIpLCB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvYmplY3QgYm91bmQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgdG8gdGhlIGludGVybmFsIG5vdGVzCisgICAgICogZm9yIHRoaXMgc2Vzc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBiaW5kaW5nIGV4aXN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG5vdGUgdG8gYmUgcmV0dXJuZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE5vdGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICByZXR1cm4gKG5vdGVzLmdldChuYW1lKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBJdGVyYXRvciBjb250YWluaW5nIHRoZSBTdHJpbmcgbmFtZXMgb2YgYWxsIG5vdGVzIGJpbmRpbmdzCisgICAgICogdGhhdCBleGlzdCBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBnZXROb3RlTmFtZXMoKSB7CisKKyAgICAgICAgcmV0dXJuIChub3Rlcy5rZXlTZXQoKS5pdGVyYXRvcigpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVsZWFzZSBhbGwgb2JqZWN0IHJlZmVyZW5jZXMsIGFuZCBpbml0aWFsaXplIGluc3RhbmNlIHZhcmlhYmxlcywgaW4KKyAgICAgKiBwcmVwYXJhdGlvbiBmb3IgcmV1c2Ugb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKKworICAgICAgICAvLyBSZXNldCB0aGUgaW5zdGFuY2UgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNlc3Npb24KKyAgICAgICAgYXR0cmlidXRlcy5jbGVhcigpOworICAgICAgICBzZXRBdXRoVHlwZShudWxsKTsKKyAgICAgICAgY3JlYXRpb25UaW1lID0gMEw7CisgICAgICAgIGV4cGlyaW5nID0gZmFsc2U7CisgICAgICAgIGlkID0gbnVsbDsKKyAgICAgICAgbGFzdEFjY2Vzc2VkVGltZSA9IDBMOworICAgICAgICBtYXhJbmFjdGl2ZUludGVydmFsID0gLTE7CisgICAgICAgIGFjY2Vzc0NvdW50ID0gMDsKKyAgICAgICAgbm90ZXMuY2xlYXIoKTsKKyAgICAgICAgc2V0UHJpbmNpcGFsKG51bGwpOworICAgICAgICBpc05ldyA9IGZhbHNlOworICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CisgICAgICAgIG1hbmFnZXIgPSBudWxsOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IG9iamVjdCBib3VuZCB0byB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhlIGludGVybmFsIG5vdGVzCisgICAgICogZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG5vdGUgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBub3Rlcy5yZW1vdmUobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHNlc3Npb24gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTZXNzaW9uTGlzdGVuZXIoU2Vzc2lvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmQgYW4gb2JqZWN0IHRvIGEgc3BlY2lmaWVkIG5hbWUgaW4gdGhlIGludGVybmFsIG5vdGVzIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoaXMgc2Vzc2lvbiwgcmVwbGFjaW5nIGFueSBleGlzdGluZyBiaW5kaW5nIGZvciB0aGlzIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIHRvIHdoaWNoIHRoZSBvYmplY3Qgc2hvdWxkIGJlIGJvdW5kCisgICAgICogQHBhcmFtIHZhbHVlIE9iamVjdCB0byBiZSBib3VuZCB0byB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb3RlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKworICAgICAgICBub3Rlcy5wdXQobmFtZSwgdmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgiU3RhbmRhcmRTZXNzaW9uWyIpOworICAgICAgICBzYi5hcHBlbmQoaWQpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlc3Npb24gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlYWQgYSBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc2Vzc2lvbiBvYmplY3QgZnJvbQorICAgICAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlucHV0IHN0cmVhbSwgd2l0aG91dCByZXF1aXJpbmcgdGhhdCB0aGUKKyAgICAgKiBTdGFuZGFyZFNlc3Npb24gaXRzZWxmIGhhdmUgYmVlbiBzZXJpYWxpemVkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmVhbSBUaGUgb2JqZWN0IGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiB1bmtub3duIGNsYXNzIGlzIHNwZWNpZmllZAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlYWRPYmplY3REYXRhKE9iamVjdElucHV0U3RyZWFtIHN0cmVhbSkKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICByZWFkT2JqZWN0KHN0cmVhbSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgc2VyaWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50cyBvZiB0aGlzIHNlc3Npb24gb2JqZWN0IHRvCisgICAgICogdGhlIHNwZWNpZmllZCBvYmplY3Qgb3V0cHV0IHN0cmVhbSwgd2l0aG91dCByZXF1aXJpbmcgdGhhdCB0aGUKKyAgICAgKiBTdGFuZGFyZFNlc3Npb24gaXRzZWxmIGhhdmUgYmVlbiBzZXJpYWxpemVkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmVhbSBUaGUgb2JqZWN0IG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgdG8KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlT2JqZWN0RGF0YShPYmplY3RPdXRwdXRTdHJlYW0gc3RyZWFtKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIHdyaXRlT2JqZWN0KHN0cmVhbSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSHR0cFNlc3Npb24gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRpbWUgd2hlbiB0aGlzIHNlc3Npb24gd2FzIGNyZWF0ZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZQorICAgICAqIG1pZG5pZ2h0LCBKYW51YXJ5IDEsIDE5NzAgR01ULgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICogIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDcmVhdGlvblRpbWUoKSB7CisKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLmdldENyZWF0aW9uVGltZS5pc2UiKSk7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmNyZWF0aW9uVGltZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU2VydmxldENvbnRleHQgdG8gd2hpY2ggdGhpcyBzZXNzaW9uIGJlbG9uZ3MuCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCkgeworCisgICAgICAgIGlmIChtYW5hZ2VyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgbWFuYWdlci5nZXRDb250YWluZXIoKTsKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAoY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXNzaW9uIGNvbnRleHQgd2l0aCB3aGljaCB0aGlzIHNlc3Npb24gaXMgYXNzb2NpYXRlZC4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIFZlcnNpb24gMi4xLCB0aGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFuZCBoYXMgbm8KKyAgICAgKiAgcmVwbGFjZW1lbnQuICBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGUKKyAgICAgKiAgSmF2YSBTZXJ2bGV0IEFQSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSHR0cFNlc3Npb25Db250ZXh0IGdldFNlc3Npb25Db250ZXh0KCkgeworCisgICAgICAgIGlmIChzZXNzaW9uQ29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgc2Vzc2lvbkNvbnRleHQgPSBuZXcgU3RhbmRhcmRTZXNzaW9uQ29udGV4dCgpOworICAgICAgICByZXR1cm4gKHNlc3Npb25Db250ZXh0KTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUh0dHBTZXNzaW9uIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoaXMgc2Vzc2lvbiwgb3IKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvYmplY3QgaXMgYm91bmQgd2l0aCB0aGF0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gYmUgcmV0dXJuZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqICBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAoIWlzVmFsaWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uZ2V0QXR0cmlidXRlLmlzZSIpKTsKKworICAgICAgICByZXR1cm4gKGF0dHJpYnV0ZXMuZ2V0KG5hbWUpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdHMKKyAgICAgKiBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgb2JqZWN0cyBib3VuZCB0byB0aGlzIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKiAgaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVOYW1lcygpIHsKKworICAgICAgICBpZiAoIWlzVmFsaWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uZ2V0QXR0cmlidXRlTmFtZXMuaXNlIikpOworCisgICAgICAgIHJldHVybiAobmV3IEVudW1lcmF0b3IoYXR0cmlidXRlcy5rZXlTZXQoKSwgdHJ1ZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBib3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiB0aGlzIHNlc3Npb24sIG9yCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gb2JqZWN0IGlzIGJvdW5kIHdpdGggdGhhdCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqICBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBWZXJzaW9uIDIuMiwgdGhpcyBtZXRob2QgaXMgcmVwbGFjZWQgYnkKKyAgICAgKiAgPGNvZGU+Z2V0QXR0cmlidXRlKCk8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHJldHVybiAoZ2V0QXR0cmlidXRlKG5hbWUpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgbmFtZXMgb2Ygb2JqZWN0cyBib3VuZCB0byB0aGlzIHNlc3Npb24uICBJZiB0aGVyZQorICAgICAqIGFyZSBubyBzdWNoIG9iamVjdHMsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKiAgaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgVmVyc2lvbiAyLjIsIHRoaXMgbWV0aG9kIGlzIHJlcGxhY2VkIGJ5CisgICAgICogIDxjb2RlPmdldEF0dHJpYnV0ZU5hbWVzKCk8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlTmFtZXMoKSB7CisKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLmdldFZhbHVlTmFtZXMuaXNlIikpOworCisgICAgICAgIHJldHVybiAoa2V5cygpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW52YWxpZGF0ZXMgdGhpcyBzZXNzaW9uIGFuZCB1bmJpbmRzIGFueSBvYmplY3RzIGJvdW5kIHRvIGl0LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uCisgICAgICogIGFuIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgeworCisgICAgICAgIGlmICghaXNWYWxpZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5pbnZhbGlkYXRlLmlzZSIpKTsKKworICAgICAgICAvLyBDYXVzZSB0aGlzIHNlc3Npb24gdG8gZXhwaXJlCisgICAgICAgIGV4cGlyZSgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNsaWVudCBkb2VzIG5vdCB5ZXQga25vdyBhYm91dCB0aGUKKyAgICAgKiBzZXNzaW9uLCBvciBpZiB0aGUgY2xpZW50IGNob29zZXMgbm90IHRvIGpvaW4gdGhlIHNlc3Npb24uICBGb3IKKyAgICAgKiBleGFtcGxlLCBpZiB0aGUgc2VydmVyIHVzZWQgb25seSBjb29raWUtYmFzZWQgc2Vzc2lvbnMsIGFuZCB0aGUgY2xpZW50CisgICAgICogaGFzIGRpc2FibGVkIHRoZSB1c2Ugb2YgY29va2llcywgdGhlbiBhIHNlc3Npb24gd291bGQgYmUgbmV3IG9uIGVhY2gKKyAgICAgKiByZXF1ZXN0LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICogIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc05ldygpIHsKKworICAgICAgICBpZiAoIWlzVmFsaWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uaXNOZXcuaXNlIikpOworCisgICAgICAgIHJldHVybiAodGhpcy5pc05ldyk7CisKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogQmluZCBhbiBvYmplY3QgdG8gdGhpcyBzZXNzaW9uLCB1c2luZyB0aGUgc3BlY2lmaWVkIG5hbWUuICBJZiBhbiBvYmplY3QKKyAgICAgKiBvZiB0aGUgc2FtZSBuYW1lIGlzIGFscmVhZHkgYm91bmQgdG8gdGhpcyBzZXNzaW9uLCB0aGUgb2JqZWN0IGlzCisgICAgICogcmVwbGFjZWQuCisgICAgICogPHA+CisgICAgICogQWZ0ZXIgdGhpcyBtZXRob2QgZXhlY3V0ZXMsIGFuZCBpZiB0aGUgb2JqZWN0IGltcGxlbWVudHMKKyAgICAgKiA8Y29kZT5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjwvY29kZT4sIHRoZSBjb250YWluZXIgY2FsbHMKKyAgICAgKiA8Y29kZT52YWx1ZUJvdW5kKCk8L2NvZGU+IG9uIHRoZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIHRvIHdoaWNoIHRoZSBvYmplY3QgaXMgYm91bmQsIGNhbm5vdCBiZSBudWxsCisgICAgICogQHBhcmFtIHZhbHVlIE9iamVjdCB0byBiZSBib3VuZCwgY2Fubm90IGJlIG51bGwKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqICBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBWZXJzaW9uIDIuMiwgdGhpcyBtZXRob2QgaXMgcmVwbGFjZWQgYnkKKyAgICAgKiAgPGNvZGU+c2V0QXR0cmlidXRlKCk8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0VmFsdWUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworCisgICAgICAgIHNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgb2JqZWN0IGJvdW5kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGZyb20gdGhpcyBzZXNzaW9uLiAgSWYKKyAgICAgKiB0aGUgc2Vzc2lvbiBkb2VzIG5vdCBoYXZlIGFuIG9iamVjdCBib3VuZCB3aXRoIHRoaXMgbmFtZSwgdGhpcyBtZXRob2QKKyAgICAgKiBkb2VzIG5vdGhpbmcuCisgICAgICogPHA+CisgICAgICogQWZ0ZXIgdGhpcyBtZXRob2QgZXhlY3V0ZXMsIGFuZCBpZiB0aGUgb2JqZWN0IGltcGxlbWVudHMKKyAgICAgKiA8Y29kZT5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjwvY29kZT4sIHRoZSBjb250YWluZXIgY2FsbHMKKyAgICAgKiA8Y29kZT52YWx1ZVVuYm91bmQoKTwvY29kZT4gb24gdGhlIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG9iamVjdCB0byByZW1vdmUgZnJvbSB0aGlzIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKiAgaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHJlbW92ZUF0dHJpYnV0ZShuYW1lLCB0cnVlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBvYmplY3QgYm91bmQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgZnJvbSB0aGlzIHNlc3Npb24uICBJZgorICAgICAqIHRoZSBzZXNzaW9uIGRvZXMgbm90IGhhdmUgYW4gb2JqZWN0IGJvdW5kIHdpdGggdGhpcyBuYW1lLCB0aGlzIG1ldGhvZAorICAgICAqIGRvZXMgbm90aGluZy4KKyAgICAgKiA8cD4KKyAgICAgKiBBZnRlciB0aGlzIG1ldGhvZCBleGVjdXRlcywgYW5kIGlmIHRoZSBvYmplY3QgaW1wbGVtZW50cworICAgICAqIDxjb2RlPkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyPC9jb2RlPiwgdGhlIGNvbnRhaW5lciBjYWxscworICAgICAqIDxjb2RlPnZhbHVlVW5ib3VuZCgpPC9jb2RlPiBvbiB0aGUgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgb2JqZWN0IHRvIHJlbW92ZSBmcm9tIHRoaXMgc2Vzc2lvbi4KKyAgICAgKiBAcGFyYW0gbm90aWZ5IFNob3VsZCB3ZSBub3RpZnkgaW50ZXJlc3RlZCBsaXN0ZW5lcnMgdGhhdCB0aGlzCisgICAgICogIGF0dHJpYnV0ZSBpcyBiZWluZyByZW1vdmVkPworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICogIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gbm90aWZ5KSB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgb3VyIGN1cnJlbnQgc3RhdGUKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZS5pc2UiKSk7CisKKyAgICAgICAgcmVtb3ZlQXR0cmlidXRlSW50ZXJuYWwobmFtZSwgbm90aWZ5KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBvYmplY3QgYm91bmQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgZnJvbSB0aGlzIHNlc3Npb24uICBJZgorICAgICAqIHRoZSBzZXNzaW9uIGRvZXMgbm90IGhhdmUgYW4gb2JqZWN0IGJvdW5kIHdpdGggdGhpcyBuYW1lLCB0aGlzIG1ldGhvZAorICAgICAqIGRvZXMgbm90aGluZy4KKyAgICAgKiA8cD4KKyAgICAgKiBBZnRlciB0aGlzIG1ldGhvZCBleGVjdXRlcywgYW5kIGlmIHRoZSBvYmplY3QgaW1wbGVtZW50cworICAgICAqIDxjb2RlPkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyPC9jb2RlPiwgdGhlIGNvbnRhaW5lciBjYWxscworICAgICAqIDxjb2RlPnZhbHVlVW5ib3VuZCgpPC9jb2RlPiBvbiB0aGUgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgb2JqZWN0IHRvIHJlbW92ZSBmcm9tIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqICBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBWZXJzaW9uIDIuMiwgdGhpcyBtZXRob2QgaXMgcmVwbGFjZWQgYnkKKyAgICAgKiAgPGNvZGU+cmVtb3ZlQXR0cmlidXRlKCk8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVmFsdWUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmQgYW4gb2JqZWN0IHRvIHRoaXMgc2Vzc2lvbiwgdXNpbmcgdGhlIHNwZWNpZmllZCBuYW1lLiAgSWYgYW4gb2JqZWN0CisgICAgICogb2YgdGhlIHNhbWUgbmFtZSBpcyBhbHJlYWR5IGJvdW5kIHRvIHRoaXMgc2Vzc2lvbiwgdGhlIG9iamVjdCBpcworICAgICAqIHJlcGxhY2VkLgorICAgICAqIDxwPgorICAgICAqIEFmdGVyIHRoaXMgbWV0aG9kIGV4ZWN1dGVzLCBhbmQgaWYgdGhlIG9iamVjdCBpbXBsZW1lbnRzCisgICAgICogPGNvZGU+SHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI8L2NvZGU+LCB0aGUgY29udGFpbmVyIGNhbGxzCisgICAgICogPGNvZGU+dmFsdWVCb3VuZCgpPC9jb2RlPiBvbiB0aGUgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSB0byB3aGljaCB0aGUgb2JqZWN0IGlzIGJvdW5kLCBjYW5ub3QgYmUgbnVsbAorICAgICAqIEBwYXJhbSB2YWx1ZSBPYmplY3QgdG8gYmUgYm91bmQsIGNhbm5vdCBiZSBudWxsCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYWRkIGEKKyAgICAgKiAgbm9uLXNlcmlhbGl6YWJsZSBvYmplY3QgaW4gYW4gZW52aXJvbm1lbnQgbWFya2VkIGRpc3RyaWJ1dGFibGUuCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICogIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzZXRBdHRyaWJ1dGUobmFtZSx2YWx1ZSx0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBub3RpZnkpIHsKKworICAgICAgICAvLyBOYW1lIGNhbm5vdCBiZSBudWxsCisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLnNldEF0dHJpYnV0ZS5uYW1lbnVsbCIpKTsKKworICAgICAgICAvLyBOdWxsIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHJlbW92ZUF0dHJpYnV0ZSgpCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBWYWxpZGF0ZSBvdXIgY3VycmVudCBzdGF0ZQorICAgICAgICBpZiAoIWlzVmFsaWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uc2V0QXR0cmlidXRlLmlzZSIpKTsKKyAgICAgICAgaWYgKChtYW5hZ2VyICE9IG51bGwpICYmIG1hbmFnZXIuZ2V0RGlzdHJpYnV0YWJsZSgpICYmCisgICAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLnNldEF0dHJpYnV0ZS5pYWUiKSk7CisKKyAgICAgICAgLy8gQ29uc3RydWN0IGFuIGV2ZW50IHdpdGggdGhlIG5ldyB2YWx1ZQorICAgICAgICBIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCA9IG51bGw7CisKKyAgICAgICAgLy8gQ2FsbCB0aGUgdmFsdWVCb3VuZCgpIG1ldGhvZCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIgJiYgbm90aWZ5KSB7CisgICAgICAgICAgICAvLyBEb24ndCBjYWxsIGFueSBub3RpZmljYXRpb24gaWYgcmVwbGFjaW5nIHdpdGggdGhlIHNhbWUgdmFsdWUKKyAgICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0KG5hbWUpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG9sZFZhbHVlKSB7CisgICAgICAgICAgICAgICAgZXZlbnQgPSBuZXcgSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQoZ2V0U2Vzc2lvbigpLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgKChIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcikgdmFsdWUpLnZhbHVlQm91bmQoZXZlbnQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KXsKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5lcnJvcgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uYmluZGluZ0V2ZW50IiksIHQpOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBsYWNlIG9yIGFkZCB0aGlzIGF0dHJpYnV0ZQorICAgICAgICBPYmplY3QgdW5ib3VuZCA9IGF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKKworICAgICAgICAvLyBDYWxsIHRoZSB2YWx1ZVVuYm91bmQoKSBtZXRob2QgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmICgodW5ib3VuZCAhPSBudWxsKSAmJiAodW5ib3VuZCAhPSB2YWx1ZSkgJiYKKyAgICAgICAgICAgICh1bmJvdW5kIGluc3RhbmNlb2YgSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIpICAmJiBub3RpZnkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgKChIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcikgdW5ib3VuZCkudmFsdWVVbmJvdW5kCisgICAgICAgICAgICAgICAgICAgIChuZXcgSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQoZ2V0U2Vzc2lvbigpLCBuYW1lKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLmJpbmRpbmdFdmVudCIpLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCAhbm90aWZ5ICkgcmV0dXJuOworCisgICAgICAgIC8vIE5vdGlmeSBpbnRlcmVzdGVkIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVycworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgbWFuYWdlci5nZXRDb250YWluZXIoKTsKKyAgICAgICAgT2JqZWN0IGxpc3RlbmVyc1tdID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzKCk7CisgICAgICAgIGlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghKGxpc3RlbmVyc1tpXSBpbnN0YW5jZW9mIEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lciBsaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgKEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHVuYm91bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTZXNzaW9uQXR0cmlidXRlUmVwbGFjZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBuZXcgSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0U2Vzc2lvbigpLCBuYW1lLCB1bmJvdW5kKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5hdHRyaWJ1dGVSZXBsYWNlZChldmVudCk7CisgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU2Vzc2lvbkF0dHJpYnV0ZVJlcGxhY2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTZXNzaW9uQXR0cmlidXRlQWRkZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBuZXcgSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0U2Vzc2lvbigpLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuYXR0cmlidXRlQWRkZWQoZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclNlc3Npb25BdHRyaWJ1dGVBZGRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAodW5ib3VuZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXJTZXNzaW9uQXR0cmlidXRlUmVwbGFjZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclNlc3Npb25BdHRyaWJ1dGVBZGRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5hdHRyaWJ1dGVFdmVudCIpLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSHR0cFNlc3Npb24gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVhZCBhIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGlzIHNlc3Npb24gb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqIG9iamVjdCBpbnB1dCBzdHJlYW0uCisgICAgICogPHA+CisgICAgICogPGI+SU1QTEVNRU5UQVRJT04gTk9URTwvYj46ICBUaGUgcmVmZXJlbmNlIHRvIHRoZSBvd25pbmcgTWFuYWdlcgorICAgICAqIGlzIG5vdCByZXN0b3JlZCBieSB0aGlzIG1ldGhvZCwgYW5kIG11c3QgYmUgc2V0IGV4cGxpY2l0bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gdW5rbm93biBjbGFzcyBpcyBzcGVjaWZpZWQKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBzdHJlYW0pCisgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRGVzZXJpYWxpemUgdGhlIHNjYWxhciBpbnN0YW5jZSB2YXJpYWJsZXMgKGV4Y2VwdCBNYW5hZ2VyKQorICAgICAgICBhdXRoVHlwZSA9IG51bGw7ICAgICAgICAvLyBUcmFuc2llbnQgb25seQorICAgICAgICBjcmVhdGlvblRpbWUgPSAoKExvbmcpIHN0cmVhbS5yZWFkT2JqZWN0KCkpLmxvbmdWYWx1ZSgpOworICAgICAgICBsYXN0QWNjZXNzZWRUaW1lID0gKChMb25nKSBzdHJlYW0ucmVhZE9iamVjdCgpKS5sb25nVmFsdWUoKTsKKyAgICAgICAgbWF4SW5hY3RpdmVJbnRlcnZhbCA9ICgoSW50ZWdlcikgc3RyZWFtLnJlYWRPYmplY3QoKSkuaW50VmFsdWUoKTsKKyAgICAgICAgaXNOZXcgPSAoKEJvb2xlYW4pIHN0cmVhbS5yZWFkT2JqZWN0KCkpLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICBpc1ZhbGlkID0gKChCb29sZWFuKSBzdHJlYW0ucmVhZE9iamVjdCgpKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgdGhpc0FjY2Vzc2VkVGltZSA9ICgoTG9uZykgc3RyZWFtLnJlYWRPYmplY3QoKSkubG9uZ1ZhbHVlKCk7CisgICAgICAgIHByaW5jaXBhbCA9IG51bGw7ICAgICAgICAvLyBUcmFuc2llbnQgb25seQorICAgICAgICAvLyAgICAgICAgc2V0SWQoKFN0cmluZykgc3RyZWFtLnJlYWRPYmplY3QoKSk7CisgICAgICAgIGlkID0gKFN0cmluZykgc3RyZWFtLnJlYWRPYmplY3QoKTsKKyAgICAgICAgaWYgKG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZGVidWcKKyAgICAgICAgICAgICAgICAoInJlYWRPYmplY3QoKSBsb2FkaW5nIHNlc3Npb24gIiArIGlkKTsKKworICAgICAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgYXR0cmlidXRlIGNvdW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzCisgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpCisgICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBpbnQgbiA9ICgoSW50ZWdlcikgc3RyZWFtLnJlYWRPYmplY3QoKSkuaW50VmFsdWUoKTsKKyAgICAgICAgYm9vbGVhbiBpc1ZhbGlkU2F2ZSA9IGlzVmFsaWQ7CisgICAgICAgIGlzVmFsaWQgPSB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBzdHJlYW0ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gKE9iamVjdCkgc3RyZWFtLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIGlmICgodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpICYmICh2YWx1ZS5lcXVhbHMoTk9UX1NFUklBTElaRUQpKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5kZWJ1ZygiICBsb2FkaW5nIGF0dHJpYnV0ZSAnIiArIG5hbWUgKworICAgICAgICAgICAgICAgICAgICAiJyB3aXRoIHZhbHVlICciICsgdmFsdWUgKyAiJyIpOworICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlzVmFsaWQgPSBpc1ZhbGlkU2F2ZTsKKworICAgICAgICBpZiAobGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChub3RlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBub3RlcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgYSBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhpcyBzZXNzaW9uIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkCisgICAgICogb2JqZWN0IG91dHB1dCBzdHJlYW0uCisgICAgICogPHA+CisgICAgICogPGI+SU1QTEVNRU5UQVRJT04gTk9URTwvYj46ICBUaGUgb3duaW5nIE1hbmFnZXIgd2lsbCBub3QgYmUgc3RvcmVkCisgICAgICogaW4gdGhlIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBTZXNzaW9uLiAgQWZ0ZXIgY2FsbGluZworICAgICAqIDxjb2RlPnJlYWRPYmplY3QoKTwvY29kZT4sIHlvdSBtdXN0IHNldCB0aGUgYXNzb2NpYXRlZCBNYW5hZ2VyCisgICAgICogZXhwbGljaXRseS4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFPC9iPjogIEFueSBhdHRyaWJ1dGUgdGhhdCBpcyBub3QgU2VyaWFsaXphYmxlCisgICAgICogd2lsbCBiZSB1bmJvdW5kIGZyb20gdGhlIHNlc3Npb24sIHdpdGggYXBwcm9wcmlhdGUgYWN0aW9ucyBpZiBpdAorICAgICAqIGltcGxlbWVudHMgSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIuICBJZiB5b3UgZG8gbm90IHdhbnQgYW55IHN1Y2gKKyAgICAgKiBhdHRyaWJ1dGVzLCBiZSBzdXJlIHRoZSA8Y29kZT5kaXN0cmlidXRhYmxlPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGUKKyAgICAgKiBhc3NvY2lhdGVkIE1hbmFnZXIgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmVhbSBUaGUgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0bworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gV3JpdGUgdGhlIHNjYWxhciBpbnN0YW5jZSB2YXJpYWJsZXMgKGV4Y2VwdCBNYW5hZ2VyKQorICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QobmV3IExvbmcoY3JlYXRpb25UaW1lKSk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChuZXcgTG9uZyhsYXN0QWNjZXNzZWRUaW1lKSk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChuZXcgSW50ZWdlcihtYXhJbmFjdGl2ZUludGVydmFsKSk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChuZXcgQm9vbGVhbihpc05ldykpOworICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QobmV3IEJvb2xlYW4oaXNWYWxpZCkpOworICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QobmV3IExvbmcodGhpc0FjY2Vzc2VkVGltZSkpOworICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QoaWQpOworICAgICAgICBpZiAobWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5kZWJ1ZworICAgICAgICAgICAgICAgICgid3JpdGVPYmplY3QoKSBzdG9yaW5nIHNlc3Npb24gIiArIGlkKTsKKworICAgICAgICAvLyBBY2N1bXVsYXRlIHRoZSBuYW1lcyBvZiBzZXJpYWxpemFibGUgYW5kIG5vbi1zZXJpYWxpemFibGUgYXR0cmlidXRlcworICAgICAgICBTdHJpbmcga2V5c1tdID0ga2V5cygpOworICAgICAgICBBcnJheUxpc3Qgc2F2ZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBBcnJheUxpc3Qgc2F2ZVZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBhdHRyaWJ1dGVzLmdldChrZXlzW2ldKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgZWxzZSBpZiAoICh2YWx1ZSBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZSkgCisgICAgICAgICAgICAgICAgICAgICYmICghZXhjbHVkZShrZXlzW2ldKSApKSB7CisgICAgICAgICAgICAgICAgc2F2ZU5hbWVzLmFkZChrZXlzW2ldKTsKKyAgICAgICAgICAgICAgICBzYXZlVmFsdWVzLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZUludGVybmFsKGtleXNbaV0sIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBhdHRyaWJ1dGUgY291bnQgYW5kIHRoZSBTZXJpYWxpemFibGUgYXR0cmlidXRlcworICAgICAgICBpbnQgbiA9IHNhdmVOYW1lcy5zaXplKCk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChuZXcgSW50ZWdlcihuKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QoKFN0cmluZykgc2F2ZU5hbWVzLmdldChpKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChzYXZlVmFsdWVzLmdldChpKSk7CisgICAgICAgICAgICAgICAgaWYgKG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5kZWJ1ZworICAgICAgICAgICAgICAgICAgICAgICAgKCIgIHN0b3JpbmcgYXR0cmlidXRlICciICsgc2F2ZU5hbWVzLmdldChpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiJyB3aXRoIHZhbHVlICciICsgc2F2ZVZhbHVlcy5nZXQoaSkgKyAiJyIpOworICAgICAgICAgICAgfSBjYXRjaCAoTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLndhcm4KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLm5vdFNlcmlhbGl6YWJsZSIsCisgICAgICAgICAgICAgICAgICAgICBzYXZlTmFtZXMuZ2V0KGkpLCBpZCksIGUpOworICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChOT1RfU0VSSUFMSVpFRCk7CisgICAgICAgICAgICAgICAgaWYgKG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5kZWJ1ZworICAgICAgICAgICAgICAgICAgICAgICAoIiAgc3RvcmluZyBhdHRyaWJ1dGUgJyIgKyBzYXZlTmFtZXMuZ2V0KGkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICInIHdpdGggdmFsdWUgTk9UX1NFUklBTElaRUQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFeGNsdWRlIGF0dHJpYnV0ZSB0aGF0IGNhbm5vdCBiZSBzZXJpYWxpemVkLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBhdHRyaWJ1dGUncyBuYW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXhjbHVkZShTdHJpbmcgbmFtZSl7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoZXhjbHVkZWRBdHRyaWJ1dGVzW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCB2b2lkIGV2YWx1YXRlSWZWYWxpZCgpIHsKKyAgICAgICAgLyoKKyAgICAgKiBJZiB0aGlzIHNlc3Npb24gaGFzIGV4cGlyZWQgb3IgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgZXhwaXJpbmcgb3IKKyAgICAgKiB3aWxsIG5ldmVyIGV4cGlyZSwgcmV0dXJuCisgICAgICovCisgICAgICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8IGV4cGlyaW5nIHx8IG1heEluYWN0aXZlSW50ZXJ2YWwgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlzVmFsaWQoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEZpcmUgY29udGFpbmVyIGV2ZW50cyBpZiB0aGUgQ29udGV4dCBpbXBsZW1lbnRhdGlvbiBpcyB0aGUKKyAgICAgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRvIGZpcmUgZXZlbnRzCisgICAgICogQHBhcmFtIHR5cGUgRXZlbnQgdHlwZQorICAgICAqIEBwYXJhbSBkYXRhIEV2ZW50IGRhdGEKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBldmVudCBmaXJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlQ29udGFpbmVyRXZlbnQoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUsIE9iamVjdCBkYXRhKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoISJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0Ii5lcXVhbHMKKyAgICAgICAgICAgIChjb250ZXh0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBDb250YWluZXIgZXZlbnRzIGFyZSBub3Qgc3VwcG9ydGVkCisgICAgICAgIH0KKyAgICAgICAgLy8gTk9URTogIFJhY2UgY29uZGl0aW9uIGlzIGhhcm1sZXNzLCBzbyBkbyBub3Qgc3luY2hyb25pemUKKyAgICAgICAgaWYgKGNvbnRhaW5lckV2ZW50TWV0aG9kID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lckV2ZW50TWV0aG9kID0KKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJmaXJlQ29udGFpbmVyRXZlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRXZlbnRUeXBlcyk7CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0IGNvbnRhaW5lckV2ZW50UGFyYW1zW10gPSBuZXcgT2JqZWN0WzJdOworICAgICAgICBjb250YWluZXJFdmVudFBhcmFtc1swXSA9IHR5cGU7CisgICAgICAgIGNvbnRhaW5lckV2ZW50UGFyYW1zWzFdID0gZGF0YTsKKyAgICAgICAgY29udGFpbmVyRXZlbnRNZXRob2QuaW52b2tlKGNvbnRleHQsIGNvbnRhaW5lckV2ZW50UGFyYW1zKTsKKworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKworICAgIC8qKgorICAgICAqIE5vdGlmeSBhbGwgc2Vzc2lvbiBldmVudCBsaXN0ZW5lcnMgdGhhdCBhIHBhcnRpY3VsYXIgZXZlbnQgaGFzCisgICAgICogb2NjdXJyZWQgZm9yIHRoaXMgU2Vzc2lvbi4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHBlcmZvcm1zCisgICAgICogdGhpcyBub3RpZmljYXRpb24gc3luY2hyb25vdXNseSB1c2luZyB0aGUgY2FsbGluZyB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlCisgICAgICogQHBhcmFtIGRhdGEgRXZlbnQgZGF0YQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpcmVTZXNzaW9uRXZlbnQoU3RyaW5nIHR5cGUsIE9iamVjdCBkYXRhKSB7CisgICAgICAgIGlmIChsaXN0ZW5lcnMuc2l6ZSgpIDwgMSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgU2Vzc2lvbkV2ZW50IGV2ZW50ID0gbmV3IFNlc3Npb25FdmVudCh0aGlzLCB0eXBlLCBkYXRhKTsKKyAgICAgICAgU2Vzc2lvbkxpc3RlbmVyIGxpc3RbXSA9IG5ldyBTZXNzaW9uTGlzdGVuZXJbMF07CisgICAgICAgIHN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7CisgICAgICAgICAgICBsaXN0ID0gKFNlc3Npb25MaXN0ZW5lcltdKSBsaXN0ZW5lcnMudG9BcnJheShsaXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKyl7CisgICAgICAgICAgICAoKFNlc3Npb25MaXN0ZW5lcikgbGlzdFtpXSkuc2Vzc2lvbkV2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCBjdXJyZW50bHkgZGVmaW5lZCBzZXNzaW9uIGF0dHJpYnV0ZXMKKyAgICAgKiBhcyBhbiBhcnJheSBvZiBTdHJpbmdzLiAgSWYgdGhlcmUgYXJlIG5vIGRlZmluZWQgYXR0cmlidXRlcywgYQorICAgICAqIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBrZXlzKCkgeworCisgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSBhdHRyaWJ1dGVzLmtleVNldCgpLnRvQXJyYXkoRU1QVFlfQVJSQVkpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBvYmplY3QgYm91bmQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgZnJvbSB0aGlzIHNlc3Npb24uICBJZgorICAgICAqIHRoZSBzZXNzaW9uIGRvZXMgbm90IGhhdmUgYW4gb2JqZWN0IGJvdW5kIHdpdGggdGhpcyBuYW1lLCB0aGlzIG1ldGhvZAorICAgICAqIGRvZXMgbm90aGluZy4KKyAgICAgKiA8cD4KKyAgICAgKiBBZnRlciB0aGlzIG1ldGhvZCBleGVjdXRlcywgYW5kIGlmIHRoZSBvYmplY3QgaW1wbGVtZW50cworICAgICAqIDxjb2RlPkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyPC9jb2RlPiwgdGhlIGNvbnRhaW5lciBjYWxscworICAgICAqIDxjb2RlPnZhbHVlVW5ib3VuZCgpPC9jb2RlPiBvbiB0aGUgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgb2JqZWN0IHRvIHJlbW92ZSBmcm9tIHRoaXMgc2Vzc2lvbi4KKyAgICAgKiBAcGFyYW0gbm90aWZ5IFNob3VsZCB3ZSBub3RpZnkgaW50ZXJlc3RlZCBsaXN0ZW5lcnMgdGhhdCB0aGlzCisgICAgICogIGF0dHJpYnV0ZSBpcyBiZWluZyByZW1vdmVkPworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUF0dHJpYnV0ZUludGVybmFsKFN0cmluZyBuYW1lLCBib29sZWFuIG5vdGlmeSkgeworCisgICAgICAgIC8vIFJlbW92ZSB0aGlzIGF0dHJpYnV0ZSBmcm9tIG91ciBjb2xsZWN0aW9uCisgICAgICAgIE9iamVjdCB2YWx1ZSA9IGF0dHJpYnV0ZXMucmVtb3ZlKG5hbWUpOworCisgICAgICAgIC8vIERvIHdlIG5lZWQgdG8gZG8gdmFsdWVVbmJvdW5kKCkgYW5kIGF0dHJpYnV0ZVJlbW92ZWQoKSBub3RpZmljYXRpb24/CisgICAgICAgIGlmICghbm90aWZ5IHx8ICh2YWx1ZSA9PSBudWxsKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FsbCB0aGUgdmFsdWVVbmJvdW5kKCkgbWV0aG9kIGlmIG5lY2Vzc2FyeQorICAgICAgICBIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCA9IG51bGw7CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyKSB7CisgICAgICAgICAgICBldmVudCA9IG5ldyBIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudChnZXRTZXNzaW9uKCksIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICgoSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIpIHZhbHVlKS52YWx1ZVVuYm91bmQoZXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm90aWZ5IGludGVyZXN0ZWQgYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzCisgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBtYW5hZ2VyLmdldENvbnRhaW5lcigpOworICAgICAgICBPYmplY3QgbGlzdGVuZXJzW10gPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcnMoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVycyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCEobGlzdGVuZXJzW2ldIGluc3RhbmNlb2YgSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcikpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBIdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAoSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZm9yZVNlc3Npb25BdHRyaWJ1dGVSZW1vdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0U2Vzc2lvbigpLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpc3RlbmVyLmF0dHJpYnV0ZVJlbW92ZWQoZXZlbnQpOworICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXJTZXNzaW9uQXR0cmlidXRlUmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXJTZXNzaW9uQXR0cmlidXRlUmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5hdHRyaWJ1dGVFdmVudCIpLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIENsYXNzCisKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgZHVtbXkgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPkh0dHBTZXNzaW9uQ29udGV4dDwvY29kZT4KKyAqIGludGVyZmFjZSwgdG8gY29uZm9ybSB0byB0aGUgcmVxdWlyZW1lbnQgdGhhdCBzdWNoIGFuIG9iamVjdCBiZSByZXR1cm5lZAorICogd2hlbiA8Y29kZT5IdHRwU2Vzc2lvbi5nZXRTZXNzaW9uQ29udGV4dCgpPC9jb2RlPiBpcyBjYWxsZWQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKgorICogQGRlcHJlY2F0ZWQgQXMgb2YgSmF2YSBTZXJ2bGV0IEFQSSAyLjEgd2l0aCBubyByZXBsYWNlbWVudC4gIFRoZQorICogIGludGVyZmFjZSB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGlzIEFQSS4KKyAqLworCitmaW5hbCBjbGFzcyBTdGFuZGFyZFNlc3Npb25Db250ZXh0IGltcGxlbWVudHMgSHR0cFNlc3Npb25Db250ZXh0IHsKKworCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgZHVtbXkgPSBuZXcgSGFzaE1hcCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXNzaW9uIGlkZW50aWZpZXJzIG9mIGFsbCBzZXNzaW9ucyBkZWZpbmVkCisgICAgICogd2l0aGluIHRoaXMgY29udGV4dC4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIEphdmEgU2VydmxldCBBUEkgMi4xIHdpdGggbm8gcmVwbGFjZW1lbnQuCisgICAgICogIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIGFuIGVtcHR5IDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPgorICAgICAqICBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgdGhlIEFQSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SWRzKCkgeworCisgICAgICAgIHJldHVybiAobmV3IEVudW1lcmF0b3IoZHVtbXkpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5IdHRwU2Vzc2lvbjwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBzZXNzaW9uIGlkZW50aWZpZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgU2Vzc2lvbiBpZGVudGlmaWVyIGZvciB3aGljaCB0byBsb29rIHVwIGEgc2Vzc2lvbgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgSmF2YSBTZXJ2bGV0IEFQSSAyLjEgd2l0aCBubyByZXBsYWNlbWVudC4KKyAgICAgKiAgVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gbnVsbCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEKKyAgICAgKiAgZnV0dXJlIHZlcnNpb24gb2YgdGhlIEFQSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbihTdHJpbmcgaWQpIHsKKworICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vU3RhbmRhcmRTZXNzaW9uRmFjYWRlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9TdGFuZGFyZFNlc3Npb25GYWNhZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzk0ZjNlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vU3RhbmRhcmRTZXNzaW9uRmFjYWRlLmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uOworCisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25Db250ZXh0OworCisKKy8qKgorICogRmFjYWRlIGZvciB0aGUgU3RhbmRhcmRTZXNzaW9uIG9iamVjdC4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFNlc3Npb25GYWNhZGUKKyAgICBpbXBsZW1lbnRzIEh0dHBTZXNzaW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzZXNzaW9uIGZhY2FkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhbmRhcmRTZXNzaW9uRmFjYWRlKFN0YW5kYXJkU2Vzc2lvbiBzZXNzaW9uKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuc2Vzc2lvbiA9IChIdHRwU2Vzc2lvbikgc2Vzc2lvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzZXNzaW9uIGZhY2FkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhbmRhcmRTZXNzaW9uRmFjYWRlKEh0dHBTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVkIHNlc3Npb24gb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSHR0cFNlc3Npb24gTWV0aG9kcworCisKKyAgICBwdWJsaWMgbG9uZyBnZXRDcmVhdGlvblRpbWUoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uLmdldENyZWF0aW9uVGltZSgpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0SWQoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBsb25nIGdldExhc3RBY2Nlc3NlZFRpbWUoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKKyAgICAgICAgLy8gRklYTUUgOiBGYWNhZGUgdGhpcyBvYmplY3QgPworICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0TWF4SW5hY3RpdmVJbnRlcnZhbChpbnQgaW50ZXJ2YWwpIHsKKyAgICAgICAgc2Vzc2lvbi5zZXRNYXhJbmFjdGl2ZUludGVydmFsKGludGVydmFsKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpOworICAgIH0KKworCisgICAgcHVibGljIEh0dHBTZXNzaW9uQ29udGV4dCBnZXRTZXNzaW9uQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0U2Vzc2lvbkNvbnRleHQoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uLmdldEF0dHJpYnV0ZShuYW1lKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0QXR0cmlidXRlKG5hbWUpOworICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeworICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlTmFtZXMoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uLmdldFZhbHVlTmFtZXMoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVmFsdWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICBzZXNzaW9uLmludmFsaWRhdGUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzTmV3KCkgeworICAgICAgICByZXR1cm4gc2Vzc2lvbi5pc05ldygpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9TdG9yZUJhc2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL1N0b3JlQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NzI3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9TdG9yZUJhc2UuamF2YQpAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uOworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0OworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5MaWZlY3ljbGVTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworCisvKioKKyAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBTdG9yZSBpbnRlcmZhY2UgdG8KKyAqIHN1cHBvcnQgbW9zdCBvZiB0aGUgZnVuY3Rpb25hbGl0eSByZXF1aXJlZCBieSBhIFN0b3JlLgorICoKKyAqIEBhdXRob3IgQmlwIFRoZWxpbgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIFN0b3JlQmFzZQorICAgIGltcGxlbWVudHMgTGlmZWN5Y2xlLCBTdG9yZSB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGluZm8gPSAiU3RvcmVCYXNlLzEuMCI7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIHRvIHJlZ2lzdGVyIGZvciB0aGlzIFN0b3JlLCB1c2VkIGZvciBsb2dnaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHN0b3JlTmFtZSA9ICJTdG9yZUJhc2UiOworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZCB5ZXQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVGhlIGxpZmVjeWNsZSBldmVudCBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlmZWN5Y2xlU3VwcG9ydCBsaWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlU3VwcG9ydCh0aGlzKTsKKworICAgIC8qKgorICAgICAqIFRoZSBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBzdXBwb3J0ID0gbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdNYW5hZ2VyIHNtID0gU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworICAgIC8qKgorICAgICAqIFRoZSBNYW5hZ2VyIHdpdGggd2hpY2ggdGhpcyBKREJDU3RvcmUgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFuYWdlciBtYW5hZ2VyOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGluZm8gZm9yIHRoaXMgU3RvcmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworICAgICAgICByZXR1cm4oaW5mbyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgZm9yIHRoaXMgU3RvcmUsIHVzZWQgZm9yIGxvZ2dpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdG9yZU5hbWUoKSB7CisgICAgICAgIHJldHVybihzdG9yZU5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBNYW5hZ2VyIHdpdGggd2hpY2ggdGhpcyBTdG9yZSBpcyBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIG5ld2x5IGFzc29jaWF0ZWQgTWFuYWdlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1hbmFnZXIoTWFuYWdlciBtYW5hZ2VyKSB7CisgICAgICAgIE1hbmFnZXIgb2xkTWFuYWdlciA9IHRoaXMubWFuYWdlcjsKKyAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm1hbmFnZXIiLCBvbGRNYW5hZ2VyLCB0aGlzLm1hbmFnZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTWFuYWdlciB3aXRoIHdoaWNoIHRoZSBTdG9yZSBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBNYW5hZ2VyIGdldE1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybih0aGlzLm1hbmFnZXIpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGxpZmVjeWNsZS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlmZWN5Y2xlLiBJZiB0aGlzIAorICAgICAqIExpZmVjeWNsZSBoYXMgbm8gbGlzdGVuZXJzIHJlZ2lzdGVyZWQsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUxpc3RlbmVyW10gZmluZExpZmVjeWNsZUxpc3RlbmVycygpIHsKKworICAgICAgICByZXR1cm4gbGlmZWN5Y2xlLmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIGEgdmFsdWUgb2YgdHlwZSAnUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcicKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3VwcG9ydC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHN1cHBvcnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgb3VyIGJhY2tncm91bmQgcmVhcGVyIHRocmVhZCB0byBjaGVjayBpZiBTZXNzaW9ucworICAgICAqIHNhdmVkIGluIG91ciBzdG9yZSBhcmUgc3ViamVjdCBvZiBiZWluZyBleHBpcmVkLiBJZiBzbyBleHBpcmUKKyAgICAgKiB0aGUgU2Vzc2lvbiBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIFN0b3JlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvY2Vzc0V4cGlyZXMoKSB7CisgICAgICAgIFN0cmluZ1tdIGtleXMgPSBudWxsOworCisgICAgICAgICBpZighc3RhcnRlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGtleXMgPSBrZXlzKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3IoIkVycm9yIGdldHRpbmcga2V5cyIsIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZGVidWcoZ2V0U3RvcmVOYW1lKCkrICI6IHByb2Nlc3NFeHBpcmVzIGNoZWNrIG51bWJlciBvZiAiICsga2V5cy5sZW5ndGggKyAiIHNlc3Npb25zIiApOworICAgICAgICB9CisgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdGFuZGFyZFNlc3Npb24gc2Vzc2lvbiA9IChTdGFuZGFyZFNlc3Npb24pIGxvYWQoa2V5c1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24uaXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZGVidWcoZ2V0U3RvcmVOYW1lKCkrICI6IHByb2Nlc3NFeHBpcmVzIGV4cGlyZSBzdG9yZSBzZXNzaW9uICIgKyBrZXlzW2ldICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggKCAoUGVyc2lzdGVudE1hbmFnZXJCYXNlKSBtYW5hZ2VyKS5pc0xvYWRlZCgga2V5c1tpXSApKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlY3ljbGUgb2xkIGJhY2t1cCBzZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24ucmVjeWNsZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGV4cGlyZSBzd2FwcGVkIG91dCBzZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZXhwaXJlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlbW92ZShzZXNzaW9uLmdldElkSW50ZXJuYWwoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3IoIlNlc3Npb246ICIra2V5c1tpXSsiOyAiLCBlKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmUoa2V5c1tpXSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5lcnJvcigiRXJyb3IgcmVtb3Zpbmcga2V5IiwgZTIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRocmVhZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgPGNvZGU+Y29uZmlndXJlKCk8L2NvZGU+LAorICAgICAqIGFuZCBiZWZvcmUgYW55IG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgY29tcG9uZW50IGFyZSB1dGlsaXplZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IHByZXZlbnRzIHRoaXMgY29tcG9uZW50IGZyb20gYmVpbmcgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmIChzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoZ2V0U3RvcmVOYW1lKCkrIi5hbHJlYWR5U3RhcnRlZCIpKTsKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCwgbnVsbCk7CisgICAgICAgIHN0YXJ0ZWQgPSB0cnVlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHRlcm1pbmF0ZSB0aGUgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB0aGUgbGFzdCBvbmUgY2FsbGVkIG9uIGEgZ2l2ZW4KKyAgICAgKiBpbnN0YW5jZSBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAoIXN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZyhnZXRTdG9yZU5hbWUoKSsiLm5vdFN0YXJ0ZWQiKSk7CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RPUF9FVkVOVCwgbnVsbCk7CisgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmVjMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApAQCAtMCwwICsxLDMwMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8bWJlYW5zLWRlc2NyaXB0b3JzPgorCisgIDxtYmVhbiAgICAgICAgIG5hbWU9IlN0YW5kYXJkTWFuYWdlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1hbmFnZXIgaW50ZXJmYWNlIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iTWFuYWdlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlN0YW5kYXJkTWFuYWdlciI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWxnb3JpdGhtIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtIHRvIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nCisgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gaWRlbnRpZmllcnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJhbmRvbUZpbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZpbGUgc291cmNlIG9mIHJhbmRvbSAtIC9kZXYvdXJhbmRvbSBvciBhIHBpcGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkaXN0cmlidXRhYmxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGlzdHJpYnV0YWJsZSBmbGFnIGZvciBTZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgTWFuYWdlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImVudHJvcHkiCisgICAgICAgICAgZGVzY3JpcHRpb249IkEgU3RyaW5nIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB1c2VkIHRvIGluY3JlYXNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5IG9mIHRoZSBpbml0aWFsaXphdGlvbiBvZiBvdXIgcmFuZG9tIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhBY3RpdmVTZXNzaW9ucyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBTZXNzaW9ucyBhbGxvd2VkLCBvciAtMQorICAgICAgICAgICAgICAgICAgICAgICBmb3Igbm8gbGltaXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heEluYWN0aXZlSW50ZXJ2YWwiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkZWZhdWx0IG1heGltdW0gaW5hY3RpdmUgaW50ZXJ2YWwgZm9yIFNlc3Npb25zCisgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgYnkgdGhpcyBNYW5hZ2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvY2Vzc0V4cGlyZXNGcmVxdWVuY3kiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGZyZXF1ZW5jeSBvZiB0aGUgbWFuYWdlciBjaGVja3MgKGV4cGlyYXRpb24gYW5kIHBhc3NpdmF0aW9uKSIKKyAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNlc3Npb25JZExlbmd0aCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHNlc3Npb24gaWQgbGVuZ3RoIChpbiBieXRlcykgb2YgU2Vzc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBieSB0aGlzIE1hbmFnZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkZXNjcmlwdGl2ZSBuYW1lIG9mIHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAoZm9yIGxvZ2dpbmcpIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InBhdGhuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJQYXRoIG5hbWUgb2YgdGhlIGRpc2sgZmlsZSBpbiB3aGljaCBhY3RpdmUgc2Vzc2lvbnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhY3RpdmVTZXNzaW9ucyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyBhdCB0aGlzIG1vbWVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzZXNzaW9uQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVG90YWwgbnVtYmVyIG9mIHNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyBtYW5hZ2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4QWN0aXZlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMgc28gZmFyIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic2Vzc2lvbk1heEFsaXZlVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTG9uZ2VzdCB0aW1lIGFuIGV4cGlyZWQgc2Vzc2lvbiBoYWQgYmVlbiBhbGl2ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNlc3Npb25BdmVyYWdlQWxpdmVUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJBdmVyYWdlIHRpbWUgYW4gZXhwaXJlZCBzZXNzaW9uIGhhZCBiZWVuIGFsaXZlIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVqZWN0ZWRTZXNzaW9ucyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTnVtYmVyIG9mIHNlc3Npb25zIHdlIHJlamVjdGVkIGR1ZSB0byBtYXhBY3RpdmUgYmVlaW5nIHJlYWNoZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJleHBpcmVkU2Vzc2lvbnMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik51bWJlciBvZiBzZXNzaW9ucyB0aGF0IGV4cGlyZWQgKCBkb2Vzbid0IGluY2x1ZGUgZXhwbGljaXQgaW52YWxpZGF0aW9ucyApIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRpbWUgc3BlbnQgZG9pbmcgaG91c2VrZWVwaW5nIGFuZCBleHBpcmF0aW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImR1cGxpY2F0ZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik51bWJlciBvZiBkdXBsaWNhdGVkIHNlc3Npb24gaWRzIGdlbmVyYXRlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAvPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9Imxpc3RTZXNzaW9uSWRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXR1cm4gdGhlIGxpc3Qgb2YgYWN0aXZlIHNlc3Npb24gaWRzIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImdldFNlc3Npb25BdHRyaWJ1dGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJldHVybiBhIHNlc3Npb24gYXR0cmlidXRlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJzZXNzaW9uSWQiCisgICAgICAgICAgZGVzY3JpcHRpb249IklkIG9mIHRoZSBzZXNzaW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImtleSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ia2V5IG9mIHRoZSBhdHRyaWJ1dGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJnZXRTZXNzaW9uIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXR1cm4gYWxsIHNlc3Npb25zIGF0dHJpYnV0ZXMgYW5kIHZhbHVlcyIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLnV0aWwuSGFzaE1hcCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InNlc3Npb25JZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSWQgb2YgdGhlIHNlc3Npb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJleHBpcmVTZXNzaW9uIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJFeHBpcmUgYSBzZXNzaW9uIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJzZXNzaW9uSWQiCisgICAgICAgICAgZGVzY3JpcHRpb249IklkIG9mIHRoZSBzZXNzaW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iZ2V0TGFzdEFjY2Vzc2VkVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iR2V0IHRoZSBsYXN0IGFjY2VzcyB0aW1lIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJzZXNzaW9uSWQiCisgICAgICAgICAgZGVzY3JpcHRpb249IklkIG9mIHRoZSBzZXNzaW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gICAgICAgICBuYW1lPSJQZXJzaXN0ZW50TWFuYWdlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUGVyc2lzdGVudCBNYW5hZ2VyIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iTWFuYWdlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlBlcnNpc3RlbnRNYW5hZ2VyIj4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhbGdvcml0aG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gdG8gYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBpZGVudGlmaWVycyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJhbmRvbUZpbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZpbGUgc291cmNlIG9mIHJhbmRvbSAtIC9kZXYvdXJhbmRvbSBvciBhIHBpcGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkaXN0cmlidXRhYmxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGlzdHJpYnV0YWJsZSBmbGFnIGZvciBTZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgTWFuYWdlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImVudHJvcHkiCisgICAgICAgICAgZGVzY3JpcHRpb249IkEgU3RyaW5nIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB1c2VkIHRvIGluY3JlYXNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5IG9mIHRoZSBpbml0aWFsaXphdGlvbiBvZiBvdXIgcmFuZG9tIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWFuYWdlZFJlc291cmNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWFuYWdlZCByZXNvdXJjZSB0aGlzIE1CZWFuIGlzIGFzc29jaWF0ZWQgd2l0aCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heEFjdGl2ZVNlc3Npb25zIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIFNlc3Npb25zIGFsbG93ZWQsIG9yIC0xCisgICAgICAgICAgICAgICAgICAgICAgIGZvciBubyBsaW1pdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4SW5hY3RpdmVJbnRlcnZhbCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGRlZmF1bHQgbWF4aW11bSBpbmFjdGl2ZSBpbnRlcnZhbCBmb3IgU2Vzc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBieSB0aGlzIE1hbmFnZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgICAgICAgICAgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9InByb2Nlc3NFeHBpcmVzRnJlcXVlbmN5IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBmcmVxdWVuY3kgb2YgdGhlIG1hbmFnZXIgY2hlY2tzIChleHBpcmF0aW9uIGFuZCBwYXNzaXZhdGlvbikiCisgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzZXNzaW9uSWRMZW5ndGgiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBzZXNzaW9uIGlkIGxlbmd0aCAoaW4gYnl0ZXMpIG9mIFNlc3Npb25zCisgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgYnkgdGhpcyBNYW5hZ2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGVzY3JpcHRpdmUgbmFtZSBvZiB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgKGZvciBsb2dnaW5nKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwYXRobmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUGF0aCBuYW1lIG9mIHRoZSBkaXNrIGZpbGUgaW4gd2hpY2ggYWN0aXZlIHNlc3Npb25zIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWN0aXZlU2Vzc2lvbnMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMgYXQgdGhpcyBtb21lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIgCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic2Vzc2lvbkNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRvdGFsIG51bWJlciBvZiBzZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgbWFuYWdlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heEFjdGl2ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIHNlc3Npb25zIHNvIGZhciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heElkbGVCYWNrdXAiCisgICAgICAgICAgZGVzY3JpcHRpb249IkhvdyBsb25nIGEgc2Vzc2lvbiBtdXN0IGJlIGlkbGUgYmVmb3JlIGl0IHNob3VsZCBiZSBiYWNrZWQgdXAiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtaW5JZGxlU3dhcCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTWluaW11bSB0aW1lIGEgc2Vzc2lvbiBtdXN0IGJlIGlkbGUgYmVmb3JlIGl0IGlzIHN3YXBwZWQgdG8gZGlzayIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heElkbGVTd2FwIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWF4aW11bSB0aW1lIGEgc2Vzc2lvbiBtYXkgYmUgaWRsZSBiZWZvcmUgaXQgc2hvdWxkIGJlIHN3YXBwZWQgdG8gZmlsZSBqdXN0IG9uIGdlbmVyYWwgcHJpbmNpcGxlIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVqZWN0ZWRTZXNzaW9ucyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTnVtYmVyIG9mIHNlc3Npb25zIHdlIHJlamVjdGVkIGR1ZSB0byBtYXhBY3RpdmUgYmVlaW5nIHJlYWNoZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJleHBpcmVkU2Vzc2lvbnMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik51bWJlciBvZiBzZXNzaW9ucyB0aGF0IGV4cGlyZWQgKCBkb2Vzbid0IGluY2x1ZGUgZXhwbGljaXQgaW52YWxpZGF0aW9ucyApIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRpbWUgc3BlbnQgZG9pbmcgaG91c2VrZWVwaW5nIGFuZCBleHBpcmF0aW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImR1cGxpY2F0ZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik51bWJlciBvZiBkdXBsaWNhdGVkIHNlc3Npb24gaWRzIGdlbmVyYXRlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAvPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9Imxpc3RTZXNzaW9uSWRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXR1cm4gdGhlIGxpc3Qgb2YgYWN0aXZlIHNlc3Npb24gaWRzIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImdldFNlc3Npb25BdHRyaWJ1dGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJldHVybiBhIHNlc3Npb24gYXR0cmlidXRlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJzZXNzaW9uSWQiCisgICAgICAgICAgZGVzY3JpcHRpb249IklkIG9mIHRoZSBzZXNzaW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImtleSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ia2V5IG9mIHRoZSBhdHRyaWJ1dGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJnZXRTZXNzaW9uIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzZXNzaW9uIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEudXRpbC5IYXNoTWFwIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2Vzc2lvbklkIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJJZCBvZiB0aGUgc2Vzc2lvbiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImV4cGlyZVNlc3Npb24iCisgICAgICAgICAgZGVzY3JpcHRpb249IkV4cGlyZSBhIHNlc3Npb24iCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InNlc3Npb25JZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSWQgb2YgdGhlIHNlc3Npb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJnZXRMYXN0QWNjZXNzZWRUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJHZXQgdGhlIGxhc3QgYWNjZXNzIHRpbWUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InNlc3Npb25JZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSWQgb2YgdGhlIHNlc3Npb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICA8L21iZWFuPgorCis8L21iZWFucy1kZXNjcmlwdG9ycz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL3BhY2thZ2UuaHRtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzNkOWE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsNTIgQEAKKzxib2R5PgorCis8cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIHN0YW5kYXJkIDxjb2RlPk1hbmFnZXI8L2NvZGU+IGFuZAorPGNvZGU+U2Vzc2lvbjwvY29kZT4gaW1wbGVtZW50YXRpb25zIHRoYXQgcmVwcmVzZW50IHRoZSBjb2xsZWN0aW9uIG9mCithY3RpdmUgc2Vzc2lvbnMgYW5kIHRoZSBpbmRpdmlkdWFsIHNlc3Npb25zIHRoZW1zZWx2ZXMsIHJlc3BlY3RpdmVseSwKK3RoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIDxjb2RlPkNvbnRleHQ8L2NvZGU+LiAgQWRkaXRpb25hbCBpbXBsZW1lbnRhdGlvbnMKK29mIHRoZSA8Y29kZT5NYW5hZ2VyPC9jb2RlPiBpbnRlcmZhY2UgY2FuIGJlIGJhc2VkIHVwb24gdGhlIHN1cHBsaWVkCitjb252ZW5pZW5jZSBiYXNlIGNsYXNzICg8Y29kZT5NYW5hZ2VyQmFzZTwvY29kZT4pLCBpZiBkZXNpcmVkLiAgRGlmZmVyZW50CitpbXBsZW1lbnRhdGlvbnMgb2YgPGNvZGU+U2Vzc2lvbjwvY29kZT4gYXJlIHBvc3NpYmxlLCBidXQgYSBuZWVkIGZvcgorZnVuY3Rpb25hbGl0eSBiZXlvbmQgd2hhdCBpcyBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24KKyg8Y29kZT5TdGFuZGFyZFNlc3Npb248L2NvZGU+KSBpcyBub3QgZXhwZWN0ZWQuPC9wPgorCis8cD5UaGUgY29udmVuaWVuY2UgPGNvZGU+TWFuYWdlckJhc2U8L2NvZGU+IGJhc2UgY2xhc3MgaXMgY29uZmlndXJlZCBieQorc2V0dGluZyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6PC9wPgorPHVsPgorPGxpPjxiPmFsZ29yaXRobTwvYj4gLSBNZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gdG8gYmUgdXNlZCB3aGVuCisgICAgZ2VuZXJhdGluZyBzZXNzaW9uIGlkZW50aWZpZXJzLiAgVGhpcyBtdXN0IGJlIHRoZSBuYW1lIG9mIGFuCisgICAgYWxnb3JpdGhtIHN1cHBvcnRlZCBieSB0aGUgPGNvZGU+amF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0PC9jb2RlPgorICAgIGNsYXNzIG9uIHlvdXIgcGxhdGZvcm0uICBbREVGQVVMVF9BTEdPUklUSE1dPC9saT4KKzxsaT48Yj5kZWJ1ZzwvYj4gLSBEZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIGZvciB0aGlzIGNvbXBvbmVudC4gWzBdPC9saT4KKzxsaT48Yj5kaXN0cmlidXRhYmxlPC9iPiAtIEhhcyB0aGUgd2ViIGFwcGxpY2F0aW9uIHdlIGFyZSBhc3NvY2lhdGVkIHdpdGgKKyAgICBiZWVuIG1hcmtlZCBhcyAiZGlzdHJpYnV0YWJsZSI/ICBJZiBpdCBoYXMsIGF0dGVtcHRzIHRvIGFkZCBvciByZXBsYWNlCisgICAgYSBzZXNzaW9uIGF0dHJpYnV0ZSBvYmplY3QgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlCisgICAgPGNvZGU+amF2YS5pby5TZXJpYWxpemFibGU8L2NvZGU+IGludGVyZmFjZSB3aWxsIGJlIHJlamVjdGVkLgorICAgIFtmYWxzZV08L2xpPgorPGxpPjxiPmVudHJvcHk8L2I+IC0gQSBzdHJpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHRoYXQgaXMgdXNlZCB0bworICAgIGluY3JlYXNlIHRoZSBlbnRyb3B5IG9mIHRoZSBzZWVkaW5nIG9mIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgIHVzZWQgaW4gY3JlYXRpb24gb2Ygc2Vzc2lvbiBpZGVudGlmaWVycy4gIFtOT05FXTwvbGk+Cis8bGk+PGI+bWF4SW5hY3RpdmVJbnRlcnZhbDwvYj4gLSBUaGUgZGVmYXVsdCBtYXhpbXVtIGluYWN0aXZlIGludGVydmFsLAorICAgIGluIG1pbnV0ZXMsIGZvciBzZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgTWFuYWdlci4gIFRoZSBzdGFuZGFyZAorICAgIGltcGxlbWVudGF0aW9uIGF1dG9tYXRpY2FsbHkgdXBkYXRlcyB0aGlzIHZhbHVlIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uCisgICAgc2V0dGluZ3MgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBbNjBdPC9saT4KKzxsaT48Yj5yYW5kb21DbGFzczwvYj4gLSBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgIHRvIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBzZXNzaW9uIGlkZW50aWZpZXJzIGZvciB0aGlzIE1hbmFnZXIuCisgICAgW2phdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tXTwvbGk+Cis8L3VsPgorCis8cD5UaGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPk1hbmFnZXI8L2NvZGU+IGludGVyZmFjZQorKDxjb2RlPlN0YW5kYXJkTWFuYWdlcjwvY29kZT4pIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uCitwcm9wZXJ0aWVzOjwvcD4KKzx1bD4KKzxsaT48Yj5jaGVja0ludGVydmFsPC9iPiAtIFRoZSBpbnRlcnZhbCwgaW4gc2Vjb25kcywgYmV0d2VlbiBjaGVja3MgZm9yCisgICAgc2Vzc2lvbnMgdGhhdCBoYXZlIGV4cGlyZWQgYW5kIHNob3VsZCBiZSBpbnZhbGlkYXRlZC4gIFs2MF08L2xpPgorPGxpPjxiPm1heEFjdGl2ZVNlc3Npb25zPC9iPiAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMgdGhhdAorICAgIHdpbGwgYmUgYWxsb3dlZCwgb3IgLTEgZm9yIG5vIGxpbWl0LiAgWy0xXTwvbGk+Cis8bGk+PGI+cGF0aG5hbWU8L2I+IC0gUGF0aG5hbWUgdG8gdGhlIGZpbGUgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHNlc3Npb24KKyAgICBkYXRhIHBlcnNpc3RlbnRseSBhY3Jvc3MgY29udGFpbmVyIHJlc3RhcnRzLiAgSWYgdGhpcyBwYXRobmFtZSBpcyByZWxhdGl2ZSwKKyAgICBpdCBpcyByZXNvbHZlZCBhZ2FpbnN0IHRoZSB0ZW1wb3Jhcnkgd29ya2luZyBkaXJlY3RvcnkgcHJvdmlkZWQgYnkgb3VyCisgICAgYXNzb2NpYXRlZCBDb250ZXh0LCBpZiBhbnkuICBbInNlc3Npb25zLnNlciJdPC9saT4KKzwvdWw+CisKKzwvYm9keT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvQnl0ZUFycmF5U2VydmxldE91dHB1dFN0cmVhbS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9CeXRlQXJyYXlTZXJ2bGV0T3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2YzMzNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvQnl0ZUFycmF5U2VydmxldE91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3NpOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworCisKKy8qKgorICogQ2xhc3MgdGhhdCBleHRlbmRzIFNlcnZsZXRPdXB1dFN0cmVhbSwgdXNlZCBhcyBhIHdyYXBwZXIgZnJvbSB3aXRoaW4KKyAqIDxjb2RlPlNzaUluY2x1ZGU8L2NvZGU+CisgKgorICogQGF1dGhvciBCaXAgVGhlbGluCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqIEBzZWUgU2VydmxldE91dHB1dFN0cmVhbSBhbmQgQnl0ZUFycmF5T3V0cHV0U3RyZWFtCisgKi8KK3B1YmxpYyBjbGFzcyBCeXRlQXJyYXlTZXJ2bGV0T3V0cHV0U3RyZWFtIGV4dGVuZHMgU2VydmxldE91dHB1dFN0cmVhbSB7CisgICAgLyoqCisgICAgICogT3VyIGJ1ZmZlciB0byBob2xkIHRoZSBzdHJlYW0uCisgICAgICovCisgICAgcHJvdGVjdGVkIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgU2VydmxldE91dHB1dFN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnl0ZUFycmF5U2VydmxldE91dHB1dFN0cmVhbSgpIHsKKyAgICAgICAgYnVmID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgYnl0ZSBhcnJheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIHRvQnl0ZUFycmF5KCkgeworICAgICAgICByZXR1cm4gYnVmLnRvQnl0ZUFycmF5KCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0byBvdXIgYnVmZmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGIgVGhlIHBhcmFtZXRlciB0byB3cml0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB7CisgICAgICAgIGJ1Zi53cml0ZShiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL0V4cHJlc3Npb25QYXJzZVRyZWUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvRXhwcmVzc2lvblBhcnNlVHJlZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMjhmNDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL0V4cHJlc3Npb25QYXJzZVRyZWUuamF2YQpAQCAtMCwwICsxLDM4MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBMaWNlbnNlZCB1bmRlciB0aGUKKyAqIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlCisgKiBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzCisgKiBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlCisgKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3NpOworCisKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisvKioKKyAqIFJlcHJlc2VudHMgYSBwYXJzZWQgZXhwcmVzc2lvbi4KKyAqIAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogQGF1dGhvciBQYXVsIFNwZWVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeHByZXNzaW9uUGFyc2VUcmVlIHsKKyAgICAvKioKKyAgICAgKiBDb250YWlucyB0aGUgY3VycmVudCBzZXQgb2YgY29tcGxldGVkIG5vZGVzLiBUaGlzIGlzIGEgd29ya3NwYWNlIGZvciB0aGUKKyAgICAgKiBwYXJzZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBMaW5rZWRMaXN0IG5vZGVTdGFjayA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgLyoqCisgICAgICogQ29udGFpbnMgb3BlcmF0b3Igbm9kZXMgdGhhdCBkb24ndCB5ZXQgaGF2ZSB2YWx1ZXMuIFRoaXMgaXMgYSB3b3Jrc3BhY2UKKyAgICAgKiBmb3IgdGhlIHBhcnNlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpbmtlZExpc3Qgb3BwU3RhY2sgPSBuZXcgTGlua2VkTGlzdCgpOworICAgIC8qKgorICAgICAqIFRoZSByb290IG5vZGUgYWZ0ZXIgdGhlIGV4cHJlc3Npb24gaGFzIGJlZW4gcGFyc2VkLgorICAgICAqLworICAgIHByaXZhdGUgTm9kZSByb290OworICAgIC8qKgorICAgICAqIFRoZSBTU0lNZWRpYXRvciB0byB1c2Ugd2hlbiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNTSU1lZGlhdG9yIHNzaU1lZGlhdG9yOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHBhcnNlIHRyZWUgZm9yIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwcmVzc2lvblBhcnNlVHJlZShTdHJpbmcgZXhwciwgU1NJTWVkaWF0b3Igc3NpTWVkaWF0b3IpCisgICAgICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLnNzaU1lZGlhdG9yID0gc3NpTWVkaWF0b3I7CisgICAgICAgIHBhcnNlRXhwcmVzc2lvbihleHByKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlcyB0aGUgdHJlZSBhbmQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBUaGUgc3BlY2lmaWVkIFNTSU1lZGlhdG9yCisgICAgICogaXMgdXNlZCB0byByZXNvbHZlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVUcmVlKCkgeworICAgICAgICByZXR1cm4gcm9vdC5ldmFsdWF0ZSgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHVzaGVzIGEgbmV3IG9wZXJhdG9yIG9udG8gdGhlIG9wcCBzdGFjaywgcmVzb2x2aW5nIGV4aXN0aW5nIG9wcHMgYXMKKyAgICAgKiBuZWVkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHB1c2hPcHAoT3BwTm9kZSBub2RlKSB7CisgICAgICAgIC8vIElmIG5vZGUgaXMgbnVsbCB0aGVuIGl0J3MganVzdCBhIGdyb3VwIG1hcmtlcgorICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICBvcHBTdGFjay5hZGQoMCwgbm9kZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGlmIChvcHBTdGFjay5zaXplKCkgPT0gMCkgYnJlYWs7CisgICAgICAgICAgICBPcHBOb2RlIHRvcCA9IChPcHBOb2RlKW9wcFN0YWNrLmdldCgwKTsKKyAgICAgICAgICAgIC8vIElmIHRoZSB0b3AgaXMgYSBzcGFjZXIgdGhlbiBkb24ndCBwb3AKKyAgICAgICAgICAgIC8vIGFueXRoaW5nCisgICAgICAgICAgICBpZiAodG9wID09IG51bGwpIGJyZWFrOworICAgICAgICAgICAgLy8gSWYgdGhlIHRvcCBub2RlIGhhcyBhIGxvd2VyIHByZWNlZGVuY2UgdGhlbgorICAgICAgICAgICAgLy8gbGV0IGl0IHN0YXkKKyAgICAgICAgICAgIGlmICh0b3AuZ2V0UHJlY2VkZW5jZSgpIDwgbm9kZS5nZXRQcmVjZWRlbmNlKCkpIGJyZWFrOworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSB0b3Agbm9kZQorICAgICAgICAgICAgb3BwU3RhY2sucmVtb3ZlKDApOworICAgICAgICAgICAgLy8gTGV0IGl0IGZpbGwgaXRzIGJyYW5jaGVzCisgICAgICAgICAgICB0b3AucG9wVmFsdWVzKG5vZGVTdGFjayk7CisgICAgICAgICAgICAvLyBTdGljayBpdCBvbiB0aGUgcmVzb2x2ZWQgbm9kZSBzdGFjaworICAgICAgICAgICAgbm9kZVN0YWNrLmFkZCgwLCB0b3ApOworICAgICAgICB9CisgICAgICAgIC8vIEFkZCB0aGUgbmV3IG5vZGUgdG8gdGhlIG9wcCBzdGFjaworICAgICAgICBvcHBTdGFjay5hZGQoMCwgbm9kZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlcyBhbGwgcGVuZGluZyBvcHAgbm9kZXMgb24gdGhlIHN0YWNrIHVudGlsIHRoZSBuZXh0IGdyb3VwIG1hcmtlcgorICAgICAqIGlzIHJlYWNoZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVHcm91cCgpIHsKKyAgICAgICAgT3BwTm9kZSB0b3AgPSBudWxsOworICAgICAgICB3aGlsZSAoKHRvcCA9IChPcHBOb2RlKW9wcFN0YWNrLnJlbW92ZSgwKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTGV0IGl0IGZpbGwgaXRzIGJyYW5jaGVzCisgICAgICAgICAgICB0b3AucG9wVmFsdWVzKG5vZGVTdGFjayk7CisgICAgICAgICAgICAvLyBTdGljayBpdCBvbiB0aGUgcmVzb2x2ZWQgbm9kZSBzdGFjaworICAgICAgICAgICAgbm9kZVN0YWNrLmFkZCgwLCB0b3ApOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBleHByZXNzaW9uIGludG8gYSB0cmVlIG9mIHBhcnNlIG5vZGVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZUV4cHJlc3Npb24oU3RyaW5nIGV4cHIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ05vZGUgY3VyclN0cmluZ05vZGUgPSBudWxsOworICAgICAgICAvLyBXZSBjaGVhdCBhIGxpdHRsZSBhbmQgc3RhcnQgYW4gYXJ0aWZpY2lhbAorICAgICAgICAvLyBncm91cCByaWdodCBhd2F5LiBJdCBtYWtlcyBmaW5pc2hpbmcgZWFzaWVyLgorICAgICAgICBwdXNoT3BwKG51bGwpOworICAgICAgICBFeHByZXNzaW9uVG9rZW5pemVyIGV0ID0gbmV3IEV4cHJlc3Npb25Ub2tlbml6ZXIoZXhwcik7CisgICAgICAgIHdoaWxlIChldC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIGludCB0b2tlbiA9IGV0Lm5leHRUb2tlbigpOworICAgICAgICAgICAgaWYgKHRva2VuICE9IEV4cHJlc3Npb25Ub2tlbml6ZXIuVE9LRU5fU1RSSU5HKQorICAgICAgICAgICAgICAgIGN1cnJTdHJpbmdOb2RlID0gbnVsbDsKKyAgICAgICAgICAgIHN3aXRjaCAodG9rZW4pIHsKKyAgICAgICAgICAgICAgICBjYXNlIEV4cHJlc3Npb25Ub2tlbml6ZXIuVE9LRU5fU1RSSU5HIDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJTdHJpbmdOb2RlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJTdHJpbmdOb2RlID0gbmV3IFN0cmluZ05vZGUoZXQuZ2V0VG9rZW5WYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVTdGFjay5hZGQoMCwgY3VyclN0cmluZ05vZGUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRvIHRoZSBleGlzdGluZworICAgICAgICAgICAgICAgICAgICAgICAgY3VyclN0cmluZ05vZGUudmFsdWUuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyU3RyaW5nTm9kZS52YWx1ZS5hcHBlbmQoZXQuZ2V0VG9rZW5WYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEV4cHJlc3Npb25Ub2tlbml6ZXIuVE9LRU5fQU5EIDoKKyAgICAgICAgICAgICAgICAgICAgcHVzaE9wcChuZXcgQW5kTm9kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFeHByZXNzaW9uVG9rZW5pemVyLlRPS0VOX09SIDoKKyAgICAgICAgICAgICAgICAgICAgcHVzaE9wcChuZXcgT3JOb2RlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEV4cHJlc3Npb25Ub2tlbml6ZXIuVE9LRU5fTk9UIDoKKyAgICAgICAgICAgICAgICAgICAgcHVzaE9wcChuZXcgTm90Tm9kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFeHByZXNzaW9uVG9rZW5pemVyLlRPS0VOX0VRIDoKKyAgICAgICAgICAgICAgICAgICAgcHVzaE9wcChuZXcgRXF1YWxOb2RlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEV4cHJlc3Npb25Ub2tlbml6ZXIuVE9LRU5fTk9UX0VRIDoKKyAgICAgICAgICAgICAgICAgICAgcHVzaE9wcChuZXcgTm90Tm9kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gU25lYWsgdGhlIHJlZ3VsYXIgbm9kZSBpbi4gVGhlIE5PVCB3aWxsCisgICAgICAgICAgICAgICAgICAgIC8vIGJlIHJlc29sdmVkIHdoZW4gdGhlIG5leHQgb3BwIGNvbWVzIGFsb25nLgorICAgICAgICAgICAgICAgICAgICBvcHBTdGFjay5hZGQoMCwgbmV3IEVxdWFsTm9kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFeHByZXNzaW9uVG9rZW5pemVyLlRPS0VOX1JCUkFDRSA6CisgICAgICAgICAgICAgICAgICAgIC8vIENsb3Nlb3V0IHRoZSBjdXJyZW50IGdyb3VwCisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVHcm91cCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEV4cHJlc3Npb25Ub2tlbml6ZXIuVE9LRU5fTEJSQUNFIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gUHVzaCBhIGdyb3VwIG1hcmtlcgorICAgICAgICAgICAgICAgICAgICBwdXNoT3BwKG51bGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEV4cHJlc3Npb25Ub2tlbml6ZXIuVE9LRU5fR0UgOgorICAgICAgICAgICAgICAgICAgICBwdXNoT3BwKG5ldyBOb3ROb2RlKCkpOworICAgICAgICAgICAgICAgICAgICAvLyBTaW1pbGFyIHN0YXRlZ3kgdG8gTk9UX0VRIGFib3ZlLCBleGNlcHQgdGhpcworICAgICAgICAgICAgICAgICAgICAvLyBpcyBOT1QgbGVzcyB0aGFuCisgICAgICAgICAgICAgICAgICAgIG9wcFN0YWNrLmFkZCgwLCBuZXcgTGVzc1RoYW5Ob2RlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEV4cHJlc3Npb25Ub2tlbml6ZXIuVE9LRU5fTEUgOgorICAgICAgICAgICAgICAgICAgICBwdXNoT3BwKG5ldyBOb3ROb2RlKCkpOworICAgICAgICAgICAgICAgICAgICAvLyBTaW1pbGFyIHN0YXRlZ3kgdG8gTk9UX0VRIGFib3ZlLCBleGNlcHQgdGhpcworICAgICAgICAgICAgICAgICAgICAvLyBpcyBOT1QgZ3JlYXRlciB0aGFuCisgICAgICAgICAgICAgICAgICAgIG9wcFN0YWNrLmFkZCgwLCBuZXcgR3JlYXRlclRoYW5Ob2RlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEV4cHJlc3Npb25Ub2tlbml6ZXIuVE9LRU5fR1QgOgorICAgICAgICAgICAgICAgICAgICBwdXNoT3BwKG5ldyBHcmVhdGVyVGhhbk5vZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXhwcmVzc2lvblRva2VuaXplci5UT0tFTl9MVCA6CisgICAgICAgICAgICAgICAgICAgIHB1c2hPcHAobmV3IExlc3NUaGFuTm9kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFeHByZXNzaW9uVG9rZW5pemVyLlRPS0VOX0VORCA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEZpbmlzaCBvZmYgdGhlIHJlc3Qgb2YgdGhlIG9wcHMKKyAgICAgICAgcmVzb2x2ZUdyb3VwKCk7CisgICAgICAgIGlmIChub2RlU3RhY2suc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiTm8gbm9kZXMgY3JlYXRlZC4iLCBldC5nZXRJbmRleCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZVN0YWNrLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiRXh0cmEgbm9kZXMgY3JlYXRlZC4iLCBldC5nZXRJbmRleCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3BwU3RhY2suc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiVW51c2VkIG9wcCBub2RlcyBleGlzdC4iLCBldC5nZXRJbmRleCgpKTsKKyAgICAgICAgfQorICAgICAgICByb290ID0gKE5vZGUpbm9kZVN0YWNrLmdldCgwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIG5vZGUgaW4gdGhlIGV4cHJlc3Npb24gcGFyc2UgdHJlZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGFic3RyYWN0IGNsYXNzIE5vZGUgeworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgZXZhbHVhdGVzIHRvIHRydWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBldmFsdWF0ZSgpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBBIG5vZGUgdGhlIHJlcHJlc2VudHMgYSBTdHJpbmcgdmFsdWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFN0cmluZ05vZGUgZXh0ZW5kcyBOb2RlIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHZhbHVlOworICAgICAgICBTdHJpbmcgcmVzb2x2ZWQgPSBudWxsOworCisKKyAgICAgICAgcHVibGljIFN0cmluZ05vZGUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcih2YWx1ZSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvbHZlcyBhbnkgdmFyaWFibGUgcmVmZXJlbmNlcyBhbmQgcmV0dXJucyB0aGUgdmFsdWUgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIGlmIChyZXNvbHZlZCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJlc29sdmVkID0gc3NpTWVkaWF0b3Iuc3Vic3RpdHV0ZVZhcmlhYmxlcyh2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiByZXNvbHZlZDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIG5vdCBlbXB0eS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuICEoZ2V0VmFsdWUoKS5sZW5ndGgoKSA9PSAwKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBSRUNFREVOQ0VfTk9UID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJFQ0VERU5DRV9DT01QQVJFID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJFQ0VERU5DRV9MT0dJQ0FMID0gMTsKKworICAgIC8qKgorICAgICAqIEEgbm9kZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHJlcHJlc2VudHMgYW4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgT3BwTm9kZSBleHRlbmRzIE5vZGUgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxlZnQgYnJhbmNoLgorICAgICAgICAgKi8KKyAgICAgICAgTm9kZSBsZWZ0OworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHJpZ2h0IGJyYW5jaC4KKyAgICAgICAgICovCisgICAgICAgIE5vZGUgcmlnaHQ7CisKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIHByZWZlcmVuY2UgbGV2ZWwgc3VpdGFibGUgZm9yIGNvbXBhcmlzb24gdG8gb3RoZXIgT3BwTm9kZQorICAgICAgICAgKiBwcmVmZXJlbmNlIGxldmVscy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UHJlY2VkZW5jZSgpOworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIExldHMgdGhlIG5vZGUgcG9wIGl0cyBvd24gYnJhbmNoIG5vZGVzIG9mZiB0aGUgZnJvbnQgb2YgdGhlCisgICAgICAgICAqIHNwZWNpZmllZCBsaXN0LiBUaGUgZGVmYXVsdCBwdWxscyB0d28uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBwb3BWYWx1ZXMoTGlzdCB2YWx1ZXMpIHsKKyAgICAgICAgICAgIHJpZ2h0ID0gKE5vZGUpdmFsdWVzLnJlbW92ZSgwKTsKKyAgICAgICAgICAgIGxlZnQgPSAoTm9kZSl2YWx1ZXMucmVtb3ZlKDApOworICAgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTm90Tm9kZSBleHRlbmRzIE9wcE5vZGUgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAhbGVmdC5ldmFsdWF0ZSgpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgaW50IGdldFByZWNlZGVuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gUFJFQ0VERU5DRV9OT1Q7CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZGVuIHRvIHBvcCBvbmx5IG9uZSB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHBvcFZhbHVlcyhMaXN0IHZhbHVlcykgeworICAgICAgICAgICAgbGVmdCA9IChOb2RlKXZhbHVlcy5yZW1vdmUoMCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbGVmdCArICIgTk9UIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEFuZE5vZGUgZXh0ZW5kcyBPcHBOb2RlIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKSB7CisgICAgICAgICAgICBpZiAoIWxlZnQuZXZhbHVhdGUoKSkgLy8gU2hvcnQgY2lyY3VpdAorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiByaWdodC5ldmFsdWF0ZSgpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgaW50IGdldFByZWNlZGVuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gUFJFQ0VERU5DRV9MT0dJQ0FMOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGxlZnQgKyAiICIgKyByaWdodCArICIgQU5EIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE9yTm9kZSBleHRlbmRzIE9wcE5vZGUgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpIHsKKyAgICAgICAgICAgIGlmIChsZWZ0LmV2YWx1YXRlKCkpIC8vIFNob3J0IGNpcmN1aXQKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiByaWdodC5ldmFsdWF0ZSgpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgaW50IGdldFByZWNlZGVuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gUFJFQ0VERU5DRV9MT0dJQ0FMOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGxlZnQgKyAiICIgKyByaWdodCArICIgT1IiOworICAgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgQ29tcGFyZU5vZGUgZXh0ZW5kcyBPcHBOb2RlIHsKKyAgICAgICAgcHJvdGVjdGVkIGludCBjb21wYXJlQnJhbmNoZXMoKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsMSA9ICgoU3RyaW5nTm9kZSlsZWZ0KS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgU3RyaW5nIHZhbDIgPSAoKFN0cmluZ05vZGUpcmlnaHQpLmdldFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gdmFsMS5jb21wYXJlVG8odmFsMik7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBFcXVhbE5vZGUgZXh0ZW5kcyBDb21wYXJlTm9kZSB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIChjb21wYXJlQnJhbmNoZXMoKSA9PSAwKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIGludCBnZXRQcmVjZWRlbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIFBSRUNFREVOQ0VfQ09NUEFSRTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgIiAiICsgcmlnaHQgKyAiIEVRIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEdyZWF0ZXJUaGFuTm9kZSBleHRlbmRzIENvbXBhcmVOb2RlIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gKGNvbXBhcmVCcmFuY2hlcygpID4gMCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UHJlY2VkZW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBQUkVDRURFTkNFX0NPTVBBUkU7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbGVmdCArICIgIiArIHJpZ2h0ICsgIiBHVCI7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBMZXNzVGhhbk5vZGUgZXh0ZW5kcyBDb21wYXJlTm9kZSB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIChjb21wYXJlQnJhbmNoZXMoKSA8IDApOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgaW50IGdldFByZWNlZGVuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gUFJFQ0VERU5DRV9DT01QQVJFOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGxlZnQgKyAiICIgKyByaWdodCArICIgTFQiOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvRXhwcmVzc2lvblRva2VuaXplci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9FeHByZXNzaW9uVG9rZW5pemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyNzM2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvRXhwcmVzc2lvblRva2VuaXplci5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIExpY2Vuc2VkIHVuZGVyIHRoZQorICogQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUKKyAqIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKKyAqIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKKyAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zc2k7CisKKworLyoqCisgKiBQYXJzZXMgYW4gZXhwcmVzc2lvbiBzdHJpbmcgdG8gcmV0dXJuIHRoZSBpbmRpdmlkdWFsIHRva2Vucy4gVGhpcyBpcworICogcGF0dGVybmVkIHNpbWlsYXIgdG8gdGhlIFN0cmVhbVRva2VuaXplciBpbiB0aGUgSkRLIGJ1dCBjdXN0b21pemVkIGZvciBTU0kKKyAqIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gcGFyc2luZy4KKyAqIAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogQGF1dGhvciBQYXVsIFNwZWVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeHByZXNzaW9uVG9rZW5pemVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT0tFTl9TVFJJTkcgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0FORCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fT1IgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPS0VOX05PVCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fRVEgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPS0VOX05PVF9FUSA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fUkJSQUNFID0gNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT0tFTl9MQlJBQ0UgPSA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0dFID0gODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT0tFTl9MRSA9IDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fR1QgPSAxMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT0tFTl9MVCA9IDExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0VORCA9IDEyOworICAgIHByaXZhdGUgY2hhcltdIGV4cHI7CisgICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW5WYWwgPSBudWxsOworICAgIHByaXZhdGUgaW50IGluZGV4OworICAgIHByaXZhdGUgaW50IGxlbmd0aDsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBwYXJzZXIgZm9yIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwcmVzc2lvblRva2VuaXplcihTdHJpbmcgZXhwcikgeworICAgICAgICB0aGlzLmV4cHIgPSBleHByLnRyaW0oKS50b0NoYXJBcnJheSgpOworICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuZXhwci5sZW5ndGg7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG1vcmUgdG9rZW5zLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7CisgICAgICAgIHJldHVybiBpbmRleCA8IGxlbmd0aDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgaW5kZXggZm9yIGVycm9yIHJlcG9ydGluZyBwdXJwb3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgeworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01ldGFDaGFyKGNoYXIgYykgeworICAgICAgICByZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSB8fCBjID09ICcoJyB8fCBjID09ICcpJyB8fCBjID09ICchJworICAgICAgICAgICAgICAgIHx8IGMgPT0gJzwnIHx8IGMgPT0gJz4nIHx8IGMgPT0gJ3wnIHx8IGMgPT0gJyYnIHx8IGMgPT0gJz0nOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCB0b2tlbiB0eXBlIGFuZCBpbml0aWFsaXplcyBhbnkgc3RhdGUgdmFyaWFibGVzCisgICAgICogYWNjb3JkaW5nbHkuCisgICAgICovCisgICAgcHVibGljIGludCBuZXh0VG9rZW4oKSB7CisgICAgICAgIC8vIFNraXAgYW55IGxlYWRpbmcgd2hpdGUgc3BhY2UKKyAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoZXhwcltpbmRleF0pKQorICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgdG9rZW4gdmFsCisgICAgICAgIHRva2VuVmFsID0gbnVsbDsKKyAgICAgICAgaWYgKGluZGV4ID09IGxlbmd0aCkgcmV0dXJuIFRPS0VOX0VORDsgLy8gRW5kIG9mIHN0cmluZworICAgICAgICBpbnQgc3RhcnQgPSBpbmRleDsKKyAgICAgICAgY2hhciBjdXJyZW50Q2hhciA9IGV4cHJbaW5kZXhdOworICAgICAgICBjaGFyIG5leHRDaGFyID0gKGNoYXIpMDsKKyAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoKSBuZXh0Q2hhciA9IGV4cHJbaW5kZXhdOworICAgICAgICAvLyBDaGVjayBmb3IgYSBrbm93biB0b2tlbiBzdGFydAorICAgICAgICBzd2l0Y2ggKGN1cnJlbnRDaGFyKSB7CisgICAgICAgICAgICBjYXNlICcoJyA6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRPS0VOX0xCUkFDRTsKKyAgICAgICAgICAgIGNhc2UgJyknIDoKKyAgICAgICAgICAgICAgICByZXR1cm4gVE9LRU5fUkJSQUNFOworICAgICAgICAgICAgY2FzZSAnPScgOgorICAgICAgICAgICAgICAgIHJldHVybiBUT0tFTl9FUTsKKyAgICAgICAgICAgIGNhc2UgJyEnIDoKKyAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUT0tFTl9OT1RfRVE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRPS0VOX05PVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlICd8JyA6CisgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyID09ICd8JykgeworICAgICAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVE9LRU5fT1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnJicgOgorICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA9PSAnJicpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRPS0VOX0FORDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc+JyA6CisgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyID09ICc9JykgeworICAgICAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVE9LRU5fR0U7IC8vIEdyZWF0ZXIgdGhhbiBvciBlcXVhbAorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUT0tFTl9HVDsgLy8gR3JlYXRlciB0aGFuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAnPCcgOgorICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRPS0VOX0xFOyAvLyBMZXNzIHRoYW4gb3IgZXF1YWwKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVE9LRU5fTFQ7IC8vIExlc3MgdGhhbgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBpdCdzIGEgc3RyaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW50IGVuZCA9IGluZGV4OworICAgICAgICAvLyBJZiBpdCdzIGEgcXVvdGVkIHN0cmluZyB0aGVuIGVuZCBpcyB0aGUgbmV4dCB1bmVzY2FwZWQgcXVvdGUKKyAgICAgICAgaWYgKGN1cnJlbnRDaGFyID09ICciJyB8fCBjdXJyZW50Q2hhciA9PSAnXCcnKSB7CisgICAgICAgICAgICBjaGFyIGVuZENoYXIgPSBjdXJyZW50Q2hhcjsKKyAgICAgICAgICAgIGJvb2xlYW4gZXNjYXBlZCA9IGZhbHNlOworICAgICAgICAgICAgc3RhcnQrKzsKKyAgICAgICAgICAgIGZvciAoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgeworICAgICAgICAgICAgICAgIGlmIChleHByW2luZGV4XSA9PSAnXFwnICYmICFlc2NhcGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGV4cHJbaW5kZXhdID09IGVuZENoYXIgJiYgIWVzY2FwZWQpIGJyZWFrOworICAgICAgICAgICAgICAgIGVzY2FwZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuZCA9IGluZGV4OworICAgICAgICAgICAgaW5kZXgrKzsgLy8gU2tpcCB0aGUgZW5kIHF1b3RlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBFbmQgaXMgdGhlIG5leHQgd2hpdGVzcGFjZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGZvciAoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgeworICAgICAgICAgICAgICAgIGlmIChpc01ldGFDaGFyKGV4cHJbaW5kZXhdKSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmQgPSBpbmRleDsKKyAgICAgICAgfQorICAgICAgICAvLyBFeHRyYWN0IHRoZSBzdHJpbmcgZnJvbSB0aGUgYXJyYXkKKyAgICAgICAgdGhpcy50b2tlblZhbCA9IG5ldyBTdHJpbmcoZXhwciwgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKyAgICAgICAgcmV0dXJuIFRPS0VOX1NUUklORzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgdG9rZW4gaWYgaXQgd2FzIHR5cGUgVE9LRU5fU1RSSU5HLgorICAgICAqIE90aGVyd2lzZSBudWxsIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9rZW5WYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRva2VuVmFsOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1Jlc3BvbnNlSW5jbHVkZVdyYXBwZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvUmVzcG9uc2VJbmNsdWRlV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTRjN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1Jlc3BvbnNlSW5jbHVkZVdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zc2k7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5EYXRlVG9vbDsKKy8qKgorICogQSBIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlciwgdXNlZCBmcm9tCisgKiA8Y29kZT5TU0lTZXJ2bGV0RXh0ZXJuYWxSZXNvbHZlcjwvY29kZT4KKyAqIAorICogQGF1dGhvciBCaXAgVGhlbGluCisgKiBAYXV0aG9yIERhdmlkIEJlY2tlcgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNwb25zZUluY2x1ZGVXcmFwcGVyIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIgeworICAgIC8qKgorICAgICAqIFRoZSBuYW1lcyBvZiBzb21lIGhlYWRlcnMgd2Ugd2FudCB0byBjYXB0dXJlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSAiY29udGVudC10eXBlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9NT0RJRklFRCA9ICJsYXN0LW1vZGlmaWVkIjsKKyAgICBwcm90ZWN0ZWQgbG9uZyBsYXN0TW9kaWZpZWQgPSAtMTsKKyAgICBwcml2YXRlIFN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBPdXIgU2VydmxldE91dHB1dFN0cmVhbQorICAgICAqLworICAgIHByb3RlY3RlZCBTZXJ2bGV0T3V0cHV0U3RyZWFtIGNhcHR1cmVTZXJ2bGV0T3V0cHV0U3RyZWFtOworICAgIHByb3RlY3RlZCBTZXJ2bGV0T3V0cHV0U3RyZWFtIHNlcnZsZXRPdXRwdXRTdHJlYW07CisgICAgcHJvdGVjdGVkIFByaW50V3JpdGVyIHByaW50V3JpdGVyOworICAgIAorICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgY29udGV4dDsKKyAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OworCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIG91ciB3cmFwcGVyIHdpdGggdGhlIGN1cnJlbnQgSHR0cFNlcnZsZXRSZXNwb25zZSBhbmQKKyAgICAgKiBTZXJ2bGV0T3V0cHV0U3RyZWFtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBzZXJ2bGV0IGNvbnRleHQKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSHR0cFNlcnZsZXRSZXNwb25zZSB0byB1c2UKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIHRvIHVzZQorICAgICAqIEBwYXJhbSBjYXB0dXJlU2VydmxldE91dHB1dFN0cmVhbSBUaGUgU2VydmxldE91dHB1dFN0cmVhbSB0byB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzcG9uc2VJbmNsdWRlV3JhcHBlcihTZXJ2bGV0Q29udGV4dCBjb250ZXh0LCAKKyAgICAJCUh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICBTZXJ2bGV0T3V0cHV0U3RyZWFtIGNhcHR1cmVTZXJ2bGV0T3V0cHV0U3RyZWFtKSB7CisgICAgICAgIHN1cGVyKHJlc3BvbnNlKTsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgdGhpcy5jYXB0dXJlU2VydmxldE91dHB1dFN0cmVhbSA9IGNhcHR1cmVTZXJ2bGV0T3V0cHV0U3RyZWFtOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIHNlcnZsZXRPdXRwdXRTdHJlYW0gb3IgcHJpbnRXcml0ZXIgKCBvbmx5IG9uZSB3aWxsIGJlIG5vbi1udWxsICkKKyAgICAgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGEgcmVxdWVzdERpc3BhdGNoZXIuaW5jbHVkZSwgc2luY2Ugd2UgY2FuJ3QKKyAgICAgKiBhc3N1bWUgdGhhdCB0aGUgaW5jbHVkZWQgc2VydmxldCBmbHVzaGVkIGl0cyBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmx1c2hPdXRwdXRTdHJlYW1PcldyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzZXJ2bGV0T3V0cHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNlcnZsZXRPdXRwdXRTdHJlYW0uZmx1c2goKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJpbnRXcml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJpbnRXcml0ZXIuZmx1c2goKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgcHJpbnR3cml0ZXIsIHRocm93cyBhbmQgZXhjZXB0aW9uIGlmIGEgT3V0cHV0U3RyZWFtIGFscmVhZHkKKyAgICAgKiBiZWVuIHJldHVybmVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBQcmludFdyaXRlciBvYmplY3QKKyAgICAgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgb3V0cHV0c3RyZWFtIGFscmVhZHkgYmVlbiBjYWxsZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBpZiAoc2VydmxldE91dHB1dFN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAocHJpbnRXcml0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldENoYXJhY3RlckVuY29kaW5nKGdldENoYXJhY3RlckVuY29kaW5nKCkpOworICAgICAgICAgICAgICAgIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE91dHB1dFN0cmVhbVdyaXRlcihjYXB0dXJlU2VydmxldE91dHB1dFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHByaW50V3JpdGVyOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIE91dHB1dFN0cmVhbSwgdGhyb3dzIGFuZCBleGNlcHRpb24gaWYgYSBwcmludHdyaXRlciBhbHJlYWR5CisgICAgICogYmVlbiByZXR1cm5lZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgT3V0cHV0U3RyZWFtIG9iamVjdAorICAgICAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBwcmludHdyaXRlciBhbHJlYWR5IGJlZW4gY2FsbGVkCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBpZiAocHJpbnRXcml0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHNlcnZsZXRPdXRwdXRTdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlcnZsZXRPdXRwdXRTdHJlYW0gPSBjYXB0dXJlU2VydmxldE91dHB1dFN0cmVhbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzZXJ2bGV0T3V0cHV0U3RyZWFtOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmxhc3QtbW9kaWZpZWQ8L2NvZGU+IGhlYWRlciBmaWVsZC4gVGhlCisgICAgICogcmVzdWx0IGlzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCBHTVQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRlIHRoZSByZXNvdXJjZSByZWZlcmVuY2VkIGJ5IHRoaXMKKyAgICAgKiAgIDxjb2RlPlJlc3BvbnNlSW5jbHVkZVdyYXBwZXI8L2NvZGU+IHdhcyBsYXN0IG1vZGlmaWVkLCBvciAtMSBpZiBub3QKKyAgICAgKiAgIGtub3duLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgaWYgKGxhc3RNb2RpZmllZCA9PSAtMSkgeworICAgICAgICAgICAgLy8gamF2YWRvY3Mgc2F5IHRvIHJldHVybiAtMSBpZiBkYXRlIG5vdCBrbm93biwgaWYgeW91IHdhbnQgYW5vdGhlcgorICAgICAgICAgICAgLy8gZGVmYXVsdCwgcHV0IGl0IGhlcmUKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFzdE1vZGlmaWVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5sYXN0LW1vZGlmaWVkPC9jb2RlPiBoZWFkZXIgZmllbGQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFzdE1vZGlmaWVkIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCBHTVQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkKGxvbmcgbGFzdE1vZGlmaWVkKSB7CisgICAgICAgIHRoaXMubGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOworICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLnNldERhdGVIZWFkZXIoTEFTVF9NT0RJRklFRCwKKyAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5jb250ZW50LXR5cGU8L2NvZGU+IGhlYWRlciBmaWVsZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlZCBieSB0aGlzCisgICAgICogICA8Y29kZT5SZXNwb25zZUluY2x1ZGVXcmFwcGVyPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGtub3duLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisgICAgICAgICAgICBTdHJpbmcgbWltZSA9IGNvbnRleHQuZ2V0TWltZVR5cGUodXJsKTsKKyAgICAgICAgICAgIGlmIChtaW1lICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0Q29udGVudFR5cGUobWltZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJLy8gcmV0dXJuIGEgc2FmZSB2YWx1ZQorICAgICAgICAgICAgICAgc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtb2N0ZXQtc3RyZWFtIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Y29udGVudC10eXBlPC9jb2RlPiBoZWFkZXIgZmllbGQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWltZSBhIG1pbWUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyBtaW1lKSB7CisgICAgICAgIGNvbnRlbnRUeXBlID0gbWltZTsKKyAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdldFJlc3BvbnNlKCkuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBhZGREYXRlSGVhZGVyKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7CisgICAgICAgIHN1cGVyLmFkZERhdGVIZWFkZXIobmFtZSwgdmFsdWUpOworICAgICAgICBTdHJpbmcgbG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIGlmIChsbmFtZS5lcXVhbHMoTEFTVF9NT0RJRklFRCkpIHsKKyAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIuYWRkSGVhZGVyKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgU3RyaW5nIGxuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworICAgICAgICBpZiAobG5hbWUuZXF1YWxzKExBU1RfTU9ESUZJRUQpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9IERhdGVUb29sLnJmYzExMjNGb3JtYXQucGFyc2UodmFsdWUpLmdldFRpbWUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBpZ25vcmUpIHsgfQorICAgICAgICB9IGVsc2UgaWYgKGxuYW1lLmVxdWFscyhDT05URU5UX1RZUEUpKSB7CisgICAgICAgICAgICBjb250ZW50VHlwZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgeworICAgICAgICBzdXBlci5zZXREYXRlSGVhZGVyKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgU3RyaW5nIGxuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworICAgICAgICBpZiAobG5hbWUuZXF1YWxzKExBU1RfTU9ESUZJRUQpKSB7CisgICAgICAgICAgICBsYXN0TW9kaWZpZWQgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHN1cGVyLnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgICAgIFN0cmluZyBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgaWYgKGxuYW1lLmVxdWFscyhMQVNUX01PRElGSUVEKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQgPSBEYXRlVG9vbC5yZmMxMTIzRm9ybWF0LnBhcnNlKHZhbHVlKS5nZXRUaW1lKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgaWdub3JlKSB7IH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsbmFtZS5lcXVhbHMoQ09OVEVOVF9UWVBFKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGVudFR5cGUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJQ29tbWFuZC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBjYmJkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gTGljZW5zZWQgdW5kZXIgdGhlCisgKiBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZQorICogbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcworICogZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZQorICogZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaTsKKworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKy8qKgorICogVGhlIGludGVyZmFjZSB0aGF0IGFsbCBTU0kgY29tbWFuZHMgKCBTU0lFY2hvLCBTU0lJbmNsdWRlLCAuLi4pIG11c3QKKyAqIGltcGxlbWVudC4KKyAqIAorICogQGF1dGhvciBCaXAgVGhlbGluCisgKiBAYXV0aG9yIERhbiBTYW5kYmVyZworICogQGF1dGhvciBEYXZpZCBCZWNrZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNTSUNvbW1hbmQgeworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgdG8gdGhlIHdyaXRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3NpTWVkaWF0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBzc2kgbWVkaWF0b3IKKyAgICAgKiBAcGFyYW0gY29tbWFuZE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhY3R1YWwgY29tbWFuZCAoIGllLiBlY2hvICkKKyAgICAgKiBAcGFyYW0gcGFyYW1OYW1lcworICAgICAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlciBuYW1lcworICAgICAqIEBwYXJhbSBwYXJhbVZhbHVlcworICAgICAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlciB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gd3JpdGVyCisgICAgICogICAgICAgICAgICB0aGUgd3JpdGVyIHRvIG91dHB1dCB0bworICAgICAqIEByZXR1cm4gdGhlIG1vc3QgY3VycmVudCBtb2RpZmllZCBkYXRlIHJlc3VsdGluZyBmcm9tIGFueSBTU0kgY29tbWFuZHMKKyAgICAgKiBAdGhyb3dzIFNTSVN0b3BQcm9jZXNzaW5nRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgU1NJIHByb2Nlc3Npbmcgc2hvdWxkIGJlIGFib3J0ZWQKKyAgICAgKi8KKwlwdWJsaWMgbG9uZyBwcm9jZXNzKFNTSU1lZGlhdG9yIHNzaU1lZGlhdG9yLCBTdHJpbmcgY29tbWFuZE5hbWUsCisgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbU5hbWVzLCBTdHJpbmdbXSBwYXJhbVZhbHVlcywgUHJpbnRXcml0ZXIgd3JpdGVyKQorICAgICAgICAgICAgdGhyb3dzIFNTSVN0b3BQcm9jZXNzaW5nRXhjZXB0aW9uOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJQ29uZGl0aW9uYWwuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJQ29uZGl0aW9uYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTI2NjRkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lDb25kaXRpb25hbC5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIExpY2Vuc2VkIHVuZGVyIHRoZQorICogQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUKKyAqIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKKyAqIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKKyAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zc2k7CisKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworLyoqCisgKiBTU0kgY29tbWFuZCB0aGF0IGhhbmRsZXMgYWxsIGNvbmRpdGlvbmFsIGRpcmVjdGl2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIEBhdXRob3IgUGF1bCBTcGVlZAorICogQGF1dGhvciBEYXZpZCBCZWNrZXIKKyAqLworcHVibGljIGNsYXNzIFNTSUNvbmRpdGlvbmFsIGltcGxlbWVudHMgU1NJQ29tbWFuZCB7CisgICAgLyoqCisgICAgICogQHNlZSBTU0lDb21tYW5kCisgICAgICovCisgICAgcHVibGljIGxvbmcgcHJvY2VzcyhTU0lNZWRpYXRvciBzc2lNZWRpYXRvciwgU3RyaW5nIGNvbW1hbmROYW1lLAorICAgICAgICAgICAgU3RyaW5nW10gcGFyYW1OYW1lcywgU3RyaW5nW10gcGFyYW1WYWx1ZXMsIFByaW50V3JpdGVyIHdyaXRlcikKKyAgICAgICAgICAgIHRocm93cyBTU0lTdG9wUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgCS8vIEFzc3VtZSBhbnl0aGluZyB1c2luZyBjb25kaXRpb25hbHMgd2FzIG1vZGlmaWVkIGJ5IGl0CisgICAgCWxvbmcgbGFzdE1vZGlmaWVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIC8vIFJldHJpZXZlIHRoZSBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uCisgICAgICAgIFNTSUNvbmRpdGlvbmFsU3RhdGUgc3RhdGUgPSBzc2lNZWRpYXRvci5nZXRDb25kaXRpb25hbFN0YXRlKCk7CisgICAgICAgIGlmICgiaWYiLmVxdWFsc0lnbm9yZUNhc2UoY29tbWFuZE5hbWUpKSB7CisgICAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHdlIGFyZSBuZXN0ZWQgaW4gYSBmYWxzZSBicmFuY2gKKyAgICAgICAgICAgIC8vIGV4Y2VwdCBjb3VudCBpdAorICAgICAgICAgICAgaWYgKHN0YXRlLnByb2Nlc3NDb25kaXRpb25hbENvbW1hbmRzT25seSkgeworICAgICAgICAgICAgICAgIHN0YXRlLm5lc3RpbmdDb3VudCsrOworICAgICAgICAgICAgICAgIHJldHVybiBsYXN0TW9kaWZpZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS5uZXN0aW5nQ291bnQgPSAwOworICAgICAgICAgICAgLy8gRXZhbHVhdGUgdGhlIGV4cHJlc3Npb24KKyAgICAgICAgICAgIGlmIChldmFsdWF0ZUFyZ3VtZW50cyhwYXJhbU5hbWVzLCBwYXJhbVZhbHVlcywgc3NpTWVkaWF0b3IpKSB7CisgICAgICAgICAgICAgICAgLy8gTm8gbW9yZSBicmFuY2hlcyBjYW4gYmUgdGFrZW4gZm9yIHRoaXMgaWYgYmxvY2sKKyAgICAgICAgICAgICAgICBzdGF0ZS5icmFuY2hUYWtlbiA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIERvIG5vdCBwcm9jZXNzIHRoaXMgYnJhbmNoCisgICAgICAgICAgICAgICAgc3RhdGUucHJvY2Vzc0NvbmRpdGlvbmFsQ29tbWFuZHNPbmx5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5icmFuY2hUYWtlbiA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCJlbGlmIi5lcXVhbHNJZ25vcmVDYXNlKGNvbW1hbmROYW1lKSkgeworICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBldmVuIGV4ZWN1dGUgaWYgd2UgYXJlIG5lc3RlZCBpbgorICAgICAgICAgICAgLy8gYSBmYWxzZSBicmFuY2gKKyAgICAgICAgICAgIGlmIChzdGF0ZS5uZXN0aW5nQ291bnQgPiAwKSByZXR1cm4gbGFzdE1vZGlmaWVkOworICAgICAgICAgICAgLy8gSWYgYSBicmFuY2ggd2FzIGFscmVhZHkgdGFrZW4gaW4gdGhpcyBpZiBibG9jaworICAgICAgICAgICAgLy8gdGhlbiBkaXNhYmxlIG91dHB1dCBhbmQgcmV0dXJuCisgICAgICAgICAgICBpZiAoc3RhdGUuYnJhbmNoVGFrZW4pIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzQ29uZGl0aW9uYWxDb21tYW5kc09ubHkgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBsYXN0TW9kaWZpZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBFdmFsdWF0ZSB0aGUgZXhwcmVzc2lvbgorICAgICAgICAgICAgaWYgKGV2YWx1YXRlQXJndW1lbnRzKHBhcmFtTmFtZXMsIHBhcmFtVmFsdWVzLCBzc2lNZWRpYXRvcikpIHsKKyAgICAgICAgICAgICAgICAvLyBUdXJuIGJhY2sgb24gb3V0cHV0IGFuZCBtYXJrIHRoZSBicmFuY2gKKyAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzQ29uZGl0aW9uYWxDb21tYW5kc09ubHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5icmFuY2hUYWtlbiA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIERvIG5vdCBwcm9jZXNzIHRoaXMgYnJhbmNoCisgICAgICAgICAgICAgICAgc3RhdGUucHJvY2Vzc0NvbmRpdGlvbmFsQ29tbWFuZHNPbmx5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5icmFuY2hUYWtlbiA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCJlbHNlIi5lcXVhbHNJZ25vcmVDYXNlKGNvbW1hbmROYW1lKSkgeworICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBldmVuIGV4ZWN1dGUgaWYgd2UgYXJlIG5lc3RlZCBpbgorICAgICAgICAgICAgLy8gYSBmYWxzZSBicmFuY2gKKyAgICAgICAgICAgIGlmIChzdGF0ZS5uZXN0aW5nQ291bnQgPiAwKSByZXR1cm4gbGFzdE1vZGlmaWVkOworICAgICAgICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSB0YWtlbiBhbm90aGVyIGJyYW5jaCB0aGVuCisgICAgICAgICAgICAvLyBkaXNhYmxlIG91dHB1dCBvdGhlcndpc2UgZW5hYmxlIGl0LgorICAgICAgICAgICAgc3RhdGUucHJvY2Vzc0NvbmRpdGlvbmFsQ29tbWFuZHNPbmx5ID0gc3RhdGUuYnJhbmNoVGFrZW47CisgICAgICAgICAgICAvLyBBbmQgaW4gYW55IGNhc2UsIGl0J3Mgc2FmZSB0byBzYXkgYSBicmFuY2gKKyAgICAgICAgICAgIC8vIGhhcyBiZWVuIHRha2VuLgorICAgICAgICAgICAgc3RhdGUuYnJhbmNoVGFrZW4gPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCJlbmRpZiIuZXF1YWxzSWdub3JlQ2FzZShjb21tYW5kTmFtZSkpIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSBuZXN0ZWQgaW5zaWRlIGEgZmFsc2UgYnJhbmNoIHRoZW4gcG9wIG91dAorICAgICAgICAgICAgLy8gb25lIGxldmVsIG9uIHRoZSBuZXN0aW5nIGNvdW50CisgICAgICAgICAgICBpZiAoc3RhdGUubmVzdGluZ0NvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHN0YXRlLm5lc3RpbmdDb3VudC0tOworICAgICAgICAgICAgICAgIHJldHVybiBsYXN0TW9kaWZpZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUdXJuIG91dHB1dCBiYWNrIG9uCisgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzQ29uZGl0aW9uYWxDb21tYW5kc09ubHkgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBicmFuY2ggc3RhdHVzIGZvciBhbnkgb3V0ZXIgaWYgYmxvY2tzLAorICAgICAgICAgICAgLy8gc2luY2UgY2xlYXJseSB3ZSB0b29rIGEgYnJhbmNoIHRvIGhhdmUgZ290dGVuIGhlcmUKKyAgICAgICAgICAgIC8vIGluIHRoZSBmaXJzdCBwbGFjZS4KKyAgICAgICAgICAgIHN0YXRlLmJyYW5jaFRha2VuID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTU0lTdG9wUHJvY2Vzc2luZ0V4Y2VwdGlvbigpOworICAgICAgICAgICAgLy90aHJvdyBuZXcgU3NpQ29tbWFuZEV4Y2VwdGlvbiggIk5vdCBhIGNvbmRpdGlvbmFsIGNvbW1hbmQ6IiArCisgICAgICAgICAgICAvLyBjbWROYW1lICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhc3RNb2RpZmllZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgZXhwcmVzc2lvbiBmcm9tIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzIGFuZCBwZWZvcm1zIHRoZQorICAgICAqIG5lY2Vzc2FyeSBldmFsdWF0aW9uIHN0ZXBzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBldmFsdWF0ZUFyZ3VtZW50cyhTdHJpbmdbXSBuYW1lcywgU3RyaW5nW10gdmFsdWVzLAorICAgICAgICAgICAgU1NJTWVkaWF0b3Igc3NpTWVkaWF0b3IpIHRocm93cyBTU0lTdG9wUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBleHByID0gZ2V0RXhwcmVzc2lvbihuYW1lcywgdmFsdWVzKTsKKyAgICAgICAgaWYgKGV4cHIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNTSVN0b3BQcm9jZXNzaW5nRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAvL3Rocm93IG5ldyBTc2lDb21tYW5kRXhjZXB0aW9uKCAiTm8gZXhwcmVzc2lvbiBzcGVjaWZpZWQuIiApOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBFeHByZXNzaW9uUGFyc2VUcmVlIHRyZWUgPSBuZXcgRXhwcmVzc2lvblBhcnNlVHJlZShleHByLAorICAgICAgICAgICAgICAgICAgICBzc2lNZWRpYXRvcik7CisgICAgICAgICAgICByZXR1cm4gdHJlZS5ldmFsdWF0ZVRyZWUoKTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy90aHJvdyBuZXcgU3NpQ29tbWFuZEV4Y2VwdGlvbiggIkVycm9yIHBhcnNpbmcgZXhwcmVzc2lvbi4iICk7CisgICAgICAgICAgICB0aHJvdyBuZXcgU1NJU3RvcFByb2Nlc3NpbmdFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgImV4cHIiIGlmIHRoZSBhcmcgbmFtZSBpcyBhcHByb3ByaWF0ZSwgb3RoZXJ3aXNlIHJldHVybnMKKyAgICAgKiBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldEV4cHJlc3Npb24oU3RyaW5nW10gcGFyYW1OYW1lcywgU3RyaW5nW10gcGFyYW1WYWx1ZXMpIHsKKyAgICAgICAgaWYgKCJleHByIi5lcXVhbHNJZ25vcmVDYXNlKHBhcmFtTmFtZXNbMF0pKSByZXR1cm4gcGFyYW1WYWx1ZXNbMF07CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUNvbmRpdGlvbmFsU3RhdGUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJQ29uZGl0aW9uYWxTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYzFkYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUNvbmRpdGlvbmFsU3RhdGUuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIExpY2Vuc2VkIHVuZGVyIHRoZQorICogQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUKKyAqIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKKyAqIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKKyAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zc2k7CisKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgYnkgU1NJTWVkaWF0b3IgYW5kIFNTSUNvbmRpdGlvbmFsIHRvIGtlZXAgdHJhY2sgb2Ygc3RhdGUKKyAqIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBwcm9jZXNzIHRoZSBuZXN0ZWQgY29uZGl0aW9uYWwgY29tbWFuZHMgKCBpZiwgZWxpZiwKKyAqIGVsc2UsIGVuZGlmICkuCisgKiAKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqIEBhdXRob3IgRGFuIFNhbmRiZXJnCisgKiBAYXV0aG9yIFBhdWwgU3BlZWQKKyAqLworY2xhc3MgU1NJQ29uZGl0aW9uYWxTdGF0ZSB7CisgICAgLyoqCisgICAgICogU2V0IHRvIHRydWUgaWYgdGhlIGN1cnJlbnQgY29uZGl0aW9uYWwgaGFzIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQsIGkuZS46CisgICAgICogYSBicmFuY2ggd2FzIHRha2VuLgorICAgICAqLworICAgIGJvb2xlYW4gYnJhbmNoVGFrZW4gPSBmYWxzZTsKKyAgICAvKioKKyAgICAgKiBDb3VudHMgdGhlIG51bWJlciBvZiBuZXN0ZWQgZmFsc2UgYnJhbmNoZXMuCisgICAgICovCisgICAgaW50IG5lc3RpbmdDb3VudCA9IDA7CisgICAgLyoqCisgICAgICogU2V0IHRvIHRydWUgaWYgb25seSBjb25kaXRpb25hbCBjb21tYW5kcyAoIGlmLCBlbGlmLCBlbHNlLCBlbmRpZiApCisgICAgICogc2hvdWxkIGJlIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBib29sZWFuIHByb2Nlc3NDb25kaXRpb25hbENvbW1hbmRzT25seSA9IGZhbHNlOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJQ29uZmlnLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZjU2MWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gTGljZW5zZWQgdW5kZXIgdGhlCisgKiBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZQorICogbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcworICogZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZQorICogZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaTsKKworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKy8qKgorICogSW1wbGVtZW50cyB0aGUgU2VydmVyLXNpZGUgI2V4ZWMgY29tbWFuZAorICogCisgKiBAYXV0aG9yIEJpcCBUaGVsaW4KKyAqIEBhdXRob3IgUGF1bCBTcGVlZAorICogQGF1dGhvciBEYW4gU2FuZGJlcmcKKyAqIEBhdXRob3IgRGF2aWQgQmVja2VyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNTSUNvbmZpZyBpbXBsZW1lbnRzIFNTSUNvbW1hbmQgeworICAgIC8qKgorICAgICAqIEBzZWUgU1NJQ29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyBsb25nIHByb2Nlc3MoU1NJTWVkaWF0b3Igc3NpTWVkaWF0b3IsIFN0cmluZyBjb21tYW5kTmFtZSwKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtTmFtZXMsIFN0cmluZ1tdIHBhcmFtVmFsdWVzLCBQcmludFdyaXRlciB3cml0ZXIpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbU5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gcGFyYW1OYW1lc1tpXTsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlID0gcGFyYW1WYWx1ZXNbaV07CisgICAgICAgICAgICBTdHJpbmcgc3Vic3RpdHV0ZWRWYWx1ZSA9IHNzaU1lZGlhdG9yCisgICAgICAgICAgICAgICAgICAgIC5zdWJzdGl0dXRlVmFyaWFibGVzKHBhcmFtVmFsdWUpOworICAgICAgICAgICAgaWYgKHBhcmFtTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJlcnJtc2ciKSkgeworICAgICAgICAgICAgICAgIHNzaU1lZGlhdG9yLnNldENvbmZpZ0Vyck1zZyhzdWJzdGl0dXRlZFZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFsc0lnbm9yZUNhc2UoInNpemVmbXQiKSkgeworICAgICAgICAgICAgICAgIHNzaU1lZGlhdG9yLnNldENvbmZpZ1NpemVGbXQoc3Vic3RpdHV0ZWRWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ0aW1lZm10IikpIHsKKyAgICAgICAgICAgICAgICBzc2lNZWRpYXRvci5zZXRDb25maWdUaW1lRm10KHN1YnN0aXR1dGVkVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzc2lNZWRpYXRvci5sb2coIiNjb25maWctLUludmFsaWQgYXR0cmlidXRlOiAiICsgcGFyYW1OYW1lKTsKKyAgICAgICAgICAgICAgICAvL1dlIG5lZWQgdG8gZmV0Y2ggdGhpcyB2YWx1ZSBlYWNoIHRpbWUsIHNpbmNlIGl0IG1heSBjaGFuZ2UKKyAgICAgICAgICAgICAgICAvLyBkdXJpbmcgdGhlCisgICAgICAgICAgICAgICAgLy8gbG9vcAorICAgICAgICAgICAgICAgIFN0cmluZyBjb25maWdFcnJNc2cgPSBzc2lNZWRpYXRvci5nZXRDb25maWdFcnJNc2coKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoY29uZmlnRXJyTXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBTZXR0aW5nIGNvbmZpZyBvcHRpb25zIGRvZXNuJ3QgcmVhbGx5IGNoYW5nZSB0aGUgcGFnZQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lFY2hvLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUVjaG8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGY5NDQxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lFY2hvLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBMaWNlbnNlZCB1bmRlciB0aGUKKyAqIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlCisgKiBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzCisgKiBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlCisgKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3NpOworCisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworLyoqCisgKiBSZXR1cm4gdGhlIHJlc3VsdCBhc3NvY2lhdGVkIHdpdGggdGhlIHN1cHBsaWVkIFNlcnZlciBWYXJpYWJsZS4KKyAqIAorICogQGF1dGhvciBCaXAgVGhlbGluCisgKiBAYXV0aG9yIFBhdWwgU3BlZWQKKyAqIEBhdXRob3IgRGFuIFNhbmRiZXJnCisgKiBAYXV0aG9yIERhdmlkIEJlY2tlcgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBTU0lFY2hvIGltcGxlbWVudHMgU1NJQ29tbWFuZCB7CisgICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9FTkNPRElORyA9ICJlbnRpdHkiOworICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfVkFSSUFCTEVfVkFMVUUgPSAiKG5vbmUpIjsKKworCisgICAgLyoqCisgICAgICogQHNlZSBTU0lDb21tYW5kCisgICAgICovCisgICAgcHVibGljIGxvbmcgcHJvY2VzcyhTU0lNZWRpYXRvciBzc2lNZWRpYXRvciwgU3RyaW5nIGNvbW1hbmROYW1lLAorICAgICAgICAgICAgU3RyaW5nW10gcGFyYW1OYW1lcywgU3RyaW5nW10gcGFyYW1WYWx1ZXMsIFByaW50V3JpdGVyIHdyaXRlcikgeworICAgIAlsb25nIGxhc3RNb2RpZmllZCA9IDA7CisgICAgICAgIFN0cmluZyBlbmNvZGluZyA9IERFRkFVTFRfRU5DT0RJTkc7CisgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBzc2lNZWRpYXRvci5nZXRDb25maWdFcnJNc2coKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbU5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gcGFyYW1OYW1lc1tpXTsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlID0gcGFyYW1WYWx1ZXNbaV07CisgICAgICAgICAgICBpZiAocGFyYW1OYW1lLmVxdWFsc0lnbm9yZUNhc2UoInZhciIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhcmlhYmxlVmFsdWUgPSBzc2lNZWRpYXRvci5nZXRWYXJpYWJsZVZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZSwgZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZVZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVWYWx1ZSA9IE1JU1NJTkdfVkFSSUFCTEVfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSh2YXJpYWJsZVZhbHVlKTsKKyAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFsc0lnbm9yZUNhc2UoImVuY29kaW5nIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZEVuY29kaW5nKHBhcmFtVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gcGFyYW1WYWx1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzc2lNZWRpYXRvci5sb2coIiNlY2hvLS1JbnZhbGlkIGVuY29kaW5nOiAiICsgcGFyYW1WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShlcnJvck1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3NpTWVkaWF0b3IubG9nKCIjZWNoby0tSW52YWxpZCBhdHRyaWJ1dGU6ICIgKyBwYXJhbU5hbWUpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShlcnJvck1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBsYXN0TW9kaWZpZWQ7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkRW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIHJldHVybiBlbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJ1cmwiKQorICAgICAgICAgICAgICAgIHx8IGVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoImVudGl0eSIpCisgICAgICAgICAgICAgICAgfHwgZW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgibm9uZSIpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUV4ZWMuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJRXhlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNDA2NDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUV4ZWMuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIExpY2Vuc2VkIHVuZGVyIHRoZQorICogQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUKKyAqIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKKyAqIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKKyAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zc2k7CisKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLklPVG9vbHM7CisvKioKKyAqIEltcGxlbWVudHMgdGhlIFNlcnZlci1zaWRlICNleGVjIGNvbW1hbmQKKyAqIAorICogQGF1dGhvciBCaXAgVGhlbGluCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEBhdXRob3IgUGF1bCBTcGVlZAorICogQGF1dGhvciBEYW4gU2FuZGJlcmcKKyAqIEBhdXRob3IgRGF2aWQgQmVja2VyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFNTSUV4ZWMgaW1wbGVtZW50cyBTU0lDb21tYW5kIHsKKyAgICBwcm90ZWN0ZWQgU1NJSW5jbHVkZSBzc2lJbmNsdWRlID0gbmV3IFNTSUluY2x1ZGUoKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRSA9IDEwMjQ7CisKKworICAgIC8qKgorICAgICAqIEBzZWUgU1NJQ29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyBsb25nIHByb2Nlc3MoU1NJTWVkaWF0b3Igc3NpTWVkaWF0b3IsIFN0cmluZyBjb21tYW5kTmFtZSwKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtTmFtZXMsIFN0cmluZ1tdIHBhcmFtVmFsdWVzLCBQcmludFdyaXRlciB3cml0ZXIpIHsKKyAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSAwOworICAgICAgICBTdHJpbmcgY29uZmlnRXJyTXNnID0gc3NpTWVkaWF0b3IuZ2V0Q29uZmlnRXJyTXNnKCk7CisgICAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSBwYXJhbU5hbWVzWzBdOworICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IHBhcmFtVmFsdWVzWzBdOworICAgICAgICBTdHJpbmcgc3Vic3RpdHV0ZWRWYWx1ZSA9IHNzaU1lZGlhdG9yLnN1YnN0aXR1dGVWYXJpYWJsZXMocGFyYW1WYWx1ZSk7CisgICAgICAgIGlmIChwYXJhbU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiY2dpIikpIHsKKyAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9IHNzaUluY2x1ZGUucHJvY2Vzcyhzc2lNZWRpYXRvciwgImluY2x1ZGUiLAorICAgICAgICAgICAgICAgICAgICAJCQluZXcgU3RyaW5nW117InZpcnR1YWwifSwgbmV3IFN0cmluZ1tde3N1YnN0aXR1dGVkVmFsdWV9LAorCQkJCQkJCQl3cml0ZXIpOworICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJjbWQiKSkgeworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZFByb2dyYW0gPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUnVudGltZSBydCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOworICAgICAgICAgICAgICAgIFByb2Nlc3MgcHJvYyA9IHJ0LmV4ZWMoc3Vic3RpdHV0ZWRWYWx1ZSk7CisgICAgICAgICAgICAgICAgZm91bmRQcm9ncmFtID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBzdGRPdXRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpKSk7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3RkRXJyUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2MuZ2V0RXJyb3JTdHJlYW0oKSkpOworICAgICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcltCVUZGRVJfU0laRV07CisgICAgICAgICAgICAgICAgSU9Ub29scy5mbG93KHN0ZEVyclJlYWRlciwgd3JpdGVyLCBidWYpOworICAgICAgICAgICAgICAgIElPVG9vbHMuZmxvdyhzdGRPdXRSZWFkZXIsIHdyaXRlciwgYnVmKTsKKyAgICAgICAgICAgICAgICBwcm9jLndhaXRGb3IoKTsKKyAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgc3NpTWVkaWF0b3IubG9nKCJDb3VsZG4ndCBleGVjIGZpbGU6ICIgKyBzdWJzdGl0dXRlZFZhbHVlLCBlKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoY29uZmlnRXJyTXNnKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZvdW5kUHJvZ3JhbSkgeworICAgICAgICAgICAgICAgICAgICAvL2FwYWNoZSBkb2Vzbid0IG91dHB1dCBhbiBlcnJvciBtZXNzYWdlIGlmIGl0IGNhbid0IGZpbmQKKyAgICAgICAgICAgICAgICAgICAgLy8gYSBwcm9ncmFtCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNzaU1lZGlhdG9yLmxvZygiQ291bGRuJ3QgZXhlYyBmaWxlOiAiICsgc3Vic3RpdHV0ZWRWYWx1ZSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhc3RNb2RpZmllZDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lFeHRlcm5hbFJlc29sdmVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUV4dGVybmFsUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzY0ZDhkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lFeHRlcm5hbFJlc29sdmVyLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBMaWNlbnNlZCB1bmRlciB0aGUKKyAqIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlCisgKiBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzCisgKiBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlCisgKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3NpOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworLyoqCisgKiBJbnRlcmZhY2UgdXNlZCBieSBTU0lNZWRpYXRvciB0byB0YWxrIHRvIHRoZSAnb3V0c2lkZSB3b3JsZCcgKCB1c3VhbGx5IGEKKyAqIHNlcnZsZXQgKQorICogCisgKiBAYXV0aG9yIERhbiBTYW5kYmVyZworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU1NJRXh0ZXJuYWxSZXNvbHZlciB7CisgICAgLyoqCisgICAgICogQWRkcyBhbnkgZXh0ZXJuYWwgdmFyaWFibGVzIHRvIHRoZSB2YXJpYWJsZU5hbWVzIGNvbGxlY3Rpb24uCisgICAgICogCisgICAgICogQHBhcmFtIHZhcmlhYmxlTmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIHRvIGFkZCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFZhcmlhYmxlTmFtZXMoQ29sbGVjdGlvbiB2YXJpYWJsZU5hbWVzKTsKKworCisgICAgcHVibGljIFN0cmluZyBnZXRWYXJpYWJsZVZhbHVlKFN0cmluZyBuYW1lKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lZCB2YXJpYWJsZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJZiB2YWx1ZSBpcyBudWxsLCB0aGVuCisgICAgICogdGhlIHZhcmlhYmxlIHdpbGwgYmUgcmVtb3ZlZCAoIGllLiBhIGNhbGwgdG8gZ2V0VmFyaWFibGVWYWx1ZSB3aWxsCisgICAgICogcmV0dXJuIG51bGwgKQorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICBvZiB0aGUgdmFyaWFibGUKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIG9mIHRoZSB2YXJpYWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhcmlhYmxlVmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZGF0ZS4gVGhpcyBpcyB1c2VmdWwgZm9yIHB1dHRpbmcgdGhlIFNTSSBzdHVmZiBpbiBhCisgICAgICogcmVncmVzc2lvbiB0ZXN0LiBTaW5jZSB5b3UgY2FuIG1ha2UgdGhlIGN1cnJlbnQgZGF0ZSBhIGNvbnN0YW50LCBpdAorICAgICAqIG1ha2VzIHRlc3RpbmcgZWFzaWVyIHNpbmNlIHRoZSBvdXRwdXQgd29uJ3QgY2hhbmdlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0ZSBnZXRDdXJyZW50RGF0ZSgpOworCisKKyAgICBwdWJsaWMgbG9uZyBnZXRGaWxlU2l6ZShTdHJpbmcgcGF0aCwgYm9vbGVhbiB2aXJ0dWFsKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKworICAgIHB1YmxpYyBsb25nIGdldEZpbGVMYXN0TW9kaWZpZWQoU3RyaW5nIHBhdGgsIGJvb2xlYW4gdmlydHVhbCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlVGV4dChTdHJpbmcgcGF0aCwgYm9vbGVhbiB2aXJ0dWFsKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKworICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lGaWx0ZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxYzNkMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJRmlsdGVyLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gTGljZW5zZWQgdW5kZXIgdGhlCisgKiBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZQorICogbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcworICogZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZQorICogZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaTsKKworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKKy8qKgorICogRmlsdGVyIHRvIHByb2Nlc3MgU1NJIHJlcXVlc3RzIHdpdGhpbiBhIHdlYnBhZ2UuIE1hcHBlZCB0byBhIGNvbnRlbnQgdHlwZXMKKyAqIGZyb20gd2l0aGluIHdlYi54bWwuCisgKiAKKyAqIEBhdXRob3IgRGF2aWQgQmVja2VyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5zc2kuU1NJU2VydmxldAorICovCitwdWJsaWMgY2xhc3MgU1NJRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKKwlwcm90ZWN0ZWQgRmlsdGVyQ29uZmlnIGNvbmZpZyA9IG51bGw7CisgICAgLyoqIERlYnVnIGxldmVsIGZvciB0aGlzIHNlcnZsZXQuICovCisgICAgcHJvdGVjdGVkIGludCBkZWJ1ZyA9IDA7CisgICAgLyoqIEV4cGlyYXRpb24gdGltZSBpbiBzZWNvbmRzIGZvciB0aGUgZG9jLiAqLworICAgIHByb3RlY3RlZCBMb25nIGV4cGlyZXMgPSBudWxsOworICAgIC8qKiB2aXJ0dWFsIHBhdGggY2FuIGJlIHdlYmFwcC1yZWxhdGl2ZSAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmlydHVhbFdlYmFwcFJlbGF0aXZlID0gZmFsc2U7CisgICAgLyoqIHJlZ2V4IHBhdHRlcm4gdG8gbWF0Y2ggd2hlbiBldmFsdWF0aW5nIGNvbnRlbnQgdHlwZXMgKi8KKwlwcm90ZWN0ZWQgUGF0dGVybiBjb250ZW50VHlwZVJlZ0V4ID0gbnVsbDsKKwkvKiogZGVmYXVsdCBwYXR0ZXJuIGZvciBzc2kgZmlsdGVyIGNvbnRlbnQgdHlwZSBtYXRjaGluZyAqLworCXByb3RlY3RlZCBQYXR0ZXJuIHNodG1sUmVnRXggPQorICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoInRleHQveC1zZXJ2ZXItcGFyc2VkLWh0bWwoOy4qKT8iKTsKKworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgbWV0aG9kcy4KKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMgc2VydmxldC4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAJdGhpcy5jb25maWcgPSBjb25maWc7CisgICAgCQorICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsdWUgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiZGVidWciKTsKKyAgICAgICAgICAgIGRlYnVnID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbHVlID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImNvbnRlbnRUeXBlIik7CisgICAgICAgICAgICBjb250ZW50VHlwZVJlZ0V4ID0gUGF0dGVybi5jb21waWxlKHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGNvbnRlbnRUeXBlUmVnRXggPSBzaHRtbFJlZ0V4OworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIG1zZy5hcHBlbmQoIkludmFsaWQgZm9ybWF0IG9yIG5vIGNvbnRlbnRUeXBlIGluaXRQYXJhbTsgIik7CisgICAgICAgICAgICBtc2cuYXBwZW5kKCJleHBlY3RlZCByZWd1bGFyIGV4cHJlc3Npb247IGRlZmF1bHRpbmcgdG8gIik7CisgICAgICAgICAgICBtc2cuYXBwZW5kKHNodG1sUmVnRXgucGF0dGVybigpKTsKKyAgICAgICAgICAgIGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmxvZyhtc2cudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbHVlID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICJpc1ZpcnR1YWxXZWJhcHBSZWxhdGl2ZSIpOworICAgICAgICAgICAgaXNWaXJ0dWFsV2ViYXBwUmVsYXRpdmUgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSA+IDA/dHJ1ZTpmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsdWUgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiZXhwaXJlcyIpOworICAgICAgICAgICAgZXhwaXJlcyA9IExvbmcudmFsdWVPZih2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleHBpcmVzID0gbnVsbDsKKyAgICAgICAgICAgIGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmxvZygKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBmb3JtYXQgZm9yIGV4cGlyZXMgaW5pdFBhcmFtOyBleHBlY3RlZCBpbnRlZ2VyIChzZWNvbmRzKSIKKyAgICAgICAgICAgICk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYnVnID4gMCkKKyAgICAgICAgICAgIGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmxvZygKKyAgICAgICAgICAgICAgICAgICAgIlNTSUZpbHRlci5pbml0KCkgU1NJIGludm9rZXIgc3RhcnRlZCB3aXRoICdkZWJ1Zyc9IiArIGRlYnVnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICBGaWx0ZXJDaGFpbiBjaGFpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY2FzdCBvbmNlCisgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEgPSAoSHR0cFNlcnZsZXRSZXF1ZXN0KXJlcXVlc3Q7CisgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzID0gKEh0dHBTZXJ2bGV0UmVzcG9uc2UpcmVzcG9uc2U7CisgICAgICAgIAorICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IHdlJ3JlIGluIFNTSSBwcm9jZXNzaW5nCisgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoR2xvYmFscy5TU0lfRkxBR19BVFRSLCAidHJ1ZSIpOyAgICAgICAgICAgCisKKyAgICAgICAgLy8gc2V0dXAgdG8gY2FwdHVyZSBvdXRwdXQKKyAgICAgICAgQnl0ZUFycmF5U2VydmxldE91dHB1dFN0cmVhbSBiYXNvcyA9IG5ldyBCeXRlQXJyYXlTZXJ2bGV0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIFJlc3BvbnNlSW5jbHVkZVdyYXBwZXIgcmVzcG9uc2VJbmNsdWRlV3JhcHBlciA9CisgICAgICAgICAgICBuZXcgUmVzcG9uc2VJbmNsdWRlV3JhcHBlcihjb25maWcuZ2V0U2VydmxldENvbnRleHQoKSxyZXEsIHJlcywgYmFzb3MpOworCisgICAgICAgIC8vIHByb2Nlc3MgcmVtYWluZGVyIG9mIGZpbHRlciBjaGFpbgorICAgICAgICBjaGFpbi5kb0ZpbHRlcihyZXEsIHJlc3BvbnNlSW5jbHVkZVdyYXBwZXIpOworCisgICAgICAgIC8vIHdlIGNhbid0IGFzc3VtZSB0aGUgY2hhaW4gZmx1c2hlZCBpdHMgb3V0cHV0CisgICAgICAgIHJlc3BvbnNlSW5jbHVkZVdyYXBwZXIuZmx1c2hPdXRwdXRTdHJlYW1PcldyaXRlcigpOworICAgICAgICBieXRlW10gYnl0ZXMgPSBiYXNvcy50b0J5dGVBcnJheSgpOworCisgICAgICAgIC8vIGdldCBjb250ZW50IHR5cGUKKyAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gcmVzcG9uc2VJbmNsdWRlV3JhcHBlci5nZXRDb250ZW50VHlwZSgpOworCisgICAgICAgIC8vIGlzIHRoaXMgYW4gYWxsb3dlZCB0eXBlIGZvciBTU0kgcHJvY2Vzc2luZz8KKyAgICAgICAgaWYgKGNvbnRlbnRUeXBlUmVnRXgubWF0Y2hlcihjb250ZW50VHlwZSkubWF0Y2hlcygpKSB7CisgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSByZXMuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTsKKworICAgICAgICAgICAgLy8gc2V0IHVwIFNTSSBwcm9jZXNzaW5nIAorICAgICAgICAgICAgU1NJRXh0ZXJuYWxSZXNvbHZlciBzc2lFeHRlcm5hbFJlc29sdmVyID0KKyAgICAgICAgICAgICAgICBuZXcgU1NJU2VydmxldEV4dGVybmFsUmVzb2x2ZXIoY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCksIHJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgaXNWaXJ0dWFsV2ViYXBwUmVsYXRpdmUsIGRlYnVnLCBlbmNvZGluZyk7CisgICAgICAgICAgICBTU0lQcm9jZXNzb3Igc3NpUHJvY2Vzc29yID0gbmV3IFNTSVByb2Nlc3Nvcihzc2lFeHRlcm5hbFJlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICBkZWJ1Zyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIHByZXBhcmUgcmVhZGVycy93cml0ZXJzCisgICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0KKyAgICAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSwgZW5jb2RpbmcpOworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHNzaW91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9CisgICAgICAgICAgICAgICAgbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3Npb3V0LCBlbmNvZGluZykpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBkbyBTU0kgcHJvY2Vzc2luZyAgCisgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IHNzaVByb2Nlc3Nvci5wcm9jZXNzKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VJbmNsdWRlV3JhcHBlci5nZXRMYXN0TW9kaWZpZWQoKSwgd3JpdGVyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gc2V0IG91dHB1dCBieXRlcworICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICBieXRlcyA9IHNzaW91dC50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBvdmVycmlkZSBoZWFkZXJzCisgICAgICAgICAgICBpZiAoZXhwaXJlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVzLnNldERhdGVIZWFkZXIoImV4cGlyZXMiLCAobmV3IGphdmEudXRpbC5EYXRlKCkpLmdldFRpbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBleHBpcmVzLmxvbmdWYWx1ZSgpICogMTAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkID4gMCkgeworICAgICAgICAgICAgICAgIHJlcy5zZXREYXRlSGVhZGVyKCJsYXN0LW1vZGlmaWVkIiwgbGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcy5zZXRDb250ZW50TGVuZ3RoKGJ5dGVzLmxlbmd0aCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE1hdGNoZXIgc2h0bWxNYXRjaGVyID0KKyAgICAgICAgICAgICAgICBzaHRtbFJlZ0V4Lm1hdGNoZXIocmVzcG9uc2VJbmNsdWRlV3JhcHBlci5nZXRDb250ZW50VHlwZSgpKTsKKyAgICAgICAgICAgIGlmIChzaHRtbE1hdGNoZXIubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAJLy8gQ29udmVydCBzaHRtbCBtaW1lIHR5cGUgdG8gb3JkaW5hcnkgaHRtbCBtaW1lIHR5cGUgYnV0IHByZXNlcnZlCisgICAgICAgICAgICAgICAgLy8gZW5jb2RpbmcsIGlmIGFueS4KKyAgICAgICAgICAgIAlTdHJpbmcgZW5jID0gc2h0bWxNYXRjaGVyLmdyb3VwKDEpOworICAgICAgICAgICAgCXJlcy5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIiArICgoZW5jICE9IG51bGwpID8gZW5jIDogIiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHdyaXRlIG91dHB1dAorICAgICAgICB0cnkgeworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHJlcy5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIG91dC53cml0ZShieXRlcyk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBXcml0ZXIgb3V0ID0gcmVzLmdldFdyaXRlcigpOworICAgICAgICAgICAgb3V0LndyaXRlKG5ldyBTdHJpbmcoYnl0ZXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lGbGFzdG1vZC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lGbGFzdG1vZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkM2JlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUZsYXN0bW9kLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBMaWNlbnNlZCB1bmRlciB0aGUKKyAqIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlCisgKiBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzCisgKiBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlCisgKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3NpOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkRhdGVUb29sOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJmdGltZTsKKy8qKgorICogSW1wbGVtZW50cyB0aGUgU2VydmVyLXNpZGUgI2ZsYXN0bW9kIGNvbW1hbmQKKyAqIAorICogQGF1dGhvciBCaXAgVGhlbGluCisgKiBAYXV0aG9yIFBhdWwgU3BlZWQKKyAqIEBhdXRob3IgRGFuIFNhbmRiZXJnCisgKiBAYXV0aG9yIERhdmlkIEJlY2tlcgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTU0lGbGFzdG1vZCBpbXBsZW1lbnRzIFNTSUNvbW1hbmQgeworICAgIC8qKgorICAgICAqIEBzZWUgU1NJQ29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyBsb25nIHByb2Nlc3MoU1NJTWVkaWF0b3Igc3NpTWVkaWF0b3IsIFN0cmluZyBjb21tYW5kTmFtZSwKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtTmFtZXMsIFN0cmluZ1tdIHBhcmFtVmFsdWVzLCBQcmludFdyaXRlciB3cml0ZXIpIHsKKyAgICAJbG9uZyBsYXN0TW9kaWZpZWQgPSAwOworICAgICAgICBTdHJpbmcgY29uZmlnRXJyTXNnID0gc3NpTWVkaWF0b3IuZ2V0Q29uZmlnRXJyTXNnKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1OYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IHBhcmFtTmFtZXNbaV07CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IHBhcmFtVmFsdWVzW2ldOworICAgICAgICAgICAgU3RyaW5nIHN1YnN0aXR1dGVkVmFsdWUgPSBzc2lNZWRpYXRvcgorICAgICAgICAgICAgICAgICAgICAuc3Vic3RpdHV0ZVZhcmlhYmxlcyhwYXJhbVZhbHVlKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJmaWxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ2aXJ0dWFsIikpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB2aXJ0dWFsID0gcGFyYW1OYW1lLmVxdWFsc0lnbm9yZUNhc2UoInZpcnR1YWwiKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkID0gc3NpTWVkaWF0b3IuZ2V0RmlsZUxhc3RNb2RpZmllZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdGl0dXRlZFZhbHVlLCB2aXJ0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgRGF0ZSBkYXRlID0gbmV3IERhdGUobGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbmZpZ1RpbWVGbXQgPSBzc2lNZWRpYXRvci5nZXRDb25maWdUaW1lRm10KCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShmb3JtYXREYXRlKGRhdGUsIGNvbmZpZ1RpbWVGbXQpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzc2lNZWRpYXRvci5sb2coIiNmbGFzdG1vZC0tSW52YWxpZCBhdHRyaWJ1dGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhcmFtTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShjb25maWdFcnJNc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBzc2lNZWRpYXRvci5sb2coCisgICAgICAgICAgICAgICAgICAgICAgICAiI2ZsYXN0bW9kLS1Db3VsZG4ndCBnZXQgbGFzdCBtb2RpZmllZCBmb3IgZmlsZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN1YnN0aXR1dGVkVmFsdWUsIGUpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShjb25maWdFcnJNc2cpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBsYXN0TW9kaWZpZWQ7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdERhdGUoRGF0ZSBkYXRlLCBTdHJpbmcgY29uZmlnVGltZUZtdCkgeworICAgICAgICBTdHJmdGltZSBzdHJmdGltZSA9IG5ldyBTdHJmdGltZShjb25maWdUaW1lRm10LCBEYXRlVG9vbC5MT0NBTEVfVVMpOworICAgICAgICByZXR1cm4gc3RyZnRpbWUuZm9ybWF0KGRhdGUpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUZzaXplLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUZzaXplLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzYzJiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJRnNpemUuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBMaWNlbnNlZCB1bmRlciB0aGUKKyAqIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlCisgKiBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzCisgKiBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlCisgKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3NpOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQ7CisvKioKKyAqIEltcGxlbWVudHMgdGhlIFNlcnZlci1zaWRlICNmc2l6ZSBjb21tYW5kCisgKiAKKyAqIEBhdXRob3IgQmlwIFRoZWxpbgorICogQGF1dGhvciBQYXVsIFNwZWVkCisgKiBAYXV0aG9yIERhbiBTYW5kYmVyZworICogQGF1dGhvciBEYXZpZCBCZWNrZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU1NJRnNpemUgaW1wbGVtZW50cyBTU0lDb21tYW5kIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBPTkVfS0lMT0JZVEUgPSAxMDI0OworICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IE9ORV9NRUdBQllURSA9IDEwMjQgKiAxMDI0OworCisKKyAgICAvKioKKyAgICAgKiBAc2VlIFNTSUNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBwcm9jZXNzKFNTSU1lZGlhdG9yIHNzaU1lZGlhdG9yLCBTdHJpbmcgY29tbWFuZE5hbWUsCisgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbU5hbWVzLCBTdHJpbmdbXSBwYXJhbVZhbHVlcywgUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gMDsKKyAgICAgICAgU3RyaW5nIGNvbmZpZ0Vyck1zZyA9IHNzaU1lZGlhdG9yLmdldENvbmZpZ0Vyck1zZygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtTmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSBwYXJhbU5hbWVzW2ldOworICAgICAgICAgICAgU3RyaW5nIHBhcmFtVmFsdWUgPSBwYXJhbVZhbHVlc1tpXTsKKyAgICAgICAgICAgIFN0cmluZyBzdWJzdGl0dXRlZFZhbHVlID0gc3NpTWVkaWF0b3IKKyAgICAgICAgICAgICAgICAgICAgLnN1YnN0aXR1dGVWYXJpYWJsZXMocGFyYW1WYWx1ZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChwYXJhbU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiZmlsZSIpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgidmlydHVhbCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdmlydHVhbCA9IHBhcmFtTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ2aXJ0dWFsIik7CisgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9IHNzaU1lZGlhdG9yLmdldEZpbGVMYXN0TW9kaWZpZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RpdHV0ZWRWYWx1ZSwgdmlydHVhbCk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgc2l6ZSA9IHNzaU1lZGlhdG9yLmdldEZpbGVTaXplKHN1YnN0aXR1dGVkVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb25maWdTaXplRm10ID0gc3NpTWVkaWF0b3IuZ2V0Q29uZmlnU2l6ZUZtdCgpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoZm9ybWF0U2l6ZShzaXplLCBjb25maWdTaXplRm10KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3NpTWVkaWF0b3IubG9nKCIjZnNpemUtLUludmFsaWQgYXR0cmlidXRlOiAiICsgcGFyYW1OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGNvbmZpZ0Vyck1zZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHNzaU1lZGlhdG9yLmxvZygiI2ZzaXplLS1Db3VsZG4ndCBnZXQgc2l6ZSBmb3IgZmlsZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBzdWJzdGl0dXRlZFZhbHVlLCBlKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoY29uZmlnRXJyTXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFzdE1vZGlmaWVkOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyByZXBlYXQoY2hhciBhQ2hhciwgaW50IG51bUNoYXJzKSB7CisgICAgICAgIGlmIChudW1DaGFycyA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bSBjaGFycyBjYW4ndCBiZSBuZWdhdGl2ZSIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2hhcnM7IGkrKykgeworICAgICAgICAgICAgYnVmLmFwcGVuZChhQ2hhcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBwYWRMZWZ0KFN0cmluZyBzdHIsIGludCBtYXhDaGFycykgeworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3RyOworICAgICAgICBpbnQgY2hhcnNUb0FkZCA9IG1heENoYXJzIC0gc3RyLmxlbmd0aCgpOworICAgICAgICBpZiAoY2hhcnNUb0FkZCA+IDApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlcGVhdCgnICcsIGNoYXJzVG9BZGQpICsgc3RyOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisKKyAgICAvL1dlIHRyeSB0byBtaW1pY2sgQXBhY2hlIGhlcmUsIGFzIHdlIGRvIGV2ZXJ5d2hlcmUKKyAgICAvL0FsbCB0aGUgJ21hZ2ljJyBudW1iZXJzIGFyZSBmcm9tIHRoZSB1dGlsX3NjcmlwdC5jIEFwYWNoZSBzb3VyY2UgZmlsZS4KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdFNpemUobG9uZyBzaXplLCBTdHJpbmcgZm9ybWF0KSB7CisgICAgICAgIFN0cmluZyByZXRTdHJpbmcgPSAiIjsKKyAgICAgICAgaWYgKGZvcm1hdC5lcXVhbHNJZ25vcmVDYXNlKCJieXRlcyIpKSB7CisgICAgICAgICAgICBEZWNpbWFsRm9ybWF0IGRlY2ltYWxGb3JtYXQgPSBuZXcgRGVjaW1hbEZvcm1hdCgiIywjIzAiKTsKKyAgICAgICAgICAgIHJldFN0cmluZyA9IGRlY2ltYWxGb3JtYXQuZm9ybWF0KHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldFN0cmluZyA9ICIwayI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNpemUgPCBPTkVfS0lMT0JZVEUpIHsKKyAgICAgICAgICAgICAgICByZXRTdHJpbmcgPSAiMWsiOworICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplIDwgT05FX01FR0FCWVRFKSB7CisgICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gTG9uZy50b1N0cmluZygoc2l6ZSArIDUxMikgLyBPTkVfS0lMT0JZVEUpOworICAgICAgICAgICAgICAgIHJldFN0cmluZyArPSAiayI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNpemUgPCA5OSAqIE9ORV9NRUdBQllURSkgeworICAgICAgICAgICAgICAgIERlY2ltYWxGb3JtYXQgZGVjaW1hbEZvcm1hdCA9IG5ldyBEZWNpbWFsRm9ybWF0KCIwLjBNIik7CisgICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gZGVjaW1hbEZvcm1hdC5mb3JtYXQoc2l6ZSAvIChkb3VibGUpT05FX01FR0FCWVRFKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gTG9uZy50b1N0cmluZygoc2l6ZSArICg1MjkgKiBPTkVfS0lMT0JZVEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgLyBPTkVfTUVHQUJZVEUpOworICAgICAgICAgICAgICAgIHJldFN0cmluZyArPSAiTSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXRTdHJpbmcgPSBwYWRMZWZ0KHJldFN0cmluZywgNSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldFN0cmluZzsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lJbmNsdWRlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUluY2x1ZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTI1NjgzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lJbmNsdWRlLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBMaWNlbnNlZCB1bmRlciB0aGUKKyAqIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlCisgKiBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzCisgKiBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlCisgKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3NpOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisvKioKKyAqIEltcGxlbWVudHMgdGhlIFNlcnZlci1zaWRlICNpbmNsdWRlIGNvbW1hbmQKKyAqIAorICogQGF1dGhvciBCaXAgVGhlbGluCisgKiBAYXV0aG9yIFBhdWwgU3BlZWQKKyAqIEBhdXRob3IgRGFuIFNhbmRiZXJnCisgKiBAYXV0aG9yIERhdmlkIEJlY2tlcgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTU0lJbmNsdWRlIGltcGxlbWVudHMgU1NJQ29tbWFuZCB7CisgICAgLyoqCisgICAgICogQHNlZSBTU0lDb21tYW5kCisgICAgICovCisgICAgcHVibGljIGxvbmcgcHJvY2VzcyhTU0lNZWRpYXRvciBzc2lNZWRpYXRvciwgU3RyaW5nIGNvbW1hbmROYW1lLAorICAgICAgICAgICAgU3RyaW5nW10gcGFyYW1OYW1lcywgU3RyaW5nW10gcGFyYW1WYWx1ZXMsIFByaW50V3JpdGVyIHdyaXRlcikgeworICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IDA7CisgICAgICAgIFN0cmluZyBjb25maWdFcnJNc2cgPSBzc2lNZWRpYXRvci5nZXRDb25maWdFcnJNc2coKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbU5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gcGFyYW1OYW1lc1tpXTsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlID0gcGFyYW1WYWx1ZXNbaV07CisgICAgICAgICAgICBTdHJpbmcgc3Vic3RpdHV0ZWRWYWx1ZSA9IHNzaU1lZGlhdG9yCisgICAgICAgICAgICAgICAgICAgIC5zdWJzdGl0dXRlVmFyaWFibGVzKHBhcmFtVmFsdWUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1OYW1lLmVxdWFsc0lnbm9yZUNhc2UoImZpbGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW1OYW1lLmVxdWFsc0lnbm9yZUNhc2UoInZpcnR1YWwiKSkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHZpcnR1YWwgPSBwYXJhbU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgidmlydHVhbCIpOworICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQgPSBzc2lNZWRpYXRvci5nZXRGaWxlTGFzdE1vZGlmaWVkKAorICAgICAgICAgICAgICAgICAgICAJCSBzdWJzdGl0dXRlZFZhbHVlLCB2aXJ0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBzc2lNZWRpYXRvci5nZXRGaWxlVGV4dChzdWJzdGl0dXRlZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUodGV4dCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3NpTWVkaWF0b3IubG9nKCIjaW5jbHVkZS0tSW52YWxpZCBhdHRyaWJ1dGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhcmFtTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShjb25maWdFcnJNc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBzc2lNZWRpYXRvci5sb2coIiNpbmNsdWRlLS1Db3VsZG4ndCBpbmNsdWRlIGZpbGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgc3Vic3RpdHV0ZWRWYWx1ZSwgZSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGNvbmZpZ0Vyck1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhc3RNb2RpZmllZDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lNZWRpYXRvci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lNZWRpYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZjRlODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSU1lZGlhdG9yLmphdmEKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gTGljZW5zZWQgdW5kZXIgdGhlCisgKiBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZQorICogbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcworICogZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZQorICogZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaTsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkRhdGVUb29sOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJmdGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuVVJMRW5jb2RlcjsKKy8qKgorICogQWxsb3dzIHRoZSBkaWZmZXJlbnQgU1NJQ29tbWFuZCBpbXBsZW1lbnRhdGlvbnMgdG8gc2hhcmUgZGF0YS90YWxrIHRvIGVhY2gKKyAqIG90aGVyCisgKiAKKyAqIEBhdXRob3IgQmlwIFRoZWxpbgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAYXV0aG9yIFBhdWwgU3BlZWQKKyAqIEBhdXRob3IgRGFuIFNhbmRiZXJnCisgKiBAYXV0aG9yIERhdmlkIEJlY2tlcgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBTU0lNZWRpYXRvciB7CisgICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9DT05GSUdfRVJSX01TRyA9ICJbYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGlzIGRpcmVjdGl2ZV0iOworICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfQ09ORklHX1RJTUVfRk1UID0gIiVBLCAlZC0lYi0lWSAlVCAlWiI7CisgICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9DT05GSUdfU0laRV9GTVQgPSAiYWJicmV2IjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFVSTEVuY29kZXIgdXJsRW5jb2RlcjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbmZpZ0Vyck1zZyA9IERFRkFVTFRfQ09ORklHX0VSUl9NU0c7CisgICAgcHJvdGVjdGVkIFN0cmluZyBjb25maWdUaW1lRm10ID0gREVGQVVMVF9DT05GSUdfVElNRV9GTVQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBjb25maWdTaXplRm10ID0gREVGQVVMVF9DT05GSUdfU0laRV9GTVQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICBwcm90ZWN0ZWQgU1NJRXh0ZXJuYWxSZXNvbHZlciBzc2lFeHRlcm5hbFJlc29sdmVyOworICAgIHByb3RlY3RlZCBsb25nIGxhc3RNb2RpZmllZERhdGU7CisgICAgcHJvdGVjdGVkIGludCBkZWJ1ZzsKKyAgICBwcm90ZWN0ZWQgU3RyZnRpbWUgc3RyZnRpbWU7CisgICAgcHJvdGVjdGVkIFNTSUNvbmRpdGlvbmFsU3RhdGUgY29uZGl0aW9uYWxTdGF0ZSA9IG5ldyBTU0lDb25kaXRpb25hbFN0YXRlKCk7CisgICAgc3RhdGljIHsKKyAgICAgICAgLy9XZSB0cnkgdG8gZW5jb2RlIG9ubHkgdGhlIHNhbWUgY2hhcmFjdGVycyB0aGF0IGFwYWNoZSBkb2VzCisgICAgICAgIHVybEVuY29kZXIgPSBuZXcgVVJMRW5jb2RlcigpOworICAgICAgICB1cmxFbmNvZGVyLmFkZFNhZmVDaGFyYWN0ZXIoJywnKTsKKyAgICAgICAgdXJsRW5jb2Rlci5hZGRTYWZlQ2hhcmFjdGVyKCc6Jyk7CisgICAgICAgIHVybEVuY29kZXIuYWRkU2FmZUNoYXJhY3RlcignLScpOworICAgICAgICB1cmxFbmNvZGVyLmFkZFNhZmVDaGFyYWN0ZXIoJ18nKTsKKyAgICAgICAgdXJsRW5jb2Rlci5hZGRTYWZlQ2hhcmFjdGVyKCcuJyk7CisgICAgICAgIHVybEVuY29kZXIuYWRkU2FmZUNoYXJhY3RlcignKicpOworICAgICAgICB1cmxFbmNvZGVyLmFkZFNhZmVDaGFyYWN0ZXIoJy8nKTsKKyAgICAgICAgdXJsRW5jb2Rlci5hZGRTYWZlQ2hhcmFjdGVyKCchJyk7CisgICAgICAgIHVybEVuY29kZXIuYWRkU2FmZUNoYXJhY3RlcignficpOworICAgICAgICB1cmxFbmNvZGVyLmFkZFNhZmVDaGFyYWN0ZXIoJ1wnJyk7CisgICAgICAgIHVybEVuY29kZXIuYWRkU2FmZUNoYXJhY3RlcignKCcpOworICAgICAgICB1cmxFbmNvZGVyLmFkZFNhZmVDaGFyYWN0ZXIoJyknKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTU0lNZWRpYXRvcihTU0lFeHRlcm5hbFJlc29sdmVyIHNzaUV4dGVybmFsUmVzb2x2ZXIsCisgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZERhdGUsIGludCBkZWJ1ZykgeworICAgICAgICB0aGlzLnNzaUV4dGVybmFsUmVzb2x2ZXIgPSBzc2lFeHRlcm5hbFJlc29sdmVyOworICAgICAgICB0aGlzLmxhc3RNb2RpZmllZERhdGUgPSBsYXN0TW9kaWZpZWREYXRlOworICAgICAgICB0aGlzLmRlYnVnID0gZGVidWc7CisgICAgICAgIHNldENvbmZpZ1RpbWVGbXQoREVGQVVMVF9DT05GSUdfVElNRV9GTVQsIHRydWUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnRXJyTXNnKFN0cmluZyBjb25maWdFcnJNc2cpIHsKKyAgICAgICAgdGhpcy5jb25maWdFcnJNc2cgPSBjb25maWdFcnJNc2c7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdUaW1lRm10KFN0cmluZyBjb25maWdUaW1lRm10KSB7CisgICAgICAgIHNldENvbmZpZ1RpbWVGbXQoY29uZmlnVGltZUZtdCwgZmFsc2UpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnVGltZUZtdChTdHJpbmcgY29uZmlnVGltZUZtdCwgYm9vbGVhbiBmcm9tQ29uc3RydWN0b3IpIHsKKyAgICAgICAgdGhpcy5jb25maWdUaW1lRm10ID0gY29uZmlnVGltZUZtdDsKKyAgICAgICAgLy9XaGF0J3MgdGhlIHN0b3J5IGhlcmUgd2l0aCBEYXRlVG9vbC5MT0NBTEVfVVM/PyBXaHk/PworICAgICAgICB0aGlzLnN0cmZ0aW1lID0gbmV3IFN0cmZ0aW1lKGNvbmZpZ1RpbWVGbXQsIERhdGVUb29sLkxPQ0FMRV9VUyk7CisgICAgICAgIC8vVmFyaWFibGVzIGxpa2UgREFURV9MT0NBTCwgREFURV9HTVQsIGFuZCBMQVNUX01PRElGSUVEIG5lZWQgdG8gYmUKKyAgICAgICAgLy8gdXBkYXRlZCB3aGVuCisgICAgICAgIC8vdGhlIHRpbWVmbXQgY2hhbmdlcy4gVGhpcyBpcyB3aGF0IEFwYWNoZSBTU0kgZG9lcy4KKyAgICAgICAgc2V0RGF0ZVZhcmlhYmxlcyhmcm9tQ29uc3RydWN0b3IpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnU2l6ZUZtdChTdHJpbmcgY29uZmlnU2l6ZUZtdCkgeworICAgICAgICB0aGlzLmNvbmZpZ1NpemVGbXQgPSBjb25maWdTaXplRm10OworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRDb25maWdFcnJNc2coKSB7CisgICAgICAgIHJldHVybiBjb25maWdFcnJNc2c7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ1RpbWVGbXQoKSB7CisgICAgICAgIHJldHVybiBjb25maWdUaW1lRm10OworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRDb25maWdTaXplRm10KCkgeworICAgICAgICByZXR1cm4gY29uZmlnU2l6ZUZtdDsKKyAgICB9CisKKworICAgIHB1YmxpYyBTU0lDb25kaXRpb25hbFN0YXRlIGdldENvbmRpdGlvbmFsU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBjb25kaXRpb25hbFN0YXRlOworICAgIH0KKworCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0VmFyaWFibGVOYW1lcygpIHsKKyAgICAgICAgU2V0IHZhcmlhYmxlTmFtZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAvL1RoZXNlIGJ1aWx0LWluIHZhcmlhYmxlcyBhcmUgc3VwcGxpZWQgYnkgdGhlIG1lZGlhdG9yICggaWYgbm90CisgICAgICAgIC8vIG92ZXItd3JpdHRlbiBieQorICAgICAgICAvLyB0aGUgdXNlciApIGFuZCBhbHdheXMgZXhpc3QKKyAgICAgICAgdmFyaWFibGVOYW1lcy5hZGQoIkRBVEVfR01UIik7CisgICAgICAgIHZhcmlhYmxlTmFtZXMuYWRkKCJEQVRFX0xPQ0FMIik7CisgICAgICAgIHZhcmlhYmxlTmFtZXMuYWRkKCJMQVNUX01PRElGSUVEIik7CisgICAgICAgIHNzaUV4dGVybmFsUmVzb2x2ZXIuYWRkVmFyaWFibGVOYW1lcyh2YXJpYWJsZU5hbWVzKTsKKyAgICAgICAgLy9SZW1vdmUgYW55IHZhcmlhYmxlcyB0aGF0IGFyZSByZXNlcnZlZCBieSB0aGlzIGNsYXNzCisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB2YXJpYWJsZU5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGlzTmFtZVJlc2VydmVkKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFyaWFibGVOYW1lczsKKyAgICB9CisKKworICAgIHB1YmxpYyBsb25nIGdldEZpbGVTaXplKFN0cmluZyBwYXRoLCBib29sZWFuIHZpcnR1YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzc2lFeHRlcm5hbFJlc29sdmVyLmdldEZpbGVTaXplKHBhdGgsIHZpcnR1YWwpOworICAgIH0KKworCisgICAgcHVibGljIGxvbmcgZ2V0RmlsZUxhc3RNb2RpZmllZChTdHJpbmcgcGF0aCwgYm9vbGVhbiB2aXJ0dWFsKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNzaUV4dGVybmFsUmVzb2x2ZXIuZ2V0RmlsZUxhc3RNb2RpZmllZChwYXRoLCB2aXJ0dWFsKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZVRleHQoU3RyaW5nIHBhdGgsIGJvb2xlYW4gdmlydHVhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNzaUV4dGVybmFsUmVzb2x2ZXIuZ2V0RmlsZVRleHQocGF0aCwgdmlydHVhbCk7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc05hbWVSZXNlcnZlZChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKGNsYXNzTmFtZSArICIuIik7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmxlVmFsdWUoU3RyaW5nIHZhcmlhYmxlTmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0VmFyaWFibGVWYWx1ZSh2YXJpYWJsZU5hbWUsICJub25lIik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZVZhbHVlKFN0cmluZyB2YXJpYWJsZU5hbWUsIFN0cmluZyB2YXJpYWJsZVZhbHVlKSB7CisgICAgICAgIGlmICghaXNOYW1lUmVzZXJ2ZWQodmFyaWFibGVOYW1lKSkgeworICAgICAgICAgICAgc3NpRXh0ZXJuYWxSZXNvbHZlci5zZXRWYXJpYWJsZVZhbHVlKHZhcmlhYmxlTmFtZSwgdmFyaWFibGVWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyaWFibGVWYWx1ZShTdHJpbmcgdmFyaWFibGVOYW1lLCBTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgU3RyaW5nIGxvd2VyQ2FzZVZhcmlhYmxlTmFtZSA9IHZhcmlhYmxlTmFtZS50b0xvd2VyQ2FzZSgpOworICAgICAgICBTdHJpbmcgdmFyaWFibGVWYWx1ZSA9IG51bGw7CisgICAgICAgIGlmICghaXNOYW1lUmVzZXJ2ZWQobG93ZXJDYXNlVmFyaWFibGVOYW1lKSkgeworICAgICAgICAgICAgLy9UcnkgZ2V0dGluZyBpdCBleHRlcm5hbGx5IGZpcnN0LCBpZiBpdCBmYWlscywgdHJ5IGdldHRpbmcgdGhlCisgICAgICAgICAgICAvLyAnYnVpbHQtaW4nCisgICAgICAgICAgICAvLyB2YWx1ZQorICAgICAgICAgICAgdmFyaWFibGVWYWx1ZSA9IHNzaUV4dGVybmFsUmVzb2x2ZXIuZ2V0VmFyaWFibGVWYWx1ZSh2YXJpYWJsZU5hbWUpOworICAgICAgICAgICAgaWYgKHZhcmlhYmxlVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZSA9IHZhcmlhYmxlTmFtZS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgICAgIHZhcmlhYmxlVmFsdWUgPSAoU3RyaW5nKXNzaUV4dGVybmFsUmVzb2x2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYXJpYWJsZVZhbHVlKGNsYXNzTmFtZSArICIuIiArIHZhcmlhYmxlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFyaWFibGVWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmFyaWFibGVWYWx1ZSA9IGVuY29kZSh2YXJpYWJsZVZhbHVlLCBlbmNvZGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhcmlhYmxlVmFsdWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBcHBsaWVzIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiB0byB0aGUgc3BlY2lmaWVkIFN0cmluZyBhbmQgcmV0dXJucyB0aGUKKyAgICAgKiBuZXcgcmVzb2x2ZWQgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc3Vic3RpdHV0ZVZhcmlhYmxlcyhTdHJpbmcgdmFsKSB7CisgICAgICAgIC8vIElmIGl0IGhhcyBubyB2YXJpYWJsZSByZWZlcmVuY2VzIHRoZW4gbm8gd29yaworICAgICAgICAvLyBuZWVkIHRvIGJlIGRvbmUKKyAgICAgICAgaWYgKHZhbC5pbmRleE9mKCckJykgPCAwKSByZXR1cm4gdmFsOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHZhbCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2IubGVuZ3RoKCk7KSB7CisgICAgICAgICAgICAvLyBGaW5kIHRoZSBuZXh0ICQKKyAgICAgICAgICAgIGZvciAoOyBpIDwgc2IubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChzYi5jaGFyQXQoaSkgPT0gJyQnKSB7CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gc2IubGVuZ3RoKCkpIGJyZWFrOworICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSAkIGlzIGVzY2FwZWQKKyAgICAgICAgICAgIGlmIChpID4gMSAmJiBzYi5jaGFyQXQoaSAtIDIpID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICBzYi5kZWxldGVDaGFyQXQoaSAtIDIpOworICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBuYW1lU3RhcnQgPSBpOworICAgICAgICAgICAgaW50IHN0YXJ0ID0gaSAtIDE7CisgICAgICAgICAgICBpbnQgZW5kID0gLTE7CisgICAgICAgICAgICBpbnQgbmFtZUVuZCA9IC0xOworICAgICAgICAgICAgY2hhciBlbmRDaGFyID0gJyAnOworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHt9IHdyYXBwZWQgdmFyCisgICAgICAgICAgICBpZiAoc2IuY2hhckF0KGkpID09ICd7JykgeworICAgICAgICAgICAgICAgIG5hbWVTdGFydCsrOworICAgICAgICAgICAgICAgIGVuZENoYXIgPSAnfSc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGaW5kIHRoZSBlbmQgb2YgdGhlIHZhciByZWZlcmVuY2UKKyAgICAgICAgICAgIGZvciAoOyBpIDwgc2IubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChzYi5jaGFyQXQoaSkgPT0gZW5kQ2hhcikgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmQgPSBpOworICAgICAgICAgICAgbmFtZUVuZCA9IGVuZDsKKyAgICAgICAgICAgIGlmIChlbmRDaGFyID09ICd9JykgZW5kKys7CisgICAgICAgICAgICAvLyBXZSBzaG91bGQgbm93IGhhdmUgZW5vdWdoIHRvIGV4dHJhY3QgdGhlIHZhciBuYW1lCisgICAgICAgICAgICBTdHJpbmcgdmFyTmFtZSA9IHNiLnN1YnN0cmluZyhuYW1lU3RhcnQsIG5hbWVFbmQpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0VmFyaWFibGVWYWx1ZSh2YXJOYW1lKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB2YWx1ZSA9ICIiOworICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgdmFyIG5hbWUgd2l0aCBpdHMgdmFsdWUKKyAgICAgICAgICAgIHNiLnJlcGxhY2Uoc3RhcnQsIGVuZCwgdmFsdWUpOworICAgICAgICAgICAgLy8gU3RhcnQgc2VhcmNoaW5nIGZvciB0aGUgbmV4dCAkIGFmdGVyIHRoZSB2YWx1ZQorICAgICAgICAgICAgLy8gdGhhdCB3YXMganVzdCBzdWJzdGl0dXRlZC4KKyAgICAgICAgICAgIGkgPSBzdGFydCArIHZhbHVlLmxlbmd0aCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIFN0cmluZyBmb3JtYXREYXRlKERhdGUgZGF0ZSwgVGltZVpvbmUgdGltZVpvbmUpIHsKKyAgICAgICAgU3RyaW5nIHJldFZhbDsKKyAgICAgICAgaWYgKHRpbWVab25lICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vd2UgdGVtcG9yYXJpbHkgY2hhbmdlIHN0cmZ0aW1lLiBTaW5jZSBTU0lNZWRpYXRvciBpcyBpbmhlcmVudGx5CisgICAgICAgICAgICAvLyBzaW5nbGUtdGhyZWFkZWQsIHRoaXMKKyAgICAgICAgICAgIC8vaXNuJ3QgYSBwcm9ibGVtCisgICAgICAgICAgICBUaW1lWm9uZSBvbGRUaW1lWm9uZSA9IHN0cmZ0aW1lLmdldFRpbWVab25lKCk7CisgICAgICAgICAgICBzdHJmdGltZS5zZXRUaW1lWm9uZSh0aW1lWm9uZSk7CisgICAgICAgICAgICByZXRWYWwgPSBzdHJmdGltZS5mb3JtYXQoZGF0ZSk7CisgICAgICAgICAgICBzdHJmdGltZS5zZXRUaW1lWm9uZShvbGRUaW1lWm9uZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXRWYWwgPSBzdHJmdGltZS5mb3JtYXQoZGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBTdHJpbmcgZW5jb2RlKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIFN0cmluZyByZXRWYWwgPSBudWxsOworICAgICAgICBpZiAoZW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgidXJsIikpIHsKKyAgICAgICAgICAgIHJldFZhbCA9IHVybEVuY29kZXIuZW5jb2RlKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChlbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJub25lIikpIHsKKyAgICAgICAgICAgIHJldFZhbCA9IHZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoImVudGl0eSIpKSB7CisgICAgICAgICAgICAvL05vdCBzdXJlIGhvdyB0aGlzIGlzIHJlYWxseSBkaWZmZXJlbnQgdGhhbiBub25lCisgICAgICAgICAgICByZXRWYWwgPSB2YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vVGhpcyBzaG91bGRuJ3QgYmUgcG9zc2libGUKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gZW5jb2Rpbmc6ICIgKyBlbmNvZGluZyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzc2lFeHRlcm5hbFJlc29sdmVyLmxvZyhtZXNzYWdlLCBudWxsKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICBzc2lFeHRlcm5hbFJlc29sdmVyLmxvZyhtZXNzYWdlLCB0aHJvd2FibGUpOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0RGF0ZVZhcmlhYmxlcyhib29sZWFuIGZyb21Db25zdHJ1Y3RvcikgeworICAgICAgICBib29sZWFuIGFscmVhZHlTZXQgPSBzc2lFeHRlcm5hbFJlc29sdmVyLmdldFZhcmlhYmxlVmFsdWUoY2xhc3NOYW1lCisgICAgICAgICAgICAgICAgKyAiLmFscmVhZHlzZXQiKSAhPSBudWxsOworICAgICAgICAvL3NraXAgdGhpcyBpZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIGZyb20gdGhlIGNvbnN0cnVjdG9yLCBhbmQgdGhpcyBoYXMKKyAgICAgICAgLy8gYWxyZWFkeQorICAgICAgICAvLyBiZWVuIHNldAorICAgICAgICBpZiAoIShmcm9tQ29uc3RydWN0b3IgJiYgYWxyZWFkeVNldCkpIHsKKyAgICAgICAgICAgIHNzaUV4dGVybmFsUmVzb2x2ZXIuc2V0VmFyaWFibGVWYWx1ZShjbGFzc05hbWUgKyAiLmFscmVhZHlzZXQiLAorICAgICAgICAgICAgICAgICAgICAidHJ1ZSIpOworICAgICAgICAgICAgRGF0ZSBkYXRlID0gbmV3IERhdGUoKTsKKyAgICAgICAgICAgIFRpbWVab25lIHRpbWVab25lID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpOworICAgICAgICAgICAgU3RyaW5nIHJldFZhbCA9IGZvcm1hdERhdGUoZGF0ZSwgdGltZVpvbmUpOworICAgICAgICAgICAgLy9JZiB3ZSBhcmUgc2V0dGluZyBvbiBvZiB0aGUgZGF0ZSB2YXJpYWJsZXMsIHdlIHdhbnQgdG8gcmVtb3ZlCisgICAgICAgICAgICAvLyB0aGVtIGZyb20gdGhlCisgICAgICAgICAgICAvLyB1c2VyCisgICAgICAgICAgICAvL2RlZmluZWQgbGlzdCBvZiB2YXJpYWJsZXMsIGJlY2F1c2UgdGhpcyBpcyB3aGF0IEFwYWNoZSBkb2VzCisgICAgICAgICAgICBzZXRWYXJpYWJsZVZhbHVlKCJEQVRFX0dNVCIsIG51bGwpOworICAgICAgICAgICAgc3NpRXh0ZXJuYWxSZXNvbHZlci5zZXRWYXJpYWJsZVZhbHVlKGNsYXNzTmFtZSArICIuREFURV9HTVQiLAorICAgICAgICAgICAgICAgICAgICByZXRWYWwpOworICAgICAgICAgICAgcmV0VmFsID0gZm9ybWF0RGF0ZShkYXRlLCBudWxsKTsKKyAgICAgICAgICAgIHNldFZhcmlhYmxlVmFsdWUoIkRBVEVfTE9DQUwiLCBudWxsKTsKKyAgICAgICAgICAgIHNzaUV4dGVybmFsUmVzb2x2ZXIuc2V0VmFyaWFibGVWYWx1ZShjbGFzc05hbWUgKyAiLkRBVEVfTE9DQUwiLAorICAgICAgICAgICAgICAgICAgICByZXRWYWwpOworICAgICAgICAgICAgcmV0VmFsID0gZm9ybWF0RGF0ZShuZXcgRGF0ZShsYXN0TW9kaWZpZWREYXRlKSwgbnVsbCk7CisgICAgICAgICAgICBzZXRWYXJpYWJsZVZhbHVlKCJMQVNUX01PRElGSUVEIiwgbnVsbCk7CisgICAgICAgICAgICBzc2lFeHRlcm5hbFJlc29sdmVyLnNldFZhcmlhYmxlVmFsdWUoY2xhc3NOYW1lICsgIi5MQVNUX01PRElGSUVEIiwKKyAgICAgICAgICAgICAgICAgICAgcmV0VmFsKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVByaW50ZW52LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVByaW50ZW52LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyMDk3ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJUHJpbnRlbnYuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIExpY2Vuc2VkIHVuZGVyIHRoZQorICogQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUKKyAqIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKKyAqIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKKyAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zc2k7CisKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworLyoqCisgKiBJbXBsZW1lbnRzIHRoZSBTZXJ2ZXItc2lkZSAjcHJpbnRlbnYgY29tbWFuZAorICogCisgKiBAYXV0aG9yIERhbiBTYW5kYmVyZworICogQGF1dGhvciBEYXZpZCBCZWNrZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgU1NJUHJpbnRlbnYgaW1wbGVtZW50cyBTU0lDb21tYW5kIHsKKyAgICAvKioKKyAgICAgKiBAc2VlIFNTSUNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBwcm9jZXNzKFNTSU1lZGlhdG9yIHNzaU1lZGlhdG9yLCBTdHJpbmcgY29tbWFuZE5hbWUsCisgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbU5hbWVzLCBTdHJpbmdbXSBwYXJhbVZhbHVlcywgUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisgICAgCWxvbmcgbGFzdE1vZGlmaWVkID0gMDsKKyAgICAgICAgLy9hbnkgYXJndW1lbnRzIHNob3VsZCBwcm9kdWNlIGFuIGVycm9yCisgICAgICAgIGlmIChwYXJhbU5hbWVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBzc2lNZWRpYXRvci5nZXRDb25maWdFcnJNc2coKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShlcnJvck1lc3NhZ2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ29sbGVjdGlvbiB2YXJpYWJsZU5hbWVzID0gc3NpTWVkaWF0b3IuZ2V0VmFyaWFibGVOYW1lcygpOworICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IHZhcmlhYmxlTmFtZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB2YXJpYWJsZU5hbWUgPSAoU3RyaW5nKWl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YXJpYWJsZVZhbHVlID0gc3NpTWVkaWF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYXJpYWJsZVZhbHVlKHZhcmlhYmxlTmFtZSk7CisgICAgICAgICAgICAgICAgLy9UaGlzIHNob3VsZG4ndCBoYXBwZW4sIHNpbmNlIGFsbCB0aGUgdmFyaWFibGUgbmFtZXMgbXVzdAorICAgICAgICAgICAgICAgIC8vIGhhdmUgdmFsdWVzCisgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVZhbHVlID0gIihub25lKSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSh2YXJpYWJsZU5hbWUpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgnPScpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSh2YXJpYWJsZVZhbHVlKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoJ1xuJyk7CisgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhc3RNb2RpZmllZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVByb2Nlc3Nvci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDc2Y2NkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBMaWNlbnNlZCB1bmRlciB0aGUKKyAqIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlCisgKiBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzCisgKiBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlCisgKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3NpOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuSU9Ub29sczsKKy8qKgorICogVGhlIGVudHJ5IHBvaW50IHRvIFNTSSBwcm9jZXNzaW5nLiBUaGlzIGNsYXNzIGRvZXMgdGhlIGFjdHVhbCBwYXJzaW5nLAorICogZGVsZWdhdGluZyB0byB0aGUgU1NJTWVkaWF0b3IsIFNTSUNvbW1hbmQsIGFuZCBTU0lFeHRlcm5hbFJlc29sdmVyIGFzCisgKiBuZWNlc3NhcnlbCisgKiAKKyAqIEBhdXRob3IgRGFuIFNhbmRiZXJnCisgKiBAYXV0aG9yIERhdmlkIEJlY2tlcgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBTU0lQcm9jZXNzb3IgeworICAgIC8qKiBUaGUgc3RhcnQgcGF0dGVybiAqLworICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTU1BTkRfU1RBUlQgPSAiPCEtLSMiOworICAgIC8qKiBUaGUgZW5kIHBhdHRlcm4gKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBDT01NQU5EX0VORCA9ICItLT4iOworICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFID0gNDA5NjsKKyAgICBwcm90ZWN0ZWQgU1NJRXh0ZXJuYWxSZXNvbHZlciBzc2lFeHRlcm5hbFJlc29sdmVyOworICAgIHByb3RlY3RlZCBIYXNoTWFwIGNvbW1hbmRzID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcm90ZWN0ZWQgaW50IGRlYnVnOworCisKKyAgICBwdWJsaWMgU1NJUHJvY2Vzc29yKFNTSUV4dGVybmFsUmVzb2x2ZXIgc3NpRXh0ZXJuYWxSZXNvbHZlciwgaW50IGRlYnVnKSB7CisgICAgICAgIHRoaXMuc3NpRXh0ZXJuYWxSZXNvbHZlciA9IHNzaUV4dGVybmFsUmVzb2x2ZXI7CisgICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKKyAgICAgICAgYWRkQnVpbHRpbkNvbW1hbmRzKCk7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRCdWlsdGluQ29tbWFuZHMoKSB7CisgICAgICAgIGFkZENvbW1hbmQoImNvbmZpZyIsIG5ldyBTU0lDb25maWcoKSk7CisgICAgICAgIGFkZENvbW1hbmQoImVjaG8iLCBuZXcgU1NJRWNobygpKTsKKyAgICAgICAgYWRkQ29tbWFuZCgiZXhlYyIsIG5ldyBTU0lFeGVjKCkpOworICAgICAgICBhZGRDb21tYW5kKCJpbmNsdWRlIiwgbmV3IFNTSUluY2x1ZGUoKSk7CisgICAgICAgIGFkZENvbW1hbmQoImZsYXN0bW9kIiwgbmV3IFNTSUZsYXN0bW9kKCkpOworICAgICAgICBhZGRDb21tYW5kKCJmc2l6ZSIsIG5ldyBTU0lGc2l6ZSgpKTsKKyAgICAgICAgYWRkQ29tbWFuZCgicHJpbnRlbnYiLCBuZXcgU1NJUHJpbnRlbnYoKSk7CisgICAgICAgIGFkZENvbW1hbmQoInNldCIsIG5ldyBTU0lTZXQoKSk7CisgICAgICAgIFNTSUNvbmRpdGlvbmFsIHNzaUNvbmRpdGlvbmFsID0gbmV3IFNTSUNvbmRpdGlvbmFsKCk7CisgICAgICAgIGFkZENvbW1hbmQoImlmIiwgc3NpQ29uZGl0aW9uYWwpOworICAgICAgICBhZGRDb21tYW5kKCJlbGlmIiwgc3NpQ29uZGl0aW9uYWwpOworICAgICAgICBhZGRDb21tYW5kKCJlbmRpZiIsIHNzaUNvbmRpdGlvbmFsKTsKKyAgICAgICAgYWRkQ29tbWFuZCgiZWxzZSIsIHNzaUNvbmRpdGlvbmFsKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGFkZENvbW1hbmQoU3RyaW5nIG5hbWUsIFNTSUNvbW1hbmQgY29tbWFuZCkgeworICAgICAgICBjb21tYW5kcy5wdXQobmFtZSwgY29tbWFuZCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgZmlsZSB3aXRoIHNlcnZlci1zaWRlIGNvbW1hbmRzLCByZWFkaW5nIGZyb20gcmVhZGVyIGFuZAorICAgICAqIHdyaXRpbmcgdGhlIHByb2Nlc3NlZCB2ZXJzaW9uIHRvIHdyaXRlci4gTk9URTogV2UgcmVhbGx5IHNob3VsZCBiZSBkb2luZworICAgICAqIHRoaXMgaW4gYSBzdHJlYW1pbmcgd2F5IHJhdGhlciB0aGFuIGNvbnZlcnRpbmcgaXQgdG8gYW4gYXJyYXkgZmlyc3QuCisgICAgICogCisgICAgICogQHBhcmFtIHJlYWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHJlYWRlciB0byByZWFkIHRoZSBmaWxlIGNvbnRhaW5pbmcgU1NJcyBmcm9tCisgICAgICogQHBhcmFtIHdyaXRlcgorICAgICAqICAgICAgICAgICAgdGhlIHdyaXRlciB0byB3cml0ZSB0aGUgZmlsZSB3aXRoIHRoZSBTU0lzIHByb2Nlc3NlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBtb3N0IGN1cnJlbnQgbW9kaWZpZWQgZGF0ZSByZXN1bHRpbmcgZnJvbSBhbnkgU1NJIGNvbW1hbmRzCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gdGhpbmdzIGdvIGhvcnJpYmx5IGF3cnkuIFNob3VsZCBiZSB1bmxpa2VseSBzaW5jZSB0aGUKKyAgICAgKiAgICAgICAgICAgICBTU0lDb21tYW5kIHVzdWFsbHkgY2F0Y2hlcyAnbm9ybWFsJyBJT0V4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHVibGljIGxvbmcgcHJvY2VzcyhSZWFkZXIgcmVhZGVyLCBsb25nIGxhc3RNb2RpZmllZERhdGUsCisgICAgICAgICAgICBQcmludFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFNTSU1lZGlhdG9yIHNzaU1lZGlhdG9yID0gbmV3IFNTSU1lZGlhdG9yKHNzaUV4dGVybmFsUmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkRGF0ZSwgZGVidWcpOworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBJT1Rvb2xzLmZsb3cocmVhZGVyLCBzdHJpbmdXcml0ZXIpOworICAgICAgICBTdHJpbmcgZmlsZUNvbnRlbnRzID0gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7CisgICAgICAgIHN0cmluZ1dyaXRlciA9IG51bGw7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGJvb2xlYW4gaW5zaWRlID0gZmFsc2U7CisgICAgICAgIFN0cmluZ0J1ZmZlciBjb21tYW5kID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgZmlsZUNvbnRlbnRzLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gZmlsZUNvbnRlbnRzLmNoYXJBdChpbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKCFpbnNpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gQ09NTUFORF9TVEFSVC5jaGFyQXQoMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjaGFyQ21wKGZpbGVDb250ZW50cywgaW5kZXgsIENPTU1BTkRfU1RBUlQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gQ09NTUFORF9TVEFSVC5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQuc2V0TGVuZ3RoKDApOyAvL2NsZWFyIHRoZSBjb21tYW5kIHN0cmluZworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzc2lNZWRpYXRvci5nZXRDb25kaXRpb25hbFN0YXRlKCkucHJvY2Vzc0NvbmRpdGlvbmFsQ29tbWFuZHNPbmx5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09IENPTU1BTkRfRU5ELmNoYXJBdCgwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNoYXJDbXAoZmlsZUNvbnRlbnRzLCBpbmRleCwgQ09NTUFORF9FTkQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IENPTU1BTkRfRU5ELmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0ckNtZCA9IHBhcnNlQ21kKGNvbW1hbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaUV4dGVybmFsUmVzb2x2ZXIubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNTSVByb2Nlc3Nvci5wcm9jZXNzIC0tIHByb2Nlc3NpbmcgY29tbWFuZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0ckNtZCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbU5hbWVzID0gcGFyc2VQYXJhbU5hbWVzKGNvbW1hbmQsIHN0ckNtZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcGFyYW1WYWx1ZXMgPSBwYXJzZVBhcmFtVmFsdWVzKGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ckNtZC5sZW5ndGgoKSwgcGFyYW1OYW1lcy5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9XZSBuZWVkIHRvIGZldGNoIHRoaXMgdmFsdWUgZWFjaCB0aW1lLCBzaW5jZSBpdCBtYXkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyaW5nIHRoZSBsb29wCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29uZmlnRXJyTXNnID0gc3NpTWVkaWF0b3IuZ2V0Q29uZmlnRXJyTXNnKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTU0lDb21tYW5kIHNzaUNvbW1hbmQgPSAoU1NJQ29tbWFuZCljb21tYW5kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KHN0ckNtZC50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNzaUNvbW1hbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICJVbmtub3duIGNvbW1hbmQ6ICIgKyBzdHJDbWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtVmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAiRXJyb3IgcGFyc2luZyBkaXJlY3RpdmUgcGFyYW1ldGVycy4iOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWVzLmxlbmd0aCAhPSBwYXJhbVZhbHVlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAiUGFyYW1ldGVyIG5hbWVzIGNvdW50IGRvZXMgbm90IG1hdGNoIHBhcmFtZXRlciB2YWx1ZXMgY291bnQgb24gY29tbWFuZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJDbWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHByb2Nlc3MgdGhlIGNvbW1hbmQgaWYgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25kaXRpb25hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1hbmRzIG9ubHkgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1hbmQgaXMgbm90IGNvbmRpdGlvbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzc2lNZWRpYXRvci5nZXRDb25kaXRpb25hbFN0YXRlKCkucHJvY2Vzc0NvbmRpdGlvbmFsQ29tbWFuZHNPbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzc2lDb21tYW5kIGluc3RhbmNlb2YgU1NJQ29uZGl0aW9uYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsbWQgPSBzc2lDb21tYW5kLnByb2Nlc3Moc3NpTWVkaWF0b3IsIHN0ckNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcywgcGFyYW1WYWx1ZXMsIHdyaXRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsbWQgPiBsYXN0TW9kaWZpZWREYXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWREYXRlID0gbG1kOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpRXh0ZXJuYWxSZXNvbHZlci5sb2coZXJyb3JNZXNzYWdlLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoY29uZmlnRXJyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQuYXBwZW5kKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU1NJU3RvcFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9JZiB3ZSBhcmUgaGVyZSwgdGhlbiB3ZSBoYXZlIGFscmVhZHkgc3RvcHBlZCBwcm9jZXNzaW5nLCBzbyBhbGwKKyAgICAgICAgICAgIC8vIGlzIGdvb2QKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFzdE1vZGlmaWVkRGF0ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIGEgU3RyaW5nQnVmZmVyIGFuZCB0YWtlIG91dCB0aGUgcGFyYW0gdHlwZSB0b2tlbi4gQ2FsbGVkIGZyb20KKyAgICAgKiA8Y29kZT5yZXF1ZXN0SGFuZGxlcjwvY29kZT4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY21kCisgICAgICogICAgICAgICAgICBhIHZhbHVlIG9mIHR5cGUgJ1N0cmluZ0J1ZmZlcicKKyAgICAgKiBAcmV0dXJuIGEgdmFsdWUgb2YgdHlwZSAnU3RyaW5nW10nCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIHBhcnNlUGFyYW1OYW1lcyhTdHJpbmdCdWZmZXIgY21kLCBpbnQgc3RhcnQpIHsKKyAgICAgICAgaW50IGJJZHggPSBzdGFydDsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgcXVvdGVzID0gMDsKKyAgICAgICAgYm9vbGVhbiBpbnNpZGUgPSBmYWxzZTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJldEJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgd2hpbGUgKGJJZHggPCBjbWQubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIGlmICghaW5zaWRlKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGJJZHggPCBjbWQubGVuZ3RoKCkgJiYgaXNTcGFjZShjbWQuY2hhckF0KGJJZHgpKSkKKyAgICAgICAgICAgICAgICAgICAgYklkeCsrOworICAgICAgICAgICAgICAgIGlmIChiSWR4ID49IGNtZC5sZW5ndGgoKSkgYnJlYWs7CisgICAgICAgICAgICAgICAgaW5zaWRlID0gIWluc2lkZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGJJZHggPCBjbWQubGVuZ3RoKCkgJiYgY21kLmNoYXJBdChiSWR4KSAhPSAnPScpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0QnVmLmFwcGVuZChjbWQuY2hhckF0KGJJZHgpKTsKKyAgICAgICAgICAgICAgICAgICAgYklkeCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXRCdWYuYXBwZW5kKCc9Jyk7CisgICAgICAgICAgICAgICAgaW5zaWRlID0gIWluc2lkZTsKKyAgICAgICAgICAgICAgICBxdW90ZXMgPSAwOworICAgICAgICAgICAgICAgIGJvb2xlYW4gZXNjYXBlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoOyBiSWR4IDwgY21kLmxlbmd0aCgpICYmIHF1b3RlcyAhPSAyOyBiSWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gY21kLmNoYXJBdChiSWR4KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBza2lwIGVzY2FwZWQgY2hhcmFjdGVycworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXFwnICYmICFlc2NhcGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJJZHgrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyInKSBxdW90ZXMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocmV0QnVmLnRvU3RyaW5nKCksICI9Iik7CisgICAgICAgIFN0cmluZ1tdIHJldFN0cmluZyA9IG5ldyBTdHJpbmdbc3RyLmNvdW50VG9rZW5zKCldOworICAgICAgICB3aGlsZSAoc3RyLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgcmV0U3RyaW5nW2krK10gPSBzdHIubmV4dFRva2VuKCkudHJpbSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXRTdHJpbmc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhIFN0cmluZ0J1ZmZlciBhbmQgdGFrZSBvdXQgdGhlIHBhcmFtIHRva2VuLiBDYWxsZWQgZnJvbQorICAgICAqIDxjb2RlPnJlcXVlc3RIYW5kbGVyPC9jb2RlPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjbWQKKyAgICAgKiAgICAgICAgICAgIGEgdmFsdWUgb2YgdHlwZSAnU3RyaW5nQnVmZmVyJworICAgICAqIEByZXR1cm4gYSB2YWx1ZSBvZiB0eXBlICdTdHJpbmdbXScKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gcGFyc2VQYXJhbVZhbHVlcyhTdHJpbmdCdWZmZXIgY21kLCBpbnQgc3RhcnQsIGludCBjb3VudCkgeworICAgICAgICBpbnQgdmFsSW5kZXggPSAwOworICAgICAgICBib29sZWFuIGluc2lkZSA9IGZhbHNlOworICAgICAgICBTdHJpbmdbXSB2YWxzID0gbmV3IFN0cmluZ1tjb3VudF07CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgY2hhciBlbmRRdW90ZSA9IDA7CisgICAgICAgIGZvciAoaW50IGJJZHggPSBzdGFydDsgYklkeCA8IGNtZC5sZW5ndGgoKTsgYklkeCsrKSB7CisgICAgICAgICAgICBpZiAoIWluc2lkZSkgeworICAgICAgICAgICAgICAgIHdoaWxlIChiSWR4IDwgY21kLmxlbmd0aCgpICYmICFpc1F1b3RlKGNtZC5jaGFyQXQoYklkeCkpKQorICAgICAgICAgICAgICAgICAgICBiSWR4Kys7CisgICAgICAgICAgICAgICAgaWYgKGJJZHggPj0gY21kLmxlbmd0aCgpKSBicmVhazsKKyAgICAgICAgICAgICAgICBpbnNpZGUgPSAhaW5zaWRlOworICAgICAgICAgICAgICAgIGVuZFF1b3RlID0gY21kLmNoYXJBdChiSWR4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBlc2NhcGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yICg7IGJJZHggPCBjbWQubGVuZ3RoKCk7IGJJZHgrKykgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSBjbWQuY2hhckF0KGJJZHgpOworICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXNjYXBlcworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXFwnICYmICFlc2NhcGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoIHRoZSBvdGhlciAiIHRoZW4gc3RvcAorICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSBlbmRRdW90ZSAmJiAhZXNjYXBlZCkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHBhcnNpbmcgb2YgYXR0cmlidXRlcyBhbmQgdmFyCisgICAgICAgICAgICAgICAgICAgIC8vIHN1YnN0aXR1dGlvbiBpcyBkb25lIGluIHNlcGFyYXRlIHBsYWNlcywKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBsZWF2ZSBlc2NhcGUgaW4gdGhlIHN0cmluZworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnJCcgJiYgZXNjYXBlZCkgc2IuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGl0IHRoZSBlbmQgd2l0aG91dCBzZWVpbmcgYSBxdW90ZQorICAgICAgICAgICAgICAgIC8vIHRoZSBzaWduYWwgYW4gZXJyb3IKKyAgICAgICAgICAgICAgICBpZiAoYklkeCA9PSBjbWQubGVuZ3RoKCkpIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIHZhbHNbdmFsSW5kZXgrK10gPSBzYi50b1N0cmluZygpOworICAgICAgICAgICAgICAgIHNiLmRlbGV0ZSgwLCBzYi5sZW5ndGgoKSk7IC8vIGNsZWFyIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICBpbnNpZGUgPSAhaW5zaWRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWxzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFyc2UgYSBTdHJpbmdCdWZmZXIgYW5kIHRha2Ugb3V0IHRoZSBjb21tYW5kIHRva2VuLiBDYWxsZWQgZnJvbQorICAgICAqIDxjb2RlPnJlcXVlc3RIYW5kbGVyPC9jb2RlPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjbWQKKyAgICAgKiAgICAgICAgICAgIGEgdmFsdWUgb2YgdHlwZSAnU3RyaW5nQnVmZmVyJworICAgICAqIEByZXR1cm4gYSB2YWx1ZSBvZiB0eXBlICdTdHJpbmcnLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXJzZUNtZChTdHJpbmdCdWZmZXIgY21kKSB7CisgICAgICAgIGludCBmaXJzdExldHRlciA9IC0xOworICAgICAgICBpbnQgbGFzdExldHRlciA9IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNtZC5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBjbWQuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xldHRlcihjKSkgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdExldHRlciA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBmaXJzdExldHRlciA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhc3RMZXR0ZXIgPSBpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpc1NwYWNlKGMpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RMZXR0ZXIgPiAtMSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN0cmluZyBjb21tYW5kID0gbnVsbDsKKyAgICAgICAgaWYgKGZpcnN0TGV0dGVyICE9IC0xKSB7CisgICAgICAgICAgICBjb21tYW5kID0gY21kLnN1YnN0cmluZyhmaXJzdExldHRlciwgbGFzdExldHRlciArIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21tYW5kOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hhckNtcChTdHJpbmcgYnVmLCBpbnQgaW5kZXgsIFN0cmluZyBjb21tYW5kKSB7CisgICAgICAgIHJldHVybiBidWYucmVnaW9uTWF0Y2hlcyhpbmRleCwgY29tbWFuZCwgMCwgY29tbWFuZC5sZW5ndGgoKSk7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NwYWNlKGNoYXIgYykgeworICAgICAgICByZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1x0JyB8fCBjID09ICdccic7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBib29sZWFuIGlzUXVvdGUoY2hhciBjKSB7CisgICAgICAgIHJldHVybiBjID09ICdcJycgfHwgYyA9PSAnXCInIHx8IGMgPT0gJ2AnOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVNlcnZsZXQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiY2QzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdsb2JhbHM7CisKKy8qKgorICogU2VydmxldCB0byBwcm9jZXNzIFNTSSByZXF1ZXN0cyB3aXRoaW4gYSB3ZWJwYWdlLiBNYXBwZWQgdG8gYSBwYXRoIGZyb20KKyAqIHdpdGhpbiB3ZWIueG1sLgorICogCisgKiBAYXV0aG9yIEJpcCBUaGVsaW4KKyAqIEBhdXRob3IgQW15IFJvaAorICogQGF1dGhvciBEYW4gU2FuZGJlcmcKKyAqIEBhdXRob3IgRGF2aWQgQmVja2VyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFNTSVNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisgICAgLyoqIERlYnVnIGxldmVsIGZvciB0aGlzIHNlcnZsZXQuICovCisgICAgcHJvdGVjdGVkIGludCBkZWJ1ZyA9IDA7CisgICAgLyoqIFNob3VsZCB0aGUgb3V0cHV0IGJlIGJ1ZmZlcmVkLiAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGJ1ZmZlcmVkID0gZmFsc2U7CisgICAgLyoqIEV4cGlyYXRpb24gdGltZSBpbiBzZWNvbmRzIGZvciB0aGUgZG9jLiAqLworICAgIHByb3RlY3RlZCBMb25nIGV4cGlyZXMgPSBudWxsOworICAgIC8qKiB2aXJ0dWFsIHBhdGggY2FuIGJlIHdlYmFwcC1yZWxhdGl2ZSAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmlydHVhbFdlYmFwcFJlbGF0aXZlID0gZmFsc2U7CisgICAgLyoqIElucHV0IGVuY29kaW5nLiBJZiBub3Qgc3BlY2lmaWVkLCB1c2VzIHBsYXRmb3JtIGRlZmF1bHQgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGlucHV0RW5jb2RpbmcgPSBudWxsOworICAgIC8qKiBPdXRwdXQgZW5jb2RpbmcuIElmIG5vdCBzcGVjaWZpZWQsIHVzZXMgcGxhdGZvcm0gZGVmYXVsdCAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgb3V0cHV0RW5jb2RpbmcgPSAiVVRGLTgiOworCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBtZXRob2RzLgorICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhpcyBzZXJ2bGV0LgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJkZWJ1ZyIpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKCJTU0lTZXJ2bGV0LmluaXQ6IGVycm9yIHJlYWRpbmcgZGVidWcgZnJvbSAiICsgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbHVlID0gZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICJpc1ZpcnR1YWxXZWJhcHBSZWxhdGl2ZSIpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpc1ZpcnR1YWxXZWJhcHBSZWxhdGl2ZSA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpID4gMD90cnVlOmZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKCJTU0lTZXJ2bGV0LmluaXQ6IGVycm9yIHJlYWRpbmcgaXNWaXJ0dWFsV2ViYXBwUmVsYXRpdmUgZnJvbSIKKyAgICAgICAgICAgICAgICArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJleHBpcmVzIik7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGV4cGlyZXMgPSBMb25nLnZhbHVlT2YodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXhwaXJlcyA9IG51bGw7CisgICAgICAgICAgICBsb2coIkludmFsaWQgZm9ybWF0IGZvciBleHBpcmVzIGluaXRQYXJhbTsgZXhwZWN0ZWQgaW50ZWdlciAoc2Vjb25kcykiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiU1NJU2VydmxldC5pbml0OiBlcnJvciByZWFkaW5nIGV4cGlyZXMgZnJvbSAiICsgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbHVlID0gZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoImJ1ZmZlcmVkIik7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlcmVkID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSkgPiAwP3RydWU6ZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIlNTSVNlcnZsZXQuaW5pdDogZXJyb3IgcmVhZGluZyBidWZmZXJlZCBmcm9tICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5wdXRFbmNvZGluZyA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJpbnB1dEVuY29kaW5nIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIlNTSVNlcnZsZXQuaW5pdDogZXJyb3IgcmVhZGluZyBpbnB1dEVuY29kaW5nOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbHVlID0gZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoIm91dHB1dEVuY29kaW5nIik7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dHB1dEVuY29kaW5nID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIlNTSVNlcnZsZXQuaW5pdDogZXJyb3IgcmVhZGluZyBvdXRwdXRFbmNvZGluZyBmcm9tICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVidWcgPiAwKQorICAgICAgICAgICAgbG9nKCJTU0lTZXJ2bGV0LmluaXQoKSBTU0kgaW52b2tlciBzdGFydGVkIHdpdGggJ2RlYnVnJz0iICsgZGVidWcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYW5kIGZvcndhcmQgdGhlIEdFVCByZXF1ZXN0IHRvIG91ciA8Y29kZT5yZXF1ZXN0SGFuZGxlcigpPC9jb2RlPioKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVxCisgICAgICogICAgICAgICAgICBhIHZhbHVlIG9mIHR5cGUgJ0h0dHBTZXJ2bGV0UmVxdWVzdCcKKyAgICAgKiBAcGFyYW0gcmVzCisgICAgICogICAgICAgICAgICBhIHZhbHVlIG9mIHR5cGUgJ0h0dHBTZXJ2bGV0UmVzcG9uc2UnCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRlYnVnID4gMCkgbG9nKCJTU0lTZXJ2bGV0LmRvR2V0KCkiKTsKKyAgICAgICAgcmVxdWVzdEhhbmRsZXIocmVxLCByZXMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhbmQgZm9yd2FyZCB0aGUgUE9TVCByZXF1ZXN0IHRvIG91cgorICAgICAqIDxjb2RlPnJlcXVlc3RIYW5kbGVyKCk8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSByZXEKKyAgICAgKiAgICAgICAgICAgIGEgdmFsdWUgb2YgdHlwZSAnSHR0cFNlcnZsZXRSZXF1ZXN0JworICAgICAqIEBwYXJhbSByZXMKKyAgICAgKiAgICAgICAgICAgIGEgdmFsdWUgb2YgdHlwZSAnSHR0cFNlcnZsZXRSZXNwb25zZScKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRlYnVnID4gMCkgbG9nKCJTU0lTZXJ2bGV0LmRvUG9zdCgpIik7CisgICAgICAgIHJlcXVlc3RIYW5kbGVyKHJlcSwgcmVzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3Mgb3VyIHJlcXVlc3QgYW5kIGxvY2F0ZSByaWdodCBTU0kgY29tbWFuZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVxCisgICAgICogICAgICAgICAgICBhIHZhbHVlIG9mIHR5cGUgJ0h0dHBTZXJ2bGV0UmVxdWVzdCcKKyAgICAgKiBAcGFyYW0gcmVzCisgICAgICogICAgICAgICAgICBhIHZhbHVlIG9mIHR5cGUgJ0h0dHBTZXJ2bGV0UmVzcG9uc2UnCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVxdWVzdEhhbmRsZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKyAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9IGdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgICAgIFN0cmluZyBwYXRoID0gU1NJU2VydmxldFJlcXVlc3RVdGlsLmdldFJlbGF0aXZlUGF0aChyZXEpOworICAgICAgICBpZiAoZGVidWcgPiAwKQorICAgICAgICAgICAgbG9nKCJTU0lTZXJ2bGV0LnJlcXVlc3RIYW5kbGVyKClcbiIgKyAiU2VydmluZyAiCisgICAgICAgICAgICAgICAgICAgICsgKGJ1ZmZlcmVkPyJidWZmZXJlZCAiOiJ1bmJ1ZmZlcmVkICIpICsgInJlc291cmNlICciCisgICAgICAgICAgICAgICAgICAgICsgcGF0aCArICInIik7CisgICAgICAgIC8vIEV4Y2x1ZGUgYW55IHJlc291cmNlIGluIHRoZSAvV0VCLUlORiBhbmQgL01FVEEtSU5GIHN1YmRpcmVjdG9yaWVzCisgICAgICAgIC8vICh0aGUgInRvVXBwZXJDYXNlKCkiIGF2b2lkcyBwcm9ibGVtcyBvbiBXaW5kb3dzIHN5c3RlbXMpCisgICAgICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIi9XRUItSU5GIikKKyAgICAgICAgICAgICAgICB8fCBwYXRoLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aCgiL01FVEEtSU5GIikpIHsKKyAgICAgICAgICAgIHJlcy5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQsIHBhdGgpOworICAgICAgICAgICAgbG9nKCJDYW4ndCBzZXJ2ZSBmaWxlOiAiICsgcGF0aCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgVVJMIHJlc291cmNlID0gc2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2UocGF0aCk7CisgICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXMuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5ELCBwYXRoKTsKKyAgICAgICAgICAgIGxvZygiQ2FuJ3QgZmluZCBmaWxlOiAiICsgcGF0aCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHJlc291cmNlTWltZVR5cGUgPSBzZXJ2bGV0Q29udGV4dC5nZXRNaW1lVHlwZShwYXRoKTsKKyAgICAgICAgaWYgKHJlc291cmNlTWltZVR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2VNaW1lVHlwZSA9ICJ0ZXh0L2h0bWwiOworICAgICAgICB9CisgICAgICAgIHJlcy5zZXRDb250ZW50VHlwZShyZXNvdXJjZU1pbWVUeXBlICsgIjtjaGFyc2V0PSIgKyBvdXRwdXRFbmNvZGluZyk7CisgICAgICAgIGlmIChleHBpcmVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcy5zZXREYXRlSGVhZGVyKCJFeHBpcmVzIiwgKG5ldyBqYXZhLnV0aWwuRGF0ZSgpKS5nZXRUaW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyBleHBpcmVzLmxvbmdWYWx1ZSgpICogMTAwMCk7CisgICAgICAgIH0KKyAgICAgICAgcmVxLnNldEF0dHJpYnV0ZShHbG9iYWxzLlNTSV9GTEFHX0FUVFIsICJ0cnVlIik7CisgICAgICAgIHByb2Nlc3NTU0kocmVxLCByZXMsIHJlc291cmNlKTsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NTU0koSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsCisgICAgICAgICAgICBVUkwgcmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFNTSUV4dGVybmFsUmVzb2x2ZXIgc3NpRXh0ZXJuYWxSZXNvbHZlciA9CisgICAgICAgICAgICBuZXcgU1NJU2VydmxldEV4dGVybmFsUmVzb2x2ZXIoZ2V0U2VydmxldENvbnRleHQoKSwgcmVxLCByZXMsCisgICAgICAgICAgICAgICAgICAgIGlzVmlydHVhbFdlYmFwcFJlbGF0aXZlLCBkZWJ1ZywgaW5wdXRFbmNvZGluZyk7CisgICAgICAgIFNTSVByb2Nlc3NvciBzc2lQcm9jZXNzb3IgPSBuZXcgU1NJUHJvY2Vzc29yKHNzaUV4dGVybmFsUmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgZGVidWcpOworICAgICAgICBQcmludFdyaXRlciBwcmludFdyaXRlciA9IG51bGw7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBudWxsOworICAgICAgICBpZiAoYnVmZmVyZWQpIHsKKyAgICAgICAgICAgIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICAgIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludFdyaXRlciA9IHJlcy5nZXRXcml0ZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIFVSTENvbm5lY3Rpb24gcmVzb3VyY2VJbmZvID0gcmVzb3VyY2Uub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gcmVzb3VyY2VJbnB1dFN0cmVhbSA9IHJlc291cmNlSW5mby5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSByZXNvdXJjZUluZm8uZ2V0Q29udGVudEVuY29kaW5nKCk7CisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICBlbmNvZGluZyA9IGlucHV0RW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyOworICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHJlc291cmNlSW5wdXRTdHJlYW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHJlc291cmNlSW5wdXRTdHJlYW0sIGVuY29kaW5nKTsKKyAgICAgICAgfQorICAgICAgICBCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpc3IpOworCisgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gc3NpUHJvY2Vzc29yLnByb2Nlc3MoYnVmZmVyZWRSZWFkZXIsCisgICAgICAgICAgICAgICAgcmVzb3VyY2VJbmZvLmdldExhc3RNb2RpZmllZCgpLCBwcmludFdyaXRlcik7CisgICAgICAgIGlmIChsYXN0TW9kaWZpZWQgPiAwKSB7CisgICAgICAgICAgICByZXMuc2V0RGF0ZUhlYWRlcigibGFzdC1tb2RpZmllZCIsIGxhc3RNb2RpZmllZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlcmVkKSB7CisgICAgICAgICAgICBwcmludFdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHJlcy5nZXRXcml0ZXIoKS53cml0ZSh0ZXh0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJU2VydmxldEV4dGVybmFsUmVzb2x2ZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJU2VydmxldEV4dGVybmFsUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWZiZDU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lTZXJ2bGV0RXh0ZXJuYWxSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsNTY4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIExpY2Vuc2VkIHVuZGVyIHRoZQorICogQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUKKyAqIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKKyAqIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKKyAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zc2k7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuUmVxdWVzdERpc3BhdGNoZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY295b3RlLkNvbnN0YW50czsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTU0lFeHRlcm5hbFJlc29sdmVyIHRoYXQgaXMgdXNlZCB3aXRoIHNlcnZsZXRzLgorICogCisgKiBAYXV0aG9yIERhbiBTYW5kYmVyZworICogQGF1dGhvciBEYXZpZCBCZWNrZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgU1NJU2VydmxldEV4dGVybmFsUmVzb2x2ZXIgaW1wbGVtZW50cyBTU0lFeHRlcm5hbFJlc29sdmVyIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFZBUklBQkxFX05BTUVTW10gPSB7IkFVVEhfVFlQRSIsICJDT05URU5UX0xFTkdUSCIsCisgICAgICAgICAgICAiQ09OVEVOVF9UWVBFIiwgIkRPQ1VNRU5UX05BTUUiLCAiRE9DVU1FTlRfVVJJIiwKKyAgICAgICAgICAgICJHQVRFV0FZX0lOVEVSRkFDRSIsICJIVFRQX0FDQ0VQVCIsICJIVFRQX0FDQ0VQVF9FTkNPRElORyIsCisgICAgICAgICAgICAiSFRUUF9BQ0NFUFRfTEFOR1VBR0UiLCAiSFRUUF9DT05ORUNUSU9OIiwgIkhUVFBfSE9TVCIsCisgICAgICAgICAgICAiSFRUUF9SRUZFUkVSIiwgIkhUVFBfVVNFUl9BR0VOVCIsICJQQVRIX0lORk8iLCAiUEFUSF9UUkFOU0xBVEVEIiwKKyAgICAgICAgICAgICJRVUVSWV9TVFJJTkciLCAiUVVFUllfU1RSSU5HX1VORVNDQVBFRCIsICJSRU1PVEVfQUREUiIsCisgICAgICAgICAgICAiUkVNT1RFX0hPU1QiLCAiUkVNT1RFX1BPUlQiLCAiUkVNT1RFX1VTRVIiLCAiUkVRVUVTVF9NRVRIT0QiLAorICAgICAgICAgICAgIlJFUVVFU1RfVVJJIiwgIlNDUklQVF9GSUxFTkFNRSIsICJTQ1JJUFRfTkFNRSIsICJTRVJWRVJfQUREUiIsCisgICAgICAgICAgICAiU0VSVkVSX05BTUUiLCAiU0VSVkVSX1BPUlQiLCAiU0VSVkVSX1BST1RPQ09MIiwgIlNFUlZFUl9TT0ZUV0FSRSIsCisgICAgICAgICAgICAiVU5JUVVFX0lEIn07CisgICAgcHJvdGVjdGVkIFNlcnZsZXRDb250ZXh0IGNvbnRleHQ7CisgICAgcHJvdGVjdGVkIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXE7CisgICAgcHJvdGVjdGVkIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzOworICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmlydHVhbFdlYmFwcFJlbGF0aXZlOworICAgIHByb3RlY3RlZCBpbnQgZGVidWc7CisgICAgcHJvdGVjdGVkIFN0cmluZyBpbnB1dEVuY29kaW5nOworCisgICAgcHVibGljIFNTSVNlcnZsZXRFeHRlcm5hbFJlc29sdmVyKFNlcnZsZXRDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywKKyAgICAgICAgICAgIGJvb2xlYW4gaXNWaXJ0dWFsV2ViYXBwUmVsYXRpdmUsIGludCBkZWJ1ZywgU3RyaW5nIGlucHV0RW5jb2RpbmcpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgdGhpcy5yZXEgPSByZXE7CisgICAgICAgIHRoaXMucmVzID0gcmVzOworICAgICAgICB0aGlzLmlzVmlydHVhbFdlYmFwcFJlbGF0aXZlID0gaXNWaXJ0dWFsV2ViYXBwUmVsYXRpdmU7CisgICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKKyAgICAgICAgdGhpcy5pbnB1dEVuY29kaW5nID0gaW5wdXRFbmNvZGluZzsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAvL1dlIGNhbid0IGFzc3VtZSB0aGF0IFNlcnZsZXQubG9nKCBtZXNzYWdlLCBudWxsICkKKyAgICAgICAgLy9pcyB0aGUgc2FtZSBhcyBTZXJ2bGV0LmxvZyggbWVzc2FnZSApLCBzaW5jZSBBUEkKKyAgICAgICAgLy9kb2Vzbid0IHNlZW0gdG8gc2F5IHNvLgorICAgICAgICBpZiAodGhyb3dhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRleHQubG9nKG1lc3NhZ2UsIHRocm93YWJsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0LmxvZyhtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHZvaWQgYWRkVmFyaWFibGVOYW1lcyhDb2xsZWN0aW9uIHZhcmlhYmxlTmFtZXMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWQVJJQUJMRV9OQU1FUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHZhcmlhYmxlTmFtZSA9IFZBUklBQkxFX05BTUVTW2ldOworICAgICAgICAgICAgU3RyaW5nIHZhcmlhYmxlVmFsdWUgPSBnZXRWYXJpYWJsZVZhbHVlKHZhcmlhYmxlTmFtZSk7CisgICAgICAgICAgICBpZiAodmFyaWFibGVWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmFyaWFibGVOYW1lcy5hZGQodmFyaWFibGVOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFbnVtZXJhdGlvbiBlID0gcmVxLmdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKCFpc05hbWVSZXNlcnZlZChuYW1lKSkgeworICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZXMuYWRkKG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFJlcUF0dHJpYnV0ZUlnbm9yZUNhc2UoU3RyaW5nIHRhcmdldE5hbWUpIHsKKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IG51bGw7CisgICAgICAgIGlmICghaXNOYW1lUmVzZXJ2ZWQodGFyZ2V0TmFtZSkpIHsKKyAgICAgICAgICAgIG9iamVjdCA9IHJlcS5nZXRBdHRyaWJ1dGUodGFyZ2V0TmFtZSk7CisgICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gcmVxLmdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE5hbWUuZXF1YWxzSWdub3JlQ2FzZShuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFpc05hbWVSZXNlcnZlZChuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gcmVxLmdldEF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc05hbWVSZXNlcnZlZChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKCJqYXZhLiIpIHx8IG5hbWUuc3RhcnRzV2l0aCgiamF2YXguIikKKyAgICAgICAgICAgICAgICB8fCBuYW1lLnN0YXJ0c1dpdGgoInN1bi4iKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFZhcmlhYmxlVmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAoIWlzTmFtZVJlc2VydmVkKG5hbWUpKSB7CisgICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRWYXJpYWJsZVZhbHVlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFN0cmluZyByZXRWYWwgPSBudWxsOworICAgICAgICBPYmplY3Qgb2JqZWN0ID0gZ2V0UmVxQXR0cmlidXRlSWdub3JlQ2FzZShuYW1lKTsKKyAgICAgICAgaWYgKG9iamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXRWYWwgPSBvYmplY3QudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldFZhbCA9IGdldENHSVZhcmlhYmxlKG5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENHSVZhcmlhYmxlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFN0cmluZyByZXRWYWwgPSBudWxsOworICAgICAgICBTdHJpbmdbXSBuYW1lUGFydHMgPSBuYW1lLnRvVXBwZXJDYXNlKCkuc3BsaXQoIl8iKTsKKyAgICAgICAgaW50IHJlcXVpcmVkUGFydHMgPSAyOworICAgICAgICBpZiAobmFtZVBhcnRzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICBpZiAobmFtZVBhcnRzWzBdLmVxdWFscygiUEFUSCIpKSB7CisgICAgICAgICAgICAgICAgcmVxdWlyZWRQYXJ0cyA9IDE7CisgICAgICAgICAgICAgICAgcmV0VmFsID0gbnVsbDsgLy8gTm90IGltcGxlbWVudGVkCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobmFtZVBhcnRzWzBdLmVxdWFscygiQVVUSCIpKSB7CisgICAgICAgICAgICBpZiAobmFtZVBhcnRzWzFdLmVxdWFscygiVFlQRSIpKSB7CisgICAgICAgICAgICAgICAgcmV0VmFsID0gcmVxLmdldEF1dGhUeXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZihuYW1lUGFydHNbMF0uZXF1YWxzKCJDT05URU5UIikpIHsKKyAgICAgICAgICAgIGlmIChuYW1lUGFydHNbMV0uZXF1YWxzKCJMRU5HVEgiKSkgeworICAgICAgICAgICAgICAgIGludCBjb250ZW50TGVuZ3RoID0gcmVxLmdldENvbnRlbnRMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudExlbmd0aCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IEludGVnZXIudG9TdHJpbmcoY29udGVudExlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lUGFydHNbMV0uZXF1YWxzKCJUWVBFIikpIHsKKyAgICAgICAgICAgICAgICByZXRWYWwgPSByZXEuZ2V0Q29udGVudFR5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChuYW1lUGFydHNbMF0uZXF1YWxzKCJET0NVTUVOVCIpKSB7CisgICAgICAgICAgICBpZiAobmFtZVBhcnRzWzFdLmVxdWFscygiTkFNRSIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RVUkkgPSByZXEuZ2V0UmVxdWVzdFVSSSgpOworICAgICAgICAgICAgICAgIHJldFZhbCA9IHJlcXVlc3RVUkkuc3Vic3RyaW5nKHJlcXVlc3RVUkkubGFzdEluZGV4T2YoJy8nKSArIDEpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lUGFydHNbMV0uZXF1YWxzKCJVUkkiKSkgeworICAgICAgICAgICAgICAgIHJldFZhbCA9IHJlcS5nZXRSZXF1ZXN0VVJJKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJHQVRFV0FZX0lOVEVSRkFDRSIpKSB7CisgICAgICAgICAgICByZXRWYWwgPSAiQ0dJLzEuMSI7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZVBhcnRzWzBdLmVxdWFscygiSFRUUCIpKSB7CisgICAgICAgICAgICBpZiAobmFtZVBhcnRzWzFdLmVxdWFscygiQUNDRVBUIikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYWNjZXB0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAobmFtZVBhcnRzLmxlbmd0aCA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGFjY2VwdCA9ICJBY2NlcHQiOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVBhcnRzWzJdLmVxdWFscygiRU5DT0RJTkciKSkgeworICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFBhcnRzID0gMzsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXB0ID0gIkFjY2VwdC1FbmNvZGluZyI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lUGFydHNbMl0uZXF1YWxzKCJMQU5HVUFHRSIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkUGFydHMgPSAzOworICAgICAgICAgICAgICAgICAgICBhY2NlcHQgPSAiQWNjZXB0LUxhbmd1YWdlIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFjY2VwdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGFjY2VwdEhlYWRlcnMgPSByZXEuZ2V0SGVhZGVycyhhY2NlcHQpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXB0SGVhZGVycyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VwdEhlYWRlcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgcnYgPSBuZXcgU3RyaW5nQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgYWNjZXB0SGVhZGVycy5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYWNjZXB0SGVhZGVycy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgoU3RyaW5nKSBhY2NlcHRIZWFkZXJzLm5leHRFbGVtZW50KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJ2LnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChuYW1lUGFydHNbMV0uZXF1YWxzKCJDT05ORUNUSU9OIikpIHsKKyAgICAgICAgICAgICAgICByZXRWYWwgPSByZXEuZ2V0SGVhZGVyKCJDb25uZWN0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChuYW1lUGFydHNbMV0uZXF1YWxzKCJIT1NUIikpIHsKKyAgICAgICAgICAgICAgICByZXRWYWwgPSByZXEuZ2V0SGVhZGVyKCJIb3N0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChuYW1lUGFydHNbMV0uZXF1YWxzKCJSRUZFUkVSIikpIHsKKyAgICAgICAgICAgICAgICByZXRWYWwgPSByZXEuZ2V0SGVhZGVyKCJSZWZlcmVyIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChuYW1lUGFydHNbMV0uZXF1YWxzKCJVU0VSIikpCisgICAgICAgICAgICAgICAgaWYgKG5hbWVQYXJ0cy5sZW5ndGggPT0gMykKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVQYXJ0c1syXS5lcXVhbHMoIkFHRU5UIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkUGFydHMgPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmVxLmdldEhlYWRlcigiVXNlci1BZ2VudCIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmIChuYW1lUGFydHNbMF0uZXF1YWxzKCJQQVRIIikpIHsKKyAgICAgICAgICAgIGlmIChuYW1lUGFydHNbMV0uZXF1YWxzKCJJTkZPIikpIHsKKyAgICAgICAgICAgICAgICByZXRWYWwgPSByZXEuZ2V0UGF0aEluZm8oKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVBhcnRzWzFdLmVxdWFscygiVFJBTlNMQVRFRCIpKSB7CisgICAgICAgICAgICAgICAgcmV0VmFsID0gcmVxLmdldFBhdGhUcmFuc2xhdGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobmFtZVBhcnRzWzBdLmVxdWFscygiUVVFUlkiKSkgeworICAgICAgICAgICAgaWYgKG5hbWVQYXJ0c1sxXS5lcXVhbHMoIlNUUklORyIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcmVxLmdldFF1ZXJ5U3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWVQYXJ0cy5sZW5ndGggPT0gMikgeworICAgICAgICAgICAgICAgICAgICAvL2FwYWNoZSBkaXNwbGF5cyB0aGlzIGFzIGFuIGVtcHR5IHN0cmluZyByYXRoZXIgdGhhbiAobm9uZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gbnVsbFRvRW1wdHlTdHJpbmcocXVlcnlTdHJpbmcpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVBhcnRzWzJdLmVxdWFscygiVU5FU0NBUEVEIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRQYXJ0cyA9IDM7CisgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeVN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgZGVmYXVsdCBhcyBhIGxhc3QgcmVzb3J0CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcXVlcnlTdHJpbmdFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkRFRkFVTFRfQ0hBUkFDVEVSX0VOQ09ESU5HOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaUVuY29kaW5nID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlQm9keUVuY29kaW5nRm9yVVJJID0gZmFsc2U7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgZW5jb2Rpbmcgc2V0dGluZ3MgZnJvbSByZXF1ZXN0IC8gY29ubmVjdG9yIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RFbmNvZGluZyA9IHJlcS5nZXRDaGFyYWN0ZXJFbmNvZGluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcSBpbnN0YW5jZW9mIFJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmlFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUmVxdWVzdClyZXEpLmdldENvbm5lY3RvcigpLmdldFVSSUVuY29kaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlQm9keUVuY29kaW5nRm9yVVJJID0gKChSZXF1ZXN0KXJlcSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb25uZWN0b3IoKS5nZXRVc2VCb2R5RW5jb2RpbmdGb3JVUkkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHZhbGlkLCBhcHBseSBzZXR0aW5ncyBmcm9tIHJlcXVlc3QgLyBjb25uZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmlFbmNvZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlTdHJpbmdFbmNvZGluZyA9IHVyaUVuY29kaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHVzZUJvZHlFbmNvZGluZ0ZvclVSSSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0RW5jb2RpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVN0cmluZ0VuY29kaW5nID0gcmVxdWVzdEVuY29kaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gVVJMRGVjb2Rlci5kZWNvZGUocXVlcnlTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVN0cmluZ0VuY29kaW5nKTsgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcXVlcnlTdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZihuYW1lUGFydHNbMF0uZXF1YWxzKCJSRU1PVEUiKSkgeworICAgICAgICAgICAgaWYgKG5hbWVQYXJ0c1sxXS5lcXVhbHMoIkFERFIiKSkgeworICAgICAgICAgICAgICAgIHJldFZhbCA9IHJlcS5nZXRSZW1vdGVBZGRyKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVQYXJ0c1sxXS5lcXVhbHMoIkhPU1QiKSkgeworICAgICAgICAgICAgICAgIHJldFZhbCA9IHJlcS5nZXRSZW1vdGVIb3N0KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVQYXJ0c1sxXS5lcXVhbHMoIklERU5UIikpIHsKKyAgICAgICAgICAgICAgICByZXRWYWwgPSBudWxsOyAvLyBOb3QgaW1wbGVtZW50ZWQKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVBhcnRzWzFdLmVxdWFscygiUE9SVCIpKSB7CisgICAgICAgICAgICAgICAgcmV0VmFsID0gSW50ZWdlci50b1N0cmluZyggcmVxLmdldFJlbW90ZVBvcnQoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVQYXJ0c1sxXS5lcXVhbHMoIlVTRVIiKSkgeworICAgICAgICAgICAgICAgIHJldFZhbCA9IHJlcS5nZXRSZW1vdGVVc2VyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZihuYW1lUGFydHNbMF0uZXF1YWxzKCJSRVFVRVNUIikpIHsKKyAgICAgICAgICAgIGlmIChuYW1lUGFydHNbMV0uZXF1YWxzKCJNRVRIT0QiKSkgeworICAgICAgICAgICAgICAgIHJldFZhbCA9IHJlcS5nZXRNZXRob2QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVQYXJ0c1sxXS5lcXVhbHMoIlVSSSIpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBlcnJvciBwYWdlLCBnZXQgdGhlIG9yaWdpbmFsIFVSSQorICAgICAgICAgICAgICAgIHJldFZhbCA9IChTdHJpbmcpIHJlcS5nZXRBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgICAgICAiamF2YXguc2VydmxldC5mb3J3YXJkLnJlcXVlc3RfdXJpIik7CisgICAgICAgICAgICAgICAgaWYgKHJldFZhbCA9PSBudWxsKSByZXRWYWw9cmVxLmdldFJlcXVlc3RVUkkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChuYW1lUGFydHNbMF0uZXF1YWxzKCJTQ1JJUFQiKSkgeworICAgICAgICAgICAgU3RyaW5nIHNjcmlwdE5hbWUgPSByZXEuZ2V0U2VydmxldFBhdGgoKTsKKyAgICAgICAgICAgIGlmIChuYW1lUGFydHNbMV0uZXF1YWxzKCJGSUxFTkFNRSIpKSB7CisgICAgICAgICAgICAgICAgcmV0VmFsID0gY29udGV4dC5nZXRSZWFsUGF0aChzY3JpcHROYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVQYXJ0c1sxXS5lcXVhbHMoIk5BTUUiKSkgeworICAgICAgICAgICAgICAgIHJldFZhbCA9IHNjcmlwdE5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobmFtZVBhcnRzWzBdLmVxdWFscygiU0VSVkVSIikpIHsKKyAgICAgICAgICAgIGlmIChuYW1lUGFydHNbMV0uZXF1YWxzKCJBRERSIikpIHsKKyAgICAgICAgICAgICAgICByZXRWYWwgPSByZXEuZ2V0TG9jYWxBZGRyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmFtZVBhcnRzWzFdLmVxdWFscygiTkFNRSIpKSB7CisgICAgICAgICAgICAgICAgcmV0VmFsID0gcmVxLmdldFNlcnZlck5hbWUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVBhcnRzWzFdLmVxdWFscygiUE9SVCIpKSB7CisgICAgICAgICAgICAgICAgcmV0VmFsID0gSW50ZWdlci50b1N0cmluZyhyZXEuZ2V0U2VydmVyUG9ydCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVBhcnRzWzFdLmVxdWFscygiUFJPVE9DT0wiKSkgeworICAgICAgICAgICAgICAgIHJldFZhbCA9IHJlcS5nZXRQcm90b2NvbCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lUGFydHNbMV0uZXF1YWxzKCJTT0ZUV0FSRSIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHJ2ID0gbmV3IFN0cmluZ0J1ZmZlcihjb250ZXh0LmdldFNlcnZlckluZm8oKSk7CisgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgcnYuYXBwZW5kKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS5uYW1lIikpOworICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiLyIpOworICAgICAgICAgICAgICAgIHJ2LmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudm0udmVyc2lvbiIpKTsKKyAgICAgICAgICAgICAgICBydi5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICBydi5hcHBlbmQoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikpOworICAgICAgICAgICAgICAgIHJldFZhbCA9IHJ2LnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJVTklRVUVfSUQiKSkgeworICAgICAgICAgICAgcmV0VmFsID0gcmVxLmdldFJlcXVlc3RlZFNlc3Npb25JZCgpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXF1aXJlZFBhcnRzICE9IG5hbWVQYXJ0cy5sZW5ndGgpIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBnZXRDdXJyZW50RGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG51bGxUb0VtcHR5U3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgU3RyaW5nIHJldFZhbCA9IHN0cmluZzsKKyAgICAgICAgaWYgKHJldFZhbCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXRWYWwgPSAiIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXRoV2l0aG91dEZpbGVOYW1lKFN0cmluZyBzZXJ2bGV0UGF0aCkgeworICAgICAgICBTdHJpbmcgcmV0VmFsID0gbnVsbDsKKyAgICAgICAgaW50IGxhc3RTbGFzaCA9IHNlcnZsZXRQYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgIGlmIChsYXN0U2xhc2ggPj0gMCkgeworICAgICAgICAgICAgLy9jdXQgb2ZmIGZpbGUgbmFtZWUKKyAgICAgICAgICAgIHJldFZhbCA9IHNlcnZsZXRQYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2ggKyAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXRoV2l0aG91dENvbnRleHQoU3RyaW5nIHNlcnZsZXRQYXRoKSB7CisgICAgICAgIFN0cmluZyByZXRWYWwgPSBudWxsOworICAgICAgICBpbnQgc2Vjb25kU2xhc2ggPSBzZXJ2bGV0UGF0aC5pbmRleE9mKCcvJywgMSk7CisgICAgICAgIGlmIChzZWNvbmRTbGFzaCA+PSAwKSB7CisgICAgICAgICAgICAvL2N1dCBvZmYgY29udGV4dAorICAgICAgICAgICAgcmV0VmFsID0gc2VydmxldFBhdGguc3Vic3RyaW5nKHNlY29uZFNsYXNoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBwYXRoV2l0aG91dENvbnRleHQgPSBTU0lTZXJ2bGV0UmVxdWVzdFV0aWwuZ2V0UmVsYXRpdmVQYXRoKHJlcSk7CisgICAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRQYXRoV2l0aG91dEZpbGVOYW1lKHBhdGhXaXRob3V0Q29udGV4dCk7CisgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZG4ndCByZW1vdmUgZmlsZW5hbWUgZnJvbSBwYXRoOiAiCisgICAgICAgICAgICAgICAgICAgICsgcGF0aFdpdGhvdXRDb250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZnVsbFBhdGggPSBwcmVmaXggKyBwYXRoOworICAgICAgICBTdHJpbmcgcmV0VmFsID0gU1NJU2VydmxldFJlcXVlc3RVdGlsLm5vcm1hbGl6ZShmdWxsUGF0aCk7CisgICAgICAgIGlmIChyZXRWYWwgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJOb3JtYWxpemF0aW9uIHlpZWxkZWQgbnVsbCBvbiBwYXRoOiAiCisgICAgICAgICAgICAgICAgICAgICsgZnVsbFBhdGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgU2VydmxldENvbnRleHRBbmRQYXRoIGdldFNlcnZsZXRDb250ZXh0QW5kUGF0aEZyb21Ob25WaXJ0dWFsUGF0aCgKKyAgICAgICAgICAgIFN0cmluZyBub25WaXJ0dWFsUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5vblZpcnR1YWxQYXRoLnN0YXJ0c1dpdGgoIi8iKSB8fCBub25WaXJ0dWFsUGF0aC5zdGFydHNXaXRoKCJcXCIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkEgbm9uLXZpcnR1YWwgcGF0aCBjYW4ndCBiZSBhYnNvbHV0ZTogIgorICAgICAgICAgICAgICAgICAgICArIG5vblZpcnR1YWxQYXRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9uVmlydHVhbFBhdGguaW5kZXhPZigiLi4vIikgPj0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJBIG5vbi12aXJ0dWFsIHBhdGggY2FuJ3QgY29udGFpbiAnLi4vJyA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBub25WaXJ0dWFsUGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRBYnNvbHV0ZVBhdGgobm9uVmlydHVhbFBhdGgpOworICAgICAgICBTZXJ2bGV0Q29udGV4dEFuZFBhdGggY3NBbmRQID0gbmV3IFNlcnZsZXRDb250ZXh0QW5kUGF0aCgKKyAgICAgICAgICAgICAgICBjb250ZXh0LCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIGNzQW5kUDsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBTZXJ2bGV0Q29udGV4dEFuZFBhdGggZ2V0U2VydmxldENvbnRleHRBbmRQYXRoRnJvbVZpcnR1YWxQYXRoKAorICAgICAgICAgICAgU3RyaW5nIHZpcnR1YWxQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmICghdmlydHVhbFBhdGguc3RhcnRzV2l0aCgiLyIpICYmICF2aXJ0dWFsUGF0aC5zdGFydHNXaXRoKCJcXCIpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZsZXRDb250ZXh0QW5kUGF0aChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICBnZXRBYnNvbHV0ZVBhdGgodmlydHVhbFBhdGgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBub3JtYWxpemVkID0gU1NJU2VydmxldFJlcXVlc3RVdGlsLm5vcm1hbGl6ZSh2aXJ0dWFsUGF0aCk7CisgICAgICAgICAgICBpZiAoaXNWaXJ0dWFsV2ViYXBwUmVsYXRpdmUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZsZXRDb250ZXh0QW5kUGF0aChjb250ZXh0LCBub3JtYWxpemVkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2VydmxldENvbnRleHQgbm9ybUNvbnRleHQgPSBjb250ZXh0LmdldENvbnRleHQobm9ybWFsaXplZCk7CisgICAgICAgICAgICAgICAgaWYgKG5vcm1Db250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZG4ndCBnZXQgY29udGV4dCBmb3IgcGF0aDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbm9ybWFsaXplZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vSWYgaXQncyB0aGUgcm9vdCBjb250ZXh0LCB0aGVuIHRoZXJlIGlzIG5vIGNvbnRleHQgZWxlbWVudAorICAgICAgICAgICAgICAgIC8vIHRvIHJlbW92ZSwKKyAgICAgICAgICAgICAgICAvLyBpZToKKyAgICAgICAgICAgICAgICAvLyAnL2ZpbGUxLnNodG1sJyB2cyAnL2FwcE5hbWUxL2ZpbGUxLnNodG1sJworICAgICAgICAgICAgICAgIGlmICghaXNSb290Q29udGV4dChub3JtQ29udGV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5vQ29udGV4dCA9IGdldFBhdGhXaXRob3V0Q29udGV4dChub3JtYWxpemVkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vQ29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCByZW1vdmUgY29udGV4dCBmcm9tIHBhdGg6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5vcm1hbGl6ZWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmxldENvbnRleHRBbmRQYXRoKG5vcm1Db250ZXh0LCBub0NvbnRleHQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmxldENvbnRleHRBbmRQYXRoKG5vcm1Db250ZXh0LCBub3JtYWxpemVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vQXNzdW1lcyBzZXJ2bGV0Q29udGV4dCBpcyBub3QtbnVsbAorICAgIC8vQXNzdW1lcyB0aGF0IGlkZW50aXR5IGNvbXBhcmlzb24gd2lsbCBiZSB0cnVlIGZvciB0aGUgc2FtZSBjb250ZXh0CisgICAgLy9Bc3N1bWluZyB0aGUgYWJvdmUsIGdldENvbnRleHQoIi8iKSB3aWxsIGJlIG5vbi1udWxsIGFzIGxvbmcgYXMgdGhlIHJvb3QKKyAgICAvLyBjb250ZXh0IGlzCisgICAgLy8gYWNjZXNzaWJsZS4KKyAgICAvL0lmIGl0IGlzbid0LCB0aGVuIHNlcnZsZXRDb250ZXh0IGNhbid0IGJlIHRoZSByb290IGNvbnRleHQgYW55d2F5LCBoZW5jZQorICAgIC8vIHRoZXkgd2lsbAorICAgIC8vIG5vdCBtYXRjaC4KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1Jvb3RDb250ZXh0KFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0KSB7CisgICAgICAgIHJldHVybiBzZXJ2bGV0Q29udGV4dCA9PSBzZXJ2bGV0Q29udGV4dC5nZXRDb250ZXh0KCIvIik7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgU2VydmxldENvbnRleHRBbmRQYXRoIGdldFNlcnZsZXRDb250ZXh0QW5kUGF0aCgKKyAgICAgICAgICAgIFN0cmluZyBvcmlnaW5hbFBhdGgsIGJvb2xlYW4gdmlydHVhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU2VydmxldENvbnRleHRBbmRQYXRoIGNzQW5kUCA9IG51bGw7CisgICAgICAgIGlmIChkZWJ1ZyA+IDApIHsKKyAgICAgICAgICAgIGxvZygiU1NJU2VydmxldEV4dGVybmFsUmVzb2x2ZXIuZ2V0U2VydmxldENvbnRleHRBbmRQYXRoKCAiCisgICAgICAgICAgICAgICAgICAgICsgb3JpZ2luYWxQYXRoICsgIiwgIiArIHZpcnR1YWwgKyAiKSIsIG51bGwpOworICAgICAgICB9CisgICAgICAgIGlmICh2aXJ0dWFsKSB7CisgICAgICAgICAgICBjc0FuZFAgPSBnZXRTZXJ2bGV0Q29udGV4dEFuZFBhdGhGcm9tVmlydHVhbFBhdGgob3JpZ2luYWxQYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNzQW5kUCA9IGdldFNlcnZsZXRDb250ZXh0QW5kUGF0aEZyb21Ob25WaXJ0dWFsUGF0aChvcmlnaW5hbFBhdGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjc0FuZFA7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgVVJMQ29ubmVjdGlvbiBnZXRVUkxDb25uZWN0aW9uKFN0cmluZyBvcmlnaW5hbFBhdGgsCisgICAgICAgICAgICBib29sZWFuIHZpcnR1YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFNlcnZsZXRDb250ZXh0QW5kUGF0aCBjc0FuZFAgPSBnZXRTZXJ2bGV0Q29udGV4dEFuZFBhdGgob3JpZ2luYWxQYXRoLAorICAgICAgICAgICAgICAgIHZpcnR1YWwpOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gY3NBbmRQLmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgICAgIFN0cmluZyBwYXRoID0gY3NBbmRQLmdldFBhdGgoKTsKKyAgICAgICAgVVJMIHVybCA9IGNvbnRleHQuZ2V0UmVzb3VyY2UocGF0aCk7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb250ZXh0IGRpZCBub3QgY29udGFpbiByZXNvdXJjZTogIiArIHBhdGgpOworICAgICAgICB9CisgICAgICAgIFVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICByZXR1cm4gdXJsQ29ubmVjdGlvbjsKKyAgICB9CisKKworICAgIHB1YmxpYyBsb25nIGdldEZpbGVMYXN0TW9kaWZpZWQoU3RyaW5nIHBhdGgsIGJvb2xlYW4gdmlydHVhbCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbiA9IGdldFVSTENvbm5lY3Rpb24ocGF0aCwgdmlydHVhbCk7CisgICAgICAgICAgICBsYXN0TW9kaWZpZWQgPSB1cmxDb25uZWN0aW9uLmdldExhc3RNb2RpZmllZCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgdGhpcy4gSXQgd2lsbCBhbHdheXMgZmFpbCBmb3Igbm9uLWZpbGUgYmFzZWQgaW5jbHVkZXMKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFzdE1vZGlmaWVkOworICAgIH0KKworCisgICAgcHVibGljIGxvbmcgZ2V0RmlsZVNpemUoU3RyaW5nIHBhdGgsIGJvb2xlYW4gdmlydHVhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyBmaWxlU2l6ZSA9IC0xOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiB1cmxDb25uZWN0aW9uID0gZ2V0VVJMQ29ubmVjdGlvbihwYXRoLCB2aXJ0dWFsKTsKKyAgICAgICAgICAgIGZpbGVTaXplID0gdXJsQ29ubmVjdGlvbi5nZXRDb250ZW50TGVuZ3RoKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZSB0aGlzLiBJdCB3aWxsIGFsd2F5cyBmYWlsIGZvciBub24tZmlsZSBiYXNlZCBpbmNsdWRlcworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWxlU2l6ZTsKKyAgICB9CisKKworICAgIC8vV2UgYXJlIG1ha2luZyBsb3RzIG9mIHVubmVjZXNzYXJ5IGNvcGllcyBvZiB0aGUgaW5jbHVkZWQgZGF0YSBoZXJlLiBJZgorICAgIC8vc29tZW9uZSBldmVyIGNvbXBsYWlucyB0aGF0IHRoaXMgaXMgc2xvdywgd2Ugc2hvdWxkIGNvbm5lY3QgdGhlIGluY2x1ZGVkCisgICAgLy8gc3RyZWFtIHRvIHRoZSBwcmludCB3cml0ZXIgdGhhdCBTU0lDb21tYW5kIHVzZXMuCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlVGV4dChTdHJpbmcgb3JpZ2luYWxQYXRoLCBib29sZWFuIHZpcnR1YWwpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2VydmxldENvbnRleHRBbmRQYXRoIGNzQW5kUCA9IGdldFNlcnZsZXRDb250ZXh0QW5kUGF0aCgKKyAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxQYXRoLCB2aXJ0dWFsKTsKKyAgICAgICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSBjc0FuZFAuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gY3NBbmRQLmdldFBhdGgoKTsKKyAgICAgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0gY29udGV4dC5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihwYXRoKTsKKyAgICAgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGdldCByZXF1ZXN0IGRpc3BhdGNoZXIgZm9yIHBhdGg6ICIgKyBwYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJ5dGVBcnJheVNlcnZsZXRPdXRwdXRTdHJlYW0gYmFzb3MgPQorICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlTZXJ2bGV0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBSZXNwb25zZUluY2x1ZGVXcmFwcGVyIHJlc3BvbnNlSW5jbHVkZVdyYXBwZXIgPQorICAgICAgICAgICAgICAgIG5ldyBSZXNwb25zZUluY2x1ZGVXcmFwcGVyKGNvbnRleHQsIHJlcSwgcmVzLCBiYXNvcyk7CisgICAgICAgICAgICByZC5pbmNsdWRlKHJlcSwgcmVzcG9uc2VJbmNsdWRlV3JhcHBlcik7CisgICAgICAgICAgICAvL1dlIGNhbid0IGFzc3VtZSB0aGUgaW5jbHVkZWQgc2VydmxldCBmbHVzaGVkIGl0cyBvdXRwdXQKKyAgICAgICAgICAgIHJlc3BvbnNlSW5jbHVkZVdyYXBwZXIuZmx1c2hPdXRwdXRTdHJlYW1PcldyaXRlcigpOworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gYmFzb3MudG9CeXRlQXJyYXkoKTsKKworICAgICAgICAgICAgLy9Bc3N1bWUgcGxhdGZvcm0gZGVmYXVsdCBlbmNvZGluZyB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZAorICAgICAgICAgICAgU3RyaW5nIHJldFZhbDsKKyAgICAgICAgICAgIGlmIChpbnB1dEVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXRWYWwgPSBuZXcgU3RyaW5nKCBieXRlcyApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXRWYWwgPSBuZXcgU3RyaW5nIChieXRlcywgaW5wdXRFbmNvZGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vbWFrZSBhbiBhc3N1bXB0aW9uIHRoYXQgYW4gZW1wdHkgcmVzcG9uc2UgaXMgYSBmYWlsdXJlLiBUaGlzIGlzCisgICAgICAgICAgICAvLyBhIHByb2JsZW0KKyAgICAgICAgICAgIC8vIGlmIGEgdHJ1bHkgZW1wdHkgZmlsZQorICAgICAgICAgICAgLy93ZXJlIGluY2x1ZGVkLCBidXQgbm90IHN1cmUgaG93IGVsc2UgdG8gdGVsbC4KKyAgICAgICAgICAgIGlmIChyZXRWYWwuZXF1YWxzKCIiKSAmJiAhcmVxLmdldE1ldGhvZCgpLmVxdWFsc0lnbm9yZUNhc2UoCisgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuY295b3RlLmh0dHAxMS5Db25zdGFudHMuSEVBRCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvdWxkbid0IGZpbmQgZmlsZTogIiArIHBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgfSBjYXRjaCAoU2VydmxldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvdWxkbid0IGluY2x1ZGUgZmlsZTogIiArIG9yaWdpbmFsUGF0aAorICAgICAgICAgICAgICAgICAgICArICIgYmVjYXVzZSBvZiBTZXJ2bGV0RXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGNsYXNzIFNlcnZsZXRDb250ZXh0QW5kUGF0aCB7CisgICAgICAgIHByb3RlY3RlZCBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dDsKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBwYXRoOworCisKKyAgICAgICAgcHVibGljIFNlcnZsZXRDb250ZXh0QW5kUGF0aChTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCkgeworICAgICAgICAgICAgdGhpcy5zZXJ2bGV0Q29udGV4dCA9IHNlcnZsZXRDb250ZXh0OworICAgICAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIHNlcnZsZXRDb250ZXh0OworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgICAgICByZXR1cm4gcGF0aDsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVNlcnZsZXRSZXF1ZXN0VXRpbC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lTZXJ2bGV0UmVxdWVzdFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTIyN2U4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lTZXJ2bGV0UmVxdWVzdFV0aWwuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIExpY2Vuc2VkIHVuZGVyIHRoZQorICogQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUKKyAqIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKKyAqIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKKyAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zc2k7CisKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlJlcXVlc3RVdGlsOworcHVibGljIGNsYXNzIFNTSVNlcnZsZXRSZXF1ZXN0VXRpbCB7CisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZWxhdGl2ZSBwYXRoIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZsZXQuIFRha2VuIGZyb20KKyAgICAgKiBEZWZhdWx0U2VydmxldC5qYXZhLiBQZXJoYXBzIHRoaXMgc2hvdWxkIGJlIHB1dCBpbgorICAgICAqIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbCBzb21ld2hlcmU/IFNlZW1zIGxpa2UgaXQgd291bGQgYmUgd2lkZWx5IHVzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHJlcXVlc3QKKyAgICAgKiAgICAgICAgICAgIFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgLy8gQXJlIHdlIGJlaW5nIHByb2Nlc3NlZCBieSBhIFJlcXVlc3REaXNwYXRjaGVyLmluY2x1ZGUoKT8KKyAgICAgICAgaWYgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucmVxdWVzdF91cmkiKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZylyZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuaW5jbHVkZS5wYXRoX2luZm8iKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAoU3RyaW5nKXJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuaW5jbHVkZS5zZXJ2bGV0X3BhdGgiKTsKKyAgICAgICAgICAgIGlmICgocmVzdWx0ID09IG51bGwpIHx8IChyZXN1bHQuZXF1YWxzKCIiKSkpIHJlc3VsdCA9ICIvIjsKKyAgICAgICAgICAgIHJldHVybiAocmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICAvLyBObywgZXh0cmFjdCB0aGUgZGVzaXJlZCBwYXRoIGRpcmVjdGx5IGZyb20gdGhlIHJlcXVlc3QKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHJlcXVlc3QuZ2V0UGF0aEluZm8oKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQgPSByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXN1bHQgPT0gbnVsbCkgfHwgKHJlc3VsdC5lcXVhbHMoIiIpKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gIi8iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBub3JtYWxpemUocmVzdWx0KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvbnRleHQtcmVsYXRpdmUgcGF0aCwgYmVnaW5uaW5nIHdpdGggYSAiLyIsIHRoYXQgcmVwcmVzZW50cworICAgICAqIHRoZSBjYW5vbmljYWwgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWVkIHBhdGggYWZ0ZXIgIi4uIiBhbmQgIi4iIGVsZW1lbnRzCisgICAgICogYXJlIHJlc29sdmVkIG91dC4gSWYgdGhlIHNwZWNpZmllZCBwYXRoIGF0dGVtcHRzIHRvIGdvIG91dHNpZGUgdGhlCisgICAgICogYm91bmRhcmllcyBvZiB0aGUgY3VycmVudCBjb250ZXh0IChpLmUuIHRvbyBtYW55ICIuLiIgcGF0aCBlbGVtZW50cyBhcmUKKyAgICAgKiBwcmVzZW50KSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGluc3RlYWQuIFRoaXMgbm9ybWFsaXplIHNob3VsZCBiZQorICAgICAqIHRoZSBzYW1lIGFzIERlZmF1bHRTZXJ2bGV0Lm5vcm1hbGl6ZSwgd2hpY2ggaXMgYWxtb3N0IHRoZSBzYW1lICggc2VlCisgICAgICogc291cmNlIGNvZGUgYmVsb3cgKSBhcyBSZXF1ZXN0VXRpbC5ub3JtYWxpemUuIERvIHdlIG5lZWQgYWxsIHRoaXMKKyAgICAgKiBkdXBsaWNhdGlvbj8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGF0aAorICAgICAqICAgICAgICAgICAgUGF0aCB0byBiZSBub3JtYWxpemVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyBwYXRoKSB7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICBTdHJpbmcgbm9ybWFsaXplZCA9IHBhdGg7CisgICAgICAgIC8vV2h5IGRvZXNuJ3QgUmVxdWVzdFV0aWwgZG8gdGhpcz8/CisgICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgc2xhc2hlcyBhbmQgYWRkIGxlYWRpbmcgc2xhc2ggaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChub3JtYWxpemVkLmluZGV4T2YoJ1xcJykgPj0gMCkKKyAgICAgICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnJlcGxhY2UoJ1xcJywgJy8nKTsKKyAgICAgICAgbm9ybWFsaXplZCA9IFJlcXVlc3RVdGlsLm5vcm1hbGl6ZShwYXRoKTsKKyAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQ7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJU2V0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOWY4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVNldC5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gTGljZW5zZWQgdW5kZXIgdGhlCisgKiBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZQorICogbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcworICogZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZQorICogZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaTsKKworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKy8qKgorICogSW1wbGVtZW50cyB0aGUgU2VydmVyLXNpZGUgI3NldCBjb21tYW5kCisgKiAKKyAqIEBhdXRob3IgUGF1bCBTcGVlZAorICogQGF1dGhvciBEYW4gU2FuZGJlcmcKKyAqIEBhdXRob3IgRGF2aWQgQmVja2VyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFNTSVNldCBpbXBsZW1lbnRzIFNTSUNvbW1hbmQgeworICAgIC8qKgorICAgICAqIEBzZWUgU1NJQ29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyBsb25nIHByb2Nlc3MoU1NJTWVkaWF0b3Igc3NpTWVkaWF0b3IsIFN0cmluZyBjb21tYW5kTmFtZSwKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtTmFtZXMsIFN0cmluZ1tdIHBhcmFtVmFsdWVzLCBQcmludFdyaXRlciB3cml0ZXIpCisgICAgICAgICAgICB0aHJvd3MgU1NJU3RvcFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IDA7CisgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBzc2lNZWRpYXRvci5nZXRDb25maWdFcnJNc2coKTsKKyAgICAgICAgU3RyaW5nIHZhcmlhYmxlTmFtZSA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1OYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IHBhcmFtTmFtZXNbaV07CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IHBhcmFtVmFsdWVzW2ldOworICAgICAgICAgICAgaWYgKHBhcmFtTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ2YXIiKSkgeworICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZSA9IHBhcmFtVmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ2YWx1ZSIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdWJzdGl0dXRlZFZhbHVlID0gc3NpTWVkaWF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RpdHV0ZVZhcmlhYmxlcyhwYXJhbVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgc3NpTWVkaWF0b3Iuc2V0VmFyaWFibGVWYWx1ZSh2YXJpYWJsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RpdHV0ZWRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNzaU1lZGlhdG9yLmxvZygiI3NldC0tbm8gdmFyaWFibGUgc3BlY2lmaWVkIik7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShlcnJvck1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU1NJU3RvcFByb2Nlc3NpbmdFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNzaU1lZGlhdG9yLmxvZygiI3NldC0tSW52YWxpZCBhdHRyaWJ1dGU6ICIgKyBwYXJhbU5hbWUpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShlcnJvck1lc3NhZ2UpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTU0lTdG9wUHJvY2Vzc2luZ0V4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBsYXN0TW9kaWZpZWQ7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJU3RvcFByb2Nlc3NpbmdFeGNlcHRpb24uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJU3RvcFByb2Nlc3NpbmdFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjYyYmNhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lTdG9wUHJvY2Vzc2luZ0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gTGljZW5zZWQgdW5kZXIgdGhlCisgKiBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZQorICogbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcworICogZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZQorICogZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaTsKKworCisvKioKKyAqIEV4Y2VwdGlvbiB1c2VkIHRvIHRlbGwgU1NJUHJvY2Vzc29yIHRoYXQgaXQgc2hvdWxkIHN0b3AgcHJvY2Vzc2luZyBTU0kKKyAqIGNvbW1hbmRzLiBUaGlzIGlzIHVzZWQgdG8gbWltaWNrIHRoZSBBcGFjaGUgYmVoYXZpb3IgaW4gI3NldCB3aXRoIGludmFsaWQKKyAqIGF0dHJpYnV0ZXMuCisgKiAKKyAqIEBhdXRob3IgUGF1bCBTcGVlZAorICogQGF1dGhvciBEYW4gU2FuZGJlcmcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgU1NJU3RvcFByb2Nlc3NpbmdFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvcGFja2FnZS5odG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2ZjAxMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzxib2R5PgorPHA+VGhpcyBwYWNrYWdlIGNvbnRhaW5zIGNvZGUgdGhhdCBpcyB1c2VkIGJ5IHRoZSBTc2lJbnZva2VyLjwvcD4KKzxwPlRoaXMgY2xhc3MgY29uc2lzdHMgb2YgPGNvZGU+U3NpTWVkaWF0b3IuamF2YTwvY29kZT4gd2hpY2ggd29ya3MgYXMgYQorbWVkaWF0b3IgYmV0d2VlbiB0aGUgZGlmZmVyZW50IFNzaUNvbW1hbmRzLiBUbyBhZGQgYSBjb21tYW5kIHlvdSBoYXZlIHRvCitpbXBsZW1lbnQgdGhlIDxjb2RlPlNzaUNvbW1hbmQ8L2NvZGU+IGludGVyZmFjZSBhbmQgZXh0ZW5kIHRoZQorPGNvZGU+U3NpTWVkaWF0b3I8L2NvZGU+LiBDb21tYW5kcyBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXJlPC9wPgorCis8dWw+Cis8bGk+PGI+U3NpQ29uZmlnPC9iPiAtIEltcGxlbWVudGF0aW9uIG9mIHRoZSBOQ1NBIGNvbW1hbmQgQ29uZmlnIGkuZS4gJmx0OyEtLSNjb25maWcgZXJybXNnPSJlcnJvcj8iLS0mZ3Q7PC9saT4KKzxsaT48Yj5Tc2lFY2hvPC9iPiAtIEltcGxlbWVudGF0aW9uIG9mIHRoZSBOQ1NBIGNvbW1hbmQgRWNobyBpLmUuICZsdDshLS0jZWNobyB2YXI9IlNFUlZFUl9OQU1FIi0tJmd0OzwvbGk+Cis8bGk+PGI+U3NpRXhlYzwvYj4gLSBOb3QgaW1wbGVtZW50ZWQ8L2xpPgorPGxpPjxiPlNzaUZsYXN0TW9kPC9iPiAtIEltcGxlbWVudGF0aW9uIG9mIHRoZSBOQ1NBIGNvbW1hbmQgZmxhc3Rtb2QgaS5lLiAmbHQ7IS0tI2ZsYXN0bW9kIHZpcnR1YWw9ImZpbGUiLS0mZ3Q7PC9saT4KKzxsaT48Yj5Tc2lGc2l6ZTwvYj4gLSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTkNTQSBjb21tYW5kIGZzaXplIGkuZS4gJmx0OyEtLSNmc2l6ZSBmaWxlPSJmaWxlIi0tJmd0OzwvbGk+Cis8bGk+PGI+U3NpSW5jbHVkZTwvYj4gLSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTkNTQSBjb21tYW5kIEluY2x1ZGUgaS5lLiAmbHQ7IS0tI2NvbmZpZyB2aXJ0dWFsPSJpbmNsdWRlZmlsZSItLSZndDs8L2xpPgorPC91bD4KKzwvYm9keT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0F1dGhlbnRpY2F0b3JzLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9BdXRoZW50aWNhdG9ycy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZjAwYTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9BdXRoZW50aWNhdG9ycy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNiBAQAorIyBUaGVzZSBtdXN0IG1hdGNoIHRoZSBhbGxvd2VkIHZhbHVlcyBmb3IgYXV0aC1tZXRob2QgYXMgZGVmaW5lZCBieSB0aGUgc3BlYyAKK0JBU0lDPW9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5CYXNpY0F1dGhlbnRpY2F0b3IKK0NMSUVOVC1DRVJUPW9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5TU0xBdXRoZW50aWNhdG9yCitESUdFU1Q9b3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkRpZ2VzdEF1dGhlbnRpY2F0b3IKK0ZPUk09b3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkZvcm1BdXRoZW50aWNhdG9yCitOT05FPW9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5Ob25Mb2dpbkF1dGhlbnRpY2F0b3IKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0Jvb3RzdHJhcC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQm9vdHN0cmFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk0NzAxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0Jvb3RzdHJhcC5qYXZhCkBAIC0wLDAgKzEsNTE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zZWN1cml0eS5TZWN1cml0eUNsYXNzTG9hZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworCisvKioKKyAqIEJvb3N0cmFwIGxvYWRlciBmb3IgQ2F0YWxpbmEuICBUaGlzIGFwcGxpY2F0aW9uIGNvbnN0cnVjdHMgYSBjbGFzcyBsb2FkZXIKKyAqIGZvciB1c2UgaW4gbG9hZGluZyB0aGUgQ2F0YWxpbmEgaW50ZXJuYWwgY2xhc3NlcyAoYnkgYWNjdW11bGF0aW5nIGFsbCBvZiB0aGUKKyAqIEpBUiBmaWxlcyBmb3VuZCBpbiB0aGUgInNlcnZlciIgZGlyZWN0b3J5IHVuZGVyICJjYXRhbGluYS5ob21lIiksIGFuZAorICogc3RhcnRzIHRoZSByZWd1bGFyIGV4ZWN1dGlvbiBvZiB0aGUgY29udGFpbmVyLiAgVGhlIHB1cnBvc2Ugb2YgdGhpcworICogcm91bmRhYm91dCBhcHByb2FjaCBpcyB0byBrZWVwIHRoZSBDYXRhbGluYSBpbnRlcm5hbCBjbGFzc2VzIChhbmQgYW55CisgKiBvdGhlciBjbGFzc2VzIHRoZXkgZGVwZW5kIG9uLCBzdWNoIGFzIGFuIFhNTCBwYXJzZXIpIG91dCBvZiB0aGUgc3lzdGVtCisgKiBjbGFzcyBwYXRoIGFuZCB0aGVyZWZvcmUgbm90IHZpc2libGUgdG8gYXBwbGljYXRpb24gbGV2ZWwgY2xhc3Nlcy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEJvb3RzdHJhcCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQm9vdHN0cmFwLmNsYXNzKTsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxJTkFfSE9NRV9UT0tFTiA9ICIke2NhdGFsaW5hLmhvbWV9IjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTElOQV9CQVNFX1RPS0VOID0gIiR7Y2F0YWxpbmEuYmFzZX0iOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YXRpYyBWYXJpYWJsZXMKKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpNWF9FUlJPUl9NRVNTQUdFID0KKyAgICAgICAgIlRoaXMgcmVsZWFzZSBvZiBBcGFjaGUgVG9tY2F0IHdhcyBwYWNrYWdlZCB0byBydW4gb24gSjJTRSA1LjAgXG4iCisgICAgICAgICsgIm9yIGxhdGVyLiBJdCBjYW4gYmUgcnVuIG9uIGVhcmxpZXIgSlZNcyBieSBkb3dubG9hZGluZyBhbmQgXG4iCisgICAgICAgICsgImluc3RhbGxpbmcgYSBjb21wYXRpYmlsaXR5IHBhY2thZ2UgZnJvbSB0aGUgQXBhY2hlIFRvbWNhdCBcbiIKKyAgICAgICAgKyAiYmluYXJ5IGRvd25sb2FkIHBhZ2UuIjsKKworCisgICAgLyoqCisgICAgICogRGFlbW9uIG9iamVjdCB1c2VkIGJ5IG1haW4uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQm9vdHN0cmFwIGRhZW1vbiA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBEYWVtb24gcmVmZXJlbmNlLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGNhdGFsaW5hRGFlbW9uID0gbnVsbDsKKworCisgICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyIGNvbW1vbkxvYWRlciA9IG51bGw7CisgICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyIGNhdGFsaW5hTG9hZGVyID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgc2hhcmVkTG9hZGVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIHByaXZhdGUgdm9pZCBpbml0Q2xhc3NMb2FkZXJzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29tbW9uTG9hZGVyID0gY3JlYXRlQ2xhc3NMb2FkZXIoImNvbW1vbiIsIG51bGwpOworICAgICAgICAgICAgaWYoIGNvbW1vbkxvYWRlciA9PSBudWxsICkgeworICAgICAgICAgICAgICAgIC8vIG5vIGNvbmZpZyBmaWxlLCBkZWZhdWx0IHRvIHRoaXMgbG9hZGVyIC0gd2UgbWlnaHQgYmUgaW4gYSAnc2luZ2xlJyBlbnYuCisgICAgICAgICAgICAgICAgY29tbW9uTG9hZGVyPXRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0YWxpbmFMb2FkZXIgPSBjcmVhdGVDbGFzc0xvYWRlcigic2VydmVyIiwgY29tbW9uTG9hZGVyKTsKKyAgICAgICAgICAgIHNoYXJlZExvYWRlciA9IGNyZWF0ZUNsYXNzTG9hZGVyKCJzaGFyZWQiLCBjb21tb25Mb2FkZXIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJDbGFzcyBsb2FkZXIgY3JlYXRpb24gdGhyZXcgZXhjZXB0aW9uIiwgdCk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjcmVhdGVDbGFzc0xvYWRlcihTdHJpbmcgbmFtZSwgQ2xhc3NMb2FkZXIgcGFyZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgdmFsdWUgPSBDYXRhbGluYVByb3BlcnRpZXMuZ2V0UHJvcGVydHkobmFtZSArICIubG9hZGVyIik7CisgICAgICAgIGlmICgodmFsdWUgPT0gbnVsbCkgfHwgKHZhbHVlLmVxdWFscygiIikpKQorICAgICAgICAgICAgcmV0dXJuIHBhcmVudDsKKworICAgICAgICBBcnJheUxpc3QgcmVwb3NpdG9yeUxvY2F0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgQXJyYXlMaXN0IHJlcG9zaXRvcnlUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgaW50IGk7CisgCisgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIpOworICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKworICAgICAgICAgICAgLy8gTG9jYWwgcmVwb3NpdG9yeQorICAgICAgICAgICAgYm9vbGVhbiByZXBsYWNlID0gZmFsc2U7CisgICAgICAgICAgICBTdHJpbmcgYmVmb3JlID0gcmVwb3NpdG9yeTsKKyAgICAgICAgICAgIHdoaWxlICgoaT1yZXBvc2l0b3J5LmluZGV4T2YoQ0FUQUxJTkFfSE9NRV9UT0tFTikpPj0wKSB7CisgICAgICAgICAgICAgICAgcmVwbGFjZT10cnVlOworICAgICAgICAgICAgICAgIGlmIChpPjApIHsKKyAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gcmVwb3NpdG9yeS5zdWJzdHJpbmcoMCxpKSArIGdldENhdGFsaW5hSG9tZSgpIAorICAgICAgICAgICAgICAgICAgICArIHJlcG9zaXRvcnkuc3Vic3RyaW5nKGkrQ0FUQUxJTkFfSE9NRV9UT0tFTi5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IGdldENhdGFsaW5hSG9tZSgpIAorICAgICAgICAgICAgICAgICAgICAgICAgKyByZXBvc2l0b3J5LnN1YnN0cmluZyhDQVRBTElOQV9IT01FX1RPS0VOLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoKGk9cmVwb3NpdG9yeS5pbmRleE9mKENBVEFMSU5BX0JBU0VfVE9LRU4pKT49MCkgeworICAgICAgICAgICAgICAgIHJlcGxhY2U9dHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoaT4wKSB7CisgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IHJlcG9zaXRvcnkuc3Vic3RyaW5nKDAsaSkgKyBnZXRDYXRhbGluYUJhc2UoKSAKKyAgICAgICAgICAgICAgICAgICAgKyByZXBvc2l0b3J5LnN1YnN0cmluZyhpK0NBVEFMSU5BX0JBU0VfVE9LRU4ubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBnZXRDYXRhbGluYUJhc2UoKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcmVwb3NpdG9yeS5zdWJzdHJpbmcoQ0FUQUxJTkFfQkFTRV9UT0tFTi5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlcGxhY2UgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeHBhbmRlZCAiICsgYmVmb3JlICsgIiB0byAiICsgcmVwbGFjZSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBhIEpBUiBVUkwgcmVwb3NpdG9yeQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBVUkwgdXJsPW5ldyBVUkwocmVwb3NpdG9yeSk7CisgICAgICAgICAgICAgICAgcmVwb3NpdG9yeUxvY2F0aW9ucy5hZGQocmVwb3NpdG9yeSk7CisgICAgICAgICAgICAgICAgcmVwb3NpdG9yeVR5cGVzLmFkZChDbGFzc0xvYWRlckZhY3RvcnkuSVNfVVJMKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5LmVuZHNXaXRoKCIqLmphciIpKSB7CisgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IHJlcG9zaXRvcnkuc3Vic3RyaW5nCisgICAgICAgICAgICAgICAgICAgICgwLCByZXBvc2l0b3J5Lmxlbmd0aCgpIC0gIiouamFyIi5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgcmVwb3NpdG9yeUxvY2F0aW9ucy5hZGQocmVwb3NpdG9yeSk7CisgICAgICAgICAgICAgICAgcmVwb3NpdG9yeVR5cGVzLmFkZChDbGFzc0xvYWRlckZhY3RvcnkuSVNfR0xPQik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcG9zaXRvcnkuZW5kc1dpdGgoIi5qYXIiKSkgeworICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlMb2NhdGlvbnMuYWRkKHJlcG9zaXRvcnkpOworICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlUeXBlcy5hZGQoQ2xhc3NMb2FkZXJGYWN0b3J5LklTX0pBUik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlMb2NhdGlvbnMuYWRkKHJlcG9zaXRvcnkpOworICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlUeXBlcy5hZGQoQ2xhc3NMb2FkZXJGYWN0b3J5LklTX0RJUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdbXSBsb2NhdGlvbnMgPSAoU3RyaW5nW10pIHJlcG9zaXRvcnlMb2NhdGlvbnMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKKyAgICAgICAgSW50ZWdlcltdIHR5cGVzID0gKEludGVnZXJbXSkgcmVwb3NpdG9yeVR5cGVzLnRvQXJyYXkobmV3IEludGVnZXJbMF0pOworIAorICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IENsYXNzTG9hZGVyRmFjdG9yeS5jcmVhdGVDbGFzc0xvYWRlcgorICAgICAgICAgICAgKGxvY2F0aW9ucywgdHlwZXMsIHBhcmVudCk7CisKKyAgICAgICAgLy8gUmV0cmlldmluZyBNQmVhbiBzZXJ2ZXIKKyAgICAgICAgTUJlYW5TZXJ2ZXIgbUJlYW5TZXJ2ZXIgPSBudWxsOworICAgICAgICBpZiAoTUJlYW5TZXJ2ZXJGYWN0b3J5LmZpbmRNQmVhblNlcnZlcihudWxsKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBtQmVhblNlcnZlciA9CisgICAgICAgICAgICAgICAgKE1CZWFuU2VydmVyKSBNQmVhblNlcnZlckZhY3RvcnkuZmluZE1CZWFuU2VydmVyKG51bGwpLmdldCgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CZWFuU2VydmVyID0gTUJlYW5TZXJ2ZXJGYWN0b3J5LmNyZWF0ZU1CZWFuU2VydmVyKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWdpc3RlciB0aGUgc2VydmVyIGNsYXNzbG9hZGVyCisgICAgICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9CisgICAgICAgICAgICBuZXcgT2JqZWN0TmFtZSgiQ2F0YWxpbmE6dHlwZT1TZXJ2ZXJDbGFzc0xvYWRlcixuYW1lPSIgKyBuYW1lKTsKKyAgICAgICAgbUJlYW5TZXJ2ZXIucmVnaXN0ZXJNQmVhbihjbGFzc0xvYWRlciwgb2JqZWN0TmFtZSk7CisKKyAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGRhZW1vbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKworICAgICAgICAvLyBTZXQgQ2F0YWxpbmEgcGF0aAorICAgICAgICBzZXRDYXRhbGluYUhvbWUoKTsKKyAgICAgICAgc2V0Q2F0YWxpbmFCYXNlKCk7CisKKyAgICAgICAgaW5pdENsYXNzTG9hZGVycygpOworCisgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNhdGFsaW5hTG9hZGVyKTsKKworICAgICAgICBTZWN1cml0eUNsYXNzTG9hZC5zZWN1cml0eUNsYXNzTG9hZChjYXRhbGluYUxvYWRlcik7CisKKyAgICAgICAgLy8gTG9hZCBvdXIgc3RhcnR1cCBjbGFzcyBhbmQgY2FsbCBpdHMgcHJvY2VzcygpIG1ldGhvZAorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkxvYWRpbmcgc3RhcnR1cCBjbGFzcyIpOworICAgICAgICBDbGFzcyBzdGFydHVwQ2xhc3MgPQorICAgICAgICAgICAgY2F0YWxpbmFMb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5DYXRhbGluYSIpOworICAgICAgICBPYmplY3Qgc3RhcnR1cEluc3RhbmNlID0gc3RhcnR1cENsYXNzLm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBzaGFyZWQgZXh0ZW5zaW9ucyBjbGFzcyBsb2FkZXIKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXR0aW5nIHN0YXJ0dXAgY2xhc3MgcHJvcGVydGllcyIpOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9ICJzZXRQYXJlbnRDbGFzc0xvYWRlciI7CisgICAgICAgIENsYXNzIHBhcmFtVHlwZXNbXSA9IG5ldyBDbGFzc1sxXTsKKyAgICAgICAgcGFyYW1UeXBlc1swXSA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5DbGFzc0xvYWRlciIpOworICAgICAgICBPYmplY3QgcGFyYW1WYWx1ZXNbXSA9IG5ldyBPYmplY3RbMV07CisgICAgICAgIHBhcmFtVmFsdWVzWzBdID0gc2hhcmVkTG9hZGVyOworICAgICAgICBNZXRob2QgbWV0aG9kID0KKyAgICAgICAgICAgIHN0YXJ0dXBJbnN0YW5jZS5nZXRDbGFzcygpLmdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbVR5cGVzKTsKKyAgICAgICAgbWV0aG9kLmludm9rZShzdGFydHVwSW5zdGFuY2UsIHBhcmFtVmFsdWVzKTsKKworICAgICAgICBjYXRhbGluYURhZW1vbiA9IHN0YXJ0dXBJbnN0YW5jZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTG9hZCBkYWVtb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvYWQoU3RyaW5nW10gYXJndW1lbnRzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDYWxsIHRoZSBsb2FkKCkgbWV0aG9kCisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gImxvYWQiOworICAgICAgICBPYmplY3QgcGFyYW1bXTsKKyAgICAgICAgQ2xhc3MgcGFyYW1UeXBlc1tdOworICAgICAgICBpZiAoYXJndW1lbnRzPT1udWxsIHx8IGFyZ3VtZW50cy5sZW5ndGg9PTApIHsKKyAgICAgICAgICAgIHBhcmFtVHlwZXMgPSBudWxsOworICAgICAgICAgICAgcGFyYW0gPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyYW1UeXBlcyA9IG5ldyBDbGFzc1sxXTsKKyAgICAgICAgICAgIHBhcmFtVHlwZXNbMF0gPSBhcmd1bWVudHMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIHBhcmFtID0gbmV3IE9iamVjdFsxXTsKKyAgICAgICAgICAgIHBhcmFtWzBdID0gYXJndW1lbnRzOworICAgICAgICB9CisgICAgICAgIE1ldGhvZCBtZXRob2QgPSAKKyAgICAgICAgICAgIGNhdGFsaW5hRGFlbW9uLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtVHlwZXMpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkNhbGxpbmcgc3RhcnR1cCBjbGFzcyAiICsgbWV0aG9kKTsKKyAgICAgICAgbWV0aG9kLmludm9rZShjYXRhbGluYURhZW1vbiwgcGFyYW0pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWluIFByb2dyYW0KKworCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgQ2F0YWxpbmEgZGFlbW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoU3RyaW5nW10gYXJndW1lbnRzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpbml0KCk7CisgICAgICAgIGxvYWQoYXJndW1lbnRzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RhcnQgdGhlIENhdGFsaW5hIGRhZW1vbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiggY2F0YWxpbmFEYWVtb249PW51bGwgKSBpbml0KCk7CisKKyAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGNhdGFsaW5hRGFlbW9uLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzdGFydCIsIChDbGFzcyBbXSApbnVsbCk7CisgICAgICAgIG1ldGhvZC5pbnZva2UoY2F0YWxpbmFEYWVtb24sIChPYmplY3QgW10pbnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIENhdGFsaW5hIERhZW1vbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGNhdGFsaW5hRGFlbW9uLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzdG9wIiwgKENsYXNzIFtdICkgbnVsbCk7CisgICAgICAgIG1ldGhvZC5pbnZva2UoY2F0YWxpbmFEYWVtb24sIChPYmplY3QgW10gKSBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgc3RhbmRsb25lIHNlcnZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wU2VydmVyKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgTWV0aG9kIG1ldGhvZCA9IAorICAgICAgICAgICAgY2F0YWxpbmFEYWVtb24uZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInN0b3BTZXJ2ZXIiLCAoQ2xhc3MgW10pIG51bGwpOworICAgICAgICBtZXRob2QuaW52b2tlKGNhdGFsaW5hRGFlbW9uLCAoT2JqZWN0IFtdKSBudWxsKTsKKworICAgIH0KKworCisgICAvKioKKyAgICAgKiBTdG9wIHRoZSBzdGFuZGxvbmUgc2VydmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BTZXJ2ZXIoU3RyaW5nW10gYXJndW1lbnRzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3QgcGFyYW1bXTsKKyAgICAgICAgQ2xhc3MgcGFyYW1UeXBlc1tdOworICAgICAgICBpZiAoYXJndW1lbnRzPT1udWxsIHx8IGFyZ3VtZW50cy5sZW5ndGg9PTApIHsKKyAgICAgICAgICAgIHBhcmFtVHlwZXMgPSBudWxsOworICAgICAgICAgICAgcGFyYW0gPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyYW1UeXBlcyA9IG5ldyBDbGFzc1sxXTsKKyAgICAgICAgICAgIHBhcmFtVHlwZXNbMF0gPSBhcmd1bWVudHMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIHBhcmFtID0gbmV3IE9iamVjdFsxXTsKKyAgICAgICAgICAgIHBhcmFtWzBdID0gYXJndW1lbnRzOworICAgICAgICB9CisgICAgICAgIE1ldGhvZCBtZXRob2QgPSAKKyAgICAgICAgICAgIGNhdGFsaW5hRGFlbW9uLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzdG9wU2VydmVyIiwgcGFyYW1UeXBlcyk7CisgICAgICAgIG1ldGhvZC5pbnZva2UoY2F0YWxpbmFEYWVtb24sIHBhcmFtKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGZsYWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXdhaXQoYm9vbGVhbiBhd2FpdCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgQ2xhc3MgcGFyYW1UeXBlc1tdID0gbmV3IENsYXNzWzFdOworICAgICAgICBwYXJhbVR5cGVzWzBdID0gQm9vbGVhbi5UWVBFOworICAgICAgICBPYmplY3QgcGFyYW1WYWx1ZXNbXSA9IG5ldyBPYmplY3RbMV07CisgICAgICAgIHBhcmFtVmFsdWVzWzBdID0gbmV3IEJvb2xlYW4oYXdhaXQpOworICAgICAgICBNZXRob2QgbWV0aG9kID0gCisgICAgICAgICAgICBjYXRhbGluYURhZW1vbi5nZXRDbGFzcygpLmdldE1ldGhvZCgic2V0QXdhaXQiLCBwYXJhbVR5cGVzKTsKKyAgICAgICAgbWV0aG9kLmludm9rZShjYXRhbGluYURhZW1vbiwgcGFyYW1WYWx1ZXMpOworCisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QXdhaXQoKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBDbGFzcyBwYXJhbVR5cGVzW10gPSBuZXcgQ2xhc3NbMF07CisgICAgICAgIE9iamVjdCBwYXJhbVZhbHVlc1tdID0gbmV3IE9iamVjdFswXTsKKyAgICAgICAgTWV0aG9kIG1ldGhvZCA9CisgICAgICAgICAgICBjYXRhbGluYURhZW1vbi5nZXRDbGFzcygpLmdldE1ldGhvZCgiZ2V0QXdhaXQiLCBwYXJhbVR5cGVzKTsKKyAgICAgICAgQm9vbGVhbiBiPShCb29sZWFuKW1ldGhvZC5pbnZva2UoY2F0YWxpbmFEYWVtb24sIHBhcmFtVmFsdWVzKTsKKyAgICAgICAgcmV0dXJuIGIuYm9vbGVhblZhbHVlKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXN0cm95IHRoZSBDYXRhbGluYSBEYWVtb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKworICAgICAgICAvLyBGSVhNRQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNYWluIG1ldGhvZCwgdXNlZCBmb3IgdGVzdGluZyBvbmx5LgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgQ29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBiZSBwcm9jZXNzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCBKTVggY2xhc3MKKyAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKCJ0ZXN0OmZvbz1iYXIiKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihKTVhfRVJST1JfTUVTU0FHRSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIEdpdmUgdXNlcnMgc29tZSB0aW1lIHRvIHJlYWQgdGhlIG1lc3NhZ2UgYmVmb3JlIGV4aXRpbmcKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkYWVtb24gPT0gbnVsbCkgeworICAgICAgICAgICAgZGFlbW9uID0gbmV3IEJvb3RzdHJhcCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkYWVtb24uaW5pdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgY29tbWFuZCA9ICJzdGFydCI7CisgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgY29tbWFuZCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbW1hbmQuZXF1YWxzKCJzdGFydGQiKSkgeworICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSAic3RhcnQiOworICAgICAgICAgICAgICAgIGRhZW1vbi5sb2FkKGFyZ3MpOworICAgICAgICAgICAgICAgIGRhZW1vbi5zdGFydCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygic3RvcGQiKSkgeworICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSAic3RvcCI7CisgICAgICAgICAgICAgICAgZGFlbW9uLnN0b3AoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoInN0YXJ0IikpIHsKKyAgICAgICAgICAgICAgICBkYWVtb24uc2V0QXdhaXQodHJ1ZSk7CisgICAgICAgICAgICAgICAgZGFlbW9uLmxvYWQoYXJncyk7CisgICAgICAgICAgICAgICAgZGFlbW9uLnN0YXJ0KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCJzdG9wIikpIHsKKyAgICAgICAgICAgICAgICBkYWVtb24uc3RvcFNlcnZlcihhcmdzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIkJvb3RzdHJhcDogY29tbWFuZCBcIiIgKyBjb21tYW5kICsgIlwiIGRvZXMgbm90IGV4aXN0LiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2F0YWxpbmFIb21lKFN0cmluZyBzKSB7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSggImNhdGFsaW5hLmhvbWUiLCBzICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2F0YWxpbmFCYXNlKFN0cmluZyBzKSB7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSggImNhdGFsaW5hLmJhc2UiLCBzICk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPmNhdGFsaW5hLmJhc2U8L2NvZGU+IFN5c3RlbSBwcm9wZXJ0eSB0byB0aGUgY3VycmVudAorICAgICAqIHdvcmtpbmcgZGlyZWN0b3J5IGlmIGl0IGhhcyBub3QgYmVlbiBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldENhdGFsaW5hQmFzZSgpIHsKKworICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIikgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuaG9tZSIpICE9IG51bGwpCisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuaG9tZSIpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPmNhdGFsaW5hLmhvbWU8L2NvZGU+IFN5c3RlbSBwcm9wZXJ0eSB0byB0aGUgY3VycmVudAorICAgICAqIHdvcmtpbmcgZGlyZWN0b3J5IGlmIGl0IGhhcyBub3QgYmVlbiBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldENhdGFsaW5hSG9tZSgpIHsKKworICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5ob21lIikgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgRmlsZSBib290c3RyYXBKYXIgPSAKKyAgICAgICAgICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSwgImJvb3RzdHJhcC5qYXIiKTsKKyAgICAgICAgaWYgKGJvb3RzdHJhcEphci5leGlzdHMoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgKCJjYXRhbGluYS5ob21lIiwgCisgICAgICAgICAgICAgICAgICAgICAobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpLCAiLi4iKSkKKyAgICAgICAgICAgICAgICAgICAgIC5nZXRDYW5vbmljYWxQYXRoKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhdGFsaW5hLmhvbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXRhbGluYS5ob21lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGNhdGFsaW5hLmhvbWUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2F0YWxpbmFIb21lKCkgeworICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5ob21lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgY2F0YWxpbmEuYmFzZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDYXRhbGluYUJhc2UoKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiLCBnZXRDYXRhbGluYUhvbWUoKSk7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0NhdGFsaW5hLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9DYXRhbGluYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NjNiMGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9DYXRhbGluYS5qYXZhCkBAIC0wLDAgKzEsNjg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuRGlnZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5SdWxlOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CisKKworLyoqCisgKiBTdGFydHVwL1NodXRkb3duIHNoZWxsIHByb2dyYW0gZm9yIENhdGFsaW5hLiAgVGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUKKyAqIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQ6CisgKiA8dWw+CisgKiA8bGk+PGI+LWNvbmZpZyB7cGF0aG5hbWV9PC9iPiAtIFNldCB0aGUgcGF0aG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorICogICAgIHRvIGJlIHByb2Nlc3NlZC4gIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUKKyAqICAgICBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHBhdGhuYW1lIHNwZWNpZmllZCBieSB0aGUKKyAqICAgICAiY2F0YWxpbmEuYmFzZSIgc3lzdGVtIHByb3BlcnR5LiAgIFtjb25mL3NlcnZlci54bWxdCisgKiA8bGk+PGI+LWhlbHA8L2I+IC0gRGlzcGxheSB1c2FnZSBpbmZvcm1hdGlvbi4KKyAqIDxsaT48Yj4tc3RvcDwvYj4gLSBTdG9wIHRoZSBjdXJyZW50bHkgcnVubmluZyBpbnN0YW5jZSBvZiBDYXRhbGluYS4KKyAqIDwvdT4KKyAqCisgKiBTaG91bGQgZG8gdGhlIHNhbWUgdGhpbmcgYXMgRW1iZWRkZWQsIGJ1dCB1c2luZyBhIHNlcnZlci54bWwgZmlsZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENhdGFsaW5hIGV4dGVuZHMgRW1iZWRkZWQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogUGF0aG5hbWUgdG8gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb25maWdGaWxlID0gImNvbmYvc2VydmVyLnhtbCI7CisKKyAgICAvLyBYWFggU2hvdWxkIGJlIG1vdmVkIHRvIGVtYmVkZGVkCisgICAgLyoqCisgICAgICogVGhlIHNoYXJlZCBleHRlbnNpb25zIGNsYXNzIGxvYWRlciBmb3IgdGhpcyBzZXJ2ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyIHBhcmVudENsYXNzTG9hZGVyID0KKyAgICAgICAgQ2F0YWxpbmEuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZlciBjb21wb25lbnQgd2UgYXJlIHN0YXJ0aW5nIG9yIHN0b3BwaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIFNlcnZlciBzZXJ2ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBcmUgd2Ugc3RhcnRpbmcgYSBuZXcgc2VydmVyPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0aW5nID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEFyZSB3ZSBzdG9wcGluZyBhbiBleGlzdGluZyBzZXJ2ZXI/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RvcHBpbmcgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVXNlIHNodXRkb3duIGhvb2sgZmxhZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VTaHV0ZG93bkhvb2sgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBTaHV0ZG93biBob29rLgorICAgICAqLworICAgIHByb3RlY3RlZCBUaHJlYWQgc2h1dGRvd25Ib29rID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZyhTdHJpbmcgZmlsZSkgeworICAgICAgICBjb25maWdGaWxlID0gZmlsZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ0ZpbGUoU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgY29uZmlnRmlsZSA9IGZpbGU7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ0ZpbGUoKSB7CisgICAgICAgIHJldHVybiBjb25maWdGaWxlOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0VXNlU2h1dGRvd25Ib29rKGJvb2xlYW4gdXNlU2h1dGRvd25Ib29rKSB7CisgICAgICAgIHRoaXMudXNlU2h1dGRvd25Ib29rID0gdXNlU2h1dGRvd25Ib29rOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VXNlU2h1dGRvd25Ib29rKCkgeworICAgICAgICByZXR1cm4gdXNlU2h1dGRvd25Ib29rOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzaGFyZWQgZXh0ZW5zaW9ucyBjbGFzcyBsb2FkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50Q2xhc3NMb2FkZXIgVGhlIHNoYXJlZCBleHRlbnNpb25zIGNsYXNzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBwYXJlbnRDbGFzc0xvYWRlcikgeworCisgICAgICAgIHRoaXMucGFyZW50Q2xhc3NMb2FkZXIgPSBwYXJlbnRDbGFzc0xvYWRlcjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZXJ2ZXIgaW5zdGFuY2Ugd2UgYXJlIGNvbmZpZ3VyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZlciBUaGUgbmV3IHNlcnZlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlcihTZXJ2ZXIgc2VydmVyKSB7CisKKyAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWluIFByb2dyYW0KKworICAgIC8qKgorICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtYWluIHByb2dyYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyBDb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgeworICAgICAgICAobmV3IENhdGFsaW5hKCkpLnByb2Nlc3MoYXJncyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5zdGFuY2UgbWFpbiBwcm9ncmFtLgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgQ29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoU3RyaW5nIGFyZ3NbXSkgeworCisgICAgICAgIHNldEF3YWl0KHRydWUpOworICAgICAgICBzZXRDYXRhbGluYUhvbWUoKTsKKyAgICAgICAgc2V0Q2F0YWxpbmFCYXNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzKGFyZ3MpKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0aW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWQoYXJncyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdG9wcGluZykgeworICAgICAgICAgICAgICAgICAgICBzdG9wU2VydmVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywgYW5kIHJldHVybgorICAgICAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIHdlIHNob3VsZCBjb250aW51ZSBwcm9jZXNzaW5nOyBvdGhlcndpc2UKKyAgICAgKiByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgQ29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBwcm9jZXNzCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXJndW1lbnRzKFN0cmluZyBhcmdzW10pIHsKKworICAgICAgICBib29sZWFuIGlzQ29uZmlnID0gZmFsc2U7CisKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMSkgeworICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaXNDb25maWcpIHsKKyAgICAgICAgICAgICAgICBjb25maWdGaWxlID0gYXJnc1tpXTsKKyAgICAgICAgICAgICAgICBpc0NvbmZpZyA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLWNvbmZpZyIpKSB7CisgICAgICAgICAgICAgICAgaXNDb25maWcgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLW5vbmFtaW5nIikpIHsKKyAgICAgICAgICAgICAgICBzZXRVc2VOYW1pbmcoIGZhbHNlICk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItaGVscCIpKSB7CisgICAgICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoInN0YXJ0IikpIHsKKyAgICAgICAgICAgICAgICBzdGFydGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RvcHBpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoInN0b3AiKSkgeworICAgICAgICAgICAgICAgIHN0YXJ0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3RvcHBpbmcgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1c2FnZSgpOworICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICh0cnVlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIG91ciBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgY29uZmlnRmlsZSgpIHsKKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShjb25maWdGaWxlKTsKKyAgICAgICAgaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkKKyAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwgY29uZmlnRmlsZSk7CisgICAgICAgIHJldHVybiAoZmlsZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgY29uZmlndXJlIHRoZSBEaWdlc3RlciB3ZSB3aWxsIGJlIHVzaW5nIGZvciBzdGFydHVwLgorICAgICAqLworICAgIHByb3RlY3RlZCBEaWdlc3RlciBjcmVhdGVTdGFydERpZ2VzdGVyKCkgeworICAgICAgICBsb25nIHQxPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBkaWdlc3RlcgorICAgICAgICBEaWdlc3RlciBkaWdlc3RlciA9IG5ldyBEaWdlc3RlcigpOworICAgICAgICBkaWdlc3Rlci5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKKyAgICAgICAgZGlnZXN0ZXIuc2V0Q2xhc3NMb2FkZXIoU3RhbmRhcmRTZXJ2ZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisKKyAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBhY3Rpb25zIHdlIHdpbGwgYmUgdXNpbmcKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJTZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMoIlNlcnZlciIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJTZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRTZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlciIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiU2VydmVyL0dsb2JhbE5hbWluZ1Jlc291cmNlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMoIlNlcnZlci9HbG9iYWxOYW1pbmdSZXNvdXJjZXMiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiU2VydmVyL0dsb2JhbE5hbWluZ1Jlc291cmNlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldEdsb2JhbE5hbWluZ1Jlc291cmNlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk5hbWluZ1Jlc291cmNlcyIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiU2VydmVyL0xpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMoIlNlcnZlci9MaXN0ZW5lciIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJTZXJ2ZXIvTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRMaWZlY3ljbGVMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXIiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoIlNlcnZlci9TZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcygiU2VydmVyL1NlcnZpY2UiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiU2VydmVyL1NlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRTZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2aWNlIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJTZXJ2ZXIvU2VydmljZS9MaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBNVVNUIGJlIHNwZWNpZmllZCBpbiB0aGUgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKCJTZXJ2ZXIvU2VydmljZS9MaXN0ZW5lciIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJTZXJ2ZXIvU2VydmljZS9MaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZExpZmVjeWNsZUxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lciIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUoIlNlcnZlci9TZXJ2aWNlL0Nvbm5lY3RvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbm5lY3RvckNyZWF0ZVJ1bGUoKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUoIlNlcnZlci9TZXJ2aWNlL0Nvbm5lY3RvciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZXRBbGxQcm9wZXJ0aWVzUnVsZSgpKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiU2VydmVyL1NlcnZpY2UvQ29ubmVjdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkQ29ubmVjdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuQ29ubmVjdG9yIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJTZXJ2ZXIvU2VydmljZS9Db25uZWN0b3IvTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcygiU2VydmVyL1NlcnZpY2UvQ29ubmVjdG9yL0xpc3RlbmVyIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoIlNlcnZlci9TZXJ2aWNlL0Nvbm5lY3Rvci9MaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZExpZmVjeWNsZUxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lciIpOworCisgICAgICAgIC8vIEFkZCBSdWxlU2V0cyBmb3IgbmVzdGVkIGVsZW1lbnRzCisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGVTZXQobmV3IE5hbWluZ1J1bGVTZXQoIlNlcnZlci9HbG9iYWxOYW1pbmdSZXNvdXJjZXMvIikpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlU2V0KG5ldyBFbmdpbmVSdWxlU2V0KCJTZXJ2ZXIvU2VydmljZS8iKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGVTZXQobmV3IEhvc3RSdWxlU2V0KCJTZXJ2ZXIvU2VydmljZS9FbmdpbmUvIikpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlU2V0KG5ldyBDb250ZXh0UnVsZVNldCgiU2VydmVyL1NlcnZpY2UvRW5naW5lL0hvc3QvIikpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlU2V0KENsdXN0ZXJSdWxlU2V0RmFjdG9yeS5nZXRDbHVzdGVyUnVsZVNldCgiU2VydmVyL1NlcnZpY2UvRW5naW5lL0hvc3QvQ2x1c3Rlci8iKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGVTZXQobmV3IE5hbWluZ1J1bGVTZXQoIlNlcnZlci9TZXJ2aWNlL0VuZ2luZS9Ib3N0L0NvbnRleHQvIikpOworCisgICAgICAgIC8vIFdoZW4gdGhlICdlbmdpbmUnIGlzIGZvdW5kLCBzZXQgdGhlIHBhcmVudENsYXNzTG9hZGVyLgorICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKCJTZXJ2ZXIvU2VydmljZS9FbmdpbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZXRQYXJlbnRDbGFzc0xvYWRlclJ1bGUocGFyZW50Q2xhc3NMb2FkZXIpKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZVNldChDbHVzdGVyUnVsZVNldEZhY3RvcnkuZ2V0Q2x1c3RlclJ1bGVTZXQoIlNlcnZlci9TZXJ2aWNlL0VuZ2luZS9DbHVzdGVyLyIpKTsKKworICAgICAgICBsb25nIHQyPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkRpZ2VzdGVyIGZvciBzZXJ2ZXIueG1sIGNyZWF0ZWQgIiArICggdDItdDEgKSk7CisgICAgICAgIHJldHVybiAoZGlnZXN0ZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIGNvbmZpZ3VyZSB0aGUgRGlnZXN0ZXIgd2Ugd2lsbCBiZSB1c2luZyBmb3Igc2h1dGRvd24uCisgICAgICovCisgICAgcHJvdGVjdGVkIERpZ2VzdGVyIGNyZWF0ZVN0b3BEaWdlc3RlcigpIHsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBkaWdlc3RlcgorICAgICAgICBEaWdlc3RlciBkaWdlc3RlciA9IG5ldyBEaWdlc3RlcigpOworCisgICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgcnVsZXMgd2UgbmVlZCBmb3Igc2h1dHRpbmcgZG93bgorICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoIlNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcygiU2VydmVyIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoIlNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyIik7CisKKyAgICAgICAgcmV0dXJuIChkaWdlc3Rlcik7CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHN0b3BTZXJ2ZXIoKSB7CisgICAgICAgIHN0b3BTZXJ2ZXIobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcFNlcnZlcihTdHJpbmdbXSBhcmd1bWVudHMpIHsKKworICAgICAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFyZ3VtZW50cyhhcmd1bWVudHMpOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHNlcnZlciA9PSBudWxsICkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCBleGVjdXRlIG91ciBEaWdlc3RlcgorICAgICAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBjcmVhdGVTdG9wRGlnZXN0ZXIoKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgRmlsZSBmaWxlID0gY29uZmlnRmlsZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbnB1dFNvdXJjZSBpcyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBJbnB1dFNvdXJjZSgiZmlsZTovLyIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgICAgICAgICBpcy5zZXRCeXRlU3RyZWFtKGZpcyk7CisgICAgICAgICAgICAgICAgZGlnZXN0ZXIucHVzaCh0aGlzKTsKKyAgICAgICAgICAgICAgICBkaWdlc3Rlci5wYXJzZShpcyk7CisgICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ2F0YWxpbmEuc3RvcDogIiwgZSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9wIHRoZSBleGlzdGluZyBzZXJ2ZXIKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNvY2tldCBzb2NrZXQgPSBuZXcgU29ja2V0KCIxMjcuMC4wLjEiLCBzZXJ2ZXIuZ2V0UG9ydCgpKTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBzdHJlYW0gPSBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBTdHJpbmcgc2h1dGRvd24gPSBzZXJ2ZXIuZ2V0U2h1dGRvd24oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2h1dGRvd24ubGVuZ3RoKCk7IGkrKykKKyAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGUoc2h1dGRvd24uY2hhckF0KGkpKTsKKyAgICAgICAgICAgIHN0cmVhbS5mbHVzaCgpOworICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJDYXRhbGluYS5zdG9wOiAiLCBlKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+Y2F0YWxpbmEuYmFzZTwvY29kZT4gU3lzdGVtIHByb3BlcnR5IHRvIHRoZSBjdXJyZW50CisgICAgICogd29ya2luZyBkaXJlY3RvcnkgaWYgaXQgaGFzIG5vdCBiZWVuIHNldC4KKyAgICAgKiBAZGVwcmVjYXRlZCBVc2UgaW5pdERpcnMoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhdGFsaW5hQmFzZSgpIHsKKyAgICAgICAgaW5pdERpcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPmNhdGFsaW5hLmhvbWU8L2NvZGU+IFN5c3RlbSBwcm9wZXJ0eSB0byB0aGUgY3VycmVudAorICAgICAqIHdvcmtpbmcgZGlyZWN0b3J5IGlmIGl0IGhhcyBub3QgYmVlbiBzZXQuCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIGluaXREaXJzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYXRhbGluYUhvbWUoKSB7CisgICAgICAgIGluaXREaXJzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBuZXcgc2VydmVyIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWQoKSB7CisKKyAgICAgICAgaW5pdERpcnMoKTsKKworICAgICAgICAvLyBCZWZvcmUgZGlnZXN0ZXIgLSBpdCBtYXkgYmUgbmVlZGVkCisKKyAgICAgICAgaW5pdE5hbWluZygpOworCisgICAgICAgIC8vIENyZWF0ZSBhbmQgZXhlY3V0ZSBvdXIgRGlnZXN0ZXIKKyAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBjcmVhdGVTdGFydERpZ2VzdGVyKCk7CisgICAgICAgIGxvbmcgdDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBFeGNlcHRpb24gZXggPSBudWxsOworICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG51bGw7CisgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgRmlsZSBmaWxlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbGUgPSBjb25maWdGaWxlKCk7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSgiZmlsZTovLyIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VBc1N0cmVhbShnZXRDb25maWdGaWxlKCkpOworICAgICAgICAgICAgICAgIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlCisgICAgICAgICAgICAgICAgICAgIChnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZShnZXRDb25maWdGaWxlKCkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBjYXRhbGluYS5qYXIKKyAgICAgICAgLy8gQWx0ZXJuYXRpdmU6IGRvbid0IGJvdGhlciB3aXRoIHhtbCwganVzdCBjcmVhdGUgaXQgbWFudWFsbHkuCisgICAgICAgIGlmKCBpbnB1dFN0cmVhbT09bnVsbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkKKyAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VBc1N0cmVhbSgic2VydmVyLWVtYmVkLnhtbCIpOworICAgICAgICAgICAgICAgIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlCisgICAgICAgICAgICAgICAgKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlKCJzZXJ2ZXItZW1iZWQueG1sIikudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKworICAgICAgICBpZiAoKGlucHV0U3RyZWFtID09IG51bGwpICYmIChmaWxlICE9IG51bGwpKSB7CisgICAgICAgICAgICBsb2cud2FybigiQ2FuJ3QgbG9hZCBzZXJ2ZXIueG1sIGZyb20gIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlucHV0U291cmNlLnNldEJ5dGVTdHJlYW0oaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgZGlnZXN0ZXIucHVzaCh0aGlzKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLnBhcnNlKGlucHV0U291cmNlKTsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cud2FybigiQ2F0YWxpbmEuc3RhcnQgdXNpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0Q29uZmlnRmlsZSgpICsgIjogIiAsIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RyZWFtIHJlZGlyZWN0aW9uCisgICAgICAgIGluaXRTdHJlYW1zKCk7CisKKyAgICAgICAgLy8gU3RhcnQgdGhlIG5ldyBzZXJ2ZXIKKyAgICAgICAgaWYgKHNlcnZlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuaW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNhdGFsaW5hLnN0YXJ0IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuaW5mbygiSW5pdGlhbGl6YXRpb24gcHJvY2Vzc2VkIGluICIgKyAodDIgLSB0MSkgKyAiIG1zIik7CisKKyAgICB9CisKKworICAgIC8qIAorICAgICAqIExvYWQgdXNpbmcgYXJndW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZChTdHJpbmcgYXJnc1tdKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChhcmd1bWVudHMoYXJncykpCisgICAgICAgICAgICAgICAgbG9hZCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjcmVhdGUoKSB7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworCisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBuZXcgc2VydmVyIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworCisgICAgICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9hZCgpOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyB0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIC8vIFN0YXJ0IHRoZSBuZXcgc2VydmVyCisgICAgICAgIGlmIChzZXJ2ZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIHNlcnZlcikuc3RhcnQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDYXRhbGluYS5zdGFydDogIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuaW5mbygiU2VydmVyIHN0YXJ0dXAgaW4gIiArICh0MiAtIHQxKSArICIgbXMiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgc2h1dGRvd24gaG9vaworICAgICAgICAgICAgaWYgKHVzZVNodXRkb3duSG9vaykgeworICAgICAgICAgICAgICAgIGlmIChzaHV0ZG93bkhvb2sgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzaHV0ZG93bkhvb2sgPSBuZXcgQ2F0YWxpbmFTaHV0ZG93bkhvb2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKHNodXRkb3duSG9vayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZmFpbCBvbiBKREsgMS4yLiBJZ25vcmluZywgYXMgVG9tY2F0IGNhbiBydW4KKyAgICAgICAgICAgIC8vIGZpbmUgd2l0aG91dCB0aGUgc2h1dGRvd24gaG9vay4KKyAgICAgICAgfQorCisgICAgICAgIGlmIChhd2FpdCkgeworICAgICAgICAgICAgYXdhaXQoKTsKKyAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdG9wIGFuIGV4aXN0aW5nIHNlcnZlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIFNodXRkb3duSG9vayBmaXJzdCBzbyB0aGF0IHNlcnZlci5zdG9wKCkgCisgICAgICAgICAgICAvLyBkb2Vzbid0IGdldCBpbnZva2VkIHR3aWNlCisgICAgICAgICAgICBpZiAodXNlU2h1dGRvd25Ib29rKSB7CisgICAgICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkucmVtb3ZlU2h1dGRvd25Ib29rKHNodXRkb3duSG9vayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZmFpbCBvbiBKREsgMS4yLiBJZ25vcmluZywgYXMgVG9tY2F0IGNhbiBydW4KKyAgICAgICAgICAgIC8vIGZpbmUgd2l0aG91dCB0aGUgc2h1dGRvd24gaG9vay4KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNodXQgZG93biB0aGUgc2VydmVyCisgICAgICAgIGlmIChzZXJ2ZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIHNlcnZlcikuc3RvcCgpOworICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNhdGFsaW5hLnN0b3AiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBd2FpdCBhbmQgc2h1dGRvd24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXdhaXQoKSB7CisKKyAgICAgICAgc2VydmVyLmF3YWl0KCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByaW50IHVzYWdlIGluZm9ybWF0aW9uIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHVzYWdlKCkgeworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbgorICAgICAgICAgICAgKCJ1c2FnZTogamF2YSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQ2F0YWxpbmEiCisgICAgICAgICAgICAgKyAiIFsgLWNvbmZpZyB7cGF0aG5hbWV9IF0iCisgICAgICAgICAgICAgKyAiIFsgLW5vbmFtaW5nIF0geyBzdGFydCB8IHN0b3AgfSIpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2F0YWxpbmFTaHV0ZG93bkhvb2sgSW5uZXIgQ2xhc3MKKworICAgIC8vIFhYWCBTaG91bGQgYmUgbW92ZWQgdG8gZW1iZWRkZWQgIQorICAgIC8qKgorICAgICAqIFNodXRkb3duIGhvb2sgd2hpY2ggd2lsbCBwZXJmb3JtIGEgY2xlYW4gc2h1dGRvd24gb2YgQ2F0YWxpbmEgaWYgbmVlZGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBDYXRhbGluYVNodXRkb3duSG9vayBleHRlbmRzIFRocmVhZCB7CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworCisgICAgICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDYXRhbGluYS50aGlzLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIENhdGFsaW5hLmNsYXNzICk7CisKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBDbGFzc2VzCisKKworLyoqCisgKiBSdWxlIHRoYXQgc2V0cyB0aGUgcGFyZW50IGNsYXNzIGxvYWRlciBmb3IgdGhlIHRvcCBvYmplY3Qgb24gdGhlIHN0YWNrLAorICogd2hpY2ggbXVzdCBiZSBhIDxjb2RlPkNvbnRhaW5lcjwvY29kZT4uCisgKi8KKworZmluYWwgY2xhc3MgU2V0UGFyZW50Q2xhc3NMb2FkZXJSdWxlIGV4dGVuZHMgUnVsZSB7CisKKyAgICBwdWJsaWMgU2V0UGFyZW50Q2xhc3NMb2FkZXJSdWxlKENsYXNzTG9hZGVyIHBhcmVudENsYXNzTG9hZGVyKSB7CisKKyAgICAgICAgdGhpcy5wYXJlbnRDbGFzc0xvYWRlciA9IHBhcmVudENsYXNzTG9hZGVyOworCisgICAgfQorCisgICAgQ2xhc3NMb2FkZXIgcGFyZW50Q2xhc3NMb2FkZXIgPSBudWxsOworCisgICAgcHVibGljIHZvaWQgYmVnaW4oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRpZ2VzdGVyLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBkaWdlc3Rlci5nZXRMb2dnZXIoKS5kZWJ1ZygiU2V0dGluZyBwYXJlbnQgY2xhc3MgbG9hZGVyIik7CisKKyAgICAgICAgQ29udGFpbmVyIHRvcCA9IChDb250YWluZXIpIGRpZ2VzdGVyLnBlZWsoKTsKKyAgICAgICAgdG9wLnNldFBhcmVudENsYXNzTG9hZGVyKHBhcmVudENsYXNzTG9hZGVyKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9DYXRhbGluYVByb3BlcnRpZXMuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0NhdGFsaW5hUHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MzhlODQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9DYXRhbGluYVByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byByZWFkIHRoZSBib290c3RyYXAgQ2F0YWxpbmEgY29uZmlndXJhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDYXRhbGluYVByb3BlcnRpZXMgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YXRpYyBWYXJpYWJsZXMKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2c9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBDYXRhbGluYVByb3BlcnRpZXMuY2xhc3MgKTsKKworICAgIHByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG51bGw7CisKKworICAgIHN0YXRpYyB7CisKKyAgICAgICAgbG9hZFByb3BlcnRpZXMoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBzcGVjaWZpZWQgcHJvcGVydHkgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKKwkKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBzcGVjaWZpZWQgcHJvcGVydHkgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKworICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShuYW1lLCBkZWZhdWx0VmFsdWUpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogTG9hZCBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9hZFByb3BlcnRpZXMoKSB7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworICAgICAgICBUaHJvd2FibGUgZXJyb3IgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgY29uZmlnVXJsID0gZ2V0Q29uZmlnVXJsKCk7CisgICAgICAgICAgICBpZiAoY29uZmlnVXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpcyA9IChuZXcgVVJMKGNvbmZpZ1VybCkpLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRmlsZSBob21lID0gbmV3IEZpbGUoZ2V0Q2F0YWxpbmFCYXNlKCkpOworICAgICAgICAgICAgICAgIEZpbGUgY29uZiA9IG5ldyBGaWxlKGhvbWUsICJjb25mIik7CisgICAgICAgICAgICAgICAgRmlsZSBwcm9wZXJ0aWVzID0gbmV3IEZpbGUoY29uZiwgImNhdGFsaW5hLnByb3BlcnRpZXMiKTsKKyAgICAgICAgICAgICAgICBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvcGVydGllcyk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaXMgPSBDYXRhbGluYVByb3BlcnRpZXMuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbQorICAgICAgICAgICAgICAgICAgICAoIi9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvY2F0YWxpbmEucHJvcGVydGllcyIpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIHByb3BlcnRpZXMubG9hZChpcyk7CisgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChpcyA9PSBudWxsKSB8fCAoZXJyb3IgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIC8vIERvIHNvbWV0aGluZworICAgICAgICAgICAgbG9nLndhcm4oIkZhaWxlZCB0byBsb2FkIGNhdGFsaW5hLnByb3BlcnRpZXMiLCBlcnJvcik7CisgICAgICAgICAgICAvLyBUaGF0J3MgZmluZSAtIHdlIGhhdmUgcmVhc29uYWJsZSBkZWZhdWx0cy4KKyAgICAgICAgICAgIHByb3BlcnRpZXM9bmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBwcm9wZXJ0aWVzIGFzIHN5c3RlbSBwcm9wZXJ0aWVzCisgICAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcHJvcGVydGllcy5wcm9wZXJ0eU5hbWVzKCk7CisgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShuYW1lKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBjYXRhbGluYS5ob21lIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDYXRhbGluYUhvbWUoKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmhvbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGNhdGFsaW5hLmJhc2UgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENhdGFsaW5hQmFzZSgpIHsKKyAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIsIGdldENhdGFsaW5hSG9tZSgpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gVVJMLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDb25maWdVcmwoKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmNvbmZpZyIpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9DbGFzc0xvYWRlckZhY3RvcnkuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0NsYXNzTG9hZGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZmI3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9DbGFzc0xvYWRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLlN0YW5kYXJkQ2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKworLyoqCisgKiA8cD5VdGlsaXR5IGNsYXNzIGZvciBidWlsZGluZyBjbGFzcyBsb2FkZXJzIGZvciBDYXRhbGluYS4gIFRoZSBmYWN0b3J5CisgKiBtZXRob2QgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGluIG9yZGVyIHRvIGJ1aWxkIGEgbmV3IGNsYXNzCisgKiBsb2FkZXIgKHdpdGggc3VpdGFibGUgZGVmYXVsdHMgaW4gYWxsIGNhc2VzKTo8L3A+CisgKiA8dWw+CisgKiA8bGk+QSBzZXQgb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyB1bnBhY2tlZCBjbGFzc2VzIChhbmQgcmVzb3VyY2VzKQorICogICAgIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBjbGFzcyBsb2FkZXIncworICogICAgIHJlcG9zaXRvcmllcy48L2xpPgorICogPGxpPkEgc2V0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIGluIEpBUiBmaWxlcy4KKyAqICAgICBFYWNoIHJlYWRhYmxlIEpBUiBmaWxlIGRpc2NvdmVyZWQgaW4gdGhlc2UgZGlyZWN0b3JpZXMgd2lsbCBiZQorICogICAgIGFkZGVkIHRvIHRoZSBjbGFzcyBsb2FkZXIncyByZXBvc2l0b3JpZXMuPC9saT4KKyAqIDxsaT48Y29kZT5DbGFzc0xvYWRlcjwvY29kZT4gaW5zdGFuY2UgdGhhdCBzaG91bGQgYmVjb21lIHRoZSBwYXJlbnQgb2YKKyAqICAgICB0aGUgbmV3IGNsYXNzIGxvYWRlci48L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIENsYXNzTG9hZGVyRmFjdG9yeSB7CisKKworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDbGFzc0xvYWRlckZhY3RvcnkuY2xhc3MpOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIElTX0RJUiA9IG5ldyBJbnRlZ2VyKDApOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBJU19KQVIgPSBuZXcgSW50ZWdlcigxKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgSVNfR0xPQiA9IG5ldyBJbnRlZ2VyKDIpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBJU19VUkwgPSBuZXcgSW50ZWdlcigzKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBjbGFzcyBsb2FkZXIsIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uCisgICAgICogZGVmYXVsdHMgYW5kIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHBhdGhzOgorICAgICAqCisgICAgICogQHBhcmFtIHVucGFja2VkIEFycmF5IG9mIHBhdGhuYW1lcyB0byB1bnBhY2tlZCBkaXJlY3RvcmllcyB0aGF0IHNob3VsZAorICAgICAqICBiZSBhZGRlZCB0byB0aGUgcmVwb3NpdG9yaWVzIG9mIHRoZSBjbGFzcyBsb2FkZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IAorICAgICAqIGZvciBubyB1bnBhY2tlZCBkaXJlY3RvcmllcyB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHBhcmFtIHBhY2tlZCBBcnJheSBvZiBwYXRobmFtZXMgdG8gZGlyZWN0b3JpZXMgY29udGFpbmluZyBKQVIgZmlsZXMKKyAgICAgKiAgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHJlcG9zaXRvcmllcyBvZiB0aGUgY2xhc3MgbG9hZGVyLCAKKyAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm8gZGlyZWN0b3JpZXMgb2YgSkFSIGZpbGVzIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gcGFyZW50IFBhcmVudCBjbGFzcyBsb2FkZXIgZm9yIHRoZSBuZXcgY2xhc3MgbG9hZGVyLCBvcgorICAgICAqICA8Y29kZT5udWxsPC9jb2RlPiBmb3IgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgY29uc3RydWN0aW5nIHRoZSBjbGFzcyBsb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzTG9hZGVyIGNyZWF0ZUNsYXNzTG9hZGVyKEZpbGUgdW5wYWNrZWRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgcGFja2VkW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBwYXJlbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY3JlYXRlQ2xhc3NMb2FkZXIodW5wYWNrZWQsIHBhY2tlZCwgbnVsbCwgcGFyZW50KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IGNsYXNzIGxvYWRlciwgYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBkZWZhdWx0cyBhbmQgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgcGF0aHM6CisgICAgICoKKyAgICAgKiBAcGFyYW0gdW5wYWNrZWQgQXJyYXkgb2YgcGF0aG5hbWVzIHRvIHVucGFja2VkIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkCisgICAgICogIGJlIGFkZGVkIHRvIHRoZSByZXBvc2l0b3JpZXMgb2YgdGhlIGNsYXNzIGxvYWRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gCisgICAgICogZm9yIG5vIHVucGFja2VkIGRpcmVjdG9yaWVzIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gcGFja2VkIEFycmF5IG9mIHBhdGhuYW1lcyB0byBkaXJlY3RvcmllcyBjb250YWluaW5nIEpBUiBmaWxlcworICAgICAqICB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgcmVwb3NpdG9yaWVzIG9mIHRoZSBjbGFzcyBsb2FkZXIsIAorICAgICAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBubyBkaXJlY3RvcmllcyBvZiBKQVIgZmlsZXMgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSB1cmxzIEFycmF5IG9mIFVSTHMgdG8gcmVtb3RlIHJlcG9zaXRvcmllcywgZGVzaWduaW5nIGVpdGhlciBKQVIgCisgICAgICogIHJlc291cmNlcyBvciB1bmNvbXByZXNzZWQgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gCisgICAgICogIHRoZSByZXBvc2l0b3JpZXMgb2YgdGhlIGNsYXNzIGxvYWRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vIAorICAgICAqICBkaXJlY3RvcmllcyBvZiBKQVIgZmlsZXMgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBwYXJlbnQgUGFyZW50IGNsYXNzIGxvYWRlciBmb3IgdGhlIG5ldyBjbGFzcyBsb2FkZXIsIG9yCisgICAgICogIDxjb2RlPm51bGw8L2NvZGU+IGZvciB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlci4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBjb25zdHJ1Y3RpbmcgdGhlIGNsYXNzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgY3JlYXRlQ2xhc3NMb2FkZXIoRmlsZSB1bnBhY2tlZFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBwYWNrZWRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCB1cmxzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBwYXJlbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgbmV3IGNsYXNzIGxvYWRlciIpOworCisgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgImNsYXNzIHBhdGgiIGZvciB0aGlzIGNsYXNzIGxvYWRlcgorICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICAvLyBBZGQgdW5wYWNrZWQgZGlyZWN0b3JpZXMKKyAgICAgICAgaWYgKHVucGFja2VkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5wYWNrZWQubGVuZ3RoOyBpKyspICB7CisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gdW5wYWNrZWRbaV07CisgICAgICAgICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpIHx8ICFmaWxlLmNhblJlYWQoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBmaWxlLnRvVVJMKCk7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgSW5jbHVkaW5nIGRpcmVjdG9yeSAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZCh1cmwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHBhY2tlZCBkaXJlY3RvcnkgSkFSIGZpbGVzCisgICAgICAgIGlmIChwYWNrZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGaWxlIGRpcmVjdG9yeSA9IHBhY2tlZFtpXTsKKyAgICAgICAgICAgICAgICBpZiAoIWRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpIHx8ICFkaXJlY3RvcnkuZXhpc3RzKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIWRpcmVjdG9yeS5jYW5SZWFkKCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZXNbXSA9IGRpcmVjdG9yeS5saXN0KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmaWxlbmFtZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZmlsZW5hbWVzW2pdLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZW5hbWUuZW5kc1dpdGgoIi5qYXIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnksIGZpbGVuYW1lc1tqXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBJbmNsdWRpbmcgamFyIGZpbGUgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBVUkwgdXJsID0gZmlsZS50b1VSTCgpOworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZCh1cmwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgY2xhc3MgbG9hZGVyIGl0c2VsZgorICAgICAgICBVUkxbXSBhcnJheSA9IChVUkxbXSkgbGlzdC50b0FycmF5KG5ldyBVUkxbbGlzdC5zaXplKCldKTsKKyAgICAgICAgU3RhbmRhcmRDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7CisgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gbmV3IFN0YW5kYXJkQ2xhc3NMb2FkZXIoYXJyYXkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjbGFzc0xvYWRlciA9IG5ldyBTdGFuZGFyZENsYXNzTG9hZGVyKGFycmF5LCBwYXJlbnQpOworICAgICAgICByZXR1cm4gKGNsYXNzTG9hZGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgY2xhc3MgbG9hZGVyLCBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbgorICAgICAqIGRlZmF1bHRzIGFuZCB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBwYXRoczoKKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhdGlvbnMgQXJyYXkgb2Ygc3RyaW5ncyBjb250YWluaW5nIGNsYXNzIGRpcmVjdG9yaWVzLCBqYXIgZmlsZXMsCisgICAgICogIGphciBkaXJlY3RvcmllcyBvciBVUkxTIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSByZXBvc2l0b3JpZXMgb2YKKyAgICAgKiAgdGhlIGNsYXNzIGxvYWRlci4gVGhlIHR5cGUgaXMgZ2l2ZW4gYnkgdGhlIG1lbWJlciBvZiBwYXJhbSB0eXBlcy4KKyAgICAgKiBAcGFyYW0gdHlwZXMgQXJyYXkgb2YgdHlwZXMgZm9yIHRoZSBtZW1iZXJzIG9mIHBhcmFtIGxvY2F0aW9ucy4KKyAgICAgKiAgUG9zc2libGUgdmFsdWVzIGFyZSBJU19ESVIgKGNsYXNzIGRpcmVjdG9yeSksIElTX0pBUiAoc2luZ2xlIGphciBmaWxlKSwKKyAgICAgKiAgSVNfR0xPQiAoZGlyZWN0b3J5IG9mIGphciBmaWxlcykgYW5kIElTX1VSTCAoVVJMKS4KKyAgICAgKiBAcGFyYW0gcGFyZW50IFBhcmVudCBjbGFzcyBsb2FkZXIgZm9yIHRoZSBuZXcgY2xhc3MgbG9hZGVyLCBvcgorICAgICAqICA8Y29kZT5udWxsPC9jb2RlPiBmb3IgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgY29uc3RydWN0aW5nIHRoZSBjbGFzcyBsb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzTG9hZGVyIGNyZWF0ZUNsYXNzTG9hZGVyKFN0cmluZyBsb2NhdGlvbnNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgdHlwZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIHBhcmVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBuZXcgY2xhc3MgbG9hZGVyIik7CisKKyAgICAgICAgLy8gQ29uc3RydWN0IHRoZSAiY2xhc3MgcGF0aCIgZm9yIHRoaXMgY2xhc3MgbG9hZGVyCisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIGlmIChsb2NhdGlvbnMgIT0gbnVsbCAmJiB0eXBlcyAhPSBudWxsICYmIGxvY2F0aW9ucy5sZW5ndGggPT0gdHlwZXMubGVuZ3RoKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7IGkrKykgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBsb2NhdGlvbnNbaV07CisgICAgICAgICAgICAgICAgaWYgKCB0eXBlc1tpXSA9PSBJU19VUkwgKSB7CisgICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIEluY2x1ZGluZyBVUkwgIiArIHVybCk7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHVybCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggdHlwZXNbaV0gPT0gSVNfRElSICkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gbmV3IEZpbGUoZGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZGlyZWN0b3J5LmV4aXN0cygpIHx8ICFkaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIWRpcmVjdG9yeS5jYW5SZWFkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBkaXJlY3RvcnkudG9VUkwoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIEluY2x1ZGluZyBkaXJlY3RvcnkgIiArIHVybCk7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHVybCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggdHlwZXNbaV0gPT0gSVNfSkFSICkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGU9bmV3IEZpbGUobG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoZmlsZS5nZXRDYW5vbmljYWxQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkgfHwgIWZpbGUuY2FuUmVhZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBmaWxlLnRvVVJMKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBJbmNsdWRpbmcgamFyIGZpbGUgIiArIHVybCk7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHVybCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggdHlwZXNbaV0gPT0gSVNfR0xPQiApIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBkaXJlY3Rvcnk9bmV3IEZpbGUobG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICBpZiAoIWRpcmVjdG9yeS5leGlzdHMoKSB8fCAhZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICFkaXJlY3RvcnkuY2FuUmVhZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBJbmNsdWRpbmcgZGlyZWN0b3J5IGdsb2IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lc1tdID0gZGlyZWN0b3J5Lmxpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmaWxlbmFtZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGZpbGVuYW1lc1tqXS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlbmFtZS5lbmRzV2l0aCgiLmphciIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyZWN0b3J5LCBmaWxlbmFtZXNbal0pOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSB8fCAhZmlsZS5jYW5SZWFkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgSW5jbHVkaW5nIGdsb2IgamFyIGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IGZpbGUudG9VUkwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHVybCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGNsYXNzIGxvYWRlciBpdHNlbGYKKyAgICAgICAgVVJMW10gYXJyYXkgPSAoVVJMW10pIGxpc3QudG9BcnJheShuZXcgVVJMW2xpc3Quc2l6ZSgpXSk7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgbG9jYXRpb24gIiArIGkgKyAiIGlzICIgKyBhcnJheVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIFN0YW5kYXJkQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOworICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCisgICAgICAgICAgICBjbGFzc0xvYWRlciA9IG5ldyBTdGFuZGFyZENsYXNzTG9hZGVyKGFycmF5KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBuZXcgU3RhbmRhcmRDbGFzc0xvYWRlcihhcnJheSwgcGFyZW50KTsKKyAgICAgICAgcmV0dXJuIChjbGFzc0xvYWRlcik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ2x1c3RlclJ1bGVTZXRGYWN0b3J5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9DbHVzdGVyUnVsZVNldEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTM0N2QzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ2x1c3RlclJ1bGVTZXRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLkRpZ2VzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuUnVsZVNldEJhc2U7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK3B1YmxpYyBjbGFzcyBDbHVzdGVyUnVsZVNldEZhY3RvcnkgeworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsdXN0ZXJSdWxlU2V0RmFjdG9yeS5jbGFzcyk7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBSdWxlU2V0QmFzZSBnZXRDbHVzdGVyUnVsZVNldChTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIAorICAgICAgICAvL09MRCBDTFVTVEVSIDEKKyAgICAgICAgLy9maXJzdCB0cnkgdGhlIHNhbWUgY2xhc3Nsb2FkZXIgYXMgdGhpcyBjbGFzcyBzZXJ2ZXIvbGliCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbG9hZFJ1bGVTZXQocHJlZml4LCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclJ1bGVTZXQiLENsdXN0ZXJSdWxlU2V0RmFjdG9yeS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgLy9kaXNwbGF5IHdhcm5pbmcKKyAgICAgICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKSBsb2cuZGVidWcoIlVuYWJsZSB0byBsb2FkIENsdXN0ZXJSdWxlU2V0IChvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclJ1bGVTZXQpLCBmYWxsaW5nIGJhY2sgb24gY29udGV4dCBjbGFzc2xvYWRlciIpOworICAgICAgICB9CisgICAgICAgIC8vdHJ5IHRvIGxvYWQgaXQgZnJvbSB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBsb2FkUnVsZVNldChwcmVmaXgsIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyUnVsZVNldCIsVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIC8vZGlzcGxheSB3YXJuaW5nCisgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgbG9nLmRlYnVnKCJVbmFibGUgdG8gbG9hZCBDbHVzdGVyUnVsZVNldCAob3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJSdWxlU2V0KSwgd2lsbCB0cnkgdG8gbG9hZCB0aGUgSEEgY2x1c3RlciIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvL05FVyBDTFVTVEVSIDIKKyAgICAgICAgLy9maXJzdCB0cnkgdGhlIHNhbWUgY2xhc3Nsb2FkZXIgYXMgdGhpcyBjbGFzcyBzZXJ2ZXIvbGliCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbG9hZFJ1bGVTZXQocHJlZml4LCJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJSdWxlU2V0IixDbHVzdGVyUnVsZVNldEZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIC8vZGlzcGxheSB3YXJuaW5nCisgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgbG9nLmRlYnVnKCJVbmFibGUgdG8gbG9hZCBIQSBDbHVzdGVyUnVsZVNldCAob3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyUnVsZVNldCksIGZhbGxpbmcgYmFjayBvbiBjb250ZXh0IGNsYXNzbG9hZGVyIik7CisgICAgICAgIH0KKyAgICAgICAgLy90cnkgdG8gbG9hZCBpdCBmcm9tIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlcgorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGxvYWRSdWxlU2V0KHByZWZpeCwib3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyUnVsZVNldCIsVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIC8vZGlzcGxheSB3YXJuaW5nCisgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgbG9nLmRlYnVnKCJVbmFibGUgdG8gbG9hZCBIQSBDbHVzdGVyUnVsZVNldCAob3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyUnVsZVNldCksIGZhbGxpbmcgYmFjayBvbiBEZWZhdWx0Q2x1c3RlclJ1bGVTZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvZy5pbmZvKCJVbmFibGUgdG8gZmluZCBhIGNsdXN0ZXIgcnVsZSBzZXQgaW4gdGhlIGNsYXNzcGF0aC4gV2lsbCBsb2FkIHRoZSBkZWZhdWx0IHJ1bGUgc2V0LiIpOworICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRDbHVzdGVyUnVsZVNldChwcmVmaXgpOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFJ1bGVTZXRCYXNlIGxvYWRSdWxlU2V0KFN0cmluZyBwcmVmaXgsIFN0cmluZyBjbGFzc05hbWUsIENsYXNzTG9hZGVyIGNsKSAKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIAorICAgICAgICAgICAgICAgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCisgICAgICAgICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSx0cnVlLGNsKTsKKyAgICAgICAgQ29uc3RydWN0b3IgY29ucyA9IGNsYXp6LmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3N9KTsKKyAgICAgICAgcmV0dXJuIChSdWxlU2V0QmFzZSljb25zLm5ld0luc3RhbmNlKG5ldyBTdHJpbmdbXSB7cHJlZml4fSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIDxwPjxzdHJvbmc+UnVsZVNldDwvc3Ryb25nPiBmb3IgcHJvY2Vzc2luZyB0aGUgY29udGVudHMgb2YgYQorICAgICAqIENsdXN0ZXIgZGVmaW5pdGlvbiBlbGVtZW50LiAgPC9wPgorICAgICAqCisgICAgICogQGF1dGhvciBGaWxpcCBIYW5paworICAgICAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAgICAgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0Q2x1c3RlclJ1bGVTZXQgZXh0ZW5kcyBSdWxlU2V0QmFzZSB7CisKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXggdG8gdXNlIGZvciByZWNvZ25pemluZyBvdXIgZWxlbWVudHMuCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCA9IG51bGw7CisKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5SdWxlU2V0PC9jb2RlPiB3aXRoIHRoZSBkZWZhdWx0CisgICAgICAgICAqIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIERlZmF1bHRDbHVzdGVyUnVsZVNldCgpIHsKKworICAgICAgICAgICAgdGhpcygiIik7CisKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAgICAgKiBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHByZWZpeCBQcmVmaXggZm9yIG1hdGNoaW5nIHBhdHRlcm4gcnVsZXMgKGluY2x1ZGluZyB0aGUKKyAgICAgICAgICogIHRyYWlsaW5nIHNsYXNoIGNoYXJhY3RlcikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEZWZhdWx0Q2x1c3RlclJ1bGVTZXQoU3RyaW5nIHByZWZpeCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworICAgICAgICB9CisKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5BZGQgdGhlIHNldCBvZiBSdWxlIGluc3RhbmNlcyBkZWZpbmVkIGluIHRoaXMgUnVsZVNldCB0byB0aGUKKyAgICAgICAgICogc3BlY2lmaWVkIDxjb2RlPkRpZ2VzdGVyPC9jb2RlPiBpbnN0YW5jZSwgYXNzb2NpYXRpbmcgdGhlbSB3aXRoCisgICAgICAgICAqIG91ciBuYW1lc3BhY2UgVVJJIChpZiBhbnkpLiAgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkCisgICAgICAgICAqIGJ5IGEgRGlnZXN0ZXIgaW5zdGFuY2UuPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGlnZXN0ZXIgRGlnZXN0ZXIgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG5ldyBSdWxlIGluc3RhbmNlcworICAgICAgICAgKiAgc2hvdWxkIGJlIGFkZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkUnVsZUluc3RhbmNlcyhEaWdlc3RlciBkaWdlc3RlcikgeworICAgICAgICAgICAgLy9DbHVzdGVyIGNvbmZpZ3VyYXRpb24gc3RhcnQKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiTWVtYmVyc2hpcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJNZW1iZXJzaGlwIik7CisgICAgICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJNZW1iZXJzaGlwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldE1lbWJlcnNoaXBTZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXJzaGlwU2VydmljZSIpOworCisgICAgICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIlNlbmRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJTZW5kZXIiKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIlNlbmRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRDbHVzdGVyU2VuZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyU2VuZGVyIik7CisKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiUmVjZWl2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiUmVjZWl2ZXIiKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIlJlY2VpdmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldENsdXN0ZXJSZWNlaXZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclJlY2VpdmVyIik7CisKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiVmFsdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiVmFsdmUiKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIlZhbHZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFZhbHZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmUiKTsKKworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJEZXBsb3llciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJEZXBsb3llciIpOworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiRGVwbG95ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0Q2x1c3RlckRlcGxveWVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyRGVwbG95ZXIiKTsKKworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkxpc3RlbmVyIik7CisgICAgICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRMaWZlY3ljbGVMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyIik7CisKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiQ2x1c3Rlckxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiQ2x1c3Rlckxpc3RlbmVyIik7CisgICAgICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJDbHVzdGVyTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkQ2x1c3Rlckxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZXNzYWdlTGlzdGVuZXIiKTsKKyAgICAgICAgICAgIC8vQ2x1c3RlciBjb25maWd1cmF0aW9uIGVuZAorICAgICAgICB9CisKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0Nvbm5lY3RvckNyZWF0ZVJ1bGUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0Nvbm5lY3RvckNyZWF0ZVJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDhiM2RkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ29ubmVjdG9yQ3JlYXRlUnVsZS5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuUnVsZTsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworCisKKy8qKgorICogUnVsZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGNyZWF0ZXMgYSBjb25uZWN0b3IuCisgKi8KKworcHVibGljIGNsYXNzIENvbm5lY3RvckNyZWF0ZVJ1bGUgZXh0ZW5kcyBSdWxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGJlZ2lubmluZyBvZiB0aGlzIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlIGxpc3Qgb2YgdGhpcyBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgYmVnaW4oQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZGlnZXN0ZXIucHVzaChuZXcgQ29ubmVjdG9yKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInByb3RvY29sIikpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGVuZCBvZiB0aGlzIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCB0b3AgPSBkaWdlc3Rlci5wb3AoKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ29uc3RhbnRzLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDI1NjY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKKworLyoqCisgKiBTdHJpbmcgY29uc3RhbnRzIGZvciB0aGUgc3RhcnR1cCBwYWNrYWdlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBKZWFuLUZyYW5jb2lzIEFyY2FuZAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhY2thZ2UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFwcGxpY2F0aW9uQ29udGV4dFhtbCA9ICJNRVRBLUlORi9jb250ZXh0LnhtbCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQXBwbGljYXRpb25XZWJYbWwgPSAiL1dFQi1JTkYvd2ViLnhtbCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRGVmYXVsdENvbnRleHRYbWwgPSAiY29uZi9jb250ZXh0LnhtbCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRGVmYXVsdFdlYlhtbCA9ICJjb25mL3dlYi54bWwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhvc3RDb250ZXh0WG1sID0gImNvbnRleHQueG1sLmRlZmF1bHQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhvc3RXZWJYbWwgPSAid2ViLnhtbC5kZWZhdWx0IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRsZER0ZFB1YmxpY0lkXzExID0KKyAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKU1AgVGFnIExpYnJhcnkgMS4xLy9FTiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVGxkRHRkUmVzb3VyY2VQYXRoXzExID0KKyAgICAgICAgIi9qYXZheC9zZXJ2bGV0L2pzcC9yZXNvdXJjZXMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8xLmR0ZCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUbGREdGRQdWJsaWNJZF8xMiA9CisgICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMi8vRU4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRsZER0ZFJlc291cmNlUGF0aF8xMiA9CisgICAgICAgICIvamF2YXgvc2VydmxldC9qc3AvcmVzb3VyY2VzL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVGxkU2NoZW1hUHVibGljSWRfMjAgPQorICAgICAgICAid2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZCI7OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRsZFNjaGVtYVJlc291cmNlUGF0aF8yMCA9CisgICAgICAgICIvamF2YXgvc2VydmxldC9yZXNvdXJjZXMvd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXZWJEdGRQdWJsaWNJZF8yMiA9CisgICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMi8vRU4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdlYkR0ZFJlc291cmNlUGF0aF8yMiA9CisgICAgICAgICIvamF2YXgvc2VydmxldC9yZXNvdXJjZXMvd2ViLWFwcF8yXzIuZHRkIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdlYkR0ZFB1YmxpY0lkXzIzID0KKyAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV2ViRHRkUmVzb3VyY2VQYXRoXzIzID0KKyAgICAgICAgIi9qYXZheC9zZXJ2bGV0L3Jlc291cmNlcy93ZWItYXBwXzJfMy5kdGQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV2ViU2NoZW1hUHVibGljSWRfMjQgPQorICAgICAgICAid2ViLWFwcF8yXzQueHNkIjs7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV2ViU2NoZW1hUmVzb3VyY2VQYXRoXzI0ID0KKyAgICAgICAgIi9qYXZheC9zZXJ2bGV0L3Jlc291cmNlcy93ZWItYXBwXzJfNC54c2QiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSjJlZVNjaGVtYVB1YmxpY0lkXzE0ID0KKyAgICAgICAgImoyZWVfMV80LnhzZCI7OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEoyZWVTY2hlbWFSZXNvdXJjZVBhdGhfMTQgPQorICAgICAgICAiL2phdmF4L3NlcnZsZXQvcmVzb3VyY2VzL2oyZWVfMV80LnhzZCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXM2NTY2hlbWFQdWJsaWNJZF8xMCA9CisgICAgICAgICJ4bWwueHNkIjs7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVzNjU2NoZW1hUmVzb3VyY2VQYXRoXzEwID0KKyAgICAgICAgIi9qYXZheC9zZXJ2bGV0L3Jlc291cmNlcy94bWwueHNkIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpzcFNjaGVtYVB1YmxpY0lkXzIwID0KKyAgICAgICAgImpzcF8yXzAueHNkIjs7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSnNwU2NoZW1hUmVzb3VyY2VQYXRoXzIwID0KKyAgICAgICAgIi9qYXZheC9zZXJ2bGV0L3Jlc291cmNlcy9qc3BfMl8wLnhzZCI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSjJlZVdlYlNlcnZpY2VTY2hlbWFQdWJsaWNJZF8xMSA9CisgICAgICAgICAgICAiajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSjJlZVdlYlNlcnZpY2VTY2hlbWFSZXNvdXJjZVBhdGhfMTEgPQorICAgICAgICAgICAgIi9qYXZheC9zZXJ2bGV0L3Jlc291cmNlcy9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKMmVlV2ViU2VydmljZUNsaWVudFNjaGVtYVB1YmxpY0lkXzExID0KKyAgICAgICAgICAgICJqMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSjJlZVdlYlNlcnZpY2VDbGllbnRTY2hlbWFSZXNvdXJjZVBhdGhfMTEgPQorICAgICAgICAgICAgIi9qYXZheC9zZXJ2bGV0L3Jlc291cmNlcy9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZCI7CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0NvbnRleHRDb25maWcuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0NvbnRleHRDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGNkNDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ29udGV4dENvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTM1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5BdXRoZW50aWNhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlBpcGVsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5XcmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5Db250YWluZXJCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuRXJyb3JQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkZpbHRlckRlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5GaWx0ZXJNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTG9naW5Db25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuU2VjdXJpdHlDb25zdHJhaW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuRGlnZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5SdWxlU2V0OworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKKworLyoqCisgKiBTdGFydHVwIGV2ZW50IGxpc3RlbmVyIGZvciBhIDxiPkNvbnRleHQ8L2I+IHRoYXQgY29uZmlndXJlcyB0aGUgcHJvcGVydGllcworICogb2YgdGhhdCBDb250ZXh0LCBhbmQgdGhlIGFzc29jaWF0ZWQgZGVmaW5lZCBzZXJ2bGV0cy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgSmVhbi1GcmFuY29pcyBBcmNhbmQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbnRleHRDb25maWcKKyAgICBpbXBsZW1lbnRzIExpZmVjeWNsZUxpc3RlbmVyIHsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIENvbnRleHRDb25maWcuY2xhc3MgKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKgorICAgICAqIEN1c3RvbSBtYXBwaW5ncyBvZiBsb2dpbiBtZXRob2RzIHRvIGF1dGhlbnRpY2F0b3JzCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hcCBjdXN0b21BdXRoZW50aWNhdG9yczsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBBdXRoZW50aWNhdG9ycyB0aGF0IHdlIGtub3cgaG93IHRvIGNvbmZpZ3VyZS4gIFRoZSBrZXkgaXMKKyAgICAgKiB0aGUgbmFtZSBvZiB0aGUgaW1wbGVtZW50ZWQgYXV0aGVudGljYXRpb24gbWV0aG9kLCBhbmQgdGhlIHZhbHVlIGlzCisgICAgICogdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgVmFsdmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBQcm9wZXJ0aWVzIGF1dGhlbnRpY2F0b3JzID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRleHQgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgd2ViIGFwcGxpY2F0aW9uJ3MgY29udGV4dCBmaWxlIGxvY2F0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENvbnRleHRYbWwgPSBudWxsOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHdlYiBhcHBsaWNhdGlvbidzIGRlcGxveW1lbnQgZGVzY3JpcHRvciBsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRXZWJYbWwgPSBudWxsOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRyYWNrIGFueSBmYXRhbCBlcnJvcnMgZHVyaW5nIHN0YXJ0dXAgY29uZmlndXJhdGlvbiBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIG9rID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEFueSBwYXJzZSBlcnJvciB3aGljaCBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIFhNTCBkZXNjcmlwdG9ycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU0FYUGFyc2VFeGNlcHRpb24gcGFyc2VFeGNlcHRpb24gPSBudWxsOworCisgICAgCisgICAgLyoqCisgICAgICogT3JpZ2luYWwgZG9jQmFzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG9yaWdpbmFsRG9jQmFzZSA9IG51bGw7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIHJlc291cmNlcyBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5EaWdlc3RlcjwvY29kZT4gd2Ugd2lsbCB1c2UgdG8gcHJvY2VzcyB3ZWIgYXBwbGljYXRpb24KKyAgICAgKiBjb250ZXh0IGZpbGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgRGlnZXN0ZXIgY29udGV4dERpZ2VzdGVyID0gbnVsbDsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IHdlIHdpbGwgdXNlIHRvIHByb2Nlc3Mgd2ViIGFwcGxpY2F0aW9uCisgICAgICogZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgRGlnZXN0ZXIgd2ViRGlnZXN0ZXIgPSBudWxsOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5SdWxlPC9jb2RlPiB1c2VkIHRvIHBhcnNlIHRoZSB3ZWIueG1sCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBXZWJSdWxlU2V0IHdlYlJ1bGVTZXQgPSBuZXcgV2ViUnVsZVNldCgpOworCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIHZhbHVlIHVzZWQgdG8gdHVybiBvbi9vZmYgWE1MIHZhbGlkYXRpb24KKyAgICAgKi8KKyAgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHhtbFZhbGlkYXRpb24gPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIHZhbHVlIHVzZWQgdG8gdHVybiBvbi9vZmYgWE1MIG5hbWVzcGFjZSBhd2FyZW5lcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4geG1sTmFtZXNwYWNlQXdhcmUgPSBmYWxzZTsKKworICAgIAorICAgIC8qKgorICAgICAqIERlcGxveW1lbnQgY291bnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBsb25nIGRlcGxveW1lbnRDb3VudCA9IDBMOworICAgIAorICAgIAorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9naW5Db25maWcgRFVNTVlfTE9HSU5fQ09ORklHID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvZ2luQ29uZmlnKCJOT05FIiwgbnVsbCwgbnVsbCwgbnVsbCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBkZWZhdWx0IGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFdlYlhtbCgpIHsKKyAgICAgICAgaWYoIGRlZmF1bHRXZWJYbWwgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIGRlZmF1bHRXZWJYbWw9Q29uc3RhbnRzLkRlZmF1bHRXZWJYbWw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHRoaXMuZGVmYXVsdFdlYlhtbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9jYXRpb24gb2YgdGhlIGRlZmF1bHQgZGVwbG95bWVudCBkZXNjcmlwdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBBYnNvbHV0ZS9yZWxhdGl2ZSBwYXRoIHRvIHRoZSBkZWZhdWx0IHdlYi54bWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0V2ViWG1sKFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgdGhpcy5kZWZhdWx0V2ViWG1sID0gcGF0aDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgZGVmYXVsdCBjb250ZXh0IGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb250ZXh0WG1sKCkgeworICAgICAgICBpZiggZGVmYXVsdENvbnRleHRYbWwgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIGRlZmF1bHRDb250ZXh0WG1sPUNvbnN0YW50cy5EZWZhdWx0Q29udGV4dFhtbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAodGhpcy5kZWZhdWx0Q29udGV4dFhtbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9jYXRpb24gb2YgdGhlIGRlZmF1bHQgY29udGV4dCBmaWxlCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBBYnNvbHV0ZS9yZWxhdGl2ZSBwYXRoIHRvIHRoZSBkZWZhdWx0IGNvbnRleHQueG1sCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdENvbnRleHRYbWwoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICB0aGlzLmRlZmF1bHRDb250ZXh0WG1sID0gcGF0aDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyBjdXN0b20gbWFwcGluZ3Mgb2YgbG9naW4gbWV0aG9kcyB0byBhdXRoZW50aWNhdG9ycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdXN0b21BdXRoZW50aWNhdG9ycyBDdXN0b20gbWFwcGluZ3Mgb2YgbG9naW4gbWV0aG9kcyB0bworICAgICAqIGF1dGhlbnRpY2F0b3JzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tQXV0aGVudGljYXRvcnMoTWFwIGN1c3RvbUF1dGhlbnRpY2F0b3JzKSB7CisgICAgICAgIHRoaXMuY3VzdG9tQXV0aGVudGljYXRvcnMgPSBjdXN0b21BdXRoZW50aWNhdG9yczsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGV2ZW50cyBmb3IgYW4gYXNzb2NpYXRlZCBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBsaWZlY3ljbGUgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsaWZlY3ljbGVFdmVudChMaWZlY3ljbGVFdmVudCBldmVudCkgeworCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSBjb250ZXh0IHdlIGFyZSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnRleHQgPSAoQ29udGV4dCkgZXZlbnQuZ2V0TGlmZWN5Y2xlKCk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmNjZSIsIGV2ZW50LmdldExpZmVjeWNsZSgpKSwgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZXNzIHRoZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpLmVxdWFscyhMaWZlY3ljbGUuU1RBUlRfRVZFTlQpKSB7CisgICAgICAgICAgICBzdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldFR5cGUoKS5lcXVhbHMoU3RhbmRhcmRDb250ZXh0LkJFRk9SRV9TVEFSVF9FVkVOVCkpIHsKKyAgICAgICAgICAgIGJlZm9yZVN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0VHlwZSgpLmVxdWFscyhTdGFuZGFyZENvbnRleHQuQUZURVJfU1RBUlRfRVZFTlQpKSB7CisgICAgICAgICAgICAvLyBSZXN0b3JlIGRvY0Jhc2UgZm9yIG1hbmFnZW1lbnQgdG9vbHMKKyAgICAgICAgICAgIGlmIChvcmlnaW5hbERvY0Jhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBkb2NCYXNlID0gY29udGV4dC5nZXREb2NCYXNlKCk7CisgICAgICAgICAgICAgICAgY29udGV4dC5zZXREb2NCYXNlKG9yaWdpbmFsRG9jQmFzZSk7CisgICAgICAgICAgICAgICAgb3JpZ2luYWxEb2NCYXNlID0gZG9jQmFzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRUeXBlKCkuZXF1YWxzKExpZmVjeWNsZS5TVE9QX0VWRU5UKSkgeworICAgICAgICAgICAgaWYgKG9yaWdpbmFsRG9jQmFzZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRvY0Jhc2UgPSBjb250ZXh0LmdldERvY0Jhc2UoKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldERvY0Jhc2Uob3JpZ2luYWxEb2NCYXNlKTsKKyAgICAgICAgICAgICAgICBvcmlnaW5hbERvY0Jhc2UgPSBkb2NCYXNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RvcCgpOworICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldFR5cGUoKS5lcXVhbHMoTGlmZWN5Y2xlLklOSVRfRVZFTlQpKSB7CisgICAgICAgICAgICBpbml0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0VHlwZSgpLmVxdWFscyhMaWZlY3ljbGUuREVTVFJPWV9FVkVOVCkpIHsKKyAgICAgICAgICAgIGRlc3Ryb3koKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uIGZpbGUsIGlmIGl0IGV4aXN0cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBsaWNhdGlvbldlYkNvbmZpZygpIHsKKworICAgICAgICBTdHJpbmcgYWx0REROYW1lID0gbnVsbDsKKworICAgICAgICAvLyBPcGVuIHRoZSBhcHBsaWNhdGlvbiB3ZWIueG1sIGZpbGUsIGlmIGl0IGV4aXN0cworICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9IGNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICAgICAgaWYgKHNlcnZsZXRDb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFsdERETmFtZSA9IChTdHJpbmcpc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxzLkFMVF9ERF9BVFRSKTsKKyAgICAgICAgICAgIGlmIChhbHRERE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oYWx0REROYW1lKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmFsdERETm90Rm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdERETmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHN0cmVhbSA9IHNlcnZsZXRDb250ZXh0LmdldFJlc291cmNlQXNTdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgKENvbnN0YW50cy5BcHBsaWNhdGlvbldlYlhtbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uTWlzc2luZyIpICsgIiAiICsgY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGxvbmcgdDE9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgaWYgKHdlYkRpZ2VzdGVyID09IG51bGwpeworICAgICAgICAgICAgd2ViRGlnZXN0ZXIgPSBjcmVhdGVXZWJEaWdlc3RlcigpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBVUkwgdXJsPW51bGw7CisgICAgICAgIC8vIFByb2Nlc3MgdGhlIGFwcGxpY2F0aW9uIHdlYi54bWwgZmlsZQorICAgICAgICBzeW5jaHJvbml6ZWQgKHdlYkRpZ2VzdGVyKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChhbHRERE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB1cmwgPSBuZXcgRmlsZShhbHRERE5hbWUpLnRvVVJMKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdXJsID0gc2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQXBwbGljYXRpb25XZWJYbWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggdXJsIT1udWxsICkgeworICAgICAgICAgICAgICAgICAgICBJbnB1dFNvdXJjZSBpcyA9IG5ldyBJbnB1dFNvdXJjZSh1cmwudG9FeHRlcm5hbEZvcm0oKSk7CisgICAgICAgICAgICAgICAgICAgIGlzLnNldEJ5dGVTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoU3RhbmRhcmRDb250ZXh0KSBjb250ZXh0KS5zZXRSZXBsYWNlV2VsY29tZUZpbGVzKHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdlYkRpZ2VzdGVyLnB1c2goY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIHdlYkRpZ2VzdGVyLnNldEVycm9ySGFuZGxlcihuZXcgQ29udGV4dEVycm9ySGFuZGxlcigpKTsKKworICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYXJzaW5nIGFwcGxpY2F0aW9uIHdlYi54bWwgZmlsZSBhdCAiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgd2ViRGlnZXN0ZXIucGFyc2UoaXMpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIk5vIHdlYi54bWwsIHVzaW5nIGRlZmF1bHRzICIgKyBjb250ZXh0ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuYXBwbGljYXRpb25QYXJzZSIsIHVybC50b0V4dGVybmFsRm9ybSgpKSwgZSk7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy5hcHBsaWNhdGlvblBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiICsgZS5nZXRMaW5lTnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiArIGUuZ2V0Q29sdW1uTnVtYmVyKCkpKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uUGFyc2UiLCB1cmwudG9FeHRlcm5hbEZvcm0oKSksIGUpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHdlYkRpZ2VzdGVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgcGFyc2VFeGNlcHRpb24gPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuYXBwbGljYXRpb25DbG9zZSIpLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2ViUnVsZVNldC5yZWN5Y2xlKCk7CisKKyAgICAgICAgbG9uZyB0Mj1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQpIHsKKyAgICAgICAgICAgICgoU3RhbmRhcmRDb250ZXh0KSBjb250ZXh0KS5zZXRTdGFydHVwVGltZSh0Mi10MSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB1cCBhbiBBdXRoZW50aWNhdG9yIGF1dG9tYXRpY2FsbHkgaWYgcmVxdWlyZWQsIGFuZCBvbmUgaGFzIG5vdAorICAgICAqIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBhdXRoZW50aWNhdG9yQ29uZmlnKCkgeworCisgICAgICAgIC8vIERvZXMgdGhpcyBDb250ZXh0IHJlcXVpcmUgYW4gQXV0aGVudGljYXRvcj8KKyAgICAgICAgU2VjdXJpdHlDb25zdHJhaW50IGNvbnN0cmFpbnRzW10gPSBjb250ZXh0LmZpbmRDb25zdHJhaW50cygpOworICAgICAgICBpZiAoKGNvbnN0cmFpbnRzID09IG51bGwpIHx8IChjb25zdHJhaW50cy5sZW5ndGggPT0gMCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIExvZ2luQ29uZmlnIGxvZ2luQ29uZmlnID0gY29udGV4dC5nZXRMb2dpbkNvbmZpZygpOworICAgICAgICBpZiAobG9naW5Db25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9naW5Db25maWcgPSBEVU1NWV9MT0dJTl9DT05GSUc7CisgICAgICAgICAgICBjb250ZXh0LnNldExvZ2luQ29uZmlnKGxvZ2luQ29uZmlnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEhhcyBhbiBhdXRoZW50aWNhdG9yIGJlZW4gY29uZmlndXJlZCBhbHJlYWR5PworICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEF1dGhlbnRpY2F0b3IpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgQ29udGFpbmVyQmFzZSkgeworICAgICAgICAgICAgUGlwZWxpbmUgcGlwZWxpbmUgPSAoKENvbnRhaW5lckJhc2UpIGNvbnRleHQpLmdldFBpcGVsaW5lKCk7CisgICAgICAgICAgICBpZiAocGlwZWxpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFZhbHZlIGJhc2ljID0gcGlwZWxpbmUuZ2V0QmFzaWMoKTsKKyAgICAgICAgICAgICAgICBpZiAoKGJhc2ljICE9IG51bGwpICYmIChiYXNpYyBpbnN0YW5jZW9mIEF1dGhlbnRpY2F0b3IpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgVmFsdmUgdmFsdmVzW10gPSBwaXBlbGluZS5nZXRWYWx2ZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHZlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdmVzW2ldIGluc3RhbmNlb2YgQXV0aGVudGljYXRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm47ICAgICAvLyBDYW5ub3QgaW5zdGFsbCBhIFZhbHZlIGV2ZW4gaWYgaXQgd291bGQgYmUgbmVlZGVkCisgICAgICAgIH0KKworICAgICAgICAvLyBIYXMgYSBSZWFsbSBiZWVuIGNvbmZpZ3VyZWQgZm9yIHVzIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpbnN0PworICAgICAgICBpZiAoY29udGV4dC5nZXRSZWFsbSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcubWlzc2luZ1JlYWxtIikpOworICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIGN1c3RvbSBtYXBwaW5nIGZvciB0aGUgbG9naW4KKyAgICAgICAgICogbWV0aG9kLiBJZiBzbywgdXNlIGl0LiBPdGhlcndpc2UsIGNoZWNrIGlmIHRoZXJlIGlzIGEgbWFwcGluZyBpbgorICAgICAgICAgKiBvcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQXV0aGVudGljYXRvcnMucHJvcGVydGllcy4KKyAgICAgICAgICovCisgICAgICAgIFZhbHZlIGF1dGhlbnRpY2F0b3IgPSBudWxsOworICAgICAgICBpZiAoY3VzdG9tQXV0aGVudGljYXRvcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgYXV0aGVudGljYXRvciA9IChWYWx2ZSkKKyAgICAgICAgICAgICAgICBjdXN0b21BdXRoZW50aWNhdG9ycy5nZXQobG9naW5Db25maWcuZ2V0QXV0aE1ldGhvZCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXV0aGVudGljYXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBMb2FkIG91ciBtYXBwaW5nIHByb3BlcnRpZXMgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRvcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzPXRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlQXNTdHJlYW0oIm9yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9BdXRoZW50aWNhdG9ycy5wcm9wZXJ0aWVzIik7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpcyE9bnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0b3JzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0b3JzLmxvYWQoaXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRleHRDb25maWcuYXV0aGVudGljYXRvclJlc291cmNlcyIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rPWZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGV4dENvbmZpZy5hdXRoZW50aWNhdG9yUmVzb3VyY2VzIiksIGUpOworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgVmFsdmUgd2Ugc2hvdWxkIGNvbmZpZ3VyZQorICAgICAgICAgICAgU3RyaW5nIGF1dGhlbnRpY2F0b3JOYW1lID0gbnVsbDsKKyAgICAgICAgICAgIGF1dGhlbnRpY2F0b3JOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRvcnMuZ2V0UHJvcGVydHkobG9naW5Db25maWcuZ2V0QXV0aE1ldGhvZCgpKTsKKyAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdG9yTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy5hdXRoZW50aWNhdG9yTWlzc2luZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpbkNvbmZpZy5nZXRBdXRoTWV0aG9kKCkpKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW5zdGFudGlhdGUgYW5kIGluc3RhbGwgYW4gQXV0aGVudGljYXRvciBvZiB0aGUgcmVxdWVzdGVkIGNsYXNzCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzIGF1dGhlbnRpY2F0b3JDbGFzcyA9IENsYXNzLmZvck5hbWUoYXV0aGVudGljYXRvck5hbWUpOworICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0b3IgPSAoVmFsdmUpIGF1dGhlbnRpY2F0b3JDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRleHRDb25maWcuYXV0aGVudGljYXRvckluc3RhbnRpYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0b3JOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdCk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdXRoZW50aWNhdG9yICE9IG51bGwgJiYgY29udGV4dCBpbnN0YW5jZW9mIENvbnRhaW5lckJhc2UpIHsKKyAgICAgICAgICAgIFBpcGVsaW5lIHBpcGVsaW5lID0gKChDb250YWluZXJCYXNlKSBjb250ZXh0KS5nZXRQaXBlbGluZSgpOworICAgICAgICAgICAgaWYgKHBpcGVsaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAoKENvbnRhaW5lckJhc2UpIGNvbnRleHQpLmFkZFZhbHZlKGF1dGhlbnRpY2F0b3IpOworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRleHRDb25maWcuYXV0aGVudGljYXRvckNvbmZpZ3VyZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naW5Db25maWcuZ2V0QXV0aE1ldGhvZCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSAoaWYgbmVjZXNzYXJ5KSBhbmQgcmV0dXJuIGEgRGlnZXN0ZXIgY29uZmlndXJlZCB0byBwcm9jZXNzIHRoZQorICAgICAqIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKHdlYi54bWwpLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgRGlnZXN0ZXIgY3JlYXRlV2ViRGlnZXN0ZXIoKSB7CisgICAgICAgIERpZ2VzdGVyIHdlYkRpZ2VzdGVyID0KKyAgICAgICAgICAgIGNyZWF0ZVdlYlhtbERpZ2VzdGVyKHhtbE5hbWVzcGFjZUF3YXJlLCB4bWxWYWxpZGF0aW9uKTsKKyAgICAgICAgcmV0dXJuIHdlYkRpZ2VzdGVyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIChpZiBuZWNlc3NhcnkpIGFuZCByZXR1cm4gYSBEaWdlc3RlciBjb25maWd1cmVkIHRvIHByb2Nlc3MgdGhlCisgICAgICogd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciAod2ViLnhtbCkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEaWdlc3RlciBjcmVhdGVXZWJYbWxEaWdlc3Rlcihib29sZWFuIG5hbWVzcGFjZUF3YXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB2YWxpZGF0aW9uKSB7CisgICAgICAgIAorICAgICAgICBEaWdlc3RlciB3ZWJEaWdlc3RlciA9ICBEaWdlc3RlckZhY3RvcnkubmV3RGlnZXN0ZXIoeG1sVmFsaWRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5hbWVzcGFjZUF3YXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViUnVsZVNldCk7CisgICAgICAgIHJldHVybiB3ZWJEaWdlc3RlcjsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgKGlmIG5lY2Vzc2FyeSkgYW5kIHJldHVybiBhIERpZ2VzdGVyIGNvbmZpZ3VyZWQgdG8gcHJvY2VzcyB0aGUKKyAgICAgKiBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciBmb3IgYW4gYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIERpZ2VzdGVyIGNyZWF0ZUNvbnRleHREaWdlc3RlcigpIHsKKyAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBuZXcgRGlnZXN0ZXIoKTsKKyAgICAgICAgZGlnZXN0ZXIuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisgICAgICAgIFJ1bGVTZXQgY29udGV4dFJ1bGVTZXQgPSBuZXcgQ29udGV4dFJ1bGVTZXQoIiIsIGZhbHNlKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZVNldChjb250ZXh0UnVsZVNldCk7CisgICAgICAgIFJ1bGVTZXQgbmFtaW5nUnVsZVNldCA9IG5ldyBOYW1pbmdSdWxlU2V0KCJDb250ZXh0LyIpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlU2V0KG5hbWluZ1J1bGVTZXQpOworICAgICAgICByZXR1cm4gZGlnZXN0ZXI7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VEaXIoKSB7CisgICAgICAgIENvbnRhaW5lciBlbmdpbmVDPWNvbnRleHQuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7CisgICAgICAgIGlmKCBlbmdpbmVDIGluc3RhbmNlb2YgU3RhbmRhcmRFbmdpbmUgKSB7CisgICAgICAgICAgICByZXR1cm4gKChTdGFuZGFyZEVuZ2luZSllbmdpbmVDKS5nZXRCYXNlRGlyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlLCBpZiBpdCBleGlzdHMuCisgICAgICogVGhlIGRlZmF1bHQgY29uZmlnIG11c3QgYmUgcmVhZCB3aXRoIHRoZSBjb250YWluZXIgbG9hZGVyIC0gc28KKyAgICAgKiBjb250YWluZXIgc2VydmxldHMgY2FuIGJlIGxvYWRlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlZmF1bHRXZWJDb25maWcoKSB7CisgICAgICAgIGxvbmcgdDE9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgLy8gT3BlbiB0aGUgZGVmYXVsdCB3ZWIueG1sIGZpbGUsIGlmIGl0IGV4aXN0cworICAgICAgICBpZiggZGVmYXVsdFdlYlhtbD09bnVsbCAmJiBjb250ZXh0IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0ICkgeworICAgICAgICAgICAgZGVmYXVsdFdlYlhtbD0oKFN0YW5kYXJkQ29udGV4dCljb250ZXh0KS5nZXREZWZhdWx0V2ViWG1sKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2V0IHRoZSBkZWZhdWx0IGlmIHdlIGRvbid0IGhhdmUgYW55IG92ZXJyaWRlcworICAgICAgICBpZiggZGVmYXVsdFdlYlhtbD09bnVsbCApIGdldERlZmF1bHRXZWJYbWwoKTsKKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh0aGlzLmRlZmF1bHRXZWJYbWwpOworICAgICAgICBpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoZ2V0QmFzZURpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFdlYlhtbCk7CisgICAgICAgIH0KKworICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoICEgZmlsZS5leGlzdHMoKSApIHsKKyAgICAgICAgICAgICAgICAvLyBVc2UgZ2V0UmVzb3VyY2UgYW5kIGdldFJlc291cmNlQXNTdHJlYW0KKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlQXNTdHJlYW0oZGVmYXVsdFdlYlhtbCk7CisgICAgICAgICAgICAgICAgaWYoIHN0cmVhbSAhPSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlKGRlZmF1bHRXZWJYbWwpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgaWYoIHN0cmVhbT09IG51bGwgKSB7IAorICAgICAgICAgICAgICAgICAgICAvLyBtYXliZSBlbWJlZGRlZAorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ3ZWItZW1iZWQueG1sIik7CisgICAgICAgICAgICAgICAgICAgIGlmKCBzdHJlYW0gIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2UoIndlYi1lbWJlZC54bWwiKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmKCBzdHJlYW09PSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiTm8gZGVmYXVsdCB3ZWIueG1sIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzb3VyY2UgPQorICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTb3VyY2UoImZpbGU6Ly8iICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuZGVmYXVsdE1pc3NpbmciKSAKKyAgICAgICAgICAgICAgICAgICAgICArICIgIiArIGRlZmF1bHRXZWJYbWwgKyAiICIgKyBmaWxlICwgZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2ViRGlnZXN0ZXIgPT0gbnVsbCl7CisgICAgICAgICAgICB3ZWJEaWdlc3RlciA9IGNyZWF0ZVdlYkRpZ2VzdGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgcHJvY2Vzc0RlZmF1bHRXZWJDb25maWcod2ViRGlnZXN0ZXIsIHN0cmVhbSwgc291cmNlKTsKKyAgICAgICAgICAgIHdlYlJ1bGVTZXQucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyB0Mj1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgaWYoICh0Mi10MSkgPiAyMDAgKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9jZXNzZWQgZGVmYXVsdCB3ZWIueG1sICIgKyBmaWxlICsgIiAiICArICggdDItdDEpKTsKKworICAgICAgICBzdHJlYW0gPSBudWxsOworICAgICAgICBzb3VyY2UgPSBudWxsOworCisgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUgPSBnZXRIb3N0Q29uZmlnUGF0aChDb25zdGFudHMuSG9zdFdlYlhtbCk7CisgICAgICAgIGZpbGUgPSBuZXcgRmlsZShnZXRDb25maWdCYXNlKCksIHJlc291cmNlTmFtZSk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCAhIGZpbGUuZXhpc3RzKCkgKSB7CisgICAgICAgICAgICAgICAgLy8gVXNlIGdldFJlc291cmNlIGFuZCBnZXRSZXNvdXJjZUFzU3RyZWFtCisgICAgICAgICAgICAgICAgc3RyZWFtID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpCisgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYoIHN0cmVhbSAhPSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlKHJlc291cmNlTmFtZSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzb3VyY2UgPQorICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTb3VyY2UoImZpbGU6Ly8iICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuZGVmYXVsdE1pc3NpbmciKSAKKyAgICAgICAgICAgICAgICAgICAgICArICIgIiArIHJlc291cmNlTmFtZSArICIgIiArIGZpbGUgLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgcHJvY2Vzc0RlZmF1bHRXZWJDb25maWcod2ViRGlnZXN0ZXIsIHN0cmVhbSwgc291cmNlKTsKKyAgICAgICAgICAgIHdlYlJ1bGVTZXQucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBkZWZhdWx0IHdlYi54bWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RlZmF1bHRXZWJDb25maWcoRGlnZXN0ZXIgZGlnZXN0ZXIsIElucHV0U3RyZWFtIHN0cmVhbSwgCisgICAgICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UpIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlByb2Nlc3NpbmcgY29udGV4dCBbIiArIGNvbnRleHQuZ2V0TmFtZSgpIAorICAgICAgICAgICAgICAgICAgICArICJdIHdlYiBjb25maWd1cmF0aW9uIHJlc291cmNlICIgKyBzb3VyY2UuZ2V0U3lzdGVtSWQoKSk7CisKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgZGVmYXVsdCB3ZWIueG1sIGZpbGUKKyAgICAgICAgc3luY2hyb25pemVkIChkaWdlc3RlcikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzb3VyY2Uuc2V0Qnl0ZVN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAoKFN0YW5kYXJkQ29udGV4dCkgY29udGV4dCkuc2V0UmVwbGFjZVdlbGNvbWVGaWxlcyh0cnVlKTsKKyAgICAgICAgICAgICAgICBkaWdlc3Rlci5zZXRDbGFzc0xvYWRlcih0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgZGlnZXN0ZXIuc2V0VXNlQ29udGV4dENsYXNzTG9hZGVyKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBkaWdlc3Rlci5wdXNoKGNvbnRleHQpOworICAgICAgICAgICAgICAgIGRpZ2VzdGVyLnNldEVycm9ySGFuZGxlcihuZXcgQ29udGV4dEVycm9ySGFuZGxlcigpKTsKKyAgICAgICAgICAgICAgICBkaWdlc3Rlci5wYXJzZShzb3VyY2UpOworICAgICAgICAgICAgICAgIGlmIChwYXJzZUV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuZGVmYXVsdFBhcnNlIiksIGUpOworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuZGVmYXVsdFBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiICsgZS5nZXRMaW5lTnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiArIGUuZ2V0Q29sdW1uTnVtYmVyKCkpKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmRlZmF1bHRQYXJzZSIpLCBlKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBkaWdlc3Rlci5yZXNldCgpOworICAgICAgICAgICAgICAgIHBhcnNlRXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmRlZmF1bHRDbG9zZSIpLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlLCBpZiBpdCBleGlzdHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY29udGV4dENvbmZpZygpIHsKKyAgICAgICAgCisgICAgICAgIC8vIE9wZW4gdGhlIGRlZmF1bHQgd2ViLnhtbCBmaWxlLCBpZiBpdCBleGlzdHMKKyAgICAgICAgaWYoIGRlZmF1bHRDb250ZXh0WG1sPT1udWxsICYmIGNvbnRleHQgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQgKSB7CisgICAgICAgICAgICBkZWZhdWx0Q29udGV4dFhtbCA9ICgoU3RhbmRhcmRDb250ZXh0KWNvbnRleHQpLmdldERlZmF1bHRDb250ZXh0WG1sKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2V0IHRoZSBkZWZhdWx0IGlmIHdlIGRvbid0IGhhdmUgYW55IG92ZXJyaWRlcworICAgICAgICBpZiggZGVmYXVsdENvbnRleHRYbWw9PW51bGwgKSBnZXREZWZhdWx0Q29udGV4dFhtbCgpOworCisgICAgICAgIGlmICghY29udGV4dC5nZXRPdmVycmlkZSgpKSB7CisgICAgICAgICAgICBwcm9jZXNzQ29udGV4dENvbmZpZyhuZXcgRmlsZShnZXRCYXNlRGlyKCkpLCBkZWZhdWx0Q29udGV4dFhtbCk7CisgICAgICAgICAgICBwcm9jZXNzQ29udGV4dENvbmZpZyhnZXRDb25maWdCYXNlKCksIGdldEhvc3RDb25maWdQYXRoKENvbnN0YW50cy5Ib3N0Q29udGV4dFhtbCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjb250ZXh0LmdldENvbmZpZ0ZpbGUoKSAhPSBudWxsKQorICAgICAgICAgICAgcHJvY2Vzc0NvbnRleHRDb25maWcobmV3IEZpbGUoY29udGV4dC5nZXRDb25maWdGaWxlKCkpLCBudWxsKTsKKyAgICAgICAgCisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIGNvbnRleHQueG1sLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NDb250ZXh0Q29uZmlnKEZpbGUgYmFzZURpciwgU3RyaW5nIHJlc291cmNlTmFtZSkgeworICAgICAgICAKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9jZXNzaW5nIGNvbnRleHQgWyIgKyBjb250ZXh0LmdldE5hbWUoKSAKKyAgICAgICAgICAgICAgICAgICAgKyAiXSBjb25maWd1cmF0aW9uIGZpbGUgIiArIGJhc2VEaXIgKyAiICIgKyByZXNvdXJjZU5hbWUpOworCisgICAgICAgIElucHV0U291cmNlIHNvdXJjZSA9IG51bGw7CisgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisKKyAgICAgICAgRmlsZSBmaWxlID0gYmFzZURpcjsKKyAgICAgICAgaWYgKHJlc291cmNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoYmFzZURpciwgcmVzb3VyY2VOYW1lKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICggIWZpbGUuZXhpc3RzKCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBnZXRSZXNvdXJjZSBhbmQgZ2V0UmVzb3VyY2VBc1N0cmVhbQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBzdHJlYW0gIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2UocmVzb3VyY2VOYW1lKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc291cmNlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U291cmNlKCJmaWxlOi8vIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICAgICAgLy8gQWRkIGFzIHdhdGNoZWQgcmVzb3VyY2Ugc28gdGhhdCBjYXNjYWRlIHJlbG9hZCBvY2N1cnMgaWYgYSBkZWZhdWx0CisgICAgICAgICAgICAgICAgLy8gY29uZmlnIGZpbGUgaXMgbW9kaWZpZWQvYWRkZWQvcmVtb3ZlZAorICAgICAgICAgICAgICAgIGNvbnRleHQuYWRkV2F0Y2hlZFJlc291cmNlKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy5jb250ZXh0TWlzc2luZyIsCisgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VOYW1lICsgIiAiICsgZmlsZSksIGUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoc291cmNlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChjb250ZXh0RGlnZXN0ZXIgPT0gbnVsbCl7CisgICAgICAgICAgICBjb250ZXh0RGlnZXN0ZXIgPSBjcmVhdGVDb250ZXh0RGlnZXN0ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKGNvbnRleHREaWdlc3RlcikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzb3VyY2Uuc2V0Qnl0ZVN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgICAgIGNvbnRleHREaWdlc3Rlci5zZXRDbGFzc0xvYWRlcih0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgY29udGV4dERpZ2VzdGVyLnNldFVzZUNvbnRleHRDbGFzc0xvYWRlcihmYWxzZSk7CisgICAgICAgICAgICAgICAgY29udGV4dERpZ2VzdGVyLnB1c2goY29udGV4dC5nZXRQYXJlbnQoKSk7CisgICAgICAgICAgICAgICAgY29udGV4dERpZ2VzdGVyLnB1c2goY29udGV4dCk7CisgICAgICAgICAgICAgICAgY29udGV4dERpZ2VzdGVyLnNldEVycm9ySGFuZGxlcihuZXcgQ29udGV4dEVycm9ySGFuZGxlcigpKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0RGlnZXN0ZXIucGFyc2Uoc291cmNlKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VFeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBjb250ZXh0IFsiICsgY29udGV4dC5nZXROYW1lKCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBjb25maWd1cmF0aW9uIGZpbGUgIiArIGJhc2VEaXIgKyAiICIgKyByZXNvdXJjZU5hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuY29udGV4dFBhcnNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TmFtZSgpKSwgZSk7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy5kZWZhdWx0UG9zaXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIgKyBlLmdldExpbmVOdW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiICsgZS5nZXRDb2x1bW5OdW1iZXIoKSkpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuY29udGV4dFBhcnNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TmFtZSgpKSwgZSk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY29udGV4dERpZ2VzdGVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgcGFyc2VFeGNlcHRpb24gPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuY29udGV4dENsb3NlIiksIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIEFkanVzdCBkb2NCYXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZpeERvY0Jhc2UoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpIGNvbnRleHQuZ2V0UGFyZW50KCk7CisgICAgICAgIFN0cmluZyBhcHBCYXNlID0gaG9zdC5nZXRBcHBCYXNlKCk7CisKKyAgICAgICAgYm9vbGVhbiB1bnBhY2tXQVJzID0gdHJ1ZTsKKyAgICAgICAgaWYgKGhvc3QgaW5zdGFuY2VvZiBTdGFuZGFyZEhvc3QpIHsKKyAgICAgICAgICAgIHVucGFja1dBUnMgPSAoKFN0YW5kYXJkSG9zdCkgaG9zdCkuaXNVbnBhY2tXQVJzKCkgCisgICAgICAgICAgICAgICAgJiYgKChTdGFuZGFyZENvbnRleHQpIGNvbnRleHQpLmdldFVucGFja1dBUigpOworICAgICAgICB9CisKKyAgICAgICAgRmlsZSBjYW5vbmljYWxBcHBCYXNlID0gbmV3IEZpbGUoYXBwQmFzZSk7CisgICAgICAgIGlmIChjYW5vbmljYWxBcHBCYXNlLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgY2Fub25pY2FsQXBwQmFzZSA9IGNhbm9uaWNhbEFwcEJhc2UuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2Fub25pY2FsQXBwQmFzZSA9IAorICAgICAgICAgICAgICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLCBhcHBCYXNlKQorICAgICAgICAgICAgICAgIC5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZG9jQmFzZSA9IGNvbnRleHQuZ2V0RG9jQmFzZSgpOworICAgICAgICBpZiAoZG9jQmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUcnlpbmcgdG8gZ3Vlc3MgdGhlIGRvY0Jhc2UgYWNjb3JkaW5nIHRvIHRoZSBwYXRoCisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICBkb2NCYXNlID0gIlJPT1QiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZG9jQmFzZSA9IHBhdGguc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRvY0Jhc2UgPSBwYXRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRvY0Jhc2UpOworICAgICAgICBpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICBkb2NCYXNlID0gKG5ldyBGaWxlKGNhbm9uaWNhbEFwcEJhc2UsIGRvY0Jhc2UpKS5nZXRQYXRoKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb2NCYXNlID0gZmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgIH0KKyAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGRvY0Jhc2UpOworICAgICAgICBTdHJpbmcgb3JpZ0RvY0Jhc2UgPSBkb2NCYXNlIDsKKyAKKyAgICAgICAgaWYgKGRvY0Jhc2UudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLndhciIpICYmICFmaWxlLmlzRGlyZWN0b3J5KCkgJiYgdW5wYWNrV0FScykgeworICAgICAgICAgICAgVVJMIHdhciA9IG5ldyBVUkwoImphcjoiICsgKG5ldyBGaWxlKGRvY0Jhc2UpKS50b1VSTCgpICsgIiEvIik7CisgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSBjb250ZXh0LmdldFBhdGgoKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0UGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dFBhdGggPSAiUk9PVCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkb2NCYXNlID0gRXhwYW5kV2FyLmV4cGFuZChob3N0LCB3YXIsIGNvbnRleHRQYXRoKTsKKyAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShkb2NCYXNlKTsKKyAgICAgICAgICAgIGRvY0Jhc2UgPSBmaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgKChTdGFuZGFyZENvbnRleHQpIGNvbnRleHQpLnNldE9yaWdpbmFsRG9jQmFzZShvcmlnRG9jQmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGaWxlIGRvY0RpciA9IG5ldyBGaWxlKGRvY0Jhc2UpOworICAgICAgICAgICAgaWYgKCFkb2NEaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlIHdhckZpbGUgPSBuZXcgRmlsZShkb2NCYXNlICsgIi53YXIiKTsKKyAgICAgICAgICAgICAgICBpZiAod2FyRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodW5wYWNrV0FScykgeworICAgICAgICAgICAgICAgICAgICAgICAgVVJMIHdhciA9IG5ldyBVUkwoImphcjoiICsgd2FyRmlsZS50b1VSTCgpICsgIiEvIik7CisgICAgICAgICAgICAgICAgICAgICAgICBkb2NCYXNlID0gRXhwYW5kV2FyLmV4cGFuZChob3N0LCB3YXIsIGNvbnRleHQuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShkb2NCYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvY0Jhc2UgPSBmaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvY0Jhc2UgPSB3YXJGaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICAoKFN0YW5kYXJkQ29udGV4dCljb250ZXh0KS5zZXRPcmlnaW5hbERvY0Jhc2Uob3JpZ0RvY0Jhc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChkb2NCYXNlLnN0YXJ0c1dpdGgoY2Fub25pY2FsQXBwQmFzZS5nZXRQYXRoKCkpKSB7CisgICAgICAgICAgICBkb2NCYXNlID0gZG9jQmFzZS5zdWJzdHJpbmcoY2Fub25pY2FsQXBwQmFzZS5nZXRQYXRoKCkubGVuZ3RoKCkpOworICAgICAgICAgICAgZG9jQmFzZSA9IGRvY0Jhc2UucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisgICAgICAgICAgICBpZiAoZG9jQmFzZS5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICBkb2NCYXNlID0gZG9jQmFzZS5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb2NCYXNlID0gZG9jQmFzZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnRleHQuc2V0RG9jQmFzZShkb2NCYXNlKTsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBhbnRpTG9ja2luZygpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKChjb250ZXh0IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KSAKKyAgICAgICAgICAgICYmICgoU3RhbmRhcmRDb250ZXh0KSBjb250ZXh0KS5nZXRBbnRpUmVzb3VyY2VMb2NraW5nKCkpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpIGNvbnRleHQuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgYXBwQmFzZSA9IGhvc3QuZ2V0QXBwQmFzZSgpOworICAgICAgICAgICAgU3RyaW5nIGRvY0Jhc2UgPSBjb250ZXh0LmdldERvY0Jhc2UoKTsKKyAgICAgICAgICAgIGlmIChkb2NCYXNlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKG9yaWdpbmFsRG9jQmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3JpZ2luYWxEb2NCYXNlID0gZG9jQmFzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZG9jQmFzZSA9IG9yaWdpbmFsRG9jQmFzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpbGUgZG9jQmFzZUZpbGUgPSBuZXcgRmlsZShkb2NCYXNlKTsKKyAgICAgICAgICAgIGlmICghZG9jQmFzZUZpbGUuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoYXBwQmFzZSk7CisgICAgICAgICAgICAgICAgaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksIGFwcEJhc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkb2NCYXNlRmlsZSA9IG5ldyBGaWxlKGZpbGUsIGRvY0Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICBkb2NCYXNlID0gIlJPT1QiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZG9jQmFzZSA9IHBhdGguc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRvY0Jhc2UgPSBwYXRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRmlsZSBmaWxlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChkb2NCYXNlLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi53YXIiKSkgeworICAgICAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiksCisgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50Q291bnQrKyArICItIiArIGRvY0Jhc2UgKyAiLndhciIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRDb3VudCsrICsgIi0iICsgZG9jQmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFudGkgbG9ja2luZyBjb250ZXh0WyIgKyBjb250ZXh0LmdldFBhdGgoKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gc2V0dGluZyBkb2NCYXNlIHRvICIgKyBmaWxlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQ2xlYW51cCBqdXN0IGluIGNhc2UgYW4gb2xkIGRlcGxveW1lbnQgaXMgbHlpbmcgYXJvdW5kCisgICAgICAgICAgICBFeHBhbmRXYXIuZGVsZXRlKGZpbGUpOworICAgICAgICAgICAgaWYgKEV4cGFuZFdhci5jb3B5KGRvY0Jhc2VGaWxlLCBmaWxlKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RG9jQmFzZShmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSAiaW5pdCIgZXZlbnQgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkgeworICAgICAgICAvLyBDYWxsZWQgZnJvbSBTdGFuZGFyZENvbnRleHQuaW5pdCgpCisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy5pbml0IikpOworICAgICAgICBjb250ZXh0LnNldENvbmZpZ3VyZWQoZmFsc2UpOworICAgICAgICBvayA9IHRydWU7CisgICAgICAgIAorICAgICAgICBjb250ZXh0Q29uZmlnKCk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgZml4RG9jQmFzZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmZpeERvY0Jhc2UiKSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSAiYmVmb3JlIHN0YXJ0IiBldmVudCBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBiZWZvcmVTdGFydCgpIHsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhbnRpTG9ja2luZygpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmFudGlMb2NraW5nIiksIGUpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgInN0YXJ0IiBldmVudCBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgLy8gQ2FsbGVkIGZyb20gU3RhbmRhcmRDb250ZXh0LnN0YXJ0KCkKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLnN0YXJ0IikpOworCisgICAgICAgIC8vIFNldCBwcm9wZXJ0aWVzIGJhc2VkIG9uIERlZmF1bHRDb250ZXh0CisgICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBjb250ZXh0LmdldFBhcmVudCgpOworICAgICAgICBpZiggIWNvbnRleHQuZ2V0T3ZlcnJpZGUoKSApIHsKKyAgICAgICAgICAgIGlmKCBjb250YWluZXIgaW5zdGFuY2VvZiBIb3N0ICkgeworICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSB2YWx1ZSBvbmx5IGlmIHRoZSBhdHRyaWJ1dGUgd2Fzbid0CisgICAgICAgICAgICAgICAgLy8gc2V0IG9uIHRoZSBjb250ZXh0LgorICAgICAgICAgICAgICAgIHhtbFZhbGlkYXRpb24gPSBjb250ZXh0LmdldFhtbFZhbGlkYXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoIXhtbFZhbGlkYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgeG1sVmFsaWRhdGlvbiA9ICgoSG9zdCljb250YWluZXIpLmdldFhtbFZhbGlkYXRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgeG1sTmFtZXNwYWNlQXdhcmUgPSBjb250ZXh0LmdldFhtbE5hbWVzcGFjZUF3YXJlKCk7CisgICAgICAgICAgICAgICAgaWYgKCF4bWxOYW1lc3BhY2VBd2FyZSl7CisgICAgICAgICAgICAgICAgICAgIHhtbE5hbWVzcGFjZUF3YXJlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICgoSG9zdCljb250YWluZXIpLmdldFhtbE5hbWVzcGFjZUF3YXJlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLmdldFBhcmVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgZGVmYXVsdCBhbmQgYXBwbGljYXRpb24gd2ViLnhtbCBmaWxlcworICAgICAgICBkZWZhdWx0V2ViQ29uZmlnKCk7CisgICAgICAgIGFwcGxpY2F0aW9uV2ViQ29uZmlnKCk7CisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgdmFsaWRhdGVTZWN1cml0eVJvbGVzKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb25maWd1cmUgYW4gYXV0aGVudGljYXRvciBpZiB3ZSBuZWVkIG9uZQorICAgICAgICBpZiAob2spCisgICAgICAgICAgICBhdXRoZW50aWNhdG9yQ29uZmlnKCk7CisKKyAgICAgICAgLy8gRHVtcCB0aGUgY29udGVudHMgb2YgdGhpcyBwaXBlbGluZSBpZiByZXF1ZXN0ZWQKKyAgICAgICAgaWYgKChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgJiYgKGNvbnRleHQgaW5zdGFuY2VvZiBDb250YWluZXJCYXNlKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJQaXBlbGluZSBDb25maWd1cmF0aW9uOiIpOworICAgICAgICAgICAgUGlwZWxpbmUgcGlwZWxpbmUgPSAoKENvbnRhaW5lckJhc2UpIGNvbnRleHQpLmdldFBpcGVsaW5lKCk7CisgICAgICAgICAgICBWYWx2ZSB2YWx2ZXNbXSA9IG51bGw7CisgICAgICAgICAgICBpZiAocGlwZWxpbmUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB2YWx2ZXMgPSBwaXBlbGluZS5nZXRWYWx2ZXMoKTsKKyAgICAgICAgICAgIGlmICh2YWx2ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAiICsgdmFsdmVzW2ldLmdldEluZm8oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nLmRlYnVnKCI9PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBNYWtlIG91ciBhcHBsaWNhdGlvbiBhdmFpbGFibGUgaWYgbm8gcHJvYmxlbXMgd2VyZSBlbmNvdW50ZXJlZAorICAgICAgICBpZiAob2spCisgICAgICAgICAgICBjb250ZXh0LnNldENvbmZpZ3VyZWQodHJ1ZSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy51bmF2YWlsYWJsZSIpKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0Q29uZmlndXJlZChmYWxzZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhICJzdG9wIiBldmVudCBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuc3RvcCIpKTsKKworICAgICAgICBpbnQgaTsKKworICAgICAgICAvLyBSZW1vdmluZyBjaGlsZHJlbgorICAgICAgICBDb250YWluZXJbXSBjaGlsZHJlbiA9IGNvbnRleHQuZmluZENoaWxkcmVuKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVDaGlsZChjaGlsZHJlbltpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmluZyBhcHBsaWNhdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIC8qCisgICAgICAgIEFwcGxpY2F0aW9uUGFyYW1ldGVyW10gYXBwbGljYXRpb25QYXJhbWV0ZXJzID0KKyAgICAgICAgICAgIGNvbnRleHQuZmluZEFwcGxpY2F0aW9uUGFyYW1ldGVycygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXBwbGljYXRpb25QYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUFwcGxpY2F0aW9uUGFyYW1ldGVyCisgICAgICAgICAgICAgICAgKGFwcGxpY2F0aW9uUGFyYW1ldGVyc1tpXS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgICovCisKKyAgICAgICAgLy8gUmVtb3Zpbmcgc2VjdXJpdHkgY29uc3RyYWludHMKKyAgICAgICAgU2VjdXJpdHlDb25zdHJhaW50W10gc2VjdXJpdHlDb25zdHJhaW50cyA9IGNvbnRleHQuZmluZENvbnN0cmFpbnRzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWN1cml0eUNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUNvbnN0cmFpbnQoc2VjdXJpdHlDb25zdHJhaW50c1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmluZyBFamJzCisgICAgICAgIC8qCisgICAgICAgIENvbnRleHRFamJbXSBjb250ZXh0RWpicyA9IGNvbnRleHQuZmluZEVqYnMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnRleHRFamJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUVqYihjb250ZXh0RWpic1tpXS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgICovCisKKyAgICAgICAgLy8gUmVtb3ZpbmcgZW52aXJvbm1lbnRzCisgICAgICAgIC8qCisgICAgICAgIENvbnRleHRFbnZpcm9ubWVudFtdIGNvbnRleHRFbnZpcm9ubWVudHMgPSBjb250ZXh0LmZpbmRFbnZpcm9ubWVudHMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnRleHRFbnZpcm9ubWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlRW52aXJvbm1lbnQoY29udGV4dEVudmlyb25tZW50c1tpXS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgICovCisKKyAgICAgICAgLy8gUmVtb3ZpbmcgZXJyb3JzIHBhZ2VzCisgICAgICAgIEVycm9yUGFnZVtdIGVycm9yUGFnZXMgPSBjb250ZXh0LmZpbmRFcnJvclBhZ2VzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlcnJvclBhZ2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUVycm9yUGFnZShlcnJvclBhZ2VzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92aW5nIGZpbHRlciBkZWZzCisgICAgICAgIEZpbHRlckRlZltdIGZpbHRlckRlZnMgPSBjb250ZXh0LmZpbmRGaWx0ZXJEZWZzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXJEZWZzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUZpbHRlckRlZihmaWx0ZXJEZWZzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92aW5nIGZpbHRlciBtYXBzCisgICAgICAgIEZpbHRlck1hcFtdIGZpbHRlck1hcHMgPSBjb250ZXh0LmZpbmRGaWx0ZXJNYXBzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXJNYXBzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUZpbHRlck1hcChmaWx0ZXJNYXBzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92aW5nIGxvY2FsIGVqYnMKKyAgICAgICAgLyoKKyAgICAgICAgQ29udGV4dExvY2FsRWpiW10gY29udGV4dExvY2FsRWpicyA9IGNvbnRleHQuZmluZExvY2FsRWpicygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGV4dExvY2FsRWpicy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVMb2NhbEVqYihjb250ZXh0TG9jYWxFamJzW2ldLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICAvLyBSZW1vdmluZyBNaW1lIG1hcHBpbmdzCisgICAgICAgIFN0cmluZ1tdIG1pbWVNYXBwaW5ncyA9IGNvbnRleHQuZmluZE1pbWVNYXBwaW5ncygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWltZU1hcHBpbmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZU1pbWVNYXBwaW5nKG1pbWVNYXBwaW5nc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmluZyBwYXJhbWV0ZXJzCisgICAgICAgIFN0cmluZ1tdIHBhcmFtZXRlcnMgPSBjb250ZXh0LmZpbmRQYXJhbWV0ZXJzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZVBhcmFtZXRlcihwYXJhbWV0ZXJzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92aW5nIHJlc291cmNlIGVudiByZWZzCisgICAgICAgIC8qCisgICAgICAgIFN0cmluZ1tdIHJlc291cmNlRW52UmVmcyA9IGNvbnRleHQuZmluZFJlc291cmNlRW52UmVmcygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VFbnZSZWZzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZVJlc291cmNlRW52UmVmKHJlc291cmNlRW52UmVmc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICAvLyBSZW1vdmluZyByZXNvdXJjZSBsaW5rcworICAgICAgICAvKgorICAgICAgICBDb250ZXh0UmVzb3VyY2VMaW5rW10gY29udGV4dFJlc291cmNlTGlua3MgPQorICAgICAgICAgICAgY29udGV4dC5maW5kUmVzb3VyY2VMaW5rcygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGV4dFJlc291cmNlTGlua3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlUmVzb3VyY2VMaW5rKGNvbnRleHRSZXNvdXJjZUxpbmtzW2ldLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICAvLyBSZW1vdmluZyByZXNvdXJjZXMKKyAgICAgICAgLyoKKyAgICAgICAgQ29udGV4dFJlc291cmNlW10gY29udGV4dFJlc291cmNlcyA9IGNvbnRleHQuZmluZFJlc291cmNlcygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGV4dFJlc291cmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVSZXNvdXJjZShjb250ZXh0UmVzb3VyY2VzW2ldLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICAvLyBSZW1vdmluZyBzZXJjdXJpdHkgcm9sZQorICAgICAgICBTdHJpbmdbXSBzZWN1cml0eVJvbGVzID0gY29udGV4dC5maW5kU2VjdXJpdHlSb2xlcygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VjdXJpdHlSb2xlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVTZWN1cml0eVJvbGUoc2VjdXJpdHlSb2xlc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmluZyBzZXJ2bGV0IG1hcHBpbmdzCisgICAgICAgIFN0cmluZ1tdIHNlcnZsZXRNYXBwaW5ncyA9IGNvbnRleHQuZmluZFNlcnZsZXRNYXBwaW5ncygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VydmxldE1hcHBpbmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZVNlcnZsZXRNYXBwaW5nKHNlcnZsZXRNYXBwaW5nc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGSVhNRSA6IFJlbW92aW5nIHN0YXR1cyBwYWdlcworCisgICAgICAgIC8vIFJlbW92aW5nIHRhZ2xpYnMKKyAgICAgICAgU3RyaW5nW10gdGFnbGlicyA9IGNvbnRleHQuZmluZFRhZ2xpYnMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhZ2xpYnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlVGFnbGliKHRhZ2xpYnNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3Zpbmcgd2VsY29tZSBmaWxlcworICAgICAgICBTdHJpbmdbXSB3ZWxjb21lRmlsZXMgPSBjb250ZXh0LmZpbmRXZWxjb21lRmlsZXMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdlbGNvbWVGaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVXZWxjb21lRmlsZSh3ZWxjb21lRmlsZXNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3Zpbmcgd3JhcHBlciBsaWZlY3ljbGVzCisgICAgICAgIFN0cmluZ1tdIHdyYXBwZXJMaWZlY3ljbGVzID0gY29udGV4dC5maW5kV3JhcHBlckxpZmVjeWNsZXMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdyYXBwZXJMaWZlY3ljbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZVdyYXBwZXJMaWZlY3ljbGUod3JhcHBlckxpZmVjeWNsZXNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3Zpbmcgd3JhcHBlciBsaXN0ZW5lcnMKKyAgICAgICAgU3RyaW5nW10gd3JhcHBlckxpc3RlbmVycyA9IGNvbnRleHQuZmluZFdyYXBwZXJMaXN0ZW5lcnMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdyYXBwZXJMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlV3JhcHBlckxpc3RlbmVyKHdyYXBwZXJMaXN0ZW5lcnNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIChwYXJ0aWFsbHkpIGZvbGRlcnMgYW5kIGZpbGVzIGNyZWF0ZWQgYnkgYW50aUxvY2tpbmcKKyAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpIGNvbnRleHQuZ2V0UGFyZW50KCk7CisgICAgICAgIFN0cmluZyBhcHBCYXNlID0gaG9zdC5nZXRBcHBCYXNlKCk7CisgICAgICAgIFN0cmluZyBkb2NCYXNlID0gY29udGV4dC5nZXREb2NCYXNlKCk7CisgICAgICAgIGlmICgoZG9jQmFzZSAhPSBudWxsKSAmJiAob3JpZ2luYWxEb2NCYXNlICE9IG51bGwpKSB7CisgICAgICAgICAgICBGaWxlIGRvY0Jhc2VGaWxlID0gbmV3IEZpbGUoZG9jQmFzZSk7CisgICAgICAgICAgICBpZiAoIWRvY0Jhc2VGaWxlLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgIGRvY0Jhc2VGaWxlID0gbmV3IEZpbGUoYXBwQmFzZSwgZG9jQmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFeHBhbmRXYXIuZGVsZXRlKGRvY0Jhc2VGaWxlKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgb2sgPSB0cnVlOworCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSAiZGVzdHJveSIgZXZlbnQgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgLy8gQ2FsbGVkIGZyb20gU3RhbmRhcmRDb250ZXh0LmRlc3Ryb3koKQorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmRlc3Ryb3kiKSk7CisKKyAgICAgICAgLy8gQ2hhbmdlZCB0byBnZXRXb3JrUGF0aCBwZXIgQnVnemlsbGEgMzU4MTkuCisgICAgICAgIFN0cmluZyB3b3JrRGlyID0gKChTdGFuZGFyZENvbnRleHQpIGNvbnRleHQpLmdldFdvcmtQYXRoKCk7CisgICAgICAgIGlmICh3b3JrRGlyICE9IG51bGwpCisgICAgICAgICAgICBFeHBhbmRXYXIuZGVsZXRlKG5ldyBGaWxlKHdvcmtEaXIpKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHVzYWdlIG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbgorICAgICAqIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIElmIGFueSBwcm9ibGVtcyBhcmUgZm91bmQsIGlzc3VlIHdhcm5pbmcKKyAgICAgKiBtZXNzYWdlcyAoZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KSBhbmQgYWRkIHRoZSBtaXNzaW5nIHJvbGVzLgorICAgICAqIChUbyBtYWtlIHRoZXNlIHByb2JsZW1zIGZhdGFsIGluc3RlYWQsIHNpbXBseSBzZXQgdGhlIDxjb2RlPm9rPC9jb2RlPgorICAgICAqIGluc3RhbmNlIHZhcmlhYmxlIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBhcyB3ZWxsKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNlY3VyaXR5Um9sZXMoKSB7CisKKyAgICAgICAgLy8gQ2hlY2sgcm9sZSBuYW1lcyB1c2VkIGluIDxzZWN1cml0eS1jb25zdHJhaW50PiBlbGVtZW50cworICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgY29uc3RyYWludHNbXSA9IGNvbnRleHQuZmluZENvbnN0cmFpbnRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyByb2xlc1tdID0gY29uc3RyYWludHNbaV0uZmluZEF1dGhSb2xlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCByb2xlcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGlmICghIioiLmVxdWFscyhyb2xlc1tqXSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIWNvbnRleHQuZmluZFNlY3VyaXR5Um9sZShyb2xlc1tqXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLnJvbGUuYXV0aCIsIHJvbGVzW2pdKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYWRkU2VjdXJpdHlSb2xlKHJvbGVzW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayByb2xlIG5hbWVzIHVzZWQgaW4gPHNlcnZsZXQ+IGVsZW1lbnRzCisgICAgICAgIENvbnRhaW5lciB3cmFwcGVyc1tdID0gY29udGV4dC5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3cmFwcGVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgV3JhcHBlciB3cmFwcGVyID0gKFdyYXBwZXIpIHdyYXBwZXJzW2ldOworICAgICAgICAgICAgU3RyaW5nIHJ1bkFzID0gd3JhcHBlci5nZXRSdW5BcygpOworICAgICAgICAgICAgaWYgKChydW5BcyAhPSBudWxsKSAmJiAhY29udGV4dC5maW5kU2VjdXJpdHlSb2xlKHJ1bkFzKSkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy5yb2xlLnJ1bmFzIiwgcnVuQXMpKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmFkZFNlY3VyaXR5Um9sZShydW5Bcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgbmFtZXNbXSA9IHdyYXBwZXIuZmluZFNlY3VyaXR5UmVmZXJlbmNlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuYW1lcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBsaW5rID0gd3JhcHBlci5maW5kU2VjdXJpdHlSZWZlcmVuY2UobmFtZXNbal0pOworICAgICAgICAgICAgICAgIGlmICgobGluayAhPSBudWxsKSAmJiAhY29udGV4dC5maW5kU2VjdXJpdHlSb2xlKGxpbmspKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy5yb2xlLmxpbmsiLCBsaW5rKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYWRkU2VjdXJpdHlSb2xlKGxpbmspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgY29uZmlnIGJhc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0Q29uZmlnQmFzZSgpIHsKKyAgICAgICAgRmlsZSBjb25maWdCYXNlID0gCisgICAgICAgICAgICBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwgImNvbmYiKTsKKyAgICAgICAgaWYgKCFjb25maWdCYXNlLmV4aXN0cygpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBjb25maWdCYXNlOworICAgICAgICB9CisgICAgfSAgCisKKyAgICAKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEhvc3RDb25maWdQYXRoKFN0cmluZyByZXNvdXJjZU5hbWUpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgQ29udGFpbmVyIGNvbnRhaW5lciA9IGNvbnRleHQ7CisgICAgICAgIENvbnRhaW5lciBob3N0ID0gbnVsbDsKKyAgICAgICAgQ29udGFpbmVyIGVuZ2luZSA9IG51bGw7CisgICAgICAgIHdoaWxlIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEhvc3QpCisgICAgICAgICAgICAgICAgaG9zdCA9IGNvbnRhaW5lcjsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFbmdpbmUpCisgICAgICAgICAgICAgICAgZW5naW5lID0gY29udGFpbmVyOworICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLmdldFBhcmVudCgpOworICAgICAgICB9CisgICAgICAgIGlmIChlbmdpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChlbmdpbmUuZ2V0TmFtZSgpKS5hcHBlbmQoJy8nKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGhvc3QuZ2V0TmFtZSgpKS5hcHBlbmQoJy8nKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKHJlc291cmNlTmFtZSk7CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBjbGFzcyBDb250ZXh0RXJyb3JIYW5kbGVyCisgICAgICAgIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsKKworICAgICAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHBhcnNlRXhjZXB0aW9uID0gZXhjZXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHBhcnNlRXhjZXB0aW9uID0gZXhjZXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHBhcnNlRXhjZXB0aW9uID0gZXhjZXB0aW9uOworICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ29udGV4dFJ1bGVTZXQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0NvbnRleHRSdWxlU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkzYmFlYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0NvbnRleHRSdWxlU2V0LmphdmEKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLkRpZ2VzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuUnVsZVNldEJhc2U7CisKKworLyoqCisgKiA8cD48c3Ryb25nPlJ1bGVTZXQ8L3N0cm9uZz4gZm9yIHByb2Nlc3NpbmcgdGhlIGNvbnRlbnRzIG9mIGEKKyAqIENvbnRleHQgb3IgRGVmYXVsdENvbnRleHQgZGVmaW5pdGlvbiBlbGVtZW50LiAgVG8gZW5hYmxlIHBhcnNpbmcgb2YgYQorICogRGVmYXVsdENvbnRleHQsIGJlIHN1cmUgdG8gc3BlY2lmeSBhIHByZWZpeCB0aGF0IGVuZHMgd2l0aCAiL0RlZmF1bHQiLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbnRleHRSdWxlU2V0IGV4dGVuZHMgUnVsZVNldEJhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4IHRvIHVzZSBmb3IgcmVjb2duaXppbmcgb3VyIGVsZW1lbnRzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcHJlZml4ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHRoZSBjb250ZXh0IGJlIGNyZWF0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRlID0gdHJ1ZTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IHdpdGggdGhlIGRlZmF1bHQKKyAgICAgKiBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dFJ1bGVTZXQoKSB7CisKKyAgICAgICAgdGhpcygiIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4LgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBQcmVmaXggZm9yIG1hdGNoaW5nIHBhdHRlcm4gcnVsZXMgKGluY2x1ZGluZyB0aGUKKyAgICAgKiAgdHJhaWxpbmcgc2xhc2ggY2hhcmFjdGVyKQorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0UnVsZVNldChTdHJpbmcgcHJlZml4KSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBudWxsOworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+UnVsZVNldDwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFByZWZpeCBmb3IgbWF0Y2hpbmcgcGF0dGVybiBydWxlcyAoaW5jbHVkaW5nIHRoZQorICAgICAqICB0cmFpbGluZyBzbGFzaCBjaGFyYWN0ZXIpCisgICAgICovCisgICAgcHVibGljIENvbnRleHRSdWxlU2V0KFN0cmluZyBwcmVmaXgsIGJvb2xlYW4gY3JlYXRlKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBudWxsOworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKyAgICAgICAgdGhpcy5jcmVhdGUgPSBjcmVhdGU7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiA8cD5BZGQgdGhlIHNldCBvZiBSdWxlIGluc3RhbmNlcyBkZWZpbmVkIGluIHRoaXMgUnVsZVNldCB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IGluc3RhbmNlLCBhc3NvY2lhdGluZyB0aGVtIHdpdGgKKyAgICAgKiBvdXIgbmFtZXNwYWNlIFVSSSAoaWYgYW55KS4gIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAorICAgICAqIGJ5IGEgRGlnZXN0ZXIgaW5zdGFuY2UuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGRpZ2VzdGVyIERpZ2VzdGVyIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBuZXcgUnVsZSBpbnN0YW5jZXMKKyAgICAgKiAgc2hvdWxkIGJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJ1bGVJbnN0YW5jZXMoRGlnZXN0ZXIgZGlnZXN0ZXIpIHsKKworICAgICAgICBpZiAoY3JlYXRlKSB7CisgICAgICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkNvbnRleHQiLAorICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dCIsICJjbGFzc05hbWUiKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkNvbnRleHQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIkNvbnRleHQiLCBuZXcgU2V0Q29udGV4dFByb3BlcnRpZXNSdWxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNyZWF0ZSkgeworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAiQ29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMaWZlY3ljbGVMaXN0ZW5lclJ1bGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNvbnRleHRDb25maWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25maWdDbGFzcyIpKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIkNvbnRleHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkQ2hpbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXIiKTsKKyAgICAgICAgfQorICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJDb250ZXh0L0luc3RhbmNlTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRJbnN0YW5jZUxpc3RlbmVyIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJDb250ZXh0L0xpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkNvbnRleHQvTGlzdGVuZXIiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiQ29udGV4dC9MaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZExpZmVjeWNsZUxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lciIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiQ29udGV4dC9Mb2FkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmxvYWRlci5XZWJhcHBMb2FkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiQ29udGV4dC9Mb2FkZXIiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiQ29udGV4dC9Mb2FkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRMb2FkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLkxvYWRlciIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiQ29udGV4dC9NYW5hZ2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uU3RhbmRhcmRNYW5hZ2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiQ29udGV4dC9NYW5hZ2VyIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIkNvbnRleHQvTWFuYWdlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldE1hbmFnZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXIiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkNvbnRleHQvTWFuYWdlci9TdG9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBNVVNUIGJlIHNwZWNpZmllZCBpbiB0aGUgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJDb250ZXh0L01hbmFnZXIvU3RvcmUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiQ29udGV4dC9NYW5hZ2VyL1N0b3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0U3RvcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLlN0b3JlIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJDb250ZXh0L1BhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQXBwbGljYXRpb25QYXJhbWV0ZXIiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiQ29udGV4dC9QYXJhbWV0ZXIiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiQ29udGV4dC9QYXJhbWV0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRBcHBsaWNhdGlvblBhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkFwcGxpY2F0aW9uUGFyYW1ldGVyIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJDb250ZXh0L1JlYWxtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkNvbnRleHQvUmVhbG0iKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiQ29udGV4dC9SZWFsbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFJlYWxtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbSIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiQ29udGV4dC9SZXNvdXJjZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5GaWxlRGlyQ29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkNvbnRleHQvUmVzb3VyY2VzIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIkNvbnRleHQvUmVzb3VyY2VzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0UmVzb3VyY2VzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0Iik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJDb250ZXh0L1Jlc291cmNlTGluayIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUxpbmsiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiQ29udGV4dC9SZXNvdXJjZUxpbmsiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAiQ29udGV4dC9SZXNvdXJjZUxpbmsiLAorICAgICAgICAgICAgICAgIG5ldyBTZXROZXh0TmFtaW5nUnVsZSgiYWRkUmVzb3VyY2VMaW5rIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VMaW5rIikpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiQ29udGV4dC9WYWx2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBNVVNUIGJlIHNwZWNpZmllZCBpbiB0aGUgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJDb250ZXh0L1ZhbHZlIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIkNvbnRleHQvVmFsdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRWYWx2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmUiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJDb250ZXh0L1dhdGNoZWRSZXNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFdhdGNoZWRSZXNvdXJjZSIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIkNvbnRleHQvV3JhcHBlckxpZmVjeWNsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFdyYXBwZXJMaWZlY3ljbGUiLCAwKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJDb250ZXh0L1dyYXBwZXJMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFdyYXBwZXJMaXN0ZW5lciIsIDApOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Db3B5UGFyZW50Q2xhc3NMb2FkZXJSdWxlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Db3B5UGFyZW50Q2xhc3NMb2FkZXJSdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwNDYwOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0NvcHlQYXJlbnRDbGFzc0xvYWRlclJ1bGUuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuUnVsZTsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworCisKKy8qKgorICogPHA+UnVsZSB0aGF0IGNvcGllcyB0aGUgPGNvZGU+cGFyZW50Q2xhc3NMb2FkZXI8L2NvZGU+IHByb3BlcnR5IGZyb20gdGhlCisgKiBuZXh0LXRvLXRvcCBpdGVtIG9uIHRoZSBzdGFjayAod2hpY2ggbXVzdCBiZSBhIDxjb2RlPkNvbnRhaW5lcjwvY29kZT4pCisgKiB0byB0aGUgdG9wIGl0ZW0gb24gdGhlIHN0YWNrICh3aGljaCBtdXN0IGFsc28gYmUgYQorICogPGNvZGU+Q29udGFpbmVyPC9jb2RlPikuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29weVBhcmVudENsYXNzTG9hZGVyUnVsZSBleHRlbmRzIFJ1bGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgUnVsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29weVBhcmVudENsYXNzTG9hZGVyUnVsZSgpIHsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgdGhlIGJlZ2lubmluZyBvZiBhbiBYTUwgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIFRoZSBhdHRyaWJ1dGVzIG9mIHRoaXMgZWxlbWVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYSBwcm9jZXNzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChkaWdlc3Rlci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgZGlnZXN0ZXIuZ2V0TG9nZ2VyKCkuZGVidWcoIkNvcHlpbmcgcGFyZW50IGNsYXNzIGxvYWRlciIpOworICAgICAgICBDb250YWluZXIgY2hpbGQgPSAoQ29udGFpbmVyKSBkaWdlc3Rlci5wZWVrKDApOworICAgICAgICBPYmplY3QgcGFyZW50ID0gZGlnZXN0ZXIucGVlaygxKTsKKyAgICAgICAgTWV0aG9kIG1ldGhvZCA9CisgICAgICAgICAgICBwYXJlbnQuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImdldFBhcmVudENsYXNzTG9hZGVyIiwgbmV3IENsYXNzWzBdKTsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPQorICAgICAgICAgICAgKENsYXNzTG9hZGVyKSBtZXRob2QuaW52b2tlKHBhcmVudCwgbmV3IE9iamVjdFswXSk7CisgICAgICAgIGNoaWxkLnNldFBhcmVudENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9EaWdlc3RlckZhY3RvcnkuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0RpZ2VzdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOWZkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9EaWdlc3RlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU2NoZW1hUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLlJ1bGVTZXQ7CisKKy8qKgorICogV3JhcHBlciBjbGFzcyBhcm91bmQgdGhlIERpZ2VzdGVyIHRoYXQgaGlkZSBEaWdlc3RlcidzIGluaXRpYWxpemF0aW9uIGRldGFpbHMKKyAqCisgKiBAYXV0aG9yIEplYW4tRnJhbmNvaXMgQXJjYW5kCisgKi8KK3B1YmxpYyBjbGFzcyBEaWdlc3RlckZhY3RvcnkgeworICAgIC8qKgorICAgICAqIFRoZSBsb2cuCisgICAgICovCisgICBwcm90ZWN0ZWQgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSAKKyAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyhEaWdlc3RlckZhY3RvcnkuY2xhc3MpOworCisgICAgLyoqCisgICAgICogVGhlIFhNTCBlbnRpcnkgcmVzb2x2ZXIgdXNlZCBieSB0aGUgRGlnZXN0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hUmVzb2x2ZXIgc2NoZW1hUmVzb2x2ZXI7CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIDxjb2RlPkRpZ2VzdGVyPC9jb2RlPiBwYXJzZXIgd2l0aCBubyA8Y29kZT5SdWxlPC9jb2RlPgorICAgICAqIGFzc29jaWF0ZWQgYW5kIFhNTCB2YWxpZGF0aW9uIHR1cm5lZCBvZmYuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEaWdlc3RlciBuZXdEaWdlc3RlcigpeworICAgICAgICByZXR1cm4gbmV3RGlnZXN0ZXIoZmFsc2UsIGZhbHNlLCBudWxsKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSA8Y29kZT5EaWdlc3RlcjwvY29kZT4gcGFyc2VyIHdpdGggWE1MIHZhbGlkYXRpb24gdHVybmVkIG9mZi4KKyAgICAgKiBAcGFyYW0gcnVsZSBhbiBpbnN0YW5jZSBvZiA8Y29kZT5SdWxlU2V0PC9jb2RlPiB1c2VkIGZvciBwYXJzaW5nIHRoZSB4bWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEaWdlc3RlciBuZXdEaWdlc3RlcihSdWxlU2V0IHJ1bGUpeworICAgICAgICByZXR1cm4gbmV3RGlnZXN0ZXIoZmFsc2UsZmFsc2UscnVsZSk7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IHBhcnNlci4KKyAgICAgKiBAcGFyYW0geG1sVmFsaWRhdGlvbiB0dXJuIG9uL29mZiB4bWwgdmFsaWRhdGlvbgorICAgICAqIEBwYXJhbSB4bWxOYW1lc3BhY2VBd2FyZSB0dXJuIG9uL29mZiBuYW1lc3BhY2UgdmFsaWRhdGlvbgorICAgICAqIEBwYXJhbSBydWxlIGFuIGluc3RhbmNlIG9mIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IHVzZWQgZm9yIHBhcnNpbmcgdGhlIHhtbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERpZ2VzdGVyIG5ld0RpZ2VzdGVyKGJvb2xlYW4geG1sVmFsaWRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4geG1sTmFtZXNwYWNlQXdhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdWxlU2V0IHJ1bGUpIHsKKyAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBuZXcgRGlnZXN0ZXIoKTsKKyAgICAgICAgZGlnZXN0ZXIuc2V0TmFtZXNwYWNlQXdhcmUoeG1sTmFtZXNwYWNlQXdhcmUpOworICAgICAgICBkaWdlc3Rlci5zZXRWYWxpZGF0aW5nKHhtbFZhbGlkYXRpb24pOworICAgICAgICBkaWdlc3Rlci5zZXRVc2VDb250ZXh0Q2xhc3NMb2FkZXIodHJ1ZSk7CisKKyAgICAgICAgaWYgKHhtbFZhbGlkYXRpb24gfHwgeG1sTmFtZXNwYWNlQXdhcmUpeworICAgICAgICAgICAgY29uZmlndXJlU2NoZW1hKGRpZ2VzdGVyKTsgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgc2NoZW1hUmVzb2x2ZXIgPSBuZXcgU2NoZW1hUmVzb2x2ZXIoZGlnZXN0ZXIpOworICAgICAgICByZWdpc3RlckxvY2FsU2NoZW1hKCk7CisgICAgICAgIAorICAgICAgICBkaWdlc3Rlci5zZXRFbnRpdHlSZXNvbHZlcihzY2hlbWFSZXNvbHZlcik7CisgICAgICAgIGlmICggcnVsZSAhPSBudWxsICkgeworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZVNldChydWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoZGlnZXN0ZXIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVXRpbGl0aWVzIHVzZWQgdG8gZm9yY2UgdGhlIHBhcnNlciB0byB1c2UgbG9jYWwgc2NoZW1hLCB3aGVuIGF2YWlsYWJsZSwKKyAgICAgKiBpbnN0ZWFkIG9mIHRoZSA8Y29kZT5zY2hlbWFMb2NhdGlvbjwvY29kZT4gWE1MIGVsZW1lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlZ2lzdGVyTG9jYWxTY2hlbWEoKXsKKyAgICAgICAgLy8gSjJFRQorICAgICAgICByZWdpc3RlcihDb25zdGFudHMuSjJlZVNjaGVtYVJlc291cmNlUGF0aF8xNCwKKyAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkoyZWVTY2hlbWFQdWJsaWNJZF8xNCk7CisgICAgICAgIC8vIFczQworICAgICAgICByZWdpc3RlcihDb25zdGFudHMuVzNjU2NoZW1hUmVzb3VyY2VQYXRoXzEwLAorICAgICAgICAgICAgICAgICBDb25zdGFudHMuVzNjU2NoZW1hUHVibGljSWRfMTApOworICAgICAgICAvLyBKU1AKKyAgICAgICAgcmVnaXN0ZXIoQ29uc3RhbnRzLkpzcFNjaGVtYVJlc291cmNlUGF0aF8yMCwKKyAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkpzcFNjaGVtYVB1YmxpY0lkXzIwKTsKKyAgICAgICAgLy8gVExECisgICAgICAgIHJlZ2lzdGVyKENvbnN0YW50cy5UbGREdGRSZXNvdXJjZVBhdGhfMTEsICAKKyAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlRsZER0ZFB1YmxpY0lkXzExKTsKKyAgICAgICAgCisgICAgICAgIHJlZ2lzdGVyKENvbnN0YW50cy5UbGREdGRSZXNvdXJjZVBhdGhfMTIsCisgICAgICAgICAgICAgICAgIENvbnN0YW50cy5UbGREdGRQdWJsaWNJZF8xMik7CisKKyAgICAgICAgcmVnaXN0ZXIoQ29uc3RhbnRzLlRsZFNjaGVtYVJlc291cmNlUGF0aF8yMCwKKyAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlRsZFNjaGVtYVB1YmxpY0lkXzIwKTsKKworICAgICAgICAvLyB3ZWIueG1sICAgIAorICAgICAgICByZWdpc3RlcihDb25zdGFudHMuV2ViRHRkUmVzb3VyY2VQYXRoXzIyLAorICAgICAgICAgICAgICAgICBDb25zdGFudHMuV2ViRHRkUHVibGljSWRfMjIpOworCisgICAgICAgIHJlZ2lzdGVyKENvbnN0YW50cy5XZWJEdGRSZXNvdXJjZVBhdGhfMjMsCisgICAgICAgICAgICAgICAgIENvbnN0YW50cy5XZWJEdGRQdWJsaWNJZF8yMyk7CisKKyAgICAgICAgcmVnaXN0ZXIoQ29uc3RhbnRzLldlYlNjaGVtYVJlc291cmNlUGF0aF8yNCwKKyAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLldlYlNjaGVtYVB1YmxpY0lkXzI0KTsKKworICAgICAgICAvLyBXZWIgU2VydmljZQorICAgICAgICByZWdpc3RlcihDb25zdGFudHMuSjJlZVdlYlNlcnZpY2VTY2hlbWFSZXNvdXJjZVBhdGhfMTEsCisgICAgICAgICAgICAgICAgIENvbnN0YW50cy5KMmVlV2ViU2VydmljZVNjaGVtYVB1YmxpY0lkXzExKTsKKworICAgICAgICByZWdpc3RlcihDb25zdGFudHMuSjJlZVdlYlNlcnZpY2VDbGllbnRTY2hlbWFSZXNvdXJjZVBhdGhfMTEsCisgICAgICAgICAgICAgICAgIENvbnN0YW50cy5KMmVlV2ViU2VydmljZUNsaWVudFNjaGVtYVB1YmxpY0lkXzExKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgcmVzb3VyY2UgYW5kIGFkZCBpdCB0byB0aGUgcmVzb2x2ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKFN0cmluZyByZXNvdXJjZVVSTCwgU3RyaW5nIHJlc291cmNlUHVibGljSWQpeworICAgICAgICBVUkwgdXJsID0gRGlnZXN0ZXJGYWN0b3J5LmNsYXNzLmdldFJlc291cmNlKHJlc291cmNlVVJMKTsKKyAgIAorICAgICAgICBpZih1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nLndhcm4oIkNvdWxkIG5vdCBnZXQgdXJsIGZvciAiICsgcmVzb3VyY2VVUkwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2NoZW1hUmVzb2x2ZXIucmVnaXN0ZXIocmVzb3VyY2VQdWJsaWNJZCAsIHVybC50b1N0cmluZygpICk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFR1cm4gb24gRFREIGFuZC9vciB2YWxpZGF0aW9uIChiYXNlZCBvbiB0aGUgcGFyc2VyIGltcGxlbWVudGF0aW9uKQorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBjb25maWd1cmVTY2hlbWEoRGlnZXN0ZXIgZGlnZXN0ZXIpeworICAgICAgICBVUkwgdXJsID0gRGlnZXN0ZXJGYWN0b3J5LmNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2UoQ29uc3RhbnRzLldlYlNjaGVtYVJlc291cmNlUGF0aF8yNCk7CisgIAorICAgICAgICBpZih1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJDb3VsZCBub3QgZ2V0IHVybCBmb3IgIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENvbnN0YW50cy5XZWJTY2hlbWFSZXNvdXJjZVBhdGhfMjQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGlnZXN0ZXIuc2V0U2NoZW1hKHVybC50b1N0cmluZygpKTsgICAgIAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvRW1iZWRkZWQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0VtYmVkZGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI2OTJjNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0VtYmVkZGVkLmphdmEKQEAgLTAsMCArMSw5OTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQXV0aGVudGljYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIuV2ViYXBwTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VjdXJpdHkuU2VjdXJpdHlDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkxpZmVjeWNsZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5JbnRyb3NwZWN0aW9uVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5sb2cuU3lzdGVtTG9nSGFuZGxlcjsKKworCisvKioKKyAqIENvbnZlbmllbmNlIGNsYXNzIHRvIGVtYmVkIGEgQ2F0YWxpbmEgc2VydmxldCBjb250YWluZXIgZW52aXJvbm1lbnQKKyAqIGluc2lkZSBhbm90aGVyIGFwcGxpY2F0aW9uLiAgWW91IG11c3QgY2FsbCB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGluIHRoZQorICogZm9sbG93aW5nIG9yZGVyIHRvIGVuc3VyZSBjb3JyZWN0IG9wZXJhdGlvbi4KKyAqCisgKiA8dWw+CisgKiA8bGk+SW5zdGFudGlhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy48L2xpPgorICogPGxpPlNldCB0aGUgcmVsZXZhbnQgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdCBpdHNlbGYuICBJbiBwYXJ0aWN1bGFyLAorICogICAgIHlvdSB3aWxsIHdhbnQgdG8gZXN0YWJsaXNoIHRoZSBkZWZhdWx0IExvZ2dlciB0byBiZSB1c2VkLCBhcyB3ZWxsCisgKiAgICAgYXMgdGhlIGRlZmF1bHQgUmVhbG0gaWYgeW91IGFyZSB1c2luZyBjb250YWluZXItbWFuYWdlZCBzZWN1cml0eS48L2xpPgorICogPGxpPkNhbGwgPGNvZGU+Y3JlYXRlRW5naW5lKCk8L2NvZGU+IHRvIGNyZWF0ZSBhbiBFbmdpbmUgb2JqZWN0LCBhbmQgdGhlbgorICogICAgIGNhbGwgaXRzIHByb3BlcnR5IHNldHRlcnMgYXMgZGVzaXJlZC48L2xpPgorICogPGxpPkNhbGwgPGNvZGU+Y3JlYXRlSG9zdCgpPC9jb2RlPiB0byBjcmVhdGUgYXQgbGVhc3Qgb25lIHZpcnR1YWwgSG9zdAorICogICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBFbmdpbmUsIGFuZCB0aGVuIGNhbGwgaXRzIHByb3BlcnR5CisgKiAgICAgc2V0dGVycyBhcyBkZXNpcmVkLiAgQWZ0ZXIgeW91IGN1c3RvbWl6ZSB0aGlzIEhvc3QsIGFkZCBpdCB0byB0aGUKKyAqICAgICBjb3JyZXNwb25kaW5nIEVuZ2luZSB3aXRoIDxjb2RlPmVuZ2luZS5hZGRDaGlsZChob3N0KTwvY29kZT4uPC9saT4KKyAqIDxsaT5DYWxsIDxjb2RlPmNyZWF0ZUNvbnRleHQoKTwvY29kZT4gdG8gY3JlYXRlIGF0IGxlYXN0IG9uZSBDb250ZXh0CisgKiAgICAgYXNzb2NpYXRlZCB3aXRoIGVhY2ggbmV3bHkgY3JlYXRlZCBIb3N0LCBhbmQgdGhlbiBjYWxsIGl0cyBwcm9wZXJ0eQorICogICAgIHNldHRlcnMgYXMgZGVzaXJlZC4gIFlvdSA8c3Ryb25nPlNIT1VMRDwvc3Ryb25nPiBjcmVhdGUgYSBDb250ZXh0IHdpdGgKKyAqICAgICBhIHBhdGhuYW1lIGVxdWFsIHRvIGEgemVyby1sZW5ndGggc3RyaW5nLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gcHJvY2VzcworICogICAgIGFsbCByZXF1ZXN0cyBub3QgbWFwcGVkIHRvIHNvbWUgb3RoZXIgQ29udGV4dC4gIEFmdGVyIHlvdSBjdXN0b21pemUKKyAqICAgICB0aGlzIENvbnRleHQsIGFkZCBpdCB0byB0aGUgY29ycmVzcG9uZGluZyBIb3N0IHdpdGgKKyAqICAgICA8Y29kZT5ob3N0LmFkZENoaWxkKGNvbnRleHQpPC9jb2RlPi48L2xpPgorICogPGxpPkNhbGwgPGNvZGU+YWRkRW5naW5lKCk8L2NvZGU+IHRvIGF0dGFjaCB0aGlzIEVuZ2luZSB0byB0aGUgc2V0IG9mCisgKiAgICAgZGVmaW5lZCBFbmdpbmVzIGZvciB0aGlzIG9iamVjdC48L2xpPgorICogPGxpPkNhbGwgPGNvZGU+Y3JlYXRlQ29ubmVjdG9yKCk8L2NvZGU+IHRvIGNyZWF0ZSBhdCBsZWFzdCBvbmUgVENQL0lQCisgKiAgICAgY29ubmVjdG9yLCBhbmQgdGhlbiBjYWxsIGl0cyBwcm9wZXJ0eSBzZXR0ZXJzIGFzIGRlc2lyZWQuPC9saT4KKyAqIDxsaT5DYWxsIDxjb2RlPmFkZENvbm5lY3RvcigpPC9jb2RlPiB0byBhdHRhY2ggdGhpcyBDb25uZWN0b3IgdG8gdGhlIHNldAorICogICAgIG9mIGRlZmluZWQgQ29ubmVjdG9ycyBmb3IgdGhpcyBvYmplY3QuICBUaGUgYWRkZWQgQ29ubmVjdG9yIHdpbGwgdXNlCisgKiAgICAgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgRW5naW5lIHRvIHByb2Nlc3MgaXRzIHJlY2VpdmVkIHJlcXVlc3RzLjwvbGk+CisgKiA8bGk+UmVwZWF0IHRoZSBhYm92ZSBzZXJpZXMgb2Ygc3RlcHMgYXMgb2Z0ZW4gYXMgcmVxdWlyZWQgKGFsdGhvdWdoIHRoZXJlCisgKiAgICAgd2lsbCB0eXBpY2FsbHkgYmUgb25seSBvbmUgRW5naW5lIGluc3RhbmNlIGNyZWF0ZWQpLjwvbGk+CisgKiA8bGk+Q2FsbCA8Y29kZT5zdGFydCgpPC9jb2RlPiB0byBpbml0aWF0ZSBub3JtYWwgb3BlcmF0aW9ucyBvZiBhbGwgdGhlCisgKiAgICAgYXR0YWNoZWQgY29tcG9uZW50cy48L2xpPgorICogPC91bD4KKyAqCisgKiBBZnRlciBub3JtYWwgb3BlcmF0aW9ucyBoYXZlIGJlZ3VuLCB5b3UgY2FuIGFkZCBhbmQgcmVtb3ZlIENvbm5lY3RvcnMsCisgKiBFbmdpbmVzLCBIb3N0cywgYW5kIENvbnRleHRzIG9uIHRoZSBmbHkuICBIb3dldmVyLCBvbmNlIHlvdSBoYXZlIHJlbW92ZWQKKyAqIGEgcGFydGljdWxhciBjb21wb25lbnQsIGl0IG11c3QgYmUgdGhyb3duIGF3YXkgLS0geW91IGNhbiBjcmVhdGUgYSBuZXcgb25lCisgKiB3aXRoIHRoZSBzYW1lIGNoYXJhY3RlcmlzdGljcyBpZiB5b3UgbWVyZWx5IHdhbnQgdG8gZG8gYSByZXN0YXJ0LgorICogPHA+CisgKiBUbyBpbml0aWF0ZSBhIG5vcm1hbCBzaHV0ZG93biwgY2FsbCB0aGUgPGNvZGU+c3RvcCgpPC9jb2RlPiBtZXRob2Qgb2YKKyAqIHRoaXMgb2JqZWN0LgorICogPHA+CisgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5DYXRhbGluYSNtYWluIEZvciBhIGNvbXBsZXRlIGV4YW1wbGUKKyAqIG9mIGhvdyBUb21jYXQgaXMgc2V0IHVwIGFuZCBsYXVuY2hlZCBhcyBhbiBFbWJlZGRlZCBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEVtYmVkZGVkICBleHRlbmRzIFN0YW5kYXJkU2VydmljZSBpbXBsZW1lbnRzIExpZmVjeWNsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEVtYmVkZGVkLmNsYXNzKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGRlZmF1bHQgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW1iZWRkZWQoKSB7CisKKyAgICAgICAgdGhpcyhudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBzcGVjaWZpZWQgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFsbSBSZWFsbSBpbXBsZW1lbnRhdGlvbiB0byBiZSBpbmhlcml0ZWQgYnkgYWxsIGNvbXBvbmVudHMKKyAgICAgKiAgKHVubGVzcyBvdmVycmlkZGVuIGZ1cnRoZXIgZG93biB0aGUgY29udGFpbmVyIGhpZXJhcmNoeSkKKyAgICAgKi8KKyAgICBwdWJsaWMgRW1iZWRkZWQoUmVhbG0gcmVhbG0pIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICBzZXRSZWFsbShyZWFsbSk7CisgICAgICAgIHNldFNlY3VyaXR5UHJvdGVjdGlvbigpOworICAgICAgICAKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBJcyBuYW1pbmcgZW5hYmxlZCA/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlTmFtaW5nID0gdHJ1ZTsKKworCisgICAgLyoqCisgICAgICogSXMgc3RhbmRhcmQgc3RyZWFtcyByZWRpcmVjdGlvbiBlbmFibGVkID8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWRpcmVjdFN0cmVhbXMgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIEVuZ2luZXMgdGhhdCBoYXZlIGJlZW4gZGVwbG95ZWQgaW4gdGhpcyBzZXJ2ZXIuICBOb3JtYWxseQorICAgICAqIHRoZXJlIHdpbGwgb25seSBiZSBvbmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEVuZ2luZSBlbmdpbmVzW10gPSBuZXcgRW5naW5lWzBdOworCisKKyAgICAvKioKKyAgICAgKiBDdXN0b20gbWFwcGluZ3Mgb2YgbG9naW4gbWV0aG9kcyB0byBhdXRoZW50aWNhdG9ycworICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIGF1dGhlbnRpY2F0b3JzOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHNlcnZlciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5FbWJlZGRlZC8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCByZWFsbSB0byBiZSB1c2VkIGJ5IGFsbCBjb250YWluZXJzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgY29tcG9lbm50LgorICAgICAqLworICAgIHByb3RlY3RlZCBSZWFsbSByZWFsbSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIHN0YXJ0ZWQgeWV0PworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFVzZSBhd2FpdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhd2FpdCA9IGZhbHNlOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgbmFtaW5nIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNVc2VOYW1pbmcoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnVzZU5hbWluZyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgbmFtaW5nIHN1cHBvcnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlTmFtaW5nIFRoZSBuZXcgdXNlIG5hbWluZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZU5hbWluZyhib29sZWFuIHVzZU5hbWluZykgeworCisgICAgICAgIGJvb2xlYW4gb2xkVXNlTmFtaW5nID0gdGhpcy51c2VOYW1pbmc7CisgICAgICAgIHRoaXMudXNlTmFtaW5nID0gdXNlTmFtaW5nOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgidXNlTmFtaW5nIiwgbmV3IEJvb2xlYW4ob2xkVXNlTmFtaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odGhpcy51c2VOYW1pbmcpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgcmVkaXJjdGlvbiBvZiBzdGFuZGFyZCBzdHJlYW1zIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWRpcmVjdFN0cmVhbXMoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlZGlyZWN0U3RyZWFtcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgbmFtaW5nIHN1cHBvcnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlTmFtaW5nIFRoZSBuZXcgdXNlIG5hbWluZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZGlyZWN0U3RyZWFtcyhib29sZWFuIHJlZGlyZWN0U3RyZWFtcykgeworCisgICAgICAgIGJvb2xlYW4gb2xkUmVkaXJlY3RTdHJlYW1zID0gdGhpcy5yZWRpcmVjdFN0cmVhbXM7CisgICAgICAgIHRoaXMucmVkaXJlY3RTdHJlYW1zID0gcmVkaXJlY3RTdHJlYW1zOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicmVkaXJlY3RTdHJlYW1zIiwgbmV3IEJvb2xlYW4ob2xkUmVkaXJlY3RTdHJlYW1zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odGhpcy5yZWRpcmVjdFN0cmVhbXMpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IFJlYWxtIGZvciBvdXIgQ29udGFpbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVhbG0gZ2V0UmVhbG0oKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlYWxtKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWZhdWx0IFJlYWxtIGZvciBvdXIgQ29udGFpbmVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFsbSBUaGUgbmV3IGRlZmF1bHQgcmVhbG0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWFsbShSZWFsbSByZWFsbSkgeworCisgICAgICAgIFJlYWxtIG9sZFJlYWxtID0gdGhpcy5yZWFsbTsKKyAgICAgICAgdGhpcy5yZWFsbSA9IHJlYWxtOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicmVhbG0iLCBvbGRSZWFsbSwgdGhpcy5yZWFsbSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBd2FpdChib29sZWFuIGIpIHsKKyAgICAgICAgYXdhaXQgPSBiOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQXdhaXQoKSB7CisgICAgICAgIHJldHVybiBhd2FpdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYXRhbGluYUhvbWUoIFN0cmluZyBzICkgeworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoICJjYXRhbGluYS5ob21lIiwgcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2F0YWxpbmFCYXNlKCBTdHJpbmcgcyApIHsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCAiY2F0YWxpbmEuYmFzZSIsIHMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxpbmFIb21lKCkgeworICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5ob21lIik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDYXRhbGluYUJhc2UoKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IENvbm5lY3RvciB0byB0aGUgc2V0IG9mIGRlZmluZWQgQ29ubmVjdG9ycy4gIFRoZSBuZXdseQorICAgICAqIGFkZGVkIENvbm5lY3RvciB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBFbmdpbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdG9yIFRoZSBjb25uZWN0b3IgdG8gYmUgYWRkZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIG5vIGVuZ2luZXMgaGF2ZSBiZWVuIGFkZGVkIHlldAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDb25uZWN0b3IoQ29ubmVjdG9yIGNvbm5lY3RvcikgeworCisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIGNvbm5lY3RvciAoIiArIGNvbm5lY3Rvci5nZXRJbmZvKCkgKyAiKSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBDb250YWluZXIgdG8gc2VuZCByZXF1ZXN0cyB0bworICAgICAgICBpZiAoZW5naW5lcy5sZW5ndGggPCAxKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImVtYmVkZGVkLm5vRW5naW5lcyIpKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBZGQgdGhlIGNvbm5lY3Rvci4gVGhpcyB3aWxsIHNldCB0aGUgY29ubmVjdG9yJ3MgY29udGFpbmVyIHRvIHRoZQorICAgICAgICAgKiBtb3N0IHJlY2VudGx5IGFkZGVkIEVuZ2luZQorICAgICAgICAgKi8KKyAgICAgICAgc3VwZXIuYWRkQ29ubmVjdG9yKGNvbm5lY3Rvcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgRW5naW5lIHRvIHRoZSBzZXQgb2YgZGVmaW5lZCBFbmdpbmVzLgorICAgICAqCisgICAgICogQHBhcmFtIGVuZ2luZSBUaGUgZW5naW5lIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZEVuZ2luZShFbmdpbmUgZW5naW5lKSB7CisKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIGVuZ2luZSAoIiArIGVuZ2luZS5nZXRJbmZvKCkgKyAiKSIpOworCisgICAgICAgIC8vIEFkZCB0aGlzIEVuZ2luZSB0byBvdXIgc2V0IG9mIGRlZmluZWQgRW5naW5lcworICAgICAgICBFbmdpbmUgcmVzdWx0c1tdID0gbmV3IEVuZ2luZVtlbmdpbmVzLmxlbmd0aCArIDFdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZ2luZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZXN1bHRzW2ldID0gZW5naW5lc1tpXTsKKyAgICAgICAgcmVzdWx0c1tlbmdpbmVzLmxlbmd0aF0gPSBlbmdpbmU7CisgICAgICAgIGVuZ2luZXMgPSByZXN1bHRzOworCisgICAgICAgIC8vIFN0YXJ0IHRoaXMgRW5naW5lIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoc3RhcnRlZCAmJiAoZW5naW5lIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgZW5naW5lKS5zdGFydCgpOworICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVuZ2luZS5zdGFydCIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhpcy5jb250YWluZXIgPSBlbmdpbmU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUsIGNvbmZpZ3VyZSwgYW5kIHJldHVybiBhIG5ldyBUQ1AvSVAgc29ja2V0IGNvbm5lY3RvcgorICAgICAqIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGRyZXNzIEluZXRBZGRyZXNzIHRvIGJpbmQgdG8sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQorICAgICAqIGNvbm5lY3RvciBpcyBzdXBwb3NlZCB0byBiaW5kIHRvIGFsbCBhZGRyZXNzZXMgb24gdGhpcyBzZXJ2ZXIKKyAgICAgKiBAcGFyYW0gcG9ydCBQb3J0IG51bWJlciB0byBsaXN0ZW4gdG8KKyAgICAgKiBAcGFyYW0gc2VjdXJlIHRydWUgaWYgdGhlIGdlbmVyYXRlZCBjb25uZWN0b3IgaXMgc3VwcG9zZWQgdG8gYmUKKyAgICAgKiBTU0wtZW5hYmxlZCwgYW5kIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBDb25uZWN0b3IgY3JlYXRlQ29ubmVjdG9yKEluZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VjdXJlKSB7CisJcmV0dXJuIGNyZWF0ZUNvbm5lY3RvcihhZGRyZXNzICE9IG51bGw/IGFkZHJlc3MudG9TdHJpbmcoKSA6IG51bGwsCisJCQkgICAgICAgcG9ydCwgc2VjdXJlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29ubmVjdG9yIGNyZWF0ZUNvbm5lY3RvcihTdHJpbmcgYWRkcmVzcywgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZWN1cmUpIHsKKyAgICAgICAgU3RyaW5nIHByb3RvY29sID0gImh0dHAiOworICAgICAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgICAgICBwcm90b2NvbCA9ICJodHRwcyI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3JlYXRlQ29ubmVjdG9yKGFkZHJlc3MsIHBvcnQsIHByb3RvY29sKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBDb25uZWN0b3IgY3JlYXRlQ29ubmVjdG9yKEluZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbCkgeworCXJldHVybiBjcmVhdGVDb25uZWN0b3IoYWRkcmVzcyAhPSBudWxsPyBhZGRyZXNzLnRvU3RyaW5nKCkgOiBudWxsLAorCQkJICAgICAgIHBvcnQsIHByb3RvY29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29ubmVjdG9yIGNyZWF0ZUNvbm5lY3RvcihTdHJpbmcgYWRkcmVzcywgaW50IHBvcnQsCisJCQkJICAgICBTdHJpbmcgcHJvdG9jb2wpIHsKKworICAgICAgICBDb25uZWN0b3IgY29ubmVjdG9yID0gbnVsbDsKKworCWlmIChhZGRyZXNzICE9IG51bGwpIHsKKwkgICAgLyoKKwkgICAgICogSW5ldEFkZHJlc3MudG9TdHJpbmcoKSByZXR1cm5zIGEgc3RyaW5nIG9mIHRoZSBmb3JtCisJICAgICAqICI8aG9zdG5hbWU+LzxsaXRlcmFsX0lQPiIuIEdldCB0aGUgbGF0dGVyIHBhcnQsIHNvIHRoYXQgdGhlCisJICAgICAqIGFkZHJlc3MgY2FuIGJlIHBhcnNlZCAoYmFjaykgaW50byBhbiBJbmV0QWRkcmVzcyB1c2luZworCSAgICAgKiBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoKS4KKwkgICAgICovCisJICAgIGludCBpbmRleCA9IGFkZHJlc3MuaW5kZXhPZignLycpOworCSAgICBpZiAoaW5kZXggIT0gLTEpIHsKKwkJYWRkcmVzcyA9IGFkZHJlc3Muc3Vic3RyaW5nKGluZGV4ICsgMSk7CisJICAgIH0KKwl9CisKKwlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgY29ubmVjdG9yIGZvciBhZGRyZXNzPSciICsKKwkJICAgICAgKChhZGRyZXNzID09IG51bGwpID8gIkFMTCIgOiBhZGRyZXNzKSArCisJCSAgICAgICInIHBvcnQ9JyIgKyBwb3J0ICsgIicgcHJvdG9jb2w9JyIgKyBwcm90b2NvbCArICInIik7CisJfQorCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIGlmIChwcm90b2NvbC5lcXVhbHMoImFqcCIpKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3Rvcigib3JnLmFwYWNoZS5qay5zZXJ2ZXIuSmtDb3lvdGVIYW5kbGVyIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sLmVxdWFscygibWVtb3J5IikpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9yKCJvcmcuYXBhY2hlLmNveW90ZS5tZW1vcnkuTWVtb3J5UHJvdG9jb2xIYW5kbGVyIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sLmVxdWFscygiaHR0cCIpKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvcigpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwcm90b2NvbC5lcXVhbHMoImh0dHBzIikpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9yKCk7CisgICAgICAgICAgICAgICAgY29ubmVjdG9yLnNldFNjaGVtZSgiaHR0cHMiKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0b3Iuc2V0U2VjdXJlKHRydWUpOworICAgICAgICAgICAgICAgIC8vIEZJWE1FICEhISEgU0VUIFNTTCBQUk9QRVJUSUVTCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhZGRyZXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJbnRyb3NwZWN0aW9uVXRpbHMuc2V0UHJvcGVydHkoY29ubmVjdG9yLCAiYWRkcmVzcyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiArIGFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSW50cm9zcGVjdGlvblV0aWxzLnNldFByb3BlcnR5KGNvbm5lY3RvciwgInBvcnQiLCAiIiArIHBvcnQpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBjb25uZWN0b3IuIik7CisgICAgICAgIH0gCisKKyAgICAgICAgcmV0dXJuIChjb25uZWN0b3IpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlLCBjb25maWd1cmUsIGFuZCByZXR1cm4gYSBDb250ZXh0IHRoYXQgd2lsbCBwcm9jZXNzIGFsbAorICAgICAqIEhUVFAgcmVxdWVzdHMgcmVjZWl2ZWQgZnJvbSBvbmUgb2YgdGhlIGFzc29jaWF0ZWQgQ29ubmVjdG9ycywKKyAgICAgKiBhbmQgZGlyZWN0ZWQgdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGggb24gdGhlIHZpcnR1YWwgaG9zdAorICAgICAqIHRvIHdoaWNoIHRoaXMgQ29udGV4dCBpcyBjb25uZWN0ZWQuCisgICAgICogPHA+CisgICAgICogQWZ0ZXIgeW91IGhhdmUgY3VzdG9taXplZCB0aGUgcHJvcGVydGllcywgbGlzdGVuZXJzLCBhbmQgVmFsdmVzCisgICAgICogZm9yIHRoaXMgQ29udGV4dCwgeW91IG11c3QgYXR0YWNoIGl0IHRvIHRoZSBjb3JyZXNwb25kaW5nIEhvc3QKKyAgICAgKiBieSBjYWxsaW5nOgorICAgICAqIDxwcmU+CisgICAgICogICBob3N0LmFkZENoaWxkKGNvbnRleHQpOworICAgICAqIDwvcHJlPgorICAgICAqIHdoaWNoIHdpbGwgYWxzbyBjYXVzZSB0aGUgQ29udGV4dCB0byBiZSBzdGFydGVkIGlmIHRoZSBIb3N0IGhhcworICAgICAqIGFscmVhZHkgYmVlbiBzdGFydGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggQ29udGV4dCBwYXRoIG9mIHRoaXMgYXBwbGljYXRpb24gKCIiIGZvciB0aGUgZGVmYXVsdAorICAgICAqICBhcHBsaWNhdGlvbiBmb3IgdGhpcyBob3N0LCBtdXN0IHN0YXJ0IHdpdGggYSBzbGFzaCBvdGhlcndpc2UpCisgICAgICogQHBhcmFtIGRvY0Jhc2UgQWJzb2x1dGUgcGF0aG5hbWUgdG8gdGhlIGRvY3VtZW50IGJhc2UgZGlyZWN0b3J5CisgICAgICogIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW4gaW52YWxpZCBwYXJhbWV0ZXIKKyAgICAgKiAgaXMgc3BlY2lmaWVkCisgICAgICovCisgICAgcHVibGljIENvbnRleHQgY3JlYXRlQ29udGV4dChTdHJpbmcgcGF0aCwgU3RyaW5nIGRvY0Jhc2UpIHsKKworICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBjb250ZXh0ICciICsgcGF0aCArICInIHdpdGggZG9jQmFzZSAnIiArCisgICAgICAgICAgICAgICAgICAgICAgIGRvY0Jhc2UgKyAiJyIpOworCisgICAgICAgIFN0YW5kYXJkQ29udGV4dCBjb250ZXh0ID0gbmV3IFN0YW5kYXJkQ29udGV4dCgpOworCisgICAgICAgIGNvbnRleHQuc2V0RG9jQmFzZShkb2NCYXNlKTsKKyAgICAgICAgY29udGV4dC5zZXRQYXRoKHBhdGgpOworCisgICAgICAgIENvbnRleHRDb25maWcgY29uZmlnID0gbmV3IENvbnRleHRDb25maWcoKTsKKyAgICAgICAgY29uZmlnLnNldEN1c3RvbUF1dGhlbnRpY2F0b3JzKGF1dGhlbnRpY2F0b3JzKTsKKyAgICAgICAgKChMaWZlY3ljbGUpIGNvbnRleHQpLmFkZExpZmVjeWNsZUxpc3RlbmVyKGNvbmZpZyk7CisKKyAgICAgICAgcmV0dXJuIChjb250ZXh0KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCBjb25maWd1cmUsIGFuZCByZXR1cm4gYW4gRW5naW5lIHRoYXQgd2lsbCBwcm9jZXNzIGFsbAorICAgICAqIEhUVFAgcmVxdWVzdHMgcmVjZWl2ZWQgZnJvbSBvbmUgb2YgdGhlIGFzc29jaWF0ZWQgQ29ubmVjdG9ycywKKyAgICAgKiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIEVuZ2luZSBjcmVhdGVFbmdpbmUoKSB7CisKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgZW5naW5lIik7CisKKyAgICAgICAgU3RhbmRhcmRFbmdpbmUgZW5naW5lID0gbmV3IFN0YW5kYXJkRW5naW5lKCk7CisKKyAgICAgICAgLy8gRGVmYXVsdCBob3N0IHdpbGwgYmUgc2V0IHRvIHRoZSBmaXJzdCBob3N0IGFkZGVkCisgICAgICAgIGVuZ2luZS5zZXRSZWFsbShyZWFsbSk7ICAgICAgICAgLy8gSW5oZXJpdGVkIGJ5IGFsbCBjaGlsZHJlbgorCisgICAgICAgIHJldHVybiAoZW5naW5lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCBjb25maWd1cmUsIGFuZCByZXR1cm4gYSBIb3N0IHRoYXQgd2lsbCBwcm9jZXNzIGFsbAorICAgICAqIEhUVFAgcmVxdWVzdHMgcmVjZWl2ZWQgZnJvbSBvbmUgb2YgdGhlIGFzc29jaWF0ZWQgQ29ubmVjdG9ycywKKyAgICAgKiBhbmQgZGlyZWN0ZWQgdG8gdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGhvc3QuCisgICAgICogPHA+CisgICAgICogQWZ0ZXIgeW91IGhhdmUgY3VzdG9taXplZCB0aGUgcHJvcGVydGllcywgbGlzdGVuZXJzLCBhbmQgVmFsdmVzCisgICAgICogZm9yIHRoaXMgSG9zdCwgeW91IG11c3QgYXR0YWNoIGl0IHRvIHRoZSBjb3JyZXNwb25kaW5nIEVuZ2luZQorICAgICAqIGJ5IGNhbGxpbmc6CisgICAgICogPHByZT4KKyAgICAgKiAgIGVuZ2luZS5hZGRDaGlsZChob3N0KTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiB3aGljaCB3aWxsIGFsc28gY2F1c2UgdGhlIEhvc3QgdG8gYmUgc3RhcnRlZCBpZiB0aGUgRW5naW5lIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBzdGFydGVkLiAgSWYgdGhpcyBpcyB0aGUgZGVmYXVsdCAob3Igb25seSkgSG9zdCB5b3UKKyAgICAgKiB3aWxsIGJlIGRlZmluaW5nLCB5b3UgbWF5IGFsc28gdGVsbCB0aGUgRW5naW5lIHRvIHBhc3MgYWxsIHJlcXVlc3RzCisgICAgICogbm90IGFzc2lnbmVkIHRvIGFub3RoZXIgdmlydHVhbCBob3N0IHRvIHRoaXMgb25lOgorICAgICAqIDxwcmU+CisgICAgICogICBlbmdpbmUuc2V0RGVmYXVsdEhvc3QoaG9zdC5nZXROYW1lKCkpOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgQ2Fub25pY2FsIG5hbWUgb2YgdGhpcyB2aXJ0dWFsIGhvc3QKKyAgICAgKiBAcGFyYW0gYXBwQmFzZSBBYnNvbHV0ZSBwYXRobmFtZSB0byB0aGUgYXBwbGljYXRpb24gYmFzZSBkaXJlY3RvcnkKKyAgICAgKiAgZm9yIHRoaXMgdmlydHVhbCBob3N0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbiBpbnZhbGlkIHBhcmFtZXRlcgorICAgICAqICBpcyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgSG9zdCBjcmVhdGVIb3N0KFN0cmluZyBuYW1lLCBTdHJpbmcgYXBwQmFzZSkgeworCisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIGhvc3QgJyIgKyBuYW1lICsgIicgd2l0aCBhcHBCYXNlICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgYXBwQmFzZSArICInIik7CisKKyAgICAgICAgU3RhbmRhcmRIb3N0IGhvc3QgPSBuZXcgU3RhbmRhcmRIb3N0KCk7CisKKyAgICAgICAgaG9zdC5zZXRBcHBCYXNlKGFwcEJhc2UpOworICAgICAgICBob3N0LnNldE5hbWUobmFtZSk7CisKKyAgICAgICAgcmV0dXJuIChob3N0KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBjbGFzcyBsb2FkZXIgbWFuYWdlciB0aGF0IGNhbiBiZSBjdXN0b21pemVkLCBhbmQKKyAgICAgKiB0aGVuIGF0dGFjaGVkIHRvIGEgQ29udGV4dCwgYmVmb3JlIGl0IGlzIHN0YXJ0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IENsYXNzTG9hZGVyIHRoYXQgd2lsbCBiZSB0aGUgcGFyZW50IG9mIHRoZSBvbmUKKyAgICAgKiAgY3JlYXRlZCBieSB0aGlzIExvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXIgY3JlYXRlTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudCkgeworCisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIExvYWRlciB3aXRoIHBhcmVudCBjbGFzcyBsb2FkZXIgJyIgKworICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgKyAiJyIpOworCisgICAgICAgIFdlYmFwcExvYWRlciBsb2FkZXIgPSBuZXcgV2ViYXBwTG9hZGVyKHBhcmVudCk7CisgICAgICAgIHJldHVybiAobG9hZGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgU2VydmVyIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBDb250ZXh0IGZyb20gdGhlIHNldCBvZiBkZWZpbmVkIENvbnRleHRzIGZvciBpdHMKKyAgICAgKiBhc3NvY2lhdGVkIEhvc3QuICBJZiB0aGlzIGlzIHRoZSBsYXN0IENvbnRleHQgZm9yIHRoaXMgSG9zdCwgdGhlIEhvc3QKKyAgICAgKiB3aWxsIGFsc28gYmUgcmVtb3ZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0IHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQ29udGV4dChDb250ZXh0IGNvbnRleHQpIHsKKworICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJSZW1vdmluZyBjb250ZXh0WyIgKyBjb250ZXh0LmdldFBhdGgoKSArICJdIik7CisKKyAgICAgICAgLy8gSXMgdGhpcyBDb250ZXh0IGFjdHVhbGx5IGFtb25nIHRob3NlIHRoYXQgYXJlIGRlZmluZWQ/CisgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmdpbmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBDb250YWluZXIgaG9zdHNbXSA9IGVuZ2luZXNbaV0uZmluZENoaWxkcmVuKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGhvc3RzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgQ29udGFpbmVyIGNvbnRleHRzW10gPSBob3N0c1tqXS5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGNvbnRleHRzLmxlbmd0aDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ID09IChDb250ZXh0KSBjb250ZXh0c1trXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFJlbW92ZSB0aGlzIENvbnRleHQgZnJvbSB0aGUgYXNzb2NpYXRlZCBIb3N0CisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICBsb2cuZGVidWcoIiBSZW1vdmluZyB0aGlzIENvbnRleHQiKTsKKyAgICAgICAgY29udGV4dC5nZXRQYXJlbnQoKS5yZW1vdmVDaGlsZChjb250ZXh0KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgRW5naW5lIGZyb20gdGhlIHNldCBvZiBkZWZpbmVkIEVuZ2luZXMsIGFsb25nIHdpdGgKKyAgICAgKiBhbGwgb2YgaXRzIHJlbGF0ZWQgSG9zdHMgYW5kIENvbnRleHRzLiAgQWxsIGFzc29jaWF0ZWQgQ29ubmVjdG9ycyBhcmUKKyAgICAgKiBhbHNvIHJlbW92ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5naW5lIFRoZSBFbmdpbmUgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVFbmdpbmUoRW5naW5lIGVuZ2luZSkgeworCisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICBsb2cuZGVidWcoIlJlbW92aW5nIGVuZ2luZSAoIiArIGVuZ2luZS5nZXRJbmZvKCkgKyAiKSIpOworCisgICAgICAgIC8vIElzIHRoZSBzcGVjaWZpZWQgRW5naW5lIGFjdHVhbGx5IGRlZmluZWQ/CisgICAgICAgIGludCBqID0gLTE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5naW5lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGVuZ2luZSA9PSBlbmdpbmVzW2ldKSB7CisgICAgICAgICAgICAgICAgaiA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPCAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFJlbW92ZSBhbnkgQ29ubmVjdG9yIHRoYXQgaXMgdXNpbmcgdGhpcyBFbmdpbmUKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiIFJlbW92aW5nIHJlbGF0ZWQgQ29udGFpbmVycyIpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IG4gPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29ubmVjdG9ycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChjb25uZWN0b3JzW2ldLmdldENvbnRhaW5lcigpID09IChDb250YWluZXIpIGVuZ2luZSkgeworICAgICAgICAgICAgICAgICAgICBuID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmVtb3ZlQ29ubmVjdG9yKGNvbm5lY3RvcnNbbl0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcCB0aGlzIEVuZ2luZSBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKGVuZ2luZSBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBTdG9wcGluZyB0aGlzIEVuZ2luZSIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgZW5naW5lKS5zdG9wKCk7CisgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRW5naW5lLnN0b3AiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSB0aGlzIEVuZ2luZSBmcm9tIG91ciBzZXQgb2YgZGVmaW5lZCBFbmdpbmVzCisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICBsb2cuZGVidWcoIiBSZW1vdmluZyB0aGlzIEVuZ2luZSIpOworICAgICAgICBpbnQgayA9IDA7CisgICAgICAgIEVuZ2luZSByZXN1bHRzW10gPSBuZXcgRW5naW5lW2VuZ2luZXMubGVuZ3RoIC0gMV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5naW5lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgIT0gaikKKyAgICAgICAgICAgICAgICByZXN1bHRzW2srK10gPSBlbmdpbmVzW2ldOworICAgICAgICB9CisgICAgICAgIGVuZ2luZXMgPSByZXN1bHRzOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBIb3N0LCBhbG9uZyB3aXRoIGFsbCBvZiBpdHMgcmVsYXRlZCBDb250ZXh0cywKKyAgICAgKiBmcm9tIHRoZSBzZXQgb2YgZGVmaW5lZCBIb3N0cyBmb3IgaXRzIGFzc29jaWF0ZWQgRW5naW5lLiAgSWYgdGhpcyBpcworICAgICAqIHRoZSBsYXN0IEhvc3QgZm9yIHRoaXMgRW5naW5lLCB0aGUgRW5naW5lIHdpbGwgYWxzbyBiZSByZW1vdmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGhvc3QgVGhlIEhvc3QgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVIb3N0KEhvc3QgaG9zdCkgeworCisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICBsb2cuZGVidWcoIlJlbW92aW5nIGhvc3RbIiArIGhvc3QuZ2V0TmFtZSgpICsgIl0iKTsKKworICAgICAgICAvLyBJcyB0aGlzIEhvc3QgYWN0dWFsbHkgYW1vbmcgdGhvc2UgdGhhdCBhcmUgZGVmaW5lZD8KKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZ2luZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENvbnRhaW5lciBob3N0c1tdID0gZW5naW5lc1tpXS5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaG9zdHMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaG9zdCA9PSAoSG9zdCkgaG9zdHNbal0pIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFJlbW92ZSB0aGlzIEhvc3QgZnJvbSB0aGUgYXNzb2NpYXRlZCBFbmdpbmUKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiIFJlbW92aW5nIHRoaXMgSG9zdCIpOworICAgICAgICBob3N0LmdldFBhcmVudCgpLnJlbW92ZUNoaWxkKGhvc3QpOworCisgICAgfQorCisKKyAgICAvKgorICAgICAqIE1hcHMgdGhlIHNwZWNpZmllZCBsb2dpbiBtZXRob2QgdG8gdGhlIHNwZWNpZmllZCBhdXRoZW50aWNhdG9yLCBhbGxvd2luZworICAgICAqIHRoZSBtYXBwaW5ncyBpbiBvcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQXV0aGVudGljYXRvcnMucHJvcGVydGllcworICAgICAqIHRvIGJlIG92ZXJyaWRkZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXV0aGVudGljYXRvciBBdXRoZW50aWNhdG9yIHRvIGhhbmRsZSBhdXRoZW50aWNhdGlvbiBmb3IgdGhlCisgICAgICogc3BlY2lmaWVkIGxvZ2luIG1ldGhvZAorICAgICAqIEBwYXJhbSBsb2dpbk1ldGhvZCBMb2dpbiBtZXRob2QgdGhhdCBtYXBzIHRvIHRoZSBzcGVjaWZpZWQgYXV0aGVudGljYXRvcgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBhdXRoZW50aWNhdG9yIGRvZXMgbm90CisgICAgICogaW1wbGVtZW50IHRoZSBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlIGludGVyZmFjZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEF1dGhlbnRpY2F0b3IoQXV0aGVudGljYXRvciBhdXRoZW50aWNhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvZ2luTWV0aG9kKSB7CisgICAgICAgIGlmICghKGF1dGhlbnRpY2F0b3IgaW5zdGFuY2VvZiBWYWx2ZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJlbWJlZGRlZC5hdXRoZW50aWNhdG9yTm90SW5zdGFuY2VPZlZhbHZlIikpOworICAgICAgICB9CisgICAgICAgIGlmIChhdXRoZW50aWNhdG9ycyA9PSBudWxsKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRvcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdG9ycyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF1dGhlbnRpY2F0b3JzLnB1dChsb2dpbk1ldGhvZCwgYXV0aGVudGljYXRvcik7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlmZWN5Y2xlIGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaWZlY3ljbGUuIElmIHRoaXMgCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiBsaWZlY3ljbGUuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIDxjb2RlPmNvbmZpZ3VyZSgpPC9jb2RlPiwKKyAgICAgKiBhbmQgYmVmb3JlIGFueSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhlIGNvbXBvbmVudCBhcmUgdXRpbGl6ZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyB0aGlzIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIGlmKCBsb2cuaXNJbmZvRW5hYmxlZCgpICkKKyAgICAgICAgICAgIGxvZy5pbmZvKCJTdGFydGluZyB0b21jYXQgc2VydmVyIik7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHNldHVwIG9mIG91ciByZXF1aXJlZCBzeXN0ZW0gcHJvcGVydGllcworICAgICAgICBpbml0RGlycygpOworCisgICAgICAgIC8vIEluaXRpYWxpemUgc29tZSBuYW1pbmcgc3BlY2lmaWMgcHJvcGVydGllcworICAgICAgICBpbml0TmFtaW5nKCk7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiZW1iZWRkZWQuYWxyZWFkeVN0YXJ0ZWQiKSk7CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworCisgICAgICAgIC8vIFN0YXJ0IG91ciBkZWZpbmVkIEVuZ2luZXMgZmlyc3QKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmdpbmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZW5naW5lc1tpXSBpbnN0YW5jZW9mIExpZmVjeWNsZSkKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgZW5naW5lc1tpXSkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXJ0IG91ciBkZWZpbmVkIENvbm5lY3RvcnMgc2Vjb25kCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29ubmVjdG9ycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29ubmVjdG9yc1tpXS5pbml0aWFsaXplKCk7CisgICAgICAgICAgICBpZiAoY29ubmVjdG9yc1tpXSBpbnN0YW5jZW9mIExpZmVjeWNsZSkKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY29ubmVjdG9yc1tpXSkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHRlcm1pbmF0ZSB0aGUgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB0aGUgbGFzdCBvbmUgY2FsbGVkIG9uIGEgZ2l2ZW4KKyAgICAgKiBpbnN0YW5jZSBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICBsb2cuZGVidWcoIlN0b3BwaW5nIGVtYmVkZGVkIHNlcnZlciIpOworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmICghc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJlbWJlZGRlZC5ub3RTdGFydGVkIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUT1BfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gZmFsc2U7CisKKyAgICAgICAgLy8gU3RvcCBvdXIgZGVmaW5lZCBDb25uZWN0b3JzIGZpcnN0CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29ubmVjdG9ycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNvbm5lY3RvcnNbaV0gaW5zdGFuY2VvZiBMaWZlY3ljbGUpCisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNvbm5lY3RvcnNbaV0pLnN0b3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3Agb3VyIGRlZmluZWQgRW5naW5lcyBzZWNvbmQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmdpbmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZW5naW5lc1tpXSBpbnN0YW5jZW9mIExpZmVjeWNsZSkKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgZW5naW5lc1tpXSkuc3RvcCgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKiogSW5pdGlhbGl6ZSBuYW1pbmcgLSB0aGlzIHNob3VsZCBvbmx5IGVuYWJsZSBqYXZhOmVudiBhbmQgcm9vdCBuYW1pbmcuCisgICAgICogSWYgdG9tY2F0IGlzIGVtYmVkZWQgaW4gYW4gYXBwbGljYXRpb24gdGhhdCBhbHJlYWR5IGRlZmluZXMgdGhvc2UgLQorICAgICAqIGl0IHNob3VsZG4ndCBkbyBpdC4KKyAgICAgKgorICAgICAqIFhYWCBUaGUgMiBzaG91bGQgYmUgc2VwYXJhdGVkLCB5b3UgbWF5IHdhbnQgdG8gZW5hYmxlIGphdmE6IGJ1dCBub3QKKyAgICAgKiB0aGUgaW5pdGlhbCBjb250ZXh0IGFuZCB0aGUgcmV2ZXJzZQorICAgICAqIFhYWCBDYW4gd2UgImd1ZXNzIiAtIGkuZS4gbG9va3VwIGphdmE6IGFuZCBpZiBzb21ldGhpbmcgaXMgcmV0dXJuZWQgYXNzdW1lCisgICAgICogZmFsc2UgPworICAgICAqIFhYWCBXZSBoYXZlIGEgbWFqb3IgcHJvYmxlbSB3aXRoIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIGphdmE6IHVybAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGluaXROYW1pbmcoKSB7CisgICAgICAgIC8vIFNldHRpbmcgYWRkaXRpb25hbCB2YXJpYWJsZXMKKyAgICAgICAgaWYgKCF1c2VOYW1pbmcpIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKCAiQ2F0YWxpbmEgbmFtaW5nIGRpc2FibGVkIik7CisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhdGFsaW5hLnVzZU5hbWluZyIsICJmYWxzZSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXRhbGluYS51c2VOYW1pbmciLCAidHJ1ZSIpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gIm9yZy5hcGFjaGUubmFtaW5nIjsKKyAgICAgICAgICAgIFN0cmluZyBvbGRWYWx1ZSA9CisgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KGphdmF4Lm5hbWluZy5Db250ZXh0LlVSTF9QS0dfUFJFRklYRVMpOworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgIjoiICsgb2xkVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoamF2YXgubmFtaW5nLkNvbnRleHQuVVJMX1BLR19QUkVGSVhFUywgdmFsdWUpOworICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgbmFtaW5nIHByZWZpeD0iICsgdmFsdWUpOworICAgICAgICAgICAgdmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkKKyAgICAgICAgICAgICAgICAoamF2YXgubmFtaW5nLkNvbnRleHQuSU5JVElBTF9DT05URVhUX0ZBQ1RPUlkpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgKGphdmF4Lm5hbWluZy5Db250ZXh0LklOSVRJQUxfQ09OVEVYVF9GQUNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubmFtaW5nLmphdmEuamF2YVVSTENvbnRleHRGYWN0b3J5Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyggIklOSVRJQUxfQ09OVEVYVF9GQUNUT1JZIGFscmVhZCBzZXQgIiArIHZhbHVlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByb3RlY3RlZCB2b2lkIGluaXREaXJzKCkgeworCisgICAgICAgIFN0cmluZyBjYXRhbGluYUhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmhvbWUiKTsKKyAgICAgICAgaWYgKGNhdGFsaW5hSG9tZSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBwYXRjaCBmb3IgSjJFRSBSSSAxLjMKKyAgICAgICAgICAgIFN0cmluZyBqMmVlSG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY29tLnN1bi5lbnRlcnByaXNlLmhvbWUiKTsKKyAgICAgICAgICAgIGlmIChqMmVlSG9tZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2F0YWxpbmFIb21lPVN5c3RlbS5nZXRQcm9wZXJ0eSgiY29tLnN1bi5lbnRlcnByaXNlLmhvbWUiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhdGFsaW5hSG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBVc2UgSW50cm9zcGVjdGlvblV0aWxzIGFuZCBndWVzcyB0aGUgZGlyCisgICAgICAgICAgICAgICAgY2F0YWxpbmFIb21lID0gSW50cm9zcGVjdGlvblV0aWxzLmd1ZXNzSW5zdGFsbAorICAgICAgICAgICAgICAgICAgICAoImNhdGFsaW5hLmhvbWUiLCAiY2F0YWxpbmEuYmFzZSIsICJjYXRhbGluYS5qYXIiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2F0YWxpbmFIb21lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2F0YWxpbmFIb21lID0gSW50cm9zcGVjdGlvblV0aWxzLmd1ZXNzSW5zdGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgKCJ0b21jYXQuaW5zdGFsbCIsICJjYXRhbGluYS5ob21lIiwgInRvbWNhdC5qYXIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gbGFzdCByZXNvcnQgLSBmb3IgbWluaW1hbC9lbWJlZGRlZCBjYXNlcy4gCisgICAgICAgIGlmKGNhdGFsaW5hSG9tZT09bnVsbCkgeworICAgICAgICAgICAgY2F0YWxpbmFIb21lPVN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2F0YWxpbmFIb21lICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpbGUgaG9tZSA9IG5ldyBGaWxlKGNhdGFsaW5hSG9tZSk7CisgICAgICAgICAgICBpZiAoIWhvbWUuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2F0YWxpbmFIb21lID0gaG9tZS5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBjYXRhbGluYUhvbWUgPSBob21lLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2F0YWxpbmEuaG9tZSIsIGNhdGFsaW5hSG9tZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIikgPT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRhbGluYUhvbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIGNhdGFsaW5hQmFzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpOworICAgICAgICAgICAgRmlsZSBiYXNlID0gbmV3IEZpbGUoY2F0YWxpbmFCYXNlKTsKKyAgICAgICAgICAgIGlmICghYmFzZS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjYXRhbGluYUJhc2UgPSBiYXNlLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhdGFsaW5hQmFzZSA9IGJhc2UuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiwgY2F0YWxpbmFCYXNlKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIHRlbXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7CisgICAgICAgIGlmICh0ZW1wID09IG51bGwgfHwgKCEobmV3IEZpbGUodGVtcCkpLmV4aXN0cygpKQorICAgICAgICAgICAgICAgIHx8ICghKG5ldyBGaWxlKHRlbXApKS5pc0RpcmVjdG9yeSgpKSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiZW1iZWRkZWQubm90bXAiLCB0ZW1wKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGluaXRTdHJlYW1zKCkgeworICAgICAgICBpZiAocmVkaXJlY3RTdHJlYW1zKSB7CisgICAgICAgICAgICAvLyBSZXBsYWNlIFN5c3RlbS5vdXQgYW5kIFN5c3RlbS5lcnIgd2l0aCBhIGN1c3RvbSBQcmludFN0cmVhbQorICAgICAgICAgICAgU3lzdGVtTG9nSGFuZGxlciBzeXN0ZW1sb2cgPSBuZXcgU3lzdGVtTG9nSGFuZGxlcihTeXN0ZW0ub3V0KTsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRPdXQoc3lzdGVtbG9nKTsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRFcnIoc3lzdGVtbG9nKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZWN1cml0eSBwYWNrYWdlIGFjY2Vzcy9wcm90ZWN0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFNlY3VyaXR5UHJvdGVjdGlvbigpeworICAgICAgICBTZWN1cml0eUNvbmZpZyBzZWN1cml0eUNvbmZpZyA9IFNlY3VyaXR5Q29uZmlnLm5ld0luc3RhbmNlKCk7CisgICAgICAgIHNlY3VyaXR5Q29uZmlnLnNldFBhY2thZ2VEZWZpbml0aW9uKCk7CisgICAgICAgIHNlY3VyaXR5Q29uZmlnLnNldFBhY2thZ2VBY2Nlc3MoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0VuZ2luZUNvbmZpZy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvRW5naW5lQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiOGM5MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0VuZ2luZUNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworCisKKy8qKgorICogU3RhcnR1cCBldmVudCBsaXN0ZW5lciBmb3IgYSA8Yj5FbmdpbmU8L2I+IHRoYXQgY29uZmlndXJlcyB0aGUgcHJvcGVydGllcworICogb2YgdGhhdCBFbmdpbmUsIGFuZCB0aGUgYXNzb2NpYXRlZCBkZWZpbmVkIGNvbnRleHRzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRW5naW5lQ29uZmlnCisgICAgaW1wbGVtZW50cyBMaWZlY3ljbGVMaXN0ZW5lciB7CisKKworICAgIHByb3RlY3RlZCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIEVuZ2luZUNvbmZpZy5jbGFzcyApOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBFbmdpbmUgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRW5naW5lIGVuZ2luZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgcmVzb3VyY2VzIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIFNUQVJUIGV2ZW50IGZvciBhbiBhc3NvY2lhdGVkIEVuZ2luZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgbGlmZWN5Y2xlIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgbGlmZWN5Y2xlRXZlbnQoTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKKworICAgICAgICAvLyBJZGVudGlmeSB0aGUgZW5naW5lIHdlIGFyZSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVuZ2luZSA9IChFbmdpbmUpIGV2ZW50LmdldExpZmVjeWNsZSgpOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiZW5naW5lQ29uZmlnLmNjZSIsIGV2ZW50LmdldExpZmVjeWNsZSgpKSwgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZXNzIHRoZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpLmVxdWFscyhMaWZlY3ljbGUuU1RBUlRfRVZFTlQpKQorICAgICAgICAgICAgc3RhcnQoKTsKKyAgICAgICAgZWxzZSBpZiAoZXZlbnQuZ2V0VHlwZSgpLmVxdWFscyhMaWZlY3ljbGUuU1RPUF9FVkVOVCkpCisgICAgICAgICAgICBzdG9wKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSAic3RhcnQiIGV2ZW50IGZvciB0aGlzIEVuZ2luZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydCgpIHsKKworICAgICAgICBpZiAoZW5naW5lLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBlbmdpbmUuZ2V0TG9nZ2VyKCkuZGVidWcoc20uZ2V0U3RyaW5nKCJlbmdpbmVDb25maWcuc3RhcnQiKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSAic3RvcCIgZXZlbnQgZm9yIHRoaXMgRW5naW5lLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0b3AoKSB7CisKKyAgICAgICAgaWYgKGVuZ2luZS5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgZW5naW5lLmdldExvZ2dlcigpLmRlYnVnKHNtLmdldFN0cmluZygiZW5naW5lQ29uZmlnLnN0b3AiKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvRW5naW5lUnVsZVNldC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvRW5naW5lUnVsZVNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOTViOGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9FbmdpbmVSdWxlU2V0LmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLkRpZ2VzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuUnVsZVNldEJhc2U7CisKKworLyoqCisgKiA8cD48c3Ryb25nPlJ1bGVTZXQ8L3N0cm9uZz4gZm9yIHByb2Nlc3NpbmcgdGhlIGNvbnRlbnRzIG9mIGEKKyAqIEVuZ2luZSBkZWZpbml0aW9uIGVsZW1lbnQuICBUaGlzIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IGRvZXMgTk9UIGluY2x1ZGUKKyAqIGFueSBydWxlcyBmb3IgbmVzdGVkIEhvc3Qgb3IgRGVmYXVsdENvbnRleHQgZWxlbWVudHMsIHdoaWNoIHNob3VsZAorICogYmUgYWRkZWQgdmlhIGluc3RhbmNlcyBvZiA8Y29kZT5Ib3N0UnVsZVNldDwvY29kZT4gb3IKKyAqIDxjb2RlPkNvbnRleHRSdWxlU2V0PC9jb2RlPiwgcmVzcGVjdGl2ZWx5LjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEVuZ2luZVJ1bGVTZXQgZXh0ZW5kcyBSdWxlU2V0QmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXggdG8gdXNlIGZvciByZWNvZ25pemluZyBvdXIgZWxlbWVudHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwcmVmaXggPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+UnVsZVNldDwvY29kZT4gd2l0aCB0aGUgZGVmYXVsdAorICAgICAqIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4LgorICAgICAqLworICAgIHB1YmxpYyBFbmdpbmVSdWxlU2V0KCkgeworCisgICAgICAgIHRoaXMoIiIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5SdWxlU2V0PC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggUHJlZml4IGZvciBtYXRjaGluZyBwYXR0ZXJuIHJ1bGVzIChpbmNsdWRpbmcgdGhlCisgICAgICogIHRyYWlsaW5nIHNsYXNoIGNoYXJhY3RlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgRW5naW5lUnVsZVNldChTdHJpbmcgcHJlZml4KSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBudWxsOworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIDxwPkFkZCB0aGUgc2V0IG9mIFJ1bGUgaW5zdGFuY2VzIGRlZmluZWQgaW4gdGhpcyBSdWxlU2V0IHRvIHRoZQorICAgICAqIHNwZWNpZmllZCA8Y29kZT5EaWdlc3RlcjwvY29kZT4gaW5zdGFuY2UsIGFzc29jaWF0aW5nIHRoZW0gd2l0aAorICAgICAqIG91ciBuYW1lc3BhY2UgVVJJIChpZiBhbnkpLiAgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkCisgICAgICogYnkgYSBEaWdlc3RlciBpbnN0YW5jZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlnZXN0ZXIgRGlnZXN0ZXIgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG5ldyBSdWxlIGluc3RhbmNlcworICAgICAqICBzaG91bGQgYmUgYWRkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUnVsZUluc3RhbmNlcyhEaWdlc3RlciBkaWdlc3RlcikgeworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiRW5naW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRFbmdpbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJFbmdpbmUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAiRW5naW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTGlmZWN5Y2xlTGlzdGVuZXJSdWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuRW5naW5lQ29uZmlnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImVuZ2luZUNvbmZpZ0NsYXNzIikpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJFbmdpbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRDb250YWluZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lciIpOworCisgICAgICAgIC8vQ2x1c3RlciBjb25maWd1cmF0aW9uIHN0YXJ0CisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiRW5naW5lL0NsdXN0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiRW5naW5lL0NsdXN0ZXIiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiRW5naW5lL0NsdXN0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRDbHVzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5DbHVzdGVyIik7CisgICAgICAgIC8vQ2x1c3RlciBjb25maWd1cmF0aW9uIGVuZAorCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiRW5naW5lL0xpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkVuZ2luZS9MaXN0ZW5lciIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJFbmdpbmUvTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRMaWZlY3ljbGVMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXIiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkVuZ2luZS9Mb2dnZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiRW5naW5lL0xvZ2dlciIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJFbmdpbmUvTG9nZ2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TG9nZ2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5Mb2dnZXIiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkVuZ2luZS9SZWFsbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBNVVNUIGJlIHNwZWNpZmllZCBpbiB0aGUgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJFbmdpbmUvUmVhbG0iKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiRW5naW5lL1JlYWxtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0UmVhbG0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJFbmdpbmUvVmFsdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiRW5naW5lL1ZhbHZlIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIkVuZ2luZS9WYWx2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFZhbHZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZSIpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0V4cGFuZFdhci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvRXhwYW5kV2FyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc4MzMwMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0V4cGFuZFdhci5qYXZhCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSmFyVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisvKioKKyAqIEV4cGFuZCBvdXQgYSBXQVIgaW4gYSBIb3N0J3MgYXBwQmFzZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEBhdXRob3IgR2xlbm4gTC4gTmllbHNlbgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK3B1YmxpYyBjbGFzcyBFeHBhbmRXYXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEV4cGFuZFdhci5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIHJlc291cmNlcyBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIEV4cGFuZCB0aGUgV0FSIGZpbGUgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBVUkwgaW50byBhbiB1bnBhY2tlZAorICAgICAqIGRpcmVjdG9yeSBzdHJ1Y3R1cmUsIGFuZCByZXR1cm4gdGhlIGFic29sdXRlIHBhdGhuYW1lIHRvIHRoZSBleHBhbmRlZAorICAgICAqIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBob3N0IEhvc3Qgd2FyIGlzIGJlaW5nIGluc3RhbGxlZCBmb3IKKyAgICAgKiBAcGFyYW0gd2FyIFVSTCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgdG8gYmUgZXhwYW5kZWQKKyAgICAgKiAgKG11c3Qgc3RhcnQgd2l0aCAiamFyOiIpCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIGlzIG5vdCBhICJqYXI6IiBVUkwKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciB3YXMgZW5jb3VudGVyZWQKKyAgICAgKiAgZHVyaW5nIGV4cGFuc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cGFuZChIb3N0IGhvc3QsIFVSTCB3YXIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkaXJlY3RvcnkgbmFtZSBvZiB0aGUgZXhwYW5kZWQgZGlyZWN0b3J5CisgICAgICAgIGlmIChob3N0LmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGhvc3QuZ2V0TG9nZ2VyKCkuZGVidWcoImV4cGFuZCgiICsgd2FyLnRvU3RyaW5nKCkgKyAiKSIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBwYXRobmFtZSA9IHdhci50b1N0cmluZygpLnJlcGxhY2UoJ1xcJywgJy8nKTsKKyAgICAgICAgaWYgKHBhdGhuYW1lLmVuZHNXaXRoKCIhLyIpKSB7CisgICAgICAgICAgICBwYXRobmFtZSA9IHBhdGhuYW1lLnN1YnN0cmluZygwLCBwYXRobmFtZS5sZW5ndGgoKSAtIDIpOworICAgICAgICB9CisgICAgICAgIGludCBwZXJpb2QgPSBwYXRobmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICBpZiAocGVyaW9kID49IHBhdGhuYW1lLmxlbmd0aCgpIC0gNCkKKyAgICAgICAgICAgIHBhdGhuYW1lID0gcGF0aG5hbWUuc3Vic3RyaW5nKDAsIHBlcmlvZCk7CisgICAgICAgIGludCBzbGFzaCA9IHBhdGhuYW1lLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgIGlmIChzbGFzaCA+PSAwKSB7CisgICAgICAgICAgICBwYXRobmFtZSA9IHBhdGhuYW1lLnN1YnN0cmluZyhzbGFzaCArIDEpOworICAgICAgICB9CisgICAgICAgIGlmIChob3N0LmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGhvc3QuZ2V0TG9nZ2VyKCkuZGVidWcoIiAgUHJvcG9zZWQgZGlyZWN0b3J5IG5hbWU6ICIgKyBwYXRobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4cGFuZChob3N0LCB3YXIsIHBhdGhuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRXhwYW5kIHRoZSBXQVIgZmlsZSBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIFVSTCBpbnRvIGFuIHVucGFja2VkCisgICAgICogZGlyZWN0b3J5IHN0cnVjdHVyZSwgYW5kIHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aG5hbWUgdG8gdGhlIGV4cGFuZGVkCisgICAgICogZGlyZWN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIGhvc3QgSG9zdCB3YXIgaXMgYmVpbmcgaW5zdGFsbGVkIGZvcgorICAgICAqIEBwYXJhbSB3YXIgVVJMIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSB0byBiZSBleHBhbmRlZAorICAgICAqICAobXVzdCBzdGFydCB3aXRoICJqYXI6IikKKyAgICAgKiBAcGFyYW0gcGF0aG5hbWUgQ29udGV4dCBwYXRoIG5hbWUgZm9yIHdlYiBhcHBsaWNhdGlvbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYSAiamFyOiIgVVJMCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igd2FzIGVuY291bnRlcmVkCisgICAgICogIGR1cmluZyBleHBhbnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBleHBhbmQoSG9zdCBob3N0LCBVUkwgd2FyLCBTdHJpbmcgcGF0aG5hbWUpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgbm8gc3VjaCBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdGluZworICAgICAgICBGaWxlIGFwcEJhc2UgPSBuZXcgRmlsZShob3N0LmdldEFwcEJhc2UoKSk7CisgICAgICAgIGlmICghYXBwQmFzZS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgIGFwcEJhc2UgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0LmdldEFwcEJhc2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhcHBCYXNlLmV4aXN0cygpIHx8ICFhcHBCYXNlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImhvc3RDb25maWcuYXBwQmFzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBCYXNlLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgRmlsZSBkb2NCYXNlID0gbmV3IEZpbGUoYXBwQmFzZSwgcGF0aG5hbWUpOworICAgICAgICBpZiAoZG9jQmFzZS5leGlzdHMoKSkgeworICAgICAgICAgICAgLy8gV2FyIGZpbGUgaXMgYWxyZWFkeSBpbnN0YWxsZWQKKyAgICAgICAgICAgIHJldHVybiAoZG9jQmFzZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgdGhlIG5ldyBkb2N1bWVudCBiYXNlIGRpcmVjdG9yeQorICAgICAgICBkb2NCYXNlLm1rZGlyKCk7CisKKyAgICAgICAgLy8gRXhwYW5kIHRoZSBXQVIgaW50byB0aGUgbmV3IGRvY3VtZW50IGJhc2UgZGlyZWN0b3J5CisgICAgICAgIEphclVSTENvbm5lY3Rpb24ganVjID0gKEphclVSTENvbm5lY3Rpb24pIHdhci5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICBqdWMuc2V0VXNlQ2FjaGVzKGZhbHNlKTsKKyAgICAgICAgSmFyRmlsZSBqYXJGaWxlID0gbnVsbDsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgamFyRmlsZSA9IGp1Yy5nZXRKYXJGaWxlKCk7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBqYXJFbnRyaWVzID0gamFyRmlsZS5lbnRyaWVzKCk7CisgICAgICAgICAgICB3aGlsZSAoamFyRW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIEphckVudHJ5IGphckVudHJ5ID0gKEphckVudHJ5KSBqYXJFbnRyaWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBqYXJFbnRyeS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaW50IGxhc3QgPSBuYW1lLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgaWYgKGxhc3QgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIHBhcmVudCA9IG5ldyBGaWxlKGRvY0Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5zdWJzdHJpbmcoMCwgbGFzdCkpOworICAgICAgICAgICAgICAgICAgICBwYXJlbnQubWtkaXJzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlucHV0ID0gamFyRmlsZS5nZXRJbnB1dFN0cmVhbShqYXJFbnRyeSk7CisKKyAgICAgICAgICAgICAgICAvLyBCdWd6aWxsYSAzMzYzNgorICAgICAgICAgICAgICAgIEZpbGUgZXhwYW5kZWRGaWxlID0gZXhwYW5kKGlucHV0LCBkb2NCYXNlLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGphckVudHJ5LmdldFRpbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoKGxhc3RNb2RpZmllZCAhPSAtMSkgJiYgKGxhc3RNb2RpZmllZCAhPSAwKSAmJiAoZXhwYW5kZWRGaWxlICE9IG51bGwpKSB7CisgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkRmlsZS5zZXRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOworICAgICAgICAgICAgICAgIGlucHV0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWYgc29tZXRoaW5nIHdlbnQgd3JvbmcsIGRlbGV0ZSBleHBhbmRlZCBkaXIgdG8ga2VlcCB0aGluZ3MgCisgICAgICAgICAgICAvLyBjbGVhbgorICAgICAgICAgICAgZGVsZXRlRGlyKGRvY0Jhc2UpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlucHV0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqYXJGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBqYXJGaWxlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBqYXJGaWxlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCB0byBvdXIgbmV3IGRvY3VtZW50IGJhc2UgZGlyZWN0b3J5CisgICAgICAgIHJldHVybiAoZG9jQmFzZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIHNwZWNpZmllZCBmaWxlIG9yIGRpcmVjdG9yeSB0byB0aGUgZGVzdGluYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc291cmNlCisgICAgICogQHBhcmFtIGRlc3QgRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZXN0aW5hdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb3B5KEZpbGUgc3JjLCBGaWxlIGRlc3QpIHsKKyAgICAgICAgCisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBmaWxlc1tdID0gbnVsbDsKKyAgICAgICAgaWYgKHNyYy5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBmaWxlcyA9IHNyYy5saXN0KCk7CisgICAgICAgICAgICByZXN1bHQgPSBkZXN0Lm1rZGlyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxlcyA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICBmaWxlc1swXSA9ICIiOworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBmaWxlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IChpIDwgZmlsZXMubGVuZ3RoKSAmJiByZXN1bHQ7IGkrKykgeworICAgICAgICAgICAgRmlsZSBmaWxlU3JjID0gbmV3IEZpbGUoc3JjLCBmaWxlc1tpXSk7CisgICAgICAgICAgICBGaWxlIGZpbGVEZXN0ID0gbmV3IEZpbGUoZGVzdCwgZmlsZXNbaV0pOworICAgICAgICAgICAgaWYgKGZpbGVTcmMuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvcHkoZmlsZVNyYywgZmlsZURlc3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBGaWxlQ2hhbm5lbCBpYyA9IG51bGw7CisgICAgICAgICAgICAgICAgRmlsZUNoYW5uZWwgb2MgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGljID0gKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZVNyYykpLmdldENoYW5uZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgb2MgPSAobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZURlc3QpKS5nZXRDaGFubmVsKCk7CisgICAgICAgICAgICAgICAgICAgIGljLnRyYW5zZmVyVG8oMCwgaWMuc2l6ZSgpLCBvYyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJleHBhbmRXYXIuY29weSIsIGZpbGVTcmMsIGZpbGVEZXN0KSwgZSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9jICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogRGVsZXRlIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LCBpbmNsdWRpbmcgYWxsIG9mIGl0cyBjb250ZW50cyBhbmQKKyAgICAgKiBzdWJkaXJlY3RvcmllcyByZWN1cnNpdmVseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXIgRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkaXJlY3RvcnkgdG8gYmUgZGVsZXRlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGUoRmlsZSBkaXIpIHsKKyAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZGVsZXRlRGlyKGRpcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZGlyLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSwgaW5jbHVkaW5nIGFsbCBvZiBpdHMgY29udGVudHMgYW5kCisgICAgICogc3ViZGlyZWN0b3JpZXMgcmVjdXJzaXZlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGlyZWN0b3J5IHRvIGJlIGRlbGV0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlRGlyKEZpbGUgZGlyKSB7CisKKyAgICAgICAgU3RyaW5nIGZpbGVzW10gPSBkaXIubGlzdCgpOworICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgZmlsZXMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pOworICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGRlbGV0ZURpcihmaWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGlyLmRlbGV0ZSgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFeHBhbmQgdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0gaW50byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSwgY3JlYXRpbmcKKyAgICAgKiBhIGZpbGUgbmFtZWQgZnJvbSB0aGUgc3BlY2lmaWVkIHJlbGF0aXZlIHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXQgSW5wdXRTdHJlYW0gdG8gYmUgY29waWVkCisgICAgICogQHBhcmFtIGRvY0Jhc2UgRG9jdW1lbnQgYmFzZSBkaXJlY3RvcnkgaW50byB3aGljaCB3ZSBhcmUgZXhwYW5kaW5nCisgICAgICogQHBhcmFtIG5hbWUgUmVsYXRpdmUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgY3JlYXRlZAorICAgICAqIEByZXR1cm4gQSBoYW5kbGUgdG8gdGhlIGV4cGFuZGVkIEZpbGUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgRmlsZSBleHBhbmQoSW5wdXRTdHJlYW0gaW5wdXQsIEZpbGUgZG9jQmFzZSwgU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZG9jQmFzZSwgbmFtZSk7CisgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXRwdXQgPSAKKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpOworICAgICAgICAgICAgYnl0ZSBidWZmZXJbXSA9IG5ldyBieXRlWzIwNDhdOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgbiA9IGlucHV0LnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAobiA8PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoYnVmZmVyLCAwLCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0hvbWVzVXNlckRhdGFiYXNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Ib21lc1VzZXJEYXRhYmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MDcxMjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Ib21lc1VzZXJEYXRhYmFzZS5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCisKKy8qKgorICogQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxzdHJvbmc+VXNlckRhdGFiYXNlPC9jb2RlPiBpbnRlcmZhY2UKKyAqIGNvbnNpZGVycyBhbGwgZGlyZWN0b3JpZXMgaW4gYSBkaXJlY3Rvcnkgd2hvc2UgcGF0aG5hbWUgaXMgc3BlY2lmaWVkCisgKiB0byBvdXIgY29uc3RydWN0b3IgdG8gYmUgImhvbWUiIGRpcmVjdG9yaWVzIGZvciB0aG9zZSB1c2Vycy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEhvbWVzVXNlckRhdGFiYXNlCisgICAgaW1wbGVtZW50cyBVc2VyRGF0YWJhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyB1c2VyIGRhdGFiYXNlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSG9tZXNVc2VyRGF0YWJhc2UoKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGhvbWUgZGlyZWN0b3JpZXMgZm9yIGFsbCBkZWZpbmVkIHVzZXJzLCBrZXllZCBieSB1c2VybmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSBob21lcyA9IG5ldyBIYXNodGFibGUoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIFVzZXJDb25maWcgbGlzdGVuZXIgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFVzZXJDb25maWcgdXNlckNvbmZpZyA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBVc2VyQ29uZmlnIGxpc3RlbmVyIHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHVibGljIFVzZXJDb25maWcgZ2V0VXNlckNvbmZpZygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMudXNlckNvbmZpZyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgVXNlckNvbmZpZyBsaXN0ZW5lciB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJDb25maWcgVGhlIG5ldyBVc2VyQ29uZmlnIGxpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlckNvbmZpZyhVc2VyQ29uZmlnIHVzZXJDb25maWcpIHsKKworICAgICAgICB0aGlzLnVzZXJDb25maWcgPSB1c2VyQ29uZmlnOworICAgICAgICBpbml0KCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGFic29sdXRlIHBhdGhuYW1lIHRvIHRoZSBob21lIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmllZCB1c2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXIgVXNlciBmb3Igd2hpY2ggYSBob21lIGRpcmVjdG9yeSBzaG91bGQgYmUgcmV0cmlldmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRIb21lKFN0cmluZyB1c2VyKSB7CisKKyAgICAgICAgcmV0dXJuICgoU3RyaW5nKSBob21lcy5nZXQodXNlcikpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIHVzZXJuYW1lcyBkZWZpbmVkIG9uIHRoaXMgc2VydmVyLgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRVc2VycygpIHsKKworICAgICAgICByZXR1cm4gKGhvbWVzLmtleXMoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBvdXIgc2V0IG9mIHVzZXJzIGFuZCBob21lIGRpcmVjdG9yaWVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0KCkgeworCisgICAgICAgIFN0cmluZyBob21lQmFzZSA9IHVzZXJDb25maWcuZ2V0SG9tZUJhc2UoKTsKKyAgICAgICAgRmlsZSBob21lQmFzZURpciA9IG5ldyBGaWxlKGhvbWVCYXNlKTsKKyAgICAgICAgaWYgKCFob21lQmFzZURpci5leGlzdHMoKSB8fCAhaG9tZUJhc2VEaXIuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGhvbWVCYXNlRmlsZXNbXSA9IGhvbWVCYXNlRGlyLmxpc3QoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhvbWVCYXNlRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgaG9tZURpciA9IG5ldyBGaWxlKGhvbWVCYXNlRGlyLCBob21lQmFzZUZpbGVzW2ldKTsKKyAgICAgICAgICAgIGlmICghaG9tZURpci5pc0RpcmVjdG9yeSgpIHx8ICFob21lRGlyLmNhblJlYWQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGhvbWVzLnB1dChob21lQmFzZUZpbGVzW2ldLCBob21lRGlyLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Ib3N0Q29uZmlnLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Ib3N0Q29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyZDc3NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0hvc3RDb25maWcuamF2YQpAQCAtMCwwICsxLDEzMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwOworCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQ29udGFpbmVyQmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuRGlnZXN0ZXI7CisKKworLyoqCisgKiBTdGFydHVwIGV2ZW50IGxpc3RlbmVyIGZvciBhIDxiPkhvc3Q8L2I+IHRoYXQgY29uZmlndXJlcyB0aGUgcHJvcGVydGllcworICogb2YgdGhhdCBIb3N0LCBhbmQgdGhlIGFzc29jaWF0ZWQgZGVmaW5lZCBjb250ZXh0cy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBIb3N0Q29uZmlnCisgICAgaW1wbGVtZW50cyBMaWZlY3ljbGVMaXN0ZW5lciB7CisgICAgCisgICAgcHJvdGVjdGVkIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIEhvc3RDb25maWcuY2xhc3MgKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBBcHAgYmFzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBhcHBCYXNlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQ29uZmlnIGJhc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgY29uZmlnQmFzZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIENvbnRleHQgY29uZmlndXJhdGlvbiBjbGFzcyB3ZSBzaG91bGQgdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29uZmlnQ2xhc3MgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNvbnRleHRDb25maWciOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBDb250ZXh0IGltcGxlbWVudGF0aW9uIHdlIHNob3VsZCB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0Q2xhc3MgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBIb3N0IHdlIGFyZSBhc3NvY2lhdGVkIHdpdGguCisgICAgICovCisgICAgcHJvdGVjdGVkIEhvc3QgaG9zdCA9IG51bGw7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgSk1YIE9iamVjdE5hbWUgb2YgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdE5hbWUgb25hbWUgPSBudWxsOworICAgIAorCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyByZXNvdXJjZXMgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgd2UgZGVwbG95IFhNTCBDb250ZXh0IGNvbmZpZyBmaWxlcz8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZXBsb3lYTUwgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIHVucGFjayBXQVIgZmlsZXMgd2hlbiBhdXRvLWRlcGxveWluZyBhcHBsaWNhdGlvbnMgaW4gdGhlCisgICAgICogPGNvZGU+YXBwQmFzZTwvY29kZT4gZGlyZWN0b3J5PworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHVucGFja1dBUnMgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogTWFwIG9mIGRlcGxveWVkIGFwcGxpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCBkZXBsb3llZCA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIGFwcGxpY2F0aW9ucyB3aGljaCBhcmUgYmVpbmcgc2VydmljZWQsIGFuZCBzaG91bGRuJ3QgYmUgCisgICAgICogZGVwbG95ZWQvdW5kZXBsb3llZC9yZWRlcGxveWVkIGF0IHRoZSBtb21lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBzZXJ2aWNlZCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAKKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSB2YWx1ZSB1c2VkIHRvIHR1cm4gb24vb2ZmIFhNTCB2YWxpZGF0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4geG1sVmFsaWRhdGlvbiA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgdmFsdWUgdXNlZCB0byB0dXJuIG9uL29mZiBYTUwgbmFtZXNwYWNlIGF3YXJlbmVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHhtbE5hbWVzcGFjZUF3YXJlID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5EaWdlc3RlcjwvY29kZT4gaW5zdGFuY2UgdXNlZCB0byBwYXJzZSBjb250ZXh0IGRlc2NyaXB0b3JzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBjcmVhdGVEaWdlc3RlcigpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250ZXh0IGNvbmZpZ3VyYXRpb24gY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ0NsYXNzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jb25maWdDbGFzcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGV4dCBjb25maWd1cmF0aW9uIGNsYXNzIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnQ2xhc3MgVGhlIG5ldyBDb250ZXh0IGNvbmZpZ3VyYXRpb24gY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdDbGFzcyhTdHJpbmcgY29uZmlnQ2xhc3MpIHsKKworICAgICAgICB0aGlzLmNvbmZpZ0NsYXNzID0gY29uZmlnQ2xhc3M7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29udGV4dCBpbXBsZW1lbnRhdGlvbiBjbGFzcyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dENsYXNzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jb250ZXh0Q2xhc3MpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENvbnRleHQgaW1wbGVtZW50YXRpb24gY2xhc3MgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0Q2xhc3MgVGhlIG5ldyBDb250ZXh0IGltcGxlbWVudGF0aW9uIGNsYXNzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dENsYXNzKFN0cmluZyBjb250ZXh0Q2xhc3MpIHsKKworICAgICAgICB0aGlzLmNvbnRleHRDbGFzcyA9IGNvbnRleHRDbGFzczsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZXBsb3kgWE1MIGNvbmZpZyBmaWxlIGZsYWcgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVwbG95WE1MKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5kZXBsb3lYTUwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlcGxveSBYTUwgY29uZmlnIGZpbGUgZmxhZyBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVwbG95WE1MIFRoZSBuZXcgZGVwbG95IFhNTCBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVwbG95WE1MKGJvb2xlYW4gZGVwbG95WE1MKSB7CisKKyAgICAgICAgdGhpcy5kZXBsb3lYTUw9IGRlcGxveVhNTDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1bnBhY2sgV0FScyBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVW5wYWNrV0FScygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMudW5wYWNrV0FScyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdW5wYWNrIFdBUnMgZmxhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1bnBhY2tXQVJzIFRoZSBuZXcgdW5wYWNrIFdBUnMgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVucGFja1dBUnMoYm9vbGVhbiB1bnBhY2tXQVJzKSB7CisKKyAgICAgICAgdGhpcy51bnBhY2tXQVJzID0gdW5wYWNrV0FSczsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWxpZGF0aW9uIGZlYXR1cmUgb2YgdGhlIFhNTCBwYXJzZXIgdXNlZCB3aGVuCisgICAgICogcGFyc2luZyB4bWwgaW5zdGFuY2VzLgorICAgICAqIEBwYXJhbSB4bWxWYWxpZGF0aW9uIHRydWUgdG8gZW5hYmxlIHhtbCBpbnN0YW5jZSB2YWxpZGF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0WG1sVmFsaWRhdGlvbihib29sZWFuIHhtbFZhbGlkYXRpb24peworICAgICAgICB0aGlzLnhtbFZhbGlkYXRpb24gPSB4bWxWYWxpZGF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VydmVyLnhtbCA8aG9zdD4gYXR0cmlidXRlJ3MgeG1sVmFsaWRhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdmFsaWRhdGlvbiBpcyBlbmFibGVkLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0WG1sVmFsaWRhdGlvbigpeworICAgICAgICByZXR1cm4geG1sVmFsaWRhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNlcnZlci54bWwgPGhvc3Q+IGF0dHJpYnV0ZSdzIHhtbE5hbWVzcGFjZUF3YXJlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lc3BhY2UgYXdhcmVuZXMgaXMgZW5hYmxlZC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFhtbE5hbWVzcGFjZUF3YXJlKCl7CisgICAgICAgIHJldHVybiB4bWxOYW1lc3BhY2VBd2FyZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZXNwYWNlIGF3YXJlIGZlYXR1cmUgb2YgdGhlIFhNTCBwYXJzZXIgdXNlZCB3aGVuCisgICAgICogcGFyc2luZyB4bWwgaW5zdGFuY2VzLgorICAgICAqIEBwYXJhbSB4bWxOYW1lc3BhY2VBd2FyZSB0cnVlIHRvIGVuYWJsZSBuYW1lc3BhY2UgYXdhcmVuZXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0WG1sTmFtZXNwYWNlQXdhcmUoYm9vbGVhbiB4bWxOYW1lc3BhY2VBd2FyZSl7CisgICAgICAgIHRoaXMueG1sTmFtZXNwYWNlQXdhcmU9eG1sTmFtZXNwYWNlQXdhcmU7CisgICAgfSAgICAKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIFNUQVJUIGV2ZW50IGZvciBhbiBhc3NvY2lhdGVkIEhvc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGxpZmVjeWNsZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgaWYgKGV2ZW50LmdldFR5cGUoKS5lcXVhbHMoTGlmZWN5Y2xlLlBFUklPRElDX0VWRU5UKSkKKyAgICAgICAgICAgIGNoZWNrKCk7CisKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIGhvc3Qgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aAorICAgICAgICB0cnkgeworICAgICAgICAgICAgaG9zdCA9IChIb3N0KSBldmVudC5nZXRMaWZlY3ljbGUoKTsKKyAgICAgICAgICAgIGlmIChob3N0IGluc3RhbmNlb2YgU3RhbmRhcmRIb3N0KSB7CisgICAgICAgICAgICAgICAgc2V0RGVwbG95WE1MKCgoU3RhbmRhcmRIb3N0KSBob3N0KS5pc0RlcGxveVhNTCgpKTsKKyAgICAgICAgICAgICAgICBzZXRVbnBhY2tXQVJzKCgoU3RhbmRhcmRIb3N0KSBob3N0KS5pc1VucGFja1dBUnMoKSk7CisgICAgICAgICAgICAgICAgc2V0WG1sTmFtZXNwYWNlQXdhcmUoKChTdGFuZGFyZEhvc3QpIGhvc3QpLmdldFhtbE5hbWVzcGFjZUF3YXJlKCkpOworICAgICAgICAgICAgICAgIHNldFhtbFZhbGlkYXRpb24oKChTdGFuZGFyZEhvc3QpIGhvc3QpLmdldFhtbFZhbGlkYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJob3N0Q29uZmlnLmNjZSIsIGV2ZW50LmdldExpZmVjeWNsZSgpKSwgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZXNzIHRoZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpLmVxdWFscyhMaWZlY3ljbGUuU1RBUlRfRVZFTlQpKQorICAgICAgICAgICAgc3RhcnQoKTsKKyAgICAgICAgZWxzZSBpZiAoZXZlbnQuZ2V0VHlwZSgpLmVxdWFscyhMaWZlY3ljbGUuU1RPUF9FVkVOVCkpCisgICAgICAgICAgICBzdG9wKCk7CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZXJ2aWNlZCBhcHBsaWNhdGlvbiB0byB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkU2VydmljZWQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc2VydmljZWQuYWRkKG5hbWUpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBJcyBhcHBsaWNhdGlvbiBzZXJ2aWNlZCA/CisgICAgICogQHJldHVybiBzdGF0ZSBvZiB0aGUgYXBwbGljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNTZXJ2aWNlZChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gKHNlcnZpY2VkLmNvbnRhaW5zKG5hbWUpKTsKKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVkIGEgc2VydmljZWQgYXBwbGljYXRpb24gZnJvbSB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlU2VydmljZWQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc2VydmljZWQucmVtb3ZlKG5hbWUpOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgaW5zdGFudCB3aGVyZSBhbiBhcHBsaWNhdGlvbiB3YXMgZGVwbG95ZWQuCisgICAgICogQHJldHVybiAwTCBpZiBubyBhcHBsaWNhdGlvbiB3aXRoIHRoYXQgbmFtZSBpcyBkZXBsb3llZCwgb3IgdGhlIGluc3RhbnQKKyAgICAgKiBvbiB3aGljaCB0aGUgYXBwbGljYXRpb24gd2FzIGRlcGxveWVkCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0RGVwbG95bWVudFRpbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAJRGVwbG95ZWRBcHBsaWNhdGlvbiBhcHAgPSAoRGVwbG95ZWRBcHBsaWNhdGlvbikgZGVwbG95ZWQuZ2V0KG5hbWUpOworICAgIAlpZiAoYXBwID09IG51bGwpIHsKKyAgICAJCXJldHVybiAwTDsKKyAgICAJfSBlbHNlIHsKKyAgICAJCXJldHVybiBhcHAudGltZXN0YW1wOworICAgIAl9CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEhhcyB0aGUgc3BlY2lmaWVkIGFwcGxpY2F0aW9uIGJlZW4gZGVwbG95ZWQ/IE5vdGUgYXBwbGljYXRpb25zIGRlZmluZWQKKyAgICAgKiBpbiBzZXJ2ZXIueG1sIHdpbGwgbm90IGhhdmUgYmVlbiBkZXBsb3llZC4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcHBsaWNhdGlvbiBoYXMgYmVlbiBkZXBsb3llZCBhbmQKKyAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGFwcGxjaWF0aW9uIGhhcyBub3QgYmVlbiBkZXBsb3llZCBvciBkb2VzIG5vdAorICAgICAqIGV4aXN0CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEZXBsb3llZChTdHJpbmcgbmFtZSkgeworICAgICAgICBEZXBsb3llZEFwcGxpY2F0aW9uIGFwcCA9IChEZXBsb3llZEFwcGxpY2F0aW9uKSBkZXBsb3llZC5nZXQobmFtZSk7CisgICAgICAgIGlmIChhcHAgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIGRpZ2VzdGVyIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBwYXJzZSBjb250ZXh0IGNvbmZpZyBmaWxlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIERpZ2VzdGVyIGNyZWF0ZURpZ2VzdGVyKCkgeworICAgICAgICBEaWdlc3RlciBkaWdlc3RlciA9IG5ldyBEaWdlc3RlcigpOworICAgICAgICBkaWdlc3Rlci5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKKyAgICAgICAgLy8gQWRkIG9iamVjdCBjcmVhdGlvbiBydWxlCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiQ29udGV4dCIsICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0IiwKKyAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgLy8gU2V0IHRoZSBwcm9wZXJ0aWVzIG9uIHRoYXQgb2JqZWN0IChpdCBkb2Vzbid0IG1hdHRlciBpZiBleHRyYSAKKyAgICAgICAgLy8gcHJvcGVydGllcyBhcmUgc2V0KQorICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKCJDb250ZXh0Iik7CisgICAgICAgIHJldHVybiAoZGlnZXN0ZXIpOworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgImFwcGxpY2F0aW9uIHJvb3QiIGRpcmVjdG9yeQorICAgICAqIGZvciBvdXIgYXNzb2NpYXRlZCBIb3N0LgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGFwcEJhc2UoKSB7CisKKyAgICAgICAgaWYgKGFwcEJhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGFwcEJhc2U7CisgICAgICAgIH0KKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShob3N0LmdldEFwcEJhc2UoKSk7CisgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC5nZXRBcHBCYXNlKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXBwQmFzZSA9IGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhcHBCYXNlID0gZmlsZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGFwcEJhc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlICJjb25maWd1cmF0aW9uIHJvb3QiIGRpcmVjdG9yeQorICAgICAqIGZvciBvdXIgYXNzb2NpYXRlZCBIb3N0LgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGNvbmZpZ0Jhc2UoKSB7CisKKyAgICAgICAgaWYgKGNvbmZpZ0Jhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ0Jhc2U7CisgICAgICAgIH0KKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwgImNvbmYiKTsKKyAgICAgICAgQ29udGFpbmVyIHBhcmVudCA9IGhvc3QuZ2V0UGFyZW50KCk7CisgICAgICAgIGlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBFbmdpbmUpKSB7CisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoZmlsZSwgcGFyZW50LmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGZpbGUsIGhvc3QuZ2V0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbmZpZ0Jhc2UgPSBmaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY29uZmlnQmFzZSA9IGZpbGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChjb25maWdCYXNlKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgY29uZmlnQmFzZS4KKyAgICAgKiBGb3IgdXNlIHdpdGggSk1YIG1hbmFnZW1lbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25maWdCYXNlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ0Jhc2UoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIGNvbnRleHQgcGF0aCwgZ2V0IHRoZSBjb25maWcgZmlsZSBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnRmlsZShTdHJpbmcgcGF0aCkgeworICAgICAgICBTdHJpbmcgYmFzZW5hbWUgPSBudWxsOworICAgICAgICBpZiAocGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBiYXNlbmFtZSA9ICJST09UIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJhc2VuYW1lID0gcGF0aC5zdWJzdHJpbmcoMSkucmVwbGFjZSgnLycsICcjJyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChiYXNlbmFtZSk7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBjb250ZXh0IHBhdGgsIGdldCB0aGUgY29uZmlnIGZpbGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERvY0Jhc2UoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgU3RyaW5nIGJhc2VuYW1lID0gbnVsbDsKKyAgICAgICAgaWYgKHBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgYmFzZW5hbWUgPSAiUk9PVCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiYXNlbmFtZSA9IHBhdGguc3Vic3RyaW5nKDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoYmFzZW5hbWUpOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIERlcGxveSBhcHBsaWNhdGlvbnMgZm9yIGFueSBkaXJlY3RvcmllcyBvciBXQVIgZmlsZXMgdGhhdCBhcmUgZm91bmQKKyAgICAgKiBpbiBvdXIgImFwcGxpY2F0aW9uIHJvb3QiIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXBsb3lBcHBzKCkgeworCisgICAgICAgIEZpbGUgYXBwQmFzZSA9IGFwcEJhc2UoKTsKKyAgICAgICAgRmlsZSBjb25maWdCYXNlID0gY29uZmlnQmFzZSgpOworICAgICAgICAvLyBEZXBsb3kgWE1MIGRlc2NyaXB0b3JzIGZyb20gY29uZmlnQmFzZQorICAgICAgICBkZXBsb3lEZXNjcmlwdG9ycyhjb25maWdCYXNlLCBjb25maWdCYXNlLmxpc3QoKSk7CisgICAgICAgIC8vIERlcGxveSBXQVJzLCBhbmQgbG9vcCBpZiBhZGRpdGlvbmFsIGRlc2NyaXB0b3JzIGFyZSBmb3VuZAorICAgICAgICBkZXBsb3lXQVJzKGFwcEJhc2UsIGFwcEJhc2UubGlzdCgpKTsKKyAgICAgICAgLy8gRGVwbG95IGV4cGFuZGVkIGZvbGRlcnMKKyAgICAgICAgZGVwbG95RGlyZWN0b3JpZXMoYXBwQmFzZSwgYXBwQmFzZS5saXN0KCkpOworICAgICAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcGxveSBhcHBsaWNhdGlvbnMgZm9yIGFueSBkaXJlY3RvcmllcyBvciBXQVIgZmlsZXMgdGhhdCBhcmUgZm91bmQKKyAgICAgKiBpbiBvdXIgImFwcGxpY2F0aW9uIHJvb3QiIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXBsb3lBcHBzKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgRmlsZSBhcHBCYXNlID0gYXBwQmFzZSgpOworICAgICAgICBGaWxlIGNvbmZpZ0Jhc2UgPSBjb25maWdCYXNlKCk7CisgICAgICAgIFN0cmluZyBiYXNlTmFtZSA9IGdldENvbmZpZ0ZpbGUobmFtZSk7CisgICAgICAgIFN0cmluZyBkb2NCYXNlID0gZ2V0Q29uZmlnRmlsZShuYW1lKTsKKyAgICAgICAgCisgICAgICAgIC8vIERlcGxveSBYTUwgZGVzY3JpcHRvcnMgZnJvbSBjb25maWdCYXNlCisgICAgICAgIEZpbGUgeG1sID0gbmV3IEZpbGUoY29uZmlnQmFzZSwgYmFzZU5hbWUgKyAiLnhtbCIpOworICAgICAgICBpZiAoeG1sLmV4aXN0cygpKQorICAgICAgICAgICAgZGVwbG95RGVzY3JpcHRvcihuYW1lLCB4bWwsIGJhc2VOYW1lICsgIi54bWwiKTsKKyAgICAgICAgLy8gRGVwbG95IFdBUnMsIGFuZCBsb29wIGlmIGFkZGl0aW9uYWwgZGVzY3JpcHRvcnMgYXJlIGZvdW5kCisgICAgICAgIEZpbGUgd2FyID0gbmV3IEZpbGUoYXBwQmFzZSwgZG9jQmFzZSArICIud2FyIik7CisgICAgICAgIGlmICh3YXIuZXhpc3RzKCkpCisgICAgICAgICAgICBkZXBsb3lXQVIobmFtZSwgd2FyLCBkb2NCYXNlICsgIi53YXIiKTsKKyAgICAgICAgLy8gRGVwbG95IGV4cGFuZGVkIGZvbGRlcnMKKyAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShhcHBCYXNlLCBkb2NCYXNlKTsKKyAgICAgICAgaWYgKGRpci5leGlzdHMoKSkKKyAgICAgICAgICAgIGRlcGxveURpcmVjdG9yeShuYW1lLCBkaXIsIGRvY0Jhc2UpOworICAgICAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcGxveSBYTUwgY29udGV4dCBkZXNjcmlwdG9ycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXBsb3lEZXNjcmlwdG9ycyhGaWxlIGNvbmZpZ0Jhc2UsIFN0cmluZ1tdIGZpbGVzKSB7CisKKyAgICAgICAgaWYgKGZpbGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisKKyAgICAgICAgICAgIGlmIChmaWxlc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCJNRVRBLUlORiIpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIldFQi1JTkYiKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIEZpbGUgY29udGV4dFhtbCA9IG5ldyBGaWxlKGNvbmZpZ0Jhc2UsIGZpbGVzW2ldKTsKKyAgICAgICAgICAgIGlmIChmaWxlc1tpXS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIueG1sIikpIHsKKworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgY29udGV4dCBwYXRoIGFuZCBtYWtlIHN1cmUgaXQgaXMgdW5pcXVlCisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVUbXAgPSBmaWxlc1tpXS5zdWJzdHJpbmcoMCwgZmlsZXNbaV0ubGVuZ3RoKCkgLSA0KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSAiLyIgKyBuYW1lVG1wLnJlcGxhY2UoJyMnLCAnLycpOworICAgICAgICAgICAgICAgIGlmIChuYW1lVG1wLmVxdWFscygiUk9PVCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRQYXRoID0gIiI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGlzU2VydmljZWQoY29udGV4dFBhdGgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZSA9IGZpbGVzW2ldOworCisgICAgICAgICAgICAgICAgZGVwbG95RGVzY3JpcHRvcihjb250ZXh0UGF0aCwgY29udGV4dFhtbCwgZmlsZSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGgKKyAgICAgKiBAcGFyYW0gY29udGV4dFhtbAorICAgICAqIEBwYXJhbSBmaWxlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVwbG95RGVzY3JpcHRvcihTdHJpbmcgY29udGV4dFBhdGgsIEZpbGUgY29udGV4dFhtbCwgU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgaWYgKGRlcGxveW1lbnRFeGlzdHMoY29udGV4dFBhdGgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIERlcGxveWVkQXBwbGljYXRpb24gZGVwbG95ZWRBcHAgPSBuZXcgRGVwbG95ZWRBcHBsaWNhdGlvbihjb250ZXh0UGF0aCk7CisKKyAgICAgICAgLy8gQXNzdW1lIHRoaXMgaXMgYSBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgYW5kIGRlcGxveSBpdAorICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiaG9zdENvbmZpZy5kZXBsb3lEZXNjcmlwdG9yIiwgZmlsZSkpOworICAgICAgICB9CisKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZGlnZXN0ZXIpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gKENvbnRleHQpIGRpZ2VzdGVyLnBhcnNlKGNvbnRleHRYbWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJob3N0Q29uZmlnLmRlcGxveURlc2NyaXB0b3IuZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBkaWdlc3Rlci5yZXNldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGhvc3QuZ2V0Q29uZmlnQ2xhc3MoKSk7CisgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgICAgICAoTGlmZWN5Y2xlTGlzdGVuZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNvbnRleHQpLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRleHQuc2V0Q29uZmlnRmlsZShjb250ZXh0WG1sLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0UGF0aChjb250ZXh0UGF0aCk7CisgICAgICAgICAgICAvLyBBZGQgdGhlIGFzc29jaWF0ZWQgZG9jQmFzZSB0byB0aGUgcmVkZXBsb3llZCBsaXN0IGlmIGl0J3MgYSBXQVIKKyAgICAgICAgICAgIGJvb2xlYW4gaXNXYXIgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNFeHRlcm5hbCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0RG9jQmFzZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGRvY0Jhc2UgPSBuZXcgRmlsZShjb250ZXh0LmdldERvY0Jhc2UoKSk7CisgICAgICAgICAgICAgICAgaWYgKCFkb2NCYXNlLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgICAgICBkb2NCYXNlID0gbmV3IEZpbGUoYXBwQmFzZSgpLCBjb250ZXh0LmdldERvY0Jhc2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIElmIGV4dGVybmFsIGRvY0Jhc2UsIHJlZ2lzdGVyIC54bWwgYXMgcmVkZXBsb3kgZmlyc3QKKyAgICAgICAgICAgICAgICBpZiAoIWRvY0Jhc2UuZ2V0Q2Fub25pY2FsUGF0aCgpLnN0YXJ0c1dpdGgoYXBwQmFzZSgpLmdldEFic29sdXRlUGF0aCgpKSkgeworICAgICAgICAgICAgICAgICAgICBpc0V4dGVybmFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZGVwbG95ZWRBcHAucmVkZXBsb3lSZXNvdXJjZXMucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAoY29udGV4dFhtbC5nZXRBYnNvbHV0ZVBhdGgoKSwgbmV3IExvbmcoY29udGV4dFhtbC5sYXN0TW9kaWZpZWQoKSkpOworICAgICAgICAgICAgICAgICAgICBkZXBsb3llZEFwcC5yZWRlcGxveVJlc291cmNlcy5wdXQoZG9jQmFzZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKGRvY0Jhc2UubGFzdE1vZGlmaWVkKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRvY0Jhc2UuZ2V0QWJzb2x1dGVQYXRoKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLndhciIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc1dhciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcoImhvc3RDb25maWcuZGVwbG95RGVzY3JpcHRvci5sb2NhbERvY0Jhc2VTcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2NCYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBzcGVjaWZpZWQgZG9jQmFzZQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldERvY0Jhc2UobnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaG9zdC5hZGRDaGlsZChjb250ZXh0KTsKKyAgICAgICAgICAgIC8vIEdldCBwYXRocyBmb3IgV0FSIGFuZCBleHBhbmRlZCBXQVIgaW4gYXBwQmFzZQorICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjb250ZXh0LmdldFBhdGgoKTsKKyAgICAgICAgICAgIGlmIChwYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gIlJPT1QiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhdGguc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpbGUgZXhwYW5kZWREb2NCYXNlID0gbmV3IEZpbGUobmFtZSk7CisgICAgICAgICAgICBGaWxlIHdhckRvY0Jhc2UgPSBuZXcgRmlsZShuYW1lICsgIi53YXIiKTsKKyAgICAgICAgICAgIGlmICghZXhwYW5kZWREb2NCYXNlLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgIGV4cGFuZGVkRG9jQmFzZSA9IG5ldyBGaWxlKGFwcEJhc2UoKSwgbmFtZSk7CisgICAgICAgICAgICAgICAgd2FyRG9jQmFzZSA9IG5ldyBGaWxlKGFwcEJhc2UoKSwgbmFtZSArICIud2FyIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBZGQgdGhlIGV2ZW50dWFsIHVucGFja2VkIFdBUiBhbmQgYWxsIHRoZSByZXNvdXJjZXMgd2hpY2ggd2lsbCBiZQorICAgICAgICAgICAgLy8gd2F0Y2hlZCBpbnNpZGUgaXQKKyAgICAgICAgICAgIGlmIChpc1dhciAmJiB1bnBhY2tXQVJzKSB7CisgICAgICAgICAgICAgICAgZGVwbG95ZWRBcHAucmVkZXBsb3lSZXNvdXJjZXMucHV0KGV4cGFuZGVkRG9jQmFzZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKGV4cGFuZGVkRG9jQmFzZS5sYXN0TW9kaWZpZWQoKSkpOworICAgICAgICAgICAgICAgIGRlcGxveWVkQXBwLnJlZGVwbG95UmVzb3VyY2VzLnB1dAorICAgICAgICAgICAgICAgICAgICAoY29udGV4dFhtbC5nZXRBYnNvbHV0ZVBhdGgoKSwgbmV3IExvbmcoY29udGV4dFhtbC5sYXN0TW9kaWZpZWQoKSkpOworICAgICAgICAgICAgICAgIGFkZFdhdGNoZWRSZXNvdXJjZXMoZGVwbG95ZWRBcHAsIGV4cGFuZGVkRG9jQmFzZS5nZXRBYnNvbHV0ZVBhdGgoKSwgY29udGV4dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEZpbmQgYW4gZXhpc3RpbmcgbWF0Y2hpbmcgd2FyIGFuZCBleHBhbmRlZCBmb2xkZXIKKyAgICAgICAgICAgICAgICBpZiAod2FyRG9jQmFzZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBkZXBsb3llZEFwcC5yZWRlcGxveVJlc291cmNlcy5wdXQod2FyRG9jQmFzZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyh3YXJEb2NCYXNlLmxhc3RNb2RpZmllZCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChleHBhbmRlZERvY0Jhc2UuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVwbG95ZWRBcHAucmVkZXBsb3lSZXNvdXJjZXMucHV0KGV4cGFuZGVkRG9jQmFzZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyhleHBhbmRlZERvY0Jhc2UubGFzdE1vZGlmaWVkKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkV2F0Y2hlZFJlc291cmNlcyhkZXBsb3llZEFwcCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWREb2NCYXNlLmdldEFic29sdXRlUGF0aCgpLCBjb250ZXh0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhZGRXYXRjaGVkUmVzb3VyY2VzKGRlcGxveWVkQXBwLCBudWxsLCBjb250ZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBjb250ZXh0IFhNTCB0byB0aGUgbGlzdCBvZiBmaWxlcyB3aGljaCBzaG91bGQgdHJpZ2dlciBhIHJlZGVwbG95bWVudAorICAgICAgICAgICAgICAgIGlmICghaXNFeHRlcm5hbCkgeworICAgICAgICAgICAgICAgICAgICBkZXBsb3llZEFwcC5yZWRlcGxveVJlc291cmNlcy5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZXh0WG1sLmdldEFic29sdXRlUGF0aCgpLCBuZXcgTG9uZyhjb250ZXh0WG1sLmxhc3RNb2RpZmllZCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiaG9zdENvbmZpZy5kZXBsb3lEZXNjcmlwdG9yLmVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSksIHQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCAmJiBob3N0LmZpbmRDaGlsZChjb250ZXh0LmdldE5hbWUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgZGVwbG95ZWQucHV0KGNvbnRleHRQYXRoLCBkZXBsb3llZEFwcCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcGxveSBXQVIgZmlsZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVwbG95V0FScyhGaWxlIGFwcEJhc2UsIFN0cmluZ1tdIGZpbGVzKSB7CisgICAgICAgIAorICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIk1FVEEtSU5GIikpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoZmlsZXNbaV0uZXF1YWxzSWdub3JlQ2FzZSgiV0VCLUlORiIpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShhcHBCYXNlLCBmaWxlc1tpXSk7CisgICAgICAgICAgICBpZiAoZmlsZXNbaV0udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLndhciIpKSB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBjb250ZXh0IHBhdGggYW5kIG1ha2Ugc3VyZSBpdCBpcyB1bmlxdWUKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSAiLyIgKyBmaWxlc1tpXTsKKyAgICAgICAgICAgICAgICBpbnQgcGVyaW9kID0gY29udGV4dFBhdGgubGFzdEluZGV4T2YoIi4iKTsKKyAgICAgICAgICAgICAgICBpZiAocGVyaW9kID49IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRQYXRoID0gY29udGV4dFBhdGguc3Vic3RyaW5nKDAsIHBlcmlvZCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHRQYXRoLmVxdWFscygiL1JPT1QiKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFBhdGggPSAiIjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoaXNTZXJ2aWNlZChjb250ZXh0UGF0aCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlID0gZmlsZXNbaV07CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZGVwbG95V0FSKGNvbnRleHRQYXRoLCBkaXIsIGZpbGUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGgKKyAgICAgKiBAcGFyYW0gZGlyCisgICAgICogQHBhcmFtIGZpbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXBsb3lXQVIoU3RyaW5nIGNvbnRleHRQYXRoLCBGaWxlIGRpciwgU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgCisgICAgICAgIGlmIChkZXBsb3ltZW50RXhpc3RzKGNvbnRleHRQYXRoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNraW5nIGZvciBhIG5lc3RlZCAvTUVUQS1JTkYvY29udGV4dC54bWwKKyAgICAgICAgSmFyRmlsZSBqYXIgPSBudWxsOworICAgICAgICBKYXJFbnRyeSBlbnRyeSA9IG51bGw7CisgICAgICAgIElucHV0U3RyZWFtIGlzdHJlYW0gPSBudWxsOworICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBvc3RyZWFtID0gbnVsbDsKKyAgICAgICAgRmlsZSB4bWwgPSBuZXcgRmlsZQorICAgICAgICAgICAgKGNvbmZpZ0Jhc2UsIGZpbGUuc3Vic3RyaW5nKDAsIGZpbGUubGFzdEluZGV4T2YoIi4iKSkgKyAiLnhtbCIpOworICAgICAgICBpZiAoZGVwbG95WE1MICYmICF4bWwuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgamFyID0gbmV3IEphckZpbGUoZGlyKTsKKyAgICAgICAgICAgICAgICBlbnRyeSA9IGphci5nZXRKYXJFbnRyeShDb25zdGFudHMuQXBwbGljYXRpb25Db250ZXh0WG1sKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpc3RyZWFtID0gamFyLmdldElucHV0U3RyZWFtKGVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0Jhc2UubWtkaXJzKCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBvc3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHhtbCksIDEwMjQpOworICAgICAgICAgICAgICAgICAgICBieXRlIGJ1ZmZlcltdID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IGlzdHJlYW0ucmVhZChidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtLndyaXRlKGJ1ZmZlciwgMCwgbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3N0cmVhbS5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICBvc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlzdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGphci5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBqYXIgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlIGFuZCBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIChvc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlzdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgZW50cnkgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChqYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgamFyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgamFyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIERlcGxveWVkQXBwbGljYXRpb24gZGVwbG95ZWRBcHAgPSBuZXcgRGVwbG95ZWRBcHBsaWNhdGlvbihjb250ZXh0UGF0aCk7CisgICAgICAgIAorICAgICAgICAvLyBEZXBsb3kgdGhlIGFwcGxpY2F0aW9uIGluIHRoaXMgV0FSIGZpbGUKKyAgICAgICAgaWYobG9nLmlzSW5mb0VuYWJsZWQoKSkgCisgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoImhvc3RDb25maWcuZGVwbG95SmFyIiwgZmlsZSkpOworCisgICAgICAgIC8vIFBvcHVsYXRlIHJlZGVwbG95IHJlc291cmNlcyB3aXRoIHRoZSBXQVIgZmlsZQorICAgICAgICBkZXBsb3llZEFwcC5yZWRlcGxveVJlc291cmNlcy5wdXQKKyAgICAgICAgICAgIChkaXIuZ2V0QWJzb2x1dGVQYXRoKCksIG5ldyBMb25nKGRpci5sYXN0TW9kaWZpZWQoKSkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgQ2xhc3MuZm9yTmFtZShjb250ZXh0Q2xhc3MpLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShob3N0LmdldENvbmZpZ0NsYXNzKCkpOworICAgICAgICAgICAgICAgIExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgKExpZmVjeWNsZUxpc3RlbmVyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjb250ZXh0KS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250ZXh0LnNldFBhdGgoY29udGV4dFBhdGgpOworICAgICAgICAgICAgY29udGV4dC5zZXREb2NCYXNlKGZpbGUpOworICAgICAgICAgICAgaWYgKHhtbC5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0Q29uZmlnRmlsZSh4bWwuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgIGRlcGxveWVkQXBwLnJlZGVwbG95UmVzb3VyY2VzLnB1dAorICAgICAgICAgICAgICAgICAgICAoeG1sLmdldEFic29sdXRlUGF0aCgpLCBuZXcgTG9uZyh4bWwubGFzdE1vZGlmaWVkKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhvc3QuYWRkQ2hpbGQoY29udGV4dCk7CisgICAgICAgICAgICAvLyBJZiB3ZSdyZSB1bnBhY2tpbmcgV0FScywgdGhlIGRvY0Jhc2Ugd2lsbCBiZSBtdXRhdGVkIGFmdGVyCisgICAgICAgICAgICAvLyBzdGFydGluZyB0aGUgY29udGV4dAorICAgICAgICAgICAgaWYgKHVucGFja1dBUnMgJiYgKGNvbnRleHQuZ2V0RG9jQmFzZSgpICE9IG51bGwpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gY29udGV4dC5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlJPT1QiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhdGguc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRmlsZSBkb2NCYXNlID0gbmV3IEZpbGUobmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKCFkb2NCYXNlLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgICAgICBkb2NCYXNlID0gbmV3IEZpbGUoYXBwQmFzZSgpLCBuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVwbG95ZWRBcHAucmVkZXBsb3lSZXNvdXJjZXMucHV0KGRvY0Jhc2UuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyhkb2NCYXNlLmxhc3RNb2RpZmllZCgpKSk7CisgICAgICAgICAgICAgICAgYWRkV2F0Y2hlZFJlc291cmNlcyhkZXBsb3llZEFwcCwgZG9jQmFzZS5nZXRBYnNvbHV0ZVBhdGgoKSwgY29udGV4dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFkZFdhdGNoZWRSZXNvdXJjZXMoZGVwbG95ZWRBcHAsIG51bGwsIGNvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiaG9zdENvbmZpZy5kZXBsb3lKYXIuZXJyb3IiLCBmaWxlKSwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGRlcGxveWVkLnB1dChjb250ZXh0UGF0aCwgZGVwbG95ZWRBcHApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVwbG95IGRpcmVjdG9yaWVzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlcGxveURpcmVjdG9yaWVzKEZpbGUgYXBwQmFzZSwgU3RyaW5nW10gZmlsZXMpIHsKKworICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKworICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIk1FVEEtSU5GIikpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoZmlsZXNbaV0uZXF1YWxzSWdub3JlQ2FzZSgiV0VCLUlORiIpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShhcHBCYXNlLCBmaWxlc1tpXSk7CisgICAgICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKKworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgY29udGV4dCBwYXRoIGFuZCBtYWtlIHN1cmUgaXQgaXMgdW5pcXVlCisgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRQYXRoID0gIi8iICsgZmlsZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmVxdWFscygiUk9PVCIpKQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0UGF0aCA9ICIiOworCisgICAgICAgICAgICAgICAgaWYgKGlzU2VydmljZWQoY29udGV4dFBhdGgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGRlcGxveURpcmVjdG9yeShjb250ZXh0UGF0aCwgZGlyLCBmaWxlc1tpXSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGgKKyAgICAgKiBAcGFyYW0gZGlyCisgICAgICogQHBhcmFtIGZpbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXBsb3lEaXJlY3RvcnkoU3RyaW5nIGNvbnRleHRQYXRoLCBGaWxlIGRpciwgU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgRGVwbG95ZWRBcHBsaWNhdGlvbiBkZXBsb3llZEFwcCA9IG5ldyBEZXBsb3llZEFwcGxpY2F0aW9uKGNvbnRleHRQYXRoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChkZXBsb3ltZW50RXhpc3RzKGNvbnRleHRQYXRoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBEZXBsb3kgdGhlIGFwcGxpY2F0aW9uIGluIHRoaXMgZGlyZWN0b3J5CisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIAorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiaG9zdENvbmZpZy5kZXBsb3lEaXIiLCBmaWxlKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgQ2xhc3MuZm9yTmFtZShjb250ZXh0Q2xhc3MpLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShob3N0LmdldENvbmZpZ0NsYXNzKCkpOworICAgICAgICAgICAgICAgIExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgKExpZmVjeWNsZUxpc3RlbmVyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjb250ZXh0KS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250ZXh0LnNldFBhdGgoY29udGV4dFBhdGgpOworICAgICAgICAgICAgY29udGV4dC5zZXREb2NCYXNlKGZpbGUpOworICAgICAgICAgICAgRmlsZSBjb25maWdGaWxlID0gbmV3IEZpbGUoZGlyLCBDb25zdGFudHMuQXBwbGljYXRpb25Db250ZXh0WG1sKTsKKyAgICAgICAgICAgIGlmIChkZXBsb3lYTUwpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldENvbmZpZ0ZpbGUoY29uZmlnRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBob3N0LmFkZENoaWxkKGNvbnRleHQpOworICAgICAgICAgICAgZGVwbG95ZWRBcHAucmVkZXBsb3lSZXNvdXJjZXMucHV0KGRpci5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcoZGlyLmxhc3RNb2RpZmllZCgpKSk7CisgICAgICAgICAgICBpZiAoZGVwbG95WE1MKSB7CisgICAgICAgICAgICAgICAgZGVwbG95ZWRBcHAucmVkZXBsb3lSZXNvdXJjZXMucHV0KGNvbmZpZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyhjb25maWdGaWxlLmxhc3RNb2RpZmllZCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRXYXRjaGVkUmVzb3VyY2VzKGRlcGxveWVkQXBwLCBkaXIuZ2V0QWJzb2x1dGVQYXRoKCksIGNvbnRleHQpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiaG9zdENvbmZpZy5kZXBsb3lEaXIuZXJyb3IiLCBmaWxlKSwgdCk7CisgICAgICAgIH0KKworICAgICAgICBkZXBsb3llZC5wdXQoY29udGV4dFBhdGgsIGRlcGxveWVkQXBwKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBhIHdlYmFwcCBpcyBhbHJlYWR5IGRlcGxveWVkIGluIHRoaXMgaG9zdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGggb2YgdGhlIGNvbnRleHQgd2hpY2ggd2lsbCBiZSBjaGVja2VkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZGVwbG95bWVudEV4aXN0cyhTdHJpbmcgY29udGV4dFBhdGgpIHsKKyAgICAgICAgcmV0dXJuIChkZXBsb3llZC5jb250YWluc0tleShjb250ZXh0UGF0aCkgfHwgKGhvc3QuZmluZENoaWxkKGNvbnRleHRQYXRoKSAhPSBudWxsKSk7CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogQWRkIHdhdGNoZWQgcmVzb3VyY2VzIHRvIHRoZSBzcGVjaWZpZWQgQ29udGV4dC4KKyAgICAgKiBAcGFyYW0gYXBwIEhvc3RDb25maWcgZGVwbG95ZWQgYXBwCisgICAgICogQHBhcmFtIGRvY0Jhc2Ugd2ViIGFwcCBkb2NCYXNlCisgICAgICogQHBhcmFtIGNvbnRleHQgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRXYXRjaGVkUmVzb3VyY2VzKERlcGxveWVkQXBwbGljYXRpb24gYXBwLCBTdHJpbmcgZG9jQmFzZSwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIC8vIEZJWE1FOiBGZWF0dXJlIGlkZWEuIEFkZCBzdXBwb3J0IGZvciBwYXR0ZXJucyAoZXg6IFdFQi1JTkYvKiwgV0VCLUlORi8qLnhtbCksIHdoZXJlCisgICAgICAgIC8vICAgICAgICB3ZSB3b3VsZCBvbmx5IGNoZWNrIGlmIGF0IGxlYXN0IG9uZSByZXNvdXJjZSBpcyBuZXdlciB0aGFuIGFwcC50aW1lc3RhbXAKKyAgICAgICAgRmlsZSBkb2NCYXNlRmlsZSA9IG51bGw7CisgICAgICAgIGlmIChkb2NCYXNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRvY0Jhc2VGaWxlID0gbmV3IEZpbGUoZG9jQmFzZSk7CisgICAgICAgICAgICBpZiAoIWRvY0Jhc2VGaWxlLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgIGRvY0Jhc2VGaWxlID0gbmV3IEZpbGUoYXBwQmFzZSgpLCBkb2NCYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSB3YXRjaGVkUmVzb3VyY2VzID0gY29udGV4dC5maW5kV2F0Y2hlZFJlc291cmNlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdhdGNoZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgcmVzb3VyY2UgPSBuZXcgRmlsZSh3YXRjaGVkUmVzb3VyY2VzW2ldKTsKKyAgICAgICAgICAgIGlmICghcmVzb3VyY2UuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGRvY0Jhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSA9IG5ldyBGaWxlKGRvY0Jhc2VGaWxlLCB3YXRjaGVkUmVzb3VyY2VzW2ldKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcHAucmVsb2FkUmVzb3VyY2VzLnB1dChyZXNvdXJjZS5nZXRBYnNvbHV0ZVBhdGgoKSwgCisgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKHJlc291cmNlLmxhc3RNb2RpZmllZCgpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBDaGVjayByZXNvdXJjZXMgZm9yIHJlZGVwbG95bWVudCBhbmQgcmVsb2FkaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBjaGVja1Jlc291cmNlcyhEZXBsb3llZEFwcGxpY2F0aW9uIGFwcCkgeworICAgICAgICBTdHJpbmdbXSByZXNvdXJjZXMgPSAoU3RyaW5nW10pIGFwcC5yZWRlcGxveVJlc291cmNlcy5rZXlTZXQoKS50b0FycmF5KG5ldyBTdHJpbmdbMF0pOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRmlsZSByZXNvdXJjZSA9IG5ldyBGaWxlKHJlc291cmNlc1tpXSk7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGVja2luZyBjb250ZXh0WyIgKyBhcHAubmFtZSArICJdIHJlZGVwbG95IHJlc291cmNlICIgKyByZXNvdXJjZSk7CisgICAgICAgICAgICBpZiAocmVzb3VyY2UuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9ICgoTG9uZykgYXBwLnJlZGVwbG95UmVzb3VyY2VzLmdldChyZXNvdXJjZXNbaV0pKS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoKCFyZXNvdXJjZS5pc0RpcmVjdG9yeSgpKSAmJiByZXNvdXJjZS5sYXN0TW9kaWZpZWQoKSA+IGxhc3RNb2RpZmllZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBVbmRlcGxveSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygiaG9zdENvbmZpZy51bmRlcGxveSIsIGFwcC5uYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lckJhc2UgY29udGV4dCA9IChDb250YWluZXJCYXNlKSBob3N0LmZpbmRDaGlsZChhcHAubmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBob3N0LnJlbW92ZUNoaWxkKGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImhvc3RDb25maWcuY29udGV4dC5yZW1vdmUiLCBhcHAubmFtZSksIHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJob3N0Q29uZmlnLmNvbnRleHQuZGVzdHJveSIsIGFwcC5uYW1lKSwgdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gRGVsZXRlIG90aGVyIHJlZGVwbG95IHJlc291cmNlcworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCByZXNvdXJjZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBjdXJyZW50ID0gbmV3IEZpbGUocmVzb3VyY2VzW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50LmdldEFic29sdXRlUGF0aCgpLnN0YXJ0c1dpdGgoYXBwQmFzZSgpLmdldEFic29sdXRlUGF0aCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjdXJyZW50LmdldEFic29sdXRlUGF0aCgpLnN0YXJ0c1dpdGgoY29uZmlnQmFzZSgpLmdldEFic29sdXRlUGF0aCgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZWxldGUgIiArIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRXYXIuZGVsZXRlKGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaG9zdENvbmZpZy5jYW5vbmljYWxpemluZyIsIGFwcC5uYW1lKSwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVwbG95ZWQucmVtb3ZlKGFwcC5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSAoKExvbmcpIGFwcC5yZWRlcGxveVJlc291cmNlcy5nZXQocmVzb3VyY2VzW2ldKSkubG9uZ1ZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RNb2RpZmllZCA9PSAwTCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVW5kZXBsb3kgYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJob3N0Q29uZmlnLnVuZGVwbG95IiwgYXBwLm5hbWUpKTsKKyAgICAgICAgICAgICAgICBDb250YWluZXJCYXNlIGNvbnRleHQgPSAoQ29udGFpbmVyQmFzZSkgaG9zdC5maW5kQ2hpbGQoYXBwLm5hbWUpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGhvc3QucmVtb3ZlQ2hpbGQoY29udGV4dCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaG9zdENvbmZpZy5jb250ZXh0LnJlbW92ZSIsIGFwcC5uYW1lKSwgdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZGVzdHJveSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImhvc3RDb25maWcuY29udGV4dC5kZXN0cm95IiwgYXBwLm5hbWUpLCB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRGVsZXRlIGFsbCByZWRlcGxveSByZXNvdXJjZXMKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCByZXNvdXJjZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgY3VycmVudCA9IG5ldyBGaWxlKHJlc291cmNlc1tqXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnQuZ2V0QWJzb2x1dGVQYXRoKCkuc3RhcnRzV2l0aChhcHBCYXNlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjdXJyZW50LmdldEFic29sdXRlUGF0aCgpLnN0YXJ0c1dpdGgoY29uZmlnQmFzZSgpLmdldEFic29sdXRlUGF0aCgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVsZXRlICIgKyBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRXYXIuZGVsZXRlKGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJob3N0Q29uZmlnLmNhbm9uaWNhbGl6aW5nIiwgYXBwLm5hbWUpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBEZWxldGUgcmVsb2FkIHJlc291cmNlcyBhcyB3ZWxsICh0byByZW1vdmUgYW55IHJlbWFpbmluZyAueG1sIGRlc2NyaXB0b3IpCisgICAgICAgICAgICAgICAgU3RyaW5nW10gcmVzb3VyY2VzMiA9IChTdHJpbmdbXSkgYXBwLnJlbG9hZFJlc291cmNlcy5rZXlTZXQoKS50b0FycmF5KG5ldyBTdHJpbmdbMF0pOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVzb3VyY2VzMi5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBjdXJyZW50ID0gbmV3IEZpbGUocmVzb3VyY2VzMltqXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnQuZ2V0QWJzb2x1dGVQYXRoKCkuc3RhcnRzV2l0aChhcHBCYXNlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoY3VycmVudC5nZXRBYnNvbHV0ZVBhdGgoKS5zdGFydHNXaXRoKGNvbmZpZ0Jhc2UoKS5nZXRBYnNvbHV0ZVBhdGgoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjdXJyZW50LmdldEFic29sdXRlUGF0aCgpLmVuZHNXaXRoKCIueG1sIikpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVsZXRlICIgKyBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRXYXIuZGVsZXRlKGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJob3N0Q29uZmlnLmNhbm9uaWNhbGl6aW5nIiwgYXBwLm5hbWUpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXBsb3llZC5yZW1vdmUoYXBwLm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXNvdXJjZXMgPSAoU3RyaW5nW10pIGFwcC5yZWxvYWRSZXNvdXJjZXMua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgcmVzb3VyY2UgPSBuZXcgRmlsZShyZXNvdXJjZXNbaV0pOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hlY2tpbmcgY29udGV4dFsiICsgYXBwLm5hbWUgKyAiXSByZWxvYWQgcmVzb3VyY2UgIiArIHJlc291cmNlKTsKKyAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gKChMb25nKSBhcHAucmVsb2FkUmVzb3VyY2VzLmdldChyZXNvdXJjZXNbaV0pKS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgIGlmICgoIXJlc291cmNlLmV4aXN0cygpICYmIGxhc3RNb2RpZmllZCAhPSAwTCkgCisgICAgICAgICAgICAgICAgfHwgKHJlc291cmNlLmxhc3RNb2RpZmllZCgpICE9IGxhc3RNb2RpZmllZCkpIHsKKyAgICAgICAgICAgICAgICAvLyBSZWxvYWQgYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoImhvc3RDb25maWcucmVsb2FkIiwgYXBwLm5hbWUpKTsKKyAgICAgICAgICAgICAgICBDb250YWluZXIgY29udGV4dCA9IGhvc3QuZmluZENoaWxkKGFwcC5uYW1lKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY29udGV4dCkuc3RvcCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImhvc3RDb25maWcuY29udGV4dC5yZXN0YXJ0IiwgYXBwLm5hbWUpLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnRleHQgd2FzIG5vdCBzdGFydGVkIChmb3IgZXhhbXBsZSBhbiBlcnJvciAKKyAgICAgICAgICAgICAgICAvLyBpbiB3ZWIueG1sKSB3ZSdsbCBzdGlsbCBnZXQgdG8gdHJ5IHRvIHN0YXJ0CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNvbnRleHQpLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaG9zdENvbmZpZy5jb250ZXh0LnJlc3RhcnQiLCBhcHAubmFtZSksIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGltZXMKKyAgICAgICAgICAgICAgICBhcHAucmVsb2FkUmVzb3VyY2VzLnB1dChyZXNvdXJjZXNbaV0sIG5ldyBMb25nKHJlc291cmNlLmxhc3RNb2RpZmllZCgpKSk7CisgICAgICAgICAgICAgICAgYXBwLnRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgInN0YXJ0IiBldmVudCBmb3IgdGhpcyBIb3N0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImhvc3RDb25maWcuc3RhcnQiKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgaG9zdE9OID0gbmV3IE9iamVjdE5hbWUoaG9zdC5nZXRPYmplY3ROYW1lKCkpOworICAgICAgICAgICAgb25hbWUgPSBuZXcgT2JqZWN0TmFtZQorICAgICAgICAgICAgICAgIChob3N0T04uZ2V0RG9tYWluKCkgKyAiOnR5cGU9RGVwbG95ZXIsaG9zdD0iICsgaG9zdC5nZXROYW1lKCkpOworICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkucmVnaXN0ZXJDb21wb25lbnQKKyAgICAgICAgICAgICAgICAodGhpcywgb25hbWUsIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiaG9zdENvbmZpZy5qbXgucmVnaXN0ZXIiLCBvbmFtZSksIGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhvc3QuZ2V0RGVwbG95T25TdGFydHVwKCkpCisgICAgICAgICAgICBkZXBsb3lBcHBzKCk7CisgICAgICAgIAorICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhICJzdG9wIiBldmVudCBmb3IgdGhpcyBIb3N0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiaG9zdENvbmZpZy5zdG9wIikpOworCisgICAgICAgIHVuZGVwbG95QXBwcygpOworCisgICAgICAgIGlmIChvbmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLnVucmVnaXN0ZXJDb21wb25lbnQob25hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJob3N0Q29uZmlnLmpteC51bnJlZ2lzdGVyIiwgb25hbWUpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvbmFtZSA9IG51bGw7CisgICAgICAgIGFwcEJhc2UgPSBudWxsOworICAgICAgICBjb25maWdCYXNlID0gbnVsbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVW5kZXBsb3kgYWxsIGRlcGxveWVkIGFwcGxpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB1bmRlcGxveUFwcHMoKSB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiaG9zdENvbmZpZy51bmRlcGxveWluZyIpKTsKKworICAgICAgICAvLyBTb2Z0IHVuZGVwbG95IGFsbCBjb250ZXh0cyB3ZSBoYXZlIGRlcGxveWVkCisgICAgICAgIERlcGxveWVkQXBwbGljYXRpb25bXSBhcHBzID0gCisgICAgICAgICAgICAoRGVwbG95ZWRBcHBsaWNhdGlvbltdKSBkZXBsb3llZC52YWx1ZXMoKS50b0FycmF5KG5ldyBEZXBsb3llZEFwcGxpY2F0aW9uWzBdKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcHBzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGhvc3QucmVtb3ZlQ2hpbGQoaG9zdC5maW5kQ2hpbGQoYXBwc1tpXS5uYW1lKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgKCJob3N0Q29uZmlnLmNvbnRleHQucmVtb3ZlIiwgYXBwc1tpXS5uYW1lKSwgdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGRlcGxveWVkLmNsZWFyKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIHN0YXR1cyBvZiBhbGwgd2ViYXBwcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVjaygpIHsKKworICAgICAgICBpZiAoaG9zdC5nZXRBdXRvRGVwbG95KCkpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciByZXNvdXJjZXMgbW9kaWZpY2F0aW9uIHRvIHRyaWdnZXIgcmVkZXBsb3ltZW50CisgICAgICAgICAgICBEZXBsb3llZEFwcGxpY2F0aW9uW10gYXBwcyA9IAorICAgICAgICAgICAgICAgIChEZXBsb3llZEFwcGxpY2F0aW9uW10pIGRlcGxveWVkLnZhbHVlcygpLnRvQXJyYXkobmV3IERlcGxveWVkQXBwbGljYXRpb25bMF0pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcHBzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VkKGFwcHNbaV0ubmFtZSkpCisgICAgICAgICAgICAgICAgICAgIGNoZWNrUmVzb3VyY2VzKGFwcHNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSG90ZGVwbG95IGFwcGxpY2F0aW9ucworICAgICAgICAgICAgZGVwbG95QXBwcygpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBDaGVjayBzdGF0dXMgb2YgYSBzcGVjaWZpYyB3ZWJhcHAsIGZvciB1c2Ugd2l0aCBzdHVmZiBsaWtlIG1hbmFnZW1lbnQgd2ViYXBwcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGVjayhTdHJpbmcgbmFtZSkgeworICAgICAgICBEZXBsb3llZEFwcGxpY2F0aW9uIGFwcCA9IChEZXBsb3llZEFwcGxpY2F0aW9uKSBkZXBsb3llZC5nZXQobmFtZSk7CisgICAgICAgIGlmIChhcHAgIT0gbnVsbCkgeworICAgICAgICAgICAgY2hlY2tSZXNvdXJjZXMoYXBwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlcGxveUFwcHMobmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgQ29udGV4dCB0byBiZSBtYW5hZ2VkIGJ5IHVzLgorICAgICAqIEVudHJ5IHBvaW50IGZvciB0aGUgYWRtaW4gd2ViYXBwLCBhbmQgb3RoZXIgSk1YIENvbnRleHQgY29udHJvbGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtYW5hZ2VBcHAoQ29udGV4dCBjb250ZXh0KSAgeyAgICAKKworICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSBjb250ZXh0LmdldFBhdGgoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChkZXBsb3llZC5jb250YWluc0tleShjb250ZXh0UGF0aCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgRGVwbG95ZWRBcHBsaWNhdGlvbiBkZXBsb3llZEFwcCA9IG5ldyBEZXBsb3llZEFwcGxpY2F0aW9uKGNvbnRleHRQYXRoKTsKKyAgICAgICAgCisgICAgICAgIC8vIEFkZCB0aGUgYXNzb2NpYXRlZCBkb2NCYXNlIHRvIHRoZSByZWRlcGxveWVkIGxpc3QgaWYgaXQncyBhIFdBUgorICAgICAgICBib29sZWFuIGlzV2FyID0gZmFsc2U7CisgICAgICAgIGlmIChjb250ZXh0LmdldERvY0Jhc2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBGaWxlIGRvY0Jhc2UgPSBuZXcgRmlsZShjb250ZXh0LmdldERvY0Jhc2UoKSk7CisgICAgICAgICAgICBpZiAoIWRvY0Jhc2UuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgZG9jQmFzZSA9IG5ldyBGaWxlKGFwcEJhc2UoKSwgY29udGV4dC5nZXREb2NCYXNlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVwbG95ZWRBcHAucmVkZXBsb3lSZXNvdXJjZXMucHV0KGRvY0Jhc2UuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyhkb2NCYXNlLmxhc3RNb2RpZmllZCgpKSk7CisgICAgICAgICAgICBpZiAoZG9jQmFzZS5nZXRBYnNvbHV0ZVBhdGgoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIud2FyIikpIHsKKyAgICAgICAgICAgICAgICBpc1dhciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaG9zdC5hZGRDaGlsZChjb250ZXh0KTsKKyAgICAgICAgLy8gQWRkIHRoZSBldmVudHVhbCB1bnBhY2tlZCBXQVIgYW5kIGFsbCB0aGUgcmVzb3VyY2VzIHdoaWNoIHdpbGwgYmUKKyAgICAgICAgLy8gd2F0Y2hlZCBpbnNpZGUgaXQKKyAgICAgICAgaWYgKGlzV2FyICYmIHVucGFja1dBUnMpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gY29udGV4dC5nZXRQYXRoKCk7CisgICAgICAgICAgICBpZiAocGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9ICJST09UIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXRoLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gcGF0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGaWxlIGRvY0Jhc2UgPSBuZXcgRmlsZShuYW1lKTsKKyAgICAgICAgICAgIGlmICghZG9jQmFzZS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgICAgICBkb2NCYXNlID0gbmV3IEZpbGUoYXBwQmFzZSgpLCBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlcGxveWVkQXBwLnJlZGVwbG95UmVzb3VyY2VzLnB1dChkb2NCYXNlLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcoZG9jQmFzZS5sYXN0TW9kaWZpZWQoKSkpOworICAgICAgICAgICAgYWRkV2F0Y2hlZFJlc291cmNlcyhkZXBsb3llZEFwcCwgZG9jQmFzZS5nZXRBYnNvbHV0ZVBhdGgoKSwgY29udGV4dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRXYXRjaGVkUmVzb3VyY2VzKGRlcGxveWVkQXBwLCBudWxsLCBjb250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICBkZXBsb3llZC5wdXQoY29udGV4dFBhdGgsIGRlcGxveWVkQXBwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB3ZWJhcHAgZnJvbSBvdXIgY29udHJvbC4KKyAgICAgKiBFbnRyeSBwb2ludCBmb3IgdGhlIGFkbWluIHdlYmFwcCwgYW5kIG90aGVyIEpNWCBDb250ZXh0IGNvbnRyb2xlcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5tYW5hZ2VBcHAoU3RyaW5nIGNvbnRleHRQYXRoKSB7CisgICAgICAgIGlmKGlzU2VydmljZWQoY29udGV4dFBhdGgpKSB7CisgICAgICAgICAgICBkZXBsb3llZC5yZW1vdmUoY29udGV4dFBhdGgpOworICAgICAgICAgICAgaG9zdC5yZW1vdmVDaGlsZChob3N0LmZpbmRDaGlsZChjb250ZXh0UGF0aCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgYSBkZXBsb3llZCBhcHBsaWNhdGlvbiwgYXMgd2VsbCBhcyAKKyAgICAgKiB0aGUgbW9uaXRvcmVkIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgY2xhc3MgRGVwbG95ZWRBcHBsaWNhdGlvbiB7CisgICAgCXB1YmxpYyBEZXBsb3llZEFwcGxpY2F0aW9uKFN0cmluZyBuYW1lKSB7CisgICAgCQl0aGlzLm5hbWUgPSBuYW1lOworICAgIAl9CisgICAgCQorICAgIAkvKioKKyAgICAJICogQXBwbGljYXRpb24gY29udGV4dCBwYXRoLiBUaGUgYXNzZXJ0aW9uIGlzIHRoYXQgCisgICAgCSAqIChob3N0LmdldENoaWxkKG5hbWUpICE9IG51bGwpLgorICAgIAkgKi8KKyAgICAJcHVibGljIFN0cmluZyBuYW1lOworICAgIAkKKyAgICAJLyoqCisgICAgCSAqIEFueSBtb2RpZmljYXRpb24gb2YgdGhlIHNwZWNpZmllZCAoc3RhdGljKSByZXNvdXJjZXMgd2lsbCBjYXVzZSBhIAorICAgIAkgKiByZWRlcGxveW1lbnQgb2YgdGhlIGFwcGxpY2F0aW9uLiBJZiBhbnkgb2YgdGhlIHNwZWNpZmllZCByZXNvdXJjZXMgaXMKKyAgICAJICogcmVtb3ZlZCwgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgdW5kZXBsb3llZC4gVHlwaWNhbGx5LCB0aGlzIHdpbGwKKyAgICAJICogY29udGFpbiByZXNvdXJjZXMgbGlrZSB0aGUgY29udGV4dC54bWwgZmlsZSwgYSBjb21wcmVzc2VkIFdBUiBwYXRoLgorICAgICAgICAgKiBUaGUgdmFsdWUgaXMgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUuCisgICAgCSAqLworICAgIAlwdWJsaWMgTGlua2VkSGFzaE1hcCByZWRlcGxveVJlc291cmNlcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisKKyAgICAJLyoqCisgICAgCSAqIEFueSBtb2RpZmljYXRpb24gb2YgdGhlIHNwZWNpZmllZCAoc3RhdGljKSByZXNvdXJjZXMgd2lsbCBjYXVzZSBhIAorICAgIAkgKiByZWxvYWQgb2YgdGhlIGFwcGxpY2F0aW9uLiBUaGlzIHdpbGwgdHlwaWNhbGx5IGNvbnRhaW4gcmVzb3VyY2VzCisgICAgCSAqIHN1Y2ggYXMgdGhlIHdlYi54bWwgb2YgYSB3ZWJhcHAsIGJ1dCBjYW4gYmUgY29uZmlndXJlZCB0byBjb250YWluCisgICAgCSAqIGFkZGl0aW9uYWwgZGVzY3JpcHRvcnMuCisgICAgICAgICAqIFRoZSB2YWx1ZSBpcyB0aGUgbGFzdCBtb2RpZmljYXRpb24gdGltZS4KKyAgICAJICovCisgICAgCXB1YmxpYyBIYXNoTWFwIHJlbG9hZFJlc291cmNlcyA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAJLyoqCisgICAgCSAqIEluc3RhbnQgd2hlcmUgdGhlIGFwcGxpY2F0aW9uIHdhcyBsYXN0IHB1dCBpbiBzZXJ2aWNlLgorICAgIAkgKi8KKyAgICAJcHVibGljIGxvbmcgdGltZXN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Ib3N0UnVsZVNldC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvSG9zdFJ1bGVTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2I1OTRkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvSG9zdFJ1bGVTZXQuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKKworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuRGlnZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5SdWxlU2V0QmFzZTsKKworCisvKioKKyAqIDxwPjxzdHJvbmc+UnVsZVNldDwvc3Ryb25nPiBmb3IgcHJvY2Vzc2luZyB0aGUgY29udGVudHMgb2YgYQorICogSG9zdCBkZWZpbml0aW9uIGVsZW1lbnQuICBUaGlzIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IGRvZXMgTk9UIGluY2x1ZGUKKyAqIGFueSBydWxlcyBmb3IgbmVzdGVkIENvbnRleHQgb3IgRGVmYXVsdENvbnRleHQgZWxlbWVudHMsIHdoaWNoIHNob3VsZAorICogYmUgYWRkZWQgdmlhIGluc3RhbmNlcyBvZiA8Y29kZT5Db250ZXh0UnVsZVNldDwvY29kZT4uPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSG9zdFJ1bGVTZXQgZXh0ZW5kcyBSdWxlU2V0QmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXggdG8gdXNlIGZvciByZWNvZ25pemluZyBvdXIgZWxlbWVudHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwcmVmaXggPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+UnVsZVNldDwvY29kZT4gd2l0aCB0aGUgZGVmYXVsdAorICAgICAqIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4LgorICAgICAqLworICAgIHB1YmxpYyBIb3N0UnVsZVNldCgpIHsKKworICAgICAgICB0aGlzKCIiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+UnVsZVNldDwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFByZWZpeCBmb3IgbWF0Y2hpbmcgcGF0dGVybiBydWxlcyAoaW5jbHVkaW5nIHRoZQorICAgICAqICB0cmFpbGluZyBzbGFzaCBjaGFyYWN0ZXIpCisgICAgICovCisgICAgcHVibGljIEhvc3RSdWxlU2V0KFN0cmluZyBwcmVmaXgpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IG51bGw7CisgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogPHA+QWRkIHRoZSBzZXQgb2YgUnVsZSBpbnN0YW5jZXMgZGVmaW5lZCBpbiB0aGlzIFJ1bGVTZXQgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIDxjb2RlPkRpZ2VzdGVyPC9jb2RlPiBpbnN0YW5jZSwgYXNzb2NpYXRpbmcgdGhlbSB3aXRoCisgICAgICogb3VyIG5hbWVzcGFjZSBVUkkgKGlmIGFueSkuICBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQKKyAgICAgKiBieSBhIERpZ2VzdGVyIGluc3RhbmNlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaWdlc3RlciBEaWdlc3RlciBpbnN0YW5jZSB0byB3aGljaCB0aGUgbmV3IFJ1bGUgaW5zdGFuY2VzCisgICAgICogIHNob3VsZCBiZSBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSdWxlSW5zdGFuY2VzKERpZ2VzdGVyIGRpZ2VzdGVyKSB7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJIb3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiSG9zdCIpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJIb3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29weVBhcmVudENsYXNzTG9hZGVyUnVsZSgpKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAiSG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExpZmVjeWNsZUxpc3RlbmVyUnVsZQorICAgICAgICAgICAgICAgICAgICAgICAgICgib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkhvc3RDb25maWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdENvbmZpZ0NsYXNzIikpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJIb3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkQ2hpbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lciIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIkhvc3QvQWxpYXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRBbGlhcyIsIDApOworCisgICAgICAgIC8vQ2x1c3RlciBjb25maWd1cmF0aW9uIHN0YXJ0CisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiSG9zdC9DbHVzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkhvc3QvQ2x1c3RlciIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJIb3N0L0NsdXN0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRDbHVzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5DbHVzdGVyIik7CisgICAgICAgIC8vQ2x1c3RlciBjb25maWd1cmF0aW9uIGVuZAorCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiSG9zdC9MaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBNVVNUIGJlIHNwZWNpZmllZCBpbiB0aGUgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJIb3N0L0xpc3RlbmVyIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIkhvc3QvTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRMaWZlY3ljbGVMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXIiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkhvc3QvUmVhbG0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiSG9zdC9SZWFsbSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJIb3N0L1JlYWxtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0UmVhbG0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJIb3N0L1ZhbHZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkhvc3QvVmFsdmUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiSG9zdC9WYWx2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFZhbHZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZSIpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0xpZmVjeWNsZUxpc3RlbmVyUnVsZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvTGlmZWN5Y2xlTGlzdGVuZXJSdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiMTY5YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0xpZmVjeWNsZUxpc3RlbmVyUnVsZS5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLlJ1bGU7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKKworCisvKioKKyAqIDxwPlJ1bGUgdGhhdCBjcmVhdGVzIGEgbmV3IDxjb2RlPkxpZmVjeWNsZUxpc3RlbmVyPC9jb2RlPiBpbnN0YW5jZSwKKyAqIGFuZCBhc3NvY2lhdGVzIGl0IHdpdGggdGhlIHRvcCBvYmplY3Qgb24gdGhlIHN0YWNrICh3aGljaCBtdXN0CisgKiBpbXBsZW1lbnQgPGNvZGU+TGlmZWN5Y2xlTGlzdGVuZXI8L2NvZGU+KS48L3A+CisgKi8KKworcHVibGljIGNsYXNzIExpZmVjeWNsZUxpc3RlbmVyUnVsZSBleHRlbmRzIFJ1bGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgUnVsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lckNsYXNzIERlZmF1bHQgbmFtZSBvZiB0aGUgTGlmZWN5Y2xlTGlzdGVuZXIKKyAgICAgKiAgaW1wbGVtZW50YXRpb24gY2xhc3MgdG8gYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IG9wdGlvbmFsbHkKKyAgICAgKiAgaW5jbHVkZXMgYW4gb3ZlcnJpZGUgbmFtZSBvZiB0aGUgTGlmZWN5Y2xlTGlzdGVuZXIgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJSdWxlKFN0cmluZyBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgeworCisgICAgICAgIHRoaXMubGlzdGVuZXJDbGFzcyA9IGxpc3RlbmVyQ2xhc3M7CisgICAgICAgIHRoaXMuYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXR0cmlidXRlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHRoYXQgY2FuIG92ZXJyaWRlIHRoZQorICAgICAqIGltcGxlbWVudGF0aW9uIGNsYXNzIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlTmFtZTsKKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIDxjb2RlPkxpZmVjeWNsZUxpc3RlbmVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsaXN0ZW5lckNsYXNzOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSGFuZGxlIHRoZSBiZWdpbm5pbmcgb2YgYW4gWE1MIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlcyBvZiB0aGlzIGVsZW1lbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGEgcHJvY2Vzc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJbnN0YW50aWF0ZSBhIG5ldyBMaWZlY3lsZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uIG9iamVjdAorICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbGlzdGVuZXJDbGFzczsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShhdHRyaWJ1dGVOYW1lKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciA9CisgICAgICAgICAgICAoTGlmZWN5Y2xlTGlzdGVuZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgLy8gQWRkIHRoaXMgTGlmZWN5Y2xlTGlzdGVuZXIgdG8gb3VyIGFzc29jaWF0ZWQgY29tcG9uZW50CisgICAgICAgIExpZmVjeWNsZSBsaWZlY3ljbGUgPSAoTGlmZWN5Y2xlKSBkaWdlc3Rlci5wZWVrKCk7CisgICAgICAgIGxpZmVjeWNsZS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjJkOTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw4MCBAQAorY29udGV4dENvbmZpZy5hcHBsaWNhdGlvbkNsb3NlPUVycm9yIGNsb3NpbmcgYXBwbGljYXRpb24gd2ViLnhtbAorY29udGV4dENvbmZpZy5hcHBsaWNhdGlvbkNvbmZpZz1Db25maWd1cmF0aW9uIGVycm9yIGluIGFwcGxpY2F0aW9uIHdlYi54bWwKK2NvbnRleHRDb25maWcuYXBwbGljYXRpb25MaXN0ZW5lcj1FeGNlcHRpb24gY3JlYXRpbmcgbGlzdGVuZXIgb2YgY2xhc3MgezB9Citjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uTWlzc2luZz1NaXNzaW5nIGFwcGxpY2F0aW9uIHdlYi54bWwsIHVzaW5nIGRlZmF1bHRzIG9ubHkKK2NvbnRleHRDb25maWcuYXBwbGljYXRpb25QYXJzZT1QYXJzZSBlcnJvciBpbiBhcHBsaWNhdGlvbiB3ZWIueG1sIGZpbGUgYXQgezB9Citjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uUG9zaXRpb249T2NjdXJyZWQgYXQgbGluZSB7MH0gY29sdW1uIHsxfQorY29udGV4dENvbmZpZy5hdXRoZW50aWNhdG9yQ29uZmlndXJlZD1Db25maWd1cmVkIGFuIGF1dGhlbnRpY2F0b3IgZm9yIG1ldGhvZCB7MH0KK2NvbnRleHRDb25maWcuYXV0aGVudGljYXRvckluc3RhbnRpYXRlPUNhbm5vdCBpbnN0YW50aWF0ZSBhbiBhdXRoZW50aWNhdG9yIG9mIGNsYXNzIHswfQorY29udGV4dENvbmZpZy5hdXRoZW50aWNhdG9yTWlzc2luZz1DYW5ub3QgY29uZmlndXJlIGFuIGF1dGhlbnRpY2F0b3IgZm9yIG1ldGhvZCB7MH0KK2NvbnRleHRDb25maWcuYXV0aGVudGljYXRvclJlc291cmNlcz1DYW5ub3QgbG9hZCBhdXRoZW50aWNhdG9ycyBtYXBwaW5nIGxpc3QKK2NvbnRleHRDb25maWcuY2NlPUxpZmVjeWNsZSBldmVudCBkYXRhIG9iamVjdCB7MH0gaXMgbm90IGEgQ29udGV4dAorY29udGV4dENvbmZpZy5jZXJ0aWZpY2F0ZXNDb25maWcuYWRkZWQ9QWRkZWQgY2VydGlmaWNhdGVzIC0+IHJlcXVlc3QgYXR0cmlidXRlIFZhbHZlCitjb250ZXh0Q29uZmlnLmNlcnRpZmljYXRlc0NvbmZpZy5lcnJvcj1FeGNlcHRpb24gYWRkaW5nIENlcnRpZmljYXRlc1ZhbHZlOgorY29udGV4dENvbmZpZy5jb250ZXh0Q2xvc2U9RXJyb3IgY2xvc2luZyBjb250ZXh0LnhtbAorY29udGV4dENvbmZpZy5jb250ZXh0TWlzc2luZz1NaXNzaW5nIGNvbnRleHQueG1sOiB7MH0KK2NvbnRleHRDb25maWcuY29udGV4dFBhcnNlPVBhcnNlIGVycm9yIGluIGNvbnRleHQueG1sIGZvciB7MH0KK2NvbnRleHRDb25maWcuZGVmYXVsdENsb3NlPUVycm9yIGNsb3NpbmcgZGVmYXVsdCB3ZWIueG1sCitjb250ZXh0Q29uZmlnLmRlZmF1bHRDb25maWc9Q29uZmlndXJhdGlvbiBlcnJvciBpbiBkZWZhdWx0IHdlYi54bWwKK2NvbnRleHRDb25maWcuZGVmYXVsdE1pc3Npbmc9TWlzc2luZyBkZWZhdWx0IHdlYi54bWwsIHVzaW5nIGFwcGxpY2F0aW9uIHdlYi54bWwgb25seQorY29udGV4dENvbmZpZy5kZWZhdWx0UGFyc2U9UGFyc2UgZXJyb3IgaW4gZGVmYXVsdCB3ZWIueG1sCitjb250ZXh0Q29uZmlnLmRlZmF1bHRQb3NpdGlvbj1PY2N1cnJlZCBhdCBsaW5lIHswfSBjb2x1bW4gezF9Citjb250ZXh0Q29uZmlnLmZpeERvY0Jhc2U9RXhjZXB0aW9uIGZpeGluZyBkb2NCYXNlOiB7MH0gCitjb250ZXh0Q29uZmlnLmluaXQ9Q29udGV4dENvbmZpZzogSW5pdGlhbGl6aW5nCitjb250ZXh0Q29uZmlnLm1pc3NpbmdSZWFsbT1ObyBSZWFsbSBoYXMgYmVlbiBjb25maWd1cmVkIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpbnN0Citjb250ZXh0Q29uZmlnLnJvbGUuYXV0aD1TZWN1cml0eSByb2xlIG5hbWUgezB9IHVzZWQgaW4gYW4gPGF1dGgtY29uc3RyYWludD4gd2l0aG91dCBiZWluZyBkZWZpbmVkIGluIGEgPHNlY3VyaXR5LXJvbGU+Citjb250ZXh0Q29uZmlnLnJvbGUubGluaz1TZWN1cml0eSByb2xlIG5hbWUgezB9IHVzZWQgaW4gYSA8cm9sZS1saW5rPiB3aXRob3V0IGJlaW5nIGRlZmluZWQgaW4gYSA8c2VjdXJpdHktcm9sZT4KK2NvbnRleHRDb25maWcucm9sZS5ydW5hcz1TZWN1cml0eSByb2xlIG5hbWUgezB9IHVzZWQgaW4gYSA8cnVuLWFzPiB3aXRob3V0IGJlaW5nIGRlZmluZWQgaW4gYSA8c2VjdXJpdHktcm9sZT4KK2NvbnRleHRDb25maWcuc3RhcnQ9Q29udGV4dENvbmZpZzogUHJvY2Vzc2luZyBTVEFSVAorY29udGV4dENvbmZpZy5zdG9wPUNvbnRleHRDb25maWc6IFByb2Nlc3NpbmcgU1RPUAorY29udGV4dENvbmZpZy50bGRFbnRyeUV4Y2VwdGlvbj1FeGNlcHRpb24gcHJvY2Vzc2luZyBUTEQgezB9IGluIEpBUiBhdCByZXNvdXJjZSBwYXRoIHsxfSBpbiBjb250ZXh0IHsyfQorY29udGV4dENvbmZpZy50bGRGaWxlRXhjZXB0aW9uPUV4Y2VwdGlvbiBwcm9jZXNzaW5nIFRMRCBhdCByZXNvdXJjZSBwYXRoIHswfSBpbiBjb250ZXh0IHsxfQorY29udGV4dENvbmZpZy50bGRKYXJFeGNlcHRpb249RXhjZXB0aW9uIHByb2Nlc3NpbmcgSkFSIGF0IHJlc291cmNlIHBhdGggezB9IGluIGNvbnRleHQgezF9Citjb250ZXh0Q29uZmlnLnRsZFJlc291cmNlUGF0aD1JbnZhbGlkIFRMRCByZXNvdXJjZSBwYXRoIHswfQorY29udGV4dENvbmZpZy51bmF2YWlsYWJsZT1NYXJraW5nIHRoaXMgYXBwbGljYXRpb24gdW5hdmFpbGFibGUgZHVlIHRvIHByZXZpb3VzIGVycm9yKHMpCitjb250ZXh0Q29uZmlnLmFsdERETm90Rm91bmQ9YWx0LWRkIGZpbGUgezB9IG5vdCBmb3VuZAorZW1iZWRkZWQuYWxyZWFkeVN0YXJ0ZWQ9RW1iZWRkZWQgc2VydmljZSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKK2VtYmVkZGVkLm5vRW5naW5lcz1ObyBlbmdpbmVzIGhhdmUgYmVlbiBkZWZpbmVkIHlldAorZW1iZWRkZWQubm90bXA9Q2Fubm90IGZpbmQgc3BlY2lmaWVkIHRlbXBvcmFyeSBmb2xkZXIgYXQgezB9CitlbWJlZGRlZC5ub3RTdGFydGVkPUVtYmVkZGVkIHNlcnZpY2UgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCitlbWJlZGRlZC5hdXRoZW50aWNhdG9yTm90SW5zdGFuY2VPZlZhbHZlPVNwZWNpZmllZCBBdXRoZW50aWNhdG9yIGlzIG5vdCBhIFZhbHZlCitlbmdpbmVDb25maWcuY2NlPUxpZmVjeWNsZSBldmVudCBkYXRhIG9iamVjdCB7MH0gaXMgbm90IGFuIEVuZ2luZQorZW5naW5lQ29uZmlnLnN0YXJ0PUVuZ2luZUNvbmZpZzogUHJvY2Vzc2luZyBTVEFSVAorZW5naW5lQ29uZmlnLnN0b3A9RW5naW5lQ29uZmlnOiBQcm9jZXNzaW5nIFNUT1AKK2V4cGFuZFdhci5jb3B5PUVycm9yIGNvcHlpbmcgezB9IHRvIHsxfQoraG9zdENvbmZpZy5hcHBCYXNlPUFwcGxpY2F0aW9uIGJhc2UgZGlyZWN0b3J5IHswfSBkb2VzIG5vdCBleGlzdAoraG9zdENvbmZpZy5jYW5vbmljYWxpemluZz1FcnJvciBkZWxldGUgcmVkZXBsb3kgcmVzb3VyY2VzIGZyb20gY29udGV4dCBbezB9XQoraG9zdENvbmZpZy5jY2U9TGlmZWN5Y2xlIGV2ZW50IGRhdGEgb2JqZWN0IHswfSBpcyBub3QgYSBIb3N0Citob3N0Q29uZmlnLmNvbnRleHQuZGVzdHJveT1FcnJvciBkdXJpbmcgY29udGV4dCBbezB9XSBkZXN0cm95Citob3N0Q29uZmlnLmNvbnRleHQucmVtb3ZlPUVycm9yIHdoaWxlIHJlbW92aW5nIGNvbnRleHQgW3swfV0KK2hvc3RDb25maWcuY29udGV4dC5yZXN0YXJ0PUVycm9yIGR1cmluZyBjb250ZXh0IFt7MH1dIHJlc3RhcnQKK2hvc3RDb25maWcuZGVwbG95PURlcGxveWluZyB3ZWIgYXBwbGljYXRpb24gZGlyZWN0b3J5IHswfQoraG9zdENvbmZpZy5kZXBsb3lEZXNjcmlwdG9yPURlcGxveWluZyBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgezB9Citob3N0Q29uZmlnLmRlcGxveURlc2NyaXB0b3IuZXJyb3I9RXJyb3IgZGVwbG95aW5nIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciB7MH0KK2hvc3RDb25maWcuZGVwbG95RGVzY3JpcHRvci5sb2NhbERvY0Jhc2VTcGVjaWZpZWQ9QSBkb2NCYXNlIHswfSBpbnNpZGUgdGhlIGhvc3QgYXBwQmFzZSBoYXMgYmVlbiBzcGVjaWZpZWQsIGFuZCB3aWxsIGJlIGlnbm9yZWQKK2hvc3RDb25maWcuZGVwbG95RGlyPURlcGxveWluZyB3ZWIgYXBwbGljYXRpb24gZGlyZWN0b3J5IHswfQoraG9zdENvbmZpZy5kZXBsb3lEaXIuZXJyb3I9RXJyb3IgZGVwbG95aW5nIHdlYiBhcHBsaWNhdGlvbiBkaXJlY3RvcnkgezB9Citob3N0Q29uZmlnLmRlcGxveUphcj1EZXBsb3lpbmcgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgezB9Citob3N0Q29uZmlnLmRlcGxveUphci5lcnJvcj1FcnJvciBkZXBsb3lpbmcgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgezB9Citob3N0Q29uZmlnLmRlcGxveS5lcnJvcj1FeGNlcHRpb24gd2hpbGUgZGVwbG95aW5nIHdlYiBhcHBsaWNhdGlvbiBkaXJlY3RvcnkgezB9Citob3N0Q29uZmlnLmRlcGxveWluZz1EZXBsb3lpbmcgZGlzY292ZXJlZCB3ZWIgYXBwbGljYXRpb25zCitob3N0Q29uZmlnLmV4cGFuZD1FeHBhbmRpbmcgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgezB9Citob3N0Q29uZmlnLmV4cGFuZC5lcnJvcj1FeGNlcHRpb24gd2hpbGUgZXhwYW5kaW5nIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIHswfQoraG9zdENvbmZpZy5leHBhbmRpbmc9RXhwYW5kaW5nIGRpc2NvdmVyZWQgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmVzCitob3N0Q29uZmlnLmpteC5yZWdpc3Rlcj1SZWdpc3RlciBjb250ZXh0IFt7MH1dIGZhaWxlZAoraG9zdENvbmZpZy5qbXgudW5yZWdpc3Rlcj1VbnJlZ2lzdGVyIGNvbnRleHQgW3swfV0gZmFpbGVkCitob3N0Q29uZmlnLnJlbG9hZD1SZWxvYWRpbmcgY29udGV4dCBbezB9XQoraG9zdENvbmZpZy5yZW1vdmVYTUw9Q29udGV4dCBbezB9XSBpcyB1bmRlcGxveWVkCitob3N0Q29uZmlnLnJlbW92ZURJUj1EaXJlY3RvcnkgezB9IGlzIHVuZGVwbG95ZWQKK2hvc3RDb25maWcucmVtb3ZlV0FSPVdhciB7MH0gaXMgdW5kZXBsb3llZAoraG9zdENvbmZpZy5zdGFydD1Ib3N0Q29uZmlnOiBQcm9jZXNzaW5nIFNUQVJUCitob3N0Q29uZmlnLnN0b3A9SG9zdENvbmZpZzogUHJvY2Vzc2luZyBTVE9QCitob3N0Q29uZmlnLnVuZGVwbG95PVVuZGVwbG95aW5nIGNvbnRleHQgW3swfV0KK2hvc3RDb25maWcudW5kZXBsb3kuZXJyb3I9RXJyb3IgdW5kZXBsb3lpbmcgd2ViIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCB7MH0KK2hvc3RDb25maWcudW5kZXBsb3lpbmc9VW5kZXBsb3lpbmcgZGVwbG95ZWQgd2ViIGFwcGxpY2F0aW9ucwordXNlckNvbmZpZy5kYXRhYmFzZT1FeGNlcHRpb24gbG9hZGluZyB1c2VyIGRhdGFiYXNlCit1c2VyQ29uZmlnLmRlcGxveT1EZXBsb3lpbmcgd2ViIGFwcGxpY2F0aW9uIGZvciB1c2VyIHswfQordXNlckNvbmZpZy5kZXBsb3lpbmc9RGVwbG95aW5nIHVzZXIgd2ViIGFwcGxpY2F0aW9ucwordXNlckNvbmZpZy5lcnJvcj1FcnJvciBkZXBsb3lpbmcgd2ViIGFwcGxpY2F0aW9uIGZvciB1c2VyIHswfQordXNlckNvbmZpZy5zdGFydD1Vc2VyQ29uZmlnOiBQcm9jZXNzaW5nIFNUQVJUCit1c2VyQ29uZmlnLnN0b3A9VXNlckNvbmZpZzogUHJvY2Vzc2luZyBTVE9QCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NzQ1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDYxIEBACitjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uQ2xvc2U9RXJyb3IgZHVyYW50ZSBlbCBjaWVycmUgZGVsIGFyY2hpdm8gd2ViLnhtbCBkZSBsYSBhcGxpY2FjafNuCitjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uQ29uZmlnPUVycm9yIGRlIGNvbmZpZ3VyYWNp824gZW4gZWwgYXJjaGl2byB3ZWIueG1sIGRlIGxhIGFwbGljYWNp824KK2NvbnRleHRDb25maWcuYXBwbGljYXRpb25MaXN0ZW5lcj1FeGNlcGNp824gZHVyYW50ZSBsYSBjcmVhY2nzbiBkZSBsYSBjbGFzZSBkZSBlc2N1Y2hhIChsaXN0ZW5lcikgezB9Citjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uTWlzc2luZz1GYWx0YSBlbCBhcmNoaXZvIHdlYi54bWwgZGUgbGEgYXBsaWNhY2nzbi4gVXRpbGl6YW5kbyBsb3MgcGFy4W1ldHJvcyBwb3IgZGVmZWN0bworY29udGV4dENvbmZpZy5hcHBsaWNhdGlvblBhcnNlPUVycm9yIGRlIGV2YWx1YWNp824gKHBhcnNlKSBlbiBlbCBhcmNoaXZvIHdlYi54bWwgZGUgbGEgYXBsaWNhY2nzbiBhIHswfQorY29udGV4dENvbmZpZy5hcHBsaWNhdGlvblBvc2l0aW9uPVNlIGhhIHByb2R1Y2lkbyBlbiBsYSBs7W5lYSB7MH0gY29sdW1uYSB7MX0KK2NvbnRleHRDb25maWcuYXV0aGVudGljYXRvckNvbmZpZ3VyZWQ9Q29uZmlndXJhY2nzbiBkZSB1biBhdXRlbnRpZmljYWRvciAoYXV0aGVudGljYXRvcikgcGFyYSBlbCBt6XRvZG8gezB9Citjb250ZXh0Q29uZmlnLmF1dGhlbnRpY2F0b3JJbnN0YW50aWF0ZT1JbXBvc2libGUgZGUgaW5zdGFuY2lhciB1biBhdXRlbnRpY2Fkb3IgKGF1dGhlbnRpY2F0b3IpIHBhcmEgbGEgY2xhc2UgezB9Citjb250ZXh0Q29uZmlnLmF1dGhlbnRpY2F0b3JNaXNzaW5nPUltcG9zaWJsZSBkZSBjb25maWd1cmFyIHVuIGF1dGVudGlmaWNhZG9yIChhdXRoZW50aWNhdG9yKSBwYXJhIGVsIG3pdG9kbyB7MH0KK2NvbnRleHRDb25maWcuYXV0aGVudGljYXRvclJlc291cmNlcz1JbXBvc2libGUgZGUgY2FyZ2FyIGxhIGxpc3RhIGRlIGNvcnJlc3BvbmRlbmNpYSBkZSBhdXRlbnRpY2Fkb3JlcyAoYXV0aGVudGljYXRvcnMpCitjb250ZXh0Q29uZmlnLmNjZT1FbCBvYmpldG8gZGUgbG9zIGRhdG9zIGRlIGV2ZW50byBkZSBjaWNsbyBkZSB2aWRhIChMaWZlY3ljbGUgZXZlbnQgZGF0YSBvYmplY3QpIHswfSBubyBlcyB1biBDb250ZXh0bworY29udGV4dENvbmZpZy5jZXJ0aWZpY2F0ZXNDb25maWcuYWRkZWQ9QWRpY2nzbiBkZSBjZXJ0aWZpY2Fkb3MgLT4gcmVxdWllcmUgduFsdnVsYSBkZSBhdHJpYnV0byAoYXR0cmlidXRlIFZhbHZlKQorY29udGV4dENvbmZpZy5jZXJ0aWZpY2F0ZXNDb25maWcuZXJyb3I9RXhjZXBjafNuIGR1cmFudGUgbGEgYWRpY2nzbiBkZSAiQ2VydGlmaWNhdGVzVmFsdmUiOgorY29udGV4dENvbmZpZy5kZWZhdWx0Q2xvc2U9RXJyb3IgZHVyYW50ZSBlbCBjaWVycmUgZGVsIGFyY2hpdm8gd2ViLnhtbCBwb3IgZGVmZWN0bworY29udGV4dENvbmZpZy5kZWZhdWx0Q29uZmlnPUVycm9yIGRlIGNvbmZpZ3VyYWNp824gZW4gZWwgYXJjaGl2byB3ZWIueG1sIHBvciBkZWZlY3RvCitjb250ZXh0Q29uZmlnLmRlZmF1bHRNaXNzaW5nPUZhbHRhIGVsIGFyY2hpdm8gd2ViLnhtbCBwb3IgZGVmZWN0bywgdXRpbGl6YW5kbyBz82xvIGVsIGFyY2hpdm8gd2ViLnhtbCBkZSBsYSBhcGxpY2FjafNuCitjb250ZXh0Q29uZmlnLmRlZmF1bHRQYXJzZT1FcnJvciBkZSBldmFsdWFjafNuIChwYXJzZSkgZW4gZWwgYXJjaXZvIHdlYi54bWwgcG9yIGRlZmVjdG8KK2NvbnRleHRDb25maWcuZGVmYXVsdFBvc2l0aW9uPVNlIGhhIHByb2R1Y2lkbyBlbiBsYSBs7W5lYSB7MH0gY29sdW1uYSB7MX0KK2NvbnRleHRDb25maWcubWlzc2luZ1JlYWxtPUFsZ/puIHJlaW5vIChyZWFsbSkgbm8gaGEgc2lkbyBjb25maWd1cmFkbyBwYXJhIHJlYWxpemFyIGxhIGF1dGVudGljYWNp824KK2NvbnRleHRDb25maWcucm9sZS5hdXRoPUVsIG5vbWJyZSBkZSBwYXBlbCBkZSBzZWd1cmlkYWQgezB9IGVzIHVzYWRvIGVuIHVuIDxhdXRoLWNvbnN0cmFpbnQ+IHNpbiBoYWJlciBzaWRvIGRlZmluaWRvIGVuIDxzZWN1cml0eS1yb2xlPgorY29udGV4dENvbmZpZy5yb2xlLmxpbms9RWwgbm9tYnJlIGRlIHBhcGVsIGRlIHNlZ3VyaWRhZCB7MH0gZXMgdXNhZG8gZW4gdW4gPHJvbGUtbGluaz4gc2luIGhhYmVyIHNpZG8gZGVmaW5pZG8gZW4gPHNlY3VyaXR5LXJvbGU+Citjb250ZXh0Q29uZmlnLnJvbGUucnVuYXM9RWwgbm9tYnJlIGRlIHBhcGVsIGRlIHNlZ3VyaWRhZCB7MH0gZXMgdXNhZG8gZW4gdW4gPHJ1bi1hcz4gc2luIGhhYmVyIHNpZG8gZGVmaW5pZG8gZW4gPHNlY3VyaXR5LXJvbGU+Citjb250ZXh0Q29uZmlnLnN0YXJ0PSJDb250ZXh0Q29uZmlnIjogVHJhdGFtaWVudG8gZGVsICJTVEFSVCIKK2NvbnRleHRDb25maWcuc3RvcD0iQ29udGV4dENvbmZpZyI6IFRyYXRhbWllbnRvIGRlbCAiU1RPUCIKK2NvbnRleHRDb25maWcudGxkRW50cnlFeGNlcHRpb249RXhjZXBjafNuIGR1cmFudGUgZWwgdHJhdGFtaWVudG8gZGUgbGEgVExEIHswfSBlbiBlbCBKQVIgaW5kaWNhZG8gcG9yIGxhIHRyYXllY3RvcmlhIGRlIHJlY3Vyc28gezF9IGVuIGNvbnRleHRvIHsyfQorY29udGV4dENvbmZpZy50bGRGaWxlRXhjZXB0aW9uPUV4Y2VwY2nzbiBkdXJhbnRlIGVsIHRyYXRhbWllbnRvIGRlIGxhIFRMRCBpbmRpY2FkYSBwb3IgbGEgdHJheWVjdG9yaWEgZGUgcmVjdXJzbyB7MH0gZW4gY29udGV4dG8gezF9Citjb250ZXh0Q29uZmlnLnRsZEphckV4Y2VwdGlvbj1FeGNlcGNp824gZHVyYW50ZSBlbCB0cmF0YW1pZW50byBkZWwgSkFSIGluZGljYWRvIHBvciBsYSB0cmF5ZWN0b3JpYSBkZSByZWN1cnNvIHswfSBlbiBjb250ZXh0byB7MX0KK2NvbnRleHRDb25maWcudGxkUmVzb3VyY2VQYXRoPVRyYXllY3RvcmlhIGRlIHJlY3Vyc28gVExEIHswfSBpbnbhbGlkYQorY29udGV4dENvbmZpZy51bmF2YWlsYWJsZT1Fc3RhIGFwbGljYWNp824gZXN04SBtYXJjYWRhIGNvbW8gbm8gZGlzcG9uaWJsZSBkZWJpZG8gYSBsb3MgZXJyb3JlcyBwcmVjZWRlbnRlcworZW1iZWRkZWQuYWxyZWFkeVN0YXJ0ZWQ9RWwgc2VydmljaW8gZW1iZWJpZG8gKGVtYmVkZGVkIHNlcnZpY2UpIHlhIGhhIHNpZG8gYXJyYW5jYWRvCitlbWJlZGRlZC5ub0VuZ2luZXM9QWxn+m4gbW90b3IgKGVuZ2luZSkgbm8gaGEgc2lkbyBh+m4gZGVmaW5pZG8KK2VtYmVkZGVkLm5vdFN0YXJ0ZWQ9RWwgc2VydmljaW8gZW1iZWJpZG8gKGVtYmVkZGVkIHNlcnZpY2UpIGH6biBubyBoYSBzaWRvIGFycmFuY2FkbworZW5naW5lQ29uZmlnLmNjZT1FbCBvYmpldG8gZGUgbG9zIGRhdG9zIGRlIGV2ZW50byBkZSBjaWNsbyBkZSB2aWRhIChMaWZlY3ljbGUgZXZlbnQgZGF0YSBvYmplY3QpIHswfSBubyBlcyB1biBtb3RvciAoZW5naW5lKQorZW5naW5lQ29uZmlnLnN0YXJ0PSJFbmdpbmVDb25maWciOiBUcmF0YW1pZW50byBkZWwgIlNUQVJUIgorZW5naW5lQ29uZmlnLnN0b3A9IkVuZ2luZUNvbmZpZyI6IFRyYXRhbWllbnRvIGRlbCAiU1RPUCIKK2hvc3RDb25maWcuYXBwQmFzZT1ObyBleGlzdGUgZWwgZGlyZWN0b3JpbyBiYXNlIGRlIGxhIGFwbGljYWNp824gezB9Citob3N0Q29uZmlnLmNjZT1FbCBvYmpldG8gZGUgbG9zIGRhdG9zIGRlIGV2ZW50byBkZSBjaWNsbyBkZSB2aWRhIChMaWZlY3ljbGUgZXZlbnQgZGF0YSBvYmplY3QpIHswfSBubyBlcyB1bmEgbeFxdWluYSAoaG9zdCkKK2hvc3RDb25maWcuZGVwbG95PURlc3BsaWVxdWUgZGVsIGRpcmVjdG9yaW8gezB9IGRlIGxhIGFwbGljYWNp824gd2ViCitob3N0Q29uZmlnLmRlcGxveURlc2NyaXB0b3I9RGVzcGxpZXF1ZSBkZWwgZGVzY3JpcHRvciBkZSBjb25maWd1cmFjafNuIHswfQoraG9zdENvbmZpZy5kZXBsb3lEZXNjcmlwdG9yLmVycm9yPUVycm9yIGR1cmFudGUgZWwgZGVzcGxpZWd1ZSBkZWwgZGVzY3JpcHRvciBkZSBjb25maWd1cmFjafNuIHswfQoraG9zdENvbmZpZy5kZXBsb3lEaXI9RGVzcGxpZWd1ZSBkZWwgZGlyZWN0b3JpbyB7MH0gZGUgbGEgYXBsaWNhY2nzbiB3ZWIKK2hvc3RDb25maWcuZGVwbG95RGlyLmVycm9yPUVycm9yIGR1cmFudGUgZWwgZGVzcGxpZWd1ZSBkZWwgZGlyZWN0b3JpbyB7MH0gZGUgbGEgYXBsaWNhY2nzbiB3ZWIKK2hvc3RDb25maWcuZGVwbG95SmFyPURlc3BsaWVndWUgZGVsIGFyY2hpdm8gezB9IGRlIGxhIGFwbGljYWNp824gd2ViCitob3N0Q29uZmlnLmRlcGxveUphci5lcnJvcj1FcnJvciBkdXJhbnRlIGVsIGRlc3BsaWVndWUgZGVsIGFyY2hpdm8gezB9IGRlIGxhIGFwbGljYWNp824gd2ViCitob3N0Q29uZmlnLmRlcGxveS5lcnJvcj1FeGNlcGNp824gZW4gZWwgZGlyZWN0b3JpbyB7MH0gZGUgbGEgYXBsaWNhY2nzbiB3ZWIKK2hvc3RDb25maWcuZGVwbG95aW5nPURlc3BsZWdhbmRvIGFwbGljYWNpb25lcyB3ZWIgZGVzY3ViaWVydGFzCitob3N0Q29uZmlnLmV4cGFuZD1EZXNjb21wcmVzafNuIGRlbCBhcmNoaXZvIHswfSBkZSBsYSBhcGxpY2FjafNuIHdlYgoraG9zdENvbmZpZy5leHBhbmQuZXJyb3I9RXhjZXBjafNuIGR1cmFudGUgbGEgZGVzY29tcHJlc2nzbiBkZWwgYXJjaGl2byB7MH0gZGUgbGEgYXBsaWNhY2nzbiB3ZWIKK2hvc3RDb25maWcuZXhwYW5kaW5nPURlc2N1YmllcnRhIGRlc2NvbXByZXNp824gZGUgYXJjaGl2b3MgZGUgYXBsaWNhY2lvbmVzIHdlYgoraG9zdENvbmZpZy5jb250ZXh0LnJlc3RhcnQ9RXJyb3IgZHVyYW50ZSBlbCBhcnJhbnF1ZSBkZWwgY29udGV4dG8gezB9Citob3N0Q29uZmlnLnN0YXJ0PSJIb3N0Q29uZmlnIjogVHJhdGFtaWVudG8gZGVsICJTVEFSVCIKK2hvc3RDb25maWcuc3RvcD0iSG9zdENvbmZpZyI6IFRyYXRhbWllbnRvIGRlbCAiU1RPUCIKK2hvc3RDb25maWcudW5kZXBsb3k9UmVwbGllZ3VlICh1bmRlcGxveSkgZGUgbGEgYXBsaWNhY2nzbiB3ZWIgcXVlIHRpZW5lIGNvbW8gdHJheWVjdG9yaWEgZGUgY29udGV4dG8gezB9Citob3N0Q29uZmlnLnVuZGVwbG95LmVycm9yPUVycm9yIGR1cmFudGUgZWwgcmVwbGllZ3VlICh1bmRlcGxveSkgZGUgbGEgYXBsaWNhY2nzbiB3ZWIgcXVlIHRpZW5lIGNvbW8gdHJheWVjdG9yaWEgZGUgY29udGV4dG8gezB9Citob3N0Q29uZmlnLnVuZGVwbG95aW5nPVJlcGxpZWd1ZSBkZSBsYXMgYXBsaWNhY2lvbmVzIHdlYiBkZXNwbGVnYWRhcwordXNlckNvbmZpZy5kYXRhYmFzZT1FeGNlcGNp824gZHVyYW50ZSBsYSBjYXJnYSBkZSBiYXNlIGRlIGRhdG9zIGRlIHVzdWFyaW8KK3VzZXJDb25maWcuZGVwbG95PURlc3BsaWVndWUgZGUgbGEgYXBsaWNhY2nzbiB3ZWIgcGFyYSBlbCB1c3VhcmlvIHswfQordXNlckNvbmZpZy5kZXBsb3lpbmc9RGVzcGxlZ2FuZG8gYXBsaWNhY2lvbmVzIHdlYiBwYXJhIGVsIHVzdWFyaW8KK3VzZXJDb25maWcuZXJyb3I9RXJyb3IgZHVyYW50ZSBlbCBkZXNwbGllZ3VlIGRlIGxhIGFwbGljYWNp824gd2ViIHBhcmEgZWwgdXNhcmlvIHswfQordXNlckNvbmZpZy5zdGFydD0iVXNlckNvbmZpZyI6IFRyYXRhbWllbnRvIGRlbCAiU1RBUlQiCit1c2VyQ29uZmlnLnN0b3A9IlVzZXJDb25maWciOiBUcmF0YW1pZW50byBkZWwgIlNUT1AiCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzN2Q1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpAQCAtMCwwICsxLDU5IEBACitjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uQ2xvc2U9RXJyZXVyIGxvcnMgZGUgbGEgZmVybWV0dXJlIGR1IGZpY2hpZXIgd2ViLnhtbCBkZSBsJydhcHBsaWNhdGlvbgorY29udGV4dENvbmZpZy5hcHBsaWNhdGlvbkNvbmZpZz1FcnJldXIgZGUgY29uZmlndXJhdGlvbiBkYW5zIGxlIGZpY2hpZXIgd2ViLnhtbCBkZSBsJydhcHBsaWNhdGlvbgorY29udGV4dENvbmZpZy5hcHBsaWNhdGlvbkxpc3RlbmVyPUV4Y2VwdGlvbiBsb3JzIGRlIGxhIGNy6WF0aW9uIGRlIGxhIGNsYXNzZSBkJyfpY291dGUgKGxpc3RlbmVyKSB7MH0KK2NvbnRleHRDb25maWcuYXBwbGljYXRpb25NaXNzaW5nPUxlIGZpY2hpZXIgd2ViLnhtbCBkZSBsJydhcHBsaWNhdGlvbiBlc3QgYWJzZW50LCB1dGlsaXNhdGlvbiBkZXMgcGFyYW3qdHJlcyBwYXIgZOlmYXV0Citjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uUGFyc2U9RXJyZXVyIGQnJ+l2YWx1YXRpb24gKHBhcnNlKSBkYW5zIGxlIGZpY2hpZXIgd2ViLnhtbCBkZSBsJydhcHBsaWNhdGlvbiDgIHswfQorY29udGV4dENvbmZpZy5hcHBsaWNhdGlvblBvc2l0aW9uPVMnJ2VzdCBwcm9kdWl0ZSDgIGxhIGxpZ25lIHswfSBjb2xvbm5lIHsxfQorY29udGV4dENvbmZpZy5hdXRoZW50aWNhdG9yQ29uZmlndXJlZD1Db25maWd1cmF0aW9uIGQnJ3VuIGF1dGhlbnRpZmljYXRldXIgKGF1dGhlbnRpY2F0b3IpIHBvdXIgbGEgbel0aG9kZSB7MH0KK2NvbnRleHRDb25maWcuYXV0aGVudGljYXRvckluc3RhbnRpYXRlPUltcG9zc2libGUgZCcnaW5zdGFuY2llciB1biBhdXRoZW50aWZpY2F0ZXVyIChhdXRoZW50aWNhdG9yKSBwb3VyIGxhIGNsYXNzZSB7MH0KK2NvbnRleHRDb25maWcuYXV0aGVudGljYXRvck1pc3Npbmc9SW1wb3NzaWJsZSBkZSBjb25maWd1cmVyIHVuIGF1dGhlbnRpZmljYXRldXIgKGF1dGhlbnRpY2F0b3IpIHBvdXIgbGEgbel0aG9kZSB7MH0KK2NvbnRleHRDb25maWcuYXV0aGVudGljYXRvclJlc291cmNlcz1JbXBvc3NpYmxlIGRlIGNoYXJnZXIgbGEgbGlzdGUgZGUgY29ycmVzcG9uZGFuY2UgZGVzIGF1dGhlbnRpZmljYXRldXIgKGF1dGhlbnRpY2F0b3JzKQorY29udGV4dENvbmZpZy5jY2U9TCcnb2JqZXQgZG9ubullIOl26G5lbWVudCBjeWNsZSBkZSB2aWUgKExpZmVjeWNsZSBldmVudCBkYXRhIG9iamVjdCkgezB9IG4nJ2VzdCBwYXMgdW4gQ29udGV4dGUKK2NvbnRleHRDb25maWcuY2VydGlmaWNhdGVzQ29uZmlnLmFkZGVkPUFqb3V0IGRlIGNlcnRpZmljYXRzIC0+IHJlcXXqdGUgQXR0cmlidXQgZGUgVmFsdmUgKGF0dHJpYnV0ZSBWYWx2ZSkKK2NvbnRleHRDb25maWcuY2VydGlmaWNhdGVzQ29uZmlnLmVycm9yPUV4Y2VwdGlvbiBsb3JzIGRlIGwnJ2Fqb3V0IGRlcyAiQ2VydGlmaWNhdGVzVmFsdmUiOgorY29udGV4dENvbmZpZy5kZWZhdWx0Q2xvc2U9RXJyZXVyIGxvcnMgZGUgbGEgZmVybWV0dXJlIGR1IGZpY2hpZXIgd2ViLnhtbCBwYXIgZOlmYXV0Citjb250ZXh0Q29uZmlnLmRlZmF1bHRDb25maWc9RXJyZXVyIGRlIGNvbmZpZ3VyYXRpb24gZGFucyBsZSBmaWNoaWVyIHdlYi54bWwgcGFyIGTpZmF1dAorY29udGV4dENvbmZpZy5kZWZhdWx0TWlzc2luZz1MZSBmaWNoaWVyIHdlYi54bWwgcGFyIGTpZmF1dCBlc3QgYWJzZW50LCB1dGlsaXNhdGlvbiBkdSBmaWNoaWVyIHdlYi54bWwgZGUgbCcnYXBwbGljYXRpb24gd2ViLnhtbCBzZXVsZW1lbnQKK2NvbnRleHRDb25maWcuZGVmYXVsdFBhcnNlPUVycmV1ciBkJyfpdmFsdWF0aW9uIChwYXJzZSkgZGFucyBsZSBmaWNoaWVyIHdlYi54bWwgcGFyIGTpZmF1dAorY29udGV4dENvbmZpZy5kZWZhdWx0UG9zaXRpb249UycnZXN0IHByb2R1aXRlIOAgbGEgbGlnbmUgezB9IGNvbG9ubmUgezF9Citjb250ZXh0Q29uZmlnLm1pc3NpbmdSZWFsbT1BdWN1biByb3lhdW1lIChyZWFsbSkgbicnYSDpdOkgY29uZmlndXLpIHBvdXIgculhbGlzZXIgbCcnYXV0aGVudGlmaWNhdGlvbgorY29udGV4dENvbmZpZy5yb2xlLmF1dGg9TGUgbm9tIGRlIHL0bGUgZGUgc+ljdXJpdOkgezB9IGVzdCB1dGlsaXPpIGRhbnMgdW4gPGF1dGgtY29uc3RyYWludD4gc2FucyBhdm9pciDpdOkgZOlmaW5pIGRhbnMgPHNlY3VyaXR5LXJvbGU+Citjb250ZXh0Q29uZmlnLnJvbGUubGluaz1MZSBub20gZGUgcvRsZSBkZSBz6WN1cml06SB7MH0gZXN0IHV0aWxpc+kgZGFucyB1biA8cm9sZS1saW5rPiBzYW5zIGF2b2lyIOl06SBk6WZpbmkgZGFucyA8c2VjdXJpdHktcm9sZT4KK2NvbnRleHRDb25maWcucm9sZS5ydW5hcz1MZSBub20gZGUgcvRsZSBkZSBz6WN1cml06SB7MH0gZXN0IHV0aWxpc+kgZGFucyB1biA8cnVuLWFzPiBzYW5zIGF2b2lyIOl06SBk6WZpbmkgZGFucyA8c2VjdXJpdHktcm9sZT4KK2NvbnRleHRDb25maWcuc3RhcnQ9IkNvbnRleHRDb25maWciOiBUcmFpdGVtZW50IGR1ICJTVEFSVCIKK2NvbnRleHRDb25maWcuc3RvcD0iQ29udGV4dENvbmZpZyI6IFRyYWl0ZW1lbnQgZHUgIlNUT1AiCitjb250ZXh0Q29uZmlnLnRsZEVudHJ5RXhjZXB0aW9uPUV4Y2VwdGlvbiBsb3JzIGR1IHRyYWl0ZW1lbnQgZGUgbGEgVExEIHswfSBkYW5zIGxlIEpBUiBpbmRpcXXpIHBhciBsZSBjaGVtaW4gZGUgcmVzc291cmNlIHsxfSBkYW5zIGxlIGNvbnRleHRlIHsyfQorY29udGV4dENvbmZpZy50bGRGaWxlRXhjZXB0aW9uPUV4Y2VwdGlvbiBsb3JzIGR1IHRyYWl0ZW1lbnQgZGUgbGEgVExEIGluZGlxdekgcGFyIGxlIGNoZW1pbiBkZSByZXNzb3VyY2UgezB9IGRhbnMgbGUgY29udGV4dGUgezF9Citjb250ZXh0Q29uZmlnLnRsZEphckV4Y2VwdGlvbj1FeGNlcHRpb24gbG9ycyBkdSB0cmFpdGVtZW50IGR1IEpBUiBpbmRpcXXpIHBhciBsZSBjaGVtaW4gZGUgcmVzc291cmNlIHswfSBkYW5zIGxlIGNvbnRleHRlIHsxfQorY29udGV4dENvbmZpZy50bGRSZXNvdXJjZVBhdGg9Q2hlbWluIGRlIHJlc3NvdXJjZSBUTEQgezB9IGludmFsaWRlCitjb250ZXh0Q29uZmlnLnVuYXZhaWxhYmxlPUNldHRlIGFwcGxpY2F0aW9uIGVzdCBtYXJxdellIGNvbW1lIG5vbiBkaXNwb25pYmxlIHN1aXRlIGF1eCBlcnJldXJzIHBy6WPpZGVudGVzCitlbWJlZGRlZC5hbHJlYWR5U3RhcnRlZD1MZSBzZXJ2aWNlIGVuZm91aSAoZW1iZWRkZWQgc2VydmljZSkgYSBk6WrgIOl06SBk6W1hcnLpCitlbWJlZGRlZC5ub0VuZ2luZXM9QXVjdW4gbW90ZXVyIChlbmdpbmUpIG4nJ2EgZW5jb3JlIOl06SBk6WZpbmkKK2VtYmVkZGVkLm5vdFN0YXJ0ZWQ9TGUgc2VydmljZSBlbmZvdWkgKGVtYmVkZGVkIHNlcnZpY2UpIG4nJ2EgcGFzIGVuY29yZSDpdOkgZOltYXJy6QorZW5naW5lQ29uZmlnLmNjZT1MJydvYmpldCBkb25u6WUg6XbobmVtZW50IGN5Y2xlIGRlIHZpZSAoTGlmZWN5Y2xlIGV2ZW50IGRhdGEgb2JqZWN0KSB7MH0gbicnZXN0IHBhcyB1biBtb3RldXIgKGVuZ2luZSkKK2VuZ2luZUNvbmZpZy5zdGFydD0iRW5naW5lQ29uZmlnIjogVHJhaXRlbWVudCBkdSAiU1RBUlQiCitlbmdpbmVDb25maWcuc3RvcD0iRW5naW5lQ29uZmlnIjogVHJhaXRlbWVudCBkdSAiU1RPUCIKK2hvc3RDb25maWcuY2NlPUwnJ29iamV0IGRvbm7pZSDpduhuZW1lbnQgY3ljbGUgZGUgdmllIChMaWZlY3ljbGUgZXZlbnQgZGF0YSBvYmplY3QpIHswfSBuJydlc3QgcGFzIHVuIGj0dGUKK2hvc3RDb25maWcuZGVwbG95PUTpcGxvaWVtZW50IGR1IHLpcGVydG9pcmUgezB9IGRlIGwnJ2FwcGxpY2F0aW9uIHdlYgoraG9zdENvbmZpZy5kZXBsb3lEZXNjcmlwdG9yPUTpcGxvaWVtZW50IGR1IGRlc2NyaXB0ZXVyIGRlIGNvbmZpZ3VyYXRpb24gezB9Citob3N0Q29uZmlnLmRlcGxveURlc2NyaXB0b3IuZXJyb3I9RXJyZXVyIGxvcnMgZHUgZOlwbG9pZW1lbnQgZHUgZGVzY3JpcHRldXIgZGUgY29uZmlndXJhdGlvbiB7MH0KK2hvc3RDb25maWcuZGVwbG95RGlyPUTpcGxvaWVtZW50IGR1IHLpcGVydG9pcmUgezB9IGRlIGwnJ2FwcGxpY2F0aW9uIHdlYgoraG9zdENvbmZpZy5kZXBsb3lEaXIuZXJyb3I9RXJyZXVyIGxvcnMgZHUgZOlwbG9pZW1lbnQgZHUgculwZXJ0b2lyZSB7MH0gZGUgbCcnYXBwbGljYXRpb24gd2ViCitob3N0Q29uZmlnLmRlcGxveUphcj1E6XBsb2llbWVudCBkZSBsJydhcmNoaXZlIHswfSBkZSBsJydhcHBsaWNhdGlvbiB3ZWIKK2hvc3RDb25maWcuZGVwbG95SmFyLmVycm9yPUVycmV1ciBsb3JzIGR1IGTpcGxvaWVtZW50IGRlIGwnJ2FyY2hpdmUgezB9IGRlIGwnJ2FwcGxpY2F0aW9uIHdlYgoraG9zdENvbmZpZy5kZXBsb3kuZXJyb3I9RXhjZXB0aW9uIGxvcnMgZHUgculwZXJ0b2lyZSB7MH0gZGUgbCcnYXBwbGljYXRpb24gd2ViCitob3N0Q29uZmlnLmRlcGxveWluZz1E6XBsb2llbWVudCBkZXMgYXBwbGljYXRpb25zIHdlYiBk6WNvdXZlcnRlcyAoZGlzY292ZXJlZCkKK2hvc3RDb25maWcuZXhwYW5kPUTpY29tcHJlc3Npb24gZGUgbCcnYXJjaGl2ZSB7MH0gZGUgbCcnYXBwbGljYXRpb24gd2ViCitob3N0Q29uZmlnLmV4cGFuZC5lcnJvcj1FeGNlcHRpb24gbG9ycyBkZSBsYSBk6WNvbXByZXNzaW9uIGRlIGwnJ2FyY2hpdmUgezB9IGRlIGwnJ2FwcGxpY2F0aW9uIHdlYgoraG9zdENvbmZpZy5leHBhbmRpbmc9ROljb21wcmVzc2lvbiBkZXMgYXJjaGl2ZXMgZGVzIGFwcGxpY2F0aW9ucyB3ZWIgZOljb3V2ZXJ0ZXMgKGRpc2NvdmVyZWQpCitob3N0Q29uZmlnLnN0YXJ0PSJIb3N0Q29uZmlnIjogVHJhaXRlbWVudCBkdSAiU1RBUlQiCitob3N0Q29uZmlnLnN0b3A9Ikhvc3RDb25maWciOiBUcmFpdGVtZW50IGR1ICJTVE9QIgoraG9zdENvbmZpZy51bmRlcGxveT1SZXBsaSAodW5kZXBsb3kpIGRlIGwnJ2FwcGxpY2F0aW9uIHdlYiBheWFudCBwb3VyIGNoZW1pbiBkZSBjb250ZXh0ZSB7MH0KK2hvc3RDb25maWcudW5kZXBsb3kuZXJyb3I9RXJyZXVyIGxvcnMgZHUgcmVwbGkgKHVuZGVwbG95KSBkZSBsJydhcHBsaWNhdGlvbiB3ZWIgYXlhbnQgcG91ciBjaGVtaW4gZGUgY29udGV4dGUgezB9Citob3N0Q29uZmlnLnVuZGVwbG95aW5nPVJlcGxpIGRlcyBhcHBsaWNhdGlvbnMgd2ViIGTpcGxveellcwordXNlckNvbmZpZy5kYXRhYmFzZT1FeGNlcHRpb24gbG9ycyBkdSBjaGFyZ2VtZW50IGRlIGxhIGJhc2UgZGUgZG9ubullcyB1dGlsaXNhdGV1cgordXNlckNvbmZpZy5kZXBsb3k9ROlwbG9pZW1lbnQgZGUgbCcnYXBwbGljYXRpb24gd2ViIHBvdXIgbCcndXRpbGlzYXRldXIgezB9Cit1c2VyQ29uZmlnLmRlcGxveWluZz1E6XBsb2llbWVudCBkZXMgYXBwbGljYXRpb25zIHdlYiB1dGlsaXNhdGV1cgordXNlckNvbmZpZy5lcnJvcj1FcnJldXIgbG9ycyBkdSBk6XBsb2llbWVudCBkZSBsJydhcHBsaWNhdGlvbiB3ZWIgcG91ciBsJyd1dGlsaXNhdGV1ciB7MH0KK3VzZXJDb25maWcuc3RhcnQ9IlVzZXJDb25maWciOiBUcmFpdGVtZW50IGR1ICJTVEFSVCIKK3VzZXJDb25maWcuc3RvcD0iVXNlckNvbmZpZyI6IFRyYWl0ZW1lbnQgZHUgIlNUT1AiCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MTZmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpAQCAtMCwwICsxLDY0IEBACitjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uQ2xvc2U9XHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZld2ViLnhtbFx1MzA5Mlx1MzBhZlx1MzBlZFx1MzBmY1x1MzBiYVx1NGUyZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OQorY29udGV4dENvbmZpZy5hcHBsaWNhdGlvbkNvbmZpZz1cdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmV3ZWIueG1sXHUzMDZlXHU4YTJkXHU1YjlhXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5Citjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uTGlzdGVuZXI9XHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwNmVcdTMwZWFcdTMwYjlcdTMwY2FcdTMwOTJcdTRmNWNcdTYyMTBcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK2NvbnRleHRDb25maWcuYXBwbGljYXRpb25NaXNzaW5nPVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZXdlYi54bWxcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDFcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNjBcdTMwNTFcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTkKK2NvbnRleHRDb25maWcuYXBwbGljYXRpb25QYXJzZT1cdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmV3ZWIueG1sXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViIHswfSBcdTMwNmVcdTg5ZTNcdTY3OTBcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK2NvbnRleHRDb25maWcuYXBwbGljYXRpb25Qb3NpdGlvbj17MH1cdTg4NGNcdTMwNmV7MX1cdTUyMTdcdTc2ZWVcdTMwNjdcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2NvbnRleHRDb25maWcuYXV0aGVudGljYXRvckNvbmZpZ3VyZWQ9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5IHswfSBcdTMwNmVcdTMwYWFcdTMwZmNcdTMwYmJcdTMwZjNcdTMwYzZcdTMwYTNcdTMwYjFcdTMwZmNcdTMwYmZcdTMwOTJcdThhMmRcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTkKK2NvbnRleHRDb25maWcuYXV0aGVudGljYXRvckluc3RhbnRpYXRlPVx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDZlXHUzMGFhXHUzMGZjXHUzMGJiXHUzMGYzXHUzMGM2XHUzMGEzXHUzMGIxXHUzMGZjXHUzMGJmXHUzMDkyXHUzMGE0XHUzMGYzXHUzMGI5XHUzMGJmXHUzMGYzXHUzMGI5XHU1MzE2XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitjb250ZXh0Q29uZmlnLmF1dGhlbnRpY2F0b3JNaXNzaW5nPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOSB7MH0gXHUzMDZlXHUzMGFhXHUzMGZjXHUzMGJiXHUzMGYzXHUzMGM2XHUzMGEzXHUzMGIxXHUzMGZjXHUzMGJmXHUzMDkyXHU4YTJkXHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitjb250ZXh0Q29uZmlnLmF1dGhlbnRpY2F0b3JSZXNvdXJjZXM9XHUzMGFhXHUzMGZjXHUzMGJiXHUzMGYzXHUzMGM2XHUzMGEzXHUzMGIxXHUzMGZjXHUzMGJmXHUzMDZlXHUzMGRlXHUzMGMzXHUzMGQ3XHUzMGVhXHUzMGI5XHUzMGM4XHUzMDkyXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitjb250ZXh0Q29uZmlnLmNjZT1cdTMwZTlcdTMwYTRcdTMwZDVcdTMwYjVcdTMwYTRcdTMwYWZcdTMwZWJcdTMwYTRcdTMwZDlcdTMwZjNcdTMwYzhcdTMwYzdcdTMwZmNcdTMwYmZcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzggezB9IFx1MzA2Zlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworY29udGV4dENvbmZpZy5jZXJ0aWZpY2F0ZXNDb25maWcuYWRkZWQ9XHU4YTNjXHU2NjBlXHU2NmY4XHUzMDkyXHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMDZlXHU1YzVlXHU2MDI3XHU1MDI0XHUzMDZiXHU4ZmZkXHU1MmEwXHUzMDU3XHUzMDdlXHUzMDU5Citjb250ZXh0Q29uZmlnLmNlcnRpZmljYXRlc0NvbmZpZy5lcnJvcj1DZXJ0aWZpY2F0ZXNWYWx2ZVx1MzA5Mlx1OGZmZFx1NTJhMFx1NGUyZFx1MzA2Ylx1NGY4Ylx1NTkxNlx1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZjoKK2NvbnRleHRDb25maWcuZGVmYXVsdENsb3NlPVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA2ZXdlYi54bWxcdTMwNmVcdTMwYWZcdTMwZWRcdTMwZmNcdTMwYmFcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2NvbnRleHRDb25maWcuZGVmYXVsdENvbmZpZz1cdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmV3ZWIueG1sXHUzMDZlXHU0ZTJkXHUzMDZlXHU4YTJkXHU1YjlhXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5Citjb250ZXh0Q29uZmlnLmRlZmF1bHRNaXNzaW5nPVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA2ZXdlYi54bWxcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDFcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmV3ZWIueG1sXHUzMDYwXHUzMDUxXHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5Citjb250ZXh0Q29uZmlnLmRlZmF1bHRQYXJzZT1cdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmV3ZWIueG1sXHU0ZTJkXHUzMDZlXHU4OWUzXHU2NzkwXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5Citjb250ZXh0Q29uZmlnLmRlZmF1bHRQb3NpdGlvbj17MH1cdTg4NGNcdTMwNmV7MX1cdTUyMTdcdTc2ZWVcdTMwNjdcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2NvbnRleHRDb25maWcubWlzc2luZ1JlYWxtPVx1OGE4ZFx1OGEzY1x1MzA1OVx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzA2Ylx1MzBlY1x1MzBlYlx1MzBlMFx1MzA0Y1x1OGEyZFx1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworY29udGV4dENvbmZpZy5yb2xlLmF1dGg9PHNlY3VyaXR5LXJvbGU+XHUzMDZiXHU1YjlhXHU3ZmE5XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDZhXHUzMDQ0XHUzMGJiXHUzMGFkXHUzMGU1XHUzMGVhXHUzMGM2XHUzMGEzXHUzMGVkXHUzMGZjXHUzMGViXHU1NDBkIHswfSBcdTMwNGM8YXV0aC1jb25zdHJhaW50Plx1MzA2ZVx1NGUyZFx1MzA2N1x1NGY3Zlx1NzUyOFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1ZgorY29udGV4dENvbmZpZy5yb2xlLmxpbms9PHNlY3VyaXR5LXJvbGU+XHUzMDZiXHU1YjlhXHU3ZmE5XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDZhXHUzMDQ0XHUzMGJiXHUzMGFkXHUzMGU1XHUzMGVhXHUzMGM2XHUzMGEzXHUzMGVkXHUzMGZjXHUzMGViXHU1NDBkIHswfSBcdTMwNGM8cm9sZS1saW5rPlx1MzA2ZVx1NGUyZFx1MzA2N1x1NGY3Zlx1NzUyOFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1ZgorY29udGV4dENvbmZpZy5yb2xlLnJ1bmFzPTxzZWN1cml0eS1yb2xlPlx1MzA2Ylx1NWI5YVx1N2ZhOVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA2YVx1MzA0NFx1MzBiYlx1MzBhZFx1MzBlNVx1MzBlYVx1MzBjNlx1MzBhM1x1MzBlZFx1MzBmY1x1MzBlYlx1NTQwZCB7MH0gXHUzMDRjPHJ1bi1hcz5cdTMwNmVcdTRlMmRcdTMwNjdcdTRmN2ZcdTc1MjhcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWYKK2NvbnRleHRDb25maWcuc3RhcnQ9Q29udGV4dENvbmZpZzogXHU1MWU2XHU3NDA2XHUzMDkyXHU5NThiXHU1OWNiXHUzMDU3XHUzMDdlXHUzMDU5Citjb250ZXh0Q29uZmlnLnN0b3A9Q29udGV4dENvbmZpZzogXHU1MWU2XHU3NDA2XHUzMDkyXHU1MDVjXHU2YjYyXHUzMDU3XHUzMDdlXHUzMDU5Citjb250ZXh0Q29uZmlnLnRsZEVudHJ5RXhjZXB0aW9uPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOCB7Mn0gXHUzMDZlXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMGQxXHUzMGI5IHsxfSBcdTMwNmVKQVJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmVUTEQgezB9IFx1MzA5Mlx1NTFlNlx1NzQwNlx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorY29udGV4dENvbmZpZy50bGRGaWxlRXhjZXB0aW9uPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOCB7MX0gXHUzMDZlXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMGQxXHUzMGI5IHswfSBcdTMwNmVUTERcdTMwOTJcdTUxZTZcdTc0MDZcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK2NvbnRleHRDb25maWcudGxkSmFyRXhjZXB0aW9uPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOCB7MX0gXHUzMDZlXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMGQxXHUzMGI5IHswfSBcdTMwNmVKQVJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTUxZTZcdTc0MDZcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK2NvbnRleHRDb25maWcudGxkUmVzb3VyY2VQYXRoPVx1NzEyMVx1NTJiOVx1MzA2YVRMRFx1MzA2ZVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzBkMVx1MzBiOSB7MH0KK2NvbnRleHRDb25maWcudW5hdmFpbGFibGU9XHU1MjRkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDZlXHUzMDVmXHUzMDgxXHUzMDZiXHUzMDUzXHUzMDZlXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHU1MjI5XHU3NTI4XHUzMDY3XHUzMDRkXHUzMDZhXHUzMDQ0XHUzMDg4XHUzMDQ2XHUzMDZiXHUzMGRlXHUzMGZjXHUzMGFmXHUzMDU3XHUzMDdlXHUzMDU5CitlbWJlZGRlZC5hbHJlYWR5U3RhcnRlZD1cdTdkNDRcdTMwN2ZcdThmYmNcdTMwN2ZcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2VtYmVkZGVkLm5vRW5naW5lcz1cdTMwN2VcdTMwNjBcdTMwYThcdTMwZjNcdTMwYjhcdTMwZjNcdTMwNGNcdTViOWFcdTdmYTlcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2VtYmVkZGVkLm5vdFN0YXJ0ZWQ9XHU3ZDQ0XHUzMDdmXHU4ZmJjXHUzMDdmXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDZmXHUzMDdlXHUzMDYwXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitlbmdpbmVDb25maWcuY2NlPVx1MzBlOVx1MzBhNFx1MzBkNVx1MzBiNVx1MzBhNFx1MzBhZlx1MzBlYlx1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1MzBjN1x1MzBmY1x1MzBiZlx1MzBhYVx1MzBkNlx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOCB7MH0gXHUzMDZmXHUzMGE4XHUzMGYzXHUzMGI4XHUzMGYzXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitlbmdpbmVDb25maWcuc3RhcnQ9RW5naW5lQ29uZmlnOiBcdTUxZTZcdTc0MDZcdTMwOTJcdTk1OGJcdTU5Y2JcdTMwNTdcdTMwN2VcdTMwNTkKK2VuZ2luZUNvbmZpZy5zdG9wPUVuZ2luZUNvbmZpZzogXHU1MWU2XHU3NDA2XHUzMDkyXHU1MDVjXHU2YjYyXHUzMDU3XHUzMDdlXHUzMDU5Citob3N0Q29uZmlnLmFwcEJhc2U9XHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhIHswfSBcdTMwNmZcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNWJcdTMwOTMKK2hvc3RDb25maWcuY2NlPVx1MzBlOVx1MzBhNFx1MzBkNVx1MzBiNVx1MzBhNFx1MzBhZlx1MzBlYlx1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1MzBjN1x1MzBmY1x1MzBiZlx1MzBhYVx1MzBkNlx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOCB7MH0gXHUzMDZmXHUzMGRiXHUzMGI5XHUzMGM4XHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitob3N0Q29uZmlnLmRlcGxveT1XZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWEgezB9IFx1MzA5Mlx1OTE0ZFx1NTA5OVx1MzA1N1x1MzA3ZVx1MzA1OQoraG9zdENvbmZpZy5kZXBsb3lEZXNjcmlwdG9yPVx1OGEyZFx1NWI5YVx1OGExOFx1OGZmMFx1NWI1MCB7MH0gXHUzMDkyXHU5MTRkXHU1MDk5XHUzMDU3XHUzMDdlXHUzMDU5Citob3N0Q29uZmlnLmRlcGxveURlc2NyaXB0b3IuZXJyb3I9XHU4YTJkXHU1YjlhXHU4YTE4XHU4ZmYwXHU1YjUwIHswfSBcdTMwOTJcdTkxNGRcdTUwOTlcdTRlMmRcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK2hvc3RDb25maWcuZGVwbG95RGlyPVdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYSB7MH0gXHUzMDkyXHU5MTRkXHU1MDk5XHUzMDU3XHUzMDdlXHUzMDU5Citob3N0Q29uZmlnLmRlcGxveURpci5lcnJvcj1XZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWEgezB9IFx1MzA5Mlx1OTE0ZFx1NTA5OVx1NGUyZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OQoraG9zdENvbmZpZy5kZXBsb3lKYXI9V2ViXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGEyXHUzMGZjXHUzMGFiXHUzMGE0XHUzMGQ2IHswfSBcdTMwOTJcdTkxNGRcdTUwOTlcdTMwNTdcdTMwN2VcdTMwNTkKK2hvc3RDb25maWcuZGVwbG95SmFyLmVycm9yPVdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBhMlx1MzBmY1x1MzBhYlx1MzBhNFx1MzBkNiB7MH0gXHUzMDkyXHU5MTRkXHU1MDk5XHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5Citob3N0Q29uZmlnLmRlcGxveS5lcnJvcj1XZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWEgezB9IFx1MzA5Mlx1OTE0ZFx1NTA5OVx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQoraG9zdENvbmZpZy5kZXBsb3lpbmc9XHU4OThiXHUzMDY0XHUzMDRiXHUzMDYzXHUzMDVmV2ViXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU5MTRkXHU1MDk5XHUzMDU3XHUzMDdlXHUzMDU5Citob3N0Q29uZmlnLmV4cGFuZD1XZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwYTJcdTMwZmNcdTMwYWJcdTMwYTRcdTMwZDYgezB9IFx1MzA5Mlx1NWM1NVx1OTU4Ylx1MzA1N1x1MzA3ZVx1MzA1OQoraG9zdENvbmZpZy5leHBhbmQuZXJyb3I9V2ViXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGEyXHUzMGZjXHUzMGFiXHUzMGE0XHUzMGQ2IHswfSBcdTMwOTJcdTVjNTVcdTk1OGJcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK2hvc3RDb25maWcuZXhwYW5kaW5nPVx1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA2M1x1MzA1ZldlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBhMlx1MzBmY1x1MzBhYlx1MzBhNFx1MzBkNlx1MzA5Mlx1NWM1NVx1OTU4Ylx1MzA1N1x1MzA3ZVx1MzA1OQoraG9zdENvbmZpZy5jb250ZXh0LnJlc3RhcnQ9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4IHswfSBcdTMwOTJcdTUxOGRcdThkNzdcdTUyZDVcdTRlMmRcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK2hvc3RDb25maWcucmVtb3ZlWE1MPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOCB7MH0gXHUzMDZlXHU5MTRkXHU1MDk5XHUzMDkyXHU4OWUzXHU5NjY0XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitob3N0Q29uZmlnLnJlbW92ZURJUj1cdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWEgezB9IFx1MzA2ZVx1OTE0ZFx1NTA5OVx1MzA5Mlx1ODllM1x1OTY2NFx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgoraG9zdENvbmZpZy5yZW1vdmVXQVI9V0FSXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViIHswfSBcdTMwNmVcdTkxNGRcdTUwOTlcdTMwOTJcdTg5ZTNcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2hvc3RDb25maWcuc3RhcnQ9SG9zdENvbmZpZzogXHU1MWU2XHU3NDA2XHUzMDkyXHU1MDVjXHU2YjYyXHUzMDU3XHUzMDdlXHUzMDU5Citob3N0Q29uZmlnLnN0b3A9SG9zdENvbmZpZzogXHU1MWU2XHU3NDA2XHUzMDkyXHU1MDVjXHU2YjYyXHUzMDU3XHUzMDdlXHUzMDU5Citob3N0Q29uZmlnLnVuZGVwbG95PVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZlV2ViXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU5MTRkXHU1MDk5XHUzMDkyXHU4OWUzXHU5NjY0XHUzMDU3XHUzMDdlXHUzMDU5Citob3N0Q29uZmlnLnVuZGVwbG95LmVycm9yPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZlV2ViXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU5MTRkXHU1MDk5XHUzMDkyXHU4OWUzXHU5NjY0XHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5Citob3N0Q29uZmlnLnVuZGVwbG95aW5nPVx1OTE0ZFx1NTA5OVx1MzA1NVx1MzA4Y1x1MzA1ZldlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZVx1OTE0ZFx1NTA5OVx1MzA5Mlx1ODllM1x1OTY2NFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQordXNlckNvbmZpZy5kYXRhYmFzZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTMwNmVcdTMwZWRcdTMwZmNcdTMwYzlcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK3VzZXJDb25maWcuZGVwbG95PVx1MzBlNlx1MzBmY1x1MzBiNiB7MH0gXHUzMDZlV2ViXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU5MTRkXHU1MDk5XHUzMDU3XHUzMDdlXHUzMDU5Cit1c2VyQ29uZmlnLmRlcGxveWluZz1cdTMwZTZcdTMwZmNcdTMwYjZcdTMwNmVXZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTkxNGRcdTUwOTlcdTMwNTdcdTMwN2VcdTMwNTkKK3VzZXJDb25maWcuZXJyb3I9XHUzMGU2XHUzMGZjXHUzMGI2IHswfSBcdTMwNmVXZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTkxNGRcdTUwOTlcdTRlMmRcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK3VzZXJDb25maWcuc3RhcnQ9VXNlckNvbmZpZzogXHU1MWU2XHU3NDA2XHUzMDkyXHU5NThiXHU1OWNiXHUzMDU3XHUzMDdlXHUzMDU5Cit1c2VyQ29uZmlnLnN0b3A9VXNlckNvbmZpZzogXHU1MWU2XHU3NDA2XHUzMDkyXHU1MDVjXHU2YjYyXHUzMDU3XHUzMDdlXHUzMDU5CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9OYW1pbmdSdWxlU2V0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9OYW1pbmdSdWxlU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmZGQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL05hbWluZ1J1bGVTZXQuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKKworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuRGlnZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5SdWxlU2V0QmFzZTsKKworCisvKioKKyAqIDxwPjxzdHJvbmc+UnVsZVNldDwvc3Ryb25nPiBmb3IgcHJvY2Vzc2luZyB0aGUgSk5ESSBFbnRlcnByaXNlIE5hbWluZworICogQ29udGV4dCByZXNvdXJjZSBkZWNsYXJhdGlvbiBlbGVtZW50cy48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBOYW1pbmdSdWxlU2V0IGV4dGVuZHMgUnVsZVNldEJhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4IHRvIHVzZSBmb3IgcmVjb2duaXppbmcgb3VyIGVsZW1lbnRzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcHJlZml4ID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IHdpdGggdGhlIGRlZmF1bHQKKyAgICAgKiBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nUnVsZVNldCgpIHsKKworICAgICAgICB0aGlzKCIiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+UnVsZVNldDwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFByZWZpeCBmb3IgbWF0Y2hpbmcgcGF0dGVybiBydWxlcyAoaW5jbHVkaW5nIHRoZQorICAgICAqICB0cmFpbGluZyBzbGFzaCBjaGFyYWN0ZXIpCisgICAgICovCisgICAgcHVibGljIE5hbWluZ1J1bGVTZXQoU3RyaW5nIHByZWZpeCkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbnVsbDsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiA8cD5BZGQgdGhlIHNldCBvZiBSdWxlIGluc3RhbmNlcyBkZWZpbmVkIGluIHRoaXMgUnVsZVNldCB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IGluc3RhbmNlLCBhc3NvY2lhdGluZyB0aGVtIHdpdGgKKyAgICAgKiBvdXIgbmFtZXNwYWNlIFVSSSAoaWYgYW55KS4gIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAorICAgICAqIGJ5IGEgRGlnZXN0ZXIgaW5zdGFuY2UuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGRpZ2VzdGVyIERpZ2VzdGVyIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBuZXcgUnVsZSBpbnN0YW5jZXMKKyAgICAgKiAgc2hvdWxkIGJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJ1bGVJbnN0YW5jZXMoRGlnZXN0ZXIgZGlnZXN0ZXIpIHsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkVqYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVqYiIpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJFamIiLCBuZXcgU2V0QWxsUHJvcGVydGllc1J1bGUoKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIkVqYiIsCisgICAgICAgICAgICAgICAgbmV3IFNldE5leHROYW1pbmdSdWxlKCJhZGRFamIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RWpiIikpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiRW52aXJvbm1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFbnZpcm9ubWVudCIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJFbnZpcm9ubWVudCIpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJFbnZpcm9ubWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNldE5leHROYW1pbmdSdWxlKCJhZGRFbnZpcm9ubWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFbnZpcm9ubWVudCIpKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkxvY2FsRWpiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0TG9jYWxFamIiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAiTG9jYWxFamIiLCBuZXcgU2V0QWxsUHJvcGVydGllc1J1bGUoKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIkxvY2FsRWpiIiwKKyAgICAgICAgICAgICAgICBuZXcgU2V0TmV4dE5hbWluZ1J1bGUoImFkZExvY2FsRWpiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dExvY2FsRWpiIikpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiUmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJSZXNvdXJjZSIsIG5ldyBTZXRBbGxQcm9wZXJ0aWVzUnVsZSgpKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAiUmVzb3VyY2UiLAorICAgICAgICAgICAgICAgIG5ldyBTZXROZXh0TmFtaW5nUnVsZSgiYWRkUmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2UiKSk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJSZXNvdXJjZUVudlJlZiIsCisgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlRW52UmVmIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIlJlc291cmNlRW52UmVmIiwgbmV3IFNldEFsbFByb3BlcnRpZXNSdWxlKCkpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJSZXNvdXJjZUVudlJlZiIsCisgICAgICAgICAgICAgICAgbmV3IFNldE5leHROYW1pbmdSdWxlKCJhZGRSZXNvdXJjZUVudlJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUVudlJlZiIpKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIlRyYW5zYWN0aW9uIiwKKyAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0VHJhbnNhY3Rpb24iKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAiVHJhbnNhY3Rpb24iLCBuZXcgU2V0QWxsUHJvcGVydGllc1J1bGUoKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIlRyYW5zYWN0aW9uIiwKKyAgICAgICAgICAgICAgICBuZXcgU2V0TmV4dE5hbWluZ1J1bGUoInNldFRyYW5zYWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFRyYW5zYWN0aW9uIikpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1Bhc3N3ZFVzZXJEYXRhYmFzZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvUGFzc3dkVXNlckRhdGFiYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJlNmVjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1Bhc3N3ZFVzZXJEYXRhYmFzZS5qYXZhCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworCisvKioKKyAqIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8c3Ryb25nPlVzZXJEYXRhYmFzZTwvY29kZT4gaW50ZXJmYWNlCisgKiB0aGF0IHByb2Nlc3NlcyB0aGUgPGNvZGU+L2V0Yy9wYXNzd2Q8L2NvZGU+IGZpbGUgb24gYSBVbml4IHN5c3RlbS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFBhc3N3ZFVzZXJEYXRhYmFzZQorICAgIGltcGxlbWVudHMgVXNlckRhdGFiYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgdXNlciBkYXRhYmFzZSBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIFBhc3N3ZFVzZXJEYXRhYmFzZSgpIHsKKworICAgICAgICBzdXBlcigpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBwYXRobmFtZSBvZiB0aGUgVW5peCBwYXNzd29yZCBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9GSUxFID0gIi9ldGMvcGFzc3dkIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBob21lIGRpcmVjdG9yaWVzIGZvciBhbGwgZGVmaW5lZCB1c2Vycywga2V5ZWQgYnkgdXNlcm5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgaG9tZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBVc2VyQ29uZmlnIGxpc3RlbmVyIHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBVc2VyQ29uZmlnIHVzZXJDb25maWcgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgVXNlckNvbmZpZyBsaXN0ZW5lciB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBVc2VyQ29uZmlnIGdldFVzZXJDb25maWcoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnVzZXJDb25maWcpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFVzZXJDb25maWcgbGlzdGVuZXIgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyQ29uZmlnIFRoZSBuZXcgVXNlckNvbmZpZyBsaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJDb25maWcoVXNlckNvbmZpZyB1c2VyQ29uZmlnKSB7CisKKyAgICAgICAgdGhpcy51c2VyQ29uZmlnID0gdXNlckNvbmZpZzsKKyAgICAgICAgaW5pdCgpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhYnNvbHV0ZSBwYXRobmFtZSB0byB0aGUgaG9tZSBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZWQgdXNlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyIFVzZXIgZm9yIHdoaWNoIGEgaG9tZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIHJldHJpZXZlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9tZShTdHJpbmcgdXNlcikgeworCisgICAgICAgIHJldHVybiAoKFN0cmluZykgaG9tZXMuZ2V0KHVzZXIpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSB1c2VybmFtZXMgZGVmaW5lZCBvbiB0aGlzIHNlcnZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0VXNlcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIChob21lcy5rZXlzKCkpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgb3VyIHNldCBvZiB1c2VycyBhbmQgaG9tZSBkaXJlY3Rvcmllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKKworICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoUEFTU1dPUkRfRklMRSkpOworCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworCisgICAgICAgICAgICAgICAgLy8gQWNjdW11bGF0ZSB0aGUgbmV4dCBsaW5lCisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSByZWFkZXIucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGNoIDwgMCkgfHwgKGNoID09ICdcbicpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpIGNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBidWZmZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGxpbmUgaW50byBjb25zdGl0dWVudCBlbGVtZW50cworICAgICAgICAgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW5zW10gPSBuZXcgU3RyaW5nWzddOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB0b2tlbnNbaV0gPSBudWxsOworICAgICAgICAgICAgICAgIHdoaWxlIChuIDwgdG9rZW5zLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpbnQgY29sb24gPSBsaW5lLmluZGV4T2YoJzonKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9uID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gbGluZS5zdWJzdHJpbmcoMCwgY29sb24pOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKGNvbG9uICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxpbmU7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gIiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG9rZW5zW24rK10gPSB0b2tlbjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyB1c2VyIGFuZCBjb3JyZXNwb25kaW5nIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIGlmICgodG9rZW5zWzBdICE9IG51bGwpICYmICh0b2tlbnNbNV0gIT0gbnVsbCkpCisgICAgICAgICAgICAgICAgICAgIGhvbWVzLnB1dCh0b2tlbnNbMF0sIHRva2Vuc1s1XSk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZWFkZXIgPSBudWxsOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1NldEFsbFByb3BlcnRpZXNSdWxlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9TZXRBbGxQcm9wZXJ0aWVzUnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOTljNDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9TZXRBbGxQcm9wZXJ0aWVzUnVsZS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwOworCitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuSW50cm9zcGVjdGlvblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuUnVsZTsKKworLyoqCisgKiBSdWxlIHRoYXQgdXNlcyB0aGUgaW50cm9zcGVjdGlvbiB1dGlscyB0byBzZXQgcHJvcGVydGllcy4KKyAqIAorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICovCitwdWJsaWMgY2xhc3MgU2V0QWxsUHJvcGVydGllc1J1bGUgZXh0ZW5kcyBSdWxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSGFuZGxlIHRoZSBiZWdpbm5pbmcgb2YgYW4gWE1MIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlcyBvZiB0aGlzIGVsZW1lbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGEgcHJvY2Vzc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZVgsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYXR0cmlidXRlcy5nZXRMb2NhbE5hbWUoaSk7CisgICAgICAgICAgICBpZiAoIiIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOworICAgICAgICAgICAgSW50cm9zcGVjdGlvblV0aWxzLnNldFByb3BlcnR5KGRpZ2VzdGVyLnBlZWsoKSwgbmFtZSwgdmFsdWUpOworICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvU2V0Q29udGV4dFByb3BlcnRpZXNSdWxlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9TZXRDb250ZXh0UHJvcGVydGllc1J1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWNiNmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvU2V0Q29udGV4dFByb3BlcnRpZXNSdWxlLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5JbnRyb3NwZWN0aW9uVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5SdWxlOworCisvKioKKyAqIFJ1bGUgdGhhdCB1c2VzIHRoZSBpbnRyb3NwZWN0aW9uIHV0aWxzIHRvIHNldCBwcm9wZXJ0aWVzIG9mIGEgY29udGV4dCAKKyAqIChldmVyeXRoaW5nIGV4Y2VwdCAicGF0aCIpLgorICogCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKi8KK3B1YmxpYyBjbGFzcyBTZXRDb250ZXh0UHJvcGVydGllc1J1bGUgZXh0ZW5kcyBSdWxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSGFuZGxlIHRoZSBiZWdpbm5pbmcgb2YgYW4gWE1MIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlcyBvZiB0aGlzIGVsZW1lbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGEgcHJvY2Vzc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZVgsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYXR0cmlidXRlcy5nZXRMb2NhbE5hbWUoaSk7CisgICAgICAgICAgICBpZiAoIiIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoInBhdGgiLmVxdWFscyhuYW1lKSB8fCAiZG9jQmFzZSIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOworICAgICAgICAgICAgSW50cm9zcGVjdGlvblV0aWxzLnNldFByb3BlcnR5KGRpZ2VzdGVyLnBlZWsoKSwgbmFtZSwgdmFsdWUpOworICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvU2V0TmV4dE5hbWluZ1J1bGUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1NldE5leHROYW1pbmdSdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzZDU3NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1NldE5leHROYW1pbmdSdWxlLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5JbnRyb3NwZWN0aW9uVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5SdWxlOworCisKKy8qKgorICogPHA+UnVsZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbGxzIGEgbWV0aG9kIG9uIHRoZSAodG9wLTEpIChwYXJlbnQpCisgKiBvYmplY3QsIHBhc3NpbmcgdGhlIHRvcCBvYmplY3QgKGNoaWxkKSBhcyBhbiBhcmd1bWVudC4gIEl0IGlzCisgKiBjb21tb25seSB1c2VkIHRvIGVzdGFibGlzaCBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcy48L3A+CisgKgorICogPHA+VGhpcyBydWxlIG5vdyBzdXBwb3J0cyBtb3JlIGZsZXhpYmxlIG1ldGhvZCBtYXRjaGluZyBieSBkZWZhdWx0LgorICogSXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIG1heSBicmVhayAoc29tZSkgY29kZSAKKyAqIHdyaXR0ZW4gYWdhaW5zdCByZWxlYXNlIDEuMS4xIG9yIGVhcmxpZXIuCisgKiA8L3A+IAorICovCisKK3B1YmxpYyBjbGFzcyBTZXROZXh0TmFtaW5nUnVsZSBleHRlbmRzIFJ1bGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhICJzZXQgbmV4dCIgcnVsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSBvZiB0aGUgcGFyZW50IG1ldGhvZCB0byBjYWxsCisgICAgICogQHBhcmFtIHBhcmFtVHlwZSBKYXZhIGNsYXNzIG9mIHRoZSBwYXJlbnQgbWV0aG9kJ3MgYXJndW1lbnQKKyAgICAgKiAgKGlmIHlvdSB3aXNoIHRvIHVzZSBhIHByaW1pdGl2ZSB0eXBlLCBzcGVjaWZ5IHRoZSBjb3JyZXNvbmRpbmcKKyAgICAgKiAgSmF2YSB3cmFwcGVyIGNsYXNzIGluc3RlYWQsIHN1Y2ggYXMgPGNvZGU+amF2YS5sYW5nLkJvb2xlYW48L2NvZGU+CisgICAgICogIGZvciBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHBhcmFtZXRlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0TmV4dE5hbWluZ1J1bGUoU3RyaW5nIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbVR5cGUpIHsKKworICAgICAgICB0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOworICAgICAgICB0aGlzLnBhcmFtVHlwZSA9IHBhcmFtVHlwZTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBtZXRob2QgbmFtZSB0byBjYWxsIG9uIHRoZSBwYXJlbnQgb2JqZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbWV0aG9kTmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0eXBlIGV4cGVjdGVkIGJ5IHRoZSBtZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXJhbVR5cGUgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgZW5kIG9mIHRoaXMgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJZGVudGlmeSB0aGUgb2JqZWN0cyB0byBiZSB1c2VkCisgICAgICAgIE9iamVjdCBjaGlsZCA9IGRpZ2VzdGVyLnBlZWsoMCk7CisgICAgICAgIE9iamVjdCBwYXJlbnQgPSBkaWdlc3Rlci5wZWVrKDEpOworCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBuYW1pbmdSZXNvdXJjZXMgPSBudWxsOworICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgQ29udGV4dCkgeworICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzID0gKChDb250ZXh0KSBwYXJlbnQpLmdldE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzID0gKE5hbWluZ1Jlc291cmNlcykgcGFyZW50OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBDYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kCisgICAgICAgIEludHJvc3BlY3Rpb25VdGlscy5jYWxsTWV0aG9kMShuYW1pbmdSZXNvdXJjZXMsIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgY2hpbGQsIHBhcmFtVHlwZSwgZGlnZXN0ZXIuZ2V0Q2xhc3NMb2FkZXIoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbmRlciBhIHByaW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgUnVsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlNldE5leHRSdWxlWyIpOworICAgICAgICBzYi5hcHBlbmQoIm1ldGhvZE5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChtZXRob2ROYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsIHBhcmFtVHlwZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHBhcmFtVHlwZSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1RsZENvbmZpZy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvVGxkQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2ODkyZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1RsZENvbmZpZy5qYXZhCkBAIC0wLDAgKzEsNzI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZUNsYXNzUGFpcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuRGlnZXN0ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CisKKy8qKgorICogU3RhcnR1cCBldmVudCBsaXN0ZW5lciBmb3IgYSA8Yj5Db250ZXh0PC9iPiB0aGF0IGNvbmZpZ3VyZXMgdGhlIHByb3BlcnRpZXMKKyAqIG9mIHRoYXQgQ29udGV4dCwgYW5kIHRoZSBhc3NvY2lhdGVkIGRlZmluZWQgc2VydmxldHMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIEplYW4tRnJhbmNvaXMgQXJjYW5kCisgKiBAYXV0aG9yIENvc3RpbiBNYW5vbGFjaGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRsZENvbmZpZyAgeworCisgICAgLy8gTmFtZXMgb2YgSkFScyB0aGF0IGFyZSBrbm93biBub3QgdG8gY29udGFpbiBhbnkgVExEcworICAgIHByaXZhdGUgc3RhdGljIEhhc2hTZXQgbm9UbGRKYXJzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFRsZENvbmZpZy5jbGFzcyApOworCisKKyAgICAvKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBzZXQgb2YgSkFScyB0aGF0IGFyZSBrbm93biBub3QgdG8gY29udGFpbiBhbnkgVExEcworICAgICAqLworICAgIHN0YXRpYyB7CisgICAgICAgIG5vVGxkSmFycyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNhdGFsaW5hLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjYXRhbGluYS1hbnQuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNhdGFsaW5hLWNsdXN0ZXIuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNhdGFsaW5hLW9wdGlvbmFsLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjb21tb25zLWVsLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjb21tb25zLWxvZ2dpbmctYXBpLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjb21tb25zLW1vZGVsZXIuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImphc3Blci1jb21waWxlci5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiamFzcGVyLWNvbXBpbGVyLWpkdC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiamFzcGVyLXJ1bnRpbWUuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImpzcC1hcGkuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoIm5hbWluZy1yZXNvdXJjZXMuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoIm5hbWluZy1mYWN0b3J5LmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJuYW1pbmctZmFjdG9yeS1kYmNwLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJzZXJ2bGV0LWFwaS5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgic2VydmxldHMtY2dpLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJzZXJ2bGV0cy1kZWZhdWx0LmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJzZXJ2bGV0cy1pbnZva2VyLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJzZXJ2bGV0cy1zc2kuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInNlcnZsZXRzLXdlYmRhdi5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgidG9tY2F0LWFqcC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgidG9tY2F0LWNveW90ZS5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgidG9tY2F0LWh0dHAuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInRvbWNhdC11dGlsLmphciIpOworICAgICAgICAvLyBpMThuIEpBUnMKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY2F0YWxpbmEtaTE4bi1lbi5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY2F0YWxpbmEtaTE4bi1lcy5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY2F0YWxpbmEtaTE4bi1mci5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY2F0YWxpbmEtaTE4bi1qYS5qYXIiKTsKKyAgICAgICAgLy8gTWlzYyBKQVJzIG5vdCBpbmNsdWRlZCB3aXRoIFRvbWNhdAorICAgICAgICBub1RsZEphcnMuYWRkKCJhbnQuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNvbW1vbnMtZGJjcC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY29tbW9ucy1iZWFudXRpbHMuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNvbW1vbnMtZmlsZXVwbG9hZC0xLjAuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNvbW1vbnMtcG9vbC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY29tbW9ucy1kaWdlc3Rlci5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY29tbW9ucy1sb2dnaW5nLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjb21tb25zLWNvbGxlY3Rpb25zLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJqbXguamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImpteC10b29scy5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgieGVyY2VzSW1wbC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgieG1sUGFyc2VyQVBJcy5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgieG1sLWFwaXMuamFyIik7CisgICAgICAgIC8vIEpBUnMgZnJvbSBKMlNFIHJ1bnRpbWUKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgic3VuamNlX3Byb3ZpZGVyLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJsZGFwc2VjLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJsb2NhbGVkYXRhLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJkbnNucy5qYXIiKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVGhlIENvbnRleHQgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbnRleHQgY29udGV4dCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgcmVzb3VyY2VzIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IHdlIHdpbGwgdXNlIHRvIHByb2Nlc3MgdGFnIGxpYnJhcnkKKyAgICAgKiBkZXNjcmlwdG9yIGZpbGVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIERpZ2VzdGVyIHRsZERpZ2VzdGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIHZhbHVlIHVzZWQgdG8gdHVybiBvbi9vZmYgVExEIHZhbGlkYXRpb24KKyAgICAgKi8KKyAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0bGRWYWxpZGF0aW9uID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSB2YWx1ZSB1c2VkIHRvIHR1cm4gb24vb2ZmIFRMRCAgbmFtZXNwYWNlIGF3YXJlbmVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdGxkTmFtZXNwYWNlQXdhcmUgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiByZXNjYW49dHJ1ZTsKKworICAgIHByaXZhdGUgQXJyYXlMaXN0IGxpc3RlbmVycz1uZXcgQXJyYXlMaXN0KCk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxpc3Qgb2YgSkFScyB0aGF0IGFyZSBrbm93biBub3QgdG8gY29udGFpbiBhbnkgVExEcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXJOYW1lcyBMaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBuYW1lcyBvZiBKQVIgZmlsZXMgdGhhdCBhcmUgCisgICAgICoga25vd24gbm90IHRvIGNvbnRhaW4gYW55IFRMRHMgCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE5vVGxkSmFycyhTdHJpbmcgamFyTmFtZXMpIHsKKyAgICAgICAgaWYgKGphck5hbWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG5vVGxkSmFycy5jbGVhcigpOworICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoamFyTmFtZXMsICIsIik7CisgICAgICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgbm9UbGRKYXJzLmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWxpZGF0aW9uIGZlYXR1cmUgb2YgdGhlIFhNTCBwYXJzZXIgdXNlZCB3aGVuCisgICAgICogcGFyc2luZyB4bWwgaW5zdGFuY2VzLgorICAgICAqIEBwYXJhbSB0bGRWYWxpZGF0aW9uIHRydWUgdG8gZW5hYmxlIHhtbCBpbnN0YW5jZSB2YWxpZGF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGxkVmFsaWRhdGlvbihib29sZWFuIHRsZFZhbGlkYXRpb24peworICAgICAgICBUbGRDb25maWcudGxkVmFsaWRhdGlvbiA9IHRsZFZhbGlkYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXJ2ZXIueG1sIDxob3N0PiBhdHRyaWJ1dGUncyB4bWxWYWxpZGF0aW9uLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB2YWxpZGF0aW9uIGlzIGVuYWJsZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUbGRWYWxpZGF0aW9uKCl7CisgICAgICAgIHJldHVybiB0bGRWYWxpZGF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VydmVyLnhtbCA8aG9zdD4gYXR0cmlidXRlJ3MgeG1sTmFtZXNwYWNlQXdhcmUuCisgICAgICogQHJldHVybiB0cnVlIGlmIG5hbWVzcGFjZSBhd2FyZW5lcyBpcyBlbmFibGVkLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VGxkTmFtZXNwYWNlQXdhcmUoKXsKKyAgICAgICAgcmV0dXJuIHRsZE5hbWVzcGFjZUF3YXJlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lc3BhY2UgYXdhcmUgZmVhdHVyZSBvZiB0aGUgWE1MIHBhcnNlciB1c2VkIHdoZW4KKyAgICAgKiBwYXJzaW5nIHhtbCBpbnN0YW5jZXMuCisgICAgICogQHBhcmFtIHRsZE5hbWVzcGFjZUF3YXJlIHRydWUgdG8gZW5hYmxlIG5hbWVzcGFjZSBhd2FyZW5lc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUbGROYW1lc3BhY2VBd2FyZShib29sZWFuIHRsZE5hbWVzcGFjZUF3YXJlKXsKKyAgICAgICAgVGxkQ29uZmlnLnRsZE5hbWVzcGFjZUF3YXJlID0gdGxkTmFtZXNwYWNlQXdhcmU7CisgICAgfSAgICAKKworCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXNjYW4oKSB7CisgICAgICAgIHJldHVybiByZXNjYW47CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVzY2FuKGJvb2xlYW4gcmVzY2FuKSB7CisgICAgICAgIHRoaXMucmVzY2FuID0gcmVzY2FuOworICAgIH0KKworICAgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQXBwbGljYXRpb25MaXN0ZW5lciggU3RyaW5nIHMgKSB7CisgICAgICAgIC8vaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoICJBZGQgdGxkIGxpc3RlbmVyICIgKyBzKTsKKyAgICAgICAgbGlzdGVuZXJzLmFkZChzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VGxkTGlzdGVuZXJzKCkgeworICAgICAgICBTdHJpbmcgcmVzdWx0W109bmV3IFN0cmluZ1tsaXN0ZW5lcnMuc2l6ZSgpXTsKKyAgICAgICAgbGlzdGVuZXJzLnRvQXJyYXkocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNjYW4gZm9yIGFuZCBjb25maWd1cmUgYWxsIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3JzIGZvdW5kIGluIHRoaXMKKyAgICAgKiB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhIGZhdGFsIGlucHV0L291dHB1dCBvciBwYXJzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyB0MT1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBGaWxlIHRsZENhY2hlPW51bGw7CisKKyAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQpIHsKKyAgICAgICAgICAgIEZpbGUgd29ya0Rpcj0gKEZpbGUpCisgICAgICAgICAgICAgICAgKChTdGFuZGFyZENvbnRleHQpY29udGV4dCkuZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGUoR2xvYmFscy5XT1JLX0RJUl9BVFRSKTsKKyAgICAgICAgICAgIHRsZENhY2hlPW5ldyBGaWxlKCB3b3JrRGlyLCAidGxkQ2FjaGUuc2VyIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBPcHRpb24gdG8gbm90IHJlc2NhbgorICAgICAgICBpZiggISByZXNjYW4gKSB7CisgICAgICAgICAgICAvLyBmaW5kIHRoZSBjYWNoZQorICAgICAgICAgICAgaWYoIHRsZENhY2hlIT0gbnVsbCAmJiB0bGRDYWNoZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIC8vIGp1c3QgcmVhZCBpdC4uLgorICAgICAgICAgICAgICAgIHByb2Nlc3NDYWNoZSh0bGRDYWNoZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQWNxdWlyZSB0aGUgbGlzdCBvZiBUTEQgcmVzb3VyY2UgcGF0aHMsIHBvc3NpYmx5IGVtYmVkZGVkIGluIEpBUgorICAgICAgICAgKiBmaWxlcywgdG8gYmUgcHJvY2Vzc2VkCisgICAgICAgICAqLworICAgICAgICBTZXQgcmVzb3VyY2VQYXRocyA9IHRsZFNjYW5SZXNvdXJjZVBhdGhzKCk7CisgICAgICAgIE1hcCBqYXJQYXRocyA9IGdldEphclBhdGhzKCk7CisKKyAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiB1c2UgY2FjaGVkIGxpc3RlbmVycworICAgICAgICBpZiAodGxkQ2FjaGUgIT0gbnVsbCAmJiB0bGRDYWNoZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBnZXRMYXN0TW9kaWZpZWQocmVzb3VyY2VQYXRocywgamFyUGF0aHMpOworICAgICAgICAgICAgaWYgKGxhc3RNb2RpZmllZCA8IHRsZENhY2hlLmxhc3RNb2RpZmllZCgpKSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0NhY2hlKHRsZENhY2hlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTY2FuIGVhY2ggYWNjdW11bGF0ZWQgcmVzb3VyY2UgcGF0aCBmb3IgVExEcyB0byBiZSBwcm9jZXNzZWQKKyAgICAgICAgSXRlcmF0b3IgcGF0aHMgPSByZXNvdXJjZVBhdGhzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChwYXRocy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gKFN0cmluZykgcGF0aHMubmV4dCgpOworICAgICAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoIi5qYXIiKSkgeworICAgICAgICAgICAgICAgIHRsZFNjYW5KYXIocGF0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRsZFNjYW5UbGQocGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGphclBhdGhzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhdGhzID0gamFyUGF0aHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChwYXRocy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICB0bGRTY2FuSmFyKChGaWxlKSBwYXRocy5uZXh0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGxpc3RbXSA9IGdldFRsZExpc3RlbmVycygpOworCisgICAgICAgIGlmKCB0bGRDYWNoZSE9IG51bGwgKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoICJTYXZpbmcgdGxkIGNhY2hlOiAiICsgdGxkQ2FjaGUgKyAiICIgKyBsaXN0Lmxlbmd0aCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0PW5ldyBGaWxlT3V0cHV0U3RyZWFtKHRsZENhY2hlKTsKKyAgICAgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zPW5ldyBPYmplY3RPdXRwdXRTdHJlYW0oIG91dCApOworICAgICAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdCggbGlzdCApOworICAgICAgICAgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCggSU9FeGNlcHRpb24gZXggKSB7CisgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgbG9nLmRlYnVnKCAiQWRkaW5nIHRsZCBsaXN0ZW5lcnM6IiArIGxpc3QubGVuZ3RoKTsKKyAgICAgICAgZm9yKCBpbnQgaT0wOyBsaXN0IT1udWxsICYmIGk8bGlzdC5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgIGNvbnRleHQuYWRkQXBwbGljYXRpb25MaXN0ZW5lcihsaXN0W2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgdDI9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGlmKCBjb250ZXh0IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0ICkgeworICAgICAgICAgICAgKChTdGFuZGFyZENvbnRleHQpY29udGV4dCkuc2V0VGxkU2NhblRpbWUodDItdDEpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworICAgIC8qCisgICAgICogUmV0dXJucyB0aGUgbGFzdCBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGUgZ2l2ZW4gc2V0cyBvZiByZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VQYXRocworICAgICAqIEBwYXJhbSBqYXJQYXRocworICAgICAqCisgICAgICogQHJldHVybiBMYXN0IG1vZGlmaWNhdGlvbiBkYXRlCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIGdldExhc3RNb2RpZmllZChTZXQgcmVzb3VyY2VQYXRocywgTWFwIGphclBhdGhzKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSAwOworCisgICAgICAgIEl0ZXJhdG9yIHBhdGhzID0gcmVzb3VyY2VQYXRocy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAocGF0aHMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IChTdHJpbmcpIHBhdGhzLm5leHQoKTsKKyAgICAgICAgICAgIFVSTCB1cmwgPSBjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2UocGF0aCk7CisgICAgICAgICAgICBpZiAodXJsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoICJOdWxsIHVybCAiKyBwYXRoICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb25nIGxhc3RNID0gdXJsLm9wZW5Db25uZWN0aW9uKCkuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICBpZiAobGFzdE0gPiBsYXN0TW9kaWZpZWQpIGxhc3RNb2RpZmllZCA9IGxhc3RNOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiTGFzdCBtb2RpZmllZCAiICsgcGF0aCArICIgIiArIGxhc3RNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChqYXJQYXRocyAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXRocyA9IGphclBhdGhzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAocGF0aHMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgRmlsZSBqYXJGaWxlID0gKEZpbGUpIHBhdGhzLm5leHQoKTsKKyAgICAgICAgICAgICAgICBsb25nIGxhc3RNID0gamFyRmlsZS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdE0gPiBsYXN0TW9kaWZpZWQpIGxhc3RNb2RpZmllZCA9IGxhc3RNOworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkxhc3QgbW9kaWZpZWQgIiArIGphckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAiICsgbGFzdE0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsYXN0TW9kaWZpZWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDYWNoZShGaWxlIHRsZENhY2hlICkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcmVhZCB0aGUgY2FjaGUgYW5kIHJldHVybjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbj1uZXcgRmlsZUlucHV0U3RyZWFtKHRsZENhY2hlKTsKKyAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcz1uZXcgT2JqZWN0SW5wdXRTdHJlYW0oIGluICk7CisgICAgICAgICAgICBTdHJpbmcgbGlzdFtdPShTdHJpbmcgW10pb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXVzaW5nIHRsZENhY2hlICIgKyB0bGRDYWNoZSArICIgIiArIGxpc3QubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciggaW50IGk9MDsgbGlzdCE9bnVsbCAmJiBpPGxpc3QubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5hZGRBcHBsaWNhdGlvbkxpc3RlbmVyKGxpc3RbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2lzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2goIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXggKSB7CisgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSAoaWYgbmVjZXNzYXJ5KSBhbmQgcmV0dXJuIGEgRGlnZXN0ZXIgY29uZmlndXJlZCB0byBwcm9jZXNzIGEgdGFnCisgICAgICogbGlicmFyeSBkZXNjcmlwdG9yLCBsb29raW5nIGZvciBhZGRpdGlvbmFsIGxpc3RlbmVyIGNsYXNzZXMgdG8gYmUKKyAgICAgKiByZWdpc3RlcmVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIERpZ2VzdGVyIGNyZWF0ZVRsZERpZ2VzdGVyKCkgeworCisgICAgICAgIHJldHVybiBEaWdlc3RlckZhY3RvcnkubmV3RGlnZXN0ZXIodGxkVmFsaWRhdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxkTmFtZXNwYWNlQXdhcmUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUbGRSdWxlU2V0KCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTY2FuIHRoZSBKQVIgZmlsZSBhdCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHBhdGggZm9yIFRMRHMgaW4gdGhlCisgICAgICogPGNvZGU+TUVUQS1JTkY8L2NvZGU+IHN1YmRpcmVjdG9yeSwgYW5kIHNjYW4gZWFjaCBUTEQgZm9yIGFwcGxpY2F0aW9uCisgICAgICogZXZlbnQgbGlzdGVuZXJzIHRoYXQgbmVlZCB0byBiZSByZWdpc3RlcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlUGF0aCBSZXNvdXJjZSBwYXRoIG9mIHRoZSBKQVIgZmlsZSB0byBzY2FuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHNjYW5uaW5nIHRoaXMgSkFSCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHRsZFNjYW5KYXIoU3RyaW5nIHJlc291cmNlUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIiBTY2FubmluZyBKQVIgYXQgcmVzb3VyY2UgcGF0aCAnIiArIHJlc291cmNlUGF0aCArICInIik7CisgICAgICAgIH0KKworICAgICAgICBVUkwgdXJsID0gY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlc291cmNlKHJlc291cmNlUGF0aCk7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLnRsZFJlc291cmNlUGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VQYXRoKSk7CisgICAgICAgIH0KKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsKKyAgICAgICAgZmlsZSA9IGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgICAgICB0bGRTY2FuSmFyKGZpbGUpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2NhbnMgYWxsIFRMRCBlbnRyaWVzIGluIHRoZSBnaXZlbiBKQVIgZm9yIGFwcGxpY2F0aW9uIGxpc3RlbmVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIEpBUiBmaWxlIHdob3NlIFRMRCBlbnRyaWVzIGFyZSBzY2FubmVkIGZvciBhcHBsaWNhdGlvbgorICAgICAqIGxpc3RlbmVycworICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0bGRTY2FuSmFyKEZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgSmFyRmlsZSBqYXJGaWxlID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworCisgICAgICAgIFN0cmluZyBqYXJQYXRoID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgamFyRmlsZSA9IG5ldyBKYXJGaWxlKGZpbGUpOworICAgICAgICAgICAgRW51bWVyYXRpb24gZW50cmllcyA9IGphckZpbGUuZW50cmllcygpOworICAgICAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBKYXJFbnRyeSBlbnRyeSA9IChKYXJFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCFuYW1lLnN0YXJ0c1dpdGgoIk1FVEEtSU5GLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoIi50bGQiKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiICBQcm9jZXNzaW5nIFRMRCBhdCAnIiArIG5hbWUgKyAiJyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0bGRTY2FuU3RyZWFtKG5ldyBJbnB1dFNvdXJjZShqYXJGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KSkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcudGxkRW50cnlFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGphclBhdGgsIGNvbnRleHQuZ2V0UGF0aCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcudGxkSmFyRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFyUGF0aCwgY29udGV4dC5nZXRQYXRoKCkpLAorICAgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGphckZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGphckZpbGUuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2FuIHRoZSBUTEQgY29udGVudHMgaW4gdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0sIGFuZCByZWdpc3RlcgorICAgICAqIGFueSBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMgZm91bmQgdGhlcmUuICA8Yj5OT1RFPC9iPiAtIEl0IGlzCisgICAgICogdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gY2xvc2UgdGhlIElucHV0U3RyZWFtIGFmdGVyIHRoaXMKKyAgICAgKiBtZXRob2QgcmV0dXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZVN0cmVhbSBJbnB1dFN0cmVhbSBjb250YWluaW5nIGEgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzY2FubmluZyB0aGlzIFRMRAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0bGRTY2FuU3RyZWFtKElucHV0U291cmNlIHJlc291cmNlU3RyZWFtKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAodGxkRGlnZXN0ZXIgPT0gbnVsbCl7CisgICAgICAgICAgICB0bGREaWdlc3RlciA9IGNyZWF0ZVRsZERpZ2VzdGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHN5bmNocm9uaXplZCAodGxkRGlnZXN0ZXIpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGxkRGlnZXN0ZXIucHVzaCh0aGlzKTsKKyAgICAgICAgICAgICAgICB0bGREaWdlc3Rlci5wYXJzZShyZXNvdXJjZVN0cmVhbSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRsZERpZ2VzdGVyLnJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNjYW4gdGhlIFRMRCBjb250ZW50cyBhdCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHBhdGgsIGFuZCByZWdpc3RlcgorICAgICAqIGFueSBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMgZm91bmQgdGhlcmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VQYXRoIFJlc291cmNlIHBhdGggYmVpbmcgc2Nhbm5lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzY2FubmluZyB0aGlzIFRMRAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0bGRTY2FuVGxkKFN0cmluZyByZXNvdXJjZVBhdGgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCIgU2Nhbm5pbmcgVExEIGF0IHJlc291cmNlIHBhdGggJyIgKyByZXNvdXJjZVBhdGggKyAiJyIpOworICAgICAgICB9CisKKyAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gQnVnemlsbGEgMzg0NzYKKyAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9CisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VQYXRoKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy50bGRSZXNvdXJjZVBhdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlUGF0aCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShzdHJlYW0pOworICAgICAgICAgICAgaWYgKGlucHV0U291cmNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcudGxkUmVzb3VyY2VQYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZVBhdGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRsZFNjYW5TdHJlYW0oaW5wdXRTb3VyY2UpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcudGxkRmlsZUV4Y2VwdGlvbiIsIHJlc291cmNlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFBhdGgoKSksCisgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgfSAKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjY3VtdWxhdGUgYW5kIHJldHVybiBhIFNldCBvZiByZXNvdXJjZSBwYXRocyB0byBiZSBhbmFseXplZCBmb3IKKyAgICAgKiB0YWcgbGlicmFyeSBkZXNjcmlwdG9ycy4gIEVhY2ggZWxlbWVudCBvZiB0aGUgcmV0dXJuZWQgc2V0IHdpbGwgYmUKKyAgICAgKiB0aGUgY29udGV4dC1yZWxhdGl2ZSBwYXRoIHRvIGVpdGhlciBhIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZmlsZSwKKyAgICAgKiBvciB0byBhIEpBUiBmaWxlIHRoYXQgbWF5IGNvbnRhaW4gdGFnIGxpYnJhcnkgZGVzY3JpcHRvcnMgaW4gaXRzCisgICAgICogPGNvZGU+TUVUQS1JTkY8L2NvZGU+IHN1YmRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycyB3aGlsZQorICAgICAqICBhY2N1bXVsYXRpbmcgdGhlIGxpc3Qgb2YgcmVzb3VyY2UgcGF0aHMKKyAgICAgKi8KKyAgICBwcml2YXRlIFNldCB0bGRTY2FuUmVzb3VyY2VQYXRocygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCIgQWNjdW11bGF0aW5nIFRMRCByZXNvdXJjZSBwYXRocyIpOworICAgICAgICB9CisgICAgICAgIFNldCByZXNvdXJjZVBhdGhzID0gbmV3IEhhc2hTZXQoKTsKKworICAgICAgICAvLyBBY2N1bXVsYXRlIHJlc291cmNlIHBhdGhzIGV4cGxpY2l0bHkgbGlzdGVkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24KKyAgICAgICAgLy8gZGVwbG95bWVudCBkZXNjcmlwdG9yCisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLnRyYWNlKCIgIFNjYW5uaW5nIDx0YWdsaWI+IGVsZW1lbnRzIGluIHdlYi54bWwiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdGFnbGlic1tdID0gY29udGV4dC5maW5kVGFnbGlicygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ2xpYnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZVBhdGggPSBjb250ZXh0LmZpbmRUYWdsaWIodGFnbGlic1tpXSk7CisgICAgICAgICAgICAvLyBGSVhNRSAtIFNlcnZsZXQgMi40IERURCBpbXBsaWVzIHRoYXQgdGhlIGxvY2F0aW9uIE1VU1QgYmUKKyAgICAgICAgICAgIC8vIGEgY29udGV4dC1yZWxhdGl2ZSBwYXRoIHN0YXJ0aW5nIHdpdGggJy8nPworICAgICAgICAgICAgaWYgKCFyZXNvdXJjZVBhdGguc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VQYXRoID0gIi9XRUItSU5GLyIgKyByZXNvdXJjZVBhdGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cudHJhY2UoIiAgIEFkZGluZyBwYXRoICciICsgcmVzb3VyY2VQYXRoICsKKyAgICAgICAgICAgICAgICAgICAgIicgZm9yIFVSSSAnIiArIHRhZ2xpYnNbaV0gKyAiJyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzb3VyY2VQYXRocy5hZGQocmVzb3VyY2VQYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIERpckNvbnRleHQgcmVzb3VyY2VzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0bGRTY2FuUmVzb3VyY2VQYXRoc1dlYkluZihyZXNvdXJjZXMsICIvV0VCLUlORiIsIHJlc291cmNlUGF0aHMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBjb21wbGV0ZWQgc2V0CisgICAgICAgIHJldHVybiAocmVzb3VyY2VQYXRocyk7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNjYW5zIHRoZSB3ZWIgYXBwbGljYXRpb24ncyBzdWJkaXJlY3RvcnkgaWRlbnRpZmllZCBieSByb290UGF0aCwKKyAgICAgKiBhbG9uZyB3aXRoIGl0cyBzdWJkaXJlY3RvcmllcywgZm9yIFRMRHMuCisgICAgICoKKyAgICAgKiBJbml0aWFsbHksIHJvb3RQYXRoIGVxdWFscyAvV0VCLUlORi4gVGhlIC9XRUItSU5GL2NsYXNzZXMgYW5kCisgICAgICogL1dFQi1JTkYvbGliIHN1YmRpcmVjdG9yaWVzIGFyZSBleGNsdWRlZCBmcm9tIHRoZSBzZWFyY2gsIGFzIHBlciB0aGUKKyAgICAgKiBKU1AgMi4wIHNwZWMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSB3ZWIgYXBwbGljYXRpb24ncyByZXNvdXJjZXMKKyAgICAgKiBAcGFyYW0gcm9vdFBhdGggVGhlIHBhdGggd2hvc2Ugc3ViZGlyZWN0b3JpZXMgYXJlIHRvIGJlIHNlYXJjaGVkIGZvcgorICAgICAqIFRMRHMKKyAgICAgKiBAcGFyYW0gdGxkUGF0aHMgVGhlIHNldCBvZiBUTEQgcmVzb3VyY2UgcGF0aHMgdG8gYWRkIHRvCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHRsZFNjYW5SZXNvdXJjZVBhdGhzV2ViSW5mKERpckNvbnRleHQgcmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcm9vdFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0bGRQYXRocykgCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLnRyYWNlKCIgIFNjYW5uaW5nIFRMRHMgaW4gIiArIHJvb3RQYXRoICsgIiBzdWJkaXJlY3RvcnkiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBOYW1pbmdFbnVtZXJhdGlvbiBpdGVtcyA9IHJlc291cmNlcy5saXN0KHJvb3RQYXRoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVtcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIE5hbWVDbGFzc1BhaXIgaXRlbSA9IChOYW1lQ2xhc3NQYWlyKSBpdGVtcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZVBhdGggPSByb290UGF0aCArICIvIiArIGl0ZW0uZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmICghcmVzb3VyY2VQYXRoLmVuZHNXaXRoKCIudGxkIikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChyZXNvdXJjZVBhdGguc3RhcnRzV2l0aCgiL1dFQi1JTkYvY2xhc3NlcyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmVzb3VyY2VQYXRoLnN0YXJ0c1dpdGgoIi9XRUItSU5GL2xpYiIpKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlUGF0aC5lbmRzV2l0aCgiLnRsZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCIgICBBZGRpbmcgcGF0aCAnIiArIHJlc291cmNlUGF0aCArICInIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGxkUGF0aHMuYWRkKHJlc291cmNlUGF0aCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGxkU2NhblJlc291cmNlUGF0aHNXZWJJbmYocmVzb3VyY2VzLCByZXNvdXJjZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsZFBhdGhzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICA7IC8vIFNpbGVudCBjYXRjaDogaXQncyB2YWxpZCB0aGF0IG5vIC9XRUItSU5GIGRpcmVjdG9yeSBleGlzdHMKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBtYXAgb2YgdGhlIHBhdGhzIHRvIGFsbCBKQVIgZmlsZXMgdGhhdCBhcmUgYWNjZXNzaWJsZSB0byB0aGUKKyAgICAgKiB3ZWJhcHAgYW5kIHdpbGwgYmUgc2Nhbm5lZCBmb3IgVExEcy4KKyAgICAgKgorICAgICAqIFRoZSBtYXAgYWx3YXlzIGluY2x1ZGVzIGFsbCB0aGUgSkFScyB1bmRlciBXRUItSU5GL2xpYiwgYXMgd2VsbCBhcworICAgICAqIHNoYXJlZCBKQVJzIGluIHRoZSBjbGFzc2xvYWRlciBkZWxlZ2F0aW9uIGNoYWluIG9mIHRoZSB3ZWJhcHAncworICAgICAqIGNsYXNzbG9hZGVyLgorICAgICAqCisgICAgICogVGhlIGxhdHRlciBjb25zdGl0dXRlcyBhIFRvbWNhdC1zcGVjaWZpYyBleHRlbnNpb24gdG8gdGhlIFRMRCBzZWFyY2gKKyAgICAgKiBvcmRlciBkZWZpbmVkIGluIHRoZSBKU1Agc3BlYy4gSXQgYWxsb3dzIHRhZyBsaWJyYXJpZXMgcGFja2FnZWQgYXMgSkFSCisgICAgICogZmlsZXMgdG8gYmUgc2hhcmVkIGJ5IHdlYiBhcHBsaWNhdGlvbnMgYnkgc2ltcGx5IGRyb3BwaW5nIHRoZW0gaW4gYSAKKyAgICAgKiBsb2NhdGlvbiB0aGF0IGFsbCB3ZWIgYXBwbGljYXRpb25zIGhhdmUgYWNjZXNzIHRvIChlLmcuLAorICAgICAqIDxDQVRBTElOQV9IT01FPi9jb21tb24vbGliKS4KKyAgICAgKgorICAgICAqIFRoZSBzZXQgb2Ygc2hhcmVkIEpBUnMgdG8gYmUgc2Nhbm5lZCBmb3IgVExEcyBpcyBuYXJyb3dlZCBkb3duIGJ5CisgICAgICogdGhlIDx0dD5ub1RsZEphcnM8L3R0PiBjbGFzcyB2YXJpYWJsZSwgd2hpY2ggY29udGFpbnMgdGhlIG5hbWVzIG9mIEpBUnMKKyAgICAgKiB0aGF0IGFyZSBrbm93biBub3QgdG8gY29udGFpbiBhbnkgVExEcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTWFwIG9mIEpBUiBmaWxlIHBhdGhzCisgICAgICovCisgICAgcHJpdmF0ZSBNYXAgZ2V0SmFyUGF0aHMoKSB7CisKKyAgICAgICAgSGFzaE1hcCBqYXJQYXRoTWFwID0gbnVsbDsKKworICAgICAgICBDbGFzc0xvYWRlciB3ZWJhcHBMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSB3ZWJhcHBMb2FkZXI7CisgICAgICAgIHdoaWxlIChsb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvYWRlciBpbnN0YW5jZW9mIFVSTENsYXNzTG9hZGVyKSB7CisgICAgICAgICAgICAgICAgVVJMW10gdXJscyA9ICgoVVJMQ2xhc3NMb2FkZXIpIGxvYWRlcikuZ2V0VVJMcygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTx1cmxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEV4cGVjdCBmaWxlIFVSTHMKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBkZWZpbml0ZWx5IG5vdCBhcyBjbGVhbiBhcyB1c2luZyBKQVIgVVJMcyBlaXRoZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gb3ZlciBmaWxlIG9yIHRoZSBjdXN0b20gam5kaSBoYW5kbGVyLCBidXQgYSBsb3QgbGVzcworICAgICAgICAgICAgICAgICAgICAvLyBidWdneSBvdmVyYWxsCisgICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShuZXcgVVJJKHVybHNbaV0udG9TdHJpbmcoKSkuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXRoLmVuZHNXaXRoKCIuamFyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFNjYW4gYWxsIEpBUnMgZnJvbSBXRUItSU5GL2xpYiwgcGx1cyBhbnkgc2hhcmVkIEpBUnMKKyAgICAgICAgICAgICAgICAgICAgICogdGhhdCBhcmUgbm90IGtub3duIG5vdCB0byBjb250YWluIGFueSBUTERzCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVyID09IHdlYmFwcExvYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG5vVGxkSmFycyA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW5vVGxkSmFycy5jb250YWlucyhmaWxlLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXJQYXRoTWFwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXJQYXRoTWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXJQYXRoTWFwLnB1dChwYXRoLCBmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWphclBhdGhNYXAuY29udGFpbnNLZXkocGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXJQYXRoTWFwLnB1dChwYXRoLCBmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvYWRlciA9IGxvYWRlci5nZXRQYXJlbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBqYXJQYXRoTWFwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1RsZFJ1bGVTZXQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1RsZFJ1bGVTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTFlYTk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvVGxkUnVsZVNldC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLkRpZ2VzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuUnVsZVNldEJhc2U7CisKKworLyoqCisgKiA8cD48c3Ryb25nPlJ1bGVTZXQ8L3N0cm9uZz4gZm9yIHByb2Nlc3NpbmcgdGhlIGNvbnRlbnRzIG9mIGEgdGFnIGxpYnJhcnkKKyAqIGRlc2NyaXB0b3IgcmVzb3VyY2UuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVGxkUnVsZVNldCBleHRlbmRzIFJ1bGVTZXRCYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeCB0byB1c2UgZm9yIHJlY29nbml6aW5nIG91ciBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5SdWxlU2V0PC9jb2RlPiB3aXRoIHRoZSBkZWZhdWx0CisgICAgICogbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXguCisgICAgICovCisgICAgcHVibGljIFRsZFJ1bGVTZXQoKSB7CisKKyAgICAgICAgdGhpcygiIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4LgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBQcmVmaXggZm9yIG1hdGNoaW5nIHBhdHRlcm4gcnVsZXMgKGluY2x1ZGluZyB0aGUKKyAgICAgKiAgdHJhaWxpbmcgc2xhc2ggY2hhcmFjdGVyKQorICAgICAqLworICAgIHB1YmxpYyBUbGRSdWxlU2V0KFN0cmluZyBwcmVmaXgpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IG51bGw7CisgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogPHA+QWRkIHRoZSBzZXQgb2YgUnVsZSBpbnN0YW5jZXMgZGVmaW5lZCBpbiB0aGlzIFJ1bGVTZXQgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIDxjb2RlPkRpZ2VzdGVyPC9jb2RlPiBpbnN0YW5jZSwgYXNzb2NpYXRpbmcgdGhlbSB3aXRoCisgICAgICogb3VyIG5hbWVzcGFjZSBVUkkgKGlmIGFueSkuICBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQKKyAgICAgKiBieSBhIERpZ2VzdGVyIGluc3RhbmNlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaWdlc3RlciBEaWdlc3RlciBpbnN0YW5jZSB0byB3aGljaCB0aGUgbmV3IFJ1bGUgaW5zdGFuY2VzCisgICAgICogIHNob3VsZCBiZSBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSdWxlSW5zdGFuY2VzKERpZ2VzdGVyIGRpZ2VzdGVyKSB7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAidGFnbGliL2xpc3RlbmVyL2xpc3RlbmVyLWNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkQXBwbGljYXRpb25MaXN0ZW5lciIsIDApOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1Rvb2wuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1Rvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGIzNmNmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvVG9vbC5qYXZhCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKworLyoqCisgKiA8cD5HZW5lcmFsIHB1cnBvc2Ugd3JhcHBlciBmb3IgY29tbWFuZCBsaW5lIHRvb2xzIHRoYXQgc2hvdWxkIGV4ZWN1dGUgaW4gYW4KKyAqIGVudmlyb25tZW50IHdpdGggdGhlIGNvbW1vbiBjbGFzcyBsb2FkZXIgZW52aXJvbm1lbnQgc2V0IHVwIGJ5IENhdGFsaW5hLgorICogVGhpcyBzaG91bGQgYmUgZXhlY3V0ZWQgZnJvbSBhIGNvbW1hbmQgbGluZSBzY3JpcHQgdGhhdCBjb25mb3JtcyB0bworICogdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHM6PC9wPgorICogPHVsPgorICogPGxpPlBhc3NlcyB0aGUgPGNvZGU+Y2F0YWxpbmEuaG9tZTwvY29kZT4gc3lzdGVtIHByb3BlcnR5IGNvbmZpZ3VyZWQgd2l0aAorICogICAgIHRoZSBwYXRobmFtZSBvZiB0aGUgVG9tY2F0IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuPC9saT4KKyAqIDxsaT5TZXRzIHRoZSBzeXN0ZW0gY2xhc3NwYXRoIHRvIGluY2x1ZGUgPGNvZGU+Ym9vdHN0cmFwLmphcjwvY29kZT4gYW5kCisgKiAgICAgPGNvZGU+JEpBVkFfSE9NRS9saWIvdG9vbHMuamFyPC9jb2RlPi48L2xpPgorICogPC91bD4KKyAqCisgKiA8cD5UaGUgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgdGhlIHRvb2wgbG9va3MgbGlrZTo8L3A+CisgKiA8cHJlPgorICogICBqYXZhIC1jbGFzc3BhdGggJENMQVNTUEFUSCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuVG9vbCBcCisgKiAgICAgJHtvcHRpb25zfSAke2NsYXNzbmFtZX0gJHthcmd1bWVudHN9CisgKiA8L3ByZT4KKyAqCisgKiA8cD53aXRoIHRoZSBmb2xsb3dpbmcgcmVwbGFjZW1lbnQgY29udGVudHM6CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz4ke29wdGlvbnN9PC9zdHJvbmc+IC0gQ29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIHRoaXMgVG9vbCB3cmFwcGVyLgorICogICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOgorICogICAgIDx1bD4KKyAqICAgICA8bGk+PGVtPi1hbnQ8L2VtPiA6IFNldCB0aGUgPGNvZGU+YW50LmhvbWU8L2NvZGU+IHN5c3RlbSBwcm9wZXJ0eQorICogICAgICAgICB0byBjb3JyZXNwb25kaW5nIHRvIHRoZSB2YWx1ZSBvZiA8Y29kZT5jYXRhbGluYS5ob21lPC9jb2RlPgorICogICAgICAgICAodXNlZnVsIHdoZW4geW91ciBjb21tYW5kIGxpbmUgdG9vbCBydW5zIEFudCkuPC9saT4KKyAqICAgICA8bGk+PGVtPi1jb21tb248L2VtPiA6IEFkZCA8Y29kZT5jb21tb24vY2xhc3NlczwvY29kZT4gYW5kCisgKiAgICAgICAgIDxjb2RlPmNvbW1vbi9saWI8L2NvZEUpIHRvIHRoZSBjbGFzcyBsb2FkZXIgcmVwb3NpdG9yaWVzLjwvbGk+CisgKiAgICAgPGxpPjxlbT4tc2VydmVyPC9lbT4gOiBBZGQgPGNvZGU+c2VydmVyL2NsYXNzZXM8L2NvZGU+IGFuZAorICogICAgICAgICA8Y29kZT5zZXJ2ZXIvbGliPC9jb2RlPiB0byB0aGUgY2xhc3MgbG9hZGVyIHJlcG9zaXRvcmllcy48L2xpPgorICogICAgIDxsaT48ZW0+LXNoYXJlZDwvZW0+IDogQWRkIDxjb2RlPnNoYXJlZC9jbGFzc2VzPC9jb2RlPiBhbmQKKyAqICAgICAgICAgPGNvZGU+c2hhcmVkL2xpYjwvY29kZT4gdG8gdGhlIGNsYXNzIGxvYWRlciByZXBvc2l0b3JpZXMuPC9saT4KKyAqICAgICA8L3VsPgorICogPGxpPjxzdHJvbmc+JHtjbGFzc25hbWV9PC9zdHJvbmc+IC0gRnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUKKyAqICAgICBhcHBsaWNhdGlvbidzIG1haW4gY2xhc3MuPC9saT4KKyAqIDxsaT48c3Ryb25nPiR7YXJndW1lbnRzfTwvc3Ryb25nPiAtIENvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvCisgKiAgICAgdGhlIGFwcGxpY2F0aW9uJ3MgPGNvZGU+bWFpbigpPC9jb2RlPiBtZXRob2QuPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBUb29sIHsKKworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRvb2wuY2xhc3MpOworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RhdGljIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBTZXQgPGNvZGU+YW50LmhvbWU8L2NvZGU+IHN5c3RlbSBwcm9wZXJ0eT8KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFudCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aG5hbWUgb2Ygb3VyIGluc3RhbGxhdGlvbiBiYXNlIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2F0YWxpbmFIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5ob21lIik7CisKKworICAgIC8qKgorICAgICAqIEluY2x1ZGUgY29tbW9uIGNsYXNzZXMgaW4gdGhlIHJlcG9zaXRvcmllcz8KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbW1vbiA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBJbmNsdWRlIHNlcnZlciBjbGFzc2VzIGluIHRoZSByZXBvc2l0b3JpZXM/CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzZXJ2ZXIgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogSW5jbHVkZSBzaGFyZWQgY2xhc3NlcyBpbiB0aGUgcmVwb3NpdG9yaWVzPworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2hhcmVkID0gZmFsc2U7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1haW4gUHJvZ3JhbQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWFpbiBwcm9ncmFtIGZvciB0aGUgYm9vdHN0cmFwLgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgQ29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBiZSBwcm9jZXNzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgImNhdGFsaW5hLmhvbWUiIHdhcyBwYXNzZWQuCisgICAgICAgIGlmIChjYXRhbGluYUhvbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJNdXN0IHNldCAnY2F0YWxpbmEuaG9tZScgc3lzdGVtIHByb3BlcnR5Iik7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2Nlc3MgY29tbWFuZCBsaW5lIG9wdGlvbnMKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSBhcmdzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIi1hbnQiLmVxdWFscyhhcmdzW2luZGV4XSkpCisgICAgICAgICAgICAgICAgYW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCItY29tbW9uIi5lcXVhbHMoYXJnc1tpbmRleF0pKQorICAgICAgICAgICAgICAgIGNvbW1vbiA9IHRydWU7CisgICAgICAgICAgICBlbHNlIGlmICgiLXNlcnZlciIuZXF1YWxzKGFyZ3NbaW5kZXhdKSkKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSB0cnVlOworICAgICAgICAgICAgZWxzZSBpZiAoIi1zaGFyZWQiLmVxdWFscyhhcmdzW2luZGV4XSkpCisgICAgICAgICAgICAgICAgc2hhcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluZGV4ID4gYXJncy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCAiYW50LmhvbWUiIGlmIHJlcXVlc3RlZAorICAgICAgICBpZiAoYW50KQorICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJhbnQuaG9tZSIsIGNhdGFsaW5hSG9tZSk7CisKKyAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBjbGFzcyBsb2FkZXIgd2Ugd2lsbCBiZSB1c2luZworICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3QgcGFja2VkID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgQXJyYXlMaXN0IHVucGFja2VkID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgdW5wYWNrZWQuYWRkKG5ldyBGaWxlKGNhdGFsaW5hSG9tZSwgImNsYXNzZXMiKSk7CisgICAgICAgICAgICBwYWNrZWQuYWRkKG5ldyBGaWxlKGNhdGFsaW5hSG9tZSwgImxpYiIpKTsKKyAgICAgICAgICAgIGlmIChjb21tb24pIHsKKyAgICAgICAgICAgICAgICB1bnBhY2tlZC5hZGQobmV3IEZpbGUoY2F0YWxpbmFIb21lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbW9uIiArIEZpbGUuc2VwYXJhdG9yICsgImNsYXNzZXMiKSk7CisgICAgICAgICAgICAgICAgcGFja2VkLmFkZChuZXcgRmlsZShjYXRhbGluYUhvbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbW9uIiArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICB1bnBhY2tlZC5hZGQobmV3IEZpbGUoY2F0YWxpbmFIb21lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIiArIEZpbGUuc2VwYXJhdG9yICsgImNsYXNzZXMiKSk7CisgICAgICAgICAgICAgICAgcGFja2VkLmFkZChuZXcgRmlsZShjYXRhbGluYUhvbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIiArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaGFyZWQpIHsKKyAgICAgICAgICAgICAgICB1bnBhY2tlZC5hZGQobmV3IEZpbGUoY2F0YWxpbmFIb21lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hhcmVkIiArIEZpbGUuc2VwYXJhdG9yICsgImNsYXNzZXMiKSk7CisgICAgICAgICAgICAgICAgcGFja2VkLmFkZChuZXcgRmlsZShjYXRhbGluYUhvbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hhcmVkIiArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsYXNzTG9hZGVyID0KKyAgICAgICAgICAgICAgICBDbGFzc0xvYWRlckZhY3RvcnkuY3JlYXRlQ2xhc3NMb2FkZXIKKyAgICAgICAgICAgICAgICAoKEZpbGVbXSkgdW5wYWNrZWQudG9BcnJheShuZXcgRmlsZVswXSksCisgICAgICAgICAgICAgICAgIChGaWxlW10pIHBhY2tlZC50b0FycmF5KG5ldyBGaWxlWzBdKSwKKyAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkNsYXNzIGxvYWRlciBjcmVhdGlvbiB0aHJldyBleGNlcHRpb24iLCB0KTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyKTsKKworICAgICAgICAvLyBMb2FkIG91ciBhcHBsaWNhdGlvbiBjbGFzcworICAgICAgICBDbGFzcyBjbGF6eiA9IG51bGw7CisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBhcmdzW2luZGV4KytdOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTG9hZGluZyBhcHBsaWNhdGlvbiBjbGFzcyAiICsgY2xhc3NOYW1lKTsKKyAgICAgICAgICAgIGNsYXp6ID0gY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBjcmVhdGluZyBpbnN0YW5jZSBvZiAiICsgY2xhc3NOYW1lLCB0KTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTG9jYXRlIHRoZSBzdGF0aWMgbWFpbigpIG1ldGhvZCBvZiB0aGUgYXBwbGljYXRpb24gY2xhc3MKKyAgICAgICAgTWV0aG9kIG1ldGhvZCA9IG51bGw7CisgICAgICAgIFN0cmluZyBwYXJhbXNbXSA9IG5ldyBTdHJpbmdbYXJncy5sZW5ndGggLSBpbmRleF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJncywgaW5kZXgsIHBhcmFtcywgMCwgcGFyYW1zLmxlbmd0aCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJZGVudGlmeWluZyBtYWluKCkgbWV0aG9kIik7CisgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9ICJtYWluIjsKKyAgICAgICAgICAgIENsYXNzIHBhcmFtVHlwZXNbXSA9IG5ldyBDbGFzc1sxXTsKKyAgICAgICAgICAgIHBhcmFtVHlwZXNbMF0gPSBwYXJhbXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIG1ldGhvZCA9IGNsYXp6LmdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbVR5cGVzKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiRXhjZXB0aW9uIGxvY2F0aW5nIG1haW4oKSBtZXRob2QiLCB0KTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW52b2tlIHRoZSBtYWluIG1ldGhvZCBvZiB0aGUgYXBwbGljYXRpb24gY2xhc3MKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNhbGxpbmcgbWFpbigpIG1ldGhvZCIpOworICAgICAgICAgICAgT2JqZWN0IHBhcmFtVmFsdWVzW10gPSBuZXcgT2JqZWN0WzFdOworICAgICAgICAgICAgcGFyYW1WYWx1ZXNbMF0gPSBwYXJhbXM7CisgICAgICAgICAgICBtZXRob2QuaW52b2tlKG51bGwsIHBhcmFtVmFsdWVzKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiRXhjZXB0aW9uIGNhbGxpbmcgbWFpbigpIG1ldGhvZCIsIHQpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGlzcGxheSB1c2FnZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRvb2wuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB1c2FnZSgpIHsKKworICAgICAgICBsb2cuaW5mbygiVXNhZ2U6ICBqYXZhIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Ub29sIFs8b3B0aW9ucz5dIDxjbGFzcz4gWzxhcmd1bWVudHM+XSIpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1VzZXJDb25maWcuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1VzZXJDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2JjMmE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvVXNlckNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworCisKKy8qKgorICogU3RhcnR1cCBldmVudCBsaXN0ZW5lciBmb3IgYSA8Yj5Ib3N0PC9iPiB0aGF0IGNvbmZpZ3VyZXMgQ29udGV4dHMgKHdlYgorICogYXBwbGljYXRpb25zKSBmb3IgYWxsIGRlZmluZWQgInVzZXJzIiB3aG8gaGF2ZSBhIHdlYiBhcHBsaWNhdGlvbiBpbiBhCisgKiBkaXJlY3Rvcnkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhlaXIgaG9tZSBkaXJlY3Rvcmllcy4gIFRoZSBjb250ZXh0CisgKiBwYXRoIG9mIGVhY2ggZGVwbG95ZWQgYXBwbGljYXRpb24gd2lsbCBiZSBzZXQgdG8gPGNvZGU+fnh4eHh4PC9jb2RlPiwgd2hlcmUKKyAqIHh4eHh4IGlzIHRoZSB1c2VybmFtZSBvZiB0aGUgb3duaW5nIHVzZXIgZm9yIHRoYXQgd2ViIGFwcGxpY2F0aW9uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBVc2VyQ29uZmlnCisgICAgaW1wbGVtZW50cyBMaWZlY3ljbGVMaXN0ZW5lciB7CisKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2c9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBVc2VyQ29uZmlnLmNsYXNzICk7CisKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgQ29udGV4dCBjb25maWd1cmF0aW9uIGNsYXNzIHdlIHNob3VsZCB1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29uZmlnQ2xhc3MgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNvbnRleHRDb25maWciOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBDb250ZXh0IGltcGxlbWVudGF0aW9uIHdlIHNob3VsZCB1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dENsYXNzID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IG5hbWUgdG8gYmUgc2VhcmNoZWQgZm9yIHdpdGhpbiBlYWNoIHVzZXIgaG9tZSBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGlyZWN0b3J5TmFtZSA9ICJwdWJsaWNfaHRtbCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBiYXNlIGRpcmVjdG9yeSBjb250YWluaW5nIHVzZXIgaG9tZSBkaXJlY3Rvcmllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBob21lQmFzZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBIb3N0IHdlIGFyZSBhc3NvY2lhdGVkIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBIb3N0IGhvc3QgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIHJlc291cmNlcyBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSB1c2VyIGRhdGFiYXNlIGNsYXNzIHdlIHNob3VsZCB1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlckNsYXNzID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5QYXNzd2RVc2VyRGF0YWJhc2UiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250ZXh0IGNvbmZpZ3VyYXRpb24gY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ0NsYXNzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jb25maWdDbGFzcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGV4dCBjb25maWd1cmF0aW9uIGNsYXNzIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnQ2xhc3MgVGhlIG5ldyBDb250ZXh0IGNvbmZpZ3VyYXRpb24gY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdDbGFzcyhTdHJpbmcgY29uZmlnQ2xhc3MpIHsKKworICAgICAgICB0aGlzLmNvbmZpZ0NsYXNzID0gY29uZmlnQ2xhc3M7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29udGV4dCBpbXBsZW1lbnRhdGlvbiBjbGFzcyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dENsYXNzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jb250ZXh0Q2xhc3MpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENvbnRleHQgaW1wbGVtZW50YXRpb24gY2xhc3MgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0Q2xhc3MgVGhlIG5ldyBDb250ZXh0IGltcGxlbWVudGF0aW9uIGNsYXNzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dENsYXNzKFN0cmluZyBjb250ZXh0Q2xhc3MpIHsKKworICAgICAgICB0aGlzLmNvbnRleHRDbGFzcyA9IGNvbnRleHRDbGFzczsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaXJlY3RvcnkgbmFtZSBmb3IgdXNlciB3ZWIgYXBwbGljYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZGlyZWN0b3J5TmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlyZWN0b3J5IG5hbWUgZm9yIHVzZXIgd2ViIGFwcGxpY2F0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXJlY3RvcnlOYW1lIFRoZSBuZXcgZGlyZWN0b3J5IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnlOYW1lKFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7CisKKyAgICAgICAgdGhpcy5kaXJlY3RvcnlOYW1lID0gZGlyZWN0b3J5TmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBiYXNlIGRpcmVjdG9yeSBjb250YWluaW5nIHVzZXIgaG9tZSBkaXJlY3Rvcmllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvbWVCYXNlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5ob21lQmFzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYmFzZSBkaXJlY3RvcnkgY29udGFpbmluZyB1c2VyIGhvbWUgZGlyZWN0b3JpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaG9tZUJhc2UgVGhlIG5ldyBiYXNlIGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvbWVCYXNlKFN0cmluZyBob21lQmFzZSkgeworCisgICAgICAgIHRoaXMuaG9tZUJhc2UgPSBob21lQmFzZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VyIGRhdGFiYXNlIGNsYXNzIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlckNsYXNzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy51c2VyQ2xhc3MpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVzZXIgZGF0YWJhc2UgY2xhc3MgbmFtZSBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlckNsYXNzKFN0cmluZyB1c2VyQ2xhc3MpIHsKKworICAgICAgICB0aGlzLnVzZXJDbGFzcyA9IHVzZXJDbGFzczsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIFNUQVJUIGV2ZW50IGZvciBhbiBhc3NvY2lhdGVkIEhvc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGxpZmVjeWNsZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIGhvc3Qgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aAorICAgICAgICB0cnkgeworICAgICAgICAgICAgaG9zdCA9IChIb3N0KSBldmVudC5nZXRMaWZlY3ljbGUoKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImhvc3RDb25maWcuY2NlIiwgZXZlbnQuZ2V0TGlmZWN5Y2xlKCkpLCBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2Nlc3MgdGhlIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICAgIGlmIChldmVudC5nZXRUeXBlKCkuZXF1YWxzKExpZmVjeWNsZS5TVEFSVF9FVkVOVCkpCisgICAgICAgICAgICBzdGFydCgpOworICAgICAgICBlbHNlIGlmIChldmVudC5nZXRUeXBlKCkuZXF1YWxzKExpZmVjeWNsZS5TVE9QX0VWRU5UKSkKKyAgICAgICAgICAgIHN0b3AoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIERlcGxveSBhIHdlYiBhcHBsaWNhdGlvbiBmb3IgYW55IHVzZXIgd2hvIGhhcyBhIHdlYiBhcHBsaWNhdGlvbiBwcmVzZW50CisgICAgICogaW4gYSBkaXJlY3Rvcnkgd2l0aCBhIHNwZWNpZmllZCBuYW1lIHdpdGhpbiB0aGVpciBob21lIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZGVwbG95KCkgeworCisgICAgICAgIGlmIChob3N0LmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBob3N0LmdldExvZ2dlcigpLmRlYnVnKHNtLmdldFN0cmluZygidXNlckNvbmZpZy5kZXBsb3lpbmciKSk7CisKKyAgICAgICAgLy8gTG9hZCB0aGUgdXNlciBkYXRhYmFzZSBvYmplY3QgZm9yIHRoaXMgaG9zdAorICAgICAgICBVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKHVzZXJDbGFzcyk7CisgICAgICAgICAgICBkYXRhYmFzZSA9IChVc2VyRGF0YWJhc2UpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBkYXRhYmFzZS5zZXRVc2VyQ29uZmlnKHRoaXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaG9zdC5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoInVzZXJDb25maWcuZGF0YWJhc2UiKSwgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXBsb3kgdGhlIHdlYiBhcHBsaWNhdGlvbiAoaWYgYW55KSBmb3IgZWFjaCBkZWZpbmVkIHVzZXIKKyAgICAgICAgRW51bWVyYXRpb24gdXNlcnMgPSBkYXRhYmFzZS5nZXRVc2VycygpOworICAgICAgICB3aGlsZSAodXNlcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyB1c2VyID0gKFN0cmluZykgdXNlcnMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIFN0cmluZyBob21lID0gZGF0YWJhc2UuZ2V0SG9tZSh1c2VyKTsKKyAgICAgICAgICAgIGRlcGxveSh1c2VyLCBob21lKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXBsb3kgYSB3ZWIgYXBwbGljYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgdXNlciBpZiB0aGV5IGhhdmUgc3VjaCBhbgorICAgICAqIGFwcGxpY2F0aW9uIGluIHRoZSBkZWZpbmVkIGRpcmVjdG9yeSB3aXRoaW4gdGhlaXIgaG9tZSBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlciBVc2VybmFtZSBvd25pbmcgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIGRlcGxveWVkCisgICAgICogQHBhcmFtIGhvbWUgSG9tZSBkaXJlY3Rvcnkgb2YgdGhpcyB1c2VyCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRlcGxveShTdHJpbmcgdXNlciwgU3RyaW5nIGhvbWUpIHsKKworICAgICAgICAvLyBEb2VzIHRoaXMgdXNlciBoYXZlIGEgd2ViIGFwcGxpY2F0aW9uIHRvIGJlIGRlcGxveWVkPworICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSAiL34iICsgdXNlcjsKKyAgICAgICAgaWYgKGhvc3QuZmluZENoaWxkKGNvbnRleHRQYXRoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBGaWxlIGFwcCA9IG5ldyBGaWxlKGhvbWUsIGRpcmVjdG9yeU5hbWUpOworICAgICAgICBpZiAoIWFwcC5leGlzdHMoKSB8fCAhYXBwLmlzRGlyZWN0b3J5KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC8qCisgICAgICAgIEZpbGUgZGQgPSBuZXcgRmlsZShhcHAsICIvV0VCLUlORi93ZWIueG1sIik7CisgICAgICAgIGlmICghZGQuZXhpc3RzKCkgfHwgIWRkLmlzRmlsZSgpIHx8ICFkZC5jYW5SZWFkKCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICovCisgICAgICAgIGhvc3QuZ2V0TG9nZ2VyKCkuaW5mbyhzbS5nZXRTdHJpbmcoInVzZXJDb25maWcuZGVwbG95IiwgdXNlcikpOworCisgICAgICAgIC8vIERlcGxveSB0aGUgd2ViIGFwcGxpY2F0aW9uIGZvciB0aGlzIHVzZXIKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjb250ZXh0Q2xhc3MpOworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0KKyAgICAgICAgICAgICAgKENvbnRleHQpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBjb250ZXh0LnNldFBhdGgoY29udGV4dFBhdGgpOworICAgICAgICAgICAgY29udGV4dC5zZXREb2NCYXNlKGFwcC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNvbmZpZ0NsYXNzKTsKKyAgICAgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgICAoTGlmZWN5Y2xlTGlzdGVuZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNvbnRleHQpLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhvc3QuYWRkQ2hpbGQoY29udGV4dCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBob3N0LmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygidXNlckNvbmZpZy5lcnJvciIsIHVzZXIpLCBlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgInN0YXJ0IiBldmVudCBmb3IgdGhpcyBIb3N0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdGFydCgpIHsKKworICAgICAgICBpZiAoaG9zdC5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgaG9zdC5nZXRMb2dnZXIoKS5kZWJ1ZyhzbS5nZXRTdHJpbmcoInVzZXJDb25maWcuc3RhcnQiKSk7CisKKyAgICAgICAgZGVwbG95KCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSAic3RvcCIgZXZlbnQgZm9yIHRoaXMgSG9zdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RvcCgpIHsKKworICAgICAgICBpZiAoaG9zdC5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgaG9zdC5nZXRMb2dnZXIoKS5kZWJ1ZyhzbS5nZXRTdHJpbmcoInVzZXJDb25maWcuc3RvcCIpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Vc2VyRGF0YWJhc2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1VzZXJEYXRhYmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MDE0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Vc2VyRGF0YWJhc2UuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCisKKy8qKgorICogQWJzdHJhY3Rpb24gb2YgdGhlIHNldCBvZiB1c2VycyBkZWZpbmVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uIHRoZQorICogY3VycmVudCBzZXJ2ZXIgcGxhdGZvcm0uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgVXNlckRhdGFiYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFVzZXJDb25maWcgbGlzdGVuZXIgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVXNlckNvbmZpZyBnZXRVc2VyQ29uZmlnKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgVXNlckNvbmZpZyBsaXN0ZW5lciB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJDb25maWcgVGhlIG5ldyBVc2VyQ29uZmlnIGxpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlckNvbmZpZyhVc2VyQ29uZmlnIHVzZXJDb25maWcpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhYnNvbHV0ZSBwYXRobmFtZSB0byB0aGUgaG9tZSBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZWQgdXNlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyIFVzZXIgZm9yIHdoaWNoIGEgaG9tZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIHJldHJpZXZlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9tZShTdHJpbmcgdXNlcik7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgdXNlcm5hbWVzIGRlZmluZWQgb24gdGhpcyBzZXJ2ZXIuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFVzZXJzKCk7CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvV2ViUnVsZVNldC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvV2ViUnVsZVNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YzQ3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9XZWJSdWxlU2V0LmphdmEKQEAgLTAsMCArMSw2MTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwOworCisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuV3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5TZWN1cml0eUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLlJ1bGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5SdWxlU2V0QmFzZTsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworCisKKy8qKgorICogPHA+PHN0cm9uZz5SdWxlU2V0PC9zdHJvbmc+IGZvciBwcm9jZXNzaW5nIHRoZSBjb250ZW50cyBvZiBhIHdlYiBhcHBsaWNhdGlvbgorICogZGVwbG95bWVudCBkZXNjcmlwdG9yICg8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPikgcmVzb3VyY2UuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgV2ViUnVsZVNldCBleHRlbmRzIFJ1bGVTZXRCYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeCB0byB1c2UgZm9yIHJlY29nbml6aW5nIG91ciBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCA9IG51bGw7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPlNldFNlc3Npb25Db25maWc8L2NvZGU+IHJ1bGUgdXNlZCB0byBwYXJzZSB0aGUgd2ViLnhtbAorICAgICAqLworICAgIHByb3RlY3RlZCBTZXRTZXNzaW9uQ29uZmlnIHNlc3Npb25Db25maWc7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPlNldExvZ2luQ29uZmlnPC9jb2RlPiBydWxlIHVzZWQgdG8gcGFyc2UgdGhlIHdlYi54bWwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2V0TG9naW5Db25maWcgbG9naW5Db25maWc7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+U2V0SnNwQ29uZmlnPC9jb2RlPiBydWxlIHVzZWQgdG8gcGFyc2UgdGhlIHdlYi54bWwKKyAgICAgKi8gICAgCisgICAgcHJvdGVjdGVkIFNldEpzcENvbmZpZyBqc3BDb25maWc7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5SdWxlU2V0PC9jb2RlPiB3aXRoIHRoZSBkZWZhdWx0CisgICAgICogbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXguCisgICAgICovCisgICAgcHVibGljIFdlYlJ1bGVTZXQoKSB7CisKKyAgICAgICAgdGhpcygiIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4LgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBQcmVmaXggZm9yIG1hdGNoaW5nIHBhdHRlcm4gcnVsZXMgKGluY2x1ZGluZyB0aGUKKyAgICAgKiAgdHJhaWxpbmcgc2xhc2ggY2hhcmFjdGVyKQorICAgICAqLworICAgIHB1YmxpYyBXZWJSdWxlU2V0KFN0cmluZyBwcmVmaXgpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IG51bGw7CisgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogPHA+QWRkIHRoZSBzZXQgb2YgUnVsZSBpbnN0YW5jZXMgZGVmaW5lZCBpbiB0aGlzIFJ1bGVTZXQgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIDxjb2RlPkRpZ2VzdGVyPC9jb2RlPiBpbnN0YW5jZSwgYXNzb2NpYXRpbmcgdGhlbSB3aXRoCisgICAgICogb3VyIG5hbWVzcGFjZSBVUkkgKGlmIGFueSkuICBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQKKyAgICAgKiBieSBhIERpZ2VzdGVyIGluc3RhbmNlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaWdlc3RlciBEaWdlc3RlciBpbnN0YW5jZSB0byB3aGljaCB0aGUgbmV3IFJ1bGUgaW5zdGFuY2VzCisgICAgICogIHNob3VsZCBiZSBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSdWxlSW5zdGFuY2VzKERpZ2VzdGVyIGRpZ2VzdGVyKSB7CisgICAgICAgIHNlc3Npb25Db25maWcgPSBuZXcgU2V0U2Vzc2lvbkNvbmZpZygpOworICAgICAgICBqc3BDb25maWcgPSBuZXcgU2V0SnNwQ29uZmlnKCk7CisgICAgICAgIGxvZ2luQ29uZmlnID0gbmV3IFNldExvZ2luQ29uZmlnKCk7CisgICAgICAgIAorICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJ3ZWItYXBwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2V0UHVibGljSWRSdWxlKCJzZXRQdWJsaWNJZCIpKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2NvbnRleHQtcGFyYW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRQYXJhbWV0ZXIiLCAyKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKHByZWZpeCArICJ3ZWItYXBwL2NvbnRleHQtcGFyYW0vcGFyYW0tbmFtZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0ocHJlZml4ICsgIndlYi1hcHAvY29udGV4dC1wYXJhbS9wYXJhbS12YWx1ZSIsIDEpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZGlzcGxheS1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0RGlzcGxheU5hbWUiLCAwKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJ3ZWItYXBwL2Rpc3RyaWJ1dGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZXREaXN0cmlidXRhYmxlUnVsZSgpKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIndlYi1hcHAvZWpiLWxvY2FsLXJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dExvY2FsRWpiIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIndlYi1hcHAvZWpiLWxvY2FsLXJlZiIsCisgICAgICAgICAgICAgICAgbmV3IFNldE5leHROYW1pbmdSdWxlKCJhZGRMb2NhbEVqYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRMb2NhbEVqYiIpKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2VqYi1sb2NhbC1yZWYvZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXREZXNjcmlwdGlvbiIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2VqYi1sb2NhbC1yZWYvZWpiLWxpbmsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRMaW5rIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZWpiLWxvY2FsLXJlZi9lamItcmVmLW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXROYW1lIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZWpiLWxvY2FsLXJlZi9lamItcmVmLXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRUeXBlIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZWpiLWxvY2FsLXJlZi9sb2NhbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldExvY2FsIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZWpiLWxvY2FsLXJlZi9sb2NhbC1ob21lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0SG9tZSIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAid2ViLWFwcC9lamItcmVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RWpiIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIndlYi1hcHAvZWpiLXJlZiIsCisgICAgICAgICAgICAgICAgbmV3IFNldE5leHROYW1pbmdSdWxlKCJhZGRFamIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RWpiIikpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZWpiLXJlZi9kZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldERlc2NyaXB0aW9uIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZWpiLXJlZi9lamItbGluayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldExpbmsiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9lamItcmVmL2VqYi1yZWYtbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldE5hbWUiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9lamItcmVmL2VqYi1yZWYtdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFR5cGUiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9lamItcmVmL2hvbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRIb21lIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZWpiLXJlZi9yZW1vdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRSZW1vdGUiLCAwKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIndlYi1hcHAvZW52LWVudHJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RW52aXJvbm1lbnQiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAid2ViLWFwcC9lbnYtZW50cnkiLAorICAgICAgICAgICAgICAgIG5ldyBTZXROZXh0TmFtaW5nUnVsZSgiYWRkRW52aXJvbm1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RW52aXJvbm1lbnQiKSk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9lbnYtZW50cnkvZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXREZXNjcmlwdGlvbiIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2Vudi1lbnRyeS9lbnYtZW50cnktbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldE5hbWUiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9lbnYtZW50cnkvZW52LWVudHJ5LXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRUeXBlIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZW52LWVudHJ5L2Vudi1lbnRyeS12YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFZhbHVlIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJ3ZWItYXBwL2Vycm9yLXBhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkVycm9yUGFnZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJ3ZWItYXBwL2Vycm9yLXBhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRFcnJvclBhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5FcnJvclBhZ2UiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2Vycm9yLXBhZ2UvZXJyb3ItY29kZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldEVycm9yQ29kZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2Vycm9yLXBhZ2UvZXhjZXB0aW9uLXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRFeGNlcHRpb25UeXBlIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZXJyb3ItcGFnZS9sb2NhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldExvY2F0aW9uIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJ3ZWItYXBwL2ZpbHRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuRmlsdGVyRGVmIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIndlYi1hcHAvZmlsdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkRmlsdGVyRGVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuRmlsdGVyRGVmIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9maWx0ZXIvZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXREZXNjcmlwdGlvbiIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2ZpbHRlci9kaXNwbGF5LW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXREaXNwbGF5TmFtZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2ZpbHRlci9maWx0ZXItY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRGaWx0ZXJDbGFzcyIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2ZpbHRlci9maWx0ZXItbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldEZpbHRlck5hbWUiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9maWx0ZXIvbGFyZ2UtaWNvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldExhcmdlSWNvbiIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2ZpbHRlci9zbWFsbC1pY29uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0U21hbGxJY29uIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9maWx0ZXIvaW5pdC1wYXJhbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZEluaXRQYXJhbWV0ZXIiLCAyKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKHByZWZpeCArICJ3ZWItYXBwL2ZpbHRlci9pbml0LXBhcmFtL3BhcmFtLW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbShwcmVmaXggKyAid2ViLWFwcC9maWx0ZXIvaW5pdC1wYXJhbS9wYXJhbS12YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIndlYi1hcHAvZmlsdGVyLW1hcHBpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkZpbHRlck1hcCIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJ3ZWItYXBwL2ZpbHRlci1tYXBwaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkRmlsdGVyTWFwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuRmlsdGVyTWFwIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9maWx0ZXItbWFwcGluZy9maWx0ZXItbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldEZpbHRlck5hbWUiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9maWx0ZXItbWFwcGluZy9zZXJ2bGV0LW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRTZXJ2bGV0TmFtZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2ZpbHRlci1tYXBwaW5nL3VybC1wYXR0ZXJuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0VVJMUGF0dGVybiIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZmlsdGVyLW1hcHBpbmcvZGlzcGF0Y2hlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldERpc3BhdGNoZXIiLCAwKTsKKworICAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9saXN0ZW5lci9saXN0ZW5lci1jbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRBcHBsaWNhdGlvbkxpc3RlbmVyIiwgMCk7CisgICAgICAgICAKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAid2ViLWFwcC9qc3AtY29uZmlnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBqc3BDb25maWcpOworICAgICAgICAKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9qc3AtY29uZmlnL2pzcC1wcm9wZXJ0eS1ncm91cC91cmwtcGF0dGVybiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZEpzcE1hcHBpbmciLCAwKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2xpc3RlbmVyL2xpc3RlbmVyLWNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkQXBwbGljYXRpb25MaXN0ZW5lciIsIDApOworICAgICAgICAKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAid2ViLWFwcC9sb2dpbi1jb25maWciLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2luQ29uZmlnKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIndlYi1hcHAvbG9naW4tY29uZmlnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Mb2dpbkNvbmZpZyIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJ3ZWItYXBwL2xvZ2luLWNvbmZpZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldExvZ2luQ29uZmlnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTG9naW5Db25maWciKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2xvZ2luLWNvbmZpZy9hdXRoLW1ldGhvZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldEF1dGhNZXRob2QiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9sb2dpbi1jb25maWcvcmVhbG0tbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFJlYWxtTmFtZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2xvZ2luLWNvbmZpZy9mb3JtLWxvZ2luLWNvbmZpZy9mb3JtLWVycm9yLXBhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRFcnJvclBhZ2UiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9sb2dpbi1jb25maWcvZm9ybS1sb2dpbi1jb25maWcvZm9ybS1sb2dpbi1wYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TG9naW5QYWdlIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9taW1lLW1hcHBpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRNaW1lTWFwcGluZyIsIDIpOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0ocHJlZml4ICsgIndlYi1hcHAvbWltZS1tYXBwaW5nL2V4dGVuc2lvbiIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0ocHJlZml4ICsgIndlYi1hcHAvbWltZS1tYXBwaW5nL21pbWUtdHlwZSIsIDEpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAid2ViLWFwcC9yZXNvdXJjZS1lbnYtcmVmIiwKKyAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VFbnZSZWYiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAid2ViLWFwcC9yZXNvdXJjZS1lbnYtcmVmIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNldE5leHROYW1pbmdSdWxlKCJhZGRSZXNvdXJjZUVudlJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlRW52UmVmIikpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvcmVzb3VyY2UtZW52LXJlZi9yZXNvdXJjZS1lbnYtcmVmLW5hbWUiLAorICAgICAgICAgICAgICAgICJzZXROYW1lIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvcmVzb3VyY2UtZW52LXJlZi9yZXNvdXJjZS1lbnYtcmVmLXR5cGUiLAorICAgICAgICAgICAgICAgICJzZXRUeXBlIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJ3ZWItYXBwL21lc3NhZ2UtZGVzdGluYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk1lc3NhZ2VEZXN0aW5hdGlvbiIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJ3ZWItYXBwL21lc3NhZ2UtZGVzdGluYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRNZXNzYWdlRGVzdGluYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5NZXNzYWdlRGVzdGluYXRpb24iKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL21lc3NhZ2UtZGVzdGluYXRpb24vZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXREZXNjcmlwdGlvbiIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL21lc3NhZ2UtZGVzdGluYXRpb24vZGlzcGxheS1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0RGlzcGxheU5hbWUiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9tZXNzYWdlLWRlc3RpbmF0aW9uL2ljb24vbGFyZ2UtaWNvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldExhcmdlSWNvbiIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL21lc3NhZ2UtZGVzdGluYXRpb24vaWNvbi9zbWFsbC1pY29uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0U21hbGxJY29uIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvbWVzc2FnZS1kZXN0aW5hdGlvbi9tZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXROYW1lIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJ3ZWItYXBwL21lc3NhZ2UtZGVzdGluYXRpb24tcmVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5NZXNzYWdlRGVzdGluYXRpb25SZWYiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAid2ViLWFwcC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZE1lc3NhZ2VEZXN0aW5hdGlvblJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk1lc3NhZ2VEZXN0aW5hdGlvblJlZiIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYvZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXREZXNjcmlwdGlvbiIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL21lc3NhZ2UtZGVzdGluYXRpb24tcmVmL21lc3NhZ2UtZGVzdGluYXRpb24tbGluayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldExpbmsiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TmFtZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL21lc3NhZ2UtZGVzdGluYXRpb24tcmVmL21lc3NhZ2UtZGVzdGluYXRpb24tdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFR5cGUiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi9tZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0VXNhZ2UiLCAwKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIndlYi1hcHAvcmVzb3VyY2UtcmVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2UiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAid2ViLWFwcC9yZXNvdXJjZS1yZWYiLAorICAgICAgICAgICAgICAgIG5ldyBTZXROZXh0TmFtaW5nUnVsZSgiYWRkUmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2UiKSk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9yZXNvdXJjZS1yZWYvZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXREZXNjcmlwdGlvbiIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL3Jlc291cmNlLXJlZi9yZXMtYXV0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldEF1dGgiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9yZXNvdXJjZS1yZWYvcmVzLXJlZi1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TmFtZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL3Jlc291cmNlLXJlZi9yZXMtc2hhcmluZy1zY29wZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFNjb3BlIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvcmVzb3VyY2UtcmVmL3Jlcy10eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0VHlwZSIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAid2ViLWFwcC9zZWN1cml0eS1jb25zdHJhaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5TZWN1cml0eUNvbnN0cmFpbnQiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAid2ViLWFwcC9zZWN1cml0eS1jb25zdHJhaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkQ29uc3RyYWludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LlNlY3VyaXR5Q29uc3RyYWludCIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIndlYi1hcHAvc2VjdXJpdHktY29uc3RyYWludC9hdXRoLWNvbnN0cmFpbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZXRBdXRoQ29uc3RyYWludFJ1bGUoKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvc2VjdXJpdHktY29uc3RyYWludC9hdXRoLWNvbnN0cmFpbnQvcm9sZS1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkQXV0aFJvbGUiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9zZWN1cml0eS1jb25zdHJhaW50L2Rpc3BsYXktbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldERpc3BsYXlOYW1lIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvc2VjdXJpdHktY29uc3RyYWludC91c2VyLWRhdGEtY29uc3RyYWludC90cmFuc3BvcnQtZ3VhcmFudGVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0VXNlckNvbnN0cmFpbnQiLCAwKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIndlYi1hcHAvc2VjdXJpdHktY29uc3RyYWludC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuU2VjdXJpdHlDb2xsZWN0aW9uIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIndlYi1hcHAvc2VjdXJpdHktY29uc3RyYWludC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZENvbGxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5TZWN1cml0eUNvbGxlY3Rpb24iKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9zZWN1cml0eS1jb25zdHJhaW50L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uL2h0dHAtbWV0aG9kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkTWV0aG9kIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvc2VjdXJpdHktY29uc3RyYWludC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbi91cmwtcGF0dGVybiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFBhdHRlcm4iLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9zZWN1cml0eS1jb25zdHJhaW50L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uL3dlYi1yZXNvdXJjZS1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TmFtZSIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvc2VjdXJpdHktcm9sZS9yb2xlLW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRTZWN1cml0eVJvbGUiLCAwKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJ3ZWItYXBwL3NlcnZsZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXcmFwcGVyQ3JlYXRlUnVsZSgpKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAid2ViLWFwcC9zZXJ2bGV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkQ2hpbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lciIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvc2VydmxldC9pbml0LXBhcmFtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkSW5pdFBhcmFtZXRlciIsIDIpOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0ocHJlZml4ICsgIndlYi1hcHAvc2VydmxldC9pbml0LXBhcmFtL3BhcmFtLW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbShwcmVmaXggKyAid2ViLWFwcC9zZXJ2bGV0L2luaXQtcGFyYW0vcGFyYW0tdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9zZXJ2bGV0L2pzcC1maWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0SnNwRmlsZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL3NlcnZsZXQvbG9hZC1vbi1zdGFydHVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TG9hZE9uU3RhcnR1cFN0cmluZyIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL3NlcnZsZXQvcnVuLWFzL3JvbGUtbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFJ1bkFzIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9zZXJ2bGV0L3NlY3VyaXR5LXJvbGUtcmVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkU2VjdXJpdHlSZWZlcmVuY2UiLCAyKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKHByZWZpeCArICJ3ZWItYXBwL3NlcnZsZXQvc2VjdXJpdHktcm9sZS1yZWYvcm9sZS1saW5rIiwgMSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbShwcmVmaXggKyAid2ViLWFwcC9zZXJ2bGV0L3NlY3VyaXR5LXJvbGUtcmVmL3JvbGUtbmFtZSIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvc2VydmxldC9zZXJ2bGV0LWNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRTZXJ2bGV0Q2xhc3MiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9zZXJ2bGV0L3NlcnZsZXQtbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TmFtZSIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvc2VydmxldC1tYXBwaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkU2VydmxldE1hcHBpbmciLCAyKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKHByZWZpeCArICJ3ZWItYXBwL3NlcnZsZXQtbWFwcGluZy9zZXJ2bGV0LW5hbWUiLCAxKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKHByZWZpeCArICJ3ZWItYXBwL3NlcnZsZXQtbWFwcGluZy91cmwtcGF0dGVybiIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIndlYi1hcHAvc2Vzc2lvbi1jb25maWciLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Db25maWcpOworICAgICAgICAKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9zZXNzaW9uLWNvbmZpZy9zZXNzaW9uLXRpbWVvdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRTZXNzaW9uVGltZW91dCIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBJbnRlZ2VyLlRZUEUgfSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbShwcmVmaXggKyAid2ViLWFwcC9zZXNzaW9uLWNvbmZpZy9zZXNzaW9uLXRpbWVvdXQiLCAwKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL3RhZ2xpYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFRhZ2xpYiIsIDIpOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0ocHJlZml4ICsgIndlYi1hcHAvdGFnbGliL3RhZ2xpYi1sb2NhdGlvbiIsIDEpOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0ocHJlZml4ICsgIndlYi1hcHAvdGFnbGliL3RhZ2xpYi11cmkiLCAwKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL3dlbGNvbWUtZmlsZS1saXN0L3dlbGNvbWUtZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFdlbGNvbWVGaWxlIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9sb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0L2xvY2FsZS1lbmNvZGluZy1tYXBwaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRMb2NhbGVFbmNvZGluZ01hcHBpbmdQYXJhbWV0ZXIiLCAyKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKHByZWZpeCArICJ3ZWItYXBwL2xvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QvbG9jYWxlLWVuY29kaW5nLW1hcHBpbmcvbG9jYWxlIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbShwcmVmaXggKyAid2ViLWFwcC9sb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0L2xvY2FsZS1lbmNvZGluZy1tYXBwaW5nL2VuY29kaW5nIiwgMSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldCBjb3VudGVyIHVzZWQgZm9yIHZhbGlkYXRpbmcgdGhlIHdlYi54bWwgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCl7CisgICAgICAgIGpzcENvbmZpZy5pc0pzcENvbmZpZ1NldCA9IGZhbHNlOworICAgICAgICBzZXNzaW9uQ29uZmlnLmlzU2Vzc2lvbkNvbmZpZ1NldCA9IGZhbHNlOworICAgICAgICBsb2dpbkNvbmZpZy5pc0xvZ2luQ29uZmlnU2V0ID0gZmFsc2U7CisgICAgfQorfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgQ2xhc3NlcworCisKKy8qKgorICogUnVsZSB0byBjaGVjayB0aGF0IHRoZSA8Y29kZT5sb2dpbi1jb25maWc8L2NvZGU+IGlzIG9jY3VyaW5nIAorICogb25seSAxIHRpbWUgd2l0aGluIHRoZSB3ZWIueG1sCisgKi8KK2ZpbmFsIGNsYXNzIFNldExvZ2luQ29uZmlnIGV4dGVuZHMgUnVsZSB7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNMb2dpbkNvbmZpZ1NldCA9IGZhbHNlOworICAgIHB1YmxpYyBTZXRMb2dpbkNvbmZpZygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWdpbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzTG9naW5Db25maWdTZXQpeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICI8bG9naW4tY29uZmlnPiBlbGVtZW50IGlzIGxpbWl0ZWQgdG8gMSBvY2N1cmFuY2UiKTsKKyAgICAgICAgfQorICAgICAgICBpc0xvZ2luQ29uZmlnU2V0ID0gdHJ1ZTsKKyAgICB9CisKK30KKworCisvKioKKyAqIFJ1bGUgdG8gY2hlY2sgdGhhdCB0aGUgPGNvZGU+anNwLWNvbmZpZzwvY29kZT4gaXMgb2NjdXJpbmcgCisgKiBvbmx5IDEgdGltZSB3aXRoaW4gdGhlIHdlYi54bWwKKyAqLworZmluYWwgY2xhc3MgU2V0SnNwQ29uZmlnIGV4dGVuZHMgUnVsZSB7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNKc3BDb25maWdTZXQgPSBmYWxzZTsKKyAgICBwdWJsaWMgU2V0SnNwQ29uZmlnKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZ2luKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaXNKc3BDb25maWdTZXQpeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICI8anNwLWNvbmZpZz4gZWxlbWVudCBpcyBsaW1pdGVkIHRvIDEgb2NjdXJhbmNlIik7CisgICAgICAgIH0KKyAgICAgICAgaXNKc3BDb25maWdTZXQgPSB0cnVlOworICAgIH0KKworfQorCisKKy8qKgorICogUnVsZSB0byBjaGVjayB0aGF0IHRoZSA8Y29kZT5zZXNzaW9uLWNvbmZpZzwvY29kZT4gaXMgb2NjdXJpbmcgCisgKiBvbmx5IDEgdGltZSB3aXRoaW4gdGhlIHdlYi54bWwKKyAqLworZmluYWwgY2xhc3MgU2V0U2Vzc2lvbkNvbmZpZyBleHRlbmRzIFJ1bGUgeworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU2Vzc2lvbkNvbmZpZ1NldCA9IGZhbHNlOworICAgIHB1YmxpYyBTZXRTZXNzaW9uQ29uZmlnKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZ2luKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaXNTZXNzaW9uQ29uZmlnU2V0KXsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAiPHNlc3Npb24tY29uZmlnPiBlbGVtZW50IGlzIGxpbWl0ZWQgdG8gMSBvY2N1cmFuY2UiKTsKKyAgICAgICAgfQorICAgICAgICBpc1Nlc3Npb25Db25maWdTZXQgPSB0cnVlOworICAgIH0KKworfQorCisvKioKKyAqIEEgUnVsZSB0aGF0IGNhbGxzIHRoZSA8Y29kZT5zZXRBdXRoQ29uc3RyYWludCh0cnVlKTwvY29kZT4gbWV0aG9kIG9mCisgKiB0aGUgdG9wIGl0ZW0gb24gdGhlIHN0YWNrLCB3aGljaCBtdXN0IGJlIG9mIHR5cGUKKyAqIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LlNlY3VyaXR5Q29uc3RyYWludDwvY29kZT4uCisgKi8KKworZmluYWwgY2xhc3MgU2V0QXV0aENvbnN0cmFpbnRSdWxlIGV4dGVuZHMgUnVsZSB7CisKKyAgICBwdWJsaWMgU2V0QXV0aENvbnN0cmFpbnRSdWxlKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZ2luKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgc2VjdXJpdHlDb25zdHJhaW50ID0KKyAgICAgICAgICAgIChTZWN1cml0eUNvbnN0cmFpbnQpIGRpZ2VzdGVyLnBlZWsoKTsKKyAgICAgICAgc2VjdXJpdHlDb25zdHJhaW50LnNldEF1dGhDb25zdHJhaW50KHRydWUpOworICAgICAgICBpZiAoZGlnZXN0ZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgZGlnZXN0ZXIuZ2V0TG9nZ2VyKCkKKyAgICAgICAgICAgICAgIC5kZWJ1ZygiQ2FsbGluZyBTZWN1cml0eUNvbnN0cmFpbnQuc2V0QXV0aENvbnN0cmFpbnQodHJ1ZSkiKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCisKKy8qKgorICogQ2xhc3MgdGhhdCBjYWxscyA8Y29kZT5zZXREaXN0cmlidXRhYmxlKHRydWUpPC9jb2RlPiBmb3IgdGhlIHRvcCBvYmplY3QKKyAqIG9uIHRoZSBzdGFjaywgd2hpY2ggbXVzdCBiZSBhIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDwvY29kZT4uCisgKi8KKworZmluYWwgY2xhc3MgU2V0RGlzdHJpYnV0YWJsZVJ1bGUgZXh0ZW5kcyBSdWxlIHsKKworICAgIHB1YmxpYyBTZXREaXN0cmlidXRhYmxlUnVsZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWdpbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGRpZ2VzdGVyLnBlZWsoKTsKKyAgICAgICAgY29udGV4dC5zZXREaXN0cmlidXRhYmxlKHRydWUpOworICAgICAgICBpZiAoZGlnZXN0ZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgZGlnZXN0ZXIuZ2V0TG9nZ2VyKCkuZGVidWcKKyAgICAgICAgICAgICAgIChjb250ZXh0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5zZXREaXN0cmlidXRhYmxlKCB0cnVlKSIpOworICAgICAgICB9CisgICAgfQorCit9CisKKworLyoqCisgKiBDbGFzcyB0aGF0IGNhbGxzIGEgcHJvcGVydHkgc2V0dGVyIGZvciB0aGUgdG9wIG9iamVjdCBvbiB0aGUgc3RhY2ssCisgKiBwYXNzaW5nIHRoZSBwdWJsaWMgSUQgb2YgdGhlIGVudGl0eSB3ZSBhcmUgY3VycmVudGx5IHByb2Nlc3NpbmcuCisgKi8KKworZmluYWwgY2xhc3MgU2V0UHVibGljSWRSdWxlIGV4dGVuZHMgUnVsZSB7CisKKyAgICBwdWJsaWMgU2V0UHVibGljSWRSdWxlKFN0cmluZyBtZXRob2QpIHsKKyAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kID0gbnVsbDsKKworICAgIHB1YmxpYyB2b2lkIGJlZ2luKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBkaWdlc3Rlci5wZWVrKGRpZ2VzdGVyLmdldENvdW50KCkgLSAxKTsKKyAgICAgICAgT2JqZWN0IHRvcCA9IGRpZ2VzdGVyLnBlZWsoKTsKKyAgICAgICAgQ2xhc3MgcGFyYW1DbGFzc2VzW10gPSBuZXcgQ2xhc3NbMV07CisgICAgICAgIHBhcmFtQ2xhc3Nlc1swXSA9ICJTdHJpbmciLmdldENsYXNzKCk7CisgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgcGFyYW1WYWx1ZXNbMF0gPSBkaWdlc3Rlci5nZXRQdWJsaWNJZCgpOworCisgICAgICAgIE1ldGhvZCBtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG0gPSB0b3AuZ2V0Q2xhc3MoKS5nZXRNZXRob2QobWV0aG9kLCBwYXJhbUNsYXNzZXMpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZGlnZXN0ZXIuZ2V0TG9nZ2VyKCkuZXJyb3IoIkNhbid0IGZpbmQgbWV0aG9kICIgKyBtZXRob2QgKyAiIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdG9wICsgIiBDTEFTUyAiICsgdG9wLmdldENsYXNzKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbS5pbnZva2UodG9wLCAoT2JqZWN0IFtdKXBhcmFtVmFsdWVzKTsKKyAgICAgICAgaWYgKGRpZ2VzdGVyLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBkaWdlc3Rlci5nZXRMb2dnZXIoKS5kZWJ1ZygiIiArIHRvcC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIuIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWV0aG9kICsgIigiICsgcGFyYW1WYWx1ZXNbMF0gKyAiKSIpOworCisgICAgfQorCit9CisKKworLyoqCisgKiBBIFJ1bGUgdGhhdCBjYWxscyB0aGUgZmFjdG9yeSBtZXRob2Qgb24gdGhlIHNwZWNpZmllZCBDb250ZXh0IHRvCisgKiBjcmVhdGUgdGhlIG9iamVjdCB0aGF0IGlzIHRvIGJlIGFkZGVkIHRvIHRoZSBzdGFjay4KKyAqLworCitmaW5hbCBjbGFzcyBXcmFwcGVyQ3JlYXRlUnVsZSBleHRlbmRzIFJ1bGUgeworCisgICAgcHVibGljIFdyYXBwZXJDcmVhdGVSdWxlKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZ2luKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb250ZXh0IGNvbnRleHQgPQorICAgICAgICAgICAgKENvbnRleHQpIGRpZ2VzdGVyLnBlZWsoZGlnZXN0ZXIuZ2V0Q291bnQoKSAtIDEpOworICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSBjb250ZXh0LmNyZWF0ZVdyYXBwZXIoKTsKKyAgICAgICAgZGlnZXN0ZXIucHVzaCh3cmFwcGVyKTsKKyAgICAgICAgaWYgKGRpZ2VzdGVyLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBkaWdlc3Rlci5nZXRMb2dnZXIoKS5kZWJ1ZygibmV3ICIgKyB3cmFwcGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSAoV3JhcHBlcikgZGlnZXN0ZXIucG9wKCk7CisgICAgICAgIGlmIChkaWdlc3Rlci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgZGlnZXN0ZXIuZ2V0TG9nZ2VyKCkuZGVidWcoInBvcCAiICsgd3JhcHBlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9jYXRhbGluYS5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvY2F0YWxpbmEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTdlYjkxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvY2F0YWxpbmEucHJvcGVydGllcwpAQCAtMCwwICsxLDY2IEBACisjCisjIExpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHBhY2thZ2VzIHRoYXQgc3RhcnQgd2l0aCBvciBlcXVhbCB0aGlzIHN0cmluZworIyB3aWxsIGNhdXNlIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuCisjIHBhc3NlZCB0byBjaGVja1BhY2thZ2VBY2Nlc3MgdW5sZXNzIHRoZQorIyBjb3JyZXNwb25kaW5nIFJ1bnRpbWVQZXJtaXNzaW9uICgiYWNjZXNzQ2xhc3NJblBhY2thZ2UuIitwYWNrYWdlKSBoYXMKKyMgYmVlbiBncmFudGVkLgorcGFja2FnZS5hY2Nlc3M9c3VuLixvcmcuYXBhY2hlLmNhdGFsaW5hLixvcmcuYXBhY2hlLmNveW90ZS4sb3JnLmFwYWNoZS50b21jYXQuLG9yZy5hcGFjaGUuamFzcGVyLixzdW4uYmVhbnMuCisjCisjIExpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHBhY2thZ2VzIHRoYXQgc3RhcnQgd2l0aCBvciBlcXVhbCB0aGlzIHN0cmluZworIyB3aWxsIGNhdXNlIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuCisjIHBhc3NlZCB0byBjaGVja1BhY2thZ2VEZWZpbml0aW9uIHVubGVzcyB0aGUKKyMgY29ycmVzcG9uZGluZyBSdW50aW1lUGVybWlzc2lvbiAoImRlZmluZUNsYXNzSW5QYWNrYWdlLiIrcGFja2FnZSkgaGFzCisjIGJlZW4gZ3JhbnRlZC4KKyMKKyMgYnkgZGVmYXVsdCwgbm8gcGFja2FnZXMgYXJlIHJlc3RyaWN0ZWQgZm9yIGRlZmluaXRpb24sIGFuZCBub25lIG9mCisjIHRoZSBjbGFzcyBsb2FkZXJzIHN1cHBsaWVkIHdpdGggdGhlIEpESyBjYWxsIGNoZWNrUGFja2FnZURlZmluaXRpb24uCisjCitwYWNrYWdlLmRlZmluaXRpb249c3VuLixqYXZhLixvcmcuYXBhY2hlLmNhdGFsaW5hLixvcmcuYXBhY2hlLmNveW90ZS4sb3JnLmFwYWNoZS50b21jYXQuLG9yZy5hcGFjaGUuamFzcGVyLgorCisjCisjCisjIExpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHBhdGhzIGRlZmluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgImNvbW1vbiIgCisjIGNsYXNzbG9hZGVyLiBQcmVmaXhlcyBzaG91bGQgYmUgdXNlZCB0byBkZWZpbmUgd2hhdCBpcyB0aGUgcmVwb3NpdG9yeSB0eXBlLgorIyBQYXRoIG1heSBiZSByZWxhdGl2ZSB0byB0aGUgQ0FUQUxJTkFfSE9NRSBvciBDQVRBTElOQV9CQVNFIHBhdGggb3IgYWJzb2x1dGUuCisjIElmIGxlZnQgYXMgYmxhbmssdGhlIEpWTSBzeXN0ZW0gbG9hZGVyIHdpbGwgYmUgdXNlZCBhcyBDYXRhbGluYSdzICJjb21tb24iIAorIyBsb2FkZXIuCisjIEV4YW1wbGVzOgorIyAgICAgImZvbyI6IEFkZCB0aGlzIGZvbGRlciBhcyBhIGNsYXNzIHJlcG9zaXRvcnkKKyMgICAgICJmb28vKi5qYXIiOiBBZGQgYWxsIHRoZSBKQVJzIG9mIHRoZSBzcGVjaWZpZWQgZm9sZGVyIGFzIGNsYXNzIAorIyAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcmllcworIyAgICAgImZvby9iYXIuamFyIjogQWRkIGJhci5qYXIgYXMgYSBjbGFzcyByZXBvc2l0b3J5Citjb21tb24ubG9hZGVyPSR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2NsYXNzZXMsJHtjYXRhbGluYS5ob21lfS9jb21tb24vaTE4bi8qLmphciwke2NhdGFsaW5hLmhvbWV9L2NvbW1vbi9lbmRvcnNlZC8qLmphciwke2NhdGFsaW5hLmhvbWV9L2NvbW1vbi9saWIvKi5qYXIKKworIworIyBMaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBwYXRocyBkZWZpbmluZyB0aGUgY29udGVudHMgb2YgdGhlICJzZXJ2ZXIiIAorIyBjbGFzc2xvYWRlci4gUHJlZml4ZXMgc2hvdWxkIGJlIHVzZWQgdG8gZGVmaW5lIHdoYXQgaXMgdGhlIHJlcG9zaXRvcnkgdHlwZS4KKyMgUGF0aCBtYXkgYmUgcmVsYXRpdmUgdG8gdGhlIENBVEFMSU5BX0hPTUUgb3IgQ0FUQUxJTkFfQkFTRSBwYXRoIG9yIGFic29sdXRlLgorIyBJZiBsZWZ0IGFzIGJsYW5rLCB0aGUgImNvbW1vbiIgbG9hZGVyIHdpbGwgYmUgdXNlZCBhcyBDYXRhbGluYSdzICJzZXJ2ZXIiIAorIyBsb2FkZXIuCisjIEV4YW1wbGVzOgorIyAgICAgImZvbyI6IEFkZCB0aGlzIGZvbGRlciBhcyBhIGNsYXNzIHJlcG9zaXRvcnkKKyMgICAgICJmb28vKi5qYXIiOiBBZGQgYWxsIHRoZSBKQVJzIG9mIHRoZSBzcGVjaWZpZWQgZm9sZGVyIGFzIGNsYXNzIAorIyAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcmllcworIyAgICAgImZvby9iYXIuamFyIjogQWRkIGJhci5qYXIgYXMgYSBjbGFzcyByZXBvc2l0b3J5CitzZXJ2ZXIubG9hZGVyPSR7Y2F0YWxpbmEuaG9tZX0vc2VydmVyL2NsYXNzZXMsJHtjYXRhbGluYS5ob21lfS9zZXJ2ZXIvbGliLyouamFyCisKKyMKKyMgTGlzdCBvZiBjb21tYS1zZXBhcmF0ZWQgcGF0aHMgZGVmaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSAic2hhcmVkIiAKKyMgY2xhc3Nsb2FkZXIuIFByZWZpeGVzIHNob3VsZCBiZSB1c2VkIHRvIGRlZmluZSB3aGF0IGlzIHRoZSByZXBvc2l0b3J5IHR5cGUuCisjIFBhdGggbWF5IGJlIHJlbGF0aXZlIHRvIHRoZSBDQVRBTElOQV9CQVNFIHBhdGggb3IgYWJzb2x1dGUuIElmIGxlZnQgYXMgYmxhbmssCisjIHRoZSAiY29tbW9uIiBsb2FkZXIgd2lsbCBiZSB1c2VkIGFzIENhdGFsaW5hJ3MgInNoYXJlZCIgbG9hZGVyLgorIyBFeGFtcGxlczoKKyMgICAgICJmb28iOiBBZGQgdGhpcyBmb2xkZXIgYXMgYSBjbGFzcyByZXBvc2l0b3J5CisjICAgICAiZm9vLyouamFyIjogQWRkIGFsbCB0aGUgSkFScyBvZiB0aGUgc3BlY2lmaWVkIGZvbGRlciBhcyBjbGFzcyAKKyMgICAgICAgICAgICAgICAgICByZXBvc2l0b3JpZXMKKyMgICAgICJmb28vYmFyLmphciI6IEFkZCBiYXIuamFyIGFzIGEgY2xhc3MgcmVwb3NpdG9yeSAKKyMgUGxlYXNlIG5vdGUgdGhhdCBmb3Igc2luZ2xlIGphcnMsIGUuZy4gYmFyLmphciwgeW91IG5lZWQgdGhlIFVSTCBmb3JtCisjIHN0YXJ0aW5nIHdpdGggZmlsZTouCitzaGFyZWQubG9hZGVyPSR7Y2F0YWxpbmEuYmFzZX0vc2hhcmVkL2NsYXNzZXMsJHtjYXRhbGluYS5iYXNlfS9zaGFyZWQvbGliLyouamFyCisKKyMKKyMgU3RyaW5nIGNhY2hlIGNvbmZpZ3VyYXRpb24uCit0b21jYXQudXRpbC5idWYuU3RyaW5nQ2FjaGUuYnl0ZS5lbmFibGVkPXRydWUKKyN0b21jYXQudXRpbC5idWYuU3RyaW5nQ2FjaGUuY2hhci5lbmFibGVkPXRydWUKKyN0b21jYXQudXRpbC5idWYuU3RyaW5nQ2FjaGUudHJhaW5UaHJlc2hvbGQ9NTAwMDAwCisjdG9tY2F0LnV0aWwuYnVmLlN0cmluZ0NhY2hlLmNhY2hlU2l6ZT01MDAwCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTBiY2NiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApAQCAtMCwwICsxLDEyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8bWJlYW5zLWRlc2NyaXB0b3JzPgorCisgIDxtYmVhbiBuYW1lPSJDb250ZXh0Q29uZmlnIgorICAgICAgICAgZGVzY3JpcHRpb249IlN0YXJ0dXAgZXZlbnQgbGlzdGVuZXIgZm9yIGEgQ29udGV4dCB0aGF0IGNvbmZpZ3VyZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhhdCBDb250ZXh0LCBhbmQgdGhlIGFzc29jaWF0ZWQgZGVmaW5lZCBzZXJ2bGV0cyIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iTGlzdGVuZXIiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQ29udGV4dENvbmZpZyI+CisgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICAgIAorICA8L21iZWFuPgorCisgIDxtYmVhbiBuYW1lPSJFbmdpbmVDb25maWciCisgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhcnR1cCBldmVudCBsaXN0ZW5lciBmb3IgYSBFbmdpbmUgdGhhdCBjb25maWd1cmVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoYXQgRW5naW5lLCBhbmQgdGhlIGFzc29jaWF0ZWQgZGVmaW5lZCBjb250ZXh0cyIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iTGlzdGVuZXIiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuRW5naW5lQ29uZmlnIj4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgICAKKyAgPC9tYmVhbj4KKworCisgIDxtYmVhbiBuYW1lPSJIb3N0Q29uZmlnIgorICAgICAgICAgZGVzY3JpcHRpb249IlN0YXJ0dXAgZXZlbnQgbGlzdGVuZXIgZm9yIGEgSG9zdCB0aGF0IGNvbmZpZ3VyZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhhdCBIb3N0LCBhbmQgdGhlIGFzc29jaWF0ZWQgZGVmaW5lZCBjb250ZXh0cyIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iTGlzdGVuZXIiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuSG9zdENvbmZpZyI+CisgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29uZmlnQmFzZU5hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGJhc2UgZGlyZWN0b3J5IGZvciBDb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZXMiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29uZmlnQ2xhc3MiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgQ29udGV4dCBjb25maWd1cmF0aW9uIGNsYXNzIHdlIHNob3VsZCB1c2UiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRleHRDbGFzcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBDb250ZXh0IGltcGxlbWVudGF0aW9uIHdlIHNob3VsZCB1c2UiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8b3BlcmF0aW9uIG5hbWU9ImNoZWNrIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkNoZWNrIGEgd2ViIGFwcGxpY2F0aW9uIG5hbWUgZm9yIHVwZGF0ZXMiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJuYW1lIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQXBwbGljYXRpb24gbmFtZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRTZXJ2aWNlZCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBZGQgYSB3ZWIgYXBwbGljYXRpb24gbmFtZSB0byB0aGUgc2VydmljZWQgbGlzdCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Im5hbWUiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBcHBsaWNhdGlvbiBuYW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uIG5hbWU9ImlzU2VydmljZWQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQWRkIGEgd2ViIGFwcGxpY2F0aW9uIG5hbWUgdG8gdGhlIHNlcnZpY2VkIGxpc3QiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9ImJvb2xlYW4iPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJuYW1lIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQXBwbGljYXRpb24gbmFtZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiBuYW1lPSJpc0RlcGxveWVkIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IldhcyB0aGlzIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3llZCBieSB0aGlzIGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0iYm9vbGVhbiI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Im5hbWUiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBcHBsaWNhdGlvbiBuYW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uIG5hbWU9Im1hbmFnZUFwcCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBZGQgYSB3ZWIgYXBwbGljYXRpb24gbWFuYWdlZCBleHRlcm5hbGx5IgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkNvbnRleHQgdG8gYWRkIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQiIC8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uIG5hbWU9InJlbW92ZVNlcnZpY2VkIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkFkZCBhIHdlYiBhcHBsaWNhdGlvbiBuYW1lIHRvIHRoZSBzZXJ2aWNlZCBsaXN0IgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkFwcGxpY2F0aW9uIG5hbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gbmFtZT0idW5tYW5hZ2VBcHAiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIGEgd2ViIGFwcGxpY2F0aW9uIGZyb20gY2hlY2tzIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFBhdGgiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgYXBwbGljYXRpb24gcGF0aCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgLz4KKyAgICA8L29wZXJhdGlvbj4KKworICA8L21iZWFuPgorCis8L21iZWFucy1kZXNjcmlwdG9ycz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9BYnN0cmFjdEdyb3VwLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvQWJzdHJhY3RHcm91cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MWMzYTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvQWJzdHJhY3RHcm91cC5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnM7CisKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Sb2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlOworCisKKy8qKgorICogPHA+Q29udmVuaWVuY2UgYmFzZSBjbGFzcyBmb3Ige0BsaW5rIEdyb3VwfSBpbXBsZW1lbnRhdGlvbnMuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RHcm91cCBpbXBsZW1lbnRzIEdyb3VwIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGdyb3VwLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZ3JvdXAgbmFtZSBvZiB0aGlzIGdyb3VwLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ3JvdXBuYW1lID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5kZXNjcmlwdGlvbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBncm91cC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgbmV3IGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGdyb3VwIG5hbWUgb2YgdGhpcyBncm91cCwgd2hpY2ggbXVzdCBiZSB1bmlxdWUKKyAgICAgKiB3aXRoaW4gdGhlIHNjb3BlIG9mIGEge0BsaW5rIFVzZXJEYXRhYmFzZX0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRHcm91cG5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmdyb3VwbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ3JvdXAgbmFtZSBvZiB0aGlzIGdyb3VwLCB3aGljaCBtdXN0IGJlIHVuaXF1ZQorICAgICAqIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSB7QGxpbmsgVXNlckRhdGFiYXNlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cG5hbWUgVGhlIG5ldyBncm91cCBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXBuYW1lKFN0cmluZyBncm91cG5hbWUpIHsKKworICAgICAgICB0aGlzLmdyb3VwbmFtZSA9IGdyb3VwbmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIFJvbGV9cyBhc3NpZ25lZCBzcGVjaWZpY2FsbHkgdG8gdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgSXRlcmF0b3IgZ2V0Um9sZXMoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgVXNlckRhdGFiYXNlfSB3aXRoaW4gd2hpY2ggdGhpcyBHcm91cCBpcyBkZWZpbmVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBVc2VyRGF0YWJhc2UgZ2V0VXNlckRhdGFiYXNlKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBJdGVyYXRvciBvdmVyIHRoZSBzZXQgb2Yge0BsaW5rIG9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlcn1zIHRoYXQgCisgICAgICogYXJlIG1lbWJlcnMgb2YgdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgSXRlcmF0b3IgZ2V0VXNlcnMoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyB7QGxpbmsgUm9sZX0gdG8gdGhvc2UgYXNzaWduZWQgc3BlY2lmaWNhbGx5IHRvIHRoaXMgZ3JvdXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBUaGUgbmV3IHJvbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRSb2xlKFJvbGUgcm9sZSk7CisKKworICAgIC8qKgorICAgICAqIElzIHRoaXMgZ3JvdXAgc3BlY2lmaWNhbGx5IGFzc2lnbmVkIHRoZSBzcGVjaWZpZWQge0BsaW5rIFJvbGV9PworICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgVGhlIHJvbGUgdG8gY2hlY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0luUm9sZShSb2xlIHJvbGUpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB7QGxpbmsgUm9sZX0gZnJvbSB0aG9zZSBhc3NpZ25lZCB0byB0aGlzIGdyb3VwLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgVGhlIG9sZCByb2xlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlUm9sZShSb2xlIHJvbGUpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIHtAbGluayBSb2xlfXMgZnJvbSB0aG9zZSBhc3NpZ25lZCB0byB0aGlzIGdyb3VwLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZVJvbGVzKCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcmluY2lwYWwgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBNYWtlIHRoZSBwcmluY2lwYWwgbmFtZSB0aGUgc2FtZSBhcyB0aGUgZ3JvdXAgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIChnZXRHcm91cG5hbWUoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0Fic3RyYWN0Um9sZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0Fic3RyYWN0Um9sZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYWE4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvQWJzdHJhY3RSb2xlLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51c2VyczsKKworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Sb2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlOworCisKKy8qKgorICogPHA+Q29udmVuaWVuY2UgYmFzZSBjbGFzcyBmb3Ige0BsaW5rIFJvbGV9IGltcGxlbWVudGF0aW9ucy48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJvbGUgaW1wbGVtZW50cyBSb2xlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIFJvbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSByb2xlIG5hbWUgb2YgdGhpcyBSb2xlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcm9sZW5hbWUgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHJvbGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZGVzY3JpcHRpb24pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcm9sZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgbmV3IGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJvbGUgbmFtZSBvZiB0aGlzIHJvbGUsIHdoaWNoIG11c3QgYmUgdW5pcXVlCisgICAgICogd2l0aGluIHRoZSBzY29wZSBvZiBhIHtAbGluayBVc2VyRGF0YWJhc2V9LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZW5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJvbGVuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByb2xlIG5hbWUgb2YgdGhpcyByb2xlLCB3aGljaCBtdXN0IGJlIHVuaXF1ZQorICAgICAqIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSB7QGxpbmsgVXNlckRhdGFiYXNlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlbmFtZSBUaGUgbmV3IHJvbGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVuYW1lKFN0cmluZyByb2xlbmFtZSkgeworCisgICAgICAgIHRoaXMucm9sZW5hbWUgPSByb2xlbmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgVXNlckRhdGFiYXNlfSB3aXRoaW4gd2hpY2ggdGhpcyBSb2xlIGlzIGRlZmluZWQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFVzZXJEYXRhYmFzZSBnZXRVc2VyRGF0YWJhc2UoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcmluY2lwYWwgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBNYWtlIHRoZSBwcmluY2lwYWwgbmFtZSB0aGUgc2FtZSBhcyB0aGUgcm9sZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKGdldFJvbGVuYW1lKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9BYnN0cmFjdFVzZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9BYnN0cmFjdFVzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmM0ZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0Fic3RyYWN0VXNlci5qYXZhCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnM7CisKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUm9sZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXI7CisKKworLyoqCisgKiA8cD5Db252ZW5pZW5jZSBiYXNlIGNsYXNzIGZvciB7QGxpbmsgVXNlcn0gaW1wbGVtZW50YXRpb25zLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VXNlciBpbXBsZW1lbnRzIFVzZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBmdWxsTmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBsb2dvbiBwYXNzd29yZCBvZiB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBsb2dvbiB1c2VybmFtZSBvZiB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB1c2VybmFtZSA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZnVsbE5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHVzZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnVsbE5hbWUgVGhlIG5ldyBmdWxsIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGdWxsTmFtZShTdHJpbmcgZnVsbE5hbWUpIHsKKworICAgICAgICB0aGlzLmZ1bGxOYW1lID0gZnVsbE5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIHtAbGluayBHcm91cH1zIHRvIHdoaWNoIHRoaXMgdXNlciBiZWxvbmdzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBJdGVyYXRvciBnZXRHcm91cHMoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2dvbiBwYXNzd29yZCBvZiB0aGlzIHVzZXIsIG9wdGlvbmFsbHkgcHJlZml4ZWQgd2l0aCB0aGUKKyAgICAgKiBpZGVudGlmaWVyIG9mIGFuIGVuY29kaW5nIHNjaGVtZSBzdXJyb3VuZGVkIGJ5IGN1cmx5IGJyYWNlcywgc3VjaCBhcworICAgICAqIDxjb2RlPnttZDV9eHh4eHg8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhc3N3b3JkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2dvbiBwYXNzd29yZCBvZiB0aGlzIHVzZXIsIG9wdGlvbmFsbHkgcHJlZml4ZWQgd2l0aCB0aGUKKyAgICAgKiBpZGVudGlmaWVyIG9mIGFuIGVuY29kaW5nIHNjaGVtZSBzdXJyb3VuZGVkIGJ5IGN1cmx5IGJyYWNlcywgc3VjaCBhcworICAgICAqIDxjb2RlPnttZDV9eHh4eHg8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHBhc3N3b3JkIFRoZSBuZXcgbG9nb24gcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKKworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIHtAbGluayBSb2xlfXMgYXNzaWduZWQgc3BlY2lmaWNhbGx5IHRvIHRoaXMgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgSXRlcmF0b3IgZ2V0Um9sZXMoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2dvbiB1c2VybmFtZSBvZiB0aGlzIHVzZXIsIHdoaWNoIG11c3QgYmUgdW5pcXVlCisgICAgICogd2l0aGluIHRoZSBzY29wZSBvZiBhIHtAbGluayBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZX0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMudXNlcm5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvZ29uIHVzZXJuYW1lIG9mIHRoaXMgdXNlciwgd2hpY2ggbXVzdCBiZSB1bmlxdWUgd2l0aGluCisgICAgICogdGhlIHNjb3BlIG9mIGEge0BsaW5rIG9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBUaGUgbmV3IGxvZ29uIHVzZXJuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlcm5hbWUoU3RyaW5nIHVzZXJuYW1lKSB7CisKKyAgICAgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHtAbGluayBHcm91cH0gdG8gdGhvc2UgdGhpcyB1c2VyIGJlbG9uZ3MgdG8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXAgVGhlIG5ldyBncm91cAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZEdyb3VwKEdyb3VwIGdyb3VwKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHtAbGluayBSb2xlfSB0byB0aG9zZSBhc3NpZ25lZCBzcGVjaWZpY2FsbHkgdG8gdGhpcyB1c2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgVGhlIG5ldyByb2xlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkUm9sZShSb2xlIHJvbGUpOworCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIHVzZXIgaW4gdGhlIHNwZWNpZmllZCB7QGxpbmsgR3JvdXB9PworICAgICAqCisgICAgICogQHBhcmFtIGdyb3VwIFRoZSBncm91cCB0byBjaGVjaworICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzSW5Hcm91cChHcm91cCBncm91cCk7CisKKworICAgIC8qKgorICAgICAqIElzIHRoaXMgdXNlciBzcGVjaWZpY2FsbHkgYXNzaWduZWQgdGhlIHNwZWNpZmllZCB7QGxpbmsgUm9sZX0/ICBUaGlzCisgICAgICogbWV0aG9kIGRvZXMgPHN0cm9uZz5OT1Q8L3N0cm9uZz4gY2hlY2sgZm9yIHJvbGVzIGluaGVyaXRlZCBiYXNlZCBvbgorICAgICAqIHtAbGluayBHcm91cH0gbWVtYmVyc2hpcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFRoZSByb2xlIHRvIGNoZWNrCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNJblJvbGUoUm9sZSByb2xlKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEge0BsaW5rIEdyb3VwfSBmcm9tIHRob3NlIHRoaXMgdXNlciBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHBhcmFtIGdyb3VwIFRoZSBvbGQgZ3JvdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVHcm91cChHcm91cCBncm91cCk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbGwge0BsaW5rIEdyb3VwfXMgZnJvbSB0aG9zZSB0aGlzIHVzZXIgYmVsb25ncyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVHcm91cHMoKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEge0BsaW5rIFJvbGV9IGZyb20gdGhvc2UgYXNzaWduZWQgdG8gdGhpcyB1c2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgVGhlIG9sZCByb2xlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlUm9sZShSb2xlIHJvbGUpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIHtAbGluayBSb2xlfXMgZnJvbSB0aG9zZSBhc3NpZ25lZCB0byB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlUm9sZXMoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaW5jaXBhbCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIE1ha2UgdGhlIHByaW5jaXBhbCBuYW1lIHRoZSBzYW1lIGFzIHRoZSBncm91cCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKGdldFVzZXJuYW1lKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9Db25zdGFudHMuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGIzNDg3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51c2VyczsKKworCisvKioKKyAqIE1hbmlmZXN0IGNvbnN0YW50cyBmb3IgdGhpcyBKYXZhIHBhY2thZ2UuCisgKgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhY2thZ2UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS51c2VycyI7CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzhjMGM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorbWVtb3J5VXNlckRhdGFiYXNlLmludmFsaWRHcm91cD1JbnZhbGlkIGdyb3VwIG5hbWUgezB9CittZW1vcnlVc2VyRGF0YWJhc2UucmVuYW1lT2xkPUNhbm5vdCByZW5hbWUgb3JpZ2luYWwgZmlsZSB0byB7MH0KK21lbW9yeVVzZXJEYXRhYmFzZS5yZW5hbWVOZXc9Q2Fubm90IHJlbmFtZSBuZXcgZmlsZSB0byB7MH0KK21lbW9yeVVzZXJEYXRhYmFzZS53cml0ZUV4Y2VwdGlvbj1JT0V4Y2VwdGlvbiB3cml0aW5nIHRvIHswfQorbWVtb3J5VXNlckRhdGFiYXNlLm5vdFBlcnNpc3RhYmxlPVVzZXIgZGF0YWJhc2UgaXMgbm90IHBlcnNpc3RhYmxlIC0gbm8gd3JpdGUgcGVybWlzc2lvbnMgb24gZGlyZWN0b3J5CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxZTZmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDQgQEAKK21lbW9yeVVzZXJEYXRhYmFzZS5pbnZhbGlkR3JvdXA9Tm9tYnJlIGRlIGdydXBvIHswfSBpbnbhbGlkbworbWVtb3J5VXNlckRhdGFiYXNlLnJlbmFtZU9sZD1JbXBvc2libGUgZGUgcmVub21icmFyIGVsIGFyY2hpdm8gb3JpZ2luYWwgYSB7MH0KK21lbW9yeVVzZXJEYXRhYmFzZS5yZW5hbWVOZXc9SW1wb3NpYmxlIGRlIHJlbm9tYnJhciBlbCBhcmNoaXZvIG51ZXZvIGEgezB9CittZW1vcnlVc2VyRGF0YWJhc2Uud3JpdGVFeGNlcHRpb249SU9FeGNlcHRpb24gZHVyYW50ZSBsYSBlc2NyaXR1cmEgaGFjaWEgezB9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyODcyOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpAQCAtMCwwICsxLDQgQEAKK21lbW9yeVVzZXJEYXRhYmFzZS5pbnZhbGlkR3JvdXA9Tm9tIGRlIGdyb3VwZSBpbnZhbGlkZSB7MH0KK21lbW9yeVVzZXJEYXRhYmFzZS5yZW5hbWVPbGQ9SW1wb3NzaWJsZSBkZSByZW5vbW1lciBsZSBmaWNoaWVyIG9yaWdpbmFsIGVuIHswfQorbWVtb3J5VXNlckRhdGFiYXNlLnJlbmFtZU5ldz1JbXBvc3NpYmxlIGRlIHJlbm9tbWVyIGxlIG5vdXZlYXUgZmljaGllciBlbiB7MH0KK21lbW9yeVVzZXJEYXRhYmFzZS53cml0ZUV4Y2VwdGlvbj1JT0V4Y2VwdGlvbiBsb3JzIGRlIGwnJ+ljcml0dXJlIHZlcnMgezB9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlOTZlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpAQCAtMCwwICsxLDQgQEAKK21lbW9yeVVzZXJEYXRhYmFzZS5pbnZhbGlkR3JvdXA9XHU3MTIxXHU1MmI5XHUzMDZhXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHU1NDBkIHswfQorbWVtb3J5VXNlckRhdGFiYXNlLnJlbmFtZU9sZD1cdTUxNDNcdTMwNmVcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTU0MGRcdTMwOTIgezB9IFx1MzA2Ylx1NTkwOVx1NjZmNFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworbWVtb3J5VXNlckRhdGFiYXNlLnJlbmFtZU5ldz1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTU0MGRcdTMwOTIgezB9IFx1MzA2Ylx1NTkwOVx1NjZmNFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworbWVtb3J5VXNlckRhdGFiYXNlLndyaXRlRXhjZXB0aW9uPXswfSBcdTMwNmJcdTY2ZjhcdTMwNGRcdThmYmNcdTMwN2ZcdTRlMmRcdTMwNmVJT0V4Y2VwdGlvblx1MzA2N1x1MzA1OQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL01lbW9yeUdyb3VwLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvTWVtb3J5R3JvdXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGQ3YzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL01lbW9yeUdyb3VwLmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51c2VyczsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlJvbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2U7CisKKworLyoqCisgKiA8cD5Db25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmFwYWNoZS5jYXRhbGluYS5Hcm91cH0gZm9yIHRoZQorICoge0BsaW5rIE1lbW9yeVVzZXJEYXRhYmFzZX0gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFVzZXJEYXRhYmFzZX0uPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgY2xhc3MgTWVtb3J5R3JvdXAgZXh0ZW5kcyBBYnN0cmFjdEdyb3VwIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIFBhY2thZ2UtcHJpdmF0ZSBjb25zdHJ1Y3RvciB1c2VkIGJ5IHRoZSBmYWN0b3J5IG1ldGhvZCBpbgorICAgICAqIHtAbGluayBNZW1vcnlVc2VyRGF0YWJhc2V9LgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGFiYXNlIFRoZSB7QGxpbmsgTWVtb3J5VXNlckRhdGFiYXNlfSB0aGF0IG93bnMgdGhpcyBncm91cAorICAgICAqIEBwYXJhbSBncm91cG5hbWUgR3JvdXAgbmFtZSBvZiB0aGlzIGdyb3VwCisgICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoaXMgZ3JvdXAKKyAgICAgKi8KKyAgICBNZW1vcnlHcm91cChNZW1vcnlVc2VyRGF0YWJhc2UgZGF0YWJhc2UsCisgICAgICAgICAgICAgICAgU3RyaW5nIGdyb3VwbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5kYXRhYmFzZSA9IGRhdGFiYXNlOworICAgICAgICBzZXRHcm91cG5hbWUoZ3JvdXBuYW1lKTsKKyAgICAgICAgc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBNZW1vcnlVc2VyRGF0YWJhc2V9IHRoYXQgb3ducyB0aGlzIGdyb3VwLgorICAgICAqLworICAgIHByb3RlY3RlZCBNZW1vcnlVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIHtAbGluayBSb2xlfXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZ3JvdXAuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIHtAbGluayBSb2xlfXMgYXNzaWduZWQgc3BlY2lmaWNhbGx5IHRvIHRoaXMgZ3JvdXAuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGdldFJvbGVzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocm9sZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAocm9sZXMuaXRlcmF0b3IoKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgVXNlckRhdGFiYXNlfSB3aXRoaW4gd2hpY2ggdGhpcyBHcm91cCBpcyBkZWZpbmVkLgorICAgICAqLworICAgIHB1YmxpYyBVc2VyRGF0YWJhc2UgZ2V0VXNlckRhdGFiYXNlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5kYXRhYmFzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIHtAbGluayBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJ9cyB0aGF0IGFyZSBtZW1iZXJzIG9mIHRoaXMgZ3JvdXAuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGdldFVzZXJzKCkgeworCisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciB1c2VycyA9IGRhdGFiYXNlLmdldFVzZXJzKCk7CisgICAgICAgIHdoaWxlICh1c2Vycy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIE1lbW9yeVVzZXIgdXNlciA9IChNZW1vcnlVc2VyKSB1c2Vycy5uZXh0KCk7CisgICAgICAgICAgICBpZiAodXNlci5pc0luR3JvdXAodGhpcykpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZCh1c2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHJlc3VsdHMuaXRlcmF0b3IoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcge0BsaW5rIFJvbGV9IHRvIHRob3NlIGFzc2lnbmVkIHNwZWNpZmljYWxseSB0byB0aGlzIGdyb3VwLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgVGhlIG5ldyByb2xlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUm9sZShSb2xlIHJvbGUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJvbGVzKSB7CisgICAgICAgICAgICBpZiAoIXJvbGVzLmNvbnRhaW5zKHJvbGUpKSB7CisgICAgICAgICAgICAgICAgcm9sZXMuYWRkKHJvbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElzIHRoaXMgZ3JvdXAgc3BlY2lmaWNhbGx5IGFzc2lnbmVkIHRoZSBzcGVjaWZpZWQge0BsaW5rIFJvbGV9PworICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgVGhlIHJvbGUgdG8gY2hlY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luUm9sZShSb2xlIHJvbGUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJvbGVzKSB7CisgICAgICAgICAgICByZXR1cm4gKHJvbGVzLmNvbnRhaW5zKHJvbGUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB7QGxpbmsgUm9sZX0gZnJvbSB0aG9zZSBhc3NpZ25lZCB0byB0aGlzIGdyb3VwLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgVGhlIG9sZCByb2xlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUm9sZShSb2xlIHJvbGUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJvbGVzKSB7CisgICAgICAgICAgICByb2xlcy5yZW1vdmUocm9sZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCB7QGxpbmsgUm9sZX1zIGZyb20gdGhvc2UgYXNzaWduZWQgdG8gdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSb2xlcygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJvbGVzKSB7CisgICAgICAgICAgICByb2xlcy5jbGVhcigpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIDxwPlJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGdyb3VwIGluIFhNTCBmb3JtYXQuPC9wPgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiPGdyb3VwIGdyb3VwbmFtZT1cIiIpOworICAgICAgICBzYi5hcHBlbmQoZ3JvdXBuYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcIiIpOworICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgZGVzY3JpcHRpb249XCIiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChkZXNjcmlwdGlvbik7CisgICAgICAgICAgICBzYi5hcHBlbmQoIlwiIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChyb2xlcykgeworICAgICAgICAgICAgaWYgKHJvbGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiByb2xlcz1cIiIpOworICAgICAgICAgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgICAgICAgICBJdGVyYXRvciB2YWx1ZXMgPSByb2xlcy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlICh2YWx1ZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKFN0cmluZykgKChSb2xlKSB2YWx1ZXMubmV4dCgpKS5nZXRSb2xlbmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcIiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiLz4iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvTWVtb3J5Um9sZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL01lbW9yeVJvbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzE2OTAxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL01lbW9yeVJvbGUuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZTsKKworCisvKioKKyAqIDxwPkNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuYXBhY2hlLmNhdGFsaW5hLlJvbGV9IGZvciB0aGUKKyAqIHtAbGluayBNZW1vcnlVc2VyRGF0YWJhc2V9IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBVc2VyRGF0YWJhc2V9LjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIE1lbW9yeVJvbGUgZXh0ZW5kcyBBYnN0cmFjdFJvbGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogUGFja2FnZS1wcml2YXRlIGNvbnN0cnVjdG9yIHVzZWQgYnkgdGhlIGZhY3RvcnkgbWV0aG9kIGluCisgICAgICoge0BsaW5rIE1lbW9yeVVzZXJEYXRhYmFzZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YWJhc2UgVGhlIHtAbGluayBNZW1vcnlVc2VyRGF0YWJhc2V9IHRoYXQgb3ducyB0aGlzIHJvbGUKKyAgICAgKiBAcGFyYW0gcm9sZW5hbWUgUm9sZSBuYW1lIG9mIHRoaXMgcm9sZQorICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGlzIHJvbGUKKyAgICAgKi8KKyAgICBNZW1vcnlSb2xlKE1lbW9yeVVzZXJEYXRhYmFzZSBkYXRhYmFzZSwKKyAgICAgICAgICAgICAgIFN0cmluZyByb2xlbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5kYXRhYmFzZSA9IGRhdGFiYXNlOworICAgICAgICBzZXRSb2xlbmFtZShyb2xlbmFtZSk7CisgICAgICAgIHNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgTWVtb3J5VXNlckRhdGFiYXNlfSB0aGF0IG93bnMgdGhpcyByb2xlLgorICAgICAqLworICAgIHByb3RlY3RlZCBNZW1vcnlVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgVXNlckRhdGFiYXNlfSB3aXRoaW4gd2hpY2ggdGhpcyByb2xlIGlzIGRlZmluZWQuCisgICAgICovCisgICAgcHVibGljIFVzZXJEYXRhYmFzZSBnZXRVc2VyRGF0YWJhc2UoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmRhdGFiYXNlKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIDxwPlJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHJvbGUgaW4gWE1MIGZvcm1hdC48L3A+CisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCI8cm9sZSByb2xlbmFtZT1cIiIpOworICAgICAgICBzYi5hcHBlbmQocm9sZW5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIlwiIik7CisgICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBkZXNjcmlwdGlvbj1cIiIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIi8+Iik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL01lbW9yeVVzZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9NZW1vcnlVc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3MDM1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9NZW1vcnlVc2VyLmphdmEKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51c2VyczsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUm9sZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuUmVxdWVzdFV0aWw7CisKKy8qKgorICogPHA+Q29uY3JldGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIG9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlcn0gZm9yIHRoZQorICoge0BsaW5rIE1lbW9yeVVzZXJEYXRhYmFzZX0gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFVzZXJEYXRhYmFzZX0uPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgY2xhc3MgTWVtb3J5VXNlciBleHRlbmRzIEFic3RyYWN0VXNlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBQYWNrYWdlLXByaXZhdGUgY29uc3RydWN0b3IgdXNlZCBieSB0aGUgZmFjdG9yeSBtZXRob2QgaW4KKyAgICAgKiB7QGxpbmsgTWVtb3J5VXNlckRhdGFiYXNlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhYmFzZSBUaGUge0BsaW5rIE1lbW9yeVVzZXJEYXRhYmFzZX0gdGhhdCBvd25zIHRoaXMgdXNlcgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBMb2dvbiB1c2VybmFtZSBvZiB0aGUgbmV3IHVzZXIKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgTG9nb24gcGFzc3dvcmQgb2YgdGhlIG5ldyB1c2VyCisgICAgICogQHBhcmFtIGZ1bGxOYW1lIEZ1bGwgbmFtZSBvZiB0aGUgbmV3IHVzZXIKKyAgICAgKi8KKyAgICBNZW1vcnlVc2VyKE1lbW9yeVVzZXJEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJuYW1lLAorICAgICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkLCBTdHJpbmcgZnVsbE5hbWUpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLmRhdGFiYXNlID0gZGF0YWJhc2U7CisgICAgICAgIHNldFVzZXJuYW1lKHVzZXJuYW1lKTsKKyAgICAgICAgc2V0UGFzc3dvcmQocGFzc3dvcmQpOworICAgICAgICBzZXRGdWxsTmFtZShmdWxsTmFtZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIE1lbW9yeVVzZXJEYXRhYmFzZX0gdGhhdCBvd25zIHRoaXMgdXNlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWVtb3J5VXNlckRhdGFiYXNlIGRhdGFiYXNlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiB7QGxpbmsgR3JvdXB9cyB0aGF0IHRoaXMgdXNlciBpcyBhIG1lbWJlciBvZi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IGdyb3VwcyA9IG5ldyBBcnJheUxpc3QoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiB7QGxpbmsgUm9sZX1zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIHtAbGluayBHcm91cH1zIHRvIHdoaWNoIHRoaXMgdXNlciBiZWxvbmdzLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRHcm91cHMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChncm91cHMpIHsKKyAgICAgICAgICAgIHJldHVybiAoZ3JvdXBzLml0ZXJhdG9yKCkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIHtAbGluayBSb2xlfXMgYXNzaWduZWQgc3BlY2lmaWNhbGx5IHRvIHRoaXMgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Um9sZXMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChyb2xlcykgeworICAgICAgICAgICAgcmV0dXJuIChyb2xlcy5pdGVyYXRvcigpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBVc2VyRGF0YWJhc2V9IHdpdGhpbiB3aGljaCB0aGlzIFVzZXIgaXMgZGVmaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVXNlckRhdGFiYXNlIGdldFVzZXJEYXRhYmFzZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZGF0YWJhc2UpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHtAbGluayBHcm91cH0gdG8gdGhvc2UgdGhpcyB1c2VyIGJlbG9uZ3MgdG8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXAgVGhlIG5ldyBncm91cAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEdyb3VwKEdyb3VwIGdyb3VwKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChncm91cHMpIHsKKyAgICAgICAgICAgIGlmICghZ3JvdXBzLmNvbnRhaW5zKGdyb3VwKSkgeworICAgICAgICAgICAgICAgIGdyb3Vwcy5hZGQoZ3JvdXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyB7QGxpbmsgUm9sZX0gdG8gdGhvc2UgYXNzaWduZWQgc3BlY2lmaWNhbGx5IHRvIHRoaXMgdXNlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFRoZSBuZXcgcm9sZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJvbGUoUm9sZSByb2xlKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChyb2xlcykgeworICAgICAgICAgICAgaWYgKCFyb2xlcy5jb250YWlucyhyb2xlKSkgeworICAgICAgICAgICAgICAgIHJvbGVzLmFkZChyb2xlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIHVzZXIgaW4gdGhlIHNwZWNpZmllZCBncm91cD8KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cCBUaGUgZ3JvdXAgdG8gY2hlY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luR3JvdXAoR3JvdXAgZ3JvdXApIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGdyb3VwcykgeworICAgICAgICAgICAgcmV0dXJuIChncm91cHMuY29udGFpbnMoZ3JvdXApKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIHVzZXIgc3BlY2lmaWNhbGx5IGFzc2lnbmVkIHRoZSBzcGVjaWZpZWQge0BsaW5rIFJvbGV9PyAgVGhpcworICAgICAqIG1ldGhvZCBkb2VzIDxzdHJvbmc+Tk9UPC9zdHJvbmc+IGNoZWNrIGZvciByb2xlcyBpbmhlcml0ZWQgYmFzZWQgb24KKyAgICAgKiB7QGxpbmsgR3JvdXB9IG1lbWJlcnNoaXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBUaGUgcm9sZSB0byBjaGVjaworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSW5Sb2xlKFJvbGUgcm9sZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocm9sZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAocm9sZXMuY29udGFpbnMocm9sZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHtAbGluayBHcm91cH0gZnJvbSB0aG9zZSB0aGlzIHVzZXIgYmVsb25ncyB0by4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cCBUaGUgb2xkIGdyb3VwCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlR3JvdXAoR3JvdXAgZ3JvdXApIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGdyb3VwcykgeworICAgICAgICAgICAgZ3JvdXBzLnJlbW92ZShncm91cCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCB7QGxpbmsgR3JvdXB9cyBmcm9tIHRob3NlIHRoaXMgdXNlciBiZWxvbmdzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUdyb3VwcygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGdyb3VwcykgeworICAgICAgICAgICAgZ3JvdXBzLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEge0BsaW5rIFJvbGV9IGZyb20gdGhvc2UgYXNzaWduZWQgdG8gdGhpcyB1c2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgVGhlIG9sZCByb2xlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUm9sZShSb2xlIHJvbGUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJvbGVzKSB7CisgICAgICAgICAgICByb2xlcy5yZW1vdmUocm9sZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCB7QGxpbmsgUm9sZX1zIGZyb20gdGhvc2UgYXNzaWduZWQgdG8gdGhpcyB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJvbGVzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocm9sZXMpIHsKKyAgICAgICAgICAgIHJvbGVzLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogPHA+UmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdXNlciBpbiBYTUwgZm9ybWF0LjwvcD4KKyAgICAgKgorICAgICAqIDxwPjxzdHJvbmc+SU1QTEVNRU5UQVRJT04gTk9URTwvc3Ryb25nPiAtIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwKKyAgICAgKiB0aGUgcmVhZGVyIHRoYXQgcHJvY2Vzc2VzIHRoaXMgZW50cnkgd2lsbCBhY2NlcHQgZWl0aGVyCisgICAgICogPGNvZGU+dXNlcm5hbWU8L2NvZGU+IG9yIDwvY29kZT5uYW1lPC9jb2RlPiBmb3IgdGhlIHVzZXJuYW1lCisgICAgICogcHJvcGVydHkuPC9wPgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiPHVzZXIgdXNlcm5hbWU9XCIiKTsKKyAgICAgICAgc2IuYXBwZW5kKFJlcXVlc3RVdGlsLmZpbHRlcih1c2VybmFtZSkpOworICAgICAgICBzYi5hcHBlbmQoIlwiIHBhc3N3b3JkPVwiIik7CisgICAgICAgIHNiLmFwcGVuZChSZXF1ZXN0VXRpbC5maWx0ZXIocGFzc3dvcmQpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcIiIpOworICAgICAgICBpZiAoZnVsbE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgZnVsbE5hbWU9XCIiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChSZXF1ZXN0VXRpbC5maWx0ZXIoZnVsbE5hbWUpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKGdyb3VwcykgeworICAgICAgICAgICAgaWYgKGdyb3Vwcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgZ3JvdXBzPVwiIik7CisgICAgICAgICAgICAgICAgaW50IG4gPSAwOworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHZhbHVlcyA9IGdyb3Vwcy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlICh2YWx1ZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoUmVxdWVzdFV0aWwuZmlsdGVyKCgoR3JvdXApIHZhbHVlcy5uZXh0KCkpLmdldEdyb3VwbmFtZSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKHJvbGVzKSB7CisgICAgICAgICAgICBpZiAocm9sZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHJvbGVzPVwiIik7CisgICAgICAgICAgICAgICAgaW50IG4gPSAwOworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHZhbHVlcyA9IHJvbGVzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHZhbHVlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJywnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChSZXF1ZXN0VXRpbC5maWx0ZXIoKChSb2xlKSB2YWx1ZXMubmV4dCgpKS5nZXRSb2xlbmFtZSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIi8+Iik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL01lbW9yeVVzZXJEYXRhYmFzZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL01lbW9yeVVzZXJEYXRhYmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MzdhMjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvTWVtb3J5VXNlckRhdGFiYXNlLmphdmEKQEAgLTAsMCArMSw4MDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51c2VyczsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Sb2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLkRpZ2VzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuT2JqZWN0Q3JlYXRpb25GYWN0b3J5OworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CisKKworLyoqCisgKiA8cD5Db25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgVXNlckRhdGFiYXNlfSB0aGF0IGxvYWRzIGFsbAorICogZGVmaW5lZCB1c2VycywgZ3JvdXBzLCBhbmQgcm9sZXMgaW50byBhbiBpbi1tZW1vcnkgZGF0YSBzdHJ1Y3R1cmUsCisgKiBhbmQgdXNlcyBhIHNwZWNpZmllZCBYTUwgZmlsZSBmb3IgaXRzIHBlcnNpc3RlbnQgc3RvcmFnZS48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBjbGFzcyBNZW1vcnlVc2VyRGF0YWJhc2UgaW1wbGVtZW50cyBVc2VyRGF0YWJhc2UgeworCisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWVtb3J5VXNlckRhdGFiYXNlLmNsYXNzKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtb3J5VXNlckRhdGFiYXNlKCkgeworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIFVuaXF1ZSBnbG9iYWwgaWRlbnRpZmllciBvZiB0aGlzIHVzZXIgZGF0YWJhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtb3J5VXNlckRhdGFiYXNlKFN0cmluZyBpZCkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2Yge0BsaW5rIEdyb3VwfXMgZGVmaW5lZCBpbiB0aGlzIGRhdGFiYXNlLCBrZXllZCBieQorICAgICAqIGdyb3VwIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgZ3JvdXBzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHVuaXF1ZSBnbG9iYWwgaWRlbnRpZmllciBvZiB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZWxhdGl2ZSAodG8gPGNvZGU+Y2F0YWxpbmEuYmFzZTwvY29kZT4pIG9yIGFic29sdXRlIHBhdGhuYW1lIHRvCisgICAgICogdGhlIFhNTCBmaWxlIGluIHdoaWNoIHdlIHdpbGwgc2F2ZSBvdXIgcGVyc2lzdGVudCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGhuYW1lID0gImNvbmYvdG9tY2F0LXVzZXJzLnhtbCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRobmFtZSB0byB0aGUgZmlsZSBpbiB3aGljaCBvdXIgb2xkCisgICAgICogaW5mb3JtYXRpb24gaXMgc3RvcmVkIHdoaWxlIHJlbmFtaW5nIGlzIGluIHByb2dyZXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aG5hbWVPbGQgPSBwYXRobmFtZSArICIub2xkIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhuYW1lIG90IHRoZSBmaWxlIGluIHdoaWNoIHdlIHdyaXRlCisgICAgICogb3VyIG5ldyBpbmZvcm1hdGlvbiBwcmlvciB0byByZW5hbWluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGhuYW1lTmV3ID0gcGF0aG5hbWUgKyAiLm5ldyI7CisKKworICAgIC8qKgorICAgICAqIEEgZmxhZywgaW5kaWNhdGluZyBpZiB0aGUgdXNlciBkYXRhYmFzZSBpcyByZWFkIG9ubHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZG9ubHkgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2Yge0BsaW5rIFJvbGV9cyBkZWZpbmVkIGluIHRoaXMgZGF0YWJhc2UsIGtleWVkIGJ5CisgICAgICogcm9sZSBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIHJvbGVzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2Yge0BsaW5rIFVzZXJ9cyBkZWZpbmVkIGluIHRoaXMgZGF0YWJhc2UsIGtleWVkIGJ5CisgICAgICogdXNlciBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIHVzZXJzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIHtAbGluayBHcm91cH1zIGRlZmluZWQgaW4gdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRHcm91cHMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChncm91cHMpIHsKKyAgICAgICAgICAgIHJldHVybiAoZ3JvdXBzLnZhbHVlcygpLml0ZXJhdG9yKCkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdW5pcXVlIGdsb2JhbCBpZGVudGlmaWVyIG9mIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5pZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aG5hbWUgdG8gdGhlIHBlcnNpc3RlbnQgc3RvcmFnZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhdGhuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRobmFtZSB0byB0aGUgcGVyc2lzdGVudCBzdG9yYWdlIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aG5hbWUgVGhlIG5ldyBwYXRobmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdGhuYW1lKFN0cmluZyBwYXRobmFtZSkgeworCisgICAgICAgIHRoaXMucGF0aG5hbWUgPSBwYXRobmFtZTsKKyAgICAgICAgdGhpcy5wYXRobmFtZU9sZCA9IHBhdGhuYW1lICsgIi5vbGQiOworICAgICAgICB0aGlzLnBhdGhuYW1lTmV3ID0gcGF0aG5hbWUgKyAiLm5ldyI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybmluZyB0aGUgcmVhZG9ubHkgc3RhdHVzIG9mIHRoZSB1c2VyIGRhdGFiYXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UmVhZG9ubHkoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlYWRvbmx5KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0dGluZyB0aGUgcmVhZG9ubHkgc3RhdHVzIG9mIHRoZSB1c2VyIGRhdGFiYXNlCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aG5hbWUgVGhlIG5ldyBwYXRobmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlYWRvbmx5KGJvb2xlYW4gcmVhZG9ubHkpIHsKKworICAgICAgICB0aGlzLnJlYWRvbmx5ID0gcmVhZG9ubHk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIHtAbGluayBSb2xlfXMgZGVmaW5lZCBpbiB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGdldFJvbGVzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocm9sZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAocm9sZXMudmFsdWVzKCkuaXRlcmF0b3IoKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIFVzZXJ9cyBkZWZpbmVkIGluIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0VXNlcnMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkICh1c2VycykgeworICAgICAgICAgICAgcmV0dXJuICh1c2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBGaW5hbGl6ZSBhY2Nlc3MgdG8gdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW55IGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIGNsb3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHNhdmUoKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGdyb3VwcykgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh1c2VycykgeworICAgICAgICAgICAgICAgIHVzZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgZ3JvdXBzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcge0BsaW5rIEdyb3VwfSBkZWZpbmVkIGluIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cG5hbWUgVGhlIGdyb3VwIG5hbWUgb2YgdGhlIG5ldyBncm91cCAobXVzdCBiZSB1bmlxdWUpCisgICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGdyb3VwCisgICAgICovCisgICAgcHVibGljIEdyb3VwIGNyZWF0ZUdyb3VwKFN0cmluZyBncm91cG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbikgeworCisgICAgICAgIE1lbW9yeUdyb3VwIGdyb3VwID0gbmV3IE1lbW9yeUdyb3VwKHRoaXMsIGdyb3VwbmFtZSwgZGVzY3JpcHRpb24pOworICAgICAgICBzeW5jaHJvbml6ZWQgKGdyb3VwcykgeworICAgICAgICAgICAgZ3JvdXBzLnB1dChncm91cC5nZXRHcm91cG5hbWUoKSwgZ3JvdXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoZ3JvdXApOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyB7QGxpbmsgUm9sZX0gZGVmaW5lZCBpbiB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZW5hbWUgVGhlIHJvbGUgbmFtZSBvZiB0aGUgbmV3IGdyb3VwIChtdXN0IGJlIHVuaXF1ZSkKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZ3JvdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgUm9sZSBjcmVhdGVSb2xlKFN0cmluZyByb2xlbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisKKyAgICAgICAgTWVtb3J5Um9sZSByb2xlID0gbmV3IE1lbW9yeVJvbGUodGhpcywgcm9sZW5hbWUsIGRlc2NyaXB0aW9uKTsKKyAgICAgICAgc3luY2hyb25pemVkIChyb2xlcykgeworICAgICAgICAgICAgcm9sZXMucHV0KHJvbGUuZ2V0Um9sZW5hbWUoKSwgcm9sZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChyb2xlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcge0BsaW5rIFVzZXJ9IGRlZmluZWQgaW4gdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFRoZSBsb2dvbiB1c2VybmFtZSBvZiB0aGUgbmV3IHVzZXIgKG11c3QgYmUgdW5pcXVlKQorICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgbG9nb24gcGFzc3dvcmQgb2YgdGhlIG5ldyB1c2VyCisgICAgICogQHBhcmFtIGZ1bGxOYW1lIFRoZSBmdWxsIG5hbWUgb2YgdGhlIG5ldyB1c2VyCisgICAgICovCisgICAgcHVibGljIFVzZXIgY3JlYXRlVXNlcihTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxsTmFtZSkgeworCisgICAgICAgIE1lbW9yeVVzZXIgdXNlciA9IG5ldyBNZW1vcnlVc2VyKHRoaXMsIHVzZXJuYW1lLCBwYXNzd29yZCwgZnVsbE5hbWUpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHVzZXJzKSB7CisgICAgICAgICAgICB1c2Vycy5wdXQodXNlci5nZXRVc2VybmFtZSgpLCB1c2VyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHVzZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBHcm91cH0gd2l0aCB0aGUgc3BlY2lmaWVkIGdyb3VwIG5hbWUsIGlmIGFueTsKKyAgICAgKiBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGdyb3VwbmFtZSBOYW1lIG9mIHRoZSBncm91cCB0byByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgR3JvdXAgZmluZEdyb3VwKFN0cmluZyBncm91cG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGdyb3VwcykgeworICAgICAgICAgICAgcmV0dXJuICgoR3JvdXApIGdyb3Vwcy5nZXQoZ3JvdXBuYW1lKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgUm9sZX0gd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUgbmFtZSwgaWYgYW55OworICAgICAqIG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZW5hbWUgTmFtZSBvZiB0aGUgcm9sZSB0byByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgUm9sZSBmaW5kUm9sZShTdHJpbmcgcm9sZW5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJvbGVzKSB7CisgICAgICAgICAgICByZXR1cm4gKChSb2xlKSByb2xlcy5nZXQocm9sZW5hbWUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBVc2VyfSB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlciBuYW1lLCBpZiBhbnk7CisgICAgICogb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBOYW1lIG9mIHRoZSB1c2VyIHRvIHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBVc2VyIGZpbmRVc2VyKFN0cmluZyB1c2VybmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAodXNlcnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFVzZXIpIHVzZXJzLmdldCh1c2VybmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYWNjZXNzIHRvIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFueSBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBvcGVuaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHN5bmNocm9uaXplZCAoZ3JvdXBzKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHVzZXJzKSB7CisKKyAgICAgICAgICAgICAgICAvLyBFcmFzZSBhbnkgcHJldmlvdXMgZ3JvdXBzIGFuZCB1c2VycworICAgICAgICAgICAgICAgIHVzZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgZ3JvdXBzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcm9sZXMuY2xlYXIoKTsKKworICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCBhIHJlYWRlciBmb3IgdGhlIFhNTCBpbnB1dCBmaWxlIChpZiBpdCBleGlzdHMpCisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aG5hbWUpOworICAgICAgICAgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKworICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCBhIGRpZ2VzdGVyIHRvIHJlYWQgdGhlIFhNTCBpbnB1dCBmaWxlCisgICAgICAgICAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBuZXcgRGlnZXN0ZXIoKTsKKyAgICAgICAgICAgICAgICBkaWdlc3Rlci5hZGRGYWN0b3J5Q3JlYXRlCisgICAgICAgICAgICAgICAgICAgICgidG9tY2F0LXVzZXJzL2dyb3VwIiwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBNZW1vcnlHcm91cENyZWF0aW9uRmFjdG9yeSh0aGlzKSk7CisgICAgICAgICAgICAgICAgZGlnZXN0ZXIuYWRkRmFjdG9yeUNyZWF0ZQorICAgICAgICAgICAgICAgICAgICAoInRvbWNhdC11c2Vycy9yb2xlIiwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBNZW1vcnlSb2xlQ3JlYXRpb25GYWN0b3J5KHRoaXMpKTsKKyAgICAgICAgICAgICAgICBkaWdlc3Rlci5hZGRGYWN0b3J5Q3JlYXRlCisgICAgICAgICAgICAgICAgICAgICgidG9tY2F0LXVzZXJzL3VzZXIiLAorICAgICAgICAgICAgICAgICAgICAgbmV3IE1lbW9yeVVzZXJDcmVhdGlvbkZhY3RvcnkodGhpcykpOworCisgICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIFhNTCBpbnB1dCBmaWxlIHRvIGxvYWQgdGhpcyBkYXRhYmFzZQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGRpZ2VzdGVyLnBhcnNlKGZpcyk7CisgICAgICAgICAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHtAbGluayBHcm91cH0gZnJvbSB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXAgVGhlIGdyb3VwIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cChHcm91cCBncm91cCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoZ3JvdXBzKSB7CisgICAgICAgICAgICBJdGVyYXRvciB1c2VycyA9IGdldFVzZXJzKCk7CisgICAgICAgICAgICB3aGlsZSAodXNlcnMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgVXNlciB1c2VyID0gKFVzZXIpIHVzZXJzLm5leHQoKTsKKyAgICAgICAgICAgICAgICB1c2VyLnJlbW92ZUdyb3VwKGdyb3VwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdyb3Vwcy5yZW1vdmUoZ3JvdXAuZ2V0R3JvdXBuYW1lKCkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHtAbGluayBSb2xlfSBmcm9tIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFRoZSByb2xlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSb2xlKFJvbGUgcm9sZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocm9sZXMpIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGdyb3VwcyA9IGdldEdyb3VwcygpOworICAgICAgICAgICAgd2hpbGUgKGdyb3Vwcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBHcm91cCBncm91cCA9IChHcm91cCkgZ3JvdXBzLm5leHQoKTsKKyAgICAgICAgICAgICAgICBncm91cC5yZW1vdmVSb2xlKHJvbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSXRlcmF0b3IgdXNlcnMgPSBnZXRVc2VycygpOworICAgICAgICAgICAgd2hpbGUgKHVzZXJzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFVzZXIgdXNlciA9IChVc2VyKSB1c2Vycy5uZXh0KCk7CisgICAgICAgICAgICAgICAgdXNlci5yZW1vdmVSb2xlKHJvbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcm9sZXMucmVtb3ZlKHJvbGUuZ2V0Um9sZW5hbWUoKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQge0BsaW5rIFVzZXJ9IGZyb20gdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXIgVGhlIHVzZXIgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVVzZXIoVXNlciB1c2VyKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkICh1c2VycykgeworICAgICAgICAgICAgdXNlcnMucmVtb3ZlKHVzZXIuZ2V0VXNlcm5hbWUoKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hlY2sgZm9yIHBlcm1pc3Npb25zIHRvIHNhdmUgdGhpcyB1c2VyIGRhdGFiYXNlCisgICAgICogdG8gcGVyc2lzdGVudCBzdG9yYWdlIGxvY2F0aW9uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZSgpIHsKKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRobmFtZSk7CisgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgRmlsZSBkaXIgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgcmV0dXJuIGRpci5leGlzdHMoKSAmJiBkaXIuaXNEaXJlY3RvcnkoKSAmJiBkaXIuY2FuV3JpdGUoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2F2ZSBhbnkgdXBkYXRlZCBpbmZvcm1hdGlvbiB0byB0aGUgcGVyc2lzdGVudCBzdG9yYWdlIGxvY2F0aW9uIGZvcgorICAgICAqIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFueSBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBzYXZpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGdldFJlYWRvbmx5KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNXcml0ZWFibGUoKSkgeworICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nKCJtZW1vcnlVc2VyRGF0YWJhc2Uubm90UGVyc2lzdGFibGUiKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSBvdXQgY29udGVudHMgdG8gYSB0ZW1wb3JhcnkgZmlsZQorICAgICAgICBGaWxlIGZpbGVOZXcgPSBuZXcgRmlsZShwYXRobmFtZU5ldyk7CisgICAgICAgIGlmICghZmlsZU5ldy5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgIGZpbGVOZXcgPQorICAgICAgICAgICAgICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLCBwYXRobmFtZU5ldyk7CisgICAgICAgIH0KKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gQ29uZmlndXJlIG91ciBQcmludFdyaXRlcgorICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlTmV3KTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZvcywgIlVURjgiKTsKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihvc3cpOworCisgICAgICAgICAgICAvLyBQcmludCB0aGUgZmlsZSBwcm9sb2cKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PiIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjx0b21jYXQtdXNlcnM+Iik7CisKKyAgICAgICAgICAgIC8vIFByaW50IGVudHJpZXMgZm9yIGVhY2ggZGVmaW5lZCByb2xlLCBncm91cCwgYW5kIHVzZXIKKyAgICAgICAgICAgIEl0ZXJhdG9yIHZhbHVlcyA9IG51bGw7CisgICAgICAgICAgICB2YWx1ZXMgPSBnZXRSb2xlcygpOworICAgICAgICAgICAgd2hpbGUgKHZhbHVlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiAgIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4odmFsdWVzLm5leHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZXMgPSBnZXRHcm91cHMoKTsKKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgICIpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHZhbHVlcy5uZXh0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWVzID0gZ2V0VXNlcnMoKTsKKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgICIpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHZhbHVlcy5uZXh0KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBQcmludCB0aGUgZmlsZSBlcGlsb2cKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCI8L3RvbWNhdC11c2Vycz4iKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVycm9ycyB0aGF0IG9jY3VycmVkIHdoaWxlIHByaW50aW5nCisgICAgICAgICAgICBpZiAod3JpdGVyLmNoZWNrRXJyb3IoKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIGZpbGVOZXcuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm1lbW9yeVVzZXJEYXRhYmFzZS53cml0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5ldy5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsZU5ldy5kZWxldGUoKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIHRoZSByZXF1aXJlZCByZW5hbWVzIHRvIHBlcm1hbmVudGx5IHNhdmUgdGhpcyBmaWxlCisgICAgICAgIEZpbGUgZmlsZU9sZCA9IG5ldyBGaWxlKHBhdGhuYW1lT2xkKTsKKyAgICAgICAgaWYgKCFmaWxlT2xkLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgZmlsZU9sZCA9CisgICAgICAgICAgICAgICAgbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksIHBhdGhuYW1lT2xkKTsKKyAgICAgICAgfQorICAgICAgICBmaWxlT2xkLmRlbGV0ZSgpOworICAgICAgICBGaWxlIGZpbGVPcmlnID0gbmV3IEZpbGUocGF0aG5hbWUpOworICAgICAgICBpZiAoIWZpbGVPcmlnLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgZmlsZU9yaWcgPQorICAgICAgICAgICAgICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLCBwYXRobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGVPcmlnLmV4aXN0cygpKSB7CisgICAgICAgICAgICBmaWxlT2xkLmRlbGV0ZSgpOworICAgICAgICAgICAgaWYgKCFmaWxlT3JpZy5yZW5hbWVUbyhmaWxlT2xkKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJtZW1vcnlVc2VyRGF0YWJhc2UucmVuYW1lT2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlT2xkLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmaWxlTmV3LnJlbmFtZVRvKGZpbGVPcmlnKSkgeworICAgICAgICAgICAgaWYgKGZpbGVPbGQuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBmaWxlT2xkLnJlbmFtZVRvKGZpbGVPcmlnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm1lbW9yeVVzZXJEYXRhYmFzZS5yZW5hbWVOZXciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU9yaWcuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgfQorICAgICAgICBmaWxlT2xkLmRlbGV0ZSgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBVc2VyRGF0YWJhc2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJNZW1vcnlVc2VyRGF0YWJhc2VbaWQ9Iik7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmlkKTsKKyAgICAgICAgc2IuYXBwZW5kKCIscGF0aG5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChwYXRobmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiLGdyb3VwQ291bnQ9Iik7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmdyb3Vwcy5zaXplKCkpOworICAgICAgICBzYi5hcHBlbmQoIixyb2xlQ291bnQ9Iik7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLnJvbGVzLnNpemUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLHVzZXJDb3VudD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMudXNlcnMuc2l6ZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPlN0cmluZ01hbmFnZXI8L2NvZGU+IGZvciB1c2UgaW4gbG9va2luZyB1cCBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICBTdHJpbmdNYW5hZ2VyIGdldFN0cmluZ01hbmFnZXIoKSB7CisKKyAgICAgICAgcmV0dXJuIChzbSk7CisKKyAgICB9CisKKworfQorCisKKworLyoqCisgKiBEaWdlc3RlciBvYmplY3QgY3JlYXRpb24gZmFjdG9yeSBmb3IgZ3JvdXAgaW5zdGFuY2VzLgorICovCitjbGFzcyBNZW1vcnlHcm91cENyZWF0aW9uRmFjdG9yeSBpbXBsZW1lbnRzIE9iamVjdENyZWF0aW9uRmFjdG9yeSB7CisKKyAgICBwdWJsaWMgTWVtb3J5R3JvdXBDcmVhdGlvbkZhY3RvcnkoTWVtb3J5VXNlckRhdGFiYXNlIGRhdGFiYXNlKSB7CisgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBkYXRhYmFzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZU9iamVjdChBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgU3RyaW5nIGdyb3VwbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImdyb3VwbmFtZSIpOworICAgICAgICBpZiAoZ3JvdXBuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIGdyb3VwbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJkZXNjcmlwdGlvbiIpOworICAgICAgICBTdHJpbmcgcm9sZXMgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJyb2xlcyIpOworICAgICAgICBHcm91cCBncm91cCA9IGRhdGFiYXNlLmNyZWF0ZUdyb3VwKGdyb3VwbmFtZSwgZGVzY3JpcHRpb24pOworICAgICAgICBpZiAocm9sZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgd2hpbGUgKHJvbGVzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIFN0cmluZyByb2xlbmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgaW50IGNvbW1hID0gcm9sZXMuaW5kZXhPZignLCcpOworICAgICAgICAgICAgICAgIGlmIChjb21tYSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJvbGVuYW1lID0gcm9sZXMuc3Vic3RyaW5nKDAsIGNvbW1hKS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgIHJvbGVzID0gcm9sZXMuc3Vic3RyaW5nKGNvbW1hICsgMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcm9sZW5hbWUgPSByb2xlcy50cmltKCk7CisgICAgICAgICAgICAgICAgICAgIHJvbGVzID0gIiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyb2xlbmFtZS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUm9sZSByb2xlID0gZGF0YWJhc2UuZmluZFJvbGUocm9sZW5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByb2xlID0gZGF0YWJhc2UuY3JlYXRlUm9sZShyb2xlbmFtZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZ3JvdXAuYWRkUm9sZShyb2xlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChncm91cCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZW1vcnlVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSBudWxsOworCisgICAgcHJpdmF0ZSBEaWdlc3RlciBkaWdlc3RlciA9IG51bGw7CisKKyAgICBwdWJsaWMgRGlnZXN0ZXIgZ2V0RGlnZXN0ZXIoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kaWdlc3Rlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGlnZXN0ZXIoRGlnZXN0ZXIgZGlnZXN0ZXIpIHsKKyAgICAgICAgdGhpcy5kaWdlc3RlciA9IGRpZ2VzdGVyOworICAgIH0KKworfQorCisKKy8qKgorICogRGlnZXN0ZXIgb2JqZWN0IGNyZWF0aW9uIGZhY3RvcnkgZm9yIHJvbGUgaW5zdGFuY2VzLgorICovCitjbGFzcyBNZW1vcnlSb2xlQ3JlYXRpb25GYWN0b3J5IGltcGxlbWVudHMgT2JqZWN0Q3JlYXRpb25GYWN0b3J5IHsKKworICAgIHB1YmxpYyBNZW1vcnlSb2xlQ3JlYXRpb25GYWN0b3J5KE1lbW9yeVVzZXJEYXRhYmFzZSBkYXRhYmFzZSkgeworICAgICAgICB0aGlzLmRhdGFiYXNlID0gZGF0YWJhc2U7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjcmVhdGVPYmplY3QoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7CisgICAgICAgIFN0cmluZyByb2xlbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInJvbGVuYW1lIik7CisgICAgICAgIGlmIChyb2xlbmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByb2xlbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJkZXNjcmlwdGlvbiIpOworICAgICAgICBSb2xlIHJvbGUgPSBkYXRhYmFzZS5jcmVhdGVSb2xlKHJvbGVuYW1lLCBkZXNjcmlwdGlvbik7CisgICAgICAgIHJldHVybiAocm9sZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZW1vcnlVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSBudWxsOworCisgICAgcHJpdmF0ZSBEaWdlc3RlciBkaWdlc3RlciA9IG51bGw7CisKKyAgICBwdWJsaWMgRGlnZXN0ZXIgZ2V0RGlnZXN0ZXIoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kaWdlc3Rlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGlnZXN0ZXIoRGlnZXN0ZXIgZGlnZXN0ZXIpIHsKKyAgICAgICAgdGhpcy5kaWdlc3RlciA9IGRpZ2VzdGVyOworICAgIH0KKworfQorCisKKy8qKgorICogRGlnZXN0ZXIgb2JqZWN0IGNyZWF0aW9uIGZhY3RvcnkgZm9yIHVzZXIgaW5zdGFuY2VzLgorICovCitjbGFzcyBNZW1vcnlVc2VyQ3JlYXRpb25GYWN0b3J5IGltcGxlbWVudHMgT2JqZWN0Q3JlYXRpb25GYWN0b3J5IHsKKworICAgIHB1YmxpYyBNZW1vcnlVc2VyQ3JlYXRpb25GYWN0b3J5KE1lbW9yeVVzZXJEYXRhYmFzZSBkYXRhYmFzZSkgeworICAgICAgICB0aGlzLmRhdGFiYXNlID0gZGF0YWJhc2U7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjcmVhdGVPYmplY3QoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7CisgICAgICAgIFN0cmluZyB1c2VybmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVzZXJuYW1lIik7CisgICAgICAgIGlmICh1c2VybmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB1c2VybmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwYXNzd29yZCIpOworICAgICAgICBTdHJpbmcgZnVsbE5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJmdWxsTmFtZSIpOworICAgICAgICBpZiAoZnVsbE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgZnVsbE5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJmdWxsbmFtZSIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBncm91cHMgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJncm91cHMiKTsKKyAgICAgICAgU3RyaW5nIHJvbGVzID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicm9sZXMiKTsKKyAgICAgICAgVXNlciB1c2VyID0gZGF0YWJhc2UuY3JlYXRlVXNlcih1c2VybmFtZSwgcGFzc3dvcmQsIGZ1bGxOYW1lKTsKKyAgICAgICAgaWYgKGdyb3VwcyAhPSBudWxsKSB7CisgICAgICAgICAgICB3aGlsZSAoZ3JvdXBzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBncm91cG5hbWUgPSBudWxsOworICAgICAgICAgICAgICAgIGludCBjb21tYSA9IGdyb3Vwcy5pbmRleE9mKCcsJyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbW1hID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXBuYW1lID0gZ3JvdXBzLnN1YnN0cmluZygwLCBjb21tYSkudHJpbSgpOworICAgICAgICAgICAgICAgICAgICBncm91cHMgPSBncm91cHMuc3Vic3RyaW5nKGNvbW1hICsgMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXBuYW1lID0gZ3JvdXBzLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXBzID0gIiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChncm91cG5hbWUubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEdyb3VwIGdyb3VwID0gZGF0YWJhc2UuZmluZEdyb3VwKGdyb3VwbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGRhdGFiYXNlLmNyZWF0ZUdyb3VwKGdyb3VwbmFtZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdXNlci5hZGRHcm91cChncm91cCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChyb2xlcyAhPSBudWxsKSB7CisgICAgICAgICAgICB3aGlsZSAocm9sZXMubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJvbGVuYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbnQgY29tbWEgPSByb2xlcy5pbmRleE9mKCcsJyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbW1hID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcm9sZW5hbWUgPSByb2xlcy5zdWJzdHJpbmcoMCwgY29tbWEpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgcm9sZXMgPSByb2xlcy5zdWJzdHJpbmcoY29tbWEgKyAxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByb2xlbmFtZSA9IHJvbGVzLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgcm9sZXMgPSAiIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJvbGVuYW1lLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBSb2xlIHJvbGUgPSBkYXRhYmFzZS5maW5kUm9sZShyb2xlbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyb2xlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUgPSBkYXRhYmFzZS5jcmVhdGVSb2xlKHJvbGVuYW1lLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1c2VyLmFkZFJvbGUocm9sZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAodXNlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZW1vcnlVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSBudWxsOworCisgICAgcHJpdmF0ZSBEaWdlc3RlciBkaWdlc3RlciA9IG51bGw7CisKKyAgICBwdWJsaWMgRGlnZXN0ZXIgZ2V0RGlnZXN0ZXIoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kaWdlc3Rlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGlnZXN0ZXIoRGlnZXN0ZXIgZGlnZXN0ZXIpIHsKKyAgICAgICAgdGhpcy5kaWdlc3RlciA9IGRpZ2VzdGVyOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL01lbW9yeVVzZXJEYXRhYmFzZUZhY3RvcnkuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9NZW1vcnlVc2VyRGF0YWJhc2VGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmNjczMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9NZW1vcnlVc2VyRGF0YWJhc2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51c2VyczsKKworCitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZBZGRyOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZlcmVuY2U7CitpbXBvcnQgamF2YXgubmFtaW5nLnNwaS5PYmplY3RGYWN0b3J5OworCisKKy8qKgorICogPHA+Sk5ESSBvYmplY3QgY3JlYXRpb24gZmFjdG9yeSBmb3IgPGNvZGU+TWVtb3J5VXNlckRhdGFiYXNlPC9jb2RlPgorICogaW5zdGFuY2VzLiAgVGhpcyBtYWtlcyBpdCBjb252ZW5pZW50IHRvIGNvbmZpZ3VyZSBhIHVzZXIgZGF0YWJhc2UKKyAqIGluIHRoZSBnbG9iYWwgSk5ESSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ2F0YWxpbmEgaW5zdGFuY2UsCisgKiBhbmQgdGhlbiBsaW5rIHRvIHRoYXQgcmVzb3VyY2UgZm9yIHdlYiBhcHBsaWNhdGlvbnMgdGhhdCBhZG1pbmlzdGVyCisgKiB0aGUgY29udGVudHMgb2YgdGhlIHVzZXIgZGF0YWJhc2UuPC9wPgorICoKKyAqIDxwPlRoZSA8Y29kZT5NZW1vcnlVc2VyRGF0YWJhc2U8L2NvZGU+IGluc3RhbmNlIGlzIGNvbmZpZ3VyZWQgYmFzZWQKKyAqIG9uIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIHZhbHVlczo8L3A+CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5wYXRobmFtZTwvc3Ryb25nPiAtIEFic29sdXRlIG9yIHJlbGF0aXZlICh0byB0aGUgZGlyZWN0b3J5CisgKiAgICAgcGF0aCBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPmNhdGFsaW5hLmJhc2U8L2NvZGU+IHN5c3RlbSBwcm9wZXJ0eSkKKyAqICAgICBwYXRobmFtZSB0byB0aGUgWE1MIGZpbGUgZnJvbSB3aGljaCBvdXIgdXNlciBpbmZvcm1hdGlvbiBpcyBsb2FkZWQsCisgKiAgICAgYW5kIHRvIHdoaWNoIGl0IGlzIHN0b3JlZC4gIFtjb25mL3RvbWNhdC11c2Vycy54bWxdPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBjbGFzcyBNZW1vcnlVc2VyRGF0YWJhc2VGYWN0b3J5IGltcGxlbWVudHMgT2JqZWN0RmFjdG9yeSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiA8cD5DcmVhdGUgYW5kIHJldHVybiBhIG5ldyA8Y29kZT5NZW1vcnlVc2VyRGF0YWJhc2U8L2NvZGU+IGluc3RhbmNlCisgICAgICogdGhhdCBoYXMgYmVlbiBjb25maWd1cmVkIGFjY29yZGluZyB0byB0aGUgcHJvcGVydGllcyBvZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgPGNvZGU+UmVmZXJlbmNlPC9jb2RlPi4gIElmIHlvdSBpbnN0YW5jZSBjYW4gYmUgY3JlYXRlZCwKKyAgICAgKiByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaW5zdGVhZC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIFRoZSBwb3NzaWJseSBudWxsIG9iamVjdCBjb250YWluaW5nIGxvY2F0aW9uIG9yCisgICAgICogIHJlZmVyZW5jZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIGNyZWF0aW5nIGFuIG9iamVjdAorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgb2JqZWN0IHJlbGF0aXZlIHRvIDxjb2RlPm5hbWVDdHg8L2NvZGU+CisgICAgICogQHBhcmFtIG5hbWVDdHggVGhlIGNvbnRleHQgcmVsYXRpdmUgdG8gd2hpY2ggdGhlIDxjb2RlPm5hbWU8L2NvZGU+CisgICAgICogIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIDxjb2RlPm5hbWU8L2NvZGU+CisgICAgICogIGlzIHJlbGF0aXZlIHRvIHRoZSBkZWZhdWx0IGluaXRpYWwgY29udGV4dAorICAgICAqIEBwYXJhbSBlbnZpcm9ubWVudCBUaGUgcG9zc2libHkgbnVsbCBlbnZpcm9ubWVudCB0aGF0IGlzIHVzZWQgaW4KKyAgICAgKiAgY3JlYXRpbmcgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdEluc3RhbmNlKE9iamVjdCBvYmosIE5hbWUgbmFtZSwgQ29udGV4dCBuYW1lQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIGVudmlyb25tZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBXZSBvbmx5IGtub3cgaG93IHRvIGRlYWwgd2l0aCA8Y29kZT5qYXZheC5uYW1pbmcuUmVmZXJlbmNlPC9jb2RlPnMKKyAgICAgICAgLy8gdGhhdCBzcGVjaWZ5IGEgY2xhc3MgbmFtZSBvZiAib3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2UiCisgICAgICAgIGlmICgob2JqID09IG51bGwpIHx8ICEob2JqIGluc3RhbmNlb2YgUmVmZXJlbmNlKSkgeworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICBSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgb2JqOworICAgICAgICBpZiAoISJvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZSIuZXF1YWxzKHJlZi5nZXRDbGFzc05hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIE1lbW9yeVVzZXJEYXRhYmFzZSBpbnN0YW5jZSBiYXNlZCBvbiB0aGUKKyAgICAgICAgLy8gUmVmQWRkciB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVmZXJlbmNlCisgICAgICAgIE1lbW9yeVVzZXJEYXRhYmFzZSBkYXRhYmFzZSA9IG5ldyBNZW1vcnlVc2VyRGF0YWJhc2UobmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgUmVmQWRkciByYSA9IG51bGw7CisKKyAgICAgICAgcmEgPSByZWYuZ2V0KCJwYXRobmFtZSIpOworICAgICAgICBpZiAocmEgIT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YWJhc2Uuc2V0UGF0aG5hbWUocmEuZ2V0Q29udGVudCgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmEgPSByZWYuZ2V0KCJyZWFkb25seSIpOworICAgICAgICBpZiAocmEgIT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YWJhc2Uuc2V0UmVhZG9ubHkoQm9vbGVhbi52YWx1ZU9mKHJhLmdldENvbnRlbnQoKS50b1N0cmluZygpKS5ib29sZWFuVmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gdGhlIGNvbmZpZ3VyZWQgZGF0YWJhc2UgaW5zdGFuY2UKKyAgICAgICAgZGF0YWJhc2Uub3BlbigpOworICAgICAgICBkYXRhYmFzZS5zYXZlKCk7CisgICAgICAgIHJldHVybiAoZGF0YWJhc2UpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL21iZWFucy1kZXNjcmlwdG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiNDc4YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCkBAIC0wLDAgKzEsMjgwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxtYmVhbnMtZGVzY3JpcHRvcnM+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iSkRCQ1VzZXJEYXRhYmFzZSIKKyAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuSkRCQ1VzZXJEYXRhYmFzZU1CZWFuIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJKREJDIGJhc2VkIHVzZXIgYW5kIGdyb3VwIGRhdGFiYXNlIgorICAgICAgICAgICAgICAgZG9tYWluPSJVc2VycyIKKyAgICAgICAgICAgICAgICBncm91cD0iVXNlckRhdGFiYXNlIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLkpEQkNVc2VyRGF0YWJhc2UiPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Imdyb3VwcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZXMgb2YgYWxsIGRlZmluZWQgZ3JvdXBzIgorICAgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7IgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJvbGVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lcyBvZiBhbGwgZGVmaW5lZCByb2xlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZhLmxhbmcuU3RyaW5nOyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ1c2VycyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZXMgb2YgYWxsIGRlZmluZWQgdXNlcnMiCisgICAgICAgICAgICAgICAgIHR5cGU9IltMamF2YS5sYW5nLlN0cmluZzsiCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlR3JvdXAiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgZ3JvdXAgYW5kIHJldHVybiBNQmVhbiBuYW1lIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJncm91cG5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ikdyb3VwIG5hbWUgb2YgdGhlIG5ldyBncm91cCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJkZXNjcmlwdGlvbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRGVzY3JpcHRpb24gb2YgdGhlIG5ldyBncm91cCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZVJvbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgcm9sZSBhbmQgcmV0dXJuIE1CZWFuIG5hbWUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InJvbGVuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSb2xlIG5hbWUgb2YgdGhlIG5ldyByb2xlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImRlc2NyaXB0aW9uIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJEZXNjcmlwdGlvbiBvZiB0aGUgbmV3IHJvbGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVVc2VyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IHVzZXIgYW5kIHJldHVybiBNQmVhbiBuYW1lIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VybmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVXNlciBuYW1lIG9mIHRoZSBuZXcgdXNlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUGFzc3dvcmQgb2YgdGhlIG5ldyB1c2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImZ1bGxOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxsIG5hbWUgb2YgdGhlIG5ldyB1c2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iZmluZEdyb3VwIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXR1cm4gTUJlYW4gTmFtZSBvZiB0aGUgc3BlY2lmaWVkIGdyb3VwIChpZiBhbnkpIgorICAgICAgICAgICAgICAgaW1wYWN0PSJJTkZPIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZ3JvdXBuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJHcm91cCBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgZ3JvdXAiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJmaW5kUm9sZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmV0dXJuIE1CZWFuIE5hbWUgb2YgdGhlIHNwZWNpZmllZCByb2xlIChpZiBhbnkpIgorICAgICAgICAgICAgICAgaW1wYWN0PSJJTkZPIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icm9sZW5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJvbGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIHJvbGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJmaW5kVXNlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmV0dXJuIE1CZWFuIE5hbWUgb2YgdGhlIHNwZWNpZmllZCB1c2VyIChpZiBhbnkpIgorICAgICAgICAgICAgICAgaW1wYWN0PSJJTkZPIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlcm5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlVzZXIgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIHVzZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVHcm91cCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIGV4aXN0aW5nIGdyb3VwIChhbmQgYWxsIHVzZXIgbWVtYmVyc2hpcHMpIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJncm91cG5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ikdyb3VwIG5hbWUgb2YgdGhlIGdyb3VwIHRvIHJlbW92ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZVJvbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBleGlzdGluZyByb2xlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJyb2xlbmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUm9sZSBuYW1lIG9mIHRoZSByb2xlIHRvIHJlbW92ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZVVzZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBleGlzdGluZyB1c2VyIChhbmQgYWxsIGdyb3VwIG1lbWJlcnNoaXBzKSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlcm5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlVzZXIgbmFtZSBvZiB0aGUgdXNlciB0byByZW1vdmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJzYXZlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJTYXZlIGN1cnJlbnQgdXNlcnMgYW5kIGdyb3VwcyB0byBwZXJzaXN0ZW50IHN0b3JhZ2UiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisKKworICAgIDxvcGVyYXRpb24gbmFtZT0ic3RhcnQiIGRlc2NyaXB0aW9uPSJTdGFydCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIiBkZXNjcmlwdGlvbj0iU3RvcCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0iSW5pdCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJkZXN0cm95IiBkZXNjcmlwdGlvbj0iRGVzdHJveSIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iTWVtb3J5VXNlckRhdGFiYXNlIgorICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5NZW1vcnlVc2VyRGF0YWJhc2VNQmVhbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSW4tbWVtb3J5IHVzZXIgYW5kIGdyb3VwIGRhdGFiYXNlIgorICAgICAgICAgICAgICAgZG9tYWluPSJVc2VycyIKKyAgICAgICAgICAgICAgICBncm91cD0iVXNlckRhdGFiYXNlIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLk1lbW9yeVVzZXJEYXRhYmFzZSI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZW5jb2RpbmciCisgICAgICAgICAgZGVzY3JpcHRpb249IkNoYXJhY3RlciBlbmNvZGluZyB0byB1c2Ugd2hlbiB3cml0aW5nIFhNTCBmaWxlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZ3JvdXBzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lcyBvZiBhbGwgZGVmaW5lZCBncm91cHMiCisgICAgICAgICAgICAgICAgIHR5cGU9IltMamF2YS5sYW5nLlN0cmluZzsiCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icGF0aG5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhuYW1lIHRvIGRhdGFiYXNlIGZpbGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyb2xlcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZXMgb2YgYWxsIGRlZmluZWQgcm9sZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9IltMamF2YS5sYW5nLlN0cmluZzsiCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idXNlcnMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWVzIG9mIGFsbCBkZWZpbmVkIHVzZXJzIgorICAgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7IgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlYWRvbmx5IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJObyBwZXJzaXN0YW50IHNhdmUgb2YgdGhlIHVzZXIgZGF0YWJhc2UiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0id3JpdGVhYmxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDaGVjayBpZiB1c2VyIGRhdGFiYXNlIGlzIHdyaXRlYWJsZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iSU5GTyIKKyAgICAgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZUdyb3VwIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IGdyb3VwIGFuZCByZXR1cm4gTUJlYW4gbmFtZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZ3JvdXBuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJHcm91cCBuYW1lIG9mIHRoZSBuZXcgZ3JvdXAiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGVzY3JpcHRpb24iCisgICAgICAgICAgZGVzY3JpcHRpb249IkRlc2NyaXB0aW9uIG9mIHRoZSBuZXcgZ3JvdXAiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVSb2xlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IHJvbGUgYW5kIHJldHVybiBNQmVhbiBuYW1lIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJyb2xlbmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUm9sZSBuYW1lIG9mIHRoZSBuZXcgcm9sZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJkZXNjcmlwdGlvbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRGVzY3JpcHRpb24gb2YgdGhlIG5ldyByb2xlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlVXNlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyB1c2VyIGFuZCByZXR1cm4gTUJlYW4gbmFtZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlcm5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlVzZXIgbmFtZSBvZiB0aGUgbmV3IHVzZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiCisgICAgICAgICAgZGVzY3JpcHRpb249IlBhc3N3b3JkIG9mIHRoZSBuZXcgdXNlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJmdWxsTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbCBuYW1lIG9mIHRoZSBuZXcgdXNlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImZpbmRHcm91cCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmV0dXJuIE1CZWFuIE5hbWUgb2YgdGhlIHNwZWNpZmllZCBncm91cCAoaWYgYW55KSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iSU5GTyIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Imdyb3VwbmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iR3JvdXAgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGdyb3VwIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iZmluZFJvbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJldHVybiBNQmVhbiBOYW1lIG9mIHRoZSBzcGVjaWZpZWQgcm9sZSAoaWYgYW55KSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iSU5GTyIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InJvbGVuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSb2xlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCByb2xlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iZmluZFVzZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJldHVybiBNQmVhbiBOYW1lIG9mIHRoZSBzcGVjaWZpZWQgdXNlciAoaWYgYW55KSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iSU5GTyIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJVc2VyIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCB1c2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0icmVtb3ZlR3JvdXAiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBleGlzdGluZyBncm91cCAoYW5kIGFsbCB1c2VyIG1lbWJlcnNoaXBzKSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZ3JvdXBuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJHcm91cCBuYW1lIG9mIHRoZSBncm91cCB0byByZW1vdmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVSb2xlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgZXhpc3Rpbmcgcm9sZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icm9sZW5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJvbGUgbmFtZSBvZiB0aGUgcm9sZSB0byByZW1vdmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVVc2VyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgZXhpc3RpbmcgdXNlciAoYW5kIGFsbCBncm91cCBtZW1iZXJzaGlwcykiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJVc2VyIG5hbWUgb2YgdGhlIHVzZXIgdG8gcmVtb3ZlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0ic2F2ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU2F2ZSBjdXJyZW50IHVzZXJzIGFuZCBncm91cHMgdG8gcGVyc2lzdGVudCBzdG9yYWdlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCisKKyAgICA8b3BlcmF0aW9uIG5hbWU9InN0YXJ0IiBkZXNjcmlwdGlvbj0iU3RhcnQiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcCIgZGVzY3JpcHRpb249IlN0b3AiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0iaW5pdCIgZGVzY3JpcHRpb249IkluaXQiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0iZGVzdHJveSIgZGVzY3JpcHRpb249IkRlc3Ryb3kiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICA8L21iZWFuPgorCisKKzwvbWJlYW5zLWRlc2NyaXB0b3JzPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQmFzZTY0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9CYXNlNjQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQ4YTg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQmFzZTY0LmphdmEKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLkJ5dGVDaHVuazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5DaGFyQ2h1bms7CisKKy8qKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBlbmNvZGUvZGVjb2RlIGZvciBSRkMgMjA0NSBCYXNlNjQgYXMgZGVmaW5lZCBieQorICogUkZDIDIwNDUsIE4uIEZyZWVkIGFuZCBOLiBCb3JlbnN0ZWluLiAgPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwNDUudHh0Ij5SRkMgMjA0NTwvYT46CisgKiBNdWx0aXB1cnBvc2UgSW50ZXJuZXQgTWFpbCBFeHRlbnNpb25zIChNSU1FKSBQYXJ0IE9uZTogRm9ybWF0IG9mCisgKiBJbnRlcm5ldCBNZXNzYWdlIEJvZGllcy4gUmVmZXJlbmNlIDE5OTYKKyAqCisgKiBAYXV0aG9yIEplZmZyZXkgUm9kcmlndWV6CisgKiBAdmVyc2lvbiAkSWQkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyAgQmFzZTY0Cit7CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBCQVNFTEVOR1RIICAgICAgICAgPSAyNTU7CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBMT09LVVBMRU5HVEggICAgICAgPSA2NDsKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIFRXRU5UWUZPVVJCSVRHUk9VUCA9IDI0OworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgRUlHSFRCSVQgICAgICAgICAgID0gODsKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIFNJWFRFRU5CSVQgICAgICAgICA9IDE2OworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgU0lYQklUICAgICAgICAgICAgID0gNjsKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIEZPVVJCWVRFICAgICAgICAgICA9IDQ7CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBTSUdOICAgICAgICAgICAgICAgPSAtMTI4OworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgUEFEICAgICAgICAgICAgICAgID0gKGJ5dGUpICc9JzsKKyAgICBzdGF0aWMgcHJpdmF0ZSBieXRlIFtdIGJhc2U2NEFscGhhYmV0ICAgICAgID0gbmV3IGJ5dGVbQkFTRUxFTkdUSF07CisgICAgc3RhdGljIHByaXZhdGUgYnl0ZSBbXSBsb29rVXBCYXNlNjRBbHBoYWJldCA9IG5ldyBieXRlW0xPT0tVUExFTkdUSF07CisgICAgLy9zdGF0aWMgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nID0gTG9nU291cmNlLmdldEluc3RhbmNlKCJvcmcuYXBhY2hlLmNvbW1vbnMudXRpbC5CYXNlNjQiKTsKKworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCQVNFTEVOR1RIOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlNjRBbHBoYWJldFtpXSA9IC0xOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAnWic7IGkgPj0gJ0EnOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2U2NEFscGhhYmV0W2ldID0gKGJ5dGUpIChpIC0gJ0EnKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gJ3onOyBpPj0gJ2EnOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2U2NEFscGhhYmV0W2ldID0gKGJ5dGUpIChpIC0gJ2EnICsgMjYpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAnOSc7IGkgPj0gJzAnOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2U2NEFscGhhYmV0W2ldID0gKGJ5dGUpIChpIC0gJzAnICsgNTIpOworICAgICAgICB9CisKKyAgICAgICAgYmFzZTY0QWxwaGFiZXRbJysnXSAgPSA2MjsKKyAgICAgICAgYmFzZTY0QWxwaGFiZXRbJy8nXSAgPSA2MzsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSAyNTsgaSsrICkKKyAgICAgICAgICAgIGxvb2tVcEJhc2U2NEFscGhhYmV0W2ldID0gKGJ5dGUpICgnQScgKyBpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMjYsICBqID0gMDsgaSA8PSA1MTsgaSsrLCBqKysgKQorICAgICAgICAgICAgbG9va1VwQmFzZTY0QWxwaGFiZXRbaV0gPSAoYnl0ZSkgKCdhJysgaik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDUyLCAgaiA9IDA7IGkgPD0gNjE7IGkrKywgaisrICkKKyAgICAgICAgICAgIGxvb2tVcEJhc2U2NEFscGhhYmV0W2ldID0gKGJ5dGUpICgnMCcgKyBqKTsKKworICAgICAgICBsb29rVXBCYXNlNjRBbHBoYWJldFs2Ml0gPSAoYnl0ZSkgJysnOworICAgICAgICBsb29rVXBCYXNlNjRBbHBoYWJldFs2M10gPSAoYnl0ZSkgJy8nOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Jhc2U2NCggU3RyaW5nIGlzVmFsaWRTdHJpbmcgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzQXJyYXlCeXRlQmFzZTY0KGlzVmFsaWRTdHJpbmcuZ2V0Qnl0ZXMoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmFzZTY0KCBieXRlIG9jdGVjdCApCisgICAgeworICAgICAgICAvL3NoYWxsIHdlIGlnbm9yZSB3aGl0ZSBzcGFjZT8gSkVGRj8/CisgICAgICAgIHJldHVybiAob2N0ZWN0ID09IFBBRCB8fCBiYXNlNjRBbHBoYWJldFtvY3RlY3RdICE9IC0xKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcnJheUJ5dGVCYXNlNjQoIGJ5dGVbXSBhcnJheU9jdGVjdCApCisgICAgeworICAgICAgICBpbnQgbGVuZ3RoID0gYXJyYXlPY3RlY3QubGVuZ3RoOworICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHNob3VsZG4ndCBhIDAgbGVuZ3RoIGFycmF5IGJlIHZhbGlkIGJhc2U2NCBkYXRhPworICAgICAgICAgICAgLy8gcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggIUJhc2U2NC5pc0Jhc2U2NChhcnJheU9jdGVjdFtpXSkgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIGhleCBvY3RlY3RzIGludG8gQmFzZTY0LgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmFyeURhdGEgQXJyYXkgY29udGFpbmluZyBiaW5hcnkgZGF0YSB0byBlbmNvZGUuCisgICAgICogQHJldHVybiBCYXNlNjQtZW5jb2RlZCBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZSggYnl0ZVtdIGJpbmFyeURhdGEgKQorICAgIHsKKyAgICAgICAgaW50ICAgICAgbGVuZ3RoRGF0YUJpdHMgICAgPSBiaW5hcnlEYXRhLmxlbmd0aCpFSUdIVEJJVDsKKyAgICAgICAgaW50ICAgICAgZmV3ZXJUaGFuMjRiaXRzICAgPSBsZW5ndGhEYXRhQml0cyVUV0VOVFlGT1VSQklUR1JPVVA7CisgICAgICAgIGludCAgICAgIG51bWJlclRyaXBsZXRzICAgID0gbGVuZ3RoRGF0YUJpdHMvVFdFTlRZRk9VUkJJVEdST1VQOworICAgICAgICBieXRlICAgICBlbmNvZGVkRGF0YVtdICAgICA9IG51bGw7CisKKworICAgICAgICBpZiAoZmV3ZXJUaGFuMjRiaXRzICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vZGF0YSBub3QgZGl2aXNpYmxlIGJ5IDI0IGJpdAorICAgICAgICAgICAgZW5jb2RlZERhdGEgPSBuZXcgYnl0ZVsgKG51bWJlclRyaXBsZXRzICsgMSApICogNCBdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gMTYgb3IgOCBiaXQKKyAgICAgICAgICAgIGVuY29kZWREYXRhID0gbmV3IGJ5dGVbIG51bWJlclRyaXBsZXRzICogNCBdOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZSBrID0gMCwgbCA9IDAsIGIxID0gMCwgYjIgPSAwLCBiMyA9IDA7CisKKyAgICAgICAgaW50IGVuY29kZWRJbmRleCA9IDA7CisgICAgICAgIGludCBkYXRhSW5kZXggICA9IDA7CisgICAgICAgIGludCBpICAgICAgICAgICA9IDA7CisgICAgICAgIC8vbG9nLmRlYnVnKCJudW1iZXIgb2YgdHJpcGxldHMgPSAiICsgbnVtYmVyVHJpcGxldHMpOworICAgICAgICBmb3IgKCBpID0gMDsgaTxudW1iZXJUcmlwbGV0czsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YUluZGV4ID0gaSozOworICAgICAgICAgICAgYjEgPSBiaW5hcnlEYXRhW2RhdGFJbmRleF07CisgICAgICAgICAgICBiMiA9IGJpbmFyeURhdGFbZGF0YUluZGV4ICsgMV07CisgICAgICAgICAgICBiMyA9IGJpbmFyeURhdGFbZGF0YUluZGV4ICsgMl07CisKKyAgICAgICAgICAgIC8vbG9nLmRlYnVnKCJiMT0gIiArIGIxICsiLCBiMj0gIiArIGIyICsgIiwgYjM9ICIgKyBiMyk7CisKKyAgICAgICAgICAgIGwgID0gKGJ5dGUpKGIyICYgMHgwZik7CisgICAgICAgICAgICBrICA9IChieXRlKShiMSAmIDB4MDMpOworCisgICAgICAgICAgICBlbmNvZGVkSW5kZXggPSBpICogNDsKKyAgICAgICAgICAgIGJ5dGUgdmFsMSA9ICgoYjEgJiBTSUdOKT09MCk/KGJ5dGUpKGIxPj4yKTooYnl0ZSkoKGIxKT4+Ml4weGMwKTsKKyAgICAgICAgICAgIGJ5dGUgdmFsMiA9ICgoYjIgJiBTSUdOKT09MCk/KGJ5dGUpKGIyPj40KTooYnl0ZSkoKGIyKT4+NF4weGYwKTsKKyAgICAgICAgICAgIGJ5dGUgdmFsMyA9ICgoYjMgJiBTSUdOKT09MCk/KGJ5dGUpKGIzPj42KTooYnl0ZSkoKGIzKT4+Nl4weGZjKTsKKworICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4XSAgID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIHZhbDEgXTsKKyAgICAgICAgICAgIC8vbG9nLmRlYnVnKCAidmFsMiA9ICIgKyB2YWwyICk7CisgICAgICAgICAgICAvL2xvZy5kZWJ1ZyggIms0ICAgPSAiICsgKGs8PDQpICk7CisgICAgICAgICAgICAvL2xvZy5kZWJ1ZyggICJ2YWsgID0gIiArICh2YWwyIHwgKGs8PDQpKSApOworICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4KzFdID0KKyAgICAgICAgICAgICAgICBsb29rVXBCYXNlNjRBbHBoYWJldFsgdmFsMiB8ICggazw8NCApXTsKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCsyXSA9CisgICAgICAgICAgICAgICAgbG9va1VwQmFzZTY0QWxwaGFiZXRbIChsIDw8MiApIHwgdmFsMyBdOworICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4KzNdID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIGIzICYgMHgzZiBdOworICAgICAgICB9CisKKyAgICAgICAgLy8gZm9ybSBpbnRlZ3JhbCBudW1iZXIgb2YgNi1iaXQgZ3JvdXBzCisgICAgICAgIGRhdGFJbmRleCAgICA9IGkqMzsKKyAgICAgICAgZW5jb2RlZEluZGV4ID0gaSo0OworICAgICAgICBpZiAoZmV3ZXJUaGFuMjRiaXRzID09IEVJR0hUQklUICkKKyAgICAgICAgeworICAgICAgICAgICAgYjEgPSBiaW5hcnlEYXRhW2RhdGFJbmRleF07CisgICAgICAgICAgICBrID0gKGJ5dGUpICggYjEgJjB4MDMgKTsKKyAgICAgICAgICAgIC8vbG9nLmRlYnVnKCJiMT0iICsgYjEpOworICAgICAgICAgICAgLy9sb2cuZGVidWcoImIxPDwyID0gIiArIChiMT4+MikgKTsKKyAgICAgICAgICAgIGJ5dGUgdmFsMSA9ICgoYjEgJiBTSUdOKT09MCk/KGJ5dGUpKGIxPj4yKTooYnl0ZSkoKGIxKT4+Ml4weGMwKTsKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleF0gICAgID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIHZhbDEgXTsKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCArIDFdID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIGs8PDQgXTsKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCArIDJdID0gUEFEOworICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4ICsgM10gPSBQQUQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZmV3ZXJUaGFuMjRiaXRzID09IFNJWFRFRU5CSVQpCisgICAgICAgIHsKKworICAgICAgICAgICAgYjEgPSBiaW5hcnlEYXRhW2RhdGFJbmRleF07CisgICAgICAgICAgICBiMiA9IGJpbmFyeURhdGFbZGF0YUluZGV4ICsxIF07CisgICAgICAgICAgICBsID0gKGJ5dGUpIChiMiAmIDB4MGYpOworICAgICAgICAgICAgayA9IChieXRlKSAoYjEgJiAweDAzKTsKKworICAgICAgICAgICAgYnl0ZSB2YWwxID0gKChiMSAmIFNJR04pID09IDApPyhieXRlKShiMT4+Mik6KGJ5dGUpKChiMSk+PjJeMHhjMCk7CisgICAgICAgICAgICBieXRlIHZhbDIgPSAoKGIyICYgU0lHTikgPT0gMCk/KGJ5dGUpKGIyPj40KTooYnl0ZSkoKGIyKT4+NF4weGYwKTsKKworICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4XSAgICAgPSBsb29rVXBCYXNlNjRBbHBoYWJldFsgdmFsMSBdOworICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4ICsgMV0gPQorICAgICAgICAgICAgICAgIGxvb2tVcEJhc2U2NEFscGhhYmV0WyB2YWwyIHwgKCBrPDw0ICldOworICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4ICsgMl0gPSBsb29rVXBCYXNlNjRBbHBoYWJldFsgbDw8MiBdOworICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4ICsgM10gPSBQQUQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZW5jb2RlZERhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlcyBCYXNlNjQgZGF0YSBpbnRvIG9jdGVjdHMKKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlNjREYXRhQkMgQnl0ZSBhcnJheSBjb250YWluaW5nIEJhc2U2NCBkYXRhCisgICAgICogQHBhcmFtIGRlY29kZWREYXRhQ0MgVGhlIGRlY29kZWQgZGF0YSBjaGFycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWNvZGUoIEJ5dGVDaHVuayBiYXNlNjREYXRhQkMsIENoYXJDaHVuayBkZWNvZGVkRGF0YUNDKQorICAgIHsKKyAgICAgICAgaW50IHN0YXJ0ID0gYmFzZTY0RGF0YUJDLmdldFN0YXJ0KCk7CisgICAgICAgIGludCBlbmQgPSBiYXNlNjREYXRhQkMuZ2V0RW5kKCk7CisgICAgICAgIGJ5dGVbXSBiYXNlNjREYXRhID0gYmFzZTY0RGF0YUJDLmdldEJ1ZmZlcigpOworICAgICAgICAKKyAgICAgICAgZGVjb2RlZERhdGFDQy5yZWN5Y2xlKCk7CisgICAgICAgIAorICAgICAgICAvLyBoYW5kbGUgdGhlIGVkZ2UgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBpdCBsYXRlcgorICAgICAgICBpZihlbmQgLSBzdGFydCA9PSAwKSB7IHJldHVybjsgfQorCisgICAgICAgIGludCAgICAgIG51bWJlclF1YWRydXBsZSAgICA9IChlbmQgLSBzdGFydCkvRk9VUkJZVEU7CisgICAgICAgIGJ5dGUgICAgIGIxPTAsYjI9MCxiMz0wLCBiND0wLCBtYXJrZXIwPTAsIG1hcmtlcjE9MDsKKworICAgICAgICAvLyBUaHJvdyBhd2F5IGFueXRoaW5nIG5vdCBpbiBiYXNlNjREYXRhCisKKyAgICAgICAgaW50IGVuY29kZWRJbmRleCA9IDA7CisgICAgICAgIGludCBkYXRhSW5kZXggPSBzdGFydDsKKyAgICAgICAgY2hhcltdIGRlY29kZWREYXRhID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoaXMgc2l6ZXMgdGhlIG91dHB1dCBhcnJheSBwcm9wZXJseSAtIHJsdworICAgICAgICAgICAgaW50IGxhc3REYXRhID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICAvLyBpZ25vcmUgdGhlICc9JyBwYWRkaW5nCisgICAgICAgICAgICB3aGlsZSAoYmFzZTY0RGF0YVtzdGFydCtsYXN0RGF0YS0xXSA9PSBQQUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKC0tbGFzdERhdGEgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWNvZGVkRGF0YUNDLmFsbG9jYXRlKGxhc3REYXRhIC0gbnVtYmVyUXVhZHJ1cGxlLCAtMSk7CisgICAgICAgICAgICBkZWNvZGVkRGF0YUNDLnNldEVuZChsYXN0RGF0YSAtIG51bWJlclF1YWRydXBsZSk7CisgICAgICAgICAgICBkZWNvZGVkRGF0YSA9IGRlY29kZWREYXRhQ0MuZ2V0QnVmZmVyKCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlclF1YWRydXBsZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhSW5kZXggPSBzdGFydCArIGkgKiA0OworICAgICAgICAgICAgbWFya2VyMCAgID0gYmFzZTY0RGF0YVtkYXRhSW5kZXggKyAyXTsKKyAgICAgICAgICAgIG1hcmtlcjEgICA9IGJhc2U2NERhdGFbZGF0YUluZGV4ICsgM107CisKKyAgICAgICAgICAgIGIxID0gYmFzZTY0QWxwaGFiZXRbYmFzZTY0RGF0YVtkYXRhSW5kZXhdXTsKKyAgICAgICAgICAgIGIyID0gYmFzZTY0QWxwaGFiZXRbYmFzZTY0RGF0YVtkYXRhSW5kZXggKzFdXTsKKworICAgICAgICAgICAgaWYgKG1hcmtlcjAgIT0gUEFEICYmIG1hcmtlcjEgIT0gUEFEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vTm8gUEFEIGUuZyAzY1FsCisgICAgICAgICAgICAgICAgYjMgPSBiYXNlNjRBbHBoYWJldFsgbWFya2VyMCBdOworICAgICAgICAgICAgICAgIGI0ID0gYmFzZTY0QWxwaGFiZXRbIG1hcmtlcjEgXTsKKworICAgICAgICAgICAgICAgIGRlY29kZWREYXRhW2VuY29kZWRJbmRleF0gICA9IChjaGFyKSAoKCAgYjEgPDwyIHwgYjI+PjQgKSAmIDB4ZmYpOworICAgICAgICAgICAgICAgIGRlY29kZWREYXRhW2VuY29kZWRJbmRleCArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgKGNoYXIpICgoKChiMiAmIDB4Zik8PDQgKSB8KCAoYjM+PjIpICYgMHhmKSApICYgMHhmZik7CisgICAgICAgICAgICAgICAgZGVjb2RlZERhdGFbZW5jb2RlZEluZGV4ICsgMl0gPSAoY2hhcikgKCggYjM8PDYgfCBiNCApICYgMHhmZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtYXJrZXIwID09IFBBRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL1R3byBQQUQgZS5nLiAzY1tQYWRdW1BhZF0KKyAgICAgICAgICAgICAgICBkZWNvZGVkRGF0YVtlbmNvZGVkSW5kZXhdICAgPSAoY2hhcikgKCggIGIxIDw8MiB8IGIyPj40ICkgJiAweGZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG1hcmtlcjEgPT0gUEFEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vT25lIFBBRCBlLmcuIDNjUVtQYWRdCisgICAgICAgICAgICAgICAgYjMgPSBiYXNlNjRBbHBoYWJldFsgbWFya2VyMCBdOworCisgICAgICAgICAgICAgICAgZGVjb2RlZERhdGFbZW5jb2RlZEluZGV4XSAgID0gKGNoYXIpICgoICBiMSA8PDIgfCBiMj4+NCApICYgMHhmZik7CisgICAgICAgICAgICAgICAgZGVjb2RlZERhdGFbZW5jb2RlZEluZGV4ICsgMV0gPQorICAgICAgICAgICAgICAgICAgICAoY2hhcikgKCgoKGIyICYgMHhmKTw8NCApIHwoIChiMz4+MikgJiAweGYpICkgJiAweGZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuY29kZWRJbmRleCArPSAzOworICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0NHSVByb2Nlc3NFbnZpcm9ubWVudC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQ0dJUHJvY2Vzc0Vudmlyb25tZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg0YzlhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0NHSVByb2Nlc3NFbnZpcm9ubWVudC5qYXZhCkBAIC0wLDAgKzEsNDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKworLyoqCisgKiBFbmNhcHN1bGF0ZXMgdGhlIENHSSBQcm9jZXNzJyBlbnZpcm9ubWVudCBhbmQgcnVsZXMgdG8gZGVyaXZlCisgKiB0aGF0IGVudmlyb25tZW50IGZyb20gdGhlIHNlcnZsZXQgY29udGFpbmVyIGFuZCByZXF1ZXN0IGluZm9ybWF0aW9uLgorICogQGF1dGhvciAgIE1hcnRpbiBEZW5nbGVyIFtyb290QG1hcnRpbmRlbmdsZXIuY29tXQorICogQHZlcnNpb24gICRSZXZpc2lvbiQsICREYXRlJAorICogQHNpbmNlICAgIFRvbWNhdCA0LjAKKyAqIEBkZXByZWNhdGVkCisgKi8KKworcHVibGljIGNsYXNzIENHSVByb2Nlc3NFbnZpcm9ubWVudCBleHRlbmRzIFByb2Nlc3NFbnZpcm9ubWVudCB7CisgICAgCisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIENHSVByb2Nlc3NFbnZpcm9ubWVudC5jbGFzcyApOworICAgIAorICAgIC8qKiBjZ2kgY29tbWFuZCdzIHF1ZXJ5IHBhcmFtZXRlcnMgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSBxdWVyeVBhcmFtZXRlcnMgPSBudWxsOworCisgICAgLyoqCisgICAgICogIFRoZSBDR0kgc2VhcmNoIHBhdGggd2lsbCBzdGFydCBhdAorICAgICAqICAgIHdlYkFwcFJvb3REaXIgKyBGaWxlLnNlcGFyYXRvciArIGNnaVBhdGhQcmVmaXgKKyAgICAgKiAgICAob3Igd2ViQXBwUm9vdERpciBhbG9uZSBpZiBjZ2lQYXRoUHJlZml4IGlzCisgICAgICogICAgbnVsbCkKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjZ2lQYXRoUHJlZml4ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIFByb2Nlc3NFbnZpcm9ubWVudCBhbmQgZGVyaXZlcyB0aGUgbmVjZXNzYXJ5IGVudmlyb25tZW50LAorICAgICAqIHdvcmtpbmcgZGlyZWN0b3J5LCBjb21tYW5kLCBldGMuICBUaGUgY2dpIHBhdGggcHJlZml4IGlzIGluaXRpYWxpemVkCisgICAgICogdG8gIiIgKHRoZSBlbXB0eSBzdHJpbmcpLgorICAgICAqCisgICAgICogQHBhcmFtICByZXEgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IGZvciBpbmZvcm1hdGlvbiBwcm92aWRlZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgIHRoZSBTZXJ2bGV0IEFQSQorICAgICAqIEBwYXJhbSAgY29udGV4dCAgIFNlcnZsZXRDb250ZXh0IGZvciBpbmZvcm1hdGlvbiBwcm92aWRlZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgIHRoZSBTZXJ2bGV0IEFQSQorICAgICAqLworICAgIHB1YmxpYyBDR0lQcm9jZXNzRW52aXJvbm1lbnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKyAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgdGhpcyhyZXEsIGNvbnRleHQsICIiKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIFByb2Nlc3NFbnZpcm9ubWVudCBhbmQgZGVyaXZlcyB0aGUgbmVjZXNzYXJ5IGVudmlyb25tZW50LAorICAgICAqIHdvcmtpbmcgZGlyZWN0b3J5LCBjb21tYW5kLCBldGMuCisgICAgICogQHBhcmFtIHJlcSAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgZm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgU2VydmxldCBBUEkKKyAgICAgKiBAcGFyYW0gY29udGV4dCAgICAgICAgIFNlcnZsZXRDb250ZXh0IGZvciBpbmZvcm1hdGlvbiBwcm92aWRlZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFNlcnZsZXQgQVBJCisgICAgICogQHBhcmFtIGNnaVBhdGhQcmVmaXggICBzdWJkaXJlY3Rvcnkgb2Ygd2ViQXBwUm9vdERpciBiZWxvdyB3aGljaCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHdlYiBhcHAncyBDR0lzIG1heSBiZSBzdG9yZWQ7IGNhbiBiZSBudWxsIG9yICIiLgorICAgICAqLworICAgIHB1YmxpYyBDR0lQcm9jZXNzRW52aXJvbm1lbnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKyAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCwgU3RyaW5nIGNnaVBhdGhQcmVmaXgpIHsKKyAgICAgICAgICAgIHRoaXMocmVxLCBjb250ZXh0LCBjZ2lQYXRoUHJlZml4LCAwKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIFByb2Nlc3NFbnZpcm9ubWVudCBhbmQgZGVyaXZlcyB0aGUgbmVjZXNzYXJ5IGVudmlyb25tZW50LAorICAgICAqIHdvcmtpbmcgZGlyZWN0b3J5LCBjb21tYW5kLCBldGMuCisgICAgICogQHBhcmFtIHJlcSAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgZm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgU2VydmxldCBBUEkKKyAgICAgKiBAcGFyYW0gY29udGV4dCAgICAgICAgIFNlcnZsZXRDb250ZXh0IGZvciBpbmZvcm1hdGlvbiBwcm92aWRlZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFNlcnZsZXQgQVBJCisgICAgICogQHBhcmFtICBkZWJ1ZyAgICAgICAgICBpbnQgZGVidWcgbGV2ZWwgKDAgPT0gbm9uZSwgNiA9PSBsb3RzKQorICAgICAqLworICAgIHB1YmxpYyBDR0lQcm9jZXNzRW52aXJvbm1lbnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKyAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCwgaW50IGRlYnVnKSB7CisgICAgICAgICAgICB0aGlzKHJlcSwgY29udGV4dCwgIiIsIDApOworICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBQcm9jZXNzRW52aXJvbm1lbnQgYW5kIGRlcml2ZXMgdGhlIG5lY2Vzc2FyeSBlbnZpcm9ubWVudCwKKyAgICAgKiB3b3JraW5nIGRpcmVjdG9yeSwgY29tbWFuZCwgZXRjLgorICAgICAqIEBwYXJhbSByZXEgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IGZvciBpbmZvcm1hdGlvbiBwcm92aWRlZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFNlcnZsZXQgQVBJCisgICAgICogQHBhcmFtIGNvbnRleHQgICAgICAgICBTZXJ2bGV0Q29udGV4dCBmb3IgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBTZXJ2bGV0IEFQSQorICAgICAqIEBwYXJhbSBjZ2lQYXRoUHJlZml4ICAgc3ViZGlyZWN0b3J5IG9mIHdlYkFwcFJvb3REaXIgYmVsb3cgd2hpY2ggdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB3ZWIgYXBwJ3MgQ0dJcyBtYXkgYmUgc3RvcmVkOyBjYW4gYmUgbnVsbCBvciAiIi4KKyAgICAgKiBAcGFyYW0gIGRlYnVnICAgICAgICAgIGludCBkZWJ1ZyBsZXZlbCAoMCA9PSBub25lLCA2ID09IGxvdHMpCisgICAgICovCisgICAgcHVibGljIENHSVByb2Nlc3NFbnZpcm9ubWVudChIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0LCBTdHJpbmcgY2dpUGF0aFByZWZpeCwgaW50IGRlYnVnKSB7CisgICAgICAgICAgICBzdXBlcihyZXEsIGNvbnRleHQsIGRlYnVnKTsKKyAgICAgICAgICAgIHRoaXMuY2dpUGF0aFByZWZpeCA9IGNnaVBhdGhQcmVmaXg7CisgICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBwYXJhbU5hbWVzID0gcmVxLmdldFBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgICAgICB3aGlsZSAocGFyYW1OYW1lcyAhPSBudWxsICYmIHBhcmFtTmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW0gPSBwYXJhbU5hbWVzLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMucHV0KHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVxLmdldFBhcmFtZXRlcihwYXJhbSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLnZhbGlkID0gZGVyaXZlUHJvY2Vzc0Vudmlyb25tZW50KHJlcSk7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgdGhlIENHSSBlbnZpcm9ubWVudCB0byBiZSBzdXBwbGllZCB0byB0aGUgaW52b2tlZCBDR0kKKyAgICAgKiBzY3JpcHQ7IHJlbGllcyBoZWF2bGl5IG9uIFNlcnZsZXQgQVBJIG1ldGhvZHMgYW5kIGZpbmRDR0kKKyAgICAgKiBAcGFyYW0gICAgcmVxIHJlcXVlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBDR0kgaW52b2thdGlvbgorICAgICAqIEByZXR1cm4gICB0cnVlIGlmIGVudmlyb25tZW50IHdhcyBzZXQgT0ssIGZhbHNlIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0KKyAgICAgKiAgICAgICAgICAgYW5kIG5vIGVudmlyb25tZW50IHdhcyBzZXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZXJpdmVQcm9jZXNzRW52aXJvbm1lbnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgICAgICAvKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBzbGlnaHRseSB1Z2x5OyBjJ2VzdCBsYSB2aWUuCisgICAgICAgICAqICJZb3UgY2Fubm90IHN0b3AgW3VnbGluZXNzXSwgeW91IGNhbiBvbmx5IGhvcGUgdG8gY29udGFpbiBbaXRdIgorICAgICAgICAgKiAoYXBvbG9naWVzIHRvIE1hcnYgQWxiZXJ0IHJlZ2FyZGluZyBNSikKKyAgICAgICAgICovCisKKyAgICAgICAgSGFzaHRhYmxlIGVudnA7CisgICAgICAgIHN1cGVyLmRlcml2ZVByb2Nlc3NFbnZpcm9ubWVudChyZXEpOworICAgICAgICBlbnZwID0gZ2V0RW52aXJvbm1lbnQoKTsKKworICAgICAgICBTdHJpbmcgc1BhdGhJbmZvT3JpZyA9IG51bGw7CisgICAgICAgIFN0cmluZyBzUGF0aFRyYW5zbGF0ZWRPcmlnID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHNQYXRoSW5mb0NHSSA9IG51bGw7CisgICAgICAgIFN0cmluZyBzUGF0aFRyYW5zbGF0ZWRDR0kgPSBudWxsOworICAgICAgICBTdHJpbmcgc0NHSUZ1bGxQYXRoID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHNDR0lTY3JpcHROYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHNDR0lGdWxsTmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBzQ0dJTmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZ1tdIHNDR0lOYW1lczsKKyAgICAgICAgc1BhdGhJbmZvT3JpZyA9IHRoaXMucGF0aEluZm87CisgICAgICAgIHNQYXRoSW5mb09yaWcgPSBzUGF0aEluZm9PcmlnID09IG51bGwgPyAiIiA6IHNQYXRoSW5mb09yaWc7CisgICAgICAgIHNQYXRoVHJhbnNsYXRlZE9yaWcgPSByZXEuZ2V0UGF0aFRyYW5zbGF0ZWQoKTsKKyAgICAgICAgc1BhdGhUcmFuc2xhdGVkT3JpZyA9IHNQYXRoVHJhbnNsYXRlZE9yaWcgPT0gbnVsbCA/ICIiIDoKKyAgICAgICAgICAgIHNQYXRoVHJhbnNsYXRlZE9yaWc7CisgICAgICAgICAgICBzQ0dJTmFtZXMgPQorICAgICAgICAgICAgICAgIGZpbmRDR0koc1BhdGhJbmZvT3JpZywgZ2V0V2ViQXBwUm9vdERpcigpLCBnZXRDb250ZXh0UGF0aCgpLAorICAgICAgICAgICAgICAgIGdldFNlcnZsZXRQYXRoKCksIGNnaVBhdGhQcmVmaXgpOworICAgICAgICBzQ0dJRnVsbFBhdGggPSBzQ0dJTmFtZXNbMF07CisgICAgICAgIHNDR0lTY3JpcHROYW1lID0gc0NHSU5hbWVzWzFdOworICAgICAgICBzQ0dJRnVsbE5hbWUgPSBzQ0dJTmFtZXNbMl07CisgICAgICAgIHNDR0lOYW1lID0gc0NHSU5hbWVzWzNdOworICAgICAgICBpZiAoc0NHSUZ1bGxQYXRoID09IG51bGwgfHwgc0NHSVNjcmlwdE5hbWUgPT0gbnVsbAorICAgICAgICAgICAgfHwgc0NHSUZ1bGxOYW1lID09IG51bGwgfHwgc0NHSU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbnZwLnB1dCgiU0VSVkVSX1NPRlRXQVJFIiwgIlRPTUNBVCIpOworICAgICAgICBlbnZwLnB1dCgiU0VSVkVSX05BTUUiLCBudWxsc1RvQmxhbmtzKHJlcS5nZXRTZXJ2ZXJOYW1lKCkpKTsKKyAgICAgICAgZW52cC5wdXQoIkdBVEVXQVlfSU5URVJGQUNFIiwgIkNHSS8xLjEiKTsKKyAgICAgICAgZW52cC5wdXQoIlNFUlZFUl9QUk9UT0NPTCIsIG51bGxzVG9CbGFua3MocmVxLmdldFByb3RvY29sKCkpKTsKKyAgICAgICAgaW50IHBvcnQgPSByZXEuZ2V0U2VydmVyUG9ydCgpOworICAgICAgICBJbnRlZ2VyIGlQb3J0ID0gKHBvcnQgPT0gMCA/IG5ldyBJbnRlZ2VyKC0xKSA6IG5ldyBJbnRlZ2VyKHBvcnQpKTsKKyAgICAgICAgZW52cC5wdXQoIlNFUlZFUl9QT1JUIiwgaVBvcnQudG9TdHJpbmcoKSk7CisgICAgICAgIGVudnAucHV0KCJSRVFVRVNUX01FVEhPRCIsIG51bGxzVG9CbGFua3MocmVxLmdldE1ldGhvZCgpKSk7CisKKyAgICAgICAgLyotCisgICAgICAgICogUEFUSF9JTkZPIHNob3VsZCBiZSBkZXRlcm1pbmVkIGJ5IHVzaW5nIHNDR0lGdWxsTmFtZToKKyAgICAgICAgKiAxKSBMZXQgc0NHSUZ1bGxOYW1lIG5vdCBlbmQgaW4gYSAiLyIgKHNlZSBtZXRob2QgZmluZENHSSkKKyAgICAgICAgKiAyKSBMZXQgc0NHSUZ1bGxOYW1lIGVxdWFsIHRoZSBwYXRoSW5mbyBmcmFnbWVudCB3aGljaAorICAgICAgICAqICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBhY3R1YWwgY2dpIHNjcmlwdC4KKyAgICAgICAgKiAzKSBUaHVzLCBQQVRIX0lORk8gPSByZXF1ZXN0LmdldFBhdGhJbmZvKCkuc3Vic3RyaW5nKAorICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNDR0lGdWxsTmFtZS5sZW5ndGgoKSkKKyAgICAgICAgKgorICAgICAgICAqIChzZWUgbWV0aG9kIGZpbmRDR0ksIHdoZXJlIHRoZSByZWFsIHdvcmsgaXMgZG9uZSkKKyAgICAgICAgKgorICAgICAgICAqLworCisgICAgICAgIGlmIChwYXRoSW5mbyA9PSBudWxsIHx8CisgICAgICAgICAgICAocGF0aEluZm8uc3Vic3RyaW5nKHNDR0lGdWxsTmFtZS5sZW5ndGgoKSkubGVuZ3RoKCkgPD0gMCkpIHsKKyAgICAgICAgICAgICAgICBzUGF0aEluZm9DR0kgPSAiIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNQYXRoSW5mb0NHSSA9IHBhdGhJbmZvLnN1YnN0cmluZyhzQ0dJRnVsbE5hbWUubGVuZ3RoKCkpOworICAgICAgICB9CisgICAgICAgIGVudnAucHV0KCJQQVRIX0lORk8iLCBzUGF0aEluZm9DR0kpOworCisgICAgICAgIC8qLQorICAgICAgICAqIFBBVEhfVFJBTlNMQVRFRCBtdXN0IGJlIGRldGVybWluZWQgYWZ0ZXIgUEFUSF9JTkZPIChhbmQgdGhlCisgICAgICAgICogaW1wbGllZCByZWFsIGNnaS1zY3JpcHQpIGhhcyBiZWVuIHRha2VuIGludG8gYWNjb3VudC4KKyAgICAgICAgKgorICAgICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXM6CisgICAgICAgICoKKyAgICAgICAgKiBzZXJ2bGV0IGluZm8gICA9IC9zZXJ2bGV0L2NnaWd3L2RpcjEvZGlyMi9jZ2kxL3RyYW5zMS90cmFuczIKKyAgICAgICAgKiBjZ2lmdWxscGF0aCAgICA9IC9zZXJ2bGV0L2NnaWd3L2RpcjEvZGlyMi9jZ2kxCisgICAgICAgICogcGF0aF9pbmZvICAgICAgPSAvdHJhbnMxL3RyYW5zMgorICAgICAgICAqIHdlYkFwcFJvb3REaXIgID0gc2VydmxldENvbnRleHQuZ2V0UmVhbFBhdGgoIi8iKQorICAgICAgICAqCisgICAgICAgICogcGF0aF90cmFuc2xhdGVkID0gc2VydmxldENvbnRleHQuZ2V0UmVhbFBhdGgoIi90cmFuczEvdHJhbnMyIikKKyAgICAgICAgKgorICAgICAgICAqIFRoYXQgaXMsIFBBVEhfVFJBTlNMQVRFRCA9IHdlYkFwcFJvb3REaXIgKyBzUGF0aEluZm9DR0kKKyAgICAgICAgKiAodW5sZXNzIHNQYXRoSW5mb0NHSSBpcyBudWxsIG9yIGJsYW5rLCB0aGVuIHRoZSBDR0kKKyAgICAgICAgKiBzcGVjaWZpY2F0aW9uIGRpY3RhdGVzIHRoYXQgdGhlIFBBVEhfVFJBTlNMQVRFRCBtZXRhdmFyaWFibGUKKyAgICAgICAgKiBTSE9VTEQgTk9UIGJlIGRlZmluZWQuCisgICAgICAgICoKKyAgICAgICAgKi8KKworICAgICAgICBpZiAoc1BhdGhJbmZvQ0dJICE9IG51bGwgJiYgISgiIi5lcXVhbHMoc1BhdGhJbmZvQ0dJKSkpIHsKKyAgICAgICAgICAgIHNQYXRoVHJhbnNsYXRlZENHSSA9IGdldENvbnRleHQoKS5nZXRSZWFsUGF0aChzUGF0aEluZm9DR0kpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc1BhdGhUcmFuc2xhdGVkQ0dJID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc1BhdGhUcmFuc2xhdGVkQ0dJID09IG51bGwgfHwgIiIuZXF1YWxzKHNQYXRoVHJhbnNsYXRlZENHSSkpIHsKKyAgICAgICAgICAgIC8vTk9PUAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW52cC5wdXQoIlBBVEhfVFJBTlNMQVRFRCIsIG51bGxzVG9CbGFua3Moc1BhdGhUcmFuc2xhdGVkQ0dJKSk7CisgICAgICAgIH0KKyAgICAgICAgZW52cC5wdXQoIlNDUklQVF9OQU1FIiwgbnVsbHNUb0JsYW5rcyhzQ0dJU2NyaXB0TmFtZSkpOworICAgICAgICBlbnZwLnB1dCgiUVVFUllfU1RSSU5HIiwgbnVsbHNUb0JsYW5rcyhyZXEuZ2V0UXVlcnlTdHJpbmcoKSkpOworICAgICAgICBlbnZwLnB1dCgiUkVNT1RFX0hPU1QiLCBudWxsc1RvQmxhbmtzKHJlcS5nZXRSZW1vdGVIb3N0KCkpKTsKKyAgICAgICAgZW52cC5wdXQoIlJFTU9URV9BRERSIiwgbnVsbHNUb0JsYW5rcyhyZXEuZ2V0UmVtb3RlQWRkcigpKSk7CisgICAgICAgIGVudnAucHV0KCJBVVRIX1RZUEUiLCBudWxsc1RvQmxhbmtzKHJlcS5nZXRBdXRoVHlwZSgpKSk7CisgICAgICAgIGVudnAucHV0KCJSRU1PVEVfVVNFUiIsIG51bGxzVG9CbGFua3MocmVxLmdldFJlbW90ZVVzZXIoKSkpOworICAgICAgICBlbnZwLnB1dCgiUkVNT1RFX0lERU5UIiwgIiIpOyAvL25vdCBuZWNlc3NhcnkgZm9yIGZ1bGwgY29tcGxpYW5jZQorICAgICAgICBlbnZwLnB1dCgiQ09OVEVOVF9UWVBFIiwgbnVsbHNUb0JsYW5rcyhyZXEuZ2V0Q29udGVudFR5cGUoKSkpOworCisgICAgICAgIC8qIE5vdGUgQ0dJIHNwZWMgc2F5cyBDT05URU5UX0xFTkdUSCBtdXN0IGJlIE5VTEwgKCIiKSBvciB1bmRlZmluZWQKKyAgICAgICAgKiBpZiB0aGVyZSBpcyBubyBjb250ZW50LCBzbyB3ZSBjYW5ub3QgcHV0IDAgb3IgLTEgaW4gYXMgcGVyIHRoZQorICAgICAgICAqIFNlcnZsZXQgQVBJIHNwZWMuCisgICAgICAgICovCisKKyAgICAgICAgaW50IGNvbnRlbnRMZW5ndGggPSByZXEuZ2V0Q29udGVudExlbmd0aCgpOworICAgICAgICBTdHJpbmcgc0NvbnRlbnRMZW5ndGggPSAoY29udGVudExlbmd0aCA8PSAwID8gIiIgOiAoCisgICAgICAgICAgICBuZXcgSW50ZWdlcihjb250ZW50TGVuZ3RoKSkudG9TdHJpbmcoKSk7CisgICAgICAgIGVudnAucHV0KCJDT05URU5UX0xFTkdUSCIsIHNDb250ZW50TGVuZ3RoKTsKKyAgICAgICAgRW51bWVyYXRpb24gaGVhZGVycyA9IHJlcS5nZXRIZWFkZXJOYW1lcygpOworICAgICAgICBTdHJpbmcgaGVhZGVyID0gbnVsbDsKKyAgICAgICAgd2hpbGUgKGhlYWRlcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIGhlYWRlciA9IG51bGw7CisgICAgICAgICAgICBoZWFkZXIgPSAoKFN0cmluZyloZWFkZXJzLm5leHRFbGVtZW50KCkpLnRvVXBwZXJDYXNlKCk7CisgICAgICAgICAgICAvL1JFTUlORDogcmV3cml0ZSBtdWx0aXBsZSBoZWFkZXJzIGFzIGlmIHJlY2VpdmVkIGFzIHNpbmdsZQorICAgICAgICAgICAgLy9SRU1JTkQ6IGNoYW5nZSBjaGFyYWN0ZXIgc2V0CisgICAgICAgICAgICAvL1JFTUlORDogSSBmb3Jnb3Qgd2hhdCB0aGUgcHJldmlvdXMgUkVNSU5EIG1lYW5zCisgICAgICAgICAgICBpZiAoIkFVVEhPUklaQVRJT04iLmVxdWFsc0lnbm9yZUNhc2UoaGVhZGVyKQorICAgICAgICAgICAgICAgIHx8ICJQUk9YWV9BVVRIT1JJWkFUSU9OIi5lcXVhbHNJZ25vcmVDYXNlKGhlYWRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9OT09QIHBlciBDR0kgc3BlY2lmaWNhdGlvbiBzZWN0aW9uIDExLjIKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIkhPU1QiLmVxdWFsc0lnbm9yZUNhc2UoaGVhZGVyKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBob3N0ID0gcmVxLmdldEhlYWRlcihoZWFkZXIpOworICAgICAgICAgICAgICAgIGVudnAucHV0KCJIVFRQXyIgKyBoZWFkZXIucmVwbGFjZSgnLScsICdfJyksCisgICAgICAgICAgICAgICAgICAgIGhvc3Quc3Vic3RyaW5nKDAsIGhvc3QuaW5kZXhPZigiOiIpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVudnAucHV0KCJIVFRQXyIgKyBoZWFkZXIucmVwbGFjZSgnLScsICdfJyksCisgICAgICAgICAgICAgICAgICAgIHJlcS5nZXRIZWFkZXIoaGVhZGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29tbWFuZCA9IHNDR0lGdWxsUGF0aDsKKyAgICAgICAgd29ya2luZ0RpcmVjdG9yeSA9IG5ldyBGaWxlKGNvbW1hbmQuc3Vic3RyaW5nKDAsCisgICAgICAgICAgICBjb21tYW5kLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSkpOworICAgICAgICBlbnZwLnB1dCgiWF9UT01DQVRfQ09NTUFORF9QQVRIIiwgY29tbWFuZCk7IC8vZm9yIGtpY2tzCisgICAgICAgIHRoaXMuc2V0RW52aXJvbm1lbnQoZW52cCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVzb2x2ZXMgY29yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2dpIHNjcmlwdC4gPHA+IEV4YW1wbGUgVVJJOgorICAgICAqIDxQUkU+IC9zZXJ2bGV0L2NnaWdhdGV3YXkvZGlyMS9yZWFsQ0dJc2NyaXB0L3BhdGhpbmZvMSA8L1BSRT4gPHVsPgorICAgICAqIDxMST48Yj5wYXRoPC9iPiA9ICRDQVRBTElOQV9IT01FL215d2ViYXBwL2RpcjEvcmVhbENHSXNjcmlwdAorICAgICAqIDxMST48Yj5zY3JpcHROYW1lPC9iPiA9IC9zZXJ2bGV0L2NnaWdhdGV3YXkvZGlyMS9yZWFsQ0dJc2NyaXB0PC9MST4KKyAgICAgKiA8TEk+PGI+Y2dpTmFtZTwvYj4gPSAvZGlyMS9yZWFsQ0dJc2NyaXB0CisgICAgICogPExJPjxiPm5hbWU8L2I+ID0gcmVhbENHSXNjcmlwdAorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIENHSSBzZWFyY2ggYWxnb3JpdGhtOiBzZWFyY2ggdGhlIHJlYWwgcGF0aCBiZWxvdworICAgICAqICZsdDtteS13ZWJhcHAtcm9vdCZndDsgYW5kIGZpbmQgdGhlIGZpcnN0IG5vbi1kaXJlY3RvcnkgaW4KKyAgICAgKiB0aGUgZ2V0UGF0aFRyYW5zbGF0ZWQoIi8iKSwgcmVhZGluZy9zZWFyY2hpbmcgZnJvbSBsZWZ0LXRvLXJpZ2h0LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgQ0dJIHNlYXJjaCBwYXRoIHdpbGwgc3RhcnQgYXQKKyAgICAgKiB3ZWJBcHBSb290RGlyICsgRmlsZS5zZXBhcmF0b3IgKyBjZ2lQYXRoUHJlZml4IChvciB3ZWJBcHBSb290RGlyCisgICAgICogYWxvbmUgaWYgY2dpUGF0aFByZWZpeCBpcyBudWxsKS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogY2dpUGF0aFByZWZpeCBpcyB1c3VhbGx5IHNldCBieSB0aGUgY2FsbGluZyBzZXJ2bGV0IHRvIHRoZSBzZXJ2bGV0J3MKKyAgICAgKiBjZ2lQYXRoUHJlZml4IGluaXQgcGFyYW1ldGVyCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGhJbmZvICAgICAgIFN0cmluZyBmcm9tIEh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRQYXRoSW5mbygpCisgICAgICogQHBhcmFtIHdlYkFwcFJvb3REaXIgIFN0cmluZyBmcm9tIGNvbnRleHQuZ2V0UmVhbFBhdGgoIi8iKQorICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCAgICBTdHJpbmcgYXMgZnJvbSBIdHRwU2VydmxldFJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKQorICAgICAqIEBwYXJhbSBzZXJ2bGV0UGF0aCAgICBTdHJpbmcgYXMgZnJvbSBIdHRwU2VydmxldFJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKQorICAgICAqIEBwYXJhbSBjZ2lQYXRoUHJlZml4ICBzdWJkaXJlY3Rvcnkgb2Ygd2ViQXBwUm9vdERpciBiZWxvdyB3aGljaCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgd2ViIGFwcCdzIENHSXMgbWF5IGJlIHN0b3JlZDsgY2FuIGJlIG51bGwuCisgICAgICogQHJldHVybgorICAgICAqIDx1bD4gPGxpPiA8Y29kZT5wYXRoPC9jb2RlPiAgLSAgICBmdWxsIGZpbGUtc3lzdGVtIHBhdGggdG8gdmFsaWQgY2dpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdCwgb3IgbnVsbCBpZiBubyBjZ2kgd2FzIGZvdW5kCisgICAgICogPGxpPiA8Y29kZT5zY3JpcHROYW1lPC9jb2RlPiAtICAgIENHSSB2YXJpYWJsZSBTQ1JJUFRfTkFNRTsgdGhlIGZ1bGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMIHBhdGggdG8gdmFsaWQgY2dpIHNjcmlwdCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIGlmIG5vIGNnaSB3YXMgZm91bmQKKyAgICAgKiA8bGk+IDxjb2RlPmNnaU5hbWU8L2NvZGU+ICAgIC0gICAgc2VydmxldCBwYXRoSW5mbyBmcmFnbWVudAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBjZ2kgc2NyaXB0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZiwgb3IgbnVsbCBpZiBub3QgZm91bmQKKyAgICAgKiA8bGk+IDxjb2RlPm5hbWU8L2NvZGU+ICAgICAgIC0gICAgc2ltcGxlIG5hbWUgKG5vIGRpcmVjdG9yaWVzKSBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2dpIHNjcmlwdCwgb3IgbnVsbCBpZiBubyBjZ2kKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIGZvdW5kCisgICAgICogPC91bD4KKyAgICAgKiBAc2luY2UgVG9tY2F0IDQuMAorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBmaW5kQ0dJKFN0cmluZyBwYXRoSW5mbywgU3RyaW5nIHdlYkFwcFJvb3REaXIsCisgICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCwgU3RyaW5nIHNlcnZsZXRQYXRoLCBTdHJpbmcgY2dpUGF0aFByZWZpeCkgeworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHNjcmlwdG5hbWUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIGNnaW5hbWUgPSBudWxsOworICAgICAgICAgICAgaWYgKCh3ZWJBcHBSb290RGlyICE9IG51bGwpCisgICAgICAgICAgICAgICAgJiYgKHdlYkFwcFJvb3REaXIubGFzdEluZGV4T2YoIi8iKQorICAgICAgICAgICAgICAgID09ICh3ZWJBcHBSb290RGlyLmxlbmd0aCgpIC0gMSkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vc3RyaXAgdGhlIHRyYWlsaW5nICIvIiBmcm9tIHRoZSB3ZWJBcHBSb290RGlyCisgICAgICAgICAgICAgICAgICAgIHdlYkFwcFJvb3REaXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgd2ViQXBwUm9vdERpci5zdWJzdHJpbmcoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh3ZWJBcHBSb290RGlyLmxlbmd0aCgpIC0gMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNnaVBhdGhQcmVmaXggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdlYkFwcFJvb3REaXIgPSB3ZWJBcHBSb290RGlyICsgRmlsZS5zZXBhcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgKyBjZ2lQYXRoUHJlZml4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoImZpbmRDR0k6IHN0YXJ0ID0gWyIgKyB3ZWJBcHBSb290RGlyCisgICAgICAgICAgICAgICAgICAgICsgIl0sIHBhdGhJbmZvID0gWyIgKyBwYXRoSW5mbyArICJdICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmlsZSBjdXJyZW50TG9jYXRpb24gPSBuZXcgRmlsZSh3ZWJBcHBSb290RGlyKTsKKyAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBkaXJXYWxrZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGhJbmZvLCAiLyIpOworICAgICAgICAgICAgd2hpbGUgKCFjdXJyZW50TG9jYXRpb24uaXNGaWxlKCkgJiYgZGlyV2Fsa2VyLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudExvY2F0aW9uID0gbmV3CisgICAgICAgICAgICAgICAgICAgIEZpbGUoY3VycmVudExvY2F0aW9uLCAoU3RyaW5nKSBkaXJXYWxrZXIubmV4dEVsZW1lbnQoKSk7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSAgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoImZpbmRDR0k6IHRyYXZlcnNpbmcgdG8gWyIgKyBjdXJyZW50TG9jYXRpb24gKyAiXSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY3VycmVudExvY2F0aW9uLmlzRmlsZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IG51bGwsIG51bGwsIG51bGwsIG51bGwgfTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSAgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoImZpbmRDR0k6IEZPVU5EIGNnaSBhdCBbIiArIGN1cnJlbnRMb2NhdGlvbiArICJdIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhdGggPSBjdXJyZW50TG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICAgICAgbmFtZSA9IGN1cnJlbnRMb2NhdGlvbi5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgY2dpbmFtZSA9IGN1cnJlbnRMb2NhdGlvbi5nZXRQYXJlbnQoKQorICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKHdlYkFwcFJvb3REaXIubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyBuYW1lOworICAgICAgICAgICAgICAgICAgICBpZiAoIi4iLmVxdWFscyhjb250ZXh0UGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdG5hbWUgPSBzZXJ2bGV0UGF0aCArIGNnaW5hbWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0bmFtZSA9IGNvbnRleHRQYXRoICsgc2VydmxldFBhdGggKyBjZ2luYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoImZpbmRDR0kgY2FsYzogbmFtZT0iICsgbmFtZSArICIsIHBhdGg9IiArIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBzY3JpcHRuYW1lPSIgKyBzY3JpcHRuYW1lICsgIiwgY2dpbmFtZT0iICsgY2dpbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgcGF0aCwgc2NyaXB0bmFtZSwgY2dpbmFtZSwgbmFtZSB9OworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJpbnQgaW1wb3J0YW50IENHSSBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbiBpbiBhbgorICAgICAqIGVhc3ktdG8tcmVhZCBIVE1MIHRhYmxlCisgICAgICogQHJldHVybiAgSFRNTCBzdHJpbmcgY29udGFpbmluZyBDR0kgZW52aXJvbm1lbnQgaW5mbworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8VEFCTEUgYm9yZGVyPTI+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0aCBjb2xzcGFuPTIgYmdjb2xvcj1ncmV5PiIpOworICAgICAgICBzYi5hcHBlbmQoIlByb2Nlc3NFbnZpcm9ubWVudCBJbmZvPC90aD48L3RyPiIpOworICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGQ+RGVidWcgTGV2ZWw8L3RkPjx0ZD4iKTsKKyAgICAgICAgc2IuYXBwZW5kKGRlYnVnKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8L3RkPjwvdHI+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZD5WYWxpZGl0eTo8L3RkPjx0ZD4iKTsKKyAgICAgICAgc2IuYXBwZW5kKGlzVmFsaWQoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48L3RyPiIpOworICAgICAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnZrID0gZW52LmtleXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlbnZrLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKWVudmsubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGQ+Iik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHMpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48dGQ+Iik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGJsYW5rc1RvU3RyaW5nKChTdHJpbmcpZW52LmdldChzKSwKKyAgICAgICAgICAgICAgICAgICAgIlt3aWxsIGJlIHNldCB0byBibGFua10iKSk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48L3RyPiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZCBjb2xzcGFuPTI+PEhSPjwvdGQ+PC90cj4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8dHI+PHRkPkRlcml2ZWQgQ29tbWFuZDwvdGQ+PHRkPiIpOworICAgICAgICBzYi5hcHBlbmQobnVsbHNUb0JsYW5rcyhjb21tYW5kKSk7CisgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48L3RyPiIpOworICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGQ+V29ya2luZyBEaXJlY3Rvcnk8L3RkPjx0ZD4iKTsKKyAgICAgICAgaWYgKHdvcmtpbmdEaXJlY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKHdvcmtpbmdEaXJlY3RvcnkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCI8L3RkPjwvdHI+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZCBjb2xzcGFuPTI+UXVlcnkgUGFyYW1zPC90ZD48L3RyPiIpOworICAgICAgICBFbnVtZXJhdGlvbiBwYXJhbWsgPSBxdWVyeVBhcmFtZXRlcnMua2V5cygpOworICAgICAgICB3aGlsZSAocGFyYW1rLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IHBhcmFtay5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGQ+Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQocyk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjwvdGQ+PHRkPiIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHF1ZXJ5UGFyYW1ldGVycy5nZXQocykudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjwvdGQ+PC90cj4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHNiLmFwcGVuZCgiPC9UQUJMRT48cD5lbmQuIik7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyBwcm9jZXNzJyBkZXJpdmVkIHF1ZXJ5IHBhcmFtZXRlcnMKKyAgICAgKiBAcmV0dXJuICAgcHJvY2VzcycgcXVlcnkgcGFyYW1ldGVycworICAgICAqLworICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0UGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1ldGVyczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0NoYXJzZXRNYXBwZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0NoYXJzZXRNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDM3OGIxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQ2hhcnNldE1hcHBlci5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworCisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0aGF0IGF0dGVtcHRzIHRvIG1hcCBmcm9tIGEgTG9jYWxlIHRvIHRoZSBjb3JyZXNwb25kaW5nCisgKiBjaGFyYWN0ZXIgc2V0IHRvIGJlIHVzZWQgZm9yIGludGVycHJldGluZyBpbnB1dCB0ZXh0IChvciBnZW5lcmF0aW5nCisgKiBvdXRwdXQgdGV4dCkgd2hlbiB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBkb2VzIG5vdCBpbmNsdWRlIG9uZS4gIFlvdQorICogY2FuIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igb2YgdGhpcyBjbGFzcyBieSBtb2RpZnlpbmcgdGhlIG1hcHBpbmcgZGF0YQorICogaXQgbG9hZHMsIG9yIGJ5IHN1YmNsYXNzaW5nIGl0ICh0byBjaGFuZ2UgdGhlIGFsZ29yaXRobSkgYW5kIHRoZW4gdXNpbmcKKyAqIHlvdXIgb3duIHZlcnNpb24gZm9yIGEgcGFydGljdWxhciB3ZWIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkRGF0ZSQgJFZlcnNpb24kCisgKi8KKworcHVibGljIGNsYXNzIENoYXJzZXRNYXBwZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hbmlmZXN0IENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHByb3BlcnRpZXMgcmVzb3VyY2UgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFU09VUkNFID0KKyAgICAgICIvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0NoYXJzZXRNYXBwZXJEZWZhdWx0LnByb3BlcnRpZXMiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgQ2hhcnNldE1hcHBlciB1c2luZyB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyc2V0TWFwcGVyKCkgeworICAgICAgICB0aGlzKERFRkFVTFRfUkVTT1VSQ0UpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IENoYXJzZXRNYXBwZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiBhIHByb3BlcnRpZXMgcmVzb3VyY2UgdG8gYmUgbG9hZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMKKyAgICAgKiAgcmVzb3VyY2UgY291bGQgbm90IGJlIGxvYWRlZCBmb3IgYW55IHJlYXNvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhcnNldE1hcHBlcihTdHJpbmcgbmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0KKyAgICAgICAgICAgICAgdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0obmFtZSk7CisgICAgICAgICAgICBtYXAubG9hZChzdHJlYW0pOworICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBtYXBwaW5nIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIG9yCisgICAgICogZGVmYXVsdCBwcm9wZXJ0aWVzIHJlc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgUHJvcGVydGllcyBtYXAgPSBuZXcgUHJvcGVydGllcygpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZSB0aGUgbmFtZSBvZiBhIGNoYXJhY3RlciBzZXQgdG8gYmUgYXNzdW1lZCwgZ2l2ZW4gdGhlIHNwZWNpZmllZAorICAgICAqIExvY2FsZSBhbmQgdGhlIGFic2VuY2Ugb2YgYSBjaGFyYWN0ZXIgc2V0IHNwZWNpZmllZCBhcyBwYXJ0IG9mIHRoZQorICAgICAqIGNvbnRlbnQgdHlwZSBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgZm9yIHdoaWNoIHRvIGNhbGN1bGF0ZSBhIGNoYXJhY3RlciBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJzZXQoTG9jYWxlIGxvY2FsZSkgeworICAgICAgICAvLyBNYXRjaCBmdWxsIGxhbmd1YWdlX2NvdW50cnlfdmFyaWFudCBmaXJzdCwgdGhlbiBsYW5ndWFnZV9jb3VudHJ5LCAKKyAgICAgICAgLy8gdGhlbiBsYW5ndWFnZSBvbmx5CisgICAgICAgIFN0cmluZyBjaGFyc2V0ID0gbWFwLmdldFByb3BlcnR5KGxvY2FsZS50b1N0cmluZygpKTsKKyAgICAgICAgaWYgKGNoYXJzZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgY2hhcnNldCA9IG1hcC5nZXRQcm9wZXJ0eShsb2NhbGUuZ2V0TGFuZ3VhZ2UoKSArICJfIiAKKyAgICAgICAgICAgICAgICAgICAgKyBsb2NhbGUuZ2V0Q291bnRyeSgpKTsKKyAgICAgICAgICAgIGlmIChjaGFyc2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjaGFyc2V0ID0gbWFwLmdldFByb3BlcnR5KGxvY2FsZS5nZXRMYW5ndWFnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGNoYXJzZXQpOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY2FuIGhhdmUgYQorICAgICAqIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QgZWxlbWVudCB3aGljaCBkZXNjcmliZXMgdGhlCisgICAgICogd2ViYXBwJ3MgZGVzaXJlZCBtYXBwaW5nIGZyb20gbG9jYWxlIHRvIGNoYXJzZXQuICBUaGlzIG1ldGhvZAorICAgICAqIGdldHMgY2FsbGVkIHdoZW4gcHJvY2Vzc2luZyB0aGUgd2ViLnhtbCBmaWxlIGZvciBhIGNvbnRleHQKKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZSBmb3IgYSBjaGFyYWN0ZXIgc2V0CisgICAgICogQHBhcmFtIGNoYXJzZXQgVGhlIGNoYXJzZXQgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2NhbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDaGFyc2V0TWFwcGluZ0Zyb21EZXBsb3ltZW50RGVzY3JpcHRvcihTdHJpbmcgbG9jYWxlLCBTdHJpbmcgY2hhcnNldCkgeworICAgICAgICBtYXAucHV0KGxvY2FsZSwgY2hhcnNldCk7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0NoYXJzZXRNYXBwZXJEZWZhdWx0LnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9DaGFyc2V0TWFwcGVyRGVmYXVsdC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3M2E4ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9DaGFyc2V0TWFwcGVyRGVmYXVsdC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMiBAQAorZW49SVNPLTg4NTktMQorZnI9SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQ29va2llVG9vbHMuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0Nvb2tpZVRvb2xzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM4MzQxMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0Nvb2tpZVRvb2xzLmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCitpbXBvcnQgamF2YS50ZXh0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworCisvLyBYWFggdXNlIG9ubHkgb25lIERhdGUgaW5zdGFuY2UvcmVxdWVzdCwgcmV1c2UgaXQuCisKKy8qKgorICogQ29va2llIHV0aWxzIC0gZ2VuZXJhdGUgY29va2llIGhlYWRlciwgZXRjCisgKgorICogQGF1dGhvciBPcmlnaW5hbCBBdXRob3IgVW5rbm93bgorICogQGF1dGhvciBkdW5jYW5AZW5nLnN1bi5jb20KKyAqLworcHVibGljIGNsYXNzIENvb2tpZVRvb2xzIHsKKworICAgIC8qKiBSZXR1cm4gdGhlIGhlYWRlciBuYW1lIHRvIHNldCB0aGUgY29va2llLCBiYXNlZCBvbiBjb29raWUKKyAgICAgKiAgdmVyc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvb2tpZUhlYWRlck5hbWUoQ29va2llIGNvb2tpZSkgeworICAgICAgICBpbnQgdmVyc2lvbiA9IGNvb2tpZS5nZXRWZXJzaW9uKCk7CisKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuICJTZXQtQ29va2llMiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gIlNldC1Db29raWUiOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFJldHVybiB0aGUgaGVhZGVyIHZhbHVlIHVzZWQgdG8gc2V0IHRoaXMgY29va2llCisgICAgICogIEBkZXByZWNhdGVkIFVzZSBTdHJpbmdCdWZmZXIgdmVyc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvb2tpZUhlYWRlclZhbHVlKENvb2tpZSBjb29raWUpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZ2V0Q29va2llSGVhZGVyVmFsdWUoIGNvb2tpZSwgYnVmICk7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJuIHRoZSBoZWFkZXIgdmFsdWUgdXNlZCB0byBzZXQgdGhpcyBjb29raWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0Q29va2llSGVhZGVyVmFsdWUoQ29va2llIGNvb2tpZSwgU3RyaW5nQnVmZmVyIGJ1ZikgeworICAgICAgICBpbnQgdmVyc2lvbiA9IGNvb2tpZS5nZXRWZXJzaW9uKCk7CisKKyAgICAgICAgLy8gdGhpcyBwYXJ0IGlzIHRoZSBzYW1lIGZvciBhbGwgY29va2llcworCisgICAgICAgIFN0cmluZyBuYW1lID0gY29va2llLmdldE5hbWUoKTsgICAgIC8vIEF2b2lkIE5QRSBvbiBtYWxmb3JtZWQgY29va2llcworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgbmFtZSA9ICIiOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBjb29raWUuZ2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICB2YWx1ZSA9ICIiOworICAgICAgICAKKyAgICAgICAgYnVmLmFwcGVuZChuYW1lKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiPSIpOworICAgICAgICBtYXliZVF1b3RlKHZlcnNpb24sIGJ1ZiwgdmFsdWUpOworCisgICAgICAgIC8vIGFkZCB2ZXJzaW9uIDEgc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgLy8gVmVyc2lvbj0xIC4uLiByZXF1aXJlZAorICAgICAgICAgICAgYnVmLmFwcGVuZCAoIjsgVmVyc2lvbj0xIik7CisKKyAgICAgICAgICAgIC8vIENvbW1lbnQ9Y29tbWVudAorICAgICAgICAgICAgaWYgKGNvb2tpZS5nZXRDb21tZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQgKCI7IENvbW1lbnQ9Iik7CisgICAgICAgICAgICAgICAgbWF5YmVRdW90ZSAodmVyc2lvbiwgYnVmLCBjb29raWUuZ2V0Q29tbWVudCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBkb21haW4gaW5mb3JtYXRpb24sIGlmIHByZXNlbnQKKworICAgICAgICBpZiAoY29va2llLmdldERvbWFpbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjsgRG9tYWluPSIpOworICAgICAgICAgICAgbWF5YmVRdW90ZSAodmVyc2lvbiwgYnVmLCBjb29raWUuZ2V0RG9tYWluKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWF4LUFnZT1zZWNzL0Rpc2NhcmQgLi4uIG9yIHVzZSBvbGQgIkV4cGlyZXMiIGZvcm1hdAorICAgICAgICBpZiAoY29va2llLmdldE1heEFnZSgpID49IDApIHsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kICgiOyBFeHBpcmVzPSIpOworICAgICAgICAgICAgICAgIGlmIChjb29raWUuZ2V0TWF4QWdlKCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgRGF0ZVRvb2wub2xkQ29va2llRm9ybWF0LmZvcm1hdChuZXcgRGF0ZSgxMDAwMCksIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmllbGRQb3NpdGlvbigwKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBEYXRlVG9vbC5vbGRDb29raWVGb3JtYXQuZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAobmV3IERhdGUoIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llLmdldE1heEFnZSgpICoxMDAwTCksIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmllbGRQb3NpdGlvbigwKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQgKCI7IE1heC1BZ2U9Iik7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCAoY29va2llLmdldE1heEFnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDEpCisgICAgICAgICAgYnVmLmFwcGVuZCAoIjsgRGlzY2FyZCIpOworCisgICAgICAgIC8vIFBhdGg9cGF0aAorICAgICAgICBpZiAoY29va2llLmdldFBhdGgoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kICgiOyBQYXRoPSIpOworICAgICAgICAgICAgbWF5YmVRdW90ZSAodmVyc2lvbiwgYnVmLCBjb29raWUuZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlY3VyZQorICAgICAgICBpZiAoY29va2llLmdldFNlY3VyZSgpKSB7CisgICAgICAgICAgYnVmLmFwcGVuZCAoIjsgU2VjdXJlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBtYXliZVF1b3RlIChpbnQgdmVyc2lvbiwgU3RyaW5nQnVmZmVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2ZXJzaW9uID09IDAgfHwgaXNUb2tlbiAodmFsdWUpKQorICAgICAgICAgICAgYnVmLmFwcGVuZCAodmFsdWUpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQgKCciJyk7CisgICAgICAgICAgICBidWYuYXBwZW5kICh2YWx1ZSk7CisgICAgICAgICAgICBidWYuYXBwZW5kICgnIicpOworICAgICAgICB9CisgICAgfQorCisgICAgICAgIC8vCisgICAgLy8gZnJvbSBSRkMgMjA2OCwgdG9rZW4gc3BlY2lhbCBjYXNlIGNoYXJhY3RlcnMKKyAgICAvLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0c3BlY2lhbHMgPSAiKCk8PkAsOzpcXFwiL1tdPz17fSBcdCI7CisKKyAgICAvKgorICAgICAqIFJldHVybiB0cnVlIGlmZiB0aGUgc3RyaW5nIGNvdW50cyBhcyBhbiBIVFRQLzEuMSAidG9rZW4iLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUb2tlbiAoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGludCBsZW4gPSB2YWx1ZS5sZW5ndGggKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gdmFsdWUuY2hhckF0IChpKTsKKworICAgICAgICAgICAgaWYgKGMgPCAweDIwIHx8IGMgPj0gMHg3ZiB8fCB0c3BlY2lhbHMuaW5kZXhPZiAoYykgIT0gLTEpCisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQ3VzdG9tT2JqZWN0SW5wdXRTdHJlYW0uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0N1c3RvbU9iamVjdElucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmN2UxMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0N1c3RvbU9iamVjdElucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3M7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7CisKKy8qKgorICogQ3VzdG9tIHN1YmNsYXNzIG9mIDxjb2RlPk9iamVjdElucHV0U3RyZWFtPC9jb2RlPiB0aGF0IGxvYWRzIGZyb20gdGhlCisgKiBjbGFzcyBsb2FkZXIgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiAgVGhpcyBhbGxvd3MgY2xhc3NlcyBkZWZpbmVkIG9ubHkKKyAqIHdpdGggdGhlIHdlYiBhcHBsaWNhdGlvbiB0byBiZSBmb3VuZCBjb3JyZWN0bHkuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIEJpcCBUaGVsaW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDdXN0b21PYmplY3RJbnB1dFN0cmVhbQorICAgIGV4dGVuZHMgT2JqZWN0SW5wdXRTdHJlYW0geworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3MgbG9hZGVyIHdlIHdpbGwgdXNlIHRvIHJlc29sdmUgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIEN1c3RvbU9iamVjdElucHV0U3RyZWFtCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBpbnB1dCBzdHJlYW0gd2Ugd2lsbCByZWFkIGZyb20KKyAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgVGhlIGNsYXNzIGxvYWRlciB1c2VkIHRvIGluc3RhbnRpYXRlIG9iamVjdHMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBDdXN0b21PYmplY3RJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIHN1cGVyKHN0cmVhbSk7CisgICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExvYWQgdGhlIGxvY2FsIGNsYXNzIGVxdWl2YWxlbnQgb2YgdGhlIHNwZWNpZmllZCBzdHJlYW0gY2xhc3MKKyAgICAgKiBkZXNjcmlwdGlvbiwgYnkgdXNpbmcgdGhlIGNsYXNzIGxvYWRlciBhc3NpZ25lZCB0byB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NEZXNjIENsYXNzIGRlc2NyaXB0aW9uIGZyb20gdGhlIGlucHV0IHN0cmVhbQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoaXMgY2xhc3MgY2Fubm90IGJlIGZvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIENsYXNzIHJlc29sdmVDbGFzcyhPYmplY3RTdHJlYW1DbGFzcyBjbGFzc0Rlc2MpCisgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc0Rlc2MuZ2V0TmFtZSgpLCBmYWxzZSwgY2xhc3NMb2FkZXIpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRyeSBhbHNvIHRoZSBzdXBlcmNsYXNzIGJlY2F1c2Ugb2YgcHJpbWl0aXZlIHR5cGVzCisgICAgICAgICAgICByZXR1cm4gc3VwZXIucmVzb2x2ZUNsYXNzKGNsYXNzRGVzYyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHByb3h5IGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlcyBuYW1lZCBpbiBhIHByb3h5CisgICAgICogY2xhc3MgZGVzY3JpcHRvci4gRG8gdGhpcyB1c2luZyB0aGUgY2xhc3MgbG9hZGVyIGFzc2lnbmVkIHRvIHRoaXMKKyAgICAgKiBDb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzcyByZXNvbHZlUHJveHlDbGFzcyhTdHJpbmdbXSBpbnRlcmZhY2VzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIENsYXNzW10gY2ludGVyZmFjZXMgPSBuZXcgQ2xhc3NbaW50ZXJmYWNlcy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBjaW50ZXJmYWNlc1tpXSA9IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhpbnRlcmZhY2VzW2ldKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIFByb3h5LmdldFByb3h5Q2xhc3MoY2xhc3NMb2FkZXIsIGNpbnRlcmZhY2VzKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG51bGwsIGUpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9ET01Xcml0ZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0RPTVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNjg0ODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9ET01Xcml0ZXIuamF2YQpAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5BdHRyOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCisvKioKKyAqIEEgc2FtcGxlIERPTSB3cml0ZXIuIFRoaXMgc2FtcGxlIHByb2dyYW0gaWxsdXN0cmF0ZXMgaG93IHRvCisgKiB0cmF2ZXJzZSBhIERPTSB0cmVlIGluIG9yZGVyIHRvIHByaW50IGEgZG9jdW1lbnQgdGhhdCBpcyBwYXJzZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBET01Xcml0ZXIgeworCisgICAvLworICAgLy8gRGF0YQorICAgLy8KKworICAgLyoqIERlZmF1bHQgRW5jb2RpbmcgKi8KKyAgIHByaXZhdGUgc3RhdGljICBTdHJpbmcKKyAgIFBSSU5UV1JJVEVSX0VOQ09ESU5HID0gIlVURjgiOworCisgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTUlNRTJKQVZBX0VOQ09ESU5HU1tdID0KKyAgICB7ICJEZWZhdWx0IiwgIlVURi04IiwgIlVTLUFTQ0lJIiwgIklTTy04ODU5LTEiLCAiSVNPLTg4NTktMiIsICJJU08tODg1OS0zIiwgIklTTy04ODU5LTQiLAorICAgICAgIklTTy04ODU5LTUiLCAiSVNPLTg4NTktNiIsICJJU08tODg1OS03IiwgIklTTy04ODU5LTgiLCAiSVNPLTg4NTktOSIsICJJU08tMjAyMi1KUCIsCisgICAgICAiU0hJRlRfSklTIiwgIkVVQy1KUCIsIkdCMjMxMiIsICJCSUc1IiwgIkVVQy1LUiIsICJJU08tMjAyMi1LUiIsICJLT0k4LVIiLCAiRUJDRElDLUNQLVVTIiwKKyAgICAgICJFQkNESUMtQ1AtQ0EiLCAiRUJDRElDLUNQLU5MIiwgIkVCQ0RJQy1DUC1ESyIsICJFQkNESUMtQ1AtTk8iLCAiRUJDRElDLUNQLUZJIiwgIkVCQ0RJQy1DUC1TRSIsCisgICAgICAiRUJDRElDLUNQLUlUIiwgIkVCQ0RJQy1DUC1FUyIsICJFQkNESUMtQ1AtR0IiLCAiRUJDRElDLUNQLUZSIiwgIkVCQ0RJQy1DUC1BUjEiLAorICAgICAgIkVCQ0RJQy1DUC1IRSIsICJFQkNESUMtQ1AtQ0giLCAiRUJDRElDLUNQLVJPRUNFIiwiRUJDRElDLUNQLVlVIiwKKyAgICAgICJFQkNESUMtQ1AtSVMiLCAiRUJDRElDLUNQLUFSMiIsICJVVEYtMTYiCisgICAgfTsKKworICAgLyoqIE91dHB1dCBxdWFsaWZpZWQgbmFtZXMgKi8KKyAgIHByaXZhdGUgYm9vbGVhbiBxdWFsaWZpZWROYW1lcyA9IHRydWU7CisKKyAgIC8qKiBQcmludCB3cml0ZXIuICovCisgICBwcm90ZWN0ZWQgUHJpbnRXcml0ZXIgb3V0OworCisgICAvKiogQ2Fub25pY2FsIG91dHB1dC4gKi8KKyAgIHByb3RlY3RlZCBib29sZWFuIGNhbm9uaWNhbDsKKworCisgICBwdWJsaWMgRE9NV3JpdGVyKFN0cmluZyBlbmNvZGluZywgYm9vbGVhbiBjYW5vbmljYWwpCisgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0LCBlbmNvZGluZykpOworICAgICAgdGhpcy5jYW5vbmljYWwgPSBjYW5vbmljYWw7CisgICB9IC8vIDxpbml0PihTdHJpbmcsYm9vbGVhbikKKworICAgLy8KKyAgIC8vIENvbnN0cnVjdG9ycworICAgLy8KKworICAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IuICovCisgICBwdWJsaWMgRE9NV3JpdGVyKGJvb2xlYW4gY2Fub25pY2FsKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICB0aGlzKCBnZXRXcml0ZXJFbmNvZGluZygpLCBjYW5vbmljYWwpOworICAgfQorCisgICAgcHVibGljIERPTVdyaXRlcihXcml0ZXIgd3JpdGVyLCBib29sZWFuIGNhbm9uaWNhbCkgeworICAgICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKKyAgICAgICAgdGhpcy5jYW5vbmljYWwgPSBjYW5vbmljYWw7CisgICAgfQorCisgICBwdWJsaWMgYm9vbGVhbiBnZXRRdWFsaWZpZWROYW1lcygpIHsKKyAgICAgIHJldHVybiB0aGlzLnF1YWxpZmllZE5hbWVzOworICAgfQorCisgICBwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZWROYW1lcyhib29sZWFuIHF1YWxpZmllZE5hbWVzKSB7CisgICAgICB0aGlzLnF1YWxpZmllZE5hbWVzID0gcXVhbGlmaWVkTmFtZXM7CisgICB9CisKKyAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdyaXRlckVuY29kaW5nKCApIHsKKyAgICAgIHJldHVybiAoUFJJTlRXUklURVJfRU5DT0RJTkcpOworICAgfS8vIGdldFdyaXRlckVuY29kaW5nCisKKyAgIHB1YmxpYyBzdGF0aWMgdm9pZCAgc2V0V3JpdGVyRW5jb2RpbmcoIFN0cmluZyBlbmNvZGluZyApIHsKKyAgICAgIGlmKCBlbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCAiREVGQVVMVCIgKSApCisgICAgICAgICBQUklOVFdSSVRFUl9FTkNPRElORyAgPSAiVVRGOCI7CisgICAgICBlbHNlIGlmKCBlbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCAiVVRGLTE2IiApICkKKyAgICAgICAgIFBSSU5UV1JJVEVSX0VOQ09ESU5HICA9ICJVbmljb2RlIjsKKyAgICAgIGVsc2UKKyAgICAgICAgIFBSSU5UV1JJVEVSX0VOQ09ESU5HID0gTUlNRTJKYXZhLmNvbnZlcnQoIGVuY29kaW5nICk7CisgICB9Ly8gc2V0V3JpdGVyRW5jb2RpbmcKKworCisgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEphdmFFbmNvZGluZyggU3RyaW5nIGVuY29kaW5nICkgeworICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgTUlNRTJKQVZBX0VOQ09ESU5HUy5sZW5ndGg7IGkrKyApCisgICAgICAgICBpZiAoIGVuY29kaW5nLmVxdWFscyggTUlNRTJKQVZBX0VOQ09ESU5HU1tpXSApICkKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisKKyAgICAgIHJldHVybiAoZmFsc2UpOworICAgfS8vIGlzVmFsaWRKYXZhRW5jb2RpbmcKKworCisgICAvKiogUHJpbnRzIHRoZSBzcGVjaWZpZWQgbm9kZSwgcmVjdXJzaXZlbHkuICovCisgICBwdWJsaWMgdm9pZCBwcmludChOb2RlIG5vZGUpIHsKKworICAgICAgLy8gaXMgdGhlcmUgYW55dGhpbmcgdG8gZG8/CisgICAgICBpZiAoIG5vZGUgPT0gbnVsbCApIHsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaW50IHR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7CisgICAgICBzd2l0Y2ggKCB0eXBlICkgeworICAgICAgICAgLy8gcHJpbnQgZG9jdW1lbnQKKyAgICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOiB7CisgICAgICAgICAgICAgICBpZiAoICFjYW5vbmljYWwgKSB7CisgICAgICAgICAgICAgICAgICBTdHJpbmcgIEVuY29kaW5nID0gZ2V0V3JpdGVyRW5jb2RpbmcoKTsKKyAgICAgICAgICAgICAgICAgIGlmKCBFbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCAiREVGQVVMVCIgKSApCisgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZyA9ICJVVEYtOCI7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBFbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCAiVW5pY29kZSIgKSApCisgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZyA9ICJVVEYtMTYiOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmcgPSBNSU1FMkphdmEucmV2ZXJzZSggRW5jb2RpbmcgKTsKKworICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZyArICJcIj8+Iik7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBwcmludCgoKERvY3VtZW50KW5vZGUpLmdldERvY3VtZW50RWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHByaW50IGVsZW1lbnQgd2l0aCBhdHRyaWJ1dGVzCisgICAgICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOiB7CisgICAgICAgICAgICAgICBvdXQucHJpbnQoJzwnKTsKKyAgICAgICAgICAgICAgIGlmICh0aGlzLnF1YWxpZmllZE5hbWVzKSB7IAorICAgICAgICAgICAgICAgICAgb3V0LnByaW50KG5vZGUuZ2V0Tm9kZU5hbWUoKSk7CisgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgb3V0LnByaW50KG5vZGUuZ2V0TG9jYWxOYW1lKCkpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgQXR0ciBhdHRyc1tdID0gc29ydEF0dHJpYnV0ZXMobm9kZS5nZXRBdHRyaWJ1dGVzKCkpOworICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICBBdHRyIGF0dHIgPSBhdHRyc1tpXTsKKyAgICAgICAgICAgICAgICAgIG91dC5wcmludCgnICcpOworICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucXVhbGlmaWVkTmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChhdHRyLmdldE5vZGVOYW1lKCkpOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChhdHRyLmdldExvY2FsTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCI9XCIiKTsKKyAgICAgICAgICAgICAgICAgIG91dC5wcmludChub3JtYWxpemUoYXR0ci5nZXROb2RlVmFsdWUoKSkpOworICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCciJyk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBvdXQucHJpbnQoJz4nKTsKKyAgICAgICAgICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgICAgICAgICBpZiAoIGNoaWxkcmVuICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgIHByaW50KGNoaWxkcmVuLml0ZW0oaSkpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGhhbmRsZSBlbnRpdHkgcmVmZXJlbmNlIG5vZGVzCisgICAgICAgICBjYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOiB7CisgICAgICAgICAgICAgICBpZiAoIGNhbm9uaWNhbCApIHsKKyAgICAgICAgICAgICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgICAgICAgICAgICBpZiAoIGNoaWxkcmVuICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGNoaWxkcmVuLml0ZW0oaSkpOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIG91dC5wcmludCgnJicpOworICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucXVhbGlmaWVkTmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChub2RlLmdldE5vZGVOYW1lKCkpOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChub2RlLmdldExvY2FsTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIG91dC5wcmludCgnOycpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHByaW50IGNkYXRhIHNlY3Rpb25zCisgICAgICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOiB7CisgICAgICAgICAgICAgICBpZiAoIGNhbm9uaWNhbCApIHsKKyAgICAgICAgICAgICAgICAgIG91dC5wcmludChub3JtYWxpemUobm9kZS5nZXROb2RlVmFsdWUoKSkpOworICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiPCFbQ0RBVEFbIik7CisgICAgICAgICAgICAgICAgICBvdXQucHJpbnQobm9kZS5nZXROb2RlVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIl1dPiIpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHByaW50IHRleHQKKyAgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREU6IHsKKyAgICAgICAgICAgICAgIG91dC5wcmludChub3JtYWxpemUobm9kZS5nZXROb2RlVmFsdWUoKSkpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHByaW50IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KKyAgICAgICAgIGNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6IHsKKyAgICAgICAgICAgICAgIG91dC5wcmludCgiPD8iKTsKKyAgICAgICAgICAgICAgIGlmICh0aGlzLnF1YWxpZmllZE5hbWVzKSB7CisgICAgICAgICAgICAgICAgICBvdXQucHJpbnQobm9kZS5nZXROb2RlTmFtZSgpKTsKKyAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBvdXQucHJpbnQobm9kZS5nZXRMb2NhbE5hbWUoKSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIFN0cmluZyBkYXRhID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKKyAgICAgICAgICAgICAgIGlmICggZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwICkgeworICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCcgJyk7CisgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoZGF0YSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBvdXQucHJpbnQoIj8+Iik7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKCB0eXBlID09IE5vZGUuRUxFTUVOVF9OT0RFICkgeworICAgICAgICAgb3V0LnByaW50KCI8LyIpOworICAgICAgICAgaWYgKHRoaXMucXVhbGlmaWVkTmFtZXMpIHsKKyAgICAgICAgICAgIG91dC5wcmludChub2RlLmdldE5vZGVOYW1lKCkpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC5wcmludChub2RlLmdldExvY2FsTmFtZSgpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIG91dC5wcmludCgnPicpOworICAgICAgfQorCisgICAgICBvdXQuZmx1c2goKTsKKworICAgfSAvLyBwcmludChOb2RlKQorCisgICAvKiogUmV0dXJucyBhIHNvcnRlZCBsaXN0IG9mIGF0dHJpYnV0ZXMuICovCisgICBwcm90ZWN0ZWQgQXR0cltdIHNvcnRBdHRyaWJ1dGVzKE5hbWVkTm9kZU1hcCBhdHRycykgeworCisgICAgICBpbnQgbGVuID0gKGF0dHJzICE9IG51bGwpID8gYXR0cnMuZ2V0TGVuZ3RoKCkgOiAwOworICAgICAgQXR0ciBhcnJheVtdID0gbmV3IEF0dHJbbGVuXTsKKyAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGxlbjsgaSsrICkgeworICAgICAgICAgYXJyYXlbaV0gPSAoQXR0cilhdHRycy5pdGVtKGkpOworICAgICAgfQorICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbGVuIC0gMTsgaSsrICkgeworICAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICAgaWYgKHRoaXMucXVhbGlmaWVkTmFtZXMpIHsKKyAgICAgICAgICAgIG5hbWUgID0gYXJyYXlbaV0uZ2V0Tm9kZU5hbWUoKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuYW1lICA9IGFycmF5W2ldLmdldExvY2FsTmFtZSgpOworICAgICAgICAgfQorICAgICAgICAgaW50ICAgIGluZGV4ID0gaTsKKyAgICAgICAgIGZvciAoIGludCBqID0gaSArIDE7IGogPCBsZW47IGorKyApIHsKKyAgICAgICAgICAgIFN0cmluZyBjdXJOYW1lID0gbnVsbDsKKyAgICAgICAgICAgIGlmICh0aGlzLnF1YWxpZmllZE5hbWVzKSB7CisgICAgICAgICAgICAgICBjdXJOYW1lID0gYXJyYXlbal0uZ2V0Tm9kZU5hbWUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICBjdXJOYW1lID0gYXJyYXlbal0uZ2V0TG9jYWxOYW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGN1ck5hbWUuY29tcGFyZVRvKG5hbWUpIDwgMCApIHsKKyAgICAgICAgICAgICAgIG5hbWUgID0gY3VyTmFtZTsKKyAgICAgICAgICAgICAgIGluZGV4ID0gajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGlmICggaW5kZXggIT0gaSApIHsKKyAgICAgICAgICAgIEF0dHIgdGVtcCAgICA9IGFycmF5W2ldOworICAgICAgICAgICAgYXJyYXlbaV0gICAgID0gYXJyYXlbaW5kZXhdOworICAgICAgICAgICAgYXJyYXlbaW5kZXhdID0gdGVtcDsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIChhcnJheSk7CisKKyAgIH0gLy8gc29ydEF0dHJpYnV0ZXMoTmFtZWROb2RlTWFwKTpBdHRyW10KKworCisgICAvKiogTm9ybWFsaXplcyB0aGUgZ2l2ZW4gc3RyaW5nLiAqLworICAgcHJvdGVjdGVkIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHMpIHsKKyAgICAgIFN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgIGludCBsZW4gPSAocyAhPSBudWxsKSA/IHMubGVuZ3RoKCkgOiAwOworICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgICBjaGFyIGNoID0gcy5jaGFyQXQoaSk7CisgICAgICAgICBzd2l0Y2ggKCBjaCApIHsKKyAgICAgICAgICAgIGNhc2UgJzwnOiB7CisgICAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCImbHQ7Iik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgJz4nOiB7CisgICAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCImZ3Q7Iik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgJyYnOiB7CisgICAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCImYW1wOyIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlICciJzogeworICAgICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiJnF1b3Q7Iik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgIGNhc2UgJ1xuJzogeworICAgICAgICAgICAgICAgICAgaWYgKCBjYW5vbmljYWwgKSB7CisgICAgICAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCImIyIpOworICAgICAgICAgICAgICAgICAgICAgc3RyLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGNoKSk7CisgICAgICAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCc7Jyk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIC8vIGVsc2UsIGRlZmF1bHQgYXBwZW5kIGNoYXIKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgIHN0ci5hcHBlbmQoY2gpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gKHN0ci50b1N0cmluZygpKTsKKworICAgfSAvLyBub3JtYWxpemUoU3RyaW5nKTpTdHJpbmcKKworICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFZhbGlkSmF2YUVuY29kaW5nKCkgeworICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiICAgIEVOQ09ESU5HUzoiICk7CisgICAgICBTeXN0ZW0uZXJyLnByaW50KCAiICAgIiApOworICAgICAgZm9yKCBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgICBpIDwgTUlNRTJKQVZBX0VOQ09ESU5HUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgU3lzdGVtLmVyci5wcmludCggTUlNRTJKQVZBX0VOQ09ESU5HU1tpXSArICIgIiApOworICAgICAgaWYoIChpICUgNyApID09IDAgKXsKKyAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigpOworICAgICAgICAgU3lzdGVtLmVyci5wcmludCggIiAgICIgKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgfSAvLyBwcmludEphdmFFbmNvZGluZygpCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0RhdGVUb29sLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9EYXRlVG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YjNkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9EYXRlVG9vbC5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCitpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CisKKy8qKgorICogIENvbW1vbiBwbGFjZSBmb3IgZGF0ZSB1dGlscy4KKyAqCisgKiBAYXV0aG9yIGRhY0Blbmcuc3VuLmNvbQorICogQGF1dGhvciBKYXNvbiBIdW50ZXIgW2pjaEBlbmcuc3VuLmNvbV0KKyAqIEBhdXRob3IgSmFtZXMgVG9kZCBbZ29uem9AZW5nLnN1bi5jb21dCisgKiBAYXV0aG9yIENvc3RpbiBNYW5vbGFjaGUKKyAqLworcHVibGljIGNsYXNzIERhdGVUb29sIHsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoIm9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbCIpOworCisgICAgLyoqCisgICAgICogVVMgbG9jYWxlIC0gYWxsIEhUVFAgZGF0ZXMgYXJlIGluIGVuZ2xpc2gKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIExvY2FsZSBMT0NBTEVfVVMgPSBMb2NhbGUuVVM7CisKKyAgICAvKioKKyAgICAgKiBHTVQgdGltZXpvbmUgLSBhbGwgSFRUUCBkYXRlcyBhcmUgb24gR01UCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBUaW1lWm9uZSBHTVRfWk9ORSA9IFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKTsKKworICAgIC8qKgorICAgICAqIGZvcm1hdCBmb3IgUkZDIDExMjMgZGF0ZSBzdHJpbmcgLS0gIlN1biwgMDYgTm92IDE5OTQgMDg6NDk6MzcgR01UIgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJGQzExMjNfUEFUVEVSTiA9CisgICAgICAgICJFRUUsIGRkIE1NTSB5eXl5eSBISDptbTpzcyB6IjsKKworICAgIC8qKiAKKyAgICAgKiBGb3JtYXQgZm9yIGh0dHAgcmVzcG9uc2UgaGVhZGVyIGRhdGUgZmllbGQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFU1BPTlNFX0RBVEVfSEVBREVSID0KKyAgICAgICAgIkVFRSwgZGQgTU1NIHl5eXkgSEg6bW06c3Mgenp6IjsKKworICAgIC8vIGZvcm1hdCBmb3IgUkZDIDEwMzYgZGF0ZSBzdHJpbmcgLS0gIlN1bmRheSwgMDYtTm92LTk0IDA4OjQ5OjM3IEdNVCIKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgcmZjMTAzNlBhdHRlcm4gPQorICAgICAgICAiRUVFRUVFRUVFLCBkZC1NTU0teXkgSEg6bW06c3MgeiI7CisKKyAgICAvLyBmb3JtYXQgZm9yIEMgYXNjdGltZSgpIGRhdGUgc3RyaW5nIC0tICJTdW4gTm92ICA2IDA4OjQ5OjM3IDE5OTQiCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGFzY3RpbWVQYXR0ZXJuID0KKyAgICAgICAgIkVFRSBNTU0gZCBISDptbTpzcyB5eXl5eSI7CisKKyAgICAvKioKKyAgICAgKiBQYXR0ZXJuIHVzZWQgZm9yIG9sZCBjb29raWVzCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgT0xEX0NPT0tJRV9QQVRURVJOID0gIkVFRSwgZGQtTU1NLXl5eXkgSEg6bW06c3MgeiI7CisKKyAgICAvKioKKyAgICAgKiBEYXRlRm9ybWF0IHRvIGJlIHVzZWQgdG8gZm9ybWF0IGRhdGVzCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBEYXRlRm9ybWF0IHJmYzExMjNGb3JtYXQgPQorICAgICAgICBuZXcgU2ltcGxlRGF0ZUZvcm1hdChSRkMxMTIzX1BBVFRFUk4sIExPQ0FMRV9VUyk7CisKKyAgICAvKioKKyAgICAgKiBEYXRlRm9ybWF0IHRvIGJlIHVzZWQgdG8gZm9ybWF0IG9sZCBuZXRzY2FwZSBjb29raWVzCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBEYXRlRm9ybWF0IG9sZENvb2tpZUZvcm1hdCA9CisgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KE9MRF9DT09LSUVfUEFUVEVSTiwgTE9DQUxFX1VTKTsKKworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRGF0ZUZvcm1hdCByZmMxMDM2Rm9ybWF0ID0KKyAgICAgICAgbmV3IFNpbXBsZURhdGVGb3JtYXQocmZjMTAzNlBhdHRlcm4sIExPQ0FMRV9VUyk7CisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIERhdGVGb3JtYXQgYXNjdGltZUZvcm1hdCA9CisgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KGFzY3RpbWVQYXR0ZXJuLCBMT0NBTEVfVVMpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgcmZjMTEyM0Zvcm1hdC5zZXRUaW1lWm9uZShHTVRfWk9ORSk7CisgICAgICAgIG9sZENvb2tpZUZvcm1hdC5zZXRUaW1lWm9uZShHTVRfWk9ORSk7CisgICAgICAgIHJmYzEwMzZGb3JtYXQuc2V0VGltZVpvbmUoR01UX1pPTkUpOworICAgICAgICBhc2N0aW1lRm9ybWF0LnNldFRpbWVab25lKEdNVF9aT05FKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0VudW1lcmF0b3IuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0VudW1lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDRiNGYxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvRW51bWVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKKworLyoqCisgKiBBZGFwdGVyIGNsYXNzIHRoYXQgd3JhcHMgYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IGFyb3VuZCBhIEphdmEyCisgKiBjb2xsZWN0aW9uIGNsYXNzZXMgb2JqZWN0IDxjb2RlPkl0ZXJhdG9yPC9jb2RlPiBzbyB0aGF0IGV4aXN0aW5nIEFQSXMKKyAqIHJldHVybmluZyBFbnVtZXJhdGlvbnMgY2FuIGVhc2lseSBydW4gb24gdG9wIG9mIHRoZSBuZXcgY29sbGVjdGlvbnMuCisgKiBDb25zdHJ1Y3RvcnMgYXJlIHByb3ZpZGVkIHRvIGVhc2xpeSBjcmVhdGUgc3VjaCB3cmFwcGVycy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEVudW1lcmF0b3IgaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gRW51bWVyYXRpb24gb3ZlciB0aGUgdmFsdWVzIG9mIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIENvbGxlY3Rpb24gd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBlbnVtZXJhdGVkCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0b3IoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7CisKKyAgICAgICAgdGhpcyhjb2xsZWN0aW9uLml0ZXJhdG9yKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gRW51bWVyYXRpb24gb3ZlciB0aGUgdmFsdWVzIG9mIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIENvbGxlY3Rpb24gd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBlbnVtZXJhdGVkCisgICAgICogQHBhcmFtIGNsb25lIHRydWUgdG8gY2xvbmUgaXRlcmF0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRvcihDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGJvb2xlYW4gY2xvbmUpIHsKKworICAgICAgICB0aGlzKGNvbGxlY3Rpb24uaXRlcmF0b3IoKSwgY2xvbmUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gRW51bWVyYXRpb24gb3ZlciB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHRoZQorICAgICAqIHNwZWNpZmllZCBJdGVyYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpdGVyYXRvciBJdGVyYXRvciB0byBiZSB3cmFwcGVkCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0b3IoSXRlcmF0b3IgaXRlcmF0b3IpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBFbnVtZXJhdGlvbiBvdmVyIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlCisgICAgICogc3BlY2lmaWVkIEl0ZXJhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZXJhdG9yIEl0ZXJhdG9yIHRvIGJlIHdyYXBwZWQKKyAgICAgKiBAcGFyYW0gY2xvbmUgdHJ1ZSB0byBjbG9uZSBpdGVyYXRvcgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yLCBib29sZWFuIGNsb25lKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgaWYgKCFjbG9uZSkgeworICAgICAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLml0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyAgIAorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBFbnVtZXJhdGlvbiBvdmVyIHRoZSB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBNYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwIE1hcCB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIGVudW1lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRvcihNYXAgbWFwKSB7CisKKyAgICAgICAgdGhpcyhtYXAudmFsdWVzKCkuaXRlcmF0b3IoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBFbnVtZXJhdGlvbiBvdmVyIHRoZSB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBNYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwIE1hcCB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIGVudW1lcmF0ZWQKKyAgICAgKiBAcGFyYW0gY2xvbmUgdHJ1ZSB0byBjbG9uZSBpdGVyYXRvcgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdG9yKE1hcCBtYXAsIGJvb2xlYW4gY2xvbmUpIHsKKworICAgICAgICB0aGlzKG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpLCBjbG9uZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+SXRlcmF0b3I8L2NvZGU+IG92ZXIgd2hpY2ggdGhlIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPgorICAgICAqIHJlcHJlc2VudGVkIGJ5IHRoaXMgY2xhc3MgYWN0dWFsbHkgb3BlcmF0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBJdGVyYXRvciBpdGVyYXRvciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBpZiB0aGlzIGVudW1lcmF0aW9uIGNvbnRhaW5zIG1vcmUgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoaXMgZW51bWVyYXRpb24gb2JqZWN0CisgICAgICogIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBtb3JlIGVsZW1lbnQgdG8gcHJvdmlkZSwgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICogIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKKworICAgICAgICByZXR1cm4gKGl0ZXJhdG9yLmhhc05leHQoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgZWxlbWVudCBvZiB0aGlzIGVudW1lcmF0aW9uIGlmIHRoaXMgZW51bWVyYXRpb24KKyAgICAgKiBoYXMgYXQgbGVhc3Qgb25lIG1vcmUgZWxlbWVudCB0byBwcm92aWRlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmV4dCBlbGVtZW50IG9mIHRoaXMgZW51bWVyYXRpb24KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiBubyBtb3JlIGVsZW1lbnRzIGV4aXN0CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gKGl0ZXJhdG9yLm5leHQoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvRXh0ZW5zaW9uLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9FeHRlbnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2NiMzk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvRXh0ZW5zaW9uLmphdmEKQEAgLTAsMCArMSwzMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCisKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgZWl0aGVyIGFuIGF2YWlsYWJsZSAiT3B0aW9uYWwgUGFja2FnZSIKKyAqIChmb3JtZXJseSBrbm93biBhcyAiU3RhbmRhcmQgRXh0ZW5zaW9uIikgYXMgZGVzY3JpYmVkIGluIHRoZSBtYW5pZmVzdAorICogb2YgYSBKQVIgZmlsZSwgb3IgdGhlIHJlcXVpcmVtZW50IGZvciBzdWNoIGFuIG9wdGlvbmFsIHBhY2thZ2UuICBJdCBpcworICogdXNlZCB0byBzdXBwb3J0IHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIFNlcnZsZXQgU3BlY2lmaWNhdGlvbiwgdmVyc2lvbgorICogMi4zLCByZWxhdGVkIHRvIHByb3ZpZGluZyBzaGFyZWQgZXh0ZW5zaW9ucyB0byBhbGwgd2ViYXBwcy4KKyAqIDxwPgorICogSW4gYWRkaXRpb24sIHN0YXRpYyB1dGlsaXR5IG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0byBzY2FuIGEgbWFuaWZlc3QKKyAqIGFuZCByZXR1cm4gYW4gYXJyYXkgb2YgZWl0aGVyIGF2YWlsYWJsZSBvciByZXF1aXJlZCBvcHRpb25hbCBtb2R1bGVzCisgKiBkb2N1bWVudGVkIGluIHRoYXQgbWFuaWZlc3QuCisgKiA8cD4KKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG9wdGlvbmFsIHBhY2thZ2VzLCBzZWUgdGhlIGRvY3VtZW50CisgKiA8ZW0+T3B0aW9uYWwgUGFja2FnZSBWZXJzaW9uaW5nPC9lbT4gaW4gdGhlIGRvY3VtZW50YXRpb24gYnVuZGxlIGZvciB5b3VyCisgKiBKYXZhMiBTdGFuZGFyZCBFZGl0aW9uIHBhY2thZ2UsIGluIGZpbGUKKyAqIDxjb2RlPmd1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sPC9jb2RlPi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgSnVzdHluYSBIb3J3YXQKKyAqIEBhdXRob3IgR3JlZyBNdXJyYXkKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEV4dGVuc2lvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb3B0aW9uYWwgcGFja2FnZSBiZWluZyBtYWRlIGF2YWlsYWJsZSwgb3IgcmVxdWlyZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZXh0ZW5zaW9uTmFtZSA9IG51bGw7CisgICAgCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbk5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5leHRlbnNpb25OYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25OYW1lKFN0cmluZyBleHRlbnNpb25OYW1lKSB7CisgICAgICAgIHRoaXMuZXh0ZW5zaW9uTmFtZSA9IGV4dGVuc2lvbk5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIFVSTCBmcm9tIHdoaWNoIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIHRoaXMgb3B0aW9uYWwgcGFja2FnZQorICAgICAqIGNhbiBiZSBvYnRhaW5lZCBpZiBpdCBpcyBub3QgYWxyZWFkeSBpbnN0YWxsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaW1wbGVtZW50YXRpb25VUkwgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblVSTCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmltcGxlbWVudGF0aW9uVVJMKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRhdGlvblVSTChTdHJpbmcgaW1wbGVtZW50YXRpb25VUkwpIHsKKyAgICAgICAgdGhpcy5pbXBsZW1lbnRhdGlvblVSTCA9IGltcGxlbWVudGF0aW9uVVJMOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbXBhbnkgb3Igb3JnYW5pemF0aW9uIHRoYXQgcHJvZHVjZWQgdGhpcworICAgICAqIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgb3B0aW9uYWwgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpbXBsZW1lbnRhdGlvblZlbmRvciA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uVmVuZG9yKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuaW1wbGVtZW50YXRpb25WZW5kb3IpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxlbWVudGF0aW9uVmVuZG9yKFN0cmluZyBpbXBsZW1lbnRhdGlvblZlbmRvcikgeworICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uVmVuZG9yID0gaW1wbGVtZW50YXRpb25WZW5kb3I7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm9kdWNlZCB0aGUgb3B0aW9uYWwKKyAgICAgKiBwYWNrYWdlIGNvbnRhaW5lZCBpbiB0aGlzIEpBUiBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGltcGxlbWVudGF0aW9uVmVuZG9ySWQgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblZlbmRvcklkKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuaW1wbGVtZW50YXRpb25WZW5kb3JJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGVtZW50YXRpb25WZW5kb3JJZChTdHJpbmcgaW1wbGVtZW50YXRpb25WZW5kb3JJZCkgeworICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uVmVuZG9ySWQgPSBpbXBsZW1lbnRhdGlvblZlbmRvcklkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHZlcnNpb24gbnVtYmVyIChkb3R0ZWQgZGVjaW1hbCBub3RhdGlvbikgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgKiBvZiB0aGUgb3B0aW9uYWwgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpbXBsZW1lbnRhdGlvblZlcnNpb24gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5pbXBsZW1lbnRhdGlvblZlcnNpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxlbWVudGF0aW9uVmVyc2lvbihTdHJpbmcgaW1wbGVtZW50YXRpb25WZXJzaW9uKSB7CisgICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb25WZXJzaW9uID0gaW1wbGVtZW50YXRpb25WZXJzaW9uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbXBhbnkgb3Igb3JnYW5pemF0aW9uIHRoYXQgb3JpZ2luYXRlZCB0aGUKKyAgICAgKiBzcGVjaWZpY2F0aW9uIHRvIHdoaWNoIHRoaXMgb3B0aW9uYWwgcGFja2FnZSBjb25mb3Jtcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzcGVjaWZpY2F0aW9uVmVuZG9yID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWNhdGlvblZlbmRvcigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnNwZWNpZmljYXRpb25WZW5kb3IpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNwZWNpZmljYXRpb25WZW5kb3IoU3RyaW5nIHNwZWNpZmljYXRpb25WZW5kb3IpIHsKKyAgICAgICAgdGhpcy5zcGVjaWZpY2F0aW9uVmVuZG9yID0gc3BlY2lmaWNhdGlvblZlbmRvcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSB2ZXJzaW9uIG51bWJlciAoZG90dGVkIGRlY2ltYWwgbm90YXRpb24pIG9mIHRoZSBzcGVjaWZpY2F0aW9uCisgICAgICogdG8gd2hpY2ggdGhpcyBvcHRpb25hbCBwYWNrYWdlIGNvbmZvcm1zLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNwZWNpZmljYXRpb25WZXJzaW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWNhdGlvblZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zcGVjaWZpY2F0aW9uVmVyc2lvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3BlY2lmaWNhdGlvblZlcnNpb24oU3RyaW5nIHNwZWNpZmljYXRpb25WZXJzaW9uKSB7CisgICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvblZlcnNpb24gPSBzcGVjaWZpY2F0aW9uVmVyc2lvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGZ1bGZpbGxlZCBpcyB0cnVlIGlmIGFsbCB0aGUgcmVxdWlyZWQgZXh0ZW5zaW9uIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4KKyAgICAgKiBzYXRpc2ZpZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZnVsZmlsbGVkID0gZmFsc2U7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGdWxmaWxsZWQoYm9vbGVhbiBmdWxmaWxsZWQpIHsKKyAgICAgICAgdGhpcy5mdWxmaWxsZWQgPSBmdWxmaWxsZWQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzRnVsZmlsbGVkKCkgeworICAgICAgICByZXR1cm4gZnVsZmlsbGVkOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+RXh0ZW5zaW9uPC9jb2RlPgorICAgICAqICh3aGljaCByZXByZXNlbnRzIGFuIG9wdGlvbmFsIHBhY2thZ2UgcmVxdWlyZWQgYnkgdGhpcyBhcHBsaWNhdGlvbikKKyAgICAgKiBpcyBzYXRpc2ZpZWQgYnkgdGhpcyA8Y29kZT5FeHRlbnNpb248L2NvZGU+ICh3aGljaCByZXByZXNlbnRzIGFuCisgICAgICogb3B0aW9uYWwgcGFja2FnZSB0aGF0IGlzIGFscmVhZHkgaW5zdGFsbGVkLiAgT3RoZXJ3aXNlLCByZXR1cm4KKyAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWlyZWQgRXh0ZW5zaW9uIG9mIHRoZSByZXF1aXJlZCBvcHRpb25hbCBwYWNrYWdlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlV2l0aChFeHRlbnNpb24gcmVxdWlyZWQpIHsKKworICAgICAgICAvLyBFeHRlbnNpb24gTmFtZSBtdXN0IG1hdGNoCisgICAgICAgIGlmIChleHRlbnNpb25OYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgaWYgKCFleHRlbnNpb25OYW1lLmVxdWFscyhyZXF1aXJlZC5nZXRFeHRlbnNpb25OYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICAgICAgLy8gSWYgc3BlY2lmaWVkLCBhdmFpbGFibGUgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIG11c3QgYmUgPj0gcmVxdWlyZWQKKyAgICAgICAgaWYgKHJlcXVpcmVkLmdldFNwZWNpZmljYXRpb25WZXJzaW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFpc05ld2VyKHNwZWNpZmljYXRpb25WZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkLmdldFNwZWNpZmljYXRpb25WZXJzaW9uKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgc3BlY2lmaWVkLCBJbXBsZW1lbnRhdGlvbiBWZW5kb3IgSUQgbXVzdCBtYXRjaAorICAgICAgICBpZiAocmVxdWlyZWQuZ2V0SW1wbGVtZW50YXRpb25WZW5kb3JJZCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChpbXBsZW1lbnRhdGlvblZlbmRvcklkID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgICAgICBpZiAoIWltcGxlbWVudGF0aW9uVmVuZG9ySWQuZXF1YWxzKHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgIC5nZXRJbXBsZW1lbnRhdGlvblZlbmRvcklkKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgc3BlY2lmaWVkLCBJbXBsZW1lbnRhdGlvbiB2ZXJzaW9uIG11c3QgYmUgPj0gcmVxdWlyZWQKKyAgICAgICAgaWYgKHJlcXVpcmVkLmdldEltcGxlbWVudGF0aW9uVmVyc2lvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghaXNOZXdlcihpbXBsZW1lbnRhdGlvblZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQuZ2V0SW1wbGVtZW50YXRpb25WZXJzaW9uKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBhdmFpbGFibGUgb3B0aW9uYWwgcGFja2FnZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cworICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiRXh0ZW5zaW9uWyIpOworICAgICAgICBzYi5hcHBlbmQoZXh0ZW5zaW9uTmFtZSk7CisgICAgICAgIGlmIChpbXBsZW1lbnRhdGlvblVSTCAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgaW1wbGVtZW50YXRpb25VUkw9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoaW1wbGVtZW50YXRpb25VUkwpOworICAgICAgICB9CisgICAgICAgIGlmIChpbXBsZW1lbnRhdGlvblZlbmRvciAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgaW1wbGVtZW50YXRpb25WZW5kb3I9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoaW1wbGVtZW50YXRpb25WZW5kb3IpOworICAgICAgICB9CisgICAgICAgIGlmIChpbXBsZW1lbnRhdGlvblZlbmRvcklkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBpbXBsZW1lbnRhdGlvblZlbmRvcklkPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGltcGxlbWVudGF0aW9uVmVuZG9ySWQpOworICAgICAgICB9CisgICAgICAgIGlmIChpbXBsZW1lbnRhdGlvblZlcnNpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGltcGxlbWVudGF0aW9uVmVyc2lvbj0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChpbXBsZW1lbnRhdGlvblZlcnNpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChzcGVjaWZpY2F0aW9uVmVuZG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBzcGVjaWZpY2F0aW9uVmVuZG9yPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHNwZWNpZmljYXRpb25WZW5kb3IpOworICAgICAgICB9CisgICAgICAgIGlmIChzcGVjaWZpY2F0aW9uVmVyc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgc3BlY2lmaWNhdGlvblZlcnNpb249Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoc3BlY2lmaWNhdGlvblZlcnNpb24pOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpcnN0IHZlcnNpb24gbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbgorICAgICAqIG9yIGVxdWFsIHRvIHRoZSBzZWNvbmQ7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZpcnN0IEZpcnN0IHZlcnNpb24gbnVtYmVyIChkb3R0ZWQgZGVjaW1hbCkKKyAgICAgKiBAcGFyYW0gc2Vjb25kIFNlY29uZCB2ZXJzaW9uIG51bWJlciAoZG90dGVkIGRlY2ltYWwpCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBvbiBhIG1hbGZvcm1lZCB2ZXJzaW9uIG51bWJlcgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc05ld2VyKFN0cmluZyBmaXJzdCwgU3RyaW5nIHNlY29uZCkKKyAgICAgICAgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKChmaXJzdCA9PSBudWxsKSB8fCAoc2Vjb25kID09IG51bGwpKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIGlmIChmaXJzdC5lcXVhbHMoc2Vjb25kKSkKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIGZUb2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZpcnN0LCAiLiIsIHRydWUpOworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc1RvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2Vjb25kLCAiLiIsIHRydWUpOworICAgICAgICBpbnQgZlZlcnNpb24gPSAwOworICAgICAgICBpbnQgc1ZlcnNpb24gPSAwOworICAgICAgICB3aGlsZSAoZlRvay5oYXNNb3JlVG9rZW5zKCkgfHwgc1Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIGlmIChmVG9rLmhhc01vcmVUb2tlbnMoKSkKKyAgICAgICAgICAgICAgICBmVmVyc2lvbiA9IEludGVnZXIucGFyc2VJbnQoZlRvay5uZXh0VG9rZW4oKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZlZlcnNpb24gPSAwOworICAgICAgICAgICAgaWYgKHNUb2suaGFzTW9yZVRva2VucygpKQorICAgICAgICAgICAgICAgIHNWZXJzaW9uID0gSW50ZWdlci5wYXJzZUludChzVG9rLm5leHRUb2tlbigpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzVmVyc2lvbiA9IDA7CisgICAgICAgICAgICBpZiAoZlZlcnNpb24gPCBzVmVyc2lvbikKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZWZXJzaW9uID4gc1ZlcnNpb24pCisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgIGlmIChmVG9rLmhhc01vcmVUb2tlbnMoKSkgICAvLyBTd2FsbG93IHRoZSBwZXJpb2RzCisgICAgICAgICAgICAgICAgZlRvay5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGlmIChzVG9rLmhhc01vcmVUb2tlbnMoKSkKKyAgICAgICAgICAgICAgICBzVG9rLm5leHRUb2tlbigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICh0cnVlKTsgIC8vIEV4YWN0IG1hdGNoCisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvRXh0ZW5zaW9uVmFsaWRhdG9yLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9FeHRlbnNpb25WYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjhkZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvRXh0ZW5zaW9uVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSw0MjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphcklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuQmluZGluZzsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5SZXNvdXJjZTsKKworCisvKioKKyAqIEVuc3VyZXMgdGhhdCBhbGwgZXh0ZW5zaW9uIGRlcGVuZGllcyBhcmUgcmVzb2x2ZWQgZm9yIGEgV0VCIGFwcGxpY2F0aW9uCisgKiBhcmUgbWV0LiBUaGlzIGNsYXNzIGJ1aWxkcyBhIG1hc3RlciBsaXN0IG9mIGV4dGVuc2lvbnMgYXZhaWxhYmxlIHRvIGFuCisgKiBhcHBsaWNhaXRvbiBhbmQgdGhlbiB2YWxpZGF0ZXMgdGhvc2UgZXh0ZW5zaW9ucy4KKyAqCisgKiBTZWUgaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvc3BlYy5odG1sIGZvcgorICogYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGUgZXh0ZW5zaW9uIG1lY2hhbmlzbSBpbiBKYXZhLgorICoKKyAqIEBhdXRob3IgR3JlZyBNdXJyYXkKKyAqIEBhdXRob3IgSnVzdHluYSBIb3J3YXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRXh0ZW5zaW9uVmFsaWRhdG9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2c9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKEV4dGVuc2lvblZhbGlkYXRvci5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIHJlc291cmNlcyBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoIm9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbCIpOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBjb250YWluZXJBdmFpbGFibGVFeHRlbnNpb25zID0gbnVsbDsKKyAgICBwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY29udGFpbmVyTWFuaWZlc3RSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YXRpYyBJbml0aWFsaXplcgorCisKKyAgICAvKioKKyAgICAgKiAgVGhpcyBzdGF0aWMgaW5pdGlhbGl6ZXIgbG9hZHMgdGhlIGNvbnRhaW5lciBsZXZlbCBleHRlbnNpb25zIHRoYXQgYXJlCisgICAgICogIGF2YWlsYWJsZSB0byBhbGwgd2ViIGFwcGxpY2F0aW9ucy4gVGhpcyBtZXRob2Qgc2NhbnMgYWxsIGV4dGVuc2lvbiAKKyAgICAgKiAgZGlyZWN0b3JpZXMgYXZhaWxhYmxlIHZpYSB0aGUgImphdmEuZXh0LmRpcnMiIFN5c3RlbSBwcm9wZXJ0eS4gCisgICAgICoKKyAgICAgKiAgVGhlIFN5c3RlbSBDbGFzcy1QYXRoIGlzIGFsc28gc2Nhbm5lZCBmb3IgamFyIGZpbGVzIHRoYXQgbWF5IGNvbnRhaW4gCisgICAgICogIGF2YWlsYWJsZSBleHRlbnNpb25zLgorICAgICAqLworICAgIHN0YXRpYyB7CisKKyAgICAgICAgLy8gY2hlY2sgZm9yIGNvbnRhaW5lciBsZXZlbCBvcHRpb25hbCBwYWNrYWdlcworICAgICAgICBTdHJpbmcgc3lzdGVtQ2xhc3NwYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKKworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3RyVG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihzeXN0ZW1DbGFzc3BhdGgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLnBhdGhTZXBhcmF0b3IpOworCisgICAgICAgIC8vIGJ1aWxkIGEgbGlzdCBvZiBqYXIgZmlsZXMgaW4gdGhlIGNsYXNzcGF0aAorICAgICAgICB3aGlsZSAoc3RyVG9rLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGNsYXNzcGF0aEl0ZW0gPSBzdHJUb2submV4dFRva2VuKCk7CisgICAgICAgICAgICBpZiAoY2xhc3NwYXRoSXRlbS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamFyIikpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGl0ZW0gPSBuZXcgRmlsZShjbGFzc3BhdGhJdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3lzdGVtUmVzb3VyY2UoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImV4dGVuc2lvblZhbGlkYXRvci5mYWlsbG9hZCIsIGl0ZW0pLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBzcGVjaWZpZWQgZm9sZGVycyB0byB0aGUgbGlzdAorICAgICAgICBhZGRGb2xkZXJMaXN0KCJqYXZhLmV4dC5kaXJzIik7CisgICAgICAgIGFkZEZvbGRlckxpc3QoImNhdGFsaW5hLmV4dC5kaXJzIik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSdW50aW1lIHZhbGlkYXRpb24gb2YgYSBXZWIgQXBwbGljYWl0b24uCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIEpOREkgdG8gbG9vayB1cCB0aGUgcmVzb3VyY2VzIGxvY2F0ZWQgdW5kZXIgYSAKKyAgICAgKiA8Y29kZT5EaXJDb250ZXh0PC9jb2RlPi4gSXQgbG9jYXRlcyBXZWIgQXBwbGljYXRpb24gTUFOSUZFU1QuTUYgCisgICAgICogZmlsZSBpbiB0aGUgL01FVEEtSU5GLyBkaXJlY3Rvcnkgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCBhbGwgCisgICAgICogTUFOSUZFU1QuTUYgZmlsZXMgaW4gZWFjaCBKQVIgZmlsZSBsb2NhdGVkIGluIHRoZSBXRUItSU5GL2xpYiAKKyAgICAgKiBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgYW4gPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBvZiAKKyAgICAgKiA8Y29kZT5NYW5pZmVzdFJlc29yY2U8Y29kZT4gb2JqZWN0cy4gVGhlc2Ugb2JqZWN0cyBhcmUgdGhlbiBwYXNzZWQgCisgICAgICogdG8gdGhlIHZhbGlkYXRlTWFuaWZlc3RSZXNvdXJjZXMgbWV0aG9kIGZvciB2YWxpZGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGRpckNvbnRleHQgVGhlIEpOREkgcm9vdCBvZiB0aGUgV2ViIEFwcGxpY2F0aW9uCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgZnJvbSB3aGljaCB0aGUgTG9nZ2VyIGFuZCBwYXRoIHRvIHRoZQorICAgICAqICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWxsIHJlcXVpcmVkIGV4dGVuc2lvbnMgc2F0aXNmaWVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB2YWxpZGF0ZUFwcGxpY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpckNvbnRleHQgZGlyQ29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIGFwcE5hbWUgPSBjb250ZXh0LmdldFBhdGgoKTsKKyAgICAgICAgQXJyYXlMaXN0IGFwcE1hbmlmZXN0UmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAvLyBJZiB0aGUgYXBwbGljYXRpb24gY29udGV4dCBpcyBudWxsIGl0IGRvZXMgbm90IGV4aXN0IGFuZCAKKyAgICAgICAgLy8gdGhlcmVmb3JlIGlzIG5vdCB2YWxpZAorICAgICAgICBpZiAoZGlyQ29udGV4dCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIEZpbmQgdGhlIE1hbmlmZXN0IGZvciB0aGUgV2ViIEFwcGxpY2FpdG9uCisgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE5hbWluZ0VudW1lcmF0aW9uIHduZSA9IGRpckNvbnRleHQubGlzdEJpbmRpbmdzKCIvTUVUQS1JTkYvIik7CisgICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgd25lLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAoYmluZGluZy5nZXROYW1lKCkudG9VcHBlckNhc2UoKS5lcXVhbHMoIk1BTklGRVNULk1GIikpIHsKKyAgICAgICAgICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSlkaXJDb250ZXh0Lmxvb2t1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCIvTUVUQS1JTkYvIiArIGJpbmRpbmcuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHJlc291cmNlLnN0cmVhbUNvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBNYW5pZmVzdChpbnB1dFN0cmVhbSk7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgTWFuaWZlc3RSZXNvdXJjZSBtcmUgPSBuZXcgTWFuaWZlc3RSZXNvdXJjZQorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJleHRlbnNpb25WYWxpZGF0b3Iud2ViLWFwcGxpY2F0aW9uLW1hbmlmZXN0IiksCisgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0LCBNYW5pZmVzdFJlc291cmNlLldBUik7CisgICAgICAgICAgICAgICAgYXBwTWFuaWZlc3RSZXNvdXJjZXMuYWRkKG1yZSk7CisgICAgICAgICAgICB9IAorICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gbmV4KSB7CisgICAgICAgICAgICAvLyBBcHBsaWNhdGlvbiBkb2VzIG5vdCBjb250YWluIGEgTUFOSUZFU1QuTUYgZmlsZQorICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5zZSkgeworICAgICAgICAgICAgLy8gQXBwbGljYXRpb24gZG9lcyBub3QgY29udGFpbiBhIE1BTklGRVNULk1GIGZpbGUKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2NhdGUgdGhlIE1hbmlmZXN0cyBmb3IgYWxsIGJ1bmRsZWQgSkFScworICAgICAgICBOYW1pbmdFbnVtZXJhdGlvbiBuZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZGlyQ29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmUgPSBkaXJDb250ZXh0Lmxpc3RCaW5kaW5ncygiV0VCLUlORi9saWIvIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoKG5lICE9IG51bGwpICYmIG5lLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpbmUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJpbmRpbmcuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXIiKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpZGlyQ29udGV4dC5sb29rdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIi9XRUItSU5GL2xpYi8iICsgYmluZGluZy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIE1hbmlmZXN0IGptYW5pZmVzdCA9IGdldE1hbmlmZXN0KHJlc291cmNlLnN0cmVhbUNvbnRlbnQoKSk7CisgICAgICAgICAgICAgICAgaWYgKGptYW5pZmVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0UmVzb3VyY2UgbXJlID0gbmV3IE1hbmlmZXN0UmVzb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptYW5pZmVzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdFJlc291cmNlLkFQUExJQ0FUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgYXBwTWFuaWZlc3RSZXNvdXJjZXMuYWRkKG1yZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gbmV4KSB7CisgICAgICAgICAgICAvLyBKdW1wIG91dCBvZiB0aGUgY2hlY2sgZm9yIHRoaXMgYXBwbGljYXRpb24gYmVjYXVzZSBpdCAKKyAgICAgICAgICAgIC8vIGhhcyBubyByZXNvdXJjZXMKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2YWxpZGF0ZU1hbmlmZXN0UmVzb3VyY2VzKGFwcE5hbWUsIGFwcE1hbmlmZXN0UmVzb3VyY2VzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIHN5c3RlbSBKQVIgZmlsZSBjb250YWlucyBhIE1BTklGRVNULCBhbmQgYWRkcworICAgICAqIGl0IHRvIHRoZSBjb250YWluZXIncyBtYW5pZmVzdCByZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamFyRmlsZSBUaGUgc3lzdGVtIEpBUiB3aG9zZSBtYW5pZmVzdCB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkU3lzdGVtUmVzb3VyY2UoRmlsZSBqYXJGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KG5ldyBGaWxlSW5wdXRTdHJlYW0oamFyRmlsZSkpOworICAgICAgICBpZiAobWFuaWZlc3QgIT0gbnVsbCkgIHsKKyAgICAgICAgICAgIE1hbmlmZXN0UmVzb3VyY2UgbXJlCisgICAgICAgICAgICAgICAgPSBuZXcgTWFuaWZlc3RSZXNvdXJjZShqYXJGaWxlLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdFJlc291cmNlLlNZU1RFTSk7CisgICAgICAgICAgICBjb250YWluZXJNYW5pZmVzdFJlc291cmNlcy5hZGQobXJlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlcyBhIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gb2YgPGNvZGU+TWFuaWZlc3RSZXNvdXJjZTwvY29kZT4gCisgICAgICogb2JqZWN0cy4gVGhpcyBtZXRob2QgcmVxdWlyZXMgYW4gYXBwbGljYXRpb24gbmFtZSAod2hpY2ggaXMgdGhlIAorICAgICAqIGNvbnRleHQgcm9vdCBvZiB0aGUgYXBwbGljYXRpb24gYXQgcnVudGltZSkuICAKKyAgICAgKgorICAgICAqIDxjb2RlPmZhbHNlPC9mYWxzZT4gaXMgcmV0dXJuZWQgaWYgdGhlIGV4dGVuc2lvbiBkZXBlbmRlbmNpZXMKKyAgICAgKiByZXByZXNlbnRlZCBieSBhbnkgZ2l2ZW4gPGNvZGU+TWFuaWZlc3RSZXNvdXJjZTwvY29kZT4gb2JqZWN0cyAKKyAgICAgKiBpcyBub3QgbWV0LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGFsc28gcHJvdmlkZSBzdGF0aWMgdmFsaWRhdGlvbiBvZiBhIFdlYiBBcHBsaWNhaXRvbiAKKyAgICAgKiBpZiBwcm92aWRlZCB3aXRoIHRoZSBuZWNlc3NhcnkgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBOYW1lIFRoZSBuYW1lIG9mIHRoZSBBcHBsaWNhdGlvbiB0aGF0IHdpbGwgYXBwZWFyIGluIHRoZSAKKyAgICAgKiAgICAgICAgICAgICAgICBlcnJvciBtZXNzYWdlcworICAgICAqIEBwYXJhbSByZXNvdXJjZXMgQSBsaXN0IG9mIDxjb2RlPk1hbmlmZXN0UmVzb3VyY2U8L2NvZGU+IG9iamVjdHMgCisgICAgICogICAgICAgICAgICAgICAgICB0byBiZSB2YWxpZGF0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbWFuaWZlc3QgcmVzb3VyY2UgZmlsZSByZXF1aXJlbWVudHMgYXJlIG1ldAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVNYW5pZmVzdFJlc291cmNlcyhTdHJpbmcgYXBwTmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCByZXNvdXJjZXMpIHsKKyAgICAgICAgYm9vbGVhbiBwYXNzZXMgPSB0cnVlOworICAgICAgICBpbnQgZmFpbHVyZUNvdW50ID0gMDsgICAgICAgIAorICAgICAgICBBcnJheUxpc3QgYXZhaWxhYmxlRXh0ZW5zaW9ucyA9IG51bGw7CisKKyAgICAgICAgSXRlcmF0b3IgaXQgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgTWFuaWZlc3RSZXNvdXJjZSBtcmUgPSAoTWFuaWZlc3RSZXNvdXJjZSlpdC5uZXh0KCk7CisgICAgICAgICAgICBBcnJheUxpc3QgcmVxdWlyZWRMaXN0ID0gbXJlLmdldFJlcXVpcmVkRXh0ZW5zaW9ucygpOworICAgICAgICAgICAgaWYgKHJlcXVpcmVkTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGJ1aWxkIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBleHRlbnNpb25zIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgaWYgKGF2YWlsYWJsZUV4dGVuc2lvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGF2YWlsYWJsZUV4dGVuc2lvbnMgPSBidWlsZEF2YWlsYWJsZUV4dGVuc2lvbnNMaXN0KHJlc291cmNlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGxvYWQgdGhlIGNvbnRhaW5lciBsZXZlbCByZXNvdXJjZSBtYXAgaWYgaXQgaGFzIG5vdCBiZWVuIGJ1aWx0CisgICAgICAgICAgICAvLyB5ZXQKKyAgICAgICAgICAgIGlmIChjb250YWluZXJBdmFpbGFibGVFeHRlbnNpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250YWluZXJBdmFpbGFibGVFeHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgID0gYnVpbGRBdmFpbGFibGVFeHRlbnNpb25zTGlzdChjb250YWluZXJNYW5pZmVzdFJlc291cmNlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBvZiByZXF1aXJlZCBleHRlbnNpb25zCisgICAgICAgICAgICBJdGVyYXRvciByaXQgPSByZXF1aXJlZExpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChyaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIEV4dGVuc2lvbiByZXF1aXJlZEV4dCA9IChFeHRlbnNpb24pcml0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgYXBwbGljYWlvbiBpdHNlbGYgZm9yIHRoZSBleHRlbnNpb24KKyAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRXh0ZW5zaW9ucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGFpdCA9IGF2YWlsYWJsZUV4dGVuc2lvbnMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGFpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbiB0YXJnZXRFeHQgPSAoRXh0ZW5zaW9uKSBhaXQubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldEV4dC5pc0NvbXBhdGlibGVXaXRoKHJlcXVpcmVkRXh0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkRXh0LnNldEZ1bGZpbGxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGNvbnRhaW5lciBsZXZlbCBsaXN0IGZvciB0aGUgZXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCAmJiBjb250YWluZXJBdmFpbGFibGVFeHRlbnNpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgY2l0ID0gY29udGFpbmVyQXZhaWxhYmxlRXh0ZW5zaW9ucy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2l0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uIHRhcmdldEV4dCA9IChFeHRlbnNpb24pIGNpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RXh0LmlzQ29tcGF0aWJsZVdpdGgocmVxdWlyZWRFeHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRFeHQuc2V0RnVsZmlsbGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZhaWx1cmUKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgImV4dGVuc2lvblZhbGlkYXRvci5leHRlbnNpb24tbm90LWZvdW5kLWVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcE5hbWUsIG1yZS5nZXRSZXNvdXJjZU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkRXh0LmdldEV4dGVuc2lvbk5hbWUoKSkpOworICAgICAgICAgICAgICAgICAgICBwYXNzZXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbHVyZUNvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwYXNzZXMpIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICJleHRlbnNpb25WYWxpZGF0b3IuZXh0ZW5zaW9uLXZhbGlkYXRpb24tZXJyb3IiLCBhcHBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZUNvdW50ICsgIiIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwYXNzZXM7CisgICAgfQorICAgIAorICAgLyogCisgICAgKiBCdWlsZCB0aGlzIGxpc3Qgb2YgYXZhaWxhYmxlIGV4dGVuc2lvbnMgc28gdGhhdCB3ZSBkbyBub3QgaGF2ZSB0byAKKyAgICAqIHJlLWJ1aWxkIHRoaXMgbGlzdCBldmVyeSB0aW1lIHdlIGl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBvZiByZXF1aXJlZCAKKyAgICAqIGV4dGVuc2lvbnMuIEFsbCBhdmFpbGFibGUgZXh0ZW5zaW9ucyBpbiBhbGwgb2YgdGhlIAorICAgICogPGNvZGU+TWFpbmZlc3RSZXNvdXJjZTwvY29kZT4gb2JqZWN0cyB3aWxsIGJlIGFkZGVkIHRvIGEgCisgICAgKiA8Y29kZT5IYXNoTWFwPC9jb2RlPiB3aGljaCBpcyByZXR1cm5lZCBvbiB0aGUgZmlyc3QgZGVwZW5kZW5jeSBsaXN0CisgICAgKiBwcm9jZXNzaW5nIHBhc3MuIAorICAgICoKKyAgICAqIFRoZSBrZXkgaXMgdGhlIG5hbWUgKyBpbXBsZW1lbnRhdGlvbiB2ZXJzaW9uLgorICAgICoKKyAgICAqIE5PVEU6IEEgbGlzdCBpcyBidWlsdCBvbmx5IGlmIHRoZXJlIGlzIGEgZGVwZW5kZW5jeSB0aGF0IG5lZWRzIAorICAgICogdG8gYmUgY2hlY2tlZCAocGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uKS4KKyAgICAqCisgICAgKiBAcGFyYW0gcmVzb3VyY2VzIEEgbGlzdCBvZiA8Y29kZT5NYW5pZmVzdFJlc291cmNlPC9jb2RlPiBvYmplY3RzCisgICAgKgorICAgICogQHJldHVybiBIYXNoTWFwIE1hcCBvZiBhdmFpbGFibGUgZXh0ZW5zaW9ucworICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGJ1aWxkQXZhaWxhYmxlRXh0ZW5zaW9uc0xpc3QoQXJyYXlMaXN0IHJlc291cmNlcykgeworCisgICAgICAgIEFycmF5TGlzdCBhdmFpbGFibGVMaXN0ID0gbnVsbDsKKworICAgICAgICBJdGVyYXRvciBpdCA9IHJlc291cmNlcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBNYW5pZmVzdFJlc291cmNlIG1yZSA9IChNYW5pZmVzdFJlc291cmNlKWl0Lm5leHQoKTsKKyAgICAgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbXJlLmdldEF2YWlsYWJsZUV4dGVuc2lvbnMoKTsKKyAgICAgICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJdGVyYXRvciB2YWx1ZXMgPSBsaXN0Lml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHZhbHVlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGV4dCA9IChFeHRlbnNpb24pIHZhbHVlcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVMaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVMaXN0LmFkZChleHQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlTGlzdC5hZGQoZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhdmFpbGFibGVMaXN0OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1hbmlmZXN0IGZyb20gYSBqYXIgZmlsZSBvciB3YXIgZmlsZQorICAgICAqCisgICAgICogQHBhcmFtIGluU3RyZWFtIElucHV0IHN0cmVhbSB0byBhIFdBUiBvciBKQVIgZmlsZQorICAgICAqIEByZXR1cm4gVGhlIFdBUidzIG9yIEpBUidzIG1hbmlmZXN0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFuaWZlc3QgZ2V0TWFuaWZlc3QoSW5wdXRTdHJlYW0gaW5TdHJlYW0pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIE1hbmlmZXN0IG1hbmlmZXN0ID0gbnVsbDsKKyAgICAgICAgSmFySW5wdXRTdHJlYW0gamluID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgamluID0gbmV3IEphcklucHV0U3RyZWFtKGluU3RyZWFtKTsKKyAgICAgICAgICAgIG1hbmlmZXN0ID0gamluLmdldE1hbmlmZXN0KCk7CisgICAgICAgICAgICBqaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIGppbiA9IG51bGw7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoamluICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBqaW4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWFuaWZlc3Q7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIEpBUnMgc3BlY2lmaWVkIHRvIHRoZSBleHRlbnNpb24gbGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEZvbGRlckxpc3QoU3RyaW5nIHByb3BlcnR5KSB7CisKKyAgICAgICAgLy8gZ2V0IHRoZSBmaWxlcyBpbiB0aGUgZXh0ZW5zaW9ucyBkaXJlY3RvcnkKKyAgICAgICAgU3RyaW5nIGV4dGVuc2lvbnNEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHkpOworICAgICAgICBpZiAoZXh0ZW5zaW9uc0RpciAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgZXh0ZW5zaW9uc1RvaworICAgICAgICAgICAgICAgID0gbmV3IFN0cmluZ1Rva2VuaXplcihleHRlbnNpb25zRGlyLCBGaWxlLnBhdGhTZXBhcmF0b3IpOworICAgICAgICAgICAgd2hpbGUgKGV4dGVuc2lvbnNUb2suaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgRmlsZSB0YXJnZXREaXIgPSBuZXcgRmlsZShleHRlbnNpb25zVG9rLm5leHRUb2tlbigpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRhcmdldERpci5leGlzdHMoKSB8fCAhdGFyZ2V0RGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZpbGVbXSBmaWxlcyA9IHRhcmdldERpci5saXN0RmlsZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlc1tpXS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphciIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFN5c3RlbVJlc291cmNlKGZpbGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJleHRlbnNpb25WYWxpZGF0b3IuZmFpbGxvYWQiLCBmaWxlc1tpXSksIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvRmFzdERhdGVGb3JtYXQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0Zhc3REYXRlRm9ybWF0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4NGFmMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0Zhc3REYXRlRm9ybWF0LmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CisKKy8qKgorICogRmFzdCBkYXRlIGZvcm1hdHRlciB0aGF0IGNhY2hlcyByZWNlbnRseSBmb3JtYXR0ZWQgZGF0ZSBpbmZvcm1hdGlvbgorICogYW5kIHVzZXMgaXQgdG8gYXZvaWQgdG9vLWZyZXF1ZW50IGNhbGxzIHRvIHRoZSB1bmRlcmx5aW5nCisgKiBmb3JtYXR0ZXIuICBOb3RlOiBicmVha3MgZmllbGRQb3NpdGlvbiBwYXJhbSBvZiBmb3JtYXQoRGF0ZSwKKyAqIFN0cmluZ0J1ZmZlciwgRmllbGRQb3NpdGlvbikuICBJZiB5b3UgY2FyZSBhYm91dCB0aGUgZmllbGQKKyAqIHBvc2l0aW9uLCBjYWxsIHRoZSB1bmRlcmx5aW5nIERhdGVGb3JtYXQgZGlyZWN0bHkuCisgKgorICogQGF1dGhvciBTdGFuIEJhaWxlcworICogQGF1dGhvciBBbGV4IENoYWZmZWUKKyAqKi8KK3B1YmxpYyBjbGFzcyBGYXN0RGF0ZUZvcm1hdCBleHRlbmRzIERhdGVGb3JtYXQgeworICAgIERhdGVGb3JtYXQgICAgZGY7CisgICAgbG9uZyAgICAgICAgICBsYXN0U2VjID0gLTE7CisgICAgU3RyaW5nQnVmZmVyICBzYiAgICAgID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIEZpZWxkUG9zaXRpb24gZnAgICAgICA9IG5ldyBGaWVsZFBvc2l0aW9uKERhdGVGb3JtYXQuTUlMTElTRUNPTkRfRklFTEQpOworCisgICAgcHVibGljIEZhc3REYXRlRm9ybWF0KERhdGVGb3JtYXQgZGYpIHsKKyAgICAgICAgdGhpcy5kZiA9IGRmOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlIHBhcnNlKFN0cmluZyB0ZXh0LCBQYXJzZVBvc2l0aW9uIHBvcykgeworICAgICAgICByZXR1cm4gZGYucGFyc2UodGV4dCwgcG9zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RlOiBicmVha3MgZnVuY3Rpb25hbGl0eSBvZiBmaWVsZFBvc2l0aW9uIHBhcmFtLiBBbHNvOgorICAgICAqIHRoZXJlJ3MgYSBidWcgaW4gU2ltcGxlRGF0ZUZvcm1hdCB3aXRoICJTIiBhbmQgIlNTIiwgdXNlICJTU1MiCisgICAgICogaW5zdGVhZCBpZiB5b3Ugd2FudCBhIG1zZWMgZmllbGQuCisgICAgICoqLworICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0KERhdGUgZGF0ZSwgU3RyaW5nQnVmZmVyIHRvQXBwZW5kVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRQb3NpdGlvbiBmaWVsZFBvc2l0aW9uKSB7CisgICAgICAgIGxvbmcgZHQgPSBkYXRlLmdldFRpbWUoKTsKKyAgICAgICAgbG9uZyBkcyA9IGR0IC8gMTAwMDsKKyAgICAgICAgaWYgKGRzICE9IGxhc3RTZWMpIHsKKyAgICAgICAgICAgIHNiLnNldExlbmd0aCgwKTsKKyAgICAgICAgICAgIGRmLmZvcm1hdChkYXRlLCBzYiwgZnApOworICAgICAgICAgICAgbGFzdFNlYyA9IGRzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbXVuZ2UgY3VycmVudCBtc2VjIGludG8gZXhpc3Rpbmcgc3RyaW5nCisgICAgICAgICAgICBpbnQgbXMgPSAoaW50KShkdCAlIDEwMDApOworICAgICAgICAgICAgaW50IHBvcyA9IGZwLmdldEVuZEluZGV4KCk7CisgICAgICAgICAgICBpbnQgYmVnaW4gPSBmcC5nZXRCZWdpbkluZGV4KCk7CisgICAgICAgICAgICBpZiAocG9zID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChwb3MgPiBiZWdpbikKKyAgICAgICAgICAgICAgICAgICAgc2Iuc2V0Q2hhckF0KC0tcG9zLCBDaGFyYWN0ZXIuZm9yRGlnaXQobXMgJSAxMCwgMTApKTsKKyAgICAgICAgICAgICAgICBtcyAvPSAxMDsKKyAgICAgICAgICAgICAgICBpZiAocG9zID4gYmVnaW4pCisgICAgICAgICAgICAgICAgICAgIHNiLnNldENoYXJBdCgtLXBvcywgQ2hhcmFjdGVyLmZvckRpZ2l0KG1zICUgMTAsIDEwKSk7CisgICAgICAgICAgICAgICAgbXMgLz0gMTA7CisgICAgICAgICAgICAgICAgaWYgKHBvcyA+IGJlZ2luKQorICAgICAgICAgICAgICAgICAgICBzYi5zZXRDaGFyQXQoLS1wb3MsIENoYXJhY3Rlci5mb3JEaWdpdChtcyAlIDEwLCAxMCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRvQXBwZW5kVG8uYXBwZW5kKHNiLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gdG9BcHBlbmRUbzsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFN0cmluZyBmb3JtYXQgPSAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MiOworICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKQorICAgICAgICAgICAgZm9ybWF0ID0gYXJnc1swXTsKKyAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChmb3JtYXQpOworICAgICAgICBGYXN0RGF0ZUZvcm1hdCBmZGYgPSBuZXcgRmFzdERhdGVGb3JtYXQoc2RmKTsKKyAgICAgICAgRGF0ZSBkID0gbmV3IERhdGUoKTsKKworICAgICAgICBkLnNldFRpbWUoMSk7IFN5c3RlbS5vdXQucHJpbnRsbihmZGYuZm9ybWF0KGQpICsgIlx0IiArIHNkZi5mb3JtYXQoZCkpOworICAgICAgICBkLnNldFRpbWUoMjApOyBTeXN0ZW0ub3V0LnByaW50bG4oZmRmLmZvcm1hdChkKSArICJcdCIgKyBzZGYuZm9ybWF0KGQpKTsKKyAgICAgICAgZC5zZXRUaW1lKDUwMCk7IFN5c3RlbS5vdXQucHJpbnRsbihmZGYuZm9ybWF0KGQpICsgIlx0IiArIHNkZi5mb3JtYXQoZCkpOworICAgICAgICBkLnNldFRpbWUoNTQzKTsgU3lzdGVtLm91dC5wcmludGxuKGZkZi5mb3JtYXQoZCkgKyAiXHQiICsgc2RmLmZvcm1hdChkKSk7CisgICAgICAgIGQuc2V0VGltZSg5OTkpOyBTeXN0ZW0ub3V0LnByaW50bG4oZmRmLmZvcm1hdChkKSArICJcdCIgKyBzZGYuZm9ybWF0KGQpKTsKKyAgICAgICAgZC5zZXRUaW1lKDEwNTApOyBTeXN0ZW0ub3V0LnByaW50bG4oZmRmLmZvcm1hdChkKSArICJcdCIgKyBzZGYuZm9ybWF0KGQpKTsKKyAgICAgICAgZC5zZXRUaW1lKDI1NDMpOyBTeXN0ZW0ub3V0LnByaW50bG4oZmRmLmZvcm1hdChkKSArICJcdCIgKyBzZGYuZm9ybWF0KGQpKTsKKyAgICAgICAgZC5zZXRUaW1lKDEyMzQ1KTsgU3lzdGVtLm91dC5wcmludGxuKGZkZi5mb3JtYXQoZCkgKyAiXHQiICsgc2RmLmZvcm1hdChkKSk7CisgICAgICAgIGQuc2V0VGltZSgxMjM0MCk7IFN5c3RlbS5vdXQucHJpbnRsbihmZGYuZm9ybWF0KGQpICsgIlx0IiArIHNkZi5mb3JtYXQoZCkpOworCisgICAgICAgIGZpbmFsIGludCByZXBzID0gMTAwMDAwOworICAgICAgICB7CisgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgICAgIGQuc2V0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgZmRmLmZvcm1hdChkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvbmcgZWxhcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZhc3Q6ICIgKyBlbGFwICsgIiBlbGFwc2VkIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmRmLmZvcm1hdChkKSk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkLnNldFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgIHNkZi5mb3JtYXQoZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb25nIGVsYXAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzbG93OiAiICsgZWxhcCArICIgZWxhcHNlZCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNkZi5mb3JtYXQoZCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvSGV4VXRpbHMuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0hleFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1ZTYzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0hleFV0aWxzLmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CisKKy8qKgorICogTGlicmFyeSBvZiB1dGlsaXR5IG1ldGhvZHMgdXNlZnVsIGluIGRlYWxpbmcgd2l0aCBjb252ZXJ0aW5nIGJ5dGUgYXJyYXlzCisgKiB0byBhbmQgZnJvbSBzdHJpbmdzIG9mIGhleGFkZWNpbWFsIGRpZ2l0cy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgSGV4VXRpbHMgeworICAgIC8vIENvZGUgZnJvbSBBanAxMSwgZnJvbSBBcGFjaGUncyBKU2VydgorCisgICAgLy8gVGFibGUgZm9yIEhFWCB0byBERUMgYnl0ZSB0cmFuc2xhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gREVDID0geworICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAwMCwgMDEsIDAyLCAwMywgMDQsIDA1LCAwNiwgMDcsICA4LCAgOSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgLTEsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAtMSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICB9OworCisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoIm9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbCIpOworCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgU3RyaW5nIG9mIGhleGFkZWNpbWFsIGRpZ2l0cyBpbnRvIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICogYnl0ZSBhcnJheSBieSBlbmNvZGluZyBlYWNoIHR3byBoZXhhZGVjaW1hbCBkaWdpdHMgYXMgYSBieXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGRpZ2l0cyBIZXhhZGVjaW1hbCBkaWdpdHMgcmVwcmVzZW50YXRpb24KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFuIGludmFsaWQgaGV4YWRlY2ltYWwgZGlnaXQKKyAgICAgKiAgaXMgZm91bmQsIG9yIHRoZSBpbnB1dCBzdHJpbmcgY29udGFpbnMgYW4gb2RkIG51bWJlciBvZiBoZXhhZGVjaW1hbAorICAgICAqICBkaWdpdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBjb252ZXJ0KFN0cmluZyBkaWdpdHMpIHsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWdpdHMubGVuZ3RoKCk7IGkgKz0gMikgeworICAgICAgICAgICAgY2hhciBjMSA9IGRpZ2l0cy5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoKGkrMSkgPj0gZGlnaXRzLmxlbmd0aCgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiaGV4VXRpbC5vZGQiKSk7CisgICAgICAgICAgICBjaGFyIGMyID0gZGlnaXRzLmNoYXJBdChpICsgMSk7CisgICAgICAgICAgICBieXRlIGIgPSAwOworICAgICAgICAgICAgaWYgKChjMSA+PSAnMCcpICYmIChjMSA8PSAnOScpKQorICAgICAgICAgICAgICAgIGIgKz0gKChjMSAtICcwJykgKiAxNik7CisgICAgICAgICAgICBlbHNlIGlmICgoYzEgPj0gJ2EnKSAmJiAoYzEgPD0gJ2YnKSkKKyAgICAgICAgICAgICAgICBiICs9ICgoYzEgLSAnYScgKyAxMCkgKiAxNik7CisgICAgICAgICAgICBlbHNlIGlmICgoYzEgPj0gJ0EnKSAmJiAoYzEgPD0gJ0YnKSkKKyAgICAgICAgICAgICAgICBiICs9ICgoYzEgLSAnQScgKyAxMCkgKiAxNik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJoZXhVdGlsLmJhZCIpKTsKKyAgICAgICAgICAgIGlmICgoYzIgPj0gJzAnKSAmJiAoYzIgPD0gJzknKSkKKyAgICAgICAgICAgICAgICBiICs9IChjMiAtICcwJyk7CisgICAgICAgICAgICBlbHNlIGlmICgoYzIgPj0gJ2EnKSAmJiAoYzIgPD0gJ2YnKSkKKyAgICAgICAgICAgICAgICBiICs9IChjMiAtICdhJyArIDEwKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKChjMiA+PSAnQScpICYmIChjMiA8PSAnRicpKQorICAgICAgICAgICAgICAgIGIgKz0gKGMyIC0gJ0EnICsgMTApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiaGV4VXRpbC5iYWQiKSk7CisgICAgICAgICAgICBiYW9zLndyaXRlKGIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoYmFvcy50b0J5dGVBcnJheSgpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29udmVydCBhIGJ5dGUgYXJyYXkgaW50byBhIHByaW50YWJsZSBmb3JtYXQgY29udGFpbmluZyBhCisgICAgICogU3RyaW5nIG9mIGhleGFkZWNpbWFsIGRpZ2l0IGNoYXJhY3RlcnMgKHR3byBwZXIgYnl0ZSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnl0ZXMgQnl0ZSBhcnJheSByZXByZXNlbnRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnQoYnl0ZSBieXRlc1tdKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihieXRlcy5sZW5ndGggKiAyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc2IuYXBwZW5kKGNvbnZlcnREaWdpdCgoaW50KSAoYnl0ZXNbaV0gPj4gNCkpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChjb252ZXJ0RGlnaXQoKGludCkgKGJ5dGVzW2ldICYgMHgwZikpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCA0IGhleCBkaWdpdHMgdG8gYW4gaW50LCBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgY29udmVydGVkCisgICAgICogYnl0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGV4IEJ5dGUgYXJyYXkgY29udGFpbmluZyBleGFjdGx5IGZvdXIgaGV4YWRlY2ltYWwgZGlnaXRzCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbiBpbnZhbGlkIGhleGFkZWNpbWFsIGRpZ2l0CisgICAgICogIGlzIGluY2x1ZGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgY29udmVydDJJbnQoIGJ5dGVbXSBoZXggKSB7CisgICAgICAgIC8vIENvZGUgZnJvbSBBanAxMSwgZnJvbSBBcGFjaGUncyBKU2VydgorCisgICAgICAgIC8vIGFzc2VydCBiLmxlbmd0aD09NAorICAgICAgICAvLyBhc3NlcnQgdmFsaWQgZGF0YQorICAgICAgICBpbnQgbGVuOworICAgICAgICBpZihoZXgubGVuZ3RoIDwgNCApIHJldHVybiAwOworICAgICAgICBpZiggREVDW2hleFswXV08MCApCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHNtLmdldFN0cmluZygiaGV4VXRpbC5iYWQiKSk7CisgICAgICAgIGxlbiA9IERFQ1toZXhbMF1dOworICAgICAgICBsZW4gPSBsZW4gPDwgNDsKKyAgICAgICAgaWYoIERFQ1toZXhbMV1dPDAgKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihzbS5nZXRTdHJpbmcoImhleFV0aWwuYmFkIikpOworICAgICAgICBsZW4gKz0gREVDW2hleFsxXV07CisgICAgICAgIGxlbiA9IGxlbiA8PCA0OworICAgICAgICBpZiggREVDW2hleFsyXV08MCApCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHNtLmdldFN0cmluZygiaGV4VXRpbC5iYWQiKSk7CisgICAgICAgIGxlbiArPSBERUNbaGV4WzJdXTsKKyAgICAgICAgbGVuID0gbGVuIDw8IDQ7CisgICAgICAgIGlmKCBERUNbaGV4WzNdXTwwICkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oc20uZ2V0U3RyaW5nKCJoZXhVdGlsLmJhZCIpKTsKKyAgICAgICAgbGVuICs9IERFQ1toZXhbM11dOworICAgICAgICByZXR1cm4gbGVuOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBbUHJpdmF0ZV0gQ29udmVydCB0aGUgc3BlY2lmaWVkIHZhbHVlICgwIC4uIDE1KSB0byB0aGUgY29ycmVzcG9uZGluZworICAgICAqIGhleGFkZWNpbWFsIGRpZ2l0LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNoYXIgY29udmVydERpZ2l0KGludCB2YWx1ZSkgeworCisgICAgICAgIHZhbHVlICY9IDB4MGY7CisgICAgICAgIGlmICh2YWx1ZSA+PSAxMCkKKyAgICAgICAgICAgIHJldHVybiAoKGNoYXIpICh2YWx1ZSAtIDEwICsgJ2EnKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAoKGNoYXIpICh2YWx1ZSArICcwJykpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0lPVG9vbHMuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0lPVG9vbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2YxZGJjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvSU9Ub29scy5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CisKKworLyoqCisgKiBDb250YWlucyBjb21tb25seSBuZWVkZWQgSS9PLXJlbGF0ZWQgbWV0aG9kcyAKKyAqCisgKiBAYXV0aG9yIERhbiBTYW5kYmVyZworICovCitwdWJsaWMgY2xhc3MgSU9Ub29scyB7CisgICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9CVUZGRVJfU0laRT00KjEwMjQ7IC8vNGsKKworICAgIC8vRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkKKyAgICBwcml2YXRlIElPVG9vbHMoKSB7CisgICAgfQorCisgICAgIC8qKgorICAgICAqIFJlYWQgaW5wdXQgZnJvbSByZWFkZXIgYW5kIHdyaXRlIGl0IHRvIHdyaXRlciB1bnRpbCB0aGVyZSBpcyBubyBtb3JlCisgICAgICogaW5wdXQgZnJvbSByZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIgdG8gcmVhZCBmcm9tLgorICAgICAqIEBwYXJhbSB3cml0ZXIgdGhlIHdyaXRlciB0byB3cml0ZSB0by4KKyAgICAgKiBAcGFyYW0gYnVmIHRoZSBjaGFyIGFycmF5IHRvIHVzZSBhcyBhIGJ1ZmZlcngKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmxvdyggUmVhZGVyIHJlYWRlciwgV3JpdGVyIHdyaXRlciwgY2hhcltdIGJ1ZiApIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgbnVtUmVhZDsKKyAgICAgICAgd2hpbGUgKCAobnVtUmVhZCA9IHJlYWRlci5yZWFkKGJ1ZikgKSA+PSAwKSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoYnVmLCAwLCBudW1SZWFkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgI2Zsb3coIFJlYWRlciwgV3JpdGVyLCBjaGFyW10gKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmbG93KCBSZWFkZXIgcmVhZGVyLCBXcml0ZXIgd3JpdGVyICkgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcltERUZBVUxUX0JVRkZFUl9TSVpFXTsKKyAgICAgICAgZmxvdyggcmVhZGVyLCB3cml0ZXIsIGJ1ZiApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgaW5wdXQgZnJvbSBpbnB1dCBzdHJlYW0gYW5kIHdyaXRlIGl0IHRvIG91dHB1dCBzdHJlYW0gCisgICAgICogdW50aWwgdGhlcmUgaXMgbm8gbW9yZSBpbnB1dCBmcm9tIGlucHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpcyBpbnB1dCBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20uCisgICAgICogQHBhcmFtIG9zIG91dHB1dCBzdHJlYW0gdGhlIG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICogQHBhcmFtIGJ1ZiB0aGUgYnl0ZSBhcnJheSB0byB1c2UgYXMgYSBidWZmZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmxvdyggSW5wdXRTdHJlYW0gaXMsIE91dHB1dFN0cmVhbSBvcywgYnl0ZVtdIGJ1ZiApIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgbnVtUmVhZDsKKyAgICAgICAgd2hpbGUgKCAobnVtUmVhZCA9IGlzLnJlYWQoYnVmKSApID49IDApIHsKKyAgICAgICAgICAgIG9zLndyaXRlKGJ1ZiwgMCwgbnVtUmVhZCk7CisgICAgICAgIH0KKyAgICB9ICAKKworICAgIC8qKgorICAgICAqIEBzZWUgI2Zsb3coIGphdmEuaW8uSW5wdXRTdHJlYW0sIGphdmEuaW8uT3V0cHV0U3RyZWFtLCBieXRlW10gKQorICAgICAqLyAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmxvdyggSW5wdXRTdHJlYW0gaXMsIE91dHB1dFN0cmVhbSBvcyApIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbREVGQVVMVF9CVUZGRVJfU0laRV07CisgICAgICAgIGZsb3coIGlzLCBvcywgYnVmICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvSW5zdGFuY2VTdXBwb3J0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9JbnN0YW5jZVN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDU2MGZlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvSW5zdGFuY2VTdXBwb3J0LmphdmEKQEAgLTAsMCArMSwzNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkluc3RhbmNlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5JbnN0YW5jZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuV3JhcHBlcjsKKworCisvKioKKyAqIFN1cHBvcnQgY2xhc3MgdG8gYXNzaXN0IGluIGZpcmluZyBJbnN0YW5jZUV2ZW50IG5vdGlmaWNhdGlvbnMgdG8KKyAqIHJlZ2lzdGVyZWQgSW5zdGFuY2VMaXN0ZW5lcnMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkSWQkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEluc3RhbmNlU3VwcG9ydCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgSW5zdGFuY2VTdXBwb3J0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIEluc3RhbmNlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cmFwcGVyIFRoZSBjb21wb25lbnQgdGhhdCB3aWxsIGJlIHRoZSBzb3VyY2UKKyAgICAgKiAgb2YgZXZlbnRzIHRoYXQgd2UgZmlyZQorICAgICAqLworICAgIHB1YmxpYyBJbnN0YW5jZVN1cHBvcnQoV3JhcHBlciB3cmFwcGVyKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgcmVnaXN0ZXJlZCBJbnN0YW5jZUxpc3RlbmVycyBmb3IgZXZlbnQgbm90aWZpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEluc3RhbmNlTGlzdGVuZXIgbGlzdGVuZXJzW10gPSBuZXcgSW5zdGFuY2VMaXN0ZW5lclswXTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNvdXJjZSBjb21wb25lbnQgZm9yIGluc3RhbmNlIGV2ZW50cyB0aGF0IHdlIHdpbGwgZmlyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFdyYXBwZXIgd3JhcHBlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFdyYXBwZXIgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV3JhcHBlciBnZXRXcmFwcGVyKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy53cmFwcGVyKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSW5zdGFuY2VMaXN0ZW5lcihJbnN0YW5jZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgIHN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7CisgICAgICAgICAgSW5zdGFuY2VMaXN0ZW5lciByZXN1bHRzW10gPQorICAgICAgICAgICAgbmV3IEluc3RhbmNlTGlzdGVuZXJbbGlzdGVuZXJzLmxlbmd0aCArIDFdOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICByZXN1bHRzW2ldID0gbGlzdGVuZXJzW2ldOworICAgICAgICAgIHJlc3VsdHNbbGlzdGVuZXJzLmxlbmd0aF0gPSBsaXN0ZW5lcjsKKyAgICAgICAgICBsaXN0ZW5lcnMgPSByZXN1bHRzOworICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgYWxsIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lcnMgdGhhdCBhIHBhcnRpY3VsYXIgZXZlbnQgaGFzCisgICAgICogb2NjdXJyZWQgZm9yIHRoaXMgQ29udGFpbmVyLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGVyZm9ybXMKKyAgICAgKiB0aGlzIG5vdGlmaWNhdGlvbiBzeW5jaHJvbm91c2x5IHVzaW5nIHRoZSBjYWxsaW5nIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUKKyAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSByZWxldmFudCBGaWx0ZXIgZm9yIHRoaXMgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaXJlSW5zdGFuY2VFdmVudChTdHJpbmcgdHlwZSwgRmlsdGVyIGZpbHRlcikgeworCisgICAgICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgSW5zdGFuY2VFdmVudCBldmVudCA9IG5ldyBJbnN0YW5jZUV2ZW50KHdyYXBwZXIsIGZpbHRlciwgdHlwZSk7CisgICAgICAgIEluc3RhbmNlTGlzdGVuZXIgaW50ZXJlc3RlZFtdID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGludGVyZXN0ZWQgPSAoSW5zdGFuY2VMaXN0ZW5lcltdKSBsaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZXN0ZWQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpbnRlcmVzdGVkW2ldLmluc3RhbmNlRXZlbnQoZXZlbnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgYWxsIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lcnMgdGhhdCBhIHBhcnRpY3VsYXIgZXZlbnQgaGFzCisgICAgICogb2NjdXJyZWQgZm9yIHRoaXMgQ29udGFpbmVyLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGVyZm9ybXMKKyAgICAgKiB0aGlzIG5vdGlmaWNhdGlvbiBzeW5jaHJvbm91c2x5IHVzaW5nIHRoZSBjYWxsaW5nIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUKKyAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSByZWxldmFudCBGaWx0ZXIgZm9yIHRoaXMgZXZlbnQKKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIEV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlyZUluc3RhbmNlRXZlbnQoU3RyaW5nIHR5cGUsIEZpbHRlciBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCisgICAgICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgSW5zdGFuY2VFdmVudCBldmVudCA9IG5ldyBJbnN0YW5jZUV2ZW50KHdyYXBwZXIsIGZpbHRlciwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbik7CisgICAgICAgIEluc3RhbmNlTGlzdGVuZXIgaW50ZXJlc3RlZFtdID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGludGVyZXN0ZWQgPSAoSW5zdGFuY2VMaXN0ZW5lcltdKSBsaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZXN0ZWQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpbnRlcmVzdGVkW2ldLmluc3RhbmNlRXZlbnQoZXZlbnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgYWxsIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lcnMgdGhhdCBhIHBhcnRpY3VsYXIgZXZlbnQgaGFzCisgICAgICogb2NjdXJyZWQgZm9yIHRoaXMgQ29udGFpbmVyLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGVyZm9ybXMKKyAgICAgKiB0aGlzIG5vdGlmaWNhdGlvbiBzeW5jaHJvbm91c2x5IHVzaW5nIHRoZSBjYWxsaW5nIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUKKyAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSByZWxldmFudCBGaWx0ZXIgZm9yIHRoaXMgZXZlbnQKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlyZUluc3RhbmNlRXZlbnQoU3RyaW5nIHR5cGUsIEZpbHRlciBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKworICAgICAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEluc3RhbmNlRXZlbnQgZXZlbnQgPSBuZXcgSW5zdGFuY2VFdmVudCh3cmFwcGVyLCBmaWx0ZXIsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIEluc3RhbmNlTGlzdGVuZXIgaW50ZXJlc3RlZFtdID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGludGVyZXN0ZWQgPSAoSW5zdGFuY2VMaXN0ZW5lcltdKSBsaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZXN0ZWQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpbnRlcmVzdGVkW2ldLmluc3RhbmNlRXZlbnQoZXZlbnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgYWxsIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lcnMgdGhhdCBhIHBhcnRpY3VsYXIgZXZlbnQgaGFzCisgICAgICogb2NjdXJyZWQgZm9yIHRoaXMgQ29udGFpbmVyLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGVyZm9ybXMKKyAgICAgKiB0aGlzIG5vdGlmaWNhdGlvbiBzeW5jaHJvbm91c2x5IHVzaW5nIHRoZSBjYWxsaW5nIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUKKyAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSByZWxldmFudCBGaWx0ZXIgZm9yIHRoaXMgZXZlbnQKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBFeGNlcHRpb24gdGhhdCBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpcmVJbnN0YW5jZUV2ZW50KFN0cmluZyB0eXBlLCBGaWx0ZXIgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBleGNlcHRpb24pIHsKKworICAgICAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEluc3RhbmNlRXZlbnQgZXZlbnQgPSBuZXcgSW5zdGFuY2VFdmVudCh3cmFwcGVyLCBmaWx0ZXIsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LCByZXNwb25zZSwgZXhjZXB0aW9uKTsKKyAgICAgICAgSW5zdGFuY2VMaXN0ZW5lciBpbnRlcmVzdGVkW10gPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgeworICAgICAgICAgICAgaW50ZXJlc3RlZCA9IChJbnN0YW5jZUxpc3RlbmVyW10pIGxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJlc3RlZC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGludGVyZXN0ZWRbaV0uaW5zdGFuY2VFdmVudChldmVudCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE5vdGlmeSBhbGwgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVycyB0aGF0IGEgcGFydGljdWxhciBldmVudCBoYXMKKyAgICAgKiBvY2N1cnJlZCBmb3IgdGhpcyBDb250YWluZXIuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcworICAgICAqIHRoaXMgbm90aWZpY2F0aW9uIHN5bmNocm9ub3VzbHkgdXNpbmcgdGhlIGNhbGxpbmcgdGhyZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgRXZlbnQgdHlwZQorICAgICAqIEBwYXJhbSBzZXJ2bGV0IFRoZSByZWxldmFudCBTZXJ2bGV0IGZvciB0aGlzIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlyZUluc3RhbmNlRXZlbnQoU3RyaW5nIHR5cGUsIFNlcnZsZXQgc2VydmxldCkgeworCisgICAgICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgSW5zdGFuY2VFdmVudCBldmVudCA9IG5ldyBJbnN0YW5jZUV2ZW50KHdyYXBwZXIsIHNlcnZsZXQsIHR5cGUpOworICAgICAgICBJbnN0YW5jZUxpc3RlbmVyIGludGVyZXN0ZWRbXSA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpbnRlcmVzdGVkID0gKEluc3RhbmNlTGlzdGVuZXJbXSkgbGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmVzdGVkLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaW50ZXJlc3RlZFtpXS5pbnN0YW5jZUV2ZW50KGV2ZW50KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTm90aWZ5IGFsbCBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXJzIHRoYXQgYSBwYXJ0aWN1bGFyIGV2ZW50IGhhcworICAgICAqIG9jY3VycmVkIGZvciB0aGlzIENvbnRhaW5lci4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHBlcmZvcm1zCisgICAgICogdGhpcyBub3RpZmljYXRpb24gc3luY2hyb25vdXNseSB1c2luZyB0aGUgY2FsbGluZyB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlCisgICAgICogQHBhcmFtIHNlcnZsZXQgVGhlIHJlbGV2YW50IFNlcnZsZXQgZm9yIHRoaXMgZXZlbnQKKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIEV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlyZUluc3RhbmNlRXZlbnQoU3RyaW5nIHR5cGUsIFNlcnZsZXQgc2VydmxldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisKKyAgICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBJbnN0YW5jZUV2ZW50IGV2ZW50ID0gbmV3IEluc3RhbmNlRXZlbnQod3JhcHBlciwgc2VydmxldCwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbik7CisgICAgICAgIEluc3RhbmNlTGlzdGVuZXIgaW50ZXJlc3RlZFtdID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGludGVyZXN0ZWQgPSAoSW5zdGFuY2VMaXN0ZW5lcltdKSBsaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZXN0ZWQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpbnRlcmVzdGVkW2ldLmluc3RhbmNlRXZlbnQoZXZlbnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgYWxsIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lcnMgdGhhdCBhIHBhcnRpY3VsYXIgZXZlbnQgaGFzCisgICAgICogb2NjdXJyZWQgZm9yIHRoaXMgQ29udGFpbmVyLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGVyZm9ybXMKKyAgICAgKiB0aGlzIG5vdGlmaWNhdGlvbiBzeW5jaHJvbm91c2x5IHVzaW5nIHRoZSBjYWxsaW5nIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUKKyAgICAgKiBAcGFyYW0gc2VydmxldCBUaGUgcmVsZXZhbnQgU2VydmxldCBmb3IgdGhpcyBldmVudAorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaXJlSW5zdGFuY2VFdmVudChTdHJpbmcgdHlwZSwgU2VydmxldCBzZXJ2bGV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisKKyAgICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBJbnN0YW5jZUV2ZW50IGV2ZW50ID0gbmV3IEluc3RhbmNlRXZlbnQod3JhcHBlciwgc2VydmxldCwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgSW5zdGFuY2VMaXN0ZW5lciBpbnRlcmVzdGVkW10gPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgeworICAgICAgICAgICAgaW50ZXJlc3RlZCA9IChJbnN0YW5jZUxpc3RlbmVyW10pIGxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJlc3RlZC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGludGVyZXN0ZWRbaV0uaW5zdGFuY2VFdmVudChldmVudCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE5vdGlmeSBhbGwgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVycyB0aGF0IGEgcGFydGljdWxhciBldmVudCBoYXMKKyAgICAgKiBvY2N1cnJlZCBmb3IgdGhpcyBDb250YWluZXIuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcworICAgICAqIHRoaXMgbm90aWZpY2F0aW9uIHN5bmNocm9ub3VzbHkgdXNpbmcgdGhlIGNhbGxpbmcgdGhyZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgRXZlbnQgdHlwZQorICAgICAqIEBwYXJhbSBzZXJ2bGV0IFRoZSByZWxldmFudCBTZXJ2bGV0IGZvciB0aGlzIGV2ZW50CisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSBleGNlcHRpb24gRXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaXJlSW5zdGFuY2VFdmVudChTdHJpbmcgdHlwZSwgU2VydmxldCBzZXJ2bGV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBleGNlcHRpb24pIHsKKworICAgICAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEluc3RhbmNlRXZlbnQgZXZlbnQgPSBuZXcgSW5zdGFuY2VFdmVudCh3cmFwcGVyLCBzZXJ2bGV0LCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwgcmVzcG9uc2UsIGV4Y2VwdGlvbik7CisgICAgICAgIEluc3RhbmNlTGlzdGVuZXIgaW50ZXJlc3RlZFtdID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGludGVyZXN0ZWQgPSAoSW5zdGFuY2VMaXN0ZW5lcltdKSBsaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZXN0ZWQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpbnRlcmVzdGVkW2ldLmluc3RhbmNlRXZlbnQoZXZlbnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlSW5zdGFuY2VMaXN0ZW5lcihJbnN0YW5jZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGludCBuID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbiA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBJbnN0YW5jZUxpc3RlbmVyIHJlc3VsdHNbXSA9CisgICAgICAgICAgICAgIG5ldyBJbnN0YW5jZUxpc3RlbmVyW2xpc3RlbmVycy5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gbikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tqKytdID0gbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdGVuZXJzID0gcmVzdWx0czsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0xpZmVjeWNsZVN1cHBvcnQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0xpZmVjeWNsZVN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmZlMjVkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTGlmZWN5Y2xlU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworCisKKy8qKgorICogU3VwcG9ydCBjbGFzcyB0byBhc3Npc3QgaW4gZmlyaW5nIExpZmVjeWNsZUV2ZW50IG5vdGlmaWNhdGlvbnMgdG8KKyAqIHJlZ2lzdGVyZWQgTGlmZWN5Y2xlTGlzdGVuZXJzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJElkJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBMaWZlY3ljbGVTdXBwb3J0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBMaWZlY3ljbGVTdXBwb3J0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIExpZmVjeWNsZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlmZWN5Y2xlIFRoZSBMaWZlY3ljbGUgY29tcG9uZW50IHRoYXQgd2lsbCBiZSB0aGUgc291cmNlCisgICAgICogIG9mIGV2ZW50cyB0aGF0IHdlIGZpcmUKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlU3VwcG9ydChMaWZlY3ljbGUgbGlmZWN5Y2xlKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5saWZlY3ljbGUgPSBsaWZlY3ljbGU7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIGNvbXBvbmVudCBmb3IgbGlmZWN5Y2xlIGV2ZW50cyB0aGF0IHdlIHdpbGwgZmlyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpZmVjeWNsZSBsaWZlY3ljbGUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIHJlZ2lzdGVyZWQgTGlmZWN5Y2xlTGlzdGVuZXJzIGZvciBldmVudCBub3RpZmljYXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXJzW10gPSBuZXcgTGlmZWN5Y2xlTGlzdGVuZXJbMF07CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgIHN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7CisgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgcmVzdWx0c1tdID0KKyAgICAgICAgICAgIG5ldyBMaWZlY3ljbGVMaXN0ZW5lcltsaXN0ZW5lcnMubGVuZ3RoICsgMV07CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSBsaXN0ZW5lcnNbaV07CisgICAgICAgICAgcmVzdWx0c1tsaXN0ZW5lcnMubGVuZ3RoXSA9IGxpc3RlbmVyOworICAgICAgICAgIGxpc3RlbmVycyA9IHJlc3VsdHM7CisgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlmZWN5Y2xlIGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaWZlY3ljbGUuIElmIHRoaXMgCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiBsaXN0ZW5lcnM7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE5vdGlmeSBhbGwgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVycyB0aGF0IGEgcGFydGljdWxhciBldmVudCBoYXMKKyAgICAgKiBvY2N1cnJlZCBmb3IgdGhpcyBDb250YWluZXIuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcworICAgICAqIHRoaXMgbm90aWZpY2F0aW9uIHN5bmNocm9ub3VzbHkgdXNpbmcgdGhlIGNhbGxpbmcgdGhyZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgRXZlbnQgdHlwZQorICAgICAqIEBwYXJhbSBkYXRhIEV2ZW50IGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaXJlTGlmZWN5Y2xlRXZlbnQoU3RyaW5nIHR5cGUsIE9iamVjdCBkYXRhKSB7CisKKyAgICAgICAgTGlmZWN5Y2xlRXZlbnQgZXZlbnQgPSBuZXcgTGlmZWN5Y2xlRXZlbnQobGlmZWN5Y2xlLCB0eXBlLCBkYXRhKTsKKyAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgaW50ZXJlc3RlZFtdID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGludGVyZXN0ZWQgPSAoTGlmZWN5Y2xlTGlzdGVuZXJbXSkgbGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmVzdGVkLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaW50ZXJlc3RlZFtpXS5saWZlY3ljbGVFdmVudChldmVudCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpbnQgbiA9IC0xOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgIG4gPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgcmVzdWx0c1tdID0KKyAgICAgICAgICAgICAgbmV3IExpZmVjeWNsZUxpc3RlbmVyW2xpc3RlbmVycy5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gbikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tqKytdID0gbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdGVuZXJzID0gcmVzdWx0czsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4Y2Y3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTEgQEAKK3BhcmFtZXRlck1hcC5sb2NrZWQ9Tm8gbW9kaWZpY2F0aW9ucyBhcmUgYWxsb3dlZCB0byBhIGxvY2tlZCBQYXJhbWV0ZXJNYXAKK3Jlc291cmNlU2V0LmxvY2tlZD1ObyBtb2RpZmljYXRpb25zIGFyZSBhbGxvd2VkIHRvIGEgbG9ja2VkIFJlc291cmNlU2V0CitoZXhVdGlsLmJhZD1CYWQgaGV4YWRlY2ltYWwgZGlnaXQKK2hleFV0aWwub2RkPU9kZCBudW1iZXIgb2YgaGV4YWRlY2ltYWwgZGlnaXRzCisjRGVmYXVsdCBNZXNzYWdlcyBVdGlsaXplZCBieSB0aGUgRXh0ZW5zaW9uVmFsaWRhdG9yCitleHRlbnNpb25WYWxpZGF0b3Iud2ViLWFwcGxpY2F0aW9uLW1hbmlmZXN0PVdlYiBBcHBsaWNhdGlvbiBNYW5pZmVzdAorZXh0ZW5zaW9uVmFsaWRhdG9yLmV4dGVuc2lvbi1ub3QtZm91bmQtZXJyb3I9RXh0ZW5zaW9uVmFsaWRhdG9yW3swfV1bezF9XTogUmVxdWlyZWQgZXh0ZW5zaW9uICJ7Mn0iIG5vdCBmb3VuZC4KK2V4dGVuc2lvblZhbGlkYXRvci5leHRlbnNpb24tdmFsaWRhdGlvbi1lcnJvcj1FeHRlbnNpb25WYWxpZGF0b3JbezB9XTogRmFpbHVyZSB0byBmaW5kIHsxfSByZXF1aXJlZCBleHRlbnNpb24ocykuCitleHRlbnNpb25WYWxpZGF0b3IuZmFpbGxvYWQ9RmFpbHVyZSBsb2FkaW5nIGV4dGVuc2lvbiB7MH0KK1NlY3VyaXR5VXRpbC5kb0FzUHJpdmlsZWdlPUFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hlbiBydW5uaW5nIHRoZSBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIGJsb2NrLgorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMTY0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDEwIEBACitwYXJhbWV0ZXJNYXAubG9ja2VkPU5vIHNlIHBlcm1pdGVuIG1vZGlmaWNhY2lvbmVzIGVuIHVuIFBhcmFtZXRlck1hcCBibG9xdWVhZG8KK3Jlc291cmNlU2V0LmxvY2tlZD1ObyBzZSBwZXJtaXRlbiBtb2RpZmljYWNpb25lcyBlbiB1biBSZXNvdXJjZVNldCBibG9xdWVhZG8KK2hleFV0aWwuYmFkPUTtZ2l0byBoZXhhZGVjaW1hbCBpbmNvcnJlY3RvCitoZXhVdGlsLm9kZD1O+m1lcm8gZGUgZO1naXRvcyBoZXhhZGVjaW1hbGVzIGltcGFyCisjRGVmYXVsdCBNZXNzYWdlcyBVdGlsaXplZCBieSB0aGUgRXh0ZW5zaW9uVmFsaWRhdG9yCitleHRlbnNpb25WYWxpZGF0b3Iud2ViLWFwcGxpY2F0aW9uLW1hbmlmZXN0PU1hbmlmaWVzdG8gZGUgQXBsaWNhY2nzbiBXZWIKK2V4dGVuc2lvblZhbGlkYXRvci5leHRlbnNpb24tbm90LWZvdW5kLWVycm9yPUV4dGVuc2lvblZhbGlkYXRvclt7MH1dW3sxfV06IExhIGV4dGVuc2nzbiBubyBlbmN1ZW50cmEgZWwgInsyfSIgcmVxdWVyaWRvLgorZXh0ZW5zaW9uVmFsaWRhdG9yLmV4dGVuc2lvbi12YWxpZGF0aW9uLWVycm9yPUV4dGVuc2lvblZhbGlkYXRvclt7MH1dOiBJbXBvc2libGUgZGUgaGFsbGFyIGxhKHMpIGV4dGVuc2lvbihlcykgezF9IHJlcXVlcmlkYShzKS4KK1NlY3VyaXR5VXRpbC5kb0FzUHJpdmlsZWdlPVVuYSBleGNlcGNp824gc2UgaGEgcHJvZHVjaWRvIGR1cmFudGUgbGEgZWplY3VjafNuIGRlbCBibG9xdWUgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbi4KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzY2MjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMCBAQAorcGFyYW1ldGVyTWFwLmxvY2tlZD1BdWN1bmUgbW9kaWZpY2F0aW9uIG4nJ2VzdCBhdXRob3Jpc+llIHN1ciB1biBQYXJhbWV0ZXJNYXAgdulycm91aWxs6QorcmVzb3VyY2VTZXQubG9ja2VkPUF1Y3VuZSBtb2RpZmljYXRpb24gbicnZXN0IGF1dGhvcmlz6WUgc3VyIHVuIFJlc291cmNlU2V0IHbpcnJvdWlsbOkKK2hleFV0aWwuYmFkPU1hdXZhaXMgZGlnaXQgaGV4YWRlY2ltYWwKK2hleFV0aWwub2RkPU5vbWJyZSBpbXBhaXIgZGUgZGlnaXRzIGhleGFkZWNpbWF1eAorI0RlZmF1bHQgTWVzc2FnZXMgVXRpbGl6ZWQgYnkgdGhlIEV4dGVuc2lvblZhbGlkYXRvcgorZXh0ZW5zaW9uVmFsaWRhdG9yLndlYi1hcHBsaWNhdGlvbi1tYW5pZmVzdD1XZWIgQXBwbGljYXRpb24gTWFuaWZlc3QKK2V4dGVuc2lvblZhbGlkYXRvci5leHRlbnNpb24tbm90LWZvdW5kLWVycm9yPUV4dGVuc2lvblZhbGlkYXRvclt7MH1dW3sxfV06IEwnJ2V4dGVuc2lvbiByZXF1aXNlICJ7Mn0iIGVzdCBpbnRyb3V2YWJsZS4KK2V4dGVuc2lvblZhbGlkYXRvci5leHRlbnNpb24tdmFsaWRhdGlvbi1lcnJvcj1FeHRlbnNpb25WYWxpZGF0b3JbezB9XTogSW1wb3NzaWJsZSBkZSB0cm91dmVyIHsxfSBleHRlbnNpb24ocykgcmVxdWlzZShzKS4KK1NlY3VyaXR5VXRpbC5kb0FzUHJpdmlsZWdlPVVuZSBleGNlcHRpb24gcycnZXN0IHByb2R1aXRlIGxvcnMgZGUgbCcnZXhlY3V0aW9uIGR1IGJsb2MgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbi4KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWVlYjAwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMSBAQAorcGFyYW1ldGVyTWFwLmxvY2tlZD1cdTMwZWRcdTMwYzNcdTMwYWZcdTMwNTVcdTMwOGNcdTMwNWZQYXJhbWV0ZXJNYXBcdTMwNmZcdTU5MDlcdTY2ZjRcdTMwNGNcdThhMzFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTMKK3Jlc291cmNlU2V0LmxvY2tlZD1cdTMwZWRcdTMwYzNcdTMwYWZcdTMwNTVcdTMwOGNcdTMwNWZSZXNvdXJjZVNldFx1MzA2Zlx1NTkwOVx1NjZmNFx1MzA0Y1x1OGEzMVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5MworaGV4VXRpbC5iYWQ9XHU3MTIxXHU1MmI5XHUzMDZhMTZcdTkwMzJcdTY1NzBcdTUwMjRcdTMwNjdcdTMwNTkKK2hleFV0aWwub2RkPVx1NTk0N1x1NjU3MFx1Njg0MVx1MzA2ZTE2XHU5MDMyXHU2NTcwXHU1MDI0XHUzMDY3XHUzMDU5CisjRGVmYXVsdCBNZXNzYWdlcyBVdGlsaXplZCBieSB0aGUgRXh0ZW5zaW9uVmFsaWRhdG9yCitleHRlbnNpb25WYWxpZGF0b3Iud2ViLWFwcGxpY2F0aW9uLW1hbmlmZXN0PVdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBkZVx1MzBjYlx1MzBkNVx1MzBhN1x1MzBiOVx1MzBjOAorZXh0ZW5zaW9uVmFsaWRhdG9yLmV4dGVuc2lvbi1ub3QtZm91bmQtZXJyb3I9RXh0ZW5zaW9uVmFsaWRhdG9yW3swfV1bezF9XTogXHU1ZmM1XHU4OTgxXHUzMDZhXHU2MmUxXHU1ZjM1ICJ7Mn0iIFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMgorZXh0ZW5zaW9uVmFsaWRhdG9yLmV4dGVuc2lvbi12YWxpZGF0aW9uLWVycm9yPUV4dGVuc2lvblZhbGlkYXRvclt7MH1dOiBcdTVmYzVcdTg5ODFcdTMwNmFcdTYyZTFcdTVmMzUgInsxfSIgXHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCitleHRlbnNpb25WYWxpZGF0b3IuZmFpbGxvYWQ9XHU2MmUxXHU1ZjM1IHswfSBcdTMwNmVcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK1NlY3VyaXR5VXRpbC5kb0FzUHJpdmlsZWdlPVByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb25cdTMwZDZcdTMwZWRcdTMwYzNcdTMwYWZcdTMwOTJcdTViOWZcdTg4NGNcdTRlMmRcdTMwNmJcdTRmOGJcdTU5MTZcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTUQ1RW5jb2Rlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTUQ1RW5jb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDMxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9NRDVFbmNvZGVyLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKKworLyoqCisgKiBFbmNvZGUgYW4gTUQ1IGRpZ2VzdCBpbnRvIGEgU3RyaW5nLgorICogPHA+CisgKiBUaGUgMTI4IGJpdCBNRDUgaGFzaCBpcyBjb252ZXJ0ZWQgaW50byBhIDMyIGNoYXJhY3RlciBsb25nIFN0cmluZy4KKyAqIEVhY2ggY2hhcmFjdGVyIG9mIHRoZSBTdHJpbmcgaXMgdGhlIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIDQgYml0cworICogb2YgdGhlIGRpZ2VzdC4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBNRDVFbmNvZGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBoZXhhZGVjaW1hbCA9CisgICAgeycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKKyAgICAgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJ307CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHRoZSAxMjggYml0ICgxNiBieXRlcykgTUQ1IGludG8gYSAzMiBjaGFyYWN0ZXIgU3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmFyeURhdGEgQXJyYXkgY29udGFpbmluZyB0aGUgZGlnZXN0CisgICAgICogQHJldHVybiBFbmNvZGVkIE1ENSwgb3IgbnVsbCBpZiBlbmNvZGluZyBmYWlsZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZSggYnl0ZVtdIGJpbmFyeURhdGEgKSB7CisKKyAgICAgICAgaWYgKGJpbmFyeURhdGEubGVuZ3RoICE9IDE2KQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzMyXTsKKworICAgICAgICBmb3IgKGludCBpPTA7IGk8MTY7IGkrKykgeworICAgICAgICAgICAgaW50IGxvdyA9IChpbnQpIChiaW5hcnlEYXRhW2ldICYgMHgwZik7CisgICAgICAgICAgICBpbnQgaGlnaCA9IChpbnQpICgoYmluYXJ5RGF0YVtpXSAmIDB4ZjApID4+IDQpOworICAgICAgICAgICAgYnVmZmVyW2kqMl0gPSBoZXhhZGVjaW1hbFtoaWdoXTsKKyAgICAgICAgICAgIGJ1ZmZlcltpKjIgKyAxXSA9IGhleGFkZWNpbWFsW2xvd107CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIpOworCisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTUlNRTJKYXZhLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9NSU1FMkphdmEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzFjMTc3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTUlNRTJKYXZhLmphdmEKQEAgLTAsMCArMSw2MDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIE1JTUUySmF2YSBpcyBhIGNvbnZlbmllbmNlIGNsYXNzIHdoaWNoIGhhbmRsZXMgY29udmVyc2lvbnMgYmV0d2VlbiBNSU1FIGNoYXJzZXQgbmFtZXMKKyAqIGFuZCBKYXZhIGVuY29kaW5nIG5hbWVzLgorICogPHA+VGhlIHN1cHBvcnRlZCBYTUwgZW5jb2RpbmdzIGFyZSB0aGUgaW50ZXJzZWN0aW9uIG9mIFhNTC1zdXBwb3J0ZWQgY29kZSBzZXRzIGFuZCB0aG9zZQorICogc3VwcG9ydGVkIGluIEpESyAxLjEuCisgKiA8cD5NSU1FIGNoYXJzZXQgbmFtZXMgYXJlIHVzZWQgb24gPHZhcj54bWxFbmNvZGluZzwvdmFyPiBwYXJhbWV0ZXJzIHRvIG1ldGhvZHMgc3VjaAorICogYXMgPGNvZGU+VFhEb2N1bWVudCNzZXRFbmNvZGluZzwvY29kZT4gYW5kIDxjb2RlPkRURCNzZXRFbmNvZGluZzwvY29kZT4uCisgKiA8cD5KYXZhIGVuY29kaW5nIG5hbWVzIGFyZSB1c2VkIG9uIDx2YXI+ZW5jb2Rpbmc8L3Zhcj4gcGFyYW1ldGVycyB0bworICogbWV0aG9kcyBzdWNoIGFzIDxjb2RlPlRYRG9jdW1lbnQjcHJpbnRXaXRoRm9ybWF0PC9jb2RlPiBhbmQgPGNvZGU+RFREI3ByaW50RXh0ZXJuYWw8L2NvZGU+LgorICogPFA+CisgKiA8VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gTmFtZTwvQj4KKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+PEI+VXNlIHRoaXMgbmFtZSBpbiBYTUwgZmlsZXM8L0I+CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPjxCPk5hbWUgVHlwZTwvQj4KKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+PEI+WGVyY2VzIGNvbnZlcnRzIHRvIHRoaXMgSmF2YSBFbmNvZGVyIE5hbWU8L0I+CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj44IGJpdCBVbmljb2RlPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+VVRGLTgKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5VVEY4CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5JU08gTGF0aW4gMTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS0xCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5JU08gTGF0aW4gMjwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTIKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS0yCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5JU08gTGF0aW4gMzwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTMKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS0zCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5JU08gTGF0aW4gNDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTQKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS00CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5JU08gTGF0aW4gQ3lyaWxsaWM8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS01CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktNQorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+SVNPIExhdGluIEFyYWJpYzwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTYKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS02CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5JU08gTGF0aW4gR3JlZWs8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS03CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktNworICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+SVNPIExhdGluIEhlYnJldzwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTgKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS04CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5JU08gTGF0aW4gNTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTkKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS05CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IFVTPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLXVzCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AwMzcKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogQ2FuYWRhPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWNhCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AwMzcKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogTmV0aGVybGFuZHM8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtbmwKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDAzNworICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBEZW5tYXJrPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWRrCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AyNzcKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogTm9yd2F5PC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLW5vCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AyNzcKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogRmlubGFuZDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1maQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwMjc4CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IFN3ZWRlbjwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1zZQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwMjc4CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IEl0YWx5PC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWl0CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AyODAKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogU3BhaW4sIExhdGluIEFtZXJpY2E8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtZXMKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDI4NAorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBHcmVhdCBCcml0YWluPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWdiCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AyODUKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogRnJhbmNlPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWZyCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AyOTcKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogQXJhYmljPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWFyMQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwNDIwCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IEhlYnJldzwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1oZQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwNDI0CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IFN3aXR6ZXJsYW5kPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWNoCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3A1MDAKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogUm9lY2U8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3Atcm9lY2UKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDg3MAorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBZb2dvc2xhdmlhPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLXl1CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3A4NzAKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogSWNlbGFuZDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1pcworICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwODcxCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IFVyZHU8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtYXIyCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3A5MTgKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkNoaW5lc2UgZm9yIFBSQywgbWl4ZWQgMS8yIGJ5dGU8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5nYjIzMTIKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5HQjIzMTIKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkV4dGVuZGVkIFVuaXggQ29kZSwgcGFja2VkIGZvciBKYXBhbmVzZTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmV1Yy1qcAorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmV1Y2ppcworICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+SmFwYW5lc2U6IGlzby0yMDIyLWpwPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+aXNvLTIwMjAtanAKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5KSVMKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkphcGFuZXNlOiBTaGlmdCBKSVM8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5TaGlmdF9KSVMKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5TSklTCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5DaGluZXNlOiBCaWc1PC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+QmlnNQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPkJpZzUKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkV4dGVuZGVkIFVuaXggQ29kZSwgcGFja2VkIGZvciBLb3JlYW48L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5ldWMta3IKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5pc28yMDIya3IKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkN5cmlsbGljPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+a29pOC1yCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+a29pOC1yCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqIDwvVEFCTEU+CisgKgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBhdXRob3IgVEFNVVJBIEtlbnQgJmx0O2tlbnRAdHJsLmlibS5jby5qcCZndDsKKyAqLworcHVibGljIGNsYXNzIE1JTUUySmF2YSB7CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBIYXNodGFibGUgc19lbmNoYXNoOworICAgIHN0YXRpYyBwcml2YXRlIEhhc2h0YWJsZSBzX3Jldmhhc2g7CisKKyAgICBzdGF0aWMgeworICAgICAgICBzX2VuY2hhc2ggPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIC8vICAgIDxwcmVmZXJyZWQgTUlNRSBuYW1lPiwgPEphdmEgZW5jb2RpbmcgbmFtZT4KKyAgICAgICAgc19lbmNoYXNoLnB1dCgiVVRGLTgiLCAiVVRGOCIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJVUy1BU0NJSSIsICAgICAgICAiODg1OV8xIik7ICAgIC8vID8KKyAgICAgICAgc19lbmNoYXNoLnB1dCgiSVNPLTg4NTktMSIsICAgICAgIjg4NTlfMSIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJJU08tODg1OS0yIiwgICAgICAiODg1OV8yIik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIklTTy04ODU5LTMiLCAgICAgICI4ODU5XzMiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiSVNPLTg4NTktNCIsICAgICAgIjg4NTlfNCIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJJU08tODg1OS01IiwgICAgICAiODg1OV81Iik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIklTTy04ODU5LTYiLCAgICAgICI4ODU5XzYiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiSVNPLTg4NTktNyIsICAgICAgIjg4NTlfNyIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJJU08tODg1OS04IiwgICAgICAiODg1OV84Iik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIklTTy04ODU5LTkiLCAgICAgICI4ODU5XzkiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiSVNPLTIwMjItSlAiLCAgICAgIkpJUyIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJTSElGVF9KSVMiLCAgICAgICAiU0pJUyIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJFVUMtSlAiLCAgICAgICAgICAiRVVDSklTIik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIkdCMjMxMiIsICAgICAgICAgICJHQjIzMTIiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiQklHNSIsICAgICAgICAgICAgIkJpZzUiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiRVVDLUtSIiwgICAgICAgICAgIktTQzU2MDEiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiSVNPLTIwMjItS1IiLCAgICAgIklTTzIwMjJLUiIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJLT0k4LVIiLCAgICAgICAgICAiS09JOF9SIik7CisKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiRUJDRElDLUNQLVVTIiwgICAgIkNQMDM3Iik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIkVCQ0RJQy1DUC1DQSIsICAgICJDUDAzNyIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJFQkNESUMtQ1AtTkwiLCAgICAiQ1AwMzciKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiRUJDRElDLUNQLURLIiwgICAgIkNQMjc3Iik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIkVCQ0RJQy1DUC1OTyIsICAgICJDUDI3NyIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJFQkNESUMtQ1AtRkkiLCAgICAiQ1AyNzgiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiRUJDRElDLUNQLVNFIiwgICAgIkNQMjc4Iik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIkVCQ0RJQy1DUC1JVCIsICAgICJDUDI4MCIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJFQkNESUMtQ1AtRVMiLCAgICAiQ1AyODQiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiRUJDRElDLUNQLUdCIiwgICAgIkNQMjg1Iik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIkVCQ0RJQy1DUC1GUiIsICAgICJDUDI5NyIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJFQkNESUMtQ1AtQVIxIiwgICAiQ1A0MjAiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiRUJDRElDLUNQLUhFIiwgICAgIkNQNDI0Iik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIkVCQ0RJQy1DUC1DSCIsICAgICJDUDUwMCIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJFQkNESUMtQ1AtUk9FQ0UiLCAiQ1A4NzAiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiRUJDRElDLUNQLVlVIiwgICAgIkNQODcwIik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIkVCQ0RJQy1DUC1JUyIsICAgICJDUDg3MSIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJFQkNESUMtQ1AtQVIyIiwgICAiQ1A5MTgiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gajpDTlMxMTY0MyAtPiBFVUMtVFc/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJU08tMjAyMi1DTj8gSVNPLTIwMjItQ04tRVhUPworCisgICAgICAgIHNfcmV2aGFzaCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgLy8gICAgPEphdmEgZW5jb2RpbmcgbmFtZT4sIDxwcmVmZXJyZWQgTUlNRSBuYW1lPgorICAgICAgICBzX3Jldmhhc2gucHV0KCJVVEY4IiwgIlVURi04Iik7CisgICAgICAgIC8vc19yZXZoYXNoLnB1dCgiODg1OV8xIiwgIlVTLUFTQ0lJIik7ICAgIC8vID8KKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV8xIiwgIklTTy04ODU5LTEiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV8yIiwgIklTTy04ODU5LTIiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV8zIiwgIklTTy04ODU5LTMiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV80IiwgIklTTy04ODU5LTQiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV81IiwgIklTTy04ODU5LTUiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV82IiwgIklTTy04ODU5LTYiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV83IiwgIklTTy04ODU5LTciKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV84IiwgIklTTy04ODU5LTgiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV85IiwgIklTTy04ODU5LTkiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiSklTIiwgIklTTy0yMDIyLUpQIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIlNKSVMiLCAiU2hpZnRfSklTIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIkVVQ0pJUyIsICJFVUMtSlAiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiR0IyMzEyIiwgIkdCMjMxMiIpOworICAgICAgICBzX3Jldmhhc2gucHV0KCJCSUc1IiwgIkJpZzUiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiS1NDNTYwMSIsICJFVUMtS1IiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiSVNPMjAyMktSIiwgIklTTy0yMDIyLUtSIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIktPSThfUiIsICJLT0k4LVIiKTsKKworICAgICAgICBzX3Jldmhhc2gucHV0KCJDUDAzNyIsICJFQkNESUMtQ1AtVVMiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiQ1AwMzciLCAiRUJDRElDLUNQLUNBIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIkNQMDM3IiwgIkVCQ0RJQy1DUC1OTCIpOworICAgICAgICBzX3Jldmhhc2gucHV0KCJDUDI3NyIsICJFQkNESUMtQ1AtREsiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiQ1AyNzciLCAiRUJDRElDLUNQLU5PIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIkNQMjc4IiwgIkVCQ0RJQy1DUC1GSSIpOworICAgICAgICBzX3Jldmhhc2gucHV0KCJDUDI3OCIsICJFQkNESUMtQ1AtU0UiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiQ1AyODAiLCAiRUJDRElDLUNQLUlUIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIkNQMjg0IiwgIkVCQ0RJQy1DUC1FUyIpOworICAgICAgICBzX3Jldmhhc2gucHV0KCJDUDI4NSIsICJFQkNESUMtQ1AtR0IiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiQ1AyOTciLCAiRUJDRElDLUNQLUZSIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIkNQNDIwIiwgIkVCQ0RJQy1DUC1BUjEiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiQ1A0MjQiLCAiRUJDRElDLUNQLUhFIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIkNQNTAwIiwgIkVCQ0RJQy1DUC1DSCIpOworICAgICAgICBzX3Jldmhhc2gucHV0KCJDUDg3MCIsICJFQkNESUMtQ1AtUk9FQ0UiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiQ1A4NzAiLCAiRUJDRElDLUNQLVlVIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIkNQODcxIiwgIkVCQ0RJQy1DUC1JUyIpOworICAgICAgICBzX3Jldmhhc2gucHV0KCJDUDkxOCIsICJFQkNESUMtQ1AtQVIyIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBNSU1FMkphdmEoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhIE1JTUUgY2hhcnNldCBuYW1lLCBhbHNvIGtub3duIGFzIGFuIFhNTCBlbmNvZGluZyBuYW1lLCB0byBhIEphdmEgZW5jb2RpbmcgbmFtZS4KKyAgICAgKiBAcGFyYW0gICBtaW1lQ2hhcnNldE5hbWUgQ2FzZSBpbnNlbnNpdGl2ZSBNSU1FIGNoYXJzZXQgbmFtZTogPGNvZGU+VVRGLTgsIFVTLUFTQ0lJLCBJU08tODg1OS0xLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBJU08tODg1OS0yLCBJU08tODg1OS0zLCBJU08tODg1OS00LCBJU08tODg1OS01LCBJU08tODg1OS02LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBJU08tODg1OS03LCBJU08tODg1OS04LCBJU08tODg1OS05LCBJU08tMjAyMi1KUCwgU2hpZnRfSklTLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBFVUMtSlAsIEdCMjMxMiwgQmlnNSwgRVVDLUtSLCBJU08tMjAyMi1LUiwgS09JOC1SLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBFQkNESUMtQ1AtVVMsIEVCQ0RJQy1DUC1DQSwgRUJDRElDLUNQLU5MLCBFQkNESUMtQ1AtREssCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIEVCQ0RJQy1DUC1OTywgRUJDRElDLUNQLUZJLCBFQkNESUMtQ1AtU0UsIEVCQ0RJQy1DUC1JVCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRUJDRElDLUNQLUVTLCBFQkNESUMtQ1AtR0IsIEVCQ0RJQy1DUC1GUiwgRUJDRElDLUNQLUFSMSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRUJDRElDLUNQLUhFLCBFQkNESUMtQ1AtQ0gsIEVCQ0RJQy1DUC1ST0VDRSwgRUJDRElDLUNQLVlVLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBFQkNESUMtQ1AtSVMgYW5kIEVCQ0RJQy1DUC1BUjI8L2NvZGU+LgorICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgICBKYXZhIGVuY29kaW5nIG5hbWUsIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiA8dmFyPm1pbWVDaGFyc2V0TmFtZTwvdmFyPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1bmtub3duLgorICAgICAqIEBzZWUgI3JldmVyc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0KFN0cmluZyBtaW1lQ2hhcnNldE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpc19lbmNoYXNoLmdldChtaW1lQ2hhcnNldE5hbWUudG9VcHBlckNhc2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhIEphdmEgZW5jb2RpbmcgbmFtZSB0byBNSU1FIGNoYXJzZXQgbmFtZS4KKyAgICAgKiBBdmFpbGFibGUgdmFsdWVzIG9mIDxpPmVuY29kaW5nPC9pPiBhcmUgIlVURjgiLCAiODg1OV8xIiwgIjg4NTlfMiIsICI4ODU5XzMiLCAiODg1OV80IiwKKyAgICAgKiAiODg1OV81IiwgIjg4NTlfNiIsICI4ODU5XzciLCAiODg1OV84IiwgIjg4NTlfOSIsICJKSVMiLCAiU0pJUyIsICJFVUNKSVMiLAorICAgICAqICJHQjIzMTIiLCAiQklHNSIsICJLU0M1NjAxIiwgIklTTzIwMjJLUiIsICAiS09JOF9SIiwgIkNQMDM3IiwgIkNQMjc3IiwgIkNQMjc4IiwKKyAgICAgKiAiQ1AyODAiLCAiQ1AyODQiLCAiQ1AyODUiLCAiQ1AyOTciLCAiQ1A0MjAiLCAiQ1A0MjQiLCAiQ1A1MDAiLCAiQ1A4NzAiLCAiQ1A4NzEiIGFuZCAiQ1A5MTgiLgorICAgICAqIEBwYXJhbSAgIGVuY29kaW5nICAgIENhc2UgaW5zZW5zaXRpdmUgSmF2YSBlbmNvZGluZyBuYW1lOiA8Y29kZT5VVEY4LCA4ODU5XzEsIDg4NTlfMiwgODg1OV8zLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIDg4NTlfNCwgODg1OV81LCA4ODU5XzYsIDg4NTlfNywgODg1OV84LCA4ODU5XzksIEpJUywgU0pJUywgRVVDSklTLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIEdCMjMxMiwgQklHNSwgS1NDNTYwMSwgSVNPMjAyMktSLCBLT0k4X1IsIENQMDM3LCBDUDI3NywgQ1AyNzgsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgQ1AyODAsIENQMjg0LCBDUDI4NSwgQ1AyOTcsIENQNDIwLCBDUDQyNCwgQ1A1MDAsIENQODcwLCBDUDg3MQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBDUDkxODwvY29kZT4uCisgICAgICogQHJldHVybiAgICAgICAgICAgICAgTUlNRSBjaGFyc2V0IG5hbWUsIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiA8dmFyPmVuY29kaW5nPC92YXI+IGlzIHVua25vd24uCisgICAgICogQHNlZSAjY29udmVydAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmVyc2UoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIHJldHVybiAoU3RyaW5nKXNfcmV2aGFzaC5nZXQoZW5jb2RpbmcudG9VcHBlckNhc2UoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTWFuaWZlc3RSZXNvdXJjZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTWFuaWZlc3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODA2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9NYW5pZmVzdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiAgUmVwcmVzZW50YXRpb24gb2YgYSBNYW5pZmVzdCBmaWxlIGFuZCBpdHMgYXZhaWxhYmxlIGV4dGVuc2lvbnMgYW5kCisgKiAgcmVxdWlyZWQgZXh0ZW5zaW9ucworICogIAorICogQGF1dGhvciBHcmVnIE11cnJheQorICogQGF1dGhvciBKdXN0eW5hIEhvcndhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIAorICovCitwdWJsaWMgY2xhc3MgTWFuaWZlc3RSZXNvdXJjZSB7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICAvLyBUaGVzZSBhcmUgdGhlIHJlc291cmNlIHR5cGVzIGZvciBkZXRlcm1pbmluZyBlZmZlY3QgZXJyb3IgbWVzc2FnZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWVNURU0gPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUiA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQTElDQVRJT04gPSAzOworICAgIAorICAgIHByaXZhdGUgQXJyYXlMaXN0IGF2YWlsYWJsZUV4dGVuc2lvbnMgPSBudWxsOworICAgIHByaXZhdGUgQXJyYXlMaXN0IHJlcXVpcmVkRXh0ZW5zaW9ucyA9IG51bGw7CisgICAgCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VOYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIGludCByZXNvdXJjZVR5cGUgPSAtMTsKKyAgICAgICAgCisgICAgcHVibGljIE1hbmlmZXN0UmVzb3VyY2UoU3RyaW5nIHJlc291cmNlTmFtZSwgTWFuaWZlc3QgbWFuaWZlc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXNvdXJjZVR5cGUpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWU7CisgICAgICAgIHRoaXMucmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlOworICAgICAgICBwcm9jZXNzTWFuaWZlc3QobWFuaWZlc3QpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZQorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBleHRlbnNpb25zCisgICAgICoKKyAgICAgKiBAcmV0dXJuIExpc3Qgb2YgYXZhaWxhYmxlIGV4dGVuc2lvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQXJyYXlMaXN0IGdldEF2YWlsYWJsZUV4dGVuc2lvbnMoKSB7CisgICAgICAgIHJldHVybiBhdmFpbGFibGVFeHRlbnNpb25zOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHJlcXVpcmVkIGV4dGVuc2lvbnMKKyAgICAgKgorICAgICAqIEByZXR1cm4gTGlzdCBvZiByZXF1aXJlZCBleHRlbnNpb25zCisgICAgICovCisgICAgcHVibGljIEFycmF5TGlzdCBnZXRSZXF1aXJlZEV4dGVuc2lvbnMoKSB7CisgICAgICAgIHJldHVybiByZXF1aXJlZEV4dGVuc2lvbnM7ICAgCisgICAgfQorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBleHRlbnNpb25zCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGV4dGVuc2lvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEF2YWlsYWJsZUV4dGVuc2lvbkNvdW50KCkgeworICAgICAgICByZXR1cm4gKGF2YWlsYWJsZUV4dGVuc2lvbnMgIT0gbnVsbCkgPyBhdmFpbGFibGVFeHRlbnNpb25zLnNpemUoKSA6IDA7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiByZXF1aXJlZCBleHRlbnNpb25zCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgcmVxdWlyZWQgZXh0ZW5zaW9ucworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWlyZWRFeHRlbnNpb25Db3VudCgpIHsKKyAgICAgICAgcmV0dXJuIChyZXF1aXJlZEV4dGVuc2lvbnMgIT0gbnVsbCkgPyByZXF1aXJlZEV4dGVuc2lvbnMuc2l6ZSgpIDogMDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29udmllbmllbmNlIG1ldGhvZCB0byBjaGVjayBpZiB0aGlzIDxjb2RlPk1hbmlmZXN0UmVzb3VyY2U8L2NvZGU+CisgICAgICogaGFzIGFuIHJlcXVpcmVzIGV4dGVuc2lvbnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcmVxdWlyZWQgZXh0ZW5zaW9ucyBhcmUgcHJlc2VudAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzRXh0ZW5zaW9ucygpIHsKKyAgICAgICAgcmV0dXJuIChyZXF1aXJlZEV4dGVuc2lvbnMgIT0gbnVsbCkgPyB0cnVlIDogZmFsc2U7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWxsIHJlcXVpcmVkIGV4dGVuc2lvbiBkZXBlbmRlbmNpZXMKKyAgICAgKiBoYXZlIGJlZW4gbWVldCBmb3IgdGhpcyA8Y29kZT5NYW5pZmVzdFJlc291cmNlPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBhbGwgZXh0ZW5zaW9uIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gc2F0aXNmaWVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGdWxmaWxsZWQoKSB7CisgICAgICAgIGlmIChyZXF1aXJlZEV4dGVuc2lvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEl0ZXJhdG9yIGl0ID0gcmVxdWlyZWRFeHRlbnNpb25zLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEV4dGVuc2lvbiBleHQgPSAoRXh0ZW5zaW9uKWl0Lm5leHQoKTsKKyAgICAgICAgICAgIGlmICghZXh0LmlzRnVsZmlsbGVkKCkpIHJldHVybiBmYWxzZTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJNYW5pZmVzdFJlc291cmNlWyIpOworICAgICAgICBzYi5hcHBlbmQocmVzb3VyY2VOYW1lKTsKKworICAgICAgICBzYi5hcHBlbmQoIiwgaXNGdWxmaWxsZWQ9Iik7CisgICAgICAgIHNiLmFwcGVuZChpc0Z1bGZpbGxlZCgpICsiIik7CisgICAgICAgIHNiLmFwcGVuZCgiLCByZXF1aXJlZEV4dGVuc2lvbkNvdW50ID0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldFJlcXVpcmVkRXh0ZW5zaW9uQ291bnQoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBhdmFpbGFibGVFeHRlbnNpb25Db3VudD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldEF2YWlsYWJsZUV4dGVuc2lvbkNvdW50KCkpOworICAgICAgICBzd2l0Y2ggKHJlc291cmNlVHlwZSkgeworICAgICAgICAgICAgY2FzZSBTWVNURU0gOiBzYi5hcHBlbmQoIiwgcmVzb3VyY2VUeXBlPVNZU1RFTSIpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgV0FSIDogc2IuYXBwZW5kKCIsIHJlc291cmNlVHlwZT1XQVIiKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFQUExJQ0FUSU9OIDogc2IuYXBwZW5kKCIsIHJlc291cmNlVHlwZT1BUFBMSUNBVElPTiIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNYW5pZmVzdChNYW5pZmVzdCBtYW5pZmVzdCkgeworICAgICAgICBhdmFpbGFibGVFeHRlbnNpb25zID0gZ2V0QXZhaWxhYmxlRXh0ZW5zaW9ucyhtYW5pZmVzdCk7CisgICAgICAgIHJlcXVpcmVkRXh0ZW5zaW9ucyA9IGdldFJlcXVpcmVkRXh0ZW5zaW9ucyhtYW5pZmVzdCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIDxjb2RlPkV4dGVuc2lvbjwvY29kZT4gb2JqZWN0cyByZXByZXNlbnRpbmcgb3B0aW9uYWwKKyAgICAgKiBwYWNrYWdlcyB0aGF0IGFyZSByZXF1aXJlZCBieSB0aGUgYXBwbGljYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCA8Y29kZT5NYW5pZmVzdDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuaWZlc3QgTWFuaWZlc3QgdG8gYmUgcGFyc2VkCisgICAgICoKKyAgICAgKiBAcmV0dXJuIExpc3Qgb2YgcmVxdWlyZWQgZXh0ZW5zaW9ucywgb3IgbnVsbCBpZiB0aGUgYXBwbGljYXRpb24KKyAgICAgKiBkb2VzIG5vdCByZXF1aXJlIGFueSBleHRlbnNpb25zCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3QgZ2V0UmVxdWlyZWRFeHRlbnNpb25zKE1hbmlmZXN0IG1hbmlmZXN0KSB7CisKKyAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKKyAgICAgICAgU3RyaW5nIG5hbWVzID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiRXh0ZW5zaW9uLUxpc3QiKTsKKyAgICAgICAgaWYgKG5hbWVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBBcnJheUxpc3QgZXh0ZW5zaW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgbmFtZXMgKz0gIiAiOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisKKyAgICAgICAgICAgIGludCBzcGFjZSA9IG5hbWVzLmluZGV4T2YoJyAnKTsKKyAgICAgICAgICAgIGlmIChzcGFjZSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5hbWVzLnN1YnN0cmluZygwLCBzcGFjZSkudHJpbSgpOworICAgICAgICAgICAgbmFtZXMgPSBuYW1lcy5zdWJzdHJpbmcoc3BhY2UgKyAxKTsKKworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0KKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmdldFZhbHVlKG5hbWUgKyAiLUV4dGVuc2lvbi1OYW1lIik7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIEV4dGVuc2lvbiBleHRlbnNpb24gPSBuZXcgRXh0ZW5zaW9uKCk7CisgICAgICAgICAgICBleHRlbnNpb24uc2V0RXh0ZW5zaW9uTmFtZSh2YWx1ZSk7CisgICAgICAgICAgICBleHRlbnNpb24uc2V0SW1wbGVtZW50YXRpb25VUkwKKyAgICAgICAgICAgICAgICAoYXR0cmlidXRlcy5nZXRWYWx1ZShuYW1lICsgIi1JbXBsZW1lbnRhdGlvbi1VUkwiKSk7CisgICAgICAgICAgICBleHRlbnNpb24uc2V0SW1wbGVtZW50YXRpb25WZW5kb3JJZAorICAgICAgICAgICAgICAgIChhdHRyaWJ1dGVzLmdldFZhbHVlKG5hbWUgKyAiLUltcGxlbWVudGF0aW9uLVZlbmRvci1JZCIpKTsKKyAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZShuYW1lICsgIi1JbXBsZW1lbnRhdGlvbi1WZXJzaW9uIik7CisgICAgICAgICAgICBleHRlbnNpb24uc2V0SW1wbGVtZW50YXRpb25WZXJzaW9uKHZlcnNpb24pOworICAgICAgICAgICAgZXh0ZW5zaW9uLnNldFNwZWNpZmljYXRpb25WZXJzaW9uCisgICAgICAgICAgICAgICAgKGF0dHJpYnV0ZXMuZ2V0VmFsdWUobmFtZSArICItU3BlY2lmaWNhdGlvbi1WZXJzaW9uIikpOworICAgICAgICAgICAgZXh0ZW5zaW9uTGlzdC5hZGQoZXh0ZW5zaW9uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXh0ZW5zaW9uTGlzdDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgPGNvZGU+RXh0ZW5zaW9uPC9jb2RlPiBvYmplY3RzIHJlcHJlc2VudGluZyBvcHRpb25hbAorICAgICAqIHBhY2thZ2VzIHRoYXQgYXJlIGJ1bmRsZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCA8Y29kZT5NYW5pZmVzdDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuaWZlc3QgTWFuaWZlc3QgdG8gYmUgcGFyc2VkCisgICAgICoKKyAgICAgKiBAcmV0dXJuIExpc3Qgb2YgYXZhaWxhYmxlIGV4dGVuc2lvbnMsIG9yIG51bGwgaWYgdGhlIHdlYiBhcHBsaWNhdGlvbgorICAgICAqIGRvZXMgbm90IGJ1bmRsZSBhbnkgZXh0ZW5zaW9ucworICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0IGdldEF2YWlsYWJsZUV4dGVuc2lvbnMoTWFuaWZlc3QgbWFuaWZlc3QpIHsKKworICAgICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpOworICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIkV4dGVuc2lvbi1OYW1lIik7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBBcnJheUxpc3QgZXh0ZW5zaW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICBFeHRlbnNpb24gZXh0ZW5zaW9uID0gbmV3IEV4dGVuc2lvbigpOworICAgICAgICBleHRlbnNpb24uc2V0RXh0ZW5zaW9uTmFtZShuYW1lKTsKKyAgICAgICAgZXh0ZW5zaW9uLnNldEltcGxlbWVudGF0aW9uVVJMKAorICAgICAgICAgICAgYXR0cmlidXRlcy5nZXRWYWx1ZSgiSW1wbGVtZW50YXRpb24tVVJMIikpOworICAgICAgICBleHRlbnNpb24uc2V0SW1wbGVtZW50YXRpb25WZW5kb3IoCisgICAgICAgICAgICBhdHRyaWJ1dGVzLmdldFZhbHVlKCJJbXBsZW1lbnRhdGlvbi1WZW5kb3IiKSk7CisgICAgICAgIGV4dGVuc2lvbi5zZXRJbXBsZW1lbnRhdGlvblZlbmRvcklkKAorICAgICAgICAgICAgYXR0cmlidXRlcy5nZXRWYWx1ZSgiSW1wbGVtZW50YXRpb24tVmVuZG9yLUlkIikpOworICAgICAgICBleHRlbnNpb24uc2V0SW1wbGVtZW50YXRpb25WZXJzaW9uKAorICAgICAgICAgICAgYXR0cmlidXRlcy5nZXRWYWx1ZSgiSW1wbGVtZW50YXRpb24tVmVyc2lvbiIpKTsKKyAgICAgICAgZXh0ZW5zaW9uLnNldFNwZWNpZmljYXRpb25WZXJzaW9uKAorICAgICAgICAgICAgYXR0cmlidXRlcy5nZXRWYWx1ZSgiU3BlY2lmaWNhdGlvbi1WZXJzaW9uIikpOworCisgICAgICAgIGV4dGVuc2lvbkxpc3QuYWRkKGV4dGVuc2lvbik7CisKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvbkxpc3Q7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUGFyYW1ldGVyTWFwLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9QYXJhbWV0ZXJNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTYyNDNjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUGFyYW1ldGVyTWFwLmphdmEKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisKKy8qKgorICogRXh0ZW5kZWQgaW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5IYXNoTWFwPC9zdHJvbmc+IHRoYXQgaW5jbHVkZXMgYQorICogPGNvZGU+bG9ja2VkPC9jb2RlPiBwcm9wZXJ0eS4gIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gc2FmZWx5IGV4cG9zZQorICogQ2F0YWxpbmEgaW50ZXJuYWwgcGFyYW1ldGVyIG1hcCBvYmplY3RzIHRvIHVzZXIgY2xhc3NlcyB3aXRob3V0IGhhdmluZworICogdG8gY2xvbmUgdGhlbSBpbiBvcmRlciB0byBhdm9pZCBtb2RpZmljYXRpb25zLiAgV2hlbiBmaXJzdCBjcmVhdGVkLCBhCisgKiA8Y29kZT5QYXJtYWV0ZXJNYXA8L2NvZGU+IGluc3RhbmNlIGlzIG5vdCBsb2NrZWQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBQYXJhbWV0ZXJNYXAgZXh0ZW5kcyBIYXNoTWFwIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgbWFwIHdpdGggdGhlIGRlZmF1bHQgaW5pdGlhbCBjYXBhY2l0eSBhbmQKKyAgICAgKiBsb2FkIGZhY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyYW1ldGVyTWFwKCkgeworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5IGFuZAorICAgICAqIGRlZmF1bHQgbG9hZCBmYWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IFRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoaXMgbWFwCisgICAgICovCisgICAgcHVibGljIFBhcmFtZXRlck1hcChpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisKKyAgICAgICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgYW5kCisgICAgICogbG9hZCBmYWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IFRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoaXMgbWFwCisgICAgICogQHBhcmFtIGxvYWRGYWN0b3IgVGhlIGxvYWQgZmFjdG9yIG9mIHRoaXMgbWFwCisgICAgICovCisgICAgcHVibGljIFBhcmFtZXRlck1hcChpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7CisKKyAgICAgICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IG1hcCB3aXRoIHRoZSBzYW1lIG1hcHBpbmdzIGFzIHRoZSBnaXZlbiBtYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwIE1hcCB3aG9zZSBjb250ZW50cyBhcmUgZHVwbGlhdGVkIGluIHRoZSBuZXcgbWFwCisgICAgICovCisgICAgcHVibGljIFBhcmFtZXRlck1hcChNYXAgbWFwKSB7CisKKyAgICAgICAgc3VwZXIobWFwKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IGxvY2sgc3RhdGUgb2YgdGhpcyBwYXJhbWV0ZXIgbWFwLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBsb2NrZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2NrZWQgc3RhdGUgb2YgdGhpcyBwYXJhbWV0ZXIgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTG9ja2VkKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5sb2NrZWQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvY2tlZCBzdGF0ZSBvZiB0aGlzIHBhcmFtZXRlciBtYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9ja2VkIFRoZSBuZXcgbG9ja2VkIHN0YXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9ja2VkKGJvb2xlYW4gbG9ja2VkKSB7CisKKyAgICAgICAgdGhpcy5sb2NrZWQgPSBsb2NrZWQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoIm9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbCIpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIG1hcHBpbmdzIGZyb20gdGhpcyBtYXAuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1hcCBpcyBjdXJyZW50bHkgbG9ja2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisKKyAgICAgICAgaWYgKGxvY2tlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJwYXJhbWV0ZXJNYXAubG9ja2VkIikpOworICAgICAgICBzdXBlci5jbGVhcigpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGUgdGhlIHNwZWNpZmllZCB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgbWFwLiAgSWYKKyAgICAgKiB0aGUgbWFwIHByZXZpb3VzbHkgY29udGFpbmVkIGEgbWFwcGluZyBmb3IgdGhpcyBrZXksIHRoZSBvbGQgdmFsdWUgaXMKKyAgICAgKiByZXBsYWNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgS2V5IHdpdGggd2hpY2ggdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyB0byBiZSBhc3NvY2lhdGVkCisgICAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleQorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcHJldmlvdXMgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBvcgorICAgICAqICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3Iga2V5CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1hcCBpcyBjdXJyZW50bHkgbG9ja2VkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisKKyAgICAgICAgaWYgKGxvY2tlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJwYXJhbWV0ZXJNYXAubG9ja2VkIikpOworICAgICAgICByZXR1cm4gKHN1cGVyLnB1dChrZXksIHZhbHVlKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvcHkgYWxsIG9mIHRoZSBtYXBwaW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgbWFwIHRvIHRoaXMgb25lLiAgVGhlc2UKKyAgICAgKiBtYXBwaW5ncyByZXBsYWNlIGFueSBtYXBwaW5ncyB0aGF0IHRoaXMgbWFwIGhhZCBmb3IgYW55IG9mIHRoZSBrZXlzCisgICAgICogY3VycmVudGx5IGluIHRoZSBzcGVjaWZpZWQgTWFwLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcCBNYXBwaW5ncyB0byBiZSBzdG9yZWQgaW50byB0aGlzIG1hcAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtYXAgaXMgY3VycmVudGx5IGxvY2tlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgbWFwKSB7CisKKyAgICAgICAgaWYgKGxvY2tlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJwYXJhbWV0ZXJNYXAubG9ja2VkIikpOworICAgICAgICBzdXBlci5wdXRBbGwobWFwKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBtYXBwaW5nIGZvciB0aGlzIGtleSBmcm9tIHRoZSBtYXAgaWYgcHJlc2VudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgS2V5IHdob3NlIG1hcHBpbmcgaXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBtYXAKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHByZXZpb3VzIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgb3IKKyAgICAgKiAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgd2FzIG5vIG1hcHBpbmcgZm9yIHRoYXQga2V5CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1hcCBpcyBjdXJyZW50bHkgbG9ja2VkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgeworCisgICAgICAgIGlmIChsb2NrZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicGFyYW1ldGVyTWFwLmxvY2tlZCIpKTsKKyAgICAgICAgcmV0dXJuIChzdXBlci5yZW1vdmUoa2V5KSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUHJvY2Vzc0Vudmlyb25tZW50LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Qcm9jZXNzRW52aXJvbm1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2E0NDgzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUHJvY2Vzc0Vudmlyb25tZW50LmphdmEKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworCisKKy8qKgorICogRW5jYXBzdWxhdGVzIHRoZSBQcm9jZXNzIGVudmlyb25tZW50IGFuZCBydWxlcyB0byBkZXJpdmUKKyAqIHRoYXQgZW52aXJvbm1lbnQgZnJvbSB0aGUgc2VydmxldCBjb250YWluZXIgYW5kIHJlcXVlc3QgaW5mb3JtYXRpb24uCisgKiBAYXV0aG9yICAgTWFydGluIERlbmdsZXIgW3Jvb3RAbWFydGluZGVuZ2xlci5jb21dCisgKiBAdmVyc2lvbiAgJFJldmlzaW9uJCwgJERhdGUkCisgKiBAc2luY2UgICAgVG9tY2F0IDQuMAorICogQGRlcHJlY2F0ZWQKKyAqLworcHVibGljIGNsYXNzIFByb2Nlc3NFbnZpcm9ubWVudCB7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFByb2Nlc3NFbnZpcm9ubWVudC5jbGFzcyApOworICAgIAorICAgIC8qKiBjb250ZXh0IG9mIHRoZSBlbmNsb3Npbmcgc2VydmxldCAqLworICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgY29udGV4dCA9IG51bGw7CisKKyAgICAvKiogcmVhbCBmaWxlIHN5c3RlbSBkaXJlY3Rvcnkgb2YgdGhlIGVuY2xvc2luZyBzZXJ2bGV0J3Mgd2ViIGFwcCAqLworICAgIHByaXZhdGUgU3RyaW5nIHdlYkFwcFJvb3REaXIgPSBudWxsOworCisgICAgLyoqIGNvbnRleHQgcGF0aCBvZiBlbmNsb3Npbmcgc2VydmxldCAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRleHRQYXRoID0gbnVsbDsKKworICAgIC8qKiBwYXRoSW5mbyBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdCAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aEluZm8gPSBudWxsOworCisgICAgLyoqIHNlcnZsZXQgVVJJIG9mIHRoZSBlbmNsb3Npbmcgc2VydmxldCAqLworICAgIHByaXZhdGUgU3RyaW5nIHNlcnZsZXRQYXRoID0gbnVsbDsKKworICAgIC8qKiBkZXJpdmVkIHByb2Nlc3MgZW52aXJvbm1lbnQgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGVudiA9IG51bGw7CisKKyAgICAvKiogY29tbWFuZCB0byBiZSBpbnZva2VkICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb21tYW5kID0gbnVsbDsKKworICAgIC8qKiB3aGV0aGVyIG9yIG5vdCB0aGlzIG9iamVjdCBpcyB2YWxpZCBvciBub3QgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZCA9IGZhbHNlOworCisgICAgLyoqIHRoZSBkZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIGZvciB0aGlzIGluc3RhbmNlLiAqLworICAgIHByb3RlY3RlZCBpbnQgZGVidWcgPSAwOworCisgICAgLyoqIHByb2Nlc3MnIGRlc2lyZWQgd29ya2luZyBkaXJlY3RvcnkgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSB3b3JraW5nRGlyZWN0b3J5ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIFByb2Nlc3NFbnZpcm9ubWVudCBhbmQgZGVyaXZlcyB0aGUgbmVjZXNzYXJ5IGVudmlyb25tZW50LAorICAgICAqIHdvcmtpbmcgZGlyZWN0b3J5LCBjb21tYW5kLCBldGMuCisgICAgICogQHBhcmFtICByZXEgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IGZvciBpbmZvcm1hdGlvbiBwcm92aWRlZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgIHRoZSBTZXJ2bGV0IEFQSQorICAgICAqIEBwYXJhbSAgY29udGV4dCAgIFNlcnZsZXRDb250ZXh0IGZvciBpbmZvcm1hdGlvbiBwcm92aWRlZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgIHRoZSBTZXJ2bGV0IEFQSQorICAgICAqLworICAgIHB1YmxpYyBQcm9jZXNzRW52aXJvbm1lbnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKyAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKHJlcSwgY29udGV4dCwgMCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgUHJvY2Vzc0Vudmlyb25tZW50IGFuZCBkZXJpdmVzIHRoZSBuZWNlc3NhcnkgZW52aXJvbm1lbnQsCisgICAgICogd29ya2luZyBkaXJlY3RvcnksIGNvbW1hbmQsIGV0Yy4KKyAgICAgKiBAcGFyYW0gIHJlcSAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgZm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5CisgICAgICogICAgICAgICAgICAgICAgICAgdGhlIFNlcnZsZXQgQVBJCisgICAgICogQHBhcmFtICBjb250ZXh0ICAgU2VydmxldENvbnRleHQgZm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5CisgICAgICogICAgICAgICAgICAgICAgICAgdGhlIFNlcnZsZXQgQVBJCisgICAgICogQHBhcmFtICBkZWJ1ZyAgICAgaW50IGRlYnVnIGxldmVsICgwID09IG5vbmUsIDQgPT0gbWVkaXVtLCA2ID09IGxvdHMpCisgICAgICovCisgICAgcHVibGljIFByb2Nlc3NFbnZpcm9ubWVudChIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0LCBpbnQgZGVidWcpIHsKKyAgICAgICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKKyAgICAgICAgICAgIHNldHVwRnJvbUNvbnRleHQoY29udGV4dCk7CisgICAgICAgICAgICBzZXR1cEZyb21SZXF1ZXN0KHJlcSk7CisgICAgICAgICAgICB0aGlzLnZhbGlkID0gZGVyaXZlUHJvY2Vzc0Vudmlyb25tZW50KHJlcSk7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIAorICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIigpIGN0b3IsIGRlYnVnIGxldmVsICIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVXNlcyB0aGUgU2VydmxldENvbnRleHQgdG8gc2V0IHNvbWUgcHJvY2VzcyB2YXJpYWJsZXMKKyAgICAgKiBAcGFyYW0gIGNvbnRleHQgICBTZXJ2bGV0Q29udGV4dCBmb3IgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aGUgU2VydmxldCBBUEkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cEZyb21Db250ZXh0KFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgdGhpcy53ZWJBcHBSb290RGlyID0gY29udGV4dC5nZXRSZWFsUGF0aCgiLyIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVXNlcyB0aGUgSHR0cFNlcnZsZXRSZXF1ZXN0IHRvIHNldCBtb3N0IHByb2Nlc3MgdmFyaWFibGVzCisgICAgICogQHBhcmFtICByZXEgICBIdHRwU2VydmxldFJlcXVlc3QgZm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5CisgICAgICogICAgICAgICAgICAgICB0aGUgU2VydmxldCBBUEkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cEZyb21SZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9IHJlcS5nZXRDb250ZXh0UGF0aCgpOworICAgICAgICB0aGlzLnBhdGhJbmZvID0gcmVxLmdldFBhdGhJbmZvKCk7CisgICAgICAgIHRoaXMuc2VydmxldFBhdGggPSByZXEuZ2V0U2VydmxldFBhdGgoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByaW50IGltcG9ydGFudCBwcm9jZXNzIGVudmlyb25tZW50IGluZm9ybWF0aW9uIGluIGFuCisgICAgICogZWFzeS10by1yZWFkIEhUTUwgdGFibGUKKyAgICAgKiBAcmV0dXJuICBIVE1MIHN0cmluZyBjb250YWluaW5nIHByb2Nlc3MgZW52aXJvbm1lbnQgaW5mbworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8VEFCTEUgYm9yZGVyPTI+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0aCBjb2xzcGFuPTIgYmdjb2xvcj1ncmV5PiIpOworICAgICAgICBzYi5hcHBlbmQoIlByb2Nlc3NFbnZpcm9ubWVudCBJbmZvPC90aD48L3RyPiIpOworICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGQ+RGVidWcgTGV2ZWw8L3RkPjx0ZD4iKTsKKyAgICAgICAgc2IuYXBwZW5kKGRlYnVnKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8L3RkPjwvdHI+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZD5WYWxpZGl0eTo8L3RkPjx0ZD4iKTsKKyAgICAgICAgc2IuYXBwZW5kKGlzVmFsaWQoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48L3RyPiIpOworICAgICAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnZrID0gZW52LmtleXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlbnZrLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKWVudmsubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGQ+Iik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHMpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48dGQ+Iik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGJsYW5rc1RvU3RyaW5nKChTdHJpbmcpZW52LmdldChzKSwKKyAgICAgICAgICAgICAgICAgICAgIlt3aWxsIGJlIHNldCB0byBibGFua10iKSk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48L3RyPiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZCBjb2xzcGFuPTI+PEhSPjwvdGQ+PC90cj4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8dHI+PHRkPkRlcml2ZWQgQ29tbWFuZDwvdGQ+PHRkPiIpOworICAgICAgICBzYi5hcHBlbmQobnVsbHNUb0JsYW5rcyhjb21tYW5kKSk7CisgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48L3RyPiIpOworICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGQ+V29ya2luZyBEaXJlY3Rvcnk8L3RkPjx0ZD4iKTsKKyAgICAgICAgaWYgKHdvcmtpbmdEaXJlY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKHdvcmtpbmdEaXJlY3RvcnkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCI8L3RkPjwvdHI+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPC9UQUJMRT48cD5lbmQuIik7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyBkZXJpdmVkIGNvbW1hbmQgc3RyaW5nCisgICAgICogQHJldHVybiAgY29tbWFuZCBzdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1hbmQoKSB7CisgICAgICAgIHJldHVybiBjb21tYW5kOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVzaXJlZCBjb21tYW5kIHN0cmluZworICAgICAqIEBwYXJhbSAgIGNvbW1hbmQgU3RyaW5nIGNvbW1hbmQgYXMgZGVzaXJlZAorICAgICAqIEByZXR1cm4gIGNvbW1hbmQgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzZXRDb21tYW5kKFN0cmluZyBjb21tYW5kKSB7CisgICAgICAgIHJldHVybiBjb21tYW5kOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGlzIHByb2Nlc3MnIGRlcml2ZWQgd29ya2luZyBkaXJlY3RvcnkKKyAgICAgKiBAcmV0dXJuICB3b3JraW5nIGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldFdvcmtpbmdEaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiB3b3JraW5nRGlyZWN0b3J5OworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyBwcm9jZXNzJyBlbnZpcm9ubWVudAorICAgICAqIEByZXR1cm4gICBwcm9jZXNzJyBlbnZpcm9ubWVudAorICAgICAqLworICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0RW52aXJvbm1lbnQoKSB7CisgICAgICAgIHJldHVybiBlbnY7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHByb2Nlc3MnIGVudmlyb25tZW50CisgICAgICogQHBhcmFtICAgIGVudiBwcm9jZXNzJyBlbnZpcm9ubWVudAorICAgICAqIEByZXR1cm4gICBIYXNodGFibGUgdG8gd2hpY2ggdGhlIHByb2Nlc3MnIGVudmlyb25tZW50IHdhcyBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgSGFzaHRhYmxlIHNldEVudmlyb25tZW50KEhhc2h0YWJsZSBlbnYpIHsKKyAgICAgICAgdGhpcy5lbnYgPSBlbnY7CisgICAgICAgIHJldHVybiB0aGlzLmVudjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgdmFsaWRpdHkgc3RhdHVzCisgICAgICogQHJldHVybiAgIHRydWUgaWYgdGhpcyBlbnZpcm9ubWVudCBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIHZhbGlkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29udmVydHMgbnVsbCBzdHJpbmdzIHRvIGJsYW5rIHN0cmluZ3MgKCIiKQorICAgICAqIEBwYXJhbSAgICBzIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgaWYgbmVjZXNzYXJ5CisgICAgICogQHJldHVybiAgIGEgbm9uLW51bGwgc3RyaW5nLCBlaXRoZXIgdGhlIG9yaWdpbmFsIG9yIHRoZSBlbXB0eSBzdHJpbmcKKyAgICAgKiAgICAgICAgICAgKCIiKSBpZiB0aGUgb3JpZ2luYWwgd2FzIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBudWxsc1RvQmxhbmtzKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBudWxsc1RvU3RyaW5nKHMsICIiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIG51bGwgc3RyaW5ncyB0byBhbm90aGVyIHN0cmluZworICAgICAqIEBwYXJhbSAgICBjb3VsZEJlTnVsbCBzdHJpbmcgdG8gYmUgY29udmVydGVkIGlmIG5lY2Vzc2FyeQorICAgICAqIEBwYXJhbSAgICBzdWJGb3JOdWxscyBzdHJpbmcgdG8gcmV0dXJuIGluc3RlYWQgb2YgYSBudWxsIHN0cmluZworICAgICAqIEByZXR1cm4gICBhIG5vbi1udWxsIHN0cmluZywgZWl0aGVyIHRoZSBvcmlnaW5hbCBvciB0aGUgc3Vic3RpdHV0ZQorICAgICAqICAgICAgICAgICBzdHJpbmcgaWYgdGhlIG9yaWdpbmFsIHdhcyA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbnVsbHNUb1N0cmluZyhTdHJpbmcgY291bGRCZU51bGwsIFN0cmluZyBzdWJGb3JOdWxscykgeworICAgICAgICByZXR1cm4gKGNvdWxkQmVOdWxsID09IG51bGwgPyBzdWJGb3JOdWxscyA6IGNvdWxkQmVOdWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIGJsYW5rIHN0cmluZ3MgdG8gYW5vdGhlciBzdHJpbmcKKyAgICAgKiBAcGFyYW0gICAgY291bGRCZUJsYW5rIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgaWYgbmVjZXNzYXJ5CisgICAgICogQHBhcmFtICAgIHN1YkZvckJsYW5rcyBzdHJpbmcgdG8gcmV0dXJuIGluc3RlYWQgb2YgYSBibGFuayBzdHJpbmcKKyAgICAgKiBAcmV0dXJuICAgYSBub24tbnVsbCBzdHJpbmcsIGVpdGhlciB0aGUgb3JpZ2luYWwgb3IgdGhlIHN1YnN0aXR1dGUKKyAgICAgKiAgICAgICAgICAgc3RyaW5nIGlmIHRoZSBvcmlnaW5hbCB3YXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgZW1wdHkgKCIiKQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYmxhbmtzVG9TdHJpbmcoU3RyaW5nIGNvdWxkQmVCbGFuaywKKyAgICAgICAgU3RyaW5nIHN1YkZvckJsYW5rcykgeworICAgICAgICAgICAgcmV0dXJuICgoIiIuZXF1YWxzKGNvdWxkQmVCbGFuaykgfHwgY291bGRCZUJsYW5rID09IG51bGwpID8KKyAgICAgICAgICAgICAgICBzdWJGb3JCbGFua3MgOiBjb3VsZEJlQmxhbmspOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyB0aGUgUHJvY2VzcyBlbnZpcm9ubWVudCB0byBiZSBzdXBwbGllZCB0byB0aGUgaW52b2tlZAorICAgICAqIHByb2Nlc3MuICBEZWZpbmVzIGFuIGVudmlyb25tZW50IG5vIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBTaG91bGQgYmUgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzZXMgdG8gcGVyZm9ybSB1c2VmdWwgc2V0dXAuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtICAgIHJlcSByZXF1ZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgICAgUHJvY2VzcycgaW52b2NhdGlvbgorICAgICAqIEByZXR1cm4gICB0cnVlIGlmIGVudmlyb25tZW50IHdhcyBzZXQgT0ssIGZhbHNlIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0KKyAgICAgKiAgICAgICAgICAgYW5kIG5vIGVudmlyb25tZW50IHdhcyBzZXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZXJpdmVQcm9jZXNzRW52aXJvbm1lbnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworCisgICAgICAgIEhhc2h0YWJsZSBlbnZwID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBjb21tYW5kID0gZ2V0Q29tbWFuZCgpOworICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKSB7CisgICAgICAgICAgICB3b3JraW5nRGlyZWN0b3J5ID0gbmV3CisgICAgICAgICAgICAgICAgRmlsZShjb21tYW5kLnN1YnN0cmluZygwLAorICAgICAgICAgICAgICAgIGNvbW1hbmQubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKSk7CisgICAgICAgICAgICAgICAgZW52cC5wdXQoIlhfVE9NQ0FUX0NPTU1BTkRfUEFUSCIsIGNvbW1hbmQpOyAvL2ZvciBraWNrcworICAgICAgICB9CisgICAgICAgIHRoaXMuZW52ID0gZW52cDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIHRvIHdoaWNoIHRoaXMgcHJvY2Vzc1wKKyAgICAgKiBiZWxvbmdzCisgICAgICogQHJldHVybiAgcm9vdCBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFdlYkFwcFJvb3REaXIoKSB7CisgICAgICAgIHJldHVybiB3ZWJBcHBSb290RGlyOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHRQYXRoOworICAgICAgICB9CisKKworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRDb250ZXh0KCl7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICAgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRQYXRoKCl7CisgICAgICAgICAgICByZXR1cm4gc2VydmxldFBhdGg7CisgICAgICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1Byb2Nlc3NIZWxwZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1Byb2Nlc3NIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmI2M2VlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUHJvY2Vzc0hlbHBlci5qYXZhCkBAIC0wLDAgKzEsNDk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKioKKyAgICAgKiBFbmNhcHN1bGF0ZXMgdGhlIGtub3dsZWRnZSBvZiBob3cgdG8gcnVuIGEgQ0dJIHNjcmlwdCwgZ2l2ZW4gdGhlCisgICAgICogc2NyaXB0J3MgZGVzaXJlZCBlbnZpcm9ubWVudCBhbmQgKG9wdGlvbmFsbHkpIGlucHV0L291dHB1dCBzdHJlYW1zCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKgorICAgICAqIEV4cG9zZXMgYSA8Y29kZT5ydW48L2NvZGU+IG1ldGhvZCB1c2VkIHRvIGFjdHVhbGx5IGludm9rZSB0aGUKKyAgICAgKiBDR0kuCisgICAgICoKKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBUaGUgQ0dJIGVudmlyb25tZW50IGFuZCBzZXR0aW5ncyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpbmZvcm1hdGlvbgorICAgICAqIHBhc3NlZCB0byB0aGUgY29uc3R1Y3Rvci4KKyAgICAgKgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKgorICAgICAqIFRoZSBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMgY2FuIGJlIHNldCBieSB0aGUgPGNvZGU+c2V0SW5wdXQ8L2NvZGU+CisgICAgICogYW5kIDxjb2RlPnNldFJlc3BvbnNlPC9jb2RlPiBtZXRob2RzLCByZXNwZWN0aXZlbHkuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQGF1dGhvciAgICBNYXJ0aW4gRGVuZ2xlciBbcm9vdEBtYXJ0aW5kZW5nbGVyLmNvbV0KKyAgICAgKiBAdmVyc2lvbiAgICRSZXZpc2lvbiQsICREYXRlJAorICAgICAqIEBkZXByZWNhdGVkCisgICAgICovCitwdWJsaWMgY2xhc3MgUHJvY2Vzc0hlbHBlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggUHJvY2Vzc0hlbHBlci5jbGFzcyApOworICAgIAorICAgIC8qKiBzY3JpcHQvY29tbWFuZCB0byBiZSBleGVjdXRlZCAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbW1hbmQgPSBudWxsOworCisgICAgLyoqIGVudmlyb25tZW50IHVzZWQgd2hlbiBpbnZva2luZyB0aGUgY2dpIHNjcmlwdCAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIGVudiA9IG51bGw7CisKKyAgICAvKiogd29ya2luZyBkaXJlY3RvcnkgdXNlZCB3aGVuIGludm9raW5nIHRoZSBjZ2kgc2NyaXB0ICovCisgICAgcHJpdmF0ZSBGaWxlIHdkID0gbnVsbDsKKworICAgIC8qKiBxdWVyeSBwYXJhbWV0ZXJzIHRvIGJlIHBhc3NlZCB0byB0aGUgaW52b2tlZCBzY3JpcHQgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSBwYXJhbXMgPSBudWxsOworCisgICAgLyoqIHN0ZGluIHRvIGJlIHBhc3NlZCB0byBjZ2kgc2NyaXB0ICovCisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBzdGRpbiA9IG51bGw7CisKKyAgICAvKiogcmVzcG9uc2Ugb2JqZWN0IHVzZWQgdG8gc2V0IGhlYWRlcnMgJiBnZXQgb3V0cHV0IHN0cmVhbSAqLworICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKyAgICAvKiogYm9vbGVhbiB0cmFja2luZyB3aGV0aGVyIHRoaXMgb2JqZWN0IGhhcyBlbm91Z2ggaW5mbyB0byBydW4oKSAqLworICAgIHByaXZhdGUgYm9vbGVhbiByZWFkeVRvUnVuID0gZmFsc2U7CisKKyAgICAvKiogdGhlIGRlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgZm9yIHRoaXMgaW5zdGFuY2UuICovCisgICAgcHJpdmF0ZSBpbnQgZGVidWcgPSAwOworCisgICAgLyoqIHRoZSB0aW1lIGluIG1zIHRvIHdhaXQgZm9yIHRoZSBjbGllbnQgdG8gc2VuZCB1cyBDR0kgaW5wdXQgZGF0YSAqLworICAgIHByaXZhdGUgaW50IGlDbGllbnRJbnB1dFRpbWVvdXQ7CisKKyAgICAvKioKKyAgICAgKiAgQ3JlYXRlcyBhIFByb2Nlc3NIZWxwZXIgYW5kIGluaXRpYWxpemVzIGl0cyBlbnZpcm9ubWVudCwgd29ya2luZworICAgICAqICBkaXJlY3RvcnksIGFuZCBxdWVyeSBwYXJhbWV0ZXJzLgorICAgICAqICA8QlI+CisgICAgICogIElucHV0L291dHB1dCBzdHJlYW1zIChvcHRpb25hbCkgYXJlIHNldCB1c2luZyB0aGUKKyAgICAgKiAgPGNvZGU+c2V0SW5wdXQ8L2NvZGU+IGFuZCA8Y29kZT5zZXRSZXNwb25zZTwvY29kZT4gbWV0aG9kcywKKyAgICAgKiAgcmVzcGVjdGl2ZWx5LgorICAgICAqCisgICAgICogQHBhcmFtICBjb21tYW5kICBzdHJpbmcgZnVsbCBwYXRoIHRvIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQKKyAgICAgKiBAcGFyYW0gIGVudiAgICAgIEhhc2h0YWJsZSB3aXRoIHRoZSBkZXNpcmVkIHNjcmlwdCBlbnZpcm9ubWVudAorICAgICAqIEBwYXJhbSAgd2QgICAgICAgRmlsZSB3aXRoIHRoZSBzY3JpcHQncyBkZXNpcmVkIHdvcmtpbmcgZGlyZWN0b3J5CisgICAgICogQHBhcmFtICBwYXJhbXMgICBIYXNodGFibGUgd2l0aCB0aGUgc2NyaXB0J3MgcXVlcnkgcGFyYW1ldGVycworICAgICAqLworICAgIHB1YmxpYyBQcm9jZXNzSGVscGVyKAorICAgICAgICBTdHJpbmcgY29tbWFuZCwKKyAgICAgICAgSGFzaHRhYmxlIGVudiwKKyAgICAgICAgRmlsZSB3ZCwKKyAgICAgICAgSGFzaHRhYmxlIHBhcmFtcykgeworICAgICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kOworICAgICAgICB0aGlzLmVudiA9IGVudjsKKyAgICAgICAgdGhpcy53ZCA9IHdkOworICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKKyAgICAgICAgdXBkYXRlUmVhZHlTdGF0dXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgJiBzZXRzIHJlYWR5IHN0YXR1cworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlYWR5U3RhdHVzKCkgeworICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsCisgICAgICAgICAgICAmJiBlbnYgIT0gbnVsbAorICAgICAgICAgICAgJiYgd2QgIT0gbnVsbAorICAgICAgICAgICAgJiYgcGFyYW1zICE9IG51bGwKKyAgICAgICAgICAgICYmIHJlc3BvbnNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlYWR5VG9SdW4gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVhZHlUb1J1biA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyByZWFkeSBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gICBmYWxzZSBpZiBub3QgcmVhZHkgKDxjb2RlPnJ1bjwvY29kZT4gd2lsbCB0aHJvdworICAgICAqICAgICAgICAgICBhbiBleGNlcHRpb24pLCB0cnVlIGlmIHJlYWR5CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkeSgpIHsKKyAgICAgICAgcmV0dXJuIHJlYWR5VG9SdW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBIdHRwU2VydmxldFJlc3BvbnNlIG9iamVjdCB1c2VkIHRvIHNldCBoZWFkZXJzIGFuZCBzZW5kCisgICAgICogb3V0cHV0IHRvCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHJlc3BvbnNlICAgSHR0cFNlcnZsZXRSZXNwb25zZSB0byBiZSB1c2VkCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNwb25zZShIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKyAgICAgICAgdXBkYXRlUmVhZHlTdGF0dXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHN0YW5kYXJkIGlucHV0IHRvIGJlIHBhc3NlZCBvbiB0byB0aGUgaW52b2tlZCBjZ2kgc2NyaXB0CisgICAgICoKKyAgICAgKiBAcGFyYW0gIHN0ZGluICAgSW5wdXRTdHJlYW0gdG8gYmUgdXNlZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5wdXQoSW5wdXRTdHJlYW0gc3RkaW4pIHsKKyAgICAgICAgdGhpcy5zdGRpbiA9IHN0ZGluOworICAgICAgICB1cGRhdGVSZWFkeVN0YXR1cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIGEgSGFzaHRhYmxlIHRvIGEgU3RyaW5nIGFycmF5IGJ5IGNvbnZlcnRpbmcgZWFjaAorICAgICAqIGtleS92YWx1ZSBwYWlyIGluIHRoZSBIYXNodGFibGUgdG8gYSBTdHJpbmcgaW4gdGhlIGZvcm0KKyAgICAgKiAia2V5PXZhbHVlIiAoaGFzaGtleSArICI9IiArIGhhc2guZ2V0KGhhc2hrZXkpLnRvU3RyaW5nKCkpCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGggICBIYXNodGFibGUgdG8gY29udmVydAorICAgICAqCisgICAgICogQHJldHVybiAgICAgY29udmVydGVkIHN0cmluZyBhcnJheQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiAgTnVsbFBvaW50ZXJFeGNlcHRpb24gICBpZiBhIGhhc2gga2V5IGhhcyBhIG51bGwgdmFsdWUKKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nW10gaGFzaFRvU3RyaW5nQXJyYXkoSGFzaHRhYmxlIGgpCisgICAgICAgIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworICAgICAgICBFbnVtZXJhdGlvbiBlID0gaC5rZXlzKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgayA9IGUubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOworICAgICAgICAgICAgdi5hZGQoayArICI9IiArIGguZ2V0KGspKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSBzdHJBcnIgPSBuZXcgU3RyaW5nW3Yuc2l6ZSgpXTsKKyAgICAgICAgdi5jb3B5SW50byhzdHJBcnIpOworICAgICAgICByZXR1cm4gc3RyQXJyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGEgcHJvY2VzcyBzY3JpcHQgd2l0aCB0aGUgZGVzaXJlZCBlbnZpcm9ubWVudCwgY3VycmVudCB3b3JraW5nCisgICAgICogZGlyZWN0b3J5LCBhbmQgaW5wdXQvb3V0cHV0IHN0cmVhbXMKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIENHSSBzcGVjaWZpY2F0aW9uIHJlY29tbWVkYXRpb25zOgorICAgICAqIDxVTD4KKyAgICAgKiA8TEk+IFNlcnZlcnMgU0hPVUxEIHByb3ZpZGUgdGhlICI8Y29kZT5xdWVyeTwvY29kZT4iIGNvbXBvbmVudCBvZgorICAgICAqICAgICAgdGhlIHNjcmlwdC1VUkkgYXMgY29tbWFuZC1saW5lIGFyZ3VtZW50cyB0byBzY3JpcHRzIGlmIGl0CisgICAgICogICAgICBkb2VzIG5vdCBjb250YWluIGFueSB1bmVuY29kZWQgIj0iIGNoYXJhY3RlcnMgYW5kIHRoZQorICAgICAqICAgICAgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBjYW4gYmUgZ2VuZXJhdGVkIGluIGFuIHVuYW1iaWd1b3VzCisgICAgICogICAgICBtYW5uZXIuCisgICAgICogPExJPiBTZXJ2ZXJzIFNIT1VMRCBzZXQgdGhlIEFVVEhfVFlQRSBtZXRhdmFyaWFibGUgdG8gdGhlIHZhbHVlCisgICAgICogICAgICBvZiB0aGUgIjxjb2RlPmF1dGgtc2NoZW1lPC9jb2RlPiIgdG9rZW4gb2YgdGhlCisgICAgICogICAgICAiPGNvZGU+QXV0aG9yaXphdGlvbjwvY29kZT4iIGlmIGl0IHdhcyBzdXBwbGllZCBhcyBwYXJ0IG9mIHRoZQorICAgICAqICAgICAgcmVxdWVzdCBoZWFkZXIuICBTZWUgPGNvZGU+Z2V0Q0dJRW52aXJvbm1lbnQ8L2NvZGU+IG1ldGhvZC4KKyAgICAgKiA8TEk+IFdoZXJlIGFwcGxpY2FibGUsIHNlcnZlcnMgU0hPVUxEIHNldCB0aGUgY3VycmVudCB3b3JraW5nCisgICAgICogICAgICBkaXJlY3RvcnkgdG8gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgc2NyaXB0IGlzIGxvY2F0ZWQKKyAgICAgKiAgICAgIGJlZm9yZSBpbnZva2luZyBpdC4KKyAgICAgKiA8TEk+IFNlcnZlciBpbXBsZW1lbnRhdGlvbnMgU0hPVUxEIGRlZmluZSB0aGVpciBiZWhhdmlvciBmb3IgdGhlCisgICAgICogICAgICBmb2xsb3dpbmcgY2FzZXM6CisgICAgICogICAgIDx1bD4KKyAgICAgKiAgICAgPExJPiA8dT5BbGxvd2VkIGNoYXJhY3RlcnMgaW4gcGF0aEluZm88L3U+OiAgVGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqICAgICAgICAgICAgIGRvZXMgbm90IGFsbG93IEFTQ0lJIE5VTCBub3IgYW55IGNoYXJhY3RlciB3aGljaCBjYW5ub3QKKyAgICAgKiAgICAgICAgICAgICBiZSBVUkwtZW5jb2RlZCBhY2NvcmRpbmcgdG8gaW50ZXJuZXQgc3RhbmRhcmRzOworICAgICAqICAgICA8TEk+IDx1PkFsbG93ZWQgY2hhcmFjdGVycyBpbiBwYXRoIHNlZ21lbnRzPC91PjogVGhpcworICAgICAqICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGFsbG93IG5vbi10ZXJtaW5hbCBOVUxMCisgICAgICogICAgICAgICAgICAgc2VnbWVudHMgaW4gdGhlIHRoZSBwYXRoIC0tIElPRXhjZXB0aW9ucyBtYXkgYmUgdGhyb3duOworICAgICAqICAgICA8TEk+IDx1PiI8Y29kZT4uPC9jb2RlPiIgYW5kICI8Y29kZT4uLjwvY29kZT4iIHBhdGgKKyAgICAgKiAgICAgICAgICAgICBzZWdtZW50czwvdT46CisgICAgICogICAgICAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBhbGxvdyAiPGNvZGU+LjwvY29kZT4iIGFuZAorICAgICAqICAgICAgICAgICAgICI8Y29kZT4uLjwvY29kZT4iIGluIHRoZSB0aGUgcGF0aCwgYW5kIHN1Y2ggY2hhcmFjdGVycworICAgICAqICAgICAgICAgICAgIHdpbGwgcmVzdWx0IGluIGFuIElPRXhjZXB0aW9uIGJlaW5nIHRocm93bjsKKyAgICAgKiAgICAgPExJPiA8dT5JbXBsZW1lbnRhdGlvbiBsaW1pdGF0aW9uczwvdT46IFRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgKiAgICAgICAgICAgICBkb2VzIG5vdCBpbXBvc2UgYW55IGxpbWl0YXRpb25zIGV4Y2VwdCBhcyBkb2N1bWVudGVkCisgICAgICogICAgICAgICAgICAgYWJvdmUuICBUaGlzIGltcGxlbWVudGF0aW9uIG1heSBiZSBsaW1pdGVkIGJ5IHRoZQorICAgICAqICAgICAgICAgICAgIHNlcnZsZXQgY29udGFpbmVyIHVzZWQgdG8gaG91c2UgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiAgICAgICAgICAgICBJbiBwYXJ0aWN1bGFyLCBhbGwgdGhlIHByaW1hcnkgQ0dJIHZhcmlhYmxlIHZhbHVlcworICAgICAqICAgICAgICAgICAgIGFyZSBkZXJpdmVkIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGZyb20gdGhlCisgICAgICogICAgICAgICAgICAgY29udGFpbmVyJ3MgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlcnZsZXQgQVBJIG1ldGhvZHMuCisgICAgICogICAgIDwvdWw+CisgICAgICogPC9VTD4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGphdmEubGFuZy5SdW50aW1lI2V4ZWMoU3RyaW5nIGNvbW1hbmQsIAorICAgICAqIFN0cmluZ1tdIGVudnAsIEZpbGUgZGlyKQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBwcm9ibGVtcyBkdXJpbmcgcmVhZGluZy93cml0aW5nIG9jY3VyCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8qCisgICAgICAgICAqIFJFTUlORDogIHRoaXMgbWV0aG9kIGZlZWxzIHRvbyBiaWc7IHNob3VsZCBpdCBiZSByZS13cml0dGVuPworICAgICAgICAgKi8KKworICAgICAgICBpZiAoIWlzUmVhZHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiBub3QgcmVhZHkgdG8gcnVuLiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoInJ1bkNHSShlbnZwPVsiICsgZW52ICsgIl0sIGNvbW1hbmQ9IiArIGNvbW1hbmQgKyAiKSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChjb21tYW5kLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IgKyAiLiIgKyBGaWxlLnNlcGFyYXRvcikgPj0gMCkKKyAgICAgICAgICAgIHx8IChjb21tYW5kLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IgKyAiLi4iKSA+PSAwKQorICAgICAgICAgICAgfHwgKGNvbW1hbmQuaW5kZXhPZigiLi4iICsgRmlsZS5zZXBhcmF0b3IpID49IDApKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICJJbGxlZ2FsIENoYXJhY3RlciBpbiBDR0kgY29tbWFuZCAiCisgICAgICAgICAgICAgICAgICAgICsgInBhdGggKCcuJyBvciAnLi4nKSBkZXRlY3RlZC4gIE5vdCAiCisgICAgICAgICAgICAgICAgICAgICsgInJ1bm5pbmcgQ0dJIFsiCisgICAgICAgICAgICAgICAgICAgICsgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICArICJdLiIpOworICAgICAgICB9CisKKyAgICAgICAgLyogb3JpZ2luYWwgY29udGVudC9zdHJ1Y3R1cmUgb2YgdGhpcyBzZWN0aW9uIHRha2VuIGZyb20KKyAgICAgICAgICogaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyLworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWdQYXJhZGUvYnVncy80MjE2ODg0Lmh0bWwKKyAgICAgICAgICogd2l0aCBtYWpvciBtb2RpZmljYXRpb25zIGJ5IE1hcnRpbiBEZW5nbGVyCisgICAgICAgICAqLworICAgICAgICBSdW50aW1lIHJ0ID0gbnVsbDsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgY29tbWFuZHNTdGRPdXQgPSBudWxsOworICAgICAgICBCdWZmZXJlZFJlYWRlciBjb21tYW5kc1N0ZEVyciA9IG51bGw7CisgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGNvbW1hbmRzU3RkSW4gPSBudWxsOworICAgICAgICBQcm9jZXNzIHByb2MgPSBudWxsOworICAgICAgICBieXRlW10gYkJ1ZiA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICBjaGFyW10gY0J1ZiA9IG5ldyBjaGFyWzEwMjRdOworICAgICAgICBpbnQgYnVmUmVhZCA9IC0xOworCisgICAgICAgIC8vY3JlYXRlIHF1ZXJ5IGFyZ3VtZW50cworICAgICAgICBFbnVtZXJhdGlvbiBwYXJhbU5hbWVzID0gcGFyYW1zLmtleXMoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGNtZEFuZEFyZ3MgPSBuZXcgU3RyaW5nQnVmZmVyKGNvbW1hbmQpOworICAgICAgICBpZiAocGFyYW1OYW1lcyAhPSBudWxsICYmIHBhcmFtTmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIGNtZEFuZEFyZ3MuYXBwZW5kKCIgIik7CisgICAgICAgICAgICB3aGlsZSAocGFyYW1OYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrID0gKFN0cmluZykgcGFyYW1OYW1lcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIFN0cmluZyB2ID0gcGFyYW1zLmdldChrKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGlmICgoay5pbmRleE9mKCI9IikgPCAwKSAmJiAodi5pbmRleE9mKCI9IikgPCAwKSkgeworICAgICAgICAgICAgICAgICAgICBjbWRBbmRBcmdzLmFwcGVuZChrKTsKKyAgICAgICAgICAgICAgICAgICAgY21kQW5kQXJncy5hcHBlbmQoIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgdiA9IGphdmEubmV0LlVSTEVuY29kZXIuZW5jb2RlKHYpOworICAgICAgICAgICAgICAgICAgICBjbWRBbmRBcmdzLmFwcGVuZCh2KTsKKyAgICAgICAgICAgICAgICAgICAgY21kQW5kQXJncy5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcG9zdEluID0gZ2V0UG9zdElucHV0KHBhcmFtcyk7CisgICAgICAgIGludCBjb250ZW50TGVuZ3RoID0KKyAgICAgICAgICAgIChwb3N0SW4ubGVuZ3RoKCkgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikubGVuZ3RoKCkpOworICAgICAgICBpZiAoIlBPU1QiLmVxdWFscyhlbnYuZ2V0KCJSRVFVRVNUX01FVEhPRCIpKSkgeworICAgICAgICAgICAgZW52LnB1dCgiQ09OVEVOVF9MRU5HVEgiLCBuZXcgSW50ZWdlcihjb250ZW50TGVuZ3RoKSk7CisgICAgICAgIH0KKworICAgICAgICBydCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOworICAgICAgICBwcm9jID0gcnQuZXhlYyhjbWRBbmRBcmdzLnRvU3RyaW5nKCksIGhhc2hUb1N0cmluZ0FycmF5KGVudiksIHdkKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBwcm92aWRlIGlucHV0IHRvIGNnaQorICAgICAgICAgKiBGaXJzdCAgLS0gcGFyYW1ldGVycworICAgICAgICAgKiBTZWNvbmQgLS0gYW55IHJlbWFpbmluZyBpbnB1dAorICAgICAgICAgKi8KKyAgICAgICAgY29tbWFuZHNTdGRJbiA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShwcm9jLmdldE91dHB1dFN0cmVhbSgpKTsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoInJ1bkNHSSBzdGRpbj1bIiArIHN0ZGluICsgIl0sIHFzPSIgKyBlbnYuZ2V0KCJRVUVSWV9TVFJJTkciKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCJQT1NUIi5lcXVhbHMoZW52LmdldCgiUkVRVUVTVF9NRVRIT0QiKSkpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygicnVuQ0dJOiB3cml0aW5nIC0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHBvc3RJbik7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAorICAgICAgICAgICAgICAgICAgICAicnVuQ0dJOiBuZXcgY29udGVudF9sZW5ndGg9IgorICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250ZW50TGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICArICItLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tbWFuZHNTdGRJbi53cml0ZShwb3N0SW4uZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0ZGluICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vUkVNSU5EOiBkb2N1bWVudCB0aGlzCisgICAgICAgICAgICAvKiBhc3N1bWUgaWYgbm90aGluZyBpcyBhdmFpbGFibGUgYWZ0ZXIgYSB0aW1lLCB0aGF0IG5vdGhpbmcgaXMKKyAgICAgICAgICAgICAqIGNvbWluZy4uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoc3RkaW4uYXZhaWxhYmxlKCkgPD0gMCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCisgICAgICAgICAgICAgICAgICAgICAgICAicnVuQ0dJIHN0ZGluIGlzIE5PVCBhdmFpbGFibGUgWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0ZGluLmF2YWlsYWJsZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoaUNsaWVudElucHV0VGltZW91dCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGRpbi5hdmFpbGFibGUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAorICAgICAgICAgICAgICAgICAgICAgICAgInJ1bkNHSSBzdGRpbiBJUyBhdmFpbGFibGUgWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0ZGluLmF2YWlsYWJsZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiQnVmID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICAgICAgYnVmUmVhZCA9IC0xOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoYnVmUmVhZCA9IHN0ZGluLnJlYWQoYkJ1ZikpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydW5DR0k6IHJlYWQgWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYnVmUmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBieXRlcyBmcm9tIHN0ZGluIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kc1N0ZEluLndyaXRlKGJCdWYsIDAsIGJ1ZlJlYWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJydW5DR0k6IERPTkUgUkVBRElORyBmcm9tIHN0ZGluIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJydW5DR0k6IGNvdWxkbid0IHdyaXRlIGFsbCBieXRlcy4iLCBpb2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb21tYW5kc1N0ZEluLmZsdXNoKCk7CisgICAgICAgIGNvbW1hbmRzU3RkSW4uY2xvc2UoKTsKKworICAgICAgICAvKiB3ZSB3YW50IHRvIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIGV4aXQsICBQcm9jZXNzLndhaXRGb3IoKQorICAgICAgICAgKiBpcyB1c2VsZXNzIGluIG91ciBzaXR1YXRpb247IHNlZQorICAgICAgICAgKiBodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Z1BhcmFkZS9idWdzLzQyMjM2NTAuaHRtbAorICAgICAgICAgKi8KKworICAgICAgICBib29sZWFuIGlzUnVubmluZyA9IHRydWU7CisgICAgICAgIGNvbW1hbmRzU3RkT3V0ID0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpKSk7CisgICAgICAgIGNvbW1hbmRzU3RkRXJyID0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvYy5nZXRFcnJvclN0cmVhbSgpKSk7CisgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIHNlcnZsZXRDb250YWluZXJTdGRvdXQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlcnZsZXRDb250YWluZXJTdGRvdXQgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRXcml0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgIC8vTk9PUDogbm8gb3V0cHV0IHdpbGwgYmUgd3JpdHRlbgorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKGlzUnVubmluZykgeworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vcmVhZCBzdGRlcnIgZmlyc3QKKyAgICAgICAgICAgICAgICBjQnVmID0gbmV3IGNoYXJbMTAyNF07CisgICAgICAgICAgICAgICAgd2hpbGUgKChidWZSZWFkID0gY29tbWFuZHNTdGRFcnIucmVhZChjQnVmKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZsZXRDb250YWluZXJTdGRvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldENvbnRhaW5lclN0ZG91dC53cml0ZShjQnVmLCAwLCBidWZSZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vc2V0IGhlYWRlcnMKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7CisgICAgICAgICAgICAgICAgd2hpbGUgKCgobGluZSA9IGNvbW1hbmRzU3RkT3V0LnJlYWRMaW5lKCkpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmICEoIiIuZXF1YWxzKGxpbmUpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygicnVuQ0dJOiBhZGRIZWFkZXIoXCIiICsgbGluZSArICJcIikiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCJIVFRQIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogc2hvdWxkIHNldCBzdGF0dXMgY29kZXMgKE5QSCBzdXBwb3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlc3BvbnNlLnNldFN0YXR1cyhnZXRTdGF0dXNDb2RlKGxpbmUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUuaW5kZXhPZigiOiIpKS50cmltKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5zdWJzdHJpbmcobGluZS5pbmRleE9mKCI6IikgKyAxKS50cmltKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy93cml0ZSBvdXRwdXQKKyAgICAgICAgICAgICAgICBjQnVmID0gbmV3IGNoYXJbMTAyNF07CisgICAgICAgICAgICAgICAgd2hpbGUgKChidWZSZWFkID0gY29tbWFuZHNTdGRPdXQucmVhZChjQnVmKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZsZXRDb250YWluZXJTdGRvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJydW5DR0k6IHdyaXRlKFwiIiArIG5ldyBTdHJpbmcoY0J1ZikgKyAiXCIpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0Q29udGFpbmVyU3Rkb3V0LndyaXRlKGNCdWYsIDAsIGJ1ZlJlYWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHNlcnZsZXRDb250YWluZXJTdGRvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0Q29udGFpbmVyU3Rkb3V0LmZsdXNoKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJvYy5leGl0VmFsdWUoKTsgLy8gVGhyb3dzIGV4Y2VwdGlvbiBpZiBhbGl2ZQorCisgICAgICAgICAgICAgICAgaXNSdW5uaW5nID0gZmFsc2U7CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvL3JlcGxhY2VtZW50IGZvciBQcm9jZXNzLndhaXRGb3IoKQorCisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIHN0cmluZyBmb3IgaW5wdXQgdG8gYSBQT1NUIGNnaSBzY3JpcHQKKyAgICAgKgorICAgICAqIEBwYXJhbSAgcGFyYW1zICAgSGFzaHRhYmxlIG9mIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvCisgICAgICogICAgICAgICAgICAgICAgICB0aGUgQ0dJIHNjcmlwdAorICAgICAqIEByZXR1cm4gICAgICAgICAgZm9yIHVzZSBhcyBpbnB1dCB0byB0aGUgQ0dJIHNjcmlwdAorICAgICAqLworCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQb3N0SW5wdXQoSGFzaHRhYmxlIHBhcmFtcykgeworICAgICAgICBTdHJpbmcgbGluZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgRW51bWVyYXRpb24gcGFyYW1OYW1lcyA9IHBhcmFtcy5rZXlzKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBwb3N0SW5wdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHFzID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7CisgICAgICAgIGlmIChwYXJhbU5hbWVzICE9IG51bGwgJiYgcGFyYW1OYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgd2hpbGUgKHBhcmFtTmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgayA9IChTdHJpbmcpIHBhcmFtTmFtZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdiA9IHBhcmFtcy5nZXQoaykudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoKGsuaW5kZXhPZigiPSIpIDwgMCkgJiYgKHYuaW5kZXhPZigiPSIpIDwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zdElucHV0LmFwcGVuZChrKTsKKyAgICAgICAgICAgICAgICAgICAgcXMuYXBwZW5kKGspOworICAgICAgICAgICAgICAgICAgICBwb3N0SW5wdXQuYXBwZW5kKCI9Iik7CisgICAgICAgICAgICAgICAgICAgIHFzLmFwcGVuZCgiPSIpOworICAgICAgICAgICAgICAgICAgICBwb3N0SW5wdXQuYXBwZW5kKHYpOworICAgICAgICAgICAgICAgICAgICBxcy5hcHBlbmQodik7CisgICAgICAgICAgICAgICAgICAgIHBvc3RJbnB1dC5hcHBlbmQobGluZVNlcGFyYXRvcik7CisgICAgICAgICAgICAgICAgICAgIHFzLmFwcGVuZCgiJiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBxcy5hcHBlbmQobGluZVNlcGFyYXRvcik7CisgICAgICAgIHJldHVybiBxcy5hcHBlbmQocG9zdElucHV0KS50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SUNsaWVudElucHV0VGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIGlDbGllbnRJbnB1dFRpbWVvdXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SUNsaWVudElucHV0VGltZW91dChpbnQgaUNsaWVudElucHV0VGltZW91dCkgeworICAgICAgICB0aGlzLmlDbGllbnRJbnB1dFRpbWVvdXQgPSBpQ2xpZW50SW5wdXRUaW1lb3V0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1F1ZXVlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9RdWV1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNjljNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9RdWV1ZS5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIEEgc2ltcGxlIEZJRk8gcXVldWUgY2xhc3Mgd2hpY2ggY2F1c2VzIHRoZSBjYWxsaW5nIHRocmVhZCB0byB3YWl0CisgKiBpZiB0aGUgcXVldWUgaXMgZW1wdHkgYW5kIG5vdGlmaWVzIHRocmVhZHMgdGhhdCBhcmUgd2FpdGluZyB3aGVuIGl0CisgKiBpcyBub3QgZW1wdHkuCisgKgorICogQGF1dGhvciBBbmlsIFYgKGFrdkBlbmcuc3VuLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFF1ZXVlIHsKKyAgICBwcml2YXRlIFZlY3RvciB2ZWN0b3IgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBQdXQgdGhlIG9iamVjdCBpbnRvIHRoZSBxdWV1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgIG9iamVjdCAgICAgICAgICB0aGUgb2JqZWN0IHRvIGJlIGFwcGVuZGVkIHRvIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHV0KE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgdmVjdG9yLmFkZEVsZW1lbnQob2JqZWN0KTsKKyAgICAgICAgbm90aWZ5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHVsbCB0aGUgZmlyc3Qgb2JqZWN0IG91dCBvZiB0aGUgcXVldWUuIFdhaXQgaWYgdGhlIHF1ZXVlIGlzCisgICAgICogZW1wdHkuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcHVsbCgpIHsKKyAgICAgICAgd2hpbGUgKGlzRW1wdHkoKSkKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd2FpdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmlyc3Qgb2JqZWN0IG91dCBvZiB0aGUgcXVldWUuIFJldHVybiBudWxsIGlmIHRoZSBxdWV1ZQorICAgICAqIGlzIGVtcHR5LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGdldCgpIHsKKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IHBlZWsoKTsKKyAgICAgICAgaWYgKG9iamVjdCAhPSBudWxsKQorICAgICAgICAgICAgdmVjdG9yLnJlbW92ZUVsZW1lbnRBdCgwKTsKKyAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZWVrIHRvIHNlZSBpZiBzb21ldGhpbmcgaXMgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcGVlaygpIHsKKyAgICAgICAgaWYgKGlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gdmVjdG9yLmVsZW1lbnRBdCgwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgcXVldWUgZW1wdHk/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIHZlY3Rvci5pc0VtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSG93IG1hbnkgZWxlbWVudHMgYXJlIHRoZXJlIGluIHRoaXMgcXVldWU/CisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gdmVjdG9yLnNpemUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9SZXF1ZXN0VXRpbC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUmVxdWVzdFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODQwYWVjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUmVxdWVzdFV0aWwuamF2YQpAQCAtMCwwICsxLDUxMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CisKKworLyoqCisgKiBHZW5lcmFsIHB1cnBvc2UgcmVxdWVzdCBwYXJzaW5nIGFuZCBlbmNvZGluZyB1dGlsaXR5IG1ldGhvZHMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFRpbSBUeWUKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFJlcXVlc3RVdGlsIHsKKworCisgICAgLyoqCisgICAgICogVGhlIERhdGVGb3JtYXQgdG8gdXNlIGZvciBnZW5lcmF0aW5nIHJlYWRhYmxlIGRhdGVzIGluIGNvb2tpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXQgPQorICAgICAgICBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiIEVFRUUsIGRkLU1NTS15eSBrazptbTpzcyB6eiIpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgZm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbmNvZGUgYSBjb29raWUgYXMgcGVyIFJGQyAyMTA5LiAgVGhlIHJlc3VsdGluZyBzdHJpbmcgY2FuIGJlIHVzZWQKKyAgICAgKiBhcyB0aGUgdmFsdWUgZm9yIGEgPGNvZGU+U2V0LUNvb2tpZTwvY29kZT4gaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llIHRvIGVuY29kZS4KKyAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIGZvbGxvd2luZyBSRkMgMjEwOS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVDb29raWUoQ29va2llIGNvb2tpZSkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCBjb29raWUuZ2V0TmFtZSgpICk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIj0iKTsKKyAgICAgICAgYnVmLmFwcGVuZChjb29raWUuZ2V0VmFsdWUoKSk7CisKKyAgICAgICAgaWYgKGNvb2tpZS5nZXRDb21tZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiOyBDb21tZW50PVwiIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGNvb2tpZS5nZXRDb21tZW50KCkpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb29raWUuZ2V0RG9tYWluKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiOyBEb21haW49XCIiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY29va2llLmdldERvbWFpbigpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlwiIik7CisgICAgICAgIH0KKworICAgICAgICBsb25nIGFnZSA9IGNvb2tpZS5nZXRNYXhBZ2UoKTsKKyAgICAgICAgaWYgKGNvb2tpZS5nZXRNYXhBZ2UoKSA+PSAwKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCI7IE1heC1BZ2U9XCIiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY29va2llLmdldE1heEFnZSgpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlwiIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29va2llLmdldFBhdGgoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCI7IFBhdGg9XCIiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY29va2llLmdldFBhdGgoKSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcIiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvb2tpZS5nZXRTZWN1cmUoKSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiOyBTZWN1cmUiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb29raWUuZ2V0VmVyc2lvbigpID4gMCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiOyBWZXJzaW9uPVwiIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGNvb2tpZS5nZXRWZXJzaW9uKCkpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmlsdGVyIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBzdHJpbmcgZm9yIGNoYXJhY3RlcnMgdGhhdCBhcmUgc2Vuc2l0aXZlCisgICAgICogaW4gSFRNTC4gIFRoaXMgYXZvaWRzIHBvdGVudGlhbCBhdHRhY2tzIGNhdXNlZCBieSBpbmNsdWRpbmcgSmF2YVNjcmlwdAorICAgICAqIGNvZGVzIGluIHRoZSByZXF1ZXN0IFVSTCB0aGF0IGlzIG9mdGVuIHJlcG9ydGVkIGluIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugc3RyaW5nIHRvIGJlIGZpbHRlcmVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyKFN0cmluZyBtZXNzYWdlKSB7CisKKyAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgY2hhciBjb250ZW50W10gPSBuZXcgY2hhclttZXNzYWdlLmxlbmd0aCgpXTsKKyAgICAgICAgbWVzc2FnZS5nZXRDaGFycygwLCBtZXNzYWdlLmxlbmd0aCgpLCBjb250ZW50LCAwKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoY29udGVudC5sZW5ndGggKyA1MCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChjb250ZW50W2ldKSB7CisgICAgICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImbHQ7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImZ3Q7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcmJzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImYW1wOyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiJnF1b3Q7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoY29udGVudFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChyZXN1bHQudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE5vcm1hbGl6ZSBhIHJlbGF0aXZlIFVSSSBwYXRoIHRoYXQgbWF5IGhhdmUgcmVsYXRpdmUgdmFsdWVzICgiLy4vIiwKKyAgICAgKiAiLy4uLyIsIGFuZCBzbyBvbiApIGl0IGl0LiAgPHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+IC0gVGhpcyBtZXRob2QgaXMKKyAgICAgKiB1c2VmdWwgb25seSBmb3Igbm9ybWFsaXppbmcgYXBwbGljYXRpb24tZ2VuZXJhdGVkIHBhdGhzLiAgSXQgZG9lcyBub3QKKyAgICAgKiB0cnkgdG8gcGVyZm9ybSBzZWN1cml0eSBjaGVja3MgZm9yIG1hbGljaW91cyBpbnB1dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFJlbGF0aXZlIHBhdGggdG8gYmUgbm9ybWFsaXplZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgcGF0aCkgeworCisgICAgICAgIGlmIChwYXRoID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBDcmVhdGUgYSBwbGFjZSBmb3IgdGhlIG5vcm1hbGl6ZWQgcGF0aAorICAgICAgICBTdHJpbmcgbm9ybWFsaXplZCA9IHBhdGg7CisKKyAgICAgICAgaWYgKG5vcm1hbGl6ZWQuZXF1YWxzKCIvLiIpKQorICAgICAgICAgICAgcmV0dXJuICIvIjsKKworICAgICAgICAvLyBBZGQgYSBsZWFkaW5nICIvIiBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKCFub3JtYWxpemVkLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgICAgIG5vcm1hbGl6ZWQgPSAiLyIgKyBub3JtYWxpemVkOworCisgICAgICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8vIiBpbiB0aGUgbm9ybWFsaXplZCBwYXRoCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBub3JtYWxpemVkLmluZGV4T2YoIi8vIik7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDAsIGluZGV4KSArCisgICAgICAgICAgICAgICAgbm9ybWFsaXplZC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8uLyIgaW4gdGhlIG5vcm1hbGl6ZWQgcGF0aAorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gbm9ybWFsaXplZC5pbmRleE9mKCIvLi8iKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zdWJzdHJpbmcoMCwgaW5kZXgpICsKKyAgICAgICAgICAgICAgICBub3JtYWxpemVkLnN1YnN0cmluZyhpbmRleCArIDIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzb2x2ZSBvY2N1cnJlbmNlcyBvZiAiLy4uLyIgaW4gdGhlIG5vcm1hbGl6ZWQgcGF0aAorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gbm9ybWFsaXplZC5pbmRleE9mKCIvLi4vIik7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGluZGV4ID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsgIC8vIFRyeWluZyB0byBnbyBvdXRzaWRlIG91ciBjb250ZXh0CisgICAgICAgICAgICBpbnQgaW5kZXgyID0gbm9ybWFsaXplZC5sYXN0SW5kZXhPZignLycsIGluZGV4IC0gMSk7CisgICAgICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zdWJzdHJpbmcoMCwgaW5kZXgyKSArCisgICAgICAgICAgICAgICAgbm9ybWFsaXplZC5zdWJzdHJpbmcoaW5kZXggKyAzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybiB0aGUgbm9ybWFsaXplZCBwYXRoIHRoYXQgd2UgaGF2ZSBjb21wbGV0ZWQKKyAgICAgICAgcmV0dXJuIChub3JtYWxpemVkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlIGhlYWRlci4KKyAgICAgKiBJZiB0aGUgY29udGVudCB0eXBlIGlzIG51bGwsIG9yIHRoZXJlIGlzIG5vIGV4cGxpY2l0IGNoYXJhY3RlciBlbmNvZGluZywKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZW50VHlwZSBhIGNvbnRlbnQgdHlwZSBoZWFkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZUNoYXJhY3RlckVuY29kaW5nKFN0cmluZyBjb250ZW50VHlwZSkgeworCisgICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgaW50IHN0YXJ0ID0gY29udGVudFR5cGUuaW5kZXhPZigiY2hhcnNldD0iKTsKKyAgICAgICAgaWYgKHN0YXJ0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIFN0cmluZyBlbmNvZGluZyA9IGNvbnRlbnRUeXBlLnN1YnN0cmluZyhzdGFydCArIDgpOworICAgICAgICBpbnQgZW5kID0gZW5jb2RpbmcuaW5kZXhPZignOycpOworICAgICAgICBpZiAoZW5kID49IDApCisgICAgICAgICAgICBlbmNvZGluZyA9IGVuY29kaW5nLnN1YnN0cmluZygwLCBlbmQpOworICAgICAgICBlbmNvZGluZyA9IGVuY29kaW5nLnRyaW0oKTsKKyAgICAgICAgaWYgKChlbmNvZGluZy5sZW5ndGgoKSA+IDIpICYmIChlbmNvZGluZy5zdGFydHNXaXRoKCJcIiIpKQorICAgICAgICAgICAgJiYgKGVuY29kaW5nLmVuZHNXaXRoKCJcIiIpKSkKKyAgICAgICAgICAgIGVuY29kaW5nID0gZW5jb2Rpbmcuc3Vic3RyaW5nKDEsIGVuY29kaW5nLmxlbmd0aCgpIC0gMSk7CisgICAgICAgIHJldHVybiAoZW5jb2RpbmcudHJpbSgpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFyc2UgYSBjb29raWUgaGVhZGVyIGludG8gYW4gYXJyYXkgb2YgY29va2llcyBhY2NvcmRpbmcgdG8gUkZDIDIxMDkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGVhZGVyIFZhbHVlIG9mIGFuIEhUVFAgIkNvb2tpZSIgaGVhZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb29raWVbXSBwYXJzZUNvb2tpZUhlYWRlcihTdHJpbmcgaGVhZGVyKSB7CisKKyAgICAgICAgaWYgKChoZWFkZXIgPT0gbnVsbCkgfHwgKGhlYWRlci5sZW5ndGgoKSA8IDEpKQorICAgICAgICAgICAgcmV0dXJuIChuZXcgQ29va2llWzBdKTsKKworICAgICAgICBBcnJheUxpc3QgY29va2llcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgd2hpbGUgKGhlYWRlci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGludCBzZW1pY29sb24gPSBoZWFkZXIuaW5kZXhPZignOycpOworICAgICAgICAgICAgaWYgKHNlbWljb2xvbiA8IDApCisgICAgICAgICAgICAgICAgc2VtaWNvbG9uID0gaGVhZGVyLmxlbmd0aCgpOworICAgICAgICAgICAgaWYgKHNlbWljb2xvbiA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gaGVhZGVyLnN1YnN0cmluZygwLCBzZW1pY29sb24pOworICAgICAgICAgICAgaWYgKHNlbWljb2xvbiA8IGhlYWRlci5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICBoZWFkZXIgPSBoZWFkZXIuc3Vic3RyaW5nKHNlbWljb2xvbiArIDEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGhlYWRlciA9ICIiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnQgZXF1YWxzID0gdG9rZW4uaW5kZXhPZignPScpOworICAgICAgICAgICAgICAgIGlmIChlcXVhbHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdG9rZW4uc3Vic3RyaW5nKDAsIGVxdWFscykudHJpbSgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSB0b2tlbi5zdWJzdHJpbmcoZXF1YWxzKzEpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgY29va2llcy5hZGQobmV3IENvb2tpZShuYW1lLCB2YWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgoQ29va2llW10pIGNvb2tpZXMudG9BcnJheShuZXcgQ29va2llW2Nvb2tpZXMuc2l6ZSgpXSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgcmVxdWVzdCBwYXJhbWV0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBTdHJpbmcgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIE1hcC4gIEl0IGlzIHByZXN1bWVkIHRoYXQgdGhlIHNwZWNpZmllZCBNYXAgaXMgbm90IGFjY2Vzc2VkIGZyb20gYW55CisgICAgICogb3RoZXIgdGhyZWFkLCBzbyBubyBzeW5jaHJvbml6YXRpb24gaXMgcGVyZm9ybWVkLgorICAgICAqIDxwPgorICAgICAqIDxzdHJvbmc+SU1QTEVNRU5UQVRJT04gTk9URTwvc3Ryb25nPjogIFVSTCBkZWNvZGluZyBpcyBwZXJmb3JtZWQKKyAgICAgKiBpbmRpdmlkdWFsbHkgb24gdGhlIHBhcnNlZCBuYW1lIGFuZCB2YWx1ZSBlbGVtZW50cywgcmF0aGVyIHRoYW4gb24KKyAgICAgKiB0aGUgZW50aXJlIHF1ZXJ5IHN0cmluZyBhaGVhZCBvZiB0aW1lLCB0byBwcm9wZXJseSBkZWFsIHdpdGggdGhlIGNhc2UKKyAgICAgKiB3aGVyZSB0aGUgbmFtZSBvciB2YWx1ZSBpbmNsdWRlcyBhbiBlbmNvZGVkICI9IiBvciAiJiIgY2hhcmFjdGVyCisgICAgICogdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgaW50ZXJwcmV0ZWQgYXMgYSBkZWxpbWl0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwIE1hcCB0aGF0IGFjY3VtdWxhdGVzIHRoZSByZXN1bHRpbmcgcGFyYW1ldGVycworICAgICAqIEBwYXJhbSBkYXRhIElucHV0IHN0cmluZyBjb250YWluaW5nIHJlcXVlc3QgcGFyYW1ldGVycworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGRhdGEgaXMgbWFsZm9ybWVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHBhcnNlUGFyYW1ldGVycyhNYXAgbWFwLCBTdHJpbmcgZGF0YSwgU3RyaW5nIGVuY29kaW5nKQorICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKChkYXRhICE9IG51bGwpICYmIChkYXRhLmxlbmd0aCgpID4gMCkpIHsKKworICAgICAgICAgICAgLy8gdXNlIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgdG8gZXh0cmFjdCBieXRlcyBvdXQgb2YgdGhlCisgICAgICAgICAgICAvLyBnaXZlbiBzdHJpbmcgc28gdGhhdCB0aGUgZW5jb2RpbmcgaXMgbm90IGxvc3QuIElmIGFuCisgICAgICAgICAgICAvLyBlbmNvZGluZyBpcyBub3Qgc3BlY2lmaWVkLCBsZXQgaXQgdXNlIHBsYXRmb3JtIGRlZmF1bHQKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gZGF0YS5nZXRCeXRlcygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gZGF0YS5nZXRCeXRlcyhlbmNvZGluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFyc2VQYXJhbWV0ZXJzKG1hcCwgYnl0ZXMsIGVuY29kaW5nKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZWNvZGUgYW5kIHJldHVybiB0aGUgc3BlY2lmaWVkIFVSTC1lbmNvZGVkIFN0cmluZy4KKyAgICAgKiBXaGVuIHRoZSBieXRlIGFycmF5IGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZywgdGhlIHN5c3RlbSBkZWZhdWx0CisgICAgICogY2hhcmFjdGVyIGVuY29kaW5nIGlzIHVzZWQuLi4gIFRoaXMgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHNvbWUgb3RoZXIKKyAgICAgKiBzZXJ2ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHN0ciBUaGUgdXJsLWVuY29kZWQgc3RyaW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhICclJyBjaGFyYWN0ZXIgaXMgbm90IGZvbGxvd2VkCisgICAgICogYnkgYSB2YWxpZCAyLWRpZ2l0IGhleGFkZWNpbWFsIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSTERlY29kZShTdHJpbmcgc3RyKSB7CisKKyAgICAgICAgcmV0dXJuIFVSTERlY29kZShzdHIsIG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZWNvZGUgYW5kIHJldHVybiB0aGUgc3BlY2lmaWVkIFVSTC1lbmNvZGVkIFN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHIgVGhlIHVybC1lbmNvZGVkIHN0cmluZworICAgICAqIEBwYXJhbSBlbmMgVGhlIGVuY29kaW5nIHRvIHVzZTsgaWYgbnVsbCwgdGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgdXNlZAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGEgJyUnIGNoYXJhY3RlciBpcyBub3QgZm9sbG93ZWQKKyAgICAgKiBieSBhIHZhbGlkIDItZGlnaXQgaGV4YWRlY2ltYWwgbnVtYmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVVJMRGVjb2RlKFN0cmluZyBzdHIsIFN0cmluZyBlbmMpIHsKKworICAgICAgICBpZiAoc3RyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIC8vIHVzZSB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIHRvIGV4dHJhY3QgYnl0ZXMgb3V0IG9mIHRoZQorICAgICAgICAvLyBnaXZlbiBzdHJpbmcgc28gdGhhdCB0aGUgZW5jb2RpbmcgaXMgbm90IGxvc3QuIElmIGFuCisgICAgICAgIC8vIGVuY29kaW5nIGlzIG5vdCBzcGVjaWZpZWQsIGxldCBpdCB1c2UgcGxhdGZvcm0gZGVmYXVsdAorICAgICAgICBieXRlW10gYnl0ZXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGVuYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnl0ZXMgPSBzdHIuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnl0ZXMgPSBzdHIuZ2V0Qnl0ZXMoZW5jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpIHt9CisKKyAgICAgICAgcmV0dXJuIFVSTERlY29kZShieXRlcywgZW5jKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVjb2RlIGFuZCByZXR1cm4gdGhlIHNwZWNpZmllZCBVUkwtZW5jb2RlZCBieXRlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGJ5dGVzIFRoZSB1cmwtZW5jb2RlZCBieXRlIGFycmF5CisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYSAnJScgY2hhcmFjdGVyIGlzIG5vdCBmb2xsb3dlZAorICAgICAqIGJ5IGEgdmFsaWQgMi1kaWdpdCBoZXhhZGVjaW1hbCBudW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVUkxEZWNvZGUoYnl0ZVtdIGJ5dGVzKSB7CisgICAgICAgIHJldHVybiBVUkxEZWNvZGUoYnl0ZXMsIG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVjb2RlIGFuZCByZXR1cm4gdGhlIHNwZWNpZmllZCBVUkwtZW5jb2RlZCBieXRlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGJ5dGVzIFRoZSB1cmwtZW5jb2RlZCBieXRlIGFycmF5CisgICAgICogQHBhcmFtIGVuYyBUaGUgZW5jb2RpbmcgdG8gdXNlOyBpZiBudWxsLCB0aGUgZGVmYXVsdCBlbmNvZGluZyBpcyB1c2VkCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYSAnJScgY2hhcmFjdGVyIGlzIG5vdCBmb2xsb3dlZAorICAgICAqIGJ5IGEgdmFsaWQgMi1kaWdpdCBoZXhhZGVjaW1hbCBudW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVUkxEZWNvZGUoYnl0ZVtdIGJ5dGVzLCBTdHJpbmcgZW5jKSB7CisKKyAgICAgICAgaWYgKGJ5dGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIGludCBsZW4gPSBieXRlcy5sZW5ndGg7CisgICAgICAgIGludCBpeCA9IDA7CisgICAgICAgIGludCBveCA9IDA7CisgICAgICAgIHdoaWxlIChpeCA8IGxlbikgeworICAgICAgICAgICAgYnl0ZSBiID0gYnl0ZXNbaXgrK107ICAgICAvLyBHZXQgYnl0ZSB0byB0ZXN0CisgICAgICAgICAgICBpZiAoYiA9PSAnKycpIHsKKyAgICAgICAgICAgICAgICBiID0gKGJ5dGUpJyAnOworICAgICAgICAgICAgfSBlbHNlIGlmIChiID09ICclJykgeworICAgICAgICAgICAgICAgIGIgPSAoYnl0ZSkgKChjb252ZXJ0SGV4RGlnaXQoYnl0ZXNbaXgrK10pIDw8IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb252ZXJ0SGV4RGlnaXQoYnl0ZXNbaXgrK10pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ5dGVzW294KytdID0gYjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5jICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIDAsIG94LCBlbmMpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzLCAwLCBveCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBieXRlIGNoYXJhY3RlciB2YWx1ZSB0byBoZXhpZGVjaW1hbCBkaWdpdCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIHRoZSBjaGFyYWN0ZXIgdmFsdWUgYnl0ZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgY29udmVydEhleERpZ2l0KCBieXRlIGIgKSB7CisgICAgICAgIGlmICgoYiA+PSAnMCcpICYmIChiIDw9ICc5JykpIHJldHVybiAoYnl0ZSkoYiAtICcwJyk7CisgICAgICAgIGlmICgoYiA+PSAnYScpICYmIChiIDw9ICdmJykpIHJldHVybiAoYnl0ZSkoYiAtICdhJyArIDEwKTsKKyAgICAgICAgaWYgKChiID49ICdBJykgJiYgKGIgPD0gJ0YnKSkgcmV0dXJuIChieXRlKShiIC0gJ0EnICsgMTApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFB1dCBuYW1lIGFuZCB2YWx1ZSBwYWlyIGluIG1hcC4gIFdoZW4gbmFtZSBhbHJlYWR5IGV4aXN0LCBhZGQgdmFsdWUKKyAgICAgKiB0byBhcnJheSBvZiB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwIFRoZSBtYXAgdG8gcG9wdWxhdGUKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgcGFyYW1ldGVyIG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHBhcmFtZXRlciB2YWx1ZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHV0TWFwRW50cnkoIE1hcCBtYXAsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgU3RyaW5nW10gbmV3VmFsdWVzID0gbnVsbDsKKyAgICAgICAgU3RyaW5nW10gb2xkVmFsdWVzID0gKFN0cmluZ1tdKSBtYXAuZ2V0KG5hbWUpOworICAgICAgICBpZiAob2xkVmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIG5ld1ZhbHVlcyA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICBuZXdWYWx1ZXNbMF0gPSB2YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ld1ZhbHVlcyA9IG5ldyBTdHJpbmdbb2xkVmFsdWVzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShvbGRWYWx1ZXMsIDAsIG5ld1ZhbHVlcywgMCwgb2xkVmFsdWVzLmxlbmd0aCk7CisgICAgICAgICAgICBuZXdWYWx1ZXNbb2xkVmFsdWVzLmxlbmd0aF0gPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBtYXAucHV0KG5hbWUsIG5ld1ZhbHVlcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgcmVxdWVzdCBwYXJhbWV0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBTdHJpbmcgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIE1hcC4gIEl0IGlzIHByZXN1bWVkIHRoYXQgdGhlIHNwZWNpZmllZCBNYXAgaXMgbm90IGFjY2Vzc2VkIGZyb20gYW55CisgICAgICogb3RoZXIgdGhyZWFkLCBzbyBubyBzeW5jaHJvbml6YXRpb24gaXMgcGVyZm9ybWVkLgorICAgICAqIDxwPgorICAgICAqIDxzdHJvbmc+SU1QTEVNRU5UQVRJT04gTk9URTwvc3Ryb25nPjogIFVSTCBkZWNvZGluZyBpcyBwZXJmb3JtZWQKKyAgICAgKiBpbmRpdmlkdWFsbHkgb24gdGhlIHBhcnNlZCBuYW1lIGFuZCB2YWx1ZSBlbGVtZW50cywgcmF0aGVyIHRoYW4gb24KKyAgICAgKiB0aGUgZW50aXJlIHF1ZXJ5IHN0cmluZyBhaGVhZCBvZiB0aW1lLCB0byBwcm9wZXJseSBkZWFsIHdpdGggdGhlIGNhc2UKKyAgICAgKiB3aGVyZSB0aGUgbmFtZSBvciB2YWx1ZSBpbmNsdWRlcyBhbiBlbmNvZGVkICI9IiBvciAiJiIgY2hhcmFjdGVyCisgICAgICogdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgaW50ZXJwcmV0ZWQgYXMgYSBkZWxpbWl0ZXIuCisgICAgICoKKyAgICAgKiBOT1RFOiBieXRlIGFycmF5IGRhdGEgaXMgbW9kaWZpZWQgYnkgdGhpcyBtZXRob2QuICBDYWxsZXIgYmV3YXJlLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcCBNYXAgdGhhdCBhY2N1bXVsYXRlcyB0aGUgcmVzdWx0aW5nIHBhcmFtZXRlcnMKKyAgICAgKiBAcGFyYW0gZGF0YSBJbnB1dCBzdHJpbmcgY29udGFpbmluZyByZXF1ZXN0IHBhcmFtZXRlcnMKKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgRW5jb2RpbmcgdG8gdXNlIGZvciBjb252ZXJ0aW5nIGhleAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGlmIHRoZSBkYXRhIGlzIG1hbGZvcm1lZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwYXJzZVBhcmFtZXRlcnMoTWFwIG1hcCwgYnl0ZVtdIGRhdGEsIFN0cmluZyBlbmNvZGluZykKKyAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworCisgICAgICAgIGlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBpbnQgICAgcG9zID0gMDsKKyAgICAgICAgICAgIGludCAgICBpeCA9IDA7CisgICAgICAgICAgICBpbnQgICAgb3ggPSAwOworICAgICAgICAgICAgU3RyaW5nIGtleSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOworICAgICAgICAgICAgd2hpbGUgKGl4IDwgZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBieXRlIGMgPSBkYXRhW2l4KytdOworICAgICAgICAgICAgICAgIHN3aXRjaCAoKGNoYXIpIGMpIHsKKyAgICAgICAgICAgICAgICBjYXNlICcmJzoKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgU3RyaW5nKGRhdGEsIDAsIG94LCBlbmNvZGluZyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHV0TWFwRW50cnkobWFwLCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3ggPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICc9JzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBuZXcgU3RyaW5nKGRhdGEsIDAsIG94LCBlbmNvZGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBveCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW294KytdID0gYzsKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAKKyAgICAgICAgICAgICAgICBjYXNlICcrJzoKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtveCsrXSA9IChieXRlKScgJzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnJSc6CisgICAgICAgICAgICAgICAgICAgIGRhdGFbb3grK10gPSAoYnl0ZSkoKGNvbnZlcnRIZXhEaWdpdChkYXRhW2l4KytdKSA8PCA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb252ZXJ0SGV4RGlnaXQoZGF0YVtpeCsrXSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBkYXRhW294KytdID0gYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL1RoZSBsYXN0IHZhbHVlIGRvZXMgbm90IGVuZCBpbiAnJicuICBTbyBzYXZlIGl0IG5vdy4KKyAgICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IFN0cmluZyhkYXRhLCAwLCBveCwgZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIHB1dE1hcEVudHJ5KG1hcCwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1Jlc291cmNlU2V0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9SZXNvdXJjZVNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYzcyNmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9SZXNvdXJjZVNldC5qYXZhCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKKworLyoqCisgKiBFeHRlbmRlZCBpbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkhhc2hTZXQ8L3N0cm9uZz4gdGhhdCBpbmNsdWRlcyBhCisgKiA8Y29kZT5sb2NrZWQ8L2NvZGU+IHByb3BlcnR5LiAgVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBzYWZlbHkgZXhwb3NlCisgKiByZXNvdXJjZSBwYXRoIHNldHMgdG8gdXNlciBjbGFzc2VzIHdpdGhvdXQgaGF2aW5nIHRvIGNsb25lIHRoZW0gaW4gb3JkZXIKKyAqIHRvIGF2b2lkIG1vZGlmaWNhdGlvbnMuICBXaGVuIGZpcnN0IGNyZWF0ZWQsIGEgPGNvZGU+UmVzb3VyY2VNYXA8L2NvZGU+CisgKiBpcyBub3QgbG9ja2VkLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgUmVzb3VyY2VTZXQgZXh0ZW5kcyBIYXNoU2V0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgc2V0IHdpdGggdGhlIGRlZmF1bHQgaW5pdGlhbCBjYXBhY2l0eSBhbmQKKyAgICAgKiBsb2FkIGZhY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VTZXQoKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBzZXQgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgYW5kCisgICAgICogZGVmYXVsdCBsb2FkIGZhY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgVGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhpcyBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VTZXQoaW50IGluaXRpYWxDYXBhY2l0eSkgeworCisgICAgICAgIHN1cGVyKGluaXRpYWxDYXBhY2l0eSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgc2V0IHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5IGFuZAorICAgICAqIGxvYWQgZmFjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSBUaGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGlzIHNldAorICAgICAqIEBwYXJhbSBsb2FkRmFjdG9yIFRoZSBsb2FkIGZhY3RvciBvZiB0aGlzIHNldAorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZVNldChpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7CisKKyAgICAgICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHNldCB3aXRoIHRoZSBzYW1lIGNvbnRlbnRzIGFzIHRoZSBleGlzdGluZyBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbGwgVGhlIGNvbGxlY3Rpb24gd2hvc2UgY29udGVudHMgd2Ugc2hvdWxkIGNvcHkKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VTZXQoQ29sbGVjdGlvbiBjb2xsKSB7CisKKyAgICAgICAgc3VwZXIoY29sbCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBsb2NrIHN0YXRlIG9mIHRoaXMgcGFyYW1ldGVyIG1hcC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbG9ja2VkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9ja2VkIHN0YXRlIG9mIHRoaXMgcGFyYW1ldGVyIG1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xvY2tlZCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMubG9ja2VkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2NrZWQgc3RhdGUgb2YgdGhpcyBwYXJhbWV0ZXIgbWFwLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2tlZCBUaGUgbmV3IGxvY2tlZCBzdGF0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2tlZChib29sZWFuIGxvY2tlZCkgeworCisgICAgICAgIHRoaXMubG9ja2VkID0gbG9ja2VkOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKCJvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwiKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdG8gdGhpcyBzZXQgaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudC4KKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGVsZW1lbnQgd2FzIGFkZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG8gVGhlIG9iamVjdCB0byBiZSBhZGRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBSZXNvdXJjZVNldCBpcyBsb2NrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pIHsKKworICAgICAgICBpZiAobG9ja2VkKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJyZXNvdXJjZVNldC5sb2NrZWQiKSk7CisgICAgICAgIHJldHVybiAoc3VwZXIuYWRkKG8pKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIHNldC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgUmVzb3VyY2VTZXQgaXMgbG9ja2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisKKyAgICAgICAgaWYgKGxvY2tlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicmVzb3VyY2VTZXQubG9ja2VkIikpOworICAgICAgICBzdXBlci5jbGVhcigpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGVsZW1lbnQgZnJvbSB0aGlzIHNldCBpZiBpdCBpcyBwcmVzZW50LgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZWxlbWVudCB3YXMgcmVtb3ZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvIFRoZSBvYmplY3QgdG8gYmUgcmVtb3ZlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBSZXNvdXJjZVNldCBpcyBsb2NrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKworICAgICAgICBpZiAobG9ja2VkKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJyZXNvdXJjZVNldC5sb2NrZWQiKSk7CisgICAgICAgIHJldHVybiAoc3VwZXIucmVtb3ZlKG8pKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TY2hlbWFSZXNvbHZlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvU2NoZW1hUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGExODc4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvU2NoZW1hUmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLkRpZ2VzdGVyOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBsb2NhbCBTQVgncyA8Y29kZT5FbnRpdHlSZXNvbHZlcjwvY29kZT4uIEFsbAorICogRFREcyBhbmQgc2NoZW1hcyB1c2VkIHRvIHZhbGlkYXRlIHRoZSB3ZWIueG1sIGZpbGUgd2lsbCByZS1kaXJlY3RlZAorICogdG8gYSBsb2NhbCBmaWxlIHN0b3JlZCBpbiB0aGUgc2VydmxldC1hcGkuamFyIGFuZCBqc3AtYXBpLmphci4KKyAqCisgKiBAYXV0aG9yIEplYW4tRnJhbmNvaXMgQXJjYW5kCisgKi8KK3B1YmxpYyBjbGFzcyBTY2hlbWFSZXNvbHZlciBpbXBsZW1lbnRzIEVudGl0eVJlc29sdmVyIHsKKworICAgIC8qKgorICAgICAqIFRoZSBkaXNnZXN0ZXIgaW5zdGFuY2UgZm9yIHdoaWNoIHRoaXMgY2xhc3MgaXMgdGhlIGVudGl0eSByZXNvbHZlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlnZXN0ZXIgZGlnZXN0ZXI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBVUkxzIG9mIGR0ZHMgYW5kIHNjaGVtYXMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCwga2V5ZWQgYnkgdGhlCisgICAgICogcHVibGljIGlkZW50aWZpZXIgdGhhdCBjb3JyZXNwb25kcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCBlbnRpdHlWYWxpZGF0b3IgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhlIERURCB3ZSBhcmUgY3VycmVudGx5IHBhcnNpbmcgdW5kZXIKKyAgICAgKiAoaWYgYW55KS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRXh0ZW5zaW9uIHRvIG1ha2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBEVEQgYW5kIFNjaGVtYS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNjaGVtYUV4dGVuc2lvbiA9ICJ4c2QiOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgPGNvZGU+RW50aXR5UmVzb2x2ZXI8L2NvZGU+IHRoYXQgd2lsbCByZWRpcmVjdAorICAgICAqIGFsbCByZW1vdGUgZHRkcyBhbmQgc2NoZW1hIHRvIGEgbG9jYXQgZGVzdGluYXRpb24uCisgICAgICogQHBhcmFtIGRpZ2VzdGVyIFRoZSBkaWdlc3RlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hUmVzb2x2ZXIoRGlnZXN0ZXIgZGlnZXN0ZXIpIHsKKyAgICAgICAgdGhpcy5kaWdlc3RlciA9IGRpZ2VzdGVyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgdGhlIHNwZWNpZmllZCBEVEQvU2NoZW1hIFVSTCBmb3IgdGhlIHNwZWNpZmllZCBwdWJsaWMKKyAgICAgKiBpZGVudGlmaWVyLiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0bworICAgICAqIDxjb2RlPnBhcnNlKCk8L2NvZGU+LgorICAgICAqCisgICAgICogV2hlbiBhZGRpbmcgYSBzY2hlbWEgZmlsZSAoKi54c2QpLCBvbmx5IHRoZSBuYW1lIG9mIHRoZSBmaWxlCisgICAgICogd2lsbCBnZXQgYWRkZWQuIElmIHR3byBzY2hlbWFzIHdpdGggdGhlIHNhbWUgbmFtZSBhcmUgYWRkZWQsCisgICAgICogb25seSB0aGUgbGFzdCBvbmUgd2lsbCBiZSBzdG9yZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHVibGljSWQgUHVibGljIGlkZW50aWZpZXIgb2YgdGhlIERURCB0byBiZSByZXNvbHZlZAorICAgICAqIEBwYXJhbSBlbnRpdHlVUkwgVGhlIFVSTCB0byB1c2UgZm9yIHJlYWRpbmcgdGhpcyBEVEQKKyAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgZW50aXR5VVJMKSB7CisgICAgICAgICBTdHJpbmcga2V5ID0gcHVibGljSWQ7CisgICAgICAgICBpZiAocHVibGljSWQuaW5kZXhPZihzY2hlbWFFeHRlbnNpb24pICE9IC0xKQorICAgICAgICAgICAgIGtleSA9IHB1YmxpY0lkLnN1YnN0cmluZyhwdWJsaWNJZC5sYXN0SW5kZXhPZignLycpKzEpOworICAgICAgICAgZW50aXR5VmFsaWRhdG9yLnB1dChrZXksIGVudGl0eVVSTCk7CisgICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVzb2x2ZSB0aGUgcmVxdWVzdGVkIGV4dGVybmFsIGVudGl0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwdWJsaWNJZCBUaGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhlIGVudGl0eSBiZWluZyByZWZlcmVuY2VkCisgICAgICogQHBhcmFtIHN5c3RlbUlkIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGUgZW50aXR5IGJlaW5nIHJlZmVyZW5jZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBleGNlcHRpb24gb2NjdXJzCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHB1YmxpY0lkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucHVibGljSWQgPSBwdWJsaWNJZDsKKyAgICAgICAgICAgIGRpZ2VzdGVyLnNldFB1YmxpY0lkKHB1YmxpY0lkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEhhcyB0aGlzIHN5c3RlbSBpZGVudGlmaWVyIGJlZW4gcmVnaXN0ZXJlZD8KKyAgICAgICAgU3RyaW5nIGVudGl0eVVSTCA9IG51bGw7CisgICAgICAgIGlmIChwdWJsaWNJZCAhPSBudWxsKSB7CisgICAgICAgICAgICBlbnRpdHlVUkwgPSAoU3RyaW5nKSBlbnRpdHlWYWxpZGF0b3IuZ2V0KHB1YmxpY0lkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlZGlyZWN0IHRoZSBzY2hlbWEgbG9jYXRpb24gdG8gYSBsb2NhbCBkZXN0aW5hdGlvbgorICAgICAgICBTdHJpbmcga2V5ID0gbnVsbDsKKyAgICAgICAgaWYgKGVudGl0eVVSTCA9PSBudWxsICYmIHN5c3RlbUlkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGtleSA9IHN5c3RlbUlkLnN1YnN0cmluZyhzeXN0ZW1JZC5sYXN0SW5kZXhPZignLycpKzEpOworICAgICAgICAgICAgZW50aXR5VVJMID0gKFN0cmluZyllbnRpdHlWYWxpZGF0b3IuZ2V0KGtleSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW50aXR5VVJMID09IG51bGwpIHsKKyAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKG5ldyBJbnB1dFNvdXJjZShlbnRpdHlVUkwpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvU2VydmVySW5mby5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvU2VydmVySW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YWFkZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TZXJ2ZXJJbmZvLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworCisvKioKKyAqIFNpbXBsZSB1dGlsaXR5IG1vZHVsZSB0byBtYWtlIGl0IGVhc3kgdG8gcGx1ZyBpbiB0aGUgc2VydmVyIGlkZW50aWZpZXIKKyAqIHdoZW4gaW50ZWdyYXRpbmcgVG9tY2F0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2VydmVySW5mbyB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RhdGljIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmVyIGluZm9ybWF0aW9uIFN0cmluZyB3aXRoIHdoaWNoIHdlIGlkZW50aWZ5IG91cnNlbHZlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2VydmVySW5mbyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmVyIGJ1aWx0IFN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2VydmVyQnVpbHQgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZlcidzIHZlcnNpb24gbnVtYmVyIFN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2VydmVyTnVtYmVyID0gbnVsbDsKKworICAgIHN0YXRpYyB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gU2VydmVySW5mby5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtCisgICAgICAgICAgICAgICAgKCIvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1NlcnZlckluZm8ucHJvcGVydGllcyIpOworICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBwcm9wcy5sb2FkKGlzKTsKKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICBzZXJ2ZXJJbmZvID0gcHJvcHMuZ2V0UHJvcGVydHkoInNlcnZlci5pbmZvIik7CisgICAgICAgICAgICBzZXJ2ZXJCdWlsdCA9IHByb3BzLmdldFByb3BlcnR5KCJzZXJ2ZXIuYnVpbHQiKTsKKyAgICAgICAgICAgIHNlcnZlck51bWJlciA9IHByb3BzLmdldFByb3BlcnR5KCJzZXJ2ZXIubnVtYmVyIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlcnZlckluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgIHNlcnZlckluZm8gPSAiQXBhY2hlIFRvbWNhdCI7CisgICAgICAgIGlmIChzZXJ2ZXJCdWlsdCA9PSBudWxsKQorICAgICAgICAgICAgc2VydmVyQnVpbHQgPSAidW5rbm93biI7CisgICAgICAgIGlmIChzZXJ2ZXJOdW1iZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHNlcnZlck51bWJlciA9ICI1LjUuMC4wIjsKKyAgICAgICAgCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJ2ZXIgaWRlbnRpZmljYXRpb24gZm9yIHRoaXMgdmVyc2lvbiBvZiBUb21jYXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVySW5mbygpIHsKKworICAgICAgICByZXR1cm4gKHNlcnZlckluZm8pOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJ2ZXIgYnVpbHQgdGltZSBmb3IgdGhpcyB2ZXJzaW9uIG9mIFRvbWNhdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2ZXJCdWlsdCgpIHsKKworICAgICAgICByZXR1cm4gKHNlcnZlckJ1aWx0KTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VydmVyJ3MgdmVyc2lvbiBudW1iZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVyTnVtYmVyKCkgeworCisgICAgICAgIHJldHVybiAoc2VydmVyTnVtYmVyKTsKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXIgdmVyc2lvbjogIiArIGdldFNlcnZlckluZm8oKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VydmVyIGJ1aWx0OiAgICIgKyBnZXRTZXJ2ZXJCdWlsdCgpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXIgbnVtYmVyOiAgIiArIGdldFNlcnZlck51bWJlcigpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPUyBOYW1lOiAgICAgICAgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT1MgVmVyc2lvbjogICAgICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJvcy52ZXJzaW9uIikpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFyY2hpdGVjdHVyZTogICAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJKVk0gVmVyc2lvbjogICAgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEucnVudGltZS52ZXJzaW9uIikpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkpWTSBWZW5kb3I6ICAgICAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS52ZW5kb3IiKSk7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TZXJ2ZXJJbmZvLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TZXJ2ZXJJbmZvLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI0YWZiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1NlcnZlckluZm8ucHJvcGVydGllcwpAQCAtMCwwICsxLDMgQEAKK3NlcnZlci5pbmZvPUFwYWNoZSBUb21jYXQvQFZFUlNJT05ACitzZXJ2ZXIubnVtYmVyPUBWRVJTSU9OX05VTUJFUkAKK3NlcnZlci5idWlsdD1AVkVSU0lPTl9CVUlMVEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TdHJmdGltZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvU3RyZnRpbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTc0ZGViCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvU3RyZnRpbWUuamF2YQpAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CisKKy8qKgorICogQ29udmVydHMgZGF0ZXMgdG8gc3RyaW5ncyB1c2luZyB0aGUgc2FtZSBmb3JtYXQgc3BlY2lmaWVycyBhcyBzdHJmdGltZQorICoKKyAqIE5vdGU6IFRoaXMgZG9lcyBub3QgbWltaWMgc3RyZnRpbWUgcGVyZmVjdGx5LiAgQ2VydGFpbiBzdHJmdGltZSBjb21tYW5kcywgCisgKiAgICAgICBhcmUgbm90IHN1cHBvcnRlZCwgYW5kIHdpbGwgY29udmVydCBhcyBpZiB0aGV5IHdlcmUgbGl0ZXJhbHMuCisgKgorICogICAgICAgQ2VydGFpbiBjb21wbGljYXRlZCBjb21tYW5kcywgbGlrZSB0aG9zZSBkZWFsaW5nIHdpdGggdGhlIHdlZWsgb2YgdGhlIHllYXIKKyAqICAgICAgIHByb2JhYmx5IGRvbid0IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBiZWhhdmlvciBhcyBzdHJmdGltZS4KKyAqCisgKiAgICAgICBUaGVzZSBsaW1pdGF0aW9ucyBhcmUgZHVlIHRvIHVzZSBTaW1wbGVEYXRlVGltZS4gIElmIHRoZSBjb252ZXJzaW9uIHdhcyBkb25lCisgKiAgICAgICBtYW51YWxseSwgYWxsIHRoZXNlIGxpbWl0YXRpb25zIGNvdWxkIGJlIGVsaW1pbmF0ZWQuCisgKgorICogICAgICAgVGhlIGludGVyZmFjZSBsb29rcyBsaWtlIGEgc3Vic2V0IG9mIERhdGVGb3JtYXQuICBNYXliZSBzb21lZGF5IHNvbWVvbmUgd2lsbCBtYWtlIHRoaXMgY2xhc3MKKyAqICAgICAgIGV4dGVuZCBEYXRlRm9ybWF0LgorICoKKyAqIEBhdXRob3IgQmlwIFRoZWxpbgorICogQGF1dGhvciBEYW4gU2FuZGJlcmcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgU3RyZnRpbWUgeworICAgIHByb3RlY3RlZCBzdGF0aWMgUHJvcGVydGllcyB0cmFuc2xhdGU7CisgICAgcHJvdGVjdGVkIFNpbXBsZURhdGVGb3JtYXQgc2ltcGxlRGF0ZUZvcm1hdDsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgb3VyIHBhdHRlcm4gdHJhbnNsYXRpb24KKyAgICAgKi8KKyAgICBzdGF0aWMgeworICAgICAgICB0cmFuc2xhdGUgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJhIiwiRUVFIik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoIkEiLCJFRUVFIik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoImIiLCJNTU0iKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiQiIsIk1NTU0iKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiYyIsIkVFRSBNTU0gZCBISDptbTpzcyB5eXl5Iik7CisKKyAgICAgICAgLy9UaGVyZSdzIG5vIHdheSB0byBzcGVjaWZ5IHRoZSBjZW50dXJ5IGluIFNpbXBsZURhdGVGb3JtYXQuICBXZSBkb24ndCB3YW50IHRvIGhhcmQtY29kZQorICAgICAgICAvLzIwIHNpbmNlIHRoaXMgY291bGQgYmUgd3JvbmcgZm9yIHRoZSBwcmUtMjAwMCBmaWxlcy4KKyAgICAgICAgLy90cmFuc2xhdGUucHV0KCJDIiwgIjIwIik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoImQiLCJkZCIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJEIiwiTU0vZGQveXkiKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiZSIsImRkIik7IC8vd2lsbCBzaG93IGFzICcwMycgaW5zdGVhZCBvZiAnIDMnCisgICAgICAgIHRyYW5zbGF0ZS5wdXQoIkYiLCJ5eXl5LU1NLWRkIik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoImciLCJ5eSIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJHIiwieXl5eSIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJIIiwiSEgiKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiaCIsIk1NTSIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJJIiwiaGgiKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiaiIsIkRERCIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJrIiwiSEgiKTsgLy93aWxsIHNob3cgYXMgJzA3JyBpbnN0ZWFkIG9mICcgNycKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgibCIsImhoIik7IC8vd2lsbCBzaG93IGFzICcwNycgaW5zdGVhZCBvZiAnIDcnCisgICAgICAgIHRyYW5zbGF0ZS5wdXQoIm0iLCJNTSIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJNIiwibW0iKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgibiIsIlxuIik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoInAiLCJhIik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoIlAiLCJhIik7ICAvL3dpbGwgc2hvdyBhcyBwbSBpbnN0ZWFkIG9mIFBNCisgICAgICAgIHRyYW5zbGF0ZS5wdXQoInIiLCJoaDptbTpzcyBhIik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoIlIiLCJISDptbSIpOworICAgICAgICAvL1RoZXJlJ3Mgbm8gd2F5IHRvIHNwZWNpZnkgdGhpcyB3aXRoIFNpbXBsZURhdGVGb3JtYXQKKyAgICAgICAgLy90cmFuc2xhdGUucHV0KCJzIiwic2Vjb25kcyBzaW5jZSBlY3BvY2giKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiUyIsInNzIik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoInQiLCJcdCIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJUIiwiSEg6bW06c3MiKTsKKyAgICAgICAgLy9UaGVyZSdzIG5vIHdheSB0byBzcGVjaWZ5IHRoaXMgd2l0aCBTaW1wbGVEYXRlRm9ybWF0CisgICAgICAgIC8vdHJhbnNsYXRlLnB1dCgidSIsImRheSBvZiB3ZWVrICggMS03ICkiKTsKKworICAgICAgICAvL1RoZXJlJ3Mgbm8gd2F5IHRvIHNwZWNpZnkgdGhpcyB3aXRoIFNpbXBsZURhdGVGb3JtYXQKKyAgICAgICAgLy90cmFuc2xhdGUucHV0KCJVIiwid2VlayBpbiB5ZWFyIHdpdGggZmlyc3Qgc3VuZGF5IGFzIGZpcnN0IGRheS4uLiIpOworCisgICAgICAgIHRyYW5zbGF0ZS5wdXQoIlYiLCJ3dyIpOyAvL0knbSBub3Qgc3VyZSB0aGlzIGlzIGFsd2F5cyBleGFjdGx5IHRoZSBzYW1lCisKKyAgICAgICAgLy9UaGVyZSdzIG5vIHdheSB0byBzcGVjaWZ5IHRoaXMgd2l0aCBTaW1wbGVEYXRlRm9ybWF0CisgICAgICAgIC8vdHJhbnNsYXRlLnB1dCgiVyIsIndlZWsgaW4geWVhciB3aXRoIGZpcnN0IG1vbmRheSBhcyBmaXJzdCBkYXkuLi4iKTsKKworICAgICAgICAvL1RoZXJlJ3Mgbm8gd2F5IHRvIHNwZWNpZnkgdGhpcyB3aXRoIFNpbXBsZURhdGVGb3JtYXQKKyAgICAgICAgLy90cmFuc2xhdGUucHV0KCJ3IiwiRSIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJYIiwiSEg6bW06c3MiKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgieCIsIk1NL2RkL3l5Iik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoInkiLCJ5eSIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJZIiwieXl5eSIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJaIiwieiIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJ6IiwiWiIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCIlIiwiJSIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgZGF0ZSBmb3JtYXR0aW5nIGNsYXNzCisgICAgICoKKyAgICAgKiBAc2VlICNTdHJmdGltZSggU3RyaW5nLCBMb2NhbGUgKQorICAgICAqLworICAgIHB1YmxpYyBTdHJmdGltZSggU3RyaW5nIG9yaWdGb3JtYXQgKSB7CisgICAgICAgIFN0cmluZyBjb252ZXJ0ZWRGb3JtYXQgPSBjb252ZXJ0RGF0ZUZvcm1hdCggb3JpZ0Zvcm1hdCApOworICAgICAgICBzaW1wbGVEYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIGNvbnZlcnRlZEZvcm1hdCApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGRhdGUgZm9ybWF0dGluZyBjbGFzcworICAgICAqIAorICAgICAqIEBwYXJhbSBvcmlnRm9ybWF0IHRoZSBzdHJmdGltZS1zdHlsZSBmb3JtYXR0aW5nIHN0cmluZworICAgICAqIEBwYXJhbSBsb2NhbGUgdGhlIGxvY2FsZSB0byB1c2UgZm9yIGxvY2FsZS1zcGVjaWZpYyBjb252ZXJzaW9ucworICAgICAqLworICAgIHB1YmxpYyBTdHJmdGltZSggU3RyaW5nIG9yaWdGb3JtYXQsIExvY2FsZSBsb2NhbGUgKSB7CisgICAgICAgIFN0cmluZyBjb252ZXJ0ZWRGb3JtYXQgPSBjb252ZXJ0RGF0ZUZvcm1hdCggb3JpZ0Zvcm1hdCApOworICAgICAgICBzaW1wbGVEYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIGNvbnZlcnRlZEZvcm1hdCwgbG9jYWxlICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9ybWF0IHRoZSBkYXRlIGFjY29yZGluZyB0byB0aGUgc3RyZnRpbWUtc3R5bGUgc3RyaW5nIGdpdmVuIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlIHRvIGZvcm1hdAorICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBkYXRlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmb3JtYXQoIERhdGUgZGF0ZSApIHsKKyAgICAgICAgcmV0dXJuIHNpbXBsZURhdGVGb3JtYXQuZm9ybWF0KCBkYXRlICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0aW1lem9uZSB1c2VkIGZvciBmb3JtYXR0aW5nIGNvbnZlcnNpb25zCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB0aW1lem9uZQorICAgICAqLworICAgIHB1YmxpYyBUaW1lWm9uZSBnZXRUaW1lWm9uZSgpIHsKKyAgICAgICAgcmV0dXJuIHNpbXBsZURhdGVGb3JtYXQuZ2V0VGltZVpvbmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGFuZ2UgdGhlIHRpbWV6b25lIHVzZWQgdG8gZm9ybWF0IGRhdGVzCisgICAgICoKKyAgICAgKiBAc2VlIFNpbXBsZURhdGVGb3JtYXQjc2V0VGltZVpvbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaW1lWm9uZSggVGltZVpvbmUgdGltZVpvbmUgKSB7CisgICAgICAgIHNpbXBsZURhdGVGb3JtYXQuc2V0VGltZVpvbmUoIHRpbWVab25lICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VhcmNoIHRoZSBwcm92aWRlZCBwYXR0ZXJuIGFuZCBnZXQgdGhlIEMgc3RhbmRhcmQKKyAgICAgKiBEYXRlL1RpbWUgZm9ybWF0dGluZyBydWxlcyBhbmQgY29udmVydCB0aGVtIHRvIHRoZQorICAgICAqIEphdmEgZXF1aXZhbGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHNlYXJjaAorICAgICAqIEByZXR1cm4gVGhlIG1vZGlmaWVkIHBhdHRlcm4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnREYXRlRm9ybWF0KCBTdHJpbmcgcGF0dGVybiApIHsKKyAgICAgICAgYm9vbGVhbiBpbnNpZGUgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBtYXJrID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gbW9kaWZpZWRDb21tYW5kID0gZmFsc2U7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcGF0dGVybi5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBwYXR0ZXJuLmNoYXJBdChpKTsKKworICAgICAgICAgICAgaWYgKCBjPT0nJScgJiYgIW1hcmsgKSB7CisgICAgICAgICAgICAgICAgbWFyaz10cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIG1hcmsgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggbW9kaWZpZWRDb21tYW5kICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBkbyBhbnl0aGluZy0td2UganVzdCB3YW50ZWQgdG8gc2tpcCBhIGNoYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkQ29tbWFuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgbWFyayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlID0gdHJhbnNsYXRlQ29tbWFuZCggYnVmLCBwYXR0ZXJuLCBpLCBpbnNpZGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vSXQncyBhIG1vZGlmaWVyIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYz09J08nIHx8IGM9PSdFJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZENvbW1hbmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrPWZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhaW5zaWRlICYmIGMgIT0gJyAnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9XZSBzdGFydCBhIGxpdGVyYWwsIHdoaWNoIHdlIG5lZWQgdG8gcXVvdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBidWYubGVuZ3RoKCkgPiAwICkgeworICAgICAgICAgICAgY2hhciBsYXN0Q2hhciA9IGJ1Zi5jaGFyQXQoIGJ1Zi5sZW5ndGgoKSAtIDEgKTsKKworICAgICAgICAgICAgaWYoIGxhc3RDaGFyIT0nXCcnICYmIGluc2lkZSApIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCdcJycpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHF1b3RlKCBTdHJpbmcgc3RyLCBib29sZWFuIGluc2lkZVF1b3RlcyApIHsKKyAgICAgICAgU3RyaW5nIHJldFZhbCA9IHN0cjsKKyAgICAgICAgaWYgKCAhaW5zaWRlUXVvdGVzICkgeworICAgICAgICAgICAgcmV0VmFsID0gJ1wnJyArIHJldFZhbCArICdcJyc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnkgdG8gZ2V0IHRoZSBKYXZhIERhdGUvVGltZSBmb3JtYXR0aW5nIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBDIHN0YW5kYXJkIHByb3ZpZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZiBUaGUgYnVmZmVyCisgICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIGRhdGUvdGltZSBwYXR0ZXJuCisgICAgICogQHBhcmFtIGluZGV4IFRoZSBjaGFyIGluZGV4CisgICAgICogQHBhcmFtIG9sZEluc2lkZSBGbGFnIHZhbHVlCisgICAgICogQHJldHVybiBUcnVlIGlmIG5ldyBpcyBpbnNpZGUgYnVmZmVyCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJhbnNsYXRlQ29tbWFuZCggU3RyaW5nQnVmZmVyIGJ1ZiwgU3RyaW5nIHBhdHRlcm4sIGludCBpbmRleCwgYm9vbGVhbiBvbGRJbnNpZGUgKSB7CisgICAgICAgIGNoYXIgZmlyc3RDaGFyID0gcGF0dGVybi5jaGFyQXQoIGluZGV4ICk7CisgICAgICAgIGJvb2xlYW4gbmV3SW5zaWRlID0gb2xkSW5zaWRlOworCisgICAgICAgIC8vTyBhbmQgRSBhcmUgbW9kaWZpZXJzLCB0aGV5IG1lYW4gdG8gcHJlc2VudCBhbiBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbmV4dCBjaGFyCisgICAgICAgIC8vd2UganVzdCBoYW5kbGUgdGhlIG5leHQgY2hhciBhcyBpZiB0aGUgTyBvciBFIHdhc24ndCB0aGVyZQorICAgICAgICBpZiAoIGZpcnN0Q2hhciA9PSAnTycgfHwgZmlyc3RDaGFyID09ICdFJyApIHsKKyAgICAgICAgICAgIGlmICggaW5kZXggKyAxIDwgcGF0dGVybi5sZW5ndGgoKSApIHsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBuZXdJbnNpZGUgPSB0cmFuc2xhdGVDb21tYW5kKCBidWYsIHBhdHRlcm4sIGluZGV4ICsgMSwgb2xkSW5zaWRlICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHF1b3RlKCIlIiArIGZpcnN0Q2hhciwgb2xkSW5zaWRlICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBjb21tYW5kID0gdHJhbnNsYXRlLmdldFByb3BlcnR5KCBTdHJpbmcudmFsdWVPZiggZmlyc3RDaGFyICkgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9JZiB3ZSBkb24ndCBmaW5kIGEgZm9ybWF0LCB0cmVhdCBpdCBhcyBhIGxpdGVyYWwtLVRoYXQncyB3aGF0IGFwYWNoZSBkb2VzCisgICAgICAgICAgICBpZiAoIGNvbW1hbmQgPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCBxdW90ZSggIiUiICsgZmlyc3RDaGFyLCBvbGRJbnNpZGUgKSApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL0lmIHdlIHdlcmUgaW5zaWRlIHF1b3RlcywgY2xvc2UgdGhlIHF1b3RlcworICAgICAgICAgICAgICAgIGlmICggb2xkSW5zaWRlICkgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCAnXCcnICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIGNvbW1hbmQgKTsKKyAgICAgICAgICAgICAgICBuZXdJbnNpZGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3SW5zaWRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1N0cmluZ01hbmFnZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1N0cmluZ01hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2ZlZTBhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvU3RyaW5nTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKKworLyoqCisgKiBBbiBpbnRlcm5hdGlvbmFsaXphdGlvbiAvIGxvY2FsaXphdGlvbiBoZWxwZXIgY2xhc3Mgd2hpY2ggcmVkdWNlcworICogdGhlIGJvdGhlciBvZiBoYW5kbGluZyBSZXNvdXJjZUJ1bmRsZXMgYW5kIHRha2VzIGNhcmUgb2YgdGhlCisgKiBjb21tb24gY2FzZXMgb2YgbWVzc2FnZSBmb3JtYXRpbmcgd2hpY2ggb3RoZXJ3aXNlIHJlcXVpcmUgdGhlCisgKiBjcmVhdGlvbiBvZiBPYmplY3QgYXJyYXlzIGFuZCBzdWNoLgorICoKKyAqIDxwPlRoZSBTdHJpbmdNYW5hZ2VyIG9wZXJhdGVzIG9uIGEgcGFja2FnZSBiYXNpcy4gT25lIFN0cmluZ01hbmFnZXIKKyAqIHBlciBwYWNrYWdlIGNhbiBiZSBjcmVhdGVkIGFuZCBhY2Nlc3NlZCB2aWEgdGhlIGdldE1hbmFnZXIgbWV0aG9kCisgKiBjYWxsLgorICoKKyAqIDxwPlRoZSBTdHJpbmdNYW5hZ2VyIHdpbGwgbG9vayBmb3IgYSBSZXNvdXJjZUJ1bmRsZSBuYW1lZCBieQorICogdGhlIHBhY2thZ2UgbmFtZSBnaXZlbiBwbHVzIHRoZSBzdWZmaXggb2YgIkxvY2FsU3RyaW5ncyIuIEluCisgKiBwcmFjdGljZSwgdGhpcyBtZWFucyB0aGF0IHRoZSBsb2NhbGl6ZWQgaW5mb3JtYXRpb24gd2lsbCBiZSBjb250YWluZWQKKyAqIGluIGEgTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgZmlsZSBsb2NhdGVkIGluIHRoZSBwYWNrYWdlCisgKiBkaXJlY3Rvcnkgb2YgdGhlIGNsYXNzcGF0aC4KKyAqCisgKiA8cD5QbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgZm9yCisgKiBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIEBhdXRob3IgSmFtZXMgRHVuY2FuIERhdmlkc29uIFtkdW5jYW5AZW5nLnN1bi5jb21dCisgKiBAYXV0aG9yIEphbWVzIFRvZGQgW2dvbnpvQGVuZy5zdW4uY29tXQorICovCisKK3B1YmxpYyBjbGFzcyBTdHJpbmdNYW5hZ2VyIHsKKworICAgIC8qKgorICAgICAqIFRoZSBSZXNvdXJjZUJ1bmRsZSBmb3IgdGhpcyBTdHJpbmdNYW5hZ2VyLgorICAgICAqLworCisgICAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBidW5kbGU7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFN0cmluZ01hbmFnZXIuY2xhc3MgKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFN0cmluZ01hbmFnZXIgZm9yIGEgZ2l2ZW4gcGFja2FnZS4gVGhpcyBpcyBhCisgICAgICogcHJpdmF0ZSBtZXRob2QgYW5kIGFsbCBhY2Nlc3MgdG8gaXQgaXMgYXJiaXRyYXRlZCBieSB0aGUKKyAgICAgKiBzdGF0aWMgZ2V0TWFuYWdlciBtZXRob2QgY2FsbCBzbyB0aGF0IG9ubHkgb25lIFN0cmluZ01hbmFnZXIKKyAgICAgKiBwZXIgcGFja2FnZSB3aWxsIGJlIGNyZWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgTmFtZSBvZiBwYWNrYWdlIHRvIGNyZWF0ZSBTdHJpbmdNYW5hZ2VyIGZvci4KKyAgICAgKi8KKworICAgIHByaXZhdGUgU3RyaW5nTWFuYWdlcihTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgU3RyaW5nIGJ1bmRsZU5hbWUgPSBwYWNrYWdlTmFtZSArICIuTG9jYWxTdHJpbmdzIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaCggTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgLy8gVHJ5IGZyb20gdGhlIGN1cnJlbnQgbG9hZGVyICggdGhhdCdzIHRoZSBjYXNlIGZvciB0cnVzdGVkIGFwcHMgKQorICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2w9VGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgIGlmKCBjbCAhPSBudWxsICkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZT1SZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgTG9jYWxlLmdldERlZmF1bHQoKSwgY2wpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBjYXRjaChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXgyKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIGNsPT1udWxsICkKKyAgICAgICAgICAgICAgICBjbD10aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FuJ3QgZmluZCByZXNvdXJjZSAiICsgYnVuZGxlTmFtZSArCisgICAgICAgICAgICAgICAgICAgICIgIiArIGNsKTsKKyAgICAgICAgICAgIGlmKCBjbCBpbnN0YW5jZW9mIFVSTENsYXNzTG9hZGVyICkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyggKChVUkxDbGFzc0xvYWRlciljbCkuZ2V0VVJMcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHN0cmluZyBmcm9tIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGJ1bmRsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgVGhlIHJlc291cmNlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmdJbnRlcm5hbChrZXkpLCAoT2JqZWN0IFtdKW51bGwpOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdJbnRlcm5hbChTdHJpbmcga2V5KSB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJrZXkgaXMgbnVsbCI7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihtc2cpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHN0ciA9IG51bGw7CisKKyAgICAgICAgaWYoIGJ1bmRsZT09bnVsbCApCisgICAgICAgICAgICByZXR1cm4ga2V5OworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RyID0gYnVuZGxlLmdldFN0cmluZyhrZXkpOworICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7CisgICAgICAgICAgICBzdHIgPSAiQ2Fubm90IGZpbmQgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGgga2V5ICciICsga2V5ICsgIiciOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzdHJpbmcgZnJvbSB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBidW5kbGUgYW5kIGZvcm1hdAorICAgICAqIGl0IHdpdGggdGhlIGdpdmVuIHNldCBvZiBhcmd1bWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBuYW1lCisgICAgICogQHBhcmFtIGFyZ3MgRm9ybWF0dGluZyBkaXJlY3RpdmVzCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgIFN0cmluZyBpU3RyaW5nID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nSW50ZXJuYWwoa2V5KTsKKworICAgICAgICAvLyB0aGlzIGNoZWNrIGZvciB0aGUgcnVudGltZSBleGNlcHRpb24gaXMgc29tZSBwcmUgMS4xLjYKKyAgICAgICAgLy8gVk0ncyBkb24ndCBkbyBhbiBhdXRvbWF0aWMgdG9TdHJpbmcoKSBvbiB0aGUgcGFzc2VkIGluCisgICAgICAgIC8vIG9iamVjdHMgYW5kIGJhcmYgb3V0CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGVuc3VyZSB0aGUgYXJndW1lbnRzIGFyZSBub3QgbnVsbCBzbyBwcmUgMS4yIFZNJ3MgZG9uJ3QgYmFyZgorICAgICAgICAgICAgT2JqZWN0IG5vbk51bGxBcmdzW10gPSBhcmdzOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChub25OdWxsQXJncz09YXJncykgbm9uTnVsbEFyZ3M9KE9iamVjdFtdKWFyZ3MuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgbm9uTnVsbEFyZ3NbaV0gPSAibnVsbCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpU3RyaW5nID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQodmFsdWUsIG5vbk51bGxBcmdzKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQodmFsdWUpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIGFyZ1siICsgaSArICJdPSIgKyBhcmdzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlTdHJpbmcgPSBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaVN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzdHJpbmcgZnJvbSB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBidW5kbGUgYW5kIGZvcm1hdCBpdAorICAgICAqIHdpdGggdGhlIGdpdmVuIG9iamVjdCBhcmd1bWVudC4gVGhpcyBhcmd1bWVudCBjYW4gb2YgY291cnNlIGJlCisgICAgICogYSBTdHJpbmcgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBUaGUgcmVzb3VyY2UgbmFtZQorICAgICAqIEBwYXJhbSBhcmcgRm9ybWF0dGluZyBkaXJlY3RpdmUKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBhcmcpIHsKKyAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7YXJnfTsKKyAgICAgICAgcmV0dXJuIGdldFN0cmluZyhrZXksIGFyZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHN0cmluZyBmcm9tIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGJ1bmRsZSBhbmQgZm9ybWF0IGl0CisgICAgICogd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0IGFyZ3VtZW50cy4gVGhlc2UgYXJndW1lbnRzIGNhbiBvZiBjb3Vyc2UKKyAgICAgKiBiZSBTdHJpbmcgb2JqZWN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgVGhlIHJlc291cmNlIG5hbWUKKyAgICAgKiBAcGFyYW0gYXJnMSBGb3JtYXR0aW5nIGRpcmVjdGl2ZQorICAgICAqIEBwYXJhbSBhcmcyIEZvcm1hdHRpbmcgZGlyZWN0aXZlCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7YXJnMSwgYXJnMn07CisgICAgICAgIHJldHVybiBnZXRTdHJpbmcoa2V5LCBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzdHJpbmcgZnJvbSB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBidW5kbGUgYW5kIGZvcm1hdCBpdAorICAgICAqIHdpdGggdGhlIGdpdmVuIG9iamVjdCBhcmd1bWVudHMuIFRoZXNlIGFyZ3VtZW50cyBjYW4gb2YgY291cnNlCisgICAgICogYmUgU3RyaW5nIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBuYW1lCisgICAgICogQHBhcmFtIGFyZzEgRm9ybWF0dGluZyBkaXJlY3RpdmUKKyAgICAgKiBAcGFyYW0gYXJnMiBGb3JtYXR0aW5nIGRpcmVjdGl2ZQorICAgICAqIEBwYXJhbSBhcmczIEZvcm1hdHRpbmcgZGlyZWN0aXZlCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFyZzMpIHsKKyAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7YXJnMSwgYXJnMiwgYXJnM307CisgICAgICAgIHJldHVybiBnZXRTdHJpbmcoa2V5LCBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzdHJpbmcgZnJvbSB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBidW5kbGUgYW5kIGZvcm1hdCBpdAorICAgICAqIHdpdGggdGhlIGdpdmVuIG9iamVjdCBhcmd1bWVudHMuIFRoZXNlIGFyZ3VtZW50cyBjYW4gb2YgY291cnNlCisgICAgICogYmUgU3RyaW5nIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBuYW1lCisgICAgICogQHBhcmFtIGFyZzEgRm9ybWF0dGluZyBkaXJlY3RpdmUKKyAgICAgKiBAcGFyYW0gYXJnMiBGb3JtYXR0aW5nIGRpcmVjdGl2ZQorICAgICAqIEBwYXJhbSBhcmczIEZvcm1hdHRpbmcgZGlyZWN0aXZlCisgICAgICogQHBhcmFtIGFyZzQgRm9ybWF0dGluZyBkaXJlY3RpdmUKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJnMywgT2JqZWN0IGFyZzQpIHsKKyAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7YXJnMSwgYXJnMiwgYXJnMywgYXJnNH07CisgICAgICAgIHJldHVybiBnZXRTdHJpbmcoa2V5LCBhcmdzKTsKKyAgICB9CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBTVEFUSUMgU1VQUE9SVCBNRVRIT0RTCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBtYW5hZ2VycyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgU3RyaW5nTWFuYWdlciBmb3IgYSBwYXJ0aWN1bGFyIHBhY2thZ2UuIElmIGEgbWFuYWdlciBmb3IKKyAgICAgKiBhIHBhY2thZ2UgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgcmV1c2VkLCBlbHNlIGEgbmV3CisgICAgICogU3RyaW5nTWFuYWdlciB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIFRoZSBwYWNrYWdlIG5hbWUKKyAgICAgKi8KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0cmluZ01hbmFnZXIgZ2V0TWFuYWdlcihTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgU3RyaW5nTWFuYWdlciBtZ3IgPSAoU3RyaW5nTWFuYWdlciltYW5hZ2Vycy5nZXQocGFja2FnZU5hbWUpOworCisgICAgICAgIGlmIChtZ3IgPT0gbnVsbCkgeworICAgICAgICAgICAgbWdyID0gbmV3IFN0cmluZ01hbmFnZXIocGFja2FnZU5hbWUpOworICAgICAgICAgICAgbWFuYWdlcnMucHV0KHBhY2thZ2VOYW1lLCBtZ3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtZ3I7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvU3RyaW5nUGFyc2VyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TdHJpbmdQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjgwNGI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvU3RyaW5nUGFyc2VyLmphdmEKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc3RyaW5nIHBhcnNpbmcgdGhhdCBpcyBoaWdoZXIgcGVyZm9ybWFuY2UgdGhhbgorICogU3RyaW5nUGFyc2VyIGZvciBzaW1wbGUgZGVsaW1pdGVkIHRleHQgY2FzZXMuICBQYXJzaW5nIGlzIHBlcmZvcm1lZAorICogYnkgc2V0dGluZyB0aGUgc3RyaW5nLCBhbmQgdGhlbiB1c2luZyB0aGUgPGNvZGU+ZmluZFh4eHgoKTwvY29kZT4gYW5kCisgKiA8Y29kZT5za2lwWHh4eCgpPC9jb2RlPiBmYW1pbGllcyBvZiBtZXRob2RzIHRvIHJlbWVtYmVyIHNpZ25pZmljYW50CisgKiBvZmZzZXRzLiAgVG8gcmV0cmlldmUgdGhlIHBhcnNlZCBzdWJzdHJpbmdzLCBjYWxsIHRoZSA8Y29kZT5leHRyYWN0KCk8L2NvZGU+CisgKiBtZXRob2Qgd2l0aCB0aGUgYXBwcm9wcmlhdGUgc2F2ZWQgb2Zmc2V0IHZhbHVlcy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFN0cmluZ1BhcnNlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBzdHJpbmcgcGFyc2VyIHdpdGggbm8gcHJlc2V0IHN0cmluZyB0byBiZSBwYXJzZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1BhcnNlcigpIHsKKworICAgICAgICB0aGlzKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBzdHJpbmcgcGFyc2VyIHRoYXQgaXMgaW5pdGlhbGl6ZWQgdG8gcGFyc2UgdGhlIHNwZWNpZmllZAorICAgICAqIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBiZSBwYXJzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nUGFyc2VyKFN0cmluZyBzdHJpbmcpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICBzZXRTdHJpbmcoc3RyaW5nKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBjaGFyYWN0ZXJzIG9mIHRoZSBjdXJyZW50IHN0cmluZywgYXMgYSBjaGFyYWN0ZXIgYXJyYXkuICBTdG9yZWQKKyAgICAgKiB3aGVuIHRoZSBzdHJpbmcgaXMgZmlyc3Qgc3BlY2lmaWVkIHRvIHNwZWVkIHVwIGFjY2VzcyB0byBjaGFyYWN0ZXJzCisgICAgICogYmVpbmcgY29tcGFyZWQgZHVyaW5nIHBhcnNpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBjaGFyIGNoYXJzW10gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgemVyby1yZWxhdGl2ZSBpbmRleCBvZiB0aGUgY3VycmVudCBwb2ludCBhdCB3aGljaCB3ZSBhcmUKKyAgICAgKiBwb3NpdGlvbmVkIHdpdGhpbiB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZC4gIDxzdHJvbmc+Tk9URTwvc3Ryb25nPjoKKyAgICAgKiB0aGUgdmFsdWUgb2YgdGhpcyBpbmRleCBjYW4gYmUgb25lIGxhcmdlciB0aGFuIHRoZSBpbmRleCBvZiB0aGUgbGFzdAorICAgICAqIGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIChpLmUuIGVxdWFsIHRvIHRoZSBzdHJpbmcgbGVuZ3RoKSBpZiB5b3UKKyAgICAgKiBwYXJzZSBvZmYgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiAgVGhpcyB2YWx1ZSBpcyB1c2VmdWwgZm9yIGV4dHJhY3RpbmcKKyAgICAgKiBzdWJzdHJpbmdzIHRoYXQgaW5jbHVkZSB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgaW5kZXggPSAwOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBTdHJpbmcgd2UgYXJlIGN1cnJlbnRseSBwYXJzaW5nLiAgU3RvcmVkIHdoZW4gdGhlCisgICAgICogc3RyaW5nIGlzIGZpcnN0IHNwZWNpZmllZCB0byBhdm9pZCByZXBlYXRlZCByZWNhbGN1bGF0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBsZW5ndGggPSAwOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgU3RyaW5nIHdlIGFyZSBjdXJyZW50bHkgcGFyc2luZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzdHJpbmcgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB6ZXJvLXJlbGF0aXZlIGluZGV4IG9mIG91ciBjdXJyZW50IHBhcnNpbmcgcG9zaXRpb24KKyAgICAgKiB3aXRoaW4gdGhlIHN0cmluZyBiZWluZyBwYXJzZWQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbmRleCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuaW5kZXgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHdlIGFyZSBwYXJzaW5nLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5sZW5ndGgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFN0cmluZyB3ZSBhcmUgY3VycmVudGx5IHBhcnNpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnN0cmluZyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgU3RyaW5nIHdlIGFyZSBjdXJyZW50bHkgcGFyc2luZy4gIFRoZSBwYXJzZXIgc3RhdGUgaXMgYWxzbyByZXNldAorICAgICAqIHRvIGJlZ2luIGF0IHRoZSBzdGFydCBvZiB0aGlzIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBiZSBwYXJzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKKworICAgICAgICB0aGlzLnN0cmluZyA9IHN0cmluZzsKKyAgICAgICAgaWYgKHN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmxlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKKyAgICAgICAgICAgIGNoYXJzID0gdGhpcy5zdHJpbmcudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGNoYXJzID0gbmV3IGNoYXJbMF07CisgICAgICAgIH0KKyAgICAgICAgcmVzZXQoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkdmFuY2UgdGhlIGN1cnJlbnQgcGFyc2luZyBwb3NpdGlvbiBieSBvbmUsIGlmIHdlIGFyZSBub3QgYWxyZWFkeQorICAgICAqIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkdmFuY2UoKSB7CisKKyAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoKQorICAgICAgICAgICAgaW5kZXgrKzsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRXh0cmFjdCBhbmQgcmV0dXJuIGEgc3Vic3RyaW5nIHRoYXQgc3RhcnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24sCisgICAgICogYW5kIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZC4gIElmIHRoaXMgaXMgbm90CisgICAgICogcG9zc2libGUsIGEgemVyby1sZW5ndGggc3RyaW5nIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0IFN0YXJ0aW5nIGluZGV4LCB6ZXJvIHJlbGF0aXZlLCBpbmNsdXNpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGV4dHJhY3QoaW50IHN0YXJ0KSB7CisKKyAgICAgICAgaWYgKChzdGFydCA8IDApIHx8IChzdGFydCA+PSBsZW5ndGgpKQorICAgICAgICAgICAgcmV0dXJuICgiIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAoc3RyaW5nLnN1YnN0cmluZyhzdGFydCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0IGFuZCByZXR1cm4gYSBzdWJzdHJpbmcgdGhhdCBzdGFydHMgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiwKKyAgICAgKiBhbmQgZW5kcyBhdCB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiAgSWYgdGhpcyBpcworICAgICAqIG5vdCBwb3NzaWJsZSwgYSB6ZXJvLWxlbmd0aCBzdHJpbmcgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnQgU3RhcnRpbmcgaW5kZXgsIHplcm8gcmVsYXRpdmUsIGluY2x1c2l2ZQorICAgICAqIEBwYXJhbSBlbmQgRW5kaW5nIGluZGV4LCB6ZXJvIHJlbGF0aXZlLCBleGNsdXNpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGV4dHJhY3QoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisKKyAgICAgICAgaWYgKChzdGFydCA8IDApIHx8IChzdGFydCA+PSBlbmQpIHx8IChlbmQgPiBsZW5ndGgpKQorICAgICAgICAgICAgcmV0dXJuICgiIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAoc3RyaW5nLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIG5leHQgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciwKKyAgICAgKiBvciB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgbGFzdCBwb3NpdGlvbiBvZiB0aGUgc3RyaW5nCisgICAgICogaWYgbm8gbW9yZSBvY2N1cnJlbmNlcyBvZiB0aGlzIGNoYXJhY3RlciBhcmUgZm91bmQuICBUaGUgY3VycmVudAorICAgICAqIHBhcnNpbmcgcG9zaXRpb24gaXMgdXBkYXRlZCB0byB0aGUgcmV0dXJuZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2ggQ2hhcmFjdGVyIHRvIGJlIGZvdW5kCisgICAgICovCisgICAgcHVibGljIGludCBmaW5kQ2hhcihjaGFyIGNoKSB7CisKKyAgICAgICAgd2hpbGUgKChpbmRleCA8IGxlbmd0aCkgJiYgKGNoICE9IGNoYXJzW2luZGV4XSkpCisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICByZXR1cm4gKGluZGV4KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBvY2N1cnJlbmNlIG9mIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLAorICAgICAqIG9yIHRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBsYXN0IHBvc2l0aW9uIG9mIHRoZSBzdHJpbmcKKyAgICAgKiBpZiBubyBtb3JlIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMgYXJlIGZvdW5kLiAgVGhlIGN1cnJlbnQKKyAgICAgKiBwYXJzaW5nIHBvc2l0aW9uIGlzIHVwZGF0ZWQgdG8gdGhlIHJldHVybmVkIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZmluZFRleHQoKSB7CisKKyAgICAgICAgd2hpbGUgKChpbmRleCA8IGxlbmd0aCkgJiYgaXNXaGl0ZShjaGFyc1tpbmRleF0pKQorICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgcmV0dXJuIChpbmRleCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIG5leHQgb2NjdXJyZW5jZSBvZiBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyLAorICAgICAqIG9yIHRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBsYXN0IHBvc2l0aW9uIG9mIHRoZSBzdHJpbmcKKyAgICAgKiBpZiBubyBtb3JlIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhcmUgZm91bmQuICBUaGUgY3VycmVudCBwYXJzaW5nCisgICAgICogcG9zaXRpb24gaXMgdXBkYXRlZCB0byB0aGUgcmV0dXJuZWQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGludCBmaW5kV2hpdGUoKSB7CisKKyAgICAgICAgd2hpbGUgKChpbmRleCA8IGxlbmd0aCkgJiYgIWlzV2hpdGUoY2hhcnNbaW5kZXhdKSkKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIHJldHVybiAoaW5kZXgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXNldCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcGFyc2VyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgICogY3VycmVudCBzdHJpbmcgYmVpbmcgcGFyc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworCisgICAgICAgIGluZGV4ID0gMDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWR2YW5jZSB0aGUgY3VycmVudCBwYXJzaW5nIHBvc2l0aW9uIHdoaWxlIGl0IGlzIHBvaW50aW5nIGF0IHRoZQorICAgICAqIHNwZWNpZmllZCBjaGFyYWN0ZXIsIG9yIHVudGlsIGl0IG1vdmVzIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorICAgICAqIFJldHVybiB0aGUgZmluYWwgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2ggQ2hhcmFjdGVyIHRvIGJlIHNraXBwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNraXBDaGFyKGNoYXIgY2gpIHsKKworICAgICAgICB3aGlsZSAoKGluZGV4IDwgbGVuZ3RoKSAmJiAoY2ggPT0gY2hhcnNbaW5kZXhdKSkKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIHJldHVybiAoaW5kZXgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZHZhbmNlIHRoZSBjdXJyZW50IHBhcnNpbmcgcG9zaXRpb24gd2hpbGUgaXQgaXMgcG9pbnRpbmcgYXQgYQorICAgICAqIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgb3IgdW50aWwgaXQgbW92ZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisgICAgICogUmV0dXJuIHRoZSBmaW5hbCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNraXBUZXh0KCkgeworCisgICAgICAgIHdoaWxlICgoaW5kZXggPCBsZW5ndGgpICYmICFpc1doaXRlKGNoYXJzW2luZGV4XSkpCisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICByZXR1cm4gKGluZGV4KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWR2YW5jZSB0aGUgY3VycmVudCBwYXJzaW5nIHBvc2l0aW9uIHdoaWxlIGl0IGlzIHBvaW50aW5nIGF0IGEKKyAgICAgKiB3aGl0ZXNwYWNlIGNoYXJhY3Rlciwgb3IgdW50aWwgaXQgbW92ZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisgICAgICogUmV0dXJuIHRoZSBmaW5hbCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNraXBXaGl0ZSgpIHsKKworICAgICAgICB3aGlsZSAoKGluZGV4IDwgbGVuZ3RoKSAmJiBpc1doaXRlKGNoYXJzW2luZGV4XSkpCisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICByZXR1cm4gKGluZGV4KTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIElzIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGNvbnNpZGVyZWQgdG8gYmUgd2hpdGVzcGFjZT8KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaCBDaGFyYWN0ZXIgdG8gYmUgY2hlY2tlZAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzV2hpdGUoY2hhciBjaCkgeworCisgICAgICAgIGlmICgoY2ggPT0gJyAnKSB8fCAoY2ggPT0gJ1x0JykgfHwgKGNoID09ICdccicpIHx8IChjaCA9PSAnXG4nKSkKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1RvbWNhdENTUy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvVG9tY2F0Q1NTLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0ODc4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1RvbWNhdENTUy5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCisKK3B1YmxpYyBjbGFzcyBUb21jYXRDU1MgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9NQ0FUX0NTUyA9CisgICAgICAgICJIMSB7Zm9udC1mYW1pbHk6VGFob21hLEFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6d2hpdGU7YmFja2dyb3VuZC1jb2xvcjojNTI1RDc2O2ZvbnQtc2l6ZToyMnB4O30gIiArCisgICAgICAgICJIMiB7Zm9udC1mYW1pbHk6VGFob21hLEFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6d2hpdGU7YmFja2dyb3VuZC1jb2xvcjojNTI1RDc2O2ZvbnQtc2l6ZToxNnB4O30gIiArCisgICAgICAgICJIMyB7Zm9udC1mYW1pbHk6VGFob21hLEFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6d2hpdGU7YmFja2dyb3VuZC1jb2xvcjojNTI1RDc2O2ZvbnQtc2l6ZToxNHB4O30gIiArCisgICAgICAgICJCT0RZIHtmb250LWZhbWlseTpUYWhvbWEsQXJpYWwsc2Fucy1zZXJpZjtjb2xvcjpibGFjaztiYWNrZ3JvdW5kLWNvbG9yOndoaXRlO30gIiArCisgICAgICAgICJCIHtmb250LWZhbWlseTpUYWhvbWEsQXJpYWwsc2Fucy1zZXJpZjtjb2xvcjp3aGl0ZTtiYWNrZ3JvdW5kLWNvbG9yOiM1MjVENzY7fSAiICsKKyAgICAgICAgIlAge2ZvbnQtZmFtaWx5OlRhaG9tYSxBcmlhbCxzYW5zLXNlcmlmO2JhY2tncm91bmQ6d2hpdGU7Y29sb3I6YmxhY2s7Zm9udC1zaXplOjEycHg7fSIgKworICAgICAgICAiQSB7Y29sb3IgOiBibGFjazt9IiArCisgICAgICAgICJBLm5hbWUge2NvbG9yIDogYmxhY2s7fSIgKworICAgICAgICAiSFIge2NvbG9yIDogIzUyNUQ3Njt9IjsKKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1VSTC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvVVJMLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkNWIyZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1VSTC5qYXZhCkBAIC0wLDAgKzEsNzA4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworCisKKy8qKgorICogPHA+PHN0cm9uZz5VUkw8L3N0cm9uZz4gaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBwdWJsaWMgQVBJcyBmb3IgcGFyc2luZworICogYW5kIHN5bnRoZXNpemluZyBVbmlmb3JtIFJlc291cmNlIExvY2F0b3JzIGFzIHNpbWlsYXIgYXMgcG9zc2libGUgdG8gdGhlCisgKiBBUElzIG9mIDxjb2RlPmphdmEubmV0LlVSTDwvY29kZT4sIGJ1dCB3aXRob3V0IHRoZSBhYmlsaXR5IHRvIG9wZW4gYQorICogc3RyZWFtIG9yIGNvbm5lY3Rpb24uICBPbmUgb2YgdGhlIGNvbnNlcXVlbmNlcyBvZiB0aGlzIGlzIHRoYXQgeW91IGNhbgorICogY29uc3RydWN0IFVSTHMgZm9yIHByb3RvY29scyBmb3Igd2hpY2ggYSBVUkxTdHJlYW1IYW5kbGVyIGlzIG5vdAorICogYXZhaWxhYmxlIChzdWNoIGFzIGFuICJodHRwcyIgVVJMIHdoZW4gSlNTRSBpcyBub3QgaW5zdGFsbGVkKS48L3A+CisgKgorICogPHA+PHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+IC0gVGhpcyBjbGFzcyBhc3N1bWVzIHRoYXQgdGhlIHN0cmluZworICogcmVwcmVzZW50YXRpb24gb2YgYSBVUkwgY29uZm9ybXMgdG8gdGhlIDxjb2RlPnNwZWM8L2NvZGU+IGFyZ3VtZW50CisgKiBhcyBkZXNjcmliZWQgaW4gUkZDIDIzOTYgIlVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnM6IEdlbmVyaWMgU3ludGF4IjoKKyAqIDxwcmU+CisgKiAgICZsdDtzY2hlbWUmZ3Q7Ly8mbHQ7YXV0aG9yaXR5Jmd0OyZsdDtwYXRoJmd0Oz8mbHQ7cXVlcnkmZ3Q7IyZsdDtmcmFnbWVudCZndDsKKyAqIDwvcHJlPjwvcD4KKyAqCisgKiA8cD48c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gVGhpcyBjbGFzcyByZWFsbHkgb3VnaHQgdG8gZW5kIHVwIGluIGEgQ29tbW9ucworICogcGFja2FnZSBzb21lcGxhY2UuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgVVJMIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIFVSTCBvYmplY3QgZnJvbSB0aGUgc3BlY2lmaWVkIFN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcGVjIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgVVJMCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAgICogIGNhbm5vdCBiZSBwYXJzZWQgc3VjY2Vzc2Z1bGx5CisgICAgICovCisgICAgcHVibGljIFVSTChTdHJpbmcgc3BlYykgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisKKyAgICAgICAgdGhpcyhudWxsLCBzcGVjKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgVVJMIG9iamVjdCBieSBwYXJzaW5nIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHJlbGF0aXZlCisgICAgICogdG8gYSBzcGVjaWZpZWQgY29udGV4dC4gIEJhc2VkIG9uIGxvZ2ljIGZyb20gSkRLIDEuMy4xJ3MKKyAgICAgKiA8Y29kZT5qYXZhLm5ldC5VUkw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVVJMIGFnYWluc3Qgd2hpY2ggdGhlIHJlbGF0aXZlIHJlcHJlc2VudGF0aW9uCisgICAgICogIGlzIHJlc29sdmVkCisgICAgICogQHBhcmFtIHNwZWMgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVUkwgKHVzdWFsbHkgcmVsYXRpdmUpCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAgICogIGNhbm5vdCBiZSBwYXJzZWQgc3VjY2Vzc2Z1bGx5CisgICAgICovCisgICAgcHVibGljIFVSTChVUkwgY29udGV4dCwgU3RyaW5nIHNwZWMpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBvcmlnaW5hbCA9IHNwZWM7CisgICAgICAgIGludCBpLCBsaW1pdCwgYzsKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgU3RyaW5nIG5ld1Byb3RvY29sID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBhUmVmID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gRWxpbWluYXRlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKKyAgICAgICAgICAgIGxpbWl0ID0gc3BlYy5sZW5ndGgoKTsKKyAgICAgICAgICAgIHdoaWxlICgobGltaXQgPiAwKSAmJiAoc3BlYy5jaGFyQXQobGltaXQgLSAxKSA8PSAnICcpKSB7CisgICAgICAgICAgICAgICAgbGltaXQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgoc3RhcnQgPCBsaW1pdCkgJiYgKHNwZWMuY2hhckF0KHN0YXJ0KSA8PSAnICcpKSB7CisgICAgICAgICAgICAgICAgc3RhcnQrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBzdGFydHMgd2l0aCAidXJsOiIsIHNraXAgaXQKKyAgICAgICAgICAgIGlmIChzcGVjLnJlZ2lvbk1hdGNoZXModHJ1ZSwgc3RhcnQsICJ1cmw6IiwgMCwgNCkpIHsKKyAgICAgICAgICAgICAgICBzdGFydCArPSA0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJcyB0aGlzIGEgcmVmIHJlbGF0aXZlIHRvIHRoZSBjb250ZXh0IFVSTD8KKyAgICAgICAgICAgIGlmICgoc3RhcnQgPCBzcGVjLmxlbmd0aCgpKSAmJiAoc3BlYy5jaGFyQXQoc3RhcnQpID09ICcjJykpIHsKKyAgICAgICAgICAgICAgICBhUmVmID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUGFyc2Ugb3V0IHRoZSBuZXcgcHJvdG9jb2wKKyAgICAgICAgICAgIGZvciAoaSA9IHN0YXJ0OyAhYVJlZiAmJiAoaSA8IGxpbWl0KSAmJgorICAgICAgICAgICAgICAgICAgICAgKChjID0gc3BlYy5jaGFyQXQoaSkpICE9ICcvJyk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChjID09ICc6JykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IHNwZWMuc3Vic3RyaW5nKHN0YXJ0LCBpKS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgYWxsIHByb3RvY29scyBhcmUgdmFsaWQKKyAgICAgICAgICAgICAgICAgICAgbmV3UHJvdG9jb2wgPSBzOworICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE9ubHkgdXNlIG91ciBjb250ZXh0IGlmIHRoZSBwcm90b2NvbHMgbWF0Y2gKKyAgICAgICAgICAgIHByb3RvY29sID0gbmV3UHJvdG9jb2w7CisgICAgICAgICAgICBpZiAoKGNvbnRleHQgIT0gbnVsbCkgJiYgKChuZXdQcm90b2NvbCA9PSBudWxsKSB8fAorICAgICAgICAgICAgICAgICBuZXdQcm90b2NvbC5lcXVhbHNJZ25vcmVDYXNlKGNvbnRleHQuZ2V0UHJvdG9jb2woKSkpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnRleHQgaXMgYSBoaWVyYXJjaGljYWwgVVJMIHNjaGVtZSBhbmQgdGhlIHNwZWMKKyAgICAgICAgICAgICAgICAvLyBjb250YWlucyBhIG1hdGNoaW5nIHNjaGVtZSB0aGVuIG1haW50YWluIGJhY2t3YXJkcworICAgICAgICAgICAgICAgIC8vIGNvbXBhdGliaWxpdHkgYW5kIHRyZWF0IGl0IGFzIGlmIHRoZSBzcGVjIGRpZG4ndCBjb250YWluCisgICAgICAgICAgICAgICAgLy8gdGhlIHNjaGVtZTsgc2VlIDUuMi4zIG9mIFJGQzIzOTYKKyAgICAgICAgICAgICAgICBpZiAoKGNvbnRleHQuZ2V0UGF0aCgpICE9IG51bGwpICYmCisgICAgICAgICAgICAgICAgICAgIChjb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKCIvIikpKQorICAgICAgICAgICAgICAgICAgICBuZXdQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKG5ld1Byb3RvY29sID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSBjb250ZXh0LmdldFByb3RvY29sKCk7CisgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0eSA9IGNvbnRleHQuZ2V0QXV0aG9yaXR5KCk7CisgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvID0gY29udGV4dC5nZXRVc2VySW5mbygpOworICAgICAgICAgICAgICAgICAgICBob3N0ID0gY29udGV4dC5nZXRIb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBjb250ZXh0LmdldFBvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGNvbnRleHQuZ2V0RmlsZSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgcXVlc3Rpb24gPSBmaWxlLmxhc3RJbmRleE9mKCI/Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChxdWVzdGlvbiA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGZpbGUuc3Vic3RyaW5nKDAsIHF1ZXN0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwcm90b2NvbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oIm5vIHByb3RvY29sOiAiICsgb3JpZ2luYWwpOworCisgICAgICAgICAgICAvLyBQYXJzZSBvdXQgYW55IHJlZiBwb3J0aW9uIG9mIHRoZSBzcGVjCisgICAgICAgICAgICBpID0gc3BlYy5pbmRleE9mKCcjJywgc3RhcnQpOworICAgICAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgICAgICAgIHJlZiA9IHNwZWMuc3Vic3RyaW5nKGkgKyAxLCBsaW1pdCk7CisgICAgICAgICAgICAgICAgbGltaXQgPSBpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBQYXJzZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBzcGVjIGluIGEgcHJvdG9jb2wtc3BlY2lmaWMgZmFzaGlvbgorICAgICAgICAgICAgcGFyc2Uoc3BlYywgc3RhcnQsIGxpbWl0KTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgbm9ybWFsaXplKCk7CisKKworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBVUkwgb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZCBjb21wb25lbnRzLiAgVGhlIGRlZmF1bHQgcG9ydAorICAgICAqIG51bWJlciBmb3IgdGhlIHNwZWNpZmllZCBwcm90b2NvbCB3aWxsIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdG9jb2wgTmFtZSBvZiB0aGUgcHJvdG9jb2wgdG8gdXNlCisgICAgICogQHBhcmFtIGhvc3QgTmFtZSBvZiB0aGUgaG9zdCBhZGRyZXNzZWQgYnkgdGhpcyBwcm90b2NvbAorICAgICAqIEBwYXJhbSBmaWxlIEZpbGVuYW1lIG9uIHRoZSBzcGVjaWZpZWQgaG9zdAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaXMgbmV2ZXIgdGhyb3duLCBidXQgcHJlc2VudCBmb3IKKyAgICAgKiAgY29tcGF0aWJsZSBBUElzCisgICAgICovCisgICAgcHVibGljIFVSTChTdHJpbmcgcHJvdG9jb2wsIFN0cmluZyBob3N0LCBTdHJpbmcgZmlsZSkKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisKKyAgICAgICAgdGhpcyhwcm90b2NvbCwgaG9zdCwgLTEsIGZpbGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBVUkwgb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZCBjb21wb25lbnRzLiAgU3BlY2lmeWluZyBhIHBvcnQKKyAgICAgKiBudW1iZXIgb2YgLTEgaW5kaWNhdGVzIHRoYXQgdGhlIFVSTCBzaG91bGQgdXNlIHRoZSBkZWZhdWx0IHBvcnQgZm9yCisgICAgICogdGhhdCBwcm90b2NvbC4gIEJhc2VkIG9uIGxvZ2ljIGZyb20gSkRLIDEuMy4xJ3MKKyAgICAgKiA8Y29kZT5qYXZhLm5ldC5VUkw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3RvY29sIE5hbWUgb2YgdGhlIHByb3RvY29sIHRvIHVzZQorICAgICAqIEBwYXJhbSBob3N0IE5hbWUgb2YgdGhlIGhvc3QgYWRkcmVzc2VkIGJ5IHRoaXMgcHJvdG9jb2wKKyAgICAgKiBAcGFyYW0gcG9ydCBQb3J0IG51bWJlciwgb3IgLTEgZm9yIHRoZSBkZWZhdWx0IHBvcnQgZm9yIHRoaXMgcHJvdG9jb2wKKyAgICAgKiBAcGFyYW0gZmlsZSBGaWxlbmFtZSBvbiB0aGUgc3BlY2lmaWVkIGhvc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlzIG5ldmVyIHRocm93biwgYnV0IHByZXNlbnQgZm9yCisgICAgICogIGNvbXBhdGlibGUgQVBJcworICAgICAqLworICAgIHB1YmxpYyBVUkwoU3RyaW5nIHByb3RvY29sLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBmaWxlKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKworICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisKKyAgICAgICAgaW50IGhhc2ggPSBmaWxlLmluZGV4T2YoJyMnKTsKKyAgICAgICAgdGhpcy5maWxlID0gaGFzaCA8IDAgPyBmaWxlIDogZmlsZS5zdWJzdHJpbmcoMCwgaGFzaCk7CisgICAgICAgIHRoaXMucmVmID0gaGFzaCA8IDAgPyBudWxsIDogZmlsZS5zdWJzdHJpbmcoaGFzaCArIDEpOworICAgICAgICBpbnQgcXVlc3Rpb24gPSBmaWxlLmxhc3RJbmRleE9mKCc/Jyk7CisgICAgICAgIGlmIChxdWVzdGlvbiA+PSAwKSB7CisgICAgICAgICAgICBxdWVyeSA9IGZpbGUuc3Vic3RyaW5nKHF1ZXN0aW9uICsgMSk7CisgICAgICAgICAgICBwYXRoID0gZmlsZS5zdWJzdHJpbmcoMCwgcXVlc3Rpb24pOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHBhdGggPSBmaWxlOworCisgICAgICAgIGlmICgoaG9zdCAhPSBudWxsKSAmJiAoaG9zdC5sZW5ndGgoKSA+IDApKQorICAgICAgICAgICAgYXV0aG9yaXR5ID0gKHBvcnQgPT0gLTEpID8gaG9zdCA6IGhvc3QgKyAiOiIgKyBwb3J0OworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGF1dGhvcml0eSBwYXJ0IG9mIHRoZSBVUkwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0aG9yaXR5ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGZpbGVuYW1lIHBhcnQgb2YgdGhlIFVSTC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBmaWxlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGhvc3QgbmFtZSBwYXJ0IG9mIHRoZSBVUkwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBwYXRoIHBhcnQgb2YgdGhlIFVSTC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXRoID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHBvcnQgbnVtYmVyIHBhcnQgb2YgdGhlIFVSTC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBwb3J0ID0gLTE7CisKKworICAgIC8qKgorICAgICAqIFRoZSBwcm90b2NvbCBuYW1lIHBhcnQgb2YgdGhlIFVSTC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcm90b2NvbCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBxdWVyeSBwYXJ0IG9mIHRoZSBVUkwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnkgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVmZXJlbmNlIHBhcnQgb2YgdGhlIFVSTC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZWYgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlciBpbmZvIHBhcnQgb2YgdGhlIFVSTC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2VySW5mbyA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHR3byBVUkxzIGZvciBlcXVhbGl0eS4gIFRoZSByZXN1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kCisgICAgICogb25seSBpZiB0aGUgYXJndW1lbnQgaXMgbm90IG51bGwsIGFuZCBpcyBhIDxjb2RlPlVSTDwvY29kZT4gb2JqZWN0CisgICAgICogdGhhdCByZXByZXNlbnRzIHRoZSBzYW1lIDxjb2RlPlVSTDwvY29kZT4gYXMgdGhpcyBvYmplY3QuICBUd28KKyAgICAgKiA8Y29kZT5VUkxzPC9jb2RlPiBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIHByb3RvY29sIGFuZAorICAgICAqIHJlZmVyZW5jZSB0aGUgc2FtZSBob3N0LCB0aGUgc2FtZSBwb3J0IG51bWJlciBvbiB0aGUgaG9zdCwKKyAgICAgKiBhbmQgdGhlIHNhbWUgZmlsZSBhbmQgYW5jaG9yIG9uIHRoZSBob3N0LgorICAgICAqCisgICAgICogQHBhcmFtIG9iaiBUaGUgVVJMIHRvIGNvbXBhcmUgYWdhaW5zdAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFVSTCkpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgVVJMIG90aGVyID0gKFVSTCkgb2JqOworICAgICAgICBpZiAoIXNhbWVGaWxlKG90aGVyKSkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICByZXR1cm4gKGNvbXBhcmUocmVmLCBvdGhlci5nZXRSZWYoKSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGF1dGhvcml0eSBwYXJ0IG9mIHRoZSBVUkwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRob3JpdHkoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmF1dGhvcml0eSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZmlsZW5hbWUgcGFydCBvZiB0aGUgVVJMLiAgPHN0cm9uZz5OT1RFPC9zdHJvbmc+IC0gRm9yCisgICAgICogY29tcGF0aWJpbGl0eSB3aXRoIDxjb2RlPmphdmEubmV0LlVSTDwvY29kZT4sIHRoaXMgdmFsdWUgaW5jbHVkZXMKKyAgICAgKiB0aGUgcXVlcnkgc3RyaW5nIGlmIHRoZXJlIHdhcyBvbmUuICBGb3IganVzdCB0aGUgcGF0aCBwb3J0aW9uLAorICAgICAqIGNhbGwgPGNvZGU+Z2V0UGF0aCgpPC9jb2RlPiBpbnN0ZWFkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZSgpIHsKKworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuICgiIik7CisgICAgICAgIHJldHVybiAodGhpcy5maWxlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBob3N0IG5hbWUgcGFydCBvZiB0aGUgVVJMLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuaG9zdCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGF0aCBwYXJ0IG9mIHRoZSBVUkwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworCisgICAgICAgIGlmICh0aGlzLnBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoIiIpOworICAgICAgICByZXR1cm4gKHRoaXMucGF0aCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcG9ydCBudW1iZXIgcGFydCBvZiB0aGUgVVJMLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucG9ydCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJvdG9jb2wgbmFtZSBwYXJ0IG9mIHRoZSBVUkwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucHJvdG9jb2wpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHF1ZXJ5IHBhcnQgb2YgdGhlIFVSTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5xdWVyeSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVmZXJlbmNlIHBhcnQgb2YgdGhlIFVSTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlZigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucmVmKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VyIGluZm8gcGFydCBvZiB0aGUgVVJMLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlckluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnVzZXJJbmZvKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTm9ybWFsaXplIHRoZSA8Y29kZT5wYXRoPC9jb2RlPiAoYW5kIHRoZXJlZm9yZSA8Y29kZT5maWxlPC9jb2RlPikKKyAgICAgKiBwb3J0aW9ucyBvZiB0aGlzIFVSTC4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5PVEU8L3N0cm9uZz4gLSBUaGlzIG1ldGhvZCBpcyBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSQorICAgICAqIG9mIDxjb2RlPmphdmEubmV0LlVSTDwvY29kZT4sIGJ1dCBpcyBwcm92aWRlZCBhcyBhIHZhbHVlIGFkZGVkCisgICAgICogc2VydmljZSBvZiB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgYSBub3JtYWxpemF0aW9uIGVycm9yIG9jY3VycywKKyAgICAgKiAgc3VjaCBhcyB0cnlpbmcgdG8gbW92ZSBhYm91dCB0aGUgaGllcmFyY2hpY2FsIHJvb3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3JtYWxpemUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIG51bGwgcGF0aAorICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmaWxlID0gIj8iICsgcXVlcnk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmlsZSA9ICIiOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgcGxhY2UgZm9yIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICAgICAgU3RyaW5nIG5vcm1hbGl6ZWQgPSBwYXRoOworICAgICAgICBpZiAobm9ybWFsaXplZC5lcXVhbHMoIi8uIikpIHsKKyAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmaWxlID0gcGF0aCArICI/IiArIHF1ZXJ5OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZpbGUgPSBwYXRoOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBzbGFzaGVzIGFuZCBhZGQgbGVhZGluZyBzbGFzaCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKG5vcm1hbGl6ZWQuaW5kZXhPZignXFwnKSA+PSAwKQorICAgICAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICBpZiAoIW5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgiLyIpKQorICAgICAgICAgICAgbm9ybWFsaXplZCA9ICIvIiArIG5vcm1hbGl6ZWQ7CisKKyAgICAgICAgLy8gUmVzb2x2ZSBvY2N1cnJlbmNlcyBvZiAiLy8iIGluIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IG5vcm1hbGl6ZWQuaW5kZXhPZigiLy8iKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zdWJzdHJpbmcoMCwgaW5kZXgpICsKKyAgICAgICAgICAgICAgICBub3JtYWxpemVkLnN1YnN0cmluZyhpbmRleCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzb2x2ZSBvY2N1cnJlbmNlcyBvZiAiLy4vIiBpbiB0aGUgbm9ybWFsaXplZCBwYXRoCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBub3JtYWxpemVkLmluZGV4T2YoIi8uLyIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnN1YnN0cmluZygwLCBpbmRleCkgKworICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQuc3Vic3RyaW5nKGluZGV4ICsgMik7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNvbHZlIG9jY3VycmVuY2VzIG9mICIvLi4vIiBpbiB0aGUgbm9ybWFsaXplZCBwYXRoCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBub3JtYWxpemVkLmluZGV4T2YoIi8uLi8iKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiSW52YWxpZCByZWxhdGl2ZSBVUkwgcmVmZXJlbmNlIik7CisgICAgICAgICAgICBpbnQgaW5kZXgyID0gbm9ybWFsaXplZC5sYXN0SW5kZXhPZignLycsIGluZGV4IC0gMSk7CisgICAgICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zdWJzdHJpbmcoMCwgaW5kZXgyKSArCisgICAgICAgICAgICAgICAgbm9ybWFsaXplZC5zdWJzdHJpbmcoaW5kZXggKyAzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8uIiBhdCB0aGUgZW5kIG9mIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICAgICAgaWYgKG5vcm1hbGl6ZWQuZW5kc1dpdGgoIi8uIikpCisgICAgICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zdWJzdHJpbmcoMCwgbm9ybWFsaXplZC5sZW5ndGgoKSAtIDEpOworCisgICAgICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8uLiIgYXQgdGhlIGVuZCBvZiB0aGUgbm9ybWFsaXplZCBwYXRoCisgICAgICAgIGlmIChub3JtYWxpemVkLmVuZHNXaXRoKCIvLi4iKSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gbm9ybWFsaXplZC5sZW5ndGgoKSAtIDM7CisgICAgICAgICAgICBpbnQgaW5kZXgyID0gbm9ybWFsaXplZC5sYXN0SW5kZXhPZignLycsIGluZGV4IC0gMSk7CisgICAgICAgICAgICBpZiAoaW5kZXgyIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiSW52YWxpZCByZWxhdGl2ZSBVUkwgcmVmZXJlbmNlIik7CisgICAgICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zdWJzdHJpbmcoMCwgaW5kZXgyICsgMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gdGhlIG5vcm1hbGl6ZWQgcGF0aCB0aGF0IHdlIGhhdmUgY29tcGxldGVkCisgICAgICAgIHBhdGggPSBub3JtYWxpemVkOworICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkKKyAgICAgICAgICAgIGZpbGUgPSBwYXRoICsgIj8iICsgcXVlcnk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpbGUgPSBwYXRoOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHR3byBVUkxzLCBleGNsdWRpbmcgdGhlICJyZWYiIGZpZWxkcy4gIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4KKyAgICAgKiBpZiB0aGlzIDxjb2RlPlVSTDwvY29kZT4gYW5kIHRoZSA8Y29kZT5vdGhlcjwvY29kZT4gYXJndW1lbnQgYm90aCByZWZlcgorICAgICAqIHRvIHRoZSBzYW1lIHJlc291cmNlLiAgVGhlIHR3byA8Y29kZT5VUkxzPC9jb2RlPiBtaWdodCBub3QgYm90aCBjb250YWluCisgICAgICogdGhlIHNhbWUgYW5jaG9yLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNhbWVGaWxlKFVSTCBvdGhlcikgeworCisgICAgICAgIGlmICghY29tcGFyZShwcm90b2NvbCwgb3RoZXIuZ2V0UHJvdG9jb2woKSkpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgaWYgKCFjb21wYXJlKGhvc3QsIG90aGVyLmdldEhvc3QoKSkpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgaWYgKHBvcnQgIT0gb3RoZXIuZ2V0UG9ydCgpKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIGlmICghY29tcGFyZShmaWxlLCBvdGhlci5nZXRGaWxlKCkpKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIHJldHVybiAodHJ1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVSTC4gIFRoaXMgZm9sbG93IHRoZSBydWxlcyBpbgorICAgICAqIFJGQyAyMzk2LCBTZWN0aW9uIDUuMiwgU3RlcCA3LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9FeHRlcm5hbEZvcm0oKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpZiAocHJvdG9jb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKHByb3RvY29sKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiOiIpOworICAgICAgICB9CisgICAgICAgIGlmIChhdXRob3JpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIvLyIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGF1dGhvcml0eSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZChwYXRoKTsKKyAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnPycpOworICAgICAgICAgICAgc2IuYXBwZW5kKHF1ZXJ5KTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVmICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnIycpOworICAgICAgICAgICAgc2IuYXBwZW5kKHJlZik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVVJMWyIpOworICAgICAgICBzYi5hcHBlbmQoImF1dGhvcml0eT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGF1dGhvcml0eSk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBmaWxlPSIpOworICAgICAgICBzYi5hcHBlbmQoZmlsZSk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBob3N0PSIpOworICAgICAgICBzYi5hcHBlbmQoaG9zdCk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBwb3J0PSIpOworICAgICAgICBzYi5hcHBlbmQocG9ydCk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBwcm90b2NvbD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHByb3RvY29sKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsIHF1ZXJ5PSIpOworICAgICAgICBzYi5hcHBlbmQocXVlcnkpOworICAgICAgICBzYi5hcHBlbmQoIiwgcmVmPSIpOworICAgICAgICBzYi5hcHBlbmQocmVmKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsIHVzZXJJbmZvPSIpOworICAgICAgICBzYi5hcHBlbmQodXNlckluZm8pOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgICAgICAvLyAgICAgICAgcmV0dXJuICh0b0V4dGVybmFsRm9ybSgpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENvbXBhcmUgdG8gU3RyaW5nIHZhbHVlcyBmb3IgZXF1YWxpdHksIHRha2luZyBhcHByb3ByaWF0ZSBjYXJlIGlmIG9uZQorICAgICAqIG9yIGJvdGggb2YgdGhlIHZhbHVlcyBhcmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlyc3QgRmlyc3Qgc3RyaW5nCisgICAgICogQHBhcmFtIHNlY29uZCBTZWNvbmQgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbXBhcmUoU3RyaW5nIGZpcnN0LCBTdHJpbmcgc2Vjb25kKSB7CisKKyAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChzZWNvbmQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHNlY29uZCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoZmlyc3QuZXF1YWxzKHNlY29uZCkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgVVJMLAorICAgICAqIGFzc3VtaW5nIHRoYXQgaXQgaGFzIGEgZm9ybWF0IHNpbWlsYXIgdG8gdGhhdCBmb3IgPGNvZGU+aHR0cDwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD48c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gVGhpcyBhbGdvcml0aG0gY2FuIHVuZG91YnRlZGx5IGJlIG9wdGltaXplZAorICAgICAqIGZvciBwZXJmb3JtYW5jZS4gIEhvd2V2ZXIsIHRoYXQgbmVlZHMgdG8gd2FpdCB1bnRpbCBhZnRlciBzdWZmaWNpZW50CisgICAgICogdW5pdCB0ZXN0cyBhcmUgaW1wbGVtZW50ZWQgdG8gZ3VhcmFudGVlIGNvcnJlY3QgYmVoYXZpb3Igd2l0aCBubworICAgICAqIHJlZ3Jlc3Npb25zLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcGVjIFN0cmluZyByZXByZXNlbnRhdGlvbiBiZWluZyBwYXJzZWQKKyAgICAgKiBAcGFyYW0gc3RhcnQgU3RhcnRpbmcgb2Zmc2V0LCB3aGljaCB3aWxsIGJlIGp1c3QgYWZ0ZXIgdGhlICc6JyAoaWYKKyAgICAgKiAgdGhlcmUgaXMgb25lKSB0aGF0IGRldGVybWluZWQgdGhlIHByb3RvY29sIG5hbWUKKyAgICAgKiBAcGFyYW0gbGltaXQgRW5kaW5nIHBvc2l0aW9uLCB3aGljaCB3aWxsIGJlIHRoZSBwb3NpdGlvbiBvZiB0aGUgJyMnCisgICAgICogIChpZiB0aGVyZSBpcyBvbmUpIHRoYXQgZGVsaW1pdGVkIHRoZSBhbmNob3IKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2UoU3RyaW5nIHNwZWMsIGludCBzdGFydCwgaW50IGxpbWl0KQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBUcmltIHRoZSBxdWVyeSBzdHJpbmcgKGlmIGFueSkgb2ZmIHRoZSB0YWlsIGVuZAorICAgICAgICBpbnQgcXVlc3Rpb24gPSBzcGVjLmxhc3RJbmRleE9mKCc/JywgbGltaXQgLSAxKTsKKyAgICAgICAgaWYgKChxdWVzdGlvbiA+PSAwKSAmJiAocXVlc3Rpb24gPCBsaW1pdCkpIHsKKyAgICAgICAgICAgIHF1ZXJ5ID0gc3BlYy5zdWJzdHJpbmcocXVlc3Rpb24gKyAxLCBsaW1pdCk7CisgICAgICAgICAgICBsaW1pdCA9IHF1ZXN0aW9uOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVlcnkgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGFyc2UgdGhlIGF1dGhvcml0eSBzZWN0aW9uCisgICAgICAgIGlmIChzcGVjLmluZGV4T2YoIi8vIiwgc3RhcnQpID09IHN0YXJ0KSB7CisgICAgICAgICAgICBpbnQgcGF0aFN0YXJ0ID0gc3BlYy5pbmRleE9mKCIvIiwgc3RhcnQgKyAyKTsKKyAgICAgICAgICAgIGlmICgocGF0aFN0YXJ0ID49IDApICYmIChwYXRoU3RhcnQgPCBsaW1pdCkpIHsKKyAgICAgICAgICAgICAgICBhdXRob3JpdHkgPSBzcGVjLnN1YnN0cmluZyhzdGFydCArIDIsIHBhdGhTdGFydCk7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBwYXRoU3RhcnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF1dGhvcml0eSA9IHNwZWMuc3Vic3RyaW5nKHN0YXJ0ICsgMiwgbGltaXQpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gbGltaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXV0aG9yaXR5Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGludCBhdCA9IGF1dGhvcml0eS5pbmRleE9mKCdAJyk7CisgICAgICAgICAgICAgICAgaWYoIGF0ID49IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvID0gYXV0aG9yaXR5LnN1YnN0cmluZygwLGF0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGNvbG9uID0gYXV0aG9yaXR5LmluZGV4T2YoJzonLGF0KzEpOworICAgICAgICAgICAgICAgIGlmIChjb2xvbiA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KGF1dGhvcml0eS5zdWJzdHJpbmcoY29sb24gKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaG9zdCA9IGF1dGhvcml0eS5zdWJzdHJpbmcoYXQrMSwgY29sb24pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGhvc3QgPSBhdXRob3JpdHkuc3Vic3RyaW5nKGF0KzEpOworICAgICAgICAgICAgICAgICAgICBwb3J0ID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUGFyc2UgdGhlIHBhdGggc2VjdGlvbgorICAgICAgICBpZiAoc3BlYy5pbmRleE9mKCIvIiwgc3RhcnQpID09IHN0YXJ0KSB7ICAgICAvLyBBYnNvbHV0ZSBwYXRoCisgICAgICAgICAgICBwYXRoID0gc3BlYy5zdWJzdHJpbmcoc3RhcnQsIGxpbWl0KTsKKyAgICAgICAgICAgIGlmIChxdWVyeSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZpbGUgPSBwYXRoICsgIj8iICsgcXVlcnk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmlsZSA9IHBhdGg7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNvbHZlIHJlbGF0aXZlIHBhdGggYWdhaW5zdCBvdXIgY29udGV4dCdzIGZpbGUKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpCisgICAgICAgICAgICAgICAgZmlsZSA9ICI/IiArIHF1ZXJ5OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZpbGUgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCIvIikpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJCYXNlIHBhdGggZG9lcyBub3Qgc3RhcnQgd2l0aCAnLyciKTsKKyAgICAgICAgaWYgKCFwYXRoLmVuZHNXaXRoKCIvIikpCisgICAgICAgICAgICBwYXRoICs9ICIvLi4vIjsKKyAgICAgICAgcGF0aCArPSBzcGVjLnN1YnN0cmluZyhzdGFydCwgbGltaXQpOworICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkKKyAgICAgICAgICAgIGZpbGUgPSBwYXRoICsgIj8iICsgcXVlcnk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpbGUgPSBwYXRoOworICAgICAgICByZXR1cm47CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvVVJMRW5jb2Rlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvVVJMRW5jb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NDI2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9VUkxFbmNvZGVyLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKKy8qKgorICoKKyAqIFRoaXMgY2xhc3MgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBqYXZhLm5ldC5VUkxFbmNvZGVyIGNsYXNzLgorICoKKyAqIFVuZm9ydHVuYXRlbHksIHdpdGggamF2YS5uZXQuVVJMRW5jb2RlciB0aGVyZSBpcyBubyB3YXkgdG8gc3BlY2lmeSB0byB0aGUgCisgKiBqYXZhLm5ldC5VUkxFbmNvZGVyIHdoaWNoIGNoYXJhY3RlcnMgc2hvdWxkIE5PVCBiZSBlbmNvZGVkLgorICoKKyAqIFRoaXMgY29kZSB3YXMgbW92ZWQgZnJvbSBEZWZhdWx0U2VydmxldC5qYXZhCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKi8KK3B1YmxpYyBjbGFzcyBVUkxFbmNvZGVyIHsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXJbXSBoZXhhZGVjaW1hbCA9CisgICAgeycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKKyAgICAgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJ307CisKKyAgICAvL0FycmF5IGNvbnRhaW5pbmcgdGhlIHNhZmUgY2hhcmFjdGVycyBzZXQuCisgICAgcHJvdGVjdGVkIEJpdFNldCBzYWZlQ2hhcmFjdGVycyA9IG5ldyBCaXRTZXQoMjU2KTsKKworICAgIHB1YmxpYyBVUkxFbmNvZGVyKCkgeworICAgICAgICBmb3IgKGNoYXIgaSA9ICdhJzsgaSA8PSAneic7IGkrKykgeworICAgICAgICAgICAgYWRkU2FmZUNoYXJhY3RlcihpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNoYXIgaSA9ICdBJzsgaSA8PSAnWic7IGkrKykgeworICAgICAgICAgICAgYWRkU2FmZUNoYXJhY3RlcihpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNoYXIgaSA9ICcwJzsgaSA8PSAnOSc7IGkrKykgeworICAgICAgICAgICAgYWRkU2FmZUNoYXJhY3RlcihpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFNhZmVDaGFyYWN0ZXIoIGNoYXIgYyApIHsKKwlzYWZlQ2hhcmFjdGVycy5zZXQoIGMgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZSggU3RyaW5nIHBhdGggKSB7CisgICAgICAgIGludCBtYXhCeXRlc1BlckNoYXIgPSAxMDsKKyAgICAgICAgaW50IGNhc2VEaWZmID0gKCdhJyAtICdBJyk7CisgICAgICAgIFN0cmluZ0J1ZmZlciByZXdyaXR0ZW5QYXRoID0gbmV3IFN0cmluZ0J1ZmZlcihwYXRoLmxlbmd0aCgpKTsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0obWF4Qnl0ZXNQZXJDaGFyKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJ1ZiwgIlVURjgiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgaW50IGMgPSAoaW50KSBwYXRoLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChzYWZlQ2hhcmFjdGVycy5nZXQoYykpIHsKKyAgICAgICAgICAgICAgICByZXdyaXR0ZW5QYXRoLmFwcGVuZCgoY2hhciljKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBleHRlcm5hbCBlbmNvZGluZyBiZWZvcmUgaGV4IGNvbnZlcnNpb24KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoKGNoYXIpYyk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBidWYucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ5dGVbXSBiYSA9IGJ1Zi50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYmEubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydGluZyBlYWNoIGJ5dGUgaW4gdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBieXRlIHRvRW5jb2RlID0gYmFbal07CisgICAgICAgICAgICAgICAgICAgIHJld3JpdHRlblBhdGguYXBwZW5kKCclJyk7CisgICAgICAgICAgICAgICAgICAgIGludCBsb3cgPSAoaW50KSAodG9FbmNvZGUgJiAweDBmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGhpZ2ggPSAoaW50KSAoKHRvRW5jb2RlICYgMHhmMCkgPj4gNCk7CisgICAgICAgICAgICAgICAgICAgIHJld3JpdHRlblBhdGguYXBwZW5kKGhleGFkZWNpbWFsW2hpZ2hdKTsKKyAgICAgICAgICAgICAgICAgICAgcmV3cml0dGVuUGF0aC5hcHBlbmQoaGV4YWRlY2ltYWxbbG93XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1Zi5yZXNldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXdyaXR0ZW5QYXRoLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvWE1MV3JpdGVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9YTUxXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjMxMzQwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvWE1MV3JpdGVyLmphdmEKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CisKKy8qKgorICogWE1MV3JpdGVyIGhlbHBlciBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hPgorICovCitwdWJsaWMgY2xhc3MgWE1MV3JpdGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIC8qKgorICAgICAqIE9wZW5pbmcgdGFnLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRU5JTkcgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBDbG9zaW5nIHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTE9TSU5HID0gMTsKKworCisgICAgLyoqCisgICAgICogRWxlbWVudCB3aXRoIG5vIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fQ09OVEVOVCA9IDI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKworICAgIC8qKgorICAgICAqIFdyaXRlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgV3JpdGVyIHdyaXRlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MV3JpdGVyKCkgeworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFhNTFdyaXRlcihXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgIHRoaXMud3JpdGVyID0gd3JpdGVyOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIGdlbmVyYXRlZCBYTUwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBnZW5lcmF0ZWQgWE1MCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgcHJvcGVydHkgdG8gdGhlIFhNTC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lc3BhY2UgTmFtZXNwYWNlCisgICAgICogQHBhcmFtIG5hbWVzcGFjZUluZm8gTmFtZXNwYWNlIGluZm8KKyAgICAgKiBAcGFyYW0gbmFtZSBQcm9wZXJ0eSBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlIFByb3BlcnR5IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVQcm9wZXJ0eShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZXNwYWNlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgd3JpdGVFbGVtZW50KG5hbWVzcGFjZSwgbmFtZXNwYWNlSW5mbywgbmFtZSwgT1BFTklORyk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQodmFsdWUpOworICAgICAgICB3cml0ZUVsZW1lbnQobmFtZXNwYWNlLCBuYW1lc3BhY2VJbmZvLCBuYW1lLCBDTE9TSU5HKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgcHJvcGVydHkgdG8gdGhlIFhNTC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lc3BhY2UgTmFtZXNwYWNlCisgICAgICogQHBhcmFtIG5hbWUgUHJvcGVydHkgbmFtZQorICAgICAqIEBwYXJhbSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlUHJvcGVydHkoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB3cml0ZUVsZW1lbnQobmFtZXNwYWNlLCBuYW1lLCBPUEVOSU5HKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgIHdyaXRlRWxlbWVudChuYW1lc3BhY2UsIG5hbWUsIENMT1NJTkcpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgcHJvcGVydHkgdG8gdGhlIFhNTC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lc3BhY2UgTmFtZXNwYWNlCisgICAgICogQHBhcmFtIG5hbWUgUHJvcGVydHkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlUHJvcGVydHkoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgd3JpdGVFbGVtZW50KG5hbWVzcGFjZSwgbmFtZSwgTk9fQ09OVEVOVCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgRWxlbWVudCBuYW1lCisgICAgICogQHBhcmFtIG5hbWVzcGFjZSBOYW1lc3BhY2UgYWJicmV2aWF0aW9uCisgICAgICogQHBhcmFtIHR5cGUgRWxlbWVudCB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBpbnQgdHlwZSkgeworICAgICAgICB3cml0ZUVsZW1lbnQobmFtZXNwYWNlLCBudWxsLCBuYW1lLCB0eXBlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIGFuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZXNwYWNlIE5hbWVzcGFjZSBhYmJyZXZpYXRpb24KKyAgICAgKiBAcGFyYW0gbmFtZXNwYWNlSW5mbyBOYW1lc3BhY2UgaW5mbworICAgICAqIEBwYXJhbSBuYW1lIEVsZW1lbnQgbmFtZQorICAgICAqIEBwYXJhbSB0eXBlIEVsZW1lbnQgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlRWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZXNwYWNlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIGludCB0eXBlKSB7CisgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UubGVuZ3RoKCkgPiAwKSkgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIE9QRU5JTkc6CisgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCI8IiArIG5hbWVzcGFjZSArICI6IiArIG5hbWUgKyAiIHhtbG5zOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWVzcGFjZSArICI9XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lc3BhY2VJbmZvICsgIlwiPiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjwiICsgbmFtZXNwYWNlICsgIjoiICsgbmFtZSArICI+Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDTE9TSU5HOgorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjwvIiArIG5hbWVzcGFjZSArICI6IiArIG5hbWUgKyAiPlxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5PX0NPTlRFTlQ6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPCIgKyBuYW1lc3BhY2UgKyAiOiIgKyBuYW1lICsgIiB4bWxuczoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lc3BhY2UgKyAiPVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZXNwYWNlSW5mbyArICJcIi8+Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPCIgKyBuYW1lc3BhY2UgKyAiOiIgKyBuYW1lICsgIi8+Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIE9QRU5JTkc6CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPCIgKyBuYW1lICsgIj4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0xPU0lORzoKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCI8LyIgKyBuYW1lICsgIj5cbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBOT19DT05URU5UOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCI8IiArIG5hbWUgKyAiLz4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgdGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IFRleHQgdG8gYXBwZW5kCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVUZXh0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQodGV4dCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgRGF0YSB0byBhcHBlbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZURhdGEoU3RyaW5nIGRhdGEpIHsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiPCFbQ0RBVEFbIiArIGRhdGEgKyAiXV0+Iik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBYTUwgSGVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlWE1MSGVhZGVyKCkgeworICAgICAgICBidWZmZXIuYXBwZW5kKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiID8+XG4iKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlbmQgZGF0YSBhbmQgcmVpbml0aWFsaXplcyBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VuZERhdGEoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShidWZmZXIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9BY2Nlc3NMb2dWYWx2ZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9BY2Nlc3NMb2dWYWx2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZmRkMjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0FjY2Vzc0xvZ1ZhbHZlLmphdmEKQEAgLTAsMCArMSwxMTMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlczsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIHRoZSA8Yj5WYWx2ZTwvYj4gaW50ZXJmYWNlIHRoYXQgZ2VuZXJhdGVzIGEgd2ViIHNlcnZlcgorICogYWNjZXNzIGxvZyB3aXRoIHRoZSBkZXRhaWxlZCBsaW5lIGNvbnRlbnRzIG1hdGNoaW5nIGEgY29uZmlndXJhYmxlIHBhdHRlcm4uCisgKiBUaGUgc3ludGF4IG9mIHRoZSBhdmFpbGFibGUgcGF0dGVybnMgaXMgc2ltaWxhciB0byB0aGF0IHN1cHBvcnRlZCBieSB0aGUKKyAqIEFwYWNoZSA8Y29kZT5tb2RfbG9nX2NvbmZpZzwvY29kZT4gbW9kdWxlLiAgQXMgYW4gYWRkaXRpb25hbCBmZWF0dXJlLAorICogYXV0b21hdGljIHJvbGxvdmVyIG9mIGxvZyBmaWxlcyB3aGVuIHRoZSBkYXRlIGNoYW5nZXMgaXMgYWxzbyBzdXBwb3J0ZWQuPC9wPgorICoKKyAqIDxwPlBhdHRlcm5zIGZvciB0aGUgbG9nZ2VkIG1lc3NhZ2UgbWF5IGluY2x1ZGUgY29uc3RhbnQgdGV4dCBvciBhbnkgb2YgdGhlCisgKiBmb2xsb3dpbmcgcmVwbGFjZW1lbnQgc3RyaW5ncywgZm9yIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIGluZm9ybWF0aW9uCisgKiBmcm9tIHRoZSBzcGVjaWZpZWQgUmVzcG9uc2UgaXMgc3Vic3RpdHV0ZWQ6PC9wPgorICogPHVsPgorICogPGxpPjxiPiVhPC9iPiAtIFJlbW90ZSBJUCBhZGRyZXNzCisgKiA8bGk+PGI+JUE8L2I+IC0gTG9jYWwgSVAgYWRkcmVzcworICogPGxpPjxiPiViPC9iPiAtIEJ5dGVzIHNlbnQsIGV4Y2x1ZGluZyBIVFRQIGhlYWRlcnMsIG9yICctJyBpZiBubyBieXRlcworICogICAgIHdlcmUgc2VudAorICogPGxpPjxiPiVCPC9iPiAtIEJ5dGVzIHNlbnQsIGV4Y2x1ZGluZyBIVFRQIGhlYWRlcnMKKyAqIDxsaT48Yj4laDwvYj4gLSBSZW1vdGUgaG9zdCBuYW1lCisgKiA8bGk+PGI+JUg8L2I+IC0gUmVxdWVzdCBwcm90b2NvbAorICogPGxpPjxiPiVsPC9iPiAtIFJlbW90ZSBsb2dpY2FsIHVzZXJuYW1lIGZyb20gaWRlbnRkIChhbHdheXMgcmV0dXJucyAnLScpCisgKiA8bGk+PGI+JW08L2I+IC0gUmVxdWVzdCBtZXRob2QKKyAqIDxsaT48Yj4lcDwvYj4gLSBMb2NhbCBwb3J0CisgKiA8bGk+PGI+JXE8L2I+IC0gUXVlcnkgc3RyaW5nIChwcmVwZW5kZWQgd2l0aCBhICc/JyBpZiBpdCBleGlzdHMsIG90aGVyd2lzZQorICogICAgIGFuIGVtcHR5IHN0cmluZworICogPGxpPjxiPiVyPC9iPiAtIEZpcnN0IGxpbmUgb2YgdGhlIHJlcXVlc3QKKyAqIDxsaT48Yj4lczwvYj4gLSBIVFRQIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZQorICogPGxpPjxiPiVTPC9iPiAtIFVzZXIgc2Vzc2lvbiBJRAorICogPGxpPjxiPiV0PC9iPiAtIERhdGUgYW5kIHRpbWUsIGluIENvbW1vbiBMb2cgRm9ybWF0IGZvcm1hdAorICogPGxpPjxiPiV1PC9iPiAtIFJlbW90ZSB1c2VyIHRoYXQgd2FzIGF1dGhlbnRpY2F0ZWQKKyAqIDxsaT48Yj4lVTwvYj4gLSBSZXF1ZXN0ZWQgVVJMIHBhdGgKKyAqIDxsaT48Yj4ldjwvYj4gLSBMb2NhbCBzZXJ2ZXIgbmFtZQorICogPGxpPjxiPiVEPC9iPiAtIFRpbWUgdGFrZW4gdG8gcHJvY2VzcyB0aGUgcmVxdWVzdCwgaW4gbWlsbGlzCisgKiA8bGk+PGI+JVQ8L2I+IC0gVGltZSB0YWtlbiB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LCBpbiBzZWNvbmRzCisgKiA8L3VsPgorICogPHA+SW4gYWRkaXRpb24sIHRoZSBjYWxsZXIgY2FuIHNwZWNpZnkgb25lIG9mIHRoZSBmb2xsb3dpbmcgYWxpYXNlcyBmb3IKKyAqIGNvbW1vbmx5IHV0aWxpemVkIHBhdHRlcm5zOjwvcD4KKyAqIDx1bD4KKyAqIDxsaT48Yj5jb21tb248L2I+IC0gPGNvZGU+JWggJWwgJXUgJXQgIiVyIiAlcyAlYjwvY29kZT4KKyAqIDxsaT48Yj5jb21iaW5lZDwvYj4gLQorICogICA8Y29kZT4laCAlbCAldSAldCAiJXIiICVzICViICIle1JlZmVyZXJ9aSIgIiV7VXNlci1BZ2VudH1pIjwvY29kZT4KKyAqIDwvdWw+CisgKgorICogPHA+CisgKiBUaGVyZSBpcyBhbHNvIHN1cHBvcnQgdG8gd3JpdGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgY29va2llLCBpbmNvbWluZworICogaGVhZGVyLCB0aGUgU2Vzc2lvbiBvciBzb21ldGhpbmcgZWxzZSBpbiB0aGUgU2VydmxldFJlcXVlc3QuPGJyPgorICogSXQgaXMgbW9kZWxlZCBhZnRlciB0aGUgYXBhY2hlIHN5bnRheDoKKyAqIDx1bD4KKyAqIDxsaT48Y29kZT4le3h4eH1pPC9jb2RlPiBmb3IgaW5jb21pbmcgaGVhZGVycworICogPGxpPjxjb2RlPiV7eHh4fWM8L2NvZGU+IGZvciBhIHNwZWNpZmljIGNvb2tpZQorICogPGxpPjxjb2RlPiV7eHh4fXI8L2NvZGU+IHh4eCBpcyBhbiBhdHRyaWJ1dGUgaW4gdGhlIFNlcnZsZXRSZXF1ZXN0CisgKiA8bGk+PGNvZGU+JXt4eHh9czwvY29kZT4geHh4IGlzIGFuIGF0dHJpYnV0ZSBpbiB0aGUgSHR0cFNlc3Npb24KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogPHA+CisgKiBDb25kaXRpb25hbCBsb2dnaW5nIGlzIGFsc28gc3VwcG9ydGVkLiBUaGlzIGNhbiBiZSBkb25lIHdpdGggdGhlCisgKiA8Y29kZT5jb25kaXRpb248L2NvZGU+IHByb3BlcnR5LgorICogSWYgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gU2VydmxldFJlcXVlc3QuZ2V0QXR0cmlidXRlKGNvbmRpdGlvbikKKyAqIHlpZWxkcyBhIG5vbi1udWxsIHZhbHVlLiBUaGUgbG9nZ2luZyB3aWxsIGJlIHNraXBwZWQuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIEphc29uIEJyaXR0YWluCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBBY2Nlc3NMb2dWYWx2ZQorICAgIGV4dGVuZHMgVmFsdmVCYXNlCisgICAgaW1wbGVtZW50cyBMaWZlY3ljbGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBkZWZhdWx0IHByb3BlcnR5IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXNzTG9nVmFsdmUoKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgc2V0UGF0dGVybigiY29tbW9uIik7CisKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBhcy1vZiBkYXRlIGZvciB0aGUgY3VycmVudGx5IG9wZW4gbG9nIGZpbGUsIG9yIGEgemVyby1sZW5ndGgKKyAgICAgKiBzdHJpbmcgaWYgdGhlcmUgaXMgbm8gb3BlbiBsb2cgZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkYXRlU3RhbXAgPSAiIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGRpcmVjdG9yeSBpbiB3aGljaCBsb2cgZmlsZXMgYXJlIGNyZWF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGlyZWN0b3J5ID0gImxvZ3MiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkFjY2Vzc0xvZ1ZhbHZlLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaWZlY3ljbGUgZXZlbnQgc3VwcG9ydCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIExpZmVjeWNsZVN1cHBvcnQgbGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZVN1cHBvcnQodGhpcyk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbW9udGggYWJicmV2aWF0aW9ucyBmb3IgbG9nIG1lc3NhZ2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIG1vbnRoc1tdID0KKyAgICB7ICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisgICAgICAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiIH07CisKKworICAgIC8qKgorICAgICAqIElmIHRoZSBjdXJyZW50IGxvZyBwYXR0ZXJuIGlzIHRoZSBzYW1lIGFzIHRoZSBjb21tb24gYWNjZXNzIGxvZworICAgICAqIGZvcm1hdCBwYXR0ZXJuLCB0aGVuIHdlJ2xsIHNldCB0aGlzIHZhcmlhYmxlIHRvIHRydWUgYW5kIGxvZyBpbgorICAgICAqIGEgbW9yZSBvcHRpbWFsIGFuZCBoYXJkLWNvZGVkIHdheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY29tbW9uID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEZvciB0aGUgY29tYmluZWQgZm9ybWF0IChjb21tb24sIHBsdXMgdXNlcmFnZW50IGFuZCByZWZlcmVyKSwgd2UgZG8KKyAgICAgKiB0aGUgc2FtZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjb21iaW5lZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0dGVybiB1c2VkIHRvIGZvcm1hdCBvdXIgYWNjZXNzIGxvZyBsaW5lcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXR0ZXJuID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHByZWZpeCB0aGF0IGlzIGFkZGVkIHRvIGxvZyBmaWxlIGZpbGVuYW1lcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcmVmaXggPSAiYWNjZXNzX2xvZy4iOworCisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgd2Ugcm90YXRlIG91ciBsb2cgZmlsZT8gRGVmYXVsdCBpcyB0cnVlIChsaWtlIG9sZCBiZWhhdmlvcikKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcm90YXRhYmxlID0gdHJ1ZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZCB5ZXQ/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN1ZmZpeCB0aGF0IGlzIGFkZGVkIHRvIGxvZyBmaWxlIGZpbGVuYW1lcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzdWZmaXggPSAiIjsKKworCisgICAgLyoqCisgICAgICogVGhlIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBjdXJyZW50bHkgbG9nZ2luZywgaWYgYW55LgorICAgICAqLworICAgIHByaXZhdGUgUHJpbnRXcml0ZXIgd3JpdGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQSBkYXRlIGZvcm1hdHRlciB0byBmb3JtYXQgYSBEYXRlIGludG8gYSBkYXRlIGluIHRoZSBmb3JtYXQKKyAgICAgKiAieXl5eS1NTS1kZCIuCisgICAgICovCisgICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXR0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBIGRhdGUgZm9ybWF0dGVyIHRvIGZvcm1hdCBEYXRlcyBpbnRvIGEgZGF5IHN0cmluZyBpbiB0aGUgZm9ybWF0CisgICAgICogImRkIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNpbXBsZURhdGVGb3JtYXQgZGF5Rm9ybWF0dGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQSBkYXRlIGZvcm1hdHRlciB0byBmb3JtYXQgYSBEYXRlIGludG8gYSBtb250aCBzdHJpbmcgaW4gdGhlIGZvcm1hdAorICAgICAqICJNTSIuCisgICAgICovCisgICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IG1vbnRoRm9ybWF0dGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGltZSB0YWtlbiBmb3JtYXR0ZXIgZm9yIDMgZGVjaW1hbCBwbGFjZXMuCisgICAgICovCisgICAgIHByaXZhdGUgRGVjaW1hbEZvcm1hdCB0aW1lVGFrZW5Gb3JtYXR0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBIGRhdGUgZm9ybWF0dGVyIHRvIGZvcm1hdCBhIERhdGUgaW50byBhIHllYXIgc3RyaW5nIGluIHRoZSBmb3JtYXQKKyAgICAgKiAieXl5eSIuCisgICAgICovCisgICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IHllYXJGb3JtYXR0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBIGRhdGUgZm9ybWF0dGVyIHRvIGZvcm1hdCBhIERhdGUgaW50byBhIHRpbWUgaW4gdGhlIGZvcm1hdAorICAgICAqICJrazptbTpzcyIgKGtrIGlzIGEgMjQtaG91ciByZXByZXNlbnRhdGlvbiBvZiB0aGUgaG91cikuCisgICAgICovCisgICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IHRpbWVGb3JtYXR0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3lzdGVtIHRpbWV6b25lLgorICAgICAqLworICAgIHByaXZhdGUgVGltZVpvbmUgdGltZXpvbmUgPSBudWxsOworCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgem9uZSBvZmZzZXQgcmVsYXRpdmUgdG8gR01UIGluIHRleHQgZm9ybSB3aGVuIGRheWxpZ2h0IHNhdmluZworICAgICAqIGlzIG5vdCBpbiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdGltZVpvbmVOb0RTVCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIHpvbmUgb2Zmc2V0IHJlbGF0aXZlIHRvIEdNVCBpbiB0ZXh0IGZvcm0gd2hlbiBkYXlsaWdodCBzYXZpbmcKKyAgICAgKiBpcyBpbiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdGltZVpvbmVEU1QgPSBudWxsOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBzeXN0ZW0gdGltZSB3aGVuIHdlIGxhc3QgdXBkYXRlZCB0aGUgRGF0ZSB0aGF0IHRoaXMgdmFsdmUKKyAgICAgKiB1c2VzIGZvciBsb2cgbGluZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBEYXRlIGN1cnJlbnREYXRlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogV2hlbiBmb3JtYXR0aW5nIGxvZyBsaW5lcywgd2Ugb2Z0ZW4gdXNlIHN0cmluZ3MgbGlrZSB0aGlzIG9uZSAoIiAiKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzcGFjZSA9ICIgIjsKKworCisgICAgLyoqCisgICAgICogUmVzb2x2ZSBob3N0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZUhvc3RzID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEluc3RhbnQgd2hlbiB0aGUgbG9nIGRhaWx5IHJvdGF0aW9uIHdhcyBsYXN0IGNoZWNrZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHJvdGF0aW9uTGFzdENoZWNrZWQgPSAwTDsKKworCisgICAgLyoqCisgICAgICogQXJlIHdlIGRvaW5nIGNvbmRpdGlvbmFsIGxvZ2dpbmcuIGRlZmF1bHQgZmFsc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29uZGl0aW9uID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRGF0ZSBmb3JtYXQgdG8gcGxhY2UgaW4gbG9nIGZpbGUgbmFtZS4gVXNlIGF0IHlvdXIgb3duIHJpc2shCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZURhdGVGb3JtYXQgPSBudWxsOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHdlIGNyZWF0ZSBsb2cgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaXJlY3RvcnkoKSB7CisKKyAgICAgICAgcmV0dXJuIChkaXJlY3RvcnkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB3ZSBjcmVhdGUgbG9nIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGRpcmVjdG9yeSBUaGUgbmV3IGxvZyBmaWxlIGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeShTdHJpbmcgZGlyZWN0b3J5KSB7CisKKyAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3Rvcnk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZvcm1hdCBwYXR0ZXJuLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucGF0dGVybik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZm9ybWF0IHBhdHRlcm4sIGZpcnN0IHRyYW5zbGF0aW5nIGFueSByZWNvZ25pemVkIGFsaWFzLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIG5ldyBwYXR0ZXJuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgcGF0dGVybikgeworCisgICAgICAgIGlmIChwYXR0ZXJuID09IG51bGwpCisgICAgICAgICAgICBwYXR0ZXJuID0gIiI7CisgICAgICAgIGlmIChwYXR0ZXJuLmVxdWFscyhDb25zdGFudHMuQWNjZXNzTG9nLkNPTU1PTl9BTElBUykpCisgICAgICAgICAgICBwYXR0ZXJuID0gQ29uc3RhbnRzLkFjY2Vzc0xvZy5DT01NT05fUEFUVEVSTjsKKyAgICAgICAgaWYgKHBhdHRlcm4uZXF1YWxzKENvbnN0YW50cy5BY2Nlc3NMb2cuQ09NQklORURfQUxJQVMpKQorICAgICAgICAgICAgcGF0dGVybiA9IENvbnN0YW50cy5BY2Nlc3NMb2cuQ09NQklORURfUEFUVEVSTjsKKyAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKKworICAgICAgICBpZiAodGhpcy5wYXR0ZXJuLmVxdWFscyhDb25zdGFudHMuQWNjZXNzTG9nLkNPTU1PTl9QQVRURVJOKSkKKyAgICAgICAgICAgIGNvbW1vbiA9IHRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbW1vbiA9IGZhbHNlOworCisgICAgICAgIGlmICh0aGlzLnBhdHRlcm4uZXF1YWxzKENvbnN0YW50cy5BY2Nlc3NMb2cuQ09NQklORURfUEFUVEVSTikpCisgICAgICAgICAgICBjb21iaW5lZCA9IHRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbWJpbmVkID0gZmFsc2U7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9nIGZpbGUgcHJlZml4LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgeworCisgICAgICAgIHJldHVybiAocHJlZml4KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2cgZmlsZSBwcmVmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFRoZSBuZXcgbG9nIGZpbGUgcHJlZml4CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHsKKworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIHJvdGF0ZSB0aGUgbG9ncworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUm90YXRhYmxlKCkgeworCisgICAgICAgIHJldHVybiByb3RhdGFibGU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgaXMgd2Ugc2hvdWxkIHdlIHJvdGF0ZSB0aGUgbG9ncworICAgICAqCisgICAgICogQHBhcmFtIHJvdGF0YWJsZSB0cnVlIGlzIHdlIHNob3VsZCByb3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um90YXRhYmxlKGJvb2xlYW4gcm90YXRhYmxlKSB7CisKKyAgICAgICAgdGhpcy5yb3RhdGFibGUgPSByb3RhdGFibGU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9nIGZpbGUgc3VmZml4LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VmZml4KCkgeworCisgICAgICAgIHJldHVybiAoc3VmZml4KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2cgZmlsZSBzdWZmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3VmZml4IFRoZSBuZXcgbG9nIGZpbGUgc3VmZml4CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3VmZml4KFN0cmluZyBzdWZmaXgpIHsKKworICAgICAgICB0aGlzLnN1ZmZpeCA9IHN1ZmZpeDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXNvbHZlIGhvc3RzIGZsYWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb2x2ZUhvc3RzIFRoZSBuZXcgcmVzb2x2ZSBob3N0cyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmVIb3N0cyhib29sZWFuIHJlc29sdmVIb3N0cykgeworCisgICAgICAgIHRoaXMucmVzb2x2ZUhvc3RzID0gcmVzb2x2ZUhvc3RzOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSByZXNvbHZlIGhvc3RzIGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlSG9zdHMoKSB7CisKKyAgICAgICAgcmV0dXJuIHJlc29sdmVIb3N0czsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGxvb2sgZm9yIHdoZW4KKyAgICAgKiBwZXJmb3JtaW5nIGNvbmRpdGlvbmFsIGxvZ2dnaW5nLiBJZiBudWxsLCBldmVyeQorICAgICAqIHJlcXVlc3QgaXMgbG9nZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZGl0aW9uKCkgeworCisgICAgICAgIHJldHVybiBjb25kaXRpb247CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgU2VydmxldFJlcXVlc3QuYXR0cmlidXRlIHRvIGxvb2sgZm9yIHRvIHBlcmZvcm0KKyAgICAgKiBjb25kaXRpb25hbCBsb2dnaW5nLiBTZXQgdG8gbnVsbCB0byBsb2cgZXZlcnl0aGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25kaXRpb24gU2V0IHRvIG51bGwgdG8gbG9nIGV2ZXJ5dGhpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25kaXRpb24oU3RyaW5nIGNvbmRpdGlvbikgeworCisgICAgICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOworCisgICAgfQorCisgICAgLyoqCisgICAgICogIFJldHVybiB0aGUgZGF0ZSBmb3JtYXQgZGF0ZSBiYXNlZCBsb2cgcm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlRGF0ZUZvcm1hdCgpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVEYXRlRm9ybWF0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogIFNldCB0aGUgZGF0ZSBmb3JtYXQgZGF0ZSBiYXNlZCBsb2cgcm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZURhdGVGb3JtYXQoU3RyaW5nIGZpbGVEYXRlRm9ybWF0KSB7CisgICAgICAgIHRoaXMuZmlsZURhdGVGb3JtYXQgPSAgZmlsZURhdGVGb3JtYXQ7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIExvZyBhIG1lc3NhZ2Ugc3VtbWFyaXppbmcgdGhlIHNwZWNpZmllZCByZXF1ZXN0IGFuZCByZXNwb25zZSwgYWNjb3JkaW5nCisgICAgICogdG8gdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnBhdHRlcm48L2NvZGU+IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2UgYmVpbmcgcHJvY2Vzc2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBoYXMgb2NjdXJyZWQKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFBhc3MgdGhpcyByZXF1ZXN0IG9uIHRvIHRoZSBuZXh0IHZhbHZlIGluIG91ciBwaXBlbGluZQorICAgICAgICBsb25nIHQxPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIGdldE5leHQoKS5pbnZva2UocmVxdWVzdCwgcmVzcG9uc2UpOworCisgICAgICAgIGxvbmcgdDI9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGxvbmcgdGltZT10Mi10MTsKKworICAgICAgICBpZiAoY29uZGl0aW9uIT1udWxsICYmCisgICAgICAgICAgICAgICAgbnVsbCE9cmVxdWVzdC5nZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlKGNvbmRpdGlvbikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisKKyAgICAgICAgRGF0ZSBkYXRlID0gZ2V0RGF0ZSgpOworICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBzaG91bGQgbG9nIHVzaW5nIHRoZSAiY29tbW9uIiBhY2Nlc3MgbG9nIHBhdHRlcm4KKyAgICAgICAgaWYgKGNvbW1vbiB8fCBjb21iaW5lZCkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKGlzUmVzb2x2ZUhvc3RzKCkpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChyZXF1ZXN0LmdldFJlbW90ZUhvc3QoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChyZXF1ZXN0LmdldFJlbW90ZUFkZHIoKSk7CisKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAtICIpOworCisgICAgICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0UmVtb3RlVXNlcigpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLSAiKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodmFsdWUpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3BhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJbIik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGRheUZvcm1hdHRlci5mb3JtYXQoZGF0ZSkpOyAgICAgICAgICAgLy8gRGF5CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcvJyk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxvb2t1cChtb250aEZvcm1hdHRlci5mb3JtYXQoZGF0ZSkpKTsgLy8gTW9udGgKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJy8nKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoeWVhckZvcm1hdHRlci5mb3JtYXQoZGF0ZSkpOyAgICAgICAgICAvLyBZZWFyCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCc6Jyk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRpbWVGb3JtYXR0ZXIuZm9ybWF0KGRhdGUpKTsgICAgICAgICAgLy8gVGltZQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzcGFjZSk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGdldFRpbWVab25lKGRhdGUpKTsgICAgICAgICAgICAgICAgICAgLy8gVGltZSBab25lCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJdIFwiIik7CisKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocmVxdWVzdC5nZXRNZXRob2QoKSk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHNwYWNlKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnPycpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocmVxdWVzdC5nZXRRdWVyeVN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3BhY2UpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChyZXF1ZXN0LmdldFByb3RvY29sKCkpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXCIgIik7CisKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHNwYWNlKTsKKworICAgICAgICAgICAgaW50IGxlbmd0aCA9IHJlc3BvbnNlLmdldENvbnRlbnRDb3VudCgpOworCisgICAgICAgICAgICBpZiAobGVuZ3RoIDw9IDApCisgICAgICAgICAgICAgICAgdmFsdWUgPSAiLSI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmFsdWUgPSAiIiArIGxlbmd0aDsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodmFsdWUpOworCisgICAgICAgICAgICBpZiAoY29tYmluZWQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHNwYWNlKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcIiIpOworICAgICAgICAgICAgICAgIFN0cmluZyByZWZlcmVyID0gcmVxdWVzdC5nZXRIZWFkZXIoInJlZmVyZXIiKTsKKyAgICAgICAgICAgICAgICBpZihyZWZlcmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocmVmZXJlcik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItIik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXCIiKTsKKworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3BhY2UpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlwiIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHVhID0gcmVxdWVzdC5nZXRIZWFkZXIoInVzZXItYWdlbnQiKTsKKyAgICAgICAgICAgICAgICBpZih1YSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHVhKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcIiIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBHZW5lcmF0ZSBhIG1lc3NhZ2UgYmFzZWQgb24gdGhlIGRlZmluZWQgcGF0dGVybgorICAgICAgICAgICAgYm9vbGVhbiByZXBsYWNlID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm4ubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBwYXR0ZXJuLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgeworICAgICAgICAgICAgICAgICAgICAvKiBGb3IgY29kZSB0aGF0IHByb2Nlc3NlcyB7LCB0aGUgYmVoYXZpb3Igd2lsbCBiZSAuLi4gaWYgSQorICAgICAgICAgICAgICAgICAgICAgKiBkbyBub3QgZW5vdW50ZXIgYSBjbG9zaW5nIH0gLSB0aGVuIEkgaWdub3JlIHRoZSB7CisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoJ3snID09IGNoKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBuYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGogPSBpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcig7aiA8IHBhdHRlcm4ubGVuZ3RoKCkgJiYgJ30nICE9IHBhdHRlcm4uY2hhckF0KGopOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmFwcGVuZChwYXR0ZXJuLmNoYXJBdChqKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaisxIDwgcGF0dGVybi5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSArMSB3YXMgdG8gYWNjb3VudCBmb3IgfSB3aGljaCB3ZSBpbmNyZW1lbnQgbm93ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocmVwbGFjZShuYW1lLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLmNoYXJBdChqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk9ajsgLypTaW5jZSB3ZSB3YWxrZWQgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIqLworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0Qnb2ggLSBlbmQgb2Ygc3RyaW5nIC0gcHJldGVuZCB3ZSBuZXZlciBkaWQgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYW5kIGRvIHByb2Nlc3NpbmcgdGhlICJvbGQgd2F5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocmVwbGFjZShjaCwgZGF0ZSwgcmVxdWVzdCwgcmVzcG9uc2UsIHRpbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocmVwbGFjZShjaCwgZGF0ZSwgcmVxdWVzdCwgcmVzcG9uc2UsdGltZSApKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXBsYWNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnJScpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbGFjZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvZyhyZXN1bHQudG9TdHJpbmcoKSwgZGF0ZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgY3VycmVudGx5IG9wZW4gbG9nIGZpbGUgKGlmIGFueSkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgeworCisgICAgICAgIGlmICh3cml0ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICB3cml0ZXIgPSBudWxsOworICAgICAgICBkYXRlU3RhbXAgPSAiIjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSB0byB0aGUgbG9nIGZpbGUsIHN3aXRjaGluZyBmaWxlcyBpZiB0aGUgZGF0ZQorICAgICAqIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBsb2cgY2FsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UgdG8gYmUgbG9nZ2VkCisgICAgICogQHBhcmFtIGRhdGUgdGhlIGN1cnJlbnQgRGF0ZSBvYmplY3QgKHNvIHRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCB0bworICAgICAqICAgICAgICBjcmVhdGUgYSBuZXcgb25lKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgRGF0ZSBkYXRlKSB7CisKKyAgICAgICAgaWYgKHJvdGF0YWJsZSl7CisgICAgICAgICAgICAvLyBPbmx5IGRvIGEgbG9nZmlsZSBzd2l0Y2ggY2hlY2sgb25jZSBhIHNlY29uZCwgbWF4LgorICAgICAgICAgICAgbG9uZyBzeXN0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpZiAoKHN5c3RpbWUgLSByb3RhdGlvbkxhc3RDaGVja2VkKSA+IDEwMDApIHsKKworICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgYSBuZXcgY3VycmVudERhdGUKKyAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKHN5c3RpbWUpOworICAgICAgICAgICAgICAgIHJvdGF0aW9uTGFzdENoZWNrZWQgPSBzeXN0aW1lOworCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgY2hhbmdlIG9mIGRhdGUKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHNEYXRlID0gZGF0ZUZvcm1hdHRlci5mb3JtYXQoY3VycmVudERhdGUpOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGRhdGUgaGFzIGNoYW5nZWQsIHN3aXRjaCBsb2cgZmlsZXMKKyAgICAgICAgICAgICAgICBpZiAoIWRhdGVTdGFtcC5lcXVhbHModHNEYXRlKSkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0ZVN0YW1wLmVxdWFscyh0c0RhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlU3RhbXAgPSB0c0RhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2cgdGhpcyBtZXNzYWdlCisgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtb250aCBhYmJyZXZpYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgbW9udGgsIHdoaWNoIG11c3QKKyAgICAgKiBiZSBhIHR3by1kaWdpdCBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9udGggTW9udGggbnVtYmVyICgiMDEiIC4uICIxMiIpLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGxvb2t1cChTdHJpbmcgbW9udGgpIHsKKworICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbmRleCA9IEludGVnZXIucGFyc2VJbnQobW9udGgpIC0gMTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGluZGV4ID0gMDsgIC8vIENhbiBub3QgaGFwcGVuLCBpbiB0aGVvcnkKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG1vbnRoc1tpbmRleF0pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSBuZXcgbG9nIGZpbGUgZm9yIHRoZSBkYXRlIHNwZWNpZmllZCBieSA8Y29kZT5kYXRlU3RhbXA8L2NvZGU+LgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgb3BlbigpIHsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGRpcmVjdG9yeSBpZiBuZWNlc3NhcnkKKyAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShkaXJlY3RvcnkpOworICAgICAgICBpZiAoIWRpci5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICBkaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwgZGlyZWN0b3J5KTsKKyAgICAgICAgZGlyLm1rZGlycygpOworCisgICAgICAgIC8vIE9wZW4gdGhlIGN1cnJlbnQgbG9nIGZpbGUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRobmFtZTsKKyAgICAgICAgICAgIC8vIElmIG5vIHJvdGF0ZSAtIG5vIG5lZWQgZm9yIGRhdGVTdGFtcCBpbiBmaWxlTmFtZQorICAgICAgICAgICAgaWYgKHJvdGF0YWJsZSl7CisgICAgICAgICAgICAgICAgcGF0aG5hbWUgPSBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgZGF0ZVN0YW1wICsgc3VmZml4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXRobmFtZSA9IGRpci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyBzdWZmaXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIocGF0aG5hbWUsIHRydWUpLCB0cnVlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlcGxhY2VtZW50IHRleHQgZm9yIHRoZSBzcGVjaWZpZWQgcGF0dGVybiBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBQYXR0ZXJuIGNoYXJhY3RlciBpZGVudGlmeWluZyB0aGUgZGVzaXJlZCB0ZXh0CisgICAgICogQHBhcmFtIGRhdGUgdGhlIGN1cnJlbnQgRGF0ZSBzbyB0aGF0IHRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCB0bworICAgICAqICAgICAgICBjcmVhdGUgb25lCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2UgYmVpbmcgcHJvY2Vzc2VkCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZShjaGFyIHBhdHRlcm4sIERhdGUgZGF0ZSwgUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UsIGxvbmcgdGltZSkgeworCisgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisKKyAgICAgICAgaWYgKHBhdHRlcm4gPT0gJ2EnKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0UmVtb3RlQWRkcigpOworICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT0gJ0EnKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdEFkZHJlc3MoKTsKKyAgICAgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIGUpeworICAgICAgICAgICAgICAgIHZhbHVlID0gIjEyNy4wLjAuMSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PSAnYicpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSByZXNwb25zZS5nZXRDb250ZW50Q291bnQoKTsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPD0gMCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICItIjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiICsgbGVuZ3RoOworICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT0gJ0InKSB7CisgICAgICAgICAgICB2YWx1ZSA9ICIiICsgcmVzcG9uc2UuZ2V0Q29udGVudExlbmd0aCgpOworICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT0gJ2gnKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpOworICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT0gJ0gnKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0UHJvdG9jb2woKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09ICdsJykgeworICAgICAgICAgICAgdmFsdWUgPSAiLSI7CisgICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PSAnbScpIHsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldE1ldGhvZCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbHVlID0gIiI7CisgICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PSAncCcpIHsKKyAgICAgICAgICAgIHZhbHVlID0gIiIgKyByZXF1ZXN0LmdldFNlcnZlclBvcnQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09ICdEJykgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiICsgdGltZTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09ICdxJykgeworICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcXVlcnkgPSByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCk7CisgICAgICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICI/IiArIHF1ZXJ5OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbHVlID0gIiI7CisgICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PSAncicpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocmVxdWVzdC5nZXRNZXRob2QoKSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHNwYWNlKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJz8nKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzcGFjZSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHJlcXVlc3QuZ2V0UHJvdG9jb2woKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLSAtICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChyZXF1ZXN0LmdldFByb3RvY29sKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWUgPSBzYi50b1N0cmluZygpOworICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT0gJ1MnKSB7CisgICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwoZmFsc2UpLmdldElkSW50ZXJuYWwoKTsKKyAgICAgICAgICAgICAgICBlbHNlIHZhbHVlID0gIi0iOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbHVlID0gIi0iOworICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT0gJ3MnKSB7CisgICAgICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmFsdWUgPSAiLSI7CisgICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PSAndCcpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciB0ZW1wID0gbmV3IFN0cmluZ0J1ZmZlcigiWyIpOworICAgICAgICAgICAgdGVtcC5hcHBlbmQoZGF5Rm9ybWF0dGVyLmZvcm1hdChkYXRlKSk7ICAgICAgICAgICAgIC8vIERheQorICAgICAgICAgICAgdGVtcC5hcHBlbmQoJy8nKTsKKyAgICAgICAgICAgIHRlbXAuYXBwZW5kKGxvb2t1cChtb250aEZvcm1hdHRlci5mb3JtYXQoZGF0ZSkpKTsgICAvLyBNb250aAorICAgICAgICAgICAgdGVtcC5hcHBlbmQoJy8nKTsKKyAgICAgICAgICAgIHRlbXAuYXBwZW5kKHllYXJGb3JtYXR0ZXIuZm9ybWF0KGRhdGUpKTsgICAgICAgICAgICAvLyBZZWFyCisgICAgICAgICAgICB0ZW1wLmFwcGVuZCgnOicpOworICAgICAgICAgICAgdGVtcC5hcHBlbmQodGltZUZvcm1hdHRlci5mb3JtYXQoZGF0ZSkpOyAgICAgICAgICAgIC8vIFRpbWUKKyAgICAgICAgICAgIHRlbXAuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICB0ZW1wLmFwcGVuZChnZXRUaW1lWm9uZShkYXRlKSk7ICAgICAgICAgICAgICAgICAgICAgLy8gVGltZXpvbmUKKyAgICAgICAgICAgIHRlbXAuYXBwZW5kKCddJyk7CisgICAgICAgICAgICB2YWx1ZSA9IHRlbXAudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09ICdUJykgeworICAgICAgICAgICAgdmFsdWUgPSB0aW1lVGFrZW5Gb3JtYXR0ZXIuZm9ybWF0KHRpbWUvMTAwMGQpOworICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT0gJ3UnKSB7CisgICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRSZW1vdGVVc2VyKCk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICItIjsKKyAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09ICdVJykgeworICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbHVlID0gIi0iOworICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT0gJ3YnKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWUgPSAiPz8/IiArIHBhdHRlcm4gKyAiPz8/IjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuICgiIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAodmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlcGxhY2VtZW50IHRleHQgZm9yIHRoZSBzcGVjaWZpZWQgImhlYWRlci9wYXJhbWV0ZXIiLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlciBUaGUgaGVhZGVyL3BhcmFtZXRlciB0byBnZXQKKyAgICAgKiBAcGFyYW0gdHlwZSBXaGVyZSB0byBnZXQgaXQgZnJvbSBpPWlucHV0LGM9Y29va2llLHI9U2VydmxldFJlcXVlc3Qscz1TZXNzaW9uCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2UgYmVpbmcgcHJvY2Vzc2VkCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZShTdHJpbmcgaGVhZGVyLCBjaGFyIHR5cGUsIFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlKSB7CisKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHJlcXVlc3QpCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRIZWFkZXIoaGVhZGVyKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSAiPz8iOworICAgICAgICAgICAgICAgIGJyZWFrOworLyoKKyAgICAgICAgICAgIC8vIFNvbWVvbmUgcGxlYXNlIG1ha2UgbWUgd29yaworICAgICAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisqLworICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICAgICAgIENvb2tpZVtdIGMgPSByZXF1ZXN0LmdldENvb2tpZXMoKTsKKyAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBjICE9IG51bGwgJiYgaSA8IGMubGVuZ3RoOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoY1tpXS5nZXROYW1lKCkpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNbaV0uZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gcmVxdWVzdCkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZShoZWFkZXIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9ICI/PyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSByZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIEh0dHBTZXNzaW9uIHNlc3MgPSByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBzZXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZXNzLmdldEF0dHJpYnV0ZShoZWFkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICI/Pz8iOworICAgICAgICB9CisKKyAgICAgICAgLyogdHJ5IGNhdGNoIGluIGNhc2UgdG9TdHJpbmcoKSBiYXJmcyAqLworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHZhbHVlIT1udWxsKQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpdmFsdWU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHJldHVybiAiLSI7CisgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIHJldHVybiAiLSI7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBEYXRlIG9iamVjdCB0aGF0IGlzIGFjY3VyYXRlIHRvIHdpdGhpbiBvbmUKKyAgICAgKiBzZWNvbmQuICBJZiBhIHRocmVhZCBjYWxscyB0aGlzIG1ldGhvZCB0byBnZXQgYSBEYXRlIGFuZCBpdCdzIGJlZW4KKyAgICAgKiBsZXNzIHRoYW4gMSBzZWNvbmQgc2luY2UgYSBuZXcgRGF0ZSB3YXMgY3JlYXRlZCwgdGhpcyBtZXRob2QKKyAgICAgKiBzaW1wbHkgZ2l2ZXMgb3V0IHRoZSBzYW1lIERhdGUgYWdhaW4gc28gdGhhdCB0aGUgc3lzdGVtIGRvZXNuJ3QKKyAgICAgKiBzcGVuZCB0aW1lIGNyZWF0aW5nIERhdGUgb2JqZWN0cyB1bm5lY2Vzc2FyaWx5LgorICAgICAqCisgICAgICogQHJldHVybiBEYXRlCisgICAgICovCisgICAgcHJpdmF0ZSBEYXRlIGdldERhdGUoKSB7CisgICAgICAgIGlmKGN1cnJlbnREYXRlID09IG51bGwpIHsKKyAgICAgICAgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIE9ubHkgY3JlYXRlIGEgbmV3IERhdGUgb25jZSBwZXIgc2Vjb25kLCBtYXguCisgICAgICAgICAgbG9uZyBzeXN0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgaWYgKChzeXN0aW1lIC0gY3VycmVudERhdGUuZ2V0VGltZSgpKSA+IDEwMDApIHsKKyAgICAgICAgICAgICAgY3VycmVudERhdGUgPSBuZXcgRGF0ZShzeXN0aW1lKTsKKyAgICAgICAgICB9CisgICAgfQorCisgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZTsKKyAgICB9CisKKworICAgIHByaXZhdGUgU3RyaW5nIGdldFRpbWVab25lKERhdGUgZGF0ZSkgeworICAgICAgICBpZiAodGltZXpvbmUuaW5EYXlsaWdodFRpbWUoZGF0ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0aW1lWm9uZURTVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0aW1lWm9uZU5vRFNUOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIHByaXZhdGUgU3RyaW5nIGNhbGN1bGF0ZVRpbWVab25lT2Zmc2V0KGxvbmcgb2Zmc2V0KSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciB0eiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKChvZmZzZXQ8MCkpICB7CisgICAgICAgICAgICB0ei5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ei5hcHBlbmQoIisiKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgaG91ck9mZnNldCA9IG9mZnNldC8oMTAwMCo2MCo2MCk7CisgICAgICAgIGxvbmcgbWludXRlT2Zmc2V0ID0gKG9mZnNldC8oMTAwMCo2MCkpICUgNjA7CisKKyAgICAgICAgaWYgKGhvdXJPZmZzZXQ8MTApCisgICAgICAgICAgICB0ei5hcHBlbmQoIjAiKTsKKyAgICAgICAgdHouYXBwZW5kKGhvdXJPZmZzZXQpOworCisgICAgICAgIGlmIChtaW51dGVPZmZzZXQ8MTApCisgICAgICAgICAgICB0ei5hcHBlbmQoIjAiKTsKKyAgICAgICAgdHouYXBwZW5kKG1pbnV0ZU9mZnNldCk7CisKKyAgICAgICAgcmV0dXJuIHR6LnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlmZWN5Y2xlIGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaWZlY3ljbGUuIElmIHRoaXMKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgPGNvZGU+Y29uZmlndXJlKCk8L2NvZGU+LAorICAgICAqIGFuZCBiZWZvcmUgYW55IG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgY29tcG9uZW50IGFyZSB1dGlsaXplZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IHByZXZlbnRzIHRoaXMgY29tcG9uZW50IGZyb20gYmVpbmcgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiYWNjZXNzTG9nVmFsdmUuYWxyZWFkeVN0YXJ0ZWQiKSk7CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSB0aW1lWm9uZSwgRGF0ZSBmb3JtYXR0ZXJzLCBhbmQgY3VycmVudERhdGUKKyAgICAgICAgdGltZXpvbmUgPSBUaW1lWm9uZS5nZXREZWZhdWx0KCk7CisgICAgICAgIHRpbWVab25lTm9EU1QgPSBjYWxjdWxhdGVUaW1lWm9uZU9mZnNldCh0aW1lem9uZS5nZXRSYXdPZmZzZXQoKSk7CisgICAgICAgIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UodGltZXpvbmUpOworICAgICAgICBpbnQgb2Zmc2V0ID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRTVF9PRkZTRVQpOworICAgICAgICB0aW1lWm9uZURTVCA9IGNhbGN1bGF0ZVRpbWVab25lT2Zmc2V0KHRpbWV6b25lLmdldFJhd09mZnNldCgpK29mZnNldCk7CisgICAgICAgIAorICAgICAgICBpZiAoZmlsZURhdGVGb3JtYXQ9PW51bGwgfHwgZmlsZURhdGVGb3JtYXQubGVuZ3RoKCk9PTApCisgICAgICAgICAgICBmaWxlRGF0ZUZvcm1hdCA9ICJ5eXl5LU1NLWRkIjsKKyAgICAgICAgZGF0ZUZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KGZpbGVEYXRlRm9ybWF0KTsKKyAgICAgICAgZGF0ZUZvcm1hdHRlci5zZXRUaW1lWm9uZSh0aW1lem9uZSk7CisgICAgICAgIGRheUZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJkZCIpOworICAgICAgICBkYXlGb3JtYXR0ZXIuc2V0VGltZVpvbmUodGltZXpvbmUpOworICAgICAgICBtb250aEZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJNTSIpOworICAgICAgICBtb250aEZvcm1hdHRlci5zZXRUaW1lWm9uZSh0aW1lem9uZSk7CisgICAgICAgIHllYXJGb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eSIpOworICAgICAgICB5ZWFyRm9ybWF0dGVyLnNldFRpbWVab25lKHRpbWV6b25lKTsKKyAgICAgICAgdGltZUZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJISDptbTpzcyIpOworICAgICAgICB0aW1lRm9ybWF0dGVyLnNldFRpbWVab25lKHRpbWV6b25lKTsKKyAgICAgICAgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpOworICAgICAgICBkYXRlU3RhbXAgPSBkYXRlRm9ybWF0dGVyLmZvcm1hdChjdXJyZW50RGF0ZSk7CisgICAgICAgIHRpbWVUYWtlbkZvcm1hdHRlciA9IG5ldyBEZWNpbWFsRm9ybWF0KCIwLjAwMCIpOworCisgICAgICAgIG9wZW4oKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSB0ZXJtaW5hdGUgdGhlIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdGhlIGxhc3Qgb25lIGNhbGxlZCBvbiBhIGdpdmVuCisgICAgICogaW5zdGFuY2Ugb2YgdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBuZWVkcyB0byBiZSByZXBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAoIXN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiYWNjZXNzTG9nVmFsdmUubm90U3RhcnRlZCIpKTsKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVE9QX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworCisgICAgICAgIGNsb3NlKCk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0NvbnN0YW50cy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGVmNTgyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzOworCisKKy8qKgorICogTWFuaWZlc3QgY29uc3RhbnRzIGZvciB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXM8L2NvZGU+CisgKiBwYWNrYWdlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb25zdGFudHMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcyI7CisKKyAgICAvLyBDb25zdGFudHMgZm9yIHRoZSBBY2Nlc3NMb2dWYWx2ZSBjbGFzcworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQWNjZXNzTG9nIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTU9OX0FMSUFTID0gImNvbW1vbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1PTl9QQVRURVJOID0gIiVoICVsICV1ICV0IFwiJXJcIiAlcyAlYiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTUJJTkVEX0FMSUFTID0gImNvbWJpbmVkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NQklORURfUEFUVEVSTiA9ICIlaCAlbCAldSAldCBcIiVyXCIgJXMgJWIgXCIle1JlZmVyZXJ9aVwiIFwiJXtVc2VyLUFnZW50fWlcIiI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0Vycm9yUmVwb3J0VmFsdmUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvRXJyb3JSZXBvcnRWYWx2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNzA1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0Vycm9yUmVwb3J0VmFsdmUuamF2YQpAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5SZXF1ZXN0VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU2VydmVySW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLkludHJvc3BlY3Rpb25VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmNvbXBhdC5KZGtDb21wYXQ7CisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgYSBWYWx2ZSB0aGF0IG91dHB1dHMgSFRNTCBlcnJvciBwYWdlcy48L3A+CisgKgorICogPHA+VGhpcyBWYWx2ZSBzaG91bGQgYmUgYXR0YWNoZWQgYXQgdGhlIEhvc3QgbGV2ZWwsIGFsdGhvdWdoIGl0IHdpbGwgd29yaworICogaWYgYXR0YWNoZWQgdG8gYSBDb250ZXh0LjwvcD4KKyAqCisgKiA8cD5IVE1MIGNvZGUgZnJvbSB0aGUgQ29jb29uIDIgcHJvamVjdC48L3A+CisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpuaWNvbGFrZW5Ac3VwZXJldmEuaXQiPk5pY29sYSBLZW4gQmFyb3p6aTwvYT4gQWlzYQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFub0BhcGFjaGUub3JnIj5TdGVmYW5vIE1henpvY2NoaTwvYT4KKyAqIEBhdXRob3IgWW9hdiBTaGFwaXJhCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBFcnJvclJlcG9ydFZhbHZlCisgICAgZXh0ZW5kcyBWYWx2ZUJhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5FcnJvclJlcG9ydFZhbHZlLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBTdHJpbmdNYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGpzcEV4Y2VwdGlvbkNsYXp6OworICAgIAorICAgIHN0YXRpYyB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc3BFeGNlcHRpb25DbGF6eiA9IENsYXNzLmZvck5hbWUoImphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkIGlmIGpzcC1hcGkgbm90IG9uIGNsYXNzcGF0aCwgZWcgd2hlbiBlbWJlZGRpbmcKKyAgICAgICAgICAgIGpzcEV4Y2VwdGlvbkNsYXp6ID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBWYWx2ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEludm9rZSB0aGUgbmV4dCBWYWx2ZSBpbiB0aGUgc2VxdWVuY2UuIFdoZW4gdGhlIGludm9rZSByZXR1cm5zLCBjaGVjaworICAgICAqIHRoZSByZXNwb25zZSBzdGF0ZSwgYW5kIG91dHB1dCBhbiBlcnJvciByZXBvcnQgaXMgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2UgdG8gYmUgY3JlYXRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZva2UoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQZXJmb3JtIHRoZSByZXF1ZXN0CisgICAgICAgIGdldE5leHQoKS5pbnZva2UocmVxdWVzdCwgcmVzcG9uc2UpOworCisgICAgICAgIFNlcnZsZXRSZXF1ZXN0IHNyZXEgPSAoU2VydmxldFJlcXVlc3QpIHJlcXVlc3Q7CisgICAgICAgIFRocm93YWJsZSB0aHJvd2FibGUgPQorICAgICAgICAgICAgKFRocm93YWJsZSkgc3JlcS5nZXRBdHRyaWJ1dGUoR2xvYmFscy5FWENFUFRJT05fQVRUUik7CisKKyAgICAgICAgU2VydmxldFJlc3BvbnNlIHNyZXNwID0gKFNlcnZsZXRSZXNwb25zZSkgcmVzcG9uc2U7CisgICAgICAgIGlmIChzcmVzcC5pc0NvbW1pdHRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhyb3dhYmxlICE9IG51bGwpIHsKKworICAgICAgICAgICAgLy8gVGhlIHJlc3BvbnNlIGlzIGFuIGVycm9yCisgICAgICAgICAgICByZXNwb25zZS5zZXRFcnJvcigpOworCisgICAgICAgICAgICAvLyBSZXNldCB0aGUgcmVzcG9uc2UgKGlmIHBvc3NpYmxlKQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzcmVzcC5yZXNldCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisKKyAgICAgICAgfQorCisgICAgICAgIHJlc3BvbnNlLnNldFN1c3BlbmRlZChmYWxzZSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlcG9ydChyZXF1ZXN0LCByZXNwb25zZSwgdGhyb3dhYmxlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHR0KSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByaW50cyBvdXQgYW4gZXJyb3IgcmVwb3J0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXNwb25zZSBiZWluZyBnZW5lcmF0ZWQKKyAgICAgKiBAcGFyYW0gdGhyb3dhYmxlIFRoZSBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCAod2hpY2ggcG9zc2libHkgd3JhcHMKKyAgICAgKiAgYSByb290IGNhdXNlIGV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlcG9ydChSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgdGhyb3dhYmxlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIERvIG5vdGhpbmcgb24gbm9uLUhUVFAgcmVzcG9uc2VzCisgICAgICAgIGludCBzdGF0dXNDb2RlID0gcmVzcG9uc2UuZ2V0U3RhdHVzKCk7CisKKyAgICAgICAgLy8gRG8gbm90aGluZyBvbiBhIDF4eCwgMnh4IGFuZCAzeHggc3RhdHVzCisgICAgICAgIC8vIERvIG5vdGhpbmcgaWYgYW55dGhpbmcgaGFzIGJlZW4gd3JpdHRlbiBhbHJlYWR5CisgICAgICAgIGlmICgoc3RhdHVzQ29kZSA8IDQwMCkgfHwgKHJlc3BvbnNlLmdldENvbnRlbnRDb3VudCgpID4gMCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgVGhyb3dhYmxlIHJvb3RDYXVzZSA9IG51bGw7CisKKyAgICAgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIGlmICh0aHJvd2FibGUgaW5zdGFuY2VvZiBTZXJ2bGV0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHJvb3RDYXVzZSA9ICgoU2VydmxldEV4Y2VwdGlvbikgdGhyb3dhYmxlKS5nZXRSb290Q2F1c2UoKTsKKworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBSZXF1ZXN0VXRpbC5maWx0ZXIocmVzcG9uc2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAiIjsKKworICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIHJlcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBzdGF0dXMgY29kZQorICAgICAgICBTdHJpbmcgcmVwb3J0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlcG9ydCA9IHNtLmdldFN0cmluZygiaHR0cC4iICsgc3RhdHVzQ29kZSwgbWVzc2FnZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcG9ydCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBzYi5hcHBlbmQoIjxodG1sPjxoZWFkPjx0aXRsZT4iKTsKKyAgICAgICAgc2IuYXBwZW5kKFNlcnZlckluZm8uZ2V0U2VydmVySW5mbygpKS5hcHBlbmQoIiAtICIpOworICAgICAgICBzYi5hcHBlbmQoc20uZ2V0U3RyaW5nKCJlcnJvclJlcG9ydFZhbHZlLmVycm9yUmVwb3J0IikpOworICAgICAgICBzYi5hcHBlbmQoIjwvdGl0bGU+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPHN0eWxlPjwhLS0iKTsKKyAgICAgICAgc2IuYXBwZW5kKG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5Ub21jYXRDU1MuVE9NQ0FUX0NTUyk7CisgICAgICAgIHNiLmFwcGVuZCgiLS0+PC9zdHlsZT4gIik7CisgICAgICAgIHNiLmFwcGVuZCgiPC9oZWFkPjxib2R5PiIpOworICAgICAgICBzYi5hcHBlbmQoIjxoMT4iKTsKKyAgICAgICAgc2IuYXBwZW5kKHNtLmdldFN0cmluZygiZXJyb3JSZXBvcnRWYWx2ZS5zdGF0dXNIZWFkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiICsgc3RhdHVzQ29kZSwgbWVzc2FnZSkpLmFwcGVuZCgiPC9oMT4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8SFIgc2l6ZT1cIjFcIiBub3NoYWRlPVwibm9zaGFkZVwiPiIpOworICAgICAgICBzYi5hcHBlbmQoIjxwPjxiPnR5cGU8L2I+ICIpOworICAgICAgICBpZiAodGhyb3dhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImVycm9yUmVwb3J0VmFsdmUuZXhjZXB0aW9uUmVwb3J0IikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2IuYXBwZW5kKHNtLmdldFN0cmluZygiZXJyb3JSZXBvcnRWYWx2ZS5zdGF0dXNSZXBvcnQiKSk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCI8L3A+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPHA+PGI+Iik7CisgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImVycm9yUmVwb3J0VmFsdmUubWVzc2FnZSIpKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8L2I+IDx1PiIpOworICAgICAgICBzYi5hcHBlbmQobWVzc2FnZSkuYXBwZW5kKCI8L3U+PC9wPiIpOworICAgICAgICBzYi5hcHBlbmQoIjxwPjxiPiIpOworICAgICAgICBzYi5hcHBlbmQoc20uZ2V0U3RyaW5nKCJlcnJvclJlcG9ydFZhbHZlLmRlc2NyaXB0aW9uIikpOworICAgICAgICBzYi5hcHBlbmQoIjwvYj4gPHU+Iik7CisgICAgICAgIHNiLmFwcGVuZChyZXBvcnQpOworICAgICAgICBzYi5hcHBlbmQoIjwvdT48L3A+Iik7CisKKyAgICAgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBzdGFja1RyYWNlID0gSmRrQ29tcGF0LmdldEpka0NvbXBhdCgpCisgICAgICAgICAgICAgICAgLmdldFBhcnRpYWxTZXJ2bGV0U3RhY2tUcmFjZSh0aHJvd2FibGUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI8cD48Yj4iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImVycm9yUmVwb3J0VmFsdmUuZXhjZXB0aW9uIikpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI8L2I+IDxwcmU+Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoUmVxdWVzdFV0aWwuZmlsdGVyKHN0YWNrVHJhY2UpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPC9wcmU+PC9wPiIpOworCisgICAgICAgICAgICBUaHJvd2FibGUgbmVzdGVkUm9vdENhdXNlID0gbnVsbDsKKyAgICAgICAgICAgIHdoaWxlIChyb290Q2F1c2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN0YWNrVHJhY2UgPSBKZGtDb21wYXQuZ2V0SmRrQ29tcGF0KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFBhcnRpYWxTZXJ2bGV0U3RhY2tUcmFjZShyb290Q2F1c2UpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPHA+PGI+Iik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHNtLmdldFN0cmluZygiZXJyb3JSZXBvcnRWYWx2ZS5yb290Q2F1c2UiKSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8L2I+IDxwcmU+Iik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKFJlcXVlc3RVdGlsLmZpbHRlcihzdGFja1RyYWNlKSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8L3ByZT48L3A+Iik7CisgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSByb290IGNhdXNlIGlzIHNvbWVob3cgaGVhdmlseSBuZXN0ZWQKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAocm9vdENhdXNlIGluc3RhbmNlb2YgU2VydmxldEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUm9vdENhdXNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNlcnZsZXRFeGNlcHRpb24pIHJvb3RDYXVzZSkuZ2V0Um9vdENhdXNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoanNwRXhjZXB0aW9uQ2xhenohPW51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3BFeGNlcHRpb25DbGF6ei5pc0Fzc2lnbmFibGVGcm9tKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdENhdXNlLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSb290Q2F1c2UgPSAoVGhyb3dhYmxlKUludHJvc3BlY3Rpb25VdGlscy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvcGVydHkocm9vdENhdXNlLCAicm9vdENhdXNlIik7IAorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3RDYXVzZSBpbnN0YW5jZW9mIFNRTEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUm9vdENhdXNlID0gKChTUUxFeGNlcHRpb24pIHJvb3RDYXVzZSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5leHRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmVzdGVkUm9vdENhdXNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJvb3RDYXVzZSA9IHJvb3RDYXVzZS5nZXRDYXVzZSgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJvb3RDYXVzZSA9PSBuZXN0ZWRSb290Q2F1c2UpCisgICAgICAgICAgICAgICAgICAgICAgICByb290Q2F1c2UgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RDYXVzZSA9IG5lc3RlZFJvb3RDYXVzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJvb3RDYXVzZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICByb290Q2F1c2UgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2IuYXBwZW5kKCI8cD48Yj4iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImVycm9yUmVwb3J0VmFsdmUubm90ZSIpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPC9iPiA8dT4iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImVycm9yUmVwb3J0VmFsdmUucm9vdENhdXNlSW5Mb2dzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVySW5mby5nZXRTZXJ2ZXJJbmZvKCkpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPC91PjwvcD4iKTsKKworICAgICAgICB9CisKKyAgICAgICAgc2IuYXBwZW5kKCI8SFIgc2l6ZT1cIjFcIiBub3NoYWRlPVwibm9zaGFkZVwiPiIpOworICAgICAgICBzYi5hcHBlbmQoIjxoMz4iKS5hcHBlbmQoU2VydmVySW5mby5nZXRTZXJ2ZXJJbmZvKCkpLmFwcGVuZCgiPC9oMz4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8L2JvZHk+PC9odG1sPiIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDaGFyYWN0ZXJFbmNvZGluZygidXRmLTgiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZGVidWcoInN0YXR1cy5zZXRDb250ZW50VHlwZSIsIHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgV3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFJlcG9ydGVyKCk7CisgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3cml0ZXIgaXMgbnVsbCwgaXQncyBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlIHJlc3BvbnNlIGhhcworICAgICAgICAgICAgICAgIC8vIGJlZW4gaGFyZCBjb21taXR0ZWQgYWxyZWFkeSwgd2hpY2ggc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0V4dGVuZGVkQWNjZXNzTG9nVmFsdmUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvRXh0ZW5kZWRBY2Nlc3NMb2dWYWx2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY2ZGEzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0V4dGVuZGVkQWNjZXNzTG9nVmFsdmUuamF2YQpAQCAtMCwwICsxLDE0MzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkxpZmVjeWNsZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlNlcnZlckluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXM2MgRXh0ZW5kZWQgTG9nIEZpbGUgRm9ybWF0LiBTZWUKKyAqIGh0dHA6Ly93d3cudzMub3JnL1RSL1dELWxvZ2ZpbGUuaHRtbCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZm9ybWF0LgorICoKKyAqIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiA8bGk+PGNvZGU+Yy1kbnM8L2NvZGU+OiAgQ2xpZW50IGhvc3RuYW1lPC9saT4KKyAqIDxsaT48Y29kZT5jLWlwPC9jb2RlPjogIENsaWVudCBpcCBhZGRyZXNzPC9saT4KKyAqIDxsaT48Y29kZT5ieXRlczwvY29kZT46ICBieXRlcyBzZXJ2ZWQ8L2xpPgorICogPGxpPjxjb2RlPmNzLW1ldGhvZDwvY29kZT46ICByZXF1ZXN0IG1ldGhvZDwvbGk+CisgKiA8bGk+PGNvZGU+Y3MtdXJpPC9jb2RlPjogIFRoZSBmdWxsIHVyaSByZXF1ZXN0ZWQ8L2xpPgorICogPGxpPjxjb2RlPmNzLXVyaS1xdWVyeTwvY29kZT46ICBUaGUgcXVlcnkgc3RyaW5nPC9saT4KKyAqIDxsaT48Y29kZT5jcy11cmktc3RlbTwvY29kZT46ICBUaGUgdXJpIHdpdGhvdXQgcXVlcnkgc3RyaW5nPC9saT4KKyAqIDxsaT48Y29kZT5kYXRlPC9jb2RlPjogIFRoZSBkYXRlIGluIHl5eXktbW0tZGQgIGZvcm1hdCBmb3IgR01UPC9saT4KKyAqIDxsaT48Y29kZT5zLWRuczwvY29kZT46IFRoZSBzZXJ2ZXIgZG5zIGVudHJ5IDwvbGk+CisgKiA8bGk+PGNvZGU+cy1pcDwvY29kZT46ICBUaGUgc2VydmVyIGlwIGFkZHJlc3M8L2xpPgorICogPGxpPjxjb2RlPmNzKFhYWCk8L2NvZGU+OiAgVGhlIHZhbHVlIG9mIGhlYWRlciBYWFggZnJvbSBjbGllbnQgdG8gc2VydmVyPC9saT4KKyAqIDxsaT48Y29kZT5zYyhYWFgpPC9jb2RlPjogVGhlIHZhbHVlIG9mIGhlYWRlciBYWFggZnJvbSBzZXJ2ZXIgdG8gY2xpZW50IDwvbGk+CisgKiA8bGk+PGNvZGU+c2Mtc3RhdHVzPC9jb2RlPjogIFRoZSBzdGF0dXMgY29kZTwvbGk+CisgKiA8bGk+PGNvZGU+dGltZTwvY29kZT46ICBUaW1lIHRoZSByZXF1ZXN0IHdhcyBzZXJ2ZWQ8L2xpPgorICogPGxpPjxjb2RlPnRpbWUtdGFrZW48L2NvZGU+OiAgVGltZSAoaW4gc2Vjb25kcykgdGFrZW4gdG8gc2VydmUgdGhlIHJlcXVlc3Q8L2xpPgorICogPGxpPjxjb2RlPngtQShYWFgpPC9jb2RlPjogUHVsbCBYWFggYXR0cmlidXRlIGZyb20gdGhlIHNlcnZsZXQgY29udGV4dCA8L2xpPgorICogPGxpPjxjb2RlPngtQyhYWFgpPC9jb2RlPjogUHVsbCB0aGUgZmlyc3QgY29va2llIG9mIHRoZSBuYW1lIFhYWCA8L2xpPgorICogPGxpPjxjb2RlPngtUihYWFgpPC9jb2RlPjogUHVsbCBYWFggYXR0cmlidXRlIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdCA8L2xpPgorICogPGxpPjxjb2RlPngtUyhYWFgpPC9jb2RlPjogUHVsbCBYWFggYXR0cmlidXRlIGZyb20gdGhlIHNlc3Npb24gPC9saT4KKyAqIDxsaT48Y29kZT54LVAoLi4uKTwvY29kZT46ICBDYWxsIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKC4uLikKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgVVJMZW5jb2RlIGl0LiBIZWxwZnVsIHRvIGNhcHR1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0YWluIFBPU1QgcGFyYW1ldGVycy4KKyAqIDwvbGk+CisgKiA8bGk+Rm9yIGFueSBvZiB0aGUgeC1IKC4uLikgdGhlIGZvbGxvd2luZyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZnJvbSB0aGUKKyAqICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdE9iamVjdCA8L2xpPgorICogPGxpPjxjb2RlPngtSChhdXRoVHlwZSk8L2NvZGU+OiBnZXRBdXRoVHlwZSA8L2xpPgorICogPGxpPjxjb2RlPngtSChjaGFyYWN0ZXJFbmNvZGluZyk8L2NvZGU+OiBnZXRDaGFyYWN0ZXJFbmNvZGluZyA8L2xpPgorICogPGxpPjxjb2RlPngtSChjb250ZW50TGVuZ3RoKTwvY29kZT46IGdldENvbnRlbnRMZW5ndGggPC9saT4KKyAqIDxsaT48Y29kZT54LUgobG9jYWxlKTwvY29kZT46ICBnZXRMb2NhbGU8L2xpPgorICogPGxpPjxjb2RlPngtSChwcm90b2NvbCk8L2NvZGU+OiBnZXRQcm90b2NvbCA8L2xpPgorICogPGxpPjxjb2RlPngtSChyZW1vdGVVc2VyKTwvY29kZT46ICBnZXRSZW1vdGVVc2VyPC9saT4KKyAqIDxsaT48Y29kZT54LUgocmVxdWVzdGVkU2Vzc2lvbklkKTwvY29kZT46IGdldEdlcXVlc3RlZFNlc3Npb25JZDwvbGk+CisgKiA8bGk+PGNvZGU+eC1IKHJlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUpPC9jb2RlPjoKKyAqICAgICAgICAgICAgICAgICAgaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tQ29va2llIDwvbGk+CisgKiA8bGk+PGNvZGU+eC1IKHJlcXVlc3RlZFNlc3Npb25JZFZhbGlkKTwvY29kZT46CisgKiAgICAgICAgICAgICAgICAgIGlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQ8L2xpPgorICogPGxpPjxjb2RlPngtSChzY2hlbWUpPC9jb2RlPjogIGdldFNjaGVtZTwvbGk+CisgKiA8bGk+PGNvZGU+eC1IKHNlY3VyZSk8L2NvZGU+OiAgaXNTZWN1cmU8L2xpPgorICogPC91bD4KKyAqCisgKgorICoKKyAqIDxwPgorICogTG9nIHJvdGF0aW9uIGNhbiBiZSBvbiBvciBvZmYuIFRoaXMgaXMgZGljdGF0ZWQgYnkgdGhlIHJvdGF0YWJsZQorICogcHJvcGVydHkuCisgKiA8L3A+CisgKgorICogPHA+CisgKiBGb3IgVU5JWCB1c2VycywgYW5vdGhlciBmaWVsZCBjYWxsZWQgPGNvZGU+Y2hlY2tFeGlzdHM8L2NvZGU+aXMgYWxzbworICogYXZhaWxhYmxlLiBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGxvZyBmaWxlJ3MgZXhpc3RlbmNlIHdpbGwgYmUgY2hlY2tlZCBiZWZvcmUKKyAqIGVhY2ggbG9nZ2luZy4gVGhpcyB3YXkgYW4gZXh0ZXJuYWwgbG9nIHJvdGF0b3IgY2FuIG1vdmUgdGhlIGZpbGUKKyAqIHNvbWV3aGVyZSBhbmQgdG9tY2F0IHdpbGwgc3RhcnQgd2l0aCBhIG5ldyBmaWxlLgorICogPC9wPgorICoKKyAqIDxwPgorICogRm9yIEpNWCBqdW5raWVzLCBhIHB1YmxpYyBtZXRob2QgY2FsbGVkIDwvY29kZT5yb3RhdGU8L2NvZGU+IGhhcworICogYmVlbiBtYWRlIGF2YWlsYWJsZSB0byBhbGxvdyB5b3UgdG8gdGVsbCB0aGlzIGluc3RhbmNlIHRvIG1vdmUKKyAqIHRoZSBleGlzdGluZyBsb2cgZmlsZSB0byBzb21ld2hlcmUgZWxzZSBzdGFydCB3cml0aW5nIGEgbmV3IGxvZyBmaWxlLgorICogPC9wPgorICoKKyAqIDxwPgorICogQ29uZGl0aW9uYWwgbG9nZ2luZyBpcyBhbHNvIHN1cHBvcnRlZC4gVGhpcyBjYW4gYmUgZG9uZSB3aXRoIHRoZQorICogPGNvZGU+Y29uZGl0aW9uPC9jb2RlPiBwcm9wZXJ0eS4KKyAqIElmIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIFNlcnZsZXRSZXF1ZXN0LmdldEF0dHJpYnV0ZShjb25kaXRpb24pCisgKiB5aWVsZHMgYSBub24tbnVsbCB2YWx1ZS4gVGhlIGxvZ2dpbmcgd2lsbCBiZSBza2lwcGVkLgorICogPC9wPgorICoKKyAqIDxwPgorICogRm9yIGV4dGVuZGVkIGF0dHJpYnV0ZXMgY29taW5nIGZyb20gYSBnZXRBdHRyaWJ1dGUoKSBjYWxsLAorICogaXQgaXMgeW91IHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGVyZSBhcmUgbm8gbmV3bGluZSBvcgorICogY29udHJvbCBjaGFyYWN0ZXJzLgorICogPC9wPgorICoKKyAqCisgKiBAYXV0aG9yIFRpbSBGdW5rCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBFeHRlbmRlZEFjY2Vzc0xvZ1ZhbHZlCisgICAgZXh0ZW5kcyBWYWx2ZUJhc2UKKyAgICBpbXBsZW1lbnRzIExpZmVjeWNsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIGRlZmF1bHQgcHJvcGVydHkgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBFeHRlbmRlZEFjY2Vzc0xvZ1ZhbHZlKCkgeworCisgICAgICAgIHN1cGVyKCk7CisKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEV4dGVuZGVkQWNjZXNzTG9nVmFsdmUuY2xhc3MpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkV4dGVuZGVkQWNjZXNzTG9nVmFsdmUvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGxpZmVjeWNsZSBldmVudCBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlmZWN5Y2xlU3VwcG9ydCBsaWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlU3VwcG9ydCh0aGlzKTsKKworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhpcyBjb21wb25lbnQgYmVlbiBzdGFydGVkIHlldD8KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXMtb2YgZGF0ZSBmb3IgdGhlIGN1cnJlbnRseSBvcGVuIGxvZyBmaWxlLCBvciBhIHplcm8tbGVuZ3RoCisgICAgICogc3RyaW5nIGlmIHRoZXJlIGlzIG5vIG9wZW4gbG9nIGZpbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGF0ZVN0YW1wID0gIiI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBQcmludFdyaXRlciB0byB3aGljaCB3ZSBhcmUgY3VycmVudGx5IGxvZ2dpbmcsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFByaW50V3JpdGVyIHdyaXRlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBmb3JtYXR0ZXIgZm9yIHRoZSBkYXRlIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU2ltcGxlRGF0ZUZvcm1hdCBmaWxlRGF0ZUZvcm1hdHRlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEEgZGF0ZSBmb3JtYXR0ZXIgdG8gZm9ybWF0IGEgRGF0ZSBpbnRvIGEgZGF0ZSBpbiB0aGUgZm9ybWF0CisgICAgICogInl5eXktTU0tZGQiLgorICAgICAqLworICAgIHByaXZhdGUgU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0dGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQSBkYXRlIGZvcm1hdHRlciB0byBmb3JtYXQgYSBEYXRlIGludG8gYSB0aW1lIGluIHRoZSBmb3JtYXQKKyAgICAgKiAia2s6bW06c3MiIChrayBpcyBhIDI0LWhvdXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIGhvdXIpLgorICAgICAqLworICAgIHByaXZhdGUgU2ltcGxlRGF0ZUZvcm1hdCB0aW1lRm9ybWF0dGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGltZSB0YWtlbiBmb3JtYXR0ZXIgZm9yIDMgZGVjaW1hbCBwbGFjZXMuCisgICAgICovCisgICAgIHByaXZhdGUgRGVjaW1hbEZvcm1hdCB0aW1lVGFrZW5Gb3JtYXR0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBNeSBpcCBhZGRyZXNzLiBMb29rIGl0IHVwIG9uY2UgYW5kIHJlbWVtYmVyIGl0LiBEdW1wIHRoaXMgaWYgd2UgY2FuCisgICAgICogZGV0ZXJtaW5lIGFub3RoZXIgcmVsaWFibGUgd2F5IHRvIGdldCBzZXJ2ZXIgaXAgYWRkcmVzcyBzaW5jZSB0aGlzCisgICAgICogc2VydmVyIG1heSBoYXZlIG1hbnkgaXAncy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBteUlwQWRkcmVzcyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIE15IGRucyBuYW1lLiBMb29rIGl0IHVwIG9uY2UgYW5kIHJlbWVtYmVyIGl0LiBEdW1wIHRoaXMgaWYgd2UgY2FuCisgICAgICogZGV0ZXJtaW5lIGFub3RoZXIgcmVsaWFibGUgd2F5IHRvIGdldCBzZXJ2ZXIgbmFtZSBhZGRyZXNzIHNpbmNlIHRoaXMKKyAgICAgKiBzZXJ2ZXIgbWF5IGhhdmUgbWFueSBpcCdzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG15RE5TTmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEhvbGRlciBmb3IgYWxsIG9mIHRoZSBmaWVsZHMgdG8gbG9nIGFmdGVyIHRoZSBwYXR0ZXJuIGlzIGRlY29kZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWVsZEluZm9bXSBmaWVsZEluZm9zOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBsb2cgZmlsZSB3ZSBhcmUgd3JpdGluZyB0by4gSGVscGZ1bCB3aGVuIGNoZWNrRXhpc3RzCisgICAgICogaXMgdHJ1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgY3VycmVudExvZ0ZpbGUgPSBudWxsOworCisKKworICAgIC8qKgorICAgICAqIFRoZSBzeXN0ZW0gdGltZSB3aGVuIHdlIGxhc3QgdXBkYXRlZCB0aGUgRGF0ZSB0aGF0IHRoaXMgdmFsdmUKKyAgICAgKiB1c2VzIGZvciBsb2cgbGluZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBEYXRlIGN1cnJlbnREYXRlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogSW5zdGFudCB3aGVuIHRoZSBsb2cgZGFpbHkgcm90YXRpb24gd2FzIGxhc3QgY2hlY2tlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgcm90YXRpb25MYXN0Q2hlY2tlZCA9IDBMOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIGxvZyBmaWxlcyBhcmUgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkaXJlY3RvcnkgPSAibG9ncyI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBwYXR0ZXJuIHVzZWQgdG8gZm9ybWF0IG91ciBhY2Nlc3MgbG9nIGxpbmVzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm4gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJlZml4IHRoYXQgaXMgYWRkZWQgdG8gbG9nIGZpbGUgZmlsZW5hbWVzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeCA9ICJhY2Nlc3NfbG9nLiI7CisKKworICAgIC8qKgorICAgICAqIFNob3VsZCB3ZSByb3RhdGUgb3VyIGxvZyBmaWxlPyBEZWZhdWx0IGlzIHRydWUgKGxpa2Ugb2xkIGJlaGF2aW9yKQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiByb3RhdGFibGUgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3VmZml4IHRoYXQgaXMgYWRkZWQgdG8gbG9nIGZpbGUgZmlsZW5hbWVzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHN1ZmZpeCA9ICIiOworCisKKyAgICAvKioKKyAgICAgKiBBcmUgd2UgZG9pbmcgY29uZGl0aW9uYWwgbG9nZ2luZy4gZGVmYXVsdCBmYWxzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb25kaXRpb24gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBEbyB3ZSBjaGVjayBmb3IgbG9nIGZpbGUgZXhpc3RlbmNlPyBIZWxwZnVsIGlmIGFuIGV4dGVybmFsCisgICAgICogYWdlbnQgcmVuYW1lcyB0aGUgbG9nIGZpbGUgc28gd2UgY2FuIGF1dG9tYWdpY2FsbHkgcmVjcmVhdGUgaXQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrRXhpc3RzID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIERhdGUgZm9ybWF0IHRvIHBsYWNlIGluIGxvZyBmaWxlIG5hbWUuIFVzZSBhdCB5b3VyIG93biByaXNrIQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVEYXRlRm9ybWF0ID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHdlIGNyZWF0ZSBsb2cgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaXJlY3RvcnkoKSB7CisKKyAgICAgICAgcmV0dXJuIChkaXJlY3RvcnkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB3ZSBjcmVhdGUgbG9nIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGRpcmVjdG9yeSBUaGUgbmV3IGxvZyBmaWxlIGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeShTdHJpbmcgZGlyZWN0b3J5KSB7CisKKyAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3Rvcnk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZvcm1hdCBwYXR0ZXJuLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucGF0dGVybik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZm9ybWF0IHBhdHRlcm4sIGZpcnN0IHRyYW5zbGF0aW5nIGFueSByZWNvZ25pemVkIGFsaWFzLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIG5ldyBwYXR0ZXJuIHBhdHRlcm4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7CisKKyAgICAgICAgRmllbGRJbmZvW10gZj0gZGVjb2RlUGF0dGVybihwYXR0ZXJuKTsKKyAgICAgICAgaWYgKGYhPW51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47CisgICAgICAgICAgICB0aGlzLmZpZWxkSW5mb3MgPSBmOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvZyBmaWxlIHByZWZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKKworICAgICAgICByZXR1cm4gKHByZWZpeCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9nIGZpbGUgcHJlZml4LgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBUaGUgbmV3IGxvZyBmaWxlIHByZWZpeAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KSB7CisKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIGxvZ3MgYXJlIGF1dG9tYXRpY2FsbHkgcm90YXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JvdGF0YWJsZSgpIHsKKworICAgICAgICByZXR1cm4gcm90YXRhYmxlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIGlzIHdlIHNob3VsZCB3ZSByb3RhdGUgdGhlIGxvZ3MKKyAgICAgKgorICAgICAqIEBwYXJhbSByb3RhdGFibGUgdHJ1ZSBpcyB3ZSBzaG91bGQgcm90YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvdGF0YWJsZShib29sZWFuIHJvdGF0YWJsZSkgeworCisgICAgICAgIHRoaXMucm90YXRhYmxlID0gcm90YXRhYmxlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvZyBmaWxlIHN1ZmZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN1ZmZpeCgpIHsKKworICAgICAgICByZXR1cm4gKHN1ZmZpeCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9nIGZpbGUgc3VmZml4LgorICAgICAqCisgICAgICogQHBhcmFtIHN1ZmZpeCBUaGUgbmV3IGxvZyBmaWxlIHN1ZmZpeAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN1ZmZpeChTdHJpbmcgc3VmZml4KSB7CisKKyAgICAgICAgdGhpcy5zdWZmaXggPSBzdWZmaXg7CisKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGxvb2sgZm9yIHdoZW4KKyAgICAgKiBwZXJmb3JtaW5nIGNvbmRpdGlvbmFsIGxvZ2dnaW5nLiBJZiBudWxsLCBldmVyeQorICAgICAqIHJlcXVlc3QgaXMgbG9nZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZGl0aW9uKCkgeworCisgICAgICAgIHJldHVybiBjb25kaXRpb247CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgU2VydmxldFJlcXVlc3QuYXR0cmlidXRlIHRvIGxvb2sgZm9yIHRvIHBlcmZvcm0KKyAgICAgKiBjb25kaXRpb25hbCBsb2dnaW5nLiBTZXQgdG8gbnVsbCB0byBsb2cgZXZlcnl0aGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25kaXRpb24gU2V0IHRvIG51bGwgdG8gbG9nIGV2ZXJ5dGhpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25kaXRpb24oU3RyaW5nIGNvbmRpdGlvbikgeworCisgICAgICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOworCisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIENoZWNrIGZvciBmaWxlIGV4aXN0ZW5jZSBiZWZvcmUgbG9nZ2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrRXhpc3RzKCkgeworCisgICAgICAgIHJldHVybiBjaGVja0V4aXN0czsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gY2hlY2sgZm9yIGxvZyBmaWxlIGV4aXN0ZW5jZSBiZWZvcmUgbG9nZ2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGVja0V4aXN0cyB0cnVlIG1lYW5pbmcgdG8gY2hlY2sgZm9yIGZpbGUgZXhpc3RlbmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENoZWNrRXhpc3RzKGJvb2xlYW4gY2hlY2tFeGlzdHMpIHsKKworICAgICAgICB0aGlzLmNoZWNrRXhpc3RzID0gY2hlY2tFeGlzdHM7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBSZXR1cm4gdGhlIGRhdGUgZm9ybWF0IGRhdGUgYmFzZWQgbG9nIHJvdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZURhdGVGb3JtYXQoKSB7CisgICAgICAgIHJldHVybiBmaWxlRGF0ZUZvcm1hdDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBTZXQgdGhlIGRhdGUgZm9ybWF0IGRhdGUgYmFzZWQgbG9nIHJvdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVEYXRlRm9ybWF0KFN0cmluZyBmaWxlRGF0ZUZvcm1hdCkgeworICAgICAgICB0aGlzLmZpbGVEYXRlRm9ybWF0ID0gIGZpbGVEYXRlRm9ybWF0OworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIExvZyBhIG1lc3NhZ2Ugc3VtbWFyaXppbmcgdGhlIHNwZWNpZmllZCByZXF1ZXN0IGFuZCByZXNwb25zZSwgYWNjb3JkaW5nCisgICAgICogdG8gdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnBhdHRlcm48L2NvZGU+IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2UgYmVpbmcgcHJvY2Vzc2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBoYXMgb2NjdXJyZWQKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFBhc3MgdGhpcyByZXF1ZXN0IG9uIHRvIHRoZSBuZXh0IHZhbHZlIGluIG91ciBwaXBlbGluZQorICAgICAgICBsb25nIGVuZFRpbWU7CisgICAgICAgIGxvbmcgcnVuVGltZTsKKyAgICAgICAgbG9uZyBzdGFydFRpbWU9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgZ2V0TmV4dCgpLmludm9rZShyZXF1ZXN0LCByZXNwb25zZSk7CisKKyAgICAgICAgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBydW5UaW1lID0gZW5kVGltZS1zdGFydFRpbWU7CisKKyAgICAgICAgaWYgKGZpZWxkSW5mb3M9PW51bGwgfHwgY29uZGl0aW9uIT1udWxsICYmCisgICAgICAgICAgICAgIG51bGwhPXJlcXVlc3QuZ2V0UmVxdWVzdCgpLmdldEF0dHJpYnV0ZShjb25kaXRpb24pKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworCisgICAgICAgIERhdGUgZGF0ZSA9IGdldERhdGUoZW5kVGltZSk7CisgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBmaWVsZEluZm9zIT1udWxsICYmIGk8ZmllbGRJbmZvcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoKGZpZWxkSW5mb3NbaV0udHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgRmllbGRJbmZvLkRBVEFfQ0xJRU5UOgorICAgICAgICAgICAgICAgICAgICBpZiAoRmllbGRJbmZvLkZJRUxEX0lQPT1maWVsZEluZm9zW2ldLmxvY2F0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChyZXF1ZXN0LmdldFJlcXVlc3QoKS5nZXRSZW1vdGVBZGRyKCkpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChGaWVsZEluZm8uRklFTERfRE5TPT1maWVsZEluZm9zW2ldLmxvY2F0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChyZXF1ZXN0LmdldFJlcXVlc3QoKS5nZXRSZW1vdGVIb3N0KCkpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCI/V1RGPyIpOyAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRmllbGRJbmZvLkRBVEFfU0VSVkVSOgorICAgICAgICAgICAgICAgICAgICBpZiAoRmllbGRJbmZvLkZJRUxEX0lQPT1maWVsZEluZm9zW2ldLmxvY2F0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChteUlwQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkSW5mby5GSUVMRF9ETlM9PWZpZWxkSW5mb3NbaV0ubG9jYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKG15RE5TTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIj9XVEY/Iik7IC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uREFUQV9SRU1PVEU6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJz8nKTsgLyogSSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdGhlc2UhICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRmllbGRJbmZvLkRBVEFfQ0xJRU5UX1RPX1NFUlZFUjoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChnZXRDbGllbnRUb1NlcnZlcihmaWVsZEluZm9zW2ldLCByZXF1ZXN0KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRmllbGRJbmZvLkRBVEFfU0VSVkVSX1RPX0NMSUVOVDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChnZXRTZXJ2ZXJUb0NsaWVudChmaWVsZEluZm9zW2ldLCByZXNwb25zZSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkSW5mby5EQVRBX1NFUlZFUl9UT19SU0VSVkVSOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCctJyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRmllbGRJbmZvLkRBVEFfUlNFUlZFUl9UT19TRVJWRVI6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJy0nKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uREFUQV9BUFBfU1BFQ0lGSUM6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZ2V0QXBwU3BlY2lmaWMoZmllbGRJbmZvc1tpXSwgcmVxdWVzdCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkSW5mby5EQVRBX1NQRUNJQUw6CisgICAgICAgICAgICAgICAgICAgIGlmIChGaWVsZEluZm8uU1BFQ0lBTF9EQVRFPT1maWVsZEluZm9zW2ldLmxvY2F0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChkYXRlRm9ybWF0dGVyLmZvcm1hdChkYXRlKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkSW5mby5TUEVDSUFMX1RJTUVfVEFLRU49PWZpZWxkSW5mb3NbaV0ubG9jYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRpbWVUYWtlbkZvcm1hdHRlci5mb3JtYXQocnVuVGltZS8xMDAwZCkpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChGaWVsZEluZm8uU1BFQ0lBTF9USU1FPT1maWVsZEluZm9zW2ldLmxvY2F0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0aW1lRm9ybWF0dGVyLmZvcm1hdChkYXRlKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkSW5mby5TUEVDSUFMX0JZVEVTPT1maWVsZEluZm9zW2ldLmxvY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gcmVzcG9uc2UuZ2V0Q29udGVudENvdW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLSIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEZpZWxkSW5mby5TUEVDSUFMX0NBQ0hFRD09ZmllbGRJbmZvc1tpXS5sb2NhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJy0nKTsgLyogSSBkb24ndCBrbm93IGhvdyB0byBldmFsdWF0ZSB0aGlzISAqLworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCI/V1RGPyIpOyAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIj9XVEY/Iik7IC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpZWxkSW5mb3NbaV0ucG9zdFdoaXRlU3BhY2UhPW51bGwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGZpZWxkSW5mb3NbaV0ucG9zdFdoaXRlU3BhY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvZyhyZXN1bHQudG9TdHJpbmcoKSwgZGF0ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbmFtZSB0aGUgZXhpc3RpbmcgbG9nIGZpbGUgdG8gc29tZXRoaW5nIGVsc2UuIFRoZW4gb3BlbiB0aGUKKyAgICAgKiBvbGQgbG9nIGZpbGUgbmFtZSB1cCBvbmNlIGFnYWluLiBJbnRlbmRlZCB0byBiZSBjYWxsZWQgYnkgYSBKTVgKKyAgICAgKiBhZ2VudC4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIG5ld0ZpbGVOYW1lIFRoZSBmaWxlIG5hbWUgdG8gbW92ZSB0aGUgbG9nIGZpbGUgZW50cnkgdG8KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBmaWxlIHdhcyByb3RhdGVkIHdpdGggbm8gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcm90YXRlKFN0cmluZyBuZXdGaWxlTmFtZSkgeworCisgICAgICAgIGlmIChjdXJyZW50TG9nRmlsZSE9bnVsbCkgeworICAgICAgICAgICAgRmlsZSBob2xkZXIgPSBjdXJyZW50TG9nRmlsZTsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGhvbGRlci5yZW5hbWVUbyhuZXcgRmlsZShuZXdGaWxlTmFtZSkpOworICAgICAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgZSl7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJyb3RhdGUgZmFpbGVkIiwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSBkYXRlIGlzIGNvcnJlY3QgKi8KKyAgICAgICAgICAgIGN1cnJlbnREYXRlID0gbmV3IERhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgZGF0ZVN0YW1wID0gZmlsZURhdGVGb3JtYXR0ZXIuZm9ybWF0KGN1cnJlbnREYXRlKTsKKworICAgICAgICAgICAgb3BlbigpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiAgUmV0dXJuIHRoZSBjbGllbnQgdG8gc2VydmVyIGRhdGEuCisgICAgICogIEBwYXJhbSBmaWVsZEluZm8gVGhlIGZpZWxkIHRvIGRlY29kZS4KKyAgICAgKiAgQHBhcmFtIHJlcXVlc3QgVGhlIG9iamVjdCB3ZSBwdWxsIGRhdGEgZnJvbS4KKyAgICAgKiAgQHJldHVybiBUaGUgYXBwcm9wcmlhdGUgdmFsdWUuCisgICAgICovCisgICAgIHByaXZhdGUgU3RyaW5nIGdldENsaWVudFRvU2VydmVyKEZpZWxkSW5mbyBmaWVsZEluZm8sIFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN3aXRjaChmaWVsZEluZm8ubG9jYXRpb24pIHsKKyAgICAgICAgICAgIGNhc2UgRmllbGRJbmZvLkZJRUxEX01FVEhPRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRNZXRob2QoKTsKKyAgICAgICAgICAgIGNhc2UgRmllbGRJbmZvLkZJRUxEX1VSSToKKyAgICAgICAgICAgICAgICBpZiAobnVsbD09cmVxdWVzdC5nZXRRdWVyeVN0cmluZygpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkgKyAiPyIgKyByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCk7CisgICAgICAgICAgICBjYXNlIEZpZWxkSW5mby5GSUVMRF9VUklfU1RFTToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisgICAgICAgICAgICBjYXNlIEZpZWxkSW5mby5GSUVMRF9VUklfUVVFUlk6CisgICAgICAgICAgICAgICAgaWYgKG51bGw9PXJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICItIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpOworICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uRklFTERfSEVBREVSOgorICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKHJlcXVlc3QuZ2V0SGVhZGVyKGZpZWxkSW5mby52YWx1ZSkpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gIi0iOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgUmV0dXJuIHRoZSBzZXJ2ZXIgdG8gY2xpZW50IGRhdGEuCisgICAgICogIEBwYXJhbSBmaWVsZEluZm8gVGhlIGZpZWxkIHRvIGRlY29kZS4KKyAgICAgKiAgQHBhcmFtIHJlc3BvbnNlIFRoZSBvYmplY3Qgd2UgcHVsbCBkYXRhIGZyb20uCisgICAgICogIEByZXR1cm4gVGhlIGFwcHJvcHJpYXRlIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFNlcnZlclRvQ2xpZW50KEZpZWxkSW5mbyBmaWVsZEluZm8sIFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIHN3aXRjaChmaWVsZEluZm8ubG9jYXRpb24pIHsKKyAgICAgICAgICAgIGNhc2UgRmllbGRJbmZvLkZJRUxEX1NUQVRVUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIiIgKyByZXNwb25zZS5nZXRTdGF0dXMoKTsKKyAgICAgICAgICAgIGNhc2UgRmllbGRJbmZvLkZJRUxEX0NPTU1FTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICI/IjsgLyogTm90IGNvZGVkIHlldCovCisgICAgICAgICAgICBjYXNlIEZpZWxkSW5mby5GSUVMRF9IRUFERVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAocmVzcG9uc2UuZ2V0SGVhZGVyKGZpZWxkSW5mby52YWx1ZSkpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gIi0iOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgYXBwIHNwZWNpZmljIGRhdGEuCisgICAgICogQHBhcmFtIGZpZWxkSW5mbyBUaGUgZmllbGQgdG8gZGVjb2RlCisgICAgICogQHBhcmFtIHJlcXVlc3QgV2hlcmUgd2Ugd2lsbCBwdWxsIHRoZSBkYXRhIGZyb20uCisgICAgICogQHJldHVybiBUaGUgYXBwcm9wcmlhdGUgdmFsdWUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRBcHBTcGVjaWZpYyhGaWVsZEluZm8gZmllbGRJbmZvLCBSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBzd2l0Y2goZmllbGRJbmZvLnhUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEZpZWxkSW5mby5YX1BBUkFNRVRFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gd3JhcCh1cmxFbmNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoZmllbGRJbmZvLnZhbHVlKSkpOworICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uWF9SRVFVRVNUOgorICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKHJlcXVlc3QuZ2V0QXR0cmlidXRlKGZpZWxkSW5mby52YWx1ZSkpOworICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uWF9TRVNTSU9OOgorICAgICAgICAgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0IT1udWxsKXsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbihmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uIT1udWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAoc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoZmllbGRJbmZvLnZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uWF9DT09LSUU6CisgICAgICAgICAgICAgICAgQ29va2llW10gYyA9IHJlcXVlc3QuZ2V0Q29va2llcygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgYyAhPSBudWxsICYmIGkgPCBjLmxlbmd0aDsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkSW5mby52YWx1ZS5lcXVhbHMoY1tpXS5nZXROYW1lKCkpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKGNbaV0uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uWF9BUFA6CisgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAocmVxdWVzdC5nZXRDb250ZXh0KCkuZ2V0U2VydmxldENvbnRleHQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKGZpZWxkSW5mby52YWx1ZSkpOworICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uWF9TRVJWTEVUX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkSW5mby5sb2NhdGlvbj09RmllbGRJbmZvLlhfTE9DX0FVVEhUWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKHJlcXVlc3QuZ2V0QXV0aFR5cGUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZEluZm8ubG9jYXRpb249PUZpZWxkSW5mby5YX0xPQ19SRU1PVEVVU0VSKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKHJlcXVlc3QuZ2V0UmVtb3RlVXNlcigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkSW5mby5sb2NhdGlvbj09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRJbmZvLlhfTE9DX1JFUVVFU1RFRFNFU1NJT05JRCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChyZXF1ZXN0LmdldFJlcXVlc3RlZFNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkSW5mby5sb2NhdGlvbj09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRJbmZvLlhfTE9DX1JFUVVFU1RFRFNFU1NJT05JREZST01DT09LSUUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAoIiIrcmVxdWVzdC5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZEluZm8ubG9jYXRpb249PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkSW5mby5YX0xPQ19SRVFVRVNURURTRVNTSU9OSURWQUxJRCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcCgiIityZXF1ZXN0LmlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZEluZm8ubG9jYXRpb249PUZpZWxkSW5mby5YX0xPQ19DT05URU5UTEVOR1RIKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKCIiK3JlcXVlc3QuZ2V0Q29udGVudExlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkSW5mby5sb2NhdGlvbj09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRJbmZvLlhfTE9DX0NIQVJBQ1RFUkVOQ09ESU5HKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKHJlcXVlc3QuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZEluZm8ubG9jYXRpb249PUZpZWxkSW5mby5YX0xPQ19MT0NBTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAocmVxdWVzdC5nZXRMb2NhbGUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZEluZm8ubG9jYXRpb249PUZpZWxkSW5mby5YX0xPQ19QUk9UT0NPTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChyZXF1ZXN0LmdldFByb3RvY29sKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRJbmZvLmxvY2F0aW9uPT1GaWVsZEluZm8uWF9MT0NfU0NIRU1FKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKHJlcXVlc3QuZ2V0U2NoZW1lKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRJbmZvLmxvY2F0aW9uPT1GaWVsZEluZm8uWF9MT0NfU0VDVVJFKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKCIiK3JlcXVlc3QuaXNTZWN1cmUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gIi0iOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgdXJsRW5jb2RlIHRoZSBnaXZlbiBzdHJpbmcuIElmIG51bGwgb3IgZW1wdHksIHJldHVybiBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVybEVuY29kZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKG51bGw9PXZhbHVlIHx8IHZhbHVlLmxlbmd0aCgpPT0wKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVVJMRW5jb2Rlci5lbmNvZGUodmFsdWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIFdyYXAgdGhlIGluY29taW5nIHZhbHVlIGludG8gcXVvdGVzIGFuZCBlc2NhcGUgYW55IGlubmVyCisgICAgICogIHF1b3RlcyB3aXRoIGRvdWJsZSBxdW90ZXMuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHdyYXAgcXVvdGVzIGFyb3VuZAorICAgICAqICBAcmV0dXJuICctJyBpZiBlbXB0eSBvZiBudWxsLiBPdGhlcndpc2UsIHRvU3RyaW5nKCkgd2lsbAorICAgICAqICAgICBiZSBjYWxsZWQgb24gdGhlIG9iamVjdCBhbmQgdGhlIHZhbHVlIHdpbGwgYmUgd3JhcHBlZAorICAgICAqICAgICBpbiBxdW90ZXMgYW5kIGFueSBxdW90ZXMgd2lsbCBiZSBlc2NhcGVkIHdpdGggMgorICAgICAqICAgICBzZXRzIG9mIHF1b3Rlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB3cmFwKE9iamVjdCB2YWx1ZSkgeworCisgICAgICAgIFN0cmluZyBzdmFsdWU7CisgICAgICAgIC8vIERvZXMgdGhlIHZhbHVlIGNvbnRhaW4gYSAiID8gSWYgc28gbXVzdCBlbmNvZGUgaXQKKyAgICAgICAgaWYgKHZhbHVlPT1udWxsIHx8ICItIi5lcXVhbHModmFsdWUpKQorICAgICAgICAgICAgcmV0dXJuICItIjsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOworICAgICAgICAgICAgaWYgKCIiLmVxdWFscyhzdmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiAiLSI7CisgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIGUpeworICAgICAgICAgICAgLyogTG9nIGVycm9yICovCisgICAgICAgICAgICByZXR1cm4gIi0iOworICAgICAgICB9CisKKyAgICAgICAgLyogV3JhcCBhbGwgcXVvdGVzIGluIGRvdWJsZSBxdW90ZXMuICovCisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHN2YWx1ZS5sZW5ndGgoKSsyKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgnIicpOworICAgICAgICBpbnQgaT0wOworICAgICAgICB3aGlsZSAoaTxzdmFsdWUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIGludCBqID0gc3ZhbHVlLmluZGV4T2YoJyInLCBpKTsKKyAgICAgICAgICAgIGlmIChqPT0tMSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoc3ZhbHVlLnN1YnN0cmluZyhpKSk7CisgICAgICAgICAgICAgICAgaT1zdmFsdWUubGVuZ3RoKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoc3ZhbHVlLnN1YnN0cmluZyhpLCBqKzEpKTsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCciJyk7CisgICAgICAgICAgICAgICAgaT1qKzI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBidWZmZXIuYXBwZW5kKCciJyk7CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIGN1cnJlbnRseSBvcGVuIGxvZyBmaWxlIChpZiBhbnkpCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHsKKworICAgICAgICBpZiAod3JpdGVyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgY3VycmVudExvZ0ZpbGUgPSBudWxsOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlIHRvIHRoZSBsb2cgZmlsZSwgc3dpdGNoaW5nIGZpbGVzIGlmIHRoZSBkYXRlCisgICAgICogaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIGxvZyBjYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZSB0byBiZSBsb2dnZWQKKyAgICAgKiBAcGFyYW0gZGF0ZSB0aGUgY3VycmVudCBEYXRlIG9iamVjdCAoc28gdGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIHRvCisgICAgICogICAgICAgIGNyZWF0ZSBhIG5ldyBvbmUpCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgRGF0ZSBkYXRlKSB7CisKKyAgICAgICAgaWYgKHJvdGF0YWJsZSl7CisgICAgICAgICAgICAvLyBPbmx5IGRvIGEgbG9nZmlsZSBzd2l0Y2ggY2hlY2sgb25jZSBhIHNlY29uZCwgbWF4LgorICAgICAgICAgICAgbG9uZyBzeXN0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpZiAoKHN5c3RpbWUgLSByb3RhdGlvbkxhc3RDaGVja2VkKSA+IDEwMDApIHsKKworICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgYSBuZXcgY3VycmVudERhdGUKKyAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKHN5c3RpbWUpOworICAgICAgICAgICAgICAgIHJvdGF0aW9uTGFzdENoZWNrZWQgPSBzeXN0aW1lOworCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgY2hhbmdlIG9mIGRhdGUKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHNEYXRlID0gZmlsZURhdGVGb3JtYXR0ZXIuZm9ybWF0KGN1cnJlbnREYXRlKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBkYXRlIGhhcyBjaGFuZ2VkLCBzd2l0Y2ggbG9nIGZpbGVzCisgICAgICAgICAgICAgICAgaWYgKCFkYXRlU3RhbXAuZXF1YWxzKHRzRGF0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGVTdGFtcC5lcXVhbHModHNEYXRlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZVN0YW1wID0gdHNEYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEluIGNhc2Ugc29tZXRoaW5nIGV4dGVybmFsIHJvdGF0ZWQgdGhlIGZpbGUgaW5zdGVhZCAqLworICAgICAgICBpZiAoY2hlY2tFeGlzdHMpeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2dGaWxlIT1udWxsICYmICFjdXJyZW50TG9nRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oImF0IGxlYXN0IHRoaXMgd2Fzbid0IHN3YWxsb3dlZCIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIGRhdGUgaXMgY29ycmVjdCAqLworICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0ZVN0YW1wID0gZmlsZURhdGVGb3JtYXR0ZXIuZm9ybWF0KGN1cnJlbnREYXRlKTsKKworICAgICAgICAgICAgICAgICAgICBvcGVuKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTG9nIHRoaXMgbWVzc2FnZQorICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIG5ldyBsb2cgZmlsZSBmb3IgdGhlIGRhdGUgc3BlY2lmaWVkIGJ5IDxjb2RlPmRhdGVTdGFtcDwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBvcGVuKCkgeworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgZGlyZWN0b3J5IGlmIG5lY2Vzc2FyeQorICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKGRpcmVjdG9yeSk7CisgICAgICAgIGlmICghZGlyLmlzQWJzb2x1dGUoKSkKKyAgICAgICAgICAgIGRpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLCBkaXJlY3RvcnkpOworICAgICAgICBkaXIubWtkaXJzKCk7CisKKyAgICAgICAgLy8gT3BlbiB0aGUgY3VycmVudCBsb2cgZmlsZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIHBhdGhuYW1lOworCisgICAgICAgICAgICAvLyBJZiBubyByb3RhdGUgLSBubyBuZWVkIGZvciBkYXRlU3RhbXAgaW4gZmlsZU5hbWUKKyAgICAgICAgICAgIGlmIChyb3RhdGFibGUpeworICAgICAgICAgICAgICAgIHBhdGhuYW1lID0gZGlyLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIGRhdGVTdGFtcCArIHN1ZmZpeDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGF0aG5hbWUgPSBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgc3VmZml4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXJyZW50TG9nRmlsZSA9IG5ldyBGaWxlKHBhdGhuYW1lKTsKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZVdyaXRlcihwYXRobmFtZSwgdHJ1ZSksIHRydWUpOworICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2dGaWxlLmxlbmd0aCgpPT0wKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIiNGaWVsZHM6ICIgKyBwYXR0ZXJuKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiI1ZlcnNpb246IDEuMCIpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCIjU29mdHdhcmU6ICIgKyBTZXJ2ZXJJbmZvLmdldFNlcnZlckluZm8oKSk7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB3cml0ZXIgPSBudWxsOworICAgICAgICAgICAgY3VycmVudExvZ0ZpbGUgPSBudWxsOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBEYXRlIG9iamVjdCB0aGF0IGlzIGFjY3VyYXRlIHRvIHdpdGhpbiBvbmUKKyAgICAgKiBzZWNvbmQuICBJZiBhIHRocmVhZCBjYWxscyB0aGlzIG1ldGhvZCB0byBnZXQgYSBEYXRlIGFuZCBpdCdzIGJlZW4KKyAgICAgKiBsZXNzIHRoYW4gMSBzZWNvbmQgc2luY2UgYSBuZXcgRGF0ZSB3YXMgY3JlYXRlZCwgdGhpcyBtZXRob2QKKyAgICAgKiBzaW1wbHkgZ2l2ZXMgb3V0IHRoZSBzYW1lIERhdGUgYWdhaW4gc28gdGhhdCB0aGUgc3lzdGVtIGRvZXNuJ3QKKyAgICAgKiBzcGVuZCB0aW1lIGNyZWF0aW5nIERhdGUgb2JqZWN0cyB1bm5lY2Vzc2FyaWx5LgorICAgICAqLworICAgIHByaXZhdGUgRGF0ZSBnZXREYXRlKGxvbmcgc3lzdGltZSkgeworICAgICAgICAvKiBBdm9pZCBleHRyYSBjYWxsIHRvIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOyAqLworICAgICAgICBpZiAoMD09c3lzdGltZSkgeworICAgICAgICAgICAgc3lzdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gT25seSBjcmVhdGUgYSBuZXcgRGF0ZSBvbmNlIHBlciBzZWNvbmQsIG1heC4KKyAgICAgICAgaWYgKChzeXN0aW1lIC0gY3VycmVudERhdGUuZ2V0VGltZSgpKSA+IDEwMDApIHsKKyAgICAgICAgICAgIGN1cnJlbnREYXRlLnNldFRpbWUoc3lzdGltZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3VycmVudERhdGU7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcworICAgICAqIExpZmVjeWNsZSBoYXMgbm8gbGlzdGVuZXJzIHJlZ2lzdGVyZWQsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUxpc3RlbmVyW10gZmluZExpZmVjeWNsZUxpc3RlbmVycygpIHsKKworICAgICAgICByZXR1cm4gbGlmZWN5Y2xlLmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLnJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJlcGFyZSBmb3IgdGhlIGJlZ2lubmluZyBvZiBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzCisgICAgICogY29tcG9uZW50LiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciA8Y29kZT5jb25maWd1cmUoKTwvY29kZT4sCisgICAgICogYW5kIGJlZm9yZSBhbnkgb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoZSBjb21wb25lbnQgYXJlIHV0aWxpemVkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgdGhpcyBjb21wb25lbnQgZnJvbSBiZWluZyB1c2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAoc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJleHRlbmRlZEFjY2Vzc0xvZ1ZhbHZlLmFscmVhZHlTdGFydGVkIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgdGltZVpvbmUsIERhdGUgZm9ybWF0dGVycywgYW5kIGN1cnJlbnREYXRlCisgICAgICAgIFRpbWVab25lIHR6ID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpOworICAgICAgICBkYXRlRm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQiKTsKKyAgICAgICAgZGF0ZUZvcm1hdHRlci5zZXRUaW1lWm9uZSh0eik7CisgICAgICAgIHRpbWVGb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiSEg6bW06c3MiKTsKKyAgICAgICAgdGltZUZvcm1hdHRlci5zZXRUaW1lWm9uZSh0eik7CisgICAgICAgIGN1cnJlbnREYXRlID0gbmV3IERhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICBpZiAoZmlsZURhdGVGb3JtYXQ9PW51bGwgfHwgZmlsZURhdGVGb3JtYXQubGVuZ3RoKCk9PTApCisgICAgICAgICAgICBmaWxlRGF0ZUZvcm1hdCA9ICJ5eXl5LU1NLWRkIjsKKyAgICAgICAgZmlsZURhdGVGb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChmaWxlRGF0ZUZvcm1hdCk7CisgICAgICAgIGRhdGVTdGFtcCA9IGZpbGVEYXRlRm9ybWF0dGVyLmZvcm1hdChjdXJyZW50RGF0ZSk7CisgICAgICAgIHRpbWVUYWtlbkZvcm1hdHRlciA9IG5ldyBEZWNpbWFsRm9ybWF0KCIwLjAwMCIpOworCisgICAgICAgIC8qIEV2ZXJ5Ym9keSBzYXkgaWNrIC4uLiBpY2sgKi8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CisgICAgICAgICAgICBteUlwQWRkcmVzcyA9IGluZXRBZGRyZXNzLmdldEhvc3RBZGRyZXNzKCk7CisgICAgICAgICAgICBteUROU05hbWUgPSBpbmV0QWRkcmVzcy5nZXRIb3N0TmFtZSgpOworICAgICAgICB9IGNhdGNoKFRocm93YWJsZSBlKXsKKyAgICAgICAgICAgIG15SXBBZGRyZXNzPSIxMjcuMC4wLjEiOworICAgICAgICAgICAgbXlETlNOYW1lPSJsb2NhbGhvc3QiOworICAgICAgICB9CisKKyAgICAgICAgb3BlbigpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHRlcm1pbmF0ZSB0aGUgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB0aGUgbGFzdCBvbmUgY2FsbGVkIG9uIGEgZ2l2ZW4KKyAgICAgKiBpbnN0YW5jZSBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmICghc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJleHRlbmRlZEFjY2Vzc0xvZ1ZhbHZlLm5vdFN0YXJ0ZWQiKSk7CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RPUF9FVkVOVCwgbnVsbCk7CisgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTsKKworICAgICAgICBjbG9zZSgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZWNvZGUgdGhlIGdpdmVuIHBhdHRlcm4uIElzIHB1YmxpYyBzbyBhIHBhdHRlcm4gbWF5CisgICAgICogYWxsb3dzIHRvIGJlIHZhbGlkYXRlZC4KKyAgICAgKiBAcGFyYW0gZmllbGRzIFRoZSBwYXR0ZXJuIHRvIGRlY29kZQorICAgICAqIEByZXR1cm4gbnVsbCBvbiBlcnJvci4gIE90aGVyd2lzZSBhcnJheSBvZiBkZWNvZGVkIGZpZWxkcworICAgICAqLworICAgIHB1YmxpYyBGaWVsZEluZm9bXSBkZWNvZGVQYXR0ZXJuKFN0cmluZyBmaWVsZHMpIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoImRlY29kZVBhdHRlcm4sIGZpZWxkcz0iICsgZmllbGRzKTsKKworICAgICAgICBMaW5rZWRMaXN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOworCisgICAgICAgIC8vSWdub3JlIGxlYWRpbmcgd2hpdGVzcGFjZS4KKyAgICAgICAgaW50IGk9MDsKKyAgICAgICAgZm9yICg7aTxmaWVsZHMubGVuZ3RoKCkgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShmaWVsZHMuY2hhckF0KGkpKTtpKyspOworCisgICAgICAgIGlmIChpPj1maWVsZHMubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKCJmaWVsZHMgd2FzIGp1c3QgZW1wdHkgb3Igd2hpdGVzcGFjZSIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpbnQgajsKKyAgICAgICAgd2hpbGUoaTxmaWVsZHMubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoImZpZWxkcy5zdWJzdHJpbmcoaSk9IiArIGZpZWxkcy5zdWJzdHJpbmcoaSkpOworCisgICAgICAgICAgICBGaWVsZEluZm8gY3VycmVudEZpZWxkSW5mbyA9IG5ldyBGaWVsZEluZm8oKTsKKworCisgICAgICAgICAgICBpZiAoZmllbGRzLnN0YXJ0c1dpdGgoImRhdGUiLGkpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkSW5mby50eXBlID0gRmllbGRJbmZvLkRBVEFfU1BFQ0lBTDsKKyAgICAgICAgICAgICAgICBjdXJyZW50RmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLlNQRUNJQUxfREFURTsKKyAgICAgICAgICAgICAgICBpKz0iZGF0ZSIubGVuZ3RoKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkcy5zdGFydHNXaXRoKCJ0aW1lLXRha2VuIixpKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZEluZm8udHlwZSA9IEZpZWxkSW5mby5EQVRBX1NQRUNJQUw7CisgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkSW5mby5sb2NhdGlvbiA9IEZpZWxkSW5mby5TUEVDSUFMX1RJTUVfVEFLRU47CisgICAgICAgICAgICAgICAgaSs9InRpbWUtdGFrZW4iLmxlbmd0aCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZHMuc3RhcnRzV2l0aCgidGltZSIsaSkpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RmllbGRJbmZvLnR5cGUgPSBGaWVsZEluZm8uREFUQV9TUEVDSUFMOworICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uU1BFQ0lBTF9USU1FOworICAgICAgICAgICAgICAgIGkrPSJ0aW1lIi5sZW5ndGgoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRzLnN0YXJ0c1dpdGgoImJ5dGVzIixpKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZEluZm8udHlwZSA9IEZpZWxkSW5mby5EQVRBX1NQRUNJQUw7CisgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkSW5mby5sb2NhdGlvbiA9IEZpZWxkSW5mby5TUEVDSUFMX0JZVEVTOworICAgICAgICAgICAgICAgIGkrPSJieXRlcyIubGVuZ3RoKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkcy5zdGFydHNXaXRoKCJjYWNoZWQiLGkpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkSW5mby50eXBlID0gRmllbGRJbmZvLkRBVEFfU1BFQ0lBTDsKKyAgICAgICAgICAgICAgICBjdXJyZW50RmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLlNQRUNJQUxfQ0FDSEVEOworICAgICAgICAgICAgICAgIGkrPSJjYWNoZWQiLmxlbmd0aCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZHMuc3RhcnRzV2l0aCgiYy1pcCIsaSkpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RmllbGRJbmZvLnR5cGUgPSBGaWVsZEluZm8uREFUQV9DTElFTlQ7CisgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkSW5mby5sb2NhdGlvbiA9IEZpZWxkSW5mby5GSUVMRF9JUDsKKyAgICAgICAgICAgICAgICBpKz0iYy1pcCIubGVuZ3RoKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkcy5zdGFydHNXaXRoKCJjLWRucyIsaSkpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RmllbGRJbmZvLnR5cGUgPSBGaWVsZEluZm8uREFUQV9DTElFTlQ7CisgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkSW5mby5sb2NhdGlvbiA9IEZpZWxkSW5mby5GSUVMRF9ETlM7CisgICAgICAgICAgICAgICAgaSs9ImMtZG5zIi5sZW5ndGgoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRzLnN0YXJ0c1dpdGgoInMtaXAiLGkpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkSW5mby50eXBlID0gRmllbGRJbmZvLkRBVEFfU0VSVkVSOworICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uRklFTERfSVA7CisgICAgICAgICAgICAgICAgaSs9InMtaXAiLmxlbmd0aCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZHMuc3RhcnRzV2l0aCgicy1kbnMiLGkpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkSW5mby50eXBlID0gRmllbGRJbmZvLkRBVEFfU0VSVkVSOworICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uRklFTERfRE5TOworICAgICAgICAgICAgICAgIGkrPSJzLWRucyIubGVuZ3RoKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkcy5zdGFydHNXaXRoKCJjcyIsaSkpIHsKKyAgICAgICAgICAgICAgICBpID0gZGVjb2RlKGZpZWxkcywgaSsyLCBjdXJyZW50RmllbGRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkSW5mby5EQVRBX0NMSUVOVF9UT19TRVJWRVIpOworICAgICAgICAgICAgICAgIGlmIChpPDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZHMuc3RhcnRzV2l0aCgic2MiLGkpKSB7CisgICAgICAgICAgICAgICAgaSA9IGRlY29kZShmaWVsZHMsIGkrMiwgY3VycmVudEZpZWxkSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEluZm8uREFUQV9TRVJWRVJfVE9fQ0xJRU5UKTsKKyAgICAgICAgICAgICAgICBpZiAoaTwwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRzLnN0YXJ0c1dpdGgoInNyIixpKSkgeworICAgICAgICAgICAgICAgIGkgPSBkZWNvZGUoZmllbGRzLCBpKzIsIGN1cnJlbnRGaWVsZEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRJbmZvLkRBVEFfU0VSVkVSX1RPX1JTRVJWRVIpOworICAgICAgICAgICAgICAgIGlmIChpPDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZHMuc3RhcnRzV2l0aCgicnMiLGkpKSB7CisgICAgICAgICAgICAgICAgaSA9IGRlY29kZShmaWVsZHMsIGkrMiwgY3VycmVudEZpZWxkSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEluZm8uREFUQV9SU0VSVkVSX1RPX1NFUlZFUik7CisgICAgICAgICAgICAgICAgaWYgKGk8MCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkcy5zdGFydHNXaXRoKCJ4IixpKSkgeworICAgICAgICAgICAgICAgIGkgPSBkZWNvZGVBcHBTcGVjaWZpYyhmaWVsZHMsIGksIGN1cnJlbnRGaWVsZEluZm8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBVbmFibGUgdG8gZGVjb2RlIC4uLgorICAgICAgICAgICAgICAgIGxvZy5lcnJvcigidW5hYmxlIHRvIGRlY29kZSB3aXRoIHJlc3Qgb2YgY2hhcnMgYmVpbmc6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5zdWJzdHJpbmcoaSkpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCeSB0aGlzIHBvaW50IHdlIHNob3VsZCBoYXZlIHRoZSBmaWVsZCwgZ2V0IHRoZSB3aGl0ZXNwYWNlCisgICAgICAgICAgICBqPWk7CisgICAgICAgICAgICBmb3IgKDtqPGZpZWxkcy5sZW5ndGgoKSAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGZpZWxkcy5jaGFyQXQoaikpO2orKyk7CisKKyAgICAgICAgICAgIGlmIChqPj1maWVsZHMubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaj09aSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgLSBlbmQgb2Ygc3RyaW5nCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZEluZm8ucG9zdFdoaXRlU3BhY2UgPSAiIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmllbGRJbmZvLnBvc3RXaGl0ZVNwYWNlID0gZmllbGRzLnN1YnN0cmluZyhpKTsKKyAgICAgICAgICAgICAgICAgICAgaT1qOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkSW5mby5wb3N0V2hpdGVTcGFjZSA9IGZpZWxkcy5zdWJzdHJpbmcoaSxqKTsKKyAgICAgICAgICAgICAgICBpPWo7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxpc3QuYWRkKGN1cnJlbnRGaWVsZEluZm8pOworICAgICAgICB9CisKKyAgICAgICAgaT0wOworICAgICAgICBGaWVsZEluZm9bXSBmID0gbmV3IEZpZWxkSW5mb1tsaXN0LnNpemUoKV07CisgICAgICAgIGZvciAoSXRlcmF0b3IgayA9IGxpc3QuaXRlcmF0b3IoKTsgay5oYXNOZXh0KCk7KQorICAgICAgICAgICAgIGZbaSsrXSA9IChGaWVsZEluZm8pay5uZXh0KCk7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJmaW5pc2hlZCBkZWNvZGluZyB3aXRoIGxlbmd0aCBvZjogIiArIGkpOworCisgICAgICAgIHJldHVybiBmOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29kZSB0aGUgY3Mgb3Igc2MgZmllbGRzLgorICAgICAqIFJldHVybnMgbmVnYXRpdmUgb24gZXJyb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmllbGRzIFRoZSBwYXR0ZXJuIHRvIGRlY29kZQorICAgICAqIEBwYXJhbSBpIFRoZSBzdHJpbmcgaW5kZXggd2hlcmUgd2UgYXJlIGRlY29kaW5nLgorICAgICAqIEBwYXJhbSBmaWVsZEluZm8gV2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdHMKKyAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSB3ZSBhcmUgZGVjb2RpbmcuCisgICAgICogQHJldHVybiAtMSBvbiBlcnJvci4gT3RoZXJ3aXNlIHRoZSBuZXcgU3RyaW5nIGluZGV4LgorICAgICAqLworICAgIHByaXZhdGUgaW50IGRlY29kZShTdHJpbmcgZmllbGRzLCBpbnQgaSwgRmllbGRJbmZvIGZpZWxkSW5mbywgc2hvcnQgdHlwZSkgeworCisgICAgICAgIGlmIChmaWVsZHMuc3RhcnRzV2l0aCgiLXN0YXR1cyIsaSkpIHsKKyAgICAgICAgICAgIGZpZWxkSW5mby5sb2NhdGlvbiA9IEZpZWxkSW5mby5GSUVMRF9TVEFUVVM7CisgICAgICAgICAgICBpKz0iLXN0YXR1cyIubGVuZ3RoKCk7CisgICAgICAgIH0gZWxzZSBpZiAoZmllbGRzLnN0YXJ0c1dpdGgoIi1jb21tZW50IixpKSkgeworICAgICAgICAgICAgZmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLkZJRUxEX0NPTU1FTlQ7CisgICAgICAgICAgICBpKz0iLWNvbW1lbnQiLmxlbmd0aCgpOworICAgICAgICB9IGVsc2UgaWYgKGZpZWxkcy5zdGFydHNXaXRoKCItdXJpLXF1ZXJ5IixpKSkgeworICAgICAgICAgICAgZmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLkZJRUxEX1VSSV9RVUVSWTsKKyAgICAgICAgICAgIGkrPSItdXJpLXF1ZXJ5Ii5sZW5ndGgoKTsKKyAgICAgICAgfSBlbHNlIGlmIChmaWVsZHMuc3RhcnRzV2l0aCgiLXVyaS1zdGVtIixpKSkgeworICAgICAgICAgICAgZmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLkZJRUxEX1VSSV9TVEVNOworICAgICAgICAgICAgaSs9Ii11cmktc3RlbSIubGVuZ3RoKCk7CisgICAgICAgIH0gZWxzZSBpZiAoZmllbGRzLnN0YXJ0c1dpdGgoIi11cmkiLGkpKSB7CisgICAgICAgICAgICBmaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uRklFTERfVVJJOworICAgICAgICAgICAgaSs9Ii11cmkiLmxlbmd0aCgpOworICAgICAgICB9IGVsc2UgaWYgKGZpZWxkcy5zdGFydHNXaXRoKCItbWV0aG9kIixpKSkgeworICAgICAgICAgICAgZmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLkZJRUxEX01FVEhPRDsKKyAgICAgICAgICAgIGkrPSItbWV0aG9kIi5sZW5ndGgoKTsKKyAgICAgICAgfSBlbHNlIGlmIChmaWVsZHMuc3RhcnRzV2l0aCgiKCIsaSkpIHsKKyAgICAgICAgICAgIGZpZWxkSW5mby5sb2NhdGlvbiA9IEZpZWxkSW5mby5GSUVMRF9IRUFERVI7CisgICAgICAgICAgICBpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vdmUgcGFzdCB0aGUgKCAqLworICAgICAgICAgICAgaW50IGogPSBmaWVsZHMuaW5kZXhPZignKScsIGkpOworICAgICAgICAgICAgaWYgKGo9PS0xKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgZm91bmQgKi8KKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIk5vIGNsb3NpbmcgKSBmb3VuZCBmb3IgaW4gZGVjb2RlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmllbGRJbmZvLnZhbHVlID0gZmllbGRzLnN1YnN0cmluZyhpLGopOworICAgICAgICAgICAgaT1qKzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIHBvaW50ZXIgcGFzdCApICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlRoZSBuZXh0IGNoYXJhY3RlcnMgY291bGRuJ3QgYmUgZGVjb2RlZDogIiArIGZpZWxkcy5zdWJzdHJpbmcoaSkpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgZmllbGRJbmZvLnR5cGUgPSB0eXBlOworICAgICAgICByZXR1cm4gaTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICAqIERlY29kZSBhcHAgc3BlY2lmaWMgbG9nIGVudHJ5LgorICAgICAgKgorICAgICAgKiBTcGVjaWFsIGZpZWxkcyBhcmUgb2YgdGhlIGZvcm06CisgICAgICAqIHgtQyguLi4pIC0gRm9yIGNvb2tpZQorICAgICAgKiB4LUEoLi4uKSAtIFZhbHVlIGluIHNlcnZsZXRDb250ZXh0CisgICAgICAqIHgtUyguLi4pIC0gVmFsdWUgaW4gc2Vzc2lvbgorICAgICAgKiB4LVIoLi4uKSAtIFZhbHVlIGluIHNlcnZsZXRSZXF1ZXN0CisgICAgICAqIEBwYXJhbSBmaWVsZHMgVGhlIHBhdHRlcm4gdG8gZGVjb2RlCisgICAgICAqIEBwYXJhbSBpIFRoZSBzdHJpbmcgaW5kZXggd2hlcmUgd2UgYXJlIGRlY29kaW5nLgorICAgICAgKiBAcGFyYW0gZmllbGRJbmZvIFdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHRzCisgICAgICAqIEByZXR1cm4gLTEgb24gZXJyb3IuIE90aGVyd2lzZSB0aGUgbmV3IFN0cmluZyBpbmRleC4KKyAgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVjb2RlQXBwU3BlY2lmaWMoU3RyaW5nIGZpZWxkcywgaW50IGksIEZpZWxkSW5mbyBmaWVsZEluZm8pIHsKKworICAgICAgICBmaWVsZEluZm8udHlwZSA9IEZpZWxkSW5mby5EQVRBX0FQUF9TUEVDSUZJQzsKKyAgICAgICAgLyogTW92ZSBwYXN0ICd4LScgKi8KKyAgICAgICAgaSs9MjsKKworICAgICAgICBpZiAoaT49ZmllbGRzLmxlbmd0aCgpKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkVuZCBvZiBsaW5lIHJlYWNoZWQgYmVmb3JlIGRlY29kaW5nIHgtIHBhcmFtIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2goZmllbGRzLmNoYXJBdChpKSkgeworICAgICAgICAgICAgY2FzZSAnQSc6CisgICAgICAgICAgICAgICAgZmllbGRJbmZvLnhUeXBlID0gRmllbGRJbmZvLlhfQVBQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICAgICAgZmllbGRJbmZvLnhUeXBlID0gRmllbGRJbmZvLlhfQ09PS0lFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnUic6CisgICAgICAgICAgICAgICAgZmllbGRJbmZvLnhUeXBlID0gRmllbGRJbmZvLlhfUkVRVUVTVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1MnOgorICAgICAgICAgICAgICAgIGZpZWxkSW5mby54VHlwZSA9IEZpZWxkSW5mby5YX1NFU1NJT047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdIJzoKKyAgICAgICAgICAgICAgICBmaWVsZEluZm8ueFR5cGUgPSBGaWVsZEluZm8uWF9TRVJWTEVUX1JFUVVFU1Q7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICBmaWVsZEluZm8ueFR5cGUgPSBGaWVsZEluZm8uWF9QQVJBTUVURVI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHRlc3QgdGhhdCBuZXh0IGNoYXIgaXMgYSAoICovCisgICAgICAgIGlmIChpKzEhPWZpZWxkcy5pbmRleE9mKCcoJyxpKSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJ4IHBhcmFtIGluIHdyb25nIGZvcm1hdC4gTmVlZHMgdG8gYmUgJ3gtIyguLi4pJyByZWFkIHRoZSBkb2NzISIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGkrPTI7IC8qIE1vdmUgaW5zaWRlIG9mIHRoZSAoKSAqLworCisgICAgICAgIC8qIExvb2sgZm9yIGVuZGluZyApIGFuZCByZXR1cm4gZXJyb3IgaWYgbm90IGZvdW5kLiAqLworICAgICAgICBpbnQgaiA9IGZpZWxkcy5pbmRleE9mKCcpJyxpKTsKKyAgICAgICAgaWYgKGo9PS0xKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoInggcGFyYW0gaW4gd3JvbmcgZm9ybWF0LiBObyBjbG9zaW5nICcpJyEiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGZpZWxkSW5mby52YWx1ZSA9IGZpZWxkcy5zdWJzdHJpbmcoaSxqKTsKKworICAgICAgICBpZiAoZmllbGRJbmZvLnhUeXBlID09IEZpZWxkSW5mby5YX1NFUlZMRVRfUkVRVUVTVCkgeworICAgICAgICAgICAgaWYgKCJhdXRoVHlwZSIuZXF1YWxzKGZpZWxkSW5mby52YWx1ZSkpeworICAgICAgICAgICAgICAgIGZpZWxkSW5mby5sb2NhdGlvbiA9IEZpZWxkSW5mby5YX0xPQ19BVVRIVFlQRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoInJlbW90ZVVzZXIiLmVxdWFscyhmaWVsZEluZm8udmFsdWUpKXsKKyAgICAgICAgICAgICAgICBmaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uWF9MT0NfUkVNT1RFVVNFUjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoInJlcXVlc3RlZFNlc3Npb25JZCIuZXF1YWxzKGZpZWxkSW5mby52YWx1ZSkpeworICAgICAgICAgICAgICAgIGZpZWxkSW5mby5sb2NhdGlvbiA9IEZpZWxkSW5mby5YX0xPQ19SRVFVRVNURURTRVNTSU9OSUQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJyZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tQ29va2llIi5lcXVhbHMoZmllbGRJbmZvLnZhbHVlKSl7CisgICAgICAgICAgICAgICAgZmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLlhfTE9DX1JFUVVFU1RFRFNFU1NJT05JREZST01DT09LSUU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJyZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZCIuZXF1YWxzKGZpZWxkSW5mby52YWx1ZSkpeworICAgICAgICAgICAgICAgIGZpZWxkSW5mby5sb2NhdGlvbiA9IEZpZWxkSW5mby5YX0xPQ19SRVFVRVNURURTRVNTSU9OSURWQUxJRDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImNvbnRlbnRMZW5ndGgiLmVxdWFscyhmaWVsZEluZm8udmFsdWUpKXsKKyAgICAgICAgICAgICAgICBmaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uWF9MT0NfQ09OVEVOVExFTkdUSDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImNoYXJhY3RlckVuY29kaW5nIi5lcXVhbHMoZmllbGRJbmZvLnZhbHVlKSl7CisgICAgICAgICAgICAgICAgZmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLlhfTE9DX0NIQVJBQ1RFUkVOQ09ESU5HOworICAgICAgICAgICAgfSBlbHNlIGlmICgibG9jYWxlIi5lcXVhbHMoZmllbGRJbmZvLnZhbHVlKSl7CisgICAgICAgICAgICAgICAgZmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLlhfTE9DX0xPQ0FMRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoInByb3RvY29sIi5lcXVhbHMoZmllbGRJbmZvLnZhbHVlKSl7CisgICAgICAgICAgICAgICAgZmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLlhfTE9DX1BST1RPQ09MOworICAgICAgICAgICAgfSBlbHNlIGlmICgic2NoZW1lIi5lcXVhbHMoZmllbGRJbmZvLnZhbHVlKSl7CisgICAgICAgICAgICAgICAgZmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLlhfTE9DX1NDSEVNRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoInNlY3VyZSIuZXF1YWxzKGZpZWxkSW5mby52YWx1ZSkpeworICAgICAgICAgICAgICAgIGZpZWxkSW5mby5sb2NhdGlvbiA9IEZpZWxkSW5mby5YX0xPQ19TRUNVUkU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigieCBwYXJhbSBmb3Igc2VydmxldCByZXF1ZXN0LCBjb3VsZG4ndCBkZWNvZGUgdmFsdWU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSW5mby5sb2NhdGlvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGorMTsKKworICAgIH0KKworCit9CisKKy8qKgorICogQSBzaW1wbGUgaGVscGVyIGZvciBkZWNvZGluZyB0aGUgcGF0dGVybi4KKyAqLworY2xhc3MgRmllbGRJbmZvIHsKKyAgICAvKgorICAgICAgIFRoZSBnb2FsIG9mIHRoZSBjb25zdGFudHMgbGlzdGVkIGJlbG93IGlzIHRvIG1ha2UgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgbG9nCisgICAgICAgZW50cnkgYXMgcXVpY2sgYXMgcG9zc2libGUgdmlhIG51bWVyY2kgZGVjb2RpbmdzIG9mIHRoZSBtZXRob2RzIHRvIGNhbGwgaW5zdGVhZAorICAgICAgIG9mIHBlcmZvcm1pbmcgbWFueSBTdHJpbmcgY29tcGFyaXNvbnMgb24gZWFjaCBsb2dnaW5nIHJlcXVlc3QuCisgICAgKi8KKworICAgIC8qIFdoZXJlIHRoZSBkYXRhIGlzIGxvY2F0ZWQuICovCisgICAgc3RhdGljIGZpbmFsIHNob3J0IERBVEFfQ0xJRU5UID0gMDsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgREFUQV9TRVJWRVIgPSAxOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBEQVRBX1JFTU9URSA9IDI7CisgICAgc3RhdGljIGZpbmFsIHNob3J0IERBVEFfQ0xJRU5UX1RPX1NFUlZFUiA9IDM7CisgICAgc3RhdGljIGZpbmFsIHNob3J0IERBVEFfU0VSVkVSX1RPX0NMSUVOVCA9IDQ7CisgICAgc3RhdGljIGZpbmFsIHNob3J0IERBVEFfU0VSVkVSX1RPX1JTRVJWRVIgPSA1OyAvKiBIZXJlIHRvIGhvbm9yIHRoZSBzcGVjLiAqLworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBEQVRBX1JTRVJWRVJfVE9fU0VSVkVSID0gNjsgLyogSGVyZSB0byBob25vciB0aGUgc3BlYy4gKi8KKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgREFUQV9BUFBfU1BFQ0lGSUMgPSA3OworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBEQVRBX1NQRUNJQUwgPSA4OworCisgICAgLyogVGhlIHR5cGUgb2Ygc3BlY2lhbCBmaWVsZHMuICovCisgICAgc3RhdGljIGZpbmFsIHNob3J0IFNQRUNJQUxfREFURSAgICAgICAgID0gMTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgU1BFQ0lBTF9USU1FX1RBS0VOICAgPSAyOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBTUEVDSUFMX1RJTUUgICAgICAgICA9IDM7CisgICAgc3RhdGljIGZpbmFsIHNob3J0IFNQRUNJQUxfQllURVMgICAgICAgID0gNDsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgU1BFQ0lBTF9DQUNIRUQgICAgICAgPSA1OworCisgICAgLyogV2hlcmUgdG8gcHVsbCB0aGUgZGF0YSBmb3IgcHJlZml4ZWQgdmFsdWVzICovCisgICAgc3RhdGljIGZpbmFsIHNob3J0IEZJRUxEX0lQICAgICAgICAgICAgPSAxOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBGSUVMRF9ETlMgICAgICAgICAgID0gMjsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgRklFTERfU1RBVFVTICAgICAgICA9IDM7CisgICAgc3RhdGljIGZpbmFsIHNob3J0IEZJRUxEX0NPTU1FTlQgICAgICAgPSA0OworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBGSUVMRF9NRVRIT0QgICAgICAgID0gNTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgRklFTERfVVJJICAgICAgICAgICA9IDY7CisgICAgc3RhdGljIGZpbmFsIHNob3J0IEZJRUxEX1VSSV9TVEVNICAgICAgPSA3OworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBGSUVMRF9VUklfUVVFUlkgICAgID0gODsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgRklFTERfSEVBREVSICAgICAgICA9IDk7CisKKworICAgIC8qIEFwcGxpY2F0aW9uIFNwZWNpZmljIHBhcmFtZXRlcnMgKi8KKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgWF9SRVFVRVNUID0gMTsgLyogRm9yIHggYXBwIHNwZWNpZmljICovCisgICAgc3RhdGljIGZpbmFsIHNob3J0IFhfU0VTU0lPTiA9IDI7IC8qIEZvciB4IGFwcCBzcGVjaWZpYyAqLworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBYX0NPT0tJRSAgPSAzOyAvKiBGb3IgeCBhcHAgc3BlY2lmaWMgKi8KKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgWF9BUFAgICAgID0gNDsgLyogRm9yIHggYXBwIHNwZWNpZmljICovCisgICAgc3RhdGljIGZpbmFsIHNob3J0IFhfU0VSVkxFVF9SRVFVRVNUID0gNTsgLyogRm9yIHggYXBwIHNwZWNpZmljICovCisgICAgc3RhdGljIGZpbmFsIHNob3J0IFhfUEFSQU1FVEVSID0gNjsgLyogRm9yIHggYXBwIHNwZWNpZmljICovCisKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgWF9MT0NfQVVUSFRZUEUgICAgICAgICAgICAgICAgICAgICAgID0gMTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgWF9MT0NfUkVNT1RFVVNFUiAgICAgICAgICAgICAgICAgICAgID0gMjsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgWF9MT0NfUkVRVUVTVEVEU0VTU0lPTklEICAgICAgICAgICAgID0gMzsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgWF9MT0NfUkVRVUVTVEVEU0VTU0lPTklERlJPTUNPT0tJRSAgID0gNDsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgWF9MT0NfUkVRVUVTVEVEU0VTU0lPTklEVkFMSUQgICAgICAgID0gNTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgWF9MT0NfQ09OVEVOVExFTkdUSCAgICAgICAgICAgICAgICAgID0gNjsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgWF9MT0NfQ0hBUkFDVEVSRU5DT0RJTkcgICAgICAgICAgICAgID0gNzsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgWF9MT0NfTE9DQUxFICAgICAgICAgICAgICAgICAgICAgICAgID0gODsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgWF9MT0NfUFJPVE9DT0wgICAgICAgICAgICAgICAgICAgICAgID0gOTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgWF9MT0NfU0NIRU1FICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA7CisgICAgc3RhdGljIGZpbmFsIHNob3J0IFhfTE9DX1NFQ1VSRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDExOworCisKKworICAgIC8qKiBUaGUgZmllbGQgdHlwZSAqLworICAgIHNob3J0IHR5cGU7CisKKyAgICAvKiogV2hlcmUgdG8gcHVsbCB0aGUgZGF0YSBmcm9tPyBJY2t5IHZhcmlhYmxlIG5hbWUuICovCisgICAgc2hvcnQgbG9jYXRpb247CisKKyAgICAvKiogVGhlIHgtIHNwZWNpZmljIHBsYWNlIHRvIHB1bGwgdGhlIGRhdGEgZnJvbS4gKi8KKyAgICBzaG9ydCB4VHlwZTsKKworICAgIC8qKiBUaGUgZmllbGQgdmFsdWUgaWYgbmVlZGVkLiBOZWVkZWQgZm9yIGhlYWRlcnMgYW5kIGFwcCBzcGVjaWZpYy4gKi8KKyAgICBTdHJpbmcgdmFsdWU7CisKKyAgICAvKiogQW55IHdoaXRlIHNwYWNlIGFmdGVyIHRoaXMgZmllbGQ/IFB1dCBpdCBoZXJlLiAqLworICAgIFN0cmluZyBwb3N0V2hpdGVTcGFjZSA9IG51bGw7CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvRmFzdENvbW1vbkFjY2Vzc0xvZ1ZhbHZlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0Zhc3RDb21tb25BY2Nlc3NMb2dWYWx2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjM3MjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0Zhc3RDb21tb25BY2Nlc3NMb2dWYWx2ZS5qYXZhCkBAIC0wLDAgKzEsODQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzOworCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkxpZmVjeWNsZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGI+VmFsdmU8L2I+IGludGVyZmFjZSB0aGF0IGdlbmVyYXRlcyBhIHdlYiBzZXJ2ZXIKKyAqIGFjY2VzcyBsb2cgd2l0aCB0aGUgZGV0YWlsZWQgbGluZSBjb250ZW50cyBtYXRjaGluZyBlaXRoZXIgdGhlIGNvbW1vbiBvcgorICogY29tYmluZWQgcGF0dGVybnMuICBBcyBhbiBhZGRpdGlvbmFsIGZlYXR1cmUsIGF1dG9tYXRpYyByb2xsb3ZlciBvZiBsb2cgZmlsZXMKKyAqIHdoZW4gdGhlIGRhdGUgY2hhbmdlcyBpcyBhbHNvIHN1cHBvcnRlZC48L3A+CisgKiA8cD4KKyAqIENvbmRpdGlvbmFsIGxvZ2dpbmcgaXMgYWxzbyBzdXBwb3J0ZWQuIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCB0aGUKKyAqIDxjb2RlPmNvbmRpdGlvbjwvY29kZT4gcHJvcGVydHkuCisgKiBJZiB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBTZXJ2bGV0UmVxdWVzdC5nZXRBdHRyaWJ1dGUoY29uZGl0aW9uKQorICogeWllbGRzIGEgbm9uLW51bGwgdmFsdWUuIFRoZSBsb2dnaW5nIHdpbGwgYmUgc2tpcHBlZC4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgSmFzb24gQnJpdHRhaW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEZhc3RDb21tb25BY2Nlc3NMb2dWYWx2ZQorICAgIGV4dGVuZHMgVmFsdmVCYXNlCisgICAgaW1wbGVtZW50cyBMaWZlY3ljbGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBkZWZhdWx0IHByb3BlcnR5IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmFzdENvbW1vbkFjY2Vzc0xvZ1ZhbHZlKCkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHNldFBhdHRlcm4oImNvbW1vbiIpOworCisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXMtb2YgZGF0ZSBmb3IgdGhlIGN1cnJlbnRseSBvcGVuIGxvZyBmaWxlLCBvciBhIHplcm8tbGVuZ3RoCisgICAgICogc3RyaW5nIGlmIHRoZXJlIGlzIG5vIG9wZW4gbG9nIGZpbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGF0ZVN0YW1wID0gIiI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggbG9nIGZpbGVzIGFyZSBjcmVhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRpcmVjdG9yeSA9ICJsb2dzIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5GYXN0Q29tbW9uQWNjZXNzTG9nVmFsdmUvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGxpZmVjeWNsZSBldmVudCBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlmZWN5Y2xlU3VwcG9ydCBsaWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBtb250aCBhYmJyZXZpYXRpb25zIGZvciBsb2cgbWVzc2FnZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgbW9udGhzW10gPQorICAgIHsgIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKKyAgICAgICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyIgfTsKKworCisgICAgLyoqCisgICAgICogRm9yIHRoZSBjb21iaW5lZCBmb3JtYXQgKGNvbW1vbiwgcGx1cyB1c2VyYWdlbnQgYW5kIHJlZmVyZXIpLCB3ZSBkbworICAgICAqIHRoZSBzYW1lCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbWJpbmVkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFRoZSBwYXR0ZXJuIHVzZWQgdG8gZm9ybWF0IG91ciBhY2Nlc3MgbG9nIGxpbmVzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm4gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJlZml4IHRoYXQgaXMgYWRkZWQgdG8gbG9nIGZpbGUgZmlsZW5hbWVzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeCA9ICJhY2Nlc3NfbG9nLiI7CisKKworICAgIC8qKgorICAgICAqIFNob3VsZCB3ZSByb3RhdGUgb3VyIGxvZyBmaWxlPyBEZWZhdWx0IGlzIHRydWUgKGxpa2Ugb2xkIGJlaGF2aW9yKQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiByb3RhdGFibGUgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhpcyBjb21wb25lbnQgYmVlbiBzdGFydGVkIHlldD8KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3VmZml4IHRoYXQgaXMgYWRkZWQgdG8gbG9nIGZpbGUgZmlsZW5hbWVzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHN1ZmZpeCA9ICIiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgUHJpbnRXcml0ZXIgdG8gd2hpY2ggd2UgYXJlIGN1cnJlbnRseSBsb2dnaW5nLCBpZiBhbnkuCisgICAgICovCisgICAgcHJpdmF0ZSBQcmludFdyaXRlciB3cml0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBIGRhdGUgZm9ybWF0dGVyIHRvIGZvcm1hdCBhIERhdGUgaW50byBhIGRhdGUgaW4gdGhlIGZvcm1hdAorICAgICAqICJ5eXl5LU1NLWRkIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdHRlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEEgZGF0ZSBmb3JtYXR0ZXIgdG8gZm9ybWF0IERhdGVzIGludG8gYSBkYXkgc3RyaW5nIGluIHRoZSBmb3JtYXQKKyAgICAgKiAiZGQiLgorICAgICAqLworICAgIHByaXZhdGUgU2ltcGxlRGF0ZUZvcm1hdCBkYXlGb3JtYXR0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBIGRhdGUgZm9ybWF0dGVyIHRvIGZvcm1hdCBhIERhdGUgaW50byBhIG1vbnRoIHN0cmluZyBpbiB0aGUgZm9ybWF0CisgICAgICogIk1NIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNpbXBsZURhdGVGb3JtYXQgbW9udGhGb3JtYXR0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBIGRhdGUgZm9ybWF0dGVyIHRvIGZvcm1hdCBhIERhdGUgaW50byBhIHllYXIgc3RyaW5nIGluIHRoZSBmb3JtYXQKKyAgICAgKiAieXl5eSIuCisgICAgICovCisgICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IHllYXJGb3JtYXR0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBIGRhdGUgZm9ybWF0dGVyIHRvIGZvcm1hdCBhIERhdGUgaW50byBhIHRpbWUgaW4gdGhlIGZvcm1hdAorICAgICAqICJrazptbTpzcyIgKGtrIGlzIGEgMjQtaG91ciByZXByZXNlbnRhdGlvbiBvZiB0aGUgaG91cikuCisgICAgICovCisgICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IHRpbWVGb3JtYXR0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3lzdGVtIHRpbWV6b25lLgorICAgICAqLworICAgIHByaXZhdGUgVGltZVpvbmUgdGltZXpvbmUgPSBudWxsOworCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgem9uZSBvZmZzZXQgcmVsYXRpdmUgdG8gR01UIGluIHRleHQgZm9ybSB3aGVuIGRheWxpZ2h0IHNhdmluZworICAgICAqIGlzIG5vdCBpbiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdGltZVpvbmVOb0RTVCA9IG51bGw7CisgCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgem9uZSBvZmZzZXQgcmVsYXRpdmUgdG8gR01UIGluIHRleHQgZm9ybSB3aGVuIGRheWxpZ2h0IHNhdmluZworICAgICAqIGlzIGluIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0aW1lWm9uZURTVCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzeXN0ZW0gdGltZSB3aGVuIHdlIGxhc3QgdXBkYXRlZCB0aGUgRGF0ZSB0aGF0IHRoaXMgdmFsdmUKKyAgICAgKiB1c2VzIGZvciBsb2cgbGluZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY3VycmVudERhdGVTdHJpbmcgPSBudWxsOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBpbnN0YW50IHdoZXJlIHRoZSBkYXRlIHN0cmluZyB3YXMgbGFzdCB1cGRhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBjdXJyZW50RGF0ZSA9IDBMOworCisKKyAgICAvKioKKyAgICAgKiBXaGVuIGZvcm1hdHRpbmcgbG9nIGxpbmVzLCB3ZSBvZnRlbiB1c2Ugc3RyaW5ncyBsaWtlIHRoaXMgb25lICgiICIpLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNwYWNlID0gIiAiOworCisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIGhvc3RzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiByZXNvbHZlSG9zdHMgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogQXJlIHdlIGRvaW5nIGNvbmRpdGlvbmFsIGxvZ2dpbmcuIGRlZmF1bHQgZmFsc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29uZGl0aW9uID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRGF0ZSBmb3JtYXQgdG8gcGxhY2UgaW4gbG9nIGZpbGUgbmFtZS4gVXNlIGF0IHlvdXIgb3duIHJpc2shCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZURhdGVGb3JtYXQgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggd2UgY3JlYXRlIGxvZyBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERpcmVjdG9yeSgpIHsKKworICAgICAgICByZXR1cm4gKGRpcmVjdG9yeSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHdlIGNyZWF0ZSBsb2cgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyZWN0b3J5IFRoZSBuZXcgbG9nIGZpbGUgZGlyZWN0b3J5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnkpIHsKKworICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZm9ybWF0IHBhdHRlcm4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5wYXR0ZXJuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmb3JtYXQgcGF0dGVybiwgZmlyc3QgdHJhbnNsYXRpbmcgYW55IHJlY29nbml6ZWQgYWxpYXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBUaGUgbmV3IHBhdHRlcm4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7CisKKyAgICAgICAgaWYgKHBhdHRlcm4gPT0gbnVsbCkKKyAgICAgICAgICAgIHBhdHRlcm4gPSAiIjsKKyAgICAgICAgaWYgKHBhdHRlcm4uZXF1YWxzKENvbnN0YW50cy5BY2Nlc3NMb2cuQ09NTU9OX0FMSUFTKSkKKyAgICAgICAgICAgIHBhdHRlcm4gPSBDb25zdGFudHMuQWNjZXNzTG9nLkNPTU1PTl9QQVRURVJOOworICAgICAgICBpZiAocGF0dGVybi5lcXVhbHMoQ29uc3RhbnRzLkFjY2Vzc0xvZy5DT01CSU5FRF9BTElBUykpCisgICAgICAgICAgICBwYXR0ZXJuID0gQ29uc3RhbnRzLkFjY2Vzc0xvZy5DT01CSU5FRF9QQVRURVJOOworICAgICAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOworCisgICAgICAgIGlmICh0aGlzLnBhdHRlcm4uZXF1YWxzKENvbnN0YW50cy5BY2Nlc3NMb2cuQ09NQklORURfUEFUVEVSTikpCisgICAgICAgICAgICBjb21iaW5lZCA9IHRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbWJpbmVkID0gZmFsc2U7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9nIGZpbGUgcHJlZml4LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgeworCisgICAgICAgIHJldHVybiAocHJlZml4KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2cgZmlsZSBwcmVmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFRoZSBuZXcgbG9nIGZpbGUgcHJlZml4CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHsKKworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIHJvdGF0ZSB0aGUgbG9ncworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUm90YXRhYmxlKCkgeworCisgICAgICAgIHJldHVybiByb3RhdGFibGU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgaXMgd2Ugc2hvdWxkIHdlIHJvdGF0ZSB0aGUgbG9ncworICAgICAqCisgICAgICogQHBhcmFtIHJvdGF0YWJsZSB0cnVlIGlzIHdlIHNob3VsZCByb3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um90YXRhYmxlKGJvb2xlYW4gcm90YXRhYmxlKSB7CisKKyAgICAgICAgdGhpcy5yb3RhdGFibGUgPSByb3RhdGFibGU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9nIGZpbGUgc3VmZml4LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VmZml4KCkgeworCisgICAgICAgIHJldHVybiAoc3VmZml4KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2cgZmlsZSBzdWZmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3VmZml4IFRoZSBuZXcgbG9nIGZpbGUgc3VmZml4CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3VmZml4KFN0cmluZyBzdWZmaXgpIHsKKworICAgICAgICB0aGlzLnN1ZmZpeCA9IHN1ZmZpeDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXNvbHZlIGhvc3RzIGZsYWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb2x2ZUhvc3RzIFRoZSBuZXcgcmVzb2x2ZSBob3N0cyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmVIb3N0cyhib29sZWFuIHJlc29sdmVIb3N0cykgeworCisgICAgICAgIHRoaXMucmVzb2x2ZUhvc3RzID0gcmVzb2x2ZUhvc3RzOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSByZXNvbHZlIGhvc3RzIGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlSG9zdHMoKSB7CisKKyAgICAgICAgcmV0dXJuIHJlc29sdmVIb3N0czsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGxvb2sgZm9yIHdoZW4KKyAgICAgKiBwZXJmb3JtaW5nIGNvbmRpdGlvbmFsIGxvZ2dnaW5nLiBJZiBudWxsLCBldmVyeQorICAgICAqIHJlcXVlc3QgaXMgbG9nZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZGl0aW9uKCkgeworCisgICAgICAgIHJldHVybiBjb25kaXRpb247CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgU2VydmxldFJlcXVlc3QuYXR0cmlidXRlIHRvIGxvb2sgZm9yIHRvIHBlcmZvcm0KKyAgICAgKiBjb25kaXRpb25hbCBsb2dnaW5nLiBTZXQgdG8gbnVsbCB0byBsb2cgZXZlcnl0aGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25kaXRpb24gU2V0IHRvIG51bGwgdG8gbG9nIGV2ZXJ5dGhpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25kaXRpb24oU3RyaW5nIGNvbmRpdGlvbikgeworCisgICAgICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOworCisgICAgfQorCisgICAgLyoqCisgICAgICogIFJldHVybiB0aGUgZGF0ZSBmb3JtYXQgZGF0ZSBiYXNlZCBsb2cgcm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlRGF0ZUZvcm1hdCgpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVEYXRlRm9ybWF0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogIFNldCB0aGUgZGF0ZSBmb3JtYXQgZGF0ZSBiYXNlZCBsb2cgcm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZURhdGVGb3JtYXQoU3RyaW5nIGZpbGVEYXRlRm9ybWF0KSB7CisgICAgICAgIHRoaXMuZmlsZURhdGVGb3JtYXQgPSAgZmlsZURhdGVGb3JtYXQ7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgYSBwZXJpb2RpYyB0YXNrLCBzdWNoIGFzIHJlbG9hZGluZywgZXRjLiBUaGlzIG1ldGhvZCB3aWxsIGJlCisgICAgICogaW52b2tlZCBpbnNpZGUgdGhlIGNsYXNzbG9hZGluZyBjb250ZXh0IG9mIHRoaXMgY29udGFpbmVyLiBVbmV4cGVjdGVkCisgICAgICogdGhyb3dhYmxlcyB3aWxsIGJlIGNhdWdodCBhbmQgbG9nZ2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJhY2tncm91bmRQcm9jZXNzKCkgeworICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpCisgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExvZyBhIG1lc3NhZ2Ugc3VtbWFyaXppbmcgdGhlIHNwZWNpZmllZCByZXF1ZXN0IGFuZCByZXNwb25zZSwgYWNjb3JkaW5nCisgICAgICogdG8gdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnBhdHRlcm48L2NvZGU+IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2UgYmVpbmcgcHJvY2Vzc2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBoYXMgb2NjdXJyZWQKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFBhc3MgdGhpcyByZXF1ZXN0IG9uIHRvIHRoZSBuZXh0IHZhbHZlIGluIG91ciBwaXBlbGluZQorICAgICAgICBnZXROZXh0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgICAgICBpZiAoY29uZGl0aW9uIT1udWxsICYmCisgICAgICAgICAgICAgICAgbnVsbCE9cmVxdWVzdC5nZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlKGNvbmRpdGlvbikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBsb2cgdXNpbmcgdGhlICJjb21tb24iIGFjY2VzcyBsb2cgcGF0dGVybgorICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOworICAgICAgICAKKyAgICAgICAgaWYgKGlzUmVzb2x2ZUhvc3RzKCkpCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHJlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChyZXF1ZXN0LmdldFJlbW90ZUFkZHIoKSk7CisgICAgICAgIAorICAgICAgICByZXN1bHQuYXBwZW5kKCIgLSAiKTsKKyAgICAgICAgCisgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRSZW1vdGVVc2VyKCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLSAiKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3BhY2UpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXN1bHQuYXBwZW5kKGdldEN1cnJlbnREYXRlU3RyaW5nKCkpOworICAgICAgICAKKyAgICAgICAgcmVzdWx0LmFwcGVuZChyZXF1ZXN0LmdldE1ldGhvZCgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChzcGFjZSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICBpZiAocmVxdWVzdC5nZXRRdWVyeVN0cmluZygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJz8nKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocmVxdWVzdC5nZXRRdWVyeVN0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKHNwYWNlKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChyZXF1ZXN0LmdldFByb3RvY29sKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJcIiAiKTsKKyAgICAgICAgCisgICAgICAgIHJlc3VsdC5hcHBlbmQocmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICAKKyAgICAgICAgcmVzdWx0LmFwcGVuZChzcGFjZSk7CisgICAgICAgIAorICAgICAgICBpbnQgbGVuZ3RoID0gcmVzcG9uc2UuZ2V0Q29udGVudENvdW50KCk7CisgICAgICAgIAorICAgICAgICBpZiAobGVuZ3RoIDw9IDApCisgICAgICAgICAgICB2YWx1ZSA9ICItIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFsdWUgPSAiIiArIGxlbmd0aDsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCh2YWx1ZSk7CisgICAgICAgIAorICAgICAgICBpZiAoY29tYmluZWQpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3BhY2UpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgIFN0cmluZyByZWZlcmVyID0gcmVxdWVzdC5nZXRIZWFkZXIoInJlZmVyZXIiKTsKKyAgICAgICAgICAgIGlmKHJlZmVyZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHJlZmVyZXIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlwiIik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3BhY2UpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgIFN0cmluZyB1YSA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJ1c2VyLWFnZW50Iik7CisgICAgICAgICAgICBpZih1YSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodWEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlwiIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGxvZyhyZXN1bHQudG9TdHJpbmcoKSk7CisgICAgICAgIAorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBjdXJyZW50bHkgb3BlbiBsb2cgZmlsZSAoaWYgYW55KQorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB7CisKKyAgICAgICAgaWYgKHdyaXRlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgIHdyaXRlciA9IG51bGw7CisgICAgICAgIGRhdGVTdGFtcCA9ICIiOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlIHRvIHRoZSBsb2cgZmlsZSwgc3dpdGNoaW5nIGZpbGVzIGlmIHRoZSBkYXRlCisgICAgICogaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIGxvZyBjYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZSB0byBiZSBsb2dnZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKKworICAgICAgICAvLyBMb2cgdGhpcyBtZXNzYWdlCisgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtb250aCBhYmJyZXZpYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgbW9udGgsIHdoaWNoIG11c3QKKyAgICAgKiBiZSBhIHR3by1kaWdpdCBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9udGggTW9udGggbnVtYmVyICgiMDEiIC4uICIxMiIpLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGxvb2t1cChTdHJpbmcgbW9udGgpIHsKKworICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbmRleCA9IEludGVnZXIucGFyc2VJbnQobW9udGgpIC0gMTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGluZGV4ID0gMDsgIC8vIENhbiBub3QgaGFwcGVuLCBpbiB0aGVvcnkKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG1vbnRoc1tpbmRleF0pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSBuZXcgbG9nIGZpbGUgZm9yIHRoZSBkYXRlIHNwZWNpZmllZCBieSA8Y29kZT5kYXRlU3RhbXA8L2NvZGU+LgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgb3BlbigpIHsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGRpcmVjdG9yeSBpZiBuZWNlc3NhcnkKKyAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShkaXJlY3RvcnkpOworICAgICAgICBpZiAoIWRpci5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICBkaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwgZGlyZWN0b3J5KTsKKyAgICAgICAgZGlyLm1rZGlycygpOworCisgICAgICAgIC8vIE9wZW4gdGhlIGN1cnJlbnQgbG9nIGZpbGUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRobmFtZTsKKyAgICAgICAgICAgIC8vIElmIG5vIHJvdGF0ZSAtIG5vIG5lZWQgZm9yIGRhdGVTdGFtcCBpbiBmaWxlTmFtZQorICAgICAgICAgICAgaWYgKHJvdGF0YWJsZSl7CisgICAgICAgICAgICAgICAgcGF0aG5hbWUgPSBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgZGF0ZVN0YW1wICsgc3VmZml4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXRobmFtZSA9IGRpci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyBzdWZmaXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEJ1ZmZlcmVkV3JpdGVyCisgICAgICAgICAgICAgICAgICAgIChuZXcgRmlsZVdyaXRlcihwYXRobmFtZSwgdHJ1ZSksIDEyODAwMCksIGZhbHNlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgRGF0ZSBvYmplY3QgdGhhdCBpcyBhY2N1cmF0ZSB0byB3aXRoaW4gb25lCisgICAgICogc2Vjb25kLiAgSWYgYSB0aHJlYWQgY2FsbHMgdGhpcyBtZXRob2QgdG8gZ2V0IGEgRGF0ZSBhbmQgaXQncyBiZWVuCisgICAgICogbGVzcyB0aGFuIDEgc2Vjb25kIHNpbmNlIGEgbmV3IERhdGUgd2FzIGNyZWF0ZWQsIHRoaXMgbWV0aG9kCisgICAgICogc2ltcGx5IGdpdmVzIG91dCB0aGUgc2FtZSBEYXRlIGFnYWluIHNvIHRoYXQgdGhlIHN5c3RlbSBkb2Vzbid0CisgICAgICogc3BlbmQgdGltZSBjcmVhdGluZyBEYXRlIG9iamVjdHMgdW5uZWNlc3NhcmlseS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gRGF0ZQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldEN1cnJlbnREYXRlU3RyaW5nKCkgeworICAgICAgICAvLyBPbmx5IGNyZWF0ZSBhIG5ldyBEYXRlIG9uY2UgcGVyIHNlY29uZCwgbWF4LgorICAgICAgICBsb25nIHN5c3RpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgaWYgKChzeXN0aW1lIC0gY3VycmVudERhdGUpID4gMTAwMCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgY2FyZSBhYm91dCBiZWluZyBleGFjdCBoZXJlOiBpZiBhbiBlbnRyeSBkb2VzIGdldAorICAgICAgICAgICAgICAgIC8vIGxvZ2dlZCBhcyBoYXZpbmcgaGFwcGVuZWQgZHVyaW5nIHRoZSBwcmV2aW91cyBzZWNvbmQKKyAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIG5vdCBtYWtlIGFueSBkaWZmZXJlbmNlCisgICAgICAgICAgICAgICAgaWYgKChzeXN0aW1lIC0gY3VycmVudERhdGUpID4gMTAwMCkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIEZvcm1hdCB0aGUgbmV3IGRhdGUKKyAgICAgICAgICAgICAgICAgICAgRGF0ZSBkYXRlID0gbmV3IERhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoMzIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJbIik7CisgICAgICAgICAgICAgICAgICAgIC8vIERheQorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGRheUZvcm1hdHRlci5mb3JtYXQoZGF0ZSkpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcvJyk7CisgICAgICAgICAgICAgICAgICAgIC8vIE1vbnRoCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobG9va3VwKG1vbnRoRm9ybWF0dGVyLmZvcm1hdChkYXRlKSkpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcvJyk7CisgICAgICAgICAgICAgICAgICAgIC8vIFllYXIKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh5ZWFyRm9ybWF0dGVyLmZvcm1hdChkYXRlKSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJzonKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGltZQorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRpbWVGb3JtYXR0ZXIuZm9ybWF0KGRhdGUpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzcGFjZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRpbWUgem9uZQorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGdldFRpbWVab25lKGRhdGUpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXSBcIiIpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGxvZyByb3RhdGlvbgorICAgICAgICAgICAgICAgICAgICBpZiAocm90YXRhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgYSBjaGFuZ2Ugb2YgZGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRzRGF0ZSA9IGRhdGVGb3JtYXR0ZXIuZm9ybWF0KGRhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGRhdGUgaGFzIGNoYW5nZWQsIHN3aXRjaCBsb2cgZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0ZVN0YW1wLmVxdWFscyh0c0RhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0ZVN0YW1wLmVxdWFscyh0c0RhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZVN0YW1wID0gdHNEYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZVN0cmluZyA9IHJlc3VsdC50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZSA9IGRhdGUuZ2V0VGltZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudERhdGVTdHJpbmc7CisgICAgfQorCisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRUaW1lWm9uZShEYXRlIGRhdGUpIHsKKyAgICAgICAgaWYgKHRpbWV6b25lLmluRGF5bGlnaHRUaW1lKGRhdGUpKSB7CisgICAgICAgICAgICByZXR1cm4gdGltZVpvbmVEU1Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdGltZVpvbmVOb0RTVDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyBjYWxjdWxhdGVUaW1lWm9uZU9mZnNldChsb25nIG9mZnNldCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgdHogPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGlmICgob2Zmc2V0PDApKSAgeworICAgICAgICAgICAgdHouYXBwZW5kKCItIik7CisgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHouYXBwZW5kKCIrIik7CisgICAgICAgIH0KKworICAgICAgICBsb25nIGhvdXJPZmZzZXQgPSBvZmZzZXQvKDEwMDAqNjAqNjApOworICAgICAgICBsb25nIG1pbnV0ZU9mZnNldCA9IChvZmZzZXQvKDEwMDAqNjApKSAlIDYwOworCisgICAgICAgIGlmIChob3VyT2Zmc2V0PDEwKQorICAgICAgICAgICAgdHouYXBwZW5kKCIwIik7CisgICAgICAgIHR6LmFwcGVuZChob3VyT2Zmc2V0KTsKKworICAgICAgICBpZiAobWludXRlT2Zmc2V0PDEwKQorICAgICAgICAgICAgdHouYXBwZW5kKCIwIik7CisgICAgICAgIHR6LmFwcGVuZChtaW51dGVPZmZzZXQpOworCisgICAgICAgIHJldHVybiB0ei50b1N0cmluZygpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlmZWN5Y2xlLiBJZiB0aGlzCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiBsaWZlY3ljbGUuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIDxjb2RlPmNvbmZpZ3VyZSgpPC9jb2RlPiwKKyAgICAgKiBhbmQgYmVmb3JlIGFueSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhlIGNvbXBvbmVudCBhcmUgdXRpbGl6ZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyB0aGlzIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmIChzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImFjY2Vzc0xvZ1ZhbHZlLmFscmVhZHlTdGFydGVkIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgdGltZVpvbmUsIERhdGUgZm9ybWF0dGVycywgYW5kIGN1cnJlbnREYXRlCisgICAgICAgIHRpbWV6b25lID0gVGltZVpvbmUuZ2V0RGVmYXVsdCgpOworICAgICAgICB0aW1lWm9uZU5vRFNUID0gY2FsY3VsYXRlVGltZVpvbmVPZmZzZXQodGltZXpvbmUuZ2V0UmF3T2Zmc2V0KCkpOworICAgICAgICBDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKHRpbWV6b25lKTsKKyAgICAgICAgaW50IG9mZnNldCA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5EU1RfT0ZGU0VUKTsKKyAgICAgICAgdGltZVpvbmVEU1QgPSBjYWxjdWxhdGVUaW1lWm9uZU9mZnNldCh0aW1lem9uZS5nZXRSYXdPZmZzZXQoKStvZmZzZXQpOworICAgICAgICAKKyAgICAgICAgaWYgKGZpbGVEYXRlRm9ybWF0PT1udWxsIHx8IGZpbGVEYXRlRm9ybWF0Lmxlbmd0aCgpPT0wKQorICAgICAgICAgICAgZmlsZURhdGVGb3JtYXQgPSAieXl5eS1NTS1kZCI7CisgICAgICAgIGRhdGVGb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChmaWxlRGF0ZUZvcm1hdCk7CisgICAgICAgIGRhdGVGb3JtYXR0ZXIuc2V0VGltZVpvbmUodGltZXpvbmUpOworICAgICAgICBkYXlGb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiZGQiKTsKKyAgICAgICAgZGF5Rm9ybWF0dGVyLnNldFRpbWVab25lKHRpbWV6b25lKTsKKyAgICAgICAgbW9udGhGb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiTU0iKTsKKyAgICAgICAgbW9udGhGb3JtYXR0ZXIuc2V0VGltZVpvbmUodGltZXpvbmUpOworICAgICAgICB5ZWFyRm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXkiKTsKKyAgICAgICAgeWVhckZvcm1hdHRlci5zZXRUaW1lWm9uZSh0aW1lem9uZSk7CisgICAgICAgIHRpbWVGb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiSEg6bW06c3MiKTsKKyAgICAgICAgdGltZUZvcm1hdHRlci5zZXRUaW1lWm9uZSh0aW1lem9uZSk7CisgICAgICAgIGN1cnJlbnREYXRlU3RyaW5nID0gZ2V0Q3VycmVudERhdGVTdHJpbmcoKTsKKyAgICAgICAgZGF0ZVN0YW1wID0gZGF0ZUZvcm1hdHRlci5mb3JtYXQobmV3IERhdGUoKSk7CisKKyAgICAgICAgb3BlbigpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHRlcm1pbmF0ZSB0aGUgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB0aGUgbGFzdCBvbmUgY2FsbGVkIG9uIGEgZ2l2ZW4KKyAgICAgKiBpbnN0YW5jZSBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmICghc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJhY2Nlc3NMb2dWYWx2ZS5ub3RTdGFydGVkIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUT1BfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gZmFsc2U7CisKKyAgICAgICAgY2xvc2UoKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvSkRCQ0FjY2Vzc0xvZ1ZhbHZlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0pEQkNBY2Nlc3NMb2dWYWx2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMDQzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0pEQkNBY2Nlc3NMb2dWYWx2ZS5qYXZhCkBAIC0wLDAgKzEsNjY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuRHJpdmVyOworaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkxpZmVjeWNsZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CisKKy8qKgorICogPHA+CisgKiBUaGlzIFRvbWNhdCBleHRlbnNpb24gbG9ncyBzZXJ2ZXIgYWNjZXNzIGRpcmVjdGx5IHRvIGEgZGF0YWJhc2UsIGFuZCBjYW4gCisgKiBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHJlZ3VsYXIgZmlsZS1iYXNlZCBhY2Nlc3MgbG9nIGltcGxlbWVudGVkIGluIAorICogQWNjZXNzTG9nVmFsdmUuCisgKiBUbyB1c2UsIGNvcHkgaW50byB0aGUgc2VydmVyL2NsYXNzZXMgZGlyZWN0b3J5IG9mIHRoZSBUb21jYXQgaW5zdGFsbGF0aW9uCisgKiBhbmQgY29uZmlndXJlIGluIHNlcnZlci54bWwgYXM6CisgKiA8cHJlPgorICogCQkmbHQ7VmFsdmUgY2xhc3NOYW1lPSJKREJDQWNjZXNzTG9nVmFsdmUiCisgKiAgICAgICAgCWRyaXZlck5hbWU9IjxpPnlvdXJfamRiY19kcml2ZXI8L2k+IgorICogICAgICAgIAljb25uZWN0aW9uVVJMPSI8aT55b3VyX2pkYmNfdXJsPC9pPiIKKyAqICAgICAgICAJcGF0dGVybj0iY29tYmluZWQiIHJlc29sdmVIb3N0cz0iZmFsc2UiCisgKiAJCS8mZ3Q7CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIDxwPgorICogTWFueSBwYXJhbWV0ZXJzIGNhbiBiZSBjb25maWd1cmVkLCBzdWNoIGFzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uICh3aXRoCisgKiA8Y29kZT5kcml2ZXJOYW1lPC9jb2RlPiBhbmQgPGNvZGU+Y29ubmVjdGlvblVSTDwvY29kZT4pLAorICogdGhlIHRhYmxlIG5hbWUgKDxjb2RlPnRhYmxlTmFtZTwvY29kZT4pCisgKiBhbmQgdGhlIGZpZWxkIG5hbWVzIChjb3JyZXNwb25kaW5nIHRvIHRoZSBnZXQvc2V0IG1ldGhvZCBuYW1lcykuCisgKiBUaGUgc2FtZSBvcHRpb25zIGFzIEFjY2Vzc0xvZ1ZhbHZlIGFyZSBzdXBwb3J0ZWQsIHN1Y2ggYXMKKyAqIDxjb2RlPnJlc29sdmVIb3N0czwvY29kZT4gYW5kIDxjb2RlPnBhdHRlcm48L2NvZGU+ICgiY29tbW9uIiBvciAiY29tYmluZWQiIAorICogb25seSkuCisgKiA8L3A+CisgKiA8cD4KKyAqIFdoZW4gVG9tY2F0IGlzIHN0YXJ0ZWQsIGEgZGF0YWJhc2UgY29ubmVjdGlvbiAod2l0aCBhdXRvUmVjb25uZWN0IG9wdGlvbikKKyAqIGlzIGNyZWF0ZWQgYW5kIHVzZWQgZm9yIGFsbCB0aGUgbG9nIGFjdGl2aXR5LiBXaGVuIFRvbWNhdCBpcyBzaHV0ZG93biwgdGhlCisgKiBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKyAqIFRoaXMgbG9nZ2VyIGNhbiBiZSB1c2VkIGF0IHRoZSBsZXZlbCBvZiB0aGUgRW5naW5lIGNvbnRleHQgKGJlaW5nIHNoYXJlZAorICogYnkgYWxsIHRoZSBkZWZpbmVkIGhvc3RzKSBvciB0aGUgSG9zdCBjb250ZXh0IChvbmUgaW5zdGFuY2Ugb2YgdGhlIGxvZ2dlciAKKyAqIHBlciBob3N0LCBwb3NzaWJseSB1c2luZyBkaWZmZXJlbnQgZGF0YWJhc2VzKS4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhlIGRhdGFiYXNlIHRhYmxlIGNhbiBiZSBjcmVhdGVkIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOgorICogPC9wPgorICogPHByZT4KKyAqIENSRUFURSBUQUJMRSBhY2Nlc3MgKAorICogaWQgSU5UIFVOU0lHTkVEIEFVVE9fSU5DUkVNRU5UIE5PVCBOVUxMLAorICogcmVtb3RlSG9zdCBDSEFSKDE1KSBOT1QgTlVMTCwKKyAqIHVzZXJOYW1lIENIQVIoMTUpLAorICogdGltZXN0YW1wIFRJTUVTVEFNUCBOT1QgTlVMTCwKKyAqIHZpcnR1YWxIb3N0IFZBUkNIQVIoNjQpIE5PVCBOVUxMLAorICogbWV0aG9kIFZBUkNIQVIoOCkgTk9UIE5VTEwsCisgKiBxdWVyeSBWQVJDSEFSKDI1NSkgTk9UIE5VTEwsCisgKiBzdGF0dXMgU01BTExJTlQgVU5TSUdORUQgTk9UIE5VTEwsCisgKiBieXRlcyBJTlQgVU5TSUdORUQgTk9UIE5VTEwsCisgKiByZWZlcmVyIFZBUkNIQVIoMTI4KSwKKyAqIHVzZXJBZ2VudCBWQVJDSEFSKDEyOCksCisgKiBQUklNQVJZIEtFWSAoaWQpLAorICogSU5ERVggKHRpbWVzdGFtcCksCisgKiBJTkRFWCAocmVtb3RlSG9zdCksCisgKiBJTkRFWCAodmlydHVhbEhvc3QpLAorICogSU5ERVggKHF1ZXJ5KSwKKyAqIElOREVYICh1c2VyQWdlbnQpCisgKiApOworICogPC9wcmU+CisgKiA8cD4KKyAqIElmIHRoZSB0YWJsZSBpcyBjcmVhdGVkIGFzIGFib3ZlLCBpdHMgbmFtZSBhbmQgdGhlIGZpZWxkIG5hbWVzIGRvbid0IG5lZWQgCisgKiB0byBiZSBkZWZpbmVkLgorICogPC9wPgorICogPHA+CisgKiBJZiB0aGUgcmVxdWVzdCBtZXRob2QgaXMgImNvbW1vbiIsIG9ubHkgdGhlc2UgZmllbGRzIGFyZSB1c2VkOgorICogPGNvZGU+cmVtb3RlSG9zdCwgdXNlciwgdGltZVN0YW1wLCBxdWVyeSwgc3RhdHVzLCBieXRlczwvY29kZT4KKyAqIDwvcD4KKyAqIDxwPgorICogPGk+VE8gRE86IHByb3ZpZGUgb3B0aW9uIGZvciBleGNsdWRpbmcgbG9nZ2luZyBvZiBjZXJ0YWluIE1JTUUgdHlwZXMuPC9pPgorICogPC9wPgorICogCisgKiBAYXV0aG9yIEFuZHJlIGRlIEplc3VzCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEpEQkNBY2Nlc3NMb2dWYWx2ZSAKKyAgICBleHRlbmRzIFZhbHZlQmFzZSAKKyAgICBpbXBsZW1lbnRzIExpZmVjeWNsZSB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ2xhc3MgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBmaWVsZHMgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZXMuCisgICAgICogVGhlIGRlZmF1bHRzIGFyZToKKyAgICAgKiA8cHJlPgorICAgICAqIAkJZHJpdmVyTmFtZSA9IG51bGw7CisgICAgICogCQljb25uZWN0aW9uVVJMID0gbnVsbDsKKyAgICAgKiAJCXRhYmxlTmFtZSA9ICJhY2Nlc3MiOworICAgICAqIAkJcmVtb3RlSG9zdEZpZWxkID0gInJlbW90ZUhvc3QiOworICAgICAqIAkJdXNlckZpZWxkID0gInVzZXJOYW1lIjsKKyAgICAgKiAJCXRpbWVzdGFtcEZpZWxkID0gInRpbWVzdGFtcCI7CisgICAgICogCQl2aXJ0dWFsSG9zdEZpZWxkID0gInZpcnR1YWxIb3N0IjsKKyAgICAgKiAJCW1ldGhvZEZpZWxkID0gIm1ldGhvZCI7CisgICAgICogCQlxdWVyeUZpZWxkID0gInF1ZXJ5IjsKKyAgICAgKiAJCXN0YXR1c0ZpZWxkID0gInN0YXR1cyI7CisgICAgICogCQlieXRlc0ZpZWxkID0gImJ5dGVzIjsKKyAgICAgKiAJCXJlZmVyZXJGaWVsZCA9ICJyZWZlcmVyIjsKKyAgICAgKiAJCXVzZXJBZ2VudEZpZWxkID0gInVzZXJBZ2VudCI7CisgICAgICogCQlwYXR0ZXJuID0gImNvbW1vbiI7CisgICAgICogCQlyZXNvbHZlSG9zdHMgPSBmYWxzZTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgSkRCQ0FjY2Vzc0xvZ1ZhbHZlKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBkcml2ZXJOYW1lID0gbnVsbDsKKyAgICAgICAgY29ubmVjdGlvblVSTCA9IG51bGw7CisgICAgICAgIHRhYmxlTmFtZSA9ICJhY2Nlc3MiOworICAgICAgICByZW1vdGVIb3N0RmllbGQgPSAicmVtb3RlSG9zdCI7CisgICAgICAgIHVzZXJGaWVsZCA9ICJ1c2VyTmFtZSI7CisgICAgICAgIHRpbWVzdGFtcEZpZWxkID0gInRpbWVzdGFtcCI7CisgICAgICAgIHZpcnR1YWxIb3N0RmllbGQgPSAidmlydHVhbEhvc3QiOworICAgICAgICBtZXRob2RGaWVsZCA9ICJtZXRob2QiOworICAgICAgICBxdWVyeUZpZWxkID0gInF1ZXJ5IjsKKyAgICAgICAgc3RhdHVzRmllbGQgPSAic3RhdHVzIjsKKyAgICAgICAgYnl0ZXNGaWVsZCA9ICJieXRlcyI7CisgICAgICAgIHJlZmVyZXJGaWVsZCA9ICJyZWZlcmVyIjsKKyAgICAgICAgdXNlckFnZW50RmllbGQgPSAidXNlckFnZW50IjsKKyAgICAgICAgcGF0dGVybiA9ICJjb21tb24iOworICAgICAgICByZXNvbHZlSG9zdHMgPSBmYWxzZTsKKyAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgIHBzID0gbnVsbDsKKyAgICAgICAgY3VycmVudFRpbWVNaWxsaXMgPSBuZXcgamF2YS51dGlsLkRhdGUoKS5nZXRUaW1lKCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAvKioKKyAgICAgKiBUaGUgY29ubmVjdGlvbiB1c2VybmFtZSB0byB1c2Ugd2hlbiB0cnlpbmcgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uTmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb25uZWN0aW9uIFVSTCB0byB1c2Ugd2hlbiB0cnlpbmcgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uUGFzc3dvcmQgPSBudWxsOworCisgICAvKioKKyAgICAgKiBJbnN0YW5jZSBvZiB0aGUgSkRCQyBEcml2ZXIgY2xhc3Mgd2UgdXNlIGFzIGEgY29ubmVjdGlvbiBmYWN0b3J5LgorICAgICAqLworICAgIHByb3RlY3RlZCBEcml2ZXIgZHJpdmVyID0gbnVsbDsKKworCisgICAgcHJpdmF0ZSBTdHJpbmcgZHJpdmVyTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBjb25uZWN0aW9uVVJMOworICAgIHByaXZhdGUgU3RyaW5nIHRhYmxlTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyByZW1vdGVIb3N0RmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlckZpZWxkOworICAgIHByaXZhdGUgU3RyaW5nIHRpbWVzdGFtcEZpZWxkOworICAgIHByaXZhdGUgU3RyaW5nIHZpcnR1YWxIb3N0RmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kRmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnlGaWVsZDsKKyAgICBwcml2YXRlIFN0cmluZyBzdGF0dXNGaWVsZDsKKyAgICBwcml2YXRlIFN0cmluZyBieXRlc0ZpZWxkOworICAgIHByaXZhdGUgU3RyaW5nIHJlZmVyZXJGaWVsZDsKKyAgICBwcml2YXRlIFN0cmluZyB1c2VyQWdlbnRGaWVsZDsKKyAgICBwcml2YXRlIFN0cmluZyBwYXR0ZXJuOworICAgIHByaXZhdGUgYm9vbGVhbiByZXNvbHZlSG9zdHM7CisKKworICAgIHByaXZhdGUgQ29ubmVjdGlvbiBjb25uOworICAgIHByaXZhdGUgUHJlcGFyZWRTdGF0ZW1lbnQgcHM7CisKKworICAgIHByaXZhdGUgbG9uZyBjdXJyZW50VGltZU1pbGxpczsKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgaW5mbyA9IAorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuSkRCQ0FjY2Vzc0xvZ1ZhbHZlLzEuMSI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaWZlY3ljbGUgZXZlbnQgc3VwcG9ydCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIExpZmVjeWNsZVN1cHBvcnQgbGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZVN1cHBvcnQodGhpcyk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nTWFuYWdlciBzbSA9IFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIHN0YXJ0ZWQgeWV0PworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlcm5hbWUgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25OYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlcm5hbWUgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25OYW1lIFVzZXJuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbk5hbWUoU3RyaW5nIGNvbm5lY3Rpb25OYW1lKSB7CisgICAgICAgIHRoaXMuY29ubmVjdGlvbk5hbWUgPSBjb25uZWN0aW9uTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkYXRhYmFzZSBkcml2ZXIgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZHJpdmVyTmFtZSBUaGUgY29tcGxldGUgbmFtZSBvZiB0aGUgZGF0YWJhc2UgZHJpdmVyIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERyaXZlck5hbWUoU3RyaW5nIGRyaXZlck5hbWUpIHsKKyAgICAgICAgdGhpcy5kcml2ZXJOYW1lID0gZHJpdmVyTmFtZTsKKyAgICB9CisKKyAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGFzc3dvcmQgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uUGFzc3dvcmQoKSB7CisgICAgICAgIHJldHVybiBjb25uZWN0aW9uUGFzc3dvcmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXNzd29yZCB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvblBhc3N3b3JkIFVzZXIgcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUGFzc3dvcmQoU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCkgeworICAgICAgICB0aGlzLmNvbm5lY3Rpb25QYXNzd29yZCA9IGNvbm5lY3Rpb25QYXNzd29yZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBKREJDIFVSTCBmb3IgdGhlIGRhdGFiYXNlIHdoZXJlIHRoZSBsb2cgaXMgc3RvcmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uVVJMIFRoZSBKREJDIFVSTCBvZiB0aGUgZGF0YWJhc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblVSTChTdHJpbmcgY29ubmVjdGlvblVSTCkgeworICAgICAgICB0aGlzLmNvbm5lY3Rpb25VUkwgPSBjb25uZWN0aW9uVVJMOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGxvZ3MgYXJlIHN0b3JlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYWJsZU5hbWUoU3RyaW5nIHRhYmxlTmFtZSkgeworICAgICAgICB0aGlzLnRhYmxlTmFtZSA9IHRhYmxlTmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGNvbnRhaW5pbmcgdGhlIHJlbW90ZSBob3N0LgorICAgICAqIAorICAgICAqIEBwYXJhbSByZW1vdGVIb3N0RmllbGQgVGhlIG5hbWUgb2YgdGhlIHJlbW90ZSBob3N0IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZUhvc3RGaWVsZChTdHJpbmcgcmVtb3RlSG9zdEZpZWxkKSB7CisgICAgICAgIHRoaXMucmVtb3RlSG9zdEZpZWxkID0gcmVtb3RlSG9zdEZpZWxkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgY29udGFpbmluZyB0aGUgcmVtb3RlIHVzZXIgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlckZpZWxkIFRoZSBuYW1lIG9mIHRoZSByZW1vdGUgdXNlciBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyRmllbGQoU3RyaW5nIHVzZXJGaWVsZCkgeworICAgICAgICB0aGlzLnVzZXJGaWVsZCA9IHVzZXJGaWVsZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGNvbnRhaW5pbmcgdGhlIHNlcnZlci1kZXRlcm1pbmVkIHRpbWVzdGFtcC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wRmllbGQgVGhlIG5hbWUgb2YgdGhlIHNlcnZlci1kZXRlcm1pbmVkIHRpbWVzdGFtcCBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXBGaWVsZChTdHJpbmcgdGltZXN0YW1wRmllbGQpIHsKKyAgICAgICAgdGhpcy50aW1lc3RhbXBGaWVsZCA9IHRpbWVzdGFtcEZpZWxkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgY29udGFpbmluZyB0aGUgdmlydHVhbCBob3N0IGluZm9ybWF0aW9uIAorICAgICAqICh0aGlzIGlzIGluIGZhY3QgdGhlIHNlcnZlciBuYW1lKS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmlydHVhbEhvc3RGaWVsZCBUaGUgbmFtZSBvZiB0aGUgdmlydHVhbCBob3N0IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZpcnR1YWxIb3N0RmllbGQoU3RyaW5nIHZpcnR1YWxIb3N0RmllbGQpIHsKKyAgICAgICAgdGhpcy52aXJ0dWFsSG9zdEZpZWxkID0gdmlydHVhbEhvc3RGaWVsZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGNvbnRhaW5pbmcgdGhlIEhUVFAgcmVxdWVzdCBtZXRob2QuCisgICAgICogCisgICAgICogQHBhcmFtIG1ldGhvZEZpZWxkIFRoZSBuYW1lIG9mIHRoZSBIVFRQIHJlcXVlc3QgbWV0aG9kIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZEZpZWxkKFN0cmluZyBtZXRob2RGaWVsZCkgeworICAgICAgICB0aGlzLm1ldGhvZEZpZWxkID0gbWV0aG9kRmllbGQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBjb250YWluaW5nIHRoZSBVUkwgcGFydCBvZiB0aGUgSFRUUCBxdWVyeS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcXVlcnlGaWVsZCBUaGUgbmFtZSBvZiB0aGUgZmllbGQgY29udGFpbmluZyB0aGUgVVJMIHBhcnQgb2YgCisgICAgICogdGhlIEhUVFAgcXVlcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UXVlcnlGaWVsZChTdHJpbmcgcXVlcnlGaWVsZCkgeworICAgICAgICB0aGlzLnF1ZXJ5RmllbGQgPSBxdWVyeUZpZWxkOworICAgIH0KKworCisgIC8qKgorICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBjb250YWluaW5nIHRoZSBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlLgorICAgKiAKKyAgICogQHBhcmFtIHN0YXR1c0ZpZWxkIFRoZSBuYW1lIG9mIHRoZSBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlIGZpZWxkLgorICAgKi8gIAorICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1c0ZpZWxkKFN0cmluZyBzdGF0dXNGaWVsZCkgeworICAgICAgICB0aGlzLnN0YXR1c0ZpZWxkID0gc3RhdHVzRmllbGQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmV0dXJuZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGJ5dGVzRmllbGQgVGhlIG5hbWUgb2YgdGhlIHJldHVybmVkIGJ5dGVzIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJ5dGVzRmllbGQoU3RyaW5nIGJ5dGVzRmllbGQpIHsKKyAgICAgICAgdGhpcy5ieXRlc0ZpZWxkID0gYnl0ZXNGaWVsZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGNvbnRhaW5pbmcgdGhlIHJlZmVyZXIuCisgICAgICogCisgICAgICogQHBhcmFtIHJlZmVyZXJGaWVsZCBUaGUgcmVmZXJlciBmaWVsZCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZmVyZXJGaWVsZChTdHJpbmcgcmVmZXJlckZpZWxkKSB7CisgICAgICAgIHRoaXMucmVmZXJlckZpZWxkID0gcmVmZXJlckZpZWxkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgY29udGFpbmluZyB0aGUgdXNlciBhZ2VudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlckFnZW50RmllbGQgVGhlIG5hbWUgb2YgdGhlIHVzZXIgYWdlbnQgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlckFnZW50RmllbGQoU3RyaW5nIHVzZXJBZ2VudEZpZWxkKSB7CisgICAgICAgIHRoaXMudXNlckFnZW50RmllbGQgPSB1c2VyQWdlbnRGaWVsZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxvZ2dpbmcgcGF0dGVybi4gVGhlIHBhdHRlcm5zIHN1cHBvcnRlZCBjb3JyZXNwb25kIHRvIHRoZSAKKyAgICAgKiBmaWxlLWJhc2VkICJjb21tb24iIGFuZCAiY29tYmluZWQiLiBUaGVzZSBhcmUgdHJhbnNsYXRlZCBpbnRvIHRoZSB1c2UgCisgICAgICogb2YgdGFibGVzIGNvbnRhaW5pbmcgZWl0aGVyIHNldCBvZiBmaWVsZHMuCisgICAgICogPFA+PEk+VE8gRE86IG1vcmUgZmxleGlibGUgZmllbGQgY2hvaWNlcy48L0k+PC9QPgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXR0ZXJuIFRoZSBuYW1lIG9mIHRoZSBsb2dnaW5nIHBhdHRlcm4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgcGF0dGVybikgeworICAgICAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIElQIGhvc3QgbmFtZSByZXNvbHV0aW9uIGlzIGRvbmUuCisgICAgICogCisgICAgICogQHBhcmFtIHJlc29sdmVIb3N0cyAidHJ1ZSIgb3IgImZhbHNlIiwgaWYgaG9zdCBJUCByZXNvbHV0aW9uIAorICAgICAqIGlzIGRlc2lyZWQgb3Igbm90LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmVIb3N0cyhTdHJpbmcgcmVzb2x2ZUhvc3RzKSB7CisgICAgICAgIHRoaXMucmVzb2x2ZUhvc3RzID0gbmV3IEJvb2xlYW4ocmVzb2x2ZUhvc3RzKS5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IFRvbWNhdCBvbiBlYWNoIHF1ZXJ5LgorICAgICAqIAorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBSZXF1ZXN0IG9iamVjdC4KKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIFJlc3BvbnNlIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gU2hvdWxkIG5vdCBiZSB0aHJvd24uCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIERhdGFiYXNlIFNRTEV4Y2VwdGlvbiBpcyB3cmFwcGVkIAorICAgICAqIGluIGEgU2VydmxldEV4Y2VwdGlvbi4KKyAgICAgKi8gICAgCisgICAgcHVibGljIHZvaWQgaW52b2tlKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIGdldE5leHQoKS5pbnZva2UocmVxdWVzdCwgcmVzcG9uc2UpOworCisgICAgICAgIFN0cmluZyByZW1vdGVIb3N0ID0gIiI7CisgICAgICAgIGlmKHJlc29sdmVIb3N0cykKKyAgICAgICAgICAgIHJlbW90ZUhvc3QgPSByZXF1ZXN0LmdldFJlbW90ZUhvc3QoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVtb3RlSG9zdCA9IHJlcXVlc3QuZ2V0UmVtb3RlQWRkcigpOworICAgICAgICBTdHJpbmcgdXNlciA9ICIiOworICAgICAgICBpZihyZXF1ZXN0ICE9IG51bGwpCisgICAgICAgICAgICB1c2VyID0gcmVxdWVzdC5nZXRSZW1vdGVVc2VyKCk7CisgICAgICAgIFN0cmluZyBxdWVyeT0iIjsKKyAgICAgICAgaWYocmVxdWVzdCAhPSBudWxsKQorICAgICAgICAgICAgcXVlcnkgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKyAgICAgICAgaW50IGJ5dGVzID0gcmVzcG9uc2UuZ2V0Q29udGVudENvdW50KCk7CisgICAgICAgIGlmKGJ5dGVzIDwgMCkKKyAgICAgICAgICAgIGJ5dGVzID0gMDsKKyAgICAgICAgaW50IHN0YXR1cyA9IHJlc3BvbnNlLmdldFN0YXR1cygpOworCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgIGludCBudW1iZXJPZlRyaWVzID0gMjsKKyAgICAgICAgICB3aGlsZSAobnVtYmVyT2ZUcmllcz4wKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9wZW4oKTsKKyAgICAKKyAgICAgICAgICAgICAgICBwcy5zZXRTdHJpbmcoMSwgcmVtb3RlSG9zdCk7CisgICAgICAgICAgICAgICAgcHMuc2V0U3RyaW5nKDIsIHVzZXIpOworICAgICAgICAgICAgICAgIHBzLnNldFRpbWVzdGFtcCgzLCBuZXcgVGltZXN0YW1wKGdldEN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKKyAgICAgICAgICAgICAgICBwcy5zZXRTdHJpbmcoNCwgcXVlcnkpOworICAgICAgICAgICAgICAgIHBzLnNldEludCg1LCBzdGF0dXMpOworICAgICAgICAgICAgICAgIHBzLnNldEludCg2LCBieXRlcyk7CisgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uZXF1YWxzKCJjb21iaW5lZCIpKSB7CisgICAgIAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2aXJ0dWFsSG9zdCA9ICIiOworICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcXVlc3QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsSG9zdCA9IHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXRob2QgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICBpZihyZXF1ZXN0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gcmVxdWVzdC5nZXRNZXRob2QoKTsKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVmZXJlciA9ICIiOworICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcXVlc3QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVyID0gcmVxdWVzdC5nZXRIZWFkZXIoInJlZmVyZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlckFnZW50ID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgaWYocmVxdWVzdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJBZ2VudCA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJ1c2VyLWFnZW50Iik7CisgICAgICAgICAgICAgICAgICAgICAgcHMuc2V0U3RyaW5nKDcsIHZpcnR1YWxIb3N0KTsKKyAgICAgICAgICAgICAgICAgICAgICBwcy5zZXRTdHJpbmcoOCwgbWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgICBwcy5zZXRTdHJpbmcoOSwgcmVmZXJlcik7CisgICAgICAgICAgICAgICAgICAgICAgcHMuc2V0U3RyaW5nKDEwLCB1c2VyQWdlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcy5leGVjdXRlVXBkYXRlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgcHJvYmxlbSBmb3IgcG9zdGVyaXR5CisgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJqZGJjQWNjZXNzTG9nVmFsdmUuZXhjZXB0aW9uIiksIGUpOworCisgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGNvbm5lY3Rpb24gc28gdGhhdCBpdCBnZXRzIHJlb3BlbmVkIG5leHQgdGltZQorICAgICAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICAgIH0KKyAgICAJICAgICAgbnVtYmVyT2ZUcmllcy0tOyAgICAgICAgCisgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQkKKworCisgICAgLyoqCisgICAgICogQWRkcyBhIExpZmVjeWNsZSBsaXN0ZW5lci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZC4KKyAgICAgKi8gIAorICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcyAKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBMaWZlY3ljbGUgbGlzdGVuZXIuCisgICAgICogCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbiAoaWYgbmVjZXNzYXJ5KSBhbmQgcmV0dXJuIGEgZGF0YWJhc2UgY29ubmVjdGlvbiBmb3IgdXNlIGJ5CisgICAgICogdGhpcyBBY2Nlc3NMb2dWYWx2ZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU1FMRXhjZXB0aW9uIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgb3BlbigpIHRocm93cyBTUUxFeGNlcHRpb24geworCisgICAgICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBjb25uZWN0aW9uIGFscmVhZHkgb3BlbgorICAgICAgICBpZiAoY29ubiAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIDsKKworICAgICAgICAvLyBJbnN0YW50aWF0ZSBvdXIgZGF0YWJhc2UgZHJpdmVyIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoZHJpdmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGRyaXZlck5hbWUpOworICAgICAgICAgICAgICAgIGRyaXZlciA9IChEcml2ZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTUUxFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gT3BlbiBhIG5ldyBjb25uZWN0aW9uCisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwcm9wcy5wdXQoImF1dG9SZWNvbm5lY3QiLCAidHJ1ZSIpOworICAgICAgICBpZiAoY29ubmVjdGlvbk5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHByb3BzLnB1dCgidXNlciIsIGNvbm5lY3Rpb25OYW1lKTsKKyAgICAgICAgaWYgKGNvbm5lY3Rpb25QYXNzd29yZCAhPSBudWxsKQorICAgICAgICAgICAgcHJvcHMucHV0KCJwYXNzd29yZCIsIGNvbm5lY3Rpb25QYXNzd29yZCk7CisgICAgICAgIGNvbm4gPSBkcml2ZXIuY29ubmVjdChjb25uZWN0aW9uVVJMLCBwcm9wcyk7CisgICAgICAgIGNvbm4uc2V0QXV0b0NvbW1pdCh0cnVlKTsKKyAgICAgICAgaWYgKHBhdHRlcm4uZXF1YWxzKCJjb21tb24iKSkgeworICAgICAgICAgICAgICAgIHBzID0gY29ubi5wcmVwYXJlU3RhdGVtZW50CisgICAgICAgICAgICAgICAgICAgICgiSU5TRVJUIElOVE8gIiArIHRhYmxlTmFtZSArICIgKCIgCisgICAgICAgICAgICAgICAgICAgICArIHJlbW90ZUhvc3RGaWVsZCArICIsICIgKyB1c2VyRmllbGQgKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICArIHRpbWVzdGFtcEZpZWxkICsiLCAiICsgcXVlcnlGaWVsZCArICIsICIKKyAgICAgICAgICAgICAgICAgICAgICsgc3RhdHVzRmllbGQgKyAiLCAiICsgYnl0ZXNGaWVsZCAKKyAgICAgICAgICAgICAgICAgICAgICsgIikgVkFMVUVTKD8sID8sID8sID8sID8sID8pIik7CisgICAgICAgIH0gZWxzZSBpZiAocGF0dGVybi5lcXVhbHMoImNvbWJpbmVkIikpIHsKKyAgICAgICAgICAgICAgICBwcyA9IGNvbm4ucHJlcGFyZVN0YXRlbWVudAorICAgICAgICAgICAgICAgICAgICAoIklOU0VSVCBJTlRPICIgKyB0YWJsZU5hbWUgKyAiICgiIAorICAgICAgICAgICAgICAgICAgICAgKyByZW1vdGVIb3N0RmllbGQgKyAiLCAiICsgdXNlckZpZWxkICsgIiwgIgorICAgICAgICAgICAgICAgICAgICAgKyB0aW1lc3RhbXBGaWVsZCArICIsICIgKyBxdWVyeUZpZWxkICsgIiwgIiAKKyAgICAgICAgICAgICAgICAgICAgICsgc3RhdHVzRmllbGQgKyAiLCAiICsgYnl0ZXNGaWVsZCArICIsICIgCisgICAgICAgICAgICAgICAgICAgICArIHZpcnR1YWxIb3N0RmllbGQgKyAiLCAiICsgbWV0aG9kRmllbGQgKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICArIHJlZmVyZXJGaWVsZCArICIsICIgKyB1c2VyQWdlbnRGaWVsZAorICAgICAgICAgICAgICAgICAgICAgKyAiKSBWQUxVRVMoPywgPywgPywgPywgPywgPywgPywgPywgPywgPykiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjbG9zZSgpIHsKKworICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIGFscmVhZHkgY2xvc2VkCisgICAgICAgIGlmIChjb25uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gQ2xvc2Ugb3VyIHByZXBhcmVkIHN0YXRlbWVudHMgKGlmIGFueSkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBmKSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5wcyA9IG51bGw7CisKKworCisgICAgICAgIC8vIENsb3NlIHRoaXMgZGF0YWJhc2UgY29ubmVjdGlvbiwgYW5kIGxvZyBhbnkgZXJyb3JzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJqZGJjQWNjZXNzTG9nVmFsZXZlLmNsb3NlIiksIGUpOyAvLyBKdXN0IGxvZyBpdCBoZXJlICAgICAgICAgICAgCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgIHRoaXMuY29ubiA9IG51bGw7CisgICAgICAgIH0KKworICAgIH0KKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGJ5IFRvbWNhdCBvbiBzdGFydHVwLiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBzZXQgaGVyZS4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBDYW4gYmUgdGhyb3duIG9uIGxpZmVjeWNsZSAKKyAgICAgKiBpbmNvbnNpc3RlbmNpZXMgb3Igb24gZGF0YWJhc2UgZXJyb3JzIChhcyBhIHdyYXBwZWQgU1FMRXhjZXB0aW9uKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIGlmIChzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImFjY2Vzc0xvZ1ZhbHZlLmFscmVhZHlTdGFydGVkIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9wZW4oKSA7ICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW52b2tlZCBieSB0b21jYXQgb24gc2h1dGRvd24uIFRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIGNsb3NlZCBoZXJlLgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIENhbiBiZSB0aHJvd24gb24gbGlmZWN5Y2xlIAorICAgICAqIGluY29uc2lzdGVuY2llcyBvciBvbiBkYXRhYmFzZSBlcnJvcnMgKGFzIGEgd3JhcHBlZCBTUUxFeGNlcHRpb24pLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoIXN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiYWNjZXNzTG9nVmFsdmUubm90U3RhcnRlZCIpKTsKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVE9QX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgY2xvc2UoKSA7CisgICAgCQorICAgIH0KKworCisgICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFRpbWVNaWxsaXMoKSB7CisgICAgICAgIGxvbmcgc3lzdGltZSAgPSAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGlmICgoc3lzdGltZSAtIGN1cnJlbnRUaW1lTWlsbGlzKSA+IDEwMDApIHsKKyAgICAgICAgICAgIGN1cnJlbnRUaW1lTWlsbGlzICA9ICBuZXcgamF2YS51dGlsLkRhdGUoc3lzdGltZSkuZ2V0VGltZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50VGltZU1pbGxpczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjgyNjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNjkgQEAKK2FjY2Vzc0xvZ1ZhbHZlLmFscmVhZHlTdGFydGVkPUFjY2VzcyBMb2dnZXIgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCithY2Nlc3NMb2dWYWx2ZS5ub3RTdGFydGVkPUFjY2VzcyBMb2dnZXIgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCitzZW1hcGhvcmVWYWx2ZS5hbHJlYWR5U3RhcnRlZD1TZW1hcGhvcmUgdmFsdmUgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCitzZW1hcGhvcmVWYWx2ZS5ub3RTdGFydGVkPVNlbWFwaG9yZSB2YWx2ZSBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQKK2NlcnRpZmljYXRlc1ZhbHZlLmFscmVhZHlTdGFydGVkPUNlcnRpZmljYXRlcyBWYWx2ZSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKK2NlcnRpZmljYXRlc1ZhbHZlLm5vdFN0YXJ0ZWQ9Q2VydGlmaWNhdGVzIFZhbHZlIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZAoraW50ZXJjZXB0b3JWYWx2ZS5hbHJlYWR5U3RhcnRlZD1JbnRlcmNlcHRvciBWYWx2ZSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKK2ludGVyY2VwdG9yVmFsdmUubm90U3RhcnRlZD1JbnRlcmNlcHRvciBWYWx2ZSBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQKK3JlcXVlc3RGaWx0ZXJWYWx2ZS5uZXh0PU5vICcnbmV4dCcnIHZhbHZlIGhhcyBiZWVuIGNvbmZpZ3VyZWQKK3JlcXVlc3RGaWx0ZXJWYWx2ZS5zeW50YXg9U3ludGF4IGVycm9yIGluIHJlcXVlc3QgZmlsdGVyIHBhdHRlcm4gezB9Cit2YWx2ZUJhc2Uubm9OZXh0PUNvbmZpZ3VyYXRpb24gZXJyb3I6IE5vICcnbmV4dCcnIHZhbHZlIGNvbmZpZ3VyZWQKK2pkYmNBY2Nlc3NMb2dWYWx2ZS5leGNlcHRpb249RXhjZXB0aW9uIHBlcmZvcm1pbmcgaW5zZXJ0IGFjY2VzcyBlbnRyeQoramRiY0FjY2Vzc0xvZ1ZhbHZlLmNsb3NlPUV4Y2VwdGlvbiBjbG9zaW5nIGRhdGFiYXNlIGNvbm5lY3Rpb24KKworIyBFcnJvciByZXBvcnQgdmFsdmUKK2Vycm9yUmVwb3J0VmFsdmUuZXJyb3JSZXBvcnQ9RXJyb3IgcmVwb3J0CitlcnJvclJlcG9ydFZhbHZlLnN0YXR1c0hlYWRlcj1IVFRQIFN0YXR1cyB7MH0gLSB7MX0KK2Vycm9yUmVwb3J0VmFsdmUuZXhjZXB0aW9uUmVwb3J0PUV4Y2VwdGlvbiByZXBvcnQKK2Vycm9yUmVwb3J0VmFsdmUuc3RhdHVzUmVwb3J0PVN0YXR1cyByZXBvcnQKK2Vycm9yUmVwb3J0VmFsdmUubWVzc2FnZT1tZXNzYWdlCitlcnJvclJlcG9ydFZhbHZlLmRlc2NyaXB0aW9uPWRlc2NyaXB0aW9uCitlcnJvclJlcG9ydFZhbHZlLmV4Y2VwdGlvbj1leGNlcHRpb24KK2Vycm9yUmVwb3J0VmFsdmUucm9vdENhdXNlPXJvb3QgY2F1c2UKK2Vycm9yUmVwb3J0VmFsdmUubm90ZT1ub3RlCitlcnJvclJlcG9ydFZhbHZlLnJvb3RDYXVzZUluTG9ncz1UaGUgZnVsbCBzdGFjayB0cmFjZSBvZiB0aGUgcm9vdCBjYXVzZSBpcyBhdmFpbGFibGUgaW4gdGhlIHswfSBsb2dzLgorCisjIEhUVFAgc3RhdHVzIHJlcG9ydHMKK2h0dHAuMTAwPVRoZSBjbGllbnQgbWF5IGNvbnRpbnVlICh7MH0pLgoraHR0cC4xMDE9VGhlIHNlcnZlciBpcyBzd2l0Y2hpbmcgcHJvdG9jb2xzIGFjY29yZGluZyB0byB0aGUgIlVwZ3JhZGUiIGhlYWRlciAoezB9KS4KK2h0dHAuMjAxPVRoZSByZXF1ZXN0IHN1Y2NlZWRlZCBhbmQgYSBuZXcgcmVzb3VyY2UgKHswfSkgaGFzIGJlZW4gY3JlYXRlZCBvbiB0aGUgc2VydmVyLgoraHR0cC4yMDI9VGhpcyByZXF1ZXN0IHdhcyBhY2NlcHRlZCBmb3IgcHJvY2Vzc2luZywgYnV0IGhhcyBub3QgYmVlbiBjb21wbGV0ZWQgKHswfSkuCitodHRwLjIwMz1UaGUgbWV0YSBpbmZvcm1hdGlvbiBwcmVzZW50ZWQgYnkgdGhlIGNsaWVudCBkaWQgbm90IG9yaWdpbmF0ZSBmcm9tIHRoZSBzZXJ2ZXIgKHswfSkuCitodHRwLjIwND1UaGUgcmVxdWVzdCBzdWNjZWVkZWQgYnV0IHRoZXJlIGlzIG5vIGluZm9ybWF0aW9uIHRvIHJldHVybiAoezB9KS4KK2h0dHAuMjA1PVRoZSBjbGllbnQgc2hvdWxkIHJlc2V0IHRoZSBkb2N1bWVudCB2aWV3IHdoaWNoIGNhdXNlZCB0aGlzIHJlcXVlc3QgdG8gYmUgc2VudCAoezB9KS4KK2h0dHAuMjA2PVRoZSBzZXJ2ZXIgaGFzIGZ1bGZpbGxlZCBhIHBhcnRpYWwgR0VUIHJlcXVlc3QgZm9yIHRoaXMgcmVzb3VyY2UgKHswfSkuCitodHRwLjIwNz1NdWx0aXBsZSBzdGF0dXMgdmFsdWVzIGhhdmUgYmVlbiByZXR1cm5lZCAoezB9KS4KK2h0dHAuMzAwPVRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgKHswfSkgY29ycmVzcG9uZHMgdG8gYW55IG9uZSBvZiBhIHNldCBvZiByZXByZXNlbnRhdGlvbnMsIGVhY2ggd2l0aCBpdHMgb3duIHNwZWNpZmljIGxvY2F0aW9uLgoraHR0cC4zMDE9VGhlIHJlcXVlc3RlZCByZXNvdXJjZSAoezB9KSBoYXMgbW92ZWQgcGVybWFuZW50bHkgdG8gYSBuZXcgbG9jYXRpb24uCitodHRwLjMwMj1UaGUgcmVxdWVzdGVkIHJlc291cmNlICh7MH0pIGhhcyBtb3ZlZCB0ZW1wb3JhcmlseSB0byBhIG5ldyBsb2NhdGlvbi4KK2h0dHAuMzAzPVRoZSByZXNwb25zZSB0byB0aGlzIHJlcXVlc3QgY2FuIGJlIGZvdW5kIHVuZGVyIGEgZGlmZmVyZW50IFVSSSAoezB9KS4KK2h0dHAuMzA0PVRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgKHswfSkgaXMgYXZhaWxhYmxlIGFuZCBoYXMgbm90IGJlZW4gbW9kaWZpZWQuCitodHRwLjMwNT1UaGUgcmVxdWVzdGVkIHJlc291cmNlICh7MH0pIG11c3QgYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgcHJveHkgZ2l2ZW4gYnkgdGhlICJMb2NhdGlvbiIgaGVhZGVyLgoraHR0cC40MDA9VGhlIHJlcXVlc3Qgc2VudCBieSB0aGUgY2xpZW50IHdhcyBzeW50YWN0aWNhbGx5IGluY29ycmVjdCAoezB9KS4KK2h0dHAuNDAxPVRoaXMgcmVxdWVzdCByZXF1aXJlcyBIVFRQIGF1dGhlbnRpY2F0aW9uICh7MH0pLgoraHR0cC40MDI9UGF5bWVudCBpcyByZXF1aXJlZCBmb3IgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UgKHswfSkuCitodHRwLjQwMz1BY2Nlc3MgdG8gdGhlIHNwZWNpZmllZCByZXNvdXJjZSAoezB9KSBoYXMgYmVlbiBmb3JiaWRkZW4uCitodHRwLjQwND1UaGUgcmVxdWVzdGVkIHJlc291cmNlICh7MH0pIGlzIG5vdCBhdmFpbGFibGUuCitodHRwLjQwNT1UaGUgc3BlY2lmaWVkIEhUVFAgbWV0aG9kIGlzIG5vdCBhbGxvd2VkIGZvciB0aGUgcmVxdWVzdGVkIHJlc291cmNlICh7MH0pLgoraHR0cC40MDY9VGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyByZXF1ZXN0IGlzIG9ubHkgY2FwYWJsZSBvZiBnZW5lcmF0aW5nIHJlc3BvbnNlcyB3aXRoIGNoYXJhY3RlcmlzdGljcyBub3QgYWNjZXB0YWJsZSBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3QgImFjY2VwdCIgaGVhZGVycyAoezB9KS4KK2h0dHAuNDA3PVRoZSBjbGllbnQgbXVzdCBmaXJzdCBhdXRoZW50aWNhdGUgaXRzZWxmIHdpdGggdGhlIHByb3h5ICh7MH0pLgoraHR0cC40MDg9VGhlIGNsaWVudCBkaWQgbm90IHByb2R1Y2UgYSByZXF1ZXN0IHdpdGhpbiB0aGUgdGltZSB0aGF0IHRoZSBzZXJ2ZXIgd2FzIHByZXBhcmVkIHRvIHdhaXQgKHswfSkuCitodHRwLjQwOT1UaGUgcmVxdWVzdCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1ZSB0byBhIGNvbmZsaWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlc291cmNlICh7MH0pLgoraHR0cC40MTA9VGhlIHJlcXVlc3RlZCByZXNvdXJjZSAoezB9KSBpcyBubyBsb25nZXIgYXZhaWxhYmxlLCBhbmQgbm8gZm9yd2FyZGluZyBhZGRyZXNzIGlzIGtub3duLgoraHR0cC40MTE9VGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBoYW5kbGVkIHdpdGhvdXQgYSBkZWZpbmVkIGNvbnRlbnQgbGVuZ3RoICh7MH0pLgoraHR0cC40MTI9QSBzcGVjaWZpZWQgcHJlY29uZGl0aW9uIGhhcyBmYWlsZWQgZm9yIHRoaXMgcmVxdWVzdCAoezB9KS4KK2h0dHAuNDEzPVRoZSByZXF1ZXN0IGVudGl0eSBpcyBsYXJnZXIgdGhhbiB0aGUgc2VydmVyIGlzIHdpbGxpbmcgb3IgYWJsZSB0byBwcm9jZXNzLgoraHR0cC40MTQ9VGhlIHNlcnZlciByZWZ1c2VkIHRoaXMgcmVxdWVzdCBiZWNhdXNlIHRoZSByZXF1ZXN0IFVSSSB3YXMgdG9vIGxvbmcgKHswfSkuCitodHRwLjQxNT1UaGUgc2VydmVyIHJlZnVzZWQgdGhpcyByZXF1ZXN0IGJlY2F1c2UgdGhlIHJlcXVlc3QgZW50aXR5IGlzIGluIGEgZm9ybWF0IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBmb3IgdGhlIHJlcXVlc3RlZCBtZXRob2QgKHswfSkuCitodHRwLjQxNj1UaGUgcmVxdWVzdGVkIGJ5dGUgcmFuZ2UgY2Fubm90IGJlIHNhdGlzZmllZCAoezB9KS4KK2h0dHAuNDE3PVRoZSBleHBlY3RhdGlvbiBnaXZlbiBpbiB0aGUgIkV4cGVjdCIgcmVxdWVzdCBoZWFkZXIgKHswfSkgY291bGQgbm90IGJlIGZ1bGZpbGxlZC4KK2h0dHAuNDIyPVRoZSBzZXJ2ZXIgdW5kZXJzdG9vZCB0aGUgY29udGVudCB0eXBlIGFuZCBzeW50YXggb2YgdGhlIHJlcXVlc3QgYnV0IHdhcyB1bmFibGUgdG8gcHJvY2VzcyB0aGUgY29udGFpbmVkIGluc3RydWN0aW9ucyAoezB9KS4KK2h0dHAuNDIzPVRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gcmVzb3VyY2Ugb2YgYSBtZXRob2QgaXMgbG9ja2VkICh7MH0pLgoraHR0cC41MDA9VGhlIHNlcnZlciBlbmNvdW50ZXJlZCBhbiBpbnRlcm5hbCBlcnJvciAoezB9KSB0aGF0IHByZXZlbnRlZCBpdCBmcm9tIGZ1bGZpbGxpbmcgdGhpcyByZXF1ZXN0LgoraHR0cC41MDE9VGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBmdW5jdGlvbmFsaXR5IG5lZWRlZCB0byBmdWxmaWxsIHRoaXMgcmVxdWVzdCAoezB9KS4KK2h0dHAuNTAyPVRoaXMgc2VydmVyIHJlY2VpdmVkIGFuIGludmFsaWQgcmVzcG9uc2UgZnJvbSBhIHNlcnZlciBpdCBjb25zdWx0ZWQgd2hlbiBhY3RpbmcgYXMgYSBwcm94eSBvciBnYXRld2F5ICh7MH0pLgoraHR0cC41MDM9VGhlIHJlcXVlc3RlZCBzZXJ2aWNlICh7MH0pIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLgoraHR0cC41MDQ9VGhlIHNlcnZlciByZWNlaXZlZCBhIHRpbWVvdXQgZnJvbSBhbiB1cHN0cmVhbSBzZXJ2ZXIgd2hpbGUgYWN0aW5nIGFzIGEgZ2F0ZXdheSBvciBwcm94eSAoezB9KS4KK2h0dHAuNTA1PVRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIEhUVFAgcHJvdG9jb2wgdmVyc2lvbiAoezB9KS4KK2h0dHAuNTA3PVRoZSByZXNvdXJjZSBkb2VzIG5vdCBoYXZlIHN1ZmZpY2llbnQgc3BhY2UgdG8gcmVjb3JkIHRoZSBzdGF0ZSBvZiB0aGUgcmVzb3VyY2UgYWZ0ZXIgZXhlY3V0aW9uIG9mIHRoaXMgbWV0aG9kICh7MH0pLgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QxMDAzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2NyBAQAorYWNjZXNzTG9nVmFsdmUuYWxyZWFkeVN0YXJ0ZWQ9RWwgUmVnaXN0cmFkb3IgZGUgYWNjZXNvcyB5YSBzZSBoYWLtYSBpbmljaWFkbworYWNjZXNzTG9nVmFsdmUubm90U3RhcnRlZD1FbCBSZWdpc3RyYWRvciBkZSBhY2Nlc29zIG5vIHNlIGhhIGluaWNpYWRvCitjZXJ0aWZpY2F0ZXNWYWx2ZS5hbHJlYWR5U3RhcnRlZD1MYSB24Wx2dWxhIGRlIGNlcnRpZmljYWRvcyB5YSBzZSBoYWLtYSBpbmljaWFkbworY2VydGlmaWNhdGVzVmFsdmUubm90U3RhcnRlZD1MYSB24Wx2dWxhIGRlIGNlcnRpZmljYWRvcyBubyBzZSBoYSBpbmljaWFkbworaW50ZXJjZXB0b3JWYWx2ZS5hbHJlYWR5U3RhcnRlZD1MYSB24Wx2dWxhIGludGVyY2VwdG9yYSB5YSBzZSBoYWLtYSBpbmljaWFkbworaW50ZXJjZXB0b3JWYWx2ZS5ub3RTdGFydGVkPUxhIHbhbHZ1bGEgaW50ZXJjZXB0b3JhIG5vIHNlIGhhIGluaWNpYWRvCityZXF1ZXN0RmlsdGVyVmFsdmUubmV4dD1ObyBoYXkgJydzaWd1aWVudGUnJyB24Wx2dWxhIGNvbmZpZ3VyYWRhCityZXF1ZXN0RmlsdGVyVmFsdmUuc3ludGF4PUVycm9yIGRlIHNpbnTheGlzIGVuIHBldGljafNuIGRlIGZpbHRybyBwYXRy824gezB9Cit2YWx2ZUJhc2Uubm9OZXh0PUVycm9yIGRlIGNvbmZpZ3VyYWNp8246IE5vIGhheSAnJ3NpZ3VpZW50ZScnIHbhbHZ1bGEgY29uZmlndXJhZGEKK2pkYmNBY2Nlc3NMb2dWYWx2ZS5leGNlcHRpb249RXhjZXBjafNuIHJlYWxpemFuZG8gZW50cmFkYSBkZSBhY2Nlc28gYSBpbnNlcmNp824KK2pkYmNBY2Nlc3NMb2dWYWx2ZS5jbG9zZT1FeGNlcGNp824gY2VycmFuZG8gY29uZXhp824gYSBiYXNlIGRlIGRhdG9zCisKKyMgRXJyb3IgcmVwb3J0IHZhbHZlCitlcnJvclJlcG9ydFZhbHZlLmVycm9yUmVwb3J0PUluZm9ybWUgZGUgRXJyb3IKK2Vycm9yUmVwb3J0VmFsdmUuc3RhdHVzSGVhZGVyPUVzdGFkbyBIVFRQIHswfSAtIHsxfQorZXJyb3JSZXBvcnRWYWx2ZS5leGNlcHRpb25SZXBvcnQ9SW5mb3JtZSBkZSBFeGNlcGNp824KK2Vycm9yUmVwb3J0VmFsdmUuc3RhdHVzUmVwb3J0PUluZm9ybWUgZGUgZXN0YWRvCitlcnJvclJlcG9ydFZhbHZlLm1lc3NhZ2U9bWVuc2FqZQorZXJyb3JSZXBvcnRWYWx2ZS5kZXNjcmlwdGlvbj1kZXNjcmlwY2nzbgorZXJyb3JSZXBvcnRWYWx2ZS5leGNlcHRpb249ZXhjZXBjafNuCitlcnJvclJlcG9ydFZhbHZlLnJvb3RDYXVzZT1jYXVzYSByYe16CitlcnJvclJlcG9ydFZhbHZlLm5vdGU9bm90YQorZXJyb3JSZXBvcnRWYWx2ZS5yb290Q2F1c2VJbkxvZ3M9TGEgdHJhemEgY29tcGxldGEgZGUgbGEgY2F1c2EgZGUgZXN0ZSBlcnJvciBzZSBlbmN1ZW50cmEgZW4gbG9zIGFyY2hpdm9zIGRlIGRpYXJpbyBkZSB7MH0uCisKKyMgSFRUUCBzdGF0dXMgcmVwb3J0cworaHR0cC4xMDA9RWwgY2xpZW50ZSBwdWVkZSBjb250aW51YXIgKHswfSkuCitodHRwLjEwMT1FbCBzZXJ2aWRvciBlc3ThIGNvbm11dGFuZG8gcHJvdG9jb2xvcyBjb24gYXJyZWdsbyBhIGxhIGNhYmVjZXJhICJVcGdyYWRlIiAoezB9KS4KK2h0dHAuMjAxPUVsIHJlcXVlcmltaWVudG8gdHV2byDpeGl0byB5IHVuIG51ZXZvIHJlY3Vyc28gKHswfSkgaGEgc2lkbyBjcmVhZG8gZW4gZWwgc2Vydmlkb3IuCitodHRwLjIwMj1Fc3RlIHJlcXVlcmltaWVudG8gaGEgc2lkbyBhY2VwdGFkbyBwYXJhIHNlciBwcm9jZXNhZG8sIHBlcm8gbm8gaGEgc2lkbyBjb21wbGV0YWRvICh7MH0pLgoraHR0cC4yMDM9TGEgaW5mb3JtYWNp824gbWV0YSBwcmVzZW50YWRhIHBvciBlbCBjbGllbnRlIG5vIHNlIG9yaWdpbvMgZGVzZGUgZWwgc2Vydmlkb3IgKHswfSkuCitodHRwLjIwND1FbCByZXF1ZXJpbWllbnRvIHR1dm8g6XhpdG8gcGVybyBubyBoYXkgaW5mb3JtYWNp824gcXVlIGRldm9sdmVyICh7MH0pLgoraHR0cC4yMDU9RWwgY2xpZW50ZSBubyBkZWJlcu1hIGRlIGxpbXBpYXIgbGEgdmlzdGEgZGVsIGRvY3VtZW50byBxdWUgY2F1c/MgcXVlIGVzdGUgcmVxdWVyaW1pZW50byBmdWVyYSBlbnZpYWRvICh7MH0pLgoraHR0cC4yMDY9RWwgc2Vydmlkb3IgaGEgcmVsbGVuYWRvIHBhY2nhbG1lbnRlIHVuIHJlcXVlcmltaWVudG8gR0VUIHBhcmEgZXN0ZSByZWN1cnNvICh7MH0pLgoraHR0cC4yMDc9U2UgaGFuIGRldnVlbHRvIHZhbG9yZXMgbfpsdGlwbGVzIGRlIGVzdGFkbyAoezB9KS4KK2h0dHAuMzAwPUVsIHJlY3Vyc28gcmVxdWVyaWRvICh7MH0pIGNvcnJlc3BvbmRlIGEgdW5hIGN1YWxxdWllcmEgZGUgdW4gY29uanVudG8gZGUgcmVwcmVzZW50YWNpb25lcywgY2FkYSB1bmEgY29uIHN1IHByb3BpYSBsb2NhbGl6YWNp824gZXNwZWPtZmljYS4KK2h0dHAuMzAxPUVsIHJlY3Vyc28gcmVxdWVyaWRvICh7MH0pIGhhIHNpZG8gbW92aWRvIHBlcm1hbuludGVtZW50ZSBhIHVuYSBudWV2YSBsb2NhbGl6YWNp824uCitodHRwLjMwMj1FbCByZWN1cnNvIHJlcXVlcmlkbyAoezB9KSBoYSBzaWRvIG1vdmlkbyB0ZW1wb3LhbG1lbnRlIGEgdW5hIG51ZXZhIGxvY2FsaXphY2nzbi4KK2h0dHAuMzAzPUxhIHJlc3B1ZXN0YSBhIGVzdGUgcmVxdWVyaW1pZW50byBzZSBwdWVkZSBoYWxsYXIgYmFqbyB1bmEgVVJJIGRpZmVyZW50ZSAoezB9KS4KK2h0dHAuMzA0PUVsIHJlY3Vyc28gcmVxdWVyaWRvICh7MH0pIGVzdOEgZGlzcG9uaWJsZSB5IG5vIGhhIHNpZG8gbW9kaWZpY2Fkby4KK2h0dHAuMzA1PUVsIHJlY3Vyc28gcmVxdWVyaWRvICh7MH0pIGRlYmUgZGUgc2VyIGFjY2VkaWRvIGEgdHJhdulzIGRlbCBhcG9kZXJhZG8gKHByb3h5KSBkYWRvIG1lZGlhbnRlIGxhIGNhYmVjZXJhICJMb2NhdGlvbiIuCitodHRwLjQwMD1FbCByZXF1ZXJpbWllbnRvIGVudmlhZG8gcG9yIGVsIGNsaWVudGUgZXJhIHNpbnThY3RpY2FtZW50ZSBpbmNvcnJlY3RvICh7MH0pLgoraHR0cC40MDE9RXN0ZSByZXF1ZXJpbWllbnRvIHJlcXVpZXJlIGF1dGVudGljYWNp824gSFRUUCAoezB9KS4KK2h0dHAuNDAyPVNlIHJlcXVpZXJlIHBhZ28gcGFyYSBhY2NlZGVyIGEgZXN0ZSByZWN1cnNvICh7MH0pLgoraHR0cC40MDM9RWwgYWNjZXNvIGFsIHJlY3Vyc28gZXNwZWNpZmljYWRvICh7MH0pIGhhIHNpZG8gcHJvaGliaWRvLgoraHR0cC40MDQ9RWwgcmVjdXJzbyByZXF1ZXJpZG8gKHswfSkgbm8gZXN04SBkaXNwb25pYmxlLgoraHR0cC40MDU9RWwgbel0b2RvIEhUVFAgZXNwZWNpZmljYWRvIG5vIGVzdOEgcGVybWl0aWRvIHBhcmEgZWwgcmVjdXJzbyByZXF1ZXJpZG8gKHswfSkuCitodHRwLjQwNj1FbCByZWN1cnNvIGlkZW50aWZpY2FkbyBwb3IgZXN0ZSByZXF1ZXJpbWllbnRvIHPzbG8gZXMgY2FwYXogZGUgZ2VuZXJhciByZXNwdWVzdGFzIGNvbiBjYXJhY3Rlcu1zdGljYXMgbm8gYWNlcHRhYmxlcyBjb24gYXJyZWdsbyBhIGxhcyBjYWJlY2VyYXMgImFjY2VwdCIgZGUgcmVxdWVyaW1pZW50byAoezB9KS4KK2h0dHAuNDA3PUVsIGNsaWVudGUgZGViZSBkZSBzZXIgcHJpbWVybyBhdXRlbnRpY2FkbyBlbiBlbCBhcG9kZXJhZG8gKHswfSkuCitodHRwLjQwOD1FbCBjbGllbnRlIG5vIHByb2R1am8gdW4gcmVxdWVyaW1pZW50byBkZW50cm8gZGVsIHRpZW1wbyBlbiBxdWUgZWwgc2Vydmlkb3IgZXN0YWJhIHByZXBhcmFkbyBlc3BlcmFuZG8gKHswfSkuCitodHRwLjQwOT1FbCByZXF1ZXJpbWllbnRvIG5vIHB1ZG8gc2VyIGNvbXBsZXRhZG8gZGViaWRvIGEgdW4gY29uZmxpY3RvIGNvbiBlbCBlc3RhZG8gYWN0dWFsIGRlbCByZWN1cnNvICh7MH0pLgoraHR0cC40MTA9RWwgcmVjdXJzbyByZXF1ZXJpZG8gKHswfSkgeWEgbm8gZXN04SBkaXNwb25pYmxlIHkgbm8gc2UgY29ub2NlIGRpcmVjY2nzbiBkZSByZWVudu1vLgoraHR0cC40MTE9RXN0ZSByZXF1ZXJpbWllbnRvIG5vIHB1ZWRlIHNlciBtYW5lamFkbyBzaW4gdW4gdGFtYfFvIGRlZmluaWRvIGRlIGNvbnRlbmlkbyAoezB9KS4KK2h0dHAuNDEyPVVuYSBwcmVjb25kaWNp824gZXNwZWNpZmljYWRhIGhhIGZhbGxhZG8gcGFyYSBlc3RlIHJlcXVlcmltaWVudG8gKHswfSkuCitodHRwLjQxMz1MYSBlbnRpZGFkIGRlIHJlcXVlcmltaWVudG8gZXMgbWF5b3IgZGUgbG8gcXVlIGVsIHNlcnZpZG9yIHF1aWVyZSBvIHB1ZWRlIHByb2Nlc2FyLgoraHR0cC40MTQ9RWwgc2Vydmlkb3IgcmVjaGF68yBlc3RlIHJlcXVlcmltaWVudG8gcG9ycXVlIGxhIFVSSSByZXF1ZXJpZGEgZXJhIGRlbWFzaWFkbyBsYXJnYSAoezB9KS4KK2h0dHAuNDE1PUVsIHNlcnZpZG9yIHJlY2hhevMgZXN0ZSByZXF1ZXJpbWllbnRvIHBvcnF1ZSBsYSBlbnRpZGFkIHJlcXVlcmlkYSBzZSBlbmN1ZW50cmEgZW4gdW4gZm9ybWF0byBubyBzb3BvcnRhZG8gcG9yIGVsIHJlY3Vyc28gcmVxdWVyaWRvIHBhcmEgZWwgbel0b2RvIHJlcXVlcmlkbyAoezB9KS4KK2h0dHAuNDE2PUVsIHJhbmdvIGRlIGJ5dGUgcmVxdWVyaWRvIG5vIHB1ZWRlIHNlciBzYXRpc2ZlY2hvICh7MH0pLgoraHR0cC40MTc9TG8gcXVlIHNlIGVzcGVyYSBkYWRvIHBvciBsYSBjYWJlY2VyYSAiRXhwZWN0IiBkZSByZXF1ZXJpbWllbnRvICh7MH0pIG5vIHB1ZG8gc2VyIGNvbXBsZXRhZG8uCitodHRwLjQyMj1FbCBzZXJ2aWRvciBlbnRlbmRp8yBlbCB0aXBvIGRlIGNvbnRlbmlkbyB5IGxhIHNpbnTheGlzIGRlbCByZXF1ZXJpbWllbnRvIHBlcm8gbm8gcHVkbyBwcm9jZXNhciBsYXMgaW5zdHJ1Y2Npb25lcyBjb250ZW5pZGFzICh7MH0pLgoraHR0cC40MjM9TGEgZnVlbnRlIG8gcmVjdXJzbyBkZSBkZXN0aW5vIGRlIHVuIG3pdG9kbyBlc3ThIGJsb3F1ZWFkYSAoezB9KS4KK2h0dHAuNTAwPUVsIHNlcnZpZG9yIGVuY29udHLzIHVuIGVycm9yIGludGVybm8gKHswfSkgcXVlIGhpem8gcXVlIG5vIHB1ZGllcmEgcmVsbGVuYXIgZXN0ZSByZXF1ZXJpbWllbnRvLgoraHR0cC41MDE9RWwgc2Vydmlkb3Igbm8gc29wb3J0YSBsYSBmdW5jaW9uYWxpZGFkIG5lY2VzYXJpYSBwYXJhIHJlbGxlbmFyIGVzdGUgcmVxdWVyaW1pZW50byAoezB9KS4KK2h0dHAuNTAyPUVzdGUgc2Vydmlkb3IgcmVjaWJp8yB1bmEgcmVzcHVlc3RhIGluduFsaWRhIGRlc2RlIHVuIHNlcnZpZG9yIHF1ZSBjb25zdWx08yBjdWFuZG8gYWN0dWFiYSBjb21vIGFwb2RlcmFkbyBvIHBhc2FyZWxhICh7MH0pLgoraHR0cC41MDM9RWwgc2VydmljaW8gcmVxdWVyaWRvICh7MH0pIG5vIGVzdOEgZGlzcG9uaWJsZSBlbiBlc3RlIG1vbWVudG8uCitodHRwLjUwND1FbCBzZXJ2aWRvciByZWNpYmnzIHVuIFRpZW1wbyBBZ290YWRvIGRlc2RlIHVuIHNlcnZpZG9yIHN1cGVyaW9yIGN1YW5kbyBhY3R1YWJhIGNvbW8gcGFzYXJlbGEgbyBhcG9kZXJhZG8gKHswfSkuCitodHRwLjUwNT1FbCBzZXJ2aWRvciBubyBzb3BvcnRhIGxhIHZlcnNp824gZGUgcHJvdG9jb2xvIEhUVFAgcmVxdWVyaWRhICh7MH0pLgoraHR0cC41MDc9RWwgcmVjdXJzbyBubyB0aWVuZSBlc3BhY2lvIHN1ZmljaWVudGUgcGFyYSByZWdpc3RyYXIgZWwgZXN0YWRvIGRlbCByZWN1cnNvIHRyYXMgbGEgZWplY3VjafNuIGRlIGVzdGUgbel0b2RvICh7MH0pLgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5MmIzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2NSBAQAorYWNjZXNzTG9nVmFsdmUuYWxyZWFkeVN0YXJ0ZWQ9TGUgdHJhY2V1ciBkJydhY2PocyBhIGTpauAg6XTpIGTpbWFycukKK2FjY2Vzc0xvZ1ZhbHZlLm5vdFN0YXJ0ZWQ9TGUgdHJhY2V1ciBkJydhY2PocyBuJydhIHBhcyBlbmNvcmUg6XTpIGTpbWFycukKK2NlcnRpZmljYXRlc1ZhbHZlLmFscmVhZHlTdGFydGVkPUxhIFZhbHZlIGRlIENlcnRpZmljYXRzIGEgZOlq4CDpdOkgZOltYXJy6WUKK2NlcnRpZmljYXRlc1ZhbHZlLm5vdFN0YXJ0ZWQ9TGEgVmFsdmUgZGUgQ2VydGlmaWNhdHMgbicnYSBwYXMgZW5jb3JlIOl06SBk6W1hcnLpZQoraW50ZXJjZXB0b3JWYWx2ZS5hbHJlYWR5U3RhcnRlZD1MYSBWYWx2ZSBkJydJbnRlcmNlcHRpb24gYSBk6WrgIOl06SBk6W1hcnLpCitpbnRlcmNlcHRvclZhbHZlLm5vdFN0YXJ0ZWQ9TGEgVmFsdmUgZCcnSW50ZXJjZXB0aW9uIG4nJ2EgcGFzIGVuY29yZSDpdOkgZOltYXJy6WUKK3JlcXVlc3RGaWx0ZXJWYWx2ZS5uZXh0PUF1Y3VuZSBWYWx2ZSAnJ3N1aXZhbnRlJycgbicnYSDpdOkgY29uZmlndXLpZQorcmVxdWVzdEZpbHRlclZhbHZlLnN5bnRheD1FcnJldXIgZGUgc3ludGhheGUgZGFucyBsZSBwYXR0ZXJuIGRlIGZpbHRyZSBkZSByZXF16nRlIHswfQordmFsdmVCYXNlLm5vTmV4dD1FcnJldXIgZGUgY29uZmlndXJhdGlvbiBlcnJvcjogQXVjdW5lIFZhbHZlICcnc3VpdmFudGUnJyBuJydhIOl06SBjb25maWd1cullCisKKyMgRXJyb3IgcmVwb3J0IHZhbHZlCitlcnJvclJlcG9ydFZhbHZlLmVycm9yUmVwb3J0PVJhcHBvcnQgZCcnZXJyZXVyCitlcnJvclJlcG9ydFZhbHZlLnN0YXR1c0hlYWRlcj1FdGF0IEhUVFAgezB9IC0gezF9CitlcnJvclJlcG9ydFZhbHZlLmV4Y2VwdGlvblJlcG9ydD1SYXBwb3J0IGQnJ2V4Y2VwdGlvbgorZXJyb3JSZXBvcnRWYWx2ZS5zdGF0dXNSZXBvcnQ9UmFwcG9ydCBkJyfpdGF0CitlcnJvclJlcG9ydFZhbHZlLm1lc3NhZ2U9bWVzc2FnZQorZXJyb3JSZXBvcnRWYWx2ZS5kZXNjcmlwdGlvbj1kZXNjcmlwdGlvbgorZXJyb3JSZXBvcnRWYWx2ZS5leGNlcHRpb249ZXhjZXB0aW9uCitlcnJvclJlcG9ydFZhbHZlLnJvb3RDYXVzZT1jYXVzZSBt6HJlCitlcnJvclJlcG9ydFZhbHZlLm5vdGU9bm90ZQorZXJyb3JSZXBvcnRWYWx2ZS5yb290Q2F1c2VJbkxvZ3M9TGEgdHJhY2UgY29tcGzodGUgZGUgbGEgY2F1c2UgbehyZSBkZSBjZXR0ZSBlcnJldXIgZXN0IGRpc3BvbmlibGUgZGFucyBsZXMgZmljaGllcnMgam91cm5hdXggZGUgezB9LgorCisjIEhUVFAgc3RhdHVzIHJlcG9ydHMKK2h0dHAuMTAwPUxlIGNsaWVudCBwZXV0IGNvbnRpbnVlciAoezB9KS4KK2h0dHAuMTAxPUxlIHNlcnZldXIgY2hhbmdlIGRlIHByb3RvY29sZXMgc3VpdmFudCBsYSBkaXJlY3RpdmUgIlVwZ3JhZGUiIGRlIGwnJ2VudOp0ZSAoezB9KS4KK2h0dHAuMjAxPUxhIHJlcXXqdGUgYSBy6XVzc2kgZXQgdW5lIG5vdXZlbGxlIHJlc3NvdXJjZSAoezB9KSBhIOl06SBjcullZSBzdXIgbGUgc2VydmV1ci4KK2h0dHAuMjAyPUxhIHJlcXXqdGUgYSDpdOkgYWNjZXB06SBwb3VyIHRyYWl0ZW1lbnQsIG1haXMgbicnYSBwYXMg6XTpIHRlcm1pbullICh7MH0pLgoraHR0cC4yMDM9TCcnaW5mb3JtYXRpb24gbWV0YSBwculzZW506WUgcGFyIGxlIGNsaWVudCBuJydhIHBhcyBwb3VyIG9yaWdpbmUgY2Ugc2VydmVyICh7MH0pLgoraHR0cC4yMDQ9TGEgcmVxdep0ZSBhIHLpdXNzaSBtYWlzIGlsIG4nJ3kgYSBhdWN1bmUgaW5mb3JtYXRpb24g4CByZXRvdXJuZXIgKHswfSkuCitodHRwLjIwNT1MZSBjbGllbnQgZG9pdCByZW1ldHRyZSDgIHrpcm8gbGEgdnVlIGRlIGRvY3VtZW50IHF1aSBhIGNhdXPpZSBsJydlbnZvaSBkZSBjZXR0ZSByZXF16nRlICh7MH0pLgoraHR0cC4yMDY9TGUgc2VydmV1ciBhIHNhdGlzZmFpdCB1bmUgcmVxdep0ZSBHRVQgcGFydGllbGxlIHBvdXIgY2V0dGUgcmVzc291cmNlICh7MH0pLgoraHR0cC4yMDc9UGx1c2lldXJzIHZhbGV1cnMgZCcn6XRhdHMgb250IOl06SByZXRvdXJu6WVzICh7MH0pLgoraHR0cC4zMDA9TGEgcmVzc291cmNlIGRlbWFuZOllICh7MH0pIGNvcnJlc3BvbmQg4CBwbHVzaWV1cnMgcmVwculzZW50YXRpb25zLCBjaGFjdW5lIGF2ZWMgc2EgcHJvcHJlIGxvY2FsaXNhdGlvbi4KK2h0dHAuMzAxPUxhIHJlc3NvdXJjZSBkZW1hbmTpZSAoezB9KSBhIOl06SBk6XBsYWPpZSBkZSBmYedvbiBwZXJtYW5lbnRlIHZlcnMgdW5lIG5vdXZlbGxlIGxvY2FsaXNhdGlvbi4KK2h0dHAuMzAyPUxhIHJlc3NvdXJjZSBkZW1hbmTpZSAoezB9KSBhIOl06SBk6XBsYWPpZSBkZSBmYedvbiB0ZW1wb3JhaXJlIHZlcnMgdW5lIG5vdXZlbGxlIGxvY2FsaXNhdGlvbi4KK2h0dHAuMzAzPUxhIHLpcG9uc2Ug4CBjZXR0ZSByZXF16nRlIHBldXQg6nRyZSB0cm91dullIOAgdW5lIFVSSSBkaWZm6XJlbnRlICh7MH0pLgoraHR0cC4zMDQ9TGEgcmVzc291cmNlIGRlbWFuZOllICh7MH0pIGVzdCBkaXNwb25pYmxlIGV0IG4nJ2EgcGFzIOl06SBtb2RpZmnpZS4KK2h0dHAuMzA1PUxhIHJlc3NvdXJjZSBkZW1hbmTpZSAoezB9KSBkb2l0IOp0cmUgYWNj6WTpZSBhdSB0cmF2ZXJzIGR1IHJlbGFpcyBpbmRpcXXpIHBhciBsYSBkaXJlY3RpdmUgIkxvY2F0aW9uIiBkZSBsJydlbnTqdGUuCitodHRwLjQwMD1MYSByZXF16nRlIGVudm956WUgcGFyIGxlIGNsaWVudCDpdGFpdCBzeW50YXhpcXVlbWVudCBpbmNvcnJlY3RlICh7MH0pLgoraHR0cC40MDE9TGEgcmVxdep0ZSBu6WNlc3NpdGUgdW5lIGF1dGhlbnRpZmljYXRpb24gSFRUUCAoezB9KS4KK2h0dHAuNDAyPVVuIHBhaWVtZW50IGVzdCBkZW1hbmTpIHBvdXIgYWNj6WRlciDgIGNldHRlIHJlc3NvdXJjZSAoezB9KS4KK2h0dHAuNDAzPUwnJ2FjY+hzIOAgbGEgcmVzc291cmNlIGRlbWFuZOllICh7MH0pIGEg6XTpIGludGVyZGl0LgoraHR0cC40MDQ9TGEgcmVzc291cmNlIGRlbWFuZOllICh7MH0pIG4nJ2VzdCBwYXMgZGlzcG9uaWJsZS4KK2h0dHAuNDA1PUxhIG3pdGhvZGUgSFRUUCBzcOljaWZp6WUgbicnZXN0IHBhcyBhdXRvcmlz6WUgcG91ciBsYSByZXNzb3VyY2UgZGVtYW5k6WUgKHswfSkuCitodHRwLjQwNj1MYSByZXNzb3VyY2UgaWRlbnRpZmnpZSBwYXIgY2V0dGUgcmVxdep0ZSBuJydlc3QgY2FwYWJsZSBkZSBn6W7pcmVyIGRlcyBy6XBvbnNlcyBxdScnYXZlYyBkZXMgY2FyYWN06XJpc3RpcXVlcyBpbmNvbXBhdGlibGUgYXZlYyBsYSBkaXJlY3RpdmUgImFjY2VwdCIgcHLpc2VudGUgZGFucyBsJydlbnTqdGUgZGUgcmVxdep0ZSAoezB9KS4KK2h0dHAuNDA3PUxlIGNsaWVudCBkb2l0IGQnJ2Fib3JkIHMnJ2F1dGhlbnRpZmllciBhdXBy6HMgZHUgcmVsYWlzICh7MH0pLgoraHR0cC40MDg9TGUgY2xpZW50IG4nJ2EgcGFzIHByb2R1aXQgZGUgcmVxdep0ZSBwZW5kYW50IGxlIHRlbXBzIGQnJ2F0dGVudGUgZHUgc2VydmV1ciAoezB9KS4KK2h0dHAuNDA5PUxhIHJlcXXqdGUgbmUgcGV1dCDqdHJlIGZpbmFsaXPpZSBzdWl0ZSDgIHVuIGNvbmZsaXQgbGnpIOAgbCcn6XRhdCBkZSBsYSByZXNzb3VyY2UgKHswfSkuCitodHRwLjQxMD1MYSByZXNzb3VyY2UgZGVtYW5k6WUgKHswfSkgbicnZXN0IHBhcyBkaXNwb25pYmxlLCBldCBhdWN1bmUgYWRkcmVzc2UgZGUgcmVib25kIChmb3J3YXJkaW5nKSBuJydlc3QgY29ubnVlLgoraHR0cC40MTE9TGEgcmVxdep0ZSBuZSBwZXV0IOp0cmUgdHJhaXTpZSBzYW5zIGTpZmluaXRpb24gZCcndW5lIHRhaWxsZSBkZSBjb250ZW51IChjb250ZW50IGxlbmd0aCkgKHswfSkuCitodHRwLjQxMj1VbmUgY29uZGl0aW9uIHBy6WFsYWJsZSBkZW1hbmTpZSBhIOljaG916WUgcG91ciBjZXR0ZSByZXF16nRlICh7MH0pLgoraHR0cC40MTM9TCcnZW50aXTpIGRlIHJlcXXqdGUgZXN0IHBsdXMgaW1wb3J0YW50ZSBxdWUgY2UgcXVlIGxlIHNlcnZldXIgdmV1dCBvdSBwZXV0IHRyYWl0ZXIuCitodHRwLjQxND1MZSBzZXJ2ZXVyIGEgcmVmdXPpIGNldHRlIHJlcXXqdGUgY2FyIFVSSSBkZSByZXF16nRlIGVzdCB0cm9wIGxvbmd1ZSAoezB9KS4KK2h0dHAuNDE1PUxlIHNlcnZldXIgYSByZWZ1c+kgY2V0dGUgcmVxdep0ZSBjYXIgbCcnZW50aXTpIGRlIHJlcXXqdGUgZXN0IGRhbnMgdW4gZm9ybWF0IG5vbiBzdXBwb3J06SBwYXIgbGEgcmVzc291cmNlIGRlbWFuZOllIGF2ZWMgbGEgbel0aG9kZSBzcOljaWZp6WUgKHswfSkuCitodHRwLjQxNj1MYSBwbGFjZSBkJydvY3RldHMgKGJ5dGUgcmFuZ2UpIG5lIHBldXQg6nRyZSBzYXRpc2ZhaXRlICh7MH0pLgoraHR0cC40MTc9TCcnYXR0ZW50ZSBpbmRpcXXpIGRhbnMgbGEgZGlyZWN0aXZlICJFeHBlY3QiIGRlIGwnJ2VudOp0ZSBkZSByZXF16nRlICh7MH0pIG5lIHBldXQg6nRyZSBzYXRpc2ZhaXRlLgoraHR0cC40MjI9TGUgc2VydmV1ciBhIGNvbXByaXMgbGUgdHlwZSBkZSBjb250ZW51IChjb250ZW50IHR5cGUpIGFpbnNpIHF1ZSBsYSBzeW50aGF4ZSBkZSBsYSByZXF16nRlIG1haXMgYSDpdOkgaW5jYXBhYmxlIGRlIHRyYWl0ZXIgbGVzIGluc3RydWN0aW9ucyBjb250ZW51ZXMgKHswfSkuCitodHRwLjQyMz1MYSByZXNzb3VyY2Ugc291cmNlIG91IGRlc3RpbmF0aW9uIGRlIGxhIG3pdGhvZGUgZXN0IHbpcnJvdWlsbOllICh7MH0pLgoraHR0cC41MDA9TGUgc2VydmV1ciBhIHJlbmNvbnRy6SB1bmUgZXJyZXVyIGludGVybmUgKHswfSkgcXVpIGwnJ2EgZW1w6mNo6SBkZSBzYXRpc2ZhaXJlIGxhIHJlcXXqdGUuCitodHRwLjUwMT1MZSBzZXJ2ZXVyIG5lIHN1cHBvcnRlIHBhcyBsYSBmb25jdGlvbm5hbGl06SBkZW1hbmTpZSBwb3VyIHNhdGlzZmFpcmUgY2V0dGUgcmVxdep0ZSAoezB9KS4KK2h0dHAuNTAyPUxlIHNlcnZldXIgYSByZed1IHVuZSBy6XBvbnNlIGludmFsaWRlIGQnJ3VuIHNlcnZldXIgcXUnJ2lsIGNvbnN1bHRhaXQgZW4gdGFudCBxdWUgcmVsYWlzIG91IHBhc3NlcmVsbGUgKHswfSkuCitodHRwLjUwMz1MZSBzZXJ2aWNlIGRlbWFuZOkgKHswfSkgbicnZXN0IHBhcyBkaXNwb25pYmxlIGFjdHVlbGxlbWVudC4KK2h0dHAuNTA0PUxlIHNlcnZldXIgYSByZed1IHVuIGTpcGFzc2VtZW50IGRlIGRlbGFpcyAodGltZW91dCkgZCcndW4gc2VydmV1ciBhbW9udCBxdScnaWwgY29uc3VsdGFpdCBlbiB0YW50IHF1ZSByZWxhaXMgb3UgcGFzc2VyZWxsZSAoezB9KS4KK2h0dHAuNTA1PUxlIHNlcnZldXIgbmUgc3VwcG9ydGUgcGFzIGxhIHZlcnNpb24gZGUgcHJvdG9jb2xlIEhUVFAgZGVtYW5k6SAoezB9KS4KK2h0dHAuNTA3PUxhIHJlc3NvdXJjZSBuJydhIHBhcyBhc3NleiBkJydlc3BhY2UgcG91ciBlbnJlZ2lzdHJlciBsJyfpdGF0IGRlIGxhIHJlc3NvdXJjZSBhcHLocyBleOljdXRpb24gZGUgY2V0dGUgbel0aG9kZSAoezB9KS4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMDEzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjIgQEAKK2FjY2Vzc0xvZ1ZhbHZlLmFscmVhZHlTdGFydGVkPVx1MzBhMlx1MzBhZlx1MzBiYlx1MzBiOVx1MzBlZFx1MzBhY1x1MzBmY1x1MzA2Zlx1NjVlMlx1MzA2Ylx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorYWNjZXNzTG9nVmFsdmUubm90U3RhcnRlZD1cdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjlcdTMwZWRcdTMwYWNcdTMwZmNcdTMwNmZcdTMwN2VcdTMwNjBcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2NlcnRpZmljYXRlc1ZhbHZlLmFscmVhZHlTdGFydGVkPVx1OGE4ZFx1OGEzY1x1MzBkMFx1MzBlYlx1MzBkNlx1MzA2Zlx1NjVlMlx1MzA2Ylx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorY2VydGlmaWNhdGVzVmFsdmUubm90U3RhcnRlZD1cdThhOGRcdThhM2NcdTMwZDBcdTMwZWJcdTMwZDZcdTMwNmZcdTMwN2VcdTMwNjBcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2ludGVyY2VwdG9yVmFsdmUuYWxyZWFkeVN0YXJ0ZWQ9XHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGJiXHUzMGQ3XHUzMGJmXHUzMGQwXHUzMGViXHUzMGQ2XHUzMDZmXHU2NWUyXHUzMDZiXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitpbnRlcmNlcHRvclZhbHZlLm5vdFN0YXJ0ZWQ9XHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGJiXHUzMGQ3XHUzMGJmXHUzMGQwXHUzMGViXHUzMGQ2XHUzMDZmXHUzMDdlXHUzMDYwXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCityZXF1ZXN0RmlsdGVyVmFsdmUubmV4dD1cdTZiMjFcdTMwNmVcdTMwZDBcdTMwZWJcdTMwZDZcdTMwNGNcdThhMmRcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK3JlcXVlc3RGaWx0ZXJWYWx2ZS5zeW50YXg9XHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMGQ1XHUzMGEzXHUzMGViXHUzMGJmXHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzIHswfSBcdTMwNmJcdTY5Y2JcdTY1ODdcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTkKK2pkYmNBY2Nlc3NMb2dWYWx2ZS5leGNlcHRpb249XHUzMGEyXHUzMGFmXHUzMGJiXHUzMGI5XHUzMGE4XHUzMGYzXHUzMGM4XHUzMGVhXHUzMDZlXHU2MzNmXHU1MTY1XHUzMDkyXHU1YjlmXHU4ODRjXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitqZGJjQWNjZXNzTG9nVmFsdmUuY2xvc2U9XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHU2M2E1XHU3ZDlhXHUzMDkyXHUzMGFmXHUzMGVkXHUzMGZjXHUzMGJhXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CisKKyMgRXJyb3IgcmVwb3J0IHZhbHZlCit2YWx2ZUJhc2Uubm9OZXh0PVx1OGEyZFx1NWI5YVx1MzBhOFx1MzBlOVx1MzBmYzogXHU2YjIxXHUzMDZlXHUzMGQwXHUzMGViXHUzMGQ2XHUzMDRjXHU4YTJkXHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitlcnJvclJlcG9ydFZhbHZlLnN0YXR1c0hlYWRlcj1IVFRQXHUzMGI5XHUzMGM2XHUzMGZjXHUzMGJmXHUzMGI5IHswfSAtIHsxfQorZXJyb3JSZXBvcnRWYWx2ZS5leGNlcHRpb25SZXBvcnQ9XHU0ZjhiXHU1OTE2XHUzMGVjXHUzMGRkXHUzMGZjXHUzMGM4CitlcnJvclJlcG9ydFZhbHZlLnN0YXR1c1JlcG9ydD1cdTMwYjlcdTMwYzZcdTMwZmNcdTMwYmZcdTMwYjlcdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzgKK2Vycm9yUmVwb3J0VmFsdmUubWVzc2FnZT1cdTMwZTFcdTMwYzNcdTMwYmJcdTMwZmNcdTMwYjgKK2Vycm9yUmVwb3J0VmFsdmUuZGVzY3JpcHRpb249XHU4YWFjXHU2NjBlCitlcnJvclJlcG9ydFZhbHZlLmV4Y2VwdGlvbj1cdTRmOGJcdTU5MTYKK2Vycm9yUmVwb3J0VmFsdmUucm9vdENhdXNlPVx1NTM5Zlx1NTZlMAorZXJyb3JSZXBvcnRWYWx2ZS5ub3RlPVx1NmNlOFx1NjEwZgorZXJyb3JSZXBvcnRWYWx2ZS5yb290Q2F1c2VJbkxvZ3M9XHU1MzlmXHU1NmUwXHUzMDZlXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHUzMGI5XHUzMGJmXHUzMGMzXHUzMGFmXHUzMGM4XHUzMGVjXHUzMGZjXHUzMGI5XHUzMDZmXHUzMDAxezB9XHUzMDZlXHUzMGVkXHUzMGIwXHUzMDZiXHU4YTE4XHU5MzMyXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1BlcnNpc3RlbnRWYWx2ZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9QZXJzaXN0ZW50VmFsdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjRmNjAyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9QZXJzaXN0ZW50VmFsdmUuamF2YQpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uUGVyc2lzdGVudE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CisKKworLyoqCisgKiBWYWx2ZSB0aGF0IGltcGxlbWVudHMgdGhlIGRlZmF1bHQgYmFzaWMgYmVoYXZpb3IgZm9yIHRoZQorICogPGNvZGU+U3RhbmRhcmRIb3N0PC9jb2RlPiBjb250YWluZXIgaW1wbGVtZW50YXRpb24uCisgKiA8cD4KKyAqIDxiPlVTQUdFIENPTlNUUkFJTlQ8L2I+OiBUbyB3b3JrIGNvcnJlY3RseSBpdCByZXF1aXJlcyBhICBQZXJzaXN0ZW50TWFuYWdlci4KKyAqCisgKiBAYXV0aG9yIEplYW4tRnJlZGVyaWMgQ2xlcmUKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFBlcnNpc3RlbnRWYWx2ZQorICAgIGV4dGVuZHMgVmFsdmVCYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUGVyc2lzdGVudFZhbHZlLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGNoaWxkIENvbnRleHQgdG8gcHJvY2VzcyB0aGlzIHJlcXVlc3QsCisgICAgICogYmFzZWQgb24gdGhlIHNwZWNpZmllZCByZXF1ZXN0IFVSSS4gIElmIG5vIG1hdGNoaW5nIENvbnRleHQgY2FuCisgICAgICogYmUgZm91bmQsIHJldHVybiBhbiBhcHByb3ByaWF0ZSBIVFRQIGVycm9yLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2UgdG8gYmUgcHJvZHVjZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycmVkCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFNlbGVjdCB0aGUgQ29udGV4dCB0byBiZSB1c2VkIGZvciB0aGlzIFJlcXVlc3QKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRDb250ZXh0KCk7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJzdGFuZGFyZEhvc3Qubm9Db250ZXh0IikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQmluZCB0aGUgY29udGV4dCBDTCB0byB0aGUgY3VycmVudCB0aHJlYWQKKyAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIKKyAgICAgICAgICAgIChjb250ZXh0LmdldExvYWRlcigpLmdldENsYXNzTG9hZGVyKCkpOworCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2Vzc2lvbiBsYXN0IGFjY2VzcyB0aW1lIGZvciBvdXIgc2Vzc2lvbiAoaWYgYW55KQorICAgICAgICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKTsKKyAgICAgICAgTWFuYWdlciBtYW5hZ2VyID0gY29udGV4dC5nZXRNYW5hZ2VyKCk7CisgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gbnVsbCAmJiBtYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtYW5hZ2VyIGluc3RhbmNlb2YgUGVyc2lzdGVudE1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICBTdG9yZSBzdG9yZSA9ICgoUGVyc2lzdGVudE1hbmFnZXIpIG1hbmFnZXIpLmdldFN0b3JlKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0b3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gPSBzdG9yZS5sb2FkKHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZXJyb3IoImRlc2VyaWFsaXplRXJyb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlc3Npb24uaXNWYWxpZCgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXNzaW9uU3RhbGUoc2Vzc2lvbiwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZGVidWcoInNlc3Npb24gc3dhcHBlZCBpbiBpcyBpbnZhbGlkIG9yIGV4cGlyZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmV4cGlyZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLnJlbW92ZShzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnNldE1hbmFnZXIobWFuYWdlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2Vzc2lvbi5zZXRJZChzZXNzaW9uSWQpOyBPbmx5IGlmIG5ldyA/Pz8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmFkZChzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoKFN0YW5kYXJkU2Vzc2lvbilzZXNzaW9uKS5hY3RpdmF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uYWNjZXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmRlYnVnKCJzZXNzaW9uSWQ6ICIgKyBzZXNzaW9uSWQpOworCisgICAgICAgIC8vIEFzayB0aGUgbmV4dCB2YWx2ZSB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LgorICAgICAgICBnZXROZXh0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgICAgICAvLyBSZWFkIHRoZSBzZXNzaW9uaWQgYWZ0ZXIgdGhlIHJlc3BvbnNlLgorICAgICAgICAvLyBIdHRwU2Vzc2lvbiBoc2VzcyA9IGhyZXEuZ2V0U2Vzc2lvbihmYWxzZSk7CisgICAgICAgIFNlc3Npb24gaHNlc3M7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBoc2VzcyA9IHJlcXVlc3QuZ2V0U2Vzc2lvbkludGVybmFsKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgaHNlc3MgPSBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBuZXdzZXNzaW9uSWQgPSBudWxsOworICAgICAgICBpZiAoaHNlc3MhPW51bGwpCisgICAgICAgICAgICBuZXdzZXNzaW9uSWQgPSBoc2Vzcy5nZXRJZEludGVybmFsKCk7CisKKyAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmRlYnVnKCJuZXdzZXNzaW9uSWQ6ICIgKyBuZXdzZXNzaW9uSWQpOworICAgICAgICBpZiAobmV3c2Vzc2lvbklkIT1udWxsKSB7CisgICAgICAgICAgICAvKiBzdG9yZSB0aGUgc2Vzc2lvbiBpbiB0aGUgc3RvcmUgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBtYW5hZ2VyICovCisgICAgICAgICAgICBpZiAobWFuYWdlciBpbnN0YW5jZW9mIFBlcnNpc3RlbnRNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbWFuYWdlci5maW5kU2Vzc2lvbihuZXdzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIFN0b3JlIHN0b3JlID0gKChQZXJzaXN0ZW50TWFuYWdlcikgbWFuYWdlcikuZ2V0U3RvcmUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RvcmUgIT0gbnVsbCAmJiBzZXNzaW9uIT1udWxsICYmCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uaXNWYWxpZCgpICYmCisgICAgICAgICAgICAgICAgICAgICFpc1Nlc3Npb25TdGFsZShzZXNzaW9uLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gKChTdGFuZGFyZFNlc3Npb24pc2Vzc2lvbikucGFzc2l2YXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlLnNhdmUoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICgoUGVyc2lzdGVudE1hbmFnZXIpIG1hbmFnZXIpLnJlbW92ZVN1cGVyKHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZGVidWcoIm5ld3Nlc3Npb25JZCBzdG9yZTogIiArIHN0b3JlICsgIiBzZXNzaW9uOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiArICIgdmFsaWQ6ICIgKyBzZXNzaW9uLmlzVmFsaWQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgU3RhbGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXNzaW9uU3RhbGUoc2Vzc2lvbiwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZGVidWcoIm5ld3Nlc3Npb25JZCBNYW5hZ2VyOiAiICsgbWFuYWdlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBzZXNzaW9uIGhhcyBiZWVuIGlkbGUgZm9yIGxvbmdlcgorICAgICAqIHRoYW4gaXRzIGV4cGlyYXRpb24gZGF0ZSBhcyBvZiB0aGUgc3VwcGxpZWQgdGltZS4KKyAgICAgKgorICAgICAqIEZJWE1FOiBQcm9iYWJseSBiZWxvbmdzIGluIHRoZSBTZXNzaW9uIGNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU2Vzc2lvblN0YWxlKFNlc3Npb24gc2Vzc2lvbiwgbG9uZyB0aW1lTm93KSB7CisgCisgICAgICAgIGludCBtYXhJbmFjdGl2ZUludGVydmFsID0gc2Vzc2lvbi5nZXRNYXhJbmFjdGl2ZUludGVydmFsKCk7CisgICAgICAgIGlmIChtYXhJbmFjdGl2ZUludGVydmFsID49IDApIHsKKyAgICAgICAgICAgIGludCB0aW1lSWRsZSA9IC8vIFRydW5jYXRlLCBkbyBub3Qgcm91bmQgdXAKKyAgICAgICAgICAgICAgICAoaW50KSAoKHRpbWVOb3cgLSBzZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWUoKSkgLyAxMDAwTCk7CisgICAgICAgICAgICBpZiAodGltZUlkbGUgPj0gbWF4SW5hY3RpdmVJbnRlcnZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorIAorICAgICAgICByZXR1cm4gZmFsc2U7CisgCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1JlbW90ZUFkZHJWYWx2ZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9SZW1vdGVBZGRyVmFsdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWE3MjVlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9SZW1vdGVBZGRyVmFsdmUuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworCisKKy8qKgorICogQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+UmVxdWVzdEZpbHRlclZhbHZlPC9jb2RlPiB0aGF0IGZpbHRlcnMKKyAqIGJhc2VkIG9uIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlbW90ZSBjbGllbnQncyBJUCBhZGRyZXNzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgUmVtb3RlQWRkclZhbHZlCisgICAgZXh0ZW5kcyBSZXF1ZXN0RmlsdGVyVmFsdmUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZW1vdGVBZGRyVmFsdmUvMS4wIjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFZhbHZlIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRXh0cmFjdCB0aGUgZGVzaXJlZCByZXF1ZXN0IHByb3BlcnR5LCBhbmQgcGFzcyBpdCAoYWxvbmcgd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugb2JqZWN0cykgdG8gdGhlIHByb3RlY3RlZAorICAgICAqIDxjb2RlPnByb2Nlc3MoKTwvY29kZT4gbWV0aG9kIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBmaWx0ZXJpbmcuCisgICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIGNvbmNyZXRlIHN1YmNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2UgdG8gYmUgY3JlYXRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZva2UoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBwcm9jZXNzKHJlcXVlc3QuZ2V0UmVxdWVzdCgpLmdldFJlbW90ZUFkZHIoKSwgcmVxdWVzdCwgcmVzcG9uc2UpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvUmVtb3RlSG9zdFZhbHZlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1JlbW90ZUhvc3RWYWx2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDY3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1JlbW90ZUhvc3RWYWx2ZS5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CisKKworLyoqCisgKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5SZXF1ZXN0RmlsdGVyVmFsdmU8L2NvZGU+IHRoYXQgZmlsdGVycworICogYmFzZWQgb24gdGhlIHJlbW90ZSBjbGllbnQncyBob3N0IG5hbWUuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSZW1vdGVIb3N0VmFsdmUKKyAgICBleHRlbmRzIFJlcXVlc3RGaWx0ZXJWYWx2ZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlbW90ZUhvc3RWYWx2ZS8xLjAiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0IHRoZSBkZXNpcmVkIHJlcXVlc3QgcHJvcGVydHksIGFuZCBwYXNzIGl0IChhbG9uZyB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCByZXF1ZXN0IGFuZCByZXNwb25zZSBvYmplY3RzKSB0byB0aGUgcHJvdGVjdGVkCisgICAgICogPGNvZGU+cHJvY2VzcygpPC9jb2RlPiBtZXRob2QgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIGZpbHRlcmluZy4KKyAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgY29uY3JldGUgc3ViY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB0byBiZSBjcmVhdGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHByb2Nlc3MocmVxdWVzdC5nZXRSZXF1ZXN0KCkuZ2V0UmVtb3RlSG9zdCgpLCByZXF1ZXN0LCByZXNwb25zZSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9SZXF1ZXN0RHVtcGVyVmFsdmUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvUmVxdWVzdER1bXBlclZhbHZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0N2QwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvUmVxdWVzdER1bXBlclZhbHZlLmphdmEKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIGEgVmFsdmUgdGhhdCBsb2dzIGludGVyZXN0aW5nIGNvbnRlbnRzIGZyb20gdGhlCisgKiBzcGVjaWZpZWQgUmVxdWVzdCAoYmVmb3JlIHByb2Nlc3NpbmcpIGFuZCB0aGUgY29ycmVzcG9uZGluZyBSZXNwb25zZQorICogKGFmdGVyIHByb2Nlc3NpbmcpLiAgSXQgaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4gZGVidWdnaW5nIHByb2JsZW1zCisgKiByZWxhdGVkIHRvIGhlYWRlcnMgYW5kIGNvb2tpZXMuPC9wPgorICoKKyAqIDxwPlRoaXMgVmFsdmUgbWF5IGJlIGF0dGFjaGVkIHRvIGFueSBDb250YWluZXIsIGRlcGVuZGluZyBvbiB0aGUgZ3JhbnVsYXJpdHkKKyAqIG9mIHRoZSBsb2dnaW5nIHlvdSB3aXNoIHRvIHBlcmZvcm0uPC9wPgorICoKKyAqIDxwPk5vdGUgdGhhdCB0aGlzIFZhbHZlIHNldHMgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgcmVxdWVzdCB0byB0aGUgZGVmYXVsdAorICogKElTTy04ODU5LTEpIGlmIGl0J3MgdGhlIGZpcnN0IHRoaW5nIGludm9raW5nIHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMsIHdoaWNoCisgKiBpcyB1c3VhbGx5IHRoZSBjYXNlLiAgSWYgeW91J3JlIHJ1bm5pbmcgaW4gYW4gZW52aXJvbm1lbnQgd2hlcmUgdGhpcyBlbmNvZGluZworICogaXMgcHJvYmxlbWF0aWMsIGNvbnNpZGVyIHVzaW5nIGFub3RoZXIgZGVidWdnaW5nIGFwcHJvYWNoIHN1Y2ggYXMgYSBGaWx0ZXIgdGhhdAorICogcmVwcm9kdWNlcyB0aGlzIFZhbHZlJ3MgZnVuY3Rpb25hbGl0eS48L3A+CisgKgorICogPHA+Rm9yIGEgc2ltaWxhciBtZWNoYW5pc20gdGhhdCBpcyBwb3J0YWJsZSB0byBhbGwgU2VydmxldCAyLjQKKyAqIGNvbnRhaW5lcnMsIGNoZWNrIG91dCB0aGUgIlJlcXVlc3REdW1wZXJGaWx0ZXIiIEZpbHRlciBpbiB0aGUKKyAqIGV4YW1wbGUgYXBwbGljYXRpb24gKHRoZSBzb3VyY2UgZm9yIHRoaXMgZmlsdGVyIG1heSBiZSBmb3VuZCBpbgorICogJENBVEFMSU5BX0hPTUUvd2ViYXBwcy9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycy48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0RHVtcGVyVmFsdmUgZXh0ZW5kcyBWYWx2ZUJhc2UgeworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlcXVlc3REdW1wZXJWYWx2ZS8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgU3RyaW5nTWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBWYWx2ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIExvZyB0aGUgaW50ZXJlc3RpbmcgcmVxdWVzdCBwYXJhbWV0ZXJzLCBpbnZva2UgdGhlIG5leHQgVmFsdmUgaW4gdGhlCisgICAgICogc2VxdWVuY2UsIGFuZCBsb2cgdGhlIGludGVyZXN0aW5nIHJlc3BvbnNlIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB0byBiZSBjcmVhdGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIExvZyBsb2cgPSBjb250YWluZXIuZ2V0TG9nZ2VyKCk7CisgICAgICAgIAorICAgICAgICAvLyBMb2cgcHJlLXNlcnZpY2UgaW5mb3JtYXRpb24KKyAgICAgICAgbG9nLmluZm8oIlJFUVVFU1QgVVJJICAgICAgID0iICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICBsb2cuaW5mbygiICAgICAgICAgIGF1dGhUeXBlPSIgKyByZXF1ZXN0LmdldEF1dGhUeXBlKCkpOworICAgICAgICBsb2cuaW5mbygiIGNoYXJhY3RlckVuY29kaW5nPSIgKyByZXF1ZXN0LmdldENoYXJhY3RlckVuY29kaW5nKCkpOworICAgICAgICBsb2cuaW5mbygiICAgICBjb250ZW50TGVuZ3RoPSIgKyByZXF1ZXN0LmdldENvbnRlbnRMZW5ndGgoKSk7CisgICAgICAgIGxvZy5pbmZvKCIgICAgICAgY29udGVudFR5cGU9IiArIHJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKSk7CisgICAgICAgIGxvZy5pbmZvKCIgICAgICAgY29udGV4dFBhdGg9IiArIHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSk7CisgICAgICAgIENvb2tpZSBjb29raWVzW10gPSByZXF1ZXN0LmdldENvb2tpZXMoKTsKKyAgICAgICAgaWYgKGNvb2tpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb29raWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCIgICAgICAgICAgICBjb29raWU9IiArIGNvb2tpZXNbaV0uZ2V0TmFtZSgpICsgIj0iICsKKyAgICAgICAgICAgICAgICAgICAgY29va2llc1tpXS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBFbnVtZXJhdGlvbiBobmFtZXMgPSByZXF1ZXN0LmdldEhlYWRlck5hbWVzKCk7CisgICAgICAgIHdoaWxlIChobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBobmFtZSA9IChTdHJpbmcpIGhuYW1lcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgRW51bWVyYXRpb24gaHZhbHVlcyA9IHJlcXVlc3QuZ2V0SGVhZGVycyhobmFtZSk7CisgICAgICAgICAgICB3aGlsZSAoaHZhbHVlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBodmFsdWUgPSAoU3RyaW5nKSBodmFsdWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgbG9nLmluZm8oIiAgICAgICAgICAgIGhlYWRlcj0iICsgaG5hbWUgKyAiPSIgKyBodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvZy5pbmZvKCIgICAgICAgICAgICBsb2NhbGU9IiArIHJlcXVlc3QuZ2V0TG9jYWxlKCkpOworICAgICAgICBsb2cuaW5mbygiICAgICAgICAgICAgbWV0aG9kPSIgKyByZXF1ZXN0LmdldE1ldGhvZCgpKTsKKyAgICAgICAgRW51bWVyYXRpb24gcG5hbWVzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICB3aGlsZSAocG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgcG5hbWUgPSAoU3RyaW5nKSBwbmFtZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIFN0cmluZyBwdmFsdWVzW10gPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhwbmFtZSk7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihwbmFtZSk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCc9Jyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwdmFsdWVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZy5pbmZvKCIgICAgICAgICBwYXJhbWV0ZXI9IiArIHJlc3VsdC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBsb2cuaW5mbygiICAgICAgICAgIHBhdGhJbmZvPSIgKyByZXF1ZXN0LmdldFBhdGhJbmZvKCkpOworICAgICAgICBsb2cuaW5mbygiICAgICAgICAgIHByb3RvY29sPSIgKyByZXF1ZXN0LmdldFByb3RvY29sKCkpOworICAgICAgICBsb2cuaW5mbygiICAgICAgIHF1ZXJ5U3RyaW5nPSIgKyByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCkpOworICAgICAgICBsb2cuaW5mbygiICAgICAgICByZW1vdGVBZGRyPSIgKyByZXF1ZXN0LmdldFJlbW90ZUFkZHIoKSk7CisgICAgICAgIGxvZy5pbmZvKCIgICAgICAgIHJlbW90ZUhvc3Q9IiArIHJlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgICAgcmVtb3RlVXNlcj0iICsgcmVxdWVzdC5nZXRSZW1vdGVVc2VyKCkpOworICAgICAgICBsb2cuaW5mbygicmVxdWVzdGVkU2Vzc2lvbklkPSIgKyByZXF1ZXN0LmdldFJlcXVlc3RlZFNlc3Npb25JZCgpKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgICAgICAgIHNjaGVtZT0iICsgcmVxdWVzdC5nZXRTY2hlbWUoKSk7CisgICAgICAgIGxvZy5pbmZvKCIgICAgICAgIHNlcnZlck5hbWU9IiArIHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgICAgc2VydmVyUG9ydD0iICsgcmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCkpOworICAgICAgICBsb2cuaW5mbygiICAgICAgIHNlcnZsZXRQYXRoPSIgKyByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkpOworICAgICAgICBsb2cuaW5mbygiICAgICAgICAgIGlzU2VjdXJlPSIgKyByZXF1ZXN0LmlzU2VjdXJlKCkpOworICAgICAgICBsb2cuaW5mbygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisKKyAgICAgICAgLy8gUGVyZm9ybSB0aGUgcmVxdWVzdAorICAgICAgICBnZXROZXh0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgICAgICAvLyBMb2cgcG9zdC1zZXJ2aWNlIGluZm9ybWF0aW9uCisgICAgICAgIGxvZy5pbmZvKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgICAgICBhdXRoVHlwZT0iICsgcmVxdWVzdC5nZXRBdXRoVHlwZSgpKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgY29udGVudExlbmd0aD0iICsgcmVzcG9uc2UuZ2V0Q29udGVudExlbmd0aCgpKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgICBjb250ZW50VHlwZT0iICsgcmVzcG9uc2UuZ2V0Q29udGVudFR5cGUoKSk7CisgICAgICAgIENvb2tpZSByY29va2llc1tdID0gcmVzcG9uc2UuZ2V0Q29va2llcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJjb29raWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBsb2cuaW5mbygiICAgICAgICAgICAgY29va2llPSIgKyByY29va2llc1tpXS5nZXROYW1lKCkgKyAiPSIgKworICAgICAgICAgICAgICAgIHJjb29raWVzW2ldLmdldFZhbHVlKCkgKyAiOyBkb21haW49IiArCisgICAgICAgICAgICAgICAgcmNvb2tpZXNbaV0uZ2V0RG9tYWluKCkgKyAiOyBwYXRoPSIgKyByY29va2llc1tpXS5nZXRQYXRoKCkpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyByaG5hbWVzW10gPSByZXNwb25zZS5nZXRIZWFkZXJOYW1lcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJobmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyByaHZhbHVlc1tdID0gcmVzcG9uc2UuZ2V0SGVhZGVyVmFsdWVzKHJobmFtZXNbaV0pOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCByaHZhbHVlcy5sZW5ndGg7IGorKykKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiICAgICAgICAgICAgaGVhZGVyPSIgKyByaG5hbWVzW2ldICsgIj0iICsgcmh2YWx1ZXNbal0pOworICAgICAgICB9CisgICAgICAgIGxvZy5pbmZvKCIgICAgICAgICAgIG1lc3NhZ2U9IiArIHJlc3BvbnNlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGxvZy5pbmZvKCIgICAgICAgIHJlbW90ZVVzZXI9IiArIHJlcXVlc3QuZ2V0UmVtb3RlVXNlcigpKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgICAgICAgIHN0YXR1cz0iICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBsb2cuaW5mbygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZW5kZXJpbmcgb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJSZXF1ZXN0RHVtcGVyVmFsdmVbIik7CisgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZChjb250YWluZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9SZXF1ZXN0RmlsdGVyVmFsdmUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvUmVxdWVzdEZpbHRlclZhbHZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ1NjE2YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvUmVxdWVzdEZpbHRlclZhbHZlLmphdmEKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5jb21wYXQuSmRrQ29tcGF0OworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIGEgVmFsdmUgdGhhdCBwZXJmb3JtcyBmaWx0ZXJpbmcgYmFzZWQgb24gY29tcGFyaW5nIHRoZQorICogYXBwcm9wcmlhdGUgcmVxdWVzdCBwcm9wZXJ0eSAoc2VsZWN0ZWQgYmFzZWQgb24gd2hpY2ggc3ViY2xhc3MgeW91IGNob29zZQorICogdG8gY29uZmlndXJlIGludG8geW91ciBDb250YWluZXIncyBwaXBlbGluZSkgYWdhaW5zdCBhIHNldCBvZiByZWd1bGFyCisgKiBleHByZXNzaW9ucyBjb25maWd1cmVkIGZvciB0aGlzIFZhbHZlLgorICogPHA+CisgKiBUaGlzIHZhbHZlIGlzIGNvbmZpZ3VyZWQgYnkgc2V0dGluZyB0aGUgPGNvZGU+YWxsb3c8L2NvZGU+IGFuZC9vcgorICogPGNvZGU+ZGVueTwvY29kZT4gcHJvcGVydGllcyB0byBhIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIHJlZ3VsYXIKKyAqIGV4cHJlc3Npb25zIChpbiB0aGUgc3ludGF4IHN1cHBvcnRlZCBieSB0aGUgamFrYXJ0YS1yZWdleHAgbGlicmFyeSkgdG8KKyAqIHdoaWNoIHRoZSBhcHByb3ByaWF0ZSByZXF1ZXN0IHByb3BlcnR5IHdpbGwgYmUgY29tcGFyZWQuICBFdmFsdWF0aW9uCisgKiBwcm9jZWVkcyBhcyBmb2xsb3dzOgorICogPHVsPgorICogPGxpPlRoZSBzdWJjbGFzcyBleHRyYWN0cyB0aGUgcmVxdWVzdCBwcm9wZXJ0eSB0byBiZSBmaWx0ZXJlZCwgYW5kCisgKiAgICAgY2FsbHMgdGhlIGNvbW1vbiA8Y29kZT5wcm9jZXNzKCk8L2NvZGU+IG1ldGhvZC4KKyAqIDxsaT5JZiB0aGVyZSBhcmUgYW55IGRlbnkgZXhwcmVzc2lvbnMgY29uZmlndXJlZCwgdGhlIHByb3BlcnR5IHdpbGwKKyAqICAgICBiZSBjb21wYXJlZCB0byBlYWNoIHN1Y2ggZXhwcmVzc2lvbi4gIElmIGEgbWF0Y2ggaXMgZm91bmQsIHRoaXMKKyAqICAgICByZXF1ZXN0IHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCBhICJGb3JiaWRkZW4iIEhUVFAgcmVzcG9uc2UuPC9saT4KKyAqIDxsaT5JZiB0aGVyZSBhcmUgYW55IGFsbG93IGV4cHJlc3Npb25zIGNvbmZpZ3VyZWQsIHRoZSBwcm9wZXJ0eSB3aWxsCisgKiAgICAgYmUgY29tcGFyZWQgdG8gZWFjaCBzdWNoIGV4cHJlc3Npb24uICBJZiBhIG1hdGNoIGlzIGZvdW5kLCB0aGlzCisgKiAgICAgcmVxdWVzdCB3aWxsIGJlIGFsbG93ZWQgdG8gcGFzcyB0aHJvdWdoIHRvIHRoZSBuZXh0IFZhbHZlIGluIHRoZQorICogICAgIGN1cnJlbnQgcGlwZWxpbmUuPC9saT4KKyAqIDxsaT5JZiBvbmUgb3IgbW9yZSBkZW55IGV4cHJlc3Npb25zIHdhcyBzcGVjaWZpZWQgYnV0IG5vIGFsbG93IGV4cHJlc3Npb25zLAorICogICAgIGFsbG93IHRoaXMgcmVxdWVzdCB0byBwYXNzIHRocm91Z2ggKGJlY2F1c2Ugbm9uZSBvZiB0aGUgZGVueQorICogICAgIGV4cHJlc3Npb25zIG1hdGNoZWQgaXQpLgorICogPGxpPlRoZSByZXF1ZXN0IHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCBhICJGb3JiaWRkZW4iIEhUVFAgcmVzcG9uc2UuPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIFRoaXMgVmFsdmUgbWF5IGJlIGF0dGFjaGVkIHRvIGFueSBDb250YWluZXIsIGRlcGVuZGluZyBvbiB0aGUgZ3JhbnVsYXJpdHkKKyAqIG9mIHRoZSBmaWx0ZXJpbmcgeW91IHdpc2ggdG8gcGVyZm9ybS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIFJlcXVlc3RGaWx0ZXJWYWx2ZQorICAgIGV4dGVuZHMgVmFsdmVCYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xhc3MgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIEpESyBjb21wYXRpYmlsaXR5IHN1cHBvcnQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKZGtDb21wYXQgamRrQ29tcGF0ID0gSmRrQ29tcGF0LmdldEpka0NvbXBhdCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlcXVlc3RGaWx0ZXJWYWx2ZS8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgU3RyaW5nTWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tbWEtZGVsaW1pdGVkIHNldCBvZiA8Y29kZT5hbGxvdzwvY29kZT4gZXhwcmVzc2lvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBhbGxvdyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgPGNvZGU+YWxsb3c8L2NvZGU+IHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2Ugd2lsbCBldmFsdWF0ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGF0dGVybiBhbGxvd3NbXSA9IG5ldyBQYXR0ZXJuWzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIDxjb2RlPmRlbnk8L2NvZGU+IHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2Ugd2lsbCBldmFsdWF0ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGF0dGVybiBkZW5pZXNbXSA9IG5ldyBQYXR0ZXJuWzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tbWEtZGVsaW1pdGVkIHNldCBvZiA8Y29kZT5kZW55PC9jb2RlPiBleHByZXNzaW9ucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlbnkgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29tbWEtZGVsaW1pdGVkIHNldCBvZiB0aGUgPGNvZGU+YWxsb3c8L2NvZGU+IGV4cHJlc3Npb25zCisgICAgICogY29uZmlndXJlZCBmb3IgdGhpcyBWYWx2ZSwgaWYgYW55OyBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsbG93KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5hbGxvdyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29tbWEtZGVsaW1pdGVkIHNldCBvZiB0aGUgPGNvZGU+YWxsb3c8L2NvZGU+IGV4cHJlc3Npb25zCisgICAgICogY29uZmlndXJlZCBmb3IgdGhpcyBWYWx2ZSwgaWYgYW55LgorICAgICAqCisgICAgICogQHBhcmFtIGFsbG93IFRoZSBuZXcgc2V0IG9mIGFsbG93IGV4cHJlc3Npb25zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxsb3coU3RyaW5nIGFsbG93KSB7CisKKyAgICAgICAgdGhpcy5hbGxvdyA9IGFsbG93OworICAgICAgICBhbGxvd3MgPSBwcmVjYWxjdWxhdGUoYWxsb3cpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb21tYS1kZWxpbWl0ZWQgc2V0IG9mIHRoZSA8Y29kZT5kZW55PC9jb2RlPiBleHByZXNzaW9ucworICAgICAqIGNvbmZpZ3VyZWQgZm9yIHRoaXMgVmFsdmUsIGlmIGFueTsgb3RoZXJ3aXNlLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZW55KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5kZW55KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb21tYS1kZWxpbWl0ZWQgc2V0IG9mIHRoZSA8Y29kZT5kZW55PC9jb2RlPiBleHByZXNzaW9ucworICAgICAqIGNvbmZpZ3VyZWQgZm9yIHRoaXMgVmFsdmUsIGlmIGFueS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZW55IFRoZSBuZXcgc2V0IG9mIGRlbnkgZXhwcmVzc2lvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZW55KFN0cmluZyBkZW55KSB7CisKKyAgICAgICAgdGhpcy5kZW55ID0gZGVueTsKKyAgICAgICAgZGVuaWVzID0gcHJlY2FsY3VsYXRlKGRlbnkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBWYWx2ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEV4dHJhY3QgdGhlIGRlc2lyZWQgcmVxdWVzdCBwcm9wZXJ0eSwgYW5kIHBhc3MgaXQgKGFsb25nIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG9iamVjdHMpIHRvIHRoZSBwcm90ZWN0ZWQKKyAgICAgKiA8Y29kZT5wcm9jZXNzKCk8L2NvZGU+IG1ldGhvZCB0byBwZXJmb3JtIHRoZSBhY3R1YWwgZmlsdGVyaW5nLgorICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYSBjb25jcmV0ZSBzdWJjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3QgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW52b2tlKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcnJheSBvZiByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0cyBpbml0aWFsaXplZCBmcm9tIHRoZQorICAgICAqIHNwZWNpZmllZCBhcmd1bWVudCwgd2hpY2ggbXVzdCBiZSA8Y29kZT5udWxsPC9jb2RlPiBvciBhIGNvbW1hLWRlbGltaXRlZAorICAgICAqIGxpc3Qgb2YgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3QgVGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBvbmUgb2YgdGhlIHBhdHRlcm5zIGhhcworICAgICAqICBpbnZhbGlkIHN5bnRheAorICAgICAqLworICAgIHByb3RlY3RlZCBQYXR0ZXJuW10gcHJlY2FsY3VsYXRlKFN0cmluZyBsaXN0KSB7CisKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobmV3IFBhdHRlcm5bMF0pOworICAgICAgICBsaXN0ID0gbGlzdC50cmltKCk7CisgICAgICAgIGlmIChsaXN0Lmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHJldHVybiAobmV3IFBhdHRlcm5bMF0pOworICAgICAgICBsaXN0ICs9ICIsIjsKKworICAgICAgICBBcnJheUxpc3QgcmVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB3aGlsZSAobGlzdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGludCBjb21tYSA9IGxpc3QuaW5kZXhPZignLCcpOworICAgICAgICAgICAgaWYgKGNvbW1hIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gbGlzdC5zdWJzdHJpbmcoMCwgY29tbWEpLnRyaW0oKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVMaXN0LmFkZChQYXR0ZXJuLmNvbXBpbGUocGF0dGVybikpOworICAgICAgICAgICAgfSBjYXRjaCAoUGF0dGVyblN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicmVxdWVzdEZpbHRlclZhbHZlLnN5bnRheCIsIHBhdHRlcm4pKTsKKyAgICAgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBpYWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0ID0gbGlzdC5zdWJzdHJpbmcoY29tbWEgKyAxKTsKKyAgICAgICAgfQorCisgICAgICAgIFBhdHRlcm4gcmVBcnJheVtdID0gbmV3IFBhdHRlcm5bcmVMaXN0LnNpemUoKV07CisgICAgICAgIHJldHVybiAoKFBhdHRlcm5bXSkgcmVMaXN0LnRvQXJyYXkocmVBcnJheSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHRoZSBmaWx0ZXJpbmcgdGhhdCBoYXMgYmVlbiBjb25maWd1cmVkIGZvciB0aGlzIFZhbHZlLCBtYXRjaGluZworICAgICAqIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZXF1ZXN0IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSByZXF1ZXN0IHByb3BlcnR5IG9uIHdoaWNoIHRvIGZpbHRlcgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3QgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHRvIGJlIHByb2Nlc3NlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzKFN0cmluZyBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGRlbnkgcGF0dGVybnMsIGlmIGFueQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbmllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGRlbmllc1tpXS5tYXRjaGVyKHByb3BlcnR5KS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19GT1JCSURERU4pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoZSBhbGxvdyBwYXR0ZXJucywgaWYgYW55CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsb3dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYWxsb3dzW2ldLm1hdGNoZXIocHJvcGVydHkpLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgIGdldE5leHQoKS5pbnZva2UocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEFsbG93IGlmIGRlbmllcyBzcGVjaWZpZWQgYnV0IG5vdCBhbGxvd3MKKyAgICAgICAgaWYgKChkZW5pZXMubGVuZ3RoID4gMCkgJiYgKGFsbG93cy5sZW5ndGggPT0gMCkpIHsKKyAgICAgICAgICAgIGdldE5leHQoKS5pbnZva2UocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGVueSB0aGlzIHJlcXVlc3QKKyAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfRk9SQklEREVOKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1NlbWFwaG9yZVZhbHZlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1NlbWFwaG9yZVZhbHZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2NmE5MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvU2VtYXBob3JlVmFsdmUuamF2YQpAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkxpZmVjeWNsZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiBhIFZhbHZlIHRoYXQgbGltaXRzIGNvbmN1cnJlbmN5LjwvcD4KKyAqCisgKiA8cD5UaGlzIFZhbHZlIG1heSBiZSBhdHRhY2hlZCB0byBhbnkgQ29udGFpbmVyLCBkZXBlbmRpbmcgb24gdGhlIGdyYW51bGFyaXR5CisgKiBvZiB0aGUgY29uY3VycmVuY3kgY29udHJvbCB5b3Ugd2lzaCB0byBwZXJmb3JtLjwvcD4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZW1hcGhvcmVWYWx2ZQorICAgIGV4dGVuZHMgVmFsdmVCYXNlCisgICAgaW1wbGVtZW50cyBMaWZlY3ljbGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5TZW1hcGhvcmVWYWx2ZS8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBTZW1hcGhvcmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFNlbWFwaG9yZSBzZW1hcGhvcmUgPSBudWxsOworICAgIAorCisgICAgLyoqCisgICAgICogVGhlIGxpZmVjeWNsZSBldmVudCBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlmZWN5Y2xlU3VwcG9ydCBsaWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZCB5ZXQ/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25jdXJyZW5jeSBsZXZlbCBvZiB0aGUgc2VtYXBob3JlLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY29uY3VycmVuY3kgPSAxMDsKKyAgICBwdWJsaWMgaW50IGdldENvbmN1cnJlbmN5KCkgeyByZXR1cm4gY29uY3VycmVuY3k7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25jdXJyZW5jeShpbnQgY29uY3VycmVuY3kpIHsgdGhpcy5jb25jdXJyZW5jeSA9IGNvbmN1cnJlbmN5OyB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBGYWlybmVzcyBvZiB0aGUgc2VtYXBob3JlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGZhaXJuZXNzID0gZmFsc2U7CisgICAgcHVibGljIGJvb2xlYW4gZ2V0RmFpcm5lc3MoKSB7IHJldHVybiBmYWlybmVzczsgfQorICAgIHB1YmxpYyB2b2lkIHNldEZhaXJuZXNzKGJvb2xlYW4gZmFpcm5lc3MpIHsgdGhpcy5mYWlybmVzcyA9IGZhaXJuZXNzOyB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBCbG9jayB1bnRpbCBhIHBlcm1pdCBpcyBhdmFpbGFibGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYmxvY2sgPSB0cnVlOworICAgIHB1YmxpYyBib29sZWFuIGdldEJsb2NrKCkgeyByZXR1cm4gYmxvY2s7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRCbG9jayhib29sZWFuIGJsb2NrKSB7IHRoaXMuYmxvY2sgPSBibG9jazsgfQorICAgIAorCisgICAgLyoqCisgICAgICogQmxvY2sgaW50ZXJydXB0aWJseSB1bnRpbCBhIHBlcm1pdCBpcyBhdmFpbGFibGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaW50ZXJydXB0aWJsZSA9IGZhbHNlOworICAgIHB1YmxpYyBib29sZWFuIGdldEludGVycnVwdGlibGUoKSB7IHJldHVybiBpbnRlcnJ1cHRpYmxlOyB9CisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJydXB0aWJsZShib29sZWFuIGludGVycnVwdGlibGUpIHsgdGhpcy5pbnRlcnJ1cHRpYmxlID0gaW50ZXJydXB0aWJsZTsgfQorICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlmZWN5Y2xlLiBJZiB0aGlzCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiBsaWZlY3ljbGUuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIDxjb2RlPmNvbmZpZ3VyZSgpPC9jb2RlPiwKKyAgICAgKiBhbmQgYmVmb3JlIGFueSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhlIGNvbXBvbmVudCBhcmUgdXRpbGl6ZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyB0aGlzIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmIChzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInNlbWFwaG9yZVZhbHZlLmFscmVhZHlTdGFydGVkIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisKKyAgICAgICAgc2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZShjb25jdXJyZW5jeSwgZmFpcm5lc3MpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHRlcm1pbmF0ZSB0aGUgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB0aGUgbGFzdCBvbmUgY2FsbGVkIG9uIGEgZ2l2ZW4KKyAgICAgKiBpbnN0YW5jZSBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmICghc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzZW1hcGhvcmVWYWx2ZS5ub3RTdGFydGVkIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUT1BfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gZmFsc2U7CisKKyAgICAgICAgc2VtYXBob3JlID0gbnVsbDsKKworICAgIH0KKworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBWYWx2ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisgICAgICAgIHJldHVybiAoaW5mbyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEbyBjb25jdXJyZW5jeSBjb250cm9sIG9uIHRoZSByZXF1ZXN0IHVzaW5nIHRoZSBzZW1hcGhvcmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB0byBiZSBjcmVhdGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIGlmIChjb250cm9sQ29uY3VycmVuY3kocmVxdWVzdCwgcmVzcG9uc2UpKSB7CisgICAgICAgICAgICBib29sZWFuIHNob3VsZFJlbGVhc2UgPSB0cnVlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGludGVycnVwdGlibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLmFjcXVpcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSZWxlYXNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWl0RGVuaWVkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9ICAKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZS5hY3F1aXJlVW5pbnRlcnJ1cHRpYmx5KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbWFwaG9yZS50cnlBY3F1aXJlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFJlbGVhc2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pdERlbmllZChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2V0TmV4dCgpLmludm9rZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChzaG91bGRSZWxlYXNlKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZS5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2V0TmV4dCgpLmludm9rZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFN1YmNsYXNzIGZyaWVuZGx5IG1ldGhvZCB0byBhZGQgY29uZGl0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250cm9sQ29uY3VycmVuY3koUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzcyBmcmllbmRseSBtZXRob2QgdG8gYWRkIGVycm9yIGhhbmRsaW5nIHdoZW4gYSBwZXJtaXQgaXNuJ3QgZ3JhbnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwZXJtaXREZW5pZWQoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICB9CisgICAgCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvVmFsdmVCYXNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1ZhbHZlQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMThmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1ZhbHZlQmFzZS5qYXZhCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblJlZ2lzdHJhdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlBpcGVsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5XcmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkNvbnRhaW5lckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKworLyoqCisgKiBDb252ZW5pZW5jZSBiYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIDxiPlZhbHZlPC9iPiBpbnRlcmZhY2UuCisgKiBBIHN1YmNsYXNzIDxzdHJvbmc+TVVTVDwvc3Ryb25nPiBpbXBsZW1lbnQgYW4gPGNvZGU+aW52b2tlKCk8L2NvZGU+CisgKiBtZXRob2QgdG8gcHJvdmlkZSB0aGUgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eSwgYW5kIDxzdHJvbmc+TUFZPC9zdHJvbmc+CisgKiBpbXBsZW1lbnQgdGhlIDxjb2RlPkxpZmVjeWNsZTwvY29kZT4gaW50ZXJmYWNlIHRvIHByb3ZpZGUgY29uZmlndXJhdGlvbgorICogbWFuYWdlbWVudCBhbmQgbGlmZWN5Y2xlIHN1cHBvcnQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWx2ZUJhc2UKKyAgICBpbXBsZW1lbnRzIENvbnRhaW5lZCwgVmFsdmUsIE1CZWFuUmVnaXN0cmF0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVmFsdmVCYXNlLmNsYXNzKTsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29udGFpbmVyIHdob3NlIHBpcGVsaW5lIHRoaXMgVmFsdmUgaXMgYSBjb21wb25lbnQgb2YuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbnRhaW5lciBjb250YWluZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBDb250YWluZXIgbG9nCisgICAgICovCisgICAgcHJvdGVjdGVkIExvZyBjb250YWluZXJMb2cgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFZhbHZlIGltcGxlbWVudGF0aW9uLiAgVGhpcyB2YWx1ZQorICAgICAqIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuVmFsdmVCYXNlLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBuZXh0IFZhbHZlIGluIHRoZSBwaXBlbGluZSB0aGlzIFZhbHZlIGlzIGEgY29tcG9uZW50IG9mLgorICAgICAqLworICAgIHByb3RlY3RlZCBWYWx2ZSBuZXh0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBWYWx2ZSBpcyBhc3NvY2lhdGVkLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lciBnZXRDb250YWluZXIoKSB7CisKKyAgICAgICAgcmV0dXJuIChjb250YWluZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENvbnRhaW5lciB3aXRoIHdoaWNoIHRoaXMgVmFsdmUgaXMgYXNzb2NpYXRlZCwgaWYgYW55LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgbmV3IGFzc29jaWF0ZWQgY29udGFpbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKENvbnRhaW5lciBjb250YWluZXIpIHsKKworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmV4dCBWYWx2ZSBpbiB0aGlzIHBpcGVsaW5lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzCisgICAgICogaXMgdGhlIGxhc3QgVmFsdmUgaW4gdGhlIHBpcGVsaW5lLgorICAgICAqLworICAgIHB1YmxpYyBWYWx2ZSBnZXROZXh0KCkgeworCisgICAgICAgIHJldHVybiAobmV4dCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgVmFsdmUgdGhhdCBmb2xsb3dzIHRoaXMgb25lIGluIHRoZSBwaXBlbGluZSBpdCBpcyBwYXJ0IG9mLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHZlIFRoZSBuZXcgbmV4dCB2YWx2ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5leHQoVmFsdmUgdmFsdmUpIHsKKworICAgICAgICB0aGlzLm5leHQgPSB2YWx2ZTsKKworICAgIH0KKworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgYSBwZXJpb2RpYyB0YXNrLCBzdWNoIGFzIHJlbG9hZGluZywgZXRjLiBUaGlzIG1ldGhvZCB3aWxsIGJlCisgICAgICogaW52b2tlZCBpbnNpZGUgdGhlIGNsYXNzbG9hZGluZyBjb250ZXh0IG9mIHRoaXMgY29udGFpbmVyLiBVbmV4cGVjdGVkCisgICAgICogdGhyb3dhYmxlcyB3aWxsIGJlIGNhdWdodCBhbmQgbG9nZ2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJhY2tncm91bmRQcm9jZXNzKCkgeworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGxvZ2ljIHJlcHJlc2VudGVkIGJ5IHRoaXMgVmFsdmUuICBTZWUgdGhlCisgICAgICogVmFsdmUgZGVzY3JpcHRpb24gZm9yIHRoZSBub3JtYWwgZGVzaWduIHBhdHRlcm5zIGZvciB0aGlzIG1ldGhvZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gYmUgcHJvdmlkZWQgYnkgYSBzdWJjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3QgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW52b2tlKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlbmRlcmluZyBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIlsiKTsKKyAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKGNvbnRhaW5lci5nZXROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEpNWCBhbmQgUmVnaXN0cmF0aW9uICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHByb3RlY3RlZCBTdHJpbmcgZG9tYWluOworICAgIHByb3RlY3RlZCBPYmplY3ROYW1lIG9uYW1lOworICAgIHByb3RlY3RlZCBNQmVhblNlcnZlciBtc2VydmVyOworICAgIHByb3RlY3RlZCBPYmplY3ROYW1lIGNvbnRyb2xsZXI7CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBnZXRPYmplY3ROYW1lKCkgeworICAgICAgICByZXR1cm4gb25hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0TmFtZShPYmplY3ROYW1lIG9uYW1lKSB7CisgICAgICAgIHRoaXMub25hbWUgPSBvbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIGRvbWFpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBwcmVSZWdpc3RlcihNQmVhblNlcnZlciBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgb25hbWU9bmFtZTsKKyAgICAgICAgbXNlcnZlcj1zZXJ2ZXI7CisgICAgICAgIGRvbWFpbj1uYW1lLmdldERvbWFpbigpOworCisKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9zdFJlZ2lzdGVyKEJvb2xlYW4gcmVnaXN0cmF0aW9uRG9uZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByZURlcmVnaXN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3N0RGVyZWdpc3RlcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBnZXRDb250cm9sbGVyKCkgeworICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250cm9sbGVyKE9iamVjdE5hbWUgY29udHJvbGxlcikgeworICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOworICAgIH0KKworICAgIC8qKiBGcm9tIHRoZSBuYW1lLCBleHRyYWN0IHRoZSBwYXJlbnQgb2JqZWN0IG5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx2ZU5hbWUgVGhlIHZhbHZlIG5hbWUKKyAgICAgKiBAcmV0dXJuIE9iamVjdE5hbWUgVGhlIHBhcmVudCBuYW1lCisgICAgICovCisgICAgcHVibGljIE9iamVjdE5hbWUgZ2V0UGFyZW50TmFtZSggT2JqZWN0TmFtZSB2YWx2ZU5hbWUgKSB7CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLCBPYmplY3ROYW1lIHBhcmVudCkKKyAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb250YWluZXIgY29udGFpbmVyPXRoaXMuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIGlmKCBjb250YWluZXIgPT0gbnVsbCB8fCAhIChjb250YWluZXIgaW5zdGFuY2VvZiBDb250YWluZXJCYXNlKSApCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgdGhpcy5jb250YWluZXJMb2cgPSBjb250YWluZXIuZ2V0TG9nZ2VyKCk7CisgICAgICAgIENvbnRhaW5lckJhc2UgY29udGFpbmVyQmFzZT0oQ29udGFpbmVyQmFzZSljb250YWluZXI7CisgICAgICAgIFBpcGVsaW5lIHBpcGU9Y29udGFpbmVyQmFzZS5nZXRQaXBlbGluZSgpOworICAgICAgICBWYWx2ZSB2YWx2ZXNbXT1waXBlLmdldFZhbHZlcygpOworCisgICAgICAgIC8qIENvbXB1dGUgdGhlICJwYXJlbnQgbmFtZSIgcGFydCAqLworICAgICAgICBTdHJpbmcgcGFyZW50TmFtZT0iIjsKKyAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEVuZ2luZSkgeworICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEhvc3QpIHsKKyAgICAgICAgICAgIHBhcmVudE5hbWU9Iixob3N0PSIgK2NvbnRhaW5lci5nZXROYW1lKCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9ICgoQ29udGV4dCljb250YWluZXIpLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gIi8iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSBjb250YWluZXIuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudE5hbWU9IixwYXRoPSIgKyBwYXRoICsgIixob3N0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QuZ2V0TmFtZSgpOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFdyYXBwZXIpIHsKKyAgICAgICAgICAgIENvbnRleHQgY3R4ID0gKENvbnRleHQpIGNvbnRhaW5lci5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gY3R4LmdldFBhdGgoKTsKKyAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCgpIDwgMSkgeworICAgICAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBIb3N0IGhvc3QgPSAoSG9zdCkgY3R4LmdldFBhcmVudCgpOworICAgICAgICAgICAgcGFyZW50TmFtZT0iLHNlcnZsZXQ9IiArIGNvbnRhaW5lci5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAiLHBhdGg9IiArIHBhdGggKyAiLGhvc3Q9IiArIGhvc3QuZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgICAgIGxvZy5kZWJ1ZygidmFsdmUgcGFyZW50PSIgKyBwYXJlbnROYW1lICsgIiAiICsgcGFyZW50KTsKKworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lPXRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIGludCBwZXJpb2QgPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKHBlcmlvZCA+PSAwKQorICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhwZXJpb2QgKyAxKTsKKworICAgICAgICBpbnQgc2VxPTA7CisgICAgICAgIGZvciggaW50IGk9MDsgaTx2YWx2ZXMubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICAvLyBGaW5kIG90aGVyIHZhbHZlcyB3aXRoIHRoZSBzYW1lIG5hbWUKKyAgICAgICAgICAgIGlmICh2YWx2ZXNbaV0gPT0gdGhpcykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHZhbHZlc1tpXSE9bnVsbCAmJgorICAgICAgICAgICAgICAgICAgICB2YWx2ZXNbaV0uZ2V0Q2xhc3MoKSA9PSB0aGlzLmdldENsYXNzKCkgKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEdXBsaWNhdGUgIiArIHZhbHZlc1tpXSArICIgIiArIHRoaXMgKyAiICIgKyBjb250YWluZXIpOworICAgICAgICAgICAgICAgIHNlcSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN0cmluZyBleHQ9IiI7CisgICAgICAgIGlmKCBzZXEgPiAwICkgeworICAgICAgICAgICAgZXh0PSIsc2VxPSIgKyBzZXE7CisgICAgICAgIH0KKworICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSAKKyAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyAiOnR5cGU9VmFsdmUsbmFtZT0iICsgY2xhc3NOYW1lICsgZXh0ICsgcGFyZW50TmFtZSk7CisgICAgICAgIGxvZy5kZWJ1ZygidmFsdmUgb2JqZWN0bmFtZSA9ICIrb2JqZWN0TmFtZSk7CisgICAgICAgIHJldHVybiBvYmplY3ROYW1lOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEpNWCBkYXRhICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIE9iamVjdE5hbWUgZ2V0Q29udGFpbmVyTmFtZSgpIHsKKyAgICAgICAgaWYoIGNvbnRhaW5lcj09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gKChDb250YWluZXJCYXNlKWNvbnRhaW5lcikuZ2V0Sm14TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmY4NDdkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCkBAIC0wLDAgKzEsMjkyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxtYmVhbnMtZGVzY3JpcHRvcnM+CisKKyAgPG1iZWFuIG5hbWU9IkFjY2Vzc0xvZ1ZhbHZlIgorICAgICAgICAgZGVzY3JpcHRpb249IlZhbHZlIHRoYXQgZ2VuZXJhdGVzIGEgd2ViIHNlcnZlciBhY2Nlc3MgbG9nIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJWYWx2ZSIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkFjY2Vzc0xvZ1ZhbHZlIj4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lck5hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iT2JqZWN0IG5hbWUgb2YgdGhlIGNvbnRhaW5lciIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZSIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXJlY3RvcnkiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGRpcmVjdG9yeSBpbiB3aGljaCBsb2cgZmlsZXMgYXJlIGNyZWF0ZWQiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icGF0dGVybiIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgcGF0dGVybiB1c2VkIHRvIGZvcm1hdCBvdXIgYWNjZXNzIGxvZyBsaW5lcyIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJlZml4IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBwcmVmaXggdGhhdCBpcyBhZGRlZCB0byBsb2cgZmlsZSBmaWxlbmFtZXMiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InJlc29sdmVIb3N0cyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXNvbHZlIGhvc3RzIgorICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InJvdGF0YWJsZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGbGFnIHRvIGluZGljYXRlIGF1dG9tYXRpYyBsb2cgcm90YXRpb24uIgorICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InN1ZmZpeCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgc3VmZml4IHRoYXQgaXMgYWRkZWQgdG8gbG9nIGZpbGUgZmlsZW5hbWVzIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb25kaXRpb24iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHZhbHVlIHRvIGxvb2sgZm9yIGNvbmRpdGlvbmFsIGxvZ2dpbmcuIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlRGF0ZUZvcm1hdCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZm9ybWF0IGZvciB0aGUgZGF0ZSBkYXRlIGJhc2VkIGxvZyByb3RhdGlvbi4iCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgIDwvbWJlYW4+CisKKyAgPG1iZWFuIG5hbWU9IkVycm9yUmVwb3J0VmFsdmUiCisgICAgICAgICBkZXNjcmlwdGlvbj0iSW1wbGVtZW50YXRpb24gb2YgYSBWYWx2ZSB0aGF0IG91dHB1dHMgSFRNTCBlcnJvciBwYWdlcyIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iVmFsdmUiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5FcnJvclJlcG9ydFZhbHZlIj4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lck5hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iT2JqZWN0IG5hbWUgb2YgdGhlIGNvbnRhaW5lciIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZSIvPgorCisgIDwvbWJlYW4+CisKKyAgPG1iZWFuIG5hbWU9IkV4dGVuZGVkQWNjZXNzTG9nVmFsdmUiCisgICAgICAgICBkZXNjcmlwdGlvbj0iVmFsdmUgdGhhdCBnZW5lcmF0ZXMgYSB3ZWIgc2VydmVyIGFjY2VzcyBsb2ciCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9IlZhbHZlIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuRXh0ZW5kZWRBY2Nlc3NMb2dWYWx2ZSI+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXJOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9iamVjdCBuYW1lIG9mIHRoZSBjb250YWluZXIiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWUiLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyZWN0b3J5IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggbG9nIGZpbGVzIGFyZSBjcmVhdGVkIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InBhdHRlcm4iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHBhdHRlcm4gdXNlZCB0byBmb3JtYXQgb3VyIGFjY2VzcyBsb2cgbGluZXMiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InByZWZpeCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgcHJlZml4IHRoYXQgaXMgYWRkZWQgdG8gbG9nIGZpbGUgZmlsZW5hbWVzIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJyb3RhdGFibGUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUm90YXRlIGxvZyIKKyAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb25kaXRpb24iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHZhbHVlIHRvIGxvb2sgZm9yIGNvbmRpdGlvbmFsIGxvZ2dpbmcuIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGVja0V4aXN0cyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDaGVjayBmb3IgZmlsZSBleGlzdGVuY2UgYmVmb3JlIGVhY2ggbG9nZ2luZy4iCisgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3VmZml4IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBzdWZmaXggdGhhdCBpcyBhZGRlZCB0byBsb2cgZmlsZSBmaWxlbmFtZXMiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVEYXRlRm9ybWF0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBmb3JtYXQgZm9yIHRoZSBkYXRlIGRhdGUgYmFzZWQgbG9nIHJvdGF0aW9uLiIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxvcGVyYXRpb24gbmFtZT0icm90YXRlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik1vdmUgdGhlIGV4aXN0aW5nIGxvZyBmaWxlIHRvIGEgbmV3IG5hbWUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9ImJvb2xlYW4iPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJuZXdGaWxlTmFtZSIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZpbGUgbmFtZSB0byBtb3ZlIHRoZSBsb2cgZmlsZSB0by4iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICA8L21iZWFuPgorCisgIDxtYmVhbiBuYW1lPSJGYXN0Q29tbW9uQWNjZXNzTG9nVmFsdmUiCisgICAgICAgICBkZXNjcmlwdGlvbj0iVmFsdmUgdGhhdCBnZW5lcmF0ZXMgYSB3ZWIgc2VydmVyIGFjY2VzcyBsb2ciCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9IlZhbHZlIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuRmFzdENvbW1vbkFjY2Vzc0xvZ1ZhbHZlIj4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lck5hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iT2JqZWN0IG5hbWUgb2YgdGhlIGNvbnRhaW5lciIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZSIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXJlY3RvcnkiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGRpcmVjdG9yeSBpbiB3aGljaCBsb2cgZmlsZXMgYXJlIGNyZWF0ZWQiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icGF0dGVybiIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgcGF0dGVybiB1c2VkIHRvIGZvcm1hdCBvdXIgYWNjZXNzIGxvZyBsaW5lcywgd2hpY2ggbXVzdCBiZSBlaXRoZXIgY29tbW9uIG9yIGNvbWJpbmVkIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHByZWZpeCB0aGF0IGlzIGFkZGVkIHRvIGxvZyBmaWxlIGZpbGVuYW1lcyIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzb2x2ZUhvc3RzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJlc29sdmUgaG9zdHMiCisgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0icm90YXRhYmxlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZsYWcgdG8gaW5kaWNhdGUgYXV0b21hdGljIGxvZyByb3RhdGlvbi4iCisgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3VmZml4IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBzdWZmaXggdGhhdCBpcyBhZGRlZCB0byBsb2cgZmlsZSBmaWxlbmFtZXMiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbmRpdGlvbiIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgdmFsdWUgdG8gbG9vayBmb3IgY29uZGl0aW9uYWwgbG9nZ2luZy4iCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVEYXRlRm9ybWF0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBmb3JtYXQgZm9yIHRoZSBkYXRlIGRhdGUgYmFzZWQgbG9nIHJvdGF0aW9uLiIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgPC9tYmVhbj4KKworICA8bWJlYW4gbmFtZT0iU2VtYXBob3JlVmFsdmUiCisgICAgICAgICBkZXNjcmlwdGlvbj0iVmFsdmUgdGhhdCBkb2VzIGNvbmN1cnJlbmN5IGNvbnRyb2wiCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9IlZhbHZlIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuU2VtYXBob3JlVmFsdmUiPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJPYmplY3QgbmFtZSBvZiB0aGUgY29udGFpbmVyIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbmN1cnJlbmN5IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkRlc2lyZWQgY29uY3VycmVuY3kgbGV2ZWwiCisgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpcm5lc3MiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVXNlIGEgZmFpciBzZW1hcGhvcmUiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gbmFtZT0iUmVtb3RlQWRkclZhbHZlIgorICAgICAgICAgZGVzY3JpcHRpb249IkNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIFJlcXVlc3RGaWx0ZXJWYWx2ZSB0aGF0ICBmaWx0ZXJzIGJhc2VkIG9uIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlbW90ZSBjbGllbnQncyBJUCBhZGRyZXNzIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJWYWx2ZSIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlbW90ZUFkZHJWYWx2ZSI+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImFsbG93IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb21tYS1kZWxpbWl0ZWQgc2V0IG9mIGFsbG93IGV4cHJlc3Npb25zIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXJOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9iamVjdCBuYW1lIG9mIHRoZSBjb250YWluZXIiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWUiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkZW55IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb21tYS1kZWxpbWl0ZWQgc2V0IG9mIGRlbnkgZXhwcmVzc2lvbnMiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gbmFtZT0iUmVtb3RlSG9zdFZhbHZlIgorICAgICAgICAgZGVzY3JpcHRpb249IkNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIFJlcXVlc3RGaWx0ZXJWYWx2ZSB0aGF0CisgICAgICAgICBmaWx0ZXJzIGJhc2VkIG9uIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlbW90ZQorICAgICAgICAgY2xpZW50J3MgaG9zdCBuYW1lIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJWYWx2ZSIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlbW90ZUhvc3RWYWx2ZSI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWxsb3ciCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGNvbW1hLWRlbGltaXRlZCBzZXQgb2YgYWxsb3cgZXhwcmVzc2lvbnMiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lck5hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iT2JqZWN0IG5hbWUgb2YgdGhlIGNvbnRhaW5lciIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRlbnkiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGNvbW1hLWRlbGltaXRlZCBzZXQgb2YgZGVueSBleHByZXNzaW9ucyIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICA8L21iZWFuPgorCisgIDxtYmVhbiBuYW1lPSJSZXF1ZXN0RHVtcGVyVmFsdmUiCisgICAgICAgICBkZXNjcmlwdGlvbj0iSW1wbGVtZW50YXRpb24gb2YgYSBWYWx2ZSB0aGF0IGxvZ3MgaW50ZXJlc3RpbmcgY29udGVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIFJlcXVlc3QgYW5kIHRoZSBjb3JyZXNwb25kaW5nIFJlc3BvbnNlIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJWYWx2ZSIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlcXVlc3REdW1wZXJWYWx2ZSI+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lck5hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iT2JqZWN0IG5hbWUgb2YgdGhlIGNvbnRhaW5lciIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZSIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICA8L21iZWFuPgorCisgIDxtYmVhbiBuYW1lPSJSZXF1ZXN0TGlzdGVuZXJWYWx2ZSIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSJWYWx2ZSB0aGF0IGhhbmRsZXMgcmVxdWVzdCBpbml0aWFsaXphdGlvbiBhbmQgZGVzdHJveSBldmVudHMiCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9IlZhbHZlIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVxdWVzdExpc3RlbmVyVmFsdmUiPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXJOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9iamVjdCBuYW1lIG9mIHRoZSBjb250YWluZXIiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWUiLz4KKworICA8L21iZWFuPgorCis8L21iZWFucy1kZXNjcmlwdG9ycz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvcGFja2FnZS5odG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjZDBhYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMTIgQEAKKzxib2R5PgorCis8cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgYSB2YXJpZXR5IG9mIHNtYWxsIFZhbHZlIGltcGxlbWVudGF0aW9ucyB0aGF0IGRvCitub3Qgd2FycmFudCBiZWluZyBwYWNrYWdlZCBzZXBhcmF0ZWx5LiAgSW4gYWRkaXRpb24sIHRoZXJlIGlzIGEgY29udmVuaWVuY2UKK2Jhc2UgY2xhc3MgKDxjb2RlPlZhbHZlQmFzZTwvY29kZT4pIHRoYXQgc3VwcG9ydHMgdGhlIHVzdWFsIG1lY2hhbmlzbXMgZm9yCitpbmNsdWRpbmcgY3VzdG9tIFZhbHZlcyBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIFBpcGVsaW5lLjwvcD4KKworPHA+T3RoZXIgcGFja2FnZXMgdGhhdCBpbmNsdWRlIFZhbHZlcyBpbmNsdWRlCis8Y29kZT5vcmcuYXBhY2hlLnRvbWNhdC5sb2dnZXI8L2NvZGU+IGFuZAorPGNvZGU+b3JnLmFwYWNoZS50b21jYXQuc2VjdXJpdHk8L2NvZGU+LjwvcD4KKworPC9ib2R5PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9Db25zdGFudHMuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwOTc3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmc7CisKKworLyoqCisgKiBTdGF0aWMgY29uc3RhbnRzIGZvciB0aGlzIHBhY2thZ2UuCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIENvbnN0YW50cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQYWNrYWdlID0gIm9yZy5hcGFjaGUubmFtaW5nIjsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9Db250ZXh0QWNjZXNzQ29udHJvbGxlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9Db250ZXh0QWNjZXNzQ29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYjQ5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0NvbnRleHRBY2Nlc3NDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nOworCitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworLyoqCisgKiBIYW5kbGVzIHRoZSBhY2Nlc3MgY29udHJvbCBvbiB0aGUgSk5ESSBjb250ZXh0cy4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb250ZXh0QWNjZXNzQ29udHJvbGxlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBDYXRhbGluYSBjb250ZXh0IG5hbWVzIG9uIHdoaWNoIHdyaXRpbmcgaXMgbm90IGFsbG93ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHJlYWRPbmx5Q29udGV4dHMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIFNlY3VyaXR5IHRva2VucyByZXBvc2l0b3J5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBzZWN1cml0eVRva2VucyA9IG5ldyBIYXNodGFibGUoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFNldCBhIHNlY3VyaXR5IHRva2VuIGZvciBhIGNvbnRleHQuIENhbiBiZSBzZXQgb25seSBvbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gdG9rZW4gU2VjdXJpdHkgdG9rZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VjdXJpdHlUb2tlbihPYmplY3QgbmFtZSwgT2JqZWN0IHRva2VuKSB7CisgICAgICAgIGlmICgoIXNlY3VyaXR5VG9rZW5zLmNvbnRhaW5zS2V5KG5hbWUpKSAmJiAodG9rZW4gIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIHNlY3VyaXR5VG9rZW5zLnB1dChuYW1lLCB0b2tlbik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHNlY3VyaXR5IHRva2VuIGZvciBhIGNvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSB0b2tlbiBTZWN1cml0eSB0b2tlbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bnNldFNlY3VyaXR5VG9rZW4oT2JqZWN0IG5hbWUsIE9iamVjdCB0b2tlbikgeworICAgICAgICBpZiAoY2hlY2tTZWN1cml0eVRva2VuKG5hbWUsIHRva2VuKSkgeworICAgICAgICAgICAgc2VjdXJpdHlUb2tlbnMucmVtb3ZlKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGVjayBhIHN1Ym1pdHRlZCBzZWN1cml0eSB0b2tlbi4gVGhlIHN1Ym1pdHRlZCB0b2tlbiBtdXN0IGJlIGVxdWFsIHRvCisgICAgICogdGhlIHRva2VuIHByZXNlbnQgaW4gdGhlIHJlcG9zaXRvcnkuIElmIG5vIHRva2VuIGlzIHByZXNlbnQgZm9yIHRoZSAKKyAgICAgKiBjb250ZXh0LCB0aGVuIHJldHVybnMgdHJ1ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIHRva2VuIFN1Ym1pdHRlZCBzZWN1cml0eSB0b2tlbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja1NlY3VyaXR5VG9rZW4KKyAgICAgICAgKE9iamVjdCBuYW1lLCBPYmplY3QgdG9rZW4pIHsKKyAgICAgICAgT2JqZWN0IHJlZlRva2VuID0gc2VjdXJpdHlUb2tlbnMuZ2V0KG5hbWUpOworICAgICAgICBpZiAocmVmVG9rZW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgIGlmICgocmVmVG9rZW4gIT0gbnVsbCkgJiYgKHJlZlRva2VuLmVxdWFscyh0b2tlbikpKQorICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBbGxvdyB3cml0aW5nIHRvIGEgY29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIHRva2VuIFNlY3VyaXR5IHRva2VuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFdyaXRhYmxlKE9iamVjdCBuYW1lLCBPYmplY3QgdG9rZW4pIHsKKyAgICAgICAgaWYgKGNoZWNrU2VjdXJpdHlUb2tlbihuYW1lLCB0b2tlbikpCisgICAgICAgICAgICByZWFkT25seUNvbnRleHRzLnJlbW92ZShuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIG9yIG5vdCBhIGNvbnRleHQgaXMgd3JpdGFibGUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZWFkT25seShPYmplY3QgbmFtZSkgeworICAgICAgICByZWFkT25seUNvbnRleHRzLnB1dChuYW1lLCBuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgaWYgYSBjb250ZXh0IGlzIHdyaXRhYmxlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXcml0YWJsZShPYmplY3QgbmFtZSkgeworICAgICAgICByZXR1cm4gIShyZWFkT25seUNvbnRleHRzLmNvbnRhaW5zS2V5KG5hbWUpKTsKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0NvbnRleHRCaW5kaW5ncy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9Db250ZXh0QmluZGluZ3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjM4NDhiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9Db250ZXh0QmluZGluZ3MuamF2YQpAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CisKKy8qKgorICogSGFuZGxlcyB0aGUgYXNzb2NpYXRpb25zIDoKKyAqIDx1bD4KKyAqIDxsaT5DYXRhbGluYSBjb250ZXh0IG5hbWUgd2l0aCB0aGUgTmFtaW5nQ29udGV4dDwvbGk+CisgKiA8bGk+Q2FsbGluZyB0aHJlYWQgd2l0aCB0aGUgTmFtaW5nQ29udGV4dDwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbnRleHRCaW5kaW5ncyB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBCaW5kaW5ncyBuYW1lIC0gbmFtaW5nIGNvbnRleHQuIEtleWVkIGJ5IG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGNvbnRleHROYW1lQmluZGluZ3MgPSBuZXcgSGFzaHRhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIEJpbmRpbmdzIHRocmVhZCAtIG5hbWluZyBjb250ZXh0LiBLZXllZCBieSB0aHJlYWQgaWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHRocmVhZEJpbmRpbmdzID0gbmV3IEhhc2h0YWJsZSgpOworCisKKyAgICAvKioKKyAgICAgKiBCaW5kaW5ncyB0aHJlYWQgLSBuYW1lLiBLZXllZCBieSB0aHJlYWQgaWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHRocmVhZE5hbWVCaW5kaW5ncyA9IG5ldyBIYXNodGFibGUoKTsKKworCisgICAgLyoqCisgICAgICogQmluZGluZ3MgY2xhc3MgbG9hZGVyIC0gbmFtaW5nIGNvbnRleHQuIEtleWVkIGJ5IENMIGlkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBjbEJpbmRpbmdzID0gbmV3IEhhc2h0YWJsZSgpOworCisKKyAgICAvKioKKyAgICAgKiBCaW5kaW5ncyBjbGFzcyBsb2FkZXIgLSBuYW1lLiBLZXllZCBieSBDTCBpZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgY2xOYW1lQmluZGluZ3MgPSBuZXcgSGFzaHRhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9IAorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBjb250ZXh0IG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSBjb250ZXh0IEFzc29jaWF0ZWQgbmFtaW5nIGNvbnRleHQgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmluZENvbnRleHQoT2JqZWN0IG5hbWUsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBiaW5kQ29udGV4dChuYW1lLCBjb250ZXh0LCBudWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgY29udGV4dCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dCBBc3NvY2lhdGVkIG5hbWluZyBjb250ZXh0IGluc3RhbmNlCisgICAgICogQHBhcmFtIHRva2VuIFNlY3VyaXR5IHRva2VuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJpbmRDb250ZXh0KE9iamVjdCBuYW1lLCBDb250ZXh0IGNvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdG9rZW4pIHsKKyAgICAgICAgaWYgKENvbnRleHRBY2Nlc3NDb250cm9sbGVyLmNoZWNrU2VjdXJpdHlUb2tlbihuYW1lLCB0b2tlbikpCisgICAgICAgICAgICBjb250ZXh0TmFtZUJpbmRpbmdzLnB1dChuYW1lLCBjb250ZXh0KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVuYmluZCBjb250ZXh0IG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bmJpbmRDb250ZXh0KE9iamVjdCBuYW1lKSB7CisgICAgICAgIHVuYmluZENvbnRleHQobmFtZSwgbnVsbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbmJpbmQgY29udGV4dCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gdG9rZW4gU2VjdXJpdHkgdG9rZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdW5iaW5kQ29udGV4dChPYmplY3QgbmFtZSwgT2JqZWN0IHRva2VuKSB7CisgICAgICAgIGlmIChDb250ZXh0QWNjZXNzQ29udHJvbGxlci5jaGVja1NlY3VyaXR5VG9rZW4obmFtZSwgdG9rZW4pKQorICAgICAgICAgICAgY29udGV4dE5hbWVCaW5kaW5ncy5yZW1vdmUobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIG5hbWluZyBjb250ZXh0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQKKyAgICAgKi8KKyAgICBzdGF0aWMgQ29udGV4dCBnZXRDb250ZXh0KE9iamVjdCBuYW1lKSB7CisgICAgICAgIHJldHVybiAoQ29udGV4dCkgY29udGV4dE5hbWVCaW5kaW5ncy5nZXQobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5hbWluZyBjb250ZXh0IHRvIGEgdGhyZWFkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmluZFRocmVhZChPYmplY3QgbmFtZSkgCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBiaW5kVGhyZWFkKG5hbWUsIG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1pbmcgY29udGV4dCB0byBhIHRocmVhZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIHRva2VuIFNlY3VyaXR5IHRva2VuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJpbmRUaHJlYWQoT2JqZWN0IG5hbWUsIE9iamVjdCB0b2tlbikgCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBpZiAoQ29udGV4dEFjY2Vzc0NvbnRyb2xsZXIuY2hlY2tTZWN1cml0eVRva2VuKG5hbWUsIHRva2VuKSkgeworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGNvbnRleHROYW1lQmluZGluZ3MuZ2V0KG5hbWUpOworICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImNvbnRleHRCaW5kaW5ncy51bmtub3duQ29udGV4dCIsIG5hbWUpKTsKKyAgICAgICAgICAgIHRocmVhZEJpbmRpbmdzLnB1dChUaHJlYWQuY3VycmVudFRocmVhZCgpLCBjb250ZXh0KTsKKyAgICAgICAgICAgIHRocmVhZE5hbWVCaW5kaW5ncy5wdXQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSwgbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVuYmluZHMgYSBuYW1pbmcgY29udGV4dCB0byBhIHRocmVhZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb250ZXh0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVuYmluZFRocmVhZChPYmplY3QgbmFtZSkgeworICAgICAgICB1bmJpbmRUaHJlYWQobmFtZSwgbnVsbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbmJpbmRzIGEgbmFtaW5nIGNvbnRleHQgdG8gYSB0aHJlYWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSB0b2tlbiBTZWN1cml0eSB0b2tlbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bmJpbmRUaHJlYWQoT2JqZWN0IG5hbWUsIE9iamVjdCB0b2tlbikgeworICAgICAgICBpZiAoQ29udGV4dEFjY2Vzc0NvbnRyb2xsZXIuY2hlY2tTZWN1cml0eVRva2VuKG5hbWUsIHRva2VuKSkgeworICAgICAgICAgICAgdGhyZWFkQmluZGluZ3MucmVtb3ZlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOworICAgICAgICAgICAgdGhyZWFkTmFtZUJpbmRpbmdzLnJlbW92ZShUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1pbmcgY29udGV4dCBib3VuZCB0byBhIHRocmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbnRleHQgZ2V0VGhyZWFkKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IAorICAgICAgICAgICAgKENvbnRleHQpIHRocmVhZEJpbmRpbmdzLmdldChUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJjb250ZXh0QmluZGluZ3Mubm9Db250ZXh0Qm91bmRUb1RocmVhZCIpKTsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWluZyBjb250ZXh0IG5hbWUgYm91bmQgdG8gYSB0aHJlYWQuCisgICAgICovCisgICAgc3RhdGljIE9iamVjdCBnZXRUaHJlYWROYW1lKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCBuYW1lID0gdGhyZWFkTmFtZUJpbmRpbmdzLmdldChUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJjb250ZXh0QmluZGluZ3Mubm9Db250ZXh0Qm91bmRUb1RocmVhZCIpKTsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBpZiBjdXJyZW50IHRocmVhZCBpcyBib3VuZCB0byBhIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGhyZWFkQm91bmQoKSB7CisgICAgICAgIHJldHVybiAodGhyZWFkQmluZGluZ3MuY29udGFpbnNLZXkoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1pbmcgY29udGV4dCB0byBhIGNsYXNzIGxvYWRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb250ZXh0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJpbmRDbGFzc0xvYWRlcihPYmplY3QgbmFtZSkgCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBiaW5kQ2xhc3NMb2FkZXIobmFtZSwgbnVsbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5hbWluZyBjb250ZXh0IHRvIGEgdGhyZWFkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gdG9rZW4gU2VjdXJpdHkgdG9rZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmluZENsYXNzTG9hZGVyKE9iamVjdCBuYW1lLCBPYmplY3QgdG9rZW4pIAorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgYmluZENsYXNzTG9hZGVyCisgICAgICAgICAgICAobmFtZSwgdG9rZW4sIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1pbmcgY29udGV4dCB0byBhIHRocmVhZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIHRva2VuIFNlY3VyaXR5IHRva2VuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJpbmRDbGFzc0xvYWRlcihPYmplY3QgbmFtZSwgT2JqZWN0IHRva2VuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSAKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChDb250ZXh0QWNjZXNzQ29udHJvbGxlci5jaGVja1NlY3VyaXR5VG9rZW4obmFtZSwgdG9rZW4pKSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgY29udGV4dE5hbWVCaW5kaW5ncy5nZXQobmFtZSk7CisgICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiY29udGV4dEJpbmRpbmdzLnVua25vd25Db250ZXh0IiwgbmFtZSkpOworICAgICAgICAgICAgY2xCaW5kaW5ncy5wdXQoY2xhc3NMb2FkZXIsIGNvbnRleHQpOworICAgICAgICAgICAgY2xOYW1lQmluZGluZ3MucHV0KGNsYXNzTG9hZGVyLCBuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVW5iaW5kcyBhIG5hbWluZyBjb250ZXh0IHRvIGEgY2xhc3MgbG9hZGVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdW5iaW5kQ2xhc3NMb2FkZXIoT2JqZWN0IG5hbWUpIHsKKyAgICAgICAgdW5iaW5kQ2xhc3NMb2FkZXIobmFtZSwgbnVsbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbmJpbmRzIGEgbmFtaW5nIGNvbnRleHQgdG8gYSBjbGFzcyBsb2FkZXIuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSB0b2tlbiBTZWN1cml0eSB0b2tlbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bmJpbmRDbGFzc0xvYWRlcihPYmplY3QgbmFtZSwgT2JqZWN0IHRva2VuKSB7CisgICAgICAgIHVuYmluZENsYXNzTG9hZGVyKG5hbWUsIHRva2VuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbmJpbmRzIGEgbmFtaW5nIGNvbnRleHQgdG8gYSBjbGFzcyBsb2FkZXIuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSB0b2tlbiBTZWN1cml0eSB0b2tlbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bmJpbmRDbGFzc0xvYWRlcihPYmplY3QgbmFtZSwgT2JqZWN0IHRva2VuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKyAgICAgICAgaWYgKENvbnRleHRBY2Nlc3NDb250cm9sbGVyLmNoZWNrU2VjdXJpdHlUb2tlbihuYW1lLCB0b2tlbikpIHsKKyAgICAgICAgICAgIE9iamVjdCBuID0gY2xOYW1lQmluZGluZ3MuZ2V0KGNsYXNzTG9hZGVyKTsKKyAgICAgICAgICAgIGlmICgobj09bnVsbCkgfHwgIShuLmVxdWFscyhuYW1lKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbEJpbmRpbmdzLnJlbW92ZShjbGFzc0xvYWRlcik7CisgICAgICAgICAgICBjbE5hbWVCaW5kaW5ncy5yZW1vdmUoY2xhc3NMb2FkZXIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWluZyBjb250ZXh0IGJvdW5kIHRvIGEgY2xhc3MgbG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29udGV4dCBnZXRDbGFzc0xvYWRlcigpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBDbGFzc0xvYWRlciBjbCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG51bGw7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGNvbnRleHQgPSAoQ29udGV4dCkgY2xCaW5kaW5ncy5nZXQoY2wpOworICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgoY2wgPSBjbC5nZXRQYXJlbnQoKSkgIT0gbnVsbCk7CisgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImNvbnRleHRCaW5kaW5ncy5ub0NvbnRleHRCb3VuZFRvQ0wiKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWluZyBjb250ZXh0IG5hbWUgYm91bmQgdG8gYSBjbGFzcyBsb2FkZXIuCisgICAgICovCisgICAgc3RhdGljIE9iamVjdCBnZXRDbGFzc0xvYWRlck5hbWUoKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBPYmplY3QgbmFtZSA9IG51bGw7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIG5hbWUgPSBjbE5hbWVCaW5kaW5ncy5nZXQoY2wpOworICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgoY2wgPSBjbC5nZXRQYXJlbnQoKSkgIT0gbnVsbCk7CisgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImNvbnRleHRCaW5kaW5ncy5ub0NvbnRleHRCb3VuZFRvQ0wiKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBpZiBjdXJyZW50IGNsYXNzIGxvYWRlciBpcyBib3VuZCB0byBhIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xhc3NMb2FkZXJCb3VuZCgpIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoY2xCaW5kaW5ncy5jb250YWluc0tleShjbCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoKGNsID0gY2wuZ2V0UGFyZW50KCkpICE9IG51bGwpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvRWpiUmVmLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0VqYlJlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZTMzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0VqYlJlZi5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZzsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZlcmVuY2U7CitpbXBvcnQgamF2YXgubmFtaW5nLlN0cmluZ1JlZkFkZHI7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHJlZmVyZW5jZSBhZGRyZXNzIHRvIGFuIEVKQi4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBFamJSZWYKKyAgICBleHRlbmRzIFJlZmVyZW5jZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGZhY3RvcnkgZm9yIHRoaXMgcmVmZXJlbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRkFDVE9SWSA9IAorICAgICAgICBvcmcuYXBhY2hlLm5hbWluZy5mYWN0b3J5LkNvbnN0YW50cy5ERUZBVUxUX0VKQl9GQUNUT1JZOworCisKKyAgICAvKioKKyAgICAgKiBFSkIgdHlwZSBhZGRyZXNzIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJ0eXBlIjsKKworCisgICAgLyoqCisgICAgICogUmVtb3RlIGludGVyZmFjZSBjbGFzc25hbWUgYWRkcmVzcyB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9URSA9ICJyZW1vdGUiOworCisKKyAgICAvKioKKyAgICAgKiBMaW5rIGFkZHJlc3MgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LID0gImxpbmsiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogRUpCIFJlZmVyZW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZWpiVHlwZSBFSkIgdHlwZQorICAgICAqIEBwYXJhbSBob21lIEhvbWUgaW50ZXJmYWNlIGNsYXNzbmFtZQorICAgICAqIEBwYXJhbSByZW1vdGUgUmVtb3RlIGludGVyZmFjZSBjbGFzc25hbWUKKyAgICAgKiBAcGFyYW0gbGluayBFSkIgbGluaworICAgICAqLworICAgIHB1YmxpYyBFamJSZWYoU3RyaW5nIGVqYlR5cGUsIFN0cmluZyBob21lLCBTdHJpbmcgcmVtb3RlLCBTdHJpbmcgbGluaykgeworICAgICAgICB0aGlzKGVqYlR5cGUsIGhvbWUsIHJlbW90ZSwgbGluaywgbnVsbCwgbnVsbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFSkIgUmVmZXJlbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlamJUeXBlIEVKQiB0eXBlCisgICAgICogQHBhcmFtIGhvbWUgSG9tZSBpbnRlcmZhY2UgY2xhc3NuYW1lCisgICAgICogQHBhcmFtIHJlbW90ZSBSZW1vdGUgaW50ZXJmYWNlIGNsYXNzbmFtZQorICAgICAqIEBwYXJhbSBsaW5rIEVKQiBsaW5rCisgICAgICovCisgICAgcHVibGljIEVqYlJlZihTdHJpbmcgZWpiVHlwZSwgU3RyaW5nIGhvbWUsIFN0cmluZyByZW1vdGUsIFN0cmluZyBsaW5rLAorICAgICAgICAgICAgICAgICAgU3RyaW5nIGZhY3RvcnksIFN0cmluZyBmYWN0b3J5TG9jYXRpb24pIHsKKyAgICAgICAgc3VwZXIoaG9tZSwgZmFjdG9yeSwgZmFjdG9yeUxvY2F0aW9uKTsKKyAgICAgICAgU3RyaW5nUmVmQWRkciByZWZBZGRyID0gbnVsbDsKKyAgICAgICAgaWYgKGVqYlR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVmQWRkciA9IG5ldyBTdHJpbmdSZWZBZGRyKFRZUEUsIGVqYlR5cGUpOworICAgICAgICAgICAgYWRkKHJlZkFkZHIpOworICAgICAgICB9CisgICAgICAgIGlmIChyZW1vdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVmQWRkciA9IG5ldyBTdHJpbmdSZWZBZGRyKFJFTU9URSwgcmVtb3RlKTsKKyAgICAgICAgICAgIGFkZChyZWZBZGRyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGluayAhPSBudWxsKSB7CisgICAgICAgICAgICByZWZBZGRyID0gbmV3IFN0cmluZ1JlZkFkZHIoTElOSywgbGluayk7CisgICAgICAgICAgICBhZGQocmVmQWRkcik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWZBZGRyIE1ldGhvZHMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlZmVyZW5jZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgZmFjdG9yeSBvZiB0aGUgb2JqZWN0IHRvIHdoaWNoIHRoaXMgCisgICAgICogcmVmZXJlbmNlIHJlZmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlDbGFzc05hbWUoKSB7CisgICAgICAgIFN0cmluZyBmYWN0b3J5ID0gc3VwZXIuZ2V0RmFjdG9yeUNsYXNzTmFtZSgpOworICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZhY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQ29udGV4dC5PQkpFQ1RfRkFDVE9SSUVTKTsKKyAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfRkFDVE9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9KbmRpUGVybWlzc2lvbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9KbmRpUGVybWlzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MWFhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0puZGlQZXJtaXNzaW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmc7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbjsKKworLyoqCisgKiBKYXZhIFNlY3VyaXR5TWFuYWdlciBQZXJtaXNzaW9uIGNsYXNzIGZvciBKTkRJIG5hbWUgYmFzZWQgZmlsZSByZXNvdXJjZXMKKyAqIDxwPgorICogVGhlIEpuZGlQZXJtaXNzaW9uIGV4dGVuZHMgdGhlIEJhc2ljUGVybWlzc2lvbi4KKyAqIFRoZSBwZXJtaXNzaW9uIG5hbWUgaXMgYSBmdWxsIG9yIHBhcnRpYWwgam5kaSByZXNvdXJjZSBuYW1lLgorICogQW4gKiBjYW4gYmUgdXNlZCBhdCB0aGUgZW5kIG9mIHRoZSBuYW1lIHRvIG1hdGNoIGFsbCBuYW1lZAorICogcmVzb3VyY2VzIHRoYXQgc3RhcnQgd2l0aCBuYW1lLiAgVGhlcmUgYXJlIG5vIGFjdGlvbnMuPC9wPgorICogPHA+CisgKiBFeGFtcGxlIHRoYXQgZ3JhbnRzIHBlcm1pc3Npb24gdG8gcmVhZCBhbGwgSk5ESSBmaWxlIGJhc2VkIHJlc291cmNlczoKKyAqIDxsaT4gcGVybWlzc2lvbiBvcmcuYXBhY2hlLm5hbWluZy5KbmRpUGVybWlzc2lvbiAiKiI7PC9saT4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIEdsZW5uIE5pZWxzZW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEpuZGlQZXJtaXNzaW9uIGV4dGVuZHMgQmFzaWNQZXJtaXNzaW9uIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBKbmRpUGVybWlzc2lvbiB3aXRoIG5vIGFjdGlvbnMKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIC0gSk5ESSByZXNvdXJjZSBwYXRoIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgSm5kaVBlcm1pc3Npb24oU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBKbmRpUGVybWlzc2lvbiB3aXRoIGFjdGlvbnMKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIC0gSk5ESSByZXNvdXJjZSBwYXRoIG5hbWUKKyAgICAgKiBAcGFyYW0gYWN0aW9ucyAtIEpOREkgYWN0aW9ucyAobm9uZSBkZWZpbmVkKQorICAgICAqLworICAgIHB1YmxpYyBKbmRpUGVybWlzc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGFjdGlvbnMpIHsKKyAgICAgICAgc3VwZXIobmFtZSxhY3Rpb25zKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NGY1NzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTEgQEAKK2NvbnRleHRCaW5kaW5ncy51bmtub3duQ29udGV4dD1Vbmtub3duIGNvbnRleHQgbmFtZSA6IHswfQorY29udGV4dEJpbmRpbmdzLm5vQ29udGV4dEJvdW5kVG9UaHJlYWQ9Tm8gbmFtaW5nIGNvbnRleHQgYm91bmQgdG8gdGhpcyB0aHJlYWQKK2NvbnRleHRCaW5kaW5ncy5ub0NvbnRleHRCb3VuZFRvQ0w9Tm8gbmFtaW5nIGNvbnRleHQgYm91bmQgdG8gdGhpcyBjbGFzcyBsb2FkZXIKK3NlbGVjdG9yQ29udGV4dC5ub0phdmFVcmw9VGhpcyBjb250ZXh0IG11c3QgYmUgYWNjZXNzZWQgdGhyb3VnaHQgYSBqYXZhOiBVUkwKK25hbWluZ0NvbnRleHQuY29udGV4dEV4cGVjdGVkPU5hbWUgaXMgbm90IGJvdW5kIHRvIGEgQ29udGV4dAorbmFtaW5nQ29udGV4dC5mYWlsUmVzb2x2aW5nUmVmZXJlbmNlPVVuZXhwZWN0ZWQgZXhjZXB0aW9uIHJlc29sdmluZyByZWZlcmVuY2UKK25hbWluZ0NvbnRleHQubmFtZU5vdEJvdW5kPU5hbWUgezB9IGlzIG5vdCBib3VuZCBpbiB0aGlzIENvbnRleHQKK25hbWluZ0NvbnRleHQucmVhZE9ubHk9Q29udGV4dCBpcyByZWFkIG9ubHkKK25hbWluZ0NvbnRleHQuaW52YWxpZE5hbWU9TmFtZSBpcyBub3QgdmFsaWQKK25hbWluZ0NvbnRleHQuYWxyZWFkeUJvdW5kPU5hbWUgezB9IGlzIGFscmVhZHkgYm91bmQgaW4gdGhpcyBDb250ZXh0CituYW1pbmdDb250ZXh0Lm5vQWJzb2x1dGVOYW1lPUNhbicndCBnZW5lcmF0ZSBhbiBhYnNvbHV0ZSBuYW1lIGZvciB0aGlzIG5hbWVzcGFjZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMmMyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTYgQEAKKyMgJElkJAorCisjIGxhbmd1YWdlIGVzCisKKyMgcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZworCisKK2NvbnRleHRCaW5kaW5ncy51bmtub3duQ29udGV4dD1Db250ZXh0byB7MH0gZGVzY29ub2NpZG8gCitjb250ZXh0QmluZGluZ3Mubm9Db250ZXh0Qm91bmRUb1RocmVhZD1ObyBoYXkgY29udGV4dG8gZGUgbm9tYnJlcyBhc29jaWFkbyBhIGVzdGUgaGlsbworc2VsZWN0b3JDb250ZXh0Lm5vSmF2YVVybD1Fc3RlIGNvbnRleHRvIGRlYmUgZGUgc2VyIGFjY2VkaWRvIGEgdHJhdmVzIGRlIHVuYSBVUkwgZGUgdGlwbyBqYXZhOgorbmFtaW5nQ29udGV4dC5jb250ZXh0RXhwZWN0ZWQ9RWwgbm9tYnJlIG5vIGVzdGEgYXNvY2lhZG8gYSBuaW5ndW4gQ29udGV4dG8KK25hbWluZ0NvbnRleHQubmFtZU5vdEJvdW5kPUVsIG5vbWJyZSB7MH0gbm8gZXN0ZSBhc29jaWFkbyBhIGVzdGUgY29udGV4dG8KK25hbWluZ0NvbnRleHQucmVhZE9ubHk9RWwgY29udGV4dG8gZXMgZGUgc29sbyBsZWN0dXJhCituYW1pbmdDb250ZXh0LmludmFsaWROYW1lPU5vbWJyZSBubyB2YWxpZG8KK25hbWluZ0NvbnRleHQubm9BYnNvbHV0ZU5hbWU9Tm8gc2UgcHVlZGUgZ2VuZXJhciB1biBub21icmUgYWJzb2x1dG8gcGFyYSBlc3RlIGVzcGFjaW8gZGUgbm9tYnJlcworbmFtaW5nQ29udGV4dC5hbHJlYWR5Qm91bmQ9RWwgbm9tYnJlIHswfSBlc3RlIHlhIGFzb2NpYWRvIGVuIGVzdGUgQ29udGV4dG8KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMWE2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTEgQEAKK2NvbnRleHRCaW5kaW5ncy51bmtub3duQ29udGV4dD1Ob20gZGUgQ29udGV4dGUgaW5jb25udSA6IHswfQorY29udGV4dEJpbmRpbmdzLm5vQ29udGV4dEJvdW5kVG9UaHJlYWQ9QXVjdW4gQ29udGV4dGUgZGUgbm9tbWFnZSBsaekg4CBjZSB0aHJlYWQKK2NvbnRleHRCaW5kaW5ncy5ub0NvbnRleHRCb3VuZFRvQ0w9QXVjdW4gQ29udGV4dGUgZGUgbm9tbWFnZSBsaekg4CBjZSBjaGFyZ2V1ciBkZSBjbGFzc2VzCitzZWxlY3RvckNvbnRleHQubm9KYXZhVXJsPUNlIENvbnRleHRlIGRvaXQg6nRyZSBhY2PpZOkgcGFyIHVuZSBqYXZhOiBVUkwKK25hbWluZ0NvbnRleHQuY29udGV4dEV4cGVjdGVkPUxlIE5vbSBuJydlc3QgcGFzIGxp6SDgIHVuIENvbnRleHRlCituYW1pbmdDb250ZXh0LmZhaWxSZXNvbHZpbmdSZWZlcmVuY2U9VW5lIGVycmV1ciBzIGVzdCBwcm9kdWl0ZSBkdXJhbnQgbGEgculzb2x1dGlvbiBkZSBsYSBy6WbpcmVuY2UKK25hbWluZ0NvbnRleHQubmFtZU5vdEJvdW5kPUxlIE5vbSB7MH0gbicnZXN0IHBhcyBsaekg4CBjZSBDb250ZXh0ZQorbmFtaW5nQ29udGV4dC5yZWFkT25seT1MZSBDb250ZXh0ZSBlc3QgZW4gbGVjdHVyZSBzZXVsZQorbmFtaW5nQ29udGV4dC5pbnZhbGlkTmFtZT1MZSBOb20gZXN0IGludmFsaWRlCituYW1pbmdDb250ZXh0LmFscmVhZHlCb3VuZD1MZSBOb20gezB9IGVzdCBk6WrgIGxp6SDgIGNlIENvbnRleHRlCituYW1pbmdDb250ZXh0Lm5vQWJzb2x1dGVOYW1lPUltcG9zc2libGUgZGUgZ+lu6XJlciB1biBub20gYWJzb2x1IHBvdXIgY2V0IGVzcGFjZSBkZSBub21tYWdlIChuYW1lc3BhY2UpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwN2VmZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMSBAQAorY29udGV4dEJpbmRpbmdzLnVua25vd25Db250ZXh0PVx1NjcyYVx1NzdlNVx1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1NTQwZFx1MzA2N1x1MzA1OTogezB9Citjb250ZXh0QmluZGluZ3Mubm9Db250ZXh0Qm91bmRUb1RocmVhZD1cdTU0MGRcdTUyNGRcdTRlZDhcdTMwNTFcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNmZcdTMwNTNcdTMwNmVcdTMwYjlcdTMwZWNcdTMwYzNcdTMwYzlcdTMwNmJcdTMwZDBcdTMwYTRcdTMwZjNcdTMwYzlcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2NvbnRleHRCaW5kaW5ncy5ub0NvbnRleHRCb3VuZFRvQ0w9XHU1NDBkXHU1MjRkXHU0ZWQ4XHUzMDUxXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZmXHUzMDUzXHUzMDZlXHUzMGFmXHUzMGU5XHUzMGI5XHUzMGVkXHUzMGZjXHUzMGMwXHUzMDZiXHUzMGQwXHUzMGE0XHUzMGYzXHUzMGM5XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitzZWxlY3RvckNvbnRleHQubm9KYXZhVXJsPVx1MzA1M1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2Ylx1MzA2ZmphdmE6IFVSTFx1MzA5Mlx1NzUyOFx1MzA0NFx1MzA2Nlx1MzBhMlx1MzBhZlx1MzBiYlx1MzBiOVx1MzA1NVx1MzA4Y1x1MzA2ZFx1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworbmFtaW5nQ29udGV4dC5jb250ZXh0RXhwZWN0ZWQ9XHU1NDBkXHU1MjRkXHUzMDRjXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZiXHUzMGQwXHUzMGE0XHUzMGYzXHUzMGM5XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCituYW1pbmdDb250ZXh0LmZhaWxSZXNvbHZpbmdSZWZlcmVuY2U9XHU1M2MyXHU3MTY3XHUzMDZlXHU4OWUzXHU2YzdhXHU0ZTJkXHUzMDZiXHU0ZTg4XHU2ZTJjXHUzMDU3XHUzMDZhXHUzMDQ0XHU0ZjhiXHU1OTE2XHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCituYW1pbmdDb250ZXh0Lm5hbWVOb3RCb3VuZD1cdTU0MGRcdTUyNGQgezB9IFx1MzA2Zlx1MzA1M1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2Ylx1MzBkMFx1MzBhNFx1MzBmM1x1MzBjOVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworbmFtaW5nQ29udGV4dC5yZWFkT25seT1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNmZcdTMwZWFcdTMwZmNcdTMwYzlcdTMwYWFcdTMwZjNcdTMwZWFcdTMwZmNcdTMwNjdcdTMwNTkKK25hbWluZ0NvbnRleHQuaW52YWxpZE5hbWU9XHU1NDBkXHU1MjRkXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5CituYW1pbmdDb250ZXh0LmFscmVhZHlCb3VuZD1cdTU0MGRcdTUyNGQgezB9IFx1MzA2Zlx1NjVlMlx1MzA2Ylx1MzA1M1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2Ylx1MzBkMFx1MzBhNFx1MzBmM1x1MzBjOVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorbmFtaW5nQ29udGV4dC5ub0Fic29sdXRlTmFtZT1cdTMwNTNcdTMwNmVcdTU0MGRcdTUyNGRcdTdhN2FcdTk1OTNcdTMwNmJcdTdkNzZcdTViZmVcdTU0MGRcdTMwOTJcdTc1MWZcdTYyMTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTmFtZVBhcnNlckltcGwuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTmFtZVBhcnNlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzhjYjA1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9OYW1lUGFyc2VySW1wbC5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nOworCitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVQYXJzZXI7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29tcG9zaXRlTmFtZTsKKworLyoqCisgKiBQYXJzZXMgbmFtZXMuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgTmFtZVBhcnNlckltcGwgCisgICAgaW1wbGVtZW50cyBOYW1lUGFyc2VyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE5hbWVQYXJzZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYSBuYW1lIGludG8gaXRzIGNvbXBvbmVudHMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5vbi1udWxsIHN0cmluZyBuYW1lIHRvIHBhcnNlCisgICAgICogQHJldHVybiBBIG5vbi1udWxsIHBhcnNlZCBmb3JtIG9mIHRoZSBuYW1lIHVzaW5nIHRoZSBuYW1pbmcgY29udmVudGlvbiAKKyAgICAgKiBvZiB0aGlzIHBhcnNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZSBwYXJzZShTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlTmFtZShuYW1lKTsKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWluZ0NvbnRleHQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTmFtaW5nQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYWVkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWluZ0NvbnRleHQuamF2YQpAQCAtMCwwICsxLDkwOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTGlua1JlZjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29tcG9zaXRlTmFtZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZVBhcnNlcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmZXJlbmNlYWJsZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmZXJlbmNlOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5vdENvbnRleHRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5PcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLnNwaS5OYW1pbmdNYW5hZ2VyOworCisvKioKKyAqIENhdGFsaW5hIEpOREkgQ29udGV4dCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgTmFtaW5nQ29udGV4dCBpbXBsZW1lbnRzIENvbnRleHQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgLyoqCisgICAgICogTmFtZSBwYXJzZXIgZm9yIHRoaXMgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE5hbWVQYXJzZXIgbmFtZVBhcnNlciA9IG5ldyBOYW1lUGFyc2VySW1wbCgpOworCisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coTmFtaW5nQ29udGV4dC5jbGFzcyk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBuYW1pbmcgY29udGV4dCB1c2luZyB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0NvbnRleHQoSGFzaHRhYmxlIGVudiwgU3RyaW5nIG5hbWUpIAorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5iaW5kaW5ncyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHRoaXMuZW52ID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICAvLyBGSVhNRSA/IENvdWxkIGJlIHB1dCBpbiB0aGUgZW52aXJvbm1lbnQgPworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAvLyBQb3B1bGF0aW5nIHRoZSBlbnZpcm9ubWVudCBoYXNodGFibGUKKyAgICAgICAgaWYgKGVudiAhPSBudWxsICkgeworICAgICAgICAgICAgRW51bWVyYXRpb24gZW52RW50cmllcyA9IGVudi5rZXlzKCk7CisgICAgICAgICAgICB3aGlsZSAoZW52RW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBlbnRyeU5hbWUgPSAoU3RyaW5nKSBlbnZFbnRyaWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgYWRkVG9FbnZpcm9ubWVudChlbnRyeU5hbWUsIGVudi5nZXQoZW50cnlOYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhIG5hbWluZyBjb250ZXh0IHVzaW5nIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nQ29udGV4dChIYXNodGFibGUgZW52LCBTdHJpbmcgbmFtZSwgSGFzaE1hcCBiaW5kaW5ncykgCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB0aGlzKGVudiwgbmFtZSk7CisgICAgICAgIHRoaXMuYmluZGluZ3MgPSBiaW5kaW5nczsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBFbnZpcm9ubWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGVudjsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ01hbmFnZXIgc20gPSBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBCaW5kaW5ncyBpbiB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgYmluZGluZ3M7CisKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgQ2F0YWxpbmEgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb250ZXh0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1lZCBvYmplY3QuIElmIG5hbWUgaXMgZW1wdHksIHJldHVybnMgYSBuZXcgaW5zdGFuY2UgCisgICAgICogb2YgdGhpcyBjb250ZXh0ICh3aGljaCByZXByZXNlbnRzIHRoZSBzYW1lIG5hbWluZyBjb250ZXh0IGFzIHRoaXMgCisgICAgICogY29udGV4dCwgYnV0IGl0cyBlbnZpcm9ubWVudCBtYXkgYmUgbW9kaWZpZWQgaW5kZXBlbmRlbnRseSBhbmQgaXQgbWF5IAorICAgICAqIGJlIGFjY2Vzc2VkIGNvbmN1cnJlbnRseSkuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGxvb2t1cChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbG9va3VwKG5hbWUsIHRydWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1lZCBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGxvb2t1cChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBsb29rdXAobmV3IENvbXBvc2l0ZU5hbWUobmFtZSksIHRydWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdC4gQWxsIGludGVybWVkaWF0ZSBjb250ZXh0cyBhbmQgdGhlIHRhcmdldCAKKyAgICAgKiBjb250ZXh0ICh0aGF0IG5hbWVkIGJ5IGFsbCBidXQgdGVybWluYWwgYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZSkgCisgICAgICogbXVzdCBhbHJlYWR5IGV4aXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIG9iamVjdCBkaWQgbm90IHN1cHBseSBhbGwgCisgICAgICogbWFuZGF0b3J5IGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kKE5hbWUgbmFtZSwgT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGJpbmQobmFtZSwgb2JqLCBmYWxzZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5hbWUgdG8gYW4gb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIG9iamVjdCBkaWQgbm90IHN1cHBseSBhbGwgCisgICAgICogbWFuZGF0b3J5IGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgYmluZChuZXcgQ29tcG9zaXRlTmFtZShuYW1lKSwgb2JqKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QsIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBiaW5kaW5nLiBBbGwgCisgICAgICogaW50ZXJtZWRpYXRlIGNvbnRleHRzIGFuZCB0aGUgdGFyZ2V0IGNvbnRleHQgKHRoYXQgbmFtZWQgYnkgYWxsIGJ1dCAKKyAgICAgKiB0ZXJtaW5hbCBhdG9taWMgY29tcG9uZW50IG9mIHRoZSBuYW1lKSBtdXN0IGFscmVhZHkgZXhpc3QuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIG9iamVjdCBpcyBhIERpckNvbnRleHQsIGFueSBleGlzdGluZyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCAKKyAgICAgKiB0aGUgbmFtZSBhcmUgcmVwbGFjZWQgd2l0aCB0aG9zZSBvZiB0aGUgb2JqZWN0LiBPdGhlcndpc2UsIGFueSAKKyAgICAgKiBleGlzdGluZyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSByZW1haW4gdW5jaGFuZ2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgb2JqZWN0IGRpZCBub3Qgc3VwcGx5IGFsbCAKKyAgICAgKiBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlYmluZChOYW1lIG5hbWUsIE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBiaW5kKG5hbWUsIG9iaiwgdHJ1ZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5hbWUgdG8gYW4gb2JqZWN0LCBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgYmluZGluZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIG9iamVjdCBkaWQgbm90IHN1cHBseSBhbGwgCisgICAgICogbWFuZGF0b3J5IGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWJpbmQoU3RyaW5nIG5hbWUsIE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZWJpbmQobmV3IENvbXBvc2l0ZU5hbWUobmFtZSksIG9iaik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbmJpbmRzIHRoZSBuYW1lZCBvYmplY3QuIFJlbW92ZXMgdGhlIHRlcm1pbmFsIGF0b21pYyBuYW1lIGluIG5hbWUgCisgICAgICogZnJvbSB0aGUgdGFyZ2V0IGNvbnRleHQtLXRoYXQgbmFtZWQgYnkgYWxsIGJ1dCB0aGUgdGVybWluYWwgYXRvbWljIAorICAgICAqIHBhcnQgb2YgbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LiBJdCBzdWNjZWVkcyBldmVuIGlmIHRoZSB0ZXJtaW5hbCBhdG9taWMgCisgICAgICogbmFtZSBpcyBub3QgYm91bmQgaW4gdGhlIHRhcmdldCBjb250ZXh0LCBidXQgdGhyb3dzIAorICAgICAqIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGludGVybWVkaWF0ZSBjb250ZXh0cyBkbyBub3QgZXhpc3QuIAorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiBpbnRlcm1lZGlhdGUgY29udGV4dCBkb2VzIG5vdCAKKyAgICAgKiBleGlzdAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuYmluZChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBjaGVja1dyaXRhYmxlKCk7CisgICAgICAgIAorICAgICAgICB3aGlsZSAoKCFuYW1lLmlzRW1wdHkoKSkgJiYgKG5hbWUuZ2V0KDApLmxlbmd0aCgpID09IDApKQorICAgICAgICAgICAgbmFtZSA9IG5hbWUuZ2V0U3VmZml4KDEpOworICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibmFtaW5nQ29udGV4dC5pbnZhbGlkTmFtZSIpKTsKKyAgICAgICAgCisgICAgICAgIE5hbWluZ0VudHJ5IGVudHJ5ID0gKE5hbWluZ0VudHJ5KSBiaW5kaW5ncy5nZXQobmFtZS5nZXQoMCkpOworICAgICAgICAKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1lTm90Rm91bmRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJuYW1pbmdDb250ZXh0Lm5hbWVOb3RCb3VuZCIsIG5hbWUuZ2V0KDApKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChuYW1lLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS50eXBlID09IE5hbWluZ0VudHJ5LkNPTlRFWFQpIHsKKyAgICAgICAgICAgICAgICAoKENvbnRleHQpIGVudHJ5LnZhbHVlKS51bmJpbmQobmFtZS5nZXRTdWZmaXgoMSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQuY29udGV4dEV4cGVjdGVkIikpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmluZGluZ3MucmVtb3ZlKG5hbWUuZ2V0KDApKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVuYmluZHMgdGhlIG5hbWVkIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gaW50ZXJtZWRpYXRlIGNvbnRleHQgZG9lcyBub3QgCisgICAgICogZXhpc3QKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmJpbmQoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB1bmJpbmQobmV3IENvbXBvc2l0ZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuZXcgbmFtZSB0byB0aGUgb2JqZWN0IGJvdW5kIHRvIGFuIG9sZCBuYW1lLCBhbmQgdW5iaW5kcyB0aGUgCisgICAgICogb2xkIG5hbWUuIEJvdGggbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dC4gQW55IGF0dHJpYnV0ZXMgCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBvbGQgbmFtZSBiZWNvbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgbmFtZS4gCisgICAgICogSW50ZXJtZWRpYXRlIGNvbnRleHRzIG9mIHRoZSBvbGQgbmFtZSBhcmUgbm90IGNoYW5nZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG9sZE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV4aXN0aW5nIGJpbmRpbmc7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gbmV3TmFtZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGJpbmRpbmc7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmV3TmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVuYW1lKE5hbWUgb2xkTmFtZSwgTmFtZSBuZXdOYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gbG9va3VwKG9sZE5hbWUpOworICAgICAgICBiaW5kKG5ld05hbWUsIHZhbHVlKTsKKyAgICAgICAgdW5iaW5kKG9sZE5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuZXcgbmFtZSB0byB0aGUgb2JqZWN0IGJvdW5kIHRvIGFuIG9sZCBuYW1lLCBhbmQgdW5iaW5kcyB0aGUgCisgICAgICogb2xkIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIG9sZE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV4aXN0aW5nIGJpbmRpbmc7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gbmV3TmFtZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGJpbmRpbmc7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmV3TmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVuYW1lKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJlbmFtZShuZXcgQ29tcG9zaXRlTmFtZShvbGROYW1lKSwgbmV3IENvbXBvc2l0ZU5hbWUobmV3TmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyB0aGUgbmFtZXMgYm91bmQgaW4gdGhlIG5hbWVkIGNvbnRleHQsIGFsb25nIHdpdGggdGhlIGNsYXNzIAorICAgICAqIG5hbWVzIG9mIG9iamVjdHMgYm91bmQgdG8gdGhlbS4gVGhlIGNvbnRlbnRzIG9mIGFueSBzdWJjb250ZXh0cyBhcmUgCisgICAgICogbm90IGluY2x1ZGVkLgorICAgICAqIDxwPgorICAgICAqIElmIGEgYmluZGluZyBpcyBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhpcyBjb250ZXh0LCBpdHMgZWZmZWN0IG9uIAorICAgICAqIGFuIGVudW1lcmF0aW9uIHByZXZpb3VzbHkgcmV0dXJuZWQgaXMgdW5kZWZpbmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGxpc3QKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBuYW1lcyBhbmQgY2xhc3MgbmFtZXMgb2YgdGhlIGJpbmRpbmdzIGluIAorICAgICAqIHRoaXMgY29udGV4dC4gRWFjaCBlbGVtZW50IG9mIHRoZSBlbnVtZXJhdGlvbiBpcyBvZiB0eXBlIE5hbWVDbGFzc1BhaXIuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3QoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUmVtb3ZpbmcgZW1wdHkgcGFydHMKKyAgICAgICAgd2hpbGUgKCghbmFtZS5pc0VtcHR5KCkpICYmIChuYW1lLmdldCgwKS5sZW5ndGgoKSA9PSAwKSkKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLmdldFN1ZmZpeCgxKTsKKyAgICAgICAgaWYgKG5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5hbWluZ0NvbnRleHRFbnVtZXJhdGlvbihiaW5kaW5ncy52YWx1ZXMoKS5pdGVyYXRvcigpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgTmFtaW5nRW50cnkgZW50cnkgPSAoTmFtaW5nRW50cnkpIGJpbmRpbmdzLmdldChuYW1lLmdldCgwKSk7CisgICAgICAgIAorICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWVOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQubmFtZU5vdEJvdW5kIiwgbmFtZS5nZXQoMCkpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGVudHJ5LnR5cGUgIT0gTmFtaW5nRW50cnkuQ09OVEVYVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQuY29udGV4dEV4cGVjdGVkIikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKENvbnRleHQpIGVudHJ5LnZhbHVlKS5saXN0KG5hbWUuZ2V0U3VmZml4KDEpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgdGhlIG5hbWVzIGJvdW5kIGluIHRoZSBuYW1lZCBjb250ZXh0LCBhbG9uZyB3aXRoIHRoZSBjbGFzcyAKKyAgICAgKiBuYW1lcyBvZiBvYmplY3RzIGJvdW5kIHRvIHRoZW0uCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIG5hbWVzIGFuZCBjbGFzcyBuYW1lcyBvZiB0aGUgYmluZGluZ3MgaW4gCisgICAgICogdGhpcyBjb250ZXh0LiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgTmFtZUNsYXNzUGFpci4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBsaXN0KG5ldyBDb21wb3NpdGVOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgdGhlIG5hbWVzIGJvdW5kIGluIHRoZSBuYW1lZCBjb250ZXh0LCBhbG9uZyB3aXRoIHRoZSAKKyAgICAgKiBvYmplY3RzIGJvdW5kIHRvIHRoZW0uIFRoZSBjb250ZW50cyBvZiBhbnkgc3ViY29udGV4dHMgYXJlIG5vdCAKKyAgICAgKiBpbmNsdWRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIGJpbmRpbmcgaXMgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoaXMgY29udGV4dCwgaXRzIGVmZmVjdCBvbiAKKyAgICAgKiBhbiBlbnVtZXJhdGlvbiBwcmV2aW91c2x5IHJldHVybmVkIGlzIHVuZGVmaW5lZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBsaXN0CisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgYmluZGluZ3MgaW4gdGhpcyBjb250ZXh0LiAKKyAgICAgKiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgQmluZGluZy4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdEJpbmRpbmdzKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFJlbW92aW5nIGVtcHR5IHBhcnRzCisgICAgICAgIHdoaWxlICgoIW5hbWUuaXNFbXB0eSgpKSAmJiAobmFtZS5nZXQoMCkubGVuZ3RoKCkgPT0gMCkpCisgICAgICAgICAgICBuYW1lID0gbmFtZS5nZXRTdWZmaXgoMSk7CisgICAgICAgIGlmIChuYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBOYW1pbmdDb250ZXh0QmluZGluZ3NFbnVtZXJhdGlvbihiaW5kaW5ncy52YWx1ZXMoKS5pdGVyYXRvcigpLCB0aGlzKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgTmFtaW5nRW50cnkgZW50cnkgPSAoTmFtaW5nRW50cnkpIGJpbmRpbmdzLmdldChuYW1lLmdldCgwKSk7CisgICAgICAgIAorICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWVOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQubmFtZU5vdEJvdW5kIiwgbmFtZS5nZXQoMCkpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGVudHJ5LnR5cGUgIT0gTmFtaW5nRW50cnkuQ09OVEVYVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQuY29udGV4dEV4cGVjdGVkIikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKENvbnRleHQpIGVudHJ5LnZhbHVlKS5saXN0QmluZGluZ3MobmFtZS5nZXRTdWZmaXgoMSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyB0aGUgbmFtZXMgYm91bmQgaW4gdGhlIG5hbWVkIGNvbnRleHQsIGFsb25nIHdpdGggdGhlIAorICAgICAqIG9iamVjdHMgYm91bmQgdG8gdGhlbS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBsaXN0CisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgYmluZGluZ3MgaW4gdGhpcyBjb250ZXh0LiAKKyAgICAgKiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgQmluZGluZy4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdEJpbmRpbmdzKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGxpc3RCaW5kaW5ncyhuZXcgQ29tcG9zaXRlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXN0cm95cyB0aGUgbmFtZWQgY29udGV4dCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBuYW1lc3BhY2UuIEFueSAKKyAgICAgKiBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSBhcmUgYWxzbyByZW1vdmVkLiBJbnRlcm1lZGlhdGUgCisgICAgICogY29udGV4dHMgYXJlIG5vdCBkZXN0cm95ZWQuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgaWRlbXBvdGVudC4gSXQgc3VjY2VlZHMgZXZlbiBpZiB0aGUgdGVybWluYWwgYXRvbWljIAorICAgICAqIG5hbWUgaXMgbm90IGJvdW5kIGluIHRoZSB0YXJnZXQgY29udGV4dCwgYnV0IHRocm93cyAKKyAgICAgKiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBpbnRlcm1lZGlhdGUgY29udGV4dHMgZG8gbm90IGV4aXN0LiAKKyAgICAgKiAKKyAgICAgKiBJbiBhIGZlZGVyYXRlZCBuYW1pbmcgc3lzdGVtLCBhIGNvbnRleHQgZnJvbSBvbmUgbmFtaW5nIHN5c3RlbSBtYXkgYmUgCisgICAgICogYm91bmQgdG8gYSBuYW1lIGluIGFub3RoZXIuIE9uZSBjYW4gc3Vic2VxdWVudGx5IGxvb2sgdXAgYW5kIHBlcmZvcm0gCisgICAgICogb3BlcmF0aW9ucyBvbiB0aGUgZm9yZWlnbiBjb250ZXh0IHVzaW5nIGEgY29tcG9zaXRlIG5hbWUuIEhvd2V2ZXIsIGFuIAorICAgICAqIGF0dGVtcHQgZGVzdHJveSB0aGUgY29udGV4dCB1c2luZyB0aGlzIGNvbXBvc2l0ZSBuYW1lIHdpbGwgZmFpbCB3aXRoIAorICAgICAqIE5vdENvbnRleHRFeGNlcHRpb24sIGJlY2F1c2UgdGhlIGZvcmVpZ24gY29udGV4dCBpcyBub3QgYSAic3ViY29udGV4dCIgCisgICAgICogb2YgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgYm91bmQuIEluc3RlYWQsIHVzZSB1bmJpbmQoKSB0byByZW1vdmUgCisgICAgICogdGhlIGJpbmRpbmcgb2YgdGhlIGZvcmVpZ24gY29udGV4dC4gRGVzdHJveWluZyB0aGUgZm9yZWlnbiBjb250ZXh0IAorICAgICAqIHJlcXVpcmVzIHRoYXQgdGhlIGRlc3Ryb3lTdWJjb250ZXh0KCkgYmUgcGVyZm9ybWVkIG9uIGEgY29udGV4dCBmcm9tIAorICAgICAqIHRoZSBmb3JlaWduIGNvbnRleHQncyAibmF0aXZlIiBuYW1pbmcgc3lzdGVtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGJlIGRlc3Ryb3llZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFuIGludGVybWVkaWF0ZSBjb250ZXh0IGRvZXMgbm90IAorICAgICAqIGV4aXN0CisgICAgICogQGV4Y2VwdGlvbiBOb3RDb250ZXh0RXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIGJvdW5kIGJ1dCBkb2VzIG5vdCBuYW1lIAorICAgICAqIGEgY29udGV4dCwgb3IgZG9lcyBub3QgbmFtZSBhIGNvbnRleHQgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95U3ViY29udGV4dChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgY2hlY2tXcml0YWJsZSgpOworICAgICAgICAKKyAgICAgICAgd2hpbGUgKCghbmFtZS5pc0VtcHR5KCkpICYmIChuYW1lLmdldCgwKS5sZW5ndGgoKSA9PSAwKSkKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLmdldFN1ZmZpeCgxKTsKKyAgICAgICAgaWYgKG5hbWUuaXNFbXB0eSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQuaW52YWxpZE5hbWUiKSk7CisgICAgICAgIAorICAgICAgICBOYW1pbmdFbnRyeSBlbnRyeSA9IChOYW1pbmdFbnRyeSkgYmluZGluZ3MuZ2V0KG5hbWUuZ2V0KDApKTsKKyAgICAgICAgCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtZU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibmFtaW5nQ29udGV4dC5uYW1lTm90Qm91bmQiLCBuYW1lLmdldCgwKSkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobmFtZS5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBpZiAoZW50cnkudHlwZSA9PSBOYW1pbmdFbnRyeS5DT05URVhUKSB7CisgICAgICAgICAgICAgICAgKChDb250ZXh0KSBlbnRyeS52YWx1ZSkudW5iaW5kKG5hbWUuZ2V0U3VmZml4KDEpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJuYW1pbmdDb250ZXh0LmNvbnRleHRFeHBlY3RlZCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS50eXBlID09IE5hbWluZ0VudHJ5LkNPTlRFWFQpIHsKKyAgICAgICAgICAgICAgICAoKENvbnRleHQpIGVudHJ5LnZhbHVlKS5jbG9zZSgpOworICAgICAgICAgICAgICAgIGJpbmRpbmdzLnJlbW92ZShuYW1lLmdldCgwKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RDb250ZXh0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQuY29udGV4dEV4cGVjdGVkIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIG5hbWVkIGNvbnRleHQgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgbmFtZXNwYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGJlIGRlc3Ryb3llZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFuIGludGVybWVkaWF0ZSBjb250ZXh0IGRvZXMgbm90IAorICAgICAqIGV4aXN0CisgICAgICogQGV4Y2VwdGlvbiBOb3RDb250ZXh0RXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIGJvdW5kIGJ1dCBkb2VzIG5vdCBuYW1lIAorICAgICAqIGEgY29udGV4dCwgb3IgZG9lcyBub3QgbmFtZSBhIGNvbnRleHQgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95U3ViY29udGV4dChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRlc3Ryb3lTdWJjb250ZXh0KG5ldyBDb21wb3NpdGVOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGJpbmRzIGEgbmV3IGNvbnRleHQuIENyZWF0ZXMgYSBuZXcgY29udGV4dCB3aXRoIHRoZSBnaXZlbiAKKyAgICAgKiBuYW1lIGFuZCBiaW5kcyBpdCBpbiB0aGUgdGFyZ2V0IGNvbnRleHQgKHRoYXQgbmFtZWQgYnkgYWxsIGJ1dCAKKyAgICAgKiB0ZXJtaW5hbCBhdG9taWMgY29tcG9uZW50IG9mIHRoZSBuYW1lKS4gQWxsIGludGVybWVkaWF0ZSBjb250ZXh0cyBhbmQgCisgICAgICogdGhlIHRhcmdldCBjb250ZXh0IG11c3QgYWxyZWFkeSBleGlzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBjcmVhdGU7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBjcmVhdGlvbiBvZiB0aGUgc3ViY29udGV4dCAKKyAgICAgKiByZXF1aXJlcyBzcGVjaWZpY2F0aW9uIG9mIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIENvbnRleHQgY3JlYXRlU3ViY29udGV4dChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBjaGVja1dyaXRhYmxlKCk7CisgICAgICAgIAorICAgICAgICBDb250ZXh0IG5ld0NvbnRleHQgPSBuZXcgTmFtaW5nQ29udGV4dChlbnYsIHRoaXMubmFtZSk7CisgICAgICAgIGJpbmQobmFtZSwgbmV3Q29udGV4dCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gbmV3Q29udGV4dDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGJpbmRzIGEgbmV3IGNvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgY3JlYXRpb24gb2YgdGhlIHN1YmNvbnRleHQgCisgICAgICogcmVxdWlyZXMgc3BlY2lmaWNhdGlvbiBvZiBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGNyZWF0ZVN1YmNvbnRleHQoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY3JlYXRlU3ViY29udGV4dChuZXcgQ29tcG9zaXRlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdCwgZm9sbG93aW5nIGxpbmtzIGV4Y2VwdCBmb3IgdGhlIHRlcm1pbmFsIAorICAgICAqIGF0b21pYyBjb21wb25lbnQgb2YgdGhlIG5hbWUuIElmIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZSBpcyBub3QgYSAKKyAgICAgKiBsaW5rLCByZXR1cm5zIHRoZSBvYmplY3QgaXRzZWxmLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gbG9vayB1cAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBib3VuZCB0byBuYW1lLCBub3QgZm9sbG93aW5nIHRoZSB0ZXJtaW5hbCBsaW5rIAorICAgICAqIChpZiBhbnkpLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9va3VwTGluayhOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbG9va3VwKG5hbWUsIGZhbHNlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmFtZWQgb2JqZWN0LCBmb2xsb3dpbmcgbGlua3MgZXhjZXB0IGZvciB0aGUgdGVybWluYWwgCisgICAgICogYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgdXAKKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZSwgbm90IGZvbGxvd2luZyB0aGUgdGVybWluYWwgbGluayAKKyAgICAgKiAoaWYgYW55KS4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGxvb2t1cExpbmsoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbG9va3VwKG5ldyBDb21wb3NpdGVOYW1lKG5hbWUpLCBmYWxzZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHBhcnNlciBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVkIGNvbnRleHQuIEluIGEgCisgICAgICogZmVkZXJhdGlvbiBvZiBuYW1lc3BhY2VzLCBkaWZmZXJlbnQgbmFtaW5nIHN5c3RlbXMgd2lsbCBwYXJzZSBuYW1lcyAKKyAgICAgKiBkaWZmZXJlbnRseS4gVGhpcyBtZXRob2QgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGdldCBhIHBhcnNlciBmb3IgCisgICAgICogcGFyc2luZyBuYW1lcyBpbnRvIHRoZWlyIGF0b21pYyBjb21wb25lbnRzIHVzaW5nIHRoZSBuYW1pbmcgY29udmVudGlvbiAKKyAgICAgKiBvZiBhIHBhcnRpY3VsYXIgbmFtaW5nIHN5c3RlbS4gV2l0aGluIGFueSBzaW5nbGUgbmFtaW5nIHN5c3RlbSwgCisgICAgICogTmFtZVBhcnNlciBvYmplY3RzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIG11c3QgYmUgZXF1YWwgKHVzaW5nIHRoZSAKKyAgICAgKiBlcXVhbHMoKSB0ZXN0KS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgcGFyc2VyCisgICAgICogQHJldHVybiBhIG5hbWUgcGFyc2VyIHRoYXQgY2FuIHBhcnNlIGNvbXBvdW5kIG5hbWVzIGludG8gdGhlaXIgYXRvbWljIAorICAgICAqIGNvbXBvbmVudHMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZVBhcnNlciBnZXROYW1lUGFyc2VyKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgd2hpbGUgKCghbmFtZS5pc0VtcHR5KCkpICYmIChuYW1lLmdldCgwKS5sZW5ndGgoKSA9PSAwKSkKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLmdldFN1ZmZpeCgxKTsKKyAgICAgICAgaWYgKG5hbWUuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIG5hbWVQYXJzZXI7CisKKyAgICAgICAgaWYgKG5hbWUuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGJpbmRpbmdzLmdldChuYW1lLmdldCgwKSk7CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29udGV4dCkgeworICAgICAgICAgICAgICAgIHJldHVybiAoKENvbnRleHQpIG9iaikuZ2V0TmFtZVBhcnNlcihuYW1lLmdldFN1ZmZpeCgxKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RDb250ZXh0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQuY29udGV4dEV4cGVjdGVkIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5hbWVQYXJzZXI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgcGFyc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgY29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgcGFyc2VyCisgICAgICogQHJldHVybiBhIG5hbWUgcGFyc2VyIHRoYXQgY2FuIHBhcnNlIGNvbXBvdW5kIG5hbWVzIGludG8gdGhlaXIgYXRvbWljIAorICAgICAqIGNvbXBvbmVudHMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZVBhcnNlciBnZXROYW1lUGFyc2VyKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldE5hbWVQYXJzZXIobmV3IENvbXBvc2l0ZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29tcG9zZXMgdGhlIG5hbWUgb2YgdGhpcyBjb250ZXh0IHdpdGggYSBuYW1lIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dC4KKyAgICAgKiA8cD4KKyAgICAgKiBHaXZlbiBhIG5hbWUgKG5hbWUpIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dCwgYW5kIHRoZSBuYW1lIChwcmVmaXgpIAorICAgICAqIG9mIHRoaXMgY29udGV4dCByZWxhdGl2ZSB0byBvbmUgb2YgaXRzIGFuY2VzdG9ycywgdGhpcyBtZXRob2QgcmV0dXJucyAKKyAgICAgKiB0aGUgY29tcG9zaXRpb24gb2YgdGhlIHR3byBuYW1lcyB1c2luZyB0aGUgc3ludGF4IGFwcHJvcHJpYXRlIGZvciB0aGUgCisgICAgICogbmFtaW5nIHN5c3RlbShzKSBpbnZvbHZlZC4gVGhhdCBpcywgaWYgbmFtZSBuYW1lcyBhbiBvYmplY3QgcmVsYXRpdmUgCisgICAgICogdG8gdGhpcyBjb250ZXh0LCB0aGUgcmVzdWx0IGlzIHRoZSBuYW1lIG9mIHRoZSBzYW1lIG9iamVjdCwgYnV0IAorICAgICAqIHJlbGF0aXZlIHRvIHRoZSBhbmNlc3RvciBjb250ZXh0LiBOb25lIG9mIHRoZSBuYW1lcyBtYXkgYmUgbnVsbC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBhIG5hbWUgcmVsYXRpdmUgdG8gdGhpcyBjb250ZXh0CisgICAgICogQHBhcmFtIHByZWZpeCB0aGUgbmFtZSBvZiB0aGlzIGNvbnRleHQgcmVsYXRpdmUgdG8gb25lIG9mIGl0cyBhbmNlc3RvcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wb3NpdGlvbiBvZiBwcmVmaXggYW5kIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZSBjb21wb3NlTmFtZShOYW1lIG5hbWUsIE5hbWUgcHJlZml4KQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcHJlZml4ID0gKE5hbWUpIHByZWZpeC5jbG9uZSgpOworICAgICAgICByZXR1cm4gcHJlZml4LmFkZEFsbChuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbXBvc2VzIHRoZSBuYW1lIG9mIHRoaXMgY29udGV4dCB3aXRoIGEgbmFtZSByZWxhdGl2ZSB0byB0aGlzIGNvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgYSBuYW1lIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dAorICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIG5hbWUgb2YgdGhpcyBjb250ZXh0IHJlbGF0aXZlIHRvIG9uZSBvZiBpdHMgYW5jZXN0b3JzCisgICAgICogQHJldHVybiB0aGUgY29tcG9zaXRpb24gb2YgcHJlZml4IGFuZCBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjb21wb3NlTmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBwcmVmaXggKyAiLyIgKyBuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldyBlbnZpcm9ubWVudCBwcm9wZXJ0eSB0byB0aGUgZW52aXJvbm1lbnQgb2YgdGhpcyBjb250ZXh0LiBJZiAKKyAgICAgKiB0aGUgcHJvcGVydHkgYWxyZWFkeSBleGlzdHMsIGl0cyB2YWx1ZSBpcyBvdmVyd3JpdHRlbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvcE5hbWUgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHByb3BlcnR5IHRvIGFkZDsgbWF5IG5vdCAKKyAgICAgKiBiZSBudWxsCisgICAgICogQHBhcmFtIHByb3BWYWwgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byBhZGQ7IG1heSBub3QgYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgYWRkVG9FbnZpcm9ubWVudChTdHJpbmcgcHJvcE5hbWUsIE9iamVjdCBwcm9wVmFsKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGVudi5wdXQocHJvcE5hbWUsIHByb3BWYWwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbiBlbnZpcm9ubWVudCBwcm9wZXJ0eSBmcm9tIHRoZSBlbnZpcm9ubWVudCBvZiB0aGlzIGNvbnRleHQuIAorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wTmFtZSB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgcHJvcGVydHkgdG8gcmVtb3ZlOyAKKyAgICAgKiBtYXkgbm90IGJlIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZUZyb21FbnZpcm9ubWVudChTdHJpbmcgcHJvcE5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZW52LnJlbW92ZShwcm9wTmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGVudmlyb25tZW50IGluIGVmZmVjdCBmb3IgdGhpcyBjb250ZXh0LiBTZWUgY2xhc3MgCisgICAgICogZGVzY3JpcHRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiBlbnZpcm9ubWVudCBwcm9wZXJ0aWVzLiAKKyAgICAgKiBUaGUgY2FsbGVyIHNob3VsZCBub3QgbWFrZSBhbnkgY2hhbmdlcyB0byB0aGUgb2JqZWN0IHJldHVybmVkOiB0aGVpciAKKyAgICAgKiBlZmZlY3Qgb24gdGhlIGNvbnRleHQgaXMgdW5kZWZpbmVkLiBUaGUgZW52aXJvbm1lbnQgb2YgdGhpcyBjb250ZXh0IAorICAgICAqIG1heSBiZSBjaGFuZ2VkIHVzaW5nIGFkZFRvRW52aXJvbm1lbnQoKSBhbmQgcmVtb3ZlRnJvbUVudmlyb25tZW50KCkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZW52aXJvbm1lbnQgb2YgdGhpcyBjb250ZXh0OyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRFbnZpcm9ubWVudCgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZW52OworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoaXMgY29udGV4dC4gVGhpcyBtZXRob2QgcmVsZWFzZXMgdGhpcyBjb250ZXh0J3MgcmVzb3VyY2VzIAorICAgICAqIGltbWVkaWF0ZWx5LCBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZW0gdG8gYmUgcmVsZWFzZWQgYXV0b21hdGljYWxseSAKKyAgICAgKiBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuCisgICAgICogVGhpcyBtZXRob2QgaXMgaWRlbXBvdGVudDogaW52b2tpbmcgaXQgb24gYSBjb250ZXh0IHRoYXQgaGFzIGFscmVhZHkgCisgICAgICogYmVlbiBjbG9zZWQgaGFzIG5vIGVmZmVjdC4gSW52b2tpbmcgYW55IG90aGVyIG1ldGhvZCBvbiBhIGNsb3NlZCAKKyAgICAgKiBjb250ZXh0IGlzIG5vdCBhbGxvd2VkLCBhbmQgcmVzdWx0cyBpbiB1bmRlZmluZWQgYmVoYXZpb3VyLgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGVudi5jbGVhcigpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBjb250ZXh0IHdpdGhpbiBpdHMgb3duIG5hbWVzcGFjZS4KKyAgICAgKiA8cD4KKyAgICAgKiBNYW55IG5hbWluZyBzZXJ2aWNlcyBoYXZlIGEgbm90aW9uIG9mIGEgImZ1bGwgbmFtZSIgZm9yIG9iamVjdHMgaW4gCisgICAgICogdGhlaXIgcmVzcGVjdGl2ZSBuYW1lc3BhY2VzLiBGb3IgZXhhbXBsZSwgYW4gTERBUCBlbnRyeSBoYXMgYSAKKyAgICAgKiBkaXN0aW5ndWlzaGVkIG5hbWUsIGFuZCBhIEROUyByZWNvcmQgaGFzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIFRoaXMgCisgICAgICogbWV0aG9kIGFsbG93cyB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHRvIHJldHJpZXZlIHRoaXMgbmFtZS4gVGhlIHN0cmluZyAKKyAgICAgKiByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyBub3QgYSBKTkRJIGNvbXBvc2l0ZSBuYW1lIGFuZCBzaG91bGQgbm90IGJlIAorICAgICAqIHBhc3NlZCBkaXJlY3RseSB0byBjb250ZXh0IG1ldGhvZHMuIEluIG5hbWluZyBzeXN0ZW1zIGZvciB3aGljaCB0aGUgCisgICAgICogbm90aW9uIG9mIGZ1bGwgbmFtZSBkb2VzIG5vdCBtYWtlIHNlbnNlLCAKKyAgICAgKiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhpcyBjb250ZXh0J3MgbmFtZSBpbiBpdHMgb3duIG5hbWVzcGFjZTsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHRoZSBuYW1pbmcgc3lzdGVtIGRvZXMgCisgICAgICogbm90IGhhdmUgdGhlIG5vdGlvbiBvZiBhIGZ1bGwgbmFtZQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZUluTmFtZXNwYWNlKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93ICBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uCisgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJuYW1pbmdDb250ZXh0Lm5vQWJzb2x1dGVOYW1lIikpOworICAgICAgICAvL0ZJWE1FID8KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgdXAKKyAgICAgKiBAcGFyYW0gcmVzb2x2ZUxpbmtzIElmIHRydWUsIHRoZSBsaW5rcyB3aWxsIGJlIHJlc29sdmVkCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGxvb2t1cChOYW1lIG5hbWUsIGJvb2xlYW4gcmVzb2x2ZUxpbmtzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBSZW1vdmluZyBlbXB0eSBwYXJ0cworICAgICAgICB3aGlsZSAoKCFuYW1lLmlzRW1wdHkoKSkgJiYgKG5hbWUuZ2V0KDApLmxlbmd0aCgpID09IDApKQorICAgICAgICAgICAgbmFtZSA9IG5hbWUuZ2V0U3VmZml4KDEpOworICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIElmIG5hbWUgaXMgZW1wdHksIGEgbmV3bHkgYWxsb2NhdGVkIG5hbWluZyBjb250ZXh0IGlzIHJldHVybmVkCisgICAgICAgICAgICByZXR1cm4gbmV3IE5hbWluZ0NvbnRleHQoZW52LCB0aGlzLm5hbWUsIGJpbmRpbmdzKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgTmFtaW5nRW50cnkgZW50cnkgPSAoTmFtaW5nRW50cnkpIGJpbmRpbmdzLmdldChuYW1lLmdldCgwKSk7CisgICAgICAgIAorICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWVOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQubmFtZU5vdEJvdW5kIiwgbmFtZS5nZXQoMCkpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG5hbWUuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgLy8gSWYgdGhlIHNpemUgb2YgdGhlIG5hbWUgaXMgZ3JlYXRlciB0aGF0IDEsIHRoZW4gd2UgZ28gdGhyb3VnaCBhCisgICAgICAgICAgICAvLyBudW1iZXIgb2Ygc3ViY29udGV4dHMuCisgICAgICAgICAgICBpZiAoZW50cnkudHlwZSAhPSBOYW1pbmdFbnRyeS5DT05URVhUKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJuYW1pbmdDb250ZXh0LmNvbnRleHRFeHBlY3RlZCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoKENvbnRleHQpIGVudHJ5LnZhbHVlKS5sb29rdXAobmFtZS5nZXRTdWZmaXgoMSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChyZXNvbHZlTGlua3MpICYmIChlbnRyeS50eXBlID09IE5hbWluZ0VudHJ5LkxJTktfUkVGKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBsaW5rID0gKChMaW5rUmVmKSBlbnRyeS52YWx1ZSkuZ2V0TGlua05hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAobGluay5zdGFydHNXaXRoKCIuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTGluayByZWxhdGl2ZSB0byB0aGlzIGNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvb2t1cChsaW5rLnN1YnN0cmluZygxKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgSW5pdGlhbENvbnRleHQoZW52KSkubG9va3VwKGxpbmspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkudHlwZSA9PSBOYW1pbmdFbnRyeS5SRUZFUkVOQ0UpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gTmFtaW5nTWFuYWdlci5nZXRPYmplY3RJbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgKGVudHJ5LnZhbHVlLCBuYW1lLCB0aGlzLCBlbnYpOworICAgICAgICAgICAgICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gb2JqOworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkudHlwZSA9IE5hbWluZ0VudHJ5LkVOVFJZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmo7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJuYW1pbmdDb250ZXh0LmZhaWxSZXNvbHZpbmdSZWZlcmVuY2UiKSwgZSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdC4gQWxsIGludGVybWVkaWF0ZSBjb250ZXh0cyBhbmQgdGhlIHRhcmdldCAKKyAgICAgKiBjb250ZXh0ICh0aGF0IG5hbWVkIGJ5IGFsbCBidXQgdGVybWluYWwgYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZSkgCisgICAgICogbXVzdCBhbHJlYWR5IGV4aXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBwYXJhbSByZWJpbmQgaWYgdHJ1ZSwgdGhlbiBwZXJmb3JtIGEgcmViaW5kIChpZSwgb3ZlcndyaXRlKQorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIG9iamVjdCBkaWQgbm90IHN1cHBseSBhbGwgCisgICAgICogbWFuZGF0b3J5IGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBiaW5kKE5hbWUgbmFtZSwgT2JqZWN0IG9iaiwgYm9vbGVhbiByZWJpbmQpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgY2hlY2tXcml0YWJsZSgpOworICAgICAgICAKKyAgICAgICAgd2hpbGUgKCghbmFtZS5pc0VtcHR5KCkpICYmIChuYW1lLmdldCgwKS5sZW5ndGgoKSA9PSAwKSkKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLmdldFN1ZmZpeCgxKTsKKyAgICAgICAgaWYgKG5hbWUuaXNFbXB0eSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQuaW52YWxpZE5hbWUiKSk7CisgICAgICAgIAorICAgICAgICBOYW1pbmdFbnRyeSBlbnRyeSA9IChOYW1pbmdFbnRyeSkgYmluZGluZ3MuZ2V0KG5hbWUuZ2V0KDApKTsKKyAgICAgICAgCisgICAgICAgIGlmIChuYW1lLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWVOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJuYW1pbmdDb250ZXh0Lm5hbWVOb3RCb3VuZCIsIG5hbWUuZ2V0KDApKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZW50cnkudHlwZSA9PSBOYW1pbmdFbnRyeS5DT05URVhUKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlYmluZCkgeworICAgICAgICAgICAgICAgICAgICAoKENvbnRleHQpIGVudHJ5LnZhbHVlKS5yZWJpbmQobmFtZS5nZXRTdWZmaXgoMSksIG9iaik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKChDb250ZXh0KSBlbnRyeS52YWx1ZSkuYmluZChuYW1lLmdldFN1ZmZpeCgxKSwgb2JqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibmFtaW5nQ29udGV4dC5jb250ZXh0RXhwZWN0ZWQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKCFyZWJpbmQpICYmIChlbnRyeSAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQuYWxyZWFkeUJvdW5kIiwgbmFtZS5nZXQoMCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gR2V0dGluZyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGFuZCB3cmFwcGluZyBpdCB3aXRoaW4gYSBuZXcKKyAgICAgICAgICAgICAgICAvLyBOYW1pbmdFbnRyeQorICAgICAgICAgICAgICAgIE9iamVjdCB0b0JpbmQgPSAKKyAgICAgICAgICAgICAgICAgICAgTmFtaW5nTWFuYWdlci5nZXRTdGF0ZVRvQmluZChvYmosIG5hbWUsIHRoaXMsIGVudik7CisgICAgICAgICAgICAgICAgaWYgKHRvQmluZCBpbnN0YW5jZW9mIENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBuZXcgTmFtaW5nRW50cnkobmFtZS5nZXQoMCksIHRvQmluZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWluZ0VudHJ5LkNPTlRFWFQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9CaW5kIGluc3RhbmNlb2YgTGlua1JlZikgeworICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IG5ldyBOYW1pbmdFbnRyeShuYW1lLmdldCgwKSwgdG9CaW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nRW50cnkuTElOS19SRUYpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9CaW5kIGluc3RhbmNlb2YgUmVmZXJlbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV3IE5hbWluZ0VudHJ5KG5hbWUuZ2V0KDApLCB0b0JpbmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1pbmdFbnRyeS5SRUZFUkVOQ0UpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9CaW5kIGluc3RhbmNlb2YgUmVmZXJlbmNlYWJsZSkgeworICAgICAgICAgICAgICAgICAgICB0b0JpbmQgPSAoKFJlZmVyZW5jZWFibGUpIHRvQmluZCkuZ2V0UmVmZXJlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV3IE5hbWluZ0VudHJ5KG5hbWUuZ2V0KDApLCB0b0JpbmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1pbmdFbnRyeS5SRUZFUkVOQ0UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV3IE5hbWluZ0VudHJ5KG5hbWUuZ2V0KDApLCB0b0JpbmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1pbmdFbnRyeS5FTlRSWSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJpbmRpbmdzLnB1dChuYW1lLmdldCgwKSwgZW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHdyaXRpbmcgaXMgYWxsb3dlZCBvbiB0aGlzIGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNXcml0YWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIENvbnRleHRBY2Nlc3NDb250cm9sbGVyLmlzV3JpdGFibGUobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaHJvd3MgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIENvbnRleHQgaXMgbm90IHdyaXRhYmxlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrV3JpdGFibGUoKSAKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaXNXcml0YWJsZSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbihzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQucmVhZE9ubHkiKSk7CisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9OYW1pbmdDb250ZXh0QmluZGluZ3NFbnVtZXJhdGlvbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9OYW1pbmdDb250ZXh0QmluZGluZ3NFbnVtZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YWRiMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWluZ0NvbnRleHRCaW5kaW5nc0VudW1lcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgamF2YXgubmFtaW5nLkJpbmRpbmc7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbXBvc2l0ZU5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0VudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CisKKy8qKgorICogTmFtaW5nIGVudW1lcmF0aW9uIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIE5hbWluZ0NvbnRleHRCaW5kaW5nc0VudW1lcmF0aW9uIAorICAgIGltcGxlbWVudHMgTmFtaW5nRW51bWVyYXRpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgcHVibGljIE5hbWluZ0NvbnRleHRCaW5kaW5nc0VudW1lcmF0aW9uKEl0ZXJhdG9yIGVudHJpZXMsIENvbnRleHQgY3R4KSB7CisgICAgCWl0ZXJhdG9yID0gZW50cmllczsKKyAgICAgICAgdGhpcy5jdHggPSBjdHg7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFVuZGVybHlpbmcgZW51bWVyYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIEl0ZXJhdG9yIGl0ZXJhdG9yOworCisgICAgCisgICAgLyoqCisgICAgICogVGhlIGNvbnRleHQgZm9yIHdoaWNoIHRoaXMgZW51bWVyYXRpb24gaXMgYmVpbmcgZ2VuZXJhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgQ29udGV4dCBjdHg7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgZW51bWVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBuZXh0KCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXh0RWxlbWVudEludGVybmFsKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBtb3JlIGVsZW1lbnRzIGluIHRoZSBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhpcyBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgeworICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOworICAgIH0KKworCisgICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXh0RWxlbWVudEludGVybmFsKCk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBPYmplY3QgbmV4dEVsZW1lbnRJbnRlcm5hbCgpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBOYW1pbmdFbnRyeSBlbnRyeSA9IChOYW1pbmdFbnRyeSkgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhlIGVudHJ5IGlzIGEgcmVmZXJlbmNlLCByZXNvbHZlIGl0CisgICAgICAgIGlmIChlbnRyeS50eXBlID09IE5hbWluZ0VudHJ5LlJFRkVSRU5DRQorICAgICAgICAgICAgICAgIHx8IGVudHJ5LnR5cGUgPT0gTmFtaW5nRW50cnkuTElOS19SRUYpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gQSBsb29rdXAgd2lsbCByZXNvbHZlIHRoZSBlbnRyeQorICAgICAgICAgICAgICAgIGN0eC5sb29rdXAobmV3IENvbXBvc2l0ZU5hbWUoZW50cnkubmFtZSkpOworICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBOYW1pbmdFeGNlcHRpb24gbmUgPSBuZXcgTmFtaW5nRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBuZS5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBuZXcgQmluZGluZyhlbnRyeS5uYW1lLCBlbnRyeS52YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS52YWx1ZSwgdHJ1ZSk7CisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9OYW1pbmdDb250ZXh0RW51bWVyYXRpb24uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTmFtaW5nQ29udGV4dEVudW1lcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5YmI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTmFtaW5nQ29udGV4dEVudW1lcmF0aW9uLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZUNsYXNzUGFpcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKKworLyoqCisgKiBOYW1pbmcgZW51bWVyYXRpb24gaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgTmFtaW5nQ29udGV4dEVudW1lcmF0aW9uIAorICAgIGltcGxlbWVudHMgTmFtaW5nRW51bWVyYXRpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgcHVibGljIE5hbWluZ0NvbnRleHRFbnVtZXJhdGlvbihJdGVyYXRvciBlbnRyaWVzKSB7CisgICAgCWl0ZXJhdG9yID0gZW50cmllczsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBVbmRlcmx5aW5nIGVudW1lcmF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBJdGVyYXRvciBpdGVyYXRvcjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IG5leHQoKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5leHRFbGVtZW50KCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBtb3JlIGVsZW1lbnRzIGluIHRoZSBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhpcyBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgeworICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOworICAgIH0KKworCisgICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKKyAgICAgICAgTmFtaW5nRW50cnkgZW50cnkgPSAoTmFtaW5nRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBOYW1lQ2xhc3NQYWlyKGVudHJ5Lm5hbWUsIGVudHJ5LnZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWluZ0VudHJ5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWluZ0VudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjYWVmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTmFtaW5nRW50cnkuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZzsKKworCisvKioKKyAqIFJlcHJlc2VudHMgYSBiaW5kaW5nIGluIGEgTmFtaW5nQ29udGV4dC4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBOYW1pbmdFbnRyeSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRSWSA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElOS19SRUYgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFRkVSRU5DRSA9IDI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVYVCA9IDEwOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgcHVibGljIE5hbWluZ0VudHJ5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIGludCB0eXBlKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBpbnN0YW5jZSB2YXJpYWJsZSBpcyB1c2VkIHRvIGF2b2lkIHVuc2luZyBSVFRJIHdoZW4gZG9pbmcKKyAgICAgKiBsb29rdXBzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgdHlwZTsKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgcHVibGljIE9iamVjdCB2YWx1ZTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9iamVjdCBNZXRob2RzCisKKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICgob2JqICE9IG51bGwpICYmIChvYmogaW5zdGFuY2VvZiBOYW1pbmdFbnRyeSkpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lLmVxdWFscygoKE5hbWluZ0VudHJ5KSBvYmopLm5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gbmFtZS5oYXNoQ29kZSgpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWluZ1NlcnZpY2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTmFtaW5nU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTM0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWluZ1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nOworCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25Ccm9hZGNhc3RlclN1cHBvcnQ7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblJlZ2lzdHJhdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZUNoYW5nZU5vdGlmaWNhdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbjsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTmFtaW5nU2VydmljZSBKTVggTUJlYW4uCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnJlbW1AYXBhY2hlLm9yZyI+UmVteSBNYXVjaGVyYXQ8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIE5hbWluZ1NlcnZpY2UKKyAgICBleHRlbmRzIE5vdGlmaWNhdGlvbkJyb2FkY2FzdGVyU3VwcG9ydAorICAgIGltcGxlbWVudHMgTmFtaW5nU2VydmljZU1CZWFuLCBNQmVhblJlZ2lzdHJhdGlvbiB7CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogU3RhdHVzIG9mIHRoZSBTbGlkZSBkb21haW4uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc3RhdGUgPSBTVE9QUEVEOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIE5vdGlmaWNhdGlvbiBzZXF1ZW5jZSBudW1iZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHNlcXVlbmNlTnVtYmVyID0gMDsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBPbGQgVVJMIHBhY2thZ2VzIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG9sZFVybFZhbHVlID0gIiI7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogT2xkIGluaXRpYWwgY29udGV4dCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBvbGRJY1ZhbHVlID0gIiI7CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNQmVhblJlZ2lzdHJhdGlvbiBNZXRob2RzCisgICAgCisgICAgCisgICAgcHVibGljIE9iamVjdE5hbWUgcHJlUmVnaXN0ZXIoTUJlYW5TZXJ2ZXIgc2VydmVyLCBPYmplY3ROYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IE9iamVjdE5hbWUoT0JKRUNUX05BTUUpOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBwb3N0UmVnaXN0ZXIoQm9vbGVhbiByZWdpc3RyYXRpb25Eb25lKSB7CisgICAgICAgIGlmICghcmVnaXN0cmF0aW9uRG9uZS5ib29sZWFuVmFsdWUoKSkKKyAgICAgICAgICAgIGRlc3Ryb3koKTsKKyAgICB9CisgICAgCisgICAgCisgICAgcHVibGljIHZvaWQgcHJlRGVyZWdpc3RlcigpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBwb3N0RGVyZWdpc3RlcigpIHsKKyAgICAgICAgZGVzdHJveSgpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTbGlkZU1CZWFuIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXRydW5zIHRoZSBDYXRhbGluYSBjb21wb25lbnQgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBOQU1FOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFN0YXRlKCkgeworICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGVTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZXNbc3RhdGVdOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGUgc2VydmxldCBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBudWxsOworICAgICAgICAKKyAgICAgICAgaWYgKHN0YXRlICE9IFNUT1BQRUQpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICBzdGF0ZSA9IFNUQVJUSU5HOworICAgICAgICAKKyAgICAgICAgLy8gTm90aWZ5aW5nIHRoZSBNQkVhbiBzZXJ2ZXIgdGhhdCB3ZSdyZSBzdGFydGluZworICAgICAgICAKKyAgICAgICAgbm90aWZpY2F0aW9uID0gbmV3IEF0dHJpYnV0ZUNoYW5nZU5vdGlmaWNhdGlvbgorICAgICAgICAgICAgKHRoaXMsIHNlcXVlbmNlTnVtYmVyKyssIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCAKKyAgICAgICAgICAgICAiU3RhcnRpbmcgIiArIE5BTUUsICJTdGF0ZSIsICJqYXZhLmxhbmcuSW50ZWdlciIsIAorICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKFNUT1BQRUQpLCBuZXcgSW50ZWdlcihTVEFSVElORykpOworICAgICAgICBzZW5kTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAib3JnLmFwYWNoZS5uYW1pbmciOworICAgICAgICAgICAgU3RyaW5nIG9sZFZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KENvbnRleHQuVVJMX1BLR19QUkVGSVhFUyk7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG9sZFVybFZhbHVlID0gb2xkVmFsdWU7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBvbGRWYWx1ZSArICI6IiArIHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KENvbnRleHQuVVJMX1BLR19QUkVGSVhFUywgdmFsdWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBvbGRWYWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShDb250ZXh0LklOSVRJQUxfQ09OVEVYVF9GQUNUT1JZKTsKKyAgICAgICAgICAgIGlmICgob2xkVmFsdWUgIT0gbnVsbCkgJiYgKG9sZFZhbHVlLmxlbmd0aCgpID4gMCkpIHsKKyAgICAgICAgICAgICAgICBvbGRJY1ZhbHVlID0gb2xkVmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShDb250ZXh0LklOSVRJQUxfQ09OVEVYVF9GQUNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuUGFja2FnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmphdmEuamF2YVVSTENvbnRleHRGYWN0b3J5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHN0YXRlID0gU1RPUFBFRDsKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbiA9IG5ldyBBdHRyaWJ1dGVDaGFuZ2VOb3RpZmljYXRpb24KKyAgICAgICAgICAgICAgICAodGhpcywgc2VxdWVuY2VOdW1iZXIrKywgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIAorICAgICAgICAgICAgICAgICAiU3RvcHBlZCAiICsgTkFNRSwgIlN0YXRlIiwgImphdmEubGFuZy5JbnRlZ2VyIiwgCisgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKFNUQVJUSU5HKSwgbmV3IEludGVnZXIoU1RPUFBFRCkpOworICAgICAgICAgICAgc2VuZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzdGF0ZSA9IFNUQVJURUQ7CisgICAgICAgIG5vdGlmaWNhdGlvbiA9IG5ldyBBdHRyaWJ1dGVDaGFuZ2VOb3RpZmljYXRpb24KKyAgICAgICAgICAgICh0aGlzLCBzZXF1ZW5jZU51bWJlcisrLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgCisgICAgICAgICAgICAgIlN0YXJ0ZWQgIiArIE5BTUUsICJTdGF0ZSIsICJqYXZhLmxhbmcuSW50ZWdlciIsIAorICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKFNUQVJUSU5HKSwgbmV3IEludGVnZXIoU1RBUlRFRCkpOworICAgICAgICBzZW5kTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBzZXJ2bGV0IGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICAKKyAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IG51bGw7CisgICAgICAgIAorICAgICAgICBpZiAoc3RhdGUgIT0gU1RBUlRFRCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIHN0YXRlID0gU1RPUFBJTkc7CisgICAgICAgIAorICAgICAgICBub3RpZmljYXRpb24gPSBuZXcgQXR0cmlidXRlQ2hhbmdlTm90aWZpY2F0aW9uCisgICAgICAgICAgICAodGhpcywgc2VxdWVuY2VOdW1iZXIrKywgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIAorICAgICAgICAgICAgICJTdG9wcGluZyAiICsgTkFNRSwgIlN0YXRlIiwgImphdmEubGFuZy5JbnRlZ2VyIiwgCisgICAgICAgICAgICAgbmV3IEludGVnZXIoU1RBUlRFRCksIG5ldyBJbnRlZ2VyKFNUT1BQSU5HKSk7CisgICAgICAgIHNlbmROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShDb250ZXh0LlVSTF9QS0dfUFJFRklYRVMsIG9sZFVybFZhbHVlKTsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShDb250ZXh0LklOSVRJQUxfQ09OVEVYVF9GQUNUT1JZLCBvbGRJY1ZhbHVlKTsKKyAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBGSVhNRQorICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzdGF0ZSA9IFNUT1BQRUQ7CisgICAgICAgIAorICAgICAgICBub3RpZmljYXRpb24gPSBuZXcgQXR0cmlidXRlQ2hhbmdlTm90aWZpY2F0aW9uCisgICAgICAgICAgICAodGhpcywgc2VxdWVuY2VOdW1iZXIrKywgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIAorICAgICAgICAgICAgICJTdG9wcGVkICIgKyBOQU1FLCAiU3RhdGUiLCAiamF2YS5sYW5nLkludGVnZXIiLCAKKyAgICAgICAgICAgICBuZXcgSW50ZWdlcihTVE9QUElORyksIG5ldyBJbnRlZ2VyKFNUT1BQRUQpKTsKKyAgICAgICAgc2VuZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogRGVzdHJveSBzZXJ2bGV0IGNvbnRhaW5lciAoaWYgYW55IGlzIHJ1bm5pbmcpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIAorICAgICAgICBpZiAoZ2V0U3RhdGUoKSAhPSBTVE9QUEVEKQorICAgICAgICAgICAgc3RvcCgpOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWluZ1NlcnZpY2VNQmVhbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9OYW1pbmdTZXJ2aWNlTUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzZjOGE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9OYW1pbmdTZXJ2aWNlTUJlYW4uamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmc7CisKKy8qKgorICogTmFtaW5nIE1CZWFuIGludGVyZmFjZS4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cmVtbUBhcGFjaGUub3JnIj5SZW15IE1hdWNoZXJhdDwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIE5hbWluZ1NlcnZpY2VNQmVhbiB7CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvbnN0YW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHN0YXRlcyA9IAorICAgIHsiU3RvcHBlZCIsICJTdG9wcGluZyIsICJTdGFydGluZyIsICJTdGFydGVkIn07CisgICAgCisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUFBFRCAgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1BQSU5HID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVElORyA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRFRCAgPSAzOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENvbXBvbmVudCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiQXBhY2hlIEpOREkgTmFtaW5nIFNlcnZpY2UiOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIE9iamVjdCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9OQU1FID0gIjpzZXJ2aWNlPU5hbWluZyI7CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEludGVyZmFjZSBNZXRob2RzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0cnVucyB0aGUgSk5ESSBjb21wb25lbnQgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFN0YXRlKCk7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0ZVN0cmluZygpOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBzZXJ2bGV0IGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpCisgICAgICAgIHRocm93cyBFeGNlcHRpb247CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgc2VydmxldCBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIERlc3Ryb3kgc2VydmxldCBjb250YWluZXIgKGlmIGFueSBpcyBydW5uaW5nKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCk7CisgICAgCisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL1Jlc291cmNlRW52UmVmLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL1Jlc291cmNlRW52UmVmLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjMTg4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvUmVzb3VyY2VFbnZSZWYuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZzsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZlcmVuY2U7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHJlZmVyZW5jZSBhZGRyZXNzIHRvIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VFbnZSZWYKKyAgICBleHRlbmRzIFJlZmVyZW5jZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGZhY3RvcnkgZm9yIHRoaXMgcmVmZXJlbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRkFDVE9SWSA9IAorICAgICAgICBvcmcuYXBhY2hlLm5hbWluZy5mYWN0b3J5LkNvbnN0YW50cy5ERUZBVUxUX1JFU09VUkNFX0VOVl9GQUNUT1JZOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogUmVzb3VyY2UgZW52IHJlZmVyZW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIFR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VFbnZSZWYoU3RyaW5nIHJlc291cmNlVHlwZSkgeworICAgICAgICBzdXBlcihyZXNvdXJjZVR5cGUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVzb3VyY2UgZW52IHJlZmVyZW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIFR5cGUKKyAgICAgKiBAcGFyYW0gZmFjdG9yeSBUaGUgZmFjdG9yeSBjbGFzcworICAgICAqIEBwYXJhbSBmYWN0b3J5TG9jYXRpb24gVGhlIGZhY3RvcnkgbG9jYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VFbnZSZWYoU3RyaW5nIHJlc291cmNlVHlwZSwgU3RyaW5nIGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmYWN0b3J5TG9jYXRpb24pIHsKKyAgICAgICAgc3VwZXIocmVzb3VyY2VUeXBlLCBmYWN0b3J5LCBmYWN0b3J5TG9jYXRpb24pOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWZlcmVuY2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGZhY3Rvcnkgb2YgdGhlIG9iamVjdCB0byB3aGljaCB0aGlzIAorICAgICAqIHJlZmVyZW5jZSByZWZlcnMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGYWN0b3J5Q2xhc3NOYW1lKCkgeworICAgICAgICBTdHJpbmcgZmFjdG9yeSA9IHN1cGVyLmdldEZhY3RvcnlDbGFzc05hbWUoKTsKKyAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KENvbnRleHQuT0JKRUNUX0ZBQ1RPUklFUyk7CisgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBERUZBVUxUX0ZBQ1RPUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvUmVzb3VyY2VMaW5rUmVmLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL1Jlc291cmNlTGlua1JlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODc5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL1Jlc291cmNlTGlua1JlZi5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZzsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZlcmVuY2U7CitpbXBvcnQgamF2YXgubmFtaW5nLlN0cmluZ1JlZkFkZHI7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHJlZmVyZW5jZSBhZGRyZXNzIHRvIGEgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VMaW5rUmVmCisgICAgZXh0ZW5kcyBSZWZlcmVuY2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBmYWN0b3J5IGZvciB0aGlzIHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZBQ1RPUlkgPSAKKyAgICAgICAgb3JnLmFwYWNoZS5uYW1pbmcuZmFjdG9yeS5Db25zdGFudHMuREVGQVVMVF9SRVNPVVJDRV9MSU5LX0ZBQ1RPUlk7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aW9uIGFkZHJlc3MgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9CQUxOQU1FID0gImdsb2JhbE5hbWUiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogUmVzb3VyY2VMaW5rIFJlZmVyZW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VDbGFzcyBSZXNvdXJjZSBjbGFzcworICAgICAqIEBwYXJhbSBnbG9iYWxOYW1lIEdsb2JhbCBuYW1lCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlTGlua1JlZihTdHJpbmcgcmVzb3VyY2VDbGFzcywgU3RyaW5nIGdsb2JhbE5hbWUpIHsKKyAgICAgICAgdGhpcyhyZXNvdXJjZUNsYXNzLCBnbG9iYWxOYW1lLCBudWxsLCBudWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlc291cmNlTGluayBSZWZlcmVuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIHJlc291cmNlQ2xhc3MgUmVzb3VyY2UgY2xhc3MKKyAgICAgKiBAcGFyYW0gZ2xvYmFsTmFtZSBHbG9iYWwgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZUxpbmtSZWYoU3RyaW5nIHJlc291cmNlQ2xhc3MsIFN0cmluZyBnbG9iYWxOYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmYWN0b3J5LCBTdHJpbmcgZmFjdG9yeUxvY2F0aW9uKSB7CisgICAgICAgIHN1cGVyKHJlc291cmNlQ2xhc3MsIGZhY3RvcnksIGZhY3RvcnlMb2NhdGlvbik7CisgICAgICAgIFN0cmluZ1JlZkFkZHIgcmVmQWRkciA9IG51bGw7CisgICAgICAgIGlmIChnbG9iYWxOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlZkFkZHIgPSBuZXcgU3RyaW5nUmVmQWRkcihHTE9CQUxOQU1FLCBnbG9iYWxOYW1lKTsKKyAgICAgICAgICAgIGFkZChyZWZBZGRyKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWZlcmVuY2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGZhY3Rvcnkgb2YgdGhlIG9iamVjdCB0byB3aGljaCB0aGlzIAorICAgICAqIHJlZmVyZW5jZSByZWZlcnMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGYWN0b3J5Q2xhc3NOYW1lKCkgeworICAgICAgICBTdHJpbmcgZmFjdG9yeSA9IHN1cGVyLmdldEZhY3RvcnlDbGFzc05hbWUoKTsKKyAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KENvbnRleHQuT0JKRUNUX0ZBQ1RPUklFUyk7CisgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBERUZBVUxUX0ZBQ1RPUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvUmVzb3VyY2VSZWYuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvUmVzb3VyY2VSZWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDU2ZmRlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9SZXNvdXJjZVJlZi5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZzsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZBZGRyOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZlcmVuY2U7CitpbXBvcnQgamF2YXgubmFtaW5nLlN0cmluZ1JlZkFkZHI7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHJlZmVyZW5jZSBhZGRyZXNzIHRvIGEgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VSZWYKKyAgICBleHRlbmRzIFJlZmVyZW5jZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGZhY3RvcnkgZm9yIHRoaXMgcmVmZXJlbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRkFDVE9SWSA9IAorICAgICAgICBvcmcuYXBhY2hlLm5hbWluZy5mYWN0b3J5LkNvbnN0YW50cy5ERUZBVUxUX1JFU09VUkNFX0ZBQ1RPUlk7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aW9uIGFkZHJlc3MgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7CisKKworICAgIC8qKgorICAgICAqIFNjb3BlIGFkZHJlc3MgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRSA9ICJzY29wZSI7CisKKworICAgIC8qKgorICAgICAqIEF1dGggYWRkcmVzcyB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEggPSAiYXV0aCI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBSZXNvdXJjZSBSZWZlcmVuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIHJlc291cmNlQ2xhc3MgUmVzb3VyY2UgY2xhc3MKKyAgICAgKiBAcGFyYW0gc2NvcGUgUmVzb3VyY2Ugc2NvcGUKKyAgICAgKiBAcGFyYW0gYXV0aCBSZXNvdXJjZSBhdXRoZXRpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlUmVmKFN0cmluZyByZXNvdXJjZUNsYXNzLCBTdHJpbmcgZGVzY3JpcHRpb24sIAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2NvcGUsIFN0cmluZyBhdXRoKSB7CisgICAgICAgIHRoaXMocmVzb3VyY2VDbGFzcywgZGVzY3JpcHRpb24sIHNjb3BlLCBhdXRoLCBudWxsLCBudWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlc291cmNlIFJlZmVyZW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VDbGFzcyBSZXNvdXJjZSBjbGFzcworICAgICAqIEBwYXJhbSBzY29wZSBSZXNvdXJjZSBzY29wZQorICAgICAqIEBwYXJhbSBhdXRoIFJlc291cmNlIGF1dGhldGljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VSZWYoU3RyaW5nIHJlc291cmNlQ2xhc3MsIFN0cmluZyBkZXNjcmlwdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzY29wZSwgU3RyaW5nIGF1dGgsIFN0cmluZyBmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmFjdG9yeUxvY2F0aW9uKSB7CisgICAgICAgIHN1cGVyKHJlc291cmNlQ2xhc3MsIGZhY3RvcnksIGZhY3RvcnlMb2NhdGlvbik7CisgICAgICAgIFN0cmluZ1JlZkFkZHIgcmVmQWRkciA9IG51bGw7CisgICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICByZWZBZGRyID0gbmV3IFN0cmluZ1JlZkFkZHIoREVTQ1JJUFRJT04sIGRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIGFkZChyZWZBZGRyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2NvcGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVmQWRkciA9IG5ldyBTdHJpbmdSZWZBZGRyKFNDT1BFLCBzY29wZSk7CisgICAgICAgICAgICBhZGQocmVmQWRkcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF1dGggIT0gbnVsbCkgeworICAgICAgICAgICAgcmVmQWRkciA9IG5ldyBTdHJpbmdSZWZBZGRyKEFVVEgsIGF1dGgpOworICAgICAgICAgICAgYWRkKHJlZkFkZHIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlZmVyZW5jZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgZmFjdG9yeSBvZiB0aGUgb2JqZWN0IHRvIHdoaWNoIHRoaXMgCisgICAgICogcmVmZXJlbmNlIHJlZmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlDbGFzc05hbWUoKSB7CisgICAgICAgIFN0cmluZyBmYWN0b3J5ID0gc3VwZXIuZ2V0RmFjdG9yeUNsYXNzTmFtZSgpOworICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZhY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQ29udGV4dC5PQkpFQ1RfRkFDVE9SSUVTKTsKKyAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfRkFDVE9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZW5kZXJpbmcgb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJSZXNvdXJjZVJlZlsiKTsKKyAgICAgICAgc2IuYXBwZW5kKCJjbGFzc05hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRDbGFzc05hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLGZhY3RvcnlDbGFzc0xvY2F0aW9uPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0RmFjdG9yeUNsYXNzTG9jYXRpb24oKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLGZhY3RvcnlDbGFzc05hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRGYWN0b3J5Q2xhc3NOYW1lKCkpOworICAgICAgICBFbnVtZXJhdGlvbiByZWZBZGRycyA9IGdldEFsbCgpOworICAgICAgICB3aGlsZSAocmVmQWRkcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFJlZkFkZHIgcmVmQWRkciA9IChSZWZBZGRyKSByZWZBZGRycy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIse3R5cGU9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQocmVmQWRkci5nZXRUeXBlKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIsY29udGVudD0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChyZWZBZGRyLmdldENvbnRlbnQoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIn0iKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9TZWxlY3RvckNvbnRleHQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvU2VsZWN0b3JDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0Y2E2OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvU2VsZWN0b3JDb250ZXh0LmphdmEKQEAgLTAsMCArMSw2OTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nOworCitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZVBhcnNlcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKKworLyoqCisgKiBDYXRhbGluYSBKTkRJIENvbnRleHQgaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2VsZWN0b3JDb250ZXh0IGltcGxlbWVudHMgQ29udGV4dCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBOYW1lc3BhY2UgVVJMLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHByZWZpeCA9ICJqYXZhOiI7CisKKworICAgIC8qKgorICAgICAqIE5hbWVzcGFjZSBVUkwgbGVuZ3RoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZWZpeExlbmd0aCA9IHByZWZpeC5sZW5ndGgoKTsKKworCisgICAgLyoqCisgICAgICogSW5pdGlhbCBjb250ZXh0IHByZWZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ19QUkVGSVggPSAiSUNfIjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhIENhdGFsaW5hIHNlbGVjdG9yIGNvbnRleHQgdXNpbmcgdGhlIGdpdmVuIGVudmlyb25tZW50LgorICAgICAqLworICAgIHB1YmxpYyBTZWxlY3RvckNvbnRleHQoSGFzaHRhYmxlIGVudikgeworICAgICAgICB0aGlzLmVudiA9IGVudjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhIENhdGFsaW5hIHNlbGVjdG9yIGNvbnRleHQgdXNpbmcgdGhlIGdpdmVuIGVudmlyb25tZW50LgorICAgICAqLworICAgIHB1YmxpYyBTZWxlY3RvckNvbnRleHQoSGFzaHRhYmxlIGVudiwgYm9vbGVhbiBpbml0aWFsQ29udGV4dCkgeworICAgICAgICB0aGlzKGVudik7CisgICAgICAgIHRoaXMuaW5pdGlhbENvbnRleHQgPSBpbml0aWFsQ29udGV4dDsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBFbnZpcm9ubWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGVudjsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ01hbmFnZXIgc20gPSBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IGZvciBhbiBpbml0aWFsIGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbENvbnRleHQgPSBmYWxzZTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnRleHQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdC4gSWYgbmFtZSBpcyBlbXB0eSwgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSAKKyAgICAgKiBvZiB0aGlzIGNvbnRleHQgKHdoaWNoIHJlcHJlc2VudHMgdGhlIHNhbWUgbmFtaW5nIGNvbnRleHQgYXMgdGhpcyAKKyAgICAgKiBjb250ZXh0LCBidXQgaXRzIGVudmlyb25tZW50IG1heSBiZSBtb2RpZmllZCBpbmRlcGVuZGVudGx5IGFuZCBpdCBtYXkgCisgICAgICogYmUgYWNjZXNzZWQgY29uY3VycmVudGx5KS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgdXAKKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9va3VwKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFN0cmlwIHRoZSBVUkwgaGVhZGVyCisgICAgICAgIC8vIEZpbmQgdGhlIGFwcHJvcHJpYXRlIE5hbWluZ0NvbnRleHQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGJpbmRpbmdzCisgICAgICAgIC8vIEV4ZWN1dGUgdGhlIGxvb2t1cCBvbiB0aGF0IGNvbnRleHQKKyAgICAgICAgcmV0dXJuIGdldEJvdW5kQ29udGV4dCgpLmxvb2t1cChwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1lZCBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGxvb2t1cChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFN0cmlwIHRoZSBVUkwgaGVhZGVyCisgICAgICAgIC8vIEZpbmQgdGhlIGFwcHJvcHJpYXRlIE5hbWluZ0NvbnRleHQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGJpbmRpbmdzCisgICAgICAgIC8vIEV4ZWN1dGUgdGhlIGxvb2t1cCBvbiB0aGF0IGNvbnRleHQKKyAgICAgICAgcmV0dXJuIGdldEJvdW5kQ29udGV4dCgpLmxvb2t1cChwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdC4gQWxsIGludGVybWVkaWF0ZSBjb250ZXh0cyBhbmQgdGhlIHRhcmdldCAKKyAgICAgKiBjb250ZXh0ICh0aGF0IG5hbWVkIGJ5IGFsbCBidXQgdGVybWluYWwgYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZSkgCisgICAgICogbXVzdCBhbHJlYWR5IGV4aXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIG9iamVjdCBkaWQgbm90IHN1cHBseSBhbGwgCisgICAgICogbWFuZGF0b3J5IGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kKE5hbWUgbmFtZSwgT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGdldEJvdW5kQ29udGV4dCgpLmJpbmQocGFyc2VOYW1lKG5hbWUpLCBvYmopOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBvYmplY3QgZGlkIG5vdCBzdXBwbHkgYWxsIAorICAgICAqIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGdldEJvdW5kQ29udGV4dCgpLmJpbmQocGFyc2VOYW1lKG5hbWUpLCBvYmopOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdCwgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGJpbmRpbmcuIEFsbCAKKyAgICAgKiBpbnRlcm1lZGlhdGUgY29udGV4dHMgYW5kIHRoZSB0YXJnZXQgY29udGV4dCAodGhhdCBuYW1lZCBieSBhbGwgYnV0IAorICAgICAqIHRlcm1pbmFsIGF0b21pYyBjb21wb25lbnQgb2YgdGhlIG5hbWUpIG11c3QgYWxyZWFkeSBleGlzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgb2JqZWN0IGlzIGEgRGlyQ29udGV4dCwgYW55IGV4aXN0aW5nIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIAorICAgICAqIHRoZSBuYW1lIGFyZSByZXBsYWNlZCB3aXRoIHRob3NlIG9mIHRoZSBvYmplY3QuIE90aGVyd2lzZSwgYW55IAorICAgICAqIGV4aXN0aW5nIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lIHJlbWFpbiB1bmNoYW5nZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBvYmplY3QgZGlkIG5vdCBzdXBwbHkgYWxsIAorICAgICAqIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmViaW5kKE5hbWUgbmFtZSwgT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGdldEJvdW5kQ29udGV4dCgpLnJlYmluZChwYXJzZU5hbWUobmFtZSksIG9iaik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5hbWUgdG8gYW4gb2JqZWN0LCBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgYmluZGluZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIG9iamVjdCBkaWQgbm90IHN1cHBseSBhbGwgCisgICAgICogbWFuZGF0b3J5IGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWJpbmQoU3RyaW5nIG5hbWUsIE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBnZXRCb3VuZENvbnRleHQoKS5yZWJpbmQocGFyc2VOYW1lKG5hbWUpLCBvYmopOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVW5iaW5kcyB0aGUgbmFtZWQgb2JqZWN0LiBSZW1vdmVzIHRoZSB0ZXJtaW5hbCBhdG9taWMgbmFtZSBpbiBuYW1lIAorICAgICAqIGZyb20gdGhlIHRhcmdldCBjb250ZXh0LS10aGF0IG5hbWVkIGJ5IGFsbCBidXQgdGhlIHRlcm1pbmFsIGF0b21pYyAKKyAgICAgKiBwYXJ0IG9mIG5hbWUuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgaWRlbXBvdGVudC4gSXQgc3VjY2VlZHMgZXZlbiBpZiB0aGUgdGVybWluYWwgYXRvbWljIAorICAgICAqIG5hbWUgaXMgbm90IGJvdW5kIGluIHRoZSB0YXJnZXQgY29udGV4dCwgYnV0IHRocm93cyAKKyAgICAgKiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBpbnRlcm1lZGlhdGUgY29udGV4dHMgZG8gbm90IGV4aXN0LiAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gaW50ZXJtZWRpYXRlIGNvbnRleHQgZG9lcyBub3QgCisgICAgICogZXhpc3QKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmJpbmQoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0Qm91bmRDb250ZXh0KCkudW5iaW5kKHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbmJpbmRzIHRoZSBuYW1lZCBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFuIGludGVybWVkaWF0ZSBjb250ZXh0IGRvZXMgbm90IAorICAgICAqIGV4aXN0CisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5iaW5kKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0Qm91bmRDb250ZXh0KCkudW5iaW5kKHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5ldyBuYW1lIHRvIHRoZSBvYmplY3QgYm91bmQgdG8gYW4gb2xkIG5hbWUsIGFuZCB1bmJpbmRzIHRoZSAKKyAgICAgKiBvbGQgbmFtZS4gQm90aCBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBjb250ZXh0LiBBbnkgYXR0cmlidXRlcyAKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIG9sZCBuYW1lIGJlY29tZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBuYW1lLiAKKyAgICAgKiBJbnRlcm1lZGlhdGUgY29udGV4dHMgb2YgdGhlIG9sZCBuYW1lIGFyZSBub3QgY2hhbmdlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2xkTmFtZSB0aGUgbmFtZSBvZiB0aGUgZXhpc3RpbmcgYmluZGluZzsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBuZXdOYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgYmluZGluZzsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuZXdOYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW5hbWUoTmFtZSBvbGROYW1lLCBOYW1lIG5ld05hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBnZXRCb3VuZENvbnRleHQoKS5yZW5hbWUocGFyc2VOYW1lKG9sZE5hbWUpLCBwYXJzZU5hbWUobmV3TmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuZXcgbmFtZSB0byB0aGUgb2JqZWN0IGJvdW5kIHRvIGFuIG9sZCBuYW1lLCBhbmQgdW5iaW5kcyB0aGUgCisgICAgICogb2xkIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIG9sZE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV4aXN0aW5nIGJpbmRpbmc7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gbmV3TmFtZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGJpbmRpbmc7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmV3TmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVuYW1lKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGdldEJvdW5kQ29udGV4dCgpLnJlbmFtZShwYXJzZU5hbWUob2xkTmFtZSksIHBhcnNlTmFtZShuZXdOYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgY2xhc3MgCisgICAgICogbmFtZXMgb2Ygb2JqZWN0cyBib3VuZCB0byB0aGVtLiBUaGUgY29udGVudHMgb2YgYW55IHN1YmNvbnRleHRzIGFyZSAKKyAgICAgKiBub3QgaW5jbHVkZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBiaW5kaW5nIGlzIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGlzIGNvbnRleHQsIGl0cyBlZmZlY3Qgb24gCisgICAgICogYW4gZW51bWVyYXRpb24gcHJldmlvdXNseSByZXR1cm5lZCBpcyB1bmRlZmluZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIG5hbWVzIGFuZCBjbGFzcyBuYW1lcyBvZiB0aGUgYmluZGluZ3MgaW4gCisgICAgICogdGhpcyBjb250ZXh0LiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgTmFtZUNsYXNzUGFpci4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Qm91bmRDb250ZXh0KCkubGlzdChwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyB0aGUgbmFtZXMgYm91bmQgaW4gdGhlIG5hbWVkIGNvbnRleHQsIGFsb25nIHdpdGggdGhlIGNsYXNzIAorICAgICAqIG5hbWVzIG9mIG9iamVjdHMgYm91bmQgdG8gdGhlbS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBsaXN0CisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgbmFtZXMgYW5kIGNsYXNzIG5hbWVzIG9mIHRoZSBiaW5kaW5ncyBpbiAKKyAgICAgKiB0aGlzIGNvbnRleHQuIEVhY2ggZWxlbWVudCBvZiB0aGUgZW51bWVyYXRpb24gaXMgb2YgdHlwZSBOYW1lQ2xhc3NQYWlyLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0KFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEJvdW5kQ29udGV4dCgpLmxpc3QocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgdGhlIG5hbWVzIGJvdW5kIGluIHRoZSBuYW1lZCBjb250ZXh0LCBhbG9uZyB3aXRoIHRoZSAKKyAgICAgKiBvYmplY3RzIGJvdW5kIHRvIHRoZW0uIFRoZSBjb250ZW50cyBvZiBhbnkgc3ViY29udGV4dHMgYXJlIG5vdCAKKyAgICAgKiBpbmNsdWRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIGJpbmRpbmcgaXMgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoaXMgY29udGV4dCwgaXRzIGVmZmVjdCBvbiAKKyAgICAgKiBhbiBlbnVtZXJhdGlvbiBwcmV2aW91c2x5IHJldHVybmVkIGlzIHVuZGVmaW5lZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBsaXN0CisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgYmluZGluZ3MgaW4gdGhpcyBjb250ZXh0LiAKKyAgICAgKiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgQmluZGluZy4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdEJpbmRpbmdzKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRCb3VuZENvbnRleHQoKS5saXN0QmluZGluZ3MocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgdGhlIG5hbWVzIGJvdW5kIGluIHRoZSBuYW1lZCBjb250ZXh0LCBhbG9uZyB3aXRoIHRoZSAKKyAgICAgKiBvYmplY3RzIGJvdW5kIHRvIHRoZW0uCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIGJpbmRpbmdzIGluIHRoaXMgY29udGV4dC4gCisgICAgICogRWFjaCBlbGVtZW50IG9mIHRoZSBlbnVtZXJhdGlvbiBpcyBvZiB0eXBlIEJpbmRpbmcuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3RCaW5kaW5ncyhTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRCb3VuZENvbnRleHQoKS5saXN0QmluZGluZ3MocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlc3Ryb3lzIHRoZSBuYW1lZCBjb250ZXh0IGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIG5hbWVzcGFjZS4gQW55IAorICAgICAqIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lIGFyZSBhbHNvIHJlbW92ZWQuIEludGVybWVkaWF0ZSAKKyAgICAgKiBjb250ZXh0cyBhcmUgbm90IGRlc3Ryb3llZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LiBJdCBzdWNjZWVkcyBldmVuIGlmIHRoZSB0ZXJtaW5hbCBhdG9taWMgCisgICAgICogbmFtZSBpcyBub3QgYm91bmQgaW4gdGhlIHRhcmdldCBjb250ZXh0LCBidXQgdGhyb3dzIAorICAgICAqIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGludGVybWVkaWF0ZSBjb250ZXh0cyBkbyBub3QgZXhpc3QuIAorICAgICAqIAorICAgICAqIEluIGEgZmVkZXJhdGVkIG5hbWluZyBzeXN0ZW0sIGEgY29udGV4dCBmcm9tIG9uZSBuYW1pbmcgc3lzdGVtIG1heSBiZSAKKyAgICAgKiBib3VuZCB0byBhIG5hbWUgaW4gYW5vdGhlci4gT25lIGNhbiBzdWJzZXF1ZW50bHkgbG9vayB1cCBhbmQgcGVyZm9ybSAKKyAgICAgKiBvcGVyYXRpb25zIG9uIHRoZSBmb3JlaWduIGNvbnRleHQgdXNpbmcgYSBjb21wb3NpdGUgbmFtZS4gSG93ZXZlciwgYW4gCisgICAgICogYXR0ZW1wdCBkZXN0cm95IHRoZSBjb250ZXh0IHVzaW5nIHRoaXMgY29tcG9zaXRlIG5hbWUgd2lsbCBmYWlsIHdpdGggCisgICAgICogTm90Q29udGV4dEV4Y2VwdGlvbiwgYmVjYXVzZSB0aGUgZm9yZWlnbiBjb250ZXh0IGlzIG5vdCBhICJzdWJjb250ZXh0IiAKKyAgICAgKiBvZiB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyBib3VuZC4gSW5zdGVhZCwgdXNlIHVuYmluZCgpIHRvIHJlbW92ZSAKKyAgICAgKiB0aGUgYmluZGluZyBvZiB0aGUgZm9yZWlnbiBjb250ZXh0LiBEZXN0cm95aW5nIHRoZSBmb3JlaWduIGNvbnRleHQgCisgICAgICogcmVxdWlyZXMgdGhhdCB0aGUgZGVzdHJveVN1YmNvbnRleHQoKSBiZSBwZXJmb3JtZWQgb24gYSBjb250ZXh0IGZyb20gCisgICAgICogdGhlIGZvcmVpZ24gY29udGV4dCdzICJuYXRpdmUiIG5hbWluZyBzeXN0ZW0uCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gYmUgZGVzdHJveWVkOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gaW50ZXJtZWRpYXRlIGNvbnRleHQgZG9lcyBub3QgCisgICAgICogZXhpc3QKKyAgICAgKiBAZXhjZXB0aW9uIE5vdENvbnRleHRFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgYm91bmQgYnV0IGRvZXMgbm90IG5hbWUgCisgICAgICogYSBjb250ZXh0LCBvciBkb2VzIG5vdCBuYW1lIGEgY29udGV4dCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lTdWJjb250ZXh0KE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGdldEJvdW5kQ29udGV4dCgpLmRlc3Ryb3lTdWJjb250ZXh0KHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXN0cm95cyB0aGUgbmFtZWQgY29udGV4dCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBuYW1lc3BhY2UuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gYmUgZGVzdHJveWVkOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gaW50ZXJtZWRpYXRlIGNvbnRleHQgZG9lcyBub3QgCisgICAgICogZXhpc3QKKyAgICAgKiBAZXhjZXB0aW9uIE5vdENvbnRleHRFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgYm91bmQgYnV0IGRvZXMgbm90IG5hbWUgCisgICAgICogYSBjb250ZXh0LCBvciBkb2VzIG5vdCBuYW1lIGEgY29udGV4dCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lTdWJjb250ZXh0KFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0Qm91bmRDb250ZXh0KCkuZGVzdHJveVN1YmNvbnRleHQocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGJpbmRzIGEgbmV3IGNvbnRleHQuIENyZWF0ZXMgYSBuZXcgY29udGV4dCB3aXRoIHRoZSBnaXZlbiAKKyAgICAgKiBuYW1lIGFuZCBiaW5kcyBpdCBpbiB0aGUgdGFyZ2V0IGNvbnRleHQgKHRoYXQgbmFtZWQgYnkgYWxsIGJ1dCAKKyAgICAgKiB0ZXJtaW5hbCBhdG9taWMgY29tcG9uZW50IG9mIHRoZSBuYW1lKS4gQWxsIGludGVybWVkaWF0ZSBjb250ZXh0cyBhbmQgCisgICAgICogdGhlIHRhcmdldCBjb250ZXh0IG11c3QgYWxyZWFkeSBleGlzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBjcmVhdGU7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBjcmVhdGlvbiBvZiB0aGUgc3ViY29udGV4dCAKKyAgICAgKiByZXF1aXJlcyBzcGVjaWZpY2F0aW9uIG9mIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIENvbnRleHQgY3JlYXRlU3ViY29udGV4dChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Qm91bmRDb250ZXh0KCkuY3JlYXRlU3ViY29udGV4dChwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbmQgYmluZHMgYSBuZXcgY29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBjcmVhdGU7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBjcmVhdGlvbiBvZiB0aGUgc3ViY29udGV4dCAKKyAgICAgKiByZXF1aXJlcyBzcGVjaWZpY2F0aW9uIG9mIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIENvbnRleHQgY3JlYXRlU3ViY29udGV4dChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRCb3VuZENvbnRleHQoKS5jcmVhdGVTdWJjb250ZXh0KHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdCwgZm9sbG93aW5nIGxpbmtzIGV4Y2VwdCBmb3IgdGhlIHRlcm1pbmFsIAorICAgICAqIGF0b21pYyBjb21wb25lbnQgb2YgdGhlIG5hbWUuIElmIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZSBpcyBub3QgYSAKKyAgICAgKiBsaW5rLCByZXR1cm5zIHRoZSBvYmplY3QgaXRzZWxmLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gbG9vayB1cAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBib3VuZCB0byBuYW1lLCBub3QgZm9sbG93aW5nIHRoZSB0ZXJtaW5hbCBsaW5rIAorICAgICAqIChpZiBhbnkpLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9va3VwTGluayhOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Qm91bmRDb250ZXh0KCkubG9va3VwTGluayhwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1lZCBvYmplY3QsIGZvbGxvd2luZyBsaW5rcyBleGNlcHQgZm9yIHRoZSB0ZXJtaW5hbCAKKyAgICAgKiBhdG9taWMgY29tcG9uZW50IG9mIHRoZSBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gbG9vayB1cAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBib3VuZCB0byBuYW1lLCBub3QgZm9sbG93aW5nIHRoZSB0ZXJtaW5hbCBsaW5rIAorICAgICAqIChpZiBhbnkpLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9va3VwTGluayhTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRCb3VuZENvbnRleHQoKS5sb29rdXBMaW5rKHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHBhcnNlciBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVkIGNvbnRleHQuIEluIGEgCisgICAgICogZmVkZXJhdGlvbiBvZiBuYW1lc3BhY2VzLCBkaWZmZXJlbnQgbmFtaW5nIHN5c3RlbXMgd2lsbCBwYXJzZSBuYW1lcyAKKyAgICAgKiBkaWZmZXJlbnRseS4gVGhpcyBtZXRob2QgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGdldCBhIHBhcnNlciBmb3IgCisgICAgICogcGFyc2luZyBuYW1lcyBpbnRvIHRoZWlyIGF0b21pYyBjb21wb25lbnRzIHVzaW5nIHRoZSBuYW1pbmcgY29udmVudGlvbiAKKyAgICAgKiBvZiBhIHBhcnRpY3VsYXIgbmFtaW5nIHN5c3RlbS4gV2l0aGluIGFueSBzaW5nbGUgbmFtaW5nIHN5c3RlbSwgCisgICAgICogTmFtZVBhcnNlciBvYmplY3RzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIG11c3QgYmUgZXF1YWwgKHVzaW5nIHRoZSAKKyAgICAgKiBlcXVhbHMoKSB0ZXN0KS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgcGFyc2VyCisgICAgICogQHJldHVybiBhIG5hbWUgcGFyc2VyIHRoYXQgY2FuIHBhcnNlIGNvbXBvdW5kIG5hbWVzIGludG8gdGhlaXIgYXRvbWljIAorICAgICAqIGNvbXBvbmVudHMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZVBhcnNlciBnZXROYW1lUGFyc2VyKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRCb3VuZENvbnRleHQoKS5nZXROYW1lUGFyc2VyKHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHBhcnNlciBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVkIGNvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgZnJvbSB3aGljaCB0byBnZXQgdGhlIHBhcnNlcgorICAgICAqIEByZXR1cm4gYSBuYW1lIHBhcnNlciB0aGF0IGNhbiBwYXJzZSBjb21wb3VuZCBuYW1lcyBpbnRvIHRoZWlyIGF0b21pYyAKKyAgICAgKiBjb21wb25lbnRzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWVQYXJzZXIgZ2V0TmFtZVBhcnNlcihTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRCb3VuZENvbnRleHQoKS5nZXROYW1lUGFyc2VyKHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb21wb3NlcyB0aGUgbmFtZSBvZiB0aGlzIGNvbnRleHQgd2l0aCBhIG5hbWUgcmVsYXRpdmUgdG8gdGhpcyBjb250ZXh0LgorICAgICAqIDxwPgorICAgICAqIEdpdmVuIGEgbmFtZSAobmFtZSkgcmVsYXRpdmUgdG8gdGhpcyBjb250ZXh0LCBhbmQgdGhlIG5hbWUgKHByZWZpeCkgCisgICAgICogb2YgdGhpcyBjb250ZXh0IHJlbGF0aXZlIHRvIG9uZSBvZiBpdHMgYW5jZXN0b3JzLCB0aGlzIG1ldGhvZCByZXR1cm5zIAorICAgICAqIHRoZSBjb21wb3NpdGlvbiBvZiB0aGUgdHdvIG5hbWVzIHVzaW5nIHRoZSBzeW50YXggYXBwcm9wcmlhdGUgZm9yIHRoZSAKKyAgICAgKiBuYW1pbmcgc3lzdGVtKHMpIGludm9sdmVkLiBUaGF0IGlzLCBpZiBuYW1lIG5hbWVzIGFuIG9iamVjdCByZWxhdGl2ZSAKKyAgICAgKiB0byB0aGlzIGNvbnRleHQsIHRoZSByZXN1bHQgaXMgdGhlIG5hbWUgb2YgdGhlIHNhbWUgb2JqZWN0LCBidXQgCisgICAgICogcmVsYXRpdmUgdG8gdGhlIGFuY2VzdG9yIGNvbnRleHQuIE5vbmUgb2YgdGhlIG5hbWVzIG1heSBiZSBudWxsLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIGEgbmFtZSByZWxhdGl2ZSB0byB0aGlzIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gcHJlZml4IHRoZSBuYW1lIG9mIHRoaXMgY29udGV4dCByZWxhdGl2ZSB0byBvbmUgb2YgaXRzIGFuY2VzdG9ycworICAgICAqIEByZXR1cm4gdGhlIGNvbXBvc2l0aW9uIG9mIHByZWZpeCBhbmQgbmFtZQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1lIGNvbXBvc2VOYW1lKE5hbWUgbmFtZSwgTmFtZSBwcmVmaXgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBwcmVmaXggPSAoTmFtZSkgcHJlZml4LmNsb25lKCk7CisgICAgICAgIHJldHVybiBwcmVmaXguYWRkQWxsKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29tcG9zZXMgdGhlIG5hbWUgb2YgdGhpcyBjb250ZXh0IHdpdGggYSBuYW1lIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBhIG5hbWUgcmVsYXRpdmUgdG8gdGhpcyBjb250ZXh0CisgICAgICogQHBhcmFtIHByZWZpeCB0aGUgbmFtZSBvZiB0aGlzIGNvbnRleHQgcmVsYXRpdmUgdG8gb25lIG9mIGl0cyBhbmNlc3RvcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wb3NpdGlvbiBvZiBwcmVmaXggYW5kIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNvbXBvc2VOYW1lKFN0cmluZyBuYW1lLCBTdHJpbmcgcHJlZml4KQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHByZWZpeCArICIvIiArIG5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IGVudmlyb25tZW50IHByb3BlcnR5IHRvIHRoZSBlbnZpcm9ubWVudCBvZiB0aGlzIGNvbnRleHQuIElmIAorICAgICAqIHRoZSBwcm9wZXJ0eSBhbHJlYWR5IGV4aXN0cywgaXRzIHZhbHVlIGlzIG92ZXJ3cml0dGVuLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wTmFtZSB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgcHJvcGVydHkgdG8gYWRkOyBtYXkgbm90IAorICAgICAqIGJlIG51bGwKKyAgICAgKiBAcGFyYW0gcHJvcFZhbCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIGFkZDsgbWF5IG5vdCBiZSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBhZGRUb0Vudmlyb25tZW50KFN0cmluZyBwcm9wTmFtZSwgT2JqZWN0IHByb3BWYWwpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Qm91bmRDb250ZXh0KCkuYWRkVG9FbnZpcm9ubWVudChwcm9wTmFtZSwgcHJvcFZhbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFuIGVudmlyb25tZW50IHByb3BlcnR5IGZyb20gdGhlIGVudmlyb25tZW50IG9mIHRoaXMgY29udGV4dC4gCisgICAgICogCisgICAgICogQHBhcmFtIHByb3BOYW1lIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBwcm9wZXJ0eSB0byByZW1vdmU7IAorICAgICAqIG1heSBub3QgYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlRnJvbUVudmlyb25tZW50KFN0cmluZyBwcm9wTmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRCb3VuZENvbnRleHQoKS5yZW1vdmVGcm9tRW52aXJvbm1lbnQocHJvcE5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBlbnZpcm9ubWVudCBpbiBlZmZlY3QgZm9yIHRoaXMgY29udGV4dC4gU2VlIGNsYXNzIAorICAgICAqIGRlc2NyaXB0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gZW52aXJvbm1lbnQgcHJvcGVydGllcy4gCisgICAgICogVGhlIGNhbGxlciBzaG91bGQgbm90IG1ha2UgYW55IGNoYW5nZXMgdG8gdGhlIG9iamVjdCByZXR1cm5lZDogdGhlaXIgCisgICAgICogZWZmZWN0IG9uIHRoZSBjb250ZXh0IGlzIHVuZGVmaW5lZC4gVGhlIGVudmlyb25tZW50IG9mIHRoaXMgY29udGV4dCAKKyAgICAgKiBtYXkgYmUgY2hhbmdlZCB1c2luZyBhZGRUb0Vudmlyb25tZW50KCkgYW5kIHJlbW92ZUZyb21FbnZpcm9ubWVudCgpLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGVudmlyb25tZW50IG9mIHRoaXMgY29udGV4dDsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0RW52aXJvbm1lbnQoKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEJvdW5kQ29udGV4dCgpLmdldEVudmlyb25tZW50KCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhpcyBjb250ZXh0LiBUaGlzIG1ldGhvZCByZWxlYXNlcyB0aGlzIGNvbnRleHQncyByZXNvdXJjZXMgCisgICAgICogaW1tZWRpYXRlbHksIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlbSB0byBiZSByZWxlYXNlZCBhdXRvbWF0aWNhbGx5IAorICAgICAqIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50OiBpbnZva2luZyBpdCBvbiBhIGNvbnRleHQgdGhhdCBoYXMgYWxyZWFkeSAKKyAgICAgKiBiZWVuIGNsb3NlZCBoYXMgbm8gZWZmZWN0LiBJbnZva2luZyBhbnkgb3RoZXIgbWV0aG9kIG9uIGEgY2xvc2VkIAorICAgICAqIGNvbnRleHQgaXMgbm90IGFsbG93ZWQsIGFuZCByZXN1bHRzIGluIHVuZGVmaW5lZCBiZWhhdmlvdXIuCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0Qm91bmRDb250ZXh0KCkuY2xvc2UoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgY29udGV4dCB3aXRoaW4gaXRzIG93biBuYW1lc3BhY2UuCisgICAgICogPHA+CisgICAgICogTWFueSBuYW1pbmcgc2VydmljZXMgaGF2ZSBhIG5vdGlvbiBvZiBhICJmdWxsIG5hbWUiIGZvciBvYmplY3RzIGluIAorICAgICAqIHRoZWlyIHJlc3BlY3RpdmUgbmFtZXNwYWNlcy4gRm9yIGV4YW1wbGUsIGFuIExEQVAgZW50cnkgaGFzIGEgCisgICAgICogZGlzdGluZ3Vpc2hlZCBuYW1lLCBhbmQgYSBETlMgcmVjb3JkIGhhcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiBUaGlzIAorICAgICAqIG1ldGhvZCBhbGxvd3MgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiB0byByZXRyaWV2ZSB0aGlzIG5hbWUuIFRoZSBzdHJpbmcgCisgICAgICogcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgbm90IGEgSk5ESSBjb21wb3NpdGUgbmFtZSBhbmQgc2hvdWxkIG5vdCBiZSAKKyAgICAgKiBwYXNzZWQgZGlyZWN0bHkgdG8gY29udGV4dCBtZXRob2RzLiBJbiBuYW1pbmcgc3lzdGVtcyBmb3Igd2hpY2ggdGhlIAorICAgICAqIG5vdGlvbiBvZiBmdWxsIG5hbWUgZG9lcyBub3QgbWFrZSBzZW5zZSwgCisgICAgICogT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoaXMgY29udGV4dCdzIG5hbWUgaW4gaXRzIG93biBuYW1lc3BhY2U7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiB0aGUgbmFtaW5nIHN5c3RlbSBkb2VzIAorICAgICAqIG5vdCBoYXZlIHRoZSBub3Rpb24gb2YgYSBmdWxsIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVJbk5hbWVzcGFjZSgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcHJlZml4OworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYm91bmQgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBnZXRCb3VuZENvbnRleHQoKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoaW5pdGlhbENvbnRleHQpIHsKKyAgICAgICAgICAgIFN0cmluZyBJQ05hbWUgPSBJQ19QUkVGSVg7CisgICAgICAgICAgICBpZiAoQ29udGV4dEJpbmRpbmdzLmlzVGhyZWFkQm91bmQoKSkgeworICAgICAgICAgICAgICAgIElDTmFtZSArPSBDb250ZXh0QmluZGluZ3MuZ2V0VGhyZWFkTmFtZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChDb250ZXh0QmluZGluZ3MuaXNDbGFzc0xvYWRlckJvdW5kKCkpIHsKKyAgICAgICAgICAgICAgICBJQ05hbWUgKz0gQ29udGV4dEJpbmRpbmdzLmdldENsYXNzTG9hZGVyTmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29udGV4dCBpbml0aWFsQ29udGV4dCA9IENvbnRleHRCaW5kaW5ncy5nZXRDb250ZXh0KElDTmFtZSk7CisgICAgICAgICAgICBpZiAoaW5pdGlhbENvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIEFsbG9jYXRpbmcgYSBuZXcgY29udGV4dCBhbmQgYmluZGluZyBpdCB0byB0aGUgYXBwcm9wcmlhdGUgCisgICAgICAgICAgICAgICAgLy8gbmFtZQorICAgICAgICAgICAgICAgIGluaXRpYWxDb250ZXh0ID0gbmV3IE5hbWluZ0NvbnRleHQoZW52LCBJQ05hbWUpOworICAgICAgICAgICAgICAgIENvbnRleHRCaW5kaW5ncy5iaW5kQ29udGV4dChJQ05hbWUsIGluaXRpYWxDb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbml0aWFsQ29udGV4dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChDb250ZXh0QmluZGluZ3MuaXNUaHJlYWRCb3VuZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbnRleHRCaW5kaW5ncy5nZXRUaHJlYWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbnRleHRCaW5kaW5ncy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0cmlwcyB0aGUgVVJMIGhlYWRlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJzZWQgbmFtZQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vICJqYXZhOiIgaGVhZGVyIG9yIGlmIG5vIAorICAgICAqIG5hbWluZyBjb250ZXh0IGhhcyBiZWVuIGJvdW5kIHRvIHRoaXMgdGhyZWFkCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXJzZU5hbWUoU3RyaW5nIG5hbWUpIAorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIGlmICgoIWluaXRpYWxDb250ZXh0KSAmJiAobmFtZS5zdGFydHNXaXRoKHByZWZpeCkpKSB7CisgICAgICAgICAgICByZXR1cm4gKG5hbWUuc3Vic3RyaW5nKHByZWZpeExlbmd0aCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGluaXRpYWxDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChuYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzZWxlY3RvckNvbnRleHQubm9KYXZhVXJsIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RyaXBzIHRoZSBVUkwgaGVhZGVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHBhcnNlZCBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gImphdmE6IiBoZWFkZXIgb3IgaWYgbm8gCisgICAgICogbmFtaW5nIGNvbnRleHQgaGFzIGJlZW4gYm91bmQgdG8gdGhpcyB0aHJlYWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTmFtZSBwYXJzZU5hbWUoTmFtZSBuYW1lKSAKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCghaW5pdGlhbENvbnRleHQpICYmICghbmFtZS5pc0VtcHR5KCkpIAorICAgICAgICAgICAgJiYgKG5hbWUuZ2V0KDApLmVxdWFscyhwcmVmaXgpKSkgeworICAgICAgICAgICAgcmV0dXJuIChuYW1lLmdldFN1ZmZpeCgxKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaW5pdGlhbENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInNlbGVjdG9yQ29udGV4dC5ub0phdmFVcmwiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvU3RyaW5nTWFuYWdlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9TdHJpbmdNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4M2QwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvU3RyaW5nTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZzsKKworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8qKgorICogQW4gaW50ZXJuYXRpb25hbGl6YXRpb24gLyBsb2NhbGl6YXRpb24gaGVscGVyIGNsYXNzIHdoaWNoIHJlZHVjZXMKKyAqIHRoZSBib3RoZXIgb2YgaGFuZGxpbmcgUmVzb3VyY2VCdW5kbGVzIGFuZCB0YWtlcyBjYXJlIG9mIHRoZQorICogY29tbW9uIGNhc2VzIG9mIG1lc3NhZ2UgZm9ybWF0aW5nIHdoaWNoIG90aGVyd2lzZSByZXF1aXJlIHRoZQorICogY3JlYXRpb24gb2YgT2JqZWN0IGFycmF5cyBhbmQgc3VjaC4KKyAqCisgKiA8cD5UaGUgU3RyaW5nTWFuYWdlciBvcGVyYXRlcyBvbiBhIHBhY2thZ2UgYmFzaXMuIE9uZSBTdHJpbmdNYW5hZ2VyCisgKiBwZXIgcGFja2FnZSBjYW4gYmUgY3JlYXRlZCBhbmQgYWNjZXNzZWQgdmlhIHRoZSBnZXRNYW5hZ2VyIG1ldGhvZAorICogY2FsbC4KKyAqCisgKiA8cD5UaGUgU3RyaW5nTWFuYWdlciB3aWxsIGxvb2sgZm9yIGEgUmVzb3VyY2VCdW5kbGUgbmFtZWQgYnkKKyAqIHRoZSBwYWNrYWdlIG5hbWUgZ2l2ZW4gcGx1cyB0aGUgc3VmZml4IG9mICJMb2NhbFN0cmluZ3MiLiBJbgorICogcHJhY3RpY2UsIHRoaXMgbWVhbnMgdGhhdCB0aGUgbG9jYWxpemVkIGluZm9ybWF0aW9uIHdpbGwgYmUgY29udGFpbmVkCisgKiBpbiBhIExvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGZpbGUgbG9jYXRlZCBpbiB0aGUgcGFja2FnZQorICogZGlyZWN0b3J5IG9mIHRoZSBjbGFzc3BhdGguCisgKgorICogPHA+UGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIGZvcgorICogbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBAYXV0aG9yIEphbWVzIER1bmNhbiBEYXZpZHNvbiBbZHVuY2FuQGVuZy5zdW4uY29tXQorICogQGF1dGhvciBKYW1lcyBUb2RkIFtnb256b0Blbmcuc3VuLmNvbV0KKyAqLworCitwdWJsaWMgY2xhc3MgU3RyaW5nTWFuYWdlciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgUmVzb3VyY2VCdW5kbGUgZm9yIHRoaXMgU3RyaW5nTWFuYWdlci4KKyAgICAgKi8KKyAgICAKKyAgICBwcml2YXRlIFJlc291cmNlQnVuZGxlIGJ1bmRsZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgU3RyaW5nTWFuYWdlciBmb3IgYSBnaXZlbiBwYWNrYWdlLiBUaGlzIGlzIGEKKyAgICAgKiBwcml2YXRlIG1ldGhvZCBhbmQgYWxsIGFjY2VzcyB0byBpdCBpcyBhcmJpdHJhdGVkIGJ5IHRoZQorICAgICAqIHN0YXRpYyBnZXRNYW5hZ2VyIG1ldGhvZCBjYWxsIHNvIHRoYXQgb25seSBvbmUgU3RyaW5nTWFuYWdlcgorICAgICAqIHBlciBwYWNrYWdlIHdpbGwgYmUgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBOYW1lIG9mIHBhY2thZ2UgdG8gY3JlYXRlIFN0cmluZ01hbmFnZXIgZm9yLgorICAgICAqLworCisgICAgcHJpdmF0ZSBTdHJpbmdNYW5hZ2VyKFN0cmluZyBwYWNrYWdlTmFtZSkgeworCVN0cmluZyBidW5kbGVOYW1lID0gcGFja2FnZU5hbWUgKyAiLkxvY2FsU3RyaW5ncyI7CisJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHN0cmluZyBmcm9tIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGJ1bmRsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAia2V5IGlzIG51bGwiOworCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24obXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBzdHIgPSBudWxsOworCisgICAgICAgIHRyeSB7CisJICAgIHN0ciA9IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKKyAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkgeworICAgICAgICAgICAgc3RyID0gIkNhbm5vdCBmaW5kIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIGtleSAnIiArIGtleSArICInIjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdHI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgc3RyaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgYnVuZGxlIGFuZCBmb3JtYXQKKyAgICAgKiBpdCB3aXRoIHRoZSBnaXZlbiBzZXQgb2YgYXJndW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGtleQorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7CisJU3RyaW5nIGlTdHJpbmcgPSBudWxsOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRTdHJpbmcoa2V5KTsKKworCS8vIHRoaXMgY2hlY2sgZm9yIHRoZSBydW50aW1lIGV4Y2VwdGlvbiBpcyBzb21lIHByZSAxLjEuNgorCS8vIFZNJ3MgZG9uJ3QgZG8gYW4gYXV0b21hdGljIHRvU3RyaW5nKCkgb24gdGhlIHBhc3NlZCBpbgorCS8vIG9iamVjdHMgYW5kIGJhcmYgb3V0CisJCisJdHJ5IHsKKyAgICAgICAgICAgIC8vIGVuc3VyZSB0aGUgYXJndW1lbnRzIGFyZSBub3QgbnVsbCBzbyBwcmUgMS4yIFZNJ3MgZG9uJ3QgYmFyZgorICAgICAgICAgICAgT2JqZWN0IG5vbk51bGxBcmdzW10gPSBhcmdzOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGFyZ3MubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGFyZ3NbaV0gPT0gbnVsbCkgeworCQkgICAgaWYgKG5vbk51bGxBcmdzPT1hcmdzKSBub25OdWxsQXJncz0oT2JqZWN0W10pYXJncy5jbG9uZSgpOworCQkgICAgbm9uTnVsbEFyZ3NbaV0gPSAibnVsbCI7CisJCX0KKwkgICAgfQorIAorICAgICAgICAgICAgaVN0cmluZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHZhbHVlLCBub25OdWxsQXJncyk7CisJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworCSAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCSAgICBidWYuYXBwZW5kKHZhbHVlKTsKKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisJCWJ1Zi5hcHBlbmQoIiBhcmdbIiArIGkgKyAiXT0iICsgYXJnc1tpXSk7CisJICAgIH0KKwkgICAgaVN0cmluZyA9IGJ1Zi50b1N0cmluZygpOworCX0KKwlyZXR1cm4gaVN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzdHJpbmcgZnJvbSB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBidW5kbGUgYW5kIGZvcm1hdCBpdAorICAgICAqIHdpdGggdGhlIGdpdmVuIG9iamVjdCBhcmd1bWVudC4gVGhpcyBhcmd1bWVudCBjYW4gb2YgY291cnNlIGJlCisgICAgICogYSBTdHJpbmcgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGtleQorICAgICAqIEBwYXJhbSBhcmcKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBhcmcpIHsKKwlPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFtdIHthcmd9OworCXJldHVybiBnZXRTdHJpbmcoa2V5LCBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzdHJpbmcgZnJvbSB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBidW5kbGUgYW5kIGZvcm1hdCBpdAorICAgICAqIHdpdGggdGhlIGdpdmVuIG9iamVjdCBhcmd1bWVudHMuIFRoZXNlIGFyZ3VtZW50cyBjYW4gb2YgY291cnNlCisgICAgICogYmUgU3RyaW5nIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogQHBhcmFtIGFyZzEKKyAgICAgKiBAcGFyYW0gYXJnMgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisJT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7YXJnMSwgYXJnMn07CisJcmV0dXJuIGdldFN0cmluZyhrZXksIGFyZ3MpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzdHJpbmcgZnJvbSB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBidW5kbGUgYW5kIGZvcm1hdCBpdAorICAgICAqIHdpdGggdGhlIGdpdmVuIG9iamVjdCBhcmd1bWVudHMuIFRoZXNlIGFyZ3VtZW50cyBjYW4gb2YgY291cnNlCisgICAgICogYmUgU3RyaW5nIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogQHBhcmFtIGFyZzEKKyAgICAgKiBAcGFyYW0gYXJnMgorICAgICAqIEBwYXJhbSBhcmczCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsCisJCQkgICAgT2JqZWN0IGFyZzMpIHsKKwlPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFtdIHthcmcxLCBhcmcyLCBhcmczfTsKKwlyZXR1cm4gZ2V0U3RyaW5nKGtleSwgYXJncyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldCBhIHN0cmluZyBmcm9tIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGJ1bmRsZSBhbmQgZm9ybWF0IGl0CisgICAgICogd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0IGFyZ3VtZW50cy4gVGhlc2UgYXJndW1lbnRzIGNhbiBvZiBjb3Vyc2UKKyAgICAgKiBiZSBTdHJpbmcgb2JqZWN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiBAcGFyYW0gYXJnMQorICAgICAqIEBwYXJhbSBhcmcyCisgICAgICogQHBhcmFtIGFyZzMKKyAgICAgKiBAcGFyYW0gYXJnNAorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyLAorCQkJICAgIE9iamVjdCBhcmczLCBPYmplY3QgYXJnNCkgeworCU9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W10ge2FyZzEsIGFyZzIsIGFyZzMsIGFyZzR9OworCXJldHVybiBnZXRTdHJpbmcoa2V5LCBhcmdzKTsKKyAgICB9ICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBTVEFUSUMgU1VQUE9SVCBNRVRIT0RTCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBtYW5hZ2VycyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgU3RyaW5nTWFuYWdlciBmb3IgYSBwYXJ0aWN1bGFyIHBhY2thZ2UuIElmIGEgbWFuYWdlciBmb3IKKyAgICAgKiBhIHBhY2thZ2UgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgcmV1c2VkLCBlbHNlIGEgbmV3CisgICAgICogU3RyaW5nTWFuYWdlciB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lCisgICAgICovCisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIGdldE1hbmFnZXIoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisJU3RyaW5nTWFuYWdlciBtZ3IgPSAoU3RyaW5nTWFuYWdlciltYW5hZ2Vycy5nZXQocGFja2FnZU5hbWUpOworCWlmIChtZ3IgPT0gbnVsbCkgeworCSAgICBtZ3IgPSBuZXcgU3RyaW5nTWFuYWdlcihwYWNrYWdlTmFtZSk7CisJICAgIG1hbmFnZXJzLnB1dChwYWNrYWdlTmFtZSwgbWdyKTsKKwl9CisJcmV0dXJuIG1ncjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL1RyYW5zYWN0aW9uUmVmLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL1RyYW5zYWN0aW9uUmVmLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlYjYxYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvVHJhbnNhY3Rpb25SZWYuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZzsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZlcmVuY2U7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHJlZmVyZW5jZSBhZGRyZXNzIHRvIGEgdHJhbnNhY3Rpb24uCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVHJhbnNhY3Rpb25SZWYKKyAgICBleHRlbmRzIFJlZmVyZW5jZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGZhY3RvcnkgZm9yIHRoaXMgcmVmZXJlbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRkFDVE9SWSA9IAorICAgICAgICBvcmcuYXBhY2hlLm5hbWluZy5mYWN0b3J5LkNvbnN0YW50cy5ERUZBVUxUX1RSQU5TQUNUSU9OX0ZBQ1RPUlk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBSZXNvdXJjZSBSZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIFRyYW5zYWN0aW9uUmVmKCkgeworICAgICAgICB0aGlzKG51bGwsIG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVzb3VyY2UgUmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGZhY3RvcnkgY2xhc3MKKyAgICAgKiBAcGFyYW0gZmFjdG9yeUxvY2F0aW9uIFRoZSBmYWN0b3J5IGxvY2F0aW9uCisgICAgICovCisgICAgcHVibGljIFRyYW5zYWN0aW9uUmVmKFN0cmluZyBmYWN0b3J5LCBTdHJpbmcgZmFjdG9yeUxvY2F0aW9uKSB7CisgICAgICAgIHN1cGVyKCJqYXZheC50cmFuc2FjdGlvbi5Vc2VyVHJhbnNhY3Rpb24iLCBmYWN0b3J5LCBmYWN0b3J5TG9jYXRpb24pOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWZlcmVuY2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGZhY3Rvcnkgb2YgdGhlIG9iamVjdCB0byB3aGljaCB0aGlzIAorICAgICAqIHJlZmVyZW5jZSByZWZlcnMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGYWN0b3J5Q2xhc3NOYW1lKCkgeworICAgICAgICBTdHJpbmcgZmFjdG9yeSA9IHN1cGVyLmdldEZhY3RvcnlDbGFzc05hbWUoKTsKKyAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KENvbnRleHQuT0JKRUNUX0ZBQ1RPUklFUyk7CisgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBERUZBVUxUX0ZBQ1RPUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9CZWFuRmFjdG9yeS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L0JlYW5GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjMGU0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9CZWFuRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5mYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmZXJlbmNlOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZBZGRyOworaW1wb3J0IGphdmF4Lm5hbWluZy5zcGkuT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5SZXNvdXJjZVJlZjsKKworaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOworaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKy8qKgorICogT2JqZWN0IGZhY3RvcnkgZm9yIGFueSBSZXNvdXJjZSBjb25mb3JtaW5nIHRvIHRoZSBKYXZhQmVhbiBzcGVjLgorICogCisgKiA8cD5UaGlzIGZhY3RvcnkgY2FuIGJlIGNvbmZpZ3VyZWQgaW4gYSA8Y29kZT4mbHQ7RGVmYXVsdENvbnRleHQmZ3Q7PC9jb2RlPgorICogb3IgPGNvZGU+Jmx0O0NvbnRleHQmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHlvdXIgPGNvZGU+Y29uZi9zZXJ2ZXIueG1sPC9jb2RlPgorICogY29uZmlndXJhdGlvbiBmaWxlLiAgQW4gZXhhbXBsZSBvZiBmYWN0b3J5IGNvbmZpZ3VyYXRpb24gaXM6PC9wPgorICogPHByZT4KKyAqICZsdDtSZXNvdXJjZSBuYW1lPSJqZGJjL215RGF0YVNvdXJjZSIgYXV0aD0iU0VSVkxFVCIKKyAqICAgdHlwZT0ib3JhY2xlLmpkYmMucG9vbC5PcmFjbGVDb25uZWN0aW9uQ2FjaGVJbXBsIi8mZ3Q7CisgKiAmbHQ7UmVzb3VyY2VQYXJhbXMgbmFtZT0iamRiYy9teURhdGFTb3VyY2UiJmd0OworICogICAmbHQ7cGFyYW1ldGVyJmd0OworICogICAgICZsdDtuYW1lJmd0O2ZhY3RvcnkmbHQ7L25hbWUmZ3Q7CisgKiAgICAgJmx0O3ZhbHVlJmd0O29yZy5hcGFjaGUubmFtaW5nLmZhY3RvcnkuQmVhbkZhY3RvcnkmbHQ7L3ZhbHVlJmd0OworICogICAmbHQ7L3BhcmFtZXRlciZndDsKKyAqICAgJmx0O3BhcmFtZXRlciZndDsKKyAqICAgICAmbHQ7bmFtZSZndDtkcml2ZXJUeXBlJmx0Oy9uYW1lJmd0OworICogICAgICZsdDt2YWx1ZSZndDt0aGluJmx0Oy92YWx1ZSZndDsKKyAqICAgJmx0Oy9wYXJhbWV0ZXImZ3Q7CisgKiAgICZsdDtwYXJhbWV0ZXImZ3Q7CisgKiAgICAgJmx0O25hbWUmZ3Q7c2VydmVyTmFtZSZsdDsvbmFtZSZndDsKKyAqICAgICAmbHQ7dmFsdWUmZ3Q7aHVlJmx0Oy92YWx1ZSZndDsKKyAqICAgJmx0Oy9wYXJhbWV0ZXImZ3Q7CisgKiAgICZsdDtwYXJhbWV0ZXImZ3Q7CisgKiAgICAgJmx0O25hbWUmZ3Q7bmV0d29ya1Byb3RvY29sJmx0Oy9uYW1lJmd0OworICogICAgICZsdDt2YWx1ZSZndDt0Y3AmbHQ7L3ZhbHVlJmd0OworICogICAmbHQ7L3BhcmFtZXRlciZndDsgCisgKiAgICZsdDtwYXJhbWV0ZXImZ3Q7CisgKiAgICAgJmx0O25hbWUmZ3Q7ZGF0YWJhc2VOYW1lJmx0Oy9uYW1lJmd0OworICogICAgICZsdDt2YWx1ZSZndDtYWFhYJmx0Oy92YWx1ZSZndDsKKyAqICAgJmx0Oy9wYXJhbWV0ZXImZ3Q7CisgKiAgICZsdDtwYXJhbWV0ZXImZ3Q7CisgKiAgICAgJmx0O25hbWUmZ3Q7cG9ydE51bWJlciZsdDsvbmFtZSZndDsKKyAqICAgICAmbHQ7dmFsdWUmZ3Q7Tk5OTiZsdDsvdmFsdWUmZ3Q7CisgKiAgICZsdDsvcGFyYW1ldGVyJmd0OworICogICAmbHQ7cGFyYW1ldGVyJmd0OworICogICAgICZsdDtuYW1lJmd0O3VzZXImbHQ7L25hbWUmZ3Q7CisgKiAgICAgJmx0O3ZhbHVlJmd0O1hYWFgmbHQ7L3ZhbHVlJmd0OworICogICAmbHQ7L3BhcmFtZXRlciZndDsKKyAqICAgJmx0O3BhcmFtZXRlciZndDsKKyAqICAgICAmbHQ7bmFtZSZndDtwYXNzd29yZCZsdDsvbmFtZSZndDsKKyAqICAgICAmbHQ7dmFsdWUmZ3Q7WFhYWCZsdDsvdmFsdWUmZ3Q7CisgKiAgICZsdDsvcGFyYW1ldGVyJmd0OworICogICAmbHQ7cGFyYW1ldGVyJmd0OworICogICAgICZsdDtuYW1lJmd0O21heExpbWl0Jmx0Oy9uYW1lJmd0OworICogICAgICZsdDt2YWx1ZSZndDs1Jmx0Oy92YWx1ZSZndDsKKyAqICAgJmx0Oy9wYXJhbWV0ZXImZ3Q7CisgKiAmbHQ7L1Jlc291cmNlUGFyYW1zJmd0OworICogPC9wcmU+CisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YW5lciBhdCBuY3N0ZWNoLmNvbSI+QW5lciBQZXJlejwvYT4KKyAqLworcHVibGljIGNsYXNzIEJlYW5GYWN0b3J5CisgICAgaW1wbGVtZW50cyBPYmplY3RGYWN0b3J5IHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPYmplY3RGYWN0b3J5IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEJlYW4gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIG9iaiBUaGUgcmVmZXJlbmNlIG9iamVjdCBkZXNjcmliaW5nIHRoZSBCZWFuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3RJbnN0YW5jZShPYmplY3Qgb2JqLCBOYW1lIG5hbWUsIENvbnRleHQgbmFtZUN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBlbnZpcm9ubWVudCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlUmVmKSB7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIG9iajsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYmVhbkNsYXNzTmFtZSA9IHJlZi5nZXRDbGFzc05hbWUoKTsKKyAgICAgICAgICAgICAgICBDbGFzcyBiZWFuQ2xhc3MgPSBudWxsOworICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIHRjbCA9IAorICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgICAgIGlmICh0Y2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmVhbkNsYXNzID0gdGNsLmxvYWRDbGFzcyhiZWFuQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiZWFuQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGJlYW5DbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYmVhbkNsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgKCJDbGFzcyBub3QgZm91bmQ6ICIgKyBiZWFuQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQmVhbkluZm8gYmkgPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oYmVhbkNsYXNzKTsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBwZGEgPSBiaS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgT2JqZWN0IGJlYW4gPSBiZWFuQ2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gcmVmLmdldEFsbCgpOworICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBSZWZBZGRyIHJhID0gKFJlZkFkZHIpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gcmEuZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lLmVxdWFscyhDb25zdGFudHMuRkFDVE9SWSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BOYW1lLmVxdWFscygic2NvcGUiKSB8fCBwcm9wTmFtZS5lcXVhbHMoImF1dGgiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpcmEuZ2V0Q29udGVudCgpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gdmFsdWVBcnJheSA9IG5ldyBPYmplY3RbMV07CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGk8cGRhLmxlbmd0aDsgaSsrKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZGFbaV0uZ2V0TmFtZSgpLmVxdWFscyhwcm9wTmFtZSkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHByb3BUeXBlID0gcGRhW2ldLmdldFByb3BlcnR5VHlwZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BUeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyYXlbMF0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BUeXBlLmVxdWFscyhDaGFyYWN0ZXIuY2xhc3MpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcHJvcFR5cGUuZXF1YWxzKGNoYXIuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyYXlbMF0gPSBuZXcgQ2hhcmFjdGVyKHZhbHVlLmNoYXJBdCgwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wVHlwZS5lcXVhbHMoQnl0ZS5jbGFzcykgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwcm9wVHlwZS5lcXVhbHMoYnl0ZS5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnJheVswXSA9IG5ldyBCeXRlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BUeXBlLmVxdWFscyhTaG9ydC5jbGFzcykgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwcm9wVHlwZS5lcXVhbHMoc2hvcnQuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyYXlbMF0gPSBuZXcgU2hvcnQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcFR5cGUuZXF1YWxzKEludGVnZXIuY2xhc3MpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcHJvcFR5cGUuZXF1YWxzKGludC5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnJheVswXSA9IG5ldyBJbnRlZ2VyKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BUeXBlLmVxdWFscyhMb25nLmNsYXNzKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHByb3BUeXBlLmVxdWFscyhsb25nLmNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFycmF5WzBdID0gbmV3IExvbmcodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcFR5cGUuZXF1YWxzKEZsb2F0LmNsYXNzKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHByb3BUeXBlLmVxdWFscyhmbG9hdC5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnJheVswXSA9IG5ldyBGbG9hdCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wVHlwZS5lcXVhbHMoRG91YmxlLmNsYXNzKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHByb3BUeXBlLmVxdWFscyhkb3VibGUuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyYXlbMF0gPSBuZXcgRG91YmxlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BUeXBlLmVxdWFscyhCb29sZWFuLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcHJvcFR5cGUuZXF1YWxzKGJvb2xlYW4uY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyYXlbMF0gPSBuZXcgQm9vbGVhbih2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJTdHJpbmcgY29udmVyc2lvbiBmb3IgcHJvcGVydHkgdHlwZSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvcFR5cGUuZ2V0TmFtZSgpICsgIicgbm90IGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2Qgc2V0UHJvcCA9IHBkYVtpXS5nZXRXcml0ZU1ldGhvZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXRQcm9wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvcC5pbnZva2UoYmVhbiwgdmFsdWVBcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJXcml0ZSBub3QgYWxsb3dlZCBmb3IgcHJvcGVydHk6ICIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9wTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gcGRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiTm8gc2V0IG1ldGhvZCBmb3VuZCBmb3IgcHJvcGVydHk6ICIgKyBwcm9wTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBiZWFuOworCisgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgICAgICBOYW1pbmdFeGNlcHRpb24gbmUgPSBuZXcgTmFtaW5nRXhjZXB0aW9uKGllLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgbmUuc2V0Um9vdENhdXNlKGllKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgIE5hbWluZ0V4Y2VwdGlvbiBuZSA9IG5ldyBOYW1pbmdFeGNlcHRpb24oaWFlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgbmUuc2V0Um9vdENhdXNlKGlhZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmU7CisgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZTIpIHsKKyAgICAgICAgICAgICAgICBOYW1pbmdFeGNlcHRpb24gbmUgPSBuZXcgTmFtaW5nRXhjZXB0aW9uKGllMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIG5lLnNldFJvb3RDYXVzZShpZTIpOworICAgICAgICAgICAgICAgIHRocm93IG5lOworICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKKyAgICAgICAgICAgICAgICBOYW1pbmdFeGNlcHRpb24gbmUgPSBuZXcgTmFtaW5nRXhjZXB0aW9uKGl0ZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIG5lLnNldFJvb3RDYXVzZShpdGUpOworICAgICAgICAgICAgICAgIHRocm93IG5lOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L0NvbnN0YW50cy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYjEwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcuZmFjdG9yeTsKKworCisvKioKKyAqIFN0YXRpYyBjb25zdGFudHMgZm9yIHRoaXMgcGFja2FnZS4KKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhY2thZ2UgPSAib3JnLmFwYWNoZS5uYW1pbmcuZmFjdG9yeSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFU09VUkNFX0ZBQ1RPUlkgPSAKKyAgICAgICAgUGFja2FnZSArICIuUmVzb3VyY2VGYWN0b3J5IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVTT1VSQ0VfTElOS19GQUNUT1JZID0gCisgICAgICAgIFBhY2thZ2UgKyAiLlJlc291cmNlTGlua0ZhY3RvcnkiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UUkFOU0FDVElPTl9GQUNUT1JZID0gCisgICAgICAgIFBhY2thZ2UgKyAiLlRyYW5zYWN0aW9uRmFjdG9yeSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFU09VUkNFX0VOVl9GQUNUT1JZID0gCisgICAgICAgIFBhY2thZ2UgKyAiLlJlc291cmNlRW52RmFjdG9yeSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VKQl9GQUNUT1JZID0gCisgICAgICAgIFBhY2thZ2UgKyAiLkVqYkZhY3RvcnkiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJDUF9EQVRBU09VUkNFX0ZBQ1RPUlkgPSAKKyAgICAgICAgIm9yZy5hcGFjaGUudG9tY2F0LmRiY3AuZGJjcC5CYXNpY0RhdGFTb3VyY2VGYWN0b3J5IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5FSkJfRUpCX0ZBQ1RPUlkgPSAKKyAgICAgICAgUGFja2FnZSArICIuT3BlbkVqYkZhY3RvcnkiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX0ZBQ1RPUklFUyA9ICIiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDVE9SWSA9ICJmYWN0b3J5IjsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L0VqYkZhY3RvcnkuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9FamJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxOTVmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9FamJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLmZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5Jbml0aWFsQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZlcmVuY2U7CitpbXBvcnQgamF2YXgubmFtaW5nLlJlZkFkZHI7CitpbXBvcnQgamF2YXgubmFtaW5nLnNwaS5PYmplY3RGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLkVqYlJlZjsKKworLyoqCisgKiBPYmplY3QgZmFjdG9yeSBmb3IgRUpCcy4KKyAqIAorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRWpiRmFjdG9yeQorICAgIGltcGxlbWVudHMgT2JqZWN0RmFjdG9yeSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPYmplY3RGYWN0b3J5IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ3JldGUgYSBuZXcgRUpCIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmogVGhlIHJlZmVyZW5jZSBvYmplY3QgZGVzY3JpYmluZyB0aGUgRGF0YVNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0SW5zdGFuY2UoT2JqZWN0IG9iaiwgTmFtZSBuYW1lLCBDb250ZXh0IG5hbWVDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgZW52aXJvbm1lbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEVqYlJlZikgeworICAgICAgICAgICAgUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIG9iajsKKworICAgICAgICAgICAgLy8gSWYgZWpiLWxpbmsgaGFzIGJlZW4gc3BlY2lmaWVkLCByZXNvbHZpbmcgdGhlIGxpbmsgdXNpbmcgSk5ESQorICAgICAgICAgICAgUmVmQWRkciBsaW5rUmVmQWRkciA9IHJlZi5nZXQoRWpiUmVmLkxJTkspOworICAgICAgICAgICAgaWYgKGxpbmtSZWZBZGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBSZXRyaWV2aW5nIHRoZSBFSkIgbGluaworICAgICAgICAgICAgICAgIFN0cmluZyBlamJMaW5rID0gbGlua1JlZkFkZHIuZ2V0Q29udGVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgT2JqZWN0IGJlYW5PYmogPSAobmV3IEluaXRpYWxDb250ZXh0KCkpLmxvb2t1cChlamJMaW5rKTsKKyAgICAgICAgICAgICAgICAvLyBMb2FkIGhvbWUgaW50ZXJmYWNlIGFuZCBjaGVja2luZyBpZiBiZWFuIGNvcnJlY3RseQorICAgICAgICAgICAgICAgIC8vIGltcGxlbWVudHMgc3BlY2lmaWVkIGhvbWUgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICBTdHJpbmcgaG9tZUNsYXNzTmFtZSA9IHJlZi5nZXRDbGFzc05hbWUoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBDbGFzcyBob21lID0gQ2xhc3MuZm9yTmFtZShob21lQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhvbWUuaXNJbnN0YW5jZShiZWFuT2JqKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCZWFuIG9mIHR5cGUgIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJlYW5PYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGltcGxlbWVudHMgaG9tZSBpbnRlcmZhY2UgIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGhvbWUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQmVhbiBvZiB0eXBlICIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBiZWFuT2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2Vzbid0IGltcGxlbWVudCBob21lIGludGVyZmFjZSAiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaG9tZS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiQmVhbiBvZiB0eXBlICIgKyBiZWFuT2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lc24ndCBpbXBsZW1lbnQgaG9tZSBpbnRlcmZhY2UgIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBob21lLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZG4ndCBsb2FkIGhvbWUgaW50ZXJmYWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaG9tZUNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcmV0dXJuIGJlYW5PYmo7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7CisgICAgICAgICAgICBSZWZBZGRyIGZhY3RvcnlSZWZBZGRyID0gcmVmLmdldChDb25zdGFudHMuRkFDVE9SWSk7CisgICAgICAgICAgICBpZiAoZmFjdG9yeVJlZkFkZHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFVzaW5nIHRoZSBzcGVjaWZpZWQgZmFjdG9yeQorICAgICAgICAgICAgICAgIFN0cmluZyBmYWN0b3J5Q2xhc3NOYW1lID0gCisgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlSZWZBZGRyLmdldENvbnRlbnQoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIC8vIExvYWRpbmcgZmFjdG9yeQorICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIHRjbCA9IAorICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgICAgIENsYXNzIGZhY3RvcnlDbGFzcyA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKHRjbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Q2xhc3MgPSB0Y2wubG9hZENsYXNzKGZhY3RvcnlDbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nRXhjZXB0aW9uIGV4ID0gbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiQ291bGQgbm90IGxvYWQgcmVzb3VyY2UgZmFjdG9yeSBjbGFzcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgZXguaW5pdENhdXNlKGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzID0gQ2xhc3MuZm9yTmFtZShmYWN0b3J5Q2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWluZ0V4Y2VwdGlvbiBleCA9IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkNvdWxkIG5vdCBsb2FkIHJlc291cmNlIGZhY3RvcnkgY2xhc3MiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4LmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5Q2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSA9IChPYmplY3RGYWN0b3J5KSBmYWN0b3J5Q2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgamF2YXhFamJGYWN0b3J5Q2xhc3NOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5lamIuRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuT1BFTkVKQl9FSkJfRkFDVE9SWSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSA9IChPYmplY3RGYWN0b3J5KQorICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShqYXZheEVqYkZhY3RvcnlDbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIE5hbWluZ0V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChOYW1pbmdFeGNlcHRpb24pIHQ7CisgICAgICAgICAgICAgICAgICAgIE5hbWluZ0V4Y2VwdGlvbiBleCA9IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICgiQ291bGQgbm90IGNyZWF0ZSByZXNvdXJjZSBmYWN0b3J5IGluc3RhbmNlIik7CisgICAgICAgICAgICAgICAgICAgIGV4LmluaXRDYXVzZSh0KTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0T2JqZWN0SW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgKG9iaiwgbmFtZSwgbmFtZUN0eCwgZW52aXJvbm1lbnQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSByZXNvdXJjZSBpbnN0YW5jZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9NYWlsU2Vzc2lvbkZhY3RvcnkuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9NYWlsU2Vzc2lvbkZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWZjZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L01haWxTZXNzaW9uRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5mYWN0b3J5OworCitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZheC5tYWlsLkF1dGhlbnRpY2F0b3I7CitpbXBvcnQgamF2YXgubWFpbC5QYXNzd29yZEF1dGhlbnRpY2F0aW9uOworaW1wb3J0IGphdmF4Lm1haWwuU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmQWRkcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmZXJlbmNlOworaW1wb3J0IGphdmF4Lm5hbWluZy5zcGkuT2JqZWN0RmFjdG9yeTsKKworLyoqCisgKiA8cD5GYWN0b3J5IGNsYXNzIHRoYXQgY3JlYXRlcyBhIEpOREkgbmFtZWQgSmF2YU1haWwgU2Vzc2lvbiBmYWN0b3J5LAorICogd2hpY2ggY2FuIGJlIHVzZWQgZm9yIG1hbmFnaW5nIGluYm91bmQgYW5kIG91dGJvdW5kIGVsZWN0cm9uaWMgbWFpbAorICogbWVzc2FnZXMgdmlhIEphdmFNYWlsIEFQSXMuICBBbGwgbWVzc2FnaW5nIGVudmlyb25tZW50IHByb3BlcnRpZXMKKyAqIGRlc2NyaWJlZCBpbiB0aGUgSmF2YU1haWwgU3BlY2lmaWNhdGlvbiBtYXkgYmUgcGFzc2VkIHRvIHRoZSBTZXNzaW9uCisgKiBmYWN0b3J5OyBob3dldmVyIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBhcmUgdGhlIG1vc3QgY29tbW9ubHkgdXNlZDo8L3A+CisgKiA8dWw+CisgKiA8bGk+CisgKiA8bGk+PHN0cm9uZz5tYWlsLnNtdHAuaG9zdDwvc3Ryb25nPiAtIEhvc3RuYW1lIGZvciBvdXRib3VuZCB0cmFuc3BvcnQKKyAqICAgICBjb25uZWN0aW9ucy4gIERlZmF1bHRzIHRvIDxjb2RlPmxvY2FsaG9zdDwvY29kZT4gaWYgbm90IHNwZWNpZmllZC48L2xpPgorICogPC91bD4KKyAqCisgKiA8cD5UaGlzIGZhY3RvcnkgY2FuIGJlIGNvbmZpZ3VyZWQgaW4gYSA8Y29kZT4mbHQ7RGVmYXVsdENvbnRleHQmZ3Q7PC9jb2RlPgorICogb3IgPGNvZGU+Jmx0O0NvbnRleHQmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHlvdXIgPGNvZGU+Y29uZi9zZXJ2ZXIueG1sPC9jb2RlPgorICogY29uZmlndXJhdGlvbiBmaWxlLiAgQW4gZXhhbXBsZSBvZiBmYWN0b3J5IGNvbmZpZ3VyYXRpb24gaXM6PC9wPgorICogPHByZT4KKyAqICZsdDtSZXNvdXJjZSBuYW1lPSJtYWlsL3NtdHAiIGF1dGg9IkNPTlRBSU5FUiIKKyAqICAgICAgICAgICB0eXBlPSJqYXZheC5tYWlsLlNlc3Npb24iLyZndDsKKyAqICZsdDtSZXNvdXJjZVBhcmFtcyBuYW1lPSJtYWlsL3NtdHAiJmd0OworICogICAmbHQ7cGFyYW1ldGVyJmd0OworICogICAgICZsdDtuYW1lJmd0O2ZhY3RvcnkmbHQ7L25hbWUmZ3Q7CisgKiAgICAgJmx0O3ZhbHVlJmd0O29yZy5hcGFjaGUubmFtaW5nLmZhY3RvcnkuTWFpbFNlc3Npb25GYWN0b3J5Jmx0Oy92YWx1ZSZndDsKKyAqICAgJmx0Oy9wYXJhbWV0ZXImZ3Q7CisgKiAgICZsdDtwYXJhbWV0ZXImZ3Q7CisgKiAgICAgJmx0O25hbWUmZ3Q7bWFpbC5zbXRwLmhvc3QmbHQ7L25hbWUmZ3Q7CisgKiAgICAgJmx0O3ZhbHVlJmd0O21haWwubXljb21wYW55LmNvbSZsdDsvdmFsdWUmZ3Q7CisgKiAgICZsdDsvcGFyYW1ldGVyJmd0OworICogJmx0Oy9SZXNvdXJjZVBhcmFtcyZndDsKKyAqIDwvcHJlPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgTWFpbFNlc3Npb25GYWN0b3J5IGltcGxlbWVudHMgT2JqZWN0RmFjdG9yeSB7CisKKworICAgIC8qKgorICAgICAqIFRoZSBKYXZhIHR5cGUgZm9yIHdoaWNoIHRoaXMgZmFjdG9yeSBrbm93cyBob3cgdG8gY3JlYXRlIG9iamVjdHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmFjdG9yeVR5cGUgPSAiamF2YXgubWFpbC5TZXNzaW9uIjsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjaGFyYWN0ZXJpc3RpY3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVmT2JqIFJlZmVyZW5jZSBpbmZvcm1hdGlvbiBjb250YWluaW5nIG91ciBwYXJhbWV0ZXJzLCBvciBudWxsCisgICAgICogIGlmIHRoZXJlIGFyZSBubyBwYXJhbWV0ZXJzCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyBvYmplY3QsIHJlbGF0aXZlIHRvIGNvbnRleHQsIG9yIG51bGwKKyAgICAgKiAgaWYgdGhlcmUgaXMgbm8gbmFtZQorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHdoaWNoIG5hbWUgaXMgcmVsYXRpdmUsIG9yIG51bGwgaWYgbmFtZQorICAgICAqICBpcyByZWxhdGl2ZSB0byB0aGUgZGVmYXVsdCBpbml0aWFsIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gZW52IEVudmlyb25tZW50IHZhcmlhYmxlcywgb3IgbnVsbCBpZiB0aGVyZSBhcmUgbm9uZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBvYmplY3QgY3JlYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdEluc3RhbmNlKE9iamVjdCByZWZPYmosIE5hbWUgbmFtZSwgQ29udGV4dCBjb250ZXh0LAorCQkJCSAgICBIYXNodGFibGUgZW52KSB0aHJvd3MgRXhjZXB0aW9uIAorICAgIHsKKworICAgICAgICAvLyBSZXR1cm4gbnVsbCBpZiB3ZSBjYW5ub3QgY3JlYXRlIGFuIG9iamVjdCBvZiB0aGUgcmVxdWVzdGVkIHR5cGUKKwlmaW5hbCBSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgcmVmT2JqOworICAgICAgICBpZiAoIXJlZi5nZXRDbGFzc05hbWUoKS5lcXVhbHMoZmFjdG9yeVR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU2Vzc2lvbiBpbnNpZGUgYSBkb1ByaXZpbGVnZWQgYmxvY2ssIHNvIHRoYXQgSmF2YU1haWwKKyAgICAgICAgLy8gY2FuIHJlYWQgaXRzIGRlZmF1bHQgcHJvcGVydGllcyB3aXRob3V0IHRocm93aW5nIFNlY3VyaXR5CisgICAgICAgIC8vIGV4Y2VwdGlvbnMuCisgICAgICAgIC8vCisgICAgICAgIC8vIEJ1Z3ppbGxhIDMxMjg4LCAzMzA3NzogYWRkIHN1cHBvcnQgZm9yIGF1dGhlbnRpY2F0aW9uLgorICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgeworCQlwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIEphdmFNYWlsIHByb3BlcnRpZXMgd2Ugd2lsbCB1c2UKKyAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgICAgIHByb3BzLnB1dCgibWFpbC50cmFuc3BvcnQucHJvdG9jb2wiLCAic210cCIpOworICAgICAgICAgICAgICAgICAgICBwcm9wcy5wdXQoIm1haWwuc210cC5ob3N0IiwgImxvY2FsaG9zdCIpOworCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gYXR0cnMgPSByZWYuZ2V0QWxsKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChhdHRycy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUmVmQWRkciBhdHRyID0gKFJlZkFkZHIpIGF0dHJzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoImZhY3RvcnkiLmVxdWFscyhhdHRyLmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJwYXNzd29yZCIuZXF1YWxzKGF0dHIuZ2V0VHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkID0gKFN0cmluZykgYXR0ci5nZXRDb250ZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLnB1dChhdHRyLmdldFR5cGUoKSwgKFN0cmluZykgYXR0ci5nZXRDb250ZW50KCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQXV0aGVudGljYXRvciBhdXRoID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2VyID0gcHJvcHMuZ2V0UHJvcGVydHkoIm1haWwuc210cC51c2VyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZih1c2VyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyID0gcHJvcHMuZ2V0UHJvcGVydHkoIm1haWwudXNlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZih1c2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXNzd29yZEF1dGhlbnRpY2F0aW9uIHBhID0gbmV3IFBhc3N3b3JkQXV0aGVudGljYXRpb24odXNlciwgcGFzc3dvcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGggPSBuZXcgQXV0aGVudGljYXRvcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBQYXNzd29yZEF1dGhlbnRpY2F0aW9uIGdldFBhc3N3b3JkQXV0aGVudGljYXRpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gdGhlIG5ldyBTZXNzaW9uIG9iamVjdAorICAgICAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBTZXNzaW9uLmdldEluc3RhbmNlKHByb3BzLCBhdXRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzZXNzaW9uKTsKKworCQl9CisJICAgIH0gKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvT3BlbkVqYkZhY3RvcnkuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9PcGVuRWpiRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhODhiYTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvT3BlbkVqYkZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5mYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuRWpiUmVmOworCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZlcmVuY2U7CitpbXBvcnQgamF2YXgubmFtaW5nLlJlZkFkZHI7CitpbXBvcnQgamF2YXgubmFtaW5nLnNwaS5PYmplY3RGYWN0b3J5OworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8qKgorICogT2JqZWN0IGZhY3RvcnkgZm9yIEVKQnMuCisgKiAKKyAqIEBhdXRob3IgSmFjZWsgTGFza293c2tpCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgT3BlbkVqYkZhY3RvcnkgaW1wbGVtZW50cyBPYmplY3RGYWN0b3J5IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfT1BFTkVKQl9GQUNUT1JZID0gCisgICAgICAgICJvcmcub3BlbmVqYi5jbGllbnQuTG9jYWxJbml0aWFsQ29udGV4dEZhY3RvcnkiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPYmplY3RGYWN0b3J5IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ3JldGUgYSBuZXcgRUpCIGluc3RhbmNlIHVzaW5nIE9wZW5FSkIuCisgICAgICogCisgICAgICogQHBhcmFtIG9iaiBUaGUgcmVmZXJlbmNlIG9iamVjdCBkZXNjcmliaW5nIHRoZSBEYXRhU291cmNlCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3RJbnN0YW5jZShPYmplY3Qgb2JqLCBOYW1lIG5hbWUsIENvbnRleHQgbmFtZUN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBlbnZpcm9ubWVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0IGJlYW5PYmogPSBudWxsOworCisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFamJSZWYpIHsKKworICAgICAgICAgICAgUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIG9iajsKKworICAgICAgICAgICAgU3RyaW5nIGZhY3RvcnkgPSBERUZBVUxUX09QRU5FSkJfRkFDVE9SWTsKKyAgICAgICAgICAgIFJlZkFkZHIgZmFjdG9yeVJlZkFkZHIgPSByZWYuZ2V0KCJvcGVuZWpiLmZhY3RvcnkiKTsKKyAgICAgICAgICAgIGlmIChmYWN0b3J5UmVmQWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gUmV0cmlldmluZyB0aGUgT3BlbkVKQiBmYWN0b3J5CisgICAgICAgICAgICAgICAgZmFjdG9yeSA9IGZhY3RvcnlSZWZBZGRyLmdldENvbnRlbnQoKS50b1N0cmluZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQcm9wZXJ0aWVzIGVudiA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBlbnYucHV0KENvbnRleHQuSU5JVElBTF9DT05URVhUX0ZBQ1RPUlksIGZhY3RvcnkpOworCisgICAgICAgICAgICBSZWZBZGRyIGxpbmtSZWZBZGRyID0gcmVmLmdldCgib3BlbmVqYi5saW5rIik7CisgICAgICAgICAgICBpZiAobGlua1JlZkFkZHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBlamJMaW5rID0gbGlua1JlZkFkZHIuZ2V0Q29udGVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgYmVhbk9iaiA9IChuZXcgSW5pdGlhbENvbnRleHQoZW52KSkubG9va3VwKGVqYkxpbmspOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYmVhbk9iajsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvUmVzb3VyY2VFbnZGYWN0b3J5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvUmVzb3VyY2VFbnZGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxYTI4NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9SZXNvdXJjZUVudkZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcuZmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmZXJlbmNlOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZBZGRyOworaW1wb3J0IGphdmF4Lm5hbWluZy5zcGkuT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5SZXNvdXJjZUVudlJlZjsKKworLyoqCisgKiBPYmplY3QgZmFjdG9yeSBmb3IgUmVzb3VyY2VzIGVudi4KKyAqIAorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VFbnZGYWN0b3J5CisgICAgaW1wbGVtZW50cyBPYmplY3RGYWN0b3J5IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9iamVjdEZhY3RvcnkgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDcmV0ZSBhIG5ldyBSZXNvdXJjZSBlbnYgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIG9iaiBUaGUgcmVmZXJlbmNlIG9iamVjdCBkZXNjcmliaW5nIHRoZSBEYXRhU291cmNlCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3RJbnN0YW5jZShPYmplY3Qgb2JqLCBOYW1lIG5hbWUsIENvbnRleHQgbmFtZUN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBlbnZpcm9ubWVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVzb3VyY2VFbnZSZWYpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSBvYmo7CisgICAgICAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworICAgICAgICAgICAgUmVmQWRkciBmYWN0b3J5UmVmQWRkciA9IHJlZi5nZXQoQ29uc3RhbnRzLkZBQ1RPUlkpOworICAgICAgICAgICAgaWYgKGZhY3RvcnlSZWZBZGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBVc2luZyB0aGUgc3BlY2lmaWVkIGZhY3RvcnkKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmFjdG9yeUNsYXNzTmFtZSA9IAorICAgICAgICAgICAgICAgICAgICBmYWN0b3J5UmVmQWRkci5nZXRDb250ZW50KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAvLyBMb2FkaW5nIGZhY3RvcnkKKyAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciB0Y2wgPSAKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgICAgICBDbGFzcyBmYWN0b3J5Q2xhc3MgPSBudWxsOworICAgICAgICAgICAgICAgIGlmICh0Y2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzID0gdGNsLmxvYWRDbGFzcyhmYWN0b3J5Q2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWluZ0V4Y2VwdGlvbiBleCA9IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkNvdWxkIG5vdCBsb2FkIHJlc291cmNlIGZhY3RvcnkgY2xhc3MiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4LmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlDbGFzcyA9IENsYXNzLmZvck5hbWUoZmFjdG9yeUNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOYW1pbmdFeGNlcHRpb24gZXggPSBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJDb3VsZCBub3QgbG9hZCByZXNvdXJjZSBmYWN0b3J5IGNsYXNzIik7CisgICAgICAgICAgICAgICAgICAgICAgICBleC5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeUNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkgPSAoT2JqZWN0RmFjdG9yeSkgZmFjdG9yeUNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgTmFtaW5nRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChOYW1pbmdFeGNlcHRpb24pIHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBOYW1pbmdFeGNlcHRpb24gZXggPSBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJDb3VsZCBub3QgY3JlYXRlIHJlc291cmNlIGZhY3RvcnkgaW5zdGFuY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4LmluaXRDYXVzZSh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm90ZTogTm8gZGVmYXVsdHMgaGVyZQorICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmdldE9iamVjdEluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgIChvYmosIG5hbWUsIG5hbWVDdHgsIGVudmlyb25tZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBjcmVhdGUgcmVzb3VyY2UgaW5zdGFuY2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworCisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L1Jlc291cmNlRmFjdG9yeS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L1Jlc291cmNlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MWMwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvUmVzb3VyY2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLmZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLlJlZmVyZW5jZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmQWRkcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuc3BpLk9iamVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuUmVzb3VyY2VSZWY7CisKKy8qKgorICogT2JqZWN0IGZhY3RvcnkgZm9yIFJlc291cmNlcy4KKyAqIAorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VGYWN0b3J5CisgICAgaW1wbGVtZW50cyBPYmplY3RGYWN0b3J5IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9iamVjdEZhY3RvcnkgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDcmV0ZSBhIG5ldyBEYXRhU291cmNlIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmogVGhlIHJlZmVyZW5jZSBvYmplY3QgZGVzY3JpYmluZyB0aGUgRGF0YVNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0SW5zdGFuY2UoT2JqZWN0IG9iaiwgTmFtZSBuYW1lLCBDb250ZXh0IG5hbWVDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgZW52aXJvbm1lbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlUmVmKSB7CisgICAgICAgICAgICBSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgb2JqOworICAgICAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgICAgIFJlZkFkZHIgZmFjdG9yeVJlZkFkZHIgPSByZWYuZ2V0KENvbnN0YW50cy5GQUNUT1JZKTsKKyAgICAgICAgICAgIGlmIChmYWN0b3J5UmVmQWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVXNpbmcgdGhlIHNwZWNpZmllZCBmYWN0b3J5CisgICAgICAgICAgICAgICAgU3RyaW5nIGZhY3RvcnlDbGFzc05hbWUgPSAKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yeVJlZkFkZHIuZ2V0Q29udGVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgLy8gTG9hZGluZyBmYWN0b3J5CisgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgdGNsID0gCisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgQ2xhc3MgZmFjdG9yeUNsYXNzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAodGNsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlDbGFzcyA9IHRjbC5sb2FkQ2xhc3MoZmFjdG9yeUNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOYW1pbmdFeGNlcHRpb24gZXggPSBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJDb3VsZCBub3QgbG9hZCByZXNvdXJjZSBmYWN0b3J5IGNsYXNzIik7CisgICAgICAgICAgICAgICAgICAgICAgICBleC5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKGZhY3RvcnlDbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nRXhjZXB0aW9uIGV4ID0gbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiQ291bGQgbm90IGxvYWQgcmVzb3VyY2UgZmFjdG9yeSBjbGFzcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgZXguaW5pdENhdXNlKGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnlDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gKE9iamVjdEZhY3RvcnkpIGZhY3RvcnlDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBOYW1pbmdFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKE5hbWluZ0V4Y2VwdGlvbikgdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWluZ0V4Y2VwdGlvbiBleCA9IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgcmVzb3VyY2UgZmFjdG9yeSBpbnN0YW5jZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgZXguaW5pdENhdXNlKHQpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChyZWYuZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKCJqYXZheC5zcWwuRGF0YVNvdXJjZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXZheFNxbERhdGFTb3VyY2VGYWN0b3J5Q2xhc3NOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXguc3FsLkRhdGFTb3VyY2UuRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkRCQ1BfREFUQVNPVVJDRV9GQUNUT1JZKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkgPSAoT2JqZWN0RmFjdG9yeSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShqYXZheFNxbERhdGFTb3VyY2VGYWN0b3J5Q2xhc3NOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nRXhjZXB0aW9uIGV4ID0gbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiQ291bGQgbm90IGNyZWF0ZSByZXNvdXJjZSBmYWN0b3J5IGluc3RhbmNlIik7CisgICAgICAgICAgICAgICAgICAgICAgICBleC5pbml0Q2F1c2UodCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVmLmdldENsYXNzTmFtZSgpLmVxdWFscygiamF2YXgubWFpbC5TZXNzaW9uIikpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGphdmF4TWFpbFNlc3Npb25GYWN0b3J5Q2xhc3NOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgubWFpbC5TZXNzaW9uLkZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm5hbWluZy5mYWN0b3J5Lk1haWxTZXNzaW9uRmFjdG9yeSIpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSA9IChPYmplY3RGYWN0b3J5KSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKGphdmF4TWFpbFNlc3Npb25GYWN0b3J5Q2xhc3NOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOYW1pbmdFeGNlcHRpb24gZXggPSBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJDb3VsZCBub3QgY3JlYXRlIHJlc291cmNlIGZhY3RvcnkgaW5zdGFuY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4LmluaXRDYXVzZSh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmdldE9iamVjdEluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgIChvYmosIG5hbWUsIG5hbWVDdHgsIGVudmlyb25tZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBjcmVhdGUgcmVzb3VyY2UgaW5zdGFuY2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvUmVzb3VyY2VMaW5rRmFjdG9yeS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L1Jlc291cmNlTGlua0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWJiY2UyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L1Jlc291cmNlTGlua0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcuZmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZBZGRyOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZlcmVuY2U7CitpbXBvcnQgamF2YXgubmFtaW5nLnNwaS5PYmplY3RGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuUmVzb3VyY2VMaW5rUmVmOworCisKKy8qKgorICogPHA+T2JqZWN0IGZhY3RvcnkgZm9yIHJlc291cmNlIGxpbmtzLjwvcD4KKyAqIAorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VMaW5rRmFjdG9yeQorICAgIGltcGxlbWVudHMgT2JqZWN0RmFjdG9yeSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YXRpYyBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogR2xvYmFsIG5hbWluZyBjb250ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENvbnRleHQgZ2xvYmFsQ29udGV4dCA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdsb2JhbCBjb250ZXh0IChub3RlOiBjYW4gb25seSBiZSB1c2VkIG9uY2UpLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuZXdHbG9iYWxDb250ZXh0IG5ldyBnbG9iYWwgY29udGV4dCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRHbG9iYWxDb250ZXh0KENvbnRleHQgbmV3R2xvYmFsQ29udGV4dCkgeworICAgICAgICBpZiAoZ2xvYmFsQ29udGV4dCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBnbG9iYWxDb250ZXh0ID0gbmV3R2xvYmFsQ29udGV4dDsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9iamVjdEZhY3RvcnkgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgRGF0YVNvdXJjZSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqIFRoZSByZWZlcmVuY2Ugb2JqZWN0IGRlc2NyaWJpbmcgdGhlIERhdGFTb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdEluc3RhbmNlKE9iamVjdCBvYmosIE5hbWUgbmFtZSwgQ29udGV4dCBuYW1lQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIGVudmlyb25tZW50KQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlTGlua1JlZikpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBDYW4gd2UgcHJvY2VzcyB0aGlzIHJlcXVlc3Q/CisgICAgICAgIFJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSBvYmo7CisKKyAgICAgICAgU3RyaW5nIHR5cGUgPSByZWYuZ2V0Q2xhc3NOYW1lKCk7CisKKyAgICAgICAgLy8gUmVhZCB0aGUgZ2xvYmFsIHJlZiBhZGRyCisgICAgICAgIFN0cmluZyBnbG9iYWxOYW1lID0gbnVsbDsKKyAgICAgICAgUmVmQWRkciByZWZBZGRyID0gcmVmLmdldChSZXNvdXJjZUxpbmtSZWYuR0xPQkFMTkFNRSk7CisgICAgICAgIGlmIChyZWZBZGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdsb2JhbE5hbWUgPSByZWZBZGRyLmdldENvbnRlbnQoKS50b1N0cmluZygpOworICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICByZXN1bHQgPSBnbG9iYWxDb250ZXh0Lmxvb2t1cChnbG9iYWxOYW1lKTsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBDaGVjayB0eXBlCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L1NlbmRNYWlsRmFjdG9yeS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L1NlbmRNYWlsRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZDk5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvU2VuZE1haWxGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLmZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm1haWwuU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5tYWlsLmludGVybmV0LkludGVybmV0QWRkcmVzczsKK2ltcG9ydCBqYXZheC5tYWlsLmludGVybmV0Lk1pbWVNZXNzYWdlOworaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuTWltZVBhcnQ7CitpbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lUGFydERhdGFTb3VyY2U7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLlJlZmVyZW5jZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmQWRkcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuc3BpLk9iamVjdEZhY3Rvcnk7CisKKy8qKgorICogRmFjdG9yeSBjbGFzcyB0aGF0IGNyZWF0ZXMgYSBKTkRJIG5hbWVkIGphdmFtYWlsIE1pbWVQYXJ0RGF0YVNvdXJjZQorICogb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIGZvciBzZW5kaW5nIGVtYWlsIHVzaW5nIFNNVFAuCisgKiA8cD4KKyAqIENhbiBiZSBjb25maWd1cmVkIGluIHRoZSBEZWZhdWx0Q29udGV4dCBvciBDb250ZXh0IHNjb3BlCisgKiBvZiB5b3VyIHNlcnZlci54bWwgY29uZmlndXJhdGlvbiBmaWxlLgorICogPHA+CisgKiBFeGFtcGxlOgorICogPHA+CisgKiA8cHJlPgorICogJmx0O1Jlc291cmNlIG5hbWU9Im1haWwvc2VuZCIgYXV0aD0iQ09OVEFJTkVSIgorICogICAgICAgICAgIHR5cGU9ImphdmF4Lm1haWwuaW50ZXJuZXQuTWltZVBhcnREYXRhU291cmNlIi8+CisgKiAmbHQ7UmVzb3VyY2VQYXJhbXMgbmFtZT0ibWFpbC9zZW5kIj4KKyAqICAgJmx0O3BhcmFtZXRlcj4mbHQ7bmFtZT5mYWN0b3J5Jmx0Oy9uYW1lPgorICogICAgICZsdDt2YWx1ZT5vcmcuYXBhY2hlLm5hbWluZy5mYWN0b3J5LlNlbmRNYWlsRmFjdG9yeSZsdDsvdmFsdWU+CisgKiAgICZsdDsvcGFyYW1ldGVyPgorICogICAmbHQ7cGFyYW1ldGVyPiZsdDtuYW1lPm1haWwuc210cC5ob3N0Jmx0Oy9uYW1lPgorICogICAgICZsdDt2YWx1ZT55b3VyLnNtdHAuaG9zdCZsdDsvdmFsdWU+CisgKiAgICZsdDsvcGFyYW1ldGVyPgorICogICAmbHQ7cGFyYW1ldGVyPiZsdDtuYW1lPm1haWwuc210cC51c2VyJmx0Oy9uYW1lPgorICogICAgICZsdDt2YWx1ZT5zb21ldXNlciZsdDsvdmFsdWU+CisgKiAgICZsdDsvcGFyYW1ldGVyPgorICogICAmbHQ7cGFyYW1ldGVyPiZsdDtuYW1lPm1haWwuZnJvbSZsdDsvbmFtZT4KKyAqICAgICAmbHQ7dmFsdWU+c29tZXVzZXJAc29tZS5ob3N0Jmx0Oy92YWx1ZT4KKyAqICAgJmx0Oy9wYXJhbWV0ZXI+CisgKiAgICZsdDtwYXJhbWV0ZXI+Jmx0O25hbWU+bWFpbC5zbXRwLnNlbmRwYXJ0aWFsJmx0Oy9uYW1lPgorICogICAgICZsdDt2YWx1ZT50cnVlJmx0Oy92YWx1ZT4KKyAqICAgJmx0Oy9wYXJhbWV0ZXI+CisgKiAgJmx0O3BhcmFtZXRlcj4mbHQ7bmFtZT5tYWlsLnNtdHAuZHNuLm5vdGlmeSZsdDsvbmFtZT4KKyAqICAgICAmbHQ7dmFsdWU+RkFJTFVSRSZsdDsvdmFsdWU+CisgKiAgICZsdDsvcGFyYW1ldGVyPgorICogICAmbHQ7cGFyYW1ldGVyPiZsdDtuYW1lPm1haWwuc210cC5kc24ucmV0Jmx0Oy9uYW1lPgorICogICAgICZsdDt2YWx1ZT5GVUxMJmx0Oy92YWx1ZT4KKyAqICAgJmx0Oy9wYXJhbWV0ZXI+CisgKiAmbHQ7L1Jlc291cmNlUGFyYW1zPgorICogPC9wcmU+CisgKgorICogQGF1dGhvciBHbGVubiBOaWVsc2VuIFJpY2ggQ2F0bGV0dAorICovCisKK3B1YmxpYyBjbGFzcyBTZW5kTWFpbEZhY3RvcnkgaW1wbGVtZW50cyBPYmplY3RGYWN0b3J5IAoreworICAgIC8vIFRoZSBjbGFzcyBuYW1lIGZvciB0aGUgamF2YW1haWwgTWltZU1lc3NhZ2VEYXRhU291cmNlCisgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBEYXRhU291cmNlQ2xhc3NOYW1lID0gCisJImphdmF4Lm1haWwuaW50ZXJuZXQuTWltZVBhcnREYXRhU291cmNlIjsKKworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0SW5zdGFuY2UoT2JqZWN0IFJlZk9iaiwgTmFtZSBObSwgQ29udGV4dCBDdHgsCisJCQkJICAgIEhhc2h0YWJsZSBFbnYpIHRocm93cyBFeGNlcHRpb24gCisgICAgeworCWZpbmFsIFJlZmVyZW5jZSBSZWYgPSAoUmVmZXJlbmNlKVJlZk9iajsKKworCS8vIENyZWF0aW9uIG9mIHRoZSBEYXRhU291cmNlIGlzIHdyYXBwZWQgaW5zaWRlIGEgZG9Qcml2aWxlZ2VkCisJLy8gc28gdGhhdCBqYXZhbWFpbCBjYW4gcmVhZCBpdHMgZGVmYXVsdCBwcm9wZXJ0aWVzIHdpdGhvdXQKKwkvLyB0aHJvd2luZyBTZWN1cml0eSBFeGNlcHRpb25zCisJaWYgKFJlZi5nZXRDbGFzc05hbWUoKS5lcXVhbHMoRGF0YVNvdXJjZUNsYXNzTmFtZSkpIHsKKwkgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKCBuZXcgUHJpdmlsZWdlZEFjdGlvbigpCisJICAgIHsKKwkJcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgIAkgICAgLy8gc2V0IHVwIHRoZSBzbXRwIHNlc3Npb24gdGhhdCB3aWxsIHNlbmQgdGhlIG1lc3NhZ2UKKwkgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKwkJICAgIC8vIGVudW1lcmF0aW9uIG9mIGFsbCByZWZhZGRyCisJCSAgICBFbnVtZXJhdGlvbiBsaXN0ID0gUmVmLmdldEFsbCgpOworCQkgICAgLy8gY3VycmVudCByZWZhZGRyIHRvIGJlIHNldAorCQkgICAgUmVmQWRkciByZWZhZGRyOworCSAgICAgICAgICAgIC8vIHNldCB0cmFuc3BvcnQgdG8gc210cAorCSAgICAgICAgICAgIHByb3BzLnB1dCgibWFpbC50cmFuc3BvcnQucHJvdG9jb2wiLCAic210cCIpOworCisJCSAgICB3aGlsZSAobGlzdC5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJcmVmYWRkciA9IChSZWZBZGRyKWxpc3QubmV4dEVsZW1lbnQoKTsKKworCQkJLy8gc2V0IHByb3BlcnR5CisJCQlwcm9wcy5wdXQocmVmYWRkci5nZXRUeXBlKCksIChTdHJpbmcpcmVmYWRkci5nZXRDb250ZW50KCkpOworCQkgICAgfQorCQkgICAgTWltZU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNaW1lTWVzc2FnZSgKKwkJCVNlc3Npb24uZ2V0SW5zdGFuY2UocHJvcHMpKTsKKwkJICAgIHRyeSB7CisJCQlTdHJpbmcgZnJvbSA9IChTdHJpbmcpUmVmLmdldCgibWFpbC5mcm9tIikuZ2V0Q29udGVudCgpOworCQkgICAgICAgIG1lc3NhZ2Uuc2V0RnJvbShuZXcgSW50ZXJuZXRBZGRyZXNzKGZyb20pKTsKKwkJICAgICAgICBtZXNzYWdlLnNldFN1YmplY3QoIiIpOworCQkgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisJCSAgICBNaW1lUGFydERhdGFTb3VyY2UgbWRzID0gbmV3IE1pbWVQYXJ0RGF0YVNvdXJjZSgKKwkJCShNaW1lUGFydCltZXNzYWdlKTsKKwkJICAgIHJldHVybiBtZHM7CisJCX0KKwkgICAgfSApOworCX0KKwllbHNlIHsgLy8gV2UgY2FuJ3QgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBEYXRhU291cmNlCisJICAgIHJldHVybiBudWxsOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvVHJhbnNhY3Rpb25GYWN0b3J5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvVHJhbnNhY3Rpb25GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU0MWYxNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9UcmFuc2FjdGlvbkZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcuZmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmZXJlbmNlOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZBZGRyOworaW1wb3J0IGphdmF4Lm5hbWluZy5zcGkuT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5UcmFuc2FjdGlvblJlZjsKKworLyoqCisgKiBPYmplY3QgZmFjdG9yeSBmb3IgVXNlciB0cmFzYWN0aW9ucy4KKyAqIAorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVHJhbnNhY3Rpb25GYWN0b3J5CisgICAgaW1wbGVtZW50cyBPYmplY3RGYWN0b3J5IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9iamVjdEZhY3RvcnkgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDcmV0ZSBhIG5ldyBVc2VyIHRyYW5zYWN0aW9uIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmogVGhlIHJlZmVyZW5jZSBvYmplY3QgZGVzY3JpYmluZyB0aGUgRGF0YVNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0SW5zdGFuY2UoT2JqZWN0IG9iaiwgTmFtZSBuYW1lLCBDb250ZXh0IG5hbWVDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgZW52aXJvbm1lbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uUmVmKSB7CisgICAgICAgICAgICBSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgb2JqOworICAgICAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgICAgIFJlZkFkZHIgZmFjdG9yeVJlZkFkZHIgPSByZWYuZ2V0KENvbnN0YW50cy5GQUNUT1JZKTsKKyAgICAgICAgICAgIGlmIChmYWN0b3J5UmVmQWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVXNpbmcgdGhlIHNwZWNpZmllZCBmYWN0b3J5CisgICAgICAgICAgICAgICAgU3RyaW5nIGZhY3RvcnlDbGFzc05hbWUgPSAKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yeVJlZkFkZHIuZ2V0Q29udGVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgLy8gTG9hZGluZyBmYWN0b3J5CisgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgdGNsID0gCisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgQ2xhc3MgZmFjdG9yeUNsYXNzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAodGNsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlDbGFzcyA9IHRjbC5sb2FkQ2xhc3MoZmFjdG9yeUNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOYW1pbmdFeGNlcHRpb24gZXggPSBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJDb3VsZCBub3QgbG9hZCByZXNvdXJjZSBmYWN0b3J5IGNsYXNzIik7CisgICAgICAgICAgICAgICAgICAgICAgICBleC5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKGZhY3RvcnlDbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nRXhjZXB0aW9uIGV4ID0gbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiQ291bGQgbm90IGxvYWQgcmVzb3VyY2UgZmFjdG9yeSBjbGFzcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgZXguaW5pdENhdXNlKGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnlDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gKE9iamVjdEZhY3RvcnkpIGZhY3RvcnlDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIE5hbWluZ0V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoTmFtaW5nRXhjZXB0aW9uKSB0OworICAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nRXhjZXB0aW9uIGV4ID0gbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiQ291bGQgbm90IGNyZWF0ZSByZXNvdXJjZSBmYWN0b3J5IGluc3RhbmNlIik7CisgICAgICAgICAgICAgICAgICAgICAgICBleC5pbml0Q2F1c2UodCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRPYmplY3RJbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAob2JqLCBuYW1lLCBuYW1lQ3R4LCBlbnZpcm9ubWVudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIHJlc291cmNlIGluc3RhbmNlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIAorICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9wYWNrYWdlLmh0bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOGNiMDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsNyBAQAorPGJvZHk+CisKKzxwPlRoaXMgcGFja2FnZSBjb250YWlucyBvYmplY3QgZmFjdG9yaWVzIHVzZWQgYnkgdGhlIG5hbWluZyBzZXJ2aWNlLjwvcD4KKworPHA+PC9wPgorCis8L2JvZHk+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2phdmEvamF2YVVSTENvbnRleHRGYWN0b3J5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2phdmEvamF2YVVSTENvbnRleHRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3NTllOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvamF2YS9qYXZhVVJMQ29udGV4dEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuc3BpLk9iamVjdEZhY3Rvcnk7CitpbXBvcnQgamF2YXgubmFtaW5nLnNwaS5Jbml0aWFsQ29udGV4dEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuU2VsZWN0b3JDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLk5hbWluZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuQ29udGV4dEJpbmRpbmdzOworCisvKioKKyAqIENvbnRleHQgZmFjdG9yeSBmb3IgdGhlICJqYXZhOiIgbmFtZXNwYWNlLgorICogPHA+CisgKiA8Yj5JbXBvcnRhbnQgbm90ZTwvYj4gOiBUaGlzIGZhY3RvcnkgTVVTVCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlICJqYXZhIiBVUkwKKyAqIHByZWZpeCwgd2hpY2ggY2FuIGJlIGRvbmUgYnkgZWl0aGVyIDoKKyAqIDx1bD4KKyAqIDxsaT5BZGRpbmcgYSAKKyAqIGphdmEubmFtaW5nLmZhY3RvcnkudXJsLnBrZ3M9b3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLm5hbWluZyBwcm9wZXJ0eQorICogdG8gdGhlIEpOREkgcHJvcGVydGllcyBmaWxlPC9saT4KKyAqIDxsaT5TZXR0aW5nIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVkIENvbnRleHQuVVJMX1BLR19QUkVGSVhFUyB3aXRoIAorICogaXRzIHZhbHVlIGluY2x1ZGluZyB0aGUgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLm5hbWluZyBwYWNrYWdlIG5hbWUuIAorICogTW9yZSBkZXRhaWwgYWJvdXQgdGhpcyBjYW4gYmUgZm91bmQgaW4gdGhlIEpOREkgZG9jdW1lbnRhdGlvbiA6IAorICoge0BsaW5rIGphdmF4Lm5hbWluZy5zcGkuTmFtaW5nTWFuYWdlciNnZXRVUkxDb250ZXh0KGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5IYXNodGFibGUpfS48L2xpPgorICogPC91bD4KKyAqIAorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgamF2YVVSTENvbnRleHRGYWN0b3J5CisgICAgaW1wbGVtZW50cyBPYmplY3RGYWN0b3J5LCBJbml0aWFsQ29udGV4dEZhY3RvcnkgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU4gPSAiaW5pdGlhbENvbnRleHQiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogSW5pdGlhbCBjb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgQ29udGV4dCBpbml0aWFsQ29udGV4dCA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPYmplY3RGYWN0b3J5IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ3JldGUgYSBuZXcgQ29udGV4dCdzIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0SW5zdGFuY2UoT2JqZWN0IG9iaiwgTmFtZSBuYW1lLCBDb250ZXh0IG5hbWVDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgZW52aXJvbm1lbnQpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBpZiAoKENvbnRleHRCaW5kaW5ncy5pc1RocmVhZEJvdW5kKCkpIHx8IAorICAgICAgICAgICAgKENvbnRleHRCaW5kaW5ncy5pc0NsYXNzTG9hZGVyQm91bmQoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0b3JDb250ZXh0KGVudmlyb25tZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBuZXcgKHdyaXRhYmxlKSBpbml0aWFsIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIENvbnRleHQgZ2V0SW5pdGlhbENvbnRleHQoSGFzaHRhYmxlIGVudmlyb25tZW50KQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKENvbnRleHRCaW5kaW5ncy5pc1RocmVhZEJvdW5kKCkgfHwgCisgICAgICAgICAgICAoQ29udGV4dEJpbmRpbmdzLmlzQ2xhc3NMb2FkZXJCb3VuZCgpKSkgeworICAgICAgICAgICAgLy8gUmVkaXJlY3QgdGhlIHJlcXVlc3QgdG8gdGhlIGJvdW5kIGluaXRpYWwgY29udGV4dAorICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RvckNvbnRleHQoZW52aXJvbm1lbnQsIHRydWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWYgdGhlIHRocmVhZCBpcyBub3QgYm91bmQsIHJldHVybiBhIHNoYXJlZCB3cml0YWJsZSBjb250ZXh0CisgICAgICAgICAgICBpZiAoaW5pdGlhbENvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dCA9IG5ldyBOYW1pbmdDb250ZXh0KGVudmlyb25tZW50LCBNQUlOKTsKKyAgICAgICAgICAgIHJldHVybiBpbml0aWFsQ29udGV4dDsKKyAgICAgICAgfQorICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvamF2YS9wYWNrYWdlLmh0bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2phdmEvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMGY3NjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2phdmEvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsNyBAQAorPGJvZHk+CisKKzxwPlRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgVVJMIGNvbnRleHQgZmFjdG9yeSBmb3IgdGhlICJqYXZhIiBuYW1lc3BhY2UuPC9wPgorCis8cD48L3A+CisKKzwvYm9keT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcGFja2FnZS5odG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1ZjllYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsNyBAQAorPGJvZHk+CisKKzxwPlRoaXMgcGFja2FnZSBjb250YWlucyBhIG1lbW9yeSBiYXNlZCBuYW1pbmcgc2VydmljZSBwcm92aWRlci48L3A+CisKKzxwPjwvcD4KKworPC9ib2R5PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvQmFzZURpckNvbnRleHQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0Jhc2VEaXJDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmM2MwMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0Jhc2VEaXJDb250ZXh0LmphdmEKQEAgLTAsMCArMSwxMjA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVQYXJzZXI7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0VudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5BdHRyaWJ1dGVzOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5Lk1vZGlmaWNhdGlvbkl0ZW07CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5TZWFyY2hDb250cm9sczsKKworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLk5hbWVQYXJzZXJJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLlN0cmluZ01hbmFnZXI7CisKKy8qKgorICogRGlyZWN0b3J5IENvbnRleHQgaW1wbGVtZW50YXRpb24gaGVscGVyIGNsYXNzLgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VEaXJDb250ZXh0IGltcGxlbWVudHMgRGlyQ29udGV4dCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQnVpbGRzIGEgYmFzZSBkaXJlY3RvcnkgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQmFzZURpckNvbnRleHQoKSB7CisgICAgICAgIHRoaXMuZW52ID0gbmV3IEhhc2h0YWJsZSgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQnVpbGRzIGEgYmFzZSBkaXJlY3RvcnkgY29udGV4dCB1c2luZyB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuCisgICAgICovCisgICAgcHVibGljIEJhc2VEaXJDb250ZXh0KEhhc2h0YWJsZSBlbnYpIHsKKyAgICAgICAgdGhpcy5lbnYgPSBlbnY7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRvY3VtZW50IGJhc2UgcGF0aC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRvY0Jhc2UgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBFbnZpcm9ubWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGVudjsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ01hbmFnZXIgc20gPSBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBOYW1lIHBhcnNlciBmb3IgdGhpcyBjb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBOYW1lUGFyc2VyIG5hbWVQYXJzZXIgPSBuZXcgTmFtZVBhcnNlckltcGwoKTsKKworCisgICAgLyoqCisgICAgICogQ2FjaGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNhY2hlZCA9IHRydWU7CisKKworICAgIC8qKgorICAgICAqIENhY2hlIFRUTC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGNhY2hlVFRMID0gNTAwMDsgLy8gNXMKKworCisgICAgLyoqCisgICAgICogTWF4IHNpemUgb2YgcmVzb3VyY2VzIHdoaWNoIHdpbGwgaGF2ZSB0aGVpciBjb250ZW50IGNhY2hlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGNhY2hlTWF4U2l6ZSA9IDEwMjQwOyAvLyAxMCBNQgorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkb2N1bWVudCByb290IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERvY0Jhc2UoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kb2NCYXNlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZG9jdW1lbnQgcm9vdCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZG9jQmFzZSBUaGUgbmV3IGRvY3VtZW50IHJvb3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgbm90CisgICAgICogIHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyB3b3VsZCBjcmVhdGUgYQorICAgICAqICBtYWxmb3JtZWQgVVJMCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9jQmFzZShTdHJpbmcgZG9jQmFzZSkgeworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBmb3JtYXQgb2YgdGhlIHByb3Bvc2VkIGRvY3VtZW50IHJvb3QKKyAgICAgICAgaWYgKGRvY0Jhc2UgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJyZXNvdXJjZXMubnVsbCIpKTsKKworICAgICAgICAvLyBDaGFuZ2UgdGhlIGRvY3VtZW50IHJvb3QgcHJvcGVydHkKKyAgICAgICAgdGhpcy5kb2NCYXNlID0gZG9jQmFzZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGNhY2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWNoZWQoYm9vbGVhbiBjYWNoZWQpIHsKKyAgICAgICAgdGhpcy5jYWNoZWQgPSBjYWNoZWQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJcyBjYWNoZWQgPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2FjaGVkKCkgeworICAgICAgICByZXR1cm4gY2FjaGVkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGNhY2hlIFRUTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWNoZVRUTChpbnQgY2FjaGVUVEwpIHsKKyAgICAgICAgdGhpcy5jYWNoZVRUTCA9IGNhY2hlVFRMOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IGNhY2hlIFRUTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENhY2hlVFRMKCkgeworICAgICAgICByZXR1cm4gY2FjaGVUVEw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gS0IuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDYWNoZU1heFNpemUoKSB7CisgICAgICAgIHJldHVybiBjYWNoZU1heFNpemU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gS0IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FjaGVNYXhTaXplKGludCBjYWNoZU1heFNpemUpIHsKKyAgICAgICAgdGhpcy5jYWNoZU1heFNpemUgPSBjYWNoZU1heFNpemU7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWxsb2NhdGUgcmVzb3VyY2VzIGZvciB0aGlzIGRpcmVjdG9yeSBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFsbG9jYXRlKCkgeworICAgICAgICA7IC8vIE5vIGFjdGlvbiB0YWtlbiBieSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgdGhpcyBkaXJlY3RvcnkgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworICAgICAgICA7IC8vIE5vIGFjdGlvbiB0YWtlbiBieSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29udGV4dCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmFtZWQgb2JqZWN0LiBJZiBuYW1lIGlzIGVtcHR5LCByZXR1cm5zIGEgbmV3IGluc3RhbmNlIAorICAgICAqIG9mIHRoaXMgY29udGV4dCAod2hpY2ggcmVwcmVzZW50cyB0aGUgc2FtZSBuYW1pbmcgY29udGV4dCBhcyB0aGlzIAorICAgICAqIGNvbnRleHQsIGJ1dCBpdHMgZW52aXJvbm1lbnQgbWF5IGJlIG1vZGlmaWVkIGluZGVwZW5kZW50bHkgYW5kIGl0IG1heSAKKyAgICAgKiBiZSBhY2Nlc3NlZCBjb25jdXJyZW50bHkpLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gbG9vayB1cAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBib3VuZCB0byBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBsb29rdXAoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGxvb2t1cChuYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1lZCBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGxvb2t1cChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdC4gQWxsIGludGVybWVkaWF0ZSBjb250ZXh0cyBhbmQgdGhlIHRhcmdldCAKKyAgICAgKiBjb250ZXh0ICh0aGF0IG5hbWVkIGJ5IGFsbCBidXQgdGVybWluYWwgYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZSkgCisgICAgICogbXVzdCBhbHJlYWR5IGV4aXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIG9iamVjdCBkaWQgbm90IHN1cHBseSBhbGwgCisgICAgICogbWFuZGF0b3J5IGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kKE5hbWUgbmFtZSwgT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGJpbmQobmFtZS50b1N0cmluZygpLCBvYmopOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBvYmplY3QgZGlkIG5vdCBzdXBwbHkgYWxsIAorICAgICAqIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGJpbmQobmFtZSwgb2JqLCBudWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QsIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBiaW5kaW5nLiBBbGwgCisgICAgICogaW50ZXJtZWRpYXRlIGNvbnRleHRzIGFuZCB0aGUgdGFyZ2V0IGNvbnRleHQgKHRoYXQgbmFtZWQgYnkgYWxsIGJ1dCAKKyAgICAgKiB0ZXJtaW5hbCBhdG9taWMgY29tcG9uZW50IG9mIHRoZSBuYW1lKSBtdXN0IGFscmVhZHkgZXhpc3QuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIG9iamVjdCBpcyBhIERpckNvbnRleHQsIGFueSBleGlzdGluZyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCAKKyAgICAgKiB0aGUgbmFtZSBhcmUgcmVwbGFjZWQgd2l0aCB0aG9zZSBvZiB0aGUgb2JqZWN0LiBPdGhlcndpc2UsIGFueSAKKyAgICAgKiBleGlzdGluZyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSByZW1haW4gdW5jaGFuZ2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgb2JqZWN0IGRpZCBub3Qgc3VwcGx5IGFsbCAKKyAgICAgKiBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlYmluZChOYW1lIG5hbWUsIE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZWJpbmQobmFtZS50b1N0cmluZygpLCBvYmopOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdCwgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGJpbmRpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBvYmplY3QgZGlkIG5vdCBzdXBwbHkgYWxsIAorICAgICAqIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmViaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmViaW5kKG5hbWUsIG9iaiwgbnVsbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbmJpbmRzIHRoZSBuYW1lZCBvYmplY3QuIFJlbW92ZXMgdGhlIHRlcm1pbmFsIGF0b21pYyBuYW1lIGluIG5hbWUgCisgICAgICogZnJvbSB0aGUgdGFyZ2V0IGNvbnRleHQtLXRoYXQgbmFtZWQgYnkgYWxsIGJ1dCB0aGUgdGVybWluYWwgYXRvbWljIAorICAgICAqIHBhcnQgb2YgbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LiBJdCBzdWNjZWVkcyBldmVuIGlmIHRoZSB0ZXJtaW5hbCBhdG9taWMgCisgICAgICogbmFtZSBpcyBub3QgYm91bmQgaW4gdGhlIHRhcmdldCBjb250ZXh0LCBidXQgdGhyb3dzIAorICAgICAqIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGludGVybWVkaWF0ZSBjb250ZXh0cyBkbyBub3QgZXhpc3QuIAorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiBpbnRlcm1lZGlhdGUgY29udGV4dCBkb2VzIG5vdCAKKyAgICAgKiBleGlzdAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuYmluZChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB1bmJpbmQobmFtZS50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVuYmluZHMgdGhlIG5hbWVkIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gaW50ZXJtZWRpYXRlIGNvbnRleHQgZG9lcyBub3QgCisgICAgICogZXhpc3QKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bmJpbmQoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmV3IG5hbWUgdG8gdGhlIG9iamVjdCBib3VuZCB0byBhbiBvbGQgbmFtZSwgYW5kIHVuYmluZHMgdGhlIAorICAgICAqIG9sZCBuYW1lLiBCb3RoIG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGlzIGNvbnRleHQuIEFueSBhdHRyaWJ1dGVzIAorICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2xkIG5hbWUgYmVjb21lIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IG5hbWUuIAorICAgICAqIEludGVybWVkaWF0ZSBjb250ZXh0cyBvZiB0aGUgb2xkIG5hbWUgYXJlIG5vdCBjaGFuZ2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvbGROYW1lIHRoZSBuYW1lIG9mIHRoZSBleGlzdGluZyBiaW5kaW5nOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG5ld05hbWUgdGhlIG5hbWUgb2YgdGhlIG5ldyBiaW5kaW5nOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5ld05hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbmFtZShOYW1lIG9sZE5hbWUsIE5hbWUgbmV3TmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJlbmFtZShvbGROYW1lLnRvU3RyaW5nKCksIG5ld05hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5ldyBuYW1lIHRvIHRoZSBvYmplY3QgYm91bmQgdG8gYW4gb2xkIG5hbWUsIGFuZCB1bmJpbmRzIHRoZSAKKyAgICAgKiBvbGQgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2xkTmFtZSB0aGUgbmFtZSBvZiB0aGUgZXhpc3RpbmcgYmluZGluZzsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBuZXdOYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgYmluZGluZzsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuZXdOYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW5hbWUoU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgY2xhc3MgCisgICAgICogbmFtZXMgb2Ygb2JqZWN0cyBib3VuZCB0byB0aGVtLiBUaGUgY29udGVudHMgb2YgYW55IHN1YmNvbnRleHRzIGFyZSAKKyAgICAgKiBub3QgaW5jbHVkZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBiaW5kaW5nIGlzIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGlzIGNvbnRleHQsIGl0cyBlZmZlY3Qgb24gCisgICAgICogYW4gZW51bWVyYXRpb24gcHJldmlvdXNseSByZXR1cm5lZCBpcyB1bmRlZmluZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIG5hbWVzIGFuZCBjbGFzcyBuYW1lcyBvZiB0aGUgYmluZGluZ3MgaW4gCisgICAgICogdGhpcyBjb250ZXh0LiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgTmFtZUNsYXNzUGFpci4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbGlzdChuYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyB0aGUgbmFtZXMgYm91bmQgaW4gdGhlIG5hbWVkIGNvbnRleHQsIGFsb25nIHdpdGggdGhlIGNsYXNzIAorICAgICAqIG5hbWVzIG9mIG9iamVjdHMgYm91bmQgdG8gdGhlbS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBsaXN0CisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgbmFtZXMgYW5kIGNsYXNzIG5hbWVzIG9mIHRoZSBiaW5kaW5ncyBpbiAKKyAgICAgKiB0aGlzIGNvbnRleHQuIEVhY2ggZWxlbWVudCBvZiB0aGUgZW51bWVyYXRpb24gaXMgb2YgdHlwZSBOYW1lQ2xhc3NQYWlyLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0KFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgCisgICAgICogb2JqZWN0cyBib3VuZCB0byB0aGVtLiBUaGUgY29udGVudHMgb2YgYW55IHN1YmNvbnRleHRzIGFyZSBub3QgCisgICAgICogaW5jbHVkZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBiaW5kaW5nIGlzIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGlzIGNvbnRleHQsIGl0cyBlZmZlY3Qgb24gCisgICAgICogYW4gZW51bWVyYXRpb24gcHJldmlvdXNseSByZXR1cm5lZCBpcyB1bmRlZmluZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIGJpbmRpbmdzIGluIHRoaXMgY29udGV4dC4gCisgICAgICogRWFjaCBlbGVtZW50IG9mIHRoZSBlbnVtZXJhdGlvbiBpcyBvZiB0eXBlIEJpbmRpbmcuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3RCaW5kaW5ncyhOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbGlzdEJpbmRpbmdzKG5hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgCisgICAgICogb2JqZWN0cyBib3VuZCB0byB0aGVtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGxpc3QKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBiaW5kaW5ncyBpbiB0aGlzIGNvbnRleHQuIAorICAgICAqIEVhY2ggZWxlbWVudCBvZiB0aGUgZW51bWVyYXRpb24gaXMgb2YgdHlwZSBCaW5kaW5nLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0QmluZGluZ3MoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIERlc3Ryb3lzIHRoZSBuYW1lZCBjb250ZXh0IGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIG5hbWVzcGFjZS4gQW55IAorICAgICAqIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lIGFyZSBhbHNvIHJlbW92ZWQuIEludGVybWVkaWF0ZSAKKyAgICAgKiBjb250ZXh0cyBhcmUgbm90IGRlc3Ryb3llZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LiBJdCBzdWNjZWVkcyBldmVuIGlmIHRoZSB0ZXJtaW5hbCBhdG9taWMgCisgICAgICogbmFtZSBpcyBub3QgYm91bmQgaW4gdGhlIHRhcmdldCBjb250ZXh0LCBidXQgdGhyb3dzIAorICAgICAqIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGludGVybWVkaWF0ZSBjb250ZXh0cyBkbyBub3QgZXhpc3QuIAorICAgICAqIAorICAgICAqIEluIGEgZmVkZXJhdGVkIG5hbWluZyBzeXN0ZW0sIGEgY29udGV4dCBmcm9tIG9uZSBuYW1pbmcgc3lzdGVtIG1heSBiZSAKKyAgICAgKiBib3VuZCB0byBhIG5hbWUgaW4gYW5vdGhlci4gT25lIGNhbiBzdWJzZXF1ZW50bHkgbG9vayB1cCBhbmQgcGVyZm9ybSAKKyAgICAgKiBvcGVyYXRpb25zIG9uIHRoZSBmb3JlaWduIGNvbnRleHQgdXNpbmcgYSBjb21wb3NpdGUgbmFtZS4gSG93ZXZlciwgYW4gCisgICAgICogYXR0ZW1wdCBkZXN0cm95IHRoZSBjb250ZXh0IHVzaW5nIHRoaXMgY29tcG9zaXRlIG5hbWUgd2lsbCBmYWlsIHdpdGggCisgICAgICogTm90Q29udGV4dEV4Y2VwdGlvbiwgYmVjYXVzZSB0aGUgZm9yZWlnbiBjb250ZXh0IGlzIG5vdCBhICJzdWJjb250ZXh0IiAKKyAgICAgKiBvZiB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyBib3VuZC4gSW5zdGVhZCwgdXNlIHVuYmluZCgpIHRvIHJlbW92ZSAKKyAgICAgKiB0aGUgYmluZGluZyBvZiB0aGUgZm9yZWlnbiBjb250ZXh0LiBEZXN0cm95aW5nIHRoZSBmb3JlaWduIGNvbnRleHQgCisgICAgICogcmVxdWlyZXMgdGhhdCB0aGUgZGVzdHJveVN1YmNvbnRleHQoKSBiZSBwZXJmb3JtZWQgb24gYSBjb250ZXh0IGZyb20gCisgICAgICogdGhlIGZvcmVpZ24gY29udGV4dCdzICJuYXRpdmUiIG5hbWluZyBzeXN0ZW0uCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gYmUgZGVzdHJveWVkOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gaW50ZXJtZWRpYXRlIGNvbnRleHQgZG9lcyBub3QgCisgICAgICogZXhpc3QKKyAgICAgKiBAZXhjZXB0aW9uIE5vdENvbnRleHRFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgYm91bmQgYnV0IGRvZXMgbm90IG5hbWUgCisgICAgICogYSBjb250ZXh0LCBvciBkb2VzIG5vdCBuYW1lIGEgY29udGV4dCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lTdWJjb250ZXh0KE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRlc3Ryb3lTdWJjb250ZXh0KG5hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXN0cm95cyB0aGUgbmFtZWQgY29udGV4dCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBuYW1lc3BhY2UuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gYmUgZGVzdHJveWVkOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gaW50ZXJtZWRpYXRlIGNvbnRleHQgZG9lcyBub3QgCisgICAgICogZXhpc3QKKyAgICAgKiBAZXhjZXB0aW9uIE5vdENvbnRleHRFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgYm91bmQgYnV0IGRvZXMgbm90IG5hbWUgCisgICAgICogYSBjb250ZXh0LCBvciBkb2VzIG5vdCBuYW1lIGEgY29udGV4dCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRlc3Ryb3lTdWJjb250ZXh0KFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuZCBiaW5kcyBhIG5ldyBjb250ZXh0LiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgZ2l2ZW4gCisgICAgICogbmFtZSBhbmQgYmluZHMgaXQgaW4gdGhlIHRhcmdldCBjb250ZXh0ICh0aGF0IG5hbWVkIGJ5IGFsbCBidXQgCisgICAgICogdGVybWluYWwgYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZSkuIEFsbCBpbnRlcm1lZGlhdGUgY29udGV4dHMgYW5kIAorICAgICAqIHRoZSB0YXJnZXQgY29udGV4dCBtdXN0IGFscmVhZHkgZXhpc3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgY3JlYXRpb24gb2YgdGhlIHN1YmNvbnRleHQgCisgICAgICogcmVxdWlyZXMgc3BlY2lmaWNhdGlvbiBvZiBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGNyZWF0ZVN1YmNvbnRleHQoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVN1YmNvbnRleHQobmFtZS50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGJpbmRzIGEgbmV3IGNvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgY3JlYXRpb24gb2YgdGhlIHN1YmNvbnRleHQgCisgICAgICogcmVxdWlyZXMgc3BlY2lmaWNhdGlvbiBvZiBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGNyZWF0ZVN1YmNvbnRleHQoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY3JlYXRlU3ViY29udGV4dChuYW1lLCBudWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmFtZWQgb2JqZWN0LCBmb2xsb3dpbmcgbGlua3MgZXhjZXB0IGZvciB0aGUgdGVybWluYWwgCisgICAgICogYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZS4gSWYgdGhlIG9iamVjdCBib3VuZCB0byBuYW1lIGlzIG5vdCBhIAorICAgICAqIGxpbmssIHJldHVybnMgdGhlIG9iamVjdCBpdHNlbGYuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUsIG5vdCBmb2xsb3dpbmcgdGhlIHRlcm1pbmFsIGxpbmsgCisgICAgICogKGlmIGFueSkuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBsb29rdXBMaW5rKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBsb29rdXBMaW5rKG5hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdCwgZm9sbG93aW5nIGxpbmtzIGV4Y2VwdCBmb3IgdGhlIHRlcm1pbmFsIAorICAgICAqIGF0b21pYyBjb21wb25lbnQgb2YgdGhlIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUsIG5vdCBmb2xsb3dpbmcgdGhlIHRlcm1pbmFsIGxpbmsgCisgICAgICogKGlmIGFueSkuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBsb29rdXBMaW5rKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHBhcnNlciBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVkIGNvbnRleHQuIEluIGEgCisgICAgICogZmVkZXJhdGlvbiBvZiBuYW1lc3BhY2VzLCBkaWZmZXJlbnQgbmFtaW5nIHN5c3RlbXMgd2lsbCBwYXJzZSBuYW1lcyAKKyAgICAgKiBkaWZmZXJlbnRseS4gVGhpcyBtZXRob2QgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGdldCBhIHBhcnNlciBmb3IgCisgICAgICogcGFyc2luZyBuYW1lcyBpbnRvIHRoZWlyIGF0b21pYyBjb21wb25lbnRzIHVzaW5nIHRoZSBuYW1pbmcgY29udmVudGlvbiAKKyAgICAgKiBvZiBhIHBhcnRpY3VsYXIgbmFtaW5nIHN5c3RlbS4gV2l0aGluIGFueSBzaW5nbGUgbmFtaW5nIHN5c3RlbSwgCisgICAgICogTmFtZVBhcnNlciBvYmplY3RzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIG11c3QgYmUgZXF1YWwgKHVzaW5nIHRoZSAKKyAgICAgKiBlcXVhbHMoKSB0ZXN0KS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgcGFyc2VyCisgICAgICogQHJldHVybiBhIG5hbWUgcGFyc2VyIHRoYXQgY2FuIHBhcnNlIGNvbXBvdW5kIG5hbWVzIGludG8gdGhlaXIgYXRvbWljIAorICAgICAqIGNvbXBvbmVudHMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZVBhcnNlciBnZXROYW1lUGFyc2VyKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgTmFtZVBhcnNlckltcGwoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgcGFyc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgY29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgcGFyc2VyCisgICAgICogQHJldHVybiBhIG5hbWUgcGFyc2VyIHRoYXQgY2FuIHBhcnNlIGNvbXBvdW5kIG5hbWVzIGludG8gdGhlaXIgYXRvbWljIAorICAgICAqIGNvbXBvbmVudHMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZVBhcnNlciBnZXROYW1lUGFyc2VyKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOYW1lUGFyc2VySW1wbCgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29tcG9zZXMgdGhlIG5hbWUgb2YgdGhpcyBjb250ZXh0IHdpdGggYSBuYW1lIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dC4KKyAgICAgKiA8cD4KKyAgICAgKiBHaXZlbiBhIG5hbWUgKG5hbWUpIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dCwgYW5kIHRoZSBuYW1lIChwcmVmaXgpIAorICAgICAqIG9mIHRoaXMgY29udGV4dCByZWxhdGl2ZSB0byBvbmUgb2YgaXRzIGFuY2VzdG9ycywgdGhpcyBtZXRob2QgcmV0dXJucyAKKyAgICAgKiB0aGUgY29tcG9zaXRpb24gb2YgdGhlIHR3byBuYW1lcyB1c2luZyB0aGUgc3ludGF4IGFwcHJvcHJpYXRlIGZvciB0aGUgCisgICAgICogbmFtaW5nIHN5c3RlbShzKSBpbnZvbHZlZC4gVGhhdCBpcywgaWYgbmFtZSBuYW1lcyBhbiBvYmplY3QgcmVsYXRpdmUgCisgICAgICogdG8gdGhpcyBjb250ZXh0LCB0aGUgcmVzdWx0IGlzIHRoZSBuYW1lIG9mIHRoZSBzYW1lIG9iamVjdCwgYnV0IAorICAgICAqIHJlbGF0aXZlIHRvIHRoZSBhbmNlc3RvciBjb250ZXh0LiBOb25lIG9mIHRoZSBuYW1lcyBtYXkgYmUgbnVsbC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBhIG5hbWUgcmVsYXRpdmUgdG8gdGhpcyBjb250ZXh0CisgICAgICogQHBhcmFtIHByZWZpeCB0aGUgbmFtZSBvZiB0aGlzIGNvbnRleHQgcmVsYXRpdmUgdG8gb25lIG9mIGl0cyBhbmNlc3RvcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wb3NpdGlvbiBvZiBwcmVmaXggYW5kIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZSBjb21wb3NlTmFtZShOYW1lIG5hbWUsIE5hbWUgcHJlZml4KQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcHJlZml4ID0gKE5hbWUpIHByZWZpeC5jbG9uZSgpOworICAgICAgICByZXR1cm4gcHJlZml4LmFkZEFsbChuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbXBvc2VzIHRoZSBuYW1lIG9mIHRoaXMgY29udGV4dCB3aXRoIGEgbmFtZSByZWxhdGl2ZSB0byB0aGlzIGNvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgYSBuYW1lIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dAorICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIG5hbWUgb2YgdGhpcyBjb250ZXh0IHJlbGF0aXZlIHRvIG9uZSBvZiBpdHMgYW5jZXN0b3JzCisgICAgICogQHJldHVybiB0aGUgY29tcG9zaXRpb24gb2YgcHJlZml4IGFuZCBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjb21wb3NlTmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBwcmVmaXggKyAiLyIgKyBuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldyBlbnZpcm9ubWVudCBwcm9wZXJ0eSB0byB0aGUgZW52aXJvbm1lbnQgb2YgdGhpcyBjb250ZXh0LiBJZiAKKyAgICAgKiB0aGUgcHJvcGVydHkgYWxyZWFkeSBleGlzdHMsIGl0cyB2YWx1ZSBpcyBvdmVyd3JpdHRlbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvcE5hbWUgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHByb3BlcnR5IHRvIGFkZDsgbWF5IG5vdCAKKyAgICAgKiBiZSBudWxsCisgICAgICogQHBhcmFtIHByb3BWYWwgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byBhZGQ7IG1heSBub3QgYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgYWRkVG9FbnZpcm9ubWVudChTdHJpbmcgcHJvcE5hbWUsIE9iamVjdCBwcm9wVmFsKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGVudi5wdXQocHJvcE5hbWUsIHByb3BWYWwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbiBlbnZpcm9ubWVudCBwcm9wZXJ0eSBmcm9tIHRoZSBlbnZpcm9ubWVudCBvZiB0aGlzIGNvbnRleHQuIAorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wTmFtZSB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgcHJvcGVydHkgdG8gcmVtb3ZlOyAKKyAgICAgKiBtYXkgbm90IGJlIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZUZyb21FbnZpcm9ubWVudChTdHJpbmcgcHJvcE5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZW52LnJlbW92ZShwcm9wTmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGVudmlyb25tZW50IGluIGVmZmVjdCBmb3IgdGhpcyBjb250ZXh0LiBTZWUgY2xhc3MgCisgICAgICogZGVzY3JpcHRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiBlbnZpcm9ubWVudCBwcm9wZXJ0aWVzLiAKKyAgICAgKiBUaGUgY2FsbGVyIHNob3VsZCBub3QgbWFrZSBhbnkgY2hhbmdlcyB0byB0aGUgb2JqZWN0IHJldHVybmVkOiB0aGVpciAKKyAgICAgKiBlZmZlY3Qgb24gdGhlIGNvbnRleHQgaXMgdW5kZWZpbmVkLiBUaGUgZW52aXJvbm1lbnQgb2YgdGhpcyBjb250ZXh0IAorICAgICAqIG1heSBiZSBjaGFuZ2VkIHVzaW5nIGFkZFRvRW52aXJvbm1lbnQoKSBhbmQgcmVtb3ZlRnJvbUVudmlyb25tZW50KCkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZW52aXJvbm1lbnQgb2YgdGhpcyBjb250ZXh0OyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRFbnZpcm9ubWVudCgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZW52OworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoaXMgY29udGV4dC4gVGhpcyBtZXRob2QgcmVsZWFzZXMgdGhpcyBjb250ZXh0J3MgcmVzb3VyY2VzIAorICAgICAqIGltbWVkaWF0ZWx5LCBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZW0gdG8gYmUgcmVsZWFzZWQgYXV0b21hdGljYWxseSAKKyAgICAgKiBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuCisgICAgICogVGhpcyBtZXRob2QgaXMgaWRlbXBvdGVudDogaW52b2tpbmcgaXQgb24gYSBjb250ZXh0IHRoYXQgaGFzIGFscmVhZHkgCisgICAgICogYmVlbiBjbG9zZWQgaGFzIG5vIGVmZmVjdC4gSW52b2tpbmcgYW55IG90aGVyIG1ldGhvZCBvbiBhIGNsb3NlZCAKKyAgICAgKiBjb250ZXh0IGlzIG5vdCBhbGxvd2VkLCBhbmQgcmVzdWx0cyBpbiB1bmRlZmluZWQgYmVoYXZpb3VyLgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGVudi5jbGVhcigpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBjb250ZXh0IHdpdGhpbiBpdHMgb3duIG5hbWVzcGFjZS4KKyAgICAgKiA8cD4KKyAgICAgKiBNYW55IG5hbWluZyBzZXJ2aWNlcyBoYXZlIGEgbm90aW9uIG9mIGEgImZ1bGwgbmFtZSIgZm9yIG9iamVjdHMgaW4gCisgICAgICogdGhlaXIgcmVzcGVjdGl2ZSBuYW1lc3BhY2VzLiBGb3IgZXhhbXBsZSwgYW4gTERBUCBlbnRyeSBoYXMgYSAKKyAgICAgKiBkaXN0aW5ndWlzaGVkIG5hbWUsIGFuZCBhIEROUyByZWNvcmQgaGFzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIFRoaXMgCisgICAgICogbWV0aG9kIGFsbG93cyB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHRvIHJldHJpZXZlIHRoaXMgbmFtZS4gVGhlIHN0cmluZyAKKyAgICAgKiByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyBub3QgYSBKTkRJIGNvbXBvc2l0ZSBuYW1lIGFuZCBzaG91bGQgbm90IGJlIAorICAgICAqIHBhc3NlZCBkaXJlY3RseSB0byBjb250ZXh0IG1ldGhvZHMuIEluIG5hbWluZyBzeXN0ZW1zIGZvciB3aGljaCB0aGUgCisgICAgICogbm90aW9uIG9mIGZ1bGwgbmFtZSBkb2VzIG5vdCBtYWtlIHNlbnNlLCAKKyAgICAgKiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhpcyBjb250ZXh0J3MgbmFtZSBpbiBpdHMgb3duIG5hbWVzcGFjZTsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHRoZSBuYW1pbmcgc3lzdGVtIGRvZXMgCisgICAgICogbm90IGhhdmUgdGhlIG5vdGlvbiBvZiBhIGZ1bGwgbmFtZQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZUluTmFtZXNwYWNlKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGlyQ29udGV4dCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgb2JqZWN0LiAKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggbmFtZS4gCisgICAgICogUmV0dXJucyBhbiBlbXB0eSBhdHRyaWJ1dGUgc2V0IGlmIG5hbWUgaGFzIG5vIGF0dHJpYnV0ZXM7IG5ldmVyIG51bGwuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVzKG5hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggbmFtZQorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgZnJvbSB3aGljaCB0byByZXRyaWV2ZSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcyhTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVzKG5hbWUsIG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHNlbGVjdGVkIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgb2JqZWN0LiAKKyAgICAgKiBTZWUgdGhlIGNsYXNzIGRlc2NyaXB0aW9uIHJlZ2FyZGluZyBhdHRyaWJ1dGUgbW9kZWxzLCBhdHRyaWJ1dGUgdHlwZSAKKyAgICAgKiBuYW1lcywgYW5kIG9wZXJhdGlvbmFsIGF0dHJpYnV0ZXMuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZXM7IG5ldmVyIG51bGwKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gcmV0cmlldmUgYXR0cmlidXRlcworICAgICAqIEBwYXJhbSBhdHRySWRzIHRoZSBpZGVudGlmaWVycyBvZiB0aGUgYXR0cmlidXRlcyB0byByZXRyaWV2ZS4gbnVsbCAKKyAgICAgKiBpbmRpY2F0ZXMgdGhhdCBhbGwgYXR0cmlidXRlcyBzaG91bGQgYmUgcmV0cmlldmVkOyBhbiBlbXB0eSBhcnJheSAKKyAgICAgKiBpbmRpY2F0ZXMgdGhhdCBub25lIHNob3VsZCBiZSByZXRyaWV2ZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKE5hbWUgbmFtZSwgU3RyaW5nW10gYXR0cklkcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVzKG5hbWUudG9TdHJpbmcoKSwgYXR0cklkcyk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBzZWxlY3RlZCBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlczsgbmV2ZXIgbnVsbAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgZnJvbSB3aGljaCB0byByZXRyaWV2ZSBhdHRyaWJ1dGVzCisgICAgICogQHBhcmFtIGF0dHJJZHMgdGhlIGlkZW50aWZpZXJzIG9mIHRoZSBhdHRyaWJ1dGVzIHRvIHJldHJpZXZlLiBudWxsIAorICAgICAqIGluZGljYXRlcyB0aGF0IGFsbCBhdHRyaWJ1dGVzIHNob3VsZCBiZSByZXRyaWV2ZWQ7IGFuIGVtcHR5IGFycmF5IAorICAgICAqIGluZGljYXRlcyB0aGF0IG5vbmUgc2hvdWxkIGJlIHJldHJpZXZlZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIGF0dHJJZHMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIE1vZGlmaWVzIHRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIG9iamVjdC4gVGhlIG9yZGVyIG9mIAorICAgICAqIHRoZSBtb2RpZmljYXRpb25zIGlzIG5vdCBzcGVjaWZpZWQuIFdoZXJlIHBvc3NpYmxlLCB0aGUgbW9kaWZpY2F0aW9ucyAKKyAgICAgKiBhcmUgcGVyZm9ybWVkIGF0b21pY2FsbHkuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB3aG9zZSBhdHRyaWJ1dGVzIHdpbGwgYmUgdXBkYXRlZAorICAgICAqIEBwYXJhbSBtb2Rfb3AgdGhlIG1vZGlmaWNhdGlvbiBvcGVyYXRpb24sIG9uZSBvZjogQUREX0FUVFJJQlVURSwgCisgICAgICogUkVQTEFDRV9BVFRSSUJVVEUsIFJFTU9WRV9BVFRSSUJVVEUKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYmUgdXNlZCBmb3IgdGhlIG1vZGlmaWNhdGlvbjsgbWF5IG5vdCAKKyAgICAgKiBiZSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBBdHRyaWJ1dGVNb2RpZmljYXRpb25FeGNlcHRpb24gaWYgdGhlIG1vZGlmaWNhdGlvbiBjYW5ub3QgYmUKKyAgICAgKiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgbW9kaWZ5QXR0cmlidXRlcyhOYW1lIG5hbWUsIGludCBtb2Rfb3AsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBtb2RpZnlBdHRyaWJ1dGVzKG5hbWUudG9TdHJpbmcoKSwgbW9kX29wLCBhdHRycyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB3aG9zZSBhdHRyaWJ1dGVzIHdpbGwgYmUgdXBkYXRlZAorICAgICAqIEBwYXJhbSBtb2Rfb3AgdGhlIG1vZGlmaWNhdGlvbiBvcGVyYXRpb24sIG9uZSBvZjogQUREX0FUVFJJQlVURSwgCisgICAgICogUkVQTEFDRV9BVFRSSUJVVEUsIFJFTU9WRV9BVFRSSUJVVEUKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYmUgdXNlZCBmb3IgdGhlIG1vZGlmaWNhdGlvbjsgbWF5IG5vdCAKKyAgICAgKiBiZSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBBdHRyaWJ1dGVNb2RpZmljYXRpb25FeGNlcHRpb24gaWYgdGhlIG1vZGlmaWNhdGlvbiBjYW5ub3QgYmUKKyAgICAgKiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgbW9kaWZ5QXR0cmlidXRlcworICAgICAgICAoU3RyaW5nIG5hbWUsIGludCBtb2Rfb3AsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIE1vZGlmaWVzIHRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIG9iamVjdCB1c2luZyBhbiBhbiAKKyAgICAgKiBvcmRlcmVkIGxpc3Qgb2YgbW9kaWZpY2F0aW9ucy4gVGhlIG1vZGlmaWNhdGlvbnMgYXJlIHBlcmZvcm1lZCBpbiB0aGUgCisgICAgICogb3JkZXIgc3BlY2lmaWVkLiBFYWNoIG1vZGlmaWNhdGlvbiBzcGVjaWZpZXMgYSBtb2RpZmljYXRpb24gb3BlcmF0aW9uIAorICAgICAqIGNvZGUgYW5kIGFuIGF0dHJpYnV0ZSBvbiB3aGljaCB0byBvcGVyYXRlLiBXaGVyZSBwb3NzaWJsZSwgdGhlIAorICAgICAqIG1vZGlmaWNhdGlvbnMgYXJlIHBlcmZvcm1lZCBhdG9taWNhbGx5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2UgYXR0cmlidXRlcyB3aWxsIGJlIHVwZGF0ZWQKKyAgICAgKiBAcGFyYW0gbW9kcyBhbiBvcmRlcmVkIHNlcXVlbmNlIG9mIG1vZGlmaWNhdGlvbnMgdG8gYmUgcGVyZm9ybWVkOyBtYXkgCisgICAgICogbm90IGJlIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIEF0dHJpYnV0ZU1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgbW9kaWZpY2F0aW9uIGNhbm5vdCBiZQorICAgICAqIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtb2RpZnlBdHRyaWJ1dGVzKE5hbWUgbmFtZSwgTW9kaWZpY2F0aW9uSXRlbVtdIG1vZHMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBtb2RpZnlBdHRyaWJ1dGVzKG5hbWUudG9TdHJpbmcoKSwgbW9kcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBvYmplY3QgdXNpbmcgYW4gYW4gCisgICAgICogb3JkZXJlZCBsaXN0IG9mIG1vZGlmaWNhdGlvbnMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB3aG9zZSBhdHRyaWJ1dGVzIHdpbGwgYmUgdXBkYXRlZAorICAgICAqIEBwYXJhbSBtb2RzIGFuIG9yZGVyZWQgc2VxdWVuY2Ugb2YgbW9kaWZpY2F0aW9ucyB0byBiZSBwZXJmb3JtZWQ7IG1heSAKKyAgICAgKiBub3QgYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gQXR0cmlidXRlTW9kaWZpY2F0aW9uRXhjZXB0aW9uIGlmIHRoZSBtb2RpZmljYXRpb24gY2Fubm90IGJlCisgICAgICogY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG1vZGlmeUF0dHJpYnV0ZXMoU3RyaW5nIG5hbWUsIE1vZGlmaWNhdGlvbkl0ZW1bXSBtb2RzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5hbWUgdG8gYW4gb2JqZWN0LCBhbG9uZyB3aXRoIGFzc29jaWF0ZWQgYXR0cmlidXRlcy4gSWYgYXR0cnMgCisgICAgICogaXMgbnVsbCwgdGhlIHJlc3VsdGluZyBiaW5kaW5nIHdpbGwgaGF2ZSB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIAorICAgICAqIHdpdGggb2JqIGlmIG9iaiBpcyBhIERpckNvbnRleHQsIGFuZCBubyBhdHRyaWJ1dGVzIG90aGVyd2lzZS4gSWYgYXR0cnMgCisgICAgICogaXMgbm9uLW51bGwsIHRoZSByZXN1bHRpbmcgYmluZGluZyB3aWxsIGhhdmUgYXR0cnMgYXMgaXRzIGF0dHJpYnV0ZXM7IAorICAgICAqIGFueSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBvYmogYXJlIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBiaW5kaW5nCisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgc29tZSAibWFuZGF0b3J5IiBhdHRyaWJ1dGVzIAorICAgICAqIG9mIHRoZSBiaW5kaW5nIGFyZSBub3Qgc3VwcGxpZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kKE5hbWUgbmFtZSwgT2JqZWN0IG9iaiwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGJpbmQobmFtZS50b1N0cmluZygpLCBvYmosIGF0dHJzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QsIGFsb25nIHdpdGggYXNzb2NpYXRlZCBhdHRyaWJ1dGVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgYmluZGluZworICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIHNvbWUgIm1hbmRhdG9yeSIgYXR0cmlidXRlcyAKKyAgICAgKiBvZiB0aGUgYmluZGluZyBhcmUgbm90IHN1cHBsaWVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgYmluZChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaiwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdCwgYWxvbmcgd2l0aCBhc3NvY2lhdGVkIGF0dHJpYnV0ZXMsIAorICAgICAqIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBiaW5kaW5nLiBJZiBhdHRycyBpcyBudWxsIGFuZCBvYmogaXMgYSAKKyAgICAgKiBEaXJDb250ZXh0LCB0aGUgYXR0cmlidXRlcyBmcm9tIG9iaiBhcmUgdXNlZC4gSWYgYXR0cnMgaXMgbnVsbCBhbmQgb2JqIAorICAgICAqIGlzIG5vdCBhIERpckNvbnRleHQsIGFueSBleGlzdGluZyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0CisgICAgICogYWxyZWFkeSBib3VuZCBpbiB0aGUgZGlyZWN0b3J5IHJlbWFpbiB1bmNoYW5nZWQuIElmIGF0dHJzIGlzIG5vbi1udWxsLCAKKyAgICAgKiBhbnkgZXhpc3RpbmcgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdCBhbHJlYWR5IGJvdW5kIGluIAorICAgICAqIHRoZSBkaXJlY3RvcnkgYXJlIHJlbW92ZWQgYW5kIGF0dHJzIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgCisgICAgICogb2JqZWN0LiBJZiBvYmogaXMgYSBEaXJDb250ZXh0IGFuZCBhdHRycyBpcyBub24tbnVsbCwgdGhlIGF0dHJpYnV0ZXMgCisgICAgICogb2Ygb2JqIGFyZSBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgYmluZGluZworICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgc29tZSAibWFuZGF0b3J5IiBhdHRyaWJ1dGVzIAorICAgICAqIG9mIHRoZSBiaW5kaW5nIGFyZSBub3Qgc3VwcGxpZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWJpbmQoTmFtZSBuYW1lLCBPYmplY3Qgb2JqLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmViaW5kKG5hbWUudG9TdHJpbmcoKSwgb2JqLCBhdHRycyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5hbWUgdG8gYW4gb2JqZWN0LCBhbG9uZyB3aXRoIGFzc29jaWF0ZWQgYXR0cmlidXRlcywgCisgICAgICogb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGJpbmRpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBiaW5kaW5nCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBzb21lICJtYW5kYXRvcnkiIGF0dHJpYnV0ZXMgCisgICAgICogb2YgdGhlIGJpbmRpbmcgYXJlIG5vdCBzdXBwbGllZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlYmluZChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaiwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbmQgYmluZHMgYSBuZXcgY29udGV4dCwgYWxvbmcgd2l0aCBhc3NvY2lhdGVkIGF0dHJpYnV0ZXMuIAorICAgICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgc3ViY29udGV4dCB3aXRoIHRoZSBnaXZlbiBuYW1lLCBiaW5kcyBpdCBpbiAKKyAgICAgKiB0aGUgdGFyZ2V0IGNvbnRleHQgKHRoYXQgbmFtZWQgYnkgYWxsIGJ1dCB0ZXJtaW5hbCBhdG9taWMgY29tcG9uZW50IG9mIAorICAgICAqIHRoZSBuYW1lKSwgYW5kIGFzc29jaWF0ZXMgdGhlIHN1cHBsaWVkIGF0dHJpYnV0ZXMgd2l0aCB0aGUgbmV3bHkgCisgICAgICogY3JlYXRlZCBvYmplY3QuIEFsbCBpbnRlcm1lZGlhdGUgYW5kIHRhcmdldCBjb250ZXh0cyBtdXN0IGFscmVhZHkgCisgICAgICogZXhpc3QuIElmIGF0dHJzIGlzIG51bGwsIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gCisgICAgICogQ29udGV4dC5jcmVhdGVTdWJjb250ZXh0KCkuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgYXR0cnMgZG9lcyBub3QgY29udGFpbiBhbGwgCisgICAgICogdGhlIG1hbmRhdG9yeSBhdHRyaWJ1dGVzIHJlcXVpcmVkIGZvciBjcmVhdGlvbgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBEaXJDb250ZXh0IGNyZWF0ZVN1YmNvbnRleHQoTmFtZSBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVN1YmNvbnRleHQobmFtZS50b1N0cmluZygpLCBhdHRycyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuZCBiaW5kcyBhIG5ldyBjb250ZXh0LCBhbG9uZyB3aXRoIGFzc29jaWF0ZWQgYXR0cmlidXRlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBjcmVhdGU7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dAorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dAorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBhdHRycyBkb2VzIG5vdCBjb250YWluIGFsbCAKKyAgICAgKiB0aGUgbWFuZGF0b3J5IGF0dHJpYnV0ZXMgcmVxdWlyZWQgZm9yIGNyZWF0aW9uCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IERpckNvbnRleHQgY3JlYXRlU3ViY29udGV4dChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lZCBvYmplY3QuIFRoZSBzY2hlbWEgCisgICAgICogZGVzY3JpYmVzIHJ1bGVzIHJlZ2FyZGluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBuYW1lc3BhY2UgYW5kIHRoZSAKKyAgICAgKiBhdHRyaWJ1dGVzIHN0b3JlZCB3aXRoaW4gaXQuIFRoZSBzY2hlbWEgc3BlY2lmaWVzIHdoYXQgdHlwZXMgb2YgCisgICAgICogb2JqZWN0cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGRpcmVjdG9yeSBhbmQgd2hlcmUgdGhleSBjYW4gYmUgYWRkZWQ7IAorICAgICAqIHdoYXQgbWFuZGF0b3J5IGFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzIGFuIG9iamVjdCBjYW4gaGF2ZS4gVGhlIHJhbmdlIAorICAgICAqIG9mIHN1cHBvcnQgZm9yIHNjaGVtYXMgaXMgZGlyZWN0b3J5LXNwZWNpZmljLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2Ugc2NoZW1hIGlzIHRvIGJlIHJldHJpZXZlZAorICAgICAqIEByZXR1cm4gdGhlIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQ7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiBzY2hlbWEgbm90IHN1cHBvcnRlZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBEaXJDb250ZXh0IGdldFNjaGVtYShOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0U2NoZW1hKG5hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVkIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIHNjaGVtYSBpcyB0byBiZSByZXRyaWV2ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0OyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgc2NoZW1hIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgRGlyQ29udGV4dCBnZXRTY2hlbWEoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBhIGNvbnRleHQgY29udGFpbmluZyB0aGUgc2NoZW1hIG9iamVjdHMgb2YgdGhlIG5hbWVkIAorICAgICAqIG9iamVjdCdzIGNsYXNzIGRlZmluaXRpb25zLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2Ugb2JqZWN0IGNsYXNzIGRlZmluaXRpb24gaXMgdG8gCisgICAgICogYmUgcmV0cmlldmVkCisgICAgICogQHJldHVybiB0aGUgRGlyQ29udGV4dCBjb250YWluaW5nIHRoZSBuYW1lZCBvYmplY3QncyBjbGFzcyAKKyAgICAgKiBkZWZpbml0aW9uczsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHNjaGVtYSBub3Qgc3VwcG9ydGVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIERpckNvbnRleHQgZ2V0U2NoZW1hQ2xhc3NEZWZpbml0aW9uKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRTY2hlbWFDbGFzc0RlZmluaXRpb24obmFtZS50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBhIGNvbnRleHQgY29udGFpbmluZyB0aGUgc2NoZW1hIG9iamVjdHMgb2YgdGhlIG5hbWVkIAorICAgICAqIG9iamVjdCdzIGNsYXNzIGRlZmluaXRpb25zLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2Ugb2JqZWN0IGNsYXNzIGRlZmluaXRpb24gaXMgdG8gCisgICAgICogYmUgcmV0cmlldmVkCisgICAgICogQHJldHVybiB0aGUgRGlyQ29udGV4dCBjb250YWluaW5nIHRoZSBuYW1lZCBvYmplY3QncyBjbGFzcyAKKyAgICAgKiBkZWZpbml0aW9uczsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHNjaGVtYSBub3Qgc3VwcG9ydGVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IERpckNvbnRleHQgZ2V0U2NoZW1hQ2xhc3NEZWZpbml0aW9uKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyBpbiBhIHNpbmdsZSBjb250ZXh0IGZvciBvYmplY3RzIHRoYXQgY29udGFpbiBhIHNwZWNpZmllZCBzZXQgCisgICAgICogb2YgYXR0cmlidXRlcywgYW5kIHJldHJpZXZlcyBzZWxlY3RlZCBhdHRyaWJ1dGVzLiBUaGUgc2VhcmNoIGlzIAorICAgICAqIHBlcmZvcm1lZCB1c2luZyB0aGUgZGVmYXVsdCBTZWFyY2hDb250cm9scyBzZXR0aW5ncy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBzZWFyY2gKKyAgICAgKiBAcGFyYW0gbWF0Y2hpbmdBdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIHRvIHNlYXJjaCBmb3IuIElmIGVtcHR5IG9yIAorICAgICAqIG51bGwsIGFsbCBvYmplY3RzIGluIHRoZSB0YXJnZXQgY29udGV4dCBhcmUgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXNUb1JldHVybiB0aGUgYXR0cmlidXRlcyB0byByZXR1cm4uIG51bGwgaW5kaWNhdGVzIAorICAgICAqIHRoYXQgYWxsIGF0dHJpYnV0ZXMgYXJlIHRvIGJlIHJldHVybmVkOyBhbiBlbXB0eSBhcnJheSBpbmRpY2F0ZXMgdGhhdCAKKyAgICAgKiBub25lIGFyZSB0byBiZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0IG9iamVjdHMuIEVhY2ggCisgICAgICogU2VhcmNoUmVzdWx0IGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIGlkZW50aWZpZWQgYnkgYXR0cmlidXRlc1RvUmV0dXJuIAorICAgICAqIGFuZCB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QsIG5hbWVkIHJlbGF0aXZlIHRvIHRoZSAKKyAgICAgKiBjb250ZXh0IG5hbWVkIGJ5IG5hbWUuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChOYW1lIG5hbWUsIEF0dHJpYnV0ZXMgbWF0Y2hpbmdBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gYXR0cmlidXRlc1RvUmV0dXJuKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNlYXJjaChuYW1lLnRvU3RyaW5nKCksIG1hdGNoaW5nQXR0cmlidXRlcywgYXR0cmlidXRlc1RvUmV0dXJuKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIGEgc2luZ2xlIGNvbnRleHQgZm9yIG9iamVjdHMgdGhhdCBjb250YWluIGEgc3BlY2lmaWVkIHNldCAKKyAgICAgKiBvZiBhdHRyaWJ1dGVzLCBhbmQgcmV0cmlldmVzIHNlbGVjdGVkIGF0dHJpYnV0ZXMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIG1hdGNoaW5nQXR0cmlidXRlcyB0aGUgYXR0cmlidXRlcyB0byBzZWFyY2ggZm9yLiBJZiBlbXB0eSBvciAKKyAgICAgKiBudWxsLCBhbGwgb2JqZWN0cyBpbiB0aGUgdGFyZ2V0IGNvbnRleHQgYXJlIHJldHVybmVkLgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzVG9SZXR1cm4gdGhlIGF0dHJpYnV0ZXMgdG8gcmV0dXJuLiBudWxsIGluZGljYXRlcyAKKyAgICAgKiB0aGF0IGFsbCBhdHRyaWJ1dGVzIGFyZSB0byBiZSByZXR1cm5lZDsgYW4gZW1wdHkgYXJyYXkgaW5kaWNhdGVzIHRoYXQgCisgICAgICogbm9uZSBhcmUgdG8gYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiBhIG5vbi1udWxsIGVudW1lcmF0aW9uIG9mIFNlYXJjaFJlc3VsdCBvYmplY3RzLiBFYWNoIAorICAgICAqIFNlYXJjaFJlc3VsdCBjb250YWlucyB0aGUgYXR0cmlidXRlcyBpZGVudGlmaWVkIGJ5IGF0dHJpYnV0ZXNUb1JldHVybiAKKyAgICAgKiBhbmQgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0LCBuYW1lZCByZWxhdGl2ZSB0byB0aGUgCisgICAgICogY29udGV4dCBuYW1lZCBieSBuYW1lLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBOYW1pbmdFbnVtZXJhdGlvbiBzZWFyY2gKKyAgICAgICAgKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIG1hdGNoaW5nQXR0cmlidXRlcywKKyAgICAgICAgIFN0cmluZ1tdIGF0dHJpYnV0ZXNUb1JldHVybikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgaW4gYSBzaW5nbGUgY29udGV4dCBmb3Igb2JqZWN0cyB0aGF0IGNvbnRhaW4gYSBzcGVjaWZpZWQgc2V0IAorICAgICAqIG9mIGF0dHJpYnV0ZXMuIFRoaXMgbWV0aG9kIHJldHVybnMgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHN1Y2ggb2JqZWN0cy4gCisgICAgICogSXQgaXMgZXF1aXZhbGVudCB0byBzdXBwbHlpbmcgbnVsbCBhcyB0aGUgYXRyaWJ1dGVzVG9SZXR1cm4gcGFyYW1ldGVyIAorICAgICAqIHRvIHRoZSBtZXRob2Qgc2VhcmNoKE5hbWUsIEF0dHJpYnV0ZXMsIFN0cmluZ1tdKS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBzZWFyY2gKKyAgICAgKiBAcGFyYW0gbWF0Y2hpbmdBdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIHRvIHNlYXJjaCBmb3IuIElmIGVtcHR5IG9yIAorICAgICAqIG51bGwsIGFsbCBvYmplY3RzIGluIHRoZSB0YXJnZXQgY29udGV4dCBhcmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiBhIG5vbi1udWxsIGVudW1lcmF0aW9uIG9mIFNlYXJjaFJlc3VsdCBvYmplY3RzLiBFYWNoIAorICAgICAqIFNlYXJjaFJlc3VsdCBjb250YWlucyB0aGUgYXR0cmlidXRlcyBpZGVudGlmaWVkIGJ5IGF0dHJpYnV0ZXNUb1JldHVybiAKKyAgICAgKiBhbmQgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0LCBuYW1lZCByZWxhdGl2ZSB0byB0aGUgCisgICAgICogY29udGV4dCBuYW1lZCBieSBuYW1lLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBzZWFyY2goTmFtZSBuYW1lLCBBdHRyaWJ1dGVzIG1hdGNoaW5nQXR0cmlidXRlcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzZWFyY2gobmFtZS50b1N0cmluZygpLCBtYXRjaGluZ0F0dHJpYnV0ZXMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgaW4gYSBzaW5nbGUgY29udGV4dCBmb3Igb2JqZWN0cyB0aGF0IGNvbnRhaW4gYSBzcGVjaWZpZWQgc2V0IAorICAgICAqIG9mIGF0dHJpYnV0ZXMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIG1hdGNoaW5nQXR0cmlidXRlcyB0aGUgYXR0cmlidXRlcyB0byBzZWFyY2ggZm9yLiBJZiBlbXB0eSBvciAKKyAgICAgKiBudWxsLCBhbGwgb2JqZWN0cyBpbiB0aGUgdGFyZ2V0IGNvbnRleHQgYXJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBlbnVtZXJhdGlvbiBvZiBTZWFyY2hSZXN1bHQgb2JqZWN0cy4gRWFjaCAKKyAgICAgKiBTZWFyY2hSZXN1bHQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgaWRlbnRpZmllZCBieSBhdHRyaWJ1dGVzVG9SZXR1cm4gCisgICAgICogYW5kIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCwgbmFtZWQgcmVsYXRpdmUgdG8gdGhlIAorICAgICAqIGNvbnRleHQgbmFtZWQgYnkgbmFtZS4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoCisgICAgICAgIChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBtYXRjaGluZ0F0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIHRoZSBuYW1lZCBjb250ZXh0IG9yIG9iamVjdCBmb3IgZW50cmllcyB0aGF0IHNhdGlzZnkgdGhlIAorICAgICAqIGdpdmVuIHNlYXJjaCBmaWx0ZXIuIFBlcmZvcm1zIHRoZSBzZWFyY2ggYXMgc3BlY2lmaWVkIGJ5IHRoZSBzZWFyY2ggCisgICAgICogY29udHJvbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgb3Igb2JqZWN0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBmaWx0ZXIgdGhlIGZpbHRlciBleHByZXNzaW9uIHRvIHVzZSBmb3IgdGhlIHNlYXJjaDsgbWF5IG5vdCBiZSAKKyAgICAgKiBudWxsCisgICAgICogQHBhcmFtIGNvbnMgdGhlIHNlYXJjaCBjb250cm9scyB0aGF0IGNvbnRyb2wgdGhlIHNlYXJjaC4gSWYgbnVsbCwgCisgICAgICogdGhlIGRlZmF1bHQgc2VhcmNoIGNvbnRyb2xzIGFyZSB1c2VkIChlcXVpdmFsZW50IHRvIAorICAgICAqIChuZXcgU2VhcmNoQ29udHJvbHMoKSkpLgorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0cyBvZiB0aGUgb2JqZWN0cyB0aGF0IHNhdGlzZnkgCisgICAgICogdGhlIGZpbHRlcjsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZFNlYXJjaEZpbHRlckV4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGZpbHRlciBzcGVjaWZpZWQgCisgICAgICogaXMgbm90IHN1cHBvcnRlZCBvciB1bmRlcnN0b29kIGJ5IHRoZSB1bmRlcmx5aW5nIGRpcmVjdG9yeQorICAgICAqIEBleGNlcHRpb24gSW52YWxpZFNlYXJjaENvbnRyb2xzRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggY29udHJvbHMgCisgICAgICogY29udGFpbiBpbnZhbGlkIHNldHRpbmdzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaAorICAgICAgICAoTmFtZSBuYW1lLCBTdHJpbmcgZmlsdGVyLCBTZWFyY2hDb250cm9scyBjb25zKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNlYXJjaChuYW1lLnRvU3RyaW5nKCksIGZpbHRlciwgY29ucyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyBpbiB0aGUgbmFtZWQgY29udGV4dCBvciBvYmplY3QgZm9yIGVudHJpZXMgdGhhdCBzYXRpc2Z5IHRoZSAKKyAgICAgKiBnaXZlbiBzZWFyY2ggZmlsdGVyLiBQZXJmb3JtcyB0aGUgc2VhcmNoIGFzIHNwZWNpZmllZCBieSB0aGUgc2VhcmNoIAorICAgICAqIGNvbnRyb2xzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IG9yIG9iamVjdCB0byBzZWFyY2gKKyAgICAgKiBAcGFyYW0gZmlsdGVyIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbiB0byB1c2UgZm9yIHRoZSBzZWFyY2g7IG1heSBub3QgYmUgCisgICAgICogbnVsbAorICAgICAqIEBwYXJhbSBjb25zIHRoZSBzZWFyY2ggY29udHJvbHMgdGhhdCBjb250cm9sIHRoZSBzZWFyY2guIElmIG51bGwsIAorICAgICAqIHRoZSBkZWZhdWx0IHNlYXJjaCBjb250cm9scyBhcmUgdXNlZCAoZXF1aXZhbGVudCB0byAKKyAgICAgKiAobmV3IFNlYXJjaENvbnRyb2xzKCkpKS4KKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIFNlYXJjaFJlc3VsdHMgb2YgdGhlIG9iamVjdHMgdGhhdCBzYXRpc2Z5IAorICAgICAqIHRoZSBmaWx0ZXI7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hGaWx0ZXJFeGNlcHRpb24gaWYgdGhlIHNlYXJjaCBmaWx0ZXIgCisgICAgICogc3BlY2lmaWVkIGlzIG5vdCBzdXBwb3J0ZWQgb3IgdW5kZXJzdG9vZCBieSB0aGUgdW5kZXJseWluZyBkaXJlY3RvcnkKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hDb250cm9sc0V4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGNvbnRyb2xzIAorICAgICAqIGNvbnRhaW4gaW52YWxpZCBzZXR0aW5ncworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBOYW1pbmdFbnVtZXJhdGlvbiBzZWFyY2goU3RyaW5nIG5hbWUsIFN0cmluZyBmaWx0ZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoQ29udHJvbHMgY29ucykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgaW4gdGhlIG5hbWVkIGNvbnRleHQgb3Igb2JqZWN0IGZvciBlbnRyaWVzIHRoYXQgc2F0aXNmeSB0aGUgCisgICAgICogZ2l2ZW4gc2VhcmNoIGZpbHRlci4gUGVyZm9ybXMgdGhlIHNlYXJjaCBhcyBzcGVjaWZpZWQgYnkgdGhlIHNlYXJjaCAKKyAgICAgKiBjb250cm9scy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBvciBvYmplY3QgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIGZpbHRlckV4cHIgdGhlIGZpbHRlciBleHByZXNzaW9uIHRvIHVzZSBmb3IgdGhlIHNlYXJjaC4gCisgICAgICogVGhlIGV4cHJlc3Npb24gbWF5IGNvbnRhaW4gdmFyaWFibGVzIG9mIHRoZSBmb3JtICJ7aX0iIHdoZXJlIGkgaXMgYSAKKyAgICAgKiBub25uZWdhdGl2ZSBpbnRlZ2VyLiBNYXkgbm90IGJlIG51bGwuCisgICAgICogQHBhcmFtIGZpbHRlckFyZ3MgdGhlIGFycmF5IG9mIGFyZ3VtZW50cyB0byBzdWJzdGl0dXRlIGZvciB0aGUgCisgICAgICogdmFyaWFibGVzIGluIGZpbHRlckV4cHIuIFRoZSB2YWx1ZSBvZiBmaWx0ZXJBcmdzW2ldIHdpbGwgcmVwbGFjZSBlYWNoIAorICAgICAqIG9jY3VycmVuY2Ugb2YgIntpfSIuIElmIG51bGwsIGVxdWl2YWxlbnQgdG8gYW4gZW1wdHkgYXJyYXkuCisgICAgICogQHBhcmFtIGNvbnMgdGhlIHNlYXJjaCBjb250cm9scyB0aGF0IGNvbnRyb2wgdGhlIHNlYXJjaC4gSWYgbnVsbCwgdGhlIAorICAgICAqIGRlZmF1bHQgc2VhcmNoIGNvbnRyb2xzIGFyZSB1c2VkIChlcXVpdmFsZW50IHRvIChuZXcgU2VhcmNoQ29udHJvbHMoKSkpLgorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0cyBvZiB0aGUgb2JqZWN0cyB0aGF0IHNhdGlzeSB0aGUgCisgICAgICogZmlsdGVyOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgZmlsdGVyRXhwciBjb250YWlucyB7aX0gCisgICAgICogZXhwcmVzc2lvbnMgd2hlcmUgaSBpcyBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlIGFycmF5IGZpbHRlckFyZ3MKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hDb250cm9sc0V4Y2VwdGlvbiBpZiBjb25zIGNvbnRhaW5zIGludmFsaWQgCisgICAgICogc2V0dGluZ3MKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hGaWx0ZXJFeGNlcHRpb24gaWYgZmlsdGVyRXhwciB3aXRoIGZpbHRlckFyZ3MgCisgICAgICogcmVwcmVzZW50cyBhbiBpbnZhbGlkIHNlYXJjaCBmaWx0ZXIKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoKE5hbWUgbmFtZSwgU3RyaW5nIGZpbHRlckV4cHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gZmlsdGVyQXJncywgU2VhcmNoQ29udHJvbHMgY29ucykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzZWFyY2gobmFtZS50b1N0cmluZygpLCBmaWx0ZXJFeHByLCBmaWx0ZXJBcmdzLCBjb25zKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIHRoZSBuYW1lZCBjb250ZXh0IG9yIG9iamVjdCBmb3IgZW50cmllcyB0aGF0IHNhdGlzZnkgdGhlIAorICAgICAqIGdpdmVuIHNlYXJjaCBmaWx0ZXIuIFBlcmZvcm1zIHRoZSBzZWFyY2ggYXMgc3BlY2lmaWVkIGJ5IHRoZSBzZWFyY2ggCisgICAgICogY29udHJvbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgb3Igb2JqZWN0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBmaWx0ZXJFeHByIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbiB0byB1c2UgZm9yIHRoZSBzZWFyY2guIAorICAgICAqIFRoZSBleHByZXNzaW9uIG1heSBjb250YWluIHZhcmlhYmxlcyBvZiB0aGUgZm9ybSAie2l9IiB3aGVyZSBpIGlzIGEgCisgICAgICogbm9ubmVnYXRpdmUgaW50ZWdlci4gTWF5IG5vdCBiZSBudWxsLgorICAgICAqIEBwYXJhbSBmaWx0ZXJBcmdzIHRoZSBhcnJheSBvZiBhcmd1bWVudHMgdG8gc3Vic3RpdHV0ZSBmb3IgdGhlIAorICAgICAqIHZhcmlhYmxlcyBpbiBmaWx0ZXJFeHByLiBUaGUgdmFsdWUgb2YgZmlsdGVyQXJnc1tpXSB3aWxsIHJlcGxhY2UgZWFjaCAKKyAgICAgKiBvY2N1cnJlbmNlIG9mICJ7aX0iLiBJZiBudWxsLCBlcXVpdmFsZW50IHRvIGFuIGVtcHR5IGFycmF5LgorICAgICAqIEBwYXJhbSBjb25zIHRoZSBzZWFyY2ggY29udHJvbHMgdGhhdCBjb250cm9sIHRoZSBzZWFyY2guIElmIG51bGwsIHRoZSAKKyAgICAgKiBkZWZhdWx0IHNlYXJjaCBjb250cm9scyBhcmUgdXNlZCAoZXF1aXZhbGVudCB0byAobmV3IFNlYXJjaENvbnRyb2xzKCkpKS4KKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIFNlYXJjaFJlc3VsdHMgb2YgdGhlIG9iamVjdHMgdGhhdCBzYXRpc3kgdGhlIAorICAgICAqIGZpbHRlcjsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGZpbHRlckV4cHIgY29udGFpbnMge2l9IAorICAgICAqIGV4cHJlc3Npb25zIHdoZXJlIGkgaXMgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSBhcnJheSBmaWx0ZXJBcmdzCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkU2VhcmNoQ29udHJvbHNFeGNlcHRpb24gaWYgY29ucyBjb250YWlucyBpbnZhbGlkIAorICAgICAqIHNldHRpbmdzCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkU2VhcmNoRmlsdGVyRXhjZXB0aW9uIGlmIGZpbHRlckV4cHIgd2l0aCBmaWx0ZXJBcmdzIAorICAgICAqIHJlcHJlc2VudHMgYW4gaW52YWxpZCBzZWFyY2ggZmlsdGVyCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaAorICAgICAgICAoU3RyaW5nIG5hbWUsIFN0cmluZyBmaWx0ZXJFeHByLCAKKyAgICAgICAgIE9iamVjdFtdIGZpbHRlckFyZ3MsIFNlYXJjaENvbnRyb2xzIGNvbnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb247CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvQ2FjaGVFbnRyeS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvQ2FjaGVFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZmMxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9DYWNoZUVudHJ5LmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKKworLyoqCisgKiBJbXBsZW1lbnRzIGEgY2FjaGUgZW50cnkuCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnJlbW1AYXBhY2hlLm9yZyI+UmVteSBNYXVjaGVyYXQ8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBDYWNoZUVudHJ5IHsKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICBwdWJsaWMgbG9uZyB0aW1lc3RhbXAgPSAtMTsKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWUgPSBudWxsOworICAgIHB1YmxpYyBSZXNvdXJjZUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG51bGw7CisgICAgcHVibGljIFJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKyAgICBwdWJsaWMgRGlyQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKyAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMgPSB0cnVlOworICAgIHB1YmxpYyBsb25nIGFjY2Vzc0NvdW50ID0gMDsKKyAgICBwdWJsaWMgaW50IHNpemUgPSAxOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgeworICAgICAgICB0aW1lc3RhbXAgPSAtMTsKKyAgICAgICAgbmFtZSA9IG51bGw7CisgICAgICAgIGF0dHJpYnV0ZXMgPSBudWxsOworICAgICAgICByZXNvdXJjZSA9IG51bGw7CisgICAgICAgIGNvbnRleHQgPSBudWxsOworICAgICAgICBleGlzdHMgPSB0cnVlOworICAgICAgICBhY2Nlc3NDb3VudCA9IDA7CisgICAgICAgIHNpemUgPSAxOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICgiQ2FjaGUgZW50cnk6ICIgKyBuYW1lICsgIlxuIgorICAgICAgICAgICAgICAgICsgIkV4aXN0czogIiArIGV4aXN0cyArICJcbiIKKyAgICAgICAgICAgICAgICArICJBdHRyaWJ1dGVzOiAiICsgYXR0cmlidXRlcyArICJcbiIKKyAgICAgICAgICAgICAgICArICJSZXNvdXJjZTogIiArIHJlc291cmNlICsgIlxuIgorICAgICAgICAgICAgICAgICsgIkNvbnRleHQ6ICIgKyBjb250ZXh0KTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvQ29uc3RhbnRzLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDAwNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzOworCisKKy8qKgorICogU3RhdGljIGNvbnN0YW50cyBmb3IgdGhpcyBwYWNrYWdlLgorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb25zdGFudHMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVE9DT0xfSEFORExFUl9WQVJJQUJMRSA9IAorICAgICAgICAiamF2YS5wcm90b2NvbC5oYW5kbGVyLnBrZ3MiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFja2FnZSA9ICJvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMiOworCisgICAgLy8gRGVmYXVsdCBuYW1lc3BhY2UgbmFtZQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTkFNRVNQQUNFID0gIkRBVjoiOworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9EaXJDb250ZXh0VVJMQ29ubmVjdGlvbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvRGlyQ29udGV4dFVSTENvbm5lY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTYwNzY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvRGlyQ29udGV4dFVSTENvbm5lY3Rpb24uamF2YQpAQCAtMCwwICsxLDM1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlczsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVDbGFzc1BhaXI7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5KbmRpUGVybWlzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLlJlc291cmNlQXR0cmlidXRlczsKKworLyoqCisgKiBDb25uZWN0aW9uIHRvIGEgSk5ESSBkaXJlY3RvcnkgY29udGV4dC4KKyAqIDxwLz4KKyAqIE5vdGU6IEFsbCB0aGUgb2JqZWN0IGF0dHJpYnV0ZSBuYW1lcyBhcmUgdGhlIFdlYkRBViBuYW1lcywgbm90IHRoZSBIVFRQIAorICogbmFtZXMsIHNvIHRoaXMgY2xhc3Mgb3ZlcnJpZGVzIHNvbWUgbWV0aG9kcyBmcm9tIFVSTENvbm5lY3Rpb24gdG8gZG8gdGhlCisgKiBxdWVyaWVzIHVzaW5nIHRoZSByaWdodCBuYW1lcy4gQ29udGVudCBoYW5kbGVyIGlzIGFsc28gbm90IHVzZWQ7IHRoZSAKKyAqIGNvbnRlbnQgaXMgZGlyZWN0bHkgcmV0dXJuZWQuCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnJlbW1AYXBhY2hlLm9yZyI+UmVteSBNYXVjaGVyYXQ8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBEaXJDb250ZXh0VVJMQ29ubmVjdGlvbiAKKyAgICBleHRlbmRzIFVSTENvbm5lY3Rpb24geworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworICAgIAorICAgIAorICAgIHB1YmxpYyBEaXJDb250ZXh0VVJMQ29ubmVjdGlvbihEaXJDb250ZXh0IGNvbnRleHQsIFVSTCB1cmwpIHsKKyAgICAgICAgc3VwZXIodXJsKTsKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkRpcmVjdG9yeSBjb250ZXh0IGNhbid0IGJlIG51bGwiKTsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnBlcm1pc3Npb24gPSBuZXcgSm5kaVBlcm1pc3Npb24odXJsLnRvU3RyaW5nKCkpOworCX0KKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICB9CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogRGlyZWN0b3J5IGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIERpckNvbnRleHQgY29udGV4dDsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVkIHJlc291cmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBSZXNvdXJjZSByZXNvdXJjZTsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVkIERpckNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIERpckNvbnRleHQgY29sbGVjdGlvbjsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBPdGhlciB1bmtub3duIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IG9iamVjdDsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogRGF0ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBkYXRlOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFBlcm1pc3Npb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGVybWlzc2lvbiBwZXJtaXNzaW9uOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25uZWN0IHRvIHRoZSBEaXJDb250ZXh0LCBhbmQgcmV0cml2ZSB0aGUgYm91bmQgb2JqZWN0LCBhcyB3ZWxsIGFzCisgICAgICogaXRzIGF0dHJpYnV0ZXMuIElmIG5vIG9iamVjdCBpcyBib3VuZCB3aXRoIHRoZSBuYW1lIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgKiBVUkwsIHRoZW4gYW4gSU9FeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gT2JqZWN0IG5vdCBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgaWYgKCFjb25uZWN0ZWQpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkYXRlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRVUkwoKS5nZXRGaWxlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBQcm94eURpckNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgUHJveHlEaXJDb250ZXh0IHByb3h5RGlyQ29udGV4dCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgKFByb3h5RGlyQ29udGV4dCkgY29udGV4dDsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gcHJveHlEaXJDb250ZXh0LmdldEhvc3ROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZXh0TmFtZSA9IHByb3h5RGlyQ29udGV4dC5nZXRDb250ZXh0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaG9zdE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iICsgaG9zdE5hbWUgKyAiLyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhob3N0TmFtZS5sZW5ndGgoKSsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHROYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGNvbnRleHROYW1lICsgIi8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKGNvbnRleHROYW1lLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvYmplY3QgPSBjb250ZXh0Lmxvb2t1cChwYXRoKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gY29udGV4dC5nZXRBdHRyaWJ1dGVzKHBhdGgpOworICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBSZXNvdXJjZSkKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIG9iamVjdDsKKyAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGlyQ29udGV4dCkKKyAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbiA9IChEaXJDb250ZXh0KSBvYmplY3Q7CisgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIE9iamVjdCBub3QgZm91bmQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbnRlbnQgbGVuZ3RoIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q29udGVudExlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEhlYWRlckZpZWxkSW50KFJlc291cmNlQXR0cmlidXRlcy5DT05URU5UX0xFTkdUSCwgLTEpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbnRlbnQgdHlwZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworICAgICAgICByZXR1cm4gZ2V0SGVhZGVyRmllbGQoUmVzb3VyY2VBdHRyaWJ1dGVzLkNPTlRFTlRfVFlQRSk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGFzdCBtb2RpZmllZCBkYXRlLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldERhdGUoKSB7CisgICAgICAgIHJldHVybiBkYXRlOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7CisKKyAgICAgICAgaWYgKCFjb25uZWN0ZWQpIHsKKyAgICAgICAgICAgIC8vIFRyeSB0byBjb25uZWN0IChzaWxlbnRseSkKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubmVjdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIEF0dHJpYnV0ZSBsYXN0TW9kaWZpZWQgPSAKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMuZ2V0KFJlc291cmNlQXR0cmlidXRlcy5MQVNUX01PRElGSUVEKTsKKyAgICAgICAgaWYgKGxhc3RNb2RpZmllZCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIERhdGUgbG1EYXRlID0gKERhdGUpIGxhc3RNb2RpZmllZC5nZXQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbG1EYXRlLmdldFRpbWUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGhlYWRlciBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlckZpZWxkKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKCFjb25uZWN0ZWQpIHsKKyAgICAgICAgICAgIC8vIFRyeSB0byBjb25uZWN0IChzaWxlbnRseSkKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubmVjdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXQobmFtZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlLmdldCgpLnRvU3RyaW5nKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBTaG91bGRuJ3QgaGFwcGVuLCB1bmxlc3MgdGhlIGF0dHJpYnV0ZSBoYXMgbm8gdmFsdWUKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgb2JqZWN0IGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRDb250ZW50KCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIGlmICghY29ubmVjdGVkKQorICAgICAgICAgICAgY29ubmVjdCgpOworICAgICAgICAKKyAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgaWYgKGNvbGxlY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uOworICAgICAgICBpZiAob2JqZWN0ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gb2JqZWN0OworICAgICAgICAKKyAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogR2V0IG9iamVjdCBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGVudChDbGFzc1tdIGNsYXNzZXMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBPYmplY3Qgb2JqZWN0ID0gZ2V0Q29udGVudCgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY2xhc3Nlc1tpXS5pc0luc3RhbmNlKG9iamVjdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgaW5wdXQgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgaWYgKCFjb25uZWN0ZWQpCisgICAgICAgICAgICBjb25uZWN0KCk7CisgICAgICAgIAorICAgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmVvcGVuIHJlc291cmNlCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlc291cmNlID0gKFJlc291cmNlKSBjb250ZXh0Lmxvb2t1cChnZXRVUkwoKS5nZXRGaWxlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIChyZXNvdXJjZS5zdHJlYW1Db250ZW50KCkpOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBQZXJtaXNzaW9uIGZvciB0aGlzIFVSTAorICAgICAqLworICAgIHB1YmxpYyBQZXJtaXNzaW9uIGdldFBlcm1pc3Npb24oKSB7CisKKyAgICAgICAgcmV0dXJuIHBlcm1pc3Npb247CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBMaXN0IGNoaWxkcmVuIG9mIHRoaXMgY29sbGVjdGlvbi4gVGhlIG5hbWVzIGdpdmVuIGFyZSByZWxhdGl2ZSB0byB0aGlzCisgICAgICogVVJJJ3MgcGF0aC4gVGhlIGZ1bGwgdXJpIG9mIHRoZSBjaGlsZHJlbiBpcyB0aGVuIDogcGF0aCArICIvIiArIG5hbWUuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGxpc3QoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgaWYgKCFjb25uZWN0ZWQpIHsKKyAgICAgICAgICAgIGNvbm5lY3QoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKChyZXNvdXJjZSA9PSBudWxsKSAmJiAoY29sbGVjdGlvbiA9PSBudWxsKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBWZWN0b3IgcmVzdWx0ID0gbmV3IFZlY3RvcigpOworICAgICAgICAKKyAgICAgICAgaWYgKGNvbGxlY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBOYW1pbmdFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IGNvbnRleHQubGlzdChnZXRVUkwoKS5nZXRGaWxlKCkpOworICAgICAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBOYW1lQ2xhc3NQYWlyIG5jcCA9IChOYW1lQ2xhc3NQYWlyKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkRWxlbWVudChuY3AuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIFVuZXhwZWN0ZWQgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gcmVzdWx0LmVsZW1lbnRzKCk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0RpckNvbnRleHRVUkxTdHJlYW1IYW5kbGVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9EaXJDb250ZXh0VVJMU3RyZWFtSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OTA0MmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9EaXJDb250ZXh0VVJMU3RyZWFtSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CisKKy8qKgorICogU3RyZWFtIGhhbmRsZXIgdG8gYSBKTkRJIGRpcmVjdG9yeSBjb250ZXh0LgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXIgCisgICAgZXh0ZW5kcyBVUkxTdHJlYW1IYW5kbGVyIHsKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKyAgICAKKyAgICAKKyAgICBwdWJsaWMgRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXIoKSB7CisgICAgfQorICAgIAorICAgIAorICAgIHB1YmxpYyBEaXJDb250ZXh0VVJMU3RyZWFtSGFuZGxlcihEaXJDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICB9CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVmFyaWFibGVzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQmluZGluZ3MgY2xhc3MgbG9hZGVyIC0gZGlyZWN0b3J5IGNvbnRleHQuIEtleWVkIGJ5IENMIGlkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBjbEJpbmRpbmdzID0gbmV3IEhhc2h0YWJsZSgpOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEJpbmRpbmdzIHRocmVhZCAtIGRpcmVjdG9yeSBjb250ZXh0LiBLZXllZCBieSB0aHJlYWQgaWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHRocmVhZEJpbmRpbmdzID0gbmV3IEhhc2h0YWJsZSgpOworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIERpcmVjdG9yeSBjb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBEaXJDb250ZXh0IGNvbnRleHQgPSBudWxsOworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVSTFN0cmVhbUhhbmRsZXIgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIE9wZW5zIGEgY29ubmVjdGlvbiB0byB0aGUgb2JqZWN0IHJlZmVyZW5jZWQgYnkgdGhlIDxjb2RlPlVSTDwvY29kZT4gCisgICAgICogYXJndW1lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oVVJMIHUpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBEaXJDb250ZXh0IGN1cnJlbnRDb250ZXh0ID0gdGhpcy5jb250ZXh0OworICAgICAgICBpZiAoY3VycmVudENvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gZ2V0KCk7CisgICAgICAgIHJldHVybiBuZXcgRGlyQ29udGV4dFVSTENvbm5lY3Rpb24oY3VycmVudENvbnRleHQsIHUpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVJMIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBhcyBwYXJ0IG9mIHRoZSBmaXggZm9yIDM2NTM0LCB0byBlbnN1cmUgdG9TdHJpbmcgaXMgY29ycmVjdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRvRXh0ZXJuYWxGb3JtKFVSTCB1KSB7CisgICAgICAgIC8vIHByZS1jb21wdXRlIGxlbmd0aCBvZiBTdHJpbmdCdWZmZXIKKyAgICAgICAgaW50IGxlbiA9IHUuZ2V0UHJvdG9jb2woKS5sZW5ndGgoKSArIDE7CisgICAgICAgIGlmICh1LmdldFBhdGgoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBsZW4gKz0gdS5nZXRQYXRoKCkubGVuZ3RoKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHUuZ2V0UXVlcnkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBsZW4gKz0gMSArIHUuZ2V0UXVlcnkoKS5sZW5ndGgoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodS5nZXRSZWYoKSAhPSBudWxsKSAKKyAgICAgICAgICAgIGxlbiArPSAxICsgdS5nZXRSZWYoKS5sZW5ndGgoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIobGVuKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCh1LmdldFByb3RvY29sKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCI6Iik7CisgICAgICAgIGlmICh1LmdldFBhdGgoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHUuZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodS5nZXRRdWVyeSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJz8nKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodS5nZXRRdWVyeSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodS5nZXRSZWYoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIjIik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHUuZ2V0UmVmKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgamF2YS5wcm90b2NvbC5oYW5kbGVyLnBrZ3Mgc3lzdGVtIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm90b2NvbEhhbmRsZXIoKSB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShDb25zdGFudHMuUFJPVE9DT0xfSEFORExFUl9WQVJJQUJMRSk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB2YWx1ZSA9IENvbnN0YW50cy5QYWNrYWdlOworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KENvbnN0YW50cy5QUk9UT0NPTF9IQU5ETEVSX1ZBUklBQkxFLCB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZihDb25zdGFudHMuUGFja2FnZSkgPT0gLTEpIHsKKyAgICAgICAgICAgIHZhbHVlICs9ICJ8IiArIENvbnN0YW50cy5QYWNrYWdlOworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KENvbnN0YW50cy5QUk9UT0NPTF9IQU5ETEVSX1ZBUklBQkxFLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0aHJlYWQgb3IgdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyIG9mIHRoZSBjdXJyZW50IAorICAgICAqIHRocmVhZCBpcyBib3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIChjbEJpbmRpbmdzLmNvbnRhaW5zS2V5CisgICAgICAgICAgICAgICAgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpKQorICAgICAgICAgICAgfHwgKHRocmVhZEJpbmRpbmdzLmNvbnRhaW5zS2V5KFRocmVhZC5jdXJyZW50VGhyZWFkKCkpKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQmluZHMgYSBkaXJlY3RvcnkgY29udGV4dCB0byBhIGNsYXNzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmluZChEaXJDb250ZXh0IGRpckNvbnRleHQpIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY3VycmVudENMID0gCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBpZiAoY3VycmVudENMICE9IG51bGwpCisgICAgICAgICAgICBjbEJpbmRpbmdzLnB1dChjdXJyZW50Q0wsIGRpckNvbnRleHQpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBVbmJpbmRzIGEgZGlyZWN0b3J5IGNvbnRleHQgdG8gYSBjbGFzcyBsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVuYmluZCgpIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY3VycmVudENMID0gCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBpZiAoY3VycmVudENMICE9IG51bGwpCisgICAgICAgICAgICBjbEJpbmRpbmdzLnJlbW92ZShjdXJyZW50Q0wpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIGRpcmVjdG9yeSBjb250ZXh0IHRvIGEgdGhyZWFkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiaW5kVGhyZWFkKERpckNvbnRleHQgZGlyQ29udGV4dCkgeworICAgICAgICB0aHJlYWRCaW5kaW5ncy5wdXQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSwgZGlyQ29udGV4dCk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFVuYmluZHMgYSBkaXJlY3RvcnkgY29udGV4dCB0byBhIHRocmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdW5iaW5kVGhyZWFkKCkgeworICAgICAgICB0aHJlYWRCaW5kaW5ncy5yZW1vdmUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgYm91bmQgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERpckNvbnRleHQgZ2V0KCkgeworCisgICAgICAgIERpckNvbnRleHQgcmVzdWx0ID0gbnVsbDsKKworICAgICAgICBUaHJlYWQgY3VycmVudFRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgIENsYXNzTG9hZGVyIGN1cnJlbnRDTCA9IGN1cnJlbnRUaHJlYWQuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisKKyAgICAgICAgLy8gQ2hlY2tpbmcgQ0wgYmluZGluZworICAgICAgICByZXN1bHQgPSAoRGlyQ29udGV4dCkgY2xCaW5kaW5ncy5nZXQoY3VycmVudENMKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgICAgICAvLyBDaGVja2luZyB0aHJlYWQgYmlkaW5nCisgICAgICAgIHJlc3VsdCA9IChEaXJDb250ZXh0KSB0aHJlYWRCaW5kaW5ncy5nZXQoY3VycmVudFRocmVhZCk7CisKKyAgICAgICAgLy8gQ2hlY2tpbmcgcGFyZW50IENMIGJpbmRpbmcKKyAgICAgICAgY3VycmVudENMID0gY3VycmVudENMLmdldFBhcmVudCgpOworICAgICAgICB3aGlsZSAoY3VycmVudENMICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IChEaXJDb250ZXh0KSBjbEJpbmRpbmdzLmdldChjdXJyZW50Q0wpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICBjdXJyZW50Q0wgPSBjdXJyZW50Q0wuZ2V0UGFyZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbGxlZ2FsIGNsYXNzIGxvYWRlciBiaW5kaW5nIik7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIGRpcmVjdG9yeSBjb250ZXh0IHRvIGEgY2xhc3MgbG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiaW5kKENsYXNzTG9hZGVyIGNsLCBEaXJDb250ZXh0IGRpckNvbnRleHQpIHsKKyAgICAgICAgY2xCaW5kaW5ncy5wdXQoY2wsIGRpckNvbnRleHQpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBVbmJpbmRzIGEgZGlyZWN0b3J5IGNvbnRleHQgdG8gYSBjbGFzcyBsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVuYmluZChDbGFzc0xvYWRlciBjbCkgeworICAgICAgICBjbEJpbmRpbmdzLnJlbW92ZShjbCk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgYm91bmQgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERpckNvbnRleHQgZ2V0KENsYXNzTG9hZGVyIGNsKSB7CisgICAgICAgIHJldHVybiAoRGlyQ29udGV4dCkgY2xCaW5kaW5ncy5nZXQoY2wpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGJvdW5kIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEaXJDb250ZXh0IGdldChUaHJlYWQgdGhyZWFkKSB7CisgICAgICAgIHJldHVybiAoRGlyQ29udGV4dCkgdGhyZWFkQmluZGluZ3MuZ2V0KHRocmVhZCk7CisgICAgfQorICAgIAorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9EaXJDb250ZXh0VVJMU3RyZWFtSGFuZGxlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjc3YjVhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlczsKKworaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMU3RyZWFtSGFuZGxlckZhY3Rvcnk7CisKKy8qKgorICogRmFjdG9yeSBmb3IgU3RyZWFtIGhhbmRsZXJzIHRvIGEgSk5ESSBkaXJlY3RvcnkgY29udGV4dC4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cmVtbUBhcGFjaGUub3JnIj5SZW15IE1hdWNoZXJhdDwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIERpckNvbnRleHRVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSAKKyAgICBpbXBsZW1lbnRzIFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5IHsKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKyAgICAKKyAgICAKKyAgICBwdWJsaWMgRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5KCkgeworICAgIH0KKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5IE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFVSTFN0cmVhbUhhbmRsZXIgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgorICAgICAqIFdpbGwgcmV0dXJuIG51bGwgaWYgdGhlIHByb3RvY29sIGlzIG5vdCA8Y29kZT5qbmRpPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvdG9jb2wgdGhlIHByb3RvY29sIChtdXN0IGJlICJqbmRpIiBoZXJlKQorICAgICAqIEByZXR1cm4gYSBVUkxTdHJlYW1IYW5kbGVyIGZvciB0aGUgam5kaSBwcm90b2NvbCwgb3IgbnVsbCBpZiB0aGUgCisgICAgICogcHJvdG9jb2wgaXMgbm90IEpOREkKKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMU3RyZWFtSGFuZGxlciBjcmVhdGVVUkxTdHJlYW1IYW5kbGVyKFN0cmluZyBwcm90b2NvbCkgeworICAgICAgICBpZiAocHJvdG9jb2wuZXF1YWxzKCJqbmRpIikpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvRmlsZURpckNvbnRleHQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0ZpbGVEaXJDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3ZmQwZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0ZpbGVEaXJDb250ZXh0LmphdmEKQEAgLTAsMCArMSwxMTQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5PcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5BdHRyaWJ1dGVzOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5Lk1vZGlmaWNhdGlvbkl0ZW07CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5TZWFyY2hDb250cm9sczsKKworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLk5hbWluZ0NvbnRleHRCaW5kaW5nc0VudW1lcmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLk5hbWluZ0NvbnRleHRFbnVtZXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5OYW1pbmdFbnRyeTsKKworLyoqCisgKiBGaWxlc3lzdGVtIERpcmVjdG9yeSBDb250ZXh0IGltcGxlbWVudGF0aW9uIGhlbHBlciBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBGaWxlRGlyQ29udGV4dCBleHRlbmRzIEJhc2VEaXJDb250ZXh0IHsKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2c9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBGaWxlRGlyQ29udGV4dC5jbGFzcyApOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBzdHJpbmcgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSAyMDQ4OworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQnVpbGRzIGEgZmlsZSBkaXJlY3RvcnkgY29udGV4dCB1c2luZyB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuCisgICAgICovCisgICAgcHVibGljIEZpbGVEaXJDb250ZXh0KCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQnVpbGRzIGEgZmlsZSBkaXJlY3RvcnkgY29udGV4dCB1c2luZyB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuCisgICAgICovCisgICAgcHVibGljIEZpbGVEaXJDb250ZXh0KEhhc2h0YWJsZSBlbnYpIHsKKyAgICAgICAgc3VwZXIoZW52KTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZG9jdW1lbnQgYmFzZSBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgYmFzZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEFic29sdXRlIG5vcm1hbGl6ZWQgZmlsZW5hbWUgb2YgdGhlIGJhc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBhYnNvbHV0ZUJhc2UgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBDYXNlIHNlbnNpdGl2aXR5LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNhc2VTZW5zaXRpdmUgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBBbGxvdyBsaW5raW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGFsbG93TGlua2luZyA9IGZhbHNlOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkb2N1bWVudCByb290LgorICAgICAqCisgICAgICogQHBhcmFtIGRvY0Jhc2UgVGhlIG5ldyBkb2N1bWVudCByb290CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIG5vdAorICAgICAqICBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgd291bGQgY3JlYXRlIGEKKyAgICAgKiAgbWFsZm9ybWVkIFVSTAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvY0Jhc2UoU3RyaW5nIGRvY0Jhc2UpIHsKKworICAgIC8vIFZhbGlkYXRlIHRoZSBmb3JtYXQgb2YgdGhlIHByb3Bvc2VkIGRvY3VtZW50IHJvb3QKKyAgICBpZiAoZG9jQmFzZSA9PSBudWxsKQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlcy5udWxsIikpOworCisgICAgLy8gQ2FsY3VsYXRlIGEgRmlsZSBvYmplY3QgcmVmZXJlbmNpbmcgdGhpcyBkb2N1bWVudCBiYXNlIGRpcmVjdG9yeQorICAgIGJhc2UgPSBuZXcgRmlsZShkb2NCYXNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJhc2UgPSBiYXNlLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgIH0KKworICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIGRvY3VtZW50IGJhc2UgaXMgYW4gZXhpc3RpbmcgZGlyZWN0b3J5CisgICAgaWYgKCFiYXNlLmV4aXN0cygpIHx8ICFiYXNlLmlzRGlyZWN0b3J5KCkgfHwgIWJhc2UuY2FuUmVhZCgpKQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgIChzbS5nZXRTdHJpbmcoImZpbGVSZXNvdXJjZXMuYmFzZSIsIGRvY0Jhc2UpKTsKKyAgICAgICAgdGhpcy5hYnNvbHV0ZUJhc2UgPSBiYXNlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICBzdXBlci5zZXREb2NCYXNlKGRvY0Jhc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgY2FzZSBzZW5zaXRpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlKGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSkgeworICAgICAgICB0aGlzLmNhc2VTZW5zaXRpdmUgPSBjYXNlU2Vuc2l0aXZlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSXMgY2FzZSBzZW5zaXRpdmUgPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGNhc2VTZW5zaXRpdmU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgYWxsb3cgbGlua2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd0xpbmtpbmcoYm9vbGVhbiBhbGxvd0xpbmtpbmcpIHsKKyAgICAgICAgdGhpcy5hbGxvd0xpbmtpbmcgPSBhbGxvd0xpbmtpbmc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJcyBsaW5raW5nIGFsbG93ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QWxsb3dMaW5raW5nKCkgeworICAgICAgICByZXR1cm4gYWxsb3dMaW5raW5nOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIHRoaXMgZGlyZWN0b3J5IGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKworICAgICAgICBjYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKKyAgICAgICAgYWxsb3dMaW5raW5nID0gZmFsc2U7CisgICAgICAgIGFic29sdXRlQmFzZSA9IG51bGw7CisgICAgICAgIGJhc2UgPSBudWxsOworICAgICAgICBzdXBlci5yZWxlYXNlKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnRleHQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gbG9vayB1cAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBib3VuZCB0byBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBsb29rdXAoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgRmlsZSBmaWxlID0gZmlsZShuYW1lKTsKKworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlcy5ub3RGb3VuZCIsIG5hbWUpKTsKKworICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBGaWxlRGlyQ29udGV4dCB0ZW1wQ29udGV4dCA9IG5ldyBGaWxlRGlyQ29udGV4dChlbnYpOworICAgICAgICAgICAgdGVtcENvbnRleHQuc2V0RG9jQmFzZShmaWxlLmdldFBhdGgoKSk7CisgICAgICAgICAgICB0ZW1wQ29udGV4dC5zZXRBbGxvd0xpbmtpbmcoZ2V0QWxsb3dMaW5raW5nKCkpOworICAgICAgICAgICAgdGVtcENvbnRleHQuc2V0Q2FzZVNlbnNpdGl2ZShpc0Nhc2VTZW5zaXRpdmUoKSk7CisgICAgICAgICAgICByZXN1bHQgPSB0ZW1wQ29udGV4dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBGaWxlUmVzb3VyY2UoZmlsZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbmJpbmRzIHRoZSBuYW1lZCBvYmplY3QuIFJlbW92ZXMgdGhlIHRlcm1pbmFsIGF0b21pYyBuYW1lIGluIG5hbWUKKyAgICAgKiBmcm9tIHRoZSB0YXJnZXQgY29udGV4dC0tdGhhdCBuYW1lZCBieSBhbGwgYnV0IHRoZSB0ZXJtaW5hbCBhdG9taWMKKyAgICAgKiBwYXJ0IG9mIG5hbWUuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgaWRlbXBvdGVudC4gSXQgc3VjY2VlZHMgZXZlbiBpZiB0aGUgdGVybWluYWwgYXRvbWljCisgICAgICogbmFtZSBpcyBub3QgYm91bmQgaW4gdGhlIHRhcmdldCBjb250ZXh0LCBidXQgdGhyb3dzCisgICAgICogTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgaW50ZXJtZWRpYXRlIGNvbnRleHRzIGRvIG5vdCBleGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiBpbnRlcm1lZGlhdGUgY29udGV4dCBkb2VzIG5vdAorICAgICAqIGV4aXN0CisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5iaW5kKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBGaWxlIGZpbGUgPSBmaWxlKG5hbWUpOworCisgICAgICAgIGlmIChmaWxlID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicmVzb3VyY2VzLm5vdEZvdW5kIiwgbmFtZSkpOworCisgICAgICAgIGlmICghZmlsZS5kZWxldGUoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJyZXNvdXJjZXMudW5iaW5kRmFpbGVkIiwgbmFtZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5ldyBuYW1lIHRvIHRoZSBvYmplY3QgYm91bmQgdG8gYW4gb2xkIG5hbWUsIGFuZCB1bmJpbmRzIHRoZQorICAgICAqIG9sZCBuYW1lLiBCb3RoIG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGlzIGNvbnRleHQuIEFueSBhdHRyaWJ1dGVzCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBvbGQgbmFtZSBiZWNvbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgbmFtZS4KKyAgICAgKiBJbnRlcm1lZGlhdGUgY29udGV4dHMgb2YgdGhlIG9sZCBuYW1lIGFyZSBub3QgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvbGROYW1lIHRoZSBuYW1lIG9mIHRoZSBleGlzdGluZyBiaW5kaW5nOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG5ld05hbWUgdGhlIG5hbWUgb2YgdGhlIG5ldyBiaW5kaW5nOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5ld05hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbmFtZShTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIEZpbGUgZmlsZSA9IGZpbGUob2xkTmFtZSk7CisKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJyZXNvdXJjZXMubm90Rm91bmQiLCBvbGROYW1lKSk7CisKKyAgICAgICAgRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUoYmFzZSwgbmV3TmFtZSk7CisKKyAgICAgICAgZmlsZS5yZW5hbWVUbyhuZXdGaWxlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyB0aGUgbmFtZXMgYm91bmQgaW4gdGhlIG5hbWVkIGNvbnRleHQsIGFsb25nIHdpdGggdGhlIGNsYXNzCisgICAgICogbmFtZXMgb2Ygb2JqZWN0cyBib3VuZCB0byB0aGVtLiBUaGUgY29udGVudHMgb2YgYW55IHN1YmNvbnRleHRzIGFyZQorICAgICAqIG5vdCBpbmNsdWRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIGJpbmRpbmcgaXMgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoaXMgY29udGV4dCwgaXRzIGVmZmVjdCBvbgorICAgICAqIGFuIGVudW1lcmF0aW9uIHByZXZpb3VzbHkgcmV0dXJuZWQgaXMgdW5kZWZpbmVkLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIG5hbWVzIGFuZCBjbGFzcyBuYW1lcyBvZiB0aGUgYmluZGluZ3MgaW4KKyAgICAgKiB0aGlzIGNvbnRleHQuIEVhY2ggZWxlbWVudCBvZiB0aGUgZW51bWVyYXRpb24gaXMgb2YgdHlwZSBOYW1lQ2xhc3NQYWlyLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0KFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBGaWxlIGZpbGUgPSBmaWxlKG5hbWUpOworCisgICAgICAgIGlmIChmaWxlID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicmVzb3VyY2VzLm5vdEZvdW5kIiwgbmFtZSkpOworCisgICAgICAgIHJldHVybiBuZXcgTmFtaW5nQ29udGV4dEVudW1lcmF0aW9uKGxpc3QoZmlsZSkuaXRlcmF0b3IoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgdGhlIG5hbWVzIGJvdW5kIGluIHRoZSBuYW1lZCBjb250ZXh0LCBhbG9uZyB3aXRoIHRoZQorICAgICAqIG9iamVjdHMgYm91bmQgdG8gdGhlbS4gVGhlIGNvbnRlbnRzIG9mIGFueSBzdWJjb250ZXh0cyBhcmUgbm90CisgICAgICogaW5jbHVkZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBiaW5kaW5nIGlzIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGlzIGNvbnRleHQsIGl0cyBlZmZlY3Qgb24KKyAgICAgKiBhbiBlbnVtZXJhdGlvbiBwcmV2aW91c2x5IHJldHVybmVkIGlzIHVuZGVmaW5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGxpc3QKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBiaW5kaW5ncyBpbiB0aGlzIGNvbnRleHQuCisgICAgICogRWFjaCBlbGVtZW50IG9mIHRoZSBlbnVtZXJhdGlvbiBpcyBvZiB0eXBlIEJpbmRpbmcuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3RCaW5kaW5ncyhTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgRmlsZSBmaWxlID0gZmlsZShuYW1lKTsKKworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlcy5ub3RGb3VuZCIsIG5hbWUpKTsKKworICAgICAgICByZXR1cm4gbmV3IE5hbWluZ0NvbnRleHRCaW5kaW5nc0VudW1lcmF0aW9uKGxpc3QoZmlsZSkuaXRlcmF0b3IoKSwKKyAgICAgICAgICAgICAgICB0aGlzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIG5hbWVkIGNvbnRleHQgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgbmFtZXNwYWNlLiBBbnkKKyAgICAgKiBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSBhcmUgYWxzbyByZW1vdmVkLiBJbnRlcm1lZGlhdGUKKyAgICAgKiBjb250ZXh0cyBhcmUgbm90IGRlc3Ryb3llZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LiBJdCBzdWNjZWVkcyBldmVuIGlmIHRoZSB0ZXJtaW5hbCBhdG9taWMKKyAgICAgKiBuYW1lIGlzIG5vdCBib3VuZCBpbiB0aGUgdGFyZ2V0IGNvbnRleHQsIGJ1dCB0aHJvd3MKKyAgICAgKiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBpbnRlcm1lZGlhdGUgY29udGV4dHMgZG8gbm90IGV4aXN0LgorICAgICAqCisgICAgICogSW4gYSBmZWRlcmF0ZWQgbmFtaW5nIHN5c3RlbSwgYSBjb250ZXh0IGZyb20gb25lIG5hbWluZyBzeXN0ZW0gbWF5IGJlCisgICAgICogYm91bmQgdG8gYSBuYW1lIGluIGFub3RoZXIuIE9uZSBjYW4gc3Vic2VxdWVudGx5IGxvb2sgdXAgYW5kIHBlcmZvcm0KKyAgICAgKiBvcGVyYXRpb25zIG9uIHRoZSBmb3JlaWduIGNvbnRleHQgdXNpbmcgYSBjb21wb3NpdGUgbmFtZS4gSG93ZXZlciwgYW4KKyAgICAgKiBhdHRlbXB0IGRlc3Ryb3kgdGhlIGNvbnRleHQgdXNpbmcgdGhpcyBjb21wb3NpdGUgbmFtZSB3aWxsIGZhaWwgd2l0aAorICAgICAqIE5vdENvbnRleHRFeGNlcHRpb24sIGJlY2F1c2UgdGhlIGZvcmVpZ24gY29udGV4dCBpcyBub3QgYSAic3ViY29udGV4dCIKKyAgICAgKiBvZiB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyBib3VuZC4gSW5zdGVhZCwgdXNlIHVuYmluZCgpIHRvIHJlbW92ZQorICAgICAqIHRoZSBiaW5kaW5nIG9mIHRoZSBmb3JlaWduIGNvbnRleHQuIERlc3Ryb3lpbmcgdGhlIGZvcmVpZ24gY29udGV4dAorICAgICAqIHJlcXVpcmVzIHRoYXQgdGhlIGRlc3Ryb3lTdWJjb250ZXh0KCkgYmUgcGVyZm9ybWVkIG9uIGEgY29udGV4dCBmcm9tCisgICAgICogdGhlIGZvcmVpZ24gY29udGV4dCdzICJuYXRpdmUiIG5hbWluZyBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBiZSBkZXN0cm95ZWQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiBpbnRlcm1lZGlhdGUgY29udGV4dCBkb2VzIG5vdAorICAgICAqIGV4aXN0CisgICAgICogQGV4Y2VwdGlvbiBOb3RDb250ZXh0RXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIGJvdW5kIGJ1dCBkb2VzIG5vdCBuYW1lCisgICAgICogYSBjb250ZXh0LCBvciBkb2VzIG5vdCBuYW1lIGEgY29udGV4dCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lTdWJjb250ZXh0KFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgdW5iaW5kKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1lZCBvYmplY3QsIGZvbGxvd2luZyBsaW5rcyBleGNlcHQgZm9yIHRoZSB0ZXJtaW5hbAorICAgICAqIGF0b21pYyBjb21wb25lbnQgb2YgdGhlIG5hbWUuIElmIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZSBpcyBub3QgYQorICAgICAqIGxpbmssIHJldHVybnMgdGhlIG9iamVjdCBpdHNlbGYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgdXAKKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZSwgbm90IGZvbGxvd2luZyB0aGUgdGVybWluYWwgbGluaworICAgICAqIChpZiBhbnkpLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9va3VwTGluayhTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIE5vdGUgOiBMaW5rcyBhcmUgbm90IHN1cHBvcnRlZAorICAgICAgICByZXR1cm4gbG9va3VwKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBjb250ZXh0IHdpdGhpbiBpdHMgb3duIG5hbWVzcGFjZS4KKyAgICAgKiA8cD4KKyAgICAgKiBNYW55IG5hbWluZyBzZXJ2aWNlcyBoYXZlIGEgbm90aW9uIG9mIGEgImZ1bGwgbmFtZSIgZm9yIG9iamVjdHMgaW4KKyAgICAgKiB0aGVpciByZXNwZWN0aXZlIG5hbWVzcGFjZXMuIEZvciBleGFtcGxlLCBhbiBMREFQIGVudHJ5IGhhcyBhCisgICAgICogZGlzdGluZ3Vpc2hlZCBuYW1lLCBhbmQgYSBETlMgcmVjb3JkIGhhcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiBUaGlzCisgICAgICogbWV0aG9kIGFsbG93cyB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHRvIHJldHJpZXZlIHRoaXMgbmFtZS4gVGhlIHN0cmluZworICAgICAqIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGlzIG5vdCBhIEpOREkgY29tcG9zaXRlIG5hbWUgYW5kIHNob3VsZCBub3QgYmUKKyAgICAgKiBwYXNzZWQgZGlyZWN0bHkgdG8gY29udGV4dCBtZXRob2RzLiBJbiBuYW1pbmcgc3lzdGVtcyBmb3Igd2hpY2ggdGhlCisgICAgICogbm90aW9uIG9mIGZ1bGwgbmFtZSBkb2VzIG5vdCBtYWtlIHNlbnNlLAorICAgICAqIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMgY29udGV4dCdzIG5hbWUgaW4gaXRzIG93biBuYW1lc3BhY2U7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiB0aGUgbmFtaW5nIHN5c3RlbSBkb2VzCisgICAgICogbm90IGhhdmUgdGhlIG5vdGlvbiBvZiBhIGZ1bGwgbmFtZQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZUluTmFtZXNwYWNlKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkb2NCYXNlOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGlyQ29udGV4dCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBzZWxlY3RlZCBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIG9iamVjdC4KKyAgICAgKiBTZWUgdGhlIGNsYXNzIGRlc2NyaXB0aW9uIHJlZ2FyZGluZyBhdHRyaWJ1dGUgbW9kZWxzLCBhdHRyaWJ1dGUgdHlwZQorICAgICAqIG5hbWVzLCBhbmQgb3BlcmF0aW9uYWwgYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzOyBuZXZlciBudWxsCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMKKyAgICAgKiBAcGFyYW0gYXR0cklkcyB0aGUgaWRlbnRpZmllcnMgb2YgdGhlIGF0dHJpYnV0ZXMgdG8gcmV0cmlldmUuIG51bGwKKyAgICAgKiBpbmRpY2F0ZXMgdGhhdCBhbGwgYXR0cmlidXRlcyBzaG91bGQgYmUgcmV0cmlldmVkOyBhbiBlbXB0eSBhcnJheQorICAgICAqIGluZGljYXRlcyB0aGF0IG5vbmUgc2hvdWxkIGJlIHJldHJpZXZlZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIGF0dHJJZHMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIC8vIEJ1aWxkaW5nIGF0dHJpYnV0ZSBsaXN0CisgICAgICAgIEZpbGUgZmlsZSA9IGZpbGUobmFtZSk7CisKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJyZXNvdXJjZXMubm90Rm91bmQiLCBuYW1lKSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2VBdHRyaWJ1dGVzKGZpbGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBvYmplY3QuIFRoZSBvcmRlciBvZgorICAgICAqIHRoZSBtb2RpZmljYXRpb25zIGlzIG5vdCBzcGVjaWZpZWQuIFdoZXJlIHBvc3NpYmxlLCB0aGUgbW9kaWZpY2F0aW9ucworICAgICAqIGFyZSBwZXJmb3JtZWQgYXRvbWljYWxseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2UgYXR0cmlidXRlcyB3aWxsIGJlIHVwZGF0ZWQKKyAgICAgKiBAcGFyYW0gbW9kX29wIHRoZSBtb2RpZmljYXRpb24gb3BlcmF0aW9uLCBvbmUgb2Y6IEFERF9BVFRSSUJVVEUsCisgICAgICogUkVQTEFDRV9BVFRSSUJVVEUsIFJFTU9WRV9BVFRSSUJVVEUKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYmUgdXNlZCBmb3IgdGhlIG1vZGlmaWNhdGlvbjsgbWF5IG5vdAorICAgICAqIGJlIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIEF0dHJpYnV0ZU1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgbW9kaWZpY2F0aW9uIGNhbm5vdCBiZQorICAgICAqIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtb2RpZnlBdHRyaWJ1dGVzKFN0cmluZyBuYW1lLCBpbnQgbW9kX29wLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgb2JqZWN0IHVzaW5nIGFuIGFuCisgICAgICogb3JkZXJlZCBsaXN0IG9mIG1vZGlmaWNhdGlvbnMuIFRoZSBtb2RpZmljYXRpb25zIGFyZSBwZXJmb3JtZWQgaW4gdGhlCisgICAgICogb3JkZXIgc3BlY2lmaWVkLiBFYWNoIG1vZGlmaWNhdGlvbiBzcGVjaWZpZXMgYSBtb2RpZmljYXRpb24gb3BlcmF0aW9uCisgICAgICogY29kZSBhbmQgYW4gYXR0cmlidXRlIG9uIHdoaWNoIHRvIG9wZXJhdGUuIFdoZXJlIHBvc3NpYmxlLCB0aGUKKyAgICAgKiBtb2RpZmljYXRpb25zIGFyZSBwZXJmb3JtZWQgYXRvbWljYWxseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2UgYXR0cmlidXRlcyB3aWxsIGJlIHVwZGF0ZWQKKyAgICAgKiBAcGFyYW0gbW9kcyBhbiBvcmRlcmVkIHNlcXVlbmNlIG9mIG1vZGlmaWNhdGlvbnMgdG8gYmUgcGVyZm9ybWVkOyBtYXkKKyAgICAgKiBub3QgYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gQXR0cmlidXRlTW9kaWZpY2F0aW9uRXhjZXB0aW9uIGlmIHRoZSBtb2RpZmljYXRpb24gY2Fubm90IGJlCisgICAgICogY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1vZGlmeUF0dHJpYnV0ZXMoU3RyaW5nIG5hbWUsIE1vZGlmaWNhdGlvbkl0ZW1bXSBtb2RzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdCwgYWxvbmcgd2l0aCBhc3NvY2lhdGVkIGF0dHJpYnV0ZXMuIElmIGF0dHJzCisgICAgICogaXMgbnVsbCwgdGhlIHJlc3VsdGluZyBiaW5kaW5nIHdpbGwgaGF2ZSB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkCisgICAgICogd2l0aCBvYmogaWYgb2JqIGlzIGEgRGlyQ29udGV4dCwgYW5kIG5vIGF0dHJpYnV0ZXMgb3RoZXJ3aXNlLiBJZiBhdHRycworICAgICAqIGlzIG5vbi1udWxsLCB0aGUgcmVzdWx0aW5nIGJpbmRpbmcgd2lsbCBoYXZlIGF0dHJzIGFzIGl0cyBhdHRyaWJ1dGVzOworICAgICAqIGFueSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBvYmogYXJlIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGJpbmRpbmcKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBzb21lICJtYW5kYXRvcnkiIGF0dHJpYnV0ZXMKKyAgICAgKiBvZiB0aGUgYmluZGluZyBhcmUgbm90IHN1cHBsaWVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaiwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gTm90ZTogTm8gY3VzdG9tIGF0dHJpYnV0ZXMgYWxsb3dlZAorCisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGJhc2UsIG5hbWUpOworICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicmVzb3VyY2VzLmFscmVhZHlCb3VuZCIsIG5hbWUpKTsKKworICAgICAgICByZWJpbmQobmFtZSwgb2JqLCBhdHRycyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QsIGFsb25nIHdpdGggYXNzb2NpYXRlZCBhdHRyaWJ1dGVzLAorICAgICAqIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBiaW5kaW5nLiBJZiBhdHRycyBpcyBudWxsIGFuZCBvYmogaXMgYQorICAgICAqIERpckNvbnRleHQsIHRoZSBhdHRyaWJ1dGVzIGZyb20gb2JqIGFyZSB1c2VkLiBJZiBhdHRycyBpcyBudWxsIGFuZCBvYmoKKyAgICAgKiBpcyBub3QgYSBEaXJDb250ZXh0LCBhbnkgZXhpc3RpbmcgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdAorICAgICAqIGFscmVhZHkgYm91bmQgaW4gdGhlIGRpcmVjdG9yeSByZW1haW4gdW5jaGFuZ2VkLiBJZiBhdHRycyBpcyBub24tbnVsbCwKKyAgICAgKiBhbnkgZXhpc3RpbmcgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdCBhbHJlYWR5IGJvdW5kIGluCisgICAgICogdGhlIGRpcmVjdG9yeSBhcmUgcmVtb3ZlZCBhbmQgYXR0cnMgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lZAorICAgICAqIG9iamVjdC4gSWYgb2JqIGlzIGEgRGlyQ29udGV4dCBhbmQgYXR0cnMgaXMgbm9uLW51bGwsIHRoZSBhdHRyaWJ1dGVzCisgICAgICogb2Ygb2JqIGFyZSBpZ25vcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBiaW5kaW5nCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBzb21lICJtYW5kYXRvcnkiIGF0dHJpYnV0ZXMKKyAgICAgKiBvZiB0aGUgYmluZGluZyBhcmUgbm90IHN1cHBsaWVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmViaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBOb3RlOiBObyBjdXN0b20gYXR0cmlidXRlcyBhbGxvd2VkCisgICAgICAgIC8vIENoZWNrIG9iaiB0eXBlCisKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoYmFzZSwgbmFtZSk7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaXMgPSAoKFJlc291cmNlKSBvYmopLnN0cmVhbUNvbnRlbnQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJbnB1dFN0cmVhbSkgeworICAgICAgICAgICAgaXMgPSAoSW5wdXRTdHJlYW0pIG9iajsKKyAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEaXJDb250ZXh0KSB7CisgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGlmICghZmlsZS5kZWxldGUoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicmVzb3VyY2VzLmJpbmRGYWlsZWQiLCBuYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZpbGUubWtkaXIoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlcy5iaW5kRmFpbGVkIiwgbmFtZSkpOworICAgICAgICB9CisgICAgICAgIGlmIChpcyA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlcy5iaW5kRmFpbGVkIiwgbmFtZSkpOworCisgICAgICAgIC8vIE9wZW4gb3MKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvcyA9IG51bGw7CisgICAgICAgICAgICBieXRlIGJ1ZmZlcltdID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOworICAgICAgICAgICAgaW50IGxlbiA9IC0xOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IGlzLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBvcy53cml0ZShidWZmZXIsIDAsIGxlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAob3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicmVzb3VyY2VzLmJpbmRGYWlsZWQiLCBlKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbmQgYmluZHMgYSBuZXcgY29udGV4dCwgYWxvbmcgd2l0aCBhc3NvY2lhdGVkIGF0dHJpYnV0ZXMuCisgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBzdWJjb250ZXh0IHdpdGggdGhlIGdpdmVuIG5hbWUsIGJpbmRzIGl0IGluCisgICAgICogdGhlIHRhcmdldCBjb250ZXh0ICh0aGF0IG5hbWVkIGJ5IGFsbCBidXQgdGVybWluYWwgYXRvbWljIGNvbXBvbmVudCBvZgorICAgICAqIHRoZSBuYW1lKSwgYW5kIGFzc29jaWF0ZXMgdGhlIHN1cHBsaWVkIGF0dHJpYnV0ZXMgd2l0aCB0aGUgbmV3bHkKKyAgICAgKiBjcmVhdGVkIG9iamVjdC4gQWxsIGludGVybWVkaWF0ZSBhbmQgdGFyZ2V0IGNvbnRleHRzIG11c3QgYWxyZWFkeQorICAgICAqIGV4aXN0LiBJZiBhdHRycyBpcyBudWxsLCB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCisgICAgICogQ29udGV4dC5jcmVhdGVTdWJjb250ZXh0KCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBjcmVhdGU7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dAorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dAorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBhdHRycyBkb2VzIG5vdCBjb250YWluIGFsbAorICAgICAqIHRoZSBtYW5kYXRvcnkgYXR0cmlidXRlcyByZXF1aXJlZCBmb3IgY3JlYXRpb24KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyQ29udGV4dCBjcmVhdGVTdWJjb250ZXh0KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShiYXNlLCBuYW1lKTsKKyAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlcy5hbHJlYWR5Qm91bmQiLCBuYW1lKSk7CisgICAgICAgIGlmICghZmlsZS5ta2RpcigpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlcy5iaW5kRmFpbGVkIiwgbmFtZSkpOworICAgICAgICByZXR1cm4gKERpckNvbnRleHQpIGxvb2t1cChuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lZCBvYmplY3QuIFRoZSBzY2hlbWEKKyAgICAgKiBkZXNjcmliZXMgcnVsZXMgcmVnYXJkaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG5hbWVzcGFjZSBhbmQgdGhlCisgICAgICogYXR0cmlidXRlcyBzdG9yZWQgd2l0aGluIGl0LiBUaGUgc2NoZW1hIHNwZWNpZmllcyB3aGF0IHR5cGVzIG9mCisgICAgICogb2JqZWN0cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGRpcmVjdG9yeSBhbmQgd2hlcmUgdGhleSBjYW4gYmUgYWRkZWQ7CisgICAgICogd2hhdCBtYW5kYXRvcnkgYW5kIG9wdGlvbmFsIGF0dHJpYnV0ZXMgYW4gb2JqZWN0IGNhbiBoYXZlLiBUaGUgcmFuZ2UKKyAgICAgKiBvZiBzdXBwb3J0IGZvciBzY2hlbWFzIGlzIGRpcmVjdG9yeS1zcGVjaWZpYy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2Ugc2NoZW1hIGlzIHRvIGJlIHJldHJpZXZlZAorICAgICAqIEByZXR1cm4gdGhlIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQ7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiBzY2hlbWEgbm90IHN1cHBvcnRlZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBEaXJDb250ZXh0IGdldFNjaGVtYShTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBhIGNvbnRleHQgY29udGFpbmluZyB0aGUgc2NoZW1hIG9iamVjdHMgb2YgdGhlIG5hbWVkCisgICAgICogb2JqZWN0J3MgY2xhc3MgZGVmaW5pdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIG9iamVjdCBjbGFzcyBkZWZpbml0aW9uIGlzIHRvCisgICAgICogYmUgcmV0cmlldmVkCisgICAgICogQHJldHVybiB0aGUgRGlyQ29udGV4dCBjb250YWluaW5nIHRoZSBuYW1lZCBvYmplY3QncyBjbGFzcworICAgICAqIGRlZmluaXRpb25zOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgc2NoZW1hIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyQ29udGV4dCBnZXRTY2hlbWFDbGFzc0RlZmluaXRpb24oU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyBpbiBhIHNpbmdsZSBjb250ZXh0IGZvciBvYmplY3RzIHRoYXQgY29udGFpbiBhIHNwZWNpZmllZCBzZXQKKyAgICAgKiBvZiBhdHRyaWJ1dGVzLCBhbmQgcmV0cmlldmVzIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIFRoZSBzZWFyY2ggaXMKKyAgICAgKiBwZXJmb3JtZWQgdXNpbmcgdGhlIGRlZmF1bHQgU2VhcmNoQ29udHJvbHMgc2V0dGluZ3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBzZWFyY2gKKyAgICAgKiBAcGFyYW0gbWF0Y2hpbmdBdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIHRvIHNlYXJjaCBmb3IuIElmIGVtcHR5IG9yCisgICAgICogbnVsbCwgYWxsIG9iamVjdHMgaW4gdGhlIHRhcmdldCBjb250ZXh0IGFyZSByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlc1RvUmV0dXJuIHRoZSBhdHRyaWJ1dGVzIHRvIHJldHVybi4gbnVsbCBpbmRpY2F0ZXMKKyAgICAgKiB0aGF0IGFsbCBhdHRyaWJ1dGVzIGFyZSB0byBiZSByZXR1cm5lZDsgYW4gZW1wdHkgYXJyYXkgaW5kaWNhdGVzIHRoYXQKKyAgICAgKiBub25lIGFyZSB0byBiZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0IG9iamVjdHMuIEVhY2gKKyAgICAgKiBTZWFyY2hSZXN1bHQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgaWRlbnRpZmllZCBieSBhdHRyaWJ1dGVzVG9SZXR1cm4KKyAgICAgKiBhbmQgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0LCBuYW1lZCByZWxhdGl2ZSB0byB0aGUKKyAgICAgKiBjb250ZXh0IG5hbWVkIGJ5IG5hbWUuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBtYXRjaGluZ0F0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBhdHRyaWJ1dGVzVG9SZXR1cm4pCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIGEgc2luZ2xlIGNvbnRleHQgZm9yIG9iamVjdHMgdGhhdCBjb250YWluIGEgc3BlY2lmaWVkIHNldAorICAgICAqIG9mIGF0dHJpYnV0ZXMuIFRoaXMgbWV0aG9kIHJldHVybnMgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHN1Y2ggb2JqZWN0cy4KKyAgICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHN1cHBseWluZyBudWxsIGFzIHRoZSBhdHJpYnV0ZXNUb1JldHVybiBwYXJhbWV0ZXIKKyAgICAgKiB0byB0aGUgbWV0aG9kIHNlYXJjaChOYW1lLCBBdHRyaWJ1dGVzLCBTdHJpbmdbXSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBzZWFyY2gKKyAgICAgKiBAcGFyYW0gbWF0Y2hpbmdBdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIHRvIHNlYXJjaCBmb3IuIElmIGVtcHR5IG9yCisgICAgICogbnVsbCwgYWxsIG9iamVjdHMgaW4gdGhlIHRhcmdldCBjb250ZXh0IGFyZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0IG9iamVjdHMuIEVhY2gKKyAgICAgKiBTZWFyY2hSZXN1bHQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgaWRlbnRpZmllZCBieSBhdHRyaWJ1dGVzVG9SZXR1cm4KKyAgICAgKiBhbmQgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0LCBuYW1lZCByZWxhdGl2ZSB0byB0aGUKKyAgICAgKiBjb250ZXh0IG5hbWVkIGJ5IG5hbWUuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBtYXRjaGluZ0F0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIHRoZSBuYW1lZCBjb250ZXh0IG9yIG9iamVjdCBmb3IgZW50cmllcyB0aGF0IHNhdGlzZnkgdGhlCisgICAgICogZ2l2ZW4gc2VhcmNoIGZpbHRlci4gUGVyZm9ybXMgdGhlIHNlYXJjaCBhcyBzcGVjaWZpZWQgYnkgdGhlIHNlYXJjaAorICAgICAqIGNvbnRyb2xzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgb3Igb2JqZWN0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBmaWx0ZXIgdGhlIGZpbHRlciBleHByZXNzaW9uIHRvIHVzZSBmb3IgdGhlIHNlYXJjaDsgbWF5IG5vdCBiZQorICAgICAqIG51bGwKKyAgICAgKiBAcGFyYW0gY29ucyB0aGUgc2VhcmNoIGNvbnRyb2xzIHRoYXQgY29udHJvbCB0aGUgc2VhcmNoLiBJZiBudWxsLAorICAgICAqIHRoZSBkZWZhdWx0IHNlYXJjaCBjb250cm9scyBhcmUgdXNlZCAoZXF1aXZhbGVudCB0bworICAgICAqIChuZXcgU2VhcmNoQ29udHJvbHMoKSkpLgorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0cyBvZiB0aGUgb2JqZWN0cyB0aGF0IHNhdGlzZnkKKyAgICAgKiB0aGUgZmlsdGVyOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkU2VhcmNoRmlsdGVyRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggZmlsdGVyIHNwZWNpZmllZAorICAgICAqIGlzIG5vdCBzdXBwb3J0ZWQgb3IgdW5kZXJzdG9vZCBieSB0aGUgdW5kZXJseWluZyBkaXJlY3RvcnkKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hDb250cm9sc0V4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGNvbnRyb2xzCisgICAgICogY29udGFpbiBpbnZhbGlkIHNldHRpbmdzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaENvbnRyb2xzIGNvbnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIHRoZSBuYW1lZCBjb250ZXh0IG9yIG9iamVjdCBmb3IgZW50cmllcyB0aGF0IHNhdGlzZnkgdGhlCisgICAgICogZ2l2ZW4gc2VhcmNoIGZpbHRlci4gUGVyZm9ybXMgdGhlIHNlYXJjaCBhcyBzcGVjaWZpZWQgYnkgdGhlIHNlYXJjaAorICAgICAqIGNvbnRyb2xzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgb3Igb2JqZWN0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBmaWx0ZXJFeHByIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbiB0byB1c2UgZm9yIHRoZSBzZWFyY2guCisgICAgICogVGhlIGV4cHJlc3Npb24gbWF5IGNvbnRhaW4gdmFyaWFibGVzIG9mIHRoZSBmb3JtICJ7aX0iIHdoZXJlIGkgaXMgYQorICAgICAqIG5vbm5lZ2F0aXZlIGludGVnZXIuIE1heSBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gZmlsdGVyQXJncyB0aGUgYXJyYXkgb2YgYXJndW1lbnRzIHRvIHN1YnN0aXR1dGUgZm9yIHRoZQorICAgICAqIHZhcmlhYmxlcyBpbiBmaWx0ZXJFeHByLiBUaGUgdmFsdWUgb2YgZmlsdGVyQXJnc1tpXSB3aWxsIHJlcGxhY2UgZWFjaAorICAgICAqIG9jY3VycmVuY2Ugb2YgIntpfSIuIElmIG51bGwsIGVxdWl2YWxlbnQgdG8gYW4gZW1wdHkgYXJyYXkuCisgICAgICogQHBhcmFtIGNvbnMgdGhlIHNlYXJjaCBjb250cm9scyB0aGF0IGNvbnRyb2wgdGhlIHNlYXJjaC4gSWYgbnVsbCwgdGhlCisgICAgICogZGVmYXVsdCBzZWFyY2ggY29udHJvbHMgYXJlIHVzZWQgKGVxdWl2YWxlbnQgdG8gKG5ldyBTZWFyY2hDb250cm9scygpKSkuCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiBTZWFyY2hSZXN1bHRzIG9mIHRoZSBvYmplY3RzIHRoYXQgc2F0aXN5IHRoZQorICAgICAqIGZpbHRlcjsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGZpbHRlckV4cHIgY29udGFpbnMge2l9CisgICAgICogZXhwcmVzc2lvbnMgd2hlcmUgaSBpcyBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlIGFycmF5IGZpbHRlckFyZ3MKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hDb250cm9sc0V4Y2VwdGlvbiBpZiBjb25zIGNvbnRhaW5zIGludmFsaWQKKyAgICAgKiBzZXR0aW5ncworICAgICAqIEBleGNlcHRpb24gSW52YWxpZFNlYXJjaEZpbHRlckV4Y2VwdGlvbiBpZiBmaWx0ZXJFeHByIHdpdGggZmlsdGVyQXJncworICAgICAqIHJlcHJlc2VudHMgYW4gaW52YWxpZCBzZWFyY2ggZmlsdGVyCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbHRlckV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBmaWx0ZXJBcmdzLCBTZWFyY2hDb250cm9scyBjb25zKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29udGV4dC1yZWxhdGl2ZSBwYXRoLCBiZWdpbm5pbmcgd2l0aCBhICIvIiwgdGhhdCByZXByZXNlbnRzCisgICAgICogdGhlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpZWQgcGF0aCBhZnRlciAiLi4iIGFuZCAiLiIgZWxlbWVudHMKKyAgICAgKiBhcmUgcmVzb2x2ZWQgb3V0LiAgSWYgdGhlIHNwZWNpZmllZCBwYXRoIGF0dGVtcHRzIHRvIGdvIG91dHNpZGUgdGhlCisgICAgICogYm91bmRhcmllcyBvZiB0aGUgY3VycmVudCBjb250ZXh0IChpLmUuIHRvbyBtYW55ICIuLiIgcGF0aCBlbGVtZW50cworICAgICAqIGFyZSBwcmVzZW50KSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIGJlIG5vcm1hbGl6ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgcGF0aCkgeworCisgICAgU3RyaW5nIG5vcm1hbGl6ZWQgPSBwYXRoOworCisgICAgLy8gTm9ybWFsaXplIHRoZSBzbGFzaGVzIGFuZCBhZGQgbGVhZGluZyBzbGFzaCBpZiBuZWNlc3NhcnkKKyAgICBpZiAoRmlsZS5zZXBhcmF0b3JDaGFyID09ICdcXCcgJiYgbm9ybWFsaXplZC5pbmRleE9mKCdcXCcpID49IDApCisgICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnJlcGxhY2UoJ1xcJywgJy8nKTsKKyAgICBpZiAoIW5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgiLyIpKQorICAgICAgICBub3JtYWxpemVkID0gIi8iICsgbm9ybWFsaXplZDsKKworICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8vIiBpbiB0aGUgbm9ybWFsaXplZCBwYXRoCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gbm9ybWFsaXplZC5pbmRleE9mKCIvLyIpOworICAgICAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICBicmVhazsKKyAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDAsIGluZGV4KSArCisgICAgICAgIG5vcm1hbGl6ZWQuc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgfQorCisgICAgLy8gUmVzb2x2ZSBvY2N1cnJlbmNlcyBvZiAiLy4vIiBpbiB0aGUgbm9ybWFsaXplZCBwYXRoCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gbm9ybWFsaXplZC5pbmRleE9mKCIvLi8iKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgYnJlYWs7CisgICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnN1YnN0cmluZygwLCBpbmRleCkgKworICAgICAgICBub3JtYWxpemVkLnN1YnN0cmluZyhpbmRleCArIDIpOworICAgIH0KKworICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8uLi8iIGluIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpbnQgaW5kZXggPSBub3JtYWxpemVkLmluZGV4T2YoIi8uLi8iKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChpbmRleCA9PSAwKQorICAgICAgICByZXR1cm4gKG51bGwpOyAgLy8gVHJ5aW5nIHRvIGdvIG91dHNpZGUgb3VyIGNvbnRleHQKKyAgICAgICAgaW50IGluZGV4MiA9IG5vcm1hbGl6ZWQubGFzdEluZGV4T2YoJy8nLCBpbmRleCAtIDEpOworICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zdWJzdHJpbmcoMCwgaW5kZXgyKSArCisgICAgICAgIG5vcm1hbGl6ZWQuc3Vic3RyaW5nKGluZGV4ICsgMyk7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBub3JtYWxpemVkIHBhdGggdGhhdCB3ZSBoYXZlIGNvbXBsZXRlZAorICAgIHJldHVybiAobm9ybWFsaXplZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWVkIG5vcm1hbGl6ZWQKKyAgICAgKiBjb250ZXh0LXJlbGF0aXZlIHBhdGggaWYgaXQgZXhpc3RzIGFuZCBpcyByZWFkYWJsZS4gIE90aGVyd2lzZSwKKyAgICAgKiByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOb3JtYWxpemVkIGNvbnRleHQtcmVsYXRpdmUgcGF0aCAod2l0aCBsZWFkaW5nICcvJykKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBmaWxlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoYmFzZSwgbmFtZSk7CisgICAgICAgIGlmIChmaWxlLmV4aXN0cygpICYmIGZpbGUuY2FuUmVhZCgpKSB7CisKKyAgICAgICAgCWlmIChhbGxvd0xpbmtpbmcpCisgICAgICAgIAkJcmV0dXJuIGZpbGU7CisgICAgICAgIAkKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhpcyBmaWxlIGJlbG9uZ3MgdG8gb3VyIHJvb3QgcGF0aAorICAgICAgICAgICAgU3RyaW5nIGNhblBhdGggPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjYW5QYXRoID0gZmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FuUGF0aCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAvLyBCdWd6aWxsYSAzODE1NDogYWZ0ZXIgcmVsZWFzZSgpIHRoZSBhYnNvbHV0ZUJhc2UgaXMgbnVsbCwgbGVhZGluZyB0byBhbiBOUEUKKyAgICAgICAgICAgIGlmIChhYnNvbHV0ZUJhc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgZ29pbmcgb3V0c2lkZSBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIHJvb3QKKyAgICAgICAgICAgIGlmICghY2FuUGF0aC5zdGFydHNXaXRoKGFic29sdXRlQmFzZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2FzZSBzZW5zaXRpdml0eSBjaGVjaworICAgICAgICAgICAgaWYgKGNhc2VTZW5zaXRpdmUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZUFic1BhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgIGlmIChmaWxlQWJzUGF0aC5lbmRzV2l0aCgiLiIpKQorICAgICAgICAgICAgICAgICAgICBmaWxlQWJzUGF0aCA9IGZpbGVBYnNQYXRoICsgIi8iOworICAgICAgICAgICAgICAgIFN0cmluZyBhYnNQYXRoID0gbm9ybWFsaXplKGZpbGVBYnNQYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FuUGF0aCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjYW5QYXRoID0gbm9ybWFsaXplKGNhblBhdGgpOworICAgICAgICAgICAgICAgIGlmICgoYWJzb2x1dGVCYXNlLmxlbmd0aCgpIDwgYWJzUGF0aC5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKGFic29sdXRlQmFzZS5sZW5ndGgoKSA8IGNhblBhdGgubGVuZ3RoKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGFic1BhdGggPSBhYnNQYXRoLnN1YnN0cmluZyhhYnNvbHV0ZUJhc2UubGVuZ3RoKCkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjYW5QYXRoID09IG51bGwpIHx8IChhYnNQYXRoID09IG51bGwpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChhYnNQYXRoLmVxdWFscygiIikpCisgICAgICAgICAgICAgICAgICAgICAgICBhYnNQYXRoID0gIi8iOworICAgICAgICAgICAgICAgICAgICBjYW5QYXRoID0gY2FuUGF0aC5zdWJzdHJpbmcoYWJzb2x1dGVCYXNlLmxlbmd0aCgpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYW5QYXRoLmVxdWFscygiIikpCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5QYXRoID0gIi8iOworICAgICAgICAgICAgICAgICAgICBpZiAoIWNhblBhdGguZXF1YWxzKGFic1BhdGgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmlsZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTGlzdCB0aGUgcmVzb3VyY2VzIHdoaWNoIGFyZSBtZW1iZXJzIG9mIGEgY29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIENvbGxlY3Rpb24KKyAgICAgKiBAcmV0dXJuIFZlY3RvciBjb250YWluZyBOYW1pbmdFbnRyeSBvYmplY3RzCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBsaXN0KEZpbGUgZmlsZSkgeworCisgICAgICAgIEFycmF5TGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBpZiAoIWZpbGUuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgIHJldHVybiBlbnRyaWVzOworICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IGZpbGUubGlzdCgpOworICAgICAgICBpZiAobmFtZXM9PW51bGwpIHsKKyAgICAgICAgICAgIC8qIFNvbWUgSU8gZXJyb3Igb2NjdXJyZWQgc3VjaCBhcyBiYWQgZmlsZSBwZXJtaXNzaW9ucy4KKyAgICAgICAgICAgICAgIFByZXZlbnQgYSBOUEUgd2l0aCBBcnJheXMuc29ydChuYW1lcykgKi8KKyAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiZmlsZVJlc291cmNlcy5saXN0aW5nTnVsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgICAgICAgcmV0dXJuIGVudHJpZXM7CisgICAgICAgIH0KKworICAgICAgICBBcnJheXMuc29ydChuYW1lcyk7ICAgICAgICAgICAgIC8vIFNvcnQgYWxwaGFiZXRpY2FsbHkKKyAgICAgICAgaWYgKG5hbWVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZW50cmllczsKKyAgICAgICAgTmFtaW5nRW50cnkgZW50cnkgPSBudWxsOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKKworICAgICAgICAgICAgRmlsZSBjdXJyZW50RmlsZSA9IG5ldyBGaWxlKGZpbGUsIG5hbWVzW2ldKTsKKyAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBudWxsOworICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlRGlyQ29udGV4dCB0ZW1wQ29udGV4dCA9IG5ldyBGaWxlRGlyQ29udGV4dChlbnYpOworICAgICAgICAgICAgICAgIHRlbXBDb250ZXh0LnNldERvY0Jhc2UoZmlsZS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgIHRlbXBDb250ZXh0LnNldEFsbG93TGlua2luZyhnZXRBbGxvd0xpbmtpbmcoKSk7CisgICAgICAgICAgICAgICAgdGVtcENvbnRleHQuc2V0Q2FzZVNlbnNpdGl2ZShpc0Nhc2VTZW5zaXRpdmUoKSk7CisgICAgICAgICAgICAgICAgb2JqZWN0ID0gdGVtcENvbnRleHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBGaWxlUmVzb3VyY2UoY3VycmVudEZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW50cnkgPSBuZXcgTmFtaW5nRW50cnkobmFtZXNbaV0sIG9iamVjdCwgTmFtaW5nRW50cnkuRU5UUlkpOworICAgICAgICAgICAgZW50cmllcy5hZGQoZW50cnkpOworCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZW50cmllczsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmlsZVJlc291cmNlIElubmVyIENsYXNzCisKKworICAgIC8qKgorICAgICAqIFRoaXMgc3BlY2lhbGl6ZWQgcmVzb3VyY2UgaW1wbGVtZW50YXRpb24gYXZvaWRzIG9wZW5pbmcgdGhlIElwdXRTdHJlYW0KKyAgICAgKiB0byB0aGUgZmlsZSByaWdodCBhd2F5ICh3aGljaCB3b3VsZCBwdXQgYSBsb2NrIG9uIHRoZSBmaWxlKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgY2xhc3MgRmlsZVJlc291cmNlIGV4dGVuZHMgUmVzb3VyY2UgeworCisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworCisgICAgICAgIHB1YmxpYyBGaWxlUmVzb3VyY2UoRmlsZSBmaWxlKSB7CisgICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgICAgICB9CisKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWVtYmVyIFZhcmlhYmxlcworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFzc29jaWF0ZWQgZmlsZSBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgRmlsZSBmaWxlOworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpbGUgbGVuZ3RoLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGxvbmcgbGVuZ3RoID0gLTFMOworCisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlc291cmNlIE1ldGhvZHMKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb250ZW50IGFjY2Vzc29yLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIElucHV0U3RyZWFtCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gc3RyZWFtQ29udGVudCgpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGJpbmFyeUNvbnRlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdXBlci5zdHJlYW1Db250ZW50KCk7CisgICAgICAgIH0KKworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpbGVSZXNvdXJjZUF0dHJpYnV0ZXMgSW5uZXIgQ2xhc3MKKworCisgICAgLyoqCisgICAgICogVGhpcyBzcGVjaWFsaXplZCByZXNvdXJjZSBhdHRyaWJ1dGUgaW1wbGVtZW50YXRpb24gZG9lcyBzb21lIGxhenkKKyAgICAgKiByZWFkaW5nICh0byBzcGVlZCB1cCBzaW1wbGUgY2hlY2tzLCBsaWtlIGNoZWNraW5nIHRoZSBsYXN0IG1vZGlmaWVkCisgICAgICogZGF0ZSkuCisgICAgICovCisgICAgcHJvdGVjdGVkIGNsYXNzIEZpbGVSZXNvdXJjZUF0dHJpYnV0ZXMgZXh0ZW5kcyBSZXNvdXJjZUF0dHJpYnV0ZXMgeworCisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworCisgICAgICAgIHB1YmxpYyBGaWxlUmVzb3VyY2VBdHRyaWJ1dGVzKEZpbGUgZmlsZSkgeworICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNZW1iZXIgVmFyaWFibGVzCisKKworICAgICAgICBwcm90ZWN0ZWQgRmlsZSBmaWxlOworCisKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXNzZWQgPSBmYWxzZTsKKworCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgY2Fub25pY2FsUGF0aCA9IG51bGw7CisKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXNvdXJjZUF0dHJpYnV0ZXMgTWV0aG9kcworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElzIGNvbGxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbGxlY3Rpb24oKSB7CisgICAgICAgICAgICBpZiAoIWFjY2Vzc2VkKSB7CisgICAgICAgICAgICAgICAgY29sbGVjdGlvbiA9IGZpbGUuaXNEaXJlY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBhY2Nlc3NlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuaXNDb2xsZWN0aW9uKCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgY29udGVudCBsZW5ndGguCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gY29udGVudCBsZW5ndGggdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB7CisgICAgICAgICAgICBpZiAoY29udGVudExlbmd0aCAhPSAtMUwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRMZW5ndGg7CisgICAgICAgICAgICBjb250ZW50TGVuZ3RoID0gZmlsZS5sZW5ndGgoKTsKKyAgICAgICAgICAgIHJldHVybiBjb250ZW50TGVuZ3RoOworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGNyZWF0aW9uIHRpbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gY3JlYXRpb24gdGltZSB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGxvbmcgZ2V0Q3JlYXRpb24oKSB7CisgICAgICAgICAgICBpZiAoY3JlYXRpb24gIT0gLTFMKQorICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGlvbjsKKyAgICAgICAgICAgIGNyZWF0aW9uID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGlvbjsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBjcmVhdGlvbiBkYXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIENyZWF0aW9uIGRhdGUgdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEYXRlIGdldENyZWF0aW9uRGF0ZSgpIHsKKyAgICAgICAgICAgIGlmIChjcmVhdGlvbiA9PSAtMUwpIHsKKyAgICAgICAgICAgICAgICBjcmVhdGlvbiA9IGZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Q3JlYXRpb25EYXRlKCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgbGFzdCBtb2RpZmllZCB0aW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGxhc3RNb2RpZmllZCB0aW1lIHZhbHVlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7CisgICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkICE9IC0xTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbGFzdE1vZGlmaWVkOworICAgICAgICAgICAgbGFzdE1vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBsYXN0TW9kaWZpZWQ7CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgbGFzdE1vZGlmaWVkIGRhdGUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gTGFzdE1vZGlmaWVkIGRhdGUgdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEYXRlIGdldExhc3RNb2RpZmllZERhdGUoKSB7CisgICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkID09IC0xTCkgeworICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9IGZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TGFzdE1vZGlmaWVkRGF0ZSgpOworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gTmFtZSB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBuYW1lID0gZmlsZS5nZXROYW1lKCk7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCByZXNvdXJjZSB0eXBlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFN0cmluZyByZXNvdXJjZSB0eXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVHlwZSgpIHsKKyAgICAgICAgICAgIGlmICghYWNjZXNzZWQpIHsKKyAgICAgICAgICAgICAgICBjb2xsZWN0aW9uID0gZmlsZS5pc0RpcmVjdG9yeSgpOworICAgICAgICAgICAgICAgIGFjY2Vzc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRSZXNvdXJjZVR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGNhbm9uaWNhbCBwYXRoLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBTdHJpbmcgdGhlIGZpbGUncyBjYW5vbmljYWwgcGF0aAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDYW5vbmljYWxQYXRoKCkgeworICAgICAgICAgICAgaWYgKGNhbm9uaWNhbFBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbFBhdGggPSBmaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjYW5vbmljYWxQYXRoOworICAgICAgICB9CisgICAgICAgIAorCisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvSW1tdXRhYmxlTmFtZU5vdEZvdW5kRXhjZXB0aW9uLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9JbW11dGFibGVOYW1lTm90Rm91bmRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTI0ZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvSW1tdXRhYmxlTmFtZU5vdEZvdW5kRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lTm90Rm91bmRFeGNlcHRpb247CisKKy8qKgorICogSW1tdXRhYmxlIGV4Y2VwdGlvbiB0byBhdm9pZCB1c2VsZXNzIG9iamVjdCBjcmVhdGlvbiBieSB0aGUgcHJveHkgY29udGV4dC4KKyAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSBieSB0aGUgcHJveHkgY29udGV4dC4gQWN0dWFsIGNvbnRleHRzIHNob3VsZCByZXR1cm4KKyAqIHByb3Blcmx5IHBvcHVsYXRlZCBleGNlcHRpb25zLgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSW1tdXRhYmxlTmFtZU5vdEZvdW5kRXhjZXB0aW9uCisgICAgZXh0ZW5kcyBOYW1lTm90Rm91bmRFeGNlcHRpb24geworCisgICAgcHVibGljIHZvaWQgYXBwZW5kUmVtYWluaW5nQ29tcG9uZW50KFN0cmluZyBuYW1lKSB7fQorICAgIHB1YmxpYyB2b2lkIGFwcGVuZFJlbWFpbmluZ05hbWUoTmFtZSBuYW1lKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ05hbWUoTmFtZSBuYW1lKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmVyTmFtZShOYW1lIG5hbWUpIHt9CisgICAgcHVibGljIHZvaWQgc2V0Um9vdENhdXNlKFRocm93YWJsZSBlKSB7fQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YWE1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMCwwICsxLDIxIEBACitmaWxlUmVzb3VyY2VzLmJhc2U9RG9jdW1lbnQgYmFzZSB7MH0gZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgcmVhZGFibGUgZGlyZWN0b3J5CitmaWxlUmVzb3VyY2VzLmxpc3RpbmdOdWxsPUNvdWxkIG5vdCBnZXQgZGlyIGxpc3RpbmcgZm9yIHswfQord2FyUmVzb3VyY2VzLm5vdFdhcj1Eb2MgYmFzZSBtdXN0IHBvaW50IHRvIGEgV0FSIGZpbGUKK3dhclJlc291cmNlcy5pbnZhbGlkV2FyPUludmFsaWQgb3IgdW5yZWFkYWJsZSBXQVIgZmlsZSA6IHswfQoramFyUmVzb3VyY2VzLnN5bnRheD1Eb2N1bWVudCBiYXNlIHswfSBtdXN0IHN0YXJ0IHdpdGggJydqYXI6JycgYW5kIGVuZCB3aXRoICcnIS8nJworcmVzb3VyY2VzLmFscmVhZHlTdGFydGVkPVJlc291cmNlcyBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKK3Jlc291cmNlcy5jb25uZWN0PUNhbm5vdCBjb25uZWN0IHRvIGRvY3VtZW50IGJhc2UgezB9CityZXNvdXJjZXMuaW5wdXQ9Q2Fubm90IGNyZWF0ZSBpbnB1dCBzdHJlYW0gZm9yIHJlc291cmNlIHswfQorcmVzb3VyY2VzLm5vdFN0YXJ0ZWQ9UmVzb3VyY2VzIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZAorcmVzb3VyY2VzLm51bGw9RG9jdW1lbnQgYmFzZSBjYW5ub3QgYmUgbnVsbAorcmVzb3VyY2VzLm5vdEZvdW5kPVJlc291cmNlIHswfSBub3QgZm91bmQKK3Jlc291cmNlcy5wYXRoPUNvbnRleHQgcmVsYXRpdmUgcGF0aCB7MH0gbXVzdCBzdGFydCB3aXRoICcnLycnCityZXNvdXJjZXMuYWxyZWFkeUJvdW5kPU5hbWUgezB9IGlzIGFscmVhZHkgYm91bmQgaW4gdGhpcyBDb250ZXh0CityZXNvdXJjZXMuYmluZEZhaWxlZD1CaW5kIGZhaWxlZDogezB9CityZXNvdXJjZXMudW5iaW5kRmFpbGVkPVVuYmluZCBmYWlsZWQ6IHswfQorc3RhbmRhcmRSZXNvdXJjZXMuYWxyZWFkeVN0YXJ0ZWQ9UmVzb3VyY2VzIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorc3RhbmRhcmRSZXNvdXJjZXMuZGlyZWN0b3J5PUZpbGUgYmFzZSB7MH0gaXMgbm90IGEgZGlyZWN0b3J5CitzdGFuZGFyZFJlc291cmNlcy5leGlzdHM9RmlsZSBiYXNlIHswfSBkb2VzIG5vdCBleGlzdAorc3RhbmRhcmRSZXNvdXJjZXMubm90U3RhcnRlZD1SZXNvdXJjZXMgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCitzdGFuZGFyZFJlc291cmNlcy5udWxsPURvY3VtZW50IGJhc2UgY2Fubm90IGJlIG51bGwKK3N0YW5kYXJkUmVzb3VyY2VzLnNsYXNoPURvY3VtZW50IGJhc2UgezB9IG11c3Qgbm90IGVuZCB3aXRoIGEgc2xhc2gKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0YWEzYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjAgQEAKK2ZpbGVSZXNvdXJjZXMuYmFzZT1FbCBEb2N1bWVudG8gYmFzZSB7MH0gbm8gZXhpc3RlIG8gbm8gZXMgdW4gZGlyZWN0b3JpbyBsZWdpYmxlCit3YXJSZXNvdXJjZXMubm90V2FyPURvYyBiYXNlIGRlYmUgZGUgYXB1bnRhciBhIHVuIGFyY2hpdm8gV0FSCit3YXJSZXNvdXJjZXMuaW52YWxpZFdhcj1BcmNoaXZvIFdBUiBpbnbhbGlkbyBvIGlsZWdpYmxlOiB7MH0KK2phclJlc291cmNlcy5zeW50YXg9RG9jdW1lbnRvIGJhc2UgezB9IGRlYmUgZGUgZW1wZXphciBjb24gJydqYXI6JycgeSBhY2FiYXIgY29uICcnIS8nJworcmVzb3VyY2VzLmFscmVhZHlTdGFydGVkPVlhIGhhbiBzaWRvIGFycmFuY2Fkb3MgbG9zIFJlY3Vyc29zCityZXNvdXJjZXMuY29ubmVjdD1ObyBwdWVkbyBjb25lY3RhciBhIGRvY3VtZW50byBiYXNlIHswfQorcmVzb3VyY2VzLmlucHV0PU5vIHB1ZWRvIGNyZWFyIGZsdWpvIChzdHJlYW0pIGRlIGVudHJhZGEgcGFyYSByZWN1cnNvIHswfQorcmVzb3VyY2VzLm5vdFN0YXJ0ZWQ9QfpuIG5vIGhhbiBzaWRvIGFycmFuY2Fkb3MgbG9zIFJlY3Vyc29zCityZXNvdXJjZXMubnVsbD1FbCBEb2N1bWVudG8gYmFzZSBubyBwdWVkZSBzZXIgbnVsbworcmVzb3VyY2VzLm5vdEZvdW5kPVJlY3Vyc28gezB9IG5vIGhhbGxhZG8KK3Jlc291cmNlcy5wYXRoPVRyYXllY3RvcmlhIHJlbGF0aXZhIGEgY29udGV4dG8gezB9IGRlYmUgZGUgY29tZW56YXIgY29uICcnLycnCityZXNvdXJjZXMuYWxyZWFkeUJvdW5kPUVsIE5vbWJyZSB7MH0geWEgaGEgc2lkbyBjYW1iaWFkbyAoYm91bmQpIGVuIGVzdGUgQ29udGV4dG8KK3Jlc291cmNlcy5iaW5kRmFpbGVkPUZhbGzzIGVsIENhbWJpbyAoQmluZCk6IHswfQorcmVzb3VyY2VzLnVuYmluZEZhaWxlZD1GYWxs8yBlbCBEZXNjYW1iaW8gKFVuYmluZCk6IHswfQorc3RhbmRhcmRSZXNvdXJjZXMuYWxyZWFkeVN0YXJ0ZWQ9WWEgaGFuIHNpZG8gYXJyYW5jYWRvcyBsb3MgUmVjdXJzb3MKK3N0YW5kYXJkUmVzb3VyY2VzLmRpcmVjdG9yeT1FbCBhcmNoaXZvIGJhc2UgezB9IG5vIGVzIHVuIGRpcmVjdG9yaW8KK3N0YW5kYXJkUmVzb3VyY2VzLmV4aXN0cz1FbCBhcmNoaXZvIGJhc2UgezB9IG5vIGV4aXN0ZQorc3RhbmRhcmRSZXNvdXJjZXMubm90U3RhcnRlZD1B+m4gbm8gaGFuIHNpZG8gYXJyYW5jYWRvcyBsb3MgUmVjdXJzb3MKK3N0YW5kYXJkUmVzb3VyY2VzLm51bGw9RWwgRG9jdW1lbnRvIGJhc2Ugbm8gcHVlZGUgc2VyIG51bG8KK3N0YW5kYXJkUmVzb3VyY2VzLnNsYXNoPUVsIERvY3VtZW50byBiYXNlIHswfSBubyBkZWJlIGRlIHRlcm1pbmFyIGNvbiB1bmEgYmFycmEKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlZTA2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjAgQEAKK2ZpbGVSZXNvdXJjZXMuYmFzZT1MZSBkb2N1bWVudCBiYXNlIHswfSBuJydleGlzdGUgcGFzIG91IG4nJ2VzdCBwYXMgdW4gculwZXJ0b2lyZSBsaXNpYmxlCit3YXJSZXNvdXJjZXMubm90V2FyPURvYyBiYXNlIGRvaXQgcG9pbnTpIHZlcnMgdW4gZmljaGllciBXQVIKK3dhclJlc291cmNlcy5pbnZhbGlkV2FyPUZpY2hpZXIgV0FSIGludmFsaWRlIG91IGlsbGlzaWJsZSAgOiB7MH0KK2phclJlc291cmNlcy5zeW50YXg9TGUgZG9jdW1lbnQgYmFzZSB7MH0gZG9pdCBjb21tZW5j6SBwYXIgJydqYXI6JycgZXQgZmluaXIgYXZlYyAnJyEvJycKK3Jlc291cmNlcy5hbHJlYWR5U3RhcnRlZD1MZXMgUmVzc291cmNlcyBvbnQgZOlq4CDpdOkgZOltYXJy6WVzCityZXNvdXJjZXMuY29ubmVjdD1JbXBvc3NpYmxlIGRlIHNlIGNvbm5lY3RlciBhdSBkb2N1bWVudCBiYXNlIHswfQorcmVzb3VyY2VzLmlucHV0PUltcG9zc2libGUgZGUgY3LpZXIgbCcnaW5wdXQgc3RyZWFtIHBvdXIgbGEgcmVzc291cmNlIHswfQorcmVzb3VyY2VzLm5vdFN0YXJ0ZWQ9TGVzIHJlc3NvdXJjZXMgbicnb250IHBhcyBlbmNvcmUg6XTpIGTpbWFycullcworcmVzb3VyY2VzLm51bGw9TGUgZG9jdW1lbnQgYmFzZSBuZSBwZXV0IOp0cmUgbnVsCityZXNvdXJjZXMubm90Rm91bmQ9TGEgcmVzc291cmNlIHswfSBlc3QgaW50cm91dmFibGUKK3Jlc291cmNlcy5wYXRoPUxlIGNoZW1pbiByZWxhdGlmIGRlIGNvbnRleHQgezB9IGRvaXQgY29tbWVuY+kgcGFyICcnLycnCityZXNvdXJjZXMuYWxyZWFkeUJvdW5kPUxlIG5vbSB7MH0gZXN0IGTpauAgculm6XJlbmPpIHBhciBjZSBjb250ZXh0ZQorcmVzb3VyY2VzLmJpbmRGYWlsZWQ9TGUgbGlhZ2UgYSDpY2hvdek6IHswfQorcmVzb3VyY2VzLnVuYmluZEZhaWxlZD1MZSBk6WxpYWdlIGEg6WNob3XpOiB7MH0KK3N0YW5kYXJkUmVzb3VyY2VzLmFscmVhZHlTdGFydGVkPUxlcyByZXNzb3VyY2VzIG9udCBk6WphIOl06SBk6W1hcnLpZXMKK3N0YW5kYXJkUmVzb3VyY2VzLmRpcmVjdG9yeT1MZSBmaWxlIGJhc2UgezB9IG4nJ2VzdCBwYXMgdW4gculwZXJ0b2lyZQorc3RhbmRhcmRSZXNvdXJjZXMuZXhpc3RzPUxlIGZpbGUgYmFzZSB7MH0gbicnZXhpc3RlIHBhcworc3RhbmRhcmRSZXNvdXJjZXMubm90U3RhcnRlZD1MZXMgcmVzc291cmNlcyBuJydvbnQgcGFzIGVuY29yZSDpdOkgZOltYXJy6WVzCitzdGFuZGFyZFJlc291cmNlcy5udWxsPUxlIGRvY3VtZW50IGJhc2UgbmUgcGV1dCDqdHJlIG51bAorc3RhbmRhcmRSZXNvdXJjZXMuc2xhc2g9TGUgZG9jdW1lbnQgYmFzZSB7MH0gbmUgZG9pdCBwYXMgc2UgdGVybWluZXIgcGFyIHVuICcnLycnCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OTE0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpAQCAtMCwwICsxLDIxIEBACitmaWxlUmVzb3VyY2VzLmJhc2U9XHUzMGM5XHUzMGFkXHUzMGU1XHUzMGUxXHUzMGYzXHUzMGM4XHUzMGQ5XHUzMGZjXHUzMGI5IHswfSBcdTMwNGNcdTViNThcdTU3MjhcdTMwNTdcdTMwNmFcdTMwNDRcdTMwMDFcdTUzYzhcdTMwNmZcdThhYWRcdTMwODFcdTMwNmFcdTMwNDRcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwNjdcdTMwNTkKK2ZpbGVSZXNvdXJjZXMubGlzdGluZ051bGw9ezB9IFx1MzA2ZVx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzA2ZVx1MzBlYVx1MzBiOVx1MzBjOFx1MzA5Mlx1NTNkNlx1NWY5N1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mword2FyUmVzb3VyY2VzLm5vdFdhcj1cdTMwYzlcdTMwYWRcdTMwZTVcdTMwZTFcdTMwZjNcdTMwYzhcdTMwZDlcdTMwZmNcdTMwYjlcdTMwNmZXQVJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTc5M2FcdTMwNTVcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3dhclJlc291cmNlcy5pbnZhbGlkV2FyPVx1NzEyMVx1NTJiOVx1NTNjOFx1MzA2Zlx1OGFhZFx1MzA4MVx1MzA2YVx1MzA0NFdBUlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2N1x1MzA1OSA6IHswfQoramFyUmVzb3VyY2VzLnN5bnRheD1cdTMwYzlcdTMwYWRcdTMwZTVcdTMwZTFcdTMwZjNcdTMwYzhcdTMwZDlcdTMwZmNcdTMwYjkgezB9IFx1MzA2ZicnamFyOicnXHUzMDY3XHU1OWNiXHUzMDdlXHUzMDhhXHUzMDAxJychLycnXHUzMDY3XHU3ZDQyXHUzMDg5XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCityZXNvdXJjZXMuYWxyZWFkeVN0YXJ0ZWQ9XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDZmXHU2NWUyXHUzMDZiXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CityZXNvdXJjZXMuY29ubmVjdD1cdTMwYzlcdTMwYWRcdTMwZTVcdTMwZTFcdTMwZjNcdTMwYzhcdTMwZDlcdTMwZmNcdTMwYjkgezB9IFx1MzA2Ylx1NjNhNVx1N2Q5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworcmVzb3VyY2VzLmlucHV0PVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOSB7MH0gXHUzMDZiXHU1MTY1XHU1MjliXHUzMGI5XHUzMGM4XHUzMGVhXHUzMGZjXHUzMGUwXHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCityZXNvdXJjZXMubm90U3RhcnRlZD1cdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwNmZcdTMwN2VcdTMwNjBcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK3Jlc291cmNlcy5udWxsPVx1MzBjOVx1MzBhZFx1MzBlNVx1MzBlMVx1MzBmM1x1MzBjOFx1MzBkOVx1MzBmY1x1MzBiOVx1MzA2Zm51bGxcdTMwNjdcdTMwNDJcdTMwNjNcdTMwNjZcdTMwNmZcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3Jlc291cmNlcy5ub3RGb3VuZD1cdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjkgezB9IFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworcmVzb3VyY2VzLnBhdGg9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHU3NmY4XHU1YmZlXHUzMGQxXHUzMGI5IHswfSBcdTMwNmYnJy8nJ1x1MzA2N1x1NTljYlx1MzA3ZVx1MzA4OVx1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworcmVzb3VyY2VzLmFscmVhZHlCb3VuZD1cdTU0MGRcdTUyNGQgezB9IFx1MzA2Zlx1NjVlMlx1MzA2Ylx1MzA1M1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2Ylx1MzBkMFx1MzBhNFx1MzBmM1x1MzBjOVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorcmVzb3VyY2VzLmJpbmRGYWlsZWQ9XHUzMGQwXHUzMGE0XHUzMGYzXHUzMGM5XHUzMDRjXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0KK3Jlc291cmNlcy51bmJpbmRGYWlsZWQ9XHUzMGEyXHUzMGYzXHUzMGQwXHUzMGE0XHUzMGYzXHUzMGM5XHUzMDRjXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0KK3N0YW5kYXJkUmVzb3VyY2VzLmFscmVhZHlTdGFydGVkPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzA2Zlx1NjVlMlx1MzA2Ylx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRSZXNvdXJjZXMuZGlyZWN0b3J5PVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzBkOVx1MzBmY1x1MzBiOSB7MH0gXHUzMDZmXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFJlc291cmNlcy5leGlzdHM9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMGQ5XHUzMGZjXHUzMGI5IHswfSBcdTMwNmZcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkUmVzb3VyY2VzLm5vdFN0YXJ0ZWQ9XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDRjXHUzMDdlXHUzMDYwXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFJlc291cmNlcy5udWxsPVx1MzBjOVx1MzBhZFx1MzBlNVx1MzBlMVx1MzBmM1x1MzBjOFx1MzBkOVx1MzBmY1x1MzBiOVx1MzA2Zm51bGxcdTMwNjdcdTMwNDJcdTMwNjNcdTMwNjZcdTMwNmZcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkUmVzb3VyY2VzLnNsYXNoPVx1MzBjOVx1MzBhZFx1MzBlNVx1MzBlMVx1MzBmM1x1MzBjOFx1MzBkOVx1MzBmY1x1MzBiOSB7MH0gXHUzMDZmXHUzMGI5XHUzMGU5XHUzMGMzXHUzMGI3XHUzMGU1XHUzMDY3XHU3ZDQyXHUzMDYzXHUzMDY2XHUzMDZmXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9Qcm94eURpckNvbnRleHQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1Byb3h5RGlyQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOWMwZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9Qcm94eURpckNvbnRleHQuamF2YQpAQCAtMCwwICsxLDE2MjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lUGFyc2VyOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuQXR0cmlidXRlczsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5Nb2RpZmljYXRpb25JdGVtOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuU2VhcmNoQ29udHJvbHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5TdHJpbmdNYW5hZ2VyOworCisvKioKKyAqIFByb3h5IERpcmVjdG9yeSBDb250ZXh0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFByb3h5RGlyQ29udGV4dCBpbXBsZW1lbnRzIERpckNvbnRleHQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVCA9ICJjb250ZXh0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUID0gImhvc3QiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQnVpbGRzIGEgcHJveHkgZGlyZWN0b3J5IGNvbnRleHQgdXNpbmcgdGhlIGdpdmVuIGVudmlyb25tZW50LgorICAgICAqLworICAgIHB1YmxpYyBQcm94eURpckNvbnRleHQoSGFzaHRhYmxlIGVudiwgRGlyQ29udGV4dCBkaXJDb250ZXh0KSB7CisgICAgICAgIHRoaXMuZW52ID0gZW52OworICAgICAgICB0aGlzLmRpckNvbnRleHQgPSBkaXJDb250ZXh0OworICAgICAgICBpZiAoZGlyQ29udGV4dCBpbnN0YW5jZW9mIEJhc2VEaXJDb250ZXh0KSB7CisgICAgICAgICAgICAvLyBJbml0aWFsaXplIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIGFzc29jaWF0ZWQgZGlyIGNvbnRleHQsIGxpa2UKKyAgICAgICAgICAgIC8vIHRoZSBjYWNoaW5nIHBvbGljeS4KKyAgICAgICAgICAgIEJhc2VEaXJDb250ZXh0IGJhc2VEaXJDb250ZXh0ID0gKEJhc2VEaXJDb250ZXh0KSBkaXJDb250ZXh0OworICAgICAgICAgICAgaWYgKGJhc2VEaXJDb250ZXh0LmlzQ2FjaGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IChSZXNvdXJjZUNhY2hlKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoY2FjaGVDbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9GSVhNRQorICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYWNoZS5zZXRDYWNoZU1heFNpemUoYmFzZURpckNvbnRleHQuZ2V0Q2FjaGVNYXhTaXplKCkpOworICAgICAgICAgICAgICAgIGNhY2hlVFRMID0gYmFzZURpckNvbnRleHQuZ2V0Q2FjaGVUVEwoKTsKKyAgICAgICAgICAgICAgICBjYWNoZU9iamVjdE1heFNpemUgPSBiYXNlRGlyQ29udGV4dC5nZXRDYWNoZU1heFNpemUoKSAvIDIwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGhvc3ROYW1lID0gKFN0cmluZykgZW52LmdldChIT1NUKTsKKyAgICAgICAgY29udGV4dE5hbWUgPSAoU3RyaW5nKSBlbnYuZ2V0KENPTlRFWFQpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQnVpbGRzIGEgY2xvbmUgb2YgdGhpcyBwcm94eSBkaXIgY29udGV4dCwgd3JhcHBpbmcgdGhlIGdpdmVuIGRpcmVjdG9yeQorICAgICAqIGNvbnRleHQsIGFuZCBzaGFyaW5nIHRoZSBzYW1lIGNhY2hlLgorICAgICAqLworICAgIC8vIFRPRE86IFJlZmFjdG9yIHVzaW5nIHRoZSBwcm94eSBmaWVsZAorICAgIC8qCisgICAgcHJvdGVjdGVkIFByb3h5RGlyQ29udGV4dChQcm94eURpckNvbnRleHQgcHJveHlEaXJDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpckNvbnRleHQgZGlyQ29udGV4dCwgU3RyaW5nIHZQYXRoKSB7CisgICAgICAgIHRoaXMuZW52ID0gcHJveHlEaXJDb250ZXh0LmVudjsKKyAgICAgICAgdGhpcy5kaXJDb250ZXh0ID0gZGlyQ29udGV4dDsKKyAgICAgICAgdGhpcy52UGF0aCA9IHZQYXRoOworICAgICAgICB0aGlzLmNhY2hlID0gcHJveHlEaXJDb250ZXh0LmNhY2hlOworICAgICAgICB0aGlzLmNhY2hlTWF4U2l6ZSA9IHByb3h5RGlyQ29udGV4dC5jYWNoZU1heFNpemU7CisgICAgICAgIHRoaXMuY2FjaGVTaXplID0gcHJveHlEaXJDb250ZXh0LmNhY2hlU2l6ZTsKKyAgICAgICAgdGhpcy5jYWNoZVRUTCA9IHByb3h5RGlyQ29udGV4dC5jYWNoZVRUTDsKKyAgICAgICAgdGhpcy5jYWNoZU9iamVjdE1heFNpemUgPSBwcm94eURpckNvbnRleHQuY2FjaGVPYmplY3RNYXhTaXplOworICAgICAgICB0aGlzLm5vdEZvdW5kQ2FjaGUgPSBwcm94eURpckNvbnRleHQubm90Rm91bmRDYWNoZTsKKyAgICAgICAgdGhpcy5ob3N0TmFtZSA9IHByb3h5RGlyQ29udGV4dC5ob3N0TmFtZTsKKyAgICAgICAgdGhpcy5jb250ZXh0TmFtZSA9IHByb3h5RGlyQ29udGV4dC5jb250ZXh0TmFtZTsKKyAgICB9CisgICAgKi8KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFByb3h5IERpckNvbnRleHQgKGVpdGhlciB0aGlzIG9yIHRoZSByZWFsIHByb3h5KS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJveHlEaXJDb250ZXh0IHByb3h5ID0gdGhpczsKKworCisgICAgLyoqCisgICAgICogRW52aXJvbm1lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2h0YWJsZSBlbnY7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdNYW5hZ2VyIHNtID0gU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlZCBEaXJDb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBEaXJDb250ZXh0IGRpckNvbnRleHQ7CisKKworICAgIC8qKgorICAgICAqIFZpcnR1YWwgcGF0aC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHZQYXRoID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogSG9zdCBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgaG9zdE5hbWU7CisKKworICAgIC8qKgorICAgICAqIENvbnRleHQgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnRleHROYW1lOworCisKKyAgICAvKioKKyAgICAgKiBDYWNoZSBjbGFzcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNhY2hlQ2xhc3NOYW1lID0gCisgICAgICAgICJvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuUmVzb3VyY2VDYWNoZSI7CisKKworICAgIC8qKgorICAgICAqIENhY2hlLgorICAgICAqLworICAgIHByb3RlY3RlZCBSZXNvdXJjZUNhY2hlIGNhY2hlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQ2FjaGUgVFRMLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY2FjaGVUVEwgPSA1MDAwOyAvLyA1cworCisKKyAgICAvKioKKyAgICAgKiBNYXggc2l6ZSBvZiByZXNvdXJjZXMgd2hpY2ggd2lsbCBoYXZlIHRoZWlyIGNvbnRlbnQgY2FjaGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY2FjaGVPYmplY3RNYXhTaXplID0gNTEyOyAvLyA1MTIgS0IKKworCisgICAgLyoqCisgICAgICogSW1tdXRhYmxlIG5hbWUgbm90IGZvdW5kIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTmFtZU5vdEZvdW5kRXhjZXB0aW9uIG5vdEZvdW5kRXhjZXB0aW9uID0KKyAgICAgICAgbmV3IEltbXV0YWJsZU5hbWVOb3RGb3VuZEV4Y2VwdGlvbigpOworCisKKyAgICAvKioKKyAgICAgKiBOb24gY2FjaGVhYmxlIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbm9uQ2FjaGVhYmxlID0geyAiL1dFQi1JTkYvbGliLyIsICIvV0VCLUlORi9jbGFzc2VzLyIgfTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2FjaGUgdXNlZCBmb3IgdGhpcyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZUNhY2hlIGdldENhY2hlKCkgeworICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFjdHVhbCBkaXJlY3RvcnkgY29udGV4dCB3ZSBhcmUgd3JhcHBpbmcuCisgICAgICovCisgICAgcHVibGljIERpckNvbnRleHQgZ2V0RGlyQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGlyQ29udGV4dDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZG9jdW1lbnQgcm9vdCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREb2NCYXNlKCkgeworICAgICAgICBpZiAoZGlyQ29udGV4dCBpbnN0YW5jZW9mIEJhc2VEaXJDb250ZXh0KQorICAgICAgICAgICAgcmV0dXJuICgoQmFzZURpckNvbnRleHQpIGRpckNvbnRleHQpLmdldERvY0Jhc2UoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICIiOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBob3N0IG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRIb3N0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaG9zdE5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbnRleHQgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHROYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0TmFtZTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnRleHQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdC4gSWYgbmFtZSBpcyBlbXB0eSwgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSAKKyAgICAgKiBvZiB0aGlzIGNvbnRleHQgKHdoaWNoIHJlcHJlc2VudHMgdGhlIHNhbWUgbmFtaW5nIGNvbnRleHQgYXMgdGhpcyAKKyAgICAgKiBjb250ZXh0LCBidXQgaXRzIGVudmlyb25tZW50IG1heSBiZSBtb2RpZmllZCBpbmRlcGVuZGVudGx5IGFuZCBpdCBtYXkgCisgICAgICogYmUgYWNjZXNzZWQgY29uY3VycmVudGx5KS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgdXAKKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9va3VwKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIENhY2hlRW50cnkgZW50cnkgPSBjYWNoZUxvb2t1cChuYW1lLnRvU3RyaW5nKCkpOworICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFlbnRyeS5leGlzdHMpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBub3RGb3VuZEV4Y2VwdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlbnRyeS5yZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgY29udGVudCBjYWNoaW5nLgorICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5yZXNvdXJjZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmNvbnRleHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IGRpckNvbnRleHQubG9va3VwKHBhcnNlTmFtZShuYW1lKSk7CisgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnB1dFN0cmVhbSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2UoKElucHV0U3RyZWFtKSBvYmplY3QpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gb2JqZWN0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1lZCBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGxvb2t1cChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIENhY2hlRW50cnkgZW50cnkgPSBjYWNoZUxvb2t1cChuYW1lKTsKKyAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghZW50cnkuZXhpc3RzKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbm90Rm91bmRFeGNlcHRpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZW50cnkucmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5yZXNvdXJjZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmNvbnRleHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IGRpckNvbnRleHQubG9va3VwKHBhcnNlTmFtZShuYW1lKSk7CisgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnB1dFN0cmVhbSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZSgoSW5wdXRTdHJlYW0pIG9iamVjdCk7CisgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGlyQ29udGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBSZXNvdXJjZSkgeworICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtCisgICAgICAgICAgICAgICAgKG9iamVjdC50b1N0cmluZygpLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdC4gQWxsIGludGVybWVkaWF0ZSBjb250ZXh0cyBhbmQgdGhlIHRhcmdldCAKKyAgICAgKiBjb250ZXh0ICh0aGF0IG5hbWVkIGJ5IGFsbCBidXQgdGVybWluYWwgYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZSkgCisgICAgICogbXVzdCBhbHJlYWR5IGV4aXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIG9iamVjdCBkaWQgbm90IHN1cHBseSBhbGwgCisgICAgICogbWFuZGF0b3J5IGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kKE5hbWUgbmFtZSwgT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRpckNvbnRleHQuYmluZChwYXJzZU5hbWUobmFtZSksIG9iaik7CisgICAgICAgIGNhY2hlVW5sb2FkKG5hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5hbWUgdG8gYW4gb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIG9iamVjdCBkaWQgbm90IHN1cHBseSBhbGwgCisgICAgICogbWFuZGF0b3J5IGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZGlyQ29udGV4dC5iaW5kKHBhcnNlTmFtZShuYW1lKSwgb2JqKTsKKyAgICAgICAgY2FjaGVVbmxvYWQobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5hbWUgdG8gYW4gb2JqZWN0LCBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgYmluZGluZy4gQWxsIAorICAgICAqIGludGVybWVkaWF0ZSBjb250ZXh0cyBhbmQgdGhlIHRhcmdldCBjb250ZXh0ICh0aGF0IG5hbWVkIGJ5IGFsbCBidXQgCisgICAgICogdGVybWluYWwgYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZSkgbXVzdCBhbHJlYWR5IGV4aXN0LgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBvYmplY3QgaXMgYSBEaXJDb250ZXh0LCBhbnkgZXhpc3RpbmcgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggCisgICAgICogdGhlIG5hbWUgYXJlIHJlcGxhY2VkIHdpdGggdGhvc2Ugb2YgdGhlIG9iamVjdC4gT3RoZXJ3aXNlLCBhbnkgCisgICAgICogZXhpc3RpbmcgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUgcmVtYWluIHVuY2hhbmdlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIG9iamVjdCBkaWQgbm90IHN1cHBseSBhbGwgCisgICAgICogbWFuZGF0b3J5IGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWJpbmQoTmFtZSBuYW1lLCBPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZGlyQ29udGV4dC5yZWJpbmQocGFyc2VOYW1lKG5hbWUpLCBvYmopOworICAgICAgICBjYWNoZVVubG9hZChuYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdCwgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGJpbmRpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBvYmplY3QgZGlkIG5vdCBzdXBwbHkgYWxsIAorICAgICAqIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmViaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZGlyQ29udGV4dC5yZWJpbmQocGFyc2VOYW1lKG5hbWUpLCBvYmopOworICAgICAgICBjYWNoZVVubG9hZChuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVuYmluZHMgdGhlIG5hbWVkIG9iamVjdC4gUmVtb3ZlcyB0aGUgdGVybWluYWwgYXRvbWljIG5hbWUgaW4gbmFtZSAKKyAgICAgKiBmcm9tIHRoZSB0YXJnZXQgY29udGV4dC0tdGhhdCBuYW1lZCBieSBhbGwgYnV0IHRoZSB0ZXJtaW5hbCBhdG9taWMgCisgICAgICogcGFydCBvZiBuYW1lLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGlkZW1wb3RlbnQuIEl0IHN1Y2NlZWRzIGV2ZW4gaWYgdGhlIHRlcm1pbmFsIGF0b21pYyAKKyAgICAgKiBuYW1lIGlzIG5vdCBib3VuZCBpbiB0aGUgdGFyZ2V0IGNvbnRleHQsIGJ1dCB0aHJvd3MgCisgICAgICogTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgaW50ZXJtZWRpYXRlIGNvbnRleHRzIGRvIG5vdCBleGlzdC4gCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFuIGludGVybWVkaWF0ZSBjb250ZXh0IGRvZXMgbm90IAorICAgICAqIGV4aXN0CisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5iaW5kKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRpckNvbnRleHQudW5iaW5kKHBhcnNlTmFtZShuYW1lKSk7CisgICAgICAgIGNhY2hlVW5sb2FkKG5hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbmJpbmRzIHRoZSBuYW1lZCBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFuIGludGVybWVkaWF0ZSBjb250ZXh0IGRvZXMgbm90IAorICAgICAqIGV4aXN0CisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5iaW5kKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZGlyQ29udGV4dC51bmJpbmQocGFyc2VOYW1lKG5hbWUpKTsKKyAgICAgICAgY2FjaGVVbmxvYWQobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5ldyBuYW1lIHRvIHRoZSBvYmplY3QgYm91bmQgdG8gYW4gb2xkIG5hbWUsIGFuZCB1bmJpbmRzIHRoZSAKKyAgICAgKiBvbGQgbmFtZS4gQm90aCBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBjb250ZXh0LiBBbnkgYXR0cmlidXRlcyAKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIG9sZCBuYW1lIGJlY29tZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBuYW1lLiAKKyAgICAgKiBJbnRlcm1lZGlhdGUgY29udGV4dHMgb2YgdGhlIG9sZCBuYW1lIGFyZSBub3QgY2hhbmdlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2xkTmFtZSB0aGUgbmFtZSBvZiB0aGUgZXhpc3RpbmcgYmluZGluZzsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBuZXdOYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgYmluZGluZzsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuZXdOYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW5hbWUoTmFtZSBvbGROYW1lLCBOYW1lIG5ld05hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBkaXJDb250ZXh0LnJlbmFtZShwYXJzZU5hbWUob2xkTmFtZSksIHBhcnNlTmFtZShuZXdOYW1lKSk7CisgICAgICAgIGNhY2hlVW5sb2FkKG9sZE5hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5ldyBuYW1lIHRvIHRoZSBvYmplY3QgYm91bmQgdG8gYW4gb2xkIG5hbWUsIGFuZCB1bmJpbmRzIHRoZSAKKyAgICAgKiBvbGQgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2xkTmFtZSB0aGUgbmFtZSBvZiB0aGUgZXhpc3RpbmcgYmluZGluZzsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBuZXdOYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgYmluZGluZzsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuZXdOYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW5hbWUoU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZGlyQ29udGV4dC5yZW5hbWUocGFyc2VOYW1lKG9sZE5hbWUpLCBwYXJzZU5hbWUobmV3TmFtZSkpOworICAgICAgICBjYWNoZVVubG9hZChvbGROYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgdGhlIG5hbWVzIGJvdW5kIGluIHRoZSBuYW1lZCBjb250ZXh0LCBhbG9uZyB3aXRoIHRoZSBjbGFzcyAKKyAgICAgKiBuYW1lcyBvZiBvYmplY3RzIGJvdW5kIHRvIHRoZW0uIFRoZSBjb250ZW50cyBvZiBhbnkgc3ViY29udGV4dHMgYXJlIAorICAgICAqIG5vdCBpbmNsdWRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIGJpbmRpbmcgaXMgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoaXMgY29udGV4dCwgaXRzIGVmZmVjdCBvbiAKKyAgICAgKiBhbiBlbnVtZXJhdGlvbiBwcmV2aW91c2x5IHJldHVybmVkIGlzIHVuZGVmaW5lZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBsaXN0CisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgbmFtZXMgYW5kIGNsYXNzIG5hbWVzIG9mIHRoZSBiaW5kaW5ncyBpbiAKKyAgICAgKiB0aGlzIGNvbnRleHQuIEVhY2ggZWxlbWVudCBvZiB0aGUgZW51bWVyYXRpb24gaXMgb2YgdHlwZSBOYW1lQ2xhc3NQYWlyLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0KE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXJDb250ZXh0Lmxpc3QocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgdGhlIG5hbWVzIGJvdW5kIGluIHRoZSBuYW1lZCBjb250ZXh0LCBhbG9uZyB3aXRoIHRoZSBjbGFzcyAKKyAgICAgKiBuYW1lcyBvZiBvYmplY3RzIGJvdW5kIHRvIHRoZW0uCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIG5hbWVzIGFuZCBjbGFzcyBuYW1lcyBvZiB0aGUgYmluZGluZ3MgaW4gCisgICAgICogdGhpcyBjb250ZXh0LiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgTmFtZUNsYXNzUGFpci4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXJDb250ZXh0Lmxpc3QocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgdGhlIG5hbWVzIGJvdW5kIGluIHRoZSBuYW1lZCBjb250ZXh0LCBhbG9uZyB3aXRoIHRoZSAKKyAgICAgKiBvYmplY3RzIGJvdW5kIHRvIHRoZW0uIFRoZSBjb250ZW50cyBvZiBhbnkgc3ViY29udGV4dHMgYXJlIG5vdCAKKyAgICAgKiBpbmNsdWRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIGJpbmRpbmcgaXMgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoaXMgY29udGV4dCwgaXRzIGVmZmVjdCBvbiAKKyAgICAgKiBhbiBlbnVtZXJhdGlvbiBwcmV2aW91c2x5IHJldHVybmVkIGlzIHVuZGVmaW5lZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBsaXN0CisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgYmluZGluZ3MgaW4gdGhpcyBjb250ZXh0LiAKKyAgICAgKiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgQmluZGluZy4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdEJpbmRpbmdzKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXJDb250ZXh0Lmxpc3RCaW5kaW5ncyhwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyB0aGUgbmFtZXMgYm91bmQgaW4gdGhlIG5hbWVkIGNvbnRleHQsIGFsb25nIHdpdGggdGhlIAorICAgICAqIG9iamVjdHMgYm91bmQgdG8gdGhlbS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBsaXN0CisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgYmluZGluZ3MgaW4gdGhpcyBjb250ZXh0LiAKKyAgICAgKiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgQmluZGluZy4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdEJpbmRpbmdzKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRpckNvbnRleHQubGlzdEJpbmRpbmdzKHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXN0cm95cyB0aGUgbmFtZWQgY29udGV4dCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBuYW1lc3BhY2UuIEFueSAKKyAgICAgKiBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSBhcmUgYWxzbyByZW1vdmVkLiBJbnRlcm1lZGlhdGUgCisgICAgICogY29udGV4dHMgYXJlIG5vdCBkZXN0cm95ZWQuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgaWRlbXBvdGVudC4gSXQgc3VjY2VlZHMgZXZlbiBpZiB0aGUgdGVybWluYWwgYXRvbWljIAorICAgICAqIG5hbWUgaXMgbm90IGJvdW5kIGluIHRoZSB0YXJnZXQgY29udGV4dCwgYnV0IHRocm93cyAKKyAgICAgKiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBpbnRlcm1lZGlhdGUgY29udGV4dHMgZG8gbm90IGV4aXN0LiAKKyAgICAgKiAKKyAgICAgKiBJbiBhIGZlZGVyYXRlZCBuYW1pbmcgc3lzdGVtLCBhIGNvbnRleHQgZnJvbSBvbmUgbmFtaW5nIHN5c3RlbSBtYXkgYmUgCisgICAgICogYm91bmQgdG8gYSBuYW1lIGluIGFub3RoZXIuIE9uZSBjYW4gc3Vic2VxdWVudGx5IGxvb2sgdXAgYW5kIHBlcmZvcm0gCisgICAgICogb3BlcmF0aW9ucyBvbiB0aGUgZm9yZWlnbiBjb250ZXh0IHVzaW5nIGEgY29tcG9zaXRlIG5hbWUuIEhvd2V2ZXIsIGFuIAorICAgICAqIGF0dGVtcHQgZGVzdHJveSB0aGUgY29udGV4dCB1c2luZyB0aGlzIGNvbXBvc2l0ZSBuYW1lIHdpbGwgZmFpbCB3aXRoIAorICAgICAqIE5vdENvbnRleHRFeGNlcHRpb24sIGJlY2F1c2UgdGhlIGZvcmVpZ24gY29udGV4dCBpcyBub3QgYSAic3ViY29udGV4dCIgCisgICAgICogb2YgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgYm91bmQuIEluc3RlYWQsIHVzZSB1bmJpbmQoKSB0byByZW1vdmUgCisgICAgICogdGhlIGJpbmRpbmcgb2YgdGhlIGZvcmVpZ24gY29udGV4dC4gRGVzdHJveWluZyB0aGUgZm9yZWlnbiBjb250ZXh0IAorICAgICAqIHJlcXVpcmVzIHRoYXQgdGhlIGRlc3Ryb3lTdWJjb250ZXh0KCkgYmUgcGVyZm9ybWVkIG9uIGEgY29udGV4dCBmcm9tIAorICAgICAqIHRoZSBmb3JlaWduIGNvbnRleHQncyAibmF0aXZlIiBuYW1pbmcgc3lzdGVtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGJlIGRlc3Ryb3llZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFuIGludGVybWVkaWF0ZSBjb250ZXh0IGRvZXMgbm90IAorICAgICAqIGV4aXN0CisgICAgICogQGV4Y2VwdGlvbiBOb3RDb250ZXh0RXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIGJvdW5kIGJ1dCBkb2VzIG5vdCBuYW1lIAorICAgICAqIGEgY29udGV4dCwgb3IgZG9lcyBub3QgbmFtZSBhIGNvbnRleHQgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95U3ViY29udGV4dChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBkaXJDb250ZXh0LmRlc3Ryb3lTdWJjb250ZXh0KHBhcnNlTmFtZShuYW1lKSk7CisgICAgICAgIGNhY2hlVW5sb2FkKG5hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXN0cm95cyB0aGUgbmFtZWQgY29udGV4dCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBuYW1lc3BhY2UuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gYmUgZGVzdHJveWVkOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gaW50ZXJtZWRpYXRlIGNvbnRleHQgZG9lcyBub3QgCisgICAgICogZXhpc3QKKyAgICAgKiBAZXhjZXB0aW9uIE5vdENvbnRleHRFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgYm91bmQgYnV0IGRvZXMgbm90IG5hbWUgCisgICAgICogYSBjb250ZXh0LCBvciBkb2VzIG5vdCBuYW1lIGEgY29udGV4dCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lTdWJjb250ZXh0KFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZGlyQ29udGV4dC5kZXN0cm95U3ViY29udGV4dChwYXJzZU5hbWUobmFtZSkpOworICAgICAgICBjYWNoZVVubG9hZChuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGJpbmRzIGEgbmV3IGNvbnRleHQuIENyZWF0ZXMgYSBuZXcgY29udGV4dCB3aXRoIHRoZSBnaXZlbiAKKyAgICAgKiBuYW1lIGFuZCBiaW5kcyBpdCBpbiB0aGUgdGFyZ2V0IGNvbnRleHQgKHRoYXQgbmFtZWQgYnkgYWxsIGJ1dCAKKyAgICAgKiB0ZXJtaW5hbCBhdG9taWMgY29tcG9uZW50IG9mIHRoZSBuYW1lKS4gQWxsIGludGVybWVkaWF0ZSBjb250ZXh0cyBhbmQgCisgICAgICogdGhlIHRhcmdldCBjb250ZXh0IG11c3QgYWxyZWFkeSBleGlzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBjcmVhdGU7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBjcmVhdGlvbiBvZiB0aGUgc3ViY29udGV4dCAKKyAgICAgKiByZXF1aXJlcyBzcGVjaWZpY2F0aW9uIG9mIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIENvbnRleHQgY3JlYXRlU3ViY29udGV4dChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBkaXJDb250ZXh0LmNyZWF0ZVN1YmNvbnRleHQocGFyc2VOYW1lKG5hbWUpKTsKKyAgICAgICAgY2FjaGVVbmxvYWQobmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuZCBiaW5kcyBhIG5ldyBjb250ZXh0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGNyZWF0ZTsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dAorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIGNyZWF0aW9uIG9mIHRoZSBzdWJjb250ZXh0IAorICAgICAqIHJlcXVpcmVzIHNwZWNpZmljYXRpb24gb2YgbWFuZGF0b3J5IGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dCBjcmVhdGVTdWJjb250ZXh0KFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZGlyQ29udGV4dC5jcmVhdGVTdWJjb250ZXh0KHBhcnNlTmFtZShuYW1lKSk7CisgICAgICAgIGNhY2hlVW5sb2FkKG5hbWUpOworICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmFtZWQgb2JqZWN0LCBmb2xsb3dpbmcgbGlua3MgZXhjZXB0IGZvciB0aGUgdGVybWluYWwgCisgICAgICogYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZS4gSWYgdGhlIG9iamVjdCBib3VuZCB0byBuYW1lIGlzIG5vdCBhIAorICAgICAqIGxpbmssIHJldHVybnMgdGhlIG9iamVjdCBpdHNlbGYuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUsIG5vdCBmb2xsb3dpbmcgdGhlIHRlcm1pbmFsIGxpbmsgCisgICAgICogKGlmIGFueSkuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBsb29rdXBMaW5rKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXJDb250ZXh0Lmxvb2t1cExpbmsocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmFtZWQgb2JqZWN0LCBmb2xsb3dpbmcgbGlua3MgZXhjZXB0IGZvciB0aGUgdGVybWluYWwgCisgICAgICogYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgdXAKKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZSwgbm90IGZvbGxvd2luZyB0aGUgdGVybWluYWwgbGluayAKKyAgICAgKiAoaWYgYW55KS4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGxvb2t1cExpbmsoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5sb29rdXBMaW5rKHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHBhcnNlciBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVkIGNvbnRleHQuIEluIGEgCisgICAgICogZmVkZXJhdGlvbiBvZiBuYW1lc3BhY2VzLCBkaWZmZXJlbnQgbmFtaW5nIHN5c3RlbXMgd2lsbCBwYXJzZSBuYW1lcyAKKyAgICAgKiBkaWZmZXJlbnRseS4gVGhpcyBtZXRob2QgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGdldCBhIHBhcnNlciBmb3IgCisgICAgICogcGFyc2luZyBuYW1lcyBpbnRvIHRoZWlyIGF0b21pYyBjb21wb25lbnRzIHVzaW5nIHRoZSBuYW1pbmcgY29udmVudGlvbiAKKyAgICAgKiBvZiBhIHBhcnRpY3VsYXIgbmFtaW5nIHN5c3RlbS4gV2l0aGluIGFueSBzaW5nbGUgbmFtaW5nIHN5c3RlbSwgCisgICAgICogTmFtZVBhcnNlciBvYmplY3RzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIG11c3QgYmUgZXF1YWwgKHVzaW5nIHRoZSAKKyAgICAgKiBlcXVhbHMoKSB0ZXN0KS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgcGFyc2VyCisgICAgICogQHJldHVybiBhIG5hbWUgcGFyc2VyIHRoYXQgY2FuIHBhcnNlIGNvbXBvdW5kIG5hbWVzIGludG8gdGhlaXIgYXRvbWljIAorICAgICAqIGNvbXBvbmVudHMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZVBhcnNlciBnZXROYW1lUGFyc2VyKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXJDb250ZXh0LmdldE5hbWVQYXJzZXIocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgcGFyc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgY29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgcGFyc2VyCisgICAgICogQHJldHVybiBhIG5hbWUgcGFyc2VyIHRoYXQgY2FuIHBhcnNlIGNvbXBvdW5kIG5hbWVzIGludG8gdGhlaXIgYXRvbWljIAorICAgICAqIGNvbXBvbmVudHMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZVBhcnNlciBnZXROYW1lUGFyc2VyKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRpckNvbnRleHQuZ2V0TmFtZVBhcnNlcihwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29tcG9zZXMgdGhlIG5hbWUgb2YgdGhpcyBjb250ZXh0IHdpdGggYSBuYW1lIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dC4KKyAgICAgKiA8cD4KKyAgICAgKiBHaXZlbiBhIG5hbWUgKG5hbWUpIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dCwgYW5kIHRoZSBuYW1lIChwcmVmaXgpIAorICAgICAqIG9mIHRoaXMgY29udGV4dCByZWxhdGl2ZSB0byBvbmUgb2YgaXRzIGFuY2VzdG9ycywgdGhpcyBtZXRob2QgcmV0dXJucyAKKyAgICAgKiB0aGUgY29tcG9zaXRpb24gb2YgdGhlIHR3byBuYW1lcyB1c2luZyB0aGUgc3ludGF4IGFwcHJvcHJpYXRlIGZvciB0aGUgCisgICAgICogbmFtaW5nIHN5c3RlbShzKSBpbnZvbHZlZC4gVGhhdCBpcywgaWYgbmFtZSBuYW1lcyBhbiBvYmplY3QgcmVsYXRpdmUgCisgICAgICogdG8gdGhpcyBjb250ZXh0LCB0aGUgcmVzdWx0IGlzIHRoZSBuYW1lIG9mIHRoZSBzYW1lIG9iamVjdCwgYnV0IAorICAgICAqIHJlbGF0aXZlIHRvIHRoZSBhbmNlc3RvciBjb250ZXh0LiBOb25lIG9mIHRoZSBuYW1lcyBtYXkgYmUgbnVsbC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBhIG5hbWUgcmVsYXRpdmUgdG8gdGhpcyBjb250ZXh0CisgICAgICogQHBhcmFtIHByZWZpeCB0aGUgbmFtZSBvZiB0aGlzIGNvbnRleHQgcmVsYXRpdmUgdG8gb25lIG9mIGl0cyBhbmNlc3RvcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wb3NpdGlvbiBvZiBwcmVmaXggYW5kIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZSBjb21wb3NlTmFtZShOYW1lIG5hbWUsIE5hbWUgcHJlZml4KQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcHJlZml4ID0gKE5hbWUpIHByZWZpeC5jbG9uZSgpOworICAgICAgICByZXR1cm4gcHJlZml4LmFkZEFsbChuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbXBvc2VzIHRoZSBuYW1lIG9mIHRoaXMgY29udGV4dCB3aXRoIGEgbmFtZSByZWxhdGl2ZSB0byB0aGlzIGNvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgYSBuYW1lIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dAorICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIG5hbWUgb2YgdGhpcyBjb250ZXh0IHJlbGF0aXZlIHRvIG9uZSBvZiBpdHMgYW5jZXN0b3JzCisgICAgICogQHJldHVybiB0aGUgY29tcG9zaXRpb24gb2YgcHJlZml4IGFuZCBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjb21wb3NlTmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBwcmVmaXggKyAiLyIgKyBuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldyBlbnZpcm9ubWVudCBwcm9wZXJ0eSB0byB0aGUgZW52aXJvbm1lbnQgb2YgdGhpcyBjb250ZXh0LiBJZiAKKyAgICAgKiB0aGUgcHJvcGVydHkgYWxyZWFkeSBleGlzdHMsIGl0cyB2YWx1ZSBpcyBvdmVyd3JpdHRlbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvcE5hbWUgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHByb3BlcnR5IHRvIGFkZDsgbWF5IG5vdCAKKyAgICAgKiBiZSBudWxsCisgICAgICogQHBhcmFtIHByb3BWYWwgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byBhZGQ7IG1heSBub3QgYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgYWRkVG9FbnZpcm9ubWVudChTdHJpbmcgcHJvcE5hbWUsIE9iamVjdCBwcm9wVmFsKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRpckNvbnRleHQuYWRkVG9FbnZpcm9ubWVudChwcm9wTmFtZSwgcHJvcFZhbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFuIGVudmlyb25tZW50IHByb3BlcnR5IGZyb20gdGhlIGVudmlyb25tZW50IG9mIHRoaXMgY29udGV4dC4gCisgICAgICogCisgICAgICogQHBhcmFtIHByb3BOYW1lIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBwcm9wZXJ0eSB0byByZW1vdmU7IAorICAgICAqIG1heSBub3QgYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlRnJvbUVudmlyb25tZW50KFN0cmluZyBwcm9wTmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXJDb250ZXh0LnJlbW92ZUZyb21FbnZpcm9ubWVudChwcm9wTmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGVudmlyb25tZW50IGluIGVmZmVjdCBmb3IgdGhpcyBjb250ZXh0LiBTZWUgY2xhc3MgCisgICAgICogZGVzY3JpcHRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiBlbnZpcm9ubWVudCBwcm9wZXJ0aWVzLiAKKyAgICAgKiBUaGUgY2FsbGVyIHNob3VsZCBub3QgbWFrZSBhbnkgY2hhbmdlcyB0byB0aGUgb2JqZWN0IHJldHVybmVkOiB0aGVpciAKKyAgICAgKiBlZmZlY3Qgb24gdGhlIGNvbnRleHQgaXMgdW5kZWZpbmVkLiBUaGUgZW52aXJvbm1lbnQgb2YgdGhpcyBjb250ZXh0IAorICAgICAqIG1heSBiZSBjaGFuZ2VkIHVzaW5nIGFkZFRvRW52aXJvbm1lbnQoKSBhbmQgcmVtb3ZlRnJvbUVudmlyb25tZW50KCkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZW52aXJvbm1lbnQgb2YgdGhpcyBjb250ZXh0OyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRFbnZpcm9ubWVudCgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5nZXRFbnZpcm9ubWVudCgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoaXMgY29udGV4dC4gVGhpcyBtZXRob2QgcmVsZWFzZXMgdGhpcyBjb250ZXh0J3MgcmVzb3VyY2VzIAorICAgICAqIGltbWVkaWF0ZWx5LCBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZW0gdG8gYmUgcmVsZWFzZWQgYXV0b21hdGljYWxseSAKKyAgICAgKiBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuCisgICAgICogVGhpcyBtZXRob2QgaXMgaWRlbXBvdGVudDogaW52b2tpbmcgaXQgb24gYSBjb250ZXh0IHRoYXQgaGFzIGFscmVhZHkgCisgICAgICogYmVlbiBjbG9zZWQgaGFzIG5vIGVmZmVjdC4gSW52b2tpbmcgYW55IG90aGVyIG1ldGhvZCBvbiBhIGNsb3NlZCAKKyAgICAgKiBjb250ZXh0IGlzIG5vdCBhbGxvd2VkLCBhbmQgcmVzdWx0cyBpbiB1bmRlZmluZWQgYmVoYXZpb3VyLgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRpckNvbnRleHQuY2xvc2UoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgY29udGV4dCB3aXRoaW4gaXRzIG93biBuYW1lc3BhY2UuCisgICAgICogPHA+CisgICAgICogTWFueSBuYW1pbmcgc2VydmljZXMgaGF2ZSBhIG5vdGlvbiBvZiBhICJmdWxsIG5hbWUiIGZvciBvYmplY3RzIGluIAorICAgICAqIHRoZWlyIHJlc3BlY3RpdmUgbmFtZXNwYWNlcy4gRm9yIGV4YW1wbGUsIGFuIExEQVAgZW50cnkgaGFzIGEgCisgICAgICogZGlzdGluZ3Vpc2hlZCBuYW1lLCBhbmQgYSBETlMgcmVjb3JkIGhhcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiBUaGlzIAorICAgICAqIG1ldGhvZCBhbGxvd3MgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiB0byByZXRyaWV2ZSB0aGlzIG5hbWUuIFRoZSBzdHJpbmcgCisgICAgICogcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgbm90IGEgSk5ESSBjb21wb3NpdGUgbmFtZSBhbmQgc2hvdWxkIG5vdCBiZSAKKyAgICAgKiBwYXNzZWQgZGlyZWN0bHkgdG8gY29udGV4dCBtZXRob2RzLiBJbiBuYW1pbmcgc3lzdGVtcyBmb3Igd2hpY2ggdGhlIAorICAgICAqIG5vdGlvbiBvZiBmdWxsIG5hbWUgZG9lcyBub3QgbWFrZSBzZW5zZSwgCisgICAgICogT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoaXMgY29udGV4dCdzIG5hbWUgaW4gaXRzIG93biBuYW1lc3BhY2U7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiB0aGUgbmFtaW5nIHN5c3RlbSBkb2VzIAorICAgICAqIG5vdCBoYXZlIHRoZSBub3Rpb24gb2YgYSBmdWxsIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVJbk5hbWVzcGFjZSgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5nZXROYW1lSW5OYW1lc3BhY2UoKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERpckNvbnRleHQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIG9iamVjdC4gCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIG5hbWUuIAorICAgICAqIFJldHVybnMgYW4gZW1wdHkgYXR0cmlidXRlIHNldCBpZiBuYW1lIGhhcyBubyBhdHRyaWJ1dGVzOyBuZXZlciBudWxsLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgZnJvbSB3aGljaCB0byByZXRyaWV2ZSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcyhOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBDYWNoZUVudHJ5IGVudHJ5ID0gY2FjaGVMb29rdXAobmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghZW50cnkuZXhpc3RzKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbm90Rm91bmRFeGNlcHRpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZW50cnkuYXR0cmlidXRlczsKKyAgICAgICAgfQorICAgICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBkaXJDb250ZXh0LmdldEF0dHJpYnV0ZXMocGFyc2VOYW1lKG5hbWUpKTsKKyAgICAgICAgaWYgKCEoYXR0cmlidXRlcyBpbnN0YW5jZW9mIFJlc291cmNlQXR0cmlidXRlcykpIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgUmVzb3VyY2VBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGFsbCBvZiB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBvYmplY3QuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIG5hbWUKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gcmV0cmlldmUgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBDYWNoZUVudHJ5IGVudHJ5ID0gY2FjaGVMb29rdXAobmFtZSk7CisgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWVudHJ5LmV4aXN0cykgeworICAgICAgICAgICAgICAgIHRocm93IG5vdEZvdW5kRXhjZXB0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmF0dHJpYnV0ZXM7CisgICAgICAgIH0KKyAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gZGlyQ29udGV4dC5nZXRBdHRyaWJ1dGVzKHBhcnNlTmFtZShuYW1lKSk7CisgICAgICAgIGlmICghKGF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBSZXNvdXJjZUF0dHJpYnV0ZXMpKSB7CisgICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IFJlc291cmNlQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXR0cmlidXRlczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBzZWxlY3RlZCBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIG9iamVjdC4gCisgICAgICogU2VlIHRoZSBjbGFzcyBkZXNjcmlwdGlvbiByZWdhcmRpbmcgYXR0cmlidXRlIG1vZGVscywgYXR0cmlidXRlIHR5cGUgCisgICAgICogbmFtZXMsIGFuZCBvcGVyYXRpb25hbCBhdHRyaWJ1dGVzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzOyBuZXZlciBudWxsCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMKKyAgICAgKiBAcGFyYW0gYXR0cklkcyB0aGUgaWRlbnRpZmllcnMgb2YgdGhlIGF0dHJpYnV0ZXMgdG8gcmV0cmlldmUuIG51bGwgCisgICAgICogaW5kaWNhdGVzIHRoYXQgYWxsIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHJldHJpZXZlZDsgYW4gZW1wdHkgYXJyYXkgCisgICAgICogaW5kaWNhdGVzIHRoYXQgbm9uZSBzaG91bGQgYmUgcmV0cmlldmVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcyhOYW1lIG5hbWUsIFN0cmluZ1tdIGF0dHJJZHMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSAKKyAgICAgICAgICAgIGRpckNvbnRleHQuZ2V0QXR0cmlidXRlcyhwYXJzZU5hbWUobmFtZSksIGF0dHJJZHMpOworICAgICAgICBpZiAoIShhdHRyaWJ1dGVzIGluc3RhbmNlb2YgUmVzb3VyY2VBdHRyaWJ1dGVzKSkgeworICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBSZXNvdXJjZUF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgc2VsZWN0ZWQgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBvYmplY3QuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZXM7IG5ldmVyIG51bGwKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gcmV0cmlldmUgYXR0cmlidXRlcworICAgICAqIEBwYXJhbSBhdHRySWRzIHRoZSBpZGVudGlmaWVycyBvZiB0aGUgYXR0cmlidXRlcyB0byByZXRyaWV2ZS4gbnVsbCAKKyAgICAgKiBpbmRpY2F0ZXMgdGhhdCBhbGwgYXR0cmlidXRlcyBzaG91bGQgYmUgcmV0cmlldmVkOyBhbiBlbXB0eSBhcnJheSAKKyAgICAgKiBpbmRpY2F0ZXMgdGhhdCBub25lIHNob3VsZCBiZSByZXRyaWV2ZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcyhTdHJpbmcgbmFtZSwgU3RyaW5nW10gYXR0cklkcykKKyAgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSAKKyAgICAgICAgICAgIGRpckNvbnRleHQuZ2V0QXR0cmlidXRlcyhwYXJzZU5hbWUobmFtZSksIGF0dHJJZHMpOworICAgICAgICBpZiAoIShhdHRyaWJ1dGVzIGluc3RhbmNlb2YgUmVzb3VyY2VBdHRyaWJ1dGVzKSkgeworICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBSZXNvdXJjZUF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7CisgICAgIH0KKworCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgb2JqZWN0LiBUaGUgb3JkZXIgb2YgCisgICAgICogdGhlIG1vZGlmaWNhdGlvbnMgaXMgbm90IHNwZWNpZmllZC4gV2hlcmUgcG9zc2libGUsIHRoZSBtb2RpZmljYXRpb25zIAorICAgICAqIGFyZSBwZXJmb3JtZWQgYXRvbWljYWxseS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIGF0dHJpYnV0ZXMgd2lsbCBiZSB1cGRhdGVkCisgICAgICogQHBhcmFtIG1vZF9vcCB0aGUgbW9kaWZpY2F0aW9uIG9wZXJhdGlvbiwgb25lIG9mOiBBRERfQVRUUklCVVRFLCAKKyAgICAgKiBSRVBMQUNFX0FUVFJJQlVURSwgUkVNT1ZFX0FUVFJJQlVURQorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyB0byBiZSB1c2VkIGZvciB0aGUgbW9kaWZpY2F0aW9uOyBtYXkgbm90IAorICAgICAqIGJlIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIEF0dHJpYnV0ZU1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgbW9kaWZpY2F0aW9uIGNhbm5vdCBiZQorICAgICAqIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtb2RpZnlBdHRyaWJ1dGVzKE5hbWUgbmFtZSwgaW50IG1vZF9vcCwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRpckNvbnRleHQubW9kaWZ5QXR0cmlidXRlcyhwYXJzZU5hbWUobmFtZSksIG1vZF9vcCwgYXR0cnMpOworICAgICAgICBjYWNoZVVubG9hZChuYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2UgYXR0cmlidXRlcyB3aWxsIGJlIHVwZGF0ZWQKKyAgICAgKiBAcGFyYW0gbW9kX29wIHRoZSBtb2RpZmljYXRpb24gb3BlcmF0aW9uLCBvbmUgb2Y6IEFERF9BVFRSSUJVVEUsIAorICAgICAqIFJFUExBQ0VfQVRUUklCVVRFLCBSRU1PVkVfQVRUUklCVVRFCisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIHRvIGJlIHVzZWQgZm9yIHRoZSBtb2RpZmljYXRpb247IG1heSBub3QgCisgICAgICogYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gQXR0cmlidXRlTW9kaWZpY2F0aW9uRXhjZXB0aW9uIGlmIHRoZSBtb2RpZmljYXRpb24gY2Fubm90IGJlCisgICAgICogY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1vZGlmeUF0dHJpYnV0ZXMoU3RyaW5nIG5hbWUsIGludCBtb2Rfb3AsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBkaXJDb250ZXh0Lm1vZGlmeUF0dHJpYnV0ZXMocGFyc2VOYW1lKG5hbWUpLCBtb2Rfb3AsIGF0dHJzKTsKKyAgICAgICAgY2FjaGVVbmxvYWQobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBvYmplY3QgdXNpbmcgYW4gYW4gCisgICAgICogb3JkZXJlZCBsaXN0IG9mIG1vZGlmaWNhdGlvbnMuIFRoZSBtb2RpZmljYXRpb25zIGFyZSBwZXJmb3JtZWQgaW4gdGhlIAorICAgICAqIG9yZGVyIHNwZWNpZmllZC4gRWFjaCBtb2RpZmljYXRpb24gc3BlY2lmaWVzIGEgbW9kaWZpY2F0aW9uIG9wZXJhdGlvbiAKKyAgICAgKiBjb2RlIGFuZCBhbiBhdHRyaWJ1dGUgb24gd2hpY2ggdG8gb3BlcmF0ZS4gV2hlcmUgcG9zc2libGUsIHRoZSAKKyAgICAgKiBtb2RpZmljYXRpb25zIGFyZSBwZXJmb3JtZWQgYXRvbWljYWxseS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIGF0dHJpYnV0ZXMgd2lsbCBiZSB1cGRhdGVkCisgICAgICogQHBhcmFtIG1vZHMgYW4gb3JkZXJlZCBzZXF1ZW5jZSBvZiBtb2RpZmljYXRpb25zIHRvIGJlIHBlcmZvcm1lZDsgbWF5IAorICAgICAqIG5vdCBiZSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBBdHRyaWJ1dGVNb2RpZmljYXRpb25FeGNlcHRpb24gaWYgdGhlIG1vZGlmaWNhdGlvbiBjYW5ub3QgYmUKKyAgICAgKiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgbW9kaWZ5QXR0cmlidXRlcyhOYW1lIG5hbWUsIE1vZGlmaWNhdGlvbkl0ZW1bXSBtb2RzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZGlyQ29udGV4dC5tb2RpZnlBdHRyaWJ1dGVzKHBhcnNlTmFtZShuYW1lKSwgbW9kcyk7CisgICAgICAgIGNhY2hlVW5sb2FkKG5hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBvYmplY3QgdXNpbmcgYW4gYW4gCisgICAgICogb3JkZXJlZCBsaXN0IG9mIG1vZGlmaWNhdGlvbnMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB3aG9zZSBhdHRyaWJ1dGVzIHdpbGwgYmUgdXBkYXRlZAorICAgICAqIEBwYXJhbSBtb2RzIGFuIG9yZGVyZWQgc2VxdWVuY2Ugb2YgbW9kaWZpY2F0aW9ucyB0byBiZSBwZXJmb3JtZWQ7IG1heSAKKyAgICAgKiBub3QgYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gQXR0cmlidXRlTW9kaWZpY2F0aW9uRXhjZXB0aW9uIGlmIHRoZSBtb2RpZmljYXRpb24gY2Fubm90IGJlCisgICAgICogY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1vZGlmeUF0dHJpYnV0ZXMoU3RyaW5nIG5hbWUsIE1vZGlmaWNhdGlvbkl0ZW1bXSBtb2RzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZGlyQ29udGV4dC5tb2RpZnlBdHRyaWJ1dGVzKHBhcnNlTmFtZShuYW1lKSwgbW9kcyk7CisgICAgICAgIGNhY2hlVW5sb2FkKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdCwgYWxvbmcgd2l0aCBhc3NvY2lhdGVkIGF0dHJpYnV0ZXMuIElmIGF0dHJzIAorICAgICAqIGlzIG51bGwsIHRoZSByZXN1bHRpbmcgYmluZGluZyB3aWxsIGhhdmUgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCAKKyAgICAgKiB3aXRoIG9iaiBpZiBvYmogaXMgYSBEaXJDb250ZXh0LCBhbmQgbm8gYXR0cmlidXRlcyBvdGhlcndpc2UuIElmIGF0dHJzIAorICAgICAqIGlzIG5vbi1udWxsLCB0aGUgcmVzdWx0aW5nIGJpbmRpbmcgd2lsbCBoYXZlIGF0dHJzIGFzIGl0cyBhdHRyaWJ1dGVzOyAKKyAgICAgKiBhbnkgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggb2JqIGFyZSBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgYmluZGluZworICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIHNvbWUgIm1hbmRhdG9yeSIgYXR0cmlidXRlcyAKKyAgICAgKiBvZiB0aGUgYmluZGluZyBhcmUgbm90IHN1cHBsaWVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZChOYW1lIG5hbWUsIE9iamVjdCBvYmosIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBkaXJDb250ZXh0LmJpbmQocGFyc2VOYW1lKG5hbWUpLCBvYmosIGF0dHJzKTsKKyAgICAgICAgY2FjaGVVbmxvYWQobmFtZS50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QsIGFsb25nIHdpdGggYXNzb2NpYXRlZCBhdHRyaWJ1dGVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgYmluZGluZworICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIHNvbWUgIm1hbmRhdG9yeSIgYXR0cmlidXRlcyAKKyAgICAgKiBvZiB0aGUgYmluZGluZyBhcmUgbm90IHN1cHBsaWVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaiwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRpckNvbnRleHQuYmluZChwYXJzZU5hbWUobmFtZSksIG9iaiwgYXR0cnMpOworICAgICAgICBjYWNoZVVubG9hZChuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QsIGFsb25nIHdpdGggYXNzb2NpYXRlZCBhdHRyaWJ1dGVzLCAKKyAgICAgKiBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgYmluZGluZy4gSWYgYXR0cnMgaXMgbnVsbCBhbmQgb2JqIGlzIGEgCisgICAgICogRGlyQ29udGV4dCwgdGhlIGF0dHJpYnV0ZXMgZnJvbSBvYmogYXJlIHVzZWQuIElmIGF0dHJzIGlzIG51bGwgYW5kIG9iaiAKKyAgICAgKiBpcyBub3QgYSBEaXJDb250ZXh0LCBhbnkgZXhpc3RpbmcgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdAorICAgICAqIGFscmVhZHkgYm91bmQgaW4gdGhlIGRpcmVjdG9yeSByZW1haW4gdW5jaGFuZ2VkLiBJZiBhdHRycyBpcyBub24tbnVsbCwgCisgICAgICogYW55IGV4aXN0aW5nIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3QgYWxyZWFkeSBib3VuZCBpbiAKKyAgICAgKiB0aGUgZGlyZWN0b3J5IGFyZSByZW1vdmVkIGFuZCBhdHRycyBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVkIAorICAgICAqIG9iamVjdC4gSWYgb2JqIGlzIGEgRGlyQ29udGV4dCBhbmQgYXR0cnMgaXMgbm9uLW51bGwsIHRoZSBhdHRyaWJ1dGVzIAorICAgICAqIG9mIG9iaiBhcmUgaWdub3JlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGJpbmRpbmcKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIHNvbWUgIm1hbmRhdG9yeSIgYXR0cmlidXRlcyAKKyAgICAgKiBvZiB0aGUgYmluZGluZyBhcmUgbm90IHN1cHBsaWVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmViaW5kKE5hbWUgbmFtZSwgT2JqZWN0IG9iaiwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRpckNvbnRleHQucmViaW5kKHBhcnNlTmFtZShuYW1lKSwgb2JqLCBhdHRycyk7CisgICAgICAgIGNhY2hlVW5sb2FkKG5hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5hbWUgdG8gYW4gb2JqZWN0LCBhbG9uZyB3aXRoIGFzc29jaWF0ZWQgYXR0cmlidXRlcywgCisgICAgICogb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGJpbmRpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBiaW5kaW5nCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBzb21lICJtYW5kYXRvcnkiIGF0dHJpYnV0ZXMgCisgICAgICogb2YgdGhlIGJpbmRpbmcgYXJlIG5vdCBzdXBwbGllZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlYmluZChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaiwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRpckNvbnRleHQucmViaW5kKHBhcnNlTmFtZShuYW1lKSwgb2JqLCBhdHRycyk7CisgICAgICAgIGNhY2hlVW5sb2FkKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbmQgYmluZHMgYSBuZXcgY29udGV4dCwgYWxvbmcgd2l0aCBhc3NvY2lhdGVkIGF0dHJpYnV0ZXMuIAorICAgICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgc3ViY29udGV4dCB3aXRoIHRoZSBnaXZlbiBuYW1lLCBiaW5kcyBpdCBpbiAKKyAgICAgKiB0aGUgdGFyZ2V0IGNvbnRleHQgKHRoYXQgbmFtZWQgYnkgYWxsIGJ1dCB0ZXJtaW5hbCBhdG9taWMgY29tcG9uZW50IG9mIAorICAgICAqIHRoZSBuYW1lKSwgYW5kIGFzc29jaWF0ZXMgdGhlIHN1cHBsaWVkIGF0dHJpYnV0ZXMgd2l0aCB0aGUgbmV3bHkgCisgICAgICogY3JlYXRlZCBvYmplY3QuIEFsbCBpbnRlcm1lZGlhdGUgYW5kIHRhcmdldCBjb250ZXh0cyBtdXN0IGFscmVhZHkgCisgICAgICogZXhpc3QuIElmIGF0dHJzIGlzIG51bGwsIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gCisgICAgICogQ29udGV4dC5jcmVhdGVTdWJjb250ZXh0KCkuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgYXR0cnMgZG9lcyBub3QgY29udGFpbiBhbGwgCisgICAgICogdGhlIG1hbmRhdG9yeSBhdHRyaWJ1dGVzIHJlcXVpcmVkIGZvciBjcmVhdGlvbgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBEaXJDb250ZXh0IGNyZWF0ZVN1YmNvbnRleHQoTmFtZSBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgRGlyQ29udGV4dCBjb250ZXh0ID0gCisgICAgICAgICAgICBkaXJDb250ZXh0LmNyZWF0ZVN1YmNvbnRleHQocGFyc2VOYW1lKG5hbWUpLCBhdHRycyk7CisgICAgICAgIGNhY2hlVW5sb2FkKG5hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBjb250ZXh0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbmQgYmluZHMgYSBuZXcgY29udGV4dCwgYWxvbmcgd2l0aCBhc3NvY2lhdGVkIGF0dHJpYnV0ZXMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgYXR0cnMgZG9lcyBub3QgY29udGFpbiBhbGwgCisgICAgICogdGhlIG1hbmRhdG9yeSBhdHRyaWJ1dGVzIHJlcXVpcmVkIGZvciBjcmVhdGlvbgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBEaXJDb250ZXh0IGNyZWF0ZVN1YmNvbnRleHQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBEaXJDb250ZXh0IGNvbnRleHQgPSAKKyAgICAgICAgICAgIGRpckNvbnRleHQuY3JlYXRlU3ViY29udGV4dChwYXJzZU5hbWUobmFtZSksIGF0dHJzKTsKKyAgICAgICAgY2FjaGVVbmxvYWQobmFtZSk7CisgICAgICAgIHJldHVybiBjb250ZXh0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lZCBvYmplY3QuIFRoZSBzY2hlbWEgCisgICAgICogZGVzY3JpYmVzIHJ1bGVzIHJlZ2FyZGluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBuYW1lc3BhY2UgYW5kIHRoZSAKKyAgICAgKiBhdHRyaWJ1dGVzIHN0b3JlZCB3aXRoaW4gaXQuIFRoZSBzY2hlbWEgc3BlY2lmaWVzIHdoYXQgdHlwZXMgb2YgCisgICAgICogb2JqZWN0cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGRpcmVjdG9yeSBhbmQgd2hlcmUgdGhleSBjYW4gYmUgYWRkZWQ7IAorICAgICAqIHdoYXQgbWFuZGF0b3J5IGFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzIGFuIG9iamVjdCBjYW4gaGF2ZS4gVGhlIHJhbmdlIAorICAgICAqIG9mIHN1cHBvcnQgZm9yIHNjaGVtYXMgaXMgZGlyZWN0b3J5LXNwZWNpZmljLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2Ugc2NoZW1hIGlzIHRvIGJlIHJldHJpZXZlZAorICAgICAqIEByZXR1cm4gdGhlIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQ7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiBzY2hlbWEgbm90IHN1cHBvcnRlZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBEaXJDb250ZXh0IGdldFNjaGVtYShOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5nZXRTY2hlbWEocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2Ugc2NoZW1hIGlzIHRvIGJlIHJldHJpZXZlZAorICAgICAqIEByZXR1cm4gdGhlIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQ7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiBzY2hlbWEgbm90IHN1cHBvcnRlZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBEaXJDb250ZXh0IGdldFNjaGVtYShTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXJDb250ZXh0LmdldFNjaGVtYShwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGEgY29udGV4dCBjb250YWluaW5nIHRoZSBzY2hlbWEgb2JqZWN0cyBvZiB0aGUgbmFtZWQgCisgICAgICogb2JqZWN0J3MgY2xhc3MgZGVmaW5pdGlvbnMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB3aG9zZSBvYmplY3QgY2xhc3MgZGVmaW5pdGlvbiBpcyB0byAKKyAgICAgKiBiZSByZXRyaWV2ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBEaXJDb250ZXh0IGNvbnRhaW5pbmcgdGhlIG5hbWVkIG9iamVjdCdzIGNsYXNzIAorICAgICAqIGRlZmluaXRpb25zOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgc2NoZW1hIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyQ29udGV4dCBnZXRTY2hlbWFDbGFzc0RlZmluaXRpb24oTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRpckNvbnRleHQuZ2V0U2NoZW1hQ2xhc3NEZWZpbml0aW9uKHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgYSBjb250ZXh0IGNvbnRhaW5pbmcgdGhlIHNjaGVtYSBvYmplY3RzIG9mIHRoZSBuYW1lZCAKKyAgICAgKiBvYmplY3QncyBjbGFzcyBkZWZpbml0aW9ucy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIG9iamVjdCBjbGFzcyBkZWZpbml0aW9uIGlzIHRvIAorICAgICAqIGJlIHJldHJpZXZlZAorICAgICAqIEByZXR1cm4gdGhlIERpckNvbnRleHQgY29udGFpbmluZyB0aGUgbmFtZWQgb2JqZWN0J3MgY2xhc3MgCisgICAgICogZGVmaW5pdGlvbnM7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiBzY2hlbWEgbm90IHN1cHBvcnRlZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBEaXJDb250ZXh0IGdldFNjaGVtYUNsYXNzRGVmaW5pdGlvbihTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXJDb250ZXh0LmdldFNjaGVtYUNsYXNzRGVmaW5pdGlvbihwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgaW4gYSBzaW5nbGUgY29udGV4dCBmb3Igb2JqZWN0cyB0aGF0IGNvbnRhaW4gYSBzcGVjaWZpZWQgc2V0IAorICAgICAqIG9mIGF0dHJpYnV0ZXMsIGFuZCByZXRyaWV2ZXMgc2VsZWN0ZWQgYXR0cmlidXRlcy4gVGhlIHNlYXJjaCBpcyAKKyAgICAgKiBwZXJmb3JtZWQgdXNpbmcgdGhlIGRlZmF1bHQgU2VhcmNoQ29udHJvbHMgc2V0dGluZ3MuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIG1hdGNoaW5nQXR0cmlidXRlcyB0aGUgYXR0cmlidXRlcyB0byBzZWFyY2ggZm9yLiBJZiBlbXB0eSBvciAKKyAgICAgKiBudWxsLCBhbGwgb2JqZWN0cyBpbiB0aGUgdGFyZ2V0IGNvbnRleHQgYXJlIHJldHVybmVkLgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzVG9SZXR1cm4gdGhlIGF0dHJpYnV0ZXMgdG8gcmV0dXJuLiBudWxsIGluZGljYXRlcyAKKyAgICAgKiB0aGF0IGFsbCBhdHRyaWJ1dGVzIGFyZSB0byBiZSByZXR1cm5lZDsgYW4gZW1wdHkgYXJyYXkgaW5kaWNhdGVzIHRoYXQgCisgICAgICogbm9uZSBhcmUgdG8gYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiBhIG5vbi1udWxsIGVudW1lcmF0aW9uIG9mIFNlYXJjaFJlc3VsdCBvYmplY3RzLiBFYWNoIAorICAgICAqIFNlYXJjaFJlc3VsdCBjb250YWlucyB0aGUgYXR0cmlidXRlcyBpZGVudGlmaWVkIGJ5IGF0dHJpYnV0ZXNUb1JldHVybiAKKyAgICAgKiBhbmQgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0LCBuYW1lZCByZWxhdGl2ZSB0byB0aGUgCisgICAgICogY29udGV4dCBuYW1lZCBieSBuYW1lLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBzZWFyY2goTmFtZSBuYW1lLCBBdHRyaWJ1dGVzIG1hdGNoaW5nQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGF0dHJpYnV0ZXNUb1JldHVybikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXJDb250ZXh0LnNlYXJjaChwYXJzZU5hbWUobmFtZSksIG1hdGNoaW5nQXR0cmlidXRlcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9SZXR1cm4pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgaW4gYSBzaW5nbGUgY29udGV4dCBmb3Igb2JqZWN0cyB0aGF0IGNvbnRhaW4gYSBzcGVjaWZpZWQgc2V0IAorICAgICAqIG9mIGF0dHJpYnV0ZXMsIGFuZCByZXRyaWV2ZXMgc2VsZWN0ZWQgYXR0cmlidXRlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBzZWFyY2gKKyAgICAgKiBAcGFyYW0gbWF0Y2hpbmdBdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIHRvIHNlYXJjaCBmb3IuIElmIGVtcHR5IG9yIAorICAgICAqIG51bGwsIGFsbCBvYmplY3RzIGluIHRoZSB0YXJnZXQgY29udGV4dCBhcmUgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXNUb1JldHVybiB0aGUgYXR0cmlidXRlcyB0byByZXR1cm4uIG51bGwgaW5kaWNhdGVzIAorICAgICAqIHRoYXQgYWxsIGF0dHJpYnV0ZXMgYXJlIHRvIGJlIHJldHVybmVkOyBhbiBlbXB0eSBhcnJheSBpbmRpY2F0ZXMgdGhhdCAKKyAgICAgKiBub25lIGFyZSB0byBiZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0IG9iamVjdHMuIEVhY2ggCisgICAgICogU2VhcmNoUmVzdWx0IGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIGlkZW50aWZpZWQgYnkgYXR0cmlidXRlc1RvUmV0dXJuIAorICAgICAqIGFuZCB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QsIG5hbWVkIHJlbGF0aXZlIHRvIHRoZSAKKyAgICAgKiBjb250ZXh0IG5hbWVkIGJ5IG5hbWUuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBtYXRjaGluZ0F0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBhdHRyaWJ1dGVzVG9SZXR1cm4pCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5zZWFyY2gocGFyc2VOYW1lKG5hbWUpLCBtYXRjaGluZ0F0dHJpYnV0ZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1RvUmV0dXJuKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIGEgc2luZ2xlIGNvbnRleHQgZm9yIG9iamVjdHMgdGhhdCBjb250YWluIGEgc3BlY2lmaWVkIHNldCAKKyAgICAgKiBvZiBhdHRyaWJ1dGVzLiBUaGlzIG1ldGhvZCByZXR1cm5zIGFsbCB0aGUgYXR0cmlidXRlcyBvZiBzdWNoIG9iamVjdHMuIAorICAgICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8gc3VwcGx5aW5nIG51bGwgYXMgdGhlIGF0cmlidXRlc1RvUmV0dXJuIHBhcmFtZXRlciAKKyAgICAgKiB0byB0aGUgbWV0aG9kIHNlYXJjaChOYW1lLCBBdHRyaWJ1dGVzLCBTdHJpbmdbXSkuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIG1hdGNoaW5nQXR0cmlidXRlcyB0aGUgYXR0cmlidXRlcyB0byBzZWFyY2ggZm9yLiBJZiBlbXB0eSBvciAKKyAgICAgKiBudWxsLCBhbGwgb2JqZWN0cyBpbiB0aGUgdGFyZ2V0IGNvbnRleHQgYXJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBlbnVtZXJhdGlvbiBvZiBTZWFyY2hSZXN1bHQgb2JqZWN0cy4gRWFjaCAKKyAgICAgKiBTZWFyY2hSZXN1bHQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgaWRlbnRpZmllZCBieSBhdHRyaWJ1dGVzVG9SZXR1cm4gCisgICAgICogYW5kIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCwgbmFtZWQgcmVsYXRpdmUgdG8gdGhlIAorICAgICAqIGNvbnRleHQgbmFtZWQgYnkgbmFtZS4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoKE5hbWUgbmFtZSwgQXR0cmlidXRlcyBtYXRjaGluZ0F0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5zZWFyY2gocGFyc2VOYW1lKG5hbWUpLCBtYXRjaGluZ0F0dHJpYnV0ZXMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgaW4gYSBzaW5nbGUgY29udGV4dCBmb3Igb2JqZWN0cyB0aGF0IGNvbnRhaW4gYSBzcGVjaWZpZWQgc2V0IAorICAgICAqIG9mIGF0dHJpYnV0ZXMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIG1hdGNoaW5nQXR0cmlidXRlcyB0aGUgYXR0cmlidXRlcyB0byBzZWFyY2ggZm9yLiBJZiBlbXB0eSBvciAKKyAgICAgKiBudWxsLCBhbGwgb2JqZWN0cyBpbiB0aGUgdGFyZ2V0IGNvbnRleHQgYXJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBlbnVtZXJhdGlvbiBvZiBTZWFyY2hSZXN1bHQgb2JqZWN0cy4gRWFjaCAKKyAgICAgKiBTZWFyY2hSZXN1bHQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgaWRlbnRpZmllZCBieSBhdHRyaWJ1dGVzVG9SZXR1cm4gCisgICAgICogYW5kIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCwgbmFtZWQgcmVsYXRpdmUgdG8gdGhlIAorICAgICAqIGNvbnRleHQgbmFtZWQgYnkgbmFtZS4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIG1hdGNoaW5nQXR0cmlidXRlcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXJDb250ZXh0LnNlYXJjaChwYXJzZU5hbWUobmFtZSksIG1hdGNoaW5nQXR0cmlidXRlcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyBpbiB0aGUgbmFtZWQgY29udGV4dCBvciBvYmplY3QgZm9yIGVudHJpZXMgdGhhdCBzYXRpc2Z5IHRoZSAKKyAgICAgKiBnaXZlbiBzZWFyY2ggZmlsdGVyLiBQZXJmb3JtcyB0aGUgc2VhcmNoIGFzIHNwZWNpZmllZCBieSB0aGUgc2VhcmNoIAorICAgICAqIGNvbnRyb2xzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IG9yIG9iamVjdCB0byBzZWFyY2gKKyAgICAgKiBAcGFyYW0gZmlsdGVyIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbiB0byB1c2UgZm9yIHRoZSBzZWFyY2g7IG1heSBub3QgYmUgCisgICAgICogbnVsbAorICAgICAqIEBwYXJhbSBjb25zIHRoZSBzZWFyY2ggY29udHJvbHMgdGhhdCBjb250cm9sIHRoZSBzZWFyY2guIElmIG51bGwsIAorICAgICAqIHRoZSBkZWZhdWx0IHNlYXJjaCBjb250cm9scyBhcmUgdXNlZCAoZXF1aXZhbGVudCB0byAKKyAgICAgKiAobmV3IFNlYXJjaENvbnRyb2xzKCkpKS4KKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIFNlYXJjaFJlc3VsdHMgb2YgdGhlIG9iamVjdHMgdGhhdCBzYXRpc2Z5IAorICAgICAqIHRoZSBmaWx0ZXI7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hGaWx0ZXJFeGNlcHRpb24gaWYgdGhlIHNlYXJjaCBmaWx0ZXIgc3BlY2lmaWVkIAorICAgICAqIGlzIG5vdCBzdXBwb3J0ZWQgb3IgdW5kZXJzdG9vZCBieSB0aGUgdW5kZXJseWluZyBkaXJlY3RvcnkKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hDb250cm9sc0V4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGNvbnRyb2xzIAorICAgICAqIGNvbnRhaW4gaW52YWxpZCBzZXR0aW5ncworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBzZWFyY2goTmFtZSBuYW1lLCBTdHJpbmcgZmlsdGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaENvbnRyb2xzIGNvbnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5zZWFyY2gocGFyc2VOYW1lKG5hbWUpLCBmaWx0ZXIsIGNvbnMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgaW4gdGhlIG5hbWVkIGNvbnRleHQgb3Igb2JqZWN0IGZvciBlbnRyaWVzIHRoYXQgc2F0aXNmeSB0aGUgCisgICAgICogZ2l2ZW4gc2VhcmNoIGZpbHRlci4gUGVyZm9ybXMgdGhlIHNlYXJjaCBhcyBzcGVjaWZpZWQgYnkgdGhlIHNlYXJjaCAKKyAgICAgKiBjb250cm9scy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBvciBvYmplY3QgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIGZpbHRlciB0aGUgZmlsdGVyIGV4cHJlc3Npb24gdG8gdXNlIGZvciB0aGUgc2VhcmNoOyBtYXkgbm90IGJlIAorICAgICAqIG51bGwKKyAgICAgKiBAcGFyYW0gY29ucyB0aGUgc2VhcmNoIGNvbnRyb2xzIHRoYXQgY29udHJvbCB0aGUgc2VhcmNoLiBJZiBudWxsLCAKKyAgICAgKiB0aGUgZGVmYXVsdCBzZWFyY2ggY29udHJvbHMgYXJlIHVzZWQgKGVxdWl2YWxlbnQgdG8gCisgICAgICogKG5ldyBTZWFyY2hDb250cm9scygpKSkuCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiBTZWFyY2hSZXN1bHRzIG9mIHRoZSBvYmplY3RzIHRoYXQgc2F0aXNmeSAKKyAgICAgKiB0aGUgZmlsdGVyOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkU2VhcmNoRmlsdGVyRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggZmlsdGVyIAorICAgICAqIHNwZWNpZmllZCBpcyBub3Qgc3VwcG9ydGVkIG9yIHVuZGVyc3Rvb2QgYnkgdGhlIHVuZGVybHlpbmcgZGlyZWN0b3J5CisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkU2VhcmNoQ29udHJvbHNFeGNlcHRpb24gaWYgdGhlIHNlYXJjaCBjb250cm9scyAKKyAgICAgKiBjb250YWluIGludmFsaWQgc2V0dGluZ3MKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoKFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsdGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaENvbnRyb2xzIGNvbnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5zZWFyY2gocGFyc2VOYW1lKG5hbWUpLCBmaWx0ZXIsIGNvbnMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgaW4gdGhlIG5hbWVkIGNvbnRleHQgb3Igb2JqZWN0IGZvciBlbnRyaWVzIHRoYXQgc2F0aXNmeSB0aGUgCisgICAgICogZ2l2ZW4gc2VhcmNoIGZpbHRlci4gUGVyZm9ybXMgdGhlIHNlYXJjaCBhcyBzcGVjaWZpZWQgYnkgdGhlIHNlYXJjaCAKKyAgICAgKiBjb250cm9scy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBvciBvYmplY3QgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIGZpbHRlckV4cHIgdGhlIGZpbHRlciBleHByZXNzaW9uIHRvIHVzZSBmb3IgdGhlIHNlYXJjaC4gCisgICAgICogVGhlIGV4cHJlc3Npb24gbWF5IGNvbnRhaW4gdmFyaWFibGVzIG9mIHRoZSBmb3JtICJ7aX0iIHdoZXJlIGkgaXMgYSAKKyAgICAgKiBub25uZWdhdGl2ZSBpbnRlZ2VyLiBNYXkgbm90IGJlIG51bGwuCisgICAgICogQHBhcmFtIGZpbHRlckFyZ3MgdGhlIGFycmF5IG9mIGFyZ3VtZW50cyB0byBzdWJzdGl0dXRlIGZvciB0aGUgCisgICAgICogdmFyaWFibGVzIGluIGZpbHRlckV4cHIuIFRoZSB2YWx1ZSBvZiBmaWx0ZXJBcmdzW2ldIHdpbGwgcmVwbGFjZSBlYWNoIAorICAgICAqIG9jY3VycmVuY2Ugb2YgIntpfSIuIElmIG51bGwsIGVxdWl2YWxlbnQgdG8gYW4gZW1wdHkgYXJyYXkuCisgICAgICogQHBhcmFtIGNvbnMgdGhlIHNlYXJjaCBjb250cm9scyB0aGF0IGNvbnRyb2wgdGhlIHNlYXJjaC4gSWYgbnVsbCwgdGhlIAorICAgICAqIGRlZmF1bHQgc2VhcmNoIGNvbnRyb2xzIGFyZSB1c2VkIChlcXVpdmFsZW50IHRvIChuZXcgU2VhcmNoQ29udHJvbHMoKSkpLgorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0cyBvZiB0aGUgb2JqZWN0cyB0aGF0IHNhdGlzeSB0aGUgCisgICAgICogZmlsdGVyOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgZmlsdGVyRXhwciBjb250YWlucyB7aX0gCisgICAgICogZXhwcmVzc2lvbnMgd2hlcmUgaSBpcyBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlIGFycmF5IGZpbHRlckFyZ3MKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hDb250cm9sc0V4Y2VwdGlvbiBpZiBjb25zIGNvbnRhaW5zIGludmFsaWQgCisgICAgICogc2V0dGluZ3MKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hGaWx0ZXJFeGNlcHRpb24gaWYgZmlsdGVyRXhwciB3aXRoIGZpbHRlckFyZ3MgCisgICAgICogcmVwcmVzZW50cyBhbiBpbnZhbGlkIHNlYXJjaCBmaWx0ZXIKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoKE5hbWUgbmFtZSwgU3RyaW5nIGZpbHRlckV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBmaWx0ZXJBcmdzLCBTZWFyY2hDb250cm9scyBjb25zKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRpckNvbnRleHQuc2VhcmNoKHBhcnNlTmFtZShuYW1lKSwgZmlsdGVyRXhwciwgZmlsdGVyQXJncywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIHRoZSBuYW1lZCBjb250ZXh0IG9yIG9iamVjdCBmb3IgZW50cmllcyB0aGF0IHNhdGlzZnkgdGhlIAorICAgICAqIGdpdmVuIHNlYXJjaCBmaWx0ZXIuIFBlcmZvcm1zIHRoZSBzZWFyY2ggYXMgc3BlY2lmaWVkIGJ5IHRoZSBzZWFyY2ggCisgICAgICogY29udHJvbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgb3Igb2JqZWN0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBmaWx0ZXJFeHByIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbiB0byB1c2UgZm9yIHRoZSBzZWFyY2guIAorICAgICAqIFRoZSBleHByZXNzaW9uIG1heSBjb250YWluIHZhcmlhYmxlcyBvZiB0aGUgZm9ybSAie2l9IiB3aGVyZSBpIGlzIGEgCisgICAgICogbm9ubmVnYXRpdmUgaW50ZWdlci4gTWF5IG5vdCBiZSBudWxsLgorICAgICAqIEBwYXJhbSBmaWx0ZXJBcmdzIHRoZSBhcnJheSBvZiBhcmd1bWVudHMgdG8gc3Vic3RpdHV0ZSBmb3IgdGhlIAorICAgICAqIHZhcmlhYmxlcyBpbiBmaWx0ZXJFeHByLiBUaGUgdmFsdWUgb2YgZmlsdGVyQXJnc1tpXSB3aWxsIHJlcGxhY2UgZWFjaCAKKyAgICAgKiBvY2N1cnJlbmNlIG9mICJ7aX0iLiBJZiBudWxsLCBlcXVpdmFsZW50IHRvIGFuIGVtcHR5IGFycmF5LgorICAgICAqIEBwYXJhbSBjb25zIHRoZSBzZWFyY2ggY29udHJvbHMgdGhhdCBjb250cm9sIHRoZSBzZWFyY2guIElmIG51bGwsIHRoZSAKKyAgICAgKiBkZWZhdWx0IHNlYXJjaCBjb250cm9scyBhcmUgdXNlZCAoZXF1aXZhbGVudCB0byAobmV3IFNlYXJjaENvbnRyb2xzKCkpKS4KKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIFNlYXJjaFJlc3VsdHMgb2YgdGhlIG9iamVjdHMgdGhhdCBzYXRpc3kgdGhlIAorICAgICAqIGZpbHRlcjsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGZpbHRlckV4cHIgY29udGFpbnMge2l9IAorICAgICAqIGV4cHJlc3Npb25zIHdoZXJlIGkgaXMgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSBhcnJheSBmaWx0ZXJBcmdzCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkU2VhcmNoQ29udHJvbHNFeGNlcHRpb24gaWYgY29ucyBjb250YWlucyBpbnZhbGlkIAorICAgICAqIHNldHRpbmdzCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkU2VhcmNoRmlsdGVyRXhjZXB0aW9uIGlmIGZpbHRlckV4cHIgd2l0aCBmaWx0ZXJBcmdzIAorICAgICAqIHJlcHJlc2VudHMgYW4gaW52YWxpZCBzZWFyY2ggZmlsdGVyCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbHRlckV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBmaWx0ZXJBcmdzLCBTZWFyY2hDb250cm9scyBjb25zKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRpckNvbnRleHQuc2VhcmNoKHBhcnNlTmFtZShuYW1lKSwgZmlsdGVyRXhwciwgZmlsdGVyQXJncywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdCBhcyBhIGNhY2hlIGVudHJ5LCB3aXRob3V0IGFueSBleGNlcHRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgY2FjaGUgZW50cnkgYm91bmQgdG8gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBDYWNoZUVudHJ5IGxvb2t1cENhY2hlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIENhY2hlRW50cnkgZW50cnkgPSBjYWNoZUxvb2t1cChuYW1lKTsKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIGVudHJ5ID0gbmV3IENhY2hlRW50cnkoKTsKKyAgICAgICAgICAgIGVudHJ5Lm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gZGlyQ29udGV4dC5sb29rdXAocGFyc2VOYW1lKG5hbWUpKTsKKyAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW5wdXRTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkucmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UoKElucHV0U3RyZWFtKSBvYmplY3QpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGlyQ29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICBlbnRyeS5jb250ZXh0ID0gKERpckNvbnRleHQpIG9iamVjdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJlc291cmNlID0gKFJlc291cmNlKSBvYmplY3Q7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkucmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAob2JqZWN0LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBkaXJDb250ZXh0LmdldEF0dHJpYnV0ZXMocGFyc2VOYW1lKG5hbWUpKTsKKyAgICAgICAgICAgICAgICBpZiAoIShhdHRyaWJ1dGVzIGluc3RhbmNlb2YgUmVzb3VyY2VBdHRyaWJ1dGVzKSkgeworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IFJlc291cmNlQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW50cnkuYXR0cmlidXRlcyA9IChSZXNvdXJjZUF0dHJpYnV0ZXMpIGF0dHJpYnV0ZXM7CisgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGVudHJ5LmV4aXN0cyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYSBuYW1lLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHBhcnNlZCBuYW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXJzZU5hbWUoU3RyaW5nIG5hbWUpIAorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYSBuYW1lLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHBhcnNlZCBuYW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIE5hbWUgcGFyc2VOYW1lKE5hbWUgbmFtZSkgCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExvb2t1cCBpbiBjYWNoZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2FjaGVFbnRyeSBjYWNoZUxvb2t1cChTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICBuYW1lID0gIiI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9uQ2FjaGVhYmxlLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKG5vbkNhY2hlYWJsZVtpXSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIENhY2hlRW50cnkgY2FjaGVFbnRyeSA9IGNhY2hlLmxvb2t1cChuYW1lKTsKKyAgICAgICAgaWYgKGNhY2hlRW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgY2FjaGVFbnRyeSA9IG5ldyBDYWNoZUVudHJ5KCk7CisgICAgICAgICAgICBjYWNoZUVudHJ5Lm5hbWUgPSBuYW1lOworICAgICAgICAgICAgLy8gTG9hZCBlbnRyeQorICAgICAgICAgICAgY2FjaGVMb2FkKGNhY2hlRW50cnkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZShjYWNoZUVudHJ5KSkgeworICAgICAgICAgICAgICAgIGlmICghcmV2YWxpZGF0ZShjYWNoZUVudHJ5KSkgeworICAgICAgICAgICAgICAgICAgICBjYWNoZVVubG9hZChjYWNoZUVudHJ5Lm5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlRW50cnkudGltZXN0YW1wID0gCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIGNhY2hlVFRMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhY2hlRW50cnkuYWNjZXNzQ291bnQrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGNhY2hlRW50cnkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgZW50cnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoQ2FjaGVFbnRyeSBlbnRyeSkgeworICAgICAgICBpZiAoKCghZW50cnkuZXhpc3RzKQorICAgICAgICAgICAgIHx8IChlbnRyeS5jb250ZXh0ICE9IG51bGwpCisgICAgICAgICAgICAgfHwgKChlbnRyeS5yZXNvdXJjZSAhPSBudWxsKSAKKyAgICAgICAgICAgICAgICAgJiYgKGVudHJ5LnJlc291cmNlLmdldENvbnRlbnQoKSAhPSBudWxsKSkpCisgICAgICAgICAgICAmJiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBlbnRyeS50aW1lc3RhbXApKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXZhbGlkYXRlIGVudHJ5LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHJldmFsaWRhdGUoQ2FjaGVFbnRyeSBlbnRyeSkgeworICAgICAgICAvLyBHZXQgdGhlIGF0dHJpYnV0ZXMgYXQgdGhlIGdpdmVuIHBhdGgsIGFuZCBjaGVjayB0aGUgbGFzdCAKKyAgICAgICAgLy8gbW9kaWZpY2F0aW9uIGRhdGUKKyAgICAgICAgaWYgKCFlbnRyeS5leGlzdHMpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChlbnRyeS5hdHRyaWJ1dGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gZW50cnkuYXR0cmlidXRlcy5nZXRMYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgbG9uZyBjb250ZW50TGVuZ3RoID0gZW50cnkuYXR0cmlidXRlcy5nZXRDb250ZW50TGVuZ3RoKCk7CisgICAgICAgIGlmIChsYXN0TW9kaWZpZWQgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgdGVtcEF0dHJpYnV0ZXMgPSBkaXJDb250ZXh0LmdldEF0dHJpYnV0ZXMoZW50cnkubmFtZSk7CisgICAgICAgICAgICBSZXNvdXJjZUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG51bGw7CisgICAgICAgICAgICBpZiAoISh0ZW1wQXR0cmlidXRlcyBpbnN0YW5jZW9mIFJlc291cmNlQXR0cmlidXRlcykpIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IFJlc291cmNlQXR0cmlidXRlcyh0ZW1wQXR0cmlidXRlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSAoUmVzb3VyY2VBdHRyaWJ1dGVzKSB0ZW1wQXR0cmlidXRlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkMiA9IGF0dHJpYnV0ZXMuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICBsb25nIGNvbnRlbnRMZW5ndGgyID0gYXR0cmlidXRlcy5nZXRDb250ZW50TGVuZ3RoKCk7CisgICAgICAgICAgICByZXR1cm4gKGxhc3RNb2RpZmllZCA9PSBsYXN0TW9kaWZpZWQyKSAKKyAgICAgICAgICAgICAgICAmJiAoY29udGVudExlbmd0aCA9PSBjb250ZW50TGVuZ3RoMik7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExvYWQgZW50cnkgaW50byBjYWNoZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjYWNoZUxvYWQoQ2FjaGVFbnRyeSBlbnRyeSkgeworCisgICAgICAgIFN0cmluZyBuYW1lID0gZW50cnkubmFtZTsKKworICAgICAgICAvLyBSZXRyaWV2ZSBtaXNzaW5nIGluZm8KKyAgICAgICAgYm9vbGVhbiBleGlzdHMgPSB0cnVlOworCisgICAgICAgIC8vIFJldHJpZXZpbmcgYXR0cmlidXRlcworICAgICAgICBpZiAoZW50cnkuYXR0cmlidXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGRpckNvbnRleHQuZ2V0QXR0cmlidXRlcyhlbnRyeS5uYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoIShhdHRyaWJ1dGVzIGluc3RhbmNlb2YgUmVzb3VyY2VBdHRyaWJ1dGVzKSkgeworICAgICAgICAgICAgICAgICAgICBlbnRyeS5hdHRyaWJ1dGVzID0gCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVzb3VyY2VBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmF0dHJpYnV0ZXMgPSAoUmVzb3VyY2VBdHRyaWJ1dGVzKSBhdHRyaWJ1dGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXhpc3RzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXRyaXZpbmcgb2JqZWN0CisgICAgICAgIGlmICgoZXhpc3RzKSAmJiAoZW50cnkucmVzb3VyY2UgPT0gbnVsbCkgJiYgKGVudHJ5LmNvbnRleHQgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGRpckNvbnRleHQubG9va3VwKG5hbWUpOworICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnB1dFN0cmVhbSkgeworICAgICAgICAgICAgICAgICAgICBlbnRyeS5yZXNvdXJjZSA9IG5ldyBSZXNvdXJjZSgoSW5wdXRTdHJlYW0pIG9iamVjdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEaXJDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmNvbnRleHQgPSAoRGlyQ29udGV4dCkgb2JqZWN0OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkucmVzb3VyY2UgPSAoUmVzb3VyY2UpIG9iamVjdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlbnRyeS5yZXNvdXJjZSA9IG5ldyBSZXNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3QudG9TdHJpbmcoKS5nZXRCeXRlcygpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBleGlzdHMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIExvYWQgb2JqZWN0IGNvbnRlbnQKKyAgICAgICAgaWYgKChleGlzdHMpICYmIChlbnRyeS5yZXNvdXJjZSAhPSBudWxsKSAKKyAgICAgICAgICAgICYmIChlbnRyeS5yZXNvdXJjZS5nZXRDb250ZW50KCkgPT0gbnVsbCkgCisgICAgICAgICAgICAmJiAoZW50cnkuYXR0cmlidXRlcy5nZXRDb250ZW50TGVuZ3RoKCkgPj0gMCkKKyAgICAgICAgICAgICYmIChlbnRyeS5hdHRyaWJ1dGVzLmdldENvbnRlbnRMZW5ndGgoKSA8IAorICAgICAgICAgICAgICAgIChjYWNoZU9iamVjdE1heFNpemUgKiAxMDI0KSkpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAoaW50KSBlbnRyeS5hdHRyaWJ1dGVzLmdldENvbnRlbnRMZW5ndGgoKTsKKyAgICAgICAgICAgIC8vIFRoZSBlbnRyeSBzaXplIGlzIDEgKyB0aGUgcmVzb3VyY2Ugc2l6ZSBpbiBLQiwgaWYgaXQgd2lsbCBiZSAKKyAgICAgICAgICAgIC8vIGNhY2hlZAorICAgICAgICAgICAgZW50cnkuc2l6ZSArPSAoZW50cnkuYXR0cmlidXRlcy5nZXRDb250ZW50TGVuZ3RoKCkgLyAxMDI0KTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaXMgPSBlbnRyeS5yZXNvdXJjZS5zdHJlYW1Db250ZW50KCk7CisgICAgICAgICAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG4gPSBpcy5yZWFkKGIsIHBvcywgbGVuZ3RoIC0gcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIHBvcyA9IHBvcyArIG47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVudHJ5LnJlc291cmNlLnNldENvbnRlbnQoYik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgOyAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgOyAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgZXhpc3RlbmNlIGZsYWcKKyAgICAgICAgZW50cnkuZXhpc3RzID0gZXhpc3RzOworCisgICAgICAgIC8vIFNldCB0aW1lc3RhbXAKKyAgICAgICAgZW50cnkudGltZXN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBjYWNoZVRUTDsKKworICAgICAgICAvLyBBZGQgbmV3IGVudHJ5IHRvIGNhY2hlCisgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGUpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIGNhY2hlIHNpemUsIGFuZCByZW1vdmUgZWxlbWVudHMgaWYgdG9vIGJpZworICAgICAgICAgICAgaWYgKChjYWNoZS5sb29rdXAobmFtZSkgPT0gbnVsbCkgJiYgY2FjaGUuYWxsb2NhdGUoZW50cnkuc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBjYWNoZS5sb2FkKGVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgZW50cnkgZnJvbSBjYWNoZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWNoZVVubG9hZChTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgc3luY2hyb25pemVkIChjYWNoZSkgeworICAgICAgICAgICAgcmV0dXJuIGNhY2hlLnVubG9hZChuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1JlY3ljbGFibGVOYW1pbmdFbnVtZXJhdGlvbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvUmVjeWNsYWJsZU5hbWluZ0VudW1lcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZkMzFjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1JlY3ljbGFibGVOYW1pbmdFbnVtZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworCisvKioKKyAqIE5hbWluZyBlbnVtZXJhdGlvbiBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZWN5Y2xhYmxlTmFtaW5nRW51bWVyYXRpb24gCisgICAgaW1wbGVtZW50cyBOYW1pbmdFbnVtZXJhdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICBwdWJsaWMgUmVjeWNsYWJsZU5hbWluZ0VudW1lcmF0aW9uKFZlY3RvciBlbnRyaWVzKSB7CisgICAgICAgIHRoaXMuZW50cmllcyA9IGVudHJpZXM7CisgICAgICAgIHJlY3ljbGUoKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBFbnRyaWVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgZW50cmllczsKKworCisgICAgLyoqCisgICAgICogVW5kZXJseWluZyBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRW51bWVyYXRpb24gZW51bWVyYXRpb247CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgZW51bWVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBuZXh0KCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXh0RWxlbWVudCgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgbW9yZSBlbGVtZW50cyBpbiB0aGUgZW51bWVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZSgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhpcyBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgeworICAgICAgICByZXR1cm4gZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgeworICAgICAgICByZXR1cm4gZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZWN5Y2xlLgorICAgICAqLworICAgIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAJZW51bWVyYXRpb24gPSBlbnRyaWVzLmVsZW1lbnRzKCk7CisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvUmVzb3VyY2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjNDRkYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBFbmNhcHN1bHRlcyB0aGUgY29udGVudHMgb2YgYSByZXNvdXJjZS4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cmVtbUBhcGFjaGUub3JnIj5SZW15IE1hdWNoZXJhdDwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlIHsKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKyAgICAKKyAgICAKKyAgICBwdWJsaWMgUmVzb3VyY2UoKSB7CisgICAgfQorICAgIAorICAgIAorICAgIHB1YmxpYyBSZXNvdXJjZShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgeworICAgICAgICBzZXRDb250ZW50KGlucHV0U3RyZWFtKTsKKyAgICB9CisgICAgCisgICAgCisgICAgcHVibGljIFJlc291cmNlKGJ5dGVbXSBiaW5hcnlDb250ZW50KSB7CisgICAgICAgIHNldENvbnRlbnQoYmluYXJ5Q29udGVudCk7CisgICAgfQorICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEJpbmFyeSBjb250ZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBieXRlW10gYmluYXJ5Q29udGVudCA9IG51bGw7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogSW5wdXQgc3RyZWFtLgorICAgICAqLworICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQ29udGVudCBhY2Nlc3Nvci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIElucHV0U3RyZWFtCisgICAgICovCisgICAgcHVibGljIElucHV0U3RyZWFtIHN0cmVhbUNvbnRlbnQoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoYmluYXJ5Q29udGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJpbmFyeUNvbnRlbnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnB1dFN0cmVhbTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQ29udGVudCBhY2Nlc3Nvci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGJpbmFyeSBjb250ZW50CisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRDb250ZW50KCkgeworICAgICAgICByZXR1cm4gYmluYXJ5Q29udGVudDsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQ29udGVudCBtdXRhdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbSBOZXcgaW5wdXQgc3RyZWFtCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgeworICAgICAgICB0aGlzLmlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENvbnRlbnQgbXV0YXRvci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYmluYXJ5Q29udGVudCBOZXcgYmluIGNvbnRlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBiaW5hcnlDb250ZW50KSB7CisgICAgICAgIHRoaXMuYmluYXJ5Q29udGVudCA9IGJpbmFyeUNvbnRlbnQ7CisgICAgfQorICAgIAorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvUmVzb3VyY2VBdHRyaWJ1dGVzLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9SZXNvdXJjZUF0dHJpYnV0ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWJmM2U0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvUmVzb3VyY2VBdHRyaWJ1dGVzLmphdmEKQEAgLTAsMCArMSw5MTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuQXR0cmlidXRlczsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkJhc2ljQXR0cmlidXRlOworCisvKioKKyAqIEF0dHJpYnV0ZXMgaW1wbGVtZW50YXRpb24uCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnJlbW1AYXBhY2hlLm9yZyI+UmVteSBNYXVjaGVyYXQ8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUF0dHJpYnV0ZXMgaW1wbGVtZW50cyBBdHRyaWJ1dGVzIHsKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKyAgICAKKyAgICAKKyAgICAvLyBEZWZhdWx0IGF0dHJpYnV0ZSBuYW1lcworICAgIAorICAgIC8qKgorICAgICAqIENyZWF0aW9uIGRhdGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRJT05fREFURSA9ICJjcmVhdGlvbmRhdGUiOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0aW9uIGRhdGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRFX0NSRUFUSU9OX0RBVEUgPSAiY3JlYXRpb24tZGF0ZSI7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogTGFzdCBtb2RpZmljYXRpb24gZGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX01PRElGSUVEID0gImdldGxhc3Rtb2RpZmllZCI7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogTGFzdCBtb2RpZmljYXRpb24gZGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRFUk5BVEVfTEFTVF9NT0RJRklFRCA9ICJsYXN0LW1vZGlmaWVkIjsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBOYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiZGlzcGxheW5hbWUiOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJyZXNvdXJjZXR5cGUiOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRFX1RZUEUgPSAiY29udGVudC10eXBlIjsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFID0gInNvdXJjZSI7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogTUlNRSB0eXBlIG9mIHRoZSBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9ICJnZXRjb250ZW50dHlwZSI7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQ29udGVudCBsYW5ndWFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0xBTkdVQUdFID0gImdldGNvbnRlbnRsYW5ndWFnZSI7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQ29udGVudCBsZW5ndGguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9MRU5HVEggPSAiZ2V0Y29udGVudGxlbmd0aCI7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQ29udGVudCBsZW5ndGguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRFX0NPTlRFTlRfTEVOR1RIID0gImNvbnRlbnQtbGVuZ3RoIjsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBFVGFnLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVUQUcgPSAiZ2V0ZXRhZyI7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQ29sbGVjdGlvbiB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTExFQ1RJT05fVFlQRSA9ICI8Y29sbGVjdGlvbi8+IjsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBIVFRQIGRhdGUgZm9ybWF0LgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXQgPQorICAgICAgICBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFLCBkZCBNTU0geXl5eSBISDptbTpzcyB6enoiLCBMb2NhbGUuVVMpOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIERhdGUgZm9ybWF0cyB1c2luZyBmb3IgRGF0ZSBwYXJzaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXRzW10gPSB7CisgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJFRUUsIGRkIE1NTSB5eXl5IEhIOm1tOnNzIHp6eiIsIExvY2FsZS5VUyksCisgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJFRUVFRUUsIGRkLU1NTS15eSBISDptbTpzcyB6enoiLCBMb2NhbGUuVVMpLAorICAgICAgICBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFIE1NTU0gZCBISDptbTpzcyB5eXl5IiwgTG9jYWxlLlVTKQorICAgIH07CisgICAgCisgICAgCisgICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBUaW1lWm9uZSBnbXRab25lID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpOworCisKKyAgICAvKioKKyAgICAgKiBHTVQgdGltZXpvbmUgLSBhbGwgSFRUUCBkYXRlcyBhcmUgb24gR01UCisgICAgICovCisgICAgc3RhdGljIHsKKworICAgICAgICBmb3JtYXQuc2V0VGltZVpvbmUoZ210Wm9uZSk7CisKKyAgICAgICAgZm9ybWF0c1swXS5zZXRUaW1lWm9uZShnbXRab25lKTsKKyAgICAgICAgZm9ybWF0c1sxXS5zZXRUaW1lWm9uZShnbXRab25lKTsKKyAgICAgICAgZm9ybWF0c1syXS5zZXRUaW1lWm9uZShnbXRab25lKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VBdHRyaWJ1dGVzKCkgeworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBNZXJnZXMgd2l0aCBhbm90aGVyIGF0dHJpYnV0ZSBzZXQuCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlQXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKyAgICB9CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIENvbGxlY3Rpb24gZmxhZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb2xsZWN0aW9uID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIENvbnRlbnQgbGVuZ3RoLgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGNvbnRlbnRMZW5ndGggPSAtMTsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRpb24gdGltZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBjcmVhdGlvbiA9IC0xOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGlvbiBkYXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBEYXRlIGNyZWF0aW9uRGF0ZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIExhc3QgbW9kaWZpZWQgdGltZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBsYXN0TW9kaWZpZWQgPSAtMTsKKworCisgICAgLyoqCisgICAgICogTGFzdCBtb2RpZmllZCBkYXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBEYXRlIGxhc3RNb2RpZmllZERhdGUgPSBudWxsOworCisgICAgCisgICAgLyoqCisgICAgICogTGFzdCBtb2RpZmllZCBkYXRlIGluIEhUVFAgZm9ybWF0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbGFzdE1vZGlmaWVkSHR0cCA9IG51bGw7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBNSU1FIHR5cGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBtaW1lVHlwZSA9IG51bGw7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBOYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFdlYWsgRVRhZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHdlYWtFVGFnID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogU3Ryb25nIEVUYWcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzdHJvbmdFVGFnID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRXh0ZXJuYWwgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIElzIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb2xsZWN0aW9uKCkgeworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKGdldFJlc291cmNlVHlwZSgpLmVxdWFscyhDT0xMRUNUSU9OX1RZUEUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoY29sbGVjdGlvbik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogU2V0IGNvbGxlY3Rpb24gZmxhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIE5ldyBmbGFnIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29sbGVjdGlvbihib29sZWFuIGNvbGxlY3Rpb24pIHsKKyAgICAgICAgdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gIiI7CisgICAgICAgICAgICBpZiAoY29sbGVjdGlvbikKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IENPTExFQ1RJT05fVFlQRTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KFRZUEUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgY29udGVudCBsZW5ndGguCisgICAgICogCisgICAgICogQHJldHVybiBjb250ZW50IGxlbmd0aCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB7CisgICAgICAgIGlmIChjb250ZW50TGVuZ3RoICE9IC0xTCkKKyAgICAgICAgICAgIHJldHVybiBjb250ZW50TGVuZ3RoOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXQoQ09OVEVOVF9MRU5HVEgpOworICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gYXR0cmlidXRlLmdldCgpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50TGVuZ3RoID0gKChMb25nKSB2YWx1ZSkubG9uZ1ZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSBMb25nLnBhcnNlTG9uZyh2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIDsgLy8gTm8gdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbnRlbnRMZW5ndGg7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFNldCBjb250ZW50IGxlbmd0aC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCBOZXcgY29udGVudCBsZW5ndGggdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TGVuZ3RoKGxvbmcgY29udGVudExlbmd0aCkgeworICAgICAgICB0aGlzLmNvbnRlbnRMZW5ndGggPSBjb250ZW50TGVuZ3RoOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKQorICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoQ09OVEVOVF9MRU5HVEgsIG5ldyBMb25nKGNvbnRlbnRMZW5ndGgpKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogR2V0IGNyZWF0aW9uIHRpbWUuCisgICAgICogCisgICAgICogQHJldHVybiBjcmVhdGlvbiB0aW1lIHZhbHVlCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q3JlYXRpb24oKSB7CisgICAgICAgIGlmIChjcmVhdGlvbiAhPSAtMUwpCisgICAgICAgICAgICByZXR1cm4gY3JlYXRpb247CisgICAgICAgIGlmIChjcmVhdGlvbkRhdGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGlvbkRhdGUuZ2V0VGltZSgpOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXQoQ1JFQVRJT05fREFURSk7CisgICAgICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBhdHRyaWJ1dGUuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uID0gKChMb25nKSB2YWx1ZSkubG9uZ1ZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbiA9ICgoRGF0ZSkgdmFsdWUpLmdldFRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uRGF0ZSA9IChEYXRlKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjcmVhdGlvbkRhdGVWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBEYXRlIHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXJzaW5nIHRoZSBIVFRQIERhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAocmVzdWx0ID09IG51bGwpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgPCBmb3JtYXRzLmxlbmd0aCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdHNbaV0ucGFyc2UoY3JlYXRpb25EYXRlVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uID0gcmVzdWx0LmdldFRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbkRhdGUgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICA7IC8vIE5vIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjcmVhdGlvbjsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogU2V0IGNyZWF0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjcmVhdGlvbiBOZXcgY3JlYXRpb24gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbihsb25nIGNyZWF0aW9uKSB7CisgICAgICAgIHRoaXMuY3JlYXRpb24gPSBjcmVhdGlvbjsKKyAgICAgICAgdGhpcy5jcmVhdGlvbkRhdGUgPSBudWxsOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKQorICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoQ1JFQVRJT05fREFURSwgbmV3IERhdGUoY3JlYXRpb24pKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogR2V0IGNyZWF0aW9uIGRhdGUuCisgICAgICogCisgICAgICogQHJldHVybiBDcmVhdGlvbiBkYXRlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIERhdGUgZ2V0Q3JlYXRpb25EYXRlKCkgeworICAgICAgICBpZiAoY3JlYXRpb25EYXRlICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gY3JlYXRpb25EYXRlOworICAgICAgICBpZiAoY3JlYXRpb24gIT0gLTFMKSB7CisgICAgICAgICAgICBjcmVhdGlvbkRhdGUgPSBuZXcgRGF0ZShjcmVhdGlvbik7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRpb25EYXRlOworICAgICAgICB9CisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldChDUkVBVElPTl9EQVRFKTsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGF0dHJpYnV0ZS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9uZykgeworICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb24gPSAoKExvbmcpIHZhbHVlKS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uRGF0ZSA9IG5ldyBEYXRlKGNyZWF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uID0gKChEYXRlKSB2YWx1ZSkuZ2V0VGltZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb25EYXRlID0gKERhdGUpIHZhbHVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNyZWF0aW9uRGF0ZVZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGUgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcnNpbmcgdGhlIEhUVFAgRGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IChyZXN1bHQgPT0gbnVsbCkgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSA8IGZvcm1hdHMubGVuZ3RoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0c1tpXS5wYXJzZShjcmVhdGlvbkRhdGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb24gPSByZXN1bHQuZ2V0VGltZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uRGF0ZSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIDsgLy8gTm8gdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNyZWF0aW9uRGF0ZTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRpb24gZGF0ZSBtdXRhdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjcmVhdGlvbkRhdGUgTmV3IGNyZWF0aW9uIGRhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbkRhdGUoRGF0ZSBjcmVhdGlvbkRhdGUpIHsKKyAgICAgICAgdGhpcy5jcmVhdGlvbiA9IGNyZWF0aW9uRGF0ZS5nZXRUaW1lKCk7CisgICAgICAgIHRoaXMuY3JlYXRpb25EYXRlID0gY3JlYXRpb25EYXRlOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKQorICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoQ1JFQVRJT05fREFURSwgY3JlYXRpb25EYXRlKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogR2V0IGxhc3QgbW9kaWZpZWQgdGltZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGxhc3RNb2RpZmllZCB0aW1lIHZhbHVlCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgeworICAgICAgICBpZiAobGFzdE1vZGlmaWVkICE9IC0xTCkKKyAgICAgICAgICAgIHJldHVybiBsYXN0TW9kaWZpZWQ7CisgICAgICAgIGlmIChsYXN0TW9kaWZpZWREYXRlICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbGFzdE1vZGlmaWVkRGF0ZS5nZXRUaW1lKCk7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldChMQVNUX01PRElGSUVEKTsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGF0dHJpYnV0ZS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9uZykgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkID0gKChMb25nKSB2YWx1ZSkubG9uZ1ZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQgPSAoKERhdGUpIHZhbHVlKS5nZXRUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWREYXRlID0gKERhdGUpIHZhbHVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhc3RNb2RpZmllZERhdGVWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBEYXRlIHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXJzaW5nIHRoZSBIVFRQIERhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAocmVzdWx0ID09IG51bGwpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgPCBmb3JtYXRzLmxlbmd0aCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0c1tpXS5wYXJzZShsYXN0TW9kaWZpZWREYXRlVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9IHJlc3VsdC5nZXRUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkRGF0ZSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIDsgLy8gTm8gdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhc3RNb2RpZmllZDsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogU2V0IGxhc3QgbW9kaWZpZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGxhc3RNb2RpZmllZCBOZXcgbGFzdCBtb2RpZmllZCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZChsb25nIGxhc3RNb2RpZmllZCkgeworICAgICAgICB0aGlzLmxhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDsKKyAgICAgICAgdGhpcy5sYXN0TW9kaWZpZWREYXRlID0gbnVsbDsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KExBU1RfTU9ESUZJRUQsIG5ldyBEYXRlKGxhc3RNb2RpZmllZCkpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgbGFzdCBtb2RpZmllZCBkYXRlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBsYXN0TW9kaWZpZWQgTmV3IGxhc3QgbW9kaWZpZWQgZGF0ZSB2YWx1ZQorICAgICAqIEBkZXByZWNhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkKERhdGUgbGFzdE1vZGlmaWVkKSB7CisgICAgICAgIHNldExhc3RNb2RpZmllZERhdGUobGFzdE1vZGlmaWVkKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCBsYXN0TW9kaWZpZWQgZGF0ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIExhc3RNb2RpZmllZCBkYXRlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIERhdGUgZ2V0TGFzdE1vZGlmaWVkRGF0ZSgpIHsKKyAgICAgICAgaWYgKGxhc3RNb2RpZmllZERhdGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBsYXN0TW9kaWZpZWREYXRlOworICAgICAgICBpZiAobGFzdE1vZGlmaWVkICE9IC0xTCkgeworICAgICAgICAgICAgbGFzdE1vZGlmaWVkRGF0ZSA9IG5ldyBEYXRlKGxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICByZXR1cm4gbGFzdE1vZGlmaWVkRGF0ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXQoTEFTVF9NT0RJRklFRCk7CisgICAgICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBhdHRyaWJ1dGUuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9ICgoTG9uZykgdmFsdWUpLmxvbmdWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkRGF0ZSA9IG5ldyBEYXRlKGxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQgPSAoKERhdGUpIHZhbHVlKS5nZXRUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWREYXRlID0gKERhdGUpIHZhbHVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhc3RNb2RpZmllZERhdGVWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBEYXRlIHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXJzaW5nIHRoZSBIVFRQIERhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAocmVzdWx0ID09IG51bGwpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgPCBmb3JtYXRzLmxlbmd0aCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0c1tpXS5wYXJzZShsYXN0TW9kaWZpZWREYXRlVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9IHJlc3VsdC5nZXRUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkRGF0ZSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIDsgLy8gTm8gdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhc3RNb2RpZmllZERhdGU7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIExhc3QgbW9kaWZpZWQgZGF0ZSBtdXRhdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSBsYXN0TW9kaWZpZWREYXRlIE5ldyBsYXN0IG1vZGlmaWVkIGRhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TW9kaWZpZWREYXRlKERhdGUgbGFzdE1vZGlmaWVkRGF0ZSkgeworICAgICAgICB0aGlzLmxhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZERhdGUuZ2V0VGltZSgpOworICAgICAgICB0aGlzLmxhc3RNb2RpZmllZERhdGUgPSBsYXN0TW9kaWZpZWREYXRlOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKQorICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoTEFTVF9NT0RJRklFRCwgbGFzdE1vZGlmaWVkRGF0ZSk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGFzdE1vZGlmaWVkSHR0cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExhc3RNb2RpZmllZEh0dHAoKSB7CisgICAgICAgIGlmIChsYXN0TW9kaWZpZWRIdHRwICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbGFzdE1vZGlmaWVkSHR0cDsKKyAgICAgICAgRGF0ZSBtb2RpZmllZERhdGUgPSBnZXRMYXN0TW9kaWZpZWREYXRlKCk7CisgICAgICAgIGlmIChtb2RpZmllZERhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgbW9kaWZpZWREYXRlID0gZ2V0Q3JlYXRpb25EYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vZGlmaWVkRGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtb2RpZmllZERhdGUgPSBuZXcgRGF0ZSgpOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAoZm9ybWF0KSB7CisgICAgICAgICAgICBsYXN0TW9kaWZpZWRIdHRwID0gZm9ybWF0LmZvcm1hdChtb2RpZmllZERhdGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsYXN0TW9kaWZpZWRIdHRwOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbGFzdE1vZGlmaWVkSHR0cCBUaGUgbGFzdE1vZGlmaWVkSHR0cCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkSHR0cChTdHJpbmcgbGFzdE1vZGlmaWVkSHR0cCkgeworICAgICAgICB0aGlzLmxhc3RNb2RpZmllZEh0dHAgPSBsYXN0TW9kaWZpZWRIdHRwOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1pbWVUeXBlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBtaW1lVHlwZTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBtaW1lVHlwZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIHRoaXMubWltZVR5cGUgPSBtaW1lVHlwZTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIE5hbWUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIGlmIChuYW1lICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KE5BTUUpOworICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGF0dHJpYnV0ZS5nZXQoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIDsgLy8gTm8gdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOZXcgbmFtZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KE5BTUUsIG5hbWUpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgcmVzb3VyY2UgdHlwZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFN0cmluZyByZXNvdXJjZSB0eXBlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKSB7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXQoVFlQRSk7CisgICAgICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhdHRyaWJ1dGUuZ2V0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICA7IC8vIE5vIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb24pCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQ09MTEVDVElPTl9UWVBFOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICIiOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFR5cGUgbXV0YXRvci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIE5ldyByZXNvdXJjZSB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VUeXBlKFN0cmluZyByZXNvdXJjZVR5cGUpIHsKKyAgICAgICAgY29sbGVjdGlvbiA9IHJlc291cmNlVHlwZS5lcXVhbHMoQ09MTEVDVElPTl9UWVBFKTsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KFRZUEUsIHJlc291cmNlVHlwZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgRVRhZy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFdlYWsgRVRhZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RVRhZygpIHsKKyAgICAgICAgcmV0dXJuIGdldEVUYWcoZmFsc2UpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IEVUYWcuCisgICAgICogCisgICAgICogQHBhcmFtIHN0cm9uZyBJZiB0cnVlLCB0aGUgc3Ryb25nIEVUYWcgd2lsbCBiZSByZXR1cm5lZAorICAgICAqIEByZXR1cm4gRVRhZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RVRhZyhib29sZWFuIHN0cm9uZykgeworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KEVUQUcpOworICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYXR0cmlidXRlLmdldCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgOyAvLyBObyB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3Ryb25nKSB7CisgICAgICAgICAgICAvLyBUaGUgc3Ryb25nIEVUYWcgbXVzdCBhbHdheXMgYmUgY2FsY3VsYXRlZCBieSB0aGUgcmVzb3VyY2VzCisgICAgICAgICAgICByZXN1bHQgPSBzdHJvbmdFVGFnOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhlIHdlYWtFVGFnIGlzIGNvbnRlbnRMZW5naHQgKyBsYXN0TW9kaWZpZWQKKyAgICAgICAgICAgIGlmICh3ZWFrRVRhZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd2Vha0VUYWcgPSAiVy9cIiIgKyBnZXRDb250ZW50TGVuZ3RoKCkgKyAiLSIgCisgICAgICAgICAgICAgICAgICAgICsgZ2V0TGFzdE1vZGlmaWVkKCkgKyAiXCIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gd2Vha0VUYWc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCBzdHJvbmcgRVRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFVGFnKFN0cmluZyBlVGFnKSB7CisgICAgICAgIHRoaXMuc3Ryb25nRVRhZyA9IGVUYWc7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpCisgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChFVEFHLCBlVGFnKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNhbm9uaWNhbCBwYXRoIG9mIHRoZSByZXNvdXJjZSwgdG8gcG9zc2libHkgYmUgdXNlZCBmb3IgCisgICAgICogZGlyZWN0IGZpbGUgc2VydmluZy4gSW1wbGVtZW50YXRpb25zIHdoaWNoIHN1cHBvcnQgdGhpcyBzaG91bGQgb3ZlcnJpZGUKKyAgICAgKiBpdCB0byByZXR1cm4gdGhlIGZpbGUgcGF0aC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBjYW5vbmljYWwgcGF0aCBvZiB0aGUgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENhbm9uaWNhbFBhdGgoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBdHRyaWJ1dGVzIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogR2V0IGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXR0cmlidXRlIGdldChTdHJpbmcgYXR0cklEKSB7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChhdHRySUQuZXF1YWxzKENSRUFUSU9OX0RBVEUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCYXNpY0F0dHJpYnV0ZShDUkVBVElPTl9EQVRFLCBnZXRDcmVhdGlvbkRhdGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJJRC5lcXVhbHMoQUxURVJOQVRFX0NSRUFUSU9OX0RBVEUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCYXNpY0F0dHJpYnV0ZShBTFRFUk5BVEVfQ1JFQVRJT05fREFURSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDcmVhdGlvbkRhdGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJJRC5lcXVhbHMoTEFTVF9NT0RJRklFRCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJhc2ljQXR0cmlidXRlKExBU1RfTU9ESUZJRUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGFzdE1vZGlmaWVkRGF0ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cklELmVxdWFscyhBTFRFUk5BVEVfTEFTVF9NT0RJRklFRCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJhc2ljQXR0cmlidXRlKEFMVEVSTkFURV9MQVNUX01PRElGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGFzdE1vZGlmaWVkRGF0ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cklELmVxdWFscyhOQU1FKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmFzaWNBdHRyaWJ1dGUoTkFNRSwgZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cklELmVxdWFscyhUWVBFKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmFzaWNBdHRyaWJ1dGUoVFlQRSwgZ2V0UmVzb3VyY2VUeXBlKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRySUQuZXF1YWxzKEFMVEVSTkFURV9UWVBFKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmFzaWNBdHRyaWJ1dGUoQUxURVJOQVRFX1RZUEUsIGdldFJlc291cmNlVHlwZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cklELmVxdWFscyhDT05URU5UX0xFTkdUSCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJhc2ljQXR0cmlidXRlKENPTlRFTlRfTEVOR1RILCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKGdldENvbnRlbnRMZW5ndGgoKSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRySUQuZXF1YWxzKEFMVEVSTkFURV9DT05URU5UX0xFTkdUSCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJhc2ljQXR0cmlidXRlKEFMVEVSTkFURV9DT05URU5UX0xFTkdUSCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyhnZXRDb250ZW50TGVuZ3RoKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLmdldChhdHRySUQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQdXQgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBBdHRyaWJ1dGUgcHV0KEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0KGF0dHJpYnV0ZS5nZXRJRCgpLCBhdHRyaWJ1dGUuZ2V0KCkpOworICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLnB1dChhdHRyaWJ1dGUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFB1dCBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIEF0dHJpYnV0ZSBwdXQoU3RyaW5nIGF0dHJJRCwgT2JqZWN0IHZhbCkgeworICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gTm8gcmVhc29uIHRvIGltcGxlbWVudCB0aGlzCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5wdXQoYXR0cklELCB2YWwpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJlbW92ZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIEF0dHJpYnV0ZSByZW1vdmUoU3RyaW5nIGF0dHJJRCkgeworICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gTm8gcmVhc29uIHRvIGltcGxlbWVudCB0aGlzCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5yZW1vdmUoYXR0cklEKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGdldEFsbCgpIHsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgVmVjdG9yIGF0dHJpYnV0ZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZEVsZW1lbnQobmV3IEJhc2ljQXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENSRUFUSU9OX0RBVEUsIGdldENyZWF0aW9uRGF0ZSgpKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZEVsZW1lbnQobmV3IEJhc2ljQXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExBU1RfTU9ESUZJRUQsIGdldExhc3RNb2RpZmllZERhdGUoKSkpOworICAgICAgICAgICAgYXR0cmlidXRlcy5hZGRFbGVtZW50KG5ldyBCYXNpY0F0dHJpYnV0ZShOQU1FLCBnZXROYW1lKCkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkRWxlbWVudChuZXcgQmFzaWNBdHRyaWJ1dGUoVFlQRSwgZ2V0UmVzb3VyY2VUeXBlKCkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkRWxlbWVudAorICAgICAgICAgICAgICAgIChuZXcgQmFzaWNBdHRyaWJ1dGUoQ09OVEVOVF9MRU5HVEgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcoZ2V0Q29udGVudExlbmd0aCgpKSkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWN5Y2xhYmxlTmFtaW5nRW51bWVyYXRpb24oYXR0cmlidXRlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5nZXRBbGwoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIGF0dHJpYnV0ZSBJRHMuCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGdldElEcygpIHsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgVmVjdG9yIGF0dHJpYnV0ZUlEcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZUlEcy5hZGRFbGVtZW50KENSRUFUSU9OX0RBVEUpOworICAgICAgICAgICAgYXR0cmlidXRlSURzLmFkZEVsZW1lbnQoTEFTVF9NT0RJRklFRCk7CisgICAgICAgICAgICBhdHRyaWJ1dGVJRHMuYWRkRWxlbWVudChOQU1FKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZUlEcy5hZGRFbGVtZW50KFRZUEUpOworICAgICAgICAgICAgYXR0cmlidXRlSURzLmFkZEVsZW1lbnQoQ09OVEVOVF9MRU5HVEgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWN5Y2xhYmxlTmFtaW5nRW51bWVyYXRpb24oYXR0cmlidXRlSURzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLmdldElEcygpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgaW4gdGhlIGF0dHJpYnV0ZSBzZXQuCisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gNTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLnNpemUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDbG9uZSB0aGUgYXR0cmlidXRlcyBvYmplY3QgKFdBUk5JTkc6IGZha2UgY2xvbmluZykuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENhc2Ugc2Vuc2l0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDYXNlSWdub3JlZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1Jlc291cmNlQ2FjaGUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1Jlc291cmNlQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZThlMWM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvUmVzb3VyY2VDYWNoZS5qYXZhCkBAIC0wLDAgKzEsNDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworCisvKioKKyAqIEltcGxlbWVudHMgYSBzcGVjaWFsIHB1cnBvc2UgY2FjaGUuCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnJlbW1AYXBhY2hlLm9yZyI+UmVteSBNYXVjaGVyYXQ8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUNhY2hlIHsKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKyAgICAKKyAgICAKKyAgICBwdWJsaWMgUmVzb3VyY2VDYWNoZSgpIHsKKyAgICB9CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFJhbmRvbSBnZW5lcmF0b3IgdXNlZCB0byBkZXRlcm1pbmUgZWxlbWVudHMgdG8gZnJlZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKworCisgICAgLyoqCisgICAgICogQ2FjaGUuCisgICAgICogUGF0aCAtPiBDYWNoZSBlbnRyeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2FjaGVFbnRyeVtdIGNhY2hlID0gbmV3IENhY2hlRW50cnlbMF07CisKKworICAgIC8qKgorICAgICAqIE5vdCBmb3VuZCBjYWNoZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCBub3RGb3VuZENhY2hlID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogTWF4IHNpemUgb2YgcmVzb3VyY2VzIHdoaWNoIHdpbGwgaGF2ZSB0aGVpciBjb250ZW50IGNhY2hlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGNhY2hlTWF4U2l6ZSA9IDEwMjQwOyAvLyAxMCBNQgorCisKKyAgICAvKioKKyAgICAgKiBNYXggYW1vdW50IG9mIHJlbW92YWxzIGR1cmluZyBhIG1ha2Ugc3BhY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtYXhBbGxvY2F0ZUl0ZXJhdGlvbnMgPSAyMDsKKworCisgICAgLyoqCisgICAgICogRW50cnkgaGl0IHJhdGlvIGF0IHdoaWNoIGFuIGVudHJ5IHdpbGwgbmV2ZXIgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKiBDb21wYXJlZCB3aXRoIGVudHJ5LmFjY2VzcyAvIGhpdHNDb3VudAorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGRlc2lyZWRFbnRyeUFjY2Vzc1JhdGlvID0gMzsKKworCisgICAgLyoqCisgICAgICogU3BhcmUgYW1vdW50IG9mIG5vdCBmb3VuZCBlbnRyaWVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgc3BhcmVOb3RGb3VuZEVudHJpZXMgPSA1MDA7CisKKworICAgIC8qKgorICAgICAqIEN1cnJlbnQgY2FjaGUgc2l6ZSBpbiBLQi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGNhY2hlU2l6ZSA9IDA7CisKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBhY2Nlc3NlcyB0byB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgYWNjZXNzQ291bnQgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgY2FjaGUgaGl0cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBoaXRzQ291bnQgPSAwOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhY2Nlc3MgY291bnQuCisgICAgICogTm90ZTogVXBkYXRlIGlzIG5vdCBzeW5jZWQsIHNvIHRoZSBudW1iZXIgbWF5IG5vdCBiZSBjb21wbGV0ZWx5IAorICAgICAqIGFjY3VyYXRlLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEFjY2Vzc0NvdW50KCkgeworICAgICAgICByZXR1cm4gYWNjZXNzQ291bnQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gS0IuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDYWNoZU1heFNpemUoKSB7CisgICAgICAgIHJldHVybiBjYWNoZU1heFNpemU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gS0IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FjaGVNYXhTaXplKGludCBjYWNoZU1heFNpemUpIHsKKyAgICAgICAgdGhpcy5jYWNoZU1heFNpemUgPSBjYWNoZU1heFNpemU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgY2FjaGUgc2l6ZSBpbiBLQi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENhY2hlU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlU2l6ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNpcmVkIGVudHJ5IGFjY2VzcyByYXRpby4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXREZXNpcmVkRW50cnlBY2Nlc3NSYXRpbygpIHsKKyAgICAgICAgcmV0dXJuIGRlc2lyZWRFbnRyeUFjY2Vzc1JhdGlvOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXNpcmVkIGVudHJ5IGFjY2VzcyByYXRpby4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXNpcmVkRW50cnlBY2Nlc3NSYXRpbyhsb25nIGRlc2lyZWRFbnRyeUFjY2Vzc1JhdGlvKSB7CisgICAgICAgIHRoaXMuZGVzaXJlZEVudHJ5QWNjZXNzUmF0aW8gPSBkZXNpcmVkRW50cnlBY2Nlc3NSYXRpbzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNhY2hlIGhpdHMuCisgICAgICogTm90ZTogVXBkYXRlIGlzIG5vdCBzeW5jZWQsIHNvIHRoZSBudW1iZXIgbWF5IG5vdCBiZSBjb21wbGV0ZWx5IAorICAgICAqIGFjY3VyYXRlLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEhpdHNDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGhpdHNDb3VudDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWF4aW11bSBhbW91bnQgb2YgaXRlcmF0aW9ucyBkdXJpbmcgYSBzcGFjZSBhbGxvY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4QWxsb2NhdGVJdGVyYXRpb25zKCkgeworICAgICAgICByZXR1cm4gbWF4QWxsb2NhdGVJdGVyYXRpb25zOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYXhpbXVtIGFtb3VudCBvZiBpdGVyYXRpb25zIGR1cmluZyBhIHNwYWNlIGFsbG9jYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWF4QWxsb2NhdGVJdGVyYXRpb25zKGludCBtYXhBbGxvY2F0ZUl0ZXJhdGlvbnMpIHsKKyAgICAgICAgdGhpcy5tYXhBbGxvY2F0ZUl0ZXJhdGlvbnMgPSBtYXhBbGxvY2F0ZUl0ZXJhdGlvbnM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBzcGFyZSBub3QgZm91bmQgZW50cmllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNwYXJlTm90Rm91bmRFbnRyaWVzKCkgeworICAgICAgICByZXR1cm4gc3BhcmVOb3RGb3VuZEVudHJpZXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFtb3VudCBvZiBzcGFyZSBub3QgZm91bmQgZW50cmllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTcGFyZU5vdEZvdW5kRW50cmllcyhpbnQgc3BhcmVOb3RGb3VuZEVudHJpZXMpIHsKKyAgICAgICAgdGhpcy5zcGFyZU5vdEZvdW5kRW50cmllcyA9IHNwYXJlTm90Rm91bmRFbnRyaWVzOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIHB1YmxpYyBib29sZWFuIGFsbG9jYXRlKGludCBzcGFjZSkgeworCisgICAgICAgIGludCB0b0ZyZWUgPSBzcGFjZSAtIChjYWNoZU1heFNpemUgLSBjYWNoZVNpemUpOworCisgICAgICAgIGlmICh0b0ZyZWUgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbmNyZWFzZSB0aGUgYW1vdW50IHRvIGZyZWUgc28gdGhhdCBhbGxvY2F0ZSB3b24ndCBoYXZlIHRvIHJ1biByaWdodAorICAgICAgICAvLyBhd2F5IGFnYWluCisgICAgICAgIHRvRnJlZSArPSAoY2FjaGVNYXhTaXplIC8gMjApOworCisgICAgICAgIGludCBzaXplID0gbm90Rm91bmRDYWNoZS5zaXplKCk7CisgICAgICAgIGlmIChzaXplID4gc3BhcmVOb3RGb3VuZEVudHJpZXMpIHsKKyAgICAgICAgICAgIG5vdEZvdW5kQ2FjaGUuY2xlYXIoKTsKKyAgICAgICAgICAgIGNhY2hlU2l6ZSAtPSBzaXplOworICAgICAgICAgICAgdG9GcmVlIC09IHNpemU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodG9GcmVlIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaW50IGF0dGVtcHRzID0gMDsKKyAgICAgICAgaW50IGVudHJpZXNGb3VuZCA9IDA7CisgICAgICAgIGxvbmcgdG90YWxTcGFjZSA9IDA7CisgICAgICAgIGludFtdIHRvUmVtb3ZlID0gbmV3IGludFttYXhBbGxvY2F0ZUl0ZXJhdGlvbnNdOworICAgICAgICB3aGlsZSAodG9GcmVlID4gMCkgeworICAgICAgICAgICAgaWYgKGF0dGVtcHRzID09IG1heEFsbG9jYXRlSXRlcmF0aW9ucykgeworICAgICAgICAgICAgICAgIC8vIEdpdmUgdXAsIG5vIGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhlIGN1cnJlbnQgY2FjaGUKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodG9GcmVlID4gMCkgeworICAgICAgICAgICAgICAgIC8vIFJhbmRvbWx5IHNlbGVjdCBhbiBlbnRyeSBpbiB0aGUgYXJyYXkKKyAgICAgICAgICAgICAgICBpbnQgZW50cnlQb3MgPSAtMTsKKyAgICAgICAgICAgICAgICBib29sZWFuIHVuaXF1ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHdoaWxlICghdW5pcXVlKSB7CisgICAgICAgICAgICAgICAgICAgIHVuaXF1ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5UG9zID0gcmFuZG9tLm5leHRJbnQoY2FjaGUubGVuZ3RoKSA7CisgICAgICAgICAgICAgICAgICAgIC8vIEd1YXJhbnRlZSB1bmlxdWVuZXNzCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllc0ZvdW5kOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b1JlbW92ZVtpXSA9PSBlbnRyeVBvcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvbmcgZW50cnlBY2Nlc3NSYXRpbyA9IAorICAgICAgICAgICAgICAgICAgICAoKGNhY2hlW2VudHJ5UG9zXS5hY2Nlc3NDb3VudCAqIDEwMCkgLyBhY2Nlc3NDb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5QWNjZXNzUmF0aW8gPCBkZXNpcmVkRW50cnlBY2Nlc3NSYXRpbykgeworICAgICAgICAgICAgICAgICAgICB0b1JlbW92ZVtlbnRyaWVzRm91bmRdID0gZW50cnlQb3M7CisgICAgICAgICAgICAgICAgICAgIHRvdGFsU3BhY2UgKz0gY2FjaGVbZW50cnlQb3NdLnNpemU7CisgICAgICAgICAgICAgICAgICAgIHRvRnJlZSAtPSBjYWNoZVtlbnRyeVBvc10uc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgZW50cmllc0ZvdW5kKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0ZW1wdHMrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdyByZW1vdmUgdGhlIHNlbGVjdGVkIGVudHJpZXMKKyAgICAgICAgamF2YS51dGlsLkFycmF5cy5zb3J0KHRvUmVtb3ZlLCAwLCBlbnRyaWVzRm91bmQpOworICAgICAgICBDYWNoZUVudHJ5W10gbmV3Q2FjaGUgPSBuZXcgQ2FjaGVFbnRyeVtjYWNoZS5sZW5ndGggLSBlbnRyaWVzRm91bmRdOworICAgICAgICBpbnQgcG9zID0gMDsKKyAgICAgICAgaW50IG4gPSAtMTsKKyAgICAgICAgaWYgKGVudHJpZXNGb3VuZCA+IDApIHsKKyAgICAgICAgICAgIG4gPSB0b1JlbW92ZVswXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBuKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgocG9zICsgMSkgPCBlbnRyaWVzRm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB0b1JlbW92ZVtwb3MgKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICAgICAgICAgICAgICBuID0gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuZXdDYWNoZVtpIC0gcG9zXSA9IGNhY2hlW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYWNoZSA9IG5ld0NhY2hlOworICAgICAgICBjYWNoZVNpemUgLT0gdG90YWxTcGFjZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIH0KKworCisgICAgcHVibGljIENhY2hlRW50cnkgbG9va3VwKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgQ2FjaGVFbnRyeSBjYWNoZUVudHJ5ID0gbnVsbDsKKyAgICAgICAgQ2FjaGVFbnRyeVtdIGN1cnJlbnRDYWNoZSA9IGNhY2hlOworICAgICAgICBhY2Nlc3NDb3VudCsrOworICAgICAgICBpbnQgcG9zID0gZmluZChjdXJyZW50Q2FjaGUsIG5hbWUpOworICAgICAgICBpZiAoKHBvcyAhPSAtMSkgJiYgKG5hbWUuZXF1YWxzKGN1cnJlbnRDYWNoZVtwb3NdLm5hbWUpKSkgeworICAgICAgICAgICAgY2FjaGVFbnRyeSA9IGN1cnJlbnRDYWNoZVtwb3NdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNhY2hlRW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjYWNoZUVudHJ5ID0gKENhY2hlRW50cnkpIG5vdEZvdW5kQ2FjaGUuZ2V0KG5hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmU6IHRoZSByZWxpYWJpbGl0eSBvZiB0aGlzIGxvb2t1cCBpcyBub3QgY3JpdGljYWwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2FjaGVFbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICBoaXRzQ291bnQrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2FjaGVFbnRyeTsKKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgbG9hZChDYWNoZUVudHJ5IGVudHJ5KSB7CisgICAgICAgIGlmIChlbnRyeS5leGlzdHMpIHsKKyAgICAgICAgICAgIGlmIChpbnNlcnRDYWNoZShlbnRyeSkpIHsKKyAgICAgICAgICAgICAgICBjYWNoZVNpemUgKz0gZW50cnkuc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBzaXplSW5jcmVtZW50ID0gKG5vdEZvdW5kQ2FjaGUuZ2V0KGVudHJ5Lm5hbWUpID09IG51bGwpID8gMSA6IDA7CisgICAgICAgICAgICBub3RGb3VuZENhY2hlLnB1dChlbnRyeS5uYW1lLCBlbnRyeSk7CisgICAgICAgICAgICBjYWNoZVNpemUgKz0gc2l6ZUluY3JlbWVudDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gdW5sb2FkKFN0cmluZyBuYW1lKSB7CisgICAgICAgIENhY2hlRW50cnkgcmVtb3ZlZEVudHJ5ID0gcmVtb3ZlQ2FjaGUobmFtZSk7CisgICAgICAgIGlmIChyZW1vdmVkRW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgY2FjaGVTaXplIC09IHJlbW92ZWRFbnRyeS5zaXplOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAobm90Rm91bmRDYWNoZS5yZW1vdmUobmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgY2FjaGVTaXplLS07CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGaW5kIGEgbWFwIGVsZW1udCBnaXZlbiBpdHMgbmFtZSBpbiBhIHNvcnRlZCBhcnJheSBvZiBtYXAgZWxlbWVudHMuCisgICAgICogVGhpcyB3aWxsIHJldHVybiB0aGUgaW5kZXggZm9yIHRoZSBjbG9zZXN0IGluZmVyaW9yIG9yIGVxdWFsIGl0ZW0gaW4gdGhlCisgICAgICogZ2l2ZW4gYXJyYXkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGZpbmQoQ2FjaGVFbnRyeVtdIG1hcCwgU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpbnQgYSA9IDA7CisgICAgICAgIGludCBiID0gbWFwLmxlbmd0aCAtIDE7CisKKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlczogLTEgYW5kIDAKKyAgICAgICAgaWYgKGIgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZS5jb21wYXJlVG8obWFwWzBdLm5hbWUpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChiID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaSA9IChiICsgYSkgLyAyOworICAgICAgICAgICAgaW50IHJlc3VsdCA9IG5hbWUuY29tcGFyZVRvKG1hcFtpXS5uYW1lKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPiAwKSB7CisgICAgICAgICAgICAgICAgYSA9IGk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGIgPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChiIC0gYSkgPT0gMSkgeworICAgICAgICAgICAgICAgIGludCByZXN1bHQyID0gbmFtZS5jb21wYXJlVG8obWFwW2JdLm5hbWUpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQyIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW5zZXJ0IGludG8gdGhlIHJpZ2h0IHBsYWNlIGluIGEgc29ydGVkIE1hcEVsZW1lbnQgYXJyYXksIGFuZCBwcmV2ZW50CisgICAgICogZHVwbGljYXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaW5zZXJ0Q2FjaGUoQ2FjaGVFbnRyeSBuZXdFbGVtZW50KSB7CisgICAgICAgIENhY2hlRW50cnlbXSBvbGRDYWNoZSA9IGNhY2hlOworICAgICAgICBpbnQgcG9zID0gZmluZChvbGRDYWNoZSwgbmV3RWxlbWVudC5uYW1lKTsKKyAgICAgICAgaWYgKChwb3MgIT0gLTEpICYmIChuZXdFbGVtZW50Lm5hbWUuZXF1YWxzKG9sZENhY2hlW3Bvc10ubmFtZSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQ2FjaGVFbnRyeVtdIG5ld0NhY2hlID0gbmV3IENhY2hlRW50cnlbY2FjaGUubGVuZ3RoICsgMV07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob2xkQ2FjaGUsIDAsIG5ld0NhY2hlLCAwLCBwb3MgKyAxKTsKKyAgICAgICAgbmV3Q2FjaGVbcG9zICsgMV0gPSBuZXdFbGVtZW50OworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5CisgICAgICAgICAgICAob2xkQ2FjaGUsIHBvcyArIDEsIG5ld0NhY2hlLCBwb3MgKyAyLCBvbGRDYWNoZS5sZW5ndGggLSBwb3MgLSAxKTsKKyAgICAgICAgY2FjaGUgPSBuZXdDYWNoZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbnNlcnQgaW50byB0aGUgcmlnaHQgcGxhY2UgaW4gYSBzb3J0ZWQgTWFwRWxlbWVudCBhcnJheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIENhY2hlRW50cnkgcmVtb3ZlQ2FjaGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgQ2FjaGVFbnRyeVtdIG9sZENhY2hlID0gY2FjaGU7CisgICAgICAgIGludCBwb3MgPSBmaW5kKG9sZENhY2hlLCBuYW1lKTsKKyAgICAgICAgaWYgKChwb3MgIT0gLTEpICYmIChuYW1lLmVxdWFscyhvbGRDYWNoZVtwb3NdLm5hbWUpKSkgeworICAgICAgICAgICAgQ2FjaGVFbnRyeVtdIG5ld0NhY2hlID0gbmV3IENhY2hlRW50cnlbY2FjaGUubGVuZ3RoIC0gMV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9sZENhY2hlLCAwLCBuZXdDYWNoZSwgMCwgcG9zKTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob2xkQ2FjaGUsIHBvcyArIDEsIG5ld0NhY2hlLCBwb3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRDYWNoZS5sZW5ndGggLSBwb3MgLSAxKTsKKyAgICAgICAgICAgIGNhY2hlID0gbmV3Q2FjaGU7CisgICAgICAgICAgICByZXR1cm4gb2xkQ2FjaGVbcG9zXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1dBUkRpckNvbnRleHQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1dBUkRpckNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmM1Y2RiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvV0FSRGlyQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsOTU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5Db21wb3NpdGVOYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5PcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5BdHRyaWJ1dGVzOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5Lk1vZGlmaWNhdGlvbkl0ZW07CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5TZWFyY2hDb250cm9sczsKKworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLk5hbWluZ0NvbnRleHRCaW5kaW5nc0VudW1lcmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLk5hbWluZ0NvbnRleHRFbnVtZXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5OYW1pbmdFbnRyeTsKKworLyoqCisgKiBXQVIgRGlyZWN0b3J5IENvbnRleHQgaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgV0FSRGlyQ29udGV4dCBleHRlbmRzIEJhc2VEaXJDb250ZXh0IHsKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2c9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBXQVJEaXJDb250ZXh0LmNsYXNzICk7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhIFdBUiBkaXJlY3RvcnkgY29udGV4dCB1c2luZyB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuCisgICAgICovCisgICAgcHVibGljIFdBUkRpckNvbnRleHQoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBXQVIgZGlyZWN0b3J5IGNvbnRleHQgdXNpbmcgdGhlIGdpdmVuIGVudmlyb25tZW50LgorICAgICAqLworICAgIHB1YmxpYyBXQVJEaXJDb250ZXh0KEhhc2h0YWJsZSBlbnYpIHsKKyAgICAgICAgc3VwZXIoZW52KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHVzZWQgZm9yIHJldHVybmluZyBmYWtlIHN1YmNvbnRleHRzLgorICAgICAqLworICAgIHByb3RlY3RlZCBXQVJEaXJDb250ZXh0KFppcEZpbGUgYmFzZSwgRW50cnkgZW50cmllcykgeworICAgICAgICB0aGlzLmJhc2UgPSBiYXNlOworICAgICAgICB0aGlzLmVudHJpZXMgPSBlbnRyaWVzOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBXQVIgZmlsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgWmlwRmlsZSBiYXNlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogV0FSIGVudHJpZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIEVudHJ5IGVudHJpZXMgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkb2N1bWVudCByb290LgorICAgICAqIAorICAgICAqIEBwYXJhbSBkb2NCYXNlIFRoZSBuZXcgZG9jdW1lbnQgcm9vdAorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgbm90CisgICAgICogIHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyB3b3VsZCBjcmVhdGUgYQorICAgICAqICBtYWxmb3JtZWQgVVJMCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9jQmFzZShTdHJpbmcgZG9jQmFzZSkgeworCisJLy8gVmFsaWRhdGUgdGhlIGZvcm1hdCBvZiB0aGUgcHJvcG9zZWQgZG9jdW1lbnQgcm9vdAorCWlmIChkb2NCYXNlID09IG51bGwpCisJICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkJKHNtLmdldFN0cmluZygicmVzb3VyY2VzLm51bGwiKSk7CisJaWYgKCEoZG9jQmFzZS5lbmRzV2l0aCgiLndhciIpKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCQkoc20uZ2V0U3RyaW5nKCJ3YXJSZXNvdXJjZXMubm90V2FyIikpOworCisJLy8gQ2FsY3VsYXRlIGEgRmlsZSBvYmplY3QgcmVmZXJlbmNpbmcgdGhpcyBkb2N1bWVudCBiYXNlIGRpcmVjdG9yeQorCUZpbGUgYmFzZSA9IG5ldyBGaWxlKGRvY0Jhc2UpOworCisJLy8gVmFsaWRhdGUgdGhhdCB0aGUgZG9jdW1lbnQgYmFzZSBpcyBhbiBleGlzdGluZyBkaXJlY3RvcnkKKwlpZiAoIWJhc2UuZXhpc3RzKCkgfHwgIWJhc2UuY2FuUmVhZCgpIHx8IGJhc2UuaXNEaXJlY3RvcnkoKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCQkoc20uZ2V0U3RyaW5nKCJ3YXJSZXNvdXJjZXMuaW52YWxpZFdhciIsIGRvY0Jhc2UpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoaXMuYmFzZSA9IG5ldyBaaXBGaWxlKGJhc2UpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJCShzbS5nZXRTdHJpbmcoIndhclJlc291cmNlcy5pbnZhbGlkV2FyIiwgZS5nZXRNZXNzYWdlKCkpKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXREb2NCYXNlKGRvY0Jhc2UpOworCisgICAgICAgIGxvYWRFbnRyaWVzKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciB0aGlzIGRpcmVjdG9yeSBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7CisKKyAgICAgICAgZW50cmllcyA9IG51bGw7CisgICAgICAgIGlmIChiYXNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmFzZS5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuCisgICAgICAgICAgICAgICAgICAgICgiRXhjZXB0aW9uIGNsb3NpbmcgV0FSIEZpbGUgIiArIGJhc2UuZ2V0TmFtZSgpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiYXNlID0gbnVsbDsKKyAgICAgICAgc3VwZXIucmVsZWFzZSgpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb250ZXh0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1lZCBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGxvb2t1cChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBsb29rdXAobmV3IENvbXBvc2l0ZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1lZCBvYmplY3QuIElmIG5hbWUgaXMgZW1wdHksIHJldHVybnMgYSBuZXcgaW5zdGFuY2UgCisgICAgICogb2YgdGhpcyBjb250ZXh0ICh3aGljaCByZXByZXNlbnRzIHRoZSBzYW1lIG5hbWluZyBjb250ZXh0IGFzIHRoaXMgCisgICAgICogY29udGV4dCwgYnV0IGl0cyBlbnZpcm9ubWVudCBtYXkgYmUgbW9kaWZpZWQgaW5kZXBlbmRlbnRseSBhbmQgaXQgbWF5IAorICAgICAqIGJlIGFjY2Vzc2VkIGNvbmN1cnJlbnRseSkuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGxvb2t1cChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgRW50cnkgZW50cnkgPSB0cmVlTG9va3VwKG5hbWUpOworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJyZXNvdXJjZXMubm90Rm91bmQiLCBuYW1lKSk7CisgICAgICAgIFppcEVudHJ5IHppcEVudHJ5ID0gZW50cnkuZ2V0RW50cnkoKTsKKyAgICAgICAgaWYgKHppcEVudHJ5LmlzRGlyZWN0b3J5KCkpCisgICAgICAgICAgICByZXR1cm4gbmV3IFdBUkRpckNvbnRleHQoYmFzZSwgZW50cnkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IFdBUlJlc291cmNlKGVudHJ5LmdldEVudHJ5KCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVW5iaW5kcyB0aGUgbmFtZWQgb2JqZWN0LiBSZW1vdmVzIHRoZSB0ZXJtaW5hbCBhdG9taWMgbmFtZSBpbiBuYW1lIAorICAgICAqIGZyb20gdGhlIHRhcmdldCBjb250ZXh0LS10aGF0IG5hbWVkIGJ5IGFsbCBidXQgdGhlIHRlcm1pbmFsIGF0b21pYyAKKyAgICAgKiBwYXJ0IG9mIG5hbWUuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgaWRlbXBvdGVudC4gSXQgc3VjY2VlZHMgZXZlbiBpZiB0aGUgdGVybWluYWwgYXRvbWljIAorICAgICAqIG5hbWUgaXMgbm90IGJvdW5kIGluIHRoZSB0YXJnZXQgY29udGV4dCwgYnV0IHRocm93cyAKKyAgICAgKiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBpbnRlcm1lZGlhdGUgY29udGV4dHMgZG8gbm90IGV4aXN0LiAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gaW50ZXJtZWRpYXRlIGNvbnRleHQgZG9lcyBub3QgCisgICAgICogZXhpc3QKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmJpbmQoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5ldyBuYW1lIHRvIHRoZSBvYmplY3QgYm91bmQgdG8gYW4gb2xkIG5hbWUsIGFuZCB1bmJpbmRzIHRoZSAKKyAgICAgKiBvbGQgbmFtZS4gQm90aCBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBjb250ZXh0LiBBbnkgYXR0cmlidXRlcyAKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIG9sZCBuYW1lIGJlY29tZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBuYW1lLiAKKyAgICAgKiBJbnRlcm1lZGlhdGUgY29udGV4dHMgb2YgdGhlIG9sZCBuYW1lIGFyZSBub3QgY2hhbmdlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2xkTmFtZSB0aGUgbmFtZSBvZiB0aGUgZXhpc3RpbmcgYmluZGluZzsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBuZXdOYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgYmluZGluZzsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuZXdOYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW5hbWUoU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyB0aGUgbmFtZXMgYm91bmQgaW4gdGhlIG5hbWVkIGNvbnRleHQsIGFsb25nIHdpdGggdGhlIGNsYXNzIAorICAgICAqIG5hbWVzIG9mIG9iamVjdHMgYm91bmQgdG8gdGhlbS4gVGhlIGNvbnRlbnRzIG9mIGFueSBzdWJjb250ZXh0cyBhcmUgCisgICAgICogbm90IGluY2x1ZGVkLgorICAgICAqIDxwPgorICAgICAqIElmIGEgYmluZGluZyBpcyBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhpcyBjb250ZXh0LCBpdHMgZWZmZWN0IG9uIAorICAgICAqIGFuIGVudW1lcmF0aW9uIHByZXZpb3VzbHkgcmV0dXJuZWQgaXMgdW5kZWZpbmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGxpc3QKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBuYW1lcyBhbmQgY2xhc3MgbmFtZXMgb2YgdGhlIGJpbmRpbmdzIGluIAorICAgICAqIHRoaXMgY29udGV4dC4gRWFjaCBlbGVtZW50IG9mIHRoZSBlbnVtZXJhdGlvbiBpcyBvZiB0eXBlIE5hbWVDbGFzc1BhaXIuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3QoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbGlzdChuZXcgQ29tcG9zaXRlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgY2xhc3MgCisgICAgICogbmFtZXMgb2Ygb2JqZWN0cyBib3VuZCB0byB0aGVtLiBUaGUgY29udGVudHMgb2YgYW55IHN1YmNvbnRleHRzIGFyZSAKKyAgICAgKiBub3QgaW5jbHVkZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBiaW5kaW5nIGlzIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGlzIGNvbnRleHQsIGl0cyBlZmZlY3Qgb24gCisgICAgICogYW4gZW51bWVyYXRpb24gcHJldmlvdXNseSByZXR1cm5lZCBpcyB1bmRlZmluZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIG5hbWVzIGFuZCBjbGFzcyBuYW1lcyBvZiB0aGUgYmluZGluZ3MgaW4gCisgICAgICogdGhpcyBjb250ZXh0LiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgTmFtZUNsYXNzUGFpci4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gbmV3IE5hbWluZ0NvbnRleHRFbnVtZXJhdGlvbihsaXN0KGVudHJpZXMpLml0ZXJhdG9yKCkpOworICAgICAgICBFbnRyeSBlbnRyeSA9IHRyZWVMb29rdXAobmFtZSk7CisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlcy5ub3RGb3VuZCIsIG5hbWUpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBOYW1pbmdDb250ZXh0RW51bWVyYXRpb24obGlzdChlbnRyeSkuaXRlcmF0b3IoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgCisgICAgICogb2JqZWN0cyBib3VuZCB0byB0aGVtLiBUaGUgY29udGVudHMgb2YgYW55IHN1YmNvbnRleHRzIGFyZSBub3QgCisgICAgICogaW5jbHVkZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBiaW5kaW5nIGlzIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGlzIGNvbnRleHQsIGl0cyBlZmZlY3Qgb24gCisgICAgICogYW4gZW51bWVyYXRpb24gcHJldmlvdXNseSByZXR1cm5lZCBpcyB1bmRlZmluZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIGJpbmRpbmdzIGluIHRoaXMgY29udGV4dC4gCisgICAgICogRWFjaCBlbGVtZW50IG9mIHRoZSBlbnVtZXJhdGlvbiBpcyBvZiB0eXBlIEJpbmRpbmcuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3RCaW5kaW5ncyhTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBsaXN0QmluZGluZ3MobmV3IENvbXBvc2l0ZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyB0aGUgbmFtZXMgYm91bmQgaW4gdGhlIG5hbWVkIGNvbnRleHQsIGFsb25nIHdpdGggdGhlIAorICAgICAqIG9iamVjdHMgYm91bmQgdG8gdGhlbS4gVGhlIGNvbnRlbnRzIG9mIGFueSBzdWJjb250ZXh0cyBhcmUgbm90IAorICAgICAqIGluY2x1ZGVkLgorICAgICAqIDxwPgorICAgICAqIElmIGEgYmluZGluZyBpcyBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhpcyBjb250ZXh0LCBpdHMgZWZmZWN0IG9uIAorICAgICAqIGFuIGVudW1lcmF0aW9uIHByZXZpb3VzbHkgcmV0dXJuZWQgaXMgdW5kZWZpbmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGxpc3QKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBiaW5kaW5ncyBpbiB0aGlzIGNvbnRleHQuIAorICAgICAqIEVhY2ggZWxlbWVudCBvZiB0aGUgZW51bWVyYXRpb24gaXMgb2YgdHlwZSBCaW5kaW5nLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0QmluZGluZ3MoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5hbWUuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBOYW1pbmdDb250ZXh0QmluZGluZ3NFbnVtZXJhdGlvbihsaXN0KGVudHJpZXMpLml0ZXJhdG9yKCksCisgICAgICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICBFbnRyeSBlbnRyeSA9IHRyZWVMb29rdXAobmFtZSk7CisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlcy5ub3RGb3VuZCIsIG5hbWUpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBOYW1pbmdDb250ZXh0QmluZGluZ3NFbnVtZXJhdGlvbihsaXN0KGVudHJ5KS5pdGVyYXRvcigpLAorICAgICAgICAgICAgICAgIHRoaXMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIG5hbWVkIGNvbnRleHQgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgbmFtZXNwYWNlLiBBbnkgCisgICAgICogYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUgYXJlIGFsc28gcmVtb3ZlZC4gSW50ZXJtZWRpYXRlIAorICAgICAqIGNvbnRleHRzIGFyZSBub3QgZGVzdHJveWVkLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGlkZW1wb3RlbnQuIEl0IHN1Y2NlZWRzIGV2ZW4gaWYgdGhlIHRlcm1pbmFsIGF0b21pYyAKKyAgICAgKiBuYW1lIGlzIG5vdCBib3VuZCBpbiB0aGUgdGFyZ2V0IGNvbnRleHQsIGJ1dCB0aHJvd3MgCisgICAgICogTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgaW50ZXJtZWRpYXRlIGNvbnRleHRzIGRvIG5vdCBleGlzdC4gCisgICAgICogCisgICAgICogSW4gYSBmZWRlcmF0ZWQgbmFtaW5nIHN5c3RlbSwgYSBjb250ZXh0IGZyb20gb25lIG5hbWluZyBzeXN0ZW0gbWF5IGJlIAorICAgICAqIGJvdW5kIHRvIGEgbmFtZSBpbiBhbm90aGVyLiBPbmUgY2FuIHN1YnNlcXVlbnRseSBsb29rIHVwIGFuZCBwZXJmb3JtIAorICAgICAqIG9wZXJhdGlvbnMgb24gdGhlIGZvcmVpZ24gY29udGV4dCB1c2luZyBhIGNvbXBvc2l0ZSBuYW1lLiBIb3dldmVyLCBhbiAKKyAgICAgKiBhdHRlbXB0IGRlc3Ryb3kgdGhlIGNvbnRleHQgdXNpbmcgdGhpcyBjb21wb3NpdGUgbmFtZSB3aWxsIGZhaWwgd2l0aCAKKyAgICAgKiBOb3RDb250ZXh0RXhjZXB0aW9uLCBiZWNhdXNlIHRoZSBmb3JlaWduIGNvbnRleHQgaXMgbm90IGEgInN1YmNvbnRleHQiIAorICAgICAqIG9mIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIGJvdW5kLiBJbnN0ZWFkLCB1c2UgdW5iaW5kKCkgdG8gcmVtb3ZlIAorICAgICAqIHRoZSBiaW5kaW5nIG9mIHRoZSBmb3JlaWduIGNvbnRleHQuIERlc3Ryb3lpbmcgdGhlIGZvcmVpZ24gY29udGV4dCAKKyAgICAgKiByZXF1aXJlcyB0aGF0IHRoZSBkZXN0cm95U3ViY29udGV4dCgpIGJlIHBlcmZvcm1lZCBvbiBhIGNvbnRleHQgZnJvbSAKKyAgICAgKiB0aGUgZm9yZWlnbiBjb250ZXh0J3MgIm5hdGl2ZSIgbmFtaW5nIHN5c3RlbS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBiZSBkZXN0cm95ZWQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiBpbnRlcm1lZGlhdGUgY29udGV4dCBkb2VzIG5vdCAKKyAgICAgKiBleGlzdAorICAgICAqIEBleGNlcHRpb24gTm90Q29udGV4dEV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBpcyBib3VuZCBidXQgZG9lcyBub3QgbmFtZSAKKyAgICAgKiBhIGNvbnRleHQsIG9yIGRvZXMgbm90IG5hbWUgYSBjb250ZXh0IG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveVN1YmNvbnRleHQoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdCwgZm9sbG93aW5nIGxpbmtzIGV4Y2VwdCBmb3IgdGhlIHRlcm1pbmFsIAorICAgICAqIGF0b21pYyBjb21wb25lbnQgb2YgdGhlIG5hbWUuIElmIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZSBpcyBub3QgYSAKKyAgICAgKiBsaW5rLCByZXR1cm5zIHRoZSBvYmplY3QgaXRzZWxmLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gbG9vayB1cAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBib3VuZCB0byBuYW1lLCBub3QgZm9sbG93aW5nIHRoZSB0ZXJtaW5hbCBsaW5rIAorICAgICAqIChpZiBhbnkpLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9va3VwTGluayhTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIE5vdGUgOiBMaW5rcyBhcmUgbm90IHN1cHBvcnRlZAorICAgICAgICByZXR1cm4gbG9va3VwKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBjb250ZXh0IHdpdGhpbiBpdHMgb3duIG5hbWVzcGFjZS4KKyAgICAgKiA8cD4KKyAgICAgKiBNYW55IG5hbWluZyBzZXJ2aWNlcyBoYXZlIGEgbm90aW9uIG9mIGEgImZ1bGwgbmFtZSIgZm9yIG9iamVjdHMgaW4gCisgICAgICogdGhlaXIgcmVzcGVjdGl2ZSBuYW1lc3BhY2VzLiBGb3IgZXhhbXBsZSwgYW4gTERBUCBlbnRyeSBoYXMgYSAKKyAgICAgKiBkaXN0aW5ndWlzaGVkIG5hbWUsIGFuZCBhIEROUyByZWNvcmQgaGFzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIFRoaXMgCisgICAgICogbWV0aG9kIGFsbG93cyB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHRvIHJldHJpZXZlIHRoaXMgbmFtZS4gVGhlIHN0cmluZyAKKyAgICAgKiByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyBub3QgYSBKTkRJIGNvbXBvc2l0ZSBuYW1lIGFuZCBzaG91bGQgbm90IGJlIAorICAgICAqIHBhc3NlZCBkaXJlY3RseSB0byBjb250ZXh0IG1ldGhvZHMuIEluIG5hbWluZyBzeXN0ZW1zIGZvciB3aGljaCB0aGUgCisgICAgICogbm90aW9uIG9mIGZ1bGwgbmFtZSBkb2VzIG5vdCBtYWtlIHNlbnNlLCAKKyAgICAgKiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhpcyBjb250ZXh0J3MgbmFtZSBpbiBpdHMgb3duIG5hbWVzcGFjZTsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHRoZSBuYW1pbmcgc3lzdGVtIGRvZXMgCisgICAgICogbm90IGhhdmUgdGhlIG5vdGlvbiBvZiBhIGZ1bGwgbmFtZQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZUluTmFtZXNwYWNlKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkb2NCYXNlOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGlyQ29udGV4dCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBzZWxlY3RlZCBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIG9iamVjdC4gCisgICAgICogU2VlIHRoZSBjbGFzcyBkZXNjcmlwdGlvbiByZWdhcmRpbmcgYXR0cmlidXRlIG1vZGVscywgYXR0cmlidXRlIHR5cGUgCisgICAgICogbmFtZXMsIGFuZCBvcGVyYXRpb25hbCBhdHRyaWJ1dGVzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzOyBuZXZlciBudWxsCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMKKyAgICAgKiBAcGFyYW0gYXR0cklkcyB0aGUgaWRlbnRpZmllcnMgb2YgdGhlIGF0dHJpYnV0ZXMgdG8gcmV0cmlldmUuIG51bGwgCisgICAgICogaW5kaWNhdGVzIHRoYXQgYWxsIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHJldHJpZXZlZDsgYW4gZW1wdHkgYXJyYXkgCisgICAgICogaW5kaWNhdGVzIHRoYXQgbm9uZSBzaG91bGQgYmUgcmV0cmlldmVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcyhTdHJpbmcgbmFtZSwgU3RyaW5nW10gYXR0cklkcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVzKG5ldyBDb21wb3NpdGVOYW1lKG5hbWUpLCBhdHRySWRzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgb2JqZWN0LiAKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggbmFtZS4gCisgICAgICogUmV0dXJucyBhbiBlbXB0eSBhdHRyaWJ1dGUgc2V0IGlmIG5hbWUgaGFzIG5vIGF0dHJpYnV0ZXM7IG5ldmVyIG51bGwuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKE5hbWUgbmFtZSwgU3RyaW5nW10gYXR0cklkcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBFbnRyeSBlbnRyeSA9IG51bGw7CisgICAgICAgIGlmIChuYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGVudHJ5ID0gZW50cmllczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZW50cnkgPSB0cmVlTG9va3VwKG5hbWUpOworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJyZXNvdXJjZXMubm90Rm91bmQiLCBuYW1lKSk7CisgICAgICAgIAorICAgICAgICBaaXBFbnRyeSB6aXBFbnRyeSA9IGVudHJ5LmdldEVudHJ5KCk7CisKKyAgICAgICAgUmVzb3VyY2VBdHRyaWJ1dGVzIGF0dHJzID0gbmV3IFJlc291cmNlQXR0cmlidXRlcygpOworICAgICAgICBhdHRycy5zZXRDcmVhdGlvbkRhdGUobmV3IERhdGUoemlwRW50cnkuZ2V0VGltZSgpKSk7CisgICAgICAgIGF0dHJzLnNldE5hbWUoZW50cnkuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKCF6aXBFbnRyeS5pc0RpcmVjdG9yeSgpKQorICAgICAgICAgICAgYXR0cnMuc2V0UmVzb3VyY2VUeXBlKCIiKTsKKyAgICAgICAgYXR0cnMuc2V0Q29udGVudExlbmd0aCh6aXBFbnRyeS5nZXRTaXplKCkpOworICAgICAgICBhdHRycy5zZXRMYXN0TW9kaWZpZWQoemlwRW50cnkuZ2V0VGltZSgpKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBhdHRyczsKKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBvYmplY3QuIFRoZSBvcmRlciBvZiAKKyAgICAgKiB0aGUgbW9kaWZpY2F0aW9ucyBpcyBub3Qgc3BlY2lmaWVkLiBXaGVyZSBwb3NzaWJsZSwgdGhlIG1vZGlmaWNhdGlvbnMgCisgICAgICogYXJlIHBlcmZvcm1lZCBhdG9taWNhbGx5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2UgYXR0cmlidXRlcyB3aWxsIGJlIHVwZGF0ZWQKKyAgICAgKiBAcGFyYW0gbW9kX29wIHRoZSBtb2RpZmljYXRpb24gb3BlcmF0aW9uLCBvbmUgb2Y6IEFERF9BVFRSSUJVVEUsIAorICAgICAqIFJFUExBQ0VfQVRUUklCVVRFLCBSRU1PVkVfQVRUUklCVVRFCisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIHRvIGJlIHVzZWQgZm9yIHRoZSBtb2RpZmljYXRpb247IG1heSBub3QgCisgICAgICogYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gQXR0cmlidXRlTW9kaWZpY2F0aW9uRXhjZXB0aW9uIGlmIHRoZSBtb2RpZmljYXRpb24gY2Fubm90IGJlCisgICAgICogY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1vZGlmeUF0dHJpYnV0ZXMoU3RyaW5nIG5hbWUsIGludCBtb2Rfb3AsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBvYmplY3QgdXNpbmcgYW4gYW4gCisgICAgICogb3JkZXJlZCBsaXN0IG9mIG1vZGlmaWNhdGlvbnMuIFRoZSBtb2RpZmljYXRpb25zIGFyZSBwZXJmb3JtZWQgaW4gdGhlIAorICAgICAqIG9yZGVyIHNwZWNpZmllZC4gRWFjaCBtb2RpZmljYXRpb24gc3BlY2lmaWVzIGEgbW9kaWZpY2F0aW9uIG9wZXJhdGlvbiAKKyAgICAgKiBjb2RlIGFuZCBhbiBhdHRyaWJ1dGUgb24gd2hpY2ggdG8gb3BlcmF0ZS4gV2hlcmUgcG9zc2libGUsIHRoZSAKKyAgICAgKiBtb2RpZmljYXRpb25zIGFyZSBwZXJmb3JtZWQgYXRvbWljYWxseS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIGF0dHJpYnV0ZXMgd2lsbCBiZSB1cGRhdGVkCisgICAgICogQHBhcmFtIG1vZHMgYW4gb3JkZXJlZCBzZXF1ZW5jZSBvZiBtb2RpZmljYXRpb25zIHRvIGJlIHBlcmZvcm1lZDsgbWF5IAorICAgICAqIG5vdCBiZSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBBdHRyaWJ1dGVNb2RpZmljYXRpb25FeGNlcHRpb24gaWYgdGhlIG1vZGlmaWNhdGlvbiBjYW5ub3QgYmUKKyAgICAgKiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgbW9kaWZ5QXR0cmlidXRlcyhTdHJpbmcgbmFtZSwgTW9kaWZpY2F0aW9uSXRlbVtdIG1vZHMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5hbWUgdG8gYW4gb2JqZWN0LCBhbG9uZyB3aXRoIGFzc29jaWF0ZWQgYXR0cmlidXRlcy4gSWYgYXR0cnMgCisgICAgICogaXMgbnVsbCwgdGhlIHJlc3VsdGluZyBiaW5kaW5nIHdpbGwgaGF2ZSB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIAorICAgICAqIHdpdGggb2JqIGlmIG9iaiBpcyBhIERpckNvbnRleHQsIGFuZCBubyBhdHRyaWJ1dGVzIG90aGVyd2lzZS4gSWYgYXR0cnMgCisgICAgICogaXMgbm9uLW51bGwsIHRoZSByZXN1bHRpbmcgYmluZGluZyB3aWxsIGhhdmUgYXR0cnMgYXMgaXRzIGF0dHJpYnV0ZXM7IAorICAgICAqIGFueSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBvYmogYXJlIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBiaW5kaW5nCisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgc29tZSAibWFuZGF0b3J5IiBhdHRyaWJ1dGVzIAorICAgICAqIG9mIHRoZSBiaW5kaW5nIGFyZSBub3Qgc3VwcGxpZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdCwgYWxvbmcgd2l0aCBhc3NvY2lhdGVkIGF0dHJpYnV0ZXMsIAorICAgICAqIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBiaW5kaW5nLiBJZiBhdHRycyBpcyBudWxsIGFuZCBvYmogaXMgYSAKKyAgICAgKiBEaXJDb250ZXh0LCB0aGUgYXR0cmlidXRlcyBmcm9tIG9iaiBhcmUgdXNlZC4gSWYgYXR0cnMgaXMgbnVsbCBhbmQgb2JqIAorICAgICAqIGlzIG5vdCBhIERpckNvbnRleHQsIGFueSBleGlzdGluZyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0CisgICAgICogYWxyZWFkeSBib3VuZCBpbiB0aGUgZGlyZWN0b3J5IHJlbWFpbiB1bmNoYW5nZWQuIElmIGF0dHJzIGlzIG5vbi1udWxsLCAKKyAgICAgKiBhbnkgZXhpc3RpbmcgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdCBhbHJlYWR5IGJvdW5kIGluIAorICAgICAqIHRoZSBkaXJlY3RvcnkgYXJlIHJlbW92ZWQgYW5kIGF0dHJzIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgCisgICAgICogb2JqZWN0LiBJZiBvYmogaXMgYSBEaXJDb250ZXh0IGFuZCBhdHRycyBpcyBub24tbnVsbCwgdGhlIGF0dHJpYnV0ZXMgCisgICAgICogb2Ygb2JqIGFyZSBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgYmluZGluZworICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgc29tZSAibWFuZGF0b3J5IiBhdHRyaWJ1dGVzIAorICAgICAqIG9mIHRoZSBiaW5kaW5nIGFyZSBub3Qgc3VwcGxpZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWJpbmQoU3RyaW5nIG5hbWUsIE9iamVjdCBvYmosIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuZCBiaW5kcyBhIG5ldyBjb250ZXh0LCBhbG9uZyB3aXRoIGFzc29jaWF0ZWQgYXR0cmlidXRlcy4gCisgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBzdWJjb250ZXh0IHdpdGggdGhlIGdpdmVuIG5hbWUsIGJpbmRzIGl0IGluIAorICAgICAqIHRoZSB0YXJnZXQgY29udGV4dCAodGhhdCBuYW1lZCBieSBhbGwgYnV0IHRlcm1pbmFsIGF0b21pYyBjb21wb25lbnQgb2YgCisgICAgICogdGhlIG5hbWUpLCBhbmQgYXNzb2NpYXRlcyB0aGUgc3VwcGxpZWQgYXR0cmlidXRlcyB3aXRoIHRoZSBuZXdseSAKKyAgICAgKiBjcmVhdGVkIG9iamVjdC4gQWxsIGludGVybWVkaWF0ZSBhbmQgdGFyZ2V0IGNvbnRleHRzIG11c3QgYWxyZWFkeSAKKyAgICAgKiBleGlzdC4gSWYgYXR0cnMgaXMgbnVsbCwgdGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byAKKyAgICAgKiBDb250ZXh0LmNyZWF0ZVN1YmNvbnRleHQoKS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBjcmVhdGU7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dAorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dAorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBhdHRycyBkb2VzIG5vdCBjb250YWluIGFsbCAKKyAgICAgKiB0aGUgbWFuZGF0b3J5IGF0dHJpYnV0ZXMgcmVxdWlyZWQgZm9yIGNyZWF0aW9uCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIERpckNvbnRleHQgY3JlYXRlU3ViY29udGV4dChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgb2JqZWN0LiBUaGUgc2NoZW1hIAorICAgICAqIGRlc2NyaWJlcyBydWxlcyByZWdhcmRpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbmFtZXNwYWNlIGFuZCB0aGUgCisgICAgICogYXR0cmlidXRlcyBzdG9yZWQgd2l0aGluIGl0LiBUaGUgc2NoZW1hIHNwZWNpZmllcyB3aGF0IHR5cGVzIG9mIAorICAgICAqIG9iamVjdHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBkaXJlY3RvcnkgYW5kIHdoZXJlIHRoZXkgY2FuIGJlIGFkZGVkOyAKKyAgICAgKiB3aGF0IG1hbmRhdG9yeSBhbmQgb3B0aW9uYWwgYXR0cmlidXRlcyBhbiBvYmplY3QgY2FuIGhhdmUuIFRoZSByYW5nZSAKKyAgICAgKiBvZiBzdXBwb3J0IGZvciBzY2hlbWFzIGlzIGRpcmVjdG9yeS1zcGVjaWZpYy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIHNjaGVtYSBpcyB0byBiZSByZXRyaWV2ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0OyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgc2NoZW1hIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyQ29udGV4dCBnZXRTY2hlbWEoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgYSBjb250ZXh0IGNvbnRhaW5pbmcgdGhlIHNjaGVtYSBvYmplY3RzIG9mIHRoZSBuYW1lZCAKKyAgICAgKiBvYmplY3QncyBjbGFzcyBkZWZpbml0aW9ucy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIG9iamVjdCBjbGFzcyBkZWZpbml0aW9uIGlzIHRvIAorICAgICAqIGJlIHJldHJpZXZlZAorICAgICAqIEByZXR1cm4gdGhlIERpckNvbnRleHQgY29udGFpbmluZyB0aGUgbmFtZWQgb2JqZWN0J3MgY2xhc3MgCisgICAgICogZGVmaW5pdGlvbnM7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiBzY2hlbWEgbm90IHN1cHBvcnRlZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBEaXJDb250ZXh0IGdldFNjaGVtYUNsYXNzRGVmaW5pdGlvbihTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIGEgc2luZ2xlIGNvbnRleHQgZm9yIG9iamVjdHMgdGhhdCBjb250YWluIGEgc3BlY2lmaWVkIHNldCAKKyAgICAgKiBvZiBhdHRyaWJ1dGVzLCBhbmQgcmV0cmlldmVzIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIFRoZSBzZWFyY2ggaXMgCisgICAgICogcGVyZm9ybWVkIHVzaW5nIHRoZSBkZWZhdWx0IFNlYXJjaENvbnRyb2xzIHNldHRpbmdzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBtYXRjaGluZ0F0dHJpYnV0ZXMgdGhlIGF0dHJpYnV0ZXMgdG8gc2VhcmNoIGZvci4gSWYgZW1wdHkgb3IgCisgICAgICogbnVsbCwgYWxsIG9iamVjdHMgaW4gdGhlIHRhcmdldCBjb250ZXh0IGFyZSByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlc1RvUmV0dXJuIHRoZSBhdHRyaWJ1dGVzIHRvIHJldHVybi4gbnVsbCBpbmRpY2F0ZXMgCisgICAgICogdGhhdCBhbGwgYXR0cmlidXRlcyBhcmUgdG8gYmUgcmV0dXJuZWQ7IGFuIGVtcHR5IGFycmF5IGluZGljYXRlcyB0aGF0IAorICAgICAqIG5vbmUgYXJlIHRvIGJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBlbnVtZXJhdGlvbiBvZiBTZWFyY2hSZXN1bHQgb2JqZWN0cy4gRWFjaCAKKyAgICAgKiBTZWFyY2hSZXN1bHQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgaWRlbnRpZmllZCBieSBhdHRyaWJ1dGVzVG9SZXR1cm4gCisgICAgICogYW5kIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCwgbmFtZWQgcmVsYXRpdmUgdG8gdGhlIAorICAgICAqIGNvbnRleHQgbmFtZWQgYnkgbmFtZS4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIG1hdGNoaW5nQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGF0dHJpYnV0ZXNUb1JldHVybikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIGEgc2luZ2xlIGNvbnRleHQgZm9yIG9iamVjdHMgdGhhdCBjb250YWluIGEgc3BlY2lmaWVkIHNldCAKKyAgICAgKiBvZiBhdHRyaWJ1dGVzLiBUaGlzIG1ldGhvZCByZXR1cm5zIGFsbCB0aGUgYXR0cmlidXRlcyBvZiBzdWNoIG9iamVjdHMuIAorICAgICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8gc3VwcGx5aW5nIG51bGwgYXMgdGhlIGF0cmlidXRlc1RvUmV0dXJuIHBhcmFtZXRlciAKKyAgICAgKiB0byB0aGUgbWV0aG9kIHNlYXJjaChOYW1lLCBBdHRyaWJ1dGVzLCBTdHJpbmdbXSkuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIG1hdGNoaW5nQXR0cmlidXRlcyB0aGUgYXR0cmlidXRlcyB0byBzZWFyY2ggZm9yLiBJZiBlbXB0eSBvciAKKyAgICAgKiBudWxsLCBhbGwgb2JqZWN0cyBpbiB0aGUgdGFyZ2V0IGNvbnRleHQgYXJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBlbnVtZXJhdGlvbiBvZiBTZWFyY2hSZXN1bHQgb2JqZWN0cy4gRWFjaCAKKyAgICAgKiBTZWFyY2hSZXN1bHQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgaWRlbnRpZmllZCBieSBhdHRyaWJ1dGVzVG9SZXR1cm4gCisgICAgICogYW5kIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCwgbmFtZWQgcmVsYXRpdmUgdG8gdGhlIAorICAgICAqIGNvbnRleHQgbmFtZWQgYnkgbmFtZS4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIG1hdGNoaW5nQXR0cmlidXRlcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIHRoZSBuYW1lZCBjb250ZXh0IG9yIG9iamVjdCBmb3IgZW50cmllcyB0aGF0IHNhdGlzZnkgdGhlIAorICAgICAqIGdpdmVuIHNlYXJjaCBmaWx0ZXIuIFBlcmZvcm1zIHRoZSBzZWFyY2ggYXMgc3BlY2lmaWVkIGJ5IHRoZSBzZWFyY2ggCisgICAgICogY29udHJvbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgb3Igb2JqZWN0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBmaWx0ZXIgdGhlIGZpbHRlciBleHByZXNzaW9uIHRvIHVzZSBmb3IgdGhlIHNlYXJjaDsgbWF5IG5vdCBiZSAKKyAgICAgKiBudWxsCisgICAgICogQHBhcmFtIGNvbnMgdGhlIHNlYXJjaCBjb250cm9scyB0aGF0IGNvbnRyb2wgdGhlIHNlYXJjaC4gSWYgbnVsbCwgCisgICAgICogdGhlIGRlZmF1bHQgc2VhcmNoIGNvbnRyb2xzIGFyZSB1c2VkIChlcXVpdmFsZW50IHRvIAorICAgICAqIChuZXcgU2VhcmNoQ29udHJvbHMoKSkpLgorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0cyBvZiB0aGUgb2JqZWN0cyB0aGF0IHNhdGlzZnkgCisgICAgICogdGhlIGZpbHRlcjsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZFNlYXJjaEZpbHRlckV4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGZpbHRlciBzcGVjaWZpZWQgCisgICAgICogaXMgbm90IHN1cHBvcnRlZCBvciB1bmRlcnN0b29kIGJ5IHRoZSB1bmRlcmx5aW5nIGRpcmVjdG9yeQorICAgICAqIEBleGNlcHRpb24gSW52YWxpZFNlYXJjaENvbnRyb2xzRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggY29udHJvbHMgCisgICAgICogY29udGFpbiBpbnZhbGlkIHNldHRpbmdzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbHRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hDb250cm9scyBjb25zKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgaW4gdGhlIG5hbWVkIGNvbnRleHQgb3Igb2JqZWN0IGZvciBlbnRyaWVzIHRoYXQgc2F0aXNmeSB0aGUgCisgICAgICogZ2l2ZW4gc2VhcmNoIGZpbHRlci4gUGVyZm9ybXMgdGhlIHNlYXJjaCBhcyBzcGVjaWZpZWQgYnkgdGhlIHNlYXJjaCAKKyAgICAgKiBjb250cm9scy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBvciBvYmplY3QgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIGZpbHRlckV4cHIgdGhlIGZpbHRlciBleHByZXNzaW9uIHRvIHVzZSBmb3IgdGhlIHNlYXJjaC4gCisgICAgICogVGhlIGV4cHJlc3Npb24gbWF5IGNvbnRhaW4gdmFyaWFibGVzIG9mIHRoZSBmb3JtICJ7aX0iIHdoZXJlIGkgaXMgYSAKKyAgICAgKiBub25uZWdhdGl2ZSBpbnRlZ2VyLiBNYXkgbm90IGJlIG51bGwuCisgICAgICogQHBhcmFtIGZpbHRlckFyZ3MgdGhlIGFycmF5IG9mIGFyZ3VtZW50cyB0byBzdWJzdGl0dXRlIGZvciB0aGUgCisgICAgICogdmFyaWFibGVzIGluIGZpbHRlckV4cHIuIFRoZSB2YWx1ZSBvZiBmaWx0ZXJBcmdzW2ldIHdpbGwgcmVwbGFjZSBlYWNoIAorICAgICAqIG9jY3VycmVuY2Ugb2YgIntpfSIuIElmIG51bGwsIGVxdWl2YWxlbnQgdG8gYW4gZW1wdHkgYXJyYXkuCisgICAgICogQHBhcmFtIGNvbnMgdGhlIHNlYXJjaCBjb250cm9scyB0aGF0IGNvbnRyb2wgdGhlIHNlYXJjaC4gSWYgbnVsbCwgdGhlIAorICAgICAqIGRlZmF1bHQgc2VhcmNoIGNvbnRyb2xzIGFyZSB1c2VkIChlcXVpdmFsZW50IHRvIChuZXcgU2VhcmNoQ29udHJvbHMoKSkpLgorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0cyBvZiB0aGUgb2JqZWN0cyB0aGF0IHNhdGlzeSB0aGUgCisgICAgICogZmlsdGVyOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgZmlsdGVyRXhwciBjb250YWlucyB7aX0gCisgICAgICogZXhwcmVzc2lvbnMgd2hlcmUgaSBpcyBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlIGFycmF5IGZpbHRlckFyZ3MKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hDb250cm9sc0V4Y2VwdGlvbiBpZiBjb25zIGNvbnRhaW5zIGludmFsaWQgCisgICAgICogc2V0dGluZ3MKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hGaWx0ZXJFeGNlcHRpb24gaWYgZmlsdGVyRXhwciB3aXRoIGZpbHRlckFyZ3MgCisgICAgICogcmVwcmVzZW50cyBhbiBpbnZhbGlkIHNlYXJjaCBmaWx0ZXIKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoKFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsdGVyRXhwciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBmaWx0ZXJBcmdzLCBTZWFyY2hDb250cm9scyBjb25zKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIE5vcm1hbGl6ZSB0aGUgbmFtZSBvZiBhbiBlbnRyeSByZWFkIGZyb20gdGhlIFppcC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5vcm1hbGl6ZShaaXBFbnRyeSBlbnRyeSkgeworCisgICAgICAgIFN0cmluZyByZXN1bHQgPSAiLyIgKyBlbnRyeS5nZXROYW1lKCk7CisgICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDAsIHJlc3VsdC5sZW5ndGgoKSAtIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB0cmVlIG9mIHRoZSBlbnRyaWVzIGNvbnRhaW5lZCBpbiBhIFdBUiBmaWxlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGxvYWRFbnRyaWVzKCkgeworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudHJ5TGlzdCA9IGJhc2UuZW50cmllcygpOworICAgICAgICAgICAgZW50cmllcyA9IG5ldyBFbnRyeSgiLyIsIG5ldyBaaXBFbnRyeSgiLyIpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgd2hpbGUgKGVudHJ5TGlzdC5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlbnRyeUxpc3QubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5vcm1hbGl6ZShlbnRyeSk7CisgICAgICAgICAgICAgICAgaW50IHBvcyA9IG5hbWUubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHBhcmVudCBlbnRyaWVzIGV4aXN0IGFuZCwgaWYgbm90LCBjcmVhdGUgdGhlbS4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGZpeGVzIGEgYnVnIGZvciB3YXIgZmlsZXMgdGhhdCBkb24ndCByZWNvcmQgc2VwYXJhdGUKKyAgICAgICAgICAgICAgICAvLyB6aXAgZW50cmllcyBmb3IgdGhlIGRpcmVjdG9yaWVzLgorICAgICAgICAgICAgICAgIGludCBjdXJyZW50UG9zID0gLTE7CisgICAgICAgICAgICAgICAgaW50IGxhc3RQb3MgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlICgoY3VycmVudFBvcyA9IG5hbWUuaW5kZXhPZignLycsIGxhc3RQb3MpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBOYW1lIHBhcmVudE5hbWUgPSBuZXcgQ29tcG9zaXRlTmFtZShuYW1lLnN1YnN0cmluZygwLCBsYXN0UG9zKSk7CisgICAgICAgICAgICAgICAgICAgIE5hbWUgY2hpbGROYW1lID0gbmV3IENvbXBvc2l0ZU5hbWUobmFtZS5zdWJzdHJpbmcoMCwgY3VycmVudFBvcykpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gbmFtZS5zdWJzdHJpbmcobGFzdFBvcywgY3VycmVudFBvcyk7CisgICAgICAgICAgICAgICAgICAgIC8vIFBhcmVudCBzaG91bGQgaGF2ZSBiZWVuIGNyZWF0ZWQgaW4gbGFzdCBjeWNsZSB0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbG9vcAorICAgICAgICAgICAgICAgICAgICBFbnRyeSBwYXJlbnQgPSB0cmVlTG9va3VwKHBhcmVudE5hbWUpOworICAgICAgICAgICAgICAgICAgICBFbnRyeSBjaGlsZCA9IHRyZWVMb29rdXAoY2hpbGROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBlbnRyeSBmb3IgbWlzc2luZyBlbnRyeSBhbmQgc3RyaXAgb2ZmCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGVhZGluZyAnLycgY2hhcmFjdGVyIGFuZCBhcHBlbmRlZCBvbiBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSBtZXRob2QgYW5kIGFkZCAnLycgY2hhcmFjdGVyIHRvIGVuZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmlmeSB0aGF0IGl0IGlzIGEgZGlyZWN0b3J5IGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgemlwTmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEsIGN1cnJlbnRQb3MpICsgIi8iOworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBuZXcgRW50cnkoZW50cnlOYW1lLCBuZXcgWmlwRW50cnkoemlwTmFtZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5hZGRDaGlsZChjaGlsZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IGxhc3RQb3MKKyAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGN1cnJlbnRQb3MgKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gbmFtZS5zdWJzdHJpbmcocG9zICsgMSwgbmFtZS5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgTmFtZSBjb21wb3NpdGVOYW1lID0gbmV3IENvbXBvc2l0ZU5hbWUobmFtZS5zdWJzdHJpbmcoMCwgcG9zKSk7CisgICAgICAgICAgICAgICAgRW50cnkgcGFyZW50ID0gdHJlZUxvb2t1cChjb21wb3NpdGVOYW1lKTsKKyAgICAgICAgICAgICAgICBFbnRyeSBjaGlsZCA9IG5ldyBFbnRyeShlbnRyeU5hbWUsIGVudHJ5KTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHBhcmVudC5hZGRDaGlsZChjaGlsZCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnRyeSB0cmVlIGxvb2t1cC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRW50cnkgdHJlZUxvb2t1cChOYW1lIG5hbWUpIHsKKyAgICAgICAgaWYgKG5hbWUuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGVudHJpZXM7CisgICAgICAgIEVudHJ5IGN1cnJlbnRFbnRyeSA9IGVudHJpZXM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKG5hbWUuZ2V0KGkpLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjdXJyZW50RW50cnkgPSBjdXJyZW50RW50cnkuZ2V0Q2hpbGQobmFtZS5nZXQoaSkpOworICAgICAgICAgICAgaWYgKGN1cnJlbnRFbnRyeSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50RW50cnk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMaXN0IGNoaWxkcmVuIGFzIG9iamVjdHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBsaXN0KEVudHJ5IGVudHJ5KSB7CisgICAgICAgIAorICAgICAgICBBcnJheUxpc3QgZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgRW50cnlbXSBjaGlsZHJlbiA9IGVudHJ5LmdldENoaWxkcmVuKCk7CisgICAgICAgIEFycmF5cy5zb3J0KGNoaWxkcmVuKTsKKyAgICAgICAgTmFtaW5nRW50cnkgbmFtaW5nRW50cnkgPSBudWxsOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgWmlwRW50cnkgY3VycmVudCA9IGNoaWxkcmVuW2ldLmdldEVudHJ5KCk7CisgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChjdXJyZW50LmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgV0FSRGlyQ29udGV4dChiYXNlLCBjaGlsZHJlbltpXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBXQVJSZXNvdXJjZShjdXJyZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWluZ0VudHJ5ID0gbmV3IE5hbWluZ0VudHJ5CisgICAgICAgICAgICAgICAgKGNoaWxkcmVuW2ldLmdldE5hbWUoKSwgb2JqZWN0LCBOYW1pbmdFbnRyeS5FTlRSWSk7CisgICAgICAgICAgICBlbnRyaWVzLmFkZChuYW1pbmdFbnRyeSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBlbnRyaWVzOworICAgICAgICAKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW50cmllcyBJbm5lciBDbGFzcworCisKKyAgICAvKioKKyAgICAgKiBFbnRyaWVzIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgY2xhc3MgRW50cnkgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKKworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgcHVibGljIEVudHJ5KFN0cmluZyBuYW1lLCBaaXBFbnRyeSBlbnRyeSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMuZW50cnkgPSBlbnRyeTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNZW1iZXIgVmFyaWFibGVzCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgWmlwRW50cnkgZW50cnkgPSBudWxsOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCBFbnRyeSBjaGlsZHJlbltdID0gbmV3IEVudHJ5WzBdOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBFbnRyeSkpCisgICAgICAgICAgICAgICAgcmV0dXJuICgrMSk7CisgICAgICAgICAgICByZXR1cm4gKG5hbWUuY29tcGFyZVRvKCgoRW50cnkpIG8pLmdldE5hbWUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFppcEVudHJ5IGdldEVudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChFbnRyeSBlbnRyeSkgeworICAgICAgICAgICAgRW50cnlbXSBuZXdDaGlsZHJlbiA9IG5ldyBFbnRyeVtjaGlsZHJlbi5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW5baV0gPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgIG5ld0NoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aF0gPSBlbnRyeTsKKyAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3Q2hpbGRyZW47CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBFbnRyeVtdIGdldENoaWxkcmVuKCkgeworICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgRW50cnkgZ2V0Q2hpbGQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0ubmFtZS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdBUlJlc291cmNlIElubmVyIENsYXNzCisKKworICAgIC8qKgorICAgICAqIFRoaXMgc3BlY2lhbGl6ZWQgcmVzb3VyY2UgaW1wbGVtZW50YXRpb24gYXZvaWRzIG9wZW5pbmcgdGhlIElwdXRTdHJlYW0KKyAgICAgKiB0byB0aGUgV0FSIHJpZ2h0IGF3YXkuCisgICAgICovCisgICAgcHJvdGVjdGVkIGNsYXNzIFdBUlJlc291cmNlIGV4dGVuZHMgUmVzb3VyY2UgeworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgcHVibGljIFdBUlJlc291cmNlKFppcEVudHJ5IGVudHJ5KSB7CisgICAgICAgICAgICB0aGlzLmVudHJ5ID0gZW50cnk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWVtYmVyIFZhcmlhYmxlcworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCBaaXBFbnRyeSBlbnRyeTsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb250ZW50IGFjY2Vzc29yLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBJbnB1dFN0cmVhbQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIElucHV0U3RyZWFtIHN0cmVhbUNvbnRlbnQoKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGJpbmFyeUNvbnRlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IGJhc2UuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdXBlci5zdHJlYW1Db250ZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL2puZGkvSGFuZGxlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvam5kaS9IYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ1NjhiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL2puZGkvSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuam5kaTsKKworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5EaXJDb250ZXh0VVJMU3RyZWFtSGFuZGxlcjsKKworLyoqCisgKiBTdHJlYW0gaGFuZGxlciB0byBhIEpOREkgZGlyZWN0b3J5IGNvbnRleHQuCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnJlbW1AYXBhY2hlLm9yZyI+UmVteSBNYXVjaGVyYXQ8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBIYW5kbGVyIAorICAgIGV4dGVuZHMgRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXIgeworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworICAgIAorICAgIAorICAgIHB1YmxpYyBIYW5kbGVyKCkgeworICAgIH0KKyAgICAKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL3BhY2thZ2UuaHRtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmRjNTZhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzxib2R5PgorCis8cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIHJlc291cmNlcyBkaXJlY3RvcnkgY29udGV4dCBpbXBsZW1ldGF0aW9uLgorVGhpcyBpbmNsdWRlcyA6Cis8dWw+Cis8bGk+QSBDYWNoZURpckNvbnRleHQgd2hpY2ggaGFuZGxlcyBjYWNoaW5nIGFuZCBhY3RzIGFzIGEgcHJveHkgZm9yIHRoZSByZWFsIAorcmVzb3VyY2VzIGNvbnRleHQ8L2xpPgorPGxpPkEgRmlsZURpckNvbnRleHQsIGFuIGltcGxlbWVudGF0aW9uIG9mIERpckNvbnRleHQgdG8gYWNjZXNzIHRoZSAKK2ZpbGVzeXN0ZW08L2xpPgorPC91bD4KKzwvcD4KKworPHA+PC9wPgorCis8L2JvZHk+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3RlbXAvUkVBRE1FLnR4dCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvdGVtcC9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MTZjMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3RlbXAvUkVBRE1FLnR4dApAQCAtMCwwICsxLDUgQEAKK1RoaXMgdGVtcCBkaXJlY3RvcnkgaXMgdXNlZCBieSB0aGUgSlZNIGZvciB0ZW1wb3JhcnkgZmlsZSBzdG9yYWdlLgorVGhlIEpWTSBpcyBjb25maWd1cmVkIHRvIHVzZSB0aGlzIGFzIGl0cyBqYXZhLmlvLnRtcGRpciBpbiB0aGUKK2NhdGFsaW5hLnNoIGFuZCBjYXRhbGluYS5iYXQgc2NyaXB0cy4gIFRvbWNhdCBpcyBjb25maWd1cmVkIHRvIHVzZQordGhpcyB0ZW1wb3JhcnkgZGlyZWN0b3J5IHJhdGhlciB0aGFuIGl0cyBkZWZhdWx0IGZvciBzZWN1cml0eSByZWFzb25zLgorVGhlIHRlbXAgZGlyZWN0b3J5IG11c3QgZXhpc3QgZm9yIFRvbWNhdCB0byB3b3JrIGNvcnJlY3RseS4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQ29va2llVG9vbHNUZXN0Q2FzZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy90ZXN0L29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Db29raWVUb29sc1Rlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjYzkwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQ29va2llVG9vbHNUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisKKy8qKgorICogVW5pdCB0ZXN0cyBmb3IgdGhlIDxjb2RlPkNvb2tpZVRvb2xzPC9jb2RlPiBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvb2tpZVRvb2xzVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0Q2FzZSBzdGFydGVkIik7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIEEgInZlcnNpb24gMCIgY29va2llLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb29raWUgdmVyc2lvbjAgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBICJ2ZXJzaW9uIDEiIGNvb2tpZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29va2llIHZlcnNpb24xID0gbnVsbDsKKworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgdGVzdCBjYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdCBjYXNlCisgICAgICovCisgICAgcHVibGljIENvb2tpZVRvb2xzVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzdXBlcihuYW1lKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE92ZXJhbGwgVGVzdCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFNldCB1cCBpbnN0YW5jZSB2YXJpYWJsZXMgcmVxdWlyZWQgYnkgdGhpcyB0ZXN0IGNhc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisKKyAgICAgICAgdmVyc2lvbjAgPSBuZXcgQ29va2llKCJWZXJzaW9uIDAgTmFtZSIsICJWZXJzaW9uIDAgVmFsdWUiKTsKKyAgICAgICAgdmVyc2lvbjAuc2V0Q29tbWVudCgiVmVyc2lvbiAwIENvbW1lbnQiKTsKKyAgICAgICAgdmVyc2lvbjAuc2V0RG9tYWluKCJsb2NhbGhvc3QiKTsKKyAgICAgICAgdmVyc2lvbjAuc2V0UGF0aCgiL3ZlcnNpb24wIik7CisgICAgICAgIHZlcnNpb24wLnNldFZlcnNpb24oMCk7CisKKyAgICAgICAgdmVyc2lvbjEgPSBuZXcgQ29va2llKCJWZXJzaW9uIDEgTmFtZSIsICJWZXJzaW9uIDEgVmFsdWUiKTsKKyAgICAgICAgdmVyc2lvbjEuc2V0Q29tbWVudCgiVmVyc2lvbiAxIENvbW1lbnQiKTsKKyAgICAgICAgdmVyc2lvbjEuc2V0RG9tYWluKCJsb2NhbGhvc3QiKTsKKyAgICAgICAgdmVyc2lvbjEuc2V0UGF0aCgiL3ZlcnNpb24xIik7CisgICAgICAgIHZlcnNpb24xLnNldFZlcnNpb24oMSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGVzdHMgaW5jbHVkZWQgaW4gdGhpcyB0ZXN0IHN1aXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKworICAgICAgICByZXR1cm4gKG5ldyBUZXN0U3VpdGUoQ29va2llVG9vbHNUZXN0Q2FzZS5jbGFzcykpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZWFyIGRvd24gaW5zdGFuY2UgdmFyaWFibGVzIHJlcXVpcmVkIGJ5IHRoaXMgdGVzdCBjYXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworCisgICAgICAgIHZlcnNpb24wID0gbnVsbDsKKyAgICAgICAgdmVyc2lvbjEgPSBudWxsOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5kaXZpZHVhbCBUZXN0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIHZhbHVlIHJldHVybmVkIGJ5IDxjb2RlPmdldENvb2tpZUhlYWRlck5hbWUoKTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldENvb2tpZUhlYWRlck5hbWUoKSB7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJWZXJzaW9uIDAgY29va2llIGhlYWRlciBuYW1lIiwgIlNldC1Db29raWUiLAorICAgICAgICAgICAgICAgICAgICAgQ29va2llVG9vbHMuZ2V0Q29va2llSGVhZGVyTmFtZSh2ZXJzaW9uMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlZlcnNpb24gMSBjb29raWUgaGVhZGVyIG5hbWUiLCAiU2V0LUNvb2tpZTIiLAorICAgICAgICAgICAgICAgICAgICAgQ29va2llVG9vbHMuZ2V0Q29va2llSGVhZGVyTmFtZSh2ZXJzaW9uMSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0Q29va2llSGVhZGVyVmFsdWUoKTwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29va2llSGVhZGVyVmFsdWUoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbnVsbDsKKworICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgQ29va2llVG9vbHMuZ2V0Q29va2llSGVhZGVyVmFsdWUodmVyc2lvbjAsIHNiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJWZXJzaW9uIDAgY29va2llIGhlYWRlciB2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAiVmVyc2lvbiAwIE5hbWU9VmVyc2lvbiAwIFZhbHVlO0RvbWFpbj1sb2NhbGhvc3Q7UGF0aD0vdmVyc2lvbjAiLAorICAgICAgICAgICAgICAgICAgICAgc2IudG9TdHJpbmcoKSk7CisKKyAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIENvb2tpZVRvb2xzLmdldENvb2tpZUhlYWRlclZhbHVlKHZlcnNpb24xLCBzYik7CisgICAgICAgIGFzc2VydEVxdWFscygiVmVyc2lvbiAxIGNvb2tpZSBoZWFkZXIgdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgIlZlcnNpb24gMSBOYW1lPVwiVmVyc2lvbiAxIFZhbHVlXCI7VmVyc2lvbj0xO0NvbW1lbnQ9XCJWZXJzaW9uIDEgQ29tbWVudFwiO0RvbWFpbj1sb2NhbGhvc3Q7RGlzY2FyZDtQYXRoPVwiL3ZlcnNpb24xXCIiLAorICAgICAgICAgICAgICAgICAgICAgc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy90ZXN0L29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9VUkxUZXN0Q2FzZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy90ZXN0L29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9VUkxUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOWVkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1VSTFRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSw2NDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisKKy8qKgorICogVW5pdCB0ZXN0cyBmb3IgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5VUkw8L2NvZGU+IGNsYXNzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVVJMVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgdGVzdCBjYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdCBjYXNlCisgICAgICovCisgICAgcHVibGljIFVSTFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3VwZXIobmFtZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPdmVyYWxsIFRlc3QgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgaW5zdGFuY2UgdmFyaWFibGVzIHJlcXVpcmVkIGJ5IHRoaXMgdGVzdCBjYXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworCisgICAgICAgIDsgLy8gTm8gYWN0aW9uIHJlcXVpcmVkCisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGVzdHMgaW5jbHVkZWQgaW4gdGhpcyB0ZXN0IHN1aXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKworICAgICAgICByZXR1cm4gKG5ldyBUZXN0U3VpdGUoVVJMVGVzdENhc2UuY2xhc3MpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVhciBkb3duIGluc3RhbmNlIHZhcmlhYmxlcyByZXF1aXJlZCBieSB0aGlzIHRlc3QgY2FzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKworICAgICAgICA7IC8vIE5vIGFjdGlvbiByZXF1aXJlZAorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5kaXZpZHVhbCBUZXN0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogTmVnYXRpdmUgdGVzdHMgZm9yIGFic29sdXRlIFVSTCBzdHJpbmdzIGluIHZhcmlvdXMgcGF0dGVybnMuICBFYWNoIG9mCisgICAgICogdGhlc2Ugc2hvdWxkIHRocm93IDxjb2RlPk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5lZ2F0aXZlQWJzb2x1dGUoKSB7CisKKyAgICAgICAgbmVnYXRpdmUoImluZGV4Lmh0bWwiKTsKKyAgICAgICAgbmVnYXRpdmUoImluZGV4Lmh0bWwjcmVmIik7CisgICAgICAgIG5lZ2F0aXZlKCJpbmRleC5odG1sP25hbWU9dmFsdWUiKTsKKyAgICAgICAgbmVnYXRpdmUoImluZGV4Lmh0bWw/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBuZWdhdGl2ZSgiL2luZGV4Lmh0bWwiKTsKKyAgICAgICAgbmVnYXRpdmUoIi9pbmRleC5odG1sI3JlZiIpOworICAgICAgICBuZWdhdGl2ZSgiL2luZGV4Lmh0bWw/bmFtZT12YWx1ZSIpOworICAgICAgICBuZWdhdGl2ZSgiL2luZGV4Lmh0bWw/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTmVnYXRpdmUgdGVzdHMgZm9yIDxjb2RlPm5vcm1hbGl6ZSgpPC9jb2RlPi4gIEF0dGVtcHRzIHRvIG5vcm1hbGl6ZQorICAgICAqIHRoZXNlIGxlZ2FsIFVSTHMgc2hvdWxkIHRocm93IDxjb2RlPk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5lZ2F0aXZlTm9ybWFsaXplKCkgeworCisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC8uLiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvLi4jcmVmIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC8uLj9uYW1lPXZhbHVlIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC8uLj9uYW1lPXZhbHVlI3JlZiIpOworCisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLy4uIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLy4uI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8uLj9uYW1lPXZhbHVlIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLy4uP25hbWU9dmFsdWUjcmVmIik7CisgCisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC8uLi8iKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0Ly4uLyNyZWYiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0Ly4uLz9uYW1lPXZhbHVlIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC8uLi8/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8uLi8iKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvLi4vI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8uLi8/bmFtZT12YWx1ZSIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8uLi8/bmFtZT12YWx1ZSNyZWYiKTsKKyAKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLi4vLi4vZm9vLmh0bWwiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLi4vLi4vZm9vLmh0bWwjcmVmIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLy4uLy4uL2Zvby5odG1sP25hbWU9dmFsdWUiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLi4vLi4vZm9vLmh0bWw/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4uLy4uL2Zvby5odG1sIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvLi4vLi4vZm9vLmh0bWwjcmVmIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvLi4vLi4vZm9vLmh0bWw/bmFtZT12YWx1ZSIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4uLy4uL2Zvby5odG1sP25hbWU9dmFsdWUjcmVmIik7CisgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBOZWdhdGl2ZSB0ZXN0cyBmb3IgcmVsYXRpdmUgVVJMIHN0cmluZ3MgaW4gdmFyaW91cyBwYXR0ZXJucy4gIEVhY2ggb2YKKyAgICAgKiB0aGVzZSBzaG91bGQgdGhyb3cgPGNvZGU+TWFsZm9ybWVkVVJMRXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVnYXRpdmVSZWxhdGl2ZSgpIHsKKworICAgICAgICAvLyBDb21tZW50ZWQgb3V0IGJlY2F1c2UgamF2YS5uZXQuVVJMIGlnbm9yZXMgZXh0cmFuZW91cyAiLi4vIgorICAgICAgICAvLyAgICAgICAgbmVnYXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICIuLi8uLi8uLi9nIik7CisgICAgICAgIC8vICAgICAgICBuZWdhdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi8uLi9nIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBvc2l0aXZlIHRlc3RzIGZvciBhYnNvbHV0ZSBVUkwgc3RyaW5ncyBpbiB2YXJpb3VzIHBhdHRlcm5zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQb3NpdGl2ZUFic29sdXRlKCkgeworCisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiKTsKKworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwjcmVmIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWw/bmFtZT12YWx1ZSIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbCNyZWYiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sP25hbWU9dmFsdWUiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8uIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLiNyZWYiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8uP25hbWU9dmFsdWUiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8uP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4iKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4jcmVmIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8uP25hbWU9dmFsdWUiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sL2Zvby8uLiIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sL2Zvby8uLiNyZWYiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC9mb28vLi4/bmFtZT12YWx1ZSIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sL2Zvby8uLj9uYW1lPXZhbHVlI3JlZiIpOworCisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC9mb28vLi4iKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sL2Zvby8uLiNyZWYiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sL2Zvby8uLj9uYW1lPXZhbHVlIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC9mb28vLi4/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLy4uL2Zvby5odG1sIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLi4vZm9vLmh0bWwjcmVmIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLi4vZm9vLmh0bWw/bmFtZT12YWx1ZSIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLy4uL2Zvby5odG1sP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4uL2Zvby5odG1sIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8uLi9mb28uaHRtbCNyZWYiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4uL2Zvby5odG1sP25hbWU9dmFsdWUiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4uL2Zvby5odG1sP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QjcmVmIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0P25hbWU9dmFsdWUiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0OjgwODAjcmVmIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0OjgwODA/bmFtZT12YWx1ZSIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QvIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0LyNyZWYiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QvP25hbWU9dmFsdWUiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QvP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8jcmVmIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvP25hbWU9dmFsdWUiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUG9zaXRpdmUgdGVzdHMgZm9yIG5vcm1hbGl6aW5nIGFic29sdXRlIFVSTCBzdHJpbmdzIGluIHZhcmlvdXMgcGF0dGVybnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBvc2l0aXZlTm9ybWFsaXplKCkgeworCisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vYS9iL2MvZDtwP3EiKTsKKworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbCIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbD9uYW1lPXZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWw/bmFtZT12YWx1ZSIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbD9uYW1lPXZhbHVlI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbCIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbCNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sP25hbWU9dmFsdWUiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sP25hbWU9dmFsdWUiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbD9uYW1lPXZhbHVlI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWw/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvLi9pbmRleC5odG1sIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0Ly4vaW5kZXguaHRtbCNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbCNyZWYiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0Ly4vaW5kZXguaHRtbD9uYW1lPXZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWw/bmFtZT12YWx1ZSIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvLi9pbmRleC5odG1sP25hbWU9dmFsdWUjcmVmIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWw/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8uL2luZGV4Lmh0bWwiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLy4vaW5kZXguaHRtbCNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8uL2luZGV4Lmh0bWw/bmFtZT12YWx1ZSIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWw/bmFtZT12YWx1ZSIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8uL2luZGV4Lmh0bWw/bmFtZT12YWx1ZSNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLyIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8uI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLyNyZWYiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLj9uYW1lPXZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvP25hbWU9dmFsdWUiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLj9uYW1lPXZhbHVlI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLz9uYW1lPXZhbHVlI3JlZiIpOworCisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvLiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvLiNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLyNyZWYiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8uP25hbWU9dmFsdWUiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLz9uYW1lPXZhbHVlIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvLj9uYW1lPXZhbHVlI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLi8iLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8iKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLi8jcmVmIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8uLz9uYW1lPXZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvP25hbWU9dmFsdWUiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLi8/bmFtZT12YWx1ZSNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4vIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8iKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8uLyNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLyNyZWYiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8uLz9uYW1lPXZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8/bmFtZT12YWx1ZSIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4vP25hbWU9dmFsdWUjcmVmIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvZm9vLmh0bWwvLi4vaW5kZXguaHRtbCIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC9mb28uaHRtbC8uLi9pbmRleC5odG1sI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvZm9vLmh0bWwvLi4vaW5kZXguaHRtbD9uYW1lPXZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWw/bmFtZT12YWx1ZSIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvZm9vLmh0bWwvLi4vaW5kZXguaHRtbD9uYW1lPXZhbHVlI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvZm9vLmh0bWwvLi4vaW5kZXguaHRtbCIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvZm9vLmh0bWwvLi4vaW5kZXguaHRtbCNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9mb28uaHRtbC8uLi9pbmRleC5odG1sP25hbWU9dmFsdWUiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sP25hbWU9dmFsdWUiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvZm9vLmh0bWwvLi4vaW5kZXguaHRtbD9uYW1lPXZhbHVlI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWw/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC9mb28uaHRtbC8uLiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLyIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC9mb28uaHRtbC8uLiNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8jcmVmIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sL2Zvby5odG1sLy4uP25hbWU9dmFsdWUiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8/bmFtZT12YWx1ZSIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC9mb28uaHRtbC8uLj9uYW1lPXZhbHVlI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLz9uYW1lPXZhbHVlI3JlZiIpOworCisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvZm9vLmh0bWwvLi4iLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLyIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sL2Zvby5odG1sLy4uI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sL2Zvby5odG1sLy4uP25hbWU9dmFsdWUiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLz9uYW1lPXZhbHVlIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvZm9vLmh0bWwvLi4/bmFtZT12YWx1ZSNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLz9uYW1lPXZhbHVlI3JlZiIpOworCisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sL2Zvby5odG1sLy4uLyIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLyIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC9mb28uaHRtbC8uLi8jcmVmIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC9mb28uaHRtbC8uLi8/bmFtZT12YWx1ZSIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLz9uYW1lPXZhbHVlIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sL2Zvby5odG1sLy4uLz9uYW1lPXZhbHVlI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLz9uYW1lPXZhbHVlI3JlZiIpOworCisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvZm9vLmh0bWwvLi4vIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8iKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC9mb28uaHRtbC8uLi8jcmVmIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8jcmVmIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvZm9vLmh0bWwvLi4vP25hbWU9dmFsdWUiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLz9uYW1lPXZhbHVlIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvZm9vLmh0bWwvLi4vP25hbWU9dmFsdWUjcmVmIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUG9zaXRpdmUgdGVzdHMgZm9yIHJlbGF0aXZlIFVSTCBzdHJpbmdzIGluIHZhcmlvdXMgcGF0dGVybnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBvc2l0aXZlUmVsYXRpdmUoKSB7CisKKyAgICAgICAgLy8gVGVzdCBjYXNlcyBiYXNlZCBvbiBSRkMgMjM5NiwgQXBwZW5kaXggQworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgImh0dHA6aCIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgImciKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICIuL2ciKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICJnLyIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi9nIik7CisgICAgICAgIC8vICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi8vZyIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIj95Iik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiZz95Iik7CisgICAgICAgIC8vICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIiNzIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiZyNzIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiZz95I3MiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICI7eCIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgImc7eCIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgImc7eD95I3MiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICIuIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiLi8iKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICIuLiIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi4uLyIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi4uL2ciKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICIuLi8uLiIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi4uLy4uLyIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi4uLy4uL2ciKTsKKyAgICAgICAgLy8gQ29tbWVudGVkIGJlY2F1c2UgamF2YS5uZXQuVVJMIGRvZXNuJ3Qgbm9ybWFsaXplIG91dCB0aGUgIi8uLyI/Pz8/CisgICAgICAgIC8vICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi8uL2ciKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICJnLiIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi5nIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiZy4uIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiLi5nIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiLi8uLi9nIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiLi9nLy4iKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICJnLy4vaCIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgImcvLi4vaCIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgImc7eD0xLy4veSIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgImc7eD0xLy4uL3kiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICJnP3kvLi94Iik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiZz95Ly4uL3giKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICJnI3MvLi94Iik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiZyNzLy4uL3giKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IiLCAiYyIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi8iLCAiYyIpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhhdCBib3RoIG91ciBVUkwgY2xhc3MgYW5kIDxjb2RlPmphdmEubmV0LlVSTDwvY29kZT4gdGhyb3cKKyAgICAgKiA8Y29kZT5NYWxmb3JtZWRVUkxFeGNlcHRpb248L2NvZGU+IG9uIGFuIGFic29sdXRlIFVSTCBzcGVjaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNwZWMgQWJzb2x1dGUgVVJMIHNwZWNpZmljYXRpb24gdG8gYmUgY2hlY2tlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBuZWdhdGl2ZShTdHJpbmcgc3BlYykgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqYXZhLm5ldC5VUkwgdXJsID0gbmV3IGphdmEubmV0LlVSTChzcGVjKTsKKyAgICAgICAgICAgIGZhaWwoc3BlYyArICIgc2hvdWxkIGhhdmUgZmFpbGVkIG9uIGphdmEubmV0LlVSTCAiICsKKyAgICAgICAgICAgICAgICAgImJ1dCByZXR1cm5lZCAiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgOyAvLyBFeHBlY3RlZCByZXNwb25zZQorICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHNwZWMpOworICAgICAgICAgICAgZmFpbChzcGVjICsgIiBzaG91bGQgaGF2ZSBmYWlsZWQgb24gdGVzdGVkIFVSTCAiICsKKyAgICAgICAgICAgICAgICAgImJ1dCByZXR1cm5lZCAiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgOyAvLyBFeHBlY3RlZCByZXNwb25zZQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIHRoYXQgYm90aCBvdXIgVVJMIGNsYXNzIGFuZCA8Y29kZT5qYXZhLm5ldC5VUkw8L2NvZGU+IHRocm93CisgICAgICogPGNvZGU+TWFsZm9ybWVkVVJMRXhjZXB0aW9uPC9jb2RlPiBvbiBhbiBhYnNvbHV0ZSBVUkwgc3BlY2lmaWNhdGlvbgorICAgICAqIHBsdXMgdGhlIGNvcnJlc3BvbmRpbmcgcmVsYXRpdmUgVVJMIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWJzIEFic29sdXRlIFVSTCBzcGVjaWZpY2F0aW9uIHRvIGJlIGNoZWNrZWQKKyAgICAgKiBAcGFyYW0gcmVsIFJlbGF0aXZlIFVSTCBzcGVjaWZpY2F0aW9uIHRvIGJlIGNoZWNrZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbmVnYXRpdmUoU3RyaW5nIGFicywgU3RyaW5nIHJlbCkgeworCisgICAgICAgIGphdmEubmV0LlVSTCBiYXNlTmV0ID0gbnVsbDsKKyAgICAgICAgVVJMIGJhc2VVcmwgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiYXNlTmV0ID0gbmV3IGphdmEubmV0LlVSTChhYnMpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChhYnMgKyAiIG5ldCBVUkwgdGhyZXcgIiArIGUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJhc2VVcmwgPSBuZXcgVVJMKGFicyk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGFicyArICIgdXJsIFVSTCB0aHJldyAiICsgZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgamF2YS5uZXQuVVJMIHVybCA9IG5ldyBqYXZhLm5ldC5VUkwoYmFzZU5ldCwgcmVsKTsKKyAgICAgICAgICAgIGZhaWwocmVsICsgIiBzaG91bGQgaGF2ZSBmYWlsZWQgb24gamF2YS5uZXQuVVJMICIgKworICAgICAgICAgICAgICAgICAiYnV0IHJldHVybmVkICIgKyB1cmwudG9FeHRlcm5hbEZvcm0oKSk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICA7IC8vIEV4cGVjdGVkIHJlc3BvbnNlCisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoYmFzZVVybCwgcmVsKTsKKyAgICAgICAgICAgIGZhaWwocmVsICsgIiBzaG91bGQgaGF2ZSBmYWlsZWQgb24gdGVzdGVkIFVSTCAiICsKKyAgICAgICAgICAgICAgICAgImJ1dCByZXR1cm5lZCAiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgOyAvLyBFeHBlY3RlZCByZXNwb25zZQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHRvIG5vcm1hbGl6ZSB0aGUgc3BlY2lmaWVkIFVSTCBzaG91bGQgdGhyb3cKKyAgICAgKiBNYWxmb3JtZWRVUkxFeGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3BlYyBVbm5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgVVJMIHNwZWNpZmljYXRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbm9ybWFsaXplKFN0cmluZyBzcGVjKSB7CisKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKHNwZWMpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZmFpbChzcGVjICsgIiBzaG91bGQgbm90IGhhdmUgdGhyb3duICIgKyB0KTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1cmwubm9ybWFsaXplKCk7CisgICAgICAgICAgICBmYWlsKHNwZWMgKyAiLm5vcm1hbGl6ZSgpIHNob3VsZCBoYXZlIHRocm93biBNVUUiKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIDsgLy8gRXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIG5vcm1hbGl6ZSB0aGUgc3BlY2lmaWVkIFVSTCBpbnRvIHRoZQorICAgICAqIHNwZWNpZmllZCBub3JtYWxpemVkIGZvcm0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3BlYyBVbm5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgVVJMIHNwZWNpZmljYXRpb24KKyAgICAgKiBAcGFyYW0gbm9ybSBOb3JtYWxpemVkIHZlcnNpb24gb2YgdGhlIFVSTCBzcGVjaWZpY2F0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG5vcm1hbGl6ZShTdHJpbmcgc3BlYywgU3RyaW5nIG5vcm0pIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoc3BlYyk7CisgICAgICAgICAgICB1cmwubm9ybWFsaXplKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3BlYyArICIubm9ybWFsaXplKCkiLCBub3JtLCB1cmwudG9FeHRlcm5hbEZvcm0oKSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBmYWlsKHNwZWMgKyAiLm5vcm1hbGl6ZSgpIHRocmV3ICIgKyB0KTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGUgZGV0YWlscyBvZiBvdXIgVVJMIGNsYXNzIGFnYWluc3QgPGNvZGU+amF2YS5uZXQuVVJMPC9jb2RlPgorICAgICAqIGZvciBhbiBhYnNvbHV0ZSBVUkwgc3BlY2lmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcGVjIEFic29sdXRlIFVSTCBzcGVjaWZpY2F0aW9uIHRvIGJlIGNoZWNrZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcG9zaXRpdmUoU3RyaW5nIHNwZWMpIHsKKworICAgICAgICAvLyBDb21wYXJlIHJlc3VsdHMgd2l0aCB3aGF0IGphdmEubmV0LlVSTCByZXR1cm5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChzcGVjKTsKKyAgICAgICAgICAgIGphdmEubmV0LlVSTCBuZXQgPSBuZXcgamF2YS5uZXQuVVJMKHNwZWMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNwZWMgKyAiIHRvRXh0ZXJuYWxGb3JtKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC50b0V4dGVybmFsRm9ybSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybC50b0V4dGVybmFsRm9ybSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzcGVjICsgIi5nZXRBdXRob3JpdHkoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV0LmdldEF1dGhvcml0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybC5nZXRBdXRob3JpdHkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3BlYyArICIuZ2V0RmlsZSgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXQuZ2V0RmlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybC5nZXRGaWxlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNwZWMgKyAiLmdldEhvc3QoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV0LmdldEhvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cmwuZ2V0SG9zdCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzcGVjICsgIi5nZXRQYXRoKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC5nZXRQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLmdldFBhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3BlYyArICIuZ2V0UG9ydCgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXQuZ2V0UG9ydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybC5nZXRQb3J0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNwZWMgKyAiLmdldFByb3RvY29sKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC5nZXRQcm90b2NvbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybC5nZXRQcm90b2NvbCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzcGVjICsgIi5nZXRRdWVyeSgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXQuZ2V0UXVlcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cmwuZ2V0UXVlcnkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3BlYyArICIuZ2V0UmVmKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC5nZXRSZWYoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cmwuZ2V0UmVmKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNwZWMgKyAiLmdldFVzZXJJbmZvKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC5nZXRVc2VySW5mbygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybC5nZXRVc2VySW5mbygpKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGZhaWwoc3BlYyArICIgcG9zaXRpdmUgdGVzdCB0aHJldyAiICsgdCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGRldGFpbHMgb2Ygb3VyIFVSTCBjbGFzcyBhZ2FpbnN0IDxjb2RlPmphdmEubmV0LlVSTDwvY29kZT4KKyAgICAgKiBmb3IgYSByZWxhdGl2ZSBVUkwgc3BlY2lmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhYnMgQWJzb2x1dGUgVVJMIHNwZWNpZmljYXRpb24gZm9yIGJhc2UgcmVmZXJlbmNlCisgICAgICogQHBhcmFtIHJlbCBSZWxhdGl2ZSBVUkwgc3BlY2lmaWNhdGlvbiB0byByZXNvbHZlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBvc2l0aXZlKFN0cmluZyBhYnMsIFN0cmluZyByZWwpIHsKKworICAgICAgICAvLyBDb21wYXJlIHJlc3VsdHMgd2l0aCB3aGF0IGphdmEubmV0LlVSTCByZXR1cm5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgdXJsQmFzZSA9IG5ldyBVUkwoYWJzKTsKKyAgICAgICAgICAgIGphdmEubmV0LlVSTCBuZXRCYXNlID0gbmV3IGphdmEubmV0LlVSTChhYnMpOworICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJsQmFzZSwgcmVsKTsKKyAgICAgICAgICAgIGphdmEubmV0LlVSTCBuZXQgPSBuZXcgamF2YS5uZXQuVVJMKG5ldEJhc2UsIHJlbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIiB0b0V4dGVybmFsRm9ybSgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXQudG9FeHRlcm5hbEZvcm0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cmwudG9FeHRlcm5hbEZvcm0oKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRBdXRob3JpdHkoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV0LmdldEF1dGhvcml0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybC5nZXRBdXRob3JpdHkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRGaWxlKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC5nZXRGaWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLmdldEZpbGUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRIb3N0KCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC5nZXRIb3N0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLmdldEhvc3QoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRQYXRoKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC5nZXRQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLmdldFBhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRQb3J0KCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC5nZXRQb3J0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLmdldFBvcnQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRQcm90b2NvbCgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXQuZ2V0UHJvdG9jb2woKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cmwuZ2V0UHJvdG9jb2woKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRRdWVyeSgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXQuZ2V0UXVlcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cmwuZ2V0UXVlcnkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRSZWYoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV0LmdldFJlZigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybC5nZXRSZWYoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRVc2VySW5mbygpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXQuZ2V0VXNlckluZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cmwuZ2V0VXNlckluZm8oKSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBmYWlsKHJlbCArICIgcG9zaXRpdmUgdGVzdCB0aHJldyAiICsgdCk7CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0Jhc2VEaXJDb250ZXh0VGVzdENhc2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvdGVzdC9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvQmFzZURpckNvbnRleHRUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNDc2OWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0Jhc2VEaXJDb250ZXh0VGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDU0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuQmluZGluZzsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZUNsYXNzUGFpcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuQXR0cmlidXRlczsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworCisvKioKKyAqIDxwPkJhc2ljIHVuaXQgdGVzdHMgZm9yIHRoZSA8Y29kZT5qYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ8L2NvZGU+CisgKiBpbXBsZW1lbnRhdGlvbnMuICBUaGlzIGNsYXNzIG11c3QgYmUgc3ViY2xhc3NlZCBmb3IgZWFjaCBpbmRpdmlkdWFsCisgKiA8Y29kZT5EaXJDb250ZXh0PC9jb2RlPiBpbXBsZW1lbnRhdGlvbi48L3A+CisgKgorICogPHA+PHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+OiAgVGhlc2UgdGVzdHMgbWFrZSBjZXJ0YWluIGFzc3VtcHRpb25zIHRoYXQKKyAqIGNhbiBnZW5lcmF0ZSAiZmFsc2UgbmVnYXRpdmUiIHJlc3VsdHMgaWYgdGhleSBhcmUgdmlvbGF0ZWQ6PC9wPgorICogPHVsPgorICogPGxpPlRoZSBwYXRobmFtZSBvZiBhIGRpcmVjdG9yeSAob3IgV0FSIGZpbGUpIGNvbnRhaW5pbmcgdGhlIHN0YXRpYworICogICAgIHJlc291cmNlcyBvZiB0aGUgPGNvZGU+L2V4YW1wbGVzPC9jb2RlPiB3ZWIgYXBwbGljYXRpb24gc2hpcHBlZAorICogICAgIHdpdGggVG9tY2F0IGlzIHBhc3NlZCB0byBvdXIgdGVzdCBjbGFzcyBhcyBhIHN5c3RlbSBwcm9wZXJ0eQorICogICAgIG5hbWVkIDxjb2RlPmRvYy5iYXNlPC9jb2RlPi48L2xpPgorICogPGxpPlRoZSBlbnRyeSBuYW1lcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgdG9wLWxldmVsIERpckNvbnRleHQgb2YKKyAqICAgICB0aGUgc3RhdGljIHJlc291cmNlcyBhcmUgZW51bWVyYXRlZCBpbiB0aGUgPGNvZGU+dG9wTGV2ZWxOYW1lczwvY29kZT4KKyAqICAgICB2YXJpYWJsZS48L2xpPgorICogPGxpPlRoZSBlbnRyeSBuYW1lcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgV0VCLUlORiBEaXJDb250ZXh0IG9mCisgKiAgICAgdGhlIHN0YXRpYyByZXNvdXJjZXMgYXJlIGVudW1lcmF0ZWQgaW4gdGhlIDxjb2RlPndlYkluZk5hbWVzPC9jb2RlPgorICogICAgIHZhcmlhYmxlLjwvbGk+CisgKiA8bGk+VGhlIGVudHJ5IG5hbWVzIGluIGVpdGhlciB0aGUgdG9wLWxldmVsIG9yIFdFQi1JTkYgRGlyQ29udGV4dCBjb250ZXh0cworICogICAgIHRoYXQgc2hvdWxkIHRoZW1zZWx2ZXMgYmUgPGNvZGU+RGlyQ29udGV4dDwvY29kZT4gaW1wbGVtZW50YXRpb25zIChpLmUuCisgKiAgICAgInN1YmRpcmVjdG9yaWVzIiBpbiB0aGUgc3RhdGljIHJlc291cmNlcyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24pCisgKiAgICAgYXJlIGVudW1lcmF0ZWQgaW4gdGhlIDxjb2RlPmRpckNvbnRleHROYW1lczwvY29kZT4gdmFyaWFibGUuPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlRGlyQ29udGV4dFRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogQSBkaXJlY3RvcnkgY29udGV4dCBpbXBsZW1lbnRhdGlvbiB0byBiZSB0ZXN0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIERpckNvbnRleHQgY29udGV4dCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBwYXRobmFtZSBvZiB0aGUgZG9jdW1lbnQgYmFzZSBkaXJlY3RvcnkgZm9yIHRoaXMgZGlyZWN0b3J5IGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBkb2NCYXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJkb2MuYmFzZSIpOworCisKKyAgICAvKioKKyAgICAgKiBFbnRyeSBuYW1lcyB0aGF0IG11c3QgYmUgRGlyQ29udGV4dHMuICBOYW1lcyBub3Qgb24gdGhpcyBsaXN0IGFyZQorICAgICAqIGFzc3VtZWQgdG8gYmUgUmVzb3VyY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGRpckNvbnRleHROYW1lc1tdID0KKyAgICB7ICJjbGFzc2VzIiwgImltYWdlcyIsICJqc3AiLCAibGliIiwgIk1FVEEtSU5GIiwgIldFQi1JTkYiIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbmFtZXMgdGhhdCBzaG91bGQgYmUgcHJlc2VudCBpbiB0aGUgdG9wLWxldmVsCisgICAgICogZGlyZWN0b3J5IGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG9wTGV2ZWxOYW1lc1tdID0KKyAgICB7ICJpbmRleC5qc3AiLCAiamFrYXJ0YS1iYW5uZXIuZ2lmIiwgInRvbWNhdC5naWYiLCAidG9tY2F0LXBvd2VyLmdpZiIsICJNRVRBLUlORiIsICJXRUItSU5GIiB9OworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBuYW1lcyB0aGF0IHNob3VsZCBiZSBwcmVzZW50IGluIHRoZSBXRUItSU5GCisgICAgICogZGlyZWN0b3J5IGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgd2ViSW5mTmFtZXNbXSA9CisgICAgeyAiY2xhc3NlcyIsICJqc3AiLCAibGliIiwgIndlYi54bWwiIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbmFtZXMgdGhhdCBzaG91bGQgYmUgYXR0cmlidXRlcyBvZiBXRUItSU5GLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHdlYkluZkF0dHJzW10gPQorICAgIHsgImNyZWF0aW9uZGF0ZSIsICJkaXNwbGF5bmFtZSIsICJnZXRjb250ZW50bGVuZ3RoIiwgImdldGxhc3Rtb2RpZmllZCIsCisgICAgICAicmVzb3VyY2V0eXBlIiB9OworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGF0dHJpYnV0ZXMgb2YgV0VCLUlORi93ZWIueG1sLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHdlYlhtbEF0dHJzW10gPQorICAgIHsgImNyZWF0aW9uZGF0ZSIsICJkaXNwbGF5bmFtZSIsICJnZXRjb250ZW50bGVuZ3RoIiwgImdldGxhc3Rtb2RpZmllZCIsCisgICAgICAicmVzb3VyY2V0eXBlIiB9OworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgdGVzdCBjYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdCBjYXNlCisgICAgICovCisgICAgcHVibGljIEJhc2VEaXJDb250ZXh0VGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzdXBlcihuYW1lKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE92ZXJhbGwgVGVzdCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFNldCB1cCBpbnN0YW5jZSB2YXJpYWJsZXMgcmVxdWlyZWQgYnkgdGhpcyB0ZXN0IGNhc2UuICBUaGlzIG1ldGhvZAorICAgICAqIDxzdHJvbmc+TVVTVDwvc3Ryb25nPiBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFVwKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGVzdHMgaW5jbHVkZWQgaW4gdGhpcyB0ZXN0IHN1aXRlLiAgVGhpcyBtZXRob2QKKyAgICAgKiA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4KKyAgICAgKi8KKyAgICAvLyBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIFRlc3Qgc3VpdGUoKTsKKworCisgICAgLyoqCisgICAgICogVGVhciBkb3duIGluc3RhbmNlIHZhcmlhYmxlcyByZXF1aXJlZCBieSB0aGlzIHRlc3QgY2FzZS4gIFRoaXMgbWV0aG9kCisgICAgICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdGVhckRvd24oKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluZGl2aWR1YWwgVGVzdCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGF0dHJpYnV0ZXMgcmV0dXJuZWQgZm9yIHRoZSA8Y29kZT5XRUItSU5GPC9jb2RlPiBlbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0ZXN0R2V0QXR0cmlidXRlc1dlYkluZigpOworCisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBhdHRyaWJ1dGVzIHJldHVybmVkIGZvciB0aGUgPGNvZGU+V0VCLUlORi93ZWIueG1sPC9jb2RlPgorICAgICAqIGVudHJ5LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRlc3RHZXRBdHRyaWJ1dGVzV2ViWG1sKCk7CisKKworICAgIC8qKgorICAgICAqIFdlIHNob3VsZCBiZSBhYmxlIHRvIGxpc3QgdGhlIGNvbnRlbnRzIG9mIHRoZSB0b3AtbGV2ZWwgY29udGV4dCBpdHNlbGYsCisgICAgICogYW5kIGxvY2F0ZSBzb21lIGVudHJpZXMgd2Uga25vdyBhcmUgdGhlcmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdExpc3RUb3BMZXZlbCgpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hlY2tMaXN0KGNvbnRleHQubGlzdCgiIiksIHRvcExldmVsTmFtZXMpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiTmFtaW5nRXhjZXB0aW9uOiAiICsgZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogV2Ugc2hvdWxkIGJlIGFibGUgdG8gbGlzdCB0aGUgY29udGVudHMgb2YgdGhlIFdFQi1JTkYgZW50cnksCisgICAgICogYW5kIGxvY2F0ZSBzb21lIGVudHJpZXMgd2Uga25vdyBhcmUgdGhlcmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdExpc3RXZWJJbmZEaXJlY3QoKSB7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gTG9vayB1cCB0aGUgV0VCLUlORiBlbnRyeQorICAgICAgICAgICAgT2JqZWN0IHdlYkluZkVudHJ5ID0gY29udGV4dC5sb29rdXAoIldFQi1JTkYiKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkZvdW5kIFdFQi1JTkYgZW50cnkiLCB3ZWJJbmZFbnRyeSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXRUItSU5GIGVudHJ5IGlzIGEgRGlyQ29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgd2ViSW5mRW50cnkgaW5zdGFuY2VvZiBEaXJDb250ZXh0KTsKKyAgICAgICAgICAgIERpckNvbnRleHQgd2ViSW5mQ29udGV4dCA9IChEaXJDb250ZXh0KSB3ZWJJbmZFbnRyeTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGNvbnRlbnRzIG9mIHRoZSBXRUItSU5GIGNvbnRleHQgZGlyZWN0bHkKKyAgICAgICAgICAgIGNoZWNrTGlzdCh3ZWJJbmZDb250ZXh0Lmxpc3QoIiIpLCB3ZWJJbmZOYW1lcyk7CisKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIk5hbWluZ0V4Y2VwdGlvbjogIiArIGUpOworICAgICAgICB9CisKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogV2Ugc2hvdWxkIGJlIGFibGUgdG8gbGlzdCB0aGUgY29udGVudHMgb2YgdGhlIFdFQi1JTkYgZW50cnksCisgICAgICogYW5kIGxvY2F0ZSBzb21lIGVudHJpZXMgd2Uga25vdyBhcmUgdGhlcmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdExpc3RXZWJJbmZJbmRpcmVjdCgpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hlY2tMaXN0KGNvbnRleHQubGlzdCgiV0VCLUlORiIpLCB3ZWJJbmZOYW1lcyk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJOYW1pbmdFeGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXZSBzaG91bGQgYmUgYWJsZSB0byBsaXN0IHRoZSBiaW5kaW5ncyBvZiB0aGUgdG9wLWxldmVsIGNvbnRleHQgaXRzZWxmLAorICAgICAqIGFuZCBsb2NhdGUgc29tZSBlbnRyaWVzIHdlIGtub3cgYXJlIHRoZXJlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0QmluZGluZ3NUb3BMZXZlbCgpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hlY2tMaXN0QmluZGluZ3MoY29udGV4dC5saXN0QmluZGluZ3MoIiIpLCB0b3BMZXZlbE5hbWVzKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIk5hbWluZ0V4Y2VwdGlvbjogIiArIGUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdlIHNob3VsZCBiZSBhYmxlIHRvIGxpc3QgdGhlIGJpbmRpbmdzIG9mIHRoZSBXRUItSU5GIGVudHJ5LAorICAgICAqIGFuZCBsb2NhdGUgc29tZSBlbnRyaWVzIHdlIGtub3cgYXJlIHRoZXJlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0QmluZGluZ3NXZWJJbmZEaXJlY3QoKSB7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gTG9vayB1cCB0aGUgV0VCLUlORiBlbnRyeQorICAgICAgICAgICAgT2JqZWN0IHdlYkluZkVudHJ5ID0gY29udGV4dC5sb29rdXAoIldFQi1JTkYiKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkZvdW5kIFdFQi1JTkYgZW50cnkiLCB3ZWJJbmZFbnRyeSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXRUItSU5GIGVudHJ5IGlzIGEgRGlyQ29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgd2ViSW5mRW50cnkgaW5zdGFuY2VvZiBEaXJDb250ZXh0KTsKKyAgICAgICAgICAgIERpckNvbnRleHQgd2ViSW5mQ29udGV4dCA9IChEaXJDb250ZXh0KSB3ZWJJbmZFbnRyeTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGJpbmRpbmdzIG9mIHRoZSBXRUItSU5GIGNvbnRleHQgZGlyZWN0bHkKKyAgICAgICAgICAgIGNoZWNrTGlzdEJpbmRpbmdzKHdlYkluZkNvbnRleHQubGlzdEJpbmRpbmdzKCIiKSwgd2ViSW5mTmFtZXMpOworCisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJOYW1pbmdFeGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgfQorCisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdlIHNob3VsZCBiZSBhYmxlIHRvIGxpc3QgdGhlIGJpbmRpbmdzIG9mIHRoZSBXRUItSU5GIGVudHJ5LAorICAgICAqIGFuZCBsb2NhdGUgc29tZSBlbnRyaWVzIHdlIGtub3cgYXJlIHRoZXJlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0QmluZGluZ3NXZWJJbmZJbmRpcmVjdCgpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hlY2tMaXN0QmluZGluZ3MoY29udGV4dC5saXN0QmluZGluZ3MoIldFQi1JTkYiKSwgd2ViSW5mTmFtZXMpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiTmFtaW5nRXhjZXB0aW9uOiAiICsgZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3VwcG9ydCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSByZXN1bHRzIG9mIGEgbGlzdCgpIGNhbGwgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIGVudHJ5IGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW51bSBUaGUgbmFtaW5nIGVudW1lcmF0aW9uIHdlIGFyZSBjaGVja2luZworICAgICAqIEBwYXJhbSBsaXN0IFRoZSBsaXN0IG9mIGVudHJ5IG5hbWVzIHdlIGFyZSBleHBlY3RpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0xpc3QoTmFtaW5nRW51bWVyYXRpb24gbmUsIFN0cmluZyBsaXN0W10pCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBjb250ZXh0Q2xhc3NOYW1lID0gY29udGV4dC5nZXRDbGFzcygpLmdldE5hbWUoKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKCJOYW1pbmdFbnVtZXJhdGlvbiBpcyBub3QgbnVsbCIsIG5lKTsKKyAgICAgICAgd2hpbGUgKG5lLmhhc01vcmUoKSkgeworCisgICAgICAgICAgICBPYmplY3QgbmV4dCA9IG5lLm5leHQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImxpc3QoKSByZXR1cm5zIE5hbWVDbGFzc1BhaXIgaW5zdGFuY2VzIiwKKyAgICAgICAgICAgICAgICAgICBuZXh0IGluc3RhbmNlb2YgTmFtZUNsYXNzUGFpcik7CisgICAgICAgICAgICBOYW1lQ2xhc3NQYWlyIG5jcCA9IChOYW1lQ2xhc3NQYWlyKSBuZXh0OworCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJOYW1lICciICsgbmNwLmdldE5hbWUoKSArICInIGlzIGV4cGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICBpc0xpc3RlZChuY3AuZ2V0TmFtZSgpLCBsaXN0KSk7CisKKyAgICAgICAgICAgIGlmIChpc0RpckNvbnRleHQobmNwLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJDbGFzcyAnIiArIG5jcC5nZXRDbGFzc05hbWUoKSArICInIGlzICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dENsYXNzTmFtZSArICInIiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dENsYXNzTmFtZS5lcXVhbHMobmNwLmdldENsYXNzTmFtZSgpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJlbGF0aXZlIGlzICd0cnVlJyIsIG5jcC5pc1JlbGF0aXZlKCkpOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIHJlc3VsdHMgb2YgYSBsaXN0QmluZGluZ3MoKSBjYWxsIGFnYWluc3QgdGhlCisgICAgICogc3BlY2lmaWVkIGVudHJ5IGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW51bSBUaGUgbmFtaW5nIGVudW1lcmF0aW9uIHdlIGFyZSBjaGVja2luZworICAgICAqIEBwYXJhbSBsaXN0IFRoZSBsaXN0IG9mIGVudHJ5IG5hbWVzIHdlIGFyZSBleHBlY3RpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0xpc3RCaW5kaW5ncyhOYW1pbmdFbnVtZXJhdGlvbiBuZSwgU3RyaW5nIGxpc3RbXSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIGNvbnRleHRDbGFzc05hbWUgPSBjb250ZXh0LmdldENsYXNzKCkuZ2V0TmFtZSgpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoIk5hbWluZ0VudW1lcmF0aW9uIGlzIG5vdCBudWxsIiwgbmUpOworICAgICAgICB3aGlsZSAobmUuaGFzTW9yZSgpKSB7CisKKyAgICAgICAgICAgIE9iamVjdCBuZXh0ID0gbmUubmV4dCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgibGlzdEJpbmRpbmdzKCkgcmV0dXJucyBCaW5kaW5nIGluc3RhbmNlcyIsCisgICAgICAgICAgICAgICAgICAgbmV4dCBpbnN0YW5jZW9mIEJpbmRpbmcpOworICAgICAgICAgICAgQmluZGluZyBiID0gKEJpbmRpbmcpIG5leHQ7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoIk5hbWUgJyIgKyBiLmdldE5hbWUoKSArICInIGlzIGV4cGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICBpc0xpc3RlZChiLmdldE5hbWUoKSwgbGlzdCkpOworCisgICAgICAgICAgICBpZiAoaXNEaXJDb250ZXh0KGIuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNsYXNzICciICsgYi5nZXRDbGFzc05hbWUoKSArICInIGlzICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dENsYXNzTmFtZSArICInIiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dENsYXNzTmFtZS5lcXVhbHMoYi5nZXRDbGFzc05hbWUoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZWxhdGl2ZSBpcyAndHJ1ZSciLCBiLmlzUmVsYXRpdmUoKSk7CisKKyAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBiLmdldE9iamVjdCgpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTmFtZSAnIiArIGIuZ2V0TmFtZSgpICsgIicgaGFzIGEgbm9uLW51bGwgb2JqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0KTsKKyAgICAgICAgICAgIGlmKGlzRGlyQ29udGV4dChiLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIAlhc3NlcnRUcnVlKCJFbnRyeSAnIiArIGIuZ2V0TmFtZSgpICsgIicgaXMgYSBEaXJDb250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIERpckNvbnRleHQpOyAgICAgICAgICAJCisgICAgICAgICAgICB9ICBlbHNlIHsKKyAgICAgICAgICAgIAlhc3NlcnRUcnVlKCJFbnRyeSAnIiArIGIuZ2V0TmFtZSgpICsgIicgaXMgYSBSZXNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFJlc291cmNlKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBXRUItSU5GIGVudHJ5LgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIGVudHJ5CisgICAgICogQHBhcmFtIGNyZWF0aW9uRGF0ZSBUaGUgY3JlYXRpb24gZGF0ZSBmb3IgdGhpcyBlbnRyeQorICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBjb250ZW50IGxlbmd0aCBmb3IgdGhpcyBlbnRyeQorICAgICAqIEBwYXJhbSBkaXNwbGF5TmFtZSBUaGUgZGlzcGxheSBuYW1lIGZvciB0aGlzIGVudHJ5CisgICAgICogQHBhcmFtIGxhc3RNb2RpZmllZERhdGUgVGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSBmb3IgdGhpcyBlbnRyeQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrV2ViSW5mQXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlIGNyZWF0aW9uRGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBjb250ZW50TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUgbGFzdE1vZGlmaWVkRGF0ZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0QXR0cmlidXRlcygpIHJldHVybmVkIG5vbi1udWxsIiwgYXR0cnMpOworCisgICAgICAgIE5hbWluZ0VudW1lcmF0aW9uIG5lID0gYXR0cnMuZ2V0QWxsKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoImdldEFsbCgpIHJldHVybmVkIG5vbi1udWxsIiwgbmUpOworICAgICAgICB3aGlsZSAobmUuaGFzTW9yZSgpKSB7CisKKyAgICAgICAgICAgIE9iamVjdCBuZXh0ID0gbmUubmV4dCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0QWxsKCkgcmV0dXJucyBBdHRyaWJ1dGUgaW5zdGFuY2VzIiwKKyAgICAgICAgICAgICAgICAgICBuZXh0IGluc3RhbmNlb2YgQXR0cmlidXRlKTsKKyAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gKEF0dHJpYnV0ZSkgbmV4dDsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYXR0ci5nZXRJRCgpOworICAgICAgICAgICAgaW50IGluZGV4ID0gZ2V0SW5kZXgobmFtZSwgd2ViSW5mQXR0cnMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV0VCLUlORiBhdHRyaWJ1dGUgJyIgKyBuYW1lICsgIicgaXMgZXhwZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgIGluZGV4ID49IDApOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gYXR0ci5nZXQoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoImdldCgpIHJldHVybmVkIG5vbi1udWxsIiwgdmFsdWUpOworCisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoImNyZWF0aW9uZGF0ZSIpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ3JlYXRpb24gZGF0ZSBpcyBhIGRhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIERhdGUpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNyZWF0aW9uIGRhdGUgZXF1YWxzICIgKyBjcmVhdGlvbkRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uRGF0ZS5lcXVhbHMoKERhdGUpIHZhbHVlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJkaXNwbGF5bmFtZSIpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlzcGxheSBuYW1lIGlzIGEgc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkRpc3BsYXkgbmFtZSBlcXVhbHMgIiArIGRpc3BsYXlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZS5lcXVhbHMoKFN0cmluZykgdmFsdWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImdldGNvbnRlbnRsZW5ndGgiKSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNvbnRlbnQgbGVuZ3RoIGlzIGEgbG9uZyIsCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgTG9uZyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29udGVudCBsZW5ndGggZXF1YWxzICIgKyBjb250ZW50TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50TGVuZ3RoID09ICgoTG9uZykgdmFsdWUpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImdldGxhc3Rtb2RpZmllZCIpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTGFzdCBtb2RpZmllZCBkYXRlIGlzIGEgZGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTGFzdCBtb2RpZmllZCBkYXRlIGlzICIgKyBsYXN0TW9kaWZpZWREYXRlLAorICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWREYXRlLmVxdWFscygoRGF0ZSkgdmFsdWUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIFdFQi1JTkYvd2ViLnhtbCBlbnRyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcyBmb3IgdGhpcyBlbnRyeQorICAgICAqIEBwYXJhbSBjcmVhdGlvbkRhdGUgVGhlIGNyZWF0aW9uIGRhdGUgZm9yIHRoaXMgZW50cnkKKyAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCBUaGUgY29udGVudCBsZW5ndGggZm9yIHRoaXMgZW50cnkKKyAgICAgKiBAcGFyYW0gZGlzcGxheU5hbWUgVGhlIGRpc3BsYXkgbmFtZSBmb3IgdGhpcyBlbnRyeQorICAgICAqIEBwYXJhbSBsYXN0TW9kaWZpZWREYXRlIFRoZSBsYXN0IG1vZGlmaWVkIGRhdGUgZm9yIHRoaXMgZW50cnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1dlYlhtbEF0dHJpYnV0ZXMoQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZSBjcmVhdGlvbkRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY29udGVudExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlIGxhc3RNb2RpZmllZERhdGUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIGFzc2VydE5vdE51bGwoImdldEF0dHJpYnV0ZXMoKSByZXR1cm5lZCBub24tbnVsbCIsIGF0dHJzKTsKKworICAgICAgICBOYW1pbmdFbnVtZXJhdGlvbiBuZSA9IGF0dHJzLmdldEFsbCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRBbGwoKSByZXR1cm5lZCBub24tbnVsbCIsIG5lKTsKKyAgICAgICAgd2hpbGUgKG5lLmhhc01vcmUoKSkgeworCisgICAgICAgICAgICBPYmplY3QgbmV4dCA9IG5lLm5leHQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImdldEFsbCgpIHJldHVybnMgQXR0cmlidXRlIGluc3RhbmNlcyIsCisgICAgICAgICAgICAgICAgICAgbmV4dCBpbnN0YW5jZW9mIEF0dHJpYnV0ZSk7CisgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0ciA9IChBdHRyaWJ1dGUpIG5leHQ7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0SUQoKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGdldEluZGV4KG5hbWUsIHdlYlhtbEF0dHJzKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldFQi1JTkYvd2ViLnhtbCBhdHRyaWJ1dGUgJyIgKyBuYW1lICsgIicgaXMgZXhwZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgIGluZGV4ID49IDApOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gYXR0ci5nZXQoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoImdldCgpIHJldHVybmVkIG5vbi1udWxsIiwgdmFsdWUpOworCisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoImNyZWF0aW9uZGF0ZSIpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ3JlYXRpb24gZGF0ZSBpcyBhIGRhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIERhdGUpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNyZWF0aW9uIGRhdGUgZXF1YWxzICIgKyBjcmVhdGlvbkRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uRGF0ZS5lcXVhbHMoKERhdGUpIHZhbHVlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJkaXNwbGF5bmFtZSIpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlzcGxheSBuYW1lIGlzIGEgc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkRpc3BsYXkgbmFtZSBlcXVhbHMgIiArIGRpc3BsYXlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZS5lcXVhbHMoKFN0cmluZykgdmFsdWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImdldGNvbnRlbnRsZW5ndGgiKSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNvbnRlbnQgbGVuZ3RoIGlzIGEgbG9uZyIsCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgTG9uZyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29udGVudCBsZW5ndGggZXF1YWxzICIgKyBjb250ZW50TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50TGVuZ3RoID09ICgoTG9uZykgdmFsdWUpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImdldGxhc3Rtb2RpZmllZCIpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTGFzdCBtb2RpZmllZCBkYXRlIGlzIGEgZGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTGFzdCBtb2RpZmllZCBkYXRlIGlzICIgKyBsYXN0TW9kaWZpZWREYXRlLAorICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWREYXRlLmVxdWFscygoRGF0ZSkgdmFsdWUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSBzcGVjaWZpZWQgbGlzdCwgb3IKKyAgICAgKiAtMSBpZiB0aGUgbmFtZSBpcyBub3QgcHJlc2VudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgdG8gYmUgbG9va2VkIHVwCisgICAgICogQHBhcmFtIGxpc3QgTGlzdCBvZiBuYW1lcyB0byBiZSBjaGVja2VkCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBnZXRJbmRleChTdHJpbmcgbmFtZSwgU3RyaW5nIGxpc3RbXSkgeworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGxpc3RbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiAoaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgtMSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElzIGFuIGVudHJ5IG9mIHRoZSBzcGVjaWZpZWQgbmFtZSBzdXBwb3NlZCB0byBiZSBhIERpckNvbnRleHQ/CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIHRvIGJlIGNoZWNrZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RpckNvbnRleHQoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICByZXR1cm4gKGlzTGlzdGVkKG5hbWUsIGRpckNvbnRleHROYW1lcykpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBmb3VuZCBpbiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgdG8gYmUgbG9va2VkIHVwCisgICAgICogQHBhcmFtIGxpc3QgTGlzdCB0byBiZSBsb29rZWQgdXAgaW50bworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzTGlzdGVkKFN0cmluZyBuYW1lLCBTdHJpbmcgbGlzdFtdKSB7CisKKyAgICAgICAgcmV0dXJuIChnZXRJbmRleChuYW1lLCBsaXN0KSA+PSAwKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0ZpbGVEaXJDb250ZXh0VGVzdENhc2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvdGVzdC9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvRmlsZURpckNvbnRleHRUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MTQ2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0ZpbGVEaXJDb250ZXh0VGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5BdHRyaWJ1dGVzOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisKKy8qKgorICogVW5pdCB0ZXN0cyBmb3IgPGNvZGU+b3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLkZpbGVEaXJDb250ZXh0PC9jb2RlPi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZpbGVEaXJDb250ZXh0VGVzdENhc2UgZXh0ZW5kcyBCYXNlRGlyQ29udGV4dFRlc3RDYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHRlc3QgY2FzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QgY2FzZQorICAgICAqLworICAgIHB1YmxpYyBGaWxlRGlyQ29udGV4dFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3VwZXIobmFtZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPdmVyYWxsIFRlc3QgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgaW5zdGFuY2UgdmFyaWFibGVzIHJlcXVpcmVkIGJ5IHRoaXMgdGVzdCBjYXNlLiAgVGhpcyBtZXRob2QKKyAgICAgKiA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKworICAgICAgICBjb250ZXh0ID0gbmV3IEZpbGVEaXJDb250ZXh0KCk7CisgICAgICAgICgoRmlsZURpckNvbnRleHQpIGNvbnRleHQpLnNldERvY0Jhc2UoZG9jQmFzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGVzdHMgaW5jbHVkZWQgaW4gdGhpcyB0ZXN0IHN1aXRlLiAgVGhpcyBtZXRob2QKKyAgICAgKiA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisKKyAgICAgICAgcmV0dXJuIChuZXcgVGVzdFN1aXRlKEZpbGVEaXJDb250ZXh0VGVzdENhc2UuY2xhc3MpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVhciBkb3duIGluc3RhbmNlIHZhcmlhYmxlcyByZXF1aXJlZCBieSB0aGlzIHRlc3QgY2FzZS4gIFRoaXMgbWV0aG9kCisgICAgICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisKKyAgICAgICAgY29udGV4dCA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbmRpdmlkdWFsIFRlc3QgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBhdHRyaWJ1dGVzIHJldHVybmVkIGZvciB0aGUgPGNvZGU+V0VCLUlORjwvY29kZT4gZW50cnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEF0dHJpYnV0ZXNXZWJJbmYoKSB7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gSWRlbnRpZnkgYSBsb2NhbCBmaWxlIG9iamVjdCBmb3IgV0VCLUlORgorICAgICAgICAgICAgRmlsZSBkb2NCYXNlRmlsZSA9IG5ldyBGaWxlKGRvY0Jhc2UpOworICAgICAgICAgICAgRmlsZSB3ZWJJbmZGaWxlID0gbmV3IEZpbGUoZG9jQmFzZUZpbGUsICJXRUItSU5GIik7CisKKyAgICAgICAgICAgIC8vIExvb2sgdXAgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBXRUItSU5GIGVudHJ5CisgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBjb250ZXh0LmdldEF0dHJpYnV0ZXMoIldFQi1JTkYiKTsKKworICAgICAgICAgICAgLy8gRW51bWVyYXRlIGFuZCBjaGVjayB0aGUgYXR0cmlidXRlcyBmb3IgdGhpcyBlbnRyeQorICAgICAgICAgICAgY2hlY2tXZWJJbmZBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUod2ViSW5mRmlsZS5sYXN0TW9kaWZpZWQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViSW5mRmlsZS5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0VCLUlORiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUod2ViSW5mRmlsZS5sYXN0TW9kaWZpZWQoKSkpOworCisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGZhaWwoIk5hbWluZ0V4Y2VwdGlvbjogIiArIGUpOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgYXR0cmlidXRlcyByZXR1cm5lZCBmb3IgdGhlIDxjb2RlPldFQi1JTkYvd2ViLnhtbDwvY29kZT4KKyAgICAgKiBlbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXR0cmlidXRlc1dlYlhtbCgpIHsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBJZGVudGlmeSBhIGxvY2FsIGZpbGUgb2JqZWN0IGZvciBXRUItSU5GL3dlYi54bWwKKyAgICAgICAgICAgIEZpbGUgZG9jQmFzZUZpbGUgPSBuZXcgRmlsZShkb2NCYXNlKTsKKyAgICAgICAgICAgIEZpbGUgd2ViSW5mRmlsZSA9IG5ldyBGaWxlKGRvY0Jhc2VGaWxlLCAiV0VCLUlORiIpOworICAgICAgICAgICAgRmlsZSB3ZWJYbWxGaWxlID0gbmV3IEZpbGUod2ViSW5mRmlsZSwgIndlYi54bWwiKTsKKworICAgICAgICAgICAgLy8gTG9vayB1cCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIFdFQi1JTkYgZW50cnkKKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGNvbnRleHQuZ2V0QXR0cmlidXRlcygiV0VCLUlORi93ZWIueG1sIik7CisKKyAgICAgICAgICAgIC8vIEVudW1lcmF0ZSBhbmQgY2hlY2sgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoaXMgZW50cnkKKyAgICAgICAgICAgIGNoZWNrV2ViWG1sQXR0cmlidXRlcyhhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKHdlYlhtbEZpbGUubGFzdE1vZGlmaWVkKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYlhtbEZpbGUubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlYi54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKHdlYlhtbEZpbGUubGFzdE1vZGlmaWVkKCkpKTsKKworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBmYWlsKCJOYW1pbmdFeGNlcHRpb246ICAiICsgZSk7CisKKyAgICAgICAgfQorCisgICAgfQorCisKK30KKworCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvdGVzdC9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvV0FSRGlyQ29udGV4dFRlc3RDYXNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1dBUkRpckNvbnRleHRUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhN2E4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1dBUkRpckNvbnRleHRUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5BdHRyaWJ1dGVzOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisKKy8qKgorICogVW5pdCB0ZXN0cyBmb3IgPGNvZGU+b3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLldBUkRpckNvbnRleHQ8L2NvZGU+LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgV0FSRGlyQ29udGV4dFRlc3RDYXNlIGV4dGVuZHMgQmFzZURpckNvbnRleHRUZXN0Q2FzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyB0ZXN0IGNhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgV0FSRGlyQ29udGV4dFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3VwZXIobmFtZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPdmVyYWxsIFRlc3QgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgaW5zdGFuY2UgdmFyaWFibGVzIHJlcXVpcmVkIGJ5IHRoaXMgdGVzdCBjYXNlLiAgVGhpcyBtZXRob2QKKyAgICAgKiA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKworICAgICAgICBjb250ZXh0ID0gbmV3IFdBUkRpckNvbnRleHQoKTsKKyAgICAgICAgKChXQVJEaXJDb250ZXh0KSBjb250ZXh0KS5zZXREb2NCYXNlKGRvY0Jhc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRlc3RzIGluY2x1ZGVkIGluIHRoaXMgdGVzdCBzdWl0ZS4gIFRoaXMgbWV0aG9kCisgICAgICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCisgICAgICAgIHJldHVybiAobmV3IFRlc3RTdWl0ZShXQVJEaXJDb250ZXh0VGVzdENhc2UuY2xhc3MpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVhciBkb3duIGluc3RhbmNlIHZhcmlhYmxlcyByZXF1aXJlZCBieSB0aGlzIHRlc3QgY2FzZS4gIFRoaXMgbWV0aG9kCisgICAgICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisKKyAgICAgICAgY29udGV4dCA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbmRpdmlkdWFsIFRlc3QgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBhdHRyaWJ1dGVzIHJldHVybmVkIGZvciB0aGUgPGNvZGU+V0VCLUlORjwvY29kZT4gZW50cnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEF0dHJpYnV0ZXNXZWJJbmYoKSB7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gTG9vayB1cCB0aGUgYXR0cmlidXRlcyBvZiB0aGlzIFdBUiBmaWxlIGVudHJ5CisgICAgICAgICAgICBKYXJGaWxlIGphckZpbGUgPSBuZXcgSmFyRmlsZShkb2NCYXNlKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkNyZWF0ZWQgSmFyRmlsZSBmb3IgIiArIGRvY0Jhc2UsIGphckZpbGUpOworICAgICAgICAgICAgSmFyRW50cnkgamFyRW50cnkgPQorICAgICAgICAgICAgICAgIChKYXJFbnRyeSkgamFyRmlsZS5nZXRFbnRyeSgiV0VCLUlORiIpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ3JlYXRlZCBKYXJFbnRyeSBmb3IgV0VCLUlORiIsIGphckVudHJ5KTsKKworICAgICAgICAgICAgLy8gTG9vayB1cCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIFdFQi1JTkYgZW50cnkKKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGNvbnRleHQuZ2V0QXR0cmlidXRlcygiV0VCLUlORiIpOworCisgICAgICAgICAgICAvLyBFbnVtZXJhdGUgYW5kIGNoZWNrIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIGVudHJ5CisgICAgICAgICAgICBjaGVja1dlYkluZkF0dHJpYnV0ZXMoYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShqYXJFbnRyeS5nZXRUaW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphckVudHJ5LmdldFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0VCLUlORiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoamFyRW50cnkuZ2V0VGltZSgpKSk7CisKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbjogIiArIGUpOworCisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGZhaWwoIk5hbWluZ0V4Y2VwdGlvbjogIiArIGUpOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgYXR0cmlidXRlcyByZXR1cm5lZCBmb3IgdGhlIDxjb2RlPldFQi1JTkYvd2ViLnhtbDwvY29kZT4KKyAgICAgKiBlbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXR0cmlidXRlc1dlYlhtbCgpIHsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBMb29rIHVwIHRoZSBhdHRyaWJ1dGVzIG9mIHRoaXMgV0FSIGZpbGUgZW50cnkKKyAgICAgICAgICAgIEphckZpbGUgamFyRmlsZSA9IG5ldyBKYXJGaWxlKGRvY0Jhc2UpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ3JlYXRlZCBKYXJGaWxlIGZvciAiICsgZG9jQmFzZSwgamFyRmlsZSk7CisgICAgICAgICAgICBKYXJFbnRyeSBqYXJFbnRyeSA9CisgICAgICAgICAgICAgICAgKEphckVudHJ5KSBqYXJGaWxlLmdldEVudHJ5KCJXRUItSU5GL3dlYi54bWwiKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkNyZWF0ZWQgSmFyRW50cnkgZm9yIFdFQi1JTkYvd2ViLnhtbCIsIGphckVudHJ5KTsKKworICAgICAgICAgICAgLy8gTG9vayB1cCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIFdFQi1JTkYvd2ViLnhtbCBlbnRyeQorICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gY29udGV4dC5nZXRBdHRyaWJ1dGVzKCJXRUItSU5GL3dlYi54bWwiKTsKKworICAgICAgICAgICAgLy8gRW51bWVyYXRlIGFuZCBjaGVjayB0aGUgYXR0cmlidXRlcyBmb3IgdGhpcyBlbnRyeQorICAgICAgICAgICAgY2hlY2tXZWJYbWxBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoamFyRW50cnkuZ2V0VGltZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXJFbnRyeS5nZXRTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlYi54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKGphckVudHJ5LmdldFRpbWUoKSkpOworCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb246ICIgKyBlKTsKKworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBmYWlsKCJOYW1pbmdFeGNlcHRpb246ICAiICsgZSk7CisKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9ldGMvbXg0ai5saWNlbnNlIGIvY29udGFpbmVyL2V0Yy9teDRqLmxpY2Vuc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgxZWJlZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9ldGMvbXg0ai5saWNlbnNlCkBAIC0wLDAgKzEsNTEgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaGUgTVg0SiBMaWNlbnNlLCBWZXJzaW9uIDEuMAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBNWDRKLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKKyAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBNWDRKIHByb2plY3QgKGh0dHA6Ly9teDRqLnNvdXJjZWZvcmdlLm5ldCkuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIk1YNEoiIGFuZCAibXg0aiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYmlvcm5fc3RlZWRvbUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiTVg0SiIsCisgKiAgICBub3IgbWF5ICJNWDRKIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIFNpbW9uZSBCb3JkZXQuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTE9TIFFVSVJPWiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgTVg0Si4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uCisgKiBNWDRKLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL214NGouc291cmNlZm9yZ2UubmV0Pi4KKyAqLwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvYnVpbGQucHJvcGVydGllcyBiL2NvbnRhaW5lci9tb2R1bGVzL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxNmI5YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyIEBACisjVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byBlbmFibGUgdGhlIG5ldyBjbHVzdGVyIHNldAorI2NsdXN0ZXItaGE9dHJ1ZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvYnVpbGQueG1sIGIvY29udGFpbmVyL21vZHVsZXMvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOWZhYzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9idWlsZC54bWwKQEAgLTAsMCArMSw5NSBAQAorPHByb2plY3QgbmFtZT0iTW9kdWxlcyIgZGVmYXVsdD0iZGlzdCIgYmFzZWRpcj0iLiI+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBJbml0aWFsaXplIFByb3BlcnR5IFZhbHVlcyA9PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDwhLS0gU2VlICJidWlsZC5wcm9wZXJ0aWVzLnNhbXBsZSIgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgZm9yIGFsbCAgICAgLS0+CisgIDwhLS0gcHJvcGVydHkgdmFsdWVzIHlvdSBtdXN0IGN1c3RvbWl6ZSBmb3Igc3VjY2Vzc2Z1bCBidWlsZGluZyEhISAgICAgICAgLS0+CisgIDwhLS1wcm9wZXJ0eSBmaWxlPSJidWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIuLi9idWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3VzZXIuaG9tZX0vYnVpbGQucHJvcGVydGllcyIvLS0+CisKKyAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXByZXBhcmUiPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpkazEuNC5wcmVzZW50IiBjbGFzc25hbWU9ImphdmEubmlvLkJ1ZmZlciIgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENvbXBpbGUgU3VicHJvamVjdHMgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8IS0tIEFkZCBhIG5ldyB0YXJnZXQgZm9yIGVhY2ggbW9kdWxlIHN1YnByb2plY3QgLS0+CisKKyAgPHRhcmdldCBuYW1lPSJjbHVzdGVyIiBpZj0iamRrMS40LnByZXNlbnQiIHVubGVzcz0iY2x1c3Rlci1oYSI+CisgICAgPGFudCBkaXI9IiR7YmFzZWRpcn0vY2x1c3RlciIgdGFyZ2V0PSJkaXN0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZ3JvdXBjb20iIGlmPSJjbHVzdGVyLWhhIiA+CisgICAgPGFudCBkaXI9IiR7YmFzZWRpcn0vZ3JvdXBjb20iIHRhcmdldD0iZGlzdCI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJncm91cGNvbS5kaXN0IiB2YWx1ZT0iJHtjbHVzdGVyLmRpc3R9Ii8+CisgICAgPC9hbnQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaGEiIGlmPSJjbHVzdGVyLWhhIiA+CisgICAgPGFudCBkaXI9IiR7YmFzZWRpcn0vaGEiIHRhcmdldD0iZGlzdCI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYS5kaXN0IiB2YWx1ZT0iJHtjbHVzdGVyLmRpc3R9Ii8+CisgICAgPC9hbnQ+CisgIDwvdGFyZ2V0PgorICAKKyAgCisgIDx0YXJnZXQgbmFtZT0iY29uZmlnIiB1bmxlc3M9ImNsdXN0ZXItaGEiID4KKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS9zdG9yZWNvbmZpZyIgdGFyZ2V0PSJkaXN0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29uZmlnLWhhIiBpZj0iY2x1c3Rlci1oYSIgPgorICAgIDxhbnQgZGlyPSIke2Jhc2VkaXJ9L3N0b3JlY29uZmlnLWhhIiB0YXJnZXQ9ImRpc3QiLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09IEJVSUxEOiBDb21waWxlIFNlcnZlciBDb21wb25lbnRzID09PT09PT09PT09PT09PT09IC0tPgorICA8IS0tIFVwZGF0ZSB0aGUgZGVwZW5kcyBsaXN0IGZvciBlYWNoIHN1YnByb2plY3QgLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9ImJ1aWxkLXByZXBhcmUsY2x1c3Rlcixncm91cGNvbSxoYSxjb25maWctaGEsY29uZmlnIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNsZWFuIj4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBSZWJ1aWxkIEV2ZXJ5dGhpbmcgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iYnVpbGQtY2xlYW4sZGlzdCIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PSBERVBMT1k6IERlcGxveSBXZWJhcHBzIFByb2plY3RzID09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkZXBsb3kiIGRlcGVuZHM9ImRpc3QiCisgICBkZXNjcmlwdGlvbj0iQnVpbGQgYW5kIGRlcGxveSBNb2R1bGVzIGNvbXBvbmVudCI+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXN0cmlidXRpb24gRmlsZXMgPT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImJ1aWxkIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENsZWFuIERpcmVjdG9yeSA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QtY2xlYW4iPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBDb252ZW5pZW50IFN5bm9ueW1zID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGRpc3QtY2xlYW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYnVpbGQgYW5kIGRpc3QgZGlyZWN0b3JpZXMiLz4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IFRFU1Q6IENvbXBpbGUgVW5pdCBUZXN0cyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtdGVzdHMiIGRlcGVuZHM9ImRpc3QiIGlmPSJqdW5pdC5wcmVzZW50Ij4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBURVNUOiBFeGVjdXRlIFVuaXQgVGVzdHMgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3QiIGlmPSJqdW5pdC5wcmVzZW50IgorICAgZGVzY3JpcHRpb249IlJ1biBhbGwgdW5pdCB0ZXN0IGNhc2VzIj4KKyAgPC90YXJnZXQ+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9idWlsZC54bWwgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGQ4ZmFkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9idWlsZC54bWwKQEAgLTAsMCArMSwxNTcgQEAKKzxwcm9qZWN0IG5hbWU9IkNsdXN0ZXIiIGRlZmF1bHQ9ImRpc3QiIGJhc2VkaXI9Ii4iPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSBQcm9wZXJ0eSBWYWx1ZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8cHJvcGVydHkgZmlsZT0iLi4vLi4vLi4vYnVpbGQucHJvcGVydGllcyIgLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uLy4uLy4uL2J1aWxkL2J1aWxkLnByb3BlcnRpZXMiIC8+CisgIDxwcm9wZXJ0eSBmaWxlPSIuLi8uLi8uLi9idWlsZC9idWlsZC5wcm9wZXJ0aWVzLmRlZmF1bHQiIC8+CisKKyAgPCEtLSBCdWlsZCBEZWZhdWx0cyAtLT4KKyAgPHByb3BlcnR5IG5hbWU9ImNhdGFsaW5hLmhvbWUiICBsb2NhdGlvbj0iLi4vLi4iLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNhdGFsaW5hLmJ1aWxkIiBsb2NhdGlvbj0iLi4vLi4vLi4vYnVpbGQvYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNsdXN0ZXIuYnVpbGQiICB2YWx1ZT0iJHtjYXRhbGluYS5ob21lfS9tb2R1bGVzL2NsdXN0ZXIvYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNsdXN0ZXIuZGlzdCIgICB2YWx1ZT0iJHtjYXRhbGluYS5ob21lfS9tb2R1bGVzL2NsdXN0ZXIvZGlzdCIvPgorCisgICAgPCEtLSBDb25zdHJ1Y3QgQ2F0YWxpbmEgY2xhc3NwYXRoIC0tPgorICA8cGF0aCBpZD0iY2x1c3Rlci5jbGFzc3BhdGgiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjYXRhbGluYS5idWlsZH0vc2VydmVyL2xpYi9jYXRhbGluYS5qYXIiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2F0YWxpbmEuYnVpbGR9L3NlcnZlci9saWIvdG9tY2F0LXV0aWwuamFyIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbW9kZWxlci5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbG9nZ2luZy5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pteC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NhdGFsaW5hLmJ1aWxkfS9jb21tb24vbGliL3NlcnZsZXQtYXBpLmphciIvPgorICA8L3BhdGg+CisKKyAgICA8IS0tIFNvdXJjZSBwYXRoIC0tPgorICA8cGF0aCBpZD0iamF2YWRvYy5zb3VyY2VwYXRoIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy9zaGFyZSIvPgorICA8L3BhdGg+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IFNldCBjb21waWxlIGZsYWdzID09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImZsYWdzIj4KKyAgICA8IS0tIEpESyBmbGFncyAtLT4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsuMS4yLnByZXNlbnQiIGNsYXNzbmFtZT0iamF2YS51dGlsLkhhc2hNYXAiIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrLjEuMy5wcmVzZW50IiAKKyAgICAgY2xhc3NuYW1lPSJqYXZhLmxhbmcucmVmbGVjdC5Qcm94eSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsuMS40LnByZXNlbnQiIGNsYXNzbmFtZT0iamF2YS5uaW8uQnVmZmVyIiAvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogU2V0IGNvbXBpbGUgZmxhZ3MgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZmxhZ3MuZGlzcGxheSIgZGVwZW5kcz0iZmxhZ3MiIHVubGVzcz0iZmxhZ3MuaGlkZSI+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gQnVpbGQgZW52aXJvbm1lbnQgZm9yIENhdGFsaW5hIC0tLSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9IklmICR7cHJvcGVydHlfbmFtZX0gaXMgZGlzcGxheWVkLCB0aGVuIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0KSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBCdWlsZCBvcHRpb25zIC0tLSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJmdWxsLmRpc3Q9JHtmdWxsLmRpc3R9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImJ1aWxkLnN5c2NsYXNzcGF0aD0ke2J1aWxkLnN5c2NsYXNzcGF0aH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5kZWJ1Zz0ke2NvbXBpbGUuZGVidWd9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUuZGVwcmVjYXRpb249JHtjb21waWxlLmRlcHJlY2F0aW9ufSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlLm9wdGltaXplPSR7Y29tcGlsZS5vcHRpbWl6ZX0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gQW50IEZsYWdzIC0tLSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSImbHQ7c3R5bGUmZ3Q7IHRhc2sgYXZhaWxhYmxlIChyZXF1aXJlZCk9JHtzdHlsZS5hdmFpbGFibGV9IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIEpESyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iamRrLjEuMi5wcmVzZW50PSR7amRrLjEuMi5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqZGsuMS4zLnByZXNlbnQ9JHtqZGsuMS4zLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Impkay4xLjQucHJlc2VudD0ke2pkay4xLjQucHJlc2VudH0iIC8+CisKKyAgPC90YXJnZXQ+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDcmVhdGUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfSIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NsYXNzZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke2NsdXN0ZXIuZGlzdH0iLz4KKyAgPC90YXJnZXQ+CisKKworCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09IEJVSUxEOiBDb21waWxlIENhdGFsaW5hIENvbXBvbmVudHMgPT09PT09PT09PT09PT09PSAtLT4KKyAgCisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtY2F0YWxpbmEtY2x1c3RlciIgZGVwZW5kcz0iYnVpbGQtcHJlcGFyZSI+CisgICAgPCEtLSBDb21waWxlIGludGVybmFsIHNlcnZlciBjb21wb25lbnRzIC0tPgorICAgIDxqYXZhYyBzcmNkaXI9IiR7YmFzZWRpcn0vc3JjL3NoYXJlIiBkZXN0ZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jbGFzc2VzIgorICAgICAgICAgICBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIgZGVwcmVjYXRpb249IiR7Y29tcGlsZS5kZXByZWNhdGlvbn0iCisgICAgICAgICAgIG9wdGltaXplPSIke2NvbXBpbGUub3B0aW1pemV9IgorICAgICAgICAgICBleGNsdWRlcz0iKiovQ1ZTLyoqIiAgCSAgIAorICAgIAk+CisgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNsdXN0ZXIuY2xhc3NwYXRoIiAvPgorICAgIDwvamF2YWM+CisgICAgPGNvcHkgZmlsZT0iJHtiYXNlZGlyfS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIgorICAgIAkgIHRvZmlsZT0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMiLz4KKyAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyIKKyAgICAJICB0b2ZpbGU9IiR7Y2F0YWxpbmEuYnVpbGR9L2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMiLz4KKyAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIgorICAgIAkgIHRvZmlsZT0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIi8+CisgICAgPGNvcHkgZmlsZT0iJHtiYXNlZGlyfS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9EYXRhU2VuZGVycy5wcm9wZXJ0aWVzIgorICAgIAkgIHRvZmlsZT0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL0RhdGFTZW5kZXJzLnByb3BlcnRpZXMiLz4KKyAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIgorICAgIAkgIHRvZmlsZT0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIi8+CisgICAgPGNvcHkgZmlsZT0iJHtiYXNlZGlyfS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIgorICAgIAkgIHRvZmlsZT0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL21iZWFucy1kZXNjcmlwdG9ycy54bWwiLz4KKyAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWNhc3QvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMiCisgICAgCSAgdG9maWxlPSIke2NhdGFsaW5hLmJ1aWxkfS9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9tY2FzdC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyIvPgorICAgIDxjb3B5IGZpbGU9IiR7YmFzZWRpcn0vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9tY2FzdC9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIgorICAgICAJICB0b2ZpbGU9IiR7Y2F0YWxpbmEuYnVpbGR9L2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL21jYXN0L21iZWFucy1kZXNjcmlwdG9ycy54bWwiLz4KKyAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvYXV0aGVudGljYXRvci9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIgorICAgICAJICB0b2ZpbGU9IiR7Y2F0YWxpbmEuYnVpbGR9L2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2F1dGhlbnRpY2F0b3IvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCIvPgorICAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBDYXRhbGluYSBKYXZhZG9jcyA9PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiPgorICAgIDxkZWxldGUgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9qYXZhZG9jIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5idWlsZH0vamF2YWRvYyIvPgorICAgIDxqYXZhZG9jIHBhY2thZ2VuYW1lcz0ib3JnLmFwYWNoZS5jYXRhbGluYS4qLG9yZy5hcGFjaGUubmFtaW5nLioiCisgICAgICBjbGFzc3BhdGhyZWY9ImNhdGFsaW5hLmNsYXNzcGF0aCIKKyAgICAgIHNvdXJjZXBhdGhyZWY9ImphdmFkb2Muc291cmNlcGF0aCIKKyAgICAgIGRlc3RkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2phdmFkb2MiCisgICAgICBhdXRob3I9InRydWUiCisgICAgICB2ZXJzaW9uPSJ0cnVlIgorICAgICAgd2luZG93dGl0bGU9IkNhdGFsaW5hIEludGVybmFsIEFQSSBEb2N1bWVudGF0aW9uIgorICAgICAgZG9jdGl0bGU9IkNhdGFsaW5hIEFQSSIKKyAgICAgIGJvdHRvbT0iQ29weXJpZ2h0ICYjMTY5OyAyMDAwLTIwMDcgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLiIKKyAgICAvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENsZWFuIERpcmVjdG9yeSA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IFJlYnVpbGQgRXZlcnl0aGluZyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKworCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXN0cmlidXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJidWlsZC1jYXRhbGluYS1jbHVzdGVyIj4KKyAgICAKKyAgICA8amFyIGRlc3RmaWxlPSIke2NsdXN0ZXIuZGlzdH0vY2F0YWxpbmEtY2x1c3Rlci5qYXIiCisgICAgICAgICBiYXNlZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jbGFzc2VzIj4KKyAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvKioiIC8+CisgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovcGFja2FnZS5odG1sIiAvPgorICAgICAgIDxleGNsdWRlIG5hbWU9IioqL0xvY2FsU3RyaW5nc18qIiAvPgorICAgIDwvamFyPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNvcHkiIGRlcGVuZHM9ImRpc3QiID4KKyAgICAgPGNvcHkgZmlsZT0iJHtjbHVzdGVyLmRpc3R9L2NhdGFsaW5hLWNsdXN0ZXIuamFyIiB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vc2VydmVyL2xpYiIgLz4KKyAgPC90YXJnZXQ+CisgIAorICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IENvbnZlbmllbnQgU3lub255bXMgPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL2V0Yy9jbHVzdGVyLXNlcnZlci54bWwgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL2V0Yy9jbHVzdGVyLXNlcnZlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiNWVkMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvZXRjL2NsdXN0ZXItc2VydmVyLnhtbApAQCAtMCwwICsxLDM2OCBAQAorPCEtLSBFeGFtcGxlIFNlcnZlciBDb25maWd1cmF0aW9uIEZpbGUgIC0gU2VhcmNoIGZvciBDbHVzdGVyLS0+Cis8IS0tIE5vdGUgdGhhdCBjb21wb25lbnQgZWxlbWVudHMgYXJlIG5lc3RlZCBjb3JyZXNwb25kaW5nIHRvIHRoZWlyCisgICAgIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzIHdpdGggZWFjaCBvdGhlciAtLT4KKworPCEtLSBBICJTZXJ2ZXIiIGlzIGEgc2luZ2xldG9uIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSBlbnRpcmUgSlZNLAorICAgICB3aGljaCBtYXkgY29udGFpbiBvbmUgb3IgbW9yZSAiU2VydmljZSIgaW5zdGFuY2VzLiAgVGhlIFNlcnZlcgorICAgICBsaXN0ZW5zIGZvciBhIHNodXRkb3duIGNvbW1hbmQgb24gdGhlIGluZGljYXRlZCBwb3J0LgorCisgICAgIE5vdGU6ICBBICJTZXJ2ZXIiIGlzIG5vdCBpdHNlbGYgYSAiQ29udGFpbmVyIiwgc28geW91IG1heSBub3QKKyAgICAgZGVmaW5lIHN1YmNvbXBvbmVudHMgc3VjaCBhcyAiVmFsdmVzIiBvciAiTG9nZ2VycyIgYXQgdGhpcyBsZXZlbC4KKyAtLT4KKworPFNlcnZlciBwb3J0PSI4MDA1IiBzaHV0ZG93bj0iU0hVVERPV04iIGRlYnVnPSIwIj4KKworCisgIDwhLS0gQ29tbWVudCB0aGVzZSBlbnRyaWVzIG91dCB0byBkaXNhYmxlIEpNWCBNQmVhbnMgc3VwcG9ydCAtLT4KKyAgPCEtLSBZb3UgbWF5IGFsc28gY29uZmlndXJlIGN1c3RvbSBjb21wb25lbnRzIChlLmcuIFZhbHZlcy9SZWFsbXMpIGJ5IAorICAgICAgIGluY2x1ZGluZyB5b3VyIG93biBtYmVhbi1kZXNjcmlwdG9yIGZpbGUocyksIGFuZCBzZXR0aW5nIHRoZSAKKyAgICAgICAiZGVzY3JpcHRvcnMiIGF0dHJpYnV0ZSB0byBwb2ludCB0byBhICc7JyBzZXBlcmF0ZWQgbGlzdCBvZiBwYXRocworICAgICAgIChpbiB0aGUgQ2xhc3NMb2FkZXIgc2Vuc2UpIG9mIGZpbGVzIHRvIGFkZCB0byB0aGUgZGVmYXVsdCBsaXN0LgorICAgICAgIGUuZy4gZGVzY3JpcHRvcnM9Ii9jb20vbXlmaXJtL215cGFja2FnZS9tYmVhbi1kZXNjcmlwdG9yLnhtbCIKKyAgLS0+CisgIDxMaXN0ZW5lciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIgorICAgICAgICAgICAgZGVidWc9IjAiLz4KKyAgPExpc3RlbmVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuR2xvYmFsUmVzb3VyY2VzTGlmZWN5Y2xlTGlzdGVuZXIiCisgICAgICAgICAgICBkZWJ1Zz0iMCIvPgorICAKKyAgPCEtLSBHbG9iYWwgSk5ESSByZXNvdXJjZXMgLS0+CisgIDxHbG9iYWxOYW1pbmdSZXNvdXJjZXM+CisKKyAgICA8IS0tIFRlc3QgZW50cnkgZm9yIGRlbW9uc3RyYXRpb24gcHVycG9zZXMgLS0+CisgICAgPEVudmlyb25tZW50IG5hbWU9InNpbXBsZVZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciIgdmFsdWU9IjMwIi8+CisKKyAgICA8IS0tIEVkaXRhYmxlIHVzZXIgZGF0YWJhc2UgdGhhdCBjYW4gYWxzbyBiZSB1c2VkIGJ5CisgICAgICAgICBVc2VyRGF0YWJhc2VSZWFsbSB0byBhdXRoZW50aWNhdGUgdXNlcnMgLS0+CisgICAgPFJlc291cmNlIG5hbWU9IlVzZXJEYXRhYmFzZSIgYXV0aD0iQ29udGFpbmVyIgorICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZSIKKyAgICAgICBkZXNjcmlwdGlvbj0iVXNlciBkYXRhYmFzZSB0aGF0IGNhbiBiZSB1cGRhdGVkIGFuZCBzYXZlZCI+CisgICAgPC9SZXNvdXJjZT4KKyAgICA8UmVzb3VyY2VQYXJhbXMgbmFtZT0iVXNlckRhdGFiYXNlIj4KKyAgICAgIDxwYXJhbWV0ZXI+CisgICAgICAgIDxuYW1lPmZhY3Rvcnk8L25hbWU+CisgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLk1lbW9yeVVzZXJEYXRhYmFzZUZhY3Rvcnk8L3ZhbHVlPgorICAgICAgPC9wYXJhbWV0ZXI+CisgICAgICA8cGFyYW1ldGVyPgorICAgICAgICA8bmFtZT5wYXRobmFtZTwvbmFtZT4KKyAgICAgICAgPHZhbHVlPmNvbmYvdG9tY2F0LXVzZXJzLnhtbDwvdmFsdWU+CisgICAgICA8L3BhcmFtZXRlcj4KKyAgICA8L1Jlc291cmNlUGFyYW1zPgorCisgIDwvR2xvYmFsTmFtaW5nUmVzb3VyY2VzPgorCisgIDwhLS0gQSAiU2VydmljZSIgaXMgYSBjb2xsZWN0aW9uIG9mIG9uZSBvciBtb3JlICJDb25uZWN0b3JzIiB0aGF0IHNoYXJlCisgICAgICAgYSBzaW5nbGUgIkNvbnRhaW5lciIgKGFuZCB0aGVyZWZvcmUgdGhlIHdlYiBhcHBsaWNhdGlvbnMgdmlzaWJsZQorICAgICAgIHdpdGhpbiB0aGF0IENvbnRhaW5lcikuICBOb3JtYWxseSwgdGhhdCBDb250YWluZXIgaXMgYW4gIkVuZ2luZSIsCisgICAgICAgYnV0IHRoaXMgaXMgbm90IHJlcXVpcmVkLgorCisgICAgICAgTm90ZTogIEEgIlNlcnZpY2UiIGlzIG5vdCBpdHNlbGYgYSAiQ29udGFpbmVyIiwgc28geW91IG1heSBub3QKKyAgICAgICBkZWZpbmUgc3ViY29tcG9uZW50cyBzdWNoIGFzICJWYWx2ZXMiIG9yICJMb2dnZXJzIiBhdCB0aGlzIGxldmVsLgorICAgLS0+CisKKyAgPCEtLSBEZWZpbmUgdGhlIFRvbWNhdCBTdGFuZC1BbG9uZSBTZXJ2aWNlIC0tPgorICA8U2VydmljZSBuYW1lPSJUb21jYXQtU3RhbmRhbG9uZSI+CisKKyAgICA8IS0tIEEgIkNvbm5lY3RvciIgcmVwcmVzZW50cyBhbiBlbmRwb2ludCBieSB3aGljaCByZXF1ZXN0cyBhcmUgcmVjZWl2ZWQKKyAgICAgICAgIGFuZCByZXNwb25zZXMgYXJlIHJldHVybmVkLiAgRWFjaCBDb25uZWN0b3IgcGFzc2VzIHJlcXVlc3RzIG9uIHRvIHRoZQorICAgICAgICAgYXNzb2NpYXRlZCAiQ29udGFpbmVyIiAobm9ybWFsbHkgYW4gRW5naW5lKSBmb3IgcHJvY2Vzc2luZy4KKworICAgICAgICAgQnkgZGVmYXVsdCwgYSBub24tU1NMIEhUVFAvMS4xIENvbm5lY3RvciBpcyBlc3RhYmxpc2hlZCBvbiBwb3J0IDgwODAuCisgICAgICAgICBZb3UgY2FuIGFsc28gZW5hYmxlIGFuIFNTTCBIVFRQLzEuMSBDb25uZWN0b3Igb24gcG9ydCA4NDQzIGJ5CisgICAgICAgICBmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyBiZWxvdyBhbmQgdW5jb21tZW50aW5nIHRoZSBzZWNvbmQgQ29ubmVjdG9yCisgICAgICAgICBlbnRyeS4gIFNTTCBzdXBwb3J0IHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgc3RlcHMgKHNlZSB0aGUgU1NMIENvbmZpZworICAgICAgICAgSE9XVE8gaW4gdGhlIFRvbWNhdCA1IGRvY3VtZW50YXRpb24gYnVuZGxlIGZvciBtb3JlIGRldGFpbGVkCisgICAgICAgICBpbnN0cnVjdGlvbnMpOgorICAgICAgICAgKiBJZiB5b3VyIEpESyB2ZXJzaW9uIDEuMyBvciBwcmlvciwgZG93bmxvYWQgYW5kIGluc3RhbGwgSlNTRSAxLjAuMiBvcgorICAgICAgICAgICBsYXRlciwgYW5kIHB1dCB0aGUgSkFSIGZpbGVzIGludG8gIiRKQVZBX0hPTUUvanJlL2xpYi9leHQiLgorICAgICAgICAgKiBFeGVjdXRlOgorICAgICAgICAgICAgICVKQVZBX0hPTUUlXGJpblxrZXl0b29sIC1nZW5rZXkgLWFsaWFzIHRvbWNhdCAta2V5YWxnIFJTQSAoV2luZG93cykKKyAgICAgICAgICAgICAkSkFWQV9IT01FL2Jpbi9rZXl0b29sIC1nZW5rZXkgLWFsaWFzIHRvbWNhdCAta2V5YWxnIFJTQSAgKFVuaXgpCisgICAgICAgICAgIHdpdGggYSBwYXNzd29yZCB2YWx1ZSBvZiAiY2hhbmdlaXQiIGZvciBib3RoIHRoZSBjZXJ0aWZpY2F0ZSBhbmQKKyAgICAgICAgICAgdGhlIGtleXN0b3JlIGl0c2VsZi4KKworICAgICAgICAgQnkgZGVmYXVsdCwgRE5TIGxvb2t1cHMgYXJlIGVuYWJsZWQgd2hlbiBhIHdlYiBhcHBsaWNhdGlvbiBjYWxscworICAgICAgICAgcmVxdWVzdC5nZXRSZW1vdGVIb3N0KCkuICBUaGlzIGNhbiBoYXZlIGFuIGFkdmVyc2UgaW1wYWN0IG9uCisgICAgICAgICBwZXJmb3JtYW5jZSwgc28geW91IGNhbiBkaXNhYmxlIGl0IGJ5IHNldHRpbmcgdGhlCisgICAgICAgICAiZW5hYmxlTG9va3VwcyIgYXR0cmlidXRlIHRvICJmYWxzZSIuICBXaGVuIEROUyBsb29rdXBzIGFyZSBkaXNhYmxlZCwKKyAgICAgICAgIHJlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpIHdpbGwgcmV0dXJuIHRoZSBTdHJpbmcgdmVyc2lvbiBvZiB0aGUKKyAgICAgICAgIElQIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBjbGllbnQuCisgICAgLS0+CisKKyAgICA8IS0tIERlZmluZSBhIG5vbi1TU0wgQ295b3RlIEhUVFAvMS4xIENvbm5lY3RvciBvbiBwb3J0IDgwODAgLS0+CisgICAgPENvbm5lY3RvciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY295b3RlLnRvbWNhdDUuQ295b3RlQ29ubmVjdG9yIgorICAgICAgICAgICAgICAgcG9ydD0iODA4MCIgbWluUHJvY2Vzc29ycz0iNSIgbWF4UHJvY2Vzc29ycz0iMTAwIgorICAgICAgICAgICAgICAgZW5hYmxlTG9va3Vwcz0idHJ1ZSIgcmVkaXJlY3RQb3J0PSI4NDQzIiBhY2NlcHRDb3VudD0iMTAwIgorICAgICAgICAgICAgICAgZGVidWc9IjAiIGNvbm5lY3Rpb25UaW1lb3V0PSIyMDAwMCIgCisgICAgICAgICAgICAgICBkaXNhYmxlVXBsb2FkVGltZW91dD0idHJ1ZSIgLz4KKyAgICA8IS0tIE5vdGUgOiBUbyBkaXNhYmxlIGNvbm5lY3Rpb24gdGltZW91dHMsIHNldCBjb25uZWN0aW9uVGltZW91dCB2YWx1ZQorICAgICB0byAtMSAtLT4KKworICAgIDwhLS0gRGVmaW5lIGEgU1NMIENveW90ZSBIVFRQLzEuMSBDb25uZWN0b3Igb24gcG9ydCA4NDQzIC0tPgorICAgIDwhLS0KKyAgICA8Q29ubmVjdG9yIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jb3lvdGUudG9tY2F0NS5Db3lvdGVDb25uZWN0b3IiCisgICAgICAgICAgICAgICBwb3J0PSI4NDQzIiBtaW5Qcm9jZXNzb3JzPSI1IiBtYXhQcm9jZXNzb3JzPSI3NSIKKyAgICAgICAgICAgICAgIGVuYWJsZUxvb2t1cHM9InRydWUiIGRpc2FibGVVcGxvYWRUaW1lb3V0PSJ0cnVlIgorICAgICAgICAgICBhY2NlcHRDb3VudD0iMTAwIiBkZWJ1Zz0iMCIgc2NoZW1lPSJodHRwcyIgc2VjdXJlPSJ0cnVlIj4KKyAgICAgIDxGYWN0b3J5IGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jb3lvdGUudG9tY2F0NS5Db3lvdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5IgorICAgICAgICAgICAgICAgY2xpZW50QXV0aD0iZmFsc2UiIHByb3RvY29sPSJUTFMiIC8+CisgICAgPC9Db25uZWN0b3I+CisgICAgLS0+CisKKyAgICA8IS0tIERlZmluZSBhIENveW90ZS9KSzIgQUpQIDEuMyBDb25uZWN0b3Igb24gcG9ydCA4MDA5IC0tPgorICAgIDxDb25uZWN0b3IgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNveW90ZS50b21jYXQ1LkNveW90ZUNvbm5lY3RvciIKKyAgICAgICAgICAgICAgIHBvcnQ9IjgwMDkiIG1pblByb2Nlc3NvcnM9IjUiIG1heFByb2Nlc3NvcnM9Ijc1IgorICAgICAgICAgICAgICAgZW5hYmxlTG9va3Vwcz0idHJ1ZSIgcmVkaXJlY3RQb3J0PSI4NDQzIgorICAgICAgICAgICAgICAgYWNjZXB0Q291bnQ9IjEwIiBkZWJ1Zz0iMCIKKyAgICAgICAgICAgICAgIHByb3RvY29sSGFuZGxlckNsYXNzTmFtZT0ib3JnLmFwYWNoZS5qay5zZXJ2ZXIuSmtDb3lvdGVIYW5kbGVyIi8+CisKKyAgICA8IS0tIERlZmluZSBhIFByb3hpZWQgSFRUUC8xLjEgQ29ubmVjdG9yIG9uIHBvcnQgODA4MiAtLT4KKyAgICA8IS0tIFNlZSBwcm94eSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIHRoaXMuIC0tPgorICAgIDwhLS0KKyAgICA8Q29ubmVjdG9yIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jb3lvdGUudG9tY2F0NS5Db3lvdGVDb25uZWN0b3IiCisgICAgICAgICAgICAgICBwb3J0PSI4MDgyIiBtaW5Qcm9jZXNzb3JzPSI1IiBtYXhQcm9jZXNzb3JzPSI3NSIKKyAgICAgICAgICAgICAgIGVuYWJsZUxvb2t1cHM9InRydWUiCisgICAgICAgICAgICAgICBhY2NlcHRDb3VudD0iMTAwIiBkZWJ1Zz0iMCIgY29ubmVjdGlvblRpbWVvdXQ9IjIwMDAwIgorICAgICAgICAgICAgICAgcHJveHlQb3J0PSI4MCIgZGlzYWJsZVVwbG9hZFRpbWVvdXQ9InRydWUiIC8+CisgICAgLS0+CisKKyAgICA8IS0tIEFuIEVuZ2luZSByZXByZXNlbnRzIHRoZSBlbnRyeSBwb2ludCAod2l0aGluIENhdGFsaW5hKSB0aGF0IHByb2Nlc3NlcworICAgICAgICAgZXZlcnkgcmVxdWVzdC4gIFRoZSBFbmdpbmUgaW1wbGVtZW50YXRpb24gZm9yIFRvbWNhdCBzdGFuZCBhbG9uZQorICAgICAgICAgYW5hbHl6ZXMgdGhlIEhUVFAgaGVhZGVycyBpbmNsdWRlZCB3aXRoIHRoZSByZXF1ZXN0LCBhbmQgcGFzc2VzIHRoZW0KKyAgICAgICAgIG9uIHRvIHRoZSBhcHByb3ByaWF0ZSBIb3N0ICh2aXJ0dWFsIGhvc3QpLiAtLT4KKworICAgIDwhLS0gWW91IHNob3VsZCBzZXQganZtUm91dGUgdG8gc3VwcG9ydCBsb2FkLWJhbGFuY2luZyB2aWEgSksvSksyIGllIDoKKyAgICA8RW5naW5lIG5hbWU9IlN0YW5kYWxvbmUiIGRlZmF1bHRIb3N0PSJsb2NhbGhvc3QiIGRlYnVnPSIwIiBqbXZSb3V0ZT0ianZtMSI+ICAgICAgICAgCisgICAgLS0+IAorICAgICAgICAgCisgICAgPCEtLSBEZWZpbmUgdGhlIHRvcCBsZXZlbCBjb250YWluZXIgaW4gb3VyIGNvbnRhaW5lciBoaWVyYXJjaHkgLS0+CisgICAgPEVuZ2luZSBuYW1lPSJTdGFuZGFsb25lIiBkZWZhdWx0SG9zdD0ibG9jYWxob3N0IiBkZWJ1Zz0iMCI+CisKKyAgICAgIDwhLS0gVGhlIHJlcXVlc3QgZHVtcGVyIHZhbHZlIGR1bXBzIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgICAgICAgdGhlIHJlcXVlc3QgaGVhZGVycyBhbmQgY29va2llcyB0aGF0IHdlcmUgcmVjZWl2ZWQsIGFuZCB0aGUgcmVzcG9uc2UKKyAgICAgICAgICAgaGVhZGVycyBhbmQgY29va2llcyB0aGF0IHdlcmUgc2VudCwgZm9yIGFsbCByZXF1ZXN0cyByZWNlaXZlZCBieQorICAgICAgICAgICB0aGlzIGluc3RhbmNlIG9mIFRvbWNhdC4gIElmIHlvdSBjYXJlIG9ubHkgYWJvdXQgcmVxdWVzdHMgdG8gYQorICAgICAgICAgICBwYXJ0aWN1bGFyIHZpcnR1YWwgaG9zdCwgb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLCBuZXN0IHRoaXMKKyAgICAgICAgICAgZWxlbWVudCBpbnNpZGUgdGhlIGNvcnJlc3BvbmRpbmcgPEhvc3Q+IG9yIDxDb250ZXh0PiBlbnRyeSBpbnN0ZWFkLgorCisgICAgICAgICAgIEZvciBhIHNpbWlsYXIgbWVjaGFuaXNtIHRoYXQgaXMgcG9ydGFibGUgdG8gYWxsIFNlcnZsZXQgMi40CisgICAgICAgICAgIGNvbnRhaW5lcnMsIGNoZWNrIG91dCB0aGUgIlJlcXVlc3REdW1wZXJGaWx0ZXIiIEZpbHRlciBpbiB0aGUKKyAgICAgICAgICAgZXhhbXBsZSBhcHBsaWNhdGlvbiAodGhlIHNvdXJjZSBmb3IgdGhpcyBmaWx0ZXIgbWF5IGJlIGZvdW5kIGluCisgICAgICAgICAgICIkQ0FUQUxJTkFfSE9NRS93ZWJhcHBzL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9maWx0ZXJzIikuCisKKyAgICAgICAgICAgUmVxdWVzdCBkdW1waW5nIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuICBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZworICAgICAgICAgICBlbGVtZW50IHRvIGVuYWJsZSBpdC4gLS0+CisgICAgICA8IS0tCisgICAgICA8VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZXF1ZXN0RHVtcGVyVmFsdmUiLz4KKyAgICAgIC0tPgorCisgICAgICA8IS0tIEdsb2JhbCBsb2dnZXIgdW5sZXNzIG92ZXJyaWRkZW4gYXQgbG93ZXIgbGV2ZWxzIC0tPgorICAgICAgPExvZ2dlciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubG9nZ2VyLkZpbGVMb2dnZXIiCisgICAgICAgICAgICAgIHByZWZpeD0iY2F0YWxpbmFfbG9nLiIgc3VmZml4PSIudHh0IgorICAgICAgICAgICAgICB0aW1lc3RhbXA9InRydWUiLz4KKworICAgICAgPCEtLSBCZWNhdXNlIHRoaXMgUmVhbG0gaXMgaGVyZSwgYW4gaW5zdGFuY2Ugd2lsbCBiZSBzaGFyZWQgZ2xvYmFsbHkgLS0+CisKKyAgICAgIDwhLS0gVGhpcyBSZWFsbSB1c2VzIHRoZSBVc2VyRGF0YWJhc2UgY29uZmlndXJlZCBpbiB0aGUgZ2xvYmFsIEpOREkKKyAgICAgICAgICAgcmVzb3VyY2VzIHVuZGVyIHRoZSBrZXkgIlVzZXJEYXRhYmFzZSIuICBBbnkgZWRpdHMKKyAgICAgICAgICAgdGhhdCBhcmUgcGVyZm9ybWVkIGFnYWluc3QgdGhpcyBVc2VyRGF0YWJhc2UgYXJlIGltbWVkaWF0ZWx5CisgICAgICAgICAgIGF2YWlsYWJsZSBmb3IgdXNlIGJ5IHRoZSBSZWFsbS4gIC0tPgorICAgICAgPFJlYWxtIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5Vc2VyRGF0YWJhc2VSZWFsbSIKKyAgICAgICAgICAgICAgICAgZGVidWc9IjAiIHJlc291cmNlTmFtZT0iVXNlckRhdGFiYXNlIi8+CisKKyAgICAgIDwhLS0gQ29tbWVudCBvdXQgdGhlIG9sZCByZWFsbSBidXQgbGVhdmUgaGVyZSBmb3Igbm93IGluIGNhc2Ugd2UKKyAgICAgICAgICAgbmVlZCB0byBnbyBiYWNrIHF1aWNrbHkgLS0+CisgICAgICA8IS0tCisgICAgICA8UmVhbG0gY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLk1lbW9yeVJlYWxtIiAvPgorICAgICAgLS0+CisKKyAgICAgIDwhLS0gUmVwbGFjZSB0aGUgYWJvdmUgUmVhbG0gd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0byBnZXQgYSBSZWFsbQorICAgICAgICAgICBzdG9yZWQgaW4gYSBkYXRhYmFzZSBhbmQgYWNjZXNzZWQgdmlhIEpEQkMgLS0+CisKKyAgICAgIDwhLS0KKyAgICAgIDxSZWFsbSAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpEQkNSZWFsbSIgZGVidWc9Ijk5IgorICAgICAgICAgICAgIGRyaXZlck5hbWU9Im9yZy5nanQubW0ubXlzcWwuRHJpdmVyIgorICAgICAgICAgIGNvbm5lY3Rpb25VUkw9ImpkYmM6bXlzcWw6Ly9sb2NhbGhvc3QvYXV0aG9yaXR5IgorICAgICAgICAgY29ubmVjdGlvbk5hbWU9InRlc3QiIGNvbm5lY3Rpb25QYXNzd29yZD0idGVzdCIKKyAgICAgICAgICAgICAgdXNlclRhYmxlPSJ1c2VycyIgdXNlck5hbWVDb2w9InVzZXJfbmFtZSIgdXNlckNyZWRDb2w9InVzZXJfcGFzcyIKKyAgICAgICAgICB1c2VyUm9sZVRhYmxlPSJ1c2VyX3JvbGVzIiByb2xlTmFtZUNvbD0icm9sZV9uYW1lIiAvPgorICAgICAgLS0+CisKKyAgICAgIDwhLS0KKyAgICAgIDxSZWFsbSAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpEQkNSZWFsbSIgZGVidWc9Ijk5IgorICAgICAgICAgICAgIGRyaXZlck5hbWU9Im9yYWNsZS5qZGJjLmRyaXZlci5PcmFjbGVEcml2ZXIiCisgICAgICAgICAgY29ubmVjdGlvblVSTD0iamRiYzpvcmFjbGU6dGhpbjpAbnRzZXJ2ZXI6MTUyMTpPUkNMIgorICAgICAgICAgY29ubmVjdGlvbk5hbWU9InNjb3R0IiBjb25uZWN0aW9uUGFzc3dvcmQ9InRpZ2VyIgorICAgICAgICAgICAgICB1c2VyVGFibGU9InVzZXJzIiB1c2VyTmFtZUNvbD0idXNlcl9uYW1lIiB1c2VyQ3JlZENvbD0idXNlcl9wYXNzIgorICAgICAgICAgIHVzZXJSb2xlVGFibGU9InVzZXJfcm9sZXMiIHJvbGVOYW1lQ29sPSJyb2xlX25hbWUiIC8+CisgICAgICAtLT4KKworICAgICAgPCEtLQorICAgICAgPFJlYWxtICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkRCQ1JlYWxtIiBkZWJ1Zz0iOTkiCisgICAgICAgICAgICAgZHJpdmVyTmFtZT0ic3VuLmpkYmMub2RiYy5KZGJjT2RiY0RyaXZlciIKKyAgICAgICAgICBjb25uZWN0aW9uVVJMPSJqZGJjOm9kYmM6Q0FUQUxJTkEiCisgICAgICAgICAgICAgIHVzZXJUYWJsZT0idXNlcnMiIHVzZXJOYW1lQ29sPSJ1c2VyX25hbWUiIHVzZXJDcmVkQ29sPSJ1c2VyX3Bhc3MiCisgICAgICAgICAgdXNlclJvbGVUYWJsZT0idXNlcl9yb2xlcyIgcm9sZU5hbWVDb2w9InJvbGVfbmFtZSIgLz4KKyAgICAgIC0tPgorCisgICAgICA8IS0tIERlZmluZSB0aGUgZGVmYXVsdCB2aXJ0dWFsIGhvc3QgLS0+CisgICAgICA8SG9zdCBuYW1lPSJsb2NhbGhvc3QiIGRlYnVnPSIwIiBhcHBCYXNlPSJ3ZWJhcHBzIgorICAgICAgIHVucGFja1dBUnM9InRydWUiIGF1dG9EZXBsb3k9InRydWUiPgorICAgICAgIAorICAgICAgICAKKyAgICAgICAgPCEtLSBEZWZpbmVzIGEgY2x1c3RlciBmb3IgdGhpcyBub2RlLAorICAgICAgICAgICAgIEJ5IGRlZmluaW5nIHRoaXMgZWxlbWVudCwgbWVhbnMgdGhhdCBldmVyeSBtYW5hZ2VyIHdpbGwgYmUgY2hhbmdlZC4KKyAgICAgICAgICAgICBTbyB3aGVuIHJ1bm5pbmcgYSBjbHVzdGVyLCBvbmx5IG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHdlYmFwcHMgaW4gdGhlcmUKKyAgICAgICAgICAgICB0aGF0IG5lZWQgdG8gYmUgY2x1c3RlcmVkIGFuZCByZW1vdmUgdGhlIG90aGVyIG9uZXMuCisgICAgICAgICAgICAgQSBjbHVzdGVyIGhhcyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisgICAgICAgICAgICAgCisgICAgICAgICAgICAgY2xhc3NOYW1lID0gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbHVzdGVyIGNsYXNzCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgbmFtZSA9IGEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgeW91ciBjbHVzdGVyLCBjYW4gYmUgYW55dGhpbmcKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICBkZWJ1ZyA9IHRoZSBkZWJ1ZyBsZXZlbCwgaGlnaGVyIG1lYW5zIG1vcmUgb3V0cHV0CisgICAgICAgICAgICAgCisgICAgICAgICAgICAgbWNhc3RBZGRyID0gdGhlIG11bHRpY2FzdCBhZGRyZXNzLCBoYXMgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCB0aGUgbm9kZXMKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICBtY2FzdFBvcnQgPSB0aGUgbXVsdGljYXN0IHBvcnQsIGhhcyB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIHRoZSBub2RlcworICAgICAgICAgICAgIAorICAgICAgICAgICAgIG1jYXN0RnJlcXVlbmN5ID0gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYmV0d2VlbiBzZW5kaW5nIGEgIkknbSBhbGl2ZSIgaGVhcnRiZWF0CisgICAgICAgICAgICAgCisgICAgICAgICAgICAgbWNhc3REcm9wVGltZSA9IHRoZSBudW1iZXIgYSBtaWxsaXNlY29uZHMgYmVmb3JlIGEgbm9kZSBpcyBjb25zaWRlcmVkICJkZWFkIiBpZiBubyBoZWFydGJlYXQgaXMgcmVjZWl2ZWQKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICB0Y3BUaHJlYWRDb3VudCA9IHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byBoYW5kbGUgaW5jb21pbmcgcmVwbGljYXRpb24gcmVxdWVzdHMsIG9wdGltYWwgd291bGQgYmUgdGhlIHNhbWUgYW1vdW50IG9mIHRocmVhZHMgYXMgbm9kZXMgCisKKyAgICAgICAgICAgICB0Y3BMaXN0ZW5BZGRyZXNzID0gdGhlIGxpc3RlbiBhZGRyZXNzIChiaW5kIGFkZHJlc3MpIGZvciBUQ1AgY2x1c3RlciByZXF1ZXN0IG9uIHRoaXMgaG9zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGNhc2Ugb2YgbXVsdGlwbGUgZXRoZXJuZXQgY2FyZHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gbWVhbnMgdGhhdCBhZGRyZXNzIGJlY29tZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdEFkZHJlc3MoKQorCisgICAgICAgICAgICAgdGNwTGlzdGVuUG9ydCA9IHRoZSB0Y3AgbGlzdGVuIHBvcnQKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICB0Y3BTZWxlY3RvclRpbWVvdXQgPSB0aGUgdGltZW91dCAobXMpIGZvciB0aGUgU2VsZWN0b3Iuc2VsZWN0KCkgbWV0aG9kIGluIGNhc2UgdGhlIE9TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGEgd2FrdXAgYnVnIGluIGphdmEubmlvLiBTZXQgdG8gMCBmb3Igbm8gdGltZW91dAorCisgICAgICAgICAgICAgcHJpbnRUb1NjcmVlbiA9IHRydWUgbWVhbnMgdGhhdCBtYW5hZ2VycyB3aWxsIGFsc28gcHJpbnQgdG8gc3RkLm91dAorCisgICAgICAgICAgICAgZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duID0gdHJ1ZSBtZWFucyB0aGF0IAorCisgICAgICAgICAgICAgdXNlRGlydHlGbGFnID0gdHJ1ZSBtZWFucyB0aGF0IHdlIG9ubHkgcmVwbGljYXRlIGEgc2Vzc2lvbiBhZnRlciBzZXRBdHRyaWJ1dGUscmVtb3ZlQXR0cmlidXRlIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBtZWFucyB0byByZXBsaWNhdGUgdGhlIHNlc3Npb24gYWZ0ZXIgZWFjaCByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG1lYW5zIHRoYXQgcmVwbGljYXRpb24gd291bGQgd29yayBmb3IgdGhlIGZvbGxvd2luZyBwaWVjZSBvZiBjb2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJtYXAiLG1hcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dCgia2V5IiwidmFsdWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlPgorICAgICAgICAtLT4gICAgICAgICAgICAgCisgICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgPENsdXN0ZXIgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5TaW1wbGVUY3BDbHVzdGVyIgorICAgICAgICAgICAgICAgICAgbmFtZT0iRmlsaXBzQ2x1c3RlciIKKyAgICAgICAgICAgICAgICAgIGRlYnVnPSIxMCIKKyAgICAgICAgICAgICAgICAgIHNlcnZpY2VjbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLm1jYXN0Lk1jYXN0U2VydmljZSIKKyAgICAgICAgICAgICAgICAgIG1jYXN0QWRkcj0iMjI4LjAuMC40IgorICAgICAgICAgICAgICAgICAgbWNhc3RQb3J0PSI0NTU2NCIKKyAgICAgICAgICAgICAgICAgIG1jYXN0RnJlcXVlbmN5PSI1MDAiCisgICAgICAgICAgICAgICAgICBtY2FzdERyb3BUaW1lPSIzMDAwIgorICAgICAgICAgICAgICAgICAgdGNwVGhyZWFkQ291bnQ9IjIiCisgICAgICAgICAgICAgICAgICB0Y3BMaXN0ZW5BZGRyZXNzPSJhdXRvIgorICAgICAgICAgICAgICAgICAgdGNwTGlzdGVuUG9ydD0iNDAwMSIKKyAgICAgICAgICAgICAgICAgIHRjcFNlbGVjdG9yVGltZW91dD0iMTAwIgorICAgICAgICAgICAgICAgICAgcHJpbnRUb1NjcmVlbj0iZmFsc2UiCisgICAgICAgICAgICAgICAgICBleHBpcmVTZXNzaW9uc09uU2h1dGRvd249ImZhbHNlIgorICAgICAgICAgICAgICAgICAgdXNlRGlydHlGbGFnPSJ0cnVlIgorICAgICAgICAvPgorICAgICAgICAKKyAgICAgICAgPCEtLQorICAgICAgICAgICAgV2hlbiBjb25maWd1cmluZyBmb3IgY2x1c3RlcmluZywgeW91IGFsc28gYWRkIGluIGEgdmFsdmUgdG8gY2F0Y2ggYWxsIHRoZSByZXF1ZXN0cworICAgICAgICAgICAgY29taW5nIGluLCBhdCB0aGUgZW5kIG9mIHRoZSByZXF1ZXN0LCB0aGUgc2Vzc2lvbiBtYXkgb3IgbWF5IG5vdCBiZSByZXBsaWNhdGVkLgorICAgICAgICAgICAgQSBzZXNzaW9uIGlzIHJlcGxpY2F0ZWQgaWYgYW5kIG9ubHkgaWYgYWxsIHRoZSBjb25kaXRpb25zIGFyZSBtZXQ6CisgICAgICAgICAgICAxLiB1c2VEaXJ0eUZsYWcgaXMgdHJ1ZSBvciBzZXRBdHRyaWJ1dGUgb3IgcmVtb3ZlQXR0cmlidXRlIGhhcyBiZWVuIGNhbGxlZCBBTkQKKyAgICAgICAgICAgIDIuIGEgc2Vzc2lvbiBleGlzdHMgKGhhcyBiZWVuIGNyZWF0ZWQpCisgICAgICAgICAgICAzLiB0aGUgcmVxdWVzdCBpcyBub3QgdHJhcHBlZCBieSB0aGUgImZpbHRlciIgYXR0cmlidXRlCisgICAgICAgICAgICAKKyAgICAgICAgICAgIFRoZSBmaWx0ZXIgYXR0cmlidXRlIGlzIHRvIGZpbHRlciBvdXQgcmVxdWVzdHMgdGhhdCBjb3VsZCBub3QgbW9kaWZ5IHRoZSBzZXNzaW9uLAorICAgICAgICAgICAgaGVuY2Ugd2UgZG9uJ3QgcmVwbGljYXRlIHRoZSBzZXNzaW9uIGFmdGVyIHRoZSBlbmQgb2YgdGhpcyByZXF1ZXN0LgorICAgICAgICAgICAgVGhlIGZpbHRlciBpcyBuZWdhdGl2ZSwgaWUsIGFueXRoaW5nIHlvdSBwdXQgaW4gdGhlIGZpbHRlciwgeW91IG1lYW4gdG8gZmlsdGVyIG91dCwKKyAgICAgICAgICAgIGllLCBubyByZXBsaWNhdGlvbiB3aWxsIGJlIGRvbmUgb24gcmVxdWVzdHMgdGhhdCBtYXRjaCBvbmUgb2YgdGhlIGZpbHRlcnMuCisgICAgICAgICAgICBUaGUgZmlsdGVyIGF0dHJpYnV0ZSBpcyBkZWxpbWl0ZWQgYnkgOywgc28geW91IGNhbid0IGVzY2FwZSBvdXQgOyBldmVuIGlmIHlvdSB3YW50ZWQgdG8uCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZpbHRlcj0iLipcLmdpZjsuKlwuanM7IiBtZWFucyB0aGF0IHdlIHdpbGwgbm90IHJlcGxpY2F0ZSB0aGUgc2Vzc2lvbiBhZnRlciByZXF1ZXN0cyB3aXRoIHRoZSBVUkkKKyAgICAgICAgICAgIGVuZGluZyB3aXRoIC5naWYgYW5kIC5qcyBhcmUgaW50ZXJjZXB0ZWQuCisgICAgICAgIC0tPgorICAgICAgICAgICAgCisgICAgICAgIDxWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25WYWx2ZSIKKyAgICAgICAgICAgICAgIGZpbHRlcj0iLipcLmdpZjsuKlwuanM7LipcLmpwZzsuKlwuaHRtOy4qXC5odG1sOy4qXC50eHQ7Ii8+CisKKyAgICAgIDwhLS0gQWRkIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBpZiB5b3Ugd2FudCB0byB0dXJuIFhNTCB2YWxpZGF0aW9uCisgICAgICAgICAgIG9uLiBSZW1lbWJlciB0byBjb21tZW50IHRoZSBIb3N0IGVsZW1lbnQgYWJvdmUuIAorICAgICAgICAgICAKKyAgICAgICAgICAgTm90ZTogWE1MIFNjaGVtYSB2YWxpZGF0aW9ubiB3aWxsIHdvcmtzIHdpdGggWGVyY2VzIDIuMC4xIG9yIAorICAgICAgICAgICBYZXJjZXMgMi4xLiBYZXJjZXMgMi4wLjIgYW5kIFhlcmNlcyAyLjIgaGF2ZSBidWdzIHRoYXQgcHJldmVudCAKKyAgICAgICAgICAgdGhlaXIgdXNlIHdpdGggVG9tY2F0LS0+CisgICAgICA8IS0tCisgICAgICA8SG9zdCBuYW1lPSJsb2NhbGhvc3QiIGRlYnVnPSIwIiBhcHBCYXNlPSJ3ZWJhcHBzIgorICAgICAgIHVucGFja1dBUnM9InRydWUiIGF1dG9EZXBsb3k9InRydWUiCisgICAgICAgeG1sVmFsaWRhdGlvbj0idHJ1ZSIgeG1sTmFtZXNwYWNlQXdhcmU9InRydWUiPgorICAgICAgLS0+CisKKyAgICAgICAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBjbHVzdGVyIHRoaXMgaG9zdCB1c2luZyBKYXZhR3JvdXBzLiBUaGUKKyAgICAgICAgICAgICBwcm90b2NvbCBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBKYXZhR3JvdXBzCisgICAgICAgICAgICAgbmV0d29yayBzdGFjayAodGhlIGRlZmF1bHRzIGFyZSB1c2VkIGlmIGl0J3Mgbm90IHNwZWNpZmllZCkuIC0tPgorICAgICAgICA8IS0tCisgICAgICAgIDxDbHVzdGVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkpHQ2x1c3RlciIvPgorICAgICAgICAtLT4KKworICAgICAgICA8IS0tIE5vcm1hbGx5LCB1c2VycyBtdXN0IGF1dGhlbnRpY2F0ZSB0aGVtc2VsdmVzIHRvIGVhY2ggd2ViIGFwcAorICAgICAgICAgICAgIGluZGl2aWR1YWxseS4gIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGVudHJ5IGlmIHlvdSB3b3VsZCBsaWtlCisgICAgICAgICAgICAgYSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQgdGhlIGZpcnN0IHRpbWUgdGhleSBlbmNvdW50ZXIgYQorICAgICAgICAgICAgIHJlc291cmNlIHByb3RlY3RlZCBieSBhIHNlY3VyaXR5IGNvbnN0cmFpbnQsIGFuZCB0aGVuIGhhdmUgdGhhdAorICAgICAgICAgICAgIHVzZXIgaWRlbnRpdHkgbWFpbnRhaW5lZCBhY3Jvc3MgKmFsbCogd2ViIGFwcGxpY2F0aW9ucyBjb250YWluZWQKKyAgICAgICAgICAgICBpbiB0aGlzIHZpcnR1YWwgaG9zdC4gLS0+CisgICAgICAgIDwhLS0KKyAgICAgICAgPFZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLlNpbmdsZVNpZ25PbiIKKyAgICAgICAgICAgICAgICAgICBkZWJ1Zz0iMCIvPgorICAgICAgICAtLT4KKyAgICAgICAgCisgICAgICAgIDwhLS0gQWNjZXNzIGxvZyBwcm9jZXNzZXMgYWxsIHJlcXVlc3RzIGZvciB0aGlzIHZpcnR1YWwgaG9zdC4gIEJ5CisgICAgICAgICAgICAgZGVmYXVsdCwgbG9nIGZpbGVzIGFyZSBjcmVhdGVkIGluIHRoZSAibG9ncyIgZGlyZWN0b3J5IHJlbGF0aXZlIHRvCisgICAgICAgICAgICAgJENBVEFMSU5BX0hPTUUuICBJZiB5b3Ugd2lzaCwgeW91IGNhbiBzcGVjaWZ5IGEgZGlmZmVyZW50CisgICAgICAgICAgICAgZGlyZWN0b3J5IHdpdGggdGhlICJkaXJlY3RvcnkiIGF0dHJpYnV0ZS4gIFNwZWNpZnkgZWl0aGVyIGEgcmVsYXRpdmUKKyAgICAgICAgICAgICAodG8gJENBVEFMSU5BX0hPTUUpIG9yIGFic29sdXRlIHBhdGggdG8gdGhlIGRlc2lyZWQgZGlyZWN0b3J5LgorICAgICAgICAtLT4KKyAgICAgICAgPCEtLQorICAgICAgICA8VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5BY2Nlc3NMb2dWYWx2ZSIKKyAgICAgICAgICAgICAgICAgZGlyZWN0b3J5PSJsb2dzIiAgcHJlZml4PSJsb2NhbGhvc3RfYWNjZXNzX2xvZy4iIHN1ZmZpeD0iLnR4dCIKKyAgICAgICAgICAgICAgICAgcGF0dGVybj0iY29tbW9uIiByZXNvbHZlSG9zdHM9ImZhbHNlIi8+CisgICAgICAgIC0tPgorCisgICAgICAgIDwhLS0gTG9nZ2VyIHNoYXJlZCBieSBhbGwgQ29udGV4dHMgcmVsYXRlZCB0byB0aGlzIHZpcnR1YWwgaG9zdC4gIEJ5CisgICAgICAgICAgICAgZGVmYXVsdCAod2hlbiB1c2luZyBGaWxlTG9nZ2VyKSwgbG9nIGZpbGVzIGFyZSBjcmVhdGVkIGluIHRoZSAibG9ncyIKKyAgICAgICAgICAgICBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gJENBVEFMSU5BX0hPTUUuICBJZiB5b3Ugd2lzaCwgeW91IGNhbiBzcGVjaWZ5CisgICAgICAgICAgICAgYSBkaWZmZXJlbnQgZGlyZWN0b3J5IHdpdGggdGhlICJkaXJlY3RvcnkiIGF0dHJpYnV0ZS4gIFNwZWNpZnkgZWl0aGVyIGEKKyAgICAgICAgICAgICByZWxhdGl2ZSAodG8gJENBVEFMSU5BX0hPTUUpIG9yIGFic29sdXRlIHBhdGggdG8gdGhlIGRlc2lyZWQKKyAgICAgICAgICAgICBkaXJlY3RvcnkuLS0+CisgICAgICAgIDxMb2dnZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmxvZ2dlci5GaWxlTG9nZ2VyIgorICAgICAgICAgICAgICAgICBkaXJlY3Rvcnk9ImxvZ3MiICBwcmVmaXg9ImxvY2FsaG9zdF9sb2cuIiBzdWZmaXg9Ii50eHQiCisgICAgICAgICAgICB0aW1lc3RhbXA9InRydWUiLz4KKworICAgICAgICA8IS0tIERlZmluZSBwcm9wZXJ0aWVzIGZvciBlYWNoIHdlYiBhcHBsaWNhdGlvbi4gIFRoaXMgaXMgb25seSBuZWVkZWQKKyAgICAgICAgICAgICBpZiB5b3Ugd2FudCB0byBzZXQgbm9uLWRlZmF1bHQgcHJvcGVydGllcywgb3IgaGF2ZSB3ZWIgYXBwbGljYXRpb24KKyAgICAgICAgICAgICBkb2N1bWVudCByb290cyBpbiBwbGFjZXMgb3RoZXIgdGhhbiB0aGUgdmlydHVhbCBob3N0J3MgYXBwQmFzZQorICAgICAgICAgICAgIGRpcmVjdG9yeS4gIC0tPgorCisgICAgICAgIDwhLS0gVG9tY2F0IFJvb3QgQ29udGV4dCAtLT4KKyAgICAgICAgPCEtLQorICAgICAgICA8Q29udGV4dCBwYXRoPSIvcmVwdGVzdCIgZG9jQmFzZT0icmVwdGVzdCIgZGVidWc9IjAiPgorICAgICAgICAgICAgCisgICAgICAgIDwvQ29udGV4dD4KKyAgICAgICAgLS0+CisgICAgICAgIAorCisgICAgICA8L0hvc3Q+CisKKyAgICA8L0VuZ2luZT4KKworICA8L1NlcnZpY2U+CisKKzwvU2VydmVyPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NhdGFsaW5hQ2x1c3Rlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NhdGFsaW5hQ2x1c3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNjVlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ2F0YWxpbmFDbHVzdGVyLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3RlcjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworCisvKioKKyAqIEEgPGI+Q2F0YWxpbmFDbHVzdGVyPC9iPiBpbnRlcmZhY2UgYWxsb3dzIHRvIHBsdWcgaW4gYW5kIG91dCB0aGUgCisgKiBkaWZmZXJlbnQgY2x1c3RlciBpbXBsZW1lbnRhdGlvbnMKKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIENhdGFsaW5hQ2x1c3RlciBleHRlbmRzIENsdXN0ZXIgeworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb21wb25lbnQgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBpbmZvID0gIkNhdGFsaW5hQ2x1c3Rlci8yLjAiOworICAgIAorICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBjbHVzdGVyLCB0aGUgb3duaW5nIGNvbnRhaW5lciB3aWxsIGludm9rZSB0aGlzCisgICAgICogQHRocm93cyBFeGNlcHRpb24gLSBpZiBmYWlsdXJlIHRvIHN0YXJ0IGNsdXN0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBFeGNlcHRpb247CisgICAgCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIGNsdXN0ZXIsIHRoZSBvd25pbmcgY29udGFpbmVyIHdpbGwgaW52b2tlIHRoaXMKKyAgICAgKiBAdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFzc29jaWF0ZXMgbG9nZ2VyIHdpdGggdGhpcyBjbHVzdGVyLgorICAgICAqCisgICAgICogQHJldHVybiBMb2cKKyAgICAgKi8KKyAgICBwdWJsaWMgTG9nIGdldExvZ2dlcigpOworICAgIAorICAgIC8qKgorICAgICAqIHJlY2VpdmUgYSBtZXNzYWdlIHRvIGFsbCB0aGUgbWVtYmVycyBpbiB0aGUgY2x1c3Rlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cgQ2x1c3Rlck1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWNlaXZlKENsdXN0ZXJNZXNzYWdlIG1zZyk7CisgCisgICAgLyoqCisgICAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGFsbCB0aGUgbWVtYmVycyBpbiB0aGUgY2x1c3RlcgorICAgICAqIEBwYXJhbSBtc2cgQ2x1c3Rlck1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kKENsdXN0ZXJNZXNzYWdlIG1zZyk7CisgICAgCisgICAgLyoqCisgICAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGEgc3BlY2lmaWMgbWVtYmVyIGluIHRoZSBjbHVzdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZyBDbHVzdGVyTWVzc2FnZQorICAgICAqIEBwYXJhbSBkZXN0IE1lbWJlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmQoQ2x1c3Rlck1lc3NhZ2UgbXNnLCBNZW1iZXIgZGVzdCk7CisgICAgCisgICAgLyoqCisgICAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGEgYWxsIG1lbWJlcnMgYXQgbG9jYWwgY2x1c3RlciBkb21haW4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cgQ2x1c3Rlck1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kQ2x1c3RlckRvbWFpbihDbHVzdGVyTWVzc2FnZSBtc2cpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGF0IGNsdXN0ZXIgaGFzIG1lbWJlcnMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTWVtYmVycygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgdGhlIG1lbWJlcnMgY3VycmVudGx5IHBhcnRpY2lwYXRpbmcgaW4gdGhlIGNsdXN0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1lbWJlcltdCisgICAgICovCisgICAgcHVibGljIE1lbWJlcltdIGdldE1lbWJlcnMoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1lbWJlciB0aGF0IHJlcHJlc2VudHMgdGhpcyBub2RlLgorICAgICAqCisgICAgICogQHJldHVybiBNZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyIGdldExvY2FsTWVtYmVyKCk7CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlclNlbmRlcihDbHVzdGVyU2VuZGVyIHNlbmRlcik7CisgICAgCisgICAgcHVibGljIENsdXN0ZXJTZW5kZXIgZ2V0Q2x1c3RlclNlbmRlcigpOworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXJSZWNlaXZlcihDbHVzdGVyUmVjZWl2ZXIgcmVjZWl2ZXIpOworICAgIAorICAgIHB1YmxpYyBDbHVzdGVyUmVjZWl2ZXIgZ2V0Q2x1c3RlclJlY2VpdmVyKCk7CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0TWVtYmVyc2hpcFNlcnZpY2UoTWVtYmVyc2hpcFNlcnZpY2Ugc2VydmljZSk7CisgICAgCisgICAgcHVibGljIE1lbWJlcnNoaXBTZXJ2aWNlIGdldE1lbWJlcnNoaXBTZXJ2aWNlKCk7CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkVmFsdmUoVmFsdmUgdmFsdmUpOworICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZENsdXN0ZXJMaXN0ZW5lcihNZXNzYWdlTGlzdGVuZXIgbGlzdGVuZXIpOworICAgIAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNsdXN0ZXJMaXN0ZW5lcihNZXNzYWdlTGlzdGVuZXIgbGlzdGVuZXIpOworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXJEZXBsb3llcihDbHVzdGVyRGVwbG95ZXIgZGVwbG95ZXIpOworICAgIAorICAgIHB1YmxpYyBDbHVzdGVyRGVwbG95ZXIgZ2V0Q2x1c3RlckRlcGxveWVyKCk7CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgbWFwIG9mIG1hbmFnZXJzCisgICAgICovCisgICAgcHVibGljIE1hcCBnZXRNYW5hZ2VycygpOworCisgICAgcHVibGljIE1hbmFnZXIgZ2V0TWFuYWdlcihTdHJpbmcgbmFtZSk7CisgICAgcHVibGljIHZvaWQgcmVtb3ZlTWFuYWdlcihTdHJpbmcgbmFtZSxNYW5hZ2VyIG1hbmFnZXIpOworICAgIHB1YmxpYyB2b2lkIGFkZE1hbmFnZXIoU3RyaW5nIG5hbWUsTWFuYWdlciBtYW5hZ2VyKTsKKyAgICBwdWJsaWMgVmFsdmVbXSBnZXRWYWx2ZXMoKTsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJEZXBsb3llci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJEZXBsb3llci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNDU0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ2x1c3RlckRlcGxveWVyLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXI7CisKKy8qKgorICogQSA8Yj5DbHVzdGVyRGVwbG95ZXI8L2I+IGludGVyZmFjZSBhbGxvd3MgdG8gcGx1ZyBpbiBhbmQgb3V0IHRoZQorICogZGlmZmVyZW50IGRlcGxveW1lbnQgaW1wbGVtZW50YXRpb25zCisgKgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworcHVibGljIGludGVyZmFjZSBDbHVzdGVyRGVwbG95ZXIgZXh0ZW5kcyBNZXNzYWdlTGlzdGVuZXIgeworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29tcG9uZW50IGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgaW5mbyA9ICJDbHVzdGVyRGVwbG95ZXIvMS4wIjsKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGUgY2x1c3RlciBkZXBsb3llciwgdGhlIG93bmluZyBjb250YWluZXIgd2lsbCBpbnZva2UgdGhpcworICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIC0gaWYgZmFpbHVyZSB0byBzdGFydCBjbHVzdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIGNsdXN0ZXIgZGVwbG95ZXIsIHRoZSBvd25pbmcgY29udGFpbmVyIHdpbGwgaW52b2tlIHRoaXMKKyAgICAgKiBAdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVwbG95ZXIgZm9yIHRoaXMgY2x1c3RlciBkZXBsb3llciB0byB1c2UuCisgICAgICogQHBhcmFtIGRlcGxveWVyIERlcGxveWVyCisgICAgICovCisgICAgLy8gRklYTUUKKyAgICAvL3B1YmxpYyB2b2lkIHNldERlcGxveWVyKERlcGxveWVyIGRlcGxveWVyKTsKKworICAgIC8qKgorICAgICAqIEluc3RhbGwgYSBuZXcgd2ViIGFwcGxpY2F0aW9uLCB3aG9zZSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSBpcyBhdCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgVVJMLCBpbnRvIHRoaXMgY29udGFpbmVyIGFuZCBhbGwgdGhlIG90aGVyCisgICAgICogbWVtYmVycyBvZiB0aGUgY2x1c3RlciB3aXRoIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoLgorICAgICAqIEEgY29udGV4dCBwYXRoIG9mICIiICh0aGUgZW1wdHkgc3RyaW5nKSBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHJvb3QKKyAgICAgKiBhcHBsaWNhdGlvbiBmb3IgdGhpcyBjb250YWluZXIuICBPdGhlcndpc2UsIHRoZSBjb250ZXh0IHBhdGggbXVzdAorICAgICAqIHN0YXJ0IHdpdGggYSBzbGFzaC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGlzIGFwcGxpY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgbG9jYWxseSwgCisgICAgICogYSBDb250YWluZXJFdmVudCBvZiB0eXBlCisgICAgICogPGNvZGU+SU5TVEFMTF9FVkVOVDwvY29kZT4gd2lsbCBiZSBzZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycywKKyAgICAgKiB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbnRleHQ8L2NvZGU+IGFzIGFuIGFyZ3VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHRQYXRoIFRoZSBjb250ZXh0IHBhdGggdG8gd2hpY2ggdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQKKyAgICAgKiAgYmUgaW5zdGFsbGVkIChtdXN0IGJlIHVuaXF1ZSkKKyAgICAgKiBAcGFyYW0gd2FyIEEgVVJMIG9mIHR5cGUgImphcjoiIHRoYXQgcG9pbnRzIHRvIGEgV0FSIGZpbGUsIG9yIHR5cGUKKyAgICAgKiAgImZpbGU6IiB0aGF0IHBvaW50cyB0byBhbiB1bnBhY2tlZCBkaXJlY3Rvcnkgc3RydWN0dXJlIGNvbnRhaW5pbmcKKyAgICAgKiAgdGhlIHdlYiBhcHBsaWNhdGlvbiB0byBiZSBpbnN0YWxsZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoCisgICAgICogIGlzIG1hbGZvcm1lZCAoaXQgbXVzdCBiZSAiIiBvciBzdGFydCB3aXRoIGEgc2xhc2gpCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGgKKyAgICAgKiAgaXMgYWxyZWFkeSBhdHRhY2hlZCB0byBhbiBleGlzdGluZyB3ZWIgYXBwbGljYXRpb24KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciB3YXMgZW5jb3VudGVyZWQKKyAgICAgKiAgZHVyaW5nIGluc3RhbGxhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluc3RhbGwoU3RyaW5nIGNvbnRleHRQYXRoLCBVUkwgd2FyKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXhpc3Rpbmcgd2ViIGFwcGxpY2F0aW9uLCBhdHRhY2hlZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQKKyAgICAgKiBwYXRoLiAgSWYgdGhpcyBhcHBsaWNhdGlvbiBpcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZCwgYQorICAgICAqIENvbnRhaW5lckV2ZW50IG9mIHR5cGUgPGNvZGU+UkVNT1ZFX0VWRU5UPC9jb2RlPiB3aWxsIGJlIHNlbnQgdG8gYWxsCisgICAgICogcmVnaXN0ZXJlZCBsaXN0ZW5lcnMsIHdpdGggdGhlIHJlbW92ZWQgPGNvZGU+Q29udGV4dDwvY29kZT4gYXMKKyAgICAgKiBhbiBhcmd1bWVudC4gRGVsZXRlcyB0aGUgd2ViIGFwcGxpY2F0aW9uIHdhciBmaWxlIGFuZC9vciBkaXJlY3RvcnkKKyAgICAgKiBpZiB0aGV5IGV4aXN0IGluIHRoZSBIb3N0J3MgYXBwQmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCBUaGUgY29udGV4dCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSByZW1vdmVkCisgICAgICogQHBhcmFtIHVuZGVwbG95IGJvb2xlYW4gZmxhZyB0byByZW1vdmUgd2ViIGFwcGxpY2F0aW9uIGZyb20gc2VydmVyCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aAorICAgICAqICBpcyBtYWxmb3JtZWQgKGl0IG11c3QgYmUgIiIgb3Igc3RhcnQgd2l0aCBhIHNsYXNoKQorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoIGRvZXMKKyAgICAgKiAgbm90IGlkZW50aWZ5IGEgY3VycmVudGx5IGluc3RhbGxlZCB3ZWIgYXBwbGljYXRpb24KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMgZHVyaW5nCisgICAgICogIHJlbW92YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGNvbnRleHRQYXRoLCBib29sZWFuIHVuZGVwbG95KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBjYWxsIGZyb20gY29udGFpbmVyIEJhY2tncm91bmQgUHJvY2VzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJhY2tncm91bmRQcm9jZXNzKCk7Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ2x1c3Rlck1hbmFnZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9DbHVzdGVyTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMzhlZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ2x1c3Rlck1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CisKKworLyoqCisgKiBUaGUgY29tbW9uIGludGVyZmFjZSB1c2VkIGJ5IGFsbCBjbHVzdGVyIG1hbmFnZXIuCisgKiBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuIGhhdmUgYSBtb3JlIHBsdWdnYWJsZSB3YXkKKyAqIG9mIHN3YXBwaW5nIHNlc3Npb24gbWFuYWdlcnMgZm9yIGRpZmZlcmVudCBhbGdvcml0aG1zLgorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqLworcHVibGljIGludGVyZmFjZSBDbHVzdGVyTWFuYWdlciBleHRlbmRzIE1hbmFnZXIgeworCisgICAvKioKKyAgICAqIEEgbWVzc2FnZSB3YXMgcmVjZWl2ZWQgZnJvbSBhbm90aGVyIG5vZGUsIHRoaXMKKyAgICAqIGlzIHRoZSBjYWxsYmFjayBtZXRob2QgdG8gaW1wbGVtZW50IGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbgorICAgICogcmVjZWl2aW5nIHJlcGxpY2F0aW9uIG1lc3NhZ2VzLgorICAgICogQHBhcmFtIG1zZyAtIHRoZSBtZXNzYWdlIHJlY2VpdmVkLgorICAgICovCisgICBwdWJsaWMgdm9pZCBtZXNzYWdlRGF0YVJlY2VpdmVkKENsdXN0ZXJNZXNzYWdlIG1zZyk7CisKKyAgIC8qKgorICAgICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBjb21wbGV0ZWQsIHRoZSByZXBsaWNhdGlvbiB2YWx2ZQorICAgICogd2lsbCBub3RpZnkgdGhlIG1hbmFnZXIsIGFuZCB0aGUgbWFuYWdlciB3aWxsIGRlY2lkZSB3aGV0aGVyCisgICAgKiBhbnkgcmVwbGljYXRpb24gaXMgbmVlZGVkIG9yIG5vdC4KKyAgICAqIElmIHRoZXJlIGlzIGEgbmVlZCBmb3IgcmVwbGljYXRpb24sIHRoZSBtYW5hZ2VyIHdpbGwKKyAgICAqIGNyZWF0ZSBhIHNlc3Npb24gbWVzc2FnZSBhbmQgdGhhdCB3aWxsIGJlIHJlcGxpY2F0ZWQuCisgICAgKiBUaGUgY2x1c3RlciBkZXRlcm1pbmVzIHdoZXJlIGl0IGdldHMgc2VudC4KKyAgICAqIEBwYXJhbSBzZXNzaW9uSWQgLSB0aGUgc2Vzc2lvbklkIHRoYXQganVzdCBjb21wbGV0ZWQuCisgICAgKiBAcmV0dXJuIGEgU2Vzc2lvbk1lc3NhZ2UgdG8gYmUgc2VudC4KKyAgICAqLworICAgcHVibGljIENsdXN0ZXJNZXNzYWdlIHJlcXVlc3RDb21wbGV0ZWQoU3RyaW5nIHNlc3Npb25JZCk7CisKKyAgIC8qKgorICAgICogV2hlbiB0aGUgbWFuYWdlciBleHBpcmVzIHNlc3Npb24gbm90IHRpZWQgdG8gYSByZXF1ZXN0LgorICAgICogVGhlIGNsdXN0ZXIgd2lsbCBwZXJpb2RpY2FsbHkgYXNrIGZvciBhIGxpc3Qgb2Ygc2Vzc2lvbnMKKyAgICAqIHRoYXQgc2hvdWxkIGV4cGlyZSBhbmQgdGhhdCBzaG91bGQgYmUgc2VudCBhY3Jvc3MgdGhlIHdpcmUuCisgICAgKiBAcmV0dXJuIFN0cmluZ1tdIFRoZSBpbnZhbGlkYXRlZCBzZXNzaW9ucworICAgICovCisgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW52YWxpZGF0ZWRTZXNzaW9ucygpOworICAgCisgICAvKioKKyAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWFuYWdlciwgYXQgaG9zdCAvY29udGV4dCBuYW1lIGFuZCBhdCBlbmdpbmUgaG9zdG5hbWUrL2NvbnRleHQuCisgICAgKiBAcmV0dXJuIFN0cmluZworICAgICogQHNpbmNlIDUuNS4xMAorICAgICovCisgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKyAgIAorICAgLyoqCisgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIG1hbmFnZXIsIGF0IGhvc3QgL2NvbnRleHQgbmFtZSBhbmQgYXQgZW5naW5lIGhvc3RuYW1lKy9jb250ZXh0CisgICAgKiBAcGFyYW0gbmFtZQorICAgICogQHNpbmNlIDUuNS4xMAorICAgICovCisgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKKyAgICAgICAgIAorICAgcHVibGljIENhdGFsaW5hQ2x1c3RlciBnZXRDbHVzdGVyKCk7CisKKyAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXIoQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIpOworICAgCisgICAvKioKKyAgICAqIEByZXR1cm4gTWFuYWdlciBzZW5kIG9ubHkgdG8gc2FtZSBjbHVzdGVyIGRvbWFpbi4KKyAgICAqIEBzaW5jZSA1LjUuMTAKKyAgICAqLworICAgcHVibGljIGJvb2xlYW4gaXNTZW5kQ2x1c3RlckRvbWFpbk9ubHkoKTsKKworICAgLyoqCisgICAgKiBAcGFyYW0gc2VuZENsdXN0ZXJEb21haW5Pbmx5IEZsYWcgdmFsdWUuCisgICAgKiBAc2luY2UgNS41LjEwCisgICAgKi8KKyAgIHB1YmxpYyB2b2lkIHNldFNlbmRDbHVzdGVyRG9tYWluT25seShib29sZWFuIHNlbmRDbHVzdGVyRG9tYWluT25seSk7CisKKyAgIC8qKgorICAgICogQHBhcmFtIG1vZGUgVGhlIG1vZGUKKyAgICAqIEBzaW5jZSA1LjUuMTAKKyAgICAqLworICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdE1vZGUoYm9vbGVhbiBtb2RlKTsKKworICAgLyoqCisgICAgKiBAc2luY2UgNS41LjEwCisgICAgKi8KKyAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE1vZGUoKTsKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9DbHVzdGVyTWVzc2FnZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2YzExMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9DbHVzdGVyTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICovCitwdWJsaWMgaW50ZXJmYWNlIENsdXN0ZXJNZXNzYWdlIGV4dGVuZHMgU2VyaWFsaXphYmxlIHsKKyAgICAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBGTEFHX0ZPUkJJRERFTiA9IDAgOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEZMQUdfQUxMT1dFRCA9IDEgOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEZMQUdfREVGQVVMVCA9IDIgOworICAgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgYWRkcmVzcyB0aGF0IHRoaXMgbWVzc2FnZSBvcmlnaW5hdGVkIGZyb20uICBUaGlzIHdvdWxkIGJlIHNldAorICAgICAqIGlmIHRoZSBtZXNzYWdlIHdhcyBiZWluZyByZWxheWVkIGZyb20gYSBob3N0IG90aGVyIHRoYW4gdGhlIG9uZQorICAgICAqIHRoYXQgb3JpZ2luYWxseSBzZW50IGl0LgorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXIgZ2V0QWRkcmVzcygpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBjbHVzdGVyIGJlZm9yZSBzZW5kaW5nIGl0IHRvIHRoZSBvdGhlcgorICAgICAqIG5vZGVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lbWJlciBNZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKE1lbWJlciBtZW1iZXIpOworCisgICAgLyoqCisgICAgICogVGltZXN0YW1wIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGxvbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgY2x1c3RlciBiZWZvcmUgc2VuZGluZyBvdXQKKyAgICAgKiB0aGUgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXAgVGhlIHRpbWVzdGFtcAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChsb25nIHRpbWVzdGFtcCk7CisKKyAgICAvKioKKyAgICAgKiBFYWNoIG1lc3NhZ2UgbXVzdCBoYXZlIGEgdW5pcXVlIElELCBpbiBjYXNlIG9mIHVzaW5nIGFzeW5jIHJlcGxpY2F0aW9uLAorICAgICAqIGFuZCBhIHNtYXJ0IHF1ZXVlLCB0aGlzIGlkIGlzIHVzZWQgdG8gcmVwbGFjZSBtZXNzYWdlcyBub3QgeWV0IHNlbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKTsKKworICAgIC8qKgorICAgICAqIEVhY2ggbWVzc2FnZSBjYW4gbWFkZSB0aGUgZGVzaWNpb24gdGhhdCByZXNlbmQgaXMgYWxsb3dlZCBvciBub3Qgb3IgaGFuZGxlIGJ5IGRlZmF1bHQuCisgICAgICogQHJldHVybiAwIEZvcmJpZGRlbiwgMSBhbGxvd2VkLCAyIGRlZmF1bHQKKyAgICAgKiBAc2luY2UgNS41LjEwCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZXNlbmQoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBzZXQgZGVzaWNpb24gdGhhdCByZXNlbmQgaXMgYWxsb3dlZCBvciBub3Qgb3IgaGFuZGxlIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzZW5kIDAgRm9yYmlkZGVuLCAxIGFsbG93ZWQsIDIgZGVmYXVsdAorICAgICAqIEBzaW5jZSA1LjUuMTAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNlbmQoaW50IHJlc2VuZCkgOworCisgICAgLyoqCisgICAgICogRWFjaCBtZXNzYWdlIGNhbiBtYWRlIHRoZSBkZXNpY2lvbiB0aGF0IGNvbXByZXNzIGlzIGFsbG93ZWQgb3Igbm90IG9yIGhhbmRsZSBieSBkZWZhdWx0LgorICAgICAqCisgICAgICogQHJldHVybiAwIEZvcmJpZGRlbiwgMSBhbGxvd2VkLCAyIGRlZmF1bHQKKyAgICAgKiBAc2luY2UgNS41LjEwCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb21wcmVzcygpOworICAgIAorICAgIC8qKgorICAgICAqIHNldCBkZXNpY2lvbiB0aGF0IGNvbXByZXNzIGlzIGFsbG93ZWQgb3Igbm90IG9yIGhhbmRsZSBieSBkZWZhdWx0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbXByZXNzIDAgRm9yYmlkZGVuLCAxIGFsbG93ZWQsIDIgZGVmYXVsdAorICAgICAqIEBzaW5jZSA1LjUuMTAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21wcmVzcyhpbnQgY29tcHJlc3MpIDsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJSZWNlaXZlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJSZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYzBkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ2x1c3RlclJlY2VpdmVyLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyOworCisKKy8qKgorICogQ2x1c3RlciBSZWNlaXZlciBJbnRlcmZhY2UKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgaW50ZXJmYWNlIENsdXN0ZXJSZWNlaXZlciB7CisgICAgLyoqCisgICAgICogU3RhcnQgbWVzc2FnZSBsaXN0aW5nCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFN0b3AgbWVzc2FnZSBsaXN0aW5nIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKTsKKworICAgIC8qKgorICAgICAqIHNldCBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbHVzdGVyIFRoZSBjbHVzdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2F0YWxpbmFDbHVzdGVyKENhdGFsaW5hQ2x1c3RlciBjbHVzdGVyKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBnZXQgQ2FsbGJhY2suCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjbHVzdGVyCisgICAgICovCisgICAgcHVibGljIENhdGFsaW5hQ2x1c3RlciBnZXRDYXRhbGluYUNsdXN0ZXIoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZW5kIEFjayB0byBzZW5kZXIgb3Igbm90LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZmxhZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2VuZEFjaygpOworICAgIAorICAgIC8qKgorICAgICAqIHNldCBhY2sgbW9kZQorICAgICAqIEBwYXJhbSBpc1NlbmRBY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZW5kQWNrKGJvb2xlYW4gaXNTZW5kQWNrKTsKKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXByZXNzKCkgOworICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzKGJvb2xlYW4gY29tcHJlc3MpOworCisgICAgLyoqCisgICAgICogZ2V0IHRoZSBsaXN0aW5nIGlwIGludGVyZmFjZQorICAgICAqIEByZXR1cm4gVGhlIGhvc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKTsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIGxpc3RpbmcgaXAgcG9ydAorICAgICAqIEByZXR1cm4gVGhlIHBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBvcnQoKTsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJSdWxlU2V0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ2x1c3RlclJ1bGVTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDg2MjNiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJSdWxlU2V0LmphdmEKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLkRpZ2VzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuUnVsZVNldEJhc2U7CisKKworLyoqCisgKiA8cD48c3Ryb25nPlJ1bGVTZXQ8L3N0cm9uZz4gZm9yIHByb2Nlc3NpbmcgdGhlIGNvbnRlbnRzIG9mIGEKKyAqIENsdXN0ZXIgZGVmaW5pdGlvbiBlbGVtZW50LiAgPC9wPgorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENsdXN0ZXJSdWxlU2V0IGV4dGVuZHMgUnVsZVNldEJhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4IHRvIHVzZSBmb3IgcmVjb2duaXppbmcgb3VyIGVsZW1lbnRzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcHJlZml4ID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IHdpdGggdGhlIGRlZmF1bHQKKyAgICAgKiBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2x1c3RlclJ1bGVTZXQoKSB7CisKKyAgICAgICAgdGhpcygiIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4LgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBQcmVmaXggZm9yIG1hdGNoaW5nIHBhdHRlcm4gcnVsZXMgKGluY2x1ZGluZyB0aGUKKyAgICAgKiAgdHJhaWxpbmcgc2xhc2ggY2hhcmFjdGVyKQorICAgICAqLworICAgIHB1YmxpYyBDbHVzdGVyUnVsZVNldChTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbnVsbDsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogPHA+QWRkIHRoZSBzZXQgb2YgUnVsZSBpbnN0YW5jZXMgZGVmaW5lZCBpbiB0aGlzIFJ1bGVTZXQgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIDxjb2RlPkRpZ2VzdGVyPC9jb2RlPiBpbnN0YW5jZSwgYXNzb2NpYXRpbmcgdGhlbSB3aXRoCisgICAgICogb3VyIG5hbWVzcGFjZSBVUkkgKGlmIGFueSkuICBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQKKyAgICAgKiBieSBhIERpZ2VzdGVyIGluc3RhbmNlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaWdlc3RlciBEaWdlc3RlciBpbnN0YW5jZSB0byB3aGljaCB0aGUgbmV3IFJ1bGUgaW5zdGFuY2VzCisgICAgICogIHNob3VsZCBiZSBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSdWxlSW5zdGFuY2VzKERpZ2VzdGVyIGRpZ2VzdGVyKSB7CisgICAgICAgIC8vQ2x1c3RlciBjb25maWd1cmF0aW9uIHN0YXJ0CisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiTWVtYmVyc2hpcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBNVVNUIGJlIHNwZWNpZmllZCBpbiB0aGUgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJNZW1iZXJzaGlwIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIk1lbWJlcnNoaXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRNZW1iZXJzaGlwU2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXJzaGlwU2VydmljZSIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiU2VuZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIlNlbmRlciIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJTZW5kZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRDbHVzdGVyU2VuZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJTZW5kZXIiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIlJlY2VpdmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIlJlY2VpdmVyIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIlJlY2VpdmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0Q2x1c3RlclJlY2VpdmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJSZWNlaXZlciIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiVmFsdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiVmFsdmUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiVmFsdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRWYWx2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmUiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkRlcGxveWVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkRlcGxveWVyIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIkRlcGxveWVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0Q2x1c3RlckRlcGxveWVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJEZXBsb3llciIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJMaXN0ZW5lciIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZExpZmVjeWNsZUxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lciIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiQ2x1c3Rlckxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICBudWxsLCAvLyBNVVNUIGJlIHNwZWNpZmllZCBpbiB0aGUgZWxlbWVudAorICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiQ2x1c3Rlckxpc3RlbmVyIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIkNsdXN0ZXJMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZENsdXN0ZXJMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZXNzYWdlTGlzdGVuZXIiKTsKKyAgICAgICAgLy9DbHVzdGVyIGNvbmZpZ3VyYXRpb24gZW5kCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgeworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICAgICAgcmV0dXJuIHByZWZpeDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9DbHVzdGVyU2VuZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ2x1c3RlclNlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZjk4MWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ2x1c3RlclNlbmRlci5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3RlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuU2ltcGxlVGNwQ2x1c3RlcjsKKworCisvKioKKyAqIAorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIENsdXN0ZXJTZW5kZXIKK3sKKworICAgIHB1YmxpYyB2b2lkIGFkZChNZW1iZXIgbWVtYmVyKTsKKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZShNZW1iZXIgbWVtYmVyKTsKKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCk7CisKKyAgICBwdWJsaWMgdm9pZCBiYWNrZ3JvdW5kUHJvY2VzcygpIDsKKworICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKENsdXN0ZXJNZXNzYWdlIG1lc3NhZ2UsIE1lbWJlciBtZW1iZXIpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOworCisgICAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoQ2x1c3Rlck1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247CisgICAgCisgICAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2VDbHVzdGVyRG9tYWluKENsdXN0ZXJNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOworCisgICAgcHVibGljIGJvb2xlYW4gaXNXYWl0Rm9yQWNrKCk7CisgICAgcHVibGljIHZvaWQgc2V0V2FpdEZvckFjayhib29sZWFuIGlzV2FpdEZvckFjayk7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXByZXNzKCkgOworICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzKGJvb2xlYW4gY29tcHJlc3MpOworCisgICAgLyoqCisgICAgICogQHBhcmFtIGNsdXN0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYXRhbGluYUNsdXN0ZXIoU2ltcGxlVGNwQ2x1c3RlciBjbHVzdGVyKTsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJTZXNzaW9uLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ2x1c3RlclNlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTgxYTNjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJTZXNzaW9uLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlc3Npb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworCitwdWJsaWMgaW50ZXJmYWNlIENsdXN0ZXJTZXNzaW9uIGV4dGVuZHMgU2Vzc2lvbiwgSHR0cFNlc3Npb24geworICAgLyoqCisgICAgKiByZXR1cm5zIHRydWUgaWYgdGhpcyBzZXNzaW9uIGlzIHRoZSBwcmltYXJ5IHNlc3Npb24sIGlmIHRoYXQgaXMgdGhlCisgICAgKiBjYXNlLCB0aGUgbWFuYWdlciBjYW4gZXhwaXJlIGl0IHVwb24gdGltZW91dC4KKyAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHNlc3Npb24gaXMgcHJpbWFyeQorICAgICovCisgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnlTZXNzaW9uKCk7CisKKyAgIC8qKgorICAgICogU2V0cyB3aGV0aGVyIHRoaXMgaXMgdGhlIHByaW1hcnkgc2Vzc2lvbiBvciBub3QuCisgICAgKiBAcGFyYW0gcHJpbWFyeVNlc3Npb24gRmxhZyB2YWx1ZQorICAgICovCisgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5U2Vzc2lvbihib29sZWFuIHByaW1hcnlTZXNzaW9uKTsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJWYWx2ZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJWYWx2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZGQ5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ2x1c3RlclZhbHZlLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3RlcjsKKworLyoqCisgKiBDbHVzdGVyIFZhbHZlIEludGVyZmFjZSB0byBtYXJrIGFsbCBDbHVzdGVyIFZhbHZlcyAKKyAqIE9ubHkgdGhvc2UgVmFsdmUgY2FuJ2JlIGNvbmZpZ3VyZWQgYXMgQ2x1c3RlciBWYWx2ZXMKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgaW50ZXJmYWNlIENsdXN0ZXJWYWx2ZSB7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2x1c3RlciB0aGUgY2x1c3RlciBkZXBsb3llciBpcyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiBAcmV0dXJuIENhdGFsaW5hQ2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyBDYXRhbGluYUNsdXN0ZXIgZ2V0Q2x1c3RlcigpOworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlcyB0aGUgY2x1c3RlciBkZXBsb3llciB3aXRoIGEgY2x1c3RlcgorICAgICAqIEBwYXJhbSBjbHVzdGVyIENhdGFsaW5hQ2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXIoQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIpOworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NvbnN0YW50cy5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDE3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXI7CisKKy8qKgorICogTWFuaWZlc3QgY29uc3RhbnRzIGZvciB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyPC9jb2RlPgorICogcGFja2FnZS4KKyAqCisgKiBAYXV0aG9yIEJpcCBUaGVsaW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb25zdGFudHMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhY2thZ2UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyIjsKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGFmYTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEgQEAKK2NsdXN0ZXIubWJlYW4ucmVnaXN0ZXIuYWxyZWFkeT1NQmVhbiB7MH0gYWxyZWFkeSByZWdpc3RlcmVkIQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL01lbWJlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL01lbWJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwM2FiYTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvTWVtYmVyLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyOworCisvKioKKyAqIFRoZSBNZW1iZXIgaW50ZXJmYWNlLCBkZWZpbmVzIGEgbWVtYmVyIGluIHRoZSBDbHVzdGVyLgorICogQSBtZW1iZXIgaXMgYSBUb21jYXQgcHJvY2VzcyB0aGF0IHBhcnRpY2lwYXRlcyBpbiBzZXNzaW9uIHJlcGxpY2F0aW9uLjxCUj4KKyAqIEVhY2ggbWVtYmVyIGNhbiBjYXJyeSBhIHNldCBvZiBwcm9wZXJ0aWVzLCBkZWZpbmVkIGJ5IHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uPEJSPgorICogRm9yIFRDUCByZXBsaWNhdGlvbiBoYXMgYmVlbiB0YXJnZXRlZCBmb3IgdGhlIGZpcnN0IHJlbGVhc2UsIHRoZSBob3N0bmFtZSBhbmQgbGlzdGVuIHBvcnQKKyAqIG9mIHRoZSBtZW1iZXIgaXMgZGVmaW5lZCBhcyBoYXJkY29kZWQgc3R1ZmYuPEJSPgorICogVGhlIE1lbWJlciBpbnRlcmZhY2UgdG9nZXRoZXIgd2l0aCBNZW1iZXJzaGlwTGlzdGVuZXIsIE1lbWJlcnNoaXBTZXJ2aWNlIGFyZSBpbnRlcmZhY2VzIHVzZWQgdG8KKyAqIHN3aXRjaCBvdXQgdGhlIHNlcnZpY2UgdXNlZCB0byBlc3RhYmxpc2ggbWVtYmVyc2hpcCBpbiBiZXR3ZWVuIHRoZSBjbHVzdGVyIG5vZGVzLgorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKKworcHVibGljIGludGVyZmFjZSBNZW1iZXIgeworICAgIC8qKgorICAgICAqIFJldHVybiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBwcm9wZXJ0aWVzIGFib3V0IHRoaXMgY2x1c3RlciBub2RlLgorICAgICAqLworICAgIHB1YmxpYyBqYXZhLnV0aWwuSGFzaE1hcCBnZXRNZW1iZXJQcm9wZXJ0aWVzKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIG5vZGUsIHNob3VsZCBiZSB1bmlxdWUgd2l0aGluIHRoZSBjbHVzdGVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjbHVzdGVyIGRvbWFpbiBmcm9tIHRoaXMgbm9kZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgVENQIGxpc3RlbiBob3N0IGZvciB0aGUgVENQIGltcGxlbWVudGF0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRIb3N0KCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgVENQIGxpc3RlbiBwb3J0Zm9yIHRoZSBUQ1AgaW1wbGVtZW50YXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBvcnQoKTsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGhvdyBsb25nIHRoaXMgbWVtYmVyIGhhcyBiZWVuIG9ubGluZS4KKyAgICAgKiBUaGUgcmVzdWx0IGlzIHRoZSBudW1iZXIgb2YgbWlsbGkgc2Vjb25kcyB0aGlzIG1lbWJlciBoYXMgYmVlbgorICAgICAqIGJyb2FkY2FzdGluZyBpdHMgbWVtYmVyc2hpcCB0byB0aGUgY2x1c3Rlci4KKyAgICAgKiBAcmV0dXJuIG5yIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGlzIG1lbWJlciBzdGFydGVkLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldE1lbWJlckFsaXZlVGltZSgpOworICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL01lbWJlcnNoaXBMaXN0ZW5lci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL01lbWJlcnNoaXBMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZTlmYmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvTWVtYmVyc2hpcExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyOworCisvKioKKyAqIFRoZSBNZW1iZXJzaGlwTGlzdGVuZXIgaW50ZXJmYWNlIGlzIHVzZWQgYXMgYSBjYWxsYmFjayB0byB0aGUKKyAqIG1lbWJlcnNoaXAgc2VydmljZS4gSXQgaGFzIHR3byBtZXRob2RzIHRoYXQgd2lsbCBub3RpZnkgdGhlIGxpc3RlbmVyCisgKiB3aGVuIGEgbWVtYmVyIGhhcyBqb2luZWQgdGhlIGNsdXN0ZXIgYW5kIHdoZW4gYSBtZW1iZXIgaGFzIGRpc2FwcGVhcmVkIChjcmFzaGVkKQorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKKworcHVibGljIGludGVyZmFjZSBNZW1iZXJzaGlwTGlzdGVuZXIgeworICAgIHB1YmxpYyB2b2lkIG1lbWJlckFkZGVkKE1lbWJlciBtZW1iZXIpOworICAgIHB1YmxpYyB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKE1lbWJlciBtZW1iZXIpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL01lbWJlcnNoaXBTZXJ2aWNlLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvTWVtYmVyc2hpcFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTg3OTEwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL01lbWJlcnNoaXBTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3RlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuU2ltcGxlVGNwQ2x1c3RlcjsKKworLyoqCisgKiBUaGUgbWVtYmVyc2hpcCBzZXJ2aWNlIGhlbHBzIHRoZSBjbHVzdGVyIGRldGVybWluZSB0aGUgbWVtYmVyc2hpcAorICogbG9naWMgaW4gdGhlIGNsdXN0ZXIuCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCisKK3B1YmxpYyBpbnRlcmZhY2UgTWVtYmVyc2hpcFNlcnZpY2UgeworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIG1lbWJlcnNoaXAgc2VydmljZS4gVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUKKyAgICAgKiB0aGUgPGNvZGU+c3RhcnQoKTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKiBUaGUgcHJvcGVydGllcyBhcmUgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMgLSB0byBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgbWVtYmVyc2hpcCBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoamF2YS51dGlsLlByb3BlcnRpZXMgcHJvcGVydGllcyk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgamF2YS51dGlsLlByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpOworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGUgbWVtYmVyc2hpcCBzZXJ2aWNlLiBJZiBhIG1lbWJlcnNoaXAgbGlzdGVuZXJzIGlzIGFkZGVkCisgICAgICogdGhlIGxpc3RlbmVyIHdpbGwgc3RhcnQgdG8gcmVjZWl2ZSBtZW1iZXJzaGlwIGV2ZW50cy4KKyAgICAgKiBQZXJmb3JtcyBhIHN0YXJ0IGxldmVsIDEgYW5kIDIKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gaWYgdGhlIHNlcnZpY2UgZmFpbHMgdG8gc3RhcnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGUgbWVtYmVyc2hpcCBzZXJ2aWNlLiBJZiBhIG1lbWJlcnNoaXAgbGlzdGVuZXJzIGlzIGFkZGVkCisgICAgICogdGhlIGxpc3RlbmVyIHdpbGwgc3RhcnQgdG8gcmVjZWl2ZSBtZW1iZXJzaGlwIGV2ZW50cy4KKyAgICAgKiBAcGFyYW0gbGV2ZWwgLSBsZXZlbCAxIHN0YXJ0cyBsaXN0ZW5pbmcgZm9yIG1lbWJlcnMsIGxldmVsIDIgCisgICAgICogc3RhcnRzIGJyb2FkIGNhc3RpbmcgdGhlIHNlcnZlcgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiBpZiB0aGUgc2VydmljZSBmYWlscyB0byBzdGFydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydChpbnQgbGV2ZWwpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgbWVtYmVyc2hpcCBzZXJ2aWNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhhdCBjbHVzdGVyIGhhcyBtZW1iZXJzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc01lbWJlcnMoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIG1lbWJlcnMgaW4gdGhlIGNsdXN0ZXIuCisgICAgICovCisgICAgCisgICAgcHVibGljIE1lbWJlcltdIGdldE1lbWJlcnMoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtZW1iZXIgb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGlzIG1lbWJlcgorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXIgZ2V0TG9jYWxNZW1iZXIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbGwgbWVtYmVycyBieSBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldE1lbWJlcnNCeU5hbWUoKSA7IAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWVtYmVyIGJ5IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyIGZpbmRNZW1iZXJCeU5hbWUoU3RyaW5nIG5hbWUpIDsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxvY2FsIG1lbWJlciBwcm9wZXJ0aWVzIGZvciBicm9hZGNhc3RpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE1lbWJlclByb3BlcnRpZXMoU3RyaW5nIGxpc3Rlbkhvc3QsIGludCBsaXN0ZW5Qb3J0KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtZW1iZXJzaGlwIGxpc3RlbmVyLCBvbmx5IG9uZSBsaXN0ZW5lciBjYW4gYmUgYWRkZWQuCisgICAgICogSWYgeW91IGNhbGwgdGhpcyBtZXRob2QgdHdpY2UsIHRoZSBsYXN0IGxpc3RlbmVyIHdpbGwgYmUgdXNlZC4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTWVtYmVyc2hpcExpc3RlbmVyKE1lbWJlcnNoaXBMaXN0ZW5lciBsaXN0ZW5lcik7CisgICAgCisgICAgLyoqCisgICAgICogcmVtb3ZlcyB0aGUgbWVtYmVyc2hpcCBsaXN0ZW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNZW1iZXJzaGlwTGlzdGVuZXIoKTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBjbHVzdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2F0YWxpbmFDbHVzdGVyKFNpbXBsZVRjcENsdXN0ZXIgY2x1c3Rlcik7CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9NZXNzYWdlTGlzdGVuZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9NZXNzYWdlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDY4MzBmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL01lc3NhZ2VMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUxpc3RlbmVyIHsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoQ2x1c3Rlck1lc3NhZ2UgbXNnKTsKKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQ2x1c3Rlck1lc3NhZ2UgbXNnKTsKKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGxpc3RlbmVyKTsKKyAgICAKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2x1c3RlciB0aGUgY2x1c3RlciBkZXBsb3llciBpcyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiBAcmV0dXJuIENhdGFsaW5hQ2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyBDYXRhbGluYUNsdXN0ZXIgZ2V0Q2x1c3RlcigpOworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlcyB0aGUgY2x1c3RlciBkZXBsb3llciB3aXRoIGEgY2x1c3RlcgorICAgICAqIEBwYXJhbSBjbHVzdGVyIENhdGFsaW5hQ2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXIoQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIpOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9hdXRoZW50aWNhdG9yL0NsdXN0ZXJTaW5nbGVTaWduT24uamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9hdXRoZW50aWNhdG9yL0NsdXN0ZXJTaW5nbGVTaWduT24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmYzMWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2F1dGhlbnRpY2F0b3IvQ2x1c3RlclNpbmdsZVNpZ25Pbi5qYXZhCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5hdXRoZW50aWNhdG9yOworCisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuU2luZ2xlU2lnbk9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5TaW5nbGVTaWduT25FbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2F0YWxpbmFDbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclZhbHZlOworCisvKioKKyAqIEEgPHN0cm9uZz5WYWx2ZTwvc3Ryb25nPiB0aGF0IHN1cHBvcnRzIGEgInNpbmdsZSBzaWduIG9uIiB1c2VyIGV4cGVyaWVuY2Ugb24KKyAqIGVhY2ggbm9kZXMgb2YgYSBjbHVzdGVyLCB3aGVyZSB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgb2YgYSB1c2VyIHdobyBzdWNjZXNzZnVsbHkKKyAqIGF1dGhlbnRpY2F0ZXMgdG8gb25lIHdlYiBhcHBsaWNhdGlvbiBpcyBwcm9wb2dhdGVkIHRvIG90aGVyIHdlYiBhcHBsaWNhdGlvbnMgYW5kCisgKiB0byBvdGhlciBub2RlcyBjbHVzdGVyIGluIHRoZSBzYW1lIHNlY3VyaXR5IGRvbWFpbi4gIEZvciBzdWNjZXNzZnVsIHVzZSwgdGhlIGZvbGxvd2luZworICogcmVxdWlyZW1lbnRzIG11c3QgYmUgbWV0OgorICogPHVsPgorICogPGxpPlRoaXMgVmFsdmUgbXVzdCBiZSBjb25maWd1cmVkIG9uIHRoZSBDb250YWluZXIgdGhhdCByZXByZXNlbnRzIGEKKyAqICAgICB2aXJ0dWFsIGhvc3QgKHR5cGljYWxseSBhbiBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5Ib3N0PC9jb2RlPikuPC9saT4KKyAqIDxsaT5UaGUgPGNvZGU+UmVhbG08L2NvZGU+IHRoYXQgY29udGFpbnMgdGhlIHNoYXJlZCB1c2VyIGFuZCByb2xlCisgKiAgICAgaW5mb3JtYXRpb24gbXVzdCBiZSBjb25maWd1cmVkIG9uIHRoZSBzYW1lIENvbnRhaW5lciAob3IgYSBoaWdoZXIKKyAqICAgICBvbmUpLCBhbmQgbm90IG92ZXJyaWRkZW4gYXQgdGhlIHdlYiBhcHBsaWNhdGlvbiBsZXZlbC48L2xpPgorICogPGxpPlRoZSB3ZWIgYXBwbGljYXRpb25zIHRoZW1zZWx2ZXMgbXVzdCB1c2Ugb25lIG9mIHRoZSBzdGFuZGFyZAorICogICAgIEF1dGhlbnRpY2F0b3JzIGZvdW5kIGluIHRoZQorICogICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvcjwvY29kZT4gcGFja2FnZS48L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIEZhYmllbiBDYXJyaW9uCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDbHVzdGVyU2luZ2xlU2lnbk9uCisgICAgZXh0ZW5kcyBTaW5nbGVTaWduT24gaW1wbGVtZW50cyBDbHVzdGVyVmFsdmUgeworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFZhbHZlIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmF1dGhlbnRpY2F0b3IuQ2x1c3RlclNpbmdsZVNpZ25Pbi8xLjAiOworCisgICAgcHJvdGVjdGVkIGludCBtZXNzYWdlTnVtYmVyID0gMDsKKworICAgIHByaXZhdGUgQ2x1c3RlclNpbmdsZVNpZ25Pbkxpc3RlbmVyIGNsdXN0ZXJTU09MaXN0ZW5lciA9IG51bGw7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIHByaXZhdGUgQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworICAgICAgICByZXR1cm4gKGluZm8pOworICAgIH0KKworICAgIHB1YmxpYyBDYXRhbGluYUNsdXN0ZXIgZ2V0Q2x1c3RlcigpIHsKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlcihDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICB0aGlzLmNsdXN0ZXIgPSBjbHVzdGVyOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUHJlcGFyZSBmb3IgdGhlIGJlZ2lubmluZyBvZiBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzCisgICAgICogY29tcG9uZW50LiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciA8Y29kZT5jb25maWd1cmUoKTwvY29kZT4sCisgICAgICogYW5kIGJlZm9yZSBhbnkgb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoZSBjb21wb25lbnQgYXJlIHV0aWxpemVkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgdGhpcyBjb21wb25lbnQgZnJvbSBiZWluZyB1c2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc3RhcnQoKTsKKyAgICAgICAgY2x1c3RlclNTT0xpc3RlbmVyID0gbmV3IENsdXN0ZXJTaW5nbGVTaWduT25MaXN0ZW5lcigpOworICAgICAgICBjbHVzdGVyU1NPTGlzdGVuZXIuc2V0Q2x1c3RlclNTTyh0aGlzKTsKKyAgICAgICAgLy8gTG9hZCB0aGUgY2x1c3RlciBjb21wb25lbnQsIGlmIGFueQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy90aGUgY2hhbm5lbCBpcyBhbHJlYWR5IHJ1bm5pbmcKKyAgICAgICAgICAgIENsdXN0ZXIgY2x1c3RlciA9IGdldENsdXN0ZXIoKTsKKyAgICAgICAgICAgIC8vIHN0b3AgcmVtb3ZlIGNsdXN0ZXIgYmluZGluZworICAgICAgICAgICAgaWYoY2x1c3RlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGFpbmVyIGhvc3QgPSBnZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgICAgICBpZihob3N0ICE9IG51bGwgJiYgaG9zdCBpbnN0YW5jZW9mIEhvc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgY2x1c3RlciA9IGhvc3QuZ2V0Q2x1c3RlcigpOworICAgICAgICAgICAgICAgICAgICBpZihjbHVzdGVyICE9IG51bGwgJiYgY2x1c3RlciBpbnN0YW5jZW9mIENhdGFsaW5hQ2x1c3RlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2x1c3RlcigoQ2F0YWxpbmFDbHVzdGVyKSBjbHVzdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lciBlbmdpbmUgPSBob3N0LmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoZW5naW5lICE9IG51bGwgJiYgZW5naW5lIGluc3RhbmNlb2YgRW5naW5lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlciA9IGVuZ2luZS5nZXRDbHVzdGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2x1c3RlciAhPSBudWxsICYmIGNsdXN0ZXIgaW5zdGFuY2VvZiBDYXRhbGluYUNsdXN0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2x1c3RlcigoQ2F0YWxpbmFDbHVzdGVyKSBjbHVzdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNsdXN0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIlRoZXJlIGlzIG5vIENsdXN0ZXIgZm9yIENsdXN0ZXJTaW5nbGVTaWduT24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgoQ2F0YWxpbmFDbHVzdGVyKWNsdXN0ZXIpLmFkZENsdXN0ZXJMaXN0ZW5lcihjbHVzdGVyU1NPTGlzdGVuZXIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDbHVzdGVyU2luZ2xlU2lnbk9uIGV4Y2VwdGlvbiBkdXJpbmcgY2x1c3RlckxvYWQgIiArIHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSB0ZXJtaW5hdGUgdGhlIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdGhlIGxhc3Qgb25lIGNhbGxlZCBvbiBhIGdpdmVuCisgICAgICogaW5zdGFuY2Ugb2YgdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBuZWVkcyB0byBiZSByZXBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc3RvcCgpOworICAgICAgICBpZiAoZ2V0Q2x1c3RlcigpICE9IG51bGwgJiYgZ2V0Q2x1c3RlcigpIGluc3RhbmNlb2YgQ2F0YWxpbmFDbHVzdGVyKSB7CisgICAgICAgICAgICBnZXRDbHVzdGVyKCkucmVtb3ZlQ2x1c3Rlckxpc3RlbmVyKGNsdXN0ZXJTU09MaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZW5kZXJpbmcgb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiQ2x1c3RlclNpbmdsZVNpZ25PblsiKTsKKyAgICAgICAgaWYgKGNvbnRhaW5lciA9PSBudWxsICkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiQ29udGFpbmVyIGlzIG51bGwiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2IuYXBwZW5kKGNvbnRhaW5lci5nZXROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgY2x1c3RlciBvZiB0aGUgYWRkaXRpb24gb2YgYSBTZXNzaW9uIHRvCisgICAgICogYW4gU1NPIHNlc3Npb24gYW5kIGFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIHNpbmdsZQorICAgICAqIHNpZ24gb24gaWRlbnRpZmllciB3aXRoIHRoZSBzcGVjaWZpZWQgU2Vzc2lvbiBvbiB0aGUKKyAgICAgKiBsb2NhbCBub2RlLgorICAgICAqCisgICAgICogQHBhcmFtIHNzb0lkIFNpbmdsZSBzaWduIG9uIGlkZW50aWZpZXIKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiBTZXNzaW9uIHRvIGJlIGFzc29jaWF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NvY2lhdGUoU3RyaW5nIHNzb0lkLCBTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgYm9vbGVhbiBhZGRTZXNzaW9uID0gdHJ1ZSA7CisgICAgICAgIFNpbmdsZVNpZ25PbkVudHJ5IGVudHJ5ID0gbG9va3VwKHNzb0lkKTsKKyAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFNlc3Npb24gPSAhZW50cnkuc2Vzc2lvbkV4aXN0cyhzZXNzaW9uKTsKKyAgICAgICAgfQorICAgICAgICBpZihhZGRTZXNzaW9uKSB7CisgICAgICAgICAgICBzZW5kU1NPSWQoc3NvSWQsc2Vzc2lvbixTaW5nbGVTaWduT25NZXNzYWdlLkFERF9TRVNTSU9OKSA7CisgICAgICAgICAgICBhc3NvY2lhdGVMb2NhbChzc29JZCwgc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NvY2lhdGVMb2NhbChTdHJpbmcgc3NvSWQsIFNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICBzdXBlci5hc3NvY2lhdGUoc3NvSWQsIHNlc3Npb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgY2x1c3RlciBvZiB0aGUgcmVtb3ZhbCBvZiBhIFNlc3Npb24gZnJvbSBhbgorICAgICAqIFNTTyBzZXNzaW9uIGFuZCBkZXJlZ2lzdGVyIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbi4gSWYgaXQgaXMgdGhlIGxhc3QKKyAgICAgKiBzZXNzaW9uLCB0aGVuIGFsc28gZ2V0IHJpZCBvZiB0aGUgc2luZ2xlIHNpZ24gb24gaWRlbnRpZmllciBvbiB0aGUKKyAgICAgKiBsb2NhbCBub2RlLgorICAgICAqCisgICAgICogQHBhcmFtIHNzb0lkIFNpbmdsZSBzaWduIG9uIGlkZW50aWZpZXIKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiBTZXNzaW9uIHRvIGJlIGRlcmVnaXN0ZXJlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlcmVnaXN0ZXIoU3RyaW5nIHNzb0lkLCBTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICBzZW5kU1NPSWQoc3NvSWQsc2Vzc2lvbixTaW5nbGVTaWduT25NZXNzYWdlLkRFUkVHSVNURVJfU0VTU0lPTikgOworICAgICAgIGRlcmVnaXN0ZXJMb2NhbChzc29JZCwgc2Vzc2lvbik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZGVyZWdpc3RlckxvY2FsKFN0cmluZyBzc29JZCwgU2Vzc2lvbiBzZXNzaW9uKSB7CisgICAgICAgIHN1cGVyLmRlcmVnaXN0ZXIoc3NvSWQsIHNlc3Npb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoZSBjbHVzdGVyIHRoYXQgYSBzaW5nbGUgc2lnbiBvbiBzZXNzaW9uCisgICAgICogaGFzIGJlZW4gdGVybWluYXRlZCBkdWUgdG8gYSB1c2VyIGxvZ291dCwgZGVyZWdpc3RlcgorICAgICAqIHRoZSBzcGVjaWZpZWQgc2luZ2xlIHNpZ24gb24gaWRlbnRpZmllciwgYW5kIGludmFsaWRhdGUKKyAgICAgKiBhbnkgYXNzb2NpYXRlZCBzZXNzaW9ucyBvbiB0aGUgbG9jYWwgbm9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzc29JZCBTaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyIHRvIGRlcmVnaXN0ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXJlZ2lzdGVyKFN0cmluZyBzc29JZCkgeworICAgICAgICBzZW5kU1NPSWQoc3NvSWQsbnVsbCxTaW5nbGVTaWduT25NZXNzYWdlLkxPR09VVF9TRVNTSU9OKSA7CisgICAgICAgIGRlcmVnaXN0ZXJMb2NhbChzc29JZCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZGVyZWdpc3RlckxvY2FsKFN0cmluZyBzc29JZCkgeworICAgICAgICBzdXBlci5kZXJlZ2lzdGVyKHNzb0lkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGUgY2x1c3RlciBvZiB0aGUgY3JlYXRpb24gb2YgYSBuZXcgU1NPIGVudHJ5CisgICAgICogYW5kIHJlZ2lzdGVyIHRoZSBzcGVjaWZpZWQgUHJpbmNpcGFsIGFzIGJlaW5nIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgZm9yIHRoZSBzaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyLgorICAgICAqCisgICAgICogQHBhcmFtIHNzb0lkIFNpbmdsZSBzaWduIG9uIGlkZW50aWZpZXIgdG8gcmVnaXN0ZXIKKyAgICAgKiBAcGFyYW0gcHJpbmNpcGFsIEFzc29jaWF0ZWQgdXNlciBwcmluY2lwYWwgdGhhdCBpcyBpZGVudGlmaWVkCisgICAgICogQHBhcmFtIGF1dGhUeXBlIEF1dGhlbnRpY2F0aW9uIHR5cGUgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhpcworICAgICAqICB1c2VyIHByaW5jaXBhbAorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIHVzZXIKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzc3dvcmQgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhpcyB1c2VyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXIoU3RyaW5nIHNzb0lkLCBQcmluY2lwYWwgcHJpbmNpcGFsLCBTdHJpbmcgYXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICBzZW5kU1NPSWRXaXRoQXV0aChzc29JZCwKKyAgICAgICAgICAgICAgICBhdXRoVHlwZSwgdXNlcm5hbWUsIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgIFNpbmdsZVNpZ25Pbk1lc3NhZ2UuUkVHSVNURVJfU0VTU0lPTik7CisgICAgIAlyZWdpc3RlckxvY2FsKHNzb0lkLCBwcmluY2lwYWwsIGF1dGhUeXBlLCB1c2VybmFtZSwgcGFzc3dvcmQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyTG9jYWwoU3RyaW5nIHNzb0lkLCBQcmluY2lwYWwgcHJpbmNpcGFsLCBTdHJpbmcgYXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICBzdXBlci5yZWdpc3Rlcihzc29JZCwgcHJpbmNpcGFsLCBhdXRoVHlwZSwgdXNlcm5hbWUsIHBhc3N3b3JkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGUgY2x1c3RlciBvZiBhbiB1cGRhdGUgb2YgdGhlIHNlY3VyaXR5IGNyZWRlbnRpYWxzCisgICAgICogYXNzb2NpYXRlZCB3aXRoIGFuIFNTTyBzZXNzaW9uLiBVcGRhdGVzIGFueSA8Y29kZT5TaW5nbGVTaWduT25FbnRyeTwvY29kZT4KKyAgICAgKiBmb3VuZCB1bmRlciBrZXkgPGNvZGU+c3NvSWQ8L2NvZGU+IHdpdGggdGhlIGdpdmVuIGF1dGhlbnRpY2F0aW9uIGRhdGEuCisgICAgICogPHA+CisgICAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gYWxsb3cgYW4gU1NPIGVudHJ5IHRoYXQgd2FzCisgICAgICogZXN0YWJsaXNoZWQgd2l0aG91dCBhIHVzZXJuYW1lL3Bhc3N3b3JkIGNvbWJpbmF0aW9uIChpLmUuIGVzdGFibGlzaGVkCisgICAgICogZm9sbG93aW5nIERJR0VTVCBvciBDTElFTlQtQ0VSVCBhdXRoZW50aWNhdGlvbikgdG8gYmUgdXBkYXRlZCB3aXRoCisgICAgICogYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaWYgb25lIGJlY29tZXMgYXZhaWxhYmxlIHRocm91Z2ggYSBzdWJzZXF1ZW50CisgICAgICogQkFTSUMgb3IgRk9STSBhdXRoZW50aWNhdGlvbi4gIFRoZSBTU08gZW50cnkgd2lsbCB0aGVuIGJlIHVzYWJsZSBmb3IKKyAgICAgKiByZWF1dGhlbnRpY2F0aW9uLgorICAgICAqIDxwPgorICAgICAqIDxiPk5PVEU6PC9iPiBPbmx5IHVwZGF0ZXMgdGhlIFNTTyBlbnRyeSBpZiBhIGNhbGwgdG8KKyAgICAgKiA8Y29kZT5TaW5nbGVTaWduT25FbnRyeS5nZXRDYW5SZWF1dGhlbnRpY2F0ZSgpPC9jb2RlPiByZXR1cm5zCisgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+OyBvdGhlcndpc2UsIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgU1NPIGVudHJ5IGFscmVhZHkKKyAgICAgKiBoYXMgc3VmZmljaWVudCBpbmZvcm1hdGlvbiB0byBhbGxvdyByZWF1dGhlbnRpY2F0aW9uIGFuZCB0aGF0IG5vIHVwZGF0ZQorICAgICAqIGlzIG5lZWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzc29JZCAgICAgaWRlbnRpZmllciBvZiBTaW5nbGUgc2lnbiB0byBiZSB1cGRhdGVkCisgICAgICogQHBhcmFtIHByaW5jaXBhbCB0aGUgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiByZXR1cm5lZCBieSB0aGUgbGF0ZXN0CisgICAgICogICAgICAgICAgICAgICAgICBjYWxsIHRvIDxjb2RlPlJlYWxtLmF1dGhlbnRpY2F0ZTwvY29kZT4uCisgICAgICogQHBhcmFtIGF1dGhUeXBlICB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdG9yIHVzZWQgKEJBU0lDLCBDTElFTlQtQ0VSVCwKKyAgICAgKiAgICAgICAgICAgICAgICAgIERJR0VTVCBvciBGT1JNKQorICAgICAqIEBwYXJhbSB1c2VybmFtZSAgdGhlIHVzZXJuYW1lIChpZiBhbnkpIHVzZWQgZm9yIHRoZSBhdXRoZW50aWNhdGlvbgorICAgICAqIEBwYXJhbSBwYXNzd29yZCAgdGhlIHBhc3N3b3JkIChpZiBhbnkpIHVzZWQgZm9yIHRoZSBhdXRoZW50aWNhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZShTdHJpbmcgc3NvSWQsIFByaW5jaXBhbCBwcmluY2lwYWwsIFN0cmluZyBhdXRoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgc2VuZFNTT0lkV2l0aEF1dGgoc3NvSWQsCisgICAgICAgICAgICAgICAgYXV0aFR5cGUsIHVzZXJuYW1lLCBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICBTaW5nbGVTaWduT25NZXNzYWdlLlVQREFURV9TRVNTSU9OKTsKKyAgICAgICAgdXBkYXRlTG9jYWwoc3NvSWQsIHByaW5jaXBhbCwgYXV0aFR5cGUsIHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlTG9jYWwoU3RyaW5nIHNzb0lkLCBQcmluY2lwYWwgcHJpbmNpcGFsLCBTdHJpbmcgYXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgICAgIHN1cGVyLnVwZGF0ZShzc29JZCwgcHJpbmNpcGFsLCBhdXRoVHlwZSwgdXNlcm5hbWUsIHBhc3N3b3JkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBzaW5nbGUgU2Vzc2lvbiBmcm9tIGEgU2luZ2xlU2lnbk9uIGFuZCBub3RpZnkgdGhlIGNsdXN0ZXIKKyAgICAgKiBvZiB0aGUgcmVtb3ZhbC4gQ2FsbGVkIHdoZW4gYSBzZXNzaW9uIGlzIHRpbWVkIG91dCBhbmQgbm8gbG9uZ2VyIGFjdGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzc29JZCBTaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyIGZyb20gd2hpY2ggdG8gcmVtb3ZlIHRoZSBzZXNzaW9uLgorICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSBzZXNzaW9uIHRvIGJlIHJlbW92ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2Vzc2lvbihTdHJpbmcgc3NvSWQsIFNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICBzZW5kU1NPSWQoc3NvSWQsc2Vzc2lvbixTaW5nbGVTaWduT25NZXNzYWdlLlJFTU9WRV9TRVNTSU9OKSA7CisgICAgICAgIHJlbW92ZVNlc3Npb25Mb2NhbChzc29JZCwgc2Vzc2lvbik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2Vzc2lvbkxvY2FsKFN0cmluZyBzc29JZCwgU2Vzc2lvbiBzZXNzaW9uKSB7CisgICAgICAgIHN1cGVyLnJlbW92ZVNlc3Npb24oc3NvSWQsIHNlc3Npb24pOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgU2luZ2xlU2lnbk9uTWVzc2FnZSB3aXRoIHNlc3Npb24gaW5mb3JtYXRpb25zIGFuZCBzZW5kIHRvIG90aGVyIGRvbWFpbiBtZW1iZXJzLgorICAgICAqIEBwYXJhbSBzc29JZCAgICAgaWRlbnRpZmllciBvZiBTaW5nbGUgc2lnbiB0byBiZSB1cGRhdGVkCisgICAgICogQHBhcmFtIHNlc3Npb24gICB0aGUgc2Vzc2lvbiB0byBiZSBoYW5kbGUgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gYWN0aW9uICAgIFNTTyBBY3Rpb24gdHlwZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlbmRTU09JZChTdHJpbmcgc3NvSWQsIFNlc3Npb24gc2Vzc2lvbiwgaW50IGFjdGlvbikgeworICAgICAgICBpZiAoY2x1c3RlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtZXNzYWdlTnVtYmVyKys7CisgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkID0gbnVsbCA7CisgICAgICAgICAgICBpZihzZXNzaW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gc2Vzc2lvbi5nZXRJZCgpIDsKKyAgICAgICAgICAgIFNpbmdsZVNpZ25Pbk1lc3NhZ2UgbXNnID0KKyAgICAgICAgICAgICAgICBuZXcgU2luZ2xlU2lnbk9uTWVzc2FnZShjbHVzdGVyLmdldExvY2FsTWVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzc29JZCwgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGlmKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE1hbmFnZXIgbWdyID0gc2Vzc2lvbi5nZXRNYW5hZ2VyKCk7CisgICAgICAgICAgICAgICAgaWYgKChtZ3IgIT0gbnVsbCkgJiYgKG1nciBpbnN0YW5jZW9mIENsdXN0ZXJNYW5hZ2VyKSkKKyAgICAgICAgICAgICAgICAgICAgbXNnLnNldENvbnRleHROYW1lKCgoQ2x1c3Rlck1hbmFnZXIpIG1ncikuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlbmQobXNnLGFjdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgU2luZ2xlU2lnbk9uTWVzc2FnZSB3aXRoIGF1dGggaW5mb3JtYXRpb25zIGFuZCBzZW5kIHRvIG90aGVyIGRvbWFpbiBtZW1iZXJzLgorICAgICAqIEBwYXJhbSBzc29JZCAgICAgaWRlbnRpZmllciBvZiBTaW5nbGUgc2lnbiB0byBiZSB1cGRhdGVkCisgICAgICogQHBhcmFtIGF1dGhUeXBlICB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdG9yIHVzZWQgKEJBU0lDLCBDTElFTlQtQ0VSVCwKKyAgICAgKiAgICAgICAgICAgICAgICAgIERJR0VTVCBvciBGT1JNKQorICAgICAqIEBwYXJhbSB1c2VybmFtZSAgdGhlIHVzZXJuYW1lIChpZiBhbnkpIHVzZWQgZm9yIHRoZSBhdXRoZW50aWNhdGlvbgorICAgICAqIEBwYXJhbSBwYXNzd29yZCAgdGhlIHBhc3N3b3JkIChpZiBhbnkpIHVzZWQgZm9yIHRoZSBhdXRoZW50aWNhdGlvbgorICAgICAqIEBwYXJhbSBhY3Rpb24gICAgU1NPIEFjdGlvbiB0eXBlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2VuZFNTT0lkV2l0aEF1dGgoU3RyaW5nIHNzb0lkLFN0cmluZyBhdXRoVHlwZSwKKyAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkLCBpbnQgYWN0aW9uKSB7CisgICAgICAgIGlmIChjbHVzdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1lc3NhZ2VOdW1iZXIrKzsKKyAgICAgICAgICAgIFNpbmdsZVNpZ25Pbk1lc3NhZ2UgbXNnID0KKyAgICAgICAgICAgICAgICBuZXcgU2luZ2xlU2lnbk9uTWVzc2FnZShjbHVzdGVyLmdldExvY2FsTWVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzc29JZCwgbnVsbCk7CisgICAgICAgICAgICBtc2cuc2V0QXV0aFR5cGUoYXV0aFR5cGUpOworICAgICAgICAgICAgbXNnLnNldFVzZXJuYW1lKHVzZXJuYW1lKTsKKyAgICAgICAgICAgIG1zZy5zZXRQYXNzd29yZChwYXNzd29yZCk7CisgICAgICAgICAgICBzZW5kKG1zZyxhY3Rpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBTaW5nbGVTaWduT25NZXNzYWdlIHRvIG90aGVyIGRvbWFpbiBtZW1iZXJzLgorICAgICAqIEBwYXJhbSBtc2cgICAgIFNpbmdsZVNpZ25Pbk1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uICBTU08gQWN0aW9uIHR5cGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kKFNpbmdsZVNpZ25Pbk1lc3NhZ2UgbXNnLCBpbnQgYWN0aW9uKSB7CisgICAgICAgIG1zZy5zZXRBY3Rpb24oYWN0aW9uKTsKKyAgICAgICAgY2x1c3Rlci5zZW5kQ2x1c3RlckRvbWFpbihtc2cpOworICAgICAgICBpZiAoY29udGFpbmVyTG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBjb250YWluZXJMb2cuZGVidWcoIlNpbmdsZVNpZ25Pbk1lc3NhZ2UgU2VuZCB3aXRoIGFjdGlvbiAiCisgICAgICAgICAgICAgICAgKyBhY3Rpb24pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2F1dGhlbnRpY2F0b3IvQ2x1c3RlclNpbmdsZVNpZ25Pbkxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvYXV0aGVudGljYXRvci9DbHVzdGVyU2luZ2xlU2lnbk9uTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDViZWNkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2F1dGhlbnRpY2F0b3IvQ2x1c3RlclNpbmdsZVNpZ25Pbkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5hdXRoZW50aWNhdG9yOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uQ2x1c3Rlckxpc3RlbmVyOworCisvKioKKyAqIFJlY2VpdmUgcmVwbGljYXRlZCBTaW5nbGVTaWduT25NZXNzYWdlIGZvcm0gb3RoZXIgY2x1c3RlciBub2RlLgorICogCisgKiBAYXV0aG9yIEZhYmllbiBDYXJyaW9uCisgKi8KK3B1YmxpYyBjbGFzcyBDbHVzdGVyU2luZ2xlU2lnbk9uTGlzdGVuZXIgZXh0ZW5kcyBDbHVzdGVyTGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuYXV0aGVudGljYXRvci5DbHVzdGVyU2luZ2xlU2lnbk9uTGlzdGVuZXIvMS4wIjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgcHJpdmF0ZSBDbHVzdGVyU2luZ2xlU2lnbk9uIGNsdXN0ZXJTU08gPSBudWxsOworCisgICAgLy8gLS1Db25zdHJ1Y3Rvci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIENsdXN0ZXJTaW5nbGVTaWduT25MaXN0ZW5lcigpIHsKKyAgICB9CisKKyAgICAvLyAtLUxvZ2ljLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworICAgIHB1YmxpYyBDbHVzdGVyU2luZ2xlU2lnbk9uIGdldENsdXN0ZXJTU08oKSB7CisKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXJTU087CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDbHVzdGVyU1NPKENsdXN0ZXJTaW5nbGVTaWduT24gY2x1c3RlclNTTykgeworCisgICAgICAgIHRoaXMuY2x1c3RlclNTTyA9IGNsdXN0ZXJTU087CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmcm9tIHRoZSBjbHVzdGVyLCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCwgVGhlIGNsdXN0ZXIgd2lsbAorICAgICAqIGJyb2FkY2FzdCBpdCBpbnZva2luZyB0aGUgbWVzc2FnZVJlY2VpdmVkIG9uIHRoZSByZWNlaXZlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXlvYmoKKyAgICAgKiAgICAgICAgICAgIENsdXN0ZXJNZXNzYWdlIC0gdGhlIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgY2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZWNlaXZlZChDbHVzdGVyTWVzc2FnZSBteW9iaikgeworICAgICAgICBpZiAobXlvYmogIT0gbnVsbCAmJiBteW9iaiBpbnN0YW5jZW9mIFNpbmdsZVNpZ25Pbk1lc3NhZ2UpIHsKKyAgICAgICAgICAgIFNpbmdsZVNpZ25Pbk1lc3NhZ2UgbXNnID0gKFNpbmdsZVNpZ25Pbk1lc3NhZ2UpIG15b2JqOworICAgICAgICAgICAgaW50IGFjdGlvbiA9IG1zZy5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNpbmdsZVNpZ25Pbk1lc3NhZ2UgUmVjZWl2ZWQgd2l0aCBhY3Rpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtc2cuZ2V0QWN0aW9uKCkpOworCisgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICAgICAgY2FzZSBTaW5nbGVTaWduT25NZXNzYWdlLkFERF9TRVNTSU9OOgorICAgICAgICAgICAgICAgIHNlc3Npb24gPSBnZXRTZXNzaW9uKG1zZy5nZXRTZXNzaW9uSWQoKSwgbXNnLmdldENvbnRleHROYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJTU08uYXNzb2NpYXRlTG9jYWwobXNnLmdldFNzb0lkKCksIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTaW5nbGVTaWduT25NZXNzYWdlLkRFUkVHSVNURVJfU0VTU0lPTjoKKyAgICAgICAgICAgICAgICBzZXNzaW9uID0gZ2V0U2Vzc2lvbihtc2cuZ2V0U2Vzc2lvbklkKCksIG1zZy5nZXRDb250ZXh0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjbHVzdGVyU1NPLmRlcmVnaXN0ZXJMb2NhbChtc2cuZ2V0U3NvSWQoKSwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNpbmdsZVNpZ25Pbk1lc3NhZ2UuTE9HT1VUX1NFU1NJT046CisgICAgICAgICAgICAgICAgY2x1c3RlclNTTy5kZXJlZ2lzdGVyTG9jYWwobXNnLmdldFNzb0lkKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTaW5nbGVTaWduT25NZXNzYWdlLlJFR0lTVEVSX1NFU1NJT046CisgICAgICAgICAgICAgICAgY2x1c3RlclNTTy5yZWdpc3RlckxvY2FsKG1zZy5nZXRTc29JZCgpLCBudWxsLCBtc2cKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdXRoVHlwZSgpLCBtc2cuZ2V0VXNlcm5hbWUoKSwgbXNnLmdldFBhc3N3b3JkKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTaW5nbGVTaWduT25NZXNzYWdlLlVQREFURV9TRVNTSU9OOgorICAgICAgICAgICAgICAgIGNsdXN0ZXJTU08udXBkYXRlTG9jYWwobXNnLmdldFNzb0lkKCksIG51bGwsIG1zZy5nZXRBdXRoVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmdldFVzZXJuYW1lKCksIG1zZy5nZXRQYXNzd29yZCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2luZ2xlU2lnbk9uTWVzc2FnZS5SRU1PVkVfU0VTU0lPTjoKKyAgICAgICAgICAgICAgICBzZXNzaW9uID0gZ2V0U2Vzc2lvbihtc2cuZ2V0U2Vzc2lvbklkKCksIG1zZy5nZXRDb250ZXh0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjbHVzdGVyU1NPLnJlbW92ZVNlc3Npb25Mb2NhbChtc2cuZ2V0U3NvSWQoKSwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2NlcHQgb25seSBTaW5nbGVTaWduT25NZXNzYWdlCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgQ2x1c3Rlck1lc3NhZ2UKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gLSByZXR1cm5zIHRydWUgdG8gaW5kaWNhdGUgdGhhdCBtZXNzYWdlUmVjZWl2ZWQgc2hvdWxkIGJlCisgICAgICogICAgICAgICBpbnZva2VkLiBJZiBmYWxzZSBpcyByZXR1cm5lZCwgdGhlIG1lc3NhZ2VSZWNlaXZlZCBtZXRob2Qgd2lsbAorICAgICAqICAgICAgICAgbm90IGJlIGludm9rZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KENsdXN0ZXJNZXNzYWdlIG1zZykgeworICAgICAgICByZXR1cm4gKG1zZyBpbnN0YW5jZW9mIFNpbmdsZVNpZ25Pbk1lc3NhZ2UpOworICAgIH0KKworICAgIHByaXZhdGUgU2Vzc2lvbiBnZXRTZXNzaW9uKFN0cmluZyBzZXNzaW9uSWQsIFN0cmluZyBjdHhuYW1lKSB7CisKKyAgICAgICAgTWFwIG1hbmFnZXJzID0gY2x1c3RlclNTTy5nZXRDbHVzdGVyKCkuZ2V0TWFuYWdlcnMoKTsKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKworICAgICAgICBpZiAoY3R4bmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgaSA9IG1hbmFnZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgQ2x1c3Rlck1hbmFnZXIgbWdyID0gKENsdXN0ZXJNYW5hZ2VyKSBtYW5hZ2Vycy5nZXQoa2V5KTsKKyAgICAgICAgICAgICAgICBpZiAobWdyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gPSBtZ3IuZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiU2Vzc2lvbiBkb2Vzbid0IGV4aXN0OiIgKyBpbyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlc3Npb247CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIGEgbG90IGJlZm9yZSB0aGUgc3lzdGVtIGhhcyBzdGFydGVkCisgICAgICAgICAgICAgICAgICAgIC8vIHVwCisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29udGV4dCBtYW5hZ2VyIGRvZXNuJ3QgZXhpc3Q6IiArIGtleSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ2x1c3Rlck1hbmFnZXIgbWdyID0gKENsdXN0ZXJNYW5hZ2VyKSBtYW5hZ2Vycy5nZXQoY3R4bmFtZSk7CisgICAgICAgICAgICBpZiAobWdyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uID0gbWdyLmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW8pIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJTZXNzaW9uIGRvZXNuJ3QgZXhpc3Q6IiArIGlvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlc3Npb247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ29udGV4dCBtYW5hZ2VyIGRvZXNuJ3QgZXhpc3Q6IiArIGN0eG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9hdXRoZW50aWNhdG9yL1NpbmdsZVNpZ25Pbk1lc3NhZ2UuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9hdXRoZW50aWNhdG9yL1NpbmdsZVNpZ25Pbk1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjJhZjI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2F1dGhlbnRpY2F0b3IvU2luZ2xlU2lnbk9uTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuYXV0aGVudGljYXRvcjsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXI7CisKKy8qKgorICogQ29udGFpbnMgdGhlIFNpbmdsZVNpZ25PbiBkYXRhLCByZWFkIGFuZCB3cml0dGVuIGJ5IHRoZSBDbHVzdGVyU2luZ2xlU2lnbk9uCisgKiAKKyAqIEBhdXRob3IgRmFiaWVuIENhcnJpb24KKyAqLworCitwdWJsaWMgY2xhc3MgU2luZ2xlU2lnbk9uTWVzc2FnZSBpbXBsZW1lbnRzIENsdXN0ZXJNZXNzYWdlLCBTZXJpYWxpemFibGUgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX1NFU1NJT04gPSAxOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVSRUdJU1RFUl9TRVNTSU9OID0gMjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPR09VVF9TRVNTSU9OID0gMzsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFR0lTVEVSX1NFU1NJT04gPSA0OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX1NFU1NJT04gPSA1OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX1NFU1NJT04gPSA2OworCisgICAgcHJpdmF0ZSBpbnQgYWN0aW9uID0gLTE7CisKKyAgICBwcml2YXRlIFN0cmluZyBzc29JZCA9IG51bGw7CisKKyAgICBwcml2YXRlIFN0cmluZyBjdHhuYW1lID0gbnVsbDsKKworICAgIHByaXZhdGUgU3RyaW5nIHNlc3Npb25JZCA9IG51bGw7CisKKyAgICBwcml2YXRlIFN0cmluZyBhdXRoVHlwZSA9IG51bGw7CisKKyAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisKKyAgICBwcml2YXRlIFN0cmluZyB1c2VybmFtZSA9IG51bGw7CisKKyAgICBwcml2YXRlIE1lbWJlciBhZGRyZXNzID0gbnVsbDsKKworICAgIHByaXZhdGUgbG9uZyB0aW1lc3RhbXAgPSAwOworCisgICAgcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQgPSBudWxsOworCisgICAgcHJpdmF0ZSBpbnQgcmVzZW5kID0gQ2x1c3Rlck1lc3NhZ2UuRkxBR19ERUZBVUxUOworCisgICAgcHJpdmF0ZSBpbnQgY29tcHJlc3MgPSBDbHVzdGVyTWVzc2FnZS5GTEFHX0RFRkFVTFQ7CisKKyAgICBwdWJsaWMgU2luZ2xlU2lnbk9uTWVzc2FnZShNZW1iZXIgc291cmNlLCBTdHJpbmcgc3NvSWQsIFN0cmluZyBzZXNzaW9uSWQpIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gc291cmNlOworICAgICAgICB0aGlzLnNzb0lkID0gc3NvSWQ7CisgICAgICAgIHRoaXMuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYWRkcmVzcyB0aGF0IHRoaXMgbWVzc2FnZSBvcmlnaW5hdGVkIGZyb20uIFRoaXMgd291bGQgYmUgc2V0IGlmCisgICAgICogdGhlIG1lc3NhZ2Ugd2FzIGJlaW5nIHJlbGF5ZWQgZnJvbSBhIGhvc3Qgb3RoZXIgdGhhbiB0aGUgb25lIHRoYXQKKyAgICAgKiBvcmlnaW5hbGx5IHNlbnQgaXQuCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBnZXRBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gYWRkcmVzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIGNsdXN0ZXIgYmVmb3JlIHNlbmRpbmcgaXQgdG8gdGhlIG90aGVyIG5vZGVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZW1iZXIKKyAgICAgKiAgICAgICAgICAgIE1lbWJlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3MoTWVtYmVyIG1lbWJlcikgeworICAgICAgICB0aGlzLmFkZHJlc3MgPSBtZW1iZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGltZXN0YW1wIG1lc3NhZ2UuCisgICAgICogCisgICAgICogQHJldHVybiBsb25nCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCkgeworICAgICAgICByZXR1cm4gdGltZXN0YW1wOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgY2x1c3RlciBiZWZvcmUgc2VuZGluZyBvdXQgdGhlIG1lc3NhZ2UuCisgICAgICogCisgICAgICogQHBhcmFtIHRpbWVzdGFtcAorICAgICAqICAgICAgICAgICAgVGhlIHRpbWVzdGFtcAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChsb25nIHRpbWVzdGFtcCkgeworICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFYWNoIG1lc3NhZ2UgbXVzdCBoYXZlIGEgdW5pcXVlIElELCBpbiBjYXNlIG9mIHVzaW5nIGFzeW5jIHJlcGxpY2F0aW9uLAorICAgICAqIGFuZCBhIHNtYXJ0IHF1ZXVlLCB0aGlzIGlkIGlzIHVzZWQgdG8gcmVwbGFjZSBtZXNzYWdlcyBub3QgeWV0IHNlbnQuCisgICAgICogCisgICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworICAgICAgICBpZiAodGhpcy51bmlxdWVJZCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMudW5pcXVlSWQ7CisgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKGdldFNzb0lkKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIjLSMiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKyAgICAgICAgdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gYWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbihpbnQgYWN0aW9uKSB7CisgICAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3NvSWQoKSB7CisgICAgICAgIHJldHVybiBzc29JZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTc29JZChTdHJpbmcgc3NvSWQpIHsKKyAgICAgICAgdGhpcy5zc29JZCA9IHNzb0lkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dE5hbWUoKSB7CisgICAgICAgIHJldHVybiBjdHhuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHROYW1lKFN0cmluZyBjdHhuYW1lKSB7CisgICAgICAgIHRoaXMuY3R4bmFtZSA9IGN0eG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSWQoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbklkKFN0cmluZyBzZXNzaW9uSWQpIHsKKyAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRoVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGF1dGhUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF1dGhUeXBlKFN0cmluZyBhdXRoVHlwZSkgeworICAgICAgICB0aGlzLmF1dGhUeXBlID0gYXV0aFR5cGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKKyAgICAgICAgcmV0dXJuIHBhc3N3b3JkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHVzZXJuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSkgeworICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb21wcmVzcy4KKyAgICAgKiBAc2luY2UgNS41LjEwCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb21wcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIGNvbXByZXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBjb21wcmVzcworICAgICAqICAgICAgICAgICAgVGhlIGNvbXByZXNzIHRvIHNldC4KKyAgICAgKiBAc2luY2UgNS41LjEwCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcHJlc3MoaW50IGNvbXByZXNzKSB7CisgICAgICAgIHRoaXMuY29tcHJlc3MgPSBjb21wcmVzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlc2VuZC4KKyAgICAgKiBAc2luY2UgNS41LjEwCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZXNlbmQoKSB7CisgICAgICAgIHJldHVybiByZXNlbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHJlc2VuZAorICAgICAqICAgICAgICAgICAgVGhlIHJlc2VuZCB0byBzZXQuCisgICAgICogQHNpbmNlIDUuNS4xMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc2VuZChpbnQgcmVzZW5kKSB7CisgICAgICAgIHRoaXMucmVzZW5kID0gcmVzZW5kOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlbmRlcmluZyBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlNpbmdsZVNpZ25Pbk1lc3NhZ2VbYWN0aW9uPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0QWN0aW9uKCkpLmFwcGVuZCgiLCBzc29JZD0iKS5hcHBlbmQoZ2V0U3NvSWQoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBzZXNzaW9uSWQ9IikuYXBwZW5kKGdldFNlc3Npb25JZCgpKS5hcHBlbmQoIiwgdXNlcm5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRVc2VybmFtZSgpKS5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2F1dGhlbnRpY2F0b3IvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9hdXRoZW50aWNhdG9yL21iZWFucy1kZXNjcmlwdG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyMGY5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9hdXRoZW50aWNhdG9yL21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8bWJlYW5zLWRlc2NyaXB0b3JzPgorCisgIDxtYmVhbiBuYW1lPSJDbHVzdGVyU2luZ2xlU2lnbk9uIgorICAgICAgICAgZGVzY3JpcHRpb249IkEgVmFsdmUgdGhhdCBzdXBwb3J0cyBhICdzaW5nbGUgc2lnbm9uJyB1c2VyIGV4cGVyaWVuY2Ugb24gYSB3aG9sZSBjbHVzdGVyIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJWYWx2ZSIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5hdXRoZW50aWNhdG9yLkNsdXN0ZXJTaW5nbGVTaWduT24iPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVxdWlyZVJlYXV0aGVudGljYXRpb24iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU2hvdWxkIHdlIGF0dGVtcHQgdG8gcmVhdXRoZW50aWNhdGUgZWFjaCByZXF1ZXN0IGFnYWluc3QgdGhlIHNlY3VyaXR5IFJlYWxtPyIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29va2llRG9tYWluIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IihPcHRpb25hKSBEb21haW4gdG8gYmUgdXNlZCBieSBzc28gY29va2llcyIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIC8+CisKKyAgPC9tYmVhbj4KKworPC9tYmVhbnMtZGVzY3JpcHRvcnM+CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvZGVwbG95L0Zhcm1XYXJEZXBsb3llci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2RlcGxveS9GYXJtV2FyRGVwbG95ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTg0ZGU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2RlcGxveS9GYXJtV2FyRGVwbG95ZXIuamF2YQpAQCAtMCwwICsxLDc0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5kZXBsb3k7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNhdGFsaW5hQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlckRlcGxveWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworCisvKioKKyAqIDxwPgorICogQSBmYXJtIHdhciBkZXBsb3llciBpcyBhIGNsYXNzIHRoYXQgaXMgYWJsZSB0byBkZXBsb3kvdW5kZXBsb3kgd2ViCisgKiBhcHBsaWNhdGlvbnMgaW4gV0FSIGZvcm0gd2l0aGluIHRoZSBjbHVzdGVyLgorICogPC9wPgorICogQW55IGhvc3QgY2FuIGFjdCBhcyB0aGUgYWRtaW4sIGFuZCB3aWxsIGhhdmUgdGhyZWUgZGlyZWN0b3JpZXMKKyAqIDx1bD4KKyAqIDxsaT5kZXBsb3lEaXIgLSB0aGUgZGlyZWN0b3J5IHdoZXJlIHdlIHdhdGNoIGZvciBjaGFuZ2VzPC9saT4KKyAqIDxsaT5hcHBsaWNhdGlvbkRpciAtIHRoZSBkaXJlY3Rvcnkgd2hlcmUgd2UgaW5zdGFsbCBhcHBsaWNhdGlvbnM8L2xpPgorICogPGxpPnRlbXBEaXIgLSBhIHRlbXBvcmFyeURpcmVjdG9yeSB0byBzdG9yZSBiaW5hcnkgZGF0YSB3aGVuIGRvd25sb2FkaW5nIGEKKyAqIHdhciBmcm9tIHRoZSBjbHVzdGVyPC9saT4KKyAqIDwvdWw+CisgKiBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IGRlcGxveW1lbnQgb2YgV0FSIGZpbGVzIHNpbmNlIHRoZXkgYXJlIGVhc2llciB0bworICogc2VuZCBhY3Jvc3MgdGhlIHdpcmUuCisgKiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEZhcm1XYXJEZXBsb3llciBpbXBsZW1lbnRzIENsdXN0ZXJEZXBsb3llciwgRmlsZUNoYW5nZUxpc3RlbmVyIHsKKyAgICAvKi0tU3RhdGljIFZhcmlhYmxlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkKKyAgICAgICAgICAgIC5nZXRMb2coRmFybVdhckRlcGxveWVyLmNsYXNzKTsKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJGYXJtV2FyRGVwbG95ZXIvMS4yIjsKKworICAgIC8qLS1JbnN0YW5jZSBWYXJpYWJsZXMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcHJvdGVjdGVkIENhdGFsaW5hQ2x1c3RlciBjbHVzdGVyID0gbnVsbDsKKworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsgLy9kZWZhdWx0IDUgc2Vjb25kcworCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgZmlsZUZhY3RvcmllcyA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlcGxveURpcjsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgdGVtcERpcjsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgd2F0Y2hEaXI7CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB3YXRjaEVuYWJsZWQgPSBmYWxzZTsKKworICAgIHByb3RlY3RlZCBXYXJXYXRjaGVyIHdhdGNoZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogSXRlcmF0aW9uIGNvdW50IGZvciBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY291bnQgPSAwOworCisgICAgLyoqCisgICAgICogRnJlcXVlbmN5IG9mIHRoZSBGYXJtIHdhdGNoRGlyIGNoZWNrLiBDbHVzdGVyIHdpZGUgZGVwbG95bWVudCB3aWxsIGJlCisgICAgICogZG9uZSBvbmNlIGZvciB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBiYWNrZ3JvbmRQcm9jZXNzIGNhbGxzIChpZSwgdGhlCisgICAgICogbG93ZXIgdGhlIGFtb3VudCwgdGhlIG1vc3Qgb2Z0ZW4gdGhlIGNoZWNrcyB3aWxsIG9jY3VyKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHByb2Nlc3NEZXBsb3lGcmVxdWVuY3kgPSAyOworCisgICAgLyoqCisgICAgICogUGF0aCB3aGVyZSBjb250ZXh0IGRlc2NyaXB0b3JzIHNob3VsZCBiZSBkZXBsb3llZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBjb25maWdCYXNlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBhc3NvY2lhdGVkIGhvc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhvc3QgaG9zdCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaG9zdCBhcHBCYXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGFwcEJhc2UgPSBudWxsOworCisgICAgLyoqCisgICAgICogTUJlYW4gc2VydmVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBNQmVhblNlcnZlciBtQmVhblNlcnZlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYXNzb2NpYXRlZCBkZXBsb3llciBPYmplY3ROYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3ROYW1lIG9uYW1lID0gbnVsbDsKKworICAgIC8qLS1Db25zdHJ1Y3Rvci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcHVibGljIEZhcm1XYXJEZXBsb3llcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZXBsb3llciBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworICAgIC8qLS1Mb2dpYy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXJ0ZWQpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGdldENsdXN0ZXIoKS5hZGRDbHVzdGVyTGlzdGVuZXIodGhpcyk7CisgICAgICAgIGlmICh3YXRjaEVuYWJsZWQpIHsKKyAgICAgICAgICAgIHdhdGNoZXIgPSBuZXcgV2FyV2F0Y2hlcih0aGlzLCBuZXcgRmlsZShnZXRXYXRjaERpcigpKSk7CisgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiQ2x1c3RlciBkZXBsb3ltZW50IGlzIHdhdGNoaW5nICIgKyBnZXRXYXRjaERpcigpCisgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGNoYW5nZXMuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0byBjb3JyZWN0IGVuZ2luZSBhbmQgaG9zdCBzZXR1cAorICAgICAgICBob3N0ID0gKEhvc3QpIGdldENsdXN0ZXIoKS5nZXRDb250YWluZXIoKTsKKyAgICAgICAgRW5naW5lIGVuZ2luZSA9IChFbmdpbmUpIGhvc3QuZ2V0UGFyZW50KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGVuZ2luZS5nZXROYW1lKCkgKyAiOnR5cGU9RGVwbG95ZXIsaG9zdD0iCisgICAgICAgICAgICAgICAgICAgICsgaG9zdC5nZXROYW1lKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJDYW4ndCBjb25zdHJ1Y3QgTUJlYW4gb2JqZWN0IG5hbWUiICsgZSk7CisgICAgICAgIH0KKyAgICAgICAgY29uZmlnQmFzZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLCAiY29uZiIpOworICAgICAgICBpZiAoZW5naW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbmZpZ0Jhc2UgPSBuZXcgRmlsZShjb25maWdCYXNlLCBlbmdpbmUuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb25maWdCYXNlID0gbmV3IEZpbGUoY29uZmlnQmFzZSwgaG9zdC5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0cmlldmUgdGhlIE1CZWFuIHNlcnZlcgorICAgICAgICBtQmVhblNlcnZlciA9IFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLmdldE1CZWFuU2VydmVyKCk7CisKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuaW5mbygiQ2x1c3RlciBGYXJtV2FyRGVwbG95ZXIgc3RhcnRlZC4iKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHN0b3AgY2x1c3RlciB3aWRlIGRlcGxveW1lbnRzCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlckRlcGxveWVyI3N0b3AoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworICAgICAgICBnZXRDbHVzdGVyKCkucmVtb3ZlQ2x1c3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIGlmICh3YXRjaGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdhdGNoZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIHdhdGNoZXIgPSBudWxsOworCisgICAgICAgIH0KKyAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuaW5mbygiQ2x1c3RlciBGYXJtV2FyRGVwbG95ZXIgc3RvcHBlZC4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhbkRlcGxveURpcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiTWV0aG9kIGNsZWFuRGVwbG95RGlyKCkgbm90IHlldCBpbXBsZW1lbnRlZC4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmcm9tIHRoZSBjbHVzdGVyLCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCwgVGhlIGNsdXN0ZXIgd2lsbAorICAgICAqIGJyb2FkY2FzdCBpdCBpbnZva2luZyB0aGUgbWVzc2FnZVJlY2VpdmVkIG9uIHRoZSByZWNlaXZlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICogICAgICAgICAgICBDbHVzdGVyTWVzc2FnZSAtIHRoZSBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIGNsdXN0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoQ2x1c3Rlck1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobXNnIGluc3RhbmNlb2YgRmlsZU1lc3NhZ2UgJiYgbXNnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGaWxlTWVzc2FnZSBmbXNnID0gKEZpbGVNZXNzYWdlKSBtc2c7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInJlY2VpdmUgY2x1c3RlciBkZXBsb3ltZW50IFsgcGF0aDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZm1zZy5nZXRDb250ZXh0UGF0aCgpICsgIiB3YXI6ICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmbXNnLmdldEZpbGVOYW1lKCkgKyAiIF0iKTsKKyAgICAgICAgICAgICAgICBGaWxlTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoZm1zZyk7CisgICAgICAgICAgICAgICAgLy8gVE9ETyBjb3JyZWN0IHNlY29uZCB0cnkgYWZ0ZXIgYXBwIGlzIGluIHNlcnZpY2UhCisgICAgICAgICAgICAgICAgaWYgKGZhY3Rvcnkud3JpdGVNZXNzYWdlKGZtc2cpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vbGFzdCBtZXNzYWdlIHJlY2VpdmVkIHdhciBmaWxlIGlzIGNvbXBsZXRlZAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZhY3RvcnkuZ2V0RmlsZSgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKCIud2FyIikpCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZSArICIud2FyIjsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBkZXBsb3lhYmxlID0gbmV3IEZpbGUoZ2V0RGVwbG95RGlyKCksIG5hbWUpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBmbXNnLmdldENvbnRleHRQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2VydmljZWQocGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTZXJ2aWNlZChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUocGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkuZ2V0RmlsZSgpLnJlbmFtZVRvKGRlcGxveWFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjayhwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVTZXJ2aWNlZChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoImRlcGxveW1lbnQgZnJvbSAiICsgcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmaW5pc2hlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQXBwbGljYXRpb24gIiArIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbiB1c2VkLiB0b3VjaCB3YXIgZmlsZSAiICsgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFnYWluISIpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihleCk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVGYWN0b3J5KGZtc2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cgaW5zdGFuY2VvZiBVbmRlcGxveU1lc3NhZ2UgJiYgbXNnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBVbmRlcGxveU1lc3NhZ2UgdW1zZyA9IChVbmRlcGxveU1lc3NhZ2UpIG1zZzsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSB1bXNnLmdldENvbnRleHRQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygicmVjZWl2ZSBjbHVzdGVyIHVuZGVwbG95bWVudCBmcm9tICIgKyBwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VkKHBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRTZXJ2aWNlZChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVTZXJ2aWNlZChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInVuZGVwbG95bWVudCBmcm9tICIgKyBwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZmluaXNoZWQuIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJBcHBsaWNhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGluIHVzZWQuIFNvcnJ5IG5vdCByZW1vdmUgZnJvbSBiYWNrdXAgY2x1c3RlciBub2RlcyEiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24geCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gcmVhZCBmYXJtIGRlcGxveSBmaWxlIG1lc3NhZ2UuIiwgeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGUgZmFjdG9yeSBmb3IgYWxsIHRyYW5zcG9ydGVkIHdhciBmaWxlcworICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiBAcmV0dXJuIEZhY3RvcnkgZm9yIGFsbCBhcHAgbWVzc2FnZSAod2FyIGZpbGVzKQorICAgICAqIEB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEZpbGVNZXNzYWdlRmFjdG9yeSBnZXRGYWN0b3J5KEZpbGVNZXNzYWdlIG1zZykKKyAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgdG1wRmlsZSA9IG5ldyBGaWxlKG1zZy5nZXRGaWxlTmFtZSgpKTsKKyAgICAgICAgRmlsZSB3cml0ZVRvRmlsZSA9IG5ldyBGaWxlKGdldFRlbXBEaXIoKSwgdG1wRmlsZS5nZXROYW1lKCkpOworICAgICAgICBGaWxlTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IChGaWxlTWVzc2FnZUZhY3RvcnkpIGZpbGVGYWN0b3JpZXMuZ2V0KG1zZworICAgICAgICAgICAgICAgIC5nZXRGaWxlTmFtZSgpKTsKKyAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFjdG9yeSA9IEZpbGVNZXNzYWdlRmFjdG9yeS5nZXRJbnN0YW5jZSh3cml0ZVRvRmlsZSwgdHJ1ZSk7CisgICAgICAgICAgICBmaWxlRmFjdG9yaWVzLnB1dChtc2cuZ2V0RmlsZU5hbWUoKSwgZmFjdG9yeSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGZpbGUgKHdhcikgZnJvbSBtZXNzYWdlcykKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRmFjdG9yeShGaWxlTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgZmlsZUZhY3Rvcmllcy5yZW1vdmUobXNnLmdldEZpbGVOYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJlZm9yZSB0aGUgY2x1c3RlciBpbnZva2VzIG1lc3NhZ2VSZWNlaXZlZCB0aGUgY2x1c3RlciB3aWxsIGFzayB0aGUKKyAgICAgKiByZWNlaXZlciB0byBhY2NlcHQgb3IgZGVjbGluZSB0aGUgbWVzc2FnZSwgSW4gdGhlIGZ1dHVyZSwgd2hlbiBtZXNzYWdlcworICAgICAqIGdldCBiaWcsIHRoZSBhY2NlcHQgbWV0aG9kIHdpbGwgb25seSB0YWtlIGEgbWVzc2FnZSBoZWFkZXIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICogICAgICAgICAgICBDbHVzdGVyTWVzc2FnZQorICAgICAqIEByZXR1cm4gYm9vbGVhbiAtIHJldHVybnMgdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IG1lc3NhZ2VSZWNlaXZlZCBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgIGludm9rZWQuIElmIGZhbHNlIGlzIHJldHVybmVkLCB0aGUgbWVzc2FnZVJlY2VpdmVkIG1ldGhvZCB3aWxsCisgICAgICogICAgICAgICBub3QgYmUgaW52b2tlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQ2x1c3Rlck1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHJldHVybiAobXNnIGluc3RhbmNlb2YgRmlsZU1lc3NhZ2UpIHx8IChtc2cgaW5zdGFuY2VvZiBVbmRlcGxveU1lc3NhZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbGwgYSBuZXcgd2ViIGFwcGxpY2F0aW9uLCB3aG9zZSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSBpcyBhdCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgVVJMLCBpbnRvIHRoaXMgY29udGFpbmVyIGFuZCBhbGwgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlCisgICAgICogY2x1c3RlciB3aXRoIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoLiBBIGNvbnRleHQgcGF0aCBvZiAiIiAodGhlIGVtcHR5CisgICAgICogc3RyaW5nKSBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHJvb3QgYXBwbGljYXRpb24gZm9yIHRoaXMgY29udGFpbmVyLgorICAgICAqIE90aGVyd2lzZSwgdGhlIGNvbnRleHQgcGF0aCBtdXN0IHN0YXJ0IHdpdGggYSBzbGFzaC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGlzIGFwcGxpY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgbG9jYWxseSwgYSBDb250YWluZXJFdmVudAorICAgICAqIG9mIHR5cGUgPGNvZGU+SU5TVEFMTF9FVkVOVDwvY29kZT4gd2lsbCBiZSBzZW50IHRvIGFsbCByZWdpc3RlcmVkCisgICAgICogbGlzdGVuZXJzLCB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbnRleHQ8L2NvZGU+IGFzIGFuIGFyZ3VtZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aAorICAgICAqICAgICAgICAgICAgVGhlIGNvbnRleHQgcGF0aCB0byB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIHNob3VsZCBiZSBpbnN0YWxsZWQKKyAgICAgKiAgICAgICAgICAgIChtdXN0IGJlIHVuaXF1ZSkKKyAgICAgKiBAcGFyYW0gd2FyCisgICAgICogICAgICAgICAgICBBIFVSTCBvZiB0eXBlICJqYXI6IiB0aGF0IHBvaW50cyB0byBhIFdBUiBmaWxlLCBvciB0eXBlCisgICAgICogICAgICAgICAgICAiZmlsZToiIHRoYXQgcG9pbnRzIHRvIGFuIHVucGFja2VkIGRpcmVjdG9yeSBzdHJ1Y3R1cmUKKyAgICAgKiAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIHdlYiBhcHBsaWNhdGlvbiB0byBiZSBpbnN0YWxsZWQKKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoIGlzIG1hbGZvcm1lZCAoaXQgbXVzdCBiZSAiIgorICAgICAqICAgICAgICAgICAgICAgIG9yIHN0YXJ0IHdpdGggYSBzbGFzaCkKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYW4KKyAgICAgKiAgICAgICAgICAgICAgICBleGlzdGluZyB3ZWIgYXBwbGljYXRpb24KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIHdhcyBlbmNvdW50ZXJlZCBkdXJpbmcKKyAgICAgKiAgICAgICAgICAgICAgICBpbnN0YWxsYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnN0YWxsKFN0cmluZyBjb250ZXh0UGF0aCwgVVJMIHdhcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IGdldENsdXN0ZXIoKS5nZXRNZW1iZXJzKCk7CisgICAgICAgIE1lbWJlciBsb2NhbE1lbWJlciA9IGdldENsdXN0ZXIoKS5nZXRMb2NhbE1lbWJlcigpOworICAgICAgICBGaWxlTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IEZpbGVNZXNzYWdlRmFjdG9yeS5nZXRJbnN0YW5jZShuZXcgRmlsZSgKKyAgICAgICAgICAgICAgICB3YXIuZ2V0RmlsZSgpKSwgZmFsc2UpOworICAgICAgICBGaWxlTWVzc2FnZSBtc2cgPSBuZXcgRmlsZU1lc3NhZ2UobG9jYWxNZW1iZXIsIHdhci5nZXRGaWxlKCksCisgICAgICAgICAgICAgICAgY29udGV4dFBhdGgpOworICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VuZCBjbHVzdGVyIHdhciBkZXBsb3ltZW50IFsgcGF0aDoiCisgICAgICAgICAgICAgICAgICAgICsgY29udGV4dFBhdGggKyAiIHdhcjogIiArIHdhciArICIgXSBzdGFydGVkLiIpOworICAgICAgICBtc2cgPSBmYWN0b3J5LnJlYWRNZXNzYWdlKG1zZyk7CisgICAgICAgIHdoaWxlIChtc2cgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlbmQgY2x1c3RlciB3YXIgZnJhZ21lbnQgWyBwYXRoOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250ZXh0UGF0aCArICIgd2FyOiAiICsgd2FyICsgIiB0bzogIiArICBtZW1iZXJzW2ldICsgIiBdIik7CisgICAgICAgICAgICAgICAgZ2V0Q2x1c3RlcigpLnNlbmQobXNnLCBtZW1iZXJzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZyA9IGZhY3RvcnkucmVhZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgfQorICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VuZCBjbHVzdGVyIHdhciBkZXBsb3ltZW50IFsgcGF0aDogIgorICAgICAgICAgICAgICAgICAgICArIGNvbnRleHRQYXRoICsgIiB3YXI6ICIgKyB3YXIgKyAiIF0gZmluaXNoZWQuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIGV4aXN0aW5nIHdlYiBhcHBsaWNhdGlvbiwgYXR0YWNoZWQgdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0CisgICAgICogcGF0aC4gSWYgdGhpcyBhcHBsaWNhdGlvbiBpcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZCwgYSBDb250YWluZXJFdmVudCBvZgorICAgICAqIHR5cGUgPGNvZGU+UkVNT1ZFX0VWRU5UPC9jb2RlPiB3aWxsIGJlIHNlbnQgdG8gYWxsIHJlZ2lzdGVyZWQKKyAgICAgKiBsaXN0ZW5lcnMsIHdpdGggdGhlIHJlbW92ZWQgPGNvZGU+Q29udGV4dDwvY29kZT4gYXMgYW4gYXJndW1lbnQuCisgICAgICogRGVsZXRlcyB0aGUgd2ViIGFwcGxpY2F0aW9uIHdhciBmaWxlIGFuZC9vciBkaXJlY3RvcnkgaWYgdGhleSBleGlzdCBpbgorICAgICAqIHRoZSBIb3N0J3MgYXBwQmFzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGgKKyAgICAgKiAgICAgICAgICAgIFRoZSBjb250ZXh0IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHJlbW92ZWQKKyAgICAgKiBAcGFyYW0gdW5kZXBsb3kKKyAgICAgKiAgICAgICAgICAgIGJvb2xlYW4gZmxhZyB0byByZW1vdmUgd2ViIGFwcGxpY2F0aW9uIGZyb20gc2VydmVyCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aCBpcyBtYWxmb3JtZWQgKGl0IG11c3QgYmUgIiIKKyAgICAgKiAgICAgICAgICAgICAgICBvciBzdGFydCB3aXRoIGEgc2xhc2gpCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aCBkb2VzIG5vdCBpZGVudGlmeSBhCisgICAgICogICAgICAgICAgICAgICAgY3VycmVudGx5IGluc3RhbGxlZCB3ZWIgYXBwbGljYXRpb24KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycyBkdXJpbmcgcmVtb3ZhbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgY29udGV4dFBhdGgsIGJvb2xlYW4gdW5kZXBsb3kpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oIkNsdXN0ZXIgd2lkZSByZW1vdmUgb2Ygd2ViIGFwcCAiICsgY29udGV4dFBhdGgpOworICAgICAgICBNZW1iZXIgbG9jYWxNZW1iZXIgPSBnZXRDbHVzdGVyKCkuZ2V0TG9jYWxNZW1iZXIoKTsKKyAgICAgICAgVW5kZXBsb3lNZXNzYWdlIG1zZyA9IG5ldyBVbmRlcGxveU1lc3NhZ2UobG9jYWxNZW1iZXIsIFN5c3RlbQorICAgICAgICAgICAgICAgIC5jdXJyZW50VGltZU1pbGxpcygpLCAiVW5kZXBsb3k6IiArIGNvbnRleHRQYXRoICsgIjoiCisgICAgICAgICAgICAgICAgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgY29udGV4dFBhdGgsIHVuZGVwbG95KTsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJTZW5kIGNsdXN0ZXIgd2lkZSB1bmRlcGxveW1lbnQgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICsgY29udGV4dFBhdGggKTsKKyAgICAgICAgY2x1c3Rlci5zZW5kKG1zZyk7CisgICAgICAgIC8vIHJlbW92ZSBsb2NhbGx5CisgICAgICAgIGlmICh1bmRlcGxveSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzU2VydmljZWQoY29udGV4dFBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFNlcnZpY2VkKGNvbnRleHRQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShjb250ZXh0UGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVTZXJ2aWNlZChjb250ZXh0UGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJMb2NhbCByZW1vdmUgZnJvbSAiICsgY29udGV4dFBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJmYWlsZWQsIG90aGVyIG1hbmFnZXIgaGFzIGFwcCBpbiBzZXJ2aWNlISIpOworCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoImxvY2FsIHJlbW92ZSBmcm9tICIgKyBjb250ZXh0UGF0aCArICIgZmFpbGVkIiwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIE1vZGlmY2F0aW9uIGZyb20gd2F0Y2hEaXIgd2FyIGRldGVjdGVkIQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmRlcGxveS5GaWxlQ2hhbmdlTGlzdGVuZXIjZmlsZU1vZGlmaWVkKGphdmEuaW8uRmlsZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaWxlTW9kaWZpZWQoRmlsZSBuZXdXYXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGUgZGVwbG95V2FyID0gbmV3IEZpbGUoZ2V0RGVwbG95RGlyKCksIG5ld1dhci5nZXROYW1lKCkpOworICAgICAgICAgICAgY29weShuZXdXYXIsIGRlcGxveVdhcik7CisgICAgICAgICAgICBTdHJpbmcgY29udGV4dE5hbWUgPSBnZXRDb250ZXh0TmFtZShkZXBsb3lXYXIpOworICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oIkluc3RhbGxpbmcgd2ViYXBwWyIgKyBjb250ZXh0TmFtZSArICJdIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXBsb3lXYXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZW1vdmUoY29udGV4dE5hbWUsIGZhbHNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJObyByZW1vdmFsIiwgeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnN0YWxsKGNvbnRleHROYW1lLCBkZXBsb3lXYXIudG9VUkwoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBpbnN0YWxsIFdBUiBmaWxlIiwgeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFdhciByZW12b2UgZnJvbSB3YXRjaERpcgorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmRlcGxveS5GaWxlQ2hhbmdlTGlzdGVuZXIjZmlsZVJlbW92ZWQoamF2YS5pby5GaWxlKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpbGVSZW1vdmVkKEZpbGUgcmVtb3ZlV2FyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgY29udGV4dE5hbWUgPSBnZXRDb250ZXh0TmFtZShyZW1vdmVXYXIpOworICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nIHdlYmFwcFsiICsgY29udGV4dE5hbWUgKyAiXSIpOworICAgICAgICAgICAgcmVtb3ZlKGNvbnRleHROYW1lLCB0cnVlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHJlbW92ZSBXQVIgZmlsZSIsIHgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgY29udGV4dCBwYXRoIGZyb20gd2FyCisgICAgICogQHBhcmFtIHdhciBXYXIgZmlsZW5hbWUKKyAgICAgKiBAcmV0dXJuICcvZmlsZW5hbWUnIG9yIGlmIHdhciBuYW1lIGlzIFJPT1Qud2FyIGNvbnRleHQgbmFtZSBpcyBlbXB0eSBzdHJpbmcgJycgCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0TmFtZShGaWxlIHdhcikgeworICAgICAgICBTdHJpbmcgY29udGV4dE5hbWUgPSAiLyIKKyAgICAgICAgKyB3YXIuZ2V0TmFtZSgpLnN1YnN0cmluZygwLAorICAgICAgICAgICAgICAgIHdhci5nZXROYW1lKCkubGFzdEluZGV4T2YoIi53YXIiKSk7CisgICAgICAgIGlmKCIvUk9PVCIuZXF1YWxzKGNvbnRleHROYW1lKSkKKyAgICAgICAgICAgIGNvbnRleHROYW1lPSAiIiA7CisgICAgICAgIHJldHVybiBjb250ZXh0TmFtZSA7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdpdmVuIGEgY29udGV4dCBwYXRoLCBnZXQgdGhlIGNvbmZpZyBmaWxlIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWdGaWxlKFN0cmluZyBwYXRoKSB7CisgICAgICAgIFN0cmluZyBiYXNlbmFtZSA9IG51bGw7CisgICAgICAgIGlmIChwYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIGJhc2VuYW1lID0gIlJPT1QiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmFzZW5hbWUgPSBwYXRoLnN1YnN0cmluZygxKS5yZXBsYWNlKCcvJywgJyMnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGJhc2VuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIGNvbnRleHQgcGF0aCwgZ2V0IHRoZSBjb25maWcgZmlsZSBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RG9jQmFzZShTdHJpbmcgcGF0aCkgeworICAgICAgICBTdHJpbmcgYmFzZW5hbWUgPSBudWxsOworICAgICAgICBpZiAocGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBiYXNlbmFtZSA9ICJST09UIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJhc2VuYW1lID0gcGF0aC5zdWJzdHJpbmcoMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChiYXNlbmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSAiYXBwbGljYXRpb24gcm9vdCIgZGlyZWN0b3J5IGZvcgorICAgICAqIG91ciBhc3NvY2lhdGVkIEhvc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0QXBwQmFzZSgpIHsKKworICAgICAgICBpZiAoYXBwQmFzZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gYXBwQmFzZTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGhvc3QuZ2V0QXBwQmFzZSgpKTsKKyAgICAgICAgaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkKKyAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwgaG9zdAorICAgICAgICAgICAgICAgICAgICAuZ2V0QXBwQmFzZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFwcEJhc2UgPSBmaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXBwQmFzZSA9IGZpbGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChhcHBCYXNlKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZSB0aGUgcmVtb3ZlIG1ldGhvZCBvbiB0aGUgZGVwbG95ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVE9ETyBIYW5kbGUgcmVtb3ZlIGFsc28gd29yayBkaXIgY29udGVudCAhCisgICAgICAgIC8vIFN0b3AgdGhlIGNvbnRleHQgZmlyc3QgdG8gYmUgbmljZXIKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGhvc3QuZmluZENoaWxkKHBhdGgpOworICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVuZGVwbG95IGxvY2FsIGNvbnRleHQgIiArcGF0aCApOworICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNvbnRleHQpLnN0b3AoKTsKKyAgICAgICAgICAgIEZpbGUgd2FyID0gbmV3IEZpbGUoZ2V0QXBwQmFzZSgpLCBnZXREb2NCYXNlKHBhdGgpICsgIi53YXIiKTsKKyAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoZ2V0QXBwQmFzZSgpLCBnZXREb2NCYXNlKHBhdGgpKTsKKyAgICAgICAgICAgIEZpbGUgeG1sID0gbmV3IEZpbGUoY29uZmlnQmFzZSwgZ2V0Q29uZmlnRmlsZShwYXRoKSArICIueG1sIik7CisgICAgICAgICAgICBpZiAod2FyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgd2FyLmRlbGV0ZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChkaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICB1bmRlcGxveURpcihkaXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB4bWwuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBQZXJmb3JtIG5ldyBkZXBsb3ltZW50IGFuZCByZW1vdmUgaW50ZXJuYWwgSG9zdENvbmZpZyBzdGF0ZQorICAgICAgICAgICAgY2hlY2socGF0aCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSwgaW5jbHVkaW5nIGFsbCBvZiBpdHMgY29udGVudHMgYW5kCisgICAgICogc3ViZGlyZWN0b3JpZXMgcmVjdXJzaXZlbHkuCisgICAgICogCisgICAgICogQHBhcmFtIGRpcgorICAgICAqICAgICAgICAgICAgRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkaXJlY3RvcnkgdG8gYmUgZGVsZXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHVuZGVwbG95RGlyKEZpbGUgZGlyKSB7CisKKyAgICAgICAgU3RyaW5nIGZpbGVzW10gPSBkaXIubGlzdCgpOworICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgZmlsZXMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pOworICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIHVuZGVwbG95RGlyKGZpbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRpci5kZWxldGUoKTsKKworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsbCB3YXRjaGVyIHRvIGNoZWNrIGZvciBkZXBsb3kgY2hhbmdlcworICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJEZXBsb3llciNiYWNrZ3JvdW5kUHJvY2VzcygpCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmFja2dyb3VuZFByb2Nlc3MoKSB7CisgICAgICAgIGlmIChzdGFydGVkKSB7CisgICAgICAgICAgICBjb3VudCA9IChjb3VudCArIDEpICUgcHJvY2Vzc0RlcGxveUZyZXF1ZW5jeTsKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSAwICYmIHdhdGNoRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIHdhdGNoZXIuY2hlY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyotLURlcGxveWVyIE9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qKgorICAgICAqIEludm9rZSB0aGUgY2hlY2sgbWV0aG9kIG9uIHRoZSBkZXBsb3llci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVjayhTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IHsgbmFtZSB9OworICAgICAgICBTdHJpbmdbXSBzaWduYXR1cmUgPSB7ICJqYXZhLmxhbmcuU3RyaW5nIiB9OworICAgICAgICBtQmVhblNlcnZlci5pbnZva2Uob25hbWUsICJjaGVjayIsIHBhcmFtcywgc2lnbmF0dXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgdGhlIGNoZWNrIG1ldGhvZCBvbiB0aGUgZGVwbG95ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXJ2aWNlZChTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IHsgbmFtZSB9OworICAgICAgICBTdHJpbmdbXSBzaWduYXR1cmUgPSB7ICJqYXZhLmxhbmcuU3RyaW5nIiB9OworICAgICAgICBCb29sZWFuIHJlc3VsdCA9IChCb29sZWFuKSBtQmVhblNlcnZlci5pbnZva2Uob25hbWUsICJpc1NlcnZpY2VkIiwKKyAgICAgICAgICAgICAgICBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgICAgIHJldHVybiByZXN1bHQuYm9vbGVhblZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSBjaGVjayBtZXRob2Qgb24gdGhlIGRlcGxveWVyLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZFNlcnZpY2VkKFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nW10gcGFyYW1zID0geyBuYW1lIH07CisgICAgICAgIFN0cmluZ1tdIHNpZ25hdHVyZSA9IHsgImphdmEubGFuZy5TdHJpbmciIH07CisgICAgICAgIG1CZWFuU2VydmVyLmludm9rZShvbmFtZSwgImFkZFNlcnZpY2VkIiwgcGFyYW1zLCBzaWduYXR1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZSB0aGUgY2hlY2sgbWV0aG9kIG9uIHRoZSBkZXBsb3llci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZXJ2aWNlZChTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IHsgbmFtZSB9OworICAgICAgICBTdHJpbmdbXSBzaWduYXR1cmUgPSB7ICJqYXZhLmxhbmcuU3RyaW5nIiB9OworICAgICAgICBtQmVhblNlcnZlci5pbnZva2Uob25hbWUsICJyZW1vdmVTZXJ2aWNlZCIsIHBhcmFtcywgc2lnbmF0dXJlKTsKKyAgICB9CisKKyAgICAvKi0tSW5zdGFuY2UgR2V0dGVycy9TZXR0ZXJzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHB1YmxpYyBDYXRhbGluYUNsdXN0ZXIgZ2V0Q2x1c3RlcigpIHsKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlcihDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICB0aGlzLmNsdXN0ZXIgPSBjbHVzdGVyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbGlzdGVuZXIpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZXBsb3lEaXIoKSB7CisgICAgICAgIHJldHVybiBkZXBsb3lEaXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVwbG95RGlyKFN0cmluZyBkZXBsb3lEaXIpIHsKKyAgICAgICAgdGhpcy5kZXBsb3lEaXIgPSBkZXBsb3lEaXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZW1wRGlyKCkgeworICAgICAgICByZXR1cm4gdGVtcERpcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUZW1wRGlyKFN0cmluZyB0ZW1wRGlyKSB7CisgICAgICAgIHRoaXMudGVtcERpciA9IHRlbXBEaXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRXYXRjaERpcigpIHsKKyAgICAgICAgcmV0dXJuIHdhdGNoRGlyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFdhdGNoRGlyKFN0cmluZyB3YXRjaERpcikgeworICAgICAgICB0aGlzLndhdGNoRGlyID0gd2F0Y2hEaXI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNXYXRjaEVuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiB3YXRjaEVuYWJsZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0V2F0Y2hFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gd2F0Y2hFbmFibGVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFdhdGNoRW5hYmxlZChib29sZWFuIHdhdGNoRW5hYmxlZCkgeworICAgICAgICB0aGlzLndhdGNoRW5hYmxlZCA9IHdhdGNoRW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB3YXRjaGVyIGNoZWNrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFByb2Nlc3NEZXBsb3lGcmVxdWVuY3koKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnByb2Nlc3NEZXBsb3lGcmVxdWVuY3kpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3YXRjaGVyIGNoZWNrcyBmcmVxdWVuY3kuCisgICAgICogCisgICAgICogQHBhcmFtIHByb2Nlc3NFeHBpcmVzRnJlcXVlbmN5CisgICAgICogICAgICAgICAgICB0aGUgbmV3IG1hbmFnZXIgY2hlY2tzIGZyZXF1ZW5jeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NEZXBsb3lGcmVxdWVuY3koaW50IHByb2Nlc3NFeHBpcmVzRnJlcXVlbmN5KSB7CisKKyAgICAgICAgaWYgKHByb2Nlc3NFeHBpcmVzRnJlcXVlbmN5IDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnByb2Nlc3NEZXBsb3lGcmVxdWVuY3kgPSBwcm9jZXNzRXhwaXJlc0ZyZXF1ZW5jeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3B5IGEgZmlsZSB0byB0aGUgc3BlY2lmaWVkIHRlbXAgZGlyZWN0b3J5LgorICAgICAqIEBwYXJhbSBmcm9tIGNvcHkgZnJvbSB0ZW1wCisgICAgICogQHBhcmFtIHRvICAgdG8gaG9zdCBhcHBCYXNlIGRpcmVjdG9yeQorICAgICAqIEByZXR1cm4gdHJ1ZSwgY29weSBzdWNjZXNzZnVsCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29weShGaWxlIGZyb20sIEZpbGUgdG8pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghdG8uZXhpc3RzKCkpCisgICAgICAgICAgICAgICAgdG8uY3JlYXRlTmV3RmlsZSgpOworICAgICAgICAgICAgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0gaXMgPSBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oZnJvbSk7CisgICAgICAgICAgICBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0gb3MgPSBuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKHRvLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGludCBsZW4gPSBpcy5yZWFkKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG9zLndyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBjb3B5IGZpbGUgZnJvbToiICsgZnJvbSArICIgdG86IiArIHRvLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9kZXBsb3kvRmlsZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvZGVwbG95L0ZpbGVDaGFuZ2VMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MmNjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvZGVwbG95L0ZpbGVDaGFuZ2VMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5kZXBsb3k7CitpbXBvcnQgamF2YS5pby5GaWxlOworCitwdWJsaWMgaW50ZXJmYWNlIEZpbGVDaGFuZ2VMaXN0ZW5lciB7CisgICAgcHVibGljIHZvaWQgZmlsZU1vZGlmaWVkKEZpbGUgZik7CisgICAgcHVibGljIHZvaWQgZmlsZVJlbW92ZWQoRmlsZSBmKTsKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9kZXBsb3kvRmlsZU1lc3NhZ2UuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9kZXBsb3kvRmlsZU1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzY0ZGFhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2RlcGxveS9GaWxlTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuZGVwbG95OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXI7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogQ29udGFpbnMgdGhlIGRhdGEgZm9yIGEgZmlsZSBiZWluZyB0cmFuc2ZlcnJlZCBvdmVyIFRDUCwgdGhpcyBpcyAKKyAqIGVzc2VudGlhbGx5IGEgZnJhZ21lbnQgb2YgYSBmaWxlLCByZWFkIGFuZCB3cml0dGVuIGJ5IHRoZSBGaWxlTWVzc2FnZUZhY3RvcnkKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCisKK3B1YmxpYyBjbGFzcyBGaWxlTWVzc2FnZSBpbXBsZW1lbnRzIENsdXN0ZXJNZXNzYWdlLCBTZXJpYWxpemFibGUgeworICAgIHByaXZhdGUgaW50IG1lc3NhZ2VOdW1iZXI7CisgICAgcHJpdmF0ZSBieXRlW10gZGF0YTsKKyAgICBwcml2YXRlIGludCBkYXRhTGVuZ3RoOworICAgIHByaXZhdGUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlciBhZGRyZXNzOworICAgIAorICAgIHByaXZhdGUgbG9uZyB0aW1lc3RhbXA7CisgICAgcHJpdmF0ZSBsb25nIHRvdGFsTGVuZ3RoOworICAgIHByaXZhdGUgbG9uZyB0b3RhbE5yT2ZNc2dzOworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVOYW1lOworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRleHRQYXRoOworICAgIHByaXZhdGUgaW50IHJlc2VuZCA9IENsdXN0ZXJNZXNzYWdlLkZMQUdfRk9SQklEREVOOworICAgIHByaXZhdGUgaW50IGNvbXByZXNzID0gQ2x1c3Rlck1lc3NhZ2UuRkxBR19ERUZBVUxUIDsKKyAgICAKKyAgICBwdWJsaWMgRmlsZU1lc3NhZ2UoTWVtYmVyIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGgpIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzPXNvdXJjZTsKKyAgICAgICAgdGhpcy5maWxlTmFtZT1maWxlTmFtZTsKKyAgICAgICAgdGhpcy5jb250ZXh0UGF0aD1jb250ZXh0UGF0aDsKKyAgICB9CisgICAgCisgICAgLyoKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChPYmplY3RJbnB1dCBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICAqLworICAgCisgICAgcHVibGljIGludCBnZXRNZXNzYWdlTnVtYmVyKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZU51bWJlcjsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZU51bWJlcihpbnQgbWVzc2FnZU51bWJlcikgeworICAgICAgICB0aGlzLm1lc3NhZ2VOdW1iZXIgPSBtZXNzYWdlTnVtYmVyOworICAgIH0KKyAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbE5yT2ZNc2dzKCkgeworICAgICAgICByZXR1cm4gdG90YWxOck9mTXNnczsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0VG90YWxOck9mTXNncyhsb25nIHRvdGFsTnJPZk1zZ3MpIHsKKyAgICAgICAgdGhpcy50b3RhbE5yT2ZNc2dzID0gdG90YWxOck9mTXNnczsKKyAgICB9CisgICAgcHVibGljIGJ5dGVbXSBnZXREYXRhKCkgeworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0RGF0YShieXRlW10gZGF0YSwgaW50IGxlbmd0aCkgeworICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgICAgICB0aGlzLmRhdGFMZW5ndGggPSBsZW5ndGg7CisgICAgfQorICAgIHB1YmxpYyBpbnQgZ2V0RGF0YUxlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIGRhdGFMZW5ndGg7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldERhdGFMZW5ndGgoaW50IGRhdGFMZW5ndGgpIHsKKyAgICAgICAgdGhpcy5kYXRhTGVuZ3RoID0gZGF0YUxlbmd0aDsKKyAgICB9CisgICAgcHVibGljIGxvbmcgZ2V0VG90YWxMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiB0b3RhbExlbmd0aDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0VG90YWxMZW5ndGgobG9uZyB0b3RhbExlbmd0aCkgeworICAgICAgICB0aGlzLnRvdGFsTGVuZ3RoID0gdG90YWxMZW5ndGg7CisgICAgfQorICAgIHB1YmxpYyBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVtYmVyIGdldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXIgYWRkcmVzcykgeworICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRGaWxlTmFtZSgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIy0jIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoZ2V0TWVzc2FnZU51bWJlcigpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIy0jIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCkgeworICAgICAgICByZXR1cm4gdGltZXN0YW1wOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAobG9uZyB0aW1lc3RhbXApIHsKKyAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBmaWxlTmFtZTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKKyAgICB9CisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHRQYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29tcHJlc3MuCisgICAgICogQHNpbmNlIDUuNS4xMCAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvbXByZXNzKCkgeworICAgICAgICByZXR1cm4gY29tcHJlc3M7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSBjb21wcmVzcyBUaGUgY29tcHJlc3MgdG8gc2V0LgorICAgICAqIEBzaW5jZSA1LjUuMTAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21wcmVzcyhpbnQgY29tcHJlc3MpIHsKKyAgICAgICAgdGhpcy5jb21wcmVzcyA9IGNvbXByZXNzOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlc2VuZC4KKyAgICAgKiBAc2luY2UgNS41LjEwCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZXNlbmQoKSB7CisgICAgICAgIHJldHVybiByZXNlbmQ7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSByZXNlbmQgVGhlIHJlc2VuZCB0byBzZXQuCisgICAgICogQHNpbmNlIDUuNS4xMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc2VuZChpbnQgcmVzZW5kKSB7CisgICAgICAgIHRoaXMucmVzZW5kID0gcmVzZW5kOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9kZXBsb3kvRmlsZU1lc3NhZ2VGYWN0b3J5LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvZGVwbG95L0ZpbGVNZXNzYWdlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYWMwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvZGVwbG95L0ZpbGVNZXNzYWdlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuZGVwbG95OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgZmFjdG9yeSBpcyB1c2VkIHRvIHJlYWQgZmlsZXMgYW5kIHdyaXRlIGZpbGVzIGJ5IHNwbGl0dGluZyB0aGVtIHVwIGludG8KKyAqIHNtYWxsZXIgbWVzc2FnZXMuIFNvIHRoYXQgZW50aXJlIGZpbGVzIGRvbid0IGhhdmUgdG8gYmUgcmVhZCBpbnRvIG1lbW9yeS4KKyAqIDxCUj4KKyAqIFRoZSBmYWN0b3J5IGNhbiBiZSB1c2VkIGFzIGEgcmVhZGVyIG9yIHdyaXRlciBidXQgbm90IGJvdGggYXQgdGhlIHNhbWUgdGltZS4KKyAqIFdoZW4gZG9uZSByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIGZhY3Rvcnkgd2lsbCBjbG9zZSB0aGUgaW5wdXQgb3Igb3V0cHV0CisgKiBzdHJlYW1zIGFuZCBtYXJrIHRoZSBmYWN0b3J5IGFzIGNsb3NlZC4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSBpdCBhZnRlcgorICogdGhhdC4gPEJSPgorICogVG8gZm9yY2UgYSBjbGVhbnVwLCBjYWxsIGNsZWFudXAoKSBmcm9tIHRoZSBjYWxsaW5nIG9iamVjdC4gPEJSPgorICogVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkIHNhZmUuCisgKiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgRmlsZU1lc3NhZ2VGYWN0b3J5IHsKKyAgICAvKi0tU3RhdGljIFZhcmlhYmxlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkKKyAgICAgICAgICAgIC5nZXRMb2coRmlsZU1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZSByZWFkIGZyb20gZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURfU0laRSA9IDEwMjQgKiAxMDsgLy8xMGtiCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSB0aGF0IHdlIGFyZSByZWFkaW5nL3dyaXRpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBmaWxlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRydWUgbWVhbnMgdGhhdCB3ZSBhcmUgd3JpdGluZyB3aXRoIHRoaXMgZmFjdG9yeS4gRmFsc2UgbWVhbnMgdGhhdCB3ZSBhcmUKKyAgICAgKiByZWFkaW5nIHdpdGggdGhpcyBmYWN0b3J5CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gb3BlbkZvcldyaXRlOworCisgICAgLyoqCisgICAgICogT25jZSB0aGUgZmFjdG9yeSBpcyB1c2VkLCBpdCBjYW4gbm90IGJlIHJldXNlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFdoZW4gb3BlbkZvcldyaXRlPWZhbHNlLCB0aGUgaW5wdXQgc3RyZWFtIGlzIGhlbGQgYnkgdGhpcyB2YXJpYWJsZQorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlSW5wdXRTdHJlYW0gaW47CisKKyAgICAvKioKKyAgICAgKiBXaGVuIG9wZW5Gb3JXcml0ZT10cnVlLCB0aGUgb3V0cHV0IHN0cmVhbSBpcyBoZWxkIGJ5IHRoaXMgdmFyaWFibGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZU91dHB1dFN0cmVhbSBvdXQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIG1lc3NhZ2VzIHdlIGhhdmUgcmVhZCBvciB3cml0dGVuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBuck9mTWVzc2FnZXNQcm9jZXNzZWQgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIHRvdGFsIHNpemUgb2YgdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBzaXplID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgcGFja2V0cyB0aGF0IHdlIHNwbGl0IHRoaXMgZmlsZSBpbnRvCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgdG90YWxOck9mTWVzc2FnZXMgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGJ5dGVzIHRoYXQgd2UgaG9sZCB0aGUgZGF0YSBpbiwgbm90IHRocmVhZCBzYWZlLgorICAgICAqLworICAgIHByb3RlY3RlZCBieXRlW10gZGF0YSA9IG5ldyBieXRlW1JFQURfU0laRV07CisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLCBlaXRoZXIgaW5zdGFudGlhdGVzIGEgZmFjdG9yeSB0byByZWFkIG9yIHdyaXRlLiA8QlI+CisgICAgICogV2hlbiBvcGVuRm9yV3JpdGU9PXRydWUsIHRoZW4gYSB0aGUgZmlsZSwgZiwgd2lsbCBiZSBjcmVhdGVkIGFuZCBhbgorICAgICAqIG91dHB1dCBzdHJlYW0gaXMgb3BlbmVkIHRvIHdyaXRlIHRvIGl0LiA8QlI+CisgICAgICogV2hlbiBvcGVuRm9yV3JpdGU9PWZhbHNlLCBhbiBpbnB1dCBzdHJlYW0gaXMgb3BlbmVkLCB0aGUgZmlsZSBoYXMgdG8KKyAgICAgKiBleGlzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZgorICAgICAqICAgICAgICAgICAgRmlsZSAtIHRoZSBmaWxlIHRvIGJlIHJlYWQvd3JpdHRlbgorICAgICAqIEBwYXJhbSBvcGVuRm9yV3JpdGUKKyAgICAgKiAgICAgICAgICAgIGJvb2xlYW4gLSB0cnVlIG1lYW5zIHdlIGFyZSB3cml0aW5nIHRvIHRoZSBmaWxlLCBmYWxzZSBtZWFucworICAgICAqICAgICAgICAgICAgd2UgYXJlIHJlYWRpbmcgZnJvbSB0aGUgZmlsZQorICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZmlsZSB0byBiZSByZWFkIGRvZXNuJ3QgZXhpc3QKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3lzdGVtIGZhaWxzIHRvIG9wZW4gaW5wdXQvb3V0cHV0IHN0cmVhbXMgdG8gdGhlIGZpbGUKKyAgICAgKiAgICAgICAgICAgICBvciBpZiBpdCBmYWlscyB0byBjcmVhdGUgdGhlIGZpbGUgdG8gYmUgd3JpdHRlbiB0by4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGVNZXNzYWdlRmFjdG9yeShGaWxlIGYsIGJvb2xlYW4gb3BlbkZvcldyaXRlKQorICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLmZpbGUgPSBmOworICAgICAgICB0aGlzLm9wZW5Gb3JXcml0ZSA9IG9wZW5Gb3JXcml0ZTsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJvcGVuIGZpbGUgIiArIGYgKyAiIHdyaXRlICIgKyBvcGVuRm9yV3JpdGUpOworICAgICAgICBpZiAob3BlbkZvcldyaXRlKSB7CisgICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpCisgICAgICAgICAgICAgICAgZmlsZS5jcmVhdGVOZXdGaWxlKCk7CisgICAgICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemUgPSBmaWxlLmxlbmd0aCgpOworICAgICAgICAgICAgdG90YWxOck9mTWVzc2FnZXMgPSAoc2l6ZSAvIFJFQURfU0laRSkgKyAxOworICAgICAgICAgICAgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOworICAgICAgICB9Ly9lbmQgaWYKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBmYWN0b3J5IHRvIHJlYWQgb3Igd3JpdGUgZnJvbSBhIGZpbGUuIFdoZW4gb3BlbmluZyBmb3IgcmVhZCwKKyAgICAgKiB0aGUgcmVhZE1lc3NhZ2UgY2FuIGJlIGludm9rZWQsIGFuZCB3aGVuIG9wZW5pbmcgZm9yIHdyaXRlIHRoZQorICAgICAqIHdyaXRlTWVzc2FnZSBjYW4gYmUgaW52b2tlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZgorICAgICAqICAgICAgICAgICAgRmlsZSAtIHRoZSBmaWxlIHRvIGJlIHJlYWQgb3Igd3JpdHRlbgorICAgICAqIEBwYXJhbSBvcGVuRm9yV3JpdGUKKyAgICAgKiAgICAgICAgICAgIGJvb2xlYW4gLSB0cnVlLCBtZWFucyB3ZSBhcmUgd3JpdGluZyB0byB0aGUgZmlsZSwgZmFsc2UgbWVhbnMKKyAgICAgKiAgICAgICAgICAgIHdlIGFyZSByZWFkaW5nIGZyb20gaXQKKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiAtCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGZpbGUgdG8gYmUgcmVhZCBkb2Vzbid0IGV4aXN0CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAtCisgICAgICogICAgICAgICAgICAgaWYgaXQgZmFpbHMgdG8gY3JlYXRlIHRoZSBmaWxlIHRoYXQgaXMgdG8gYmUgd3JpdHRlbgorICAgICAqIEByZXR1cm4gRmlsZU1lc3NhZ2VGYWN0b3J5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWxlTWVzc2FnZUZhY3RvcnkgZ2V0SW5zdGFuY2UoRmlsZSBmLCBib29sZWFuIG9wZW5Gb3JXcml0ZSkKKyAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlTWVzc2FnZUZhY3RvcnkoZiwgb3BlbkZvcldyaXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBmaWxlIGRhdGEgaW50byB0aGUgZmlsZSBtZXNzYWdlIGFuZCBzZXRzIHRoZSBzaXplLCB0b3RhbExlbmd0aCwKKyAgICAgKiB0b3RhbE5yT2ZNc2dzIGFuZCB0aGUgbWVzc2FnZSBudW1iZXIgPEJSPgorICAgICAqIElmIEVPRiBpcyByZWFjaGVkLCB0aGUgZmFjdG9yeSByZXR1cm5zIG51bGwsIGFuZCBjbG9zZXMgaXRzZWxmLCBvdGhlcndpc2UKKyAgICAgKiB0aGUgc2FtZSBtZXNzYWdlIGlzIHJldHVybmVkIGFzIHdhcyBwYXNzZWQgaW4uIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG5vdAorICAgICAqIG1vcmUgbWVtb3J5IGlzIGV2ZXIgdXNlZC4gVG8gcmVtZW1iZXIsIG5laXRoZXIgdGhlIGZpbGUgbWVzc2FnZSBvciB0aGUKKyAgICAgKiBmYWN0b3J5IGFyZSB0aHJlYWQgc2FmZS4gZG9udCBoYW5kIG9mZiB0aGUgbWVzc2FnZSB0byBvbmUgdGhyZWFkIGFuZCByZWFkCisgICAgICogdGhlIHNhbWUgd2l0aCBhbm90aGVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmCisgICAgICogICAgICAgICAgICBGaWxlTWVzc2FnZSAtIHRoZSBtZXNzYWdlIHRvIGJlIHBvcHVsYXRlZCB3aXRoIGZpbGUgZGF0YQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZmFjdG9yeSBpcyBmb3Igd3JpdGluZyBvciBpcyBjbG9zZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiBhIGZpbGUgcmVhZCBleGNlcHRpb24gb2NjdXJzCisgICAgICogQHJldHVybiBGaWxlTWVzc2FnZSAtIHJldHVybnMgdGhlIHNhbWUgbWVzc2FnZSBwYXNzZWQgaW4gYXMgYSBwYXJhbWV0ZXIsCisgICAgICogICAgICAgICBvciBudWxsIGlmIEVPRgorICAgICAqLworICAgIHB1YmxpYyBGaWxlTWVzc2FnZSByZWFkTWVzc2FnZShGaWxlTWVzc2FnZSBmKQorICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBjaGVja1N0YXRlKGZhbHNlKTsKKyAgICAgICAgaW50IGxlbmd0aCA9IGluLnJlYWQoZGF0YSk7CisgICAgICAgIGlmIChsZW5ndGggPT0gLTEpIHsKKyAgICAgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZi5zZXREYXRhKGRhdGEsIGxlbmd0aCk7CisgICAgICAgICAgICBmLnNldFRvdGFsTGVuZ3RoKHNpemUpOworICAgICAgICAgICAgZi5zZXRUb3RhbE5yT2ZNc2dzKHRvdGFsTnJPZk1lc3NhZ2VzKTsKKyAgICAgICAgICAgIGYuc2V0TWVzc2FnZU51bWJlcigrK25yT2ZNZXNzYWdlc1Byb2Nlc3NlZCk7CisgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgfS8vZW5kIGlmCisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgbWVzc2FnZSB0byBmaWxlLiBJZiAobXNnLmdldE1lc3NhZ2VOdW1iZXIoKSA9PQorICAgICAqIG1zZy5nZXRUb3RhbE5yT2ZNc2dzKCkpIHRoZSBvdXRwdXQgc3RyZWFtIHdpbGwgYmUgY2xvc2VkIGFmdGVyIHdyaXRpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgRmlsZU1lc3NhZ2UgLSBtZXNzYWdlIGNvbnRhaW5pbmcgZGF0YSB0byBiZSB3cml0dGVuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gLQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmYWN0b3J5IGlzIG9wZW5lZCBmb3IgcmVhZCBvciBjbG9zZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiBhIGZpbGUgd3JpdGUgZXJyb3Igb2NjdXJzCisgICAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgaXMgY29tcGxldGUgYW5kIG91dHB1dHN0cmVhbSBpcyBjbG9zZWQsCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gd3JpdGVNZXNzYWdlKEZpbGVNZXNzYWdlIG1zZykKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFvcGVuRm9yV3JpdGUpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgd3JpdGUgbWVzc2FnZSwgdGhpcyBmYWN0b3J5IGlzIHJlYWRpbmcuIik7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVzc2FnZSAiICsgbXNnICsgIiBkYXRhICIgKyBtc2cuZ2V0RGF0YSgpCisgICAgICAgICAgICAgICAgICAgICsgIiBkYXRhIGxlbmd0aCAiICsgbXNnLmdldERhdGFMZW5ndGgoKSArICIgb3V0ICIgKyBvdXQpOworICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC53cml0ZShtc2cuZ2V0RGF0YSgpLCAwLCBtc2cuZ2V0RGF0YUxlbmd0aCgpKTsKKyAgICAgICAgICAgIG5yT2ZNZXNzYWdlc1Byb2Nlc3NlZCsrOworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgICAgICBpZiAobXNnLmdldE1lc3NhZ2VOdW1iZXIoKSA9PSBtc2cuZ2V0VG90YWxOck9mTXNncygpKSB7CisgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgY2xlYW51cCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cud2FybigiUmVjZWl2ZSBNZXNzYWdlIGFnYWluIC0tIFNlbmRlciBBY3RUaW1lb3V0IHRvIHNob3J0IFsgcGF0aDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5nZXRDb250ZXh0UGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3YXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtc2cuZ2V0RmlsZU5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGF0YTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5nZXREYXRhKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRhdGEgbGVuZ3RoOiAiICsgbXNnLmdldERhdGFMZW5ndGgoKSArICIgXSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Ly93cml0ZU1lc3NhZ2UKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgZmFjdG9yeSwgaXRzIHN0cmVhbXMgYW5kIHNldHMgYWxsIGl0cyByZWZlcmVuY2VzIHRvIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgeworICAgICAgICBpZiAoaW4gIT0gbnVsbCkKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKG91dCAhPSBudWxsKQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaW4gPSBudWxsOworICAgICAgICBvdXQgPSBudWxsOworICAgICAgICBzaXplID0gMDsKKyAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgZGF0YSA9IG51bGw7CisgICAgICAgIG5yT2ZNZXNzYWdlc1Byb2Nlc3NlZCA9IDA7CisgICAgICAgIHRvdGFsTnJPZk1lc3NhZ2VzID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGZhY3RvcnkgaXMgYWJsZSB0byBwZXJmb3JtIHRoZSBmdW5jdGlvbiBpdCBpcworICAgICAqIGFza2VkIHRvIGRvLiBJbnZva2VkIGJ5IHJlYWRNZXNzYWdlL3dyaXRlTWVzc2FnZSBiZWZvcmUgdGhvc2UgbWV0aG9kcworICAgICAqIHByb2NlZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG9wZW5Gb3JXcml0ZQorICAgICAqICAgICAgICAgICAgYm9vbGVhbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tTdGF0ZShib29sZWFuIG9wZW5Gb3JXcml0ZSkKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBpZiAodGhpcy5vcGVuRm9yV3JpdGUgIT0gb3BlbkZvcldyaXRlKSB7CisgICAgICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgICAgICBpZiAob3BlbkZvcldyaXRlKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgd3JpdGUgbWVzc2FnZSwgdGhpcyBmYWN0b3J5IGlzIHJlYWRpbmcuIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCByZWFkIG1lc3NhZ2UsIHRoaXMgZmFjdG9yeSBpcyB3cml0aW5nLiIpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmNsb3NlZCkgeworICAgICAgICAgICAgY2xlYW51cCgpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmFjdG9yeSBoYXMgYmVlbiBjbG9zZWQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGFtcGxlIHVzYWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICogICAgICAgICAgICBTdHJpbmdbXSwgYXJnc1swXSAtIHJlYWQgZnJvbSBmaWxlbmFtZSwgYXJnc1sxXSB3cml0ZSB0bworICAgICAqICAgICAgICAgICAgZmlsZW5hbWUKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN5c3RlbS5vdXQKKyAgICAgICAgICAgICAgICAucHJpbnRsbigiVXNhZ2U6IEZpbGVNZXNzYWdlRmFjdG9yeSBmaWxlVG9CZVJlYWQgZmlsZVRvQmVXcml0dGVuIik7CisgICAgICAgIFN5c3RlbS5vdXQKKyAgICAgICAgICAgICAgICAucHJpbnRsbigiVXNhZ2U6IFRoaXMgd2lsbCBtYWtlIGEgY29weSBvZiB0aGUgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0iKTsKKyAgICAgICAgRmlsZU1lc3NhZ2VGYWN0b3J5IHJlYWQgPSBnZXRJbnN0YW5jZShuZXcgRmlsZShhcmdzWzBdKSwgZmFsc2UpOworICAgICAgICBGaWxlTWVzc2FnZUZhY3Rvcnkgd3JpdGUgPSBnZXRJbnN0YW5jZShuZXcgRmlsZShhcmdzWzFdKSwgdHJ1ZSk7CisgICAgICAgIEZpbGVNZXNzYWdlIG1zZyA9IG5ldyBGaWxlTWVzc2FnZShudWxsLCBhcmdzWzBdLCBhcmdzWzBdKTsKKyAgICAgICAgbXNnID0gcmVhZC5yZWFkTWVzc2FnZShtc2cpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGVjdGluZyB0byB3cml0ZSAiICsgbXNnLmdldFRvdGFsTnJPZk1zZ3MoKQorICAgICAgICAgICAgICAgICsgIiBtZXNzYWdlcy4iKTsKKyAgICAgICAgaW50IGNudCA9IDA7CisgICAgICAgIHdoaWxlIChtc2cgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGUud3JpdGVNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICBjbnQrKzsKKyAgICAgICAgICAgIG1zZyA9IHJlYWQucmVhZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgfS8vd2hpbGUKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBY3R1YWxseSB3cm90ZSAiICsgY250ICsgIiBtZXNzYWdlcy4iKTsKKyAgICB9Ly8vbWFpbgorCisgICAgcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2RlcGxveS9VbmRlcGxveU1lc3NhZ2UuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9kZXBsb3kvVW5kZXBsb3lNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwYzc3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9kZXBsb3kvVW5kZXBsb3lNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuZGVwbG95OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXI7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitwdWJsaWMgY2xhc3MgVW5kZXBsb3lNZXNzYWdlIGltcGxlbWVudHMgQ2x1c3Rlck1lc3NhZ2UsU2VyaWFsaXphYmxlIHsKKyAgICBwcml2YXRlIE1lbWJlciBhZGRyZXNzOworICAgIHByaXZhdGUgbG9uZyB0aW1lc3RhbXA7CisgICAgcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dFBhdGg7CisgICAgcHJpdmF0ZSBib29sZWFuIHVuZGVwbG95OworICAgIHByaXZhdGUgaW50IHJlc2VuZCA9IENsdXN0ZXJNZXNzYWdlLkZMQUdfREVGQVVMVCA7CisgICAgcHJpdmF0ZSBpbnQgY29tcHJlc3MgPSBDbHVzdGVyTWVzc2FnZS5GTEFHX0RFRkFVTFQgOworCisgICAgcHVibGljIFVuZGVwbG95TWVzc2FnZSgpIHt9IC8vZm9yIHNlcmlhbGl6YXRpb24KKyAgICBwdWJsaWMgVW5kZXBsb3lNZXNzYWdlKE1lbWJlciBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVuZGVwbG95KSB7CisgICAgICAgIHRoaXMuYWRkcmVzcyAgPSBhZGRyZXNzOworICAgICAgICB0aGlzLnRpbWVzdGFtcD0gdGltZXN0YW1wOworICAgICAgICB0aGlzLnVuZGVwbG95ID0gdW5kZXBsb3k7CisgICAgICAgIHRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKyAgICAgICAgdGhpcy51bmRlcGxveSA9IHVuZGVwbG95OworICAgICAgICB0aGlzLmNvbnRleHRQYXRoID0gY29udGV4dFBhdGg7CisgICAgfQorCisgICAgcHVibGljIE1lbWJlciBnZXRBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gYWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKE1lbWJlciBhZGRyZXNzKSB7CisgICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCkgeworICAgICAgICByZXR1cm4gdGltZXN0YW1wOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChsb25nIHRpbWVzdGFtcCkgeworICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworICAgICAgICByZXR1cm4gdW5pcXVlSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisgICAgICAgIHRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQYXRoKCkgeworICAgICAgICByZXR1cm4gY29udGV4dFBhdGg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dFBhdGgoU3RyaW5nIGNvbnRleHRQYXRoKSB7CisgICAgICAgIHRoaXMuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRVbmRlcGxveSgpIHsKKyAgICAgICAgcmV0dXJuIHVuZGVwbG95OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVuZGVwbG95KGJvb2xlYW4gdW5kZXBsb3kpIHsKKyAgICAgICAgdGhpcy51bmRlcGxveSA9IHVuZGVwbG95OworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbXByZXNzLgorICAgICAqIEBzaW5jZSA1LjUuMTAgCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb21wcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIGNvbXByZXNzOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY29tcHJlc3MgVGhlIGNvbXByZXNzIHRvIHNldC4KKyAgICAgKiBAc2luY2UgNS41LjEwCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcHJlc3MoaW50IGNvbXByZXNzKSB7CisgICAgICAgIHRoaXMuY29tcHJlc3MgPSBjb21wcmVzczsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByZXNlbmQuCisgICAgICogQHNpbmNlIDUuNS4xMAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVzZW5kKCkgeworICAgICAgICByZXR1cm4gcmVzZW5kOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcmVzZW5kIFRoZSByZXNlbmQgdG8gc2V0LgorICAgICAqIEBzaW5jZSA1LjUuMTAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNlbmQoaW50IHJlc2VuZCkgeworICAgICAgICB0aGlzLnJlc2VuZCA9IHJlc2VuZDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9kZXBsb3kvV2FyV2F0Y2hlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2RlcGxveS9XYXJXYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzYTcwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9kZXBsb3kvV2FyV2F0Y2hlci5qYXZhCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuZGVwbG95OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIDxwPgorICogVGhlIDxiPldhcldhdGNoZXIgPC9iPiB3YXRjaGVzIHRoZSBkZXBsb3lEaXIgZm9yIGNoYW5nZXMgbWFkZSB0byB0aGUKKyAqIGRpcmVjdG9yeSAoYWRkaW5nIG5ldyBXQVIgZmlsZXMtPmRlcGxveSBvciByZW1vdmUgV0FSIGZpbGVzLT51bmRlcGxveSkgQW5kCisgKiBub3RpZmllcyBhIGxpc3RlbmVyIG9mIHRoZSBjaGFuZ2VzIG1hZGUKKyAqIDwvcD4KKyAqIAorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gMS4xCisgKi8KKworcHVibGljIGNsYXNzIFdhcldhdGNoZXIgeworCisgICAgLyotLVN0YXRpYyBWYXJpYWJsZXMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5CisgICAgICAgICAgICAuZ2V0TG9nKFdhcldhdGNoZXIuY2xhc3MpOworCisgICAgLyotLUluc3RhbmNlIFZhcmlhYmxlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKioKKyAgICAgKiBEaXJlY3RvcnkgdG8gd2F0Y2ggZm9yIHdhciBmaWxlcworICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIHdhdGNoRGlyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFBhcmVudCB0byBiZSBub3RpZmllZCBvZiBjaGFuZ2VzCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDdXJyZW50bHkgZGVwbG95ZWQgZmlsZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFwIGN1cnJlbnRTdGF0dXMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgLyotLUNvbnN0cnVjdG9yLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIHB1YmxpYyBXYXJXYXRjaGVyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBXYXJXYXRjaGVyKEZpbGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciwgRmlsZSB3YXRjaERpcikgeworICAgICAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIHRoaXMud2F0Y2hEaXIgPSB3YXRjaERpcjsKKyAgICB9CisKKyAgICAvKi0tTG9naWMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoqCisgICAgICogY2hlY2sgZm9yIG1vZGlmaWNhdGlvbiBhbmQgc2VuZCBub3RpZmNhdGlvbiB0byBsaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoZWNrKCkgeworICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5pbmZvKCJjaGVjayBjbHVzdGVyIHdhcnMgYXQgIiArIHdhdGNoRGlyKTsKKyAgICAgICAgRmlsZVtdIGxpc3QgPSB3YXRjaERpci5saXN0RmlsZXMobmV3IFdhckZpbHRlcigpKTsKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkKKyAgICAgICAgICAgIGxpc3QgPSBuZXcgRmlsZVswXTsKKyAgICAgICAgLy9maXJzdCBtYWtlIHN1cmUgYWxsIHRoZSBmaWxlcyBhcmUgbGlzdGVkIGluIG91ciBjdXJyZW50IHN0YXR1cworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFkZFdhckluZm8obGlzdFtpXSk7CisgICAgICAgIH0KKworICAgICAgICAvL2NoZWNrIGFsbCB0aGUgc3RhdHVzIGNvZGVzIGFuZCB1cGRhdGUgdGhlIEZhcm1EZXBsb3llcgorICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjdXJyZW50U3RhdHVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKKyAgICAgICAgICAgIFdhckluZm8gaW5mbyA9IChXYXJJbmZvKSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaW50IGNoZWNrID0gaW5mby5jaGVjaygpOworICAgICAgICAgICAgaWYgKGNoZWNrID09IDEpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5maWxlTW9kaWZpZWQoaW5mby5nZXRXYXIoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrID09IC0xKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuZmlsZVJlbW92ZWQoaW5mby5nZXRXYXIoKSk7CisgICAgICAgICAgICAgICAgLy9ubyBuZWVkIHRvIGtlZXAgaW4gbWVtb3J5CisgICAgICAgICAgICAgICAgY3VycmVudFN0YXR1cy5yZW1vdmUoaW5mby5nZXRXYXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBjbHVzdGVyIHdhciB0byB0aGUgd2F0Y2hlciBzdGF0ZQorICAgICAqIEBwYXJhbSB3YXJmaWxlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkV2FySW5mbyhGaWxlIHdhcmZpbGUpIHsKKyAgICAgICAgV2FySW5mbyBpbmZvID0gKFdhckluZm8pIGN1cnJlbnRTdGF0dXMuZ2V0KHdhcmZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICBpbmZvID0gbmV3IFdhckluZm8od2FyZmlsZSk7CisgICAgICAgICAgICBpbmZvLnNldExhc3RTdGF0ZSgtMSk7IC8vYXNzdW1lIGZpbGUgaXMgbm9uIGV4aXN0ZW50CisgICAgICAgICAgICBjdXJyZW50U3RhdHVzLnB1dCh3YXJmaWxlLmdldEFic29sdXRlUGF0aCgpLCBpbmZvKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNsZWFyIHdhdGNoZXIgc3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgY3VycmVudFN0YXR1cy5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2F0Y2hEaXIuCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0V2F0Y2hEaXIoKSB7CisgICAgICAgIHJldHVybiB3YXRjaERpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gd2F0Y2hEaXIKKyAgICAgKiAgICAgICAgICAgIFRoZSB3YXRjaERpciB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2F0Y2hEaXIoRmlsZSB3YXRjaERpcikgeworICAgICAgICB0aGlzLndhdGNoRGlyID0gd2F0Y2hEaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsaXN0ZW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZUNoYW5nZUxpc3RlbmVyIGdldExpc3RlbmVyKCkgeworICAgICAgICByZXR1cm4gbGlzdGVuZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICBUaGUgbGlzdGVuZXIgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RlbmVyKEZpbGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCisgICAgLyotLUlubmVyIGNsYXNzZXMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qKgorICAgICAqIEZpbGUgbmFtZSBmaWx0ZXIgZm9yIHdhciBmaWxlcworICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBXYXJGaWx0ZXIgaW1wbGVtZW50cyBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoIi53YXIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbGUgaW5mb3JtYXRpb24gb24gZXhpc3RpbmcgV0FSIGZpbGVzCisgICAgICovCisgICAgcHJvdGVjdGVkIGNsYXNzIFdhckluZm8geworICAgICAgICBwcm90ZWN0ZWQgRmlsZSB3YXIgPSBudWxsOworCisgICAgICAgIHByb3RlY3RlZCBsb25nIGxhc3RDaGVja2VkID0gMDsKKworICAgICAgICBwcm90ZWN0ZWQgbG9uZyBsYXN0U3RhdGUgPSAwOworCisgICAgICAgIHB1YmxpYyBXYXJJbmZvKEZpbGUgd2FyKSB7CisgICAgICAgICAgICB0aGlzLndhciA9IHdhcjsKKyAgICAgICAgICAgIHRoaXMubGFzdENoZWNrZWQgPSB3YXIubGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICBpZiAoIXdhci5leGlzdHMoKSkKKyAgICAgICAgICAgICAgICBsYXN0U3RhdGUgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG1vZGlmaWVkKCkgeworICAgICAgICAgICAgcmV0dXJuIHdhci5leGlzdHMoKSAmJiB3YXIubGFzdE1vZGlmaWVkKCkgPiBsYXN0Q2hlY2tlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKKyAgICAgICAgICAgIHJldHVybiB3YXIuZXhpc3RzKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyAxIGlmIHRoZSBmaWxlIGhhcyBiZWVuIGFkZGVkL21vZGlmaWVkLCAwIGlmIHRoZSBmaWxlIGlzCisgICAgICAgICAqIHVuY2hhbmdlZCBhbmQgLTEgaWYgdGhlIGZpbGUgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBpbnQgMT1maWxlIGFkZGVkOyAwPXVuY2hhbmdlZDsgLTE9ZmlsZSByZW1vdmVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGNoZWNrKCkgeworICAgICAgICAgICAgLy9maWxlIHVuY2hhbmdlZCBieSBkZWZhdWx0CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgICAgICAgICAgaWYgKG1vZGlmaWVkKCkpIHsKKyAgICAgICAgICAgICAgICAvL2ZpbGUgaGFzIGNoYW5nZWQgLSB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAxOworICAgICAgICAgICAgICAgIGxhc3RTdGF0ZSA9IHJlc3VsdDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKCFleGlzdHMoKSkgJiYgKCEobGFzdFN0YXRlID09IC0xKSkpIHsKKyAgICAgICAgICAgICAgICAvL2ZpbGUgd2FzIHJlbW92ZWQKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTsKKyAgICAgICAgICAgICAgICBsYXN0U3RhdGUgPSByZXN1bHQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChsYXN0U3RhdGUgPT0gLTEpICYmIGV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgLy9maWxlIHdhcyBhZGRlZAorICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgICAgICAgICAgbGFzdFN0YXRlID0gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5sYXN0Q2hlY2tlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWxlIGdldFdhcigpIHsKKyAgICAgICAgICAgIHJldHVybiB3YXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIHdhci5nZXRBYnNvbHV0ZVBhdGgoKS5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgV2FySW5mbykgeworICAgICAgICAgICAgICAgIFdhckluZm8gd28gPSAoV2FySW5mbykgb3RoZXI7CisgICAgICAgICAgICAgICAgcmV0dXJuIHdvLmdldFdhcigpLmVxdWFscyhnZXRXYXIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHNldExhc3RTdGF0ZShpbnQgbGFzdFN0YXRlKSB7CisgICAgICAgICAgICB0aGlzLmxhc3RTdGF0ZSA9IGxhc3RTdGF0ZTsKKyAgICAgICAgfQorCisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2lvL0xpc3RlbkNhbGxiYWNrLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvaW8vTGlzdGVuQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDAyZDhkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2lvL0xpc3RlbkNhbGxiYWNrLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmlvOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5DbHVzdGVyRGF0YSA7CisKKy8qKgorICogVGhlIGxpc3RlbiBjYWxsYmFjayBpbnRlcmZhY2UgaXMgdXNlZCBieSB0aGUgcmVwbGljYXRpb24gc3lzdGVtCisgKiB3aGVuIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQuIFRoZSBpbnRlcmZhY2UgZG9lcyBub3QgY2FyZSBhYm91dAorICogb2JqZWN0cyBhbmQgbWFyc2hhbGxpbmcgYW5kIGp1c3QgcGFzc2VzIHRoZSBieXRlcyBzdHJhaWdodCB0aHJvdWdoLgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTGlzdGVuQ2FsbGJhY2sKK3sKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIG9uIHRoZSBjYWxsYmFjayBvYmplY3QgdG8gbm90aWZ5IGl0IHRoYXQgbmV3IGRhdGEgaGFzCisgICAgICogYmVlbiByZWNlaXZlZCBmcm9tIG9uZSBvZiB0aGUgY2x1c3RlciBub2Rlcy4KKyAgICAgKiBAcGFyYW0gZGF0YSAtIHRoZSBtZXNzYWdlIGJ5dGVzIHJlY2VpdmVkIGZyb20gdGhlIGNsdXN0ZXIvcmVwbGljYXRpb24gc3lzdGVtCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VEYXRhUmVjZWl2ZWQoQ2x1c3RlckRhdGEgZGF0YSk7CisgICAgIAorICAgIC8qKiByZWNlaXZlciBtdXN0IGJlIHNlbmQgYWNrCisgICAgICAqLworICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbmRBY2soKSA7CisgICAgIAorICAgICAvKiogc2VuZCBhY2sKKyAgICAgICoKKyAgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHNlbmRBY2soKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiA7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvaW8vT2JqZWN0UmVhZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvaW8vT2JqZWN0UmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkYjk4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9pby9PYmplY3RSZWFkZXIuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5pbzsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuQ2x1c3RlckRhdGE7CisKKy8qKgorICogVGhlIG9iamVjdCByZWFkZXIgb2JqZWN0IGlzIGFuIG9iamVjdCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKKyAqIGphdmEubmlvIFRDUCBtZXNzYWdlcy4gVGhpcyBvYmplY3Qgc3RvcmVzIHRoZSBtZXNzYWdlIGJ5dGVzIGluIGEKKyAqIDxjb2RlPlhCeXRlQnVmZmVyPC9jb2RlPiB1bnRpbCBhIGZ1bGwgcGFja2FnZSBoYXMgYmVlbiByZWNlaXZlZC4KKyAqIFdoZW4gYSBmdWxsIHBhY2thZ2UgaGFzIGJlZW4gcmVjZWl2ZWQsIHRoZSBhcHBlbmQgbWV0aG9kIHdpbGwgY2FsbCBtZXNzYWdlRGF0YVJlY2VpdmVkCisgKiBvbiB0aGUgY2FsbGJhY2sgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdCByZWFkZXIuPEJSPgorICogVGhpcyBvYmplY3QgdXNlcyBhbiBYQnl0ZUJ1ZmZlciB3aGljaCBpcyBhbiBleHRlbmRhYmxlIG9iamVjdCBidWZmZXIgdGhhdCBhbHNvIGFsbG93cworICogZm9yIG1lc3NhZ2UgZW5jb2RpbmcgYW5kIGRlY29kaW5nLgorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgT2JqZWN0UmVhZGVyIHsKKworICAgIHByaXZhdGUgU29ja2V0Q2hhbm5lbCBjaGFubmVsOworCisgICAgcHJpdmF0ZSBTZWxlY3RvciBzZWxlY3RvcjsKKworICAgIHByaXZhdGUgTGlzdGVuQ2FsbGJhY2sgY2FsbGJhY2s7CisKKyAgICBwcml2YXRlIFhCeXRlQnVmZmVyIGJ1ZmZlcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBYQnl0ZUJ1ZmZlciBhbmQgc3RvcmUgcGFyYW1ldGVyCisgICAgICogQHBhcmFtIGNoYW5uZWwKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0UmVhZGVyKFNvY2tldENoYW5uZWwgY2hhbm5lbCwgU2VsZWN0b3Igc2VsZWN0b3IsIExpc3RlbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7CisgICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBYQnl0ZUJ1ZmZlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCB0aGUgY3VycmVudCBTaW1wbGVUY3BDbHVzdGVyCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdGVuQ2FsbGJhY2sgZ2V0Q2FsbGJhY2soKSB7CisgICAgICAgIHJldHVybiBjYWxsYmFjazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdW5kZXJseWluZyBOSU8gY2hhbm5lbAorICAgICAqIEByZXR1cm4gVGhlIHNvY2tldAorICAgICAqLworICAgIHB1YmxpYyBTb2NrZXRDaGFubmVsIGdldENoYW5uZWwoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNoYW5uZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIG5ldyBieXRlcyB0byBidWZmZXIuIAorICAgICAqIEBzZWUgWEJ5dGVCdWZmZXIjY291bnRQYWNrYWdlcygpCisgICAgICogQHBhcmFtIGRhdGEgbmV3IHRyYW5zZmVyIGJ1ZmZlcgorICAgICAqIEBwYXJhbSBvZmYgb2Zmc2V0CisgICAgICogQHBhcmFtIGxlbiBsZW5ndGggaW4gYnVmZmVyCisgICAgICogQHJldHVybiBudW1iZXIgb2YgbWVzc2FnZXMgdGhhdCBzZW5kZWQgdG8gY2FsbGJhY2sKKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICAgcHVibGljIGludCBhcHBlbmQoYnl0ZVtdIGRhdGEsaW50IG9mZixpbnQgbGVuKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZGF0YSxvZmYsbGVuKTsKKyAgICAgICAgaW50IHBrZ0NudCA9IGJ1ZmZlci5jb3VudFBhY2thZ2VzKCk7CisgICAgICAgIHJldHVybiBwa2dDbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBidWZmZXIgdG8gY2x1c3RlciBsaXN0ZW5lciAoY2FsbGJhY2spLgorICAgICAqIElzIG1lc3NhZ2UgY29tcGxldGUgcmVjZWl2ZXIgc2VuZCBtZXNzYWdlIHRvIGNhbGxiYWNrPworICAgICAqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLkNsdXN0ZXJSZWNlaXZlckJhc2UjbWVzc2FnZURhdGFSZWNlaXZlZChDbHVzdGVyRGF0YSkKKyAgICAgKiBAc2VlIFhCeXRlQnVmZmVyI2RvZXNQYWNrYWdlRXhpc3QoKQorICAgICAqIEBzZWUgWEJ5dGVCdWZmZXIjZXh0cmFjdFBhY2thZ2UoYm9vbGVhbikKKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIHJlY2VpdmVkIHBhY2thZ2VzL21lc3NhZ2VzCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGludCBleGVjdXRlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBpbnQgcGtnQ250ID0gMDsKKyAgICAgICAgYm9vbGVhbiBwa2dFeGlzdHMgPSBidWZmZXIuZG9lc1BhY2thZ2VFeGlzdCgpOworICAgICAgICB3aGlsZSAoIHBrZ0V4aXN0cyApIHsKKyAgICAgICAgICAgIENsdXN0ZXJEYXRhIGRhdGEgPSBidWZmZXIuZXh0cmFjdFBhY2thZ2UodHJ1ZSk7CisgICAgICAgICAgICBnZXRDYWxsYmFjaygpLm1lc3NhZ2VEYXRhUmVjZWl2ZWQoZGF0YSk7CisgICAgICAgICAgICBwa2dDbnQrKzsKKyAgICAgICAgICAgIHBrZ0V4aXN0cyA9IGJ1ZmZlci5kb2VzUGFja2FnZUV4aXN0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBrZ0NudDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogV3JpdGUgQWNrIHRvIHNlbmRlcgorICAgICAqIEBwYXJhbSBidWYKKyAgICAgKiBAcmV0dXJuIFRoZSBieXRlcyB3cml0dGVuIGNvdW50CisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGludCB3cml0ZShCeXRlQnVmZmVyIGJ1ZikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbCgpLndyaXRlKGJ1Zik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvaW8vU29ja2V0T2JqZWN0UmVhZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvaW8vU29ja2V0T2JqZWN0UmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyYWRiNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9pby9Tb2NrZXRPYmplY3RSZWFkZXIuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmlvOworCisKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLkNsdXN0ZXJEYXRhOworCisvKioKKyAqIFRoZSBvYmplY3QgcmVhZGVyIG9iamVjdCBpcyBhbiBvYmplY3QgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCisgKiBqYXZhLm5pbyBUQ1AgbWVzc2FnZXMuIFRoaXMgb2JqZWN0IHN0b3JlcyB0aGUgbWVzc2FnZSBieXRlcyBpbiBhCisgKiA8Y29kZT5YQnl0ZUJ1ZmZlcjwvY29kZT4gdW50aWwgYSBmdWxsIHBhY2thZ2UgaGFzIGJlZW4gcmVjZWl2ZWQuCisgKiBXaGVuIGEgZnVsbCBwYWNrYWdlIGhhcyBiZWVuIHJlY2VpdmVkLCB0aGUgYXBwZW5kIG1ldGhvZCB3aWxsIGNhbGwgbWVzc2FnZURhdGFSZWNlaXZlZAorICogb24gdGhlIGNhbGxiYWNrIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QgcmVhZGVyLjxCUj4KKyAqIFRoaXMgb2JqZWN0IHVzZXMgYW4gWEJ5dGVCdWZmZXIgd2hpY2ggaXMgYW4gZXh0ZW5kYWJsZSBvYmplY3QgYnVmZmVyIHRoYXQgYWxzbyBhbGxvd3MKKyAqIGZvciBtZXNzYWdlIGVuY29kaW5nIGFuZCBkZWNvZGluZy4KKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqIEBzaW5jZSA1LjUuMTAKKyAqLworcHVibGljIGNsYXNzIFNvY2tldE9iamVjdFJlYWRlcgoreworICAgIHByaXZhdGUgU29ja2V0IHNvY2tldDsKKyAgICBwcml2YXRlIExpc3RlbkNhbGxiYWNrIGNhbGxiYWNrOworICAgIHByaXZhdGUgWEJ5dGVCdWZmZXIgYnVmZmVyOworCisgICAgLyoqCisgICAgICogdXNlIHRoaXMgc29ja2V0IGFuZCBjYWxsYmFjayB0byByZWNlaXZlIG1lc3NhZ2VzCisgICAgICogQHBhcmFtIHNvY2tldCBsaXN0ZW5lciBzb2NrZXQKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2x1c3RlclJlY2VpdmVyQmFzZSBsaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyBTb2NrZXRPYmplY3RSZWFkZXIoIFNvY2tldCBzb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdGVuQ2FsbGJhY2sgY2FsbGJhY2spICB7CisgICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0OworICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IFhCeXRlQnVmZmVyKCk7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQXBwZW5kIG5ldyBieXRlcyB0byBidWZmZXIuIAorICAgICAqIElzIG1lc3NhZ2UgY29tcGxldGUgcmVjZWl2ZXIgc2VuZCBtZXNzYWdlIHRvIGNhbGxiYWNrCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLkNsdXN0ZXJSZWNlaXZlckJhc2UjbWVzc2FnZURhdGFSZWNlaXZlZChDbHVzdGVyRGF0YSkKKyAgICAgKiBAc2VlIFhCeXRlQnVmZmVyI2RvZXNQYWNrYWdlRXhpc3QoKQorICAgICAqIEBzZWUgWEJ5dGVCdWZmZXIjZXh0cmFjdFBhY2thZ2UoYm9vbGVhbikKKyAgICAgKiBAcGFyYW0gZGF0YSBuZXcgdHJhbnNmZXIgYnVmZmVyCisgICAgICogQHBhcmFtIG9mZiBvZmZzZXQKKyAgICAgKiBAcGFyYW0gbGVuIGxlbmd0aCBpbiBidWZmZXIKKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBtZXNzYWdlcyB0aGF0IHNlbmRlZCB0byBjYWxsYmFjaworICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBpbnQgYXBwZW5kKGJ5dGVbXSBkYXRhLGludCBvZmYsaW50IGxlbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBpZihsZW4gPiAwKQorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChkYXRhLG9mZixsZW4pOworICAgICAgICBib29sZWFuIHBrZ0V4aXN0cyA9IGJ1ZmZlci5kb2VzUGFja2FnZUV4aXN0KCk7CisgICAgICAgIGludCBwa2dDbnQgPSAwOworICAgICAgICB3aGlsZSAoIHBrZ0V4aXN0cyApIHsKKyAgICAgICAgICAgIENsdXN0ZXJEYXRhIGNkYXRhID0gYnVmZmVyLmV4dHJhY3RQYWNrYWdlKHRydWUpOworICAgICAgICAgICAgaWYoY2FsbGJhY2suaXNTZW5kQWNrKCkpCisgICAgICAgICAgICAgICAgY2FsbGJhY2suc2VuZEFjaygpIDsKKyAgICAgICAgICAgIGNhbGxiYWNrLm1lc3NhZ2VEYXRhUmVjZWl2ZWQoY2RhdGEpOworICAgICAgICAgICAgcGtnQ250Kys7CisgICAgICAgICAgICBwa2dFeGlzdHMgPSBidWZmZXIuZG9lc1BhY2thZ2VFeGlzdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwa2dDbnQ7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogc2VuZCBtZXNzYWdlIHRvIGNhbGxiYWNrCisgICAgICogQHNlZSBTb2NrZXRPYmplY3RSZWFkZXIjYXBwZW5kKGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICogQHJldHVybiBDb3VudCBvZiBwYWNrYWdlcyB3cml0dGVuCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGludCBleGVjdXRlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gYXBwZW5kKG51bGwsMCwwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB3cml0ZSBkYXRhIHRvIHNvY2tldCAoYWNrKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5Tb2NrZXRSZXBsaWNhdGlvbkxpc3RlbmVyI3NlbmRBY2sKKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqIEByZXR1cm4gQWx3YXlzIHplcm8KKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHdyaXRlKGJ5dGVbXSBkYXRhKQorICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoZGF0YSk7CisgICAgICAgcmV0dXJuIDA7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvaW8vWEJ5dGVCdWZmZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9pby9YQnl0ZUJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNzkzNWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvaW8vWEJ5dGVCdWZmZXIuamF2YQpAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmlvOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5DbHVzdGVyRGF0YTsKKworLyoqCisgKiBUaGUgWEJ5dGVCdWZmZXIgcHJvdmlkZXMgYSBkdWFsIGZ1bmN0aW9uYWxpdHkuCisgKiBPbmUsIGl0IHN0b3JlcyBtZXNzYWdlIGJ5dGVzIGFuZCBhdXRvbWF0aWNhbGx5IGV4dGVuZHMgdGhlIGJ5dGUgYnVmZmVyIGlmIG5lZWRlZC48QlI+CisgKiBUd28sIGl0IGNhbiBlbmNvZGUgYW5kIGRlY29kZSBwYWNrYWdlcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGRlZmluZWQgYW5kIGlkZW50aWZpZWQKKyAqIGFzIHRoZXkgY29tZSBpbiBvbiBhIHNvY2tldC4KKyAqIDxici8+CisgKiBUcmFuc2ZlciBwYWNrYWdlOgorICogPHVsPgorICogPGxpPjxiPlNUQVJUX0RBVEEvYj4gLSA3IGJ5dGVzIC0gPGk+RkxUMjAwMjwvaT48L2xpPgorICogPGxpPjxiPkNPTVBSRVNTPC9iPiAgLSA0IGJ5dGVzIC0gaXMgbWVzc2FnZSBjb21wcmVzc2VkIGZsYWc8L2xpPgorICogPGxpPjxiPlNJWkU8L2I+ICAgICAgLSA0IGJ5dGVzIC0gc2l6ZSBvZiB0aGUgZGF0YSBwYWNrYWdlPC9saT4KKyAqIDxsaT48Yj5EQVRBPC9iPiAgICAgIC0gc2hvdWxkIGJlIGFzIG1hbnkgYnl0ZXMgYXMgdGhlIHByZXYgU0laRTwvbGk+CisgKiA8bGk+PGI+RU5EX0RBVEE8L2I+ICAtIDcgYnl0ZXMgLSA8aT5UTEYyMDAzPC9pPjwvbEk+CisgKiA8L3VsPgorICogRklYTUU6IFdoeSB3ZSBub3QgdXNlIGEgbGlzdCBvZiBieXRlIGJ1ZmZlcnM/CisgKiBGSVhNRTogVXNlZCBhIHBvb2wgb2YgYnVmZmVycyBpbnN0ZWFkLCBldmVyeSB0aW1lIG5ldyBnZW5lcmF0aW9uCisgKgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBYQnl0ZUJ1ZmZlcgoreworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBYQnl0ZUJ1ZmZlci5jbGFzcyApOworICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgaXMgYSBwYWNrYWdlIGhlYWRlciwgNyBieXRlcyAoRkxUMjAwMikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBTVEFSVF9EQVRBID0gezcwLDc2LDg0LDUwLDQ4LDQ4LDUwfTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBwYWNrYWdlIGZvb3RlciwgNyBieXRlcyAoVExGMjAwMykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTkRfREFUQSA9IHs4NCw3Niw3MCw1MCw0OCw0OCw1MX07CisgCisgICAgLyoqCisgICAgICogRGVmYXVsdCBzaXplIG9uIHRoZSBpbml0aWFsIGJ5dGUgYnVmZmVyCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBERUZfU0laRSA9IDEwMjQ7CisgCisgICAgLyoqCisgICAgICogRGVmYXVsdCBzaXplIHRvIGV4dGVuZCB0aGUgYnVmZmVyIHdpdGgKKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IERFRl9FWFQgID0gMTAyNDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBWYXJpYWJsZSB0byBob2xkIHRoZSBkYXRhCisgICAgICovCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBidWYgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIEN1cnJlbnQgbGVuZ3RoIG9mIGRhdGEgaW4gdGhlIGJ1ZmZlcgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgYnVmU2l6ZSA9IDA7CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBYQnl0ZUJ1ZmZlcgorICAgICAqIEBwYXJhbSBzaXplIC0gdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgYnl0ZSBidWZmZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgWEJ5dGVCdWZmZXIoaW50IHNpemUpIHsKKyAgICAgICAgYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBYQnl0ZUJ1ZmZlciB3aXRoIGFuIGluaXRpYWwgc2l6ZSBvZiAxMDI0IGJ5dGVzCisgICAgICovCisgICAgcHVibGljIFhCeXRlQnVmZmVyKCkgIHsKKyAgICAgICAgdGhpcyhERUZfU0laRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYnl0ZXMgaW4gdGhlIGJ1ZmZlciwgaW4gaXRzIGV4YWN0IGxlbmd0aAorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoKSB7CisgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbYnVmU2l6ZV07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLDAsYiwwLGJ1ZlNpemUpOworICAgICAgICByZXR1cm4gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIGJ1ZmZlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBidWZTaXplID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIHRoZSBkYXRhIHRvIHRoZSBidWZmZXIuIElmIHRoZSBkYXRhIGlzIGluY29ycmVjdGx5IGZvcm1hdHRlZCwgaWUsIHRoZSBkYXRhIHNob3VsZCBhbHdheXMgc3RhcnQgd2l0aCB0aGUKKyAgICAgKiBoZWFkZXIsIGZhbHNlIHdpbGwgYmUgcmV0dXJuZWQgYW5kIHRoZSBkYXRhIHdpbGwgYmUgZGlzY2FyZGVkLgorICAgICAqIEBwYXJhbSBiIC0gYnl0ZXMgdG8gYmUgYXBwZW5kZWQKKyAgICAgKiBAcGFyYW0gb2ZmIC0gdGhlIG9mZnNldCB0byBleHRyYWN0IGRhdGEgZnJvbQorICAgICAqIEBwYXJhbSBsZW4gLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFwcGVuZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRhdGEgd2FzIGFwcGVuZGVkIGNvcnJlY3RseS4gUmV0dXJucyBmYWxzZSBpZiB0aGUgcGFja2FnZSBpcyBpbmNvcnJlY3QsIGllIG1pc3NpbmcgaGVhZGVyIG9yIHNvbWV0aGluZywgb3IgdGhlIGxlbmd0aCBvZiBkYXRhIGlzIDAKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhcHBlbmQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICAgICAgaWYgKChvZmYgPCAwKSB8fCAob2ZmID4gYi5sZW5ndGgpIHx8IChsZW4gPCAwKSB8fAorICAgICAgICAgICAgKChvZmYgKyBsZW4pID4gYi5sZW5ndGgpIHx8ICgob2ZmICsgbGVuKSA8IDApKSAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfSBlbHNlIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50IG5ld2NvdW50ID0gYnVmU2l6ZSArIGxlbjsKKyAgICAgICAgaWYgKG5ld2NvdW50ID4gYnVmLmxlbmd0aCkgeworICAgICAgICAgICAgYnl0ZSBuZXdidWZbXSA9IG5ldyBieXRlW01hdGgubWF4KGJ1Zi5sZW5ndGggPDwgMSwgbmV3Y291bnQpXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCAwLCBuZXdidWYsIDAsIGJ1ZlNpemUpOworICAgICAgICAgICAgYnVmID0gbmV3YnVmOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgb2ZmLCBidWYsIGJ1ZlNpemUsIGxlbik7CisgICAgICAgIGJ1ZlNpemUgPSBuZXdjb3VudDsKKworICAgICAgICBpZiAoYnVmU2l6ZSA+IFNUQVJUX0RBVEEubGVuZ3RoICYmIChmaXJzdEluZGV4T2YoYnVmLDAsU1RBUlRfREFUQSk9PS0xKSl7CisgICAgICAgICAgICBidWZTaXplID0gMDsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiRGlzY2FyZGVkIHRoZSBwYWNrYWdlLCBpbnZhbGlkIGhlYWRlciIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgbWVjaGFuaXNtIHRvIG1ha2UgYSBjaGVjayBpZiBhIGNvbXBsZXRlIHBhY2thZ2UgZXhpc3RzCisgICAgICogd2l0aGluIHRoZSBidWZmZXIKKyAgICAgKiBAcmV0dXJuIC0gdHJ1ZSBpZiBhIGNvbXBsZXRlIHBhY2thZ2UgKGhlYWRlcixjb21wcmVzcyxzaXplLGRhdGEsZm9vdGVyKSBleGlzdHMgd2l0aGluIHRoZSBidWZmZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvdW50UGFja2FnZXMoKQorICAgIHsKKyAgICAgICAgaW50IGNudCA9IDA7CisgICAgICAgIGludCBwb3MgPSBTVEFSVF9EQVRBLmxlbmd0aDsKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKworICAgICAgICB3aGlsZSAoIHN0YXJ0IDwgYnVmU2l6ZSApIHsKKyAgICAgICAgICAgIC8vZmlyc3QgY2hlY2sgc3RhcnQgaGVhZGVyCisgICAgICAgICAgICBpbnQgaW5kZXggPSBYQnl0ZUJ1ZmZlci5maXJzdEluZGV4T2YoYnVmLHN0YXJ0LFNUQVJUX0RBVEEpOworICAgICAgICAgICAgLy9pZiB0aGUgaGVhZGVyIChTVEFSVF9EQVRBKSBpc24ndCB0aGUgZmlyc3QgdGhpbmcgb3IKKyAgICAgICAgICAgIC8vdGhlIGJ1ZmZlciBpc24ndCBldmVuIDE0IGJ5dGVzCisgICAgICAgICAgICBpZiAoIGluZGV4ICE9IHN0YXJ0IHx8ICgoYnVmU2l6ZS1zdGFydCk8MTQpICkgYnJlYWs7CisgICAgICAgICAgICAvL25leHQgNCBieXRlcyBhcmUgY29tcHJlc3MgZmxhZyBub3QgbmVlZGVkIGZvciBjb3VudCBwYWNrYWdlcworICAgICAgICAgICAgLy90aGVuIGdldCB0aGUgc2l6ZSA0IGJ5dGVzCisgICAgICAgICAgICBpbnQgc2l6ZSA9IHRvSW50KGJ1ZiwgcG9zKzQpOworICAgICAgICAgICAgLy9ub3cgdGhlIHRvdGFsIGJ1ZmZlciBoYXMgdG8gYmUgbG9uZyBlbm91Z2ggdG8gaG9sZAorICAgICAgICAgICAgLy9TVEFSVF9EQVRBLmxlbmd0aCs4K3NpemUrRU5EX0RBVEEubGVuZ3RoCisgICAgICAgICAgICBwb3MgPSBzdGFydCArIFNUQVJUX0RBVEEubGVuZ3RoICsgOCArIHNpemU7CisgICAgICAgICAgICBpZiAoIChwb3MgKyBFTkRfREFUQS5sZW5ndGgpID4gYnVmU2l6ZSkgYnJlYWs7CisgICAgICAgICAgICAvL2FuZCBmaW5hbGx5IGNoZWNrIHRoZSBmb290ZXIgb2YgdGhlIHBhY2thZ2UgRU5EX0RBVEEKKyAgICAgICAgICAgIGludCBuZXdwb3MgPSBmaXJzdEluZGV4T2YoYnVmLCBwb3MsIEVORF9EQVRBKTsKKyAgICAgICAgICAgIC8vbWlzbWF0Y2gsIHRoZXJlIGlzIG5vIHBhY2thZ2UKKyAgICAgICAgICAgIGlmIChuZXdwb3MgIT0gcG9zKSBicmVhazsKKyAgICAgICAgICAgIC8vaW5jcmVhc2UgdGhlIHBhY2tldCBjb3VudAorICAgICAgICAgICAgY250Kys7CisgICAgICAgICAgICAvL3Jlc2V0IHRoZSB2YWx1ZXMKKyAgICAgICAgICAgIHN0YXJ0ID0gcG9zICsgRU5EX0RBVEEubGVuZ3RoOworICAgICAgICAgICAgcG9zID0gc3RhcnQgKyBTVEFSVF9EQVRBLmxlbmd0aDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY250OworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCB0byBjaGVjayBpZiBhIHBhY2thZ2UgZXhpc3RzIGluIHRoaXMgYnl0ZSBidWZmZXIuCisgICAgICogQHJldHVybiAtIHRydWUgaWYgYSBjb21wbGV0ZSBwYWNrYWdlIChoZWFkZXIsY29tcHJlc3Msc2l6ZSxkYXRhLGZvb3RlcikgZXhpc3RzIHdpdGhpbiB0aGUgYnVmZmVyCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZG9lc1BhY2thZ2VFeGlzdCgpICB7CisgICAgICAgIHJldHVybiAoY291bnRQYWNrYWdlcygpPjApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4dHJhY3RzIHRoZSBtZXNzYWdlIGJ5dGVzIGZyb20gYSBwYWNrYWdlLgorICAgICAqIElmIG5vIHBhY2thZ2UgZXhpc3RzLCBhIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKiBAcGFyYW0gY2xlYXJGcm9tQnVmZmVyIC0gaWYgdHJ1ZSwgdGhlIHBhY2thZ2Ugd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGJ5dGUgYnVmZmVyCisgICAgICogQHJldHVybiAtIHJldHVybnMgdGhlIGFjdHVhbCBtZXNzYWdlIGJ5dGVzIChoZWFkZXIsIGNvbXByZXNzLHNpemUgYW5kIGZvb3RlciBub3QgaW5jbHVkZWQpLgorICAgICAqLworICAgIHB1YmxpYyBDbHVzdGVyRGF0YSBleHRyYWN0UGFja2FnZShib29sZWFuIGNsZWFyRnJvbUJ1ZmZlcikKKyAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHBzaXplID0gY291bnRQYWNrYWdlcygpOworICAgICAgICBpZiAocHNpemUgPT0gMCkgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIHBhY2thZ2UgZXhpc3RzIGluIFhCeXRlQnVmZmVyIik7CisgICAgICAgIGludCBjb21wcmVzcyA9IHRvSW50KGJ1ZiwgU1RBUlRfREFUQS5sZW5ndGgpOworICAgICAgICBpbnQgc2l6ZSA9IHRvSW50KGJ1ZiwgU1RBUlRfREFUQS5sZW5ndGggKzQpOworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW3NpemVdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgU1RBUlRfREFUQS5sZW5ndGggKyA4LCBkYXRhLCAwLCBzaXplKTsKKyAgICAgICAgQ2x1c3RlckRhdGEgY2RhdGEgPSBuZXcgQ2x1c3RlckRhdGEoKSA7CisgICAgICAgIGNkYXRhLnNldE1lc3NhZ2UoZGF0YSk7CisgICAgICAgIGNkYXRhLnNldENvbXByZXNzKGNvbXByZXNzKTsKKyAgICAgICAgaWYgKGNsZWFyRnJvbUJ1ZmZlcikgeworICAgICAgICAgICAgaW50IHRvdGFsc2l6ZSA9IFNUQVJUX0RBVEEubGVuZ3RoICsgOCArIHNpemUgKyBFTkRfREFUQS5sZW5ndGg7CisgICAgICAgICAgICBidWZTaXplID0gYnVmU2l6ZSAtIHRvdGFsc2l6ZTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCB0b3RhbHNpemUsIGJ1ZiwgMCwgYnVmU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgZm91ciBieXRlcyB0byBhbiBpbnQKKyAgICAgKiBAcGFyYW0gYiAtIHRoZSBieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvdXIgYnl0ZXMKKyAgICAgKiBAcGFyYW0gb2ZmIC0gdGhlIG9mZnNldAorICAgICAqIEByZXR1cm4gdGhlIGludGVnZXIgdmFsdWUgY29uc3RydWN0ZWQgZnJvbSB0aGUgZm91ciBieXRlcworICAgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHRvSW50KGJ5dGVbXSBiLGludCBvZmYpeworICAgICAgICByZXR1cm4gKCAoIChpbnQpIGJbb2ZmKzNdKSAmIDB4RkYpICsKKyAgICAgICAgICAgICggKCAoIChpbnQpIGJbb2ZmKzJdKSAmIDB4RkYpIDw8IDgpICsKKyAgICAgICAgICAgICggKCAoIChpbnQpIGJbb2ZmKzFdKSAmIDB4RkYpIDw8IDE2KSArCisgICAgICAgICAgICAoICggKCAoaW50KSBiW29mZiswXSkgJiAweEZGKSA8PCAyNCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBlaWdodCBieXRlcyB0byBhIGxvbmcKKyAgICAgKiBAcGFyYW0gYiAtIHRoZSBieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvdXIgYnl0ZXMKKyAgICAgKiBAcGFyYW0gb2ZmIC0gdGhlIG9mZnNldAorICAgICAqIEByZXR1cm4gdGhlIGxvbmcgdmFsdWUgY29uc3RydWN0ZWQgZnJvbSB0aGUgZWlnaHQgYnl0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgdG9Mb25nKGJ5dGVbXSBiLGludCBvZmYpeworICAgICAgICByZXR1cm4gKCAoIChsb25nKSBiW29mZis3XSkgJiAweEZGKSArCisgICAgICAgICAgICAoICggKCAobG9uZykgYltvZmYrNl0pICYgMHhGRikgPDwgOCkgKworICAgICAgICAgICAgKCAoICggKGxvbmcpIGJbb2ZmKzVdKSAmIDB4RkYpIDw8IDE2KSArCisgICAgICAgICAgICAoICggKCAobG9uZykgYltvZmYrNF0pICYgMHhGRikgPDwgMjQpICsKKyAgICAgICAgICAgICggKCAoIChsb25nKSBiW29mZiszXSkgJiAweEZGKSA8PCAzMikgKworICAgICAgICAgICAgKCAoICggKGxvbmcpIGJbb2ZmKzJdKSAmIDB4RkYpIDw8IDQwKSArCisgICAgICAgICAgICAoICggKCAobG9uZykgYltvZmYrMV0pICYgMHhGRikgPDwgNDgpICsKKyAgICAgICAgICAgICggKCAoIChsb25nKSBiW29mZiswXSkgJiAweEZGKSA8PCA1Nik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgYW4gaW50ZWdlciB0byBmb3VyIGJ5dGVzCisgICAgICogQHBhcmFtIG4gLSB0aGUgaW50ZWdlcgorICAgICAqIEByZXR1cm4gLSBmb3VyIGJ5dGVzIGluIGFuIGFycmF5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gdG9CeXRlcyhpbnQgbikgeworICAgICAgICBieXRlW10gYiA9IG5ldyBieXRlWzRdOworICAgICAgICBiWzNdID0gKGJ5dGUpIChuKTsKKyAgICAgICAgbiA+Pj49IDg7CisgICAgICAgIGJbMl0gPSAoYnl0ZSkgKG4pOworICAgICAgICBuID4+Pj0gODsKKyAgICAgICAgYlsxXSA9IChieXRlKSAobik7CisgICAgICAgIG4gPj4+PSA4OworICAgICAgICBiWzBdID0gKGJ5dGUpIChuKTsKKyAgICAgICAgcmV0dXJuIGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgYW4gbG9uZyB0byBlaWdodCBieXRlcworICAgICAqIEBwYXJhbSBuIC0gdGhlIGxvbmcKKyAgICAgKiBAcmV0dXJuIC0gZWlnaHQgYnl0ZXMgaW4gYW4gYXJyYXkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB0b0J5dGVzKGxvbmcgbikgeworICAgICAgICBieXRlW10gYiA9IG5ldyBieXRlWzhdOworICAgICAgICBiWzddID0gKGJ5dGUpIChuKTsKKyAgICAgICAgbiA+Pj49IDg7CisgICAgICAgIGJbNl0gPSAoYnl0ZSkgKG4pOworICAgICAgICBuID4+Pj0gODsKKyAgICAgICAgYls1XSA9IChieXRlKSAobik7CisgICAgICAgIG4gPj4+PSA4OworICAgICAgICBiWzRdID0gKGJ5dGUpIChuKTsKKyAgICAgICAgbiA+Pj49IDg7CisgICAgICAgIGJbM10gPSAoYnl0ZSkgKG4pOworICAgICAgICBuID4+Pj0gODsKKyAgICAgICAgYlsyXSA9IChieXRlKSAobik7CisgICAgICAgIG4gPj4+PSA4OworICAgICAgICBiWzFdID0gKGJ5dGUpIChuKTsKKyAgICAgICAgbiA+Pj49IDg7CisgICAgICAgIGJbMF0gPSAoYnl0ZSkgKG4pOworICAgICAgICByZXR1cm4gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1pbGFyIHRvIGEgU3RyaW5nLkluZGV4T2YsIGJ1dCB1c2VzIHB1cmUgYnl0ZXMKKyAgICAgKiBAcGFyYW0gc3JjIC0gdGhlIHNvdXJjZSBieXRlcyB0byBiZSBzZWFyY2hlZAorICAgICAqIEBwYXJhbSBzcmNPZmYgLSBvZmZzZXQgb24gdGhlIHNvdXJjZSBidWZmZXIKKyAgICAgKiBAcGFyYW0gZmluZCAtIHRoZSBzdHJpbmcgdG8gYmUgZm91bmQgd2l0aGluIHNyYworICAgICAqIEByZXR1cm4gLSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGJ5dGUuIC0xIGlmIHRoZSBmaW5kIGFycmF5IGlzIG5vdCBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGZpcnN0SW5kZXhPZihieXRlW10gc3JjLCBpbnQgc3JjT2ZmLCBieXRlW10gZmluZCl7CisgICAgICAgIGludCByZXN1bHQgPSAtMTsKKyAgICAgICAgaWYgKGZpbmQubGVuZ3RoID4gc3JjLmxlbmd0aCkgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgaWYgKGZpbmQubGVuZ3RoID09IDAgfHwgc3JjLmxlbmd0aCA9PSAwKSByZXR1cm4gcmVzdWx0OworICAgICAgICBpZiAoc3JjT2ZmID49IHNyYy5sZW5ndGggKSB0aHJvdyBuZXcgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGludCBzcmNsZW4gPSBzcmMubGVuZ3RoOworICAgICAgICBpbnQgZmluZGxlbiA9IGZpbmQubGVuZ3RoOworICAgICAgICBieXRlIGZpcnN0ID0gZmluZFswXTsKKyAgICAgICAgaW50IHBvcyA9IHNyY09mZjsKKyAgICAgICAgd2hpbGUgKCFmb3VuZCkgeworICAgICAgICAgICAgLy9maW5kIHRoZSBmaXJzdCBieXRlCisgICAgICAgICAgICB3aGlsZSAocG9zIDwgc3JjbGVuKXsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QgPT0gc3JjW3Bvc10pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvcyA+PSBzcmNsZW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAvL3dlIGZvdW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgICAgICAgICAgIC8vbWF0Y2ggdGhlIHJlc3Qgb2YgdGhlIGJ5dGVzIC0gdGhleSBoYXZlIHRvIG1hdGNoCisgICAgICAgICAgICBpZiAoIChzcmNsZW4gLSBwb3MpIDwgZmluZGxlbikKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAvL2Fzc3VtZSBpdCBkb2VzIGV4aXN0CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgKCAoaSA8IGZpbmRsZW4pICYmIGZvdW5kKTsgaSsrKQorICAgICAgICAgICAgICAgIGZvdW5kID0gZm91bmQgJiYgKGZpbmRbaV0gPT0gc3JjW3BvcyArIGldKTsKKyAgICAgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBwb3M7CisgICAgICAgICAgICBlbHNlIGlmICggKHNyY2xlbiAtIHBvcykgPCBmaW5kbGVuKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsgLy9ubyBtb3JlIG1hdGNoZXMgcG9zc2libGUKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb21wbGV0ZSBkYXRhIHBhY2thZ2UKKyAgICAgKiBAcGFyYW0gaW5kYXRhIC0gdGhlIG1lc3NhZ2UgZGF0YSB0byBiZSBjb250YWluZWQgd2l0aGluIHRoZSBwYWNrYWdlCisgICAgICogQHBhcmFtIGNvbXByZXNzZWQgLSBjb21wcmVzc2lvbiBmbGFnIGZvciB0aGUgaW5kYXRhIGJ1ZmZlcgorICAgICAqIEByZXR1cm4gLSBhIGZ1bGwgcGFja2FnZSAoaGVhZGVyLGNvbXByZXNzLHNpemUsZGF0YSxmb290ZXIpCisgICAgICogCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gY3JlYXRlRGF0YVBhY2thZ2UoYnl0ZVtdIGluZGF0YSwgaW50IGNvbXByZXNzZWQpCisgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gaW5kYXRhOworICAgICAgICBieXRlW10gY29tcHJkYXRhID0gWEJ5dGVCdWZmZXIudG9CeXRlcyhjb21wcmVzc2VkKTsKKyAgICAgICAgaW50IGxlbmd0aCA9IAorICAgICAgICAgICAgU1RBUlRfREFUQS5sZW5ndGggKyAvL2hlYWRlciBsZW5ndGgKKyAgICAgICAgICAgIDQgKyAvL2NvbXByZXNzaW9uIGZsYWcKKyAgICAgICAgICAgIDQgKyAvL2RhdGEgbGVuZ3RoIGluZGljYXRvcgorICAgICAgICAgICAgZGF0YS5sZW5ndGggKyAvL2FjdHVhbCBkYXRhIGxlbmd0aAorICAgICAgICAgICAgRU5EX0RBVEEubGVuZ3RoOyAvL2Zvb3RlciBsZW5ndGgKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoU1RBUlRfREFUQSwgMCwgcmVzdWx0LCAwLCBTVEFSVF9EQVRBLmxlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29tcHJkYXRhLCAwLCByZXN1bHQsIFNUQVJUX0RBVEEubGVuZ3RoLCA0KTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0b0J5dGVzKGRhdGEubGVuZ3RoKSwgMCwgcmVzdWx0LCBTVEFSVF9EQVRBLmxlbmd0aCArIDQsIDQpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIHJlc3VsdCwgU1RBUlRfREFUQS5sZW5ndGggKyA4LCBkYXRhLmxlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoRU5EX0RBVEEsIDAsIHJlc3VsdCwgU1RBUlRfREFUQS5sZW5ndGggKyA4ICsgZGF0YS5sZW5ndGgsIEVORF9EQVRBLmxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL21iZWFucy1kZXNjcmlwdG9ycy54bWwgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjViZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSw5NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8bWJlYW5zLWRlc2NyaXB0b3JzPgorCisgIDxtYmVhbiAgICAgICAgIG5hbWU9IlNpbXBsZVRjcENsdXN0ZXIiCisgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLkNsYXNzTmFtZU1CZWFuIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUY3AgQ2x1c3RlciBpbXBsZW1lbnRhdGlvbiIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IkNsdXN0ZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuU2ltcGxlVGNwQ2x1c3RlciI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icHJvdG9jb2xTdGFjayIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSmF2YUdyb3VwcyBwcm90b2NvbCBzdGFjayBzZWxlY3Rpb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICA8L21iZWFuPgorCisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyIgorICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5DbGFzc05hbWVNQmVhbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2x1c3RlcmVkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNYW5hZ2VyIGludGVyZmFjZSIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9Ik1hbmFnZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyIj4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhbGdvcml0aG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gdG8gYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBpZGVudGlmaWVycyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNoZWNrSW50ZXJ2YWwiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBpbnRlcnZhbCAoaW4gc2Vjb25kcykgYmV0d2VlbiBjaGVja3MgZm9yIGV4cGlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRpc3RyaWJ1dGFibGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkaXN0cmlidXRhYmxlIGZsYWcgZm9yIFNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcworICAgICAgICAgICAgICAgICAgICAgICBNYW5hZ2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZW50cm9weSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQSBTdHJpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHVzZWQgdG8gaW5jcmVhc2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIGVudHJvcHkgb2YgdGhlIGluaXRpYWxpemF0aW9uIG9mIG91ciByYW5kb20gbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1hbmFnZWRSZXNvdXJjZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1hbmFnZWQgcmVzb3VyY2UgdGhpcyBNQmVhbiBpcyBhc3NvY2lhdGVkIHdpdGgiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5PYmplY3QiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhBY3RpdmVTZXNzaW9ucyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBTZXNzaW9ucyBhbGxvd2VkLCBvciAtMQorICAgICAgICAgICAgICAgICAgICAgICBmb3Igbm8gbGltaXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heEluYWN0aXZlSW50ZXJ2YWwiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkZWZhdWx0IG1heGltdW0gaW5hY3RpdmUgaW50ZXJ2YWwgZm9yIFNlc3Npb25zCisgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgYnkgdGhpcyBNYW5hZ2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGVzY3JpcHRpdmUgbmFtZSBvZiB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgKGZvciBsb2dnaW5nKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICA8L21iZWFuPgorCisKKworPG1iZWFuICAgICAgICAgbmFtZT0iUmVwbGljYXRpb25WYWx2ZSIKKyAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuQ2xhc3NOYW1lTUJlYW4iCisgICAgICAgICAgZGVzY3JpcHRpb249IlZhbHZlIGZvciBzaW1wbGUgdGNwIHJlcGxpY2F0aW9uIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iVmFsdmUiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25WYWx2ZSI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGVidWciCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIGZvciB0aGlzIGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgPC9tYmVhbj4KKworCis8L21iZWFucy1kZXNjcmlwdG9ycz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9tY2FzdC9Db25zdGFudHMuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9tY2FzdC9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDQwNzk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL21jYXN0L0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLm1jYXN0OworCisvKioKKyAqIE1hbmlmZXN0IGNvbnN0YW50cyBmb3IgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5tY2FzdDwvY29kZT4KKyAqIHBhY2thZ2UuCisgKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhY2thZ2UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLm1jYXN0IjsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL21jYXN0L0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL21jYXN0L0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYWZhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWNhc3QvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSBAQAorY2x1c3Rlci5tYmVhbi5yZWdpc3Rlci5hbHJlYWR5PU1CZWFuIHswfSBhbHJlYWR5IHJlZ2lzdGVyZWQhCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWNhc3QvTWNhc3RNZW1iZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9tY2FzdC9NY2FzdE1lbWJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTUxNzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWNhc3QvTWNhc3RNZW1iZXIuamF2YQpAQCAtMCwwICsxLDMzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLm1jYXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuaW8uWEJ5dGVCdWZmZXI7CisKKy8qKgorICogQSA8Yj5tZW1iZXJzaGlwPC9iPiBpbXBsZW1lbnRhdGlvbiB1c2luZyBzaW1wbGUgbXVsdGljYXN0LgorICogVGhpcyBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYSBtdWx0aWNhc3QgbWVtYmVyLgorICogQ2FycmllcyB0aGUgaG9zdCwgYW5kIHBvcnQgb2YgdGhlIHRoaXMgb3Igb3RoZXIgY2x1c3RlciBub2Rlcy4KKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIE1jYXN0TWVtYmVyIGltcGxlbWVudHMgTWVtYmVyLCBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdHMsIHVzZWQgZm9yICJzdXBlcmZhc3QiIGRlLXNlcmlhbGl6YXRpb24gb2YgYW4KKyAgICAgKiBJUCBhZGRyZXNzCisgICAgICovCisgICAgZmluYWwgdHJhbnNpZW50IHN0YXRpYyBjaGFyW10gZGlnaXRzID0geworICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLAorICAgICAgICAnNicsICc3JywgJzgnLCAnOSd9OworCisgICAgLyoqCisgICAgICogUHVibGljIHByb3BlcnRpZXMgc3BlY2lmaWMgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdHJhbnNpZW50IFN0cmluZyBUQ1BfTElTVEVOX1BPUlQgPSAidGNwTGlzdGVuUG9ydCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCB0cmFuc2llbnQgU3RyaW5nIFRDUF9MSVNURU5fSE9TVCA9ICJ0Y3BMaXN0ZW5Ib3N0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHRyYW5zaWVudCBTdHJpbmcgTUVNQkVSX05BTUUgPSAibWVtYmVyTmFtZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCB0cmFuc2llbnQgU3RyaW5nIE1FTUJFUl9ET01BSU4gPSAibWVtYmVyRG9tYWluIjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdGVuIGhvc3QgZm9yIHRoaXMgbWVtYmVyCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBob3N0OworICAgIC8qKgorICAgICAqIFRoZSB0Y3AgbGlzdGVuIHBvcnQgZm9yIHRoaXMgbWVtYmVyCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBwb3J0OworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIGZvciB0aGlzIG1lbWJlciwgaGFzIGJlIGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGNsdXN0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjbHVzdGVyIGRvbWFpbiBmcm9tIHRoaXMgbm9kZQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRvbWFpbjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb3VudGVyIGZvciBob3cgbWFueSBtZXNzYWdlcyBoYXZlIGJlZW4gc2VudCBmcm9tIHRoaXMgbWVtYmVyCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtc2dDb3VudCA9IDA7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhpcyBtZW1iZXJzIHdhcworICAgICAqIGNyZWF0ZWQsIGlzIGtlcHQgdHJhY2sgb2YgdXNpbmcgdGhlIHN0YXJ0IHRpbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBtZW1iZXJBbGl2ZVRpbWUgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgbWVtYmVyIG9iamVjdAorICAgICAqIEBwYXJhbSBuYW1lIC0gdGhlIG5hbWUgb2YgdGhpcyBtZW1iZXIsIGNsdXN0ZXIgdW5pcXVlCisgICAgICogQHBhcmFtIGRvbWFpbiAtIHRoZSBjbHVzdGVyIGRvbWFpbiBuYW1lIG9mIHRoaXMgbWVtYmVyCisgICAgICogQHBhcmFtIGhvc3QgLSB0aGUgdGNwIGxpc3RlbiBob3N0CisgICAgICogQHBhcmFtIHBvcnQgLSB0aGUgdGNwIGxpc3RlbiBwb3J0CisgICAgICovCisgICAgcHVibGljIE1jYXN0TWVtYmVyKFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYWxpdmVUaW1lKSB7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOworICAgICAgICB0aGlzLm1lbWJlckFsaXZlVGltZT1hbGl2ZVRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgSGFzaG1hcCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczo8QlI+CisgICAgICogMS4gdGNwTGlzdGVuUG9ydCAtIHRoZSBwb3J0IHRoaXMgbWVtYmVyIGxpc3RlbnMgdG8gZm9yIG1lc3NhZ2VzIC0gc3RyaW5nPEJSPgorICAgICAqIDIuIHRjcExpc3Rlbkhvc3QgLSB0aGUgaG9zdCBhZGRyZXNzIG9mIHRoaXMgbWVtYmVyIC0gc3RyaW5nPEJSPgorICAgICAqIDMuIG1lbWJlck5hbWUgICAgLSB0aGUgbmFtZSBvZiB0aGlzIG1lbWJlciAtIHN0cmluZzxCUj4KKyAgICAgKi8KKyAgICBwdWJsaWMgamF2YS51dGlsLkhhc2hNYXAgZ2V0TWVtYmVyUHJvcGVydGllcygpIHsKKyAgICAgICAgamF2YS51dGlsLkhhc2hNYXAgbWFwID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKDIpOworICAgICAgICBtYXAucHV0KE1jYXN0TWVtYmVyLlRDUF9MSVNURU5fSE9TVCx0aGlzLmhvc3QpOworICAgICAgICBtYXAucHV0KE1jYXN0TWVtYmVyLlRDUF9MSVNURU5fUE9SVCxTdHJpbmcudmFsdWVPZih0aGlzLnBvcnQpKTsKKyAgICAgICAgbWFwLnB1dChNY2FzdE1lbWJlci5NRU1CRVJfTkFNRSxuYW1lKTsKKyAgICAgICAgbWFwLnB1dChNY2FzdE1lbWJlci5NRU1CRVJfRE9NQUlOLGRvbWFpbik7CisgICAgICAgIHJldHVybiBtYXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5jcmVtZW50IHRoZSBtZXNzYWdlIGNvdW50LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGluYygpIHsKKyAgICAgICAgbXNnQ291bnQrKzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBkYXRhIHBhY2thZ2UgdG8gc2VuZCBvdmVyIHRoZSB3aXJlIHJlcHJlc2VudGluZyB0aGlzIG1lbWJlci4KKyAgICAgKiBUaGlzIGlzIGZhc3RlciB0aGFuIHNlcmlhbGl6YXRpb24uCisgICAgICogQHJldHVybiAtIHRoZSBieXRlcyBmb3IgdGhpcyBtZW1iZXIgZGVzZXJpYWxpemVkCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGdldERhdGEobG9uZyBzdGFydFRpbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvL3BhY2thZ2UgbG9va3MgbGlrZQorICAgICAgICAvL2FsaXZlIC0gOCBieXRlcworICAgICAgICAvL3BvcnQgLSA0IGJ5dGVzCisgICAgICAgIC8vaG9zdCAtIDQgYnl0ZXMKKyAgICAgICAgLy9ubGVuIC0gNCBieXRlcworICAgICAgICAvL25hbWUgLSBubGVuIGJ5dGVzCisgICAgICAgIC8vZGxlbiAtIDQgYnl0ZXMKKyAgICAgICAgLy9kb21haW4gLSBkbGVuIGJ5dGVzCisgICAgICAgIGJ5dGVbXSBuYW1lZCA9IGdldE5hbWUoKS5nZXRCeXRlcygpOworICAgICAgICBieXRlW10gZG9tYWluZCA9IGdldERvbWFpbigpLmdldEJ5dGVzKCk7CisgICAgICAgIGJ5dGVbXSBhZGRyID0gamF2YS5uZXQuSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGhvc3QpLmdldEFkZHJlc3MoKTsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVs4KzQrYWRkci5sZW5ndGgrNCtuYW1lZC5sZW5ndGgrNCtkb21haW5kLmxlbmd0aF07CisgICAgICAgIGxvbmcgYWxpdmU9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktc3RhcnRUaW1lOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KFhCeXRlQnVmZmVyLnRvQnl0ZXMoKGxvbmcpYWxpdmUpLDAsZGF0YSwwLDgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KFhCeXRlQnVmZmVyLnRvQnl0ZXMocG9ydCksMCxkYXRhLDgsNCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYWRkciwwLGRhdGEsMTIsYWRkci5sZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KFhCeXRlQnVmZmVyLnRvQnl0ZXMobmFtZWQubGVuZ3RoKSwwLGRhdGEsMTYsNCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmFtZWQsMCxkYXRhLDIwLG5hbWVkLmxlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoWEJ5dGVCdWZmZXIudG9CeXRlcyhkb21haW5kLmxlbmd0aCksMCxkYXRhLG5hbWVkLmxlbmd0aCsyMCw0KTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShkb21haW5kLDAsZGF0YSxuYW1lZC5sZW5ndGgrMjQsZG9tYWluZC5sZW5ndGgpOworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIGEgbWVtYmVyIGZyb20gZGF0YSBzZW50IG92ZXIgdGhlIHdpcmUKKyAgICAgKiBAcGFyYW0gZGF0YSAtIHRoZSBieXRlcyByZWNlaXZlZAorICAgICAqIEByZXR1cm4gYSBtZW1iZXIgb2JqZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgTWNhc3RNZW1iZXIgZ2V0TWVtYmVyKGJ5dGVbXSBkYXRhKSB7CisgICAgICAgLy9wYWNrYWdlIGxvb2tzIGxpa2UKKyAgICAgICAvL2FsaXZlIC0gOCBieXRlcworICAgICAgIC8vcG9ydCAtIDQgYnl0ZXMKKyAgICAgICAvL2hvc3QgLSA0IGJ5dGVzCisgICAgICAgLy9ubGVuIC0gNCBieXRlcworICAgICAgIC8vbmFtZSAtIG5sZW4gYnl0ZXMKKyAgICAgICAvL2RsZW4gLSA0IGJ5dGVzCisgICAgICAgLy9kb21haW4gLSBkbGVuIGJ5dGVzCisgICAgICAgYnl0ZVtdIGFsaXZlZCA9IG5ldyBieXRlWzhdOworICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgYWxpdmVkLCAwLCA4KTsKKyAgICAgICBieXRlW10gcG9ydGQgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDgsIHBvcnRkLCAwLCA0KTsKKyAgICAgICBieXRlW10gYWRkciA9IG5ldyBieXRlWzRdOworICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMTIsIGFkZHIsIDAsIDQpOworICAgICAgIC8vRklYTUUgY29udHJvbCB0aGUgbmxlbgorICAgICAgIGJ5dGVbXSBubGVuZCA9IG5ldyBieXRlWzRdOworICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMTYsIG5sZW5kLCAwLCA0KTsKKyAgICAgICBpbnQgbmxlbiA9IFhCeXRlQnVmZmVyLnRvSW50KG5sZW5kLCAwKTsKKyAgICAgICBieXRlW10gbmFtZWQgPSBuZXcgYnl0ZVtubGVuXTsKKyAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDIwLCBuYW1lZCwgMCwgbmFtZWQubGVuZ3RoKTsKKyAgICAgICAvL0ZJWE1FIGNvbnRyb2wgdGhlIGRsZW4KKyAgICAgICBieXRlW10gZGxlbmQgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIG5sZW4gKyAyMCwgZGxlbmQsIDAsIDQpOworICAgICAgIGludCBkbGVuID0gWEJ5dGVCdWZmZXIudG9JbnQoZGxlbmQsIDApOworICAgICAgIGJ5dGVbXSBkb21haW5kID0gbmV3IGJ5dGVbZGxlbl07CisgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCBubGVuICsgMjQsIGRvbWFpbmQsIDAsIGRvbWFpbmQubGVuZ3RoKTsKKyAgICAgICByZXR1cm4gbmV3IE1jYXN0TWVtYmVyKG5ldyBTdHJpbmcobmFtZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhkb21haW5kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NUb1N0cmluZyhhZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhCeXRlQnVmZmVyLnRvSW50KHBvcnRkLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhCeXRlQnVmZmVyLnRvTG9uZyhhbGl2ZWQsIDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBvYmplY3QKKyAgICAgKiBAcmV0dXJuIGEgdW5pcXVlIG5hbWUgdG8gdGhlIGNsdXN0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRvbWFpbiBvZiB0aGlzIG9iamVjdAorICAgICAqIEByZXR1cm4gYSBjbHVzdGVyIGRvbWFpbiB0byB0aGUgY2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gZG9tYWluOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxpc3RlbiBwb3J0IG9mIHRoaXMgbWVtYmVyCisgICAgICogQHJldHVybiAtIHRjcCBsaXN0ZW4gcG9ydAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpICB7CisgICAgICAgIHJldHVybiB0aGlzLnBvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBUQ1AgbGlzdGVuIGhvc3QgZm9yIHRoaXMgbWVtYmVyCisgICAgICogQHJldHVybiBJUCBhZGRyZXNzIG9yIGhvc3QgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpICB7CisgICAgICAgIHJldHVybiB0aGlzLmhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udGFpbnMgaW5mb3JtYXRpb24gb24gaG93IGxvbmcgdGhpcyBtZW1iZXIgaGFzIGJlZW4gb25saW5lLgorICAgICAqIFRoZSByZXN1bHQgaXMgdGhlIG51bWJlciBvZiBtaWxsaSBzZWNvbmRzIHRoaXMgbWVtYmVyIGhhcyBiZWVuCisgICAgICogYnJvYWRjYXN0aW5nIGl0cyBtZW1iZXJzaGlwIHRvIHRoZSBjbHVzdGVyLgorICAgICAqIEByZXR1cm4gbnIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHRoaXMgbWVtYmVyIHN0YXJ0ZWQuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TWVtYmVyQWxpdmVUaW1lKCkgeworICAgICAgIHJldHVybiBtZW1iZXJBbGl2ZVRpbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWVtYmVyQWxpdmVUaW1lKGxvbmcgdGltZSkgeworICAgICAgIG1lbWJlckFsaXZlVGltZT10aW1lOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgIHsKKyAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIubWNhc3QuTWNhc3RNZW1iZXJbIituYW1lKyIsIitkb21haW4rIiwiK2hvc3QrIiwiK3BvcnQrIiwgYWxpdmU9IittZW1iZXJBbGl2ZVRpbWUrIl0iOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCisgICAgICogQHJldHVybiBUaGUgaGFzaCBjb2RlCisgICAgICovCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFyYW0gbyBpcyBhIE1jYXN0TWVtYmVyIHdpdGggdGhlIHNhbWUgbmFtZQorICAgICAqIEBwYXJhbSBvCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICggbyBpbnN0YW5jZW9mIE1jYXN0TWVtYmVyICkgICAgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZS5lcXVhbHMoKChNY2FzdE1lbWJlcilvKS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyBmb3IgYnl0ZXMgKGlwIGFkZHJlc3MpIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGl0PEJSPgorICAgICAqIEhpZ2hseSBvcHRpbWl6ZWQgbWV0aG9kLgorICAgICAqIEBwYXJhbSBhZGRyZXNzICg0IGJ5dGVzIGlwIGFkZHJlc3MpCisgICAgICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhhdCBpcCBhZGRyZXNzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGFkZHJlc3NUb1N0cmluZyhieXRlW10gYWRkcmVzcykgeworICAgICAgICBpbnQgcSwgciA9IDA7CisgICAgICAgIGludCBjaGFyUG9zID0gMTU7CisgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhclsxNV07CisgICAgICAgIGNoYXIgZG90ID0gJy4nOworCisgICAgICAgIGludCBpID0gYWRkcmVzc1szXSAmIDB4RkY7CisgICAgICAgIGZvciAoOyA7ICkKKyAgICAgICAgeworICAgICAgICAgICAgcSA9IChpICogNTI0MjkpID4+PiAoMTkpOworICAgICAgICAgICAgciA9IGkgLSAoIChxIDw8IDMpICsgKHEgPDwgMSkpOworICAgICAgICAgICAgYnVmWy0tY2hhclBvc10gPSBkaWdpdHNbcl07CisgICAgICAgICAgICBpID0gcTsKKyAgICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnVmWy0tY2hhclBvc10gPSBkb3Q7CisgICAgICAgIGkgPSBhZGRyZXNzWzJdICYgMHhGRjsKKyAgICAgICAgZm9yICg7IDsgKQorICAgICAgICB7CisgICAgICAgICAgICBxID0gKGkgKiA1MjQyOSkgPj4+ICgxOSk7CisgICAgICAgICAgICByID0gaSAtICggKHEgPDwgMykgKyAocSA8PCAxKSk7CisgICAgICAgICAgICBidWZbLS1jaGFyUG9zXSA9IGRpZ2l0c1tyXTsKKyAgICAgICAgICAgIGkgPSBxOworICAgICAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBidWZbLS1jaGFyUG9zXSA9IGRvdDsKKworICAgICAgICBpID0gYWRkcmVzc1sxXSAmIDB4RkY7CisgICAgICAgIGZvciAoOyA7ICkKKyAgICAgICAgeworICAgICAgICAgICAgcSA9IChpICogNTI0MjkpID4+PiAoMTkpOworICAgICAgICAgICAgciA9IGkgLSAoIChxIDw8IDMpICsgKHEgPDwgMSkpOworICAgICAgICAgICAgYnVmWy0tY2hhclBvc10gPSBkaWdpdHNbcl07CisgICAgICAgICAgICBpID0gcTsKKyAgICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBidWZbLS1jaGFyUG9zXSA9IGRvdDsKKyAgICAgICAgaSA9IGFkZHJlc3NbMF0gJiAweEZGOworCisgICAgICAgIGZvciAoOyA7ICkKKyAgICAgICAgeworICAgICAgICAgICAgcSA9IChpICogNTI0MjkpID4+PiAoMTkpOworICAgICAgICAgICAgciA9IGkgLSAoIChxIDw8IDMpICsgKHEgPDwgMSkpOworICAgICAgICAgICAgYnVmWy0tY2hhclBvc10gPSBkaWdpdHNbcl07CisgICAgICAgICAgICBpID0gcTsKKyAgICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCBjaGFyUG9zLCAxNSAtIGNoYXJQb3MpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldE1zZ0NvdW50KGludCBtc2dDb3VudCkgeworICAgICAgICB0aGlzLm1zZ0NvdW50ID0gbXNnQ291bnQ7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0RG9tYWluKFN0cmluZyBkb21haW4pIHsKKyAgICAgICAgdGhpcy5kb21haW4gPSBkb21haW47CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHBvcnQpIHsKKyAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWNhc3QvTWNhc3RNZW1iZXJzaGlwLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWNhc3QvTWNhc3RNZW1iZXJzaGlwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3N2FjOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9tY2FzdC9NY2FzdE1lbWJlcnNoaXAuamF2YQpAQCAtMCwwICsxLDI4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLm1jYXN0OworCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogQSA8Yj5tZW1iZXJzaGlwPC9iPiBpbXBsZW1lbnRhdGlvbiB1c2luZyBzaW1wbGUgbXVsdGljYXN0LgorICogVGhpcyBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYSBtdWx0aWNhc3QgbWVtYmVyc2hpcC4KKyAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIGEgbGlzdCBvZiBhY3RpdmUgY2x1c3RlciBub2RlcyBpbiB0aGUgY2x1c3Rlci4KKyAqIElmIGEgbm9kZSBmYWlscyB0byBzZW5kIG91dCBhIGhlYXJ0YmVhdCwgdGhlIG5vZGUgd2lsbCBiZSBkaXNtaXNzZWQuCisgKgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBNY2FzdE1lbWJlcnNoaXAKK3sKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1jYXN0TWVtYmVyW10gRU1QVFlfTUVNQkVSUyA9IG5ldyBNY2FzdE1lbWJlclswXTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIG1lbWJlcnNoaXAsIGhhcyB0byBiZSB0aGUgc2FtZSBhcyB0aGUgbmFtZSBmb3IgdGhlIGxvY2FsCisgICAgICogbWVtYmVyCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOworICAgIAorICAgIC8qKgorICAgICAqIEEgbWFwIG9mIGFsbCB0aGUgbWVtYmVycyBpbiB0aGUgY2x1c3Rlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgCisgICAgLyoqCisgICAgICogQSBsaXN0IG9mIGFsbCB0aGUgbWVtYmVycyBpbiB0aGUgY2x1c3Rlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWNhc3RNZW1iZXJbXSBtZW1iZXJzID0gRU1QVFlfTUVNQkVSUzsKKyAgICAKKyAgICAvKioKKyAgICAgICogc29ydCBtZW1iZXJzIGJ5IGFsaXZlIHRpbWUKKyAgICAgICovCisgICAgcHJvdGVjdGVkIE1lbWJlckNvbXBhcmF0b3IgbWVtYmVyQ29tcGFyYXRvciA9IG5ldyBNZW1iZXJDb21wYXJhdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lbWJlcnNoaXAKKyAgICAgKiBAcGFyYW0gbmFtZSAtIGhhcyB0byBiZSB0aGUgbmFtZSBvZiB0aGUgbG9jYWwgbWVtYmVyLiBVc2VkIHRvIGZpbHRlciB0aGUgbG9jYWwgbWVtYmVyIGZyb20gdGhlIGNsdXN0ZXIgbWVtYmVyc2hpcAorICAgICAqLworICAgIHB1YmxpYyBNY2FzdE1lbWJlcnNoaXAoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldCB0aGUgbWVtYmVyc2hpcCBhbmQgc3RhcnQgb3ZlciBmcmVzaC4KKyAgICAgKiBJZSwgZGVsZXRlIGFsbCB0aGUgbWVtYmVycyBhbmQgd2FpdCBmb3IgdGhlbSB0byBwaW5nIGFnYWluIGFuZCBqb2luIHRoaXMgbWVtYmVyc2hpcAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbWFwLmNsZWFyKCk7CisgICAgICAgIG1lbWJlcnMgPSBFTVBUWV9NRU1CRVJTIDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIG1lbWJlcnNoaXAgdGhhdCB0aGlzIG1lbWJlciBoYXMgYW5ub3VuY2VkIGl0c2VsZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZW1iZXIgLSB0aGUgbWVtYmVyIHRoYXQganVzdCBwaW5nZWQgdXMKKyAgICAgKiBAcmV0dXJuIC0gdHJ1ZSBpZiB0aGlzIG1lbWJlciBpcyBuZXcgdG8gdGhlIGNsdXN0ZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIC0gZmFsc2UgaWYgdGhpcyBtZW1iZXIgaXMgdGhlIGxvY2FsIG1lbWJlciBvciB1cGRhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBtZW1iZXJBbGl2ZShNY2FzdE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgLy9pZ25vcmUgb3Vyc2VsdmVzCisgICAgICAgIGlmICggbWVtYmVyLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgKSByZXR1cm4gcmVzdWx0OworCisgICAgICAgIC8vcmV0dXJuIHRydWUgaWYgdGhlIG1lbWJlcnNoaXAgaGFzIGNoYW5nZWQKKyAgICAgICAgTWJyRW50cnkgZW50cnkgPSAoTWJyRW50cnkpbWFwLmdldChtZW1iZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKCBlbnRyeSA9PSBudWxsICkgeworICAgICAgICAgICAgZW50cnkgPSBuZXcgTWJyRW50cnkobWVtYmVyKTsKKyAgICAgICAgICAgIG1hcC5wdXQobWVtYmVyLmdldE5hbWUoKSxlbnRyeSk7CisgICAgICAgICAgICBhZGRNY2FzdE1lbWJlcihtZW1iZXIpOworICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy91cGRhdGUgdGhlIG1lbWJlciBhbGl2ZSB0aW1lCisgICAgICAgICAgICBNY2FzdE1lbWJlciB1cGRhdGVNZW1iZXIgPSBlbnRyeS5nZXRNZW1iZXIoKSA7CisgICAgICAgICAgICBpZih1cGRhdGVNZW1iZXIuZ2V0TWVtYmVyQWxpdmVUaW1lKCkgIT0gbWVtYmVyLmdldE1lbWJlckFsaXZlVGltZSgpKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlTWVtYmVyLnNldE1lbWJlckFsaXZlVGltZShtZW1iZXIuZ2V0TWVtYmVyQWxpdmVUaW1lKCkpOworICAgICAgICAgICAgICAgIEFycmF5cy5zb3J0KG1lbWJlcnMsIG1lbWJlckNvbXBhcmF0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVudHJ5LmFjY2Vzc2VkKCk7CisgCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbWVtYmVyIHRvIHRoaXMgY29tcG9uZW50IGFuZCBzb3J0IGFycmF5IHdpdGggbWVtYmVyQ29tcGFyYXRvcgorICAgICAqIEBwYXJhbSBtZW1iZXIgVGhlIG1lbWJlciB0byBhZGQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRNY2FzdE1lbWJlcihNY2FzdE1lbWJlciBtZW1iZXIpIHsKKyAgICAgIHN5bmNocm9uaXplZCAobWVtYmVycykgeworICAgICAgICAgIE1jYXN0TWVtYmVyIHJlc3VsdHNbXSA9CisgICAgICAgICAgICBuZXcgTWNhc3RNZW1iZXJbbWVtYmVycy5sZW5ndGggKyAxXTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSBtZW1iZXJzW2ldOworICAgICAgICAgIHJlc3VsdHNbbWVtYmVycy5sZW5ndGhdID0gbWVtYmVyOworICAgICAgICAgIG1lbWJlcnMgPSByZXN1bHRzOworICAgICAgICAgIEFycmF5cy5zb3J0KG1lbWJlcnMsIG1lbWJlckNvbXBhcmF0b3IpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBtZW1iZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVtYmVyIFRoZSBtZW1iZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTWNhc3RNZW1iZXIoTWNhc3RNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobWVtYmVycykgeworICAgICAgICAgICAgaW50IG4gPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtZW1iZXJzW2ldID09IG1lbWJlcikgeworICAgICAgICAgICAgICAgICAgICBuID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIE1jYXN0TWVtYmVyIHJlc3VsdHNbXSA9CisgICAgICAgICAgICAgIG5ldyBNY2FzdE1lbWJlclttZW1iZXJzLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgaW50IGogPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gbikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tqKytdID0gbWVtYmVyc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWJlcnMgPSByZXN1bHRzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyBhIHJlZnJlc2ggY3ljbGUgYW5kIHJldHVybnMgYSBsaXN0IG9mIG1lbWJlcnMgdGhhdCBoYXMgZXhwaXJlZC4KKyAgICAgKiBUaGlzIGFsc28gcmVtb3ZlcyB0aGUgbWVtYmVycyBmcm9tIHRoZSBtZW1iZXJzaGlwLCBpbiBzdWNoIGEgd2F5IHRoYXQKKyAgICAgKiBnZXRNZW1iZXJzKCkgPSBnZXRNZW1iZXJzKCkgLSBleHBpcmUoKQorICAgICAqIEBwYXJhbSBtYXh0aW1lIC0gdGhlIG1heCB0aW1lIGEgbWVtYmVyIGNhbiByZW1haW4gdW5hbm5vdW5jZWQgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgZGVhZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGV4cGlyZWQgbWVtYmVycworICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWNhc3RNZW1iZXJbXSBleHBpcmUobG9uZyBtYXh0aW1lKSB7CisgICAgICAgIGlmKCFoYXNNZW1iZXJzKCkgKQorICAgICAgICAgICByZXR1cm4gRU1QVFlfTUVNQkVSUzsKKyAgICAgICAKKyAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBudWxsOworICAgICAgICBJdGVyYXRvciBpID0gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBNYnJFbnRyeSBlbnRyeSA9IChNYnJFbnRyeSlpLm5leHQoKTsKKyAgICAgICAgICAgIGlmKCBlbnRyeS5oYXNFeHBpcmVkKG1heHRpbWUpICkgeworICAgICAgICAgICAgICAgIGlmKGxpc3QgPT0gbnVsbCkgLy8gb25seSBuZWVkIGEgbGlzdCB3aGVuIG1lbWJlcnMgYXJlIGV4cGlyZWQgKHNtYWxsZXIgZ2MpCisgICAgICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGVudHJ5LmdldE1lbWJlcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYobGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBNY2FzdE1lbWJlcltdIHJlc3VsdCA9IG5ldyBNY2FzdE1lbWJlcltsaXN0LnNpemUoKV07CisgICAgICAgICAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKKyAgICAgICAgICAgIGZvciggaW50IGo9MDsgajxyZXN1bHQubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBtYXAucmVtb3ZlKHJlc3VsdFtqXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIHJlbW92ZU1jYXN0TWVtYmVyKHJlc3VsdFtqXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEVNUFRZX01FTUJFUlMgOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuaW5nIHRoYXQgc2VydmljZSBoYXMgbWVtYmVycyBvciBub3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzTWVtYmVycygpIHsKKyAgICAgICAgcmV0dXJuIG1lbWJlcnMubGVuZ3RoID4gMCA7CisgICAgfQorIAorICAgIC8qKgorICAgICAqIFJldHVybmluZyBhIGxpc3Qgb2YgYWxsIHRoZSBtZW1iZXJzIGluIHRoZSBtZW1iZXJzaGlwCisgICAgICogV2Ugbm90IG5lZWQgYSBjb3B5OiBhZGQgYW5kIHJlbW92ZSBnZW5lcmF0ZSBuZXcgYXJyYXlzLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWNhc3RNZW1iZXJbXSBnZXRNZW1iZXJzKCkgeworICAgICAgICBpZihoYXNNZW1iZXJzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtZW1iZXJzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEVNUFRZX01FTUJFUlM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgYSBjb3B5IGZyb20gYWxsIG1lbWJlciBlbnRyaWVzCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBNYnJFbnRyeVtdIGdldE1lbWJlckVudHJpZXMoKQorICAgIHsKKyAgICAgICAgTWJyRW50cnlbXSByZXN1bHQgPSBuZXcgTWJyRW50cnlbbWFwLnNpemUoKV07CisgICAgICAgIGphdmEudXRpbC5JdGVyYXRvciBpID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIHdoaWxlICggaS5oYXNOZXh0KCkgKQorICAgICAgICAgICAgcmVzdWx0W3BvcysrXSA9ICgoTWJyRW50cnkpKChqYXZhLnV0aWwuTWFwLkVudHJ5KWkubmV4dCgpKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElubmVyIENsYXNzCisKKyAgICBwcml2YXRlIGNsYXNzIE1lbWJlckNvbXBhcmF0b3IgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29tcGFyYXRvciB7CisKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlKChNY2FzdE1lbWJlcikgbzEsIChNY2FzdE1lbWJlcikgbzIpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShNY2FzdE1lbWJlciBtMSwgTWNhc3RNZW1iZXIgbTIpIHsKKyAgICAgICAgICAgIC8vbG9uZ2VyIGFsaXZlIHRpbWUsIG1lYW5zIHNvcnQgZmlyc3QKKyAgICAgICAgICAgIGxvbmcgcmVzdWx0ID0gbTIuZ2V0TWVtYmVyQWxpdmVUaW1lKCkgLSBtMS5nZXRNZW1iZXJBbGl2ZVRpbWUoKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIElubmVyIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIG1lbWJlciBlbnRyeQorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTWJyRW50cnkKKyAgICB7CisKKyAgICAgICAgcHJvdGVjdGVkIE1jYXN0TWVtYmVyIG1icjsKKyAgICAgICAgcHJvdGVjdGVkIGxvbmcgbGFzdEhlYXJkRnJvbTsKKworICAgICAgICBwdWJsaWMgTWJyRW50cnkoTWNhc3RNZW1iZXIgbWJyKSB7CisgICAgICAgICAgIHRoaXMubWJyID0gbWJyOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyBtZW1iZXIgaGFzIGJlZW4gYWNjZXNzZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhY2Nlc3NlZCgpeworICAgICAgICAgICBsYXN0SGVhcmRGcm9tID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBhY3R1YWwgTWNhc3RNZW1iZXIgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWNhc3RNZW1iZXIgZ2V0TWVtYmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1icjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVjayBpZiB0aGlzIGR1ZGUgaGFzIGV4cGlyZWQKKyAgICAgICAgICogQHBhcmFtIG1heHRpbWUgVGhlIHRpbWUgdGhyZXNob2xkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNFeHBpcmVkKGxvbmcgbWF4dGltZSkgeworICAgICAgICAgICAgbG9uZyBkZWx0YSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gbGFzdEhlYXJkRnJvbTsKKyAgICAgICAgICAgIHJldHVybiBkZWx0YSA+IG1heHRpbWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWNhc3QvTWNhc3RTZXJ2aWNlLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWNhc3QvTWNhc3RTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4NThkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9tY2FzdC9NY2FzdFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDUwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLm1jYXN0OworCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXJzaGlwTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcnNoaXBTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuU2ltcGxlVGNwQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworCisvKioKKyAqIEEgPGI+bWVtYmVyc2hpcDwvYj4gaW1wbGVtZW50YXRpb24gdXNpbmcgc2ltcGxlIG11bHRpY2FzdC4KKyAqIFRoaXMgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGEgbXVsdGljYXN0IG1lbWJlcnNoaXAgc2VydmljZS4KKyAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIGEgbGlzdCBvZiBhY3RpdmUgY2x1c3RlciBub2RlcyBpbiB0aGUgY2x1c3Rlci4KKyAqIElmIGEgbm9kZSBmYWlscyB0byBzZW5kIG91dCBhIGhlYXJ0YmVhdCwgdGhlIG5vZGUgd2lsbCBiZSBkaXNtaXNzZWQuCisgKgorICogRklYTUUgaTE4biBtZXNzYWdlcworICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCisKK3B1YmxpYyBjbGFzcyBNY2FzdFNlcnZpY2UgaW1wbGVtZW50cyBNZW1iZXJzaGlwU2VydmljZSxNZW1iZXJzaGlwTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBNY2FzdFNlcnZpY2UuY2xhc3MgKTsKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdNYW5hZ2VyIHNtID0gU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIk1jYXN0U2VydmljZS8yLjEiOworCisgICAgLyoqCisgICAgICogVGhlIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIHByb3BlcnRpZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAvKioKKyAgICAgKiBBIGhhbmRsZSB0byB0aGUgYWN0dWFsIGxvdyBsZXZlbCBpbXBsZW1lbnRhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBNY2FzdFNlcnZpY2VJbXBsIGltcGw7CisgICAgLyoqCisgICAgICogQSBtZW1iZXJzaGlwIGxpc3RlbmVyIGRlbGVnYXRlIChzaG91bGQgYmUgdGhlIGNsdXN0ZXIgOikKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWVtYmVyc2hpcExpc3RlbmVyIGxpc3RlbmVyOworICAgIC8qKgorICAgICAqIFRoZSBsb2NhbCBtZW1iZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWNhc3RNZW1iZXIgbG9jYWxNZW1iZXIgOworICAgIHByaXZhdGUgaW50IG1jYXN0U29UaW1lb3V0OworICAgIHByaXZhdGUgaW50IG1jYXN0VFRMOworCisgICAgLyoqCisgICAgICogbXkgY2x1c3RlcgorICAgICAqLworICAgIHByaXZhdGUgU2ltcGxlVGNwQ2x1c3RlciBjbHVzdGVyOworCisgICAgLyoqCisgICAgICogVHJhbnNtaXR0ZXIgTWJlYW4gbmFtZQorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0TmFtZSBvYmplY3ROYW1lOworCisgICAgcHJpdmF0ZSBSZWdpc3RyeSByZWdpc3RyeTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG1lbWJlcnNoaXAgc2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWNhc3RTZXJ2aWNlKCkgeworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJtY2FzdENsdXN0ZXJEb21haW4iLCAiY2F0YWxpbmEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisgICAgICAgIHJldHVybiAoaW5mbyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRyYW5zbWl0dGVyIE9iamVjdE5hbWUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdE5hbWUoT2JqZWN0TmFtZSBuYW1lKSB7CisgICAgICAgIG9iamVjdE5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3ROYW1lIGdldE9iamVjdE5hbWUoKSB7CisgICAgICAgIHJldHVybiBvYmplY3ROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMKKyAgICAgKiA8QlIvPkFsbCBhcmUgcmVxdWlyZWQ8QlIgLz4KKyAgICAgKiAxLiBtY2FzdFBvcnQgLSB0aGUgcG9ydCB0byBsaXN0ZW4gdG88QlI+CisgICAgICogMi4gbWNhc3RBZGRyZXNzIC0gdGhlIG1jYXN0IGdyb3VwIGFkZHJlc3M8QlI+CisgICAgICogMy4gbWNhc3RDbHVzdGVyRG9tYWluIC0gdGhlIG1jYXN0IGNsdXN0ZXIgZG9tYWluPEJSPgorICAgICAqIDQuIGJpbmRBZGRyZXNzIC0gdGhlIGJpbmQgYWRkcmVzcyBpZiBhbnkgLSBvbmx5IG9uZSB0aGF0IGNhbiBiZSBudWxsPEJSPgorICAgICAqIDUuIG1lbWJlckRyb3BUaW1lIC0gdGhlIHRpbWUgYSBtZW1iZXIgaXMgZ29uZSBiZWZvcmUgaXQgaXMgY29uc2lkZXJlZCBnb25lLjxCUj4KKyAgICAgKiA2LiBtc2dGcmVxdWVuY3kgLSB0aGUgZnJlcXVlbmN5IG9mIHNlbmRpbmcgbWVzc2FnZXM8QlI+CisgICAgICogNy4gdGNwTGlzdGVuUG9ydCAtIHRoZSBwb3J0IHRoaXMgbWVtYmVyIGxpc3RlbnMgdG88QlI+CisgICAgICogOC4gdGNwTGlzdGVuSG9zdCAtIHRoZSBiaW5kIGFkZHJlc3Mgb2YgdGhpcyBtZW1iZXI8QlI+CisgICAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGEgcHJvcGVydHkgaXMgbWlzc2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgeworICAgICAgICBoYXNQcm9wZXJ0eShwcm9wZXJ0aWVzLCJtY2FzdFBvcnQiKTsKKyAgICAgICAgaGFzUHJvcGVydHkocHJvcGVydGllcywibWNhc3RBZGRyZXNzIik7CisgICAgICAgIGhhc1Byb3BlcnR5KHByb3BlcnRpZXMsIm1jYXN0Q2x1c3RlckRvbWFpbiIpOworICAgICAgICBoYXNQcm9wZXJ0eShwcm9wZXJ0aWVzLCJtZW1iZXJEcm9wVGltZSIpOworICAgICAgICBoYXNQcm9wZXJ0eShwcm9wZXJ0aWVzLCJtc2dGcmVxdWVuY3kiKTsKKyAgICAgICAgaGFzUHJvcGVydHkocHJvcGVydGllcywidGNwTGlzdGVuUG9ydCIpOworICAgICAgICBoYXNQcm9wZXJ0eShwcm9wZXJ0aWVzLCJ0Y3BMaXN0ZW5Ib3N0Iik7CisgICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm9wZXJ0aWVzLCBzZWUgc2V0UHJvcGVydGllcworICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOworICAgIH0KKworICAgIC8qCisgICAgICogY29uZmlndXJlZCBpbiBjbHVzdGVyCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclNlbmRlciNzZXRDYXRhbGluYUNsdXN0ZXIob3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5TaW1wbGVUY3BDbHVzdGVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhdGFsaW5hQ2x1c3RlcihTaW1wbGVUY3BDbHVzdGVyIGNsdXN0ZXIpIHsKKyAgICAgICAgdGhpcy5jbHVzdGVyID0gY2x1c3RlcjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2x1c3RlciBmb3IgdGhpcyBtZW1iZXJzaGlwIHNlcnZpY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2x1c3RlciBnZXRDYXRhbGluYUNsdXN0ZXIoKSB7CisgICAgICAgIHJldHVybiBjbHVzdGVyIDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2FsIG1lbWJlciBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE1lbWJlck5hbWUoKSB7CisgICAgICAgIHJldHVybiBsb2NhbE1lbWJlci50b1N0cmluZygpIDsKKyAgICB9CisgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2NhbCBtZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyIGdldExvY2FsTWVtYmVyKCkgeworICAgICAgICBsb2NhbE1lbWJlci5zZXRNZW1iZXJBbGl2ZVRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktaW1wbC5nZXRTZXJ2aWNlU3RhcnRUaW1lKCkpOworICAgICAgICByZXR1cm4gbG9jYWxNZW1iZXI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxvY2FsIG1lbWJlciBwcm9wZXJ0aWVzIGZvciBicm9hZGNhc3RpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE1lbWJlclByb3BlcnRpZXMoU3RyaW5nIGxpc3Rlbkhvc3QsIGludCBsaXN0ZW5Qb3J0KSB7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoInRjcExpc3Rlbkhvc3QiLGxpc3Rlbkhvc3QpOworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJ0Y3BMaXN0ZW5Qb3J0IixTdHJpbmcudmFsdWVPZihsaXN0ZW5Qb3J0KSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldE1jYXN0QWRkcihTdHJpbmcgYWRkcikgeworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJtY2FzdEFkZHJlc3MiLCBhZGRyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1jYXN0QWRkcigpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1jYXN0QWRkcmVzcyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1jYXN0QmluZEFkZHJlc3MoU3RyaW5nIGJpbmRhZGRyKSB7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm1jYXN0QmluZEFkZHJlc3MiLCBiaW5kYWRkcik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNY2FzdEJpbmRBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibWNhc3RCaW5kQWRkcmVzcyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1jYXN0Q2x1c3RlckRvbWFpbihTdHJpbmcgY2x1c3RlckRvbWFpbikgeworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJtY2FzdENsdXN0ZXJEb21haW4iLCBjbHVzdGVyRG9tYWluKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1jYXN0Q2x1c3RlckRvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1jYXN0Q2x1c3RlckRvbWFpbiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1jYXN0UG9ydChpbnQgcG9ydCkgeworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJtY2FzdFBvcnQiLCBTdHJpbmcudmFsdWVPZihwb3J0KSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNY2FzdFBvcnQoKSB7CisgICAgICAgIFN0cmluZyBwID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibWNhc3RQb3J0Iik7CisgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihwKS5pbnRWYWx1ZSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRNY2FzdEZyZXF1ZW5jeShsb25nIHRpbWUpIHsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgibXNnRnJlcXVlbmN5IiwgU3RyaW5nLnZhbHVlT2YodGltZSkpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldE1jYXN0RnJlcXVlbmN5KCkgeworICAgICAgICBTdHJpbmcgcCA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1zZ0ZyZXF1ZW5jeSIpOworICAgICAgICByZXR1cm4gbmV3IExvbmcocCkubG9uZ1ZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWNhc3REcm9wVGltZShsb25nIHRpbWUpIHsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgibWVtYmVyRHJvcFRpbWUiLCBTdHJpbmcudmFsdWVPZih0aW1lKSk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0TWNhc3REcm9wVGltZSgpIHsKKyAgICAgICAgU3RyaW5nIHAgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJtZW1iZXJEcm9wVGltZSIpOworICAgICAgICByZXR1cm4gbmV3IExvbmcocCkubG9uZ1ZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYSByZXF1aXJlZCBwcm9wZXJ0eSBpcyBhdmFpbGFibGUuCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHNldCBvZiBwcm9wZXJ0aWVzCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHByb3BlcnR5IHRvIGNoZWNrIGZvcgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhc1Byb3BlcnR5KFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIG5hbWUpeworICAgICAgICBpZiAoIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkobmFtZSk9PW51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlcXVpcmVkIHByb3BlcnR5IFwiIituYW1lKyJcIiBpcyBtaXNzaW5nLiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGJyb2FkY2FzdGluZyBhbmQgbGlzdGVuaW5nIHRvIG1lbWJlcnNoaXAgcGluZ3MKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gaWYgYSBJTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnQoMSk7CisgICAgICAgIHN0YXJ0KDIpOworICAgICAgICByZWdpc3Rlck1CZWFuKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGludCBsZXZlbCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24geworICAgICAgICBpZiAoIGltcGwgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIGltcGwuc3RhcnQobGV2ZWwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBob3N0ID0gZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJ0Y3BMaXN0ZW5Ib3N0Iik7CisgICAgICAgIFN0cmluZyBkb21haW4gPSBnZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoIm1jYXN0Q2x1c3RlckRvbWFpbiIpOworICAgICAgICBpbnQgcG9ydCA9IEludGVnZXIucGFyc2VJbnQoZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJ0Y3BMaXN0ZW5Qb3J0IikpOworICAgICAgICBTdHJpbmcgbmFtZSA9ICJ0Y3A6Ly8iK2hvc3QrIjoiK3BvcnQ7CisgICAgICAgIGlmICggbG9jYWxNZW1iZXIgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIGxvY2FsTWVtYmVyID0gbmV3IE1jYXN0TWVtYmVyKG5hbWUsIGRvbWFpbiwgaG9zdCwgcG9ydCwgMTAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvY2FsTWVtYmVyLnNldE5hbWUobmFtZSk7CisgICAgICAgICAgICBsb2NhbE1lbWJlci5zZXREb21haW4oZG9tYWluKTsKKyAgICAgICAgICAgIGxvY2FsTWVtYmVyLnNldEhvc3QoaG9zdCk7CisgICAgICAgICAgICBsb2NhbE1lbWJlci5zZXRQb3J0KHBvcnQpOworICAgICAgICAgICAgbG9jYWxNZW1iZXIuc2V0TWVtYmVyQWxpdmVUaW1lKDEwMCk7CisgICAgICAgIH0KKyAgICAgICAgamF2YS5uZXQuSW5ldEFkZHJlc3MgYmluZCA9IG51bGw7CisgICAgICAgIGlmICggcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibWNhc3RCaW5kQWRkcmVzcyIpIT0gbnVsbCApIHsKKyAgICAgICAgICAgIGJpbmQgPSBqYXZhLm5ldC5JbmV0QWRkcmVzcy5nZXRCeU5hbWUocHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibWNhc3RCaW5kQWRkcmVzcyIpKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgdHRsID0gLTE7CisgICAgICAgIGludCBzb1RpbWVvdXQgPSAtMTsKKyAgICAgICAgaWYgKCBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJtY2FzdFRUTCIpICE9IG51bGwgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHR0bCA9IEludGVnZXIucGFyc2VJbnQocHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibWNhc3RUVEwiKSk7CisgICAgICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gcGFyc2UgbWNhc3RUVEw9Iitwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJtY2FzdFRUTCIpLHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICggcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibWNhc3RTb1RpbWVvdXQiKSAhPSBudWxsICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzb1RpbWVvdXQgPSBJbnRlZ2VyLnBhcnNlSW50KHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1jYXN0U29UaW1lb3V0IikpOworICAgICAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHBhcnNlIG1jYXN0U29UaW1lb3V0PSIrcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibWNhc3RTb1RpbWVvdXQiKSx4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGltcGwgPSBuZXcgTWNhc3RTZXJ2aWNlSW1wbCgoTWNhc3RNZW1iZXIpbG9jYWxNZW1iZXIsTG9uZy5wYXJzZUxvbmcocHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibXNnRnJlcXVlbmN5IikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5wYXJzZUxvbmcocHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibWVtYmVyRHJvcFRpbWUiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1jYXN0UG9ydCIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLm5ldC5JbmV0QWRkcmVzcy5nZXRCeU5hbWUocHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibWNhc3RBZGRyZXNzIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29UaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7CisKKyAgICAgICAgaW1wbC5zdGFydChsZXZlbCk7CisJCWxvbmcgbWVtYmVyd2FpdCA9IChMb25nLnBhcnNlTG9uZyhwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJtc2dGcmVxdWVuY3kiKSkqNCk7CisgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuaW5mbygiU2xlZXBpbmcgZm9yICIrbWVtYmVyd2FpdCsiIG1pbGxpc2Vjb25kcyB0byBlc3RhYmxpc2ggY2x1c3RlciBtZW1iZXJzaGlwIik7CisgICAgICAgIFRocmVhZC5zbGVlcChtZW1iZXJ3YWl0KTsKKworICAgIH0KKworIAorICAgIC8qKgorICAgICAqIFN0b3AgYnJvYWRjYXN0aW5nIGFuZCBsaXN0ZW5pbmcgdG8gbWVtYmVyc2hpcCBwaW5ncworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHRyeSAgeworICAgICAgICAgICAgaWYgKCBpbXBsICE9IG51bGwpIGltcGwuc3RvcCgpOworICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHgpICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzdG9wIHRoZSBtY2FzdCBzZXJ2aWNlLiIseCk7CisgICAgICAgIH0KKyAgICAgICAgaW1wbCA9IG51bGw7CisgICAgICAgIHVucmVnaXN0ZXJNQmVhbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlZ2lzdGVyIG1iZWFuIGRlc2NyaXB0b3IgZm9yIHBhY2thZ2UgbWNhc3QgCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0TUJlYW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBpZihyZWdpc3RyeSA9PSBudWxsKSB7CisgICAgICAgIHJlZ2lzdHJ5ID0gUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCk7CisgICAgICAgIHJlZ2lzdHJ5LmxvYWRNZXRhZGF0YSh0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgKKyAgICAgICAgICAgICJtYmVhbnMtZGVzY3JpcHRvcnMueG1sIikpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiByZWdpc3RlciBNQmVhbnMgZm9yIE1lbWJlcnNoaXAKKyAgICAgKgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyTUJlYW4oKSB7CisgICAgICAgIGlmIChjbHVzdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgY2x1c3Rlck5hbWUgPSBjbHVzdGVyLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IGNsdXN0ZXIuZ2V0TUJlYW5TZXJ2ZXIoKTsKKyAgICAgICAgICAgICAgICBpbml0TUJlYW5zKCk7CisgICAgICAgICAgICAgICAgQ29udGFpbmVyIGNvbnRhaW5lciA9IGNsdXN0ZXIuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjbHVzdGVyTmFtZS5nZXREb21haW4oKSArICI6dHlwZT1DbHVzdGVyTWVtYmVyc2hpcCI7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFN0YW5kYXJkSG9zdCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lICs9ICIsaG9zdD0iICsgY2x1c3Rlck5hbWUuZ2V0S2V5UHJvcGVydHkoImhvc3QiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBtY2FzdE5hbWUgPSBuZXcgT2JqZWN0TmFtZShuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAobXNlcnZlci5pc1JlZ2lzdGVyZWQobWNhc3ROYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsdXN0ZXIubWJlYW4ucmVnaXN0ZXIuYWxyZWFkeSIsIG1jYXN0TmFtZSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldE9iamVjdE5hbWUobWNhc3ROYW1lKTsKKyAgICAgICAgICAgICAgICBtc2VydmVyLnJlZ2lzdGVyTUJlYW4oY2x1c3Rlci5nZXRNYW5hZ2VkQmVhbih0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE9iamVjdE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJtZW1iZXJzaGlwIG1iZWFuIHJlZ2lzdGVyZWQgKCIgKyBtY2FzdE5hbWUgKyAiKSIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cud2FybigibWVtYmVyc2hpcCBtYmVhbiBjcmVhdGlvbiBmYWlsZWQgKCIgKyBjbHVzdGVyTmFtZSArICIpIiAsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB1bnJlZ2lzdGVyIE1CZWFucyBmb3IgTWVtYmVyc2hpcAorICAgICAqCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdW5yZWdpc3Rlck1CZWFuKCkgeworICAgICAgICBpZiAoY2x1c3RlciAhPSBudWxsICYmIGdldE9iamVjdE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBjbHVzdGVyLmdldE1CZWFuU2VydmVyKCk7CisgICAgICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4oZ2V0T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCB0aGUgbWVtYmVycyBieSBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldE1lbWJlcnNCeU5hbWUoKSB7CisgICAgICAgIE1lbWJlcltdIGN1cnJlbnRNZW1iZXJzID0gZ2V0TWVtYmVycygpOworICAgICAgICBTdHJpbmcgW10gbWVtYmVybmFtZXMgOworICAgICAgICBpZihjdXJyZW50TWVtYmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBtZW1iZXJuYW1lcyA9IG5ldyBTdHJpbmdbY3VycmVudE1lbWJlcnMubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudE1lbWJlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtZW1iZXJuYW1lc1tpXSA9IGN1cnJlbnRNZW1iZXJzW2ldLnRvU3RyaW5nKCkgOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG1lbWJlcm5hbWVzID0gbmV3IFN0cmluZ1swXSA7CisgICAgICAgIHJldHVybiBtZW1iZXJuYW1lcyA7CisgICAgfQorIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWVtYmVyIGJ5IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyIGZpbmRNZW1iZXJCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgTWVtYmVyW10gY3VycmVudE1lbWJlcnMgPSBnZXRNZW1iZXJzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudE1lbWJlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhjdXJyZW50TWVtYmVyc1tpXS50b1N0cmluZygpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudE1lbWJlcnNbaV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFzIG1lbWJlcnM/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTWVtYmVycygpIHsKKyAgICAgICBpZiAoIGltcGwgPT0gbnVsbCB8fCBpbXBsLm1lbWJlcnNoaXAgPT0gbnVsbCApIHJldHVybiBmYWxzZTsKKyAgICAgICByZXR1cm4gaW1wbC5tZW1iZXJzaGlwLmhhc01lbWJlcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIHRoZSBtZW1iZXJzCisgICAgICovCisgICAgcHVibGljIE1lbWJlcltdIGdldE1lbWJlcnMoKSB7CisgICAgICAgIGlmICggaW1wbCA9PSBudWxsIHx8IGltcGwubWVtYmVyc2hpcCA9PSBudWxsICkgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBpbXBsLm1lbWJlcnNoaXAuZ2V0TWVtYmVycygpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBBZGQgYSBtZW1iZXJzaGlwIGxpc3RlbmVyLCB0aGlzIHZlcnNpb24gb25seSBzdXBwb3J0cyBvbmUgbGlzdGVuZXIgcGVyIHNlcnZpY2UsCisgICAgICogc28gY2FsbGluZyB0aGlzIG1ldGhvZCB0d2ljZSB3aWxsIHJlc3VsdCBpbiBvbmx5IHRoZSBzZWNvbmQgbGlzdGVuZXIgYmVpbmcgYWN0aXZlLgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRNZW1iZXJzaGlwTGlzdGVuZXIoTWVtYmVyc2hpcExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBtZW1iZXJzaGlwIGxpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTWVtYmVyc2hpcExpc3RlbmVyKCl7CisgICAgICAgIGxpc3RlbmVyID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIGlmICggbGlzdGVuZXIhPW51bGwgKSBsaXN0ZW5lci5tZW1iZXJBZGRlZChtZW1iZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZyb20gdGhlIGltcGwgd2hlbiBhIG5ldyBtZW1iZXIgaGFzIGJlZW4gcmVjZWl2ZWQKKyAgICAgKiBAcGFyYW0gbWVtYmVyIFRoZSBtZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJEaXNhcHBlYXJlZChNZW1iZXIgbWVtYmVyKQorICAgIHsKKyAgICAgICAgaWYgKCBsaXN0ZW5lciE9bnVsbCApIGxpc3RlbmVyLm1lbWJlckRpc2FwcGVhcmVkKG1lbWJlcik7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNY2FzdFNvVGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIG1jYXN0U29UaW1lb3V0OworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRNY2FzdFNvVGltZW91dChpbnQgbWNhc3RTb1RpbWVvdXQpIHsKKyAgICAgICAgdGhpcy5tY2FzdFNvVGltZW91dCA9IG1jYXN0U29UaW1lb3V0OworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJtY2FzdFNvVGltZW91dCIsIFN0cmluZy52YWx1ZU9mKG1jYXN0U29UaW1lb3V0KSk7CisgICAgfQorICAgIHB1YmxpYyBpbnQgZ2V0TWNhc3RUVEwoKSB7CisgICAgICAgIHJldHVybiBtY2FzdFRUTDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0TWNhc3RUVEwoaW50IG1jYXN0VFRMKSB7CisgICAgICAgIHRoaXMubWNhc3RUVEwgPSBtY2FzdFRUTDsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgibWNhc3RUVEwiLCBTdHJpbmcudmFsdWVPZihtY2FzdFRUTCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBsZSB0ZXN0IHByb2dyYW0KKyAgICAgKiBAcGFyYW0gYXJncyBDb21tYW5kLWxpbmUgYXJndW1lbnRzCisgICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuaW5mbygiVXNhZ2UgTWNhc3RTZXJ2aWNlIGhvc3RuYW1lIHRjcHBvcnQiKTsKKyAgICAgICAgTWNhc3RTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgTWNhc3RTZXJ2aWNlKCk7CisgICAgICAgIGphdmEudXRpbC5Qcm9wZXJ0aWVzIHAgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5zZXRQcm9wZXJ0eSgibWNhc3RQb3J0IiwiNTU1NSIpOworICAgICAgICBwLnNldFByb3BlcnR5KCJtY2FzdEFkZHJlc3MiLCIyMjQuMTAuMTAuMTAiKTsKKyAgICAgICAgcC5zZXRQcm9wZXJ0eSgibWNhc3RDbHVzdGVyRG9tYWluIiwiY2F0YWxpbmEiKTsKKyAgICAgICAgcC5zZXRQcm9wZXJ0eSgiYmluZEFkZHJlc3MiLCJsb2NhbGhvc3QiKTsKKyAgICAgICAgcC5zZXRQcm9wZXJ0eSgibWVtYmVyRHJvcFRpbWUiLCIzMDAwIik7CisgICAgICAgIHAuc2V0UHJvcGVydHkoIm1zZ0ZyZXF1ZW5jeSIsIjUwMCIpOworICAgICAgICBwLnNldFByb3BlcnR5KCJ0Y3BMaXN0ZW5Qb3J0IixhcmdzWzFdKTsKKyAgICAgICAgcC5zZXRQcm9wZXJ0eSgidGNwTGlzdGVuSG9zdCIsYXJnc1swXSk7CisgICAgICAgIHNlcnZpY2Uuc2V0UHJvcGVydGllcyhwKTsKKyAgICAgICAgc2VydmljZS5zdGFydCgpOworICAgICAgICBUaHJlYWQuc2xlZXAoNjAqMTAwMCo2MCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL21jYXN0L01jYXN0U2VydmljZUltcGwuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9tY2FzdC9NY2FzdFNlcnZpY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJhYmE3OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9tY2FzdC9NY2FzdFNlcnZpY2VJbXBsLmphdmEKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5tY2FzdDsKKworCitpbXBvcnQgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0OworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3MgOworaW1wb3J0IGphdmEubmV0LkRhdGFncmFtUGFja2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXJzaGlwTGlzdGVuZXI7CisKKy8qKgorICogQSA8Yj5tZW1iZXJzaGlwPC9iPiBpbXBsZW1lbnRhdGlvbiB1c2luZyBzaW1wbGUgbXVsdGljYXN0LgorICogVGhpcyBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYSBtdWx0aWNhc3QgbWVtYmVyc2hpcCBzZXJ2aWNlLgorICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgbWFpbnRhaW5pbmcgYSBsaXN0IG9mIGFjdGl2ZSBjbHVzdGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyLgorICogSWYgYSBub2RlIGZhaWxzIHRvIHNlbmQgb3V0IGEgaGVhcnRiZWF0LCB0aGUgbm9kZSB3aWxsIGJlIGRpc21pc3NlZC4KKyAqIFRoaXMgaXMgdGhlIGxvdyBsZXZlbCBpbXBsZW1lbnRhdGlvbiB0aGF0IGhhbmRsZXMgdGhlIG11bHRpY2FzdGluZyBzb2NrZXRzLgorICogTmVlZCB0byBmaXggdGhpcywgY291bGQgdXNlIGphdmEubmlvIGFuZCBvbmx5IG5lZWQgb25lIHRocmVhZCB0byBzZW5kIGFuZCByZWNlaXZlLCBvcgorICoganVzdCB1c2UgYSB0aW1lb3V0IG9uIHRoZSByZWNlaXZlCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIE1jYXN0U2VydmljZUltcGwKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIE1jYXN0U2VydmljZS5jbGFzcyApOworICAgIC8qKgorICAgICAqIEludGVybmFsIGZsYWcgdXNlZCBmb3IgdGhlIGxpc3RlbiB0aHJlYWQgdGhhdCBsaXN0ZW5zIHRvIHRoZSBtdWx0aWNhc3Rpbmcgc29ja2V0LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGRvUnVuID0gZmFsc2U7CisgICAgLyoqCisgICAgICogU29ja2V0IHRoYXQgd2UgaW50ZW5kIHRvIGxpc3RlbiB0bworICAgICAqLworICAgIHByb3RlY3RlZCBNdWx0aWNhc3RTb2NrZXQgc29ja2V0OworICAgIC8qKgorICAgICAqIFRoZSBsb2NhbCBtZW1iZXIgdGhhdCB3ZSBpbnRlbmQgdG8gYnJvYWQgY2FzdCBvdmVyIGFuZCBvdmVyIGFnYWluCisgICAgICovCisgICAgcHJvdGVjdGVkIE1jYXN0TWVtYmVyIG1lbWJlcjsKKyAgICAvKioKKyAgICAgKiBUaGUgbXVsdGljYXN0IGFkZHJlc3MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSW5ldEFkZHJlc3MgYWRkcmVzczsKKyAgICAvKioKKyAgICAgKiBUaGUgbXVsdGljYXN0IHBvcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHBvcnQ7CisgICAgLyoqCisgICAgICogVGhlIHRpbWUgaXQgdGFrZXMgZm9yIGEgbWVtYmVyIHRvIGV4cGlyZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyB0aW1lVG9FeHBpcmF0aW9uOworICAgIC8qKgorICAgICAqIEhvdyBvZnRlbiB0byB3ZSBzZW5kIG91dCBhIGJyb2FkY2FzdCBzYXlpbmcgd2UgYXJlIGFsaXZlLCBtdXN0IGJlIHNtYWxsZXIgdGhhbiB0aW1lVG9FeHBpcmF0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgc2VuZEZyZXF1ZW5jeTsKKyAgICAvKioKKyAgICAgKiBSZXVzZSB0aGUgc2VuZFBhY2tldCwgbm8gbmVlZCB0byBjcmVhdGUgYSBuZXcgb25lIGV2ZXJ5dGltZQorICAgICAqLworICAgIHByb3RlY3RlZCBEYXRhZ3JhbVBhY2tldCBzZW5kUGFja2V0OworICAgIC8qKgorICAgICAqIFJldXNlIHRoZSByZWNlaXZlUGFja2V0LCBubyBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBvbmUgZXZlcnl0aW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIERhdGFncmFtUGFja2V0IHJlY2VpdmVQYWNrZXQ7CisgICAgLyoqCisgICAgICogVGhlIG1lbWJlcnNoaXAsIHVzZWQgc28gdGhhdCB3ZSBjYWxjdWxhdGUgbWVtYmVyc2hpcHMgd2hlbiB0aGV5IGFycml2ZSBvciBkb24ndCBhcnJpdmUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWNhc3RNZW1iZXJzaGlwIG1lbWJlcnNoaXA7CisgICAgLyoqCisgICAgICogVGhlIGFjdHVhbCBsaXN0ZW5lciwgZm9yIGNhbGxiYWNrIHdoZW4gc2hpdHMgZ29lcyBkb3duCisgICAgICovCisgICAgcHJvdGVjdGVkIE1lbWJlcnNoaXBMaXN0ZW5lciBzZXJ2aWNlOworICAgIC8qKgorICAgICAqIFRocmVhZCB0byBsaXN0ZW4gZm9yIHBpbmdzCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlY2VpdmVyVGhyZWFkIHJlY2VpdmVyOworICAgIC8qKgorICAgICAqIFRocmVhZCB0byBzZW5kIHBpbmdzCisgICAgICovCisgICAgcHJvdGVjdGVkIFNlbmRlclRocmVhZCBzZW5kZXI7CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHdhcyB0aGUgc2VydmljZSBzdGFydGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgc2VydmljZVN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIAorICAgIHByb3RlY3RlZCBpbnQgbWNhc3RUVEwgPSAtMTsKKyAgICBwcm90ZWN0ZWQgaW50IG1jYXN0U29UaW1lb3V0ID0gLTE7CisgICAgcHJvdGVjdGVkIEluZXRBZGRyZXNzIG1jYXN0QmluZEFkZHJlc3MgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IG1jYXN0IHNlcnZpY2UgaW1wbAorICAgICAqIEBwYXJhbSBtZW1iZXIgLSB0aGUgbG9jYWwgbWVtYmVyCisgICAgICogQHBhcmFtIHNlbmRGcmVxdWVuY3kgLSB0aGUgdGltZSAobXMpIGluIGJldHdlZW4gcGluZ3Mgc2VudCBvdXQKKyAgICAgKiBAcGFyYW0gZXhwaXJlVGltZSAtIHRoZSB0aW1lIChtcykgZm9yIGEgbWVtYmVyIHRvIGV4cGlyZQorICAgICAqIEBwYXJhbSBwb3J0IC0gdGhlIG1jYXN0IHBvcnQKKyAgICAgKiBAcGFyYW0gYmluZCAtIHRoZSBiaW5kIGFkZHJlc3MgKG5vdCBzdXJlIHRoaXMgaXMgdXNlZCB5ZXQpCisgICAgICogQHBhcmFtIG1jYXN0QWRkcmVzcyAtIHRoZSBtY2FzdCBhZGRyZXNzCisgICAgICogQHBhcmFtIHNlcnZpY2UgLSB0aGUgY2FsbGJhY2sgc2VydmljZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgTWNhc3RTZXJ2aWNlSW1wbCgKKyAgICAgICAgTWNhc3RNZW1iZXIgbWVtYmVyLAorICAgICAgICBsb25nIHNlbmRGcmVxdWVuY3ksCisgICAgICAgIGxvbmcgZXhwaXJlVGltZSwKKyAgICAgICAgaW50IHBvcnQsCisgICAgICAgIEluZXRBZGRyZXNzIGJpbmQsCisgICAgICAgIEluZXRBZGRyZXNzIG1jYXN0QWRkcmVzcywKKyAgICAgICAgaW50IHR0bCwKKyAgICAgICAgaW50IHNvVGltZW91dCwKKyAgICAgICAgTWVtYmVyc2hpcExpc3RlbmVyIHNlcnZpY2UpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5tZW1iZXIgPSBtZW1iZXI7CisgICAgICAgIGFkZHJlc3MgPSBtY2FzdEFkZHJlc3M7CisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgIHRoaXMubWNhc3RTb1RpbWVvdXQgPSBzb1RpbWVvdXQ7CisgICAgICAgIHRoaXMubWNhc3RUVEwgPSB0dGw7CisgICAgICAgIHRoaXMubWNhc3RCaW5kQWRkcmVzcyA9IGJpbmQ7CisgICAgICAgIHNldHVwU29ja2V0KCk7CisgICAgICAgIHNlbmRQYWNrZXQgPSBuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbMTAwMF0sMTAwMCk7CisgICAgICAgIHNlbmRQYWNrZXQuc2V0QWRkcmVzcyhhZGRyZXNzKTsKKyAgICAgICAgc2VuZFBhY2tldC5zZXRQb3J0KHBvcnQpOworICAgICAgICByZWNlaXZlUGFja2V0ID0gbmV3IERhdGFncmFtUGFja2V0KG5ldyBieXRlWzEwMDBdLDEwMDApOworICAgICAgICByZWNlaXZlUGFja2V0LnNldEFkZHJlc3MoYWRkcmVzcyk7CisgICAgICAgIHJlY2VpdmVQYWNrZXQuc2V0UG9ydChwb3J0KTsKKyAgICAgICAgbWVtYmVyc2hpcCA9IG5ldyBNY2FzdE1lbWJlcnNoaXAobWVtYmVyLmdldE5hbWUoKSk7CisgICAgICAgIHRpbWVUb0V4cGlyYXRpb24gPSBleHBpcmVUaW1lOworICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOworICAgICAgICB0aGlzLnNlbmRGcmVxdWVuY3kgPSBzZW5kRnJlcXVlbmN5OworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFNvY2tldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtY2FzdEJpbmRBZGRyZXNzICE9IG51bGwpIHNvY2tldCA9IG5ldyBNdWx0aWNhc3RTb2NrZXQobmV3IGphdmEubmV0LgorICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MobWNhc3RCaW5kQWRkcmVzcywgcG9ydCkpOworICAgICAgICBlbHNlIHNvY2tldCA9IG5ldyBNdWx0aWNhc3RTb2NrZXQocG9ydCk7CisgICAgICAgIGlmIChtY2FzdEJpbmRBZGRyZXNzICE9IG51bGwpIHsKKwkJCWlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oIlNldHRpbmcgbXVsdGlob21lIG11bHRpY2FzdCBpbnRlcmZhY2UgdG86IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgbWNhc3RCaW5kQWRkcmVzcyk7CisgICAgICAgICAgICBzb2NrZXQuc2V0SW50ZXJmYWNlKG1jYXN0QmluZEFkZHJlc3MpOworICAgICAgICB9IC8vZW5kIGlmCisgICAgICAgIGlmICggbWNhc3RTb1RpbWVvdXQgPj0gMCApIHsKKyAJCQlpZihsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJTZXR0aW5nIGNsdXN0ZXIgbWNhc3Qgc29UaW1lb3V0IHRvICIrbWNhc3RTb1RpbWVvdXQpOworICAgICAgICAgICAgc29ja2V0LnNldFNvVGltZW91dChtY2FzdFNvVGltZW91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBtY2FzdFRUTCA+PSAwICkgeworCQkJaWYobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiU2V0dGluZyBjbHVzdGVyIG1jYXN0IFRUTCB0byAiICsgbWNhc3RUVEwpOworICAgICAgICAgICAgc29ja2V0LnNldFRpbWVUb0xpdmUobWNhc3RUVEwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgdGhlIHNlcnZpY2UKKyAgICAgKiBAcGFyYW0gbGV2ZWwgMSBzdGFydHMgdGhlIHJlY2VpdmVyLCBsZXZlbCAyIHN0YXJ0cyB0aGUgc2VuZGVyCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgc2VydmljZSBmYWlscyB0byBzdGFydAorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBzZXJ2aWNlIGlzIGFscmVhZHkgc3RhcnRlZAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydChpbnQgbGV2ZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICggc2VuZGVyICE9IG51bGwgJiYgcmVjZWl2ZXIgIT0gbnVsbCApIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNlcnZpY2UgYWxyZWFkeSBydW5uaW5nLiIpOworICAgICAgICBpZiAoIGxldmVsID09IDEgKSB7CisgICAgICAgICAgICBzb2NrZXQuam9pbkdyb3VwKGFkZHJlc3MpOworICAgICAgICAgICAgZG9SdW4gPSB0cnVlOworICAgICAgICAgICAgcmVjZWl2ZXIgPSBuZXcgUmVjZWl2ZXJUaHJlYWQoKTsKKyAgICAgICAgICAgIHJlY2VpdmVyLnNldERhZW1vbih0cnVlKTsKKyAgICAgICAgICAgIHJlY2VpdmVyLnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBsZXZlbD09MiApIHsKKyAgICAgICAgICAgIHNlcnZpY2VTdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIHNlbmRlciA9IG5ldyBTZW5kZXJUaHJlYWQoc2VuZEZyZXF1ZW5jeSk7CisgICAgICAgICAgICBzZW5kZXIuc2V0RGFlbW9uKHRydWUpOworICAgICAgICAgICAgc2VuZGVyLnN0YXJ0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBzZXJ2aWNlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgc2VydmljZSBmYWlscyB0byBkaXNjb25uZWN0IGZyb20gdGhlIHNvY2tldHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHNvY2tldC5sZWF2ZUdyb3VwKGFkZHJlc3MpOworICAgICAgICBkb1J1biA9IGZhbHNlOworICAgICAgICBzZW5kZXIgPSBudWxsOworICAgICAgICByZWNlaXZlciA9IG51bGw7CisgICAgICAgIHNlcnZpY2VTdGFydFRpbWUgPSBMb25nLk1BWF9WQUxVRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlIGEgZGF0YWdyYW0gcGFja2V0LCBsb2NraW5nIHdhaXQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjZWl2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHNvY2tldC5yZWNlaXZlKHJlY2VpdmVQYWNrZXQpOworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW3JlY2VpdmVQYWNrZXQuZ2V0TGVuZ3RoKCldOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlY2VpdmVQYWNrZXQuZ2V0RGF0YSgpLHJlY2VpdmVQYWNrZXQuZ2V0T2Zmc2V0KCksZGF0YSwwLGRhdGEubGVuZ3RoKTsKKyAgICAgICAgTWNhc3RNZW1iZXIgbSA9IE1jYXN0TWVtYmVyLmdldE1lbWJlcihkYXRhKTsKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIk1jYXN0IHJlY2VpdmUgcGluZyBmcm9tIG1lbWJlciAiICsgbSk7CisgICAgICAgIGlmICggbWVtYmVyc2hpcC5tZW1iZXJBbGl2ZShtKSApIHsKKyAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWNhc3QgYWRkIG1lbWJlciAiICsgbSk7CisgICAgICAgICAgICBzZXJ2aWNlLm1lbWJlckFkZGVkKG0pOworICAgICAgICB9CisgICAgICAgIE1jYXN0TWVtYmVyW10gZXhwaXJlZCA9IG1lbWJlcnNoaXAuZXhwaXJlKHRpbWVUb0V4cGlyYXRpb24pOworICAgICAgICBmb3IgKCBpbnQgaT0wOyBpPGV4cGlyZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWNhc3QgZXhpcHJlICBtZW1iZXIgIiArIG0pOworICAgICAgICAgICAgc2VydmljZS5tZW1iZXJEaXNhcHBlYXJlZChleHBpcmVkW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgYSBwaW5nCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgbWVtYmVyLmluYygpOworICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWNhc3Qgc2VuZCBwaW5nIGZyb20gbWVtYmVyICIgKyBtZW1iZXIpOworICAgICAgICBieXRlW10gZGF0YSA9IG1lbWJlci5nZXREYXRhKHRoaXMuc2VydmljZVN0YXJ0VGltZSk7CisgICAgICAgIERhdGFncmFtUGFja2V0IHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQoZGF0YSxkYXRhLmxlbmd0aCk7CisgICAgICAgIHAuc2V0QWRkcmVzcyhhZGRyZXNzKTsKKyAgICAgICAgcC5zZXRQb3J0KHBvcnQpOworICAgICAgICBzb2NrZXQuc2VuZChwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRTZXJ2aWNlU3RhcnRUaW1lKCkgeworICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VTdGFydFRpbWU7CisgICAgfQorCisKKyAgICBwdWJsaWMgY2xhc3MgUmVjZWl2ZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwdWJsaWMgUmVjZWl2ZXJUaHJlYWQoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgc2V0TmFtZSgiQ2x1c3Rlci1NZW1iZXJzaGlwUmVjZWl2ZXIiKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB3aGlsZSAoIGRvUnVuICkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJFcnJvciByZWNlaXZpbmcgbWNhc3QgcGFja2FnZS4gU2xlZXBpbmcgNTAwbXMiLHgpOworICAgICAgICAgICAgICAgICAgICB0cnkgeyBUaHJlYWQuc2xlZXAoNTAwKTsgfSBjYXRjaCAoIEV4Y2VwdGlvbiBpZ25vcmUgKXt9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0vL2NsYXNzIFJlY2VpdmVyVGhyZWFkCisKKyAgICBwdWJsaWMgY2xhc3MgU2VuZGVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgbG9uZyB0aW1lOworICAgICAgICBwdWJsaWMgU2VuZGVyVGhyZWFkKGxvbmcgdGltZSkgeworICAgICAgICAgICAgdGhpcy50aW1lID0gdGltZTsKKyAgICAgICAgICAgIHNldE5hbWUoIkNsdXN0ZXItTWVtYmVyc2hpcFNlbmRlciIpOworCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgd2hpbGUgKCBkb1J1biApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZW5kKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiVW5hYmxlIHRvIHNlbmQgbWNhc3QgbWVzc2FnZS4iLHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeyBUaHJlYWQuc2xlZXAodGltZSk7IH0gY2F0Y2ggKCBFeGNlcHRpb24gaWdub3JlICkge30KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0vL2NsYXNzIFNlbmRlclRocmVhZAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL21jYXN0L21iZWFucy1kZXNjcmlwdG9ycy54bWwgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWNhc3QvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmUzZmM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL21jYXN0L21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSw2MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBtYmVhbnMtZGVzY3JpcHRvcnMgUFVCTElDCisgICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL0RURCBNb2RlbCBNQmVhbnMgQ29uZmlndXJhdGlvbiBGaWxlIgorICAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9kdGRzL21iZWFucy1kZXNjcmlwdG9ycy5kdGQiPgorPG1iZWFucy1kZXNjcmlwdG9ycz4KKworICA8bWJlYW4gICAgICAgICBuYW1lPSJNY2FzdFNlcnZpY2UiCisgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDbHVzdGVyIE1lbWJlcnNoaXAgc2VydmljZSBpbXBsZW1lbnRhdGlvbiIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IkNsdXN0ZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5tY2FzdC5NY2FzdFNlcnZpY2UiPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJpbmZvIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDbGFzcyB2ZXJzaW9uIGluZm8iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWNhc3RBZGRyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNdWx0aWNhc3QgSVAgQWRkcmVzcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtY2FzdEJpbmRBZGRyZXNzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNdWx0aWNhc3QgSVAgSW50ZXJmYWNlIGFkZHJlc3MgKGRlZmF1bHQgYXV0bykiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWNhc3RQb3J0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNdWx0aWNhc3QgVURQIFBvcnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtY2FzdEZyZXF1ZW5jeSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUGluZyBGcmVxdWVuY3kgYXQgbXNlYyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtY2FzdENsdXN0ZXJEb21haW4iCisgICAgICAgICAgZGVzY3JpcHRpb249IkNsdXN0ZXIgRG9tYWluIG9mIHRoaXMgbWVtYmVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1jYXN0RHJvcFRpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRpbWVvdXQgZnJvbSBmcmVxdWVuY3kgcGluZyBhZnRlciBtZW1iZXIgZGlzYXBwZXIgbm90aWZ5IgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1jYXN0U29UaW1lb3V0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNdWx0aWNhc3QgU29ja2V0IFRpbWVvdXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtY2FzdFRUTCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibG9jYWxNZW1iZXJOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb21wbGV0ZSBsb2NhbCByZWNlaXZlciBpbmZvcm1hdGlvbiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtZW1iZXJzQnlOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb21wbGV0ZSByZW1vdGUgc2VuZGVyIGluZm9ybWF0aW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7IgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0ic3RhcnQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhcnQgdGhlIGNsdXN0ZXIgbWVtYmVyc2hpcCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisgICAgCisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0b3AgdGhlIGNsdXN0ZXIgbWVtYmVyc2hpcCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisgICAgICAgICAgICAgICAgIAorICA8L21iZWFuPgorCis8L21iZWFucy1kZXNjcmlwdG9ycz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9wYWNrYWdlLmh0bWwgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlODNhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMTEgQEAKKzxib2R5PgorCis8cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgY29kZSBmb3IgQ2x1c3RlcmluZywgdGhlIGJhc2UgY2xhc3MKK29mIGEgQ2x1c3RlciBpcyA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkNsdXN0ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9ucworb2YgdGhpcyBjbGFzcyBpcyBkb25lIHdoZW4gaW1wbGVtZW50aW5nIGEgbmV3IENsdXN0ZXIgcHJvdG9jb2w8L3A+CisKKzxwPlRoZSBvbmx5IENsdXN0ZXIgcHJvdG9jb2wgY3VycmVudGx5IGltcGxlbWVudGVkIGlzIGEgSmF2YUdyb3VwcyBiYXNlZDxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPkpHQ2x1c3Rlci5qYXZhPC9iPgorPC9wPgorCis8L2JvZHk+CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9DbHVzdGVyTGlzdGVuZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0NsdXN0ZXJMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNTBmMDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9DbHVzdGVyTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNhdGFsaW5hQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lc3NhZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworLyoqCisgKiBSZWNlaXZlIFNlc3Npb25JRCBjbHVzdGVyIGNoYW5nZSBmcm9tIG90aGVyIGJhY2t1cCBub2RlIGFmdGVyIHByaW1hcnkgc2Vzc2lvbgorICogbm9kZSBpcyBmYWlsZWQuCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbHVzdGVyTGlzdGVuZXIgaW1wbGVtZW50cyBNZXNzYWdlTGlzdGVuZXIgeworCisgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeQorICAgICAgICAgICAgLmdldExvZyhDbHVzdGVyTGlzdGVuZXIuY2xhc3MpOworCisKKyAgICAvLy0tSW5zdGFuY2UgVmFyaWFibGVzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdNYW5hZ2VyIHNtID0gU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworICAgIHByb3RlY3RlZCBDYXRhbGluYUNsdXN0ZXIgY2x1c3RlciA9IG51bGw7CisKKyAgICAvLy0tQ29uc3RydWN0b3ItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyBDbHVzdGVyTGlzdGVuZXIoKSB7CisgICAgfQorICAgIAorICAgIC8vLS1JbnN0YW5jZSBHZXR0ZXJzL1NldHRlcnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIAorICAgIHB1YmxpYyBDYXRhbGluYUNsdXN0ZXIgZ2V0Q2x1c3RlcigpIHsKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlcihDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChjbHVzdGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJhZGQgQ2x1c3Rlckxpc3RlbmVyICIgKyB0aGlzLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0byBjbHVzdGVyIiArIGNsdXN0ZXIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygicmVtb3ZlIENsdXN0ZXJMaXN0ZW5lciAiICsgdGhpcy50b1N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBjbHVzdGVyIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5jbHVzdGVyID0gY2x1c3RlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGxpc3RlbmVyKSB7CisgICAgICAgIHJldHVybiBzdXBlci5lcXVhbHMobGlzdGVuZXIpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8vLS1Mb2dpYy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmcm9tIHRoZSBjbHVzdGVyLCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCwgVGhlIGNsdXN0ZXIgd2lsbAorICAgICAqIGJyb2FkY2FzdCBpdCBpbnZva2luZyB0aGUgbWVzc2FnZVJlY2VpdmVkIG9uIHRoZSByZWNlaXZlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICogICAgICAgICAgICBDbHVzdGVyTWVzc2FnZSAtIHRoZSBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIGNsdXN0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoQ2x1c3Rlck1lc3NhZ2UgbXNnKSA7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBBY2NlcHQgb25seSBTZXNzaW9uSURNZXNzYWdlcworICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgICAgICAgIENsdXN0ZXJNZXNzYWdlCisgICAgICogQHJldHVybiBib29sZWFuIC0gcmV0dXJucyB0cnVlIHRvIGluZGljYXRlIHRoYXQgbWVzc2FnZVJlY2VpdmVkIHNob3VsZCBiZQorICAgICAqICAgICAgICAgaW52b2tlZC4gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIHRoZSBtZXNzYWdlUmVjZWl2ZWQgbWV0aG9kIHdpbGwKKyAgICAgKiAgICAgICAgIG5vdCBiZSBpbnZva2VkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFjY2VwdChDbHVzdGVyTWVzc2FnZSBtc2cpIDsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vQ2x1c3RlclNlc3Npb25MaXN0ZW5lci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vQ2x1c3RlclNlc3Npb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhODU1N2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9DbHVzdGVyU2Vzc2lvbkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlOworCisvKioKKyAqIFJlY2VpdmUgcmVwbGljYXRlZCBTZXNzaW9uTWVzc2FnZSBmb3JtIG90aGVyIGNsdXN0ZXIgbm9kZS4KKyAqIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIENsdXN0ZXJTZXNzaW9uTGlzdGVuZXIgZXh0ZW5kcyBDbHVzdGVyTGlzdGVuZXIgeworIAorICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAib3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLkNsdXN0ZXJTZXNzaW9uTGlzdGVuZXIvMS4xIjsKKworICAgIC8vLS1Db25zdHJ1Y3Rvci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIENsdXN0ZXJTZXNzaW9uTGlzdGVuZXIoKSB7CisgICAgfQorCisgICAgLy8tLUxvZ2ljLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZyb20gdGhlIGNsdXN0ZXIsIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkLCBUaGUgY2x1c3RlciB3aWxsCisgICAgICogYnJvYWRjYXN0IGl0IGludm9raW5nIHRoZSBtZXNzYWdlUmVjZWl2ZWQgb24gdGhlIHJlY2VpdmVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBteW9iagorICAgICAqICAgICAgICAgICAgQ2x1c3Rlck1lc3NhZ2UgLSB0aGUgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBjbHVzdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKENsdXN0ZXJNZXNzYWdlIG15b2JqKSB7CisgICAgICAgIGlmIChteW9iaiAhPSBudWxsICYmIG15b2JqIGluc3RhbmNlb2YgU2Vzc2lvbk1lc3NhZ2UpIHsKKyAgICAgICAgICAgIFNlc3Npb25NZXNzYWdlIG1zZyA9IChTZXNzaW9uTWVzc2FnZSkgbXlvYmo7CisgICAgICAgICAgICBTdHJpbmcgY3R4bmFtZSA9IG1zZy5nZXRDb250ZXh0TmFtZSgpOworICAgICAgICAgICAgLy9jaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBhIEVWVF9HRVRfQUxMX1NFU1NJT05TLAorICAgICAgICAgICAgLy9pZiBzbywgd2FpdCB1bnRpbCB3ZSBhcmUgZnVsbHkgc3RhcnRlZCB1cAorICAgICAgICAgICAgTWFwIG1hbmFnZXJzID0gY2x1c3Rlci5nZXRNYW5hZ2VycygpIDsKKyAgICAgICAgICAgIGlmIChjdHhuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgaSA9IG1hbmFnZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgQ2x1c3Rlck1hbmFnZXIgbWdyID0gKENsdXN0ZXJNYW5hZ2VyKSBtYW5hZ2Vycy5nZXQoa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1nciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgbWdyLm1lc3NhZ2VEYXRhUmVjZWl2ZWQobXNnKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaGFwcGVucyBhIGxvdCBiZWZvcmUgdGhlIHN5c3RlbSBoYXMgc3RhcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvbnRleHQgbWFuYWdlciBkb2Vzbid0IGV4aXN0OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ2x1c3Rlck1hbmFnZXIgbWdyID0gKENsdXN0ZXJNYW5hZ2VyKSBtYW5hZ2Vycy5nZXQoY3R4bmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKG1nciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBtZ3IubWVzc2FnZURhdGFSZWNlaXZlZChtc2cpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvZy5pc0Vycm9yRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvbnRleHQgbWFuYWdlciBkb2Vzbid0IGV4aXN0OiIgKyBjdHhuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFjY2VwdCBvbmx5IFNlc3Npb25NZXNzYWdlCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgQ2x1c3Rlck1lc3NhZ2UKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gLSByZXR1cm5zIHRydWUgdG8gaW5kaWNhdGUgdGhhdCBtZXNzYWdlUmVjZWl2ZWQgc2hvdWxkIGJlCisgICAgICogICAgICAgICBpbnZva2VkLiBJZiBmYWxzZSBpcyByZXR1cm5lZCwgdGhlIG1lc3NhZ2VSZWNlaXZlZCBtZXRob2Qgd2lsbAorICAgICAqICAgICAgICAgbm90IGJlIGludm9rZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KENsdXN0ZXJNZXNzYWdlIG1zZykgeworICAgICAgICByZXR1cm4gKG1zZyBpbnN0YW5jZW9mIFNlc3Npb25NZXNzYWdlKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0NvbnN0YW50cy5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwNGZiNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb247CisKKy8qKgorICogTWFuaWZlc3QgY29uc3RhbnRzIGZvciB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb248L2NvZGU+CisgKiBwYWNrYWdlLgorICoKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2ggUGVybworICovCisKK3B1YmxpYyBjbGFzcyBDb25zdGFudHMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbiI7CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0RlbHRhTWFuYWdlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vRGVsdGFNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3N2Y4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0RlbHRhTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTc4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb247CisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2F0YWxpbmFDbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uTWFuYWdlckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5DdXN0b21PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0OworCisvKioKKyAqIFRoZSBEZWx0YU1hbmFnZXIgbWFuYWdlcyByZXBsaWNhdGVkIHNlc3Npb25zIGJ5IG9ubHkgcmVwbGljYXRpbmcgdGhlIGRlbHRhcworICogaW4gZGF0YS4gRm9yIGFwcGxpY2F0aW9ucyB3cml0dGVuIHRvIGhhbmRsZSB0aGlzLCB0aGUgRGVsdGFNYW5hZ2VyIGlzIHRoZQorICogb3B0aW1hbCB3YXkgb2YgcmVwbGljYXRpbmcgZGF0YS4KKyAqIAorICogVGhpcyBjb2RlIGlzIGFsbW9zdCBpZGVudGljYWwgdG8gU3RhbmRhcmRNYW5hZ2VyIHdpdGggYSBkaWZmZXJlbmNlIGluIGhvdyBpdAorICogcGVyc2lzdHMgc2Vzc2lvbnMgYW5kIHNvbWUgbW9kaWZpY2F0aW9ucyB0byBpdC4KKyAqIAorICogPGI+SU1QTEVNRU5UQVRJT04gTk9URSA8L2I+OiBDb3JyZWN0IGJlaGF2aW9yIG9mIHNlc3Npb24gc3RvcmluZyBhbmQKKyAqIHJlbG9hZGluZyBkZXBlbmRzIHVwb24gZXh0ZXJuYWwgY2FsbHMgdG8gdGhlIDxjb2RlPnN0YXJ0KCk8L2NvZGU+IGFuZAorICogPGNvZGU+c3RvcCgpPC9jb2RlPiBtZXRob2RzIG9mIHRoaXMgY2xhc3MgYXQgdGhlIGNvcnJlY3QgdGltZXMuCisgKiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBKZWFuLUZyYW5jb2lzIEFyY2FuZAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsdGFNYW5hZ2VyIGV4dGVuZHMgTWFuYWdlckJhc2UgaW1wbGVtZW50cyBMaWZlY3ljbGUsCisgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIENsdXN0ZXJNYW5hZ2VyIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VjdXJpdHkgQ2xhc3NlcworCisgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeQorICAgICAgICAgICAgLmdldExvZyhEZWx0YU1hbmFnZXIuY2xhc3MpOworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0gU3RyaW5nTWFuYWdlcgorICAgICAgICAgICAgLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJEZWx0YU1hbmFnZXIvMi4xIjsKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIHN0YXJ0ZWQgeWV0PworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgbmFtZSBvZiB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24gKGZvciBsb2dnaW5nKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBtYW5hZ2VyTmFtZSA9ICJEZWx0YU1hbmFnZXIiOworCisgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0TW9kZSA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBDYXRhbGluYUNsdXN0ZXIgY2x1c3RlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBjYWNoZWQgcmVwbGljYXRpb24gdmFsdmUgY2x1c3RlciBjb250YWluZXIhCisgICAgICovCisgICAgcHJpdmF0ZSBSZXBsaWNhdGlvblZhbHZlIHJlcGxpY2F0aW9uVmFsdmUgPSBudWxsIDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBTZXNzaW9ucyBhbGxvd2VkLCBvciAtMSBmb3Igbm8gbGltaXQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbWF4QWN0aXZlU2Vzc2lvbnMgPSAtMTsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbiA9IHRydWU7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbm90aWZ5U2Vzc2lvbkxpc3RlbmVyc09uUmVwbGljYXRpb24gPSB0cnVlOworCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXRlVHJhbnNmZXJlZCA9IGZhbHNlIDsKKworICAgIHByaXZhdGUgaW50IHN0YXRlVHJhbnNmZXJUaW1lb3V0ID0gNjA7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2VuZEFsbFNlc3Npb25zID0gdHJ1ZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBzZW5kQ2x1c3RlckRvbWFpbk9ubHkgPSB0cnVlIDsKKyAgICAKKyAgICBwcml2YXRlIGludCBzZW5kQWxsU2Vzc2lvbnNTaXplID0gMTAwMCA7CisgICAgCisgICAgLyoqCisgICAgICogd2FpdCB0aW1lIGJldHdlZW4gc2VuZCBzZXNzaW9uIGJsb2NrIChkZWZhdWx0IDIgc2VjKSAKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzZW5kQWxsU2Vzc2lvbnNXYWl0VGltZSA9IDIgKiAxMDAwIDsgCisKKyAgICAvKioKKyAgICAgKiBTZW5kIHNlc3Npb24gYWNjZXNzIG1lc3NhZ2UgZXZlcnkgdXBkYXRlQWN0aXZlSW50ZXJ2YWwgc2VjIAorICAgICAqLworICAgIHByaXZhdGUgaW50IHVwZGF0ZUFjdGl2ZUludGVydmFsID0gNjA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBzZXNzaW9uIG1heEluYWN0aXZlSW50ZXJ2YWwgKyB0b2xlcmFuY2UgdGltZSBpbnRlcnZhbCwgaW4gc2Vjb25kcywgYmV0d2VlbiBjbGllbnQgcmVxdWVzdHMgYmVmb3JlCisgICAgICogdGhlIHNlcnZsZXQgY29udGFpbmVyIG1heSBpbnZhbGlkYXRlIGEgYmFja3VwIHNlc3Npb24gZnJvbSBvdGhlciBjbHVzdGVyIG5vZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZXhwaXJlVG9sZXJhbmNlID0gMzAwOworCisgICAgcHJpdmF0ZSBBcnJheUxpc3QgcmVjZWl2ZWRNZXNzYWdlUXVldWUgPSBuZXcgQXJyYXlMaXN0KCkgOworICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiByZWNlaXZlclF1ZXVlID0gZmFsc2UgOworCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXRlVGltZXN0YW1wRHJvcCA9IHRydWUgOworCisgICAgcHJpdmF0ZSBsb25nIHN0YXRlVHJhbnNmZXJDcmVhdGVTZW5kVGltZTsgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0YXRzIGF0dHJpYnV0ZXMKKyAgICAKKyAgICBpbnQgcmVqZWN0ZWRTZXNzaW9ucyA9IDA7CisKKyAgICBwcml2YXRlIGxvbmcgc2Vzc2lvblJlcGxhY2VDb3VudGVyID0gMCA7CisKKyAgICBsb25nIHByb2Nlc3NpbmdUaW1lID0gMDsKKworICAgIHByaXZhdGUgbG9uZyBjb3VudGVyUmVjZWl2ZV9FVlRfR0VUX0FMTF9TRVNTSU9OUyA9IDAgOworCisgICAgcHJpdmF0ZSBsb25nIGNvdW50ZXJTZW5kX0VWVF9BTExfU0VTU0lPTl9EQVRBID0gMCA7CisKKyAgICBwcml2YXRlIGxvbmcgY291bnRlclJlY2VpdmVfRVZUX0FMTF9TRVNTSU9OX0RBVEEgPSAwIDsKKworICAgIHByaXZhdGUgbG9uZyBjb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9DUkVBVEVEID0gMCA7CisKKyAgICBwcml2YXRlIGxvbmcgY291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fRVhQSVJFRCA9IDA7CisKKyAgICBwcml2YXRlIGxvbmcgY291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fQUNDRVNTRUQgPSAwIDsKKworICAgIHByaXZhdGUgbG9uZyBjb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9ERUxUQSA9IDA7CisKKyAgICBwcml2YXRlIGxvbmcgY291bnRlclNlbmRfRVZUX0dFVF9BTExfU0VTU0lPTlMgPSAwIDsKKworICAgIHByaXZhdGUgbG9uZyBjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9DUkVBVEVEID0gMDsKKworICAgIHByaXZhdGUgbG9uZyBjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9ERUxUQSA9IDAgOworCisgICAgcHJpdmF0ZSBsb25nIGNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0FDQ0VTU0VEID0gMDsKKworICAgIHByaXZhdGUgbG9uZyBjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9FWFBJUkVEID0gMDsKKworICAgIHByaXZhdGUgaW50IGNvdW50ZXJTZW5kX0VWVF9BTExfU0VTU0lPTl9UUkFOU0ZFUkNPTVBMRVRFID0gMCA7CisKKyAgICBwcml2YXRlIGludCBjb3VudGVyUmVjZWl2ZV9FVlRfQUxMX1NFU1NJT05fVFJBTlNGRVJDT01QTEVURSA9IDAgOworCisgICAgcHJpdmF0ZSBpbnQgY291bnRlck5vU3RhdGVUcmFuc2ZlcmVkID0gMCA7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKyAgCisgICAgcHVibGljIERlbHRhTWFuYWdlcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIENsYXNzTG9hZGVyW10gZ2V0Q2xhc3NMb2FkZXJzKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgTG9hZGVyIGxvYWRlciA9IG51bGw7CisgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKKyAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSBsb2FkZXIgPSBjb250YWluZXIuZ2V0TG9hZGVyKCk7CisgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgY2xhc3NMb2FkZXIgPSBsb2FkZXIuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgZWxzZSBjbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIGlmICggY2xhc3NMb2FkZXIgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSApIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3NMb2FkZXJbXSB7Y2xhc3NMb2FkZXJ9OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0xvYWRlcltdIHtjbGFzc0xvYWRlcixUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24gYW5kIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZXNjcmlwdGl2ZSBzaG9ydCBuYW1lIG9mIHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VXBkYXRlQWN0aXZlSW50ZXJ2YWwoKSB7CisgICAgICAgIHJldHVybiB1cGRhdGVBY3RpdmVJbnRlcnZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcGRhdGVBY3RpdmVJbnRlcnZhbChpbnQgdXBkYXRlQWN0aXZlSW50ZXJ2YWwpIHsKKyAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVJbnRlcnZhbCA9IHVwZGF0ZUFjdGl2ZUludGVydmFsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RXhwaXJlVG9sZXJhbmNlKCkgeworICAgICAgICByZXR1cm4gZXhwaXJlVG9sZXJhbmNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4cGlyZVRvbGVyYW5jZShpbnQgZXhwaXJlVG9sZXJhbmNlKSB7CisgICAgICAgIHRoaXMuZXhwaXJlVG9sZXJhbmNlID0gZXhwaXJlVG9sZXJhbmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY291bnRlclNlbmRfRVZUX0dFVF9BTExfU0VTU0lPTlMuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q291bnRlclNlbmRfRVZUX0dFVF9BTExfU0VTU0lPTlMoKSB7CisgICAgICAgIHJldHVybiBjb3VudGVyU2VuZF9FVlRfR0VUX0FMTF9TRVNTSU9OUzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9BQ0NFU1NFRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9BQ0NFU1NFRCgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0FDQ0VTU0VEOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0NSRUFURUQuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q291bnRlclNlbmRfRVZUX1NFU1NJT05fQ1JFQVRFRCgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0NSRUFURUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9ERUxUQS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9ERUxUQSgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0RFTFRBOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY291bnRlclNlbmRfRVZUX1NFU1NJT05fRVhQSVJFRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9FWFBJUkVEKCkgeworICAgICAgICByZXR1cm4gY291bnRlclNlbmRfRVZUX1NFU1NJT05fRVhQSVJFRDsKKyAgICB9CisgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb3VudGVyU2VuZF9FVlRfQUxMX1NFU1NJT05fREFUQS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDb3VudGVyU2VuZF9FVlRfQUxMX1NFU1NJT05fREFUQSgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXJTZW5kX0VWVF9BTExfU0VTU0lPTl9EQVRBOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY291bnRlclNlbmRfRVZUX0FMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb3VudGVyU2VuZF9FVlRfQUxMX1NFU1NJT05fVFJBTlNGRVJDT01QTEVURSgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXJTZW5kX0VWVF9BTExfU0VTU0lPTl9UUkFOU0ZFUkNPTVBMRVRFOworICAgIH0KKyAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvdW50ZXJSZWNlaXZlX0VWVF9BTExfU0VTU0lPTl9EQVRBLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldENvdW50ZXJSZWNlaXZlX0VWVF9BTExfU0VTU0lPTl9EQVRBKCkgeworICAgICAgICByZXR1cm4gY291bnRlclJlY2VpdmVfRVZUX0FMTF9TRVNTSU9OX0RBVEE7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY291bnRlclJlY2VpdmVfRVZUX0dFVF9BTExfU0VTU0lPTlMuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q291bnRlclJlY2VpdmVfRVZUX0dFVF9BTExfU0VTU0lPTlMoKSB7CisgICAgICAgIHJldHVybiBjb3VudGVyUmVjZWl2ZV9FVlRfR0VUX0FMTF9TRVNTSU9OUzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9BQ0NFU1NFRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9BQ0NFU1NFRCgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0FDQ0VTU0VEOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0NSRUFURUQuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fQ1JFQVRFRCgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0NSRUFURUQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fREVMVEEuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fREVMVEEoKSB7CisgICAgICAgIHJldHVybiBjb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9ERUxUQTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9FWFBJUkVELgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldENvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0VYUElSRUQoKSB7CisgICAgICAgIHJldHVybiBjb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9FWFBJUkVEOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvdW50ZXJSZWNlaXZlX0VWVF9BTExfU0VTU0lPTl9UUkFOU0ZFUkNPTVBMRVRFLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q291bnRlclJlY2VpdmVfRVZUX0FMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEUoKSB7CisgICAgICAgIHJldHVybiBjb3VudGVyUmVjZWl2ZV9FVlRfQUxMX1NFU1NJT05fVFJBTlNGRVJDT01QTEVURTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9jZXNzaW5nVGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRQcm9jZXNzaW5nVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NpbmdUaW1lOworICAgIH0KKyAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlc3Npb25SZXBsYWNlQ291bnRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTZXNzaW9uUmVwbGFjZUNvdW50ZXIoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uUmVwbGFjZUNvdW50ZXI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIE51bWJlciBvZiBzZXNzaW9uIGNyZWF0aW9ucyB0aGF0IGZhaWxlZCBkdWUgdG8gbWF4QWN0aXZlU2Vzc2lvbnMKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBjb3VudAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVqZWN0ZWRTZXNzaW9ucygpIHsKKyAgICAgICAgcmV0dXJuIHJlamVjdGVkU2Vzc2lvbnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVqZWN0ZWRTZXNzaW9ucyhpbnQgcmVqZWN0ZWRTZXNzaW9ucykgeworICAgICAgICB0aGlzLnJlamVjdGVkU2Vzc2lvbnMgPSByZWplY3RlZFNlc3Npb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY291bnRlck5vU3RhdGVUcmFuc2ZlcmVkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q291bnRlck5vU3RhdGVUcmFuc2ZlcmVkKCkgeworICAgICAgICByZXR1cm4gY291bnRlck5vU3RhdGVUcmFuc2ZlcmVkOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldFJlY2VpdmVkUXVldWVTaXplKCkgeworICAgICAgICByZXR1cm4gcmVjZWl2ZWRNZXNzYWdlUXVldWUuc2l6ZSgpIDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzdGF0ZVRyYW5zZmVyVGltZW91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFN0YXRlVHJhbnNmZXJUaW1lb3V0KCkgeworICAgICAgICByZXR1cm4gc3RhdGVUcmFuc2ZlclRpbWVvdXQ7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSB0aW1lb3V0QWxsU2Vzc2lvbiBUaGUgdGltZW91dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0YXRlVHJhbnNmZXJUaW1lb3V0KGludCB0aW1lb3V0QWxsU2Vzc2lvbikgeworICAgICAgICB0aGlzLnN0YXRlVHJhbnNmZXJUaW1lb3V0ID0gdGltZW91dEFsbFNlc3Npb247CisgICAgfQorCisgICAgLyoqCisgICAgICogaXMgc2Vzc2lvbiBzdGF0ZSB0cmFuc2ZlcmVkIGNvbXBsZXRlPworICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFN0YXRlVHJhbnNmZXJlZCgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlVHJhbnNmZXJlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgdGhhdCBzdGF0ZSBpc3QgY29tcGxldGUgdHJhbnNmZXJlZCAgCisgICAgICogQHBhcmFtIHN0YXRlVHJhbnNmZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0YXRlVHJhbnNmZXJlZChib29sZWFuIHN0YXRlVHJhbnNmZXJlZCkgeworICAgICAgICB0aGlzLnN0YXRlVHJhbnNmZXJlZCA9IHN0YXRlVHJhbnNmZXJlZDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZW5kQWxsU2Vzc2lvbnNXYWl0VGltZSBpbiBtc2VjCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZW5kQWxsU2Vzc2lvbnNXYWl0VGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRBbGxTZXNzaW9uc1dhaXRUaW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc2VuZEFsbFNlc3Npb25zV2FpdFRpbWUgVGhlIHNlbmRBbGxTZXNzaW9uc1dhaXRUaW1lIHRvIHNldCBhdCBtc2VjLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlbmRBbGxTZXNzaW9uc1dhaXRUaW1lKGludCBzZW5kQWxsU2Vzc2lvbnNXYWl0VGltZSkgeworICAgICAgICB0aGlzLnNlbmRBbGxTZXNzaW9uc1dhaXRUaW1lID0gc2VuZEFsbFNlc3Npb25zV2FpdFRpbWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VuZENsdXN0ZXJEb21haW5Pbmx5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2VuZENsdXN0ZXJEb21haW5Pbmx5KCkgeworICAgICAgICByZXR1cm4gc2VuZENsdXN0ZXJEb21haW5Pbmx5OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc2VuZENsdXN0ZXJEb21haW5Pbmx5IFRoZSBzZW5kQ2x1c3RlckRvbWFpbk9ubHkgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlbmRDbHVzdGVyRG9tYWluT25seShib29sZWFuIHNlbmRDbHVzdGVyRG9tYWluT25seSkgeworICAgICAgICB0aGlzLnNlbmRDbHVzdGVyRG9tYWluT25seSA9IHNlbmRDbHVzdGVyRG9tYWluT25seTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YXRlVGltZXN0YW1wRHJvcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRlVGltZXN0YW1wRHJvcCgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlVGltZXN0YW1wRHJvcDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIGlzVGltZXN0YW1wRHJvcCBUaGUgbmV3IGZsYWcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0ZVRpbWVzdGFtcERyb3AoYm9vbGVhbiBpc1RpbWVzdGFtcERyb3ApIHsKKyAgICAgICAgdGhpcy5zdGF0ZVRpbWVzdGFtcERyb3AgPSBpc1RpbWVzdGFtcERyb3A7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIFNlc3Npb25zIGFsbG93ZWQsIG9yIC0xIGZvciBubyBsaW1pdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1heEFjdGl2ZVNlc3Npb25zKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5tYXhBY3RpdmVTZXNzaW9ucyk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZXMgU2Vzc2lvbnMgYWxsb3dlZCwgb3IgLTEgZm9yIG5vIGxpbWl0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBtYXgKKyAgICAgKiAgICAgICAgICAgIFRoZSBuZXcgbWF4aW11bSBudW1iZXIgb2Ygc2Vzc2lvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhBY3RpdmVTZXNzaW9ucyhpbnQgbWF4KSB7CisKKyAgICAgICAgaW50IG9sZE1heEFjdGl2ZVNlc3Npb25zID0gdGhpcy5tYXhBY3RpdmVTZXNzaW9uczsKKyAgICAgICAgdGhpcy5tYXhBY3RpdmVTZXNzaW9ucyA9IG1heDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm1heEFjdGl2ZVNlc3Npb25zIiwgbmV3IEludGVnZXIoCisgICAgICAgICAgICAgICAgb2xkTWF4QWN0aXZlU2Vzc2lvbnMpLCBuZXcgSW50ZWdlcih0aGlzLm1heEFjdGl2ZVNlc3Npb25zKSk7CisKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZW5kQWxsU2Vzc2lvbnMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZW5kQWxsU2Vzc2lvbnMoKSB7CisgICAgICAgIHJldHVybiBzZW5kQWxsU2Vzc2lvbnM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSBzZW5kQWxsU2Vzc2lvbnMgVGhlIHNlbmRBbGxTZXNzaW9ucyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VuZEFsbFNlc3Npb25zKGJvb2xlYW4gc2VuZEFsbFNlc3Npb25zKSB7CisgICAgICAgIHRoaXMuc2VuZEFsbFNlc3Npb25zID0gc2VuZEFsbFNlc3Npb25zOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlbmRBbGxTZXNzaW9uc1NpemUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZW5kQWxsU2Vzc2lvbnNTaXplKCkgeworICAgICAgICByZXR1cm4gc2VuZEFsbFNlc3Npb25zU2l6ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIHNlbmRBbGxTZXNzaW9uc1NpemUgVGhlIHNlbmRBbGxTZXNzaW9uc1NpemUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlbmRBbGxTZXNzaW9uc1NpemUoaW50IHNlbmRBbGxTZXNzaW9uc1NpemUpIHsKKyAgICAgICAgdGhpcy5zZW5kQWxsU2Vzc2lvbnNTaXplID0gc2VuZEFsbFNlc3Npb25zU2l6ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBub3RpZnlTZXNzaW9uTGlzdGVuZXJzT25SZXBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc05vdGlmeVNlc3Npb25MaXN0ZW5lcnNPblJlcGxpY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gbm90aWZ5U2Vzc2lvbkxpc3RlbmVyc09uUmVwbGljYXRpb247CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSBub3RpZnlMaXN0ZW5lcnNDcmVhdGVTZXNzaW9uT25SZXBsaWNhdGlvbiBUaGUgbm90aWZ5U2Vzc2lvbkxpc3RlbmVyc09uUmVwbGljYXRpb24gdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmeVNlc3Npb25MaXN0ZW5lcnNPblJlcGxpY2F0aW9uKAorICAgICAgICAgICAgYm9vbGVhbiBub3RpZnlMaXN0ZW5lcnNDcmVhdGVTZXNzaW9uT25SZXBsaWNhdGlvbikgeworICAgICAgICB0aGlzLm5vdGlmeVNlc3Npb25MaXN0ZW5lcnNPblJlcGxpY2F0aW9uID0gbm90aWZ5TGlzdGVuZXJzQ3JlYXRlU2Vzc2lvbk9uUmVwbGljYXRpb247CisgICAgfQorICAgIAorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzRXhwaXJlU2Vzc2lvbnNPblNodXRkb3duKCkgeworICAgICAgICByZXR1cm4gZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4cGlyZVNlc3Npb25zT25TaHV0ZG93bihib29sZWFuIGV4cGlyZVNlc3Npb25zT25TaHV0ZG93bikgeworICAgICAgICB0aGlzLmV4cGlyZVNlc3Npb25zT25TaHV0ZG93biA9IGV4cGlyZVNlc3Npb25zT25TaHV0ZG93bjsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNOb3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gbm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROb3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uKAorICAgICAgICAgICAgYm9vbGVhbiBub3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uKSB7CisgICAgICAgIHRoaXMubm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbiA9IG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb247CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkZWZhdWx0TW9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRNb2RlKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdE1vZGU7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSBkZWZhdWx0TW9kZSBUaGUgZGVmYXVsdE1vZGUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRNb2RlKGJvb2xlYW4gZGVmYXVsdE1vZGUpIHsKKyAgICAgICAgdGhpcy5kZWZhdWx0TW9kZSA9IGRlZmF1bHRNb2RlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ2F0YWxpbmFDbHVzdGVyIGdldENsdXN0ZXIoKSB7CisgICAgICAgIHJldHVybiBjbHVzdGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXIoQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIpIHsKKyAgICAgICAgdGhpcy5jbHVzdGVyID0gY2x1c3RlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENvbnRhaW5lciB3aXRoIHdoaWNoIHRoaXMgTWFuYWdlciBoYXMgYmVlbiBhc3NvY2lhdGVkLiBJZiBpdCBpcyBhCisgICAgICogQ29udGV4dCAodGhlIHVzdWFsIGNhc2UpLCBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlIHNlc3Npb24gdGltZW91dAorICAgICAqIHByb3BlcnR5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250YWluZXIKKyAgICAgKiAgICAgICAgICAgIFRoZSBhc3NvY2lhdGVkIENvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgY29udGFpbmVyKSB7CisKKyAgICAgICAgLy8gRGUtcmVnaXN0ZXIgZnJvbSB0aGUgb2xkIENvbnRhaW5lciAoaWYgYW55KQorICAgICAgICBpZiAoKHRoaXMuY29udGFpbmVyICE9IG51bGwpICYmICh0aGlzLmNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgKChDb250ZXh0KSB0aGlzLmNvbnRhaW5lcikucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICAvLyBEZWZhdWx0IHByb2Nlc3NpbmcgcHJvdmlkZWQgYnkgb3VyIHN1cGVyY2xhc3MKKyAgICAgICAgc3VwZXIuc2V0Q29udGFpbmVyKGNvbnRhaW5lcik7CisKKyAgICAgICAgLy8gUmVnaXN0ZXIgd2l0aCB0aGUgbmV3IENvbnRhaW5lciAoaWYgYW55KQorICAgICAgICBpZiAoKHRoaXMuY29udGFpbmVyICE9IG51bGwpICYmICh0aGlzLmNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpKSB7CisgICAgICAgICAgICBzZXRNYXhJbmFjdGl2ZUludGVydmFsKCgoQ29udGV4dCkgdGhpcy5jb250YWluZXIpCisgICAgICAgICAgICAgICAgICAgIC5nZXRTZXNzaW9uVGltZW91dCgpICogNjApOworICAgICAgICAgICAgKChDb250ZXh0KSB0aGlzLmNvbnRhaW5lcikuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuZCByZXR1cm4gYSBuZXcgc2Vzc2lvbiBvYmplY3QsIGJhc2VkIG9uIHRoZSBkZWZhdWx0IHNldHRpbmdzCisgICAgICogc3BlY2lmaWVkIGJ5IHRoaXMgTWFuYWdlcidzIHByb3BlcnRpZXMuIFRoZSBzZXNzaW9uIGlkIHdpbGwgYmUgYXNzaWduZWQKKyAgICAgKiBieSB0aGlzIG1ldGhvZCwgYW5kIGF2YWlsYWJsZSB2aWEgdGhlIGdldElkKCkgbWV0aG9kIG9mIHRoZSByZXR1cm5lZAorICAgICAqIHNlc3Npb24uIElmIGEgbmV3IHNlc3Npb24gY2Fubm90IGJlIGNyZWF0ZWQgZm9yIGFueSByZWFzb24sIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYSBuZXcgc2Vzc2lvbiBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGZvciBhbnkgcmVhc29uCisgICAgICogCisgICAgICogQ29uc3RydWN0IGFuZCByZXR1cm4gYSBuZXcgc2Vzc2lvbiBvYmplY3QsIGJhc2VkIG9uIHRoZSBkZWZhdWx0IHNldHRpbmdzCisgICAgICogc3BlY2lmaWVkIGJ5IHRoaXMgTWFuYWdlcidzIHByb3BlcnRpZXMuIFRoZSBzZXNzaW9uIGlkIHdpbGwgYmUgYXNzaWduZWQKKyAgICAgKiBieSB0aGlzIG1ldGhvZCwgYW5kIGF2YWlsYWJsZSB2aWEgdGhlIGdldElkKCkgbWV0aG9kIG9mIHRoZSByZXR1cm5lZAorICAgICAqIHNlc3Npb24uIElmIGEgbmV3IHNlc3Npb24gY2Fubm90IGJlIGNyZWF0ZWQgZm9yIGFueSByZWFzb24sIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYSBuZXcgc2Vzc2lvbiBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGZvciBhbnkgcmVhc29uCisgICAgICovCisgICAgcHVibGljIFNlc3Npb24gY3JlYXRlU2Vzc2lvbihTdHJpbmcgc2Vzc2lvbklkKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVTZXNzaW9uKHNlc3Npb25JZCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlIG5ldyBzZXNzaW9uIHdpdGggY2hlY2sgbWF4QWN0aXZlU2Vzc2lvbnMgYW5kIHNlbmQgc2Vzc2lvbiBjcmVhdGlvbgorICAgICAqIHRvIG90aGVyIGNsdXN0ZXIgbm9kZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGRpc3RyaWJ1dGUKKyAgICAgKiBAcmV0dXJuIFRoZSBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIFNlc3Npb24gY3JlYXRlU2Vzc2lvbihTdHJpbmcgc2Vzc2lvbklkLCBib29sZWFuIGRpc3RyaWJ1dGUpIHsKKworICAgICAgICBpZiAoKG1heEFjdGl2ZVNlc3Npb25zID49IDApICYmIChzZXNzaW9ucy5zaXplKCkgPj0gbWF4QWN0aXZlU2Vzc2lvbnMpKSB7CisgICAgICAgICAgICByZWplY3RlZFNlc3Npb25zKys7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHNtCisgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoImRlbHRhTWFuYWdlci5jcmVhdGVTZXNzaW9uLmlzZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIERlbHRhU2Vzc2lvbiBzZXNzaW9uID0gKERlbHRhU2Vzc2lvbikgc3VwZXIuY3JlYXRlU2Vzc2lvbihzZXNzaW9uSWQpIDsKKyAgICAgICAgc2Vzc2lvbi5zZXRFeHBpcmVUb2xlcmFuY2UodGhpcy5leHBpcmVUb2xlcmFuY2UpOworICAgICAgICBpZiAoZGlzdHJpYnV0ZSkgeworICAgICAgICAgICAgc2VuZENyZWF0ZVNlc3Npb24oc2Vzc2lvbi5nZXRJZCgpLCBzZXNzaW9uKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIuY3JlYXRlU2Vzc2lvbi5uZXdTZXNzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJZCgpLCBuZXcgSW50ZWdlcihzZXNzaW9ucy5zaXplKCkpKSk7CisKKyAgICAgICAgcmV0dXJuIChzZXNzaW9uKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgY3JlYXRlIHNlc3Npb24gZXZ0IHRvIGFsbCBiYWNrdXAgbm9kZQorICAgICAqIEBwYXJhbSBzZXNzaW9uSWQKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlbmRDcmVhdGVTZXNzaW9uKFN0cmluZyBzZXNzaW9uSWQsIERlbHRhU2Vzc2lvbiBzZXNzaW9uKSB7CisgICAgICAgIGlmKGNsdXN0ZXIuZ2V0TWVtYmVycygpLmxlbmd0aCA+IDAgKSB7CisgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZSBtc2cgPSBuZXcgU2Vzc2lvbk1lc3NhZ2VJbXBsKGdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fQ1JFQVRFRCwgbnVsbCwgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQgKyAiLSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICBtc2cuc2V0VGltZXN0YW1wKHNlc3Npb24uZ2V0Q3JlYXRpb25UaW1lKCkpOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImRlbHRhTWFuYWdlci5zZW5kTWVzc2FnZS5uZXdTZXNzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHNlc3Npb25JZCkpOworICAgICAgICAgICAgY291bnRlclNlbmRfRVZUX1NFU1NJT05fQ1JFQVRFRCsrOworICAgICAgICAgICAgc2VuZChtc2cpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNlbmQgbWVzc2FnZXMgdG8gb3RoZXIgYmFja3VwIG1lbWJlciAoZG9tYWluIG9yIGFsbCkKKyAgICAgKiBAcGFyYW0gbXNnIFNlc3Npb24gbWVzc2FnZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlbmQoU2Vzc2lvbk1lc3NhZ2UgbXNnKSB7CisgICAgICAgIGlmKGNsdXN0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYoaXNTZW5kQ2x1c3RlckRvbWFpbk9ubHkoKSkKKyAgICAgICAgICAgICAgICBjbHVzdGVyLnNlbmRDbHVzdGVyRG9tYWluKG1zZyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY2x1c3Rlci5zZW5kKG1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgRGVsdGFTZXNzaW9uCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXIjY3JlYXRlRW1wdHlTZXNzaW9uKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU2Vzc2lvbiBjcmVhdGVFbXB0eVNlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBnZXROZXdEZWx0YVNlc3Npb24oKSA7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldCBuZXcgc2Vzc2lvbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkb0xvYWQoKSBtZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIERlbHRhU2Vzc2lvbiBnZXROZXdEZWx0YVNlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgRGVsdGFTZXNzaW9uKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgRGVsdGFyZXF1ZXN0IGZyb20gZXh0ZXJuYWwgbm9kZQorICAgICAqIExvYWQgdGhlIENsYXNzIGF0IGNvbnRhaW5lciBjbGFzc2xvYWRlcgorICAgICAqIEBzZWUgRGVsdGFSZXF1ZXN0I3JlYWRFeHRlcm5hbChqYXZhLmlvLk9iamVjdElucHV0KQorICAgICAqIEBwYXJhbSBzZXNzaW9uCisgICAgICogQHBhcmFtIGRhdGEgbWVzc2FnZSBkYXRhCisgICAgICogQHJldHVybiBUaGUgcmVxdWVzdAorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGVsdGFSZXF1ZXN0IGxvYWREZWx0YVJlcXVlc3QoRGVsdGFTZXNzaW9uIHNlc3Npb24sIGJ5dGVbXSBkYXRhKQorICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKKyAgICAgICAgUmVwbGljYXRpb25TdHJlYW0gb2lzID0gbnVsbDsKKyAgICAgICAgTG9hZGVyIGxvYWRlciA9IG51bGw7CisgICAgICAgIGZpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKKyAgICAgICAgb2lzID0gbmV3IFJlcGxpY2F0aW9uU3RyZWFtKGZpcywgZ2V0Q2xhc3NMb2FkZXJzKHRoaXMuY29udGFpbmVyKVswXSk7CisgICAgICAgIHNlc3Npb24uZ2V0RGVsdGFSZXF1ZXN0KCkucmVhZEV4dGVybmFsKG9pcyk7CisgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXREZWx0YVJlcXVlc3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXJpYWxpemUgRGVsdGFSZXF1ZXN0CisgICAgICogQHNlZSBEZWx0YVJlcXVlc3Qjd3JpdGVFeHRlcm5hbChqYXZhLmlvLk9iamVjdE91dHB1dCkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVsdGFSZXF1ZXN0CisgICAgICogQHJldHVybiBzZXJpYWxpemVkIGRlbHRhIHJlcXVlc3QKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGJ5dGVbXSB1bmxvYWREZWx0YVJlcXVlc3QoRGVsdGFSZXF1ZXN0IGRlbHRhUmVxdWVzdCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJvcyk7CisgICAgICAgIGRlbHRhUmVxdWVzdC53cml0ZUV4dGVybmFsKG9vcyk7CisgICAgICAgIG9vcy5mbHVzaCgpOworICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIGJvcy50b0J5dGVBcnJheSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgc2Vzc2lvbnMgZnJvbSBvdGhlciBjbHVzdGVyIG5vZGUuCisgICAgICogRklYTUUgcmVwbGFjZSBjdXJyZW50bHkgc2Vzc2lvbnMgd2l0aCBzYW1lIGlkIHdpdGhvdXQgbm90aWZjYXRpb24uCisgICAgICogRklYTUUgU1NPIGhhbmRsaW5nIGlzIG5vdCByZWFsbHkgY29ycmVjdCB3aXRoIHRoZSBzZXNzaW9uIHJlcGxhY2VtZW50IQorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGEgc2VyaWFsaXplZCBjbGFzcyBjYW5ub3QgYmUgZm91bmQgZHVyaW5nIHRoZSByZWxvYWQKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlc2VyaWFsaXplU2Vzc2lvbnMoYnl0ZVtdIGRhdGEpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLAorICAgICAgICAgICAgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIEluaXRpYWxpemUgb3VyIGludGVybmFsIGRhdGEgc3RydWN0dXJlcworICAgICAgICAvL3Nlc3Npb25zLmNsZWFyKCk7IC8vc2hvdWxkIG5vdCBkbyB0aGlzCisgICAgICAgIC8vIE9wZW4gYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQgcGF0aG5hbWUsIGlmIGFueQorICAgICAgICBDbGFzc0xvYWRlciBvcmlnaW5hbExvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkKKyAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG51bGw7CisgICAgICAgIC8vIExvYWQgdGhlIHByZXZpb3VzbHkgdW5sb2FkZWQgYWN0aXZlIHNlc3Npb25zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvaXMgPSBvcGVuRGVzZXJpYWxpemVPYmplY3RTdHJlYW0oZGF0YSk7CisgICAgICAgICAgICBJbnRlZ2VyIGNvdW50ID0gKEludGVnZXIpIG9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBpbnQgbiA9IGNvdW50LmludFZhbHVlKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgIERlbHRhU2Vzc2lvbiBzZXNzaW9uID0gKERlbHRhU2Vzc2lvbikgY3JlYXRlRW1wdHlTZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZWFkT2JqZWN0RGF0YShvaXMpOworICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0TWFuYWdlcih0aGlzKTsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLnNldFZhbGlkKHRydWUpOworICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0UHJpbWFyeVNlc3Npb24oZmFsc2UpOworICAgICAgICAgICAgICAgIC8vaW4gY2FzZSB0aGUgbm9kZXMgaW4gdGhlIGNsdXN0ZXIgYXJlIG91dCBvZgorICAgICAgICAgICAgICAgIC8vdGltZSBzeW5jaCwgdGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgdGhlCisgICAgICAgICAgICAgICAgLy9jb3JyZWN0IHRpbWVzdGFtcCwgaXNWYWxpZCByZXR1cm5zIHRydWUsIGNhdXNlCisgICAgICAgICAgICAgICAgLy8gYWNjZXNzQ291bnQ9MQorICAgICAgICAgICAgICAgIHNlc3Npb24uYWNjZXNzKCk7CisgICAgICAgICAgICAgICAgLy9tYWtlIHN1cmUgdGhhdCB0aGUgc2Vzc2lvbiBnZXRzIHJlYWR5IHRvIGV4cGlyZSBpZgorICAgICAgICAgICAgICAgIC8vIG5lZWRlZAorICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0QWNjZXNzQ291bnQoMCk7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZXNldERlbHRhUmVxdWVzdCgpOworICAgICAgICAgICAgICAgIC8vIEZJWE1FIEhvdyBpbmZvcm0gb3RoZXIgc2Vzc2lvbiBpZCBjYWNoZSBsaWtlIFNpbmdsZVNpZ25PbgorICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudCBzZXNzaW9uQ291bnRlciB0byBjb3JyZWN0IHN0YXRzIHJlcG9ydAorICAgICAgICAgICAgICAgIGlmIChmaW5kU2Vzc2lvbihzZXNzaW9uLmdldElkSW50ZXJuYWwoKSkgPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkNvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uUmVwbGFjZUNvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgYmV0dGVyIGlzIHRvIGdyYXAgdGhpcyBzZXNzaW9ucyBhZ2FpbiAhCisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVsdGFNYW5hZ2VyLmxvYWRpbmcuZXhpc3Rpbmcuc2Vzc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SWRJbnRlcm5hbCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZChzZXNzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIubG9hZGluZy5jbmZlIiwgZSksIGUpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLmxvYWRpbmcuaW9lIiwgZSksIGUpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIENsb3NlIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKG9pcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGYpIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmVkCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvaXMgPSBudWxsOworICAgICAgICAgICAgaWYgKG9yaWdpbmFsTG9hZGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIob3JpZ2luYWxMb2FkZXIpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIFN0cmVhbSBhbmQgdXNlIGNvcnJlY3QgQ2xhc3NMb2FkZXIgKENvbnRhaW5lcikgU3dpdGNoCisgICAgICogVGhyZWFkQ2xhc3NMb2FkZXIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqIEByZXR1cm4gVGhlIG9iamVjdCBpbnB1dCBzdHJlYW0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdElucHV0U3RyZWFtIG9wZW5EZXNlcmlhbGl6ZU9iamVjdFN0cmVhbShieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbnVsbDsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExvYWRlciBsb2FkZXIgPSBudWxsOworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOworICAgICAgICAgICAgZmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOworICAgICAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmaXMpOworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGxvYWRlciA9IGNvbnRhaW5lci5nZXRMb2FkZXIoKTsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciA9IGxvYWRlci5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShzbS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlbHRhTWFuYWdlci5sb2FkaW5nLndpdGhDb250ZXh0Q2xhc3NMb2FkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgIG9pcyA9IG5ldyBDdXN0b21PYmplY3RJbnB1dFN0cmVhbShiaXMsIGNsYXNzTG9hZGVyKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjbGFzc0xvYWRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVsdGFNYW5hZ2VyLmxvYWRpbmcud2l0aG91dENsYXNzTG9hZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLmxvYWRpbmcuaW9lIiwgZSksIGUpOworICAgICAgICAgICAgaWYgKG9pcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgb2lzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZikgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9pcyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZSBhbnkgY3VycmVudGx5IGFjdGl2ZSBzZXNzaW9ucyBpbiB0aGUgYXBwcm9wcmlhdGUgcGVyc2lzdGVuY2UKKyAgICAgKiBtZWNoYW5pc20sIGlmIGFueS4gSWYgcGVyc2lzdGVuY2UgaXMgbm90IHN1cHBvcnRlZCwgdGhpcyBtZXRob2QgcmV0dXJucworICAgICAqIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIHNlcmlhbGl6ZVNlc3Npb25zKFNlc3Npb25bXSBjdXJyZW50U2Vzc2lvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gT3BlbiBhbiBvdXRwdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQgcGF0aG5hbWUsIGlmIGFueQorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKKyAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGZvcykpOworICAgICAgICAgICAgb29zLndyaXRlT2JqZWN0KG5ldyBJbnRlZ2VyKGN1cnJlbnRTZXNzaW9ucy5sZW5ndGgpKTsKKyAgICAgICAgICAgIGZvcihpbnQgaT0wIDsgaSA8IGN1cnJlbnRTZXNzaW9ucy5sZW5ndGg7aSsrKSB7CisgICAgICAgICAgICAgICAgKChEZWx0YVNlc3Npb24pY3VycmVudFNlc3Npb25zW2ldKS53cml0ZU9iamVjdERhdGEob29zKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGbHVzaCBhbmQgY2xvc2UgdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICAgIG9vcy5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIudW5sb2FkaW5nLmlvZSIsIGUpLCBlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAob29zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb29zID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBzZW5kIG9iamVjdCBkYXRhIGFzIGJ5dGVbXQorICAgICAgICByZXR1cm4gZm9zLnRvQnl0ZUFycmF5KCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcworICAgICAqIExpZmVjeWNsZSBoYXMgbm8gbGlzdGVuZXJzIHJlZ2lzdGVyZWQsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUxpc3RlbmVyW10gZmluZExpZmVjeWNsZUxpc3RlbmVycygpIHsKKworICAgICAgICByZXR1cm4gbGlmZWN5Y2xlLmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBsaXN0ZW5lcgorICAgICAqICAgICAgICAgICAgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLnJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciA8Y29kZT5jb25maWd1cmUoKTwvY29kZT4sCisgICAgICogYW5kIGJlZm9yZSBhbnkgb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoZSBjb21wb25lbnQgYXJlIHV0aWxpemVkLgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yIHRoYXQgcHJldmVudHMgdGhpcworICAgICAqICAgICAgICAgICAgICAgIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICAgICAgaW5pdCgpOworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmIChzdGFydGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5pbmZvKCJTdGFydGluZyBjbHVzdGVyaW5nIG1hbmFnZXIuLi46IitnZXROYW1lKCkpOworICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgLy8gRm9yY2UgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgIGdlbmVyYXRlU2Vzc2lvbklkKCk7CisKKyAgICAgICAgLy8gTG9hZCB1bmxvYWRlZCBzZXNzaW9ucywgaWYgYW55CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvL3RoZSBjaGFubmVsIGlzIGFscmVhZHkgcnVubmluZworICAgICAgICAgICAgQ2x1c3RlciBjbHVzdGVyID0gZ2V0Q2x1c3RlcigpIDsKKyAgICAgICAgICAgIC8vIHN0b3AgcmVtb3ZlIGNsdXN0ZXIgYmluZGluZworICAgICAgICAgICAgaWYoY2x1c3RlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGFpbmVyIGNvbnRleHQgPSBnZXRDb250YWluZXIoKSA7CisgICAgICAgICAgICAgICAgaWYoY29udGV4dCAhPSBudWxsICYmIGNvbnRleHQgaW5zdGFuY2VvZiBDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICBDb250YWluZXIgaG9zdCA9IGNvbnRleHQuZ2V0UGFyZW50KCkgOworICAgICAgICAgICAgICAgICAgICAgaWYoaG9zdCAhPSBudWxsICYmIGhvc3QgaW5zdGFuY2VvZiBIb3N0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlciA9IGhvc3QuZ2V0Q2x1c3RlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNsdXN0ZXIgIT0gbnVsbCAmJiBjbHVzdGVyIGluc3RhbmNlb2YgQ2F0YWxpbmFDbHVzdGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENsdXN0ZXIoKENhdGFsaW5hQ2x1c3RlcikgY2x1c3RlcikgOworICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lciBlbmdpbmUgPSBob3N0LmdldFBhcmVudCgpIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZW5naW5lICE9IG51bGwgJiYgZW5naW5lIGluc3RhbmNlb2YgRW5naW5lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyID0gZW5naW5lLmdldENsdXN0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNsdXN0ZXIgIT0gbnVsbCAmJiBjbHVzdGVyIGluc3RhbmNlb2YgQ2F0YWxpbmFDbHVzdGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENsdXN0ZXIoKENhdGFsaW5hQ2x1c3RlcikgY2x1c3RlcikgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIgPSBudWxsIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2x1c3RlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLm5vQ2x1c3RlciIsIGdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSAidW5rbm93biIgOworICAgICAgICAgICAgICAgICAgICBpZiggY2x1c3Rlci5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIEhvc3QpeworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJIb3N0IiA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiggY2x1c3Rlci5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIEVuZ2luZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIkVuZ2luZSIgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKHNtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLnJlZ2lzdGVyQ2x1c3RlciIsIGdldE5hbWUoKSwgdHlwZSwgY2x1c3Rlci5nZXRDbHVzdGVyTmFtZSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oc20KKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoImRlbHRhTWFuYWdlci5zdGFydENsdXN0ZXJpbmciLCBnZXROYW1lKCkpKTsKKyAgICAgICAgICAgIC8vdG8gc3VydmljZSBjb250ZXh0IHJlbG9hZHMsIGFzIG9ubHkgYSBzdG9wL3N0YXJ0IGlzIGNhbGxlZCwgbm90CisgICAgICAgICAgICAvLyBjcmVhdGVNYW5hZ2VyCisgICAgICAgICAgICAoKENhdGFsaW5hQ2x1c3RlciljbHVzdGVyKS5hZGRNYW5hZ2VyKGdldE5hbWUoKSwgdGhpcyk7CisKKyAgICAgICAgICAgIGdldEFsbENsdXN0ZXJTZXNzaW9ucygpOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIubWFuYWdlckxvYWQiKSwgdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgZnJvbSBmaXJzdCBzZXNzaW9uIG1hc3RlciB0aGUgYmFja3VwIGZyb20gYWxsIGNsdXN0ZXJlZCBzZXNzaW9ucworICAgICAqIEBzZWUgI2ZpbmRTZXNzaW9uTWFzdGVyTWVtYmVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZ2V0QWxsQ2x1c3RlclNlc3Npb25zKCkgeworICAgICAgICBpZiAoY2x1c3RlciAhPSBudWxsICYmIGNsdXN0ZXIuZ2V0TWVtYmVycygpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGxvbmcgYmVmb3JlU2VuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIE1lbWJlciBtYnIgPSBmaW5kU2Vzc2lvbk1hc3Rlck1lbWJlcigpOworICAgICAgICAgICAgaWYobWJyID09IG51bGwpIHsgLy8gTm8gZG9tYWluIG1lbWJlciBmb3VuZAorICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZSBtc2cgPSBuZXcgU2Vzc2lvbk1lc3NhZ2VJbXBsKHRoaXMuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZS5FVlRfR0VUX0FMTF9TRVNTSU9OUywgbnVsbCwgIkdFVC1BTEwiLAorICAgICAgICAgICAgICAgICAgICAiR0VULUFMTC0iICsgZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIG1zZy5zZXRSZXNlbmQoQ2x1c3Rlck1lc3NhZ2UuRkxBR19GT1JCSURERU4pOworICAgICAgICAgICAgLy8gc2V0IHJlZmVyZW5jZSB0aW1lCisgICAgICAgICAgICBtc2cuc2V0VGltZXN0YW1wKGJlZm9yZVNlbmRUaW1lKTsKKyAgICAgICAgICAgIHN0YXRlVHJhbnNmZXJDcmVhdGVTZW5kVGltZSA9IGJlZm9yZVNlbmRUaW1lIDsKKyAgICAgICAgICAgIC8vIHJlcXVlc3Qgc2Vzc2lvbiBzdGF0ZQorICAgICAgICAgICAgY291bnRlclNlbmRfRVZUX0dFVF9BTExfU0VTU0lPTlMrKzsKKyAgICAgICAgICAgIHN0YXRlVHJhbnNmZXJlZCA9IGZhbHNlIDsKKyAgICAgICAgICAgIC8vIEZJWE1FIFRoaXMgc2VuZCBjYWxsIGJsb2NrIHRoZSBkZXBsb3kgdGhyZWFkLCB3aGVuIHNlbmRlciB3YWl0Rm9yQWNrIGlzIGVuYWJsZWQKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKHJlY2VpdmVkTWVzc2FnZVF1ZXVlKSB7CisgICAgICAgICAgICAgICAgICAgICByZWNlaXZlclF1ZXVlID0gdHJ1ZSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsdXN0ZXIuc2VuZChtc2csIG1icik7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLndhaXRGb3JTZXNzaW9uU3RhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKSwgbWJyKSk7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgQXQgc2VuZGVyIGFjayBtb2RlIHRoaXMgbWV0aG9kIGNoZWNrIG9ubHkgdGhlIHN0YXRlIHRyYW5zZmVyIGFuZCByZXNlbmQgaXMgYSBwcm9ibGVtIQorICAgICAgICAgICAgICAgIHdhaXRGb3JTZW5kQWxsU2Vzc2lvbnMoYmVmb3JlU2VuZFRpbWUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQocmVjZWl2ZWRNZXNzYWdlUXVldWUpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcmVjZWl2ZWRNZXNzYWdlUXVldWUuaXRlcmF0b3IoKTsgaXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZSBzbXNnID0gKFNlc3Npb25NZXNzYWdlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGVUaW1lc3RhbXBEcm9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVJlY2VpdmVkKHNtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbXNnLmdldEFkZHJlc3MoKSAhPSBudWxsID8gKE1lbWJlcikgc21zZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWRkcmVzcygpIDogbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbXNnLmdldEV2ZW50VHlwZSgpICE9IFNlc3Npb25NZXNzYWdlLkVWVF9HRVRfQUxMX1NFU1NJT05TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzbXNnLmdldFRpbWVzdGFtcCgpID49IHN0YXRlVHJhbnNmZXJDcmVhdGVTZW5kVGltZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBoYW5kbGUgRVZUX0dFVF9BTExfU0VTU0lPTlMgbGF0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVJlY2VpdmVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21zZy5nZXRBZGRyZXNzKCkgIT0gbnVsbCA/IChNZW1iZXIpIHNtc2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBZGRyZXNzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlbHRhTWFuYWdlci5kcm9wTWVzc2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKSwgc21zZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFdmVudFR5cGVTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoc3RhdGVUcmFuc2ZlckNyZWF0ZVNlbmRUaW1lKSwgbmV3IERhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21zZy5nZXRUaW1lc3RhbXAoKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkTWVzc2FnZVF1ZXVlLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyUXVldWUgPSBmYWxzZSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoImRlbHRhTWFuYWdlci5ub01lbWJlcnMiLCBnZXROYW1lKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGNyb3NzIGNvbnRleHQgc2Vzc2lvbiBhdCByZXBsaWNhdGlvbiB2YWx2ZSB0aHJlYWQgbG9jYWwKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiBjcm9zcyBjb250ZXh0IHNlc3Npb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclNlc3Npb25BdFJlcGxpY2F0aW9uVmFsdmUoRGVsdGFTZXNzaW9uIHNlc3Npb24pIHsKKwkgICAgCWlmKHJlcGxpY2F0aW9uVmFsdmUgPT0gbnVsbCkgeworCSAgICAJCWlmKGNvbnRhaW5lciBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dAorCSAgICAJCQkJJiYgKChTdGFuZGFyZENvbnRleHQpY29udGFpbmVyKS5nZXRDcm9zc0NvbnRleHQoKSkgeworCSAgICAJCQlDbHVzdGVyIGNsdXN0ZXIgPSBnZXRDbHVzdGVyKCkgOworCSAgICAJCQlpZihjbHVzdGVyICE9IG51bGwgJiYgY2x1c3RlciBpbnN0YW5jZW9mIENhdGFsaW5hQ2x1c3RlcikgeworCSAgICAJCQkJVmFsdmVbXSB2YWx2ZXMgPSAoKENhdGFsaW5hQ2x1c3RlciljbHVzdGVyKS5nZXRWYWx2ZXMoKTsKKwkgICAgCQkJCWlmKHZhbHZlcyAhPSBudWxsICYmIHZhbHZlcy5sZW5ndGggPiAwKSB7CisJICAgIAkJCQkJZm9yKGludCBpPTA7IHJlcGxpY2F0aW9uVmFsdmUgPT0gbnVsbCAmJiBpIDwgdmFsdmVzLmxlbmd0aCA7IGkrKyApeworCSAgICAJCQkJCQlpZih2YWx2ZXNbaV0gaW5zdGFuY2VvZiBSZXBsaWNhdGlvblZhbHZlKQorCSAgICAJCQkJCQkJcmVwbGljYXRpb25WYWx2ZSA9IChSZXBsaWNhdGlvblZhbHZlKXZhbHZlc1tpXSA7CisJICAgIAkJCQkJfQorCSAgICAJCQkJCQorCSAgICAJCQkJCWlmKHJlcGxpY2F0aW9uVmFsdmUgPT0gbnVsbCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCSAgICAJCQkJCQlsb2cuZGVidWcoIm5vIFJlcGxpY2F0aW9uVmFsdmUgZm91bmQgZm9yIENyb3NzQ29udGV4dCBTdXBwb3J0Iik7CisJICAgIAkJCQkJfQorCSAgICAJCQkJfQorCSAgICAJCQl9CisJICAgIAkJfQorCSAgICAJfQorCSAgICAJaWYocmVwbGljYXRpb25WYWx2ZSAhPSBudWxsKSB7CisJICAgIAkJcmVwbGljYXRpb25WYWx2ZS5yZWdpc3RlclJlcGxpY2F0aW9uU2Vzc2lvbihzZXNzaW9uKTsKKwkgICAgCX0KKyAgICAJfQorICAgIAorICAgIC8qKgorICAgICAqIEZpbmQgdGhlIG1hc3RlciBvZiB0aGUgc2Vzc2lvbiBzdGF0ZQorICAgICAqIEByZXR1cm4gbWFzdGVyIG1lbWJlciBvZiBzZXNzaW9ucyAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWVtYmVyIGZpbmRTZXNzaW9uTWFzdGVyTWVtYmVyKCkgeworICAgICAgICBNZW1iZXIgbWJyID0gbnVsbDsKKyAgICAgICAgTWVtYmVyIG1icnNbXSA9IGNsdXN0ZXIuZ2V0TWVtYmVycygpOworICAgICAgICBTdHJpbmcgbG9jYWxNZW1iZXJEb21haW4gPSBjbHVzdGVyLmdldE1lbWJlcnNoaXBTZXJ2aWNlKCkuZ2V0TG9jYWxNZW1iZXIoKS5nZXREb21haW4oKTsKKyAgICAgICAgaWYoaXNTZW5kQ2x1c3RlckRvbWFpbk9ubHkoKSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IG1iciA9PSBudWxsICYmIGkgPCBtYnJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgTWVtYmVyIG1lbWJlciA9IG1icnNbaV07CisgICAgICAgICAgICAgICAgaWYobG9jYWxNZW1iZXJEb21haW4uZXF1YWxzKG1lbWJlci5nZXREb21haW4oKSkpCisgICAgICAgICAgICAgICAgICAgIG1iciA9IG1lbWJlciA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZihtYnJzLmxlbmd0aCAhPSAwICkKKyAgICAgICAgICAgICAgICBtYnIgPSBtYnJzWzBdOworICAgICAgICB9CisgICAgICAgIGlmKG1iciA9PSBudWxsICYmIGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLm5vTWFzdGVyTWVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpLCBsb2NhbE1lbWJlckRvbWFpbikpOworICAgICAgICBpZihtYnIgIT0gbnVsbCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLmZvdW5kTWFzdGVyTWVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKSwgbWJyKSk7CisgICAgICAgIHJldHVybiBtYnI7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FpdCB0aGF0IGNsdXN0ZXIgc2Vzc2lvbiBzdGF0ZSBpcyB0cmFuc2ZlciBvciB0aW1lb3V0IGFmdGVyIDYwIFNlYworICAgICAqIFdpdGggc3RhdGVUcmFuc2ZlclRpbWVvdXQgPT0gLTEgd2FpdCB0aGF0IGJhY2t1cCBpcyB0cmFuc2ZlcmVkIChmb3JldmVyIG1vZGUpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvclNlbmRBbGxTZXNzaW9ucyhsb25nIGJlZm9yZVNlbmRUaW1lKSB7CisgICAgICAgIGxvbmcgcmVxU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9uZyByZXFOb3cgPSByZXFTdGFydCA7CisgICAgICAgIGJvb2xlYW4gaXNUaW1lb3V0ID0gZmFsc2U7CisgICAgICAgIGlmKGdldFN0YXRlVHJhbnNmZXJUaW1lb3V0KCkgPiAwKSB7CisgICAgICAgICAgICAvLyB3YWl0IHRoYXQgc3RhdGUgaXMgdHJhbnNmZXJlZCB3aXRoIHRpbWVvdXQgY2hlY2sKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gc2xlZXApIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVxTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgaXNUaW1lb3V0ID0gKChyZXFOb3cgLSByZXFTdGFydCkgPiAoMTAwMCAqIGdldFN0YXRlVHJhbnNmZXJUaW1lb3V0KCkpKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKCghZ2V0U3RhdGVUcmFuc2ZlcmVkKCkpICYmICghaXNUaW1lb3V0KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZihnZXRTdGF0ZVRyYW5zZmVyVGltZW91dCgpID09IC0xKSB7CisgICAgICAgICAgICAgICAgLy8gd2FpdCB0aGF0IHN0YXRlIGlzIHRyYW5zZmVyZWQKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHNsZWVwKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlICgoIWdldFN0YXRlVHJhbnNmZXJlZCgpKSk7CisgICAgICAgICAgICAgICAgcmVxTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzVGltZW91dCB8fCAoIWdldFN0YXRlVHJhbnNmZXJlZCgpKSkgeworICAgICAgICAgICAgY291bnRlck5vU3RhdGVUcmFuc2ZlcmVkKysgOworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLm5vU2Vzc2lvblN0YXRlIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpLG5ldyBEYXRlKGJlZm9yZVNlbmRUaW1lKSxuZXcgTG9uZyhyZXFOb3cgLSBiZWZvcmVTZW5kVGltZSkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLnNlc3Npb25SZWNlaXZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXROYW1lKCksIG5ldyBEYXRlKGJlZm9yZVNlbmRUaW1lKSwgbmV3IExvbmcocmVxTm93IC0gYmVmb3JlU2VuZFRpbWUpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHRlcm1pbmF0ZSB0aGUgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHRoZSBsYXN0IG9uZSBjYWxsZWQgb24gYSBnaXZlbiBpbnN0YW5jZQorICAgICAqIG9mIHRoaXMgY29tcG9uZW50LgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yIHRoYXQgbmVlZHMgdG8gYmUKKyAgICAgKiAgICAgICAgICAgICAgICByZXBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIuc3RvcHBlZCIsIGdldE5hbWUoKSkpOworCisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKCFzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbihzbQorICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIubm90U3RhcnRlZCIpKTsKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVE9QX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworCisgICAgICAgIC8vIEV4cGlyZSBhbGwgYWN0aXZlIHNlc3Npb25zCisgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIuZXhwaXJlU2Vzc2lvbnMiLCBnZXROYW1lKCkpKTsKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uc1tdID0gZmluZFNlc3Npb25zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vzc2lvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIERlbHRhU2Vzc2lvbiBzZXNzaW9uID0gKERlbHRhU2Vzc2lvbikgc2Vzc2lvbnNbaV07CisgICAgICAgICAgICBpZiAoIXNlc3Npb24uaXNWYWxpZCgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmV4cGlyZSh0cnVlLCBpc0V4cGlyZVNlc3Npb25zT25TaHV0ZG93bigpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9IAorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVxdWlyZSBhIG5ldyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpZiB3ZSBhcmUgcmVzdGFydGVkCisgICAgICAgIHRoaXMucmFuZG9tID0gbnVsbDsKKyAgICAgICAgZ2V0Q2x1c3RlcigpLnJlbW92ZU1hbmFnZXIoZ2V0TmFtZSgpLHRoaXMpOworICAgICAgICByZXBsaWNhdGlvblZhbHZlID0gbnVsbDsKKyAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgICAgICAgICBkZXN0cm95KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBmcm9tIG91ciBhc3NvY2lhdGVkIENvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIGV2ZW50CisgICAgICogICAgICAgICAgICBUaGUgcHJvcGVydHkgY2hhbmdlIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBzb3VyY2Ugb2YgdGhpcyBldmVudAorICAgICAgICBpZiAoIShldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAvLyBQcm9jZXNzIGEgcmVsZXZhbnQgcHJvcGVydHkgY2hhbmdlCisgICAgICAgIGlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoInNlc3Npb25UaW1lb3V0IikpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgoKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuaW50VmFsdWUoKSAqIDYwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLnNlc3Npb25UaW1lb3V0IiwgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROZXdWYWx1ZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlcGxpY2F0aW9uCisgICAgLy8gTWV0aG9kcworCisgICAgLyoqCisgICAgICogQSBtZXNzYWdlIHdhcyByZWNlaXZlZCBmcm9tIGFub3RoZXIgbm9kZSwgdGhpcyBpcyB0aGUgY2FsbGJhY2sgbWV0aG9kIHRvCisgICAgICogaW1wbGVtZW50IGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiByZWNlaXZpbmcgcmVwbGljYXRpb24gbWVzc2FnZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGNtc2cgLQorICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgcmVjZWl2ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWVzc2FnZURhdGFSZWNlaXZlZChDbHVzdGVyTWVzc2FnZSBjbXNnKSB7CisgICAgICAgIGlmIChjbXNnICE9IG51bGwgJiYgY21zZyBpbnN0YW5jZW9mIFNlc3Npb25NZXNzYWdlKSB7CisgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZSBtc2cgPSAoU2Vzc2lvbk1lc3NhZ2UpIGNtc2c7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfR0VUX0FMTF9TRVNTSU9OUzoKKyAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fQ1JFQVRFRDogCisgICAgICAgICAgICBjYXNlIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0VYUElSRUQ6IAorICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9BQ0NFU1NFRDoKKyAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fREVMVEE6IHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQocmVjZWl2ZWRNZXNzYWdlUXVldWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYocmVjZWl2ZXJRdWV1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRNZXNzYWdlUXVldWUuYWRkKG1zZyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgLy93ZSBkaWRuJ3QgcXVldWUsIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy9zd2l0Y2gKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbWVzc2FnZVJlY2VpdmVkKG1zZywgbXNnLmdldEFkZHJlc3MoKSAhPSBudWxsID8gKE1lbWJlcikgbXNnCisgICAgICAgICAgICAgICAgICAgIC5nZXRBZGRyZXNzKCkgOiBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gY29tcGxldGVkLCB0aGUgcmVwbGljYXRpb24gdmFsdmUgd2lsbCBub3RpZnkKKyAgICAgKiB0aGUgbWFuYWdlciwgYW5kIHRoZSBtYW5hZ2VyIHdpbGwgZGVjaWRlIHdoZXRoZXIgYW55IHJlcGxpY2F0aW9uIGlzCisgICAgICogbmVlZGVkIG9yIG5vdC4gSWYgdGhlcmUgaXMgYSBuZWVkIGZvciByZXBsaWNhdGlvbiwgdGhlIG1hbmFnZXIgd2lsbAorICAgICAqIGNyZWF0ZSBhIHNlc3Npb24gbWVzc2FnZSBhbmQgdGhhdCB3aWxsIGJlIHJlcGxpY2F0ZWQuIFRoZSBjbHVzdGVyCisgICAgICogZGV0ZXJtaW5lcyB3aGVyZSBpdCBnZXRzIHNlbnQuCisgICAgICogCisgICAgICogQHBhcmFtIHNlc3Npb25JZCAtCisgICAgICogICAgICAgICAgICB0aGUgc2Vzc2lvbklkIHRoYXQganVzdCBjb21wbGV0ZWQuCisgICAgICogQHJldHVybiBhIFNlc3Npb25NZXNzYWdlIHRvIGJlIHNlbnQsCisgICAgICovCisgICAgcHVibGljIENsdXN0ZXJNZXNzYWdlIHJlcXVlc3RDb21wbGV0ZWQoU3RyaW5nIHNlc3Npb25JZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRGVsdGFTZXNzaW9uIHNlc3Npb24gPSAoRGVsdGFTZXNzaW9uKSBmaW5kU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICAgICAgRGVsdGFSZXF1ZXN0IGRlbHRhUmVxdWVzdCA9IHNlc3Npb24uZ2V0RGVsdGFSZXF1ZXN0KCk7CisgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZSBtc2cgPSBudWxsOworICAgICAgICAgICAgYm9vbGVhbiBpc0RlbHRhUmVxdWVzdCA9IGZhbHNlIDsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChkZWx0YVJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICBpc0RlbHRhUmVxdWVzdCA9IGRlbHRhUmVxdWVzdC5nZXRTaXplKCkgPiAwIDsKKyAgICAgICAgICAgICAgICBpZiAoaXNEZWx0YVJlcXVlc3QpIHsgICAgCisgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0RFTFRBKys7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gdW5sb2FkRGVsdGFSZXF1ZXN0KGRlbHRhUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIG1zZyA9IG5ldyBTZXNzaW9uTWVzc2FnZUltcGwoZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0RFTFRBLCBkYXRhLCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkICsgIi0iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnJlc2V0RGVsdGFSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgfSAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZighaXNEZWx0YVJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICBpZighc2Vzc2lvbi5pc1ByaW1hcnlTZXNzaW9uKCkpIHsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgY291bnRlclNlbmRfRVZUX1NFU1NJT05fQUNDRVNTRUQrKzsKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gbmV3IFNlc3Npb25NZXNzYWdlSW1wbChnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fQUNDRVNTRUQsIG51bGwsIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQgKyAiLSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlbHRhTWFuYWdlci5jcmVhdGVNZXNzYWdlLmFjY2Vzc0NoYW5nZVByaW1hcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROYW1lKCksIHNlc3Npb25JZCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAgICAKKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIGxvZyBvbmx5IG91dHNpZGUgc3luY2ggYmxvY2shCisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVsdGFNYW5hZ2VyLmNyZWF0ZU1lc3NhZ2UuZGVsdGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpLCBzZXNzaW9uSWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXNzaW9uLnNldFByaW1hcnlTZXNzaW9uKHRydWUpOworICAgICAgICAgICAgLy9jaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBzZW5kIG91dCBhbiBhY2Nlc3MgbWVzc2FnZQorICAgICAgICAgICAgaWYgKChtc2cgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBsb25nIHJlcGxEZWx0YSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCisgICAgICAgICAgICAgICAgICAgICAgICAtIHNlc3Npb24uZ2V0TGFzdFRpbWVSZXBsaWNhdGVkKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcGxEZWx0YSA+PSB1cGRhdGVBY3RpdmVJbnRlcnZhbCoxMDAwIHx8CisgICAgICAgICAgICAgICAgICAgIChnZXRNYXhJbmFjdGl2ZUludGVydmFsKCk+PTAgJiYKKyAgICAgICAgICAgICAgICAgICAgcmVwbERlbHRhID49IGdldE1heEluYWN0aXZlSW50ZXJ2YWwoKSoxMDAwKSkgeworICAgICAgICAgICAgICAgICAgICBjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9BQ0NFU1NFRCsrOworICAgICAgICAgICAgICAgICAgICBtc2cgPSBuZXcgU2Vzc2lvbk1lc3NhZ2VJbXBsKGdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9BQ0NFU1NFRCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHNlc3Npb25JZCArICItIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVsdGFNYW5hZ2VyLmNyZWF0ZU1lc3NhZ2UuYWNjZXNzIiwgZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3VwZGF0ZSBsYXN0IHJlcGxpY2F0ZWQgdGltZQorICAgICAgICAgICAgaWYgKG1zZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0TGFzdFRpbWVSZXBsaWNhdGVkKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICJkZWx0YU1hbmFnZXIuY3JlYXRlTWVzc2FnZS51bmFibGVDcmVhdGVEZWx0YVJlcXVlc3QiLAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQpLCB4KTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICB9CisgICAgLyoqCisgICAgICogUmVzZXQgbWFuYWdlciBzdGF0aXN0aWNzCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0U3RhdGlzdGljcygpIHsKKyAgICAgICAgcHJvY2Vzc2luZ1RpbWUgPSAwIDsKKyAgICAgICAgZXhwaXJlZFNlc3Npb25zID0gMCA7CisgICAgICAgIHJlamVjdGVkU2Vzc2lvbnMgPSAwIDsKKyAgICAgICAgc2Vzc2lvblJlcGxhY2VDb3VudGVyID0gMCA7CisgICAgICAgIGNvdW50ZXJOb1N0YXRlVHJhbnNmZXJlZCA9IDAgOworICAgICAgICBtYXhBY3RpdmUgPSBnZXRBY3RpdmVTZXNzaW9ucygpIDsKKyAgICAgICAgc2Vzc2lvbkNvdW50ZXIgPSBnZXRBY3RpdmVTZXNzaW9ucygpIDsKKyAgICAgICAgY291bnRlclJlY2VpdmVfRVZUX0FMTF9TRVNTSU9OX0RBVEEgPSAwOworICAgICAgICBjb3VudGVyUmVjZWl2ZV9FVlRfR0VUX0FMTF9TRVNTSU9OUyA9IDA7CisgICAgICAgIGNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0FDQ0VTU0VEID0gMCA7CisgICAgICAgIGNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0NSRUFURUQgPSAwIDsKKyAgICAgICAgY291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fREVMVEEgPSAwIDsKKyAgICAgICAgY291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fRVhQSVJFRCA9IDAgOworICAgICAgICBjb3VudGVyUmVjZWl2ZV9FVlRfQUxMX1NFU1NJT05fVFJBTlNGRVJDT01QTEVURSA9IDA7CisgICAgICAgIGNvdW50ZXJTZW5kX0VWVF9BTExfU0VTU0lPTl9EQVRBID0gMDsKKyAgICAgICAgY291bnRlclNlbmRfRVZUX0dFVF9BTExfU0VTU0lPTlMgPSAwOworICAgICAgICBjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9BQ0NFU1NFRCA9IDAgOworICAgICAgICBjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9DUkVBVEVEID0gMCA7CisgICAgICAgIGNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0RFTFRBID0gMCA7CisgICAgICAgIGNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0VYUElSRUQgPSAwIDsKKyAgICAgICAgY291bnRlclNlbmRfRVZUX0FMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEUgPSAwOworICAgICAgICAKKyAgICB9CisgICAKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGVyc2lzdGVuY2UgaGFuZGxlcgorCisgICAgcHVibGljIHZvaWQgbG9hZCgpIHsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVubG9hZCgpIHsKKworICAgIH0KKworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBleHBpcmUKKworICAgIC8qKgorICAgICAqIHNlbmQgc2Vzc2lvbiBleHBpcmVkIHRvIG90aGVyIGNsdXN0ZXIgbm9kZXMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICAgIHNlc3Npb24gaWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXNzaW9uRXhwaXJlZChTdHJpbmcgaWQpIHsKKyAgICAgICAgY291bnRlclNlbmRfRVZUX1NFU1NJT05fRVhQSVJFRCsrIDsKKyAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbXNnID0gbmV3IFNlc3Npb25NZXNzYWdlSW1wbChnZXROYW1lKCksCisgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fRVhQSVJFRCwgbnVsbCwgaWQsIGlkCisgICAgICAgICAgICAgICAgICAgICAgICArICItRVhQSVJFRC1NU0ciKTsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLmNyZWF0ZU1lc3NhZ2UuZXhwaXJlIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpLCBpZCkpOworICAgICAgICBzZW5kKG1zZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhpcHJlIGFsbCBmaW5kIHNlc3Npb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cGlyZUFsbExvY2FsU2Vzc2lvbnMoKQorICAgIHsKKyAgICAgICAgbG9uZyB0aW1lTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIFNlc3Npb24gc2Vzc2lvbnNbXSA9IGZpbmRTZXNzaW9ucygpOworICAgICAgICBpbnQgZXhwaXJlRGlyZWN0ICA9IDAgOworICAgICAgICBpbnQgZXhwaXJlSW5kaXJlY3QgPSAwIDsKKyAgICAgICAgCisgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJTdGFydCBleHBpcmUgYWxsIHNlc3Npb25zICIgKyBnZXROYW1lKCkgKyAiIGF0ICIgKyB0aW1lTm93ICsgIiBzZXNzaW9uY291bnQgIiArIHNlc3Npb25zLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vzc2lvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uc1tpXSBpbnN0YW5jZW9mIERlbHRhU2Vzc2lvbikgeworICAgICAgICAgICAgICAgIERlbHRhU2Vzc2lvbiBzZXNzaW9uID0gKERlbHRhU2Vzc2lvbikgc2Vzc2lvbnNbaV07CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24uaXNQcmltYXJ5U2Vzc2lvbigpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5leHBpcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZURpcmVjdCsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlSW5kaXJlY3QrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb25nIHRpbWVFbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgbG9nLmRlYnVnKCJFbmQgZXhwaXJlIHNlc3Npb25zICIgKyBnZXROYW1lKCkgKyAiIGV4aXByZSBwcm9jZXNzaW5nVGltZSAiICsgKHRpbWVFbmQgLSB0aW1lTm93KSArICIgZXhwaXJlZCBkaXJlY3Qgc2Vzc2lvbnM6ICIgKyBleHBpcmVEaXJlY3QgKyAiIGV4cGlyZWQgZGlyZWN0IHNlc3Npb25zOiAiICsgZXhwaXJlSW5kaXJlY3QpOworICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFdoZW4gdGhlIG1hbmFnZXIgZXhwaXJlcyBzZXNzaW9uIG5vdCB0aWVkIHRvIGEgcmVxdWVzdC4gVGhlIGNsdXN0ZXIgd2lsbAorICAgICAqIHBlcmlvZGljYWxseSBhc2sgZm9yIGEgbGlzdCBvZiBzZXNzaW9ucyB0aGF0IHNob3VsZCBleHBpcmUgYW5kIHRoYXQKKyAgICAgKiBzaG91bGQgYmUgc2VudCBhY3Jvc3MgdGhlIHdpcmUuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgaW52YWxpZGF0ZWQgc2Vzc2lvbnMgYXJyYXkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW52YWxpZGF0ZWRTZXNzaW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgfQorCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1lc3NhZ2UgcmVjZWl2ZQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IHNlbmRlciBhbmQgbG9jYWwgZG9tYWluIGlzIHRoZSBzYW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tTZW5kZXJEb21haW4oU2Vzc2lvbk1lc3NhZ2UgbXNnLE1lbWJlciBzZW5kZXIpIHsKKyAgICAgICAgU3RyaW5nIGxvY2FsTWVtYmVyRG9tYWluID0gY2x1c3Rlci5nZXRNZW1iZXJzaGlwU2VydmljZSgpLmdldExvY2FsTWVtYmVyKCkuZ2V0RG9tYWluKCk7CisgICAgICAgIGJvb2xlYW4gc2FtZURvbWFpbj0gbG9jYWxNZW1iZXJEb21haW4uZXF1YWxzKHNlbmRlci5nZXREb21haW4oKSk7CisgICAgICAgIGlmICghc2FtZURvbWFpbiAmJiBsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIucmVjZWl2ZU1lc3NhZ2UuZnJvbVdyb25nRG9tYWluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Z2V0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5nZXRFdmVudFR5cGVTdHJpbmcoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0RG9tYWluKCksCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE1lbWJlckRvbWFpbiB9CisgICAgICAgICAgICAgICAgKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNhbWVEb21haW4gOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgcmVjZWl2ZWQgdGhyZWFkIHdoZW4gYSBTZXNzaW9uTWVzc2FnZSBoYXMKKyAgICAgKiBiZWVuIHJlY2VpdmVkIGZyb20gb25lIG9mIHRoZSBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3Rlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnIC0KKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHJlY2VpdmVkCisgICAgICogQHBhcmFtIHNlbmRlciAtCisgICAgICogICAgICAgICAgICB0aGUgc2VuZGVyIG9mIHRoZSBtZXNzYWdlLCB0aGlzIGlzIHVzZWQgaWYgd2UgcmVjZWl2ZSBhCisgICAgICogICAgICAgICAgICBFVlRfR0VUX0FMTF9TRVNTSU9OIG1lc3NhZ2UsIHNvIHRoYXQgd2Ugb25seSByZXBseSB0byB0aGUKKyAgICAgKiAgICAgICAgICAgIHJlcXVlc3Rpbmcgbm9kZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIG1lc3NhZ2VSZWNlaXZlZChTZXNzaW9uTWVzc2FnZSBtc2csIE1lbWJlciBzZW5kZXIpIHsKKyAgICAgICAgaWYoaXNTZW5kQ2x1c3RlckRvbWFpbk9ubHkoKSAmJiAhY2hlY2tTZW5kZXJEb21haW4obXNnLHNlbmRlcikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDbGFzc0xvYWRlciBjb250ZXh0TG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzTG9hZGVyW10gbG9hZGVycyA9IGdldENsYXNzTG9hZGVycyhjb250YWluZXIpOworICAgICAgICAgICAgaWYgKCBsb2FkZXJzICE9IG51bGwgJiYgbG9hZGVycy5sZW5ndGggPiAwICkgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIobG9hZGVyc1swXSk7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLmV2ZW50VHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXROYW1lKCksIG1zZy5nZXRFdmVudFR5cGVTdHJpbmcoKSwgc2VuZGVyKSk7CisKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIFNlc3Npb25NZXNzYWdlLkVWVF9HRVRfQUxMX1NFU1NJT05TOiB7CisgICAgICAgICAgICAgICAgaGFuZGxlR0VUX0FMTF9TRVNTSU9OUyhtc2csc2VuZGVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX0FMTF9TRVNTSU9OX0RBVEE6IHsKKyAgICAgICAgICAgICAgICBoYW5kbGVBTExfU0VTU0lPTl9EQVRBKG1zZyxzZW5kZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfQUxMX1NFU1NJT05fVFJBTlNGRVJDT01QTEVURTogeworICAgICAgICAgICAgICAgIGhhbmRsZUFMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEUobXNnLHNlbmRlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0NSRUFURUQ6IHsKKyAgICAgICAgICAgICAgICBoYW5kbGVTRVNTSU9OX0NSRUFURUQobXNnLHNlbmRlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0VYUElSRUQ6IHsKKyAgICAgICAgICAgICAgICBoYW5kbGVTRVNTSU9OX0VYUElSRUQobXNnLHNlbmRlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0FDQ0VTU0VEOiB7CisgICAgICAgICAgICAgICAgaGFuZGxlU0VTU0lPTl9BQ0NFU1NFRChtc2csc2VuZGVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fREVMVEE6IHsKKyAgICAgICAgICAgICAgIGhhbmRsZVNFU1NJT05fREVMVEEobXNnLHNlbmRlcik7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAvL3dlIGRpZG4ndCByZWNvZ25pemUgdGhlIG1lc3NhZ2UgdHlwZSwgZG8gbm90aGluZworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvL3N3aXRjaAorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLmVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpKSwgeCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjb250ZXh0TG9hZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1lc3NhZ2UgcmVjZWl2ZXIgaGFuZGxlcgorCisKKyAgICAvKioKKyAgICAgKiBoYW5kbGUgcmVjZWl2ZSBzZXNzaW9uIHN0YXRlIGlzIGNvbXBsZXRlIHRyYW5zZmVyZWQKKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICogQHBhcmFtIHNlbmRlcgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEUoU2Vzc2lvbk1lc3NhZ2UgbXNnLCBNZW1iZXIgc2VuZGVyKSB7CisgICAgICAgIGNvdW50ZXJSZWNlaXZlX0VWVF9BTExfU0VTU0lPTl9UUkFOU0ZFUkNPTVBMRVRFKysgOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAiZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLnRyYW5zZmVyY29tcGxldGUiLAorICAgICAgICAgICAgICAgICAgICBnZXROYW1lKCksIHNlbmRlci5nZXRIb3N0KCksIG5ldyBJbnRlZ2VyKHNlbmRlci5nZXRQb3J0KCkpKSk7CisgICAgICAgIHN0YXRlVHJhbnNmZXJDcmVhdGVTZW5kVGltZSA9IG1zZy5nZXRUaW1lc3RhbXAoKSA7CisgICAgICAgIHN0YXRlVHJhbnNmZXJlZCA9IHRydWUgOworICAgIH0KKworICAgIC8qKgorICAgICAqIGhhbmRsZSByZWNlaXZlIHNlc3Npb24gZGVsdGEKKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICogQHBhcmFtIHNlbmRlcgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTRVNTSU9OX0RFTFRBKFNlc3Npb25NZXNzYWdlIG1zZywgTWVtYmVyIHNlbmRlcikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0RFTFRBKys7CisgICAgICAgIGJ5dGVbXSBkZWx0YSA9IG1zZy5nZXRTZXNzaW9uKCk7CisgICAgICAgIERlbHRhU2Vzc2lvbiBzZXNzaW9uID0gKERlbHRhU2Vzc2lvbikgZmluZFNlc3Npb24obXNnLmdldFNlc3Npb25JRCgpKTsKKyAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImRlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS5kZWx0YSIsCisgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKSwgbXNnLmdldFNlc3Npb25JRCgpKSk7CisgICAgICAgICAgICBEZWx0YVJlcXVlc3QgZHJlcSA9IGxvYWREZWx0YVJlcXVlc3Qoc2Vzc2lvbiwgZGVsdGEpOworICAgICAgICAgICAgZHJlcS5leGVjdXRlKHNlc3Npb24sIG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24pOworICAgICAgICAgICAgc2Vzc2lvbi5zZXRQcmltYXJ5U2Vzc2lvbihmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBoYW5kbGUgcmVjZWl2ZSBzZXNzaW9uIGlzIGFjY2VzcyBhdCBvdGhlciBub2RlICggcHJpbWFyeSBzZXNzaW9uIGlzIG5vdyBmYWxzZSkKKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICogQHBhcmFtIHNlbmRlcgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTRVNTSU9OX0FDQ0VTU0VEKFNlc3Npb25NZXNzYWdlIG1zZyxNZW1iZXIgc2VuZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9BQ0NFU1NFRCsrOworICAgICAgICBEZWx0YVNlc3Npb24gc2Vzc2lvbiA9IChEZWx0YVNlc3Npb24pIGZpbmRTZXNzaW9uKG1zZworICAgICAgICAgICAgICAgIC5nZXRTZXNzaW9uSUQoKSk7CisgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgImRlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS5hY2Nlc3NlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXROYW1lKCksIG1zZy5nZXRTZXNzaW9uSUQoKSkpOworICAgICAgICAgICAgc2Vzc2lvbi5hY2Nlc3MoKTsKKyAgICAgICAgICAgIHNlc3Npb24uc2V0UHJpbWFyeVNlc3Npb24oZmFsc2UpOworICAgICAgICAgICAgc2Vzc2lvbi5lbmRBY2Nlc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGhhbmRsZSByZWNlaXZlIHNlc3Npb24gaXMgZXhwaXJlIGF0IG90aGVyIG5vZGUgKCBleHBpcmUgc2Vzc2lvbiBhbHNvIGhlcmUpCisgICAgICogQHBhcmFtIG1zZworICAgICAqIEBwYXJhbSBzZW5kZXIKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU0VTU0lPTl9FWFBJUkVEKFNlc3Npb25NZXNzYWdlIG1zZyxNZW1iZXIgc2VuZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9FWFBJUkVEKys7CisgICAgICAgIERlbHRhU2Vzc2lvbiBzZXNzaW9uID0gKERlbHRhU2Vzc2lvbikgZmluZFNlc3Npb24obXNnCisgICAgICAgICAgICAgICAgLmdldFNlc3Npb25JRCgpKTsKKyAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLmV4cGlyZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpLCBtc2cuZ2V0U2Vzc2lvbklEKCkpKTsKKyAgICAgICAgICAgIHNlc3Npb24uZXhwaXJlKG5vdGlmeVNlc3Npb25MaXN0ZW5lcnNPblJlcGxpY2F0aW9uLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBoYW5kbGUgcmVjZWl2ZSBuZXcgc2Vzc2lvbiBpcyBjcmVhdGVkIGF0IG90aGVyIG5vZGUgKGNyZWF0ZSBiYWNrdXAgLSBwcmltYXJ5IGZhbHNlKQorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiBAcGFyYW0gc2VuZGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU0VTU0lPTl9DUkVBVEVEKFNlc3Npb25NZXNzYWdlIG1zZyxNZW1iZXIgc2VuZGVyKSB7CisgICAgICAgIGNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0NSRUFURUQrKzsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgImRlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS5jcmVhdGVOZXdTZXNzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpLCBtc2cuZ2V0U2Vzc2lvbklEKCkpKTsKKyAgICAgICAgRGVsdGFTZXNzaW9uIHNlc3Npb24gPSAoRGVsdGFTZXNzaW9uKSBjcmVhdGVFbXB0eVNlc3Npb24oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRNYW5hZ2VyKHRoaXMpOworICAgICAgICBzZXNzaW9uLnNldFZhbGlkKHRydWUpOworICAgICAgICBzZXNzaW9uLnNldFByaW1hcnlTZXNzaW9uKGZhbHNlKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRDcmVhdGlvblRpbWUobXNnLmdldFRpbWVzdGFtcCgpKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRFeHBpcmVUb2xlcmFuY2UodGhpcy5leHBpcmVUb2xlcmFuY2UpOworICAgICAgICBzZXNzaW9uLmFjY2VzcygpOworICAgICAgICBpZihub3RpZnlTZXNzaW9uTGlzdGVuZXJzT25SZXBsaWNhdGlvbikKKyAgICAgICAgICAgIHNlc3Npb24uc2V0SWQobXNnLmdldFNlc3Npb25JRCgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2Vzc2lvbi5zZXRJZEludGVybmFsKG1zZy5nZXRTZXNzaW9uSUQoKSk7CisgICAgICAgIHNlc3Npb24ucmVzZXREZWx0YVJlcXVlc3QoKTsKKyAgICAgICAgc2Vzc2lvbi5lbmRBY2Nlc3MoKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIGhhbmRsZSByZWNlaXZlIHNlc3Npb25zIGZyb20gb3RoZXIgbm90ICggcmVzdGFydCApCisgICAgICogQHBhcmFtIG1zZworICAgICAqIEBwYXJhbSBzZW5kZXIKKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQUxMX1NFU1NJT05fREFUQShTZXNzaW9uTWVzc2FnZSBtc2csTWVtYmVyIHNlbmRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY291bnRlclJlY2VpdmVfRVZUX0FMTF9TRVNTSU9OX0RBVEErKzsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgImRlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS5hbGxTZXNzaW9uRGF0YUJlZ2luIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpKSk7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbXNnLmdldFNlc3Npb24oKTsKKyAgICAgICAgZGVzZXJpYWxpemVTZXNzaW9ucyhkYXRhKTsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgImRlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS5hbGxTZXNzaW9uRGF0YUFmdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpKSk7CisgICAgICAgIC8vc3RhdGVUcmFuc2ZlcnJlZCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFuZGxlIHJlY2VpdmUgdGhhdCBvdGhlciBub2RlIHdhbnQgYWxsIHNlc3Npb25zICggcmVzdGFydCApCisgICAgICogYSkgc2VuZCBhbGwgc2Vzc2lvbnMgd2l0aCBvbmUgbWVzc2FnZQorICAgICAqIGIpIHNlbmQgc2Vzc2lvbiBhdCBibG9ja3MKKyAgICAgKiBBZnRlciBzZW5kaW5nIHNlbmQgc3RhdGUgaXMgY29tcGxldGUgdHJhbnNmZXJlZAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiBAcGFyYW0gc2VuZGVyCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUdFVF9BTExfU0VTU0lPTlMoU2Vzc2lvbk1lc3NhZ2UgbXNnLCBNZW1iZXIgc2VuZGVyKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY291bnRlclJlY2VpdmVfRVZUX0dFVF9BTExfU0VTU0lPTlMrKzsKKyAgICAgICAgLy9nZXQgYSBsaXN0IG9mIGFsbCB0aGUgc2Vzc2lvbiBmcm9tIHRoaXMgbWFuYWdlcgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAiZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLnVubG9hZGluZ0JlZ2luIiwgZ2V0TmFtZSgpKSk7CisgICAgICAgIC8vIFdyaXRlIHRoZSBudW1iZXIgb2YgYWN0aXZlIHNlc3Npb25zLCBmb2xsb3dlZCBieSB0aGUgZGV0YWlscworICAgICAgICAvLyBnZXQgYWxsIHNlc3Npb25zIGFuZCBzZXJpYWxpemUgd2l0aG91dCBzeW5jCisgICAgICAgIFNlc3Npb25bXSBjdXJyZW50U2Vzc2lvbnMgPSBmaW5kU2Vzc2lvbnMoKTsKKyAgICAgICAgbG9uZyBmaW5kU2Vzc2lvblRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDsKKyAgICAgICAgaWYgKGlzU2VuZEFsbFNlc3Npb25zKCkpIHsKKyAgICAgICAgICAgIHNlbmRTZXNzaW9ucyhzZW5kZXIsIGN1cnJlbnRTZXNzaW9ucywgZmluZFNlc3Npb25UaW1lc3RhbXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc2VuZCBzZXNzaW9uIGF0IGJsb2NrcworICAgICAgICAgICAgaW50IGxlbiA9IGN1cnJlbnRTZXNzaW9ucy5sZW5ndGggPCBnZXRTZW5kQWxsU2Vzc2lvbnNTaXplKCkgPyBjdXJyZW50U2Vzc2lvbnMubGVuZ3RoCisgICAgICAgICAgICAgICAgICAgIDogZ2V0U2VuZEFsbFNlc3Npb25zU2l6ZSgpOworICAgICAgICAgICAgU2Vzc2lvbltdIHNlbmRTZXNzaW9ucyA9IG5ldyBTZXNzaW9uW2xlbl07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRTZXNzaW9ucy5sZW5ndGg7IGkgKz0gZ2V0U2VuZEFsbFNlc3Npb25zU2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgbGVuID0gaSArIGdldFNlbmRBbGxTZXNzaW9uc1NpemUoKSA+IGN1cnJlbnRTZXNzaW9ucy5sZW5ndGggPyBjdXJyZW50U2Vzc2lvbnMubGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAtIGkgCisgICAgICAgICAgICAgICAgICAgICAgICA6IGdldFNlbmRBbGxTZXNzaW9uc1NpemUoKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnRTZXNzaW9ucywgaSwgc2VuZFNlc3Npb25zLCAwLCBsZW4pOworICAgICAgICAgICAgICAgIHNlbmRTZXNzaW9ucyhzZW5kZXIsIHNlbmRTZXNzaW9ucyxmaW5kU2Vzc2lvblRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgaWYgKGdldFNlbmRBbGxTZXNzaW9uc1dhaXRUaW1lKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoZ2V0U2VuZEFsbFNlc3Npb25zV2FpdFRpbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBzbGVlcCkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTZXNzaW9uTWVzc2FnZSBuZXdtc2cgPSBuZXcgU2Vzc2lvbk1lc3NhZ2VJbXBsKG5hbWUsCisgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UuRVZUX0FMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEUsIG51bGwsCisgICAgICAgICAgICAgICAgIlNFU1NJT04tU1RBVEUtVFJBTlNGRVJFRCIsICJTRVNTSU9OLVNUQVRFLVRSQU5TRkVSRUQiCisgICAgICAgICAgICAgICAgICAgICAgICArIGdldE5hbWUoKSk7CisgICAgICAgIG5ld21zZy5zZXRUaW1lc3RhbXAoZmluZFNlc3Npb25UaW1lc3RhbXApOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAiZGVsdGFNYW5hZ2VyLmNyZWF0ZU1lc3NhZ2UuYWxsU2Vzc2lvblRyYW5zZmVyZWQiLAorICAgICAgICAgICAgICAgICAgICBnZXROYW1lKCkpKTsKKyAgICAgICAgY291bnRlclNlbmRfRVZUX0FMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEUrKzsKKyAgICAgICAgY2x1c3Rlci5zZW5kKG5ld21zZywgc2VuZGVyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHNlbmQgYSBibG9jayBvZiBzZXNzaW9uIHRvIHNlbmRlcgorICAgICAqIEBwYXJhbSBzZW5kZXIKKyAgICAgKiBAcGFyYW0gY3VycmVudFNlc3Npb25zCisgICAgICogQHBhcmFtIHNlbmRUaW1lc3RhbXAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2VuZFNlc3Npb25zKE1lbWJlciBzZW5kZXIsIFNlc3Npb25bXSBjdXJyZW50U2Vzc2lvbnMsCisgICAgICAgICAgICBsb25nIHNlbmRUaW1lc3RhbXApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gc2VyaWFsaXplU2Vzc2lvbnMoY3VycmVudFNlc3Npb25zKTsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgImRlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS51bmxvYWRpbmdBZnRlciIsCisgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKSkpOworICAgICAgICBTZXNzaW9uTWVzc2FnZSBuZXdtc2cgPSBuZXcgU2Vzc2lvbk1lc3NhZ2VJbXBsKG5hbWUsCisgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UuRVZUX0FMTF9TRVNTSU9OX0RBVEEsIGRhdGEsCisgICAgICAgICAgICAgICAgIlNFU1NJT04tU1RBVEUiLCAiU0VTU0lPTi1TVEFURS0iICsgZ2V0TmFtZSgpKTsKKyAgICAgICAgbmV3bXNnLnNldFRpbWVzdGFtcChzZW5kVGltZXN0YW1wKTsKKyAgICAgICAgLy9pZihpc1NlbmRTRVNTSU9OU1RBVEVjb21wcmVzc2VkKCkpIHsKKyAgICAgICAgLy8gICAgbmV3bXNnLnNldENvbXByZXNzKENsdXN0ZXJNZXNzYWdlLkZMQUdfQUxMT1dFRCk7CisgICAgICAgIC8vfQorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAiZGVsdGFNYW5hZ2VyLmNyZWF0ZU1lc3NhZ2UuYWxsU2Vzc2lvbkRhdGEiLAorICAgICAgICAgICAgICAgICAgICBnZXROYW1lKCkpKTsKKyAgICAgICAgY291bnRlclNlbmRfRVZUX0FMTF9TRVNTSU9OX0RBVEErKzsKKyAgICAgICAgY2x1c3Rlci5zZW5kKG5ld21zZywgc2VuZGVyKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0RlbHRhUmVxdWVzdC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vRGVsdGFSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDViOTJmZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0RlbHRhUmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsMzY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byB0cmFjayB0aGUgc2VyaWVzIG9mIGFjdGlvbnMgdGhhdCBoYXBwZW5zIHdoZW4KKyAqIGEgcmVxdWVzdCBpcyBleGVjdXRlZC4gVGhlc2UgYWN0aW9ucyB3aWxsIHRoZW4gdHJhbnNsYXRlIGludG8gaW52b2thdGlvbnMgb2YgbWV0aG9kcyAKKyAqIG9uIHRoZSBhY3R1YWwgc2Vzc2lvbi4KKyAqIFRoaXMgY2xhc3MgaXMgTk9UIHRocmVhZCBzYWZlLiBPbmUgRGVsdGFSZXF1ZXN0IHBlciBzZXNzaW9uCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpmaGFuaWtAYXBhY2hlLm9yZyI+RmlsaXAgSGFuaWs8L2E+CisgKiBAdmVyc2lvbiAxLjAKKyAqLworCitpbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uR2VuZXJpY1ByaW5jaXBhbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworCitwdWJsaWMgY2xhc3MgRGVsdGFSZXF1ZXN0IGltcGxlbWVudHMgRXh0ZXJuYWxpemFibGUgeworCisgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIERlbHRhUmVxdWVzdC5jbGFzcyApOworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0gU3RyaW5nTWFuYWdlcgorICAgICAgICAgICAgLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9BVFRSSUJVVEUgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUFJJTkNJUEFMID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lTTkVXID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX01BWElOVEVSVkFMID0gMzsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9TRVQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9SRU1PVkUgPSAxOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUklOQ0lQQUwgPSAiX19TRVRfX1BSSU5DSVBBTF9fIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX01BWElOVEVSVkFMID0gIl9fU0VUX19NQVhJTlRFUlZBTF9fIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0lTTkVXID0gIl9fU0VUX19JU05FV19fIjsKKworICAgIHByaXZhdGUgU3RyaW5nIHNlc3Npb25JZDsKKyAgICBwcml2YXRlIExpbmtlZExpc3QgYWN0aW9ucyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgcHJpdmF0ZSBMaW5rZWRMaXN0IGFjdGlvblBvb2wgPSBuZXcgTGlua2VkTGlzdCgpOworICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiByZWNvcmRBbGxBY3Rpb25zID0gZmFsc2U7CisKKyAgICBwdWJsaWMgRGVsdGFSZXF1ZXN0KCkgeworICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIERlbHRhUmVxdWVzdChTdHJpbmcgc2Vzc2lvbklkLCBib29sZWFuIHJlY29yZEFsbEFjdGlvbnMpIHsKKyAgICAgICAgdGhpcy5yZWNvcmRBbGxBY3Rpb25zPXJlY29yZEFsbEFjdGlvbnM7CisgICAgICAgIGlmKHNlc3Npb25JZCAhPSBudWxsKQorICAgICAgICAgICAgc2V0U2Vzc2lvbklkKHNlc3Npb25JZCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpbnQgYWN0aW9uID0gKHZhbHVlPT1udWxsKT9BQ1RJT05fUkVNT1ZFOkFDVElPTl9TRVQ7CisgICAgICAgIGFkZEFjdGlvbihUWVBFX0FUVFJJQlVURSxhY3Rpb24sbmFtZSx2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGludCBhY3Rpb24gPSBBQ1RJT05fUkVNT1ZFOworICAgICAgICBhZGRBY3Rpb24oVFlQRV9BVFRSSUJVVEUsYWN0aW9uLG5hbWUsbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWF4SW5hY3RpdmVJbnRlcnZhbChpbnQgaW50ZXJ2YWwpIHsKKyAgICAgICAgaW50IGFjdGlvbiA9IEFDVElPTl9TRVQ7CisgICAgICAgIGFkZEFjdGlvbihUWVBFX01BWElOVEVSVkFMLGFjdGlvbixOQU1FX01BWElOVEVSVkFMLG5ldyBJbnRlZ2VyKGludGVydmFsKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIGNvbnZlcnQgcHJpbmNpcGFsIGF0IFNlcmlhbGl6YWJsZVByaW5jaXBhbCBmb3IgYmFja3VwIG5vZGVzLgorICAgICAqIE9ubHkgc3VwcG9ydCBwcmluY2lwYWxzIGZyb20gdHlwZSB7QGxpbmsgR2VuZXJpY1ByaW5jaXBhbCBHZW5lcmljUHJpbmNpcGFsfQorICAgICAqIEBwYXJhbSBwIFNlc3Npb24gcHJpbmNpcGFsCisgICAgICogQHNlZSBHZW5lcmljUHJpbmNpcGFsCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbmNpcGFsKFByaW5jaXBhbCBwKSB7CisgICAgICAgIGludCBhY3Rpb24gPSAocD09bnVsbCk/QUNUSU9OX1JFTU9WRTpBQ1RJT05fU0VUOworICAgICAgICBTZXJpYWxpemFibGVQcmluY2lwYWwgc3AgPSBudWxsOworICAgICAgICBpZiAoIHAgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIGlmKHAgaW5zdGFuY2VvZiBHZW5lcmljUHJpbmNpcGFsKSB7CisgICAgICAgICAgICAgICAgc3AgPSBTZXJpYWxpemFibGVQcmluY2lwYWwuY3JlYXRlUHJpbmNpcGFsKChHZW5lcmljUHJpbmNpcGFsKXApOworICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJkZWx0YVJlcXVlc3Quc2hvd1ByaW5jaXBhbCIsIHAuZ2V0TmFtZSgpICwgZ2V0U2Vzc2lvbklkKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImRlbHRhUmVxdWVzdC53cm9uZ1ByaW5jaXBhbENsYXNzIixwLmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgYWRkQWN0aW9uKFRZUEVfUFJJTkNJUEFMLGFjdGlvbixOQU1FX1BSSU5DSVBBTCxzcCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmV3KGJvb2xlYW4gbikgeworICAgICAgICBpbnQgYWN0aW9uID0gQUNUSU9OX1NFVDsKKyAgICAgICAgYWRkQWN0aW9uKFRZUEVfSVNORVcsYWN0aW9uLE5BTUVfSVNORVcsbmV3IEJvb2xlYW4obikpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBhZGRBY3Rpb24oaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgQXR0cmlidXRlSW5mbyBpbmZvID0gbnVsbDsKKyAgICAgICAgaWYgKCB0aGlzLmFjdGlvblBvb2wuc2l6ZSgpID4gMCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW5mbyA9IChBdHRyaWJ1dGVJbmZvKSBhY3Rpb25Qb29sLnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICB9Y2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byByZW1vdmUgZWxlbWVudDoiLHgpOworICAgICAgICAgICAgICAgIGluZm8gPSBuZXcgQXR0cmlidXRlSW5mbyh0eXBlLCBhY3Rpb24sIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZm8uaW5pdCh0eXBlLGFjdGlvbixuYW1lLHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluZm8gPSBuZXcgQXR0cmlidXRlSW5mbyh0eXBlLCBhY3Rpb24sIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICAvL2lmIHdlIGhhdmUgYWxyZWFkeSBkb25lIHNvbWV0aGluZyB0byB0aGlzIGF0dHJpYnV0ZSwgbWFrZSBzdXJlCisgICAgICAgIC8vd2UgZG9uJ3Qgc2VuZCBtdWx0aXBsZSBhY3Rpb25zIGFjcm9zcyB0aGUgd2lyZQorICAgICAgICBpZiAoICFyZWNvcmRBbGxBY3Rpb25zKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGFjdGlvbnMucmVtb3ZlKGluZm8pOworICAgICAgICAgICAgfSBjYXRjaCAoamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZywgd2Ugd2FudGVkIHRvIHJlbW92ZSBpdCBhbnl3YXkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL2FkZCB0aGUgYWN0aW9uCisgICAgICAgIGFjdGlvbnMuYWRkTGFzdChpbmZvKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZShEZWx0YVNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICBleGVjdXRlKHNlc3Npb24sdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGV4ZWN1dGUoRGVsdGFTZXNzaW9uIHNlc3Npb24sIGJvb2xlYW4gbm90aWZ5TGlzdGVuZXJzKSB7CisgICAgICAgIGlmICggIXRoaXMuc2Vzc2lvbklkLmVxdWFscyggc2Vzc2lvbi5nZXRJZCgpICkgKQorICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNlc3Npb24gaWQgbWlzbWF0Y2gsIG5vdCBleGVjdXRpbmcgdGhlIGRlbHRhIHJlcXVlc3QiKTsKKyAgICAgICAgc2Vzc2lvbi5hY2Nlc3MoKTsKKyAgICAgICAgZm9yICggaW50IGk9MDsgaTxhY3Rpb25zLnNpemUoKTsgaSsrICkgeworICAgICAgICAgICAgQXR0cmlidXRlSW5mbyBpbmZvID0gKEF0dHJpYnV0ZUluZm8pYWN0aW9ucy5nZXQoaSk7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbmZvLmdldFR5cGUoKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRZUEVfQVRUUklCVVRFOiB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5mby5nZXRBY3Rpb24oKSA9PSBBQ1RJT05fU0VUICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoaW5mby5nZXROYW1lKCksIGluZm8uZ2V0VmFsdWUoKSxub3RpZnlMaXN0ZW5lcnMsZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9ICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShpbmZvLmdldE5hbWUoKSxub3RpZnlMaXN0ZW5lcnMsZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9Ly9jYXNlCisgICAgICAgICAgICAgICAgY2FzZSBUWVBFX0lTTkVXOiB7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0TmV3KCgoQm9vbGVhbilpbmZvLmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpLGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfS8vY2FzZQorICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9NQVhJTlRFUlZBTDogeworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnNldE1heEluYWN0aXZlSW50ZXJ2YWwoKChJbnRlZ2VyKWluZm8uZ2V0VmFsdWUoKSkuaW50VmFsdWUoKSxmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0vL2Nhc2UKKyAgICAgICAgICAgICAgICBjYXNlIFRZUEVfUFJJTkNJUEFMOiB7CisgICAgICAgICAgICAgICAgICAgIFByaW5jaXBhbCBwID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmZvLmdldEFjdGlvbigpID09IEFDVElPTl9TRVQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemFibGVQcmluY2lwYWwgc3AgPSAoU2VyaWFsaXphYmxlUHJpbmNpcGFsKWluZm8uZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAoUHJpbmNpcGFsKXNwLmdldFByaW5jaXBhbChzZXNzaW9uLmdldE1hbmFnZXIoKS5nZXRDb250YWluZXIoKS5nZXRSZWFsbSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnNldFByaW5jaXBhbChwLGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfS8vY2FzZQorICAgICAgICAgICAgICAgIGRlZmF1bHQgOiB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBhdHRyaWJ1dGUgaW5mbyB0eXBlPSIraW5mbyk7CisgICAgICAgICAgICB9Ly9zd2l0Y2gKKyAgICAgICAgfS8vZm9yCisgICAgICAgIHNlc3Npb24uZW5kQWNjZXNzKCk7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgeworICAgICAgICB3aGlsZSAoIGFjdGlvbnMuc2l6ZSgpID4gMCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQXR0cmlidXRlSW5mbyBpbmZvID0gKEF0dHJpYnV0ZUluZm8pIGFjdGlvbnMucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgICAgICAgICBpbmZvLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICBhY3Rpb25Qb29sLmFkZExhc3QoaW5mbyk7CisgICAgICAgICAgICB9Y2F0Y2ggICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gcmVtb3ZlIGVsZW1lbnQiLHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFjdGlvbnMuY2xlYXIoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSWQoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uSWQ7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25JZChTdHJpbmcgc2Vzc2lvbklkKSB7CisgICAgICAgIHRoaXMuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICBpZiAoIHNlc3Npb25JZCA9PSBudWxsICkgeworICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbigiU2Vzc2lvbiBJZCBpcyBudWxsIGZvciBzZXRTZXNzaW9uSWQiKS5maWxsSW5TdGFja1RyYWNlKCkucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGFjdGlvbnMuc2l6ZSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGFjdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgYWN0aW9uUG9vbC5jbGVhcigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVhZEV4dGVybmFsKGphdmEuaW8uT2JqZWN0SW5wdXQgaW4pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLAorICAgICAgICBqYXZhLmxhbmcuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vc2Vzc2lvbklkIC0gU3RyaW5nCisgICAgICAgIC8vcmVjb3JkQWxsIC0gYm9vbGVhbgorICAgICAgICAvL3NpemUgLSBpbnQKKyAgICAgICAgLy9BdHRyaWJ1dGVJbmZvIC0gaW4gYW4gYXJyYXkKKyAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgc2Vzc2lvbklkID0gaW4ucmVhZFVURigpOworICAgICAgICByZWNvcmRBbGxBY3Rpb25zID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgaW50IGNudCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgaWYgKGFjdGlvbnMgPT0gbnVsbCkKKyAgICAgICAgICAgIGFjdGlvbnMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhY3Rpb25zLmNsZWFyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKyspIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZUluZm8gaW5mbyA9IG51bGw7CisgICAgICAgICAgICBpZiAodGhpcy5hY3Rpb25Qb29sLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpbmZvID0gKEF0dHJpYnV0ZUluZm8pIGFjdGlvblBvb2wucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSAgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byByZW1vdmUgZWxlbWVudCIseCk7CisgICAgICAgICAgICAgICAgICAgIGluZm8gPSBuZXcgQXR0cmlidXRlSW5mbygtMSwtMSxudWxsLG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGluZm8gPSBuZXcgQXR0cmlidXRlSW5mbygtMSwtMSxudWxsLG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbmZvLnJlYWRFeHRlcm5hbChpbik7CisgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkRlY29kZSBmYWlsdXJlIGluIGRlbHRhIHJlcXVlc3QgcmVjZWl2ZXI6IHNpZD0iICsgc2Vzc2lvbklkICsgIiwgY291bnQ9IiArIGNudCArICIsIGZhaWx1cmUgcG9zaXRpb249IiArIGkpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhY3Rpb25zLmFkZExhc3QoaW5mbyk7CisgICAgICAgIH0vL2ZvcgorICAgIH0KKyAgICAgICAgCisKKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZUV4dGVybmFsKGphdmEuaW8uT2JqZWN0T3V0cHV0IG91dCApIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgLy9zZXNzaW9uSWQgLSBTdHJpbmcKKyAgICAgICAgLy9yZWNvcmRBbGwgLSBib29sZWFuCisgICAgICAgIC8vc2l6ZSAtIGludAorICAgICAgICAvL0F0dHJpYnV0ZUluZm8gLSBpbiBhbiBhcnJheQorICAgICAgICBvdXQud3JpdGVVVEYoZ2V0U2Vzc2lvbklkKCkpOworICAgICAgICBvdXQud3JpdGVCb29sZWFuKHJlY29yZEFsbEFjdGlvbnMpOworICAgICAgICBvdXQud3JpdGVJbnQoZ2V0U2l6ZSgpKTsKKyAgICAgICAgZm9yICggaW50IGk9MDsgaTxnZXRTaXplKCk7IGkrKyApIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZUluZm8gaW5mbyA9IChBdHRyaWJ1dGVJbmZvKWFjdGlvbnMuZ2V0KGkpOworICAgICAgICAgICAgaW5mby53cml0ZUV4dGVybmFsKG91dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXR0cmlidXRlSW5mbyBpbXBsZW1lbnRzIGphdmEuaW8uRXh0ZXJuYWxpemFibGUgeworICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgdmFsdWUgPSBudWxsOworICAgICAgICBwcml2YXRlIGludCBhY3Rpb247CisgICAgICAgIHByaXZhdGUgaW50IHR5cGU7CisKKyAgICAgICAgcHVibGljIEF0dHJpYnV0ZUluZm8oKSB7fQorCisgICAgICAgIHB1YmxpYyBBdHRyaWJ1dGVJbmZvKGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgaW5pdCh0eXBlLGFjdGlvbixuYW1lLHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGluaXQoaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QWN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGFjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAgICAgICAgIG5hbWUgPSBudWxsOworICAgICAgICAgICAgdmFsdWUgPSBudWxsOworICAgICAgICAgICAgdHlwZT0tMTsKKyAgICAgICAgICAgIGFjdGlvbj0tMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKCAhIChvIGluc3RhbmNlb2YgQXR0cmlidXRlSW5mbyApICkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgQXR0cmlidXRlSW5mbyBvdGhlciA9ICAoQXR0cmlidXRlSW5mbylvOworICAgICAgICAgICAgcmV0dXJuIG90aGVyLmdldE5hbWUoKS5lcXVhbHModGhpcy5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVhZEV4dGVybmFsKGphdmEuaW8uT2JqZWN0SW5wdXQgaW4gKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIGphdmEubGFuZy5DbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vdHlwZSAtIGludAorICAgICAgICAgICAgLy9hY3Rpb24gLSBpbnQKKyAgICAgICAgICAgIC8vbmFtZSAtIFN0cmluZworICAgICAgICAgICAgLy92YWx1ZSAtIG9iamVjdAorICAgICAgICAgICAgdHlwZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGFjdGlvbiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG5hbWUgPSBpbi5yZWFkVVRGKCk7CisgICAgICAgICAgICB2YWx1ZSA9IGluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZUV4dGVybmFsKGphdmEuaW8uT2JqZWN0T3V0cHV0IG91dCkgCisgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vdHlwZSAtIGludAorICAgICAgICAgICAgLy9hY3Rpb24gLSBpbnQKKyAgICAgICAgICAgIC8vbmFtZSAtIFN0cmluZworICAgICAgICAgICAgLy92YWx1ZSAtIG9iamVjdAorICAgICAgICAgICAgb3V0LndyaXRlSW50KGdldFR5cGUoKSk7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQoZ2V0QWN0aW9uKCkpOworICAgICAgICAgICAgb3V0LndyaXRlVVRGKGdldE5hbWUoKSk7CisgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QoZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiQXR0cmlidXRlSW5mb1t0eXBlPSIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChnZXRUeXBlKCkpLmFwcGVuZCgiLCBhY3Rpb249IikuYXBwZW5kKGdldEFjdGlvbigpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgbmFtZT0iKS5hcHBlbmQoZ2V0TmFtZSgpKS5hcHBlbmQoIiwgdmFsdWU9IikuYXBwZW5kKGdldFZhbHVlKCkpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCBhZGRyPSIpLmFwcGVuZChzdXBlci50b1N0cmluZygpKS5hcHBlbmQoIl0iKTsKKyAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9EZWx0YVNlc3Npb24uamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0RlbHRhU2Vzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMTJmNzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9EZWx0YVNlc3Npb24uamF2YQpAQCAtMCwwICsxLDE3MjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uOworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZVN1cHBvcnQ7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkNvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uRXZlbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uTGlzdGVuZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uR2VuZXJpY1ByaW5jaXBhbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuRW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworLyoqCisgKiAKKyAqIFNpbWlsYXIgdG8gdGhlIFN0YW5kYXJkU2Vzc2lvbiwgdGhpcyBjb2RlIGlzIGlkZW50aWNhbCwgYnV0IGZvciB1cGRhdGUgYW5kCisgKiBzb21lIHNtYWxsIGlzc3Vlcywgc2ltcGx5IGNvcGllZCBpbiB0aGUgZmlyc3QgcmVsZWFzZS4gVGhpcyBzZXNzaW9uIHdpbGwga2VlcAorICogdHJhY2sgb2YgZGVsdGFzIGR1cmluZyBhIHJlcXVlc3QuCisgKiA8cD4KKyAqIDxiPklNUExFTUVOVEFUSU9OIE5PVEUgPC9iPjogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyByZXByZXNlbnRzIGJvdGggdGhlCisgKiBpbnRlcm5hbCAoU2Vzc2lvbikgYW5kIGFwcGxpY2F0aW9uIGxldmVsIChIdHRwU2Vzc2lvbikgdmlldyBvZiB0aGUgc2Vzc2lvbi4KKyAqIEhvd2V2ZXIsIGJlY2F1c2UgdGhlIGNsYXNzIGl0c2VsZiBpcyBub3QgZGVjbGFyZWQgcHVibGljLCBKYXZhIGxvZ2ljIG91dHNpZGUKKyAqIG9mIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb248L2NvZGU+IHBhY2thZ2UgY2Fubm90IGNhc3QgYW4KKyAqIEh0dHBTZXNzaW9uIHZpZXcgb2YgdGhpcyBpbnN0YW5jZSBiYWNrIHRvIGEgU2Vzc2lvbiB2aWV3LgorICogPHA+CisgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFIDwvYj46IElmIHlvdSBhZGQgZmllbGRzIHRvIHRoaXMgY2xhc3MsIHlvdSBtdXN0IG1ha2UKKyAqIHN1cmUgdGhhdCB5b3UgY2FycnkgdGhlbSBvdmVyIGluIHRoZSByZWFkL3dyaXRlT2JqZWN0IG1ldGhvZHMgc28gdGhhdCB0aGlzCisgKiBjbGFzcyBpcyBwcm9wZXJseSBzZXJpYWxpemVkLgorICogCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgU2VhbiBMZWdhc3NpY2sKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpvbkBsYXRjaGtleS5jb20iPkpvbiBTLiBTdGV2ZW5zIDwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlbHRhU2Vzc2lvbiBpbXBsZW1lbnRzIEh0dHBTZXNzaW9uLCBTZXNzaW9uLCBTZXJpYWxpemFibGUsCisgICAgICAgIENsdXN0ZXJTZXNzaW9uIHsKKworICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkKKyAgICAgICAgICAgIC5nZXRMb2coRGVsdGFNYW5hZ2VyLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbXAgPSBTdHJpbmdNYW5hZ2VyCisgICAgICAgICAgICAuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVHlwZSBhcnJheS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9BUlJBWVtdID0gbmV3IFN0cmluZ1swXTsKKworICAgIC8qKgorICAgICAqIFRoZSBkdW1teSBhdHRyaWJ1dGUgdmFsdWUgc2VyaWFsaXplZCB3aGVuIGEgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uIGlzCisgICAgICogZW5jb3VudGVyZWQgaW4gPGNvZGU+d3JpdGVPYmplY3QoKTwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9TRVJJQUxJWkVEID0gIl9fX05PVF9TRVJJQUxJWkFCTEVfRVhDRVBUSU9OX19fIjsKKworICAgIC8qKgorICAgICAqIFRoZSBjb2xsZWN0aW9uIG9mIHVzZXIgZGF0YSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNlc3Npb24uCisgICAgICovCisgICAgcHJpdmF0ZSBNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBhdXRoZW50aWNhdGlvbiB0eXBlIHVzZWQgdG8gYXV0aGVudGljYXRlIG91ciBjYWNoZWQgUHJpbmNpcGFsLCBpZgorICAgICAqIGFueS4gTk9URTogVGhpcyB2YWx1ZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGlzCisgICAgICogb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IFN0cmluZyBhdXRoVHlwZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+amF2YS5sYW5nLk1ldGhvZDwvY29kZT4gZm9yIHRoZQorICAgICAqIDxjb2RlPmZpcmVDb250YWluZXJFdmVudCgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlCisgICAgICogPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDwvY29kZT4gbWV0aG9kLCBpZiBvdXIKKyAgICAgKiBDb250ZXh0IGltcGxlbWVudGF0aW9uIGlzIG9mIHRoaXMgY2xhc3MuIFRoaXMgdmFsdWUgaXMgY29tcHV0ZWQKKyAgICAgKiBkeW5hbWljYWxseSB0aGUgZmlyc3QgdGltZSBpdCBpcyBuZWVkZWQsIG9yIGFmdGVyIGEgc2Vzc2lvbiByZWxvYWQgKHNpbmNlCisgICAgICogaXQgaXMgZGVjbGFyZWQgdHJhbnNpZW50KS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBNZXRob2QgY29udGFpbmVyRXZlbnRNZXRob2QgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIG1ldGhvZCBzaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5maXJlQ29udGFpbmVyRXZlbnQ8L2NvZGU+IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBjb250YWluZXJFdmVudFR5cGVzW10gPSB7IFN0cmluZy5jbGFzcywKKyAgICAgICAgICAgIE9iamVjdC5jbGFzcyB9OworCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgdGhpcyBzZXNzaW9uIHdhcyBjcmVhdGVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQsCisgICAgICogSmFudWFyeSAxLCAxOTcwIEdNVC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgY3JlYXRpb25UaW1lID0gMEw7CisKKyAgICAvKioKKyAgICAgKiBXZSBhcmUgY3VycmVudGx5IHByb2Nlc3NpbmcgYSBzZXNzaW9uIGV4cGlyYXRpb24sIHNvIGJ5cGFzcyBjZXJ0YWluCisgICAgICogSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRlc3RzLiBOT1RFOiBUaGlzIHZhbHVlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUKKyAgICAgKiBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBleHBpcmluZyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVGhlIGZhY2FkZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXNzaW9uLiBOT1RFOiBUaGlzIHZhbHVlIGlzIG5vdCBpbmNsdWRlZAorICAgICAqIGluIHRoZSBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgRGVsdGFTZXNzaW9uRmFjYWRlIGZhY2FkZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2Vzc2lvbiBpZGVudGlmaWVyIG9mIHRoaXMgU2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoaXMgU2Vzc2lvbiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJEZWx0YVNlc3Npb24vMS4xIjsKKworICAgIC8qKgorICAgICAqIFRoZSBsYXN0IGFjY2Vzc2VkIHRpbWUgZm9yIHRoaXMgU2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgbGFzdEFjY2Vzc2VkVGltZSA9IGNyZWF0aW9uVGltZTsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXNzaW9uIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhpcyBTZXNzaW9uLgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IEFycmF5TGlzdCBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgTWFuYWdlciB3aXRoIHdoaWNoIHRoaXMgU2Vzc2lvbiBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IE1hbmFnZXIgbWFuYWdlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSB0aW1lIGludGVydmFsLCBpbiBzZWNvbmRzLCBiZXR3ZWVuIGNsaWVudCByZXF1ZXN0cyBiZWZvcmUgdGhlCisgICAgICogc2VydmxldCBjb250YWluZXIgbWF5IGludmFsaWRhdGUgdGhpcyBzZXNzaW9uLiBBIG5lZ2F0aXZlIHRpbWUgaW5kaWNhdGVzCisgICAgICogdGhhdCB0aGUgc2Vzc2lvbiBzaG91bGQgbmV2ZXIgdGltZSBvdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbWF4SW5hY3RpdmVJbnRlcnZhbCA9IC0xOworCisgICAgLyoqCisgICAgICogVGhlIG1heEluYWN0aXZlSW50ZXJ2YWwgKyB0b2xlcmFuY2UgdGltZSBpbnRlcnZhbCwgaW4gc2Vjb25kcywgYmV0d2VlbiBjbGllbnQgcmVxdWVzdHMgYmVmb3JlCisgICAgICogdGhlIHNlcnZsZXQgY29udGFpbmVyIG1heSBpbnZhbGlkYXRlIGEgYmFja3VwIHNlc3Npb24gZnJvbSBvdGhlciBjbHVzdGVyIG5vZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZXhwaXJlVG9sZXJhbmNlID0gMzAwOworCisgICAgLyoqCisgICAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBzZXNzaW9uIGlzIG5ldyBvciBub3QuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTmV3ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHNlc3Npb24gaXMgdmFsaWQgb3Igbm90LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEludGVybmFsIG5vdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlc3Npb24gYnkgQ2F0YWxpbmEgY29tcG9uZW50cyBhbmQKKyAgICAgKiBldmVudCBsaXN0ZW5lcnMuIDxiPklNUExFTUVOVEFUSU9OIE5PVEU6IDwvYj4gVGhpcyBvYmplY3QgaXMgPGVtPm5vdDwvZW0+CisgICAgICogc2F2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyBzZXNzaW9uIHNlcmlhbGl6YXRpb25zIQorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IE1hcCBub3RlcyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXNzaW9uLCBpZiBhbnkuCisgICAgICogPGI+SU1QTEVNRU5UQVRJT04gTk9URTogPC9iPiBUaGlzIG9iamVjdCBpcyA8aT5ub3QgPC9pPiBzYXZlZCBhbmQKKyAgICAgKiByZXN0b3JlZCBhY3Jvc3Mgc2Vzc2lvbiBzZXJpYWxpemF0aW9ucyEKKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBQcmluY2lwYWwgcHJpbmNpcGFsID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPSBTdHJpbmdNYW5hZ2VyCisgICAgICAgICAgICAuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgSFRUUCBzZXNzaW9uIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBIdHRwU2Vzc2lvbkNvbnRleHQgc2Vzc2lvbkNvbnRleHQgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4gTk9URTogVGhpcyB2YWx1ZSBpcyBub3QKKyAgICAgKiBpbmNsdWRlZCBpbiB0aGUgc2VyaWFsaXplZCB2ZXJzaW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBzdXBwb3J0ID0gbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCgKKyAgICAgICAgICAgIHRoaXMpOworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgYWNjZXNzZWQgdGltZSBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyB0aGlzQWNjZXNzZWRUaW1lID0gY3JlYXRpb25UaW1lOworCisgICAgLyoqCisgICAgICogb25seSB0aGUgcHJpbWFyeSBzZXNzaW9uIHdpbGwgZXhwaXJlLCBvciBiZSBhYmxlIHRvIGV4cGlyZSBkdWUgdG8KKyAgICAgKiBpbmFjdGl2aXR5LiBUaGlzIGlzIHNldCB0byBmYWxzZSBhcyBzb29uIGFzIEkgcmVjZWl2ZSB0aGlzIHNlc3Npb24gb3ZlcgorICAgICAqIHRoZSB3aXJlIGluIGEgc2Vzc2lvbiBtZXNzYWdlLiBUaGF0IG1lYW5zIHRoYXQgc29tZW9uZSBlbHNlIGhhcyBtYWRlIGEKKyAgICAgKiByZXF1ZXN0IG9uIGFub3RoZXIgc2VydmVyLgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gaXNQcmltYXJ5U2Vzc2lvbiA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVsdGEgcmVxdWVzdCBjb250YWlucyBhbGwgdGhlIGFjdGlvbiBpbmZvCisgICAgICogIAorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IERlbHRhUmVxdWVzdCBkZWx0YVJlcXVlc3QgPSBudWxsOworCisgICAgLyoqCisgICAgICogTGFzdCB0aW1lIHRoZSBzZXNzaW9uIHdhcyByZXBsaWNhdGQsIHVzZWQgZm9yIGRpc3RyaWJ1dGVkIGV4cGlyaW5nIG9mCisgICAgICogc2Vzc2lvbgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IGxvbmcgbGFzdFRpbWVSZXBsaWNhdGVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWNjZXNzIGNvdW50IGZvciB0aGlzIHNlc3Npb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IGludCBhY2Nlc3NDb3VudCA9IDA7CisKKyAgICBwcml2YXRlIE9iamVjdCBsb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgTWFuYWdlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWFuYWdlcgorICAgICAqICAgICAgICAgICAgVGhlIG1hbmFnZXIgd2l0aCB3aGljaCB0aGlzIFNlc3Npb24gaXMgYXNzb2NpYXRlZAorICAgICAqLworICAgIHB1YmxpYyBEZWx0YVNlc3Npb24oTWFuYWdlciBtYW5hZ2VyKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKKyAgICAgICAgdGhpcy5yZXNldERlbHRhUmVxdWVzdCgpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlc3Npb24gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogcmV0dXJucyB0cnVlIGlmIHRoaXMgc2Vzc2lvbiBpcyB0aGUgcHJpbWFyeSBzZXNzaW9uLCBpZiB0aGF0IGlzIHRoZSBjYXNlLAorICAgICAqIHRoZSBtYW5hZ2VyIGNhbiBleHBpcmUgaXQgdXBvbiB0aW1lb3V0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeVNlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBpc1ByaW1hcnlTZXNzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGlzIGlzIHRoZSBwcmltYXJ5IHNlc3Npb24gb3Igbm90LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcmltYXJ5U2Vzc2lvbgorICAgICAqICAgICAgICAgICAgRmxhZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlTZXNzaW9uKGJvb2xlYW4gcHJpbWFyeVNlc3Npb24pIHsKKyAgICAgICAgdGhpcy5pc1ByaW1hcnlTZXNzaW9uID0gcHJpbWFyeVNlc3Npb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhdXRoZW50aWNhdGlvbiB0eXBlIHVzZWQgdG8gYXV0aGVudGljYXRlIG91ciBjYWNoZWQgUHJpbmNpcGFsLAorICAgICAqIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhUeXBlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5hdXRoVHlwZSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgdXNlZCB0byBhdXRoZW50aWNhdGUgb3VyIGNhY2hlZCBQcmluY2lwYWwsIGlmCisgICAgICogYW55LgorICAgICAqIAorICAgICAqIEBwYXJhbSBhdXRoVHlwZQorICAgICAqICAgICAgICAgICAgVGhlIG5ldyBjYWNoZWQgYXV0aGVudGljYXRpb24gdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dGhUeXBlKFN0cmluZyBhdXRoVHlwZSkgeworCisgICAgICAgIFN0cmluZyBvbGRBdXRoVHlwZSA9IHRoaXMuYXV0aFR5cGU7CisgICAgICAgIHRoaXMuYXV0aFR5cGUgPSBhdXRoVHlwZTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImF1dGhUeXBlIiwgb2xkQXV0aFR5cGUsIHRoaXMuYXV0aFR5cGUpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjcmVhdGlvbiB0aW1lIGZvciB0aGlzIHNlc3Npb24uIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUKKyAgICAgKiBNYW5hZ2VyIHdoZW4gYW4gZXhpc3RpbmcgU2Vzc2lvbiBpbnN0YW5jZSBpcyByZXVzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHRpbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBuZXcgY3JlYXRpb24gdGltZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENyZWF0aW9uVGltZShsb25nIHRpbWUpIHsKKworICAgICAgICB0aGlzLmNyZWF0aW9uVGltZSA9IHRpbWU7CisgICAgICAgIHRoaXMubGFzdEFjY2Vzc2VkVGltZSA9IHRpbWU7CisgICAgICAgIHRoaXMudGhpc0FjY2Vzc2VkVGltZSA9IHRpbWU7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gaWRlbnRpZmllciBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5pZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyIGZvciB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJZEludGVybmFsKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5pZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyIGZvciB0aGlzIHNlc3Npb24gd2l0aG91dCBub3RpZnkgbGlzdGVuZXJzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpZAorICAgICAqICAgICAgICAgICAgVGhlIG5ldyBzZXNzaW9uIGlkZW50aWZpZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZEludGVybmFsKFN0cmluZyBpZCkgeworICAgICAgICBpZiAoKHRoaXMuaWQgIT0gbnVsbCkgJiYgKG1hbmFnZXIgIT0gbnVsbCkpCisgICAgICAgICAgICBtYW5hZ2VyLnJlbW92ZSh0aGlzKTsKKworICAgICAgICB0aGlzLmlkID0gaWQ7CisKKyAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIG1hbmFnZXIuYWRkKHRoaXMpOworICAgICAgICBpZiAoIGRlbHRhUmVxdWVzdCA9PSBudWxsICkgcmVzZXREZWx0YVJlcXVlc3QoKTsKKyAgICAgICAgZWxzZSBkZWx0YVJlcXVlc3Quc2V0U2Vzc2lvbklkKGlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlc3Npb24gaWRlbnRpZmllciBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpZAorICAgICAqICAgICAgICAgICAgVGhlIG5ldyBzZXNzaW9uIGlkZW50aWZpZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKyAgICAgICAgc2V0SWRJbnRlcm5hbChpZCk7CisgICAgICAgIHRlbGxOZXcoKTsKKyAgICAgfQorCisgICAgLyoqCisgICAgICogSW5mb3JtIHRoZSBsaXN0ZW5lcnMgYWJvdXQgdGhlIG5ldyBzZXNzaW9uLgorICAgICAqICAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZWxsTmV3KCkgeworCisgICAgICAgIC8vIE5vdGlmeSBpbnRlcmVzdGVkIHNlc3Npb24gZXZlbnQgbGlzdGVuZXJzCisgICAgICAgIGZpcmVTZXNzaW9uRXZlbnQoU2Vzc2lvbi5TRVNTSU9OX0NSRUFURURfRVZFTlQsIG51bGwpOworCisgICAgICAgIC8vIE5vdGlmeSBpbnRlcmVzdGVkIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVycworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgbWFuYWdlci5nZXRDb250YWluZXIoKTsKKyAgICAgICAgLy9maXggZm9yIHN0YW5kYWxvbmUgbWFuYWdlciB3aXRob3V0IGNvbnRhaW5lcgorICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBPYmplY3QgbGlzdGVuZXJzW10gPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisgICAgICAgICAgICBpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBIdHRwU2Vzc2lvbkV2ZW50IGV2ZW50ID0gbmV3IEh0dHBTZXNzaW9uRXZlbnQoZ2V0U2Vzc2lvbigpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIShsaXN0ZW5lcnNbaV0gaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkxpc3RlbmVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBIdHRwU2Vzc2lvbkxpc3RlbmVyIGxpc3RlbmVyID0gKEh0dHBTZXNzaW9uTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LCAiYmVmb3JlU2Vzc2lvbkNyZWF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZXNzaW9uQ3JlYXRlZChldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwgImFmdGVyU2Vzc2lvbkNyZWF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LCAiYWZ0ZXJTZXNzaW9uQ3JlYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5zZXNzaW9uRXZlbnQiKSwgdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBTZXNzaW9uIGltcGxlbWVudGF0aW9uIGFuZCB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsYXN0IHRpbWUgdGhlIGNsaWVudCBzZW50IGEgcmVxdWVzdCBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIHNlc3Npb24sIGFzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0LCBKYW51YXJ5IDEsIDE5NzAKKyAgICAgKiBHTVQuIEFjdGlvbnMgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIHRha2VzLCBzdWNoIGFzIGdldHRpbmcgb3Igc2V0dGluZyBhCisgICAgICogdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXNzaW9uLCBkbyBub3QgYWZmZWN0IHRoZSBhY2Nlc3MgdGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRMYXN0QWNjZXNzZWRUaW1lKCkgeworCisgICAgICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHNtCisgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5nZXRMYXN0QWNjZXNzZWRUaW1lLmlzZSIpKTsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIHJldHVybiAodGhpcy5sYXN0QWNjZXNzZWRUaW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxhc3QgY2xpZW50IGFjY2VzcyB0aW1lIHdpdGhvdXQgaW52YWxpZGF0aW9uIGNoZWNrCisgICAgICogQHNlZSAjZ2V0TGFzdEFjY2Vzc2VkVGltZSgpLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldExhc3RBY2Nlc3NlZFRpbWVJbnRlcm5hbCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxhc3RBY2Nlc3NlZFRpbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTWFuYWdlciB3aXRoaW4gd2hpY2ggdGhpcyBTZXNzaW9uIGlzIHZhbGlkLgorICAgICAqLworICAgIHB1YmxpYyBNYW5hZ2VyIGdldE1hbmFnZXIoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLm1hbmFnZXIpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBNYW5hZ2VyIHdpdGhpbiB3aGljaCB0aGlzIFNlc3Npb24gaXMgdmFsaWQuCisgICAgICogCisgICAgICogQHBhcmFtIG1hbmFnZXIKKyAgICAgKiAgICAgICAgICAgIFRoZSBuZXcgTWFuYWdlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1hbmFnZXIoTWFuYWdlciBtYW5hZ2VyKSB7CisKKyAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWF4aW11bSB0aW1lIGludGVydmFsLCBpbiBzZWNvbmRzLCBiZXR3ZWVuIGNsaWVudCByZXF1ZXN0cworICAgICAqIGJlZm9yZSB0aGUgc2VydmxldCBjb250YWluZXIgd2lsbCBpbnZhbGlkYXRlIHRoZSBzZXNzaW9uLiBBIG5lZ2F0aXZlIHRpbWUKKyAgICAgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgc2Vzc2lvbiBzaG91bGQgbmV2ZXIgdGltZSBvdXQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhJbmFjdGl2ZUludGVydmFsKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5tYXhJbmFjdGl2ZUludGVydmFsKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWF4aW11bSB0aW1lIGludGVydmFsLCBpbiBzZWNvbmRzLCBiZXR3ZWVuIGNsaWVudCByZXF1ZXN0cyBiZWZvcmUKKyAgICAgKiB0aGUgc2VydmxldCBjb250YWluZXIgd2lsbCBpbnZhbGlkYXRlIHRoZSBzZXNzaW9uLiBBIG5lZ2F0aXZlIHRpbWUKKyAgICAgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgc2Vzc2lvbiBzaG91bGQgbmV2ZXIgdGltZSBvdXQuCisgICAgICogCisgICAgICogQHBhcmFtIGludGVydmFsCisgICAgICogICAgICAgICAgICBUaGUgbmV3IG1heGltdW0gaW50ZXJ2YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhJbmFjdGl2ZUludGVydmFsKGludCBpbnRlcnZhbCkgeworICAgICAgICBzZXRNYXhJbmFjdGl2ZUludGVydmFsKGludGVydmFsLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhJbmFjdGl2ZUludGVydmFsKGludCBpbnRlcnZhbCwgYm9vbGVhbiBhZGREZWx0YVJlcXVlc3QpIHsKKworICAgICAgICB0aGlzLm1heEluYWN0aXZlSW50ZXJ2YWwgPSBpbnRlcnZhbDsKKyAgICAgICAgaWYgKGlzVmFsaWQgJiYgaW50ZXJ2YWwgPT0gMCkgeworICAgICAgICAgICAgZXhwaXJlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYWRkRGVsdGFSZXF1ZXN0ICYmIChkZWx0YVJlcXVlc3QgIT0gbnVsbCkpCisgICAgICAgICAgICAgICAgZGVsdGFSZXF1ZXN0LnNldE1heEluYWN0aXZlSW50ZXJ2YWwoaW50ZXJ2YWwpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPmlzTmV3PC9jb2RlPiBmbGFnIGZvciB0aGlzIHNlc3Npb24uCisgICAgICogCisgICAgICogQHBhcmFtIGlzTmV3CisgICAgICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIGZvciB0aGUgPGNvZGU+aXNOZXc8L2NvZGU+IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROZXcoYm9vbGVhbiBpc05ldykgeworICAgICAgICBzZXROZXcoaXNOZXcsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5ldyhib29sZWFuIGlzTmV3LCBib29sZWFuIGFkZERlbHRhUmVxdWVzdCkgeworICAgICAgICB0aGlzLmlzTmV3ID0gaXNOZXc7CisgICAgICAgIGlmIChhZGREZWx0YVJlcXVlc3QgJiYgKGRlbHRhUmVxdWVzdCAhPSBudWxsKSkKKyAgICAgICAgICAgIGRlbHRhUmVxdWVzdC5zZXROZXcoaXNOZXcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXV0aGVudGljYXRlZCBQcmluY2lwYWwgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXNzaW9uLgorICAgICAqIFRoaXMgcHJvdmlkZXMgYW4gPGNvZGU+QXV0aGVudGljYXRvcjwvY29kZT4gd2l0aCBhIG1lYW5zIHRvIGNhY2hlIGEKKyAgICAgKiBwcmV2aW91c2x5IGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFsLCBhbmQgYXZvaWQgcG90ZW50aWFsbHkgZXhwZW5zaXZlCisgICAgICogPGNvZGU+UmVhbG0uYXV0aGVudGljYXRlKCk8L2NvZGU+IGNhbGxzIG9uIGV2ZXJ5IHJlcXVlc3QuIElmIHRoZXJlIGlzCisgICAgICogbm8gY3VycmVudCBhc3NvY2lhdGVkIFByaW5jaXBhbCwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0UHJpbmNpcGFsKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5wcmluY2lwYWwpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNlc3Npb24uCisgICAgICogVGhpcyBwcm92aWRlcyBhbiA8Y29kZT5BdXRoZW50aWNhdG9yPC9jb2RlPiB3aXRoIGEgbWVhbnMgdG8gY2FjaGUgYQorICAgICAqIHByZXZpb3VzbHkgYXV0aGVudGljYXRlZCBQcmluY2lwYWwsIGFuZCBhdm9pZCBwb3RlbnRpYWxseSBleHBlbnNpdmUKKyAgICAgKiA8Y29kZT5SZWFsbS5hdXRoZW50aWNhdGUoKTwvY29kZT4gY2FsbHMgb24gZXZlcnkgcmVxdWVzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJpbmNpcGFsCisgICAgICogICAgICAgICAgICBUaGUgbmV3IFByaW5jaXBhbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW5jaXBhbChQcmluY2lwYWwgcHJpbmNpcGFsKSB7CisgICAgICAgIHNldFByaW5jaXBhbChwcmluY2lwYWwsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByaW5jaXBhbChQcmluY2lwYWwgcHJpbmNpcGFsLCBib29sZWFuIGFkZERlbHRhUmVxdWVzdCkgeworICAgICAgICBQcmluY2lwYWwgb2xkUHJpbmNpcGFsID0gdGhpcy5wcmluY2lwYWw7CisgICAgICAgIHRoaXMucHJpbmNpcGFsID0gcHJpbmNpcGFsOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicHJpbmNpcGFsIiwgb2xkUHJpbmNpcGFsLCB0aGlzLnByaW5jaXBhbCk7CisgICAgICAgIGlmIChhZGREZWx0YVJlcXVlc3QgJiYgKGRlbHRhUmVxdWVzdCAhPSBudWxsKSkKKyAgICAgICAgICAgIGRlbHRhUmVxdWVzdC5zZXRQcmluY2lwYWwocHJpbmNpcGFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPkh0dHBTZXNzaW9uPC9jb2RlPiBmb3Igd2hpY2ggdGhpcyBvYmplY3QgaXMgdGhlCisgICAgICogZmFjYWRlLgorICAgICAqLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKCkgeworCisgICAgICAgIGlmIChmYWNhZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRGVsdGFTZXNzaW9uIGZzZXNzaW9uID0gdGhpczsKKyAgICAgICAgICAgICAgICBmYWNhZGUgPSAoRGVsdGFTZXNzaW9uRmFjYWRlKSBBY2Nlc3NDb250cm9sbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlbHRhU2Vzc2lvbkZhY2FkZShmc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZhY2FkZSA9IG5ldyBEZWx0YVNlc3Npb25GYWNhZGUodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChmYWNhZGUpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5pc1ZhbGlkPC9jb2RlPiBmbGFnIGZvciB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKKworICAgICAgICBpZiAodGhpcy5leHBpcmluZykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFjY2Vzc0NvdW50ID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWF4SW5hY3RpdmVJbnRlcnZhbCA+PSAwKSB7CisgICAgICAgICAgICBsb25nIHRpbWVOb3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGludCB0aW1lSWRsZSA9IChpbnQpICgodGltZU5vdyAtIHRoaXNBY2Nlc3NlZFRpbWUpIC8gMTAwMEwpOworICAgICAgICAgICAgaWYgKGlzUHJpbWFyeVNlc3Npb24oKSkgeworICAgICAgICAgICAgICAgIGlmKHRpbWVJZGxlID49IG1heEluYWN0aXZlSW50ZXJ2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhwaXJlKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVJZGxlID49IChtYXhJbmFjdGl2ZUludGVydmFsK2V4cGlyZVRvbGVyYW5jZSkpIHsKKyAgICAgICAgICAgICAgICAvL2lmIHRoZSBzZXNzaW9uIGhhcyBiZWVuIGlkbGUgdHdpY2UgYXMgbG9uZyBhcyBhbGxvd2VkLAorICAgICAgICAgICAgICAgIC8vdGhlIHByaW1hcnkgc2Vzc2lvbiBoYXMgcHJvYmFibHkgY3Jhc2hlZCwgYW5kIG5vIG90aGVyCisgICAgICAgICAgICAgICAgLy9yZXF1ZXN0cyBhcmUgY29taW5nIGluLiB0aGF0IGlzIHdoeSB3ZSBkbyB0aGlzLiBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAvL3dlIHdvdWxkIGhhdmUgYSBtZW1vcnkgbGVhaworICAgICAgICAgICAgICAgICAgICBleHBpcmUodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAodGhpcy5pc1ZhbGlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPmlzVmFsaWQ8L2NvZGU+IGZsYWcgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXNWYWxpZAorICAgICAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIDxjb2RlPmlzVmFsaWQ8L2NvZGU+IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZChib29sZWFuIGlzVmFsaWQpIHsKKworICAgICAgICB0aGlzLmlzVmFsaWQgPSBpc1ZhbGlkOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2Vzc2lvbiBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBhY2Nlc3NlZCB0aW1lIGluZm9ybWF0aW9uIGZvciB0aGlzIHNlc3Npb24uIFRoaXMgbWV0aG9kIHNob3VsZAorICAgICAqIGJlIGNhbGxlZCBieSB0aGUgY29udGV4dCB3aGVuIGEgcmVxdWVzdCBjb21lcyBpbiBmb3IgYSBwYXJ0aWN1bGFyCisgICAgICogc2Vzc2lvbiwgZXZlbiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QgcmVmZXJlbmNlIGl0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFjY2VzcygpIHsKKworICAgICAgICB0aGlzLmxhc3RBY2Nlc3NlZFRpbWUgPSB0aGlzLnRoaXNBY2Nlc3NlZFRpbWU7CisgICAgICAgIHRoaXMudGhpc0FjY2Vzc2VkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIGV2YWx1YXRlSWZWYWxpZCgpOworCisgICAgICAgIGlmIChHbG9iYWxzLlNUUklDVF9TRVJWTEVUX0NPTVBMSUFOQ0UpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgeworICAgICAgICAgICAgICAgIGFjY2Vzc0NvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRBY2Nlc3MoKSB7CisgICAgICAgIGlzTmV3ID0gZmFsc2U7CisgICAgICAgIGlmIChHbG9iYWxzLlNUUklDVF9TRVJWTEVUX0NPTVBMSUFOQ0UpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgeworICAgICAgICAgICAgICAgIGFjY2Vzc0NvdW50LS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYobWFuYWdlciBpbnN0YW5jZW9mIERlbHRhTWFuYWdlcikKKyAgICAgICAgICAgICgoRGVsdGFNYW5hZ2VyKW1hbmFnZXIpLnJlZ2lzdGVyU2Vzc2lvbkF0UmVwbGljYXRpb25WYWx2ZSh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZXNzaW9uIGV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNlc3Npb25MaXN0ZW5lcihTZXNzaW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgeworICAgICAgICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gdGhlIGludGVybmFsIHByb2Nlc3NpbmcgcmVxdWlyZWQgdG8gaW52YWxpZGF0ZSB0aGlzIHNlc3Npb24sCisgICAgICogd2l0aG91dCB0cmlnZ2VyaW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2Vzc2lvbiBoYXMgYWxyZWFkeSBleHBpcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cGlyZSgpIHsKKworICAgICAgICBleHBpcmUodHJ1ZSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHRoZSBpbnRlcm5hbCBwcm9jZXNzaW5nIHJlcXVpcmVkIHRvIGludmFsaWRhdGUgdGhpcyBzZXNzaW9uLAorICAgICAqIHdpdGhvdXQgdHJpZ2dlcmluZyBhbiBleGNlcHRpb24gaWYgdGhlIHNlc3Npb24gaGFzIGFscmVhZHkgZXhwaXJlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbm90aWZ5CisgICAgICogICAgICAgICAgICBTaG91bGQgd2Ugbm90aWZ5IGxpc3RlbmVycyBhYm91dCB0aGUgZGVtaXNlIG9mIHRoaXMgc2Vzc2lvbj8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleHBpcmUoYm9vbGVhbiBub3RpZnkpIHsKKyAgICAgICAgZXhwaXJlKG5vdGlmeSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXhwaXJlKGJvb2xlYW4gbm90aWZ5LCBib29sZWFuIG5vdGlmeUNsdXN0ZXIpIHsKKworICAgICAgICAvLyBNYXJrIHRoaXMgc2Vzc2lvbiBhcyAiYmVpbmcgZXhwaXJlZCIgaWYgbmVlZGVkCisgICAgICAgIGlmIChleHBpcmluZykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGV4cGlyZWRJZCA9IGdldElkSW50ZXJuYWwoKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKworICAgICAgICAgICAgaWYgKG1hbmFnZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGV4cGlyaW5nID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gTm90aWZ5IGludGVyZXN0ZWQgYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzCisgICAgICAgICAgICAvLyBGSVhNRSAtIEFzc3VtZXMgd2UgY2FsbCBsaXN0ZW5lcnMgaW4gcmV2ZXJzZSBvcmRlcgorICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgICAgICAvL2ZpeCBmb3Igc3RhbmRhbG9uZSBtYW5hZ2VyIHdpdGhvdXQgY29udGFpbmVyCisgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IGxpc3RlbmVyc1tdID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbkxpZmVjeWNsZUxpc3RlbmVycygpOworICAgICAgICAgICAgICAgIGlmIChub3RpZnkgJiYgKGxpc3RlbmVycyAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICBIdHRwU2Vzc2lvbkV2ZW50IGV2ZW50ID0gbmV3IEh0dHBTZXNzaW9uRXZlbnQoZ2V0U2Vzc2lvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBqID0gKGxpc3RlbmVycy5sZW5ndGggLSAxKSAtIGk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShsaXN0ZW5lcnNbal0gaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkxpc3RlbmVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXNzaW9uTGlzdGVuZXIgbGlzdGVuZXIgPSAoSHR0cFNlc3Npb25MaXN0ZW5lcikgbGlzdGVuZXJzW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTZXNzaW9uRGVzdHJveWVkIiwgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnNlc3Npb25EZXN0cm95ZWQoZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU2Vzc2lvbkRlc3Ryb3llZCIsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU2Vzc2lvbkRlc3Ryb3llZCIsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5zZXNzaW9uRXZlbnQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhY2Nlc3NDb3VudCA9IDA7CisgICAgICAgICAgICBzZXRWYWxpZChmYWxzZSk7CisKKyAgICAgICAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ29tcHV0ZSBob3cgbG9uZyB0aGlzIHNlc3Npb24gaGFzIGJlZW4gYWxpdmUsIGFuZCB1cGRhdGUKKyAgICAgICAgICAgICAgICAgKiBzZXNzaW9uIG1hbmFnZXIncyByZWxhdGVkIHByb3BlcnRpZXMgYWNjb3JkaW5nbHkKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBsb25nIHRpbWVOb3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBpbnQgdGltZUFsaXZlID0gKGludCkgKCh0aW1lTm93IC0gY3JlYXRpb25UaW1lKS8xMDAwKTsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVBbGl2ZSA+IG1hbmFnZXIuZ2V0U2Vzc2lvbk1heEFsaXZlVGltZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLnNldFNlc3Npb25NYXhBbGl2ZVRpbWUodGltZUFsaXZlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgbnVtRXhwaXJlZCA9IG1hbmFnZXIuZ2V0RXhwaXJlZFNlc3Npb25zKCk7CisgICAgICAgICAgICAgICAgICAgIG51bUV4cGlyZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5zZXRFeHBpcmVkU2Vzc2lvbnMobnVtRXhwaXJlZCk7CisgICAgICAgICAgICAgICAgICAgIGludCBhdmVyYWdlID0gbWFuYWdlci5nZXRTZXNzaW9uQXZlcmFnZUFsaXZlVGltZSgpOworICAgICAgICAgICAgICAgICAgICBhdmVyYWdlID0gKChhdmVyYWdlICogKG51bUV4cGlyZWQtMSkpICsgdGltZUFsaXZlKS9udW1FeHBpcmVkOworICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLnNldFNlc3Npb25BdmVyYWdlQWxpdmVUaW1lKGF2ZXJhZ2UpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIHNlc3Npb24gZnJvbSBvdXIgbWFuYWdlcidzIGFjdGl2ZSBzZXNzaW9ucworICAgICAgICAgICAgICAgIG1hbmFnZXIucmVtb3ZlKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBOb3RpZnkgaW50ZXJlc3RlZCBzZXNzaW9uIGV2ZW50IGxpc3RlbmVycworICAgICAgICAgICAgaWYgKG5vdGlmeSkgeworICAgICAgICAgICAgICAgIGZpcmVTZXNzaW9uRXZlbnQoU2Vzc2lvbi5TRVNTSU9OX0RFU1RST1lFRF9FVkVOVCwgbnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgY29tcGxldGVkIGV4cGlyZSBvZiB0aGlzIHNlc3Npb24KKyAgICAgICAgICAgIGV4cGlyaW5nID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIFVuYmluZCBhbnkgb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXNzaW9uCisgICAgICAgICAgICBTdHJpbmcga2V5c1tdID0ga2V5cygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZUludGVybmFsKGtleXNbaV0sIG5vdGlmeSwgZmFsc2UpOworCisgICAgICAgICAgICBpZiAobm90aWZ5Q2x1c3RlciAmJiBtYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbXAuZ2V0U3RyaW5nKCJkZWx0YVNlc3Npb24ubm90aWZ5aW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoRGVsdGFNYW5hZ2VyKSBtYW5hZ2VyKS5nZXROYW1lKCksIG5ldyBCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnlTZXNzaW9uKCkpLCBleHBpcmVkSWQpKTsKKyAgICAgICAgICAgICAgICAoKERlbHRhTWFuYWdlcikgbWFuYWdlcikuc2Vzc2lvbkV4cGlyZWQoZXhwaXJlZElkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvYmplY3QgYm91bmQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgdG8gdGhlIGludGVybmFsIG5vdGVzIGZvcgorICAgICAqIHRoaXMgc2Vzc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBiaW5kaW5nIGV4aXN0cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgTmFtZSBvZiB0aGUgbm90ZSB0byBiZSByZXR1cm5lZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0Tm90ZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIChub3Rlcy5nZXQobmFtZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBJdGVyYXRvciBjb250YWluaW5nIHRoZSBTdHJpbmcgbmFtZXMgb2YgYWxsIG5vdGVzIGJpbmRpbmdzIHRoYXQKKyAgICAgKiBleGlzdCBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBnZXROb3RlTmFtZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gKG5vdGVzLmtleVNldCgpLml0ZXJhdG9yKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgYWxsIG9iamVjdCByZWZlcmVuY2VzLCBhbmQgaW5pdGlhbGl6ZSBpbnN0YW5jZSB2YXJpYWJsZXMsIGluCisgICAgICogcHJlcGFyYXRpb24gZm9yIHJldXNlIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlY3ljbGUoKSB7CisKKyAgICAgICAgLy8gUmVzZXQgdGhlIGluc3RhbmNlIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXNzaW9uCisgICAgICAgIGF0dHJpYnV0ZXMuY2xlYXIoKTsKKyAgICAgICAgc2V0QXV0aFR5cGUobnVsbCk7CisgICAgICAgIGNyZWF0aW9uVGltZSA9IDBMOworICAgICAgICBleHBpcmluZyA9IGZhbHNlOworICAgICAgICBpZCA9IG51bGw7CisgICAgICAgIGxhc3RBY2Nlc3NlZFRpbWUgPSAwTDsKKyAgICAgICAgbWF4SW5hY3RpdmVJbnRlcnZhbCA9IC0xOworICAgICAgICBhY2Nlc3NDb3VudCA9IDA7CisgICAgICAgIG5vdGVzLmNsZWFyKCk7CisgICAgICAgIHNldFByaW5jaXBhbChudWxsKTsKKyAgICAgICAgaXNOZXcgPSBmYWxzZTsKKyAgICAgICAgaXNWYWxpZCA9IGZhbHNlOworICAgICAgICBtYW5hZ2VyID0gbnVsbDsKKyAgICAgICAgZGVsdGFSZXF1ZXN0LmNsZWFyKCk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IG9iamVjdCBib3VuZCB0byB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhlIGludGVybmFsIG5vdGVzIGZvcgorICAgICAqIHRoaXMgc2Vzc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgTmFtZSBvZiB0aGUgbm90ZSB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTm90ZShTdHJpbmcgbmFtZSkgeworICAgICAgICBub3Rlcy5yZW1vdmUobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgc2Vzc2lvbiBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlc3Npb25MaXN0ZW5lcihTZXNzaW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgeworICAgICAgICAgICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmQgYW4gb2JqZWN0IHRvIGEgc3BlY2lmaWVkIG5hbWUgaW4gdGhlIGludGVybmFsIG5vdGVzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgc2Vzc2lvbiwgcmVwbGFjaW5nIGFueSBleGlzdGluZyBiaW5kaW5nIGZvciB0aGlzIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIE5hbWUgdG8gd2hpY2ggdGhlIG9iamVjdCBzaG91bGQgYmUgYm91bmQKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIE9iamVjdCB0byBiZSBib3VuZCB0byB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb3RlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgbm90ZXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgiRGVsdGFTZXNzaW9uWyIpOworICAgICAgICBzYi5hcHBlbmQoaWQpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXNzaW9uIFBhY2thZ2UgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUmVhZCBhIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgY29udGVudHMgb2YgdGhpcyBzZXNzaW9uIG9iamVjdCBmcm9tIHRoZQorICAgICAqIHNwZWNpZmllZCBvYmplY3QgaW5wdXQgc3RyZWFtLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IHRoZSBTdGFuZGFyZFNlc3Npb24KKyAgICAgKiBpdHNlbGYgaGF2ZSBiZWVuIHNlcmlhbGl6ZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHN0cmVhbQorICAgICAqICAgICAgICAgICAgVGhlIG9iamVjdCBpbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gdW5rbm93biBjbGFzcyBpcyBzcGVjaWZpZWQKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlYWRPYmplY3REYXRhKE9iamVjdElucHV0U3RyZWFtIHN0cmVhbSkKKyAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVhZE9iamVjdChzdHJlYW0pOworCisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc2Vzc2lvbiBvYmplY3QgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIG9iamVjdCBvdXRwdXQgc3RyZWFtLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IHRoZQorICAgICAqIFN0YW5kYXJkU2Vzc2lvbiBpdHNlbGYgaGF2ZSBiZWVuIHNlcmlhbGl6ZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHN0cmVhbQorICAgICAqICAgICAgICAgICAgVGhlIG9iamVjdCBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRvCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZU9iamVjdERhdGEoT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICB3cml0ZU9iamVjdChzdHJlYW0pOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXREZWx0YVJlcXVlc3QoKSB7CisgICAgICAgIGlmIChkZWx0YVJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgZGVsdGFSZXF1ZXN0ID0gbmV3IERlbHRhUmVxdWVzdChnZXRJZEludGVybmFsKCksIGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlbHRhUmVxdWVzdC5yZXNldCgpOworICAgICAgICAgICAgZGVsdGFSZXF1ZXN0LnNldFNlc3Npb25JZChnZXRJZEludGVybmFsKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIERlbHRhUmVxdWVzdCBnZXREZWx0YVJlcXVlc3QoKSB7CisgICAgICAgIGlmIChkZWx0YVJlcXVlc3QgPT0gbnVsbCkKKyAgICAgICAgICAgIHJlc2V0RGVsdGFSZXF1ZXN0KCk7CisgICAgICAgIHJldHVybiBkZWx0YVJlcXVlc3Q7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIdHRwU2Vzc2lvbiBQcm9wZXJ0aWVzCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRpbWUgd2hlbiB0aGlzIHNlc3Npb24gd2FzIGNyZWF0ZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZQorICAgICAqIG1pZG5pZ2h0LCBKYW51YXJ5IDEsIDE5NzAgR01ULgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDcmVhdGlvblRpbWUoKSB7CisKKyAgICAgICAgaWYgKCFleHBpcmluZyAmJiAhaXNWYWxpZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oc20KKyAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLmdldENyZWF0aW9uVGltZS5pc2UiKSk7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmNyZWF0aW9uVGltZSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNlcnZsZXRDb250ZXh0IHRvIHdoaWNoIHRoaXMgc2Vzc2lvbiBiZWxvbmdzLgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKKworICAgICAgICBpZiAobWFuYWdlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKGNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gY29udGV4dCB3aXRoIHdoaWNoIHRoaXMgc2Vzc2lvbiBpcyBhc3NvY2lhdGVkLgorICAgICAqIAorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIFZlcnNpb24gMi4xLCB0aGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFuZCBoYXMgbm8KKyAgICAgKiAgICAgICAgICAgICByZXBsYWNlbWVudC4gSXQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgdGhlCisgICAgICogICAgICAgICAgICAgSmF2YSBTZXJ2bGV0IEFQSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSHR0cFNlc3Npb25Db250ZXh0IGdldFNlc3Npb25Db250ZXh0KCkgeworCisgICAgICAgIGlmIChzZXNzaW9uQ29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgc2Vzc2lvbkNvbnRleHQgPSBuZXcgU3RhbmRhcmRTZXNzaW9uQ29udGV4dCgpOworICAgICAgICByZXR1cm4gKHNlc3Npb25Db250ZXh0KTsKKworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1IdHRwU2Vzc2lvbiBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvYmplY3QgYm91bmQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhpcyBzZXNzaW9uLCBvcgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG9iamVjdCBpcyBib3VuZCB3aXRoIHRoYXQgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgTmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGJlIHJldHVybmVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4gaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHNtCisgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5nZXRBdHRyaWJ1dGUuaXNlIikpOworICAgICAgICByZXR1cm4gKGF0dHJpYnV0ZXMuZ2V0KG5hbWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0cworICAgICAqIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBvYmplY3RzIGJvdW5kIHRvIHRoaXMgc2Vzc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbiBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeworCisgICAgICAgIGlmICghaXNWYWxpZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihzbQorICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uZ2V0QXR0cmlidXRlTmFtZXMuaXNlIikpOworICAgICAgICByZXR1cm4gKG5ldyBFbnVtZXJhdG9yKGF0dHJpYnV0ZXMua2V5U2V0KCksIHRydWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBib3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiB0aGlzIHNlc3Npb24sIG9yCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gb2JqZWN0IGlzIGJvdW5kIHdpdGggdGhhdCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICBOYW1lIG9mIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZAorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKiAKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBWZXJzaW9uIDIuMiwgdGhpcyBtZXRob2QgaXMgcmVwbGFjZWQgYnkKKyAgICAgKiAgICAgICAgICAgICA8Y29kZT5nZXRBdHRyaWJ1dGUoKTwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuIChnZXRBdHRyaWJ1dGUobmFtZSkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgbmFtZXMgb2Ygb2JqZWN0cyBib3VuZCB0byB0aGlzIHNlc3Npb24uIElmIHRoZXJlIGFyZSBubworICAgICAqIHN1Y2ggb2JqZWN0cywgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbiBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICogCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgVmVyc2lvbiAyLjIsIHRoaXMgbWV0aG9kIGlzIHJlcGxhY2VkIGJ5CisgICAgICogICAgICAgICAgICAgPGNvZGU+Z2V0QXR0cmlidXRlTmFtZXMoKTwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVOYW1lcygpIHsKKworICAgICAgICBpZiAoIWlzVmFsaWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oc20KKyAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLmdldFZhbHVlTmFtZXMuaXNlIikpOworCisgICAgICAgIHJldHVybiAoa2V5cygpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEludmFsaWRhdGVzIHRoaXMgc2Vzc2lvbiBhbmQgdW5iaW5kcyBhbnkgb2JqZWN0cyBib3VuZCB0byBpdC4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbiBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpIHsKKworICAgICAgICBpZiAoIWlzVmFsaWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oc20KKyAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLmludmFsaWRhdGUuaXNlIikpOworCisgICAgICAgIC8vIENhdXNlIHRoaXMgc2Vzc2lvbiB0byBleHBpcmUKKyAgICAgICAgZXhwaXJlKCk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNsaWVudCBkb2VzIG5vdCB5ZXQga25vdyBhYm91dCB0aGUKKyAgICAgKiBzZXNzaW9uLCBvciBpZiB0aGUgY2xpZW50IGNob29zZXMgbm90IHRvIGpvaW4gdGhlIHNlc3Npb24uIEZvciBleGFtcGxlLAorICAgICAqIGlmIHRoZSBzZXJ2ZXIgdXNlZCBvbmx5IGNvb2tpZS1iYXNlZCBzZXNzaW9ucywgYW5kIHRoZSBjbGllbnQgaGFzCisgICAgICogZGlzYWJsZWQgdGhlIHVzZSBvZiBjb29raWVzLCB0aGVuIGEgc2Vzc2lvbiB3b3VsZCBiZSBuZXcgb24gZWFjaCByZXF1ZXN0LgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc05ldygpIHsKKworICAgICAgICBpZiAoIWlzVmFsaWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oc20KKyAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLmlzTmV3LmlzZSIpKTsKKworICAgICAgICByZXR1cm4gKHRoaXMuaXNOZXcpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZCBhbiBvYmplY3QgdG8gdGhpcyBzZXNzaW9uLCB1c2luZyB0aGUgc3BlY2lmaWVkIG5hbWUuIElmIGFuIG9iamVjdCBvZgorICAgICAqIHRoZSBzYW1lIG5hbWUgaXMgYWxyZWFkeSBib3VuZCB0byB0aGlzIHNlc3Npb24sIHRoZSBvYmplY3QgaXMgcmVwbGFjZWQuCisgICAgICogPHA+CisgICAgICogQWZ0ZXIgdGhpcyBtZXRob2QgZXhlY3V0ZXMsIGFuZCBpZiB0aGUgb2JqZWN0IGltcGxlbWVudHMKKyAgICAgKiA8Y29kZT5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjwvY29kZT4sIHRoZSBjb250YWluZXIgY2FsbHMKKyAgICAgKiA8Y29kZT52YWx1ZUJvdW5kKCk8L2NvZGU+IG9uIHRoZSBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIE5hbWUgdG8gd2hpY2ggdGhlIG9iamVjdCBpcyBib3VuZCwgY2Fubm90IGJlIG51bGwKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIE9iamVjdCB0byBiZSBib3VuZCwgY2Fubm90IGJlIG51bGwKKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbiBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICogCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgVmVyc2lvbiAyLjIsIHRoaXMgbWV0aG9kIGlzIHJlcGxhY2VkIGJ5CisgICAgICogICAgICAgICAgICAgPGNvZGU+c2V0QXR0cmlidXRlKCk8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0VmFsdWUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworCisgICAgICAgIHNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIG9iamVjdCBib3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBmcm9tIHRoaXMgc2Vzc2lvbi4gSWYgdGhlCisgICAgICogc2Vzc2lvbiBkb2VzIG5vdCBoYXZlIGFuIG9iamVjdCBib3VuZCB3aXRoIHRoaXMgbmFtZSwgdGhpcyBtZXRob2QgZG9lcworICAgICAqIG5vdGhpbmcuCisgICAgICogPHA+CisgICAgICogQWZ0ZXIgdGhpcyBtZXRob2QgZXhlY3V0ZXMsIGFuZCBpZiB0aGUgb2JqZWN0IGltcGxlbWVudHMKKyAgICAgKiA8Y29kZT5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjwvY29kZT4sIHRoZSBjb250YWluZXIgY2FsbHMKKyAgICAgKiA8Y29kZT52YWx1ZVVuYm91bmQoKTwvY29kZT4gb24gdGhlIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgTmFtZSBvZiB0aGUgb2JqZWN0IHRvIHJlbW92ZSBmcm9tIHRoaXMgc2Vzc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbiBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgcmVtb3ZlQXR0cmlidXRlKG5hbWUsIHRydWUpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBvYmplY3QgYm91bmQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgZnJvbSB0aGlzIHNlc3Npb24uIElmIHRoZQorICAgICAqIHNlc3Npb24gZG9lcyBub3QgaGF2ZSBhbiBvYmplY3QgYm91bmQgd2l0aCB0aGlzIG5hbWUsIHRoaXMgbWV0aG9kIGRvZXMKKyAgICAgKiBub3RoaW5nLgorICAgICAqIDxwPgorICAgICAqIEFmdGVyIHRoaXMgbWV0aG9kIGV4ZWN1dGVzLCBhbmQgaWYgdGhlIG9iamVjdCBpbXBsZW1lbnRzCisgICAgICogPGNvZGU+SHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI8L2NvZGU+LCB0aGUgY29udGFpbmVyIGNhbGxzCisgICAgICogPGNvZGU+dmFsdWVVbmJvdW5kKCk8L2NvZGU+IG9uIHRoZSBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIE5hbWUgb2YgdGhlIG9iamVjdCB0byByZW1vdmUgZnJvbSB0aGlzIHNlc3Npb24uCisgICAgICogQHBhcmFtIG5vdGlmeQorICAgICAqICAgICAgICAgICAgU2hvdWxkIHdlIG5vdGlmeSBpbnRlcmVzdGVkIGxpc3RlbmVycyB0aGF0IHRoaXMgYXR0cmlidXRlIGlzCisgICAgICogICAgICAgICAgICBiZWluZyByZW1vdmVkPworICAgICAqIAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gbm90aWZ5KSB7CisgICAgICAgIHJlbW92ZUF0dHJpYnV0ZShuYW1lLCBub3RpZnksIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBub3RpZnksCisgICAgICAgICAgICBib29sZWFuIGFkZERlbHRhUmVxdWVzdCkgeworCisgICAgICAgIC8vIFZhbGlkYXRlIG91ciBjdXJyZW50IHN0YXRlCisgICAgICAgIGlmICghaXNWYWxpZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihzbQorICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24ucmVtb3ZlQXR0cmlidXRlLmlzZSIpKTsKKyAgICAgICAgcmVtb3ZlQXR0cmlidXRlSW50ZXJuYWwobmFtZSwgbm90aWZ5LCBhZGREZWx0YVJlcXVlc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgb2JqZWN0IGJvdW5kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGZyb20gdGhpcyBzZXNzaW9uLiBJZiB0aGUKKyAgICAgKiBzZXNzaW9uIGRvZXMgbm90IGhhdmUgYW4gb2JqZWN0IGJvdW5kIHdpdGggdGhpcyBuYW1lLCB0aGlzIG1ldGhvZCBkb2VzCisgICAgICogbm90aGluZy4KKyAgICAgKiA8cD4KKyAgICAgKiBBZnRlciB0aGlzIG1ldGhvZCBleGVjdXRlcywgYW5kIGlmIHRoZSBvYmplY3QgaW1wbGVtZW50cworICAgICAqIDxjb2RlPkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyPC9jb2RlPiwgdGhlIGNvbnRhaW5lciBjYWxscworICAgICAqIDxjb2RlPnZhbHVlVW5ib3VuZCgpPC9jb2RlPiBvbiB0aGUgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICBOYW1lIG9mIHRoZSBvYmplY3QgdG8gcmVtb3ZlIGZyb20gdGhpcyBzZXNzaW9uLgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKiAKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBWZXJzaW9uIDIuMiwgdGhpcyBtZXRob2QgaXMgcmVwbGFjZWQgYnkKKyAgICAgKiAgICAgICAgICAgICA8Y29kZT5yZW1vdmVBdHRyaWJ1dGUoKTwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVWYWx1ZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmQgYW4gb2JqZWN0IHRvIHRoaXMgc2Vzc2lvbiwgdXNpbmcgdGhlIHNwZWNpZmllZCBuYW1lLiBJZiBhbiBvYmplY3Qgb2YKKyAgICAgKiB0aGUgc2FtZSBuYW1lIGlzIGFscmVhZHkgYm91bmQgdG8gdGhpcyBzZXNzaW9uLCB0aGUgb2JqZWN0IGlzIHJlcGxhY2VkLgorICAgICAqIDxwPgorICAgICAqIEFmdGVyIHRoaXMgbWV0aG9kIGV4ZWN1dGVzLCBhbmQgaWYgdGhlIG9iamVjdCBpbXBsZW1lbnRzCisgICAgICogPGNvZGU+SHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI8L2NvZGU+LCB0aGUgY29udGFpbmVyIGNhbGxzCisgICAgICogPGNvZGU+dmFsdWVCb3VuZCgpPC9jb2RlPiBvbiB0aGUgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICBOYW1lIHRvIHdoaWNoIHRoZSBvYmplY3QgaXMgYm91bmQsIGNhbm5vdCBiZSBudWxsCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICBPYmplY3QgdG8gYmUgYm91bmQsIGNhbm5vdCBiZSBudWxsCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYWRkIGEgbm9uLXNlcmlhbGl6YWJsZSBvYmplY3QgaW4KKyAgICAgKiAgICAgICAgICAgICAgICBhbiBlbnZpcm9ubWVudCBtYXJrZWQgZGlzdHJpYnV0YWJsZS4KKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbiBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlLCB0cnVlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBub3RpZnksCisgICAgICAgICAgICBib29sZWFuIGFkZERlbHRhUmVxdWVzdCkgeworCisgICAgICAgIC8vIE5hbWUgY2Fubm90IGJlIG51bGwKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oc20KKyAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLnNldEF0dHJpYnV0ZS5uYW1lbnVsbCIpKTsKKworICAgICAgICAvLyBOdWxsIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHJlbW92ZUF0dHJpYnV0ZSgpCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBWYWxpZGF0ZSBvdXIgY3VycmVudCBzdGF0ZQorICAgICAgICBpZiAoIWlzVmFsaWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oc20KKyAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLnNldEF0dHJpYnV0ZS5pc2UiKSk7CisgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgamF2YS5pby5TZXJpYWxpemFibGUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdHRyaWJ1dGUgWyIgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIl0gaXMgbm90IHNlcmlhbGl6YWJsZSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFkZERlbHRhUmVxdWVzdCAmJiAoZGVsdGFSZXF1ZXN0ICE9IG51bGwpKQorICAgICAgICAgICAgZGVsdGFSZXF1ZXN0LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CisKKworICAgICAgICAvLyBDb25zdHJ1Y3QgYW4gZXZlbnQgd2l0aCB0aGUgbmV3IHZhbHVlCisgICAgICAgIEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50ID0gbnVsbDsKKworICAgICAgICAvLyBDYWxsIHRoZSB2YWx1ZUJvdW5kKCkgbWV0aG9kIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lciAmJiBub3RpZnkpIHsKKyAgICAgICAgICAgIC8vIERvbid0IGNhbGwgYW55IG5vdGlmaWNhdGlvbiBpZiByZXBsYWNpbmcgd2l0aCB0aGUgc2FtZSB2YWx1ZQorICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gYXR0cmlidXRlcy5nZXQobmFtZSk7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gb2xkVmFsdWUpIHsKKyAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudChnZXRTZXNzaW9uKCksIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAoKEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyKSB2YWx1ZSkudmFsdWVCb3VuZChldmVudCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5lcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgKHNtcC5nZXRTdHJpbmcoImRlbHRhU2Vzc2lvbi52YWx1ZUJvdW5kLmV4IiksIHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcGxhY2Ugb3IgYWRkIHRoaXMgYXR0cmlidXRlCisgICAgICAgIE9iamVjdCB1bmJvdW5kID0gYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOworICAgICAgICAvLyBDYWxsIHRoZSB2YWx1ZVVuYm91bmQoKSBtZXRob2QgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmICgodW5ib3VuZCAhPSBudWxsKSAmJiAodW5ib3VuZCAhPSB2YWx1ZSkgJiYgbm90aWZ5CisgICAgICAgICAgICAgICAgJiYgKHVuYm91bmQgaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcikpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgKChIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcikgdW5ib3VuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZVVuYm91bmQobmV3IEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSHR0cFNlc3Npb24pIGdldFNlc3Npb24oKSwgbmFtZSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yCisgICAgICAgICAgICAgICAgICAgIChzbXAuZ2V0U3RyaW5nKCJkZWx0YVNlc3Npb24udmFsdWVCaW5kaW5nLmV4IiksIHgpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvL2RvbnQgbm90aWZ5IGFueSBsaXN0ZW5lcnMKKyAgICAgICAgaWYgKCFub3RpZnkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gTm90aWZ5IGludGVyZXN0ZWQgYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzCisgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBtYW5hZ2VyLmdldENvbnRhaW5lcigpOworICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBPYmplY3QgbGlzdGVuZXJzW10gPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghKGxpc3RlbmVyc1tpXSBpbnN0YW5jZW9mIEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBIdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyIGxpc3RlbmVyID0gKEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAodW5ib3VuZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZm9yZVNlc3Npb25BdHRyaWJ1dGVSZXBsYWNlZCIsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBuZXcgSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQoZ2V0U2Vzc2lvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdW5ib3VuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5hdHRyaWJ1dGVSZXBsYWNlZChldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU2Vzc2lvbkF0dHJpYnV0ZVJlcGxhY2VkIiwgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTZXNzaW9uQXR0cmlidXRlQWRkZWQiLCBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50KGdldFNlc3Npb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmF0dHJpYnV0ZUFkZGVkKGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXJTZXNzaW9uQXR0cmlidXRlQWRkZWQiLCBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuYm91bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU2Vzc2lvbkF0dHJpYnV0ZVJlcGxhY2VkIiwgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclNlc3Npb25BdHRyaWJ1dGVBZGRlZCIsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uYXR0cmlidXRlRXZlbnQiKSx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEh0dHBTZXNzaW9uIFByaXZhdGUgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUmVhZCBhIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGlzIHNlc3Npb24gb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqIG9iamVjdCBpbnB1dCBzdHJlYW0uCisgICAgICogPHA+CisgICAgICogPGI+SU1QTEVNRU5UQVRJT04gTk9URSA8L2I+OiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBvd25pbmcgTWFuYWdlciBpcyBub3QKKyAgICAgKiByZXN0b3JlZCBieSB0aGlzIG1ldGhvZCwgYW5kIG11c3QgYmUgc2V0IGV4cGxpY2l0bHkuCisgICAgICogCisgICAgICogQHBhcmFtIHN0cmVhbQorICAgICAqICAgICAgICAgICAgVGhlIGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiB1bmtub3duIGNsYXNzIGlzIHNwZWNpZmllZAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gc3RyZWFtKQorICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgc2NhbGFyIGluc3RhbmNlIHZhcmlhYmxlcyAoZXhjZXB0IE1hbmFnZXIpCisgICAgICAgIGF1dGhUeXBlID0gbnVsbDsgLy8gVHJhbnNpZW50IG9ubHkKKyAgICAgICAgY3JlYXRpb25UaW1lID0gKChMb25nKSBzdHJlYW0ucmVhZE9iamVjdCgpKS5sb25nVmFsdWUoKTsKKyAgICAgICAgbGFzdEFjY2Vzc2VkVGltZSA9ICgoTG9uZykgc3RyZWFtLnJlYWRPYmplY3QoKSkubG9uZ1ZhbHVlKCk7CisgICAgICAgIG1heEluYWN0aXZlSW50ZXJ2YWwgPSAoKEludGVnZXIpIHN0cmVhbS5yZWFkT2JqZWN0KCkpLmludFZhbHVlKCk7CisgICAgICAgIGlzTmV3ID0gKChCb29sZWFuKSBzdHJlYW0ucmVhZE9iamVjdCgpKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgaXNWYWxpZCA9ICgoQm9vbGVhbikgc3RyZWFtLnJlYWRPYmplY3QoKSkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIHRoaXNBY2Nlc3NlZFRpbWUgPSAoKExvbmcpIHN0cmVhbS5yZWFkT2JqZWN0KCkpLmxvbmdWYWx1ZSgpOworICAgICAgICBib29sZWFuIGhhc1ByaW5jaXBhbCA9IHN0cmVhbS5yZWFkQm9vbGVhbigpOworICAgICAgICBwcmluY2lwYWwgPSBudWxsOworICAgICAgICBpZiAoaGFzUHJpbmNpcGFsKSB7CisgICAgICAgICAgICBwcmluY2lwYWwgPSBTZXJpYWxpemFibGVQcmluY2lwYWwucmVhZFByaW5jaXBhbChzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgIGdldE1hbmFnZXIoKS5nZXRDb250YWluZXIoKS5nZXRSZWFsbSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICAgICAgICBzZXRJZCgoU3RyaW5nKSBzdHJlYW0ucmVhZE9iamVjdCgpKTsKKyAgICAgICAgaWQgPSAoU3RyaW5nKSBzdHJlYW0ucmVhZE9iamVjdCgpOworICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbWFuYWdlckxvZyA9IG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkgOworICAgICAgICBpZiAobWFuYWdlckxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbWFuYWdlckxvZy5kZWJ1ZyhzbXAuZ2V0U3RyaW5nKCJkZWx0YVNlc3Npb24ucmVhZFNlc3Npb24iLCAgaWQpKTsKKworICAgICAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgYXR0cmlidXRlIGNvdW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzCisgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpCisgICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBpbnQgbiA9ICgoSW50ZWdlcikgc3RyZWFtLnJlYWRPYmplY3QoKSkuaW50VmFsdWUoKTsKKyAgICAgICAgYm9vbGVhbiBpc1ZhbGlkU2F2ZSA9IGlzVmFsaWQ7CisgICAgICAgIGlzVmFsaWQgPSB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBzdHJlYW0ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gKE9iamVjdCkgc3RyZWFtLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIGlmICgodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpICYmICh2YWx1ZS5lcXVhbHMoTk9UX1NFUklBTElaRUQpKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChtYW5hZ2VyTG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbWFuYWdlckxvZy5kZWJ1ZygiICBsb2FkaW5nIGF0dHJpYnV0ZSAnIiArIG5hbWUgKworICAgICAgICAgICAgICAgICAgICAiJyB3aXRoIHZhbHVlICciICsgdmFsdWUgKyAiJyIpOworICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlzVmFsaWQgPSBpc1ZhbGlkU2F2ZTsKKyAgICAgICAgCisgICAgICAgIGlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobm90ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgbm90ZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGlzIHNlc3Npb24gb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0CisgICAgICogb3V0cHV0IHN0cmVhbS4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFIDwvYj46IFRoZSBvd25pbmcgTWFuYWdlciB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gdGhlCisgICAgICogc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFNlc3Npb24uIEFmdGVyIGNhbGxpbmcKKyAgICAgKiA8Y29kZT5yZWFkT2JqZWN0KCk8L2NvZGU+LCB5b3UgbXVzdCBzZXQgdGhlIGFzc29jaWF0ZWQgTWFuYWdlcgorICAgICAqIGV4cGxpY2l0bHkuCisgICAgICogPHA+CisgICAgICogPGI+SU1QTEVNRU5UQVRJT04gTk9URSA8L2I+OiBBbnkgYXR0cmlidXRlIHRoYXQgaXMgbm90IFNlcmlhbGl6YWJsZSB3aWxsCisgICAgICogYmUgdW5ib3VuZCBmcm9tIHRoZSBzZXNzaW9uLCB3aXRoIGFwcHJvcHJpYXRlIGFjdGlvbnMgaWYgaXQgaW1wbGVtZW50cworICAgICAqIEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyLiBJZiB5b3UgZG8gbm90IHdhbnQgYW55IHN1Y2ggYXR0cmlidXRlcywgYmUKKyAgICAgKiBzdXJlIHRoZSA8Y29kZT5kaXN0cmlidXRhYmxlPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGUgYXNzb2NpYXRlZCBNYW5hZ2VyCisgICAgICogaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRvCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBXcml0ZSB0aGUgc2NhbGFyIGluc3RhbmNlIHZhcmlhYmxlcyAoZXhjZXB0IE1hbmFnZXIpCisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChuZXcgTG9uZyhjcmVhdGlvblRpbWUpKTsKKyAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KG5ldyBMb25nKGxhc3RBY2Nlc3NlZFRpbWUpKTsKKyAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KG5ldyBJbnRlZ2VyKG1heEluYWN0aXZlSW50ZXJ2YWwpKTsKKyAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KG5ldyBCb29sZWFuKGlzTmV3KSk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChuZXcgQm9vbGVhbihpc1ZhbGlkKSk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChuZXcgTG9uZyh0aGlzQWNjZXNzZWRUaW1lKSk7CisgICAgICAgIHN0cmVhbS53cml0ZUJvb2xlYW4oZ2V0UHJpbmNpcGFsKCkgIT0gbnVsbCk7CisgICAgICAgIGlmIChnZXRQcmluY2lwYWwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTZXJpYWxpemFibGVQcmluY2lwYWwud3JpdGVQcmluY2lwYWwoKEdlbmVyaWNQcmluY2lwYWwpIHByaW5jaXBhbCwKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChpZCk7CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBtYW5hZ2VyTG9nID0gbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKSA7CisgICAgICAgIGlmIChtYW5hZ2VyTG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBtYW5hZ2VyTG9nLmRlYnVnKHNtcC5nZXRTdHJpbmcoImRlbHRhU2Vzc2lvbi53cml0ZVNlc3Npb24iLGlkKSk7CisKKyAgICAgICAgLy8gQWNjdW11bGF0ZSB0aGUgbmFtZXMgb2Ygc2VyaWFsaXphYmxlIGFuZCBub24tc2VyaWFsaXphYmxlIGF0dHJpYnV0ZXMKKyAgICAgICAgU3RyaW5nIGtleXNbXSA9IGtleXMoKTsKKyAgICAgICAgQXJyYXlMaXN0IHNhdmVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgQXJyYXlMaXN0IHNhdmVWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIHZhbHVlID0gYXR0cmlidXRlcy5nZXQoa2V5c1tpXSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2VyaWFsaXphYmxlKSB7CisgICAgICAgICAgICAgICAgc2F2ZU5hbWVzLmFkZChrZXlzW2ldKTsKKyAgICAgICAgICAgICAgICBzYXZlVmFsdWVzLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXJpYWxpemUgdGhlIGF0dHJpYnV0ZSBjb3VudCBhbmQgdGhlIFNlcmlhbGl6YWJsZSBhdHRyaWJ1dGVzCisgICAgICAgIGludCBuID0gc2F2ZU5hbWVzLnNpemUoKTsKKyAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KG5ldyBJbnRlZ2VyKG4pKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdCgoU3RyaW5nKSBzYXZlTmFtZXMuZ2V0KGkpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KHNhdmVWYWx1ZXMuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICBpZiAobWFuYWdlckxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXJMb2cuZGVidWcoIiBzdG9yaW5nIGF0dHJpYnV0ZSAnIiArIHNhdmVOYW1lcy5nZXQoaSkgKworICAgICAgICAgICAgICAgICAgICAgICAgIicgd2l0aCB2YWx1ZSAnIiArIHNhdmVWYWx1ZXMuZ2V0KGkpICsgIiciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOb3RTZXJpYWxpemFibGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIG1hbmFnZXJMb2cud2FybihzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5ub3RTZXJpYWxpemFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZU5hbWVzLmdldChpKSwgaWQpLCBlKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QoTk9UX1NFUklBTElaRUQpOworICAgICAgICAgICAgICAgIGlmKG1hbmFnZXJMb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyTG9nLmRlYnVnKCIgIHN0b3JpbmcgYXR0cmlidXRlICciICsgc2F2ZU5hbWVzLmdldChpKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyB3aXRoIHZhbHVlIE5PVF9TRVJJQUxJWkVEIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXZhbHVhdGVJZlZhbGlkKCkgeworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGlzIHNlc3Npb24gaGFzIGV4cGlyZWQgb3IgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgZXhwaXJpbmcgb3Igd2lsbAorICAgICAgICAgKiBuZXZlciBleHBpcmUsIHJldHVybgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgZXhwaXJpbmcgfHwgbWF4SW5hY3RpdmVJbnRlcnZhbCA8IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaXNWYWxpZCgpOworCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBGaXJlIGNvbnRhaW5lciBldmVudHMgaWYgdGhlIENvbnRleHQgaW1wbGVtZW50YXRpb24gaXMgdGhlCisgICAgICogPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDwvY29kZT4uCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQKKyAgICAgKiAgICAgICAgICAgIENvbnRleHQgZm9yIHdoaWNoIHRvIGZpcmUgZXZlbnRzCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIEV2ZW50IHR5cGUKKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgRXZlbnQgZGF0YQorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgb2NjdXJyZWQgZHVyaW5nIGV2ZW50IGZpcmluZworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmaXJlQ29udGFpbmVyRXZlbnQoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgdHlwZSwgT2JqZWN0IGRhdGEpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoISJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0Ii5lcXVhbHMoY29udGV4dAorICAgICAgICAgICAgICAgIC5nZXRDbGFzcygpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gQ29udGFpbmVyIGV2ZW50cyBhcmUgbm90IHN1cHBvcnRlZAorICAgICAgICB9CisgICAgICAgIC8vIE5PVEU6IFJhY2UgY29uZGl0aW9uIGlzIGhhcm1sZXNzLCBzbyBkbyBub3Qgc3luY2hyb25pemUKKyAgICAgICAgaWYgKGNvbnRhaW5lckV2ZW50TWV0aG9kID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lckV2ZW50TWV0aG9kID0gY29udGV4dC5nZXRDbGFzcygpLmdldE1ldGhvZCgKKyAgICAgICAgICAgICAgICAgICAgImZpcmVDb250YWluZXJFdmVudCIsIGNvbnRhaW5lckV2ZW50VHlwZXMpOworICAgICAgICB9CisgICAgICAgIE9iamVjdCBjb250YWluZXJFdmVudFBhcmFtc1tdID0gbmV3IE9iamVjdFsyXTsKKyAgICAgICAgY29udGFpbmVyRXZlbnRQYXJhbXNbMF0gPSB0eXBlOworICAgICAgICBjb250YWluZXJFdmVudFBhcmFtc1sxXSA9IGRhdGE7CisgICAgICAgIGNvbnRhaW5lckV2ZW50TWV0aG9kLmludm9rZShjb250ZXh0LCBjb250YWluZXJFdmVudFBhcmFtcyk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgYWxsIHNlc3Npb24gZXZlbnQgbGlzdGVuZXJzIHRoYXQgYSBwYXJ0aWN1bGFyIGV2ZW50IGhhcyBvY2N1cnJlZAorICAgICAqIGZvciB0aGlzIFNlc3Npb24uIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIHRoaXMgbm90aWZpY2F0aW9uCisgICAgICogc3luY2hyb25vdXNseSB1c2luZyB0aGUgY2FsbGluZyB0aHJlYWQuCisgICAgICogCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIEV2ZW50IHR5cGUKKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgRXZlbnQgZGF0YQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpcmVTZXNzaW9uRXZlbnQoU3RyaW5nIHR5cGUsIE9iamVjdCBkYXRhKSB7CisgICAgICAgIGlmIChsaXN0ZW5lcnMuc2l6ZSgpIDwgMSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgU2Vzc2lvbkV2ZW50IGV2ZW50ID0gbmV3IFNlc3Npb25FdmVudCh0aGlzLCB0eXBlLCBkYXRhKTsKKyAgICAgICAgU2Vzc2lvbkxpc3RlbmVyIGxpc3RbXSA9IG5ldyBTZXNzaW9uTGlzdGVuZXJbMF07CisgICAgICAgIHN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7CisgICAgICAgICAgICBsaXN0ID0gKFNlc3Npb25MaXN0ZW5lcltdKSBsaXN0ZW5lcnMudG9BcnJheShsaXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgKChTZXNzaW9uTGlzdGVuZXIpIGxpc3RbaV0pLnNlc3Npb25FdmVudChldmVudCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIGN1cnJlbnRseSBkZWZpbmVkIHNlc3Npb24gYXR0cmlidXRlcyBhcyBhbiBhcnJheQorICAgICAqIG9mIFN0cmluZ3MuIElmIHRoZXJlIGFyZSBubyBkZWZpbmVkIGF0dHJpYnV0ZXMsIGEgemVyby1sZW5ndGggYXJyYXkgaXMKKyAgICAgKiByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10ga2V5cygpIHsKKyAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pIGF0dHJpYnV0ZXMua2V5U2V0KCkudG9BcnJheShFTVBUWV9BUlJBWSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlIHdpdGhvdXQgYSBjaGVjayBmb3IgdmFsaWRpdHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRBdHRyaWJ1dGVJbnRlcm5hbChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gKGF0dHJpYnV0ZXMuZ2V0KG5hbWUpKTsgIAorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUF0dHJpYnV0ZUludGVybmFsKFN0cmluZyBuYW1lLCBib29sZWFuIG5vdGlmeSwKKyAgICAgICAgICAgIGJvb2xlYW4gYWRkRGVsdGFSZXF1ZXN0KSB7CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoaXMgYXR0cmlidXRlIGZyb20gb3VyIGNvbGxlY3Rpb24KKyAgICAgICAgT2JqZWN0IHZhbHVlID0gYXR0cmlidXRlcy5yZW1vdmUobmFtZSk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChhZGREZWx0YVJlcXVlc3QgJiYgKGRlbHRhUmVxdWVzdCAhPSBudWxsKSkKKyAgICAgICAgICAgIGRlbHRhUmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisKKyAgICAgICAgLy8gRG8gd2UgbmVlZCB0byBkbyB2YWx1ZVVuYm91bmQoKSBhbmQgYXR0cmlidXRlUmVtb3ZlZCgpIG5vdGlmaWNhdGlvbj8KKyAgICAgICAgaWYgKCFub3RpZnkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbGwgdGhlIHZhbHVlVW5ib3VuZCgpIG1ldGhvZCBpZiBuZWNlc3NhcnkKKyAgICAgICAgIEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50ID0gbnVsbDsKKyAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyKSB7CisgICAgICAgICAgICBldmVudCA9IG5ldyBIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCgKKyAgICAgICAgICAgICAgICAoSHR0cFNlc3Npb24pIGdldFNlc3Npb24oKSwgbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyKSB2YWx1ZSkudmFsdWVVbmJvdW5kKGV2ZW50KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5lcnJvcgorICAgICAgICAgICAgICAgICAgICAoc21wLmdldFN0cmluZygiZGVsdGFTZXNzaW9uLnZhbHVlVW5ib3VuZC5leCIpLCB4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBOb3RpZnkgaW50ZXJlc3RlZCBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIE9iamVjdCBsaXN0ZW5lcnNbXSA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25FdmVudExpc3RlbmVycygpOworICAgICAgICAgICAgaWYgKGxpc3RlbmVycyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCEobGlzdGVuZXJzW2ldIGluc3RhbmNlb2YgSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcikpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTZXNzaW9uQXR0cmlidXRlUmVtb3ZlZCIsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldFNlc3Npb24oKSwgbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmF0dHJpYnV0ZVJlbW92ZWQoZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwgImFmdGVyU2Vzc2lvbkF0dHJpYnV0ZVJlbW92ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclNlc3Npb25BdHRyaWJ1dGVSZW1vdmVkIiwgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5hdHRyaWJ1dGVFdmVudCIpLHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJvdGVjdGVkIGxvbmcgZ2V0TGFzdFRpbWVSZXBsaWNhdGVkKCkgeworICAgICAgICByZXR1cm4gbGFzdFRpbWVSZXBsaWNhdGVkOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldExhc3RUaW1lUmVwbGljYXRlZChsb25nIGxhc3RUaW1lUmVwbGljYXRlZCkgeworICAgICAgICB0aGlzLmxhc3RUaW1lUmVwbGljYXRlZCA9IGxhc3RUaW1lUmVwbGljYXRlZDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBY2Nlc3NDb3VudChpbnQgYWNjZXNzQ291bnQpIHsKKyAgICAgICAgdGhpcy5hY2Nlc3NDb3VudCA9IGFjY2Vzc0NvdW50OworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0QWNjZXNzQ291bnQoKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3NDb3VudDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFeHBpcmVUb2xlcmFuY2UoaW50IGV4cGlyZVRvbGVyYW5jZSkgeworICAgICAgICB0aGlzLmV4cGlyZVRvbGVyYW5jZSA9IGV4cGlyZVRvbGVyYW5jZTsKKyAgICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgaW50IGdldEV4cGlyZVRvbGVyYW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIGV4cGlyZVRvbGVyYW5jZTsKKyAgICB9CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBDbGFzcworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBkdW1teSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+SHR0cFNlc3Npb25Db250ZXh0PC9jb2RlPgorICogaW50ZXJmYWNlLCB0byBjb25mb3JtIHRvIHRoZSByZXF1aXJlbWVudCB0aGF0IHN1Y2ggYW4gb2JqZWN0IGJlIHJldHVybmVkIHdoZW4KKyAqIDxjb2RlPkh0dHBTZXNzaW9uLmdldFNlc3Npb25Db250ZXh0KCk8L2NvZGU+IGlzIGNhbGxlZC4KKyAqIAorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiAKKyAqIEBkZXByZWNhdGVkIEFzIG9mIEphdmEgU2VydmxldCBBUEkgMi4xIHdpdGggbm8gcmVwbGFjZW1lbnQuIFRoZSBpbnRlcmZhY2UKKyAqICAgICAgICAgICAgIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoaXMgQVBJLgorICovCisKK2ZpbmFsIGNsYXNzIFN0YW5kYXJkU2Vzc2lvbkNvbnRleHQgaW1wbGVtZW50cyBIdHRwU2Vzc2lvbkNvbnRleHQgeworCisgICAgcHJpdmF0ZSBIYXNoTWFwIGR1bW15ID0gbmV3IEhhc2hNYXAoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2Vzc2lvbiBpZGVudGlmaWVycyBvZiBhbGwgc2Vzc2lvbnMgZGVmaW5lZCB3aXRoaW4gdGhpcworICAgICAqIGNvbnRleHQuCisgICAgICogCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgSmF2YSBTZXJ2bGV0IEFQSSAyLjEgd2l0aCBubyByZXBsYWNlbWVudC4gVGhpcyBtZXRob2QKKyAgICAgKiAgICAgICAgICAgICBtdXN0IHJldHVybiBhbiBlbXB0eSA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gYW5kIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgdGhlIEFQSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SWRzKCkgeworCisgICAgICAgIHJldHVybiAobmV3IEVudW1lcmF0b3IoZHVtbXkpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgPGNvZGU+SHR0cFNlc3Npb248L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogc2Vzc2lvbiBpZGVudGlmaWVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpZAorICAgICAqICAgICAgICAgICAgU2Vzc2lvbiBpZGVudGlmaWVyIGZvciB3aGljaCB0byBsb29rIHVwIGEgc2Vzc2lvbgorICAgICAqIAorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIEphdmEgU2VydmxldCBBUEkgMi4xIHdpdGggbm8gcmVwbGFjZW1lbnQuIFRoaXMgbWV0aG9kCisgICAgICogICAgICAgICAgICAgbXVzdCByZXR1cm4gbnVsbCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YKKyAgICAgKiAgICAgICAgICAgICB0aGUgQVBJLgorICAgICAqLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKFN0cmluZyBpZCkgeworCisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0RlbHRhU2Vzc2lvbkZhY2FkZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vRGVsdGFTZXNzaW9uRmFjYWRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY5M2QzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0RlbHRhU2Vzc2lvbkZhY2FkZS5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uOworCisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25Db250ZXh0OworCisKKy8qKgorICogRmFjYWRlIGZvciB0aGUgRGVsdGFTZXNzaW9uIG9iamVjdC4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBEZWx0YVNlc3Npb25GYWNhZGUKKyAgICBpbXBsZW1lbnRzIEh0dHBTZXNzaW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzZXNzaW9uIGZhY2FkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVsdGFTZXNzaW9uRmFjYWRlKERlbHRhU2Vzc2lvbiBzZXNzaW9uKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuc2Vzc2lvbiA9IChIdHRwU2Vzc2lvbikgc2Vzc2lvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzZXNzaW9uIGZhY2FkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVsdGFTZXNzaW9uRmFjYWRlKEh0dHBTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVkIHNlc3Npb24gb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSHR0cFNlc3Npb24gTWV0aG9kcworCisKKyAgICBwdWJsaWMgbG9uZyBnZXRDcmVhdGlvblRpbWUoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uLmdldENyZWF0aW9uVGltZSgpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0SWQoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBsb25nIGdldExhc3RBY2Nlc3NlZFRpbWUoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKKyAgICAgICAgLy8gRklYTUUgOiBGYWNhZGUgdGhpcyBvYmplY3QgPworICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0TWF4SW5hY3RpdmVJbnRlcnZhbChpbnQgaW50ZXJ2YWwpIHsKKyAgICAgICAgc2Vzc2lvbi5zZXRNYXhJbmFjdGl2ZUludGVydmFsKGludGVydmFsKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpOworICAgIH0KKworCisgICAgcHVibGljIEh0dHBTZXNzaW9uQ29udGV4dCBnZXRTZXNzaW9uQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0U2Vzc2lvbkNvbnRleHQoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uLmdldEF0dHJpYnV0ZShuYW1lKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0QXR0cmlidXRlKG5hbWUpOworICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeworICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlTmFtZXMoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uLmdldFZhbHVlTmFtZXMoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVmFsdWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICBzZXNzaW9uLmludmFsaWRhdGUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzTmV3KCkgeworICAgICAgICByZXR1cm4gc2Vzc2lvbi5pc05ldygpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9Kdm1Sb3V0ZUJpbmRlclZhbHZlLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9Kdm1Sb3V0ZUJpbmRlclZhbHZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNlMTE0NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0p2bVJvdXRlQmluZGVyVmFsdmUuamF2YQpAQCAtMCwwICsxLDU0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DYXRhbGluYUNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLk1hbmFnZXJCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5MaWZlY3ljbGVTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlZhbHZlQmFzZTsKKworLyoqCisgKiBWYWx2ZSB0byBoYW5kbGUgVG9tY2F0IGp2bVJvdXRlIHRha2VvdmVyIHVzaW5nIG1vZF9qayBtb2R1bGUgYWZ0ZXIgbm9kZQorICogZmFpbHVyZS4gQWZ0ZXIgYSBub2RlIGNyYXNoZWQgdGhlIG5leHQgcmVxdWVzdCBnb2luZyB0byBvdGhlciBjbHVzdGVyIG5vZGUuCisgKiBOb3cgdGhlIGFuc3dlcmluZyBmcm9tIGFwYWNoZSBpcyBzbG93ZXIgKCBtYWtlIHNvbWUgZXJyb3IgaGFuZHNoYWtpbmcuIFZlcnkKKyAqIGJhZCB3aXRoIGFwYWNoZSBhdCBteSB3aW5kb3dzLikuIFdlIHJld3JpdGUgbm93IHRoZSBqc2Vzc2lvbmlkCisgKiBpbmZvcm1hdGlvbiB0byB0aGUgYmFja3VwIGNsdXN0ZXIgbm9kZS4gQWZ0ZXIgdGhlIG5leHQgcmVzcG9uc2UgYWxsIGNsaWVudAorICogcmVxdWVzdCBnb2VzIGRpcmVjdCB0byB0aGUgYmFja3VwIG5vZGUuIFRoZSBjaGFuZ2Ugc2Vzc2lvbmlkIHNlbmQgYWxzbyB0byBhbGwKKyAqIG90aGVyIGNsdXN0ZXIgbm9kZXMuIFdlbGwsIG5vdyB0aGUgc2Vzc2lvbiBzdGlja3luZXNzIHdvcmsgZGlyZWN0bHkgdG8gdGhlCisgKiBiYWNrdXAgbm9kZSBhbmQgdHJhZmZpYyBkb24ndCBnbyBiYWNrIHRvbyByZXN0YXJ0ZWQgY2x1c3RlciBub2RlcyEKKyAqIEFzIGpzZXNzaW9uaWQgd2FzIGNyZWF0ZWQgYnkgY29va2llLCB0aGUgY2hhbmdlIEpTRVNTSU9OSUQgY29va2llIHJlc2VuZCB3aXRoIG5leHQgcmVzcG9uc2UuCisgKiAgCisgKiBBdCBhbGwgY2x1c3RlciBub2RlIHlvdSBtdXN0IGNvbmZpZ3VyZSB0aGUgYXMgQ2x1c3Rlckxpc3RlbmVyIHNpbmNlIDUuNS4xMAorICoge0BsaW5rIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uLkp2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXIgSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lcn0KKyAqIG9yIGJlZm9yZSB3aXRoCisgKiBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5Kdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyTGlmZWN5Y2xlLgorICogCisgKiBBZGQgdGhpcyBWYWx2ZSB0byB5b3VyIGhvc3QgZGVmaW5pdGlvbiBhdCBjb25mL3NlcnZlci54bWwgLgorICogCisgKiBTaW5jZSA1LjUuMTAgYXMgZGlyZWN0IGNsdXN0ZXIgdmFsdmU6PGJyLz4KKyAqIDxwcmU+CisgKiAgJmx0O0NsdXN0ZXImZ3Q7CisgKiAgJmx0O1ZhbHZlIGNsYXNzTmFtZT0mcXVvdDtvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5Kdm1Sb3V0ZUJpbmRlclZhbHZlJnF1b3Q7IC8mZ3Q7ICAKKyAqICAmbHQ7L0NsdXN0ZXImZ3Q7CisgKiA8L3ByZT4KKyAqIDxiciAvPgorICogQmVmb3JlIDUuNS4xMCBhcyBIb3N0IGVsZW1lbnQ6PGJyLz4KKyAqIDxwcmU+CisgKiAgJmx0O0hvc3RyJmd0OworICogICZsdDtWYWx2ZSBjbGFzc05hbWU9JnF1b3Q7b3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uSnZtUm91dGVCaW5kZXJWYWx2ZSZxdW90OyAvJmd0OyAgCisgKiAgJmx0Oy9Ib3N0ciZndDsKKyAqIDwvcHJlPgorICogCisgKiBUcmljazo8YnIvPgorICogWW91IGNhbiBlbmFibGUgdGhpcyBtb2RfamsgdHVybm92ZXIgbW9kZSB2aWEgSk1YIGJlZm9yZSB5b3UgZHJvcCBhIG5vZGUgdG8gYWxsIGJhY2t1cCBub2RlcyEKKyAqIFNldCBlbmFibGUgdHJ1ZSBvbiBhbGwgSnZtUm91dGVCaW5kZXJWYWx2ZSBiYWNrdXBzLCBkaXNhYmxlIHdvcmtlciBhdCBtb2RfamsgCisgKiBhbmQgdGhlbiBkcm9wIG5vZGUgYW5kIHJlc3RhcnQgaXQhIFRoZW4gZW5hYmxlIG1vZF9qayBXb3JrZXIgYW5kIGRpc2FibGUgSnZtUm91dGVCaW5kZXJWYWx2ZXMgYWdhaW4uIAorICogVGhpcyB1c2UgY2FzZSBtZWFucyB0aGF0IG9ubHkgcmVxdWVzdGVkIHNlc3Npb24gYXJlIG1pZ3JhdGVkLgorICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgSnZtUm91dGVCaW5kZXJWYWx2ZSBleHRlbmRzIFZhbHZlQmFzZSBpbXBsZW1lbnRzIENsdXN0ZXJWYWx2ZSwgTGlmZWN5Y2xlIHsKKworICAgIC8qLS1TdGF0aWMgVmFyaWFibGVzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeQorICAgICAgICAgICAgLmdldExvZyhKdm1Sb3V0ZUJpbmRlclZhbHZlLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uSnZtUm91dGVCaW5kZXJWYWx2ZS8xLjMiOworCisgICAgLyotLUluc3RhbmNlIFZhcmlhYmxlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qKgorICAgICAqIHRoZSBjbHVzdGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIENhdGFsaW5hQ2x1c3RlciBjbHVzdGVyOworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ01hbmFnZXIgc20gPSBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZCB5ZXQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogZW5hYmxlZCB0aGlzIGNvbXBvbmVudAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGVuYWJsZWQgPSB0cnVlOworCisgICAgLyoqCisgICAgICogbnVtYmVyIG9mIHNlc3Npb24gdGhhdCBubyBhdCB0aGlzIHRvbWNhdCBpbnN0YW56IGhvc3RlZAorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIG51bWJlck9mU2Vzc2lvbnMgPSAwOworCisgICAgcHJvdGVjdGVkIFN0cmluZyBzZXNzaW9uSWRBdHRyaWJ1dGUgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uSnZtUm91dGVPcmlnbmFsU2Vzc2lvbklEIjsKKworICAgIC8qKgorICAgICAqIFRoZSBsaWZlY3ljbGUgZXZlbnQgc3VwcG9ydCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIExpZmVjeWNsZVN1cHBvcnQgbGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZVN1cHBvcnQodGhpcyk7CisKKyAgICAvKi0tTG9naWMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgc2Vzc2lvbiBpZCBhdHRyaWJ1dGUgdG8gZmFpbGVkIG5vZGUgZm9yIHJlcXVlc3QuCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXNzaW9uSWRBdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSWRBdHRyaWJ1dGUoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uSWRBdHRyaWJ1dGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IG5hbWUgb2YgZmFpbGVkIHJlcWV1c3Qgc2Vzc2lvbiBhdHRyaWJ1dGUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbklkQXR0cmlidXRlCisgICAgICogICAgICAgICAgICBUaGUgc2Vzc2lvbklkQXR0cmlidXRlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uSWRBdHRyaWJ1dGUoU3RyaW5nIHNlc3Npb25JZEF0dHJpYnV0ZSkgeworICAgICAgICB0aGlzLnNlc3Npb25JZEF0dHJpYnV0ZSA9IHNlc3Npb25JZEF0dHJpYnV0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG51bWJlciBvZiBtaWdyYXRlZCBzZXNzaW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXROdW1iZXJPZlNlc3Npb25zKCkgeworICAgICAgICByZXR1cm4gbnVtYmVyT2ZTZXNzaW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIGVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGVuYWJsZWQKKyAgICAgKiAgICAgICAgICAgIFRoZSBlbmFibGVkIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVjdCBwb3NzaWJsZSB0aGUgSlZNUm91dGUgY2hhbmdlIGF0IGNsdXN0ZXIgYmFja3VwIG5vZGUuLgorICAgICAqIAorICAgICAqIEBwYXJhbSByZXF1ZXN0CisgICAgICogICAgICAgICAgICB0b21jYXQgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UKKyAgICAgKiAgICAgICAgICAgIHRvbWNhdCByZXNwb25zZSBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIGhhcyBvY2N1cnJlZAorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGEgc2VydmxldCBlcnJvciBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZva2UoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgIGlmIChnZXRFbmFibGVkKCkgCisgICAgICAgICAgICAgJiYgZ2V0Q2x1c3RlcigpICE9IG51bGwKKyAgICAgICAgICAgICAmJiByZXF1ZXN0LmdldENvbnRleHQoKSAhPSBudWxsCisgICAgICAgICAgICAgJiYgcmVxdWVzdC5nZXRDb250ZXh0KCkuZ2V0RGlzdHJpYnV0YWJsZSgpICkgeworICAgICAgICAgICAgIC8vIHZhbHZlIGNsdXN0ZXIgY2FuIGFjY2VzcyBtYW5hZ2VyIC0gb3RoZXIgY2x1c3RlciBoYW5kbGUgdHVybm92ZXIgCisgICAgICAgICAgICAgLy8gYXQgaG9zdCBsZXZlbCAtIGhvcGVmdWxseSEKKyAgICAgICAgICAgICBNYW5hZ2VyIG1hbmFnZXIgPSByZXF1ZXN0LmdldENvbnRleHQoKS5nZXRNYW5hZ2VyKCk7CisgICAgICAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCAmJiBtYW5hZ2VyIGluc3RhbmNlb2YgQ2x1c3Rlck1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICYmIGdldENsdXN0ZXIoKS5nZXRNYW5hZ2VyKCgoQ2x1c3Rlck1hbmFnZXIpbWFuYWdlcikuZ2V0TmFtZSgpKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICBoYW5kbGVQb3NzaWJsZVR1cm5vdmVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBQYXNzIHRoaXMgcmVxdWVzdCBvbiB0byB0aGUgbmV4dCB2YWx2ZSBpbiBvdXIgcGlwZWxpbmUKKyAgICAgICAgZ2V0TmV4dCgpLmludm9rZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFuZGxlIHBvc3NpYmxlIHNlc3Npb24gdHVybiBvdmVyLgorICAgICAqIAorICAgICAqIEBzZWUgSnZtUm91dGVCaW5kZXJWYWx2ZSNoYW5kbGVKdm1Sb3V0ZShSZXF1ZXN0LCBSZXNwb25zZSwgU3RyaW5nLCBTdHJpbmcpCisgICAgICogQHBhcmFtIHJlcXVlc3QgY3VycmVudCByZXF1ZXN0CisgICAgICogQHBhcmFtIHJlc3BvbnNlIGN1cnJlbnQgcmVzcG9uc2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQb3NzaWJsZVR1cm5vdmVyKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwoZmFsc2UpOworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBsb25nIHQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBTdHJpbmcganZtUm91dGUgPSBnZXRMb2NhbEp2bVJvdXRlKHJlcXVlc3QpOworICAgICAgICAgICAgaWYgKGp2bVJvdXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS5taXNzaW5nSnZtUm91dGVBdHRyaWJ1dGUiKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFuZGxlSnZtUm91dGUoIHJlcXVlc3QsIHJlc3BvbnNlLHNlc3Npb24uZ2V0SWRJbnRlcm5hbCgpLCBqdm1Sb3V0ZSk7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgbG9uZyB0aW1lID0gdDIgLSB0MTsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS50dXJub3ZlckluZm8iLCBuZXcgTG9uZyh0aW1lKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGp2bXJvdXRlIGZyb20gZW5naW5lCisgICAgICogCisgICAgICogQHBhcmFtIHJlcXVlc3QgY3VycmVudCByZXF1ZXN0CisgICAgICogQHJldHVybiByZXR1cm4ganZtUm91dGUgZnJvbSBNYW5hZ2VyQmFzZSBvciBudWxsCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhbEp2bVJvdXRlKFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNYW5hZ2VyKHJlcXVlc3QpOworICAgICAgICBpZihtYW5hZ2VyIGluc3RhbmNlb2YgTWFuYWdlckJhc2UpCisgICAgICAgICAgICByZXR1cm4gKChNYW5hZ2VyQmFzZSkgbWFuYWdlcikuZ2V0SnZtUm91dGUoKTsKKyAgICAgICAgcmV0dXJuIG51bGwgOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBDbHVzdGVyIERlbHRhTWFuYWdlcgorICAgICAqIAorICAgICAqIEBwYXJhbSByZXF1ZXN0IGN1cnJlbnQgcmVxdWVzdAorICAgICAqIEByZXR1cm4gbWFuYWdlciBvciBudWxsCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hbmFnZXIgZ2V0TWFuYWdlcihSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgTWFuYWdlciBtYW5hZ2VyID0gcmVxdWVzdC5nZXRDb250ZXh0KCkuZ2V0TWFuYWdlcigpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmKG1hbmFnZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS5mb3VuZE1hbmFnZXIiLCBtYW5hZ2VyLCAgcmVxdWVzdC5nZXRDb250ZXh0KCkuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImp2bVJvdXRlLm5vdEZvdW5kTWFuYWdlciIsIG1hbmFnZXIsICByZXF1ZXN0LmdldENvbnRleHQoKS5nZXROYW1lKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWFuYWdlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsdXN0ZXIuCisgICAgICovCisgICAgcHVibGljIENhdGFsaW5hQ2x1c3RlciBnZXRDbHVzdGVyKCkgeworICAgICAgICByZXR1cm4gY2x1c3RlcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIGNsdXN0ZXIgVGhlIGNsdXN0ZXIgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXIoQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIpIHsKKyAgICAgICAgdGhpcy5jbHVzdGVyID0gY2x1c3RlcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSGFuZGxlIGp2bVJvdXRlIHN0aWNreW5lc3MgYWZ0ZXIgdG9tY2F0IGluc3RhbmNlIGZhaWxlZC4gQWZ0ZXIgdGhpcworICAgICAqIGNvcnJlY3Rpb24gYSBuZXcgQ29va2llIHNlbmQgdG8gY2xpZW50IHdpdGggbmV3IGp2bVJvdXRlIGFuZCB0aGUKKyAgICAgKiBTZXNzaW9uSUQgY2hhbmdlIHByb3BhZ2UgdG8gdGhlIG90aGVyIGNsdXN0ZXIgbm9kZXMuCisgICAgICogCisgICAgICogQHBhcmFtIHJlcXVlc3QgY3VycmVudCByZXF1ZXN0CisgICAgICogQHBhcmFtIHJlc3BvbnNlCisgICAgICogICAgICAgICAgICBUb21jYXQgUmVzcG9uc2UKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbklkCisgICAgICogICAgICAgICAgICByZXF1ZXN0IFNlc3Npb25JRCBmcm9tIENvb2tpZQorICAgICAqIEBwYXJhbSBsb2NhbEp2bVJvdXRlCisgICAgICogICAgICAgICAgICBsb2NhbCBqdm1Sb3V0ZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUp2bVJvdXRlKAorICAgICAgICAgICAgUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSxTdHJpbmcgc2Vzc2lvbklkLCBTdHJpbmcgbG9jYWxKdm1Sb3V0ZSkgeworICAgICAgICAvLyBnZXQgcmVxdWVzdGVkIGp2bVJvdXRlLgorICAgICAgICBTdHJpbmcgcmVxdWVzdEp2bVJvdXRlID0gbnVsbDsKKyAgICAgICAgaW50IGluZGV4ID0gc2Vzc2lvbklkLmluZGV4T2YoIi4iKTsKKyAgICAgICAgaWYgKGluZGV4ID4gMCkgeworICAgICAgICAgICAgcmVxdWVzdEp2bVJvdXRlID0gc2Vzc2lvbklkCisgICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoaW5kZXggKyAxLCBzZXNzaW9uSWQubGVuZ3RoKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXF1ZXN0SnZtUm91dGUgIT0gbnVsbCAmJiAhcmVxdWVzdEp2bVJvdXRlLmVxdWFscyhsb2NhbEp2bVJvdXRlKSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygianZtUm91dGUuZmFpbG92ZXIiLCByZXF1ZXN0SnZtUm91dGUsCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbEp2bVJvdXRlLCBzZXNzaW9uSWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE9LIC0gdHVybm92ZXIgdGhlIHNlc3Npb24gPworICAgICAgICAgICAgU3RyaW5nIG5ld1Nlc3Npb25JRCA9IHNlc3Npb25JZC5zdWJzdHJpbmcoMCwgaW5kZXgpICsgIi4iCisgICAgICAgICAgICAgICAgICAgICsgbG9jYWxKdm1Sb3V0ZTsKKyAgICAgICAgICAgIFNlc3Npb24gY2F0YWxpbmFTZXNzaW9uID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2F0YWxpbmFTZXNzaW9uID0gZ2V0TWFuYWdlcihyZXF1ZXN0KS5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEh1cHMhCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2F0YWxpbmFTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjaGFuZ2VTZXNzaW9uSUQocmVxdWVzdCwgcmVzcG9uc2UsIHNlc3Npb25JZCwgbmV3U2Vzc2lvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgY2F0YWxpbmFTZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBudW1iZXJPZlNlc3Npb25zKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS5jYW5ub3RGaW5kU2Vzc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY2hhbmdlIHNlc3Npb24gaWQgYW5kIHNlbmQgdG8gYWxsIGNsdXN0ZXIgbm9kZXMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBjdXJyZW50IHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgY3VycmVudCByZXNwb25zZQorICAgICAqIEBwYXJhbSBzZXNzaW9uSWQKKyAgICAgKiAgICAgICAgICAgIG9yaWdpbmFsIHNlc3Npb24gaWQKKyAgICAgKiBAcGFyYW0gbmV3U2Vzc2lvbklECisgICAgICogICAgICAgICAgICBuZXcgc2Vzc2lvbiBpZCBmb3Igbm9kZSBtaWdyYXRpb24KKyAgICAgKiBAcGFyYW0gY2F0YWxpbmFTZXNzaW9uCisgICAgICogICAgICAgICAgICBjdXJyZW50IHNlc3Npb24gd2l0aCBvcmlnaW5hbCBzZXNzaW9uIGlkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlU2Vzc2lvbklEKFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgc2Vzc2lvbklkLCBTdHJpbmcgbmV3U2Vzc2lvbklELCBTZXNzaW9uIGNhdGFsaW5hU2Vzc2lvbikgeworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KCJCZWZvcmUgc2Vzc2lvbiBtaWdyYXRpb24iLAorICAgICAgICAgICAgICAgIGNhdGFsaW5hU2Vzc2lvbik7CisgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdGVkU2Vzc2lvbklkKG5ld1Nlc3Npb25JRCk7CisgICAgICAgIGNhdGFsaW5hU2Vzc2lvbi5zZXRJZChuZXdTZXNzaW9uSUQpOworICAgICAgICBpZiAoY2F0YWxpbmFTZXNzaW9uIGluc3RhbmNlb2YgRGVsdGFTZXNzaW9uKQorICAgICAgICAgICAgKChEZWx0YVNlc3Npb24pIGNhdGFsaW5hU2Vzc2lvbikucmVzZXREZWx0YVJlcXVlc3QoKTsKKyAgICAgICAgaWYocmVxdWVzdC5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKSkKKyAgICAgICAgICAgIHNldE5ld1Nlc3Npb25Db29raWUocmVxdWVzdCwgcmVzcG9uc2UsbmV3U2Vzc2lvbklEKTsKKyAgICAgICAgLy8gc2V0IG9yZ2luYWwgc2Vzc2lvbmlkIGF0IHJlcXVlc3QsIHRvIGFsbG93IGFwcGxpY2F0aW9uIGRldGVjdCB0aGUKKyAgICAgICAgLy8gY2hhbmdlCisgICAgICAgIGlmIChzZXNzaW9uSWRBdHRyaWJ1dGUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHNlc3Npb25JZEF0dHJpYnV0ZSkpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImp2bVJvdXRlLnNldC5vcmlnbmFsc2Vzc2lvbmlkIixzZXNzaW9uSWRBdHRyaWJ1dGUsc2Vzc2lvbklkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShzZXNzaW9uSWRBdHRyaWJ1dGUsIHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gbm93IHNlbmRpbmcgdGhlIGNoYW5nZSB0byBhbGwgb3RoZXIgY2x1c3Rlcm5vZGUhCisgICAgICAgIENsdXN0ZXJNYW5hZ2VyIG1hbmFnZXIgPSAoQ2x1c3Rlck1hbmFnZXIpY2F0YWxpbmFTZXNzaW9uLmdldE1hbmFnZXIoKTsKKyAgICAgICAgc2VuZFNlc3Npb25JRENsdXN0ZXJCYWNrdXAobWFuYWdlcixyZXF1ZXN0LHNlc3Npb25JZCwgbmV3U2Vzc2lvbklEKTsKKyAgICAgICAgbGlmZWN5Y2xlCisgICAgICAgICAgICAgICAgLmZpcmVMaWZlY3ljbGVFdmVudCgiQWZ0ZXIgc2Vzc2lvbiBtaWdyYXRpb24iLCBjYXRhbGluYVNlc3Npb24pOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImp2bVJvdXRlLmNoYW5nZVNlc3Npb24iLCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgIG5ld1Nlc3Npb25JRCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCB0aGUgY2hhbmdlZCBTZXNzaW9uaWQgdG8gYWxsIGNsdXN0ZXJub2Rlcy4KKyAgICAgKiAKKyAgICAgKiBAc2VlIEp2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXIjbWVzc2FnZVJlY2VpdmVkKENsdXN0ZXJNZXNzYWdlKQorICAgICAqIEBwYXJhbSBtYW5hZ2VyCisgICAgICogICAgICAgICAgICBDbHVzdGVyTWFuYWdlcgorICAgICAqIEBwYXJhbSBzZXNzaW9uSWQKKyAgICAgKiAgICAgICAgICAgIGN1cnJlbnQgZmFpbGVkIHNlc3Npb25pZAorICAgICAqIEBwYXJhbSBuZXdTZXNzaW9uSUQKKyAgICAgKiAgICAgICAgICAgIG5ldyBzZXNzaW9uIGlkLCBiaW5kIHRvIHRoZSBuZXcgY2x1c3RlciBub2RlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2VuZFNlc3Npb25JRENsdXN0ZXJCYWNrdXAoQ2x1c3Rlck1hbmFnZXIgbWFuYWdlcixSZXF1ZXN0IHJlcXVlc3QsU3RyaW5nIHNlc3Npb25JZCwKKyAgICAgICAgICAgIFN0cmluZyBuZXdTZXNzaW9uSUQpIHsKKyAgICAgICAgU2Vzc2lvbklETWVzc2FnZSBtc2cgPSBuZXcgU2Vzc2lvbklETWVzc2FnZSgpOworICAgICAgICBtc2cuc2V0T3JpZ25hbFNlc3Npb25JRChzZXNzaW9uSWQpOworICAgICAgICBtc2cuc2V0QmFja3VwU2Vzc2lvbklEKG5ld1Nlc3Npb25JRCk7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0Q29udGV4dCgpOworICAgICAgICBtc2cuc2V0Q29udGV4dFBhdGgoY29udGV4dC5nZXRQYXRoKCkpOworICAgICAgICBtc2cuc2V0SG9zdChjb250ZXh0LmdldFBhcmVudCgpLmdldE5hbWUoKSk7CisgICAgICAgIGlmKG1hbmFnZXIuaXNTZW5kQ2x1c3RlckRvbWFpbk9ubHkoKSkKKyAgICAgICAgICAgIGNsdXN0ZXIuc2VuZENsdXN0ZXJEb21haW4obXNnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY2x1c3Rlci5zZW5kKG1zZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIG5ldyBjb29raWUgZm9yIHRoZSBnaXZlbiBzZXNzaW9uIGlkIGFuZCByZXNwb25zZSBhbmQgc2VlCisgICAgICoge0BsaW5rIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3QjY29uZmlndXJlU2Vzc2lvbkNvb2tpZShqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llKX0KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBjdXJyZW50IHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVG9tY2F0IFJlc3BvbnNlCisgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldE5ld1Nlc3Npb25Db29raWUoUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UsIFN0cmluZyBzZXNzaW9uSWQpIHsKKyAgICAgICAgaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0Q29va2llcygpKSB7CisgICAgICAgICAgICAgICAgLy8gc2V0IGEgbmV3IHNlc3Npb24gY29va2llCisgICAgICAgICAgICAgICAgQ29va2llIG5ld0Nvb2tpZSA9IG5ldyBDb29raWUoR2xvYmFscy5TRVNTSU9OX0NPT0tJRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBuZXdDb29raWUuc2V0TWF4QWdlKC0xKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSBudWxsOworICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UuZ2V0Q29ubmVjdG9yKCkuZ2V0RW1wdHlTZXNzaW9uUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY29udGV4dCAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0UGF0aCA9IGNvbnRleHQuZ2V0RW5jb2RlZFBhdGgoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChjb250ZXh0UGF0aCAhPSBudWxsKSAmJiAoY29udGV4dFBhdGgubGVuZ3RoKCkgPiAwKSkgeworICAgICAgICAgICAgICAgICAgICBuZXdDb29raWUuc2V0UGF0aChjb250ZXh0UGF0aCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3Q29va2llLnNldFBhdGgoIi8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QuaXNTZWN1cmUoKSkgeworICAgICAgICAgICAgICAgICAgICBuZXdDb29raWUuc2V0U2VjdXJlKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygianZtUm91dGUubmV3U2Vzc2lvbkNvb2tpZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBHbG9iYWxzLlNFU1NJT05fQ09PS0lFX05BTUUsIG5ld0Nvb2tpZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhdGgoKSwgbmV3IEJvb2xlYW4obmV3Q29va2llCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VjdXJlKCkpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZENvb2tpZShuZXdDb29raWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcworICAgICAqIExpZmVjeWNsZSBoYXMgbm8gbGlzdGVuZXJzIHJlZ2lzdGVyZWQsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUxpc3RlbmVyW10gZmluZExpZmVjeWNsZUxpc3RlbmVycygpIHsKKworICAgICAgICByZXR1cm4gbGlmZWN5Y2xlLmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBsaXN0ZW5lcgorICAgICAqICAgICAgICAgICAgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLnJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciA8Y29kZT5jb25maWd1cmUoKTwvY29kZT4sCisgICAgICogYW5kIGJlZm9yZSBhbnkgb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoZSBjb21wb25lbnQgYXJlIHV0aWxpemVkLgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yIHRoYXQgcHJldmVudHMgdGhpcworICAgICAqICAgICAgICAgICAgICAgIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmIChzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbihzbQorICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJqdm1Sb3V0ZS52YWx2ZS5hbHJlYWR5U3RhcnRlZCIpKTsKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCwgbnVsbCk7CisgICAgICAgIHN0YXJ0ZWQgPSB0cnVlOworICAgICAgICBpZiAoY2x1c3RlciA9PSBudWxsKSB7CisgICAgICAgICAgICBDb250YWluZXIgaG9zdENvbnRhaW5lciA9IGdldENvbnRhaW5lcigpOworICAgICAgICAgICAgLy8gY29tcGF0aWJpbGl0eSB3aXRoIEp2bVJvdXRlQmluZGVyVmFsdmUgdmVyc2lvbiAxLjEKKyAgICAgICAgICAgIC8vICggc2V0dXAgYXQgY29udGV4dC54bWwgb3IgY29udGV4dC54bWwuZGVmYXVsdCApCisgICAgICAgICAgICBpZiAoIShob3N0Q29udGFpbmVyIGluc3RhbmNlb2YgSG9zdCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS5jb25maWd1cmUud2FybiIpKTsKKyAgICAgICAgICAgICAgICBob3N0Q29udGFpbmVyID0gaG9zdENvbnRhaW5lci5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChob3N0Q29udGFpbmVyIGluc3RhbmNlb2YgSG9zdAorICAgICAgICAgICAgICAgICAgICAmJiAoKEhvc3QpIGhvc3RDb250YWluZXIpLmdldENsdXN0ZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2x1c3RlciA9IChDYXRhbGluYUNsdXN0ZXIpICgoSG9zdCkgaG9zdENvbnRhaW5lcikuZ2V0Q2x1c3RlcigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDb250YWluZXIgZW5naW5lID0gaG9zdENvbnRhaW5lci5nZXRQYXJlbnQoKSA7CisgICAgICAgICAgICAgICAgaWYgKGVuZ2luZSBpbnN0YW5jZW9mIEVuZ2luZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChFbmdpbmUpIGVuZ2luZSkuZ2V0Q2x1c3RlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2x1c3RlciA9IChDYXRhbGluYUNsdXN0ZXIpICgoRW5naW5lKSBlbmdpbmUpLmdldENsdXN0ZXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsdXN0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIGNsdXN0ZXJpbmcgc3VwcG9ydCBhdCBjb250YWluZXIgIgorICAgICAgICAgICAgICAgICAgICArIGNvbnRhaW5lci5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygianZtUm91dGUudmFsdmUuc3RhcnRlZCIpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgdGVybWluYXRlIHRoZSBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzCisgICAgICogY29tcG9uZW50LiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdGhlIGxhc3Qgb25lIGNhbGxlZCBvbiBhIGdpdmVuIGluc3RhbmNlCisgICAgICogb2YgdGhpcyBjb21wb25lbnQuCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IgdGhhdCBuZWVkcyB0byBiZQorICAgICAqICAgICAgICAgICAgICAgIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmICghc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24oc20KKyAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygianZtUm91dGUudmFsdmUubm90U3RhcnRlZCIpKTsKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVE9QX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworICAgICAgICBjbHVzdGVyID0gbnVsbDsKKyAgICAgICAgbnVtYmVyT2ZTZXNzaW9ucyA9IDA7CisgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS52YWx2ZS5zdG9wcGVkIikpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9Kdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpZmVjeWNsZUxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9Kdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpZmVjeWNsZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwYjY3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0p2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbjsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4uTW9kZWxNQmVhbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2F0YWxpbmFDbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZXNzYWdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5NYW5hZ2VkQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKKworLyoqCisgKiBSZWdpc3RlciBuZXcgSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lciB0byByZWNlaXZlIFNlc3Npb24gSUQgY2hhbmdlcy4KKyAqIAorICogYWRkIGZvbGxvd2luZyBhdCB5b3VyIHNlcnZlci54bWwgSG9zdCBzZWN0aW9uCisgKiAKKyAqIDxwcmU+CisgKiAgICAgICAgJmx0O0hvc3QgJmd0Oy4uLiAKKyAqICAgICAgICAgICZsdDtMaXN0ZW5lciBjbGFzc05hbWU9JnF1b3Q7b3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaWZlY3ljbGVMaXN0ZW5lciZxdW90OyAvJmd0OworICogICAgICAgICAgJmx0O0NsdXN0ZXIgLi4uJmd0OworICogICAgICAgICZsdDsvSG9zdCZndDsKKyAqIDwvcHJlPgorICogRklYTUUgYWRkIEVuZ2luZSBzdXBwb3J0CisgKiBAZGVwcmVjYXRlZAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICovCitwdWJsaWMgY2xhc3MgSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaWZlY3ljbGVMaXN0ZW5lciBpbXBsZW1lbnRzCisgICAgICAgIExpZmVjeWNsZUxpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeQorICAgICAgICAgICAgLmdldExvZyhKdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpZmVjeWNsZUxpc3RlbmVyLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBzdHJpbmcgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaWZlY3ljbGVMaXN0ZW5lci8xLjAiOworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyByZXNvdXJjZXMgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPSBTdHJpbmdNYW5hZ2VyCisgICAgICAgICAgICAuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7CisKKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBSZWdpc3RyeSByZWdpc3RyeSA9IG51bGw7CisKKyAgICBwcml2YXRlIE1lc3NhZ2VMaXN0ZW5lciBzZXNzaW9uTW92ZXJMaXN0ZW5lcjsKKworICAgIC8qCisgICAgICogc3RhcnQgYW5kIHN0b3AgY2x1c3RlcgorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lciNsaWZlY3ljbGVFdmVudChvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV2ZW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgaWYgKGVuYWJsZWQgJiYgZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBTdGFuZGFyZEhvc3QpIHsKKworICAgICAgICAgICAgaWYgKExpZmVjeWNsZS5BRlRFUl9TVEFSVF9FVkVOVC5lcXVhbHMoZXZlbnQuZ2V0VHlwZSgpKSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygianZtUm91dGUubGlzdGVuZXIuc3RhcnRlZCIpKTsKKyAgICAgICAgICAgICAgICBzdGFydFNlc3Npb25JRExpc3RlbmVyKChTdGFuZGFyZEhvc3QpIGV2ZW50LmdldFNvdXJjZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoTGlmZWN5Y2xlLkJFRk9SRV9TVE9QX0VWRU5ULmVxdWFscyhldmVudC5nZXRUeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS5saXN0ZW5lci5zdG9wcGVkIikpOworICAgICAgICAgICAgICAgIHN0b3BTZXNzaW9uSURMaXN0ZW5lcigoU3RhbmRhcmRIb3N0KSBldmVudC5nZXRTb3VyY2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzdG9wIHNlc3Npb25JRCBiaW5kZXIgYXQgY2x1c3RlcgorICAgICAqIAorICAgICAqIEBwYXJhbSBob3N0CisgICAgICogICAgICAgICAgICBjbHVzdGVyZWQgaG9zdAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0b3BTZXNzaW9uSURMaXN0ZW5lcihTdGFuZGFyZEhvc3QgaG9zdCkgeworICAgICAgICBpZiAoc2Vzc2lvbk1vdmVyTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIgPSAoQ2F0YWxpbmFDbHVzdGVyKSBob3N0LmdldENsdXN0ZXIoKTsKKyAgICAgICAgICAgIGNsdXN0ZXIucmVtb3ZlQ2x1c3Rlckxpc3RlbmVyKHNlc3Npb25Nb3Zlckxpc3RlbmVyKTsKKyAgICAgICAgICAgIGlmIChtc2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSBnZXRPYmplY3ROYW1lKGhvc3QpOworICAgICAgICAgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGhvc3QKKyAgICAgKiBAcmV0dXJuIFRoZSBvYmplY3QgbmFtZQorICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3ROYW1lIGdldE9iamVjdE5hbWUoU3RhbmRhcmRIb3N0IGhvc3QpIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUoCisgICAgICAgICAgICAgICAgaG9zdC5nZXREb21haW4oKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiOnR5cGU9TGlzdGVuZXIsbmFtZT1Kdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyLGhvc3Q9IiArIGhvc3QuZ2V0TmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIG9iamVjdE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogc3RhcnQgc2Vzc2lvbklEIG1vdmVyIGF0IGNsdXN0ZXIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaG9zdAorICAgICAqICAgICAgICAgICAgY2x1c3RlcmVkIGhvc3QKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydFNlc3Npb25JRExpc3RlbmVyKFN0YW5kYXJkSG9zdCBob3N0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSBudWxsOworICAgICAgICAgICAgZ2V0TUJlYW5TZXJ2ZXIoKTsKKyAgICAgICAgICAgIG9iamVjdE5hbWUgPSBnZXRPYmplY3ROYW1lKGhvc3QpOworICAgICAgICAgICAgaWYgKG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKG9iamVjdE5hbWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygianZtUm91dGUucnVuLmFscmVhZHkiKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2Vzc2lvbk1vdmVyTGlzdGVuZXIgPSBuZXcgSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lcigpOworICAgICAgICAgICAgbXNlcnZlci5yZWdpc3Rlck1CZWFuKGdldE1hbmFnZWRCZWFuKHNlc3Npb25Nb3Zlckxpc3RlbmVyKSwKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSk7CisgICAgICAgICAgICBDYXRhbGluYUNsdXN0ZXIgY2x1c3RlciA9IChDYXRhbGluYUNsdXN0ZXIpIGhvc3QuZ2V0Q2x1c3RlcigpOworICAgICAgICAgICAgc2Vzc2lvbk1vdmVyTGlzdGVuZXIuc2V0Q2x1c3RlcihjbHVzdGVyKTsKKyAgICAgICAgICAgICgoSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lcikgc2Vzc2lvbk1vdmVyTGlzdGVuZXIpLnN0YXJ0KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgbG9nLmVycm9yKGV4LmdldE1lc3NhZ2UoKSwgZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIE1CZWFuU2VydmVyIGdldE1CZWFuU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChNQmVhblNlcnZlckZhY3RvcnkuZmluZE1CZWFuU2VydmVyKG51bGwpLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtc2VydmVyID0gKE1CZWFuU2VydmVyKSBNQmVhblNlcnZlckZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kTUJlYW5TZXJ2ZXIobnVsbCkuZ2V0KDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtc2VydmVyID0gTUJlYW5TZXJ2ZXJGYWN0b3J5LmNyZWF0ZU1CZWFuU2VydmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWdpc3RyeSA9IFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpOworICAgICAgICAgICAgcmVnaXN0cnkubG9hZE1ldGFkYXRhKHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAibWJlYW5zLWRlc2NyaXB0b3JzLnhtbCIpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG1zZXJ2ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIE1vZGVsTUJlYW4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqZWN0CisgICAgICogICAgICAgICAgICBUaGUgT2JqZWN0IHRvIGdldCB0aGUgTW9kZWxNQmVhbiBmb3IKKyAgICAgKiBAcmV0dXJuIFRoZSBNb2RlbE1CZWFuCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgdGhpcyBjb25zdHJ1Y3RvcnMgdGhyb3dzIHRoaXMgZXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIE1vZGVsTUJlYW4gZ2V0TWFuYWdlZEJlYW4oT2JqZWN0IG9iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBudWxsOworICAgICAgICBpZiAocmVnaXN0cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZEJlYW4gPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4ob2JqZWN0CisgICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBtYmVhbiA9IG1hbmFnZWRCZWFuLmNyZWF0ZU1CZWFuKG9iamVjdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1iZWFuOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBlbmFibGVkCisgICAgICogICAgICAgICAgICBUaGUgZW5hYmxlZCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0p2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0p2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmJjODk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lOworCisvKioKKyAqIFJlY2VpdmUgU2Vzc2lvbklEIGNsdXN0ZXIgY2hhbmdlIGZyb20gb3RoZXIgYmFja3VwIG5vZGUgYWZ0ZXIgcHJpbWFyeSBzZXNzaW9uCisgKiBub2RlIGlzIGZhaWxlZC4KKyAqIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIEp2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXIgZXh0ZW5kcyBDbHVzdGVyTGlzdGVuZXIgeworIAorICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lci8xLjEiOworCisgICAgLy8tLUluc3RhbmNlIFZhcmlhYmxlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIG51bWJlciBvZiBzZXNzaW9uIHRoYXQgZ29lcyB0byB0aGlzIGNsdXN0ZXIgbm9kZQorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBudW1iZXJPZlNlc3Npb25zID0gMDsKKworICAgIC8vLS1Db25zdHJ1Y3Rvci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIEp2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXIoKSB7CisgICAgfQorCisgICAgLy8tLUxvZ2ljLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbnVtYmVyT2ZTZXNzaW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXROdW1iZXJPZlNlc3Npb25zKCkgeworICAgICAgICByZXR1cm4gbnVtYmVyT2ZTZXNzaW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhpcyBNb3ZlciBhcyBDbHVzdGVyIExpc3RlbmVyICggcmVjZWl2ZXIpCisgICAgICogCisgICAgICogQHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhcnRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZ2V0Q2x1c3RlcigpLmFkZENsdXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS5jbHVzdGVyTGlzdGVuZXIuc3RhcnRlZCIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhpcyBmcm9tIENsdXN0ZXIgTGlzdGVuZXIKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworICAgICAgICBnZXRDbHVzdGVyKCkucmVtb3ZlQ2x1c3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygianZtUm91dGUuY2x1c3Rlckxpc3RlbmVyLnN0b3BwZWQiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgZnJvbSB0aGUgY2x1c3Rlciwgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQsIFRoZSBjbHVzdGVyIHdpbGwKKyAgICAgKiBicm9hZGNhc3QgaXQgaW52b2tpbmcgdGhlIG1lc3NhZ2VSZWNlaXZlZCBvbiB0aGUgcmVjZWl2ZXIuCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgQ2x1c3Rlck1lc3NhZ2UgLSB0aGUgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBjbHVzdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKENsdXN0ZXJNZXNzYWdlIG1zZykgeworICAgICAgICBpZiAobXNnIGluc3RhbmNlb2YgU2Vzc2lvbklETWVzc2FnZSAmJiBtc2cgIT0gbnVsbCkgeworICAgICAgICAgICAgU2Vzc2lvbklETWVzc2FnZSBzZXNzaW9ubXNnID0gKFNlc3Npb25JRE1lc3NhZ2UpIG1zZzsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgImp2bVJvdXRlLnJlY2VpdmVNZXNzYWdlLnNlc3Npb25JRENoYW5nZWQiLCBzZXNzaW9ubXNnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPcmlnbmFsU2Vzc2lvbklEKCksIHNlc3Npb25tc2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEJhY2t1cFNlc3Npb25JRCgpLCBzZXNzaW9ubXNnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0UGF0aCgpKSk7CisgICAgICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gZ2V0Q2x1c3RlcigpLmdldENvbnRhaW5lcigpOworICAgICAgICAgICAgQ29udGFpbmVyIGhvc3QgPSBudWxsIDsKKyAgICAgICAgICAgIGlmKGNvbnRhaW5lciBpbnN0YW5jZW9mIEVuZ2luZSkgeworICAgICAgICAgICAgICAgIGhvc3QgPSBjb250YWluZXIuZmluZENoaWxkKHNlc3Npb25tc2cuZ2V0SG9zdCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaG9zdCA9IGNvbnRhaW5lciA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGhvc3QuZmluZENoaWxkKHNlc3Npb25tc2cKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBjb250ZXh0LmdldE1hbmFnZXIoKS5maW5kU2Vzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbm1zZy5nZXRPcmlnbmFsU2Vzc2lvbklEKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0SWQoc2Vzc2lvbm1zZy5nZXRCYWNrdXBTZXNzaW9uSUQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS5sb3N0U2Vzc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9ubXNnLmdldE9yaWduYWxTZXNzaW9uSUQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25tc2cuZ2V0Q29udGV4dFBhdGgoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImp2bVJvdXRlLmNvbnRleHROb3RGb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbm1zZy5nZXRDb250ZXh0UGF0aCgpLCAoKFN0YW5kYXJkRW5naW5lKSBob3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyZW50KCkpLmdldEp2bVJvdXRlKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygianZtUm91dGUuaG9zdE5vdEZvdW5kIiwgc2Vzc2lvbm1zZy5nZXRDb250ZXh0UGF0aCgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2NlcHQgb25seSBTZXNzaW9uSURNZXNzYWdlcworICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgICAgICAgIENsdXN0ZXJNZXNzYWdlCisgICAgICogQHJldHVybiBib29sZWFuIC0gcmV0dXJucyB0cnVlIHRvIGluZGljYXRlIHRoYXQgbWVzc2FnZVJlY2VpdmVkIHNob3VsZCBiZQorICAgICAqICAgICAgICAgaW52b2tlZC4gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIHRoZSBtZXNzYWdlUmVjZWl2ZWQgbWV0aG9kIHdpbGwKKyAgICAgKiAgICAgICAgIG5vdCBiZSBpbnZva2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChDbHVzdGVyTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgcmV0dXJuIChtc2cgaW5zdGFuY2VvZiBTZXNzaW9uSURNZXNzYWdlKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNmNDcwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsOTYgQEAKK2RlbHRhTWFuYWdlci5jcmVhdGVTZXNzaW9uLmlzZT1jcmVhdGVTZXNzaW9uOiBUb28gbWFueSBhY3RpdmUgc2Vzc2lvbnMKK2RlbHRhTWFuYWdlci5jcmVhdGVTZXNzaW9uLm5ld1Nlc3Npb249Q3JlYXRlZCBhIERlbHRhU2Vzc2lvbiB3aXRoIElkIFt7MH1dIFRvdGFsIGNvdW50PXsxfQorZGVsdGFNYW5hZ2VyLmNyZWF0ZU1lc3NhZ2UuYWNjZXNzPU1hbmFnZXIgW3swfV06IGNyZWF0ZSBzZXNzaW9uIG1lc3NhZ2UgW3sxfV0gYWNjZXNzLgorZGVsdGFNYW5hZ2VyLmNyZWF0ZU1lc3NhZ2UuYWNjZXNzQ2hhbmdlUHJpbWFyeT1NYW5hZ2VyIFt7MH1dOiBjcmVhdGUgc2Vzc2lvbiBtZXNzYWdlIFt7MX1dIGFjY2VzcyB0byBjaGFuZ2UgcHJpbWFyeS4KK2RlbHRhTWFuYWdlci5jcmVhdGVNZXNzYWdlLmFsbFNlc3Npb25EYXRhPU1hbmFnZXIgW3swfV0gc2VuZCBhbGwgc2Vzc2lvbiBkYXRhLgorZGVsdGFNYW5hZ2VyLmNyZWF0ZU1lc3NhZ2UuYWxsU2Vzc2lvblRyYW5zZmVyZWQ9TWFuYWdlciBbezB9XSBzZW5kIGFsbCBzZXNzaW9uIGRhdGEgdHJhbnNmZXJlZAorZGVsdGFNYW5hZ2VyLmNyZWF0ZU1lc3NhZ2UuZGVsdGE9TWFuYWdlciBbezB9XTogY3JlYXRlIHNlc3Npb24gbWVzc2FnZSBbezF9XSBkZWx0YSByZXF1ZXN0LgorZGVsdGFNYW5hZ2VyLmNyZWF0ZU1lc3NhZ2UuZXhwaXJlPU1hbmFnZXIgW3swfV06IGNyZWF0ZSBzZXNzaW9uIG1lc3NhZ2UgW3sxfV0gZXhwaXJlLgorZGVsdGFNYW5hZ2VyLmNyZWF0ZU1lc3NhZ2UudW5hYmxlQ3JlYXRlRGVsdGFSZXF1ZXN0PVVuYWJsZSB0byBzZXJpYWxpemUgZGVsdGEgcmVxdWVzdCBmb3Igc2Vzc2lvbmlkIFt7MH1dCitkZWx0YU1hbmFnZXIuZHJvcE1lc3NhZ2U9TWFuYWdlciBbezB9XTogRHJvcCBtZXNzYWdlIHsxfSBpbnNpZGUgR0VUX0FMTF9TRVNTSU9OUyBzeW5jIHBoYXNlIHN0YXJ0IGRhdGUgezJ9IG1lc3NhZ2UgZGF0ZSB7M30KK2RlbHRhTWFuYWdlci5mb3VuZE1hc3Rlck1lbWJlcj1Gb3VuZCBmb3IgY29udGV4dCBbezB9XSB0aGUgcmVwbGljYXRpb24gbWFzdGVyIG1lbWJlciBbezF9XQorZGVsdGFNYW5hZ2VyLmxvYWRpbmcuY25mZT1DbGFzc05vdEZvdW5kRXhjZXB0aW9uIHdoaWxlIGxvYWRpbmcgcGVyc2lzdGVkIHNlc3Npb25zOiB7MH0KK2RlbHRhTWFuYWdlci5sb2FkaW5nLmV4aXN0aW5nLnNlc3Npb249b3ZlcmxvYWQgZXhpc3Rpbmcgc2Vzc2lvbiB7MH0gCitkZWx0YU1hbmFnZXIubG9hZGluZy5pb2U9SU9FeGNlcHRpb24gd2hpbGUgbG9hZGluZyBwZXJzaXN0ZWQgc2Vzc2lvbnM6IHswfQorZGVsdGFNYW5hZ2VyLmxvYWRpbmcud2l0aENvbnRleHRDbGFzc0xvYWRlcj1NYW5hZ2VyIFt7MH1dOiBMb2FkaW5nIHRoZSBvYmplY3QgZGF0YSB3aXRoIGEgY29udGV4dCBjbGFzcyBsb2FkZXIuCitkZWx0YU1hbmFnZXIubG9hZGluZy53aXRob3V0Q2xhc3NMb2FkZXI9TWFuYWdlciBbezB9XTogTG9hZGluZyB0aGUgb2JqZWN0IGRhdGEgd2l0aG91dCBhIGNvbnRleHQgY2xhc3MgbG9hZGVyLgorZGVsdGFNYW5hZ2VyLm1hbmFnZXJMb2FkPUV4Y2VwdGlvbiBsb2FkaW5nIHNlc3Npb25zIGZyb20gcGVyc2lzdGVudCBzdG9yYWdlCitkZWx0YU1hbmFnZXIubm9DbHVzdGVyPVN0YXJ0aW5nLi4uIG5vIGNsdXN0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dDogW3swfV0KK2RlbHRhTWFuYWdlci5ub01hc3Rlck1lbWJlcj1TdGFydGluZy4uLiB3aXRoIG5vIG90aGVyIG1lbWJlciBmb3IgY29udGV4dCBbezB9XSBhdCBkb21haW4gW3sxfV0KK2RlbHRhTWFuYWdlci5ub01lbWJlcnM9TWFuYWdlciBbezB9XTogc2tpcHBpbmcgc3RhdGUgdHJhbnNmZXIuIE5vIG1lbWJlcnMgYWN0aXZlIGluIGNsdXN0ZXIgZ3JvdXAuCitkZWx0YU1hbmFnZXIubm9TZXNzaW9uU3RhdGU9TWFuYWdlciBbezB9XTogTm8gc2Vzc2lvbiBzdGF0ZSBzZW5kIGF0IHsxfSByZWNlaXZlZCwgdGltaW5nIG91dCBhZnRlciB7Mn0gbXMuCitkZWx0YU1hbmFnZXIubm90U3RhcnRlZD1NYW5hZ2VyIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZAorZGVsdGFNYW5hZ2VyLnNlbmRNZXNzYWdlLm5ld1Nlc3Npb249TWFuYWdlciBbezB9XSBzZW5kIG5ldyBzZXNzaW9uICh7MX0pCitkZWx0YU1hbmFnZXIuZXhwaXJlU2Vzc2lvbnM9TWFuYWdlciBbezB9XSBleHBpcmluZyBzZXNzaW9ucyB1cG9uIHNodXRkb3duCitkZWx0YU1hbmFnZXIucmVjZWl2ZU1lc3NhZ2UuYWNjZXNzZWQ9TWFuYWdlciBbezB9XTogcmVjZWl2ZWQgc2Vzc2lvbiBbezF9XSBhY2Nlc3NlZC4KK2RlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS5jcmVhdGVOZXdTZXNzaW9uPU1hbmFnZXIgW3swfV06IHJlY2VpdmVkIHNlc3Npb24gW3sxfV0gY3JlYXRlZC4KK2RlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS5kZWx0YT1NYW5hZ2VyIFt7MH1dOiByZWNlaXZlZCBzZXNzaW9uIFt7MX1dIGRlbHRhLgorZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLmVycm9yPU1hbmFnZXIgW3swfV06IFVuYWJsZSB0byByZWNlaXZlIG1lc3NhZ2UgdGhyb3VnaCBUQ1AgY2hhbm5lbAorZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLmV2ZW50VHlwZT1NYW5hZ2VyIFt7MH1dOiBSZWNlaXZlZCBTZXNzaW9uTWVzc2FnZSBvZiB0eXBlPSh7MX0pIGZyb20gW3syfV0KK2RlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS5leHBpcmVkPU1hbmFnZXIgW3swfV06IHJlY2VpdmVkIHNlc3Npb24gW3sxfV0gZXhwaXJlZC4KK2RlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS50cmFuc2ZlcmNvbXBsZXRlPU1hbmFnZXIgW3swfV0gcmVjZWl2ZWQgZnJvbSBub2RlIFt7MX06ezJ9XSBzZXNzaW9uIHN0YXRlIHRyYW5zZmVyZWQuCitkZWx0YU1hbmFnZXIucmVjZWl2ZU1lc3NhZ2UudW5sb2FkaW5nQWZ0ZXI9TWFuYWdlciBbezB9XTogdW5sb2FkaW5nIHNlc3Npb25zIGNvbXBsZXRlCitkZWx0YU1hbmFnZXIucmVjZWl2ZU1lc3NhZ2UudW5sb2FkaW5nQmVnaW49TWFuYWdlciBbezB9XTogc3RhcnQgdW5sb2FkaW5nIHNlc3Npb25zCitkZWx0YU1hbmFnZXIucmVjZWl2ZU1lc3NhZ2UuYWxsU2Vzc2lvbkRhdGFBZnRlcj1NYW5hZ2VyIFt7MH1dOiBzZXNzaW9uIHN0YXRlIGRlc2VyaWFsaXplZAorZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLmFsbFNlc3Npb25EYXRhQmVnaW49TWFuYWdlciBbezB9XTogcmVjZWl2ZWQgc2Vzc2lvbiBzdGF0ZSBkYXRhCitkZWx0YU1hbmFnZXIucmVjZWl2ZU1lc3NhZ2UuZnJvbVdyb25nRG9tYWluPU1hbmFnZXIgW3swfV06IFJlY2VpdmVkIHdyb25nIFNlc3Npb25NZXNzYWdlIG9mIHR5cGU9KHsxfSkgZnJvbSBbezJ9XSB3aXRoIGRvbWFpbiBbezN9XSAobG9jYWxkb21haW4gW3s0fV0gCitkZWx0YU1hbmFnZXIucmVnaXN0ZXJDbHVzdGVyPVJlZ2lzdGVyIG1hbmFnZXIgezB9IHRvIGNsdXN0ZXIgZWxlbWVudCB7MX0gd2l0aCBuYW1lIHsyfQorZGVsdGFNYW5hZ2VyLnNlc3Npb25SZWNlaXZlZD1NYW5hZ2VyIFt7MH1dOyBzZXNzaW9uIHN0YXRlIHNlbmQgYXQgezF9IHJlY2VpdmVkIGluIHsyfSBtcy4KK2RlbHRhTWFuYWdlci5zZXNzaW9uVGltZW91dD1JbnZhbGlkIHNlc3Npb24gdGltZW91dCBzZXR0aW5nIHswfQorZGVsdGFNYW5hZ2VyLnN0YXJ0Q2x1c3RlcmluZz1TdGFydGluZyBjbHVzdGVyaW5nIG1hbmFnZXIgYXQgezB9CitkZWx0YU1hbmFnZXIuc3RvcHBlZD1NYW5hZ2VyIFt7MH1dIGlzIHN0b3BwaW5nCitkZWx0YU1hbmFnZXIudW5sb2FkaW5nLmlvZT1JT0V4Y2VwdGlvbiB3aGlsZSBzYXZpbmcgcGVyc2lzdGVkIHNlc3Npb25zOiB7MH0KK2RlbHRhTWFuYWdlci53YWl0Rm9yU2Vzc2lvblN0YXRlPU1hbmFnZXIgW3swfV0sIHJlcXVlc3Rpbmcgc2Vzc2lvbiBzdGF0ZSBmcm9tIHsxfS4gVGhpcyBvcGVyYXRpb24gd2lsbCB0aW1lb3V0IGlmIG5vIHNlc3Npb24gc3RhdGUgaGFzIGJlZW4gcmVjZWl2ZWQgd2l0aGluIDYwIHNlY29uZHMuCitkZWx0YVJlcXVlc3Quc2hvd1ByaW5jaXBhbD1QcmluY2lwYWwgW3swfV0gaXMgc2V0IHRvIHNlc3Npb24gezF9CitkZWx0YVJlcXVlc3Qud3JvbmdQcmluY2lwYWxDbGFzcz1EZWx0YU1hbmFnZXIgb25seSBzdXBwb3J0IEdlbmVyaWNQcmluY2lwYWwuIFlvdXIgcmVhbG0gdXNlZCBwcmluY2lwYWwgY2xhc3MgezB9LgorZGVsdGFTZXNzaW9uLm5vdGlmeWluZz1Ob3RpZnlpbmcgY2x1c3RlciBvZiBleHBpcmF0aW9uIHByaW1hcnk9ezB9IHNlc3Npb25JZCBbezF9XQorZGVsdGFTZXNzaW9uLnZhbHVlQm91bmQuZXg9U2Vzc2lvbiBib3VuZCBsaXN0ZW5lciB0aHJvdyBhbiBleGNlcHRpb24KK2RlbHRhU2Vzc2lvbi52YWx1ZUJpbmRpbmcuZXg9U2Vzc2lvbiBiaW5kaW5nIGxpc3RlbmVyIHRocm93IGFuIGV4Y2VwdGlvbgorZGVsdGFTZXNzaW9uLnZhbHVlVW5ib3VuZC5leD1TZXNzaW9uIHVuYm91bmQgbGlzdGVuZXIgdGhyb3cgYW4gZXhjZXB0aW9uCitkZWx0YVNlc3Npb24ucmVhZFNlc3Npb249cmVhZE9iamVjdCgpIGxvYWRpbmcgc2Vzc2lvbiBbezB9XQorZGVsdGFTZXNzaW9uLnJlYWRBdHRyaWJ1dGU9c2Vzc2lvbiBbezB9XSBsb2FkaW5nIGF0dHJpYnV0ZSAnezF9JyB3aXRoIHZhbHVlICd7Mn0nCitkZWx0YVNlc3Npb24ud3JpdGVTZXNzaW9uPXdyaXRlT2JqZWN0KCkgc3RvcmluZyBzZXNzaW9uIFt7MH1dCitqdm1Sb3V0ZS5jYW5ub3RGaW5kU2Vzc2lvbj1DYW4ndCBmaW5kIHNlc3Npb24gW3swfV0KK2p2bVJvdXRlLmNoYW5nZVNlc3Npb249Q2hhbmdlZCBzZXNzaW9uIGZyb20gW3swfV0gdG8gW3sxfV0KK2p2bVJvdXRlLmNsdXN0ZXJMaXN0ZW5lci5zdGFydGVkPUNsdXN0ZXIgSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lciBzdGFydGVkCitqdm1Sb3V0ZS5jbHVzdGVyTGlzdGVuZXIuc3RvcHBlZD1DbHVzdGVyIEp2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXIgc3RvcHBlZAoranZtUm91dGUuY29uZmlndXJlLndhcm49UGxlYXNlLCBzZXR1cCB5b3VyIEp2bVJvdXRlQmluZGVyVmFsdmUgYXQgaG9zdCB2YWx2ZSwgbm90IGF0IGNvbnRleHQgdmFsdmUhCitqdm1Sb3V0ZS5jb250ZXh0Tm90Rm91bmQ9Q29udGV4dCBbezB9XSBub3QgZm91bmQgYXQgbm9kZSBbezF9XSEKK2p2bVJvdXRlLmZhaWxvdmVyPURldGVjdGVkIGEgZmFpbG92ZXIgd2l0aCBkaWZmZXJlbnQganZtUm91dGUgLSBvcmdpbmFsIHJvdXRlOiBbezB9XSBuZXcgb25lOiBbezF9XSBhdCBzZXNzaW9uIGlkIFt7Mn1dCitqdm1Sb3V0ZS5mb3VuZE1hbmFnZXI9Rm91bmQgQ2x1c3RlciBEZWx0YU1hbmFnZXIgezB9IGF0IHsxfQoranZtUm91dGUuaG9zdE5vdEZvdW5kPU5vIGhvc3QgZm91bmQgW3swfV0KK2p2bVJvdXRlLmxpc3RlbmVyLnN0YXJ0ZWQ9U2Vzc2lvbklEIEJpbmRlciBMaXN0ZW5lciBzdGFydGVkCitqdm1Sb3V0ZS5saXN0ZW5lci5zdG9wcGVkPVNlc3Npb25JRCBCaW5kZXIgTGlzdGVuZXIgc3RvcHBlZAoranZtUm91dGUubG9zdFNlc3Npb249TG9zdCBTZXNzaW9uIFt7MH1dIGF0IHBhdGggW3sxfV0KK2p2bVJvdXRlLm1pc3NpbmdKdm1Sb3V0ZUF0dHJpYnV0ZT1ObyBlbmdpbmUganZtUm91dGUgYXR0cmlidXRlIGNvbmZpZ3VyZWQhCitqdm1Sb3V0ZS5uZXdTZXNzaW9uQ29va2llPVNldHRpbmcgY29va2llIHdpdGggc2Vzc2lvbiBpZCBbezB9XSBuYW1lOiBbezF9XSBwYXRoOiBbezJ9XSBzZWN1cmU6IFt7M31dCitqdm1Sb3V0ZS5ub3RGb3VuZE1hbmFnZXI9Tm90IGZvdW5kIENsdXN0ZXIgRGVsdGFNYW5hZ2VyIHswfSBhdCB7MX0KK2p2bVJvdXRlLnJlY2VpdmVNZXNzYWdlLnNlc3Npb25JRENoYW5nZWQ9Q2x1c3RlciBKdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyIHJlY2VpdmVkIG9yZ2luYWwgc2Vzc2lvbiBJRCBbezB9XSBzZXQgdG8gbmV3IGlkIFt7MX1dIGZvciBjb250ZXh0IHBhdGggW3syfV0KK2p2bVJvdXRlLnJ1bi5hbHJlYWR5PWp2bVJvdXRlIFNlc3Npb25JRCByZWNlaXZlciBydW4gYWxyZWFkeQoranZtUm91dGUuc2tpcFVSTFNlc3Npb25JRHM9U2tpcCByZWFzc2lnbiBqdm0gcm91dGUgY2hlY2ssIHNlc3Npb25pZCBjb21lcyBmcm9tIFVSTCEKK2p2bVJvdXRlLnR1cm5vdmVySW5mbz1UdXJub3ZlciBDaGVjayB0aW1lIHswfSBtc2VjCitqdm1Sb3V0ZS52YWx2ZS5hbHJlYWR5U3RhcnRlZD1qdm1Sb3V0ZSBiYWNrdXAgc2Vzc2lvbklEIGNvcnJlY3Rpb24gaXMgc3RhcnRlZAoranZtUm91dGUudmFsdmUubm90U3RhcnRlZD1qdm1Sb3V0ZSBiYWNrdXAgc2Vzc2lvbklEIGNvcnJlY3Rpb24gcnVuIGFscmVhZHkKK2p2bVJvdXRlLnZhbHZlLnN0YXJ0ZWQ9SnZtUm91dGVCaW5kZXJWYWx2ZSBzdGFydGVkCitqdm1Sb3V0ZS52YWx2ZS5zdG9wcGVkPUp2bVJvdXRlQmluZGVyVmFsdmUgc3RvcHBlZAoranZtUm91dGUuc2V0Lm9yaWduYWxzZXNzaW9uaWQ9U2V0IE9yZ2luYWwgU2Vzc2lvbiBpZCBhdCByZXF1ZXN0IGF0dHJpdXRlIHswfSB2YWx1ZTogezF9CitzdGFuZGFyZFNlc3Npb24uZ2V0SWQuaXNlPWdldElkOiBTZXNzaW9uIGFscmVhZHkgaW52YWxpZGF0ZWQKK3N0YW5kYXJkU2Vzc2lvbi5hdHRyaWJ1dGVFdmVudD1TZXNzaW9uIGF0dHJpYnV0ZSBldmVudCBsaXN0ZW5lciB0aHJldyBleGNlcHRpb24KK3N0YW5kYXJkU2Vzc2lvbi5hdHRyaWJ1dGVFdmVudD1TZXNzaW9uIGF0dHJpYnV0ZSBldmVudCBsaXN0ZW5lciB0aHJldyBleGNlcHRpb24KK3N0YW5kYXJkU2Vzc2lvbi5iaW5kaW5nRXZlbnQ9U2Vzc2lvbiBiaW5kaW5nIGV2ZW50IGxpc3RlbmVyIHRocmV3IGV4Y2VwdGlvbgorc3RhbmRhcmRTZXNzaW9uLmludmFsaWRhdGUuaXNlPWludmFsaWRhdGU6IFNlc3Npb24gYWxyZWFkeSBpbnZhbGlkYXRlZAorc3RhbmRhcmRTZXNzaW9uLmlzTmV3LmlzZT1pc05ldzogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uZ2V0QXR0cmlidXRlLmlzZT1nZXRBdHRyaWJ1dGU6IFNlc3Npb24gYWxyZWFkeSBpbnZhbGlkYXRlZAorc3RhbmRhcmRTZXNzaW9uLmdldEF0dHJpYnV0ZU5hbWVzLmlzZT1nZXRBdHRyaWJ1dGVOYW1lczogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uZ2V0Q3JlYXRpb25UaW1lLmlzZT1nZXRDcmVhdGlvblRpbWU6IFNlc3Npb24gYWxyZWFkeSBpbnZhbGlkYXRlZAorc3RhbmRhcmRTZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWUuaXNlPWdldExhc3RBY2Nlc3NlZFRpbWU6IFNlc3Npb24gYWxyZWFkeSBpbnZhbGlkYXRlZAorc3RhbmRhcmRTZXNzaW9uLmdldElkLmlzZT1nZXRJZDogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbC5pc2U9Z2V0TWF4SW5hY3RpdmVJbnRlcnZhbDogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uZ2V0VmFsdWVOYW1lcy5pc2U9Z2V0VmFsdWVOYW1lczogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24ubm90U2VyaWFsaXphYmxlPUNhbm5vdCBzZXJpYWxpemUgc2Vzc2lvbiBhdHRyaWJ1dGUgezB9IGZvciBzZXNzaW9uIHsxfQorc3RhbmRhcmRTZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZS5pc2U9cmVtb3ZlQXR0cmlidXRlOiBTZXNzaW9uIGFscmVhZHkgaW52YWxpZGF0ZWQKK3N0YW5kYXJkU2Vzc2lvbi5zZXNzaW9uRXZlbnQ9U2Vzc2lvbiBldmVudCBsaXN0ZW5lciB0aHJldyBleGNlcHRpb24KK3N0YW5kYXJkU2Vzc2lvbi5zZXRBdHRyaWJ1dGUuaWFlPXNldEF0dHJpYnV0ZTogTm9uLXNlcmlhbGl6YWJsZSBhdHRyaWJ1dGUKK3N0YW5kYXJkU2Vzc2lvbi5zZXRBdHRyaWJ1dGUuaXNlPXNldEF0dHJpYnV0ZTogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uc2V0QXR0cmlidXRlLm5hbWVudWxsPXNldEF0dHJpYnV0ZTogbmFtZSBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwKK3N0YW5kYXJkU2Vzc2lvbi5zZXNzaW9uQ3JlYXRlZD1DcmVhdGVkIFNlc3Npb24gaWQgPSB7MH0KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL1JlcGxpY2F0ZWRTZXNzaW9uLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9SZXBsaWNhdGVkU2Vzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YzE2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9SZXBsaWNhdGVkU2Vzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMjg2IEBACisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uOworCisvKioKKyAqIFRpdGxlOiAgICAgICAgVG9tY2F0IFNlc3Npb24gUmVwbGljYXRpb24gZm9yIFRvbWNhdCA0LjAgPEJSPgorICogRGVzY3JpcHRpb246ICBBIHZlcnkgc2ltcGxlIHN0cmFpZ2h0IGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YKKyAqICAgICAgICAgICAgICAgc2Vzc2lvbiByZXBsaWNhdGlvbiBvZiBzZXJ2ZXJzIGluIGEgY2x1c3Rlci48QlI+CisgKiAgICAgICAgICAgICAgIFRoaXMgc2Vzc2lvbiByZXBsaWNhdGlvbiBpcyBpbXBsZW1lbnRlZCAibGl2ZSIuIEJ5IGxpdmUKKyAqICAgICAgICAgICAgICAgSSBtZWFuLCB3aGVuIGEgc2Vzc2lvbiBhdHRyaWJ1dGUgaXMgYWRkZWQgaW50byBhIHNlc3Npb24gb24gTm9kZSBBCisgKiAgICAgICAgICAgICAgIGEgbWVzc2FnZSBpcyBicm9hZGNhc3RlZCB0byBvdGhlciBtZXNzYWdlcyBhbmQgc2V0QXR0cmlidXRlIGlzIGNhbGxlZCBvbiB0aGUgcmVwbGljYXRlZAorICogICAgICAgICAgICAgICBzZXNzaW9ucy48QlI+CisgKiAgICAgICAgICAgICAgIEEgZnVsbCBkZXNjcmlwdGlvbiBvZiB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBmb3VuZCB1bmRlcgorICogICAgICAgICAgICAgICA8aHJlZj0iaHR0cDovL3d3dy5maWxpcC5uZXQvdG9tY2F0LyI+RmlsaXAncyBUb21jYXQgUGFnZTwvYT48QlI+CisgKgorICogQ29weXJpZ2h0OiAgICBTZWUgYXBhY2hlIGxpY2Vuc2UKKyAqIEBhdXRob3IgIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogRGVzY3JpcHRpb246PEJSPgorICogVGhlIFJlcGxpY2F0ZWRTZXNzaW9uIGNsYXNzIGlzIGEgc2ltcGxlIGV4dGVuc2lvbiBvZiB0aGUgU3RhbmRhcmRTZXNzaW9uIGNsYXNzCisgKiBJdCBvdmVycmlkZXMgYSBmZXcgbWV0aG9kcyAoc2V0QXR0cmlidXRlLCByZW1vdmVBdHRyaWJ1dGUsIGV4cGlyZSwgYWNjZXNzKSBhbmQgaGFzCisgKiBob29rcyBpbnRvIHRoZSBJbk1lbW9yeVJlcGxpY2F0aW9uTWFuYWdlciB0byBicm9hZGNhc3QgYW5kIHJlY2VpdmUgZXZlbnRzIGZyb20gdGhlIGNsdXN0ZXIuPEJSPgorICogVGhpcyBjbGFzcyBpbmhlcml0cyB0aGUgcmVhZE9iamVjdERhdGEgYW5kIHdyaXRlT2JqZWN0IGRhdGEgbWV0aG9kcyBmcm9tIHRoZSBTdGFuZGFyZFNlc3Npb24KKyAqIGFuZCBkb2VzIG5vdCBjb250YWluIGFueSBzZXJpYWxpemFibGUgZWxlbWVudHMgaW4gYWRkaXRpb24gdG8gdGhlIGluaGVyaXRlZCBvbmVzIGZyb20gdGhlIFN0YW5kYXJkU2Vzc2lvbgorICoKKyAqLworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CisKK3B1YmxpYyBjbGFzcyBSZXBsaWNhdGVkU2Vzc2lvbiBleHRlbmRzIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5TdGFuZGFyZFNlc3Npb24KK2ltcGxlbWVudHMgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJTZXNzaW9ueworCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgTWFuYWdlciBtTWFuYWdlciA9IG51bGw7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEaXJ0eSA9IGZhbHNlOworICAgIHByaXZhdGUgdHJhbnNpZW50IGxvbmcgbGFzdEFjY2Vzc1dhc0Rpc3RyaWJ1dGVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzUHJpbWFyeVNlc3Npb249dHJ1ZTsKKyAgICAKKworICAgIHB1YmxpYyBSZXBsaWNhdGVkU2Vzc2lvbihNYW5hZ2VyIG1hbmFnZXIpIHsKKyAgICAgICAgc3VwZXIobWFuYWdlcik7CisgICAgICAgIG1NYW5hZ2VyID0gbWFuYWdlcjsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRGlydHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SXNEaXJ0eShib29sZWFuIGRpcnR5KQorICAgIHsKKyAgICAgICAgaXNEaXJ0eSA9IGRpcnR5OworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0TGFzdEFjY2Vzc1dhc0Rpc3RyaWJ1dGVkKGxvbmcgdGltZSkgeworICAgICAgICBsYXN0QWNjZXNzV2FzRGlzdHJpYnV0ZWQgPSB0aW1lOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldExhc3RBY2Nlc3NXYXNEaXN0cmlidXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGxhc3RBY2Nlc3NXYXNEaXN0cmlidXRlZDsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworICAgICAgICBzZXRJc0RpcnR5KHRydWUpOworICAgICAgICBzdXBlci5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIHBhcmVudCBkZXNjcmlwdGlvbiwKKyAgICAgKiBwbHVzIHdlIGFsc28gbm90aWZ5IG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lLCBib29sZWFuIG5vdGlmeSkgeworICAgICAgICBzZXRJc0RpcnR5KHRydWUpOworICAgICAgICBzdXBlci5yZW1vdmVBdHRyaWJ1dGUobmFtZSxub3RpZnkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyBhbiBhdHRyaWJ1dGUgYW5kIG5vdGlmaWVzIHRoZSBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKCB2YWx1ZSA9PSBudWxsICkgeworICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBqYXZhLmlvLlNlcmlhbGl6YWJsZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgZm9yIGF0dHJpYnV0ZSAiK25hbWUrIiBpcyBub3Qgc2VyaWFsaXphYmxlLiIpOworICAgICAgICBzZXRJc0RpcnR5KHRydWUpOworICAgICAgICBzdXBlci5zZXRBdHRyaWJ1dGUobmFtZSx2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWF4SW5hY3RpdmVJbnRlcnZhbChpbnQgaW50ZXJ2YWwpIHsKKyAgICAgICAgc2V0SXNEaXJ0eSh0cnVlKTsKKyAgICAgICAgc3VwZXIuc2V0TWF4SW5hY3RpdmVJbnRlcnZhbChpbnRlcnZhbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYW5hZ2VyIGZvciB0aGlzIHNlc3Npb24KKyAgICAgKiBAcGFyYW0gbWdyIC0gdGhlIHNlcnZlcnMgSW5NZW1vcnlSZXBsaWNhdGlvbk1hbmFnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlciBtZ3IpCisgICAgeworICAgICAgICBtTWFuYWdlciA9IG1ncjsKKyAgICAgICAgc3VwZXIuc2V0TWFuYWdlcihtZ3IpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNlc3Npb24uCisgICAgICogVGhpcyBwcm92aWRlcyBhbiA8Y29kZT5BdXRoZW50aWNhdG9yPC9jb2RlPiB3aXRoIGEgbWVhbnMgdG8gY2FjaGUgYQorICAgICAqIHByZXZpb3VzbHkgYXV0aGVudGljYXRlZCBQcmluY2lwYWwsIGFuZCBhdm9pZCBwb3RlbnRpYWxseSBleHBlbnNpdmUKKyAgICAgKiA8Y29kZT5SZWFsbS5hdXRoZW50aWNhdGUoKTwvY29kZT4gY2FsbHMgb24gZXZlcnkgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmluY2lwYWwgVGhlIG5ldyBQcmluY2lwYWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmluY2lwYWwoUHJpbmNpcGFsIHByaW5jaXBhbCkgeworICAgICAgICBzdXBlci5zZXRQcmluY2lwYWwocHJpbmNpcGFsKTsKKyAgICAgICAgc2V0SXNEaXJ0eSh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBleHBpcmUoKSB7CisgICAgICAgIFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlciBtZ3IgPShTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIpZ2V0TWFuYWdlcigpOworICAgICAgICBtZ3Iuc2Vzc2lvbkludmFsaWRhdGVkKGdldElkSW50ZXJuYWwoKSk7CisgICAgICAgIHNldElzRGlydHkodHJ1ZSk7CisgICAgICAgIHN1cGVyLmV4cGlyZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgIFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlciBtZ3IgPShTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIpZ2V0TWFuYWdlcigpOworICAgICAgICBtZ3Iuc2Vzc2lvbkludmFsaWRhdGVkKGdldElkSW50ZXJuYWwoKSk7CisgICAgICAgIHNldElzRGlydHkodHJ1ZSk7CisgICAgICAgIHN1cGVyLmludmFsaWRhdGUoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlYWQgYSBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc2Vzc2lvbiBvYmplY3QgZnJvbQorICAgICAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlucHV0IHN0cmVhbSwgd2l0aG91dCByZXF1aXJpbmcgdGhhdCB0aGUKKyAgICAgKiBTdGFuZGFyZFNlc3Npb24gaXRzZWxmIGhhdmUgYmVlbiBzZXJpYWxpemVkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmVhbSBUaGUgb2JqZWN0IGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiB1bmtub3duIGNsYXNzIGlzIHNwZWNpZmllZAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlYWRPYmplY3REYXRhKE9iamVjdElucHV0U3RyZWFtIHN0cmVhbSkKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5yZWFkT2JqZWN0RGF0YShzdHJlYW0pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgY29udGVudHMgb2YgdGhpcyBzZXNzaW9uIG9iamVjdCB0bworICAgICAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0IG91dHB1dCBzdHJlYW0sIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgdGhlCisgICAgICogU3RhbmRhcmRTZXNzaW9uIGl0c2VsZiBoYXZlIGJlZW4gc2VyaWFsaXplZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIG9iamVjdCBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRvCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZU9iamVjdERhdGEoT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci53cml0ZU9iamVjdERhdGEoc3RyZWFtKTsKKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQsIGJvb2xlYW4gdGVsbE5ldykgeworCisgICAgICAgIGlmICgodGhpcy5pZCAhPSBudWxsKSAmJiAobWFuYWdlciAhPSBudWxsKSkKKyAgICAgICAgICAgIG1hbmFnZXIucmVtb3ZlKHRoaXMpOworCisgICAgICAgIHRoaXMuaWQgPSBpZDsKKworICAgICAgICBpZiAobWFuYWdlciAhPSBudWxsKQorICAgICAgICAgICAgbWFuYWdlci5hZGQodGhpcyk7CisgICAgICAgIGlmICh0ZWxsTmV3KSB0ZWxsTmV3KCk7CisgICAgfQorICAgIAorICAgIAorCisKKworCisKKworICAgIC8qKgorICAgICAqIHJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlc3Npb24gaXMgdGhlIHByaW1hcnkgc2Vzc2lvbiwgaWYgdGhhdCBpcyB0aGUKKyAgICAgKiBjYXNlLCB0aGUgbWFuYWdlciBjYW4gZXhwaXJlIGl0IHVwb24gdGltZW91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnlTZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gaXNQcmltYXJ5U2Vzc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgdGhpcyBpcyB0aGUgcHJpbWFyeSBzZXNzaW9uIG9yIG5vdC4KKyAgICAgKiBAcGFyYW0gcHJpbWFyeVNlc3Npb24gRmxhZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlTZXNzaW9uKGJvb2xlYW4gcHJpbWFyeVNlc3Npb24pIHsKKyAgICAgICAgdGhpcy5pc1ByaW1hcnlTZXNzaW9uPXByaW1hcnlTZXNzaW9uOworICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqIEltcGxlbWVudHMgYSBsb2cgbWV0aG9kIHRvIGxvZyB0aHJvdWdoIHRoZSBtYW5hZ2VyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisKKyAgICAgICAgaWYgKChtTWFuYWdlciAhPSBudWxsKSAmJiAobU1hbmFnZXIgaW5zdGFuY2VvZiBTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIpKSB7CisgICAgICAgICAgICAoKFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlcikgbU1hbmFnZXIpLmxvZy5kZWJ1ZygiUmVwbGljYXRlZFNlc3Npb246ICIgKyBtZXNzYWdlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVwbGljYXRlZFNlc3Npb246ICIgKyBtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgeCkgeworCisgICAgICAgIGlmICgobU1hbmFnZXIgIT0gbnVsbCkgJiYgKG1NYW5hZ2VyIGluc3RhbmNlb2YgU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyKSkgeworICAgICAgICAgICAgKChTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIpIG1NYW5hZ2VyKS5sb2cuZXJyb3IoIlJlcGxpY2F0ZWRTZXNzaW9uOiAiICsgbWVzc2FnZSx4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVwbGljYXRlZFNlc3Npb246ICIgKyBtZXNzYWdlKTsKKyAgICAgICAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJSZXBsaWNhdGVkU2Vzc2lvbiBpZD0iKTsKKyAgICAgICAgYnVmLmFwcGVuZChnZXRJZEludGVybmFsKCkpLmFwcGVuZCgiIHJlZj0iKS5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSkuYXBwZW5kKCJcbiIpOworICAgICAgICBqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IGdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgICAgIHdoaWxlICggZS5oYXNNb3JlRWxlbWVudHMoKSApIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcdG5hbWU9IikuYXBwZW5kKG5hbWUpLmFwcGVuZCgiOyB2YWx1ZT0iKS5hcHBlbmQodmFsdWUpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCJcdExhc3RBY2Nlc3M9IikuYXBwZW5kKGdldExhc3RBY2Nlc3NlZFRpbWUoKSkuYXBwZW5kKCJcbiIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorICAgIHB1YmxpYyBpbnQgZ2V0QWNjZXNzQ291bnQoKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3NDb3VudDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0QWNjZXNzQ291bnQoaW50IGFjY2Vzc0NvdW50KSB7CisgICAgICAgIHRoaXMuYWNjZXNzQ291bnQgPSBhY2Nlc3NDb3VudDsKKyAgICB9CisgICAgcHVibGljIGxvbmcgZ2V0TGFzdEFjY2Vzc2VkVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIGxhc3RBY2Nlc3NlZFRpbWU7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldExhc3RBY2Nlc3NlZFRpbWUobG9uZyBsYXN0QWNjZXNzZWRUaW1lKSB7CisgICAgICAgIHRoaXMubGFzdEFjY2Vzc2VkVGltZSA9IGxhc3RBY2Nlc3NlZFRpbWU7CisgICAgfQorICAgIHB1YmxpYyBsb25nIGdldFRoaXNBY2Nlc3NlZFRpbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzQWNjZXNzZWRUaW1lOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRUaGlzQWNjZXNzZWRUaW1lKGxvbmcgdGhpc0FjY2Vzc2VkVGltZSkgeworICAgICAgICB0aGlzLnRoaXNBY2Nlc3NlZFRpbWUgPSB0aGlzQWNjZXNzZWRUaW1lOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vUmVwbGljYXRpb25TdHJlYW0uamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL1JlcGxpY2F0aW9uU3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1NWYwMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL1JlcGxpY2F0aW9uU3RyZWFtLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb247CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzOworCisvKioKKyAqIEN1c3RvbSBzdWJjbGFzcyBvZiA8Y29kZT5PYmplY3RJbnB1dFN0cmVhbTwvY29kZT4gdGhhdCBsb2FkcyBmcm9tIHRoZQorICogY2xhc3MgbG9hZGVyIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gIFRoaXMgYWxsb3dzIGNsYXNzZXMgZGVmaW5lZCBvbmx5CisgKiB3aXRoIHRoZSB3ZWIgYXBwbGljYXRpb24gdG8gYmUgZm91bmQgY29ycmVjdGx5LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBCaXAgVGhlbGluCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgUmVwbGljYXRpb25TdHJlYW0gZXh0ZW5kcyBPYmplY3RJbnB1dFN0cmVhbSB7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyBsb2FkZXIgd2Ugd2lsbCB1c2UgdG8gcmVzb2x2ZSBjbGFzc2VzLgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIEN1c3RvbU9iamVjdElucHV0U3RyZWFtCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBpbnB1dCBzdHJlYW0gd2Ugd2lsbCByZWFkIGZyb20KKyAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgVGhlIGNsYXNzIGxvYWRlciB1c2VkIHRvIGluc3RhbnRpYXRlIG9iamVjdHMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBSZXBsaWNhdGlvblN0cmVhbShJbnB1dFN0cmVhbSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIHN1cGVyKHN0cmVhbSk7CisgICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBsb2NhbCBjbGFzcyBlcXVpdmFsZW50IG9mIHRoZSBzcGVjaWZpZWQgc3RyZWFtIGNsYXNzCisgICAgICogZGVzY3JpcHRpb24sIGJ5IHVzaW5nIHRoZSBjbGFzcyBsb2FkZXIgYXNzaWduZWQgdG8gdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzRGVzYyBDbGFzcyBkZXNjcmlwdGlvbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGlzIGNsYXNzIGNhbm5vdCBiZSBmb3VuZAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBDbGFzcyByZXNvbHZlQ2xhc3MoT2JqZWN0U3RyZWFtQ2xhc3MgY2xhc3NEZXNjKQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbmFtZSA9IGNsYXNzRGVzYy5nZXROYW1lKCk7CisgICAgICAgIGJvb2xlYW4gdHJ5UmVwRmlyc3QgPSBuYW1lLnN0YXJ0c1dpdGgoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3RlciIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCB0cnlSZXBGaXJzdCApIHJldHVybiBmaW5kUmVwbGljYXRpb25DbGFzcyhuYW1lKTsKKyAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBmaW5kV2ViYXBwQ2xhc3MobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiB4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRyeVJlcEZpcnN0ICkgcmV0dXJuIGZpbmRXZWJhcHBDbGFzcyhuYW1lKTsKKyAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBmaW5kUmVwbGljYXRpb25DbGFzcyhuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIucmVzb2x2ZUNsYXNzKGNsYXNzRGVzYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIENsYXNzIGZpbmRSZXBsaWNhdGlvbkNsYXNzKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZmluZFdlYmFwcENsYXNzKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgY2xhc3NMb2FkZXIpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9TZXJpYWxpemFibGVQcmluY2lwYWwuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL1NlcmlhbGl6YWJsZVByaW5jaXBhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NWZiMzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9TZXJpYWxpemFibGVQcmluY2lwYWwuamF2YQpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbjsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtOworCisKKy8qKgorICogR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPmphdmEuc2VjdXJpdHkuUHJpbmNpcGFsPC9zdHJvbmc+IHRoYXQKKyAqIGlzIGF2YWlsYWJsZSBmb3IgdXNlIGJ5IDxjb2RlPlJlYWxtPC9jb2RlPiBpbXBsZW1lbnRhdGlvbnMuCisgKiBUaGUgR2VuZXJpY1ByaW5jaXBhbCBkb2VzIE5PVCBpbXBsZW1lbnQgc2VyaWFsaXphYmxlIGFuZCBJIGRpZG4ndCB3YW50IHRvIGNoYW5nZSB0aGF0IGltcGxlbWVudGF0aW9uCisgKiBoZW5jZSBJIGltcGxlbWVudGVkIHRoaXMgb25lIGluc3RlYWQuCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5HZW5lcmljUHJpbmNpcGFsOworcHVibGljIGNsYXNzIFNlcmlhbGl6YWJsZVByaW5jaXBhbCAgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisgICAgcHVibGljIFNlcmlhbGl6YWJsZVByaW5jaXBhbCgpCisgICAgeworICAgICAgICBzdXBlcigpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgUHJpbmNpcGFsLCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBSZWFsbSwgZm9yIHRoZQorICAgICAqIHNwZWNpZmllZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhbG0gVGhlIFJlYWxtIHRoYXQgb3ducyB0aGlzIFByaW5jaXBhbAorICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1c2VybmFtZSBvZiB0aGUgdXNlciByZXByZXNlbnRlZCBieSB0aGlzIFByaW5jaXBhbAorICAgICAqIEBwYXJhbSBwYXNzd29yZCBDcmVkZW50aWFscyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIHVzZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VyaWFsaXphYmxlUHJpbmNpcGFsKFJlYWxtIHJlYWxtLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7CisKKyAgICAgICAgdGhpcyhyZWFsbSwgbmFtZSwgcGFzc3dvcmQsIG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgUHJpbmNpcGFsLCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBSZWFsbSwgZm9yIHRoZQorICAgICAqIHNwZWNpZmllZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQsIHdpdGggdGhlIHNwZWNpZmllZCByb2xlIG5hbWVzCisgICAgICogKGFzIFN0cmluZ3MpLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWxtIFRoZSBSZWFsbSB0aGF0IG93bnMgdGhpcyBwcmluY2lwYWwKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdXNlcm5hbWUgb2YgdGhlIHVzZXIgcmVwcmVzZW50ZWQgYnkgdGhpcyBQcmluY2lwYWwKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgQ3JlZGVudGlhbHMgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhpcyB1c2VyCisgICAgICogQHBhcmFtIHJvbGVzIExpc3Qgb2Ygcm9sZXMgKG11c3QgYmUgU3RyaW5ncykgcG9zc2Vzc2VkIGJ5IHRoaXMgdXNlcgorICAgICAqLworICAgIHB1YmxpYyBTZXJpYWxpemFibGVQcmluY2lwYWwoUmVhbG0gcmVhbG0sIFN0cmluZyBuYW1lLCBTdHJpbmcgcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCByb2xlcykgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMucmVhbG0gPSByZWFsbTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgICAgICBpZiAocm9sZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5yb2xlcyA9IG5ldyBTdHJpbmdbcm9sZXMuc2l6ZSgpXTsKKyAgICAgICAgICAgIHRoaXMucm9sZXMgPSAoU3RyaW5nW10pIHJvbGVzLnRvQXJyYXkodGhpcy5yb2xlcyk7CisgICAgICAgICAgICBpZiAodGhpcy5yb2xlcy5sZW5ndGggPiAwKQorICAgICAgICAgICAgICAgIEFycmF5cy5zb3J0KHRoaXMucm9sZXMpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlcm5hbWUgb2YgdGhlIHVzZXIgcmVwcmVzZW50ZWQgYnkgdGhpcyBQcmluY2lwYWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIGZvciB0aGUgdXNlciByZXByZXNlbnRlZCBieQorICAgICAqIHRoaXMgUHJpbmNpcGFsLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGFzc3dvcmQgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhc3N3b3JkKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBSZWFsbSB3aXRoIHdoaWNoIHRoaXMgUHJpbmNpcGFsIGlzIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBSZWFsbSByZWFsbSA9IG51bGw7CisKKyAgICBwdWJsaWMgUmVhbG0gZ2V0UmVhbG0oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5yZWFsbSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVhbG0oUmVhbG0gcmVhbG0pIHsKKyAgICAgICAgdGhpcy5yZWFsbSA9IHJlYWxtOworICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2Ygcm9sZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdXNlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJvbGVzW10gPSBuZXcgU3RyaW5nWzBdOworCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJvbGVzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucm9sZXMpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QsIHdoaWNoIGV4cG9zZXMgb25seQorICAgICAqIGluZm9ybWF0aW9uIHRoYXQgc2hvdWxkIGJlIHB1YmxpYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlNlcmlhbGl6YWJsZVByaW5jaXBhbFsiKTsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMubmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTZXJpYWxpemFibGVQcmluY2lwYWwgY3JlYXRlUHJpbmNpcGFsKEdlbmVyaWNQcmluY2lwYWwgcHJpbmNpcGFsKQorICAgIHsKKyAgICAgICAgaWYgKCBwcmluY2lwYWw9PW51bGwpIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6YWJsZVByaW5jaXBhbChwcmluY2lwYWwuZ2V0UmVhbG0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbmNpcGFsLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbmNpcGFsLmdldFBhc3N3b3JkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW5jaXBhbC5nZXRSb2xlcygpIT1udWxsP0FycmF5cy5hc0xpc3QocHJpbmNpcGFsLmdldFJvbGVzKCkpOm51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBHZW5lcmljUHJpbmNpcGFsIGdldFByaW5jaXBhbCggUmVhbG0gcmVhbG0gKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljUHJpbmNpcGFsKHJlYWxtLG5hbWUscGFzc3dvcmQsZ2V0Um9sZXMoKSE9bnVsbD9BcnJheXMuYXNMaXN0KGdldFJvbGVzKCkpOm51bGwpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIEdlbmVyaWNQcmluY2lwYWwgcmVhZFByaW5jaXBhbChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluLCBSZWFsbSByZWFsbSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb257CisgICAgICAgIFN0cmluZyBuYW1lID0gaW4ucmVhZFVURigpOworICAgICAgICBib29sZWFuIGhhc1B3ZCA9IGluLnJlYWRCb29sZWFuKCk7CisgICAgICAgIFN0cmluZyBwd2QgPSBudWxsOworICAgICAgICBpZiAoIGhhc1B3ZCApIHB3ZCA9IGluLnJlYWRVVEYoKTsKKyAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIFN0cmluZ1tdIHJvbGVzID0gbmV3IFN0cmluZ1tzaXplXTsKKyAgICAgICAgZm9yICggaW50IGk9MDsgaTxzaXplOyBpKysgKSByb2xlc1tpXSA9IGluLnJlYWRVVEYoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljUHJpbmNpcGFsKHJlYWxtLG5hbWUscHdkLEFycmF5cy5hc0xpc3Qocm9sZXMpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlUHJpbmNpcGFsKEdlbmVyaWNQcmluY2lwYWwgcCwgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZVVURihwLmdldE5hbWUoKSk7CisgICAgICAgIG91dC53cml0ZUJvb2xlYW4ocC5nZXRQYXNzd29yZCgpIT1udWxsKTsKKyAgICAgICAgaWYgKCBwLmdldFBhc3N3b3JkKCkhPSBudWxsICkgb3V0LndyaXRlVVRGKHAuZ2V0UGFzc3dvcmQoKSk7CisgICAgICAgIFN0cmluZ1tdIHJvbGVzID0gcC5nZXRSb2xlcygpOworICAgICAgICBpZiAoIHJvbGVzID09IG51bGwgKSByb2xlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIG91dC53cml0ZUludChyb2xlcy5sZW5ndGgpOworICAgICAgICBmb3IgKCBpbnQgaT0wOyBpPHJvbGVzLmxlbmd0aDsgaSsrICkgb3V0LndyaXRlVVRGKHJvbGVzW2ldKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vU2Vzc2lvbklETWVzc2FnZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vU2Vzc2lvbklETWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNjE4MmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9TZXNzaW9uSURNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1lc3NhZ2U7CisKKy8qKgorICogU2Vzc2lvbiBpZCBjaGFuZ2UgY2x1c3RlciBtZXNzYWdlCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFNlc3Npb25JRE1lc3NhZ2UgaW1wbGVtZW50cyBDbHVzdGVyTWVzc2FnZSB7CisKKwlwcml2YXRlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXIgYWRkcmVzczsKKworCXByaXZhdGUgaW50IG1lc3NhZ2VOdW1iZXI7CisKKwlwcml2YXRlIGxvbmcgdGltZXN0YW1wOworCisJcHJpdmF0ZSBTdHJpbmcgb3JpZ25hbFNlc3Npb25JRDsKKworCXByaXZhdGUgU3RyaW5nIGJhY2t1cFNlc3Npb25JRDsKKworCXByaXZhdGUgU3RyaW5nIGhvc3QgOworCXByaXZhdGUgU3RyaW5nIGNvbnRleHRQYXRoOworICAgIHByaXZhdGUgaW50IHJlc2VuZCA9IENsdXN0ZXJNZXNzYWdlLkZMQUdfREVGQVVMVCA7CisgICAgcHJpdmF0ZSBpbnQgY29tcHJlc3MgPSBDbHVzdGVyTWVzc2FnZS5GTEFHX0RFRkFVTFQgOworCisJcHVibGljIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXIgZ2V0QWRkcmVzcygpIHsKKwkJcmV0dXJuIGFkZHJlc3M7CisJfQorCisJcHVibGljIHZvaWQgc2V0QWRkcmVzcyhvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVtYmVyIGFkZHJlc3MpIHsKKwkJdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRPcmlnbmFsU2Vzc2lvbklEKCkpOworCQlyZXN1bHQuYXBwZW5kKCIjLSMiKTsKKwkJcmVzdWx0LmFwcGVuZChnZXRIb3N0KCkpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiMtIyIpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZ2V0Q29udGV4dFBhdGgoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiMtIyIpOworCQlyZXN1bHQuYXBwZW5kKGdldE1lc3NhZ2VOdW1iZXIoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiMtIyIpOworCQlyZXN1bHQuYXBwZW5kKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCS8qKgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGhvc3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7CisgICAgICAgICAgICAgcmV0dXJuIGhvc3Q7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBob3N0IFRoZSBob3N0IHRvIHNldC4KKyAgICAgICAgICovCisgICAgICAgICBwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7CisgICAgICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICAgICAgfQorICAgIAorCS8qKgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29udGV4dFBhdGguCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpIHsKKwkJcmV0dXJuIGNvbnRleHRQYXRoOworCX0KKwkvKioKKwkgKiBAcGFyYW0gY29udGV4dFBhdGggVGhlIGNvbnRleHRQYXRoIHRvIHNldC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb250ZXh0UGF0aChTdHJpbmcgY29udGV4dFBhdGgpIHsKKwkJdGhpcy5jb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoOworCX0KKwkvKioKKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1lc3NhZ2VOdW1iZXIuCisJICovCisJcHVibGljIGludCBnZXRNZXNzYWdlTnVtYmVyKCkgeworCQlyZXR1cm4gbWVzc2FnZU51bWJlcjsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbWVzc2FnZU51bWJlcgorCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2VOdW1iZXIgdG8gc2V0LgorCSAqLworCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VOdW1iZXIoaW50IG1lc3NhZ2VOdW1iZXIpIHsKKwkJdGhpcy5tZXNzYWdlTnVtYmVyID0gbWVzc2FnZU51bWJlcjsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRpbWVzdGFtcC4KKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7CisJCXJldHVybiB0aW1lc3RhbXA7CisJfQorCisJLyoqCisJICogQHBhcmFtIHRpbWVzdGFtcAorCSAqICAgICAgICAgICAgVGhlIHRpbWVzdGFtcCB0byBzZXQuCisJICovCisJcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKGxvbmcgdGltZXN0YW1wKSB7CisJCXRoaXMudGltZXN0YW1wID0gdGltZXN0YW1wOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYmFja3VwU2Vzc2lvbklELgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QmFja3VwU2Vzc2lvbklEKCkgeworCQlyZXR1cm4gYmFja3VwU2Vzc2lvbklEOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBiYWNrdXBTZXNzaW9uSUQKKwkgKiAgICAgICAgICAgIFRoZSBiYWNrdXBTZXNzaW9uSUQgdG8gc2V0LgorCSAqLworCXB1YmxpYyB2b2lkIHNldEJhY2t1cFNlc3Npb25JRChTdHJpbmcgYmFja3VwU2Vzc2lvbklEKSB7CisJCXRoaXMuYmFja3VwU2Vzc2lvbklEID0gYmFja3VwU2Vzc2lvbklEOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3JpZ25hbFNlc3Npb25JRC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE9yaWduYWxTZXNzaW9uSUQoKSB7CisJCXJldHVybiBvcmlnbmFsU2Vzc2lvbklEOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBvcmlnbmFsU2Vzc2lvbklECisJICogICAgICAgICAgICBUaGUgb3JpZ25hbFNlc3Npb25JRCB0byBzZXQuCisJICovCisJcHVibGljIHZvaWQgc2V0T3JpZ25hbFNlc3Npb25JRChTdHJpbmcgb3JpZ25hbFNlc3Npb25JRCkgeworCQl0aGlzLm9yaWduYWxTZXNzaW9uSUQgPSBvcmlnbmFsU2Vzc2lvbklEOworCX0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29tcHJlc3MuCisgICAgICogQHNpbmNlIDUuNS4xMCAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvbXByZXNzKCkgeworICAgICAgICByZXR1cm4gY29tcHJlc3M7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSBjb21wcmVzcyBUaGUgY29tcHJlc3MgdG8gc2V0LgorICAgICAqIEBzaW5jZSA1LjUuMTAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21wcmVzcyhpbnQgY29tcHJlc3MpIHsKKyAgICAgICAgdGhpcy5jb21wcmVzcyA9IGNvbXByZXNzOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlc2VuZC4KKyAgICAgKiBAc2luY2UgNS41LjEwCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZXNlbmQoKSB7CisgICAgICAgIHJldHVybiByZXNlbmQ7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSByZXNlbmQgVGhlIHJlc2VuZCB0byBzZXQuCisgICAgICogQHNpbmNlIDUuNS4xMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc2VuZChpbnQgcmVzZW5kKSB7CisgICAgICAgIHRoaXMucmVzZW5kID0gcmVzZW5kOworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL1Nlc3Npb25NZXNzYWdlLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9TZXNzaW9uTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZmU4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9TZXNzaW9uTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlOworCisvKioKKyAqCisgKiA8Qj5DbGFzcyBEZXNjcmlwdGlvbjo8L0I+PEJSPgorICogVGhlIFNlc3Npb25NZXNzYWdlIGNsYXNzIGlzIGEgY2xhc3MgdGhhdCBpcyB1c2VkIHdoZW4gYSBzZXNzaW9uIGhhcyBiZWVuCisgKiBjcmVhdGVkLCBtb2RpZmllZCwgZXhwaXJlZCBpbiBhIFRvbWNhdCBjbHVzdGVyIG5vZGUuPEJSPgorICoKKyAqIFRoZSBmb2xsb3dpbmcgZXZlbnRzIGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlOgorICogPHVsPgorICogICA8bGk+PHByZT5wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfU0VTU0lPTl9DUkVBVEVEPC9wcmU+PGxpPgorICogICA8bGk+PHByZT5wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfU0VTU0lPTl9BQ0NFU1NFRDwvcHJlPjxsaT4KKyAqICAgPGxpPjxwcmU+cHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX0FUVFJJQlVURV9BRERFRDwvcHJlPjxsaT4KKyAqICAgPGxpPjxwcmU+cHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX0FUVFJJQlVURV9SRU1PVkVEPC9wcmU+PGxpPgorICogICA8bGk+PHByZT5wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfU0VTU0lPTl9FWFBJUkVEX1dPTk9USUZZPC9wcmU+PGxpPgorICogICA8bGk+PHByZT5wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfU0VTU0lPTl9FWFBJUkVEX1dOT1RJRlk8L3ByZT48bGk+CisgKiAgIDxsaT48cHJlPnB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9HRVRfQUxMX1NFU1NJT05TPC9wcmU+PGxpPgorICogICA8bGk+PHByZT5wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfU0VUX1VTRVJfUFJJTkNJUEFMPC9wcmU+PGxpPgorICogICA8bGk+PHByZT5wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfU0VUX1NFU1NJT05fTk9URTwvcHJlPjxsaT4KKyAqICAgPGxpPjxwcmU+cHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX1JFTU9WRV9TRVNTSU9OX05PVEU8L3ByZT48bGk+CisgKiA8L3VsPgorICoKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFNlc3Npb25NZXNzYWdlIGV4dGVuZHMgQ2x1c3Rlck1lc3NhZ2UsIGphdmEuaW8uU2VyaWFsaXphYmxlCit7CisKKyAgICAvKioKKyAgICAgKiBFdmVudCB0eXBlIHVzZWQgd2hlbiBhIHNlc3Npb24gaGFzIGJlZW4gY3JlYXRlZCBvbiBhIG5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfU0VTU0lPTl9DUkVBVEVEID0gMTsKKyAgICAvKioKKyAgICAgKiBFdmVudCB0eXBlIHVzZWQgd2hlbiBhIHNlc3Npb24gaGFzIGV4cGlyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfU0VTU0lPTl9FWFBJUkVEID0gMjsKKworICAgIC8qKgorICAgICAqIEV2ZW50IHR5cGUgdXNlZCB3aGVuIGEgc2Vzc2lvbiBoYXMgYmVlbiBhY2Nlc3NlZCAoaWUsIGxhc3QgYWNjZXNzIHRpbWUKKyAgICAgKiBoYXMgYmVlbiB1cGRhdGVkLiBUaGlzIGlzIHVzZWQgc28gdGhhdCB0aGUgcmVwbGljYXRlZCBzZXNzaW9ucyB3aWxsIG5vdCBleHBpcmUKKyAgICAgKiBvbiB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9TRVNTSU9OX0FDQ0VTU0VEID0gMzsKKyAgICAvKioKKyAgICAgKiBFdmVudCB0eXBlIHVzZWQgd2hlbiBhIHNlcnZlciBjb21lcyBvbmxpbmUgZm9yIHRoZSBmaXJzdCB0aW1lLgorICAgICAqIFRoZSBmaXJzdCB0aGluZyB0aGUgbmV3bHkgc3RhcnRlZCBzZXJ2ZXIgd2FudHMgdG8gZG8gaXMgdG8gZ3JhYiB0aGUKKyAgICAgKiBhbGwgdGhlIHNlc3Npb25zIGZyb20gb25lIG9mIHRoZSBub2RlcyBhbmQga2VlcCB0aGUgc2FtZSBzdGF0ZSBpbiB0aGVyZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9HRVRfQUxMX1NFU1NJT05TID0gNDsKKyAgICAvKioKKyAgICAgKiBFdmVudCB0eXBlIHVzZWQgd2hlbiBhbiBhdHRyaWJ1dGUgaGFzIGJlZW4gYWRkZWQgdG8gYSBzZXNzaW9uLAorICAgICAqIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBzZW50IHRvIGFsbCB0aGUgb3RoZXIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfU0VTU0lPTl9ERUxUQSAgPSAxMzsKKworICAgIC8qKgorICAgICAqIFdoZW4gYSBzZXNzaW9uIHN0YXRlIGlzIHRyYW5zZmVycmVkLCB0aGlzIGlzIHRoZSBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfQUxMX1NFU1NJT05fREFUQSA9IDEyOworICAgIAorICAgIC8qKgorICAgICAqIFdoZW4gYSBzZXNzaW9uIHN0YXRlIGlzIGNvbXBsZXRlIHRyYW5zZmVycmVkLCB0aGlzIGlzIHRoZSBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfQUxMX1NFU1NJT05fVFJBTlNGRVJDT01QTEVURSA9IDE0OworICAgIAorCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0TmFtZSgpOworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXZlbnRUeXBlU3RyaW5nKCk7CisgICAgCisgICAgLyoqCisgICAgICogcmV0dXJucyB0aGUgZXZlbnQgdHlwZQorICAgICAqIEByZXR1cm4gb25lIG9mIHRoZSBldmVudCB0eXBlcyBFVlRfWFhYWAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCk7IAorICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHNlcmlhbGl6ZWQgZGF0YSBmb3IgdGhlIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldFNlc3Npb24oKTsKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXNzaW9uIElEIGZvciB0aGUgc2Vzc2lvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2Vzc2lvbklEKCk7CisgICAgCisKKworfS8vU2Vzc2lvbk1lc3NhZ2UKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL1Nlc3Npb25NZXNzYWdlSW1wbC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vU2Vzc2lvbk1lc3NhZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFiZDkxNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL1Nlc3Npb25NZXNzYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb247CisKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVtYmVyOworCisvKioKKyAqIFNlc3Npb24gY2x1c3RlciBtZXNzYWdlCisgKiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFNlc3Npb25NZXNzYWdlSW1wbCBpbXBsZW1lbnRzIFNlc3Npb25NZXNzYWdlLCBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgCisgICAgcHVibGljIFNlc3Npb25NZXNzYWdlSW1wbCgpIHsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoKKworICAgICAqIFByaXZhdGUgc2VyaWFsaXphYmxlIHZhcmlhYmxlcyB0byBrZWVwIHRoZSBtZXNzYWdlcyBzdGF0ZQorICAgICAqLworICAgIHByaXZhdGUgaW50IG1FdnRUeXBlID0gLTE7CisgICAgcHJpdmF0ZSBieXRlW10gbVNlc3Npb247CisgICAgcHJpdmF0ZSBTdHJpbmcgbVNlc3Npb25JRDsKKyAgICBwcml2YXRlIE1lbWJlciBtU3JjOworICAgIHByaXZhdGUgU3RyaW5nIG1Db250ZXh0TmFtZTsKKyAgICBwcml2YXRlIGxvbmcgc2VyaWFsaXphdGlvblRpbWVzdGFtcDsKKyAgICBwcml2YXRlIGJvb2xlYW4gdGltZXN0YW1wU2V0ID0gZmFsc2UgOworICAgIHByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkOworICAgIHByaXZhdGUgaW50IHJlc2VuZCA9IENsdXN0ZXJNZXNzYWdlLkZMQUdfREVGQVVMVCA7CisgICAgcHJpdmF0ZSBpbnQgY29tcHJlc3MgPSBDbHVzdGVyTWVzc2FnZS5GTEFHX0RFRkFVTFQgOworCisKKyAgICBwcml2YXRlIFNlc3Npb25NZXNzYWdlSW1wbCggU3RyaW5nIGNvbnRleHROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JRCkKKyAgICB7CisgICAgICAgIG1FdnRUeXBlID0gZXZlbnR0eXBlOworICAgICAgICBtU2Vzc2lvbiA9IHNlc3Npb247CisgICAgICAgIG1TZXNzaW9uSUQgPSBzZXNzaW9uSUQ7CisgICAgICAgIG1Db250ZXh0TmFtZSA9IGNvbnRleHROYW1lOworICAgICAgICB1bmlxdWVJZCA9IHNlc3Npb25JRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgc2Vzc2lvbiBtZXNzYWdlLiBEZXBlbmRpbmcgb24gd2hhdCBldmVudCB0eXBlIHlvdSB3YW50IHRoaXMKKyAgICAgKiBtZXNzYWdlIHRvIHJlcHJlc2VudCwgeW91IHBvcHVsYXRlIHRoZSBkaWZmZXJlbnQgcGFyYW1ldGVycyBpbiB0aGUgY29uc3RydWN0b3I8QlI+CisgICAgICAqIFRoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHkgZGVwZW5kZW50IG9uIHdoYXQgZXZlbnQgdHlwZSBhcmd1bWVudCB5b3UgdXNlOjxCUj4KKyAgICAgKiA8Qj5FVlRfU0VTU0lPTl9DUkVBVEVEPC9CPjxCUj4KKyAgICAgKiAgICBUaGUgcGFyYW1ldGVyczogc2Vzc2lvbiwgc2Vzc2lvbklEIG11c3QgYmUgc2V0LjxCUj4KKyAgICAgKiA8Qj5FVlRfU0VTU0lPTl9FWFBJUkVEPC9CPjxCUj4KKyAgICAgKiAgICBUaGUgcGFyYW1ldGVyczogc2Vzc2lvbklEIG11c3QgYmUgc2V0LjxCUj4KKyAgICAgKiA8Qj5FVlRfU0VTU0lPTl9BQ0NFU1NFRDwvQj48QlI+CisgICAgICogICAgVGhlIHBhcmFtZXRlcnM6IHNlc3Npb25JRCBtdXN0IGJlIHNldC48QlI+CisgICAgICogPEI+RVZUX1NFU1NJT05fRVhQSVJFRF9YWFhYPC9CPjxCUj4KKyAgICAgKiAgICBUaGUgcGFyYW1ldGVyczogc2Vzc2lvbklEIG11c3QgYmUgc2V0LjxCUj4KKyAgICAgKiA8Qj5FVlRfU0VTU0lPTl9ERUxUQTwvQj48QlI+CisgICAgICogICAgU2VuZCBhdHRyaWJ1dGUgZGVsdGEgKGFkZCx1cGRhdGUscmVtb3ZlIGF0dHJpYnV0ZSBvciBwcmluY2lwYWwsIC4uLikuPEJSPgorICAgICAqIDxCPkVWVF9BTExfU0VTU0lPTl9EQVRBPC9CPjxCUj4KKyAgICAgKiAgICBTZW5kIGNvbXBsZXRlIHNlcmlhbGl6ZXMgc2Vzc2lvbiBsaXN0PEJSPgorICAgICAqIDxCPkVWVF9BTExfU0VTU0lPTl9UUkFOU0ZFUkNPTVBMRVRFPC9CPjxCUj4KKyAgICAgKiAgICBzZW5kIHRoYXQgYWxsIHNlc3Npb24gc3RhdGUgaW5mb3JtYXRpb24gYXJlIHRyYW5zZmVyZWQKKyAgICAgKiAgICBhZnRlciBHRVRfQUxMX1NFU1NJT04gcmVjZWl2ZWQgZnJvbSB0aGlzIHNlbmRlci48QlI+CisgICAgICogQHBhcmFtIGNvbnRleHROYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgKGFwcGxpY2F0aW9uCisgICAgICogQHBhcmFtIGV2ZW50dHlwZSAtIG9uZSBvZiB0aGUgOCBldmVudCB0eXBlIGRlZmluZWQgaW4gdGhpcyBjbGFzcworICAgICAqIEBwYXJhbSBzZXNzaW9uIC0gdGhlIHNlcmlhbGl6ZWQgYnl0ZSBhcnJheSBvZiB0aGUgc2Vzc2lvbiBpdHNlbGYKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbklEIC0gdGhlIGlkIHRoYXQgaWRlbnRpZmllcyB0aGlzIHNlc3Npb24KKyAgICAgKiBAcGFyYW0gdW5pcXVlSUQgLSB0aGUgaWQgdGhhdCBpZGVudGlmaWVzIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uTWVzc2FnZUltcGwoIFN0cmluZyBjb250ZXh0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlSUQpCisgICAgeworICAgICAgICB0aGlzKGNvbnRleHROYW1lLGV2ZW50dHlwZSxzZXNzaW9uLHNlc3Npb25JRCk7CisgICAgICAgIHVuaXF1ZUlkID0gdW5pcXVlSUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJucyB0aGUgZXZlbnQgdHlwZQorICAgICAqIEByZXR1cm4gb25lIG9mIHRoZSBldmVudCB0eXBlcyBFVlRfWFhYWAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgeyByZXR1cm4gbUV2dFR5cGU7IH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHNlcmlhbGl6ZWQgZGF0YSBmb3IgdGhlIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldFNlc3Npb24oKSB7IHJldHVybiBtU2Vzc2lvbjt9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXNzaW9uIElEIGZvciB0aGUgc2Vzc2lvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2Vzc2lvbklEKCl7IHJldHVybiBtU2Vzc2lvbklEOyB9CisgICAgCisgICAgLyoqCisgICAgICogc2V0IG1lc3NhZ2Ugc2VuZCB0aW1lIGJ1dCBvbmx5IHRoZSBmaXJzdCBzZXR0aW5nIHdvcmtzIChvbmUgc2hvdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAobG9uZyB0aW1lKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBpZighdGltZXN0YW1wU2V0KSB7CisgICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvblRpbWVzdGFtcD10aW1lOworICAgICAgICAgICAgICAgIHRpbWVzdGFtcFNldCA9IHRydWUgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsgcmV0dXJuIHNlcmlhbGl6YXRpb25UaW1lc3RhbXA7fQorICAgIAorICAgIC8qKgorICAgICAqIGNsZWFyIHRleHQgZXZlbnQgdHlwZSBuYW1lIChmb3IgbG9nZ2luZyBwdXJwb3NlIG9ubHkpIAorICAgICAqIEByZXR1cm4gdGhlIGV2ZW50IHR5cGUgaW4gYSBzdHJpbmcgcmVwcmVzZW50YXRpbmcsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFdmVudFR5cGVTdHJpbmcoKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChtRXZ0VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBFVlRfU0VTU0lPTl9DUkVBVEVEIDogcmV0dXJuICJTRVNTSU9OLU1PRElGSUVEIjsKKyAgICAgICAgICAgIGNhc2UgRVZUX1NFU1NJT05fRVhQSVJFRCA6IHJldHVybiAiU0VTU0lPTi1FWFBJUkVEIjsKKyAgICAgICAgICAgIGNhc2UgRVZUX1NFU1NJT05fQUNDRVNTRUQgOiByZXR1cm4gIlNFU1NJT04tQUNDRVNTRUQiOworICAgICAgICAgICAgY2FzZSBFVlRfR0VUX0FMTF9TRVNTSU9OUyA6IHJldHVybiAiU0VTU0lPTi1HRVQtQUxMIjsKKyAgICAgICAgICAgIGNhc2UgRVZUX1NFU1NJT05fREVMVEEgOiByZXR1cm4gIlNFU1NJT04tREVMVEEiOworICAgICAgICAgICAgY2FzZSBFVlRfQUxMX1NFU1NJT05fREFUQSA6IHJldHVybiAiQUxMLVNFU1NJT04tREFUQSI7CisgICAgICAgICAgICBjYXNlIEVWVF9BTExfU0VTU0lPTl9UUkFOU0ZFUkNPTVBMRVRFIDogcmV0dXJuICJTRVNTSU9OLVNUQVRFLVRSQU5TRkVSRUQiOworICAgICAgICAgICAgZGVmYXVsdCA6IHJldHVybiAiVU5LTk9XTi1FVkVOVC1UWVBFIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYWRkcmVzcyB0aGF0IHRoaXMgbWVzc2FnZSBvcmlnaW5hdGVkIGZyb20uICBUaGlzIHdvdWxkIGJlIHNldAorICAgICAqIGlmIHRoZSBtZXNzYWdlIHdhcyBiZWluZyByZWxheWVkIGZyb20gYSBob3N0IG90aGVyIHRoYW4gdGhlIG9uZQorICAgICAqIHRoYXQgb3JpZ2luYWxseSBzZW50IGl0LgorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXIgZ2V0QWRkcmVzcygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5tU3JjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byBzZXQgdGhlIGFkZHJlc3MgdGhhdCB0aGlzIG1lc3NhZ2Ugb3JpZ2luYXRlZCBmcm9tLgorICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgd2hlbiByZS1zZW5kaW5nIHRoZSBFVlRfR0VUX0FMTF9TRVNTSU9OUyBtZXNzYWdlIHRvCisgICAgICogYW5vdGhlciBtYWNoaW5lIGluIHRoZSBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKE1lbWJlciBzcmMpCisgICAgeworICAgICAgICB0aGlzLm1TcmMgPSBzcmM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0TmFtZSgpIHsKKyAgICAgICByZXR1cm4gbUNvbnRleHROYW1lOworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworICAgICAgICByZXR1cm4gdW5pcXVlSWQ7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworICAgICAgICB0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb21wcmVzcy4KKyAgICAgKiBAc2luY2UgNS41LjEwIAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q29tcHJlc3MoKSB7CisgICAgICAgIHJldHVybiBjb21wcmVzczsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIGNvbXByZXNzIFRoZSBjb21wcmVzcyB0byBzZXQuCisgICAgICogQHNpbmNlIDUuNS4xMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzKGludCBjb21wcmVzcykgeworICAgICAgICB0aGlzLmNvbXByZXNzID0gY29tcHJlc3M7CisgICAgfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVzZW5kLgorICAgICAqIEBzaW5jZSA1LjUuMTAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlc2VuZCgpIHsKKyAgICAgICAgcmV0dXJuIHJlc2VuZDsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIHJlc2VuZCBUaGUgcmVzZW5kIHRvIHNldC4KKyAgICAgKiBAc2luY2UgNS41LjEwCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzZW5kKGludCByZXNlbmQpIHsKKyAgICAgICAgdGhpcy5yZXNlbmQgPSByZXNlbmQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9TaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL1NpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYWYxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9TaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDY1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2F0YWxpbmFDbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkdlbmVyaWNQcmluY2lwYWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlN0YW5kYXJkTWFuYWdlcjsKKworLyoqCisgKiBUaXRsZTogICAgICAgIFRvbWNhdCBTZXNzaW9uIFJlcGxpY2F0aW9uIGZvciBUb21jYXQgNC4wIDxCUj4KKyAqIERlc2NyaXB0aW9uOiAgQSB2ZXJ5IHNpbXBsZSBzdHJhaWdodCBmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mCisgKiAgICAgICAgICAgICAgIHNlc3Npb24gcmVwbGljYXRpb24gb2Ygc2VydmVycyBpbiBhIGNsdXN0ZXIuPEJSPgorICogICAgICAgICAgICAgICBUaGlzIHNlc3Npb24gcmVwbGljYXRpb24gaXMgaW1wbGVtZW50ZWQgImxpdmUiLiBCeSBsaXZlCisgKiAgICAgICAgICAgICAgIEkgbWVhbiwgd2hlbiBhIHNlc3Npb24gYXR0cmlidXRlIGlzIGFkZGVkIGludG8gYSBzZXNzaW9uIG9uIE5vZGUgQQorICogICAgICAgICAgICAgICBhIG1lc3NhZ2UgaXMgYnJvYWRjYXN0ZWQgdG8gb3RoZXIgbWVzc2FnZXMgYW5kIHNldEF0dHJpYnV0ZSBpcyBjYWxsZWQgb24gdGhlCisgKiAgICAgICAgICAgICAgIHJlcGxpY2F0ZWQgc2Vzc2lvbnMuPEJSPgorICogICAgICAgICAgICAgICBBIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgZm91bmQgdW5kZXIKKyAqICAgICAgICAgICAgICAgPGhyZWY9Imh0dHA6Ly93d3cuZmlsaXAubmV0L3RvbWNhdC8iPkZpbGlwJ3MgVG9tY2F0IFBhZ2U8L2E+PEJSPgorICoKKyAqIENvcHlyaWdodDogICAgU2VlIGFwYWNoZSBsaWNlbnNlCisgKiBDb21wYW55OiAgICAgIHd3dy5maWxpcC5uZXQKKyAqIEBhdXRob3IgIDxhIGhyZWY9Im1haWx0bzptYWlsQGZpbGlwLm5ldCI+RmlsaXAgSGFuaWs8L2E+CisgKiBAYXV0aG9yIEJlbGEgQmFuIChtb2RpZmljYXRpb25zIGZvciBzeW5jaHJvbm91cyByZXBsaWNhdGlvbikKKyAqIEB2ZXJzaW9uIDEuMCBmb3IgVEMgNC4wCisgKiBEZXNjcmlwdGlvbjogVGhlIEluTWVtb3J5UmVwbGljYXRpb25NYW5hZ2VyIGlzIGEgc2Vzc2lvbiBtYW5hZ2VyIHRoYXQgcmVwbGljYXRlZAorICogc2Vzc2lvbiBpbmZvcm1hdGlvbiBpbiBtZW1vcnkuIEl0IHVzZXMgPGEgaHJlZj0id3d3LmphdmFncm91cHMuY29tIj5KYXZhR3JvdXBzPC9hPiBhcworICogYSBjb21tdW5pY2F0aW9uIHByb3RvY29sIHRvIGVuc3VyZSBndWFyYW50ZWVkIGFuZCBvcmRlcmVkIG1lc3NhZ2UgZGVsaXZlcnkuCisgKiBKYXZhR3JvdXBzIGFsc28gcHJvdmlkZXMgYSB2ZXJ5IGZsZXhpYmxlIHByb3RvY29sIHN0YWNrIHRvIGVuc3VyZSB0aGF0IHRoZSByZXBsaWNhdGlvbgorICogY2FuIGJlIHVzZWQgaW4gYW55IGVudmlyb25tZW50LgorICogPEJSPjxCUj4KKyAqIFRoZSBJbk1lbW9yeVJlcGxpY2F0aW9uTWFuYWdlciBleHRlbmRzIHRoZSBTdGFuZGFyZE1hbmFnZXIgaGVuY2UgaXQgYWxsb3dzIGZvciB1cworICogdG8gaW5oZXJpdCBhbGwgdGhlIGJhc2ljIHNlc3Npb24gbWFuYWdlbWVudCBmZWF0dXJlcyBsaWtlIGV4cGlyYXRpb24sIHNlc3Npb24gbGlzdGVuZXJzIGV0YworICogPEJSPjxCUj4KKyAqIFRvIGNvbW11bmljYXRlIHdpdGggb3RoZXIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIsIHRoZSBJbk1lbW9yeVJlcGxpY2F0aW9uTWFuYWdlciBzZW5kcyBvdXQgNyBkaWZmZXJlbnQgdHlwZSBvZiBtdWx0aWNhc3QgbWVzc2FnZXMKKyAqIGFsbCBkZWZpbmVkIGluIHRoZSBTZXNzaW9uTWVzc2FnZSBjbGFzcy48QlI+CisgKiBXaGVuIGEgc2Vzc2lvbiBpcyByZXBsaWNhdGVkIChub3QgYW4gYXR0cmlidXRlIGFkZGVkL3JlbW92ZWQpIHRoZSBzZXNzaW9uIGlzIHNlcmlhbGl6ZWQgaW50bworICogYSBieXRlIGFycmF5IHVzaW5nIHRoZSBTdGFuZGFyZFNlc3Npb24ucmVhZE9iamVjdERhdGEsIFN0YW5kYXJkU2Vzc2lvbi53cml0ZU9iamVjdERhdGEgbWV0aG9kcy4KKyAqLworcHVibGljIGNsYXNzIFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlciBleHRlbmRzIFN0YW5kYXJkTWFuYWdlcgoraW1wbGVtZW50cyBDbHVzdGVyTWFuYWdlcgoreworICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIuY2xhc3MgKTsKKworICAgIC8vdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbgorICAgIHByb3RlY3RlZCBTdHJpbmcgbUNoYW5uZWxDb25maWcgPSBudWxsOworCisgICAgLy90aGUgZ3JvdXAgbmFtZQorICAgIHByb3RlY3RlZCBTdHJpbmcgbUdyb3VwTmFtZSA9ICJUb21jYXRSZXBsaWNhdGlvbiI7CisKKyAgICAvL3NvbWVob3cgc3RhcnQoKSBnZXRzIGNhbGxlZCBtb3JlIHRoYW4gb25jZQorICAgIHByb3RlY3RlZCBib29sZWFuIG1DaGFubmVsU3RhcnRlZCA9IGZhbHNlOworCisgICAgLy9sb2cgdG8gc2NyZWVuCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbVByaW50VG9TY3JlZW4gPSB0cnVlOworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdE1vZGUgPSBmYWxzZTsKKworICAgIHByb3RlY3RlZCBib29sZWFuIG1NYW5hZ2VyUnVubmluZyA9IGZhbHNlOworCisgICAgLyoqIFVzZSBzeW5jaHJvbm91cyByYXRoZXIgdGhhbiBhc3luY2hyb25vdXMgcmVwbGljYXRpb24uIEV2ZXJ5IHNlc3Npb24gbW9kaWZpY2F0aW9uIChjcmVhdGlvbiwgY2hhbmdlLCByZW1vdmFsIGV0YykKKyAgICAgKiB3aWxsIGJlIHNlbnQgdG8gYWxsIG1lbWJlcnMuIFRoZSBjYWxsIHdpbGwgdGhlbiB3YWl0IGZvciBtYXggbWlsbGlzZWNvbmRzLCBvciBmb3JldmVyIChpZiB0aW1lb3V0IGlzIDApIGZvcgorICAgICAqIGFsbCByZXNwb25zZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3luY2hyb25vdXNSZXBsaWNhdGlvbj10cnVlOworCisgICAgLyoqIFNldCB0byB0cnVlIGlmIHdlIGRvbid0IHdhbnQgdGhlIHNlc3Npb25zIHRvIGV4cGlyZSBvbiBzaHV0ZG93biAqLworICAgIHByb3RlY3RlZCBib29sZWFuIG1FeHBpcmVTZXNzaW9uc09uU2h1dGRvd24gPSB0cnVlOworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlRGlydHlGbGFnID0gZmFsc2U7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkaXN0cmlidXRhYmxlID0gdHJ1ZTsKKworICAgIHByb3RlY3RlZCBDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcjsKKworICAgIHByb3RlY3RlZCBqYXZhLnV0aWwuSGFzaE1hcCBpbnZhbGlkYXRlZFNlc3Npb25zID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIGtlZXAgdHJhY2sgaWYgdGhlIHN0YXRlIGhhcyBiZWVuIHRyYW5zZmVycmVkIG9yIG5vdAorICAgICAqIEFzc3VtZXMgZmFsc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhdGVUcmFuc2ZlcnJlZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBub3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uOworICAgIHByaXZhdGUgYm9vbGVhbiBzZW5kQ2x1c3RlckRvbWFpbk9ubHkgPSB0cnVlIDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLCBqdXN0IGNhbGxzIHN1cGVyKCkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIoKQorICAgIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbmRDbHVzdGVyRG9tYWluT25seSgpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRDbHVzdGVyRG9tYWluT25seTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIHNlbmRDbHVzdGVyRG9tYWluT25seSBUaGUgc2VuZENsdXN0ZXJEb21haW5Pbmx5IHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZW5kQ2x1c3RlckRvbWFpbk9ubHkoYm9vbGVhbiBzZW5kQ2x1c3RlckRvbWFpbk9ubHkpIHsKKyAgICAgICAgdGhpcy5zZW5kQ2x1c3RlckRvbWFpbk9ubHkgPSBzZW5kQ2x1c3RlckRvbWFpbk9ubHk7CisgICAgfQorICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlZmF1bHRNb2RlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE1vZGUoKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0TW9kZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIGRlZmF1bHRNb2RlIFRoZSBkZWZhdWx0TW9kZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdE1vZGUoYm9vbGVhbiBkZWZhdWx0TW9kZSkgeworICAgICAgICB0aGlzLmRlZmF1bHRNb2RlID0gZGVmYXVsdE1vZGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzTWFuYWdlclJ1bm5pbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1NYW5hZ2VyUnVubmluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VEaXJ0eUZsYWcoYm9vbGVhbiB1c2VkaXJ0eWZsYWcpCisgICAgeworICAgICAgICB0aGlzLnVzZURpcnR5RmxhZyA9IHVzZWRpcnR5ZmxhZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBpcmVTZXNzaW9uc09uU2h1dGRvd24oYm9vbGVhbiBleHBpcmVTZXNzaW9uc09uU2h1dGRvd24pCisgICAgeworICAgICAgICBtRXhwaXJlU2Vzc2lvbnNPblNodXRkb3duID0gZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXIoQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIpIHsKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkNsdXN0ZXIgYXNzb2NpYXRlZCB3aXRoIFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlciIpOworICAgICAgICB0aGlzLmNsdXN0ZXIgPSBjbHVzdGVyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEV4cGlyZVNlc3Npb25zT25TaHV0ZG93bigpCisgICAgeworICAgICAgICByZXR1cm4gbUV4cGlyZVNlc3Npb25zT25TaHV0ZG93bjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcmludFRvU2NyZWVuKGJvb2xlYW4gcHJpbnR0b3NjcmVlbikKKyAgICB7CisgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXR0aW5nIHNjcmVlbiBkZWJ1ZyB0bzoiK3ByaW50dG9zY3JlZW4pOworICAgICAgICBtUHJpbnRUb1NjcmVlbiA9IHByaW50dG9zY3JlZW47CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3luY2hyb25vdXNSZXBsaWNhdGlvbihib29sZWFuIGZsYWcpCisgICAgeworICAgICAgICBzeW5jaHJvbm91c1JlcGxpY2F0aW9uPWZsYWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgcGVyc2lzdGVuY2Ugc2luY2UgdGhleSBkb24ndCBnbyBoYW5kIGluIGhhbmQgd2l0aCByZXBsaWNhdGlvbiBmb3Igbm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVubG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICggIWdldERpc3RyaWJ1dGFibGUoKSApIHsKKyAgICAgICAgICAgIHN1cGVyLnVubG9hZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIEhUVFAgc2Vzc2lvbi4KKyAgICAgKiBNb3N0IG9mIHRoZSBjb2RlIGluIGhlcmUgaXMgY29waWVkIGZyb20gdGhlIFN0YW5kYXJkTWFuYWdlci4KKyAgICAgKiBUaGlzIGlzIG5vdCBwcmV0dHksIHllYWggSSBrbm93LCBidXQgaXQgd2FzIG5lY2Vzc2FyeSBzaW5jZSB0aGUKKyAgICAgKiBTdGFuZGFyZE1hbmFnZXIgaGFkIGhhcmQgY29kZWQgdGhlIHNlc3Npb24gaW5zdGFudGlhdGlvbiB0byB0aGUgYQorICAgICAqIFN0YW5kYXJkU2Vzc2lvbiwgd2hlbiB3ZSBhY3R1YWxseSB3YW50IHRvIGluc3RhbnRpYXRlIGEgUmVwbGljYXRlZFNlc3Npb248QlI+CisgICAgICogSWYgdGhlIGNhbGwgY29tZXMgZnJvbSB0aGUgVG9tY2F0IHNlcnZsZXQgZW5naW5lLCBhIFNlc3Npb25NZXNzYWdlIGdvZXMgb3V0IHRvIHRoZSBvdGhlcgorICAgICAqIG5vZGVzIGluIHRoZSBjbHVzdGVyIHRoYXQgdGhpcyBzZXNzaW9uIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgICogQHBhcmFtIG5vdGlmeSAtIGlmIHNldCB0byB0cnVlIHRoZSBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3RlciB3aWxsIGJlIG5vdGlmaWVkLgorICAgICAqICAgICAgICAgICAgICAgICBUaGlzIGZsYWcgaXMgbmVlZGVkIHNvIHRoYXQgd2UgY2FuIGNyZWF0ZSBhIHNlc3Npb24gYmVmb3JlIHdlIGRlc2VyaWFsaXplCisgICAgICogICAgICAgICAgICAgICAgIGEgcmVwbGljYXRlZCBvbmUKKyAgICAgKgorICAgICAqIEBzZWUgUmVwbGljYXRlZFNlc3Npb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKFN0cmluZyBzZXNzaW9uSWQsIGJvb2xlYW4gbm90aWZ5LCBib29sZWFuIHNldElkKQorICAgIHsKKworICAgICAgICAvL2luaGVyaXRlZCBmcm9tIHRoZSBiYXNpYyBtYW5hZ2VyCisgICAgICAgIGlmICgoZ2V0TWF4QWN0aXZlU2Vzc2lvbnMoKSA+PSAwKSAmJgorICAgICAgICAgICAoc2Vzc2lvbnMuc2l6ZSgpID49IGdldE1heEFjdGl2ZVNlc3Npb25zKCkpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihzbS5nZXRTdHJpbmcoInN0YW5kYXJkTWFuYWdlci5jcmVhdGVTZXNzaW9uLmlzZSIpKTsKKworCisgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG5ldyBSZXBsaWNhdGVkU2Vzc2lvbih0aGlzKTsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBuZXcgc2Vzc2lvbiBhbmQgcmV0dXJuIGl0CisgICAgICAgIHNlc3Npb24uc2V0TmV3KHRydWUpOworICAgICAgICBzZXNzaW9uLnNldFZhbGlkKHRydWUpOworICAgICAgICBzZXNzaW9uLnNldENyZWF0aW9uVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIHNlc3Npb24uc2V0TWF4SW5hY3RpdmVJbnRlcnZhbCh0aGlzLm1heEluYWN0aXZlSW50ZXJ2YWwpOworICAgICAgICBpZihzZXNzaW9uSWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHNlc3Npb25JZCA9IGdlbmVyYXRlU2Vzc2lvbklkKCk7CisgICAgICAgIGlmICggc2V0SWQgKSBzZXNzaW9uLnNldElkKHNlc3Npb25JZCk7CisgICAgICAgIGlmICggbm90aWZ5ICYmIChjbHVzdGVyIT1udWxsKSApIHsKKyAgICAgICAgICAgICgoUmVwbGljYXRlZFNlc3Npb24pc2Vzc2lvbikuc2V0SXNEaXJ0eSh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHNlc3Npb24pOworICAgIH0vL2NyZWF0ZVNlc3Npb24KKworICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIE9WRVJSSURFIFRIRVNFIE1FVEhPRFMgVE8gSU1QTEVNRU5UIFRIRSBSRVBMSUNBVElPTgorICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuZCByZXR1cm4gYSBuZXcgc2Vzc2lvbiBvYmplY3QsIGJhc2VkIG9uIHRoZSBkZWZhdWx0CisgICAgICogc2V0dGluZ3Mgc3BlY2lmaWVkIGJ5IHRoaXMgTWFuYWdlcidzIHByb3BlcnRpZXMuICBUaGUgc2Vzc2lvbgorICAgICAqIGlkIHdpbGwgYmUgYXNzaWduZWQgYnkgdGhpcyBtZXRob2QsIGFuZCBhdmFpbGFibGUgdmlhIHRoZSBnZXRJZCgpCisgICAgICogbWV0aG9kIG9mIHRoZSByZXR1cm5lZCBzZXNzaW9uLiAgSWYgYSBuZXcgc2Vzc2lvbiBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAqIGZvciBhbnkgcmVhc29uLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIG5ldyBzZXNzaW9uIGNhbm5vdCBiZQorICAgICAqICBpbnN0YW50aWF0ZWQgZm9yIGFueSByZWFzb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKFN0cmluZyBzZXNzaW9uSWQpCisgICAgeworICAgICAgICAvL2NyZWF0ZSBhIHNlc3Npb24gYW5kIG5vdGlmeSB0aGUgb3RoZXIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gIGNyZWF0ZVNlc3Npb24oc2Vzc2lvbklkLGdldERpc3RyaWJ1dGFibGUoKSx0cnVlKTsKKyAgICAgICAgYWRkKHNlc3Npb24pOworICAgICAgICByZXR1cm4gc2Vzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uSW52YWxpZGF0ZWQoU3RyaW5nIHNlc3Npb25JZCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBpbnZhbGlkYXRlZFNlc3Npb25zICkgeworICAgICAgICAgICAgaW52YWxpZGF0ZWRTZXNzaW9ucy5wdXQoc2Vzc2lvbklkLCBzZXNzaW9uSWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldEludmFsaWRhdGVkU2Vzc2lvbnMoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIGludmFsaWRhdGVkU2Vzc2lvbnMgKSB7CisgICAgICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2ludmFsaWRhdGVkU2Vzc2lvbnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIGludmFsaWRhdGVkU2Vzc2lvbnMudmFsdWVzKCkudG9BcnJheShyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIENsdXN0ZXJNZXNzYWdlIHJlcXVlc3RDb21wbGV0ZWQoU3RyaW5nIHNlc3Npb25JZCkKKyAgICB7CisgICAgICAgIGlmICggICFnZXREaXN0cmlidXRhYmxlKCkgKSB7CisgICAgICAgICAgICBsb2cud2FybigiUmVjZWl2ZWQgcmVxdWVzdENvbXBsZXRlZCBtZXNzYWdlLCBhbHRob3VnaCB0aGlzIGNvbnRleHRbIisKKyAgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKSsiXSBpcyBub3QgZGlzdHJpYnV0YWJsZS4gSWdub3JpbmcgbWVzc2FnZSIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy9ub3RpZnkgamF2YWdyb3VwcworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpbnZhbGlkYXRlZFNlc3Npb25zLmdldChzZXNzaW9uSWQpICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICggaW52YWxpZGF0ZWRTZXNzaW9ucyApIHsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZWRTZXNzaW9ucy5yZW1vdmUoc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbXNnID0gbmV3IFNlc3Npb25NZXNzYWdlSW1wbChuYW1lLAorICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9FWFBJUkVELAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFJlcGxpY2F0ZWRTZXNzaW9uIHNlc3Npb24gPSAoUmVwbGljYXRlZFNlc3Npb24pIGZpbmRTZXNzaW9uKAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIHNlc3Npb24gaXMgbm90IGRpcnR5CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VEaXJ0eUZsYWcgJiYgKCFzZXNzaW9uLmlzRGlydHkoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vYnV0IGJlZm9yZSB3ZSByZXR1cm4gZG9pbmcgbm90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vc2VlIGlmIHdlIHNob3VsZCBzZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAvL2FuIHVwZGF0ZWQgbGFzdCBhY2Nlc3MgbWVzc2FnZSBzbyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAvL3Nlc3Npb25zIGFjcm9zcyBjbHVzdGVyIGRvbnQgZXhwaXJlCisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGludGVydmFsID0gc2Vzc2lvbi5nZXRNYXhJbmFjdGl2ZUludGVydmFsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxhc3RhY2NkaXN0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0TGFzdEFjY2Vzc1dhc0Rpc3RyaWJ1dGVkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGludGVydmFsKjEwMDAgPCAzICogbGFzdGFjY2Rpc3QgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgYWNjbXNnID0gbmV3IFNlc3Npb25NZXNzYWdlSW1wbChuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9BQ0NFU1NFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0TGFzdEFjY2Vzc1dhc0Rpc3RyaWJ1dGVkKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjbXNnOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnNldElzRGlydHkoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZW5kaW5nIHNlc3Npb24gdG8gY2x1c3Rlcj0iICsgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkge30KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZSBtc2cgPSBuZXcgU2Vzc2lvbk1lc3NhZ2VJbXBsKG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9DUkVBVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTZXNzaW9uKHNlc3Npb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJZEludGVybmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldElkSW50ZXJuYWwoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgICAgICAgICAgfSAvL2VuZCBpZgorICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4ICkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gcmVwbGljYXRlIHNlc3Npb24iLHgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZSBhIHNlc3Npb24gaW50byBhIGJ5dGUgYXJyYXk8QlI+CisgICAgICogVGhpcyBtZXRob2Qgc2ltcGxlIGNhbGxzIHRoZSB3cml0ZU9iamVjdERhdGEgbWV0aG9kIG9uIHRoZSBzZXNzaW9uCisgICAgICogYW5kIHJldHVybnMgdGhlIGJ5dGUgZGF0YSBmcm9tIHRoYXQgY2FsbAorICAgICAqIEBwYXJhbSBzZXNzaW9uIC0gdGhlIHNlc3Npb24gdG8gYmUgc2VyaWFsaXplZAorICAgICAqIEByZXR1cm4gYSBieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIHNlc3Npb24gZGF0YSwgbnVsbCBpZiB0aGUgc2VyaWFsaXphdGlvbiBmYWlsZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIHdyaXRlU2Vzc2lvbiggU2Vzc2lvbiBzZXNzaW9uICkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBzZXNzaW9uX2RhdGEgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHNlc3Npb25fb3V0ID0gbmV3IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKHNlc3Npb25fZGF0YSk7CisgICAgICAgICAgICBzZXNzaW9uX291dC5mbHVzaCgpOworICAgICAgICAgICAgYm9vbGVhbiBoYXNQcmluY2lwYWwgPSBzZXNzaW9uLmdldFByaW5jaXBhbCgpICE9IG51bGw7CisgICAgICAgICAgICBzZXNzaW9uX291dC53cml0ZUJvb2xlYW4oaGFzUHJpbmNpcGFsKTsKKyAgICAgICAgICAgIGlmICggaGFzUHJpbmNpcGFsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uX291dC53cml0ZU9iamVjdChTZXJpYWxpemFibGVQcmluY2lwYWwuY3JlYXRlUHJpbmNpcGFsKChHZW5lcmljUHJpbmNpcGFsKXNlc3Npb24uZ2V0UHJpbmNpcGFsKCkpKTsKKyAgICAgICAgICAgIH0vL2VuZCBpZgorICAgICAgICAgICAgKChSZXBsaWNhdGVkU2Vzc2lvbilzZXNzaW9uKS53cml0ZU9iamVjdERhdGEoc2Vzc2lvbl9vdXQpOworICAgICAgICAgICAgcmV0dXJuIHNlc3Npb25fZGF0YS50b0J5dGVBcnJheSgpOworCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24geCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIHNlcmlhbGl6ZSB0aGUgc2Vzc2lvbiEiLHgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlaW5zdGFudGlhdGVzIGEgc2VyaWFsaXplZCBzZXNzaW9uIGZyb20gdGhlIGRhdGEgcGFzc2VkIGluLgorICAgICAqIFRoaXMgd2lsbCBmaXJzdCBjYWxsIGNyZWF0ZVNlc3Npb24oKSBzbyB0aGF0IHdlIGdldCBhIGZyZXNoIGluc3RhbmNlIHdpdGggYWxsCisgICAgICogdGhlIG1hbmFnZXJzIHNldCBhbmQgYWxsIHRoZSB0cmFuc2llbnQgZmllbGRzIHZhbGlkYXRlZC4KKyAgICAgKiBUaGVuIGl0IGNhbGxzIFNlc3Npb24ucmVhZE9iamVjdERhdGEoYnl0ZVtdKSB0byBkZXNlcmlhbGl6ZSB0aGUgb2JqZWN0CisgICAgICogQHBhcmFtIGRhdGEgLSBhIGJ5dGUgYXJyYXkgY29udGFpbmluZyBzZXNzaW9uIGRhdGEKKyAgICAgKiBAcmV0dXJuIGEgdmFsaWQgU2Vzc2lvbiBvYmplY3QsIG51bGwgaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICoKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2Vzc2lvbiByZWFkU2Vzc2lvbiggYnl0ZVtdIGRhdGEsIFN0cmluZyBzZXNzaW9uSWQgKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0gc2Vzc2lvbl9kYXRhID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7CisgICAgICAgICAgICBSZXBsaWNhdGlvblN0cmVhbSBzZXNzaW9uX2luID0gbmV3IFJlcGxpY2F0aW9uU3RyZWFtKHNlc3Npb25fZGF0YSxjb250YWluZXIuZ2V0TG9hZGVyKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisKKyAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHNlc3Npb25JZCE9bnVsbD90aGlzLmZpbmRTZXNzaW9uKHNlc3Npb25JZCk6bnVsbDsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNOZXcgPSAoc2Vzc2lvbj09bnVsbCk7CisgICAgICAgICAgICAvL2NsZWFyIHRoZSBvbGQgdmFsdWVzIGZyb20gdGhlIGV4aXN0aW5nIHNlc3Npb24KKyAgICAgICAgICAgIGlmICggc2Vzc2lvbiE9bnVsbCApIHsKKyAgICAgICAgICAgICAgICBSZXBsaWNhdGVkU2Vzc2lvbiBycyA9IChSZXBsaWNhdGVkU2Vzc2lvbilzZXNzaW9uOworICAgICAgICAgICAgICAgIHJzLmV4cGlyZShmYWxzZSk7ICAvL2NsZWFucyB1cCB0aGUgcHJldmlvdXMgdmFsdWVzLCBzaW5jZSB3ZSBhcmUgbm90IGRvaW5nIHJlbW92ZXMKKyAgICAgICAgICAgICAgICBzZXNzaW9uID0gbnVsbDsKKyAgICAgICAgICAgIH0vL2VuZCBpZgorCisgICAgICAgICAgICBpZiAoc2Vzc2lvbj09bnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24gPSBjcmVhdGVTZXNzaW9uKG51bGwsZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzZXNzaW9ucy5yZW1vdmUoc2Vzc2lvbi5nZXRJZEludGVybmFsKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzUHJpbmNpcGFsID0gc2Vzc2lvbl9pbi5yZWFkQm9vbGVhbigpOworICAgICAgICAgICAgU2VyaWFsaXphYmxlUHJpbmNpcGFsIHAgPSBudWxsOworICAgICAgICAgICAgaWYgKCBoYXNQcmluY2lwYWwgKQorICAgICAgICAgICAgICAgIHAgPSAoU2VyaWFsaXphYmxlUHJpbmNpcGFsKXNlc3Npb25faW4ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgKChSZXBsaWNhdGVkU2Vzc2lvbilzZXNzaW9uKS5yZWFkT2JqZWN0RGF0YShzZXNzaW9uX2luKTsKKyAgICAgICAgICAgIGlmICggaGFzUHJpbmNpcGFsICkKKyAgICAgICAgICAgICAgICBzZXNzaW9uLnNldFByaW5jaXBhbChwLmdldFByaW5jaXBhbChnZXRDb250YWluZXIoKS5nZXRSZWFsbSgpKSk7CisgICAgICAgICAgICAoKFJlcGxpY2F0ZWRTZXNzaW9uKXNlc3Npb24pLnNldElkKHNlc3Npb25JZCxpc05ldyk7CisgICAgICAgICAgICBSZXBsaWNhdGVkU2Vzc2lvbiByc2Vzc2lvbiA9IChSZXBsaWNhdGVkU2Vzc2lvbilzZXNzaW9uOyAKKyAgICAgICAgICAgIHJzZXNzaW9uLnNldEFjY2Vzc0NvdW50KDEpOworICAgICAgICAgICAgc2Vzc2lvbi5zZXRNYW5hZ2VyKHRoaXMpOworICAgICAgICAgICAgc2Vzc2lvbi5zZXRWYWxpZCh0cnVlKTsKKyAgICAgICAgICAgIHJzZXNzaW9uLnNldExhc3RBY2Nlc3NlZFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgcnNlc3Npb24uc2V0VGhpc0FjY2Vzc2VkVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAoKFJlcGxpY2F0ZWRTZXNzaW9uKXNlc3Npb24pLnNldEFjY2Vzc0NvdW50KDApOworICAgICAgICAgICAgc2Vzc2lvbi5zZXROZXcoZmFsc2UpOworICAgICAgICAgICAgaWYobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiU2Vzc2lvbiBsb2FkZWQgaWQ9IitzZXNzaW9uSWQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYWN0dWFsSWQ9IitzZXNzaW9uLmdldElkKCkrIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZXhpc3RzPSIrdGhpcy5zZXNzaW9ucy5jb250YWluc0tleShzZXNzaW9uSWQpKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdmFsaWQ9Iityc2Vzc2lvbi5pc1ZhbGlkKCkpOworICAgICAgICAgICAgcmV0dXJuIHNlc3Npb247CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiB4ICkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gZGVzZXJpYWxpemUgdGhlIHNlc3Npb24hIix4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgPGNvZGU+Y29uZmlndXJlKCk8L2NvZGU+LAorICAgICAqIGFuZCBiZWZvcmUgYW55IG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgY29tcG9uZW50IGFyZSB1dGlsaXplZC48QlI+CisgICAgICogU3RhcnRzIHRoZSBjbHVzdGVyIGNvbW11bmljYXRpb24gY2hhbm5lbCwgdGhpcyB3aWxsIGNvbm5lY3Qgd2l0aCB0aGUgb3RoZXIgbm9kZXMKKyAgICAgKiBpbiB0aGUgY2x1c3RlciwgYW5kIHJlcXVlc3QgdGhlIGN1cnJlbnQgc2Vzc2lvbiBzdGF0ZSB0byBiZSB0cmFuc2ZlcnJlZCB0byB0aGlzIG5vZGUuCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlbgorICAgICAqICBzdGFydGVkCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgdGhpcyBjb21wb25lbnQgZnJvbSBiZWluZyB1c2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgbU1hbmFnZXJSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgc3VwZXIuc3RhcnQoKTsKKyAgICAgICAgLy9zdGFydCB0aGUgamF2YWdyb3VwcyBjaGFubmVsCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvL3RoZSBjaGFubmVsIGlzIGFscmVhZHkgcnVubmluZworICAgICAgICAgICAgaWYgKCBtQ2hhbm5lbFN0YXJ0ZWQgKSByZXR1cm47CisgICAgICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJTdGFydGluZyBjbHVzdGVyaW5nIG1hbmFnZXIuLi46IitnZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKCBjbHVzdGVyID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJTdGFydGluZy4uLiBubyBjbHVzdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQ6IitnZXROYW1lKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsdXN0ZXIuYWRkTWFuYWdlcihnZXROYW1lKCksdGhpcyk7CisKKyAgICAgICAgICAgIGlmIChjbHVzdGVyLmdldE1lbWJlcnMoKS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgTWVtYmVyIG1iciA9IGNsdXN0ZXIuZ2V0TWVtYmVycygpWzBdOworICAgICAgICAgICAgICAgIFNlc3Npb25NZXNzYWdlIG1zZyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBTZXNzaW9uTWVzc2FnZUltcGwodGhpcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZS5FVlRfR0VUX0FMTF9TRVNTSU9OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0VULUFMTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0VULUFMTC0iK3RoaXMuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBjbHVzdGVyLnNlbmQobXNnLCBtYnIpOworICAgICAgICAgICAgICAgIGlmKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiTWFuYWdlclsiK2dldE5hbWUoKSsiXSwgcmVxdWVzdGluZyBzZXNzaW9uIHN0YXRlIGZyb20gIittYnIrCisgICAgICAgICAgICAgICAgICAgICAgICAgIi4gVGhpcyBvcGVyYXRpb24gd2lsbCB0aW1lb3V0IGlmIG5vIHNlc3Npb24gc3RhdGUgaGFzIGJlZW4gcmVjZWl2ZWQgd2l0aGluICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgIjYwIHNlY29uZHMiKTsKKyAgICAgICAgICAgICAgICBsb25nIHJlcVN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgbG9uZyByZXFOb3cgPSAwOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNUaW1lb3V0PWZhbHNlOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOworICAgICAgICAgICAgICAgICAgICB9Y2F0Y2ggKCBFeGNlcHRpb24gc2xlZXApIHt9CisgICAgICAgICAgICAgICAgICAgIHJlcU5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgICAgICBpc1RpbWVvdXQ9KChyZXFOb3ctcmVxU3RhcnQpPigxMDAwKjYwKSk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoICghaXNTdGF0ZVRyYW5zZmVycmVkKCkpICYmICghaXNUaW1lb3V0KSk7CisgICAgICAgICAgICAgICAgaWYgKCBpc1RpbWVvdXQgfHwgKCFpc1N0YXRlVHJhbnNmZXJyZWQoKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiTWFuYWdlclsiK2dldE5hbWUoKSsiXSwgTm8gc2Vzc2lvbiBzdGF0ZSByZWNlaXZlZCwgdGltaW5nIG91dC4iKTsKKyAgICAgICAgICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiTWFuYWdlclsiK2dldE5hbWUoKSsiXSwgc2Vzc2lvbiBzdGF0ZSByZWNlaXZlZCBpbiAiKyhyZXFOb3ctcmVxU3RhcnQpKyIgbXMuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiTWFuYWdlclsiK2dldE5hbWUoKSsiXSwgc2tpcHBpbmcgc3RhdGUgdHJhbnNmZXIuIE5vIG1lbWJlcnMgYWN0aXZlIGluIGNsdXN0ZXIgZ3JvdXAuIik7CisgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgIG1DaGFubmVsU3RhcnRlZCA9IHRydWU7CisgICAgICAgIH0gIGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzdGFydCBTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIiLHgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSB0ZXJtaW5hdGUgdGhlIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdGhlIGxhc3Qgb25lIGNhbGxlZCBvbiBhIGdpdmVuCisgICAgICogaW5zdGFuY2Ugb2YgdGhpcyBjb21wb25lbnQuPEJSPgorICAgICAqIFRoaXMgd2lsbCBkaXNjb25uZWN0IHRoZSBjbHVzdGVyIGNvbW11bmljYXRpb24gY2hhbm5lbCBhbmQgc3RvcCB0aGUgbGlzdGVuZXIgdGhyZWFkLgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGhhcyBub3QgYmVlbiBzdGFydGVkCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbU1hbmFnZXJSdW5uaW5nID0gZmFsc2U7CisgICAgICAgIG1DaGFubmVsU3RhcnRlZCA9IGZhbHNlOworICAgICAgICBzdXBlci5zdG9wKCk7CisgICAgICAgIC8vc3RvcCB0aGUgamF2YWdyb3VwIGNoYW5uZWwKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc2Vzc2lvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgIGNsdXN0ZXIucmVtb3ZlTWFuYWdlcihnZXROYW1lKCksdGhpcyk7CisvLyAgICAgICAgICAgIG1SZXBsaWNhdGlvbkxpc3RlbmVyLnN0b3BMaXN0ZW5pbmcoKTsKKy8vICAgICAgICAgICAgbVJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIuc3RvcCgpOworLy8gICAgICAgICAgICBzZXJ2aWNlLnN0b3AoKTsKKy8vICAgICAgICAgICAgc2VydmljZSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24geCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHN0b3AgU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyIix4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpc3RyaWJ1dGFibGUoYm9vbGVhbiBkaXN0KSB7CisgICAgICAgIHRoaXMuZGlzdHJpYnV0YWJsZSA9IGRpc3Q7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGlzdHJpYnV0YWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGRpc3RyaWJ1dGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSByZWNlaXZlZCB0aHJlYWQgd2hlbiBhIFNlc3Npb25NZXNzYWdlIGhhcworICAgICAqIGJlZW4gcmVjZWl2ZWQgZnJvbSBvbmUgb2YgdGhlIG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyLgorICAgICAqIEBwYXJhbSBtc2cgLSB0aGUgbWVzc2FnZSByZWNlaXZlZAorICAgICAqIEBwYXJhbSBzZW5kZXIgLSB0aGUgc2VuZGVyIG9mIHRoZSBtZXNzYWdlLCB0aGlzIGlzIHVzZWQgaWYgd2UgcmVjZWl2ZSBhCisgICAgICogICAgICAgICAgICAgICAgIEVWVF9HRVRfQUxMX1NFU1NJT04gbWVzc2FnZSwgc28gdGhhdCB3ZSBvbmx5IHJlcGx5IHRvCisgICAgICogICAgICAgICAgICAgICAgIHRoZSByZXF1ZXN0aW5nIG5vZGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoIFNlc3Npb25NZXNzYWdlIG1zZywgTWVtYmVyIHNlbmRlciApIHsKKyAgICAgICAgdHJ5ICB7CisgICAgICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWNlaXZlZCBTZXNzaW9uTWVzc2FnZSBvZiB0eXBlPSIrbXNnLmdldEV2ZW50VHlwZVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlY2VpdmVkIFNlc3Npb25NZXNzYWdlIHNlbmRlcj0iK3NlbmRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKCBtc2cuZ2V0RXZlbnRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfR0VUX0FMTF9TRVNTSU9OUzogeworICAgICAgICAgICAgICAgICAgICAvL2dldCBhIGxpc3Qgb2YgYWxsIHRoZSBzZXNzaW9uIGZyb20gdGhpcyBtYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHNlc3Npb25zID0gZmluZFNlc3Npb25zKCk7CisgICAgICAgICAgICAgICAgICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvdXQgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb291dCA9IG5ldyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbShib3V0KTsKKyAgICAgICAgICAgICAgICAgICAgb291dC53cml0ZUludChzZXNzaW9ucy5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8c2Vzc2lvbnMubGVuZ3RoOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGljYXRlZFNlc3Npb24gc2VzID0gKFJlcGxpY2F0ZWRTZXNzaW9uKXNlc3Npb25zW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgb291dC53cml0ZVVURihzZXMuZ2V0SWRJbnRlcm5hbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gd3JpdGVTZXNzaW9uKHNlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvb3V0LndyaXRlT2JqZWN0KGRhdGEpOworICAgICAgICAgICAgICAgICAgICB9Ly9mb3IKKyAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBzZW5kIGEgbWVzc2FnZSBpZiB3ZSBkb24ndCBoYXZlIHRvCisgICAgICAgICAgICAgICAgICAgIG9vdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgb291dC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IGJvdXQudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbmV3bXNnID0gbmV3IFNlc3Npb25NZXNzYWdlSW1wbChuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UuRVZUX0FMTF9TRVNTSU9OX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCAiU0VTU0lPTi1TVEFURSIsIlNFU1NJT04tU1RBVEUtIitnZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLnNlbmQobmV3bXNnLCBzZW5kZXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfQUxMX1NFU1NJT05fREFUQTogeworICAgICAgICAgICAgICAgICAgICBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtIGJpbiA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbShtc2cuZ2V0U2Vzc2lvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBvaW4gPSBuZXcgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbShiaW4pOworICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IG9pbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoIGludCBpPTA7IGk8c2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBvaW4ucmVhZFVURigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSAoYnl0ZVtdKW9pbi5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSByZWFkU2Vzc2lvbihkYXRhLGlkKTsKKyAgICAgICAgICAgICAgICAgICAgfS8vZm9yCisgICAgICAgICAgICAgICAgICAgIHN0YXRlVHJhbnNmZXJyZWQ9dHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fQ1JFQVRFRDogeworICAgICAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSB0aGlzLnJlYWRTZXNzaW9uKG1zZy5nZXRTZXNzaW9uKCksbXNnLmdldFNlc3Npb25JRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVjZWl2ZWQgcmVwbGljYXRlZCBzZXNzaW9uPSIgKyBzZXNzaW9uICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzVmFsaWQ9IiArIHNlc3Npb24uaXNWYWxpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9FWFBJUkVEOiB7CisgICAgICAgICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGZpbmRTZXNzaW9uKG1zZy5nZXRTZXNzaW9uSUQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICggc2Vzc2lvbiAhPSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5leHBpcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fQUNDRVNTRUQgOnsKKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gZmluZFNlc3Npb24obXNnLmdldFNlc3Npb25JRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzZXNzaW9uICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmFjY2VzcygpOworICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5lbmRBY2Nlc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDogIHsKKyAgICAgICAgICAgICAgICAgICAgLy93ZSBkaWRuJ3QgcmVjb2duaXplIHRoZSBtZXNzYWdlIHR5cGUsIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfS8vc3dpdGNoCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24geCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHJlY2VpdmUgbWVzc2FnZSB0aHJvdWdoIFRDUCBjaGFubmVsIix4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VEYXRhUmVjZWl2ZWQoQ2x1c3Rlck1lc3NhZ2UgY21zZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCBjbXNnIGluc3RhbmNlb2YgU2Vzc2lvbk1lc3NhZ2UgKSB7CisgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbXNnID0gKFNlc3Npb25NZXNzYWdlKWNtc2c7CisgICAgICAgICAgICAgICAgbWVzc2FnZVJlY2VpdmVkKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmdldEFkZHJlc3MoKSAhPSBudWxsID8gKE1lbWJlcikgbXNnLmdldEFkZHJlc3MoKSA6IG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKFRocm93YWJsZSBleCl7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkluTWVtb3J5UmVwbGljYXRpb25NYW5hZ2VyLm1lc3NhZ2VEYXRhUmVjZWl2ZWQoKSIsIGV4KTsKKyAgICAgICAgfS8vY2F0Y2gKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRlVHJhbnNmZXJyZWQoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZVRyYW5zZmVycmVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisgICAgcHVibGljIGJvb2xlYW4gaXNOb3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gbm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbjsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0Tm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbihib29sZWFuIG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24pIHsKKyAgICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uID0gbm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbjsKKyAgICB9CisKKworICAgIC8qIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNYW5hZ2VyI2dldENsdXN0ZXIoKQorICAgICAqLworICAgIHB1YmxpYyBDYXRhbGluYUNsdXN0ZXIgZ2V0Q2x1c3RlcigpIHsKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNThkNzNmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApAQCAtMCwwICsxLDMzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBtYmVhbnMtZGVzY3JpcHRvcnMgUFVCTElDCisgICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL0RURCBNb2RlbCBNQmVhbnMgQ29uZmlndXJhdGlvbiBGaWxlIgorICAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9kdGRzL21iZWFucy1kZXNjcmlwdG9ycy5kdGQiPgorPG1iZWFucy1kZXNjcmlwdG9ycz4KKyAgICA8bWJlYW4gbmFtZT0iSnZtUm91dGVCaW5kZXJWYWx2ZSIgZGVzY3JpcHRpb249Im1vZF9qayBqdm1Sb3V0ZSBqc2Vzc2lvbmlkIGNvb2tpZSBiYWNrdXAgY29ycmVjdGlvbiIgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgZ3JvdXA9IlZhbHZlIiB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5Kdm1Sb3V0ZUJpbmRlclZhbHZlIj4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4gICAgICAgIAorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImluZm8iIAorCQkgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZXNjcmliZSB2ZXJzaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5hYmxlZCIgCisJCSAgICAgICAgICAgZGVzY3JpcHRpb249ImVuYWJsZSBhIGp2bSBSb3V0ZSBjaGVjayIgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im51bWJlck9mU2Vzc2lvbnMiCisJCSAgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBqdm1Sb3V0ZSBzZXNzaW9uIGNvcnJlY3Rpb25zIiB0eXBlPSJsb25nIiB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2Vzc2lvbklkQXR0cmlidXRlIiAKKwkJICAgIGRlc2NyaXB0aW9uPSJOYW1lIG9mIGF0dHJpYnV0ZSB3aXRoIHNlc3Npb25pZCB2YWx1ZSBiZWZvcmUgdHVybm92ZXIgYSBzZXNzaW9uIiAKKwkJICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIAorCQkgICAgLz4KKyAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJzdGFydCIgZGVzY3JpcHRpb249IlN0b3BzIHRoZSBDbHVzdGVyIEp2bVJvdXRlQmluZGVyVmFsdmUiIAorCQkgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIi8+CisgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcCIgZGVzY3JpcHRpb249IlN0b3BzIHRoZSBDbHVzdGVyIEp2bVJvdXRlQmluZGVyVmFsdmUiIAorCQkgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIi8+CisgICAgPC9tYmVhbj4KKwk8bWJlYW4gbmFtZT0iSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lciIKKwkJZGVzY3JpcHRpb249Ik1vbml0b3JzIHRoZSBqdm1Sb3V0ZSBhY3Rpdml0eSIKKwkJZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgZ3JvdXA9Ikxpc3RlbmVyIgorCQl0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5Kdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyIj4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmZvIiAKKwkJICAgICAgICAgICBkZXNjcmlwdGlvbj0iZGVzY3JpYmUgdmVyc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im51bWJlck9mU2Vzc2lvbnMiIAorCQkgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBqdm1Sb3V0ZSBzZXNzaW9uIGNvcnJlY3Rpb25zIiAKKwkJICAgIHR5cGU9ImxvbmciIAorCQkgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDwvbWJlYW4+CisgICAgCisgICA8bWJlYW4gICAgICAgIG5hbWU9IkRlbHRhTWFuYWdlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2x1c3RlciBNYW5hZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNYW5hZ2VyIGludGVyZmFjZSIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9Ik1hbmFnZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uLkRlbHRhTWFuYWdlciI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iaW5mbyIgCisJCSAgZGVzY3JpcHRpb249ImRlc2NyaWJlIHZlcnNpb24iCisJCSAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisJCSAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisJCSAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWxnb3JpdGhtIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtIHRvIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nCisgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gaWRlbnRpZmllcnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJhbmRvbUZpbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZpbGUgc291cmNlIG9mIHJhbmRvbSAtIC9kZXYvdXJhbmRvbSBvciBhIHBpcGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkaXN0cmlidXRhYmxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGlzdHJpYnV0YWJsZSBmbGFnIGZvciBTZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgTWFuYWdlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImVudHJvcHkiCisgICAgICAgICAgZGVzY3JpcHRpb249IkEgU3RyaW5nIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB1c2VkIHRvIGluY3JlYXNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5IG9mIHRoZSBpbml0aWFsaXphdGlvbiBvZiBvdXIgcmFuZG9tIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhBY3RpdmVTZXNzaW9ucyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBTZXNzaW9ucyBhbGxvd2VkLCBvciAtMQorICAgICAgICAgICAgICAgICAgICAgICBmb3Igbm8gbGltaXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heEluYWN0aXZlSW50ZXJ2YWwiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkZWZhdWx0IG1heGltdW0gaW5hY3RpdmUgaW50ZXJ2YWwgZm9yIFNlc3Npb25zCisgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgYnkgdGhpcyBNYW5hZ2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvY2Vzc0V4cGlyZXNGcmVxdWVuY3kiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGZyZXF1ZW5jeSBvZiB0aGUgbWFuYWdlciBjaGVja3MgKGV4cGlyYXRpb24gYW5kIHBhc3NpdmF0aW9uKSIKKyAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNlc3Npb25JZExlbmd0aCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHNlc3Npb24gaWQgbGVuZ3RoIChpbiBieXRlcykgb2YgU2Vzc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBieSB0aGlzIE1hbmFnZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkZXNjcmlwdGl2ZSBuYW1lIG9mIHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAoZm9yIGxvZ2dpbmcpIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImFjdGl2ZVNlc3Npb25zIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJOdW1iZXIgb2YgYWN0aXZlIHNlc3Npb25zIGF0IHRoaXMgbW9tZW50IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIAorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNlc3Npb25Db3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUb3RhbCBudW1iZXIgb2Ygc2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzIG1hbmFnZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzZXNzaW9uUmVwbGFjZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRvdGFsIG51bWJlciBvZiByZXBsYWNlZCBzZXNzaW9ucyB0aGF0IGxvYWQgZnJvbSBleHRlcm5hbCBub2RlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhBY3RpdmUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyBzbyBmYXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzZXNzaW9uTWF4QWxpdmVUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJMb25nZXN0IHRpbWUgYW4gZXhwaXJlZCBzZXNzaW9uIGhhZCBiZWVuIGFsaXZlIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic2Vzc2lvbkF2ZXJhZ2VBbGl2ZVRpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkF2ZXJhZ2UgdGltZSBhbiBleHBpcmVkIHNlc3Npb24gaGFkIGJlZW4gYWxpdmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzZW5kQ2x1c3RlckRvbWFpbk9ubHkiCisgICAgICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBzZW5kQ2x1c3RlckRvbWFpbk9ubHkgZmxhZyBzZW5kIHNlc3Npb25zIG9ubHkgdG8gbWVtYmVycyBhcyBzYW1lIGNsdXN0ZXIgZG9tYWluIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVqZWN0ZWRTZXNzaW9ucyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTnVtYmVyIG9mIHNlc3Npb25zIHdlIHJlamVjdGVkIGR1ZSB0byBtYXhBY3RpdmUgYmVlaW5nIHJlYWNoZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJleHBpcmVkU2Vzc2lvbnMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik51bWJlciBvZiBzZXNzaW9ucyB0aGF0IGV4cGlyZWQgKCBkb2Vzbid0IGluY2x1ZGUgZXhwbGljaXQgaW52YWxpZGF0aW9ucyApIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic3RhdGVUcmFuc2ZlclRpbWVvdXQiCisgICAgICAgICAgZGVzY3JpcHRpb249InN0YXRlIHRyYW5zZmVyIHRpbWVvdXQgaW4gc2VjIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGltZSBzcGVudCBkb2luZyBob3VzZWtlZXBpbmcgYW5kIGV4cGlyYXRpb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZHVwbGljYXRlcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTnVtYmVyIG9mIGR1cGxpY2F0ZWQgc2Vzc2lvbiBpZHMgZ2VuZXJhdGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY291bnRlclJlY2VpdmVfRVZUX0dFVF9BTExfU0VTU0lPTlMiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvdW50IHJlY2VpdmUgRVZUX0dFVF9BTExfU0VTU0lPTlMgbWVzc2FnZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvdW50ZXJSZWNlaXZlX0VWVF9BTExfU0VTU0lPTl9EQVRBIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3VudCByZWNlaXZlIEVWVF9BTExfU0VTU0lPTl9EQVRBIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9DUkVBVEVEIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3VudCByZWNlaXZlIEVWVF9TRVNTSU9OX0NSRUFURUQgbWVzc2FnZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0RFTFRBIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3VudCByZWNlaXZlIEVWVF9TRVNTSU9OX0RFTFRBIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9BQ0NFU1NFRCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ291bnQgcmVjZWl2ZSBFVlRfU0VTU0lPTl9BQ0NFU1NFRCBtZXNzYWdlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fRVhQSVJFRCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ291bnQgcmVjZWl2ZSBFVlRfU0VTU0lPTl9FWFBJUkVEIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb3VudGVyUmVjZWl2ZV9FVlRfQUxMX1NFU1NJT05fVFJBTlNGRVJDT01QTEVURSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ291bnQgcmVjZWl2ZSBFVlRfQUxMX1NFU1NJT05fVFJBTlNGRVJDT01QTEVURSBtZXNzYWdlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY291bnRlclNlbmRfRVZUX0dFVF9BTExfU0VTU0lPTlMiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvdW50IHNlbmQgRVZUX0dFVF9BTExfU0VTU0lPTlMgbWVzc2FnZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvdW50ZXJTZW5kX0VWVF9BTExfU0VTU0lPTl9EQVRBIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3VudCBzZW5kIEVWVF9BTExfU0VTU0lPTl9EQVRBIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9DUkVBVEVEIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3VudCBzZW5kIEVWVF9TRVNTSU9OX0NSRUFURUQgbWVzc2FnZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0RFTFRBIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3VudCBzZW5kIEVWVF9TRVNTSU9OX0RFTFRBIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9BQ0NFU1NFRCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ291bnQgc2VuZCBFVlRfU0VTU0lPTl9BQ0NFU1NFRCBtZXNzYWdlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY291bnRlclNlbmRfRVZUX1NFU1NJT05fRVhQSVJFRCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ291bnQgc2VuZCBFVlRfU0VTU0lPTl9FWFBJUkVEIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb3VudGVyU2VuZF9FVlRfQUxMX1NFU1NJT05fVFJBTlNGRVJDT01QTEVURSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ291bnQgc2VuZCBFVlRfQUxMX1NFU1NJT05fVFJBTlNGRVJDT01QTEVURSBtZXNzYWdlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY291bnRlck5vU3RhdGVUcmFuc2ZlcmVkIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3VudCB0aGUgZmFpbGVkIHNlc3Npb24gdHJhbnNmZXJzIG5vU3RhdGVUcmFuc2ZlcmVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlY2VpdmVkUXVldWVTaXplIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJsZW5ndGggb2YgcmVjZWl2ZSBxdWV1ZSBzaXplIHdoZW4gc2Vzc2lvbiByZWNlaXZlZCBmcm9tIG90aGVyIG5vZGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+ICAgICAgICAgICAgCisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duIgorICAgICAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJleGlwcmUgYWxsIHNlc3Npb25zIGNsdXN0ZXIgd2lkZSBhcyBvbmUgbm9kZSBnb2VzIGRvd24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU2VuZCBzZXNzaW9uIGF0dHJpYnV0ZSBjaGFuZ2UgZXZlbnRzIG9uIGJhY2t1cCBub2RlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJub3RpZnlTZXNzaW9uTGlzdGVuZXJzT25SZXBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU2VuZCBzZXNzaW9uIHN0YXJ0L3N0b3AgZXZlbnRzIG9uIGJhY2t1cCBub2RlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzZW5kQWxsU2Vzc2lvbnMiCisgICAgICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlNlbmQgYWxsIHNlc3Npb25zIGF0IG9uZSBiaWcgYmxvY2siCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic2VuZEFsbFNlc3Npb25zU2l6ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2Vzc2lvbiBibG9jayBzaXplIHdoZW4gc2VuZEFsbFNlc3Npb25zPWZhbHNlIChkZWZhdWx0PTEwMDApIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic2VuZEFsbFNlc3Npb25zV2FpdFRpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IndhaXQgdGltZSBiZXR3ZWVuIHNlbmQgc2Vzc2lvbiBibG9jayAoZGVmYXVsdCAyIHNlYykiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIgLz4KKyAgICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImV4cGlyZVRvbGVyYW5jZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQXV0byBleHBpcmUgdG9sZXJhbmNlIGludGVydmFsIGZvciBiYWNrdXAgc2Vzc2lvbnMgKGRlZmF1bHQgMzAwIHNlYykiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIgLz4KKyAgICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InVwZGF0ZUFjdGl2ZUludGVydmFsbCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU2VuZCBzZXNzaW9uIGFjY2VzcyB0byBiYWNrdXAgYWZ0ZXIgdGhpcyBpbnRlcnZhbGwgKGRlZmF1bHQgNjAgc2VjKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAvPiAgICAgCisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0ibGlzdFNlc3Npb25JZHMiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJldHVybiB0aGUgbGlzdCBvZiBhY3RpdmUgc2Vzc2lvbiBpZHMiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iZ2V0U2Vzc2lvbkF0dHJpYnV0ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmV0dXJuIGEgc2Vzc2lvbiBhdHRyaWJ1dGUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InNlc3Npb25JZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSWQgb2YgdGhlIHNlc3Npb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ia2V5IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJrZXkgb2YgdGhlIGF0dHJpYnV0ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImdldFNlc3Npb24iCisgICAgICAgICAgZGVzY3JpcHRpb249IlJldHVybiBhbGwgc2Vzc2lvbnMgYXR0cmlidXRlcyBhbmQgdmFsdWVzIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEudXRpbC5IYXNoTWFwIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2Vzc2lvbklkIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJJZCBvZiB0aGUgc2Vzc2lvbiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImV4cGlyZVNlc3Npb24iCisgICAgICAgICAgZGVzY3JpcHRpb249IkV4cGlyZSBhIHNlc3Npb24iCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InNlc3Npb25JZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSWQgb2YgdGhlIHNlc3Npb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJnZXRMYXN0QWNjZXNzZWRUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJHZXQgdGhlIGxhc3QgYWNjZXNzIHRpbWUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InNlc3Npb25JZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSWQgb2YgdGhlIHNlc3Npb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAKKwk8b3BlcmF0aW9uIG5hbWU9ImV4cGlyZUFsbExvY2FsU2Vzc2lvbnMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRXhpcHJlIGFsbCBhY3RpdmUgbG9jYWwgc2Vzc2lvbnMgYW5kIHJlcGxpY2F0ZSB0aGUgaW52YWxpZCBzZXNzaW9ucyIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisKKwk8b3BlcmF0aW9uIG5hbWU9InByb2Nlc3NFeHBpcmVzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249ImZvcmNlIHByb2Nlc3MgdG8gZXhwaXJlIHNlc3Npb25zIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAKKwk8b3BlcmF0aW9uIG5hbWU9InJlc2V0U3RhdGlzdGljcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXNldCBhbGwgc3RhdGlzdGljcyIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisgICAgCisJPG9wZXJhdGlvbiBuYW1lPSJnZXRBbGxDbHVzdGVyU2Vzc2lvbnMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZCB0byBvbGRlc3QgY2x1c3RlciBtZW1iZXIgdGhhdCB0aGlzIG5vZGUgbmVlZCBhbGwgY2x1c3RlciBzZXNzaW9ucyAocmVzeW5jIG1lbWJlcikiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCisgIDwvbWJlYW4+CisKKzwvbWJlYW5zLWRlc2NyaXB0b3JzPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9Bc3luY1NvY2tldFNlbmRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9Bc3luY1NvY2tldFNlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZDQ1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL0FzeW5jU29ja2V0U2VuZGVyLmphdmEKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcDsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnV0aWwuU21hcnRRdWV1ZTsKKworLyoqCisgKiBTZW5kIGNsdXN0ZXIgbWVzc2FnZXMgZnJvbSBhIE1lc3NhZ2UgcXVldWUgd2l0aCBvbmx5IG9uZSBzb2NrZXQuIEFjayBhbmQga2VlcAorICogQWxpdmUgSGFuZGxpbmcgaXMgc3VwcG9ydGVkLgorICogPHVsPgorICogPGxpPldpdGggYXV0b0Nvbm5lY3Q9ZmFsc2UgYXQgUmVwbGljYXRpb25UcmFuc21pdHRlciwgeW91IGNhbiBkaXNjb25uZWN0IHRoZQorICogc2VuZGVyIGFuZCBhbGwgbWVzc2FnZXMgYXJlIHF1ZXVlZC4gT25seSB1c2UgdGhpcyBmb3Igc21hbGwgbWFpbnRhaW5jZQorICogaXN1c2VzITwvbGk+CisgKiA8bGk+d2FpdEZvckFjaz10cnVlLCBtZWFucyB0aGF0IHJlY2VpdmVyIGFjayB0aGUgdHJhbnNmZXI8L2xpPgorICogPGxpPmFmdGVyIG9uZSBtaW51dGUgaWRsZSB0aW1lLCBvciBudW1iZXIgb2YgcmVxdWVzdCAoMTAwKSB0aGUgY29ubmVjdGlvbiBpcworICogcmVjb25uZWN0ZWQgd2l0aCBuZXh0IHJlcXVlc3QuIENoYW5nZSB0aGlzIGZvciBwcm9kdWN0aW9uIHVzZSE8L2xpPgorICogPGxpPmRlZmF1bHQgYWNrVGltZW91dCBpcyAxNSBzZWM6IHRoaXMgaXMgdmVyeSBsb3cgZm9yIGJpZyBhbGwgc2Vzc2lvbiByZXBsaWNhdGlvbiBtZXNzYWdlcyBhZnRlciByZXN0YXJ0IGEgbm9kZTwvbGk+CisgKiA8bGk+ZGlzYWJsZSBrZWVwQWxpdmU6IGtlZXBBbGl2ZVRpbWVvdXQ9Ii0xIiBhbmQga2VlcEFsaXZlTWF4UmVxdWVzdENvdW50PSItMSI8L2xpPgorICogPC91bD4KKyAqIAorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIEFzeW5jU29ja2V0U2VuZGVyIGV4dGVuZHMgRGF0YVNlbmRlciB7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHRocmVhZENvdW50ZXIgPSAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkKKyAgICAgICAgICAgIC5nZXRMb2coQXN5bmNTb2NrZXRTZW5kZXIuY2xhc3MpOworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAiQXN5bmNTb2NrZXRTZW5kZXIvMi4wIjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogTWVzc2FnZSBRdWV1ZQorICAgICAqLworICAgIHByaXZhdGUgU21hcnRRdWV1ZSBxdWV1ZSA9IG5ldyBTbWFydFF1ZXVlKCk7CisKKyAgICAvKioKKyAgICAgKiBBY3RpdmUgdGhyZWFkIHRvIHB1c2ggbWVzc2FnZXMgYXN5bmNocm9ub3VzIHRvIHRoZSBvdGhlciByZXBsaWNhdGlvbiBub2RlCisgICAgICovCisgICAgcHJpdmF0ZSBRdWV1ZVRocmVhZCBxdWV1ZVRocmVhZCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb3VudCBudW1iZXIgb2YgcXVldWUgbWVzc2FnZQorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBpblF1ZXVlQ291bnRlciA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb3VudCBhbGwgc3VjY2Vzc2Z1bGwgcHVzaCBtZXNzYWdlcyBmcm9tIHF1ZXVlCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIG91dFF1ZXVlQ291bnRlciA9IDA7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKyAgICAvKioKKyAgICAgKiBzdGFydCBiYWNrZ3JvdW5kIHRocmVhZCB0byBwdXNoIGluY29tbWluZyBjbHVzdGVyIG1lc3NhZ2VzIHRvIHJlcGxpY2F0aW9uCisgICAgICogbm9kZQorICAgICAqIAorICAgICAqIEBwYXJhbSBkb21haW4gcmVwbGljYXRpb24gY2x1c3RlciBkb21haW4gKHNlc3Npb24gZG9tYWluKQorICAgICAqIEBwYXJhbSBob3N0IHJlcGxpY2F0aW9uIG5vZGUgdGNwIGFkZHJlc3MKKyAgICAgKiBAcGFyYW0gcG9ydCByZXBsaWNhdGlvbiBub2RlIHRjcCBwb3J0CisgICAgICovCisgICAgcHVibGljIEFzeW5jU29ja2V0U2VuZGVyKFN0cmluZyBkb21haW4sSW5ldEFkZHJlc3MgaG9zdCwgaW50IHBvcnQpIHsKKyAgICAgICAgc3VwZXIoZG9tYWluLGhvc3QsIHBvcnQpOworICAgICAgICBjaGVja1RocmVhZCgpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24gYW5kIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGluUXVldWVDb3VudGVyLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEluUXVldWVDb3VudGVyKCkgeworICAgICAgICByZXR1cm4gaW5RdWV1ZUNvdW50ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBvdXRRdWV1ZUNvdW50ZXIuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0T3V0UXVldWVDb3VudGVyKCkgeworICAgICAgICByZXR1cm4gb3V0UXVldWVDb3VudGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcXVldWVTaXplLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UXVldWVTaXplKCkgeworICAgICAgICByZXR1cm4gcXVldWUuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcXVldWVkTnJPZkJ5dGVzLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFF1ZXVlZE5yT2ZCeXRlcygpIHsKKyAgICAgICAgaWYocXVldWVUaHJlYWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBxdWV1ZVRocmVhZC5nZXRRdWV1ZWROck9mQnl0ZXMoKTsKKyAgICAgICAgcmV0dXJuIDBsIDsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qCisgICAgICogQ29ubmVjdCB0byBzb2NrZXQgYW5kIHN0YXJ0IGJhY2tncm91bmQgdGhyZWFkIHRvIHBwdXNoIHF1ZXVlZCBtZXNzYWdlcworICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5JRGF0YVNlbmRlciNjb25uZWN0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBzdXBlci5jb25uZWN0KCk7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzY29ubmVjdCBzb2NrZXQgYWQgc3RvcCBxdWV1ZSB0aHJlYWQKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuSURhdGFTZW5kZXIjZGlzY29ubmVjdCgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgc3RvcFRocmVhZCgpOworICAgICAgICBzdXBlci5kaXNjb25uZWN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBtZXNzYWdlIHRvIHF1ZXVlIGZvciBsYXRlciBzZW5kaW5nCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLkRhdGFTZW5kZXIjcHVzaE1lc3NhZ2UoQ2x1c3RlckRhdGEpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoQ2x1c3RlckRhdGEgZGF0YSkKKyAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgU21hcnRRdWV1ZS5TbWFydEVudHJ5IGVudHJ5ID0gbmV3IFNtYXJ0UXVldWUuU21hcnRFbnRyeShkYXRhLmdldFVuaXF1ZUlkKCksIGRhdGEpOworICAgICAgICBxdWV1ZS5hZGQoZW50cnkpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGluUXVldWVDb3VudGVyKys7CisgICAgICAgICAgICBpZihxdWV1ZVRocmVhZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHF1ZXVlVGhyZWFkLmluY1F1ZXVlZE5yT2ZCeXRlcyhkYXRhLmdldE1lc3NhZ2UoKS5sZW5ndGgpOworICAgICAgIH0KKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLnRyYWNlKHNtLmdldFN0cmluZygiQXN5bmNTb2NrZXRTZW5kZXIucXVldWUubWVzc2FnZSIsCisgICAgICAgICAgICAgICAgICAgIGdldEFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpLCBuZXcgSW50ZWdlcihnZXRQb3J0KCkpLCBkYXRhLmdldFVuaXF1ZUlkKCksIG5ldyBMb25nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0TWVzc2FnZSgpLmxlbmd0aCkpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlc2V0IHNlbmRlciBzdGF0aXN0aWNzCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0U3RhdGlzdGljcygpIHsKKyAgICAgICAgc3VwZXIucmVzZXRTdGF0aXN0aWNzKCk7CisgICAgICAgIGluUXVldWVDb3VudGVyID0gcXVldWUuc2l6ZSgpOworICAgICAgICBvdXRRdWV1ZUNvdW50ZXIgPSAwOworCisgICAgfQorCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGlzIFNvY2tlclNlbmRlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJBc3luY1NvY2tldFNlbmRlclsiKTsKKyAgICAgICAgYnVmLmFwcGVuZChnZXRBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKSkuYXBwZW5kKCI6IikuYXBwZW5kKGdldFBvcnQoKSkuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFN0YXJ0IFF1ZXVlIHRocmVhZCBhcyBkYWVtb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1RocmVhZCgpIHsKKyAgICAgICAgaWYgKHF1ZXVlVGhyZWFkID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygiQXN5bmNTb2NrZXRTZW5kZXIuY3JlYXRlLnRocmVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBZGRyZXNzKCksIG5ldyBJbnRlZ2VyKGdldFBvcnQoKSkpKTsKKyAgICAgICAgICAgIHF1ZXVlVGhyZWFkID0gbmV3IFF1ZXVlVGhyZWFkKHRoaXMpOworICAgICAgICAgICAgcXVldWVUaHJlYWQuc2V0RGFlbW9uKHRydWUpOworICAgICAgICAgICAgcXVldWVUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHN0b3AgcXVldWUgd29ya2VyIHRocmVhZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0b3BUaHJlYWQoKSB7CisgICAgICAgIGlmIChxdWV1ZVRocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICBxdWV1ZVRocmVhZC5zdG9wUnVubmluZygpOworICAgICAgICAgICAgcXVldWVUaHJlYWQgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5uZXIgQ2xhc3MKKworICAgIHByaXZhdGUgY2xhc3MgUXVldWVUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBBc3luY1NvY2tldFNlbmRlciBzZW5kZXI7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGtlZXBSdW5uaW5nID0gdHJ1ZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3VycmVudCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbGwgcXVldWVkIG1lc3NhZ2VzCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGxvbmcgcXVldWVkTnJPZkJ5dGVzID0gMDsKKworICAgICAgICBwdWJsaWMgUXVldWVUaHJlYWQoQXN5bmNTb2NrZXRTZW5kZXIgc2VuZGVyKSB7CisgICAgICAgICAgICB0aGlzLnNlbmRlciA9IHNlbmRlcjsKKyAgICAgICAgICAgIHNldE5hbWUoIkNsdXN0ZXItQXN5bmNTb2NrZXRTZW5kZXItIiArICh0aHJlYWRDb3VudGVyKyspKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBsb25nIGdldFF1ZXVlZE5yT2ZCeXRlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBxdWV1ZWROck9mQnl0ZXMgOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2V0UXVldWVkTnJPZkJ5dGVzKGxvbmcgcXVldWVkTnJPZkJ5dGVzKSB7CisgICAgICAgICAgICB0aGlzLnF1ZXVlZE5yT2ZCeXRlcyA9IHF1ZXVlZE5yT2ZCeXRlczsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBpbmNRdWV1ZWROck9mQnl0ZXMobG9uZyBzaXplKSB7CisgICAgICAgICAgICBxdWV1ZWROck9mQnl0ZXMgKz0gc2l6ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRlY1F1ZXVlZE5yT2ZCeXRlcyhsb25nIHNpemUpIHsKKyAgICAgICAgICAgIHF1ZXVlZE5yT2ZCeXRlcyAtPSBzaXplOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcFJ1bm5pbmcoKSB7CisgICAgICAgICAgICBrZWVwUnVubmluZyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBvbmUgcXVldWVkIG1lc3NhZ2UgYW5kIHB1c2ggaXQgdG8gdGhlIHJlcGxpY2F0aW9uIG5vZGUKKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUgRGF0YVNlbmRlciNwdXNoTWVzc2FnZShTdHJpbmcsIGJ5dGVbXSkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHdoaWxlIChrZWVwUnVubmluZykgeworICAgICAgICAgICAgICAgIFNtYXJ0UXVldWUuU21hcnRFbnRyeSBlbnRyeSA9IHNlbmRlci5xdWV1ZS5yZW1vdmUoNTAwMCk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VzaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJEYXRhIGRhdGEgPSAoQ2x1c3RlckRhdGEpIGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc2l6ZSA9IGRhdGEuZ2V0TWVzc2FnZSgpLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5wdXNoTWVzc2FnZShkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiQXN5bmNTb2NrZXRTZW5kZXIuc2VuZC5lcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldEtleSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRRdWV1ZUNvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY1F1ZXVlZE5yT2ZCeXRlcyhtZXNzYWdlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9DbHVzdGVyRGF0YS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9DbHVzdGVyRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOWVmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL0NsdXN0ZXJEYXRhLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlOworCisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA1LjUuMTAKKyAqLworcHVibGljIGNsYXNzIENsdXN0ZXJEYXRhIHsKKworICAgIHByaXZhdGUgaW50IHJlc2VuZCA9IENsdXN0ZXJNZXNzYWdlLkZMQUdfREVGQVVMVCA7CisgICAgcHJpdmF0ZSBpbnQgY29tcHJlc3MgPSBDbHVzdGVyTWVzc2FnZS5GTEFHX0RFRkFVTFQgOworICAgIHByaXZhdGUgYnl0ZVtdIG1lc3NhZ2UgOworICAgIHByaXZhdGUgbG9uZyB0aW1lc3RhbXAgOworICAgIHByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkIDsKKyAgICBwcml2YXRlIFN0cmluZyB0eXBlIDsKKyAgICAKKyAgICBwdWJsaWMgQ2x1c3RlckRhdGEoKSB7fQorICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSB0eXBlIG1lc3NhZ2UgdHlwZSAoY2xhc3MpCisgICAgICogQHBhcmFtIHVuaXF1ZUlkIHVuaXF1ZSBtZXNzYWdlIGlkCisgICAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSBkYXRhCisgICAgICogQHBhcmFtIHRpbWVzdGFtcCBtZXNzYWdlIGNyZWF0aW9uIGRhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2x1c3RlckRhdGEoU3RyaW5nIHR5cGUsIFN0cmluZyB1bmlxdWVJZCwgYnl0ZVtdIG1lc3NhZ2UsIGxvbmcgdGltZXN0YW1wCisgICAgICAgICAgICApIHsKKyAgICAgICAgdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShieXRlW10gbWVzc2FnZSkgeworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRpbWVzdGFtcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7CisgICAgICAgIHJldHVybiB0aW1lc3RhbXA7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXAgVGhlIHRpbWVzdGFtcCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKGxvbmcgdGltZXN0YW1wKSB7CisgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVuaXF1ZUlkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisgICAgICAgIHJldHVybiB1bmlxdWVJZDsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIHVuaXF1ZUlkIFRoZSB1bmlxdWVJZCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisgICAgICAgIHRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb21wcmVzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvbXByZXNzKCkgeworICAgICAgICByZXR1cm4gY29tcHJlc3M7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSBjb21wcmVzcyBUaGUgY29tcHJlc3MgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzKGludCBjb21wcmVzcykgeworICAgICAgICB0aGlzLmNvbXByZXNzID0gY29tcHJlc3M7CisgICAgfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVzZW5kLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVzZW5kKCkgeworICAgICAgICByZXR1cm4gcmVzZW5kOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcmVzZW5kIFRoZSByZXNlbmQgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc2VuZChpbnQgcmVzZW5kKSB7CisgICAgICAgIHRoaXMucmVzZW5kID0gcmVzZW5kOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvQ2x1c3RlclJlY2VpdmVyQmFzZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9DbHVzdGVyUmVjZWl2ZXJCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5MmQyMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvQ2x1c3RlclJlY2VpdmVyQmFzZS5qYXZhCkBAIC0wLDAgKzEsNTQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwOworCisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNhdGFsaW5hQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJSZWNlaXZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuaW8uTGlzdGVuQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uQ2x1c3RlclNlc3Npb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5SZXBsaWNhdGlvblN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworCisvKioKKyogRklYTUUgaTE4biBsb2cgbWVzc2FnZXMKKyogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIENsdXN0ZXJSZWNlaXZlckJhc2UgaW1wbGVtZW50cyBSdW5uYWJsZSwgQ2x1c3RlclJlY2VpdmVyLExpc3RlbkNhbGxiYWNrIHsKKyAgICAKKyAgICBwcm90ZWN0ZWQgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggQ2x1c3RlclJlY2VpdmVyQmFzZS5jbGFzcyApOworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ01hbmFnZXIgc20gPSBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgcHJpdmF0ZSBDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcjsKKyAgICBwcml2YXRlIGphdmEubmV0LkluZXRBZGRyZXNzIGJpbmQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgdGNwTGlzdGVuQWRkcmVzczsKKyAgICBwcml2YXRlIGludCB0Y3BMaXN0ZW5Qb3J0OworICAgIHByaXZhdGUgYm9vbGVhbiBzZW5kQWNrOworICAgIHByb3RlY3RlZCBib29sZWFuIGRvTGlzdGVuID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiB0b3RhbCBieXRlcyB0byByZWNldmllZAorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIHRvdGFsUmVjZWl2ZWRCeXRlcyA9IDA7CisgICAgCisgICAgLyoqCisgICAgICogZG9Qcm9jZXNzaW5nU3RhdHMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb1JlY2VpdmVkUHJvY2Vzc2luZ1N0YXRzID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBwcm9lc3NpbmdUaW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgcmVjZWl2ZWRQcm9jZXNzaW5nVGltZSA9IDA7CisgICAgCisgICAgLyoqCisgICAgICogbWluIHByb2Vzc2luZ1RpbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBtaW5SZWNlaXZlZFByb2Nlc3NpbmdUaW1lID0gTG9uZy5NQVhfVkFMVUUgOworCisgICAgLyoqCisgICAgICogbWF4IHByb2Vzc2luZ1RpbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBtYXhSZWNlaXZlZFByb2Nlc3NpbmdUaW1lID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZW5kaW5nIFN0YXRzCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIG5yT2ZNc2dzUmVjZWl2ZWQgPSAwOworCisgICAgcHJpdmF0ZSBsb25nIHJlY2VpdmVkVGltZSA9IDA7CisKKyAgICBwcml2YXRlIGxvbmcgbGFzdENoZWNrZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworCisgICAgLyoqCisgICAgICogQ29tcHJlc3MgbWVzc2FnZSBkYXRhIGJ5dGVzCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbXByZXNzID0gdHJ1ZSA7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc21pdHRlciBNYmVhbiBuYW1lCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3ROYW1lIG9iamVjdE5hbWU7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRvTGlzdGVuLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRG9MaXN0ZW4oKSB7CisgICAgICAgIHJldHVybiBkb0xpc3RlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGJpbmQuCisgICAgICovCisgICAgcHVibGljIGphdmEubmV0LkluZXRBZGRyZXNzIGdldEJpbmQoKSB7CisgICAgICAgIGlmIChiaW5kID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlN0YXJ0aW5nIHJlcGxpY2F0aW9uIGxpc3RlbmVyIG9uIGFkZHJlc3M6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGNwTGlzdGVuQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgYmluZCA9IGphdmEubmV0LkluZXRBZGRyZXNzLmdldEJ5TmFtZSh0Y3BMaXN0ZW5BZGRyZXNzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIGJpbmQgcmVwbGljYXRpb24gbGlzdGVuZXIgb24gYWRkcmVzczoiCisgICAgICAgICAgICAgICAgICAgICAgICArIHRjcExpc3RlbkFkZHJlc3MsIGlvZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIHJldHVybiBiaW5kOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYmluZCBUaGUgYmluZCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmluZChqYXZhLm5ldC5JbmV0QWRkcmVzcyBiaW5kKSB7CisgICAgICAgIHRoaXMuYmluZCA9IGJpbmQ7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldENhdGFsaW5hQ2x1c3RlcihDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICB0aGlzLmNsdXN0ZXIgPSBjbHVzdGVyOworICAgIH0KKworICAgIHB1YmxpYyBDYXRhbGluYUNsdXN0ZXIgZ2V0Q2F0YWxpbmFDbHVzdGVyKCkgeworICAgICAgICByZXR1cm4gKENhdGFsaW5hQ2x1c3RlcikgY2x1c3RlcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogIHNldCBSZWNlaXZlciBPYmplY3ROYW1lCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3ROYW1lKE9iamVjdE5hbWUgbmFtZSkgeworICAgICAgICBvYmplY3ROYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlciBPYmplY3ROYW1lCisgICAgICogCisgICAgICovCisgICAgcHVibGljIE9iamVjdE5hbWUgZ2V0T2JqZWN0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG9iamVjdE5hbWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29tcHJlc3MuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb21wcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIGNvbXByZXNzOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY29tcHJlc3NNZXNzYWdlRGF0YSBUaGUgY29tcHJlc3MgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzKGJvb2xlYW4gY29tcHJlc3NNZXNzYWdlRGF0YSkgeworICAgICAgICB0aGlzLmNvbXByZXNzID0gY29tcHJlc3NNZXNzYWdlRGF0YTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2VuZCBBQ0sgdG8gc2VuZGVyCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHNlbmRpbmcgQUNLCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZW5kQWNrKCkgeworICAgICAgICByZXR1cm4gc2VuZEFjazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgYWNrIG1vZGUgb3Igbm90IQorICAgICAqIAorICAgICAqIEBwYXJhbSBzZW5kQWNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VuZEFjayhib29sZWFuIHNlbmRBY2spIHsKKyAgICAgICAgdGhpcy5zZW5kQWNrID0gc2VuZEFjazsKKyAgICB9CisgCisgICAgLyoqCisgICAgICogZ2V0IHRjcCBsaXN0ZW4gcmVjZXZpZXIgaXAgYWRkcmVzcworICAgICAqIEByZXR1cm4gbGlzdGVuIGFkZHJlc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRjcExpc3RlbkFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiB0Y3BMaXN0ZW5BZGRyZXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBUQ1AgbGlzdGVuIGlwIGFkZHJlc3MuIElmIGFyZyBhdXRvIHVzZSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKQorICAgICAqIG90aGVyd2lzZSBhcmcgY29udmVydGVkIHdpdGggSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCkuCisgICAgICogCisgICAgICogQHBhcmFtIHRjcExpc3RlbkFkZHJlc3MgCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGNwTGlzdGVuQWRkcmVzcyhTdHJpbmcgdGNwTGlzdGVuQWRkcmVzcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCJhdXRvIi5lcXVhbHModGNwTGlzdGVuQWRkcmVzcykpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnRjcExpc3RlbkFkZHJlc3MgPSAKKyAgICAgICAgICAgICAgICAgICAgamF2YS5uZXQuSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdEFkZHJlc3MoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy50Y3BMaXN0ZW5BZGRyZXNzID0KKyAgICAgICAgICAgICAgICAgICAgamF2YS5uZXQuSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKHRjcExpc3RlbkFkZHJlc3MpLmdldEhvc3RBZGRyZXNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXQgcmVwbGljYXRpb24gbGlzdGVuZXIgb24gYWRkcmVzczoiCisgICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMudGNwTGlzdGVuQWRkcmVzcyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgZ2V0IEluZXQgYWRkcmVzcyBhdCByZXBsaWNhdGlvbiBsaXN0ZW5lciBvbiBhZGRyZXNzOiIKKyAgICAgICAgICAgICAgICAgICAgKyB0Y3BMaXN0ZW5BZGRyZXNzLCBpb2UpOworICAgICAgICB9CisgICAgfQorCisgICAgCisgICAgcHVibGljIGludCBnZXRUY3BMaXN0ZW5Qb3J0KCkgeworICAgICAgICByZXR1cm4gdGNwTGlzdGVuUG9ydDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0VGNwTGlzdGVuUG9ydChpbnQgdGNwTGlzdGVuUG9ydCkgeworICAgICAgICB0aGlzLnRjcExpc3RlblBvcnQgPSB0Y3BMaXN0ZW5Qb3J0OworICAgIH0KKyAgCisgICAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkgeworICAgICAgICByZXR1cm4gZ2V0VGNwTGlzdGVuQWRkcmVzcygpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFRjcExpc3RlblBvcnQoKTsKKyAgICB9CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGF0cworCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkb1JlY2VpdmVkUHJvY2Vzc2luZ1N0YXRzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRG9SZWNlaXZlZFByb2Nlc3NpbmdTdGF0cygpIHsKKyAgICAgICAgcmV0dXJuIGRvUmVjZWl2ZWRQcm9jZXNzaW5nU3RhdHM7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSBkb1JlY2VpdmVyUHJvY2Vzc2luZ1N0YXRzIFRoZSBkb1JlY2VpdmVkUHJvY2Vzc2luZ1N0YXRzIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREb1JlY2VpdmVkUHJvY2Vzc2luZ1N0YXRzKGJvb2xlYW4gZG9SZWNlaXZlclByb2Nlc3NpbmdTdGF0cykgeworICAgICAgICB0aGlzLmRvUmVjZWl2ZWRQcm9jZXNzaW5nU3RhdHMgPSBkb1JlY2VpdmVyUHJvY2Vzc2luZ1N0YXRzOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1heFJlY2VpdmVkUHJvY2Vzc2luZ1RpbWUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TWF4UmVjZWl2ZWRQcm9jZXNzaW5nVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIG1heFJlY2VpdmVkUHJvY2Vzc2luZ1RpbWU7CisgICAgfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWluUmVjZWl2ZWRQcm9jZXNzaW5nVGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRNaW5SZWNlaXZlZFByb2Nlc3NpbmdUaW1lKCkgeworICAgICAgICByZXR1cm4gbWluUmVjZWl2ZWRQcm9jZXNzaW5nVGltZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByZWNlaXZlZFByb2Nlc3NpbmdUaW1lLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFJlY2VpdmVkUHJvY2Vzc2luZ1RpbWUoKSB7CisgICAgICAgIHJldHVybiByZWNlaXZlZFByb2Nlc3NpbmdUaW1lOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRvdGFsUmVjZWl2ZWRCeXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbFJlY2VpdmVkQnl0ZXMoKSB7CisgICAgICAgIHJldHVybiB0b3RhbFJlY2VpdmVkQnl0ZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYXZnIHJlY2VpdmVkUHJvY2Vzc2luZ1RpbWUvbnJPZk1zZ3NSZWNlaXZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZG91YmxlIGdldEF2Z1JlY2VpdmVkUHJvY2Vzc2luZ1RpbWUoKSB7CisgICAgICAgIGlmICggbnJPZk1zZ3NSZWNlaXZlZCA+IDAgKSB7CisgICAgICAgICAgICByZXR1cm4gKChkb3VibGUpcmVjZWl2ZWRQcm9jZXNzaW5nVGltZSkgLyBuck9mTXNnc1JlY2VpdmVkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGF2ZyB0b3RhbFJlY2VpdmVkQnl0ZXMvbnJPZk1zZ3NSZWNlaXZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRBdmdUb3RhbFJlY2VpdmVkQnl0ZXMoKSB7CisgICAgICAgIGlmICggbnJPZk1zZ3NSZWNlaXZlZCA+IDAgKSB7CisgICAgICAgICAgICByZXR1cm4gKChsb25nKXRvdGFsUmVjZWl2ZWRCeXRlcykgLyBuck9mTXNnc1JlY2VpdmVkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlY2VpdmVkVGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRSZWNlaXZlZFRpbWUoKSB7CisgICAgICAgIHJldHVybiByZWNlaXZlZFRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsYXN0Q2hlY2tlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRMYXN0Q2hlY2tlZCgpIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDaGVja2VkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbnJPZk1zZ3NSZWNlaXZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXROck9mTXNnc1JlY2VpdmVkKCkgeworICAgICAgICByZXR1cm4gbnJPZk1zZ3NSZWNlaXZlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzdGFydCBjbHVzdGVyIHJlY2VpdmVyCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclJlY2VpdmVyI3N0YXJ0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldEJpbmQoKTsKKyAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCh0aGlzLCAiQ2x1c3RlclJlY2VpdmVyIik7CisgICAgICAgICAgICB0LnNldERhZW1vbih0cnVlKTsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy5mYXRhbCgiVW5hYmxlIHRvIHN0YXJ0IGNsdXN0ZXIgcmVjZWl2ZXIiLCB4KTsKKyAgICAgICAgfQorICAgICAgICByZWdpc3RlclJlY2VpdmVyTUJlYW4oKTsKKyAgICB9CisKKyAKKyAgICAvKioKKyAgICAgKiBTdG9wIGFjY2VwdAorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJSZWNlaXZlciNzdG9wKCkKKyAgICAgKiBAc2VlICNzdG9wTGlzdGVuaW5nKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBzdG9wTGlzdGVuaW5nKCk7CisgICAgICAgIHVucmVnaXN0ZXJSZWNldmllck1CZWFuKCk7CisgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBSZWNldmllciBNQmVhbgorICAgICAqIDxkb21haW4+OnR5cGU9Q2x1c3RlclJlY2VpdmVyLGhvc3Q9PGhvc3Q+CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJSZWNlaXZlck1CZWFuKCkgeworICAgICAgICBpZiAoY2x1c3RlciAhPSBudWxsICYmIGNsdXN0ZXIgaW5zdGFuY2VvZiBTaW1wbGVUY3BDbHVzdGVyKSB7CisgICAgICAgICAgICBTaW1wbGVUY3BDbHVzdGVyIHNjbHVzdGVyID0gKFNpbXBsZVRjcENsdXN0ZXIpIGNsdXN0ZXI7CisgICAgICAgICAgICBPYmplY3ROYW1lIGNsdXN0ZXJOYW1lID0gc2NsdXN0ZXIuZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBNQmVhblNlcnZlciBtc2VydmVyID0gc2NsdXN0ZXIuZ2V0TUJlYW5TZXJ2ZXIoKTsKKyAgICAgICAgICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gY2x1c3Rlci5nZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGNsdXN0ZXJOYW1lLmdldERvbWFpbigpICsgIjp0eXBlPUNsdXN0ZXJSZWNlaXZlciI7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFN0YW5kYXJkSG9zdCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lICs9ICIsaG9zdD0iICsgY2x1c3Rlck5hbWUuZ2V0S2V5UHJvcGVydHkoImhvc3QiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSByZWNlaXZlck5hbWUgPSBuZXcgT2JqZWN0TmFtZShuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAobXNlcnZlci5pc1JlZ2lzdGVyZWQocmVjZWl2ZXJOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsdXN0ZXIubWJlYW4ucmVnaXN0ZXIuYWxyZWFkeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyTmFtZSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldE9iamVjdE5hbWUocmVjZWl2ZXJOYW1lKTsKKyAgICAgICAgICAgICAgICBtc2VydmVyLnJlZ2lzdGVyTUJlYW4oc2NsdXN0ZXIuZ2V0TWFuYWdlZEJlYW4odGhpcyksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRPYmplY3ROYW1lKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cud2FybihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgIAorICAgIC8qKgorICAgICAqIFVuUmVnaXN0ZXIgUmVjZXZpZXIgTUJlYW4KKyAgICAgKiA8ZG9tYWluPjp0eXBlPUNsdXN0ZXJSZWNlaXZlcixob3N0PTxob3N0PgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHVucmVnaXN0ZXJSZWNldmllck1CZWFuKCkgeworICAgICAgICBpZiAoY2x1c3RlciAhPSBudWxsICYmIGdldE9iamVjdE5hbWUoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgY2x1c3RlciBpbnN0YW5jZW9mIFNpbXBsZVRjcENsdXN0ZXIpIHsKKyAgICAgICAgICAgIFNpbXBsZVRjcENsdXN0ZXIgc2NsdXN0ZXIgPSAoU2ltcGxlVGNwQ2x1c3RlcikgY2x1c3RlcjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IHNjbHVzdGVyLmdldE1CZWFuU2VydmVyKCk7CisgICAgICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4oZ2V0T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogc3RvcCBMaXN0ZW5lciBzb2NrZXRzCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc3RvcExpc3RlbmluZygpIDsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IExpc3RlbmVyCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsaXN0ZW4gKCkKKyAgICAgICB0aHJvd3MgRXhjZXB0aW9uIDsKKworICAgIAorICAgIC8qKgorICAgICAqIFN0YXJ0IHRocmVhZCBhbmQgbGlzdGVuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcnVuKCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBsaXN0ZW4oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiB4ICkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gc3RhcnQgY2x1c3RlciBsaXN0ZW5lci4iLHgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlY2VpdmVyIG1lc3NhZ2VzCisKKyAgICAvKioKKyAgICAgKiByZWNlaXZlciBNZXNzYWdlIGZyb20gb3RoZXIgbm9kZS4KKyAgICAgKiBBbGwgU2Vzc2lvbk1lc3NhZ2UgZm9yd2FyZCB0byBDbHVzdGVyTWFuYWdlciBhbmQgb3RoZXIgbWVzc2FnZSBkaXNwYXRjaCB0byBhbGwgYWNjZXB0IE1lc3NhZ2VMaXN0ZW5lci4KKyAgICAgKgorICAgICAqIEBzZWUgQ2x1c3RlclNlc3Npb25MaXN0ZW5lciNtZXNzYWdlUmVjZWl2ZWQoQ2x1c3Rlck1lc3NhZ2UpCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWVzc2FnZURhdGFSZWNlaXZlZChDbHVzdGVyRGF0YSBkYXRhKSB7CisgICAgLy9wdWJsaWMgdm9pZCBtZXNzYWdlRGF0YVJlY2VpdmVkKGJ5dGVbXSBkYXRhKSB7CisgICAgICAgIGxvbmcgdGltZVNlbnQgPSAwIDsKKyAgICAgICAgaWYgKGRvUmVjZWl2ZWRQcm9jZXNzaW5nU3RhdHMpIHsKKyAgICAgICAgICAgIHRpbWVTZW50ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsdXN0ZXJNZXNzYWdlIG1lc3NhZ2UgPSBkZXNlcmlhbGl6ZShkYXRhKTsKKyAgICAgICAgICAgIGNsdXN0ZXIucmVjZWl2ZShtZXNzYWdlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZworICAgICAgICAgICAgICAgICAgICAuZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBkZXNlcmlhbGl6ZSBzZXNzaW9uIG1lc3NhZ2Ugb3IgdW5leHBlY3RlZCBleGNlcHRpb24gZnJvbSBtZXNzYWdlIGxpc3RlbmVyLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZG9SZWNlaXZlZFByb2Nlc3NpbmdTdGF0cykgeworICAgICAgICAgICAgICAgIGFkZFJlY2VpdmVkUHJvY2Vzc2luZ1N0YXRzKHRpbWVTZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGRlc2VyaWFsaXplIHRoZSByZWNlaWV2ZSBjbHVzdGVyIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gZGF0YSB1bmNvbXByZXNzIGRhdGEKKyAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqLworICAgIC8vcHJvdGVjdGVkIENsdXN0ZXJNZXNzYWdlIGRlc2VyaWFsaXplKGJ5dGVbXSBkYXRhKQorICAgIHByb3RlY3RlZCBDbHVzdGVyTWVzc2FnZSBkZXNlcmlhbGl6ZShDbHVzdGVyRGF0YSBkYXRhKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IG1lc3NhZ2UgPSBudWxsOworICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnN0cmVhbTsKKyAgICAgICAgICAgIGlmIChpc0NvbXByZXNzKCkgfHwgZGF0YS5nZXRDb21wcmVzcygpID09IENsdXN0ZXJNZXNzYWdlLkZMQUdfQUxMT1dFRCApIHsKKyAgICAgICAgICAgICAgICBpbnN0cmVhbSA9IG5ldyBHWklQSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEuZ2V0TWVzc2FnZSgpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJlcGxpY2F0aW9uU3RyZWFtIHN0cmVhbSA9IG5ldyBSZXBsaWNhdGlvblN0cmVhbShpbnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBzdHJlYW0ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgLy8gY2FsYyBzdGF0cyByZWFsbHkgcmVjZWl2ZWQgYnl0ZXMKKyAgICAgICAgICAgIHRvdGFsUmVjZWl2ZWRCeXRlcyArPSBkYXRhLmdldE1lc3NhZ2UoKS5sZW5ndGg7CisgICAgICAgICAgICAvL3RvdGFsUmVjZWl2ZWRCeXRlcyArPSBkYXRhLmxlbmd0aDsKKyAgICAgICAgICAgIG5yT2ZNc2dzUmVjZWl2ZWQrKzsKKyAgICAgICAgICAgIGluc3RyZWFtLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBDbHVzdGVyTWVzc2FnZSkKKyAgICAgICAgICAgIHJldHVybiAoQ2x1c3Rlck1lc3NhZ2UpIG1lc3NhZ2U7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVzc2FnZSAiICsgbWVzc2FnZS50b1N0cmluZygpICsgIiBmcm9tIHR5cGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlLmdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICArICIgdHJhbnNmZXJlZCBidXQgaXMgbm90IGEgY2x1c3RlciBtZXNzYWdlIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGVyZm9ybWFuY2UgU3RhdHMKKworICAgIC8qKgorICAgICAqIFJlc2V0IHNlbmRlciBzdGF0aXN0aWNzCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0U3RhdGlzdGljcygpIHsKKyAgICAgICAgbnJPZk1zZ3NSZWNlaXZlZCA9IDA7CisgICAgICAgIHRvdGFsUmVjZWl2ZWRCeXRlcyA9IDA7CisgICAgICAgIG1pblJlY2VpdmVkUHJvY2Vzc2luZ1RpbWUgPSBMb25nLk1BWF9WQUxVRSA7CisgICAgICAgIG1heFJlY2VpdmVkUHJvY2Vzc2luZ1RpbWUgPSAwIDsKKyAgICAgICAgcmVjZWl2ZWRQcm9jZXNzaW5nVGltZSA9IDAgOworICAgICAgICByZWNlaXZlZFRpbWUgPSAwIDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgcmVjZWl2ZXIgcHJvY2Vzc2luZyBzdGF0cyB0aW1lcworICAgICAqIEBwYXJhbSBzdGFydFRpbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRSZWNlaXZlZFByb2Nlc3NpbmdTdGF0cyhsb25nIHN0YXJ0VGltZSkgeworICAgICAgICBsb25nIGN1cnJlbnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA7CisgICAgICAgIGxvbmcgdGltZSA9IGN1cnJlbnQgLSBzdGFydFRpbWUgOworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgaWYodGltZSA8IG1pblJlY2VpdmVkUHJvY2Vzc2luZ1RpbWUpCisgICAgICAgICAgICAgICAgbWluUmVjZWl2ZWRQcm9jZXNzaW5nVGltZSA9IHRpbWUgOworICAgICAgICAgICAgaWYoIHRpbWUgPiBtYXhSZWNlaXZlZFByb2Nlc3NpbmdUaW1lKQorICAgICAgICAgICAgICAgIG1heFJlY2VpdmVkUHJvY2Vzc2luZ1RpbWUgPSB0aW1lIDsKKyAgICAgICAgICAgIHJlY2VpdmVkUHJvY2Vzc2luZ1RpbWUgKz0gdGltZSA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBpZiAoKGN1cnJlbnQgLSBsYXN0Q2hlY2tlZCkgPiA1MDAwKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDYWxjIG1zZyBzZW5kIHRpbWUgdG90YWw9IiArIHJlY2VpdmVkVGltZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAibXMgbnVtIHJlcXVlc3Q9IiArIG5yT2ZNc2dzUmVjZWl2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhdmVyYWdlIHBlciBtc2c9IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAocmVjZWl2ZWRUaW1lIC8gbnJPZk1zZ3NSZWNlaXZlZCkgKyAibXMuIik7CisgICAgICAgICAgICAgICAgbGFzdENoZWNrZWQ9Y3VycmVudCA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmlvLkxpc3RlbkNhbGxiYWNrI3NlbmRBY2soKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRBY2soKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL0NvbnN0YW50cy5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWFjYThhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3A7CisKKy8qKgorICogTWFuaWZlc3QgY29uc3RhbnRzIGZvciB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcDwvY29kZT4KKyAqIHBhY2thZ2UuCisgKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhY2thZ2UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcCI7CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvRGF0YVNlbmRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9EYXRhU2VuZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxNjhlOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvRGF0YVNlbmRlci5qYXZhCkBAIC0wLDAgKzEsOTQ1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3A7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmlvLlhCeXRlQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworCisvKioKKyAqIFNlbmQgY2x1c3RlciBtZXNzYWdlcyB3aXRoIG9ubHkgb25lIHNvY2tldC4gQWNrIGFuZCBrZWVwIEFsaXZlIEhhbmRsaW5nIGlzCisgKiBzdXBwb3J0ZWQKKyAqIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA1LjUuNworICovCitwdWJsaWMgY2xhc3MgRGF0YVNlbmRlciBpbXBsZW1lbnRzIElEYXRhU2VuZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5CisgICAgICAgICAgICAuZ2V0TG9nKERhdGFTZW5kZXIuY2xhc3MpOworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0gU3RyaW5nTWFuYWdlcgorICAgICAgICAgICAgLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJEYXRhU2VuZGVyLzIuMSI7CisKKyAgICAvKioKKyAgICAgKiByZWNlaXZlciBhZGRyZXNzCisgICAgICovCisgICAgcHJpdmF0ZSBJbmV0QWRkcmVzcyBhZGRyZXNzOworCisgICAgLyoqCisgICAgICogcmVjZWl2ZXIgcG9ydAorICAgICAqLworICAgIHByaXZhdGUgaW50IHBvcnQ7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBjbHVzdGVyIGRvbWFpbgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRvbWFpbjsKKworICAgIC8qKgorICAgICAqIGN1cnJlbnQgc2VuZGVyIHNvY2tldAorICAgICAqLworICAgIHByaXZhdGUgU29ja2V0IHNvY2tldCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBpcyBTb2NrZXQgcmVhbGx5IGNvbm5lY3RlZAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NvY2tldENvbm5lY3RlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogTWVzc2FnZSB0cmFuc2ZlciBvdmVyIHNvY2tldCA/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTWVzc2FnZVRyYW5zZmVyU3RhcnRlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogc2VuZGVyIGlzIGluIHN1c3BlY3Qgc3RhdGUgKGxhc3QgdHJhbnNmZXIgZmFpbGVkKQorICAgICAqLworICAgIHByaXZhdGUgU2VuZGVyU3RhdGUgc2VuZGVyU3RhdGUgPSBuZXcgU2VuZGVyU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIHdhaXQgdGltZSBmb3IgYWNrCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIGFja1RpbWVvdXQ7CisKKyAgICAvKioKKyAgICAgKiBudW1iZXIgb2YgcmVxdWVzdHMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBuck9mUmVxdWVzdHMgPSAwOworCisgICAgLyoqCisgICAgICogdG90YWwgYnl0ZXMgdG8gdHJhbnNmZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyB0b3RhbEJ5dGVzID0gMDsKKworICAgIC8qKgorICAgICAqIG51bWJlciBvZiBjb25uZWN0cworICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGNvbm5lY3RDb3VudGVyID0gMDsKKworICAgIC8qKgorICAgICAqIG51bWJlciBvZiBleHBsaXppdCBkaXNjb25uZWN0cworICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGRpc2Nvbm5lY3RDb3VudGVyID0gMDsKKworICAgIC8qKgorICAgICAqIG51bWJlciBvZiBmYWlsaW5nIGFja3MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBtaXNzaW5nQWNrQ291bnRlciA9IDA7CisKKyAgICAvKioKKyAgICAgKiBudW1iZXIgb2YgZGF0YSByZXNlbmRzIChzZWNvbmQgdHJ5cyBhZnRlciBzb2NrZXQgZmFpbHVyZSkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBkYXRhUmVzZW5kQ291bnRlciA9IDA7CisKKyAgICAvKioKKyAgICAgKiBudW1iZXIgb2YgZGF0YSBmYWlsdXJlIHNlbmRzIAorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGRhdGFGYWlsdXJlQ291bnRlciA9IDA7CisgICAgCisgICAgLyoqCisgICAgICogZG9Qcm9jZXNzaW5nU3RhdHMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb1Byb2Nlc3NpbmdTdGF0cyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogcHJvZXNzaW5nVGltZQorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIHByb2Nlc3NpbmdUaW1lID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBtaW4gcHJvZXNzaW5nVGltZQorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIG1pblByb2Nlc3NpbmdUaW1lID0gTG9uZy5NQVhfVkFMVUUgOworCisgICAgLyoqCisgICAgICogbWF4IHByb2Vzc2luZ1RpbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBtYXhQcm9jZXNzaW5nVGltZSA9IDA7CisgICAKKyAgICAvKioKKyAgICAgKiBkb1dhaXRBY2tTdGF0cworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGRvV2FpdEFja1N0YXRzID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiB3YWl0QWNrVGltZQorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIHdhaXRBY2tUaW1lID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBtaW4gd2FpdEFja1RpbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBtaW5XYWl0QWNrVGltZSA9IExvbmcuTUFYX1ZBTFVFIDsKKworICAgIC8qKgorICAgICAqIG1heCB3YWl0QWNrVGltZQorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIG1heFdhaXRBY2tUaW1lID0gMDsKKworICAgIC8qKgorICAgICAqIGtlZXAgc29ja2V0IG9wZW4gZm9yIG5vIG1vcmUgdGhhbiBvbmUgbWluCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIGtlZXBBbGl2ZVRpbWVvdXQgPSA2MCAqIDEwMDA7CisKKyAgICAvKioKKyAgICAgKiBtYXggcmVxdWVzdHMgYmVmb3JlIHJlY29ubmVjdGluZyAoZGVmYXVsdCAtMSB1bmxpbWl0ZWQpCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQga2VlcEFsaXZlTWF4UmVxdWVzdENvdW50ID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBMYXN0IGNvbm5lY3QgdGltZXN0YW1wCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcga2VlcEFsaXZlQ29ubmVjdFRpbWUgPSAwOworCisgICAgLyoqCisgICAgICoga2VlcGFsaXZlIGNvdW50ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGtlZXBBbGl2ZUNvdW50ID0gMDsKKworICAgIC8qKgorICAgICAqIHdhaXQgZm9yIHJlY2VpdmVyIEFjaworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB3YWl0Rm9yQWNrID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBudW1iZXIgb2Ygc29ja2V0IGNsb3NlCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc29ja2V0Q2xvc2VDb3VudGVyID0gMCA7CisKKyAgICAvKioKKyAgICAgKiBudW1iZXIgb2Ygc29ja2V0IG9wZW4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzb2NrZXRPcGVuQ291bnRlciA9IDAgOworCisgICAgLyoqCisgICAgICogbnVtYmVyIG9mIHNvY2tldCBvcGVuIGZhaWx1cmVzCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc29ja2V0T3BlbkZhaWx1cmVDb3VudGVyID0gMCA7CisKKyAgICAvKioKKyAgICAgKiBBZnRlciBmYWlsdXJlIG1ha2UgYSByZXNlbmQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcmVzZW5kID0gZmFsc2UgOworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKyAgICAKKyAgICBwdWJsaWMgRGF0YVNlbmRlcihTdHJpbmcgZG9tYWluLEluZXRBZGRyZXNzIGhvc3QsIGludCBwb3J0KSB7CisgICAgICAgIHRoaXMuYWRkcmVzcyA9IGhvc3Q7CisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJJRGF0YVNlbmRlci5jcmVhdGUiLGFkZHJlc3MsIG5ldyBJbnRlZ2VyKHBvcnQpKSk7CisgICAgfQorCisgICAgcHVibGljIERhdGFTZW5kZXIoU3RyaW5nIGRvbWFpbixJbmV0QWRkcmVzcyBob3N0LCBpbnQgcG9ydCwgU2VuZGVyU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgdGhpcyhkb21haW4saG9zdCxwb3J0KTsKKyAgICAgICAgaWYgKCBzdGF0ZSAhPSBudWxsICkgdGhpcy5zZW5kZXJTdGF0ZSA9IHN0YXRlOworICAgIH0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uIGFuZCB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuck9mUmVxdWVzdHMuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TnJPZlJlcXVlc3RzKCkgeworICAgICAgICByZXR1cm4gbnJPZlJlcXVlc3RzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdG90YWxCeXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbEJ5dGVzKCkgeworICAgICAgICByZXR1cm4gdG90YWxCeXRlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGF2ZyB0b3RhbEJ5dGVzL25yT2ZSZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRBdmdNZXNzYWdlU2l6ZSgpIHsKKyAgICAgICAgaWYgKCBuck9mUmVxdWVzdHMgPiAwICkgeworICAgICAgICAgICAgcmV0dXJuIHRvdGFsQnl0ZXMgLyBuck9mUmVxdWVzdHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYXZnIHByb2Nlc3NpbmdUaW1lL25yT2ZSZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZG91YmxlIGdldEF2Z1Byb2Nlc3NpbmdUaW1lKCkgeworICAgICAgICBpZiAoIG5yT2ZSZXF1ZXN0cyA+IDAgKSB7CisgICAgICAgICAgICByZXR1cm4gKChkb3VibGUpcHJvY2Vzc2luZ1RpbWUpIC8gbnJPZlJlcXVlc3RzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBtYXhQcm9jZXNzaW5nVGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRNYXhQcm9jZXNzaW5nVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIG1heFByb2Nlc3NpbmdUaW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1pblByb2Nlc3NpbmdUaW1lLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldE1pblByb2Nlc3NpbmdUaW1lKCkgeworICAgICAgICByZXR1cm4gbWluUHJvY2Vzc2luZ1RpbWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJvY2Vzc2luZ1RpbWUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0UHJvY2Vzc2luZ1RpbWUoKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzaW5nVGltZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkb1Byb2Nlc3NpbmdTdGF0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RvUHJvY2Vzc2luZ1N0YXRzKCkgeworICAgICAgICByZXR1cm4gZG9Qcm9jZXNzaW5nU3RhdHM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSBkb1Byb2Nlc3NpbmdTdGF0cyBUaGUgZG9Qcm9jZXNzaW5nU3RhdHMgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvUHJvY2Vzc2luZ1N0YXRzKGJvb2xlYW4gZG9Qcm9jZXNzaW5nU3RhdHMpIHsKKyAgICAgICAgdGhpcy5kb1Byb2Nlc3NpbmdTdGF0cyA9IGRvUHJvY2Vzc2luZ1N0YXRzOworICAgIH0KKyAKKyAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRvV2FpdEFja1N0YXRzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRG9XYWl0QWNrU3RhdHMoKSB7CisgICAgICAgIHJldHVybiBkb1dhaXRBY2tTdGF0czsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIGRvV2FpdEFja1N0YXRzIFRoZSBkb1dhaXRBY2tTdGF0cyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9XYWl0QWNrU3RhdHMoYm9vbGVhbiBkb1dhaXRBY2tTdGF0cykgeworICAgICAgICB0aGlzLmRvV2FpdEFja1N0YXRzID0gZG9XYWl0QWNrU3RhdHM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYXZnIHdhaXRBY2tUaW1lL25yT2ZSZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZG91YmxlIGdldEF2Z1dhaXRBY2tUaW1lKCkgeworICAgICAgICBpZiAoIG5yT2ZSZXF1ZXN0cyA+IDAgKSB7CisgICAgICAgICAgICByZXR1cm4gKChkb3VibGUpd2FpdEFja1RpbWUpIC8gbnJPZlJlcXVlc3RzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBtYXhXYWl0QWNrVGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRNYXhXYWl0QWNrVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIG1heFdhaXRBY2tUaW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1pbldhaXRBY2tUaW1lLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldE1pbldhaXRBY2tUaW1lKCkgeworICAgICAgICByZXR1cm4gbWluV2FpdEFja1RpbWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2FpdEFja1RpbWUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0V2FpdEFja1RpbWUoKSB7CisgICAgICAgIHJldHVybiB3YWl0QWNrVGltZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb25uZWN0Q291bnRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDb25uZWN0Q291bnRlcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbm5lY3RDb3VudGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGlzY29ubmVjdENvdW50ZXIuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0RGlzY29ubmVjdENvdW50ZXIoKSB7CisgICAgICAgIHJldHVybiBkaXNjb25uZWN0Q291bnRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1pc3NpbmdBY2tDb3VudGVyLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldE1pc3NpbmdBY2tDb3VudGVyKCkgeworICAgICAgICByZXR1cm4gbWlzc2luZ0Fja0NvdW50ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzb2NrZXRPcGVuQ291bnRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNvY2tldE9wZW5Db3VudGVyKCkgeworICAgICAgICByZXR1cm4gc29ja2V0T3BlbkNvdW50ZXI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc29ja2V0T3BlbkZhaWx1cmVDb3VudGVyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U29ja2V0T3BlbkZhaWx1cmVDb3VudGVyKCkgeworICAgICAgICByZXR1cm4gc29ja2V0T3BlbkZhaWx1cmVDb3VudGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc29ja2V0Q2xvc2VDb3VudGVyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U29ja2V0Q2xvc2VDb3VudGVyKCkgeworICAgICAgICByZXR1cm4gc29ja2V0Q2xvc2VDb3VudGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGF0YVJlc2VuZENvdW50ZXIuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0RGF0YVJlc2VuZENvdW50ZXIoKSB7CisgICAgICAgIHJldHVybiBkYXRhUmVzZW5kQ291bnRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRhdGFGYWlsdXJlQ291bnRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXREYXRhRmFpbHVyZUNvdW50ZXIoKSB7CisgICAgICAgIHJldHVybiBkYXRhRmFpbHVyZUNvdW50ZXI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBhZGRyZXNzIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKEluZXRBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5ldEFkZHJlc3MgZ2V0QWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIHBvcnQgVGhlIHBvcnQgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHBvcnQpIHsKKyAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRQb3J0KCkgeworICAgICAgICByZXR1cm4gcG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRvbWFpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIGRvbWFpbjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIGRvbWFpbiBUaGUgZG9tYWluIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREb21haW4oU3RyaW5nIGRvbWFpbikgeworICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7CisgICAgICAgIHJldHVybiBpc1NvY2tldENvbm5lY3RlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIElzIERhdGFTZW5kZXIgc2VuZCBhIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01lc3NhZ2VUcmFuc2ZlclN0YXJ0ZWQoKSB7CisgICAgICAgIHJldHVybiBpc01lc3NhZ2VUcmFuc2ZlclN0YXJ0ZWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSBpc1NvY2tldENvbm5lY3RlZAorICAgICAqICAgICAgICAgICAgVGhlIGlzU29ja2V0Q29ubmVjdGVkIHRvIHNldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTb2NrZXRDb25uZWN0ZWQoYm9vbGVhbiBpc1NvY2tldENvbm5lY3RlZCkgeworICAgICAgICB0aGlzLmlzU29ja2V0Q29ubmVjdGVkID0gaXNTb2NrZXRDb25uZWN0ZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTdXNwZWN0KCkgeworICAgICAgICByZXR1cm4gc2VuZGVyU3RhdGUuaXNTdXNwZWN0KCkgfHwgc2VuZGVyU3RhdGUuaXNGYWlsaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U3VzcGVjdCgpIHsKKyAgICAgICAgcmV0dXJuIGlzU3VzcGVjdCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN1c3BlY3QoYm9vbGVhbiBzdXNwZWN0KSB7CisgICAgICAgIGlmICggc3VzcGVjdCApIAorICAgICAgICAgICAgdGhpcy5zZW5kZXJTdGF0ZS5zZXRTdXNwZWN0KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMuc2VuZGVyU3RhdGUuc2V0UmVhZHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRBY2tUaW1lb3V0KCkgeworICAgICAgICByZXR1cm4gYWNrVGltZW91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY2tUaW1lb3V0KGxvbmcgYWNrVGltZW91dCkgeworICAgICAgICB0aGlzLmFja1RpbWVvdXQgPSBhY2tUaW1lb3V0OworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEtlZXBBbGl2ZVRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBrZWVwQWxpdmVUaW1lb3V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEtlZXBBbGl2ZVRpbWVvdXQobG9uZyBrZWVwQWxpdmVUaW1lb3V0KSB7CisgICAgICAgIHRoaXMua2VlcEFsaXZlVGltZW91dCA9IGtlZXBBbGl2ZVRpbWVvdXQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRLZWVwQWxpdmVNYXhSZXF1ZXN0Q291bnQoKSB7CisgICAgICAgIHJldHVybiBrZWVwQWxpdmVNYXhSZXF1ZXN0Q291bnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0S2VlcEFsaXZlTWF4UmVxdWVzdENvdW50KGludCBrZWVwQWxpdmVNYXhSZXF1ZXN0Q291bnQpIHsKKyAgICAgICAgdGhpcy5rZWVwQWxpdmVNYXhSZXF1ZXN0Q291bnQgPSBrZWVwQWxpdmVNYXhSZXF1ZXN0Q291bnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBrZWVwQWxpdmVDb25uZWN0VGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRLZWVwQWxpdmVDb25uZWN0VGltZSgpIHsKKyAgICAgICAgcmV0dXJuIGtlZXBBbGl2ZUNvbm5lY3RUaW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUga2VlcEFsaXZlQ291bnQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRLZWVwQWxpdmVDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGtlZXBBbGl2ZUNvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2FpdEZvckFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dhaXRGb3JBY2soKSB7CisgICAgICAgIHJldHVybiB3YWl0Rm9yQWNrOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB3YWl0Rm9yQWNrCisgICAgICogICAgICAgICAgICBUaGUgd2FpdEZvckFjayB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2FpdEZvckFjayhib29sZWFuIHdhaXRGb3JBY2spIHsKKyAgICAgICAgdGhpcy53YWl0Rm9yQWNrID0gd2FpdEZvckFjazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlc2VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc2VuZCgpIHsKKyAgICAgICAgcmV0dXJuIHJlc2VuZDsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIHJlc2VuZCBUaGUgcmVzZW5kIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNlbmQoYm9vbGVhbiByZXNlbmQpIHsKKyAgICAgICAgdGhpcy5yZXNlbmQgPSByZXNlbmQ7CisgICAgfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc29ja2V0LgorICAgICAqLworICAgIHB1YmxpYyBTb2NrZXQgZ2V0U29ja2V0KCkgeworICAgICAgICByZXR1cm4gc29ja2V0OworICAgIH0KKworICAgIHB1YmxpYyBTZW5kZXJTdGF0ZSBnZXRTZW5kZXJTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRlclN0YXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBzb2NrZXQgVGhlIHNvY2tldCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U29ja2V0KFNvY2tldCBzb2NrZXQpIHsKKyAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7CisgICAgfQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogQ29ubmVjdCBvdGhlciBjbHVzdGVyIG1lbWJlciByZWNlaXZlciAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuSURhdGFTZW5kZXIjY29ubmVjdCgpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmKCFpc01lc3NhZ2VUcmFuc2ZlclN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIG9wZW5Tb2NrZXQoKTsKKyAgICAgICAgICAgIGlmKGlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0Q291bnRlcisrOworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiSURhdGFTZW5kZXIuY29ubmVjdCIsIGFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihwb3J0KSxuZXcgTG9uZyhjb25uZWN0Q291bnRlcikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIAorICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcoIklEYXRhU2VuZGVyLm1lc3NhZ2UuY3JlYXRlIiwgYWRkcmVzcy5nZXRIb3N0QWRkcmVzcygpLG5ldyBJbnRlZ2VyKHBvcnQpKSk7CisgICB9CisKKyAKKyAgICAvKioKKyAgICAgKiBkaXNjb25uZWN0IGFuZCBjbG9zZSBzb2NrZXQKKyAgICAgKiAKKyAgICAgKiBAc2VlIElEYXRhU2VuZGVyI2Rpc2Nvbm5lY3QoKQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNjb25uZWN0KCkgeworICAgICAgICBpZighaXNNZXNzYWdlVHJhbnNmZXJTdGFydGVkKSB7CisgICAgICAgICAgICBib29sZWFuIGNvbm5lY3QgPSBpc0Nvbm5lY3RlZCgpIDsKKyAgICAgICAgICAgIGNsb3NlU29ja2V0KCk7CisgICAgICAgICAgICBpZihjb25uZWN0KSB7CisgICAgICAgICAgICAgICAgZGlzY29ubmVjdENvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIklEYXRhU2VuZGVyLmRpc2Nvbm5lY3QiLCBhZGRyZXNzLmdldEhvc3RBZGRyZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihwb3J0KSxuZXcgTG9uZyhkaXNjb25uZWN0Q291bnRlcikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIAorICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcoIklEYXRhU2VuZGVyLm1lc3NhZ2UuZGlzY29ubmVjdCIsIGFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSxuZXcgSW50ZWdlcihwb3J0KSkpOworICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjaywgaWYgdGltZSB0byBjbG9zZSBzb2NrZXQhIEltcG9ydGFudCBmb3IgQXN5bmNTb2NrZXRTZW5kZXIgdGhhdAorICAgICAqIHJlcGxpY2F0aW9uIHRocmVhZCBpcyBub3QgZm9yayBhZ2FpbiEgPGI+T25seSB3b3JrIHdoZW4ga2VlcEFsaXZlVGltZW91dAorICAgICAqIG9yIGtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudCBncmVhdGVyIC0xIDwvYj4KKyAgICAgKiBGSVhNRSBDYW4gd2UgY2xvc2UgYSBzb2NrZXQgd2hlbiBhIG1lc3NhZ2Ugd2FpdCBmb3IgYWNrPworICAgICAqIEByZXR1cm4gdHJ1ZSwgaXMgc29ja2V0IGNsb3NlCisgICAgICogQHNlZSBEYXRhU2VuZGVyI2Nsb3NlU29ja2V0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY2hlY2tLZWVwQWxpdmUoKSB7CisgICAgICAgIGJvb2xlYW4gaXNDbG9zZVNvY2tldCA9IHRydWUgOworICAgICAgICBpZighaXNNZXNzYWdlVHJhbnNmZXJTdGFydGVkKSB7CisgICAgICAgICAgICBpZihpc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKChrZWVwQWxpdmVUaW1lb3V0ID4gLTEgJiYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0ga2VlcEFsaXZlQ29ubmVjdFRpbWUpID4ga2VlcEFsaXZlVGltZW91dCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKGtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudCA+IC0xICYmIGtlZXBBbGl2ZUNvdW50ID49IGtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlU29ja2V0KCk7CisgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaXNDbG9zZVNvY2tldCA9IGZhbHNlIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBpc0Nsb3NlU29ja2V0ID0gZmFsc2UgOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIGlzQ2xvc2VTb2NrZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBtZXNzYWdlCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLklEYXRhU2VuZGVyI3NlbmRNZXNzYWdlKCwKKyAgICAgKiAgICAgIENsdXN0ZXJEYXRhKQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZW5kTWVzc2FnZShDbHVzdGVyRGF0YSBkYXRhKQorICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBwdXNoTWVzc2FnZShkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldCBzZW5kZXIgc3RhdGlzdGljcworICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldFN0YXRpc3RpY3MoKSB7CisgICAgICAgIG5yT2ZSZXF1ZXN0cyA9IDA7CisgICAgICAgIHRvdGFsQnl0ZXMgPSAwOworICAgICAgICBkaXNjb25uZWN0Q291bnRlciA9IDA7CisgICAgICAgIGNvbm5lY3RDb3VudGVyID0gaXNDb25uZWN0ZWQoKSA/IDEgOiAwOworICAgICAgICBtaXNzaW5nQWNrQ291bnRlciA9IDA7CisgICAgICAgIGRhdGFSZXNlbmRDb3VudGVyID0gMDsKKyAgICAgICAgZGF0YUZhaWx1cmVDb3VudGVyID0gMCA7CisgICAgICAgIHNvY2tldE9wZW5Db3VudGVyID1pc0Nvbm5lY3RlZCgpID8gMSA6IDA7CisgICAgICAgIHNvY2tldE9wZW5GYWlsdXJlQ291bnRlciA9IDAgOworICAgICAgICBzb2NrZXRDbG9zZUNvdW50ZXIgPSAwOworICAgICAgICBwcm9jZXNzaW5nVGltZSA9IDAgOworICAgICAgICBtaW5Qcm9jZXNzaW5nVGltZSA9IExvbmcuTUFYX1ZBTFVFIDsKKyAgICAgICAgbWF4UHJvY2Vzc2luZ1RpbWUgPSAwIDsKKyAgICAgICAgd2FpdEFja1RpbWUgPSAwIDsKKyAgICAgICAgbWluV2FpdEFja1RpbWUgPSBMb25nLk1BWF9WQUxVRSA7CisgICAgICAgIG1heFdhaXRBY2tUaW1lID0gMCA7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGlzIFNvY2tlclNlbmRlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJEYXRhU2VuZGVyWyIpOworICAgICAgICBidWYuYXBwZW5kKGdldEFkZHJlc3MoKSkuYXBwZW5kKCI6IikuYXBwZW5kKGdldFBvcnQoKSkuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKyAKKyAgICAvKioKKyAgICAgKiBvcGVuIHJlYWwgc29ja2V0IGFuZCBzZXQgdGltZSBvdXQgd2hlbiB3YWl0Rm9yQWNrIGlzIGVuYWJsZWQKKyAgICAgKiBpcyBzb2NrZXQgb3BlbiByZXR1cm4gZGlyZWN0bHkKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBvcGVuU29ja2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTb2NrZXRFeGNlcHRpb24geworICAgICAgIGlmKGlzQ29ubmVjdGVkKCkpCisgICAgICAgICAgIHJldHVybiA7CisgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNyZWF0ZVNvY2tldCgpOworICAgICAgICAgICAgaWYgKGlzV2FpdEZvckFjaygpKQorICAgICAgICAgICAgICAgIHNvY2tldC5zZXRTb1RpbWVvdXQoKGludCkgYWNrVGltZW91dCk7CisgICAgICAgICAgICBpc1NvY2tldENvbm5lY3RlZCA9IHRydWU7CisgICAgICAgICAgICBzb2NrZXRPcGVuQ291bnRlcisrOworICAgICAgICAgICAgdGhpcy5rZWVwQWxpdmVDb3VudCA9IDA7CisgICAgICAgICAgICB0aGlzLmtlZXBBbGl2ZUNvbm5lY3RUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiSURhdGFTZW5kZXIub3BlblNvY2tldCIsIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRIb3N0QWRkcmVzcygpLCBuZXcgSW50ZWdlcihwb3J0KSxuZXcgTG9uZyhzb2NrZXRPcGVuQ291bnRlcikpKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4MSkgeworICAgICAgICAgICAgc29ja2V0T3BlbkZhaWx1cmVDb3VudGVyKysgOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIklEYXRhU2VuZGVyLm9wZW5Tb2NrZXQuZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLmdldEhvc3RBZGRyZXNzKCksIG5ldyBJbnRlZ2VyKHBvcnQpLG5ldyBMb25nKHNvY2tldE9wZW5GYWlsdXJlQ291bnRlcikpLCBleDEpOworICAgICAgICAgICAgdGhyb3cgZXgxOworICAgICAgICB9CisgICAgICAgIAorICAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogQHRocm93cyBTb2NrZXRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTb2NrZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNvY2tldEV4Y2VwdGlvbiB7CisgICAgICAgIHNvY2tldCA9IG5ldyBTb2NrZXQoZ2V0QWRkcmVzcygpLCBnZXRQb3J0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNsb3NlIHNvY2tldAorICAgICAqIAorICAgICAqIEBzZWUgRGF0YVNlbmRlciNkaXNjb25uZWN0KCkKKyAgICAgKiBAc2VlIERhdGFTZW5kZXIjY2xvc2VTb2NrZXQoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlU29ja2V0KCkgeworICAgICAgICBpZihpc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgaWYgKHNvY2tldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHNvY2tldCA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5rZWVwQWxpdmVDb3VudCA9IDA7CisgICAgICAgICAgICBpc1NvY2tldENvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgc29ja2V0Q2xvc2VDb3VudGVyKys7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiSURhdGFTZW5kZXIuY2xvc2VTb2NrZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5nZXRIb3N0QWRkcmVzcygpLCBuZXcgSW50ZWdlcihwb3J0KSxuZXcgTG9uZyhzb2NrZXRDbG9zZUNvdW50ZXIpKSk7CisgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBzdGF0aXN0aWMgZm9yIHRoaXMgc29ja2V0IGluc3RhbmNlCisgICAgICogCisgICAgICogQHBhcmFtIGxlbmd0aAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZFN0YXRzKGludCBsZW5ndGgpIHsKKyAgICAgICAgbnJPZlJlcXVlc3RzKys7CisgICAgICAgIHRvdGFsQnl0ZXMgKz0gbGVuZ3RoOworICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSAmJiAobnJPZlJlcXVlc3RzICUgMTAwMCkgPT0gMCkgeworICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJJRGF0YVNlbmRlci5zdGF0cyIsIG5ldyBPYmplY3RbXSB7CisgICAgICAgICAgICAgICAgICAgIGdldEFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpLCBuZXcgSW50ZWdlcihnZXRQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyh0b3RhbEJ5dGVzKSwgbmV3IExvbmcobnJPZlJlcXVlc3RzKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcodG90YWxCeXRlcyAvIG5yT2ZSZXF1ZXN0cyksCisgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKGdldFByb2Nlc3NpbmdUaW1lKCkpLAorICAgICAgICAgICAgICAgICAgICBuZXcgRG91YmxlKGdldEF2Z1Byb2Nlc3NpbmdUaW1lKCkpfSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHByb2Nlc3Npbmcgc3RhdHMgdGltZXMKKyAgICAgKiBAcGFyYW0gc3RhcnRUaW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvY2Vzc2luZ1N0YXRzKGxvbmcgc3RhcnRUaW1lKSB7CisgICAgICAgIGxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lIDsKKyAgICAgICAgaWYodGltZSA8IG1pblByb2Nlc3NpbmdUaW1lKQorICAgICAgICAgICAgbWluUHJvY2Vzc2luZ1RpbWUgPSB0aW1lIDsKKyAgICAgICAgaWYoIHRpbWUgPiBtYXhQcm9jZXNzaW5nVGltZSkKKyAgICAgICAgICAgIG1heFByb2Nlc3NpbmdUaW1lID0gdGltZSA7CisgICAgICAgIHByb2Nlc3NpbmdUaW1lICs9IHRpbWUgOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgd2FpdEFjayBzdGF0cyB0aW1lcworICAgICAqIEBwYXJhbSBzdGFydFRpbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRXYWl0QWNrU3RhdHMobG9uZyBzdGFydFRpbWUpIHsKKyAgICAgICAgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWUgOworICAgICAgICBpZih0aW1lIDwgbWluV2FpdEFja1RpbWUpCisgICAgICAgICAgICBtaW5XYWl0QWNrVGltZSA9IHRpbWUgOworICAgICAgICBpZiggdGltZSA+IG1heFdhaXRBY2tUaW1lKQorICAgICAgICAgICAgbWF4V2FpdEFja1RpbWUgPSB0aW1lIDsKKyAgICAgICAgd2FpdEFja1RpbWUgKz0gdGltZSA7CisgICAgfQorICAgIC8qKgorICAgICAqIFB1c2ggbWVzc2FnZXMgd2l0aCBvbmx5IG9uZSBzb2NrZXQgYXQgYSB0aW1lCisgICAgICogV2FpdCBmb3IgYWNrIGlzIG5lZWRlZCBhbmQgbWFrZSBhdXRvIHJldHJ5IHdoZW4gd3JpdGUgbWVzc2FnZSBpcyBmYWlsZWQuCisgICAgICogQWZ0ZXIgc2VuZGluZyBlcnJvciBjbG9zZSBhbmQgcmVvcGVuIHNvY2tldCBhZ2Fpbi4KKyAgICAgKiAKKyAgICAgKiBBZnRlciBzdWNjZXNzZnVsbCBzZW5kaW5nIHVwZGF0ZSBzdGF0cworICAgICAqIAorICAgICAqIFdBUk5JTkc6IFN1YmNsYXNzZXMgbXVzdCBiZSB2ZXJ5IGNhcmVmdWxsIHRoYXQgb25seSBvbmUgdGhyZWFkIGNhbGwgdGhpcyBwdXNoTWVzc2FnZSBhdCBvbmNlISEhCisgICAgICogCisgICAgICogQHNlZSAjY2xvc2VTb2NrZXQoKQorICAgICAqIEBzZWUgI29wZW5Tb2NrZXQoKQorICAgICAqIEBzZWUgI3dyaXRlRGF0YShDbHVzdGVyRGF0YSkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgZGF0YSB0byBzZW5kCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICogQHNpbmNlIDUuNS4xMAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHB1c2hNZXNzYWdlKCBDbHVzdGVyRGF0YSBkYXRhKQorICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBsb25nIHRpbWUgPSAwIDsKKyAgICAgICAgaWYoZG9Qcm9jZXNzaW5nU3RhdHMpIHsKKyAgICAgICAgICAgIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIG1lc3NhZ2VUcmFuc2ZlcmVkID0gZmFsc2UgOworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgY2hlY2tLZWVwQWxpdmUoKTsKKyAgICAgICAgICAgIGlmICghaXNDb25uZWN0ZWQoKSkKKyAgICAgICAgICAgICAgICBvcGVuU29ja2V0KCk7CisgICAgICAgICAgICBlbHNlIGlmKGtlZXBBbGl2ZVRpbWVvdXQgPiAtMSkKKyAgICAgICAgICAgICAgICB0aGlzLmtlZXBBbGl2ZUNvbm5lY3RUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIH0KKyAgICAgICAgSU9FeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICB3cml0ZURhdGEoZGF0YSk7CisgICAgICAgICAgICAgbWVzc2FnZVRyYW5zZmVyZWQgPSB0cnVlIDsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICBpZihkYXRhLmdldFJlc2VuZCgpID09IENsdXN0ZXJNZXNzYWdlLkZMQUdfQUxMT1dFRCB8fCAKKyAgICAgICAgICAgICAgICAgICAgKGRhdGEuZ2V0UmVzZW5kKCkgPT0gQ2x1c3Rlck1lc3NhZ2UuRkxBR19ERUZBVUxUICYmIGlzUmVzZW5kKCkgKSkgeworICAgICAgICAgICAgICAgIC8vIHNlY29uZCB0cnkgd2l0aCBmcmVzaCBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgZGF0YVJlc2VuZENvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShzbS5nZXRTdHJpbmcoIklEYXRhU2VuZGVyLnNlbmQuYWdhaW4iLCBhZGRyZXNzLmdldEhvc3RBZGRyZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIocG9ydCkpLHgpOworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlU29ja2V0KCk7CisgICAgICAgICAgICAgICAgICAgIG9wZW5Tb2NrZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVEYXRhKGRhdGEpOworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlVHJhbnNmZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24geHgpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0geHg7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHh4IDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlU29ja2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IHg7CisgICAgICAgICAgICAgICAgdGhyb3cgeCA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0aGlzLmtlZXBBbGl2ZUNvdW50Kys7CisgICAgICAgICAgICBjaGVja0tlZXBBbGl2ZSgpOworICAgICAgICAgICAgaWYoZG9Qcm9jZXNzaW5nU3RhdHMpIHsKKyAgICAgICAgICAgICAgICBhZGRQcm9jZXNzaW5nU3RhdHModGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihtZXNzYWdlVHJhbnNmZXJlZCkgeworICAgICAgICAgICAgICAgIGFkZFN0YXRzKGRhdGEuZ2V0TWVzc2FnZSgpLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShzbS5nZXRTdHJpbmcoIklEYXRhU2VuZGVyLnNlbmQubWVzc2FnZSIsIGFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKHBvcnQpLCBkYXRhLmdldFVuaXF1ZUlkKCksIG5ldyBMb25nKGRhdGEuZ2V0TWVzc2FnZSgpLmxlbmd0aCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRhdGFGYWlsdXJlQ291bnRlcisrOworICAgICAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbnQgcmVhbCBjbHVzdGVyIE1lc3NhZ2UgdG8gc29ja2V0IHN0cmVhbQorICAgICAqIEZJWE1FIHNlbmQgY29tcHJlc3MKKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAc2luY2UgNS41LjEwCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVEYXRhKENsdXN0ZXJEYXRhIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7IAorICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgaXNNZXNzYWdlVHJhbnNmZXJTdGFydGVkID0gdHJ1ZSA7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ5dGVbXSBtZXNzYWdlID0gZGF0YS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gc29ja2V0LmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgb3V0LndyaXRlKFhCeXRlQnVmZmVyLmNyZWF0ZURhdGFQYWNrYWdlKG1lc3NhZ2UsZGF0YS5nZXRDb21wcmVzcygpKSk7CisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgIGlmIChpc1dhaXRGb3JBY2soKSkKKyAgICAgICAgICAgICAgICB3YWl0Rm9yQWNrKGFja1RpbWVvdXQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpc01lc3NhZ2VUcmFuc2ZlclN0YXJ0ZWQgPSBmYWxzZSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWl0IGZvciBBY2tub3dsZWRnZW1lbnQgZnJvbSBvdGhlciBzZXJ2ZXIKKyAgICAgKiBGSVhNRSBQbGVhc2UsIG5vdCB3YWl0IG9ubHkgZm9yIHRocmVlIGNoYXJjdGVycywgYmV0dGVyIGNvbnRyb2wgdGhhdCB0aGUgd2FpdCBhY2sgbWVzc2FnZSBpcyBjb3JyZWN0LgorICAgICAqIEBwYXJhbSB0aW1lb3V0CisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICogQHRocm93cyBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvckFjayhsb25nIHRpbWVvdXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyB0aW1lID0gMCA7CisgICAgICAgIGlmKGRvV2FpdEFja1N0YXRzKSB7CisgICAgICAgICAgICB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSAwOworICAgICAgICAgICAgaWYgKCBsb2cuaXNUcmFjZUVuYWJsZWQoKSApIAorICAgICAgICAgICAgICAgIGxvZy50cmFjZShzbS5nZXRTdHJpbmcoIklEYXRhU2VuZGVyLmFjay5zdGFydCIsZ2V0QWRkcmVzcygpLCBuZXcgSW50ZWdlcihzb2NrZXQuZ2V0TG9jYWxQb3J0KCkpKSk7CisgICAgICAgICAgICBpbnQgaSA9IHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpLnJlYWQoKTsKKyAgICAgICAgICAgIHdoaWxlICgoaSAhPSAtMSkgJiYgKGkgIT0gMykgJiYgYnl0ZXNSZWFkIDwgMTApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGxvZy5pc1RyYWNlRW5hYmxlZCgpICkgCisgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShzbS5nZXRTdHJpbmcoIklEYXRhU2VuZGVyLmFjay5yZWFkIixnZXRBZGRyZXNzKCksIG5ldyBJbnRlZ2VyKHNvY2tldC5nZXRMb2NhbFBvcnQoKSksbmV3IENoYXJhY3RlcigoY2hhcikgaSkpKTsKKyAgICAgICAgICAgICAgICBieXRlc1JlYWQrKzsKKyAgICAgICAgICAgICAgICBpID0gc29ja2V0LmdldElucHV0U3RyZWFtKCkucmVhZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgIT0gMykgeworICAgICAgICAgICAgICAgIGlmIChpID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihzbS5nZXRTdHJpbmcoIklEYXRhU2VuZGVyLmFjay5lb2YiLGdldEFkZHJlc3MoKSwgbmV3IEludGVnZXIoc29ja2V0LmdldExvY2FsUG9ydCgpKSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihzbS5nZXRTdHJpbmcoIklEYXRhU2VuZGVyLmFjay53cm9uZyIsZ2V0QWRkcmVzcygpLCBuZXcgSW50ZWdlcihzb2NrZXQuZ2V0TG9jYWxQb3J0KCkpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKHNtLmdldFN0cmluZygiSURhdGFTZW5kZXIuYWNrLnJlY2VpdmUiLCBnZXRBZGRyZXNzKCksbmV3IEludGVnZXIoc29ja2V0LmdldExvY2FsUG9ydCgpKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24geCkgeworICAgICAgICAgICAgbWlzc2luZ0Fja0NvdW50ZXIrKzsKKyAgICAgICAgICAgIFN0cmluZyBlcnJtc2cgPSBzbS5nZXRTdHJpbmcoIklEYXRhU2VuZGVyLmFjay5taXNzaW5nIiwgZ2V0QWRkcmVzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihzb2NrZXQuZ2V0TG9jYWxQb3J0KCkpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcodGhpcy5hY2tUaW1lb3V0KSk7CisgICAgICAgICAgICBpZiAoICF0aGlzLmlzU3VzcGVjdCgpICkgeworICAgICAgICAgICAgICAgIHRoaXMuc2V0U3VzcGVjdCh0cnVlKTsKKyAgICAgICAgICAgICAgICBpZiAoIGxvZy5pc1dhcm5FbmFibGVkKCkgKSBsb2cud2FybihlcnJtc2csIHgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpIClsb2cuZGVidWcoZXJybXNnLCB4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZihkb1dhaXRBY2tTdGF0cykgeworICAgICAgICAgICAgICAgIGFkZFdhaXRBY2tTdGF0cyh0aW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvRGF0YVNlbmRlcnMucHJvcGVydGllcyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvRGF0YVNlbmRlcnMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2JkYzdhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9EYXRhU2VuZGVycy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNCBAQAorZmFzdGFzeW5jcXVldWU9b3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5GYXN0QXN5bmNTb2NrZXRTZW5kZXIKK2FzeW5jaHJvbm91cz1vcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLkFzeW5jU29ja2V0U2VuZGVyCitzeW5jaHJvbm91cz1vcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlNvY2tldFNlbmRlcgorcG9vbGVkPW9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUG9vbGVkU29ja2V0U2VuZGVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL0Zhc3RBc3luY1NvY2tldFNlbmRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9GYXN0QXN5bmNTb2NrZXRTZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjMzMmUwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9GYXN0QXN5bmNTb2NrZXRTZW5kZXIuamF2YQpAQCAtMCwwICsxLDU3MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQtMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3A7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci51dGlsLkZhc3RRdWV1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudXRpbC5MaW5rT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci51dGlsLklRdWV1ZTsKKworLyoqCisgKiBTZW5kIGNsdXN0ZXIgbWVzc2FnZXMgZnJvbSBhIE1lc3NhZ2UgcXVldWUgd2l0aCBvbmx5IG9uZSBzb2NrZXQuIEFjayBhbmQga2VlcAorICogQWxpdmUgSGFuZGxpbmcgaXMgc3VwcG9ydGVkLiBGYXN0IFF1ZXVlIGNhbiBsaW1pdCBxdWV1ZSBzaXplIGFuZCBjb25zdW1lIGFsbCBtZXNzYWdlcyBhdCBxdWV1ZSBhdCBvbmUgYmxvY2suPGJyLz4KKyAqIExpbWl0IHRoZSBxdWV1ZSBsb2NrIGNvbnRlbnRpb24gdW5kZXIgaGlnaCBsb2FkITxici8+CisgKiA8dWw+CisgKiA8bGk+V2l0aCBhdXRvQ29ubmVjdD1mYWxzZSBhdCBSZXBsaWNhdGlvblRyYW5zbWl0dGVyLCB5b3UgY2FuIGRpc2Nvbm5lY3QgdGhlCisgKiBzZW5kZXIgYW5kIGFsbCBtZXNzYWdlcyBhcmUgcXVldWVkLiBPbmx5IHVzZSB0aGlzIGZvciBzbWFsbCBtYWludGFpbmNlCisgKiBpc3VzZXMhPC9saT4KKyAqIDxsaT53YWl0Rm9yQWNrPXRydWUsIG1lYW5zIHRoYXQgcmVjZWl2ZXIgYWNrIHRoZSB0cmFuc2ZlcjwvbGk+CisgKiA8bGk+YWZ0ZXIgb25lIG1pbnV0ZSBpZGxlIHRpbWUsIG9yIG51bWJlciBvZiByZXF1ZXN0ICgxMDApIHRoZSBjb25uZWN0aW9uIGlzCisgKiByZWNvbm5lY3RlZCB3aXRoIG5leHQgcmVxdWVzdC4gQ2hhbmdlIHRoaXMgZm9yIHByb2R1Y3Rpb24gdXNlITwvbGk+CisgKiA8bGk+ZGVmYXVsdCBhY2tUaW1lb3V0IGlzIDE1IHNlYzogdGhpcyBpcyB2ZXJ5IGxvdyBmb3IgYmlnIGFsbCBzZXNzaW9uCisgKiByZXBsaWNhdGlvbiBtZXNzYWdlcyBhZnRlciByZXN0YXJ0IGEgbm9kZTwvbGk+CisgKiA8bGk+ZGlzYWJsZSBrZWVwQWxpdmU6IGtlZXBBbGl2ZVRpbWVvdXQ9Ii0xIiBhbmQKKyAqIGtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudD0iLTEiPC9saT4KKyAqIDxsaT5tYXhRdWV1ZUxlbmd0aDogTGltaXQgdGhlIHNlbmRlciBxdWV1ZSBsZW5ndGggKG1lbWJlcnNoaXAgZ29lcyB3ZWxsLCBidXQgdHJhbnNmZXIgaXMgZmFpbHVyZSEhKTwvbGk+CisgKiA8L3VsPgorICogRklYTUU6IHJlZmFjdG9yIGNvZGUgZHVwbGljYXRpb25zIHdpdGggQXN5bmNTb2NrZXRTZW5kZXIgPT4gY29uZmlndXJhYmxlIG9yIGV4dHJhY3Qgc3VwZXIgY2xhc3MgCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoICggaWRlYSBjb21lcyBmb3JtIFJhaW5lciBKdW5nKQorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA1LjUuOQorICovCitwdWJsaWMgY2xhc3MgRmFzdEFzeW5jU29ja2V0U2VuZGVyIGV4dGVuZHMgRGF0YVNlbmRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgdGhyZWFkQ291bnRlciA9IDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeQorICAgICAgICAgICAgLmdldExvZyhGYXN0QXN5bmNTb2NrZXRTZW5kZXIuY2xhc3MpOworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAiRmFzdEFzeW5jU29ja2V0U2VuZGVyLzMuMSI7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIE1lc3NhZ2UgUXVldWUKKyAgICAgKi8KKyAgICBwcml2YXRlIEZhc3RRdWV1ZSBxdWV1ZSA9IG5ldyBGYXN0UXVldWUoKTsKKworICAgIC8qKgorICAgICAqIEFjdGl2ZSB0aHJlYWQgdG8gcHVzaCBtZXNzYWdlcyBhc3luY2hyb25vdXMgdG8gdGhlIG90aGVyIHJlcGxpY2F0aW9uIG5vZGUKKyAgICAgKi8KKyAgICBwcml2YXRlIEZhc3RRdWV1ZVRocmVhZCBxdWV1ZVRocmVhZCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiByZWNvdmVyIHRpbWVvdXQgKCBkZWZhdWx0IDUgc2VjcykKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgcmVjb3ZlclRpbWVvdXQgPSA1MDAwOworICAgIAorICAgIC8qKgorICAgICAqIG51bWJlciBvZiByZWNvdmVyIHRyaWVzCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcmVjb3ZlckNvdW50ZXIgPSAwOworCisgICAgLyoqCisgICAgICogQ291bnQgbnVtYmVyIG9mIHF1ZXVlIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgaW5RdWV1ZUNvdW50ZXIgPSAwOworCisgICAgLyoqCisgICAgICogQ291bnQgYWxsIHN1Y2Nlc3NmdWxsIHB1c2ggbWVzc2FnZXMgZnJvbSBxdWV1ZQorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBvdXRRdWV1ZUNvdW50ZXIgPSAwOworCisgICAgcHJpdmF0ZSBpbnQgdGhyZWFkUHJpb3JpdHkgPSBUaHJlYWQuTk9STV9QUklPUklUWTs7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKyAgICAvKioKKyAgICAgKiBzdGFydCBiYWNrZ3JvdW5kIHRocmVhZCB0byBwdXNoIGluY29tbWluZyBjbHVzdGVyIG1lc3NhZ2VzIHRvIHJlcGxpY2F0aW9uCisgICAgICogbm9kZQorICAgICAqIAorICAgICAqIEBwYXJhbSBkb21haW4gcmVwbGljYXRpb24gY2x1c3RlciBkb21haW4gKHNlc3Npb24gZG9tYWluKQorICAgICAqIEBwYXJhbSBob3N0IHJlcGxpY2F0aW9uIG5vZGUgdGNwIGFkZHJlc3MKKyAgICAgKiBAcGFyYW0gcG9ydCByZXBsaWNhdGlvbiBub2RlIHRjcCBwb3J0CisgICAgICovCisgICAgcHVibGljIEZhc3RBc3luY1NvY2tldFNlbmRlcihTdHJpbmcgZG9tYWluLEluZXRBZGRyZXNzIGhvc3QsIGludCBwb3J0KSB7CisgICAgICAgIHN1cGVyKGRvbWFpbixob3N0LCBwb3J0KTsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICB9CisgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24gYW5kIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisgCisKKyAgICAvKioKKyAgICAgKiBnZXQgY3VycmVudCBhZGQgd2FpdCB0aW1lb3V0IAorICAgICAqIEByZXR1cm4gY3VycmVudCB3YWl0IHRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRRdWV1ZUFkZFdhaXRUaW1lb3V0KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHF1ZXVlLmdldEFkZFdhaXRUaW1lb3V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGFkZCB3YWl0IHRpbWVvdXQgKGRlZmF1bHQgMTAwMDAgbXNlYykKKyAgICAgKiBAcGFyYW0gdGltZW91dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXVlQWRkV2FpdFRpbWVvdXQobG9uZyB0aW1lb3V0KSB7CisgICAgICAgIHF1ZXVlLnNldEFkZFdhaXRUaW1lb3V0KHRpbWVvdXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBjdXJyZW50IHJlbW92ZSB3YWl0IHRpbWVvdXQKKyAgICAgKiBAcmV0dXJuIFRoZSB0aW1lb3V0CisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0UXVldWVSZW1vdmVXYWl0VGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXVlLmdldFJlbW92ZVdhaXRUaW1lb3V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IHJlbW92ZSB3YWl0IHRpbWVvdXQgKCBkZWZhdWx0IDMwMDAwIG1zZWMpCisgICAgICogQHBhcmFtIHRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdmVXYWl0VGltZW91dChsb25nIHRpbWVvdXQpIHsKKyAgICAgICAgcXVldWUuc2V0UmVtb3ZlV2FpdFRpbWVvdXQodGltZW91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjaGVja0xvY2suCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNRdWV1ZUNoZWNrTG9jaygpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXVlLmlzQ2hlY2tMb2NrKCk7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSBjaGVja0xvY2sgVGhlIGNoZWNrTG9jayB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UXVldWVDaGVja0xvY2soYm9vbGVhbiBjaGVja0xvY2spIHsKKyAgICAgICAgcXVldWUuc2V0Q2hlY2tMb2NrKGNoZWNrTG9jayk7CisgICAgfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZG9TdGF0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1F1ZXVlRG9TdGF0cygpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXVlLmlzRG9TdGF0cygpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZG9TdGF0cyBUaGUgZG9TdGF0cyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UXVldWVEb1N0YXRzKGJvb2xlYW4gZG9TdGF0cykgeworICAgICAgICBxdWV1ZS5zZXREb1N0YXRzKGRvU3RhdHMpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRpbWVXYWl0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUXVldWVUaW1lV2FpdCgpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXVlLmlzVGltZVdhaXQoKTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIHRpbWVXYWl0IFRoZSB0aW1lV2FpdCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UXVldWVUaW1lV2FpdChib29sZWFuIHRpbWVXYWl0KSB7CisgICAgICAgIHF1ZXVlLnNldFRpbWVXYWl0KHRpbWVXYWl0KTsKKyAgICB9CisgICAgICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW5RdWV1ZUNvdW50ZXIuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhRdWV1ZUxlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXVlLmdldE1heFF1ZXVlTGVuZ3RoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGxlbmd0aCBtYXggcXVldWUgbGVuZ3RoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWF4UXVldWVMZW5ndGgoaW50IGxlbmd0aCkgeworICAgICAgICBxdWV1ZS5zZXRNYXhRdWV1ZUxlbmd0aChsZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYWRkIHdhaXQgdGltZXMuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0UXVldWVBZGRXYWl0VGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXVlLmdldEFkZFdhaXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFkZCB3YWl0IHRpbWVzLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFF1ZXVlUmVtb3ZlV2FpdFRpbWUoKSB7CisgICAgICAgIHJldHVybiBxdWV1ZS5nZXRSZW1vdmVXYWl0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpblF1ZXVlQ291bnRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRJblF1ZXVlQ291bnRlcigpIHsKKyAgICAgICAgcmV0dXJuIGluUXVldWVDb3VudGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3V0UXVldWVDb3VudGVyLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldE91dFF1ZXVlQ291bnRlcigpIHsKKyAgICAgICAgcmV0dXJuIG91dFF1ZXVlQ291bnRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHF1ZXVlU2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFF1ZXVlU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXVlLmdldFNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgY3VycmVudCBwdXNoIG1lc3NhZ2UgcmVjb3ZlciB0aW1lb3V0IAorICAgICAqIEByZXR1cm4gY3VycmVudCBwdXNoIG1lc3NhZ2UgcmVjb3ZlciB0aW1lb3V0CisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0UmVjb3ZlclRpbWVvdXQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gcmVjb3ZlclRpbWVvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHJlY292ZXIgdGltZW91dCAoZGVmYXVsdCA1MDAwIG1zZWMpCisgICAgICogQHBhcmFtIHRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWNvdmVyVGltZW91dChsb25nIHRpbWVvdXQpIHsKKyAgICAgICAgcmVjb3ZlclRpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBjdXJyZW50IHB1c2ggbWVzc2FnZSByZWNvdmVyIGNvdW50ZXIgCisgICAgICogQHJldHVybiBjdXJyZW50IHB1c2ggbWVzc2FnZSByZWNvdmVyIGNvdW50ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlY292ZXJDb3VudGVyKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJlY292ZXJDb3VudGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCByZWNvdmVyIGNvdW5lciAoZGVmYXVsdCA1ICkKKyAgICAgKiBAcGFyYW0gY291bnRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlY292ZXJDb3VudGVyKGludCBjb3VudGVyKSB7CisgICAgICAgIHJlY292ZXJDb3VudGVyID0gY291bnRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjaGFuZ2UgYWN0aXZlIHRoZSBxdWV1ZSBUaHJlYWQgcHJpb3JpdHkgCisgICAgICogQHBhcmFtIHRocmVhZFByaW9yaXR5IHZhbHVlIG11c3QgYmUgYmV0d2VlbiBNSU4gYW5kIE1BWCBUaHJlYWQgUHJpb3JpdHkKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRocmVhZFByaW9yaXR5KGludCB0aHJlYWRQcmlvcml0eSkgeworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJGYXN0QXN5bmNTb2NrZXRTZW5kZXIuc2V0VGhyZWFkUHJpb3JpdHkiLAorICAgICAgICAgICAgICAgICAgICBnZXRBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKSwgbmV3IEludGVnZXIoZ2V0UG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIodGhyZWFkUHJpb3JpdHkpKSk7CisgICAgICAgIGlmICh0aHJlYWRQcmlvcml0eSA8IFRocmVhZC5NSU5fUFJJT1JJVFkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAiRmFzdEFzeW5jU29ja2V0U2VuZGVyLm1pbi5leGNlcHRpb24iLCBnZXRBZGRyZXNzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SG9zdEFkZHJlc3MoKSwgbmV3IEludGVnZXIoZ2V0UG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIodGhyZWFkUHJpb3JpdHkpKSk7CisgICAgICAgIH0gZWxzZSBpZiAodGhyZWFkUHJpb3JpdHkgPiBUaHJlYWQuTUFYX1BSSU9SSVRZKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgIkZhc3RBc3luY1NvY2tldFNlbmRlci5tYXguZXhjZXB0aW9uIiwgZ2V0QWRkcmVzcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEhvc3RBZGRyZXNzKCksIG5ldyBJbnRlZ2VyKGdldFBvcnQoKSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKHRocmVhZFByaW9yaXR5KSkpOworICAgICAgICB9CisgICAgICAgIHRoaXMudGhyZWFkUHJpb3JpdHkgPSB0aHJlYWRQcmlvcml0eTsKKyAgICAgICAgaWYgKHF1ZXVlVGhyZWFkICE9IG51bGwpCisgICAgICAgICAgICBxdWV1ZVRocmVhZC5zZXRQcmlvcml0eSh0aHJlYWRQcmlvcml0eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHRocmVhZFByaW9yaXR5CisgICAgICogQHJldHVybiBUaGUgdGhyZWFkIHByaW9yaXR5CisgICAgICovCisgICAgcHVibGljIGludCBnZXRUaHJlYWRQcmlvcml0eSgpIHsKKyAgICAgICAgcmV0dXJuIHRocmVhZFByaW9yaXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcXVldWVkTnJPZkJ5dGVzLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFF1ZXVlZE5yT2ZCeXRlcygpIHsKKyAgICAgICAgaWYocXVldWVUaHJlYWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBxdWV1ZVRocmVhZC5nZXRRdWV1ZWROck9mQnl0ZXMoKTsKKyAgICAgICAgcmV0dXJuIDBsIDsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdG8gc29ja2V0IGFuZCBzdGFydCBiYWNrZ3JvdW5kIHRocmVhZCB0byBwdXNoIHF1ZXVlZCBtZXNzYWdlcworICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5JRGF0YVNlbmRlciNjb25uZWN0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBzdXBlci5jb25uZWN0KCk7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIGlmKCFxdWV1ZS5pc0VuYWJsZWQoKSkKKyAgICAgICAgICAgIHF1ZXVlLnN0YXJ0KCkgOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3Qgc29ja2V0IGFkIHN0b3AgcXVldWUgdGhyZWFkCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLklEYXRhU2VuZGVyI2Rpc2Nvbm5lY3QoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIHN0b3BUaHJlYWQoKTsKKyAgICAgICAgLy8gZGVsZXRlICJyZW1vdmUiIGxvY2sgYXQgcXVldWUKKyAgICAgICAgcXVldWUuc3RvcCgpIDsKKyAgICAgICAgLy8gZW5hYmxlIHRoYXQgc2VuZE1lc3NhZ2UgY2FuIGFkZCBuZXcgbWVzc2FnZXMKKyAgICAgICAgcXVldWUuc3RhcnQoKSA7CisgICAgICAgIC8vIGNsb3NlIHNvY2tldAorICAgICAgICBzdXBlci5kaXNjb25uZWN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBtZXNzYWdlIHRvIHF1ZXVlIGZvciBsYXRlciBzZW5kaW5nLgorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5EYXRhU2VuZGVyI3B1c2hNZXNzYWdlKENsdXN0ZXJEYXRhKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKENsdXN0ZXJEYXRhIGRhdGEpCisgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIHF1ZXVlLmFkZChkYXRhLmdldFVuaXF1ZUlkKCksIGRhdGEpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGluUXVldWVDb3VudGVyKys7CisgICAgICAgICAgICBpZihxdWV1ZVRocmVhZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHF1ZXVlVGhyZWFkLmluY1F1ZXVlZE5yT2ZCeXRlcyhkYXRhLmdldE1lc3NhZ2UoKS5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZShzbS5nZXRTdHJpbmcoIkFzeW5jU29ja2V0U2VuZGVyLnF1ZXVlLm1lc3NhZ2UiLAorICAgICAgICAgICAgICAgICAgICBnZXRBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKSwgbmV3IEludGVnZXIoZ2V0UG9ydCgpKSwgZGF0YS5nZXRVbmlxdWVJZCgpLCBuZXcgTG9uZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldE1lc3NhZ2UoKS5sZW5ndGgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXQgc2VuZGVyIHN0YXRpc3RpY3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXRTdGF0aXN0aWNzKCkgeworICAgICAgICBzdXBlci5yZXNldFN0YXRpc3RpY3MoKTsKKyAgICAgICAgaW5RdWV1ZUNvdW50ZXIgPSBxdWV1ZS5nZXRTaXplKCk7CisgICAgICAgIG91dFF1ZXVlQ291bnRlciA9IDA7CisgICAgICAgIHF1ZXVlLnJlc2V0U3RhdGlzdGljcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhpcyBTb2NrZXJTZW5kZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiRmFzdEFzeW5jU29ja2V0U2VuZGVyWyIpOworICAgICAgICBidWYuYXBwZW5kKGdldEFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpKS5hcHBlbmQoIjoiKS5hcHBlbmQoZ2V0UG9ydCgpKS5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogU3RhcnQgUXVldWUgdGhyZWFkIGFzIGRhZW1vbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrVGhyZWFkKCkgeworICAgICAgICBpZiAocXVldWVUaHJlYWQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJBc3luY1NvY2tldFNlbmRlci5jcmVhdGUudGhyZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEFkZHJlc3MoKSwgbmV3IEludGVnZXIoZ2V0UG9ydCgpKSkpOworICAgICAgICAgICAgcXVldWVUaHJlYWQgPSBuZXcgRmFzdFF1ZXVlVGhyZWFkKHRoaXMsIHF1ZXVlKTsKKyAgICAgICAgICAgIHF1ZXVlVGhyZWFkLnNldERhZW1vbih0cnVlKTsKKyAgICAgICAgICAgIHF1ZXVlVGhyZWFkLnNldFByaW9yaXR5KGdldFRocmVhZFByaW9yaXR5KCkpOworICAgICAgICAgICAgcXVldWVUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHN0b3AgcXVldWUgd29ya2VyIHRocmVhZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0b3BUaHJlYWQoKSB7CisgICAgICAgIGlmIChxdWV1ZVRocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICBxdWV1ZVRocmVhZC5zdG9wUnVubmluZygpOworICAgICAgICAgICAgcXVldWVUaHJlYWQgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5uZXIgQ2xhc3MKKworICAgIHByaXZhdGUgY2xhc3MgRmFzdFF1ZXVlVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlbmRlciBxdWV1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBJUXVldWUgcXVldWUgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBY3RpdmUgc2VuZGVyCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEZhc3RBc3luY1NvY2tldFNlbmRlciBzZW5kZXIgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaHJlYWQgaXMgYWN0aXZlCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4ga2VlcFJ1bm5pbmcgPSB0cnVlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDdXJyZW50IG51bWJlciBvZiBieXRlcyBmcm9tIGFsbCBxdWV1ZWQgbWVzc2FnZXMKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgbG9uZyBxdWV1ZWROck9mQnl0ZXMgPSAwOworCisgICAgICAgCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9ubHkgdXNlIGluc2lkZSBGYXN0QXN5bmNTb2NrZXRTZW5kZXIKKyAgICAgICAgICogQHBhcmFtIHNlbmRlcgorICAgICAgICAgKiBAcGFyYW0gcXVldWUKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgRmFzdFF1ZXVlVGhyZWFkKEZhc3RBc3luY1NvY2tldFNlbmRlciBzZW5kZXIsIElRdWV1ZSBxdWV1ZSkgeworICAgICAgICAgICAgc2V0TmFtZSgiQ2x1c3Rlci1GYXN0QXN5bmNTb2NrZXRTZW5kZXItIiArICh0aHJlYWRDb3VudGVyKyspKTsKKyAgICAgICAgICAgIHRoaXMucXVldWUgPSBxdWV1ZTsKKyAgICAgICAgICAgIHRoaXMuc2VuZGVyID0gc2VuZGVyOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBxdWV1ZWROck9mQnl0ZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgbG9uZyBnZXRRdWV1ZWROck9mQnl0ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gcXVldWVkTnJPZkJ5dGVzOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2V0UXVldWVkTnJPZkJ5dGVzKGxvbmcgcXVldWVkTnJPZkJ5dGVzKSB7CisgICAgICAgICAgICB0aGlzLnF1ZXVlZE5yT2ZCeXRlcyA9IHF1ZXVlZE5yT2ZCeXRlczsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBpbmNRdWV1ZWROck9mQnl0ZXMobG9uZyBzaXplKSB7CisgICAgICAgICAgICBxdWV1ZWROck9mQnl0ZXMgKz0gc2l6ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRlY1F1ZXVlZE5yT2ZCeXRlcyhsb25nIHNpemUpIHsKKyAgICAgICAgICAgIHF1ZXVlZE5yT2ZCeXRlcyAtPSBzaXplOworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogU3RvcCBiYWNrZW5kIHRocmVhZCEKKyAgICAgICAgICovCisgICAgICAgICBwdWJsaWMgdm9pZCBzdG9wUnVubmluZygpIHsKKyAgICAgICAgICAgIGtlZXBSdW5uaW5nID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBvYmplY3RzIGZyb20gcXVldWUgYW5kIHNlbmQgYWxsIG1lc2FnZXMgdG8gdGhlIHNlbmRlci4KKyAgICAgICAgICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHdoaWxlIChrZWVwUnVubmluZykgeworICAgICAgICAgICAgICAgIExpbmtPYmplY3QgZW50cnkgPSBnZXRRdWV1ZWRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaFF1ZXVlZE1lc3NhZ2VzKGVudHJ5KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoa2VlcFJ1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiQXN5bmNTb2NrZXRTZW5kZXIucXVldWUuZW1wdHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0QWRkcmVzcygpLCBuZXcgSW50ZWdlcihzZW5kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UG9ydCgpKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBMaXN0IG9mIHF1ZXVlIGNsdXN0ZXIgbWVzc2FnZXMKKyAgICAgICAgICogQHJldHVybiBsaXN0IG9mIGNsdXN0ZXIgbWVzc2FnZXMKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBMaW5rT2JqZWN0IGdldFF1ZXVlZE1lc3NhZ2UoKSB7CisgICAgICAgICAgICAvLyBnZXQgYSBsaW5rIGxpc3Qgb2YgYWxsIHF1ZXVlZCBvYmplY3RzCisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJRdWV1ZXNpemUgYmVmb3JlPSIgKyAoKEZhc3RRdWV1ZSkgcXVldWUpLmdldFNpemUoKSk7CisgICAgICAgICAgICBMaW5rT2JqZWN0IGVudHJ5ID0gcXVldWUucmVtb3ZlKCk7CisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJRdWV1ZXNpemUgYWZ0ZXI9IiArICgoRmFzdFF1ZXVlKSBxdWV1ZSkuZ2V0U2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQdXNoIGFsbCBtZXNzYWdlcyBmcm9tIHF1ZXVlIHRvIG90aGVyIG5vZGVzLiBJcyByZXZvdmVyeSBjb25maWd1cmVkCisgICAgICAgICAqIG1ha2UgYSByZXNlbmRzIHdpdGggc29tZSB3YWl0cy4KKyAgICAgICAgICogQHBhcmFtIGVudHJ5IGxpc3Qgb2YgbWVzc2FnZXMKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHB1c2hRdWV1ZWRNZXNzYWdlcyhMaW5rT2JqZWN0IGVudHJ5KSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VzaXplID0gMDsKKyAgICAgICAgICAgICAgICBDbHVzdGVyRGF0YSBkYXRhID0gbnVsbCA7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IChDbHVzdGVyRGF0YSkgZW50cnkuZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc2l6ZSA9IGRhdGEuZ2V0TWVzc2FnZSgpLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgc2VuZGVyLnB1c2hNZXNzYWdlKGRhdGEpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgclRpbWVvdXQgPSBzZW5kZXIuZ2V0UmVjb3ZlclRpbWVvdXQoKSA7CisgICAgICAgICAgICAgICAgICAgIGludCByQ291bnRlciA9IHNlbmRlci5nZXRSZWNvdmVyQ291bnRlcigpIDsKKyAgICAgICAgICAgICAgICAgICAgaWYoZGF0YSAhPSBudWxsICYmIAorICAgICAgICAgICAgICAgICAgICAgICByVGltZW91dCA+IDAgJiYgCisgICAgICAgICAgICAgICAgICAgICAgIHJDb3VudGVyID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCB0aGF0IG5ldHdvcmsgZ2V0IHN0YWJsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoclRpbWVvdXQqY291bnRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHNsZWVwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJBc3luY1NvY2tldFNlbmRlci5zZW5kLnJlY292ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRLZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoY291bnRlciksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihyQ291bnRlciksIG5ldyBMb25nKHJUaW1lb3V0KSkpIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIucHVzaE1lc3NhZ2UoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4eCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcisrOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChrZWVwUnVubmluZyAmJiAhc3VjY2VzcyAmJiBjb3VudGVyIDw9IHJDb3VudGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXN5bmNTb2NrZXRTZW5kZXIuc2VuZC5lcnJvciIsIGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0S2V5KCkpLCB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzeW5jU29ja2V0U2VuZGVyLnNlbmQuZXJyb3IiLCBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0S2V5KCkpLCB4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgb3V0UXVldWVDb3VudGVyKys7CisgICAgICAgICAgICAgICAgICAgIGRlY1F1ZXVlZE5yT2ZCeXRlcyhtZXNzYWdlc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVudHJ5ID0gZW50cnkubmV4dCgpOworICAgICAgICAgICAgfSB3aGlsZSAoa2VlcFJ1bm5pbmcgJiYgZW50cnkgIT0gbnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9JRGF0YVNlbmRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9JRGF0YVNlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNjRhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL0lEYXRhU2VuZGVyLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcDsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDUuNS43CisgKi8KKworcHVibGljIGludGVyZmFjZSBJRGF0YVNlbmRlcgoreworICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3MoamF2YS5uZXQuSW5ldEFkZHJlc3MgYWRkcmVzcyk7CisgICAgcHVibGljIGphdmEubmV0LkluZXRBZGRyZXNzIGdldEFkZHJlc3MoKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KTsKKyAgICBwdWJsaWMgaW50IGdldFBvcnQoKTsKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247CisgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpOworICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKENsdXN0ZXJEYXRhIGRhdGEpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOworICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCk7CisgICAgcHVibGljIHZvaWQgc2V0U3VzcGVjdChib29sZWFuIHN1c3BlY3QpOworICAgIHB1YmxpYyBib29sZWFuIGdldFN1c3BlY3QoKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRBY2tUaW1lb3V0KGxvbmcgdGltZW91dCk7CisgICAgcHVibGljIGxvbmcgZ2V0QWNrVGltZW91dCgpOworICAgIHB1YmxpYyBib29sZWFuIGlzV2FpdEZvckFjaygpOworICAgIHB1YmxpYyB2b2lkIHNldFdhaXRGb3JBY2soYm9vbGVhbiBpc1dhaXRGb3JBY2spOworICAgIHB1YmxpYyBib29sZWFuIGNoZWNrS2VlcEFsaXZlKCk7CisgICAgcHVibGljIFN0cmluZyBnZXREb21haW4oKSA7CisgICAgcHVibGljIHZvaWQgc2V0RG9tYWluKFN0cmluZyBkb21haW4pIDsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9JRGF0YVNlbmRlckZhY3RvcnkuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvSURhdGFTZW5kZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3MTliZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvSURhdGFTZW5kZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3A7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworLyoqCisgKiBDcmVhdGUgRGF0YVNlbmRlciBmb3IgZGlmZmVyZW50IG1vZGVzLiBEYXRhU2VuZGVyIGZhY3RvcnkgbG9hZCBtb2RlIGxpc3QgZnJvbSAKKyAqIDxjb2RlPm9yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvRGF0YVNlbmRlcnMucHJvcGVydGllczwvY29kZT4gcmVzb3VyY2UuCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNS41LjcKKyAqLworcHVibGljIGNsYXNzIElEYXRhU2VuZGVyRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeQorICAgICAgICAgICAgLmdldExvZyhJRGF0YVNlbmRlckZhY3RvcnkuY2xhc3MpOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBU0VOREVSU19QUk9QRVJUSUVTID0gIm9yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvRGF0YVNlbmRlcnMucHJvcGVydGllcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19NT0RFID0gInN5bmNocm9ub3VzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1lOQ19NT0RFID0gImFzeW5jaHJvbm91cyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9PTEVEX1NZTkNfTU9ERSA9ICJwb29sZWQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBU1RfQVNZTkNfUVVFVUVfTU9ERSA9ICJmYXN0YXN5bmNxdWV1ZSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPSBTdHJpbmdNYW5hZ2VyCisgICAgICAgICAgICAuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIklEYXRhU2VuZGVyRmFjdG9yeS8yLjAiOworCisgICAgcHJpdmF0ZSBJRGF0YVNlbmRlckZhY3RvcnkoKSB7CisgICAgfQorCisgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHNlbmRlck1vZGVzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgSURhdGFTZW5kZXJGYWN0b3J5IGZhY3RvcnkgOworCisgICAgc3RhdGljIHsKKyAgICAgICAgZmFjdG9yeSA9IG5ldyBJRGF0YVNlbmRlckZhY3RvcnkoKTsKKyAgICAgICAgZmFjdG9yeS5sb2FkU2VuZGVyTW9kZXMoKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uIGFuZCB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluZm8oKSB7CisgICAgICAgIHJldHVybiAoaW5mbyk7CisgICAgfQorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RhdGljCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgRGF0YVNlbmRlcgorICAgICAqIEBwYXJhbSBtb2RlIHJlcGxpY2F0b24gbW9kZSAKKyAgICAgKiBAcGFyYW0gbWJyIHNlbmRlciB0YXJnZXQKKyAgICAgKiBAcmV0dXJuIG5ldyBzZW5kZXIgb2JqZWN0CisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSURhdGFTZW5kZXIgZ2V0SURhdGFTZW5kZXIoU3RyaW5nIG1vZGUsCisgICAgICAgICAgICBNZW1iZXIgbWJyKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgLy8gSWRlbnRpZnkgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIERhdGFTZW5kZXIgd2Ugc2hvdWxkIGNvbmZpZ3VyZQorICAgICAgIElEYXRhU2VuZGVyIHNlbmRlciA9IGZhY3RvcnkuZ2V0U2VuZGVyKG1vZGUsbWJyKTsKKyAgICAgICBpZihzZW5kZXIgPT0gbnVsbCkKKyAgICAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oIkludmFsaWQgcmVwbGljYXRpb24gbW9kZT0iICsgbW9kZSk7ICAgICAgICAgIAorICAgICAgIHJldHVybiBzZW5kZXIgOyAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGF0IG1vZGUgaXMgdmFsaWQKKyAgICAgKiBAcGFyYW0gbW9kZQorICAgICAqIEByZXR1cm4gVGhlIHJlcGxpY2F0aW9uIG1vZGUgKG1heSBiZSBudWxsIGlmIHNlbmRlciBtb2RlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlTW9kZShTdHJpbmcgbW9kZSkgeworICAgICAgICBpZihmYWN0b3J5LmlzU2VuZGVyTW9kZShtb2RlKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsIDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiUmVwbGljYXRpb24gbW9kZSBoYXMgdG8gYmUgJyIpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZmFjdG9yeS5zZW5kZXJNb2Rlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7ICAKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGtleSk7CisgICAgICAgICAgICAgICAgaWYoaXRlci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIicsICciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsgICAgICAgIAorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJpdmF0ZQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzU2VuZGVyTW9kZShTdHJpbmcgbW9kZSl7CisgICAgICAgIHJldHVybiBzZW5kZXJNb2RlcyAhPSBudWxsICYmIHNlbmRlck1vZGVzLmNvbnRhaW5zS2V5KG1vZGUpIDsgICAgICAgICAgIAorICAgIH0KKworICAgIHByaXZhdGUgSURhdGFTZW5kZXIgZ2V0U2VuZGVyKFN0cmluZyBtb2RlLE1lbWJlciBtYnIpIHsKKyAgICAgICAgSURhdGFTZW5kZXIgc2VuZGVyID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHNlbmRlck5hbWUgPSBudWxsOworICAgICAgICBzZW5kZXJOYW1lID0gc2VuZGVyTW9kZXMuZ2V0UHJvcGVydHkobW9kZSk7CisgICAgICAgIGlmIChzZW5kZXJOYW1lICE9IG51bGwpIHsKKworICAgICAgICAgICAgLy8gSW5zdGFudGlhdGUgYW5kIGluc3RhbGwgYSBkYXRhIHJlcGxpY2F0aW9uIHNlbmRlciBvZiB0aGUgcmVxdWVzdGVkIGNsYXNzCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzIHNlbmRlckNsYXNzID0gQ2xhc3MuZm9yTmFtZShzZW5kZXJOYW1lKTsKKyAgICAgICAgICAgICAgICBDbGFzcyBwYXJhbVR5cGVzW10gPSBuZXcgQ2xhc3NbM107CisgICAgICAgICAgICAgICAgcGFyYW1UeXBlc1swXSA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5TdHJpbmciKTsKKyAgICAgICAgICAgICAgICBwYXJhbVR5cGVzWzFdID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5uZXQuSW5ldEFkZHJlc3MiKTsKKyAgICAgICAgICAgICAgICBwYXJhbVR5cGVzWzJdID0gSW50ZWdlci5UWVBFIDsKKyAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHNlbmRlckNsYXNzLmdldENvbnN0cnVjdG9yKHBhcmFtVHlwZXMpOworICAgICAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwYXJhbVZhbHVlc1tdID0gbmV3IE9iamVjdFszXTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZXNbMF0gPSBtYnIuZ2V0RG9tYWluKCk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWVzWzFdID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKG1ici5nZXRIb3N0KCkpOworICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlc1syXSA9IG5ldyBJbnRlZ2VyKG1ici5nZXRQb3J0KCkpOworICAgICAgICAgICAgICAgICAgICBzZW5kZXIgPSAoSURhdGFTZW5kZXIpIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHBhcmFtVmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJJRGF0YVNlbmRlci5zZW5kZXJNb2Rlcy5JbnN0YW50aWF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyTmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiSURhdGFTZW5kZXIuc2VuZGVyTW9kZXMuSW5zdGFudGlhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyTmFtZSksIHQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiSURhdGFTZW5kZXIuc2VuZGVyTW9kZXMuTWlzc2luZyIsIG1vZGUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VuZGVyOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgbG9hZFNlbmRlck1vZGVzKCkgeworICAgICAgICAvLyBMb2FkIG91ciBtYXBwaW5nIHByb3BlcnRpZXMgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChzZW5kZXJNb2RlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gSURhdGFTZW5kZXIuY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzc0xvYWRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VBc1N0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQVNFTkRFUlNfUFJPUEVSVElFUyk7CisgICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZGVyTW9kZXMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgICAgICBzZW5kZXJNb2Rlcy5sb2FkKGlzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJJRGF0YVNlbmRlci5zZW5kZXJNb2Rlcy5SZXNvdXJjZXMiKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiSURhdGFTZW5kZXIuc2VuZGVyTW9kZXMuUmVzb3VyY2VzIiksIGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWQwOGY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMCwwICsxLDczIEBACitBc3luY1NvY2tldFNlbmRlci5jcmVhdGUudGhyZWFkPUNyZWF0ZSBzZW5kZXIgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIHF1ZXVlIHRocmVhZCB0byB0Y3AgYmFja2dyb3VuZCByZXBsaWNhdGlvbgorQXN5bmNTb2NrZXRTZW5kZXIucXVldWUubWVzc2FnZT1RdWV1ZSBtZXNzYWdlIHRvIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSBpZD1bezJ9XSBzaXplPXszfQorQXN5bmNTb2NrZXRTZW5kZXIuc2VuZC5lcnJvcj1VbmFibGUgdG8gYXN5bmNocm9ub3VzbHkgc2VuZCBzZXNzaW9uIHdpdGggaWQ9W3swfV0gLSBtZXNzYWdlIHdpbGwgYmUgaWdub3JlZC4KK0FzeW5jU29ja2V0U2VuZGVyLnF1ZXVlLmVtcHR5PVF1ZXVlIGluIHNlbmRlciBbezB9OnsxLG51bWJlcixpbnRlZ2VyfV0gcmV0dXJuZWQgbnVsbCBlbGVtZW50IQorQXN5bmNTb2NrZXRTZW5kZXIuc2VuZC5yZWNvdmVyPVJlY292ZXIgcXVldWVkIG1lc3NhZ2UgaWQ9W3swfV0gYWZ0ZXIgZmFpbHVyZSBhbmQgc2VuZCBhZ2FpbiAoIGN1cnJlbnQgY291bnRlcj17MSxudW1iZXIsaW50ZWdlcn0sIG1heCBjb3VudGVyPXsyLG51bWJlcixpbnRlZ2VyfSwgdGltZW91dD17MyxudW1iZXIsbG9uZ30pIAorY2x1c3Rlci5tYmVhbi5yZWdpc3Rlci5hbHJlYWR5PU1CZWFuIHswfSBhbHJlYWR5IHJlZ2lzdGVyZWQhCitGYXN0QXN5bmNTb2NrZXRTZW5kZXIuc2V0VGhyZWFkUHJpb3JpdHk9W3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIHNldCBwcmlvcml0eSB0byB7Mn0KK0Zhc3RBc3luY1NvY2tldFNlbmRlci5taW4uZXhjZXB0aW9uPVt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSBuZXcgcHJpb3JpdHkgezJ9IDwgTUlOX1BSSU9SSVRZCitGYXN0QXN5bmNTb2NrZXRTZW5kZXIubWF4LmV4Y2VwdGlvbj1bezB9OnsxLG51bWJlcixpbnRlZ2VyfV0gbmV3IHByaW9yaXR5IHsyfSA+IE1BWF9QUklPUklUWQorSURhdGFTZW5kZXIuYWNrLmVvZj1FT0YgcmVhY2hlZCBhdCBsb2NhbCBwb3J0IFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XQorSURhdGFTZW5kZXIuYWNrLnJlY2VpdmU9R290IEFDSyBhdCBsb2NhbCBwb3J0IFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XQorSURhdGFTZW5kZXIuYWNrLm1pc3Npbmc9VW5hYmxlIHRvIHJlYWQgYWNrbm93bGVkZ2VtZW50IGZyb20gW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIGluIHsyLG51bWJlcixpbnRlZ2VyfSBtcy4gRGlzY29ubmVjdGluZyBzb2NrZXQsIGFuZCB0cnlpbmcgYWdhaW4uCitJRGF0YVNlbmRlci5hY2sucmVhZD1SZWFkIHdhaXQgYWNrIGNoYXIgJ3syfScgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dCitJRGF0YVNlbmRlci5hY2suc3RhcnQ9V2FpdGluZyBmb3IgQUNLIG1lc3NhZ2UgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dCitJRGF0YVNlbmRlci5hY2sud3Jvbmc9TWlzc2luZyBjb3JyZWN0IEFDSyBhZnRlciAxMCBieXRlcyByZWFkIGF0IGxvY2FsIHBvcnQgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dCitJRGF0YVNlbmRlci5jbG9zZVNvY2tldD1TZW5kZXIgY2xvc2Ugc29ja2V0IHRvIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSAoY2xvc2UgY291bnQgezIsbnVtYmVyLGludGVnZXJ9KQorSURhdGFTZW5kZXIuY29ubmVjdD1TZW5kZXIgY29ubmVjdCB0byBbezB9OnsxLG51bWJlcixpbnRlZ2VyfV0gKGNvbm5lY3QgY291bnQgezIsbnVtYmVyLGludGVnZXJ9KQorSURhdGFTZW5kZXIuY3JlYXRlPUNyZWF0ZSBzZW5kZXIgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dCitJRGF0YVNlbmRlci5kaXNjb25uZWN0PVNlbmRlciBkaXNjb25uZWN0IGZyb20gW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIChkaXNjb25uZWN0IGNvdW50IHsyLG51bWJlcixpbnRlZ2VyfSkKK0lEYXRhU2VuZGVyLm1lc3NhZ2UuZGlzY29ubmVjdD1NZXNzYWdlIHRyYW5zZmVyZWQ6IFNlbmRlciBjYW4ndCBkaXNjb25uZWN0IGZyb20gW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dCitJRGF0YVNlbmRlci5tZXNzYWdlLmNyZWF0ZT1NZXNzYWdlIHRyYW5zZmVyZWQ6IFNlbmRlciBjYW4ndCBjcmVhdGUgY3VycmVudCBzb2NrZXQgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dCitJRGF0YVNlbmRlci5vcGVuU29ja2V0PVNlbmRlciBvcGVuIHNvY2tldCB0byBbezB9OnsxLG51bWJlcixpbnRlZ2VyfV0gKG9wZW4gY291bnQgezIsbnVtYmVyLGludGVnZXJ9KQorSURhdGFTZW5kZXIub3BlblNvY2tldC5mYWlsdXJlPU9wZW4gc2VuZGVyIHNvY2tldCBbezB9OnsxLG51bWJlcixpbnRlZ2VyfV0gZmFpbHVyZSEgKG9wZW4gZmFpbHVyZSBjb3VudCB7MixudW1iZXIsaW50ZWdlcn0pCitJRGF0YVNlbmRlci5zZW5kLmFnYWluPVNlbmQgZGF0YSBhZ2FpbiB0byBbezB9OnsxLG51bWJlcixpbnRlZ2VyfV0KK0lEYXRhU2VuZGVyLnNlbmQuY3Jhc2g9U2VuZCBtZXNzYWdlIGNyYXNoZWQgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIHR5cGU9W3syfV0sIGlkPVt7M31dCitJRGF0YVNlbmRlci5zZW5kLm1lc3NhZ2U9U2VuZCBtZXNzYWdlIHRvIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSBpZD1bezJ9XSBzaXplPXszLG51bWJlcixpbnRlZ2VyfQorSURhdGFTZW5kZXIuc2VuZC5sb3N0PU1lc3NhZ2UgbG9zdDogW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIHR5cGU9W3syfV0sIGlkPVt7M31dCitJRGF0YVNlbmRlci5zZW5kZXJNb2Rlcy5Db25maWd1cmVkPUNvbmZpZ3VyZWQgYSBkYXRhIHJlcGxpY2F0aW9uIHNlbmRlciBmb3IgbW9kZSB7MH0KK0lEYXRhU2VuZGVyLnNlbmRlck1vZGVzLkluc3RhbnRpYXRlPUNhbid0IGluc3RhbnRpYXRlIGEgZGF0YSByZXBsaWNhdGlvbiBzZW5kZXIgb2YgY2xhc3MgezB9CitJRGF0YVNlbmRlci5zZW5kZXJNb2Rlcy5NaXNzaW5nPUNhbid0IGNvbmZpZ3VyZSBhIGRhdGEgcmVwbGljYXRpb24gc2VuZGVyIGZvciBtb2RlIHswfQorSURhdGFTZW5kZXIuc2VuZGVyTW9kZXMuUmVzb3VyY2VzPUNhbid0IGxvYWQgZGF0YSByZXBsaWNhdGlvbiBzZW5kZXIgbWFwcGluZyBsaXN0CitJRGF0YVNlbmRlci5zdGF0cz1TZW5kIHN0YXRzIGZyb20gW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dLCBOciBvZiBieXRlcyBzZW50PXsyLG51bWJlcixpbnRlZ2VyfSBvdmVyIHszfSA9IHs0LG51bWJlcixpbnRlZ2VyfSBieXRlcy9yZXF1ZXN0LCBwcm9jZXNzaW5nIHRpbWUgezUsbnVtYmVyLGludGVnZXJ9IG1zZWMsIGF2ZyBwcm9jZXNzaW5nIHRpbWUgezYsbnVtYmVyLGludGVnZXJ9IG1zZWMKK1Bvb2xTb2NrZXRTZW5kZXIuc2VuZGVyUXVldWUuc2VuZGVyLmZhaWxlZD1Qb29sU29ja2V0U2VuZGVyIGNyZWF0ZSBuZXcgc2VuZGVyIHRvIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSBmYWlsZWQKK1Bvb2xTb2NrZXRTZW5kZXIubm9Nb3JlU2VuZGVyPU5vIHNvY2tldCBzZW5kZXIgYXZhaWxhYmxlIGZvciBjbGllbnQgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIGRpZCBpdCBkaXNhcHBlYXJlZD8KK1JlcGxpY2F0aW9uVHJhbnNtaXR0ZXIuZ2V0UHJvcGVydHk9Z2V0IHByb3BlcnR5IHswfQorUmVwbGljYXRpb25UcmFuc21pdHRlci5zZXRQcm9wZXJ0eT1zZXQgcHJvcGVydHkgezB9OiB7MX0gb2xkIHZhbHVlIHsyfQorUmVwbGljYXRpb25UcmFuc21pdHRlci5zdGFydGVkPVN0YXJ0IENsdXN0ZXJTZW5kZXIgYXQgY2x1c3RlciB7MH0gd2l0aCBuYW1lIHsxfQorUmVwbGljYXRpb25UcmFuc21pdHRlci5zdG9wcGVkPVN0b3BwZWQgQ2x1c3RlclNlbmRlciBhdCBjbHVzdGVyIHswfSB3aXRoIG5hbWUgezF9CitSZXBsaWNhdGlvblZhbHZlLmNyb3NzQ29udGV4dC5hZGQ9YWRkIENyb3NzIENvbnRleHQgc2Vzc2lvbiByZXBsaWNhdGlvbiBjb250YWluZXIgdG8gcmVwbGljYXRpb25WYWx2ZSB0aHJlYWRsb2NhbAorUmVwbGljYXRpb25WYWx2ZS5jcm9zc0NvbnRleHQucmVnaXN0ZXJTZXNzaW9uPXJlZ2lzdGVyIENyb3NzIGNvbnRleHQgc2Vzc2lvbiBpZD17MH0gZnJvbSBjb250ZXh0IHsxfQorUmVwbGljYXRpb25WYWx2ZS5jcm9zc0NvbnRleHQucmVtb3ZlPXJlbW92ZSBDcm9zcyBDb250ZXh0IHNlc3Npb24gcmVwbGljYXRpb24gY29udGFpbmVyIGZyb20gcmVwbGljYXRpb25WYWx2ZSB0aHJlYWRsb2NhbAorUmVwbGljYXRpb25WYWx2ZS5jcm9zc0NvbnRleHQuc2VuZERlbHRhPXNlbmQgQ3Jvc3MgQ29udGV4dCBzZXNzaW9uIGRlbHRhIGZyb20gY29udGV4dCB7MH0uCitSZXBsaWNhdGlvblZhbHZlLmZpbHRlci5sb2FkaW5nPUxvYWRpbmcgcmVxdWVzdCBmaWx0ZXJzPXswfQorUmVwbGljYXRpb25WYWx2ZS5maWx0ZXIudG9rZW49UmVxdWVzdCBmaWx0ZXI9ezB9CitSZXBsaWNhdGlvblZhbHZlLmZpbHRlci50b2tlbi5mYWlsdXJlPVVuYWJsZSB0byBjb21waWxlIGZpbHRlcj17MH0KK1JlcGxpY2F0aW9uVmFsdmUuaW52b2tlLnVyaT1JbnZva2luZyByZXBsaWNhdGlvbiByZXF1ZXN0IG9uIHswfQorUmVwbGljYXRpb25WYWx2ZS5ub2NsdXN0ZXI9Tm8gY2x1c3RlciBjb25maWd1cmVkIGZvciB0aGlzIHJlcXVlc3QuCitSZXBsaWNhdGlvblZhbHZlLnJlc2V0RGVsdGFSZXF1ZXN0PUNsdXN0ZXIgaXMgc3RhbmRhbG9uZTogcmVzZXQgU2Vzc2lvbiBSZXF1ZXN0IERlbHRhIGF0IGNvbnRleHQgezB9CitSZXBsaWNhdGlvblZhbHZlLnNlbmQuZmFpbHVyZT1VbmFibGUgdG8gcGVyZm9ybSByZXBsaWNhdGlvbiByZXF1ZXN0LgorUmVwbGljYXRpb25WYWx2ZS5zZW5kLmludmFsaWQuZmFpbHVyZT1VbmFibGUgdG8gc2VuZCBzZXNzaW9uIFtpZD17MH1dIGludmFsaWQgbWVzc2FnZSBvdmVyIGNsdXN0ZXIuCitSZXBsaWNhdGlvblZhbHZlLnNlc3Npb24uZm91bmQ9Q29udGV4dCB7MH06IEZvdW5kIHNlc3Npb24gezF9IGJ1dCBpdCBpc24ndCBhIENsdXN0ZXJTZXNzaW9uLgorUmVwbGljYXRpb25WYWx2ZS5zZXNzaW9uLmluZGljYXRvcj1Db250ZXh0IHswfTogUHJpbWFyaXR5IG9mIHNlc3Npb24gezF9IGluIHJlcXVlc3QgYXR0cmlidXRlIHsyfSBpcyB7M30uCitSZXBsaWNhdGlvblZhbHZlLnNlc3Npb24uaW52YWxpZD1Db250ZXh0IHswfTogUmVxdWVzdGVkIHNlc3Npb24gezF9IGlzIGludmFsaWQsIHJlbW92ZWQgb3Igbm90IHJlcGxpY2F0ZWQgYXQgdGhpcyBub2RlLgorUmVwbGljYXRpb25WYWx2ZS5zdGF0cz1BdmVyYWdlIHJlcXVlc3QgdGltZT0gezB9IG1zIGZvciBDbHVzdGVyIG92ZXJoZWFkIHRpbWU9ezF9IG1zIGZvciB7Mn0gcmVxdWVzdHMgezN9IGZpbHRlciByZXF1ZXN0cyB7NH0gc2VuZCByZXF1ZXN0cyB7NX0gY3Jvc3MgY29udGV4dCByZXF1ZXN0cyAoUmVxdWVzdD17Nn0gbXMgQ2x1c3Rlcj17N30gbXMpLgorU2ltcGxlVGNwQ2x1c3Rlci5ldmVudC5sb2c9Q2x1c3RlciByZWNlaXZlIGxpc3RlbmVyIGV2ZW50IHswfSB3aXRoIGRhdGEgezF9CitTaW1wbGVUY3BDbHVzdGVyLmdldFByb3BlcnR5PWdldCBwcm9wZXJ0eSB7MH0KK1NpbXBsZVRjcENsdXN0ZXIuc2V0UHJvcGVydHk9c2V0IHByb3BlcnR5IHswfTogezF9IG9sZCB2YWx1ZSB7Mn0KK1NpbXBsZVRjcENsdXN0ZXIuZGVmYXVsdC5hZGRDbHVzdGVyTGlzdGVuZXI9QWRkIERlZmF1bHQgQ2x1c3Rlckxpc3RlbmVyIGF0IGNsdXN0ZXIgezB9CitTaW1wbGVUY3BDbHVzdGVyLmRlZmF1bHQuYWRkQ2x1c3RlclZhbHZlcz1BZGQgRGVmYXVsdCBDbHVzdGVyVmFsdmVzIGF0IGNsdXN0ZXIgezB9CitTaW1wbGVUY3BDbHVzdGVyLmRlZmF1bHQuYWRkQ2x1c3RlclJlY2VpdmVyPUFkZCBEZWZhdWx0IENsdXN0ZXJSZWNlaXZlciBhdCBjbHVzdGVyIHswfQorU2ltcGxlVGNwQ2x1c3Rlci5kZWZhdWx0LmFkZENsdXN0ZXJTZW5kZXI9QWRkIERlZmF1bHQgQ2x1c3RlclNlbmRlciBhdCBjbHVzdGVyIHswfQorU2ltcGxlVGNwQ2x1c3Rlci5kZWZhdWx0LmFkZE1lbWJlcnNoaXBTZXJ2aWNlPUFkZCBEZWZhdWx0IE1lbWJlcnNoaXAgU2VydmljZSBhdCBjbHVzdGVyIHswfQorU2ltcGxlVGNwQ2x1c3Rlci5sb2cucmVjZWl2ZT1SRUNFSVZFIHswLGRhdGV9OnswLHRpbWV9IHsxLG51bWJlcn0gezJ9OnszLG51bWJlcixpbnRlZ2VyfSB7NH0gezV9CitTaW1wbGVUY3BDbHVzdGVyLmxvZy5zZW5kPVNFTkQgezAsZGF0ZX06ezAsdGltZX0gezEsbnVtYmVyfSB7Mn06ezMsbnVtYmVyLGludGVnZXJ9IHs0fSAKK1NpbXBsZVRjcENsdXN0ZXIubG9nLnNlbmQuYWxsPVNFTkQgezAsZGF0ZX06ezAsdGltZX0gezEsbnVtYmVyfSAtIHsyfQorU29ja2V0UmVwbGljdGlvbkxpc3RlbmVyLmFsbHJlYWR5RXhpc3RzPVNlcnZlclNvY2tldCBbezB9OnsxfV0gYWxscmVhZHkgc3RhcnRlZCEKK1NvY2tldFJlcGxpY3Rpb25MaXN0ZW5lci5hY2NlcHQuZmFpbHVyZT1TZXJ2ZXJTb2NrZXQgW3swfTp7MX1dIC0gRXhjZXB0aW9uIHRvIHN0YXJ0IHRocmVhZCBvciBhY2NlcHQgc2VydmVyIHNvY2tldAorU29ja2V0UmVwbGljdGlvbkxpc3RlbmVyLm9wZW49T3BlbiBTb2NrZXQgYXQgW3swfTp7MX1dCitTb2NrZXRSZXBsaWN0aW9uTGlzdGVuZXIub3BlbmNsb3NlLmZhaWx1cmU9U2VydmVyU29ja2V0IFt7MH06ezF9XSAtIEV4Y2VwdGlvbiB0byBvcGVuIG9yIGNsb3NlIHNlcnZlciBzb2NrZXQKK1NvY2tldFJlcGxpY3Rpb25MaXN0ZW5lci5wb3J0YnVzeT1Qb3J0IGJ1c3kgYXQgW3swfTp7aX1dIC0gcmVhc29uIFt7Mn1dCitTb2NrZXRSZXBsaWN0aW9uTGlzdGVuZXIuc2VydmVyU29ja2V0Lm5vdEV4aXN0cz1GYXRhbCBlcnJvcjogUmVjZWl2ZXIgc29ja2V0IG5vdCBib3VuZCBhZGRyZXNzPXswfSBwb3J0PXsxfSBtYXhwb3J0PXsyfQorU29ja2V0UmVwbGljdGlvbkxpc3RlbmVyLnRpbWVvdXQ9UmVjZWl2ZXIgU2VydmVyU29ja2V0IG5vIHN0YXJ0ZWQgW3swfTp7MX1dIC0gcmVhc29uOiB0aW1lb3V0PXsyfSBvciBsaXN0ZW49ezN9CitTb2NrZXRSZXBsaWN0aW9uTGlzdGVuZXIudW5sb2NrU29ja2V0LmZhaWx1cmU9VW5Mb2Nrc29ja2V0IGZhaWx1cmUgYXQgU2VydmVyU29ja2V0IFt7MDp7MX1dCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1Bvb2xlZFNvY2tldFNlbmRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9Qb29sZWRTb2NrZXRTZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWE1MTFhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9Qb29sZWRTb2NrZXRTZW5kZXIuamF2YQpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKKy8qKgorICogU2VuZCBjbHVzdGVyIG1lc3NhZ2VzIHdpdGggYSBwb29sIG9mIHNvY2tldHMgKDI1KS4KKyAqIAorICogRklYTUUgc3VwcG9ydCBwcm9jZXNzaW5nIHN0YXRzCisgKiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uIDEuMgorICovCisKK3B1YmxpYyBjbGFzcyBQb29sZWRTb2NrZXRTZW5kZXIgZXh0ZW5kcyBEYXRhU2VuZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5CisgICAgICAgICAgICAuZ2V0TG9nKG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUG9vbGVkU29ja2V0U2VuZGVyLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIlBvb2xlZFNvY2tldFNlbmRlci8yLjAiOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICBwcml2YXRlIGludCBtYXhQb29sU29ja2V0TGltaXQgPSAyNTsKKworICAgIHByaXZhdGUgU2VuZGVyUXVldWUgc2VuZGVyUXVldWUgPSBudWxsOworICAgIAorICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorCisgICAvKioKKyAgICAqIEBwYXJhbSBkb21haW4gcmVwbGljYXRpb24gY2x1c3RlciBkb21haW4gKHNlc3Npb24gZG9tYWluKQorICAgICogQHBhcmFtIGhvc3QgcmVwbGljYXRpb24gbm9kZSB0Y3AgYWRkcmVzcworICAgICogQHBhcmFtIHBvcnQgcmVwbGljYXRpb24gbm9kZSB0Y3AgcG9ydAorICAgICovCisgICAgcHVibGljIFBvb2xlZFNvY2tldFNlbmRlcihTdHJpbmcgZG9tYWluLEluZXRBZGRyZXNzIGhvc3QsIGludCBwb3J0KSB7CisgICAgICAgIHN1cGVyKGRvbWFpbixob3N0LCBwb3J0KTsKKyAgICAgICAgc2VuZGVyUXVldWUgPSBuZXcgU2VuZGVyUXVldWUodGhpcywgbWF4UG9vbFNvY2tldExpbWl0KTsKKyAgICB9CisgICAKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uIGFuZCB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWF4UG9vbFNvY2tldExpbWl0KGludCBsaW1pdCkgeworICAgICAgICBtYXhQb29sU29ja2V0TGltaXQgPSBsaW1pdDsKKyAgICAgICAgc2VuZGVyUXVldWUuc2V0TGltaXQobGltaXQpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TWF4UG9vbFNvY2tldExpbWl0KCkgeworICAgICAgICByZXR1cm4gbWF4UG9vbFNvY2tldExpbWl0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SW5Qb29sU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRlclF1ZXVlLmdldEluUG9vbFNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEluVXNlUG9vbFNpemUoKSB7CisgICAgICAgIHJldHVybiBzZW5kZXJRdWV1ZS5nZXRJblVzZVBvb2xTaXplKCk7CisgICAgfQorCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RlCisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY29ubmVjdCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgLy9kbyBub3RoaW5nLCBoYXBwZW5zIGluIHRoZSBzb2NrZXQgc2VuZGVyIGl0c2VsZgorICAgICAgICBzZW5kZXJRdWV1ZS5vcGVuKCk7CisgICAgICAgIHNldFNvY2tldENvbm5lY3RlZCh0cnVlKTsKKyAgICAgICAgY29ubmVjdENvdW50ZXIrKzsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgc2VuZGVyUXVldWUuY2xvc2UoKTsKKyAgICAgICAgc2V0U29ja2V0Q29ubmVjdGVkKGZhbHNlKTsKKyAgICAgICAgZGlzY29ubmVjdENvdW50ZXIrKzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZW5kIG1lc3NhZ2UgYW5kIHVzZSBhIHBvb2wgb2YgU29ja2V0U2VuZGVycworICAgICAqIAorICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgTWVzc2FnZSB1bmlxdWUgaWRlbnRpZmllcgorICAgICAqIEBwYXJhbSBkYXRhIE1lc3NhZ2UgZGF0YQorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKENsdXN0ZXJEYXRhIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vZ2V0IGEgc29ja2V0IHNlbmRlciBmcm9tIHRoZSBwb29sCisgICAgICAgIGlmKCFpc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIGlmKCFpc0Nvbm5lY3RlZCgpKQorICAgICAgICAgICAgICAgICAgICBjb25uZWN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU29ja2V0U2VuZGVyIHNlbmRlciA9IHNlbmRlclF1ZXVlLmdldFNlbmRlcigwKTsKKyAgICAgICAgaWYgKHNlbmRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcoIlBvb2xTb2NrZXRTZW5kZXIubm9Nb3JlU2VuZGVyIiwgdGhpcy5nZXRBZGRyZXNzKCksIG5ldyBJbnRlZ2VyKHRoaXMuZ2V0UG9ydCgpKSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vc2VuZCB0aGUgbWVzc2FnZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VuZGVyLnNlbmRNZXNzYWdlKGRhdGEpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy9yZXR1cm4gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHBvb2wKKyAgICAgICAgICAgIHNlbmRlclF1ZXVlLnJldHVyblNlbmRlcihzZW5kZXIpOworICAgICAgICB9CisgICAgICAgIGFkZFN0YXRzKGRhdGEuZ2V0TWVzc2FnZSgpLmxlbmd0aCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIlBvb2xlZFNvY2tldFNlbmRlclsiKTsKKyAgICAgICAgYnVmLmFwcGVuZChnZXRBZGRyZXNzKCkpLmFwcGVuZCgiOiIpLmFwcGVuZChnZXRQb3J0KCkpLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElubmVyIENsYXNzCisKKyAgICBwcml2YXRlIGNsYXNzIFNlbmRlclF1ZXVlIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbGltaXQgPSAyNTsKKworICAgICAgICBQb29sZWRTb2NrZXRTZW5kZXIgcGFyZW50ID0gbnVsbDsKKworICAgICAgICBwcml2YXRlIExpbmtlZExpc3QgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpOworCisgICAgICAgIHByaXZhdGUgTGlua2VkTGlzdCBpbnVzZSA9IG5ldyBMaW5rZWRMaXN0KCk7CisKKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgbXV0ZXggPSBuZXcgT2JqZWN0KCk7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzT3BlbiA9IHRydWU7CisKKyAgICAgICAgcHVibGljIFNlbmRlclF1ZXVlKFBvb2xlZFNvY2tldFNlbmRlciBwYXJlbnQsIGludCBsaW1pdCkgeworICAgICAgICAgICAgdGhpcy5saW1pdCA9IGxpbWl0OworICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsaW1pdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TGltaXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXQ7CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBsaW1pdCBUaGUgbGltaXQgdG8gc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0TGltaXQoaW50IGxpbWl0KSB7CisgICAgICAgICAgICB0aGlzLmxpbWl0ID0gbGltaXQ7CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SW5Vc2VQb29sU2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnVzZS5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRJblBvb2xTaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTb2NrZXRTZW5kZXIgZ2V0U2VuZGVyKGxvbmcgdGltZW91dCkgeworICAgICAgICAgICAgU29ja2V0U2VuZGVyIHNlbmRlciA9IG51bGw7CisgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBsb25nIGRlbHRhID0gMDsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG11dGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNPcGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvY2tldCBwb29sIGlzIGNsb3NlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciA9IChTb2NrZXRTZW5kZXIpIHF1ZXVlLnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW51c2Uuc2l6ZSgpIDwgbGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciA9IGdldE5ld1NvY2tldFNlbmRlcigpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRleC53YWl0KHRpbWVvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb29sZWRTb2NrZXRTZW5kZXIubG9nLndhcm4oc20uZ2V0U3RyaW5nKCJQb29sU29ja2V0U2VuZGVyLnNlbmRlclF1ZXVlLnNlbmRlci5mYWlsZWQiLHBhcmVudC5nZXRBZGRyZXNzKCksbmV3IEludGVnZXIocGFyZW50LmdldFBvcnQoKSkpLHgpOworICAgICAgICAgICAgICAgICAgICAgICAgfS8vY2F0Y2gKKyAgICAgICAgICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICAgICAgICAgIGlmIChzZW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW51c2UuYWRkKHNlbmRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9Ly9zeW5jaHJvbml6ZWQKKyAgICAgICAgICAgICAgICBkZWx0YSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7CisgICAgICAgICAgICB9IHdoaWxlICgoaXNPcGVuKSAmJiAoc2VuZGVyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmICh0aW1lb3V0ID09IDAgPyB0cnVlIDogKGRlbHRhIDwgdGltZW91dCkpKTsKKyAgICAgICAgICAgIC8vdG8gZG8KKyAgICAgICAgICAgIHJldHVybiBzZW5kZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXR1cm5TZW5kZXIoU29ja2V0U2VuZGVyIHNlbmRlcikgeworICAgICAgICAgICAgLy90byBkbworICAgICAgICAgICAgc3luY2hyb25pemVkIChtdXRleCkgeworICAgICAgICAgICAgICAgIHF1ZXVlLmFkZChzZW5kZXIpOworICAgICAgICAgICAgICAgIGludXNlLnJlbW92ZShzZW5kZXIpOworICAgICAgICAgICAgICAgIG11dGV4Lm5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTb2NrZXRTZW5kZXIgZ2V0TmV3U29ja2V0U2VuZGVyKCkgeworICAgICAgICAgICAgLy9uZXcgU29ja2V0U2VuZGVyKAorICAgICAgICAgICAgU29ja2V0U2VuZGVyIHNlbmRlciA9IG5ldyBTb2NrZXRTZW5kZXIoZ2V0RG9tYWluKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuZ2V0QWRkcmVzcygpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5nZXRQb3J0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuZ2V0U2VuZGVyU3RhdGUoKSApOworICAgICAgICAgICAgc2VuZGVyLnNldEtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudChwYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgLmdldEtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudCgpKTsKKyAgICAgICAgICAgIHNlbmRlci5zZXRLZWVwQWxpdmVUaW1lb3V0KHBhcmVudC5nZXRLZWVwQWxpdmVUaW1lb3V0KCkpOworICAgICAgICAgICAgc2VuZGVyLnNldEFja1RpbWVvdXQocGFyZW50LmdldEFja1RpbWVvdXQoKSk7CisgICAgICAgICAgICBzZW5kZXIuc2V0V2FpdEZvckFjayhwYXJlbnQuaXNXYWl0Rm9yQWNrKCkpOworICAgICAgICAgICAgc2VuZGVyLnNldFJlc2VuZChwYXJlbnQuaXNSZXNlbmQoKSk7CisgICAgICAgICAgICByZXR1cm4gc2VuZGVyOworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobXV0ZXgpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHF1ZXVlLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlbmRlciBzZW5kZXIgPSAoU29ja2V0U2VuZGVyKSBxdWV1ZS5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRlci5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgfS8vZm9yCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnVzZS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTb2NrZXRTZW5kZXIgc2VuZGVyID0gKFNvY2tldFNlbmRlcikgaW51c2UuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZGlzY29ubmVjdCgpOworICAgICAgICAgICAgICAgIH0vL2ZvcgorICAgICAgICAgICAgICAgIHF1ZXVlLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgaW51c2UuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBpc09wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtdXRleC5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG11dGV4KSB7CisgICAgICAgICAgICAgICAgaXNPcGVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtdXRleC5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvUmVwbGljYXRpb25MaXN0ZW5lci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9SZXBsaWNhdGlvbkxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyZGRiYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvUmVwbGljYXRpb25MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwOworCisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlcnZlclNvY2tldENoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuaW8uT2JqZWN0UmVhZGVyOworCisvKioKKyogRklYTUUgaTE4biBsb2cgbWVzc2FnZXMKKyogRklYTUUgam14IHN1cHBvcnQKKyogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisqLworcHVibGljIGNsYXNzIFJlcGxpY2F0aW9uTGlzdGVuZXIgZXh0ZW5kcyBDbHVzdGVyUmVjZWl2ZXJCYXNlCit7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJSZXBsaWNhdGlvbkxpc3RlbmVyLzEuMiI7CisgICAgCisgICAgcHJpdmF0ZSBUaHJlYWRQb29sIHBvb2wgPSBudWxsOworICAgIHByaXZhdGUgaW50IHRjcFRocmVhZENvdW50OworICAgIHByaXZhdGUgbG9uZyB0Y3BTZWxlY3RvclRpbWVvdXQ7ICAgIAorICAgIHByaXZhdGUgU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOworICAgIAorICAgIHByaXZhdGUgT2JqZWN0IGludGVyZXN0T3BzTXV0ZXggPSBuZXcgT2JqZWN0KCk7CisgICAgCisgICAgcHVibGljIFJlcGxpY2F0aW9uTGlzdGVuZXIoKSB7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uIGFuZCB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorIAorICAgIHB1YmxpYyBsb25nIGdldFRjcFNlbGVjdG9yVGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIHRjcFNlbGVjdG9yVGltZW91dDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0VGNwU2VsZWN0b3JUaW1lb3V0KGxvbmcgdGNwU2VsZWN0b3JUaW1lb3V0KSB7CisgICAgICAgIHRoaXMudGNwU2VsZWN0b3JUaW1lb3V0ID0gdGNwU2VsZWN0b3JUaW1lb3V0OworICAgIH0KKyAgICBwdWJsaWMgaW50IGdldFRjcFRocmVhZENvdW50KCkgeworICAgICAgICByZXR1cm4gdGNwVGhyZWFkQ291bnQ7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFRjcFRocmVhZENvdW50KGludCB0Y3BUaHJlYWRDb3VudCkgeworICAgICAgICB0aGlzLnRjcFRocmVhZENvdW50ID0gdGNwVGhyZWFkQ291bnQ7CisgICAgfQorICAgIHB1YmxpYyBPYmplY3QgZ2V0SW50ZXJlc3RPcHNNdXRleCgpIHsKKyAgICAgICAgcmV0dXJuIGludGVyZXN0T3BzTXV0ZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogc3RhcnQgY2x1c3RlciByZWNlaXZlcgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclJlY2VpdmVyI3N0YXJ0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcG9vbCA9IG5ldyBUaHJlYWRQb29sKHRjcFRocmVhZENvdW50LCBUY3BSZXBsaWNhdGlvblRocmVhZC5jbGFzcywgaW50ZXJlc3RPcHNNdXRleCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVGhyZWFkUG9vbCBjYW4gaW5pdGlsemVkLiBMaXN0ZW5lciBub3Qgc3RhcnRlZCIsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cGVyLnN0YXJ0KCkgOworICAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBnZXQgZGF0YSBmcm9tIGNoYW5uZWwgYW5kIHN0b3JlIGluIGJ5dGUgYXJyYXkKKyAgICAgKiBzZW5kIGl0IHRvIGNsdXN0ZXIKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogQHRocm93cyBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRDaGFubmVsRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbGlzdGVuICgpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChkb0xpc3RlbikgeworICAgICAgICAgICAgbG9nLndhcm4oIlNlcnZlclNvY2tldENoYW5uZWwgYWxscmVhZHkgc3RhcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGRvTGlzdGVuPXRydWU7CisgICAgICAgIC8vIGFsbG9jYXRlIGFuIHVuYm91bmQgc2VydmVyIHNvY2tldCBjaGFubmVsCisgICAgICAgIFNlcnZlclNvY2tldENoYW5uZWwgc2VydmVyQ2hhbm5lbCA9IFNlcnZlclNvY2tldENoYW5uZWwub3BlbigpOworICAgICAgICAvLyBHZXQgdGhlIGFzc29jaWF0ZWQgU2VydmVyU29ja2V0IHRvIGJpbmQgaXQgd2l0aAorICAgICAgICBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gc2VydmVyQ2hhbm5lbC5zb2NrZXQoKTsKKyAgICAgICAgLy8gY3JlYXRlIGEgbmV3IFNlbGVjdG9yIGZvciB1c2UgYmVsb3cKKyAgICAgICAgc2VsZWN0b3IgPSBTZWxlY3Rvci5vcGVuKCk7CisgICAgICAgIC8vIHNldCB0aGUgcG9ydCB0aGUgc2VydmVyIGNoYW5uZWwgd2lsbCBsaXN0ZW4gdG8KKyAgICAgICAgc2VydmVyU29ja2V0LmJpbmQgKG5ldyBJbmV0U29ja2V0QWRkcmVzcyAoZ2V0QmluZCgpLGdldFRjcExpc3RlblBvcnQoKSkpOworICAgICAgICAvLyBzZXQgbm9uLWJsb2NraW5nIG1vZGUgZm9yIHRoZSBsaXN0ZW5pbmcgc29ja2V0CisgICAgICAgIHNlcnZlckNoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcgKGZhbHNlKTsKKyAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIFNlcnZlclNvY2tldENoYW5uZWwgd2l0aCB0aGUgU2VsZWN0b3IKKyAgICAgICAgc2VydmVyQ2hhbm5lbC5yZWdpc3RlciAoc2VsZWN0b3IsIFNlbGVjdGlvbktleS5PUF9BQ0NFUFQpOworICAgICAgICB3aGlsZSAoZG9MaXN0ZW4gJiYgc2VsZWN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gdGhpcyBtYXkgYmxvY2sgZm9yIGEgbG9uZyB0aW1lLCB1cG9uIHJldHVybiB0aGUKKyAgICAgICAgICAgIC8vIHNlbGVjdGVkIHNldCBjb250YWlucyBrZXlzIG9mIHRoZSByZWFkeSBjaGFubmVscworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIGludCBuID0gc2VsZWN0b3Iuc2VsZWN0KHRjcFNlbGVjdG9yVGltZW91dCk7CisgICAgICAgICAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvL3RoZXJlIGlzIGEgZ29vZCBjaGFuY2UgdGhhdCB3ZSBnb3QgaGVyZSAKKyAgICAgICAgICAgICAgICAgICAgLy9iZWNhdXNlIHRoZSBUY3BSZXBsaWNhdGlvblRocmVhZCBjYWxsZWQKKyAgICAgICAgICAgICAgICAgICAgLy9zZWxlY3RvciB3YWtldXAoKS4KKyAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGF0IGhhcHBlbnMsIHdlIG11c3QgZW5zdXJlIHRoYXQgdGhhdAorICAgICAgICAgICAgICAgICAgICAvL3RocmVhZCBoYXMgZW5vdWdoIHRpbWUgdG8gY2FsbCBpbnRlcmVzdE9wcworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGludGVyZXN0T3BzTXV0ZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgd2UgZ290IHRoZSBsb2NrLCBtZWFucyB0aGVyZSBhcmUgbm8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8va2V5cyB0cnlpbmcgdG8gcmVnaXN0ZXIgZm9yIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaW50ZXJlc3RPcHMgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZ2V0IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHNldCBvZiBzZWxlY3RlZCBrZXlzCisgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBzZWxlY3Rvci5zZWxlY3RlZEtleXMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIC8vIGxvb2sgYXQgZWFjaCBrZXkgaW4gdGhlIHNlbGVjdGVkIHNldAorICAgICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uS2V5IGtleSA9IChTZWxlY3Rpb25LZXkpIGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXMgYSBuZXcgY29ubmVjdGlvbiBjb21pbmcgaW4/CisgICAgICAgICAgICAgICAgICAgIGlmIChrZXkuaXNBY2NlcHRhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlclNvY2tldENoYW5uZWwgc2VydmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2VydmVyU29ja2V0Q2hhbm5lbCkga2V5LmNoYW5uZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldENoYW5uZWwgY2hhbm5lbCA9IHNlcnZlci5hY2NlcHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhdHRhY2ggPSBuZXcgT2JqZWN0UmVhZGVyKGNoYW5uZWwsIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcykgOworICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJDaGFubmVsKHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uS2V5Lk9QX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBpcyB0aGVyZSBkYXRhIHRvIHJlYWQgb24gdGhpcyBjaGFubmVsPworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmlzUmVhZGFibGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVhZERhdGFGcm9tU29ja2V0KGtleSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkuaW50ZXJlc3RPcHMoa2V5LmludGVyZXN0T3BzKCkgJiAoflNlbGVjdGlvbktleS5PUF9XUklURSkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGtleSBmcm9tIHNlbGVjdGVkIHNldCwgaXQncyBiZWVuIGhhbmRsZWQKKyAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkU2VsZWN0b3JFeGNlcHRpb24gY3NlKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlIGlzIG5vcm1hbCBhdCBzaHV0ZG93biBvciBzdG9wIGxpc3RlbiBzb2NrZXQKKyAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubmlvLmNoYW5uZWxzLkNhbmNlbGxlZEtleUV4Y2VwdGlvbiBueCkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKAorICAgICAgICAgICAgICAgICAgICAiUmVwbGljYXRpb24gY2xpZW50IGRpc2Nvbm5lY3RlZCwgZXJyb3Igd2hlbiBwb2xsaW5nIGtleS4gSWdub3JpbmcgY2xpZW50LiIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBwcm9jZXNzIHJlcXVlc3QgaW4gUmVwbGljYXRpb25MaXN0ZW5lciIsIHgpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgc2VydmVyQ2hhbm5lbC5jbG9zZSgpOworICAgICAgICBpZihzZWxlY3RvciAhPSBudWxsKQorICAgICAgICAgICAgc2VsZWN0b3IuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBTZWxlY3Rvci4KKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5DbHVzdGVyUmVjZWl2ZXJCYXNlI3N0b3BMaXN0ZW5pbmcoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7CisgICAgICAgIC8vIEJ1Z3ppbGxhIDM3NTI5OiBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM3NTI5CisgICAgICAgIGRvTGlzdGVuID0gZmFsc2U7CisgICAgICAgIGlmICggc2VsZWN0b3IgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGdldFRjcFRocmVhZENvdW50KCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci53YWtldXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZWN0b3IuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBjbG9zZSBjbHVzdGVyIHJlY2VpdmVyIHNlbGVjdG9yLiIseCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gbnVsbDsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgIH0KKyAgICAgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgdGhlIGdpdmVuIGNoYW5uZWwgd2l0aCB0aGUgZ2l2ZW4gc2VsZWN0b3IgZm9yCisgICAgICogdGhlIGdpdmVuIG9wZXJhdGlvbnMgb2YgaW50ZXJlc3QKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckNoYW5uZWwgKFNlbGVjdG9yIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0YWJsZUNoYW5uZWwgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXR0YWNoKQorICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoY2hhbm5lbCA9PSBudWxsKSByZXR1cm47IC8vIGNvdWxkIGhhcHBlbgorICAgICAgICAvLyBzZXQgdGhlIG5ldyBjaGFubmVsIG5vbi1ibG9ja2luZworICAgICAgICBjaGFubmVsLmNvbmZpZ3VyZUJsb2NraW5nIChmYWxzZSk7CisgICAgICAgIC8vIHJlZ2lzdGVyIGl0IHdpdGggdGhlIHNlbGVjdG9yCisgICAgICAgIGNoYW5uZWwucmVnaXN0ZXIgKHNlbGVjdG9yLCBvcHMsIGF0dGFjaCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogU2FtcGxlIGRhdGEgaGFuZGxlciBtZXRob2QgZm9yIGEgY2hhbm5lbCB3aXRoIGRhdGEgcmVhZHkgdG8gcmVhZC4KKyAgICAgKiBAcGFyYW0ga2V5IEEgU2VsZWN0aW9uS2V5IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSBjaGFubmVsCisgICAgICogIGRldGVybWluZWQgYnkgdGhlIHNlbGVjdG9yIHRvIGJlIHJlYWR5IGZvciByZWFkaW5nLiAgSWYgdGhlCisgICAgICogIGNoYW5uZWwgcmV0dXJucyBhbiBFT0YgY29uZGl0aW9uLCBpdCBpcyBjbG9zZWQgaGVyZSwgd2hpY2gKKyAgICAgKiAgYXV0b21hdGljYWxseSBpbnZhbGlkYXRlcyB0aGUgYXNzb2NpYXRlZCBrZXkuICBUaGUgc2VsZWN0b3IKKyAgICAgKiAgd2lsbCB0aGVuIGRlLXJlZ2lzdGVyIHRoZSBjaGFubmVsIG9uIHRoZSBuZXh0IHNlbGVjdCBjYWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlYWREYXRhRnJvbVNvY2tldCAoU2VsZWN0aW9uS2V5IGtleSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgVGNwUmVwbGljYXRpb25UaHJlYWQgd29ya2VyID0gKFRjcFJlcGxpY2F0aW9uVGhyZWFkKXBvb2wuZ2V0V29ya2VyKCk7CisgICAgICAgIGlmICh3b3JrZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTm8gdGhyZWFkcyBhdmFpbGFibGUsIGRvIG5vdGhpbmcsIHRoZSBzZWxlY3Rpb24KKyAgICAgICAgICAgIC8vIGxvb3Agd2lsbCBrZWVwIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYQorICAgICAgICAgICAgLy8gdGhyZWFkIGJlY29tZXMgYXZhaWxhYmxlLgorICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgZGVzaWduIGNvdWxkIGJlIGltcHJvdmVkLgorICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBUY3BSZXBsaWNhdGlvblRocmVhZCBhdmFpbGFibGUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGludm9raW5nIHRoaXMgd2FrZXMgdXAgdGhlIHdvcmtlciB0aHJlYWQgdGhlbiByZXR1cm5zCisgICAgICAgICAgICB3b3JrZXIuc2VydmljZUNoYW5uZWwoa2V5LCBpc1NlbmRBY2soKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvUmVwbGljYXRpb25UcmFuc21pdHRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9SZXBsaWNhdGlvblRyYW5zbWl0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2NGY0YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvUmVwbGljYXRpb25UcmFuc21pdHRlci5qYXZhCkBAIC0wLDAgKzEsOTEyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNC0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJTZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudXRpbC5JRHluYW1pY1Byb3BlcnR5OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5JbnRyb3NwZWN0aW9uVXRpbHM7CisKKy8qKgorICogVHJhbnNtaXQgbWVzc2FnZSB0byBvaHRlciBjbHVzdGVyIG1lbWJlcnMgY3JlYXRlIHNlbmRlciBmcm9tIHJlcGxpY2F0aW9uTW9kZQorICogdHlwZSAKKyAqIEZJWE1FIGkxOG4gbG9nIG1lc3NhZ2VzCisgKiBGSVhNRSBjb21wcmVzcyBkYXRhIGRlcGVuZHMgb24gbWVzc2FnZSB0eXBlIGFuZCBzaXplIAorICogRklYTUUgc2VuZCB2ZXJ5IGJpZyBtZXNzYWdlcyBhdCBzb21lIGJsb2NrIHNlZSBGYXJtV2FyRGVwbG95ZXIhCisgKiBUT0RPIHBhdXNlIGFuZCByZXN1bWUgc2VuZGVycworICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgUmVwbGljYXRpb25UcmFuc21pdHRlciBpbXBsZW1lbnRzIENsdXN0ZXJTZW5kZXIsSUR5bmFtaWNQcm9wZXJ0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkKKyAgICAgICAgICAgIC5nZXRMb2coUmVwbGljYXRpb25UcmFuc21pdHRlci5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJSZXBsaWNhdGlvblRyYW5zbWl0dGVyLzMuMCI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nTWFuYWdlciBzbSA9IFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICBwcml2YXRlIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworCisgICAgcHVibGljIFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogbnVtYmVyIG9mIHRyYW5zbWl0dGVkIG1lc3NhZ2VzPgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBuck9mUmVxdWVzdHMgPSAwOworCisgICAgLyoqCisgICAgICogbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGJ5dGVzCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHRvdGFsQnl0ZXMgPSAwOworCisgICAgLyoqCisgICAgICogbnVtYmVyIG9mIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgZmFpbHVyZUNvdW50ZXIgPSAwOworCisgICAgLyoqCisgICAgICogSXRlcmF0aW9uIGNvdW50IGZvciBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY291bnQgPSAwOworCisgICAgLyoqCisgICAgICogRnJlcXVlbmN5IG9mIHRoZSBjaGVjayBzZW5kZXIga2VlcEFsaXZlIFNvY2tldCBTdGF0dXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBwcm9jZXNzU2VuZGVyRnJlcXVlbmN5ID0gMjsKKworICAgIC8qKgorICAgICAqIGN1cnJlbnQgc2VuZGVyIHJlcGxpY2F0aW9uIG1vZGUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXBsaWNhdGlvbk1vZGU7CisKKyAgICAvKioKKyAgICAgKiBzZW5kZXIgZGVmYXVsdCBhY2tUaW1lb3V0CisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIGFja1RpbWVvdXQgPSAxNTAwMDsgLy8xNSBzZWNvbmRzIGJ5IGRlZmF1bHQKKworICAgIC8qKgorICAgICAqIGVuYWJsZWQgd2FpdCBmb3IgYWNrCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHdhaXRGb3JBY2sgPSB0cnVlOworCisgICAgLyoqCisgICAgICogYXV0b0Nvbm5lY3Qgc2VuZGVyIHdoZW4gbmV4dCBtZXNzYWdlIHNlbmQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYXV0b0Nvbm5lY3QgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIENvbXByZXNzIG1lc3NhZ2UgZGF0YSBieXRlcworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjb21wcmVzcyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogZG9UcmFuc21pdHRlclByb2Nlc3NpbmdTdGF0cworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGRvVHJhbnNtaXR0ZXJQcm9jZXNzaW5nU3RhdHMgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIHByb2Vzc2luZ1RpbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBwcm9jZXNzaW5nVGltZSA9IDA7CisgICAgCisgICAgLyoqCisgICAgICogbWluIHByb2Vzc2luZ1RpbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBtaW5Qcm9jZXNzaW5nVGltZSA9IExvbmcuTUFYX1ZBTFVFIDsKKworICAgIC8qKgorICAgICAqIG1heCBwcm9lc3NpbmdUaW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgbWF4UHJvY2Vzc2luZ1RpbWUgPSAwOworICAgCisgICAgLyoqCisgICAgICogZHluYW1pYyBzZW5kZXIgPGNvZGU+cHJvcGVydGllczwvY29kZT4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIC8qKgorICAgICAqIG15IGNsdXN0ZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIFNpbXBsZVRjcENsdXN0ZXIgY2x1c3RlcjsKKworICAgIC8qKgorICAgICAqIFRyYW5zbWl0dGVyIE1iZWFuIG5hbWUKKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdE5hbWUgb2JqZWN0TmFtZTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24gYW5kIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworICAgICAgICByZXR1cm4gKGluZm8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbnJPZlJlcXVlc3RzLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldE5yT2ZSZXF1ZXN0cygpIHsKKyAgICAgICAgcmV0dXJuIG5yT2ZSZXF1ZXN0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRvdGFsQnl0ZXMuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0VG90YWxCeXRlcygpIHsKKyAgICAgICAgcmV0dXJuIHRvdGFsQnl0ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmYWlsdXJlQ291bnRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRGYWlsdXJlQ291bnRlcigpIHsKKyAgICAgICAgcmV0dXJuIGZhaWx1cmVDb3VudGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIGN1cnJlbnQgcmVwbGljYXRpb24gbW9kZQorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIG1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcGxpY2F0aW9uTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlcGxpY2F0aW9uTW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgcmVwbGljYXRpb24gTW9kZSAocG9vbGVkLCBzeW5jaG9ub3VzLCBhc3luY2hvbm91cywgZmFzdGFzeW5jcXVldWUpCisgICAgICogCisgICAgICogQHNlZSBJRGF0YVNlbmRlckZhY3RvcnkjdmFsaWRhdGVNb2RlKFN0cmluZykKKyAgICAgKiBAcGFyYW0gbW9kZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcGxpY2F0aW9uTW9kZShTdHJpbmcgbW9kZSkgeworICAgICAgICBTdHJpbmcgbXNnID0gSURhdGFTZW5kZXJGYWN0b3J5LnZhbGlkYXRlTW9kZShtb2RlKTsKKyAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXR0aW5nIHJlcGxpY2F0aW9uIG1vZGUgdG8gIiArIG1vZGUpOworICAgICAgICAgICAgdGhpcy5yZXBsaWNhdGlvbk1vZGUgPSBtb2RlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obXNnKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYXZnIHByb2Nlc3NpbmdUaW1lL25yT2ZSZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZG91YmxlIGdldEF2Z1Byb2Nlc3NpbmdUaW1lKCkgeworICAgICAgICBpZiAoIG5yT2ZSZXF1ZXN0cyA+IDAgKSB7CisgICAgICAgICAgICByZXR1cm4gKChkb3VibGUpcHJvY2Vzc2luZ1RpbWUpIC8gbnJPZlJlcXVlc3RzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBtYXhQcm9jZXNzaW5nVGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRNYXhQcm9jZXNzaW5nVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIG1heFByb2Nlc3NpbmdUaW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1pblByb2Nlc3NpbmdUaW1lLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldE1pblByb2Nlc3NpbmdUaW1lKCkgeworICAgICAgICByZXR1cm4gbWluUHJvY2Vzc2luZ1RpbWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJvY2Vzc2luZ1RpbWUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0UHJvY2Vzc2luZ1RpbWUoKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzaW5nVGltZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkb1RyYW5zbWl0dGVyUHJvY2Vzc2luZ1N0YXRzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRG9UcmFuc21pdHRlclByb2Nlc3NpbmdTdGF0cygpIHsKKyAgICAgICAgcmV0dXJuIGRvVHJhbnNtaXR0ZXJQcm9jZXNzaW5nU3RhdHM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSBkb1Byb2Nlc3NpbmdTdGF0cyBUaGUgZG9UcmFuc21pdHRlclByb2Nlc3NpbmdTdGF0cyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9UcmFuc21pdHRlclByb2Nlc3NpbmdTdGF0cyhib29sZWFuIGRvUHJvY2Vzc2luZ1N0YXRzKSB7CisgICAgICAgIHRoaXMuZG9UcmFuc21pdHRlclByb2Nlc3NpbmdTdGF0cyA9IGRvUHJvY2Vzc2luZ1N0YXRzOworICAgIH0KKyAKKworICAgIC8qKgorICAgICAqIFRyYW5zbWl0dGVyIE9iamVjdE5hbWUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdE5hbWUoT2JqZWN0TmFtZSBuYW1lKSB7CisgICAgICAgIG9iamVjdE5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3ROYW1lIGdldE9iamVjdE5hbWUoKSB7CisgICAgICAgIHJldHVybiBvYmplY3ROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29tcHJlc3MuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb21wcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIGNvbXByZXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBjb21wcmVzc01lc3NhZ2VEYXRhCisgICAgICogICAgICAgICAgICBUaGUgY29tcHJlc3MgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzKGJvb2xlYW4gY29tcHJlc3NNZXNzYWdlRGF0YSkgeworICAgICAgICB0aGlzLmNvbXByZXNzID0gY29tcHJlc3NNZXNzYWdlRGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGF1dG9Db25uZWN0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQXV0b0Nvbm5lY3QoKSB7CisgICAgICAgIHJldHVybiBhdXRvQ29ubmVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYXV0b0Nvbm5lY3QKKyAgICAgKiAgICAgICAgICAgIFRoZSBhdXRvQ29ubmVjdCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0Nvbm5lY3QoYm9vbGVhbiBhdXRvQ29ubmVjdCkgeworICAgICAgICB0aGlzLmF1dG9Db25uZWN0ID0gYXV0b0Nvbm5lY3Q7CisgICAgICAgIHNldFByb3BlcnR5KCJhdXRvQ29ubmVjdCIsIFN0cmluZy52YWx1ZU9mKGF1dG9Db25uZWN0KSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBhY2sgdGltZW91dAorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEFja1RpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBhY2tUaW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhY2tUaW1lb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWNrVGltZW91dChsb25nIGFja1RpbWVvdXQpIHsKKyAgICAgICAgdGhpcy5hY2tUaW1lb3V0ID0gYWNrVGltZW91dDsKKyAgICAgICAgc2V0UHJvcGVydHkoImFja1RpbWVvdXQiLCBTdHJpbmcudmFsdWVPZihhY2tUaW1lb3V0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3YWl0Rm9yQWNrLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzV2FpdEZvckFjaygpIHsKKyAgICAgICAgcmV0dXJuIHdhaXRGb3JBY2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHdhaXRGb3JBY2sKKyAgICAgKiAgICAgICAgICAgIFRoZSB3YWl0Rm9yQWNrIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXYWl0Rm9yQWNrKGJvb2xlYW4gd2FpdEZvckFjaykgeworICAgICAgICB0aGlzLndhaXRGb3JBY2sgPSB3YWl0Rm9yQWNrOworICAgICAgICBzZXRQcm9wZXJ0eSgid2FpdEZvckFjayIsIFN0cmluZy52YWx1ZU9mKHdhaXRGb3JBY2spKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByb2Nlc3NTZW5kZXJGcmVxdWVuY3kuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQcm9jZXNzU2VuZGVyRnJlcXVlbmN5KCkgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1NlbmRlckZyZXF1ZW5jeTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIHByb2Nlc3NTZW5kZXJGcmVxdWVuY3kgVGhlIHByb2Nlc3NTZW5kZXJGcmVxdWVuY3kgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NTZW5kZXJGcmVxdWVuY3koaW50IHByb2Nlc3NTZW5kZXJGcmVxdWVuY3kpIHsKKyAgICAgICAgdGhpcy5wcm9jZXNzU2VuZGVyRnJlcXVlbmN5ID0gcHJvY2Vzc1NlbmRlckZyZXF1ZW5jeTsKKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBjb25maWd1cmVkIGluIGNsdXN0ZXIKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyU2VuZGVyI3NldENhdGFsaW5hQ2x1c3RlcihvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlNpbXBsZVRjcENsdXN0ZXIpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2F0YWxpbmFDbHVzdGVyKFNpbXBsZVRjcENsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICB0aGlzLmNsdXN0ZXIgPSBjbHVzdGVyOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUcnVlIGlmIHN5bmNocm9uaXplZCBzZW5kZXIKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDUuNS43CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SXNTZW5kZXJTeW5jaHJvbml6ZWQoKSB7CisgICAgICAgIHJldHVybiBJRGF0YVNlbmRlckZhY3RvcnkuU1lOQ19NT0RFLmVxdWFscyhyZXBsaWNhdGlvbk1vZGUpCisgICAgICAgICAgICAgICAgfHwgSURhdGFTZW5kZXJGYWN0b3J5LlBPT0xFRF9TWU5DX01PREUuZXF1YWxzKHJlcGxpY2F0aW9uTW9kZSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkeW5hbWljCisgICAgLy8gc2VuZGVyIHByb3BlcnR5IGhhbmRsaW5nCisKKyAgICAvKioKKyAgICAgKiBzZXQgY29uZmlnIGF0dHJpYnV0ZXMgd2l0aCByZWZsZWN0CisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZShzbS5nZXRTdHJpbmcoIlJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIuc2V0UHJvcGVydHkiLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgcHJvcGVydGllcy5nZXQobmFtZSkpKTsKKworICAgICAgICBwcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGN1cnJlbnQgY29uZmlnCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqIEByZXR1cm4gVGhlIHByb3BlcnR5CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZShzbS5nZXRTdHJpbmcoIlJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIuZ2V0UHJvcGVydHkiLCBrZXkpKTsKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFsbCBwcm9wZXJ0aWVzIGtleXMKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIG92ZXIgdGhlIHByb3BlcnkgbmFtZSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0UHJvcGVydHlOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUgYSBjb25maWd1cmVkIHByb3BlcnR5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcga2V5KSB7CisgICAgICAgIHByb3BlcnRpZXMucmVtb3ZlKGtleSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwdWJsaWMKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZW5kIGRhdGEgdG8gb25lIG1lbWJlcgorICAgICAqIEZJWE1FIHNldCBmaWx0ZXJpbmcgbWVzc2FnZXMKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyU2VuZGVyI3NlbmRNZXNzYWdlKG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWVzc2FnZSwgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kTWVzc2FnZShDbHVzdGVyTWVzc2FnZSBtZXNzYWdlLCBNZW1iZXIgbWVtYmVyKQorICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geyAgICAgICAKKyAgICAgICAgbG9uZyB0aW1lID0gMCA7CisgICAgICAgIGlmKGRvVHJhbnNtaXR0ZXJQcm9jZXNzaW5nU3RhdHMpIHsKKyAgICAgICAgICAgIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2x1c3RlckRhdGEgZGF0YSA9IHNlcmlhbGl6ZShtZXNzYWdlKTsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRLZXkobWVtYmVyKTsKKyAgICAgICAgICAgIElEYXRhU2VuZGVyIHNlbmRlciA9IChJRGF0YVNlbmRlcikgbWFwLmdldChrZXkpOworICAgICAgICAgICAgaWYoc2VuZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIElEYXRhU2VuZGVyW10gc2VuZGVycyA9IGdldFNlbmRlcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNlbmRlckluZm8gPSBuZXcgU3RyaW5nQnVmZmVyKCkgOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbmRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElEYXRhU2VuZGVyIHNlbmRlcjEgPSBzZW5kZXJzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVySW5mby5hcHBlbmQoc2VuZGVyMS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGktMSA8IHNlbmRlcnMubGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlckluZm8uYXBwZW5kKCIsIikgOworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHNlbmQgcmVwbGljYXRlZCBtZXNzYWdlIHRvIG1lbWJlciBbIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIrIl0sIGhhcyBvbmx5IHNlbmRlcnMgZm9yIFsiICsgc2VuZGVySW5mbyArICJdIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEYXRhKGRhdGEsIHNlbmRlcik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZG9UcmFuc21pdHRlclByb2Nlc3NpbmdTdGF0cykgeworICAgICAgICAgICAgICAgIGFkZFByb2Nlc3NpbmdTdGF0cyh0aW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZW5kIHRvIGFsbCBzZW5kZXJzIGF0IHNhbWUgY2x1c3RlciBkb21haW4gYXMgbWVzc2FnZSBmcm9tIGFkZHJlc3MKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBDbHVzdGVyIG1lc3NhZ2UgdG8gc2VuZAorICAgICAqIEBzaW5jZSA1LjUuMTAKKyAgICAgKiBGSVhNRSBSZWZhY3RvciB3aXRoIHNlbmRNZXNzYWdlIGdldCBhIHNlbmRlciBsaXN0IGZyb20KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kTWVzc2FnZUNsdXN0ZXJEb21haW4oQ2x1c3Rlck1lc3NhZ2UgbWVzc2FnZSkgCisgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIGxvbmcgdGltZSA9IDA7CisgICAgICAgIGlmIChkb1RyYW5zbWl0dGVyUHJvY2Vzc2luZ1N0YXRzKSB7CisgICAgICAgICAgICB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSBtZXNzYWdlLmdldEFkZHJlc3MoKS5nZXREb21haW4oKTsKKyAgICAgICAgICAgIGlmKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEb21haW4gYXQgbWVtYmVyIG5vdCBzZXQiKTsKKyAgICAgICAgICAgIENsdXN0ZXJEYXRhIGRhdGEgPSBzZXJpYWxpemUobWVzc2FnZSk7CisgICAgICAgICAgICBJRGF0YVNlbmRlcltdIHNlbmRlcnMgPSBnZXRTZW5kZXJzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbmRlcnMubGVuZ3RoOyBpKyspIHsKKworICAgICAgICAgICAgICAgIElEYXRhU2VuZGVyIHNlbmRlciA9IHNlbmRlcnNbaV07CisgICAgICAgICAgICAgICAgaWYoZG9tYWluLmVxdWFscyhzZW5kZXIuZ2V0RG9tYWluKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBzZW5kTWVzc2FnZURhdGEoZGF0YSwgc2VuZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVEhJUyBXSUxMIE5FVkVSIEhBUFBFTiwgYXMgc2VuZE1lc3NhZ2VEYXRhIHN3YWxsb3dzIHRoZSBlcnJvcgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gRklYTUUgYmV0dGVyIGV4Y2VwdGlvbiBoYW5kbGluZworICAgICAgICAgICAgaWYgKGRvVHJhbnNtaXR0ZXJQcm9jZXNzaW5nU3RhdHMpIHsKKyAgICAgICAgICAgICAgICBhZGRQcm9jZXNzaW5nU3RhdHModGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZW5kIG1lc3NhZ2UgdG8gYWxsIHNlbmRlcnMgKGJyb2FkY2FzdCkKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyU2VuZGVyI3NlbmRNZXNzYWdlKG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWVzc2FnZSkKKyAgICAgKiBGSVhNRSBSZWZhY3RvciB3aXRoIHNlbmRNZXNzYWdlQ2x1c3RlckRvbWFpbiEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kTWVzc2FnZShDbHVzdGVyTWVzc2FnZSBtZXNzYWdlKQorICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBsb25nIHRpbWUgPSAwOworICAgICAgICBpZiAoZG9UcmFuc21pdHRlclByb2Nlc3NpbmdTdGF0cykgeworICAgICAgICAgICAgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbHVzdGVyRGF0YSBkYXRhID0gc2VyaWFsaXplKG1lc3NhZ2UpOworICAgICAgICAgICAgSURhdGFTZW5kZXJbXSBzZW5kZXJzID0gZ2V0U2VuZGVycygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZW5kZXJzLmxlbmd0aDsgaSsrKSB7CisKKyAgICAgICAgICAgICAgICBJRGF0YVNlbmRlciBzZW5kZXIgPSBzZW5kZXJzW2ldOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGF0YShkYXRhLCBzZW5kZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHJlbWVtYmVyIGV4Y2VwdGlvbiBhbmQgc2VuZCBpdCBhdCBmaW5hbGx5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gRklYTUUgYmV0dGVyIGV4Y2VwdGlvbiBoYW5kbGluZworICAgICAgICAgICAgaWYgKGRvVHJhbnNtaXR0ZXJQcm9jZXNzaW5nU3RhdHMpIHsKKyAgICAgICAgICAgICAgICBhZGRQcm9jZXNzaW5nU3RhdHModGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzdGFydCB0aGUgc2VuZGVyIGFuZCByZWdpc3RlciB0cmFuc21pdHRlciBtYmVhbgorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJTZW5kZXIjc3RhcnQoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBpZiAoY2x1c3RlciAhPSBudWxsKSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIGNsdXN0ZXJOYW1lID0gY2x1c3Rlci5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgICAgICBPYmplY3ROYW1lIHRyYW5zbWl0dGVyTmFtZSA9IG51bGwgOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBNQmVhblNlcnZlciBtc2VydmVyID0gY2x1c3Rlci5nZXRNQmVhblNlcnZlcigpOworICAgICAgICAgICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBjbHVzdGVyLmdldENvbnRhaW5lcigpOworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY2x1c3Rlck5hbWUuZ2V0RG9tYWluKCkgKyAiOnR5cGU9Q2x1c3RlclNlbmRlciI7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFN0YW5kYXJkSG9zdCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lICs9ICIsaG9zdD0iICsgY2x1c3Rlck5hbWUuZ2V0S2V5UHJvcGVydHkoImhvc3QiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhbnNtaXR0ZXJOYW1lID0gbmV3IE9iamVjdE5hbWUobmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKHRyYW5zbWl0dGVyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbHVzdGVyLm1iZWFuLnJlZ2lzdGVyLmFscmVhZHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc21pdHRlck5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRPYmplY3ROYW1lKHRyYW5zbWl0dGVyTmFtZSk7CisgICAgICAgICAgICAgICAgbXNlcnZlci5yZWdpc3Rlck1CZWFuKGNsdXN0ZXIuZ2V0TWFuYWdlZEJlYW4odGhpcyksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRPYmplY3ROYW1lKCkpOworICAgICAgICAgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygiUmVwbGljYXRpb25UcmFuc21pdHRlci5zdGFydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyTmFtZSwgdHJhbnNtaXR0ZXJOYW1lKSk7CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLndhcm4oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIHN0b3AgdGhlIHNlbmRlciBhbmQgZGVyZWdpc3RlciBtYmVhbnMgKHRyYW5zbWl0dGVyLCBzZW5kZXJzKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJTZW5kZXIjc3RvcCgpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7CisgICAgICAgIEl0ZXJhdG9yIGkgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIElEYXRhU2VuZGVyIHNlbmRlciA9IChJRGF0YVNlbmRlcikgKChqYXZhLnV0aWwuTWFwLkVudHJ5KSBpLm5leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJTZW5kZXJNQmVhbihzZW5kZXIpOworICAgICAgICAgICAgICAgIHNlbmRlci5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgaS5yZW1vdmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2x1c3RlciAhPSBudWxsICYmIGdldE9iamVjdE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBjbHVzdGVyLmdldE1CZWFuU2VydmVyKCk7CisgICAgICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4oZ2V0T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoIlJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIuc3RvcHBlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLmdldE9iamVjdE5hbWUoKSwgZ2V0T2JqZWN0TmFtZSgpKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgdHJhbnNtaXR0ZXIgdG8gY2hlY2sgZm9yIHNlbmRlciBzb2NrZXQgc3RhdHVzCisgICAgICogCisgICAgICogQHNlZSBTaW1wbGVUY3BDbHVzdGVyI2JhY2tncm91bmRQcm9jZXNzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiYWNrZ3JvdW5kUHJvY2VzcygpIHsKKyAgICAgICAgY291bnQgPSAoY291bnQgKyAxKSAlIHByb2Nlc3NTZW5kZXJGcmVxdWVuY3k7CisgICAgICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgICAgICBjaGVja0tlZXBBbGl2ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgYWxsIERhdGFTZW5kZXIgU29ja2V0IHRvIGNsb3NlIHNvY2tldCBhdCBrZWVwQWxpdmUgbW9kZQorICAgICAqIEBzZWUgRGF0YVNlbmRlciNjaGVja0tlZXBBbGl2ZSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2hlY2tLZWVwQWxpdmUoKSB7CisgICAgICAgIGlmIChtYXAuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXIgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgSURhdGFTZW5kZXIgc2VuZGVyID0gKElEYXRhU2VuZGVyKSAoKGphdmEudXRpbC5NYXAuRW50cnkpIGl0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0KCkpLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHNlbmRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzZW5kZXIuY2hlY2tLZWVwQWxpdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBhbGwgY3VycmVudCBzZW5kZXJzCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgc2VuZGVycworICAgICAqLworICAgIHB1YmxpYyBJRGF0YVNlbmRlcltdIGdldFNlbmRlcnMoKSB7CisgICAgICAgIGphdmEudXRpbC5JdGVyYXRvciBpdGVyID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgSURhdGFTZW5kZXJbXSBhcnJheSA9IG5ldyBJRGF0YVNlbmRlclttYXAuc2l6ZSgpXTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIElEYXRhU2VuZGVyIHNlbmRlciA9IChJRGF0YVNlbmRlcikgKChqYXZhLnV0aWwuTWFwLkVudHJ5KSBpdGVyCisgICAgICAgICAgICAgICAgICAgIC5uZXh0KCkpLmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoc2VuZGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBzZW5kZXI7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFycmF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBhbGwgY3VycmVudCBzZW5kZXJzCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgc2VuZGVyIG9iamVjdCBuYW1lcworICAgICAqLworICAgIHB1YmxpYyBPYmplY3ROYW1lW10gZ2V0U2VuZGVyT2JqZWN0TmFtZXMoKSB7CisgICAgICAgIGphdmEudXRpbC5JdGVyYXRvciBpdGVyID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgT2JqZWN0TmFtZSBhcnJheVtdID0gbmV3IE9iamVjdE5hbWVbbWFwLnNpemUoKV07CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBJRGF0YVNlbmRlciBzZW5kZXIgPSAoSURhdGFTZW5kZXIpICgoamF2YS51dGlsLk1hcC5FbnRyeSkgaXRlcgorICAgICAgICAgICAgICAgICAgICAubmV4dCgpKS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKHNlbmRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGFycmF5W2ldID0gZ2V0U2VuZGVyT2JqZWN0TmFtZShzZW5kZXIpOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhcnJheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldCBzZW5kZXIgc3RhdGlzdGljcworICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldFN0YXRpc3RpY3MoKSB7CisgICAgICAgIG5yT2ZSZXF1ZXN0cyA9IDA7CisgICAgICAgIHRvdGFsQnl0ZXMgPSAwOworICAgICAgICBmYWlsdXJlQ291bnRlciA9IDA7CisgICAgICAgIHByb2Nlc3NpbmdUaW1lID0gMDsKKyAgICAgICAgbWluUHJvY2Vzc2luZ1RpbWUgPSBMb25nLk1BWF9WQUxVRTsKKyAgICAgICAgbWF4UHJvY2Vzc2luZ1RpbWUgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBuZXcgY2x1c3RlciBtZW1iZXIgYW5kIGNyZWF0ZSBzZW5kZXIgKCBzLiByZXBsaWNhdGlvbk1vZGUpIHRyYW5zZmVyCisgICAgICogY3VycmVudCBwcm9wZXJ0aWVzIHRvIHNlbmRlcgorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJTZW5kZXIjYWRkKG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXIpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0S2V5KG1lbWJlcik7CisgICAgICAgICAgICBpZiAoIW1hcC5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAgICAgSURhdGFTZW5kZXIgc2VuZGVyID0gSURhdGFTZW5kZXJGYWN0b3J5LmdldElEYXRhU2VuZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGljYXRpb25Nb2RlLCBtZW1iZXIpOworICAgICAgICAgICAgICAgIHRyYW5zZmVyU2VuZGVyUHJvcGVydHkoc2VuZGVyKTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KGtleSwgc2VuZGVyKTsKKyAgICAgICAgICAgICAgICByZWdpc3RlclNlbmRlck1CZWFuKG1lbWJlciwgc2VuZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgYW5kIGFkZCBhIElEYXRhU2VuZGVyIG9iamVjdC4iLCB4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZSBzZW5kZXIgZnJvbSB0cmFuc21pdHRlci4gKCBkZXJlZ2lzdGVyIG1iZWFuIGFuZCBkaXNjb25uZWN0IHNlbmRlciApCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclNlbmRlciNyZW1vdmUob3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgU3RyaW5nIGtleSA9IGdldEtleShtZW1iZXIpOworICAgICAgICBJRGF0YVNlbmRlciB0b2JlcmVtb3ZlZCA9IChJRGF0YVNlbmRlcikgbWFwLmdldChrZXkpOworICAgICAgICBpZiAodG9iZXJlbW92ZWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdW5yZWdpc3RlclNlbmRlck1CZWFuKHRvYmVyZW1vdmVkKTsKKyAgICAgICAgdG9iZXJlbW92ZWQuZGlzY29ubmVjdCgpOworICAgICAgICBtYXAucmVtb3ZlKGtleSk7CisKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3RlY3RlZAorCisgICAgLyoqCisgICAgICogY2FsYyBudW1iZXIgb2YgcmVxdWVzdHMgYW5kIHRyYW5zZmVyZWQgYnl0ZXMuIExvZyBzdGF0cyBhbGwgMTAwIHJlcXVldHMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbGVuZ3RoCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGFkZFN0YXRzKGludCBsZW5ndGgpIHsKKyAgICAgICAgbnJPZlJlcXVlc3RzKys7CisgICAgICAgIHRvdGFsQnl0ZXMgKz0gbGVuZ3RoOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgJiYgKG5yT2ZSZXF1ZXN0cyAlIDEwMCkgPT0gMCkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJOciBvZiBieXRlcyBzZW50PSIgKyB0b3RhbEJ5dGVzICsgIiBvdmVyICIKKyAgICAgICAgICAgICAgICAgICAgKyBuck9mUmVxdWVzdHMgKyAiOyBhdmc9IiArICh0b3RhbEJ5dGVzIC8gbnJPZlJlcXVlc3RzKQorICAgICAgICAgICAgICAgICAgICArICIgYnl0ZXMvcmVxdWVzdDsgZmFpbHVyZXM9IiArIGZhaWx1cmVDb3VudGVyKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmZXIgYWxsIHByb3BlcnRpZXMgZnJvbSB0cmFuc21pdHRlciB0byBjb25jcmV0ZSBzZW5kZXIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VuZGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdHJhbnNmZXJTZW5kZXJQcm9wZXJ0eShJRGF0YVNlbmRlciBzZW5kZXIpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UHJvcGVydHlOYW1lcygpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBwa2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRQcm9wZXJ0eShwa2V5KTsKKyAgICAgICAgICAgIEludHJvc3BlY3Rpb25VdGlscy5zZXRQcm9wZXJ0eShzZW5kZXIsIHBrZXksIHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IHVuaXF1ZSBrZXkgdG8gZmluZCBzZW5kZXIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVtYmVyCisgICAgICogQHJldHVybiBjb25jYXQgbWVtYmVyLmhvc3Q6bWVtYmVyLnBvcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEtleShNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIHJldHVybiBtZW1iZXIuZ2V0SG9zdCgpICsgIjoiICsgbWVtYmVyLmdldFBvcnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB1bnJlZ3Npc3RlciBzZW5kZXJuIE1iZWFuCisgICAgICogCisgICAgICogQHNlZSAjZ2V0U2VuZGVyT2JqZWN0TmFtZShJRGF0YVNlbmRlcikKKyAgICAgKiBAcGFyYW0gc2VuZGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdW5yZWdpc3RlclNlbmRlck1CZWFuKElEYXRhU2VuZGVyIHNlbmRlcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IGNsdXN0ZXIuZ2V0TUJlYW5TZXJ2ZXIoKTsKKyAgICAgICAgICAgIGlmIChtc2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihnZXRTZW5kZXJPYmplY3ROYW1lKHNlbmRlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLndhcm4oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWdpc3RlciBNQmVhbiBhbmQgY2hlY2sgaXQgZXhpc3QgKGJpZyBwcm9ibGVtISkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVtYmVyCisgICAgICogQHBhcmFtIHNlbmRlcgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyU2VuZGVyTUJlYW4oTWVtYmVyIG1lbWJlciwgSURhdGFTZW5kZXIgc2VuZGVyKSB7CisgICAgICAgIGlmIChtZW1iZXIgIT0gbnVsbCAmJiBjbHVzdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IGNsdXN0ZXIuZ2V0TUJlYW5TZXJ2ZXIoKTsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIHNlbmRlck5hbWUgPSBnZXRTZW5kZXJPYmplY3ROYW1lKHNlbmRlcik7CisgICAgICAgICAgICAgICAgaWYgKG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKHNlbmRlck5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2x1c3Rlci5tYmVhbi5yZWdpc3Rlci5hbHJlYWR5Iiwgc2VuZGVyTmFtZSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihjbHVzdGVyLmdldE1hbmFnZWRCZWFuKHNlbmRlciksCisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXJOYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLndhcm4oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBidWlsZCBzZW5kZXIgT2JqZWN0TmFtZSAoCisgICAgICogZW5naW5lLmRvbWFpbjp0eXBlPUlEYXRhU2VuZGVyLGhvc3Q9Imhvc3QiLHNlbmRlckFkZHJlc3M9InJlY2VpdmVyLmFkZHJlc3MiLHNlbmRlclBvcnQ9InBvcnQiICkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VuZGVyCisgICAgICogQHJldHVybiBUaGUgc2VuZGVyIG9iamVjdCBuYW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdE5hbWUgZ2V0U2VuZGVyT2JqZWN0TmFtZShJRGF0YVNlbmRlciBzZW5kZXIpIHsKKyAgICAgICAgT2JqZWN0TmFtZSBzZW5kZXJOYW1lID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgY2x1c3Rlck5hbWUgPSBjbHVzdGVyLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBjbHVzdGVyLmdldENvbnRhaW5lcigpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjbHVzdGVyTmFtZS5nZXREb21haW4oKSArICI6dHlwZT1JRGF0YVNlbmRlciI7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU3RhbmRhcmRIb3N0KSB7CisgICAgICAgICAgICAgICAgbmFtZSArPSAiLGhvc3Q9IiArIGNsdXN0ZXJOYW1lLmdldEtleVByb3BlcnR5KCJob3N0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZW5kZXJOYW1lID0gbmV3IE9iamVjdE5hbWUobmFtZSArICIsc2VuZGVyQWRkcmVzcz0iCisgICAgICAgICAgICAgICAgICAgICsgc2VuZGVyLmdldEFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpICsgIixzZW5kZXJQb3J0PSIKKyAgICAgICAgICAgICAgICAgICAgKyBzZW5kZXIuZ2V0UG9ydCgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy53YXJuKGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzZW5kZXJOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNlcmlhbGl6ZSBtZXNzYWdlIGFuZCBhZGQgdGltZXN0YW1wIGZyb20gbWVzc2FnZQorICAgICAqIGhhbmRsZSBjb21wcmVzc2lvbgorICAgICAqIEBzZWUgR1pJUE91dHB1dFN0cmVhbQorICAgICAqIEBwYXJhbSBtc2cgY2x1c3RlciBtZXNzYWdlCisgICAgICogQHJldHVybiBjbHVzdGVyIG1lc3NhZ2UgYXMgYnl0ZSBhcnJheQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAc2luY2UgNS41LjEwCisgICAgICovCisgICAgcHJvdGVjdGVkIENsdXN0ZXJEYXRhIHNlcmlhbGl6ZShDbHVzdGVyTWVzc2FnZSBtc2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG1zZy5zZXRUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dDsKKyAgICAgICAgR1pJUE91dHB1dFN0cmVhbSBnb3V0ID0gbnVsbDsKKyAgICAgICAgQ2x1c3RlckRhdGEgZGF0YSA9IG5ldyBDbHVzdGVyRGF0YSgpOworICAgICAgICBkYXRhLnNldFR5cGUobXNnLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgZGF0YS5zZXRVbmlxdWVJZChtc2cuZ2V0VW5pcXVlSWQoKSk7CisgICAgICAgIGRhdGEuc2V0VGltZXN0YW1wKG1zZy5nZXRUaW1lc3RhbXAoKSk7CisgICAgICAgIGRhdGEuc2V0Q29tcHJlc3MobXNnLmdldENvbXByZXNzKCkpOworICAgICAgICBkYXRhLnNldFJlc2VuZChtc2cuZ2V0UmVzZW5kKCkpOworICAgICAgICAvLyBGSVhNRSBhZGQgc3RhdHM6IEhvdyBtdWNoIGNvbXJlc3MgYW5kIHVuY29tcHJlc3MgbWVzc2FnZXMgYW5kIGJ5dGVzIGFyZSB0cmFuc2ZlcmVkCisgICAgICAgIGlmICgoaXNDb21wcmVzcygpICYmIG1zZy5nZXRDb21wcmVzcygpICE9IENsdXN0ZXJNZXNzYWdlLkZMQUdfRk9SQklEREVOKQorICAgICAgICAgICAgICAgIHx8IG1zZy5nZXRDb21wcmVzcygpID09IENsdXN0ZXJNZXNzYWdlLkZMQUdfQUxMT1dFRCkgeworICAgICAgICAgICAgZ291dCA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKG91dHMpOworICAgICAgICAgICAgb3V0ID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShnb3V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0cyk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LndyaXRlT2JqZWN0KG1zZyk7CisgICAgICAgIC8vIGZsdXNoIG91dCB0aGUgZ3ppcCBzdHJlYW0gdG8gYnl0ZSBidWZmZXIKKyAgICAgICAgaWYoZ291dCAhPSBudWxsKSB7CisgICAgICAgICAgICBnb3V0LmZsdXNoKCk7CisgICAgICAgICAgICBnb3V0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS5zZXRNZXNzYWdlKG91dHMudG9CeXRlQXJyYXkoKSk7CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKyAKKworICAgIC8qKgorICAgICAqIFNlbmQgbWVzc2FnZSB0byBjb25jcmV0ZSBzZW5kZXIuIElmIGF1dG9Db25uZWN0IGlzIHRydWUsIGNoZWNrIGlzCisgICAgICogY29ubmVjdGlvbiBicm9rZW4gYW5kIHRoZSByZWNvbm5lY3QgdGhlIGNvbXBsZXRlIHNlbmRlci4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPmZhaWx1cmUgdGhlIHN1c3BlY3QgZmxhZyBpcyBzZXQgdHJ1ZS4gQWZ0ZXIgc3VjY2Vzc2Z1bGx5IHNlbmRpbmcgdGhlCisgICAgICogc3VzcGVjdCBmbGFnIGlzIHNldCB0byBmYWxzZS48L2xpPgorICAgICAqIDxsaT5TdGF0cyBpcyBvbmx5IHVwZGF0ZSBhZnRlciBzdXNzZXNmdWxsIHNlbmRpbmc8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogCisgICAgICogQHBhcmFtIGRhdGEgbWVzc2FnZSBEYXRhCisgICAgICogQHBhcmFtIHNlbmRlciBjb25jcmV0ZSBtZXNzYWdlIHNlbmRlcgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBnb3Qgc2VudCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHNlbmRNZXNzYWdlRGF0YShDbHVzdGVyRGF0YSBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGF0YVNlbmRlciBzZW5kZXIpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNlbmRlciA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oIlNlbmRlciBub3QgYXZhaWxhYmxlLiBNYWtlIHN1cmUgc2VuZGVyIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSB0byB0aGUgUmVwbGljYXRpb25UcmFuc21pdHRlci4iKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGRlcHJlY2F0ZWQgbm90IG5lZWRlZCBEYXRhU2VuZGVyI3B1c2hNZXNzYWdlIGNhbiBoYW5kbGUgY29ubmVjdGlvbgorICAgICAgICAgICAgaWYgKGF1dG9Db25uZWN0KSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKHNlbmRlcikgeworICAgICAgICAgICAgICAgICAgICBpZighc2VuZGVyLmlzQ29ubmVjdGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIuY29ubmVjdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlbmRlci5zZW5kTWVzc2FnZShkYXRhKTsKKyAgICAgICAgICAgIHNlbmRlci5zZXRTdXNwZWN0KGZhbHNlKTsKKyAgICAgICAgICAgIGFkZFN0YXRzKGRhdGEuZ2V0TWVzc2FnZSgpLmxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGlmICghc2VuZGVyLmdldFN1c3BlY3QoKSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSApIGxvZy5lcnJvcigiVW5hYmxlIHRvIHNlbmQgcmVwbGljYXRlZCBtZXNzYWdlLCBpcyBtZW1iZXIgWyIrc2VuZGVyLnRvU3RyaW5nKCkrIl0gZG93bj8iLHgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVuYWJsZSB0byBzZW5kIHJlcGxpY2F0ZWQgbWVzc2FnZSwgaXMgbWVtYmVyIFsiK3NlbmRlci50b1N0cmluZygpKyJdIGRvd24/Iix4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlbmRlci5zZXRTdXNwZWN0KHRydWUpOworICAgICAgICAgICAgZmFpbHVyZUNvdW50ZXIrKzsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgfQorICAgIC8qKgorICAgICAqIEFkZCBwcm9jZXNzaW5nIHN0YXRzIHRpbWVzCisgICAgICogQHBhcmFtIHN0YXJ0VGltZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb2Nlc3NpbmdTdGF0cyhsb25nIHN0YXJ0VGltZSkgeworICAgICAgICBsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSA7CisgICAgICAgIGlmKHRpbWUgPCBtaW5Qcm9jZXNzaW5nVGltZSkKKyAgICAgICAgICAgIG1pblByb2Nlc3NpbmdUaW1lID0gdGltZSA7CisgICAgICAgIGlmKCB0aW1lID4gbWF4UHJvY2Vzc2luZ1RpbWUpCisgICAgICAgICAgICBtYXhQcm9jZXNzaW5nVGltZSA9IHRpbWUgOworICAgICAgICBwcm9jZXNzaW5nVGltZSArPSB0aW1lIDsKKyAgICB9CisgCisgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1JlcGxpY2F0aW9uVmFsdmUuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvUmVwbGljYXRpb25WYWx2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTM0YmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1JlcGxpY2F0aW9uVmFsdmUuamF2YQpAQCAtMCwwICsxLDY2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DYXRhbGluYUNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJWYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5EZWx0YU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uRGVsdGFTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuVmFsdmVCYXNlOworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIGEgVmFsdmUgdGhhdCBsb2dzIGludGVyZXN0aW5nIGNvbnRlbnRzIGZyb20gdGhlCisgKiBzcGVjaWZpZWQgUmVxdWVzdCAoYmVmb3JlIHByb2Nlc3NpbmcpIGFuZCB0aGUgY29ycmVzcG9uZGluZyBSZXNwb25zZQorICogKGFmdGVyIHByb2Nlc3NpbmcpLiAgSXQgaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4gZGVidWdnaW5nIHByb2JsZW1zCisgKiByZWxhdGVkIHRvIGhlYWRlcnMgYW5kIGNvb2tpZXMuPC9wPgorICoKKyAqIDxwPlRoaXMgVmFsdmUgbWF5IGJlIGF0dGFjaGVkIHRvIGFueSBDb250YWluZXIsIGRlcGVuZGluZyBvbiB0aGUgZ3JhbnVsYXJpdHkKKyAqIG9mIHRoZSBsb2dnaW5nIHlvdSB3aXNoIHRvIHBlcmZvcm0uPC9wPgorICoKKyAqIDxwPnByaW1hcnlJbmRpY2F0b3I9dHJ1ZSwgdGhlbiB0aGUgcmVxdWVzdCBhdHRyaWJ1dGUgPGk+b3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5pc1ByaW1hcnlTZXNzaW9uLjwvaT4KKyAqIGlzIHNldCB0cnVlLCB3aGVuIHJlcXVlc3QgcHJvY2Vzc2luZyBpcyBhdCBzZXNzaW9ucyBwcmltYXJ5IG5vZGUuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXBsaWNhdGlvblZhbHZlCisgICAgZXh0ZW5kcyBWYWx2ZUJhc2UgaW1wbGVtZW50cyBDbHVzdGVyVmFsdmUgeworICAgIAorICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggUmVwbGljYXRpb25WYWx2ZS5jbGFzcyApOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25WYWx2ZS8yLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgU3RyaW5nTWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICBwcml2YXRlIENhdGFsaW5hQ2x1c3RlciBjbHVzdGVyID0gbnVsbCA7CisKKyAgICAvKioKKyAgICAgKiBob2xkcyBmaWxlIGVuZGluZ3MgdG8gbm90IGNhbGwgZm9yIGxpa2UgaW1hZ2VzIGFuZCBvdGhlcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5bXSByZXFGaWx0ZXJzID0gbmV3IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuWzBdOworICAgIAorICAgIC8qKgorICAgICAqIE9yZ2luYWwgZmlsdGVyIAorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZmlsdGVyIDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBjcm9zc0NvbnRleHQgc2Vzc2lvbiBjb250YWluZXIgCisgICAgICovCisgICAgcHJvdGVjdGVkIFRocmVhZExvY2FsIGNyb3NzQ29udGV4dFNlc3Npb25zID0gbmV3IFRocmVhZExvY2FsKCkgOworICAgIAorICAgIC8qKgorICAgICAqIGRvUHJvY2Vzc2luZ1N0YXRzIChkZWZhdWx0ID0gb2ZmKQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGRvUHJvY2Vzc2luZ1N0YXRzID0gZmFsc2U7CisgICAgCisgICAgcHJvdGVjdGVkIGxvbmcgdG90YWxSZXF1ZXN0VGltZSA9IDA7CisgICAgcHJvdGVjdGVkIGxvbmcgdG90YWxTZW5kVGltZSA9IDA7CisgICAgcHJvdGVjdGVkIGxvbmcgbnJPZlJlcXVlc3RzID0gMDsKKyAgICBwcm90ZWN0ZWQgbG9uZyBsYXN0U2VuZFRpbWUgPSAwOworICAgIHByb3RlY3RlZCBsb25nIG5yT2ZGaWx0ZXJSZXF1ZXN0cyA9IDA7CisgICAgcHJvdGVjdGVkIGxvbmcgbnJPZlNlbmRSZXF1ZXN0cyA9IDA7CisgICAgcHJvdGVjdGVkIGxvbmcgbnJPZkNyb3NzQ29udGV4dFNlbmRSZXF1ZXN0cyA9IDA7CisgICAgCisgICAgLyoqCisgICAgICogbXVzdCBwcmltYXJ5IGNoYW5nZSBpbmRpY2F0b3Igc2V0IAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHByaW1hcnlJbmRpY2F0b3IgPSBmYWxzZSA7CisgICAgCisgICAgLyoqCisgICAgICogTmFtZSBvZiBwcmltYXJ5IGNoYW5nZSBpbmRpY2F0b3IgYXMgcmVxdWVzdCBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByaW1hcnlJbmRpY2F0b3JOYW1lID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuaXNQcmltYXJ5U2Vzc2lvbiI7CisgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIHB1YmxpYyBSZXBsaWNhdGlvblZhbHZlKCkgeworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBWYWx2ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsdXN0ZXIuCisgICAgICovCisgICAgcHVibGljIENhdGFsaW5hQ2x1c3RlciBnZXRDbHVzdGVyKCkgeworICAgICAgICByZXR1cm4gY2x1c3RlcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIGNsdXN0ZXIgVGhlIGNsdXN0ZXIgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXIoQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIpIHsKKyAgICAgICAgdGhpcy5jbHVzdGVyID0gY2x1c3RlcjsKKyAgICB9CisgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmaWx0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbHRlcigpIHsKKyAgICAgICByZXR1cm4gZmlsdGVyIDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb21waWxlIGZpbHRlciBzdHJpbmcgdG8gcmVndWxhciBleHByZXNzaW9ucworICAgICAqIEBzZWUgUGF0dGVybiNjb21waWxlKGphdmEubGFuZy5TdHJpbmcpCisgICAgICogQHBhcmFtIGZpbHRlcgorICAgICAqICAgICAgICAgICAgVGhlIGZpbHRlciB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyKFN0cmluZyBmaWx0ZXIpIHsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiUmVwbGljYXRpb25WYWx2ZS5maWx0ZXIubG9hZGluZyIsIGZpbHRlcikpOworICAgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHQgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZpbHRlciwgIjsiKTsKKyAgICAgICAgdGhpcy5yZXFGaWx0ZXJzID0gbmV3IFBhdHRlcm5bdC5jb3VudFRva2VucygpXTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAodC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cudHJhY2Uoc20uZ2V0U3RyaW5nKCJSZXBsaWNhdGlvblZhbHZlLmZpbHRlci50b2tlbiIsIHMpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVxRmlsdGVyc1tpKytdID0gUGF0dGVybi5jb21waWxlKHMpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJSZXBsaWNhdGlvblZhbHZlLmZpbHRlci50b2tlbi5mYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHMpLCB4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJpbWFyeUluZGljYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnlJbmRpY2F0b3IoKSB7CisgICAgICAgIHJldHVybiBwcmltYXJ5SW5kaWNhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwcmltYXJ5SW5kaWNhdG9yIFRoZSBwcmltYXJ5SW5kaWNhdG9yIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5SW5kaWNhdG9yKGJvb2xlYW4gcHJpbWFyeUluZGljYXRvcikgeworICAgICAgICB0aGlzLnByaW1hcnlJbmRpY2F0b3IgPSBwcmltYXJ5SW5kaWNhdG9yOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByaW1hcnlJbmRpY2F0b3JOYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUluZGljYXRvck5hbWUoKSB7CisgICAgICAgIHJldHVybiBwcmltYXJ5SW5kaWNhdG9yTmFtZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIHByaW1hcnlJbmRpY2F0b3JOYW1lIFRoZSBwcmltYXJ5SW5kaWNhdG9yTmFtZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeUluZGljYXRvck5hbWUoU3RyaW5nIHByaW1hcnlJbmRpY2F0b3JOYW1lKSB7CisgICAgICAgIHRoaXMucHJpbWFyeUluZGljYXRvck5hbWUgPSBwcmltYXJ5SW5kaWNhdG9yTmFtZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsYyBwcm9jZXNzaW5nIHN0YXRzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEb1Byb2Nlc3NpbmdTdGF0cygpIHsKKyAgICAgICAgcmV0dXJuIGRvUHJvY2Vzc2luZ1N0YXRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBDYWxjIHByb2Nlc3Npbmcgc3RhdHMKKyAgICAgKiBAc2VlICNyZXNldFN0YXRpc3RpY3MoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvUHJvY2Vzc2luZ1N0YXRzKGJvb2xlYW4gZG9Qcm9jZXNzaW5nU3RhdHMpIHsKKyAgICAgICAgdGhpcy5kb1Byb2Nlc3NpbmdTdGF0cyA9IGRvUHJvY2Vzc2luZ1N0YXRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGFzdFNlbmRUaW1lLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldExhc3RTZW5kVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIGxhc3RTZW5kVGltZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuck9mUmVxdWVzdHMuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TnJPZlJlcXVlc3RzKCkgeworICAgICAgICByZXR1cm4gbnJPZlJlcXVlc3RzOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5yT2ZGaWx0ZXJSZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXROck9mRmlsdGVyUmVxdWVzdHMoKSB7CisgICAgICAgIHJldHVybiBuck9mRmlsdGVyUmVxdWVzdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuck9mQ3Jvc3NDb250ZXh0U2VuZFJlcXVlc3RzLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldE5yT2ZDcm9zc0NvbnRleHRTZW5kUmVxdWVzdHMoKSB7CisgICAgICAgIHJldHVybiBuck9mQ3Jvc3NDb250ZXh0U2VuZFJlcXVlc3RzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbnJPZlNlbmRSZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXROck9mU2VuZFJlcXVlc3RzKCkgeworICAgICAgICByZXR1cm4gbnJPZlNlbmRSZXF1ZXN0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRvdGFsUmVxdWVzdFRpbWUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0VG90YWxSZXF1ZXN0VGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHRvdGFsUmVxdWVzdFRpbWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdG90YWxTZW5kVGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbFNlbmRUaW1lKCkgeworICAgICAgICByZXR1cm4gdG90YWxTZW5kVGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlcUZpbHRlcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuW10gZ2V0UmVxRmlsdGVycygpIHsKKyAgICAgICAgcmV0dXJuIHJlcUZpbHRlcnM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSByZXFGaWx0ZXJzIFRoZSByZXFGaWx0ZXJzIHRvIHNldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSZXFGaWx0ZXJzKGphdmEudXRpbC5yZWdleC5QYXR0ZXJuW10gcmVxRmlsdGVycykgeworICAgICAgICB0aGlzLnJlcUZpbHRlcnMgPSByZXFGaWx0ZXJzOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhbGwgY3Jvc3MgY29udGV4dCBzZXNzaW9ucyBpbnNpZGUgZW5kQWNjZXNzLgorICAgICAqIFVzZSBhIGxpc3Qgd2l0aCBjb250YWlucyBjaGVjaywgdGhhdCB0aGUgUG9ydGxldCBBUEkgY2FuIGluY2x1ZGUgYSBsb3Qgb2YgZnJhZ21lbnRzIGZyb20gc2FtZSBvcgorICAgICAqIGRpZmZlcmVudCBhcHBsaWNhdGlvbnMgd2l0aCBzZXNzaW9uIGNoYW5nZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiBjcm9zcyBjb250ZXh0IHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlclJlcGxpY2F0aW9uU2Vzc2lvbihEZWx0YVNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICBMaXN0IHNlc3Npb25zID0gKExpc3QpY3Jvc3NDb250ZXh0U2Vzc2lvbnMuZ2V0KCk7CisgICAgICAgIGlmKHNlc3Npb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmKCFzZXNzaW9ucy5jb250YWlucyhzZXNzaW9uKSkgeworICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJSZXBsaWNhdGlvblZhbHZlLmNyb3NzQ29udGV4dC5yZWdpc3RlclNlc3Npb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJZEludGVybmFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldE1hbmFnZXIoKS5nZXRDb250YWluZXIoKS5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICBzZXNzaW9ucy5hZGQoc2Vzc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2cgdGhlIGludGVyZXN0aW5nIHJlcXVlc3QgcGFyYW1ldGVycywgaW52b2tlIHRoZSBuZXh0IFZhbHZlIGluIHRoZQorICAgICAqIHNlcXVlbmNlLCBhbmQgbG9nIHRoZSBpbnRlcmVzdGluZyByZXNwb25zZSBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2UgdG8gYmUgY3JlYXRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZva2UoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIHRvdGFsc3RhcnQgPSAwOworCisgICAgICAgIC8vdGhpcyBoYXBwZW5zIGJlZm9yZSB0aGUgcmVxdWVzdAorICAgICAgICBpZihpc0RvUHJvY2Vzc2luZ1N0YXRzKCkpIHsKKyAgICAgICAgICAgIHRvdGFsc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJpbWFyeUluZGljYXRvcikgeworICAgICAgICAgICAgY3JlYXRlUHJpbWFyeUluZGljYXRvcihyZXF1ZXN0KSA7CisgICAgICAgIH0KKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRDb250ZXh0KCk7CisgICAgICAgIGJvb2xlYW4gaXNDcm9zc0NvbnRleHQgPSBjb250ZXh0ICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBjb250ZXh0IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0CisgICAgICAgICAgICAgICAgJiYgKChTdGFuZGFyZENvbnRleHQpIGNvbnRleHQpLmdldENyb3NzQ29udGV4dCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYoaXNDcm9zc0NvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiUmVwbGljYXRpb25WYWx2ZS5jcm9zc0NvbnRleHQuYWRkIikpOworICAgICAgICAgICAgICAgIC8vRklYTUUgYWRkIFBvb2wgb2YgQXJyYXlsaXN0cworICAgICAgICAgICAgICAgIGNyb3NzQ29udGV4dFNlc3Npb25zLnNldChuZXcgQXJyYXlMaXN0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2V0TmV4dCgpLmludm9rZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICBNYW5hZ2VyIG1hbmFnZXIgPSByZXF1ZXN0LmdldENvbnRleHQoKS5nZXRNYW5hZ2VyKCk7CisgICAgICAgICAgICBpZiAobWFuYWdlciAhPSBudWxsICYmIG1hbmFnZXIgaW5zdGFuY2VvZiBDbHVzdGVyTWFuYWdlcikgeworICAgICAgICAgICAgICAgIENsdXN0ZXJNYW5hZ2VyIGNsdXN0ZXJNYW5hZ2VyID0gKENsdXN0ZXJNYW5hZ2VyKSBtYW5hZ2VyOworICAgICAgICAgICAgICAgIENhdGFsaW5hQ2x1c3RlciBjb250YWluZXJDbHVzdGVyID0gKENhdGFsaW5hQ2x1c3RlcikgZ2V0Q29udGFpbmVyKCkuZ2V0Q2x1c3RlcigpOworICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJDbHVzdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcoIlJlcGxpY2F0aW9uVmFsdmUubm9jbHVzdGVyIikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHZhbHZlIGNsdXN0ZXIgY2FuIGFjY2VzcyBtYW5hZ2VyIC0gb3RoZXIgY2x1c3RlciBoYW5kbGUgcmVwbGljYXRpb24gCisgICAgICAgICAgICAgICAgLy8gYXQgaG9zdCBsZXZlbCAtIGhvcGVmdWxseSEKKyAgICAgICAgICAgICAgICBpZihjb250YWluZXJDbHVzdGVyLmdldE1hbmFnZXIoY2x1c3Rlck1hbmFnZXIuZ2V0TmFtZSgpKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgIGlmKGNvbnRhaW5lckNsdXN0ZXIuaGFzTWVtYmVycygpKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRSZXBsaWNhdGlvbk1lc3NhZ2UocmVxdWVzdCwgdG90YWxzdGFydCwgaXNDcm9zc0NvbnRleHQsIGNsdXN0ZXJNYW5hZ2VyLCBjb250YWluZXJDbHVzdGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXNldFJlcGxpY2F0aW9uUmVxdWVzdChyZXF1ZXN0LGlzQ3Jvc3NDb250ZXh0KTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIEFycmF5IG11c3QgYmUgcmVtb3ZlOiBDdXJyZW50IG1hc3RlciByZXF1ZXN0IHNlbmQgZW5kQWNjZXNzIGF0IHJlY3ljbGUuIAorICAgICAgICAgICAgLy8gRG9uJ3QgcmVnaXN0ZXIgdGhpcyByZXF1ZXN0IHNlc3Npb24gYWdhaW4hCisgICAgICAgICAgICBpZihpc0Nyb3NzQ29udGV4dCkgeworICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJSZXBsaWNhdGlvblZhbHZlLmNyb3NzQ29udGV4dC5yZW1vdmUiKSk7CisgICAgICAgICAgICAgICAgLy8gY3Jvc3NDb250ZXh0U2Vzc2lvbnMucmVtb3ZlKCkgb25seSBleGlzdCBhdCBKYXZhIDUKKyAgICAgICAgICAgICAgICAvLyByZWdpc3RlciBBcnJheUxpc3QgYXQgYSBwb29sCisgICAgICAgICAgICAgICAgY3Jvc3NDb250ZXh0U2Vzc2lvbnMuc2V0KG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogcmVzZXQgdGhlIGFjdGl2ZSBzdGF0aXRpY3MgCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXRTdGF0aXN0aWNzKCkgeworICAgICAgICB0b3RhbFJlcXVlc3RUaW1lID0gMCA7CisgICAgICAgIHRvdGFsU2VuZFRpbWUgPSAwIDsKKyAgICAgICAgbGFzdFNlbmRUaW1lID0gMCA7CisgICAgICAgIG5yT2ZGaWx0ZXJSZXF1ZXN0cyA9IDAgOworICAgICAgICBuck9mUmVxdWVzdHMgPSAwIDsKKyAgICAgICAgbnJPZlNlbmRSZXF1ZXN0cyA9IDA7CisgICAgICAgIG5yT2ZDcm9zc0NvbnRleHRTZW5kUmVxdWVzdHMgPSAwOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVuZGVyaW5nIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiUmVwbGljYXRpb25WYWx2ZVsiKTsKKyAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKGNvbnRhaW5lci5nZXROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisgICAgLyoqCisgICAgICogQHBhcmFtIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gdG90YWxzdGFydAorICAgICAqIEBwYXJhbSBpc0Nyb3NzQ29udGV4dAorICAgICAqIEBwYXJhbSBjbHVzdGVyTWFuYWdlcgorICAgICAqIEBwYXJhbSBjb250YWluZXJDbHVzdGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2VuZFJlcGxpY2F0aW9uTWVzc2FnZShSZXF1ZXN0IHJlcXVlc3QsIGxvbmcgdG90YWxzdGFydCwgYm9vbGVhbiBpc0Nyb3NzQ29udGV4dCwgQ2x1c3Rlck1hbmFnZXIgY2x1c3Rlck1hbmFnZXIsIENhdGFsaW5hQ2x1c3RlciBjb250YWluZXJDbHVzdGVyKSB7CisgICAgICAgIC8vdGhpcyBoYXBwZW5zIGFmdGVyIHRoZSByZXF1ZXN0CisgICAgICAgIGxvbmcgc3RhcnQgPSAwOworICAgICAgICBpZihpc0RvUHJvY2Vzc2luZ1N0YXRzKCkpIHsKKyAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHNlbmQgaW52YWxpZCBzZXNzaW9ucworICAgICAgICAgICAgLy8gRGVsdGFNYW5hZ2VyIHJldHVybnMgU3RyaW5nWzBdCisgICAgICAgICAgICBpZiAoIShjbHVzdGVyTWFuYWdlciBpbnN0YW5jZW9mIERlbHRhTWFuYWdlcikpCisgICAgICAgICAgICAgICAgc2VuZEludmFsaWRTZXNzaW9ucyhjbHVzdGVyTWFuYWdlciwgY29udGFpbmVyQ2x1c3Rlcik7CisgICAgICAgICAgICAvLyBzZW5kIHJlcGxpY2F0aW9uCisgICAgICAgICAgICBzZW5kU2Vzc2lvblJlcGxpY2F0aW9uTWVzc2FnZShyZXF1ZXN0LCBjbHVzdGVyTWFuYWdlciwgY29udGFpbmVyQ2x1c3Rlcik7CisgICAgICAgICAgICBpZihpc0Nyb3NzQ29udGV4dCkKKyAgICAgICAgICAgICAgICBzZW5kQ3Jvc3NDb250ZXh0U2Vzc2lvbihjb250YWluZXJDbHVzdGVyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FIHdlIGhhdmUgYSBsb3Qgb2Ygc2VuZHMsIGJ1dCB0aGUgdHJvdWJsZSB3aXRoIG9uZSBub2RlIHN0b3BzIHRoZSBjb3JyZWN0IHJlcGxpY2F0aW9uIHRvIG90aGVyIG5vZGVzIQorICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiUmVwbGljYXRpb25WYWx2ZS5zZW5kLmZhaWx1cmUiKSwgeCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBGSVhNRSB0aGlzIHN0YXRzIHVwZGF0ZSBhcmUgbm90IGNoZWFwISEKKyAgICAgICAgICAgIGlmKGlzRG9Qcm9jZXNzaW5nU3RhdHMoKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXRzKHRvdGFsc3RhcnQsc3RhcnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBhbGwgY2hhbmdlZCBjcm9zcyBjb250ZXh0IHNlc3Npb25zIHRvIGJhY2t1cHMKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyQ2x1c3RlcgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlbmRDcm9zc0NvbnRleHRTZXNzaW9uKENhdGFsaW5hQ2x1c3RlciBjb250YWluZXJDbHVzdGVyKSB7CisgICAgICAgIE9iamVjdCBzZXNzaW9ucyA9IGNyb3NzQ29udGV4dFNlc3Npb25zLmdldCgpOworICAgICAgICBpZihzZXNzaW9ucyAhPSBudWxsICYmIHNlc3Npb25zIGluc3RhbmNlb2YgTGlzdAorICAgICAgICAgICAgICAgICYmICgoTGlzdClzZXNzaW9ucykuc2l6ZSgpID4wKSB7CisgICAgICAgICAgICBmb3IoSXRlcmF0b3IgaXRlciA9ICgoTGlzdClzZXNzaW9ucykuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCkgOykgeyAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSAoU2Vzc2lvbilpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiUmVwbGljYXRpb25WYWx2ZS5jcm9zc0NvbnRleHQuc2VuZERlbHRhIiwgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0TWFuYWdlcigpLmdldENvbnRhaW5lcigpLmdldE5hbWUoKSApKTsKKyAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShzZXNzaW9uLChDbHVzdGVyTWFuYWdlcilzZXNzaW9uLmdldE1hbmFnZXIoKSxjb250YWluZXJDbHVzdGVyKTsKKyAgICAgICAgICAgICAgICBpZihpc0RvUHJvY2Vzc2luZ1N0YXRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbnJPZkNyb3NzQ29udGV4dFNlbmRSZXF1ZXN0cysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgCisgICAgLyoqCisgICAgICogRml4IG1lbW9yeSBsZWFrIGZvciBsb25nIHNlc3Npb25zIHdpdGggbWFueSBjaGFuZ2VzLCB3aGVuIG5vIGJhY2t1cCBtZW1iZXIgZXhpc3RzIQorICAgICAqIHNldCBwcmltYXJ5U2Vzc2lvbiBmbGFnIGF0IHJlcXVlc3Qgc2Vzc2lvbiBhbmQgYWxsIGNyb3NzQ29udGV4dCBzZXNzaW9ucworICAgICAqIEBzZWUgRGVsdGFNYW5hZ2VyI3JlcXVlc3RDb21wbGV0ZWQoU3RyaW5nKQorICAgICAqIEBwYXJhbSByZXF1ZXN0IGN1cnJlbnQgcmVxdWVzdCBhZnRlciByZXNwb25jZSBpcyBnZW5lcmF0ZWQKKyAgICAgKiBAcGFyYW0gaXNDcm9zc0NvbnRleHQgY2hlY2sgY3Jvc3Njb250ZXh0IHRocmVhZGxvY2FsCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVzZXRSZXBsaWNhdGlvblJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0LCBib29sZWFuIGlzQ3Jvc3NDb250ZXh0KSB7CisgICAgICAgIFNlc3Npb24gY29udGV4dFNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb25JbnRlcm5hbChmYWxzZSk7CisgICAgICAgIGlmKGNvbnRleHRTZXNzaW9uICE9IG51bGwgJiBjb250ZXh0U2Vzc2lvbiBpbnN0YW5jZW9mIERlbHRhU2Vzc2lvbil7CisgICAgICAgICAgICByZXNldERlbHRhUmVxdWVzdChjb250ZXh0U2Vzc2lvbik7CisgICAgICAgICAgICAoKERlbHRhU2Vzc2lvbiljb250ZXh0U2Vzc2lvbikuc2V0UHJpbWFyeVNlc3Npb24odHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYoaXNDcm9zc0NvbnRleHQpIHsKKyAgICAgICAgICAgIE9iamVjdCBzZXNzaW9ucyA9IGNyb3NzQ29udGV4dFNlc3Npb25zLmdldCgpOworICAgICAgICAgICAgaWYoc2Vzc2lvbnMgIT0gbnVsbCAmJiBzZXNzaW9ucyBpbnN0YW5jZW9mIExpc3QKKyAgICAgICAgICAgICAgICYmICgoTGlzdClzZXNzaW9ucykuc2l6ZSgpID4wKSB7CisgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9ICgoTGlzdClzZXNzaW9ucykuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICBmb3IoOyBpdGVyLmhhc05leHQoKSA7KSB7ICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSAoU2Vzc2lvbilpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzZXREZWx0YVJlcXVlc3Qoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIGlmKHNlc3Npb24gaW5zdGFuY2VvZiBEZWx0YVNlc3Npb24pCisgICAgICAgICAgICAgICAgICAgICAgICAoKERlbHRhU2Vzc2lvbiljb250ZXh0U2Vzc2lvbikuc2V0UHJpbWFyeVNlc3Npb24odHJ1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXQgRGVsdGFSZXF1ZXN0IGZyb20gc2Vzc2lvbgorICAgICAqIEBwYXJhbSBzZXNzaW9uIEh0dHBTZXNzaW9uIGZyb20gY3VycmVudCByZXF1ZXN0IG9yIGNyb3NzIGNvbnRleHQgc2Vzc2lvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0RGVsdGFSZXF1ZXN0KFNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiUmVwbGljYXRpb25WYWx2ZS5yZXNldERlbHRhUmVxdWVzdCIgLCAKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmdldE1hbmFnZXIoKS5nZXRDb250YWluZXIoKS5nZXROYW1lKCkgKSk7CisgICAgICAgIH0KKyAgICAgICAgKChEZWx0YVNlc3Npb24pc2Vzc2lvbikucmVzZXREZWx0YVJlcXVlc3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIENsdXN0ZXIgUmVwbGljYXRpb24gUmVxdWVzdAorICAgICAqIEBwYXJhbSByZXF1ZXN0IGN1cnJlbnQgcmVxdWVzdAorICAgICAqIEBwYXJhbSBtYW5hZ2VyIHNlc3Npb24gbWFuYWdlcgorICAgICAqIEBwYXJhbSBjbHVzdGVyIHJlcGxpY2F0aW9uIGNsdXN0ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kU2Vzc2lvblJlcGxpY2F0aW9uTWVzc2FnZShSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICBDbHVzdGVyTWFuYWdlciBtYW5hZ2VyLCBDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb25JbnRlcm5hbChmYWxzZSk7CisgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSByZXF1ZXN0LmdldERlY29kZWRSZXF1ZXN0VVJJKCk7CisgICAgICAgICAgICAvLyByZXF1ZXN0IHdpdGhvdXQgc2Vzc2lvbiBjaGFuZ2UKKyAgICAgICAgICAgIGlmICghaXNSZXF1ZXN0V2l0aG91dFNlc3Npb25DaGFuZ2UodXJpKSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiUmVwbGljYXRpb25WYWx2ZS5pbnZva2UudXJpIiwgdXJpKSk7CisgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2Uoc2Vzc2lvbixtYW5hZ2VyLGNsdXN0ZXIpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgaWYoaXNEb1Byb2Nlc3NpbmdTdGF0cygpKQorICAgICAgICAgICAgICAgICAgICBuck9mRmlsdGVyUmVxdWVzdHMrKzsKKyAgICAgICAgfQorCisgICAgfQorCisgICAvKioKKyAgICAqIFNlbmQgbWVzc2FnZSBkZWx0YSBtZXNzYWdlIGZyb20gcmVxdWVzdCBzZXNzaW9uIAorICAgICogQHBhcmFtIHJlcXVlc3QgY3VycmVudCByZXF1ZXN0CisgICAgKiBAcGFyYW0gbWFuYWdlciBzZXNzaW9uIG1hbmFnZXIKKyAgICAqIEBwYXJhbSBjbHVzdGVyIHJlcGxpY2F0aW9uIGNsdXN0ZXIKKyAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlbmRNZXNzYWdlKFNlc3Npb24gc2Vzc2lvbiwKKyAgICAgICAgICAgICBDbHVzdGVyTWFuYWdlciBtYW5hZ2VyLCBDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICBTdHJpbmcgaWQgPSBzZXNzaW9uLmdldElkSW50ZXJuYWwoKTsKKyAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNlbmQobWFuYWdlciwgY2x1c3RlciwgaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VuZCBtYW5hZ2VyIHJlcXVlc3RDb21wbGV0ZWQgbWVzc2FnZSB0byBjbHVzdGVyCisgICAgICogQHBhcmFtIG1hbmFnZXIgU2Vzc2lvbk1hbmFnZXIKKyAgICAgKiBAcGFyYW0gY2x1c3RlciByZXBsaWNhdGlvbiBjbHVzdGVyCisgICAgICogQHBhcmFtIHNlc3Npb25JZCBzZXNzaW9uaWQgZnJvbSB0aGUgbWFuYWdlcgorICAgICAqIEBzZWUgRGVsdGFNYW5hZ2VyI3JlcXVlc3RDb21wbGV0ZWQoU3RyaW5nKQorICAgICAqIEBzZWUgU2ltcGxlVGNwQ2x1c3RlciNzZW5kKENsdXN0ZXJNZXNzYWdlKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlbmQoQ2x1c3Rlck1hbmFnZXIgbWFuYWdlciwgQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIsIFN0cmluZyBzZXNzaW9uSWQpIHsKKyAgICAgICAgQ2x1c3Rlck1lc3NhZ2UgbXNnID0gbWFuYWdlci5yZXF1ZXN0Q29tcGxldGVkKHNlc3Npb25JZCk7CisgICAgICAgIGlmIChtc2cgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYobWFuYWdlci5pc1NlbmRDbHVzdGVyRG9tYWluT25seSgpKSB7CisgICAgICAgICAgICAgICAgY2x1c3Rlci5zZW5kQ2x1c3RlckRvbWFpbihtc2cpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbHVzdGVyLnNlbmQobXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGlzRG9Qcm9jZXNzaW5nU3RhdHMoKSkKKyAgICAgICAgICAgICAgICBuck9mU2VuZFJlcXVlc3RzKys7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogY2hlY2sgZm9yIHNlc3Npb24gaW52YWxpZGF0aW9ucworICAgICAqIEBwYXJhbSBtYW5hZ2VyCisgICAgICogQHBhcmFtIGNsdXN0ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kSW52YWxpZFNlc3Npb25zKENsdXN0ZXJNYW5hZ2VyIG1hbmFnZXIsIENhdGFsaW5hQ2x1c3RlciBjbHVzdGVyKSB7CisgICAgICAgIFN0cmluZ1tdIGludmFsaWRJZHM9bWFuYWdlci5nZXRJbnZhbGlkYXRlZFNlc3Npb25zKCk7CisgICAgICAgIGlmICggaW52YWxpZElkcy5sZW5ndGggPiAwICkgeworICAgICAgICAgICAgZm9yICggaW50IGk9MDtpPGludmFsaWRJZHMubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZChtYW5hZ2VyLGNsdXN0ZXIsaW52YWxpZElkc1tpXSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJSZXBsaWNhdGlvblZhbHZlLnNlbmQuaW52YWxpZC5mYWlsdXJlIixpbnZhbGlkSWRzW2ldKSx4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogaXMgcmVxdWVzdCB3aXRob3V0IHBvc3NpYmxlIHNlc3Npb24gY2hhbmdlCisgICAgICogQHBhcmFtIHVyaSBUaGUgcmVxdWVzdCB1cmkKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgbm8gc2Vzc2lvbiBjaGFuZ2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVlc3RXaXRob3V0U2Vzc2lvbkNoYW5nZShTdHJpbmcgdXJpKSB7CisKKyAgICAgICAgYm9vbGVhbiBmaWx0ZXJmb3VuZCA9IGZhbHNlOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyAoaSA8IHJlcUZpbHRlcnMubGVuZ3RoKSAmJiAoIWZpbHRlcmZvdW5kKTsgaSsrKSB7CisgICAgICAgICAgICBqYXZhLnV0aWwucmVnZXguTWF0Y2hlciBtYXRjaGVyID0gcmVxRmlsdGVyc1tpXS5tYXRjaGVyKHVyaSk7CisgICAgICAgICAgICBmaWx0ZXJmb3VuZCA9IG1hdGNoZXIubWF0Y2hlcygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWx0ZXJmb3VuZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwcm90b2NvbCBjbHVzdGVyIHJlcGxpY2F0aW9ucyBzdGF0cworICAgICAqIEBwYXJhbSByZXF1ZXN0VGltZQorICAgICAqIEBwYXJhbSBjbHVzdGVyVGltZQorICAgICAqLworICAgIHByb3RlY3RlZCAgdm9pZCB1cGRhdGVTdGF0cyhsb25nIHJlcXVlc3RUaW1lLCBsb25nIGNsdXN0ZXJUaW1lKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBsYXN0U2VuZFRpbWU9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICB0b3RhbFNlbmRUaW1lKz1sYXN0U2VuZFRpbWUgLSBjbHVzdGVyVGltZTsKKyAgICAgICAgICAgIHRvdGFsUmVxdWVzdFRpbWUrPWxhc3RTZW5kVGltZSAtIHJlcXVlc3RUaW1lOworICAgICAgICAgICAgbnJPZlJlcXVlc3RzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYobG9nLmlzSW5mb0VuYWJsZWQoKSkgeworICAgICAgICAgICAgaWYgKCAobnJPZlJlcXVlc3RzICUgMTAwKSA9PSAwICkgeworICAgICAgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoIlJlcGxpY2F0aW9uVmFsdmUuc3RhdHMiLAorICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKHRvdGFsUmVxdWVzdFRpbWUvbnJPZlJlcXVlc3RzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyh0b3RhbFNlbmRUaW1lL25yT2ZSZXF1ZXN0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcobnJPZlJlcXVlc3RzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyhuck9mU2VuZFJlcXVlc3RzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyhuck9mQ3Jvc3NDb250ZXh0U2VuZFJlcXVlc3RzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyhuck9mRmlsdGVyUmVxdWVzdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKHRvdGFsUmVxdWVzdFRpbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKHRvdGFsU2VuZFRpbWUpfSkpOworICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogTWFyayBSZXF1ZXN0IHRoYXQgcHJvY2Vzc2VkIGF0IHByaW1hcnkgbm9kZSB3aXRoIGF0dHJpYnV0ZQorICAgICAqIHByaW1hcnlJbmRpY2F0b3JOYW1lCisgICAgICogCisgICAgICogQHBhcmFtIHJlcXVlc3QKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJpbWFyeUluZGljYXRvcihSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBpZCA9IHJlcXVlc3QuZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCk7CisgICAgICAgIGlmICgoaWQgIT0gbnVsbCkgJiYgKGlkLmxlbmd0aCgpID4gMCkpIHsKKyAgICAgICAgICAgIE1hbmFnZXIgbWFuYWdlciA9IHJlcXVlc3QuZ2V0Q29udGV4dCgpLmdldE1hbmFnZXIoKTsKKyAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG1hbmFnZXIuZmluZFNlc3Npb24oaWQpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gaW5zdGFuY2VvZiBDbHVzdGVyU2Vzc2lvbikgeworICAgICAgICAgICAgICAgIENsdXN0ZXJTZXNzaW9uIGNzZXMgPSAoQ2x1c3RlclNlc3Npb24pIHNlc3Npb247CisgICAgICAgICAgICAgICAgaWYgKGNzZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBCb29sZWFuIGlzUHJpbWFyeSA9IG5ldyBCb29sZWFuKGNzZXMuaXNQcmltYXJ5U2Vzc2lvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcGxpY2F0aW9uVmFsdmUuc2Vzc2lvbi5pbmRpY2F0b3IiLCByZXF1ZXN0LmdldENvbnRleHQoKS5nZXROYW1lKCksaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlJbmRpY2F0b3JOYW1lLCBpc1ByaW1hcnkpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUocHJpbWFyeUluZGljYXRvck5hbWUsIGlzUHJpbWFyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcGxpY2F0aW9uVmFsdmUuc2Vzc2lvbi5mb3VuZCIsIHJlcXVlc3QuZ2V0Q29udGV4dCgpLmdldE5hbWUoKSxpZCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcGxpY2F0aW9uVmFsdmUuc2Vzc2lvbi5pbnZhbGlkIiwgcmVxdWVzdC5nZXRDb250ZXh0KCkuZ2V0TmFtZSgpLGlkKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvU2VuZE1lc3NhZ2VEYXRhLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1NlbmRNZXNzYWdlRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMmZlYjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1NlbmRNZXNzYWdlRGF0YS5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXI7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFNlbmRNZXNzYWdlRGF0YSB7CisKKyAgICBwcml2YXRlIE9iamVjdCBtZXNzYWdlIDsKKyAgICBwcml2YXRlIE1lbWJlciBkZXN0aW5hdGlvbiA7CisgICAgcHJpdmF0ZSBFeGNlcHRpb24gZXhjZXB0aW9uIDsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbgorICAgICAqIEBwYXJhbSBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VuZE1lc3NhZ2VEYXRhKE9iamVjdCBtZXNzYWdlLCBNZW1iZXIgZGVzdGluYXRpb24sCisgICAgICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKKyAgICAgICAgdGhpcy5leGNlcHRpb24gPSBleGNlcHRpb247CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVzdGluYXRpb24uCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBnZXREZXN0aW5hdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gVGhlIGRlc3RpbmF0aW9uIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvbihNZW1iZXIgZGVzdGluYXRpb24pIHsKKyAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb24oRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKE9iamVjdCBtZXNzYWdlKSB7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9TZW5kZXJTdGF0ZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9TZW5kZXJTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYzJiMTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1NlbmRlclN0YXRlLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcDsKKworCisvKioKKyAqIFNlbmQgY2x1c3RlciBtZXNzYWdlcyB3aXRoIGEgcG9vbCBvZiBzb2NrZXRzICgyNSkuCisgKiAKKyAqIEZJWE1FIHN1cHBvcnQgcHJvY2Vzc2luZyBzdGF0cworICogCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAxLjAKKyAqIEBzaW5jZSA1LjUuMTYKKyAqLworCitwdWJsaWMgY2xhc3MgU2VuZGVyU3RhdGUgeworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVVNQRUNUID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUlMSU5HID0gMjsKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJTZW5kZXJTdGF0ZS8xLjAiOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICBwcml2YXRlIGludCBzdGF0ZSA9IFJFQURZOworCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKyAgICAKKyAgICBwdWJsaWMgU2VuZGVyU3RhdGUoKSB7CisgICAgICAgIHRoaXMoUkVBRFkpOworICAgIH0KKworICAgIHB1YmxpYyBTZW5kZXJTdGF0ZShpbnQgc3RhdGUpIHsKKyAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N1c3BlY3QoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZSA9PSBTVVNQRUNUOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN1c3BlY3QoKSB7CisgICAgICAgIHN0YXRlID0gU1VTUEVDVDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkeSgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlID09IFJFQURZOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWFkeSgpIHsKKyAgICAgICAgc3RhdGUgPSBSRUFEWTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNGYWlsaW5nKCkgeworICAgICAgICByZXR1cm4gc3RhdGUgPT0gRkFJTElORzsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RmFpbGluZygpIHsKKyAgICAgICAgc3RhdGUgPSBGQUlMSU5HOworICAgIH0KKyAgICAKKworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgUHJvcGVydGllcworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1NpbXBsZVRjcENsdXN0ZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvU2ltcGxlVGNwQ2x1c3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNDA2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1NpbXBsZVRjcENsdXN0ZXIuamF2YQpAQCAtMCwwICsxLDE0MDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3A7CisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlU3VwcG9ydDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5tb2RlbG1iZWFuLk1vZGVsTUJlYW47CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2F0YWxpbmFDbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJSZWNlaXZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclNlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcnNoaXBMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVtYmVyc2hpcFNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lc3NhZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIubWNhc3QuTWNhc3RTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uLkNsdXN0ZXJTZXNzaW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uRGVsdGFNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci51dGlsLklEeW5hbWljUHJvcGVydHk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkxpZmVjeWNsZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuTWFuYWdlZEJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5JbnRyb3NwZWN0aW9uVXRpbHM7CisKKy8qKgorICogQSA8Yj5DbHVzdGVyIDwvYj4gaW1wbGVtZW50YXRpb24gdXNpbmcgc2ltcGxlIG11bHRpY2FzdC4gUmVzcG9uc2libGUgZm9yCisgKiBzZXR0aW5nIHVwIGEgY2x1c3RlciBhbmQgcHJvdmlkZXMgY2FsbGVycyB3aXRoIGEgdmFsaWQgbXVsdGljYXN0CisgKiByZWNlaXZlci9zZW5kZXIuCisgKiAKKyAqIEZJWE1FIHJlbW92ZSBpbnN0YWxsL3JlbW92ZS9zdGFydC9zdG9wIGNvbnRleHQgZHVtbXlzCisgKiBGSVhNRSB3cm90ZSB0ZXN0Y2FzZXMgCisgKiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlVGNwQ2x1c3RlciBpbXBsZW1lbnRzIENhdGFsaW5hQ2x1c3RlciwgTGlmZWN5Y2xlLAorICAgICAgICBNZW1iZXJzaGlwTGlzdGVuZXIsIExpZmVjeWNsZUxpc3RlbmVyLCBJRHluYW1pY1Byb3BlcnR5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNpbXBsZVRjcENsdXN0ZXIuY2xhc3MpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIlNpbXBsZVRjcENsdXN0ZXIvMi4yIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFRk9SRV9NRU1CRVJSRUdJU1RFUl9FVkVOVCA9ICJiZWZvcmVfbWVtYmVyX3JlZ2lzdGVyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFGVEVSX01FTUJFUlJFR0lTVEVSX0VWRU5UID0gImFmdGVyX21lbWJlcl9yZWdpc3RlciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUZPUkVfTUFOQUdFUlJFR0lTVEVSX0VWRU5UID0gImJlZm9yZV9tYW5hZ2VyX3JlZ2lzdGVyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFGVEVSX01BTkFHRVJSRUdJU1RFUl9FVkVOVCA9ICJhZnRlcl9tYW5hZ2VyX3JlZ2lzdGVyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFRk9SRV9NQU5BR0VSVU5SRUdJU1RFUl9FVkVOVCA9ICJiZWZvcmVfbWFuYWdlcl91bnJlZ2lzdGVyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFGVEVSX01BTkFHRVJVTlJFR0lTVEVSX0VWRU5UID0gImFmdGVyX21hbmFnZXJfdW5yZWdpc3RlciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUZPUkVfTUVNQkVSVU5SRUdJU1RFUl9FVkVOVCA9ICJiZWZvcmVfbWVtYmVyX3VucmVnaXN0ZXIiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUZURVJfTUVNQkVSVU5SRUdJU1RFUl9FVkVOVCA9ICJhZnRlcl9tZW1iZXJfdW5yZWdpc3RlciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRU5EX01FU1NBR0VfRkFJTFVSRV9FVkVOVCA9ICJzZW5kX21lc3NhZ2VfZmFpbHVyZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNFSVZFX01FU1NBR0VfRkFJTFVSRV9FVkVOVCA9ICJyZWNlaXZlX21lc3NhZ2VfZmFpbHVyZSI7CisKKyAgICAvKioKKyAgICAgKiB0aGUgc2VydmljZSB0aGF0IHByb3ZpZGVzIHRoZSBtZW1iZXJzaGlwCisgICAgICovCisgICAgcHJvdGVjdGVkIE1lbWJlcnNoaXBTZXJ2aWNlIG1lbWJlcnNoaXBTZXJ2aWNlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIE5hbWUgZm9yIGxvZ2dpbmcgcHVycG9zZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY2x1c3RlckltcE5hbWUgPSAiU2ltcGxlVGNwQ2x1c3RlciI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nTWFuYWdlciBzbSA9IFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2x1c3RlciBuYW1lIHRvIGpvaW4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNsdXN0ZXJOYW1lIDsKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ2x1c3Rlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisgICAgLyoqCisgICAgICogR2xvYmFsZSBNQmVhbiBTZXJ2ZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ3VycmVudCBDYXRhbGluYSBSZWdpc3RyeQorICAgICAqLworICAgIHByaXZhdGUgUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZD8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQgc3VwcG9ydCA9IG5ldyBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQodGhpcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dCBuYW1lIDwtPm1hbmFnZXIgYXNzb2NpYXRpb24gZm9yIGRpc3RyaWJ1dGVkIGNvbnRleHRzLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXAgbWFuYWdlcnMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbWFuYWdlckNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5EZWx0YU1hbmFnZXIiOworCisgICAgLyoqCisgICAgICogU2VuZGVyIHRvIHNlbmQgZGF0YSB3aXRoCisgICAgICovCisgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclNlbmRlciBjbHVzdGVyU2VuZGVyOworCisgICAgLyoqCisgICAgICogUmVjZWl2ZXIgdG8gcmVnaXN0ZXIgY2FsbCBiYWNrIHdpdGgKKyAgICAgKi8KKyAgICBwcml2YXRlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyUmVjZWl2ZXIgY2x1c3RlclJlY2VpdmVyOworCisgICAgcHJpdmF0ZSBMaXN0IHZhbHZlcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIHByaXZhdGUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJEZXBsb3llciBjbHVzdGVyRGVwbG95ZXI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZGVmYXVsdE1vZGUgPSB0cnVlIDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBMaXN0ZW5lcnMgb2YgbWVzc2FnZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlzdCBjbHVzdGVyTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgLyoqCisgICAgICogQ29tbWVudCBmb3IgPGNvZGU+bm90aWZ5TGlmZWN5Y2xlTGlzdGVuZXJPbkZhaWx1cmU8L2NvZGU+CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG5vdGlmeUxpZmVjeWNsZUxpc3RlbmVyT25GYWlsdXJlID0gZmFsc2U7CisKKyAgICBwcml2YXRlIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBkeW5hbWljIHNlbmRlciA8Y29kZT5wcm9wZXJ0aWVzPC9jb2RlPgorICAgICAqLworICAgIHByaXZhdGUgTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgLyoqCisgICAgICogVGhlIGNsdXN0ZXIgbG9nIGRldmljZSBuYW1lIHRvIGxvZyBhdCBsZXZlbCBpbmZvCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY2x1c3RlckxvZ05hbWUgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5TaW1wbGVUY3BDbHVzdGVyIjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBkb0NsdXN0ZXJMb2cgPSBmYWxzZTsKKworICAgIHByaXZhdGUgTG9nIGNsdXN0ZXJMb2cgPSBudWxsOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICBwdWJsaWMgU2ltcGxlVGNwQ2x1c3RlcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBDbHVzdGVyIGltcGxlbWVudGF0aW9uIGFuZCB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGNsdXN0ZXIgdG8gam9pbiwgaWYgbm8gY2x1c3RlciB3aXRoIHRoaXMgbmFtZSBpcworICAgICAqIHByZXNlbnQgY3JlYXRlIG9uZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2x1c3Rlck5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBjbHVzdGVybmFtZSB0byBqb2luCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3Rlck5hbWUoU3RyaW5nIGNsdXN0ZXJOYW1lKSB7CisgICAgICAgIHRoaXMuY2x1c3Rlck5hbWUgPSBjbHVzdGVyTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNsdXN0ZXIgdGhhdCB0aGlzIFNlcnZlciBpcyBjdXJyZW50bHkgY29uZmlndXJlZAorICAgICAqIHRvIG9wZXJhdGUgd2l0aGluLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGNsdXN0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmVyCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbHVzdGVyTmFtZSgpIHsKKyAgICAgICAgaWYoY2x1c3Rlck5hbWUgPT0gbnVsbCAmJiBjb250YWluZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuZ2V0TmFtZSgpIDsKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXJOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCBvdXIgQ2x1c3RlcgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250YWluZXIKKyAgICAgKiAgICAgICAgICAgIFRoZSBDb250YWluZXIgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgQ29udGFpbmVyIG9sZENvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyOworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImNvbnRhaW5lciIsIG9sZENvbnRhaW5lciwgdGhpcy5jb250YWluZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgQ29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCBvdXIgQ2x1c3RlcgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIENvbnRhaW5lciBhc3NvY2lhdGVkIHdpdGggb3VyIENsdXN0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRhaW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBub3RpZnlMaWZlY3ljbGVMaXN0ZW5lck9uRmFpbHVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc05vdGlmeUxpZmVjeWNsZUxpc3RlbmVyT25GYWlsdXJlKCkgeworICAgICAgICByZXR1cm4gbm90aWZ5TGlmZWN5Y2xlTGlzdGVuZXJPbkZhaWx1cmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG5vdGlmeUxpc3RlbmVyT25GYWlsdXJlCisgICAgICogICAgICAgICAgICBUaGUgbm90aWZ5TGlmZWN5Y2xlTGlzdGVuZXJPbkZhaWx1cmUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmeUxpZmVjeWNsZUxpc3RlbmVyT25GYWlsdXJlKAorICAgICAgICAgICAgYm9vbGVhbiBub3RpZnlMaXN0ZW5lck9uRmFpbHVyZSkgeworICAgICAgICBib29sZWFuIG9sZE5vdGlmeUxpc3RlbmVyT25GYWlsdXJlID0gdGhpcy5ub3RpZnlMaWZlY3ljbGVMaXN0ZW5lck9uRmFpbHVyZTsKKyAgICAgICAgdGhpcy5ub3RpZnlMaWZlY3ljbGVMaXN0ZW5lck9uRmFpbHVyZSA9IG5vdGlmeUxpc3RlbmVyT25GYWlsdXJlOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgibm90aWZ5TGlmZWN5Y2xlTGlzdGVuZXJPbkZhaWx1cmUiLAorICAgICAgICAgICAgICAgIG9sZE5vdGlmeUxpc3RlbmVyT25GYWlsdXJlLAorICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5TGlmZWN5Y2xlTGlzdGVuZXJPbkZhaWx1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVmYXVsdE1vZGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRNb2RlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZGVmYXVsdE1vZGUgVGhlIGRlZmF1bHRNb2RlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0TW9kZShib29sZWFuIGRlZmF1bHRNb2RlKSB7CisgICAgICAgIHRoaXMuZGVmYXVsdE1vZGUgPSBkZWZhdWx0TW9kZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRNYW5hZ2VyQ2xhc3NOYW1lKCkgeworICAgICAgICBpZihtYW5hZ2VyQ2xhc3NOYW1lICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbWFuYWdlckNsYXNzTmFtZTsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpZ2V0UHJvcGVydHkoIm1hbmFnZXIuY2xhc3NOYW1lIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlckNsYXNzTmFtZShTdHJpbmcgbWFuYWdlckNsYXNzTmFtZSkgeworICAgICAgICB0aGlzLm1hbmFnZXJDbGFzc05hbWUgPSBtYW5hZ2VyQ2xhc3NOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBDbHVzdGVyU2VuZGVyIGdldENsdXN0ZXJTZW5kZXIoKSB7CisgICAgICAgIHJldHVybiBjbHVzdGVyU2VuZGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXJTZW5kZXIoQ2x1c3RlclNlbmRlciBjbHVzdGVyU2VuZGVyKSB7CisgICAgICAgIHRoaXMuY2x1c3RlclNlbmRlciA9IGNsdXN0ZXJTZW5kZXI7CisgICAgfQorCisgICAgcHVibGljIENsdXN0ZXJSZWNlaXZlciBnZXRDbHVzdGVyUmVjZWl2ZXIoKSB7CisgICAgICAgIHJldHVybiBjbHVzdGVyUmVjZWl2ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlclJlY2VpdmVyKENsdXN0ZXJSZWNlaXZlciBjbHVzdGVyUmVjZWl2ZXIpIHsKKyAgICAgICAgdGhpcy5jbHVzdGVyUmVjZWl2ZXIgPSBjbHVzdGVyUmVjZWl2ZXI7CisgICAgfQorCisgICAgcHVibGljIE1lbWJlcnNoaXBTZXJ2aWNlIGdldE1lbWJlcnNoaXBTZXJ2aWNlKCkgeworICAgICAgICByZXR1cm4gbWVtYmVyc2hpcFNlcnZpY2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWVtYmVyc2hpcFNlcnZpY2UoTWVtYmVyc2hpcFNlcnZpY2UgbWVtYmVyc2hpcFNlcnZpY2UpIHsKKyAgICAgICAgdGhpcy5tZW1iZXJzaGlwU2VydmljZSA9IG1lbWJlcnNoaXBTZXJ2aWNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBjbHVzdGVyIHZhbHZlIAorICAgICAqIENsdXN0ZXIgVmFsdmVzIGFyZSBvbmx5IGFkZCB0byBjb250YWluZXIgd2hlbiBjbHVzdGVyIGlzIHN0YXJ0ZWQhCisgICAgICogQHBhcmFtIHZhbHZlIFRoZSBuZXcgY2x1c3RlciBWYWx2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRWYWx2ZShWYWx2ZSB2YWx2ZSkgeworICAgICAgICBpZiAodmFsdmUgaW5zdGFuY2VvZiBDbHVzdGVyVmFsdmUpCisgICAgICAgICAgICB2YWx2ZXMuYWRkKHZhbHZlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgYWxsIGNsdXN0ZXIgdmFsdmVzCisgICAgICogQHJldHVybiBjdXJyZW50IGNsdXN0ZXIgdmFsdmVzCisgICAgICovCisgICAgcHVibGljIFZhbHZlW10gZ2V0VmFsdmVzKCkgeworICAgICAgICByZXR1cm4gKFZhbHZlW10pIHZhbHZlcy50b0FycmF5KG5ldyBWYWx2ZVt2YWx2ZXMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjbHVzdGVyIGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbHVzdGVyLiBJZiB0aGlzIEFycmF5IGhhcworICAgICAqIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlTGlzdGVuZXJbXSBmaW5kQ2x1c3Rlckxpc3RlbmVycygpIHsKKyAgICAgICAgaWYgKGNsdXN0ZXJMaXN0ZW5lcnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgTWVzc2FnZUxpc3RlbmVyW10gbGlzdGVuZXIgPSBuZXcgTWVzc2FnZUxpc3RlbmVyW2NsdXN0ZXJMaXN0ZW5lcnMKKyAgICAgICAgICAgICAgICAgICAgLnNpemUoKV07CisgICAgICAgICAgICBjbHVzdGVyTGlzdGVuZXJzLnRvQXJyYXkobGlzdGVuZXIpOworICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZUxpc3RlbmVyWzBdOworCisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGNsdXN0ZXIgbWVzc2FnZSBsaXN0ZW5lciBhbmQgcmVnaXN0ZXIgY2x1c3RlciB0byB0aGlzIGxpc3RlbmVyCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2F0YWxpbmFDbHVzdGVyI2FkZENsdXN0ZXJMaXN0ZW5lcihvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVzc2FnZUxpc3RlbmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENsdXN0ZXJMaXN0ZW5lcihNZXNzYWdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwgJiYgIWNsdXN0ZXJMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7CisgICAgICAgICAgICBjbHVzdGVyTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgICAgICAgICBsaXN0ZW5lci5zZXRDbHVzdGVyKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVtb3ZlIG1lc3NhZ2UgbGlzdGVuZXIgYW5kIGRlcmVnaXN0ZXIgQ2x1c3RlciBmcm9tIGxpc3RlbmVyCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2F0YWxpbmFDbHVzdGVyI3JlbW92ZUNsdXN0ZXJMaXN0ZW5lcihvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVzc2FnZUxpc3RlbmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNsdXN0ZXJMaXN0ZW5lcihNZXNzYWdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNsdXN0ZXJMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLnNldENsdXN0ZXIobnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgY3VycmVudCBEZXBsb3llcgorICAgICAqLworICAgIHB1YmxpYyBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlckRlcGxveWVyIGdldENsdXN0ZXJEZXBsb3llcigpIHsKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXJEZXBsb3llcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgYSBuZXcgRGVwbG95ZXIsIG11c3QgYmUgc2V0IGJlZm9yZSBjbHVzdGVyIHN0YXJ0ZWQhCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlckRlcGxveWVyKAorICAgICAgICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJEZXBsb3llciBjbHVzdGVyRGVwbG95ZXIpIHsKKyAgICAgICAgdGhpcy5jbHVzdGVyRGVwbG95ZXIgPSBjbHVzdGVyRGVwbG95ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFzIG1lbWJlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZW1iZXJzKCkgeworICAgICAgICByZXR1cm4gbWVtYmVyc2hpcFNlcnZpY2UuaGFzTWVtYmVycygpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIGN1cnJlbnQgY2x1c3RlciBtZW1iZXJzCisgICAgICogQHJldHVybiBhbGwgbWVtYmVycyBvciBlbXB0eSBhcnJheSAKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyW10gZ2V0TWVtYmVycygpIHsKKyAgICAgICAgcmV0dXJuIG1lbWJlcnNoaXBTZXJ2aWNlLmdldE1lbWJlcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1lbWJlciB0aGF0IHJlcHJlc2VudHMgdGhpcyBub2RlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gTWVtYmVyCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBnZXRMb2NhbE1lbWJlcigpIHsKKyAgICAgICAgcmV0dXJuIG1lbWJlcnNoaXBTZXJ2aWNlLmdldExvY2FsTWVtYmVyKCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkeW5hbWljCisgICAgLy8gbWFuYWdlciBwcm9wZXJ0eSBoYW5kbGluZworCisgICAgLyoqCisgICAgICogSk1YIGhhY2sgdG8gZGlyZWN0IHVzZSBhdCBqY29uc29sZQorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBzZXRQcm9wZXJ0eShuYW1lLCAoT2JqZWN0KSB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IGNvbmZpZyBhdHRyaWJ1dGVzIHdpdGggcmVmbGVjdCBhbmQgcHJvcGFnYXRlIHRvIGFsbCBtYW5hZ2VycworICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cudHJhY2Uoc20uZ2V0U3RyaW5nKCJTaW1wbGVUY3BDbHVzdGVyLnNldFByb3BlcnR5IiwgbmFtZSwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0KG5hbWUpKSk7CisKKyAgICAgICAgcHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOworICAgICAgICBpZihzdGFydGVkKSB7CisgICAgICAgICAgICAvLyBGSVhNRSBIbW0sIGlzIHRoYXQgY29ycmVjdCB3aGVuIHNvbWUgRGVsdGFNYW5hZ2VycyBhcmUgZGlyZWN0IGNvbmZpZ3VyZWQgaW5zaWRlIENvbnRleHQ/CisgICAgICAgICAgICAvLyBXaHkgd2Ugbm90IHN1cHBvcnQgaXQgZm9yIG90aGVyIGVsZW1lbnRzLCBsaWtlIHNlbmRlciwgcmVjZWl2ZXIgb3IgbWVtYmVyc2hpcD8KKyAgICAgICAgICAgIC8vIE11c3Qgd2UgcmVzdGFydCBlbGVtZW50IGFmdGVyIGNoYW5nZT8KKyAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIm1hbmFnZXIiKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBuYW1lLnN1YnN0cmluZygibWFuYWdlciIubGVuZ3RoKCkgKyAxKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYW5hZ2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgTWFuYWdlciBtYW5hZ2VyID0gKE1hbmFnZXIpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZihtYW5hZ2VyIGluc3RhbmNlb2YgRGVsdGFNYW5hZ2VyICYmICgoQ2x1c3Rlck1hbmFnZXIpIG1hbmFnZXIpLmlzRGVmYXVsdE1vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgSW50cm9zcGVjdGlvblV0aWxzLnNldFByb3BlcnR5KG1hbmFnZXIsIGtleSwgcHZhbHVlICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGN1cnJlbnQgY29uZmlnCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqIEByZXR1cm4gVGhlIHByb3BlcnR5CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZShzbS5nZXRTdHJpbmcoIlNpbXBsZVRjcENsdXN0ZXIuZ2V0UHJvcGVydHkiLCBrZXkpKTsKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFsbCBwcm9wZXJ0aWVzIGtleXMKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIG92ZXIgdGhlIHByb3BlcnR5IG5hbWVzLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRQcm9wZXJ0eU5hbWVzKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydGllcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZSBhIGNvbmZpZ3VyZWQgcHJvcGVydHkuCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBrZXkpIHsKKyAgICAgICAgcHJvcGVydGllcy5yZW1vdmUoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0cmFuc2ZlciBwcm9wZXJ0aWVzIGZyb20gY2x1c3RlciBjb25maWd1cmF0aW9uIHRvIHN1YmVsZW1lbnQgYmVhbi4KKyAgICAgKiBAcGFyYW0gcHJlZml4CisgICAgICogQHBhcmFtIGJlYW4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0cmFuc2ZlclByb3BlcnR5KFN0cmluZyBwcmVmaXgsIE9iamVjdCBiZWFuKSB7CisgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UHJvcGVydHlOYW1lcygpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChwa2V5LnN0YXJ0c1dpdGgocHJlZml4KSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gcGtleS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCgpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldFByb3BlcnR5KHBrZXkpOworICAgICAgICAgICAgICAgICAgICBJbnRyb3NwZWN0aW9uVXRpbHMuc2V0UHJvcGVydHkoYmVhbiwga2V5LCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWFuYWdlcnMuCisgICAgICovCisgICAgcHVibGljIE1hcCBnZXRNYW5hZ2VycygpIHsKKyAgICAgICAgcmV0dXJuIG1hbmFnZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgTWFuYWdlciB3aXRob3V0IGFkZCB0byBjbHVzdGVyIChjb21lcyB3aXRoIHN0YXJ0IHRoZSBtYW5hZ2VyKQorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICBDb250ZXh0IE5hbWUgb2YgdGhpcyBtYW5hZ2VyCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLkNsdXN0ZXIjY3JlYXRlTWFuYWdlcihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqIEBzZWUgI2FkZE1hbmFnZXIoU3RyaW5nLCBNYW5hZ2VyKQorICAgICAqIEBzZWUgRGVsdGFNYW5hZ2VyI3N0YXJ0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE1hbmFnZXIgY3JlYXRlTWFuYWdlcihTdHJpbmcgbmFtZSkgeworICAgICAgICBDbGFzc0xvYWRlciBvbGRDdHhMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBNYW5hZ2VyIG1hbmFnZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoU2ltcGxlVGNwQ2x1c3Rlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIENsdXN0ZXJNYW5hZ2VyIGZvciBjb250ZXh0ICIgKyBuYW1lICsgIiB1c2luZyBjbGFzcyAiICsgZ2V0TWFuYWdlckNsYXNzTmFtZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWFuYWdlciA9IChNYW5hZ2VyKSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGdldE1hbmFnZXJDbGFzc05hbWUoKSkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gbG9hZCBjbGFzcyBmb3IgcmVwbGljYXRpb24gbWFuYWdlciIsIHgpOworICAgICAgICAgICAgICAgIG1hbmFnZXIgPSBuZXcgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uRGVsdGFNYW5hZ2VyKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5zZXREaXN0cmlidXRhYmxlKHRydWUpOworICAgICAgICAgICAgICAgICAgICBpZiAobWFuYWdlciBpbnN0YW5jZW9mIENsdXN0ZXJNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyTWFuYWdlciBjbWFuYWdlciA9IChDbHVzdGVyTWFuYWdlcikgbWFuYWdlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtYW5hZ2VyLnNldERlZmF1bHRNb2RlKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgY21hbmFnZXIuc2V0TmFtZShnZXRNYW5hZ2VyTmFtZShuYW1lLCBtYW5hZ2VyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbWFuYWdlci5zZXRDbHVzdGVyKHRoaXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ZmluYWxseSB7CisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihvbGRDdHhMb2FkZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtYW5hZ2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZSBhbiBhcHBsaWNhdGlvbiBmb3JtIGNsdXN0ZXIgcmVwbGljYXRpb24gYnVzCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2F0YWxpbmFDbHVzdGVyI3JlbW92ZU1hbmFnZXIoamF2YS5sYW5nLlN0cmluZyxNYW5hZ2VyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1hbmFnZXIoU3RyaW5nIG5hbWUsTWFuYWdlciBtYW5hZ2VyKSB7CisgICAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQkVGT1JFX01BTkFHRVJVTlJFR0lTVEVSX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyKTsKKyAgICAgICAgICAgIG1hbmFnZXJzLnJlbW92ZShnZXRNYW5hZ2VyTmFtZShuYW1lLG1hbmFnZXIpKTsKKyAgICAgICAgICAgIGlmIChtYW5hZ2VyIGluc3RhbmNlb2YgQ2x1c3Rlck1hbmFnZXIpCisgICAgICAgICAgICAgICAgKChDbHVzdGVyTWFuYWdlcikgbWFuYWdlcikuc2V0Q2x1c3RlcihudWxsKTsKKyAgICAgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgICAgIGxpZmVjeWNsZQorICAgICAgICAgICAgICAgICAgICAuZmlyZUxpZmVjeWNsZUV2ZW50KEFGVEVSX01BTkFHRVJVTlJFR0lTVEVSX0VWRU5ULCBtYW5hZ2VyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhbiBhcHBsaWNhdGlvbiB0byBjbHVzdGVyIHJlcGxpY2F0aW9uIGJ1cworICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSBtYW5hZ2VyCisgICAgICogICAgICAgICAgICBtYW5hZ2VyIHRvIHJlZ2lzdGVyCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2F0YWxpbmFDbHVzdGVyI2FkZE1hbmFnZXIoamF2YS5sYW5nLlN0cmluZywKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRNYW5hZ2VyKFN0cmluZyBuYW1lLCBNYW5hZ2VyIG1hbmFnZXIpIHsKKyAgICAgICAgaWYgKCFtYW5hZ2VyLmdldERpc3RyaWJ1dGFibGUoKSkgeworICAgICAgICAgICAgbG9nLndhcm4oIk1hbmFnZXIgd2l0aCBuYW1lICIgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgZGlzdHJpYnV0YWJsZSwgY2FuJ3QgYWRkIGFzIGNsdXN0ZXIgbWFuYWdlciIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfTUFOQUdFUlJFR0lTVEVSX0VWRU5ULCBtYW5hZ2VyKTsKKyAgICAgICAgU3RyaW5nIGNsdXN0ZXJOYW1lID0gZ2V0TWFuYWdlck5hbWUobmFtZSwgbWFuYWdlcik7CisgICAgICAgIGlmIChtYW5hZ2VyIGluc3RhbmNlb2YgQ2x1c3Rlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIENsdXN0ZXJNYW5hZ2VyIGNtYW5hZ2VyID0gKENsdXN0ZXJNYW5hZ2VyKSBtYW5hZ2VyIDsKKyAgICAgICAgICAgIGNtYW5hZ2VyLnNldE5hbWUoY2x1c3Rlck5hbWUpOworICAgICAgICAgICAgY21hbmFnZXIuc2V0Q2x1c3Rlcih0aGlzKTsKKyAgICAgICAgICAgIGlmKGNtYW5hZ2VyLmlzRGVmYXVsdE1vZGUoKSkKKyAgICAgICAgICAgICAgICB0cmFuc2ZlclByb3BlcnR5KCJtYW5hZ2VyIixjbWFuYWdlcik7CisgICAgICAgIH0KKyAgICAgICAgbWFuYWdlcnMucHV0KGNsdXN0ZXJOYW1lLCBtYW5hZ2VyKTsKKyAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEFGVEVSX01BTkFHRVJSRUdJU1RFUl9FVkVOVCwgbWFuYWdlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBmb3IgdGhlIGNsdXN0ZXIgbWFuYWdlci4gIFRoaXMgbmFtZQorICAgICAqIGRlcGVuZHMgb24gd2hldGhlciB0aGUgY2x1c3RlciBtYW5hZ2VyIGlzIGRlZmluZWQgaW5zaWRlCisgICAgICogYSBIb3N0IG9yIGFuIEVuZ2luZS4KKyAgICAgKiBTaG91bGQgdGhlIGNsdXN0ZXIgYmUgZGVmaW5lZCBpbiB0aGUgRW5naW5lIGVsZW1lbnQsIHRoZSBtYW5hZ2VyIG5hbWUKKyAgICAgKiBpcyBIb3N0LmdldE5hbWUrIiMiK0NvbnRleHQuZ2V0TWFuYWdlcigpLmdldE5hbWUoKQorICAgICAqIG90aGVyd2lzZSB0aGUgbmFtZSBpcyBzaW1wbHkgQ29udGV4dC5nZXRNYW5hZ2VyKCkuZ2V0TmFtZSgpCisgICAgICogQHBhcmFtIG5hbWUgVGhlIGN1cnJlbnQgbmFtZQorICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBjbHVzdGVyIG1hbmFnZXIgaW1wbGVtZW50YXRpb24KKyAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGNsdXN0ZXIgbWFuYWdlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFuYWdlck5hbWUoU3RyaW5nIG5hbWUsIE1hbmFnZXIgbWFuYWdlcikgeworICAgICAgICBTdHJpbmcgY2x1c3Rlck5hbWUgPSBuYW1lIDsKKyAgICAgICAgaWYgKCBjbHVzdGVyTmFtZSA9PSBudWxsICkgY2x1c3Rlck5hbWUgPSBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldE5hbWUoKTsKKyAgICAgICAgaWYoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBFbmdpbmUpIHsKKyAgICAgICAgICAgIENvbnRhaW5lciBjb250ZXh0ID0gbWFuYWdlci5nZXRDb250YWluZXIoKSA7CisgICAgICAgICAgICBpZihjb250ZXh0ICE9IG51bGwgJiYgY29udGV4dCBpbnN0YW5jZW9mIENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBDb250YWluZXIgaG9zdCA9ICgoQ29udGV4dCljb250ZXh0KS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBpZihob3N0ICE9IG51bGwgJiYgaG9zdCBpbnN0YW5jZW9mIEhvc3QgJiYgY2x1c3Rlck5hbWUhPW51bGwgJiYgIShjbHVzdGVyTmFtZS5pbmRleE9mKCIjIik+PTApKQorICAgICAgICAgICAgICAgICAgICBjbHVzdGVyTmFtZSA9IGhvc3QuZ2V0TmFtZSgpICsiIyIgKyBjbHVzdGVyTmFtZSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsdXN0ZXJOYW1lOworICAgIH0KKworICAgIC8qCisgICAgICogR2V0IE1hbmFnZXIKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DYXRhbGluYUNsdXN0ZXIjZ2V0TWFuYWdlcihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBNYW5hZ2VyIGdldE1hbmFnZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIChNYW5hZ2VyKSBtYW5hZ2Vycy5nZXQobmFtZSk7CisgICAgfQorCisgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIGEgcGVyaW9kaWMgdGFzaywgc3VjaCBhcyByZWxvYWRpbmcsIGV0Yy4gVGhpcyBtZXRob2Qgd2lsbCBiZQorICAgICAqIGludm9rZWQgaW5zaWRlIHRoZSBjbGFzc2xvYWRpbmcgY29udGV4dCBvZiB0aGlzIGNvbnRhaW5lci4gVW5leHBlY3RlZAorICAgICAqIHRocm93YWJsZXMgd2lsbCBiZSBjYXVnaHQgYW5kIGxvZ2dlZC4KKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5kZXBsb3kuRmFybVdhckRlcGxveWVyI2JhY2tncm91bmRQcm9jZXNzKCkKKyAgICAgKiBAc2VlIFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIjYmFja2dyb3VuZFByb2Nlc3MoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJhY2tncm91bmRQcm9jZXNzKCkgeworICAgICAgICBpZiAoY2x1c3RlckRlcGxveWVyICE9IG51bGwpCisgICAgICAgICAgICBjbHVzdGVyRGVwbG95ZXIuYmFja2dyb3VuZFByb2Nlc3MoKTsKKyAgICAgICAgaWYgKGNsdXN0ZXJTZW5kZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGNsdXN0ZXJTZW5kZXIuYmFja2dyb3VuZFByb2Nlc3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlmZWN5Y2xlLiBJZiB0aGlzCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiBsaWZlY3ljbGUuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbGlmZWN5Y2xlLnJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2UgYXMgYmFzZSB0byBoYW5kbGUgc3RhcnQvc3RvcC9wZXJpb2RpYyBFdmVudHMgZnJvbSBob3N0LiBDdXJyZW50bHkKKyAgICAgKiBvbmx5IGxvZyB0aGUgbWVzc2FnZXMgYXMgdHJhY2UgbGV2ZWwuCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyI2xpZmVjeWNsZUV2ZW50KG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXZlbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgbGlmZWN5Y2xlRXZlbnQoTGlmZWN5Y2xlRXZlbnQgbGlmZWN5Y2xlRXZlbnQpIHsKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLnRyYWNlKHNtLmdldFN0cmluZygiU2ltcGxlVGNwQ2x1c3Rlci5ldmVudC5sb2ciLCBsaWZlY3ljbGVFdmVudAorICAgICAgICAgICAgICAgICAgICAuZ2V0VHlwZSgpLCBsaWZlY3ljbGVFdmVudC5nZXREYXRhKCkpKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHVibGljCisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgPGNvZGU+Y29uZmlndXJlKCk8L2NvZGU+LAorICAgICAqIGFuZCBiZWZvcmUgYW55IG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgY29tcG9uZW50IGFyZSB1dGlsaXplZC4gPEJSPgorICAgICAqIFN0YXJ0cyB0aGUgY2x1c3RlciBjb21tdW5pY2F0aW9uIGNoYW5uZWwsIHRoaXMgd2lsbCBjb25uZWN0IHdpdGggdGhlCisgICAgICogb3RoZXIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIsIGFuZCByZXF1ZXN0IHRoZSBjdXJyZW50IHNlc3Npb24gc3RhdGUgdG8gYmUKKyAgICAgKiB0cmFuc2ZlcnJlZCB0byB0aGlzIG5vZGUuCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvciB0aGF0IHByZXZlbnRzIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICBjb21wb25lbnQgZnJvbSBiZWluZyB1c2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uKHNtLmdldFN0cmluZygiY2x1c3Rlci5hbHJlYWR5U3RhcnRlZCIpKTsKKyAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuaW5mbygiQ2x1c3RlciBpcyBhYm91dCB0byBzdGFydCIpOworICAgICAgICBnZXRDbHVzdGVyTG9nKCk7CisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RBUlRfRVZFTlQsIHRoaXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYoaXNEZWZhdWx0TW9kZSgpICYmIHZhbHZlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNyZWF0ZURlZmF1bHRDbHVzdGVyVmFsdmVzKCkgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVnaXN0ZXJDbHVzdGVyVmFsdmUoKTsKKyAgICAgICAgICAgIHJlZ2lzdGVyTUJlYW5zKCk7CisgICAgICAgICAgICAvLyBzZXR1cCB0aGUgZGVmYXVsdCBjbHVzdGVyIHNlc3Npb24gbGlzdGVuZXIgKERlbHRhTWFuYWdlciBzdXBwb3J0KQorICAgICAgICAgICAgaWYoaXNEZWZhdWx0TW9kZSgpICYmIGNsdXN0ZXJMaXN0ZW5lcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVEZWZhdWx0Q2x1c3Rlckxpc3RlbmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBzZXR1cCB0aGUgZGVmYXVsdCBjbHVzdGVyIFJlY2VpdmVyCisgICAgICAgICAgICBpZihpc0RlZmF1bHRNb2RlKCkgJiYgY2x1c3RlclJlY2VpdmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVEZWZhdWx0Q2x1c3RlclJlY2VpdmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBzZXR1cCB0aGUgZGVmYXVsdCBjbHVzdGVyIHNlbmRlcgorICAgICAgICAgICAgaWYoaXNEZWZhdWx0TW9kZSgpICYmIGNsdXN0ZXJTZW5kZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNyZWF0ZURlZmF1bHRDbHVzdGVyU2VuZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBzdGFydCB0aGUgcmVjZWl2ZXIuCisgICAgICAgICAgICBpZihjbHVzdGVyUmVjZWl2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNsdXN0ZXJSZWNlaXZlci5zZXRTZW5kQWNrKGNsdXN0ZXJTZW5kZXIuaXNXYWl0Rm9yQWNrKCkpOworICAgICAgICAgICAgICAgIGNsdXN0ZXJSZWNlaXZlci5zZXRDb21wcmVzcyhjbHVzdGVyU2VuZGVyLmlzQ29tcHJlc3MoKSk7CisgICAgICAgICAgICAgICAgY2x1c3RlclJlY2VpdmVyLnNldENhdGFsaW5hQ2x1c3Rlcih0aGlzKTsKKyAgICAgICAgICAgICAgICBjbHVzdGVyUmVjZWl2ZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgCisgICAgICAgICAgICAvLyBzdGFydCB0aGUgc2VuZGVyLgorICAgICAgICAgICAgaWYoY2x1c3RlclNlbmRlciAhPSBudWxsICYmIGNsdXN0ZXJSZWNlaXZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2x1c3RlclNlbmRlci5zZXRDYXRhbGluYUNsdXN0ZXIodGhpcyk7CisgICAgICAgICAgICAgICAgY2x1c3RlclNlbmRlci5zdGFydCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBzdGFydCB0aGUgbWVtYmVyc2hpcCBzZXJ2aWNlLgorICAgICAgICAgICAgaWYoaXNEZWZhdWx0TW9kZSgpICYmIG1lbWJlcnNoaXBTZXJ2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVEZWZhdWx0TWVtYmVyc2hpcFNlcnZpY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYobWVtYmVyc2hpcFNlcnZpY2UgIT0gbnVsbCAmJiBjbHVzdGVyUmVjZWl2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1lbWJlcnNoaXBTZXJ2aWNlLnNldExvY2FsTWVtYmVyUHJvcGVydGllcyhjbHVzdGVyUmVjZWl2ZXIKKyAgICAgICAgICAgICAgICAgICAgLmdldEhvc3QoKSwgY2x1c3RlclJlY2VpdmVyLmdldFBvcnQoKSk7CisgICAgICAgICAgICAgICAgbWVtYmVyc2hpcFNlcnZpY2UuYWRkTWVtYmVyc2hpcExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIG1lbWJlcnNoaXBTZXJ2aWNlLnNldENhdGFsaW5hQ2x1c3Rlcih0aGlzKTsKKyAgICAgICAgICAgICAgICBtZW1iZXJzaGlwU2VydmljZS5zdGFydCgpOworICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHRoZSBkZXBsb3llci4KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2x1c3RlckRlcGxveWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJEZXBsb3llci5zZXRDbHVzdGVyKHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlckRlcGxveWVyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgeCkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZmF0YWwoIlVuYWJsZSB0byByZXRyaWV2ZSB0aGUgY29udGFpbmVyIGRlcGxveWVyLiBDbHVzdGVyIGRlcGxveW1lbnQgZGlzYWJsZWQuIix4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChBRlRFUl9TVEFSVF9FVkVOVCwgdGhpcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzdGFydCBjbHVzdGVyLiIsIHgpOworICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbih4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBkZWZhdWx0IG1lbWJlcnNoaXAgc2VydmljZToKKyAgICAgKiA8cHJlPgorICAgICAqICZsdDtNZW1iZXJzaGlwIAorICAgICAqICAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLm1jYXN0Lk1jYXN0U2VydmljZSIKKyAgICAgKiAgICAgICAgICAgICBtY2FzdEFkZHI9IjIyOC4wLjAuNCIKKyAgICAgKiAgICAgICAgICAgICBtY2FzdFBvcnQ9IjgwMTIiCisgICAgICogICAgICAgICAgICAgbWNhc3RGcmVxdWVuY3k9IjEwMDAiCisgICAgICogICAgICAgICAgICAgbWNhc3REcm9wVGltZT0iMzAwMDAiLyZndDsKKyAgICAgKiA8L3ByZT4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0TWVtYmVyc2hpcFNlcnZpY2UoKSB7CisgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICJTaW1wbGVUY3BDbHVzdGVyLmRlZmF1bHQuYWRkTWVtYmVyc2hpcFNlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICBnZXRDbHVzdGVyTmFtZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE1jYXN0U2VydmljZSBtU2VydmljZT0gbmV3IE1jYXN0U2VydmljZSgpOworICAgICAgICBtU2VydmljZS5zZXRNY2FzdEFkZHIoIjIyOC4wLjAuNCIpOworICAgICAgICBtU2VydmljZS5zZXRNY2FzdFBvcnQoODAxMik7CisgICAgICAgIG1TZXJ2aWNlLnNldE1jYXN0RnJlcXVlbmN5KDEwMDApOworICAgICAgICBtU2VydmljZS5zZXRNY2FzdERyb3BUaW1lKDMwMDAwKTsKKyAgICAgICAgdHJhbnNmZXJQcm9wZXJ0eSgic2VydmljZSIsbVNlcnZpY2UpOyAgICAgICAgCisgICAgICAgIHNldE1lbWJlcnNoaXBTZXJ2aWNlKG1TZXJ2aWNlKTsgICAgICAgICAgCisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlIGRlZmF1bHQgY2x1c3RlciBzZW5kZXIKKyAgICAgKiA8cHJlPgorICAgICAqICAmbHQ7U2VuZGVyCisgICAgICogICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblRyYW5zbWl0dGVyIgorICAgICAqICAgICByZXBsaWNhdGlvbk1vZGU9ImZhc3Rhc3luY3F1ZXVlIgorICAgICAqICAgICBkb1RyYW5zbWl0dGVyUHJvY2Vzc2luZ1N0YXRzPSJ0cnVlIgorICAgICAqICAgICBkb1Byb2Nlc3NpbmdTdGF0cz0idHJ1ZSIvJmd0OworICAgICAqICA8L3ByZT4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0Q2x1c3RlclNlbmRlcigpIHsKKyAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgIlNpbXBsZVRjcENsdXN0ZXIuZGVmYXVsdC5hZGRDbHVzdGVyU2VuZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2x1c3Rlck5hbWUoKSkpOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgUmVwbGljYXRpb25UcmFuc21pdHRlciBzZW5kZXI9IG5ldyBSZXBsaWNhdGlvblRyYW5zbWl0dGVyKCk7CisgICAgICAgIHNlbmRlci5zZXRSZXBsaWNhdGlvbk1vZGUoImZhc3Rhc3luY3F1ZXVlIik7CisgICAgICAgIHNlbmRlci5zZXREb1RyYW5zbWl0dGVyUHJvY2Vzc2luZ1N0YXRzKHRydWUpOworICAgICAgICBzZW5kZXIuc2V0UHJvcGVydHkoImRvUHJvY2Vzc2luZ1N0YXRzIiwgInRydWUiKTsKKyAgICAgICAgdHJhbnNmZXJQcm9wZXJ0eSgic2VuZGVyIixzZW5kZXIpOworICAgICAgICBzZXRDbHVzdGVyU2VuZGVyKHNlbmRlcik7ICAgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBkZWZhdWx0IHJlY2VpdmVyOgorICAgICAqIDxwcmU+CisgICAgICogICAmbHQ7UmVjZWl2ZXIgCisgICAgICogICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5Tb2NrZXRSZXBsaWNhdGlvbkxpc3RlbmVyIgorICAgICAqICAgICB0Y3BMaXN0ZW5BZGRyZXNzPSJhdXRvIgorICAgICAqICAgICB0Y3BMaXN0ZW5Qb3J0PSI4MDE1IgorICAgICAqICAgICB0Y3BMaXN0ZW5NYXhQb3J0PSI4MDE5IgorICAgICAqICAgICBkb1JlY2VpdmVkUHJvY2Vzc2luZ1N0YXRzPSJ0cnVlIgorICAgICAqICAgLyZndDsKKyAgICAgKiA8L3ByZT4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0Q2x1c3RlclJlY2VpdmVyKCkgeworICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAiU2ltcGxlVGNwQ2x1c3Rlci5kZWZhdWx0LmFkZENsdXN0ZXJSZWNlaXZlciIsCisgICAgICAgICAgICAgICAgICAgIGdldENsdXN0ZXJOYW1lKCkpKTsKKyAgICAgICAgfQorICAgICAgICBTb2NrZXRSZXBsaWNhdGlvbkxpc3RlbmVyIHJlY2VpdmVyPSBuZXcgU29ja2V0UmVwbGljYXRpb25MaXN0ZW5lcigpOworICAgICAgICByZWNlaXZlci5zZXRUY3BMaXN0ZW5BZGRyZXNzKCJhdXRvIik7CisgICAgICAgIHJlY2VpdmVyLnNldERvUmVjZWl2ZWRQcm9jZXNzaW5nU3RhdHModHJ1ZSk7CisgICAgICAgIHJlY2VpdmVyLnNldFRjcExpc3RlblBvcnQoODAxNSk7CisgICAgICAgIHJlY2VpdmVyLnNldFRjcExpc3Rlbk1heFBvcnQoODAxOSk7CisgICAgICAgIHRyYW5zZmVyUHJvcGVydHkoInJlY2VpdmVyIixyZWNlaXZlcik7CisgICAgICAgIHNldENsdXN0ZXJSZWNlaXZlcihyZWNlaXZlcik7ICAgICAgICAgIAorICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgZGVmYXVsdCBzZXNzaW9uIGNsdXN0ZXIgbGlzdGVuZXI6CisgICAgICogIDxwcmU+CisgICAgICogJmx0O0NsdXN0ZXJMaXN0ZW5lciAKKyAgICAgKiAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uQ2x1c3RlclNlc3Npb25MaXN0ZW5lciIgLyZndDsKKyAgICAgKiA8L3ByZT4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0Q2x1c3Rlckxpc3RlbmVyKCkgeworICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAiU2ltcGxlVGNwQ2x1c3Rlci5kZWZhdWx0LmFkZENsdXN0ZXJMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgIGdldENsdXN0ZXJOYW1lKCkpKTsKKyAgICAgICAgfQorICAgICAgICBDbHVzdGVyU2Vzc2lvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENsdXN0ZXJTZXNzaW9uTGlzdGVuZXIoKTsKKyAgICAgICAgdHJhbnNmZXJQcm9wZXJ0eSgibGlzdGVuZXIiLGxpc3RlbmVyKTsKKyAgICAgICAgYWRkQ2x1c3Rlckxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGRlZmF1bHQgUmVwbGljYXRpb25WYWx2ZQorICAgICAqIDxwcmU+CisgICAgICogJmx0O1ZhbHZlIAorICAgICAqICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblZhbHZlIgorICAgICAqICAgIGZpbHRlcj0iLipcLmdpZjsuKlwuanM7LipcLmNzczsuKlwucG5nOy4qXC5qcGVnOy4qXC5qcGc7LipcLmh0bTsuKlwuaHRtbDsuKlwudHh0OyIKKyAgICAgKiAgICBwcmltYXJ5SW5kaWNhdG9yPSJ0cnVlIiAvJmd0OworICAgICAqIDwvcHJlPgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRDbHVzdGVyVmFsdmVzKCkgeworICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAiU2ltcGxlVGNwQ2x1c3Rlci5kZWZhdWx0LmFkZENsdXN0ZXJWYWx2ZXMiLAorICAgICAgICAgICAgICAgICAgICBnZXRDbHVzdGVyTmFtZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgUmVwbGljYXRpb25WYWx2ZSB2YWx2ZT0gbmV3IFJlcGxpY2F0aW9uVmFsdmUoKSA7CisgICAgICAgIHZhbHZlLnNldEZpbHRlcigiLipcXC5naWY7LipcXC5qczsuKlxcLmNzczsuKlxcLnBuZzsuKlxcLmpwZWc7LipcXC5qcGc7LipcXC5odG07LipcXC5odG1sOy4qXFwudHh0OyIpOworICAgICAgICB2YWx2ZS5zZXRQcmltYXJ5SW5kaWNhdG9yKHRydWUpOworICAgICAgICB0cmFuc2ZlclByb3BlcnR5KCJ2YWx2ZSIsdmFsdmUpOworICAgICAgICBhZGRWYWx2ZSh2YWx2ZSk7CisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlZ2lzdGVyIGFsbCBjbHVzdGVyIHZhbHZlIHRvIGhvc3Qgb3IgZW5naW5lCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckNsdXN0ZXJWYWx2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZihjb250YWluZXIgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHZhbHZlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBDbHVzdGVyVmFsdmUgdmFsdmUgPSAoQ2x1c3RlclZhbHZlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgYWRkVmFsdmUgb24gIiArIGdldENvbnRhaW5lcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdpdGggY2xhc3M9IiArIHZhbHZlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBJbnRyb3NwZWN0aW9uVXRpbHMuY2FsbE1ldGhvZE4oZ2V0Q29udGFpbmVyKCksICJhZGRWYWx2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgdmFsdmUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmUuY2xhc3MgfSk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsdmUuc2V0Q2x1c3Rlcih0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHVucmVnaXN0ZXIgYWxsIGNsdXN0ZXIgdmFsdmUgdG8gaG9zdCBvciBlbmdpbmUKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHVucmVnaXN0ZXJDbHVzdGVyVmFsdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdmFsdmVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgQ2x1c3RlclZhbHZlIHZhbHZlID0gKENsdXN0ZXJWYWx2ZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyByZW1vdmVWYWx2ZSBvbiAiICsgZ2V0Q29udGFpbmVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aXRoIGNsYXNzPSIgKyB2YWx2ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAodmFsdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBJbnRyb3NwZWN0aW9uVXRpbHMuY2FsbE1ldGhvZE4oZ2V0Q29udGFpbmVyKCksICJyZW1vdmVWYWx2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyB2YWx2ZSB9LCBuZXcgQ2xhc3NbXSB7IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmUuY2xhc3MgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx2ZS5zZXRDbHVzdGVyKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSB0ZXJtaW5hdGUgdGhlIGFjdGl2ZSBjbHVzdGVyIGNvbXBvbmVudC48YnIvPgorICAgICAqIFRoaXMgd2lsbCBkaXNjb25uZWN0IHRoZSBjbHVzdGVyIGNvbW11bmljYXRpb24gY2hhbm5lbCwgc3RvcCB0aGUKKyAgICAgKiBsaXN0ZW5lciBhbmQgZGVyZWdpc3RlciB0aGUgdmFsdmVzIGZyb20gaG9zdCBvciBlbmdpbmUuPGJyLz48YnIvPgorICAgICAqIDxiPk5vdGU6PC9iPjxici8+VGhlIHN1YiBlbGVtZW50cyByZWNlaXZlciwgc2VuZGVyLCBtZW1iZXJzaGlwLAorICAgICAqIGxpc3RlbmVyIG9yIHZhbHZlcyBhcmUgbm90IHJlbW92ZWQuIFlvdSBjYW4gZWFzaWx5IHN0YXJ0IHRoZSBjbHVzdGVyIGFnYWluLgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBjb21wb25lbnQgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvciB0aGF0IG5lZWRzIHRvIGJlCisgICAgICogICAgICAgICAgICAgICAgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCFzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihzbS5nZXRTdHJpbmcoImNsdXN0ZXIubm90U3RhcnRlZCIpKTsKKyAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9TVE9QX0VWRU5ULCB0aGlzKTsKKworICAgICAgICBpZiAoY2x1c3RlckRlcGxveWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNsdXN0ZXJEZXBsb3llci5zdG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRklYTUUgcmVtb3ZlIHJlZ2lzdGVyZWQgbWFuYWdlcnMhIQorICAgICAgICBpZihtZW1iZXJzaGlwU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtZW1iZXJzaGlwU2VydmljZS5zdG9wKCk7CisgICAgICAgICAgICBtZW1iZXJzaGlwU2VydmljZS5yZW1vdmVNZW1iZXJzaGlwTGlzdGVuZXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZihjbHVzdGVyU2VuZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2x1c3RlclNlbmRlci5zdG9wKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHN0b3AgY2x1c3RlciBzZW5kZXIuIiwgeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoY2x1c3RlclJlY2VpdmVyICE9IG51bGwgKXsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2x1c3RlclJlY2VpdmVyLnN0b3AoKTsKKyAgICAgICAgICAgICAgICBjbHVzdGVyUmVjZWl2ZXIuc2V0Q2F0YWxpbmFDbHVzdGVyKG51bGwpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzdG9wIGNsdXN0ZXIgcmVjZWl2ZXIuIiwgeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdW5yZWdpc3Rlck1CZWFucygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdW5yZWdpc3RlckNsdXN0ZXJWYWx2ZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gc3RvcCBjbHVzdGVyIHZhbHZlLiIsIHgpOworICAgICAgICB9CisgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEFGVEVSX1NUT1BfRVZFTlQsIHRoaXMpOworICAgICAgICBjbHVzdGVyTG9nID0gbnVsbCA7CisgICB9CisKKyAgICAvKioKKyAgICAgKiBzZW5kIG1lc3NhZ2UgdG8gYWxsIGNsdXN0ZXIgbWVtYmVycyBzYW1lIGNsdXN0ZXIgZG9tYWluCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2F0YWxpbmFDbHVzdGVyI3NlbmQob3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRDbHVzdGVyRG9tYWluKENsdXN0ZXJNZXNzYWdlIG1zZykgeworICAgICAgICBsb25nIHN0YXJ0ID0gMDsKKyAgICAgICAgaWYgKGRvQ2x1c3RlckxvZykKKyAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtc2cuc2V0QWRkcmVzcyhtZW1iZXJzaGlwU2VydmljZS5nZXRMb2NhbE1lbWJlcigpKTsKKyAgICAgICAgICAgIGNsdXN0ZXJTZW5kZXIuc2VuZE1lc3NhZ2VDbHVzdGVyRG9tYWluKG1zZyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICBpZiAobm90aWZ5TGlmZWN5Y2xlTGlzdGVuZXJPbkZhaWx1cmUpIHsKKyAgICAgICAgICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgICAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTRU5EX01FU1NBR0VfRkFJTFVSRV9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZW5kTWVzc2FnZURhdGEobXNnLCBudWxsLCB4KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzZW5kIG1lc3NhZ2UgdGhyb3VnaCBjbHVzdGVyIHNlbmRlci4iLCB4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZG9DbHVzdGVyTG9nKQorICAgICAgICAgICAgbG9nU2VuZE1lc3NhZ2UobXNnLCBzdGFydCwgbnVsbCk7CisgICAgfSAKKworCisgICAgLyoqCisgICAgICogc2VuZCBtZXNzYWdlIHRvIGFsbCBjbHVzdGVyIG1lbWJlcnMKKyAgICAgKiBAcGFyYW0gbXNnIG1lc3NhZ2UgdG8gdHJhbnNmZXIKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DYXRhbGluYUNsdXN0ZXIjc2VuZChvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1lc3NhZ2UpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VuZChDbHVzdGVyTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgc2VuZChtc2csIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNlbmQgYSBjbHVzdGVyIG1lc3NhZ2UgdG8gb25lIG1lbWJlciAodmVyeSB1c2VmdWxsIEpNWCBtZXRob2QgZm9yIHJlbW90ZSBzY3JpcHRpbmcpCisgICAgICogCisgICAgICogQHBhcmFtIG1zZyBtZXNzYWdlIHRvIHRyYW5zZmVyCisgICAgICogQHBhcmFtIGRlc3QgUmVjZWl2ZXIgbWVtYmVyIHdpdGggbmFtZQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNhdGFsaW5hQ2x1c3RlciNzZW5kKG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWVzc2FnZSwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXIpCisgICAgICogQHNlZSBNY2FzdFNlcnZpY2UjZmluZE1lbWJlckJ5TmFtZShTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VuZFRvTWVtYmVyKENsdXN0ZXJNZXNzYWdlIG1zZywgU3RyaW5nIGRlc3QpIHsKKyAgICAgICAgTWVtYmVyIG1lbWJlciA9IGdldE1lbWJlcnNoaXBTZXJ2aWNlKCkuZmluZE1lbWJlckJ5TmFtZShkZXN0KTsKKyAgICAgICAgaWYgKG1lbWJlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzZW5kKG1zZywgbWVtYmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigic2VuZFRvTWVtYmVyOiBtZW1iZXIgIiArIGRlc3QgKyAiIG5vdCBmb3VuZCEiKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIHNlbmQgYSBjbHVzdGVyIG1lc3NhZ2UgdG8gb25lIG1lbWJlcgorICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cgbWVzc2FnZSB0byB0cmFuc2ZlcgorICAgICAqIEBwYXJhbSBkZXN0IFJlY2VpdmVyIG1lbWJlcgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNhdGFsaW5hQ2x1c3RlciNzZW5kKG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWVzc2FnZSwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXIpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VuZChDbHVzdGVyTWVzc2FnZSBtc2csIE1lbWJlciBkZXN0KSB7CisgICAgICAgIGxvbmcgc3RhcnQgPSAwOworICAgICAgICBpZiAoZG9DbHVzdGVyTG9nKQorICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1zZy5zZXRBZGRyZXNzKG1lbWJlcnNoaXBTZXJ2aWNlLmdldExvY2FsTWVtYmVyKCkpOworICAgICAgICAgICAgaWYgKGRlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICghbWVtYmVyc2hpcFNlcnZpY2UuZ2V0TG9jYWxNZW1iZXIoKS5lcXVhbHMoZGVzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2x1c3RlclNlbmRlci5zZW5kTWVzc2FnZShtc2csIGRlc3QpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzZW5kIG1lc3NhZ2UgdG8gbG9jYWwgbWVtYmVyICIgKyBtc2cpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbHVzdGVyU2VuZGVyLnNlbmRNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICBpZiAobm90aWZ5TGlmZWN5Y2xlTGlzdGVuZXJPbkZhaWx1cmUpIHsKKyAgICAgICAgICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgICAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTRU5EX01FU1NBR0VfRkFJTFVSRV9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZW5kTWVzc2FnZURhdGEobXNnLCBkZXN0LCB4KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzZW5kIG1lc3NhZ2UgdGhyb3VnaCBjbHVzdGVyIHNlbmRlci4iLCB4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZG9DbHVzdGVyTG9nKQorICAgICAgICAgICAgbG9nU2VuZE1lc3NhZ2UobXNnLCBzdGFydCwgZGVzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmV3IGNsdXN0ZXIgbWVtYmVyIGlzIHJlZ2lzdGVyZWQKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXJzaGlwTGlzdGVuZXIjbWVtYmVyQWRkZWQob3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiUmVwbGljYXRpb24gbWVtYmVyIGFkZGVkOiIgKyBtZW1iZXIpOworICAgICAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfTUVNQkVSUkVHSVNURVJfRVZFTlQsIG1lbWJlcik7CisgICAgICAgICAgICBjbHVzdGVyU2VuZGVyLmFkZChtZW1iZXIpOworICAgICAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChBRlRFUl9NRU1CRVJSRUdJU1RFUl9FVkVOVCwgbWVtYmVyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGNvbm5lY3QgdG8gcmVwbGljYXRpb24gc3lzdGVtLiIsIHgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbHVzdGVyIG1lbWJlciBpcyBnb25lCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVtYmVyc2hpcExpc3RlbmVyI21lbWJlckRpc2FwcGVhcmVkKG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXIpCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWVtYmVyRGlzYXBwZWFyZWQoTWVtYmVyIG1lbWJlcikgeworICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5pbmZvKCJSZWNlaXZlZCBtZW1iZXIgZGlzYXBwZWFyZWQ6IiArIG1lbWJlcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9NRU1CRVJVTlJFR0lTVEVSX0VWRU5ULCBtZW1iZXIpOworICAgICAgICAgICAgY2x1c3RlclNlbmRlci5yZW1vdmUobWVtYmVyKTsKKyAgICAgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQUZURVJfTUVNQkVSVU5SRUdJU1RFUl9FVkVOVCwgbWVtYmVyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHJlbW92ZSBjbHVzdGVyIG5vZGUgZnJvbSByZXBsaWNhdGlvbiBzeXN0ZW0uIiwgeCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZWNlaXZlcgorICAgIC8vIG1lc3NhZ2VzCisKKyAgICAvKioKKyAgICAgKiBub3RpZnkgYWxsIGxpc3RlbmVycyBmcm9tIHJlY2VpdmluZyBhIG5ldyBtZXNzYWdlIGlzIG5vdCBDbHVzdGVyTWVzc2FnZQorICAgICAqIGVtaXR0IEZhaWx1cmUgRXZlbnQgdG8gTGlmZWN5bGNlTGlzdGVuZXIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgcmVjZXZlaXZlZCBNZXNzYWdlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjZWl2ZShDbHVzdGVyTWVzc2FnZSBtZXNzYWdlKSB7CisKKyAgICAgICAgbG9uZyBzdGFydCA9IDA7CisgICAgICAgIGlmIChkb0NsdXN0ZXJMb2cpCisgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgJiYgbWVzc2FnZSAhPSBudWxsKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJBc3N1bWluZyBjbG9ja3MgYXJlIHN5bmNoZWQ6IFJlcGxpY2F0aW9uIGZvciAiCisgICAgICAgICAgICAgICAgICAgICsgbWVzc2FnZS5nZXRVbmlxdWVJZCgpICsgIiB0b29rPSIKKyAgICAgICAgICAgICAgICAgICAgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSAobWVzc2FnZSkuZ2V0VGltZXN0YW1wKCkpCisgICAgICAgICAgICAgICAgICAgICsgIiBtcy4iKTsKKworICAgICAgICAvL2ludm9rZSBhbGwgdGhlIGxpc3RlbmVycworICAgICAgICBib29sZWFuIGFjY2VwdGVkID0gZmFsc2U7CisgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNsdXN0ZXJMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgTWVzc2FnZUxpc3RlbmVyIGxpc3RlbmVyID0gKE1lc3NhZ2VMaXN0ZW5lcikgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyLmFjY2VwdChtZXNzYWdlKSkgeworICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm1lc3NhZ2VSZWNlaXZlZChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhY2NlcHRlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgaWYgKG5vdGlmeUxpZmVjeWNsZUxpc3RlbmVyT25GYWlsdXJlKSB7CisgICAgICAgICAgICAgICAgTWVtYmVyIGRlc3QgPSBtZXNzYWdlLmdldEFkZHJlc3MoKTsKKyAgICAgICAgICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgICAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChSRUNFSVZFX01FU1NBR0VfRkFJTFVSRV9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZW5kTWVzc2FnZURhdGEobWVzc2FnZSwgZGVzdCwgbnVsbCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXNzYWdlICIgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiIGZyb20gdHlwZSAiCisgICAgICAgICAgICAgICAgICAgICsgbWVzc2FnZS5nZXRDbGFzcygpLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIgdHJhbnNmZXJlZCBidXQgbm8gbGlzdGVuZXIgcmVnaXN0ZXJlZCIpOworICAgICAgICB9CisgICAgICAgIGlmIChkb0NsdXN0ZXJMb2cpCisgICAgICAgICAgICBsb2dSZWNlaXZlTWVzc2FnZShtZXNzYWdlLCBzdGFydCwgYWNjZXB0ZWQpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMb2dnZXIKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2x1c3RlckxvZ05hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbHVzdGVyTG9nTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXJMb2dOYW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY2x1c3RlckxvZ05hbWUgVGhlIGNsdXN0ZXJMb2dOYW1lIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbHVzdGVyTG9nTmFtZShTdHJpbmcgY2x1c3RlckxvZ05hbWUpIHsKKyAgICAgICAgdGhpcy5jbHVzdGVyTG9nTmFtZSA9IGNsdXN0ZXJMb2dOYW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRvQ2x1c3RlckxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RvQ2x1c3RlckxvZygpIHsKKyAgICAgICAgcmV0dXJuIGRvQ2x1c3RlckxvZzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIGRvQ2x1c3RlckxvZyBUaGUgZG9DbHVzdGVyTG9nIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREb0NsdXN0ZXJMb2coYm9vbGVhbiBkb0NsdXN0ZXJMb2cpIHsKKyAgICAgICAgdGhpcy5kb0NsdXN0ZXJMb2cgPSBkb0NsdXN0ZXJMb2c7CisgICAgfSAgICAKKyAgICBwdWJsaWMgTG9nIGdldExvZ2dlcigpIHsKKyAgICAgICAgcmV0dXJuIGxvZzsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9nIGdldENsdXN0ZXJMb2coKSB7CisgICAgICAgIGlmIChjbHVzdGVyTG9nID09IG51bGwgJiYgY2x1c3RlckxvZ05hbWUgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmICEiIi5lcXVhbHMoY2x1c3RlckxvZ05hbWUpKQorICAgICAgICAgICAgY2x1c3RlckxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGNsdXN0ZXJMb2dOYW1lKTsKKworICAgICAgICByZXR1cm4gY2x1c3RlckxvZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBsb2cgcmVjZWl2ZWQgbWVzc2FnZSB0byBjbHVzdGVyIHRyYW5zZmVyIGxvZworICAgICAqIEBwYXJhbSBtZXNzYWdlCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogQHBhcmFtIGFjY2VwdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9nUmVjZWl2ZU1lc3NhZ2UoQ2x1c3Rlck1lc3NhZ2UgbWVzc2FnZSwgbG9uZyBzdGFydCwKKyAgICAgICAgICAgIGJvb2xlYW4gYWNjZXB0ZWQpIHsKKyAgICAgICAgaWYgKGNsdXN0ZXJMb2cgIT0gbnVsbCAmJiBjbHVzdGVyTG9nLmlzSW5mb0VuYWJsZWQoKSkgeworICAgICAgICAgICAgY2x1c3RlckxvZy5pbmZvKHNtLmdldFN0cmluZygiU2ltcGxlVGNwQ2x1c3Rlci5sb2cucmVjZWl2ZSIsIG5ldyBPYmplY3RbXSB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKHN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCksCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0QWRkcmVzcygpLmdldEhvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIobWVzc2FnZS5nZXRBZGRyZXNzKCkuZ2V0UG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRVbmlxdWVJZCgpLCBuZXcgQm9vbGVhbihhY2NlcHRlZCkgfSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogbG9nIHNlbmRlZCBtZXNzYWdlIHRvIGNsdXN0ZXIgdHJhbnNmZXIgbG9nCisgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiBAcGFyYW0gZGVzdAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGxvZ1NlbmRNZXNzYWdlKENsdXN0ZXJNZXNzYWdlIG1lc3NhZ2UsIGxvbmcgc3RhcnQsCisgICAgICAgICAgICBNZW1iZXIgZGVzdCkgeworICAgICAgICBpZiAoY2x1c3RlckxvZyAhPSBudWxsICYmIGNsdXN0ZXJMb2cuaXNJbmZvRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBpZiAoZGVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2x1c3RlckxvZy5pbmZvKHNtLmdldFN0cmluZygiU2ltcGxlVGNwQ2x1c3Rlci5sb2cuc2VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBuZXcgRGF0ZShzdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0LmdldEhvc3QoKSwgbmV3IEludGVnZXIoZGVzdC5nZXRQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldFVuaXF1ZUlkKCkgfSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbHVzdGVyTG9nLmluZm8oc20uZ2V0U3RyaW5nKCJTaW1wbGVUY3BDbHVzdGVyLmxvZy5zZW5kLmFsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBuZXcgRGF0ZShzdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldFVuaXF1ZUlkKCkgfSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEpNWCBNQmVhbnMKKworICAgIC8qKgorICAgICAqIHJlZ2lzdGVyIE1lYW5zIGF0IGNsdXN0ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJNQmVhbnMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRNQmVhblNlcnZlcigpOworICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAiOnR5cGU9Q2x1c3RlciI7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU3RhbmRhcmRIb3N0KSB7CisgICAgICAgICAgICAgICAgZG9tYWluID0gKChTdGFuZGFyZEhvc3QpIGNvbnRhaW5lcikuZ2V0RG9tYWluKCk7CisgICAgICAgICAgICAgICAgbmFtZSArPSAiLGhvc3Q9IiArIGNvbnRhaW5lci5nZXROYW1lKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBTdGFuZGFyZEVuZ2luZSkgeworICAgICAgICAgICAgICAgICAgICBkb21haW4gPSAoKFN0YW5kYXJkRW5naW5lKSBjb250YWluZXIpLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9iamVjdE5hbWUgY2x1c3Rlck5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyBuYW1lKTsKKworICAgICAgICAgICAgaWYgKG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKGNsdXN0ZXJOYW1lKSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcoImNsdXN0ZXIubWJlYW4ucmVnaXN0ZXIuYWxyZWFkeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck5hbWUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRPYmplY3ROYW1lKGNsdXN0ZXJOYW1lKTsKKyAgICAgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihnZXRNYW5hZ2VkQmVhbih0aGlzKSwgZ2V0T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoZXguZ2V0TWVzc2FnZSgpLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB1bnJlZ2lzdGVyTUJlYW5zKCkgeworICAgICAgICBpZiAobXNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKGdldE9iamVjdE5hbWUoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjdXJyZW50IENhdGFsaW5hIE1CZWFuIFNlcnZlciBhbmQgbG9hZCBtYmVhbiByZWdpc3RyeQorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIHNlcnZlcgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIE1CZWFuU2VydmVyIGdldE1CZWFuU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChNQmVhblNlcnZlckZhY3RvcnkuZmluZE1CZWFuU2VydmVyKG51bGwpLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtc2VydmVyID0gKE1CZWFuU2VydmVyKSBNQmVhblNlcnZlckZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kTUJlYW5TZXJ2ZXIobnVsbCkuZ2V0KDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtc2VydmVyID0gTUJlYW5TZXJ2ZXJGYWN0b3J5LmNyZWF0ZU1CZWFuU2VydmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWdpc3RyeSA9IFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpOworICAgICAgICAgICAgcmVnaXN0cnkubG9hZE1ldGFkYXRhKHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAibWJlYW5zLWRlc2NyaXB0b3JzLnhtbCIpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG1zZXJ2ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIE1vZGVsTUJlYW4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqZWN0CisgICAgICogICAgICAgICAgICBUaGUgT2JqZWN0IHRvIGdldCB0aGUgTW9kZWxNQmVhbiBmb3IKKyAgICAgKiBAcmV0dXJuIFRoZSBNb2RlbE1CZWFuCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgdGhpcyBjb25zdHJ1Y3RvcnMgdGhyb3dzIHRoaXMgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIE1vZGVsTUJlYW4gZ2V0TWFuYWdlZEJlYW4oT2JqZWN0IG9iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBudWxsOworICAgICAgICBpZiAocmVnaXN0cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZEJlYW4gPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4ob2JqZWN0CisgICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBtYmVhbiA9IG1hbmFnZWRCZWFuLmNyZWF0ZU1CZWFuKG9iamVjdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1iZWFuOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdE5hbWUoT2JqZWN0TmFtZSBuYW1lKSB7CisgICAgICAgIG9iamVjdE5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3ROYW1lIGdldE9iamVjdE5hbWUoKSB7CisgICAgICAgIHJldHVybiBvYmplY3ROYW1lOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVwcmVjYXRlZAorCisgICAgLyoqCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLkNsdXN0ZXIjc2V0UHJvdG9jb2woamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm90b2NvbChTdHJpbmcgcHJvdG9jb2wpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuQ2x1c3RlciNnZXRQcm90b2NvbCgpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLkNsdXN0ZXIjc3RhcnRDb250ZXh0KGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRDb250ZXh0KFN0cmluZyBjb250ZXh0UGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLkNsdXN0ZXIjaW5zdGFsbENvbnRleHQoamF2YS5sYW5nLlN0cmluZywgamF2YS5uZXQuVVJMKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluc3RhbGxDb250ZXh0KFN0cmluZyBjb250ZXh0UGF0aCwgVVJMIHdhcikgeworICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuQ2x1c3RlciNzdG9wKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcChTdHJpbmcgY29udGV4dFBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvU29ja2V0UmVwbGljYXRpb25MaXN0ZW5lci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9Tb2NrZXRSZXBsaWNhdGlvbkxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk0ODY1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvU29ja2V0UmVwbGljYXRpb25MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBTb2NrZXRSZXBsaWNhdGlvbkxpc3RlbmVyIGV4dGVuZHMgQ2x1c3RlclJlY2VpdmVyQmFzZSB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YXRpY3MKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5CisgICAgICAgICAgICAuZ2V0TG9nKFNvY2tldFJlcGxpY2F0aW9uTGlzdGVuZXIuY2xhc3MpOworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0gU3RyaW5nTWFuYWdlcgorICAgICAgICAgICAgLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworICAgCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAiU29ja2V0UmVwbGljYXRpb25MaXN0ZW5lci8xLjIiOworCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIHByaXZhdGUgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG51bGw7CisKKyAgICBwcml2YXRlIGludCB0Y3BMaXN0ZW5NYXhQb3J0IDsKKyAgICAKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBPbmUgc2Vjb25kIHRpbWVvdXQgdG8gd2FpdCB0aGF0IHNvY2tldCBzdGFydGVkCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgdGNwTGlzdGVuVGltZW91dCA9IDEgOworICAgIAorICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKyAgICBwdWJsaWMgU29ja2V0UmVwbGljYXRpb25MaXN0ZW5lcigpIHsKKyAgICB9CisKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisgICAgICAgIHJldHVybiAoaW5mbyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGNwTGlzdGVuTWF4UG9ydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRjcExpc3Rlbk1heFBvcnQoKSB7CisgICAgICAgIHJldHVybiB0Y3BMaXN0ZW5NYXhQb3J0OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbWF4TGlzdGVuUG9ydCBUaGUgdGNwTGlzdGVuTWF4UG9ydCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGNwTGlzdGVuTWF4UG9ydChpbnQgbWF4TGlzdGVuUG9ydCkgeworICAgICAgICB0aGlzLnRjcExpc3Rlbk1heFBvcnQgPSBtYXhMaXN0ZW5Qb3J0OworICAgIH0KKyAgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0Y3BMaXN0ZW5UaW1lb3V0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0VGNwTGlzdGVuVGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIHRjcExpc3RlblRpbWVvdXQ7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSB0Y3BMaXN0ZW5UaW1lb3V0IFRoZSB0Y3BMaXN0ZW5UaW1lb3V0IHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUY3BMaXN0ZW5UaW1lb3V0KGludCB0Y3BMaXN0ZW5UaW1lb3V0KSB7CisgICAgICAgIHRoaXMudGNwTGlzdGVuVGltZW91dCA9IHRjcExpc3RlblRpbWVvdXQ7CisgICAgfQorCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHVibGljIG1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFdhaXQgdGhlIGNyZWF0ZVNlcnZlclNvY2tldCBmaW5kIHRoZSBjb3JyZWN0IHNvY2tldCBwb3J0IHdoZW4gZGVmYXVsdCBjb25maWcgaXMgdXNlZC4KKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyUmVjZWl2ZXIjc3RhcnQoKQorICAgICAqIEBzZWUgI2NyZWF0ZVNlcnZlclNvY2tldCgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIHN1cGVyLnN0YXJ0KCk7CisgICAgICAgIGxvbmcgcmVxU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9uZyByZXFOb3cgPSAwIDsKKyAgICAgICAgYm9vbGVhbiBpc1RpbWVvdXQgPSBmYWxzZSA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBzbGVlcCkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVxTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpc1RpbWVvdXQgPSAoKHJlcU5vdyAtIHJlcVN0YXJ0KSA+ICgxMDAwICogZ2V0VGNwTGlzdGVuVGltZW91dCgpKSk7CisgICAgICAgIH0gd2hpbGUgKCFkb0xpc3RlbiAmJiAoIWlzVGltZW91dCkpOworICAgICAgICBpZiAoaXNUaW1lb3V0IHx8ICghZG9MaXN0ZW4pKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJTb2NrZXRSZXBsaWN0aW9uTGlzdGVuZXIudGltZW91dCIsCisgICAgICAgICAgICAgICAgICAgIGdldFRjcExpc3RlbkFkZHJlc3MoKSxJbnRlZ2VyLnRvU3RyaW5nKGdldFRjcExpc3RlblBvcnQoKSksCisgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcocmVxTm93IC0gcmVxU3RhcnQpLCBCb29sZWFuLnRvU3RyaW5nKGRvTGlzdGVuKSkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3RlY3RlZCBtZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBNYXN0ZXIvU2xhdmUgU2VuZGVyIGhhbmRsaW5nIC8gYmluZCBTZXJ2ZXIgU29ja2V0IGF0IGFkZHJlcyBhbmQgcG9ydAorICAgICAqIAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbGlzdGVuKCkgeworICAgICAgICBpZiAoZG9MaXN0ZW4pIHsKKyAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiU29ja2V0UmVwbGljdGlvbkxpc3RlbmVyLmFsbHJlYWR5RXhpc3RzIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0VGNwTGlzdGVuQWRkcmVzcygpLEludGVnZXIudG9TdHJpbmcoZ2V0VGNwTGlzdGVuUG9ydCgpKSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IHRoZSBhc3NvY2lhdGVkIFNlcnZlclNvY2tldCB0byBiaW5kIGl0IHdpdGgKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlcnZlclNvY2tldCA9IGNyZWF0ZVNlcnZlclNvY2tldCgpOworICAgICAgICAgICAgaWYoc2VydmVyU29ja2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkb0xpc3RlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgd2hpbGUgKGRvTGlzdGVuKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXQgc29ja2V0ID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvTGlzdGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0UmVwbGljYXRpb25UaHJlYWQgdCA9IG5ldyBTb2NrZXRSZXBsaWNhdGlvblRocmVhZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zZXREYWVtb24odHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiU29ja2V0UmVwbGljdGlvbkxpc3RlbmVyLmFjY2VwdC5mYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGNwTGlzdGVuQWRkcmVzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGdldFRjcExpc3RlblBvcnQoKSkpLCBpZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2cuZmF0YWwoc20uZ2V0U3RyaW5nKCJTb2NrZXRSZXBsaWN0aW9uTGlzdGVuZXIuc2VydmVyU29ja2V0Lm5vdEV4aXN0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRUY3BMaXN0ZW5BZGRyZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGdldFRjcExpc3RlblBvcnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGdldFRjcExpc3Rlbk1heFBvcnQoKSkpKTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlleCkgeworICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nKCJTb2NrZXRSZXBsaWN0aW9uTGlzdGVuZXIub3BlbmNsb3NlLmZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICBnZXRUY3BMaXN0ZW5BZGRyZXNzKCksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoZ2V0VGNwTGlzdGVuUG9ydCgpKSksIGlleCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBkb0xpc3RlbiA9IGZhbHNlOworICAgICAgICAgICAgc2VydmVyU29ja2V0ID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNyZWF0ZSBhIFNlcnZlciBTb2NrZXQgYmV0d2VlbiB0Y3BMaXN0ZW5lclBvcnQgYW5kIHRjcExpc3Rlbk1heFBvcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2VydmVyU29ja2V0IGNyZWF0ZVNlcnZlclNvY2tldCgpIHsKKyAgICAgICAgaW50IHN0YXJ0UG9ydCA9IGdldFRjcExpc3RlblBvcnQoKSA7CisgICAgICAgIGludCBtYXhQb3J0ID0gZ2V0VGNwTGlzdGVuTWF4UG9ydCgpIDsKKyAgICAgICAgSW5ldEFkZHJlc3MgaW5ldCA9IGdldEJpbmQoKSA7CisgICAgICAgIFNlcnZlclNvY2tldCBzU29ja2V0ID0gbnVsbCA7CisgICAgICAgIGlmIChtYXhQb3J0IDwgc3RhcnRQb3J0KQorICAgICAgICAgICAgbWF4UG9ydCA9IHN0YXJ0UG9ydDsKKyAgICAgICAgZm9yKCBpbnQgaT1zdGFydFBvcnQ7IGk8PW1heFBvcnQ7IGkrKyApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYoIGluZXQgPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgc1NvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoIGksIDAgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzU29ja2V0PW5ldyBTZXJ2ZXJTb2NrZXQoIGksIDAsIGluZXQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0VGNwTGlzdGVuUG9ydChpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gY2F0Y2goIElPRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJTb2NrZXRSZXBsaWN0aW9uTGlzdGVuZXIucG9ydGJ1c3kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZXQuZ2V0SG9zdEFkZHJlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGkpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleC50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoc1NvY2tldCAhPSBudWxsICYmIGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoIlNvY2tldFJlcGxpY3Rpb25MaXN0ZW5lci5vcGVuIiwKKyAgICAgICAgICAgICAgICAgICAgaW5ldC5nZXRIb3N0QWRkcmVzcygpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGdldFRjcExpc3RlblBvcnQoKSkpKTsKKyAgICAgICAgcmV0dXJuIHNTb2NrZXQgOworICAgfQorCisgICAgLyoqCisgICAgICogTmVlZCB0byBjcmVhdGUgYSBjb25uZWN0aW9uIHRvIHVubG9jayB0aGUgU2VydmVyU29ja2VyI2FjY2VwdCgpLiBWZXJ5CisgICAgICogZmluZSB0cmljayBmcm9tIGNoYW5uZWxTb2NrZXQgOi0pICBTZWUKKyAgICAgKiBvcmcuYXBhY2hlLmprLmNvbW1vbi5DaGFubmVsU29ja2V0J3MgdW5Mb2NrU29ja2V0IG1ldGhvZCAoaXQncyBwcml2YXRlLAorICAgICAqIHNvIHlvdSBtYXkgbmVlZCB0byBpbnNwZWN0IHRoZSBzb3VyY2UpLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHVuTG9ja1NvY2tldCgpIHsKKyAgICAgICAgU29ja2V0IHMgPSBudWxsOworICAgICAgICBJbmV0QWRkcmVzcyBsYWRyID0gZ2V0QmluZCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobGFkciA9PSBudWxsIHx8ICIwLjAuMC4wIi5lcXVhbHMobGFkci5nZXRIb3N0QWRkcmVzcygpKSkgeworICAgICAgICAgICAgICAgIGxhZHIgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMgPSBuZXcgU29ja2V0KGxhZHIsIGdldFRjcExpc3RlblBvcnQoKSk7CisgICAgICAgICAgICAvLyBzZXR0aW5nIHNvTGluZ2VyIHRvIGEgc21hbGwgdmFsdWUgd2lsbCBoZWxwIHNodXRkb3duIHRoZQorICAgICAgICAgICAgLy8gY29ubmVjdGlvbiBxdWlja2VyCisgICAgICAgICAgICBzLnNldFNvTGluZ2VyKHRydWUsIDApOworCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlleCkgeworICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nKCJTb2NrZXRSZXBsaWN0aW9uTGlzdGVuZXIudW5sb2NrU29ja2V0LmZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICBnZXRUY3BMaXN0ZW5BZGRyZXNzKCksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoZ2V0VGNwTGlzdGVuUG9ydCgpKSksIGlleCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2Ugc2VydmVyU29ja2V0cworICAgICAqIEZJWE1FIHRoZSBjaGFubmVsU29ja2V0IHRvIGNvbm5lY3Qgb3duIHNvY2tldCB0byB0ZXJtaW5hdGUgYWNjcGV0IGxvb3AhCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3RvcExpc3RlbmluZygpIHsKKyAgICAgICAgdW5Mb2NrU29ja2V0KCk7CisgICAgICAgIGRvTGlzdGVuID0gZmFsc2U7CisgICAgfQorICAgIAorIH0KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvU29ja2V0UmVwbGljYXRpb25UaHJlYWQuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvU29ja2V0UmVwbGljYXRpb25UaHJlYWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGRiYzEzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9Tb2NrZXRSZXBsaWNhdGlvblRocmVhZC5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmlvLkxpc3RlbkNhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5pby5Tb2NrZXRPYmplY3RSZWFkZXI7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogRklYTUUgVGhyZWFkUG9vbGluZworICogRklYTUUgU29ja2V0IHRpbWVvdXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgU29ja2V0UmVwbGljYXRpb25UaHJlYWQgZXh0ZW5kcyBUaHJlYWQgaW1wbGVtZW50cyBMaXN0ZW5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkKKyAgICAgICAgICAgIC5nZXRMb2coU29ja2V0UmVwbGljYXRpb25UaHJlYWQuY2xhc3MpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIEFDS19DT01NQU5EID0gbmV3IGJ5dGVbXSB7IDYsIDIsIDMgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudCA9IDA7CisKKyAgICBwcml2YXRlIFNvY2tldFJlcGxpY2F0aW9uTGlzdGVuZXIgbWFzdGVyOworCisgICAgcHJpdmF0ZSBTb2NrZXQgc29ja2V0OworCisgICAgcHJpdmF0ZSBTb2NrZXRPYmplY3RSZWFkZXIgcmVhZGVyOworCisgICAgcHJpdmF0ZSBib29sZWFuIGtlZXBSdW5uaW5nID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEZvcmsgTGlzdGVuIFdvcmtlciBUaHJlYWQhCisgICAgICogCisgICAgICogQHBhcmFtIHNvY2tldAorICAgICAqIEBwYXJhbSByZWFkZXIKKyAgICAgKiBAcGFyYW0gc2VuZEFjaworICAgICAqLworICAgIFNvY2tldFJlcGxpY2F0aW9uVGhyZWFkKFNvY2tldFJlcGxpY2F0aW9uTGlzdGVuZXIgbWFzdGVyLCBTb2NrZXQgc29ja2V0CisgICAgICAgICAgICkgeworICAgICAgICBzdXBlcigiQ2x1c3Rlckxpc3RlblRocmVhZC0iICsgY291bnQrKyk7CisgICAgICAgIHRoaXMubWFzdGVyID0gbWFzdGVyOworICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDsKKyAgICAgICAgdGhpcy5yZWFkZXIgPSAgbmV3IFNvY2tldE9iamVjdFJlYWRlcihzb2NrZXQsdGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVhZCBzZW5kZXIgbWVzc2FnZXMgLyBpcyBtZXNzYWdlIGNvbXBsZXRlIHNlbmQgYWNrIGFuZCB3YWl0IGZvciBuZXh0CisgICAgICogbWVzc2FnZSEKKyAgICAgKiAKKyAgICAgKiBAc2VlIFNvY2tldE9iamVjdFJlYWRlciNhcHBlbmQoYnl0ZVtdLGludCxpbnQpCisgICAgICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgd2hpbGUgKGtlZXBSdW5uaW5nKSB7CisgICAgICAgICAgICAgICAgaW50IGNudCA9IGluLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJyZWFkICIgKyBjbnQgKyAiIGJ5dGVzIGZyb20gIiArIHNvY2tldC5nZXRQb3J0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgYWNrID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoY250ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBhY2sgPSByZWFkZXIuYXBwZW5kKGJ1ZmZlciwgMCwgY250KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoInNlbmRpbmcgIiArIGFjayArICIgYWNrIHBhY2thZ2VzIHRvICIgKyBzb2NrZXQuZ2V0TG9jYWxQb3J0KCkgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBrZWVwUnVubmluZyA9IG1hc3Rlci5pc0RvTGlzdGVuKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIC8vIEVPRgorICAgICAgICAgICAgICAgICAgICBrZWVwUnVubmluZyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzOiBub3JtYWwgc2h1dGRvd24gb3Igc3RvcCBsaXN0ZW4gc29ja2V0IAorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byByZWFkIGRhdGEgZnJvbSBjbGllbnQsIGRpc2Nvbm5lY3RpbmcuIiwgeCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBmaW5pc2ggc29ja2V0CisgICAgICAgICAgICBpZiAoc29ja2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZWVwUnVubmluZyA9IGZhbHNlOworICAgICAgICAgICAgc29ja2V0ID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlRGF0YVJlY2VpdmVkKENsdXN0ZXJEYXRhIGRhdGEpIHsKKyAgICAgICAgbWFzdGVyLm1lc3NhZ2VEYXRhUmVjZWl2ZWQoZGF0YSk7CisgICAgfSAgIAorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzU2VuZEFjaygpIHsKKyAgICAgICAgcmV0dXJuIG1hc3Rlci5pc1NlbmRBY2soKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogc2VuZCBhIHJlcGx5LWFja25vd2xlZGdlbWVudAorICAgICAqIAorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRBY2soKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZShBQ0tfQ09NTUFORCk7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLnRyYWNlKCJBQ0sgc2VudCB0byAiICsgc29ja2V0LmdldFBvcnQoKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvU29ja2V0U2VuZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1NvY2tldFNlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MDcwMDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1NvY2tldFNlbmRlci5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3A7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKKworLyoqCisgKiBTZW5kIGNsdXN0ZXIgbWVzc2FnZXMgc3luYyB0byByZXF1ZXN0IHdpdGggb25seSBvbmUgc29ja2V0LgorICogCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAxLjIKKyAqLworCitwdWJsaWMgY2xhc3MgU29ja2V0U2VuZGVyIGV4dGVuZHMgRGF0YVNlbmRlciB7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJTb2NrZXRTZW5kZXIvMS4yIjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKyAgIAorICAgLyoqCisgICAgKiBAcGFyYW0gZG9tYWluIHJlcGxpY2F0aW9uIGNsdXN0ZXIgZG9tYWluIChzZXNzaW9uIGRvbWFpbikKKyAgICAqIEBwYXJhbSBob3N0IHJlcGxpY2F0aW9uIG5vZGUgdGNwIGFkZHJlc3MKKyAgICAqIEBwYXJhbSBwb3J0IHJlcGxpY2F0aW9uIG5vZGUgdGNwIHBvcnQKKyAgICAqLworICAgIHB1YmxpYyBTb2NrZXRTZW5kZXIoU3RyaW5nIGRvbWFpbixJbmV0QWRkcmVzcyBob3N0LCBpbnQgcG9ydCkgeworICAgICAgICBzdXBlcihkb21haW4saG9zdCwgcG9ydCk7CisgICAgfQorCisgICAgcHVibGljIFNvY2tldFNlbmRlcihTdHJpbmcgZG9tYWluLEluZXRBZGRyZXNzIGhvc3QsIGludCBwb3J0LCBTZW5kZXJTdGF0ZSBzdGF0ZSkgeworICAgICAgICBzdXBlcihkb21haW4saG9zdCwgcG9ydCwgc3RhdGUpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24gYW5kIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiU29ja2V0U2VuZGVyWyIpOworICAgICAgICBidWYuYXBwZW5kKGdldEFkZHJlc3MoKSkuYXBwZW5kKCI6IikuYXBwZW5kKGdldFBvcnQoKSkuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvVGNwUmVwbGljYXRpb25UaHJlYWQuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvVGNwUmVwbGljYXRpb25UaHJlYWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWUzYmIxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9UY3BSZXBsaWNhdGlvblRocmVhZC5qYXZhCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5pby5PYmplY3RSZWFkZXI7CisKKy8qKgorICogQSB3b3JrZXIgdGhyZWFkIGNsYXNzIHdoaWNoIGNhbiBkcmFpbiBjaGFubmVscyBhbmQgZWNoby1iYWNrIHRoZSBpbnB1dC4gRWFjaAorICogaW5zdGFuY2UgaXMgY29uc3RydWN0ZWQgd2l0aCBhIHJlZmVyZW5jZSB0byB0aGUgb3duaW5nIHRocmVhZCBwb29sIG9iamVjdC4KKyAqIFdoZW4gc3RhcnRlZCwgdGhlIHRocmVhZCBsb29wcyBmb3JldmVyIHdhaXRpbmcgdG8gYmUgYXdha2VuZWQgdG8gc2VydmljZSB0aGUKKyAqIGNoYW5uZWwgYXNzb2NpYXRlZCB3aXRoIGEgU2VsZWN0aW9uS2V5IG9iamVjdC4gVGhlIHdvcmtlciBpcyB0YXNrZWQgYnkKKyAqIGNhbGxpbmcgaXRzIHNlcnZpY2VDaGFubmVsKCkgbWV0aG9kIHdpdGggYSBTZWxlY3Rpb25LZXkgb2JqZWN0LiBUaGUKKyAqIHNlcnZpY2VDaGFubmVsKCkgbWV0aG9kIHN0b3JlcyB0aGUga2V5IHJlZmVyZW5jZSBpbiB0aGUgdGhyZWFkIG9iamVjdCB0aGVuCisgKiBjYWxscyBub3RpZnkoKSB0byB3YWtlIGl0IHVwLiBXaGVuIHRoZSBjaGFubmVsIGhhcyBiZWVuIGRyYWluZWQsIHRoZSB3b3JrZXIKKyAqIHRocmVhZCByZXR1cm5zIGl0c2VsZiB0byBpdHMgcGFyZW50IHBvb2wuCisgKiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIAorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBUY3BSZXBsaWNhdGlvblRocmVhZCBleHRlbmRzIFdvcmtlclRocmVhZCB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gQUNLX0NPTU1BTkQgPSBuZXcgYnl0ZVtdIHs2LCAyLCAzfTsKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFRjcFJlcGxpY2F0aW9uVGhyZWFkLmNsYXNzICk7CisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUgKDEwMjQpOworICAgIHByaXZhdGUgU2VsZWN0aW9uS2V5IGtleTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc2VuZEFjaz10cnVlOworCisgICAgCisgICAgVGNwUmVwbGljYXRpb25UaHJlYWQgKCkKKyAgICB7CisgICAgfQorCisgICAgLy8gbG9vcCBmb3JldmVyIHdhaXRpbmcgZm9yIHdvcmsgdG8gZG8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcnVuKCkKKyAgICB7CisgICAgICAgIHdoaWxlIChkb1J1bikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBzbGVlcCBhbmQgcmVsZWFzZSBvYmplY3QgbG9jaworICAgICAgICAgICAgICAgIHRoaXMud2FpdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJUQ1Agd29ya2VyIHRocmVhZCBpbnRlcnJ1cHRlZCBpbiBjbHVzdGVyIixlKTsKKyAgICAgICAgICAgICAgICAvLyBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzCisgICAgICAgICAgICAgICAgVGhyZWFkLmludGVycnVwdGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsJLy8ganVzdCBpbiBjYXNlCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRyYWluQ2hhbm5lbCAoa2V5KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy90aGlzIGlzIGNvbW1vbiwgc2luY2UgdGhlIHNvY2tldHMgb24gdGhlIG90aGVyCisgICAgICAgICAgICAgICAgLy9lbmQgZXhwaXJlIGFmdGVyIGEgY2VydGFpbiB0aW1lLgorICAgICAgICAgICAgICAgIGlmICggZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uICkgeworICAgICAgICAgICAgICAgICAgICAvL2RvbnQgc3BldyBvdXQgc3RhY2sgdHJhY2VzIGZvciBJTyBleGNlcHRpb25zIHVubGVzcyBkZWJ1ZyBpcyBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZyAoIklPRXhjZXB0aW9uIGluIHJlcGxpY2F0aW9uIHdvcmtlciwgdW5hYmxlIHRvIGRyYWluIGNoYW5uZWwuIFByb2JhYmxlIGNhdXNlOiBLZWVwIGFsaXZlIHNvY2tldCBjbG9zZWQuIiwgZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggbG9nLmlzRXJyb3JFbmFibGVkKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBpcyBhIHJlYWwgZXJyb3IsIGxvZyBpdC4KKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFeGNlcHRpb24gY2F1Z2h0IGluIFRjcFJlcGxpY2F0aW9uVGhyZWFkLmRyYWluQ2hhbm5lbC4iLGUpOworICAgICAgICAgICAgICAgIH0gCisKKyAgICAgICAgICAgICAgICAvLyBjbG9zZSBjaGFubmVsIGFuZCBudWRnZSBzZWxlY3RvcgorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGtleS5jaGFubmVsKCkuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBjbG9zZSBjaGFubmVsLiIsZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBrZXkuc2VsZWN0b3IoKS53YWtldXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtleSA9IG51bGw7CisgICAgICAgICAgICAvLyBkb25lLCByZWFkeSBmb3IgbW9yZSwgcmV0dXJuIHRvIHBvb2wKKyAgICAgICAgICAgIHRoaXMucG9vbC5yZXR1cm5Xb3JrZXIgKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGluaXRpYXRlIGEgdW5pdCBvZiB3b3JrIGJ5IHRoaXMgd29ya2VyIHRocmVhZAorICAgICAqIG9uIHRoZSBwcm92aWRlZCBTZWxlY3Rpb25LZXkgb2JqZWN0LiAgVGhpcyBtZXRob2QgaXMKKyAgICAgKiBzeW5jaHJvbml6ZWQsIGFzIGlzIHRoZSBydW4oKSBtZXRob2QsIHNvIG9ubHkgb25lIGtleQorICAgICAqIGNhbiBiZSBzZXJ2aWNlZCBhdCBhIGdpdmVuIHRpbWUuCisgICAgICogQmVmb3JlIHdha2luZyB0aGUgd29ya2VyIHRocmVhZCwgYW5kIGJlZm9yZSByZXR1cm5pbmcKKyAgICAgKiB0byB0aGUgbWFpbiBzZWxlY3Rpb24gbG9vcCwgdGhpcyBrZXkncyBpbnRlcmVzdCBzZXQgaXMKKyAgICAgKiB1cGRhdGVkIHRvIHJlbW92ZSBPUF9SRUFELiAgVGhpcyB3aWxsIGNhdXNlIHRoZSBzZWxlY3RvcgorICAgICAqIHRvIGlnbm9yZSByZWFkLXJlYWRpbmVzcyBmb3IgdGhpcyBjaGFubmVsIHdoaWxlIHRoZQorICAgICAqIHdvcmtlciB0aHJlYWQgaXMgc2VydmljaW5nIGl0LgorICAgICAqLworICAgIHN5bmNocm9uaXplZCB2b2lkIHNlcnZpY2VDaGFubmVsIChTZWxlY3Rpb25LZXkga2V5LCBib29sZWFuIHNlbmRBY2spCisgICAgeworICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAgdGhpcy5zZW5kQWNrPXNlbmRBY2s7CisgICAgICAgIGtleS5pbnRlcmVzdE9wcyAoa2V5LmludGVyZXN0T3BzKCkgJiAoflNlbGVjdGlvbktleS5PUF9SRUFEKSk7CisgICAgICAgIGtleS5pbnRlcmVzdE9wcyAoa2V5LmludGVyZXN0T3BzKCkgJiAoflNlbGVjdGlvbktleS5PUF9XUklURSkpOworICAgICAgICB0aGlzLm5vdGlmeSgpOwkJLy8gYXdha2VuIHRoZSB0aHJlYWQKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWN0dWFsIGNvZGUgd2hpY2ggZHJhaW5zIHRoZSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBnaXZlbiBrZXkuICBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoZSBrZXkgaGFzIGJlZW4KKyAgICAgKiBtb2RpZmllZCBwcmlvciB0byBpbnZvY2F0aW9uIHRvIHR1cm4gb2ZmIHNlbGVjdGlvbgorICAgICAqIGludGVyZXN0IGluIE9QX1JFQUQuICBXaGVuIHRoaXMgbWV0aG9kIGNvbXBsZXRlcyBpdAorICAgICAqIHJlLWVuYWJsZXMgT1BfUkVBRCBhbmQgY2FsbHMgd2FrZXVwKCkgb24gdGhlIHNlbGVjdG9yCisgICAgICogc28gdGhlIHNlbGVjdG9yIHdpbGwgcmVzdW1lIHdhdGNoaW5nIHRoaXMgY2hhbm5lbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkcmFpbkNoYW5uZWwgKFNlbGVjdGlvbktleSBrZXkpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGJvb2xlYW4gcGFja2V0UmVjZWl2ZWQ9ZmFsc2U7CisgICAgICAgIFNvY2tldENoYW5uZWwgY2hhbm5lbCA9IChTb2NrZXRDaGFubmVsKSBrZXkuY2hhbm5lbCgpOworICAgICAgICBpbnQgY291bnQ7CisgICAgICAgIGJ1ZmZlci5jbGVhcigpOwkJCS8vIG1ha2UgYnVmZmVyIGVtcHR5CisgICAgICAgIE9iamVjdFJlYWRlciByZWFkZXIgPSAoT2JqZWN0UmVhZGVyKWtleS5hdHRhY2htZW50KCk7CisgICAgICAgIC8vIGxvb3Agd2hpbGUgZGF0YSBhdmFpbGFibGUsIGNoYW5uZWwgaXMgbm9uLWJsb2NraW5nCisgICAgICAgIHdoaWxlICgoY291bnQgPSBjaGFubmVsLnJlYWQgKGJ1ZmZlcikpID4gMCkgeworICAgICAgICAgICAgYnVmZmVyLmZsaXAoKTsJCS8vIG1ha2UgYnVmZmVyIHJlYWRhYmxlCisgICAgICAgICAgICByZWFkZXIuYXBwZW5kKGJ1ZmZlci5hcnJheSgpLDAsY291bnQpOworICAgICAgICAgICAgYnVmZmVyLmNsZWFyKCk7CQkvLyBtYWtlIGJ1ZmZlciBlbXB0eQorICAgICAgICB9CisgICAgICAgIC8vY2hlY2sgdG8gc2VlIGlmIGFueSBkYXRhIGlzIGF2YWlsYWJsZQorICAgICAgICBpbnQgcGtnY250ID0gcmVhZGVyLmV4ZWN1dGUoKTsKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cudHJhY2UoInNlbmRpbmcgIiArIHBrZ2NudCArICIgYWNrIHBhY2thZ2VzIHRvICIgKyBjaGFubmVsLnNvY2tldCgpLmdldExvY2FsUG9ydCgpICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChzZW5kQWNrKSB7CisgICAgICAgICAgICB3aGlsZSAoIHBrZ2NudCA+IDAgKSB7CisgICAgICAgICAgICAgICAgc2VuZEFjayhrZXksY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgcGtnY250LS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChjb3VudCA8IDApIHsKKyAgICAgICAgICAgIC8vIGNsb3NlIGNoYW5uZWwgb24gRU9GLCBpbnZhbGlkYXRlcyB0aGUga2V5CisgICAgICAgICAgICBjaGFubmVsLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vYWNxdWlyZSB0aGUgaW50ZXJlc3RPcHMgbXV0ZXgKKyAgICAgICAgT2JqZWN0IG11dGV4ID0gdGhpcy5nZXRQb29sKCkuZ2V0SW50ZXJlc3RPcHNNdXRleCgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG11dGV4KSB7CisgICAgICAgICAgICAvLyBjeWNsZSB0aGUgc2VsZWN0b3Igc28gdGhpcyBrZXkgaXMgYWN0aXZlIGFnYWluCisgICAgICAgICAgICBrZXkuc2VsZWN0b3IoKS53YWtldXAoKTsKKyAgICAgICAgICAgIC8vIHJlc3VtZSBpbnRlcmVzdCBpbiBPUF9SRUFELCBPUF9XUklURQorICAgICAgICAgICAgaW50IHJlc3VtZU9wcyA9IGtleS5pbnRlcmVzdE9wcygpIHwgU2VsZWN0aW9uS2V5Lk9QX1JFQUQ7CisgICAgICAgICAgICBrZXkuaW50ZXJlc3RPcHMocmVzdW1lT3BzKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZW5kIGEgcmVwbHktYWNrbm93bGVkZ2VtZW50ICg2LDIsMykKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogQHBhcmFtIGNoYW5uZWwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kQWNrKFNlbGVjdGlvbktleSBrZXksIFNvY2tldENoYW5uZWwgY2hhbm5lbCkgeworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoYW5uZWwud3JpdGUoQnl0ZUJ1ZmZlci53cmFwKEFDS19DT01NQU5EKSk7CisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cudHJhY2UoIkFDSyBzZW50IHRvICIgKyBjaGFubmVsLnNvY2tldCgpLmdldFBvcnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKCBqYXZhLmlvLklPRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBsb2cud2FybigiVW5hYmxlIHRvIHNlbmQgQUNLIGJhY2sgdGhyb3VnaCBjaGFubmVsLCBjaGFubmVsIGRpc2Nvbm5lY3RlZD86ICIreC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9UaHJlYWRQb29sLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1RocmVhZFBvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTcyY2VmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9UaHJlYWRQb29sLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIG5vdCBhdHRyaWJ1dGFibGUKKyAqIEB2ZXJzaW9uIDEuMAorICovCisKK3B1YmxpYyBjbGFzcyBUaHJlYWRQb29sCit7CisgICAgLyoqCisgICAgICogQSB2ZXJ5IHNpbXBsZSB0aHJlYWQgcG9vbCBjbGFzcy4gIFRoZSBwb29sIHNpemUgaXMgc2V0IGF0CisgICAgICogY29uc3RydWN0aW9uIHRpbWUgYW5kIHJlbWFpbnMgZml4ZWQuICBUaHJlYWRzIGFyZSBjeWNsZWQKKyAgICAgKiB0aHJvdWdoIGEgRklGTyBpZGxlIHF1ZXVlLgorICAgICAqLworCisgICAgTGlzdCBpZGxlID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICBPYmplY3QgbXV0ZXggPSBuZXcgT2JqZWN0KCk7CisgICAgT2JqZWN0IGludGVyZXN0T3BzTXV0ZXggPSBudWxsOworCisgICAgVGhyZWFkUG9vbCAoaW50IHBvb2xTaXplLCBDbGFzcyB0aHJlYWRDbGFzcywgT2JqZWN0IGludGVyZXN0T3BzTXV0ZXgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBmaWxsIHVwIHRoZSBwb29sIHdpdGggd29ya2VyIHRocmVhZHMKKyAgICAgICAgdGhpcy5pbnRlcmVzdE9wc011dGV4ID0gaW50ZXJlc3RPcHNNdXRleDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb29sU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBXb3JrZXJUaHJlYWQgdGhyZWFkID0gKFdvcmtlclRocmVhZCl0aHJlYWRDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgdGhyZWFkLnNldFBvb2wodGhpcyk7CisKKyAgICAgICAgICAgIC8vIHNldCB0aHJlYWQgbmFtZSBmb3IgZGVidWdnaW5nLCBzdGFydCBpdAorICAgICAgICAgICAgdGhyZWFkLnNldE5hbWUgKHRocmVhZENsYXNzLmdldE5hbWUoKSsiWyIgKyAoaSArIDEpKyJdIik7CisgICAgICAgICAgICB0aHJlYWQuc2V0RGFlbW9uKHRydWUpOworICAgICAgICAgICAgdGhyZWFkLnNldFByaW9yaXR5KFRocmVhZC5NQVhfUFJJT1JJVFkpOworICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIGlkbGUuYWRkICh0aHJlYWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBhbiBpZGxlIHdvcmtlciB0aHJlYWQsIGlmIGFueS4gIENvdWxkIHJldHVybiBudWxsLgorICAgICAqLworICAgIFdvcmtlclRocmVhZCBnZXRXb3JrZXIoKQorICAgIHsKKyAgICAgICAgV29ya2VyVGhyZWFkIHdvcmtlciA9IG51bGw7CisKKyAgICAgICAgCisgICAgICAgIHN5bmNocm9uaXplZCAobXV0ZXgpIHsKKyAgICAgICAgICAgIHdoaWxlICggd29ya2VyID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgaWYgKGlkbGUuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyID0gKFdvcmtlclRocmVhZCkgaWRsZS5yZW1vdmUoMCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZSBubyBhdmFpbGFibGUgd29ya2VycworICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7IG11dGV4LndhaXQoKTsgfSBjYXRjaCAoIGphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiB4ICkge30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHdvcmtlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSB3b3JrZXIgdGhyZWFkIHRvIHJldHVybiBpdHNlbGYgdG8gdGhlCisgICAgICogaWRsZSBwb29sLgorICAgICAqLworICAgIHZvaWQgcmV0dXJuV29ya2VyIChXb3JrZXJUaHJlYWQgd29ya2VyKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtdXRleCkgeworICAgICAgICAgICAgaWRsZS5hZGQgKHdvcmtlcik7CisgICAgICAgICAgICBtdXRleC5ub3RpZnkoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgT2JqZWN0IGdldEludGVyZXN0T3BzTXV0ZXgoKSB7CisgICAgICAgIHJldHVybiBpbnRlcmVzdE9wc011dGV4OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvV29ya2VyVGhyZWFkLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1dvcmtlclRocmVhZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNTc4YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1dvcmtlclRocmVhZC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3A7CisKKworLyoqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgV29ya2VyVGhyZWFkIGV4dGVuZHMgVGhyZWFkCit7CisgICAgcHJvdGVjdGVkIFRocmVhZFBvb2wgcG9vbDsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb1J1biA9IHRydWU7CisKKworICAgIHB1YmxpYyB2b2lkIHNldFBvb2woVGhyZWFkUG9vbCBwb29sKSB7CisgICAgICAgIHRoaXMucG9vbCA9IHBvb2w7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBUaHJlYWRQb29sIGdldFBvb2woKSB7CisgICAgICAgIHJldHVybiBwb29sOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICB7CisgICAgICAgIGRvUnVuID0gZmFsc2U7CisgICAgICAgIG5vdGlmeSgpOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZmFlNmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSwxMDU4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIG1iZWFucy1kZXNjcmlwdG9ycyBQVUJMSUMKKyAgICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vRFREIE1vZGVsIE1CZWFucyBDb25maWd1cmF0aW9uIEZpbGUiCisgICAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2R0ZHMvbWJlYW5zLWRlc2NyaXB0b3JzLmR0ZCI+Cis8bWJlYW5zLWRlc2NyaXB0b3JzPgorCisgIDxtYmVhbiAgICAgICAgIG5hbWU9IlNpbXBsZVRjcENsdXN0ZXIiCisgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUY3AgQ2x1c3RlciBpbXBsZW1lbnRhdGlvbiIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IkNsdXN0ZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuU2ltcGxlVGNwQ2x1c3RlciI+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImluZm8iCisgICAgICAgICAgZGVzY3JpcHRpb249IkNsYXNzIHZlcnNpb24gaW5mbyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJub3RpZnlMaWZlY3ljbGVMaXN0ZW5lck9uRmFpbHVyZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibm90aWZ5IGxpZmVjeWNsZUxpc3RlbmVyIGZyb20gbWVzc2FnZSB0cmFuc2ZlciBmYWlsdXJlIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPiAgICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsdXN0ZXJOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJuYW1lIG9mIGNsdXN0ZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWFuYWdlckNsYXNzTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2Vzc2lvbiBtYW5hbmFnZXIgY2xhc3NuYW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsdXN0ZXJMb2dOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJOYW1lIG9mIGNsdXN0ZXIgdHJhbnNmZXIgbG9nIGRldmljZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkb0NsdXN0ZXJMb2ciCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJlbmFibGUgY2x1c3RlciBsb2cgdHJhbnNmZXIgbG9nZ2luZyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgIDxvcGVyYXRpb24gICBuYW1lPSJzZXRQcm9wZXJ0eSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZXQgYSBwcm9wZXJ0eSB0byBhbGwgY2x1c3RlciBtYW5hZ2VycyAod2l0aCBwcmVmaXggJ21hbmFnZXIuJykiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJrZXkiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJQcm9wZXJ0eSBuYW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUHJvcGVydHkgdmFsdWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJzZW5kIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InNlbmQgbWVzc2FnZSB0byBhbGwgY2x1c3RlciBtZW1iZXJzIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWVzc2FnZSIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InJlcGxpY2F0aW9uIG1lc3NhZ2UiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWVzc2FnZSIvPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gICBuYW1lPSJzZW5kQ2x1c3RlckRvbWFpbiIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZW5kIG1lc3NhZ2UgdG8gYWxsIGNsdXN0ZXIgbWVtYmVycyB3aXRoIHNhbWUgZG9tYWluIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWVzc2FnZSIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InJlcGxpY2F0aW9uIG1lc3NhZ2UiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWVzc2FnZSIvPgorICAgIDwvb3BlcmF0aW9uPgorICAgICAgICAKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0ic2VuZFRvTWVtYmVyIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InNlbmQgbWVzc2FnZSB0byBvbmUgY2x1c3RlciBtZW1iZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJtZXNzYWdlIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0icmVwbGljYXRpb24gbWVzc2FnZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lbWJlciIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249ImNsdXN0ZXIgbWVtYmVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0ic3RhcnQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhcnQgdGhlIGNsdXN0ZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdG9wIHRoZSBjbHVzdGVyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgCisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iUmVwbGljYXRpb25MaXN0ZW5lciIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IlRjcCBDbHVzdGVyIFJlcGxpY2F0aW9uTGlzdGVuZXIgaW1wbGVtZW50YXRpb24iCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJDbHVzdGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlJlcGxpY2F0aW9uTGlzdGVuZXIiPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJpbmZvIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDbGFzcyB2ZXJzaW9uIGluZm8iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idGNwTGlzdGVuQWRkcmVzcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0idGNwIGxpc3RlbmVyIGFkZHJlc3MiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idGNwTGlzdGVuUG9ydCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0idGNwIGxpc3RlbmVyIHBvcnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0Y3BUaHJlYWRDb3VudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIHRjcCBsaXN0ZW5lciB3b3JrZXIgdGhyZWFkcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InRjcFNlbGVjdG9yVGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0idGNwIGxpc3RlbmVyIFNlbGVjdG9yIHRpbWVvdXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibnJPZk1zZ3NSZWNlaXZlZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gb3RoZXIgbm9kZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVjZWl2ZWRUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJ0b3RhbCB0aW1lIG1lc3NhZ2Ugc2VuZCB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlY2VpdmVkUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InJlY2VpdmVkIHByb2Nlc3NpbmcgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtaW5SZWNlaXZlZFByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtaW5pbWFsIHJlY2VpdmVkIHByb2Nlc3NpbmcgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhdmdSZWNlaXZlZFByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJyZWNlaXZlZCBwcm9jZXNzaW5nIHRpbWUgLyBuck9mUmVxdWVzdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImRvdWJsZSIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhSZWNlaXZlZFByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXhpbWFsIHJlY2VpdmVkIHByb2Nlc3NpbmcgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkb1JlY2VpdmVkUHJvY2Vzc2luZ1N0YXRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjcmVhdGUgcmVjZWl2ZWQgcHJvY2Vzc2luZyB0aW1lIHN0YXRzIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIgLz4gICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImF2Z1RvdGFsUmVjZWl2ZWRCeXRlcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icmVjZWl2ZWQgdG90YWxSZWNlaXZlZEJ5dGVzIC8gbnJPZk1zZ3NSZWNlaXZlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0b3RhbFJlY2VpdmVkQnl0ZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBieXRlcyByZWNlaXZlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzZW5kQWNrIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZW5kIGFjayBhZnRlciBkYXRhIHJlY2VpdmVkIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY29tcHJlc3MiCisgICAgICAgICAgZGVzY3JpcHRpb249ImRhdGEgcmVjZWl2ZWQgY29tcHJlc3NlZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRvTGlzdGVuIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJpcyBwb3J0IHJlYWxseSBzdGFydGVkIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICAgCisJPG9wZXJhdGlvbiBuYW1lPSJyZXNldFN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVzZXQgYWxsIHN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgkKKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJzdGFydCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdGFydCB0aGUgY2x1c3RlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisgICAgCisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0b3AgdGhlIGNsdXN0ZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorICAgICAgICAgICAgICAgICAKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gICAgICAgICBuYW1lPSJTb2NrZXRSZXBsaWNhdGlvbkxpc3RlbmVyIgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGNwIENsdXN0ZXIgU29ja2V0UmVwbGljYXRpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IkNsdXN0ZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuU29ja2V0UmVwbGljYXRpb25MaXN0ZW5lciI+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImluZm8iCisgICAgICAgICAgZGVzY3JpcHRpb249IkNsYXNzIHZlcnNpb24gaW5mbyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0Y3BMaXN0ZW5BZGRyZXNzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJ0Y3AgbGlzdGVuZXIgYWRkcmVzcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0Y3BMaXN0ZW5Qb3J0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJ0Y3AgbGlzdGVuZXIgcG9ydCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InRjcExpc3Rlbk1heFBvcnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1heCB0Y3AgbGlzdGVuIHVzZWQgcG9ydCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InRjcExpc3RlblRpbWVvdXQiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1heCB0Y3AgbGlzdGVuIHRpbWVvdXQgKHNlYykgd2FpdCBmb3IgU2VydmVyU29ja2V0IHN0YXJ0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4gICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5yT2ZNc2dzUmVjZWl2ZWQiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIG90aGVyIG5vZGVzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlY2VpdmVkVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0idG90YWwgdGltZSBtZXNzYWdlIHNlbmQgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyZWNlaXZlZFByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJyZWNlaXZlZCBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWluUmVjZWl2ZWRQcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWluaW1hbCByZWNlaXZlZCBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXZnUmVjZWl2ZWRQcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icmVjZWl2ZWQgcHJvY2Vzc2luZyB0aW1lIC8gbnJPZlJlcXVlc3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJkb3VibGUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4UmVjZWl2ZWRQcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWF4aW1hbCByZWNlaXZlZCBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZG9SZWNlaXZlZFByb2Nlc3NpbmdTdGF0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY3JlYXRlIHJlY2VpdmVkIHByb2Nlc3NpbmcgdGltZSBzdGF0cyIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+ICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhdmdUb3RhbFJlY2VpdmVkQnl0ZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249InJlY2VpdmVkIHRvdGFsUmVjZWl2ZWRCeXRlcyAvIG5yT2ZNc2dzUmVjZWl2ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idG90YWxSZWNlaXZlZEJ5dGVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic2VuZEFjayIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZCBhY2sgYWZ0ZXIgZGF0YSByZWNlaXZlZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisgICA8YXR0cmlidXRlICAgbmFtZT0iY29tcHJlc3MiCisgICAgICAgICAgZGVzY3JpcHRpb249ImRhdGEgcmVjZWl2ZWQgY29tcHJlc3NlZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisgICA8YXR0cmlidXRlICAgbmFtZT0iZG9MaXN0ZW4iCisgICAgICAgICAgZGVzY3JpcHRpb249ImlzIHBvcnQgcmVhbGx5IHN0YXJ0ZWQiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorICAgICAgICAgICAgICAgICAKKwk8b3BlcmF0aW9uIG5hbWU9InJlc2V0U3RhdGlzdGljcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXNldCBhbGwgc3RhdGlzdGljcyIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CQorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InN0YXJ0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0YXJ0IHRoZSBjbHVzdGVyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAKKyAgICA8b3BlcmF0aW9uIG5hbWU9InN0b3AiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RvcCB0aGUgY2x1c3RlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisgICAgICAgICAgICAgICAgIAorICA8L21iZWFuPgorICAKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iUmVwbGljYXRpb25UcmFuc21pdHRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGNwIHJlcGxpY2F0aW9uIHRyYW5zbWl0dGVyIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iQ2x1c3RlclNlbmRlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblRyYW5zbWl0dGVyIj4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iaW5mbyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2xhc3MgdmVyc2lvbiBpbmZvIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlcGxpY2F0aW9uTW9kZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icmVwbGljYXRpb24gbW9kZSAoc3luY2hub3VzLHBvb2xlZC5hc3luY2hub3VzLGZhc3Rhc3luY3F1ZXVlKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhY2tUaW1lb3V0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJhY2tub3dsZWRnZSB0aW1lb3V0IgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImF1dG9Db25uZWN0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJpcyBzZW5kZXIgZGlzYWJsZWQsIGZvcmsgYSBuZXcgc29ja2V0IgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0id2FpdEZvckFjayIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iV2FpdCBmb3IgYWNrIGFmdGVyIGRhdGEgc2VuZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZW5kaW5nIHByb2Nlc3NpbmcgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtaW5Qcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWluaW1hbCBzZW5kaW5nIHByb2Nlc3NpbmcgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhdmdQcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icHJvY2Vzc2luZyB0aW1lIC8gbnJPZlJlcXVlc3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJkb3VibGUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4UHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1heGltYWwgc2VuZGluZyBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZG9UcmFuc21pdHRlclByb2Nlc3NpbmdTdGF0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY3JlYXRlIHByb2Nlc3NpbmcgdGltZSBzdGF0cyIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+ICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJuck9mUmVxdWVzdHMiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBzZW5kIG1lc3NhZ2VzIHRvIG90aGVyIG1lbWJlcnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idG90YWxCeXRlcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVyZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZmFpbHVyZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiB3cm9uZyB0cmFuc2ZlcnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKwk8YXR0cmlidXRlIG5hbWU9InNlbmRlck9iamVjdE5hbWVzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249ImdldCBhbGwgc2VuZGVyIG9iamVjdCBuYW1lcyIKKyAgICAgICAgICAgICAgIHR5cGU9IltMamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8b3BlcmF0aW9uICAgbmFtZT0ic3RhcnQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhcnQgdGhlIGNsdXN0ZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPiAgICAKKyAgICA8b3BlcmF0aW9uIG5hbWU9InN0b3AiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RvcCB0aGUgY2x1c3RlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisJPG9wZXJhdGlvbiBuYW1lPSJyZXNldFN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVzZXQgYWxsIHN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgkKKwk8b3BlcmF0aW9uIG5hbWU9ImNoZWNrS2VlcEFsaXZlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkNoZWNrIGFsbCBzZW5kZXIgY29ubmVjdGlvbiBmb3IgY2xvc2Ugc29ja2V0IChrZWVwYWxpdmUpIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgPC9tYmVhbj4KKworICA8bWJlYW4gICAgICAgICBuYW1lPSJBc3luY1NvY2tldFNlbmRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQXN5bmMgQ2x1c3RlciBTZW5kZXIiCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJJRGF0YVNlbmRlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5Bc3luY1NvY2tldFNlbmRlciI+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImluZm8iCisgICAgICAgICAgZGVzY3JpcHRpb249IkNsYXNzIHZlcnNpb24gaW5mbyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhZGRyZXNzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZW5kZXIgaXAgYWRkcmVzcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5uZXQuSW5ldEFkZHJlc3MiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icG9ydCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGVyIHBvcnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic3VzcGVjdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU29ja2V0IGlzIGdvbmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0id2FpdEZvckFjayIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iV2FpdCBmb3IgYWNrIGFmdGVyIGRhdGEgc2VuZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWNrVGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWNrbm93bGVkZ2UgdGltZW91dCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIvPiAgICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImF2Z01lc3NhZ2VTaXplIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJhdmcgbWVzc2FnZSBzaXplICh0b3RhbGJ5dGVzL25yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJxdWV1ZVNpemUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiCisgICAgICAgICAgZGVzY3JpcHRpb249InF1ZXVlIHNpemUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJxdWV1ZWROck9mQnl0ZXMiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBieXRlcyBvdmVyIGFsbCBxdWV1ZWQgbWVzc2FnZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWVzc2FnZVRyYW5zZmVyU3RhcnRlZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWVzc2FnZSBpcyBpbiB0cmFuc2ZlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ia2VlcEFsaXZlVGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWN0aXZlIHNvY2tldCBrZWVwIGFsaXZlIHRpbWVvdXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ia2VlcEFsaXZlTWF4UmVxdWVzdENvdW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXggcmVxdWVzdCBvdmVyIHRoaXMgc29ja2V0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ia2VlcEFsaXZlQ291bnQiCisgICAgICAgICAgZGVzY3JpcHRpb249ImtlZXAgQWxpdmUgcmVxdWVzdCBjb3VudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtlZXBBbGl2ZUNvbm5lY3RUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb25uZWN0IHRpbWUgZm9yIGtlZXAgYWxpdmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVzZW5kIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJhZnRlciBzZW5kIGZhaWx1cmUgbWFrZSBhIHJlc2VuZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3RlZCIKKyAgICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InNvY2tldCBjb25uZWN0ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibnJPZlJlcXVlc3RzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2Ygc2VuZCBtZXNzYWdlcyB0byBvdGhlciBtZW1iZXJzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InRvdGFsQnl0ZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBieXRlcyB0cmFuc2ZlcmVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZW5kaW5nIHByb2Nlc3NpbmcgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtaW5Qcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWluaW1hbCBzZW5kaW5nIHByb2Nlc3NpbmcgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhdmdQcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icHJvY2Vzc2luZyB0aW1lIC8gbnJPZlJlcXVlc3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJkb3VibGUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4UHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1heGltYWwgc2VuZGluZyBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZG9Qcm9jZXNzaW5nU3RhdHMiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNyZWF0ZSBwcm9jZXNzaW5nIHRpbWUgc3RhdHMiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIiAvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ3YWl0QWNrVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGluZyB3YWl0QWNrIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWluV2FpdEFja1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1pbmltYWwgc2VuZGluZyB3YWl0QWNrIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXZnV2FpdEFja1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IndhaXRBY2sgdGltZSAvIG5yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iZG91YmxlIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heFdhaXRBY2tUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXhpbWFsIHNlbmRpbmcgd2FpdEFjayB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRvV2FpdEFja1N0YXRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjcmVhdGUgd2FpdEFjayB0aW1lIHN0YXRzIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY29ubmVjdENvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBjb25uZWN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkaXNjb25uZWN0Q291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGRpc2Nvbm5lY3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNvY2tldE9wZW5Db3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgb3BlbiBzb2NrZXQgKEtlZXBBbGl2ZSBhbmQgY29ubmVjdHMpIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNvY2tldE9wZW5GYWlsdXJlQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIG9wZW4gc29ja2V0IGZhaWx1cmVzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+ICAgICAgICAgICAgICAgICAJCQkJIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzb2NrZXRDbG9zZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBjbG9zZWQgc29ja2V0IChLZWVwQWxpdmUgYW5kIGRpc2Nvbm5lY3RzKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtaXNzaW5nQWNrQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIG1pc3NpbmcgYWNrIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRhdGFSZXNlbmRDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgZGF0YSByZXNlbmRzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRhdGFGYWlsdXJlQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGRhdGEgc2VuZCBmYWlsdXJlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJpblF1ZXVlQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGFsbCBxdWV1ZWQgbWVzc2FnZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ib3V0UXVldWVDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgYWxsIHN1Y2Nlc3NmdWxseSBzZW5kZWQgbWVzc2FnZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKwk8b3BlcmF0aW9uIG5hbWU9ImNvbm5lY3QiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iY29ubmVjdCB0byBvdGhlciByZXBsaWNhdGlvbiBub2RlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKwk8b3BlcmF0aW9uIG5hbWU9ImRpc2Nvbm5lY3QiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iZGlzY29ubmVjdCB0byBvdGhlciByZXBsaWNhdGlvbiBub2RlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKwk8b3BlcmF0aW9uIG5hbWU9ImNoZWNrS2VlcEFsaXZlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkNoZWNrIGNvbm5lY3Rpb24gZm9yIGNsb3NlIHNvY2tldCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0iYm9vbGVhbiI+CisgICAgPC9vcGVyYXRpb24+CisJPG9wZXJhdGlvbiBuYW1lPSJyZXNldFN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVzZXQgYWxsIHN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCQkJCSAKKyAgPC9tYmVhbj4KKworIDxtYmVhbiAgICAgICAgIG5hbWU9IkZhc3RBc3luY1NvY2tldFNlbmRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRmFzdCBBc3luYyBDbHVzdGVyIFNlbmRlciIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IklEYXRhU2VuZGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLkZhc3RBc3luY1NvY2tldFNlbmRlciI+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImluZm8iCisgICAgICAgICAgZGVzY3JpcHRpb249IkNsYXNzIHZlcnNpb24gaW5mbyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0aHJlYWRQcmlvcml0eSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY2hhbmdlIHF1ZXVlIHRocmVhZCBwcmlvcml0eSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+ICAgICAgICAgICAgICAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWRkcmVzcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGVyIGlwIGFkZHJlc3MiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubmV0LkluZXRBZGRyZXNzIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InBvcnQiCisgICAgICAgICAgZGVzY3JpcHRpb249InNlbmRlciBwb3J0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InN1c3BlY3QiCisgICAgICAgICAgZGVzY3JpcHRpb249IlNvY2tldCBpcyBnb25lIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9IndhaXRGb3JBY2siCisgICAgICAgICAgZGVzY3JpcHRpb249IldhaXQgZm9yIGFjayBhZnRlciBkYXRhIHNlbmQiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImFja1RpbWVvdXQiCisgICAgICAgICAgZGVzY3JpcHRpb249ImFja25vd2xlZGdlIHRpbWVvdXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXZnTWVzc2FnZVNpemUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiCisgICAgICAgICAgZGVzY3JpcHRpb249ImF2ZyBtZXNzYWdlIHNpemUgKHRvdGFsYnl0ZXMvbnJPZlJlcXVlc3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIiAvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJxdWV1ZVNpemUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiCisgICAgICAgICAgZGVzY3JpcHRpb249InF1ZXVlIHNpemUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJxdWV1ZWROck9mQnl0ZXMiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBieXRlcyBvdmVyIGFsbCBxdWV1ZWQgbWVzc2FnZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWVzc2FnZVRyYW5zZmVyU3RhcnRlZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWVzc2FnZSBpcyBpbiB0cmFuc2ZlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ia2VlcEFsaXZlVGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWN0aXZlIHNvY2tldCBrZWVwIGFsaXZlIHRpbWVvdXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ia2VlcEFsaXZlTWF4UmVxdWVzdENvdW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXggcmVxdWVzdCBvdmVyIHRoaXMgc29ja2V0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icXVldWVBZGRXYWl0VGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWRkIHdhaXQgdGltZW91dCAoZGVmYXVsdCAxMDAwMCBtc2VjKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJxdWV1ZVJlbW92ZVdhaXRUaW1lb3V0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJyZW1vdmUgd2FpdCB0aW1lb3V0IChkZWZhdWx0IDMwMDAwIG1zZWMpIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heFF1ZXVlTGVuZ3RoIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXggcXVldWUgbGVuZ3RoIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icXVldWVUaW1lV2FpdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icmVtZW1iZXIgcXVldWUgd2FpdCB0aW1lcyIKKyAgICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icXVldWVDaGVja0xvY2siCisgICAgICAgICAgZGVzY3JpcHRpb249ImNoZWNrIHRvIGxvc3QgbG9ja3MiCisgICAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InF1ZXVlRG9TdGF0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWN0aXZhdGVkIHF1ZXVlIHN0YXRzIgorICAgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJrZWVwQWxpdmVDb3VudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ia2VlcCBBbGl2ZSByZXF1ZXN0IGNvdW50IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ia2VlcEFsaXZlQ29ubmVjdFRpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvbm5lY3QgdGltZSBmb3Iga2VlcCBhbGl2ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyZXNlbmQiCisgICAgICAgICAgZGVzY3JpcHRpb249ImFmdGVyIHNlbmQgZmFpbHVyZSBtYWtlIGEgcmVzZW5kIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVjb3ZlclRpbWVvdXQiCisgICAgICAgICAgZGVzY3JpcHRpb249InJlY292ZXIgVGltZW91dCBhZnRlciBwdXNoIG1lc3NhZ2UgZmFpbHVyZSAoZGVmYXVsdCA1MDAwIG1zZWMpIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIiAvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyZWNvdmVyQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIHJlY292ZXIgdHJpZXMgKGRlZmF1bHQgMCAtIG1lYW5zIG9mZikiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY29ubmVjdGVkIgorICAgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic29ja2V0IGNvbm5lY3RlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJuck9mUmVxdWVzdHMiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBzZW5kIG1lc3NhZ2VzIHRvIG90aGVyIG1lbWJlcnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idG90YWxCeXRlcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVyZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InNlbmRpbmcgcHJvY2Vzc2luZyB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1pblByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtaW5pbWFsIHNlbmRpbmcgcHJvY2Vzc2luZyB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImF2Z1Byb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJwcm9jZXNzaW5nIHRpbWUgLyBuck9mUmVxdWVzdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImRvdWJsZSIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhQcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWF4aW1hbCBzZW5kaW5nIHByb2Nlc3NpbmcgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkb1Byb2Nlc3NpbmdTdGF0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY3JlYXRlIFByb2Nlc3NpbmcgdGltZSBzdGF0cyIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+ICAgICAgICAgICAgICAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0id2FpdEFja1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InNlbmRpbmcgd2FpdEFjayB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1pbldhaXRBY2tUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtaW5pbWFsIHNlbmRpbmcgd2FpdEFjayB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImF2Z1dhaXRBY2tUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJ3YWl0QWNrIHRpbWUgLyBuck9mUmVxdWVzdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImRvdWJsZSIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhXYWl0QWNrVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWF4aW1hbCBzZW5kaW5nIHdhaXRBY2sgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkb1dhaXRBY2tTdGF0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY3JlYXRlIHdhaXRBY2sgdGltZSBzdGF0cyIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3RDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgY29ubmVjdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGlzY29ubmVjdENvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBkaXNjb25uZWN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzb2NrZXRPcGVuQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIG9wZW4gc29ja2V0IChLZWVwQWxpdmUgYW5kIGNvbm5lY3RzKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgkJCQkgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNvY2tldE9wZW5GYWlsdXJlQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIG9wZW4gc29ja2V0IGZhaWx1cmVzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+ICAgICAgICAgICAgICAgICAJCQkJIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzb2NrZXRDbG9zZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBjbG9zZWQgc29ja2V0IChLZWVwQWxpdmUgYW5kIGRpc2Nvbm5lY3RzKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtaXNzaW5nQWNrQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIG1pc3NpbmcgYWNrIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRhdGFSZXNlbmRDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgZGF0YSByZXNlbmRzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRhdGFGYWlsdXJlQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGRhdGEgc2VuZCBmYWlsdXJlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJpblF1ZXVlQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGFsbCBxdWV1ZWQgbWVzc2FnZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ib3V0UXVldWVDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgYWxsIHN1Y2Nlc3NmdWxseSBzZW5kZWQgbWVzc2FnZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icXVldWVBZGRXYWl0VGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icXVldWUgYWRkIHdhaXQgdGltZSAodG9tY2F0IHRocmVhZCB3YWl0cykiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icXVldWVSZW1vdmVXYWl0VGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icXVldWUgcmVtb3ZlIHdhaXQgdGltZSAocXVldWUgdGhyZWFkIHdhaXRzKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorIAk8b3BlcmF0aW9uIG5hbWU9ImNvbm5lY3QiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iY29ubmVjdCB0byBvdGhlciByZXBsaWNhdGlvbiBub2RlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKwk8b3BlcmF0aW9uIG5hbWU9ImRpc2Nvbm5lY3QiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iZGlzY29ubmVjdCB0byBvdGhlciByZXBsaWNhdGlvbiBub2RlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKwk8b3BlcmF0aW9uIG5hbWU9ImNoZWNrS2VlcEFsaXZlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkNoZWNrIGNvbm5lY3Rpb24gZm9yIGNsb3NlIHNvY2tldCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0iYm9vbGVhbiI+CisgICAgPC9vcGVyYXRpb24+CisJPG9wZXJhdGlvbiBuYW1lPSJyZXNldFN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVzZXQgYWxsIHN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCQkJCSAKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gICAgICAgICBuYW1lPSJQb29sZWRTb2NrZXRTZW5kZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IlBvb2xlZCBDbHVzdGVyIFNlbmRlciIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IklEYXRhU2VuZGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlBvb2xlZFNvY2tldFNlbmRlciI+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImFkZHJlc3MiCisgICAgICAgICAgZGVzY3JpcHRpb249InNlbmRlciBpcCBhZGRyZXNzIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLm5ldC5JbmV0QWRkcmVzcyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwb3J0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZW5kZXIgcG9ydCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzdXNwZWN0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJTb2NrZXQgaXMgZ29uZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhY2tUaW1lb3V0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJhY2tub3dsZWRnZSB0aW1lb3V0IgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9IndhaXRGb3JBY2siCisgICAgICAgICAgZGVzY3JpcHRpb249IldhaXQgZm9yIGFjayBhZnRlciBkYXRhIHNlbmQiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhQb29sU29ja2V0TGltaXQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1heCBwYXJhbGxlbCBzb2NrZXRzIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iaW5Qb29sU2l6ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iZ2V0IGN1cnJlbnQgU29ja2V0U2VuZGVyIHBvb2wgc2l6ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImluVXNlUG9vbFNpemUiCisgICAgICAgICAgZGVzY3JpcHRpb249ImdldCBzaXplIG9mIGN1cnJlbnQgYnVzeSBTb2NrZXRTZW5kZXIgZnJvbSBwb29sIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4gICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJrZWVwQWxpdmVUaW1lb3V0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJhY3RpdmUgc29ja2V0IGtlZXAgYWxpdmUgdGltZW91dCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJrZWVwQWxpdmVNYXhSZXF1ZXN0Q291bnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1heCByZXF1ZXN0IG92ZXIgdGhpcyBzb2NrZXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyZXNlbmQiCisgICAgICAgICAgZGVzY3JpcHRpb249ImFmdGVyIHNlbmQgZmFpbHVyZSBtYWtlIGEgcmVzZW5kIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY29ubmVjdGVkIgorICAgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic29ja2V0IGNvbm5lY3RlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhdmdNZXNzYWdlU2l6ZSIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYXZnIG1lc3NhZ2Ugc2l6ZSAodG90YWxieXRlcy9uck9mUmVxdWVzdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibnJPZlJlcXVlc3RzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2Ygc2VuZCBtZXNzYWdlcyB0byBvdGhlciBtZW1iZXJzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InRvdGFsQnl0ZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBieXRlcyB0cmFuc2ZlcmVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3RDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgY29ubmVjdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGlzY29ubmVjdENvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBkaXNjb25uZWN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCTxvcGVyYXRpb24gbmFtZT0iY29ubmVjdCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJzdGFydCBRdWV1ZSB0byBjb25uZWN0IHRvIG9odGVyIHJlcGxpY2F0aW9uIG5vZGUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCTxvcGVyYXRpb24gbmFtZT0iZGlzY29ubmVjdCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJzdG9wIFF1ZXVlIHRvIG90aGVyIHJlcGxpY2F0aW9uIG5vZGUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCTxvcGVyYXRpb24gbmFtZT0icmVzZXRTdGF0aXN0aWNzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJlc2V0IGFsbCBzdGF0aXN0aWNzIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKwkJCQkgCisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iU29ja2V0U2VuZGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJTeW5jIENsdXN0ZXIgU2VuZGVyIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iSURhdGFTZW5kZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuU29ja2V0U2VuZGVyIj4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWRkcmVzcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGVyIGlwIGFkZHJlc3MiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubmV0LkluZXRBZGRyZXNzIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InBvcnQiCisgICAgICAgICAgZGVzY3JpcHRpb249InNlbmRlciBwb3J0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InN1c3BlY3QiCisgICAgICAgICAgZGVzY3JpcHRpb249IlNvY2tldCBpcyBnb25lIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImFja1RpbWVvdXQiCisgICAgICAgICAgZGVzY3JpcHRpb249ImFja25vd2xlZGdlIHRpbWVvdXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0id2FpdEZvckFjayIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iV2FpdCBmb3IgYWNrIGFmdGVyIGRhdGEgc2VuZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtlZXBBbGl2ZVRpbWVvdXQiCisgICAgICAgICAgZGVzY3JpcHRpb249ImFjdGl2ZSBzb2NrZXQga2VlcCBhbGl2ZSB0aW1lb3V0IgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWF4IHJlcXVlc3Qgb3ZlciB0aGlzIHNvY2tldCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1lc3NhZ2VUcmFuc2ZlclN0YXJ0ZWQiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1lc3NhZ2UgaXMgaW4gdHJhbnNmZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtlZXBBbGl2ZUNvdW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJrZWVwIEFsaXZlIHJlcXVlc3QgY291bnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJrZWVwQWxpdmVDb25uZWN0VGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29ubmVjdCB0aW1lIGZvciBrZWVwIGFsaXZlIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlc2VuZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWZ0ZXIgc2VuZCBmYWlsdXJlIG1ha2UgYSByZXNlbmQiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIiAvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0ZWQiCisgICAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzb2NrZXQgY29ubmVjdGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImF2Z01lc3NhZ2VTaXplIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJhdmcgbWVzc2FnZSBzaXplICh0b3RhbGJ5dGVzL25yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJuck9mUmVxdWVzdHMiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBzZW5kIG1lc3NhZ2VzIHRvIG90aGVyIG1lbWJlcnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idG90YWxCeXRlcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVyZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InNlbmRpbmcgcHJvY2Vzc2luZyB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1pblByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtaW5pbWFsIHNlbmRpbmcgcHJvY2Vzc2luZyB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImF2Z1Byb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJwcm9jZXNzaW5nIHRpbWUgLyBuck9mUmVxdWVzdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImRvdWJsZSIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhQcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWF4aW1hbCBzZW5kaW5nIHByb2Nlc3NpbmcgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkb1Byb2Nlc3NpbmdTdGF0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY3JlYXRlIFByb2Nlc3NpbmcgdGltZSBzdGF0cyIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9IndhaXRBY2tUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZW5kaW5nIHdhaXRBY2sgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtaW5XYWl0QWNrVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWluaW1hbCBzZW5kaW5nIHdhaXRBY2sgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhdmdXYWl0QWNrVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0id2FpdEFjayB0aW1lIC8gbnJPZlJlcXVlc3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJkb3VibGUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4V2FpdEFja1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1heGltYWwgc2VuZGluZyB3YWl0QWNrIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZG9XYWl0QWNrU3RhdHMiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNyZWF0ZSB3YWl0QWNrIHRpbWUgc3RhdHMiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIiAvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0Q291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGNvbm5lY3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRpc2Nvbm5lY3RDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgZGlzY29ubmVjdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic29ja2V0Q2xvc2VDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgY2xvc2VkIHNvY2tldCAoS2VlcEFsaXZlIGFuZCBkaXNjb25uZWN0cykiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic29ja2V0T3BlbkZhaWx1cmVDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgb3BlbiBzb2NrZXQgZmFpbHVyZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4gICAgICAgICAgICAgICAgIAkJCQkgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNvY2tldE9wZW5Db3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgb3BlbiBzb2NrZXQgKEtlZXBBbGl2ZSBhbmQgY29ubmVjdHMpIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CQkJCSAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWlzc2luZ0Fja0NvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBtaXNzaW5nIGFjayIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkYXRhUmVzZW5kQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGRhdGEgcmVzZW5kcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkYXRhRmFpbHVyZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBkYXRhIHNlbmQgZmFpbHVyZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKwk8b3BlcmF0aW9uIG5hbWU9ImNvbm5lY3QiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iY29ubmVjdCB0byBvdGhlciByZXBsaWNhdGlvbiBub2RlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKwk8b3BlcmF0aW9uIG5hbWU9ImRpc2Nvbm5lY3QiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iZGlzY29ubmVjdCB0byBvdGhlciByZXBsaWNhdGlvbiBub2RlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKwk8b3BlcmF0aW9uIG5hbWU9ImNoZWNrS2VlcEFsaXZlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkNoZWNrIGNvbm5lY3Rpb24gZm9yIGNsb3NlIHNvY2tldCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0iYm9vbGVhbiI+CisgICAgPC9vcGVyYXRpb24+CisJPG9wZXJhdGlvbiBuYW1lPSJyZXNldFN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVzZXQgYWxsIHN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCQkJCSAKKyAgPC9tYmVhbj4KKyAgICAKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iUmVwbGljYXRpb25WYWx2ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVmFsdmUgZm9yIHNpbXBsZSB0Y3AgcmVwbGljYXRpb24iCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJWYWx2ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblZhbHZlIj4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iaW5mbyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2xhc3MgdmVyc2lvbiBpbmZvIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImZpbHRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icmVzb3VyY2UgZmlsdGVyIHRvIGRpc2FibGUgc2Vzc2lvbiByZXBsaWNhdGlvbiBjaGVjayIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwcmltYXJ5SW5kaWNhdG9yIgorIAkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InNldCBpbmRpY2F0b3IgdGhhdCByZXF1ZXN0IHByb2Nlc3NpbmcgaXMgYXQgcHJpbWFyeSBzZXNzaW9uIG5vZGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icHJpbWFyeUluZGljYXRvck5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlcXVlc3QgYXR0cmlidXRlIG5hbWUgdG8gaW5kaWNhdGUgdGhhdCByZXF1ZXN0IHByb2Nlc3NpbmcgaXMgYXQgcHJpbWFyeSBzZXNzaW9uIG5vZGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZG9Qcm9jZXNzaW5nU3RhdHMiCisgCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWN0aXZlIHN0YXRpc3RpY3MgY291bnRpbmciCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKwk8YXR0cmlidXRlICAgbmFtZT0ibnJPZlJlcXVlc3RzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2YgcmVwbGljYXRlZCByZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCTxhdHRyaWJ1dGUgICBuYW1lPSJuck9mRmlsdGVyUmVxdWVzdHMiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBmaWx0ZXJlZCByZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCTxhdHRyaWJ1dGUgICBuYW1lPSJuck9mU2VuZFJlcXVlc3RzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2Ygc2VuZCByZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCTxhdHRyaWJ1dGUgICBuYW1lPSJuck9mQ3Jvc3NDb250ZXh0U2VuZFJlcXVlc3RzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2Ygc2VuZCBjcm9zcyBjb250ZXh0IHNlc3Npb24gcmVxdWVzdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idG90YWxSZXF1ZXN0VGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0idG90YWwgcmVwbGljYXRlZCByZXF1ZXN0IHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idG90YWxTZW5kVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0idG90YWwgcmVwbGljYXRlZCBzZW5kIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibGFzdFNlbmRUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJsYXN0IHJlcGxpY2F0ZWQgcmVxdWVzdCB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJyZXNldFN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVzZXQgYWxsIHN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorICAgICAgICAgICAgICAgICAKKyAgPC9tYmVhbj4KKworCis8L21iZWFucy1kZXNjcmlwdG9ycz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci91dGlsL0Zhc3RRdWV1ZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3V0aWwvRmFzdFF1ZXVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwNzMzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci91dGlsL0Zhc3RRdWV1ZS5qYXZhCkBAIC0wLDAgKzEsNjI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudXRpbDsKKworLyoqCisgKiBBIGZhc3QgcXVldWUgdGhhdCByZW1vdmVyIHRocmVhZCBsb2NrIHRoZSBhZGRlciB0aHJlYWQuIDxici8+TGltaXQgdGhlIHF1ZXVlCisgKiBsZW5ndGggd2hlbiB5b3UgaGF2ZSBzdHJhbmdlIHByb2R1Y2VyIHRocmVhZCBwcm9ibGVtZXMuCisgKiAKKyAqIEZJWE1FIGFkZCBpMThuIHN1cHBvcnQgdG8gbG9nIG1lc3NhZ2VzCisgKiBAYXV0aG9yIFJhaW5lciBKdW5nCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgRmFzdFF1ZXVlIGltcGxlbWVudHMgSVF1ZXVlIHsKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5CisgICAgICAgICAgICAuZ2V0TG9nKEZhc3RRdWV1ZS5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBhY3R1YWwgcXVldWUKKyAgICAgKi8KKyAgICBwcml2YXRlIFNpbmdsZVJlbW92ZVN5bmNocm9uaXplZEFkZExvY2sgbG9jayA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBGaXJzdCBPYmplY3QgYXQgcXVldWUgKGNvbnN1bWVyIG1lc3NhZ2UpCisgICAgICovCisgICAgcHJpdmF0ZSBMaW5rT2JqZWN0IGZpcnN0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIExhc3Qgb2JqZWN0IGluIHF1ZXVlIChwcm9kdWNlciBPYmplY3QpCisgICAgICovCisgICAgcHJpdmF0ZSBMaW5rT2JqZWN0IGxhc3QgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ3VycmVudCBRdWV1ZSBlbGVtZW50cyBzaXplCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc2l6ZSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBjaGVjayBsb2NrIHRvIGRldGVjdCBzdHJhbmdlIHRocmVhZGluZ3MgdGhpbmdzCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrTG9jayA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogcHJvdG9jb2wgdGhlIHRocmVhZCB3YWl0IHRpbWVzCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHRpbWVXYWl0ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBjYWxjIHN0YXRzIGRhdGEKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZG9TdGF0cyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBib29sZWFuIGluQWRkID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5SZW1vdmUgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpbk11dGV4ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBsaW1pdCB0aGUgcXVldWUgbGVnbnRoICggZGVmYXVsdCBpcyB1bmxpbWl0ZWQpCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbWF4UXVldWVMZW5ndGggPSAwOworCisgICAgLyoqCisgICAgICogYWRkV2FpdFRpbWVvdXQgZm9yIHByb2R1Y2VyCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIGFkZFdhaXRUaW1lb3V0ID0gMTAwMDBMOworCisgICAgCisgICAgLyoqCisgICAgICogcmVtb3ZlV2FpdFRpbWVvdXQgZm9yIGNvbnN1bWVyCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHJlbW92ZVdhaXRUaW1lb3V0ID0gMzAwMDBMOworCisgICAgLyoqCisgICAgICogZW5hYmxlZCB0aGUgcXVldWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBjYWxjIGFsbCBhZGQgb2JqZWN0cworICAgICAqLworICAgIHByaXZhdGUgbG9uZyBhZGRDb3VudGVyID0gMDsKKworICAgIC8qKgorICAgICAqIGNhbGMgYWxsIGFkZCBvYmpldGNzIGluIGVycm9yIHN0YXRlICggc2VlIGxpbWl0IHF1ZXVlIGxlbmd0aCkKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgYWRkRXJyb3JDb3VudGVyID0gMDsKKworICAgIC8qKgorICAgICAqIGNhbGMgYWxsIHJlbW92ZSBvYmplY3RzCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHJlbW92ZUNvdW50ZXIgPSAwOworCisgICAgLyoqCisgICAgICogY2FsYyBhbGwgcmVtb3ZlIG9iamVjdHMgZmFpbHVyZXMgKGh1cHBzIHByb2JsZW1lIGRldGVjdGlvbikKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgcmVtb3ZlRXJyb3JDb3VudGVyID0gMDsKKworICAgIC8qKgorICAgICAqIENhbGMgd2FpdCB0aW1lIHRocmVhZAorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBhZGRXYWl0ID0gMDsKKworICAgIC8qKgorICAgICAqIENhbGMgcmVtb3ZlIHRpbWUgdGhyZWFkcworICAgICAqLworICAgIHByaXZhdGUgbG9uZyByZW1vdmVXYWl0ID0gMDsKKworICAgIC8qKgorICAgICAqICBtYXggcXVldWUgc2l6ZQorICAgICAqLworICAgIHByaXZhdGUgaW50IG1heFNpemUgPSAwOworCisgICAgLyoqCisgICAgICogYXZnIHF1ZXVlIHNpemUKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgYXZnU2l6ZSA9IDA7CisKKyAgICBwcml2YXRlIGludCBtYXhTaXplU2FtcGxlID0gMDsKKworICAgIHByaXZhdGUgbG9uZyBhdmdTaXplU2FtcGxlID0gMDsKKworICAgIC8qKgorICAgICAqICBhdmcgc2l6ZSBzYW1wbGUgaW50ZXJ2YWwKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzYW1wbGVJbnRlcnZhbCA9IDEwMDsKKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIFF1ZXVlIFNpbmdsZVJlbW92ZVN5bmNocm9uaXplZEFkZExvY2sgYW5kIHNldCBhZGQgYW5kIHdhaXQKKyAgICAgKiBUaW1lb3V0cworICAgICAqLworICAgIHB1YmxpYyBGYXN0UXVldWUoKSB7CisgICAgICAgIGxvY2sgPSBuZXcgU2luZ2xlUmVtb3ZlU3luY2hyb25pemVkQWRkTG9jaygpOworICAgICAgICBsb2NrLnNldEFkZFdhaXRUaW1lb3V0KGFkZFdhaXRUaW1lb3V0KTsKKyAgICAgICAgbG9jay5zZXRSZW1vdmVXYWl0VGltZW91dChyZW1vdmVXYWl0VGltZW91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGN1cnJlbnQgYWRkIHdhaXQgdGltZW91dAorICAgICAqIAorICAgICAqIEByZXR1cm4gY3VycmVudCB3YWl0IHRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRBZGRXYWl0VGltZW91dCgpIHsKKyAgICAgICAgYWRkV2FpdFRpbWVvdXQgPSBsb2NrLmdldEFkZFdhaXRUaW1lb3V0KCk7CisgICAgICAgIHJldHVybiBhZGRXYWl0VGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYWRkIHdhaXQgdGltZW91dCAoZGVmYXVsdCAxMDAwMCBtc2VjKQorICAgICAqIAorICAgICAqIEBwYXJhbSB0aW1lb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWRkV2FpdFRpbWVvdXQobG9uZyB0aW1lb3V0KSB7CisgICAgICAgIGFkZFdhaXRUaW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgbG9jay5zZXRBZGRXYWl0VGltZW91dChhZGRXYWl0VGltZW91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGN1cnJlbnQgcmVtb3ZlIHdhaXQgdGltZW91dAorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIHRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRSZW1vdmVXYWl0VGltZW91dCgpIHsKKyAgICAgICAgcmVtb3ZlV2FpdFRpbWVvdXQgPSBsb2NrLmdldFJlbW92ZVdhaXRUaW1lb3V0KCk7CisgICAgICAgIHJldHVybiByZW1vdmVXYWl0VGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgcmVtb3ZlIHdhaXQgdGltZW91dCAoIGRlZmF1bHQgMzAwMDAgbXNlYykKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGltZW91dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbW92ZVdhaXRUaW1lb3V0KGxvbmcgdGltZW91dCkgeworICAgICAgICByZW1vdmVXYWl0VGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgIGxvY2suc2V0UmVtb3ZlV2FpdFRpbWVvdXQocmVtb3ZlV2FpdFRpbWVvdXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBNYXggUXVldWUgbGVuZ3RoCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudXRpbC5JUXVldWUjZ2V0TWF4UXVldWVMZW5ndGgoKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4UXVldWVMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBtYXhRdWV1ZUxlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhRdWV1ZUxlbmd0aChpbnQgbGVuZ3RoKSB7CisgICAgICAgIG1heFF1ZXVlTGVuZ3RoID0gbGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIGVuYWJsZWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZSkgeworICAgICAgICBlbmFibGVkID0gZW5hYmxlOworICAgICAgICBpZiAoIWVuYWJsZWQpIHsKKyAgICAgICAgICAgIGxvY2suYWJvcnRSZW1vdmUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2hlY2tMb2NrLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tMb2NrKCkgeworICAgICAgICByZXR1cm4gY2hlY2tMb2NrOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBjaGVja0xvY2sgVGhlIGNoZWNrTG9jayB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tMb2NrKGJvb2xlYW4gY2hlY2tMb2NrKSB7CisgICAgICAgIHRoaXMuY2hlY2tMb2NrID0gY2hlY2tMb2NrOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZG9TdGF0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RvU3RhdHMoKSB7CisgICAgICAgIHJldHVybiBkb1N0YXRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBkb1N0YXRzIFRoZSBkb1N0YXRzIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREb1N0YXRzKGJvb2xlYW4gZG9TdGF0cykgeworICAgICAgICB0aGlzLmRvU3RhdHMgPSBkb1N0YXRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGltZVdhaXQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNUaW1lV2FpdCgpIHsKKyAgICAgICAgcmV0dXJuIHRpbWVXYWl0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB0aW1lV2FpdCBUaGUgdGltZVdhaXQgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVXYWl0KGJvb2xlYW4gdGltZVdhaXQpIHsKKyAgICAgICAgdGhpcy50aW1lV2FpdCA9IHRpbWVXYWl0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U2FtcGxlSW50ZXJ2YWwoKSB7CisgICAgICAgIHJldHVybiBzYW1wbGVJbnRlcnZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVJbnRlcnZhbChpbnQgaW50ZXJ2YWwpIHsKKyAgICAgICAgaWYgKCBpbnRlcnZhbCA+IDAgKSB7CisgICAgICAgICAgIHNhbXBsZUludGVydmFsID0gaW50ZXJ2YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRBZGRDb3VudGVyKCkgeworICAgICAgICByZXR1cm4gYWRkQ291bnRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRDb3VudGVyKGxvbmcgY291bnRlcikgeworICAgICAgICBhZGRDb3VudGVyID0gY291bnRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRBZGRFcnJvckNvdW50ZXIoKSB7CisgICAgICAgIHJldHVybiBhZGRFcnJvckNvdW50ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWRkRXJyb3JDb3VudGVyKGxvbmcgY291bnRlcikgeworICAgICAgICBhZGRFcnJvckNvdW50ZXIgPSBjb3VudGVyOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFJlbW92ZUNvdW50ZXIoKSB7CisgICAgICAgIHJldHVybiByZW1vdmVDb3VudGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlbW92ZUNvdW50ZXIobG9uZyBjb3VudGVyKSB7CisgICAgICAgIHJlbW92ZUNvdW50ZXIgPSBjb3VudGVyOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFJlbW92ZUVycm9yQ291bnRlcigpIHsKKyAgICAgICAgcmV0dXJuIHJlbW92ZUVycm9yQ291bnRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdmVFcnJvckNvdW50ZXIobG9uZyBjb3VudGVyKSB7CisgICAgICAgIHJlbW92ZUVycm9yQ291bnRlciA9IGNvdW50ZXI7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0QWRkV2FpdCgpIHsKKyAgICAgICAgcmV0dXJuIGFkZFdhaXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWRkV2FpdChsb25nIHdhaXQpIHsKKyAgICAgICAgYWRkV2FpdCA9IHdhaXQ7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0UmVtb3ZlV2FpdCgpIHsKKyAgICAgICAgcmV0dXJuIHJlbW92ZVdhaXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3ZlV2FpdChsb25nIHdhaXQpIHsKKyAgICAgICAgcmVtb3ZlV2FpdCA9IHdhaXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgbWF4IHNpemUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1heFNpemUoKSB7CisgICAgICAgIHJldHVybiBtYXhTaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWF4U2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBtYXhTaXplID0gc2l6ZTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBBdmcgcXVldWUgc2l6ZQorICAgICAqIEByZXR1cm4gVGhlIGF2ZXJhZ2UgcXVldWUgc2l6ZQorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEF2Z1NpemUoKSB7CisgICAgICAgIGlmIChhZGRDb3VudGVyID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIGF2Z1NpemUgLyBhZGRDb3VudGVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXNldCBhbGwgc3RhdHMgZGF0YSAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldFN0YXRpc3RpY3MoKSB7CisgICAgICAgIGFkZENvdW50ZXIgPSAwOworICAgICAgICBhZGRFcnJvckNvdW50ZXIgPSAwOworICAgICAgICByZW1vdmVDb3VudGVyID0gMDsKKyAgICAgICAgcmVtb3ZlRXJyb3JDb3VudGVyID0gMDsKKyAgICAgICAgYXZnU2l6ZSA9IDA7CisgICAgICAgIG1heFNpemUgPSAwOworICAgICAgICBhZGRXYWl0ID0gMDsKKyAgICAgICAgcmVtb3ZlV2FpdCA9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogdW5sb2NrIHF1ZXVlIGZvciBuZXh0IGFkZCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmxvY2tBZGQoKSB7CisgICAgICAgIGxvY2sudW5sb2NrQWRkKHNpemUgPiAwID8gdHJ1ZSA6IGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB1bmxvY2sgcXVldWUgZm9yIG5leHQgcmVtb3ZlIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVubG9ja1JlbW92ZSgpIHsKKyAgICAgICAgbG9jay51bmxvY2tSZW1vdmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzdGFydCBxdWV1aW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIHNldEVuYWJsZWQodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc3RhcnQgcXVldWluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHNldEVuYWJsZWQoZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFNhbXBsZSgpIHsKKyAgICAgICAgcmV0dXJuIGFkZENvdW50ZXIgJSBzYW1wbGVJbnRlcnZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1heFNpemVTYW1wbGUoKSB7CisgICAgICAgIHJldHVybiBtYXhTaXplU2FtcGxlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1heFNpemVTYW1wbGUoaW50IHNpemUpIHsKKyAgICAgICAgbWF4U2l6ZVNhbXBsZSA9IHNpemU7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0QXZnU2l6ZVNhbXBsZSgpIHsKKyAgICAgICAgbG9uZyBzYW1wbGUgPSBhZGRDb3VudGVyICUgc2FtcGxlSW50ZXJ2YWw7CisgICAgICAgIGlmIChzYW1wbGUgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gYXZnU2l6ZVNhbXBsZSAvIHNhbXBsZTsKKyAgICAgICAgfSBlbHNlIGlmIChhZGRDb3VudGVyID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIGF2Z1NpemVTYW1wbGUgLyBzYW1wbGVJbnRlcnZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTaXplKCkgeworICAgICAgICBpbnQgc3o7CisgICAgICAgIHN6ID0gc2l6ZTsKKyAgICAgICAgcmV0dXJuIHN6OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBuZXcgZGF0YSB0byB0aGUgcXVldWUKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci51dGlsLklRdWV1ZSNhZGQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKiBGSVhNRSBleHRyYWN0IHNvbWUgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWRkKFN0cmluZyBrZXksIE9iamVjdCBkYXRhKSB7CisgICAgICAgIGJvb2xlYW4gb2sgPSB0cnVlOworICAgICAgICBsb25nIHRpbWUgPSAwOworCisgICAgICAgIGlmICghZW5hYmxlZCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oIkZhc3RRdWV1ZS5hZGQ6IHF1ZXVlIGRpc2FibGVkLCBhZGQgYWJvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRpbWVXYWl0KSB7CisgICAgICAgICAgICB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIH0KKyAgICAgICAgbG9jay5sb2NrQWRkKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodGltZVdhaXQpIHsKKyAgICAgICAgICAgICAgICBhZGRXYWl0ICs9IChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cudHJhY2UoIkZhc3RRdWV1ZS5hZGQ6IHN0YXJ0aW5nIHdpdGggc2l6ZSAiICsgc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hlY2tMb2NrKSB7CisgICAgICAgICAgICAgICAgaWYgKGluQWRkKQorICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiRmFzdFF1ZXVlLmFkZDogRGV0ZWN0ZWQgb3RoZXIgYWRkIik7CisgICAgICAgICAgICAgICAgaW5BZGQgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChpbk11dGV4KQorICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiRmFzdFF1ZXVlLmFkZDogRGV0ZWN0ZWQgb3RoZXIgbXV0ZXggaW4gYWRkIik7CisgICAgICAgICAgICAgICAgaW5NdXRleCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgobWF4UXVldWVMZW5ndGggPiAwKSAmJiAoc2l6ZSA+PSBtYXhRdWV1ZUxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIkZhc3RRdWV1ZS5hZGQ6IENvdWxkIG5vdCBhZGQsIHNpbmNlIHF1ZXVlIGlzIGZ1bGwgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemUgKyAiPj0iICsgbWF4UXVldWVMZW5ndGggKyAiKSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMaW5rT2JqZWN0IGVsZW1lbnQgPSBuZXcgTGlua09iamVjdChrZXksIGRhdGEpOworICAgICAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBsYXN0ID0gZWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXJyb3IoIkZhc3RRdWV1ZS5hZGQ6IENvdWxkIG5vdCBhZGQsIHNpbmNlIGxhc3QgaXMgbnVsbCBhbHRob3VnaCBzaXplIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemUgKyAiICg+MCkiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QuYXBwZW5kKGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRvU3RhdHMpIHsKKyAgICAgICAgICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkZENvdW50ZXIgJSBzYW1wbGVJbnRlcnZhbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplU2FtcGxlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2Z1NpemVTYW1wbGUgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFkZENvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBtYXhTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IG1heFNpemVTYW1wbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemVTYW1wbGUgPSBzaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGF2Z1NpemUgKz0gc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgYXZnU2l6ZVNhbXBsZSArPSBzaXplOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFkZEVycm9yQ291bnRlcisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkZhc3RRdWV1ZS5hZGQ6IGZpcnN0IGlzIG51bGwsIHNpemUgaXMgIiArIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhdCBlbmQgb2YgYWRkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGFzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJGYXN0UXVldWUuYWRkOiBsYXN0IGlzIG51bGwsIHNpemUgaXMgIiArIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhdCBlbmQgb2YgYWRkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaGVja0xvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAoIWluTXV0ZXgpCisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJGYXN0UXVldWUuYWRkOiBDYW5jZWxsZWQgYnkgb3RoZXIgbXV0ZXggaW4gYWRkIik7CisgICAgICAgICAgICAgICAgaW5NdXRleCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmICghaW5BZGQpCisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJGYXN0UXVldWUuYWRkOiBDYW5jZWxsZWQgYnkgb3RoZXIgYWRkIik7CisgICAgICAgICAgICAgICAgaW5BZGQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiRmFzdFF1ZXVlLmFkZDogYWRkIGVuZGluZyB3aXRoIHNpemUgIiArIHNpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGltZVdhaXQpIHsKKyAgICAgICAgICAgICAgICB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBsb2NrLnVubG9ja0FkZCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGltZVdhaXQpIHsKKyAgICAgICAgICAgIGFkZFdhaXQgKz0gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9rOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZSB0aGUgY29tcGxldGUgcXVldWVkIG9iamVjdCBsaXN0CisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudXRpbC5JUXVldWUjcmVtb3ZlKCkKKyAgICAgKiBGSVhNRSBleHRyYWN0IHNvbWUgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIExpbmtPYmplY3QgcmVtb3ZlKCkgeworICAgICAgICBMaW5rT2JqZWN0IGVsZW1lbnQ7CisgICAgICAgIGJvb2xlYW4gZ290TG9jazsKKyAgICAgICAgbG9uZyB0aW1lID0gMDsKKworICAgICAgICBpZiAoIWVuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJGYXN0UXVldWUucmVtb3ZlOiBxdWV1ZSBkaXNhYmxlZCwgcmVtb3ZlIGFib3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRpbWVXYWl0KSB7CisgICAgICAgICAgICB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIH0KKyAgICAgICAgZ290TG9jayA9IGxvY2subG9ja1JlbW92ZSgpOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBpZiAoIWdvdExvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGltZVdhaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVdhaXQgKz0gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGRvU3RhdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUVycm9yQ291bnRlcisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkZhc3RRdWV1ZS5yZW1vdmU6IFJlbW92ZSBhYm9ydGVkIGFsdGhvdWdoIHF1ZXVlIGVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJGYXN0UXVldWUucmVtb3ZlOiBxdWV1ZSBkaXNhYmxlZCwgcmVtb3ZlIGFib3J0ZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aW1lV2FpdCkgeworICAgICAgICAgICAgICAgIHJlbW92ZVdhaXQgKz0gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiRmFzdFF1ZXVlLnJlbW92ZTogcmVtb3ZlIHN0YXJ0aW5nIHdpdGggc2l6ZSAiICsgc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hlY2tMb2NrKSB7CisgICAgICAgICAgICAgICAgaWYgKGluUmVtb3ZlKQorICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiRmFzdFF1ZXVlLnJlbW92ZTogRGV0ZWN0ZWQgb3RoZXIgcmVtb3ZlIik7CisgICAgICAgICAgICAgICAgaW5SZW1vdmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChpbk11dGV4KQorICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiRmFzdFF1ZXVlLnJlbW92ZTogRGV0ZWN0ZWQgb3RoZXIgbXV0ZXggaW4gcmVtb3ZlIik7CisgICAgICAgICAgICAgICAgaW5NdXRleCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsZW1lbnQgPSBmaXJzdDsKKworICAgICAgICAgICAgaWYgKGRvU3RhdHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVFcnJvckNvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgbG9nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVycm9yKCJGYXN0UXVldWUucmVtb3ZlOiBDb3VsZCBub3QgcmVtb3ZlLCBzaW5jZSBmaXJzdCBpcyBudWxsIGFsdGhvdWdoIHNpemUgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplICsgIiAoPjApIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaXJzdCA9IGxhc3QgPSBudWxsOworICAgICAgICAgICAgc2l6ZSA9IDA7CisKKyAgICAgICAgICAgIGlmIChjaGVja0xvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAoIWluTXV0ZXgpCisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJGYXN0UXVldWUucmVtb3ZlOiBDYW5jZWxsZWQgYnkgb3RoZXIgbXV0ZXggaW4gcmVtb3ZlIik7CisgICAgICAgICAgICAgICAgaW5NdXRleCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmICghaW5SZW1vdmUpCisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJGYXN0UXVldWUucmVtb3ZlOiBDYW5jZWxsZWQgYnkgb3RoZXIgcmVtb3ZlIik7CisgICAgICAgICAgICAgICAgaW5SZW1vdmUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiRmFzdFF1ZXVlLnJlbW92ZTogcmVtb3ZlIGVuZGluZyB3aXRoIHNpemUgIiArIHNpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGltZVdhaXQpIHsKKyAgICAgICAgICAgICAgICB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBsb2NrLnVubG9ja1JlbW92ZSgpOworICAgICAgICB9CisgICAgICAgIGlmICh0aW1lV2FpdCkgeworICAgICAgICAgICAgcmVtb3ZlV2FpdCArPSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci91dGlsL0lEeW5hbWljUHJvcGVydHkuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci91dGlsL0lEeW5hbWljUHJvcGVydHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmMzMDg3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3V0aWwvSUR5bmFtaWNQcm9wZXJ0eS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgSUR5bmFtaWNQcm9wZXJ0eSB7CisKKyAgICAvKioKKyAgICAgKiBzZXQgY29uZmlnIGF0dHJpYnV0ZXMgd2l0aCByZWZsZWN0CisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSA7CisKKyAgICAvKioKKyAgICAgKiBnZXQgY3VycmVudCBjb25maWcKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogQHJldHVybiBUaGUgcHJvcGVydHkKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIDsKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIHByb3BlcnRpZXMga2V5cworICAgICAqIAorICAgICAqIEByZXR1cm4gQW4gaXRlcmF0b3Igb3ZlciB0aGUgcHJvcGVydHkgbmFtZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0UHJvcGVydHlOYW1lcygpIDsKKworICAgIC8qKgorICAgICAqIHJlbW92ZSBhIGNvbmZpZ3VyZWQgcHJvcGVydHkuCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBrZXkpIDsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3V0aWwvSVF1ZXVlLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdXRpbC9JUXVldWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWZhMTY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3V0aWwvSVF1ZXVlLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnV0aWw7CisKKy8qKgorICogQSBxdWV1ZSBpbnRlcmZhY2U8QlI+CisgKgorICogQGF1dGhvciBSYWluZXIgSnVuZworICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIElRdWV1ZSB7CisKKyAgICBwdWJsaWMgTGlua09iamVjdCByZW1vdmUoKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGQoU3RyaW5nIGtleSxPYmplY3QgZGF0YSk7CisgICAgcHVibGljIGludCBnZXRNYXhRdWV1ZUxlbmd0aCgpOworICAgIHB1YmxpYyB2b2lkIHNldE1heFF1ZXVlTGVuZ3RoKGludCBsZW5ndGgpOworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCk7CisgICAgcHVibGljIHZvaWQgc3RvcCgpOworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3V0aWwvTGlua09iamVjdC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3V0aWwvTGlua09iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NTU5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdXRpbC9MaW5rT2JqZWN0LmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnV0aWw7CisKKy8qKgorICogVGhlIGNsYXNzIDxiPkxpbmtPYmplY3Q8L2I+IGltcGxlbWVudHMgYW4gZWxlbWVudAorICogZm9yIGEgbGlua2VkIGxpc3QsIGNvbnNpc3Rpbmcgb2YgYSBnZW5lcmFsCisgKiBkYXRhIG9iamVjdCBhbmQgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGVsZW1lbnQuCisgKgorICogQGF1dGhvciBSYWluZXIgSnVuZworICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKworICovCisKK3B1YmxpYyBjbGFzcyBMaW5rT2JqZWN0IHsKKworICAgIHByaXZhdGUgT2JqZWN0IHBheWxvYWQ7CisgICAgcHJpdmF0ZSBMaW5rT2JqZWN0IG5leHQ7CisgICAgcHJpdmF0ZSBTdHJpbmcga2V5IDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgZWxlbWVudCBmcm9tIHRoZSBkYXRhIG9iamVjdC4KKyAgICAgKiBTZXRzIHRoZSBwb2ludGVyIHRvIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkKKyAgICAgKiBAcGFyYW0gcGF5bG9hZCBUaGUgZGF0YSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIExpbmtPYmplY3QoU3RyaW5nIGtleSxPYmplY3QgcGF5bG9hZCkgeworICAgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkOworICAgICAgICB0aGlzLm5leHQgPSBudWxsOworICAgICAgICB0aGlzLmtleSA9IGtleSA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuZXh0IGVsZW1lbnQuCisgICAgICogQHBhcmFtIG5leHQgVGhlIG5leHQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBlbmQoTGlua09iamVjdCBuZXh0KSB7CisgICAgICAgIHRoaXMubmV4dCA9IG5leHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuZXh0IGVsZW1lbnQuCisgICAgICogQHJldHVybiBUaGUgbmV4dCBlbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBMaW5rT2JqZWN0IG5leHQoKSB7CisgICAgICAgIHJldHVybiBuZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGF0YSBvYmplY3QgZnJvbSB0aGUgZWxlbWVudC4KKyAgICAgKiBAcmV0dXJuIFRoZSBkYXRhIG9iamVjdCBmcm9tIHRoZSBlbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIHBheWxvYWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB1bmlxdWUgbWVzc2FnZSBpZAorICAgICAqIEByZXR1cm4gdGhlIHVuaXF1ZSBtZXNzYWdlIGlkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRLZXkoKSB7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdXRpbC9TaW5nbGVSZW1vdmVTeW5jaHJvbml6ZWRBZGRMb2NrLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdXRpbC9TaW5nbGVSZW1vdmVTeW5jaHJvbml6ZWRBZGRMb2NrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2NzY2YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci91dGlsL1NpbmdsZVJlbW92ZVN5bmNocm9uaXplZEFkZExvY2suamF2YQpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnV0aWw7CisKKy8qKgorICogVGhlIGNsYXNzIDxiPlNpbmdsZVJlbW92ZVN5bmNocm9uaXplZEFkZExvY2s8L2I+IGltcGxlbWVudCBsb2NraW5nIGZvciBhY2Nlc3NpbmcgdGhlIHF1ZXVlCisgKiBieSBhIHNpbmdsZSByZW1vdmUgdGhyZWFkIGFuZCBtdWx0aXBsZSBhZGQgdGhyZWFkcy4KKyAqCisgKiBBIHRocmVhZCBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgZWl0aGVyIHRoZSByZW1vdmUgb3IKKyAqIGFuIGFkZCB0aHJlYWQuCisgKgorICogVGhlIGxvY2sgY2FuIGVpdGhlciBiZSBvd25lZCBieSB0aGUgcmVtb3ZlIHRocmVhZAorICogb3IgYnkgYSBzaW5nbGUgYWRkIHRocmVhZC4KKyAqCisgKiBJZiB0aGUgcmVtb3ZlIHRocmVhZCB0cmllcyB0byBnZXQgdGhlIGxvY2ssCisgKiBidXQgdGhlIHF1ZXVlIGlzIGVtcHR5LCBpdCB3aWxsIGJsb2NrIChwb2xsKQorICogdW50aWwgYW4gYWRkIHRocmVhZHMgYWRkcyBhbiBlbnRyeSB0byB0aGUgcXVldWUgYW5kCisgKiByZWxlYXNlcyB0aGUgbG9jay4KKyAqIAorICogSWYgdGhlIHJlbW92ZSB0aHJlYWQgYW5kIGFkZCB0aHJlYWRzIGNvbXBldGUgZm9yCisgKiB0aGUgbG9jayBhbmQgYW4gYWRkIHRocmVhZCByZWxlYXNlcyB0aGUgbG9jaywgdGhlbgorICogdGhlIHJlbW92ZSB0aHJlYWQgd2lsbCBnZXQgdGhlIGxvY2sgZmlyc3QuCisgKgorICogVGhlIHJlbW92ZSB0aHJlYWQgcmVtb3ZlcyBhbGwgZW50cmllcyBpbiB0aGUgcXVldWUKKyAqIGF0IG9uY2UgYW5kIHByb2NlZXNlcyB0aGVtIHdpdGhvdXQgZnVydGhlcgorICogcG9sbGluZyB0aGUgcXVldWUuCisgKgorICogVGhlIGxvY2sgaXMgbm90IHJlZW50cmFudCwgaW4gdGhlIHNlbnNlLCB0aGF0IGFsbAorICogdGhyZWFkcyBtdXN0IHJlbGVhc2UgYW4gb3duZWQgbG9jayBiZWZvcmUgY29tcGV0aW5nCisgKiBmb3IgdGhlIGxvY2sgYWdhaW4hCisgKgorICogQGF1dGhvciBSYWluZXIgSnVuZworICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gMS4xCisgKi8KKyAKK3B1YmxpYyBjbGFzcyBTaW5nbGVSZW1vdmVTeW5jaHJvbml6ZWRBZGRMb2NrIHsKKyAgICAKKyAgICBwdWJsaWMgU2luZ2xlUmVtb3ZlU3luY2hyb25pemVkQWRkTG9jaygpIHsKKyAgICB9CisgICAgCisgICAgcHVibGljIFNpbmdsZVJlbW92ZVN5bmNocm9uaXplZEFkZExvY2soYm9vbGVhbiBkYXRhQXZhaWxhYmxlKSB7CisgICAgICAgIHRoaXMuZGF0YUF2YWlsYWJsZT1kYXRhQXZhaWxhYmxlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aHJlYWRzCisgICAgICogd2FpdGluZyBmb3IgYW4gYWRkIGxvY2sgYXJlIHdva2VuIHVwLgorICAgICAqIFRoaXMgaXMgdXNlZCBhcyBhIHNhZmV0eSBtZWFzdXJlIGluIGNhc2UKKyAgICAgKiB0aHJlYWQgbm90aWZpY2F0aW9uIHZpYSB0aGUgdW5sb2NrIG1ldGhvZHMKKyAgICAgKiBoYXMgYSBidWcuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIGFkZFdhaXRUaW1lb3V0ID0gMTAwMDBMOworCisgICAgLyoqCisgICAgICogVGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhyZWFkcworICAgICAqIHdhaXRpbmcgZm9yIGEgcmVtb3ZlIGxvY2sgYXJlIHdva2VuIHVwLgorICAgICAqIFRoaXMgaXMgdXNlZCBhcyBhIHNhZmV0eSBtZWFzdXJlIGluIGNhc2UKKyAgICAgKiB0aHJlYWQgbm90aWZpY2F0aW9uIHZpYSB0aGUgdW5sb2NrIG1ldGhvZHMKKyAgICAgKiBoYXMgYSBidWcuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHJlbW92ZVdhaXRUaW1lb3V0ID0gMzAwMDBMOworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgcmVtb3ZlIHRocmVhZC4KKyAgICAgKiBJdCBpcyBzZXQgdG8gdGhlIHJlbW92ZSB0aHJlYWQgcG9sbGluZyBmb3IgZW50cmllcy4KKyAgICAgKiBJdCBpcyByZXNldCB0byBudWxsIHdoZW4gdGhlIHJlbW92ZSB0aHJlYWQKKyAgICAgKiByZWxlYXNlcyB0aGUgbG9jayBhbmQgcHJvY2VlZHMgcHJvY2Vzc2luZworICAgICAqIHRoZSByZW1vdmVkIGVudHJpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBUaHJlYWQgcmVtb3ZlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBBIGZsYWcgaW5kaWNhdGluZywgaWYgYW4gYWRkIHRocmVhZCBvd25zIHRoZSBsb2NrLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBhZGRMb2NrZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEEgZmxhZyBpbmRpY2F0aW5nLCBpZiB0aGUgcmVtb3ZlIHRocmVhZCBvd25zIHRoZSBsb2NrLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiByZW1vdmVMb2NrZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEEgZmxhZyBpbmRpY2F0aW5nLCBpZiB0aGUgcmVtb3ZlIHRocmVhZCBpcyBhbGxvd2VkCisgICAgICogdG8gd2FpdCBmb3IgdGhlIGxvY2suIFRoZSBmbGFnIGlzIHNldCB0byBmYWxzZSwgd2hlbiBhYm9ydGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlRW5hYmxlZCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBBIGZsYWcgaW5kaWNhdGluZywgaWYgdGhlIHJlbW92ZXIgbmVlZHMgcG9sbGluZy4KKyAgICAgKiBJdCBpbmRpY2F0ZXMsIGlmIHRoZSBsb2NrZWQgb2JqZWN0IGhhcyBkYXRhIGF2YWlsYWJsZQorICAgICAqIHRvIGJlIHJlbW92ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRhdGFBdmFpbGFibGUgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVmFsdWUgb2YgYWRkV2FpdFRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0QWRkV2FpdFRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBhZGRXYWl0VGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdmFsdWUgb2YgYWRkV2FpdFRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0QWRkV2FpdFRpbWVvdXQobG9uZyB0aW1lb3V0KSB7CisgICAgICAgIGFkZFdhaXRUaW1lb3V0ID0gdGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHJlbW92ZVdhaXRUaW1lb3V0CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldFJlbW92ZVdhaXRUaW1lb3V0KCkgeworICAgICAgICByZXR1cm4gcmVtb3ZlV2FpdFRpbWVvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHZhbHVlIG9mIHJlbW92ZVdhaXRUaW1lb3V0CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFJlbW92ZVdhaXRUaW1lb3V0KGxvbmcgdGltZW91dCkgeworICAgICAgICByZW1vdmVXYWl0VGltZW91dCA9IHRpbWVvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIGxvY2tlZCBvYmplY3QgaGFzIGRhdGEgYXZhaWxhYmxlCisgICAgICogaS5lLiB0aGUgcmVtb3ZlciBjYW4gc3RvcCBwb2xpbmcgYW5kIGdldCB0aGUgbG9jay4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWZmIHRoZSBsb2NrIE9iamVjdCBoYXMgZGF0YSBhdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRGF0YUF2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGRhdGFBdmFpbGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYW4gYWRkIHRocmVhZCBvd25zIHRoZSBsb2NrLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZmYgYW4gYWRkIHRocmVhZCBvd25zIHRoZSBsb2NrLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0FkZExvY2tlZCgpIHsKKyAgICAgICAgcmV0dXJuIGFkZExvY2tlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgcmVtb3ZlIHRocmVhZCBvd25zIHRoZSBsb2NrLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZmYgdGhlIHJlbW92ZSB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNSZW1vdmVMb2NrZWQoKSB7CisgICAgICAgIHJldHVybiByZW1vdmVMb2NrZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIHJlbW92ZSB0aHJlYWQgaXMgcG9sbGluZy4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWZmIHRoZSByZW1vdmUgdGhyZWFkIGlzIHBvbGxpbmcuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzUmVtb3ZlUG9sbGluZygpIHsKKyAgICAgICAgaWYgKCByZW1vdmVyICE9IG51bGwgKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNxdWlyZXMgdGhlIGxvY2sgYnkgYW4gYWRkIHRocmVhZCBhbmQgc2V0cyB0aGUgYWRkIGZsYWcuCisgICAgICogSWYgYW55IGFkZCB0aHJlYWQgb3IgdGhlIHJlbW92ZSB0aHJlYWQgYWxyZWFkeSBhY3F1aXJlZCB0aGUgbG9jaworICAgICAqIHRoaXMgYWRkIHRocmVhZCB3aWxsIGJsb2NrIHVudGlsIHRoZSBsb2NrIGlzIHJlbGVhc2VkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2NrQWRkKCkgeworICAgICAgICBpZiAoIGFkZExvY2tlZCB8fCByZW1vdmVMb2NrZWQgKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd2FpdChhZGRXYWl0VGltZW91dCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoIEludGVycnVwdGVkRXhjZXB0aW9uIGUgKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoIGFkZExvY2tlZCB8fCByZW1vdmVMb2NrZWQgKTsKKyAgICAgICAgfQorICAgICAgICBhZGRMb2NrZWQ9dHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY3F1aXJlcyB0aGUgbG9jayBieSB0aGUgcmVtb3ZlIHRocmVhZCBhbmQgc2V0cyB0aGUgcmVtb3ZlIGZsYWcuCisgICAgICogSWYgYW55IGFkZCB0aHJlYWQgYWxyZWFkeSBhY3F1aXJlZCB0aGUgbG9jayBvciB0aGUgcXVldWUgaXMKKyAgICAgKiBlbXB0eSwgdGhlIHJlbW92ZSB0aHJlYWQgd2lsbCBibG9jayB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZAorICAgICAqIGFuZCB0aGUgcXVldWUgaXMgbm90IGVtcHR5LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBsb2NrUmVtb3ZlKCkgeworICAgICAgICByZW1vdmVMb2NrZWQ9ZmFsc2U7CisgICAgICAgIHJlbW92ZUVuYWJsZWQ9dHJ1ZTsKKyAgICAgICAgaWYgKCAoIGFkZExvY2tlZCB8fCAhIGRhdGFBdmFpbGFibGUgKSAmJiByZW1vdmVFbmFibGVkICkgeworICAgICAgICAgICAgcmVtb3Zlcj1UaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdhaXQocmVtb3ZlV2FpdFRpbWVvdXQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlICkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKCAoIGFkZExvY2tlZCB8fCAhIGRhdGFBdmFpbGFibGUgKSAmJiByZW1vdmVFbmFibGVkICk7CisgICAgICAgICAgICByZW1vdmVyPW51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCByZW1vdmVFbmFibGVkICkgeworICAgICAgICAgICAgcmVtb3ZlTG9ja2VkPXRydWU7CisgICAgICAgIH0gCisgICAgICAgIHJldHVybiByZW1vdmVMb2NrZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsZWFzZXMgdGhlIGxvY2sgYnkgYW4gYWRkIHRocmVhZCBhbmQgcmVzZXQgdGhlIHJlbW92ZSBmbGFnLgorICAgICAqIElmIHRoZSByZWFkZXIgdGhyZWFkIGlzIHBvbGxpbmcsIG5vdGlmeSBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdW5sb2NrQWRkKGJvb2xlYW4gZGF0YUF2YWlsYWJsZSkgeworICAgICAgICBhZGRMb2NrZWQ9ZmFsc2U7CisgICAgICAgIHRoaXMuZGF0YUF2YWlsYWJsZT1kYXRhQXZhaWxhYmxlOworICAgICAgICBpZiAoICggcmVtb3ZlciAhPSBudWxsICkgJiYgKCBkYXRhQXZhaWxhYmxlIHx8ICEgcmVtb3ZlRW5hYmxlZCApICkgeworICAgICAgICAgICAgcmVtb3Zlci5pbnRlcnJ1cHQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5vdGlmeUFsbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsZWFzZXMgdGhlIGxvY2sgYnkgdGhlIHJlbW92ZSB0aHJlYWQgYW5kIHJlc2V0IHRoZSBhZGQgZmxhZy4KKyAgICAgKiBOb3RpZnkgYWxsIHdhaXRpbmcgYWRkIHRocmVhZHMsCisgICAgICogdGhhdCB0aGUgbG9jayBoYXMgYmVlbiByZWxlYXNlZCBieSB0aGUgcmVtb3ZlIHRocmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdW5sb2NrUmVtb3ZlKCkgeworICAgICAgICByZW1vdmVMb2NrZWQ9ZmFsc2U7CisgICAgICAgIGRhdGFBdmFpbGFibGU9ZmFsc2U7CisgICAgICAgIG5vdGlmeUFsbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFib3J0IGFueSBwb2xsaW5nIHJlbW92ZXIgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFib3J0UmVtb3ZlKCkgeworICAgICAgICByZW1vdmVFbmFibGVkPWZhbHNlOworICAgICAgICBpZiAoIHJlbW92ZXIgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHJlbW92ZXIuaW50ZXJydXB0KCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci91dGlsL1NtYXJ0UXVldWUuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci91dGlsL1NtYXJ0UXVldWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzE1ZmI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3V0aWwvU21hcnRRdWV1ZS5qYXZhCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudXRpbDsKKworLyoqCisgKiBBIHNtYXJ0IHF1ZXVlLCB1c2VkIGZvciBhc3luYyByZXBsaWNhdGlvbiA8QlI+CisgKiB0aGUgInNtYXJ0IiBwYXJ0IG9mIHRoaXMgcXVldWUgaXMgdGhhdCBpZiB0aGUgc2Vzc2lvbiBpcyBhbHJlYWR5IHF1ZXVlZCBmb3IKKyAqIHJlcGxpY2F0aW9uLCBhbmQgaXQgaXMgdXBkYXRlZCBhZ2FpbiwgdGhlIHNlc3Npb24gd2lsbCBzaW1wbHkgYmUgcmVwbGFjZWQsCisgKiBoZW5jZSB3ZSBkb24ndCByZXBsaWNhdGUgc3R1ZmYgdGhhdCBpcyBvYnNvbGV0ZS4gUHV0IHRoaXMgaW50byB1dGlsLCBzaW5jZSBpdAorICogaXMgcXVpdGUgZ2VuZXJpYy4KKyAqIAorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gMS4wCisgKi8KKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitwdWJsaWMgY2xhc3MgU21hcnRRdWV1ZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5CisgICAgICAgICAgICAuZ2V0TG9nKFNtYXJ0UXVldWUuY2xhc3MpOworCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgYWN0dWFsIHF1ZXVlCisgICAgICovCisgICAgcHJpdmF0ZSBMaW5rZWRMaXN0IHF1ZXVlID0gbmV3IExpbmtlZExpc3QoKTsKKworICAgIC8qKgorICAgICAqIEFuZCB0aGlzIGlzIG9ubHkgZm9yIHBlcmZvcm1hbmNlLCBmYXN0IGxvb2t1cHMKKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgcXVldWVNYXAgPSBuZXcgSGFzaE1hcCgpOworCisgICAgcHJpdmF0ZSBPYmplY3QgbXV0ZXggPSBuZXcgT2JqZWN0KCk7CisKKyAgICBwdWJsaWMgU21hcnRRdWV1ZSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gb2JqZWN0IHRvIHRoZSBxdWV1ZQorICAgICAqIAorICAgICAqIEBwYXJhbSBlbnRyeSAtCisgICAgICogICAgICAgICAgICB0aGUgc21hcnQgZW50cnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoU21hcnRFbnRyeSBlbnRyeSkgeworICAgICAgICAvKgorICAgICAgICAgKiBtYWtlIHN1cmUgd2UgYXJlIHdpdGhpbiBhIHN5bmNocm9uaXplZCBibG9jayBzaW5jZSB3ZSBhcmUgZGVhbGluZworICAgICAgICAgKiB3aXRoIHR3byB1bnN5bmMgY29sbGVjdGlvbnMKKyAgICAgICAgICovCisgICAgICAgIHN5bmNocm9uaXplZCAobXV0ZXgpIHsKKyAgICAgICAgICAgIC8qIGNoZWNrIHRvIHNlZSBpZiB0aGlzIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIHF1ZXVlZCAqLworICAgICAgICAgICAgU21hcnRFbnRyeSBjdXJyZW50ID0gKFNtYXJ0RW50cnkpIHF1ZXVlTWFwLmdldChlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLyogdGhlIG9iamVjdCBoYXMgbm90IGJlZW4gcXVldWVkLCBhdCBpdCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZSAqLworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJbIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXVtTbWFydFF1ZXVlXSBBZGRpbmcgbmV3IG9iamVjdD0iICsgZW50cnkpOworICAgICAgICAgICAgICAgIHF1ZXVlLmFkZExhc3QoZW50cnkpOworICAgICAgICAgICAgICAgIHF1ZXVlTWFwLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiB0aGUgb2JqZWN0IGhhcyBiZWVuIHF1ZXVlZCwgcmVwbGFjZSB0aGUgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiWyIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl1bU21hcnRRdWV1ZV0gUmVwbGFjaW5nIG9sZCBvYmplY3Q9IiArIGN1cnJlbnQpOworICAgICAgICAgICAgICAgIGN1cnJlbnQuc2V0VmFsdWUoZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIndpdGggbmV3IG9iamVjdD0iICsgY3VycmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogd2FrZSB1cCBhbGwgdGhlIHRocmVhZHMgdGhhdCBhcmUgd2FpdGluZyBmb3IgdGhlIGxvY2sgdG8gYmUKKyAgICAgICAgICAgICAqIHJlbGVhc2VkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG11dGV4Lm5vdGlmeUFsbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG11dGV4KSB7CisgICAgICAgICAgICByZXR1cm4gcXVldWUuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmxvY2tzIGZvcmV2ZXIgdW50aWwgYW4gZWxlbWVudCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgcXVldWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU21hcnRFbnRyeSByZW1vdmUoKSB7CisgICAgICAgIHJldHVybiByZW1vdmUoMCk7CisgICAgfQorCisgICAgcHVibGljIFNtYXJ0RW50cnkgcmVtb3ZlKGxvbmcgdGltZW91dCkgeworICAgICAgICBTbWFydEVudHJ5IHJlc3VsdCA9IG51bGw7CisgICAgICAgIGxvbmcgc3RhcnRFbnRyeSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG11dGV4KSB7CisgICAgICAgICAgICB3aGlsZSAoc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlYnVnKCJbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdW1NtYXJ0UXVldWVdIFF1ZXVlIHNsZWVwaW5nIHVudGlsIG9iamVjdCBhZGRlZCBzaXplPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemUoKSArICIuIik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGltZW91dCAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydEVudHJ5KSA+IHRpbWVvdXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtdXRleC53YWl0KHRpbWVvdXQpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlYnVnKCJbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdW1NtYXJ0UXVldWVdIFF1ZXVlIHdva2UgdXAgb3IgaW50ZXJydXB0ZWQgc2l6ZT0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplKCkgKyAiLiIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB9Ly9jYXRjaAorICAgICAgICAgICAgfS8vd2hpbGUKKyAgICAgICAgICAgIC8qIGd1YXJhbnRlZWQgdGhhdCB3ZSBhcmUgbm90IGVtcHR5IGJ5IG5vdyAqLworICAgICAgICAgICAgcmVzdWx0ID0gKFNtYXJ0RW50cnkpIHF1ZXVlLnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICBxdWV1ZU1hcC5yZW1vdmUocmVzdWx0LmdldEtleSgpKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlsiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl1bU21hcnRRdWV1ZV0gUmV0dXJuaW5nPSIgKyByZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTbWFydEVudHJ5IHsKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBrZXk7CisKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgU21hcnRFbnRyeShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlNtYXJ0RW50cnkga2V5IGNhbiBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiU21hcnRFbnRyeSB2YWx1ZSBjYW4gbm90IGJlIG51bGwuIik7CisgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgeworICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiU21hcnRFbnRyeSB2YWx1ZSBjYW4gbm90IGJlIG51bGwuIik7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIGtleS5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgU21hcnRFbnRyeSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgU21hcnRFbnRyeSBvdGhlciA9IChTbWFydEVudHJ5KSBvOworICAgICAgICAgICAgcmV0dXJuIG90aGVyLmdldEtleSgpLmVxdWFscyhnZXRLZXkoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJbU21hcnR5RW50cnkga2V5PSIgKyBrZXkgKyAiIHZhbHVlPSIgKyB2YWx1ZSArICJdIjsKKyAgICAgICAgfQorICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvdGVzdC9idWlsZC54bWwgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3Rlc3QvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMDE2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3Rlc3QvYnVpbGQueG1sCkBAIC0wLDAgKzEsMTAzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IS0tIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2ggLS0+Cis8cHJvamVjdCBuYW1lPSJUb21jYXQ6IENsdXN0ZXIgVGVzdGNhc2VzIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0Ij4KKwk8cHJvcGVydHkgZmlsZT0iLi4vLi4vLi4vLi4vYnVpbGQvYnVpbGQucHJvcGVydGllcyIgLz4KKwk8cHJvcGVydHkgZmlsZT0iLi4vLi4vLi4vLi4vYnVpbGQvYnVpbGQucHJvcGVydGllcy5kZWZhdWx0IiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LnJlcG9ydC5sb2dzIiB2YWx1ZT0ibG9ncy9yZXBvcnRzIiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LnJlc3VsdHMiIHZhbHVlPSJsb2dzL3Rlc3QtcmVzdWx0cyIgLz4KKworCTxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLm9wdGltaXplIiB2YWx1ZT0idHJ1ZSIgLz4KKwk8cHJvcGVydHkgbmFtZT0iY29tcGlsZS5kZWJ1ZyIgdmFsdWU9InRydWUiIC8+CisJPHByb3BlcnR5IG5hbWU9ImNvbXBpbGUuc291cmNlIiB2YWx1ZT0iMS40IiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLmRlcHJlY2F0aW9uIiB2YWx1ZT0idHJ1ZSIgLz4KKwk8cHJvcGVydHkgbmFtZT0iY29tcGlsZS5ub3dhcm4iIHZhbHVlPSJvZmYiIC8+CisJPHByb3BlcnR5IG5hbWU9ImNvbXBpbGUuZW5jb2RpbmciIHZhbHVlPSJJU08tODg1OS0xIiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSJidWlsZC90ZXN0IiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0ic3JjL3NoYXJlIiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5ob21lIiB2YWx1ZT0iLi4vLi4vLi4vLi4vYnVpbGQvYnVpbGQiIC8+CisKKwk8IS0tIEJ1aWxkIHRoZSBjbGFzc3BhdGggLS0+CisJPHBhdGggaWQ9InByb2plY3QuY2xhc3NwYXRoIj4KKwkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pteC5qYXJ9IiAvPgorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sb2dnaW5nLmphcn0iIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtsb2c0ai5qYXJ9IiAvPgorCQk8ZmlsZXNldCBkaXI9IiR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2VuZG9yc2VkIj4KKwkJCTxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorCQk8L2ZpbGVzZXQ+CisJCTxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5ob21lfS9jb21tb24vbGliIj4KKwkJCTxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorCQk8L2ZpbGVzZXQ+CisJCTxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5ob21lfS9zZXJ2ZXIvbGliIj4KKwkJCTxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorCQk8L2ZpbGVzZXQ+CisJPC9wYXRoPgorCisJPHRhcmdldCBuYW1lPSJidWlsZC1wcmVwYXJlIj4KKwkJPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9IiAvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJpbmZvIiBkZXNjcmlwdGlvbj0iU2hvd3MgYSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFudCBzY3JpcHQiPgorCQk8ZWNobz4KKwkJCVRoaXMgYW50IHNjcmlwdCBpbXBsZW1lbnRzIHNvbWUgdGVzdGNhc2VzIHRvIHZlcmlmeSB0aGUga2V5IGZ1bmN0aW9ucyBvZiB0b21jYXQgY2x1c3RlcmluZyBtb2R1bGUuCisJCQlZb3UgZmluZCB0aGlzIHNjcmlwdCBhdDogJHthbnQuZmlsZX0KKwkJPC9lY2hvPgorCTwvdGFyZ2V0PgorCisJPCEtLSBUaGlzIHRhcmdldCBjb21waWxlcyBhbGwgc291cmNlcyBvdXQgb2YgdGhlIAorCQkJcHJvamVjdHMgc291cmNlIHRyZWUgLS0+CisJPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlIiBkZXNjcmlwdGlvbj0iVGhpcyB0YXJnZXQgY29tcGlsZXMgYWxsIHNvdXJjZXMgb3V0IG9mIHRoZSBwcm9qZWN0cyBzb3VyY2UgdHJlZSI+CisKKwkJPCEtLSBDb3BpZXMgdGhlIHN0YXRpYyByZXNvdXJjZXMgb3V0IG9mIHRoZSBzcmMgdHJlZQorCQkJCXRvIHRoZSBidWlsZC9jbGFzc2VzIGRpciAtLT4KKwkJPGNvcHkgdG9kaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIj4KKwkJCTxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSI+CisJCQkJPGluY2x1ZGUgbmFtZT0iKioiIC8+CisJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgorCQkJPC9maWxlc2V0PgorCQk8L2NvcHk+CisKKwkJPCEtLSBDb21waWxlcyBhbGwgc291cmNlcyAtLT4KKwkJPGphdmFjIGRlc3RkaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIiBzcmNkaXI9IiR7c3JjLmRpcn0iIGluY2x1ZGVzPSIqKi8qLmphdmEiIGV4Y2x1ZGVzPSIqKi9DVlMvKioiIGRlcHJlY2F0aW9uPSIke2NvbXBpbGUuZGVwcmVjYXRpb259IiBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIgc291cmNlPSIke2NvbXBpbGUuc291cmNlfSIgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iIG5vd2Fybj0iJHtjb21waWxlLm5vd2Fybn0iIGVuY29kaW5nPSIke2NvbXBpbGUuZW5jb2Rpbmd9Ij4KKwkJCTxjbGFzc3BhdGg+CisJCQkJPHBhdGggcmVmaWQ9InByb2plY3QuY2xhc3NwYXRoIiAvPgorCQkJPC9jbGFzc3BhdGg+CisJCTwvamF2YWM+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJSdW4gdW5pdCB0ZXN0cyI+CisJCTxkZWxldGUgZGlyPSIke3Rlc3QucmVzdWx0c30iIC8+CisJCTxta2RpciBkaXI9IiR7dGVzdC5yZXN1bHRzfSIgLz4KKwkJPGp1bml0IGZvcms9InllcyIgZmFpbHVyZVByb3BlcnR5PSJ0ZXN0LmZhaWx1cmUiPgorCQkJPGp2bWFyZyB2YWx1ZT0iLURjYXRhbGluYS5iYXNlPSR7YmFzZWRpcn0iIC8+CisJCQk8anZtYXJnIHZhbHVlPSItRGNhdGFsaW5hLmhvbWU9JHtjYXRhbGluYS5ob21lfSIgLz4KKwkJCTxqdm1hcmcgdmFsdWU9Ii1EbG9nNGouY29uZmlndXJhdGlvbj1maWxlOmNvbmYvbG9nNGoueG1sIiAvPgorCQkJPGNsYXNzcGF0aD4KKwkJCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9jbGFzc2VzIiAvPgorCQkJCTxwYXRoIHJlZmlkPSJwcm9qZWN0LmNsYXNzcGF0aCIgLz4KKwkJCTwvY2xhc3NwYXRoPgorCQkJPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIgdXNlZmlsZT0iZmFsc2UiIC8+CisJCQk8Zm9ybWF0dGVyIHR5cGU9InhtbCIgLz4KKwkJCTxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdC5yZXN1bHRzfSI+CisJCQkJPGZpbGVzZXQgZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIgaW5jbHVkZXM9IioqLypUZXN0LmNsYXNzIiAvPgorCQkJPC9iYXRjaHRlc3Q+CisJCTwvanVuaXQ+CisJCTxta2RpciBkaXI9IiR7dGVzdC5yZXBvcnQubG9nc30iIC8+CisJCTxqdW5pdHJlcG9ydCB0b2Rpcj0iJHt0ZXN0LnJlcG9ydC5sb2dzfSI+CisJCQk8ZmlsZXNldCBkaXI9IiR7dGVzdC5yZXN1bHRzfSIgLz4KKwkJCTxyZXBvcnQgZm9ybWF0PSJmcmFtZXMiIHRvZGlyPSIke3Rlc3QucmVwb3J0LmxvZ3N9IiAvPgorCQk8L2p1bml0cmVwb3J0PgorCQk8YW50Y2FsbCB0YXJnZXQ9ImNoZWNrdGVzdCIgLz4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iY2hlY2t0ZXN0IiBpZj0idGVzdC5mYWlsdXJlIj4KKwkJPGZhaWwgbWVzc2FnZT0ic29tZSB0ZXN0IGZhaWxlZCIgLz4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iY2xlYW4iPgorCQk8ZGVsZXRlIGRpcj0iJHtidWlsZH0vZGlyIiAvPgorCQk8ZGVsZXRlIGRpcj0iYnVpbGQiIC8+CisJCTxkZWxldGUgZGlyPSIke3Rlc3QucmVwb3J0LmxvZ3N9IiAvPgorCQk8ZGVsZXRlIGRpcj0iJHt0ZXN0LnJlc3VsdHN9IiAvPgorCQk8ZGVsZXRlIGRpcj0ibG9ncyIgLz4KKwk8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvdGVzdC9jb25mL2xvZzRqLnhtbCBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvdGVzdC9jb25mL2xvZzRqLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQzZWEzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci90ZXN0L2NvbmYvbG9nNGoueG1sCkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhRE9DVFlQRSBsb2c0ajpjb25maWd1cmF0aW9uIFNZU1RFTSAibG9nNGouZHRkIj4KKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSAtLT4KKzwhLS0gTG9nNGogQ29uZmlndXJhdGlvbiAtLT4KKzwhLS0gLS0+Cis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0gJElkJCAtLT4KKzwhLS0KK3wgRm9yIG1vcmUgY29uZmlndXJhdGlvbiBpbmZyb21hdGlvbiBhbmQgZXhhbXBsZXMgc2VlIHRoZSBKYWthcnRhIExvZzRqCit8IG93ZWJzaXRlOiBodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2xvZzRqCistLT4KKzxsb2c0ajpjb25maWd1cmF0aW9uIHhtbG5zOmxvZzRqPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2xvZzRqLyIgZGVidWc9ImZhbHNlIj4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIEFwcGVuZCBtZXNzYWdlcyB0byB0aGUgY29uc29sZSAtLT4KKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzxhcHBlbmRlciBuYW1lPSJDT05TT0xFIiBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIiPgorICAgPHBhcmFtIG5hbWU9IlRhcmdldCIgdmFsdWU9IlN5c3RlbS5vdXQiLz4KKyAgIDxwYXJhbSBuYW1lPSJUaHJlc2hvbGQiIHZhbHVlPSJkZWJ1ZyIvPgorICAgPGxheW91dCBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ij4KKyAgICAgIDxwYXJhbSBuYW1lPSJDb252ZXJzaW9uUGF0dGVybiIgdmFsdWU9IiVke0FCU09MVVRFfSAlLTVwIFslY3sxfV0gJW0lbiIvPgorICAgPC9sYXlvdXQ+Cis8L2FwcGVuZGVyPgorCisKKzxjYXRlZ29yeSBuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIiIAorICAgICAgICAgICBhZGRpdGl2aXR5PSJmYWxzZSI+IAorICAgPHByaW9yaXR5IHZhbHVlPSJpbmZvIiAvPgorICAgPGFwcGVuZGVyLXJlZiByZWY9IkNPTlNPTEUiIC8+Cis8L2NhdGVnb3J5PgorCis8Y2F0ZWdvcnkgbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYSIgCisgICAgICAgICAgIGFkZGl0aXZpdHk9ImZhbHNlIj4gCisgICA8cHJpb3JpdHkgdmFsdWU9ImluZm8iIC8+CisgICA8YXBwZW5kZXItcmVmIHJlZj0iQ09OU09MRSIgLz4KKzwvY2F0ZWdvcnk+CisKKzwhLS0gU2V0dXAgdGhlIFJvb3QgYyAgLS0+Cis8cm9vdD4KKyAgIDxwcmlvcml0eSB2YWx1ZT0iaW5mbyIgLz4KKyAgIDxhcHBlbmRlci1yZWYgcmVmPSJDT05TT0xFIi8+Cis8L3Jvb3Q+Cis8L2xvZzRqOmNvbmZpZ3VyYXRpb24+IAorCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9pby9YQnl0ZUJ1ZmZlclRlc3QuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2lvL1hCeXRlQnVmZmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NzRhYTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9pby9YQnl0ZUJ1ZmZlclRlc3QuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmlvOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuQ2x1c3RlckRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlOworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFhCeXRlQnVmZmVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RCeXRlcygpIHsKKyAgICAgICAgWEJ5dGVCdWZmZXIgeGJ1ZiA9IG5ldyBYQnl0ZUJ1ZmZlcigpIDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAseGJ1Zi5idWZTaXplKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMjQseGJ1Zi5idWYubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAseGJ1Zi5nZXRCeXRlcygpLmxlbmd0aCk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoeGJ1Zi5idWYseGJ1Zi5nZXRCeXRlcygpKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGVzdCBhcHBlbmQgdG8gbWVzc2FnZSBidWZmZXIKKyAgICAgKiBUZXN0IHRoYXQgb25seSBjb3JyZWN0IG1lc3NhZ2UgaGVhZGVyIGFyZSBhcHBlbmRlZCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kKCkgeworICAgICAgICBYQnl0ZUJ1ZmZlciB4YnVmID0gbmV3IFhCeXRlQnVmZmVyKCk7CisgICAgICAgIGJ5dGVbXSBicyA9IG5ldyBieXRlW10geyAxLCAyLCAzIH07CisgICAgICAgIGJvb2xlYW4gc3RhdHVzID0geGJ1Zi5hcHBlbmQoYnMsIDAsIDMpOworICAgICAgICBhc3NlcnRUcnVlKHN0YXR1cyk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCB4YnVmLmJ1ZlNpemUpOworICAgICAgICBieXRlIGJ1ZltdID0geGJ1Zi5nZXRCeXRlcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgYnVmLmxlbmd0aCk7CisgICAgICAgIHN0YXR1cyA9IHhidWYuYXBwZW5kKGJzLCAwLCAzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0dXMpOworICAgICAgICBzdGF0dXMgPSB4YnVmLmFwcGVuZChicywgMCwgMyk7CisgICAgICAgIC8vIG5vdCBhIGNvcnJlY3QgbWVzc2FnZSAhIQorICAgICAgICBhc3NlcnRGYWxzZShzdGF0dXMpOworICAgICAgICAvLyBidWZmZXIgaXMgY2xlYXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCx4YnVmLmJ1ZlNpemUpOworICAgICAgICBzdGF0dXMgPSB4YnVmLmFwcGVuZChYQnl0ZUJ1ZmZlci5TVEFSVF9EQVRBLDAsIFhCeXRlQnVmZmVyLlNUQVJUX0RBVEEubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0dXMpOyAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0IGNyZWF0ZSBhIHVuY29tcHJlc3NlZCBtdWx0aSBtZXNzYWdlIGRhdGEgcGFja2FnZSBhbmQgZXh0cmFjdCBpdAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZFVuY29tcHJlc3NlZE1lc3NhZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhc3NlcnRTZW5kTWVzc2FnZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0U2VuZE1lc3NhZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gdGVzdCA9IGNyZWF0ZU1lc3NhZ2UoKTsKKyAgICAgICAgWEJ5dGVCdWZmZXIgYiA9IG5ldyBYQnl0ZUJ1ZmZlcigpOworICAgICAgICBiLmFwcGVuZCh0ZXN0LCAwLCB0ZXN0Lmxlbmd0aCk7CisgICAgICAgIGludCBzID0gYi5jb3VudFBhY2thZ2VzKCk7CisgICAgICAgIGJ5dGVbXSBkIDsKKyAgICAgICAgQ2x1c3RlckRhdGEgZGF0YSA7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBzKTsKKyAgICAgICAgZm9yIChieXRlIGkgPSAxOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBkYXRhID0gYi5leHRyYWN0UGFja2FnZSh0cnVlKTsKKyAgICAgICAgICAgIGQgPSBkYXRhLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgbWVzc2FnZSBjb250ZW50IixpLCBkWzBdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNyZWF0ZSB0aHJlZSBtZXNzYWdlIGluc2lkZSBvbmUgYnl0ZSBidWZmZXIKKyAgICAgKiBAcmV0dXJuIHRocmVlIGNsdXN0ZXJtZXNzYWdlIGF0IG9uZSBieXRlIGFycmF5CisgICAgICogQHNlZSBYQnl0ZUJ1ZmZlciNjcmVhdGVEYXRhUGFja2FnZShieXRlW10pCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgYnl0ZVtdIGNyZWF0ZU1lc3NhZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gZDEgPSBYQnl0ZUJ1ZmZlci5jcmVhdGVEYXRhUGFja2FnZShuZXcgYnl0ZVtdIHsgMSB9LENsdXN0ZXJNZXNzYWdlLkZMQUdfRk9SQklEREVOKTsKKyAgICAgICAgYnl0ZVtdIGQyID0gWEJ5dGVCdWZmZXIuY3JlYXRlRGF0YVBhY2thZ2UobmV3IGJ5dGVbXSB7IDIgfSxDbHVzdGVyTWVzc2FnZS5GTEFHX0ZPUkJJRERFTik7CisgICAgICAgIGJ5dGVbXSBkMyA9IFhCeXRlQnVmZmVyLmNyZWF0ZURhdGFQYWNrYWdlKG5ldyBieXRlW10geyAzIH0sQ2x1c3Rlck1lc3NhZ2UuRkxBR19GT1JCSURERU4pOworICAgICAgICBieXRlW10gdGVzdCA9IG5ldyBieXRlW2QxLmxlbmd0aCArIGQyLmxlbmd0aCArIGQzLmxlbmd0aCArIDVdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGQxLCAwLCB0ZXN0LCAwLCBkMS5sZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGQyLCAwLCB0ZXN0LCBkMS5sZW5ndGgsIGQyLmxlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZDMsIDAsIHRlc3QsIGQyLmxlbmd0aCArIGQxLmxlbmd0aCwgZDMubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHRlc3Q7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSB0eXBlIGNvbnZlcnRlcyB0byBhbmQgZnJvbSBieXRlIGFycmF5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFR5cGVDb252ZXJ0ZXIoKSB7CisgICAgICAgIGJ5dGVbXSBkID0gWEJ5dGVCdWZmZXIudG9CeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBkLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLk1BWF9WQUxVRSwgWEJ5dGVCdWZmZXIudG9JbnQoZCwgMCkpOworCisgICAgICAgIGQgPSBYQnl0ZUJ1ZmZlci50b0J5dGVzKExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDgsIGQubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvbmcuTUFYX1ZBTFVFLCBYQnl0ZUJ1ZmZlci50b0xvbmcoZCwgMCkpOworICAgICAgICBkID0gWEJ5dGVCdWZmZXIudG9CeXRlcygobG9uZykgNDU2NDU2NCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0NTY0NTY0LCBYQnl0ZUJ1ZmZlci50b0xvbmcoZCwgMCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWNhc3QvTWNhc3RNZW1iZXJUZXN0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9tY2FzdC9NY2FzdE1lbWJlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmUzYjZlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWNhc3QvTWNhc3RNZW1iZXJUZXN0LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLm1jYXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmlvLlhCeXRlQnVmZmVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgTWNhc3RNZW1iZXJUZXN0IGV4dGVuZHMgVGVzdENhc2V7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVCA9ICIwMTIzNDU2Nzg5IjsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbNDRdOworICAgICAgICBsb25nIGFsaXZlPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLTIwOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KFhCeXRlQnVmZmVyLnRvQnl0ZXMoKGxvbmcpYWxpdmUpLDAsZGF0YSwwLDgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KFhCeXRlQnVmZmVyLnRvQnl0ZXMoMjAwMDApLDAsZGF0YSw4LDQpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KFhCeXRlQnVmZmVyLnRvQnl0ZXMoMTIwMDAwMDAwKSwwLGRhdGEsMTIsNCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoWEJ5dGVCdWZmZXIudG9CeXRlcygxMCksMCxkYXRhLDE2LDQpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KFRFU1QuZ2V0Qnl0ZXMoKSwwLGRhdGEsMjAsVEVTVC5sZW5ndGgoKSk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoWEJ5dGVCdWZmZXIudG9CeXRlcygxMCksMCxkYXRhLDMwLDQpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KFRFU1QuZ2V0Qnl0ZXMoKSwwLGRhdGEsMzQsVEVTVC5sZW5ndGgoKSk7CisgICAgICAgIE1jYXN0TWVtYmVyIG1lbWJlciA9IE1jYXN0TWVtYmVyLmdldE1lbWJlcihkYXRhKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lbWJlci5nZXROYW1lKCksVEVTVCk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZW1iZXIuZ2V0RG9tYWluKCksVEVTVCk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZW1iZXIuZ2V0UG9ydCgpLDIwMDAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lbWJlci5nZXRIb3N0KCksIjcuMzkuMTQuMCIpOworICAgICAgICBieXRlW10gZGF0YTEgPSBtZW1iZXIuZ2V0RGF0YSgyMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCxkYXRhMS5sZW5ndGgpOworICAgICAgICBNY2FzdE1lbWJlciBtZW1iZXIxID0gTWNhc3RNZW1iZXIuZ2V0TWVtYmVyKGRhdGExKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lbWJlcjEuZ2V0TmFtZSgpLFRFU1QpOworICAgICAgICBhc3NlcnRFcXVhbHMobWVtYmVyMS5nZXREb21haW4oKSxURVNUKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lbWJlcjEuZ2V0UG9ydCgpLDIwMDAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lbWJlcjEuZ2V0SG9zdCgpLCI3LjM5LjE0LjAiKTsKKyAgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9EZWx0YU1hbmFnZXJUZXN0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0RlbHRhTWFuYWdlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTM5NTg3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9EZWx0YU1hbmFnZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIubWNhc3QuTWNhc3RNZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLm1jYXN0Lk1jYXN0U2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlNpbXBsZVRjcENsdXN0ZXI7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgRGVsdGFNYW5hZ2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTZXNzaW9uKCkgeworICAgICAgICBNb2NrRGVsdGFNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTW9ja0RlbHRhTWFuYWdlcigpIDsKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbWFuYWdlci5jcmVhdGVTZXNzaW9uKG51bGwsZmFsc2UpOworICAgICAgICBhc3NlcnROb3ROdWxsKHNlc3Npb24uZ2V0SWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzMiwgc2Vzc2lvbi5nZXRJZCgpLmxlbmd0aCgpKTsKKyAgICAgICAgc2Vzc2lvbiA9IG1hbmFnZXIuY3JlYXRlU2Vzc2lvbihudWxsLHRydWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2Vzc2lvbixtYW5hZ2VyLnNlc3Npb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoc2Vzc2lvbi5nZXRJZCgpLG1hbmFnZXIuc2Vzc2lvbklEKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdGhhbmRsZUdFVF9BTExfU0VTU0lPTlMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTW9ja0RlbHRhTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1vY2tEZWx0YU1hbmFnZXIoKSA7CisgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG1hbmFnZXIuY3JlYXRlU2Vzc2lvbihudWxsLGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlc3Npb24sIG1hbmFnZXIuZmluZFNlc3Npb24oc2Vzc2lvbi5nZXRJZCgpKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgbWFuYWdlci5jcmVhdGVTZXNzaW9uKG51bGwsZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygxMSxtYW5hZ2VyLmdldFNlc3Npb25Db3VudGVyKCkpOworICAgICAgICBNZW1iZXIgc2VuZGVyID0gbmV3IE1jYXN0TWVtYmVyKCJ0ZXN0IiwiZDEwIiwibG9jYWxob3N0Iiw4MDgwLDMwMDApOworICAgICAgICBNb2NrQ2x1c3RlciBjbHVzdGVyID0gbmV3IE1vY2tDbHVzdGVyICgpOworICAgICAgICBtYW5hZ2VyLnNldENsdXN0ZXIoY2x1c3Rlcik7CisgICAgICAgIG1hbmFnZXIuc2V0U2VuZEFsbFNlc3Npb25zU2l6ZSgyKTsKKyAgICAgICAgbWFuYWdlci5oYW5kbGVHRVRfQUxMX1NFU1NJT05TKG51bGwsc2VuZGVyKTsKKyAgICAgICAgLy8gc2VuZCBhbGwgc2Vzc2lvbiBhY3RpdiAtIDYgc2Vzc2lvbnMgbWVzc2FnZSBhbmQgb25lIHRyYW5zZmVyIGNvbXBsZXRlCisgICAgICAgIGFzc2VydEVxdWFscygyLGNsdXN0ZXIuc2VuZGNvdW50ZXIpOworICAgICAgICAKKyAgICAgICAgLy8gc2VuZCBzZXNzaW9uIGJsb2Nrd2lzZQorICAgICAgICBjbHVzdGVyLnNlbmRjb3VudGVyPTA7CisgICAgICAgIG1hbmFnZXIuc2V0U2VuZEFsbFNlc3Npb25zKGZhbHNlKTsKKyAgICAgICAgbWFuYWdlci5oYW5kbGVHRVRfQUxMX1NFU1NJT05TKG51bGwsc2VuZGVyKTsKKyAgICAgICAgLy8gMTEgc2Vzc2lvbiBhY3RpdiAtIDYgc2Vzc2lvbnMgbWVzc2FnZSBhbmQgb25lIHRyYW5zZmVyIGNvbXBsZXRlCisgICAgICAgIGFzc2VydEVxdWFscyg3LGNsdXN0ZXIuc2VuZGNvdW50ZXIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rmlyc3RNZW1iZXJoYW5kbGVHRVRfQUxMX1NFU1NJT05TKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1vY2tEZWx0YU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNb2NrRGVsdGFNYW5hZ2VyKCkgOworICAgICAgICBNb2NrQ2x1c3RlciBjbHVzdGVyID0gbmV3IE1vY2tDbHVzdGVyICgpOworICAgICAgICBNY2FzdFNlcnZpY2Ugc2VydmljZSA9IG5ldyBNb2NrTWNhc3RTZXJ2aWNlKCkgOyAKKyAgICAgICAgY2x1c3Rlci5zZXRNZW1iZXJzaGlwU2VydmljZShzZXJ2aWNlKTsKKyAgICAgICAgbWFuYWdlci5zZXRDbHVzdGVyKGNsdXN0ZXIpOworICAgICAgICBtYW5hZ2VyLmdldEFsbENsdXN0ZXJTZXNzaW9ucygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCxjbHVzdGVyLnNlbmRjb3VudGVyKTsKKyAgICAgICAgbWFuYWdlci5zZXRTZW5kQ2x1c3RlckRvbWFpbk9ubHkoZmFsc2UpOworICAgICAgICBtYW5hZ2VyLmdldEFsbENsdXN0ZXJTZXNzaW9ucygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCxjbHVzdGVyLnNlbmRjb3VudGVyKTsKKyAgICAgICAgbWFuYWdlci5zZXRTZW5kQ2x1c3RlckRvbWFpbk9ubHkodHJ1ZSk7CisgICAgICAgIHNlcnZpY2UubWVtYmVyQWRkZWQobmV3IE1jYXN0TWVtYmVyKCJmcmFuejIiLCAiZDExIiwgIjEyNy4wLjAuMSIsIDcwMDIsIDEwMCkpOworICAgICAgICBtYW5hZ2VyLmdldEFsbENsdXN0ZXJTZXNzaW9ucygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCxjbHVzdGVyLnNlbmRjb3VudGVyKTsKKyAgICAgICAgc2VydmljZS5tZW1iZXJBZGRlZChuZXcgTWNhc3RNZW1iZXIoImZyYW56MyIsICJkMTAiLCAiMTI3LjAuMC4xIiwgNzAwMywgMTAwKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobWFuYWdlci5maW5kU2Vzc2lvbk1hc3Rlck1lbWJlcigpKTsKKyAgICB9CisgICAgCisgICAgY2xhc3MgTW9ja01jYXN0U2VydmljZSBleHRlbmRzIE1jYXN0U2VydmljZSB7CisgICAgICAgIExpc3QgbWVtYmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBNb2NrTWNhc3RTZXJ2aWNlKCkgeworICAgICAgICAgICAgbG9jYWxNZW1iZXIgPW5ldyBNY2FzdE1lbWJlcigiZnJhbnoiLCAiZDEwIiwgIjEyNy4wLjAuMSIsIDcwMDEsIDEwMCkgOyAKKyAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIG1lbWJlckFkZGVkKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgICAgIG1lbWJlcnMuYWRkKG1lbWJlcik7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIE1lbWJlciBnZXRMb2NhbE1lbWJlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBsb2NhbE1lbWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZW1iZXJbXSBnZXRNZW1iZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIChNZW1iZXJbXSkgbWVtYmVycy50b0FycmF5KG5ldyBNZW1iZXJbbWVtYmVycy5zaXplKCldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBjbGFzcyBNb2NrRGVsdGFNYW5hZ2VyIGV4dGVuZHMgRGVsdGFNYW5hZ2VyIHsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHNlc3Npb25JRDsKKyAgICAgICAgcHJpdmF0ZSBEZWx0YVNlc3Npb24gc2Vzc2lvbjsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiAKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNb2NrRGVsdGFNYW5hZ2VyKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5EZWx0YU1hbmFnZXIjc2VuZENyZWF0ZVNlc3Npb24oamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uRGVsdGFTZXNzaW9uKQorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZENyZWF0ZVNlc3Npb24oU3RyaW5nIHNlc3Npb25JZCwgRGVsdGFTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgICAgdGhpcy5zZXNzaW9uSUQgPSBzZXNzaW9uSWQgOworICAgICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uIDsKKyAgICAgICAgfSAgICAgICAKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIGNsYXNzIE1vY2tDbHVzdGVyIGV4dGVuZHMgU2ltcGxlVGNwQ2x1c3RlciB7CisgICAgCisgICAgICAgIHByaXZhdGUgaW50IHNlbmRjb3VudGVyOworCisgICAgICAgIC8qKiBkb24ndCBzZW5kIG9ubHkgY291bnQgc2VuZHMKKyAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2F0YWxpbmFDbHVzdGVyI3NlbmQob3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlLCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVtYmVyKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2VuZChDbHVzdGVyTWVzc2FnZSBtc2csIE1lbWJlciBkZXN0KSB7CisgICAgICAgICAgICBzZW5kY291bnRlcisrIDsKKyAgICAgICAgfQorfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9EZWx0YVNlc3Npb25UZXN0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0RlbHRhU2Vzc2lvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTIwN2NkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9EZWx0YVNlc3Npb25UZXN0LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgRGVsdGFTZXNzaW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5U2Vzc2lvbmlzVmFsaWQoKSB7CisgICAgICAgIERlbHRhTWFuYWdlciBtYW5hZ2VyID0gbmV3IERlbHRhTWFuYWdlcigpIHsgcHVibGljIERlbHRhU2Vzc2lvbiBnZXROZXdEZWx0YVNlc3Npb24oKSB7IHJldHVybiBuZXcgTW9ja1Nlc3Npb24odGhpcykgOyB9IH0gOworICAgICAgICBtYW5hZ2VyLnNldE1heEluYWN0aXZlSW50ZXJ2YWwoMSk7CisgICAgICAgIE1vY2tTZXNzaW9uIHNlc3Npb24gPSAoTW9ja1Nlc3Npb24pbWFuYWdlci5jcmVhdGVTZXNzaW9uKCJoZWxsbyIsZmFsc2UpOworICAgICAgICBhc3NlcnRUcnVlKHNlc3Npb24uaXNQcmltYXJ5U2Vzc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzZXNzaW9uLmlzVmFsaWQoKSkgOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxzZXNzaW9uLmdldE1heEluYWN0aXZlSW50ZXJ2YWwoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBzbGVlcCkgeworICAgICAgICB9CisgICAgICAgIGxvbmcgdGltZU5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBpbnQgdGltZUlkbGUgPSAoaW50KSAoKHRpbWVOb3cgLSBzZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWVJbnRlcm5hbCgpKSAvIDEwMDBMKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsdGltZUlkbGUpOworICAgICAgICBhc3NlcnRUcnVlKHRpbWVJZGxlID4gc2Vzc2lvbi5nZXRNYXhJbmFjdGl2ZUludGVydmFsKCkpOworICAgICAgICBhc3NlcnRGYWxzZShzZXNzaW9uLmlzVmFsaWQoKSkgOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxzZXNzaW9uLmV4cGlyZU5vdGlmeUNhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLHNlc3Npb24uZXhwaXJlTm90aWZ5Q2x1c3RlckNhbGxlZCk7CisgICAgfQorIAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWNrdXBTZXNzaW9uaXNWYWxpZCgpIHsKKyAgICAgICAgRGVsdGFNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgRGVsdGFNYW5hZ2VyKCkgeyBwdWJsaWMgRGVsdGFTZXNzaW9uIGdldE5ld0RlbHRhU2Vzc2lvbigpIHsgcmV0dXJuIG5ldyBNb2NrU2Vzc2lvbih0aGlzKSA7IH0gfSA7CisgICAgICAgIG1hbmFnZXIuc2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgxKTsKKyAgICAgICAgTW9ja1Nlc3Npb24gc2Vzc2lvbiA9IChNb2NrU2Vzc2lvbiltYW5hZ2VyLmNyZWF0ZVNlc3Npb24oImhlbGxvIixmYWxzZSk7CisgICAgICAgIHNlc3Npb24uc2V0UHJpbWFyeVNlc3Npb24oZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gc2xlZXApIHsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKHNlc3Npb24uaXNWYWxpZCgpKSA7CisgICAgICAgIGFzc2VydEVxdWFscygwLHNlc3Npb24uZXhwaXJlTm90aWZ5Q2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsc2Vzc2lvbi5leHBpcmVOb3RpZnlDbHVzdGVyQ2FsbGVkKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHNsZWVwKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RmFsc2Uoc2Vzc2lvbi5pc1ZhbGlkKCkpIDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsc2Vzc2lvbi5leHBpcmVOb3RpZnlDYWxsZWQpOworICAgICAgICAvLyBubyBjbHVzdGVyIG5vdGlmaWNhdGlvbgorICAgICAgICBhc3NlcnRFcXVhbHMoMCxzZXNzaW9uLmV4cGlyZU5vdGlmeUNsdXN0ZXJDYWxsZWQpOworICAgIH0KKyAgICAKKyAgICBjbGFzcyBNb2NrU2Vzc2lvbiBleHRlbmRzIERlbHRhU2Vzc2lvbiB7CisKKyAgICAgICAgbG9uZyBleHBpcmVDYWxsZWQgPSAwIDsKKyAgICAgICAgbG9uZyBleHBpcmVOb3RpZnlDYWxsZWQgPSAwIDsKKyAgICAgICAgbG9uZyBleHBpcmVOb3RpZnlDbHVzdGVyQ2FsbGVkID0gMCA7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBtYW5hZ2VyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTW9ja1Nlc3Npb24oTWFuYWdlciBtYW5hZ2VyKSB7CisgICAgICAgICAgICBzdXBlcihtYW5hZ2VyKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5EZWx0YVNlc3Npb24jZXhwaXJlKGJvb2xlYW4sIGJvb2xlYW4pCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBleHBpcmUoYm9vbGVhbiBub3RpZnksIGJvb2xlYW4gbm90aWZ5Q2x1c3RlcikgeworICAgICAgICAgICAgZXhwaXJlQ2FsbGVkKysgOworICAgICAgICAgICAgaWYobm90aWZ5KQorICAgICAgICAgICAgICAgIGV4cGlyZU5vdGlmeUNhbGxlZCsrIDsKKyAgICAgICAgICAgIGlmKG5vdGlmeUNsdXN0ZXIpCisgICAgICAgICAgICAgICAgZXhwaXJlTm90aWZ5Q2x1c3RlckNhbGxlZCsrIDsKKyAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZSA7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvRGF0YVNlbmRlclRlc3QuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9EYXRhU2VuZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhODI2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvRGF0YVNlbmRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQxNyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIERhdGFTZW5kZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBjbG9zZSBTb2NrZXQgYmVmb3JlIHNvY2tldCBvcGVuIGFnYWluIQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE9wZW5BZ2FpbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEYXRhU2VuZGVyIHNlbmRlciA9IGNyZWF0ZU1vY2tEYXRhU2VuZGVyKCk7IAorICAgICAgICBhc3NlcnRFcXVhbHMoMSxzZW5kZXIuZ2V0U29ja2V0T3BlbkNvdW50ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLHNlbmRlci5nZXRTb2NrZXRDbG9zZUNvdW50ZXIoKSk7CisgICAgICAgIHNlbmRlci5vcGVuU29ja2V0KCkgOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxzZW5kZXIuZ2V0U29ja2V0T3BlbkNvdW50ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLHNlbmRlci5nZXRTb2NrZXRDbG9zZUNvdW50ZXIoKSk7CisgICAgICAgIHNlbmRlci5jbG9zZVNvY2tldCgpIDsKKyAgICAgICAgc2VuZGVyLm9wZW5Tb2NrZXQoKSA7CisgICAgICAgIGFzc2VydEVxdWFscygxLHNlbmRlci5nZXRTb2NrZXRDbG9zZUNvdW50ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLHNlbmRlci5nZXRTb2NrZXRPcGVuQ291bnRlcigpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCBDb25uZWN0L2Rpc2Nvbm5ldCBvcGVuIGFuZCBjbG9zZSB1bmRlcmx5aW5nIHNvY2tldHMKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0RGlzY29ubmVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbmV0QWRkcmVzcyBob3N0ID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIxMjcuMC4wLjEiKTsKKyAgICAgICAgRGF0YVNlbmRlciBzZW5kZXIgPSBuZXcgTW9ja0RhdGFTZW5kZXIoImNhdGFsaW5hIixob3N0LCAzNDM0KTsKKyAgICAgICAgc2VuZGVyLmNvbm5lY3QoKSA7CisgICAgICAgIGFzc2VydFRydWUoc2VuZGVyLmlzQ29ubmVjdGVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxzZW5kZXIuZ2V0U29ja2V0T3BlbkNvdW50ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLHNlbmRlci5nZXRTb2NrZXRDbG9zZUNvdW50ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLHNlbmRlci5nZXRDb25uZWN0Q291bnRlcigpKTsKKyAgICAgICAgc2VuZGVyLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc2VuZGVyLmlzQ29ubmVjdGVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxzZW5kZXIuZ2V0U29ja2V0Q2xvc2VDb3VudGVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxzZW5kZXIuZ2V0RGlzY29ubmVjdENvdW50ZXIoKSk7CisgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCBTb2NrZXQgc2V0dXAgYW5kIE9wZW5DbG9zZSBDb3VudGVyCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkNsb3NlU29ja2V0Q291bnRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEYXRhU2VuZGVyIHNlbmRlciA9IGNyZWF0ZU1vY2tEYXRhU2VuZGVyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzZW5kZXIuZ2V0U29ja2V0KCkuZ2V0U29UaW1lb3V0KCkpOworICAgICAgICBzZW5kZXIuY2xvc2VTb2NrZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlbmRlci5nZXRTb2NrZXRPcGVuQ291bnRlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlbmRlci5nZXRTb2NrZXRDbG9zZUNvdW50ZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBTb2NrZXQgSU9FeGNlcHRpb24gd2l0aCBTb2NrZXRDb3VudGVyIGluY3JlbWVudAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEZhaWxlZE9wZW5Tb2NrZXRDb3VudGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEluZXRBZGRyZXNzIGhvc3QgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjEyNy4wLjAuMSIpOworICAgICAgICBEYXRhU2VuZGVyIHNlbmRlciA9IG5ldyBNb2NrRmFpbGVkRGF0YVNlbmRlcigiY2F0YWxpbmEiLGhvc3QsIDM0MzQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VuZGVyLm9wZW5Tb2NrZXQoKTsKKyAgICAgICAgICAgIGZhaWwoIlNlbmRlciBub3Qgc2VuZCBleHBlY3RlZCBJT0V4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBzZW5kZXIuZ2V0U29ja2V0T3BlbkNvdW50ZXIoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2VuZGVyLmdldFNvY2tldE9wZW5GYWlsdXJlQ291bnRlcigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlYWQgYWNrIGZyb20gcmVjZWl2ZXIKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RXYWl0Rm9yQWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIERhdGFTZW5kZXIgc2VuZGVyID0gY3JlYXRlTW9ja0RhdGFTZW5kZXIoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzZW5kZXIuZ2V0U29ja2V0KCkpOworICAgICAgICBzZW5kZXIud2FpdEZvckFjaygxNTAwMCk7ICAKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gKEJ5dGVBcnJheUlucHV0U3RyZWFtKXNlbmRlci5nZXRTb2NrZXQoKS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsc3RyZWFtLnJlYWQoKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4KKyAgICAgKiBAdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSBEYXRhU2VuZGVyIGNyZWF0ZU1vY2tEYXRhU2VuZGVyKCkgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU29ja2V0RXhjZXB0aW9uIHsKKyAgICAgICAgSW5ldEFkZHJlc3MgaG9zdCA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiMTI3LjAuMC4xIik7CisgICAgICAgIERhdGFTZW5kZXIgc2VuZGVyID0gbmV3IE1vY2tEYXRhU2VuZGVyKCJjYXRhbGluYSIsaG9zdCwgMzQzNCk7CisgICAgICAgIHNlbmRlci5vcGVuU29ja2V0KCk7CisgICAgICAgIHJldHVybiBzZW5kZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBtZXNzYWdlIHdpdGggIHdhaXQgYWNrIGFuZCBzaW11bGF0ZSBhY2sgRXhjZXB0aW9ucworICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlRGF0YSgpdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIERhdGFTZW5kZXIgc2VuZGVyID0gY3JlYXRlTW9ja0RhdGFTZW5kZXIoKTsKKyAgICAgICAgQ2x1c3RlckRhdGEgZGF0YSA9IG5ldyBDbHVzdGVyRGF0YSgidGVzdCIsICIxMjMiLG5ldyBieXRlW117IDEsMiwzIH0sIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICk7CisgICAgICAgIHNlbmRlci53cml0ZURhdGEoZGF0YSkgOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc3RyZWFtID0gKEJ5dGVBcnJheU91dHB1dFN0cmVhbSlzZW5kZXIuZ2V0U29ja2V0KCkuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyNSxzdHJlYW0uc2l6ZSgpKTsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaXN0cmVhbSA9IChCeXRlQXJyYXlJbnB1dFN0cmVhbSlzZW5kZXIuZ2V0U29ja2V0KCkuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYsaXN0cmVhbS5yZWFkKCkpOyAgICAKKyAgICAgICAgTW9ja1NvY2tldCBzb2NrZXQgPSgoTW9ja1NvY2tldClzZW5kZXIuZ2V0U29ja2V0KCkpOworICAgICAgICBzb2NrZXQucmVzZXQoKTsKKyAgICAgICAgc2VuZGVyLnNldFdhaXRGb3JBY2sodHJ1ZSk7CisgICAgICAgIHNvY2tldC5zZXRSZWFkSU9FeGNlcHRpb24odHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZW5kZXIud3JpdGVEYXRhKGRhdGEpOworICAgICAgICAgICAgZmFpbCgiTWlzc2luZyBBY2sgSU9FeGNlcHRpb24iKSA7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkge30gOworICAgICAgICBzb2NrZXQucmVzZXQoKTsKKyAgICAgICAgc29ja2V0LnNldFJlYWRJT0V4Y2VwdGlvbihmYWxzZSk7CisgICAgICAgIHNvY2tldC5zZXRSZWFkU29ja2V0VGltZW91dEV4Y2VwdGlvbih0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlbmRlci53cml0ZURhdGEoZGF0YSk7CisgICAgICAgICAgICBmYWlsKCJNaXNzaW5nIEFjayBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIikgOworICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIHNvZSkge30gOyAgICAgICAgICAgICAgIAorCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNlbmQgbWVzc2FnZSB3aXRob3V0IHdhaXQgYWNrCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVEYXRhV2l0aE91dEFjaygpdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEluZXRBZGRyZXNzIGhvc3QgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjEyNy4wLjAuMSIpOworICAgICAgICBEYXRhU2VuZGVyIHNlbmRlciA9IG5ldyBNb2NrRGF0YVNlbmRlcigiY2F0YWxpbmEiLGhvc3QsIDM0MzQpOworICAgICAgICBzZW5kZXIuc2V0V2FpdEZvckFjayhmYWxzZSk7CisgICAgICAgIHNlbmRlci5vcGVuU29ja2V0KCk7CisgICAgICAgIENsdXN0ZXJEYXRhIGRhdGEgPSBuZXcgQ2x1c3RlckRhdGEoInRlc3QiLCAiMTIzIixuZXcgYnl0ZVtdeyAxLDIsMyB9LCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSApOworICAgICAgICBzZW5kZXIud3JpdGVEYXRhKGRhdGEpIDsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0pc2VuZGVyLmdldFNvY2tldCgpLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjUsc3RyZWFtLnNpemUoKSk7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGlzdHJlYW0gPSAoQnl0ZUFycmF5SW5wdXRTdHJlYW0pc2VuZGVyLmdldFNvY2tldCgpLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLFRjcFJlcGxpY2F0aW9uVGhyZWFkLkFDS19DT01NQU5ELmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscyhUY3BSZXBsaWNhdGlvblRocmVhZC5BQ0tfQ09NTUFORFswXSxpc3RyZWFtLnJlYWQoKSk7ICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRjcFJlcGxpY2F0aW9uVGhyZWFkLkFDS19DT01NQU5EWzFdLGlzdHJlYW0ucmVhZCgpKTsgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoVGNwUmVwbGljYXRpb25UaHJlYWQuQUNLX0NPTU1BTkRbMl0saXN0cmVhbS5yZWFkKCkpOyAgIAorICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2hlY2sgY2xvc2Ugc29ja2V0IGZybyBrZWVwIGFsaXZlIGhhbmRsaW5nIGlzIGNvcnJlY3QgKG51bWJlciBvZiByZXF1ZXN0IGFuZCB0aW1lb3V0CisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tLZWVwQWxpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRGF0YVNlbmRlciBzZW5kZXIgPSBjcmVhdGVNb2NrRGF0YVNlbmRlcigpIDsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc2VuZGVyLmNoZWNrS2VlcEFsaXZlKCkpIDsKKyAgICAgICAgc2VuZGVyLnNldEtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudCgxKTsKKyAgICAgICAgc2VuZGVyLmtlZXBBbGl2ZUNvdW50ID0gMTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzZW5kZXIuY2hlY2tLZWVwQWxpdmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLHNlbmRlci5nZXRTb2NrZXRDbG9zZUNvdW50ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLHNlbmRlci5nZXRLZWVwQWxpdmVDb3VudCgpKTsKKyAgICAgICAgc2VuZGVyLm9wZW5Tb2NrZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsc2VuZGVyLmdldEtlZXBBbGl2ZUNvdW50KCkpOworICAgICAgICBzZW5kZXIuc2V0S2VlcEFsaXZlTWF4UmVxdWVzdENvdW50KDEwMCk7CisgICAgICAgIHNlbmRlci5rZWVwQWxpdmVDb25uZWN0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc2VuZGVyLmdldEtlZXBBbGl2ZVRpbWVvdXQoKSA7CisgICAgICAgIGFzc2VydEZhbHNlKHNlbmRlci5jaGVja0tlZXBBbGl2ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzZW5kZXIuaXNDb25uZWN0ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLHNlbmRlci5nZXRTb2NrZXRDbG9zZUNvdW50ZXIoKSk7CisgICAgICAgIHNlbmRlci5rZWVwQWxpdmVDb25uZWN0VGltZS0tIDsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzZW5kZXIuY2hlY2tLZWVwQWxpdmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLHNlbmRlci5nZXRTb2NrZXRDbG9zZUNvdW50ZXIoKSk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFB1c2ggYSBtZXNhZ2Ugb3ZlciBtb2NoIHNvY2tldCB0byByZWNlaXZlcgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFB1c2hNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEluZXRBZGRyZXNzIGhvc3QgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjEyNy4wLjAuMSIpOworICAgICAgICBEYXRhU2VuZGVyIHNlbmRlciA9IG5ldyBNb2NrRGF0YVNlbmRlcigiY2F0YWxpbmEiLGhvc3QsIDM0MzQpOworICAgICAgICBhc3NlcnRGYWxzZShzZW5kZXIuaXNDb25uZWN0ZWQoKSk7CisgICAgICAgIGFzc2VydFB1c2hNZXNzYWdlKHNlbmRlcik7CisgICAgICAgICgoTW9ja1NvY2tldClzZW5kZXIuZ2V0U29ja2V0KCkpLnJlc2V0KCk7CisgICAgICAgIC8vIGxldCBzZWUgdGhlIHByb2Nlc3Npbmd0aW1lIAorICAgICAgICBzZW5kZXIuc2V0RG9Qcm9jZXNzaW5nU3RhdHModHJ1ZSk7CisgICAgICAgIHB1c2hNZXNzYWdlKHNlbmRlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhzZW5kZXIuZ2V0UHJvY2Vzc2luZ1RpbWUoKSxzZW5kZXIuZ2V0TWluUHJvY2Vzc2luZ1RpbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZW5kZXIuZ2V0UHJvY2Vzc2luZ1RpbWUoKSxzZW5kZXIuZ2V0TWF4UHJvY2Vzc2luZ1RpbWUoKSk7CisgICAgfQorICAgCisgICAgLyoqCisgICAgICogVGVzdCByZXRyeSBhZnRlciBzb2NrZXQgd3JpdGUgZmFpbHVyZQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFB1c2hNZXNzYWdlUmV0cnlGYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEluZXRBZGRyZXNzIGhvc3QgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjEyNy4wLjAuMSIpOworICAgICAgICBEYXRhU2VuZGVyIHNlbmRlciA9IG5ldyBNb2NrRGF0YVNlbmRlcigiY2F0YWxpbmEiLGhvc3QsIDM0MzQpOworICAgICAgICBzZW5kZXIuc2V0UmVzZW5kKHRydWUpOworICAgICAgICBzZW5kZXIub3BlblNvY2tldCgpIDsKKyAgICAgICAgKChNb2NrU29ja2V0KXNlbmRlci5nZXRTb2NrZXQoKSkuc2V0V3JpdGVJT0V4Y2VwdGlvbih0cnVlKTsKKyAgICAgICAgYXNzZXJ0UHVzaE1lc3NhZ2Uoc2VuZGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsc2VuZGVyLmdldFNvY2tldE9wZW5Db3VudGVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxzZW5kZXIuZ2V0U29ja2V0Q2xvc2VDb3VudGVyKCkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXN0IHNvY2tldCBjbG9zZWQgYWZ0ZXIgc29ja2V0IHdyaXRlIGZhaWx1cmUgd2l0aG91dCByZXRyeQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFB1c2hNZXNzYWdlRmFpbHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbmV0QWRkcmVzcyBob3N0ID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIxMjcuMC4wLjEiKTsKKyAgICAgICAgRGF0YVNlbmRlciBzZW5kZXIgPSBuZXcgTW9ja0RhdGFTZW5kZXIoImNhdGFsaW5hIixob3N0LCAzNDM0KTsKKyAgICAgICAgc2VuZGVyLm9wZW5Tb2NrZXQoKSA7CisgICAgICAgICgoTW9ja1NvY2tldClzZW5kZXIuZ2V0U29ja2V0KCkpLnNldFdyaXRlSU9FeGNlcHRpb24odHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRQdXNoTWVzc2FnZShzZW5kZXIpOworICAgICAgICAgICAgZmFpbCgiTm8gSU9FeGNlcHRpb24gaXMgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkge30KKyAgICAgICAgYXNzZXJ0RmFsc2Uoc2VuZGVyLmlzQ29ubmVjdGVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxzZW5kZXIuZ2V0U29ja2V0T3BlbkNvdW50ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLHNlbmRlci5nZXRTb2NrZXRDbG9zZUNvdW50ZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHNlbmRlcgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UHVzaE1lc3NhZ2UoRGF0YVNlbmRlciBzZW5kZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0gPSBwdXNoTWVzc2FnZShzZW5kZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgZm9ybWF0IGlzIHdyb25nIiwyNSxzdHJlYW0uc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzb2NrZXQgaXMgbm90IGF0IGtlZXAgYWxpdmUgbW9kZSIsMSxzZW5kZXIuZ2V0S2VlcEFsaXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibm8gc3RhdHMgb3Igd3JvbmcgbnVtYmVyIG9mIHJlcXVlc3QgbWVzc2FnZSBjb3VudGVyIiwxLHNlbmRlci5nZXROck9mUmVxdWVzdHMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidG8gbG9uZyBvcGVyYXRpb24iLDAsc2VuZGVyLmdldFByb2Nlc3NpbmdUaW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9uZy5NQVhfVkFMVUUsc2VuZGVyLmdldE1pblByb2Nlc3NpbmdUaW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBzZW5kZXIKKyAgICAgKiBAcmV0dXJuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHB1c2hNZXNzYWdlKERhdGFTZW5kZXIgc2VuZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDbHVzdGVyRGF0YSBkYXRhID0gbmV3IENsdXN0ZXJEYXRhKCJ1bmlxdWUtaWQiLCAiMTIzIixuZXcgYnl0ZVtdeyAxLDIsMyB9LCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSApOworICAgICAgICBzZW5kZXIucHVzaE1lc3NhZ2UoZGF0YSApOworICAgICAgICBhc3NlcnRUcnVlKCJzZW5kZXIgaXMgbm90IGNvbm5lY3QgYWZ0ZXIgbWVzc2FnZSBwdXNoZWQhIixzZW5kZXIuaXNDb25uZWN0ZWQoKSk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0gPSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtKXNlbmRlci5nZXRTb2NrZXQoKS5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgcmV0dXJuIHN0cmVhbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW11bGF0ZSBDcmVhdGUgc29ja2V0IGZhaWx1cmUgCisgICAgICovCisgICAgY2xhc3MgTW9ja0ZhaWxlZERhdGFTZW5kZXIgZXh0ZW5kcyBEYXRhU2VuZGVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGhvc3QKKyAgICAgICAgICogQHBhcmFtIHBvcnQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNb2NrRmFpbGVkRGF0YVNlbmRlcihTdHJpbmcgZG9tYWluLEluZXRBZGRyZXNzIGhvc3QsIGludCBwb3J0KSB7CisgICAgICAgICAgICBzdXBlcihkb21haW4saG9zdCwgcG9ydCk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiB0aHJvdyBJT0V4Y2VwdGlvbgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLkRhdGFTZW5kZXIjY3JlYXRlU29ja2V0KCkKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVNvY2tldCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgU29ja2V0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2ltdWxhdGUgb3BlbiByZWFsIHNvY2tldCB0byBhIHNlcnZlciEhCisgICAgICovCisgICAgY2xhc3MgTW9ja0RhdGFTZW5kZXIgZXh0ZW5kcyBEYXRhU2VuZGVyIHsKKworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBob3N0CisgICAgICAgICAqIEBwYXJhbSBwb3J0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTW9ja0RhdGFTZW5kZXIoU3RyaW5nIGRvbWFpbixJbmV0QWRkcmVzcyBob3N0LCBpbnQgcG9ydCkgeworICAgICAgICAgICAgc3VwZXIoZG9tYWluLGhvc3QsIHBvcnQpOworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTb2NrZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNvY2tldEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzZXRTb2NrZXQobmV3IE1vY2tTb2NrZXQoZ2V0QWRkcmVzcygpLCBnZXRQb3J0KCkpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogRG9uJ3Qgb3BlbiBTb2NrZXQgcmVhbGx5CisgICAgICovCisgICAgY2xhc3MgTW9ja1NvY2tldCBleHRlbmRzIFNvY2tldCB7CisKKyAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBhY2tJbnB1dFN0cmVhbSA7CisgICAgICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIG1lc3NhZ2VTdHJlYW0gOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gd3JpdGVJT0V4Y2VwdGlvbiA9IGZhbHNlIDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJlYWRJT0V4Y2VwdGlvbiA9IGZhbHNlIDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJlYWRTb2NrZXRUaW1lb3V0RXhjZXB0aW9uID0gZmFsc2UgOworICAgICAgICAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gYWRkcmVzcworICAgICAgICAgKiBAcGFyYW0gcG9ydAorICAgICAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNb2NrU29ja2V0KEluZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgYWNrSW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oVGNwUmVwbGljYXRpb25UaHJlYWQuQUNLX0NPTU1BTkQpOworICAgICAgICAgICAgbWVzc2FnZVN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSA7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgYWNrSW5wdXRTdHJlYW0ucmVzZXQoKSA7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByZWFkSU9FeGNlcHRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRJT0V4Y2VwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiByZWFkSU9FeGNlcHRpb247CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gcmVhZElPRXhjZXB0aW9uIFRoZSByZWFkSU9FeGNlcHRpb24gdG8gc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmVhZElPRXhjZXB0aW9uKGJvb2xlYW4gcmVhZElPRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0aGlzLnJlYWRJT0V4Y2VwdGlvbiA9IHJlYWRJT0V4Y2VwdGlvbjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVhZFNvY2tldFRpbWVvdXRFeGNlcHRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRTb2NrZXRUaW1lb3V0RXhjZXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIHJlYWRTb2NrZXRUaW1lb3V0RXhjZXB0aW9uOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIHJlYWRTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIFRoZSByZWFkU29ja2V0VGltZW91dEV4Y2VwdGlvbiB0byBzZXQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZWFkU29ja2V0VGltZW91dEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBib29sZWFuIHJlYWRTb2NrZXRUaW1lb3V0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0aGlzLnJlYWRTb2NrZXRUaW1lb3V0RXhjZXB0aW9uID0gcmVhZFNvY2tldFRpbWVvdXRFeGNlcHRpb247CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3JpdGVJT0V4Y2VwdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVJT0V4Y2VwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiB3cml0ZUlPRXhjZXB0aW9uOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIHdyaXRlSU9FeGNlcHRpb24gVGhlIHdyaXRlSU9FeGNlcHRpb24gdG8gc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0V3JpdGVJT0V4Y2VwdGlvbihib29sZWFuIHdyaXRlSU9FeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRoaXMud3JpdGVJT0V4Y2VwdGlvbiA9IHdyaXRlSU9FeGNlcHRpb247CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiAgZ2V0IGFjayBTdHJlYW0gKCAzIGJ5dGVzKQorICAgICAgICAgKiBAc2VlIFRjcFJlcGxpY2F0aW9uVGhyZWFkI0FDS19DT01NQU5ECisgICAgICAgICAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldElucHV0U3RyZWFtKCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZihpc1JlYWRJT0V4Y2VwdGlvbigpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJNb2NrU29ja2V0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihpc1JlYWRTb2NrZXRUaW1lb3V0RXhjZXB0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU29ja2V0VGltZW91dEV4Y2VwdGlvbigiTW9ja1NvY2tldCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFja0lucHV0U3RyZWFtOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1ZmZlciBPdXRwdXQgaW4gc2ltcGxlIGJ5dGUgYXJyYXkgc3RyZWFtCisgICAgICAgICAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldE91dHB1dFN0cmVhbSgpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZihpc1dyaXRlSU9FeGNlcHRpb24oKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTW9ja1NvY2tldCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VTdHJlYW07CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvUmVwbGljYXRpb25UcmFuc21pdHRlclRlc3QuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9SZXBsaWNhdGlvblRyYW5zbWl0dGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNjEyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvUmVwbGljYXRpb25UcmFuc21pdHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uUmVwbGljYXRpb25TdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uU2Vzc2lvbk1lc3NhZ2VJbXBsOworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZU1lc3NhZ2VEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIgdHJhbnNtaXR0ZXIgPSBuZXcgUmVwbGljYXRpb25UcmFuc21pdHRlcigpOworICAgICAgICB0cmFuc21pdHRlci5zZXRDb21wcmVzcyh0cnVlKTsKKyAgICAgICAgU2Vzc2lvbk1lc3NhZ2VJbXBsIG1lc3NhZ2U9IG5ldyBTZXNzaW9uTWVzc2FnZUltcGwoKTsKKyAgICAgICAgbWVzc2FnZS5zZXRVbmlxdWVJZCgidGVzdCIpOworICAgICAgICBDbHVzdGVyRGF0YSBkYXRhID0gdHJhbnNtaXR0ZXIuc2VyaWFsaXplKG1lc3NhZ2UpOworICAgICAgICBhc3NlcnRUcnVlKDIwMCA8IGRhdGEuZ2V0TWVzc2FnZSgpLmxlbmd0aCk7CisgICAgICAgIE9iamVjdCBteW9iaiA9IGdldEdaUE9iamVjdChkYXRhLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydFRydWUobXlvYmogaW5zdGFuY2VvZiBTZXNzaW9uTWVzc2FnZUltcGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCAoKFNlc3Npb25NZXNzYWdlSW1wbClteW9iaikuZ2V0VW5pcXVlSWQoKSk7CisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogQHJldHVybgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBnZXRHWlBPYmplY3QoYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpbiA9IAorICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOworICAgICAgICBHWklQSW5wdXRTdHJlYW0gZ2luID0gCisgICAgICAgICAgICBuZXcgR1pJUElucHV0U3RyZWFtKGJpbik7CisgICAgICAgIGJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgaW50IGxlbmd0aCA9IGdpbi5yZWFkKHRtcCk7CisgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVswXTsKKyAgICAgICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGJ5dGVbXSB0bXBkYXRhID0gcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IGJ5dGVbcmVzdWx0Lmxlbmd0aCArIGxlbmd0aF07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRtcGRhdGEsIDAsIHJlc3VsdCwgMCwgdG1wZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0bXAsIDAsIHJlc3VsdCwgdG1wZGF0YS5sZW5ndGgsIGxlbmd0aCk7CisgICAgICAgICAgICBsZW5ndGggPSBnaW4ucmVhZCh0bXApOworICAgICAgICB9CisgICAgICAgIGdpbi5jbG9zZSgpOworICAgICAgICBSZXBsaWNhdGlvblN0cmVhbSBzdHJlYW0gPSBuZXcgUmVwbGljYXRpb25TdHJlYW0oCisgICAgICAgICAgICAgICAgbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzdWx0KSwgZ2V0Q2xhc3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICBPYmplY3QgbXlvYmogPSBzdHJlYW0ucmVhZE9iamVjdCgpOworICAgICAgICByZXR1cm4gbXlvYmo7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1JlcGxpY2F0aW9uVmFsdmVUZXN0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvUmVwbGljYXRpb25WYWx2ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjA3NGEzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1JlcGxpY2F0aW9uVmFsdmVUZXN0LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBSZXBsaWNhdGlvblZhbHZlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1JlcXVlc3RXaXRob3V0U2Vzc2lvbkNoYW5nZSgpIHsKKyAgICAgICAgUmVwbGljYXRpb25WYWx2ZSB2YWx2ZSA9IG5ldyBSZXBsaWNhdGlvblZhbHZlKCkgOworICAgICAgICB2YWx2ZS5zZXRGaWx0ZXIoIi4qXFwuaHRtbCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSx2YWx2ZS5nZXRSZXFGaWx0ZXJzKCkubGVuZ3RoKSA7CisgICAgICAgIGFzc2VydFRydWUodmFsdmUuaXNSZXF1ZXN0V2l0aG91dFNlc3Npb25DaGFuZ2UoIi9DbHVzdGVyVGVzdC9pbmRleC5odG1sIikpIDsgICAgICAgIAorICAgICAgICBhc3NlcnRGYWxzZSh2YWx2ZS5pc1JlcXVlc3RXaXRob3V0U2Vzc2lvbkNoYW5nZSgiL0NsdXN0ZXJUZXN0L2luZGV4LmpzcCIpKSA7ICAgICAgICAKKyAgICAgICAgdmFsdmUuc2V0RmlsdGVyKCIuKlxcLmh0bWw7LipcXC5jc3MiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsdmFsdmUuZ2V0UmVxRmlsdGVycygpLmxlbmd0aCkgOworICAgICAgICBhc3NlcnRUcnVlKHZhbHZlLmlzUmVxdWVzdFdpdGhvdXRTZXNzaW9uQ2hhbmdlKCIvQ2x1c3RlclRlc3QvaW5kZXguaHRtbCIpKSA7ICAgICAgICAKKyAgICAgICAgYXNzZXJ0VHJ1ZSh2YWx2ZS5pc1JlcXVlc3RXaXRob3V0U2Vzc2lvbkNoYW5nZSgiL0NsdXN0ZXJUZXN0L2xheW91dC5jc3MiKSkgOyAgICAgICAgCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1NpbXBsZVRjcENsdXN0ZXJUZXN0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvU2ltcGxlVGNwQ2x1c3RlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTVmNjM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1NpbXBsZVRjcENsdXN0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmRlcGxveS5GYXJtV2FyRGVwbG95ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLm1jYXN0Lk1jYXN0U2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5DbHVzdGVyU2Vzc2lvbkxpc3RlbmVyOworCisvKgorKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisqLworcHVibGljIGNsYXNzIFNpbXBsZVRjcENsdXN0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUNsdXN0ZXJTZXNzaW9uTGlzdGVuZXJBdFN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU2ltcGxlVGNwQ2x1c3RlciBjbHVzdGVyID0gbmV3IFNpbXBsZVRjcENsdXN0ZXIoKSA7CisgICAgICAgIGNsdXN0ZXIuc2V0TWVtYmVyc2hpcFNlcnZpY2UoIG5ldyBNY2FzdFNlcnZpY2UoKSB7IHB1YmxpYyB2b2lkIHN0YXJ0KCkge30gfSk7CisgICAgICAgIGNsdXN0ZXIuc2V0Q2x1c3RlckRlcGxveWVyKG5ldyBGYXJtV2FyRGVwbG95ZXIoKSB7IHB1YmxpYyB2b2lkIHN0YXJ0KCkge319KTsKKyAgICAgICAgU29ja2V0UmVwbGljYXRpb25MaXN0ZW5lciByZWNlaXZlciA9IG5ldyBTb2NrZXRSZXBsaWNhdGlvbkxpc3RlbmVyKCl7IHB1YmxpYyB2b2lkIHN0YXJ0KCkge319OworICAgICAgICByZWNlaXZlci5zZXRUY3BMaXN0ZW5BZGRyZXNzKCJsb2NhbGhvc3QiKTsKKyAgICAgICAgcmVjZWl2ZXIuc2V0VGNwTGlzdGVuUG9ydCg0NTY2MCk7CisgICAgICAgIGNsdXN0ZXIuc2V0Q2x1c3RlclJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgY2x1c3Rlci5zZXRDbHVzdGVyU2VuZGVyKG5ldyBSZXBsaWNhdGlvblRyYW5zbWl0dGVyKCl7IHB1YmxpYyB2b2lkIHN0YXJ0KCkge319KTsKKyAgICAgICAgY2x1c3Rlci5zdGFydCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSxjbHVzdGVyLmNsdXN0ZXJMaXN0ZW5lcnMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSggY2x1c3Rlci5jbHVzdGVyTGlzdGVuZXJzLmdldCgwKSBpbnN0YW5jZW9mIENsdXN0ZXJTZXNzaW9uTGlzdGVuZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvdG8tZG8udHh0IGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci90by1kby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1ODI5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvdG8tZG8udHh0CkBAIC0wLDAgKzEsMzk4IEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05leHQgYWN0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy0gTWVtYmVyc2hpcCBjb29yZGluYXRvciBsb2dpYyBhbmQgbWVtYmVyc2hpcCB2aWV3IElkLgorIAorLSBJbXBsZW1lbnQgcHJpbWFyeS9zZWNvbmRhcnkgcmVwbGljYXRpb24gbG9naWMgKGZoYW5paykKKyAgSWRlYSBmb3IgaW1wbGVtZW50YXRpb246IENvb2tpZSBzdG9yZXMgaW5mbyBwcmltYXJ5L2JhY2t1cCBub2RlIGFuZCBoaXQgY291bnRlci4KKyAgU3RlcHMgdG8gaW1wbGVtZW50OiAoY29taW5nIHNvb24pCisgIFNjZW5hcmlvczogCisgIDEuIFJlcXVlc3QgaW46IG5ldyBzZXNzaW9uIGRlc3Q6IGFueQorICAyLiBSZXF1ZXN0IGluOiBleGlzdGluZyBzZXNzaW9uIGRlc3Q6IHByaW1hcnkgc2VydmVyCisgIDMuIFJlcXVlc3QgaW46IGV4aXN0aW5nIHNlc3Npb24gZGVzdDogbm9uLXByaW1hcnkgc2VydmVyIChmYWlsIG92ZXIpCisgIDQuIFJlcXVlc3QgaW46IGV4aXN0aW5nIHNlc3Npb24gZGVzdDogYmFja3VwIHNlcnZlciAKKyAgNS4gQmFja3VwIG5vZGUgY3Jhc2gKKyAgNi4gUHJpbWFyeSBub2RlIGNyYXNoIChzdGVwIDMpCisgIDcuIFNlcXVlbmNlIDYuIHRoZW4gMi4gKGhpdCBjb3VudGVyKQorICA4LiBTZXF1ZW5jZSA1LiB0aGVuIDQuIChzd2FwKQorICA5LiBOZXcgbWVtYmVyIGpvaW5zIAorICAxMC4gQmFja3VwIGFuZCBwcmltYXJ5IGNyYXNoIC0+IGRlYXRoIQorICAxMS4gU2VxdWVuY2UgMi4gaW46IGludmFsaWQgaGl0IGNvdW50ZXIgCisgIDEyLiBTZXF1ZW5jZSA0LiBpbjogaW52YWxpZCBoaXQgY291bnRlcgorICAxMy4gU2Vzc2lvbiBleHBpcmVzCisgIDE0LiBTZXF1ZW5jZSAzLiB0aGVuIDEzLiBvbiB0aGUgb2xkIHByaW1hcnkKKyAgCisgIE5vdGVzOgorICBBYmlsaXR5IHRvIGFkZCBhIGN1c3RvbSAiU2Vzc2lvbiBleHBpcmVkIiByZWRpcmVjdCBmb3IgZ2xvYmFsIAorICByZWRpcmVjdHMgdG8gbmV2ZXIgZm9yd2FyZCBhbiBpbnZhbGlkIHNlc3Npb24gaW50byB0aGUgc2VydmVyCisgIHdoZW4gdGhlIHNlc3Npb24gZGF0YSBoYXMgZ29uZSBsb3N0LgorICBJZSwgaW4gYSBub3JtYWwgc2NlbmFyaW8sIHRoZSBzZXNzaW9uIGlzIHZpZXdlZCBhcyAibmV3IgorICBidXQgdGhleSBtYXkgd2FubmEgZGlzcGxheSBhIHNlc3Npb24gZXhwaXJlZCByZWRpcmVjdC4KKyAgU2VjdXJpdHk6CisgIERvbnQgc3RvcmUgYW55IHNlbnNpdGl2ZSBpbmZvIGluIHRoZSBuZXcgY29va2llLgorICBvbmx5IHBvaW50ZXJzIHRvIG1lbWJlcnMuCisKKyAgCistIGJyZWFrIG91dCBtZW1iZXJzaGlwL21lc3NhZ2luZyBtb2R1bGUgYW5kIGltcHJvdmUgSk1YCisgIFRoZSBjbHVzdGVyaW5nIGNvZGUgaGFzIGJlY29tZSB2ZXJ5IGNsdXR0ZXJlZC4KKyAgV2UgbmVlZCB0byBicmVhayBvdXQgdGhlIG1lbWJlcnNoaXAgYW5kIHRoZSBtZXNzYWdpbmcgCisgIGF3YXkgZnJvbSB0aGUgbG9naWMgb2Ygc2Vzc2lvbiBoYW5kbGluZyBhbmQgSk1YLgorICBUaGUgbGF0dGVyIHNob3VsZCBiZSBidWlsdCBvbiB0b3Agb2YgdGhlIGNsdXN0ZXJpbmcgbW9kdWxlLCBhbmQgbm90IGJha2VkIGludG8gaXQuCisgIChtYXliZSBjb21wbGV0ZSByZWZhY3RvciBmb3IgVG9tY2F0IDYpCisgIFN0ZXBzOgorICAxLiBCdWlsZCBhIGdyb3VwIG9iamVjdCwgdG8gYWxsb3cgc2VuZGluZyBvZiBtZXNzYWdlcworICAgICBUaGUgZ3JvdXAgb2JqZWN0IHdpbGwgaGFuZGxlIGVuY29tcGFzcyBtZW1iZXJzaGlwIGFuZCAKKyAgICAgbWVzc2FnaW5nIHVuZGVyIG9uZSB1bWJyZWxsYS4KKyAgMi4gRW5hYmxlIGdyb3VwIFJQQworICAgICBUaHJvdWdoIHRoZSBncm91cCBvYmplY3QsIGVuYWJsZSBSUEMgc3R5bGUgbWVzc2FnaW5nCisgICAgIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIG1lc3NhZ2UgbGlrZSBzdGF0ZSB0cmFuc2ZlcnMsIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgYSB0aW1lb3V0LgorICAgICBSQ1Agc3RyYXRlZ2llcyAtIGZpcnN0IHJlc3BvbnNlLCBtYWpvcml0eSByZXNwb25zZSwgYWxsIHJlc3BvbnNlCisgIDMuIEdyb3VwL01lc3NhZ2UgaW50ZXJjZXB0b3JzIC0gdG8gcGVyZm9ybSBsb2dpYyBzdWNoIGFzIGZyYWdtZW50YXRpb24sIG9yZGVyaW5nIGV0Yy4KKyAgNC4gSk1YICAKKyAgICAgSk1YIHNob3VsZCBiZSBhZGRlZCBvbiB0b3Agb2YgdGhlIGNvcmUgY29kZSwgbm90IGluc2lkZSB0aGUgY29yZSBjb2RlLgorICAgICBUaGUgaWRlYSBvZiBKTVggYXMgbWFuYWdlbWVudCBzaG91bGQgYmUgYWRkZWQgb3V0c2lkZSB0byB0aGUgY29yZSBjb21wb25lbnRzLgorICAgICBGb3IgZXhhbXBsZSwgU2ltcGxlVENQQ2x1c3RlciBzaG91bGQgbm90IGNvbnRhaW4gSk1YIGNvZGUsIGlmIEkgd2FudCB0byBjcmVhdGUKKyAgICAgYSBkaWZmZXJlbnQgY2x1c3RlciBjbGFzcywgSSBoYXZlIHRvIHJld3JpdGUgYWxsIHRoZSBKTVggY29kZSBhZ2Fpbi4KKyAgICAgSW5zdGVhZCwgY3JlYXRlIEpNWCBiZWFucyB0aGF0IHJlZmVyZW5jZSBjb3JlIGNvbXBvbmVudHMgdGhyb3VnaCBpbnRlcmZhY2VzLgorCistIENyZWF0ZSBzdGF0cyBvYmplY3QKKyAgIEluc3RlYWQgb2Yga2VlcGluZyBzdGF0cyBlbWJlZGRlZCBpbiB0aGUgY29kZSwgbWFrZSBpdCByZXVzYWJsZSBpbgorICAgYSBzaGFyZWQgY29tcG9uZW50LgorCistIHN1cHBvcnQgQ3Jvc3NDb250ZXh0IHNlc3Npb24gcmVwbGljYXRpb24KKyAgICBJZGVhOiB1c2UgZW5kQWNjZXNzIHRvIHNpZ25hbCByZXBsaWNhdGlvblZhbHZlIHRoYXQgc2Vzc2lvbiBmcm9tIG90aGVyIGFwcCBoYXMgY2hhbmdlZC4KKyAgICByZWZhY3RvciBSZXBsaWNhdGlvblZhbHZlIAorICAgIFdoZW4gc2Vzc2lvbiBpcyBzZXJpYWx6ZWQgZnJvbSBvdGhlciBhcHAsIHNldCByaWdodCBhcHAgY2xhc3Nsb2FkZXIKKyAgICBlbmRhY2Nlc3MgaXMgYWxzbyBzZW5kIGF0IENveW90ZUFkcGF0ZXIgZm9yIGNvbnRleHQgc2Vzc2lvbiBhcyByZWN5Y2xlIHRoZSByZXF1ZXN0CistIEFkZCBNYmVhbkZhY3RvcnkgdG8gZ2VuZXJhdGUgZHluYW1pYyBjbHVzdGVyIGF0IHJ1bnRpbWUuCisgICAgUHJvYmxlbTogSG93IHdlIGNhbiBzdGFydCB0aG9zZSBjZW50cmFsIHNlcnZpY2VzPworICAgIC0gU3RhbmRhcmRFbmdpbmUgc3VwcG9ydCBsb2FkIE1iZWFuIGZyb20gZXh0ZXJuYWwgZmlsZS4gICAgIAorLSB3aGVuIGEgbG90IG9mIG1lc3NhZ2VzIGV4cGlyZSBpdCBjb21lcyB0byBidXJzdCBvZiBtZXNzYWdlcyAKKyAgICAgLSBhbGwgNjAgU2VjIHdoZW4gTWFuYWdlckJhc2UjcHJvY2Vzc0V4cGlyZXMgaXMgY2FsbGVkIGEgbG90IG9mIG1lc3NhZ2VzIGFyZSBzZW5kIQorICAgICAtIEJldHRlciBpcyB0byB0cmFuc2ZlciBhIHNwZXppYWwgZXB4aXJlIG1lc3NhZ2Ugd2l0aCBhbiBhcnJheSBvZiBleHBpcmVkIHNlc3Npb24gbWVzc2FnZXMuCisgICAgIC0gVGhpcyByZWR1Y2UgbWVzc2FnZSB0cmFuc2ZlciBhbmQgcmVkdWNlIHdhaXRzIGZvciBhY2tzLgorICAgICAtIGNvbXBsaWNhdGVkIGltcGxlbWVudGF0aW9uIHRoaW5nICwgc2Vzc2lvbnMgZXhwaXJlcyB3aGVuIGNhbGwgaXNWYWxpZCA6LSggICAgIAorLSBidWlsZCBhIHRvb2wgdGhhdCByZWNlaXZlIHRoZSBzdGFnZSBhbmQgcHJlc2VudCBpdCBhcyBzaW1wbGUgd2ViIGFwcC4KKyAgICAJZGV0ZWN0IHNvbWUgcHJvYmxlbXMKKyAgICAJZGlmZmVyZW50IGFjdGl2ZSBzZXNzaW9ucworICAgIAlsb25nIHF1ZXVlcworICAgIAlkZXRlY3QgbG9uZyB3YWl0IGFja3MKKyAgICAgICAgSWRlYTogV3JvdGUgYSBhbnQgc2NyaXB0IHdpdGggdGhlIG5ldyBqbXggdGFza3MhCisgICAgICAgIE9wdGltemllZCBpbmZvcm1hdGlvbiBhY2Nlc3M6CisgICAgICAgIAlDcmVhdGUgYSBNQmVhbi5hdHRyaWJ1dGUgdGhhdCBzdG9yZSB0aGUgY29tcGxldGUgY2x1c3RlciBzdGF0ZSAKKyAgICAgICAgCWluZm9ybWF0aW9uIGluc2lkZSBvbmUgYXR0cmlidXRlIGZyb20gdHlwZSBUYWJ1bGFyRGF0YSBhbmQgQ29tcG9zaXRlRGF0YSEKKyAgICAgICAgCUltcGxlbWVudCBhcyBTaW1wbGVUY3BDbHVzdGVyIG9wZXJhdGlvbgorICAgICAgICAJQ2x1c3RlciA8Q29tcG9zaXRlRGF0YT4KKyAgICAgICAgCSAgLS0gQXR0cmlidXRlcyA8U2ltcGxlVHlwZT4KKyAgICAgICAgCSAgLS0gQ2x1c3Rlck1lbWJlcnNoaXAKKyAgICAgICAgCSAgICAgIC0tIEF0dHJpYnV0ZXMgPFNpbXBsZVR5cGU+CisgICAgICAgIAkgICAgICAtLSBNZW1iZXJzIDxDb21wb3NpdGVUeXBlPgorICAgICAgICAJICAgICAgICAgLS0gQXR0cmlidXRlcyA8U2ltcGVUeXBlPgorICAgICAgICAJICAtLSBDbHVzdGVyUmVjZWl2ZXIKKyAgICAgICAgCSAgICAgIC0tIEF0dHJpYnV0ZXMgPFNpbXBsZVR5cGU+CisgICAgICAgIAkgIC0tIENsdXN0ZXJTZW5kZXIKKyAgICAgICAgCSAgICAgIC0tIEF0dHJpYnV0ZXMgPFNpbXBsZVR5cGU+CisgICAgICAgIAkgICAgICAtLSBEYXRhU2VuZGVycyA8VGFidWxhckRhdGE+CisgICAgICAgIAkgICAgICAgICAtLSBTZW5kZXIgPENvbXBvc2l0ZVR5cGU+CisgICAgICAgIAkgICAgICAgICAJLS0gQXR0cmlidXRlcyA8U2ltcGVUeXBlPgorICAgICAgICAJICAgICAgICAgCS0tIChvcHRpb25hbClRdWV1ZSBTdGF0cyA8Q29tcG9zaXRlRGF0YT4KKyAJICAgICAgIAkgICAgICAgICAJCS0tIEF0dHJpYnV0ZXMgPFNpbXBlVHlwZT4gICAgICAJICAgIAorLSBhZGQgY2x1c3RlciBzZXR1cCB0ZW1wbGF0ZSAoc3JjKQkKKy0gZG9jdW1lbnRhdGlvbgorCXdyb3RlIGEgY29tcGxldGUgbmV3IGhvdy10bworCWFkZCBleGFtcGxlIGNvbmZpZ3VyYXRpb25zCisJYWRkIGNvbXBsZXRlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbnMKKwlhZGQgSk1YIGluZm9ybWF0aW9uCisJYWRkIGRlcGxveW1lbnQgaGVscAorCU5lZWQgaGVscCAocGVybykKKy0gaW1wbGVtZW50IGZyYWdtZW50YXRpb24gb2YgbGFyZ2UgcmVwbGljYXRpb24gb2JqZWN0cworICAobm90ZSB0aGlzIHdpbGwgYmUgZG9uZSBpbiB0aGUgR3JvdXAgb2JqZWN0LCBzZWUgdG9wLikKKwlDb21wcmVzcyBhdCBtZXNzYWdlIGxldmVsIC0gdGhpcyB3aWxsIGdvIGF3YXkhIGluc3RlYWQgdGhlcmUgd2lsbCBiZSBhIEdaaXAgaW50ZXJjZXB0b3IKKwlTcGxpdHRpbmcgTWVzc2FnZXMgYWxhIEZhcm1EZXBsb3llciB3YXIgaGFuZGxpbmcKKy0gYWRkIGEgbWVzc2FnZSB0eXBlIHRvIHRoZSBtZXNzYWdlIGhlYWRlci4KKyAgICAtIGZpbHRlcmluZyBhdCByZWNlaXZlciB0aGF0IGRyb3AgbWVzc2FnZSBiZWZvcmUgYnVpbGQgT2JqZWN0CisgICAgLSBkZWZpbmUgc2hvcnQgdHlwZSBkZWZpbml0aW9uLgorICAgICAgIC0gRXZlcnkgU2Vzc2lvbiBtZXNzYWdlIHdpdGggZGlmZmVyZW56IHR5cGUKKyAgICAgICAtIHR5cGUgd2l0aCBTdHJpbmcKKy0gYWRkIHRlc3QgY2x1c3RlciBwcm9qZWN0CisJZnVuY3Rpb25hbCB0ZXN0aW5nIGEgbG90IG9mIHN6ZW5hcmlvcworCQlkaWZmZXJlbiByZXBsaWNhdGlvbiBtb2RlCisJCXJlc3RhcnQgYWZ0ZXIgZmFpbHVyZQorCQljcmFzaCB1bmRlciBsb2FkCisJCWNvbXByZXNzIGFuZCB1bmNvbXByZXNzZWQKKyAgICBKdW5pdCB0ZXN0ICggc3RhcnRlZCkKKyAgICBhdXRvbWF0ZWQgcmVncmVzc2lvbiB0ZXN0aW5nIHdpdGggc29tZSBzdGFuZGFyZCBjb25maWdzCisgICAgd3JvdGUgYSB0ZXN0IGNsaWVudCB0aGF0IGNhbiBnZXQgYSBKTVggU3RhdGUgdG8gdmVyaWZ5IHRoZSBkaWZmZXJlbnQgY2x1c3RlciB0ZXN0c3plbmFyaW9zCisJIC0gZGlyZWN0IEpTUiAxNjAgY2xpZW50IC0gcHJlZmVycmVkIG9wdGlvbgorCSAtIHZpYSBteDRqIGh0dHAgYWRhcHRvciAoIHhtbCBwcm90b2NvbCkKKwkgLSBzZXR1cCBkaWZmZXJlbnQgc3plbmFyaW9zCisJdXNlIG5ldyByZW1vdGUgam14IGFudCB0YXNrcyB0byBncmFiIGluZm9ybWF0aW9uIGZyb20gbWJlYW5zIAorLSBmaWx0ZXIgYWxsIGNsdXN0ZXIgbWVzc2FnZXMgCisgICAgIC0gRmlsdGVyaW5nIHRoYXQgbm8gYWxsIG1lc3NhZ2Ugc2VuZCB0byBhbGwgbWVtYmVyLgorICAgICAtIE5vdyB3aXRoIGRvbWFpbiBtb2RlIHJlZ2lzdGVyYXRpb24gc2Vzc2lvbiBtZXNzYWdlIG9ubHkgc2VuZCB0bworICAgICAgIG1lbWJlcnMgZnJvbSBzYW1lIGRvbWFpbi4KKy0gc2V0dXAgYSBDbHVzdGVyIExpZmVjeWNsZUxpc3RlbmVyIHRvIHNlbmQgdGhlIGNsdXN0ZXIgc3RhdHVzISAobW9uaXRvcmluZykKKyAgICAgLSBNYWtlIHRoZSBjb21wYWN0IHN0YXRlIHZpYSBKTVggQVBJIGF2aWFsYWJsZSBmaXJzdC4KKyAgICAgLSBzZXR1cCBjbHVzdGVyIExpc3RlbmVyIHRoYXQgc2VuZCBvd24gc3RhdGUgdG8gc3BlemlhbCBtZW1iZXIgKHNlbmRlciBmcm9tIGEgbWVzc2FnZSBsaWtlIEdFVF9BTExfU0VTU0lPTlMpCisgICAgIC0gY3JlYXRlIGEgY2x1c3RlciBzdGF0dXMgYXBwIChodG1sL3htbCkKKyAgICAgICAgIC0gYXR0cmlidXRlcworICAgICAgICAgICAgLSBzZW5kIG1lc3NhZ2UKKyAgICAgICAgICAgIC0gY3VycmVudCBtZW1iZXJzCisgICAgICAgICAgICAtIHJlY2VpdmUgbWVzc2FnZQorICAgICAgICAgICAgLSBhY3RpdmUgc2Vzc2lvbiBhdCBkaWZmZXJlbnQgY2x1c3RlcmVkIG1hbmFnZXIKKyAgICAgICAgICAgIC0gd2hpY2ggYXBwIGFyZSBjbHVzdGVycyAocmVnaXN0ZXJlZCBtYW5hZ2VycykKKyAgICAgICAgICAgIC0gYXZnIHByb2Nlc3NpbmcgdGltZXMKKyAgICAgICAgIAorICAgICAgICAgLSBvcGVyYXRpb25zCisgICAgICAgICAgICAtIHJlc2V0U3RhdHMKKyAgICAgICAgICAgIC0gc2VuZCBhIG1lc3NhZ2UgKFN0cmluZykKKyAgICAgICAgICAgIC0gZ2V0RGlzcGxheSBzdGF0ZSBmcm9tIG90aGVyIG1lbWJlcnM/PworICAgICAgICAgICAgLSBzdG9wIHF1ZXVlIHRvIHNlbmQKKyAgICAgICAgICAgIC0gcXVldWUgcmVjZWl2ZXIgbWVzc2FnZSBmcm9tIHNvbWUgbWVtYmVycyAoIGxhdGVyIHNlbmQgYWZ0ZXIgcmVkZXBsb3lpbmcpCisgICAgICAgICAgICAtIGNvbmZpZ3VyZSBzb21lIHNlbmQgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAtIGtlZXBhbGl2ZQorICAgICAgICAgICAgICAgICAtIGNvbXByZXNzCisgICAgICAgICAgICAgICAgIC0gd2FpdCBmb3IgYWNrCisgICAgICAgICAtIG90aGVyIHRoaW5ncworICAgICAgICAgICAgLSBiYXNlZCBvbiBDbHVzdGVyIEpNWCBBUEkgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC0gd2F0Y2ggc29tZSB2YWx1ZXMgZnJvbSBjb21wbGV0ZSBjbHVzdGVyIGFuZCBkaXNwbGF5IHNvbWUgZ3JhcGhzCisgICAgICAgICAgICAtIGRpc3BsYXkgdGhlIGluZm9ybWF0aW9ucyBmcm9tIGFsbCBub2RlcworICAgICAgICAgICAgLSBkaXNwbGF5IGluZm9ybWF0aW9ucyBmcm9tIG90aGVyIGNsdXN0ZXIgZG9tYWlucworICAgICAgICAgICAgCXZpYSBYTUwgZG9jdW1lbnRzIGFuZCBodHRwCisgICAgICAgICAgICAtIGRpc3BsYXkgc3RhdHMgYXMgeG1sCisgICAgICAgICAgICAtIG9wZXJhdGlvbiB2aWEgSk1YIChNWDRKIGFkYXB0b3IpCSAgICAKKworPT09PT09PT09PT09PT09PQorcHJvYmxlbXMKKz09PT09PT09PT09PT09PT0gCistIEhvdyB3ZSBjYW4gc3RvcCB0aGUgcmVxdWVzdCB0cmFmZmljIHdoZW4gcmVzdGFydCBhbiBhcHBsaWNhdGlvbj8KKyAgICBjdXJyZW50bHkgdGhlIGprIDEuMi4xMCBjYW4gb25seSBkaXNhYmxlIHRoZSBjb21wbGV0ZSBsb2FkYmFsYW5jZXIsCisgICAgYnV0IHRoaXMgZGV0ZWN0IG9ubHkgdGhlIG5ldyBzZXNzaW9uIHJlcXVlc3QgZGVzaWNpb24uCisgICAgUmVxdWVzdCB3aXRoIHNlc3Npb25zIG1hcmtzIHNlbmQgdG8gdG9tY2F0LiAKKyAgICBGaXg6IGprID4gMS4yLjExIGhhcyBhIHN0b3BwZWQgZmxhZywgYnV0IHRoZW4gYWxsIGFwcGxpY2F0aW9uIHN0b3AgdHJhZmZpYworICAgIGFuZCBzZXNzaW9uIHRyYW5zZmVyIGZyb20gb3RoZXIgbm9kZXMgbm90IHN0b3BwZWQhIQorICAgIAlTdG9wIE1lbWJlcnNoaXBTZXJ2aWNlIHZpYSBKTVggYW5kIGFmdGVyIHJlZGVwbG95aW5nIGFwcGxpY2F0aW9uLAorICAgIAlzdGFydCBNZW1iZXJzaGlwU2VydmljZSBhbmQgcmVzdGFydCB0aGUgYXBwbGljYXRpb24gU2Vzc2lvbiBNYW5hZ2VyIG9yIHNlbmQgR0VUQUxMIFNlc3Npb24gZnJvbSBiYWNrdXA/CisgICAgCXRoZW4gZW5hYmxlIGFwYWNoZSB3b3JrZXIgYWdhaW4gISEgOi0oCisgICAgCWVhc2llciBzdG9wIHRvbWNhdHMsIGRlcGxveSBuZXcgYXBwIGFuZCBzdGFydCBhZ2Fpbi4uLiAKKy0gQ2FuJ3Qgc3RvcCBtZXNzYWdlIHJlcGxpY2F0aW9uIGZvciBhIHNwZXppYWwgbWVtYmVyIGFuZCBhcHBsaWNhdGlvbgorICAgLSB0aGlzIG5lZWQgYSBzcGV6aWFsIGNsdXN0ZXIgbWVzc2FnZSBhbmQgc2VuZCBmaWx0ZXIgYXQgU2ltcGxlVGNwQ2x1c3RlciAKKy0gRG9uJ3QgZ2VuZXJhdGUgY2x1c3RlciBtZXNzYWdlIHdoZW4gbm8gbWVtYmVyIGlzIGF0IGNsdXN0ZXIhCisgICAtIFJlZ2lzdGVyIERlbHRhTWFuYWdlciBhcyBDbHVzdGVyIExpZmVjeWNsZUxpc3RlbmVyIGFuZCBzdG9wIGNyZXN0aW5nIGFuZCBzZW5kaW5nCisgICAtIFJlZHVjZSBtZW1vcnkgY29uc3VtZSB3aGVuIG9ubHkgbG9jYWwgbm9kZSBpcyBhY3RpdmUKKyAgIC0gSW1wb3J0YW50IGZlYXR1cmUgd2hlbiBub2RlcyBjcmFzaGVkLCBhbmQgb25seSBvbmUgc2VydmVyIGV4aXN0cyB1bmRlciBsb2FkLi4uCisgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTmljZSB0byBoYXZlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistIFJlcGxpY2F0aW9uIENvbnRleHRBdHRyaWJ1dGVzCQorLSBDb25maWd1cmUgdGhlIE1jYXN0U2VydmljZSBubyBhY2NlcHQgZXZlcnkgbWVtYmVyLgorCS0gcmVjZWl2ZSBhIHNlY3JldCBrZXkKKwktIGhhdmUgYSBhbGxvdyBvciBkZW55IGxpc3QgbGlrZSBSZXF1ZXN0RmlsdGVyVmFsdmUKKwktIEFsc28gcmVjZWl2ZXIgZG9uJ3QgYWNjZXB0IHJlcXVlc3QgZnJvbSBub3QgYWxsb3dlZCBtZW1iZXJzCistIFJlcGxpY2F0aW9uTGlzdGVuZXIgYW5kIFNvY2tldFJlcGxpY2F0aW9uTGlzdGVuZXIgb25seSBhY2NlcHQgZGF0YSBmcm9tIGNsdXN0ZXIgbWVtYmVyIChsb3cgbGV2ZWwgaXAgcmVzdHJpY3Rpb24pCistIFBvb2xlZFNvY2tldFNlbmRlcgorCUFkZCBtb3JlIHN0YXRzCisJY2hlY2sgYWxsIFBvb2xlZCBzZW5kZXIgY2hlY2tLZWVwQWxpdmUKKy0gSW1wbGVtZW50IGEgTm9uU2VyaWFsaXphYmxlIGludGVyZmFjZSBmb3Igc2Vzc2lvbiBhdHRyaWJ1dGVzIHRoYXQgZG8gbm90Cit3aXNoIHRvIGJlIHJlcGxpY2F0ZWQKKyAgICAgICAgVGhlbiB3ZSBtdXN0IGhhdmUgQ2x1c3Rlck5vblNlcmlhbGl6YWJsZSBhdCBjb21tb24gY2xhc3Nsb2FkZXIKKy0gRXh0ZW5kIFN0YW5kYXJkU2Vzc2lvbiBpZiBwb3NzaWJsZQorLSBJbXBsZW1lbnQgY29udGV4dCBhdHRyaWJ1dGUgcmVwbGljYXRpb24gKD8pCisJcGVybzoKKwkJQWxzbyBzZW5kIFN0YXJ0L1N0b3AgbWVzc2FnZXMgZnJvbSBDb250ZXh0IHRvIGNvbXBsZXRlIGNsdXN0ZXIhCisgICAgICAgIFdpdGggNS41LjEwIHlvdSBjYW4gd3JvdGUgYSBDbHVzdGVyIExpZmVjeWNsZSBNYW5hZ2VyIHRoYXQgZG8gdGhpcy4KKyAgICAgICAgICAgIFJlZ2lzdGVyIGZvciBBRlRFUl9NQU5BR0VSUkVHSVNURVJfRVZFTlQgYW5kIEFGVEVSX01BTkFHRVJVTlJFR0lTVEVSX0VWRU5UCisgICAgICAgICAgICBhbmQgYWxzbyB0byB0aGUgY29udGV4dCBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IExpc3RlbmVyCisgICAgICAgICAgICBBY2Nlc3MgdGhlIENvbnRleHQKKyAgICAgICAgICAgIAkoKE1hbmFnZXIpZXZlbnQuZ2V0RGF0YSgpKS5nZXRDb250YWluZXIoKSAgICAgICAgICAgICAgICAgICAgIAkKKy0gRml4IGZhcm0gZGVwbG95bWVudCBmb3IgNS41CisgICBwZXJvOgorICAgICBFdmVyeSBzdGFydCBhbGwgYXBwbGljYXRpb24gYXJlIGRlcGxveWVkIG9ubHkgdG8gYWxsIHJ1bm5pbmcgY2x1c3RlciBub2RlcworICAgICAJTmV3IHJlZ2lzdGVyZWQgbm9kZXMgZG9uJ3QgZ2V0IHRoZSBhcHBsaWNhdGlvbnMhCisgICAgIAlEZXBsb3kgbXVzdCBzZW5kIGEgR0VUX0FMTF9BUFAgdG8gYWxsIG90aGVyIERlcGxveWVycy4KKyAgICAgICAgRkg6IENvcnJlY3Rpb24sIHlvdSBzaG91bGQgbm90IHNlbmQgR0VUX0FMTF9BUFAgdG8gYWxsIGRlcGxveWVycywgb25seQordG8gdGhlIG1haW4gb25lLiBXaGljaCBjb3VsZCBiZSBhbm90aGVyIHByb3BlcnR5IG9mIHRoZSBNZW1iZXIgb2JqZWN0LCBpdAord291bGQgbm90IG1ha2Ugc2Vuc2UgdG8gdHJhbnNmZXIgdGhlIHNhbWUgd2ViYXBwIG92ZXIgYW5kIG92ZXIgYWdhaW4uCisgICAgIAkJT25seSB3YXRjaEVuYWJsZWQgRGVwbG95ZXIgc2VuZCB0aGlzIG1lbWJlciBhbGwgZGVwbG95ZWQgYXBwbGljYXRpb24uCisJCXBlcm86CisJCSAgIFllcyB2ZXJ5IHRydWUsIGJ1dCBjdXJyZW50bHkgd2UgZGlzdHJpYnV0ZSBhbHNvIGFsbCB3YXJzIGZyb20gd2F0Y2ggbm9kZSBhdCBiZWdpbmluZy4KKwkJICAgV2FpdGluZyB0byBzdGFydCBvdGhlciBub2RlcyBpcyBvbmx5IGNoYW5nZSB0byBub3QgZ290IHRoZXNlIHdhcidzIQorCQkgICBJIGhhdmUgbWFkZSBzb21lIGV4cGVyaW1lbnRzIHRvIHJlZ2lzdGVyIHdhciBkZXBsb3ltZW50IGF0IG5ldyBtZW1iZXJBZGRlZCB0byBjbHVzdGVyLgkgICAKKyAgICAgQWRkIEpNWCBTdXBwb3J0CisgICAgIAlSZXNlbmQgRGVwbG95ZWQgQXBwbGljYXRpb25zIHRvIGFsbCBvciBvbmUgY2x1c3RlciBub2RlLgorICAgICAJU2hvdyBhbGwgd2F0Y2ggUmVzb3VyY2UKKyAgICAgCVByb2Nlc3NpbmcgVGltZQorICAgICAJQ2hhbmdlIGZpbGVNZXNzYWdlIEJ1ZmZlcnNpemUuCisgICAgIAlTdGFydC9TdG9wIENsdXN0ZXIgd2lkZSBhcHBsaWNhdGlvbgorICAgICBEZXBsb3llciBhbmQgV2F0Y2hlciBzeW5jIHdpdGggZW5naW5lIGJhY2tncm91bmQgdGhyZWFkISAKKyAgICAgCUZpeGVkIQkJCisgICAgIExhc3QgRmlsZU1lc3NhZ2UgZnJhZ21lbnQgbmVlZCBsb25nZSBhY2tUaW1lb3V0CQorICAgIAk8Q2x1c3RlciAuLj4gPFNlbmRlciAuLi4gYWNrVGltZW91dD0iNjAwMDAiLz4gPC9DbHVzdGVyPiAJCistIENoYW5nZSB0aGUgY2x1c3RlciBwcm90b2NvbCB0aGF0IGRldmVsb3BlciBjYW4gYWRkIHRoZXJlIG93biBkYXRhIHNlcmlhbHphYmxlL2Rlc2VyaWFsemFibGUgZm9ybWF0IChoaWdoIHJpc2spCisgIE5vdGUgZnJvbSBGaWxpcDogTGV0cyBub3QgZG8gdGhpcywgbGFzdCBhdHRlbXB0IGNhdXNlZCBhIGJyb2tlbiBjbHVzdGVyaW5nIHBpZWNlIGZvciA0IHZlcnNpb25zLiAKKyAgIEN1cnJlbnRseSAKKyAgIAloZWFkZXIgCQkgICAgNiBieXRlcyAoRkxUMjAwMikKKyAgICBjb21wcmVzc2ZsYWcgICAgNCBieXRlCisgICAJZGF0YS5sZW5ndGggICAgIDQgYnl0ZXMKKyAgIAlkYXRhLCAKKyAgIAllbmQgaGVhZGVyICAgICAgNiBieXRlcyAoVExGMjAwMykKKyAgIAkKKyAgIE9wdGltaXplZCB0byAKKyAgICAgIGhlYWRlciAJCTIgYnl0ZXMgKFRDKQorICAgICAgdHlwZSAgIAkJMSBieXRlCisgICAgICBjb21wcmVzc2ZsYWcgIDEgYnl0ZQorICAgICAgZGF0YS5sZW5ndGggCTQgYnl0ZXMsIAorICAgICAgZGF0YSB8IDxyZWFsIHVuY29tcHJlc3NlZCBkYXRhLmxlbmd0aCAoNCBieXRlcyk+IGRhdGEKKyAgICAgIAorICAgICAgInR5cGUiIG1lYW5zIHVzZXIgZGVmaW5lZCB0eXBlIGFuZCByZWNlaXZlciBleHRyYWN0IGJ5dGVzIGFuZCB0eXBlIGFuZCBzZW5kZSBpdCB0byBjYWxsYmFjaworICAgICAgCXMuIE9iamVjdFJlYWRlciBvciBTb2NrZXRPYmplY3RSZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgY29tcHJlc3MgICAgIDEKKyAgICAgICBmaXJzdCBkYXRhIDQgZGF0YSBieXRlcyBhcmUgdGhlIHJlYWwgdW5jb21wcmVzc2VkIGRhdGEgbGVuZ3RoLiAoIElzIGZvciBiZXR0ZXIgbWVtb3J5IG1hbmFnZW1lbnQgYXRyIHJlY2V2aWVyIHNpZGUsIFMuIFhCeXRlQnVmZmVyKQorICAgICAgIAorICAgY2hhbmdlIGF0IERhdGFTZW5kZXIud3JpdGVEYXRhIGFuZCBYQnl0ZUJ1ZmZlciBhbmQgYWRkIGZsZXhpYmxlIGhhbmRsaW5nIHRvIENsdXN0ZXJTZW5kZXIgYW5kIENsdXN0ZXJSZWNlaXZlcgorICAgCistIEFkZCBzaW5nbGUgc2lnbiBvbiBzdXBwb3J0CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgIAorQ09NUExFVEVECis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzUuNS4xNiAoZmhhbmlrKQorLSBFeHRlbnNpdmUgbG9nZ2luZyB3aGVuIGEgbWVtYmVyIGNyYXNoZXMKKyAgV2hlbiBhIG1lbWJlciBjcmFzaGVzIGFuZCB5b3UgdXNlIHBvb2xlZCBzb2NrZXQgbW9kZSB0aGVuIAorICB0aGUgbG9ncyBhcmUgc3Bld2luZyBvdXQgaW5mby4KKyAgSW5zdGVhZCwgbm93IHdlIG9ubHkgcmVwb3J0IG9uZSBJT0V4Y2VwdGlvbiBpZiBpdCBoYXBwZW5zLCBhbmQgCisgIG1hcmsgdGhlIG1lbWJlciBhcyBzdXNwZWN0LgorCis1LjUuMTYgKGZoYW5paykKKy0gQXZlcmFnZSBtZXNzYWdlIHNpemUKKyAgRm9yIG15IHRlc3QgYXBwbGljYXRpb24sIHRoZSBhdmVyYWdlIG1lc3NhZ2Ugc2l6ZSBoYXMgaW5jcmVhc2VkIGZyb20KKyAgNTI2IGJ5dGVzIHBlciBtZXNzYWdlIHRvIG92ZXIgNzUwIGJ5dGVzIHBlciBtZXNzYWdlIGZyb20gdmVyc2lvbiA1LjAuMjggdG8gNS41LjE1LgorICBOZWVkIHRvIGludmVzdGlnYXRlIHdoeSB0aGlzIGlzIHRoZSBjYXNlIGFuZCB3aGVyZSB0aGUgMjAwKyBleHRyYSBieXRlcyBhcmUgY29taW5nIGZyb20uCisgIEZpeDogVGhlIGRlZmF1bHQgY29tcHJlc3MgdmFsdWUgaGFkIGNoYW5nZWQuIFRoZSBuZXcgZGVmYXVsdCBpcyB0aGF0IG5vIGNvbXByZXNzaW9uIGlzIHVzZWQuCisgIFRvIHJlLWVuYWJsZSBjb21wcmVzc2lvbiwgPFNlbmRlciBjb21wcmVzcz0idHJ1ZSIgaW4gdGhlIHNlbmRlciBlbGVtZW50LgorCis1LjUuMTUgKHBlcm8pCistIE9wdGltaXplZCBnZXRNZW1iZXJzIGFjY2VzcyBmcm9tIE1jYXN0TWVtYmVyc2hpcAorICAgIE1lbWJlciBsaXN0IHdhcyBjb3BpZWQgYXQgZXZlcnkgYWNjZXNzLiAoVXNlZCBpbnNpZGUgUmVwbGljYXRpb25WYWx2ZS5pbnZva2UpCisgICAgU2ltcGxlVGNwQ2x1c3RlciBuZWVkIGEgYWxpdmUgdGltZSBzb3J0ZWQgYXJyYXkKKworNS41LjExIChwZXJvKQorLSBNZW1vcnlVc2VyIHByaW5jaXBhbCBmcm9tIFVzZXJEYXRhYmFzZVJlYWxtIG5vdCBoYW5kbGVkIHRvIHJlcGxpY2F0ZWQgCisJLSBsb29rIGluc2lkZSBEZWx0YVJlcXVlc3Quc2V0UHJpbmNpcGFsKFByaW5jaXBhbCxib29sZWFuKQorCQkgZGV0ZWN0ZWQgYnkgRGlyayBkZSBLb2sgKHRvbWRldiAxNi44LjIwMDUpCisJLSBvbmx5IEdlbmVyaWNQcmluY2lwYWwgZnJvbSBhbGwgb3RoZXIgcmVhbG1zIGFyZSBoYW5kbGVkIHdlbGwuCisgICAgLSBjaGFuZ2UgSkFBU1JlYWxtIGFuZCBVc2VyRGF0YWJhc2VSZWFsbSB0aGF0IGFsc28gdXNlZCBHZW5lcmljUHJpbmNpcGFsCis1LjUuMTAgKHBlcm8pCistIENsdXN0ZXIgY29uZmlnIGF0IGVuZ2luZSBsZXZlbCAodXNlciByZXF1ZXN0IDA2LzA1KQorCSBSZWdpc3RlciBhIGNsdXN0ZXIgaW5mcmFzdHJ1Y3R1ciBmb3IgbWFueSB2aG9zdHMKKwkgY29uZmlndXJlIGJhY2t1cCBzeXN0ZW1zIQorCSBBZGQgQ2x1c3RlciBFbGVtZW50IHRvIGRpZ2lzdGVyCQkKKy0gYWRkIG1hcHBpbmcgc2VuZGVyIG1hcHBpbmcgcHJvcGVydGllcyBmaWxlIChJRGF0YVNlbmRlckZhY3RvcnkpCisJLSBsZXQgYWR2YW5jZWQgcGVvcGxlIGVhaXNlciBpbXBsZW1lbnRlZCB0aGVyZSBvd24gc2VuZGVyIG1vZGUKKy0gV2UgcmVnaXN0ZXIgZGlmZmVyZW50IGFwcGxpY2F0aW9uIHdpdGggc2FtZSBuYW1lIGZyb20gZGlmZmVyZW50IGhvc3Q/CisJU2ltcGxlVGNwTWFuYWdlciByZWdpc3RlciBtYW5hZ2VyIHdpdGggYXBwIG5hbWUgKyBob3N0bmFtZSB3aGVuIENsdXN0ZXIgaXMgY29uZmlndXJlZCBhcyBFbmdpbmUgZWxlbWVudC4KKy0gQ29uZmlndXJlZCBEZWx0YU1hbmFnZXIgaW5zaWRlIGNvbnRleHQKKwktIFNpbXBsZVRjcENsdXN0ZXIgc2V0UHJvcGVydHkgYW5kIHRyYW5zZmVycHJvcGVydHkgcmVmbGVjdCBjaGFuZ2VzIG9ubHkgdG8gZGVmYXVsdE1vZGUgbWFuYWdlcnMKKyAgICAtIExvb2sgaW5zaWRlIFNpbXBsZVRjcENsdXN0ZXIuYWRkTWFuYWdlciBhbmQgRGVsdGFNYW5hZ2VyLnN0YXJ0PworLSBTZXNzaW9uIHNlcmlhbGl6YXRpb24gZWF0IG1lbW9yeSBidXQgbm93IHdlIGNhbiBzZW5kIHNlc3Npb24gbWVzc2FnZXMgd2l0aCBibG9ja3MuLi4KKwlXaGVuIGFsbCBzZXNzaW9ucyBzZXJpYWx6ZSBhZnRlciBHRVRfQUxMX1NFU1NJT04gaXMgcmVjZWl2ZWQgZm9sbG93aW5nIHdvcmtzCisJLSBmaW5kIGFsbCBzZXNzaW9ucworCS0gc2VyaWFsaXplIGEgYmxvY2sgb3IgYWxsIHNlc3Npb25zIGFzIGJ5dGUgYXJyYXkKKwktIHNlcmlhbGl6ZSB0aGUgY29tcGxldGUgU2Vzc2lvbk1lc3NhZ2VJbXBsIHRvIHRyYW5zZmVyIG1lc3NhZ2UKKy0gV2FpdEZvckFjayBtb2RlIGFuZCByZXNlbmQgcHJvYmxlbWUKKyAgIC0gTm93IG1lc3NhZ2UgY3JlYXRvciBjYW4gY29uZmlndXJlIHJlc2VuZCBhbmQgY29tcHJlc3MgbW9kZSEKKy0gQWRkIGEgZGVmYXVsdCBzaW1wbGUgY2x1c3RlciBjb25maWcgd2l0aCBnb29kIGRlZmF1bHRzIGFuZCBvbmx5CisgIG9uZSBjbHVzdGVyIGVsZW1lbnQgaW5zaWRlIHNlcnZlci54bWwuIFNldHVwIHdpdGggZmFzdGFzeW5jbW9kZS4KKyAgU2VydmljZSBFbGVtZW50cworICAJUmVwbGljYXRpb25UcmFuc21pdHRlciwKKyAgCVNvY2tldFJlcGxpY2F0aW9uTGlzdGVuZXIsCisgIAlNY2FzdFNlcnZpY2UsCisgIAlDbHVzdGVyU2Vzc2lvbkxpc3RlbmVyCisgIAlSZXBsaWNhdGlvblZhbHZlCisgIFlvdSBjYW4gY2hhbmdlIHByb3BlcnR5IHNldHRpbmcgd2l0aCBTaW1wbGVUY3BDbHVzdGVyIHByZWZpeCAic2VuZGVyLlhYWCwgcmVjZWl2ZXIuWFhYLCB2YWx2ZS5YWFgsIGxpc3RlbmVyLlhYWCwgc2VydmljZS5YWFgiCQorLSBGaXggcmVzZW5kIEdFVF9BTExfU0VTU0lPTlMgd2hlbiB3YWl0IEFDSyBmYWlsZWQgYXQgcmVjZWl2ZXIgc2lkZQorLSBGaXggdGhhdCBDbHVzdGVyVmFsdmUgbm90IHJlbW92ZSB3aGVuIGNsdXN0ZXIgc3RvcHMgCistIFNldCB0aW1lc3RhbXAgb25seSBhdCBmaXJzdCB0aW1lIGluc2lkZSBTZXNzaW9uTWVzc2FnZUltcGwKKy0gU2V0IHRpbWVzdGFtcCBmcm9tIGZpbmRzZXNzaW9ucyB3aGVuIGhhbmRsaW5nIEdFVF9BTExfU0VTU0lPTgorICAgIC0gU2V0IHRoaXMgdGltZXN0YW1wIHRvIGFsbCBTRU5EX1NFU1NJT05fREFUQSBhbmQgVFJBTlNGRVIgQ29tcGxldGUgbWVzc2FnZXMKKyAgICAtIERyb3AgYWxsIHJlY2VpdmVkIG1lc3NhZ2UgaW5zaWRlIEdFVF9BTExfU0VTU0lPTiBtZXNzYWdlIHF1ZXVlIChEZWx0YU1hbmFnZXIpICAgIAorCistIE1jYXN0IFNlcnZpY2UgYXMgSk1YIE1CZWFuIChjaGFuZ2UgY2x1c3RlciBkb21haW4gYXQgcnVudGltZSkgICAgCistIHNlbmQgY2x1c3RlciBkb21haW4gd2l0aCBtY2FzdCBwaW5nCisgICAgLSBXaXRoIHNlbmRDbHVzdGVyRG9tYWluT25seT10cnVlIG9ubHkgc2Vzc2lvbiBtZXNzYWdlIGZyb20gc2FtZSBkb21haW4gYXJlIHJlY2VpdmVkCisgICAgLSBTZXNzaW9uIG9ubHkgcmVwbGljYXRlZCB0byBtZW1iZXJzIGZyb20gc2FtZSBkb21haW4sIHdpdGggc2VuZENsdXN0ZXJEb21haW5Pbmx5PWZhbHNlCisgICAgICBhdCBTZW5kZXIgKFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIpIHNlc3Npb24gbWVzc2FnZXMgc2VuZCB0byBhbGwgbWVtYmVycy4KKyAgICAtIEdFVCBBTEwgU2Vzc2lvbiBzZW5kIHRvIGZpcnN0IG1lbWJlciBpbnNpZGUgc2FtZSBjbHVzdGVyIGRvbWFpbgorLSBiZXR0ZXIgcmVzdGFydCBzemVuYXJpbyBhdCBEZWx0YU1hbmFnZXIgYWZ0ZXIgZmFpbHVyZSByZXN0YXJ0IChqYXZhIHNlcnZpY2Ugd3JhcHBlcikuCisgICBxdWV1ZSBhbGwgb3RoZXIgc2Vzc2lvbiBldmVudHMKKyAgIGFzIFNUQVRFIFRyYW5zZmVyIENvbXBsZXRlIGlzIHJlY2VpdmVkLCBkZXF1ZXVlIGFsbCByZWNlaXZlZCBzZXNzaW9ucyBtZXNzYWdlcy4gICAKKy0gcmVzdHJ1Y3R1cmUgbWV0aG9kcyBhdCBEZWx0YU1hbmFnZXIKKy0gZXh0cmFjdCBoYW5kbGVYWFMgbWV0aG9kcyBmb3IgYmV0dGVyIERlbHRhTWFuYWdlciBzdWJjbGFzc2luZy4KKy0gc3BsaXQgYmlnIGdldCBhbGwgc2Vzc2lvbnMgZnJvbSBvbmUgc2VydmVyIGludG8gYmxvY2tzIG9mIHNlc3Npb25zIGFuZCBzZXBhcmF0ZSBTVEFURSBUcmFuc2ZlciBtZXNzYWdlIQorLSBubyBjb21wbGV0ZSBzeW5jIHNlc3Npb25zIHdoZW4gR0VUIEFMTCBTZXNzaW9ucyBldmVudCBpcyByZWNlaXZlZC4KKy0gYWRkIEpNWCBBUEkgZm9yIENsdXN0ZVJyZWNlaXZlcgorLSBDbHVzdGVyUmVjZWl2ZXIgaXMgbm93IENhbGxiYWNrIHdoZW4gbWVzc2FnZSBpcyByZWNlaXZlZAorLSBTaW1wbGVUY3BDbHVzdGVyIG9ubHkgcmVjZWl2ZSBDbHVzdGVyTWVzc2FnZSAoQVBJIGNoYW5nZSkKKyAgICAgICBSZWRlc2lnbiBTaW1wbGVUY3BDbHVzdGVyIG1lc3NhZ2UgcmVjZWl2aW5nIHRvIENsdXN0ZXJSZWNlaXZlckJhc2U6CisgICAgICAgICAgLSBvcHRpbWl6ZWQgZGF0YSB1bmNvbXByZXNzZWQKKyAgICAgICAgICAtIGJldHRlciBleHRlbmRhYmxpdHkKKyAgICAgICAgICAtIFhCeXRlQnVmZmVyIG9ubHkgYnVmZmVyIGJ5dGVzIGFuZCBkb24ndCB1bmNvbXByZXNzLgorICAgICAgICAgIC0gQWRkIHJlY2VpdmVyIEpNWCBzdGF0cyB3aXRoIG5ldyBhdHRyaWJ1dGUgJ1JlY2VpdmVyLmRvUmVjZWl2ZWRQcm9jZXNzaW5nU3RhdHMnICAgCisgICAgICAgICAgLSBvcHRpbWl6ZWQgY3JlYXRlTWFuYWdlciBhbmQgYWRkTWFuYWdlciB0aGF0IGFsc28gY2FuIGNvbmZpZ3VyZWQgbm9ybWFsIFN0YW5kYXJkTWFuYWdlciAKKyAgICAgICAgICAgIHRvIHVzZSBjbHVzdGVyIG1lc3NhZ2UgdHJhbnNmZXIgd2l0aG91dCByZXBsaWNhdGlvbi4KKy0gYWRkIHN1cHBvcnQgdG8gZHluYW1pYyBwcm9wZXJ0eSB0cmFuc2ZlciBmcm9tIFNpbXBsZVRjcENsdXN0ZXIgdG8gdGhlIE1hbmFnZXIKKyAgICBsaWtlIFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIKKyAgICAgICAgQWxsIG1hbmFnZXIgYXR0cmlidXRlcyBjYW4gYmUgY29uZmlndXJlZDoKKyAgICAgICAgICAtIGV4cGlyZVNlc3Npb25zT25TaHV0ZG93biAoZmFsc2UpCisgICAgICAgICAgLSBub3RpZnlTZXNzaW9uTGlzdGVuZXJzT25SZXBsaWNhdGlvbiAodHJ1ZSkKKyAgICAgICAgICAtIG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24gKHRydWUpCisgICAgICAgICAgLSBtYXhBY3RpdmVTZXNzaW9ucyAoLTEpCisgICAgICAgICAgLSB0aW1lb3V0QWxsU2Vzc2lvbiAoNjAgc2VjKQorICAgICAgICAgIC0gc2Vzc2lvbklkTGVuZ3RoICgxNikKKyAgICAgICAgICAtIHByb2Nlc3NFeHBpcmVzRnJlcXVlbmN5ICg2IC0gZXhpcHJlIGFsbCBzaXggZW5naW5lIGJhY2tncm91bmQgcGVyaW9kaWMgZXZlbnQgKDYwIHNlYykpCisgICAgICAgICAgLSBhbGdvcml0aG0gKE1ENSkKKyAgICAgICAgICAtIGVudHJvcHkKKyAgICAgICAgICAtIHJhbmRvbUZpbGUKKyAgICAgICAgICAtIHJhbmRvbUNsYXNzCistIFNldHVwIHRoZSBjbHVzdGVyIHdpdGhvdXQgU2Vzc2lvblJlcGxpY2F0aW9uIE1hbmFnZXIKKyAgICAgICAgIE9ubHkgYSBtZXNzYWdlIGJ1cy4KKyAgICAgICAgIENvbmZpZ3VyZSB0aGUgYnVzIHdpdGggeW91IENsdXN0ZXJMaXN0ZW5lciBhbmQgdmFsdmVzIGFuZCBhIFN0YW5kYXJkTWFuYWdlciAgICAgICAgIAorLSByZWR1Y2UgY3B1IGFuZCBtZW1vcnkgY29uc3VtZSAoUmVjZWl2ZXIpCisgICAgLSBzZXQgbmV3IGNvbXByZXNzIHNlbmRlciBmbGFnIGF0IGRlZmF1bHQ9ZmFsc2UgKCA8IENQVSB1c2FnZSkKKyAgICAtIE1ha2UgY29tcGFjdCBhbGdvIAorICAgICAgICBjdXJyZW50bHkgbWVzc2FnZSByZWNlaXZlIGRhdGEgaXMgc3BsaXQgYXQgWGJ5dGVCdWZmZXIjZXh0cmFjdFBhY2thZ2UgYW5kCisgICAgICAgIFNpbXBsZVRjcENsdXN0ZXIjbWVzc2FnZURhdGFSZWNlaXZlZCAgICAgCistIHJlZHVjZSBtZW1vcnkgYW5kIGNwdSBjb25zdW1lIChzZW5kIG1lc3NhZ2UpCisgICAgLSBzZXQgbmV3IGNvbXByZXNzIHNlbmRlciBmbGFnIGF0IGRlZmF1bHQ9ZmFsc2UgKCA8IENQVSB1c2FnZSkKKyAgICAtIGRvbid0IGNvcHkgdGhlIGJ1ZmZlciB0byBhZGQgbWVzc2FnZSBoZWFkZXIKKyAgICAgICAgdHJhbnNmZXIgdGhpcyBmcm9tIFNpbXBsZVRjcENsdXN0ZXIgdG8gRGF0YVNlbmRlciBwdXNoTWVzc2FnZQorICAgICAgICBzdWNjZXNzZnVsbCByZWZhY3RvcmVkCisgICAgLSBtYWtlIGl0IHBvc3NpYmxlIHRoYXQgYSBzdWJjbGFzcyBjcnlwdCB0aGUgdHJhbnNmZXJlZCBtZXNzYWdlcworICAgICAgIHN1YiBjbGFzcyBSZXBsaWNhdGlvblRyYW5zbWl0dGVyIGFuZCBvdmVycmlkZSBjcmVhdGVNZXNzYWdlRGF0YQorICAgIC0gZG9uJ3QgY29weSBTVEFSVCBhbmQgRU5EIEhlYWRlciBmb3IgZXZlcnkgbWVzc2FnZSwgaW5zdGVhZCBzZW5kIGRpcmN0bHkgYW5kIERhdGFTZW5kZXIud3JpdGVEYXRhLiAgIAorLSBBZGQgYSBmbGFnIGZvciByZXBsaWNhdGVkIGF0dHJpYnV0ZSBldmVudHMsIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZW0gCisgICAgIE5vdyBjYW4gY29uZmlndWVkIHdpdGggbm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbj1mYWxzZSBhdCBTaW1wbGVUQ1BDbHVzdGVyCisgICAgIEFsc28gY2FuIGRyb3AgSHR0cFNlc3Npb25Mc2l0ZW5lciBldmVudHMKKyAgICAgICAgIGNhbiBjb25maWd1ZWQgd2l0aCBub3RpZnlTZXNzaW9uTGlzdGVuZXJzT25SZXBsaWNhdGlvbj1mYWxzZSBhdCBTaW1wbGVUQ1BDbHVzdGVyCistIFJlZmFjdG9yaW5nIERlbHRhTWFuYWdlcgorLSBUcmFuc2ZlciBhdHRyaWJ1dGVzIGZyb20gQ2x1c3RlciBjb25maWcgdG8gRGVsdGFNYW5hZ2VyCistIEZpeCBhdCA1LjUuOSBjbHVzdGVyIGhhbmcgYnVnISAKKy0gQWRkIG1vcmUgVmFsdmUgdG8gZGlyZWN0IGNsdXN0ZXIgY29uZmlnCistIEFkZCBMaWZlY3ljbGUgTGlzdGVuZXIgc3VwcG9ydCB0byBkaXJlY3QgY2x1c3RlciBjb25maWcKKy0gQWRkIENsdXN0ZXJMaXN0ZW5lciBzdXBwb3J0IHRvIGRpcmVjdCBjbHVzdGVyIGNvbmZpZworLSBBZGQgbmV3IFNvY2tldFJlcGxpY2F0aW9uTGlzdGVuZXIKKy0gQWRkIFN0YXRzIHRvIERlbHRhTWFuYWdlcgorCis1LjUuOSAgKHBlcm8pCistIEpNWCBmcmllbmRseQorICAgIHBlcm86ICBBZGQgc29tZSBNQmVhblN1cHBvcnQgdG8gU2ltcGxlVENQQ2x1c3RlciwgUmVwbGljYXRpb25UcmFuc21pdHRlciBhbmQgU2VuZGVycworLSBBZGQgS2VlcCBBbGl2ZSBhbmQgV2FpdEZvckFjayBhdCBhc3luYyBtb2RlIGltcGxlbWVudGF0aW9uLgorICAgICAgIE1ha2UgdGhpcyBmZWF0dXJlIGNvbmZpZ3VyYWJsZSB0byBTZW5kZXIgZWxlbWVudCBhdCBzZXJ2ZXIueG1sCisgICAgICAgSXMgaW5jbHVkZSB3aXRoIDUuNS44CistIEFkZCBzdXBwb3J0IHRvIG5ldyBBc3luYyBNb2RlIGZyb20gUmFpbmVyIEp1bmcKKyAgICAgICBJbnRlZ3JhdGVkIHdpdGggNS41LjkKKyAgICAgICBmYXN0YXN5bmNxdWV1ZSBtb2RlCisgCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9WRVJTSU9OIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vVkVSU0lPTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODYxZGM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vVkVSU0lPTgpAQCAtMCwwICsxLDY1IEBACiswLjkuNS4yCisgIC0gbWFkZSB0aGUgVW5pcXVlSWQgc2VyaWFsaXphYmxlCiswLjkuNS4xCisgIC0gY3JlYXRlIGEgcHJvdG9jb2wgYXJvdW5kIHRoZSBtdWx0aWNhc3QgcGFja2FnZXMsIHNvIHRoYXQgd2UgY2FuIGdvIHRvIG5pbyBldmVudHVhbGx5CisgIC0gY29ycmVjdGVkIHRyYWNpbmcKKzAuOS41LjAKKyAgLSBhZGRlZCBtZXNzYWdlIHRyYWNlcnMKKzAuOS40LjkKKyAgLSBtYXggbXVsdGljYXN0IHBhY2tldCBpcyBubyByb3VnaGx5IDY0ayBpbnN0ZWFkIG9mIDhrCisgIC0gdHJpYmVzIHRocm93cyBhbiBpbGxlZ2FsIGFyZ3VtZW50IGV4Y2VwdGlvbiBpZiB0aGUgcGF5bG9hZCBhZGRlZCBpcyB0b28gbGFyZ2UgIAorMC45LjQuOAorICAtIGZpeCBidWcgaW4gdGhlIE5JTyBzZW5kZXIsIGl0IHNob3VsZCB1c2UgZmxpcCBpbnN0ZWFkIG9mIHJld2luZAorMC45LjQuNworICAtIHJlbGVhc2UgdGhlIHNvY2tldCBrZXkgdG8gdGhlIHBvbGxlciBiZWZvcmUgc2VuZGluZyB0aGUgZGF0YSByZXF1ZXN0cyB1cCB0aHJvdWdoIHRoZSBjaGFubmVsCisgICAgdGhpcyBtYWtlcyByZWNlaXZpbmcgZGF0YSBub24gYmxvY2tpbmcsIGV2ZW4gaWYgdGhlIGFwcGxpY2F0aW9uIGlzCiswLjkuNC42CisgIC0gZml4IHBhY2thZ2UgcHJvY2Vzc2luZywgdGhlIG9sZCByZWxlYXNlIHdhcyBob2dnaW5nIGEgdGhyZWFkIGZvciBhIHNpbmdsZSBjb25uZWN0aW9uLCBtYWtpbmcgY29uY3VycmVuY3kgbm90IHNvIGVmZmljaWVudCwKKyAgICB0aGlzIGZpeCB1c2VzIHRoZSB0aHJlYWQgZm9yIG9uZSBwYWNrYWdlLCB0aGVuIG1vdmVzIG9uLiBmYXN0ZXIgY29uY3VycmVuY3ksIGFuZCBtdWNoIGxlc3MgbWVtb3J5IHVzYWdlIGluIGhpZ2ggc3RyZXNzIGVudmlyb25tZW50cworMC45LjQuNAorICAtIHRlbXBvcmFyeSB3b3JrIGFyb3VuZCBmb3IgdGhlIHRocmVhZGluZyBwcm9ibGVtLCBnbyBkaXJlY3RseSB0byBtYXggdGhyZWFkcworMC45LjQuMworICAtIG1pbm9yIGZpeGVzIHRvIHRocmVhZGluZyBhbmQgdGVzdCBjYXNlcworMC45LjQuMgorICAtIEh1Z2UgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIG9uIHRoZSBOSU9SZWNlaXZlcgorICAtIHJldmlzaW9uIDQxODUxOAorICAtIHdvcmtlZCBvdXQgdGhlIGJ1aWxkIHNjcmlwdCB0byBnZW5lcmF0ZSB2ZXJzaW9uZWQgamFycworMC45LjQuMQorICAtIGZpeGVkIGJ1ZyB3aXRoIHRoZSBjb21tYW5kIGJlaW5nIHRyYW5zZmVycmVkIGJ1dCBub3QgZGVzZXJpYWxpemVkCiswLjkuNC4wCisgIC0gQWRkZWQgTWVtYmVyLmdldENvbW1hbmQsIHRvIHNlcGFyYXRlIG91dCBpbnRlcm5hbCB0cmliZXMgbG9naWMgZnJvbSBhcHBsaWNhdGlvbiBwYXlsb2FkCisgIC0gd2hlbiBzZXR0aW5nIHBheWxvYWQsIHRoZSB1cGRhdGUgc2hvdWxkIGdldCBzZW50IGltbWVkaWF0ZWx5CisgIC0gZG9tYWluIG5hbWUgZmlsdGVyLCB1c2luZyBhbiBpbnRlcmNlcHRvciBpZiB3ZSB3aXNoCisgIC0gbWFqb3IgdmVyc2lvbiBidW1wIHNpbmNlIHdlIGFyZSBjaGFuZ2luZyB0aGUgcHJvdG9jb2wgZm9yIG1lbWJlcgorMC45LjMuMgorICAtIE1lbWJlckltcGwudG9TdHJpbmcgaGFzIGEgbGltaXQgb24gdGhlIHNpemUgaXQgcHJpbnRzIG91dAorMC45LjMuMQorICAtIGZpeGVkIGEgYnVnIGluIHRoZSBzdGFydHVwIHNlcXVlbmNlLiBJZiB0aGUgbG9jYWwgbWVtYmVyIGdldHMgY3JlYXRlZCwgdGhlbiB3ZSBuZWVkIHRvIHNldCB0aGUgdW5pcXVlIElkCisgIC0gZGVmYXVsdCBtdWx0aWNhc3QgcGFja2V0IGNhbiBiZSA4a2IKKzAuOS4zLjAKKyAgLSBmaXhlZCBidWdzCiswLjkuMi45CisgIC0gamRrMS40IHN1cHBvcnQgZm9yIGJ1ZmZlciBwb29scworMC45LjIuOAorICAtIGZpbmlzaGVkIGNvb3JkaW5hdG9yIGFuZCBidWcgZml4ZXMgaW4gdGhlIGNvb3JkaW5hdG9yIGFuZCBDaGFubmVsUmVjZWl2ZXIKKzAuOS4yLjYKKyAgLSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBOb25CbG9ja2luZ0Nvb3JkaW5hdG9yIGltcGxlbWVudGVkCisgIC0gb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZGVtb3MuQ29vcmRpbmF0aW9uRGVtbyBpbXBsZW1lbnRlZAorMC45LjIuNQorICAtIG1pbm9yIHVwZGF0ZXMKKzAuOS4yLjQKKyAgLSBsZWFkZXIgZWxlY3Rpb24sIHdvcmsgaW4gcHJvZ3Jlc3MKKzAuOS4yLjMKKyAgLSBLZWVwIGFsaXZlIHBpbmdzIGZvciBBYnN0cmFjdFJlcGxpY2F0ZWRNYXAKKyAgLSBJbXByb3ZlZCBUY3BGYWlsdXJlRGV0ZWN0b3IKKzAuOS4yLjIKKyAgLSByZW1vdmVkIGdldE1lbWJlclByb3BlcnRpZXMgZnJvbSB0aGUgbWVtYmVyc2hpcCBpbnRlcmZhY2UKKzAuOS4yLjEKKyAtIHJlbW92ZSBkb21haW4gZnJvbSBtZW1iZXJzaGlwCisgLSBkb2N1bWVudGF0aW9uIHVwZGF0ZXMKKzAuOS4yLjAKKyAtIG1lc3NhZ2UgZGlzcGF0Y2ggaW50ZXJjZXB0b3IgaXMgaW5jbHVkZWQgaWYgbm8gb3RoZXIgaW50ZXJjZXB0b3JzIGFyZSBhZGRlZCBzbyB0aGF0CisgICBhc3luYyBtZXNzYWdpbmcgaXMgZW5hYmxlZCBpbiB0aGUgZGVmYXVsdCBzdGFjaworMC45LjEuMgorIC0gMS40IGNvbXBhdGliaWxpdHkKKzAuOS4xLjEKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2J1aWxkLnhtbCBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzBkYjIxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vYnVpbGQueG1sCkBAIC0wLDAgKzEsMTUxIEBACis8cHJvamVjdCBuYW1lPSJHcm91cENvbSIgZGVmYXVsdD0iZGlzdCIgYmFzZWRpcj0iLiI+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBJbml0aWFsaXplIFByb3BlcnR5IFZhbHVlcyA9PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDxwcm9wZXJ0eSBmaWxlPSIuLi8uLi8uLi9idWlsZC5wcm9wZXJ0aWVzIiAvPgorICA8cHJvcGVydHkgZmlsZT0iLi4vLi4vLi4vYnVpbGQvYnVpbGQucHJvcGVydGllcyIgLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uLy4uLy4uL2J1aWxkL2J1aWxkLnByb3BlcnRpZXMuZGVmYXVsdCIgLz4KKworICA8IS0tIEJ1aWxkIERlZmF1bHRzIC0tPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuaG9tZSIgIGxvY2F0aW9uPSIuLi8uLiIvPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuYnVpbGQiIGxvY2F0aW9uPSIuLi8uLi8uLi9idWlsZC9idWlsZCIvPgorICA8cHJvcGVydHkgbmFtZT0iZ3JvdXBjb20uYnVpbGQiICB2YWx1ZT0iJHtjYXRhbGluYS5ob21lfS9tb2R1bGVzL2dyb3VwY29tL2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJncm91cGNvbS5kaXN0IiAgIHZhbHVlPSIke2NhdGFsaW5hLmhvbWV9L21vZHVsZXMvZ3JvdXBjb20vZGlzdCIvPgorCisgICAgPCEtLSBDb25zdHJ1Y3QgQ2F0YWxpbmEgY2xhc3NwYXRoIC0tPgorICA8cGF0aCBpZD0iZ3JvdXBjb20uY2xhc3NwYXRoIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2F0YWxpbmEuYnVpbGR9L3NlcnZlci9saWIvY2F0YWxpbmEuamFyIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NhdGFsaW5hLmJ1aWxkfS9zZXJ2ZXIvbGliL3RvbWNhdC11dGlsLmphciIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLW1vZGVsZXIuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxvZ2dpbmcuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqbXguamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjYXRhbGluYS5idWlsZH0vY29tbW9uL2xpYi9zZXJ2bGV0LWFwaS5qYXIiLz4KKyAgPC9wYXRoPgorCisgICAgPCEtLSBTb3VyY2UgcGF0aCAtLT4KKyAgPHBhdGggaWQ9ImphdmFkb2Muc291cmNlcGF0aCI+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvc2hhcmUiLz4KKyAgPC9wYXRoPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBTZXQgY29tcGlsZSBmbGFncyA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJmbGFncyI+CisgICAgPCEtLSBKREsgZmxhZ3MgLS0+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrLjEuMi5wcmVzZW50IiBjbGFzc25hbWU9ImphdmEudXRpbC5IYXNoTWFwIiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Impkay4xLjMucHJlc2VudCIgCisgICAgIGNsYXNzbmFtZT0iamF2YS5sYW5nLnJlZmxlY3QuUHJveHkiIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrLjEuNC5wcmVzZW50IiBjbGFzc25hbWU9ImphdmEubmlvLkJ1ZmZlciIgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IFNldCBjb21waWxlIGZsYWdzID09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImZsYWdzLmRpc3BsYXkiIGRlcGVuZHM9ImZsYWdzIiB1bmxlc3M9ImZsYWdzLmhpZGUiPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIEJ1aWxkIGVudmlyb25tZW50IGZvciBDYXRhbGluYSAtLS0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSJJZiAke3Byb3BlcnR5X25hbWV9IGlzIGRpc3BsYXllZCwgdGhlbiB0aGUgcHJvcGVydHkgaXMgbm90IHNldCkiIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gQnVpbGQgb3B0aW9ucyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iZnVsbC5kaXN0PSR7ZnVsbC5kaXN0fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJidWlsZC5zeXNjbGFzc3BhdGg9JHtidWlsZC5zeXNjbGFzc3BhdGh9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUuZGVidWc9JHtjb21waWxlLmRlYnVnfSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlLmRlcHJlY2F0aW9uPSR7Y29tcGlsZS5kZXByZWNhdGlvbn0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5vcHRpbWl6ZT0ke2NvbXBpbGUub3B0aW1pemV9IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIEFudCBGbGFncyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iJmx0O3N0eWxlJmd0OyB0YXNrIGF2YWlsYWJsZSAocmVxdWlyZWQpPSR7c3R5bGUuYXZhaWxhYmxlfSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBKREsgLS0tIiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Impkay4xLjIucHJlc2VudD0ke2pkay4xLjIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iamRrLjEuMy5wcmVzZW50PSR7amRrLjEuMy5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqZGsuMS40LnByZXNlbnQ9JHtqZGsuMS40LnByZXNlbnR9IiAvPgorCisgIDwvdGFyZ2V0PgorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtcHJlcGFyZSI+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5idWlsZH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jbGFzc2VzIi8+CisgICAgPG1rZGlyIGRpcj0iJHtncm91cGNvbS5kaXN0fSIvPgorICA8L3RhcmdldD4KKworCisgIAorCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ29tcGlsZSBDYXRhbGluYSBDb21wb25lbnRzID09PT09PT09PT09PT09PT0gLS0+CisgIAorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNhdGFsaW5hLWdyb3VwY29tIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlIj4KKyAgICA8IS0tIENvbXBpbGUgaW50ZXJuYWwgc2VydmVyIGNvbXBvbmVudHMgLS0+CisgICAgPGphdmFjIHNyY2Rpcj0iJHtiYXNlZGlyfS9zcmMvc2hhcmUiIGRlc3RkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NsYXNzZXMiCisgICAgICAgICAgIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IiBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKyAgICAgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iCisgICAgICAgICAgIGV4Y2x1ZGVzPSIqKi9DVlMvKioiICAJICAgCisgICAgCT4KKyAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iZ3JvdXBjb20uY2xhc3NwYXRoIiAvPgorICAgIDwvamF2YWM+CisgICAgPGNvcHkgZmlsZT0iJHtiYXNlZGlyfS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMiCisgICAgCSAgdG9maWxlPSIke2NhdGFsaW5hLmJ1aWxkfS9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIi8+CisgICAgPGNvcHkgZmlsZT0iJHtiYXNlZGlyfS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIgorICAgIAkgIHRvZmlsZT0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMiLz4KKyAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCIKKyAgICAJICB0b2ZpbGU9IiR7Y2F0YWxpbmEuYnVpbGR9L2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L21iZWFucy1kZXNjcmlwdG9ycy54bWwiLz4KKyAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9tZW1iZXJzaGlwL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIgorICAgIAkgIHRvZmlsZT0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9tZW1iZXJzaGlwL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIi8+CisgICAgPGNvcHkgZmlsZT0iJHtiYXNlZGlyfS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvbWVtYmVyc2hpcC9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIgorICAgICAJICB0b2ZpbGU9IiR7Y2F0YWxpbmEuYnVpbGR9L2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvbWVtYmVyc2hpcC9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIi8+CisgICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ3JlYXRlIENhdGFsaW5hIEphdmFkb2NzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iamF2YWRvYyI+CisgICAgPGRlbGV0ZSBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2phdmFkb2MiLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9qYXZhZG9jIi8+CisgICAgPGphdmFkb2MgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLiosb3JnLmFwYWNoZS5uYW1pbmcuKiIKKyAgICAgIGNsYXNzcGF0aHJlZj0iY2F0YWxpbmEuY2xhc3NwYXRoIgorICAgICAgc291cmNlcGF0aHJlZj0iamF2YWRvYy5zb3VyY2VwYXRoIgorICAgICAgZGVzdGRpcj0iJHtjYXRhbGluYS5idWlsZH0vamF2YWRvYyIKKyAgICAgIGF1dGhvcj0idHJ1ZSIKKyAgICAgIHZlcnNpb249InRydWUiCisgICAgICB3aW5kb3d0aXRsZT0iQ2F0YWxpbmEgSW50ZXJuYWwgQVBJIERvY3VtZW50YXRpb24iCisgICAgICBkb2N0aXRsZT0iQ2F0YWxpbmEgQVBJIgorICAgICAgYm90dG9tPSJDb3B5cmlnaHQgJiMxNjk7IDIwMDAtMjAwMiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIgorICAgIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBCVUlMRDogUmVidWlsZCBFdmVyeXRoaW5nID09PT09PT09PT09PT09PT09PT09PSAtLT4KKworCisKKworICA8IS0tID09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpc3RyaWJ1dGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImJ1aWxkLWNhdGFsaW5hLWdyb3VwY29tIj4KKyAgICAKKyAgICA8amFyIGRlc3RmaWxlPSIke2dyb3VwY29tLmRpc3R9L2NhdGFsaW5hLXRyaWJlcy5qYXIiCisgICAgICAgICBiYXNlZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jbGFzc2VzIj4KKyAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy8qKiIgLz4KKyAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9wYWNrYWdlLmh0bWwiIC8+CisgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovTG9jYWxTdHJpbmdzXyoiIC8+CisgICAgPC9qYXI+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29weSIgZGVwZW5kcz0iZGlzdCIgPgorICAgICA8Y29weSBmaWxlPSIke2dyb3VwY29tLmRpc3R9L2NhdGFsaW5hLXRyaWJlcy5qYXIiIHRvZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9zZXJ2ZXIvbGliIiAvPgorICA8L3RhcmdldD4KKyAgCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENsZWFuIERpcmVjdG9yeSA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgICA8ZGVsZXRlIGRpcj0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3NlcyIvPgorICA8L3RhcmdldD4KKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IENvbnZlbmllbnQgU3lub255bXMgPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9idWlsZC9idWlsZC5wcm9wZXJ0aWVzLmRlZmF1bHQgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9idWlsZC9idWlsZC5wcm9wZXJ0aWVzLmRlZmF1bHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc4YWQ3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2J1aWxkL2J1aWxkLnByb3BlcnRpZXMuZGVmYXVsdApAQCAtMCwwICsxLDE5IEBACitiYXNlLnBhdGg9YnVpbGQvdGVtcAorbGliLnBhdGg9YnVpbGQvbGliCisKK2Jhc2Utc2YubG9jPWh0dHA6Ly9zd2l0Y2guZGwuc291cmNlZm9yZ2UubmV0L3NvdXJjZWZvcmdlCitiYXNlLWpha2FydGEubG9jPWh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9qYWthcnRhCitiYXNlLWxvZ2dpbmcubG9jPWh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9sb2dnaW5nCisKKyMgLS0tLS0gQ29tbW9ucyBMb2dnaW5nLCB2ZXJzaW9uIDEuMC4xIG9yIGxhdGVyIC0tLS0tCitjb21tb25zLWxvZ2dpbmcuaG9tZT0ke2xpYi5wYXRofS9jb21tb25zLWxvZ2dpbmctMS4wLjQKK2NvbW1vbnMtbG9nZ2luZy5saWI9JHtjb21tb25zLWxvZ2dpbmcuaG9tZX0KK2NvbW1vbnMtbG9nZ2luZy1hcGkuamFyPSR7Y29tbW9ucy1sb2dnaW5nLmxpYn0vY29tbW9ucy1sb2dnaW5nLWFwaS5qYXIKK2NvbW1vbnMtbG9nZ2luZy5qYXI9JHtjb21tb25zLWxvZ2dpbmcubGlifS9jb21tb25zLWxvZ2dpbmcuamFyCitjb21tb25zLWxvZ2dpbmcubG9jPSR7YmFzZS1qYWthcnRhLmxvY30vY29tbW9ucy9sb2dnaW5nL2JpbmFyaWVzL2NvbW1vbnMtbG9nZ2luZy0xLjAuNC50YXIuZ3oKKworIyAtLS0tLSBKVW5pdCBVbml0IFRlc3QgU3VpdGUsIHZlcnNpb24gMy43IG9yIGxhdGVyIC0tLS0tCitqdW5pdC5ob21lPSR7bGliLnBhdGh9L2p1bml0My44LjEKK2p1bml0LmxpYj0ke2p1bml0LmhvbWV9CitqdW5pdC5qYXI9JHtqdW5pdC5saWJ9L2p1bml0LmphcgoranVuaXQubG9jPSR7YmFzZS1zZi5sb2N9L2p1bml0L2p1bml0My44LjEuemlwCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9idWlsZC9idWlsZC54bWwgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9idWlsZC9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4NDIxYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2J1aWxkL2J1aWxkLnhtbApAQCAtMCwwICsxLDIwNCBAQAorPHByb2plY3QgbmFtZT0iVHJpYmVzIiBkZWZhdWx0PSJkaXN0IiBiYXNlZGlyPSIuLiI+CisgICAgCisgIDxwcm9wZXJ0eSBmaWxlPSIke3VzZXIuaG9tZX0vYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iYnVpbGQvYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iYnVpbGQvYnVpbGQucHJvcGVydGllcy5kZWZhdWx0Ii8+CisgIAorICA8cHJvcGVydHkgbmFtZT0idHJpYmVzLnZlcnNpb24iIHZhbHVlPSIxLjAtU05BUFNIT1QiLz4KKworICA8IS0tSW5kZXBlbmRlbnQgYnVpbGQgc2NyaXB0IGZvciBUcmliZXMsIHRvIG5vdCByZXF1aXJlIHRoZSBlbnRpcmUgVG9tY2F0IHRyZWUgdG8gYnVpbGQgCisgICAgICAgIHRoaXMgbW9kdWxlLS0+CisgICAgCisgIDxwYXRoIGlkPSJqYXZhLnNvdXJjZXBhdGgiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtiYXNlZGlyfS9zcmMvc2hhcmUiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YmFzZWRpcn0vdGVzdC9qYXZhIi8+CisgIDwvcGF0aD4KKworICA8cGF0aCBpZD0iamF2YWRvYy5zb3VyY2VwYXRoIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YmFzZWRpcn0vc3JjL3NoYXJlIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3Rlc3QvamF2YSIvPgorICA8L3BhdGg+CisKKworICA8cHJvcGVydHkgbmFtZT0iZGlzdC5wYXRoIiB2YWx1ZT0iJHtiYXNlZGlyfS9kaXN0L3RyaWJlcyIvPgorICA8cHJvcGVydHkgbmFtZT0idGVtcC5wYXRoIiB2YWx1ZT0iJHtiYXNlZGlyfS9kaXN0L3RlbXAiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNvbXBpbGUucGF0aCIgdmFsdWU9IiR7dGVtcC5wYXRofS9jbGFzc2VzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkb2NzLnBhdGgiIHZhbHVlPSIke3RlbXAucGF0aH0vZG9jcyIvPgorICA8cHJvcGVydHkgbmFtZT0iamF2YWRvYy5wYXRoIiB2YWx1ZT0iJHt0ZW1wLnBhdGh9L2phdmFkb2MiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImRvd25sb2FkLnBhdGgiIHZhbHVlPSIke2Jhc2UucGF0aH0iLz4KKworICA8cGF0aCBpZD0idHJpYmVzLmNsYXNzcGF0aCI+CisgICAgPCEtLQorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtiYXNlZGlyfS9idWlsZC9jb21tb25zLWxvZ2dpbmctYXBpLmphciIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtiYXNlZGlyfS9idWlsZC9jb21tb25zLWxvZ2dpbmcuamFyIi8+CisgICAgLS0+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2p1bml0Lmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sb2dnaW5nLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sb2dnaW5nLWFwaS5qYXJ9Ii8+CisKKyAgPC9wYXRoPgorCisgIDwhLS1Cb3Jyb3dlZCBmcm9tIHRoZSB0b21jYXQgYnVpbGQgc2NyaXB0IHRvIGRvd25sb2FkIGRlcGVuZGVuY2llcy0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3RleGlzdCI+CisgICAgPGVjaG8gbWVzc2FnZT0iVGVzdGluZyAgZm9yICR7ZGVzdGZpbGV9Ii8+CisgICAgPGF2YWlsYWJsZSBmaWxlPSIke2Rlc3RmaWxlfSIgcHJvcGVydHk9ImV4aXN0Ii8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJkb3dubG9hZHppcCIgdW5sZXNzPSJleGlzdCIgZGVwZW5kcz0idGVzdGV4aXN0Ij4KKyAgICA8IS0tIERvd25sb2FkIGFuZCBleHRyYWN0IHRoZSBwYWNrYWdlIC0tPgorICAgIDxnZXQgc3JjPSIke3NvdXJjZWZpbGV9IiBkZXN0PSIke2Rvd25sb2FkLnBhdGh9L2ZpbGUuemlwIiAvPgorICAgIDxta2RpciBkaXI9IiR7ZG93bmxvYWQucGF0aH0iIC8+CisgICAgPHVuemlwIHNyYz0iJHtkb3dubG9hZC5wYXRofS9maWxlLnppcCIgZGVzdD0iJHtsaWIucGF0aH0iLz4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7ZG93bmxvYWQucGF0aH0vZmlsZS56aXAiLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9ImRvd25sb2FkZ3oiIHVubGVzcz0iZXhpc3QiIGRlcGVuZHM9InRlc3RleGlzdCI+CisgICAgPCEtLSBEb3dubG9hZCBhbmQgZXh0cmFjdCB0aGUgcGFja2FnZSAtLT4KKyAgICA8Z2V0IHNyYz0iJHtzb3VyY2VmaWxlfSIgZGVzdD0iJHtkb3dubG9hZC5wYXRofS9maWxlLnRhci5neiIgLz4KKyAgICA8Z3VuemlwIHNyYz0iJHtkb3dubG9hZC5wYXRofS9maWxlLnRhci5neiIgZGVzdD0iJHtkb3dubG9hZC5wYXRofS9maWxlLnRhciIvPgorICAgIDx1bnRhciBzcmM9IiR7ZG93bmxvYWQucGF0aH0vZmlsZS50YXIiIGRlc3Q9IiR7bGliLnBhdGh9Ii8+CisgICAgPGRlbGV0ZSBmaWxlPSIke2Rvd25sb2FkLnBhdGh9L2ZpbGUudGFyIi8+CisgICAgPGRlbGV0ZSBmaWxlPSIke2Rvd25sb2FkLnBhdGh9L2ZpbGUudGFyLmd6Ii8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0LnBhdGh9Ii8+ICAKKyAgICAgIDxkZWxldGUgZGlyPSIke3RlbXAucGF0aH0iLz4gIAorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0iZGVwZW5kZW5jaWVzIiBkZXBlbmRzPSJjbGVhbiI+CisgICAgPGFudGNhbGwgdGFyZ2V0PSJkb3dubG9hZHppcCI+ICAgICAgIAorICAgICAgPHBhcmFtIG5hbWU9InNvdXJjZWZpbGUiIHZhbHVlPSIke2p1bml0LmxvY30iLz4KKyAgICAgIDxwYXJhbSBuYW1lPSJkZXN0ZmlsZSIgdmFsdWU9IiR7anVuaXQuamFyfSIvPgorICAgIDwvYW50Y2FsbD4gIAorICAgIDxhbnRjYWxsIHRhcmdldD0iZG93bmxvYWRneiI+CisgICAgICA8cGFyYW0gbmFtZT0ic291cmNlZmlsZSIgdmFsdWU9IiR7Y29tbW9ucy1sb2dnaW5nLmxvY30iLz4KKyAgICAgIDxwYXJhbSBuYW1lPSJkZXN0ZmlsZSIgdmFsdWU9IiR7Y29tbW9ucy1sb2dnaW5nLmphcn0iLz4KKyAgICA8L2FudGNhbGw+IAorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0iY2xlYW4iPgorICAgICAgPG1rZGlyIGRpcj0iJHtkaXN0LnBhdGh9Ii8+CisgICAgICA8bWtkaXIgZGlyPSIke2NvbXBpbGUucGF0aH0iLz4KKyAgICAgIDxta2RpciBkaXI9IiR7ZG9jcy5wYXRofSIvPgorICAgICAgPG1rZGlyIGRpcj0iJHtqYXZhZG9jLnBhdGh9Ii8+CisgICAgICA8bWtkaXIgZGlyPSIke2Rvd25sb2FkLnBhdGh9Ii8+CisgICAgICA8bWtkaXIgZGlyPSIke2xpYi5wYXRofSIvPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCxkZXBlbmRlbmNpZXMiPgorICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgCisgICAgICAgICAgIGRlcHJlY2F0aW9uPSJ0cnVlIiAKKyAgICAgICAgICAgZGVzdGRpcj0iJHtjb21waWxlLnBhdGh9IiAKKyAgICAgICAgICAgbm93YXJuPSJ0cnVlIiAKKyAgICAgICAgICAgc291cmNlPSIxLjQiIAorICAgICAgICAgICB0YXJnZXQ9IjEuNCI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0cmliZXMuY2xhc3NwYXRoIi8+ICAgICAKKyAgICAgIDxzcmMgcmVmaWQ9ImphdmEuc291cmNlcGF0aCIgLz4KKyAgICA8L2phdmFjPgorICAgIDwhLS1pbmNsdWRlIGFsbCB0aGUgb3RoZXIgcmVzb3VyY2VzLCBpbmNsdWRpbmcgc291cmNlIGNvZGUtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtjb21waWxlLnBhdGh9Ij4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZSIvPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vdGVzdC9qYXZhIi8+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0iZG9jcyI+CisgICAgPHN0eWxlIGJhc2VkaXI9IiR7YmFzZWRpcn0vZG9jIgorICAgICAgICAgICBkZXN0ZGlyPSIke2RvY3MucGF0aH0iCisgICAgICAgICAgIGV4dGVuc2lvbj0iLmh0bWwiCisgICAgICAgICAgIHN0eWxlPSJ0b21jYXQtZG9jcy54c2wiCisgICAgICAgICAgIGV4Y2x1ZGVzPSJidWlsZC54bWwgcHJvamVjdC54bWwgKl90cmFuc2Zvcm0ueG1sIgorICAgICAgICAgICBpbmNsdWRlcz0iKi54bWwiPgorICAgICAgPHBhcmFtIG5hbWU9InJlbGF0aXZlLXBhdGgiIGV4cHJlc3Npb249Ii4iLz4KKyAgICA8L3N0eWxlPgorICAgIDxjb3B5IHRvZGlyPSIke2RvY3MucGF0aH0iPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vZG9jIi8+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0iamF2YWRvYyI+CisgICAgPGphdmFkb2MgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLioiCisgICAgICBzb3VyY2VwYXRocmVmPSJqYXZhLnNvdXJjZXBhdGgiCisgICAgICBkZXN0ZGlyPSIke2phdmFkb2MucGF0aH0iCisgICAgICBhdXRob3I9InRydWUiCisgICAgICB2ZXJzaW9uPSJ0cnVlIgorICAgICAgd2luZG93dGl0bGU9IlRyaWJlcyBBUEkgRG9jdW1lbnRhdGlvbiIKKyAgICAgIGRvY3RpdGxlPSJUcmliZXMgQVBJIgorICAgICAgYm90dG9tPSJDb3B5cmlnaHQgJiMxNjk7IDIwMDAtMjAwNiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIgorICAgICAgdmVyYm9zZT0iZmFsc2UiPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idHJpYmVzLmNsYXNzcGF0aCIvPgorICAgIDwvamF2YWRvYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJjb21waWxlLGRvY3MsamF2YWRvYyI+CisgICAgPGphciBkZXN0ZmlsZT0iJHtkaXN0LnBhdGh9L2FwYWNoZS10cmliZXMuamFyIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjb21waWxlLnBhdGh9Ii8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJWRVJTSU9OIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9qYXI+CisgICAgPG1rZGlyIGRpcj0iJHtkaXN0LnBhdGh9L2FyY2hpdmUiLz4KKyAgICA8Y29weWZpbGUgc3JjPSIke2Rpc3QucGF0aH0vYXBhY2hlLXRyaWJlcy5qYXIiIGRlc3Q9IiR7ZGlzdC5wYXRofS9hcmNoaXZlL3RyaWJlcy0ke3RyaWJlcy52ZXJzaW9ufS1zb3VyY2VzLmphciIvPgorICAgIDxkZWxldGUgZGlyPSIke2NvbXBpbGUucGF0aH0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KKyAgICA8L2RlbGV0ZT4KKyAgICA8amFyIGRlc3RmaWxlPSIke2Rpc3QucGF0aH0vYXBhY2hlLXRyaWJlcy1iaW4uamFyIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjb21waWxlLnBhdGh9Ii8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJWRVJTSU9OIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9qYXI+CisgICAgPGNvcHlmaWxlIHNyYz0iJHtkaXN0LnBhdGh9L2FwYWNoZS10cmliZXMtYmluLmphciIgZGVzdD0iJHtkaXN0LnBhdGh9L2FyY2hpdmUvdHJpYmVzLSR7dHJpYmVzLnZlcnNpb259LmphciIvPgorCisgICAgPGphciBkZXN0ZmlsZT0iJHtkaXN0LnBhdGh9L3RyaWJlcy1hbGwuemlwIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtkaXN0LnBhdGh9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iYXBhY2hlLXRyaWJlcy5qYXIiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iYXBhY2hlLXRyaWJlcy1iaW4uamFyIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImFyY2hpdmUvKi5qYXIiLz4KKyAgICAgICAgCisgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVtcC5wYXRofSI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImNsYXNzZXMvKioiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IlZFUlNJT04iLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2phcj4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9Im12biIgZGVwZW5kcz0iZGlzdCI+CisgICAgICA8bWtkaXIgZGlyPSIke2Rpc3QucGF0aH0vbXZuIi8+CisgICAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LnBhdGh9L212biI+CisgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Rpc3QucGF0aH0vYXJjaGl2ZSI+CisgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InRyaWJlcy0ke3RyaWJlcy52ZXJzaW9ufS1zb3VyY2VzLmphciIvPgorICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJ0cmliZXMtJHt0cmliZXMudmVyc2lvbn0uamFyIi8+CisgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgPC9jb3B5PgorICAgICAgPGNvcHkgdG9maWxlPSIke2Rpc3QucGF0aH0vbXZuL3RyaWJlcy0ke3RyaWJlcy52ZXJzaW9ufS5wb20iCisgICAgICAgICAgICBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkL212bi90cmliZXMucG9tIj4KKyAgICAgICAgICA8ZmlsdGVyc2V0PgorICAgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJ0cmliZXMudmVyc2lvbiIgdmFsdWU9IiR7dHJpYmVzLnZlcnNpb259Ii8+CisgICAgICAgICAgPC9maWx0ZXJzZXQ+CisgICAgICA8L2NvcHk+CisgICAgICA8ZXhlYyBkaXI9IiR7ZGlzdC5wYXRofS9tdm4iIAorICAgICAgICAgICAgZXhlY3V0YWJsZT0ib3BlbnNzbCIgCisgICAgICAgICAgICBpbnB1dD0iJHtkaXN0LnBhdGh9L212bi90cmliZXMtJHt0cmliZXMudmVyc2lvbn0uamFyIgorICAgICAgICAgICAgb3V0cHV0PSIke2Rpc3QucGF0aH0vbXZuL3RyaWJlcy0ke3RyaWJlcy52ZXJzaW9ufS5qYXIuc2hhMSI+CisgICAgICAgICAgPGFyZyBsaW5lPSJzaGExIi8+CisgICAgICA8L2V4ZWM+CisgICAgICA8ZXhlYyBkaXI9IiR7ZGlzdC5wYXRofS9tdm4iIAorICAgICAgICAgICAgZXhlY3V0YWJsZT0ib3BlbnNzbCIgCisgICAgICAgICAgICBpbnB1dD0iJHtkaXN0LnBhdGh9L212bi90cmliZXMtJHt0cmliZXMudmVyc2lvbn0tc291cmNlcy5qYXIiCisgICAgICAgICAgICBvdXRwdXQ9IiR7ZGlzdC5wYXRofS9tdm4vdHJpYmVzLSR7dHJpYmVzLnZlcnNpb259LXNvdXJjZXMuamFyLnNoYTEiPgorICAgICAgICAgIDxhcmcgbGluZT0ic2hhMSIvPgorICAgICAgPC9leGVjPgorICAgICAgPGV4ZWMgZGlyPSIke2Rpc3QucGF0aH0vbXZuIiAKKyAgICAgICAgICAgIGV4ZWN1dGFibGU9Im9wZW5zc2wiIAorICAgICAgICAgICAgaW5wdXQ9IiR7ZGlzdC5wYXRofS9tdm4vdHJpYmVzLSR7dHJpYmVzLnZlcnNpb259LnBvbSIKKyAgICAgICAgICAgIG91dHB1dD0iJHtkaXN0LnBhdGh9L212bi90cmliZXMtJHt0cmliZXMudmVyc2lvbn0ucG9tLnNoYTEiPgorICAgICAgICAgIDxhcmcgbGluZT0ic2hhMSIvPgorICAgICAgPC9leGVjPgorICA8L3RhcmdldD4KKyAgCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9idWlsZC9tdm4vdHJpYmVzLnBvbSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2J1aWxkL212bi90cmliZXMucG9tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOWFhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9idWlsZC9tdm4vdHJpYmVzLnBvbQpAQCAtMCwwICsxLDggQEAKKzxwcm9qZWN0PgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxncm91cElkPm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzPC9ncm91cElkPgorICA8YXJ0aWZhY3RJZD50cmliZXM8L2FydGlmYWN0SWQ+CisgIDxuYW1lPlRyaWJlcyA6OiBUcmliZXM8L25hbWU+CisgIDx2ZXJzaW9uPkB0cmliZXMudmVyc2lvbkA8L3ZlcnNpb24+CisgIDxkZXNjcmlwdGlvbj5GaWxpcCdzIFRyaWJlcyBKYXI8L2Rlc2NyaXB0aW9uPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vZG9jL2ZhcS54bWwgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9kb2MvZmFxLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDlkY2IyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vZG9jL2ZhcS54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImludHJvZHVjdGlvbi5odG1sIj4KKworICAgICZwcm9qZWN0OworCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxhdXRob3IgZW1haWw9ImZoYW5pa0BhcGFjaGUub3JnIj5GaWxpcCBIYW5pazwvYXV0aG9yPgorICAgICAgICA8dGl0bGU+QXBhY2hlIFRyaWJlcyAtIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIj4KKzwvc2VjdGlvbj4KKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2RvYy9pbnRyb2R1Y3Rpb24ueG1sIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vZG9jL2ludHJvZHVjdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2MjUzZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2RvYy9pbnRyb2R1Y3Rpb24ueG1sCkBAIC0wLDAgKzEsMzMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iaW50cm9kdWN0aW9uLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0iZmhhbmlrQGFwYWNoZS5vcmciPkZpbGlwIEhhbmlrPC9hdXRob3I+CisgICAgICAgIDx0aXRsZT5BcGFjaGUgVHJpYmVzIC0gSW50cm9kdWN0aW9uPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IlF1aWNrIFN0YXJ0Ij4KKworICA8cD5BcGFjaGUgVHJpYmVzIGlzIGEgZ3JvdXAgb3IgcGVlci10by1wZWVyIGNvbW11bmNhdGlvbiBmcmFtZXdvcmsgdGhhdCBlbmFibGVzIHlvdSB0byBlYXNpbHkgY29ubmVjdAorICAgICB5b3VyIHJlbW90ZSBvYmplY3RzIHRvIGNvbW11bmljYXRlIHdpdGggZWFjaCBvdGhlci4KKyAgPC9wPgorICA8dWw+CisgICAgPGxpPkltcG9ydDogPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDwvY29kZT48L2xpPgorICAgIDxsaT5JbXBvcnQ6IDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjwvY29kZT48L2xpPgorICAgIDxsaT5JbXBvcnQ6IDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcnNoaXBMaXN0ZW5lcjwvY29kZT48L2xpPgorICAgIDxsaT5JbXBvcnQ6IDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxMaXN0ZW5lcjwvY29kZT48L2xpPgorICAgIDxsaT5JbXBvcnQ6IDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkdyb3VwQ2hhbm5lbDwvY29kZT48L2xpPgorICAgIDxsaT5DcmVhdGUgYSBjbGFzcyB0aGF0IGltcGxlbWVudHM6IDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxMaXN0ZW5lcjwvY29kZT48L2xpPgorICAgIDxsaT5DcmVhdGUgYSBjbGFzcyB0aGF0IGltcGxlbWVudHM6IDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcnNoaXBMaXN0ZW5lcjwvY29kZT48L2xpPgorICAgIDxsaT5TaW1wbGUgY2xhc3MgdG8gZGVtb25zdHJhdGUgaG93IHRvIHNlbmQgYSBtZXNzYWdlOgorICAgICAgPHNvdXJjZT4KKyAgICAgICAgLy9jcmVhdGUgYSBjaGFubmVsCisgICAgICAgIENoYW5uZWwgbXlDaGFubmVsID0gbmV3IEdyb3VwQ2hhbm5lbCgpOworCisgICAgICAgIC8vY3JlYXRlIG15IGxpc3RlbmVycworICAgICAgICBDaGFubmVsTGlzdGVuZXIgbXNnTGlzdGVuZXIgPSBuZXcgTXlNZXNzYWdlTGlzdGVuZXIoKTsKKyAgICAgICAgTWVtYmVyc2hpcExpc3RlbmVyIG1ickxpc3RlbmVyID0gbmV3IE15TWVtYmVyTGlzdGVuZXIoKTsKKworICAgICAgICAvL2F0dGFjaCB0aGUgbGlzdGVuZXJzIHRvIHRoZSBjaGFubmVsCisgICAgICAgIG15Q2hhbm5lbC5hZGRNZW1iZXJzaGlwTGlzdGVuZXIobWJyTGlzdGVuZXIpOworICAgICAgICBteUNoYW5uZWwuYWRkQ2hhbm5lbExpc3RlbmVyKG1zZ0xpc3RlbmVyKTsKKworICAgICAgICAvL3N0YXJ0IHRoZSBjaGFubmVsCisgICAgICAgIG15Q2hhbm5lbC5zdGFydChDaGFubmVsLkRFRkFVTFQpOworCisgICAgICAgIC8vY3JlYXRlIGEgbWVzc2FnZSB0byBiZSBzZW50LCBtZXNzYWdlIG11c3QgaW1wbGVtZW50IGphdmEuaW8uU2VyaWFsaXphYmxlCisgICAgICAgIC8vZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgeW91IHByb2JhYmx5IHdhbnQgdGhlbSB0byBpbXBsZW1lbnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZQorICAgICAgICBTZXJpYWxpemFibGUgbXlNc2cgPSBuZXcgTXlNZXNzYWdlKCk7CisKKyAgICAgICAgLy9yZXRyaWV2ZSBteSBjdXJyZW50IG1lbWJlcnMKKyAgICAgICAgTWVtYmVyW10gZ3JvdXAgPSBteUNoYW5uZWwuZ2V0TWVtYmVycygpOworCisgICAgICAgIC8vc2VuZCB0aGUgbWVzc2FnZQorICAgICAgICBjaGFubmVsLnNlbmQoZ3JvdXAsbXlNc2csQ2hhbm5lbC5TRU5EX09QVElPTlNfREVGQVVMVCk7CisgICAgICA8L3NvdXJjZT4KKyAgICA8L2xpPgorICA8L3VsPgorICA8cD4KKyAgICAgIFNpbXBsZSB5ZWFoPyBUaGVyZSBpcyBhIGxvdCBtb3JlIHRvIFRyaWJlcyB0aGFuIHdlIGhhdmUgc2hvd24sIGhvcGVmdWxseSB0aGUgZG9jcyB3aWxsIGJlIGFibGUKKyAgICAgIHRvIGV4cGxhaW4gbW9yZSB0byB5b3UuIFJlbWVtYmVyLCB0aGF0IHdlIGFyZSBhbHdheXMgaW50ZXJlc3RlZCBpbiBzdWdnZXN0aW9ucywgaW1wcm92ZW1lbnRzLCBidWcgZml4ZXMKKyAgICAgIGFuZCBhbnl0aGluZyB0aGF0IHlvdSB0aGluayB3b3VsZCBoZWxwIHRoaXMgcHJvamVjdC4KKyAgPC9wPgorICA8cD4KKyAgICAgIE5vdGU6IFRyaWJlcyBpcyBjdXJyZW50bHkgYnVpbHQgZm9yIEpESzEuNSwgeW91IGNhbiBydW4gb24gSkRLMS40IGJ5IGEgc21hbGwgbW9kaWZpY2F0aW9ucyB0byBsb2NrcyB1c2VkIGZyb20gdGhlIDxjb2RlPmphdmEudXRpbC5jb25jdXJyZW50PC9jb2RlPiBwYWNrYWdlLgorICA8L3A+Cis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iV2hhdCBpcyBUcmliZXMiPgorICA8cD4KKyAgICBUcmliZXMgaXMgYSBtZXNzYWdpbmcgZnJhbWV3b3JrIHdpdGggZ3JvdXAgY29tbXVuaWNhdGlvbiBhYmlsaXRpZXMuIFRyaWJlcyBhbGxvd3MgeW91IHRvIHNlbmQgYW5kIHJlY2VpdmUKKyAgICBtZXNzYWdlcyBvdmVyIGEgbmV0d29yaywgaXQgYWxzbyBhbGxvd3MgZm9yIGR5bmFtaWMgZGlzY292ZXJ5IG9mIG90aGVyIG5vZGVzIGluIHRoZSBuZXR3b3JrLjxici8+CisgICAgQW5kIHRoYXQgaXMgdGhlIHNob3J0IHN0b3J5LCBpdCByZWFsbHkgaXMgYXMgc2ltcGxlIGFzIHRoYXQuIFdoYXQgbWFrZXMgVHJpYmVzIHVzZWZ1bCBhbmQgdW5pcXVlIHdpbGwgYmUKKyAgICBkZXNjcmliZWQgaW4gdGhlIHNlY3Rpb24gYmVsb3cuPGJyLz4KKyAgPC9wPgorICA8cD4KKyAgICBUaGUgVHJpYmVzIG1vZHVsZSB3YXMgc3RhcnRlZCBlYXJseSAyMDA2IGFuZCBhIHNtYWxsIHBhcnQgb2YgdGhlIGNvZGUgYmFzZSBjb21lcyBmcm9tIHRoZSBjbHVzdGVyaW5nIG1vZHVsZQorICAgIHRoYXQgaGFzIGJlZW4gZXhpc3Rpbmcgc2luY2UgMjAwMyBvciAyMDA0LgorICAgIFRoZSBjdXJyZW50IGNsdXN0ZXIgaW1wbGVtZW50YXRpb24gaGFzIHNldmVyYWwgc2hvcnQgY29taW5ncyBhbmQgbWFueSB3b3JrIGFyb3VuZHMgd2VyZSBjcmVhdGVkIGR1ZQorICAgIHRvIHRoZSBjb21wbGV4aXR5IGluIGdyb3VwIGNvbW11bmljYXRpb24uIExvbmcgc3Rvcnkgc2hvcnQsIHdoYXQgc2hvdWxkIGhhdmUgYmVlbiB0d28gbW9kdWxlcyBhIGxvbmcgdGltZQorICAgIGFnbywgd2lsbCBiZSBub3cuIFRyaWJlcyB0YWtlcyBvdXQgdGhlIGNvbXBsZXhpdHkgb2YgbWVzc2FnaW5nIGZyb20gdGhlIHJlcGxpY2F0aW9uIG1vZHVsZSBhbmQgYmVjb21lcworICAgIGEgZnVsbHkgaW5kZXBlbmRlbnQgYW5kIGhpZ2hseSBmbGV4aWJsZSBncm91cCBjb21tdW5pY2F0aW9uIG1vZHVsZS48YnIvPgorICA8L3A+CisgIDxwPgorICAgIEluIFRvbWNhdCB0aGUgb2xkIDxjb2RlPm1vZHVsZXMvY2x1c3RlcjwvY29kZT4gaGFzIG5vdyBiZWNvbWUgPGNvZGU+bW9kdWxlcy9ncm91cGNvbTwvY29kZT4oVHJpYmVzKSBhbmQKKyAgICA8Y29kZT5tb2R1bGVzL2hhPC9jb2RlPiAocmVwbGljYXRpb24pLiBUaGlzIHdpbGwgYWxsb3cgZGV2ZWxvcG1lbnQgdG8gcHJvY2VlZCBhbmQgbGV0IHRoZSBkZXZlbG9wZXJzCisgICAgZm9jdXMgb24gdGhlIGlzc3VlcyB0aGV5IGFyZSBhY3R1YWxseSB3b3JraW5nIG9uIHJhdGhlciB0aGFuIGdldHRpbmcgYm9nZ2xlZCBkb3duIGluIGRldGFpbHMgb2YgYSBtb2R1bGUKKyAgICB0aGV5IGFyZSBub3QgaW50ZXJlc3RlZCBpbi4gVGhlIHVuZGVyc3RhbmRpbmcgaXMgdGhhdCBib3RoIGNvbW11bmljYXRpb24gYW5kIHJlcGxpY2F0aW9uIGFyZSBjb21wbGV4IGVub3VnaCwKKyAgICBhbmQgd2hlbiB0cnlpbmcgdG8gZGV2ZWxvcCB0aGVtIGluIHRoZSBzYW1lIG1vZHVsZSwgd2VsbCB5b3Uga25vdywgaXQgYmVjb21lcyBhIGNsdXN0ZXIgOik8YnIvPgorICA8L3A+CisgIDxwPgorICAgIFRyaWJlcyBhbGxvd3MgZm9yIGd1YXJhbnRlZWQgbWVzc2FnaW5nLCBhbmQgY2FuIGJlIGN1c3RvbWl6ZWQgaW4gbWFueSB3YXlzLiBXaHkgaXMgdGhpcyBpbXBvcnRhbnQ/PGJyLz4KKyAgICBXZWxsLCB5b3UgYXMgYSBkZXZlbG9wZXIgd2FudCB0byBrbm93IHRoYXQgdGhlIG1lc3NhZ2VzIHlvdSBhcmUgc2VuZGluZyBhcmUgcmVhY2hpbmcgdGhlaXIgZGVzdGluYXRpb24uCisgICAgTW9yZSB0aGFuIHRoYXQsIGlmIGEgbWVzc2FnZSBkb2Vzbid0IHJlYWNoIGl0cyBkZXN0aW5hdGlvbiwgdGhlIGFwcGxpY2F0aW9uIG9uIHRvcCBvZiBUcmliZXMgd2lsbCBiZSBub3RpZmllZAorICAgIHRoYXQgdGhlIG1lc3NhZ2Ugd2FzIG5ldmVyIHNlbnQsIGFuZCB3aGF0IG5vZGUgaXQgZmFpbGVkLgorICA8L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iV2h5IGFub3RoZXIgbWVzc2FnaW5nIGZyYW1ld29yayI+CisgIDxwPgorICAgIEkgYW0gYSBiaWcgZmFuIG9mIHJldXNpbmcgY29kZSBhbmQgd291bGQgbmV2ZXIgZHJlYW0gb2YgZGV2ZWxvcGluZyBzb21ldGhpbmcgaWYgc29tZW9uZSBlbHNlIGhhcyBhbHJlYWR5CisgICAgZG9uZSBpdCBhbmQgaXQgd2FzIGF2YWlsYWJsZSB0byBtZSBhbmQgdGhlIGNvbW11bml0eSBJIHRyeSB0byBzZXJ2ZS48YnIvPgorICAgIFdoZW4gSSBkaWQgbXkgcmVzZWFyY2ggdG8gaW1wcm92ZSB0aGUgY2x1c3RlcmluZyBtb2R1bGUgSSB3YXMgY29uc3RhbnRseSBmYWNlZCB3aXRoIGEgZmV3IG9ic3RhY2xlczo8YnIvPgorICAgIDEuIFRoZSBmcmFtZXdvcmsgd2Fzbid0IGZsZXhpYmxlIGVub3VnaDxici8+CisgICAgMi4gVGhlIGZyYW1ld29yayB3YXMgbGljZW5zZWQgaW4gYSB3YXkgdGhhdCBuZWl0aGVyIEkgbm9yIHRoZSBjb21tdW5pdHkgY291bGQgdXNlIGl0PGJyLz4KKyAgICAzLiBTZXZlcmFsIGZlYXR1cmVzIHRoYXQgSSBuZWVkZWQgd2VyZSBtaXNzaW5nPGJyLz4KKyAgICA0LiBNZXNzYWdpbmcgd2FzIGd1YXJhbnRlZWQsIGJ1dCBubyBmZWVkYmFjayB3YXMgcmVwb3J0ZWQgdG8gbWU8YnIvPgorICAgIDUuIFRoZSBzZW1hbnRpY3Mgb2YgbXkgbWVzc2FnZSBkZWxpdmVyeSBoYWQgdG8gYmUgY29uZmlndXJlZCBiZWZvcmUgcnVudGltZTxici8+CisgICAgQW5kIHRoZSBsaXN0IGNvbnRpbnVlcy4uLgorICA8L3A+CisgIDxwPgorICAgIFNvIEkgY2FtZSB1cCB3aXRoIFRyaWJlcywgdG8gYWRkcmVzcyB0aGVzZSBpc3N1ZXMgYW5kIG90aGVyIGlzc3VlcyB0aGF0IGNhbWUgYWxvbmcuCisgICAgV2hlbiBkZXNpZ25pbmcgVHJpYmVzIEkgd2FudGVkIHRvIG1ha2Ugc3VyZSBJIGRpZG4ndCBsb3NlIGFueSBvZiB0aGUgZmxleGliaWxpdHkgYW5kCisgICAgZGVsaXZlcnkgc2VtYW50aWNzIHRoYXQgdGhlIGV4aXN0aW5nIGZyYW1ld29ya3MgYWxyZWFkeSBkZWxpdmVyZWQuIFRoZSBnb2FsIHdhcyB0byBjcmVhdGUgYSBmcmFtZXdvcmsKKyAgICB0aGF0IGNvdWxkIGRvIGV2ZXJ5dGhpbmcgdGhhdCB0aGUgb3RoZXJzIGFscmVhZHkgZGlkLCBidXQgdG8gcHJvdmlkZSBtb3JlIGZsZXhpYmlsaXR5IGZvciB0aGUgYXBwbGljYXRpb24KKyAgICBkZXZlbG9wZXIuIEluIHRoZSBuZXh0IHNlY3Rpb24gd2lsbCBnaXZlIHlvdSB0aGUgaGlnaCBsZXZlbCBvdmVydmlldyBvZiB3aGF0IGZlYXR1cmVzIHRyaWJlcyBvZmZlcnMgb3Igd2lsbCBvZmZlci4KKyAgPC9wPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJGZWF0dXJlIE92ZXJ2aWV3Ij4KKyAgPHA+CisgICAgVG8gZ2l2ZSB5b3UgYW4gaWRlYSBvZiB0aGUgZmVhdHVyZSBzZXQgSSB3aWxsIGxpc3QgaXQgb3V0IGhlcmUuCisgICAgU29tZSBvZiB0aGUgZmVhdHVyZXMgYXJlIG5vdCB5ZXQgY29tcGxldGVkLCBpZiB0aGF0IGlzIHRoZSBjYXNlIHRoZXkgYXJlIG1hcmtlZCBhY2NvcmRpbmdseS4KKyAgPC9wPgorICA8cD4KKyAgICA8Yj5QbHVnZ2FibGUgbW9kdWxlczwvYj48YnIvPgorICAgIFRyaWJlcyBpcyBidWlsdCB1c2luZyBpbnRlcmZhY2VzLiBBbnkgb2YgdGhlIG1vZHVsZXMgb3IgY29tcG9uZW50cyB0aGF0IGFyZSBwYXJ0IG9mIFRyaWJlcyBjYW4gYmUgc3dhcHBlZCBvdXQKKyAgICB0byBjdXN0b21pemUgeW91ciBvd24gVHJpYmVzIGltcGxlbWVudGF0aW9uLgorICA8L3A+CisgIDxwPgorICAgIDxiPkd1YXJhbnRlZWQgTWVzc2FnaW5nPC9iPjxici8+CisgICAgSW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgVHJpYmVzIHVzZXMgVENQIGZvciBtZXNzYWdpbmcuIFRDUCBhbHJlYWR5IGhhcyBndWFyYW50ZWVkIG1lc3NhZ2UgZGVsaXZlcnkKKyAgICBhbmQgZmxvdyBjb250cm9sIGJ1aWx0IGluLiBJIGJlbGlldmUgdGhhdCB0aGUgcGVyZm9ybWFuY2Ugb2YgSmF2YSBUQ1AsIHdpbGwgb3V0cGVyZm9ybSBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICAgIEphdmEvVURQL2Zsb3ctY29udHJvbC9tZXNzYWdlIGd1YXJhbnRlZSBzaW5jZSB0aGUgbG9naWMgaGFwcGVucyBmdXJ0aGVyIGRvd24gdGhlIHN0YWNrLjxici8+CisgICAgVHJpYmVzIHN1cHBvcnRzIGJvdGggbm9uLWJsb2NraW5nIGFuZCBibG9ja2luZyBJTyBvcGVyYXRpb25zLiBUaGUgcmVjb21tZW5kZWQgc2V0dGluZyBpcyB0byB1c2Ugbm9uIGJsb2NraW5nCisgICAgYXMgaXQgcHJvbW90ZXMgYmV0dGVyIHBhcmFsbGVsaXNtIHdoZW4gc2VuZGluZyBhbmQgcmVjZWl2aW5nIG1lc3NhZ2VzLiBUaGUgYmxvY2tpbmcgaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlCisgICAgZm9yIHRob3NlIHBsYXRmb3JtcyB3aGVyZSBOSU8gaXMgc3RpbGwgYSB0cm91YmxlIGNoaWxkLgorICA8L3A+CisgIDxwPgorICAgIDxiPkRpZmZlcmVudCBHdWFyYW50ZWUgTGV2ZWxzPC9iPjxici8+CisgICAgVGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCBsZXZlbHMgb2YgZGVsaXZlcnkgZ3VhcmFudGVlIHdoZW4gYSBtZXNzYWdlIGlzIHNlbnQuPGJyLz4KKyAgICA8b2w+CisgICAgICA8bGk+SU8gQmFzZWQgc2VuZCBndWFyYW50ZWUuIC0gZmFzdGVzdCwgbGVhc3QgcmVsaWFibGU8YnIvPgorICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCBUcmliZXMgY29uc2lkZXJzIHRoZSBtZXNzYWdlIHRyYW5zZmVyIHRvIGJlIHN1Y2Nlc3NmdWwKKyAgICAgICAgICBpZiB0aGUgbWVzc2FnZSB3YXMgc2VudCB0byB0aGUgc29ja2V0IHNlbmQgYnVmZmVyIGFuZCBhY2NlcHRlZC48YnIvPgorICAgICAgICAgIE9uIGJsb2NraW5nIElPLCB0aGlzIHdvdWxkIGJlIDxjb2RlPnNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZShtc2cpPC9jb2RlPjxici8+CisgICAgICAgICAgT24gbm9uIGJsb2NraW5nIElPLCB0aGlzIHdvdWxkIGJlIDxjb2RlPnNvY2tldENoYW5uZWwud3JpdGUoKTwvY29kZT4sIGFuZCB0aGUgYnVmZmVyIGJ5dGUgYnVmZmVyIGdldHMgZW1wdGllZAorICAgICAgICAgIGZvbGxvd2VkIGJ5IGEgPGNvZGU+c29ja2V0Q2hhbm5lbC5yZWFkKCk8L2NvZGU+IHRvIGVuc3VyZSB0aGUgY2hhbm5lbCBzdGlsbCBvcGVuLgorICAgICAgICAgIFRoZSA8Y29kZT5yZWFkKCk8L2NvZGU+IGhhcyBiZWVuIGFkZGVkIHNpbmNlIDxjb2RlPndyaXRlKCk8L2NvZGU+IHdpbGwgc3VjY2VlZCBpZiB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiAmcXVvdDtjbG9zZWQmcXVvdDsKKyAgICAgICAgICB3aGVuIHVzaW5nIE5JTy4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+QUNLIGJhc2VkLiAtIHJlY29tbWVuZGVkLCBndWFyYW50ZWVkIGRlbGl2ZXJ5PGJyLz4KKyAgICAgICAgICBXaGVuIHRoZSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkIG9uIGEgcmVtb3RlIG5vZGUsIGFuIEFDSyBpcyBzZW50IGJhY2sgdG8gdGhlIHNlbmRlciwKKyAgICAgICAgICBpbmRpY2F0aW5nIHRoYXQgdGhlIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+U1lOQ19BQ0sgYmFzZWQuIC0gZ3VhcmFudGVlZCBkZWxpdmVyeSwgZ3VhcmFudGVlZCBwcm9jZXNzZWQsIHNsb3dlc3Q8YnIvPgorICAgICAgICAgIFdoZW4gdGhlIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQgb24gYSByZW1vdGUgbm9kZSwgdGhlIG5vZGUgd2lsbCBwcm9jZXNzCisgICAgICAgICAgdGhlIG1lc3NhZ2UgYW5kIGlmIHRoZSBtZXNzYWdlIHdhcyBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5LCBhbiBBQ0sgaXMgc2VudCBiYWNrIHRvIHRoZSBzZW5kZXIKKyAgICAgICAgICBpbmRpY2F0aW5nIHRoYXQgdGhlIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAgICAgIElmIHRoZSBtZXNzYWdlIHdhcyByZWNlaXZlZCwgYnV0IHByb2Nlc3NpbmcgaXQgZmFpbGVkLCBhbiBBQ0tfRkFJTCB3aWxsIGJlIHNlbnQgYmFjaworICAgICAgICAgIHRvIHRoZSBzZW5kZXIuIFRoaXMgaXMgYSB1bmlxdWUgZmVhdHVyZSB0aGF0IGFkZHMgYW4gaW5jcmVkaWJsZSBhbW91bnQgdmFsdWUgdG8gdGhlIGFwcGxpY2F0aW9uCisgICAgICAgICAgZGV2ZWxvcGVyLiBNb3N0IGZyYW1ld29ya3MgaGVyZSB3aWxsIHRlbGwgeW91IHRoYXQgdGhlIG1lc3NhZ2Ugd2FzIGRlbGl2ZXJlZCwgYW5kIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgIGRldmVsb3BlciBoYXMgdG8gYnVpbGQgaW4gbG9naWMgb24gd2hldGhlciB0aGUgbWVzc2FnZSB3YXMgYWN0dWFsbHkgcHJvY2Vzc2VkIHByb3Blcmx5IGJ5IHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgIG9uIHRoZSByZW1vdGUgbm9kZS4gSWYgY29uZmlndXJlZCwgVHJpYmVzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gaXQgcmVjZWl2ZXMgYW4gQUNLX0ZBSUwKKyAgICAgICAgICBhbmQgYXNzb2NpYXRlIHRoYXQgZXhjZXB0aW9uIHdpdGggdGhlIG1lbWJlciB0aGF0IGRpZG4ndCBwcm9jZXNzIHRoZSBtZXNzYWdlLgorICAgICAgPC9saT4KKyAgICA8L29sPgorICAgIFlvdSBjYW4gb2YgY291cnNlIHdyaXRlIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGd1YXJhbnRlZSBsZXZlbHMsIGFuZCBzb21lIG9mIHRoZW0gd2lsbCBiZSBtZW50aW9uZWQgbGF0ZXIgb24KKyAgICBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gT25lIG1lbnRpb25hYmxlIGxldmVsIHdvdWxkIGJlIGEgMi1QaGFzZS1Db21taXQsIHdoZXJlIHRoZSByZW1vdGUgYXBwbGljYXRpb25zIGRvbid0IHJlY2VpdmUKKyAgICB0aGUgbWVzc2FnZSB1bnRpbCBhbGwgbm9kZXMgaGF2ZSByZWNlaXZlZCB0aGUgbWVzc2FnZS4gU29ydCBvZiBsaWtlIGEgYWxsLW9yLW5vdGhpbmcgcHJvdG9jb2wuCisgIDwvcD4KKyAgPHA+CisgICAgPGI+UGVyIE1lc3NhZ2UgRGVsaXZlcnkgQXR0cmlidXRlczwvYj48YnIvPgorICAgIFBlcmhhcHMgdGhlIGZlYXR1cmUgdGhhdCBtYWtlcyBUcmliZXMgc3RhbmQgb3V0IGZyb20gdGhlIGNyb3dkIG9mIGdyb3VwIGNvbW11bmljYXRpb24gZnJhbWV3b3Jrcy4KKyAgICBUcmliZXMgZW5hYmxlcyB5b3UgdG8gc2VuZCB0byBkZWNpZGUgd2hhdCBkZWxpdmVyeSBzZW1hbnRpY3MgYSBtZXNzYWdlIHRyYW5zZmVyIHNob3VsZCBoYXZlIG9uIGEgcGVyCisgICAgbWVzc2FnZSBiYXNpcy4gTWVhbmluZywgdGhhdCB5b3VyIG1lc3NhZ2VzIGFyZSBub3QgZGVsaXZlcmVkIGJhc2VkIG9uIHNvbWUgc3RhdGljIGNvbmZpZ3VyYXRpb24KKyAgICB0aGF0IHJlbWFpbnMgZml4ZWQgYWZ0ZXIgdGhlIG1lc3NhZ2UgZnJhbWV3b3JrIGhhcyBiZWVuIHN0YXJ0ZWQuPGJyLz4KKyAgICBUbyBnaXZlIHlvdSBhbiBleGFtcGxlIG9mIGhvdyBwb3dlcmZ1bCB0aGlzIGZlYXR1cmUgaXMsIEknbGwgdHJ5IHRvIGlsbHVzdHJhdGUgaXQgd2l0aCBhIHNpbXBsZSBleGFtcGxlLgorICAgIEltYWdpbmUgeW91IG5lZWQgdG8gc2VuZCAxMCBkaWZmZXJlbnQgbWVzc3NhZ2VzLCB5b3UgY291bGQgc2VuZCB0aGUgdGhlIGZvbGxvd2luZyB3YXk6CisgICAgPHNvdXJjZT4KKyAgICAgIE1lc3NhZ2VfMSAtIGFzeW5jaHJvbm91cyBhbmQgZmFzdCwgbm8gZ3VhcmFudGVlIHJlcXVpcmVkLCBmaXJlIGFuZCBmb3JnZXQKKyAgICAgIE1lc3NhZ2VfMiAtIGFsbC1vci1ub3RoaW5nLCBlaXRoZXIgYWxsIHJlY2VpdmVycyBnZXQgaXQsIG9yIG5vbmUuCisgICAgICBNZXNzYWdlXzMgLSBlbmNyeXB0ZWQgYW5kIFNZTkNfQUNLIGJhc2VkCisgICAgICBNZXNzYWdlXzQgLSBhc3luY2hyb25vdXMsIFNZTkNfQUNLIGFuZCBjYWxsIGJhY2sgd2hlbiB0aGUgbWVzc2FnZSBpcyBwcm9jZXNzZWQgb24gdGhlIHJlbW90ZSBub2RlcworICAgICAgTWVzc2FnZV81IC0gdG90YWxseSBvcmRlcmVkLCB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHJlY2VpdmVkIGluIHRoZSBzYW1lIG9yZGVyIG9uIGFsbCBub2RlcyB0aGF0IGhhdmUgYmVlbgorICAgICAgICAgICAgICAgICAgc2VuZCB0b3RhbGx5IG9yZGVyZWQKKyAgICAgIE1lc3NhZ2VfNiAtIGFzeW5jaHJvbm91cyBhbmQgdG90YWxseSBvcmRlcmVkCisgICAgICBNZXNzYWdlXzcgLSBSUEMgbWVzc2FnZSwgc2VuZCBhIG1lc3NhZ2UsIHdhaXQgZm9yIGFsbCByZW1vdGUgbm9kZXMgdG8gcmVwbHkgYmVmb3JlIHJldHVybmluZworICAgICAgTWVzc2FnZV84IC0gUlBDIG1lc3NhZ2UsIHdhaXQgZm9yIHRoZSBmaXJzdCByZXBseQorICAgICAgTWVzc2FnZV85IC0gUlBDIG1lc3NhZ2UsIGFzeW5jaHJvbm91cywgZG9uJ3Qgd2FpdCBmb3IgYSByZXBseSwgY29sbGVjdCB0aGVtIHZpYSBhIGNhbGxiYWNrCisgICAgICBNZXNzYWdlXzEwLSBzZW50IHRvIGEgbWVtYmVyIHRoYXQgaXMgbm90IHBhcnQgb2YgdGhpcyBncm91cAorICAgIDwvc291cmNlPgorICAgIEFzIHlvdSBjYW4gaW1hZ2luZSBieSBub3csIHRoZXNlIGFyZSBqdXN0IGV4YW1wbGVzLiBUaGUgbnVtYmVyIG9mIGRpZmZlcmVudCBzZW1hbnRpY3MgeW91IGNhbiBhcHBseSBvbiBhCisgICAgcGVyLW1lc3NhZ2UtYmFzaXMgaXMgYWxtb3N0IGxpbWl0bGVzcy4gVHJpYmVzIGFsbG93cyB5b3UgdG8gc2V0IHVwIHRvIDI4IGRpZmZlcmVudCBvbiBhIG1lc3NhZ2UKKyAgICBhbmQgdGhlbiBjb25maWd1cmUgVHJpYmVzIHRvIHdoYXQgZmxhZyByZXN1bHRzIGluIHdoYXQgYWN0aW9uIG9uIHRoZSBtZXNzYWdlLjxici8+CisgICAgSW1hZ2luZSBhIHNoYXJlZCB0cmFuc2FjdGlvbmFsIGNhY2hlLCBwcm9iYWJseSAmZ3Q7OTAlIGFyZSByZWFkcywgYW5kIHRoZSBkaXJ0eSByZWFkcyBzaG91bGQgYmUgY29tcGxldGVseQorICAgIHVub3JkZXJlZCBhbmQgZGVsaXZlcmVkIGFzIGZhc3QgYXMgcG9zc2libGUuIEJ1dCB0cmFuc2FjdGlvbmFsIHdyaXRlcyBvbiB0aGUgb3RoZXIgaGFuZCwgaGF2ZSB0bworICAgIGJlIG9yZGVyZWQgc28gdGhhdCBubyBjYWNoZSBnZXRzIGNvcnJ1cHRlZC4gV2l0aCB0cmliZXMgeW91IHdvdWxkIHNlbmQgdGhlIHdyaXRlIG1lc3NhZ2VzIHRvdGFsbHkgb3JkZXJlZCwKKyAgICB3aGlsZSB0aGUgcmVhZCBtZXNzYWdlcyB5b3Ugc2ltcGxlIGZpcmUgdG8gYWNoaWV2ZSBoaWdoZXN0IHRocm91Z2hwdXQuPGJyLz4KKyAgICBUaGVyZSBhcmUgcHJvYmFibHkgYmV0dGVyIGV4YW1wbGVzIG9uIGhvdyB0aGlzIHBvd2VyZnVsIGZlYXR1cmUgY2FuIGJlIHVzZWQsIHNvIHVzZSB5b3VyIGltYWdpbmF0aW9uIGFuZAorICAgIHlvdXIgZXhwZXJpZW5jZSB0byB0aGluayBvZiBob3cgdGhpcyBjb3VsZCBiZW5lZml0IHlvdSBpbiB5b3VyIGFwcGxpY2F0aW9uLgorICA8L3A+CisgIDxwPgorICAgIDxiPkludGVyY2VwdG9yIGJhc2VkIG1lc3NhZ2UgcHJvY2Vzc2luZzwvYj48YnIvPgorICAgIFRyaWJlcyB1c2VzIGEgY3VzdG9taXphYmxlIGludGVyY2VwdG9yIHN0YWNrIHRvIHByb2Nlc3MgbWVzc2FnZXMgdGhhdCBhcmUgc2VudCBhbmQgcmVjZWl2ZWQuPGJyLz4KKyAgICA8aT5TbyB3aGF0LCBhbGwgZnJhbWV3b3JrcyBoYXZlIHRoaXMhPC9pPjxici8+CisgICAgWWVzLCBidXQgaW4gVHJpYmVzIGludGVyY2VwdG9ycyBjYW4gcmVhY3QgdG8gYSBtZXNzYWdlIGJhc2VkIG9uIHRoZSBwZXItbWVzc2FnZS1hdHRyaWJ1dGVzCisgICAgdGhhdCBhcmUgc2VudCBydW50aW1lLiBNZWFuaW5nLCB0aGF0IGlmIHlvdSBhZGQgYSBlbmNyeXB0aW9uIGludGVyY2VwdG9yIHRoYXQgZW5jcnlwdHMgbWVzc2FnZQorICAgIHlvdSBjYW4gZGVjaWRlIGlmIHRoaXMgaW50ZXJjZXB0b3Igd2lsbCBlbmNyeXB0IGFsbCBtZXNzYWdlcywgb3Igb25seSBjZXJ0YWluIG1lc3NhZ2VzIHRoYXQgYXJlIGRlY2lkZWQKKyAgICBieSB0aGUgYXBwbGljYXRpb25zIHJ1bm5pbmcgb24gdG9wIG9mIFRyaWJlcy48YnIvPgorICAgIFRoaXMgaXMgaG93IFRyaWJlcyBpcyBhYmxlIHRvIHNlbmQgc29tZSBtZXNzYWdlcyB0b3RhbGx5IG9yZGVyZWQgYW5kIG90aGVycyBmaXJlIGFuZCBmb3JnZXQgc3R5bGUKKyAgICBsaWtlIHRoZSBleGFtcGxlIGFib3ZlLjxici8+CisgICAgVGhlIG51bWJlciBvZiBpbnRlcmNlcHRvcnMgdGhhdCBhcmUgYXZhaWxhYmxlIHdpbGwga2VlcCBncm93aW5nLCBhbmQgd2Ugd291bGQgYXBwcmVjaWF0ZSBhbnkgY29udHJpYnV0aW9ucworICAgIHRoYXQgeW91IG1pZ2h0IGhhdmUuCisgIDwvcD4KKyAgPHA+CisgICAgPGI+VGhyZWFkbGVzcyBJbnRlcmNlcHRvciBzdGFjazwvYj4KKyAgICBUaGUgaW50ZXJjZXB0b3IgZG9uJ3QgcmVxdWlyZSBhbnkgc2VwYXJhdGUgdGhyZWFkcyB0byBwZXJmb3JtIHRoZWlyIG1lc3NhZ2UgbWFuaXB1bGF0aW9uLjxici8+CisgICAgTWVzc2FnZXMgdGhhdCBhcmUgc2VudCB3aWxsIHBpZ2d5IGJhY2sgb24gdGhlIHRocmVhZCB0aGF0IGlzIHNlbmRpbmcgdGhlbSBhbGwgdGhlIHdheSB0aHJvdWdoIHRyYW5zbWlzc2lvbi4KKyAgICBUaGUgZXhjZXB0aW9uIGlzIHRoZSA8Y29kZT5NZXNzYWdlRGlzcGF0Y2hJbnRlcmNlcHRvcjwvY29kZT4gdGhhdCB3aWxsIHF1ZXVlIHVwIHRoZSBtZXNzYWdlCisgICAgYW5kIHNlbmQgaXQgb24gYSBzZXBhcmF0ZSB0aHJlYWQgZm9yIGFzeW5jaHJvbm91cyBtZXNzYWdlIGRlbGl2ZXJ5LgorICAgIE1lc3NhZ2VzIHJlY2VpdmVkIGFyZSBjb250cm9sbGVkIGJ5IGEgdGhyZWFkIHBvb2wgaW4gdGhlIDxjb2RlPnJlY2VpdmVyPC9jb2RlPiBjb21wb25lbnQuPGJyLz4KKyAgICBUaGUgY2hhbm5lbCBvYmplY3QgY2FuIHNlbmQgYSA8Y29kZT5oZWFydGJlYXQoKTwvY29kZT4gdGhyb3VnaCB0aGUgaW50ZXJjZXB0b3Igc3RhY2sgdG8gYWxsb3cKKyAgICBmb3IgdGltZW91dHMsIGNsZWFudXAgYW5kIG90aGVyIGV2ZW50cy48YnIvPgorICAgIFRoZSA8Y29kZT5NZXNzYWdlRGlzcGF0Y2hJbnRlcmNlcHRvcjwvY29kZT4gaXMgdGhlIG9ubHkgaW50ZXJjZXB0b3IgdGhhdCBpcyBjb25maWd1cmVkIGJ5IGRlZmF1bHQuCisgIDwvcD4KKyAgPHA+CisgICAgPGI+UGFyYWxsZWwgRGVsaXZlcnk8L2I+PGJyLz4KKyAgICBUcmliZXMgc3VwcG9ydCBwYXJhbGxlbCBkZWxpdmVyeSBvZiBtZXNzYWdlcy4gTWVhbmluZyB0aGF0IG5vZGVfQSBjb3VsZCBzZW5kIHRocmVlIG1lc3NhZ2VzIHRvIG5vZGVfQiBpbgorICAgIHBhcmFsbGVsLiBUaGlzIGZlYXR1cmUgYmVjb21lcyB1c2VmdWwgd2hlbiBzZW5kaW5nIG1lc3NhZ2VzIHdpdGggZGlmZmVyZW50IGRlbGl2ZXJ5IHNlbWFudGljcy4KKyAgICBPdGhlcndpc2UgaWYgTWVzc2FnZV8xIHdhcyBzZW50IHRvdGFsbHkgb3JkZXJlZCwgTWVzc2FnZV8yIHdvdWxkIGhhdmUgdG8gd2FpdCBmb3IgdGhhdCBtZXNzYWdlIHRvIGNvbXBsZXRlLjxici8+CisgICAgVGhyb3VnaCBOSU8sIFRyaWJlcyBpcyBhbHNvIGFibGUgdG8gc2VuZCBhIG1lc3NhZ2UgdG8gc2V2ZXJhbCByZWNlaXZlcnMgYXQgdGhlIHNhbWUgdGltZSBvbiB0aGUgc2FtZSB0aHJlYWQuCisgIDwvcD4KKyAgPHA+CisgICAgPGI+U2lsZW50IE1lbWJlciBNZXNzYWdpbmc8L2I+PGJyLz4KKyAgICBXaXRoIFRyaWJlcyB5b3UgYXJlIGFibGUgdG8gc2VuZCBtZXNzYWdlcyB0byBtZW1iZXJzIHRoYXQgYXJlIG5vdCBpbiB5b3VyIGdyb3VwLgorICAgIFNvIGJ5IGRlZmF1bHQsIHlvdSBjYW4gYWxyZWFkeSBzZW5kIG1lc3NhZ2VzIG92ZXIgYSB3aWRlIGFyZWEgbmV0d29yaywgZXZlbiB0aG91Z2ggdGhlIGR5bmFtaWMgZGlzY292ZXIKKyAgICBtb2R1bGUgdG9kYXkgaXMgbGltaXRlZCB0byBsb2NhbCBhcmVhIG5ldHdvcmtzIGJ5IHVzaW5nIG11bHRpY2FzdCBmb3IgZHluYW1pYyBub2RlIGRpc2NvdmVyeS4KKyAgICBPZiBjb3Vyc2UsIHRoZSBtZW1iZXJzaGlwIGNvbXBvbmVudCB3aWxsIGJlIGV4cGFuZGVkIHRvIHN1cHBvcnQgV0FOIG1lbWJlcnNoaXBzIGluIHRoZSBmdXR1cmUuCisgICAgQnV0IHRoaXMgaXMgdmVyeSB1c2VmdWwsIHdoZW4geW91IHdhbnQgdG8gaGlkZSBtZW1iZXJzIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGdyb3VwIGFuZCBvbmx5IGNvbW11bmljYXRlIHdpdGggdGhlbQorICA8L3A+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IldoZXJlIGNhbiBJIGdldCBUcmliZXMiPgorICA8cD4KKyAgICBJIGhvcGUgeW91IGhhdmUgZW5qb3llZCB0aGlzIHNob3J0IGludHJvZHVjdGlvbiB0byBUcmliZXMuIFlvdSBjYW4gZG93bmxvYWQgPGEgaHJlZj0iLi4vYXBhY2hlLXRyaWJlcy5qYXIiPlRyaWJlcyBoZXJlPC9hPgorICAgIG9yIHlvdSBjYW4gZG93bmxvYWQgVHJpYmVzIDxhIGhyZWY9Ii4uL3RyaWJlcy1hbGwuemlwIj5pbmNsdWRpbmcgamF2YWRvYyBhbmQgdGhpcyBkb2M8L2E+CisgIDwvcD4KKworCis8L3NlY3Rpb24+CisKKzwhLS0KKzxzZWN0aW9uIG5hbWU9IkNsdXN0ZXIgQ29uZmlndXJhdGlvbiBmb3IgUmVwbGljYXRpb25UcmFuc21pdHRlciI+Cis8cD4KK0xpc3Qgb2YgQXR0cmlidXRlczxici8+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSI+CisKKyAgPHRyPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkRlZmF1bHQgdmFsdWU8L3RoPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+cmVwbGljYXRpb25Nb2RlPC90ZD4KKyAgICA8dGQ+cmVwbGljYXRpb24gbW9kZSAoPGVtPnN5bmNocm9ub3VzPC9lbT4sIDxlbT5wb29sZWQ8L2VtPiwgPGVtPmFzeW5jaHJvbm91czwvZW0+IG9yIDxlbT5mYXN0YXN5bmNxdWV1ZTwvZW0+KQorICAgIDwvdGQ+CisgICAgPHRkPjxjb2RlPnBvb2xlZDwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+cHJvY2Vzc1NlbmRlckZyZXF1ZW5jeTwvdGQ+CisgICAgPHRkPkNvbnRyb2wgdGhlIHNlbmRlciBrZWVwYWxpdmUgc3RhdHVzIGFuZCBkcm9wIHNlbmRlciBzb2NrZXQgY29ubmVjdGlvbiBhZnRlciB0aW1lb3V0IGlzIHJlYWNoZWQuCisgICAgQ2hlY2sgZXZlcnkgcHJvY2Vzc1NlbmRlckZyZXF1ZW5jeSB2YWx1ZSBlbmdpbmUgYmFja2dyb3VuZCB0aWNrcy4KKyAgICA8L3RkPgorICAgIDx0ZD48Y29kZT4yPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5jb21wcmVzczwvdGQ+CisgICAgPHRkPmNvbXByZXNzIGJ5dGVzIGJlZm9yZSBzZW5kaW5nIChjb25zdW1lIG1lbW9yeSwgYnV0IHJlZHVjZSBuZXR3b3JrIHRyYWZmaWMgLSBHWklQKTwvdGQ+CisgICAgPHRkPjxjb2RlPmZhbHNlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5hY2tUaW1lb3V0PC90ZD4KKyAgICA8dGQ+YWNrbm93bGVkZ2UgdGltZW91dCBhbmQgb25seSB1c2VmdWxsIGl0IHdhaXRGb3JBY2sgaXMgdHJ1ZTwvdGQ+CisgICAgPHRkPjxjb2RlPjE1MDAwPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD53YWl0Rm9yQWNrPC90ZD4KKyAgICA8dGQ+V2FpdCBmb3IgYWNrIGFmdGVyIGRhdGEgc2VuZDwvdGQ+CisgICAgPHRkPjxjb2RlPmZhbHNlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5hdXRvQ29ubmVjdDwvdGQ+CisgICAgPHRkPmlzIHNlbmRlciBkaXNhYmxlZCwgZm9yayBhIG5ldyBzb2NrZXQ8L3RkPgorICAgIDx0ZD48Y29kZT5mYWxzZTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+ZG9UcmFuc21pdHRlclByb2Nlc3NpbmdTdGF0czwvdGQ+CisgICAgPHRkPmNyZWF0ZSBwcm9jZXNzaW5nIHRpbWUgc3RhdHM8L3RkPgorICAgIDx0ZD48Y29kZT5mYWxzZTwvY29kZT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzwvcD4KKzxwPgorRXhhbXBsZSB0byBnZXQgc3RhdGlzdGljIGluZm9ybWF0aW9uLCB3YWl0IGZvciBhY2sgYXQgZXZlcnkgbWVzc2FnZSBzZW5kIGFuZCB0cmFuc2ZlciBhdCBjb21wcmVzc2VkIG1vZGU8YnIvPgorPHNvdXJjZT4KKyAgICAmbHQ7U2VuZGVyCisgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25UcmFuc21pdHRlciIKKyAgICAgIHJlcGxpY2F0aW9uTW9kZT0iZmFzdGFzeW5jcXVldWUiCisgICAgICBjb21wcmVzcz0idHJ1ZSIKKyAgICAgIGRvVHJhbnNtaXR0ZXJQcm9jZXNzaW5nU3RhdHM9InRydWUiCisgICAgICBhY2tUaW1lb3V0PSIxNTAwMCIKKyAgICAgIHdhaXRGb3JBY2s9InRydWUiCisgICAgICBhdXRvQ29ubmVjdD0iZmFsc2UiLyZndDsKKzwvc291cmNlPgorPC9wPgorPC9zZWN0aW9uPgorCistLT4KKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2RvYy9sZWFkZXItZWxlY3Rpb24taW5pdGlhdGUtZWxlY3Rpb24uZGlhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vZG9jL2xlYWRlci1lbGVjdGlvbi1pbml0aWF0ZS1lbGVjdGlvbi5kaWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0Yzg0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2RvYy9sZWFkZXItZWxlY3Rpb24taW5pdGlhdGUtZWxlY3Rpb24uZGlhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2RvYy9sZWFkZXItZWxlY3Rpb24taW5pdGlhdGUtZWxlY3Rpb24uanBnIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vZG9jL2xlYWRlci1lbGVjdGlvbi1pbml0aWF0ZS1lbGVjdGlvbi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4YzExYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2RvYy9sZWFkZXItZWxlY3Rpb24taW5pdGlhdGUtZWxlY3Rpb24uanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2RvYy9sZWFkZXItZWxlY3Rpb24tbWVzc2FnZS1hcnJpdmVzLmRpYSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2RvYy9sZWFkZXItZWxlY3Rpb24tbWVzc2FnZS1hcnJpdmVzLmRpYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWZhNTMwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vZG9jL2xlYWRlci1lbGVjdGlvbi1tZXNzYWdlLWFycml2ZXMuZGlhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2RvYy9sZWFkZXItZWxlY3Rpb24tbWVzc2FnZS1hcnJpdmVzLmpwZyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2RvYy9sZWFkZXItZWxlY3Rpb24tbWVzc2FnZS1hcnJpdmVzLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzMzZDJkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vZG9jL2xlYWRlci1lbGVjdGlvbi1tZXNzYWdlLWFycml2ZXMuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2RvYy9wcm9qZWN0LnhtbCBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2RvYy9wcm9qZWN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTUxZGNmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vZG9jL3Byb2plY3QueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzxwcm9qZWN0IG5hbWU9IkFwYWNoZSBUcmliZXMgRG9jdW1lbnRhdGlvbiAtIFRvcCBMZXZlbCBEaXJlY3RvcnkiCisgICAgICAgIGhyZWY9Imh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy8iPgorCisgICAgPHRpdGxlPkFwYWNoZSBUcmliZXMgLSBUaGUgVG9tY2F0IENsdXN0ZXIgQ29tbXVuaWNhdGlvbiBNb2R1bGU8L3RpdGxlPgorCisgICAgPGxvZ28gaHJlZj0iaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnL3RvbWNhdC01LjUtZG9jL2ltYWdlcy90b21jYXQuZ2lmIj5BcGFjaGUgVG9tY2F0PC9sb2dvPgorCisKKyAgICA8Ym9keT4KKworICAgIDxtZW51IG5hbWU9IkxpbmtzIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iRG9jcyBIb21lIiAgICAgICAgICAgICBocmVmPSJpbmRleC5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IkZBUSIgICAgICAgICAgICAgICAgICAgaHJlZj0iLi4vZmFxIiAvPgorICAgIDwvbWVudT4KKworICAgIDxtZW51IG5hbWU9IlVzZXIgR3VpZGUiPgorICAgICAgICA8aXRlbSBuYW1lPSIxKSBJbnRyb2R1Y3Rpb24iICAgICAgICBocmVmPSJpbnRyb2R1Y3Rpb24uaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSIyKSBTZXR1cCIgICAgICAgICAgICAgICBocmVmPSJzZXR1cC5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjMpIEZBUSIgICAgICAgICAgICAgICAgIGhyZWY9ImZhcS5odG1sIi8+CisgICAgPC9tZW51PgorCisgICAgPG1lbnUgbmFtZT0iUmVmZXJlbmNlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iUmVsZWFzZSBOb3RlcyIgICAgICAgICBocmVmPSJSRUxFQVNFLU5PVEVTLnR4dCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJKYXZhRG9jIiAgICAgICAgICAgICAgIGhyZWY9Ii4uL2phdmFkb2MvaW5kZXguaHRtbCIvPgorICAgIDwvbWVudT4KKworICAgIDxtZW51IG5hbWU9IkFwYWNoZSBUcmliZXMgRGV2ZWxvcG1lbnQiPgorICAgICAgICA8aXRlbSBuYW1lPSJNZW1iZXJzaGlwIiAgICAgICAgICAgICAgaHJlZj0ibWVtYmVyc2hpcC5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IlRyYW5zcG9ydCIgICAgICAgICAgICAgaHJlZj0idHJhbnNwb3J0Lmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iSW50ZXJjZXB0b3JzIiAgICAgICAgICAgICBocmVmPSJpbnRlcmNlcHRvcnMuaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJTdGF0dXMiICAgICAgICAgICAgICAgIGhyZWY9InN0YXR1cy5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IkRldmVsb3BlcnMiICAgICAgICAgICAgaHJlZj0iZGV2ZWxvcGVycy5odG1sIi8+CisgICAgPC9tZW51PgorCisgICAgPC9ib2R5PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9kb2Mvc2V0dXAueG1sIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vZG9jL3NldHVwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWFiZjkxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vZG9jL3NldHVwLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iaW50cm9kdWN0aW9uLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0iZmhhbmlrQGFwYWNoZS5vcmciPkZpbGlwIEhhbmlrPC9hdXRob3I+CisgICAgICAgIDx0aXRsZT5BcGFjaGUgVHJpYmVzIC0gQ29uZmlndXJhdGlvbjwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJDb25maWd1cmF0aW9uIE92ZXJ2aWV3Ij4KKzwvc2VjdGlvbj4KKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2RvYy90b21jYXQtZG9jcy54c2wgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9kb2MvdG9tY2F0LWRvY3MueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MGRjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9kb2MvdG9tY2F0LWRvY3MueHNsCkBAIC0wLDAgKzEsNDM2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IS0tIENvbnRlbnQgU3R5bGVzaGVldCBmb3IgInRvbWNhdC1kb2NzIiBEb2N1bWVudGF0aW9uIC0tPgorCis8IS0tICRJZCQgLS0+CisKKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgdmVyc2lvbj0iMS4wIj4KKworCisgIDwhLS0gT3V0cHV0IG1ldGhvZCAtLT4KKyAgPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIgorICAgICAgICAgICAgZW5jb2Rpbmc9Imlzby04ODU5LTEiCisgICAgICAgICAgICAgIGluZGVudD0ibm8iLz4KKworCisgIDwhLS0gRGVmaW5lZCBwYXJhbWV0ZXJzIChvdmVycmlkZWFibGUpIC0tPgorICA8eHNsOnBhcmFtICAgIG5hbWU9ImhvbWUtbmFtZSIgICAgICAgIHNlbGVjdD0iJ1RoZSBUb21jYXQgUHJvamVjdCciLz4KKyAgPHhzbDpwYXJhbSAgICBuYW1lPSJob21lLWhyZWYiICAgICAgICBzZWxlY3Q9IidodHRwOi8vdG9tY2F0LmFwYWNoZS5vcmcvJyIvPgorICA8eHNsOnBhcmFtICAgIG5hbWU9ImhvbWUtbG9nbyIgICAgICAgIHNlbGVjdD0iJy9pbWFnZXMvdG9tY2F0LmdpZiciLz4KKyAgPHhzbDpwYXJhbSAgICBuYW1lPSJwcmludGVyLWxvZ28iICAgICBzZWxlY3Q9IicvaW1hZ2VzL3ByaW50ZXIuZ2lmJyIvPgorICA8eHNsOnBhcmFtICAgIG5hbWU9ImFwYWNoZS1sb2dvIiAgICAgIHNlbGVjdD0iJy9pbWFnZXMvYXNmLWxvZ28uZ2lmJyIvPgorICA8eHNsOnBhcmFtICAgIG5hbWU9InJlbGF0aXZlLXBhdGgiICAgIHNlbGVjdD0iJy4nIi8+CisgIDx4c2w6cGFyYW0gICAgbmFtZT0idm9pZC1pbWFnZSIgICAgICAgc2VsZWN0PSInL2ltYWdlcy92b2lkLmdpZiciLz4KKyAgPHhzbDpwYXJhbSAgICBuYW1lPSJwcm9qZWN0LW1lbnUiICAgICBzZWxlY3Q9IidtZW51JyIvPgorICA8eHNsOnBhcmFtICAgIG5hbWU9InN0YW5kYWxvbmUiICAgICAgIHNlbGVjdD0iJyciLz4KKyAgPHhzbDpwYXJhbSAgICBuYW1lPSJidWdsaW5rIiAgICAgICAgICBzZWxlY3Q9IidodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPSciLz4KKworICA8IS0tIERlZmluZWQgdmFyaWFibGVzIChub24tb3ZlcnJpZGVhYmxlKSAtLT4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJib2R5LWJnIiAgICAgICAgICBzZWxlY3Q9IicjZmZmZmZmJyIvPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9ImJvZHktZmciICAgICAgICAgIHNlbGVjdD0iJyMwMDAwMDAnIi8+CisgIDx4c2w6dmFyaWFibGUgbmFtZT0iYm9keS1saW5rIiAgICAgICAgc2VsZWN0PSInIzUyNUQ3NiciLz4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJiYW5uZXItYmciICAgICAgICBzZWxlY3Q9IicjNTI1RDc2JyIvPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9ImJhbm5lci1mZyIgICAgICAgIHNlbGVjdD0iJyNmZmZmZmYnIi8+CisgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3ViLWJhbm5lci1iZyIgICAgc2VsZWN0PSInIzgyOERBNiciLz4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdWItYmFubmVyLWZnIiAgICBzZWxlY3Q9IicjZmZmZmZmJyIvPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9InNvdXJjZS1jb2xvciIgICAgIHNlbGVjdD0iJyMwMjMyNjQnIi8+CisgIDx4c2w6dmFyaWFibGUgbmFtZT0iYXR0cmlidXRlcy1jb2xvciIgc2VsZWN0PSInIzAyMzI2NCciLz4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0YWJsZS10aC1iZyIgICAgICBzZWxlY3Q9IicjMDM5YWNjJyIvPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9InRhYmxlLXRkLWJnIiAgICAgIHNlbGVjdD0iJyNhMGRkZjAnIi8+CisKKyAgPCEtLSBQcm9jZXNzIGFuIGVudGlyZSBkb2N1bWVudCBpbnRvIGFuIEhUTUwgcGFnZSAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jdW1lbnQiPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb2plY3QiCisgICAgICAgICAgICAgIHNlbGVjdD0iZG9jdW1lbnQoJ3Byb2plY3QueG1sJykvcHJvamVjdCIvPgorICAgIDxodG1sPgorICAgIDxoZWFkPgorICAgIDx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJvamVjdC90aXRsZSIvPiAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcm9wZXJ0aWVzL3RpdGxlIi8+PC90aXRsZT4KKyAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydGllcy9hdXRob3IiPgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYW1lIj4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KKyAgICAgIDwveHNsOnZhcmlhYmxlPgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlbWFpbCI+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZW1haWwiLz4KKyAgICAgIDwveHNsOnZhcmlhYmxlPgorICAgICAgPG1ldGEgbmFtZT0iYXV0aG9yIiB2YWx1ZT0ieyRuYW1lfSIvPgorICAgICAgPG1ldGEgbmFtZT0iZW1haWwiIHZhbHVlPSJ7JGVtYWlsfSIvPgorICAgIDwveHNsOmZvci1lYWNoPgorICAgIDwvaGVhZD4KKworICAgIDxib2R5IGJnY29sb3I9InskYm9keS1iZ30iIHRleHQ9InskYm9keS1mZ30iIGxpbms9InskYm9keS1saW5rfSIKKyAgICAgICAgICBhbGluaz0ieyRib2R5LWxpbmt9IiB2bGluaz0ieyRib2R5LWxpbmt9Ij4KKworICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCI+CisKKyAgICAgIDx4c2w6Y29tbWVudD5QQUdFIEhFQURFUjwveHNsOmNvbW1lbnQ+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJwcm9qZWN0L2xvZ28iPgorICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYWx0Ij4KKyAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcm9qZWN0L2xvZ28iLz4KKyAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImhvbWUiPgorICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb2plY3QvQGhyZWYiLz4KKyAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNyYyI+CisgICAgICAgICAgICA8IS0tPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGl2ZS1wYXRoIi8+LS0+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb2plY3QvbG9nby9AaHJlZiIvPgorICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgorCisgICAgICAgICAgPHhzbDpjb21tZW50PlBST0pFQ1QgTE9HTzwveHNsOmNvbW1lbnQ+CisgICAgICAgICAgPGEgaHJlZj0ieyRob21lfSI+CisgICAgICAgICAgICA8aW1nIHNyYz0ieyRzcmN9IiBhbGlnbj0icmlnaHQiIGFsdD0ieyRhbHR9IiBib3JkZXI9IjAiLz4KKyAgICAgICAgICA8L2E+CisgICAgICAgIDwveHNsOmlmPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgPGZvbnQgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KKyAgICAgICAgICAgIDxoMT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb2plY3QvdGl0bGUiLz48L2gxPgorICAgICAgICAgIDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgIDx4c2w6Y29tbWVudD5BUEFDSEUgTE9HTzwveHNsOmNvbW1lbnQ+CisgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiPgorICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGl2ZS1wYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhcGFjaGUtbG9nbyIvPgorICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPgorICAgICAgICAgICAgPGltZyBzcmM9Imh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy90b21jYXQtNS41LWRvYy9pbWFnZXMvYXNmLWxvZ28uZ2lmIiBhbGlnbj0icmlnaHQiIGFsdD0iQXBhY2hlIExvZ28iIGJvcmRlcj0iMCIvPgorICAgICAgICAgIDwvYT4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC90YWJsZT4KKworICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iNCI+CisKKyAgICAgIDx4c2w6Y29tbWVudD5IRUFERVIgU0VQQVJBVE9SPC94c2w6Y29tbWVudD4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIGNvbHNwYW49IjIiPgorICAgICAgICAgIDxociBub3NoYWRlPSJub3NoYWRlIiBzaXplPSIxIi8+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisKKyAgICAgICAgPCEtLSBEb24ndCBnZW5lcmF0ZSBhIG1lbnUgaWYgc3R5bGluZyBwcmludGVyIGZyaWVuZGx5IGRvY3MgLS0+CisgICAgICAgIDx4c2w6aWYgdGVzdD0iJHByb2plY3QtbWVudSA9ICdtZW51JyI+CisgICAgICAgICAgPHhzbDpjb21tZW50PkxFRlQgU0lERSBOQVZJR0FUSU9OPC94c2w6Y29tbWVudD4KKyAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgdmFsaWduPSJ0b3AiIG5vd3JhcD0idHJ1ZSI+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InByb2plY3QvYm9keS9tZW51Ii8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC94c2w6aWY+CisKKyAgICAgICAgPHhzbDpjb21tZW50PlJJR0hUIFNJREUgTUFJTiBCT0RZPC94c2w6Y29tbWVudD4KKyAgICAgICAgPHRkIHdpZHRoPSI4MCUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSI0Ij4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+CisgICAgICAgICAgICAgICAgPGgxPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcm9qZWN0L3RpdGxlIi8+PC9oMT4KKyAgICAgICAgICAgICAgICA8aDI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb3BlcnRpZXMvdGl0bGUiLz48L2gyPgorICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0IiB2YWxpZ249InRvcCIgbm93cmFwPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICA8IS0tIEFkZCB0aGUgcHJpbnRlciBmcmllbmRseSBsaW5rIGZvciBkb2NzIHdpdGggYSBtZW51IC0tPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHByb2plY3QtbWVudSA9ICdtZW51JyI+CisgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNyYyI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpdmUtcGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJpbnRlci1sb2dvIi8+CisgICAgICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idXJsIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9kb2N1bWVudC9AdXJsIi8+CisgICAgICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgICAgICAgICAgICAgIDxzbWFsbD4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0icHJpbnRlci97JHVybH0iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJ7JHNyY30iIGJvcmRlcj0iMCIgYWx0PSJQcmludGVyIEZyaWVuZGx5IFZlcnNpb24iLz4KKyAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5wcmludC1mcmllbmRseTxiciAvPnZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgICAgICAgPC9zbWFsbD4KKyAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRwcm9qZWN0LW1lbnUgIT0gJ21lbnUnIj4KKyAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idm9pZCI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpdmUtcGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdm9pZC1pbWFnZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJ7JHZvaWR9IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2c3BhY2U9IjAiIGhzcGFjZT0iMCIgYm9yZGVyPSIwIi8+CisgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJib2R5L3NlY3Rpb24iLz4KKyAgICAgICAgPC90ZD4KKworICAgICAgPC90cj4KKworICAgICAgPHhzbDpjb21tZW50PkZPT1RFUiBTRVBBUkFUT1I8L3hzbDpjb21tZW50PgorICAgICAgPHRyPgorICAgICAgICA8dGQgY29sc3Bhbj0iMiI+CisgICAgICAgICAgPGhyIG5vc2hhZGU9Im5vc2hhZGUiIHNpemU9IjEiLz4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx4c2w6Y29tbWVudD5QQUdFIEZPT1RFUjwveHNsOmNvbW1lbnQ+CisgICAgICA8dHI+PHRkIGNvbHNwYW49IjIiPgorICAgICAgICA8ZGl2IGFsaWduPSJjZW50ZXIiPjxmb250IGNvbG9yPSJ7JGJvZHktbGlua30iIHNpemU9Ii0xIj48ZW0+CisgICAgICAgIENvcHlyaWdodCAmIzE2OTsgMTk5OS0yMDA2LCBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICAgICAgICA8L2VtPjwvZm9udD48L2Rpdj4KKyAgICAgIDwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKworICA8L3hzbDp0ZW1wbGF0ZT4KKworCisgIDwhLS0gUHJvY2VzcyBhIG1lbnUgZm9yIHRoZSBuYXZpZ2F0aW9uIGJhciAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWVudSI+CisgICAgPHA+PHN0cm9uZz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3N0cm9uZz48L3A+CisgICAgPHVsPgorICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJpdGVtIi8+CisgICAgPC91bD4KKyAgPC94c2w6dGVtcGxhdGU+CisKKworICA8IS0tIFByb2Nlc3MgYSBtZW51IGl0ZW0gZm9yIHRoZSBuYXZpZ2F0aW9uIGJhciAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iaXRlbSI+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJocmVmIj4KKyAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaHJlZiIvPgorICAgIDwveHNsOnZhcmlhYmxlPgorICAgIDxsaT48YSBocmVmPSJ7JGhyZWZ9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+PC9saT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKworICA8IS0tIFByb2Nlc3MgYSBkb2N1bWVudGF0aW9uIHNlY3Rpb24gLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InNlY3Rpb24iPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZSI+CisgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgorICAgICAgPCEtLSBTZWN0aW9uIGhlYWRpbmcgLS0+CisgICAgICA8dHI+PHRkIGJnY29sb3I9InskYmFubmVyLWJnfSI+CisgICAgICAgICAgPGZvbnQgY29sb3I9InskYmFubmVyLWZnfSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJ7JG5hbWV9Ij4KKyAgICAgICAgICA8c3Ryb25nPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8IS0tIFNlY3Rpb24gYm9keSAtLT4KKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKworICA8IS0tIFByb2Nlc3MgYSBkb2N1bWVudGF0aW9uIHN1YnNlY3Rpb24gLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InN1YnNlY3Rpb24iPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZSI+CisgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgorICAgICAgPCEtLSBTdWJzZWN0aW9uIGhlYWRpbmcgLS0+CisgICAgICA8dHI+PHRkIGJnY29sb3I9Inskc3ViLWJhbm5lci1iZ30iPgorICAgICAgICAgIDxmb250IGNvbG9yPSJ7JHN1Yi1iYW5uZXItZmd9IiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgorICAgICAgICAgIDxhIG5hbWU9InskbmFtZX0iPgorICAgICAgICAgIDxzdHJvbmc+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9zdHJvbmc+PC9hPjwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKyAgICAgIDwhLS0gU3Vic2VjdGlvbiBib2R5IC0tPgorICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKyAgICA8L3RhYmxlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworCisgIDwhLS0gUHJvY2VzcyBhIHNvdXJjZSBjb2RlIGV4YW1wbGUgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InNvdXJjZSI+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ2b2lkIj4KKyAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpdmUtcGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdm9pZC1pbWFnZSIvPgorICAgIDwveHNsOnZhcmlhYmxlPgorICAgIDxkaXYgYWxpZ249ImxlZnQiPgorICAgICAgPHRhYmxlIGNlbGxzcGFjaW5nPSI0IiBjZWxscGFkZGluZz0iMCIgYm9yZGVyPSIwIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJ7JHNvdXJjZS1jb2xvcn0iIHdpZHRoPSIxIiBoZWlnaHQ9IjEiPgorICAgICAgICAgICAgPGltZyBzcmM9Inskdm9pZH0iIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJ7JHNvdXJjZS1jb2xvcn0iIGhlaWdodD0iMSI+CisgICAgICAgICAgICA8aW1nIHNyYz0ieyR2b2lkfSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdnNwYWNlPSIwIiBoc3BhY2U9IjAiIGJvcmRlcj0iMCIvPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIGJnY29sb3I9Inskc291cmNlLWNvbG9yfSIgd2lkdGg9IjEiIGhlaWdodD0iMSI+CisgICAgICAgICAgICA8aW1nIHNyYz0ieyR2b2lkfSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdnNwYWNlPSIwIiBoc3BhY2U9IjAiIGJvcmRlcj0iMCIvPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgYmdjb2xvcj0ieyRzb3VyY2UtY29sb3J9IiB3aWR0aD0iMSI+CisgICAgICAgICAgICA8aW1nIHNyYz0ieyR2b2lkfSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdnNwYWNlPSIwIiBoc3BhY2U9IjAiIGJvcmRlcj0iMCIvPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIGJnY29sb3I9IiNmZmZmZmYiIGhlaWdodD0iMSI+PHByZT4KKyAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+CisgICAgICAgICAgPC9wcmU+PC90ZD4KKyAgICAgICAgICA8dGQgYmdjb2xvcj0ieyRzb3VyY2UtY29sb3J9IiB3aWR0aD0iMSI+CisgICAgICAgICAgICA8aW1nIHNyYz0ieyR2b2lkfSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdnNwYWNlPSIwIiBoc3BhY2U9IjAiIGJvcmRlcj0iMCIvPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgYmdjb2xvcj0ieyRzb3VyY2UtY29sb3J9IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4KKyAgICAgICAgICAgIDxpbWcgc3JjPSJ7JHZvaWR9IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2c3BhY2U9IjAiIGhzcGFjZT0iMCIgYm9yZGVyPSIwIi8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgYmdjb2xvcj0ieyRzb3VyY2UtY29sb3J9IiBoZWlnaHQ9IjEiPgorICAgICAgICAgICAgPGltZyBzcmM9Inskdm9pZH0iIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJ7JHNvdXJjZS1jb2xvcn0iIHdpZHRoPSIxIiBoZWlnaHQ9IjEiPgorICAgICAgICAgICAgPGltZyBzcmM9Inskdm9pZH0iIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgPC90YWJsZT4KKyAgICA8L2Rpdj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKworICA8IS0tIFByb2Nlc3MgYW4gYXR0cmlidXRlcyBsaXN0IHdpdGggbmVzdGVkIGF0dHJpYnV0ZSBlbGVtZW50cyAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYXR0cmlidXRlcyI+CisgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgorICAgICAgPHRyPgorICAgICAgICA8dGggd2lkdGg9IjE1JSIgYmdjb2xvcj0ieyRhdHRyaWJ1dGVzLWNvbG9yfSI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiPkF0dHJpYnV0ZTwvZm9udD4KKyAgICAgICAgPC90aD4KKyAgICAgICAgPHRoIHdpZHRoPSI4NSUiIGJnY29sb3I9InskYXR0cmlidXRlcy1jb2xvcn0iPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIj5EZXNjcmlwdGlvbjwvZm9udD4KKyAgICAgICAgPC90aD4KKyAgICAgIDwvdHI+CisgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iYXR0cmlidXRlIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJjZW50ZXIiPgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAcmVxdWlyZWQgPSAndHJ1ZSciPgorICAgICAgICAgICAgICA8c3Ryb25nPjxjb2RlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvY29kZT48L3N0cm9uZz4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAcmVxdWlyZWQgIT0gJ3RydWUnIj4KKyAgICAgICAgICAgICAgPGNvZGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9jb2RlPgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0iY2VudGVyIj4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgPC90YWJsZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPCEtLSBGaXggcmVsYXRpdmUgbGlua3MgaW4gcHJpbnRlciBmcmllbmRseSB2ZXJzaW9ucyBvZiB0aGUgZG9jcyAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYSI+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJocmVmIiBzZWxlY3Q9IkBocmVmIi8+CisgICAgPHhzbDpjaG9vc2U+CisgICAgICA8eHNsOndoZW4gdGVzdD0iJHN0YW5kYWxvbmUgPSAnc3RhbmRhbG9uZSciPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgICAgICA8L3hzbDp3aGVuPgorICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9qZWN0LW1lbnUgIT0gJ21lbnUnIGFuZCBzdGFydHMtd2l0aChAaHJlZiwnLi4vJykiPgorICAgICAgICA8YSBocmVmPSIuLi97JGhyZWZ9Ij48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9hPgorICAgICAgPC94c2w6d2hlbj4KKyAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvamVjdC1tZW51ICE9ICdtZW51JyBhbmQgc3RhcnRzLXdpdGgoQGhyZWYsJy4vJykgYW5kIGNvbnRhaW5zKHN1YnN0cmluZyhAaHJlZiwzKSwnLycpIj4KKyAgICAgICAgPGEgaHJlZj0iLnskaHJlZn0iPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2E+CisgICAgICA8L3hzbDp3aGVuPgorICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9qZWN0LW1lbnUgIT0gJ21lbnUnIGFuZCBub3QoY29udGFpbnMoQGhyZWYsJy8vJykpIGFuZCBub3Qoc3RhcnRzLXdpdGgoQGhyZWYsJy8nKSkgYW5kIG5vdChzdGFydHMtd2l0aChAaHJlZiwnIycpKSBhbmQgY29udGFpbnMoQGhyZWYsJy8nKSI+CisgICAgICAgIDxhIGhyZWY9Ii4uL3skaHJlZn0iPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2E+CisgICAgICA8L3hzbDp3aGVuPgorICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRocmVmICE9ICcnIj4KKyAgICAgICAgPGEgaHJlZj0ieyRocmVmfSI+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvYT4KKyAgICAgIDwveHNsOndoZW4+CisgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYW1lIiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgIDxhIG5hbWU9InskbmFtZX0iPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2E+CisgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgPC94c2w6Y2hvb3NlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8IS0tIENoYW5nZWxvZyByZWxhdGVkIHRhZ3MgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNoYW5nZWxvZyI+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIyIj4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KKyAgICA8L3RhYmxlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGFuZ2Vsb2cvYWRkIj4KKyAgICA8dHI+CisgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNyYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGl2ZS1wYXRoIi8+L2ltYWdlcy9hZGQuZ2lmPC94c2w6dmFyaWFibGU+CisgICAgICA8dGQ+PGltZyBhbHQ9ImFkZCIgY2xhc3M9Imljb24iIHNyYz0ieyRzcmN9Ii8+PC90ZD4KKyAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC90ZD4KKyAgICA8L3RyPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGFuZ2Vsb2cvdXBkYXRlIj4KKyAgICA8dHI+CisgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNyYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGl2ZS1wYXRoIi8+L2ltYWdlcy91cGRhdGUuZ2lmPC94c2w6dmFyaWFibGU+CisgICAgICA8dGQ+PGltZyBhbHQ9InVwZGF0ZSIgY2xhc3M9Imljb24iIHNyYz0ieyRzcmN9Ii8+PC90ZD4KKyAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC90ZD4KKyAgICA8L3RyPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGFuZ2Vsb2cvZGVzaWduIj4KKyAgICA8dHI+CisgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNyYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGl2ZS1wYXRoIi8+L2ltYWdlcy9kZXNpZ24uZ2lmPC94c2w6dmFyaWFibGU+CisgICAgICA8dGQ+PGltZyBhbHQ9ImRlc2lnbiIgY2xhc3M9Imljb24iIHNyYz0ieyRzcmN9Ii8+PC90ZD4KKyAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC90ZD4KKyAgICA8L3RyPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGFuZ2Vsb2cvZG9jcyI+CisgICAgPHRyPgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpdmUtcGF0aCIvPi9pbWFnZXMvZG9jcy5naWY8L3hzbDp2YXJpYWJsZT4KKyAgICAgIDx0ZD48aW1nIGFsdD0iZG9jcyIgY2xhc3M9Imljb24iIHNyYz0ieyRzcmN9Ii8+PC90ZD4KKyAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC90ZD4KKyAgICA8L3RyPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGFuZ2Vsb2cvZml4Ij4KKyAgICA8dHI+CisgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNyYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGl2ZS1wYXRoIi8+L2ltYWdlcy9maXguZ2lmPC94c2w6dmFyaWFibGU+CisgICAgICA8dGQ+PGltZyBhbHQ9ImZpeCIgY2xhc3M9Imljb24iIHNyYz0ieyRzcmN9Ii8+PC90ZD4KKyAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC90ZD4KKyAgICA8L3RyPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGFuZ2Vsb2cvc2NvZGUiPgorICAgIDx0cj4KKyAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3JjIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aXZlLXBhdGgiLz4vaW1hZ2VzL2NvZGUuZ2lmPC94c2w6dmFyaWFibGU+CisgICAgICA8dGQ+PGltZyBhbHQ9ImNvZGUiIGNsYXNzPSJpY29uIiBzcmM9Inskc3JjfSIvPjwvdGQ+CisgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvdGQ+CisgICAgPC90cj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPCEtLSBQcm9jZXNzIGFuIGF0dHJpYnV0ZXMgbGlzdCB3aXRoIG5lc3RlZCBhdHRyaWJ1dGUgZWxlbWVudHMgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InN0YXR1cyI+CisgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgorICAgICAgPHRyPgorICAgICAgICA8dGggd2lkdGg9IjE1JSIgYmdjb2xvcj0ieyRhdHRyaWJ1dGVzLWNvbG9yfSI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiPlByaW9yaXR5PC9mb250PgorICAgICAgICA8L3RoPgorICAgICAgICA8dGggd2lkdGg9IjUwJSIgYmdjb2xvcj0ieyRhdHRyaWJ1dGVzLWNvbG9yfSI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiPkFjdGlvbiBJdGVtPC9mb250PgorICAgICAgICA8L3RoPgorICAgICAgICA8dGggd2lkdGg9IjI1JSIgYmdjb2xvcj0ieyRhdHRyaWJ1dGVzLWNvbG9yfSI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiPlZvbHVudGVlcnM8L2ZvbnQ+CisgICAgICAgIDwvdGg+CisgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpdGVtIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJjZW50ZXIiPgorICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwcmlvcml0eSIvPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249ImNlbnRlciI+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0iY2VudGVyIj4KKyAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAb3duZXIiLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgIDwvdHI+CisgICAgPC90YWJsZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPCEtLSBMaW5rIHRvIGEgYnVnIHJlcG9ydCAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYnVnIj4KKyAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibGluayI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRidWdsaW5rIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIvPjwveHNsOnZhcmlhYmxlPgorICAgICAgPGEgaHJlZj0ieyRsaW5rfSI+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvYT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPCEtLSBQcm9jZXNzIGV2ZXJ5dGhpbmcgZWxzZSBieSBqdXN0IHBhc3NpbmcgaXQgdGhyb3VnaCAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKnxAKiI+CisgICAgPHhzbDpjb3B5PgorICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnwqfHRleHQoKSIvPgorICAgIDwveHNsOmNvcHk+CisgIDwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vZXRjL2NsdXN0ZXItc2VydmVyLnhtbCBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2V0Yy9jbHVzdGVyLXNlcnZlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyNDE4OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL2V0Yy9jbHVzdGVyLXNlcnZlci54bWwKQEAgLTAsMCArMSwzOTQgQEAKKzwhLS0gRXhhbXBsZSBTZXJ2ZXIgQ29uZmlndXJhdGlvbiBGaWxlIC0tPgorPCEtLSBOb3RlIHRoYXQgY29tcG9uZW50IGVsZW1lbnRzIGFyZSBuZXN0ZWQgY29ycmVzcG9uZGluZyB0byB0aGVpcgorICAgICBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcyB3aXRoIGVhY2ggb3RoZXIgLS0+CisKKzwhLS0gQSAiU2VydmVyIiBpcyBhIHNpbmdsZXRvbiBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgZW50aXJlIEpWTSwKKyAgICAgd2hpY2ggbWF5IGNvbnRhaW4gb25lIG9yIG1vcmUgIlNlcnZpY2UiIGluc3RhbmNlcy4gIFRoZSBTZXJ2ZXIKKyAgICAgbGlzdGVucyBmb3IgYSBzaHV0ZG93biBjb21tYW5kIG9uIHRoZSBpbmRpY2F0ZWQgcG9ydC4KKworICAgICBOb3RlOiAgQSAiU2VydmVyIiBpcyBub3QgaXRzZWxmIGEgIkNvbnRhaW5lciIsIHNvIHlvdSBtYXkgbm90CisgICAgIGRlZmluZSBzdWJjb21wb25lbnRzIHN1Y2ggYXMgIlZhbHZlcyIgb3IgIkxvZ2dlcnMiIGF0IHRoaXMgbGV2ZWwuCisgLS0+CisKKzxTZXJ2ZXIgcG9ydD0iNzAwNSIgc2h1dGRvd249IlNIVVRET1dOIj4KKworICA8IS0tIENvbW1lbnQgdGhlc2UgZW50cmllcyBvdXQgdG8gZGlzYWJsZSBKTVggTUJlYW5zIHN1cHBvcnQgdXNlZCBmb3IgdGhlIAorICAgICAgIGFkbWluaXN0cmF0aW9uIHdlYiBhcHBsaWNhdGlvbiAtLT4KKyAgPExpc3RlbmVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkFwckxpZmVjeWNsZUxpc3RlbmVyIiAvPgorICA8TGlzdGVuZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5TZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciIgLz4KKyAgPExpc3RlbmVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuR2xvYmFsUmVzb3VyY2VzTGlmZWN5Y2xlTGlzdGVuZXIiIC8+CisgIDxMaXN0ZW5lciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVDb25maWdMaWZlY3ljbGVMaXN0ZW5lciIvPgorCisgIDwhLS0gR2xvYmFsIEpOREkgcmVzb3VyY2VzIC0tPgorICA8R2xvYmFsTmFtaW5nUmVzb3VyY2VzPgorCisgICAgPCEtLSBUZXN0IGVudHJ5IGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIC0tPgorICAgIDxFbnZpcm9ubWVudCBuYW1lPSJzaW1wbGVWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLkludGVnZXIiIHZhbHVlPSIzMCIvPgorCisgICAgPCEtLSBFZGl0YWJsZSB1c2VyIGRhdGFiYXNlIHRoYXQgY2FuIGFsc28gYmUgdXNlZCBieQorICAgICAgICAgVXNlckRhdGFiYXNlUmVhbG0gdG8gYXV0aGVudGljYXRlIHVzZXJzIC0tPgorICAgIDxSZXNvdXJjZSBuYW1lPSJVc2VyRGF0YWJhc2UiIGF1dGg9IkNvbnRhaW5lciIKKyAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2UiCisgICAgICAgZGVzY3JpcHRpb249IlVzZXIgZGF0YWJhc2UgdGhhdCBjYW4gYmUgdXBkYXRlZCBhbmQgc2F2ZWQiCisgICAgICAgICAgIGZhY3Rvcnk9Im9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnMuTWVtb3J5VXNlckRhdGFiYXNlRmFjdG9yeSIKKyAgICAgICAgICBwYXRobmFtZT0iY29uZi90b21jYXQtdXNlcnMueG1sIiAvPgorCisgIDwvR2xvYmFsTmFtaW5nUmVzb3VyY2VzPgorCisgIDwhLS0gQSAiU2VydmljZSIgaXMgYSBjb2xsZWN0aW9uIG9mIG9uZSBvciBtb3JlICJDb25uZWN0b3JzIiB0aGF0IHNoYXJlCisgICAgICAgYSBzaW5nbGUgIkNvbnRhaW5lciIgKGFuZCB0aGVyZWZvcmUgdGhlIHdlYiBhcHBsaWNhdGlvbnMgdmlzaWJsZQorICAgICAgIHdpdGhpbiB0aGF0IENvbnRhaW5lcikuICBOb3JtYWxseSwgdGhhdCBDb250YWluZXIgaXMgYW4gIkVuZ2luZSIsCisgICAgICAgYnV0IHRoaXMgaXMgbm90IHJlcXVpcmVkLgorCisgICAgICAgTm90ZTogIEEgIlNlcnZpY2UiIGlzIG5vdCBpdHNlbGYgYSAiQ29udGFpbmVyIiwgc28geW91IG1heSBub3QKKyAgICAgICBkZWZpbmUgc3ViY29tcG9uZW50cyBzdWNoIGFzICJWYWx2ZXMiIG9yICJMb2dnZXJzIiBhdCB0aGlzIGxldmVsLgorICAgLS0+CisKKyAgPCEtLSBEZWZpbmUgdGhlIFRvbWNhdCBTdGFuZC1BbG9uZSBTZXJ2aWNlIC0tPgorICA8U2VydmljZSBuYW1lPSJDYXRhbGluYSI+CisKKyAgICA8IS0tIEEgIkNvbm5lY3RvciIgcmVwcmVzZW50cyBhbiBlbmRwb2ludCBieSB3aGljaCByZXF1ZXN0cyBhcmUgcmVjZWl2ZWQKKyAgICAgICAgIGFuZCByZXNwb25zZXMgYXJlIHJldHVybmVkLiAgRWFjaCBDb25uZWN0b3IgcGFzc2VzIHJlcXVlc3RzIG9uIHRvIHRoZQorICAgICAgICAgYXNzb2NpYXRlZCAiQ29udGFpbmVyIiAobm9ybWFsbHkgYW4gRW5naW5lKSBmb3IgcHJvY2Vzc2luZy4KKworICAgICAgICAgQnkgZGVmYXVsdCwgYSBub24tU1NMIEhUVFAvMS4xIENvbm5lY3RvciBpcyBlc3RhYmxpc2hlZCBvbiBwb3J0IDgwODAuCisgICAgICAgICBZb3UgY2FuIGFsc28gZW5hYmxlIGFuIFNTTCBIVFRQLzEuMSBDb25uZWN0b3Igb24gcG9ydCA4NDQzIGJ5CisgICAgICAgICBmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyBiZWxvdyBhbmQgdW5jb21tZW50aW5nIHRoZSBzZWNvbmQgQ29ubmVjdG9yCisgICAgICAgICBlbnRyeS4gIFNTTCBzdXBwb3J0IHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgc3RlcHMgKHNlZSB0aGUgU1NMIENvbmZpZworICAgICAgICAgSE9XVE8gaW4gdGhlIFRvbWNhdCA1IGRvY3VtZW50YXRpb24gYnVuZGxlIGZvciBtb3JlIGRldGFpbGVkCisgICAgICAgICBpbnN0cnVjdGlvbnMpOgorICAgICAgICAgKiBJZiB5b3VyIEpESyB2ZXJzaW9uIDEuMyBvciBwcmlvciwgZG93bmxvYWQgYW5kIGluc3RhbGwgSlNTRSAxLjAuMiBvcgorICAgICAgICAgICBsYXRlciwgYW5kIHB1dCB0aGUgSkFSIGZpbGVzIGludG8gIiRKQVZBX0hPTUUvanJlL2xpYi9leHQiLgorICAgICAgICAgKiBFeGVjdXRlOgorICAgICAgICAgICAgICVKQVZBX0hPTUUlXGJpblxrZXl0b29sIC1nZW5rZXkgLWFsaWFzIHRvbWNhdCAta2V5YWxnIFJTQSAoV2luZG93cykKKyAgICAgICAgICAgICAkSkFWQV9IT01FL2Jpbi9rZXl0b29sIC1nZW5rZXkgLWFsaWFzIHRvbWNhdCAta2V5YWxnIFJTQSAgKFVuaXgpCisgICAgICAgICAgIHdpdGggYSBwYXNzd29yZCB2YWx1ZSBvZiAiY2hhbmdlaXQiIGZvciBib3RoIHRoZSBjZXJ0aWZpY2F0ZSBhbmQKKyAgICAgICAgICAgdGhlIGtleXN0b3JlIGl0c2VsZi4KKworICAgICAgICAgQnkgZGVmYXVsdCwgRE5TIGxvb2t1cHMgYXJlIGVuYWJsZWQgd2hlbiBhIHdlYiBhcHBsaWNhdGlvbiBjYWxscworICAgICAgICAgcmVxdWVzdC5nZXRSZW1vdGVIb3N0KCkuICBUaGlzIGNhbiBoYXZlIGFuIGFkdmVyc2UgaW1wYWN0IG9uCisgICAgICAgICBwZXJmb3JtYW5jZSwgc28geW91IGNhbiBkaXNhYmxlIGl0IGJ5IHNldHRpbmcgdGhlCisgICAgICAgICAiZW5hYmxlTG9va3VwcyIgYXR0cmlidXRlIHRvICJmYWxzZSIuICBXaGVuIEROUyBsb29rdXBzIGFyZSBkaXNhYmxlZCwKKyAgICAgICAgIHJlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpIHdpbGwgcmV0dXJuIHRoZSBTdHJpbmcgdmVyc2lvbiBvZiB0aGUKKyAgICAgICAgIElQIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBjbGllbnQuCisgICAgLS0+CisKKyAgICA8IS0tIERlZmluZSBhIG5vbi1TU0wgSFRUUC8xLjEgQ29ubmVjdG9yIG9uIHBvcnQgODA4MCAtLT4KKyAgICA8Q29ubmVjdG9yIHBvcnQ9IjcwODAiIG1heEh0dHBIZWFkZXJTaXplPSI4MTkyIgorICAgICAgICAgICAgICAgbWF4VGhyZWFkcz0iMTUwIiBtaW5TcGFyZVRocmVhZHM9IjI1IiBtYXhTcGFyZVRocmVhZHM9Ijc1IgorICAgICAgICAgICAgICAgZW5hYmxlTG9va3Vwcz0iZmFsc2UiIHJlZGlyZWN0UG9ydD0iODQ0MyIgYWNjZXB0Q291bnQ9IjEwMCIKKyAgICAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0PSIyMDAwMCIgZGlzYWJsZVVwbG9hZFRpbWVvdXQ9InRydWUiIC8+CisgICAgPCEtLSBOb3RlIDogVG8gZGlzYWJsZSBjb25uZWN0aW9uIHRpbWVvdXRzLCBzZXQgY29ubmVjdGlvblRpbWVvdXQgdmFsdWUKKyAgICAgdG8gMCAtLT4KKwkKKwk8IS0tIE5vdGUgOiBUbyB1c2UgZ3ppcCBjb21wcmVzc2lvbiB5b3UgY291bGQgc2V0IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyA6CisJCisJCQkgICBjb21wcmVzc2lvbj0ib24iIAorCQkJICAgY29tcHJlc3Npb25NaW5TaXplPSIyMDQ4IiAKKwkJCSAgIG5vQ29tcHJlc3Npb25Vc2VyQWdlbnRzPSJnb3ppbGxhLCB0cmF2aWF0YSIgCisJCQkgICBjb21wcmVzc2FibGVNaW1lVHlwZT0idGV4dC9odG1sLHRleHQveG1sIgorCS0tPgorCisgICAgPCEtLSBEZWZpbmUgYSBTU0wgSFRUUC8xLjEgQ29ubmVjdG9yIG9uIHBvcnQgODQ0MyAtLT4KKyAgICA8IS0tCisgICAgPENvbm5lY3RvciBwb3J0PSI4NDQzIiBtYXhIdHRwSGVhZGVyU2l6ZT0iODE5MiIKKyAgICAgICAgICAgICAgIG1heFRocmVhZHM9IjE1MCIgbWluU3BhcmVUaHJlYWRzPSIyNSIgbWF4U3BhcmVUaHJlYWRzPSI3NSIKKyAgICAgICAgICAgICAgIGVuYWJsZUxvb2t1cHM9ImZhbHNlIiBkaXNhYmxlVXBsb2FkVGltZW91dD0idHJ1ZSIKKyAgICAgICAgICAgICAgIGFjY2VwdENvdW50PSIxMDAiIHNjaGVtZT0iaHR0cHMiIHNlY3VyZT0idHJ1ZSIKKyAgICAgICAgICAgICAgIGNsaWVudEF1dGg9ImZhbHNlIiBzc2xQcm90b2NvbD0iVExTIiAvPgorICAgIC0tPgorCisgICAgPCEtLSBEZWZpbmUgYW4gQUpQIDEuMyBDb25uZWN0b3Igb24gcG9ydCA4MDA5IC0tPgorICAgIDxDb25uZWN0b3IgcG9ydD0iNzAwOSIgCisgICAgICAgICAgICAgICBlbmFibGVMb29rdXBzPSJmYWxzZSIgcmVkaXJlY3RQb3J0PSI4NDQzIiBwcm90b2NvbD0iQUpQLzEuMyIgLz4KKworICAgIDwhLS0gRGVmaW5lIGEgUHJveGllZCBIVFRQLzEuMSBDb25uZWN0b3Igb24gcG9ydCA4MDgyIC0tPgorICAgIDwhLS0gU2VlIHByb3h5IGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgdGhpcy4gLS0+CisgICAgPCEtLQorICAgIDxDb25uZWN0b3IgcG9ydD0iNzA4MiIgCisgICAgICAgICAgICAgICBtYXhUaHJlYWRzPSIxNTAiIG1pblNwYXJlVGhyZWFkcz0iMjUiIG1heFNwYXJlVGhyZWFkcz0iNzUiCisgICAgICAgICAgICAgICBlbmFibGVMb29rdXBzPSJmYWxzZSIgYWNjZXB0Q291bnQ9IjEwMCIgY29ubmVjdGlvblRpbWVvdXQ9IjIwMDAwIgorICAgICAgICAgICAgICAgcHJveHlQb3J0PSI4MCIgZGlzYWJsZVVwbG9hZFRpbWVvdXQ9InRydWUiIC8+CisgICAgLS0+CisKKyAgICA8IS0tIEFuIEVuZ2luZSByZXByZXNlbnRzIHRoZSBlbnRyeSBwb2ludCAod2l0aGluIENhdGFsaW5hKSB0aGF0IHByb2Nlc3NlcworICAgICAgICAgZXZlcnkgcmVxdWVzdC4gIFRoZSBFbmdpbmUgaW1wbGVtZW50YXRpb24gZm9yIFRvbWNhdCBzdGFuZCBhbG9uZQorICAgICAgICAgYW5hbHl6ZXMgdGhlIEhUVFAgaGVhZGVycyBpbmNsdWRlZCB3aXRoIHRoZSByZXF1ZXN0LCBhbmQgcGFzc2VzIHRoZW0KKyAgICAgICAgIG9uIHRvIHRoZSBhcHByb3ByaWF0ZSBIb3N0ICh2aXJ0dWFsIGhvc3QpLiAtLT4KKworICAgIDwhLS0gWW91IHNob3VsZCBzZXQganZtUm91dGUgdG8gc3VwcG9ydCBsb2FkLWJhbGFuY2luZyB2aWEgQUpQIGllIDoKKyAgICA8RW5naW5lIG5hbWU9IlN0YW5kYWxvbmUiIGRlZmF1bHRIb3N0PSJsb2NhbGhvc3QiIGp2bVJvdXRlPSJqdm0xIj4gICAgICAgICAKKyAgICAtLT4gCisgICAgICAgICAKKyAgICA8IS0tIERlZmluZSB0aGUgdG9wIGxldmVsIGNvbnRhaW5lciBpbiBvdXIgY29udGFpbmVyIGhpZXJhcmNoeSAtLT4KKyAgICA8RW5naW5lIG5hbWU9IkNhdGFsaW5hIiBkZWZhdWx0SG9zdD0ibG9jYWxob3N0Ij4KKworICAgICAgPCEtLSBUaGUgcmVxdWVzdCBkdW1wZXIgdmFsdmUgZHVtcHMgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhYm91dAorICAgICAgICAgICB0aGUgcmVxdWVzdCBoZWFkZXJzIGFuZCBjb29raWVzIHRoYXQgd2VyZSByZWNlaXZlZCwgYW5kIHRoZSByZXNwb25zZQorICAgICAgICAgICBoZWFkZXJzIGFuZCBjb29raWVzIHRoYXQgd2VyZSBzZW50LCBmb3IgYWxsIHJlcXVlc3RzIHJlY2VpdmVkIGJ5CisgICAgICAgICAgIHRoaXMgaW5zdGFuY2Ugb2YgVG9tY2F0LiAgSWYgeW91IGNhcmUgb25seSBhYm91dCByZXF1ZXN0cyB0byBhCisgICAgICAgICAgIHBhcnRpY3VsYXIgdmlydHVhbCBob3N0LCBvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24sIG5lc3QgdGhpcworICAgICAgICAgICBlbGVtZW50IGluc2lkZSB0aGUgY29ycmVzcG9uZGluZyA8SG9zdD4gb3IgPENvbnRleHQ+IGVudHJ5IGluc3RlYWQuCisKKyAgICAgICAgICAgRm9yIGEgc2ltaWxhciBtZWNoYW5pc20gdGhhdCBpcyBwb3J0YWJsZSB0byBhbGwgU2VydmxldCAyLjQKKyAgICAgICAgICAgY29udGFpbmVycywgY2hlY2sgb3V0IHRoZSAiUmVxdWVzdER1bXBlckZpbHRlciIgRmlsdGVyIGluIHRoZQorICAgICAgICAgICBleGFtcGxlIGFwcGxpY2F0aW9uICh0aGUgc291cmNlIGZvciB0aGlzIGZpbHRlciBtYXkgYmUgZm91bmQgaW4KKyAgICAgICAgICAgIiRDQVRBTElOQV9IT01FL3dlYmFwcHMvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2ZpbHRlcnMiKS4KKworICAgICAgICAgICBSZXF1ZXN0IGR1bXBpbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4gIFVuY29tbWVudCB0aGUgZm9sbG93aW5nCisgICAgICAgICAgIGVsZW1lbnQgdG8gZW5hYmxlIGl0LiAtLT4KKyAgICAgIDwhLS0KKyAgICAgIDxWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlcXVlc3REdW1wZXJWYWx2ZSIvPgorICAgICAgLS0+CisKKyAgICAgIDwhLS0gQmVjYXVzZSB0aGlzIFJlYWxtIGlzIGhlcmUsIGFuIGluc3RhbmNlIHdpbGwgYmUgc2hhcmVkIGdsb2JhbGx5IC0tPgorCisgICAgICA8IS0tIFRoaXMgUmVhbG0gdXNlcyB0aGUgVXNlckRhdGFiYXNlIGNvbmZpZ3VyZWQgaW4gdGhlIGdsb2JhbCBKTkRJCisgICAgICAgICAgIHJlc291cmNlcyB1bmRlciB0aGUga2V5ICJVc2VyRGF0YWJhc2UiLiAgQW55IGVkaXRzCisgICAgICAgICAgIHRoYXQgYXJlIHBlcmZvcm1lZCBhZ2FpbnN0IHRoaXMgVXNlckRhdGFiYXNlIGFyZSBpbW1lZGlhdGVseQorICAgICAgICAgICBhdmFpbGFibGUgZm9yIHVzZSBieSB0aGUgUmVhbG0uICAtLT4KKyAgICAgIDxSZWFsbSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uVXNlckRhdGFiYXNlUmVhbG0iCisgICAgICAgICAgICAgcmVzb3VyY2VOYW1lPSJVc2VyRGF0YWJhc2UiLz4KKworICAgICAgPCEtLSBDb21tZW50IG91dCB0aGUgb2xkIHJlYWxtIGJ1dCBsZWF2ZSBoZXJlIGZvciBub3cgaW4gY2FzZSB3ZQorICAgICAgICAgICBuZWVkIHRvIGdvIGJhY2sgcXVpY2tseSAtLT4KKyAgICAgIDwhLS0KKyAgICAgIDxSZWFsbSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uTWVtb3J5UmVhbG0iIC8+CisgICAgICAtLT4KKworICAgICAgPCEtLSBSZXBsYWNlIHRoZSBhYm92ZSBSZWFsbSB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRvIGdldCBhIFJlYWxtCisgICAgICAgICAgIHN0b3JlZCBpbiBhIGRhdGFiYXNlIGFuZCBhY2Nlc3NlZCB2aWEgSkRCQyAtLT4KKworICAgICAgPCEtLQorICAgICAgPFJlYWxtICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkRCQ1JlYWxtIgorICAgICAgICAgICAgIGRyaXZlck5hbWU9Im9yZy5nanQubW0ubXlzcWwuRHJpdmVyIgorICAgICAgICAgIGNvbm5lY3Rpb25VUkw9ImpkYmM6bXlzcWw6Ly9sb2NhbGhvc3QvYXV0aG9yaXR5IgorICAgICAgICAgY29ubmVjdGlvbk5hbWU9InRlc3QiIGNvbm5lY3Rpb25QYXNzd29yZD0idGVzdCIKKyAgICAgICAgICAgICAgdXNlclRhYmxlPSJ1c2VycyIgdXNlck5hbWVDb2w9InVzZXJfbmFtZSIgdXNlckNyZWRDb2w9InVzZXJfcGFzcyIKKyAgICAgICAgICB1c2VyUm9sZVRhYmxlPSJ1c2VyX3JvbGVzIiByb2xlTmFtZUNvbD0icm9sZV9uYW1lIiAvPgorICAgICAgLS0+CisKKyAgICAgIDwhLS0KKyAgICAgIDxSZWFsbSAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpEQkNSZWFsbSIKKyAgICAgICAgICAgICBkcml2ZXJOYW1lPSJvcmFjbGUuamRiYy5kcml2ZXIuT3JhY2xlRHJpdmVyIgorICAgICAgICAgIGNvbm5lY3Rpb25VUkw9ImpkYmM6b3JhY2xlOnRoaW46QG50c2VydmVyOjE1MjE6T1JDTCIKKyAgICAgICAgIGNvbm5lY3Rpb25OYW1lPSJzY290dCIgY29ubmVjdGlvblBhc3N3b3JkPSJ0aWdlciIKKyAgICAgICAgICAgICAgdXNlclRhYmxlPSJ1c2VycyIgdXNlck5hbWVDb2w9InVzZXJfbmFtZSIgdXNlckNyZWRDb2w9InVzZXJfcGFzcyIKKyAgICAgICAgICB1c2VyUm9sZVRhYmxlPSJ1c2VyX3JvbGVzIiByb2xlTmFtZUNvbD0icm9sZV9uYW1lIiAvPgorICAgICAgLS0+CisKKyAgICAgIDwhLS0KKyAgICAgIDxSZWFsbSAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpEQkNSZWFsbSIKKyAgICAgICAgICAgICBkcml2ZXJOYW1lPSJzdW4uamRiYy5vZGJjLkpkYmNPZGJjRHJpdmVyIgorICAgICAgICAgIGNvbm5lY3Rpb25VUkw9ImpkYmM6b2RiYzpDQVRBTElOQSIKKyAgICAgICAgICAgICAgdXNlclRhYmxlPSJ1c2VycyIgdXNlck5hbWVDb2w9InVzZXJfbmFtZSIgdXNlckNyZWRDb2w9InVzZXJfcGFzcyIKKyAgICAgICAgICB1c2VyUm9sZVRhYmxlPSJ1c2VyX3JvbGVzIiByb2xlTmFtZUNvbD0icm9sZV9uYW1lIiAvPgorICAgICAgLS0+CisKKyAgICAgIDwhLS0gRGVmaW5lIHRoZSBkZWZhdWx0IHZpcnR1YWwgaG9zdAorICAgICAgICAgICBOb3RlOiBYTUwgU2NoZW1hIHZhbGlkYXRpb24gd2lsbCBub3Qgd29yayB3aXRoIFhlcmNlcyAyLjIuCisgICAgICAgLS0+CisgICAgICA8SG9zdCBuYW1lPSJsb2NhbGhvc3QiIGFwcEJhc2U9IndlYmFwcHMiCisgICAgICAgdW5wYWNrV0FScz0idHJ1ZSIgYXV0b0RlcGxveT0idHJ1ZSIKKyAgICAgICB4bWxWYWxpZGF0aW9uPSJmYWxzZSIgeG1sTmFtZXNwYWNlQXdhcmU9ImZhbHNlIj4KKworICAgICAgICA8IS0tIERlZmluZXMgYSBjbHVzdGVyIGZvciB0aGlzIG5vZGUsCisgICAgICAgICAgICAgQnkgZGVmaW5pbmcgdGhpcyBlbGVtZW50LCBtZWFucyB0aGF0IGV2ZXJ5IG1hbmFnZXIgd2lsbCBiZSBjaGFuZ2VkLgorICAgICAgICAgICAgIFNvIHdoZW4gcnVubmluZyBhIGNsdXN0ZXIsIG9ubHkgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgd2ViYXBwcyBpbiB0aGVyZQorICAgICAgICAgICAgIHRoYXQgbmVlZCB0byBiZSBjbHVzdGVyZWQgYW5kIHJlbW92ZSB0aGUgb3RoZXIgb25lcy4KKyAgICAgICAgICAgICBBIGNsdXN0ZXIgaGFzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2x1c3RlciBjbGFzcworCisgICAgICAgICAgICAgY2x1c3Rlck5hbWUgPSBhIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHlvdXIgY2x1c3RlciwgY2FuIGJlIGFueXRoaW5nCisKKyAgICAgICAgICAgICBtY2FzdEFkZHIgPSB0aGUgbXVsdGljYXN0IGFkZHJlc3MsIGhhcyB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIHRoZSBub2RlcworCisgICAgICAgICAgICAgbWNhc3RQb3J0ID0gdGhlIG11bHRpY2FzdCBwb3J0LCBoYXMgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCB0aGUgbm9kZXMKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICBtY2FzdEJpbmRBZGRyID0gYmluZCB0aGUgbXVsdGljYXN0IHNvY2tldCB0byBhIHNwZWNpZmljIGFkZHJlc3MKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICBtY2FzdFRUTCA9IHRoZSBtdWx0aWNhc3QgVFRMIGlmIHlvdSB3YW50IHRvIGxpbWl0IHlvdXIgYnJvYWRjYXN0CisgICAgICAgICAgICAgCisgICAgICAgICAgICAgbWNhc3RTb1RpbWVvdXQgPSB0aGUgbXVsdGljYXN0IHJlYWR0aW1lb3V0IAorCisgICAgICAgICAgICAgbWNhc3RGcmVxdWVuY3kgPSB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBiZXR3ZWVuIHNlbmRpbmcgYSAiSSdtIGFsaXZlIiBoZWFydGJlYXQKKworICAgICAgICAgICAgIG1jYXN0RHJvcFRpbWUgPSB0aGUgbnVtYmVyIGEgbWlsbGlzZWNvbmRzIGJlZm9yZSBhIG5vZGUgaXMgY29uc2lkZXJlZCAiZGVhZCIgaWYgbm8gaGVhcnRiZWF0IGlzIHJlY2VpdmVkCisKKyAgICAgICAgICAgICB0Y3BUaHJlYWRDb3VudCA9IHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byBoYW5kbGUgaW5jb21pbmcgcmVwbGljYXRpb24gcmVxdWVzdHMsIG9wdGltYWwgd291bGQgYmUgdGhlIHNhbWUgYW1vdW50IG9mIHRocmVhZHMgYXMgbm9kZXMgCisKKyAgICAgICAgICAgICB0Y3BMaXN0ZW5BZGRyZXNzID0gdGhlIGxpc3RlbiBhZGRyZXNzIChiaW5kIGFkZHJlc3MpIGZvciBUQ1AgY2x1c3RlciByZXF1ZXN0IG9uIHRoaXMgaG9zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGNhc2Ugb2YgbXVsdGlwbGUgZXRoZXJuZXQgY2FyZHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gbWVhbnMgdGhhdCBhZGRyZXNzIGJlY29tZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdEFkZHJlc3MoKQorCisgICAgICAgICAgICAgdGNwTGlzdGVuUG9ydCA9IHRoZSB0Y3AgbGlzdGVuIHBvcnQKKworICAgICAgICAgICAgIHRjcFNlbGVjdG9yVGltZW91dCA9IHRoZSB0aW1lb3V0IChtcykgZm9yIHRoZSBTZWxlY3Rvci5zZWxlY3QoKSBtZXRob2QgaW4gY2FzZSB0aGUgT1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYSB3YWt1cCBidWcgaW4gamF2YS5uaW8uIFNldCB0byAwIGZvciBubyB0aW1lb3V0CisKKyAgICAgICAgICAgICBwcmludFRvU2NyZWVuID0gdHJ1ZSBtZWFucyB0aGF0IG1hbmFnZXJzIHdpbGwgYWxzbyBwcmludCB0byBzdGQub3V0CisKKyAgICAgICAgICAgICBleHBpcmVTZXNzaW9uc09uU2h1dGRvd24gPSB0cnVlIG1lYW5zIHRoYXQgCisKKyAgICAgICAgICAgICB1c2VEaXJ0eUZsYWcgPSB0cnVlIG1lYW5zIHRoYXQgd2Ugb25seSByZXBsaWNhdGUgYSBzZXNzaW9uIGFmdGVyIHNldEF0dHJpYnV0ZSxyZW1vdmVBdHRyaWJ1dGUgaGFzIGJlZW4gY2FsbGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG1lYW5zIHRvIHJlcGxpY2F0ZSB0aGUgc2Vzc2lvbiBhZnRlciBlYWNoIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgbWVhbnMgdGhhdCByZXBsaWNhdGlvbiB3b3VsZCB3b3JrIGZvciB0aGUgZm9sbG93aW5nIHBpZWNlIG9mIGNvZGU6IChvbmx5IGZvciBTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNoTWFwIG1hcCA9IChIYXNoTWFwKXNlc3Npb24uZ2V0QXR0cmlidXRlKCJtYXAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KCJrZXkiLCJ2YWx1ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICU+CisgICAgICAgICAgICAgcmVwbGljYXRpb25Nb2RlID0gY2FuIGJlIGVpdGhlciAncG9vbGVkJywgJ3N5bmNocm9ub3VzJyBvciAnYXN5bmNocm9ub3VzJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFBvb2xlZCBtZWFucyB0aGF0IHRoZSByZXBsaWNhdGlvbiBoYXBwZW5zIHVzaW5nIHNldmVyYWwgc29ja2V0cyBpbiBhIHN5bmNocm9ub3VzIHdheS4gSWUsIHRoZSBkYXRhIGdldHMgcmVwbGljYXRlZCwgdGhlbiB0aGUgcmVxdWVzdCByZXR1cm4uIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlICdzeW5jaHJvbm91cycgc2V0dGluZyBleGNlcHQgaXQgdXNlcyBhIHBvb2wgb2Ygc29ja2V0cywgaGVuY2UgaXQgaXMgbXVsdGl0aHJlYWRlZC4gVGhpcyBpcyB0aGUgZmFzdGVzdCBhbmQgc2FmZXN0IGNvbmZpZ3VyYXRpb24uIFRvIHVzZSB0aGlzLCBhbHNvIGluY3JlYXNlIHRoZSBuciBvZiB0Y3AgdGhyZWFkcyB0aGF0IHlvdSBoYXZlIGRlYWxpbmcgd2l0aCByZXBsaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFN5bmNocm9ub3VzIG1lYW5zIHRoYXQgdGhlIHRocmVhZCB0aGF0IGV4ZWN1dGVzIHRoZSByZXF1ZXN0LCBpcyBhbHNvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZCB0aGUgcmVwbGljYXRlcyB0aGUgZGF0YSB0byB0aGUgb3RoZXIgbm9kZXMsIGFuZCB3aWxsIG5vdCByZXR1cm4gdW50aWwgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMgaGF2ZSByZWNlaXZlZCB0aGUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBc3luY2hyb25vdXMgbWVhbnMgdGhhdCB0aGVyZSBpcyBhIHNwZWNpZmljICdzZW5kZXInIHRocmVhZCBmb3IgZWFjaCBjbHVzdGVyIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhlIHJlcXVlc3QgdGhyZWFkIHdpbGwgcXVldWUgdGhlIHJlcGxpY2F0aW9uIHJlcXVlc3QgaW50byBhICJzbWFydCIgcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gcmV0dXJuIHRvIHRoZSBjbGllbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJzbWFydCIgcXVldWUgaXMgYSBxdWV1ZSB3aGVyZSB3aGVuIGEgc2Vzc2lvbiBpcyBhZGRlZCB0byB0aGUgcXVldWUsIGFuZCB0aGUgc2FtZSBzZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHF1ZXVlIGZyb20gYSBwcmV2aW91cyByZXF1ZXN0LCB0aGF0IHNlc3Npb24gd2lsbCBiZSByZXBsYWNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBxdWV1ZSBpbnN0ZWFkIG9mIHJlcGxpY2F0aW5nIHR3byByZXF1ZXN0cy4gVGhpcyBhbG1vc3QgbmV2ZXIgaGFwcGVucywgdW5sZXNzIHRoZXJlIGlzIGEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFyZ2UgbmV0d29yayBkZWxheS4KKyAgICAgICAgLS0+ICAgICAgICAgICAgIAorICAgICAgICA8IS0tCisgICAgICAgICAgICBXaGVuIGNvbmZpZ3VyaW5nIGZvciBjbHVzdGVyaW5nLCB5b3UgYWxzbyBhZGQgaW4gYSB2YWx2ZSB0byBjYXRjaCBhbGwgdGhlIHJlcXVlc3RzCisgICAgICAgICAgICBjb21pbmcgaW4sIGF0IHRoZSBlbmQgb2YgdGhlIHJlcXVlc3QsIHRoZSBzZXNzaW9uIG1heSBvciBtYXkgbm90IGJlIHJlcGxpY2F0ZWQuCisgICAgICAgICAgICBBIHNlc3Npb24gaXMgcmVwbGljYXRlZCBpZiBhbmQgb25seSBpZiBhbGwgdGhlIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgICAgICAgICAgIDEuIHVzZURpcnR5RmxhZyBpcyB0cnVlIG9yIHNldEF0dHJpYnV0ZSBvciByZW1vdmVBdHRyaWJ1dGUgaGFzIGJlZW4gY2FsbGVkIEFORAorICAgICAgICAgICAgMi4gYSBzZXNzaW9uIGV4aXN0cyAoaGFzIGJlZW4gY3JlYXRlZCkKKyAgICAgICAgICAgIDMuIHRoZSByZXF1ZXN0IGlzIG5vdCB0cmFwcGVkIGJ5IHRoZSAiZmlsdGVyIiBhdHRyaWJ1dGUKKworICAgICAgICAgICAgVGhlIGZpbHRlciBhdHRyaWJ1dGUgaXMgdG8gZmlsdGVyIG91dCByZXF1ZXN0cyB0aGF0IGNvdWxkIG5vdCBtb2RpZnkgdGhlIHNlc3Npb24sCisgICAgICAgICAgICBoZW5jZSB3ZSBkb24ndCByZXBsaWNhdGUgdGhlIHNlc3Npb24gYWZ0ZXIgdGhlIGVuZCBvZiB0aGlzIHJlcXVlc3QuCisgICAgICAgICAgICBUaGUgZmlsdGVyIGlzIG5lZ2F0aXZlLCBpZSwgYW55dGhpbmcgeW91IHB1dCBpbiB0aGUgZmlsdGVyLCB5b3UgbWVhbiB0byBmaWx0ZXIgb3V0LAorICAgICAgICAgICAgaWUsIG5vIHJlcGxpY2F0aW9uIHdpbGwgYmUgZG9uZSBvbiByZXF1ZXN0cyB0aGF0IG1hdGNoIG9uZSBvZiB0aGUgZmlsdGVycy4KKyAgICAgICAgICAgIFRoZSBmaWx0ZXIgYXR0cmlidXRlIGlzIGRlbGltaXRlZCBieSA7LCBzbyB5b3UgY2FuJ3QgZXNjYXBlIG91dCA7IGV2ZW4gaWYgeW91IHdhbnRlZCB0by4KKworICAgICAgICAgICAgZmlsdGVyPSIuKlwuZ2lmOy4qXC5qczsiIG1lYW5zIHRoYXQgd2Ugd2lsbCBub3QgcmVwbGljYXRlIHRoZSBzZXNzaW9uIGFmdGVyIHJlcXVlc3RzIHdpdGggdGhlIFVSSQorICAgICAgICAgICAgZW5kaW5nIHdpdGggLmdpZiBhbmQgLmpzIGFyZSBpbnRlcmNlcHRlZC4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgVGhlIGRlcGxveWVyIGVsZW1lbnQgY2FuIGJlIHVzZWQgdG8gZGVwbG95IGFwcHMgY2x1c3RlciB3aWRlLgorICAgICAgICAgICAgQ3VycmVudGx5IHRoZSBkZXBsb3ltZW50IG9ubHkgZGVwbG95cy91bmRlcGxveXMgdG8gd29ya2luZyBtZW1iZXJzIGluIHRoZSBjbHVzdGVyCisgICAgICAgICAgICBzbyBubyBXQVJzIGFyZSBjb3BpZWQgdXBvbnMgc3RhcnR1cCBvZiBhIGJyb2tlbiBub2RlLgorICAgICAgICAgICAgVGhlIGRlcGxveWVyIHdhdGNoZXMgYSBkaXJlY3RvcnkgKHdhdGNoRGlyKSBmb3IgV0FSIGZpbGVzIHdoZW4gd2F0Y2hFbmFibGVkPSJ0cnVlIgorICAgICAgICAgICAgV2hlbiBhIG5ldyB3YXIgZmlsZSBpcyBhZGRlZCB0aGUgd2FyIGdldHMgZGVwbG95ZWQgdG8gdGhlIGxvY2FsIGluc3RhbmNlLAorICAgICAgICAgICAgYW5kIHRoZW4gZGVwbG95ZWQgdG8gdGhlIG90aGVyIGluc3RhbmNlcyBpbiB0aGUgY2x1c3Rlci4KKyAgICAgICAgICAgIFdoZW4gYSB3YXIgZmlsZSBpcyBkZWxldGVkIGZyb20gdGhlIHdhdGNoRGlyIHRoZSB3YXIgaXMgdW5kZXBsb3llZCBsb2NhbGx5IAorICAgICAgICAgICAgYW5kIGNsdXN0ZXIgd2lkZQorICAgICAgICAtLT4KKyAgICAgICAgCisgICAgICAgIDxDbHVzdGVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5oYS50Y3AuU2ltcGxlVGNwQ2x1c3RlciIKKyAgICAgICAgICAgICAgICAgbWFuYWdlckNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5oYS5zZXNzaW9uLkJhY2t1cE1hbmFnZXIiCisgICAgICAgICAgICAgICAgIGV4cGlyZVNlc3Npb25zT25TaHV0ZG93bj0iZmFsc2UiCisgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb249InRydWUiCisgICAgICAgICAgICAgICAgIGNoYW5uZWxTZW5kT3B0aW9ucz0iMTEiCisgICAgICAgICAgICAgICAgIG1hbmFnZXIubWFwU2VuZE9wdGlvbnM9IjExIj4KKworICAgICAgICAgICAgPENoYW5uZWwgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5Hcm91cENoYW5uZWwiPgorICAgICAgICAgICAgICAgIDxNZW1iZXJzaGlwIAorICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLm1lbWJlcnNoaXAuTWNhc3RTZXJ2aWNlIgorICAgICAgICAgICAgICAgICAgICBtY2FzdEFkZHI9IjIyOC4wLjAuNCIKKyAgICAgICAgICAgICAgICAgICAgbWNhc3RQb3J0PSI0NTU2NCIKKyAgICAgICAgICAgICAgICAgICAgbWNhc3RGcmVxdWVuY3k9IjUwMCIKKyAgICAgICAgICAgICAgICAgICAgbWNhc3REcm9wVGltZT0iMzAwMCIvPgorCisgICAgICAgICAgICAgICAgPFJlY2VpdmVyIAorICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5uaW8uTmlvUmVjZWl2ZXIiCisgICAgICAgICAgICAgICAgICAgIHRjcExpc3RlbkFkZHJlc3M9ImF1dG8iCisgICAgICAgICAgICAgICAgICAgIHRjcExpc3RlblBvcnQ9IjQwMDEiCisgICAgICAgICAgICAgICAgICAgIG1pblRocmVhZHM9IjYiCisgICAgICAgICAgICAgICAgICAgIG1heFRocmVhZHM9IjI1IgorICAgICAgICAgICAgICAgICAgICByeEJ1ZlNpemU9IjQzODAwIgorICAgICAgICAgICAgICAgICAgICB0eEJ1ZlNpemU9IjI1MTg4IgorICAgICAgICAgICAgICAgICAgICBhdXRvQmluZD0iMTAiLz4KKworICAgICAgICAgICAgICAgIDxTZW5kZXIKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuUmVwbGljYXRpb25UcmFuc21pdHRlciI+CisgICAgICAgICAgICAgICAgICAgIDxUcmFuc3BvcnQgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQubmlvLlBvb2xlZFBhcmFsbGVsU2VuZGVyIgorICAgICAgICAgICAgICAgICAgICAgICAgcnhCdWZTaXplPSI0MzgwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIHR4QnVmU2l6ZT0iMjUxODgiLz4KKyAgICAgICAgICAgICAgICA8L1NlbmRlcj4KKyAgICAgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICAgICAgPEludGVyY2VwdG9yIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzLkd6aXBJbnRlcmNlcHRvciIvPgorICAgICAgICAgICAgICAgIDxJbnRlcmNlcHRvciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9ycy5GcmFnbWVudGF0aW9uSW50ZXJjZXB0b3IiLz4KKyAgICAgICAgICAgICAgICA8SW50ZXJjZXB0b3IgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuT3JkZXJJbnRlcmNlcHRvciIvPgorICAgICAgICAgICAgICAgIDxJbnRlcmNlcHRvciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9ycy5NZXNzYWdlRGlzcGF0Y2hJbnRlcmNlcHRvciIvPgorICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgPC9DaGFubmVsPgorICAgICAgICAgICAgCisgICAgICAgICAgICA8VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnRjcC5SZXBsaWNhdGlvblZhbHZlIgorICAgICAgICAgICAgICAgICAgIGZpbHRlcj0iLipcLmdpZjsuKlwuanM7LipcLmpwZzsuKlwucG5nOy4qXC5odG07LipcLmh0bWw7LipcLmNzczsuKlwudHh0OyIvPgorICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgPERlcGxveWVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5oYS5kZXBsb3kuRmFybVdhckRlcGxveWVyIgorICAgICAgICAgICAgICAgICAgICAgIHRlbXBEaXI9Ii90bXAvd2FyLXRlbXAvIgorICAgICAgICAgICAgICAgICAgICAgIGRlcGxveURpcj0iL3RtcC93YXItZGVwbG95LyIKKyAgICAgICAgICAgICAgICAgICAgICB3YXRjaERpcj0iL3RtcC93YXItbGlzdGVuLyIKKyAgICAgICAgICAgICAgICAgICAgICB3YXRjaEVuYWJsZWQ9ImZhbHNlIi8+CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICA8Q2x1c3Rlckxpc3RlbmVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5oYS5zZXNzaW9uLkNsdXN0ZXJTZXNzaW9uTGlzdGVuZXIiLz4KKyAgICAgICAgPC9DbHVzdGVyPgorICAgIAorCisKKworICAgICAgICA8IS0tIE5vcm1hbGx5LCB1c2VycyBtdXN0IGF1dGhlbnRpY2F0ZSB0aGVtc2VsdmVzIHRvIGVhY2ggd2ViIGFwcAorICAgICAgICAgICAgIGluZGl2aWR1YWxseS4gIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGVudHJ5IGlmIHlvdSB3b3VsZCBsaWtlCisgICAgICAgICAgICAgYSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQgdGhlIGZpcnN0IHRpbWUgdGhleSBlbmNvdW50ZXIgYQorICAgICAgICAgICAgIHJlc291cmNlIHByb3RlY3RlZCBieSBhIHNlY3VyaXR5IGNvbnN0cmFpbnQsIGFuZCB0aGVuIGhhdmUgdGhhdAorICAgICAgICAgICAgIHVzZXIgaWRlbnRpdHkgbWFpbnRhaW5lZCBhY3Jvc3MgKmFsbCogd2ViIGFwcGxpY2F0aW9ucyBjb250YWluZWQKKyAgICAgICAgICAgICBpbiB0aGlzIHZpcnR1YWwgaG9zdC4gLS0+CisgICAgICAgIDwhLS0KKyAgICAgICAgPFZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLlNpbmdsZVNpZ25PbiIgLz4KKyAgICAgICAgLS0+CisKKyAgICAgICAgPCEtLSBBY2Nlc3MgbG9nIHByb2Nlc3NlcyBhbGwgcmVxdWVzdHMgZm9yIHRoaXMgdmlydHVhbCBob3N0LiAgQnkKKyAgICAgICAgICAgICBkZWZhdWx0LCBsb2cgZmlsZXMgYXJlIGNyZWF0ZWQgaW4gdGhlICJsb2dzIiBkaXJlY3RvcnkgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgICAkQ0FUQUxJTkFfSE9NRS4gIElmIHlvdSB3aXNoLCB5b3UgY2FuIHNwZWNpZnkgYSBkaWZmZXJlbnQKKyAgICAgICAgICAgICBkaXJlY3Rvcnkgd2l0aCB0aGUgImRpcmVjdG9yeSIgYXR0cmlidXRlLiAgU3BlY2lmeSBlaXRoZXIgYSByZWxhdGl2ZQorICAgICAgICAgICAgICh0byAkQ0FUQUxJTkFfSE9NRSkgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgZGVzaXJlZCBkaXJlY3RvcnkuCisgICAgICAgIC0tPgorICAgICAgICA8IS0tCisgICAgICAgIDxWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkFjY2Vzc0xvZ1ZhbHZlIgorICAgICAgICAgICAgICAgICBkaXJlY3Rvcnk9ImxvZ3MiICBwcmVmaXg9ImxvY2FsaG9zdF9hY2Nlc3NfbG9nLiIgc3VmZml4PSIudHh0IgorICAgICAgICAgICAgICAgICBwYXR0ZXJuPSJjb21tb24iIHJlc29sdmVIb3N0cz0iZmFsc2UiLz4KKyAgICAgICAgLS0+CisKKyAgICAgICAgPCEtLSBBY2Nlc3MgbG9nIHByb2Nlc3NlcyBhbGwgcmVxdWVzdHMgZm9yIHRoaXMgdmlydHVhbCBob3N0LiAgQnkKKyAgICAgICAgICAgICBkZWZhdWx0LCBsb2cgZmlsZXMgYXJlIGNyZWF0ZWQgaW4gdGhlICJsb2dzIiBkaXJlY3RvcnkgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgICAkQ0FUQUxJTkFfSE9NRS4gIElmIHlvdSB3aXNoLCB5b3UgY2FuIHNwZWNpZnkgYSBkaWZmZXJlbnQKKyAgICAgICAgICAgICBkaXJlY3Rvcnkgd2l0aCB0aGUgImRpcmVjdG9yeSIgYXR0cmlidXRlLiAgU3BlY2lmeSBlaXRoZXIgYSByZWxhdGl2ZQorICAgICAgICAgICAgICh0byAkQ0FUQUxJTkFfSE9NRSkgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgZGVzaXJlZCBkaXJlY3RvcnkuCisgICAgICAgICAgICAgVGhpcyBhY2Nlc3MgbG9nIGltcGxlbWVudGF0aW9uIGlzIG9wdGltaXplZCBmb3IgbWF4aW11bSBwZXJmb3JtYW5jZSwKKyAgICAgICAgICAgICBidXQgaXMgaGFyZGNvZGVkIHRvIHN1cHBvcnQgb25seSB0aGUgImNvbW1vbiIgYW5kICJjb21iaW5lZCIgcGF0dGVybnMuCisgICAgICAgIC0tPgorICAgICAgICA8IS0tCisgICAgICAgIDxWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkZhc3RDb21tb25BY2Nlc3NMb2dWYWx2ZSIKKyAgICAgICAgICAgICAgICAgZGlyZWN0b3J5PSJsb2dzIiAgcHJlZml4PSJsb2NhbGhvc3RfYWNjZXNzX2xvZy4iIHN1ZmZpeD0iLnR4dCIKKyAgICAgICAgICAgICAgICAgcGF0dGVybj0iY29tbW9uIiByZXNvbHZlSG9zdHM9ImZhbHNlIi8+CisgICAgICAgIC0tPgorICAgICAgICA8IS0tIEFjY2VzcyBsb2cgcHJvY2Vzc2VzIGFsbCByZXF1ZXN0cyBmb3IgdGhpcyB2aXJ0dWFsIGhvc3QuICBCeQorICAgICAgICAgICAgIGRlZmF1bHQsIGxvZyBmaWxlcyBhcmUgY3JlYXRlZCBpbiB0aGUgImxvZ3MiIGRpcmVjdG9yeSByZWxhdGl2ZSB0bworICAgICAgICAgICAgICRDQVRBTElOQV9IT01FLiAgSWYgeW91IHdpc2gsIHlvdSBjYW4gc3BlY2lmeSBhIGRpZmZlcmVudAorICAgICAgICAgICAgIGRpcmVjdG9yeSB3aXRoIHRoZSAiZGlyZWN0b3J5IiBhdHRyaWJ1dGUuICBTcGVjaWZ5IGVpdGhlciBhIHJlbGF0aXZlCisgICAgICAgICAgICAgKHRvICRDQVRBTElOQV9IT01FKSBvciBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBkZXNpcmVkIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICBUaGlzIGFjY2VzcyBsb2cgaW1wbGVtZW50YXRpb24gaXMgb3B0aW1pemVkIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlLAorICAgICAgICAgICAgIGJ1dCBpcyBoYXJkY29kZWQgdG8gc3VwcG9ydCBvbmx5IHRoZSAiY29tbW9uIiBhbmQgImNvbWJpbmVkIiBwYXR0ZXJucy4KKworICAgICAgICAgICAgIFRoaXMgdmFsdmUgdXNlIE5JTyBkaXJlY3QgQnl0ZSBCdWZmZXIgdG8gYXN5bmNob3Jub3VzbHkgc3RvcmUgdGhlCisgICAgICAgICAgICAgbG9nLgorICAgICAgICAtLT4KKyAgICAgICAgPCEtLQorICAgICAgICA8VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5CeXRlQnVmZmVyQWNjZXNzTG9nVmFsdmUiCisgICAgICAgICAgICAgICAgIGRpcmVjdG9yeT0ibG9ncyIgIHByZWZpeD0ibG9jYWxob3N0X2FjY2Vzc19sb2cuIiBzdWZmaXg9Ii50eHQiCisgICAgICAgICAgICAgICAgIHBhdHRlcm49ImNvbW1vbiIgcmVzb2x2ZUhvc3RzPSJmYWxzZSIvPgorICAgICAgICAtLT4KKworICAgICAgPC9Ib3N0PgorCisgICAgPC9FbmdpbmU+CisKKyAgPC9TZXJ2aWNlPgorCis8L1NlcnZlcj4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9CeXRlTWVzc2FnZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL0J5dGVNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxODE3OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9CeXRlTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXQ7CisKKy8qKgorICogQSBieXRlIG1lc3NhZ2UgaXMgbm90IHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCBieSB0aGUgY2hhbm5lbAorICogaW5zdGVhZCBpdCBpcyBzZW50IGFzIGEgYnl0ZSBhcnJheTxicj4KKyAqIEJ5IGRlZmF1bHQgVHJpYmVzIHVzZXMgamF2YSBzZXJpYWxpemF0aW9uIHdoZW4gaXQgcmVjZWl2ZXMgYW4gb2JqZWN0CisgKiB0byBiZSBzZW50IG92ZXIgdGhlIHdpcmUuIEphdmEgc2VyaWFsaXphdGlvbiBpcyBub3QgdGhlIG1vc3QKKyAqIGVmZmljaWVudCBvZiBzZXJpYWxpemluZyBkYXRhLCBhbmQgVHJpYmVzIG1pZ2h0IG5vdCBldmVuCisgKiBoYXZlIGFjY2VzcyB0byB0aGUgY29ycmVjdCBjbGFzcyBsb2FkZXJzIHRvIGRlc2VyaWFsaXplIHRoZSBvYmplY3QgcHJvcGVybHkuCisgKiA8YnI+CisgKiBUaGUgQnl0ZU1lc3NhZ2UgY2xhc3MgaXMgYSBjbGFzcyB3aGVyZSB0aGUgY2hhbm5lbCB3aGVuIGl0IHJlY2VpdmVzIGl0IHdpbGwKKyAqIG5vdCBhdHRlbXB0IHRvIHBlcmZvcm0gc2VyaWFsaXphdGlvbiwgaW5zdGVhZCBpdCB3aWxsIHNpbXBseSBzdHJlYW0gdGhlIDxjb2RlPmdldE1lc3NhZ2UoKTwvY29kZT4KKyAqIGJ5dGVzLjxicj4KKyAqIElmIHlvdSBhcmUgdXNpbmcgbXVsdGlwbGUgYXBwbGljYXRpb25zIG9uIHRvcCBvZiBUcmliZXMgeW91IHNob3VsZCBhZGQgc29tZSBzb3J0IG9mIGhlYWRlcgorICogc28gdGhhdCB5b3UgY2FuIGRlY2lkZSB3aXRoIHRoZSA8Y29kZT5DaGFubmVsTGlzdGVuZXIuYWNjZXB0KCk8L2NvZGU+IHdoZXRoZXIgdGhpcyBtZXNzYWdlIHdhcyBpbnRlbmRlZAorICogZm9yIHlvdS4KKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBCeXRlTWVzc2FnZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgRXh0ZXJuYWxpemFibGUgeworICAgIC8qKgorICAgICAqIFN0b3JhZ2UgZm9yIHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJ5dGVbXSBtZXNzYWdlOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGJ5dGUgbWVzc2FnZQorICAgICAqIENvbnN0cnVjdG9yIGFsc28gZm9yIGRlc2VyaWFsaXphdGlvbgorICAgICAqLworICAgIHB1YmxpYyBCeXRlTWVzc2FnZSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnl0ZSBtZXNzYWdlIHdpdCBoCisgICAgICogQHBhcmFtIGRhdGEgYnl0ZVtdIC0gdGhlIG1lc3NhZ2UgY29udGVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgQnl0ZU1lc3NhZ2UoYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgbWVzc2FnZSA9IGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBjb250ZW50cyBvZiB0aGlzIGJ5dGUgbWVzc2FnZQorICAgICAqIEByZXR1cm4gYnl0ZVtdIC0gbWVzc2FnZSBjb250ZW50cywgY2FuIGJlIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1lc3NhZ2UgY29udGVudHMgb2YgdGhpcyBieXRlIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBieXRlW10KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKGJ5dGVbXSBtZXNzYWdlKSB7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBqYXZhLmlvLkV4dGVybmFsaXphYmxlI3JlYWRFeHRlcm5hbAorICAgICAqIEBwYXJhbSBpbiBPYmplY3RJbnB1dAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW4gKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgbGVuZ3RoID0gaW4ucmVhZEludCgpOworICAgICAgICBtZXNzYWdlID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgaW4ucmVhZChtZXNzYWdlLDAsbGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIGphdmEuaW8uRXh0ZXJuYWxpemFibGUjd3JpdGVFeHRlcm5hbAorICAgICAqIEBwYXJhbSBvdXQgT2JqZWN0T3V0cHV0CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlRXh0ZXJuYWwoT2JqZWN0T3V0cHV0IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlSW50KG1lc3NhZ2UhPW51bGw/bWVzc2FnZS5sZW5ndGg6MCk7CisgICAgICAgIGlmICggbWVzc2FnZSE9bnVsbCApIG91dC53cml0ZShtZXNzYWdlLDAsbWVzc2FnZS5sZW5ndGgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL0NoYW5uZWwuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9DaGFubmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0NWJhNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9DaGFubmVsLmphdmEKQEAgLTAsMCArMSwzMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlczsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisvKioKKyAqIENoYW5uZWwgaW50ZXJmYWNlPGJyPgorICogQSBjaGFubmVsIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBncm91cCBvZiBub2RlcyBhbGwgcGFydGljaXBhdGluZyBpbiBzb21lIHNvcnQgb2YKKyAqIGNvbW11bmljYXRpb24gd2l0aCBlYWNoIG90aGVyLjxicj4KKyAqIFRoZSBjaGFubmVsIGlzIHRoZSBtYWluIEFQSSBjbGFzcyBmb3IgVHJpYmVzLCB0aGlzIGlzIGVzc2VudGlhbGx5IHRoZSBvbmx5IGNsYXNzCisgKiB0aGF0IGFuIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGJlIGF3YXJlIG9mLiBUaHJvdWdoIHRoZSBjaGFubmVsIHRoZSBhcHBsaWNhdGlvbiBjYW46PGJyPgorICogMS4gc2VuZCBtZXNzYWdlczxicj4KKyAqIDIuIHJlY2VpdmUgbWVzc2FnZSAoYnkgcmVnaXN0ZXJpbmcgYSA8Y29kZT5DaGFubmVsTGlzdGVuZXI8L2NvZGU+PGJyPgorICogMy4gZ2V0IGFsbCBtZW1iZXJzIG9mIHRoZSBncm91cCA8Y29kZT5nZXRNZW1iZXJzKCk8L2NvZGU+PGJyPgorICogNC4gcmVjZWl2ZSBub3RpZmljYXRpb25zIG9mIG1lbWJlcnMgYWRkZWQgYW5kIG1lbWJlcnMgZGlzYXBwZWFyZWQgYnkKKyAqICAgIHJlZ2lzdGVyZXJpbmcgYSA8Y29kZT5NZW1iZXJzaGlwTGlzdGVuZXI8L2NvZGU+PGJyPgorICogPGJyPgorICogVGhlIGNoYW5uZWwgaGFzIDUgbWFqb3IgY29tcG9uZW50czo8YnI+CisgKiAxLiBEYXRhIHJlY2VpdmVyLCB3aXRoIGEgYnVpbHQgaW4gdGhyZWFkIHBvb2wgdG8gcmVjZWl2ZSBtZXNzYWdlcyBmcm9tIG90aGVyIHBlZXJzPGJyPgorICogMi4gRGF0YSBzZW5kZXIsIGFuIGltcGxlbWVudGF0aW9uIGZvciBzZW5kaW5nIGRhdGEgdXNpbmcgTklPIG9yIGphdmEuaW88YnI+CisgKiAzLiBNZW1iZXJzaGlwIGxpc3RlbmVyLGxpc3RlbnMgZm9yIG1lbWJlcnNoaXAgYnJvYWRjYXN0czxicj4KKyAqIDQuIE1lbWJlcnNoaXAgYnJvYWRjYXN0ZXIsIGJyb2FkY2FzdHMgbWVtYmVyc2hpcCBwaW5ncy48YnI+CisgKiA1LiBDaGFubmVsIGludGVyY2VwdG9ycywgdGhlIGFiaWxpdHkgdG8gbWFuaXB1bGF0ZSBtZXNzYWdlcyBhcyB0aGV5IGFyZSBzZW50IG9yIGFycml2ZTxicj48YnI+CisgKiBUaGUgY2hhbm5lbCBsYXlvdXQgaXM6CisgKiA8cHJlPjxjb2RlPgorICogIENoYW5uZWxMaXN0ZW5lcl8xLi5DaGFubmVsTGlzdGVuZXJfTiBNZW1iZXJzaGlwTGlzdGVuZXJfMS4uTWVtYmVyc2hpcExpc3RlbmVyX04gW0FwcGxpY2F0aW9uIExheWVyXQorICogICAgICAgICAgICBcICAgICAgICAgIFwgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICAgIC8KKyAqICAgICAgICAgICAgIFwgICAgICAgICAgXCAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICAgIC8KKyAqICAgICAgICAgICAgICBcICAgICAgICAgIFwgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgICAgLworICogICAgICAgICAgICAgICBcICAgICAgICAgIFwgICAgICAgICAgICAvICAgICAgICAgICAgICAgICAgIC8KKyAqICAgICAgICAgICAgICAgIFwgICAgICAgICAgXCAgICAgICAgICAvICAgICAgICAgICAgICAgICAgIC8KKyAqICAgICAgICAgICAgICAgICBcICAgICAgICAgIFwgICAgICAgIC8gICAgICAgICAgICAgICAgICAgLworICogICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxJbnRlcmNlcHRvcl8xCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQ2hhbm5lbCBzdGFja10KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxJbnRlcmNlcHRvcl9OCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29vcmRpbmF0b3IgKGltcGxlbWVudHMgTWVzc2FnZUxpc3RlbmVyLE1lbWJlcnNoaXBMaXN0ZW5lcixDaGFubmVsSW50ZXJjZXB0b3IpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgIHwgICAgICAgICAgIFwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICB8ICAgICAgICAgICAgXAorICogICAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgfCAgICAgICAgICAgICBcCisgKiAgICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICB8ICAgICAgICAgICAgICBcCisgKiAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICB8ICAgICAgICAgICAgICAgXAorICogICAgICAgICAgIE1lbWJlcnNoaXBTZXJ2aWNlIENoYW5uZWxTZW5kZXIgQ2hhbm5lbFJlY2VpdmVyICAgICAgICAgICAgICAgICAgICAgICAgW0lPIGxheWVyXQorICogPC9jb2RlPjwvcHJlPgorICogCisgKiBGb3IgZXhhbXBsZSB1c2FnZSBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkdyb3VwQ2hhbm5lbAorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2hhbm5lbCB7CisgICAgCisgICAgLyoqCisgICAgICogU3RhcnQgYW5kIHN0b3Agc2VxdWVuY2VzIGNhbiBiZSBjb250cm9sbGVkIGJ5IHRoZXNlIGNvbnN0YW50cworICAgICAqIFRoaXMgYWxsb3dzIHlvdSB0byBzdGFydCBzZXBhcmF0ZSBjb21wb25lbnRzIG9mIHRoZSBjaGFubmVsIDxicj4KKyAgICAgKiBERUZBVUxUIC0gc3RhcnRzIG9yIHN0b3BzIGFsbCBjb21wb25lbnRzIGluIHRoZSBjaGFubmVsCisgICAgICogQHNlZSAjc3RhcnQoaW50KQorICAgICAqIEBzZWUgI3N0b3AoaW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFQgPSAxNTsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IGFuZCBzdG9wIHNlcXVlbmNlcyBjYW4gYmUgY29udHJvbGxlZCBieSB0aGVzZSBjb25zdGFudHMKKyAgICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gc3RhcnQgc2VwYXJhdGUgY29tcG9uZW50cyBvZiB0aGUgY2hhbm5lbCA8YnI+CisgICAgICogU05EX1JYX1NFUSAtIHN0YXJ0cyBvciBzdG9wcyB0aGUgZGF0YSByZWNlaXZlci4gU3RhcnQgbWVhbnMgb3BlbmluZyBhIHNlcnZlciBzb2NrZXQKKyAgICAgKiBpbiBjYXNlIG9mIGEgVENQIGltcGxlbWVudGF0aW9uCisgICAgICogQHNlZSAjc3RhcnQoaW50KQorICAgICAqIEBzZWUgI3N0b3AoaW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNORF9SWF9TRVEgPSAxOworCisgICAgLyoqCisgICAgICogU3RhcnQgYW5kIHN0b3Agc2VxdWVuY2VzIGNhbiBiZSBjb250cm9sbGVkIGJ5IHRoZXNlIGNvbnN0YW50cworICAgICAqIFRoaXMgYWxsb3dzIHlvdSB0byBzdGFydCBzZXBhcmF0ZSBjb21wb25lbnRzIG9mIHRoZSBjaGFubmVsIDxicj4KKyAgICAgKiBTTkRfVFhfU0VRIC0gc3RhcnRzIG9yIHN0b3BzIHRoZSBkYXRhIHNlbmRlci4gVGhpcyBzaG91bGQgbm90IG9wZW4gYW55IHNvY2tldHMsCisgICAgICogYXMgc29ja2V0cyBhcmUgb3BlbmVkIG9uIGRlbWFuZCB3aGVuIGEgbWVzc2FnZSBpcyBiZWluZyBzZW50CisgICAgICogQHNlZSAjc3RhcnQoaW50KQorICAgICAqIEBzZWUgI3N0b3AoaW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNORF9UWF9TRVEgPSAyOworCisgICAgLyoqCisgICAgICogU3RhcnQgYW5kIHN0b3Agc2VxdWVuY2VzIGNhbiBiZSBjb250cm9sbGVkIGJ5IHRoZXNlIGNvbnN0YW50cworICAgICAqIFRoaXMgYWxsb3dzIHlvdSB0byBzdGFydCBzZXBhcmF0ZSBjb21wb25lbnRzIG9mIHRoZSBjaGFubmVsIDxicj4KKyAgICAgKiBNQlJfUlhfU0VRIC0gc3RhcnRzIG9yIHN0b3BzIHRoZSBtZW1iZXJzaGlwIGxpc3RlbmVyLiBJbiBhIG11bHRpY2FzdCBpbXBsZW1lbnRhdGlvbgorICAgICAqIHRoaXMgd2lsbCBvcGVuIGEgZGF0YWdyYW0gc29ja2V0IGFuZCBqb2luIGEgZ3JvdXAgYW5kIGxpc3RlbiBmb3IgbWVtYmVyc2hpcCBtZXNzYWdlcworICAgICAqIG1lbWJlcnMgam9pbmluZworICAgICAqIEBzZWUgI3N0YXJ0KGludCkKKyAgICAgKiBAc2VlICNzdG9wKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQlJfUlhfU0VRID0gNDsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IGFuZCBzdG9wIHNlcXVlbmNlcyBjYW4gYmUgY29udHJvbGxlZCBieSB0aGVzZSBjb25zdGFudHMKKyAgICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gc3RhcnQgc2VwYXJhdGUgY29tcG9uZW50cyBvZiB0aGUgY2hhbm5lbCA8YnI+CisgICAgICogTUJSX1RYX1NFUSAtIHN0YXJ0cyBvciBzdG9wcyB0aGUgbWVtYmVyc2hpcCBicm9hZGNhc3Rlci4gSW4gYSBtdWx0aWNhc3QgaW1wbGVtZW50YXRpb24KKyAgICAgKiB0aGlzIHdpbGwgb3BlbiBhIGRhdGFncmFtIHNvY2tldCBhbmQgam9pbiBhIGdyb3VwIGFuZCBicm9hZGNhc3QgdGhlIGxvY2FsIG1lbWJlciBpbmZvcm1hdGlvbgorICAgICAqIEBzZWUgI3N0YXJ0KGludCkKKyAgICAgKiBAc2VlICNzdG9wKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQlJfVFhfU0VRID0gODsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZW5kIG9wdGlvbnMsIHdoZW4gYSBtZXNzYWdlIGlzIHNlbnQsIGl0IGNhbiBoYXZlIGFuIG9wdGlvbiBmbGFnCisgICAgICogdG8gdHJpZ2dlciBjZXJ0YWluIGJlaGF2aW9yLiBNb3N0IGZsYWdzIGFyZSB1c2VkIHRvIHRyaWdnZXIgY2hhbm5lbCBpbnRlcmNlcHRvcnMKKyAgICAgKiBhcyB0aGUgbWVzc2FnZSBwYXNzZXMgdGhyb3VnaCB0aGUgY2hhbm5lbCBzdGFjay4gPGJyPgorICAgICAqIEhvd2V2ZXIsIHRoZXJlIGFyZSBmb3VyIGRlZmF1bHQgZmxhZ3MgdGhhdCBldmVyeSBjaGFubmVsIGltcGxlbWVudGF0aW9uIG11c3QgaW1wbGVtZW50PGJyPgorICAgICAqIFNFTkRfT1BUSU9OU19CWVRFX01FU1NBR0UgLSBUaGUgbWVzc2FnZSBpcyBhIHB1cmUgYnl0ZSBtZXNzYWdlIGFuZCBubyBtYXJzaGFsbGluZyBvciB1bm1hcnNoYWxsaW5nIHdpbGwKKyAgICAgKiBiZSBwZXJmb3JtZWQuPGJyPgorICAgICAqIAorICAgICAqIEBzZWUgI3NlbmQoTWVtYmVyW10sIFNlcmlhbGl6YWJsZSAsIGludCkKKyAgICAgKiBAc2VlICNzZW5kKE1lbWJlcltdLCBTZXJpYWxpemFibGUsIGludCwgRXJyb3JIYW5kbGVyKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTkRfT1BUSU9OU19CWVRFX01FU1NBR0UgPSAweDAwMDE7CisKKyAgICAvKioKKyAgICAgKiBTZW5kIG9wdGlvbnMsIHdoZW4gYSBtZXNzYWdlIGlzIHNlbnQsIGl0IGNhbiBoYXZlIGFuIG9wdGlvbiBmbGFnCisgICAgICogdG8gdHJpZ2dlciBjZXJ0YWluIGJlaGF2aW9yLiBNb3N0IGZsYWdzIGFyZSB1c2VkIHRvIHRyaWdnZXIgY2hhbm5lbCBpbnRlcmNlcHRvcnMKKyAgICAgKiBhcyB0aGUgbWVzc2FnZSBwYXNzZXMgdGhyb3VnaCB0aGUgY2hhbm5lbCBzdGFjay4gPGJyPgorICAgICAqIEhvd2V2ZXIsIHRoZXJlIGFyZSBmb3VyIGRlZmF1bHQgZmxhZ3MgdGhhdCBldmVyeSBjaGFubmVsIGltcGxlbWVudGF0aW9uIG11c3QgaW1wbGVtZW50PGJyPgorICAgICAqIFNFTkRfT1BUSU9OU19VU0VfQUNLIC0gTWVzc2FnZSBpcyBzZW50IGFuZCBhbiBBQ0sgaXMgcmVjZWl2ZWQgd2hlbiB0aGUgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZCBieSB0aGUgcmVjaXBpZW50PGJyPgorICAgICAqIElmIG5vIGFjayBpcyByZWNlaXZlZCwgdGhlIG1lc3NhZ2UgaXMgbm90IGNvbnNpZGVyZWQgc3VjY2Vzc2Z1bDxicj4KKyAgICAgKiBAc2VlICNzZW5kKE1lbWJlcltdLCBTZXJpYWxpemFibGUgLCBpbnQpCisgICAgICogQHNlZSAjc2VuZChNZW1iZXJbXSwgU2VyaWFsaXphYmxlLCBpbnQsIEVycm9ySGFuZGxlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU5EX09QVElPTlNfVVNFX0FDSyA9IDB4MDAwMjsKKworICAgIC8qKgorICAgICAqIFNlbmQgb3B0aW9ucywgd2hlbiBhIG1lc3NhZ2UgaXMgc2VudCwgaXQgY2FuIGhhdmUgYW4gb3B0aW9uIGZsYWcKKyAgICAgKiB0byB0cmlnZ2VyIGNlcnRhaW4gYmVoYXZpb3IuIE1vc3QgZmxhZ3MgYXJlIHVzZWQgdG8gdHJpZ2dlciBjaGFubmVsIGludGVyY2VwdG9ycworICAgICAqIGFzIHRoZSBtZXNzYWdlIHBhc3NlcyB0aHJvdWdoIHRoZSBjaGFubmVsIHN0YWNrLiA8YnI+CisgICAgICogSG93ZXZlciwgdGhlcmUgYXJlIGZvdXIgZGVmYXVsdCBmbGFncyB0aGF0IGV2ZXJ5IGNoYW5uZWwgaW1wbGVtZW50YXRpb24gbXVzdCBpbXBsZW1lbnQ8YnI+CisgICAgICogU0VORF9PUFRJT05TX1NZTkNIUk9OSVpFRF9BQ0sgLSBNZXNzYWdlIGlzIHNlbnQgYW5kIGFuIEFDSyBpcyByZWNlaXZlZCB3aGVuIHRoZSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCAKKyAgICAgKiBwcm9jZXNzZWQgYnkgdGhlIHJlY2lwaWVudDxicj4KKyAgICAgKiBJZiBubyBhY2sgaXMgcmVjZWl2ZWQsIHRoZSBtZXNzYWdlIGlzIG5vdCBjb25zaWRlcmVkIHN1Y2Nlc3NmdWw8YnI+CisgICAgICogQHNlZSAjc2VuZChNZW1iZXJbXSwgU2VyaWFsaXphYmxlICwgaW50KQorICAgICAqIEBzZWUgI3NlbmQoTWVtYmVyW10sIFNlcmlhbGl6YWJsZSwgaW50LCBFcnJvckhhbmRsZXIpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VORF9PUFRJT05TX1NZTkNIUk9OSVpFRF9BQ0sgPSAweDAwMDQ7CisgICAgCisgICAgLyoqCisgICAgICogU2VuZCBvcHRpb25zLCB3aGVuIGEgbWVzc2FnZSBpcyBzZW50LCBpdCBjYW4gaGF2ZSBhbiBvcHRpb24gZmxhZworICAgICAqIHRvIHRyaWdnZXIgY2VydGFpbiBiZWhhdmlvci4gTW9zdCBmbGFncyBhcmUgdXNlZCB0byB0cmlnZ2VyIGNoYW5uZWwgaW50ZXJjZXB0b3JzCisgICAgICogYXMgdGhlIG1lc3NhZ2UgcGFzc2VzIHRocm91Z2ggdGhlIGNoYW5uZWwgc3RhY2suIDxicj4KKyAgICAgKiBIb3dldmVyLCB0aGVyZSBhcmUgZm91ciBkZWZhdWx0IGZsYWdzIHRoYXQgZXZlcnkgY2hhbm5lbCBpbXBsZW1lbnRhdGlvbiBtdXN0IGltcGxlbWVudDxicj4KKyAgICAgKiBTRU5EX09QVElPTlNfQVNZTkNIUk9OT1VTIC0gTWVzc2FnZSBpcyBzZW50IGFuZCBhbiBBQ0sgaXMgcmVjZWl2ZWQgd2hlbiB0aGUgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgCisgICAgICogcHJvY2Vzc2VkIGJ5IHRoZSByZWNpcGllbnQ8YnI+CisgICAgICogSWYgbm8gYWNrIGlzIHJlY2VpdmVkLCB0aGUgbWVzc2FnZSBpcyBub3QgY29uc2lkZXJlZCBzdWNjZXNzZnVsPGJyPgorICAgICAqIEBzZWUgI3NlbmQoTWVtYmVyW10sIFNlcmlhbGl6YWJsZSAsIGludCkKKyAgICAgKiBAc2VlICNzZW5kKE1lbWJlcltdLCBTZXJpYWxpemFibGUsIGludCwgRXJyb3JIYW5kbGVyKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTkRfT1BUSU9OU19BU1lOQ0hST05PVVMgPSAweDAwMDg7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBTZW5kIG9wdGlvbnMsIHdoZW4gYSBtZXNzYWdlIGlzIHNlbnQsIGl0IGNhbiBoYXZlIGFuIG9wdGlvbiBmbGFnCisgICAgICogdG8gdHJpZ2dlciBjZXJ0YWluIGJlaGF2aW9yLiBNb3N0IGZsYWdzIGFyZSB1c2VkIHRvIHRyaWdnZXIgY2hhbm5lbCBpbnRlcmNlcHRvcnMKKyAgICAgKiBhcyB0aGUgbWVzc2FnZSBwYXNzZXMgdGhyb3VnaCB0aGUgY2hhbm5lbCBzdGFjay4gPGJyPgorICAgICAqIEhvd2V2ZXIsIHRoZXJlIGFyZSBmb3VyIGRlZmF1bHQgZmxhZ3MgdGhhdCBldmVyeSBjaGFubmVsIGltcGxlbWVudGF0aW9uIG11c3QgaW1wbGVtZW50PGJyPgorICAgICAqIFNFTkRfT1BUSU9OU19ERUZBVUxUIC0gdGhlIGRlZmF1bHQgc2VuZGluZyBvcHRpb25zLCBqdXN0IGEgaGVscGVyIHZhcmlhYmxlLiA8YnI+CisgICAgICogVGhlIGRlZmF1bHQgaXMgPGNvZGU+aW50IFNFTkRfT1BUSU9OU19ERUZBVUxUID0gU0VORF9PUFRJT05TX1VTRV9BQ0s7PC9jb2RlPjxicj4KKyAgICAgKiBAc2VlICNTRU5EX09QVElPTlNfVVNFX0FDSworICAgICAqIEBzZWUgI3NlbmQoTWVtYmVyW10sIFNlcmlhbGl6YWJsZSAsIGludCkKKyAgICAgKiBAc2VlICNzZW5kKE1lbWJlcltdLCBTZXJpYWxpemFibGUsIGludCwgRXJyb3JIYW5kbGVyKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTkRfT1BUSU9OU19ERUZBVUxUID0gU0VORF9PUFRJT05TX1VTRV9BQ0s7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGludGVyY2VwdG9yIHRvIHRoZSBjaGFubmVsIG1lc3NhZ2UgY2hhaW4uCisgICAgICogQHBhcmFtIGludGVyY2VwdG9yIENoYW5uZWxJbnRlcmNlcHRvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEludGVyY2VwdG9yKENoYW5uZWxJbnRlcmNlcHRvciBpbnRlcmNlcHRvcik7CisgICAgCisgICAgLyoqCisgICAgICogU3RhcnRzIHVwIHRoZSBjaGFubmVsLiBUaGlzIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGluZGl2aWR1YWwgc2VydmljZXMgdG8gc3RhcnQKKyAgICAgKiBUaGUgc3ZjIHBhcmFtZXRlciBjYW4gYmUgdGhlIGxvZ2ljYWwgb3IgdmFsdWUgb2YgYW55IGNvbnN0YW50cworICAgICAqIEBwYXJhbSBzdmMgaW50IHZhbHVlIG9mIDxCUj4KKyAgICAgKiBERUZBVUxUIC0gd2lsbCBzdGFydCBhbGwgc2VydmljZXMgPEJSPgorICAgICAqIE1CUl9SWF9TRVEgLSBzdGFydHMgdGhlIG1lbWJlcnNoaXAgcmVjZWl2ZXIgPEJSPgorICAgICAqIE1CUl9UWF9TRVEgLSBzdGFydHMgdGhlIG1lbWJlcnNoaXAgYnJvYWRjYXN0ZXIgPEJSPgorICAgICAqIFNORF9UWF9TRVEgLSBzdGFydHMgdGhlIHJlcGxpY2F0aW9uIHRyYW5zbWl0dGVyPEJSPgorICAgICAqIFNORF9SWF9TRVEgLSBzdGFydHMgdGhlIHJlcGxpY2F0aW9uIHJlY2VpdmVyPEJSPgorICAgICAqIDxiPk5vdGU6PC9iPiBJbiBvcmRlciBmb3IgdGhlIG1lbWJlcnNoaXAgYnJvYWRjYXN0ZXIgdG8gCisgICAgICogdHJhbnNtaXQgdGhlIGNvcnJlY3QgaW5mb3JtYXRpb24sIGl0IGhhcyB0byBiZSBzdGFydGVkIGFmdGVyIHRoZSByZXBsaWNhdGlvbiByZWNlaXZlci4KKyAgICAgKiBAdGhyb3dzIENoYW5uZWxFeGNlcHRpb24gaWYgYSBzdGFydHVwIGVycm9yIG9jY3VycyBvciB0aGUgc2VydmljZSBpcyBhbHJlYWR5IHN0YXJ0ZWQgb3IgYW4gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGludCBzdmMpIHRocm93cyBDaGFubmVsRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2h1dHMgZG93biB0aGUgY2hhbm5lbC4gVGhpcyBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBpbmRpdmlkdWFsIHNlcnZpY2VzIHRvIHNodXRkb3duCisgICAgICogVGhlIHN2YyBwYXJhbWV0ZXIgY2FuIGJlIHRoZSBsb2dpY2FsIG9yIHZhbHVlIG9mIGFueSBjb25zdGFudHMKKyAgICAgKiBAcGFyYW0gc3ZjIGludCB2YWx1ZSBvZiA8QlI+CisgICAgICogREVGQVVMVCAtIHdpbGwgc2h1dGRvd24gYWxsIHNlcnZpY2VzIDxCUj4KKyAgICAgKiBNQlJfUlhfU0VRIC0gc3RvcHMgdGhlIG1lbWJlcnNoaXAgcmVjZWl2ZXIgPEJSPgorICAgICAqIE1CUl9UWF9TRVEgLSBzdG9wcyB0aGUgbWVtYmVyc2hpcCBicm9hZGNhc3RlciA8QlI+CisgICAgICogU05EX1RYX1NFUSAtIHN0b3BzIHRoZSByZXBsaWNhdGlvbiB0cmFuc21pdHRlcjxCUj4KKyAgICAgKiBTTkRfUlhfU0VRIC0gc3RvcHMgdGhlIHJlcGxpY2F0aW9uIHJlY2VpdmVyPEJSPgorICAgICAqIEB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiBpZiBhIHN0YXJ0dXAgZXJyb3Igb2NjdXJzIG9yIHRoZSBzZXJ2aWNlIGlzIGFscmVhZHkgc3RvcHBlZCBvciBhbiBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcChpbnQgc3ZjKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbjsgICAgCisgICAgCisgICAgLyoqCisgICAgICogU2VuZCBhIG1lc3NhZ2UgdG8gb25lIG9yIG1vcmUgbWVtYmVycyBpbiB0aGUgY2x1c3RlcgorICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBNZW1iZXJbXSAtIHRoZSBkZXN0aW5hdGlvbnMsIGNhbiBub3QgYmUgbnVsbCBvciB6ZXJvIGxlbmd0aCwgdGhlIHJlYXNvbiBmb3IgdGhhdAorICAgICAqIGlzIHRoYXQgYSBtZW1iZXJzaGlwIGNoYW5nZSBjYW4gb2NjdXIgYW5kIGF0IHRoYXQgdGltZSB0aGUgYXBwbGljYXRpb24gaXMgdW5jZXJ0YWluIHdoYXQgZ3JvdXAgdGhlIG1lc3NhZ2UKKyAgICAgKiBhY3R1YWxseSBnb3Qgc2VudCB0by4KKyAgICAgKiBAcGFyYW0gbXNnIFNlcmlhbGl6YWJsZSAtIHRoZSBtZXNzYWdlIHRvIHNlbmQsIGhhcyB0byBiZSBzZXJpYWxpemFibGUsIG9yIGEgPGNvZGU+Qnl0ZU1lc3NhZ2U8L2NvZGU+IHRvIAorICAgICAqIHNlbmQgYSBwdXJlIGJ5dGUgYXJyYXkKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBpbnQgLSBzZW5kZXIgb3B0aW9ucywgc2VlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIGVhY2ggaW50ZXJjZXB0b3IgdGhhdCBpcyBjb25maWd1cmVkIGluIG9yZGVyIHRvIHRyaWdnZXIgaW50ZXJjZXB0b3JzCisgICAgICogQHJldHVybiBhIHVuaXF1ZSBJZCB0aGF0IGlkZW50aWZpZXMgdGhlIG1lc3NhZ2UgdGhhdCBpcyBzZW50CisgICAgICogQHNlZSBCeXRlTWVzc2FnZQorICAgICAqIEBzZWUgI1NFTkRfT1BUSU9OU19VU0VfQUNLCisgICAgICogQHNlZSAjU0VORF9PUFRJT05TX0FTWU5DSFJPTk9VUworICAgICAqIEBzZWUgI1NFTkRfT1BUSU9OU19TWU5DSFJPTklaRURfQUNLCisgICAgICovCisgICAgcHVibGljIFVuaXF1ZUlkIHNlbmQoTWVtYmVyW10gZGVzdGluYXRpb24sIFNlcmlhbGl6YWJsZSBtc2csIGludCBvcHRpb25zKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNlbmQgYSBtZXNzYWdlIHRvIG9uZSBvciBtb3JlIG1lbWJlcnMgaW4gdGhlIGNsdXN0ZXIKKyAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gTWVtYmVyW10gLSB0aGUgZGVzdGluYXRpb25zLCBudWxsIG9yIHplcm8gbGVuZ3RoIG1lYW5zIGFsbAorICAgICAqIEBwYXJhbSBtc2cgQ2x1c3Rlck1lc3NhZ2UgLSB0aGUgbWVzc2FnZSB0byBzZW5kCisgICAgICogQHBhcmFtIG9wdGlvbnMgaW50IC0gc2VuZGVyIG9wdGlvbnMsIHNlZSBjbGFzcyBkb2N1bWVudGF0aW9uCisgICAgICogQHBhcmFtIGhhbmRsZXIgRXJyb3JIYW5kbGVyIC0gaGFuZGxlIGVycm9ycyB0aHJvdWdoIGEgY2FsbGJhY2ssIHJhdGhlciB0aGFuIHRocm93IGl0CisgICAgICogQHJldHVybiBhIHVuaXF1ZSBJZCB0aGF0IGlkZW50aWZpZXMgdGhlIG1lc3NhZ2UgdGhhdCBpcyBzZW50CisgICAgICogQGV4Y2VwdGlvbiBDaGFubmVsRXhjZXB0aW9uIC0gaWYgYSBzZXJpYWxpemF0aW9uIGVycm9yIGhhcHBlbnMuCisgICAgICovCisgICAgcHVibGljIFVuaXF1ZUlkIHNlbmQoTWVtYmVyW10gZGVzdGluYXRpb24sIFNlcmlhbGl6YWJsZSBtc2csIGludCBvcHRpb25zLCBFcnJvckhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIENoYW5uZWxFeGNlcHRpb247CisgICAgCisgICAgLyoqCisgICAgICogU2VuZHMgYSBoZWFydCBiZWF0IHRocm91Z2ggdGhlIGludGVyY2VwdG9yIHN0YWNrcworICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byBhbGVydCBpbnRlcmNlcHRvcnMgYW5kIG90aGVyIGNvbXBvbmVudHMgdG8gCisgICAgICogY2xlYW4gdXAgZ2FyYmFnZSwgdGltZWQgb3V0IG1lc3NhZ2VzIGV0Yy48YnI+CisgICAgICogSWYgeW91IGFwcGxpY2F0aW9uIGhhcyBhIGJhY2tncm91bmQgdGhyZWFkLCB0aGVuIHlvdSBjYW4gc2F2ZSBvbmUgdGhyZWFkLAorICAgICAqIGJ5IGNvbmZpZ3VyaW5nIHlvdXIgY2hhbm5lbCB0byBub3QgdXNlIGFuIGludGVybmFsIGhlYXJ0YmVhdCB0aHJlYWQKKyAgICAgKiBhbmQgaW52b2tpbmcgdGhpcyBtZXRob2QuCisgICAgICogQHNlZSAjc2V0SGVhcnRiZWF0KGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGVhcnRiZWF0KCk7CisgICAgCisgICAgLyoqCisgICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBpbnRlcm5hbCBoZWFydGJlYXQuCisgICAgICogQHBhcmFtIGVuYWJsZSBib29sZWFuIC0gZGVmYXVsdCB2YWx1ZSBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYworICAgICAqIEBzZWUgI2hlYXJ0YmVhdCgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGVhcnRiZWF0KGJvb2xlYW4gZW5hYmxlKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgYSBtZW1iZXJzaGlwIGxpc3RlbmVyLCB3aWxsIGdldCBub3RpZmllZCB3aGVuIGEgbmV3IG1lbWJlciBqb2lucywgbGVhdmVzIG9yIGNyYXNoZXMKKyAgICAgKiA8YnI+SWYgdGhlIG1lbWJlcnNoaXAgbGlzdGVuZXIgaW1wbGVtZW50cyB0aGUgSGVhcnRiZWF0IGludGVyZmFjZQorICAgICAqIHRoZSA8Y29kZT5oZWFydGJlYXQoKTwvY29kZT4gbWV0aG9kIHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSBoZWFydGJlYXQgcnVucyBvbiB0aGUgY2hhbm5lbAorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBNZW1iZXJzaGlwTGlzdGVuZXIKKyAgICAgKiBAc2VlIE1lbWJlcnNoaXBMaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1lbWJlcnNoaXBMaXN0ZW5lcihNZW1iZXJzaGlwTGlzdGVuZXIgbGlzdGVuZXIpOworICAgIAorICAgIC8qKgorICAgICAqIEFkZCBhIGNoYW5uZWwgbGlzdGVuZXIsIHRoaXMgaXMgYSBjYWxsYmFjayBvYmplY3Qgd2hlbiBtZXNzYWdlcyBhcmUgcmVjZWl2ZWQKKyAgICAgKiA8YnI+SWYgdGhlIGNoYW5uZWwgbGlzdGVuZXIgaW1wbGVtZW50cyB0aGUgSGVhcnRiZWF0IGludGVyZmFjZQorICAgICAqIHRoZSA8Y29kZT5oZWFydGJlYXQoKTwvY29kZT4gbWV0aG9kIHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSBoZWFydGJlYXQgcnVucyBvbiB0aGUgY2hhbm5lbAorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBDaGFubmVsTGlzdGVuZXIKKyAgICAgKiBAc2VlIENoYW5uZWxMaXN0ZW5lcgorICAgICAqIEBzZWUgSGVhcnRiZWF0CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ2hhbm5lbExpc3RlbmVyKENoYW5uZWxMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUgYSBtZW1iZXJzaGlwIGxpc3RlbmVyLCBsaXN0ZW5lcnMgYXJlIHJlbW92ZWQgYmFzZWQgb24gT2JqZWN0Lmhhc2hDb2RlIGFuZCBPYmplY3QuZXF1YWxzCisgICAgICogQHBhcmFtIGxpc3RlbmVyIE1lbWJlcnNoaXBMaXN0ZW5lcgorICAgICAqIEBzZWUgTWVtYmVyc2hpcExpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTWVtYmVyc2hpcExpc3RlbmVyKE1lbWJlcnNoaXBMaXN0ZW5lciBsaXN0ZW5lcik7CisgICAgLyoqCisgICAgICogcmVtb3ZlIGEgY2hhbm5lbCBsaXN0ZW5lciwgbGlzdGVuZXJzIGFyZSByZW1vdmVkIGJhc2VkIG9uIE9iamVjdC5oYXNoQ29kZSBhbmQgT2JqZWN0LmVxdWFscworICAgICAqIEBwYXJhbSBsaXN0ZW5lciBDaGFubmVsTGlzdGVuZXIKKyAgICAgKiBAc2VlIENoYW5uZWxMaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNoYW5uZWxMaXN0ZW5lcihDaGFubmVsTGlzdGVuZXIgbGlzdGVuZXIpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IG1lbWJlcnMgaW4gdGhlIGdyb3VwLAorICAgICAqIHRoaXMgY2FsbCBpcyB0aGUgc2FtZSBhcyA8Y29kZT5nZXRNZW1iZXJzKCkubGVuZ3RoPjA8L2NvZGU+CisgICAgICogQHJldHVybiBib29sZWFuIC0gdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IG1lbWJlcnMgYXV0b21hdGljYWxseSBkaXNjb3ZlcmVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTWVtYmVycygpIDsKKworICAgIC8qKgorICAgICAqIEdldCBhbGwgY3VycmVudCBncm91cCBtZW1iZXJzCisgICAgICogQHJldHVybiBhbGwgbWVtYmVycyBvciBlbXB0eSBhcnJheSwgbmV2ZXIgbnVsbCAKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyW10gZ2V0TWVtYmVycygpIDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGlzIG5vZGUuIFRoaXMgaXMgYWxzbyB0aGUgZGF0YQorICAgICAqIHRoYXQgZ2V0cyBicm9hZGNhc3RlZCB0aHJvdWdoIHRoZSBtZW1iZXJzaGlwIGJyb2FkY2FzdGVyIGNvbXBvbmVudAorICAgICAqIEBwYXJhbSBpbmNBbGl2ZSAtIG9wdGltaXphdGlvbiwgdHJ1ZSBpZiB5b3Ugd2FudCBpdCB0byBjYWxjdWxhdGUgYWxpdmUgdGltZQorICAgICAqIHNpbmNlIHRoZSBtZW1iZXJzaGlwIHNlcnZpY2Ugc3RhcnRlZC4KKyAgICAgKiBAcmV0dXJuIE1lbWJlcgorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXIgZ2V0TG9jYWxNZW1iZXIoYm9vbGVhbiBpbmNBbGl2ZSk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWVtYmVyIGZyb20gdGhlIG1lbWJlcnNoaXAgc2VydmljZSB3aXRoIGNvbXBsZXRlIGFuZCAKKyAgICAgKiByZWNlbnQgZGF0YS4gU29tZSBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgc2VyaWFsaXplIGFuZCBzZW5kIAorICAgICAqIG1lbWJlcnNoaXAgaW5mb3JtYXRpb24gYWxvbmcgd2l0aCBhIG1lc3NhZ2UsIGFuZCBpbnN0ZWFkIG9mIHNlbmRpbmcKKyAgICAgKiBjb21wbGV0ZSBtZW1iZXJzaGlwIGRldGFpbHMsIG9ubHkgc2VuZCB0aGUgcHJpbWFyeSBpZGVudGlmaWVyIGZvciB0aGUgbWVtYmVyCisgICAgICogYnV0IG5vdCB0aGUgcGF5bG9hZCBvciBvdGhlciBpbmZvcm1hdGlvbi4gV2hlbiBzdWNoIG1lc3NhZ2UgaXMgcmVjZWl2ZWQKKyAgICAgKiB0aGUgYXBwbGljYXRpb24gY2FuIHJldHJpZXZlIHRoZSBjYWNoZWQgbWVtYmVyIHRocm91Z2ggdGhpcyBjYWxsLjxicj4KKyAgICAgKiBJbiBtb3N0IGNhc2VzLCB0aGlzIGlzIG5vdCBuZWNlc3NhcnkuCisgICAgICogQHBhcmFtIG1iciBNZW1iZXIKKyAgICAgKiBAcmV0dXJuIE1lbWJlcgorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXIgZ2V0TWVtYmVyKE1lbWJlciBtYnIpOworCisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvQ2hhbm5lbEV4Y2VwdGlvbi5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL0NoYW5uZWxFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTE5ZGFhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL0NoYW5uZWxFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBDaGFubmVsIEV4Y2VwdGlvbjxicj4KKyAqIEEgY2hhbm5lbCBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYW4gaW50ZXJuYWwgZXJyb3IgaGFwcGVucworICogc29tZXdoZXJlIGluIHRoZSBjaGFubmVsLiA8YnI+CisgKiBXaGVuIGEgZ2xvYmFsIGVycm9yIGhhcHBlbnMsIHRoZSBjYXVzZSBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIDxjb2RlPmdldENhdXNlKCk8L2NvZGU+PGJyPjxicj4KKyAqIElmIGFuIGFwcGxpY2F0aW9uIGlzIHNlbmRpbmcgYSBtZXNzYWdlIGFuZCBzb21lIG9mIHRoZSByZWNpcGllbnRzIGZhaWwgdG8gcmVjZWl2ZSBpdCwKKyAqIHRoZSBhcHBsaWNhdGlvbiBjYW4gcmV0cmlldmUgd2hhdCByZWNpcGllbnRzIGZhaWxlZCBieSB1c2luZyB0aGUgPGNvZGU+Z2V0RmF1bHR5TWVtYmVycygpPC9jb2RlPgorICogbWV0aG9kLiBUaGlzIHdheSwgYW4gYXBwbGljYXRpb24gd2lsbCBhbHdheXMga25vdyBpZiBhIG1lc3NhZ2Ugd2FzIGRlbGl2ZXJlZCBzdWNjZXNzZnVsbHkgb3Igbm90LgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENoYW5uZWxFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworICAgIC8qCisgICAgICogSG9sZHMgYSBsaXN0IG9mIGZhdWx0eSBtZW1iZXJzCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3QgZmF1bHR5TWVtYmVycz1udWxsOworICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLCBjcmVhdGVzIGEgQ2hhbm5lbEV4Y2VwdGlvbgorICAgICAqIEBzZWUgamF2YS5sYW5nLkV4Y2VwdGlvbiNFeGNlcHRpb24oKQorICAgICAqLworICAgIHB1YmxpYyBDaGFubmVsRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLCBjcmVhdGVzIGEgQ2hhbm5lbEV4Y2VwdGlvbiB3aXRoIGFuIGVycm9yIG1lc3NhZ2UKKyAgICAgKiBAc2VlIGphdmEubGFuZy5FeGNlcHRpb24jRXhjZXB0aW9uKFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhbm5lbEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciwgY3JlYXRlcyBhIENoYW5uZWxFeGNlcHRpb24gd2l0aCBhbiBlcnJvciBtZXNzYWdlIGFuZCBhIGNhdXNlCisgICAgICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCisgICAgICogQHBhcmFtIGNhdXNlIFRocm93YWJsZQorICAgICAqIEBzZWUgamF2YS5sYW5nLkV4Y2VwdGlvbiNFeGNlcHRpb24oU3RyaW5nLFRocm93YWJsZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhbm5lbEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciwgY3JlYXRlcyBhIENoYW5uZWxFeGNlcHRpb24gd2l0aCBhIGNhdXNlCisgICAgICogQHBhcmFtIGNhdXNlIFRocm93YWJsZQorICAgICAqIEBzZWUgamF2YS5sYW5nLkV4Y2VwdGlvbiNFeGNlcHRpb24oVGhyb3dhYmxlKQorICAgICAqLworICAgIHB1YmxpYyBDaGFubmVsRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihjYXVzZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uCisgICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKiBAc2VlIGphdmEubGFuZy5FeGNlcHRpb24jZ2V0TWVzc2FnZSgpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci5nZXRNZXNzYWdlKCkpOworICAgICAgICBpZiAoZmF1bHR5TWVtYmVycz09bnVsbCB8fCBmYXVsdHlNZW1iZXJzLnNpemUoKSA9PSAwICkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiOyBObyBmYXVsdHkgbWVtYmVycyBpZGVudGlmaWVkLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiOyBGYXVsdHkgbWVtYmVyczoiKTsKKyAgICAgICAgICAgIGZvciAoIGludCBpPTA7IGk8ZmF1bHR5TWVtYmVycy5zaXplKCk7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBGYXVsdHlNZW1iZXIgbWJyID0gKEZhdWx0eU1lbWJlcilmYXVsdHlNZW1iZXJzLmdldChpKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKG1ici5nZXRNZW1iZXIoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjsgIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZmF1bHR5IG1lbWJlciwgYW5kIHRoZSByZWFzb24gdGhlIG1lbWJlciBmYWlsZWQuCisgICAgICogQHBhcmFtIG1iciBNZW1iZXIKKyAgICAgKiBAcGFyYW0geCBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGYXVsdHlNZW1iZXIoTWVtYmVyIG1iciwgRXhjZXB0aW9uIHggKSB7CisgICAgICAgIGFkZEZhdWx0eU1lbWJlcihuZXcgRmF1bHR5TWVtYmVyKG1icix4KSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEFkZHMgYSBsaXN0IG9mIGZhdWx0eSBtZW1iZXJzCisgICAgICogQHBhcmFtIG1icnMgRmF1bHR5TWVtYmVyW10KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGYXVsdHlNZW1iZXIoRmF1bHR5TWVtYmVyW10gbWJycykgeworICAgICAgICBmb3IgKGludCBpPTA7IG1icnMhPW51bGwgJiYgaTxtYnJzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgYWRkRmF1bHR5TWVtYmVyKG1icnNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGZhdWx0eSBtZW1iZXIKKyAgICAgKiBAcGFyYW0gbWJyIEZhdWx0eU1lbWJlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZhdWx0eU1lbWJlcihGYXVsdHlNZW1iZXIgbWJyKSB7CisgICAgICAgIGlmICggdGhpcy5mYXVsdHlNZW1iZXJzPT1udWxsICkgdGhpcy5mYXVsdHlNZW1iZXJzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmYXVsdHlNZW1iZXJzLmFkZChtYnIpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG1lbWJlcnMgdGhhdCBmYWlsZWQgYW5kIHRoZSByZWFzb24gdGhleSBmYWlsZWQuCisgICAgICogQHJldHVybiBGYXVsdHlNZW1iZXJbXQorICAgICAqLworICAgIHB1YmxpYyBGYXVsdHlNZW1iZXJbXSBnZXRGYXVsdHlNZW1iZXJzKCkgeworICAgICAgICBpZiAoIHRoaXMuZmF1bHR5TWVtYmVycz09bnVsbCApIHJldHVybiBuZXcgRmF1bHR5TWVtYmVyWzBdOworICAgICAgICByZXR1cm4gKEZhdWx0eU1lbWJlcltdKWZhdWx0eU1lbWJlcnMudG9BcnJheShuZXcgRmF1bHR5TWVtYmVyW2ZhdWx0eU1lbWJlcnMuc2l6ZSgpXSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIAorICAgICAqIDxwPlRpdGxlOiBGYXVsdHlNZW1iZXIgY2xhc3M8L3A+IAorICAgICAqIAorICAgICAqIDxwPkRlc2NyaXB0aW9uOiBSZXByZXNlbnQgYSBmYWlsdXJlIHRvIGEgc3BlY2lmaWMgbWVtYmVyIHdoZW4gYSBtZXNzYWdlIHdhcyBzZW50CisgICAgICogdG8gbW9yZSB0aGFuIG9uZSBtZW1iZXI8L3A+IAorICAgICAqIAorICAgICAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAgICAgKiBAdmVyc2lvbiAxLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhdWx0eU1lbWJlciB7CisgICAgICAgIHByb3RlY3RlZCBFeGNlcHRpb24gY2F1c2U7CisgICAgICAgIHByb3RlY3RlZCBNZW1iZXIgbWVtYmVyOworICAgICAgICBwdWJsaWMgRmF1bHR5TWVtYmVyKE1lbWJlciBtYnIsIEV4Y2VwdGlvbiB4KSB7IAorICAgICAgICAgICAgdGhpcy5tZW1iZXIgPSBtYnI7CisgICAgICAgICAgICB0aGlzLmNhdXNlID0geDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIE1lbWJlciBnZXRNZW1iZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbWVtYmVyOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgRXhjZXB0aW9uIGdldENhdXNlKCkgeworICAgICAgICAgICAgcmV0dXJuIGNhdXNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJGYXVsdHlNZW1iZXI6IittZW1iZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL0NoYW5uZWxJbnRlcmNlcHRvci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL0NoYW5uZWxJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Yzg1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvQ2hhbm5lbEludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkludGVyY2VwdG9yUGF5bG9hZDsKKworLyoqCisgKiBBIENoYW5uZWxJbnRlcmNlcHRvciBpcyBhbiBpbnRlcmNlcHRvciB0aGF0IGludGVyY2VwdHMgCisgKiBtZXNzYWdlcyBhbmQgbWVtYmVyc2hpcCBtZXNzYWdlcyBpbiB0aGUgY2hhbm5lbCBzdGFjay4KKyAqIFRoaXMgYWxsb3dzIGludGVyY2VwdG9ycyB0byBtb2RpZnkgdGhlIG1lc3NhZ2Ugb3IgcGVyZm9ybQorICogb3RoZXIgYWN0aW9ucyB3aGVuIGEgbWVzc2FnZSBpcyBzZW50IG9yIHJlY2VpdmVkLjxicj4KKyAqIEludGVyY2VwdG9ycyBhcmUgdGllZCB0b2dldGhlciBpbiBhIGxpbmtlZCBsaXN0LgorICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5DaGFubmVsSW50ZXJjZXB0b3JCYXNlCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLyAgIAorCitwdWJsaWMgaW50ZXJmYWNlIENoYW5uZWxJbnRlcmNlcHRvciBleHRlbmRzIE1lbWJlcnNoaXBMaXN0ZW5lciwgSGVhcnRiZWF0IHsKKworICAgIC8qKgorICAgICAqIEFuIGludGVyY2VwdG9yIGNhbiByZWFjdCB0byBhIG1lc3NhZ2UgYmFzZWQgb24gYSBzZXQgYml0IG9uIHRoZSAKKyAgICAgKiBtZXNzYWdlIG9wdGlvbnMuIDxicj4KKyAgICAgKiBXaGVuIGEgbWVzc2FnZSBpcyBzZW50LCB0aGUgb3B0aW9ucyBjYW4gYmUgcmV0cmlldmVkIGZyb20gQ2hhbm5lbE1lc3NhZ2UuZ2V0T3B0aW9ucygpCisgICAgICogYW5kIGlmIHRoZSBiaXQgaXMgc2V0LCB0aGlzIGludGVyY2VwdG9yIHdpbGwgcmVhY3QgdG8gaXQuPGJyPgorICAgICAqIEEgc2ltcGxlIGV2YWx1YXRpb24gaWYgYW4gaW50ZXJjZXB0b3Igc2hvdWxkIHJlYWN0IHRvIHRoZSBtZXNzYWdlIHdvdWxkIGJlOjxicj4KKyAgICAgKiA8Y29kZT5ib29sZWFuIHJlYWN0ID0gKGdldE9wdGlvbkZsYWcoKSA9PSAoZ2V0T3B0aW9uRmxhZygpICYgQ2hhbm5lbE1lc3NhZ2UuZ2V0T3B0aW9ucygpKSk7PC9jb2RlPjxicj4KKyAgICAgKiBUaGUgZGVmYXVsdCBvcHRpb24gaXMgMCwgbWVhbmluZyB0aGVyZSBpcyBubyB3YXkgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byB0cmlnZ2VyIHRoZQorICAgICAqIGludGVyY2VwdG9yLiBUaGUgaW50ZXJjZXB0b3IgaXRzZWxmIHdpbGwgZGVjaWRlLjxicj4KKyAgICAgKiBAcmV0dXJuIGludAorICAgICAqIEBzZWUgQ2hhbm5lbE1lc3NhZ2UjZ2V0T3B0aW9ucygpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRPcHRpb25GbGFnKCk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3B0aW9uIGZsYWcKKyAgICAgKiBAcGFyYW0gZmxhZyBpbnQKKyAgICAgKiBAc2VlICNnZXRPcHRpb25GbGFnKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb25GbGFnKGludCBmbGFnKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmV4dCBpbnRlcmNlcHRvciBpbiB0aGUgbGlzdCBvZiBpbnRlcmNlcHRvcnMKKyAgICAgKiBAcGFyYW0gbmV4dCBDaGFubmVsSW50ZXJjZXB0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROZXh0KENoYW5uZWxJbnRlcmNlcHRvciBuZXh0KSA7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgbmV4dCBpbnRlcmNlcHRvciBpbiB0aGUgbGlzdAorICAgICAqIEByZXR1cm4gQ2hhbm5lbEludGVyY2VwdG9yIC0gcmV0dXJucyB0aGUgbmV4dCBpbnRlcmNlcHRvciBpbiB0aGUgbGlzdCBvciBudWxsIGlmIG5vIG1vcmUgaW50ZXJjZXB0b3JzIGV4aXN0CisgICAgICovCisgICAgcHVibGljIENoYW5uZWxJbnRlcmNlcHRvciBnZXROZXh0KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHByZXZpb3VzIGludGVyY2VwdG9yIGluIHRoZSBsaXN0CisgICAgICogQHBhcmFtIHByZXZpb3VzIENoYW5uZWxJbnRlcmNlcHRvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZXZpb3VzKENoYW5uZWxJbnRlcmNlcHRvciBwcmV2aW91cyk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgcHJldmlvdXMgaW50ZXJjZXB0b3IgaW4gdGhlIGxpc3QKKyAgICAgKiBAcmV0dXJuIENoYW5uZWxJbnRlcmNlcHRvciAtIHJldHVybnMgdGhlIHByZXZpb3VzIGludGVyY2VwdG9yIGluIHRoZSBsaXN0IG9yIG51bGwgaWYgbm8gbW9yZSBpbnRlcmNlcHRvcnMgZXhpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhbm5lbEludGVyY2VwdG9yIGdldFByZXZpb3VzKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+c2VuZE1lc3NhZ2U8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgYmVpbmcgc2VudCB0byBvbmUgbW9yZSBkZXN0aW5hdGlvbnMuCisgICAgICogVGhlIGludGVyY2VwdG9yIGNhbiBtb2RpZnkgYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGVuIHBhc3Mgb24gdGhlIG1lc3NhZ2UgZG93biB0aGUgc3RhY2sgYnkKKyAgICAgKiBpbnZva2luZyA8Y29kZT5nZXROZXh0KCkuc2VuZE1lc3NhZ2UoZGVzdGluYXRpb24sbXNnLHBheWxvYWQpPC9jb2RlPjxicj4KKyAgICAgKiBBbHRlcm5hdGl2ZWx5IHRoZSBpbnRlcmNlcHRvciBjYW4gc3RvcCB0aGUgbWVzc2FnZSBmcm9tIGJlaW5nIHNlbnQgYnkgbm90IGludm9raW5nIAorICAgICAqIDxjb2RlPmdldE5leHQoKS5zZW5kTWVzc2FnZShkZXN0aW5hdGlvbixtc2cscGF5bG9hZCk8L2NvZGU+PGJyPgorICAgICAqIElmIHRoZSBtZXNzYWdlIGlzIHRvIGJlIHNlbnQgYXN5bmNocm9ub3VzIHRoZSBhcHBsaWNhdGlvbiBjYW4gYmUgbm90aWZpZWQgb2YgY29tcGxldGlvbiBhbmQgCisgICAgICogZXJyb3JzIGJ5IHBhc3NpbmcgaW4gYW4gZXJyb3IgaGFuZGxlciBhdHRhY2hlZCB0byBhIHBheWxvYWQgb2JqZWN0Ljxicj4KKyAgICAgKiBUaGUgQ2hhbm5lbE1lc3NhZ2UuZ2V0QWRkcmVzcyBjb250YWlucyBDaGFubmVsLmdldExvY2FsTWVtYmVyLCBhbmQgY2FuIGJlIG92ZXJ3cml0dGVuIAorICAgICAqIHRvIHNpbXVsYXRlIGEgbWVzc2FnZSBzZW50IGZyb20gYW5vdGhlciBub2RlLjxicj4KKyAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gTWVtYmVyW10gLSB0aGUgZGVzdGluYXRpb24gZm9yIHRoaXMgbWVzc2FnZQorICAgICAqIEBwYXJhbSBtc2cgQ2hhbm5lbE1lc3NhZ2UgLSB0aGUgbWVzc2FnZSB0byBiZSBzZW50CisgICAgICogQHBhcmFtIHBheWxvYWQgSW50ZXJjZXB0b3JQYXlsb2FkIC0gdGhlIHBheWxvYWQsIGNhcnJ5aW5nIGFuIGVycm9yIGhhbmRsZXIgYW5kIGZ1dHVyZSB1c2VmdWwgZGF0YSwgY2FuIGJlIG51bGwKKyAgICAgKiBAdGhyb3dzIENoYW5uZWxFeGNlcHRpb24KKyAgICAgKiBAc2VlIEVycm9ySGFuZGxlcgorICAgICAqIEBzZWUgSW50ZXJjZXB0b3JQYXlsb2FkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoTWVtYmVyW10gZGVzdGluYXRpb24sIENoYW5uZWxNZXNzYWdlIG1zZywgSW50ZXJjZXB0b3JQYXlsb2FkIHBheWxvYWQpIHRocm93cyBDaGFubmVsRXhjZXB0aW9uOworICAgIAorICAgIC8qKgorICAgICAqIHRoZSA8Y29kZT5tZXNzYWdlUmVjZWl2ZWQ8L2NvZGU+IGlzIGludm9rZWQgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuCisgICAgICogPGNvZGU+Q2hhbm5lbE1lc3NhZ2UuZ2V0QWRkcmVzcygpPC9jb2RlPiBpcyB0aGUgc2VuZGVyLCBvciB0aGUgcmVwbHktdG8gYWRkcmVzcworICAgICAqIGlmIGl0IGhhcyBiZWVuIG92ZXJ3cml0dGVuLgorICAgICAqIEBwYXJhbSBkYXRhIENoYW5uZWxNZXNzYWdlCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKENoYW5uZWxNZXNzYWdlIGRhdGEpOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5oZWFydGJlYXQoKTwvY29kZT4gbWV0aG9kIGdldHMgaW52b2tlZCBwZXJpb2RpY2FsbHkKKyAgICAgKiB0byBhbGxvdyBpbnRlcmNlcHRvcnMgdG8gY2xlYW4gdXAgcmVzb3VyY2VzLCB0aW1lIG91dCBvYmplY3QgYW5kIAorICAgICAqIHBlcmZvcm0gYWN0aW9ucyB0aGF0IGFyZSB1bnJlbGF0ZWQgdG8gc2VuZGluZy9yZWNlaXZpbmcgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoZWFydGJlYXQoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBJbnRlcmNlcHRzIHRoZSA8Y29kZT5DaGFubmVsLmhhc01lbWJlcnMoKTwvY29kZT4gbWV0aG9kCisgICAgICogQHJldHVybiBib29sZWFuIC0gaWYgdGhlIGNoYW5uZWwgaGFzIG1lbWJlcnMgaW4gaXRzIG1lbWJlcnNoaXAgZ3JvdXAKKyAgICAgKiBAc2VlIENoYW5uZWwjaGFzTWVtYmVycygpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTWVtYmVycygpIDsKKworICAgIC8qKgorICAgICAqIEludGVyY2VwdHMgdGhlIGNvZGU+Q2hhbm5lbC5nZXRNZW1iZXJzKCk8L2NvZGU+IG1ldGhvZAorICAgICAqIEByZXR1cm4gTWVtYmVyW10KKyAgICAgKiBAc2VlIENoYW5uZWwjZ2V0TWVtYmVycygpCisgICAgICovCisgICAgcHVibGljIE1lbWJlcltdIGdldE1lbWJlcnMoKSA7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmNlcHRzIHRoZSBjb2RlPkNoYW5uZWwuZ2V0TG9jYWxNZW1iZXIoYm9vbGVhbik8L2NvZGU+IG1ldGhvZAorICAgICAqIEBwYXJhbSBpbmNBbGl2ZVRpbWUgYm9vbGVhbgorICAgICAqIEByZXR1cm4gTWVtYmVyCisgICAgICogQHNlZSBDaGFubmVsI2dldExvY2FsTWVtYmVyKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBnZXRMb2NhbE1lbWJlcihib29sZWFuIGluY0FsaXZlVGltZSkgOworCisgICAgLyoqCisgICAgICogSW50ZXJjZXB0cyB0aGUgY29kZT5DaGFubmVsLmdldE1lbWJlcihNZW1iZXIpPC9jb2RlPiBtZXRob2QKKyAgICAgKiBAcGFyYW0gbWJyIE1lbWJlcgorICAgICAqIEByZXR1cm4gTWVtYmVyIC0gdGhlIGFjdHVhbCBtZW1iZXIgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBzdGF5IGFsaXZlCisgICAgICogQHNlZSBDaGFubmVsI2dldE1lbWJlcihNZW1iZXIpCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBnZXRNZW1iZXIoTWVtYmVyIG1icik7CisgICAgCisgICAgLyoqCisgICAgICogU3RhcnRzIHVwIHRoZSBjaGFubmVsLiBUaGlzIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGluZGl2aWR1YWwgc2VydmljZXMgdG8gc3RhcnQKKyAgICAgKiBUaGUgc3ZjIHBhcmFtZXRlciBjYW4gYmUgdGhlIGxvZ2ljYWwgb3IgdmFsdWUgb2YgYW55IGNvbnN0YW50cworICAgICAqIEBwYXJhbSBzdmMgaW50IHZhbHVlIG9mIDxCUj4KKyAgICAgKiBDaGFubmVsLkRFRkFVTFQgLSB3aWxsIHN0YXJ0IGFsbCBzZXJ2aWNlcyA8QlI+CisgICAgICogQ2hhbm5lbC5NQlJfUlhfU0VRIC0gc3RhcnRzIHRoZSBtZW1iZXJzaGlwIHJlY2VpdmVyIDxCUj4KKyAgICAgKiBDaGFubmVsLk1CUl9UWF9TRVEgLSBzdGFydHMgdGhlIG1lbWJlcnNoaXAgYnJvYWRjYXN0ZXIgPEJSPgorICAgICAqIENoYW5uZWwuU05EX1RYX1NFUSAtIHN0YXJ0cyB0aGUgcmVwbGljYXRpb24gdHJhbnNtaXR0ZXI8QlI+CisgICAgICogQ2hhbm5lbC5TTkRfUlhfU0VRIC0gc3RhcnRzIHRoZSByZXBsaWNhdGlvbiByZWNlaXZlcjxCUj4KKyAgICAgKiBAdGhyb3dzIENoYW5uZWxFeGNlcHRpb24gaWYgYSBzdGFydHVwIGVycm9yIG9jY3VycyBvciB0aGUgc2VydmljZSBpcyBhbHJlYWR5IHN0YXJ0ZWQuCisgICAgICogQHNlZSBDaGFubmVsCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoaW50IHN2YykgdGhyb3dzIENoYW5uZWxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTaHV0cyBkb3duIHRoZSBjaGFubmVsLiBUaGlzIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGluZGl2aWR1YWwgc2VydmljZXMgdG8gc2h1dGRvd24KKyAgICAgKiBUaGUgc3ZjIHBhcmFtZXRlciBjYW4gYmUgdGhlIGxvZ2ljYWwgb3IgdmFsdWUgb2YgYW55IGNvbnN0YW50cworICAgICAqIEBwYXJhbSBzdmMgaW50IHZhbHVlIG9mIDxCUj4KKyAgICAgKiBDaGFubmVsLkRFRkFVTFQgLSB3aWxsIHNodXRkb3duIGFsbCBzZXJ2aWNlcyA8QlI+CisgICAgICogQ2hhbm5lbC5NQlJfUlhfU0VRIC0gc3RvcHMgdGhlIG1lbWJlcnNoaXAgcmVjZWl2ZXIgPEJSPgorICAgICAqIENoYW5uZWwuTUJSX1RYX1NFUSAtIHN0b3BzIHRoZSBtZW1iZXJzaGlwIGJyb2FkY2FzdGVyIDxCUj4KKyAgICAgKiBDaGFubmVsLlNORF9UWF9TRVEgLSBzdG9wcyB0aGUgcmVwbGljYXRpb24gdHJhbnNtaXR0ZXI8QlI+CisgICAgICogQ2hhbm5lbC5TTkRfUlhfU0VRIC0gc3RvcHMgdGhlIHJlcGxpY2F0aW9uIHJlY2VpdmVyPEJSPgorICAgICAqIEB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiBpZiBhIHN0YXJ0dXAgZXJyb3Igb2NjdXJzIG9yIHRoZSBzZXJ2aWNlIGlzIGFscmVhZHkgc3RhcnRlZC4KKyAgICAgKiBAc2VlIENoYW5uZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKGludCBzdmMpIHRocm93cyBDaGFubmVsRXhjZXB0aW9uOworICAgIAorICAgIHB1YmxpYyB2b2lkIGZpcmVJbnRlcmNlcHRvckV2ZW50KEludGVyY2VwdG9yRXZlbnQgZXZlbnQpOworCisgICAgaW50ZXJmYWNlIEludGVyY2VwdG9yRXZlbnQgeworICAgICAgICBpbnQgZ2V0RXZlbnRUeXBlKCk7CisgICAgICAgIFN0cmluZyBnZXRFdmVudFR5cGVEZXNjKCk7CisgICAgICAgIENoYW5uZWxJbnRlcmNlcHRvciBnZXRJbnRlcmNlcHRvcigpOworICAgIH0KKyAgICAKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL0NoYW5uZWxMaXN0ZW5lci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL0NoYW5uZWxMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOTc3NzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvQ2hhbm5lbExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisvKioKKyAqIAorICogPHA+VGl0bGU6IENoYW5uZWxMaXN0ZW5lcjwvcD4gCisgKiAKKyAqIDxwPkRlc2NyaXB0aW9uOiBBbiBpbnRlcmZhY2UgdG8gbGlzdGVucyB0byBpbmNvbWluZyBtZXNzYWdlcyBmcm9tIGEgY2hhbm5lbCA8L3A+IAorICogV2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQsIHRoZSBDaGFubmVsIHdpbGwgaW52b2tlIHRoZSBjaGFubmVsIGxpc3RlbmVyIGluIGEgY29uZGl0aW9uYWwgc2VxdWVuY2UuCisgKiA8Y29kZT5pZiAoIGxpc3RlbmVyLmFjY2VwdChtc2csc2VuZGVyKSApIGxpc3RlbmVyLm1lc3NhZ2VSZWNlaXZlZChtc2csc2VuZGVyKTs8L2NvZGU+PGJyPgorICogQSBDaGFubmVsTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gTVVTVCBOT1QgcmV0dXJuIHRydWUgb24gPGNvZGU+YWNjZXB0KFNlcmlhbGl6YWJsZSwgTWVtYmVyKTwvY29kZT4KKyAqIGlmIGl0IGRvZXNuJ3QgaW50ZW5kIHRvIHByb2Nlc3MgdGhlIG1lc3NhZ2UuIFRoZSBjaGFubmVsIGNhbiB0aGlzIHdheSB0cmFjayB3aGV0aGVyIGEgbWVzc2FnZQorICogd2FzIHByb2Nlc3NlZCBieSBhbiBhYm92ZSBhcHBsaWNhdGlvbiBvciBpZiBpdCB3YXMganVzdCByZWNlaXZlZCBhbmQgZm9yZ290IGFib3V0LCBhIGZlYXR1ZXIgcmVxdWlyZWQKKyAqIHRvIHN1cHBvcnQgbWVzc2FnZS1yZXNwb25zZShSUEMpIGNhbGxzPGJyPgorICogCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAxLjAKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIENoYW5uZWxMaXN0ZW5lciB7CisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlIGEgbWVzc2FnZSBmcm9tIHRoZSBjaGFubmVsCisgICAgICogQHBhcmFtIG1zZyBTZXJpYWxpemFibGUKKyAgICAgKiBAcGFyYW0gc2VuZGVyIC0gdGhlIHNvdXJjZSBvZiB0aGUgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZWNlaXZlZChTZXJpYWxpemFibGUgbXNnLCBNZW1iZXIgc2VuZGVyKTsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgYnkgdGhlIGNoYW5uZWwgdG8gZGV0ZXJtaW5lIGlmIHRoZSBsaXN0ZW5lciB3aWxsIHByb2Nlc3MgdGhpcyBtZXNzYWdlIG9yIG5vdC4KKyAgICAgKiBAcGFyYW0gbXNnIFNlcmlhbGl6YWJsZQorICAgICAqIEBwYXJhbSBzZW5kZXIgTWVtYmVyCisgICAgICogQHJldHVybiBib29sZWFuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KFNlcmlhbGl6YWJsZSBtc2csIE1lbWJlciBzZW5kZXIpOworCisgICAgLyoqCisgICAgICogCisgICAgICogQHBhcmFtIGxpc3RlbmVyIE9iamVjdAorICAgICAqIEByZXR1cm4gYm9vbGVhbgorICAgICAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGludAorICAgICAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCk7CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9DaGFubmVsTWVzc2FnZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL0NoYW5uZWxNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmZWRkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9DaGFubmVsTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uWEJ5dGVCdWZmZXI7CisKKy8qKgorICogTWVzc2FnZSB0aGF0IGlzIHBhc3NlZCB0aHJvdWdoIHRoZSBpbnRlcmNlcHRvciBzdGFjayBhZnRlciB0aGUgCisgKiBkYXRhIHNlcmlhbGl6ZWQgaW4gdGhlIENoYW5uZWwgb2JqZWN0IGFuZCB0aGVuIHBhc3NlZCBkb3duIHRvIHRoZSAKKyAqIGludGVyY2VwdG9yIGFuZCBldmVudHVhbGx5IGRvd24gdG8gdGhlIENoYW5uZWxTZW5kZXIgY29tcG9uZW50CisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBDaGFubmVsTWVzc2FnZSBleHRlbmRzIFNlcmlhbGl6YWJsZSB7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhZGRyZXNzIHRoYXQgdGhpcyBtZXNzYWdlIG9yaWdpbmF0ZWQgZnJvbS4gIAorICAgICAqIEFsbW9zdCBhbHdheXMgPGNvZGU+Q2hhbm5lbC5nZXRMb2NhbE1lbWJlcihib29sZWFuKTwvY29kZT48YnI+CisgICAgICogVGhpcyB3b3VsZCBiZSBzZXQgdG8gYSBkaWZmZXJlbnQgYWRkcmVzcyAKKyAgICAgKiBpZiB0aGUgbWVzc2FnZSB3YXMgYmVpbmcgcmVsYXllZCBmcm9tIGEgaG9zdCBvdGhlciB0aGFuIHRoZSBvbmUKKyAgICAgKiB0aGF0IG9yaWdpbmFsbHkgc2VudCBpdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2Ugb3IgcmVwbHktdG8gYWRkcmVzcyBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyIGdldEFkZHJlc3MoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNvdXJjZSBvciByZXBseS10byBhZGRyZXNzIG9mIHRoaXMgbWVzc2FnZQorICAgICAqIEBwYXJhbSBtZW1iZXIgTWVtYmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWRkcmVzcyhNZW1iZXIgbWVtYmVyKTsKKworICAgIC8qKgorICAgICAqIFRpbWVzdGFtcCBvZiB3aGVuIHRoZSBtZXNzYWdlIHdhcyBjcmVhdGVkLgorICAgICAqIEByZXR1cm4gbG9uZyB0aW1lc3RhbXAgaW4gbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCk7CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFNldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wIFRoZSB0aW1lc3RhbXAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAobG9uZyB0aW1lc3RhbXApOworCisgICAgLyoqCisgICAgICogRWFjaCBtZXNzYWdlIG11c3QgaGF2ZSBhIGdsb2JhbGx5IHVuaXF1ZSBJZC4KKyAgICAgKiBpbnRlcmNlcHRvcnMgaGVhdmlseSBkZXBlbmQgb24gdGhpcyBpZCBmb3IgbWVzc2FnZSBwcm9jZXNzaW5nCisgICAgICogQHJldHVybiBieXRlCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRVbmlxdWVJZCgpOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBieXRlIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSBhY3R1YWwgbWVzc2FnZSBwYXlsb2FkCisgICAgICogQHBhcmFtIGJ1ZiBYQnl0ZUJ1ZmZlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoWEJ5dGVCdWZmZXIgYnVmKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiByZXR1cm5zIHRoZSBieXRlIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSBhY3R1YWwgbWVzc2FnZSBwYXlsb2FkCisgICAgICogQHJldHVybiBYQnl0ZUJ1ZmZlcgorICAgICAqLworICAgIHB1YmxpYyBYQnl0ZUJ1ZmZlciBnZXRNZXNzYWdlKCk7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIG1lc3NhZ2Ugb3B0aW9ucyBpcyBhIDMyIGJpdCBmbGFnIHNldAorICAgICAqIHRoYXQgdHJpZ2dlcnMgaW50ZXJjZXB0b3JzIGFuZCBtZXNzYWdlIGJlaGF2aW9yLgorICAgICAqIEBzZWUgQ2hhbm5lbCNzZW5kKE1lbWJlcltdLCBTZXJpYWxpemFibGUsIGludCkgCisgICAgICogQHNlZSBDaGFubmVsSW50ZXJjZXB0b3IjZ2V0T3B0aW9uRmxhZworICAgICAqIEByZXR1cm4gaW50IC0gdGhlIG9wdGlvbiBiaXRzIHNldCBmb3IgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRPcHRpb25zKCk7CisgICAgCisgICAgLyoqCisgICAgICogc2V0cyB0aGUgb3B0aW9uIGJpdHMgZm9yIHRoaXMgbWVzc2FnZQorICAgICAqIEBwYXJhbSBvcHRpb25zIGludAorICAgICAqIEBzZWUgI2dldE9wdGlvbnMoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9wdGlvbnMoaW50IG9wdGlvbnMpOworICAgIAorICAgIC8qKgorICAgICAqIFNoYWxsb3cgY2xvbmUsIHdoYXQgZ2V0cyBjbG9uZWQgZGVwZW5kcyBvbiB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAgKiBAcmV0dXJuIENoYW5uZWxNZXNzYWdlCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpOworCisgICAgLyoqCisgICAgICogRGVlcCBjbG9uZSwgYWxsIGZpZWxkcyBNVVNUIGdldCBjbG9uZWQKKyAgICAgKiBAcmV0dXJuIENoYW5uZWxNZXNzYWdlCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBkZWVwY2xvbmUoKTsKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9DaGFubmVsUmVjZWl2ZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9DaGFubmVsUmVjZWl2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTI3YTYxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL0NoYW5uZWxSZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzOworCisKKy8qKgorICogQ2hhbm5lbFJlY2VpdmVyIEludGVyZmFjZTxicj4KKyAqIFRoZSA8Y29kZT5DaGFubmVsUmVjZWl2ZXI8L2NvZGU+IGludGVyZmFjZSBpcyB0aGUgZGF0YSByZWNlaXZlciBjb21wb25lbnQgCisgKiBhdCB0aGUgYm90dG9tIGxheWVyLCB0aGUgSU8gbGF5ZXIgKGZvciBsYXllcnMgc2VlIHRoZSBqYXZhZG9jIGZvciB0aGUge0BsaW5rIENoYW5uZWx9IGludGVyZmFjZSkuCisgKiBUaGlzIGNsYXNzIG1heSBvcHRpb25hbGx5IGltcGxlbWVudCBhIHRocmVhZCBwb29sIGZvciBwYXJhbGxlbCBwcm9jZXNzaW5nIG9mIGluY29taW5nIG1lc3NhZ2VzLgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2hhbm5lbFJlY2VpdmVyIGV4dGVuZHMgSGVhcnRiZWF0IHsKKyAgICAvKioKKyAgICAgKiBTdGFydCBsaXN0ZW5pbmcgZm9yIGluY29taW5nIG1lc3NhZ2VzIG9uIHRoZSBob3N0L3BvcnQKKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU3RvcCBsaXN0ZW5pbmcgZm9yIG1lc3NhZ2VzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpOworCisgICAgLyoqCisgICAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBJUHY0IG9yIElQdjYgYWRkcmVzcyB0aGF0IHRoaXMgaG9zdCBpcyBsaXN0ZW5pbmcKKyAgICAgKiB0by4KKyAgICAgKiBAcmV0dXJuIHRoZSBob3N0IHRoYXQgdGhpcyByZWNlaXZlciBpcyBsaXN0ZW5pbmcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKTsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0ZW5pbmcgcG9ydAorICAgICAqIEByZXR1cm4gcG9ydAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpOworICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1lc3NhZ2UgbGlzdGVuZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gb2YgaW5jb21pbmcKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgTWVzc2FnZUxpc3RlbmVyCisgICAgICogQHNlZSBNZXNzYWdlTGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlTGlzdGVuZXIoTWVzc2FnZUxpc3RlbmVyIGxpc3RlbmVyKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGxpc3RlbmVyIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVjZWl2ZXIKKyAgICAgKiBAcmV0dXJuIE1lc3NhZ2VMaXN0ZW5lcgorICAgICAqIEBzZWUgTWVzc2FnZUxpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2VMaXN0ZW5lciBnZXRNZXNzYWdlTGlzdGVuZXIoKTsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL0NoYW5uZWxTZW5kZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9DaGFubmVsU2VuZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1YmMwOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9DaGFubmVsU2VuZGVyLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXM7CisKKworLyoqCisgKiBDaGFubmVsUmVjZWl2ZXIgSW50ZXJmYWNlPGJyPgorICogVGhlIDxjb2RlPkNoYW5uZWxTZW5kZXI8L2NvZGU+IGludGVyZmFjZSBpcyB0aGUgZGF0YSBzZW5kZXIgY29tcG9uZW50IAorICogYXQgdGhlIGJvdHRvbSBsYXllciwgdGhlIElPIGxheWVyIChmb3IgbGF5ZXJzIHNlZSB0aGUgamF2YWRvYyBmb3IgdGhlIHtAbGluayBDaGFubmVsfSBpbnRlcmZhY2UpLjxicj4KKyAqIFRoZSBjaGFubmVsIHNlbmRlciBtdXN0IHN1cHBvcnQgInNpbGVudCIgbWVtYmVycywgaWUsIGJlIGFibGUgdG8gc2VuZCBhIG1lc3NhZ2UgdG8gYSBtZW1iZXIKKyAqIHRoYXQgaXMgbm90IGluIHRoZSBtZW1iZXJzaGlwLCBidXQgaXMgcGFydCBvZiB0aGUgZGVzdGluYXRpb24gcGFyYW1ldGVyCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGludGVyZmFjZSBDaGFubmVsU2VuZGVyIGV4dGVuZHMgSGVhcnRiZWF0Cit7CisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBzZW5kZXIgb2YgYSBtZW1iZXIgYmVpbmcgYWRkZWQgdG8gdGhlIGdyb3VwLjxicj4KKyAgICAgKiBPcHRpb25hbC4gVGhpcyBjYW4gYmUgYW4gZW1wdHkgaW1wbGVtZW50YXRpb24sIHRoYXQgZG9lcyBub3RoaW5nCisgICAgICogQHBhcmFtIG1lbWJlciBNZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoTWVtYmVyIG1lbWJlcik7CisgICAgLyoqCisgICAgICogTm90aWZpY2F0aW9uIHRoYXQgYSBtZW1iZXIgaGFzIGJlZW4gcmVtb3ZlZCBvciBjcmFzaGVkLgorICAgICAqIENhbiBiZSB1c2VkIHRvIGNsZWFuIHVwIG9wZW4gY29ubmVjdGlvbnMgZXRjCisgICAgICogQHBhcmFtIG1lbWJlciBNZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoTWVtYmVyIG1lbWJlcik7CisgICAgCisgICAgLyoqCisgICAgICogU3RhcnQgdGhlIGNoYW5uZWwgc2VuZGVyCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBwcmVwcm9jZXNzaW5nIHRha2VzIHBsYWNlIGFuZCBhbiBlcnJvciBoYXBwZW5zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBjaGFubmVsIHNlbmRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBIGNoYW5uZWwgaGVhcnRiZWF0LCB1c2UgdGhpcyBtZXRob2QgdG8gY2xlYW4gdXAgcmVzb3VyY2VzCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGVhcnRiZWF0KCkgOworICAgIAorICAgIC8qKgorICAgICAqIFNlbmQgYSBtZXNzYWdlIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMuCisgICAgICogQHBhcmFtIG1lc3NhZ2UgQ2hhbm5lbE1lc3NhZ2UgLSB0aGUgbWVzc2FnZSB0byBiZSBzZW50CisgICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIE1lbWJlcltdIC0gdGhlIGRlc3RpbmF0aW9ucworICAgICAqIEB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiAtIGlmIGFuIGVycm9yIGhhcHBlbnMsIHRoZSBDaGFubmVsU2VuZGVyIE1VU1QgcmVwb3J0CisgICAgICogaW5kaXZpZHVhbCBzZW5kIGZhaWx1cmVzIG9uIGEgcGVyIG1lbWJlciBiYXNpcywgdXNpbmcgQ2hhbm5lbEV4Y2VwdGlvbi5hZGRGYXVsdHlNZW1iZXIKKyAgICAgKiBAc2VlIENoYW5uZWxFeGNlcHRpb24jYWRkRmF1bHR5TWVtYmVyKE1lbWJlcixqYXZhLmxhbmcuRXhjZXB0aW9uKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKENoYW5uZWxNZXNzYWdlIG1lc3NhZ2UsIE1lbWJlcltdIGRlc3RpbmF0aW9uKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9Db25zdGFudHMuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2NjYjhlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXM7CisKKy8qKgorICogTWFuaWZlc3QgY29uc3RhbnRzIGZvciB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXM8L2NvZGU+CisgKiBwYWNrYWdlLgorICoKKyAqIEBhdXRob3IgQmlwIFRoZWxpbgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIENvbnN0YW50cyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcyI7Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvRXJyb3JIYW5kbGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvRXJyb3JIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1ZGU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9FcnJvckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlczsKKworCisKKy8qKgorICogVGhlIDxjb2RlPkVycm9ySGFuZGxlcjwvY29kZT4gY2xhc3MgaXMgdXNlZCB3aGVuIHNlbmRpbmcgbWVzc2FnZXMKKyAqIHRoYXQgYXJlIHNlbnQgYXN5bmNocm9ub3VzbHkgYW5kIHRoZSBhcHBsaWNhdGlvbiBzdGlsbCBuZWVkcyB0byBnZXQgCisgKiBjb25maXJtYXRpb24gd2hlbiB0aGUgbWVzc2FnZSB3YXMgc2VudCBzdWNjZXNzZnVsbHkgb3Igd2hlbiBhIG1lc3NhZ2UgZXJyb3JlZCBvdXQuCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGludGVyZmFjZSBFcnJvckhhbmRsZXIgeworICAgIAorICAgIC8qKgorICAgICAqIEludm9rZWQgaWYgdGhlIG1lc3NhZ2UgaXMgZGlzcGF0Y2hlZCBhc3luY2gsIGFuZCBhbiBlcnJvciBvY2N1cnMKKyAgICAgKiBAcGFyYW0geCBDaGFubmVsRXhjZXB0aW9uIC0gdGhlIGVycm9yIHRoYXQgaGFwcGVuZWQKKyAgICAgKiBAcGFyYW0gaWQgLSB0aGUgdW5pcXVlIGlkIGZvciB0aGUgbWVzc2FnZQorICAgICAqIEBzZWUgQ2hhbm5lbCNzZW5kKE1lbWJlcltdLCBTZXJpYWxpemFibGUsIGludCwgRXJyb3JIYW5kbGVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGhhbmRsZUVycm9yKENoYW5uZWxFeGNlcHRpb24geCwgVW5pcXVlSWQgaWQpOworICAgIAorICAgIC8qKgorICAgICAqIEludm9rZWQgd2hlbiB0aGUgbWVzc2FnZSBoYXMgYmVlbiBzZW50IHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBAcGFyYW0gaWQgLSB0aGUgdW5pcXVlIGlkIGZvciB0aGUgbWVzc2FnZQorICAgICAqIEBzZWUgQ2hhbm5lbCNzZW5kKE1lbWJlcltdLCBTZXJpYWxpemFibGUsIGludCwgRXJyb3JIYW5kbGVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGhhbmRsZUNvbXBsZXRpb24oVW5pcXVlSWQgaWQpOworICAgIAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9IZWFydGJlYXQuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9IZWFydGJlYXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2Q5MWU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL0hlYXJ0YmVhdC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlczsKKworLyoqCisgKiBDYW4gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIENoYW5uZWxMaXN0ZW5lciBhbmQgTWVtYmVyc2hpcCBsaXN0ZW5lcnMgdG8gcmVjZWl2ZSBoZWFydGJlYXQKKyAqIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgQ2hhbm5lbAorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gMS4wCisgKiBAc2VlIENoYW5uZWwKKyAqIEBzZWUgQ2hhbm5lbCNoZWFydGJlYXQoKQorICovCitwdWJsaWMgaW50ZXJmYWNlIEhlYXJ0YmVhdCB7CisgICAgCisgICAgLyoqCisgICAgICogSGVhcnRiZWF0IGludm9rYXRpb24gZm9yIHJlc291cmNlcyBjbGVhbnVwIGV0YworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGhlYXJ0YmVhdCgpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYWZhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSBAQAorY2x1c3Rlci5tYmVhbi5yZWdpc3Rlci5hbHJlYWR5PU1CZWFuIHswfSBhbHJlYWR5IHJlZ2lzdGVyZWQhCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvTWFuYWdlZENoYW5uZWwuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9NYW5hZ2VkQ2hhbm5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YWU5YTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvTWFuYWdlZENoYW5uZWwuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogQ2hhbm5lbCBpbnRlcmZhY2UKKyAqIEEgbWFuYWdlZCBjaGFubmVsIGludGVyZmFjZSBnaXZlcyB5b3UgYWNjZXNzIHRvIHRoZSBjb21wb25lbnRzIG9mIHRoZSBjaGFubmVscworICogc3VjaCBhcyBzZW5kZXJzLCByZWNlaXZlcnMsIGludGVyY2VwdG9ycyBldGMgZm9yIGNvbmZpZ3VyYXRpb25zIHB1cnBvc2VzCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGludGVyZmFjZSBNYW5hZ2VkQ2hhbm5lbCBleHRlbmRzIENoYW5uZWwgeworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2hhbm5lbCBzZW5kZXIKKyAgICAgKiBAcGFyYW0gc2VuZGVyIENoYW5uZWxTZW5kZXIKKyAgICAgKiBAc2VlIENoYW5uZWxTZW5kZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFubmVsU2VuZGVyKENoYW5uZWxTZW5kZXIgc2VuZGVyKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNoYW5uZWwgcmVjZWl2ZXIKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXIgQ2hhbm5lbFJlY2VpdmVyCisgICAgICogQHNlZSBDaGFubmVsUmVjZWl2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFubmVsUmVjZWl2ZXIoQ2hhbm5lbFJlY2VpdmVyIHJlY2VpdmVyKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtZW1iZXJzaGlwIHNlcnZpY2UKKyAgICAgKiBAcGFyYW0gc2VydmljZSBNZW1iZXJzaGlwU2VydmljZQorICAgICAqIEBzZWUgTWVtYmVyc2hpcFNlcnZpY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZW1iZXJzaGlwU2VydmljZShNZW1iZXJzaGlwU2VydmljZSBzZXJ2aWNlKTsKKworICAgIC8qKgorICAgICAqIHJldHVybnMgdGhlIGNoYW5uZWwgc2VuZGVyCisgICAgICogQHJldHVybiBDaGFubmVsU2VuZGVyCisgICAgICogQHNlZSBDaGFubmVsU2VuZGVyCisgICAgICovCisgICAgcHVibGljIENoYW5uZWxTZW5kZXIgZ2V0Q2hhbm5lbFNlbmRlcigpOworICAgIAorICAgIC8qKgorICAgICAqIHJldHVybnMgdGhlIGNoYW5uZWwgcmVjZWl2ZXIKKyAgICAgKiBAcmV0dXJuIENoYW5uZWxSZWNlaXZlcgorICAgICAqIEBzZWUgQ2hhbm5lbFJlY2VpdmVyCisgICAgICovCisgICAgcHVibGljIENoYW5uZWxSZWNlaXZlciBnZXRDaGFubmVsUmVjZWl2ZXIoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtZW1iZXJzaGlwIHNlcnZpY2UKKyAgICAgKiBAcmV0dXJuIE1lbWJlcnNoaXBTZXJ2aWNlCisgICAgICogQHNlZSBNZW1iZXJzaGlwU2VydmljZQorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXJzaGlwU2VydmljZSBnZXRNZW1iZXJzaGlwU2VydmljZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW50ZXJjZXB0b3Igc3RhY2sKKyAgICAgKiBAcmV0dXJuIEl0ZXJhdG9yCisgICAgICogQHNlZSBDaGFubmVsI2FkZEludGVyY2VwdG9yKENoYW5uZWxJbnRlcmNlcHRvcikKKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0SW50ZXJjZXB0b3JzKCk7Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvTWVtYmVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvTWVtYmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNkMjUzOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9NZW1iZXIuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXM7CisKKy8qKgorICogVGhlIE1lbWJlciBpbnRlcmZhY2UsIGRlZmluZXMgYSBtZW1iZXIgaW4gdGhlIGdyb3VwLgorICogRWFjaCBtZW1iZXIgY2FuIGNhcnJ5IGEgc2V0IG9mIHByb3BlcnRpZXMsIGRlZmluZWQgYnkgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi48QlI+CisgKiBBIG1lbWJlciBpcyBpZGVudGlmaWVkIGJ5IHRoZSBob3N0L2lwL3VuaXF1ZUlkPGJyPgorICogVGhlIGhvc3QgaXMgd2hhdCBpbnRlcmZhY2UgdGhlIG1lbWJlciBpcyBsaXN0ZW5pbmcgdG8sIHRvIHJlY2VpdmUgZGF0YTxicj4KKyAqIFRoZSBwb3J0IGlzIHdoYXQgcG9ydCB0aGUgbWVtYmVyIGlzIGxpc3RlbmluZyB0bywgdG8gcmVjZWl2ZSBkYXRhPGJyPgorICogVGhlIHVuaXF1ZUlkIGRlZmluZXMgdGhlIHNlc3Npb24gaWQgZm9yIHRoZSBtZW1iZXIuIFRoaXMgaXMgYW4gaW1wb3J0YW50IGZlYXR1cmUKKyAqIHNpbmNlIGEgbWVtYmVyIHRoYXQgaGFzIGNyYXNoZWQgYW5kIHRoZSBzdGFydHMgdXAgYWdhaW4gb24gdGhlIHNhbWUgcG9ydC9ob3N0IGlzIAorICogbm90IGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUgbWVtYmVyLCBzbyBubyBzdGF0ZSB0cmFuc2ZlcnMgd2lsbCBldmVyIGJlIGNvbmZ1c2VkCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCisKK3B1YmxpYyBpbnRlcmZhY2UgTWVtYmVyIHsKKyAgICAKKyAgICAvKioKKyAgICAgKiBXaGVuIGEgbWVtYmVyIGxlYXZlcyB0aGUgY2x1c3RlciwgdGhlIHBheWxvYWQgb2YgdGhlIG1lbWJlckRpc2FwcGVhcmVkIG1lbWJlcgorICAgICAqIHdpbGwgYmUgdGhlIGZvbGxvd2luZyBieXRlcy4gVGhpcyBpbmRpY2F0ZXMgYSBzb2Z0IHNodXRkb3duLCBhbmQgbm90IGEgY3Jhc2gKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBTSFVURE9XTl9QQVlMT0FEID0gbmV3IGJ5dGVbXSB7NjYsIDY1LCA2NiwgODksIDQ1LCA2NSwgNzYsIDY5LCA4OH07CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIG5vZGUsIHNob3VsZCBiZSB1bmlxdWUgd2l0aGluIHRoZSBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKyAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdGVuIGhvc3QgZm9yIHRoZSBDaGFubmVsUmVjZWl2ZXIgaW1wbGVtZW50YXRpb24KKyAgICAgKiBAcmV0dXJuIElQdjQgb3IgSVB2NiByZXByZXNlbnRhdGlvbiBvZiB0aGUgaG9zdCBhZGRyZXNzIHRoaXMgbWVtYmVyIGxpc3RlbnMgdG8gaW5jb21pbmcgZGF0YQorICAgICAqIEBzZWUgQ2hhbm5lbFJlY2VpdmVyCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRIb3N0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0ZW4gcG9ydCBmb3IgdGhlIENoYW5uZWxSZWNlaXZlciBpbXBsZW1lbnRhdGlvbgorICAgICAqIEByZXR1cm4gSVB2NCBvciBJUHY2IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBob3N0IGFkZHJlc3MgdGhpcyBtZW1iZXIgbGlzdGVucyB0byBpbmNvbWluZyBkYXRhCisgICAgICogQHNlZSBDaGFubmVsUmVjZWl2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBvcnQoKTsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGhvdyBsb25nIHRoaXMgbWVtYmVyIGhhcyBiZWVuIG9ubGluZS4KKyAgICAgKiBUaGUgcmVzdWx0IGlzIHRoZSBudW1iZXIgb2YgbWlsbGkgc2Vjb25kcyB0aGlzIG1lbWJlciBoYXMgYmVlbgorICAgICAqIGJyb2FkY2FzdGluZyBpdHMgbWVtYmVyc2hpcCB0byB0aGUgZ3JvdXAuCisgICAgICogQHJldHVybiBuciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhpcyBtZW1iZXIgc3RhcnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRNZW1iZXJBbGl2ZVRpbWUoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbWVtYmVyCisgICAgICogQHJldHVybiBib29sZWFuIC0gdHJ1ZSBpZiB0aGUgbWVtYmVyIGlzIGZ1bmN0aW9uaW5nIGNvcnJlY3RseQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZHkoKTsKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbWVtYmVyCisgICAgICogQHJldHVybiBib29sZWFuIC0gdHJ1ZSBpZiB0aGUgbWVtYmVyIGlzIHN1c3BlY3QsIGJ1dCB0aGUgY3Jhc2ggaGFzIG5vdCBiZWVuIGNvbmZpcm1lZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU3VzcGVjdCgpOworICAgIAorICAgIC8qKgorICAgICAqIAorICAgICAqIEByZXR1cm4gYm9vbGVhbiAtIHRydWUgaWYgdGhlIG1lbWJlciBoYXMgYmVlbiBjb25maXJtZWQgdG8gbWFsZnVuY3Rpb24gCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGYWlsaW5nKCk7CisgICAgCisgICAgLyoqCisgICAgICogcmV0dXJucyBhIFVVSUQgdW5pcXVlIGZvciB0aGlzIG1lbWJlciBvdmVyIGFsbCBzZXNzaW9ucy4KKyAgICAgKiBJZiB0aGUgbWVtYmVyIGNyYXNoZXMgYW5kIHJlc3RhcnRzLCB0aGUgdW5pcXVlSWQgd2lsbCBiZSBkaWZmZXJlbnQuCisgICAgICogQHJldHVybiBieXRlW10KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldFVuaXF1ZUlkKCk7CisgICAgCisgICAgLyoqCisgICAgICogcmV0dXJucyB0aGUgcGF5bG9hZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZW1iZXIKKyAgICAgKiBAcmV0dXJuIGJ5dGVbXQorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0UGF5bG9hZCgpOworICAgIAorICAgIC8qKgorICAgICAqIHJldHVybnMgdGhlIGNvbW1hbmQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVtYmVyCisgICAgICogQHJldHVybiBieXRlW10KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldENvbW1hbmQoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEb21haW4gZm9yIHRoaXMgY2x1c3RlcgorICAgICAqIEByZXR1cm4gYnl0ZVtdCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXREb21haW4oKTsKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9NZW1iZXJzaGlwTGlzdGVuZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9NZW1iZXJzaGlwTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzY1MjlhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL01lbWJlcnNoaXBMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzOworCisvKioKKyAqIFRoZSBNZW1iZXJzaGlwTGlzdGVuZXIgaW50ZXJmYWNlIGlzIHVzZWQgYXMgYSBjYWxsYmFjayB0byB0aGUKKyAqIG1lbWJlcnNoaXAgc2VydmljZS4gSXQgaGFzIHR3byBtZXRob2RzIHRoYXQgd2lsbCBub3RpZnkgdGhlIGxpc3RlbmVyCisgKiB3aGVuIGEgbWVtYmVyIGhhcyBqb2luZWQgdGhlIGdyb3VwIGFuZCB3aGVuIGEgbWVtYmVyIGhhcyBkaXNhcHBlYXJlZCAoY3Jhc2hlZCkKKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCisKK3B1YmxpYyBpbnRlcmZhY2UgTWVtYmVyc2hpcExpc3RlbmVyIHsKKyAgICAvKioKKyAgICAgKiBBIG1lbWJlciB3YXMgYWRkZWQgdG8gdGhlIGdyb3VwCisgICAgICogQHBhcmFtIG1lbWJlciBNZW1iZXIgLSB0aGUgbWVtYmVyIHRoYXQgd2FzIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWVtYmVyQWRkZWQoTWVtYmVyIG1lbWJlcik7CisgICAgCisgICAgLyoqCisgICAgICogQSBtZW1iZXIgd2FzIHJlbW92ZWQgZnJvbSB0aGUgZ3JvdXA8YnI+CisgICAgICogSWYgdGhlIG1lbWJlciBsZWZ0IHZvbHVudGFyaWx5LCB0aGUgcGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIE1lbWJlci5TSFVURE9XTl9QQVlMT0FEIGRhdGEKKyAgICAgKiBAcGFyYW0gbWVtYmVyIE1lbWJlcgorICAgICAqIEBzZWUgTWVtYmVyI1NIVVRET1dOX1BBWUxPQUQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJEaXNhcHBlYXJlZChNZW1iZXIgbWVtYmVyKTsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9NZW1iZXJzaGlwU2VydmljZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL01lbWJlcnNoaXBTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyZGE0MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9NZW1iZXJzaGlwU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlczsKKworCisvKioKKyAqIE1lbWJlcnNoaXBTZXJ2aWNlIEludGVyZmFjZTxicj4KKyAqIFRoZSA8Y29kZT5NZW1iZXJzaGlwU2VydmljZTwvY29kZT4gaW50ZXJmYWNlIGlzIHRoZSBtZW1iZXJzaGlwIGNvbXBvbmVudCAKKyAqIGF0IHRoZSBib3R0b20gbGF5ZXIsIHRoZSBJTyBsYXllciAoZm9yIGxheWVycyBzZWUgdGhlIGphdmFkb2MgZm9yIHRoZSB7QGxpbmsgQ2hhbm5lbH0gaW50ZXJmYWNlKS48YnI+CisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCisKK3B1YmxpYyBpbnRlcmZhY2UgTWVtYmVyc2hpcFNlcnZpY2UgeworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1CUl9SWCA9IENoYW5uZWwuTUJSX1JYX1NFUTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQlJfVFggPSBDaGFubmVsLk1CUl9UWF9TRVE7CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIG1lbWJlcnNoaXAgc2VydmljZS4gVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUKKyAgICAgKiB0aGUgPGNvZGU+c3RhcnQoKTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKiBUaGUgcHJvcGVydGllcyBhcmUgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMgLSB0byBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgbWVtYmVyc2hpcCBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoamF2YS51dGlsLlByb3BlcnRpZXMgcHJvcGVydGllcyk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgamF2YS51dGlsLlByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpOworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGUgbWVtYmVyc2hpcCBzZXJ2aWNlLiBJZiBhIG1lbWJlcnNoaXAgbGlzdGVuZXJzIGlzIGFkZGVkCisgICAgICogdGhlIGxpc3RlbmVyIHdpbGwgc3RhcnQgdG8gcmVjZWl2ZSBtZW1iZXJzaGlwIGV2ZW50cy4KKyAgICAgKiBQZXJmb3JtcyBhIHN0YXJ0IGxldmVsIDEgYW5kIDIKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gaWYgdGhlIHNlcnZpY2UgZmFpbHMgdG8gc3RhcnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGUgbWVtYmVyc2hpcCBzZXJ2aWNlLiBJZiBhIG1lbWJlcnNoaXAgbGlzdGVuZXJzIGlzIGFkZGVkCisgICAgICogdGhlIGxpc3RlbmVyIHdpbGwgc3RhcnQgdG8gcmVjZWl2ZSBtZW1iZXJzaGlwIGV2ZW50cy4KKyAgICAgKiBAcGFyYW0gbGV2ZWwgLSBsZXZlbCBNQlJfUlggc3RhcnRzIGxpc3RlbmluZyBmb3IgbWVtYmVycywgbGV2ZWwgTUJSX1RYIAorICAgICAqIHN0YXJ0cyBicm9hZCBjYXN0aW5nIHRoZSBzZXJ2ZXIKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gaWYgdGhlIHNlcnZpY2UgZmFpbHMgdG8gc3RhcnQuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBsZXZlbCBpcyBpbmNvcnJlY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoaW50IGxldmVsKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogU3RhcnRzIHRoZSBtZW1iZXJzaGlwIHNlcnZpY2UuIElmIGEgbWVtYmVyc2hpcCBsaXN0ZW5lcnMgaXMgYWRkZWQKKyAgICAgKiB0aGUgbGlzdGVuZXIgd2lsbCBzdGFydCB0byByZWNlaXZlIG1lbWJlcnNoaXAgZXZlbnRzLgorICAgICAqIEBwYXJhbSBsZXZlbCAtIGxldmVsIE1CUl9SWCBzdG9wcyBsaXN0ZW5pbmcgZm9yIG1lbWJlcnMsIGxldmVsIE1CUl9UWCAKKyAgICAgKiBzdG9wcyBicm9hZCBjYXN0aW5nIHRoZSBzZXJ2ZXIKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gaWYgdGhlIHNlcnZpY2UgZmFpbHMgdG8gc3RvcAorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbGV2ZWwgaXMgaW5jb3JyZWN0LgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc3RvcChpbnQgbGV2ZWwpOworICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGhlIGdyb3VwIGNvbnRhaW5zIG1lbWJlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZW1iZXJzKCk7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogCisgICAgICogQHBhcmFtIG1iciBNZW1iZXIKKyAgICAgKiBAcmV0dXJuIE1lbWJlcgorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXIgZ2V0TWVtYmVyKE1lbWJlciBtYnIpOworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgbWVtYmVycyBpbiB0aGUgY2x1c3Rlci4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgTWVtYmVyW10gZ2V0TWVtYmVycygpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1lbWJlciBvYmplY3QgdGhhdCBkZWZpbmVzIHRoaXMgbWVtYmVyCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBnZXRMb2NhbE1lbWJlcihib29sZWFuIGluY0FsaXZlVGltZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIG1lbWJlcnMgYnkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNZW1iZXJzQnlOYW1lKCkgOyAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1lbWJlciBieSBuYW1lCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBmaW5kTWVtYmVyQnlOYW1lKFN0cmluZyBuYW1lKSA7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsb2NhbCBtZW1iZXIgcHJvcGVydGllcyBmb3IgYnJvYWRjYXN0aW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9jYWxNZW1iZXJQcm9wZXJ0aWVzKFN0cmluZyBsaXN0ZW5Ib3N0LCBpbnQgbGlzdGVuUG9ydCk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWVtYmVyc2hpcCBsaXN0ZW5lciwgb25seSBvbmUgbGlzdGVuZXIgY2FuIGJlIGFkZGVkLgorICAgICAqIElmIHlvdSBjYWxsIHRoaXMgbWV0aG9kIHR3aWNlLCB0aGUgbGFzdCBsaXN0ZW5lciB3aWxsIGJlIHVzZWQuCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1lbWJlcnNoaXBMaXN0ZW5lcihNZW1iZXJzaGlwTGlzdGVuZXIgbGlzdGVuZXIpOworICAgIAorICAgIC8qKgorICAgICAqIHJlbW92ZXMgdGhlIG1lbWJlcnNoaXAgbGlzdGVuZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTWVtYmVyc2hpcExpc3RlbmVyKCk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0IGEgcGF5bG9hZCB0byBiZSBicm9hZGNhc3RlZCB3aXRoIGVhY2ggbWVtYmVyc2hpcCAKKyAgICAgKiBicm9hZGNhc3QuCisgICAgICogQHBhcmFtIHBheWxvYWQgYnl0ZVtdCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF5bG9hZChieXRlW10gcGF5bG9hZCk7CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RG9tYWluKGJ5dGVbXSBkb21haW4pOworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvTWVzc2FnZUxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvTWVzc2FnZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhZGY1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9NZXNzYWdlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXM7CisKKy8qKgorICogCisgKiA8cD5UaXRsZTogTWVzc2FnZUxpc3RlbmVyPC9wPiAKKyAqIAorICogPHA+RGVzY3JpcHRpb246IFRoZSBsaXN0ZW5lciB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhlIENoYW5uZWxSZWNlaXZlciwgaW50ZXJuYWwgVHJpYmVzIGNvbXBvbmVudDwvcD4gCisgKiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUxpc3RlbmVyIHsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlIGEgbWVzc2FnZSBmcm9tIHRoZSBJTyBjb21wb25lbnRzIGluIHRoZSBDaGFubmVsIHN0YWNrCisgICAgICogQHBhcmFtIG1zZyBDaGFubmVsTWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZWNlaXZlZChDaGFubmVsTWVzc2FnZSBtc2cpOworICAgIAorICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChDaGFubmVsTWVzc2FnZSBtc2cpOworICAgIAorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbGlzdGVuZXIpOworICAgIAorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKTsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL1JlbW90ZVByb2Nlc3NFeGNlcHRpb24uamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9SZW1vdGVQcm9jZXNzRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzZTVlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9SZW1vdGVQcm9jZXNzRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXM7CisKKy8qKgorICogPHA+VGl0bGU6IFJlbW90ZVByb2Nlc3NFeGNlcHRpb248L3A+CisgKgorICogPHA+RGVzY3JpcHRpb246IE1lc3NhZ2UgdGhyb3duIGJ5IGEgc2VuZGVyIHdoZW4gVVNFX1NZTkNfQUNLIHJlY2VpdmVzIGEgRkFJTF9BQ0tfQ09NTUFORC48YnI+CisgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIG9uIHRoZSByZW1vdGUgbm9kZSBidXQgdGhlIHByb2Nlc3Npbmcgb2YgdGhlIG1lc3NhZ2UgZmFpbGVkLgorICogVGhpcyBtZXNzYWdlIHdpbGwgYmUgZW1iZWRkZWQgaW4gYSBDaGFubmVsRXhjZXB0aW9uLkZhdWx0eU1lbWJlcgorICogPC9wPgorICogQHNlZSBDaGFubmVsRXhjZXB0aW9uCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIFJlbW90ZVByb2Nlc3NFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgUmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIoY2F1c2UpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9VbmlxdWVJZC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL1VuaXF1ZUlkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2OWRlMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9VbmlxdWVJZC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisvKioKKyAqIDxwPlRpdGxlOiBSZXByZXNlbnRzIGEgZ2xvYmFiYWxseSB1bmlxdWUgSWQ8L3A+CisgKgorICogPHA+Q29tcGFueTogPC9wPgorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVW5pcXVlSWQgaW1wbGVtZW50cyBTZXJpYWxpemFibGV7CisgICAgcHJvdGVjdGVkIGJ5dGVbXSBpZDsKKyAgICAKKyAgICBwdWJsaWMgVW5pcXVlSWQoKSB7CisgICAgfQorCisgICAgcHVibGljIFVuaXF1ZUlkKGJ5dGVbXSBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBVbmlxdWVJZChieXRlW10gaWQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgdGhpcy5pZCA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoaWQsb2Zmc2V0LHRoaXMuaWQsMCxsZW5ndGgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpZiAoIGlkID09IG51bGwgKSByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5oYXNoQ29kZShpZCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSAob3RoZXIgaW5zdGFuY2VvZiBVbmlxdWVJZCk7CisgICAgICAgIGlmICggcmVzdWx0ICkgeworICAgICAgICAgICAgVW5pcXVlSWQgdWlkID0gKFVuaXF1ZUlkKW90aGVyOworICAgICAgICAgICAgaWYgKCB0aGlzLmlkID09IG51bGwgJiYgdWlkLmlkID09IG51bGwgKSByZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgZWxzZSBpZiAoIHRoaXMuaWQgPT0gbnVsbCAmJiB1aWQuaWQgIT0gbnVsbCApIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgZWxzZSBpZiAoIHRoaXMuaWQgIT0gbnVsbCAmJiB1aWQuaWQgPT0gbnVsbCApIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgZWxzZSByZXN1bHQgPSBBcnJheXMuZXF1YWxzKHRoaXMuaWQsdWlkLmlkKTsKKyAgICAgICAgfS8vZW5kIGlmCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIlVuaXF1ZUlkIik7CisgICAgICAgIGJ1Zi5hcHBlbmQob3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbC5BcnJheXMudG9TdHJpbmcoaWQpKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9BYnNvbHV0ZU9yZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvQWJzb2x1dGVPcmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NDJmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvQWJzb2x1dGVPcmRlci5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogPHA+VGl0bGU6IE1lbWJlcnNoaXAgLSBBYnNvbHV0ZSBPcmRlcjwvcD4KKyAqCisgKiA8cD5EZXNjcmlwdGlvbjogQSBzaW1wbGUsIHlldCBhZ3JlZWFibGUgYW5kIGVmZmljaWVudCB3YXkgb2Ygb3JkZXJpbmcgbWVtYmVyczwvcD4KKyAqIDxwPgorICogICAgT3JkZXJpbmcgbWVtYmVycyBjYW4gc2VydmUgYXMgYSBiYXNpcyBmb3IgZWxlY3RpbmcgYSBsZWFkZXIgb3IgY29vcmRpbmF0aW5nIGVmZm9ydHMuPGJyPgorICogICAgVGhpcyBpcyBzdGlua3kgc2ltcGxlLCBpdCB3b3JrcyBvbiB0aGUgYmFzaXMgb2YgdGhlIDxjb2RlPk1lbWJlcjwvY29kZT4gaW50ZXJmYWNlCisgKiAgICBhbmQgb3JkZXJzIG1lbWJlcnMgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgKiAKKyAqICA8b2w+CisgKiAgICAgPGxpPklQIGNvbXBhcmlzb24gLSBieXRlIGJ5IGJ5dGUsIGxvd2VyIGJ5dGUgaGlnaGVyIHJhbms8L2xpPgorICogICAgIDxsaT5JUHY0IGFkZHJlc3NlcyByYW5rIGhpZ2hlciB0aGFuIElQdjYsIGllIHRoZSBsZXNzZXIgbnVtYmVyIG9mIGJ5dGVzLCB0aGUgaGlnaGVyIHJhbms8L2xpPgorICogICAgIDxsaT5Qb3J0IGNvbXBhcmlzb24gLSBsb3dlciBwb3J0LCBoaWdoZXIgcmFuazwvbGk+CisgKiAgICAgPGxpPlVuaXF1ZUlkIGNvbXBhcmlzb24tIGJ5dGUgYnkgYnl0ZSwgbG93ZXIgYnl0ZSBoaWdoZXIgcmFuazwvbGk+CisgKiAgPC9vbD4KKyAqICAgICAKKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAxLjAKKyAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyCisgKi8KK3B1YmxpYyBjbGFzcyBBYnNvbHV0ZU9yZGVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFic29sdXRlQ29tcGFyYXRvciBjb21wID0gbmV3IEFic29sdXRlQ29tcGFyYXRvcigpOworICAgIAorICAgIHByb3RlY3RlZCBBYnNvbHV0ZU9yZGVyKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIAorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhYnNvbHV0ZU9yZGVyKE1lbWJlcltdIG1lbWJlcnMpIHsKKyAgICAgICAgaWYgKCBtZW1iZXJzID09IG51bGwgfHwgbWVtYmVycy5sZW5ndGggPT0gMCApIHJldHVybjsKKyAgICAgICAgQXJyYXlzLnNvcnQobWVtYmVycyxjb21wKTsKKyAgICB9CisgICAgCisgICAgCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBYnNvbHV0ZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgICAgICBpZiAoICEoKG8xIGluc3RhbmNlb2YgTWVtYmVyKSAmJiAobzIgaW5zdGFuY2VvZiBNZW1iZXIpKSApIHJldHVybiAwOworICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVNZW1iZXJzKChNZW1iZXIpbzEsKE1lbWJlcilvMik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZU1lbWJlcnMoTWVtYmVyIG0xLCBNZW1iZXIgbTIpIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBjb21wYXJlSXBzKG0xLG0yKTsKKyAgICAgICAgICAgIGlmICggcmVzdWx0ID09IDAgKSByZXN1bHQgPSBjb21wYXJlUG9ydHMobTEsbTIpOworICAgICAgICAgICAgaWYgKCByZXN1bHQgPT0gMCApIHJlc3VsdCA9IGNvbXBhcmVJZHMobTEsbTIpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlSXBzKE1lbWJlciBtMSwgTWVtYmVyIG0yKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGFyZUJ5dGVzKG0xLmdldEhvc3QoKSxtMi5nZXRIb3N0KCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVQb3J0cyhNZW1iZXIgbTEsIE1lbWJlciBtMikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVJbnRzKG0xLmdldFBvcnQoKSxtMi5nZXRQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVJZHMoTWVtYmVyIG0xLCBNZW1iZXIgbTIpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlQnl0ZXMobTEuZ2V0VW5pcXVlSWQoKSxtMi5nZXRVbmlxdWVJZCgpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJvdGVjdGVkIGludCBjb21wYXJlQnl0ZXMoYnl0ZVtdIGQxLCBieXRlW10gZDIpIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICAgICAgaWYgKCBkMS5sZW5ndGggPT0gZDIubGVuZ3RoICkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgKHJlc3VsdD09MCkgJiYgKGk8ZDEubGVuZ3RoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBhcmVCeXRlcyhkMVtpXSxkMltpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICggZDEubGVuZ3RoIDwgZDIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVCeXRlcyhieXRlIGIxLCBieXRlIGIyKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGFyZUludHMoKGludCliMSwoaW50KWIyKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJvdGVjdGVkIGludCBjb21wYXJlSW50cyhpbnQgYjEsIGludCBiMikgeworICAgICAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgICAgICBpZiAoIGIxID09IGIyICkgeworCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBiMSA8IGIyKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorICAgIAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9DaGFubmVsQ29vcmRpbmF0b3IuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9DaGFubmVsQ29vcmRpbmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTg1ZjRlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL0NoYW5uZWxDb29yZGluYXRvci5qYXZhCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxSZWNlaXZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsU2VuZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcnNoaXBTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lc3NhZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuU2VuZGVyU3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LlJlcGxpY2F0aW9uVHJhbnNtaXR0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMubWVtYmVyc2hpcC5NY2FzdFNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0Lm5pby5OaW9SZWNlaXZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnV0aWwuTG9nczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5VbmlxdWVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy51dGlsLkFycmF5czsKKworCisvKioKKyAqIFRoZSBjaGFubmVsIGNvb3JkaW5hdG9yIG9iamVjdCBjb29yZGluYXRlcyB0aGUgbWVtYmVyc2hpcCBzZXJ2aWNlLAorICogdGhlIHNlbmRlciBhbmQgdGhlIHJlY2VpdmVyLgorICogVGhpcyBpcyB0aGUgbGFzdCBpbnRlcmNlcHRvciBpbiB0aGUgY2hhaW4uCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIENoYW5uZWxDb29yZGluYXRvciBleHRlbmRzIENoYW5uZWxJbnRlcmNlcHRvckJhc2UgaW1wbGVtZW50cyBNZXNzYWdlTGlzdGVuZXIgeworICAgIHByaXZhdGUgQ2hhbm5lbFJlY2VpdmVyIGNsdXN0ZXJSZWNlaXZlciA9IG5ldyBOaW9SZWNlaXZlcigpOworICAgIHByaXZhdGUgQ2hhbm5lbFNlbmRlciBjbHVzdGVyU2VuZGVyID0gbmV3IFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIoKTsKKyAgICBwcml2YXRlIE1lbWJlcnNoaXBTZXJ2aWNlIG1lbWJlcnNoaXBTZXJ2aWNlID0gbmV3IE1jYXN0U2VydmljZSgpOworICAgIAorICAgIC8vb3ZlcnJpZGUgb3B0aW9uZmxhZworICAgIHByb3RlY3RlZCBpbnQgb3B0aW9uRmxhZyA9IENoYW5uZWwuU0VORF9PUFRJT05TX0JZVEVfTUVTU0FHRXxDaGFubmVsLlNFTkRfT1BUSU9OU19VU0VfQUNLfENoYW5uZWwuU0VORF9PUFRJT05TX1NZTkNIUk9OSVpFRF9BQ0s7CisgICAgcHVibGljIGludCBnZXRPcHRpb25GbGFnKCkge3JldHVybiBvcHRpb25GbGFnO30KKyAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb25GbGFnKGludCBmbGFnKSB7b3B0aW9uRmxhZz1mbGFnO30KKyAgICAKKyAgICBwcml2YXRlIGludCBzdGFydExldmVsID0gMDsKKworICAgIHB1YmxpYyBDaGFubmVsQ29vcmRpbmF0b3IoKSB7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ2hhbm5lbENvb3JkaW5hdG9yKENoYW5uZWxSZWNlaXZlciByZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxTZW5kZXIgc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyc2hpcFNlcnZpY2Ugc2VydmljZSkgeworICAgICAgICB0aGlzKCk7CisgICAgICAgIHRoaXMuc2V0Q2x1c3RlclJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgdGhpcy5zZXRDbHVzdGVyU2VuZGVyKHNlbmRlcik7CisgICAgICAgIHRoaXMuc2V0TWVtYmVyc2hpcFNlcnZpY2Uoc2VydmljZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNlbmQgYSBtZXNzYWdlIHRvIG9uZSBvciBtb3JlIG1lbWJlcnMgaW4gdGhlIGNsdXN0ZXIKKyAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gTWVtYmVyW10gLSB0aGUgZGVzdGluYXRpb25zLCBudWxsIG9yIHplcm8gbGVuZ3RoIG1lYW5zIGFsbAorICAgICAqIEBwYXJhbSBtc2cgQ2x1c3Rlck1lc3NhZ2UgLSB0aGUgbWVzc2FnZSB0byBzZW5kCisgICAgICogQHBhcmFtIG9wdGlvbnMgaW50IC0gc2VuZGVyIG9wdGlvbnMsIHNlZSBjbGFzcyBkb2N1bWVudGF0aW9uCisgICAgICogQHJldHVybiBDbHVzdGVyTWVzc2FnZVtdIC0gdGhlIHJlcGxpZXMgZnJvbSB0aGUgbWVtYmVycywgaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKE1lbWJlcltdIGRlc3RpbmF0aW9uLCBDaGFubmVsTWVzc2FnZSBtc2csIEludGVyY2VwdG9yUGF5bG9hZCBwYXlsb2FkKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICggZGVzdGluYXRpb24gPT0gbnVsbCApIGRlc3RpbmF0aW9uID0gbWVtYmVyc2hpcFNlcnZpY2UuZ2V0TWVtYmVycygpOworICAgICAgICBjbHVzdGVyU2VuZGVyLnNlbmRNZXNzYWdlKG1zZyxkZXN0aW5hdGlvbik7CisgICAgICAgIGlmICggTG9ncy5NRVNTQUdFUy5pc1RyYWNlRW5hYmxlZCgpICkgeworICAgICAgICAgICAgTG9ncy5NRVNTQUdFUy50cmFjZSgiQ2hhbm5lbENvb3JkaW5hdG9yIC0gU2VudCBtc2c6IiArIG5ldyBVbmlxdWVJZChtc2cuZ2V0VW5pcXVlSWQoKSkgKyAiIGF0ICIgK25ldyBqYXZhLnNxbC5UaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKyAiIHRvICIrQXJyYXlzLnRvTmFtZVN0cmluZyhkZXN0aW5hdGlvbikpOworICAgICAgICB9CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogU3RhcnRzIHVwIHRoZSBjaGFubmVsLiBUaGlzIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGluZGl2aWR1YWwgc2VydmljZXMgdG8gc3RhcnQKKyAgICAgKiBUaGUgc3ZjIHBhcmFtZXRlciBjYW4gYmUgdGhlIGxvZ2ljYWwgb3IgdmFsdWUgb2YgYW55IGNvbnN0YW50cworICAgICAqIEBwYXJhbSBzdmMgaW50IHZhbHVlIG9mIDxCUj4KKyAgICAgKiBERUZBVUxUIC0gd2lsbCBzdGFydCBhbGwgc2VydmljZXMgPEJSPgorICAgICAqIE1CUl9SWF9TRVEgLSBzdGFydHMgdGhlIG1lbWJlcnNoaXAgcmVjZWl2ZXIgPEJSPgorICAgICAqIE1CUl9UWF9TRVEgLSBzdGFydHMgdGhlIG1lbWJlcnNoaXAgYnJvYWRjYXN0ZXIgPEJSPgorICAgICAqIFNORF9UWF9TRVEgLSBzdGFydHMgdGhlIHJlcGxpY2F0aW9uIHRyYW5zbWl0dGVyPEJSPgorICAgICAqIFNORF9SWF9TRVEgLSBzdGFydHMgdGhlIHJlcGxpY2F0aW9uIHJlY2VpdmVyPEJSPgorICAgICAqIEB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiBpZiBhIHN0YXJ0dXAgZXJyb3Igb2NjdXJzIG9yIHRoZSBzZXJ2aWNlIGlzIGFscmVhZHkgc3RhcnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydChpbnQgc3ZjKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuaW50ZXJuYWxTdGFydChzdmMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNodXRzIGRvd24gdGhlIGNoYW5uZWwuIFRoaXMgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgaW5kaXZpZHVhbCBzZXJ2aWNlcyB0byBzaHV0ZG93bgorICAgICAqIFRoZSBzdmMgcGFyYW1ldGVyIGNhbiBiZSB0aGUgbG9naWNhbCBvciB2YWx1ZSBvZiBhbnkgY29uc3RhbnRzCisgICAgICogQHBhcmFtIHN2YyBpbnQgdmFsdWUgb2YgPEJSPgorICAgICAqIERFRkFVTFQgLSB3aWxsIHNodXRkb3duIGFsbCBzZXJ2aWNlcyA8QlI+CisgICAgICogTUJSX1JYX1NFUSAtIHN0b3BzIHRoZSBtZW1iZXJzaGlwIHJlY2VpdmVyIDxCUj4KKyAgICAgKiBNQlJfVFhfU0VRIC0gc3RvcHMgdGhlIG1lbWJlcnNoaXAgYnJvYWRjYXN0ZXIgPEJSPgorICAgICAqIFNORF9UWF9TRVEgLSBzdG9wcyB0aGUgcmVwbGljYXRpb24gdHJhbnNtaXR0ZXI8QlI+CisgICAgICogU05EX1JYX1NFUSAtIHN0b3BzIHRoZSByZXBsaWNhdGlvbiByZWNlaXZlcjxCUj4KKyAgICAgKiBAdGhyb3dzIENoYW5uZWxFeGNlcHRpb24gaWYgYSBzdGFydHVwIGVycm9yIG9jY3VycyBvciB0aGUgc2VydmljZSBpcyBhbHJlYWR5IHN0YXJ0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcChpbnQgc3ZjKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuaW50ZXJuYWxTdG9wKHN2Yyk7CisgICAgfSAgICAKKworCisgICAgLyoqCisgICAgICogU3RhcnRzIHVwIHRoZSBjaGFubmVsLiBUaGlzIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGluZGl2aWR1YWwgc2VydmljZXMgdG8gc3RhcnQKKyAgICAgKiBUaGUgc3ZjIHBhcmFtZXRlciBjYW4gYmUgdGhlIGxvZ2ljYWwgb3IgdmFsdWUgb2YgYW55IGNvbnN0YW50cworICAgICAqIEBwYXJhbSBzdmMgaW50IHZhbHVlIG9mIDxCUj4KKyAgICAgKiBERUZBVUxUIC0gd2lsbCBzdGFydCBhbGwgc2VydmljZXMgPEJSPgorICAgICAqIE1CUl9SWF9TRVEgLSBzdGFydHMgdGhlIG1lbWJlcnNoaXAgcmVjZWl2ZXIgPEJSPgorICAgICAqIE1CUl9UWF9TRVEgLSBzdGFydHMgdGhlIG1lbWJlcnNoaXAgYnJvYWRjYXN0ZXIgPEJSPgorICAgICAqIFNORF9UWF9TRVEgLSBzdGFydHMgdGhlIHJlcGxpY2F0aW9uIHRyYW5zbWl0dGVyPEJSPgorICAgICAqIFNORF9SWF9TRVEgLSBzdGFydHMgdGhlIHJlcGxpY2F0aW9uIHJlY2VpdmVyPEJSPgorICAgICAqIEB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiBpZiBhIHN0YXJ0dXAgZXJyb3Igb2NjdXJzIG9yIHRoZSBzZXJ2aWNlIGlzIGFscmVhZHkgc3RhcnRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgaW50ZXJuYWxTdGFydChpbnQgc3ZjKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib29sZWFuIHZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICAvL21ha2Ugc3VyZSB3ZSBkb24ndCBwYXNzIGRvd24gYW55IGZsYWdzIHRoYXQgYXJlIHVucmVsYXRlZCB0byB0aGUgYm90dG9tIGxheWVyCisgICAgICAgICAgICBzdmMgPSBzdmMgJiBDaGFubmVsLkRFRkFVTFQ7CisKKyAgICAgICAgICAgIGlmIChzdGFydExldmVsID09IENoYW5uZWwuREVGQVVMVCkgcmV0dXJuOyAvL3dlIGhhdmUgYWxyZWFkeSBzdGFydGVkIHVwIGFsbCBjb21wb25lbnRzCisgICAgICAgICAgICBpZiAoc3ZjID09IDAgKSByZXR1cm47Ly9ub3RoaW5nIHRvIHN0YXJ0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChzdmMgPT0gKHN2YyAmIHN0YXJ0TGV2ZWwpKSB0aHJvdyBuZXcgQ2hhbm5lbEV4Y2VwdGlvbigiQ2hhbm5lbCBhbHJlYWR5IHN0YXJ0ZWQgZm9yIGxldmVsOiIrc3ZjKTsKKworICAgICAgICAgICAgLy9tdXN0IHN0YXJ0IHRoZSByZWNlaXZlciBmaXJzdCBzbyB0aGF0IHdlIGNhbiBjb29yZGluYXRlIHRoZSBwb3J0IGl0CisgICAgICAgICAgICAvL2xpc3RlbnMgdG8gd2l0aCB0aGUgbG9jYWwgbWVtYmVyc2hpcCBzZXR0aW5ncworICAgICAgICAgICAgaWYgKCBDaGFubmVsLlNORF9SWF9TRVE9PShzdmMgJiBDaGFubmVsLlNORF9SWF9TRVEpICkgeworICAgICAgICAgICAgICAgIGNsdXN0ZXJSZWNlaXZlci5zZXRNZXNzYWdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgY2x1c3RlclJlY2VpdmVyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgLy9zeW5jaHJvbml6ZSwgYmlnIHRpbWUgRklYTUUKKyAgICAgICAgICAgICAgICBtZW1iZXJzaGlwU2VydmljZS5zZXRMb2NhbE1lbWJlclByb3BlcnRpZXMoZ2V0Q2x1c3RlclJlY2VpdmVyKCkuZ2V0SG9zdCgpLCBnZXRDbHVzdGVyUmVjZWl2ZXIoKS5nZXRQb3J0KCkpOworICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggQ2hhbm5lbC5TTkRfVFhfU0VRPT0oc3ZjICYgQ2hhbm5lbC5TTkRfVFhfU0VRKSApIHsKKyAgICAgICAgICAgICAgICBjbHVzdGVyU2VuZGVyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIENoYW5uZWwuTUJSX1JYX1NFUT09KHN2YyAmIENoYW5uZWwuTUJSX1JYX1NFUSkgKSB7CisgICAgICAgICAgICAgICAgbWVtYmVyc2hpcFNlcnZpY2Uuc2V0TWVtYmVyc2hpcExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIG1lbWJlcnNoaXBTZXJ2aWNlLnN0YXJ0KE1lbWJlcnNoaXBTZXJ2aWNlLk1CUl9SWCk7CisgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBDaGFubmVsLk1CUl9UWF9TRVE9PShzdmMgJiBDaGFubmVsLk1CUl9UWF9TRVEpICkgeworICAgICAgICAgICAgICAgIG1lbWJlcnNoaXBTZXJ2aWNlLnN0YXJ0KE1lbWJlcnNoaXBTZXJ2aWNlLk1CUl9UWCk7CisgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoICF2YWxpZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RhcnQgbGV2ZWwsIHZhbGlkIGxldmVscyBhcmU6U05EX1JYX1NFUSxTTkRfVFhfU0VRLE1CUl9UWF9TRVEsTUJSX1JYX1NFUSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhcnRMZXZlbCA9IChzdGFydExldmVsIHwgc3ZjKTsKKyAgICAgICAgfWNhdGNoICggQ2hhbm5lbEV4Y2VwdGlvbiBjeCApIHsKKyAgICAgICAgICAgIHRocm93IGN4OworICAgICAgICB9Y2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDaGFubmVsRXhjZXB0aW9uKHgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2h1dHMgZG93biB0aGUgY2hhbm5lbC4gVGhpcyBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBpbmRpdmlkdWFsIHNlcnZpY2VzIHRvIHNodXRkb3duCisgICAgICogVGhlIHN2YyBwYXJhbWV0ZXIgY2FuIGJlIHRoZSBsb2dpY2FsIG9yIHZhbHVlIG9mIGFueSBjb25zdGFudHMKKyAgICAgKiBAcGFyYW0gc3ZjIGludCB2YWx1ZSBvZiA8QlI+CisgICAgICogREVGQVVMVCAtIHdpbGwgc2h1dGRvd24gYWxsIHNlcnZpY2VzIDxCUj4KKyAgICAgKiBNQlJfUlhfU0VRIC0gc3RhcnRzIHRoZSBtZW1iZXJzaGlwIHJlY2VpdmVyIDxCUj4KKyAgICAgKiBNQlJfVFhfU0VRIC0gc3RhcnRzIHRoZSBtZW1iZXJzaGlwIGJyb2FkY2FzdGVyIDxCUj4KKyAgICAgKiBTTkRfVFhfU0VRIC0gc3RhcnRzIHRoZSByZXBsaWNhdGlvbiB0cmFuc21pdHRlcjxCUj4KKyAgICAgKiBTTkRfUlhfU0VRIC0gc3RhcnRzIHRoZSByZXBsaWNhdGlvbiByZWNlaXZlcjxCUj4KKyAgICAgKiBAdGhyb3dzIENoYW5uZWxFeGNlcHRpb24gaWYgYSBzdGFydHVwIGVycm9yIG9jY3VycyBvciB0aGUgc2VydmljZSBpcyBhbHJlYWR5IHN0YXJ0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGludGVybmFsU3RvcChpbnQgc3ZjKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvL21ha2Ugc3VyZSB3ZSBkb24ndCBwYXNzIGRvd24gYW55IGZsYWdzIHRoYXQgYXJlIHVucmVsYXRlZCB0byB0aGUgYm90dG9tIGxheWVyCisgICAgICAgICAgICBzdmMgPSBzdmMgJiBDaGFubmVsLkRFRkFVTFQ7CisKKyAgICAgICAgICAgIGlmIChzdGFydExldmVsID09IDApIHJldHVybjsgLy93ZSBoYXZlIGFscmVhZHkgc3RvcHBlZCB1cCBhbGwgY29tcG9uZW50cworICAgICAgICAgICAgaWYgKHN2YyA9PSAwICkgcmV0dXJuOy8vbm90aGluZyB0byBzdG9wCisKKyAgICAgICAgICAgIGJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICggQ2hhbm5lbC5TTkRfUlhfU0VRPT0oc3ZjICYgQ2hhbm5lbC5TTkRfUlhfU0VRKSApIHsKKyAgICAgICAgICAgICAgICBjbHVzdGVyUmVjZWl2ZXIuc3RvcCgpOworICAgICAgICAgICAgICAgIGNsdXN0ZXJSZWNlaXZlci5zZXRNZXNzYWdlTGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBDaGFubmVsLlNORF9UWF9TRVE9PShzdmMgJiBDaGFubmVsLlNORF9UWF9TRVEpICkgeworICAgICAgICAgICAgICAgIGNsdXN0ZXJTZW5kZXIuc3RvcCgpOworICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBDaGFubmVsLk1CUl9SWF9TRVE9PShzdmMgJiBDaGFubmVsLk1CUl9SWF9TRVEpICkgeworICAgICAgICAgICAgICAgIG1lbWJlcnNoaXBTZXJ2aWNlLnN0b3AoTWVtYmVyc2hpcFNlcnZpY2UuTUJSX1JYKTsKKyAgICAgICAgICAgICAgICBtZW1iZXJzaGlwU2VydmljZS5zZXRNZW1iZXJzaGlwTGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBDaGFubmVsLk1CUl9UWF9TRVE9PShzdmMgJiBDaGFubmVsLk1CUl9UWF9TRVEpICkgeworICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtZW1iZXJzaGlwU2VydmljZS5zdG9wKE1lbWJlcnNoaXBTZXJ2aWNlLk1CUl9UWCk7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoICF2YWxpZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RhcnQgbGV2ZWwsIHZhbGlkIGxldmVscyBhcmU6U05EX1JYX1NFUSxTTkRfVFhfU0VRLE1CUl9UWF9TRVEsTUJSX1JYX1NFUSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGFydExldmVsID0gKHN0YXJ0TGV2ZWwgJiAofnN2YykpOworICAgICAgICAgICAgCisgICAgICAgIH1jYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENoYW5uZWxFeGNlcHRpb24oeCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIG1lbWJlckFkZGVkKE1lbWJlciBtZW1iZXIpeworICAgICAgICBTZW5kZXJTdGF0ZS5nZXRTZW5kZXJTdGF0ZShtZW1iZXIpOworICAgICAgICBpZiAoIGNsdXN0ZXJTZW5kZXIhPW51bGwgKSBjbHVzdGVyU2VuZGVyLmFkZChtZW1iZXIpOworICAgICAgICBzdXBlci5tZW1iZXJBZGRlZChtZW1iZXIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJEaXNhcHBlYXJlZChNZW1iZXIgbWVtYmVyKXsKKyAgICAgICAgU2VuZGVyU3RhdGUucmVtb3ZlU2VuZGVyU3RhdGUobWVtYmVyKTsKKyAgICAgICAgaWYgKCBjbHVzdGVyU2VuZGVyIT1udWxsICkgY2x1c3RlclNlbmRlci5yZW1vdmUobWVtYmVyKTsKKyAgICAgICAgc3VwZXIubWVtYmVyRGlzYXBwZWFyZWQobWVtYmVyKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKENoYW5uZWxNZXNzYWdlIG1zZykgeworICAgICAgICBpZiAoIExvZ3MuTUVTU0FHRVMuaXNUcmFjZUVuYWJsZWQoKSApIHsKKyAgICAgICAgICAgIExvZ3MuTUVTU0FHRVMudHJhY2UoIkNoYW5uZWxDb29yZGluYXRvciAtIFJlY2VpdmVkIG1zZzoiICsgbmV3IFVuaXF1ZUlkKG1zZy5nZXRVbmlxdWVJZCgpKSArICIgYXQgIiArbmV3IGphdmEuc3FsLlRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkrICIgZnJvbSAiK21zZy5nZXRBZGRyZXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5tZXNzYWdlUmVjZWl2ZWQobXNnKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBDaGFubmVsUmVjZWl2ZXIgZ2V0Q2x1c3RlclJlY2VpdmVyKCkgeworICAgICAgICByZXR1cm4gY2x1c3RlclJlY2VpdmVyOworICAgIH0KKworICAgIHB1YmxpYyBDaGFubmVsU2VuZGVyIGdldENsdXN0ZXJTZW5kZXIoKSB7CisgICAgICAgIHJldHVybiBjbHVzdGVyU2VuZGVyOworICAgIH0KKworICAgIHB1YmxpYyBNZW1iZXJzaGlwU2VydmljZSBnZXRNZW1iZXJzaGlwU2VydmljZSgpIHsKKyAgICAgICAgcmV0dXJuIG1lbWJlcnNoaXBTZXJ2aWNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXJSZWNlaXZlcihDaGFubmVsUmVjZWl2ZXIgY2x1c3RlclJlY2VpdmVyKSB7CisgICAgICAgIGlmICggY2x1c3RlclJlY2VpdmVyICE9IG51bGwgKSB7CisgICAgICAgICAgICB0aGlzLmNsdXN0ZXJSZWNlaXZlciA9IGNsdXN0ZXJSZWNlaXZlcjsKKyAgICAgICAgICAgIHRoaXMuY2x1c3RlclJlY2VpdmVyLnNldE1lc3NhZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICAodGhpcy5jbHVzdGVyUmVjZWl2ZXIhPW51bGwgKSB0aGlzLmNsdXN0ZXJSZWNlaXZlci5zZXRNZXNzYWdlTGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICB0aGlzLmNsdXN0ZXJSZWNlaXZlciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDbHVzdGVyU2VuZGVyKENoYW5uZWxTZW5kZXIgY2x1c3RlclNlbmRlcikgeworICAgICAgICB0aGlzLmNsdXN0ZXJTZW5kZXIgPSBjbHVzdGVyU2VuZGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lbWJlcnNoaXBTZXJ2aWNlKE1lbWJlcnNoaXBTZXJ2aWNlIG1lbWJlcnNoaXBTZXJ2aWNlKSB7CisgICAgICAgIHRoaXMubWVtYmVyc2hpcFNlcnZpY2UgPSBtZW1iZXJzaGlwU2VydmljZTsKKyAgICAgICAgdGhpcy5tZW1iZXJzaGlwU2VydmljZS5zZXRNZW1iZXJzaGlwTGlzdGVuZXIodGhpcyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGhlYXJiZWF0KCkgeworICAgICAgICBpZiAoIGNsdXN0ZXJTZW5kZXIhPW51bGwgKSBjbHVzdGVyU2VuZGVyLmhlYXJ0YmVhdCgpOworICAgICAgICBzdXBlci5oZWFydGJlYXQoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogaGFzIG1lbWJlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZW1iZXJzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5nZXRNZW1iZXJzaGlwU2VydmljZSgpLmhhc01lbWJlcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIGN1cnJlbnQgY2x1c3RlciBtZW1iZXJzCisgICAgICogQHJldHVybiBhbGwgbWVtYmVycyBvciBlbXB0eSBhcnJheQorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXJbXSBnZXRNZW1iZXJzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5nZXRNZW1iZXJzaGlwU2VydmljZSgpLmdldE1lbWJlcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWJyIE1lbWJlcgorICAgICAqIEByZXR1cm4gTWVtYmVyCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBnZXRNZW1iZXIoTWVtYmVyIG1icil7CisgICAgICAgIHJldHVybiB0aGlzLmdldE1lbWJlcnNoaXBTZXJ2aWNlKCkuZ2V0TWVtYmVyKG1icik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1lbWJlciB0aGF0IHJlcHJlc2VudHMgdGhpcyBub2RlLgorICAgICAqCisgICAgICogQHJldHVybiBNZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyIGdldExvY2FsTWVtYmVyKGJvb2xlYW4gaW5jQWxpdmUpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVtYmVyc2hpcFNlcnZpY2UoKS5nZXRMb2NhbE1lbWJlcihpbmNBbGl2ZSk7CisgICAgfQorCisgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9DaGFubmVsSW50ZXJjZXB0b3JCYXNlLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvQ2hhbm5lbEludGVyY2VwdG9yQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZjNiNzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvQ2hhbm5lbEludGVyY2VwdG9yQmFzZS5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsSW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworCisvKioKKyAqIEFic3RyYWN0IGNsYXNzIGZvciB0aGUgaW50ZXJjZXB0b3IgYmFzZSBjbGFzcy4KKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDaGFubmVsSW50ZXJjZXB0b3JCYXNlIGltcGxlbWVudHMgQ2hhbm5lbEludGVyY2VwdG9yIHsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKAorICAgICAgICBDaGFubmVsSW50ZXJjZXB0b3JCYXNlLmNsYXNzKTsKKworICAgIHByaXZhdGUgQ2hhbm5lbEludGVyY2VwdG9yIG5leHQ7CisgICAgcHJpdmF0ZSBDaGFubmVsSW50ZXJjZXB0b3IgcHJldmlvdXM7CisgICAgLy9kZWZhdWx0IHZhbHVlLCBhbHdheXMgcHJvY2VzcworICAgIHByb3RlY3RlZCBpbnQgb3B0aW9uRmxhZyA9IDA7CisKKyAgICBwdWJsaWMgQ2hhbm5lbEludGVyY2VwdG9yQmFzZSgpIHsKKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBva1RvUHJvY2VzcyhpbnQgbWVzc2FnZUZsYWdzKSB7IAorICAgICAgICBpZiAodGhpcy5vcHRpb25GbGFnID09IDAgKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuICgob3B0aW9uRmxhZyZtZXNzYWdlRmxhZ3MpID09IG9wdGlvbkZsYWcpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldE5leHQoQ2hhbm5lbEludGVyY2VwdG9yIG5leHQpIHsKKyAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgQ2hhbm5lbEludGVyY2VwdG9yIGdldE5leHQoKSB7CisgICAgICAgIHJldHVybiBuZXh0OworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFByZXZpb3VzKENoYW5uZWxJbnRlcmNlcHRvciBwcmV2aW91cykgeworICAgICAgICB0aGlzLnByZXZpb3VzID0gcHJldmlvdXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3B0aW9uRmxhZyhpbnQgb3B0aW9uRmxhZykgeworICAgICAgICB0aGlzLm9wdGlvbkZsYWcgPSBvcHRpb25GbGFnOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBDaGFubmVsSW50ZXJjZXB0b3IgZ2V0UHJldmlvdXMoKSB7CisgICAgICAgIHJldHVybiBwcmV2aW91czsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE9wdGlvbkZsYWcoKSB7CisgICAgICAgIHJldHVybiBvcHRpb25GbGFnOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKE1lbWJlcltdIGRlc3RpbmF0aW9uLCBDaGFubmVsTWVzc2FnZSBtc2csIEludGVyY2VwdG9yUGF5bG9hZCBwYXlsb2FkKSB0aHJvd3MKKyAgICAgICAgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChnZXROZXh0KCkgIT0gbnVsbCkgZ2V0TmV4dCgpLnNlbmRNZXNzYWdlKGRlc3RpbmF0aW9uLCBtc2csIHBheWxvYWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZWNlaXZlZChDaGFubmVsTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgaWYgKGdldFByZXZpb3VzKCkgIT0gbnVsbCkgZ2V0UHJldmlvdXMoKS5tZXNzYWdlUmVjZWl2ZWQobXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQ2hhbm5lbE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lbWJlckFkZGVkKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgLy9ub3RpZnkgdXB3YXJkcworICAgICAgICBpZiAoZ2V0UHJldmlvdXMoKSAhPSBudWxsKSBnZXRQcmV2aW91cygpLm1lbWJlckFkZGVkKG1lbWJlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWVtYmVyRGlzYXBwZWFyZWQoTWVtYmVyIG1lbWJlcikgeworICAgICAgICAvL25vdGlmeSB1cHdhcmRzCisgICAgICAgIGlmIChnZXRQcmV2aW91cygpICE9IG51bGwpIGdldFByZXZpb3VzKCkubWVtYmVyRGlzYXBwZWFyZWQobWVtYmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoZWFydGJlYXQoKSB7CisgICAgICAgIGlmIChnZXROZXh0KCkgIT0gbnVsbCkgZ2V0TmV4dCgpLmhlYXJ0YmVhdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGhhcyBtZW1iZXJzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTWVtYmVycygpIHsKKyAgICAgICAgaWYgKCBnZXROZXh0KCkhPW51bGwgKXJldHVybiBnZXROZXh0KCkuaGFzTWVtYmVycygpOworICAgICAgICBlbHNlIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIGN1cnJlbnQgY2x1c3RlciBtZW1iZXJzCisgICAgICogQHJldHVybiBhbGwgbWVtYmVycyBvciBlbXB0eSBhcnJheQorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXJbXSBnZXRNZW1iZXJzKCkgeworICAgICAgICBpZiAoIGdldE5leHQoKSE9bnVsbCApIHJldHVybiBnZXROZXh0KCkuZ2V0TWVtYmVycygpOworICAgICAgICBlbHNlIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIG1iciBNZW1iZXIKKyAgICAgKiBAcmV0dXJuIE1lbWJlcgorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXIgZ2V0TWVtYmVyKE1lbWJlciBtYnIpIHsKKyAgICAgICAgaWYgKCBnZXROZXh0KCkhPW51bGwpIHJldHVybiBnZXROZXh0KCkuZ2V0TWVtYmVyKG1icik7CisgICAgICAgIGVsc2UgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtZW1iZXIgdGhhdCByZXByZXNlbnRzIHRoaXMgbm9kZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTWVtYmVyCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBnZXRMb2NhbE1lbWJlcihib29sZWFuIGluY0FsaXZlKSB7CisgICAgICAgIGlmICggZ2V0TmV4dCgpIT1udWxsICkgcmV0dXJuIGdldE5leHQoKS5nZXRMb2NhbE1lbWJlcihpbmNBbGl2ZSk7CisgICAgICAgIGVsc2UgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFN0YXJ0cyB1cCB0aGUgY2hhbm5lbC4gVGhpcyBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBpbmRpdmlkdWFsIHNlcnZpY2VzIHRvIHN0YXJ0CisgICAgICogVGhlIHN2YyBwYXJhbWV0ZXIgY2FuIGJlIHRoZSBsb2dpY2FsIG9yIHZhbHVlIG9mIGFueSBjb25zdGFudHMKKyAgICAgKiBAcGFyYW0gc3ZjIGludCB2YWx1ZSBvZiA8QlI+CisgICAgICogREVGQVVMVCAtIHdpbGwgc3RhcnQgYWxsIHNlcnZpY2VzIDxCUj4KKyAgICAgKiBNQlJfUlhfU0VRIC0gc3RhcnRzIHRoZSBtZW1iZXJzaGlwIHJlY2VpdmVyIDxCUj4KKyAgICAgKiBNQlJfVFhfU0VRIC0gc3RhcnRzIHRoZSBtZW1iZXJzaGlwIGJyb2FkY2FzdGVyIDxCUj4KKyAgICAgKiBTTkRfVFhfU0VRIC0gc3RhcnRzIHRoZSByZXBsaWNhdGlvbiB0cmFuc21pdHRlcjxCUj4KKyAgICAgKiBTTkRfUlhfU0VRIC0gc3RhcnRzIHRoZSByZXBsaWNhdGlvbiByZWNlaXZlcjxCUj4KKyAgICAgKiBAdGhyb3dzIENoYW5uZWxFeGNlcHRpb24gaWYgYSBzdGFydHVwIGVycm9yIG9jY3VycyBvciB0aGUgc2VydmljZSBpcyBhbHJlYWR5IHN0YXJ0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoaW50IHN2YykgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICBpZiAoIGdldE5leHQoKSE9bnVsbCApIGdldE5leHQoKS5zdGFydChzdmMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNodXRzIGRvd24gdGhlIGNoYW5uZWwuIFRoaXMgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgaW5kaXZpZHVhbCBzZXJ2aWNlcyB0byBzaHV0ZG93bgorICAgICAqIFRoZSBzdmMgcGFyYW1ldGVyIGNhbiBiZSB0aGUgbG9naWNhbCBvciB2YWx1ZSBvZiBhbnkgY29uc3RhbnRzCisgICAgICogQHBhcmFtIHN2YyBpbnQgdmFsdWUgb2YgPEJSPgorICAgICAqIERFRkFVTFQgLSB3aWxsIHNodXRkb3duIGFsbCBzZXJ2aWNlcyA8QlI+CisgICAgICogTUJSX1JYX1NFUSAtIHN0b3BzIHRoZSBtZW1iZXJzaGlwIHJlY2VpdmVyIDxCUj4KKyAgICAgKiBNQlJfVFhfU0VRIC0gc3RvcHMgdGhlIG1lbWJlcnNoaXAgYnJvYWRjYXN0ZXIgPEJSPgorICAgICAqIFNORF9UWF9TRVEgLSBzdG9wcyB0aGUgcmVwbGljYXRpb24gdHJhbnNtaXR0ZXI8QlI+CisgICAgICogU05EX1JYX1NFUSAtIHN0b3BzIHRoZSByZXBsaWNhdGlvbiByZWNlaXZlcjxCUj4KKyAgICAgKiBAdGhyb3dzIENoYW5uZWxFeGNlcHRpb24gaWYgYSBzdGFydHVwIGVycm9yIG9jY3VycyBvciB0aGUgc2VydmljZSBpcyBhbHJlYWR5IHN0YXJ0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcChpbnQgc3ZjKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChnZXROZXh0KCkgIT0gbnVsbCkgZ2V0TmV4dCgpLnN0b3Aoc3ZjKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZmlyZUludGVyY2VwdG9yRXZlbnQoSW50ZXJjZXB0b3JFdmVudCBldmVudCkgeworICAgICAgICAvL2VtcHR5IG9wZXJhdGlvbgorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvR3JvdXBDaGFubmVsLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvR3JvdXBDaGFubmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyZGVmNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9Hcm91cENoYW5uZWwuamF2YQpAQCAtMCwwICsxLDY2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cDsKKworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5CeXRlTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbEludGVyY2VwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsUmVjZWl2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbFNlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5FcnJvckhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWFuYWdlZENoYW5uZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcnNoaXBMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXJzaGlwU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuTWVzc2FnZURpc3BhdGNoSW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uQ2hhbm5lbERhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uWEJ5dGVCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuVW5pcXVlSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuSGVhcnRiZWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLkJ1ZmZlclBvb2w7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5SZW1vdGVQcm9jZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnV0aWwuTG9nczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy51dGlsLkFycmF5czsKKworLyoqCisgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBhIENoYW5uZWwuPGJyPgorICogVGhlIEdyb3VwQ2hhbm5lbCBtYW5hZ2VzIHRoZSByZXBsaWNhdGlvbiBjaGFubmVsLiBJdCBjb29yZGluYXRlcworICogbWVzc2FnZSBiZWluZyBzZW50IGFuZCByZWNlaXZlZCB3aXRoIG1lbWJlcnNoaXAgYW5ub3VuY2VtZW50cy4KKyAqIFRoZSBjaGFubmVsIGhhcyBhbiBjaGFpbiBvZiBpbnRlcmNlcHRvcnMgdGhhdCBjYW4gbW9kaWZ5IHRoZSBtZXNzYWdlIG9yIHBlcmZvcm0gb3RoZXIgbG9naWMuPGJyPgorICogSXQgbWFuYWdlcyBhIGNvbXBsZXRlIGdyb3VwLCBib3RoIG1lbWJlcnNoaXAgYW5kIHJlcGxpY2F0aW9uLgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBHcm91cENoYW5uZWwgZXh0ZW5kcyBDaGFubmVsSW50ZXJjZXB0b3JCYXNlIGltcGxlbWVudHMgTWFuYWdlZENoYW5uZWwgeworICAgIC8qKgorICAgICAqIEZsYWcgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFubmVsIG1hbmFnZXMgaXRzIG93biBoZWFydGJlYXQKKyAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGNoYW5uZWwgd2lsbCBzdGFydCBhIGxvY2FsIHRocmVhZCBmb3IgdGhlIGhlYXJ0IGJlYXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGVhcnRiZWF0ID0gdHJ1ZTsKKyAgICAvKioKKyAgICAgKiBJZiA8Y29kZT5oZWFydGJlYXQgPT0gdHJ1ZTwvY29kZT4gdGhlbiBob3cgb2Z0ZW4gZG8gd2Ugd2FudCB0aGlzCisgICAgICogaGVhcnRiZWF0IHRvIHJ1bi4gZGVmYXVsdCBpcyBvbmUgbWludXRlCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgaGVhcnRiZWF0U2xlZXB0aW1lID0gNSoxMDAwOy8vZXZlcnkgNSBzZWNvbmRzCisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBoZWFydGJlYXQgdGhyZWFkCisgICAgICovCisgICAgcHJvdGVjdGVkIEhlYXJ0YmVhdFRocmVhZCBoYnRocmVhZCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgIDxjb2RlPkNoYW5uZWxDb29yZGluYXRvcjwvY29kZT4gY29vcmRpbmF0ZXMgdGhlIGJvdHRvbSBsYXllciBjb21wb25lbnRzOjxicj4KKyAgICAgKiAtIE1lbWJlcnNoaXBTZXJ2aWNlPGJyPgorICAgICAqIC0gQ2hhbm5lbFNlbmRlciA8YnI+CisgICAgICogLSBDaGFubmVsUmVjZWl2ZXI8YnI+CisgICAgICovCisgICAgcHJvdGVjdGVkIENoYW5uZWxDb29yZGluYXRvciBjb29yZGluYXRvciA9IG5ldyBDaGFubmVsQ29vcmRpbmF0b3IoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBmaXJzdCBpbnRlcmNlcHRvciBpbiB0aGUgaW50ZWNlcHRvciBzdGFjay4KKyAgICAgKiBUaGUgaW50ZXJjZXB0b3JzIGFyZSBjaGFpbmVkIGluIGEgbGlua2VkIGxpc3QsIHNvIHdlIG9ubHkgbmVlZCBhIHJlZmVyZW5jZSB0byB0aGUKKyAgICAgKiBmaXJzdCBvbmUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2hhbm5lbEludGVyY2VwdG9yIGludGVyY2VwdG9ycyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBBIGxpc3Qgb2YgbWVtYmVyc2hpcCBsaXN0ZW5lcnMgdGhhdCBzdWJzY3JpYmUgdG8gbWVtYmVyc2hpcCBhbm5vdW5jZW1lbnRzCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBtZW1iZXJzaGlwTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgLyoqCisgICAgICogQSBsaXN0IG9mIGNoYW5uZWwgbGlzdGVuZXJzIHRoYXQgc3Vic2NyaWJlIHRvIGluY29taW5nIG1lc3NhZ2VzCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBjaGFubmVsTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgLyoqCisgICAgICogSWYgc2V0IHRvIHRydWUsIHRoZSBHcm91cENoYW5uZWwgd2lsbCBjaGVjayB0byBtYWtlIHN1cmUgdGhhdAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIG9wdGlvbkNoZWNrID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgR3JvdXBDaGFubmVsLiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgYWxzbworICAgICAqIGFkZCB0aGUgZmlyc3QgaW50ZXJjZXB0b3IgaW4gdGhlIEdyb3VwQ2hhbm5lbC48YnI+CisgICAgICogVGhlIGZpcnN0IGludGVyY2VwdG9yIGlzIGFsd2F5cyB0aGUgY2hhbm5lbCBpdHNlbGYuCisgICAgICovCisgICAgcHVibGljIEdyb3VwQ2hhbm5lbCgpIHsKKyAgICAgICAgYWRkSW50ZXJjZXB0b3IodGhpcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGludGVyY2VwdG9yIHRvIHRoZSBzdGFjayBmb3IgbWVzc2FnZSBwcm9jZXNzaW5nPGJyPgorICAgICAqIEludGVyY2VwdG9ycyBhcmUgb3JkZXJlZCBpbiB0aGUgd2F5IHRoZXkgYXJlIGFkZGVkLjxicj4KKyAgICAgKiA8Y29kZT5jaGFubmVsLmFkZEludGVyY2VwdG9yKEEpOzwvY29kZT48YnI+CisgICAgICogPGNvZGU+Y2hhbm5lbC5hZGRJbnRlcmNlcHRvcihDKTs8L2NvZGU+PGJyPgorICAgICAqIDxjb2RlPmNoYW5uZWwuYWRkSW50ZXJjZXB0b3IoQik7PC9jb2RlPjxicj4KKyAgICAgKiBXaWxsIHJlc3VsdCBpbiBhIGludGVyY2VwdG9yIHN0YWNrIGxpa2UgdGhpczo8YnI+CisgICAgICogPGNvZGU+QSAtPiBDIC0+IEI8L2NvZGU+PGJyPgorICAgICAqIFRoZSBjb21wbGV0ZSBzdGFjayB3aWxsIGxvb2sgbGlrZSB0aGlzOjxicj4KKyAgICAgKiA8Y29kZT5DaGFubmVsIC0+IEEgLT4gQyAtPiBCIC0+IENoYW5uZWxDb29yZGluYXRvcjwvY29kZT48YnI+CisgICAgICogQHBhcmFtIGludGVyY2VwdG9yIENoYW5uZWxJbnRlcmNlcHRvckJhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRJbnRlcmNlcHRvcihDaGFubmVsSW50ZXJjZXB0b3IgaW50ZXJjZXB0b3IpIHsKKyAgICAgICAgaWYgKCBpbnRlcmNlcHRvcnMgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIGludGVyY2VwdG9ycyA9IGludGVyY2VwdG9yOworICAgICAgICAgICAgaW50ZXJjZXB0b3JzLnNldE5leHQoY29vcmRpbmF0b3IpOworICAgICAgICAgICAgaW50ZXJjZXB0b3JzLnNldFByZXZpb3VzKG51bGwpOworICAgICAgICAgICAgY29vcmRpbmF0b3Iuc2V0UHJldmlvdXMoaW50ZXJjZXB0b3JzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENoYW5uZWxJbnRlcmNlcHRvciBsYXN0ID0gaW50ZXJjZXB0b3JzOworICAgICAgICAgICAgd2hpbGUgKCBsYXN0LmdldE5leHQoKSAhPSBjb29yZGluYXRvciApIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gbGFzdC5nZXROZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0LnNldE5leHQoaW50ZXJjZXB0b3IpOworICAgICAgICAgICAgaW50ZXJjZXB0b3Iuc2V0TmV4dChjb29yZGluYXRvcik7CisgICAgICAgICAgICBpbnRlcmNlcHRvci5zZXRQcmV2aW91cyhsYXN0KTsKKyAgICAgICAgICAgIGNvb3JkaW5hdG9yLnNldFByZXZpb3VzKGludGVyY2VwdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIGEgaGVhcnRiZWF0IHRocm91Z2ggdGhlIGludGVyY2VwdG9yIHN0YWNrLjxicj4KKyAgICAgKiBJbnZva2UgdGhpcyBtZXRob2QgZnJvbSB0aGUgYXBwbGljYXRpb24gb24gYSBwZXJpb2RpYyBiYXNpcyBpZgorICAgICAqIHlvdSBoYXZlIHR1cm5lZCBvZmYgaW50ZXJuYWwgaGVhcnRiZWF0cyA8Y29kZT5jaGFubmVsLnNldEhlYXJ0YmVhdChmYWxzZSk8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgaGVhcnRiZWF0KCkgeworICAgICAgICBzdXBlci5oZWFydGJlYXQoKTsKKyAgICAgICAgSXRlcmF0b3IgaSA9IG1lbWJlcnNoaXBMaXN0ZW5lcnMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKCBpLmhhc05leHQoKSApIHsKKyAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7CisgICAgICAgICAgICBpZiAoIG8gaW5zdGFuY2VvZiBIZWFydGJlYXQgKSAoKEhlYXJ0YmVhdClvKS5oZWFydGJlYXQoKTsKKyAgICAgICAgfQorICAgICAgICBpID0gY2hhbm5lbExpc3RlbmVycy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoIGkuaGFzTmV4dCgpICkgeworICAgICAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKKyAgICAgICAgICAgIGlmICggbyBpbnN0YW5jZW9mIEhlYXJ0YmVhdCApICgoSGVhcnRiZWF0KW8pLmhlYXJ0YmVhdCgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBkZXN0aW5hdGlvbnMgc3BlY2lmaWVkCisgICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIE1lbWJlcltdIC0gZGVzdGluYXRpb24ubGVuZ3RoID4gMQorICAgICAqIEBwYXJhbSBtc2cgU2VyaWFsaXphYmxlIC0gdGhlIG1lc3NhZ2UgdG8gc2VuZAorICAgICAqIEBwYXJhbSBvcHRpb25zIGludCAtIHNlbmRlciBvcHRpb25zLCBvcHRpb25zIGNhbiB0cmlnZ2VyIGd1YXJhbnRlZSBsZXZlbHMgYW5kIGRpZmZlcmVudCBpbnRlcmNlcHRvcnMgdG8KKyAgICAgKiByZWFjdCB0byB0aGUgbWVzc2FnZSBzZWUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIDxjb2RlPkNoYW5uZWw8L2NvZGU+IG9iamVjdC48YnI+CisgICAgICogQHJldHVybiBVbmlxdWVJZCAtIHRoZSB1bmlxdWUgSWQgdGhhdCB3YXMgYXNzaWduZWQgdG8gdGhpcyBtZXNzYWdlCisgICAgICogQHRocm93cyBDaGFubmVsRXhjZXB0aW9uIC0gaWYgYW4gZXJyb3Igb2NjdXJzIHByb2Nlc3NpbmcgdGhlIG1lc3NhZ2UKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgVW5pcXVlSWQgc2VuZChNZW1iZXJbXSBkZXN0aW5hdGlvbiwgU2VyaWFsaXphYmxlIG1zZywgaW50IG9wdGlvbnMpIHRocm93cyBDaGFubmVsRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNlbmQoZGVzdGluYXRpb24sbXNnLG9wdGlvbnMsbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gTWVtYmVyW10gLSBkZXN0aW5hdGlvbi5sZW5ndGggPiAxCisgICAgICogQHBhcmFtIG1zZyBTZXJpYWxpemFibGUgLSB0aGUgbWVzc2FnZSB0byBzZW5kCisgICAgICogQHBhcmFtIG9wdGlvbnMgaW50IC0gc2VuZGVyIG9wdGlvbnMsIG9wdGlvbnMgY2FuIHRyaWdnZXIgZ3VhcmFudGVlIGxldmVscyBhbmQgZGlmZmVyZW50IGludGVyY2VwdG9ycyB0bworICAgICAqIHJlYWN0IHRvIHRoZSBtZXNzYWdlIHNlZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciB0aGUgPGNvZGU+Q2hhbm5lbDwvY29kZT4gb2JqZWN0Ljxicj4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciAtIGNhbGxiYWNrIG9iamVjdCBmb3IgZXJyb3IgaGFuZGxpbmcgYW5kIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uLCB1c2VkIHdoZW4gYSBtZXNzYWdlIGlzCisgICAgICogc2VudCBhc3luY2hyb25vdXNseSB1c2luZyB0aGUgPGNvZGU+Q2hhbm5lbC5TRU5EX09QVElPTlNfQVNZTkNIUk9OT1VTPC9jb2RlPiBmbGFnIGVuYWJsZWQuCisgICAgICogQHJldHVybiBVbmlxdWVJZCAtIHRoZSB1bmlxdWUgSWQgdGhhdCB3YXMgYXNzaWduZWQgdG8gdGhpcyBtZXNzYWdlCisgICAgICogQHRocm93cyBDaGFubmVsRXhjZXB0aW9uIC0gaWYgYW4gZXJyb3Igb2NjdXJzIHByb2Nlc3NpbmcgdGhlIG1lc3NhZ2UKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgVW5pcXVlSWQgc2VuZChNZW1iZXJbXSBkZXN0aW5hdGlvbiwgU2VyaWFsaXphYmxlIG1zZywgaW50IG9wdGlvbnMsIEVycm9ySGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICggbXNnID09IG51bGwgKSB0aHJvdyBuZXcgQ2hhbm5lbEV4Y2VwdGlvbigiQ2FudCBzZW5kIGEgTlVMTCBtZXNzYWdlIik7CisgICAgICAgIFhCeXRlQnVmZmVyIGJ1ZmZlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIGRlc3RpbmF0aW9uID09IG51bGwgfHwgZGVzdGluYXRpb24ubGVuZ3RoID09IDApIHRocm93IG5ldyBDaGFubmVsRXhjZXB0aW9uKCJObyBkZXN0aW5hdGlvbiBnaXZlbiIpOworICAgICAgICAgICAgQ2hhbm5lbERhdGEgZGF0YSA9IG5ldyBDaGFubmVsRGF0YSh0cnVlKTsvL2dlbmVyYXRlcyBhIHVuaXF1ZSBJZAorICAgICAgICAgICAgZGF0YS5zZXRBZGRyZXNzKGdldExvY2FsTWVtYmVyKGZhbHNlKSk7CisgICAgICAgICAgICBkYXRhLnNldFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICBieXRlW10gYiA9IG51bGw7CisgICAgICAgICAgICBpZiAoIG1zZyBpbnN0YW5jZW9mIEJ5dGVNZXNzYWdlICl7CisgICAgICAgICAgICAgICAgYiA9ICgoQnl0ZU1lc3NhZ2UpbXNnKS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfCBTRU5EX09QVElPTlNfQllURV9NRVNTQUdFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiID0gWEJ5dGVCdWZmZXIuc2VyaWFsaXplKG1zZyk7CisgICAgICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgJiAoflNFTkRfT1BUSU9OU19CWVRFX01FU1NBR0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YS5zZXRPcHRpb25zKG9wdGlvbnMpOworICAgICAgICAgICAgLy9YQnl0ZUJ1ZmZlciBidWZmZXIgPSBuZXcgWEJ5dGVCdWZmZXIoYi5sZW5ndGgrMTI4LGZhbHNlKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IEJ1ZmZlclBvb2wuZ2V0QnVmZmVyUG9vbCgpLmdldEJ1ZmZlcihiLmxlbmd0aCsxMjgsIGZhbHNlKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoYiwwLGIubGVuZ3RoKTsKKyAgICAgICAgICAgIGRhdGEuc2V0TWVzc2FnZShidWZmZXIpOworICAgICAgICAgICAgSW50ZXJjZXB0b3JQYXlsb2FkIHBheWxvYWQgPSBudWxsOworICAgICAgICAgICAgaWYgKCBoYW5kbGVyICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG5ldyBJbnRlcmNlcHRvclBheWxvYWQoKTsKKyAgICAgICAgICAgICAgICBwYXlsb2FkLnNldEVycm9ySGFuZGxlcihoYW5kbGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldEZpcnN0SW50ZXJjZXB0b3IoKS5zZW5kTWVzc2FnZShkZXN0aW5hdGlvbiwgZGF0YSwgcGF5bG9hZCk7CisgICAgICAgICAgICBpZiAoIExvZ3MuTUVTU0FHRVMuaXNUcmFjZUVuYWJsZWQoKSApIHsKKyAgICAgICAgICAgICAgICBMb2dzLk1FU1NBR0VTLnRyYWNlKCJHcm91cENoYW5uZWwgLSBTZW50IG1zZzoiICsgbmV3IFVuaXF1ZUlkKGRhdGEuZ2V0VW5pcXVlSWQoKSkgKyAiIGF0ICIgK25ldyBqYXZhLnNxbC5UaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKyAiIHRvICIrQXJyYXlzLnRvTmFtZVN0cmluZyhkZXN0aW5hdGlvbikpOworICAgICAgICAgICAgICAgIExvZ3MuTUVTU0FHRVMudHJhY2UoIkdyb3VwQ2hhbm5lbCAtIFNlbmQgTWVzc2FnZToiICsgbmV3IFVuaXF1ZUlkKGRhdGEuZ2V0VW5pcXVlSWQoKSkgKyAiIGlzICIgK21zZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVW5pcXVlSWQoZGF0YS5nZXRVbmlxdWVJZCgpKTsKKyAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBpZiAoIHggaW5zdGFuY2VvZiBDaGFubmVsRXhjZXB0aW9uICkgdGhyb3cgKENoYW5uZWxFeGNlcHRpb24peDsKKyAgICAgICAgICAgIHRocm93IG5ldyBDaGFubmVsRXhjZXB0aW9uKHgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKCBidWZmZXIgIT0gbnVsbCApIEJ1ZmZlclBvb2wuZ2V0QnVmZmVyUG9vbCgpLnJldHVybkJ1ZmZlcihidWZmZXIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmcm9tIHRoZSBpbnRlcmNlcHRvciBzdGFjay4gPGJyPgorICAgICAqIFdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIGZyb20gYSByZW1vdGUgbm9kZSwgdGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGJ5CisgICAgICogdGhlIHByZXZpb3VzIGludGVyY2VwdG9yLjxicj4KKyAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYWxzbyBiZSB1c2VkIHRvIHNlbmQgYSBtZXNzYWdlIHRvIG90aGVyIGNvbXBvbmVudHMgd2l0aGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uLAorICAgICAqIGJ1dCBpdHMgYW4gZXh0cmVtZSBjYXNlLCBhbmQgeW91J3JlIHByb2JhYmx5IGJldHRlciBvZmYgZG9pbmcgdGhhdCBsb2dpYyBiZXR3ZWVuIHRoZSBhcHBsaWNhdGlvbnMgaXRzZWxmLgorICAgICAqIEBwYXJhbSBtc2cgQ2hhbm5lbE1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoQ2hhbm5lbE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIGlmICggbXNnID09IG51bGwgKSByZXR1cm47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIExvZ3MuTUVTU0FHRVMuaXNUcmFjZUVuYWJsZWQoKSApIHsKKyAgICAgICAgICAgICAgICBMb2dzLk1FU1NBR0VTLnRyYWNlKCJHcm91cENoYW5uZWwgLSBSZWNlaXZlZCBtc2c6IiArIG5ldyBVbmlxdWVJZChtc2cuZ2V0VW5pcXVlSWQoKSkgKyAiIGF0ICIgK25ldyBqYXZhLnNxbC5UaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKyAiIGZyb20gIittc2cuZ2V0QWRkcmVzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNlcmlhbGl6YWJsZSBmd2QgPSBudWxsOworICAgICAgICAgICAgaWYgKCAobXNnLmdldE9wdGlvbnMoKSAmIFNFTkRfT1BUSU9OU19CWVRFX01FU1NBR0UpID09IFNFTkRfT1BUSU9OU19CWVRFX01FU1NBR0UgKSB7CisgICAgICAgICAgICAgICAgZndkID0gbmV3IEJ5dGVNZXNzYWdlKG1zZy5nZXRNZXNzYWdlKCkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZ3ZCA9IFhCeXRlQnVmZmVyLmRlc2VyaWFsaXplKG1zZy5nZXRNZXNzYWdlKCkuZ2V0Qnl0ZXNEaXJlY3QoKSwwLG1zZy5nZXRNZXNzYWdlKCkuZ2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBMb2dzLk1FU1NBR0VTLmlzVHJhY2VFbmFibGVkKCkgKSB7CisgICAgICAgICAgICAgICAgTG9ncy5NRVNTQUdFUy50cmFjZSgiR3JvdXBDaGFubmVsIC0gUmVjZWl2ZSBNZXNzYWdlOiIgKyBuZXcgVW5pcXVlSWQobXNnLmdldFVuaXF1ZUlkKCkpICsgIiBpcyAiICtmd2QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL2dldCB0aGUgYWN0dWFsIG1lbWJlciB3aXRoIHRoZSBjb3JyZWN0IGFsaXZlIHRpbWUKKyAgICAgICAgICAgIE1lbWJlciBzb3VyY2UgPSBtc2cuZ2V0QWRkcmVzcygpOworICAgICAgICAgICAgYm9vbGVhbiByeCA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBkZWxpdmVyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoIGludCBpPTA7IGk8Y2hhbm5lbExpc3RlbmVycy5zaXplKCk7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBDaGFubmVsTGlzdGVuZXIgY2hhbm5lbExpc3RlbmVyID0gKENoYW5uZWxMaXN0ZW5lciljaGFubmVsTGlzdGVuZXJzLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbExpc3RlbmVyICE9IG51bGwgJiYgY2hhbm5lbExpc3RlbmVyLmFjY2VwdChmd2QsIHNvdXJjZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbExpc3RlbmVyLm1lc3NhZ2VSZWNlaXZlZChmd2QsIHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIC8vaWYgdGhlIG1lc3NhZ2Ugd2FzIGFjY2VwdGVkIGJ5IGFuIFJQQyBjaGFubmVsLCB0aGF0IGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgLy9pcyByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nIHRoZSByZXBseSwgb3RoZXJ3aXNlIHdlIHNlbmQgYW4gYWJzZW5jZSByZXBseQorICAgICAgICAgICAgICAgICAgICBpZiAoIGNoYW5uZWxMaXN0ZW5lciBpbnN0YW5jZW9mIFJwY0NoYW5uZWwgKSByeCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfS8vZm9yCisgICAgICAgICAgICBpZiAoKCFyeCkgJiYgKGZ3ZCBpbnN0YW5jZW9mIFJwY01lc3NhZ2UpKSB7CisgICAgICAgICAgICAgICAgLy9pZiB3ZSBoYXZlIGEgbWVzc2FnZSB0aGF0IHJlcXVpcmVzIGEgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgLy9idXQgbm9uZSB3YXMgZ2l2ZW4sIHNlbmQgYmFjayBhbiBpbW1lZGlhdGUgb25lCisgICAgICAgICAgICAgICAgc2VuZE5vUnBjQ2hhbm5lbFJlcGx5KChScGNNZXNzYWdlKWZ3ZCxzb3VyY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBMb2dzLk1FU1NBR0VTLmlzVHJhY2VFbmFibGVkKCkgKSB7CisgICAgICAgICAgICAgICAgTG9ncy5NRVNTQUdFUy50cmFjZSgiR3JvdXBDaGFubmVsIGRlbGl2ZXJlZFsiK2RlbGl2ZXJlZCsiXSBpZDoiK25ldyBVbmlxdWVJZChtc2cuZ2V0VW5pcXVlSWQoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKSBsb2cuZXJyb3IoIlVuYWJsZSB0byBwcm9jZXNzIGNoYW5uZWw6SU9FeGNlcHRpb24uIix4KTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVQcm9jZXNzRXhjZXB0aW9uKCJJT0V4Y2VwdGlvbjoiK3guZ2V0TWVzc2FnZSgpLHgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgYSA8Y29kZT5Ob1JwY0NoYW5uZWxSZXBseTwvY29kZT4gbWVzc2FnZSB0byBhIG1lbWJlcjxicj4KKyAgICAgKiBUaGlzIG1ldGhvZCBnZXRzIGludm9rZWQgYnkgdGhlIGNoYW5uZWwgaWYgYSBSUEMgbWVzc2FnZSBjb21lcyBpbgorICAgICAqIGFuZCBubyBjaGFubmVsIGxpc3RlbmVyIGFjY2VwdHMgdGhlIG1lc3NhZ2UuIFRoaXMgYXZvaWRzIHRpbWVvdXQKKyAgICAgKiBAcGFyYW0gbXNnIFJwY01lc3NhZ2UKKyAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gTWVtYmVyIC0gdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgcmVwbHkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kTm9ScGNDaGFubmVsUmVwbHkoUnBjTWVzc2FnZSBtc2csIE1lbWJlciBkZXN0aW5hdGlvbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy9hdm9pZCBjaXJjdWxhciBsb29wCisgICAgICAgICAgICBpZiAoIG1zZyBpbnN0YW5jZW9mIFJwY01lc3NhZ2UuTm9ScGNDaGFubmVsUmVwbHkpIHJldHVybjsKKyAgICAgICAgICAgIFJwY01lc3NhZ2UuTm9ScGNDaGFubmVsUmVwbHkgcmVwbHkgPSBuZXcgUnBjTWVzc2FnZS5Ob1JwY0NoYW5uZWxSZXBseShtc2cucnBjSWQsbXNnLnV1aWQpOworICAgICAgICAgICAgc2VuZChuZXcgTWVtYmVyW117ZGVzdGluYXRpb259LHJlcGx5LENoYW5uZWwuU0VORF9PUFRJT05TX0FTWU5DSFJPTk9VUyk7CisgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGZpbmQgcnBjIGNoYW5uZWwsIGZhaWxlZCB0byBzZW5kIE5vUnBjQ2hhbm5lbFJlcGx5LiIseCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtZW1iZXJBZGRlZCBnZXRzIGludm9rZWQgYnkgdGhlIGludGVyY2VwdG9yIGJlbG93IHRoZSBjaGFubmVsCisgICAgICogYW5kIHRoZSBjaGFubmVsIHdpbGwgYnJvYWRjYXN0IGl0IHRvIHRoZSBtZW1iZXJzaGlwIGxpc3RlbmVycworICAgICAqIEBwYXJhbSBtZW1iZXIgTWVtYmVyIC0gdGhlIG5ldyBtZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIC8vbm90aWZ5IHVwd2FyZHMKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1lbWJlcnNoaXBMaXN0ZW5lcnMuc2l6ZSgpOyBpKysgKSB7CisgICAgICAgICAgICBNZW1iZXJzaGlwTGlzdGVuZXIgbWVtYmVyc2hpcExpc3RlbmVyID0gKE1lbWJlcnNoaXBMaXN0ZW5lciltZW1iZXJzaGlwTGlzdGVuZXJzLmdldChpKTsKKyAgICAgICAgICAgIGlmIChtZW1iZXJzaGlwTGlzdGVuZXIgIT0gbnVsbCkgbWVtYmVyc2hpcExpc3RlbmVyLm1lbWJlckFkZGVkKG1lbWJlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtZW1iZXJEaXNhcHBlYXJlZCBnZXRzIGludm9rZWQgYnkgdGhlIGludGVyY2VwdG9yIGJlbG93IHRoZSBjaGFubmVsCisgICAgICogYW5kIHRoZSBjaGFubmVsIHdpbGwgYnJvYWRjYXN0IGl0IHRvIHRoZSBtZW1iZXJzaGlwIGxpc3RlbmVycworICAgICAqIEBwYXJhbSBtZW1iZXIgTWVtYmVyIC0gdGhlIG1lbWJlciB0aGF0IGxlZnQgb3IgY3Jhc2hlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgLy9ub3RpZnkgdXB3YXJkcworICAgICAgICBmb3IgKGludCBpPTA7IGk8bWVtYmVyc2hpcExpc3RlbmVycy5zaXplKCk7IGkrKyApIHsKKyAgICAgICAgICAgIE1lbWJlcnNoaXBMaXN0ZW5lciBtZW1iZXJzaGlwTGlzdGVuZXIgPSAoTWVtYmVyc2hpcExpc3RlbmVyKW1lbWJlcnNoaXBMaXN0ZW5lcnMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKG1lbWJlcnNoaXBMaXN0ZW5lciAhPSBudWxsKSBtZW1iZXJzaGlwTGlzdGVuZXIubWVtYmVyRGlzYXBwZWFyZWQobWVtYmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaW50ZXJjZXB0b3Igc3RhY2sKKyAgICAgKiBpZiBubyBpbnRlcmNlcHRvcnMgaGF2ZSBiZWVuIGFkZGVkCisgICAgICogQHRocm93cyBDaGFubmVsRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHNldHVwRGVmYXVsdFN0YWNrKCkgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworCisgICAgICAgIGlmICggZ2V0Rmlyc3RJbnRlcmNlcHRvcigpICE9IG51bGwgJiYKKyAgICAgICAgICAgICAoKGdldEZpcnN0SW50ZXJjZXB0b3IoKS5nZXROZXh0KCkgaW5zdGFuY2VvZiBDaGFubmVsQ29vcmRpbmF0b3IpKSkgeworICAgICAgICAgICAgQ2hhbm5lbEludGVyY2VwdG9yIGludGVyY2VwdG9yID0gbnVsbDsKKyAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuTWVzc2FnZURpc3BhdGNoMTVJbnRlcmNlcHRvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsR3JvdXBDaGFubmVsLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICB9IGNhdGNoICggVGhyb3dhYmxlIHggKSB7CisgICAgICAgICAgICAgICAgY2xhenogPSBNZXNzYWdlRGlzcGF0Y2hJbnRlcmNlcHRvci5jbGFzczsKKyAgICAgICAgICAgIH0vL2NhdGNoCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludGVyY2VwdG9yID0gKENoYW5uZWxJbnRlcmNlcHRvcikgY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENoYW5uZWxFeGNlcHRpb24oIlVuYWJsZSB0byBhZGQgTWVzc2FnZURpc3BhdGNoSW50ZXJjZXB0b3IgdG8gaW50ZXJjZXB0b3IgY2hhaW4uIix4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuYWRkSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIHRoZSBvcHRpb24gZmxhZ3MgdGhhdCBlYWNoIGludGVyY2VwdG9yIGlzIHVzaW5nIGFuZCByZXBvcnRzCisgICAgICogYW4gZXJyb3IgaWYgdHdvIGludGVyY2VwdG9yIHNoYXJlIHRoZSBzYW1lIGZsYWcuCisgICAgICogQHRocm93cyBDaGFubmVsRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tPcHRpb25GbGFncygpIHRocm93cyBDaGFubmVsRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGNvbmZsaWN0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgQ2hhbm5lbEludGVyY2VwdG9yIGZpcnN0ID0gaW50ZXJjZXB0b3JzOworICAgICAgICB3aGlsZSAoIGZpcnN0ICE9IG51bGwgKSB7CisgICAgICAgICAgICBpbnQgZmxhZyA9IGZpcnN0LmdldE9wdGlvbkZsYWcoKTsKKyAgICAgICAgICAgIGlmICggZmxhZyAhPSAwICkgeworICAgICAgICAgICAgICAgIENoYW5uZWxJbnRlcmNlcHRvciBuZXh0ID0gZmlyc3QuZ2V0TmV4dCgpOworICAgICAgICAgICAgICAgIHdoaWxlICggbmV4dCAhPSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgbmZsYWcgPSBuZXh0LmdldE9wdGlvbkZsYWcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5mbGFnIT0wICYmICgoKGZsYWcgJiBuZmxhZykgPT0gZmxhZyApIHx8ICgoZmxhZyAmIG5mbGFnKSA9PSBuZmxhZykpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RzLmFwcGVuZCgiWyIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RzLmFwcGVuZChmaXJzdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdHMuYXBwZW5kKCI6Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdHMuYXBwZW5kKGZsYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RzLmFwcGVuZCgiID09ICIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RzLmFwcGVuZChuZXh0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0cy5hcHBlbmQoIjoiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0cy5hcHBlbmQobmZsYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RzLmFwcGVuZCgiXSAiKTsKKyAgICAgICAgICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICAgICAgICAgIG5leHQgPSBuZXh0LmdldE5leHQoKTsKKyAgICAgICAgICAgICAgICB9Ly93aGlsZQorICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICBmaXJzdCA9IGZpcnN0LmdldE5leHQoKTsKKyAgICAgICAgfS8vd2hpbGUKKyAgICAgICAgaWYgKCBjb25mbGljdHMubGVuZ3RoKCkgPiAwICkgdGhyb3cgbmV3IENoYW5uZWxFeGNlcHRpb24oIkludGVyY2VwdG9yIG9wdGlvbiBmbGFnIGNvbmZsaWN0OiAiK2NvbmZsaWN0cy50b1N0cmluZygpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGUgY2hhbm5lbAorICAgICAqIEBwYXJhbSBzdmMgaW50IC0gd2hhdCBzZXJ2aWNlIHRvIHN0YXJ0CisgICAgICogQHRocm93cyBDaGFubmVsRXhjZXB0aW9uCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsI3N0YXJ0KGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoaW50IHN2YykgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICBzZXR1cERlZmF1bHRTdGFjaygpOworICAgICAgICBpZiAob3B0aW9uQ2hlY2spIGNoZWNrT3B0aW9uRmxhZ3MoKTsKKyAgICAgICAgc3VwZXIuc3RhcnQoc3ZjKTsKKyAgICAgICAgaWYgKCBoYnRocmVhZCA9PSBudWxsICYmIGhlYXJ0YmVhdCApIHsKKyAgICAgICAgICAgIGhidGhyZWFkID0gbmV3IEhlYXJ0YmVhdFRocmVhZCh0aGlzLGhlYXJ0YmVhdFNsZWVwdGltZSk7CisgICAgICAgICAgICBoYnRocmVhZC5zdGFydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIGNoYW5uZWwKKyAgICAgKiBAcGFyYW0gc3ZjIGludAorICAgICAqIEB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbCNzdG9wKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcChpbnQgc3ZjKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChoYnRocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICBoYnRocmVhZC5zdG9wSGVhcnRiZWF0KCk7CisgICAgICAgICAgICBoYnRocmVhZCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuc3RvcChzdmMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGludGVyY2VwdG9yIG9mIHRoZSBzdGFjay4gVXNlZnVsIGZvciB0cmF2ZXJzYWwuCisgICAgICogQHJldHVybiBDaGFubmVsSW50ZXJjZXB0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhbm5lbEludGVyY2VwdG9yIGdldEZpcnN0SW50ZXJjZXB0b3IoKSB7CisgICAgICAgIGlmIChpbnRlcmNlcHRvcnMgIT0gbnVsbCkgcmV0dXJuIGludGVyY2VwdG9yczsKKyAgICAgICAgZWxzZSByZXR1cm4gY29vcmRpbmF0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2hhbm5lbCByZWNlaXZlciBjb21wb25lbnQKKyAgICAgKiBAcmV0dXJuIENoYW5uZWxSZWNlaXZlcgorICAgICAqLworICAgIHB1YmxpYyBDaGFubmVsUmVjZWl2ZXIgZ2V0Q2hhbm5lbFJlY2VpdmVyKCkgeworICAgICAgICByZXR1cm4gY29vcmRpbmF0b3IuZ2V0Q2x1c3RlclJlY2VpdmVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2hhbm5lbCBzZW5kZXIgY29tcG9uZW50CisgICAgICogQHJldHVybiBDaGFubmVsU2VuZGVyCisgICAgICovCisgICAgcHVibGljIENoYW5uZWxTZW5kZXIgZ2V0Q2hhbm5lbFNlbmRlcigpIHsKKyAgICAgICAgcmV0dXJuIGNvb3JkaW5hdG9yLmdldENsdXN0ZXJTZW5kZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtZW1iZXJzaGlwIHNlcnZpY2UgY29tcG9uZW50CisgICAgICogQHJldHVybiBNZW1iZXJzaGlwU2VydmljZQorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXJzaGlwU2VydmljZSBnZXRNZW1iZXJzaGlwU2VydmljZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvb3JkaW5hdG9yLmdldE1lbWJlcnNoaXBTZXJ2aWNlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2hhbm5lbCByZWNlaXZlciBjb21wb25lbnQKKyAgICAgKiBAcGFyYW0gY2x1c3RlclJlY2VpdmVyIENoYW5uZWxSZWNlaXZlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENoYW5uZWxSZWNlaXZlcihDaGFubmVsUmVjZWl2ZXIgY2x1c3RlclJlY2VpdmVyKSB7CisgICAgICAgIGNvb3JkaW5hdG9yLnNldENsdXN0ZXJSZWNlaXZlcihjbHVzdGVyUmVjZWl2ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNoYW5uZWwgc2VuZGVyIGNvbXBvbmVudAorICAgICAqIEBwYXJhbSBjbHVzdGVyU2VuZGVyIENoYW5uZWxTZW5kZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFubmVsU2VuZGVyKENoYW5uZWxTZW5kZXIgY2x1c3RlclNlbmRlcikgeworICAgICAgICBjb29yZGluYXRvci5zZXRDbHVzdGVyU2VuZGVyKGNsdXN0ZXJTZW5kZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1lbWJlcnNoaXAgY29tcG9uZW50CisgICAgICogQHBhcmFtIG1lbWJlcnNoaXBTZXJ2aWNlIE1lbWJlcnNoaXBTZXJ2aWNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVtYmVyc2hpcFNlcnZpY2UoTWVtYmVyc2hpcFNlcnZpY2UgbWVtYmVyc2hpcFNlcnZpY2UpIHsKKyAgICAgICAgY29vcmRpbmF0b3Iuc2V0TWVtYmVyc2hpcFNlcnZpY2UobWVtYmVyc2hpcFNlcnZpY2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBtZW1iZXJzaGlwIGxpc3RlbmVyIHRvIHRoZSBjaGFubmVsLjxicj4KKyAgICAgKiBNZW1iZXJzaGlwIGxpc3RlbmVycyBhcmUgdW5pcXVlbHkgaWRlbnRpZmllZCB1c2luZyB0aGUgZXF1YWxzKE9iamVjdCkgbWV0aG9kCisgICAgICogQHBhcmFtIG1lbWJlcnNoaXBMaXN0ZW5lciBNZW1iZXJzaGlwTGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRNZW1iZXJzaGlwTGlzdGVuZXIoTWVtYmVyc2hpcExpc3RlbmVyIG1lbWJlcnNoaXBMaXN0ZW5lcikgeworICAgICAgICBpZiAoIXRoaXMubWVtYmVyc2hpcExpc3RlbmVycy5jb250YWlucyhtZW1iZXJzaGlwTGlzdGVuZXIpICkKKyAgICAgICAgICAgIHRoaXMubWVtYmVyc2hpcExpc3RlbmVycy5hZGQobWVtYmVyc2hpcExpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgbWVtYmVyc2hpcCBsaXN0ZW5lciBmcm9tIHRoZSBjaGFubmVsLjxicj4KKyAgICAgKiBNZW1iZXJzaGlwIGxpc3RlbmVycyBhcmUgdW5pcXVlbHkgaWRlbnRpZmllZCB1c2luZyB0aGUgZXF1YWxzKE9iamVjdCkgbWV0aG9kCisgICAgICogQHBhcmFtIG1lbWJlcnNoaXBMaXN0ZW5lciBNZW1iZXJzaGlwTGlzdGVuZXIKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1lbWJlcnNoaXBMaXN0ZW5lcihNZW1iZXJzaGlwTGlzdGVuZXIgbWVtYmVyc2hpcExpc3RlbmVyKSB7CisgICAgICAgIG1lbWJlcnNoaXBMaXN0ZW5lcnMucmVtb3ZlKG1lbWJlcnNoaXBMaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGNoYW5uZWwgbGlzdGVuZXIgdG8gdGhlIGNoYW5uZWwuPGJyPgorICAgICAqIENoYW5uZWwgbGlzdGVuZXJzIGFyZSB1bmlxdWVseSBpZGVudGlmaWVkIHVzaW5nIHRoZSBlcXVhbHMoT2JqZWN0KSBtZXRob2QKKyAgICAgKiBAcGFyYW0gY2hhbm5lbExpc3RlbmVyIENoYW5uZWxMaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENoYW5uZWxMaXN0ZW5lcihDaGFubmVsTGlzdGVuZXIgY2hhbm5lbExpc3RlbmVyKSB7CisgICAgICAgIGlmICghdGhpcy5jaGFubmVsTGlzdGVuZXJzLmNvbnRhaW5zKGNoYW5uZWxMaXN0ZW5lcikgKSB7CisgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0ZW5lcnMuYWRkKGNoYW5uZWxMaXN0ZW5lcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0ZW5lciBhbHJlYWR5IGV4aXN0czoiK2NoYW5uZWxMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJlbW92ZXMgYSBjaGFubmVsIGxpc3RlbmVyIGZyb20gdGhlIGNoYW5uZWwuPGJyPgorICAgICAqIENoYW5uZWwgbGlzdGVuZXJzIGFyZSB1bmlxdWVseSBpZGVudGlmaWVkIHVzaW5nIHRoZSBlcXVhbHMoT2JqZWN0KSBtZXRob2QKKyAgICAgKiBAcGFyYW0gY2hhbm5lbExpc3RlbmVyIENoYW5uZWxMaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNoYW5uZWxMaXN0ZW5lcihDaGFubmVsTGlzdGVuZXIgY2hhbm5lbExpc3RlbmVyKSB7CisgICAgICAgIGNoYW5uZWxMaXN0ZW5lcnMucmVtb3ZlKGNoYW5uZWxMaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgdGhlIGludGVyY2VwdG9ycyBpbiB0aGlzIHN0YWNrCisgICAgICogQHJldHVybiBJdGVyYXRvcgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRJbnRlcmNlcHRvcnMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZXJjZXB0b3JJdGVyYXRvcih0aGlzLmdldE5leHQoKSx0aGlzLmNvb3JkaW5hdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGVzL2Rpc2FibGVzIHRoZSBvcHRpb24gY2hlY2s8YnI+CisgICAgICogU2V0dGluZyB0aGlzIHRvIHRydWUsIHdpbGwgbWFrZSB0aGUgR3JvdXBDaGFubmVsIHBlcmZvcm0gYSBjb25mbGljdCBjaGVjaworICAgICAqIG9uIHRoZSBpbnRlcmNlcHRvcnMuIElmIHR3byBpbnRlcmNlcHRvcnMgYXJlIHVzaW5nIHRoZSBzYW1lIG9wdGlvbiBmbGFnCisgICAgICogYW5kIHRocm93IGFuIGVycm9yIHVwb24gc3RhcnQuCisgICAgICogQHBhcmFtIG9wdGlvbkNoZWNrIGJvb2xlYW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb25DaGVjayhib29sZWFuIG9wdGlvbkNoZWNrKSB7CisgICAgICAgIHRoaXMub3B0aW9uQ2hlY2sgPSBvcHRpb25DaGVjazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgbG9jYWwgaGVhcnRiZWF0IHNsZWVwIHRpbWU8YnI+CisgICAgICogT25seSB1c2VkIHdoZW4gPGNvZGU+Z2V0SGVhcnRiZWF0KCk9PXRydWU8L2NvZGU+CisgICAgICogQHBhcmFtIGhlYXJ0YmVhdFNsZWVwdGltZSBsb25nIC0gdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmV0d2VlbiBoZWFydGJlYXRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGVhcnRiZWF0U2xlZXB0aW1lKGxvbmcgaGVhcnRiZWF0U2xlZXB0aW1lKSB7CisgICAgICAgIHRoaXMuaGVhcnRiZWF0U2xlZXB0aW1lID0gaGVhcnRiZWF0U2xlZXB0aW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgbG9jYWwgaGVhcnRiZWF0LgorICAgICAqIGlmIDxjb2RlPnNldEhlYXJ0YmVhdCh0cnVlKTwvY29kZT4gaXMgaW52b2tlZCB0aGVuIHRoZSBjaGFubmVsIHdpbGwgc3RhcnQgYW4gaW50ZXJuYWwKKyAgICAgKiB0aHJlYWQgdG8gaW52b2tlIDxjb2RlPkNoYW5uZWwuaGVhcnRiZWF0KCk8L2NvZGU+IGV2ZXJ5IDxjb2RlPmdldEhlYXJ0YmVhdFNsZWVwdGltZTwvY29kZT4gbWlsbGlzZWNvbmRzCisgICAgICogQHBhcmFtIGhlYXJ0YmVhdCBib29sZWFuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGVhcnRiZWF0KGJvb2xlYW4gaGVhcnRiZWF0KSB7CisgICAgICAgIHRoaXMuaGVhcnRiZWF0ID0gaGVhcnRiZWF0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgI3NldE9wdGlvbkNoZWNrKGJvb2xlYW4pCisgICAgICogQHJldHVybiBib29sZWFuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0T3B0aW9uQ2hlY2soKSB7CisgICAgICAgIHJldHVybiBvcHRpb25DaGVjazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlICNzZXRIZWFydGJlYXQoYm9vbGVhbikKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRIZWFydGJlYXQoKSB7CisgICAgICAgIHJldHVybiBoZWFydGJlYXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2xlZXAgdGltZSBpbiBtaWxsaXNlY29uZHMgdGhhdCB0aGUgaW50ZXJuYWwgaGVhcnRiZWF0IHdpbGwKKyAgICAgKiBzbGVlcCBpbiBiZXR3ZWVuIGludm9rYXRpb25zIG9mIDxjb2RlPkNoYW5uZWwuaGVhcnRiZWF0KCk8L2NvZGU+CisgICAgICogQHJldHVybiBsb25nCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0SGVhcnRiZWF0U2xlZXB0aW1lKCkgeworICAgICAgICByZXR1cm4gaGVhcnRiZWF0U2xlZXB0aW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICogPHA+VGl0bGU6IEludGVyY2VwdG9yIEl0ZXJhdG9yPC9wPgorICAgICAqCisgICAgICogPHA+RGVzY3JpcHRpb246IEFuIGl0ZXJhdG9yIHRvIGxvb3AgdGhyb3VnaCB0aGUgaW50ZXJjZXB0b3JzIGluIGEgY2hhbm5lbDwvcD4KKyAgICAgKgorICAgICAqIEB2ZXJzaW9uIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW50ZXJjZXB0b3JJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKKyAgICAgICAgcHJpdmF0ZSBDaGFubmVsSW50ZXJjZXB0b3IgZW5kOworICAgICAgICBwcml2YXRlIENoYW5uZWxJbnRlcmNlcHRvciBzdGFydDsKKyAgICAgICAgcHVibGljIEludGVyY2VwdG9ySXRlcmF0b3IoQ2hhbm5lbEludGVyY2VwdG9yIHN0YXJ0LCBDaGFubmVsSW50ZXJjZXB0b3IgZW5kKSB7CisgICAgICAgICAgICB0aGlzLmVuZCA9IGVuZDsKKyAgICAgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhcnQhPW51bGwgJiYgc3RhcnQgIT0gZW5kOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICBpZiAoIGhhc05leHQoKSApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzdGFydDsKKyAgICAgICAgICAgICAgICBzdGFydCA9IHN0YXJ0LmdldE5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICAvL2VtcHR5IG9wZXJhdGlvbgorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiA8cD5UaXRsZTogSW50ZXJuYWwgaGVhcnRiZWF0IHRocmVhZDwvcD4KKyAgICAgKgorICAgICAqIDxwPkRlc2NyaXB0aW9uOiBpZiA8Y29kZT5DaGFubmVsLmdldEhlYXJ0YmVhdCgpPT10cnVlPC9jb2RlPiB0aGVuIGEgdGhyZWFkIG9mIHRoaXMgY2xhc3MKKyAgICAgKiBpcyBjcmVhdGVkPC9wPgorICAgICAqCisgICAgICogQHZlcnNpb24gMS4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFydGJlYXRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyhIZWFydGJlYXRUaHJlYWQuY2xhc3MpOworICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGludCBjb3VudGVyID0gMTsKKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBzeW5jaHJvbml6ZWQgaW50IGluYygpIHsKKyAgICAgICAgICAgIHJldHVybiBjb3VudGVyKys7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb1J1biA9IHRydWU7CisgICAgICAgIHByb3RlY3RlZCBHcm91cENoYW5uZWwgY2hhbm5lbDsKKyAgICAgICAgcHJvdGVjdGVkIGxvbmcgc2xlZXBUaW1lOworICAgICAgICBwdWJsaWMgSGVhcnRiZWF0VGhyZWFkKEdyb3VwQ2hhbm5lbCBjaGFubmVsLCBsb25nIHNsZWVwVGltZSkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMuc2V0UHJpb3JpdHkoTUlOX1BSSU9SSVRZKTsKKyAgICAgICAgICAgIHNldE5hbWUoIkdyb3VwQ2hhbm5lbC1IZWFydGJlYXQtIitpbmMoKSk7CisgICAgICAgICAgICBzZXREYWVtb24odHJ1ZSk7CisgICAgICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsOworICAgICAgICAgICAgdGhpcy5zbGVlcFRpbWUgPSBzbGVlcFRpbWU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgc3RvcEhlYXJ0YmVhdCgpIHsKKyAgICAgICAgICAgIGRvUnVuID0gZmFsc2U7CisgICAgICAgICAgICBpbnRlcnJ1cHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHdoaWxlIChkb1J1bikgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChzbGVlcFRpbWUpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsLmhlYXJ0YmVhdCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRlZCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gc2VuZCBoZWFydGJlYXQgdGhyb3VnaCBUcmliZXMgaW50ZXJjZXB0b3Igc3RhY2suIFdpbGwgdHJ5IHRvIHNsZWVwIGFnYWluLiIseCk7CisgICAgICAgICAgICAgICAgfS8vY2F0Y2gKKyAgICAgICAgICAgIH0vL3doaWxlCisgICAgICAgIH0vL3J1bgorICAgIH0vL0hlYXJ0YmVhdFRocmVhZAorCisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL0ludGVyY2VwdG9yUGF5bG9hZC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL0ludGVyY2VwdG9yUGF5bG9hZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZWYzZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvSW50ZXJjZXB0b3JQYXlsb2FkLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuRXJyb3JIYW5kbGVyOworCisvKioKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgSW50ZXJjZXB0b3JQYXlsb2FkICB7CisgICAgcHJpdmF0ZSBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyOworICAgIAorICAgIHB1YmxpYyBFcnJvckhhbmRsZXIgZ2V0RXJyb3JIYW5kbGVyKCkgeworICAgICAgICByZXR1cm4gZXJyb3JIYW5kbGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVycm9ySGFuZGxlcihFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvUmVzcG9uc2UuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9SZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZTAxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvUmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXA7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKKworLyoqCisgKiBBIHJlc3BvbnNlIG9iamVjdCBob2xkcyBhIG1lc3NhZ2UgZnJvbSBhIHJlc3BvbmRpbmcgcGFydG5lci4KKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgUmVzcG9uc2UgeworICAgIHByaXZhdGUgTWVtYmVyIHNvdXJjZTsKKyAgICBwcml2YXRlIFNlcmlhbGl6YWJsZSBtZXNzYWdlOworICAgIHB1YmxpYyBSZXNwb25zZSgpIHsKKyAgICB9CisgICAgCisgICAgcHVibGljIFJlc3BvbnNlKE1lbWJlciBzb3VyY2UsIFNlcmlhbGl6YWJsZSBtZXNzYWdlKSB7CisgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZShNZW1iZXIgc291cmNlKSB7CisgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU2VyaWFsaXphYmxlIG1lc3NhZ2UpIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVtYmVyIGdldFNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIHNvdXJjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VyaWFsaXphYmxlIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvUnBjQ2FsbGJhY2suamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9ScGNDYWxsYmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMTQwZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvUnBjQ2FsbGJhY2suamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXA7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKKworLyoqCisgKiBUaGUgUnBjQ2FsbGJhY2sgaW50ZXJmYWNlIGlzIGFuIGludGVyZmFjZSBmb3IgdGhlIFRyaWJlcyBjaGFubmVsIHRvIHJlcXVlc3QgYQorICogcmVzcG9uc2Ugb2JqZWN0IHRvIGEgcmVxdWVzdCB0aGF0IGNhbWUgaW4uCisgKiBAYXV0aG9yIG5vdCBhdHRyaWJ1dGFibGUKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJwY0NhbGxiYWNrIHsKKyAgICAKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnIFNlcmlhbGl6YWJsZQorICAgICAqIEByZXR1cm4gU2VyaWFsaXphYmxlIC0gbnVsbCBpZiBubyByZXBseSBzaG91bGQgYmUgc2VudAorICAgICAqLworICAgIHB1YmxpYyBTZXJpYWxpemFibGUgcmVwbHlSZXF1ZXN0KFNlcmlhbGl6YWJsZSBtc2csIE1lbWJlciBzZW5kZXIpOworICAgIAorICAgIC8qKgorICAgICAqIElmIHRoZSByZXBseSBoYXMgYWxyZWFkeSBiZWVuIHNlbnQgdG8gdGhlIHJlcXVlc3RpbmcgdGhyZWFkLAorICAgICAqIHRoZSBycGMgY2FsbGJhY2sgY2FuIGhhbmRsZSBhbnkgZGF0YSB0aGF0IGNvbWVzIGluIGFmdGVyIHRoZSBmYWN0LgorICAgICAqIEBwYXJhbSBtc2cgU2VyaWFsaXphYmxlCisgICAgICogQHBhcmFtIHNlbmRlciBNZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsZWZ0T3ZlcihTZXJpYWxpemFibGUgbXNnLCBNZW1iZXIgc2VuZGVyKTsKKyAgICAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvUnBjQ2hhbm5lbC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL1JwY0NoYW5uZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzg3NjM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL1JwY0NoYW5uZWwuamF2YQpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbC5VVUlER2VuZXJhdG9yOworCisvKioKKyAqIEEgY2hhbm5lbCB0byBoYW5kbGUgUlBDIG1lc3NhZ2luZworICogQGF1dGhvciBGaWxpcCBIYW5paworICovCitwdWJsaWMgY2xhc3MgUnBjQ2hhbm5lbCBpbXBsZW1lbnRzIENoYW5uZWxMaXN0ZW5lcnsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyhScGNDaGFubmVsLmNsYXNzKTsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSVJTVF9SRVBMWSA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFKT1JJVFlfUkVQTFkgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTF9SRVBMWSA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fUkVQTFkgPSA0OworICAgIAorICAgIHByaXZhdGUgQ2hhbm5lbCBjaGFubmVsOworICAgIHByaXZhdGUgUnBjQ2FsbGJhY2sgY2FsbGJhY2s7CisgICAgcHJpdmF0ZSBieXRlW10gcnBjSWQ7CisgICAgCisgICAgcHJpdmF0ZSBIYXNoTWFwIHJlc3BvbnNlTWFwID0gbmV3IEhhc2hNYXAoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBSUEMgY2hhbm5lbC4gWW91IGNhbiBoYXZlIHNldmVyYWwgUlBDIGNoYW5uZWxzIGF0dGFjaGVkIHRvIGEgZ3JvdXAKKyAgICAgKiBhbGwgc2VwYXJhdGVkIG91dCBieSB0aGUgdW5pcXVlbmVzcworICAgICAqIEBwYXJhbSBycGNJZCAtIHRoZSB1bmlxdWUgSWQgZm9yIHRoaXMgUlBDIGdyb3VwCisgICAgICogQHBhcmFtIGNoYW5uZWwgQ2hhbm5lbAorICAgICAqIEBwYXJhbSBjYWxsYmFjayBScGNDYWxsYmFjaworICAgICAqLworICAgIHB1YmxpYyBScGNDaGFubmVsKGJ5dGVbXSBycGNJZCwgQ2hhbm5lbCBjaGFubmVsLCBScGNDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsOworICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIHRoaXMucnBjSWQgPSBycGNJZDsKKyAgICAgICAgY2hhbm5lbC5hZGRDaGFubmVsTGlzdGVuZXIodGhpcyk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFNlbmQgYSBtZXNzYWdlIGFuZCB3YWl0IGZvciB0aGUgcmVzcG9uc2UuCisgICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIE1lbWJlcltdIC0gdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgbWVzc2FnZSwgYW5kIHRoZSBtZW1iZXJzIHlvdSByZXF1ZXN0IGEgcmVwbHkgZnJvbQorICAgICAqIEBwYXJhbSBtZXNzYWdlIFNlcmlhbGl6YWJsZSAtIHRoZSBtZXNzYWdlIHlvdSBhcmUgc2VuZGluZyBvdXQKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBpbnQgLSBGSVJTVF9SRVBMWSwgTUFKT1JJVFlfUkVQTFkgb3IgQUxMX1JFUExZCisgICAgICogQHBhcmFtIHRpbWVvdXQgbG9uZyAtIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBpZiBubyByZXBseSBpcyByZWNlaXZlZCB3aXRoaW4gdGhpcyB0aW1lIG51bGwgaXMgcmV0dXJuZWQKKyAgICAgKiBAcmV0dXJuIFJlc3BvbnNlW10gLSBhbiBhcnJheSBvZiByZXNwb25zZSBvYmplY3RzLgorICAgICAqIEB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBSZXNwb25zZVtdIHNlbmQoTWVtYmVyW10gZGVzdGluYXRpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphYmxlIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnBjT3B0aW9ucywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRpbWVvdXQpIHRocm93cyBDaGFubmVsRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIGlmICggZGVzdGluYXRpb249PW51bGwgfHwgZGVzdGluYXRpb24ubGVuZ3RoID09IDAgKSByZXR1cm4gbmV3IFJlc3BvbnNlWzBdOworICAgICAgICAKKyAgICAgICAgLy9hdm9pZCBkZWFkIGxvY2sKKyAgICAgICAgY2hhbm5lbE9wdGlvbnMgPSBjaGFubmVsT3B0aW9ucyAmIH5DaGFubmVsLlNFTkRfT1BUSU9OU19TWU5DSFJPTklaRURfQUNLOworICAgICAgICAKKyAgICAgICAgUnBjQ29sbGVjdG9yS2V5IGtleSA9IG5ldyBScGNDb2xsZWN0b3JLZXkoVVVJREdlbmVyYXRvci5yYW5kb21VVUlEKGZhbHNlKSk7CisgICAgICAgIFJwY0NvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgUnBjQ29sbGVjdG9yKGtleSxycGNPcHRpb25zLGRlc3RpbmF0aW9uLmxlbmd0aCx0aW1lb3V0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY29sbGVjdG9yKSB7CisgICAgICAgICAgICAgICAgaWYgKCBycGNPcHRpb25zICE9IE5PX1JFUExZICkgcmVzcG9uc2VNYXAucHV0KGtleSwgY29sbGVjdG9yKTsKKyAgICAgICAgICAgICAgICBScGNNZXNzYWdlIHJtc2cgPSBuZXcgUnBjTWVzc2FnZShycGNJZCwga2V5LmlkLCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBjaGFubmVsLnNlbmQoZGVzdGluYXRpb24sIHJtc2csIGNoYW5uZWxPcHRpb25zKTsKKyAgICAgICAgICAgICAgICBpZiAoIHJwY09wdGlvbnMgIT0gTk9fUkVQTFkgKSBjb2xsZWN0b3Iud2FpdCh0aW1lb3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoIEludGVycnVwdGVkRXhjZXB0aW9uIGl4ICkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHRlZCgpOworICAgICAgICAgICAgLy90aHJvdyBuZXcgQ2hhbm5lbEV4Y2VwdGlvbihpeCk7CisgICAgICAgIH1maW5hbGx5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlTWFwLnJlbW92ZShrZXkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb2xsZWN0b3IuZ2V0UmVzcG9uc2VzKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZWNlaXZlZChTZXJpYWxpemFibGUgbXNnLCBNZW1iZXIgc2VuZGVyKSB7CisgICAgICAgIFJwY01lc3NhZ2Ugcm1zZyA9IChScGNNZXNzYWdlKW1zZzsKKyAgICAgICAgUnBjQ29sbGVjdG9yS2V5IGtleSA9IG5ldyBScGNDb2xsZWN0b3JLZXkocm1zZy51dWlkKTsKKyAgICAgICAgaWYgKCBybXNnLnJlcGx5ICkgeworICAgICAgICAgICAgUnBjQ29sbGVjdG9yIGNvbGxlY3RvciA9IChScGNDb2xsZWN0b3IpcmVzcG9uc2VNYXAuZ2V0KGtleSk7CisgICAgICAgICAgICBpZiAoY29sbGVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5sZWZ0T3ZlcihybXNnLm1lc3NhZ2UsIHNlbmRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY29sbGVjdG9yKSB7CisgICAgICAgICAgICAgICAgICAgIC8vbWFrZSBzdXJlIGl0IGhhc24ndCBiZWVuIHJlbW92ZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKCByZXNwb25zZU1hcC5jb250YWluc0tleShrZXkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAocm1zZyBpbnN0YW5jZW9mIFJwY01lc3NhZ2UuTm9ScGNDaGFubmVsUmVwbHkpICkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdG9yLmRlc3RjbnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdG9yLmFkZFJlc3BvbnNlKHJtc2cubWVzc2FnZSwgc2VuZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0b3IuaXNDb21wbGV0ZSgpKSBjb2xsZWN0b3Iubm90aWZ5QWxsKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISAocm1zZyBpbnN0YW5jZW9mIFJwY01lc3NhZ2UuTm9ScGNDaGFubmVsUmVwbHkpICkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2subGVmdE92ZXIocm1zZy5tZXNzYWdlLCBzZW5kZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfS8vc3luY2hyb25pemVkCisgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgfSBlbHNleworICAgICAgICAgICAgU2VyaWFsaXphYmxlIHJlcGx5ID0gY2FsbGJhY2sucmVwbHlSZXF1ZXN0KHJtc2cubWVzc2FnZSxzZW5kZXIpOworICAgICAgICAgICAgcm1zZy5yZXBseSA9IHRydWU7CisgICAgICAgICAgICBybXNnLm1lc3NhZ2UgPSByZXBseTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbC5zZW5kKG5ldyBNZW1iZXJbXSB7c2VuZGVyfSwgcm1zZywwKTsKKyAgICAgICAgICAgIH1jYXRjaCAoIEV4Y2VwdGlvbiB4ICkgIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzZW5kIGJhY2sgcmVwbHkgaW4gUnBjQ2hhbm5lbC4iLHgpOworICAgICAgICAgICAgfQorICAgICAgICB9Ly9lbmQgaWYKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYnJlYWtkb3duKCkgeworICAgICAgICBjaGFubmVsLnJlbW92ZUNoYW5uZWxMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZmluYWxpemUoKSB7CisgICAgICAgIGJyZWFrZG93bigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU2VyaWFsaXphYmxlIG1zZywgTWVtYmVyIHNlbmRlcikgeworICAgICAgICBpZiAoIG1zZyBpbnN0YW5jZW9mIFJwY01lc3NhZ2UgKSB7CisgICAgICAgICAgICBScGNNZXNzYWdlIHJtc2cgPSAoUnBjTWVzc2FnZSltc2c7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhybXNnLnJwY0lkLHJwY0lkKTsKKyAgICAgICAgfWVsc2UgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ2hhbm5lbCBnZXRDaGFubmVsKCkgeworICAgICAgICByZXR1cm4gY2hhbm5lbDsKKyAgICB9CisKKyAgICBwdWJsaWMgUnBjQ2FsbGJhY2sgZ2V0Q2FsbGJhY2soKSB7CisgICAgICAgIHJldHVybiBjYWxsYmFjazsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldFJwY0lkKCkgeworICAgICAgICByZXR1cm4gcnBjSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hhbm5lbChDaGFubmVsIGNoYW5uZWwpIHsKKyAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhScGNDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UnBjSWQoYnl0ZVtdIHJwY0lkKSB7CisgICAgICAgIHRoaXMucnBjSWQgPSBycGNJZDsKKyAgICB9CisgICAgCisKKworICAgIC8qKgorICAgICAqIAorICAgICAqIENsYXNzIHRoYXQgaG9sZHMgYWxsIHJlc3BvbnNlLgorICAgICAqIEBhdXRob3Igbm90IGF0dHJpYnV0YWJsZQorICAgICAqIEB2ZXJzaW9uIDEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUnBjQ29sbGVjdG9yIHsKKyAgICAgICAgcHVibGljIEFycmF5TGlzdCByZXNwb25zZXMgPSBuZXcgQXJyYXlMaXN0KCk7IAorICAgICAgICBwdWJsaWMgUnBjQ29sbGVjdG9yS2V5IGtleTsKKyAgICAgICAgcHVibGljIGludCBvcHRpb25zOworICAgICAgICBwdWJsaWMgaW50IGRlc3RjbnQ7CisgICAgICAgIHB1YmxpYyBsb25nIHRpbWVvdXQ7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgUnBjQ29sbGVjdG9yKFJwY0NvbGxlY3RvcktleSBrZXksIGludCBvcHRpb25zLCBpbnQgZGVzdGNudCwgbG9uZyB0aW1lb3V0KSB7CisgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgICAgICB0aGlzLmRlc3RjbnQgPSBkZXN0Y250OworICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgYWRkUmVzcG9uc2UoU2VyaWFsaXphYmxlIG1lc3NhZ2UsIE1lbWJlciBzZW5kZXIpeworICAgICAgICAgICAgUmVzcG9uc2UgcmVzcCA9IG5ldyBSZXNwb25zZShzZW5kZXIsbWVzc2FnZSk7CisgICAgICAgICAgICByZXNwb25zZXMuYWRkKHJlc3ApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeworICAgICAgICAgICAgaWYgKCBkZXN0Y250IDw9IDAgKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucykgeworICAgICAgICAgICAgICAgIGNhc2UgQUxMX1JFUExZOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzdGNudCA9PSByZXNwb25zZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGNhc2UgTUFKT1JJVFlfUkVQTFk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBwZXJjID0gKChmbG9hdClyZXNwb25zZXMuc2l6ZSgpKSAvICgoZmxvYXQpZGVzdGNudCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwZXJjID49IDAuNTBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZJUlNUX1JFUExZOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VzLnNpemUoKT4wOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXkuaGFzaENvZGUoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoIG8gaW5zdGFuY2VvZiBScGNDb2xsZWN0b3IgKSB7CisgICAgICAgICAgICAgICAgUnBjQ29sbGVjdG9yIHIgPSAoUnBjQ29sbGVjdG9yKW87CisgICAgICAgICAgICAgICAgcmV0dXJuIHIua2V5LmVxdWFscyh0aGlzLmtleSk7CisgICAgICAgICAgICB9IGVsc2UgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgUmVzcG9uc2VbXSBnZXRSZXNwb25zZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gKFJlc3BvbnNlW10pcmVzcG9uc2VzLnRvQXJyYXkobmV3IFJlc3BvbnNlW3Jlc3BvbnNlcy5zaXplKCldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJwY0NvbGxlY3RvcktleSB7CisgICAgICAgIGJ5dGVbXSBpZDsKKyAgICAgICAgcHVibGljIFJwY0NvbGxlY3RvcktleShieXRlW10gaWQpIHsKKyAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBpZFswXStpZFsxXStpZFsyXStpZFszXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKCBvIGluc3RhbmNlb2YgUnBjQ29sbGVjdG9yS2V5ICkgeworICAgICAgICAgICAgICAgIFJwY0NvbGxlY3RvcktleSByID0gKFJwY0NvbGxlY3RvcktleSlvOworICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMuZXF1YWxzKGlkLHIuaWQpOworICAgICAgICAgICAgfSBlbHNlIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgYlRvUyhieXRlW10gZGF0YSkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcig0KjE2KTsKKyAgICAgICAgYnVmLmFwcGVuZCgieyIpOworICAgICAgICBmb3IgKGludCBpPTA7IGRhdGEhPW51bGwgJiYgaTxkYXRhLmxlbmd0aDsgaSsrICkgYnVmLmFwcGVuZChTdHJpbmcudmFsdWVPZihkYXRhW2ldKSkuYXBwZW5kKCIgIik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL1JwY01lc3NhZ2UuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9ScGNNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwZjZkYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9ScGNNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwOworCitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXQ7CisKKy8qKgorICogPHA+VGl0bGU6IDwvcD4KKyAqCisgKiA8cD5EZXNjcmlwdGlvbjogPC9wPgorICoKKyAqIDxwPkNvcHlyaWdodDogQ29weXJpZ2h0IChjKSAyMDA1PC9wPgorICoKKyAqIDxwPkNvbXBhbnk6IDwvcD4KKyAqCisgKiBAYXV0aG9yIG5vdCBhdHRyaWJ1dGFibGUKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgUnBjTWVzc2FnZSBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlIHsKKworICAgIHByb3RlY3RlZCBTZXJpYWxpemFibGUgbWVzc2FnZTsKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIHV1aWQ7CisgICAgcHJvdGVjdGVkIGJ5dGVbXSBycGNJZDsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZXBseSA9IGZhbHNlOworCisgICAgcHVibGljIFJwY01lc3NhZ2UoKSB7CisgICAgICAgIC8vZm9yIHNlcmlhbGl6YXRpb24KKyAgICB9CisKKyAgICBwdWJsaWMgUnBjTWVzc2FnZShieXRlW10gcnBjSWQsIGJ5dGVbXSB1dWlkLCBTZXJpYWxpemFibGUgbWVzc2FnZSkgeworICAgICAgICB0aGlzLnJwY0lkID0gcnBjSWQ7CisgICAgICAgIHRoaXMudXVpZCA9IHV1aWQ7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKE9iamVjdElucHV0IGluKSB0aHJvd3MgSU9FeGNlcHRpb24sQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHJlcGx5ID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgaW50IGxlbmd0aCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgdXVpZCA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgIGluLnJlYWQodXVpZCwgMCwgbGVuZ3RoKTsKKyAgICAgICAgbGVuZ3RoID0gaW4ucmVhZEludCgpOworICAgICAgICBycGNJZCA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgIGluLnJlYWQocnBjSWQsIDAsIGxlbmd0aCk7CisgICAgICAgIG1lc3NhZ2UgPSAoU2VyaWFsaXphYmxlKWluLnJlYWRPYmplY3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZUJvb2xlYW4ocmVwbHkpOworICAgICAgICBvdXQud3JpdGVJbnQodXVpZC5sZW5ndGgpOworICAgICAgICBvdXQud3JpdGUodXVpZCwgMCwgdXVpZC5sZW5ndGgpOworICAgICAgICBvdXQud3JpdGVJbnQocnBjSWQubGVuZ3RoKTsKKyAgICAgICAgb3V0LndyaXRlKHJwY0lkLCAwLCBycGNJZC5sZW5ndGgpOworICAgICAgICBvdXQud3JpdGVPYmplY3QobWVzc2FnZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9ScGNDaGFubmVsUmVwbHkgZXh0ZW5kcyBScGNNZXNzYWdlIHsKKyAgICAgICAgcHVibGljIE5vUnBjQ2hhbm5lbFJlcGx5KCkgeworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTm9ScGNDaGFubmVsUmVwbHkoYnl0ZVtdIHJwY2lkLCBieXRlW10gdXVpZCkgeworICAgICAgICAgICAgc3VwZXIocnBjaWQsdXVpZCxudWxsKTsKKyAgICAgICAgICAgIHJlcGx5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChPYmplY3RJbnB1dCBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlcGx5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICB1dWlkID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIGluLnJlYWQodXVpZCwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGxlbmd0aCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIHJwY0lkID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIGluLnJlYWQocnBjSWQsIDAsIGxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQodXVpZC5sZW5ndGgpOworICAgICAgICAgICAgb3V0LndyaXRlKHV1aWQsIDAsIHV1aWQubGVuZ3RoKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludChycGNJZC5sZW5ndGgpOworICAgICAgICAgICAgb3V0LndyaXRlKHJwY0lkLCAwLCBycGNJZC5sZW5ndGgpOworICAgICAgICB9CisgICAgfSAgICAKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvaW50ZXJjZXB0b3JzL0RvbWFpbkZpbHRlckludGVyY2VwdG9yLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvaW50ZXJjZXB0b3JzL0RvbWFpbkZpbHRlckludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc3Mjk5NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9pbnRlcmNlcHRvcnMvRG9tYWluRmlsdGVySW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuQ2hhbm5lbEludGVyY2VwdG9yQmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5tZW1iZXJzaGlwLk1lbWJlckltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMubWVtYmVyc2hpcC5NZW1iZXJzaGlwOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogPHA+VGl0bGU6IE1lbWJlciBkb21haW4gZmlsdGVyIGludGVyY2VwdG9yIDwvcD4KKyAqCisgKiA8cD5EZXNjcmlwdGlvbjogRmlsdGVycyBtZW1iZXJzaGlwIGJhc2VkIG9uIGRvbWFpbi4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIERvbWFpbkZpbHRlckludGVyY2VwdG9yIGV4dGVuZHMgQ2hhbm5lbEludGVyY2VwdG9yQmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIERvbWFpbkZpbHRlckludGVyY2VwdG9yLmNsYXNzICk7CisKKyAgICBwcm90ZWN0ZWQgTWVtYmVyc2hpcCBtZW1iZXJzaGlwID0gbnVsbDsKKyAgICAKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGRvbWFpbiA9IG5ldyBieXRlWzBdOworCisgICAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKENoYW5uZWxNZXNzYWdlIG1zZykgeworICAgICAgICAvL3Nob3VsZCB3ZSBmaWx0ZXIgaW5jb21pbmcgYmFzZWQgb24gZG9tYWluPworICAgICAgICBzdXBlci5tZXNzYWdlUmVjZWl2ZWQobXNnKTsKKyAgICB9Ly9tZXNzYWdlUmVjZWl2ZWQKKworCisgICAgcHVibGljIHZvaWQgbWVtYmVyQWRkZWQoTWVtYmVyIG1lbWJlcikgeworICAgICAgICBpZiAoIG1lbWJlcnNoaXAgPT0gbnVsbCApIHNldHVwTWVtYmVyc2hpcCgpOworICAgICAgICBib29sZWFuIG5vdGlmeSA9IGZhbHNlOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1lbWJlcnNoaXApIHsKKyAgICAgICAgICAgIG5vdGlmeSA9IEFycmF5cy5lcXVhbHMoZG9tYWluLG1lbWJlci5nZXREb21haW4oKSk7CisgICAgICAgICAgICBpZiAoIG5vdGlmeSApIG5vdGlmeSA9IG1lbWJlcnNoaXAubWVtYmVyQWxpdmUoKE1lbWJlckltcGwpbWVtYmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIG5vdGlmeSApIHN1cGVyLm1lbWJlckFkZGVkKG1lbWJlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWVtYmVyRGlzYXBwZWFyZWQoTWVtYmVyIG1lbWJlcikgeworICAgICAgICBpZiAoIG1lbWJlcnNoaXAgPT0gbnVsbCApIHNldHVwTWVtYmVyc2hpcCgpOworICAgICAgICBib29sZWFuIG5vdGlmeSA9IGZhbHNlOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1lbWJlcnNoaXApIHsKKyAgICAgICAgICAgIG5vdGlmeSA9IEFycmF5cy5lcXVhbHMoZG9tYWluLG1lbWJlci5nZXREb21haW4oKSk7CisgICAgICAgICAgICBtZW1iZXJzaGlwLnJlbW92ZU1lbWJlcigoTWVtYmVySW1wbCltZW1iZXIpOworICAgICAgICB9CisgICAgICAgIGlmICggbm90aWZ5ICkgc3VwZXIubWVtYmVyRGlzYXBwZWFyZWQobWVtYmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZW1iZXJzKCkgeworICAgICAgICBpZiAoIG1lbWJlcnNoaXAgPT0gbnVsbCApIHNldHVwTWVtYmVyc2hpcCgpOworICAgICAgICByZXR1cm4gbWVtYmVyc2hpcC5oYXNNZW1iZXJzKCk7CisgICAgfQorCisgICAgcHVibGljIE1lbWJlcltdIGdldE1lbWJlcnMoKSB7CisgICAgICAgIGlmICggbWVtYmVyc2hpcCA9PSBudWxsICkgc2V0dXBNZW1iZXJzaGlwKCk7CisgICAgICAgIHJldHVybiBtZW1iZXJzaGlwLmdldE1lbWJlcnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVtYmVyIGdldE1lbWJlcihNZW1iZXIgbWJyKSB7CisgICAgICAgIGlmICggbWVtYmVyc2hpcCA9PSBudWxsICkgc2V0dXBNZW1iZXJzaGlwKCk7CisgICAgICAgIHJldHVybiBtZW1iZXJzaGlwLmdldE1lbWJlcihtYnIpOworICAgIH0KKworICAgIHB1YmxpYyBNZW1iZXIgZ2V0TG9jYWxNZW1iZXIoYm9vbGVhbiBpbmNBbGl2ZSkgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TG9jYWxNZW1iZXIoaW5jQWxpdmUpOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHNldHVwTWVtYmVyc2hpcCgpIHsKKyAgICAgICAgaWYgKCBtZW1iZXJzaGlwID09IG51bGwgKSB7CisgICAgICAgICAgICBtZW1iZXJzaGlwID0gbmV3IE1lbWJlcnNoaXAoKE1lbWJlckltcGwpc3VwZXIuZ2V0TG9jYWxNZW1iZXIodHJ1ZSkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldERvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIGRvbWFpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREb21haW4oYnl0ZVtdIGRvbWFpbikgeworICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvaW50ZXJjZXB0b3JzL0ZyYWdtZW50YXRpb25JbnRlcmNlcHRvci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL2ludGVyY2VwdG9ycy9GcmFnbWVudGF0aW9uSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODZkMDFhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL2ludGVyY2VwdG9ycy9GcmFnbWVudGF0aW9uSW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9yczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkNoYW5uZWxJbnRlcmNlcHRvckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuSW50ZXJjZXB0b3JQYXlsb2FkOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLlhCeXRlQnVmZmVyOworCisvKioKKyAqCisgKiBUaGUgZnJhZ21lbnRhdGlvbiBpbnRlcmNlcHRvciBzcGxpdHMgdXAgbGFyZ2UgbWVzc2FnZXMgaW50byBzbWFsbGVyIG1lc3NhZ2VzIGFuZCBhc3NlbWJsZXMgdGhlbSBvbiB0aGUgb3RoZXIgZW5kLgorICogVGhpcyBpcyB2ZXJ5IHVzZWZ1bCB3aGVuIHlvdSBkb24ndCB3YW50IGxhcmdlIG1lc3NhZ2VzIGhvZ2dpbmcgdGhlIHNlbmRpbmcgc29ja2V0cworICogYW5kIHNtYWxsZXIgbWVzc2FnZXMgY2FuIG1ha2UgaXQgdGhyb3VnaC4KKyAqIAorICogPGJyPjxiPkNvbmZpZ3VyYXRpb24gT3B0aW9uczwvYj48YnI+CisgKiBPcmRlckludGVjZXB0b3IuZXhwaXJlPTxtaWxsaXNlY29uZHM+IC0gaG93IGxvbmcgZG8gd2Uga2VlcCB0aGUgZnJhZ21lbnRzIGluIG1lbW9yeSBhbmQgd2FpdCBmb3IgdGhlIHJlc3QgdG8gYXJyaXZlPGI+ZGVmYXVsdD02MCwwMDBtcyAtPiA2MHNlY29uZHM8L2I+CisgKiBUaGlzIHNldHRpbmcgaXMgdXNlZnVsIHRvIGF2b2lkIE91dE9mTWVtb3J5RXJyb3JzPGJyPgorICogT3JkZXJJbnRlY2VwdG9yLm1heFNpemU9PG1heCBtZXNzYWdlIHNpemU+IC0gbWVzc2FnZSBzaXplIGluIGJ5dGVzIDxiPmRlZmF1bHQ9MTAyNCoxMDAgKGFyb3VuZCBhIHRlbnRoIG9mIGEgTUIpPC9iPjxicj4KKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRhdGlvbkludGVyY2VwdG9yIGV4dGVuZHMgQ2hhbm5lbEludGVyY2VwdG9yQmFzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBGcmFnbWVudGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MgKTsKKyAgICAKKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCBmcmFncGllY2VzID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIGludCBtYXhTaXplID0gMTAyNCoxMDA7CisgICAgcHJpdmF0ZSBsb25nIGV4cGlyZSA9IDEwMDAgKiA2MDsgLy9vbmUgbWludXRlIGV4cGlyYXRpb24KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZWVwY2xvbmUgPSB0cnVlOworCisKKyAgICBwdWJsaWMgdm9pZCBzZW5kTWVzc2FnZShNZW1iZXJbXSBkZXN0aW5hdGlvbiwgQ2hhbm5lbE1lc3NhZ2UgbXNnLCBJbnRlcmNlcHRvclBheWxvYWQgcGF5bG9hZCkgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICBpbnQgc2l6ZSA9IG1zZy5nZXRNZXNzYWdlKCkuZ2V0TGVuZ3RoKCk7CisgICAgICAgIGJvb2xlYW4gZnJhZyA9IChzaXplPm1heFNpemUpICYmIG9rVG9Qcm9jZXNzKG1zZy5nZXRPcHRpb25zKCkpOworICAgICAgICBpZiAoIGZyYWcgKSB7CisgICAgICAgICAgICBmcmFnKGRlc3RpbmF0aW9uLCBtc2csIHBheWxvYWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXNnLmdldE1lc3NhZ2UoKS5hcHBlbmQoZnJhZyk7CisgICAgICAgICAgICBzdXBlci5zZW5kTWVzc2FnZShkZXN0aW5hdGlvbiwgbXNnLCBwYXlsb2FkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoQ2hhbm5lbE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIGJvb2xlYW4gaXNGcmFnID0gWEJ5dGVCdWZmZXIudG9Cb29sZWFuKG1zZy5nZXRNZXNzYWdlKCkuZ2V0Qnl0ZXNEaXJlY3QoKSxtc2cuZ2V0TWVzc2FnZSgpLmdldExlbmd0aCgpLTEpOworICAgICAgICBtc2cuZ2V0TWVzc2FnZSgpLnRyaW0oMSk7CisgICAgICAgIGlmICggaXNGcmFnICkgeworICAgICAgICAgICAgZGVmcmFnKG1zZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5tZXNzYWdlUmVjZWl2ZWQobXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIAorICAgIHB1YmxpYyBGcmFnQ29sbGVjdGlvbiBnZXRGcmFnQ29sbGVjdGlvbihGcmFnS2V5IGtleSwgQ2hhbm5lbE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIEZyYWdDb2xsZWN0aW9uIGNvbGwgPSAoRnJhZ0NvbGxlY3Rpb24pZnJhZ3BpZWNlcy5nZXQoa2V5KTsKKyAgICAgICAgaWYgKCBjb2xsID09IG51bGwgKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGZyYWdwaWVjZXMpIHsKKyAgICAgICAgICAgICAgICBjb2xsID0gKEZyYWdDb2xsZWN0aW9uKWZyYWdwaWVjZXMuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgaWYgKCBjb2xsID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbGwgPSBuZXcgRnJhZ0NvbGxlY3Rpb24obXNnKTsKKyAgICAgICAgICAgICAgICAgICAgZnJhZ3BpZWNlcy5wdXQoa2V5LCBjb2xsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gCisgICAgICAgIHJldHVybiBjb2xsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVGcmFnQ29sbGVjdGlvbihGcmFnS2V5IGtleSkgeworICAgICAgICBmcmFncGllY2VzLnJlbW92ZShrZXkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkZWZyYWcoQ2hhbm5lbE1lc3NhZ2UgbXNnICkgeyAKKyAgICAgICAgRnJhZ0tleSBrZXkgPSBuZXcgRnJhZ0tleShtc2cuZ2V0VW5pcXVlSWQoKSk7CisgICAgICAgIEZyYWdDb2xsZWN0aW9uIGNvbGwgPSBnZXRGcmFnQ29sbGVjdGlvbihrZXksbXNnKTsKKyAgICAgICAgY29sbC5hZGRNZXNzYWdlKChDaGFubmVsTWVzc2FnZSltc2cuZGVlcGNsb25lKCkpOworCisgICAgICAgIGlmICggY29sbC5jb21wbGV0ZSgpICkgeworICAgICAgICAgICAgcmVtb3ZlRnJhZ0NvbGxlY3Rpb24oa2V5KTsKKyAgICAgICAgICAgIENoYW5uZWxNZXNzYWdlIGNvbXBsZXRlID0gY29sbC5hc3NlbWJsZSgpOworICAgICAgICAgICAgc3VwZXIubWVzc2FnZVJlY2VpdmVkKGNvbXBsZXRlKTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZnJhZyhNZW1iZXJbXSBkZXN0aW5hdGlvbiwgQ2hhbm5lbE1lc3NhZ2UgbXNnLCBJbnRlcmNlcHRvclBheWxvYWQgcGF5bG9hZCkgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICBpbnQgc2l6ZSA9IG1zZy5nZXRNZXNzYWdlKCkuZ2V0TGVuZ3RoKCk7CisKKyAgICAgICAgaW50IGNvdW50ID0gKChzaXplIC8gbWF4U2l6ZSApKyhzaXplJW1heFNpemU9PTA/MDoxKSk7CisgICAgICAgIENoYW5uZWxNZXNzYWdlW10gbWVzc2FnZXMgPSBuZXcgQ2hhbm5lbE1lc3NhZ2VbY291bnRdOworICAgICAgICBpbnQgcmVtYWluaW5nID0gc2l6ZTsKKyAgICAgICAgZm9yICggaW50IGk9MDsgaTxjb3VudDsgaSsrICkgeworICAgICAgICAgICAgQ2hhbm5lbE1lc3NhZ2UgdG1wID0gKENoYW5uZWxNZXNzYWdlKW1zZy5jbG9uZSgpOworICAgICAgICAgICAgaW50IG9mZnNldCA9IChpKm1heFNpemUpOworICAgICAgICAgICAgaW50IGxlbmd0aCA9IE1hdGgubWluKHJlbWFpbmluZyxtYXhTaXplKTsKKyAgICAgICAgICAgIHRtcC5nZXRNZXNzYWdlKCkuY2xlYXIoKTsKKyAgICAgICAgICAgIHRtcC5nZXRNZXNzYWdlKCkuYXBwZW5kKG1zZy5nZXRNZXNzYWdlKCkuZ2V0Qnl0ZXNEaXJlY3QoKSxvZmZzZXQsbGVuZ3RoKTsKKyAgICAgICAgICAgIC8vYWRkIHRoZSBtc2cgbnIKKyAgICAgICAgICAgIC8vdG1wLmdldE1lc3NhZ2UoKS5hcHBlbmQoWEJ5dGVCdWZmZXIudG9CeXRlcyhpKSwwLDQpOworICAgICAgICAgICAgdG1wLmdldE1lc3NhZ2UoKS5hcHBlbmQoaSk7CisgICAgICAgICAgICAvL2FkZCB0aGUgdG90YWwgbnIgb2YgbWVzc2FnZXMKKyAgICAgICAgICAgIC8vdG1wLmdldE1lc3NhZ2UoKS5hcHBlbmQoWEJ5dGVCdWZmZXIudG9CeXRlcyhjb3VudCksMCw0KTsKKyAgICAgICAgICAgIHRtcC5nZXRNZXNzYWdlKCkuYXBwZW5kKGNvdW50KTsKKyAgICAgICAgICAgIC8vYWRkIHRydWUgYXMgdGhlIGZyYWcgZmxhZworICAgICAgICAgICAgLy9ieXRlW10gZmxhZyA9IFhCeXRlQnVmZmVyLnRvQnl0ZXModHJ1ZSk7CisgICAgICAgICAgICAvL3RtcC5nZXRNZXNzYWdlKCkuYXBwZW5kKGZsYWcsMCxmbGFnLmxlbmd0aCk7CisgICAgICAgICAgICB0bXAuZ2V0TWVzc2FnZSgpLmFwcGVuZCh0cnVlKTsKKyAgICAgICAgICAgIG1lc3NhZ2VzW2ldID0gdG1wOworICAgICAgICAgICAgcmVtYWluaW5nIC09IGxlbmd0aDsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGZvciAoIGludCBpPTA7IGk8bWVzc2FnZXMubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICBzdXBlci5zZW5kTWVzc2FnZShkZXN0aW5hdGlvbixtZXNzYWdlc1tpXSxwYXlsb2FkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBoZWFydGJlYXQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTZXQgc2V0ID0gZnJhZ3BpZWNlcy5rZXlTZXQoKTsgCisgICAgICAgICAgICBPYmplY3RbXSBrZXlzID0gc2V0LnRvQXJyYXkoKTsKKyAgICAgICAgICAgIGZvciAoIGludCBpPTA7IGk8a2V5cy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBGcmFnS2V5IGtleSA9IChGcmFnS2V5KWtleXNbaV07CisgICAgICAgICAgICAgICAgaWYgKCBrZXkgIT0gbnVsbCAmJiBrZXkuZXhwaXJlZChnZXRFeHBpcmUoKSkgKSAKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRnJhZ0NvbGxlY3Rpb24oa2V5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBpZiAoIGxvZy5pc0Vycm9yRW5hYmxlZCgpICkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHBlcmZvcm0gaGVhcnRiZWF0IGNsZWFuIHVwIGluIHRoZSBmcmFnIGludGVyY2VwdG9yIix4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdXBlci5oZWFydGJlYXQoKTsKKyAgICB9CisKKyAgICAKKworICAgIHB1YmxpYyBpbnQgZ2V0TWF4U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1heFNpemU7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0RXhwaXJlKCkgeworICAgICAgICByZXR1cm4gZXhwaXJlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1heFNpemUoaW50IG1heFNpemUpIHsKKyAgICAgICAgdGhpcy5tYXhTaXplID0gbWF4U2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBpcmUobG9uZyBleHBpcmUpIHsKKyAgICAgICAgdGhpcy5leHBpcmUgPSBleHBpcmU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGcmFnQ29sbGVjdGlvbiB7CisgICAgICAgIHByaXZhdGUgbG9uZyByZWNlaXZlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBwcml2YXRlIENoYW5uZWxNZXNzYWdlIG1zZzsKKyAgICAgICAgcHJpdmF0ZSBYQnl0ZUJ1ZmZlcltdIGZyYWdzOworICAgICAgICBwdWJsaWMgRnJhZ0NvbGxlY3Rpb24oQ2hhbm5lbE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICAvL2dldCB0aGUgdG90YWwgbWVzc2FnZXMKKyAgICAgICAgICAgIGludCBjb3VudCA9IFhCeXRlQnVmZmVyLnRvSW50KG1zZy5nZXRNZXNzYWdlKCkuZ2V0Qnl0ZXNEaXJlY3QoKSxtc2cuZ2V0TWVzc2FnZSgpLmdldExlbmd0aCgpLTQpOworICAgICAgICAgICAgZnJhZ3MgPSBuZXcgWEJ5dGVCdWZmZXJbY291bnRdOworICAgICAgICAgICAgdGhpcy5tc2cgPSBtc2c7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoQ2hhbm5lbE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICAvL3JlbW92ZSB0aGUgdG90YWwgbWVzc2FnZXMKKyAgICAgICAgICAgIG1zZy5nZXRNZXNzYWdlKCkudHJpbSg0KTsKKyAgICAgICAgICAgIC8vZ2V0IHRoZSBtc2cgbnIKKyAgICAgICAgICAgIGludCBuciA9IFhCeXRlQnVmZmVyLnRvSW50KG1zZy5nZXRNZXNzYWdlKCkuZ2V0Qnl0ZXNEaXJlY3QoKSxtc2cuZ2V0TWVzc2FnZSgpLmdldExlbmd0aCgpLTQpOworICAgICAgICAgICAgLy9yZW1vdmUgdGhlIG1zZyBucgorICAgICAgICAgICAgbXNnLmdldE1lc3NhZ2UoKS50cmltKDQpOworICAgICAgICAgICAgZnJhZ3NbbnJdID0gbXNnLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb21wbGV0ZSgpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoIGludCBpPTA7IChpPGZyYWdzLmxlbmd0aCkgJiYgKHJlc3VsdCk7IGkrKyApIHJlc3VsdCA9IChmcmFnc1tpXSAhPSBudWxsKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBDaGFubmVsTWVzc2FnZSBhc3NlbWJsZSgpIHsKKyAgICAgICAgICAgIGlmICggIWNvbXBsZXRlKCkgKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudHMgYXJlIG1pc3NpbmcuIik7CisgICAgICAgICAgICBpbnQgYnVmZmVyc2l6ZSA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8ZnJhZ3MubGVuZ3RoOyBpKysgKSBidWZmZXJzaXplICs9IGZyYWdzW2ldLmdldExlbmd0aCgpOworICAgICAgICAgICAgWEJ5dGVCdWZmZXIgYnVmID0gbmV3IFhCeXRlQnVmZmVyKGJ1ZmZlcnNpemUsZmFsc2UpOworICAgICAgICAgICAgbXNnLnNldE1lc3NhZ2UoYnVmKTsKKyAgICAgICAgICAgIGZvciAoIGludCBpPTA7IGk8ZnJhZ3MubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICAgICAgbXNnLmdldE1lc3NhZ2UoKS5hcHBlbmQoZnJhZ3NbaV0uZ2V0Qnl0ZXNEaXJlY3QoKSwwLGZyYWdzW2ldLmdldExlbmd0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBib29sZWFuIGV4cGlyZWQobG9uZyBleHBpcmUpIHsKKyAgICAgICAgICAgIHJldHVybiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktcmVjZWl2ZWQpPmV4cGlyZTsKKyAgICAgICAgfQorCisgICAgICAgIAorICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGcmFnS2V5IHsKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gdW5pcXVlSWQ7CisgICAgICAgIHByaXZhdGUgbG9uZyByZWNlaXZlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBwdWJsaWMgRnJhZ0tleShieXRlW10gaWQgKSB7CisgICAgICAgICAgICB0aGlzLnVuaXF1ZUlkID0gaWQ7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBYQnl0ZUJ1ZmZlci50b0ludCh1bmlxdWVJZCwwKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvICkgeworICAgICAgICAgICAgaWYgKCBvIGluc3RhbmNlb2YgRnJhZ0tleSApIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuZXF1YWxzKHVuaXF1ZUlkLCgoRnJhZ0tleSlvKS51bmlxdWVJZCk7CisgICAgICAgIH0gZWxzZSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXhwaXJlZChsb25nIGV4cGlyZSkgeworICAgICAgICAgICAgcmV0dXJuIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS1yZWNlaXZlZCk+ZXhwaXJlOworICAgICAgICB9CisKKyAgICB9CisgICAgCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL2ludGVyY2VwdG9ycy9HemlwSW50ZXJjZXB0b3IuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9pbnRlcmNlcHRvcnMvR3ppcEludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxNWQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9pbnRlcmNlcHRvcnMvR3ppcEludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5DaGFubmVsSW50ZXJjZXB0b3JCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkludGVyY2VwdG9yUGF5bG9hZDsKKworCisKKy8qKgorICoKKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIEd6aXBJbnRlcmNlcHRvciBleHRlbmRzIENoYW5uZWxJbnRlcmNlcHRvckJhc2UgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSAyMDQ4OworICAgIAorICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKE1lbWJlcltdIGRlc3RpbmF0aW9uLCBDaGFubmVsTWVzc2FnZSBtc2csIEludGVyY2VwdG9yUGF5bG9hZCBwYXlsb2FkKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gZGF0YSA9IGNvbXByZXNzKG1zZy5nZXRNZXNzYWdlKCkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBtc2cuZ2V0TWVzc2FnZSgpLnRyaW0obXNnLmdldE1lc3NhZ2UoKS5nZXRMZW5ndGgoKSk7CisgICAgICAgICAgICBtc2cuZ2V0TWVzc2FnZSgpLmFwcGVuZChkYXRhLDAsZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgZ2V0TmV4dCgpLnNlbmRNZXNzYWdlKGRlc3RpbmF0aW9uLCBtc2csIHBheWxvYWQpOworICAgICAgICB9IGNhdGNoICggSU9FeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGNvbXByZXNzIGJ5dGUgY29udGVudHMiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDaGFubmVsRXhjZXB0aW9uKHgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKENoYW5uZWxNZXNzYWdlIG1zZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBkZWNvbXByZXNzKG1zZy5nZXRNZXNzYWdlKCkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBtc2cuZ2V0TWVzc2FnZSgpLnRyaW0obXNnLmdldE1lc3NhZ2UoKS5nZXRMZW5ndGgoKSk7CisgICAgICAgICAgICBtc2cuZ2V0TWVzc2FnZSgpLmFwcGVuZChkYXRhLDAsZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgZ2V0UHJldmlvdXMoKS5tZXNzYWdlUmVjZWl2ZWQobXNnKTsKKyAgICAgICAgfSBjYXRjaCAoIElPRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBkZWNvbXByZXNzIGJ5dGUgY29udGVudHMiLHgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGNvbXByZXNzKGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgR1pJUE91dHB1dFN0cmVhbSBnb3V0ID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0oYm91dCk7CisgICAgICAgIGdvdXQud3JpdGUoZGF0YSk7CisgICAgICAgIGdvdXQuZmx1c2goKTsKKyAgICAgICAgZ291dC5jbG9zZSgpOworICAgICAgICByZXR1cm4gYm91dC50b0J5dGVBcnJheSgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAdG9kbyBGaXggdG8gY3JlYXRlIGFuIGF1dG9tYXRpY2FsbHkgZ3Jvd2luZyBidWZmZXIuCisgICAgICogQHBhcmFtIGRhdGEgYnl0ZVtdCisgICAgICogQHJldHVybiBieXRlW10KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gZGVjb21wcmVzcyhieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOworICAgICAgICBHWklQSW5wdXRTdHJlYW0gZ2luID0gbmV3IEdaSVBJbnB1dFN0cmVhbShiaW4pOworICAgICAgICBieXRlW10gdG1wID0gbmV3IGJ5dGVbREVGQVVMVF9CVUZGRVJfU0laRV07CisgICAgICAgIGludCBsZW5ndGggPSBnaW4ucmVhZCh0bXApOworICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0bXAsMCxyZXN1bHQsMCxsZW5ndGgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmcpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICBBcnJheXMuZmlsbChkYXRhLChieXRlKTEpOworICAgICAgICBieXRlW10gY29tcHJlc3MgPSBjb21wcmVzcyhkYXRhKTsKKyAgICAgICAgYnl0ZVtdIGRlY29tcHJlc3MgPSBkZWNvbXByZXNzKGNvbXByZXNzKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWJ1ZyB0ZXN0Iik7CisgICAgICAgIAorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9pbnRlcmNlcHRvcnMvTWVzc2FnZURpc3BhdGNoMTVJbnRlcmNlcHRvci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL2ludGVyY2VwdG9ycy9NZXNzYWdlRGlzcGF0Y2gxNUludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxMDRlMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9pbnRlcmNlcHRvcnMvTWVzc2FnZURpc3BhdGNoMTVJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9yczsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkludGVyY2VwdG9yUGF5bG9hZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuYmlvLnV0aWwuTGlua09iamVjdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiAKKyAqIFNhbWUgaW1wbGVtZW50YXRpb24gYXMgdGhlIE1lc3NhZ2VEaXNwYXRjaEludGVyY2VwdG9yCisgKiBleGNlcHQgaXMgdWVzIGFuIGF0b21pYyBsb25nIGZvciB0aGUgY3VycmVudFNpemUgY2FsY3VsYXRpb24KKyAqIGFuZCB1c2VzIGEgdGhyZWFkIHBvb2wgZm9yIG1lc3NhZ2Ugc2VuZGluZy4KKyAqIAorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gMS4wCisgKi8KKworcHVibGljIGNsYXNzIE1lc3NhZ2VEaXNwYXRjaDE1SW50ZXJjZXB0b3IgZXh0ZW5kcyBNZXNzYWdlRGlzcGF0Y2hJbnRlcmNlcHRvciB7CisKKyAgICBwcm90ZWN0ZWQgQXRvbWljTG9uZyBjdXJyZW50U2l6ZSA9IG5ldyBBdG9taWNMb25nKDApOworICAgIHByb3RlY3RlZCBUaHJlYWRQb29sRXhlY3V0b3IgZXhlY3V0b3IgPSBudWxsOworICAgIHByb3RlY3RlZCBpbnQgbWF4VGhyZWFkcyA9IDEwOworICAgIHByb3RlY3RlZCBpbnQgbWF4U3BhcmVUaHJlYWRzID0gMjsKKyAgICBwcm90ZWN0ZWQgbG9uZyBrZWVwQWxpdmVUaW1lID0gNTAwMDsKKyAgICBwcm90ZWN0ZWQgTGlua2VkQmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4gcnVubmFibGVxdWV1ZSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigpOworCisgICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFNpemUoKSB7CisgICAgICAgIHJldHVybiBjdXJyZW50U2l6ZS5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBhZGRBbmRHZXRDdXJyZW50U2l6ZShsb25nIGluYykgeworICAgICAgICByZXR1cm4gY3VycmVudFNpemUuYWRkQW5kR2V0KGluYyk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgc2V0QW5kR2V0Q3VycmVudFNpemUobG9uZyB2YWx1ZSkgeworICAgICAgICBjdXJyZW50U2l6ZS5zZXQodmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGFkZFRvUXVldWUoQ2hhbm5lbE1lc3NhZ2UgbXNnLCBNZW1iZXJbXSBkZXN0aW5hdGlvbiwgSW50ZXJjZXB0b3JQYXlsb2FkIHBheWxvYWQpIHsKKyAgICAgICAgZmluYWwgTGlua09iamVjdCBvYmogPSBuZXcgTGlua09iamVjdChtc2csZGVzdGluYXRpb24scGF5bG9hZCk7CisgICAgICAgIFJ1bm5hYmxlIHIgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgc2VuZEFzeW5jRGF0YShvYmopOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBleGVjdXRvci5leGVjdXRlKHIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlua09iamVjdCByZW1vdmVGcm9tUXVldWUoKSB7CisgICAgICAgIHJldHVybiBudWxsOyAvL25vdCB1c2VkLCB0aHJlYWQgcG9vbCBjb250YWlucyBpdHMgb3duIHF1ZXVlLgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0UXVldWUoKSB7CisgICAgICAgIGlmICggcnVuICkgcmV0dXJuOworICAgICAgICBleGVjdXRvciA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IobWF4U3BhcmVUaHJlYWRzLG1heFRocmVhZHMsa2VlcEFsaXZlVGltZSxUaW1lVW5pdC5NSUxMSVNFQ09ORFMscnVubmFibGVxdWV1ZSk7CisgICAgICAgIHJ1biA9IHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcFF1ZXVlKCkgeworICAgICAgICBydW4gPSBmYWxzZTsKKyAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgc2V0QW5kR2V0Q3VycmVudFNpemUoMCk7CisgICAgICAgIHJ1bm5hYmxlcXVldWUuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRLZWVwQWxpdmVUaW1lKCkgeworICAgICAgICByZXR1cm4ga2VlcEFsaXZlVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1heFNwYXJlVGhyZWFkcygpIHsKKyAgICAgICAgcmV0dXJuIG1heFNwYXJlVGhyZWFkczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1heFRocmVhZHMoKSB7CisgICAgICAgIHJldHVybiBtYXhUaHJlYWRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEtlZXBBbGl2ZVRpbWUobG9uZyBrZWVwQWxpdmVUaW1lKSB7CisgICAgICAgIHRoaXMua2VlcEFsaXZlVGltZSA9IGtlZXBBbGl2ZVRpbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWF4U3BhcmVUaHJlYWRzKGludCBtYXhTcGFyZVRocmVhZHMpIHsKKyAgICAgICAgdGhpcy5tYXhTcGFyZVRocmVhZHMgPSBtYXhTcGFyZVRocmVhZHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWF4VGhyZWFkcyhpbnQgbWF4VGhyZWFkcykgeworICAgICAgICB0aGlzLm1heFRocmVhZHMgPSBtYXhUaHJlYWRzOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9pbnRlcmNlcHRvcnMvTWVzc2FnZURpc3BhdGNoSW50ZXJjZXB0b3IuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9pbnRlcmNlcHRvcnMvTWVzc2FnZURpc3BhdGNoSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmNkMzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL2ludGVyY2VwdG9ycy9NZXNzYWdlRGlzcGF0Y2hJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5DaGFubmVsSW50ZXJjZXB0b3JCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkludGVyY2VwdG9yUGF5bG9hZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuYmlvLnV0aWwuRmFzdFF1ZXVlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5iaW8udXRpbC5MaW5rT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLlVuaXF1ZUlkOworCisvKioKKyAqCisgKiBUaGUgbWVzc2FnZSBkaXNwYXRjaGVyIGlzIGEgd2F5IHRvIGVuYWJsZSBhc3luY2hyb25vdXMgY29tbXVuaWNhdGlvbgorICogdGhyb3VnaCBhIGNoYW5uZWwuIFRoZSBkaXNwYXRjaGVyIHdpbGwgbG9vayBmb3IgdGhlIDxjb2RlPkNoYW5uZWwuU0VORF9PUFRJT05TX0FTWU5DSFJPTk9VUzwvY29kZT4KKyAqIGZsYWcgdG8gYmUgc2V0LCBpZiBpdCBpcywgaXQgd2lsbCBxdWV1ZSB0aGUgbWVzc2FnZSBmb3IgZGVsaXZlcnkgYW5kIGltbWVkaWF0ZWx5IHJldHVybiB0byB0aGUgc2VuZGVyLgorICogCisgKiAKKyAqIAorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlRGlzcGF0Y2hJbnRlcmNlcHRvciBleHRlbmRzIENoYW5uZWxJbnRlcmNlcHRvckJhc2UgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coTWVzc2FnZURpc3BhdGNoSW50ZXJjZXB0b3IuY2xhc3MpOworCisgICAgcHJvdGVjdGVkIGxvbmcgbWF4UXVldWVTaXplID0gMTAyNCoxMDI0KjY0OyAvLzY0TUIKKyAgICBwcm90ZWN0ZWQgRmFzdFF1ZXVlIHF1ZXVlID0gbmV3IEZhc3RRdWV1ZSgpOworICAgIHByb3RlY3RlZCBib29sZWFuIHJ1biA9IGZhbHNlOworICAgIHByb3RlY3RlZCBUaHJlYWQgbXNnRGlzcGF0Y2hUaHJlYWQgPSBudWxsOworICAgIHByb3RlY3RlZCBsb25nIGN1cnJlbnRTaXplID0gMDsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VEZWVwQ2xvbmUgPSB0cnVlOworICAgIHByb3RlY3RlZCBib29sZWFuIGFsd2F5c1NlbmQgPSB0cnVlOworCisgICAgcHVibGljIE1lc3NhZ2VEaXNwYXRjaEludGVyY2VwdG9yKCkgeworICAgICAgICBzZXRPcHRpb25GbGFnKENoYW5uZWwuU0VORF9PUFRJT05TX0FTWU5DSFJPTk9VUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoTWVtYmVyW10gZGVzdGluYXRpb24sIENoYW5uZWxNZXNzYWdlIG1zZywgSW50ZXJjZXB0b3JQYXlsb2FkIHBheWxvYWQpIHRocm93cyBDaGFubmVsRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBhc3luYyA9IChtc2cuZ2V0T3B0aW9ucygpICYgQ2hhbm5lbC5TRU5EX09QVElPTlNfQVNZTkNIUk9OT1VTKSA9PSBDaGFubmVsLlNFTkRfT1BUSU9OU19BU1lOQ0hST05PVVM7CisgICAgICAgIGlmICggYXN5bmMgJiYgcnVuICkgeworICAgICAgICAgICAgaWYgKCAoZ2V0Q3VycmVudFNpemUoKSttc2cuZ2V0TWVzc2FnZSgpLmdldExlbmd0aCgpKSA+IG1heFF1ZXVlU2l6ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGFsd2F5c1NlbmQgKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyLnNlbmRNZXNzYWdlKGRlc3RpbmF0aW9uLG1zZyxwYXlsb2FkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDaGFubmVsRXhjZXB0aW9uKCJBc3luY2hyb25vdXMgcXVldWUgaXMgZnVsbCwgcmVhY2hlZCBpdHMgbGltaXQgb2YgIiArIG1heFF1ZXVlU2l6ZSArIiBieXRlcywgY3VycmVudDoiICsgZ2V0Q3VycmVudFNpemUoKSArICIgYnl0ZXMuIik7CisgICAgICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgIC8vYWRkIHRvIHF1ZXVlCisgICAgICAgICAgICBpZiAoIHVzZURlZXBDbG9uZSApIG1zZyA9IChDaGFubmVsTWVzc2FnZSltc2cuZGVlcGNsb25lKCk7CisgICAgICAgICAgICBpZiAoIWFkZFRvUXVldWUobXNnLCBkZXN0aW5hdGlvbiwgcGF5bG9hZCkgKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENoYW5uZWxFeGNlcHRpb24oIlVuYWJsZSB0byBhZGQgdGhlIG1lc3NhZ2UgdG8gdGhlIGFzeW5jIHF1ZXVlLCBxdWV1ZSBidWc/Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRBbmRHZXRDdXJyZW50U2l6ZShtc2cuZ2V0TWVzc2FnZSgpLmdldExlbmd0aCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLnNlbmRNZXNzYWdlKGRlc3RpbmF0aW9uLCBtc2csIHBheWxvYWQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGFkZFRvUXVldWUoQ2hhbm5lbE1lc3NhZ2UgbXNnLCBNZW1iZXJbXSBkZXN0aW5hdGlvbiwgSW50ZXJjZXB0b3JQYXlsb2FkIHBheWxvYWQpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXVlLmFkZChtc2csZGVzdGluYXRpb24scGF5bG9hZCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBMaW5rT2JqZWN0IHJlbW92ZUZyb21RdWV1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXVlLnJlbW92ZSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzdGFydFF1ZXVlKCkgeworICAgICAgICBtc2dEaXNwYXRjaFRocmVhZCA9IG5ldyBUaHJlYWQodGhpcyk7CisgICAgICAgIG1zZ0Rpc3BhdGNoVGhyZWFkLnNldE5hbWUoIk1lc3NhZ2VEaXNwYXRjaEludGVyY2VwdG9yLk1lc3NhZ2VEaXNwYXRjaFRocmVhZCIpOworICAgICAgICBtc2dEaXNwYXRjaFRocmVhZC5zZXREYWVtb24odHJ1ZSk7CisgICAgICAgIG1zZ0Rpc3BhdGNoVGhyZWFkLnNldFByaW9yaXR5KFRocmVhZC5NQVhfUFJJT1JJVFkpOworICAgICAgICBxdWV1ZS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICBydW4gPSB0cnVlOworICAgICAgICBtc2dEaXNwYXRjaFRocmVhZC5zdGFydCgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzdG9wUXVldWUoKSB7CisgICAgICAgIHJ1biA9IGZhbHNlOworICAgICAgICBtc2dEaXNwYXRjaFRocmVhZC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgcXVldWUuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIHNldEFuZEdldEN1cnJlbnRTaXplKDApOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb25GbGFnKGludCBmbGFnKSB7CisgICAgICAgIGlmICggZmxhZyAhPSBDaGFubmVsLlNFTkRfT1BUSU9OU19BU1lOQ0hST05PVVMgKSBsb2cud2FybigiV2FybmluZywgeW91IGFyZSBvdmVycmlkaW5nIHRoZSBhc3luY2hyb25vdXMgb3B0aW9uIGZsYWcsIHRoaXMgd2lsbCBkaXNhYmxlIHRoZSBDaGFubmVsLlNFTkRfT1BUSU9OU19BU1lOQ0hST05PVVMgdGhhdCBvdGhlciBhcHBzIG1pZ2h0IHVzZS4iKTsKKyAgICAgICAgc3VwZXIuc2V0T3B0aW9uRmxhZyhmbGFnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhRdWV1ZVNpemUobG9uZyBtYXhRdWV1ZVNpemUpIHsKKyAgICAgICAgdGhpcy5tYXhRdWV1ZVNpemUgPSBtYXhRdWV1ZVNpemU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNlRGVlcENsb25lKGJvb2xlYW4gdXNlRGVlcENsb25lKSB7CisgICAgICAgIHRoaXMudXNlRGVlcENsb25lID0gdXNlRGVlcENsb25lOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldE1heFF1ZXVlU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1heFF1ZXVlU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRVc2VEZWVwQ2xvbmUoKSB7CisgICAgICAgIHJldHVybiB1c2VEZWVwQ2xvbmU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBsb25nIGdldEN1cnJlbnRTaXplKCkgeworICAgICAgICByZXR1cm4gY3VycmVudFNpemU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBhZGRBbmRHZXRDdXJyZW50U2l6ZShsb25nIGluYykgeworICAgICAgICBjdXJyZW50U2l6ZSArPSBpbmM7CisgICAgICAgIHJldHVybiBjdXJyZW50U2l6ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIHNldEFuZEdldEN1cnJlbnRTaXplKGxvbmcgdmFsdWUpIHsKKyAgICAgICAgY3VycmVudFNpemUgPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGludCBzdmMpIHRocm93cyBDaGFubmVsRXhjZXB0aW9uIHsKKyAgICAgICAgLy9zdGFydCB0aGUgdGhyZWFkCisgICAgICAgIGlmICghcnVuICkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgaWYgKCAhcnVuICYmICgoc3ZjICYgQ2hhbm5lbC5TTkRfVFhfU0VRKT09Q2hhbm5lbC5TTkRfVFhfU0VRKSApIHsvL29ubHkgc3RhcnQgd2l0aCB0aGUgc2VuZGVyCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0UXVldWUoKTsKKyAgICAgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgIH0vL3N5bmMKKyAgICAgICAgfS8vZW5kIGlmCisgICAgICAgIHN1cGVyLnN0YXJ0KHN2Yyk7CisgICAgfQorCisgICAgCisgICAgcHVibGljIHZvaWQgc3RvcChpbnQgc3ZjKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIC8vc3RvcCB0aGUgdGhyZWFkCisgICAgICAgIGlmICggcnVuICkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgaWYgKCBydW4gJiYgKChzdmMgJiBDaGFubmVsLlNORF9UWF9TRVEpPT1DaGFubmVsLlNORF9UWF9TRVEpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3BRdWV1ZSgpOworICAgICAgICAgICAgICAgIH0vL2VuZCBpZgorICAgICAgICAgICAgfS8vc3luYworICAgICAgICB9Ly9lbmQgaWYKKworICAgICAgICBzdXBlci5zdG9wKHN2Yyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgd2hpbGUgKCBydW4gKSB7CisgICAgICAgICAgICBMaW5rT2JqZWN0IGxpbmsgPSByZW1vdmVGcm9tUXVldWUoKTsKKyAgICAgICAgICAgIGlmICggbGluayA9PSBudWxsICkgY29udGludWU7IC8vc2hvdWxkIG5vdCBoYXBwZW4gdW5sZXNzIHdlIGV4Y2VlZCB3YWl0IHRpbWUKKyAgICAgICAgICAgIHdoaWxlICggbGluayAhPSBudWxsICYmIHJ1biApIHsKKyAgICAgICAgICAgICAgICBsaW5rID0gc2VuZEFzeW5jRGF0YShsaW5rKTsKKyAgICAgICAgICAgIH0vL3doaWxlCisgICAgICAgIH0vL3doaWxlCisgICAgfS8vcnVuCisKKyAgICBwcm90ZWN0ZWQgTGlua09iamVjdCBzZW5kQXN5bmNEYXRhKExpbmtPYmplY3QgbGluaykgeworICAgICAgICBDaGFubmVsTWVzc2FnZSBtc2cgPSBsaW5rLmRhdGEoKTsKKyAgICAgICAgTWVtYmVyW10gZGVzdGluYXRpb24gPSBsaW5rLmdldERlc3RpbmF0aW9uKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci5zZW5kTWVzc2FnZShkZXN0aW5hdGlvbixtc2csbnVsbCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICggbGluay5nZXRIYW5kbGVyKCkgIT0gbnVsbCApIGxpbmsuZ2V0SGFuZGxlcigpLmhhbmRsZUNvbXBsZXRpb24obmV3IFVuaXF1ZUlkKG1zZy5nZXRVbmlxdWVJZCgpKSk7IAorICAgICAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byByZXBvcnQgYmFjayBjb21wbGV0ZWQgbWVzc2FnZS4iLGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgQ2hhbm5lbEV4Y2VwdGlvbiBjeCA9IG51bGw7CisgICAgICAgICAgICBpZiAoIHggaW5zdGFuY2VvZiBDaGFubmVsRXhjZXB0aW9uICkgY3ggPSAoQ2hhbm5lbEV4Y2VwdGlvbil4OworICAgICAgICAgICAgZWxzZSBjeCA9IG5ldyBDaGFubmVsRXhjZXB0aW9uKHgpOworICAgICAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIGxvZy5kZWJ1ZygiRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBhc3luYyBtZXNzYWdlLiIseCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChsaW5rLmdldEhhbmRsZXIoKSAhPSBudWxsKSBsaW5rLmdldEhhbmRsZXIoKS5oYW5kbGVFcnJvcihjeCwgbmV3IFVuaXF1ZUlkKG1zZy5nZXRVbmlxdWVJZCgpKSk7CisgICAgICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHJlcG9ydCBiYWNrIGVycm9yIG1lc3NhZ2UuIixleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBhZGRBbmRHZXRDdXJyZW50U2l6ZSgtbXNnLmdldE1lc3NhZ2UoKS5nZXRMZW5ndGgoKSk7CisgICAgICAgICAgICBsaW5rID0gbGluay5uZXh0KCk7CisgICAgICAgIH0vL3RyeQorICAgICAgICByZXR1cm4gbGluazsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL2ludGVyY2VwdG9ycy9Ob25CbG9ja2luZ0Nvb3JkaW5hdG9yLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvaW50ZXJjZXB0b3JzL05vbkJsb2NraW5nQ29vcmRpbmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDUyODQyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL2ludGVyY2VwdG9ycy9Ob25CbG9ja2luZ0Nvb3JkaW5hdG9yLmphdmEKQEAgLTAsMCArMSw4NDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbEludGVyY2VwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxJbnRlcmNlcHRvci5JbnRlcmNlcHRvckV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5VbmlxdWVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5BYnNvbHV0ZU9yZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkNoYW5uZWxJbnRlcmNlcHRvckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuSW50ZXJjZXB0b3JQYXlsb2FkOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLkNoYW5uZWxEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLlhCeXRlQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLm1lbWJlcnNoaXAuTWVtYmVySW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5tZW1iZXJzaGlwLk1lbWJlcnNoaXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbC5BcnJheXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbC5VVUlER2VuZXJhdG9yOworCisvKioKKyAqIDxwPlRpdGxlOiBBdXRvIG1lcmdpbmcgbGVhZGVyIGVsZWN0aW9uIGFsZ29yaXRobTwvcD4KKyAqCisgKiA8cD5EZXNjcmlwdGlvbjogSW1wbGVtZW50YXRpb24gb2YgYSBzaW1wbGUgY29vcmRpbmF0b3IgYWxnb3JpdGhtIHRoYXQgbm90IG9ubHkgc2VsZWN0cyBhIGNvb3JkaW5hdG9yLAorICogICAgaXQgYWxzbyBtZXJnZXMgZ3JvdXBzIGF1dG9tYXRpY2FsbHkgd2hlbiBtZW1iZXJzIGFyZSBkaXNjb3ZlcmVkIHRoYXQgd2VyZW50IHBhcnQgb2YgdGhlIAorICogICAgPC9wPgorICogPHA+VGhpcyBhbGdvcml0aG0gaXMgbm9uIGJsb2NraW5nIG1lYW5pbmcgaXQgYWxsb3dzIGZvciB0cmFuc2FjdGlvbnMgd2hpbGUgdGhlIGNvb3JkaW5hdGlvbiBwaGFzZSBpcyBnb2luZyBvbgorICogPC9wPgorICogPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBhIGhvbWUgYnJld2VkIGFsZ29yaXRobSB0aGF0IHVzZXMgdGhlIEFic29sdXRlT3JkZXIgb2YgYSBtZW1iZXJzaGlwCisgKiB0byBwYXNzIGEgdG9rZW4gcmluZyBvZiB0aGUgY3VycmVudCBtZW1iZXJzaGlwLjxicj4KKyAqIFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIGp1c3QgdXNpbmcgQWJzb2x1dGVPcmRlciEgQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBzY2VuYXJpbzo8YnI+CisgKiBOb2RlcywgQSxCLEMsRCxFIG9uIGEgbmV0d29yaywgaW4gdGhhdCBwcmlvcml0eS4gQWJzb2x1dGVPcmRlciB3aWxsIG9ubHkgd29yayBpZiBhbGwKKyAqIG5vZGVzIGFyZSByZWNlaXZpbmcgcGluZ3MgZnJvbSBhbGwgdGhlIG90aGVyIG5vZGVzLiAKKyAqIG1lYW5pbmcsIHRoYXQgbm9kZXtpfSByZWNlaXZlcyBwaW5ncyBmcm9tIG5vZGV7YWxsfS1ub2Rle2l9PGJyPgorICogYnV0IHRoZSBmb2xsb3dpbmcgY291bGQgaGFwcGVuIGlmIGEgbXVsdGljYXN0IHByb2JsZW0gb2NjdXJzLgorICogQSBoYXMgbWVtYmVycyB7QixDLER9PGJyPgorICogQiBoYXMgbWVtYmVycyB7QSxDfTxicj4KKyAqIEMgaGFzIG1lbWJlcnMge0QsRX08YnI+CisgKiBEIGhhcyBtZW1iZXJzIHtBLEIsQyxFfTxicj4KKyAqIEUgaGFzIG1lbWJlcnMge0EsQyxEfTxicj4KKyAqIEJlY2F1c2UgdGhlIGRlZmF1bHQgVHJpYmVzIG1lbWJlcnNoaXAgaW1wbGVtZW50YXRpb24sIHJlbGllcyBvbiB0aGUgbXVsdGljYXN0IHBhY2tldHMgdG8gCisgKiBhcnJpdmUgYXQgYWxsIG5vZGVzIGNvcnJlY3RseSwgdGhlcmUgaXMgbm90aGluZyBndWFyYW50ZWVpbmcgdGhhdCBpdCB3aWxsLjxicj4KKyAqIDxicj4KKyAqIFRvIGJlc3QgZXhwbGFpbiBob3cgdGhpcyBhbGdvcml0aG0gd29ya3MsIGxldHMgdGFrZSB0aGUgYWJvdmUgZXhhbXBsZToKKyAqIEZvciBzaW1wbGljaXR5IHdlIGFzc3VtZSB0aGF0IGEgc2VuZCBvcGVyYXRpb24gaXMgTygxKSBmb3IgYWxsIG5vZGVzLCBhbHRob3VnaCB0aGlzIGFsZ29yaXRobSB3aWxsIHdvcmsKKyAqIHdoZXJlIG1lc3NhZ2VzIG92ZXJsYXAsIGFzIHRoZXkgYWxsIGRlcGVuZCBvbiBhYnNvbHV0ZSBvcmRlcjxicj4KKyAqIFNjZW5hcmlvIDE6IEEsQixDLEQsRSBhbGwgY29tZSBvbmxpbmUgYXQgdGhlIHNhbWUgdGltZQorICogRXZhbCBwaGFzZSwgQSB0aGlua3Mgb2YgaXRzZWxmIGFzIGxlYWRlciwgQiB0aGlua3Mgb2YgQSBhcyBsZWFkZXIsCisgKiBDIHRoaW5rcyBvZiBpdHNlbGYgYXMgbGVhZGVyLCBELEUgdGhpbmsgb2YgQSBhcyBsZWFkZXI8YnI+CisgKiBUb2tlbiBwaGFzZTo8YnI+CisgKiAoMSkgQSBzZW5kcyBvdXQgYSBtZXNzYWdlIFh7QS1sZHIsIEEtc3JjLCBtYnJzLUEsQixDLER9IHRvIEIgd2hlcmUgWCBpcyB0aGUgaWQgZm9yIHRoZSBtZXNzYWdlKGFuZCB0aGUgdmlldyk8YnI+CisgKiAoMSkgQyBzZW5kcyBvdXQgYSBtZXNzYWdlIFl7Qy1sZHIsIEMtc3JjLCBtYnJzLUMsRCxFfSB0byBEIHdoZXJlIFkgaXMgdGhlIGlkIGZvciB0aGUgbWVzc2FnZShhbmQgdGhlIHZpZXcpPGJyPgorICogKDIpIEIgcmVjZWl2ZXMgWHtBLWxkciwgQS1zcmMsIG1icnMtQSxCLEMsRH0sIHNlbmRzIFh7QS1sZHIsIEEtc3JjLCBtYnJzLUEsQixDLER9IHRvIEMgPGJyPgorICogKDIpIEQgcmVjZWl2ZXMgWXtDLWxkciwgQy1zcmMsIG1icnMtQyxELEV9IEQgaXMgYXdhcmUgb2YgQSxCLCBzZW5kcyBZe0EtbGRyLCBDLXNyYywgbWJycy1BLEIsQyxELEV9IHRvIEU8YnI+CisgKiAoMykgQyByZWNlaXZlcyBYe0EtbGRyLCBBLXNyYywgbWJycy1BLEIsQyxEfSwgc2VuZHMgWHtBLWxkciwgQS1zcmMsIG1icnMtQSxCLEMsRCxFfSB0byBEPGJyPgorICogKDMpIEUgcmVjZWl2ZXMgWXtBLWxkciwgQy1zcmMsIG1icnMtQSxCLEMsRCxFfSBzZW5kcyBZe0EtbGRyLCBDLXNyYywgbWJycy1BLEIsQyxELEV9IHRvIEE8YnI+CisgKiAoNCkgRCByZWNlaXZlcyBYe0EtbGRyLCBBLXNyYywgbWJycy1BLEIsQyxELEV9IHNlbmRzIHNlbmRzIFh7QS1sZHIsIEEtc3JjLCBtYnJzLUEsQixDLEQsRX0gdG8gQTxicj4KKyAqICg0KSBBIHJlY2VpdmVzIFl7QS1sZHIsIEMtc3JjLCBtYnJzLUEsQixDLEQsRX0sIGhvbGRzIHRoZSBtZXNzYWdlLCBhZGQgRSB0byBpdHMgbGlzdCBvZiBtZW1iZXJzPGJyPgorICogKDUpIEEgcmVjZWl2ZXMgWHtBLWxkciwgQS1zcmMsIG1icnMtQSxCLEMsRCxFfSA8YnI+CisgKiBBdCB0aGlzIHBvaW50LCB0aGUgc3RhdGUgbG9va3MgbGlrZTxicj4KKyAqIEEgLSB7QS1sZHIsIG1icnMtQSxCLEMsRCxFLCBpZD1YfTxicj4KKyAqIEIgLSB7QS1sZHIsIG1icnMtQSxCLEMsRCwgaWQ9WH08YnI+CisgKiBDIC0ge0EtbGRyLCBtYnJzLUEsQixDLEQsRSwgaWQ9WH08YnI+CisgKiBEIC0ge0EtbGRyLCBtYnJzLUEsQixDLEQsRSwgaWQ9WH08YnI+CisgKiBFIC0ge0EtbGRyLCBtYnJzLUEsQixDLEQsRSwgaWQ9WX08YnI+CisgKiA8YnI+CisgKiBBIG1lc3NhZ2UgZG9lc24ndCBzdG9wIHVudGlsIGl0IHJlYWNoZXMgaXRzIG9yaWdpbmFsIHNlbmRlciwgdW5sZXNzIGl0cyBkcm9wcGVkIGJ5IGEgaGlnaGVyIGxlYWRlci4KKyAqIEFzIHlvdSBjYW4gc2VlLCBFIHN0aWxsIHRoaW5rcyB0aGUgdmlld0lkPVksIHdoaWNoIGlzIG5vdCBjb3JyZWN0LiBCdXQgYXQgdGhpcyBwb2ludCB3ZSBoYXZlIAorICogYXJyaXZlZCBhdCB0aGUgc2FtZSBtZW1iZXJzaGlwIGFuZCBhbGwgbm9kZXMgYXJlIGluZm9ybWVkIG9mIGVhY2ggb3RoZXIuPGJyPgorICogVG8gc3luY2hyb25pemUgdGhlIHJlc3Qgd2Ugc2ltcGx5IHBlcmZvcm0gdGhlIGZvbGxvd2luZyBjaGVjayBhdCBBIHdoZW4gQSByZWNlaXZlcyBYOjxicj4KKyAqIE9yaWdpbmFsIFh7QS1sZHIsIEEtc3JjLCBtYnJzLUEsQixDLER9ID09IEFycml2ZWQgWHtBLWxkciwgQS1zcmMsIG1icnMtQSxCLEMsRCxFfTxicj4KKyAqIFNpbmNlIHRoZSBjb25kaXRpb24gaXMgZmFsc2UsIEEsIHdpbGwgcmVzZW5kIHRoZSB0b2tlbiwgYW5kIEEgc2VuZHMgWHtBLWxkciwgQS1zcmMsIG1icnMtQSxCLEMsRCxFfSB0byBCCisgKiBXaGVuIEEgcmVjZWl2ZXMgWCBhZ2FpbiwgdGhlIHRva2VuIGlzIGNvbXBsZXRlLiA8YnI+CisgKiBPcHRpb25hbGx5LCBBIGNhbiBzZW5kIGEgbWVzc2FnZSBYe0EtbGRyLCBBLXNyYywgbWJycy1BLEIsQyxELEUgY29uZmlybWVkfSB0byBBLEIsQyxELEUgd2hvIHRoZW4KKyAqIGluc3RhbGwgYW5kIGFjY2VwdCB0aGUgdmlldy4KKyAqIDwvcD4KKyAqIDxwPgorICogTGV0cyBhc3N1bWUgdGhhdCBDMSBhcnJpdmVzLCBDMSBoYXMgbG93ZXIgcHJpb3JpdHkgdGhhbiBDLCBidXQgaGlnaGVyIHByaW9yaXR5IHRoYW4gRC48YnI+CisgKiBMZXRzIGFsc28gYXNzdW1lIHRoYXQgQzEgc2VlcyB0aGUgZm9sbG93aW5nIHZpZXcge0IsRCxFfTxicj4KKyAqIEMxIHdhaXRzIGZvciBhIHRva2VuIHRvIGFycml2ZS4gV2hlbiB0aGUgdG9rZW4gYXJyaXZlcywgdGhlIHNhbWUgc2NlbmFyaW8gYXMgYWJvdmUgd2lsbCBoYXBwZW4uPGJyPgorICogSW4gdGhlIHNjZW5hcmlvIHdoZXJlIEMxIHNlZXMge0QsRX0gYW5kIEEsQixDIGNhbiBub3Qgc2VlIEMxLCBubyB0b2tlbiB3aWxsIGV2ZXIgYXJyaXZlLjxicj4KKyAqIEluIHRoaXMgY2FzZSwgQzEgc2VuZHMgYSBae0MxLWxkciwgQzEtc3JjLCBtYnJzLUMxLEQsRX0gdG8gRDxicj4KKyAqIEQgcmVjZWl2ZXMgWntDMS1sZHIsIEMxLXNyYywgbWJycy1DMSxELEV9IGFuZCBzZW5kcyBae0EtbGRyLCBDMS1zcmMsIG1icnMtQSxCLEMsQzEsRCxFfSB0byBFPGJyPgorICogRSByZWNlaXZlcyBae0EtbGRyLCBDMS1zcmMsIG1icnMtQSxCLEMsQzEsRCxFfSBhbmQgc2VuZHMgaXQgdG8gQTxicj4KKyAqIEEgc2VuZHMgWntBLWxkciwgQS1zcmMsIG1icnMtQSxCLEMsQzEsRCxFfSB0byBCIGFuZCB0aGUgY2hhaW4gY29udGludWVzIHVudGlsIEEgcmVjZWl2ZXMgdGhlIHRva2VuIGFnYWluLgorICogQXQgdGhhdCB0aW1lIEEgb3B0aW9uYWxseSBzZW5kcyBvdXQgWntBLWxkciwgQS1zcmMsIG1icnMtQSxCLEMsQzEsRCxFLCBjb25maXJtZWR9IHRvIEEsQixDLEMxLEQsRQorICogPC9wPgorICogPHA+VG8gZW5zdXJlIHRoYXQgdGhlIHZpZXcgZ2V0cyBpbXBsZW1lbnRlZCBhdCBhbGwgbm9kZXMgYXQgdGhlIHNhbWUgdGltZSwgCisgKiAgICBBIHdpbGwgc2VuZCBvdXQgYSBWSUVXX0NPTkYgbWVzc2FnZSwgdGhpcyBpcyB0aGUgJ2NvbmZpcm1lZCcgbWVzc2FnZSB0aGF0IGlzIG9wdGlvbmFsIGFib3ZlLgorICogPHA+SWRlYWxseSwgdGhlIGludGVyY2VwdG9yIGJlbG93IHRoaXMgb25lIHdvdWxkIGJlIHRoZSBUY3BGYWlsdXJlRGV0ZWN0b3IgdG8gZW5zdXJlIGNvcnJlY3QgbWVtYmVyc2hpcHM8L3A+CisgKgorICogPHA+VGhlIGV4YW1wbGUgYWJvdmUsIG9mIGNvdXJzZSBjYW4gYmUgc2ltcGxpZmllZCB3aXRoIGEgZmluaXRlIHN0YXRlbWFjaGluZTo8YnI+CisgKiBCdXQgSSBzdWNrIGF0IHdyaXRpbmcgc3RhdGUgbWFjaGluZXMsIG15IGhlYWQgZ2V0cyBhbGwgY29uZnVzZWQuIE9uZSBkYXkgSSB3aWxsIGRvY3VtZW50IHRoaXMgYWxnb3JpdGhtIHRob3VnaC48YnI+CisgKiBNYXliZSBJJ2xsIGRvIGEgc3RhdGUgZGlhZ3JhbSA6KQorICogPC9wPgorICogPGgyPlN0YXRlIERpYWdyYW1zPC9oMj4KKyAqIDxhIGhyZWY9Imh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9+ZmhhbmlrL3RyaWJlcy9kb2NzL2xlYWRlci1lbGVjdGlvbi1pbml0aWF0ZS1lbGVjdGlvbi5qcGciPkluaXRpYXRlIGFuIGVsZWN0aW9uPC9hPjxicj48YnI+CisgKiA8YSBocmVmPSJodHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvfmZoYW5pay90cmliZXMvZG9jcy9sZWFkZXItZWxlY3Rpb24tbWVzc2FnZS1hcnJpdmVzLmpwZyI+UmVjZWl2ZSBhbiBlbGVjdGlvbiBtZXNzYWdlPC9hPjxicj48YnI+CisgKiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICogCisgKiAKKyAqIAorICovCitwdWJsaWMgY2xhc3MgTm9uQmxvY2tpbmdDb29yZGluYXRvciBleHRlbmRzIENoYW5uZWxJbnRlcmNlcHRvckJhc2UgeworICAgIAorICAgIC8qKgorICAgICAqIGhlYWRlciBmb3IgYSBjb29yZGluYXRpb24gbWVzc2FnZQorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZVtdIENPT1JEX0hFQURFUiA9IG5ldyBieXRlW10gey04NiwgMzgsIC0zNCwgLTI5LCAtOTgsIDkwLCA2NSwgNjMsIC04MSwgLTEyMiwgLTYsIC0xMTAsIDk5LCAtNTQsIDEzLCA2M307CisgICAgLyoqCisgICAgICogQ29vcmRpbmF0aW9uIHJlcXVlc3QKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT09SRF9SRVFVRVNUID0gbmV3IGJ5dGVbXSB7MTA0LCAtOTUsIC05MiwgLTQyLCAxMTQsIC0zNiwgNzEsIC0xOSwgLTc5LCAyMCwgMTIyLCAxMDEsIC0xLCAtNDgsIC00OSwgMzB9OworICAgIC8qKgorICAgICAqIENvb3JkaW5hdGlvbiBjb25maXJtYXRpb24sIGZvciBibG9ja2luZyBpbnN0YWxsYXRpb25zCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlW10gQ09PUkRfQ09ORiA9IG5ldyBieXRlW10gezY3LCA4OCwgMTA3LCAtODYsIDY5LCAyMywgNzYsIC03MCwgLTkxLCAtMjMsIC04NywgLTI1LCAtMTI1LCA4NiwgNzUsIDIwfTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBbGl2ZSBtZXNzYWdlCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlW10gQ09PUkRfQUxJVkUgPSBuZXcgYnl0ZVtdIHs3OSwgLTEyMSwgLTI1LCAtMTUsIC01OSwgNSwgNjQsIDk0LCAtNzcsIDExMywgLTExOSwgLTg4LCA1MiwgMTE0LCAtNTYsIC00NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOCwgMTAyLCAxMCwgMzQsIC0xMjcsIC05LCA3MSwgMTE1LCAtNzAsIDcyLCAtMTAxLCA4OCwgNzIsIC0xMjQsIDEyNywgMTExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzQsIDc2LCAtMTE2LCA1MCwgMTExLCAxMDMsIDY1LCAzLCAtNzcsIDUxLCAtMzUsIDAsIDExOSwgMTE3LCA5LCAtMjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTksIDUwLCAtNzUsIC0xMDUsIC0xMDIsIDM2LCA3OSwgMzcsIC02OCwgLTg0LCAtMTIzLCAxNSwgLTIyLCAtMTA5LCAxMDYsIC01NX07CisgICAgLyoqCisgICAgICogVGltZSB0byB3YWl0IGZvciBjb29yZGluYXRpb24gdGltZW91dAorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIHdhaXRGb3JDb29yZE1zZ1RpbWVvdXQgPSAxNTAwMDsKKyAgICAvKioKKyAgICAgKiBPdXIgY3VycmVudCB2aWV3CisgICAgICovCisgICAgcHJvdGVjdGVkIE1lbWJlcnNoaXAgdmlldyA9IG51bGw7CisgICAgLyoqCisgICAgICogT3V0IGN1cnJlbnQgdmlld0lkCisgICAgICovCisgICAgcHJvdGVjdGVkIFVuaXF1ZUlkIHZpZXdJZDsKKworICAgIC8qKgorICAgICAqIE91ciBub25ibG9ja2luZyBtZW1iZXJzaGlwCisgICAgICovCisgICAgcHJvdGVjdGVkIE1lbWJlcnNoaXAgbWVtYmVyc2hpcCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogaW5kaWNhdGVzIHRoYXQgd2UgYXJlIHJ1bm5pbmcgYW4gZWxlY3Rpb24gCisgICAgICogYW5kIHRoaXMgaXMgdGhlIG9uZSB3ZSBhcmUgcnVubmluZworICAgICAqLworICAgIHByb3RlY3RlZCBVbmlxdWVJZCBzdWdnZXN0ZWR2aWV3SWQ7CisgICAgcHJvdGVjdGVkIE1lbWJlcnNoaXAgc3VnZ2VzdGVkVmlldzsKKyAgICAKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIGZpbmFsIGludCBzdGFydHN2YyA9IDB4RkZGRjsKKyAgICAKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGVsZWN0aW9uTXV0ZXggPSBuZXcgT2JqZWN0KCk7CisgICAgCisgICAgcHJvdGVjdGVkIEF0b21pY0Jvb2xlYW4gY29vcmRNc2dSZWNlaXZlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICAKKyAgICBwdWJsaWMgTm9uQmxvY2tpbmdDb29yZGluYXRvcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisgICAgCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgICAKKy8vICAgICAgICAgICAgICBDT09SRElOQVRJT04gSEFORExJTkcKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgCisgICAgcHVibGljIHZvaWQgc3RhcnRFbGVjdGlvbihib29sZWFuIGZvcmNlKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNocm9uaXplZCAoZWxlY3Rpb25NdXRleCkgeworICAgICAgICAgICAgTWVtYmVySW1wbCBsb2NhbCA9IChNZW1iZXJJbXBsKWdldExvY2FsTWVtYmVyKGZhbHNlKTsKKyAgICAgICAgICAgIE1lbWJlckltcGxbXSBvdGhlcnMgPSAoTWVtYmVySW1wbFtdKW1lbWJlcnNoaXAuZ2V0TWVtYmVycygpOworICAgICAgICAgICAgZmlyZUludGVyY2VwdG9yRXZlbnQobmV3IENvb3JkaW5hdGlvbkV2ZW50KENvb3JkaW5hdGlvbkV2ZW50LkVWVF9TVEFSVF9FTEVDVCx0aGlzLCJFbGVjdGlvbiBpbml0YXRlZCIpKTsKKyAgICAgICAgICAgIGlmICggb3RoZXJzLmxlbmd0aCA9PSAwICkgeworICAgICAgICAgICAgICAgIHRoaXMudmlld0lkID0gbmV3IFVuaXF1ZUlkKFVVSURHZW5lcmF0b3IucmFuZG9tVVVJRChmYWxzZSkpOworICAgICAgICAgICAgICAgIHRoaXMudmlldyA9IG5ldyBNZW1iZXJzaGlwKGxvY2FsLEFic29sdXRlT3JkZXIuY29tcCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVWaWV3Q29uZih0aGlzLmNyZWF0ZUVsZWN0aW9uTXNnKGxvY2FsLG90aGVycyxsb2NhbCksbG9jYWwsdmlldyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAvL3RoZSBvbmx5IG1lbWJlciwgbm8gbmVlZCBmb3IgYW4gZWxlY3Rpb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3VnZ2VzdGVkdmlld0lkICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCB2aWV3ICE9IG51bGwgJiYgQXJyYXlzLmRpZmYodmlldyxzdWdnZXN0ZWRWaWV3LGxvY2FsKS5sZW5ndGggPT0gMCAmJiAgQXJyYXlzLmRpZmYoc3VnZ2VzdGVkVmlldyx2aWV3LGxvY2FsKS5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzdWdnZXN0ZWR2aWV3SWQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBzdWdnZXN0ZWRWaWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZmlyZUludGVyY2VwdG9yRXZlbnQobmV3IENvb3JkaW5hdGlvbkV2ZW50KENvb3JkaW5hdGlvbkV2ZW50LkVWVF9FTEVDVF9BQkFORE9ORUQsdGhpcywiRWxlY3Rpb24gYWJhbmRvbmVkLCBydW5uaW5nIGVsZWN0aW9uIG1hdGNoZXMgdmlldyIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaXJlSW50ZXJjZXB0b3JFdmVudChuZXcgQ29vcmRpbmF0aW9uRXZlbnQoQ29vcmRpbmF0aW9uRXZlbnQuRVZUX0VMRUNUX0FCQU5ET05FRCx0aGlzLCJFbGVjdGlvbiBhYmFuZG9uZWQsIGVsZWN0aW9uIHJ1bm5pbmciKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsgLy9lbGVjdGlvbiBhbHJlYWR5IHJ1bm5pbmcsIEknbSBub3QgYWxsb3dlZCB0byBoYXZlIHR3byBvZiB0aGVtCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHZpZXcgIT0gbnVsbCAmJiBBcnJheXMuZGlmZih2aWV3LG1lbWJlcnNoaXAsbG9jYWwpLmxlbmd0aCA9PSAwICYmICBBcnJheXMuZGlmZihtZW1iZXJzaGlwLHZpZXcsbG9jYWwpLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgZmlyZUludGVyY2VwdG9yRXZlbnQobmV3IENvb3JkaW5hdGlvbkV2ZW50KENvb3JkaW5hdGlvbkV2ZW50LkVWVF9FTEVDVF9BQkFORE9ORUQsdGhpcywiRWxlY3Rpb24gYWJhbmRvbmVkLCB2aWV3IG1hdGNoZXMgbWVtYmVyc2hpcCIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vYWxyZWFkeSBoYXZlIHRoaXMgdmlldyBpbnN0YWxsZWQKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBwcmlvID0gQWJzb2x1dGVPcmRlci5jb21wLmNvbXBhcmUobG9jYWwsb3RoZXJzWzBdKTsKKyAgICAgICAgICAgIE1lbWJlckltcGwgbGVhZGVyID0gKCBwcmlvIDwgMCApP2xvY2FsOm90aGVyc1swXTsvL2FtIEkgdGhlIGxlYWRlciBpbiBteSB2aWV3PworICAgICAgICAgICAgaWYgKCBsb2NhbC5lcXVhbHMobGVhZGVyKSB8fCBmb3JjZSApIHsKKyAgICAgICAgICAgICAgICBDb29yZGluYXRpb25NZXNzYWdlIG1zZyA9IGNyZWF0ZUVsZWN0aW9uTXNnKGxvY2FsLCBvdGhlcnMsIGxlYWRlcik7CisgICAgICAgICAgICAgICAgc3VnZ2VzdGVkdmlld0lkID0gbXNnLmdldElkKCk7CisgICAgICAgICAgICAgICAgc3VnZ2VzdGVkVmlldyA9IG5ldyBNZW1iZXJzaGlwKGxvY2FsLEFic29sdXRlT3JkZXIuY29tcCx0cnVlKTsKKyAgICAgICAgICAgICAgICBBcnJheXMuZmlsbChzdWdnZXN0ZWRWaWV3LG1zZy5nZXRNZW1iZXJzKCkpOworICAgICAgICAgICAgICAgIGZpcmVJbnRlcmNlcHRvckV2ZW50KG5ldyBDb29yZGluYXRpb25FdmVudChDb29yZGluYXRpb25FdmVudC5FVlRfUFJPQ0VTU19FTEVDVCx0aGlzLCJFbGVjdGlvbiwgc2VuZGluZyByZXF1ZXN0IikpOworICAgICAgICAgICAgICAgIHNlbmRFbGVjdGlvbk1zZyhsb2NhbCxvdGhlcnNbMF0sbXNnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29vcmRNc2dSZWNlaXZlZC5zZXQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBmaXJlSW50ZXJjZXB0b3JFdmVudChuZXcgQ29vcmRpbmF0aW9uRXZlbnQoQ29vcmRpbmF0aW9uRXZlbnQuRVZUX1dBSVRfRk9SX01TRyx0aGlzLCJFbGVjdGlvbiwgd2FpdGluZyBmb3IgcmVxdWVzdCIpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxlY3Rpb25NdXRleC53YWl0KHdhaXRGb3JDb29yZE1zZ1RpbWVvdXQpOworICAgICAgICAgICAgICAgIH1jYXRjaCAoIEludGVycnVwdGVkRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0ZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBzdWdnZXN0ZWR2aWV3SWQgPT0gbnVsbCAmJiAoIWNvb3JkTXNnUmVjZWl2ZWQuZ2V0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vbm8gbWVzc2FnZSBhcnJpdmVkLCBzZW5kIHRoZSBjb29yZCBtc2cKKy8vICAgICAgICAgICAgICAgICAgICBmaXJlSW50ZXJjZXB0b3JFdmVudChuZXcgQ29vcmRpbmF0aW9uRXZlbnQoQ29vcmRpbmF0aW9uRXZlbnQuRVZUX1dBSVRfRk9SX01TRyx0aGlzLCJFbGVjdGlvbiwgd2FpdGluZyB0aW1lZCBvdXQuIikpOworLy8gICAgICAgICAgICAgICAgICAgIHN0YXJ0RWxlY3Rpb24odHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGZpcmVJbnRlcmNlcHRvckV2ZW50KG5ldyBDb29yZGluYXRpb25FdmVudChDb29yZGluYXRpb25FdmVudC5FVlRfRUxFQ1RfQUJBTkRPTkVELHRoaXMsIkVsZWN0aW9uIGFiYW5kb25lZCwgd2FpdGluZyB0aW1lZCBvdXQuIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpcmVJbnRlcmNlcHRvckV2ZW50KG5ldyBDb29yZGluYXRpb25FdmVudChDb29yZGluYXRpb25FdmVudC5FVlRfRUxFQ1RfQUJBTkRPTkVELHRoaXMsIkVsZWN0aW9uIGFiYW5kb25lZCwgcmVjZWl2ZWQgYSBtZXNzYWdlIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0vL2VuZCBpZgorICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENvb3JkaW5hdGlvbk1lc3NhZ2UgY3JlYXRlRWxlY3Rpb25Nc2coTWVtYmVySW1wbCBsb2NhbCwgTWVtYmVySW1wbFtdIG90aGVycywgTWVtYmVySW1wbCBsZWFkZXIpIHsKKyAgICAgICAgTWVtYmVyc2hpcCBtID0gbmV3IE1lbWJlcnNoaXAobG9jYWwsQWJzb2x1dGVPcmRlci5jb21wLHRydWUpOworICAgICAgICBBcnJheXMuZmlsbChtLG90aGVycyk7CisgICAgICAgIE1lbWJlckltcGxbXSBtYnJzID0gbS5nZXRNZW1iZXJzKCk7CisgICAgICAgIG0ucmVzZXQoKTsgCisgICAgICAgIENvb3JkaW5hdGlvbk1lc3NhZ2UgbXNnID0gbmV3IENvb3JkaW5hdGlvbk1lc3NhZ2UobGVhZGVyLCBsb2NhbCwgbWJycyxuZXcgVW5pcXVlSWQoVVVJREdlbmVyYXRvci5yYW5kb21VVUlEKHRydWUpKSwgdGhpcy5DT09SRF9SRVFVRVNUKTsKKyAgICAgICAgcmV0dXJuIG1zZzsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kRWxlY3Rpb25Nc2coTWVtYmVySW1wbCBsb2NhbCwgTWVtYmVySW1wbCBuZXh0LCBDb29yZGluYXRpb25NZXNzYWdlIG1zZykgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICBmaXJlSW50ZXJjZXB0b3JFdmVudChuZXcgQ29vcmRpbmF0aW9uRXZlbnQoQ29vcmRpbmF0aW9uRXZlbnQuRVZUX1NFTkRfTVNHLHRoaXMsIlNlbmRpbmcgZWxlY3Rpb24gbWVzc2FnZSB0bygiK25leHQuZ2V0TmFtZSgpKyIpIikpOworICAgICAgICBzdXBlci5zZW5kTWVzc2FnZShuZXcgTWVtYmVyW10ge25leHR9LCBjcmVhdGVEYXRhKG1zZywgbG9jYWwpLCBudWxsKTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgc2VuZEVsZWN0aW9uTXNnVG9OZXh0SW5saW5lKE1lbWJlckltcGwgbG9jYWwsIENvb3JkaW5hdGlvbk1lc3NhZ2UgbXNnKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7IAorICAgICAgICBpbnQgbmV4dCA9IEFycmF5cy5uZXh0SW5kZXgobG9jYWwsbXNnLmdldE1lbWJlcnMoKSk7CisgICAgICAgIGludCBjdXJyZW50ID0gbmV4dDsKKyAgICAgICAgbXNnLmxlYWRlciA9IG1zZy5nZXRNZW1iZXJzKClbMF07CisgICAgICAgIGJvb2xlYW4gc2VudCA9ICBmYWxzZTsKKyAgICAgICAgd2hpbGUgKCAhc2VudCAmJiBjdXJyZW50ID49IDAgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlbmRFbGVjdGlvbk1zZyhsb2NhbCwgKE1lbWJlckltcGwpIG1zZy5nZXRNZW1iZXJzKClbY3VycmVudF0sIG1zZyk7CisgICAgICAgICAgICAgICAgc2VudCA9IHRydWU7CisgICAgICAgICAgICB9Y2F0Y2ggKCBDaGFubmVsRXhjZXB0aW9uIHggICkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKCJVbmFibGUgdG8gc2VuZCBlbGVjdGlvbiBtZXNzYWdlIHRvOiIrbXNnLmdldE1lbWJlcnMoKVtjdXJyZW50XSk7CisgICAgICAgICAgICAgICAgY3VycmVudCA9IEFycmF5cy5uZXh0SW5kZXgobXNnLmdldE1lbWJlcnMoKVtjdXJyZW50XSxtc2cuZ2V0TWVtYmVycygpKTsKKyAgICAgICAgICAgICAgICBpZiAoIGN1cnJlbnQgPT0gbmV4dCApIHRocm93IHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIE1lbWJlciBnZXROZXh0SW5MaW5lKE1lbWJlckltcGwgbG9jYWwsIE1lbWJlckltcGxbXSBvdGhlcnMpIHsKKyAgICAgICAgTWVtYmVySW1wbCByZXN1bHQgPSBudWxsOworICAgICAgICBmb3IgKCBpbnQgaT0wOyBpPG90aGVycy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDaGFubmVsRGF0YSBjcmVhdGVEYXRhKENvb3JkaW5hdGlvbk1lc3NhZ2UgbXNnLCBNZW1iZXJJbXBsIGxvY2FsKSB7CisgICAgICAgIG1zZy53cml0ZSgpOworICAgICAgICBDaGFubmVsRGF0YSBkYXRhID0gbmV3IENoYW5uZWxEYXRhKHRydWUpOworICAgICAgICBkYXRhLnNldEFkZHJlc3MobG9jYWwpOworICAgICAgICBkYXRhLnNldE1lc3NhZ2UobXNnLmdldEJ1ZmZlcigpKTsKKyAgICAgICAgZGF0YS5zZXRPcHRpb25zKENoYW5uZWwuU0VORF9PUFRJT05TX1VTRV9BQ0spOworICAgICAgICBkYXRhLnNldFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCB2aWV3Q2hhbmdlKFVuaXF1ZUlkIHZpZXdJZCwgTWVtYmVyW10gdmlldykgeworICAgICAgICAvL2ludm9rZSBhbnkgbGlzdGVuZXJzCisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBib29sZWFuIGFsaXZlKE1lbWJlciBtYnIpIHsKKyAgICAgICAgcmV0dXJuIFRjcEZhaWx1cmVEZXRlY3Rvci5tZW1iZXJBbGl2ZShtYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09PUkRfQUxJVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEZvckNvb3JkTXNnVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0Rm9yQ29vcmRNc2dUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE9wdGlvbkZsYWcoKSk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBNZW1iZXJzaGlwIG1lcmdlT25BcnJpdmUoQ29vcmRpbmF0aW9uTWVzc2FnZSBtc2csIE1lbWJlciBzZW5kZXIpIHsKKyAgICAgICAgZmlyZUludGVyY2VwdG9yRXZlbnQobmV3IENvb3JkaW5hdGlvbkV2ZW50KENvb3JkaW5hdGlvbkV2ZW50LkVWVF9QUkVfTUVSR0UsdGhpcywiUHJlIG1lcmdlIikpOworICAgICAgICBNZW1iZXJJbXBsIGxvY2FsID0gKE1lbWJlckltcGwpZ2V0TG9jYWxNZW1iZXIoZmFsc2UpOworICAgICAgICBNZW1iZXJzaGlwIG1lcmdlZCA9IG5ldyBNZW1iZXJzaGlwKGxvY2FsLEFic29sdXRlT3JkZXIuY29tcCx0cnVlKTsKKyAgICAgICAgQXJyYXlzLmZpbGwobWVyZ2VkLG1zZy5nZXRNZW1iZXJzKCkpOworICAgICAgICBBcnJheXMuZmlsbChtZXJnZWQsZ2V0TWVtYmVycygpKTsKKyAgICAgICAgTWVtYmVyW10gZGlmZiA9IEFycmF5cy5kaWZmKG1lcmdlZCxtZW1iZXJzaGlwLGxvY2FsKTsKKyAgICAgICAgZm9yICggaW50IGk9MDsgaTxkaWZmLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgaWYgKCFhbGl2ZShkaWZmW2ldKSkgbWVyZ2VkLnJlbW92ZU1lbWJlcigoTWVtYmVySW1wbClkaWZmW2ldKTsKKyAgICAgICAgICAgIGVsc2UgbWVtYmVyQWRkZWQoZGlmZltpXSxmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUludGVyY2VwdG9yRXZlbnQobmV3IENvb3JkaW5hdGlvbkV2ZW50KENvb3JkaW5hdGlvbkV2ZW50LkVWVF9QT1NUX01FUkdFLHRoaXMsIlBvc3QgbWVyZ2UiKSk7CisgICAgICAgIHJldHVybiBtZXJnZWQ7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NDb29yZE1lc3NhZ2UoQ29vcmRpbmF0aW9uTWVzc2FnZSBtc2csIE1lbWJlciBzZW5kZXIpIHRocm93cyBDaGFubmVsRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCAhY29vcmRNc2dSZWNlaXZlZC5nZXQoKSApIHsKKyAgICAgICAgICAgIGNvb3JkTXNnUmVjZWl2ZWQuc2V0KHRydWUpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChlbGVjdGlvbk11dGV4KSB7IGVsZWN0aW9uTXV0ZXgubm90aWZ5QWxsKCk7fQorICAgICAgICB9IAorICAgICAgICBtc2cudGltZXN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIE1lbWJlcnNoaXAgbWVyZ2VkID0gbWVyZ2VPbkFycml2ZShtc2csIHNlbmRlcik7CisgICAgICAgIGlmIChpc1ZpZXdDb25mKG1zZykpIGhhbmRsZVZpZXdDb25mKG1zZywgc2VuZGVyLCBtZXJnZWQpOworICAgICAgICBlbHNlIGhhbmRsZVRva2VuKG1zZywgc2VuZGVyLCBtZXJnZWQpOworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXI7CisKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlVG9rZW4oQ29vcmRpbmF0aW9uTWVzc2FnZSBtc2csIE1lbWJlciBzZW5kZXIsTWVtYmVyc2hpcCBtZXJnZWQpIHRocm93cyBDaGFubmVsRXhjZXB0aW9uIHsKKyAgICAgICAgTWVtYmVySW1wbCBsb2NhbCA9IChNZW1iZXJJbXBsKWdldExvY2FsTWVtYmVyKGZhbHNlKTsKKyAgICAgICAgaWYgKCBsb2NhbC5lcXVhbHMobXNnLmdldFNvdXJjZSgpKSApIHsKKyAgICAgICAgICAgIC8vbXkgbWVzc2FnZSBtc2cuc3JjPWxvY2FsCisgICAgICAgICAgICBoYW5kbGVNeVRva2VuKGxvY2FsLCBtc2csIHNlbmRlcixtZXJnZWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGFuZGxlT3RoZXJUb2tlbihsb2NhbCwgbXNnLCBzZW5kZXIsbWVyZ2VkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVNeVRva2VuKE1lbWJlckltcGwgbG9jYWwsIENvb3JkaW5hdGlvbk1lc3NhZ2UgbXNnLCBNZW1iZXIgc2VuZGVyLE1lbWJlcnNoaXAgbWVyZ2VkKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICggbG9jYWwuZXF1YWxzKG1zZy5nZXRMZWFkZXIoKSkgKSB7CisgICAgICAgICAgICAvL25vIGxlYWRlcnNoaXAgY2hhbmdlCisgICAgICAgICAgICBpZiAoIEFycmF5cy5zYW1lTWVtYmVycyhtc2cuZ2V0TWVtYmVycygpLG1lcmdlZC5nZXRNZW1iZXJzKCkpICkgeworICAgICAgICAgICAgICAgIG1zZy50eXBlID0gQ09PUkRfQ09ORjsKKyAgICAgICAgICAgICAgICBzdXBlci5zZW5kTWVzc2FnZShBcnJheXMucmVtb3ZlKG1zZy5nZXRNZW1iZXJzKCksbG9jYWwpLGNyZWF0ZURhdGEobXNnLGxvY2FsKSxudWxsKTsKKyAgICAgICAgICAgICAgICBoYW5kbGVWaWV3Q29uZihtc2csbG9jYWwsbWVyZ2VkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy9tZW1iZXJzaGlwIGNoYW5nZQorICAgICAgICAgICAgICAgIHN1Z2dlc3RlZFZpZXcgPSBuZXcgTWVtYmVyc2hpcChsb2NhbCxBYnNvbHV0ZU9yZGVyLmNvbXAsdHJ1ZSk7CisgICAgICAgICAgICAgICAgc3VnZ2VzdGVkdmlld0lkID0gbXNnLmdldElkKCk7CisgICAgICAgICAgICAgICAgQXJyYXlzLmZpbGwoc3VnZ2VzdGVkVmlldyxtZXJnZWQuZ2V0TWVtYmVycygpKTsKKyAgICAgICAgICAgICAgICBtc2cudmlldyA9IChNZW1iZXJJbXBsW10pbWVyZ2VkLmdldE1lbWJlcnMoKTsKKyAgICAgICAgICAgICAgICBzZW5kRWxlY3Rpb25Nc2dUb05leHRJbmxpbmUobG9jYWwsbXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vbGVhZGVyc2hpcCBjaGFuZ2UKKyAgICAgICAgICAgIHN1Z2dlc3RlZFZpZXcgPSBudWxsOworICAgICAgICAgICAgc3VnZ2VzdGVkdmlld0lkID0gbnVsbDsKKyAgICAgICAgICAgIG1zZy52aWV3ID0gKE1lbWJlckltcGxbXSltZXJnZWQuZ2V0TWVtYmVycygpOworICAgICAgICAgICAgc2VuZEVsZWN0aW9uTXNnVG9OZXh0SW5saW5lKGxvY2FsLG1zZyk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlT3RoZXJUb2tlbihNZW1iZXJJbXBsIGxvY2FsLCBDb29yZGluYXRpb25NZXNzYWdlIG1zZywgTWVtYmVyIHNlbmRlcixNZW1iZXJzaGlwIG1lcmdlZCkgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICBpZiAoIGxvY2FsLmVxdWFscyhtc2cuZ2V0TGVhZGVyKCkpICkgeworICAgICAgICAgICAgLy9JIGFtIHRoZSBuZXcgbGVhZGVyCisgICAgICAgICAgICAvL3N0YXJ0RWxlY3Rpb24oZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXNnLnZpZXcgPSAoTWVtYmVySW1wbFtdKW1lcmdlZC5nZXRNZW1iZXJzKCk7CisgICAgICAgICAgICBzZW5kRWxlY3Rpb25Nc2dUb05leHRJbmxpbmUobG9jYWwsbXNnKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVWaWV3Q29uZihDb29yZGluYXRpb25NZXNzYWdlIG1zZywgTWVtYmVyIHNlbmRlcixNZW1iZXJzaGlwIG1lcmdlZCkgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICBpZiAoIHZpZXdJZCAhPSBudWxsICYmIG1zZy5nZXRJZCgpLmVxdWFscyh2aWV3SWQpICkgcmV0dXJuOy8vd2UgYWxyZWFkeSBoYXZlIHRoaXMgdmlldworICAgICAgICB2aWV3ID0gbmV3IE1lbWJlcnNoaXAoKE1lbWJlckltcGwpZ2V0TG9jYWxNZW1iZXIoZmFsc2UpLEFic29sdXRlT3JkZXIuY29tcCx0cnVlKTsKKyAgICAgICAgQXJyYXlzLmZpbGwodmlldyxtc2cuZ2V0TWVtYmVycygpKTsKKyAgICAgICAgdmlld0lkID0gbXNnLmdldElkKCk7CisgICAgICAgIAorICAgICAgICBpZiAoIHZpZXdJZC5lcXVhbHMoc3VnZ2VzdGVkdmlld0lkKSApIHsKKyAgICAgICAgICAgIHN1Z2dlc3RlZFZpZXcgPSBudWxsOworICAgICAgICAgICAgc3VnZ2VzdGVkdmlld0lkID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHN1Z2dlc3RlZFZpZXcgIT0gbnVsbCAmJiBBYnNvbHV0ZU9yZGVyLmNvbXAuY29tcGFyZShzdWdnZXN0ZWRWaWV3LmdldE1lbWJlcnMoKVswXSxtZXJnZWQuZ2V0TWVtYmVycygpWzBdKTwwICkgeworICAgICAgICAgICAgc3VnZ2VzdGVkVmlldyA9IG51bGw7CisgICAgICAgICAgICBzdWdnZXN0ZWR2aWV3SWQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2aWV3Q2hhbmdlKHZpZXdJZCx2aWV3LmdldE1lbWJlcnMoKSk7CisgICAgICAgIGZpcmVJbnRlcmNlcHRvckV2ZW50KG5ldyBDb29yZGluYXRpb25FdmVudChDb29yZGluYXRpb25FdmVudC5FVlRfQ09ORl9SWCx0aGlzLCJBY2NlcHRlZCBWaWV3IikpOworICAgICAgICAKKyAgICAgICAgaWYgKCBzdWdnZXN0ZWR2aWV3SWQgPT0gbnVsbCAmJiBoYXNIaWdoZXJQcmlvcml0eShtZXJnZWQuZ2V0TWVtYmVycygpLG1lbWJlcnNoaXAuZ2V0TWVtYmVycygpKSApIHsKKyAgICAgICAgICAgIHN0YXJ0RWxlY3Rpb24oZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmlld0NvbmYoQ29vcmRpbmF0aW9uTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5jb250YWlucyhtc2cuZ2V0VHlwZSgpLDAsQ09PUkRfQ09ORiwwLENPT1JEX0NPTkYubGVuZ3RoKTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzSGlnaGVyUHJpb3JpdHkoTWVtYmVyW10gY29tcGxldGUsIE1lbWJlcltdIGxvY2FsKSB7CisgICAgICAgIGlmICggbG9jYWwgPT0gbnVsbCB8fCBsb2NhbC5sZW5ndGggPT0gMCApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCBjb21wbGV0ZSA9PSBudWxsIHx8IGNvbXBsZXRlLmxlbmd0aCA9PSAwICkgcmV0dXJuIHRydWU7CisgICAgICAgIEFic29sdXRlT3JkZXIuYWJzb2x1dGVPcmRlcihjb21wbGV0ZSk7CisgICAgICAgIEFic29sdXRlT3JkZXIuYWJzb2x1dGVPcmRlcihsb2NhbCk7CisgICAgICAgIHJldHVybiAoQWJzb2x1dGVPcmRlci5jb21wLmNvbXBhcmUoY29tcGxldGVbMF0sbG9jYWxbMF0pID4gMCk7CisgICAgICAgIAorICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgY29vcmRpbmF0b3IgaWYgb25lIGlzIGF2YWlsYWJsZQorICAgICAqIEByZXR1cm4gTWVtYmVyCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBnZXRDb29yZGluYXRvcigpIHsKKyAgICAgICAgcmV0dXJuICh2aWV3ICE9IG51bGwgJiYgdmlldy5oYXNNZW1iZXJzKCkpID8gdmlldy5nZXRNZW1iZXJzKClbMF0gOiBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTWVtYmVyW10gZ2V0VmlldygpIHsKKyAgICAgICAgcmV0dXJuICh2aWV3ICE9IG51bGwgJiYgdmlldy5oYXNNZW1iZXJzKCkpID8gdmlldy5nZXRNZW1iZXJzKCkgOiBuZXcgTWVtYmVyWzBdOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVW5pcXVlSWQgZ2V0Vmlld0lkKCkgeworICAgICAgICByZXR1cm4gdmlld0lkOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAqIEJsb2NrIGluL291dCBtZXNzYWdlcyB3aGlsZSBhIGVsZWN0aW9uIGlzIGdvaW5nIG9uCisgICAgKi8KKyAgIHByb3RlY3RlZCB2b2lkIGhhbHQoKSB7CisKKyAgIH0KKworICAgLyoqCisgICAgKiBSZWxlYXNlIGxvY2sgZm9yIGluL291dCBtZXNzYWdlcyBlbGVjdGlvbiBpcyBjb21wbGV0ZWQKKyAgICAqLworICAgcHJvdGVjdGVkIHZvaWQgcmVsZWFzZSgpIHsKKworICAgfQorCisgICAvKioKKyAgICAqIFdhaXQgZm9yIGFuIGVsZWN0aW9uIHRvIGVuZAorICAgICovCisgICBwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yUmVsZWFzZSgpIHsKKworICAgfQorCisgICAgCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgICAKKy8vICAgICAgICAgICAgICBPVkVSUklEREVOIE1FVEhPRFMgRlJPTSBDSEFOTkVMIElOVEVSQ0VQVE9SIEJBU0UgICAgCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGludCBzdmMpIHRocm93cyBDaGFubmVsRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChtZW1iZXJzaGlwID09IG51bGwpIHNldHVwTWVtYmVyc2hpcCgpOworICAgICAgICAgICAgaWYgKHN0YXJ0ZWQpcmV0dXJuOworICAgICAgICAgICAgZmlyZUludGVyY2VwdG9yRXZlbnQobmV3IENvb3JkaW5hdGlvbkV2ZW50KENvb3JkaW5hdGlvbkV2ZW50LkVWVF9TVEFSVCwgdGhpcywgIkJlZm9yZSBzdGFydCIpKTsKKyAgICAgICAgICAgIHN1cGVyLnN0YXJ0KHN0YXJ0c3ZjKTsKKyAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgaWYgKHZpZXcgPT0gbnVsbCkgdmlldyA9IG5ldyBNZW1iZXJzaGlwKCAoTWVtYmVySW1wbClzdXBlci5nZXRMb2NhbE1lbWJlcih0cnVlKSwgQWJzb2x1dGVPcmRlci5jb21wLCB0cnVlKTsKKyAgICAgICAgICAgIGZpcmVJbnRlcmNlcHRvckV2ZW50KG5ldyBDb29yZGluYXRpb25FdmVudChDb29yZGluYXRpb25FdmVudC5FVlRfU1RBUlQsIHRoaXMsICJBZnRlciBzdGFydCIpKTsKKyAgICAgICAgICAgIHN0YXJ0RWxlY3Rpb24oZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3AoaW50IHN2YykgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaGFsdCgpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChlbGVjdGlvbk11dGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKCFzdGFydGVkKXJldHVybjsKKyAgICAgICAgICAgICAgICBzdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZmlyZUludGVyY2VwdG9yRXZlbnQobmV3IENvb3JkaW5hdGlvbkV2ZW50KENvb3JkaW5hdGlvbkV2ZW50LkVWVF9TVE9QLCB0aGlzLCAiQmVmb3JlIHN0b3AiKSk7CisgICAgICAgICAgICAgICAgc3VwZXIuc3RvcChzdGFydHN2Yyk7CisgICAgICAgICAgICAgICAgdGhpcy52aWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aGlzLnZpZXdJZCA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhpcy5zdWdnZXN0ZWRWaWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aGlzLnN1Z2dlc3RlZHZpZXdJZCA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhpcy5tZW1iZXJzaGlwLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgZmlyZUludGVyY2VwdG9yRXZlbnQobmV3IENvb3JkaW5hdGlvbkV2ZW50KENvb3JkaW5hdGlvbkV2ZW50LkVWVF9TVE9QLCB0aGlzLCAiQWZ0ZXIgc3RvcCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfWZpbmFsbHkgeworICAgICAgICAgICAgcmVsZWFzZSgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKE1lbWJlcltdIGRlc3RpbmF0aW9uLCBDaGFubmVsTWVzc2FnZSBtc2csIEludGVyY2VwdG9yUGF5bG9hZCBwYXlsb2FkKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIHdhaXRGb3JSZWxlYXNlKCk7CisgICAgICAgIHN1cGVyLnNlbmRNZXNzYWdlKGRlc3RpbmF0aW9uLCBtc2csIHBheWxvYWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZWNlaXZlZChDaGFubmVsTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgaWYgKCBBcnJheXMuY29udGFpbnMobXNnLmdldE1lc3NhZ2UoKS5nZXRCeXRlc0RpcmVjdCgpLDAsQ09PUkRfQUxJVkUsMCxDT09SRF9BTElWRS5sZW5ndGgpICkgeworICAgICAgICAgICAgLy9pZ25vcmUgbWVzc2FnZSwgaXRzIGFuIGFsaXZlIG1lc3NhZ2UKKyAgICAgICAgICAgIGZpcmVJbnRlcmNlcHRvckV2ZW50KG5ldyBDb29yZGluYXRpb25FdmVudChDb29yZGluYXRpb25FdmVudC5FVlRfTVNHX0FSUklWRSx0aGlzLCJBbGl2ZSBNZXNzYWdlIikpOworCisgICAgICAgIH0gZWxzZSBpZiAoIEFycmF5cy5jb250YWlucyhtc2cuZ2V0TWVzc2FnZSgpLmdldEJ5dGVzRGlyZWN0KCksMCxDT09SRF9IRUFERVIsMCxDT09SRF9IRUFERVIubGVuZ3RoKSApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ29vcmRpbmF0aW9uTWVzc2FnZSBjbXNnID0gbmV3IENvb3JkaW5hdGlvbk1lc3NhZ2UobXNnLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgTWVtYmVyW10gY21iciA9IGNtc2cuZ2V0TWVtYmVycygpOworICAgICAgICAgICAgICAgIGZpcmVJbnRlcmNlcHRvckV2ZW50KG5ldyBDb29yZGluYXRpb25FdmVudChDb29yZGluYXRpb25FdmVudC5FVlRfTVNHX0FSUklWRSx0aGlzLCJDb29yZCBNc2cgQXJyaXZlZCgiK0FycmF5cy50b05hbWVTdHJpbmcoY21icikrIikiKSk7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0Nvb3JkTWVzc2FnZShjbXNnLCBtc2cuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgICAgIH1jYXRjaCAoIENoYW5uZWxFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHByb2Nlc3NpbmcgY29vcmRpbmF0aW9uIG1lc3NhZ2UuIENvdWxkIGJlIGZhdGFsLiIseCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5tZXNzYWdlUmVjZWl2ZWQobXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChDaGFubmVsTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmFjY2VwdChtc2cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lbWJlckFkZGVkKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgbWVtYmVyQWRkZWQobWVtYmVyLHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lbWJlckFkZGVkKE1lbWJlciBtZW1iZXIsYm9vbGVhbiBlbGVjdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCBtZW1iZXJzaGlwID09IG51bGwgKSBzZXR1cE1lbWJlcnNoaXAoKTsKKyAgICAgICAgICAgIGlmICggbWVtYmVyc2hpcC5tZW1iZXJBbGl2ZSgoTWVtYmVySW1wbCltZW1iZXIpICkgc3VwZXIubWVtYmVyQWRkZWQobWVtYmVyKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmlyZUludGVyY2VwdG9yRXZlbnQobmV3IENvb3JkaW5hdGlvbkV2ZW50KENvb3JkaW5hdGlvbkV2ZW50LkVWVF9NQlJfQURELHRoaXMsIk1lbWJlciBhZGQoIittZW1iZXIuZ2V0TmFtZSgpKyIpIikpOworICAgICAgICAgICAgICAgIGlmIChzdGFydGVkICYmIGVsZWN0KSBzdGFydEVsZWN0aW9uKGZhbHNlKTsKKyAgICAgICAgICAgIH1jYXRjaCAoIENoYW5uZWxFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzdGFydCBlbGVjdGlvbiB3aGVuIG1lbWJlciB3YXMgYWRkZWQuIix4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfWZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbWVtYmVyc2hpcC5yZW1vdmVNZW1iZXIoKE1lbWJlckltcGwpbWVtYmVyKTsKKyAgICAgICAgICAgIHN1cGVyLm1lbWJlckRpc2FwcGVhcmVkKG1lbWJlcik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpcmVJbnRlcmNlcHRvckV2ZW50KG5ldyBDb29yZGluYXRpb25FdmVudChDb29yZGluYXRpb25FdmVudC5FVlRfTUJSX0RFTCx0aGlzLCJNZW1iZXIgcmVtb3ZlKCIrbWVtYmVyLmdldE5hbWUoKSsiKSIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIHN0YXJ0ZWQgJiYgKGlzQ29vcmRpbmF0b3IoKSB8fCBpc0hpZ2hlc3QoKSkgKSAKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRFbGVjdGlvbih0cnVlKTsgLy90byBkbywgaWYgYSBtZW1iZXIgZGlzYXBwZWFycywgb25seSB0aGUgY29vcmRpbmF0b3IgY2FuIHN0YXJ0CisgICAgICAgICAgICB9Y2F0Y2ggKCBDaGFubmVsRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gc3RhcnQgZWxlY3Rpb24gd2hlbiBtZW1iZXIgd2FzIHJlbW92ZWQuIix4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfWZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzSGlnaGVzdCgpIHsKKyAgICAgICAgTWVtYmVyIGxvY2FsID0gZ2V0TG9jYWxNZW1iZXIoZmFsc2UpOworICAgICAgICBpZiAoIG1lbWJlcnNoaXAuZ2V0TWVtYmVycygpLmxlbmd0aCA9PSAwICkgcmV0dXJuIHRydWU7CisgICAgICAgIGVsc2UgcmV0dXJuIEFic29sdXRlT3JkZXIuY29tcC5jb21wYXJlKGxvY2FsLG1lbWJlcnNoaXAuZ2V0TWVtYmVycygpWzBdKTw9MDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNDb29yZGluYXRvcigpIHsKKyAgICAgICAgTWVtYmVyIGNvb3JkID0gZ2V0Q29vcmRpbmF0b3IoKTsKKyAgICAgICAgcmV0dXJuIGNvb3JkICE9IG51bGwgJiYgZ2V0TG9jYWxNZW1iZXIoZmFsc2UpLmVxdWFscyhjb29yZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGVhcnRiZWF0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWVtYmVySW1wbCBsb2NhbCA9IChNZW1iZXJJbXBsKWdldExvY2FsTWVtYmVyKGZhbHNlKTsKKyAgICAgICAgICAgIGlmICggdmlldyAhPSBudWxsICYmIChBcnJheXMuZGlmZih2aWV3LG1lbWJlcnNoaXAsbG9jYWwpLmxlbmd0aCAhPSAwIHx8ICBBcnJheXMuZGlmZihtZW1iZXJzaGlwLHZpZXcsbG9jYWwpLmxlbmd0aCAhPSAwKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGlzSGlnaGVzdCgpICkgeworICAgICAgICAgICAgICAgICAgICBmaXJlSW50ZXJjZXB0b3JFdmVudChuZXcgQ29vcmRpbmF0aW9uRXZlbnQoQ29vcmRpbmF0aW9uRXZlbnQuRVZUX1NUQVJUX0VMRUNULCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYXJ0YmVhdCBmb3VuZCBpbmNvbnNpc3RlbmN5LCByZXN0YXJ0IGVsZWN0aW9uIikpOworICAgICAgICAgICAgICAgICAgICBzdGFydEVsZWN0aW9uKHRydWUpOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4ICApeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gcGVyZm9ybSBoZWFydGJlYXQuIix4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmhlYXJ0YmVhdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFzIG1lbWJlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZW1iZXJzKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIG1lbWJlcnNoaXAuaGFzTWVtYmVycygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbGwgY3VycmVudCBjbHVzdGVyIG1lbWJlcnMKKyAgICAgKiBAcmV0dXJuIGFsbCBtZW1iZXJzIG9yIGVtcHR5IGFycmF5CisgICAgICovCisgICAgcHVibGljIE1lbWJlcltdIGdldE1lbWJlcnMoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gbWVtYmVyc2hpcC5nZXRNZW1iZXJzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWJyIE1lbWJlcgorICAgICAqIEByZXR1cm4gTWVtYmVyCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBnZXRNZW1iZXIoTWVtYmVyIG1icikgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIG1lbWJlcnNoaXAuZ2V0TWVtYmVyKG1icik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtZW1iZXIgdGhhdCByZXByZXNlbnRzIHRoaXMgbm9kZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTWVtYmVyCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBnZXRMb2NhbE1lbWJlcihib29sZWFuIGluY0FsaXZlKSB7CisgICAgICAgIE1lbWJlciBsb2NhbCA9IHN1cGVyLmdldExvY2FsTWVtYmVyKGluY0FsaXZlKTsKKyAgICAgICAgaWYgKCB2aWV3ID09IG51bGwgJiYgKGxvY2FsICE9IG51bGwpKSBzZXR1cE1lbWJlcnNoaXAoKTsKKyAgICAgICAgcmV0dXJuIGxvY2FsOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2V0dXBNZW1iZXJzaGlwKCkgeworICAgICAgICBpZiAoIG1lbWJlcnNoaXAgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIG1lbWJlcnNoaXAgID0gbmV3IE1lbWJlcnNoaXAoKE1lbWJlckltcGwpc3VwZXIuZ2V0TG9jYWxNZW1iZXIodHJ1ZSksQWJzb2x1dGVPcmRlci5jb21wLGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAgIAorLy8gICAgICAgICAgICAgIEhFTFBFUiBDTEFTU0VTIEZPUiBDT09SRElOQVRJT04KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgCisgICAgCisgICAKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvb3JkaW5hdGlvbk1lc3NhZ2UgeworICAgICAgICAvL1h7QS1sZHIsIEEtc3JjLCBtYnJzLUEsQixDLER9CisgICAgICAgIHByb3RlY3RlZCBYQnl0ZUJ1ZmZlciBidWY7CisgICAgICAgIHByb3RlY3RlZCBNZW1iZXJJbXBsIGxlYWRlcjsKKyAgICAgICAgcHJvdGVjdGVkIE1lbWJlckltcGwgc291cmNlOworICAgICAgICBwcm90ZWN0ZWQgTWVtYmVySW1wbFtdIHZpZXc7CisgICAgICAgIHByb3RlY3RlZCBVbmlxdWVJZCBpZDsKKyAgICAgICAgcHJvdGVjdGVkIGJ5dGVbXSB0eXBlOworICAgICAgICBwcm90ZWN0ZWQgbG9uZyB0aW1lc3RhbXAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBDb29yZGluYXRpb25NZXNzYWdlKFhCeXRlQnVmZmVyIGJ1ZikgeworICAgICAgICAgICAgdGhpcy5idWYgPSBidWY7CisgICAgICAgICAgICBwYXJzZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvb3JkaW5hdGlvbk1lc3NhZ2UoTWVtYmVySW1wbCBsZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlckltcGwgc291cmNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVySW1wbFtdIHZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXF1ZUlkIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gdHlwZSkgeworICAgICAgICAgICAgdGhpcy5idWYgPSBuZXcgWEJ5dGVCdWZmZXIoNDA5NixmYWxzZSk7CisgICAgICAgICAgICB0aGlzLmxlYWRlciA9IGxlYWRlcjsKKyAgICAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOworICAgICAgICAgICAgdGhpcy52aWV3ID0gdmlldzsKKyAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0aGlzLndyaXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgCisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRIZWFkZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gTm9uQmxvY2tpbmdDb29yZGluYXRvci5DT09SRF9IRUFERVI7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBNZW1iZXJJbXBsIGdldExlYWRlcigpIHsKKyAgICAgICAgICAgIGlmICggbGVhZGVyID09IG51bGwgKSBwYXJzZSgpOworICAgICAgICAgICAgcmV0dXJuIGxlYWRlcjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIE1lbWJlckltcGwgZ2V0U291cmNlKCkgeworICAgICAgICAgICAgaWYgKCBzb3VyY2UgPT0gbnVsbCApIHBhcnNlKCk7CisgICAgICAgICAgICByZXR1cm4gc291cmNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgVW5pcXVlSWQgZ2V0SWQoKSB7CisgICAgICAgICAgICBpZiAoIGlkID09IG51bGwgKSBwYXJzZSgpOworICAgICAgICAgICAgcmV0dXJuIGlkOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgTWVtYmVySW1wbFtdIGdldE1lbWJlcnMoKSB7CisgICAgICAgICAgICBpZiAoIHZpZXcgPT0gbnVsbCApIHBhcnNlKCk7CisgICAgICAgICAgICByZXR1cm4gdmlldzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRUeXBlKCkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCApIHBhcnNlKCk7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFhCeXRlQnVmZmVyIGdldEJ1ZmZlcigpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1ZjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgcGFyc2UoKSB7CisgICAgICAgICAgICAvL2hlYWRlcgorICAgICAgICAgICAgaW50IG9mZnNldCA9IDE2OworICAgICAgICAgICAgLy9sZWFkZXIKKyAgICAgICAgICAgIGludCBsZHJMZW4gPSBidWYudG9JbnQoYnVmLmdldEJ5dGVzRGlyZWN0KCksb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSA0OworICAgICAgICAgICAgYnl0ZVtdIGxkciA9IG5ldyBieXRlW2xkckxlbl07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1Zi5nZXRCeXRlc0RpcmVjdCgpLG9mZnNldCxsZHIsMCxsZHJMZW4pOworICAgICAgICAgICAgbGVhZGVyID0gTWVtYmVySW1wbC5nZXRNZW1iZXIobGRyKTsKKyAgICAgICAgICAgIG9mZnNldCArPSBsZHJMZW47CisgICAgICAgICAgICAvL3NvdXJjZQorICAgICAgICAgICAgaW50IHNyY0xlbiA9IGJ1Zi50b0ludChidWYuZ2V0Qnl0ZXNEaXJlY3QoKSxvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgICAgICAgICBieXRlW10gc3JjID0gbmV3IGJ5dGVbc3JjTGVuXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLmdldEJ5dGVzRGlyZWN0KCksb2Zmc2V0LHNyYywwLHNyY0xlbik7CisgICAgICAgICAgICBzb3VyY2UgPSBNZW1iZXJJbXBsLmdldE1lbWJlcihzcmMpOworICAgICAgICAgICAgb2Zmc2V0ICs9IHNyY0xlbjsKKyAgICAgICAgICAgIC8vdmlldworICAgICAgICAgICAgaW50IG1ickNvdW50ID0gYnVmLnRvSW50KGJ1Zi5nZXRCeXRlc0RpcmVjdCgpLG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgICAgIHZpZXcgPSBuZXcgTWVtYmVySW1wbFttYnJDb3VudF07CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dmlldy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpbnQgbWJyTGVuID0gYnVmLnRvSW50KGJ1Zi5nZXRCeXRlc0RpcmVjdCgpLG9mZnNldCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgICAgICAgICAgICAgYnl0ZVtdIG1iciA9IG5ldyBieXRlW21ickxlbl07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYuZ2V0Qnl0ZXNEaXJlY3QoKSwgb2Zmc2V0LCBtYnIsIDAsIG1ickxlbik7CisgICAgICAgICAgICAgICAgdmlld1tpXSA9IE1lbWJlckltcGwuZ2V0TWVtYmVyKG1icik7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG1ickxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vaWQKKyAgICAgICAgICAgIHRoaXMuaWQgPSBuZXcgVW5pcXVlSWQoYnVmLmdldEJ5dGVzRGlyZWN0KCksb2Zmc2V0LDE2KTsKKyAgICAgICAgICAgIG9mZnNldCArPSAxNjsKKyAgICAgICAgICAgIHR5cGUgPSBuZXcgYnl0ZVsxNl07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1Zi5nZXRCeXRlc0RpcmVjdCgpLCBvZmZzZXQsIHR5cGUsIDAsIHR5cGUubGVuZ3RoKTsKKyAgICAgICAgICAgIG9mZnNldCArPSAxNjsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZSgpIHsKKyAgICAgICAgICAgIGJ1Zi5yZXNldCgpOworICAgICAgICAgICAgLy9oZWFkZXIKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoQ09PUkRfSEVBREVSLDAsQ09PUkRfSEVBREVSLmxlbmd0aCk7CisgICAgICAgICAgICAvL2xlYWRlcgorICAgICAgICAgICAgYnl0ZVtdIGxkciA9IGxlYWRlci5nZXREYXRhKGZhbHNlLGZhbHNlKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQobGRyLmxlbmd0aCk7CisgICAgICAgICAgICBidWYuYXBwZW5kKGxkciwwLGxkci5sZW5ndGgpOworICAgICAgICAgICAgbGRyID0gbnVsbDsKKyAgICAgICAgICAgIC8vc291cmNlCisgICAgICAgICAgICBieXRlW10gc3JjID0gc291cmNlLmdldERhdGEoZmFsc2UsZmFsc2UpOworICAgICAgICAgICAgYnVmLmFwcGVuZChzcmMubGVuZ3RoKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoc3JjLDAsc3JjLmxlbmd0aCk7CisgICAgICAgICAgICBzcmMgPSBudWxsOworICAgICAgICAgICAgLy92aWV3CisgICAgICAgICAgICBidWYuYXBwZW5kKHZpZXcubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTx2aWV3Lmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBtYnIgPSB2aWV3W2ldLmdldERhdGEoZmFsc2UsZmFsc2UpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobWJyLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChtYnIsMCxtYnIubGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vaWQKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoaWQuZ2V0Qnl0ZXMoKSwwLGlkLmdldEJ5dGVzKCkubGVuZ3RoKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQodHlwZSwwLHR5cGUubGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBmaXJlSW50ZXJjZXB0b3JFdmVudChJbnRlcmNlcHRvckV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIENvb3JkaW5hdGlvbkV2ZW50ICYmCisgICAgICAgICAgICAoKENvb3JkaW5hdGlvbkV2ZW50KWV2ZW50KS50eXBlID09IENvb3JkaW5hdGlvbkV2ZW50LkVWVF9DT05GX1JYKSAKKyAgICAgICAgICAgIGxvZy5pbmZvKGV2ZW50KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb29yZGluYXRpb25FdmVudCBpbXBsZW1lbnRzIEludGVyY2VwdG9yRXZlbnQgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfU1RBUlQgPSAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfTUJSX0FERCA9IDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9NQlJfREVMID0gMzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX1NUQVJUX0VMRUNUID0gNDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX1BST0NFU1NfRUxFQ1QgPSA1OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfTVNHX0FSUklWRSA9IDY7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9QUkVfTUVSR0UgPSA3OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfUE9TVF9NRVJHRSA9IDg7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9XQUlUX0ZPUl9NU0cgPSA5OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfU0VORF9NU0cgPSAxMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX1NUT1AgPSAxMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX0NPTkZfUlggPSAxMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX0VMRUNUX0FCQU5ET05FRCA9IDEzOworICAgICAgICAKKyAgICAgICAgaW50IHR5cGU7CisgICAgICAgIENoYW5uZWxJbnRlcmNlcHRvciBpbnRlcmNlcHRvcjsKKyAgICAgICAgTWVtYmVyIGNvb3JkOyAKKyAgICAgICAgTWVtYmVyW10gbWJyczsKKyAgICAgICAgU3RyaW5nIGluZm87CisgICAgICAgIE1lbWJlcnNoaXAgdmlldzsKKyAgICAgICAgTWVtYmVyc2hpcCBzdWdnZXN0ZWRWaWV3OworICAgICAgICBwdWJsaWMgQ29vcmRpbmF0aW9uRXZlbnQoaW50IHR5cGUsQ2hhbm5lbEludGVyY2VwdG9yIGludGVyY2VwdG9yLCBTdHJpbmcgaW5mbykgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0b3IgPSBpbnRlcmNlcHRvcjsKKyAgICAgICAgICAgIHRoaXMuY29vcmQgPSAoKE5vbkJsb2NraW5nQ29vcmRpbmF0b3IpaW50ZXJjZXB0b3IpLmdldENvb3JkaW5hdG9yKCk7CisgICAgICAgICAgICB0aGlzLm1icnMgPSAoKE5vbkJsb2NraW5nQ29vcmRpbmF0b3IpaW50ZXJjZXB0b3IpLm1lbWJlcnNoaXAuZ2V0TWVtYmVycygpOworICAgICAgICAgICAgdGhpcy5pbmZvID0gaW5mbzsKKyAgICAgICAgICAgIHRoaXMudmlldyA9ICgoTm9uQmxvY2tpbmdDb29yZGluYXRvcilpbnRlcmNlcHRvcikudmlldzsKKyAgICAgICAgICAgIHRoaXMuc3VnZ2VzdGVkVmlldyA9ICgoTm9uQmxvY2tpbmdDb29yZGluYXRvcilpbnRlcmNlcHRvcikuc3VnZ2VzdGVkVmlldzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGludCBnZXRFdmVudFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRFdmVudFR5cGVEZXNjKCkgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAgRVZUX1NUQVJUOiByZXR1cm4gIkVWVF9TVEFSVDoiK2luZm87CisgICAgICAgICAgICAgICAgY2FzZSAgRVZUX01CUl9BREQ6IHJldHVybiAiRVZUX01CUl9BREQ6IitpbmZvOworICAgICAgICAgICAgICAgIGNhc2UgIEVWVF9NQlJfREVMOiByZXR1cm4gIkVWVF9NQlJfREVMOiIraW5mbzsKKyAgICAgICAgICAgICAgICBjYXNlICBFVlRfU1RBUlRfRUxFQ1Q6IHJldHVybiAiRVZUX1NUQVJUX0VMRUNUOiIraW5mbzsKKyAgICAgICAgICAgICAgICBjYXNlICBFVlRfUFJPQ0VTU19FTEVDVDogcmV0dXJuICJFVlRfUFJPQ0VTU19FTEVDVDoiK2luZm87CisgICAgICAgICAgICAgICAgY2FzZSAgRVZUX01TR19BUlJJVkU6IHJldHVybiAiRVZUX01TR19BUlJJVkU6IitpbmZvOworICAgICAgICAgICAgICAgIGNhc2UgIEVWVF9QUkVfTUVSR0U6IHJldHVybiAiRVZUX1BSRV9NRVJHRToiK2luZm87CisgICAgICAgICAgICAgICAgY2FzZSAgRVZUX1BPU1RfTUVSR0U6IHJldHVybiAiRVZUX1BPU1RfTUVSR0U6IitpbmZvOworICAgICAgICAgICAgICAgIGNhc2UgIEVWVF9XQUlUX0ZPUl9NU0c6IHJldHVybiAiRVZUX1dBSVRfRk9SX01TRzoiK2luZm87CisgICAgICAgICAgICAgICAgY2FzZSAgRVZUX1NFTkRfTVNHOiByZXR1cm4gIkVWVF9TRU5EX01TRzoiK2luZm87CisgICAgICAgICAgICAgICAgY2FzZSAgRVZUX1NUT1A6IHJldHVybiAiRVZUX1NUT1A6IitpbmZvOworICAgICAgICAgICAgICAgIGNhc2UgIEVWVF9DT05GX1JYOiByZXR1cm4gIkVWVF9DT05GX1JYOiIraW5mbzsKKyAgICAgICAgICAgICAgICBjYXNlIEVWVF9FTEVDVF9BQkFORE9ORUQ6IHJldHVybiAiRVZUX0VMRUNUX0FCQU5ET05FRDoiK2luZm87CisgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuICJVbmtub3duIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIENoYW5uZWxJbnRlcmNlcHRvciBnZXRJbnRlcmNlcHRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnRlcmNlcHRvcjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJDb29yZGluYXRpb25FdmVudFt0eXBlPSIpOworICAgICAgICAgICAgYnVmLmFwcGVuZCh0eXBlKS5hcHBlbmQoIlxuXHRMb2NhbDoiKTsKKyAgICAgICAgICAgIE1lbWJlciBsb2NhbCA9IGludGVyY2VwdG9yLmdldExvY2FsTWVtYmVyKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQobG9jYWwhPW51bGw/bG9jYWwuZ2V0TmFtZSgpOiIiKS5hcHBlbmQoIlxuXHRDb29yZDoiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY29vcmQhPW51bGw/Y29vcmQuZ2V0TmFtZSgpOiIiKS5hcHBlbmQoIlxuXHRWaWV3OiIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChBcnJheXMudG9OYW1lU3RyaW5nKHZpZXchPW51bGw/dmlldy5nZXRNZW1iZXJzKCk6bnVsbCkpLmFwcGVuZCgiXG5cdFN1Z2dlc3RlZCBWaWV3OiIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChBcnJheXMudG9OYW1lU3RyaW5nKHN1Z2dlc3RlZFZpZXchPW51bGw/c3VnZ2VzdGVkVmlldy5nZXRNZW1iZXJzKCk6bnVsbCkpLmFwcGVuZCgiXG5cdE1lbWJlcnM6Iik7CisgICAgICAgICAgICBidWYuYXBwZW5kKEFycmF5cy50b05hbWVTdHJpbmcobWJycykpLmFwcGVuZCgiXG5cdEluZm86Iik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGluZm8pLmFwcGVuZCgiXSIpOworICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgCisKKworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL2ludGVyY2VwdG9ycy9PcmRlckludGVyY2VwdG9yLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvaW50ZXJjZXB0b3JzL09yZGVySW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjY2MjZmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL2ludGVyY2VwdG9ycy9PcmRlckludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkNoYW5uZWxJbnRlcmNlcHRvckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuSW50ZXJjZXB0b3JQYXlsb2FkOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLlhCeXRlQnVmZmVyOworCisKKworLyoqCisgKgorICogVGhlIG9yZGVyIGludGVyY2VwdG9yIGd1YXJhbnRlZXMgdGhhdCBtZXNzYWdlcyBhcmUgcmVjZWl2ZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhleSB3ZXJlIAorICogc2VudC4KKyAqIFRoaXMgaW50ZXJjZXB0b3Igd29ya3MgYmVzdCB3aXRoIHRoZSBhY2s9dHJ1ZSBzZXR0aW5nLiA8YnI+CisgKiBUaGVyZSBpcyBubyBwb2ludCBpbiAKKyAqIHVzaW5nIHRoaXMgd2l0aCB0aGUgcmVwbGljYXRpb25Nb2RlPSJmYXN0YXN5bmNocXVldWUiIGFzIHRoaXMgbW9kZSBndWFyYW50ZWVzIG9yZGVyaW5nLjxCUj4KKyAqIElmIHlvdSBhcmUgdXNpbmcgdGhlIG1vZGUgYWNrPWZhbHNlIHJlcGxpY2F0aW9uTW9kZT1wb29sZWQsIGFuZCBoYXZlIGEgbG90IG9mIGNvbmN1cnJlbnQgdGhyZWFkcywKKyAqIHRoaXMgaW50ZXJjZXB0b3IgY2FuIHJlYWxseSBzbG93IHlvdSBkb3duLCBhcyBtYW55IG1lc3NhZ2VzIHdpbGwgYmUgY29tcGxldGVseSBvdXQgb2Ygb3JkZXIKKyAqIGFuZCB0aGUgcXVldWUgbWlnaHQgYmVjb21lIHJhdGhlciBsYXJnZS4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlbiB5b3UgbWlnaHQgd2FudCB0byBzZXQgCisgKiB0aGUgdmFsdWUgT3JkZXJJbnRlcmNlcHRvci5tYXhRdWV1ZSA9IDI1IChtZWFuaW5nIHRoYXQgd2Ugd2lsbCBuZXZlciBrZWVwIG1vcmUgdGhhbiAyNSBtZXNzYWdlcyBpbiBvdXIgcXVldWUpCisgKiA8YnI+PGI+Q29uZmlndXJhdGlvbiBPcHRpb25zPC9iPjxicj4KKyAqIE9yZGVySW50ZWNlcHRvci5leHBpcmU9PG1pbGxpc2Vjb25kcz4gLSBpZiBhIG1lc3NhZ2UgYXJyaXZlcyBvdXQgb2Ygb3JkZXIsIGhvdyBsb25nIGJlZm9yZSB3ZSBhY3Qgb24gaXQgPGI+ZGVmYXVsdD0zMDAwbXM8L2I+PGJyPgorICogT3JkZXJJbnRlY2VwdG9yLm1heFF1ZXVlPTxtYXggcXVldWUgc2l6ZT4gLSBob3cgbXVjaCBjYW4gdGhlIHF1ZXVlIGdyb3cgdG8gZW5zdXJlIG9yZGVyaW5nLiAKKyAqICAgVGhpcyBzZXR0aW5nIGlzIHVzZWZ1bCB0byBhdm9pZCBPdXRPZk1lbW9yeUVycm9yczxiPmRlZmF1bHQ9SW50ZWdlci5NQVhfVkFMVUU8L2I+PGJyPgorICogT3JkZXJJbnRlcmNlcHRvci5mb3J3YXJkRXhwaXJlZD08Ym9vbGVhbj4gLSB0aGlzIGZsYWcgdGVsbHMgdGhlIGludGVyY2VwdG9yIHdoYXQgdG8gCisgKiBkbyB3aGVuIGEgbWVzc2FnZSBoYXMgZXhwaXJlZCBvciB0aGUgcXVldWUgaGFzIGdyb3duIGxhcmdlciB0aGFuIHRoZSBtYXhRdWV1ZSB2YWx1ZS4KKyAqIHRydWUgbWVhbnMgdGhhdCB0aGUgbWVzc2FnZSBpcyBzZW50IHVwIHRoZSBzdGFjayB0byB0aGUgcmVjZWl2ZXIgdGhhdCB3aWxsIHJlY2VpdmUgYW5kIG91dCBvZiBvcmRlciBtZXNzYWdlCisgKiBmYWxzZSBtZWFucywgZm9yZ2V0IHRoZSBtZXNzYWdlIGFuZCByZXNldCB0aGUgbWVzc2FnZSBjb3VudGVyLiA8Yj5kZWZhdWx0PXRydWU8L2I+CisgKiAKKyAqIAorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBPcmRlckludGVyY2VwdG9yIGV4dGVuZHMgQ2hhbm5lbEludGVyY2VwdG9yQmFzZSB7CisgICAgcHJpdmF0ZSBIYXNoTWFwIG91dGNvdW50ZXIgPSBuZXcgSGFzaE1hcCgpOworICAgIHByaXZhdGUgSGFzaE1hcCBpbmNvdW50ZXIgPSBuZXcgSGFzaE1hcCgpOworICAgIHByaXZhdGUgSGFzaE1hcCBpbmNvbWluZyA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBsb25nIGV4cGlyZSA9IDMwMDA7CisgICAgcHJpdmF0ZSBib29sZWFuIGZvcndhcmRFeHBpcmVkID0gdHJ1ZTsKKyAgICBwcml2YXRlIGludCBtYXhRdWV1ZSA9IEludGVnZXIuTUFYX1ZBTFVFOworCisgICAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoTWVtYmVyW10gZGVzdGluYXRpb24sIENoYW5uZWxNZXNzYWdlIG1zZywgSW50ZXJjZXB0b3JQYXlsb2FkIHBheWxvYWQpIHRocm93cyBDaGFubmVsRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yICggaW50IGk9MDsgaTxkZXN0aW5hdGlvbi5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgIGludCBuciA9IGluY0NvdW50ZXIoZGVzdGluYXRpb25baV0pOworICAgICAgICAgICAgLy9yZWR1Y2UgYnl0ZSBjb3B5CisgICAgICAgICAgICBtc2cuZ2V0TWVzc2FnZSgpLmFwcGVuZChucik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGdldE5leHQoKS5zZW5kTWVzc2FnZShuZXcgTWVtYmVyW10ge2Rlc3RpbmF0aW9uW2ldfSwgbXNnLCBwYXlsb2FkKTsKKyAgICAgICAgICAgIH1maW5hbGx5IHsKKyAgICAgICAgICAgICAgICBtc2cuZ2V0TWVzc2FnZSgpLnRyaW0oNCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoQ2hhbm5lbE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIGludCBtc2duciA9IFhCeXRlQnVmZmVyLnRvSW50KG1zZy5nZXRNZXNzYWdlKCkuZ2V0Qnl0ZXNEaXJlY3QoKSxtc2cuZ2V0TWVzc2FnZSgpLmdldExlbmd0aCgpLTQpOworICAgICAgICBtc2cuZ2V0TWVzc2FnZSgpLnRyaW0oNCk7CisgICAgICAgIE1lc3NhZ2VPcmRlciBvcmRlciA9IG5ldyBNZXNzYWdlT3JkZXIobXNnbnIsKENoYW5uZWxNZXNzYWdlKW1zZy5kZWVwY2xvbmUoKSk7CisgICAgICAgIGlmICggcHJvY2Vzc0luY29taW5nKG9yZGVyKSApIHByb2Nlc3NMZWZ0T3ZlcnMobXNnLmdldEFkZHJlc3MoKSxmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwcm9jZXNzTGVmdE92ZXJzKE1lbWJlciBtZW1iZXIsIGJvb2xlYW4gZm9yY2UpIHsKKyAgICAgICAgTWVzc2FnZU9yZGVyIHRtcCA9IChNZXNzYWdlT3JkZXIpaW5jb21pbmcuZ2V0KG1lbWJlcik7CisgICAgICAgIGlmICggZm9yY2UgKSB7CisgICAgICAgICAgICBDb3VudGVyIGNudCA9IGdldEluQ291bnRlcihtZW1iZXIpOworICAgICAgICAgICAgY250LnNldENvdW50ZXIoSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICB9CisgICAgICAgIGlmICggdG1wIT0gbnVsbCApIHByb2Nlc3NJbmNvbWluZyh0bXApOworICAgIH0KKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3JkZXIgTWVzc2FnZU9yZGVyCisgICAgICogQHJldHVybiBib29sZWFuIC0gdHJ1ZSBpZiBhIG1lc3NhZ2UgZXhwaXJlZCBhbmQgd2FzIHByb2Nlc3NlZAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBwcm9jZXNzSW5jb21pbmcoTWVzc2FnZU9yZGVyIG9yZGVyKSB7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIE1lbWJlciBtZW1iZXIgPSBvcmRlci5nZXRNZXNzYWdlKCkuZ2V0QWRkcmVzcygpOworICAgICAgICBDb3VudGVyIGNudCA9IGdldEluQ291bnRlcihtZW1iZXIpOworICAgICAgICAKKyAgICAgICAgTWVzc2FnZU9yZGVyIHRtcCA9IChNZXNzYWdlT3JkZXIpaW5jb21pbmcuZ2V0KG1lbWJlcik7CisgICAgICAgIGlmICggdG1wICE9IG51bGwgKSB7CisgICAgICAgICAgICBvcmRlciA9IE1lc3NhZ2VPcmRlci5hZGQodG1wLG9yZGVyKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHdoaWxlICggKG9yZGVyIT1udWxsKSAmJiAob3JkZXIuZ2V0TXNnTnIoKSA8PSBjbnQuZ2V0Q291bnRlcigpKSAgKSB7CisgICAgICAgICAgICAvL3dlIGFyZSByaWdodCBvbiB0YXJnZXQuIHByb2Nlc3Mgb3JkZXJzCisgICAgICAgICAgICBpZiAoIG9yZGVyLmdldE1zZ05yKCkgPT0gY250LmdldENvdW50ZXIoKSApIGNudC5pbmMoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBvcmRlci5nZXRNc2dOcigpID4gY250LmdldENvdW50ZXIoKSApIGNudC5zZXRDb3VudGVyKG9yZGVyLmdldE1zZ05yKCkpOworICAgICAgICAgICAgc3VwZXIubWVzc2FnZVJlY2VpdmVkKG9yZGVyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBvcmRlci5zZXRNZXNzYWdlKG51bGwpOworICAgICAgICAgICAgb3JkZXIgPSBvcmRlci5uZXh0OworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VPcmRlciBoZWFkID0gb3JkZXI7CisgICAgICAgIE1lc3NhZ2VPcmRlciBwcmV2ID0gbnVsbDsKKyAgICAgICAgdG1wID0gb3JkZXI7CisgICAgICAgIC8vZmxhZyB0byBlbXB0eSBvdXQgdGhlIHF1ZXVlIHdoZW4gaXQgbGFyZ2VyIHRoYW4gbWF4UXVldWUKKyAgICAgICAgYm9vbGVhbiBlbXB0eSA9IG9yZGVyIT1udWxsP29yZGVyLmdldENvdW50KCk+PW1heFF1ZXVlOmZhbHNlOworICAgICAgICB3aGlsZSAoIHRtcCAhPSBudWxsICkgeworICAgICAgICAgICAgLy9wcm9jZXNzIGV4cGlyZWQgbWVzc2FnZXMgb3IgZW1wdHkgb3V0IHRoZSBxdWV1ZQorICAgICAgICAgICAgaWYgKCB0bXAuaXNFeHBpcmVkKGV4cGlyZSkgfHwgZW1wdHkgKSB7CisgICAgICAgICAgICAgICAgLy9yZXNldCB0aGUgaGVhZAorICAgICAgICAgICAgICAgIGlmICggdG1wID09IGhlYWQgKSBoZWFkID0gdG1wLm5leHQ7CisgICAgICAgICAgICAgICAgY250LnNldENvdW50ZXIodG1wLmdldE1zZ05yKCkrMSk7CisgICAgICAgICAgICAgICAgaWYgKCBnZXRGb3J3YXJkRXhwaXJlZCgpICkgc3VwZXIubWVzc2FnZVJlY2VpdmVkKHRtcC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIHRtcC5zZXRNZXNzYWdlKG51bGwpOworICAgICAgICAgICAgICAgIHRtcCA9IHRtcC5uZXh0OworICAgICAgICAgICAgICAgIGlmICggcHJldiAhPSBudWxsICkgcHJldi5uZXh0ID0gdG1wOyAgCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJldiA9IHRtcDsKKyAgICAgICAgICAgICAgICB0bXAgPSB0bXAubmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIGhlYWQgPT0gbnVsbCApIGluY29taW5nLnJlbW92ZShtZW1iZXIpOworICAgICAgICBlbHNlIGluY29taW5nLnB1dChtZW1iZXIsIGhlYWQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIC8vbm90aWZ5IHVwd2FyZHMKKyAgICAgICAgZ2V0SW5Db3VudGVyKG1lbWJlcik7CisgICAgICAgIGdldE91dENvdW50ZXIobWVtYmVyKTsKKyAgICAgICAgc3VwZXIubWVtYmVyQWRkZWQobWVtYmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJEaXNhcHBlYXJlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIC8vbm90aWZ5IHVwd2FyZHMKKyAgICAgICAgb3V0Y291bnRlci5yZW1vdmUobWVtYmVyKTsKKyAgICAgICAgaW5jb3VudGVyLnJlbW92ZShtZW1iZXIpOworICAgICAgICAvL2NsZWFyIHRoZSByZW1haW5pbmcgcXVldWUKKyAgICAgICAgcHJvY2Vzc0xlZnRPdmVycyhtZW1iZXIsdHJ1ZSk7CisgICAgICAgIHN1cGVyLm1lbWJlckRpc2FwcGVhcmVkKG1lbWJlcik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgaW5jQ291bnRlcihNZW1iZXIgbWJyKSB7IAorICAgICAgICBDb3VudGVyIGNudCA9IGdldE91dENvdW50ZXIobWJyKTsKKyAgICAgICAgcmV0dXJuIGNudC5pbmMoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN5bmNocm9uaXplZCBDb3VudGVyIGdldEluQ291bnRlcihNZW1iZXIgbWJyKSB7CisgICAgICAgIENvdW50ZXIgY250ID0gKENvdW50ZXIpaW5jb3VudGVyLmdldChtYnIpOworICAgICAgICBpZiAoIGNudCA9PSBudWxsICkgeworICAgICAgICAgICAgY250ID0gbmV3IENvdW50ZXIoKTsKKyAgICAgICAgICAgIGNudC5pbmMoKTsgLy9hbHdheXMgc3RhcnQgYXQgMSBmb3IgaW5jb21pbmcKKyAgICAgICAgICAgIGluY291bnRlci5wdXQobWJyLGNudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNudDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIENvdW50ZXIgZ2V0T3V0Q291bnRlcihNZW1iZXIgbWJyKSB7CisgICAgICAgIENvdW50ZXIgY250ID0gKENvdW50ZXIpb3V0Y291bnRlci5nZXQobWJyKTsKKyAgICAgICAgaWYgKCBjbnQgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIGNudCA9IG5ldyBDb3VudGVyKCk7CisgICAgICAgICAgICBvdXRjb3VudGVyLnB1dChtYnIsY250KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY250OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ291bnRlciB7CisgICAgICAgIHByaXZhdGUgaW50IHZhbHVlID0gMDsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldENvdW50ZXIoaW50IGNvdW50ZXIpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSBjb3VudGVyOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBpbmMoKSB7CisgICAgICAgICAgICByZXR1cm4gKyt2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lc3NhZ2VPcmRlciB7CisgICAgICAgIHByaXZhdGUgbG9uZyByZWNlaXZlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBwcml2YXRlIE1lc3NhZ2VPcmRlciBuZXh0OworICAgICAgICBwcml2YXRlIGludCBtc2dOcjsKKyAgICAgICAgcHJpdmF0ZSBDaGFubmVsTWVzc2FnZSBtc2cgPSBudWxsOworICAgICAgICBwdWJsaWMgTWVzc2FnZU9yZGVyKGludCBtc2dOcixDaGFubmVsTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHRoaXMubXNnTnIgPSBtc2dOcjsKKyAgICAgICAgICAgIHRoaXMubXNnID0gbXNnOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cGlyZWQobG9uZyBleHBpcmVUaW1lKSB7CisgICAgICAgICAgICByZXR1cm4gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXJlY2VpdmVkKSA+IGV4cGlyZVRpbWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBDaGFubmVsTWVzc2FnZSBnZXRNZXNzYWdlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShDaGFubmVsTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHRoaXMubXNnID0gbXNnOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0KE1lc3NhZ2VPcmRlciBvcmRlcikgeworICAgICAgICAgICAgdGhpcy5uZXh0ID0gb3JkZXI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIE1lc3NhZ2VPcmRlciBnZXROZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisgICAgICAgICAgICBNZXNzYWdlT3JkZXIgdG1wID0gbmV4dDsKKyAgICAgICAgICAgIHdoaWxlICggdG1wICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgY291bnRlcisrOworICAgICAgICAgICAgICAgIHRtcCA9IHRtcC5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNvdW50ZXI7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZU9yZGVyIGFkZChNZXNzYWdlT3JkZXIgaGVhZCwgTWVzc2FnZU9yZGVyIGFkZCkgeworICAgICAgICAgICAgaWYgKCBoZWFkID09IG51bGwgKSByZXR1cm4gYWRkOworICAgICAgICAgICAgaWYgKCBhZGQgPT0gbnVsbCApIHJldHVybiBoZWFkOworICAgICAgICAgICAgaWYgKCBoZWFkID09IGFkZCApIHJldHVybiBhZGQ7CisKKyAgICAgICAgICAgIGlmICggaGVhZC5nZXRNc2dOcigpID4gYWRkLmdldE1zZ05yKCkgKSB7CisgICAgICAgICAgICAgICAgYWRkLm5leHQgPSBoZWFkOworICAgICAgICAgICAgICAgIHJldHVybiBhZGQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE1lc3NhZ2VPcmRlciBpdGVyID0gaGVhZDsKKyAgICAgICAgICAgIE1lc3NhZ2VPcmRlciBwcmV2ID0gbnVsbDsKKyAgICAgICAgICAgIHdoaWxlICggaXRlci5nZXRNc2dOcigpIDwgYWRkLmdldE1zZ05yKCkgJiYgKGl0ZXIubmV4dCAhPW51bGwgKSApIHsKKyAgICAgICAgICAgICAgICBwcmV2ID0gaXRlcjsKKyAgICAgICAgICAgICAgICBpdGVyID0gaXRlci5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBpdGVyLmdldE1zZ05yKCkgPCBhZGQuZ2V0TXNnTnIoKSApIHsKKyAgICAgICAgICAgICAgICAvL2FkZCBhZnRlcgorICAgICAgICAgICAgICAgIGFkZC5uZXh0ID0gaXRlci5uZXh0OworICAgICAgICAgICAgICAgIGl0ZXIubmV4dCA9IGFkZDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlci5nZXRNc2dOcigpID4gYWRkLmdldE1zZ05yKCkpIHsKKyAgICAgICAgICAgICAgICAvL2FkZCBiZWZvcmUKKyAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBhZGQ7CisgICAgICAgICAgICAgICAgYWRkLm5leHQgPSBpdGVyOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJpdGhtZXRpY0V4Y2VwdGlvbigiTWVzc2FnZSBhZGRlZCBoYXMgdGhlIHNhbWUgY291bnRlciwgc3luY2hyb25pemF0aW9uIGJ1Zy4gRGlzYWJsZSB0aGUgb3JkZXIgaW50ZXJjZXB0b3IiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIGhlYWQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TXNnTnIoKSB7CisgICAgICAgICAgICByZXR1cm4gbXNnTnI7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBpcmUobG9uZyBleHBpcmUpIHsKKyAgICAgICAgdGhpcy5leHBpcmUgPSBleHBpcmU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Rm9yd2FyZEV4cGlyZWQoYm9vbGVhbiBmb3J3YXJkRXhwaXJlZCkgeworICAgICAgICB0aGlzLmZvcndhcmRFeHBpcmVkID0gZm9yd2FyZEV4cGlyZWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWF4UXVldWUoaW50IG1heFF1ZXVlKSB7CisgICAgICAgIHRoaXMubWF4UXVldWUgPSBtYXhRdWV1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRFeHBpcmUoKSB7CisgICAgICAgIHJldHVybiBleHBpcmU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Rm9yd2FyZEV4cGlyZWQoKSB7CisgICAgICAgIHJldHVybiBmb3J3YXJkRXhwaXJlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1heFF1ZXVlKCkgeworICAgICAgICByZXR1cm4gbWF4UXVldWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvaW50ZXJjZXB0b3JzL1N0YXRpY01lbWJlcnNoaXBJbnRlcmNlcHRvci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL2ludGVyY2VwdG9ycy9TdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWU4NzM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL2ludGVyY2VwdG9ycy9TdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5DaGFubmVsSW50ZXJjZXB0b3JCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkFic29sdXRlT3JkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsOworCitwdWJsaWMgY2xhc3MgU3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yCisgICAgZXh0ZW5kcyBDaGFubmVsSW50ZXJjZXB0b3JCYXNlIHsKKyAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IG1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJvdGVjdGVkIE1lbWJlciBsb2NhbE1lbWJlciA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFN0YXRpY01lbWJlcihNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobWVtYmVycykgeworICAgICAgICAgICAgaWYgKCFtZW1iZXJzLmNvbnRhaW5zKG1lbWJlcikpIG1lbWJlcnMuYWRkKG1lbWJlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTdGF0aWNNZW1iZXIoTWVtYmVyIG1lbWJlcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1lbWJlcnMpIHsKKyAgICAgICAgICAgIGlmIChtZW1iZXJzLmNvbnRhaW5zKG1lbWJlcikpIG1lbWJlcnMucmVtb3ZlKG1lbWJlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE1lbWJlcihNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIHRoaXMubG9jYWxNZW1iZXIgPSBtZW1iZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFzIG1lbWJlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZW1iZXJzKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuaGFzTWVtYmVycygpIHx8IChtZW1iZXJzLnNpemUoKT4wKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIGN1cnJlbnQgY2x1c3RlciBtZW1iZXJzCisgICAgICogQHJldHVybiBhbGwgbWVtYmVycyBvciBlbXB0eSBhcnJheQorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXJbXSBnZXRNZW1iZXJzKCkgeworICAgICAgICBpZiAoIG1lbWJlcnMuc2l6ZSgpID09IDAgKSByZXR1cm4gc3VwZXIuZ2V0TWVtYmVycygpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWVtYmVycykgeworICAgICAgICAgICAgICAgIE1lbWJlcltdIG90aGVycyA9IHN1cGVyLmdldE1lbWJlcnMoKTsKKyAgICAgICAgICAgICAgICBNZW1iZXJbXSByZXN1bHQgPSBuZXcgTWVtYmVyW21lbWJlcnMuc2l6ZSgpICsgb3RoZXJzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlcnMubGVuZ3RoOyBpKyspIHJlc3VsdFtpXSA9IG90aGVyc1tpXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMuc2l6ZSgpOyBpKyspIHJlc3VsdFtpICsgb3RoZXJzLmxlbmd0aF0gPSAoTWVtYmVyKSBtZW1iZXJzLmdldChpKTsKKyAgICAgICAgICAgICAgICBBYnNvbHV0ZU9yZGVyLmFic29sdXRlT3JkZXIocmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfS8vc3luYworICAgICAgICB9Ly9lbmQgaWYKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBtYnIgTWVtYmVyCisgICAgICogQHJldHVybiBNZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyIGdldE1lbWJlcihNZW1iZXIgbWJyKSB7CisgICAgICAgIGlmICggbWVtYmVycy5jb250YWlucyhtYnIpICkgcmV0dXJuIChNZW1iZXIpbWVtYmVycy5nZXQobWVtYmVycy5pbmRleE9mKG1icikpOworICAgICAgICBlbHNlIHJldHVybiBzdXBlci5nZXRNZW1iZXIobWJyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1lbWJlciB0aGF0IHJlcHJlc2VudHMgdGhpcyBub2RlLgorICAgICAqCisgICAgICogQHJldHVybiBNZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyIGdldExvY2FsTWVtYmVyKGJvb2xlYW4gaW5jQWxpdmUpIHsKKyAgICAgICAgaWYgKHRoaXMubG9jYWxNZW1iZXIgIT0gbnVsbCApIHJldHVybiBsb2NhbE1lbWJlcjsKKyAgICAgICAgZWxzZSByZXR1cm4gc3VwZXIuZ2V0TG9jYWxNZW1iZXIoaW5jQWxpdmUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZW5kIG5vdGlmaWNhdGlvbnMgdXB3YXJkcworICAgICAqIEBwYXJhbSBzdmMgaW50CisgICAgICogQHRocm93cyBDaGFubmVsRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoaW50IHN2YykgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICBpZiAoIChDaGFubmVsLlNORF9SWF9TRVEmc3ZjKT09Q2hhbm5lbC5TTkRfUlhfU0VRICkgc3VwZXIuc3RhcnQoQ2hhbm5lbC5TTkRfUlhfU0VRKTsgCisgICAgICAgIGlmICggKENoYW5uZWwuU05EX1RYX1NFUSZzdmMpPT1DaGFubmVsLlNORF9UWF9TRVEgKSBzdXBlci5zdGFydChDaGFubmVsLlNORF9UWF9TRVEpOyAKKyAgICAgICAgZmluYWwgTWVtYmVyW10gbWJycyA9IChNZW1iZXJbXSltZW1iZXJzLnRvQXJyYXkobmV3IE1lbWJlclttZW1iZXJzLnNpemUoKV0pOworICAgICAgICBmaW5hbCBDaGFubmVsSW50ZXJjZXB0b3JCYXNlIGJhc2UgPSB0aGlzOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1icnMubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGJhc2UubWVtYmVyQWRkZWQobWJyc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIHN1cGVyLnN0YXJ0KHN2YyAmICh+Q2hhbm5lbC5TTkRfUlhfU0VRKSAmICh+Q2hhbm5lbC5TTkRfVFhfU0VRKSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL2ludGVyY2VwdG9ycy9UY3BGYWlsdXJlRGV0ZWN0b3IuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9pbnRlcmNlcHRvcnMvVGNwRmFpbHVyZURldGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5ZGZjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9ncm91cC9pbnRlcmNlcHRvcnMvVGNwRmFpbHVyZURldGVjdG9yLmphdmEKQEAgLTAsMCArMSwyODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzOworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsRXhjZXB0aW9uLkZhdWx0eU1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuUmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5DaGFubmVsSW50ZXJjZXB0b3JCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkludGVyY2VwdG9yUGF5bG9hZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pby5DaGFubmVsRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pby5YQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5tZW1iZXJzaGlwLk1lbWJlckltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMubWVtYmVyc2hpcC5NZW1iZXJzaGlwOworaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247CisKKy8qKgorICogPHA+VGl0bGU6IEEgcGVyZmVjdCBmYWlsdXJlIGRldGVjdG9yIDwvcD4KKyAqCisgKiA8cD5EZXNjcmlwdGlvbjogVGhlIFRjcEZhaWx1cmVEZXRlY3RvciBpcyBhIHVzZWZ1bCBpbnRlcmNlcHRvcgorICogdGhhdCBhZGRzIHJlbGlhYmlsaXR5IHRvIHRoZSBtZW1iZXJzaGlwIGxheWVyLjwvcD4KKyAqIDxwPgorICogSWYgdGhlIG5ldHdvcmsgaXMgYnVzeSwgb3IgdGhlIHN5c3RlbSBpcyBidXN5IHNvIHRoYXQgdGhlIG1lbWJlcnNoaXAgcmVjZWl2ZXIgdGhyZWFkCisgKiBpcyBub3QgZ2V0dGluZyBlbm91Z2ggdGltZSB0byB1cGRhdGUgaXRzIHRhYmxlLCBtZW1iZXJzIGNhbiBiZSAmcXVvdDt0aW1lZCBvdXQmcXVvdDsKKyAqIFRoaXMgZmFpbHVyZSBkZXRlY3RvciB3aWxsIGludGVyY2VwdCB0aGUgbWVtYmVyRGlzYXBwZWFyZWQgbWVzc2FnZSh1bmxlc3MgaXRzIGEgdHJ1ZSBzaHV0ZG93biBtZXNzYWdlKQorICogYW5kIGNvbm5lY3QgdG8gdGhlIG1lbWJlciB1c2luZyBUQ1AuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSBUY3BGYWlsdXJlRGV0ZWN0b3Igd29ya3MgaW4gdHdvIHdheXMuIDxicj4KKyAqIDEuIEl0IGludGVyY2VwdHMgbWVtYmVyRGlzYXBwZWFyZWQgZXZlbnRzCisgKiAyLiBJdCBjYXRjaGVzIHNlbmQgZXJyb3JzIAorICogPC9wPgorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgVGNwRmFpbHVyZURldGVjdG9yIGV4dGVuZHMgQ2hhbm5lbEludGVyY2VwdG9yQmFzZSB7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBUY3BGYWlsdXJlRGV0ZWN0b3IuY2xhc3MgKTsKKyAgICAKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJ5dGVbXSBUQ1BfRkFJTF9ERVRFQ1QgPSBuZXcgYnl0ZVtdIHsKKyAgICAgICAgNzksIC04OSwgMTE1LCA3MiwgMTIxLCAtMTI2LCA2NywgLTU1LCAtOTcsIDExMSwgLTExOSwgLTEyOCwgLTk1LCA5MSwgNywgMjAsCisgICAgICAgIDEyNSwgLTM5LCA4MiwgOTEsIC0yMSwgLTE1LCA2NywgLTEwMiwgLTczLCAxMjYsIC02NiwgLTExMywgLTEyNywgMTAzLCAzMCwgLTc0LAorICAgICAgICA1NSwgMjEsIC02NiwgLTEyMSwgNjksIDEyNiwgNzYsIC04OCwgLTY1LCAxMCwgNzcsIDE5LCA4MywgNTYsIDIxLCA1MCwKKyAgICAgICAgODUsIC0xMCwgLTEwOCwgLTczLCA1OCwgLTYsIDY0LCAxMjAsIC0xMTEsIDQsIDEyNSwgLTQxLCAxMTQsIC0xMjQsIC02NCwgLTQzfTsgICAgICAKKyAgICAKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwZXJmb3JtQ29ubmVjdFRlc3QgPSB0cnVlOworCisgICAgcHJvdGVjdGVkIGxvbmcgY29ubmVjdFRpbWVvdXQgPSAxMDAwOy8vMSBzZWNvbmQgZGVmYXVsdAorICAgIAorICAgIHByb3RlY3RlZCBib29sZWFuIHBlcmZvcm1TZW5kVGVzdCA9IHRydWU7CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwZXJmb3JtUmVhZFRlc3QgPSBmYWxzZTsKKyAgICAKKyAgICBwcm90ZWN0ZWQgbG9uZyByZWFkVGVzdFRpbWVvdXQgPSA1MDAwOy8vNSBzZWNvbmRzCisgICAgCisgICAgcHJvdGVjdGVkIE1lbWJlcnNoaXAgbWVtYmVyc2hpcCA9IG51bGw7CisgICAgCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgcmVtb3ZlU3VzcGVjdHMgPSBuZXcgSGFzaE1hcCgpOworICAgIAorICAgIHByb3RlY3RlZCBIYXNoTWFwIGFkZFN1c3BlY3RzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZW5kTWVzc2FnZShNZW1iZXJbXSBkZXN0aW5hdGlvbiwgQ2hhbm5lbE1lc3NhZ2UgbXNnLCBJbnRlcmNlcHRvclBheWxvYWQgcGF5bG9hZCkgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIuc2VuZE1lc3NhZ2UoZGVzdGluYXRpb24sIG1zZywgcGF5bG9hZCk7CisgICAgICAgIH1jYXRjaCAoIENoYW5uZWxFeGNlcHRpb24gY3ggKSB7CisgICAgICAgICAgICBGYXVsdHlNZW1iZXJbXSBtYnJzID0gY3guZ2V0RmF1bHR5TWVtYmVycygpOworICAgICAgICAgICAgZm9yICggaW50IGk9MDsgaTxtYnJzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgIGlmICggbWJyc1tpXS5nZXRDYXVzZSgpIT1udWxsICYmICAKKyAgICAgICAgICAgICAgICAgICAgICghKG1icnNbaV0uZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFJlbW90ZVByb2Nlc3NFeGNlcHRpb24pKSApIHsvL1JlbW90ZVByb2Nlc3NFeGNlcHRpb24ncyBhcmUgb2sKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW1iZXJEaXNhcHBlYXJlZChtYnJzW2ldLmdldE1lbWJlcigpKTsKKyAgICAgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgIH0vL2ZvcgorICAgICAgICAgICAgdGhyb3cgY3g7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoQ2hhbm5lbE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIC8vY2F0Y2ggaW5jb21pbmcgCisgICAgICAgIGJvb2xlYW4gcHJvY2VzcyA9IHRydWU7CisgICAgICAgIGlmICggb2tUb1Byb2Nlc3MobXNnLmdldE9wdGlvbnMoKSkgKSB7CisgICAgICAgICAgICAvL2NoZWNrIHRvIHNlZSBpZiBpdCBpcyBhIHRlc3RNZXNzYWdlLCBpZiBzbywgcHJvY2VzcyA9IGZhbHNlCisgICAgICAgICAgICBwcm9jZXNzID0gKCAobXNnLmdldE1lc3NhZ2UoKS5nZXRMZW5ndGgoKSAhPSBUQ1BfRkFJTF9ERVRFQ1QubGVuZ3RoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKCFBcnJheXMuZXF1YWxzKFRDUF9GQUlMX0RFVEVDVCxtc2cuZ2V0TWVzc2FnZSgpLmdldEJ5dGVzKCkpICkgKTsKKyAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICAKKyAgICAgICAgLy9pZ25vcmUgdGhlIG1lc3NhZ2UsIGl0IGRvZXNudCBoYXZlIHRoZSBmbGFnIHNldAorICAgICAgICBpZiAoIHByb2Nlc3MgKSBzdXBlci5tZXNzYWdlUmVjZWl2ZWQobXNnKTsKKyAgICAgICAgZWxzZSBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgbG9nLmRlYnVnKCJSZWNlaXZlZCBhIGZhaWx1cmUgZGV0ZWN0b3IgcGFja2V0OiIrbXNnKTsKKyAgICB9Ly9tZXNzYWdlUmVjZWl2ZWQKKyAgICAKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIGlmICggbWVtYmVyc2hpcCA9PSBudWxsICkgc2V0dXBNZW1iZXJzaGlwKCk7CisgICAgICAgIGJvb2xlYW4gbm90aWZ5ID0gZmFsc2U7CisgICAgICAgIHN5bmNocm9uaXplZCAobWVtYmVyc2hpcCkgeworICAgICAgICAgICAgaWYgKHJlbW92ZVN1c3BlY3RzLmNvbnRhaW5zS2V5KG1lbWJlcikpIHsKKyAgICAgICAgICAgICAgICAvL3ByZXZpb3VzbHkgbWFya2VkIHN1c3BlY3QsIHN5c3RlbSBiZWxvdyBwaWNrZWQgdXAgdGhlIG1lbWJlciBhZ2FpbgorICAgICAgICAgICAgICAgIHJlbW92ZVN1c3BlY3RzLnJlbW92ZShtZW1iZXIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtZW1iZXJzaGlwLmdldE1lbWJlciggKE1lbWJlckltcGwpIG1lbWJlcikgPT0gbnVsbCl7CisgICAgICAgICAgICAgICAgLy9pZiB3ZSBhZGQgaXQgaGVyZSwgdGhlbiBhZGQgaXQgdXB3YXJkcyB0b28KKyAgICAgICAgICAgICAgICAvL2NoZWNrIHRvIHNlZSBpZiBpdCBpcyBhbGl2ZQorICAgICAgICAgICAgICAgIGlmIChtZW1iZXJBbGl2ZShtZW1iZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWJlcnNoaXAubWVtYmVyQWxpdmUoIChNZW1iZXJJbXBsKSBtZW1iZXIpOworICAgICAgICAgICAgICAgICAgICBub3RpZnkgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFN1c3BlY3RzLnB1dChtZW1iZXIsIG5ldyBMb25nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICggbm90aWZ5ICkgc3VwZXIubWVtYmVyQWRkZWQobWVtYmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJEaXNhcHBlYXJlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIGlmICggbWVtYmVyc2hpcCA9PSBudWxsICkgc2V0dXBNZW1iZXJzaGlwKCk7CisgICAgICAgIGJvb2xlYW4gbm90aWZ5ID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gc2h1dGRvd24gPSBBcnJheXMuZXF1YWxzKG1lbWJlci5nZXRDb21tYW5kKCksTWVtYmVyLlNIVVRET1dOX1BBWUxPQUQpOworICAgICAgICBpZiAoICFzaHV0ZG93biApIGxvZy5pbmZvKCJSZWNlaXZlZCBtZW1iZXJEaXNhcHBlYXJlZFsiK21lbWJlcisiXSBtZXNzYWdlLiBXaWxsIHZlcmlmeS4iKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtZW1iZXJzaGlwKSB7CisgICAgICAgICAgICAvL2NoZWNrIHRvIHNlZSBpZiB0aGUgbWVtYmVyIHJlYWxseSBpcyBnb25lCisgICAgICAgICAgICAvL2lmIHRoZSBwYXlsb2FkIGlzIG5vdCBhIHNodXRkb3duIG1lc3NhZ2UKKyAgICAgICAgICAgIGlmIChzaHV0ZG93biB8fCAhbWVtYmVyQWxpdmUobWVtYmVyKSkgeworICAgICAgICAgICAgICAgIC8vbm90IGNvcnJlY3QsIHdlIG5lZWQgdG8gbWFpbnRhaW4gdGhlIG1hcAorICAgICAgICAgICAgICAgIG1lbWJlcnNoaXAucmVtb3ZlTWVtYmVyKCAoTWVtYmVySW1wbCkgbWVtYmVyKTsKKyAgICAgICAgICAgICAgICByZW1vdmVTdXNwZWN0cy5yZW1vdmUobWVtYmVyKTsKKyAgICAgICAgICAgICAgICBub3RpZnkgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL2FkZCB0aGUgbWVtYmVyIGFzIHN1c3BlY3QKKyAgICAgICAgICAgICAgICByZW1vdmVTdXNwZWN0cy5wdXQobWVtYmVyLCBuZXcgTG9uZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICggbm90aWZ5ICkgeworICAgICAgICAgICAgbG9nLmluZm8oIlZlcmlmaWNhdGlvbiBjb21wbGV0ZS4gTWVtYmVyIGRpc2FwcGVhcmVkWyIrbWVtYmVyKyJdIik7CisgICAgICAgICAgICBzdXBlci5tZW1iZXJEaXNhcHBlYXJlZChtZW1iZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nLmluZm8oIlZlcmlmaWNhdGlvbiBjb21wbGV0ZS4gTWVtYmVyIHN0aWxsIGFsaXZlWyIrbWVtYmVyKyJdIik7CisKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZW1iZXJzKCkgeworICAgICAgICBpZiAoIG1lbWJlcnNoaXAgPT0gbnVsbCApIHNldHVwTWVtYmVyc2hpcCgpOworICAgICAgICByZXR1cm4gbWVtYmVyc2hpcC5oYXNNZW1iZXJzKCk7CisgICAgfQorCisgICAgcHVibGljIE1lbWJlcltdIGdldE1lbWJlcnMoKSB7CisgICAgICAgIGlmICggbWVtYmVyc2hpcCA9PSBudWxsICkgc2V0dXBNZW1iZXJzaGlwKCk7CisgICAgICAgIHJldHVybiBtZW1iZXJzaGlwLmdldE1lbWJlcnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVtYmVyIGdldE1lbWJlcihNZW1iZXIgbWJyKSB7CisgICAgICAgIGlmICggbWVtYmVyc2hpcCA9PSBudWxsICkgc2V0dXBNZW1iZXJzaGlwKCk7CisgICAgICAgIHJldHVybiBtZW1iZXJzaGlwLmdldE1lbWJlcihtYnIpOworICAgIH0KKworICAgIHB1YmxpYyBNZW1iZXIgZ2V0TG9jYWxNZW1iZXIoYm9vbGVhbiBpbmNBbGl2ZSkgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TG9jYWxNZW1iZXIoaW5jQWxpdmUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBoZWFydGJlYXQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobWVtYmVyc2hpcCA9PSBudWxsKSBzZXR1cE1lbWJlcnNoaXAoKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWVtYmVyc2hpcCkgeworICAgICAgICAgICAgICAgIC8vdXBkYXRlIGFsbCBhbGl2ZSB0aW1lcworICAgICAgICAgICAgICAgIE1lbWJlcltdIG1lbWJlcnMgPSBzdXBlci5nZXRNZW1iZXJzKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IG1lbWJlcnMgIT0gbnVsbCAmJiBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyc2hpcC5tZW1iZXJBbGl2ZSggKE1lbWJlckltcGwpIG1lbWJlcnNbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3dlIGRvbid0IGhhdmUgdGhpcyBvbmUgaW4gb3VyIG1lbWJlcnNoaXAsIGNoZWNrIHRvIHNlZSBpZiBoZS9zaGUgaXMgYWxpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXJBbGl2ZShtZW1iZXJzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJNZW1iZXIgYWRkZWQsIGV2ZW4gdGhvdWdoIHdlIHdlcmVudCBub3RpZmllZDoiICsgbWVtYmVyc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIubWVtYmVyQWRkZWQobWVtYmVyc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcnNoaXAucmVtb3ZlTWVtYmVyKCAoTWVtYmVySW1wbCkgbWVtYmVyc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vZW5kIGlmCisgICAgICAgICAgICAgICAgICAgIH0gLy9lbmQgaWYKKyAgICAgICAgICAgICAgICB9IC8vZm9yCisKKyAgICAgICAgICAgICAgICAvL2NoZWNrIHN1c3BlY3QgbWVtYmVycyBpZiB0aGV5IGFyZSBzdGlsbCBhbGl2ZSwKKyAgICAgICAgICAgICAgICAvL2lmIG5vdCwgc2ltcGx5IGlzc3VlIHRoZSBtZW1iZXJEaXNhcHBlYXJlZCBtZXNzYWdlCisgICAgICAgICAgICAgICAgTWVtYmVySW1wbFtdIGtleXMgPSAoTWVtYmVySW1wbFtdKSByZW1vdmVTdXNwZWN0cy5rZXlTZXQoKS50b0FycmF5KG5ldyBNZW1iZXJJbXBsW3JlbW92ZVN1c3BlY3RzLnNpemUoKV0pOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBNZW1iZXJJbXBsIG0gPSAoTWVtYmVySW1wbCkga2V5c1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlcnNoaXAuZ2V0TWVtYmVyKG0pICE9IG51bGwgJiYgKCFtZW1iZXJBbGl2ZShtKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcnNoaXAucmVtb3ZlTWVtYmVyKG0pOworICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIubWVtYmVyRGlzYXBwZWFyZWQobSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVTdXNwZWN0cy5yZW1vdmUobSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiU3VzcGVjdCBtZW1iZXIsIGNvbmZpcm1lZCBkZWFkLlsiK20rIl0iKTsKKyAgICAgICAgICAgICAgICAgICAgfSAvL2VuZCBpZgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vY2hlY2sgYWRkIHN1c3BlY3RzIG1lbWJlcnMgaWYgdGhleSBhcmUgYWxpdmUgbm93LAorICAgICAgICAgICAgICAgIC8vaWYgdGhleSBhcmUsIHNpbXBseSBpc3N1ZSB0aGUgbWVtYmVyQWRkZWQgbWVzc2FnZQorICAgICAgICAgICAgICAgIGtleXMgPSAoTWVtYmVySW1wbFtdKSBhZGRTdXNwZWN0cy5rZXlTZXQoKS50b0FycmF5KG5ldyBNZW1iZXJJbXBsW2FkZFN1c3BlY3RzLnNpemUoKV0pOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBNZW1iZXJJbXBsIG0gPSAoTWVtYmVySW1wbCkga2V5c1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBtZW1iZXJzaGlwLmdldE1lbWJlcihtKSA9PSBudWxsICYmIChtZW1iZXJBbGl2ZShtKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcnNoaXAubWVtYmVyQWxpdmUobSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5tZW1iZXJBZGRlZChtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFN1c3BlY3RzLnJlbW92ZShtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJTdXNwZWN0IG1lbWJlciwgY29uZmlybWVkIGFsaXZlLlsiK20rIl0iKTsKKyAgICAgICAgICAgICAgICAgICAgfSAvL2VuZCBpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBsb2cud2FybigiVW5hYmxlIHRvIHBlcmZvcm0gaGVhcnRiZWF0IG9uIHRoZSBUY3BGYWlsdXJlRGV0ZWN0b3IuIix4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmhlYXJ0YmVhdCgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzZXR1cE1lbWJlcnNoaXAoKSB7CisgICAgICAgIGlmICggbWVtYmVyc2hpcCA9PSBudWxsICkgeworICAgICAgICAgICAgbWVtYmVyc2hpcCA9IG5ldyBNZW1iZXJzaGlwKChNZW1iZXJJbXBsKXN1cGVyLmdldExvY2FsTWVtYmVyKHRydWUpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbWVtYmVyQWxpdmUoTWVtYmVyIG1icikgeworICAgICAgICByZXR1cm4gbWVtYmVyQWxpdmUobWJyLFRDUF9GQUlMX0RFVEVDVCxwZXJmb3JtU2VuZFRlc3QscGVyZm9ybVJlYWRUZXN0LHJlYWRUZXN0VGltZW91dCxjb25uZWN0VGltZW91dCxnZXRPcHRpb25GbGFnKCkpOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWVtYmVyQWxpdmUoTWVtYmVyIG1iciwgYnl0ZVtdIG1zZ0RhdGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlbmRUZXN0LCBib29sZWFuIHJlYWRUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJlYWRUaW1lb3V0LCBsb25nIGNvblRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcHRpb25GbGFnKSB7CisgICAgICAgIC8vY291bGQgYmUgYSBzaHV0ZG93biBub3RpZmljYXRpb24KKyAgICAgICAgaWYgKCBBcnJheXMuZXF1YWxzKG1ici5nZXRDb21tYW5kKCksTWVtYmVyLlNIVVRET1dOX1BBWUxPQUQpICkgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAgU29ja2V0IHNvY2tldCA9IG5ldyBTb2NrZXQoKTsgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5ldEFkZHJlc3MgaWEgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MobWJyLmdldEhvc3QoKSk7CisgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBhZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGlhLCBtYnIuZ2V0UG9ydCgpKTsKKyAgICAgICAgICAgIHNvY2tldC5zZXRTb1RpbWVvdXQoKGludClyZWFkVGltZW91dCk7CisgICAgICAgICAgICBzb2NrZXQuY29ubmVjdChhZGRyLCAoaW50KSBjb25UaW1lb3V0KTsKKyAgICAgICAgICAgIGlmICggc2VuZFRlc3QgKSB7CisgICAgICAgICAgICAgICAgQ2hhbm5lbERhdGEgZGF0YSA9IG5ldyBDaGFubmVsRGF0YSh0cnVlKTsKKyAgICAgICAgICAgICAgICBkYXRhLnNldEFkZHJlc3MobWJyKTsKKyAgICAgICAgICAgICAgICBkYXRhLnNldE1lc3NhZ2UobmV3IFhCeXRlQnVmZmVyKG1zZ0RhdGEsZmFsc2UpKTsKKyAgICAgICAgICAgICAgICBkYXRhLnNldFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgaW50IG9wdGlvbnMgPSBvcHRpb25GbGFnIHwgQ2hhbm5lbC5TRU5EX09QVElPTlNfQllURV9NRVNTQUdFOworICAgICAgICAgICAgICAgIGlmICggcmVhZFRlc3QgKSBvcHRpb25zID0gKG9wdGlvbnMgfCBDaGFubmVsLlNFTkRfT1BUSU9OU19VU0VfQUNLKTsKKyAgICAgICAgICAgICAgICBlbHNlIG9wdGlvbnMgPSAob3B0aW9ucyAmICh+Q2hhbm5lbC5TRU5EX09QVElPTlNfVVNFX0FDSykpOworICAgICAgICAgICAgICAgIGRhdGEuc2V0T3B0aW9ucyhvcHRpb25zKTsKKyAgICAgICAgICAgICAgICBieXRlW10gbWVzc2FnZSA9IFhCeXRlQnVmZmVyLmNyZWF0ZURhdGFQYWNrYWdlKGRhdGEpOworICAgICAgICAgICAgICAgIHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBpZiAoIHJlYWRUZXN0ICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gc29ja2V0LmdldElucHV0U3RyZWFtKCkucmVhZChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aCA+IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoIFNvY2tldFRpbWVvdXRFeGNlcHRpb24gc3gpIHsKKyAgICAgICAgICAgIC8vZG8gbm90aGluZywgd2UgY291bGRuJ3QgY29ubmVjdAorICAgICAgICB9IGNhdGNoICggQ29ubmVjdEV4Y2VwdGlvbiBjeCkgeworICAgICAgICAgICAgLy9kbyBub3RoaW5nLCB3ZSBjb3VsZG4ndCBjb25uZWN0CisgICAgICAgIH1jYXRjaCAoRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBwZXJmb3JtIGZhaWx1cmUgZGV0ZWN0aW9uIGNoZWNrLCBhc3N1bWluZyBtZW1iZXIgZG93bi4iLHgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHtzb2NrZXQuY2xvc2UoKTsgfSBjYXRjaCAoIEV4Y2VwdGlvbiBpZ25vcmUgKXt9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCisKKyAgICAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvaW50ZXJjZXB0b3JzL1Rocm91Z2hwdXRJbnRlcmNlcHRvci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL2ludGVyY2VwdG9ycy9UaHJvdWdocHV0SW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQwYTNmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL2ludGVyY2VwdG9ycy9UaHJvdWdocHV0SW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkNoYW5uZWxJbnRlcmNlcHRvckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuSW50ZXJjZXB0b3JQYXlsb2FkOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLkNoYW5uZWxEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLlhCeXRlQnVmZmVyOworaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLm1lbWJlcnNoaXAuTWVtYmVySW1wbDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKKworCisKKy8qKgorICoKKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIFRocm91Z2hwdXRJbnRlcmNlcHRvciBleHRlbmRzIENoYW5uZWxJbnRlcmNlcHRvckJhc2UgeworICAgIHByb3RlY3RlZCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKFRocm91Z2hwdXRJbnRlcmNlcHRvci5jbGFzcyk7CisKKyAgICBkb3VibGUgbWJUeCA9IDA7CisgICAgZG91YmxlIG1iQXBwVHggPSAwOworICAgIGRvdWJsZSBtYlJ4ID0gMDsKKyAgICBkb3VibGUgdGltZVR4ID0gMDsKKyAgICBkb3VibGUgbGFzdENudCA9IDA7CisgICAgQXRvbWljTG9uZyBtc2dUeENudCA9IG5ldyBBdG9taWNMb25nKDEpOworICAgIEF0b21pY0xvbmcgbXNnUnhDbnQgPSBuZXcgQXRvbWljTG9uZygwKTsKKyAgICBBdG9taWNMb25nIG1zZ1R4RXJyID0gbmV3IEF0b21pY0xvbmcoMCk7CisgICAgaW50IGludGVydmFsID0gMTAwMDA7CisgICAgQXRvbWljSW50ZWdlciBhY2Nlc3MgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICBsb25nIHR4U3RhcnQgPSAwOworICAgIGxvbmcgcnhTdGFydCA9IDA7CisgICAgRGVjaW1hbEZvcm1hdCBkZiA9IG5ldyBEZWNpbWFsRm9ybWF0KCIjMC4wMCIpOworCisKKyAgICBwdWJsaWMgdm9pZCBzZW5kTWVzc2FnZShNZW1iZXJbXSBkZXN0aW5hdGlvbiwgQ2hhbm5lbE1lc3NhZ2UgbXNnLCBJbnRlcmNlcHRvclBheWxvYWQgcGF5bG9hZCkgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICBpZiAoIGFjY2Vzcy5hZGRBbmRHZXQoMSkgPT0gMSApIHR4U3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9uZyBieXRlcyA9IFhCeXRlQnVmZmVyLmdldERhdGFQYWNrYWdlTGVuZ3RoKCgoQ2hhbm5lbERhdGEpbXNnKS5nZXREYXRhUGFja2FnZUxlbmd0aCgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLnNlbmRNZXNzYWdlKGRlc3RpbmF0aW9uLCBtc2csIHBheWxvYWQpOworICAgICAgICB9Y2F0Y2ggKCBDaGFubmVsRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBtc2dUeEVyci5hZGRBbmRHZXQoMSk7CisgICAgICAgICAgICBhY2Nlc3MuYWRkQW5kR2V0KC0xKTsKKyAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgIH0gCisgICAgICAgIG1iVHggKz0gKChkb3VibGUpKGJ5dGVzKmRlc3RpbmF0aW9uLmxlbmd0aCkpLygxMDI0ZCoxMDI0ZCk7CisgICAgICAgIG1iQXBwVHggKz0gKChkb3VibGUpKGJ5dGVzKSkvKDEwMjRkKjEwMjRkKTsKKyAgICAgICAgaWYgKCBhY2Nlc3MuYWRkQW5kR2V0KC0xKSA9PSAwICkgeworICAgICAgICAgICAgbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICB0aW1lVHggKz0gKCAoZG91YmxlKSAoc3RvcCAtIHR4U3RhcnQpKSAvIDEwMDBkOworICAgICAgICAgICAgaWYgKChtc2dUeENudC5nZXQoKSAvIGludGVydmFsKSA+PSBsYXN0Q250KSB7CisgICAgICAgICAgICAgICAgbGFzdENudCsrOworICAgICAgICAgICAgICAgIHJlcG9ydCh0aW1lVHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1zZ1R4Q250LmFkZEFuZEdldCgxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoQ2hhbm5lbE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIGlmICggcnhTdGFydCA9PSAwICkgcnhTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBsb25nIGJ5dGVzID0gWEJ5dGVCdWZmZXIuZ2V0RGF0YVBhY2thZ2VMZW5ndGgoKChDaGFubmVsRGF0YSltc2cpLmdldERhdGFQYWNrYWdlTGVuZ3RoKCkpOworICAgICAgICBtYlJ4ICs9ICgoZG91YmxlKWJ5dGVzKS8oMTAyNGQqMTAyNGQpOworICAgICAgICBtc2dSeENudC5hZGRBbmRHZXQoMSk7CisgICAgICAgIGlmICggbXNnUnhDbnQuZ2V0KCkgJSBpbnRlcnZhbCA9PSAwICkgcmVwb3J0KHRpbWVUeCk7CisgICAgICAgIHN1cGVyLm1lc3NhZ2VSZWNlaXZlZChtc2cpOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcmVwb3J0KGRvdWJsZSB0aW1lVHgpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIlRocm91Z2hwdXRJbnRlcmNlcHRvciBSZXBvcnRbXG5cdFR4IE1zZzoiKTsKKyAgICAgICAgYnVmLmFwcGVuZChtc2dUeENudCkuYXBwZW5kKCIgbWVzc2FnZXNcblx0U2VudDoiKTsKKyAgICAgICAgYnVmLmFwcGVuZChkZi5mb3JtYXQobWJUeCkpOworICAgICAgICBidWYuYXBwZW5kKCIgTUIgKHRvdGFsKVxuXHRTZW50OiIpOworICAgICAgICBidWYuYXBwZW5kKGRmLmZvcm1hdChtYkFwcFR4KSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiBNQiAoYXBwbGljYXRpb24pXG5cdFRpbWU6Iik7CisgICAgICAgIGJ1Zi5hcHBlbmQoZGYuZm9ybWF0KHRpbWVUeCkpOworICAgICAgICBidWYuYXBwZW5kKCIgc2Vjb25kc1xuXHRUeCBTcGVlZDoiKTsKKyAgICAgICAgYnVmLmFwcGVuZChkZi5mb3JtYXQobWJUeC90aW1lVHgpKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiIE1CL3NlYyAodG90YWwpXG5cdFR4U3BlZWQ6Iik7CisgICAgICAgIGJ1Zi5hcHBlbmQoZGYuZm9ybWF0KG1iQXBwVHgvdGltZVR4KSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiBNQi9zZWMgKGFwcGxpY2F0aW9uKVxuXHRFcnJvciBNc2c6Iik7CisgICAgICAgIGJ1Zi5hcHBlbmQobXNnVHhFcnIpLmFwcGVuZCgiXG5cdFJ4IE1zZzoiKTsKKyAgICAgICAgYnVmLmFwcGVuZChtc2dSeENudCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiBtZXNzYWdlc1xuXHRSeCBTcGVlZDoiKTsKKyAgICAgICAgYnVmLmFwcGVuZChkZi5mb3JtYXQobWJSeC8oKGRvdWJsZSkoKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXJ4U3RhcnQpLzEwMDApKSkpOworICAgICAgICBidWYuYXBwZW5kKCIgTUIvc2VjIChzaW5jZSAxc3QgbXNnKVxuXHRSZWNlaXZlZDoiKTsKKyAgICAgICAgYnVmLmFwcGVuZChkZi5mb3JtYXQobWJSeCkpLmFwcGVuZCgiIE1CXVxuIik7CisgICAgICAgIGlmICggbG9nLmlzSW5mb0VuYWJsZWQoKSApIGxvZy5pbmZvKGJ1Zik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEludGVydmFsKGludCBpbnRlcnZhbCkgeworICAgICAgICB0aGlzLmludGVydmFsID0gaW50ZXJ2YWw7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJbnRlcnZhbCgpIHsKKyAgICAgICAgcmV0dXJuIGludGVydmFsOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL2ludGVyY2VwdG9ycy9Ud29QaGFzZUNvbW1pdEludGVyY2VwdG9yLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZ3JvdXAvaW50ZXJjZXB0b3JzL1R3b1BoYXNlQ29tbWl0SW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTM1NzQwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2dyb3VwL2ludGVyY2VwdG9ycy9Ud29QaGFzZUNvbW1pdEludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5DaGFubmVsSW50ZXJjZXB0b3JCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkludGVyY2VwdG9yUGF5bG9hZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy51dGlsLlVVSURHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbC5BcnJheXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuVW5pcXVlSWQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiA8cD5UaXRsZTogPC9wPgorICoKKyAqIDxwPkRlc2NyaXB0aW9uOiA8L3A+CisgKgorICogPHA+Q29weXJpZ2h0OiBDb3B5cmlnaHQgKGMpIDIwMDU8L3A+CisgKgorICogPHA+Q29tcGFueTogPC9wPgorICoKKyAqIEBhdXRob3Igbm90IGF0dHJpYnV0YWJsZQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBUd29QaGFzZUNvbW1pdEludGVyY2VwdG9yIGV4dGVuZHMgQ2hhbm5lbEludGVyY2VwdG9yQmFzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBTVEFSVF9EQVRBID0gbmV3IGJ5dGVbXSB7MTEzLCAxLCAtNTgsIDIsIC0zNCwgLTYwLCA3NSwgLTc4LCAtMTAxLCAtMTIsIDMyLCAtMjksIDMyLCAxMTEsIC00MCwgNH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gRU5EX0RBVEEgPSBuZXcgYnl0ZVtdIHs1NCwgLTEzLCA5MCwgMTEwLCA0NywgLTMxLCA3NSwgLTI0LCAtODEsIC0yOSwgMzYsIDUyLCAtNTgsIDc3LCAtMTEwLCA1Nn07CisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKFR3b1BoYXNlQ29tbWl0SW50ZXJjZXB0b3IuY2xhc3MpOworCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgbWVzc2FnZXMgPSBuZXcgSGFzaE1hcCgpOworICAgIHByb3RlY3RlZCBsb25nIGV4cGlyZSA9IDEwMDAgKiA2MDsgLy9vbmUgbWludXRlIGV4cGlyYXRpb24KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZWVwY2xvbmUgPSB0cnVlOworCisgICAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoTWVtYmVyW10gZGVzdGluYXRpb24sIENoYW5uZWxNZXNzYWdlIG1zZywgSW50ZXJjZXB0b3JQYXlsb2FkIHBheWxvYWQpIHRocm93cworICAgICAgICBDaGFubmVsRXhjZXB0aW9uIHsKKyAgICAgICAgLy90b2RvLCBvcHRpbWl6ZSwgaWYgZGVzdGluYXRpb24ubGVuZ3RoPT0xLCB0aGVuIHdlIGNhbiBkbworICAgICAgICAvL21zZy5zZXRPcHRpb25zKG1zZy5nZXRPcHRpb25zKCkgJiAofmdldE9wdGlvbkZsYWcoKSkKKyAgICAgICAgLy9hbmQganVzdCBzZW5kIG9uZSBtZXNzYWdlCisgICAgICAgIGlmIChva1RvUHJvY2Vzcyhtc2cuZ2V0T3B0aW9ucygpKSApIHsKKyAgICAgICAgICAgIHN1cGVyLnNlbmRNZXNzYWdlKGRlc3RpbmF0aW9uLCBtc2csIG51bGwpOworICAgICAgICAgICAgQ2hhbm5lbE1lc3NhZ2UgY29uZmlybWF0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIGlmICggZGVlcGNsb25lICkgY29uZmlybWF0aW9uID0gKENoYW5uZWxNZXNzYWdlKW1zZy5kZWVwY2xvbmUoKTsKKyAgICAgICAgICAgIGVsc2UgY29uZmlybWF0aW9uID0gKENoYW5uZWxNZXNzYWdlKW1zZy5jbG9uZSgpOworICAgICAgICAgICAgY29uZmlybWF0aW9uLmdldE1lc3NhZ2UoKS5yZXNldCgpOworICAgICAgICAgICAgVVVJREdlbmVyYXRvci5yYW5kb21VVUlEKGZhbHNlLGNvbmZpcm1hdGlvbi5nZXRVbmlxdWVJZCgpLDApOworICAgICAgICAgICAgY29uZmlybWF0aW9uLmdldE1lc3NhZ2UoKS5hcHBlbmQoU1RBUlRfREFUQSwwLFNUQVJUX0RBVEEubGVuZ3RoKTsKKyAgICAgICAgICAgIGNvbmZpcm1hdGlvbi5nZXRNZXNzYWdlKCkuYXBwZW5kKG1zZy5nZXRVbmlxdWVJZCgpLDAsbXNnLmdldFVuaXF1ZUlkKCkubGVuZ3RoKTsKKyAgICAgICAgICAgIGNvbmZpcm1hdGlvbi5nZXRNZXNzYWdlKCkuYXBwZW5kKEVORF9EQVRBLDAsRU5EX0RBVEEubGVuZ3RoKTsKKyAgICAgICAgICAgIHN1cGVyLnNlbmRNZXNzYWdlKGRlc3RpbmF0aW9uLGNvbmZpcm1hdGlvbixwYXlsb2FkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vdHVybiBvZmYgdHdvIHBoYXNlIGNvbW1pdAorICAgICAgICAgICAgLy90aGlzIHdvbnQgd29yayBpZiB0aGUgaW50ZXJjZXB0b3IgaGFzIDAgYXMgYSBmbGFnCisgICAgICAgICAgICAvL3NpbmNlIHRoZXJlIGlzIG5vIGZsYWcgdG8gdHVybiBvZmYKKyAgICAgICAgICAgIC8vbXNnLnNldE9wdGlvbnMobXNnLmdldE9wdGlvbnMoKSAmICh+Z2V0T3B0aW9uRmxhZygpKSk7CisgICAgICAgICAgICBzdXBlci5zZW5kTWVzc2FnZShkZXN0aW5hdGlvbiwgbXNnLCBwYXlsb2FkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZWNlaXZlZChDaGFubmVsTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgaWYgKG9rVG9Qcm9jZXNzKG1zZy5nZXRPcHRpb25zKCkpKSB7CisgICAgICAgICAgICBpZiAoIG1zZy5nZXRNZXNzYWdlKCkuZ2V0TGVuZ3RoKCkgPT0gKFNUQVJUX0RBVEEubGVuZ3RoK21zZy5nZXRVbmlxdWVJZCgpLmxlbmd0aCtFTkRfREFUQS5sZW5ndGgpICYmCisgICAgICAgICAgICAgICAgIEFycmF5cy5jb250YWlucyhtc2cuZ2V0TWVzc2FnZSgpLmdldEJ5dGVzRGlyZWN0KCksMCxTVEFSVF9EQVRBLDAsU1RBUlRfREFUQS5sZW5ndGgpICYmCisgICAgICAgICAgICAgICAgIEFycmF5cy5jb250YWlucyhtc2cuZ2V0TWVzc2FnZSgpLmdldEJ5dGVzRGlyZWN0KCksU1RBUlRfREFUQS5sZW5ndGgrbXNnLmdldFVuaXF1ZUlkKCkubGVuZ3RoLEVORF9EQVRBLDAsRU5EX0RBVEEubGVuZ3RoKSApIHsKKyAgICAgICAgICAgICAgICBVbmlxdWVJZCBpZCA9IG5ldyBVbmlxdWVJZChtc2cuZ2V0TWVzc2FnZSgpLmdldEJ5dGVzRGlyZWN0KCksU1RBUlRfREFUQS5sZW5ndGgsbXNnLmdldFVuaXF1ZUlkKCkubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBNYXBFbnRyeSBvcmlnaW5hbCA9IChNYXBFbnRyeSltZXNzYWdlcy5nZXQoaWQpOworICAgICAgICAgICAgICAgIGlmICggb3JpZ2luYWwgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIubWVzc2FnZVJlY2VpdmVkKG9yaWdpbmFsLm1zZyk7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnJlbW92ZShpZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGxvZy53YXJuKCJSZWNlaXZlZCBhIGNvbmZpcm1hdGlvbiwgYnV0IG9yaWdpbmFsIG1lc3NhZ2UgaXMgbWlzc2luZy4gSWQ6IitBcnJheXMudG9TdHJpbmcoaWQuZ2V0Qnl0ZXMoKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBVbmlxdWVJZCBpZCA9IG5ldyBVbmlxdWVJZChtc2cuZ2V0VW5pcXVlSWQoKSk7CisgICAgICAgICAgICAgICAgTWFwRW50cnkgZW50cnkgPSBuZXcgTWFwRW50cnkoKENoYW5uZWxNZXNzYWdlKW1zZy5kZWVwY2xvbmUoKSxpZCxTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgbWVzc2FnZXMucHV0KGlkLGVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLm1lc3NhZ2VSZWNlaXZlZChtc2cpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGVlcGNsb25lKCkgeworICAgICAgICByZXR1cm4gZGVlcGNsb25lOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEV4cGlyZSgpIHsKKyAgICAgICAgcmV0dXJuIGV4cGlyZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWVwY2xvbmUoYm9vbGVhbiBkZWVwY2xvbmUpIHsKKyAgICAgICAgdGhpcy5kZWVwY2xvbmUgPSBkZWVwY2xvbmU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXhwaXJlKGxvbmcgZXhwaXJlKSB7CisgICAgICAgIHRoaXMuZXhwaXJlID0gZXhwaXJlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBoZWFydGJlYXQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgTWFwLkVudHJ5W10gZW50cmllcyA9IChNYXAuRW50cnlbXSltZXNzYWdlcy5lbnRyeVNldCgpLnRvQXJyYXkobmV3IE1hcC5FbnRyeVttZXNzYWdlcy5zaXplKCldKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxlbnRyaWVzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgIE1hcEVudHJ5IGVudHJ5ID0gKE1hcEVudHJ5KWVudHJpZXNbaV0uZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIGVudHJ5LmV4cGlyZWQobm93LGV4cGlyZSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJNZXNzYWdlIFsiK2VudHJ5LmlkKyJdIGhhcyBleHBpcmVkLiBSZW1vdmluZy4iKTsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucmVtb3ZlKGVudHJ5LmlkKTsKKyAgICAgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgbG9nLndhcm4oIlVuYWJsZSB0byBwZXJmb3JtIGhlYXJ0YmVhdCBvbiB0aGUgVHdvUGhhc2VDb21taXQgaW50ZXJjZXB0b3IuIix4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmhlYXJ0YmVhdCgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFwRW50cnkgeworICAgICAgICBwdWJsaWMgQ2hhbm5lbE1lc3NhZ2UgbXNnOworICAgICAgICBwdWJsaWMgVW5pcXVlSWQgaWQ7CisgICAgICAgIHB1YmxpYyBsb25nIHRpbWVzdGFtcDsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBNYXBFbnRyeShDaGFubmVsTWVzc2FnZSBtc2csIFVuaXF1ZUlkIGlkLCBsb25nIHRpbWVzdGFtcCkgeworICAgICAgICAgICAgdGhpcy5tc2cgPSBtc2c7CisgICAgICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBleHBpcmVkKGxvbmcgbm93LCBsb25nIGV4cGlyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAobm93IC0gdGltZXN0YW1wICkgPiBleHBpcmF0aW9uOworICAgICAgICB9CisKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvaW8vQnVmZmVyUG9vbC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2lvL0J1ZmZlclBvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjEwOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2lvL0J1ZmZlclBvb2wuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKKworLyoqCisgKgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIEJ1ZmZlclBvb2wgeworICAgIHByb3RlY3RlZCBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJ1ZmZlclBvb2wuY2xhc3MpOworCisgICAgcHVibGljIHN0YXRpYyBpbnQgREVGQVVMVF9QT09MX1NJWkUgPSAxMDAqMTAyNCoxMDI0OyAvLzEwME1CCisKKworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBCdWZmZXJQb29sIGluc3RhbmNlID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgQnVmZmVyUG9vbEFQSSBwb29sID0gbnVsbDsKKworICAgIHByaXZhdGUgQnVmZmVyUG9vbChCdWZmZXJQb29sQVBJIHBvb2wpIHsKKyAgICAgICAgdGhpcy5wb29sID0gcG9vbDsKKyAgICB9CisKKyAgICBwdWJsaWMgWEJ5dGVCdWZmZXIgZ2V0QnVmZmVyKGludCBtaW5TaXplLCBib29sZWFuIGRpc2NhcmQpIHsKKyAgICAgICAgaWYgKCBwb29sICE9IG51bGwgKSByZXR1cm4gcG9vbC5nZXRCdWZmZXIobWluU2l6ZSwgZGlzY2FyZCk7CisgICAgICAgIGVsc2UgcmV0dXJuIG5ldyBYQnl0ZUJ1ZmZlcihtaW5TaXplLGRpc2NhcmQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJldHVybkJ1ZmZlcihYQnl0ZUJ1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgaWYgKCBwb29sICE9IG51bGwgKSBwb29sLnJldHVybkJ1ZmZlcihidWZmZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBpZiAoIHBvb2wgIT0gbnVsbCApIHBvb2wuY2xlYXIoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgQnVmZmVyUG9vbCBnZXRCdWZmZXJQb29sKCkgeworICAgICAgICBpZiAoICAoaW5zdGFuY2UgPT0gbnVsbCkgKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEJ1ZmZlclBvb2wuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICBpZiAoIGluc3RhbmNlID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgQnVmZmVyUG9vbEFQSSBwb29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pby5CdWZmZXJQb29sMTVJbXBsIik7CisgICAgICAgICAgICAgICAgICAgICAgIHBvb2wgPSAoQnVmZmVyUG9vbEFQSSljbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKCBUaHJvd2FibGUgeCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uQnVmZmVyUG9vbDE0SW1wbCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCA9IChCdWZmZXJQb29sQVBJKWNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKCBUaHJvd2FibGUgZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJVbmFibGUgdG8gaW5pdGlsaXplIEJ1ZmZlclBvb2wsIG5vdCBwb29saW5nIFhCeXRlQnVmZmVyIG9iamVjdHM6Iit4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgbG9nLmRlYnVnKCJVbmFibGUgdG8gaW5pdGlsaXplIEJ1ZmZlclBvb2wsIG5vdCBwb29saW5nIFhCeXRlQnVmZmVyIG9iamVjdHM6Iix4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBwb29sLnNldE1heFNpemUoREVGQVVMVF9QT09MX1NJWkUpOworICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJDcmVhdGVkIGEgYnVmZmVyIHBvb2wgd2l0aCBtYXggc2l6ZToiK0RFRkFVTFRfUE9PTF9TSVpFKyIgYnl0ZXMgb2YgdHlwZToiKyhjbGF6eiE9bnVsbD9jbGF6ei5nZXROYW1lKCk6Im51bGwiKSk7CisgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgQnVmZmVyUG9vbChwb29sKTsKKyAgICAgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgIH0vL3N5bmMKKyAgICAgICAgfS8vZW5kIGlmCisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEJ1ZmZlclBvb2xBUEkgeworICAgICAgICBwdWJsaWMgdm9pZCBzZXRNYXhTaXplKGludCBieXRlcyk7CisKKyAgICAgICAgcHVibGljIFhCeXRlQnVmZmVyIGdldEJ1ZmZlcihpbnQgbWluU2l6ZSwgYm9vbGVhbiBkaXNjYXJkKTsKKworICAgICAgICBwdWJsaWMgdm9pZCByZXR1cm5CdWZmZXIoWEJ5dGVCdWZmZXIgYnVmZmVyKTsKKworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpOworICAgIH0gICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvaW8vQnVmZmVyUG9vbDE0SW1wbC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2lvL0J1ZmZlclBvb2wxNEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWM2OTZkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2lvL0J1ZmZlclBvb2wxNEltcGwuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvOworCitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCisKKy8qKgorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCitjbGFzcyBCdWZmZXJQb29sMTRJbXBsIGltcGxlbWVudHMgQnVmZmVyUG9vbC5CdWZmZXJQb29sQVBJIHsKKyAgICBwcm90ZWN0ZWQgaW50IG1heFNpemU7CisgICAgcHJvdGVjdGVkIGludCBzaXplID0gMDsKKyAgICBwcm90ZWN0ZWQgTGlua2VkTGlzdCBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhTaXplKGludCBieXRlcykgeworICAgICAgICB0aGlzLm1heFNpemUgPSBieXRlczsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgYWRkQW5kR2V0KGludCB2YWwpIHsKKyAgICAgICAgc2l6ZSA9IHNpemUgKyAodmFsKTsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorICAgIAorICAgIAorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBYQnl0ZUJ1ZmZlciBnZXRCdWZmZXIoaW50IG1pblNpemUsIGJvb2xlYW4gZGlzY2FyZCkgeworICAgICAgICBYQnl0ZUJ1ZmZlciBidWZmZXIgPSAoWEJ5dGVCdWZmZXIpKHF1ZXVlLnNpemUoKT4wP3F1ZXVlLnJlbW92ZSgwKTpudWxsKTsKKyAgICAgICAgaWYgKCBidWZmZXIgIT0gbnVsbCApIGFkZEFuZEdldCgtYnVmZmVyLmdldENhcGFjaXR5KCkpOworICAgICAgICBpZiAoIGJ1ZmZlciA9PSBudWxsICkgYnVmZmVyID0gbmV3IFhCeXRlQnVmZmVyKG1pblNpemUsZGlzY2FyZCk7CisgICAgICAgIGVsc2UgaWYgKCBidWZmZXIuZ2V0Q2FwYWNpdHkoKSA8PSBtaW5TaXplICkgYnVmZmVyLmV4cGFuZChtaW5TaXplKTsKKyAgICAgICAgYnVmZmVyLnNldERpc2NhcmQoZGlzY2FyZCk7CisgICAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgICAgICByZXR1cm4gYnVmZmVyOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXR1cm5CdWZmZXIoWEJ5dGVCdWZmZXIgYnVmZmVyKSB7CisgICAgICAgIGlmICggKHNpemUgKyBidWZmZXIuZ2V0Q2FwYWNpdHkoKSkgPD0gbWF4U2l6ZSApIHsKKyAgICAgICAgICAgIGFkZEFuZEdldChidWZmZXIuZ2V0Q2FwYWNpdHkoKSk7CisgICAgICAgICAgICBxdWV1ZS5hZGQoYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgcXVldWUuY2xlYXIoKTsKKyAgICAgICAgc2l6ZSA9IDA7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYXhTaXplKCkgeworICAgICAgICByZXR1cm4gbWF4U2l6ZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9pby9CdWZmZXJQb29sMTVJbXBsLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvaW8vQnVmZmVyUG9vbDE1SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZDMyZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvaW8vQnVmZmVyUG9vbDE1SW1wbC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW87CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKKy8qKgorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCitjbGFzcyBCdWZmZXJQb29sMTVJbXBsIGltcGxlbWVudHMgQnVmZmVyUG9vbC5CdWZmZXJQb29sQVBJIHsKKyAgICBwcm90ZWN0ZWQgaW50IG1heFNpemU7CisgICAgcHJvdGVjdGVkIEF0b21pY0ludGVnZXIgc2l6ZSA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgIHByb3RlY3RlZCBDb25jdXJyZW50TGlua2VkUXVldWUgcXVldWUgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlKCk7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhTaXplKGludCBieXRlcykgeworICAgICAgICB0aGlzLm1heFNpemUgPSBieXRlczsKKyAgICB9CisKKworICAgIHB1YmxpYyBYQnl0ZUJ1ZmZlciBnZXRCdWZmZXIoaW50IG1pblNpemUsIGJvb2xlYW4gZGlzY2FyZCkgeworICAgICAgICBYQnl0ZUJ1ZmZlciBidWZmZXIgPSAoWEJ5dGVCdWZmZXIpcXVldWUucG9sbCgpOworICAgICAgICBpZiAoIGJ1ZmZlciAhPSBudWxsICkgc2l6ZS5hZGRBbmRHZXQoLWJ1ZmZlci5nZXRDYXBhY2l0eSgpKTsKKyAgICAgICAgaWYgKCBidWZmZXIgPT0gbnVsbCApIGJ1ZmZlciA9IG5ldyBYQnl0ZUJ1ZmZlcihtaW5TaXplLGRpc2NhcmQpOworICAgICAgICBlbHNlIGlmICggYnVmZmVyLmdldENhcGFjaXR5KCkgPD0gbWluU2l6ZSApIGJ1ZmZlci5leHBhbmQobWluU2l6ZSk7CisgICAgICAgIGJ1ZmZlci5zZXREaXNjYXJkKGRpc2NhcmQpOworICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXR1cm5CdWZmZXIoWEJ5dGVCdWZmZXIgYnVmZmVyKSB7CisgICAgICAgIGlmICggKHNpemUuZ2V0KCkgKyBidWZmZXIuZ2V0Q2FwYWNpdHkoKSkgPD0gbWF4U2l6ZSApIHsKKyAgICAgICAgICAgIHNpemUuYWRkQW5kR2V0KGJ1ZmZlci5nZXRDYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIHF1ZXVlLm9mZmVyKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgcXVldWUuY2xlYXIoKTsKKyAgICAgICAgc2l6ZS5zZXQoMCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYXhTaXplKCkgeworICAgICAgICByZXR1cm4gbWF4U2l6ZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9pby9DaGFubmVsRGF0YS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2lvL0NoYW5uZWxEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmNWQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9pby9DaGFubmVsRGF0YS5qYXZhCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW87CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLm1lbWJlcnNoaXAuTWVtYmVySW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy51dGlsLlVVSURHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CisKKy8qKgorICogVGhlIDxjb2RlPkNoYW5uZWxEYXRhPC9jb2RlPiBvYmplY3QgaXMgdXNlZCB0byB0cmFuc2ZlciBhIG1lc3NhZ2UgdGhyb3VnaCB0aGUgCisgKiBjaGFubmVsIGludGVyY2VwdG9yIHN0YWNrIGFuZCBldmVudHVhbGx5IG91dCBvbiBhIHRyYW5zcG9ydCB0byBiZSBzZW50IAorICogdG8gYW5vdGhlciBub2RlLiBXaGlsZSB0aGUgbWVzc2FnZSBpcyBiZWluZyBwcm9jZXNzZWQgYnkgdGhlIGRpZmZlcmVudCAKKyAqIGludGVyY2VwdG9ycywgdGhlIG1lc3NhZ2UgZGF0YSBjYW4gYmUgbWFuaXB1bGF0ZWQgYXMgZWFjaCBpbnRlcmNlcHRvciBzZWVtcyBhcHByb3ByaWF0ZS4KKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiAKKyAqLworcHVibGljIGNsYXNzIENoYW5uZWxEYXRhIGltcGxlbWVudHMgQ2hhbm5lbE1lc3NhZ2UgeworICAgIHB1YmxpYyBzdGF0aWMgQ2hhbm5lbERhdGFbXSBFTVBUWV9EQVRBX0FSUkFZID0gbmV3IENoYW5uZWxEYXRhWzBdOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBVU0VfU0VDVVJFX1JBTkRPTV9GT1JfVVVJRCA9IGZhbHNlOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBvcHRpb25zIHRoaXMgbWVzc2FnZSB3YXMgc2VudCB3aXRoCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgb3B0aW9ucyA9IDAgOworICAgIC8qKgorICAgICAqIFRoZSBtZXNzYWdlIGRhdGEsIHN0b3JlZCBpbiBhIGR5bmFtaWMgYnVmZmVyCisgICAgICovCisgICAgcHJpdmF0ZSBYQnl0ZUJ1ZmZlciBtZXNzYWdlIDsKKyAgICAvKioKKyAgICAgKiBUaGUgdGltZXN0YW1wIHRoYXQgZ29lcyB3aXRoIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHByaXZhdGUgbG9uZyB0aW1lc3RhbXAgOworICAgIC8qKgorICAgICAqIEEgdW5pcXVlIG1lc3NhZ2UgaWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJ5dGVbXSB1bmlxdWVJZCA7CisgICAgLyoqCisgICAgICogVGhlIHNvdXJjZSBvciByZXBseS10byBhZGRyZXNzIGZvciB0aGlzIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIE1lbWJlciBhZGRyZXNzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBjaGFubmVsIGRhdGEgd2l0aCBhIG5ldyB1bmlxdWUgSWQKKyAgICAgKiBAc2VlICNDaGFubmVsRGF0YShib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyBDaGFubmVsRGF0YSgpIHsKKyAgICAgICAgdGhpcyh0cnVlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGVtcHR5IGNoYW5uZWwgZGF0YSBvYmplY3QKKyAgICAgKiBAcGFyYW0gZ2VuZXJhdGVVVUlEIGJvb2xlYW4gLSBpZiB0cnVlLCBhIHVuaXF1ZSBJZCB3aWxsIGJlIGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyBDaGFubmVsRGF0YShib29sZWFuIGdlbmVyYXRlVVVJRCkgeworICAgICAgICBpZiAoIGdlbmVyYXRlVVVJRCApIGdlbmVyYXRlVVVJRCgpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGNoYW5uZWwgZGF0YSBvYmplY3Qgd2l0aCBkYXRhCisgICAgICogQHBhcmFtIHVuaXF1ZUlkIC0gdW5pcXVlIG1lc3NhZ2UgaWQKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIG1lc3NhZ2UgZGF0YQorICAgICAqIEBwYXJhbSB0aW1lc3RhbXAgLSBtZXNzYWdlIHRpbWVzdGFtcAorICAgICAqLworICAgIHB1YmxpYyBDaGFubmVsRGF0YShieXRlW10gdW5pcXVlSWQsIFhCeXRlQnVmZmVyIG1lc3NhZ2UsIGxvbmcgdGltZXN0YW1wKSB7CisgICAgICAgIHRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWVzc2FnZSBieXRlIGJ1ZmZlcgorICAgICAqLworICAgIHB1YmxpYyBYQnl0ZUJ1ZmZlciBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gc2VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFhCeXRlQnVmZmVyIG1lc3NhZ2UpIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCkgeworICAgICAgICByZXR1cm4gdGltZXN0YW1wOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wIFRoZSB0aW1lc3RhbXAgdG8gc2VuZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChsb25nIHRpbWVzdGFtcCkgeworICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB1bmlxdWVJZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldFVuaXF1ZUlkKCkgeworICAgICAgICByZXR1cm4gdW5pcXVlSWQ7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSB1bmlxdWVJZCBUaGUgdW5pcXVlSWQgdG8gc2VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChieXRlW10gdW5pcXVlSWQpIHsKKyAgICAgICAgdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG1lc3NhZ2Ugb3B0aW9ucyAKKyAgICAgKiBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbCNzZW5kTWVzc2FnZShvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXJbXSwgamF2YS5pby5TZXJpYWxpemFibGUsIGludCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE9wdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBvcHRpb25zOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc2V0cyB0aGUgbWVzc2FnZSBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3B0aW9ucyhpbnQgb3B0aW9ucykgeworICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2Ugb3IgcmVwbHktdG8gYWRkcmVzcworICAgICAqIEByZXR1cm4gTWVtYmVyCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBnZXRBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gYWRkcmVzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzb3VyY2Ugb3IgcmVwbHktdG8gYWRkcmVzcworICAgICAqIEBwYXJhbSBhZGRyZXNzIE1lbWJlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3MoTWVtYmVyIGFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIGEgVVVJRCBhbmQgaW52b2tlcyBzZXRVbmlxdWVJZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlVVVJRCgpIHsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVsxNl07CisgICAgICAgIFVVSURHZW5lcmF0b3IucmFuZG9tVVVJRChVU0VfU0VDVVJFX1JBTkRPTV9GT1JfVVVJRCxkYXRhLDApOworICAgICAgICBzZXRVbmlxdWVJZChkYXRhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERhdGFQYWNrYWdlTGVuZ3RoKCkgeworICAgICAgICBpbnQgbGVuZ3RoID0gCisgICAgICAgICAgICA0ICsgLy9vcHRpb25zCisgICAgICAgICAgICA4ICsgLy90aW1lc3RhbXAgIG9mZj00CisgICAgICAgICAgICA0ICsgLy91bmlxdWUgaWQgbGVuZ3RoIG9mZj0xMgorICAgICAgICAgICAgdW5pcXVlSWQubGVuZ3RoKyAvL2lkIGRhdGEgb2ZmPTEyK3VuaXF1ZUlkLmxlbmd0aAorICAgICAgICAgICAgNCArIC8vYWRkciBsZW5ndGggb2ZmPTEyK3VuaXF1ZUlkLmxlbmd0aCs0CisgICAgICAgICAgICAoKE1lbWJlckltcGwpYWRkcmVzcykuZ2V0RGF0YUxlbmd0aCgpKyAvL21lbWJlciBkYXRhIG9mZj0xMit1bmlxdWVJZC5sZW5ndGgrNCthZGQubGVuZ3RoCisgICAgICAgICAgICA0ICsgLy9tZXNzYWdlIGxlbmd0aCBvZmY9MTIrdW5pcXVlSWQubGVuZ3RoKzQrYWRkLmxlbmd0aCs0CisgICAgICAgICAgICBtZXNzYWdlLmdldExlbmd0aCgpOworICAgICAgICByZXR1cm4gbGVuZ3RoOworCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIENoYW5uZWxEYXRhIG9iamVjdCBpbnRvIGEgYnl0ZVtdIGFycmF5CisgICAgICogQHJldHVybiBieXRlW10KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldERhdGFQYWNrYWdlKCkgIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IGdldERhdGFQYWNrYWdlTGVuZ3RoKCk7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICAgIHJldHVybiBnZXREYXRhUGFja2FnZShkYXRhLG9mZnNldCk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBnZXREYXRhUGFja2FnZShieXRlW10gZGF0YSwgaW50IG9mZnNldCkgIHsKKyAgICAgICAgYnl0ZVtdIGFkZHIgPSAoKE1lbWJlckltcGwpYWRkcmVzcykuZ2V0RGF0YShmYWxzZSk7CisgICAgICAgIFhCeXRlQnVmZmVyLnRvQnl0ZXMob3B0aW9ucyxkYXRhLG9mZnNldCk7CisgICAgICAgIG9mZnNldCArPSA0OyAvL29wdGlvbnMKKyAgICAgICAgWEJ5dGVCdWZmZXIudG9CeXRlcyh0aW1lc3RhbXAsZGF0YSxvZmZzZXQpOworICAgICAgICBvZmZzZXQgKz0gODsgLy90aW1lc3RhbXAKKyAgICAgICAgWEJ5dGVCdWZmZXIudG9CeXRlcyh1bmlxdWVJZC5sZW5ndGgsZGF0YSxvZmZzZXQpOworICAgICAgICBvZmZzZXQgKz0gNDsgLy91bmlxdWVJZC5sZW5ndGgKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSh1bmlxdWVJZCwwLGRhdGEsb2Zmc2V0LHVuaXF1ZUlkLmxlbmd0aCk7CisgICAgICAgIG9mZnNldCArPSB1bmlxdWVJZC5sZW5ndGg7IC8vdW5pcXVlSWQgZGF0YQorICAgICAgICBYQnl0ZUJ1ZmZlci50b0J5dGVzKGFkZHIubGVuZ3RoLGRhdGEsb2Zmc2V0KTsKKyAgICAgICAgb2Zmc2V0ICs9IDQ7IC8vYWRkci5sZW5ndGgKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShhZGRyLDAsZGF0YSxvZmZzZXQsYWRkci5sZW5ndGgpOworICAgICAgICBvZmZzZXQgKz0gYWRkci5sZW5ndGg7IC8vYWRkciBkYXRhCisgICAgICAgIFhCeXRlQnVmZmVyLnRvQnl0ZXMobWVzc2FnZS5nZXRMZW5ndGgoKSxkYXRhLG9mZnNldCk7CisgICAgICAgIG9mZnNldCArPSA0OyAvL21lc3NhZ2UubGVuZ3RoCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobWVzc2FnZS5nZXRCeXRlc0RpcmVjdCgpLDAsZGF0YSxvZmZzZXQsbWVzc2FnZS5nZXRMZW5ndGgoKSk7CisgICAgICAgIG9mZnNldCArPSBtZXNzYWdlLmdldExlbmd0aCgpOyAvL21lc3NhZ2UgZGF0YQorICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIGEgQ2hhbm5lbERhdGEgb2JqZWN0IGZyb20gYSBieXRlIGFycmF5CisgICAgICogQHBhcmFtIGIgYnl0ZVtdCisgICAgICogQHJldHVybiBDaGFubmVsRGF0YQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2hhbm5lbERhdGEgZ2V0RGF0YUZyb21QYWNrYWdlKFhCeXRlQnVmZmVyIHhidWYpICB7CisgICAgICAgIENoYW5uZWxEYXRhIGRhdGEgPSBuZXcgQ2hhbm5lbERhdGEoZmFsc2UpOworICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgICAgZGF0YS5zZXRPcHRpb25zKFhCeXRlQnVmZmVyLnRvSW50KHhidWYuZ2V0Qnl0ZXNEaXJlY3QoKSxvZmZzZXQpKTsKKyAgICAgICAgb2Zmc2V0ICs9IDQ7IC8vb3B0aW9ucworICAgICAgICBkYXRhLnNldFRpbWVzdGFtcChYQnl0ZUJ1ZmZlci50b0xvbmcoeGJ1Zi5nZXRCeXRlc0RpcmVjdCgpLG9mZnNldCkpOworICAgICAgICBvZmZzZXQgKz0gODsgLy90aW1lc3RhbXAKKyAgICAgICAgZGF0YS51bmlxdWVJZCA9IG5ldyBieXRlW1hCeXRlQnVmZmVyLnRvSW50KHhidWYuZ2V0Qnl0ZXNEaXJlY3QoKSxvZmZzZXQpXTsKKyAgICAgICAgb2Zmc2V0ICs9IDQ7IC8vdW5pcXVlSWQgbGVuZ3RoCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoeGJ1Zi5nZXRCeXRlc0RpcmVjdCgpLG9mZnNldCxkYXRhLnVuaXF1ZUlkLDAsZGF0YS51bmlxdWVJZC5sZW5ndGgpOworICAgICAgICBvZmZzZXQgKz0gZGF0YS51bmlxdWVJZC5sZW5ndGg7IC8vdW5pcXVlSWQgZGF0YQorICAgICAgICBieXRlW10gYWRkciA9IG5ldyBieXRlW1hCeXRlQnVmZmVyLnRvSW50KHhidWYuZ2V0Qnl0ZXNEaXJlY3QoKSxvZmZzZXQpXTsKKyAgICAgICAgb2Zmc2V0ICs9IDQ7IC8vYWRkciBsZW5ndGgKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSh4YnVmLmdldEJ5dGVzRGlyZWN0KCksb2Zmc2V0LGFkZHIsMCxhZGRyLmxlbmd0aCk7CisgICAgICAgIGRhdGEuc2V0QWRkcmVzcyhNZW1iZXJJbXBsLmdldE1lbWJlcihhZGRyKSk7CisgICAgICAgIG9mZnNldCArPSBhZGRyLmxlbmd0aDsgLy9hZGRyIGRhdGEKKyAgICAgICAgaW50IHhzaXplID0gWEJ5dGVCdWZmZXIudG9JbnQoeGJ1Zi5nZXRCeXRlc0RpcmVjdCgpLG9mZnNldCk7CisgICAgICAgIG9mZnNldCArPSA0OyAvL3hzaXplIGxlbmd0aAorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHhidWYuZ2V0Qnl0ZXNEaXJlY3QoKSxvZmZzZXQseGJ1Zi5nZXRCeXRlc0RpcmVjdCgpLDAseHNpemUpOworICAgICAgICB4YnVmLnNldExlbmd0aCh4c2l6ZSk7CisgICAgICAgIGRhdGEubWVzc2FnZSA9IHhidWY7CisgICAgICAgIHJldHVybiBkYXRhOworCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDaGFubmVsRGF0YSBnZXREYXRhRnJvbVBhY2thZ2UoYnl0ZVtdIGIpICB7CisgICAgICAgIENoYW5uZWxEYXRhIGRhdGEgPSBuZXcgQ2hhbm5lbERhdGEoZmFsc2UpOworICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgICAgZGF0YS5zZXRPcHRpb25zKFhCeXRlQnVmZmVyLnRvSW50KGIsb2Zmc2V0KSk7CisgICAgICAgIG9mZnNldCArPSA0OyAvL29wdGlvbnMKKyAgICAgICAgZGF0YS5zZXRUaW1lc3RhbXAoWEJ5dGVCdWZmZXIudG9Mb25nKGIsb2Zmc2V0KSk7CisgICAgICAgIG9mZnNldCArPSA4OyAvL3RpbWVzdGFtcAorICAgICAgICBkYXRhLnVuaXF1ZUlkID0gbmV3IGJ5dGVbWEJ5dGVCdWZmZXIudG9JbnQoYixvZmZzZXQpXTsKKyAgICAgICAgb2Zmc2V0ICs9IDQ7IC8vdW5pcXVlSWQgbGVuZ3RoCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYixvZmZzZXQsZGF0YS51bmlxdWVJZCwwLGRhdGEudW5pcXVlSWQubGVuZ3RoKTsKKyAgICAgICAgb2Zmc2V0ICs9IGRhdGEudW5pcXVlSWQubGVuZ3RoOyAvL3VuaXF1ZUlkIGRhdGEKKyAgICAgICAgYnl0ZVtdIGFkZHIgPSBuZXcgYnl0ZVtYQnl0ZUJ1ZmZlci50b0ludChiLG9mZnNldCldOworICAgICAgICBvZmZzZXQgKz0gNDsgLy9hZGRyIGxlbmd0aAorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGIsb2Zmc2V0LGFkZHIsMCxhZGRyLmxlbmd0aCk7CisgICAgICAgIGRhdGEuc2V0QWRkcmVzcyhNZW1iZXJJbXBsLmdldE1lbWJlcihhZGRyKSk7CisgICAgICAgIG9mZnNldCArPSBhZGRyLmxlbmd0aDsgLy9hZGRyIGRhdGEKKyAgICAgICAgaW50IHhzaXplID0gWEJ5dGVCdWZmZXIudG9JbnQoYixvZmZzZXQpOworICAgICAgICAvL2RhdGEubWVzc2FnZSA9IG5ldyBYQnl0ZUJ1ZmZlcihuZXcgYnl0ZVt4c2l6ZV0sZmFsc2UpOworICAgICAgICBkYXRhLm1lc3NhZ2UgPSBCdWZmZXJQb29sLmdldEJ1ZmZlclBvb2woKS5nZXRCdWZmZXIoeHNpemUsZmFsc2UpOworICAgICAgICBvZmZzZXQgKz0gNDsgLy9tZXNzYWdlIGxlbmd0aAorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGIsb2Zmc2V0LGRhdGEubWVzc2FnZS5nZXRCeXRlc0RpcmVjdCgpLDAseHNpemUpOworICAgICAgICBkYXRhLm1lc3NhZ2UuYXBwZW5kKGIsb2Zmc2V0LHhzaXplKTsKKyAgICAgICAgb2Zmc2V0ICs9IHhzaXplOyAvL21lc3NhZ2UgZGF0YQorICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIFhCeXRlQnVmZmVyLnRvSW50KGdldFVuaXF1ZUlkKCksMCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbXBhcmVzIHRvIENoYW5uZWxEYXRhIG9iamVjdHMsIG9ubHkgY29tcGFyZXMgb24gZ2V0VW5pcXVlSWQoKS5lcXVhbHMoby5nZXRVbmlxdWVJZCgpKQorICAgICAqIEBwYXJhbSBvIE9iamVjdAorICAgICAqIEByZXR1cm4gYm9vbGVhbgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAoIG8gaW5zdGFuY2VvZiBDaGFubmVsRGF0YSApIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuZXF1YWxzKGdldFVuaXF1ZUlkKCksKChDaGFubmVsRGF0YSlvKS5nZXRVbmlxdWVJZCgpKTsKKyAgICAgICAgfSBlbHNlIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgc2hhbGxvdyBjbG9uZSwgb25seSB0aGUgZGF0YSBnZXRzIHJlY3JlYXRlZAorICAgICAqIEByZXR1cm4gQ2x1c3RlckRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworLy8gICAgICAgIGJ5dGVbXSBkID0gdGhpcy5nZXREYXRhUGFja2FnZSgpOworLy8gICAgICAgIHJldHVybiBDbHVzdGVyRGF0YS5nZXREYXRhRnJvbVBhY2thZ2UoZCk7CisgICAgICAgIENoYW5uZWxEYXRhIGNsb25lID0gbmV3IENoYW5uZWxEYXRhKGZhbHNlKTsKKyAgICAgICAgY2xvbmUub3B0aW9ucyA9IHRoaXMub3B0aW9uczsKKyAgICAgICAgY2xvbmUubWVzc2FnZSA9IG5ldyBYQnl0ZUJ1ZmZlcih0aGlzLm1lc3NhZ2UuZ2V0Qnl0ZXNEaXJlY3QoKSxmYWxzZSk7CisgICAgICAgIGNsb25lLnRpbWVzdGFtcCA9IHRoaXMudGltZXN0YW1wOworICAgICAgICBjbG9uZS51bmlxdWVJZCA9IHRoaXMudW5pcXVlSWQ7CisgICAgICAgIGNsb25lLmFkZHJlc3MgPSB0aGlzLmFkZHJlc3M7CisgICAgICAgIHJldHVybiBjbG9uZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29tcGxldGUgY2xvbmUKKyAgICAgKiBAcmV0dXJuIENsdXN0ZXJEYXRhCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBkZWVwY2xvbmUoKSB7CisgICAgICAgIGJ5dGVbXSBkID0gdGhpcy5nZXREYXRhUGFja2FnZSgpOworICAgICAgICByZXR1cm4gQ2hhbm5lbERhdGEuZ2V0RGF0YUZyb21QYWNrYWdlKGQpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCwgcmV0dXJucyB0cnVlIGlmIHRoZSBvcHRpb25zIGZsYWcgaW5kaWNhdGVzIHRoYXQgYW4gYWNrCisgICAgICogaXMgdG8gYmUgc2VudCBhZnRlciB0aGUgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIG9wdGlvbnMgaW50IC0gdGhlIG9wdGlvbnMgZm9yIHRoZSBtZXNzYWdlCisgICAgICogQHJldHVybiBib29sZWFuIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbCNTRU5EX09QVElPTlNfVVNFX0FDSworICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbCNTRU5EX09QVElPTlNfU1lOQ0hST05JWkVEX0FDSworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZW5kQWNrU3luYyhpbnQgb3B0aW9ucykgeworICAgICAgICByZXR1cm4gKCAoQ2hhbm5lbC5TRU5EX09QVElPTlNfVVNFX0FDSyAmIG9wdGlvbnMpID09IENoYW5uZWwuU0VORF9PUFRJT05TX1VTRV9BQ0spICYmCisgICAgICAgICAgICAoIChDaGFubmVsLlNFTkRfT1BUSU9OU19TWU5DSFJPTklaRURfQUNLICYgb3B0aW9ucykgPT0gQ2hhbm5lbC5TRU5EX09QVElPTlNfU1lOQ0hST05JWkVEX0FDSyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCwgcmV0dXJucyB0cnVlIGlmIHRoZSBvcHRpb25zIGZsYWcgaW5kaWNhdGVzIHRoYXQgYW4gYWNrCisgICAgICogaXMgdG8gYmUgc2VudCBhZnRlciB0aGUgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZCBidXQgbm90IHlldCBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBpbnQgLSB0aGUgb3B0aW9ucyBmb3IgdGhlIG1lc3NhZ2UKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsI1NFTkRfT1BUSU9OU19VU0VfQUNLCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsI1NFTkRfT1BUSU9OU19TWU5DSFJPTklaRURfQUNLCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNlbmRBY2tBc3luYyhpbnQgb3B0aW9ucykgeworICAgICAgICByZXR1cm4gKCAoQ2hhbm5lbC5TRU5EX09QVElPTlNfVVNFX0FDSyAmIG9wdGlvbnMpID09IENoYW5uZWwuU0VORF9PUFRJT05TX1VTRV9BQ0spICYmCisgICAgICAgICAgICAoIChDaGFubmVsLlNFTkRfT1BUSU9OU19TWU5DSFJPTklaRURfQUNLICYgb3B0aW9ucykgIT0gQ2hhbm5lbC5TRU5EX09QVElPTlNfU1lOQ0hST05JWkVEX0FDSyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIkNsdXN0ZXJEYXRhW3NyYz0iKTsKKyAgICAgICAgYnVmLmFwcGVuZChnZXRBZGRyZXNzKCkpLmFwcGVuZCgiOyBpZD0iKTsKKyAgICAgICAgYnVmLmFwcGVuZChiVG9TKGdldFVuaXF1ZUlkKCkpKS5hcHBlbmQoIjsgc2VudD0iKTsKKyAgICAgICAgYnVmLmFwcGVuZChuZXcgVGltZXN0YW1wKHRoaXMuZ2V0VGltZXN0YW1wKCkpLnRvU3RyaW5nKCkpLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJUb1MoYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoNCoxNik7CisgICAgICAgIGJ1Zi5hcHBlbmQoInsiKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBkYXRhIT1udWxsICYmIGk8ZGF0YS5sZW5ndGg7IGkrKyApIGJ1Zi5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoZGF0YVtpXSkpLmFwcGVuZCgiICIpOworICAgICAgICBidWYuYXBwZW5kKCJ9Iik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9pby9EaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9pby9EaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjkwOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2lvL0RpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pbzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKKy8qKgorICogQnl0ZSBhcnJheSBvdXRwdXQgc3RyZWFtIHRoYXQgZXhwb3NlcyB0aGUgYnl0ZSBhcnJheSBkaXJlY3RseQorICoKKyAqIEBhdXRob3Igbm90IGF0dHJpYnV0YWJsZQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworICAgIAorICAgIHByaXZhdGUgWEJ5dGVCdWZmZXIgYnVmZmVyOworICAgIAorICAgIHB1YmxpYyBEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0oaW50IHNpemUpIHsKKyAgICAgICAgYnVmZmVyID0gbmV3IFhCeXRlQnVmZmVyKHNpemUsZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIGJ5dGUgdG8gdGhpcyBvdXRwdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGIgdGhlIDxjb2RlPmJ5dGU8L2NvZGU+LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4gSW4gcGFydGljdWxhciwgYW4KKyAgICAgKiAgIDxjb2RlPklPRXhjZXB0aW9uPC9jb2RlPiBtYXkgYmUgdGhyb3duIGlmIHRoZSBvdXRwdXQgc3RyZWFtIGhhcworICAgICAqICAgYmVlbiBjbG9zZWQuCisgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgamF2YS5pby5PdXRwdXRTdHJlYW0gbWV0aG9kCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGJ5dGUpYik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci5nZXRMZW5ndGgoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJ5dGVbXSBnZXRBcnJheURpcmVjdCgpIHsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci5nZXRCeXRlc0RpcmVjdCgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYnl0ZVtdIGdldEFycmF5KCkgeworICAgICAgICByZXR1cm4gYnVmZmVyLmdldEJ5dGVzKCk7CisgICAgfQorCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvaW8vTGlzdGVuQ2FsbGJhY2suamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9pby9MaXN0ZW5DYWxsYmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4M2Q1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvaW8vTGlzdGVuQ2FsbGJhY2suamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pbzsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxNZXNzYWdlOworCisKKworLyoqCisgKiBJbnRlcm5hbCBpbnRlcmZhY2UsIHNpbWlsYXIgdG8gdGhlIE1lc3NhZ2VMaXN0ZW5lciBidXQgdXNlZCAKKyAqIGF0IHRoZSBJTyBiYXNlCisgKiBUaGUgbGlzdGVuIGNhbGxiYWNrIGludGVyZmFjZSBpcyB1c2VkIGJ5IHRoZSByZXBsaWNhdGlvbiBzeXN0ZW0KKyAqIHdoZW4gZGF0YSBoYXMgYmVlbiByZWNlaXZlZC4gVGhlIGludGVyZmFjZSBkb2VzIG5vdCBjYXJlIGFib3V0CisgKiBvYmplY3RzIGFuZCBtYXJzaGFsbGluZyBhbmQganVzdCBwYXNzZXMgdGhlIGJ5dGVzIHN0cmFpZ2h0IHRocm91Z2guCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGludGVyZmFjZSBMaXN0ZW5DYWxsYmFjaworeworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgb24gdGhlIGNhbGxiYWNrIG9iamVjdCB0byBub3RpZnkgaXQgdGhhdCBuZXcgZGF0YSBoYXMKKyAgICAgKiBiZWVuIHJlY2VpdmVkIGZyb20gb25lIG9mIHRoZSBjbHVzdGVyIG5vZGVzLgorICAgICAqIEBwYXJhbSBkYXRhIC0gdGhlIG1lc3NhZ2UgYnl0ZXMgcmVjZWl2ZWQgZnJvbSB0aGUgY2x1c3Rlci9yZXBsaWNhdGlvbiBzeXN0ZW0KKyAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgbWVzc2FnZURhdGFSZWNlaXZlZChDaGFubmVsTWVzc2FnZSBkYXRhKTsKKyAgICAgCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2lvL09iamVjdFJlYWRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2lvL09iamVjdFJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZmU2YjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvaW8vT2JqZWN0UmVhZGVyLmphdmEKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pbzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxNZXNzYWdlOworCisKKworLyoqCisgKiBUaGUgb2JqZWN0IHJlYWRlciBvYmplY3QgaXMgYW4gb2JqZWN0IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAorICogamF2YS5uaW8gVENQIG1lc3NhZ2VzLiBUaGlzIG9iamVjdCBzdG9yZXMgdGhlIG1lc3NhZ2UgYnl0ZXMgaW4gYQorICogPGNvZGU+WEJ5dGVCdWZmZXI8L2NvZGU+IHVudGlsIGEgZnVsbCBwYWNrYWdlIGhhcyBiZWVuIHJlY2VpdmVkLgorICogVGhpcyBvYmplY3QgdXNlcyBhbiBYQnl0ZUJ1ZmZlciB3aGljaCBpcyBhbiBleHRlbmRhYmxlIG9iamVjdCBidWZmZXIgdGhhdCBhbHNvIGFsbG93cworICogZm9yIG1lc3NhZ2UgZW5jb2RpbmcgYW5kIGRlY29kaW5nLgorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgT2JqZWN0UmVhZGVyIHsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKE9iamVjdFJlYWRlci5jbGFzcyk7CisKKyAgICBwcml2YXRlIFhCeXRlQnVmZmVyIGJ1ZmZlcjsKKyAgICAKKyAgICBwcm90ZWN0ZWQgbG9uZyBsYXN0QWNjZXNzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXNzZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gY2FuY2VsbGVkOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiA8Y29kZT5PYmplY3RSZWFkZXI8L2NvZGU+IGZvciBhIFRDUCBOSU8gc29ja2V0IGNoYW5uZWwKKyAgICAgKiBAcGFyYW0gY2hhbm5lbCAtIHRoZSBjaGFubmVsIHRvIGJlIHJlYWQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdFJlYWRlcihTb2NrZXRDaGFubmVsIGNoYW5uZWwpIHsKKyAgICAgICAgdGhpcyhjaGFubmVsLnNvY2tldCgpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiA8Y29kZT5PYmplY3RSZWFkZXI8L2NvZGU+IGZvciBhIFRDUCBzb2NrZXQKKyAgICAgKiBAcGFyYW0gc29ja2V0IFNvY2tldAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3RSZWFkZXIoU29ja2V0IHNvY2tldCkgeworICAgICAgICB0cnl7CisgICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBYQnl0ZUJ1ZmZlcihzb2NrZXQuZ2V0UmVjZWl2ZUJ1ZmZlclNpemUoKSwgdHJ1ZSk7CisgICAgICAgIH1jYXRjaCAoIElPRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAvL3VuYWJsZSB0byBnZXQgYnVmZmVyIHNpemUKKyAgICAgICAgICAgIGxvZy53YXJuKCJVbmFibGUgdG8gcmV0cmlldmUgdGhlIHNvY2tldCByZWNlaXZlciBidWZmZXIgc2l6ZSwgc2V0dGluZyB0byBkZWZhdWx0IDQzODAwIGJ5dGVzLiIpOworICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgWEJ5dGVCdWZmZXIoNDM4MDAsdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFjY2VzcygpIHsKKyAgICAgICAgdGhpcy5hY2Nlc3NlZCA9IHRydWU7CisgICAgICAgIHRoaXMubGFzdEFjY2VzcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZmluaXNoKCkgeworICAgICAgICB0aGlzLmFjY2Vzc2VkID0gZmFsc2U7CisgICAgICAgIHRoaXMubGFzdEFjY2VzcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc2VkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5hY2Nlc3NlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgbmV3IGJ5dGVzIHRvIGJ1ZmZlci4gCisgICAgICogQHNlZSBYQnl0ZUJ1ZmZlciNjb3VudFBhY2thZ2VzKCkKKyAgICAgKiBAcGFyYW0gZGF0YSBuZXcgdHJhbnNmZXIgYnVmZmVyCisgICAgICogQHBhcmFtIG9mZiBvZmZzZXQKKyAgICAgKiBAcGFyYW0gbGVuIGxlbmd0aCBpbiBidWZmZXIKKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBtZXNzYWdlcyB0aGF0IHNlbmRlZCB0byBjYWxsYmFjaworICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBpbnQgYXBwZW5kKEJ5dGVCdWZmZXIgZGF0YSwgaW50IGxlbiwgYm9vbGVhbiBjb3VudCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgIGJ1ZmZlci5hcHBlbmQoZGF0YSxsZW4pOworICAgICAgIGludCBwa2dDbnQgPSAtMTsKKyAgICAgICBpZiAoIGNvdW50ICkgcGtnQ250ID0gYnVmZmVyLmNvdW50UGFja2FnZXMoKTsKKyAgICAgICByZXR1cm4gcGtnQ250OworICAgfQorCisgICAgIHB1YmxpYyBpbnQgYXBwZW5kKGJ5dGVbXSBkYXRhLGludCBvZmYsaW50IGxlbiwgYm9vbGVhbiBjb3VudCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBidWZmZXIuYXBwZW5kKGRhdGEsb2ZmLGxlbik7CisgICAgICAgIGludCBwa2dDbnQgPSAtMTsKKyAgICAgICAgaWYgKCBjb3VudCApIHBrZ0NudCA9IGJ1ZmZlci5jb3VudFBhY2thZ2VzKCk7CisgICAgICAgIHJldHVybiBwa2dDbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBidWZmZXIgdG8gY2x1c3RlciBsaXN0ZW5lciAoY2FsbGJhY2spLgorICAgICAqIElzIG1lc3NhZ2UgY29tcGxldGUgcmVjZWl2ZXIgc2VuZCBtZXNzYWdlIHRvIGNhbGxiYWNrPworICAgICAqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuQ2x1c3RlclJlY2VpdmVyQmFzZSNtZXNzYWdlRGF0YVJlY2VpdmVkKENoYW5uZWxNZXNzYWdlKQorICAgICAqIEBzZWUgWEJ5dGVCdWZmZXIjZG9lc1BhY2thZ2VFeGlzdCgpCisgICAgICogQHNlZSBYQnl0ZUJ1ZmZlciNleHRyYWN0UGFja2FnZShib29sZWFuKQorICAgICAqCisgICAgICogQHJldHVybiBudW1iZXIgb2YgcmVjZWl2ZWQgcGFja2FnZXMvbWVzc2FnZXMKKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhbm5lbE1lc3NhZ2VbXSBleGVjdXRlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBpbnQgcGtnQ250ID0gYnVmZmVyLmNvdW50UGFja2FnZXMoKTsKKyAgICAgICAgQ2hhbm5lbE1lc3NhZ2VbXSByZXN1bHQgPSBuZXcgQ2hhbm5lbE1lc3NhZ2VbcGtnQ250XTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPHBrZ0NudDsgaSsrKSAgeworICAgICAgICAgICAgQ2hhbm5lbE1lc3NhZ2UgZGF0YSA9IGJ1ZmZlci5leHRyYWN0UGFja2FnZSh0cnVlKTsKKyAgICAgICAgICAgIHJlc3VsdFtpXSA9IGRhdGE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBidWZmZXJTaXplKCkgeworICAgICAgICByZXR1cm4gYnVmZmVyLmdldExlbmd0aCgpOworICAgIH0KKyAgICAKKworICAgIHB1YmxpYyBib29sZWFuIGhhc1BhY2thZ2UoKSB7CisgICAgICAgIHJldHVybiBidWZmZXIuY291bnRQYWNrYWdlcyh0cnVlKT4wOworICAgIH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFja2FnZXMgdGhhdCB0aGUgcmVhZGVyIGhhcyByZWFkCisgICAgICogQHJldHVybiBpbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvdW50KCkgeworICAgICAgICByZXR1cm4gYnVmZmVyLmNvdW50UGFja2FnZXMoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIHRoaXMuYnVmZmVyID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRMYXN0QWNjZXNzKCkgeworICAgICAgICByZXR1cm4gbGFzdEFjY2VzczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKKyAgICAgICAgcmV0dXJuIGNhbmNlbGxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMYXN0QWNjZXNzKGxvbmcgbGFzdEFjY2VzcykgeworICAgICAgICB0aGlzLmxhc3RBY2Nlc3MgPSBsYXN0QWNjZXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbGxlZChib29sZWFuIGNhbmNlbGxlZCkgeworICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IGNhbmNlbGxlZDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9pby9SZXBsaWNhdGlvblN0cmVhbS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2lvL1JlcGxpY2F0aW9uU3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhjZDI5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9pby9SZXBsaWNhdGlvblN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1DbGFzczsKKworLyoqCisgKiBDdXN0b20gc3ViY2xhc3Mgb2YgPGNvZGU+T2JqZWN0SW5wdXRTdHJlYW08L2NvZGU+IHRoYXQgbG9hZHMgZnJvbSB0aGUKKyAqIGNsYXNzIGxvYWRlciBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uICBUaGlzIGFsbG93cyBjbGFzc2VzIGRlZmluZWQgb25seQorICogd2l0aCB0aGUgd2ViIGFwcGxpY2F0aW9uIHRvIGJlIGZvdW5kIGNvcnJlY3RseS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgQmlwIFRoZWxpbgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFJlcGxpY2F0aW9uU3RyZWFtIGV4dGVuZHMgT2JqZWN0SW5wdXRTdHJlYW0geworCisgICAgCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIGxvYWRlciB3ZSB3aWxsIHVzZSB0byByZXNvbHZlIGNsYXNzZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlcltdIGNsYXNzTG9hZGVycyA9IG51bGw7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgQ3VzdG9tT2JqZWN0SW5wdXRTdHJlYW0KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIGlucHV0IHN0cmVhbSB3ZSB3aWxsIHJlYWQgZnJvbQorICAgICAqIEBwYXJhbSBjbGFzc0xvYWRlciBUaGUgY2xhc3MgbG9hZGVyIHVzZWQgdG8gaW5zdGFudGlhdGUgb2JqZWN0cworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFJlcGxpY2F0aW9uU3RyZWFtKElucHV0U3RyZWFtIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXJbXSBjbGFzc0xvYWRlcnMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIoc3RyZWFtKTsKKyAgICAgICAgdGhpcy5jbGFzc0xvYWRlcnMgPSBjbGFzc0xvYWRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgbG9jYWwgY2xhc3MgZXF1aXZhbGVudCBvZiB0aGUgc3BlY2lmaWVkIHN0cmVhbSBjbGFzcworICAgICAqIGRlc2NyaXB0aW9uLCBieSB1c2luZyB0aGUgY2xhc3MgbG9hZGVyIGFzc2lnbmVkIHRvIHRoaXMgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc0Rlc2MgQ2xhc3MgZGVzY3JpcHRpb24gZnJvbSB0aGUgaW5wdXQgc3RyZWFtCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgdGhpcyBjbGFzcyBjYW5ub3QgYmUgZm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgcmVzb2x2ZUNsYXNzKE9iamVjdFN0cmVhbUNsYXNzIGNsYXNzRGVzYykKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBjbGFzc0Rlc2MuZ2V0TmFtZSgpOworICAgICAgICBib29sZWFuIHRyeVJlcEZpcnN0ID0gbmFtZS5zdGFydHNXaXRoKCJvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcyIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCB0cnlSZXBGaXJzdCApIHJldHVybiBmaW5kUmVwbGljYXRpb25DbGFzcyhuYW1lKTsKKyAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBmaW5kRXh0ZXJuYWxDbGFzcyhuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIHggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggdHJ5UmVwRmlyc3QgKSByZXR1cm4gZmluZEV4dGVybmFsQ2xhc3MobmFtZSk7CisgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gZmluZFJlcGxpY2F0aW9uQ2xhc3MobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlc29sdmVDbGFzcyhjbGFzc0Rlc2MpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDbGFzcyBmaW5kUmVwbGljYXRpb25DbGFzcyhTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICByZXR1cm4gY2xheno7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGZpbmRFeHRlcm5hbENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiAgeworICAgICAgICBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUgPSBudWxsOworICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2xhc3NMb2FkZXJzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUobmFtZSwgZmFsc2UsIGNsYXNzTG9hZGVyc1tpXSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6OworICAgICAgICAgICAgfSBjYXRjaCAoIENsYXNzTm90Rm91bmRFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICBjbmZlID0geDsKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKyAgICAgICAgaWYgKCBjbmZlICE9IG51bGwgKSB0aHJvdyBjbmZlOworICAgICAgICBlbHNlIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiAgeworICAgICAgICB0aGlzLmNsYXNzTG9hZGVycyA9IG51bGw7CisgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9pby9YQnl0ZUJ1ZmZlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2lvL1hCeXRlQnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFiZjRlZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9pby9YQnl0ZUJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsNjEyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pbzsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworLyoqCisgKiBUaGUgWEJ5dGVCdWZmZXIgcHJvdmlkZXMgYSBkdWFsIGZ1bmN0aW9uYWxpdHkuCisgKiBPbmUsIGl0IHN0b3JlcyBtZXNzYWdlIGJ5dGVzIGFuZCBhdXRvbWF0aWNhbGx5IGV4dGVuZHMgdGhlIGJ5dGUgYnVmZmVyIGlmIG5lZWRlZC48QlI+CisgKiBUd28sIGl0IGNhbiBlbmNvZGUgYW5kIGRlY29kZSBwYWNrYWdlcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGRlZmluZWQgYW5kIGlkZW50aWZpZWQKKyAqIGFzIHRoZXkgY29tZSBpbiBvbiBhIHNvY2tldC4KKyAqIDxicj4KKyAqIDxiPlRISVMgQ0xBU1MgSVMgTk9UIFRIUkVBRCBTQUZFPC9CPjxCUj4KKyAqIDxici8+CisgKiBUcmFuc2ZlciBwYWNrYWdlOgorICogPHVsPgorICogPGxpPjxiPlNUQVJUX0RBVEEvYj4gLSA3IGJ5dGVzIC0gPGk+RkxUMjAwMjwvaT48L2xpPgorICogPGxpPjxiPlNJWkU8L2I+ICAgICAgLSA0IGJ5dGVzIC0gc2l6ZSBvZiB0aGUgZGF0YSBwYWNrYWdlPC9saT4KKyAqIDxsaT48Yj5EQVRBPC9iPiAgICAgIC0gc2hvdWxkIGJlIGFzIG1hbnkgYnl0ZXMgYXMgdGhlIHByZXYgU0laRTwvbGk+CisgKiA8bGk+PGI+RU5EX0RBVEE8L2I+ICAtIDcgYnl0ZXMgLSA8aT5UTEYyMDAzPC9pPjwvbEk+CisgKiA8L3VsPgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBYQnl0ZUJ1ZmZlcgoreworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBYQnl0ZUJ1ZmZlci5jbGFzcyApOworICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgaXMgYSBwYWNrYWdlIGhlYWRlciwgNyBieXRlcyAoRkxUMjAwMikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBTVEFSVF9EQVRBID0gezcwLDc2LDg0LDUwLDQ4LDQ4LDUwfTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBwYWNrYWdlIGZvb3RlciwgNyBieXRlcyAoVExGMjAwMykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTkRfREFUQSA9IHs4NCw3Niw3MCw1MCw0OCw0OCw1MX07CisgCisgICAgLyoqCisgICAgICogRGVmYXVsdCBzaXplIG9uIHRoZSBpbml0aWFsIGJ5dGUgYnVmZmVyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRl9TSVpFID0gMjA0ODsKKyAKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHNpemUgdG8gZXh0ZW5kIHRoZSBidWZmZXIgd2l0aAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZfRVhUICA9IDEwMjQ7CisgICAgCisgICAgLyoqCisgICAgICogVmFyaWFibGUgdG8gaG9sZCB0aGUgZGF0YQorICAgICAqLworICAgIHByb3RlY3RlZCBieXRlW10gYnVmID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDdXJyZW50IGxlbmd0aCBvZiBkYXRhIGluIHRoZSBidWZmZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGJ1ZlNpemUgPSAwOworICAgIAorICAgIC8qKgorICAgICAqIEZsYWcgZm9yIGRpc2NhcmRpbmcgaW52YWxpZCBwYWNrYWdlcworICAgICAqIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gdHJ1ZSwgYW5kIGFwcGVuZChieXRlW10sLi4uKSBpcyBjYWxsZWQsCisgICAgICogdGhlIGRhdGEgYWRkZWQgd2lsbCBiZSBpbnNwZWN0ZWQsIGFuZCBpZiBpdCBkb2Vzbid0IHN0YXJ0IHdpdGggCisgICAgICogPGNvZGU+U1RBUlRfREFUQTwvY29kZT4gaXQgd2lsbCBiZSB0aHJvd24gYXdheS4KKyAgICAgKiAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkaXNjYXJkID0gdHJ1ZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFhCeXRlQnVmZmVyCisgICAgICogQHBhcmFtIHNpemUgLSB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBieXRlIGJ1ZmZlcgorICAgICAqIEB0b2RvIHVzZSBhIHBvb2wgb2YgYnl0ZVtdIGZvciBwZXJmb3JtYW5jZQorICAgICAqLworICAgIHB1YmxpYyBYQnl0ZUJ1ZmZlcihpbnQgc2l6ZSwgYm9vbGVhbiBkaXNjYXJkKSB7CisgICAgICAgIGJ1ZiA9IG5ldyBieXRlW3NpemVdOworICAgICAgICB0aGlzLmRpc2NhcmQgPSBkaXNjYXJkOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgWEJ5dGVCdWZmZXIoYnl0ZVtdIGRhdGEsYm9vbGVhbiBkaXNjYXJkKSB7CisgICAgICAgIHRoaXMoZGF0YSxkYXRhLmxlbmd0aCsxMjgsZGlzY2FyZCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBYQnl0ZUJ1ZmZlcihieXRlW10gZGF0YSwgaW50IHNpemUsYm9vbGVhbiBkaXNjYXJkKSB7CisgICAgICAgIGludCBsZW5ndGggPSBNYXRoLm1heChkYXRhLmxlbmd0aCxzaXplKTsKKyAgICAgICAgYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLDAsYnVmLDAsZGF0YS5sZW5ndGgpOworICAgICAgICBidWZTaXplID0gZGF0YS5sZW5ndGg7CisgICAgICAgIHRoaXMuZGlzY2FyZCA9IGRpc2NhcmQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gYnVmU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IHNpemUpIHsKKyAgICAgICAgaWYgKCBzaXplID4gYnVmLmxlbmd0aCApIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIlNpemUgaXMgbGFyZ2VyIHRoYW4gZXhpc3RpbmcgYnVmZmVyLiIpOworICAgICAgICBidWZTaXplID0gc2l6ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdHJpbShpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmICggKGJ1ZlNpemUgLSBsZW5ndGgpIDwgMCApIAorICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiQ2FuJ3QgdHJpbSBtb3JlIGJ5dGVzIHRoYW4gYXJlIGF2YWlsYWJsZS4gbGVuZ3RoOiIrYnVmU2l6ZSsiIHRyaW06IitsZW5ndGgpOworICAgICAgICBidWZTaXplIC09IGxlbmd0aDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIGJ1ZlNpemUgPSAwOworICAgIH0KKyAgICAgICAgICAgIAorICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXNEaXJlY3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJ1ZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBieXRlcyBpbiB0aGUgYnVmZmVyLCBpbiBpdHMgZXhhY3QgbGVuZ3RoCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcygpIHsKKyAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVtidWZTaXplXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsMCxiLDAsYnVmU2l6ZSk7CisgICAgICAgIHJldHVybiBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgYnVmZmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGJ1ZlNpemUgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZHMgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlci4gSWYgdGhlIGRhdGEgaXMgaW5jb3JyZWN0bHkgZm9ybWF0dGVkLCBpZSwgdGhlIGRhdGEgc2hvdWxkIGFsd2F5cyBzdGFydCB3aXRoIHRoZQorICAgICAqIGhlYWRlciwgZmFsc2Ugd2lsbCBiZSByZXR1cm5lZCBhbmQgdGhlIGRhdGEgd2lsbCBiZSBkaXNjYXJkZWQuCisgICAgICogQHBhcmFtIGIgLSBieXRlcyB0byBiZSBhcHBlbmRlZAorICAgICAqIEBwYXJhbSBvZmYgLSB0aGUgb2Zmc2V0IHRvIGV4dHJhY3QgZGF0YSBmcm9tCisgICAgICogQHBhcmFtIGxlbiAtIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYXBwZW5kLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGF0YSB3YXMgYXBwZW5kZWQgY29ycmVjdGx5LiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBwYWNrYWdlIGlzIGluY29ycmVjdCwgaWUgbWlzc2luZyBoZWFkZXIgb3Igc29tZXRoaW5nLCBvciB0aGUgbGVuZ3RoIG9mIGRhdGEgaXMgMAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFwcGVuZChCeXRlQnVmZmVyIGIsIGludCBsZW4pIHsKKyAgICAgICAgaW50IG5ld2NvdW50ID0gYnVmU2l6ZSArIGxlbjsKKyAgICAgICAgaWYgKG5ld2NvdW50ID4gYnVmLmxlbmd0aCkgeworICAgICAgICAgICAgZXhwYW5kKG5ld2NvdW50KTsKKyAgICAgICAgfQorICAgICAgICBiLmdldChidWYsYnVmU2l6ZSxsZW4pOworICAgICAgICAKKyAgICAgICAgYnVmU2l6ZSA9IG5ld2NvdW50OworICAgICAgICAKKyAgICAgICAgaWYgKCBkaXNjYXJkICkgeworICAgICAgICAgICAgaWYgKGJ1ZlNpemUgPiBTVEFSVF9EQVRBLmxlbmd0aCAmJiAoZmlyc3RJbmRleE9mKGJ1ZiwgMCwgU1RBUlRfREFUQSkgPT0gLTEpKSB7CisgICAgICAgICAgICAgICAgYnVmU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJEaXNjYXJkZWQgdGhlIHBhY2thZ2UsIGludmFsaWQgaGVhZGVyIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGFwcGVuZChieXRlIGkpIHsKKyAgICAgICAgaW50IG5ld2NvdW50ID0gYnVmU2l6ZSArIDE7CisgICAgICAgIGlmIChuZXdjb3VudCA+IGJ1Zi5sZW5ndGgpIHsKKyAgICAgICAgICAgIGV4cGFuZChuZXdjb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgYnVmW2J1ZlNpemVdID0gaTsKKyAgICAgICAgYnVmU2l6ZSA9IG5ld2NvdW50OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGFwcGVuZChib29sZWFuIGkpIHsKKyAgICAgICAgaW50IG5ld2NvdW50ID0gYnVmU2l6ZSArIDE7CisgICAgICAgIGlmIChuZXdjb3VudCA+IGJ1Zi5sZW5ndGgpIHsKKyAgICAgICAgICAgIGV4cGFuZChuZXdjb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgWEJ5dGVCdWZmZXIudG9CeXRlcyhpLGJ1ZixidWZTaXplKTsKKyAgICAgICAgYnVmU2l6ZSA9IG5ld2NvdW50OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhcHBlbmQobG9uZyBpKSB7CisgICAgICAgIGludCBuZXdjb3VudCA9IGJ1ZlNpemUgKyA4OworICAgICAgICBpZiAobmV3Y291bnQgPiBidWYubGVuZ3RoKSB7CisgICAgICAgICAgICBleHBhbmQobmV3Y291bnQpOworICAgICAgICB9CisgICAgICAgIFhCeXRlQnVmZmVyLnRvQnl0ZXMoaSxidWYsYnVmU2l6ZSk7CisgICAgICAgIGJ1ZlNpemUgPSBuZXdjb3VudDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGFwcGVuZChpbnQgaSkgeworICAgICAgICBpbnQgbmV3Y291bnQgPSBidWZTaXplICsgNDsKKyAgICAgICAgaWYgKG5ld2NvdW50ID4gYnVmLmxlbmd0aCkgeworICAgICAgICAgICAgZXhwYW5kKG5ld2NvdW50KTsKKyAgICAgICAgfQorICAgICAgICBYQnl0ZUJ1ZmZlci50b0J5dGVzKGksYnVmLGJ1ZlNpemUpOworICAgICAgICBidWZTaXplID0gbmV3Y291bnQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFwcGVuZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICBpZiAoKG9mZiA8IDApIHx8IChvZmYgPiBiLmxlbmd0aCkgfHwgKGxlbiA8IDApIHx8CisgICAgICAgICAgICAoKG9mZiArIGxlbikgPiBiLmxlbmd0aCkgfHwgKChvZmYgKyBsZW4pIDwgMCkpICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9IGVsc2UgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbmV3Y291bnQgPSBidWZTaXplICsgbGVuOworICAgICAgICBpZiAobmV3Y291bnQgPiBidWYubGVuZ3RoKSB7CisgICAgICAgICAgICBleHBhbmQobmV3Y291bnQpOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgb2ZmLCBidWYsIGJ1ZlNpemUsIGxlbik7CisgICAgICAgIGJ1ZlNpemUgPSBuZXdjb3VudDsKKworICAgICAgICBpZiAoIGRpc2NhcmQgKSB7CisgICAgICAgICAgICBpZiAoYnVmU2l6ZSA+IFNUQVJUX0RBVEEubGVuZ3RoICYmIChmaXJzdEluZGV4T2YoYnVmLCAwLCBTVEFSVF9EQVRBKSA9PSAtMSkpIHsKKyAgICAgICAgICAgICAgICBidWZTaXplID0gMDsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkRpc2NhcmRlZCB0aGUgcGFja2FnZSwgaW52YWxpZCBoZWFkZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXhwYW5kKGludCBuZXdjb3VudCkgeworICAgICAgICAvL2Rvbid0IGNoYW5nZSB0aGUgYWxsb2NhdGlvbiBzdHJhdGVneQorICAgICAgICBieXRlIG5ld2J1ZltdID0gbmV3IGJ5dGVbTWF0aC5tYXgoYnVmLmxlbmd0aCA8PCAxLCBuZXdjb3VudCldOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgMCwgbmV3YnVmLCAwLCBidWZTaXplKTsKKyAgICAgICAgYnVmID0gbmV3YnVmOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldENhcGFjaXR5KCkgeworICAgICAgICByZXR1cm4gYnVmLmxlbmd0aDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEludGVybmFsIG1lY2hhbmlzbSB0byBtYWtlIGEgY2hlY2sgaWYgYSBjb21wbGV0ZSBwYWNrYWdlIGV4aXN0cworICAgICAqIHdpdGhpbiB0aGUgYnVmZmVyCisgICAgICogQHJldHVybiAtIHRydWUgaWYgYSBjb21wbGV0ZSBwYWNrYWdlIChoZWFkZXIsY29tcHJlc3Msc2l6ZSxkYXRhLGZvb3RlcikgZXhpc3RzIHdpdGhpbiB0aGUgYnVmZmVyCisgICAgICovCisgICAgcHVibGljIGludCBjb3VudFBhY2thZ2VzKCkgeworICAgICAgICByZXR1cm4gY291bnRQYWNrYWdlcyhmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIGludCBjb3VudFBhY2thZ2VzKGJvb2xlYW4gZmlyc3QpCisgICAgeworICAgICAgICBpbnQgY250ID0gMDsKKyAgICAgICAgaW50IHBvcyA9IFNUQVJUX0RBVEEubGVuZ3RoOworICAgICAgICBpbnQgc3RhcnQgPSAwOworCisgICAgICAgIHdoaWxlICggc3RhcnQgPCBidWZTaXplICkgeworICAgICAgICAgICAgLy9maXJzdCBjaGVjayBzdGFydCBoZWFkZXIKKyAgICAgICAgICAgIGludCBpbmRleCA9IFhCeXRlQnVmZmVyLmZpcnN0SW5kZXhPZihidWYsc3RhcnQsU1RBUlRfREFUQSk7CisgICAgICAgICAgICAvL2lmIHRoZSBoZWFkZXIgKFNUQVJUX0RBVEEpIGlzbid0IHRoZSBmaXJzdCB0aGluZyBvcgorICAgICAgICAgICAgLy90aGUgYnVmZmVyIGlzbid0IGV2ZW4gMTQgYnl0ZXMKKyAgICAgICAgICAgIGlmICggaW5kZXggIT0gc3RhcnQgfHwgKChidWZTaXplLXN0YXJ0KTwxNCkgKSBicmVhazsKKyAgICAgICAgICAgIC8vbmV4dCA0IGJ5dGVzIGFyZSBjb21wcmVzcyBmbGFnIG5vdCBuZWVkZWQgZm9yIGNvdW50IHBhY2thZ2VzCisgICAgICAgICAgICAvL3RoZW4gZ2V0IHRoZSBzaXplIDQgYnl0ZXMKKyAgICAgICAgICAgIGludCBzaXplID0gdG9JbnQoYnVmLCBwb3MpOworICAgICAgICAgICAgLy9ub3cgdGhlIHRvdGFsIGJ1ZmZlciBoYXMgdG8gYmUgbG9uZyBlbm91Z2ggdG8gaG9sZAorICAgICAgICAgICAgLy9TVEFSVF9EQVRBLmxlbmd0aCs0K3NpemUrRU5EX0RBVEEubGVuZ3RoCisgICAgICAgICAgICBwb3MgPSBzdGFydCArIFNUQVJUX0RBVEEubGVuZ3RoICsgNCArIHNpemU7CisgICAgICAgICAgICBpZiAoIChwb3MgKyBFTkRfREFUQS5sZW5ndGgpID4gYnVmU2l6ZSkgYnJlYWs7CisgICAgICAgICAgICAvL2FuZCBmaW5hbGx5IGNoZWNrIHRoZSBmb290ZXIgb2YgdGhlIHBhY2thZ2UgRU5EX0RBVEEKKyAgICAgICAgICAgIGludCBuZXdwb3MgPSBmaXJzdEluZGV4T2YoYnVmLCBwb3MsIEVORF9EQVRBKTsKKyAgICAgICAgICAgIC8vbWlzbWF0Y2gsIHRoZXJlIGlzIG5vIHBhY2thZ2UKKyAgICAgICAgICAgIGlmIChuZXdwb3MgIT0gcG9zKSBicmVhazsKKyAgICAgICAgICAgIC8vaW5jcmVhc2UgdGhlIHBhY2tldCBjb3VudAorICAgICAgICAgICAgY250Kys7CisgICAgICAgICAgICAvL3Jlc2V0IHRoZSB2YWx1ZXMKKyAgICAgICAgICAgIHN0YXJ0ID0gcG9zICsgRU5EX0RBVEEubGVuZ3RoOworICAgICAgICAgICAgcG9zID0gc3RhcnQgKyBTVEFSVF9EQVRBLmxlbmd0aDsKKyAgICAgICAgICAgIC8vd2Ugb25seSB3YW50IHRvIHZlcmlmeSB0aGF0IHdlIGhhdmUgYXQgbGVhc3Qgb25lIHBhY2thZ2UKKyAgICAgICAgICAgIGlmICggZmlyc3QgKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY250OworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCB0byBjaGVjayBpZiBhIHBhY2thZ2UgZXhpc3RzIGluIHRoaXMgYnl0ZSBidWZmZXIuCisgICAgICogQHJldHVybiAtIHRydWUgaWYgYSBjb21wbGV0ZSBwYWNrYWdlIChoZWFkZXIsb3B0aW9ucyxzaXplLGRhdGEsZm9vdGVyKSBleGlzdHMgd2l0aGluIHRoZSBidWZmZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkb2VzUGFja2FnZUV4aXN0KCkgIHsKKyAgICAgICAgcmV0dXJuIChjb3VudFBhY2thZ2VzKHRydWUpPjApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4dHJhY3RzIHRoZSBtZXNzYWdlIGJ5dGVzIGZyb20gYSBwYWNrYWdlLgorICAgICAqIElmIG5vIHBhY2thZ2UgZXhpc3RzLCBhIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKiBAcGFyYW0gY2xlYXJGcm9tQnVmZmVyIC0gaWYgdHJ1ZSwgdGhlIHBhY2thZ2Ugd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGJ5dGUgYnVmZmVyCisgICAgICogQHJldHVybiAtIHJldHVybnMgdGhlIGFjdHVhbCBtZXNzYWdlIGJ5dGVzIChoZWFkZXIsIGNvbXByZXNzLHNpemUgYW5kIGZvb3RlciBub3QgaW5jbHVkZWQpLgorICAgICAqLworICAgIHB1YmxpYyBYQnl0ZUJ1ZmZlciBleHRyYWN0RGF0YVBhY2thZ2UoYm9vbGVhbiBjbGVhckZyb21CdWZmZXIpIHsKKyAgICAgICAgaW50IHBzaXplID0gY291bnRQYWNrYWdlcyh0cnVlKTsKKyAgICAgICAgaWYgKHBzaXplID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBwYWNrYWdlIGV4aXN0cyBpbiBYQnl0ZUJ1ZmZlciIpOworICAgICAgICB9CisgICAgICAgIGludCBzaXplID0gdG9JbnQoYnVmLCBTVEFSVF9EQVRBLmxlbmd0aCk7CisgICAgICAgIFhCeXRlQnVmZmVyIHhidWYgPSBCdWZmZXJQb29sLmdldEJ1ZmZlclBvb2woKS5nZXRCdWZmZXIoc2l6ZSxmYWxzZSk7CisgICAgICAgIHhidWYuc2V0TGVuZ3RoKHNpemUpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgU1RBUlRfREFUQS5sZW5ndGggKyA0LCB4YnVmLmdldEJ5dGVzRGlyZWN0KCksIDAsIHNpemUpOworICAgICAgICBpZiAoY2xlYXJGcm9tQnVmZmVyKSB7CisgICAgICAgICAgICBpbnQgdG90YWxzaXplID0gU1RBUlRfREFUQS5sZW5ndGggKyA0ICsgc2l6ZSArIEVORF9EQVRBLmxlbmd0aDsKKyAgICAgICAgICAgIGJ1ZlNpemUgPSBidWZTaXplIC0gdG90YWxzaXplOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsIHRvdGFsc2l6ZSwgYnVmLCAwLCBidWZTaXplKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4geGJ1ZjsKKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ2hhbm5lbERhdGEgZXh0cmFjdFBhY2thZ2UoYm9vbGVhbiBjbGVhckZyb21CdWZmZXIpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgWEJ5dGVCdWZmZXIgeGJ1ZiA9IGV4dHJhY3REYXRhUGFja2FnZShjbGVhckZyb21CdWZmZXIpOworICAgICAgICBDaGFubmVsRGF0YSBjZGF0YSA9IENoYW5uZWxEYXRhLmdldERhdGFGcm9tUGFja2FnZSh4YnVmKTsKKyAgICAgICAgcmV0dXJuIGNkYXRhOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29tcGxldGUgZGF0YSBwYWNrYWdlCisgICAgICogQHBhcmFtIGluZGF0YSAtIHRoZSBtZXNzYWdlIGRhdGEgdG8gYmUgY29udGFpbmVkIHdpdGhpbiB0aGUgcGFja2FnZQorICAgICAqIEBwYXJhbSBjb21wcmVzc2VkIC0gY29tcHJlc3Npb24gZmxhZyBmb3IgdGhlIGluZGF0YSBidWZmZXIKKyAgICAgKiBAcmV0dXJuIC0gYSBmdWxsIHBhY2thZ2UgKGhlYWRlcixzaXplLGRhdGEsZm9vdGVyKQorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGNyZWF0ZURhdGFQYWNrYWdlKENoYW5uZWxEYXRhIGNkYXRhKSB7CisvLyAgICAgICAgcmV0dXJuIGNyZWF0ZURhdGFQYWNrYWdlKGNkYXRhLmdldERhdGFQYWNrYWdlKCkpOworICAgICAgICAvL2F2b2lkIG9uZSBleHRyYSBieXRlIGFycmF5IGNyZWF0aW9uCisgICAgICAgIGludCBkbGVuZ3RoID0gY2RhdGEuZ2V0RGF0YVBhY2thZ2VMZW5ndGgoKTsKKyAgICAgICAgaW50IGxlbmd0aCA9IGdldERhdGFQYWNrYWdlTGVuZ3RoKGRsZW5ndGgpOworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KFNUQVJUX0RBVEEsIDAsIGRhdGEsIG9mZnNldCwgU1RBUlRfREFUQS5sZW5ndGgpOworICAgICAgICBvZmZzZXQgKz0gU1RBUlRfREFUQS5sZW5ndGg7CisgICAgICAgIHRvQnl0ZXMoZGxlbmd0aCxkYXRhLCBTVEFSVF9EQVRBLmxlbmd0aCk7CisgICAgICAgIG9mZnNldCArPSA0OworICAgICAgICBjZGF0YS5nZXREYXRhUGFja2FnZShkYXRhLG9mZnNldCk7CisgICAgICAgIG9mZnNldCArPSBkbGVuZ3RoOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KEVORF9EQVRBLCAwLCBkYXRhLCBvZmZzZXQsIEVORF9EQVRBLmxlbmd0aCk7CisgICAgICAgIG9mZnNldCArPSBFTkRfREFUQS5sZW5ndGg7CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBjcmVhdGVEYXRhUGFja2FnZShieXRlW10gZGF0YSwgaW50IGRvZmYsIGludCBkbGVuZ3RoLCBieXRlW10gYnVmZmVyLCBpbnQgYnVmb2ZmKSB7CisgICAgICAgIGlmICggKGJ1ZmZlci5sZW5ndGgtYnVmb2ZmKSA+IGdldERhdGFQYWNrYWdlTGVuZ3RoKGRsZW5ndGgpICkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBkYXRhIHBhY2thZ2UsIGJ1ZmZlciBpcyB0b28gc21hbGwuIik7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShTVEFSVF9EQVRBLCAwLCBidWZmZXIsIGJ1Zm9mZiwgU1RBUlRfREFUQS5sZW5ndGgpOworICAgICAgICB0b0J5dGVzKGRhdGEubGVuZ3RoLGJ1ZmZlciwgYnVmb2ZmK1NUQVJUX0RBVEEubGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCBkb2ZmLCBidWZmZXIsIGJ1Zm9mZitTVEFSVF9EQVRBLmxlbmd0aCArIDQsIGRsZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KEVORF9EQVRBLCAwLCBidWZmZXIsIGJ1Zm9mZitTVEFSVF9EQVRBLmxlbmd0aCArIDQgKyBkYXRhLmxlbmd0aCwgRU5EX0RBVEEubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICB9CisKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXREYXRhUGFja2FnZUxlbmd0aChpbnQgZGF0YWxlbmd0aCkgeworICAgICAgICBpbnQgbGVuZ3RoID0gCisgICAgICAgICAgICBTVEFSVF9EQVRBLmxlbmd0aCArIC8vaGVhZGVyIGxlbmd0aAorICAgICAgICAgICAgNCArIC8vZGF0YSBsZW5ndGggaW5kaWNhdG9yCisgICAgICAgICAgICBkYXRhbGVuZ3RoICsgLy9hY3R1YWwgZGF0YSBsZW5ndGgKKyAgICAgICAgICAgIEVORF9EQVRBLmxlbmd0aDsgLy9mb290ZXIgbGVuZ3RoCisgICAgICAgIHJldHVybiBsZW5ndGg7CisKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gY3JlYXRlRGF0YVBhY2thZ2UoYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IGdldERhdGFQYWNrYWdlTGVuZ3RoKGRhdGEubGVuZ3RoKTsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgIHJldHVybiBjcmVhdGVEYXRhUGFja2FnZShkYXRhLDAsZGF0YS5sZW5ndGgscmVzdWx0LDApOworICAgIH0KKyAgICAKKyAgICAKKworLy8gICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGxEYXRhUGFja2FnZShieXRlW10gZGF0YSwgaW50IGRvZmYsIGludCBkbGVuZ3RoLCBYQnl0ZUJ1ZmZlciBidWYpIHsKKy8vICAgICAgICBpbnQgcGtnbGVuID0gZ2V0RGF0YVBhY2thZ2VMZW5ndGgoZGxlbmd0aCk7CisvLyAgICAgICAgaWYgKCBidWYuZ2V0Q2FwYWNpdHkoKSA8ICBwa2dsZW4gKSBidWYuZXhwYW5kKHBrZ2xlbik7CisvLyAgICAgICAgY3JlYXRlRGF0YVBhY2thZ2UoZGF0YSxkb2ZmLGRsZW5ndGgsYnVmLmdldEJ5dGVzRGlyZWN0KCksYnVmLmdldExlbmd0aCgpKTsKKy8vICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgZm91ciBieXRlcyB0byBhbiBpbnQKKyAgICAgKiBAcGFyYW0gYiAtIHRoZSBieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvdXIgYnl0ZXMKKyAgICAgKiBAcGFyYW0gb2ZmIC0gdGhlIG9mZnNldAorICAgICAqIEByZXR1cm4gdGhlIGludGVnZXIgdmFsdWUgY29uc3RydWN0ZWQgZnJvbSB0aGUgZm91ciBieXRlcworICAgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHRvSW50KGJ5dGVbXSBiLGludCBvZmYpeworICAgICAgICByZXR1cm4gKCAoIChpbnQpIGJbb2ZmKzNdKSAmIDB4RkYpICsKKyAgICAgICAgICAgICggKCAoIChpbnQpIGJbb2ZmKzJdKSAmIDB4RkYpIDw8IDgpICsKKyAgICAgICAgICAgICggKCAoIChpbnQpIGJbb2ZmKzFdKSAmIDB4RkYpIDw8IDE2KSArCisgICAgICAgICAgICAoICggKCAoaW50KSBiW29mZiswXSkgJiAweEZGKSA8PCAyNCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBlaWdodCBieXRlcyB0byBhIGxvbmcKKyAgICAgKiBAcGFyYW0gYiAtIHRoZSBieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvdXIgYnl0ZXMKKyAgICAgKiBAcGFyYW0gb2ZmIC0gdGhlIG9mZnNldAorICAgICAqIEByZXR1cm4gdGhlIGxvbmcgdmFsdWUgY29uc3RydWN0ZWQgZnJvbSB0aGUgZWlnaHQgYnl0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgdG9Mb25nKGJ5dGVbXSBiLGludCBvZmYpeworICAgICAgICByZXR1cm4gKCAoIChsb25nKSBiW29mZis3XSkgJiAweEZGKSArCisgICAgICAgICAgICAoICggKCAobG9uZykgYltvZmYrNl0pICYgMHhGRikgPDwgOCkgKworICAgICAgICAgICAgKCAoICggKGxvbmcpIGJbb2ZmKzVdKSAmIDB4RkYpIDw8IDE2KSArCisgICAgICAgICAgICAoICggKCAobG9uZykgYltvZmYrNF0pICYgMHhGRikgPDwgMjQpICsKKyAgICAgICAgICAgICggKCAoIChsb25nKSBiW29mZiszXSkgJiAweEZGKSA8PCAzMikgKworICAgICAgICAgICAgKCAoICggKGxvbmcpIGJbb2ZmKzJdKSAmIDB4RkYpIDw8IDQwKSArCisgICAgICAgICAgICAoICggKCAobG9uZykgYltvZmYrMV0pICYgMHhGRikgPDwgNDgpICsKKyAgICAgICAgICAgICggKCAoIChsb25nKSBiW29mZiswXSkgJiAweEZGKSA8PCA1Nik7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQ29udmVydHMgYW4gaW50ZWdlciB0byBmb3VyIGJ5dGVzCisgICAgICogQHBhcmFtIG4gLSB0aGUgaW50ZWdlcgorICAgICAqIEByZXR1cm4gLSBmb3VyIGJ5dGVzIGluIGFuIGFycmF5CisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHRvQnl0ZXMoYm9vbGVhbixieXRlW10saW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHRvQnl0ZXMoYm9vbGVhbiBib29sKSB7CisgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMV0gOworICAgICAgICByZXR1cm4gdG9CeXRlcyhib29sLGIsMCk7CisKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gdG9CeXRlcyhib29sZWFuIGJvb2wsIGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGRhdGFbb2Zmc2V0XSA9IChieXRlKShib29sPzE6MCk7CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gPGFueT4gbG9uZworICAgICAqIEByZXR1cm4gdXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHRvQm9vbGVhbihieXRlW10gYiwgaW50IG9mZnNldCkgeworICAgICAgICByZXR1cm4gYltvZmZzZXRdICE9IDA7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQ29udmVydHMgYW4gaW50ZWdlciB0byBmb3VyIGJ5dGVzCisgICAgICogQHBhcmFtIG4gLSB0aGUgaW50ZWdlcgorICAgICAqIEByZXR1cm4gLSBmb3VyIGJ5dGVzIGluIGFuIGFycmF5CisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHRvQnl0ZXMoaW50LGJ5dGVbXSxpbnQpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gdG9CeXRlcyhpbnQgbikgeworICAgICAgICByZXR1cm4gdG9CeXRlcyhuLG5ldyBieXRlWzRdLDApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHRvQnl0ZXMoaW50IG4sYnl0ZVtdIGIsIGludCBvZmZzZXQpIHsKKyAgICAgICAgYltvZmZzZXQrM10gPSAoYnl0ZSkgKG4pOworICAgICAgICBuID4+Pj0gODsKKyAgICAgICAgYltvZmZzZXQrMl0gPSAoYnl0ZSkgKG4pOworICAgICAgICBuID4+Pj0gODsKKyAgICAgICAgYltvZmZzZXQrMV0gPSAoYnl0ZSkgKG4pOworICAgICAgICBuID4+Pj0gODsKKyAgICAgICAgYltvZmZzZXQrMF0gPSAoYnl0ZSkgKG4pOworICAgICAgICByZXR1cm4gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyBhbiBsb25nIHRvIGVpZ2h0IGJ5dGVzCisgICAgICogQHBhcmFtIG4gLSB0aGUgbG9uZworICAgICAqIEByZXR1cm4gLSBlaWdodCBieXRlcyBpbiBhbiBhcnJheQorICAgICAqIEBkZXByZWNhdGVkIHVzZSB0b0J5dGVzKGxvbmcsYnl0ZVtdLGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB0b0J5dGVzKGxvbmcgbikgeworICAgICAgICByZXR1cm4gdG9CeXRlcyhuLG5ldyBieXRlWzhdLDApOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB0b0J5dGVzKGxvbmcgbiwgYnl0ZVtdIGIsIGludCBvZmZzZXQpIHsKKyAgICAgICAgYltvZmZzZXQrN10gPSAoYnl0ZSkgKG4pOworICAgICAgICBuID4+Pj0gODsKKyAgICAgICAgYltvZmZzZXQrNl0gPSAoYnl0ZSkgKG4pOworICAgICAgICBuID4+Pj0gODsKKyAgICAgICAgYltvZmZzZXQrNV0gPSAoYnl0ZSkgKG4pOworICAgICAgICBuID4+Pj0gODsKKyAgICAgICAgYltvZmZzZXQrNF0gPSAoYnl0ZSkgKG4pOworICAgICAgICBuID4+Pj0gODsKKyAgICAgICAgYltvZmZzZXQrM10gPSAoYnl0ZSkgKG4pOworICAgICAgICBuID4+Pj0gODsKKyAgICAgICAgYltvZmZzZXQrMl0gPSAoYnl0ZSkgKG4pOworICAgICAgICBuID4+Pj0gODsKKyAgICAgICAgYltvZmZzZXQrMV0gPSAoYnl0ZSkgKG4pOworICAgICAgICBuID4+Pj0gODsKKyAgICAgICAgYltvZmZzZXQrMF0gPSAoYnl0ZSkgKG4pOworICAgICAgICByZXR1cm4gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1pbGFyIHRvIGEgU3RyaW5nLkluZGV4T2YsIGJ1dCB1c2VzIHB1cmUgYnl0ZXMKKyAgICAgKiBAcGFyYW0gc3JjIC0gdGhlIHNvdXJjZSBieXRlcyB0byBiZSBzZWFyY2hlZAorICAgICAqIEBwYXJhbSBzcmNPZmYgLSBvZmZzZXQgb24gdGhlIHNvdXJjZSBidWZmZXIKKyAgICAgKiBAcGFyYW0gZmluZCAtIHRoZSBzdHJpbmcgdG8gYmUgZm91bmQgd2l0aGluIHNyYworICAgICAqIEByZXR1cm4gLSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGJ5dGUuIC0xIGlmIHRoZSBmaW5kIGFycmF5IGlzIG5vdCBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGZpcnN0SW5kZXhPZihieXRlW10gc3JjLCBpbnQgc3JjT2ZmLCBieXRlW10gZmluZCl7CisgICAgICAgIGludCByZXN1bHQgPSAtMTsKKyAgICAgICAgaWYgKGZpbmQubGVuZ3RoID4gc3JjLmxlbmd0aCkgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgaWYgKGZpbmQubGVuZ3RoID09IDAgfHwgc3JjLmxlbmd0aCA9PSAwKSByZXR1cm4gcmVzdWx0OworICAgICAgICBpZiAoc3JjT2ZmID49IHNyYy5sZW5ndGggKSB0aHJvdyBuZXcgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGludCBzcmNsZW4gPSBzcmMubGVuZ3RoOworICAgICAgICBpbnQgZmluZGxlbiA9IGZpbmQubGVuZ3RoOworICAgICAgICBieXRlIGZpcnN0ID0gZmluZFswXTsKKyAgICAgICAgaW50IHBvcyA9IHNyY09mZjsKKyAgICAgICAgd2hpbGUgKCFmb3VuZCkgeworICAgICAgICAgICAgLy9maW5kIHRoZSBmaXJzdCBieXRlCisgICAgICAgICAgICB3aGlsZSAocG9zIDwgc3JjbGVuKXsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QgPT0gc3JjW3Bvc10pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvcyA+PSBzcmNsZW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAvL3dlIGZvdW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgICAgICAgICAgIC8vbWF0Y2ggdGhlIHJlc3Qgb2YgdGhlIGJ5dGVzIC0gdGhleSBoYXZlIHRvIG1hdGNoCisgICAgICAgICAgICBpZiAoIChzcmNsZW4gLSBwb3MpIDwgZmluZGxlbikKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAvL2Fzc3VtZSBpdCBkb2VzIGV4aXN0CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgKCAoaSA8IGZpbmRsZW4pICYmIGZvdW5kKTsgaSsrKQorICAgICAgICAgICAgICAgIGZvdW5kID0gZm91bmQgJiYgKGZpbmRbaV0gPT0gc3JjW3BvcyArIGldKTsKKyAgICAgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBwb3M7CisgICAgICAgICAgICBlbHNlIGlmICggKHNyY2xlbiAtIHBvcykgPCBmaW5kbGVuKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsgLy9ubyBtb3JlIG1hdGNoZXMgcG9zc2libGUKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU2VyaWFsaXphYmxlIGRlc2VyaWFsaXplKGJ5dGVbXSBkYXRhKSAKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBDbGFzc0Nhc3RFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGVzZXJpYWxpemUoZGF0YSwwLGRhdGEubGVuZ3RoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBTZXJpYWxpemFibGUgZGVzZXJpYWxpemUoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpICAKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBDbGFzc0Nhc3RFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGVzZXJpYWxpemUoZGF0YSxvZmZzZXQsbGVuZ3RoLG51bGwpOyAgICAgCisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgaW50IGludm9rZWNvdW50ID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIFNlcmlhbGl6YWJsZSBkZXNlcmlhbGl6ZShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2xhc3NMb2FkZXJbXSBjbHMpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIENsYXNzQ2FzdEV4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNocm9uaXplZCAoWEJ5dGVCdWZmZXIuY2xhc3MpIHsgaW52b2tlY291bnQrKzt9CisgICAgICAgIE9iamVjdCBtZXNzYWdlID0gbnVsbDsKKyAgICAgICAgaWYgKCBjbHMgPT0gbnVsbCApIGNscyA9IG5ldyBDbGFzc0xvYWRlclswXTsKKyAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gIGluc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEsb2Zmc2V0LGxlbmd0aCk7CisgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworICAgICAgICAgICAgc3RyZWFtID0gKGNscy5sZW5ndGg+MCk/IG5ldyBSZXBsaWNhdGlvblN0cmVhbShpbnN0cmVhbSxjbHMpOm5ldyBPYmplY3RJbnB1dFN0cmVhbShpbnN0cmVhbSk7CisgICAgICAgICAgICBtZXNzYWdlID0gc3RyZWFtLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIGluc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIG1lc3NhZ2UgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBTZXJpYWxpemFibGUpCisgICAgICAgICAgICByZXR1cm4gKFNlcmlhbGl6YWJsZSkgbWVzc2FnZTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCJNZXNzYWdlIGhhcyB0aGUgd3JvbmcgY2xhc3MuIEl0IHNob3VsZCBpbXBsZW1lbnQgU2VyaWFsaXphYmxlLCBpbnN0ZWFkIGl0IGlzOiIrbWVzc2FnZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSBpbnRvIGNsdXN0ZXIgZGF0YQorICAgICAqIEBwYXJhbSBtc2cgQ2x1c3Rlck1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gY29tcHJlc3MgYm9vbGVhbgorICAgICAqIEByZXR1cm4gCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHNlcmlhbGl6ZShTZXJpYWxpemFibGUgbXNnKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0cyk7CisgICAgICAgIG91dC53cml0ZU9iamVjdChtc2cpOworICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBvdXRzLnRvQnl0ZUFycmF5KCk7CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpc2NhcmQoYm9vbGVhbiBkaXNjYXJkKSB7CisgICAgICAgIHRoaXMuZGlzY2FyZCA9IGRpc2NhcmQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGlzY2FyZCgpIHsKKyAgICAgICAgcmV0dXJuIGRpc2NhcmQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNWJmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApAQCAtMCwwICsxLDk0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxtYmVhbnMtZGVzY3JpcHRvcnM+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iU2ltcGxlVGNwQ2x1c3RlciIKKyAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuQ2xhc3NOYW1lTUJlYW4iCisgICAgICAgICAgZGVzY3JpcHRpb249IlRjcCBDbHVzdGVyIGltcGxlbWVudGF0aW9uIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iQ2x1c3RlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5TaW1wbGVUY3BDbHVzdGVyIj4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwcm90b2NvbFN0YWNrIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJKYXZhR3JvdXBzIHByb3RvY29sIHN0YWNrIHNlbGVjdGlvbiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgIDwvbWJlYW4+CisKKworICA8bWJlYW4gICAgICAgICBuYW1lPSJTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIiCisgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLkNsYXNzTmFtZU1CZWFuIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDbHVzdGVyZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1hbmFnZXIgaW50ZXJmYWNlIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iTWFuYWdlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5TaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIiPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImFsZ29yaXRobSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSB0byBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZworICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIGlkZW50aWZpZXJzIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY2hlY2tJbnRlcnZhbCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGludGVydmFsIChpbiBzZWNvbmRzKSBiZXR3ZWVuIGNoZWNrcyBmb3IgZXhwaXJlZAorICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9ucyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGlzdHJpYnV0YWJsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGRpc3RyaWJ1dGFibGUgZmxhZyBmb3IgU2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgIE1hbmFnZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJlbnRyb3B5IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJBIFN0cmluZyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgdXNlZCB0byBpbmNyZWFzZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgZW50cm9weSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gb2Ygb3VyIHJhbmRvbSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWFuYWdlZFJlc291cmNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWFuYWdlZCByZXNvdXJjZSB0aGlzIE1CZWFuIGlzIGFzc29jaWF0ZWQgd2l0aCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heEFjdGl2ZVNlc3Npb25zIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIFNlc3Npb25zIGFsbG93ZWQsIG9yIC0xCisgICAgICAgICAgICAgICAgICAgICAgIGZvciBubyBsaW1pdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4SW5hY3RpdmVJbnRlcnZhbCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGRlZmF1bHQgbWF4aW11bSBpbmFjdGl2ZSBpbnRlcnZhbCBmb3IgU2Vzc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBieSB0aGlzIE1hbmFnZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkZXNjcmlwdGl2ZSBuYW1lIG9mIHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAoZm9yIGxvZ2dpbmcpIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgIDwvbWJlYW4+CisKKworCis8bWJlYW4gICAgICAgICBuYW1lPSJSZXBsaWNhdGlvblZhbHZlIgorICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5DbGFzc05hbWVNQmVhbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVmFsdmUgZm9yIHNpbXBsZSB0Y3AgcmVwbGljYXRpb24iCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJWYWx2ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblZhbHZlIj4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkZWJ1ZyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGRlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgZm9yIHRoaXMgY29tcG9uZW50IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICA8L21iZWFuPgorCisKKzwvbWJlYW5zLWRlc2NyaXB0b3JzPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL21lbWJlcnNoaXAvQ29uc3RhbnRzLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvbWVtYmVyc2hpcC9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODc5ZmNiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL21lbWJlcnNoaXAvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5tZW1iZXJzaGlwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbC5BcnJheXM7CisKKworLyoqCisgKiBNYW5pZmVzdCBjb25zdGFudHMgZm9yIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5tZW1iZXJzaGlwPC9jb2RlPgorICogcGFja2FnZS4KKyAqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQGF1dGhvciBGaWxpcCBIYW5paworICovCisKK3B1YmxpYyBjbGFzcyBDb25zdGFudHMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5tZW1iZXJzaGlwIjsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEFycmF5cy50b1N0cmluZygiVFJJQkVTLUIiLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEFycmF5cy50b1N0cmluZygiVFJJQkVTLUUiLmdldEJ5dGVzKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvbWVtYmVyc2hpcC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9tZW1iZXJzaGlwL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYWZhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvbWVtYmVyc2hpcC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMCwwICsxIEBACitjbHVzdGVyLm1iZWFuLnJlZ2lzdGVyLmFscmVhZHk9TUJlYW4gezB9IGFscmVhZHkgcmVnaXN0ZXJlZCEKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9tZW1iZXJzaGlwL01jYXN0U2VydmljZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL21lbWJlcnNoaXAvTWNhc3RTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwYTA2NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9tZW1iZXJzaGlwL01jYXN0U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5tZW1iZXJzaGlwOworCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyc2hpcExpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcnNoaXBTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy51dGlsLlVVSURHZW5lcmF0b3I7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBBIDxiPm1lbWJlcnNoaXA8L2I+IGltcGxlbWVudGF0aW9uIHVzaW5nIHNpbXBsZSBtdWx0aWNhc3QuCisgKiBUaGlzIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhIG11bHRpY2FzdCBtZW1iZXJzaGlwIHNlcnZpY2UuCisgKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBtYWludGFpbmluZyBhIGxpc3Qgb2YgYWN0aXZlIGNsdXN0ZXIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIuCisgKiBJZiBhIG5vZGUgZmFpbHMgdG8gc2VuZCBvdXQgYSBoZWFydGJlYXQsIHRoZSBub2RlIHdpbGwgYmUgZGlzbWlzc2VkLgorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKKworcHVibGljIGNsYXNzIE1jYXN0U2VydmljZSBpbXBsZW1lbnRzIE1lbWJlcnNoaXBTZXJ2aWNlLE1lbWJlcnNoaXBMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIE1jYXN0U2VydmljZS5jbGFzcyApOworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ01hbmFnZXIgc20gPSBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAiTWNhc3RTZXJ2aWNlLzIuMSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgcHJvcGVydGllcworICAgICAqLworICAgIHByb3RlY3RlZCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworICAgIC8qKgorICAgICAqIEEgaGFuZGxlIHRvIHRoZSBhY3R1YWwgbG93IGxldmVsIGltcGxlbWVudGF0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIE1jYXN0U2VydmljZUltcGwgaW1wbDsKKyAgICAvKioKKyAgICAgKiBBIG1lbWJlcnNoaXAgbGlzdGVuZXIgZGVsZWdhdGUgKHNob3VsZCBiZSB0aGUgY2x1c3RlciA6KQorICAgICAqLworICAgIHByb3RlY3RlZCBNZW1iZXJzaGlwTGlzdGVuZXIgbGlzdGVuZXI7CisgICAgLyoqCisgICAgICogVGhlIGxvY2FsIG1lbWJlcgorICAgICAqLworICAgIHByb3RlY3RlZCBNZW1iZXJJbXBsIGxvY2FsTWVtYmVyIDsKKyAgICBwcml2YXRlIGludCBtY2FzdFNvVGltZW91dDsKKyAgICBwcml2YXRlIGludCBtY2FzdFRUTDsKKyAgICAKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIHBheWxvYWQ7CisgICAgCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBkb21haW47CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBtZW1iZXJzaGlwIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIE1jYXN0U2VydmljZSgpIHsKKyAgICAgICAgLy9kZWZhdWx0IHZhbHVlcworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJtY2FzdFBvcnQiLCI0NTU2NCIpOworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJtY2FzdEFkZHJlc3MiLCIyMjguMC4wLjQiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgibWVtYmVyRHJvcFRpbWUiLCIzMDAwIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm1jYXN0RnJlcXVlbmN5IiwiNTAwIik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisgICAgICAgIHJldHVybiAoaW5mbyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMKKyAgICAgKiA8QlIvPkFsbCBhcmUgcmVxdWlyZWQ8QlIgLz4KKyAgICAgKiAxLiBtY2FzdFBvcnQgLSB0aGUgcG9ydCB0byBsaXN0ZW4gdG88QlI+CisgICAgICogMi4gbWNhc3RBZGRyZXNzIC0gdGhlIG1jYXN0IGdyb3VwIGFkZHJlc3M8QlI+CisgICAgICogNC4gYmluZEFkZHJlc3MgLSB0aGUgYmluZCBhZGRyZXNzIGlmIGFueSAtIG9ubHkgb25lIHRoYXQgY2FuIGJlIG51bGw8QlI+CisgICAgICogNS4gbWVtYmVyRHJvcFRpbWUgLSB0aGUgdGltZSBhIG1lbWJlciBpcyBnb25lIGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGdvbmUuPEJSPgorICAgICAqIDYuIG1jYXN0RnJlcXVlbmN5IC0gdGhlIGZyZXF1ZW5jeSBvZiBzZW5kaW5nIG1lc3NhZ2VzPEJSPgorICAgICAqIDcuIHRjcExpc3RlblBvcnQgLSB0aGUgcG9ydCB0aGlzIG1lbWJlciBsaXN0ZW5zIHRvPEJSPgorICAgICAqIDguIHRjcExpc3Rlbkhvc3QgLSB0aGUgYmluZCBhZGRyZXNzIG9mIHRoaXMgbWVtYmVyPEJSPgorICAgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhIHByb3BlcnR5IGlzIG1pc3NpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKKyAgICAgICAgaGFzUHJvcGVydHkocHJvcGVydGllcywibWNhc3RQb3J0Iik7CisgICAgICAgIGhhc1Byb3BlcnR5KHByb3BlcnRpZXMsIm1jYXN0QWRkcmVzcyIpOworICAgICAgICBoYXNQcm9wZXJ0eShwcm9wZXJ0aWVzLCJtZW1iZXJEcm9wVGltZSIpOworICAgICAgICBoYXNQcm9wZXJ0eShwcm9wZXJ0aWVzLCJtY2FzdEZyZXF1ZW5jeSIpOworICAgICAgICBoYXNQcm9wZXJ0eShwcm9wZXJ0aWVzLCJ0Y3BMaXN0ZW5Qb3J0Iik7CisgICAgICAgIGhhc1Byb3BlcnR5KHByb3BlcnRpZXMsInRjcExpc3Rlbkhvc3QiKTsKKyAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3BlcnRpZXMsIHNlZSBzZXRQcm9wZXJ0aWVzCisgICAgICovCisgICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2NhbCBtZW1iZXIgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxNZW1iZXJOYW1lKCkgeworICAgICAgICByZXR1cm4gbG9jYWxNZW1iZXIudG9TdHJpbmcoKSA7CisgICAgfQorIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9jYWwgbWVtYmVyCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBnZXRMb2NhbE1lbWJlcihib29sZWFuIGFsaXZlKSB7CisgICAgICAgIGlmICggYWxpdmUgJiYgbG9jYWxNZW1iZXIgIT0gbnVsbCAmJiBpbXBsICE9IG51bGwpIGxvY2FsTWVtYmVyLnNldE1lbWJlckFsaXZlVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS1pbXBsLmdldFNlcnZpY2VTdGFydFRpbWUoKSk7CisgICAgICAgIHJldHVybiBsb2NhbE1lbWJlcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbG9jYWwgbWVtYmVyIHByb3BlcnRpZXMgZm9yIGJyb2FkY2FzdGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsTWVtYmVyUHJvcGVydGllcyhTdHJpbmcgbGlzdGVuSG9zdCwgaW50IGxpc3RlblBvcnQpIHsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgidGNwTGlzdGVuSG9zdCIsbGlzdGVuSG9zdCk7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoInRjcExpc3RlblBvcnQiLFN0cmluZy52YWx1ZU9mKGxpc3RlblBvcnQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChsb2NhbE1lbWJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9jYWxNZW1iZXIuc2V0SG9zdG5hbWUobGlzdGVuSG9zdCk7CisgICAgICAgICAgICAgICAgbG9jYWxNZW1iZXIuc2V0UG9ydChsaXN0ZW5Qb3J0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9jYWxNZW1iZXIgPSBuZXcgTWVtYmVySW1wbChsaXN0ZW5Ib3N0LCBsaXN0ZW5Qb3J0LCAwKTsKKyAgICAgICAgICAgICAgICBsb2NhbE1lbWJlci5zZXRVbmlxdWVJZChVVUlER2VuZXJhdG9yLnJhbmRvbVVVSUQodHJ1ZSkpOworICAgICAgICAgICAgICAgIGxvY2FsTWVtYmVyLnNldFBheWxvYWQoZ2V0UGF5bG9hZCgpKTsKKyAgICAgICAgICAgICAgICBsb2NhbE1lbWJlci5zZXREb21haW4oZ2V0RG9tYWluKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jYWxNZW1iZXIuZ2V0RGF0YSh0cnVlLCB0cnVlKTsKKyAgICAgICAgfWNhdGNoICggSU9FeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oeCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0TWNhc3RBZGRyKFN0cmluZyBhZGRyKSB7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm1jYXN0QWRkcmVzcyIsIGFkZHIpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWNhc3RBZGRyKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibWNhc3RBZGRyZXNzIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWNhc3RCaW5kQWRkcmVzcyhTdHJpbmcgYmluZGFkZHIpIHsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgibWNhc3RCaW5kQWRkcmVzcyIsIGJpbmRhZGRyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1jYXN0QmluZEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJtY2FzdEJpbmRBZGRyZXNzIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWNhc3RQb3J0KGludCBwb3J0KSB7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm1jYXN0UG9ydCIsIFN0cmluZy52YWx1ZU9mKHBvcnQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1jYXN0UG9ydCgpIHsKKyAgICAgICAgU3RyaW5nIHAgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJtY2FzdFBvcnQiKTsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKHApLmludFZhbHVlKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldE1jYXN0RnJlcXVlbmN5KGxvbmcgdGltZSkgeworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJtY2FzdEZyZXF1ZW5jeSIsIFN0cmluZy52YWx1ZU9mKHRpbWUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRNY2FzdEZyZXF1ZW5jeSgpIHsKKyAgICAgICAgU3RyaW5nIHAgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJtY2FzdEZyZXF1ZW5jeSIpOworICAgICAgICByZXR1cm4gbmV3IExvbmcocCkubG9uZ1ZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWNhc3REcm9wVGltZShsb25nIHRpbWUpIHsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgibWVtYmVyRHJvcFRpbWUiLCBTdHJpbmcudmFsdWVPZih0aW1lKSk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0TWNhc3REcm9wVGltZSgpIHsKKyAgICAgICAgU3RyaW5nIHAgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJtZW1iZXJEcm9wVGltZSIpOworICAgICAgICByZXR1cm4gbmV3IExvbmcocCkubG9uZ1ZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYSByZXF1aXJlZCBwcm9wZXJ0eSBpcyBhdmFpbGFibGUuCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHNldCBvZiBwcm9wZXJ0aWVzCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHByb3BlcnR5IHRvIGNoZWNrIGZvcgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhc1Byb3BlcnR5KFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIG5hbWUpeworICAgICAgICBpZiAoIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkobmFtZSk9PW51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1jYXN0U2VydmljZTpSZXF1aXJlZCBwcm9wZXJ0eSBcIiIrbmFtZSsiXCIgaXMgbWlzc2luZy4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBicm9hZGNhc3RpbmcgYW5kIGxpc3RlbmluZyB0byBtZW1iZXJzaGlwIHBpbmdzCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIGlmIGEgSU8gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0KE1lbWJlcnNoaXBTZXJ2aWNlLk1CUl9SWCk7CisgICAgICAgIHN0YXJ0KE1lbWJlcnNoaXBTZXJ2aWNlLk1CUl9UWCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGludCBsZXZlbCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24geworICAgICAgICBoYXNQcm9wZXJ0eShwcm9wZXJ0aWVzLCJtY2FzdFBvcnQiKTsKKyAgICAgICAgaGFzUHJvcGVydHkocHJvcGVydGllcywibWNhc3RBZGRyZXNzIik7CisgICAgICAgIGhhc1Byb3BlcnR5KHByb3BlcnRpZXMsIm1lbWJlckRyb3BUaW1lIik7CisgICAgICAgIGhhc1Byb3BlcnR5KHByb3BlcnRpZXMsIm1jYXN0RnJlcXVlbmN5Iik7CisgICAgICAgIGhhc1Byb3BlcnR5KHByb3BlcnRpZXMsInRjcExpc3RlblBvcnQiKTsKKyAgICAgICAgaGFzUHJvcGVydHkocHJvcGVydGllcywidGNwTGlzdGVuSG9zdCIpOworCisgICAgICAgIGlmICggaW1wbCAhPSBudWxsICkgeworICAgICAgICAgICAgaW1wbC5zdGFydChsZXZlbCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGhvc3QgPSBnZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoInRjcExpc3Rlbkhvc3QiKTsKKyAgICAgICAgaW50IHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSgidGNwTGlzdGVuUG9ydCIpKTsKKyAgICAgICAgCisgICAgICAgIGlmICggbG9jYWxNZW1iZXIgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIGxvY2FsTWVtYmVyID0gbmV3IE1lbWJlckltcGwoaG9zdCwgcG9ydCwgMTAwKTsKKyAgICAgICAgICAgIGxvY2FsTWVtYmVyLnNldFVuaXF1ZUlkKFVVSURHZW5lcmF0b3IucmFuZG9tVVVJRCh0cnVlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2NhbE1lbWJlci5zZXRIb3N0bmFtZShob3N0KTsKKyAgICAgICAgICAgIGxvY2FsTWVtYmVyLnNldFBvcnQocG9ydCk7CisgICAgICAgICAgICBsb2NhbE1lbWJlci5zZXRNZW1iZXJBbGl2ZVRpbWUoMTAwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHRoaXMucGF5bG9hZCAhPSBudWxsICkgbG9jYWxNZW1iZXIuc2V0UGF5bG9hZChwYXlsb2FkKTsKKyAgICAgICAgaWYgKCB0aGlzLmRvbWFpbiAhPSBudWxsICkgbG9jYWxNZW1iZXIuc2V0RG9tYWluKGRvbWFpbik7CisgICAgICAgIGxvY2FsTWVtYmVyLnNldFNlcnZpY2VTdGFydFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICBqYXZhLm5ldC5JbmV0QWRkcmVzcyBiaW5kID0gbnVsbDsKKyAgICAgICAgaWYgKCBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJtY2FzdEJpbmRBZGRyZXNzIikhPSBudWxsICkgeworICAgICAgICAgICAgYmluZCA9IGphdmEubmV0LkluZXRBZGRyZXNzLmdldEJ5TmFtZShwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJtY2FzdEJpbmRBZGRyZXNzIikpOworICAgICAgICB9CisgICAgICAgIGludCB0dGwgPSAtMTsKKyAgICAgICAgaW50IHNvVGltZW91dCA9IC0xOworICAgICAgICBpZiAoIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1jYXN0VFRMIikgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdHRsID0gSW50ZWdlci5wYXJzZUludChwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJtY2FzdFRUTCIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBwYXJzZSBtY2FzdFRUTD0iK3Byb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1jYXN0VFRMIikseCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJtY2FzdFNvVGltZW91dCIpICE9IG51bGwgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNvVGltZW91dCA9IEludGVnZXIucGFyc2VJbnQocHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibWNhc3RTb1RpbWVvdXQiKSk7CisgICAgICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gcGFyc2UgbWNhc3RTb1RpbWVvdXQ9Iitwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJtY2FzdFNvVGltZW91dCIpLHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW1wbCA9IG5ldyBNY2FzdFNlcnZpY2VJbXBsKChNZW1iZXJJbXBsKWxvY2FsTWVtYmVyLExvbmcucGFyc2VMb25nKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1jYXN0RnJlcXVlbmN5IikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5wYXJzZUxvbmcocHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibWVtYmVyRHJvcFRpbWUiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1jYXN0UG9ydCIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLm5ldC5JbmV0QWRkcmVzcy5nZXRCeU5hbWUocHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibWNhc3RBZGRyZXNzIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29UaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7CisgICAgICAgIAorICAgICAgICBpbXBsLnN0YXJ0KGxldmVsKTsKKwkJCisKKyAgICB9CisKKyAKKyAgICAvKioKKyAgICAgKiBTdG9wIGJyb2FkY2FzdGluZyBhbmQgbGlzdGVuaW5nIHRvIG1lbWJlcnNoaXAgcGluZ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKGludCBzdmMpIHsKKyAgICAgICAgdHJ5ICB7CisgICAgICAgICAgICBpZiAoIGltcGwgIT0gbnVsbCAmJiBpbXBsLnN0b3Aoc3ZjKSApIGltcGwgPSBudWxsOworICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHgpICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzdG9wIHRoZSBtY2FzdCBzZXJ2aWNlLCBsZXZlbDoiK3N2YysiLiIseCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbGwgdGhlIG1lbWJlcnMgYnkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNZW1iZXJzQnlOYW1lKCkgeworICAgICAgICBNZW1iZXJbXSBjdXJyZW50TWVtYmVycyA9IGdldE1lbWJlcnMoKTsKKyAgICAgICAgU3RyaW5nIFtdIG1lbWJlcm5hbWVzIDsKKyAgICAgICAgaWYoY3VycmVudE1lbWJlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgbWVtYmVybmFtZXMgPSBuZXcgU3RyaW5nW2N1cnJlbnRNZW1iZXJzLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRNZW1iZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbWVtYmVybmFtZXNbaV0gPSBjdXJyZW50TWVtYmVyc1tpXS50b1N0cmluZygpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtZW1iZXJuYW1lcyA9IG5ldyBTdHJpbmdbMF0gOworICAgICAgICByZXR1cm4gbWVtYmVybmFtZXMgOworICAgIH0KKyAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1lbWJlciBieSBuYW1lCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBmaW5kTWVtYmVyQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIE1lbWJlcltdIGN1cnJlbnRNZW1iZXJzID0gZ2V0TWVtYmVycygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRNZW1iZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoY3VycmVudE1lbWJlcnNbaV0udG9TdHJpbmcoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRNZW1iZXJzW2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIGhhcyBtZW1iZXJzPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc01lbWJlcnMoKSB7CisgICAgICAgaWYgKCBpbXBsID09IG51bGwgfHwgaW1wbC5tZW1iZXJzaGlwID09IG51bGwgKSByZXR1cm4gZmFsc2U7CisgICAgICAgcmV0dXJuIGltcGwubWVtYmVyc2hpcC5oYXNNZW1iZXJzKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNZW1iZXIgZ2V0TWVtYmVyKE1lbWJlciBtYnIpIHsKKyAgICAgICAgaWYgKCBpbXBsID09IG51bGwgfHwgaW1wbC5tZW1iZXJzaGlwID09IG51bGwgKSByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIGltcGwubWVtYmVyc2hpcC5nZXRNZW1iZXIobWJyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIHRoZSBtZW1iZXJzCisgICAgICovCisgICAgcHVibGljIE1lbWJlcltdIGdldE1lbWJlcnMoKSB7CisgICAgICAgIGlmICggaW1wbCA9PSBudWxsIHx8IGltcGwubWVtYmVyc2hpcCA9PSBudWxsICkgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBpbXBsLm1lbWJlcnNoaXAuZ2V0TWVtYmVycygpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBBZGQgYSBtZW1iZXJzaGlwIGxpc3RlbmVyLCB0aGlzIHZlcnNpb24gb25seSBzdXBwb3J0cyBvbmUgbGlzdGVuZXIgcGVyIHNlcnZpY2UsCisgICAgICogc28gY2FsbGluZyB0aGlzIG1ldGhvZCB0d2ljZSB3aWxsIHJlc3VsdCBpbiBvbmx5IHRoZSBzZWNvbmQgbGlzdGVuZXIgYmVpbmcgYWN0aXZlLgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZW1iZXJzaGlwTGlzdGVuZXIoTWVtYmVyc2hpcExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBtZW1iZXJzaGlwIGxpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTWVtYmVyc2hpcExpc3RlbmVyKCl7CisgICAgICAgIGxpc3RlbmVyID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIGlmICggbGlzdGVuZXIhPW51bGwgKSBsaXN0ZW5lci5tZW1iZXJBZGRlZChtZW1iZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZyb20gdGhlIGltcGwgd2hlbiBhIG5ldyBtZW1iZXIgaGFzIGJlZW4gcmVjZWl2ZWQKKyAgICAgKiBAcGFyYW0gbWVtYmVyIFRoZSBtZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJEaXNhcHBlYXJlZChNZW1iZXIgbWVtYmVyKQorICAgIHsKKyAgICAgICAgaWYgKCBsaXN0ZW5lciE9bnVsbCApIGxpc3RlbmVyLm1lbWJlckRpc2FwcGVhcmVkKG1lbWJlcik7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNY2FzdFNvVGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIG1jYXN0U29UaW1lb3V0OworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRNY2FzdFNvVGltZW91dChpbnQgbWNhc3RTb1RpbWVvdXQpIHsKKyAgICAgICAgdGhpcy5tY2FzdFNvVGltZW91dCA9IG1jYXN0U29UaW1lb3V0OworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJtY2FzdFNvVGltZW91dCIsIFN0cmluZy52YWx1ZU9mKG1jYXN0U29UaW1lb3V0KSk7CisgICAgfQorICAgIHB1YmxpYyBpbnQgZ2V0TWNhc3RUVEwoKSB7CisgICAgICAgIHJldHVybiBtY2FzdFRUTDsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldFBheWxvYWQoKSB7CisgICAgICAgIHJldHVybiBwYXlsb2FkOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYnl0ZVtdIGdldERvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIGRvbWFpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNY2FzdFRUTChpbnQgbWNhc3RUVEwpIHsKKyAgICAgICAgdGhpcy5tY2FzdFRUTCA9IG1jYXN0VFRMOworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJtY2FzdFRUTCIsIFN0cmluZy52YWx1ZU9mKG1jYXN0VFRMKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGF5bG9hZChieXRlW10gcGF5bG9hZCkgeworICAgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkOworICAgICAgICBpZiAoIGxvY2FsTWVtYmVyICE9IG51bGwgKSB7CisgICAgICAgICAgICBsb2NhbE1lbWJlci5zZXRQYXlsb2FkKHBheWxvYWQpOworICAgICAgICAgICAgbG9jYWxNZW1iZXIuZ2V0RGF0YSh0cnVlLHRydWUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoaW1wbCAhPSBudWxsKSBpbXBsLnNlbmQoZmFsc2UpOworICAgICAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gc2VuZCBwYXlsb2FkIHVwZGF0ZS4iLHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihieXRlW10gZG9tYWluKSB7CisgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOworICAgICAgICBpZiAoIGxvY2FsTWVtYmVyICE9IG51bGwgKSB7CisgICAgICAgICAgICBsb2NhbE1lbWJlci5zZXREb21haW4oZG9tYWluKTsKKyAgICAgICAgICAgIGxvY2FsTWVtYmVyLmdldERhdGEodHJ1ZSx0cnVlKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGltcGwgIT0gbnVsbCkgaW1wbC5zZW5kKGZhbHNlKTsKKyAgICAgICAgICAgIH1jYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHNlbmQgZG9tYWluIHVwZGF0ZS4iLHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2ltcGxlIHRlc3QgcHJvZ3JhbQorICAgICAqIEBwYXJhbSBhcmdzIENvbW1hbmQtbGluZSBhcmd1bWVudHMKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaWYobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5pbmZvKCJVc2FnZSBNY2FzdFNlcnZpY2UgaG9zdG5hbWUgdGNwcG9ydCIpOworICAgICAgICBNY2FzdFNlcnZpY2Ugc2VydmljZSA9IG5ldyBNY2FzdFNlcnZpY2UoKTsKKyAgICAgICAgamF2YS51dGlsLlByb3BlcnRpZXMgcCA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOworICAgICAgICBwLnNldFByb3BlcnR5KCJtY2FzdFBvcnQiLCI1NTU1Iik7CisgICAgICAgIHAuc2V0UHJvcGVydHkoIm1jYXN0QWRkcmVzcyIsIjIyNC4xMC4xMC4xMCIpOworICAgICAgICBwLnNldFByb3BlcnR5KCJtY2FzdENsdXN0ZXJEb21haW4iLCJjYXRhbGluYSIpOworICAgICAgICBwLnNldFByb3BlcnR5KCJiaW5kQWRkcmVzcyIsImxvY2FsaG9zdCIpOworICAgICAgICBwLnNldFByb3BlcnR5KCJtZW1iZXJEcm9wVGltZSIsIjMwMDAiKTsKKyAgICAgICAgcC5zZXRQcm9wZXJ0eSgibWNhc3RGcmVxdWVuY3kiLCI1MDAiKTsKKyAgICAgICAgcC5zZXRQcm9wZXJ0eSgidGNwTGlzdGVuUG9ydCIsIjQwMDAiKTsKKyAgICAgICAgcC5zZXRQcm9wZXJ0eSgidGNwTGlzdGVuSG9zdCIsIjEyNy4wLjAuMSIpOworICAgICAgICBzZXJ2aWNlLnNldFByb3BlcnRpZXMocCk7CisgICAgICAgIHNlcnZpY2Uuc3RhcnQoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDYwKjEwMDAqNjApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9tZW1iZXJzaGlwL01jYXN0U2VydmljZUltcGwuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9tZW1iZXJzaGlwL01jYXN0U2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjk3ZjRkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL21lbWJlcnNoaXAvTWNhc3RTZXJ2aWNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5tZW1iZXJzaGlwOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkRhdGFncmFtUGFja2V0OworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0Lk11bHRpY2FzdFNvY2tldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcnNoaXBMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWw7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CisKKy8qKgorICogQSA8Yj5tZW1iZXJzaGlwPC9iPiBpbXBsZW1lbnRhdGlvbiB1c2luZyBzaW1wbGUgbXVsdGljYXN0LgorICogVGhpcyBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYSBtdWx0aWNhc3QgbWVtYmVyc2hpcCBzZXJ2aWNlLgorICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgbWFpbnRhaW5pbmcgYSBsaXN0IG9mIGFjdGl2ZSBjbHVzdGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyLgorICogSWYgYSBub2RlIGZhaWxzIHRvIHNlbmQgb3V0IGEgaGVhcnRiZWF0LCB0aGUgbm9kZSB3aWxsIGJlIGRpc21pc3NlZC4KKyAqIFRoaXMgaXMgdGhlIGxvdyBsZXZlbCBpbXBsZW1lbnRhdGlvbiB0aGF0IGhhbmRsZXMgdGhlIG11bHRpY2FzdGluZyBzb2NrZXRzLgorICogTmVlZCB0byBmaXggdGhpcywgY291bGQgdXNlIGphdmEubmlvIGFuZCBvbmx5IG5lZWQgb25lIHRocmVhZCB0byBzZW5kIGFuZCByZWNlaXZlLCBvcgorICoganVzdCB1c2UgYSB0aW1lb3V0IG9uIHRoZSByZWNlaXZlCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIE1jYXN0U2VydmljZUltcGwKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIE1jYXN0U2VydmljZS5jbGFzcyApOworICAgIAorICAgIHByb3RlY3RlZCBzdGF0aWMgaW50IE1BWF9QQUNLRVRfU0laRSA9IDY1NTM1OworICAgIC8qKgorICAgICAqIEludGVybmFsIGZsYWcgdXNlZCBmb3IgdGhlIGxpc3RlbiB0aHJlYWQgdGhhdCBsaXN0ZW5zIHRvIHRoZSBtdWx0aWNhc3Rpbmcgc29ja2V0LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGRvUnVuU2VuZGVyID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZG9SdW5SZWNlaXZlciA9IGZhbHNlOworICAgIHByb3RlY3RlZCBpbnQgc3RhcnRMZXZlbCA9IDA7CisgICAgLyoqCisgICAgICogU29ja2V0IHRoYXQgd2UgaW50ZW5kIHRvIGxpc3RlbiB0bworICAgICAqLworICAgIHByb3RlY3RlZCBNdWx0aWNhc3RTb2NrZXQgc29ja2V0OworICAgIC8qKgorICAgICAqIFRoZSBsb2NhbCBtZW1iZXIgdGhhdCB3ZSBpbnRlbmQgdG8gYnJvYWQgY2FzdCBvdmVyIGFuZCBvdmVyIGFnYWluCisgICAgICovCisgICAgcHJvdGVjdGVkIE1lbWJlckltcGwgbWVtYmVyOworICAgIC8qKgorICAgICAqIFRoZSBtdWx0aWNhc3QgYWRkcmVzcworICAgICAqLworICAgIHByb3RlY3RlZCBJbmV0QWRkcmVzcyBhZGRyZXNzOworICAgIC8qKgorICAgICAqIFRoZSBtdWx0aWNhc3QgcG9ydAorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgcG9ydDsKKyAgICAvKioKKyAgICAgKiBUaGUgdGltZSBpdCB0YWtlcyBmb3IgYSBtZW1iZXIgdG8gZXhwaXJlLgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIHRpbWVUb0V4cGlyYXRpb247CisgICAgLyoqCisgICAgICogSG93IG9mdGVuIHRvIHdlIHNlbmQgb3V0IGEgYnJvYWRjYXN0IHNheWluZyB3ZSBhcmUgYWxpdmUsIG11c3QgYmUgc21hbGxlciB0aGFuIHRpbWVUb0V4cGlyYXRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBzZW5kRnJlcXVlbmN5OworICAgIC8qKgorICAgICAqIFJldXNlIHRoZSBzZW5kUGFja2V0LCBubyBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBvbmUgZXZlcnl0aW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIERhdGFncmFtUGFja2V0IHNlbmRQYWNrZXQ7CisgICAgLyoqCisgICAgICogUmV1c2UgdGhlIHJlY2VpdmVQYWNrZXQsIG5vIG5lZWQgdG8gY3JlYXRlIGEgbmV3IG9uZSBldmVyeXRpbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGF0YWdyYW1QYWNrZXQgcmVjZWl2ZVBhY2tldDsKKyAgICAvKioKKyAgICAgKiBUaGUgbWVtYmVyc2hpcCwgdXNlZCBzbyB0aGF0IHdlIGNhbGN1bGF0ZSBtZW1iZXJzaGlwcyB3aGVuIHRoZXkgYXJyaXZlIG9yIGRvbid0IGFycml2ZQorICAgICAqLworICAgIHByb3RlY3RlZCBNZW1iZXJzaGlwIG1lbWJlcnNoaXA7CisgICAgLyoqCisgICAgICogVGhlIGFjdHVhbCBsaXN0ZW5lciwgZm9yIGNhbGxiYWNrIHdoZW4gc2hpdHMgZ29lcyBkb3duCisgICAgICovCisgICAgcHJvdGVjdGVkIE1lbWJlcnNoaXBMaXN0ZW5lciBzZXJ2aWNlOworICAgIC8qKgorICAgICAqIFRocmVhZCB0byBsaXN0ZW4gZm9yIHBpbmdzCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlY2VpdmVyVGhyZWFkIHJlY2VpdmVyOworICAgIC8qKgorICAgICAqIFRocmVhZCB0byBzZW5kIHBpbmdzCisgICAgICovCisgICAgcHJvdGVjdGVkIFNlbmRlclRocmVhZCBzZW5kZXI7CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHdhcyB0aGUgc2VydmljZSBzdGFydGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgc2VydmljZVN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIAorICAgIC8qKgorICAgICAqIFRpbWUgdG8gbGl2ZSBmb3IgdGhlIG11bHRpY2FzdCBwYWNrZXRzIHRoYXQgYXJlIGJlaW5nIHNlbnQgb3V0CisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtY2FzdFRUTCA9IC0xOworICAgIC8qKgorICAgICAqIFJlYWQgdGltZW91dCBvbiB0aGUgbWNhc3Qgc29ja2V0CisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtY2FzdFNvVGltZW91dCA9IC0xOworICAgIC8qKgorICAgICAqIGJpbmQgYWRkcmVzcworICAgICAqLworICAgIHByb3RlY3RlZCBJbmV0QWRkcmVzcyBtY2FzdEJpbmRBZGRyZXNzID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgbWNhc3Qgc2VydmljZSBpbXBsCisgICAgICogQHBhcmFtIG1lbWJlciAtIHRoZSBsb2NhbCBtZW1iZXIKKyAgICAgKiBAcGFyYW0gc2VuZEZyZXF1ZW5jeSAtIHRoZSB0aW1lIChtcykgaW4gYmV0d2VlbiBwaW5ncyBzZW50IG91dAorICAgICAqIEBwYXJhbSBleHBpcmVUaW1lIC0gdGhlIHRpbWUgKG1zKSBmb3IgYSBtZW1iZXIgdG8gZXhwaXJlCisgICAgICogQHBhcmFtIHBvcnQgLSB0aGUgbWNhc3QgcG9ydAorICAgICAqIEBwYXJhbSBiaW5kIC0gdGhlIGJpbmQgYWRkcmVzcyAobm90IHN1cmUgdGhpcyBpcyB1c2VkIHlldCkKKyAgICAgKiBAcGFyYW0gbWNhc3RBZGRyZXNzIC0gdGhlIG1jYXN0IGFkZHJlc3MKKyAgICAgKiBAcGFyYW0gc2VydmljZSAtIHRoZSBjYWxsYmFjayBzZXJ2aWNlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBNY2FzdFNlcnZpY2VJbXBsKAorICAgICAgICBNZW1iZXJJbXBsIG1lbWJlciwKKyAgICAgICAgbG9uZyBzZW5kRnJlcXVlbmN5LAorICAgICAgICBsb25nIGV4cGlyZVRpbWUsCisgICAgICAgIGludCBwb3J0LAorICAgICAgICBJbmV0QWRkcmVzcyBiaW5kLAorICAgICAgICBJbmV0QWRkcmVzcyBtY2FzdEFkZHJlc3MsCisgICAgICAgIGludCB0dGwsCisgICAgICAgIGludCBzb1RpbWVvdXQsCisgICAgICAgIE1lbWJlcnNoaXBMaXN0ZW5lciBzZXJ2aWNlKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMubWVtYmVyID0gbWVtYmVyOworICAgICAgICB0aGlzLmFkZHJlc3MgPSBtY2FzdEFkZHJlc3M7CisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgIHRoaXMubWNhc3RTb1RpbWVvdXQgPSBzb1RpbWVvdXQ7CisgICAgICAgIHRoaXMubWNhc3RUVEwgPSB0dGw7CisgICAgICAgIHRoaXMubWNhc3RCaW5kQWRkcmVzcyA9IGJpbmQ7CisgICAgICAgIHRoaXMudGltZVRvRXhwaXJhdGlvbiA9IGV4cGlyZVRpbWU7CisgICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7CisgICAgICAgIHRoaXMuc2VuZEZyZXF1ZW5jeSA9IHNlbmRGcmVxdWVuY3k7CisgICAgICAgIHNldHVwU29ja2V0KCk7CisgICAgICAgIHNlbmRQYWNrZXQgPSBuZXcgRGF0YWdyYW1QYWNrZXQobmV3IGJ5dGVbTUFYX1BBQ0tFVF9TSVpFXSxNQVhfUEFDS0VUX1NJWkUpOworICAgICAgICBzZW5kUGFja2V0LnNldEFkZHJlc3MoYWRkcmVzcyk7CisgICAgICAgIHNlbmRQYWNrZXQuc2V0UG9ydChwb3J0KTsKKyAgICAgICAgcmVjZWl2ZVBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVtNQVhfUEFDS0VUX1NJWkVdLE1BWF9QQUNLRVRfU0laRSk7CisgICAgICAgIHJlY2VpdmVQYWNrZXQuc2V0QWRkcmVzcyhhZGRyZXNzKTsKKyAgICAgICAgcmVjZWl2ZVBhY2tldC5zZXRQb3J0KHBvcnQpOworICAgICAgICBtZW1iZXJzaGlwID0gbmV3IE1lbWJlcnNoaXAobWVtYmVyKTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBTb2NrZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobWNhc3RCaW5kQWRkcmVzcyAhPSBudWxsKSBzb2NrZXQgPSBuZXcgTXVsdGljYXN0U29ja2V0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhtY2FzdEJpbmRBZGRyZXNzLCBwb3J0KSk7CisgICAgICAgIGVsc2Ugc29ja2V0ID0gbmV3IE11bHRpY2FzdFNvY2tldChwb3J0KTsKKyAgICAgICAgaWYgKG1jYXN0QmluZEFkZHJlc3MgIT0gbnVsbCkgeworCQkJaWYobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiU2V0dGluZyBtdWx0aWhvbWUgbXVsdGljYXN0IGludGVyZmFjZSB0bzoiICttY2FzdEJpbmRBZGRyZXNzKTsKKyAgICAgICAgICAgIHNvY2tldC5zZXRJbnRlcmZhY2UobWNhc3RCaW5kQWRkcmVzcyk7CisgICAgICAgIH0gLy9lbmQgaWYKKyAgICAgICAgLy9mb3JjZSBhIHNvIHRpbWVvdXQgc28gdGhhdCB3ZSBkb24ndCBibG9jayBmb3JldmVyCisgICAgICAgIGlmICggbWNhc3RTb1RpbWVvdXQgPD0gMCApIG1jYXN0U29UaW1lb3V0ID0gKGludClzZW5kRnJlcXVlbmN5OworICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oIlNldHRpbmcgY2x1c3RlciBtY2FzdCBzb1RpbWVvdXQgdG8gIittY2FzdFNvVGltZW91dCk7CisgICAgICAgIHNvY2tldC5zZXRTb1RpbWVvdXQobWNhc3RTb1RpbWVvdXQpOworCisgICAgICAgIGlmICggbWNhc3RUVEwgPj0gMCApIHsKKwkJCWlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oIlNldHRpbmcgY2x1c3RlciBtY2FzdCBUVEwgdG8gIiArIG1jYXN0VFRMKTsKKyAgICAgICAgICAgIHNvY2tldC5zZXRUaW1lVG9MaXZlKG1jYXN0VFRMKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBzZXJ2aWNlCisgICAgICogQHBhcmFtIGxldmVsIDEgc3RhcnRzIHRoZSByZWNlaXZlciwgbGV2ZWwgMiBzdGFydHMgdGhlIHNlbmRlcgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHNlcnZpY2UgZmFpbHMgdG8gc3RhcnQKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgc2VydmljZSBpcyBhbHJlYWR5IHN0YXJ0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoaW50IGxldmVsKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBib29sZWFuIHZhbGlkID0gZmFsc2U7CisgICAgICAgIGlmICggKGxldmVsICYgQ2hhbm5lbC5NQlJfUlhfU0VRKT09Q2hhbm5lbC5NQlJfUlhfU0VRICkgeworICAgICAgICAgICAgaWYgKCByZWNlaXZlciAhPSBudWxsICkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWNhc3RTZXJ2aWNlLnJlY2VpdmUgYWxyZWFkeSBydW5uaW5nLiIpOworICAgICAgICAgICAgaWYgKCBzZW5kZXIgPT0gbnVsbCApIHNvY2tldC5qb2luR3JvdXAoYWRkcmVzcyk7CisgICAgICAgICAgICBkb1J1blJlY2VpdmVyID0gdHJ1ZTsKKyAgICAgICAgICAgIHJlY2VpdmVyID0gbmV3IFJlY2VpdmVyVGhyZWFkKCk7CisgICAgICAgICAgICByZWNlaXZlci5zZXREYWVtb24odHJ1ZSk7CisgICAgICAgICAgICByZWNlaXZlci5zdGFydCgpOworICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICB9IAorICAgICAgICBpZiAoIChsZXZlbCAmIENoYW5uZWwuTUJSX1RYX1NFUSk9PUNoYW5uZWwuTUJSX1RYX1NFUSApIHsKKyAgICAgICAgICAgIGlmICggc2VuZGVyICE9IG51bGwgKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNY2FzdFNlcnZpY2Uuc2VuZCBhbHJlYWR5IHJ1bm5pbmcuIik7CisgICAgICAgICAgICBpZiAoIHJlY2VpdmVyID09IG51bGwgKSBzb2NrZXQuam9pbkdyb3VwKGFkZHJlc3MpOworICAgICAgICAgICAgLy9tYWtlIHN1cmUgYXQgbGVhc3Qgb25lIHBhY2tldCBnZXRzIG91dCB0aGVyZQorICAgICAgICAgICAgc2VuZChmYWxzZSk7CisgICAgICAgICAgICBkb1J1blNlbmRlciA9IHRydWU7CisgICAgICAgICAgICBzZXJ2aWNlU3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBzZW5kZXIgPSBuZXcgU2VuZGVyVGhyZWFkKHNlbmRGcmVxdWVuY3kpOworICAgICAgICAgICAgc2VuZGVyLnNldERhZW1vbih0cnVlKTsKKyAgICAgICAgICAgIHNlbmRlci5zdGFydCgpOworICAgICAgICAgICAgLy93ZSBoYXZlIHN0YXJ0ZWQgdGhlIHJlY2VpdmVyLCBidXQgbm90IHlldCB3YWl0ZWQgZm9yIG1lbWJlcnNoaXAgdG8gZXN0YWJsaXNoCisgICAgICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgIH0gCisgICAgICAgIGlmICghdmFsaWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RhcnQgbGV2ZWwuIE9ubHkgYWNjZXB0YWJsZSBsZXZlbHMgYXJlIENoYW5uZWwuTUJSX1JYX1NFUSBhbmQgQ2hhbm5lbC5NQlJfVFhfU0VRIik7CisgICAgICAgIH0KKyAgICAgICAgLy9wYXVzZSwgb25jZSBvciB0d2ljZQorICAgICAgICB3YWl0Rm9yTWVtYmVycyhsZXZlbCk7CisgICAgICAgIHN0YXJ0TGV2ZWwgPSAoc3RhcnRMZXZlbCB8IGxldmVsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvck1lbWJlcnMoaW50IGxldmVsKSB7CisgICAgICAgIGxvbmcgbWVtYmVyd2FpdCA9IHNlbmRGcmVxdWVuY3kqMjsKKyAgICAgICAgaWYobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5pbmZvKCJTbGVlcGluZyBmb3IgIittZW1iZXJ3YWl0KyIgbWlsbGlzZWNvbmRzIHRvIGVzdGFibGlzaCBjbHVzdGVyIG1lbWJlcnNoaXAsIHN0YXJ0IGxldmVsOiIrbGV2ZWwpOworICAgICAgICB0cnkge1RocmVhZC5zbGVlcChtZW1iZXJ3YWl0KTt9Y2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZSl7fQorICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oIkRvbmUgc2xlZXBpbmcsIG1lbWJlcnNoaXAgZXN0YWJsaXNoZWQsIHN0YXJ0IGxldmVsOiIrbGV2ZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBzZXJ2aWNlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgc2VydmljZSBmYWlscyB0byBkaXNjb25uZWN0IGZyb20gdGhlIHNvY2tldHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RvcChpbnQgbGV2ZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIGlmICggKGxldmVsICYgQ2hhbm5lbC5NQlJfUlhfU0VRKT09Q2hhbm5lbC5NQlJfUlhfU0VRICkgeworICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgZG9SdW5SZWNlaXZlciA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCByZWNlaXZlciAhPW51bGwgKSByZWNlaXZlci5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHJlY2VpdmVyID0gbnVsbDsKKyAgICAgICAgfSAKKyAgICAgICAgaWYgKCAobGV2ZWwgJiBDaGFubmVsLk1CUl9UWF9TRVEpPT1DaGFubmVsLk1CUl9UWF9TRVEgKSB7CisgICAgICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgICAgICBkb1J1blNlbmRlciA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCBzZW5kZXIgIT0gbnVsbCApc2VuZGVyLmludGVycnVwdCgpOworICAgICAgICAgICAgc2VuZGVyID0gbnVsbDsKKyAgICAgICAgfSAKKyAgICAgICAgCisgICAgICAgIGlmICghdmFsaWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RvcCBsZXZlbC4gT25seSBhY2NlcHRhYmxlIGxldmVscyBhcmUgQ2hhbm5lbC5NQlJfUlhfU0VRIGFuZCBDaGFubmVsLk1CUl9UWF9TRVEiKTsKKyAgICAgICAgfQorICAgICAgICBzdGFydExldmVsID0gKHN0YXJ0TGV2ZWwgJiAofmxldmVsKSk7CisgICAgICAgIC8vd2UncmUgc2h1dHRpbmcgZG93biwgc2VuZCBhIHNodXRkb3duIG1lc3NhZ2UgYW5kIGNsb3NlIHRoZSBzb2NrZXQKKyAgICAgICAgaWYgKCBzdGFydExldmVsID09IDAgKSB7CisgICAgICAgICAgICAvL3NlbmQgYSBzdG9wIG1lc3NhZ2UKKyAgICAgICAgICAgIG1lbWJlci5zZXRDb21tYW5kKE1lbWJlci5TSFVURE9XTl9QQVlMT0FEKTsKKyAgICAgICAgICAgIG1lbWJlci5nZXREYXRhKHRydWUsIHRydWUpOworICAgICAgICAgICAgc2VuZChmYWxzZSk7CisgICAgICAgICAgICAvL2xlYXZlIG1jYXN0IGdyb3VwCisgICAgICAgICAgICB0cnkge3NvY2tldC5sZWF2ZUdyb3VwKGFkZHJlc3MpO31jYXRjaCAoIEV4Y2VwdGlvbiBpZ25vcmUpe30KKyAgICAgICAgICAgIHNlcnZpY2VTdGFydFRpbWUgPSBMb25nLk1BWF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHN0YXJ0TGV2ZWwgPT0gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjZWl2ZSBhIGRhdGFncmFtIHBhY2tldCwgbG9ja2luZyB3YWl0CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgc29ja2V0LnJlY2VpdmUocmVjZWl2ZVBhY2tldCk7CisgICAgICAgICAgICBpZihyZWNlaXZlUGFja2V0LmdldExlbmd0aCgpID4gTUFYX1BBQ0tFVF9TSVpFKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJNdWx0aWNhc3QgcGFja2V0IHJlY2VpdmVkIHdhcyB0b28gbG9uZywgZHJvcHBpbmcgcGFja2FnZToiK3JlY2VpdmVQYWNrZXQuZ2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW3JlY2VpdmVQYWNrZXQuZ2V0TGVuZ3RoKCldOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmVjZWl2ZVBhY2tldC5nZXREYXRhKCksIHJlY2VpdmVQYWNrZXQuZ2V0T2Zmc2V0KCksIGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBNZW1iZXJJbXBsIG0gPSBNZW1iZXJJbXBsLmdldE1lbWJlcihkYXRhKTsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIGxvZy50cmFjZSgiTWNhc3QgcmVjZWl2ZSBwaW5nIGZyb20gbWVtYmVyICIgKyBtKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQgdCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKEFycmF5cy5lcXVhbHMobS5nZXRDb21tYW5kKCksIE1lbWJlci5TSFVURE9XTl9QQVlMT0FEKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiTWVtYmVyIGhhcyBzaHV0ZG93bjoiICsgbSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWJlcnNoaXAucmVtb3ZlTWVtYmVyKG0pOworICAgICAgICAgICAgICAgICAgICB0ID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm1lbWJlckRpc2FwcGVhcmVkKG0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtYmVyc2hpcC5tZW1iZXJBbGl2ZShtKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiTWNhc3QgYWRkIG1lbWJlciAiICsgbSk7CisgICAgICAgICAgICAgICAgICAgIHQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UubWVtYmVyQWRkZWQobSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfSAvL2VuZCBpZgorICAgICAgICAgICAgICAgIGlmICggdCAhPSBudWxsICkgdC5zdGFydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIHggKSB7IAorICAgICAgICAgICAgLy9kbyBub3RoaW5nLCB0aGlzIGlzIG5vcm1hbCwgd2UgZG9uJ3Qgd2FudCB0byBibG9jayBmb3JldmVyCisgICAgICAgICAgICAvL3NpbmNlIHRoZSByZWNlaXZlIHRocmVhZCBpcyB0aGUgc2FtZSB0aHJlYWQKKyAgICAgICAgICAgIC8vdGhhdCBkb2VzIG1lbWJlcnNoaXAgZXhwaXJhdGlvbgorICAgICAgICB9CisgICAgICAgIGNoZWNrRXhwaXJlZCgpOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGV4cGlyZWRNdXRleCA9IG5ldyBPYmplY3QoKTsKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0V4cGlyZWQoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoZXhwaXJlZE11dGV4KSB7CisgICAgICAgICAgICBNZW1iZXJJbXBsW10gZXhwaXJlZCA9IG1lbWJlcnNoaXAuZXhwaXJlKHRpbWVUb0V4cGlyYXRpb24pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBpcmVkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWVtYmVySW1wbCBtZW1iZXIgPSBleHBpcmVkW2ldOworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNY2FzdCBleGlwcmUgIG1lbWJlciAiICsgZXhwaXJlZFtpXSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UubWVtYmVyRGlzYXBwZWFyZWQobWVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHByb2Nlc3MgbWVtYmVyIGRpc2FwcGVhcmVkIG1lc3NhZ2UuIiwgeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBhIHBpbmcKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCBzZW5kKGJvb2xlYW4gY2hlY2tleHBpcmVkKSB0aHJvd3MgSU9FeGNlcHRpb257CisgICAgICAgIC8vaWdub3JlIGlmIHdlIGhhdmVuJ3Qgc3RhcnRlZCB0aGUgc2VuZGVyCisgICAgICAgIC8vaWYgKCAoc3RhcnRMZXZlbCZDaGFubmVsLk1CUl9UWF9TRVEpICE9IENoYW5uZWwuTUJSX1RYX1NFUSApIHJldHVybjsKKyAgICAgICAgbWVtYmVyLmluYygpOworICAgICAgICBpZihsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZSgiTWNhc3Qgc2VuZCBwaW5nIGZyb20gbWVtYmVyICIgKyBtZW1iZXIpOworICAgICAgICBieXRlW10gZGF0YSA9IG1lbWJlci5nZXREYXRhKCk7CisgICAgICAgIERhdGFncmFtUGFja2V0IHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQoZGF0YSxkYXRhLmxlbmd0aCk7CisgICAgICAgIHAuc2V0QWRkcmVzcyhhZGRyZXNzKTsKKyAgICAgICAgcC5zZXRQb3J0KHBvcnQpOworICAgICAgICBzb2NrZXQuc2VuZChwKTsKKyAgICAgICAgaWYgKCBjaGVja2V4cGlyZWQgKSBjaGVja0V4cGlyZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRTZXJ2aWNlU3RhcnRUaW1lKCkgeworICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VTdGFydFRpbWU7CisgICAgfQorCisKKyAgICBwdWJsaWMgY2xhc3MgUmVjZWl2ZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwdWJsaWMgUmVjZWl2ZXJUaHJlYWQoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgc2V0TmFtZSgiQ2x1c3Rlci1NZW1iZXJzaGlwUmVjZWl2ZXIiKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB3aGlsZSAoIGRvUnVuUmVjZWl2ZXIgKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKCBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYXggKSB7CisgICAgICAgICAgICAgICAgICAgIC8vd2UgY2FuIGlnbm9yZSB0aGlzLCBhcyBpdCBtZWFucyB3ZSBoYXZlIGFuIGludmFsaWQgcGFja2FnZQorICAgICAgICAgICAgICAgICAgICAvL2J1dCB3ZSB3aWxsIGxvZyBpdCB0byBkZWJ1ZworICAgICAgICAgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52YWxpZCBtZW1iZXIgbWNhc3QgcGFja2FnZS4iLGF4KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJFcnJvciByZWNlaXZpbmcgbWNhc3QgcGFja2FnZS4gU2xlZXBpbmcgNTAwbXMiLHgpOworICAgICAgICAgICAgICAgICAgICB0cnkgeyBUaHJlYWQuc2xlZXAoNTAwKTsgfSBjYXRjaCAoIEV4Y2VwdGlvbiBpZ25vcmUgKXt9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0vL2NsYXNzIFJlY2VpdmVyVGhyZWFkCisKKyAgICBwdWJsaWMgY2xhc3MgU2VuZGVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgbG9uZyB0aW1lOworICAgICAgICBwdWJsaWMgU2VuZGVyVGhyZWFkKGxvbmcgdGltZSkgeworICAgICAgICAgICAgdGhpcy50aW1lID0gdGltZTsKKyAgICAgICAgICAgIHNldE5hbWUoIkNsdXN0ZXItTWVtYmVyc2hpcFNlbmRlciIpOworCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgd2hpbGUgKCBkb1J1blNlbmRlciApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZW5kKHRydWUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIlVuYWJsZSB0byBzZW5kIG1jYXN0IG1lc3NhZ2UuIix4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsgVGhyZWFkLnNsZWVwKHRpbWUpOyB9IGNhdGNoICggRXhjZXB0aW9uIGlnbm9yZSApIHt9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Ly9jbGFzcyBTZW5kZXJUaHJlYWQKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9tZW1iZXJzaGlwL01lbWJlckltcGwuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9tZW1iZXJzaGlwL01lbWJlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTkyYjJjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL21lbWJlcnNoaXAvTWVtYmVySW1wbC5qYXZhCkBAIC0wLDAgKzEsNTcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5tZW1iZXJzaGlwOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uWEJ5dGVCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LlNlbmRlclN0YXRlOworCisvKioKKyAqIEEgPGI+bWVtYmVyc2hpcDwvYj4gaW1wbGVtZW50YXRpb24gdXNpbmcgc2ltcGxlIG11bHRpY2FzdC4KKyAqIFRoaXMgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGEgbXVsdGljYXN0IG1lbWJlci4KKyAqIENhcnJpZXMgdGhlIGhvc3QsIGFuZCBwb3J0IG9mIHRoZSB0aGlzIG9yIG90aGVyIGNsdXN0ZXIgbm9kZXMuCisgKgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBNZW1iZXJJbXBsIGltcGxlbWVudHMgTWVtYmVyLCBqYXZhLmlvLkV4dGVybmFsaXphYmxlIHsKKworICAgIC8qKgorICAgICAqIFB1YmxpYyBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvIHRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHRyYW5zaWVudCBTdHJpbmcgVENQX0xJU1RFTl9QT1JUID0gInRjcExpc3RlblBvcnQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdHJhbnNpZW50IFN0cmluZyBUQ1BfTElTVEVOX0hPU1QgPSAidGNwTGlzdGVuSG9zdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCB0cmFuc2llbnQgU3RyaW5nIE1FTUJFUl9OQU1FID0gIm1lbWJlck5hbWUiOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdHJhbnNpZW50IGJ5dGVbXSBUUklCRVNfTUJSX0JFR0lOID0gbmV3IGJ5dGVbXSB7ODQsIDgyLCA3MywgNjYsIDY5LCA4MywgNDUsIDY2fTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHRyYW5zaWVudCBieXRlW10gVFJJQkVTX01CUl9FTkQgICA9IG5ldyBieXRlW10gezg0LCA4MiwgNzMsIDY2LCA2OSwgODMsIDQ1LCA2OX07CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGxpc3RlbiBob3N0IGZvciB0aGlzIG1lbWJlcgorICAgICAqLworICAgIHByb3RlY3RlZCBieXRlW10gaG9zdDsKKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IFN0cmluZyBob3N0bmFtZTsKKyAgICAvKioKKyAgICAgKiBUaGUgdGNwIGxpc3RlbiBwb3J0IGZvciB0aGlzIG1lbWJlcgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgcG9ydDsKKworICAgIC8qKgorICAgICAqIENvdW50ZXIgZm9yIGhvdyBtYW55IGJyb2FkY2FzdCBtZXNzYWdlcyBoYXZlIGJlZW4gc2VudCBmcm9tIHRoaXMgbWVtYmVyCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtc2dDb3VudCA9IDA7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhpcyBtZW1iZXJzIHdhcworICAgICAqIGNyZWF0ZWQsIGlzIGtlcHQgdHJhY2sgb2YgdXNpbmcgdGhlIHN0YXJ0IHRpbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBtZW1iZXJBbGl2ZVRpbWUgPSAwOworICAgIAorICAgIC8qKgorICAgICAqIEZvciB0aGUgbG9jYWwgbWVtYmVyIG9ubHkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IGxvbmcgc2VydmljZVN0YXJ0VGltZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUbyBhdm9pZCBzZXJpYWxpemF0aW9uIG92ZXIgYW5kIG92ZXIgYWdhaW4sIG9uY2UgdGhlIGxvY2FsIGRhdGFQa2cKKyAgICAgKiBoYXMgYmVlbiBzZXQsIHdlIHVzZSB0aGF0IHRvIHRyYW5zbWl0IGRhdGEKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IGJ5dGVbXSBkYXRhUGtnID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFVuaXF1ZSBzZXNzaW9uIElkIGZvciB0aGlzIG1lbWJlcgorICAgICAqLworICAgIHByb3RlY3RlZCBieXRlW10gdW5pcXVlSWQgPSBuZXcgYnl0ZVsxNl07CisgICAgCisgICAgLyoqCisgICAgICogQ3VzdG9tIHBheWxvYWQgdGhhdCBhbiBhcHAgZnJhbWV3b3JrIGNhbiBicm9hZGNhc3QKKyAgICAgKiBBbHNvIHVzZWQgdG8gdHJhbnNwb3J0IHN0b3AgY29tbWFuZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIHBheWxvYWQgPSBuZXcgYnl0ZVswXTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb21tYW5kLCBzbyB0aGF0IHRoZSBjdXN0b20gcGF5bG9hZCBkb2Vzbid0IGhhdmUgdG8gYmUgdXNlZAorICAgICAqIFRoaXMgaXMgZm9yIGludGVybmFsIHRyaWJlcyB1c2UsIHN1Y2ggYXMgU0hVVERPV05fQ09NTUFORAorICAgICAqLworICAgIHByb3RlY3RlZCBieXRlW10gY29tbWFuZCA9IG5ldyBieXRlWzBdOworCisgICAgLyoqCisgICAgICogRG9tYWluIGlmIHdlIHdhbnQgdG8gZmlsdGVyIGJhc2VkIG9uIGRvbWFpbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGRvbWFpbiA9IG5ldyBieXRlWzBdOworICAgIAorICAgIC8qKgorICAgICAqIEVtcHR5IGNvbnN0cnVjdG9yIGZvciBzZXJpYWxpemF0aW9uCisgICAgICovCisgICAgcHVibGljIE1lbWJlckltcGwoKSB7CisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBtZW1iZXIgb2JqZWN0CisgICAgICogQHBhcmFtIG5hbWUgLSB0aGUgbmFtZSBvZiB0aGlzIG1lbWJlciwgY2x1c3RlciB1bmlxdWUKKyAgICAgKiBAcGFyYW0gZG9tYWluIC0gdGhlIGNsdXN0ZXIgZG9tYWluIG5hbWUgb2YgdGhpcyBtZW1iZXIKKyAgICAgKiBAcGFyYW0gaG9zdCAtIHRoZSB0Y3AgbGlzdGVuIGhvc3QKKyAgICAgKiBAcGFyYW0gcG9ydCAtIHRoZSB0Y3AgbGlzdGVuIHBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVySW1wbChTdHJpbmcgaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICBsb25nIGFsaXZlVGltZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0SG9zdG5hbWUoaG9zdCk7CisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgIHRoaXMubWVtYmVyQWxpdmVUaW1lPWFsaXZlVGltZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIE1lbWJlckltcGwoU3RyaW5nIGhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgbG9uZyBhbGl2ZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHBheWxvYWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoaG9zdCxwb3J0LGFsaXZlVGltZSk7CisgICAgICAgIHNldFBheWxvYWQocGF5bG9hZCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZHkoKSB7CisgICAgICAgIHJldHVybiBTZW5kZXJTdGF0ZS5nZXRTZW5kZXJTdGF0ZSh0aGlzKS5pc1JlYWR5KCk7CisgICAgfQorICAgIHB1YmxpYyBib29sZWFuIGlzU3VzcGVjdCgpIHsKKyAgICAgICAgcmV0dXJuIFNlbmRlclN0YXRlLmdldFNlbmRlclN0YXRlKHRoaXMpLmlzU3VzcGVjdCgpOworICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhaWxpbmcoKSB7CisgICAgICAgIHJldHVybiBTZW5kZXJTdGF0ZS5nZXRTZW5kZXJTdGF0ZSh0aGlzKS5pc0ZhaWxpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmNyZW1lbnQgdGhlIG1lc3NhZ2UgY291bnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaW5jKCkgeworICAgICAgICBtc2dDb3VudCsrOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGRhdGEgcGFja2FnZSB0byBzZW5kIG92ZXIgdGhlIHdpcmUgcmVwcmVzZW50aW5nIHRoaXMgbWVtYmVyLgorICAgICAqIFRoaXMgaXMgZmFzdGVyIHRoYW4gc2VyaWFsaXphdGlvbi4KKyAgICAgKiBAcmV0dXJuIC0gdGhlIGJ5dGVzIGZvciB0aGlzIG1lbWJlciBkZXNlcmlhbGl6ZWQKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0RGF0YSgpICB7CisgICAgICAgIHJldHVybiBnZXREYXRhKHRydWUpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBIaWdobHkgb3B0aW1pemVkIHZlcnNpb24gb2Ygc2VyaWFsaXppbmcgYSBtZW1iZXIgaW50byBhIGJ5dGUgYXJyYXkKKyAgICAgKiBSZXR1cm5zIGEgY2FjaGVkIGJ5dGVbXSByZWZlcmVuY2UsIGRvIG5vdCBtb2RpZnkgdGhpcyBkYXRhCisgICAgICogQHBhcmFtIGdldGFsaXZlIGJvb2xlYW4KKyAgICAgKiBAcmV0dXJuIGJ5dGVbXQorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0RGF0YShib29sZWFuIGdldGFsaXZlKSAgeworICAgICAgICByZXR1cm4gZ2V0RGF0YShnZXRhbGl2ZSxmYWxzZSk7CisgICAgfQorICAgIAorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0RGF0YUxlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIFRSSUJFU19NQlJfQkVHSU4ubGVuZ3RoKyAvL3N0YXJ0IHBrZworICAgICAgICAgICAgICAgNCsgLy9kYXRhIGxlbmd0aAorICAgICAgICAgICAgICAgOCsgLy9hbGl2ZSB0aW1lCisgICAgICAgICAgICAgICA0KyAvL3BvcnQKKyAgICAgICAgICAgICAgIDErIC8vaG9zdCBsZW5ndGgKKyAgICAgICAgICAgICAgIGhvc3QubGVuZ3RoKyAvL2hvc3QKKyAgICAgICAgICAgICAgIDQrIC8vY29tbWFuZCBsZW5ndGgKKyAgICAgICAgICAgICAgIGNvbW1hbmQubGVuZ3RoKyAvL2NvbW1hbmQKKyAgICAgICAgICAgICAgIDQrIC8vZG9tYWluIGxlbmd0aAorICAgICAgICAgICAgICAgZG9tYWluLmxlbmd0aCsgLy9kb21haW4KKyAgICAgICAgICAgICAgIDE2KyAvL3VuaXF1ZSBpZAorICAgICAgICAgICAgICAgNCsgLy9wYXlsb2FkIGxlbmd0aAorICAgICAgICAgICAgICAgcGF5bG9hZC5sZW5ndGgrIC8vcGF5bG9hZAorICAgICAgICAgICAgICAgVFJJQkVTX01CUl9FTkQubGVuZ3RoOyAvL2VuZCBwa2cKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogCisgICAgICogQHBhcmFtIGdldGFsaXZlIGJvb2xlYW4gLSBjYWxjdWxhdGUgbWVtYmVyQWxpdmUgdGltZQorICAgICAqIEBwYXJhbSByZXNldCBib29sZWFuIC0gcmVzZXQgdGhlIGNhY2hlZCBkYXRhIHBhY2thZ2UsIGFuZCBjcmVhdGUgYSBuZXcgb25lCisgICAgICogQHJldHVybiBieXRlW10KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldERhdGEoYm9vbGVhbiBnZXRhbGl2ZSwgYm9vbGVhbiByZXNldCkgIHsKKyAgICAgICAgaWYgKCByZXNldCApIGRhdGFQa2cgPSBudWxsOworICAgICAgICAvL2xvb2sgaW4gY2FjaGUgZmlyc3QKKyAgICAgICAgaWYgKCBkYXRhUGtnIT1udWxsICkgeworICAgICAgICAgICAgaWYgKCBnZXRhbGl2ZSApIHsKKyAgICAgICAgICAgICAgICAvL3lvdSdkIGJlIHN1cnByaXNlZCwgYnV0IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcworICAgICAgICAgICAgICAgIC8vc2hvd3MgdXAgb24gdGhlIHByb2ZpbGVyCisgICAgICAgICAgICAgICAgbG9uZyBhbGl2ZT1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS1nZXRTZXJ2aWNlU3RhcnRUaW1lKCk7CisgICAgICAgICAgICAgICAgWEJ5dGVCdWZmZXIudG9CeXRlcyggKGxvbmcpIGFsaXZlLCBkYXRhUGtnLCBUUklCRVNfTUJSX0JFR0lOLmxlbmd0aCs0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkYXRhUGtnOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvL3BhY2thZ2UgbG9va3MgbGlrZQorICAgICAgICAvL3N0YXJ0IHBhY2thZ2UgVFJJQkVTX01CUl9CRUdJTi5sZW5ndGgKKyAgICAgICAgLy9wYWNrYWdlIGxlbmd0aCAtIDQgYnl0ZXMKKyAgICAgICAgLy9hbGl2ZSAtIDggYnl0ZXMKKyAgICAgICAgLy9wb3J0IC0gNCBieXRlcworICAgICAgICAvL2hvc3QgbGVuZ3RoIC0gMSBieXRlCisgICAgICAgIC8vaG9zdCAtIGhsIGJ5dGVzCisgICAgICAgIC8vY2xlbiAtIDQgYnl0ZXMKKyAgICAgICAgLy9jb21tYW5kIC0gY2xlbiBieXRlcworICAgICAgICAvL2RsZW4gLSA0IGJ5dGVzCisgICAgICAgIC8vZG9tYWluIC0gZGxlbiBieXRlcworICAgICAgICAvL3VuaXF1ZUlkIC0gMTYgYnl0ZXMKKyAgICAgICAgLy9wYXlsb2FkIGxlbmd0aCAtIDQgYnl0ZXMKKyAgICAgICAgLy9wYXlsb2FkIHBsZW4gYnl0ZXMKKyAgICAgICAgLy9lbmQgcGFja2FnZSBUUklCRVNfTUJSX0VORC5sZW5ndGgKKyAgICAgICAgYnl0ZVtdIGFkZHIgPSBob3N0OworICAgICAgICBsb25nIGFsaXZlPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLWdldFNlcnZpY2VTdGFydFRpbWUoKTsKKyAgICAgICAgYnl0ZSBobCA9IChieXRlKWFkZHIubGVuZ3RoOworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW2dldERhdGFMZW5ndGgoKV07CisgICAgICAgIAorICAgICAgICBpbnQgYm9keWxlbmd0aCA9IChnZXREYXRhTGVuZ3RoKCkgLSBUUklCRVNfTUJSX0JFR0lOLmxlbmd0aCAtIFRSSUJFU19NQlJfRU5ELmxlbmd0aCAtIDQpOworICAgICAgICAKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIAorICAgICAgICAvL1RSSUJFU19NQlJfQkVHSU4KKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShUUklCRVNfTUJSX0JFR0lOLDAsZGF0YSxwb3MsVFJJQkVTX01CUl9CRUdJTi5sZW5ndGgpOworICAgICAgICBwb3MgKz0gVFJJQkVTX01CUl9CRUdJTi5sZW5ndGg7CisgICAgICAgIAorICAgICAgICAvL2JvZHkgbGVuZ3RoCisgICAgICAgIFhCeXRlQnVmZmVyLnRvQnl0ZXMoYm9keWxlbmd0aCxkYXRhLHBvcyk7CisgICAgICAgIHBvcyArPSA0OworICAgICAgICAKKyAgICAgICAgLy9hbGl2ZSBkYXRhCisgICAgICAgIFhCeXRlQnVmZmVyLnRvQnl0ZXMoKGxvbmcpYWxpdmUsZGF0YSxwb3MpOworICAgICAgICBwb3MgKz0gODsKKyAgICAgICAgLy9wb3J0CisgICAgICAgIFhCeXRlQnVmZmVyLnRvQnl0ZXMocG9ydCxkYXRhLHBvcyk7CisgICAgICAgIHBvcyArPSA0OworICAgICAgICAvL2hvc3QgbGVuZ3RoCisgICAgICAgIGRhdGFbcG9zKytdID0gaGw7CisgICAgICAgIC8vaG9zdAorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFkZHIsMCxkYXRhLHBvcyxhZGRyLmxlbmd0aCk7CisgICAgICAgIHBvcys9YWRkci5sZW5ndGg7CisgICAgICAgIC8vY2xlbiAtIDQgYnl0ZXMKKyAgICAgICAgWEJ5dGVCdWZmZXIudG9CeXRlcyhjb21tYW5kLmxlbmd0aCxkYXRhLHBvcyk7CisgICAgICAgIHBvcys9NDsKKyAgICAgICAgLy9jb21tYW5kIC0gY2xlbiBieXRlcworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNvbW1hbmQsMCxkYXRhLHBvcyxjb21tYW5kLmxlbmd0aCk7CisgICAgICAgIHBvcys9Y29tbWFuZC5sZW5ndGg7CisgICAgICAgIC8vZGxlbiAtIDQgYnl0ZXMKKyAgICAgICAgWEJ5dGVCdWZmZXIudG9CeXRlcyhkb21haW4ubGVuZ3RoLGRhdGEscG9zKTsKKyAgICAgICAgcG9zKz00OworICAgICAgICAvL2RvbWFpbiAtIGRsZW4gYnl0ZXMKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShkb21haW4sMCxkYXRhLHBvcyxkb21haW4ubGVuZ3RoKTsKKyAgICAgICAgcG9zKz1kb21haW4ubGVuZ3RoOworICAgICAgICAvL3VuaXF1ZSBJZAorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHVuaXF1ZUlkLDAsZGF0YSxwb3MsdW5pcXVlSWQubGVuZ3RoKTsKKyAgICAgICAgcG9zKz11bmlxdWVJZC5sZW5ndGg7CisgICAgICAgIC8vcGF5bG9hZAorICAgICAgICBYQnl0ZUJ1ZmZlci50b0J5dGVzKHBheWxvYWQubGVuZ3RoLGRhdGEscG9zKTsKKyAgICAgICAgcG9zKz00OworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBheWxvYWQsMCxkYXRhLHBvcyxwYXlsb2FkLmxlbmd0aCk7CisgICAgICAgIHBvcys9cGF5bG9hZC5sZW5ndGg7CisgICAgICAgIAorICAgICAgICAvL1RSSUJFU19NQlJfRU5ECisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoVFJJQkVTX01CUl9FTkQsMCxkYXRhLHBvcyxUUklCRVNfTUJSX0VORC5sZW5ndGgpOworICAgICAgICBwb3MgKz0gVFJJQkVTX01CUl9FTkQubGVuZ3RoOworCisgICAgICAgIC8vY3JlYXRlIGxvY2FsIGRhdGEKKyAgICAgICAgZGF0YVBrZyA9IGRhdGE7CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZXMgYSBtZW1iZXIgZnJvbSBkYXRhIHNlbnQgb3ZlciB0aGUgd2lyZQorICAgICAqIEBwYXJhbSBkYXRhIC0gdGhlIGJ5dGVzIHJlY2VpdmVkCisgICAgICogQHJldHVybiBhIG1lbWJlciBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZW1iZXJJbXBsIGdldE1lbWJlcihieXRlW10gZGF0YSwgTWVtYmVySW1wbCBtZW1iZXIpIHsKKyAgICAgICAgcmV0dXJuIGdldE1lbWJlcihkYXRhLDAsZGF0YS5sZW5ndGgsbWVtYmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE1lbWJlckltcGwgZ2V0TWVtYmVyKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBNZW1iZXJJbXBsIG1lbWJlcikgeworICAgICAgICAvL3BhY2thZ2UgbG9va3MgbGlrZQorICAgICAgICAvL3N0YXJ0IHBhY2thZ2UgVFJJQkVTX01CUl9CRUdJTi5sZW5ndGgKKyAgICAgICAgLy9wYWNrYWdlIGxlbmd0aCAtIDQgYnl0ZXMKKyAgICAgICAgLy9hbGl2ZSAtIDggYnl0ZXMKKyAgICAgICAgLy9wb3J0IC0gNCBieXRlcworICAgICAgICAvL2hvc3QgbGVuZ3RoIC0gMSBieXRlCisgICAgICAgIC8vaG9zdCAtIGhsIGJ5dGVzCisgICAgICAgIC8vY2xlbiAtIDQgYnl0ZXMKKyAgICAgICAgLy9jb21tYW5kIC0gY2xlbiBieXRlcworICAgICAgICAvL2RsZW4gLSA0IGJ5dGVzCisgICAgICAgIC8vZG9tYWluIC0gZGxlbiBieXRlcworICAgICAgICAvL3VuaXF1ZUlkIC0gMTYgYnl0ZXMKKyAgICAgICAgLy9wYXlsb2FkIGxlbmd0aCAtIDQgYnl0ZXMKKyAgICAgICAgLy9wYXlsb2FkIHBsZW4gYnl0ZXMKKyAgICAgICAgLy9lbmQgcGFja2FnZSBUUklCRVNfTUJSX0VORC5sZW5ndGgKKworICAgICAgICBpbnQgcG9zID0gb2Zmc2V0OworICAgICAgICAKKyAgICAgICAgaWYgKFhCeXRlQnVmZmVyLmZpcnN0SW5kZXhPZihkYXRhLG9mZnNldCxUUklCRVNfTUJSX0JFR0lOKSE9cG9zKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHBhY2thZ2UsIHNob3VsZCBzdGFydCB3aXRoOiIrb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbC5BcnJheXMudG9TdHJpbmcoVFJJQkVTX01CUl9CRUdJTikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBsZW5ndGggPCAoVFJJQkVTX01CUl9CRUdJTi5sZW5ndGgrNCkgKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJNZW1iZXIgcGFja2FnZSB0byBzbWFsbCB0byB2YWxpZGF0ZS4iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcG9zICs9IFRSSUJFU19NQlJfQkVHSU4ubGVuZ3RoOworICAgICAgICAKKyAgICAgICAgaW50IGJvZHlsZW5ndGggPSBYQnl0ZUJ1ZmZlci50b0ludChkYXRhLHBvcyk7CisgICAgICAgIHBvcyArPSA0OworICAgICAgICAKKyAgICAgICAgaWYgKCBsZW5ndGggPCAoYm9keWxlbmd0aCs0K1RSSUJFU19NQlJfQkVHSU4ubGVuZ3RoK1RSSUJFU19NQlJfRU5ELmxlbmd0aCkgKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJOb3QgZW5vdWdoIGJ5dGVzIGluIG1lbWJlciBwYWNrYWdlLiIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnQgZW5kcG9zID0gcG9zK2JvZHlsZW5ndGg7CisgICAgICAgIGlmIChYQnl0ZUJ1ZmZlci5maXJzdEluZGV4T2YoZGF0YSxlbmRwb3MsVFJJQkVTX01CUl9FTkQpIT1lbmRwb3MpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgcGFja2FnZSwgc2hvdWxkIGVuZCB3aXRoOiIrb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbC5BcnJheXMudG9TdHJpbmcoVFJJQkVTX01CUl9FTkQpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgYnl0ZVtdIGFsaXZlZCA9IG5ldyBieXRlWzhdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIHBvcywgYWxpdmVkLCAwLCA4KTsKKyAgICAgICAgcG9zICs9IDg7CisgICAgICAgIGJ5dGVbXSBwb3J0ZCA9IG5ldyBieXRlWzRdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIHBvcywgcG9ydGQsIDAsIDQpOworICAgICAgICBwb3MgKz0gNDsKKyAgICAKKyAgICAgICAgYnl0ZSBobCA9IGRhdGFbcG9zKytdOworICAgICAgICBieXRlW10gYWRkciA9IG5ldyBieXRlW2hsXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCBwb3MsIGFkZHIsIDAsIGhsKTsKKyAgICAgICAgcG9zICs9IGhsOworICAgIAorICAgICAgICBpbnQgY2wgPSBYQnl0ZUJ1ZmZlci50b0ludChkYXRhLCBwb3MpOworICAgICAgICBwb3MgKz0gNDsKKyAgICAKKyAgICAgICAgYnl0ZVtdIGNvbW1hbmQgPSBuZXcgYnl0ZVtjbF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgcG9zLCBjb21tYW5kLCAwLCBjb21tYW5kLmxlbmd0aCk7CisgICAgICAgIHBvcyArPSBjb21tYW5kLmxlbmd0aDsKKyAgICAKKyAgICAgICAgaW50IGRsID0gWEJ5dGVCdWZmZXIudG9JbnQoZGF0YSwgcG9zKTsKKyAgICAgICAgcG9zICs9IDQ7CisgICAgCisgICAgICAgIGJ5dGVbXSBkb21haW4gPSBuZXcgYnl0ZVtkbF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgcG9zLCBkb21haW4sIDAsIGRvbWFpbi5sZW5ndGgpOworICAgICAgICBwb3MgKz0gZG9tYWluLmxlbmd0aDsKKyAgICAKKyAgICAgICAgYnl0ZVtdIHVuaXF1ZUlkID0gbmV3IGJ5dGVbMTZdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIHBvcywgdW5pcXVlSWQsIDAsIDE2KTsKKyAgICAgICAgcG9zICs9IDE2OworICAgIAorICAgICAgICBpbnQgcGwgPSBYQnl0ZUJ1ZmZlci50b0ludChkYXRhLCBwb3MpOworICAgICAgICBwb3MgKz0gNDsKKyAgICAKKyAgICAgICAgYnl0ZVtdIHBheWxvYWQgPSBuZXcgYnl0ZVtwbF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgcG9zLCBwYXlsb2FkLCAwLCBwYXlsb2FkLmxlbmd0aCk7CisgICAgICAgIHBvcyArPSBwYXlsb2FkLmxlbmd0aDsKKyAgICAKKyAgICAgICAgbWVtYmVyLnNldEhvc3QoYWRkcik7CisgICAgICAgIG1lbWJlci5zZXRQb3J0KFhCeXRlQnVmZmVyLnRvSW50KHBvcnRkLCAwKSk7CisgICAgICAgIG1lbWJlci5zZXRNZW1iZXJBbGl2ZVRpbWUoWEJ5dGVCdWZmZXIudG9Mb25nKGFsaXZlZCwgMCkpOworICAgICAgICBtZW1iZXIuc2V0VW5pcXVlSWQodW5pcXVlSWQpOworICAgICAgICBtZW1iZXIucGF5bG9hZCA9IHBheWxvYWQ7CisgICAgICAgIG1lbWJlci5kb21haW4gPSBkb21haW47CisgICAgICAgIG1lbWJlci5jb21tYW5kID0gY29tbWFuZDsKKyAgICAKKyAgICAgICAgbWVtYmVyLmRhdGFQa2cgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIG9mZnNldCwgbWVtYmVyLmRhdGFQa2csIDAsIGxlbmd0aCk7CisgICAgCisgICAgICAgIHJldHVybiBtZW1iZXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBNZW1iZXJJbXBsIGdldE1lbWJlcihieXRlW10gZGF0YSkgeworICAgICAgIHJldHVybiBnZXRNZW1iZXIoZGF0YSxuZXcgTWVtYmVySW1wbCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBvYmplY3QKKyAgICAgKiBAcmV0dXJuIGEgdW5pcXVlIG5hbWUgdG8gdGhlIGNsdXN0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAidGNwOi8vIitnZXRIb3N0bmFtZSgpKyI6IitnZXRQb3J0KCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGlzdGVuIHBvcnQgb2YgdGhpcyBtZW1iZXIKKyAgICAgKiBAcmV0dXJuIC0gdGNwIGxpc3RlbiBwb3J0CisgICAgICovCisgICAgcHVibGljIGludCBnZXRQb3J0KCkgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFRDUCBsaXN0ZW4gaG9zdCBmb3IgdGhpcyBtZW1iZXIKKyAgICAgKiBAcmV0dXJuIElQIGFkZHJlc3Mgb3IgaG9zdCBuYW1lCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRIb3N0KCkgIHsKKyAgICAgICAgcmV0dXJuIGhvc3Q7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdG5hbWUoKSB7CisgICAgICAgIGlmICggdGhpcy5ob3N0bmFtZSAhPSBudWxsICkgcmV0dXJuIGhvc3RuYW1lOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhpcy5ob3N0bmFtZSA9IGphdmEubmV0LkluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyhob3N0KS5nZXRIb3N0TmFtZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhvc3RuYW1lOworICAgICAgICAgICAgfWNhdGNoICggSU9FeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHBhcnNlIGhvc3RuYW1lLiIseCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBpbmZvcm1hdGlvbiBvbiBob3cgbG9uZyB0aGlzIG1lbWJlciBoYXMgYmVlbiBvbmxpbmUuCisgICAgICogVGhlIHJlc3VsdCBpcyB0aGUgbnVtYmVyIG9mIG1pbGxpIHNlY29uZHMgdGhpcyBtZW1iZXIgaGFzIGJlZW4KKyAgICAgKiBicm9hZGNhc3RpbmcgaXRzIG1lbWJlcnNoaXAgdG8gdGhlIGNsdXN0ZXIuCisgICAgICogQHJldHVybiBuciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhpcyBtZW1iZXIgc3RhcnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRNZW1iZXJBbGl2ZVRpbWUoKSB7CisgICAgICAgcmV0dXJuIG1lbWJlckFsaXZlVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRTZXJ2aWNlU3RhcnRUaW1lKCkgeworICAgICAgICByZXR1cm4gc2VydmljZVN0YXJ0VGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldFVuaXF1ZUlkKCkgeworICAgICAgICByZXR1cm4gdW5pcXVlSWQ7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBnZXRQYXlsb2FkKCkgeworICAgICAgICByZXR1cm4gcGF5bG9hZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldENvbW1hbmQoKSB7CisgICAgICAgIHJldHVybiBjb21tYW5kOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gZG9tYWluOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lbWJlckFsaXZlVGltZShsb25nIHRpbWUpIHsKKyAgICAgICBtZW1iZXJBbGl2ZVRpbWU9dGltZTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpICB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5tZW1iZXJzaGlwLk1lbWJlckltcGxbIik7CisgICAgICAgIGJ1Zi5hcHBlbmQoZ2V0TmFtZSgpKS5hcHBlbmQoIiwiKTsKKyAgICAgICAgYnVmLmFwcGVuZChnZXRIb3N0bmFtZSgpKS5hcHBlbmQoIiwiKTsKKyAgICAgICAgYnVmLmFwcGVuZChwb3J0KS5hcHBlbmQoIiwgYWxpdmU9Iik7CisgICAgICAgIGJ1Zi5hcHBlbmQobWVtYmVyQWxpdmVUaW1lKS5hcHBlbmQoIiwiKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiaWQ9IikuYXBwZW5kKGJUb1ModGhpcy51bmlxdWVJZCkpLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYnVmLmFwcGVuZCgicGF5bG9hZD0iKS5hcHBlbmQoYlRvUyh0aGlzLnBheWxvYWQsOCkpLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiY29tbWFuZD0iKS5hcHBlbmQoYlRvUyh0aGlzLmNvbW1hbmQsOCkpLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiZG9tYWluPSIpLmFwcGVuZChiVG9TKHRoaXMuZG9tYWluLDgpKS5hcHBlbmQoIiwgIik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiVG9TKGJ5dGVbXSBkYXRhKSB7CisgICAgICAgIHJldHVybiBiVG9TKGRhdGEsZGF0YS5sZW5ndGgpOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiVG9TKGJ5dGVbXSBkYXRhLCBpbnQgbWF4KSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKDQqMTYpOworICAgICAgICBidWYuYXBwZW5kKCJ7Iik7CisgICAgICAgIGZvciAoaW50IGk9MDsgZGF0YSE9bnVsbCAmJiBpPGRhdGEubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGRhdGFbaV0pKS5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIGlmICggaT09bWF4ICkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIi4uLigiK2RhdGEubGVuZ3RoKyIpIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgifSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKKyAgICAgKiBAcmV0dXJuIFRoZSBoYXNoIGNvZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gZ2V0SG9zdCgpWzBdK2dldEhvc3QoKVsxXStnZXRIb3N0KClbMl0rZ2V0SG9zdCgpWzNdOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFyYW0gbyBpcyBhIE1jYXN0TWVtYmVyIHdpdGggdGhlIHNhbWUgbmFtZQorICAgICAqIEBwYXJhbSBvCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICggbyBpbnN0YW5jZW9mIE1lbWJlckltcGwgKSAgICB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyh0aGlzLmdldEhvc3QoKSwoKE1lbWJlckltcGwpbykuZ2V0SG9zdCgpKSAmJgorICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UG9ydCgpID09ICgoTWVtYmVySW1wbClvKS5nZXRQb3J0KCkgJiYKKyAgICAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKHRoaXMuZ2V0VW5pcXVlSWQoKSwoKE1lbWJlckltcGwpbykuZ2V0VW5pcXVlSWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRIb3N0KGJ5dGVbXSBob3N0KSB7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEhvc3RuYW1lKFN0cmluZyBob3N0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBob3N0bmFtZSA9IGhvc3Q7CisgICAgICAgIHRoaXMuaG9zdCA9IGphdmEubmV0LkluZXRBZGRyZXNzLmdldEJ5TmFtZShob3N0KS5nZXRBZGRyZXNzKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldE1zZ0NvdW50KGludCBtc2dDb3VudCkgeworICAgICAgICB0aGlzLm1zZ0NvdW50ID0gbXNnQ291bnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgeworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICB0aGlzLmRhdGFQa2cgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VTdGFydFRpbWUobG9uZyBzZXJ2aWNlU3RhcnRUaW1lKSB7CisgICAgICAgIHRoaXMuc2VydmljZVN0YXJ0VGltZSA9IHNlcnZpY2VTdGFydFRpbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoYnl0ZVtdIHVuaXF1ZUlkKSB7CisgICAgICAgIHRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZCE9bnVsbD91bmlxdWVJZDpuZXcgYnl0ZVsxNl07CisgICAgICAgIGdldERhdGEodHJ1ZSx0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXlsb2FkKGJ5dGVbXSBwYXlsb2FkKSB7CisgICAgICAgIGJ5dGVbXSBvbGRwYXlsb2FkID0gdGhpcy5wYXlsb2FkOworICAgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkIT1udWxsP3BheWxvYWQ6bmV3IGJ5dGVbMF07CisgICAgICAgIGlmICggdGhpcy5nZXREYXRhKHRydWUsdHJ1ZSkubGVuZ3RoID4gTWNhc3RTZXJ2aWNlSW1wbC5NQVhfUEFDS0VUX1NJWkUgKSB7CisgICAgICAgICAgICB0aGlzLnBheWxvYWQgPSBvbGRwYXlsb2FkOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGF5bG9hZCBpcyB0byBsYXJnZSBmb3IgdHJpYmVzIHRvIGhhbmRsZS4iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kKGJ5dGVbXSBjb21tYW5kKSB7CisgICAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQhPW51bGw/Y29tbWFuZDpuZXcgYnl0ZVswXTsKKyAgICAgICAgZ2V0RGF0YSh0cnVlLHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihieXRlW10gZG9tYWluKSB7CisgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluIT1udWxsP2RvbWFpbjpuZXcgYnl0ZVswXTsKKyAgICAgICAgZ2V0RGF0YSh0cnVlLHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChPYmplY3RJbnB1dCBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgYnl0ZVtdIG1lc3NhZ2UgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICBpbi5yZWFkKG1lc3NhZ2UpOworICAgICAgICBnZXRNZW1iZXIobWVzc2FnZSx0aGlzKTsKKyAgICAgICAgCisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gZGF0YSA9IHRoaXMuZ2V0RGF0YSgpOworICAgICAgICBvdXQud3JpdGVJbnQoZGF0YS5sZW5ndGgpOworICAgICAgICBvdXQud3JpdGUoZGF0YSk7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL21lbWJlcnNoaXAvTWVtYmVyc2hpcC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL21lbWJlcnNoaXAvTWVtYmVyc2hpcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NWU4ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvbWVtYmVyc2hpcC9NZW1iZXJzaGlwLmphdmEKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLm1lbWJlcnNoaXA7CisKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworLyoqCisgKiBBIDxiPm1lbWJlcnNoaXA8L2I+IGltcGxlbWVudGF0aW9uIHVzaW5nIHNpbXBsZSBtdWx0aWNhc3QuCisgKiBUaGlzIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhIG11bHRpY2FzdCBtZW1iZXJzaGlwLgorICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgbWFpbnRhaW5pbmcgYSBsaXN0IG9mIGFjdGl2ZSBjbHVzdGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyLgorICogSWYgYSBub2RlIGZhaWxzIHRvIHNlbmQgb3V0IGEgaGVhcnRiZWF0LCB0aGUgbm9kZSB3aWxsIGJlIGRpc21pc3NlZC4KKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIE1lbWJlcnNoaXAKK3sKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1lbWJlckltcGxbXSBFTVBUWV9NRU1CRVJTID0gbmV3IE1lbWJlckltcGxbMF07CisgICAgCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhpcyBtZW1iZXJzaGlwLCBoYXMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWUgZm9yIHRoZSBsb2NhbAorICAgICAqIG1lbWJlcgorICAgICAqLworICAgIHByb3RlY3RlZCBNZW1iZXJJbXBsIGxvY2FsOworICAgIAorICAgIC8qKgorICAgICAqIEEgbWFwIG9mIGFsbCB0aGUgbWVtYmVycyBpbiB0aGUgY2x1c3Rlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworICAgIAorICAgIC8qKgorICAgICAqIEEgbGlzdCBvZiBhbGwgdGhlIG1lbWJlcnMgaW4gdGhlIGNsdXN0ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1lbWJlckltcGxbXSBtZW1iZXJzID0gRU1QVFlfTUVNQkVSUzsKKyAgICAKKyAgICAvKioKKyAgICAgICogc29ydCBtZW1iZXJzIGJ5IGFsaXZlIHRpbWUKKyAgICAgICovCisgICAgcHJvdGVjdGVkIENvbXBhcmF0b3IgbWVtYmVyQ29tcGFyYXRvciA9IG5ldyBNZW1iZXJDb21wYXJhdG9yKCk7CisKKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1lbWJlcnMpIHsKKyAgICAgICAgICAgIE1lbWJlcnNoaXAgY2xvbmUgPSBuZXcgTWVtYmVyc2hpcChsb2NhbCwgbWVtYmVyQ29tcGFyYXRvcik7CisgICAgICAgICAgICBjbG9uZS5tYXAgPSAoSGFzaE1hcCkgbWFwLmNsb25lKCk7CisgICAgICAgICAgICBjbG9uZS5tZW1iZXJzID0gbmV3IE1lbWJlckltcGxbbWVtYmVycy5sZW5ndGhdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtZW1iZXJzLDAsY2xvbmUubWVtYmVycywwLG1lbWJlcnMubGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBjbG9uZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgbWVtYmVyc2hpcAorICAgICAqIEBwYXJhbSBuYW1lIC0gaGFzIHRvIGJlIHRoZSBuYW1lIG9mIHRoZSBsb2NhbCBtZW1iZXIuIFVzZWQgdG8gZmlsdGVyIHRoZSBsb2NhbCBtZW1iZXIgZnJvbSB0aGUgY2x1c3RlciBtZW1iZXJzaGlwCisgICAgICovCisgICAgcHVibGljIE1lbWJlcnNoaXAoTWVtYmVySW1wbCBsb2NhbCwgYm9vbGVhbiBpbmNsdWRlTG9jYWwpIHsKKyAgICAgICAgdGhpcy5sb2NhbCA9IGxvY2FsOworICAgICAgICBpZiAoIGluY2x1ZGVMb2NhbCApIGFkZE1lbWJlcihsb2NhbCk7CisgICAgfQorCisgICAgcHVibGljIE1lbWJlcnNoaXAoTWVtYmVySW1wbCBsb2NhbCkgeworICAgICAgICB0aGlzKGxvY2FsLGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVtYmVyc2hpcChNZW1iZXJJbXBsIGxvY2FsLCBDb21wYXJhdG9yIGNvbXApIHsKKyAgICAgICAgdGhpcyhsb2NhbCxjb21wLGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVtYmVyc2hpcChNZW1iZXJJbXBsIGxvY2FsLCBDb21wYXJhdG9yIGNvbXAsIGJvb2xlYW4gaW5jbHVkZUxvY2FsKSB7CisgICAgICAgIHRoaXMobG9jYWwsaW5jbHVkZUxvY2FsKTsKKyAgICAgICAgdGhpcy5tZW1iZXJDb21wYXJhdG9yID0gY29tcDsKKyAgICB9CisgICAgLyoqCisgICAgICogUmVzZXQgdGhlIG1lbWJlcnNoaXAgYW5kIHN0YXJ0IG92ZXIgZnJlc2guCisgICAgICogSWUsIGRlbGV0ZSBhbGwgdGhlIG1lbWJlcnMgYW5kIHdhaXQgZm9yIHRoZW0gdG8gcGluZyBhZ2FpbiBhbmQgam9pbiB0aGlzIG1lbWJlcnNoaXAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1hcC5jbGVhcigpOworICAgICAgICBtZW1iZXJzID0gRU1QVFlfTUVNQkVSUyA7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBtZW1iZXJzaGlwIHRoYXQgdGhpcyBtZW1iZXIgaGFzIGFubm91bmNlZCBpdHNlbGYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVtYmVyIC0gdGhlIG1lbWJlciB0aGF0IGp1c3QgcGluZ2VkIHVzCisgICAgICogQHJldHVybiAtIHRydWUgaWYgdGhpcyBtZW1iZXIgaXMgbmV3IHRvIHRoZSBjbHVzdGVyLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiAtIGZhbHNlIGlmIHRoaXMgbWVtYmVyIGlzIHRoZSBsb2NhbCBtZW1iZXIgb3IgdXBkYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gbWVtYmVyQWxpdmUoTWVtYmVySW1wbCBtZW1iZXIpIHsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgLy9pZ25vcmUgb3Vyc2VsdmVzCisgICAgICAgIGlmICggIG1lbWJlci5lcXVhbHMobG9jYWwpICkgcmV0dXJuIHJlc3VsdDsKKworICAgICAgICAvL3JldHVybiB0cnVlIGlmIHRoZSBtZW1iZXJzaGlwIGhhcyBjaGFuZ2VkCisgICAgICAgIE1ickVudHJ5IGVudHJ5ID0gKE1ickVudHJ5KW1hcC5nZXQobWVtYmVyKTsKKyAgICAgICAgaWYgKCBlbnRyeSA9PSBudWxsICkgeworICAgICAgICAgICAgZW50cnkgPSBhZGRNZW1iZXIobWVtYmVyKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBtZW1iZXIgYWxpdmUgdGltZQorICAgICAgICAgICAgTWVtYmVySW1wbCB1cGRhdGVNZW1iZXIgPSBlbnRyeS5nZXRNZW1iZXIoKSA7CisgICAgICAgICAgICBpZih1cGRhdGVNZW1iZXIuZ2V0TWVtYmVyQWxpdmVUaW1lKCkgIT0gbWVtYmVyLmdldE1lbWJlckFsaXZlVGltZSgpKSB7CisgICAgICAgICAgICAgICAgLy91cGRhdGUgZmllbGRzIHRoYXQgY2FuIGNoYW5nZQorICAgICAgICAgICAgICAgIHVwZGF0ZU1lbWJlci5zZXRNZW1iZXJBbGl2ZVRpbWUobWVtYmVyLmdldE1lbWJlckFsaXZlVGltZSgpKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVNZW1iZXIuc2V0UGF5bG9hZChtZW1iZXIuZ2V0UGF5bG9hZCgpKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVNZW1iZXIuc2V0Q29tbWFuZChtZW1iZXIuZ2V0Q29tbWFuZCgpKTsKKyAgICAgICAgICAgICAgICBBcnJheXMuc29ydChtZW1iZXJzLCBtZW1iZXJDb21wYXJhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbnRyeS5hY2Nlc3NlZCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG1lbWJlciB0byB0aGlzIGNvbXBvbmVudCBhbmQgc29ydCBhcnJheSB3aXRoIG1lbWJlckNvbXBhcmF0b3IKKyAgICAgKiBAcGFyYW0gbWVtYmVyIFRoZSBtZW1iZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBNYnJFbnRyeSBhZGRNZW1iZXIoTWVtYmVySW1wbCBtZW1iZXIpIHsKKyAgICAgIHN5bmNocm9uaXplZCAobWVtYmVycykgeworICAgICAgICAgIE1ickVudHJ5IGVudHJ5ID0gbmV3IE1ickVudHJ5KG1lbWJlcik7CisgICAgICAgICAgaWYgKCFtYXAuY29udGFpbnNLZXkobWVtYmVyKSApIHsKKyAgICAgICAgICAgICAgbWFwLnB1dChtZW1iZXIsIGVudHJ5KTsKKyAgICAgICAgICAgICAgTWVtYmVySW1wbCByZXN1bHRzW10gPSBuZXcgTWVtYmVySW1wbFttZW1iZXJzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHJlc3VsdHNbaV0gPSBtZW1iZXJzW2ldOworICAgICAgICAgICAgICByZXN1bHRzW21lbWJlcnMubGVuZ3RoXSA9IG1lbWJlcjsKKyAgICAgICAgICAgICAgbWVtYmVycyA9IHJlc3VsdHM7CisgICAgICAgICAgICAgIEFycmF5cy5zb3J0KG1lbWJlcnMsIG1lbWJlckNvbXBhcmF0b3IpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gZW50cnk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlbW92ZSBhIG1lbWJlciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZW1iZXIgVGhlIG1lbWJlciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNZW1iZXIoTWVtYmVySW1wbCBtZW1iZXIpIHsKKyAgICAgICAgbWFwLnJlbW92ZShtZW1iZXIpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1lbWJlcnMpIHsKKyAgICAgICAgICAgIGludCBuID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobWVtYmVyc1tpXSA9PSBtZW1iZXIgfHwgbWVtYmVyc1tpXS5lcXVhbHMobWVtYmVyKSkgeworICAgICAgICAgICAgICAgICAgICBuID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4gPCAwKSByZXR1cm47CisgICAgICAgICAgICBNZW1iZXJJbXBsIHJlc3VsdHNbXSA9IG5ldyBNZW1iZXJJbXBsW21lbWJlcnMubGVuZ3RoIC0gMV07CisgICAgICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBuKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2orK10gPSBtZW1iZXJzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtYmVycyA9IHJlc3VsdHM7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUnVucyBhIHJlZnJlc2ggY3ljbGUgYW5kIHJldHVybnMgYSBsaXN0IG9mIG1lbWJlcnMgdGhhdCBoYXMgZXhwaXJlZC4KKyAgICAgKiBUaGlzIGFsc28gcmVtb3ZlcyB0aGUgbWVtYmVycyBmcm9tIHRoZSBtZW1iZXJzaGlwLCBpbiBzdWNoIGEgd2F5IHRoYXQKKyAgICAgKiBnZXRNZW1iZXJzKCkgPSBnZXRNZW1iZXJzKCkgLSBleHBpcmUoKQorICAgICAqIEBwYXJhbSBtYXh0aW1lIC0gdGhlIG1heCB0aW1lIGEgbWVtYmVyIGNhbiByZW1haW4gdW5hbm5vdW5jZWQgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgZGVhZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGV4cGlyZWQgbWVtYmVycworICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWVtYmVySW1wbFtdIGV4cGlyZShsb25nIG1heHRpbWUpIHsKKyAgICAgICAgaWYoIWhhc01lbWJlcnMoKSApCisgICAgICAgICAgIHJldHVybiBFTVBUWV9NRU1CRVJTOworICAgICAgIAorICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG51bGw7CisgICAgICAgIEl0ZXJhdG9yIGkgPSBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIE1ickVudHJ5IGVudHJ5ID0gKE1ickVudHJ5KWkubmV4dCgpOworICAgICAgICAgICAgaWYoIGVudHJ5Lmhhc0V4cGlyZWQobWF4dGltZSkgKSB7CisgICAgICAgICAgICAgICAgaWYobGlzdCA9PSBudWxsKSAvLyBvbmx5IG5lZWQgYSBsaXN0IHdoZW4gbWVtYmVycyBhcmUgZXhwaXJlZCAoc21hbGxlciBnYykKKyAgICAgICAgICAgICAgICAgICAgbGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoZW50cnkuZ2V0TWVtYmVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZihsaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIE1lbWJlckltcGxbXSByZXN1bHQgPSBuZXcgTWVtYmVySW1wbFtsaXN0LnNpemUoKV07CisgICAgICAgICAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKKyAgICAgICAgICAgIGZvciggaW50IGo9MDsgajxyZXN1bHQubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICByZW1vdmVNZW1iZXIocmVzdWx0W2pdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gRU1QVFlfTUVNQkVSUyA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5pbmcgdGhhdCBzZXJ2aWNlIGhhcyBtZW1iZXJzIG9yIG5vdAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc01lbWJlcnMoKSB7CisgICAgICAgIHJldHVybiBtZW1iZXJzLmxlbmd0aCA+IDAgOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgTWVtYmVySW1wbCBnZXRNZW1iZXIoTWVtYmVyIG1icikgeworICAgICAgICBpZihoYXNNZW1iZXJzKCkpIHsKKyAgICAgICAgICAgIE1lbWJlckltcGwgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoIGludCBpPTA7IGk8dGhpcy5tZW1iZXJzLmxlbmd0aCAmJiByZXN1bHQ9PW51bGw7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIG1lbWJlcnNbaV0uZXF1YWxzKG1icikgKSByZXN1bHQgPSBtZW1iZXJzW2ldOworICAgICAgICAgICAgfS8vZm9yCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoTWVtYmVyIG1icikgeyAKKyAgICAgICAgcmV0dXJuIGdldE1lbWJlcihtYnIpIT1udWxsOworICAgIH0KKyAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5pbmcgYSBsaXN0IG9mIGFsbCB0aGUgbWVtYmVycyBpbiB0aGUgbWVtYmVyc2hpcAorICAgICAqIFdlIG5vdCBuZWVkIGEgY29weTogYWRkIGFuZCByZW1vdmUgZ2VuZXJhdGUgbmV3IGFycmF5cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVySW1wbFtdIGdldE1lbWJlcnMoKSB7CisgICAgICAgIGlmKGhhc01lbWJlcnMoKSkgeworICAgICAgICAgICAgcmV0dXJuIG1lbWJlcnM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gRU1QVFlfTUVNQkVSUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBhIGNvcHkgZnJvbSBhbGwgbWVtYmVyIGVudHJpZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIE1ickVudHJ5W10gZ2V0TWVtYmVyRW50cmllcygpCisgICAgeworICAgICAgICBNYnJFbnRyeVtdIHJlc3VsdCA9IG5ldyBNYnJFbnRyeVttYXAuc2l6ZSgpXTsKKyAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIGkgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICBpbnQgcG9zID0gMDsKKyAgICAgICAgd2hpbGUgKCBpLmhhc05leHQoKSApCisgICAgICAgICAgICByZXN1bHRbcG9zKytdID0gKChNYnJFbnRyeSkoKGphdmEudXRpbC5NYXAuRW50cnkpaS5uZXh0KCkpLmdldFZhbHVlKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5uZXIgQ2xhc3MKKworICAgIHByaXZhdGUgY2xhc3MgTWVtYmVyQ29tcGFyYXRvciBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yIHsKKworICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmUoKE1lbWJlckltcGwpIG8xLCAoTWVtYmVySW1wbCkgbzIpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShNZW1iZXJJbXBsIG0xLCBNZW1iZXJJbXBsIG0yKSB7CisgICAgICAgICAgICAvL2xvbmdlciBhbGl2ZSB0aW1lLCBtZWFucyBzb3J0IGZpcnN0CisgICAgICAgICAgICBsb25nIHJlc3VsdCA9IG0yLmdldE1lbWJlckFsaXZlVGltZSgpIC0gbTEuZ2V0TWVtYmVyQWxpdmVUaW1lKCk7CisgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJbm5lciBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBtZW1iZXIgZW50cnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE1ickVudHJ5CisgICAgeworCisgICAgICAgIHByb3RlY3RlZCBNZW1iZXJJbXBsIG1icjsKKyAgICAgICAgcHJvdGVjdGVkIGxvbmcgbGFzdEhlYXJkRnJvbTsKKworICAgICAgICBwdWJsaWMgTWJyRW50cnkoTWVtYmVySW1wbCBtYnIpIHsKKyAgICAgICAgICAgdGhpcy5tYnIgPSBtYnI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIG1lbWJlciBoYXMgYmVlbiBhY2Nlc3NlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFjY2Vzc2VkKCl7CisgICAgICAgICAgIGxhc3RIZWFyZEZyb20gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGFjdHVhbCBNZW1iZXIgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWVtYmVySW1wbCBnZXRNZW1iZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbWJyOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrIGlmIHRoaXMgZHVkZSBoYXMgZXhwaXJlZAorICAgICAgICAgKiBAcGFyYW0gbWF4dGltZSBUaGUgdGltZSB0aHJlc2hvbGQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0V4cGlyZWQobG9uZyBtYXh0aW1lKSB7CisgICAgICAgICAgICBsb25nIGRlbHRhID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBsYXN0SGVhcmRGcm9tOworICAgICAgICAgICAgcmV0dXJuIGRlbHRhID4gbWF4dGltZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9tZW1iZXJzaGlwL21iZWFucy1kZXNjcmlwdG9ycy54bWwgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvbWVtYmVyc2hpcC9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZTNmYzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvbWVtYmVyc2hpcC9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCkBAIC0wLDAgKzEsNjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgbWJlYW5zLWRlc2NyaXB0b3JzIFBVQkxJQworICAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9EVEQgTW9kZWwgTUJlYW5zIENvbmZpZ3VyYXRpb24gRmlsZSIKKyAgICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvZHRkcy9tYmVhbnMtZGVzY3JpcHRvcnMuZHRkIj4KKzxtYmVhbnMtZGVzY3JpcHRvcnM+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iTWNhc3RTZXJ2aWNlIgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2x1c3RlciBNZW1iZXJzaGlwIHNlcnZpY2UgaW1wbGVtZW50YXRpb24iCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJDbHVzdGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIubWNhc3QuTWNhc3RTZXJ2aWNlIj4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iaW5mbyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2xhc3MgdmVyc2lvbiBpbmZvIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1jYXN0QWRkciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTXVsdGljYXN0IElQIEFkZHJlc3MiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWNhc3RCaW5kQWRkcmVzcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTXVsdGljYXN0IElQIEludGVyZmFjZSBhZGRyZXNzIChkZWZhdWx0IGF1dG8pIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1jYXN0UG9ydCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTXVsdGljYXN0IFVEUCBQb3J0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWNhc3RGcmVxdWVuY3kiCisgICAgICAgICAgZGVzY3JpcHRpb249IlBpbmcgRnJlcXVlbmN5IGF0IG1zZWMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWNhc3RDbHVzdGVyRG9tYWluIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDbHVzdGVyIERvbWFpbiBvZiB0aGlzIG1lbWJlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtY2FzdERyb3BUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaW1lb3V0IGZyb20gZnJlcXVlbmN5IHBpbmcgYWZ0ZXIgbWVtYmVyIGRpc2FwcGVyIG5vdGlmeSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtY2FzdFNvVGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTXVsdGljYXN0IFNvY2tldCBUaW1lb3V0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWNhc3RUVEwiCisgICAgICAgICAgZGVzY3JpcHRpb249IiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImxvY2FsTWVtYmVyTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29tcGxldGUgbG9jYWwgcmVjZWl2ZXIgaW5mb3JtYXRpb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWVtYmVyc0J5TmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29tcGxldGUgcmVtb3RlIHNlbmRlciBpbmZvcm1hdGlvbiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZhLmxhbmcuU3RyaW5nOyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InN0YXJ0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0YXJ0IHRoZSBjbHVzdGVyIG1lbWJlcnNoaXAiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdG9wIHRoZSBjbHVzdGVyIG1lbWJlcnNoaXAiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorICAgICAgICAgICAgICAgICAKKyAgPC9tYmVhbj4KKworPC9tYmVhbnMtZGVzY3JpcHRvcnM+CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvcGFja2FnZS5odG1sIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWE2MGU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDcwIEBACis8Ym9keT4KKzxoZWFkPjx0aXRsZT5BcGFjaGUgVHJpYmVzIC0gVGhlIFRvbWNhdCBDbHVzdGVyIENvbW11bmljYXRpb24gTW9kdWxlPC90aXRsZT4KKzxoMz5RdWlja1N0YXJ0PC9oMz4KKyAgICA8cHJlPjxjb2RlPgorICAgICAgICAgICAgLy9jcmVhdGUgYSBjaGFubmVsCisgICAgICAgICAgICBDaGFubmVsIG15Q2hhbm5lbCA9IG5ldyBHcm91cENoYW5uZWwoKTsKKworICAgICAgICAgICAgLy9jcmVhdGUgbXkgbGlzdGVuZXJzCisgICAgICAgICAgICBNeU1lc3NhZ2VMaXN0ZW5lciBtc2dMaXN0ZW5lciA9IG5ldyBNeU1lc3NhZ2VMaXN0ZW5lcigpOworICAgICAgICAgICAgTXlNZW1iZXJMaXN0ZW5lciBtYnJMaXN0ZW5lciA9IG5ldyBNeU1lbWJlckxpc3RlbmVyKCk7CisKKyAgICAgICAgICAgIC8vYXR0YWNoIHRoZSBsaXN0ZW5lcnMgdG8gdGhlIGNoYW5uZWwKKyAgICAgICAgICAgIG15Q2hhbm5lbC5hZGRNZW1iZXJzaGlwTGlzdGVuZXIobWJyTGlzdGVuZXIpOworICAgICAgICAgICAgbXlDaGFubmVsLmFkZENoYW5uZWxMaXN0ZW5lcihtc2dMaXN0ZW5lcik7CisKKyAgICAgICAgICAgIC8vc3RhcnQgdGhlIGNoYW5uZWwKKyAgICAgICAgICAgIG15Q2hhbm5lbC5zdGFydChDaGFubmVsLkRFRkFVTFQpOworCisgICAgICAgICAgICAvL2NyZWF0ZSBhIG1lc3NhZ2UgdG8gYmUgc2VudCwgbWVzc2FnZSBtdXN0IGltcGxlbWVudCBqYXZhLmlvLlNlcmlhbGl6YWJsZQorICAgICAgICAgICAgLy9mb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB5b3UgcHJvYmFibHkgd2FudCB0aGVtIHRvIGltcGxlbWVudCBqYXZhLmlvLkV4dGVybmFsaXphYmxlCisgICAgICAgICAgICBTZXJpYWxpemFibGUgbXlNc2cgPSBuZXcgTXlNZXNzYWdlKCk7CisKKyAgICAgICAgICAgIC8vcmV0cmlldmUgbXkgY3VycmVudCBtZW1iZXJzCisgICAgICAgICAgICBNZW1iZXJbXSBncm91cCA9IG15Q2hhbm5lbC5nZXRNZW1iZXJzKCk7CisKKyAgICAgICAgICAgIC8vc2VuZCB0aGUgbWVzc2FnZQorICAgICAgICAgICAgY2hhbm5lbC5zZW5kKGdyb3VwLG15TXNnLENoYW5uZWwuU0VORF9PUFRJT05TX0RFRkFVTFQpOworCisgICAgPC9jb2RlPjwvcHJlPgorPGgzPkludGVyZmFjZXMgZm9yIHRoZSBBcHBsaWNhdGlvbiBEZXZlbG9wZXI8L2gzPgorICAgIDxvbD4KKyAgICAgICAgPGxpPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWw8L2NvZGU+CisgICAgICAgICAgICBNYWluIGNvbXBvbmVudCB0byBpbnRlcmFjdCB3aXRoIHRvIHNlbmQgbWVzc2FnZXMKKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcnNoaXBMaXN0ZW5lcjwvY29kZT4KKyAgICAgICAgICAgIExpc3RlbiB0byBtZW1iZXJzaGlwIGNoYW5nZXMKKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxMaXN0ZW5lcjwvY29kZT4KKyAgICAgICAgICAgIExpc3RlbiB0byBkYXRhIG1lc3NhZ2VzCisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI8L2NvZGU+CisgICAgICAgICAgICBJZGVudGlmaWVzIGEgbm9kZSwgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMsIGRlZmF1bHQgaXMgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMubWVtYmVyc2hpcC5NZW1iZXJJbXBsCisgICAgICAgIDwvbGk+CisgICAgPC9vbD4KKyAgICA8aDM+SW50ZXJmYWNlcyBmb3IgdGhlIFRyaWJlcyBDb21wb25lbnQgRGV2ZWxvcGVyPC9oMz4KKyAgICA8b2w+CisgICAgICAgIDxsaT48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsPC9jb2RlPgorICAgICAgICAgICAgTWFpbiBjb21wb25lbnQgdG8gdGhhdCB0aGUgYXBwbGljYXRpb24gaW50ZXJhY3RzIHdpdGgKKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxSZWNlaXZlcjwvY29kZT4KKyAgICAgICAgICAgIElPIENvbXBvbmVudCB0byByZWNlaXZlIG1lc3NhZ2VzIG92ZXIgc29tZSBuZXR3b3JrIHRyYW5zcG9ydAorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbFNlbmRlcjwvY29kZT4KKyAgICAgICAgICAgIElPIENvbXBvbmVudCB0byBzZW5kIG1lc3NhZ2VzIG92ZXIgc29tZSBuZXR3b3JrIHRyYW5zcG9ydAorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyc2hpcFNlcnZpY2U8L2NvZGU+CisgICAgICAgICAgICBJTyBDb21wb25lbnQgdGhhdCBoYW5kbGVzIG1lbWJlcnNoaXAgZGlzY292ZXJ5IGFuZCAKKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxJbnRlcmNlcHRvcjwvY29kZT4KKyAgICAgICAgICAgIGludGVyY2VwdG9ycyBiZXR3ZWVuIHRoZSBDaGFubmVsIGFuZCB0aGUgSU8gbGF5ZXIKKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxNZXNzYWdlPC9jb2RlPgorICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdGhhdCBpcyBzZW50IHRocm91Z2ggdGhlIGludGVyY2VwdG9yIHN0YWNrIGRvd24gdG8gdGhlIElPIGxheWVyIAorICAgICAgICA8L2xpPgorCisgICAgICAgIDxsaT48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI8L2NvZGU+CisgICAgICAgICAgICBJZGVudGlmaWVzIGEgbm9kZSwgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgdG8gdGhlIHVuZGVybHlpbmcgSU8gbG9naWMKKyAgICAgICAgPC9saT4KKyAgICA8L29sPgorPC9ib2R5PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RpcGlzL0Fic3RyYWN0UmVwbGljYXRlZE1hcC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RpcGlzL0Fic3RyYWN0UmVwbGljYXRlZE1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMzU2MWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGlwaXMvQWJzdHJhY3RSZXBsaWNhdGVkTWFwLmphdmEKQEAgLTAsMCArMSwxMjcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudGlwaXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXQ7CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXQ7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbExpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkhlYXJ0YmVhdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyc2hpcExpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLlJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLlJwY0NhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLlJwY0NoYW5uZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uWEJ5dGVCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMubWVtYmVyc2hpcC5NZW1iZXJJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOworCisvKioKKyAqIDxwPlRpdGxlOiA8L3A+CisgKgorICogPHA+RGVzY3JpcHRpb246IDwvcD4KKyAqCisgKiA8cD5Db3B5cmlnaHQ6IENvcHlyaWdodCAoYykgMjAwNTwvcD4KKyAqCisgKiA8cD5Db21wYW55OiA8L3A+CisgKgorICogQGF1dGhvciBub3QgYXR0cmlidXRhYmxlCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVwbGljYXRlZE1hcCBleHRlbmRzIExpbmtlZEhhc2hNYXAgaW1wbGVtZW50cyBScGNDYWxsYmFjaywgQ2hhbm5lbExpc3RlbmVyLCBNZW1iZXJzaGlwTGlzdGVuZXIsIEhlYXJ0YmVhdCB7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQWJzdHJhY3RSZXBsaWNhdGVkTWFwLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGluaXRpYWwgY2FwYWNpdHkgLSBNVVNUIGJlIGEgcG93ZXIgb2YgdHdvLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSA9IDE2OworCisgICAgLyoqCisgICAgICogVGhlIGxvYWQgZmFjdG9yIHVzZWQgd2hlbiBub25lIHNwZWNpZmllZCBpbiBjb25zdHJ1Y3Rvci4KKyAgICAgKiovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX0xPQURfRkFDVE9SID0gMC43NWY7CisgICAgCisgICAgLyoqCisgICAgICogVXNlZCB0byBpZGVudGlmeSB0aGUgbWFwCisgICAgICovCisgICAgZmluYWwgU3RyaW5nIGNoc2V0ID0gIklTTy04ODU5LTEiOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgIElOU1RBTkNFIFZBUklBQkxFUworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwcml2YXRlIHRyYW5zaWVudCBsb25nIHJwY1RpbWVvdXQgPSA1MDAwOworICAgIHByaXZhdGUgdHJhbnNpZW50IENoYW5uZWwgY2hhbm5lbDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBScGNDaGFubmVsIHJwY0NoYW5uZWw7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgYnl0ZVtdIG1hcENvbnRleHROYW1lOworICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gc3RhdGVUcmFuc2ZlcnJlZCA9IGZhbHNlOworICAgIHByaXZhdGUgdHJhbnNpZW50IE9iamVjdCBzdGF0ZU11dGV4ID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgdHJhbnNpZW50IEhhc2hNYXAgbWFwTWVtYmVycyA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IGNoYW5uZWxTZW5kT3B0aW9ucyA9IENoYW5uZWwuU0VORF9PUFRJT05TX0RFRkFVTFQ7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgT2JqZWN0IG1hcE93bmVyOworICAgIHByaXZhdGUgdHJhbnNpZW50IENsYXNzTG9hZGVyW10gZXh0ZXJuYWxMb2FkZXJzOworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgaW50IGN1cnJlbnROb2RlID0gMDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBsb25nIGFjY2Vzc1RpbWVvdXQgPSA1MDAwOworICAgIHByaXZhdGUgdHJhbnNpZW50IFN0cmluZyBtYXBuYW1lID0gIiI7CisgICAgCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgQ09OU1RSVUNUT1JTCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBtYXAKKyAgICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCB0byB1c2UgZm9yIGNvbW11bmljYXRpb24KKyAgICAgKiBAcGFyYW0gdGltZW91dCBsb25nIC0gdGltZW91dCBmb3IgUlBDIG1lc3NhZ3MKKyAgICAgKiBAcGFyYW0gbWFwQ29udGV4dE5hbWUgU3RyaW5nIC0gdW5pcXVlIG5hbWUgZm9yIHRoaXMgbWFwLCB0byBhbGxvdyBtdWx0aXBsZSBtYXBzIHBlciBjaGFubmVsCisgICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSBpbnQgLSB0aGUgc2l6ZSBvZiB0aGlzIG1hcCwgc2VlIEhhc2hNYXAKKyAgICAgKiBAcGFyYW0gbG9hZEZhY3RvciBmbG9hdCAtIGxvYWQgZmFjdG9yLCBzZWUgSGFzaE1hcAorICAgICAqIEBwYXJhbSBjbHMgLSBhIGxpc3Qgb2YgY2xhc3Nsb2FkZXJzIHRvIGJlIHVzZWQgZm9yIGRlc2VyaWFsaXphdGlvbiBvZiBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBBYnN0cmFjdFJlcGxpY2F0ZWRNYXAoT2JqZWN0IG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbCBjaGFubmVsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZW91dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWFwQ29udGV4dE5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRpYWxDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxvYWRGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbFNlbmRPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXJbXSBjbHMpIHsKKyAgICAgICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yKTsKKyAgICAgICAgaW5pdChvd25lciwgY2hhbm5lbCwgbWFwQ29udGV4dE5hbWUsIHRpbWVvdXQsIGNoYW5uZWxTZW5kT3B0aW9ucywgY2xzKTsKKyAgICAgICAgCisgICAgfQorCisgICAgcHJvdGVjdGVkIE1lbWJlcltdIHdyYXAoTWVtYmVyIG0pIHsKKyAgICAgICAgaWYgKCBtID09IG51bGwgKSByZXR1cm4gbmV3IE1lbWJlclswXTsKKyAgICAgICAgZWxzZSByZXR1cm4gbmV3IE1lbWJlcltdIHttfTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdChPYmplY3Qgb3duZXIsIENoYW5uZWwgY2hhbm5lbCwgU3RyaW5nIG1hcENvbnRleHROYW1lLCBsb25nIHRpbWVvdXQsIGludCBjaGFubmVsU2VuZE9wdGlvbnMsQ2xhc3NMb2FkZXJbXSBjbHMpIHsKKyAgICAgICAgbG9nLmluZm8oIkluaXRpYWxpemluZyBBYnN0cmFjdFJlcGxpY2F0ZWRNYXAgd2l0aCBjb250ZXh0IG5hbWU6IittYXBDb250ZXh0TmFtZSk7CisgICAgICAgIHRoaXMubWFwT3duZXIgPSBvd25lcjsKKyAgICAgICAgdGhpcy5leHRlcm5hbExvYWRlcnMgPSBjbHM7CisgICAgICAgIHRoaXMuY2hhbm5lbFNlbmRPcHRpb25zID0gY2hhbm5lbFNlbmRPcHRpb25zOworICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsOworICAgICAgICB0aGlzLnJwY1RpbWVvdXQgPSB0aW1lb3V0OworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLm1hcG5hbWUgPSBtYXBDb250ZXh0TmFtZTsKKyAgICAgICAgICAgIC8vdW5pcXVlIGNvbnRleHQgaXMgbW9yZSBlZmZpY2llbnQgaWYgaXQgaXMgc3RvcmVkIGFzIGJ5dGVzCisgICAgICAgICAgICB0aGlzLm1hcENvbnRleHROYW1lID0gbWFwQ29udGV4dE5hbWUuZ2V0Qnl0ZXMoY2hzZXQpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy53YXJuKCJVbmFibGUgdG8gZW5jb2RlIG1hcENvbnRleHROYW1lWyIgKyBtYXBDb250ZXh0TmFtZSArICJdIHVzaW5nIGdldEJ5dGVzKCIgKyBjaHNldCArIikgdXNpbmcgZGVmYXVsdCBnZXRCeXRlcygpIiwgeCk7CisgICAgICAgICAgICB0aGlzLm1hcENvbnRleHROYW1lID0gbWFwQ29udGV4dE5hbWUuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGxvZy5pc1RyYWNlRW5hYmxlZCgpICkgbG9nLnRyYWNlKCJDcmVhdGVkIExhenkgTWFwIHdpdGggbmFtZToiK21hcENvbnRleHROYW1lKyIsIGJ5dGVzOiIrQXJyYXlzLnRvU3RyaW5nKHRoaXMubWFwQ29udGV4dE5hbWUpKTsKKworICAgICAgICAvL2NyZWF0ZSBhbiBycGMgY2hhbm5lbCBhbmQgYWRkIHRoZSBtYXAgYXMgYSBsaXN0ZW5lcgorICAgICAgICB0aGlzLnJwY0NoYW5uZWwgPSBuZXcgUnBjQ2hhbm5lbCh0aGlzLm1hcENvbnRleHROYW1lLCBjaGFubmVsLCB0aGlzKTsKKyAgICAgICAgdGhpcy5jaGFubmVsLmFkZENoYW5uZWxMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgdGhpcy5jaGFubmVsLmFkZE1lbWJlcnNoaXBMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgYnJvYWRjYXN0KE1hcE1lc3NhZ2UuTVNHX0lOSVQsIHRydWUpOworICAgICAgICAgICAgLy90cmFuc2ZlciBzdGF0ZSBmcm9tIGFub3RoZXIgbWFwCisgICAgICAgICAgICB0cmFuc2ZlclN0YXRlKCk7CisgICAgICAgICAgICBicm9hZGNhc3QoTWFwTWVzc2FnZS5NU0dfU1RBUlQsIHRydWUpOworICAgICAgICB9IGNhdGNoIChDaGFubmVsRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy53YXJuKCJVbmFibGUgdG8gc2VuZCBtYXAgc3RhcnQgbWVzc2FnZS4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gc3RhcnQgcmVwbGljYXRlZCBtYXAuIix4KTsKKyAgICAgICAgfQorCisgICAgfQorICAgIAorICAgIAorICAgIHByaXZhdGUgdm9pZCBwaW5nKGxvbmcgdGltZW91dCkgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICAvL3NlbmQgb3V0IGEgbWFwIG1lbWJlcnNoaXAgbWVzc2FnZSwgb25seSB3YWl0IGZvciB0aGUgZmlyc3QgcmVwbHkKKyAgICAgICAgTWFwTWVzc2FnZSBtc2cgPSBuZXcgTWFwTWVzc2FnZSh0aGlzLm1hcENvbnRleHROYW1lLCBNYXBNZXNzYWdlLk1TR19JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBudWxsLCBudWxsLCBudWxsLCB3cmFwKGNoYW5uZWwuZ2V0TG9jYWxNZW1iZXIoZmFsc2UpKSk7CisgICAgICAgIFJlc3BvbnNlW10gcmVzcCA9IHJwY0NoYW5uZWwuc2VuZChjaGFubmVsLmdldE1lbWJlcnMoKSwgbXNnLCBycGNDaGFubmVsLkFMTF9SRVBMWSwgKGNoYW5uZWxTZW5kT3B0aW9ucyksIChpbnQpYWNjZXNzVGltZW91dCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzcC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbWVtYmVyQWxpdmUocmVzcFtpXS5nZXRTb3VyY2UoKSk7CisgICAgICAgIH0vL2ZvcgorCisgICAgICAgIHN5bmNocm9uaXplZCAobWFwTWVtYmVycykgeworICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBtYXBNZW1iZXJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICB3aGlsZSAoIGl0Lmhhc05leHQoKSApIHsKKyAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBsb25nIGFjY2VzcyA9ICgoTG9uZyllbnRyeS5nZXRWYWx1ZSgpKS5sb25nVmFsdWUoKTsgCisgICAgICAgICAgICAgICAgaWYgKCAobm93IC0gYWNjZXNzKSA+IHRpbWVvdXQgKSBtZW1iZXJEaXNhcHBlYXJlZCgoTWVtYmVyKWVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfS8vc3luY2gKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWVtYmVyQWxpdmUoTWVtYmVyIG1lbWJlcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcE1lbWJlcnMpIHsKKyAgICAgICAgICAgIGlmICghbWFwTWVtYmVycy5jb250YWluc0tleShtZW1iZXIpKSB7CisgICAgICAgICAgICAgICAgbWFwTWVtYmVyQWRkZWQobWVtYmVyKTsKKyAgICAgICAgICAgIH0gLy9lbmQgaWYKKyAgICAgICAgICAgIG1hcE1lbWJlcnMucHV0KG1lbWJlciwgbmV3IExvbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBicm9hZGNhc3QoaW50IG1zZ3R5cGUsIGJvb2xlYW4gcnBjKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIC8vc2VuZCBvdXQgYSBtYXAgbWVtYmVyc2hpcCBtZXNzYWdlLCBvbmx5IHdhaXQgZm9yIHRoZSBmaXJzdCByZXBseQorICAgICAgICBNYXBNZXNzYWdlIG1zZyA9IG5ldyBNYXBNZXNzYWdlKHRoaXMubWFwQ29udGV4dE5hbWUsIG1zZ3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIG51bGwsIG51bGwsIG51bGwsIHdyYXAoY2hhbm5lbC5nZXRMb2NhbE1lbWJlcihmYWxzZSkpKTsKKyAgICAgICAgaWYgKCBycGMpIHsKKyAgICAgICAgICAgIFJlc3BvbnNlW10gcmVzcCA9IHJwY0NoYW5uZWwuc2VuZChjaGFubmVsLmdldE1lbWJlcnMoKSwgbXNnLCBycGNDaGFubmVsLkZJUlNUX1JFUExZLCAoY2hhbm5lbFNlbmRPcHRpb25zKSxycGNUaW1lb3V0KTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzcC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIG1hcE1lbWJlckFkZGVkKHJlc3BbaV0uZ2V0U291cmNlKCkpOworICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWNlaXZlZChyZXNwW2ldLmdldE1lc3NhZ2UoKSwgcmVzcFtpXS5nZXRTb3VyY2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFubmVsLnNlbmQoY2hhbm5lbC5nZXRNZW1iZXJzKCksbXNnLGNoYW5uZWxTZW5kT3B0aW9ucyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBicmVha2Rvd24oKSB7CisgICAgICAgIGZpbmFsaXplKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmluYWxpemUoKSB7CisgICAgICAgIHRyeSB7YnJvYWRjYXN0KE1hcE1lc3NhZ2UuTVNHX1NUT1AsZmFsc2UpOyB9Y2F0Y2ggKCBFeGNlcHRpb24gaWdub3JlKXt9CisgICAgICAgIC8vY2xlYW51cAorICAgICAgICBpZiAodGhpcy5ycGNDaGFubmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucnBjQ2hhbm5lbC5icmVha2Rvd24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5jaGFubmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5yZW1vdmVDaGFubmVsTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICB0aGlzLmNoYW5uZWwucmVtb3ZlTWVtYmVyc2hpcExpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisgICAgICAgIHRoaXMucnBjQ2hhbm5lbCA9IG51bGw7CisgICAgICAgIHRoaXMuY2hhbm5lbCA9IG51bGw7CisgICAgICAgIHRoaXMubWFwTWVtYmVycy5jbGVhcigpOworICAgICAgICBzdXBlci5jbGVhcigpOworICAgICAgICB0aGlzLnN0YXRlVHJhbnNmZXJyZWQgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5leHRlcm5hbExvYWRlcnMgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmhhc2hDb2RlKHRoaXMubWFwQ29udGV4dE5hbWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKCBvID09IG51bGwgKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICggIShvIGluc3RhbmNlb2YgQWJzdHJhY3RSZXBsaWNhdGVkTWFwKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoICEoby5nZXRDbGFzcygpLmVxdWFscyh0aGlzLmdldENsYXNzKCkpKSApIHJldHVybiBmYWxzZTsKKyAgICAgICAgQWJzdHJhY3RSZXBsaWNhdGVkTWFwIG90aGVyID0gKEFic3RyYWN0UmVwbGljYXRlZE1hcClvOworICAgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhtYXBDb250ZXh0TmFtZSxvdGhlci5tYXBDb250ZXh0TmFtZSk7CisgICAgfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgIEdST1VQIENPTSBJTlRFUkZBQ0VTCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHB1YmxpYyBNZW1iZXJbXSBnZXRNYXBNZW1iZXJzKEhhc2hNYXAgbWVtYmVycykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1lbWJlcnMpIHsKKyAgICAgICAgICAgIE1lbWJlcltdIHJlc3VsdCA9IG5ldyBNZW1iZXJbbWVtYmVycy5zaXplKCldOworICAgICAgICAgICAgbWVtYmVycy5rZXlTZXQoKS50b0FycmF5KHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyBNZW1iZXJbXSBnZXRNYXBNZW1iZXJzKCkgeworICAgICAgICByZXR1cm4gZ2V0TWFwTWVtYmVycyh0aGlzLm1hcE1lbWJlcnMpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTWVtYmVyW10gZ2V0TWFwTWVtYmVyc0V4Y2woTWVtYmVyW10gZXhjbHVkZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcE1lbWJlcnMpIHsKKyAgICAgICAgICAgIEhhc2hNYXAgbGlzdCA9IChIYXNoTWFwKW1hcE1lbWJlcnMuY2xvbmUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxleGNsdWRlLmxlbmd0aDtpKyspIGxpc3QucmVtb3ZlKGV4Y2x1ZGVbaV0pOworICAgICAgICAgICAgcmV0dXJuIGdldE1hcE1lbWJlcnMobGlzdCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlcGxpY2F0ZXMgYW55IGNoYW5nZXMgdG8gdGhlIG9iamVjdCBzaW5jZSB0aGUgbGFzdCB0aW1lCisgICAgICogVGhlIG9iamVjdCBoYXMgdG8gYmUgcHJpbWFyeSwgaWUsIGlmIHRoZSBvYmplY3QgaXMgYSBwcm94eSBvciBhIGJhY2t1cCwgaXQgd2lsbCBub3QgYmUgcmVwbGljYXRlZDxicj4KKyAgICAgKiBAcGFyYW0gY29tcGxldGUgLSBpZiBzZXQgdG8gdHJ1ZSwgdGhlIG9iamVjdCBpcyByZXBsaWNhdGVkIHRvIGl0cyBiYWNrdXAKKyAgICAgKiBpZiBzZXQgdG8gZmFsc2UsIG9ubHkgb2JqZWN0cyB0aGF0IGltcGxlbWVudCBSZXBsaWNhdGVkTWFwRW50cnkgYW5kIHRoZSBpc0RpcnR5KCkgcmV0dXJucyB0cnVlIHdpbGwKKyAgICAgKiBiZSByZXBsaWNhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVwbGljYXRlKE9iamVjdCBrZXksIGJvb2xlYW4gY29tcGxldGUpIHsKKyAgICAgICAgaWYgKCBsb2cuaXNUcmFjZUVuYWJsZWQoKSApCisgICAgICAgICAgICBsb2cudHJhY2UoIlJlcGxpY2F0ZSBpbnZva2VkIG9uIGtleToiK2tleSk7CisgICAgICAgIE1hcEVudHJ5IGVudHJ5ID0gKE1hcEVudHJ5KXN1cGVyLmdldChrZXkpOworICAgICAgICBpZiAoICFlbnRyeS5pc1NlcmlhbGl6YWJsZSgpICkgcmV0dXJuOworICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCAmJiBlbnRyeS5pc1ByaW1hcnkoKSAmJiBlbnRyeS5nZXRCYWNrdXBOb2RlcygpIT0gbnVsbCAmJiBlbnRyeS5nZXRCYWNrdXBOb2RlcygpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAvL2NoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHJlcGxpY2F0ZSB0aGlzIG9iamVjdCBpc0RpcnR5KCl8fGNvbXBsZXRlCisgICAgICAgICAgICBib29sZWFuIHJlcGwgPSBjb21wbGV0ZSB8fCAoICh2YWx1ZSBpbnN0YW5jZW9mIFJlcGxpY2F0ZWRNYXBFbnRyeSkgJiYgKCAoUmVwbGljYXRlZE1hcEVudHJ5KSB2YWx1ZSkuaXNEaXJ0eSgpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFyZXBsKSB7CisgICAgICAgICAgICAgICAgaWYgKCBsb2cuaXNUcmFjZUVuYWJsZWQoKSApCisgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiTm90IHJlcGxpY2F0aW5nOiIra2V5KyIsIG5vIGNoYW5nZSBtYWRlIik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9jaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgZGlmZmFibGUKKyAgICAgICAgICAgIGJvb2xlYW4gZGlmZiA9ICggKHZhbHVlIGluc3RhbmNlb2YgUmVwbGljYXRlZE1hcEVudHJ5KSAmJiAoIChSZXBsaWNhdGVkTWFwRW50cnkpIHZhbHVlKS5pc0RpZmZhYmxlKCkpOworICAgICAgICAgICAgTWFwTWVzc2FnZSBtc2cgPSBudWxsOworICAgICAgICAgICAgaWYgKGRpZmYpIHsKKyAgICAgICAgICAgICAgICBSZXBsaWNhdGVkTWFwRW50cnkgcmVudHJ5ID0gKFJlcGxpY2F0ZWRNYXBFbnRyeSllbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlbnRyeS5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIC8vY29uc3RydWN0IGEgZGlmZiBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgIG1zZyA9IG5ldyBNYXBNZXNzYWdlKG1hcENvbnRleHROYW1lLCBNYXBNZXNzYWdlLk1TR19CQUNLVVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIChTZXJpYWxpemFibGUpIGVudHJ5LmdldEtleSgpLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW50cnkuZ2V0RGlmZigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRCYWNrdXBOb2RlcygpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGRpZmYgb2JqZWN0LiBXaWxsIHJlcGxpY2F0ZSB0aGUgZW50aXJlIG9iamVjdCBpbnN0ZWFkLiIsIHgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHJlbnRyeS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobXNnID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvL2NvbnN0cnVjdCBhIGNvbXBsZXRlCisgICAgICAgICAgICAgICAgbXNnID0gbmV3IE1hcE1lc3NhZ2UobWFwQ29udGV4dE5hbWUsIE1hcE1lc3NhZ2UuTVNHX0JBQ0tVUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgKFNlcmlhbGl6YWJsZSkgZW50cnkuZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNlcmlhbGl6YWJsZSkgZW50cnkuZ2V0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBlbnRyeS5nZXRCYWNrdXBOb2RlcygpKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoIGNoYW5uZWwhPW51bGwgJiYgZW50cnkuZ2V0QmFja3VwTm9kZXMoKSE9IG51bGwgJiYgZW50cnkuZ2V0QmFja3VwTm9kZXMoKS5sZW5ndGggPiAwICkgeworICAgICAgICAgICAgICAgICAgICBjaGFubmVsLnNlbmQoZW50cnkuZ2V0QmFja3VwTm9kZXMoKSwgbXNnLCBjaGFubmVsU2VuZE9wdGlvbnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKENoYW5uZWxFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHJlcGxpY2F0ZSBkYXRhLiIsIHgpOworICAgICAgICAgICAgfQorICAgICAgICB9IC8vZW5kIGlmCisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNhbiBiZSBpbnZva2VkIGJ5IGEgcGVyaW9kaWMgdGhyZWFkIHRvIHJlcGxpY2F0ZSBvdXQgYW55IGNoYW5nZXMuCisgICAgICogRm9yIG1hcHMgdGhhdCBkb24ndCBzdG9yZSBvYmplY3RzIHRoYXQgaW1wbGVtZW50IFJlcGxpY2F0ZWRNYXBFbnRyeSwgdGhpcworICAgICAqIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpbmZyZXF1ZW50bHkgdG8gYXZvaWQgbGFyZ2UgYW1vdW50cyBvZiBkYXRhIHRyYW5zZmVyCisgICAgICogQHBhcmFtIGNvbXBsZXRlIGJvb2xlYW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXBsaWNhdGUoYm9vbGVhbiBjb21wbGV0ZSkgeworICAgICAgICBJdGVyYXRvciBpID0gc3VwZXIuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7CisgICAgICAgICAgICByZXBsaWNhdGUoZS5nZXRLZXkoKSwgY29tcGxldGUpOworICAgICAgICB9IC8vd2hpbGUKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRyYW5zZmVyU3RhdGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZW1iZXJbXSBtZW1iZXJzID0gZ2V0TWFwTWVtYmVycygpOworICAgICAgICAgICAgTWVtYmVyIGJhY2t1cCA9IG1lbWJlcnMubGVuZ3RoID4gMCA/IChNZW1iZXIpIG1lbWJlcnNbMF0gOiBudWxsOworICAgICAgICAgICAgaWYgKGJhY2t1cCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTWFwTWVzc2FnZSBtc2cgPSBuZXcgTWFwTWVzc2FnZShtYXBDb250ZXh0TmFtZSwgTWFwTWVzc2FnZS5NU0dfU1RBVEUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgUmVzcG9uc2VbXSByZXNwID0gcnBjQ2hhbm5lbC5zZW5kKG5ldyBNZW1iZXJbXSB7YmFja3VwfSwgbXNnLCBycGNDaGFubmVsLkZJUlNUX1JFUExZLCBjaGFubmVsU2VuZE9wdGlvbnMsIHJwY1RpbWVvdXQpOworICAgICAgICAgICAgICAgIGlmIChyZXNwLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzdGF0ZU11dGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAoTWFwTWVzc2FnZSkgcmVzcFswXS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtc2cuZGVzZXJpYWxpemUoZ2V0RXh0ZXJuYWxMb2FkZXJzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSAoQXJyYXlMaXN0KSBtc2cuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWNlaXZlZCggKFNlcmlhbGl6YWJsZSkgbGlzdC5nZXQoaSksIHJlc3BbMF0uZ2V0U291cmNlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSAvL2ZvcgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIlRyYW5zZmVyIHN0YXRlLCAwIHJlcGxpZXMsIHByb2JhYmx5IGEgdGltZW91dC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENoYW5uZWxFeGNlcHRpb24geCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gdHJhbnNmZXIgTGF6eVJlcGxpY2F0ZWRNYXAgc3RhdGUuIiwgeCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHRyYW5zZmVyIExhenlSZXBsaWNhdGVkTWFwIHN0YXRlLiIsIHgpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHRyYW5zZmVyIExhenlSZXBsaWNhdGVkTWFwIHN0YXRlLiIsIHgpOworICAgICAgICB9CisgICAgICAgIHN0YXRlVHJhbnNmZXJyZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0b2RvIGltcGxlbWVudCBzdGF0ZSB0cmFuc2ZlcgorICAgICAqIEBwYXJhbSBtc2cgU2VyaWFsaXphYmxlCisgICAgICogQHJldHVybiBTZXJpYWxpemFibGUgLSBudWxsIGlmIG5vIHJlcGx5IHNob3VsZCBiZSBzZW50CisgICAgICovCisgICAgcHVibGljIFNlcmlhbGl6YWJsZSByZXBseVJlcXVlc3QoU2VyaWFsaXphYmxlIG1zZywgZmluYWwgTWVtYmVyIHNlbmRlcikgeworICAgICAgICBpZiAoISAobXNnIGluc3RhbmNlb2YgTWFwTWVzc2FnZSkpcmV0dXJuIG51bGw7CisgICAgICAgIE1hcE1lc3NhZ2UgbWFwbXNnID0gKE1hcE1lc3NhZ2UpIG1zZzsKKworICAgICAgICAvL21hcCBpbml0IHJlcXVlc3QKKyAgICAgICAgaWYgKG1hcG1zZy5nZXRNc2dUeXBlKCkgPT0gbWFwbXNnLk1TR19JTklUKSB7CisgICAgICAgICAgICBtYXBtc2cuc2V0QmFja1VwTm9kZXMod3JhcChjaGFubmVsLmdldExvY2FsTWVtYmVyKGZhbHNlKSkpOworICAgICAgICAgICAgcmV0dXJuIG1hcG1zZzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy9tYXAgc3RhcnQgcmVxdWVzdAorICAgICAgICBpZiAobWFwbXNnLmdldE1zZ1R5cGUoKSA9PSBtYXBtc2cuTVNHX1NUQVJUKSB7CisgICAgICAgICAgICBtYXBtc2cuc2V0QmFja1VwTm9kZXMod3JhcChjaGFubmVsLmdldExvY2FsTWVtYmVyKGZhbHNlKSkpOworICAgICAgICAgICAgbWFwTWVtYmVyQWRkZWQoc2VuZGVyKTsKKyAgICAgICAgICAgIHJldHVybiBtYXBtc2c7CisgICAgICAgIH0KKworICAgICAgICAvL2JhY2t1cCByZXF1ZXN0CisgICAgICAgIGlmIChtYXBtc2cuZ2V0TXNnVHlwZSgpID09IG1hcG1zZy5NU0dfUkVUUklFVkVfQkFDS1VQKSB7CisgICAgICAgICAgICBNYXBFbnRyeSBlbnRyeSA9IChNYXBFbnRyeSlzdXBlci5nZXQobWFwbXNnLmdldEtleSgpKTsKKyAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsIHx8ICghZW50cnkuaXNTZXJpYWxpemFibGUoKSkgKXJldHVybiBudWxsOworICAgICAgICAgICAgbWFwbXNnLnNldFZhbHVlKCAoU2VyaWFsaXphYmxlKSBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBtYXBtc2c7CisgICAgICAgIH0KKworICAgICAgICAvL3N0YXRlIHRyYW5zZmVyIHJlcXVlc3QKKyAgICAgICAgaWYgKG1hcG1zZy5nZXRNc2dUeXBlKCkgPT0gbWFwbXNnLk1TR19TVEFURSkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChzdGF0ZU11dGV4KSB7IC8vbWFrZSBzdXJlIHdlIGRvbnQgZG8gdHdvIHRoaW5ncyBhdCB0aGUgc2FtZSB0aW1lCisgICAgICAgICAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgSXRlcmF0b3IgaSA9IHN1cGVyLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgTWFwRW50cnkgZW50cnkgPSAoTWFwRW50cnkpIGUuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBlbnRyeS5pc1NlcmlhbGl6YWJsZSgpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgTWFwTWVzc2FnZSBtZSA9IG5ldyBNYXBNZXNzYWdlKG1hcENvbnRleHROYW1lLCBNYXBNZXNzYWdlLk1TR19QUk9YWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgKFNlcmlhbGl6YWJsZSkgZW50cnkuZ2V0S2V5KCksIG51bGwsIG51bGwsIGVudHJ5LmdldEJhY2t1cE5vZGVzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQobWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1hcG1zZy5zZXRWYWx1ZShsaXN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFwbXNnOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSAvL3N5bmNocm9uaXplZAorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgcmVwbHkgaGFzIGFscmVhZHkgYmVlbiBzZW50IHRvIHRoZSByZXF1ZXN0aW5nIHRocmVhZCwKKyAgICAgKiB0aGUgcnBjIGNhbGxiYWNrIGNhbiBoYW5kbGUgYW55IGRhdGEgdGhhdCBjb21lcyBpbiBhZnRlciB0aGUgZmFjdC4KKyAgICAgKiBAcGFyYW0gbXNnIFNlcmlhbGl6YWJsZQorICAgICAqIEBwYXJhbSBzZW5kZXIgTWVtYmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgbGVmdE92ZXIoU2VyaWFsaXphYmxlIG1zZywgTWVtYmVyIHNlbmRlcikgeworICAgICAgICAvL2xlZnQgb3ZlciBtZW1iZXJzaGlwIG1lc3NhZ2VzCisgICAgICAgIGlmICghIChtc2cgaW5zdGFuY2VvZiBNYXBNZXNzYWdlKSlyZXR1cm47CisKKyAgICAgICAgTWFwTWVzc2FnZSBtYXBtc2cgPSAoTWFwTWVzc2FnZSkgbXNnOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFwbXNnLmRlc2VyaWFsaXplKGdldEV4dGVybmFsTG9hZGVycygpKTsKKyAgICAgICAgICAgIGlmIChtYXBtc2cuZ2V0TXNnVHlwZSgpID09IE1hcE1lc3NhZ2UuTVNHX1NUQVJUKSB7CisgICAgICAgICAgICAgICAgbWFwTWVtYmVyQWRkZWQobWFwbXNnLmdldEJhY2t1cE5vZGVzKClbMF0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChtYXBtc2cuZ2V0TXNnVHlwZSgpID09IE1hcE1lc3NhZ2UuTVNHX0lOSVQpIHsKKyAgICAgICAgICAgICAgICBtZW1iZXJBbGl2ZShtYXBtc2cuZ2V0QmFja3VwTm9kZXMoKVswXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBkZXNlcmlhbGl6ZSBNYXBNZXNzYWdlLiIseCk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGRlc2VyaWFsaXplIE1hcE1lc3NhZ2UuIix4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZWNlaXZlZChTZXJpYWxpemFibGUgbXNnLCBNZW1iZXIgc2VuZGVyKSB7CisgICAgICAgIGlmICghIChtc2cgaW5zdGFuY2VvZiBNYXBNZXNzYWdlKSkgcmV0dXJuOworCisgICAgICAgIE1hcE1lc3NhZ2UgbWFwbXNnID0gKE1hcE1lc3NhZ2UpIG1zZzsKKyAgICAgICAgaWYgKCBsb2cuaXNUcmFjZUVuYWJsZWQoKSApIHsKKyAgICAgICAgICAgIGxvZy50cmFjZSgiTWFwWyIrbWFwbmFtZSsiXSByZWNlaXZlZCBtZXNzYWdlOiIrbWFwbXNnKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hcG1zZy5kZXNlcmlhbGl6ZShnZXRFeHRlcm5hbExvYWRlcnMoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGRlc2VyaWFsaXplIE1hcE1lc3NhZ2UuIiwgeCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24geCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gZGVzZXJpYWxpemUgTWFwTWVzc2FnZS4iLCB4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGxvZy5pc1RyYWNlRW5hYmxlZCgpICkgCisgICAgICAgICAgICBsb2cudHJhY2UoIk1hcCBtZXNzYWdlIHJlY2VpdmVkIGZyb206IitzZW5kZXIuZ2V0TmFtZSgpKyIgbXNnOiIrbWFwbXNnKTsKKyAgICAgICAgaWYgKG1hcG1zZy5nZXRNc2dUeXBlKCkgPT0gTWFwTWVzc2FnZS5NU0dfU1RBUlQpIHsKKyAgICAgICAgICAgIG1hcE1lbWJlckFkZGVkKG1hcG1zZy5nZXRCYWNrdXBOb2RlcygpWzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYXBtc2cuZ2V0TXNnVHlwZSgpID09IE1hcE1lc3NhZ2UuTVNHX1NUT1ApIHsKKyAgICAgICAgICAgIG1lbWJlckRpc2FwcGVhcmVkKG1hcG1zZy5nZXRCYWNrdXBOb2RlcygpWzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYXBtc2cuZ2V0TXNnVHlwZSgpID09IE1hcE1lc3NhZ2UuTVNHX1BST1hZKSB7CisgICAgICAgICAgICBNYXBFbnRyeSBlbnRyeSA9IChNYXBFbnRyeSlzdXBlci5nZXQobWFwbXNnLmdldEtleSgpKTsKKyAgICAgICAgICAgIGlmICggZW50cnk9PW51bGwgKSB7CisgICAgICAgICAgICAgICAgZW50cnkgPSBuZXcgTWFwRW50cnkobWFwbXNnLmdldEtleSgpLCBtYXBtc2cuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgZW50cnkuc2V0QmFja3VwKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBlbnRyeS5zZXRQcm94eSh0cnVlKTsKKyAgICAgICAgICAgICAgICBlbnRyeS5zZXRCYWNrdXBOb2RlcyhtYXBtc2cuZ2V0QmFja3VwTm9kZXMoKSk7CisgICAgICAgICAgICAgICAgc3VwZXIucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVudHJ5LnNldFByb3h5KHRydWUpOworICAgICAgICAgICAgICAgIGVudHJ5LnNldEJhY2t1cChmYWxzZSk7CisgICAgICAgICAgICAgICAgZW50cnkuc2V0QmFja3VwTm9kZXMobWFwbXNnLmdldEJhY2t1cE5vZGVzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hcG1zZy5nZXRNc2dUeXBlKCkgPT0gTWFwTWVzc2FnZS5NU0dfUkVNT1ZFKSB7CisgICAgICAgICAgICBzdXBlci5yZW1vdmUobWFwbXNnLmdldEtleSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYXBtc2cuZ2V0TXNnVHlwZSgpID09IE1hcE1lc3NhZ2UuTVNHX0JBQ0tVUCkgeworICAgICAgICAgICAgTWFwRW50cnkgZW50cnkgPSAoTWFwRW50cnkpc3VwZXIuZ2V0KG1hcG1zZy5nZXRLZXkoKSk7CisgICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV3IE1hcEVudHJ5KG1hcG1zZy5nZXRLZXkoKSwgbWFwbXNnLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGVudHJ5LnNldEJhY2t1cCh0cnVlKTsKKyAgICAgICAgICAgICAgICBlbnRyeS5zZXRQcm94eShmYWxzZSk7CisgICAgICAgICAgICAgICAgZW50cnkuc2V0QmFja3VwTm9kZXMobWFwbXNnLmdldEJhY2t1cE5vZGVzKCkpOworICAgICAgICAgICAgICAgIGlmIChtYXBtc2cuZ2V0VmFsdWUoKSE9bnVsbCAmJiBtYXBtc2cuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFJlcGxpY2F0ZWRNYXBFbnRyeSApIHsKKyAgICAgICAgICAgICAgICAgICAgKChSZXBsaWNhdGVkTWFwRW50cnkpbWFwbXNnLmdldFZhbHVlKCkpLnNldE93bmVyKGdldE1hcE93bmVyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZW50cnkuc2V0QmFja3VwKHRydWUpOworICAgICAgICAgICAgICAgIGVudHJ5LnNldFByb3h5KGZhbHNlKTsKKyAgICAgICAgICAgICAgICBlbnRyeS5zZXRCYWNrdXBOb2RlcyhtYXBtc2cuZ2V0QmFja3VwTm9kZXMoKSk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBSZXBsaWNhdGVkTWFwRW50cnkpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVwbGljYXRlZE1hcEVudHJ5IGRpZmYgPSAoUmVwbGljYXRlZE1hcEVudHJ5KSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobWFwbXNnLmlzRGlmZigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYubG9jaygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYuYXBwbHlEaWZmKG1hcG1zZy5nZXREaWZmVmFsdWUoKSwgMCwgbWFwbXNnLmdldERpZmZWYWx1ZSgpLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGFwcGx5IGRpZmYgdG8ga2V5OiIgKyBlbnRyeS5nZXRLZXkoKSwgeCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1hcG1zZy5nZXRWYWx1ZSgpIT1udWxsICkgZW50cnkuc2V0VmFsdWUobWFwbXNnLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKChSZXBsaWNhdGVkTWFwRW50cnkpZW50cnkuZ2V0VmFsdWUoKSkuc2V0T3duZXIoZ2V0TWFwT3duZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gLy9lbmQgaWYKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgIChtYXBtc2cuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFJlcGxpY2F0ZWRNYXBFbnRyeSkgeworICAgICAgICAgICAgICAgICAgICBSZXBsaWNhdGVkTWFwRW50cnkgcmUgPSAoUmVwbGljYXRlZE1hcEVudHJ5KW1hcG1zZy5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICByZS5zZXRPd25lcihnZXRNYXBPd25lcigpKTsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuc2V0VmFsdWUocmUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggbWFwbXNnLmdldFZhbHVlKCkhPW51bGwgKSBlbnRyeS5zZXRWYWx1ZShtYXBtc2cuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfSAvL2VuZCBpZgorICAgICAgICAgICAgfSAvL2VuZCBpZgorICAgICAgICAgICAgc3VwZXIucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeSk7CisgICAgICAgIH0gLy9lbmQgaWYKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU2VyaWFsaXphYmxlIG1zZywgTWVtYmVyIHNlbmRlcikgeworICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOworICAgICAgICBpZiAobXNnIGluc3RhbmNlb2YgTWFwTWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKCBsb2cuaXNUcmFjZUVuYWJsZWQoKSApIGxvZy50cmFjZSgiTWFwWyIrbWFwbmFtZSsiXSBhY2NlcHRpbmcuLi4uIittc2cpOworICAgICAgICAgICAgcmVzdWx0ID0gQXJyYXlzLmVxdWFscyhtYXBDb250ZXh0TmFtZSwgKCAoTWFwTWVzc2FnZSkgbXNnKS5nZXRNYXBJZCgpKTsKKyAgICAgICAgICAgIGlmICggbG9nLmlzVHJhY2VFbmFibGVkKCkgKSBsb2cudHJhY2UoIk1zZ1siK21hcG5hbWUrIl0gYWNjZXB0ZWRbIityZXN1bHQrIl0uLi4uIittc2cpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWFwTWVtYmVyQWRkZWQoTWVtYmVyIG1lbWJlcikgeworICAgICAgICBpZiAoIG1lbWJlci5lcXVhbHMoZ2V0Q2hhbm5lbCgpLmdldExvY2FsTWVtYmVyKGZhbHNlKSkgKSByZXR1cm47CisgICAgICAgIGJvb2xlYW4gbWVtYmVyQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgLy9zZWxlY3QgYSBiYWNrdXAgbm9kZSBpZiB3ZSBkb24ndCBoYXZlIG9uZQorICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcE1lbWJlcnMpIHsKKyAgICAgICAgICAgIGlmICghbWFwTWVtYmVycy5jb250YWluc0tleShtZW1iZXIpICkgeworICAgICAgICAgICAgICAgIG1hcE1lbWJlcnMucHV0KG1lbWJlciwgbmV3IExvbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKKyAgICAgICAgICAgICAgICBtZW1iZXJBZGRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBtZW1iZXJBZGRlZCApIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc3RhdGVNdXRleCkgeworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBzdXBlci5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIE1hcEVudHJ5IGVudHJ5ID0gKE1hcEVudHJ5KSBlLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICggZW50cnkgPT0gbnVsbCApIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuaXNQcmltYXJ5KCkgJiYgKGVudHJ5LmdldEJhY2t1cE5vZGVzKCkgPT0gbnVsbCB8fCBlbnRyeS5nZXRCYWNrdXBOb2RlcygpLmxlbmd0aCA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJbXSBiYWNrdXAgPSBwdWJsaXNoRW50cnlJbmZvKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zZXRCYWNrdXBOb2RlcyhiYWNrdXApOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2hhbm5lbEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gc2VsZWN0IGJhY2t1cCBub2RlLiIsIHgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSAvL2NhdGNoCisgICAgICAgICAgICAgICAgICAgIH0gLy9lbmQgaWYKKyAgICAgICAgICAgICAgICB9IC8vd2hpbGUKKyAgICAgICAgICAgIH0gLy9zeW5jaHJvbml6ZWQKKyAgICAgICAgfS8vZW5kIGlmCisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGluU2V0KE1lbWJlciBtLCBNZW1iZXJbXSBzZXQpIHsKKyAgICAgICAgaWYgKCBzZXQgPT0gbnVsbCApIHJldHVybiBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNldC5sZW5ndGggJiYgKCFyZXN1bHQpOyBpKysgKQorICAgICAgICAgICAgaWYgKCBtLmVxdWFscyhzZXRbaV0pICkgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVtYmVyW10gZXhjbHVkZUZyb21TZXQoTWVtYmVyW10gbWJycywgTWVtYmVyW10gc2V0KSB7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxzZXQubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICBib29sZWFuIGluY2x1ZGUgPSB0cnVlOworICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPG1icnMubGVuZ3RoOyBqKysgKSAKKyAgICAgICAgICAgICAgICBpZiAoIG1icnNbal0uZXF1YWxzKHNldFtpXSkgKSBpbmNsdWRlID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoIGluY2x1ZGUgKSByZXN1bHQuYWRkKHNldFtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChNZW1iZXJbXSlyZXN1bHQudG9BcnJheShuZXcgTWVtYmVyW3Jlc3VsdC5zaXplKCldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIC8vZG8gbm90aGluZworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7CisgICAgICAgIHN5bmNocm9uaXplZCAobWFwTWVtYmVycykgeworICAgICAgICAgICAgcmVtb3ZlZCA9IChtYXBNZW1iZXJzLnJlbW92ZShtZW1iZXIpICE9IG51bGwgKTsKKyAgICAgICAgfQorICAgICAgICBJdGVyYXRvciBpID0gc3VwZXIuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7CisgICAgICAgICAgICBNYXBFbnRyeSBlbnRyeSA9IChNYXBFbnRyeSkgZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKGVudHJ5LmlzUHJpbWFyeSgpICYmIGluU2V0KG1lbWJlcixlbnRyeS5nZXRCYWNrdXBOb2RlcygpKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIE1lbWJlcltdIGJhY2t1cCA9IHB1Ymxpc2hFbnRyeUluZm8oZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBlbnRyeS5zZXRCYWNrdXBOb2RlcyhiYWNrdXApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENoYW5uZWxFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byByZWxvY2F0ZVsiICsgZW50cnkuZ2V0S2V5KCkgKyAiXSB0byBhIG5ldyBiYWNrdXAgbm9kZSIsIHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy9lbmQgaWYKKyAgICAgICAgfSAvL3doaWxlCisgICAgfQorCisgICAgcHVibGljIGludCBnZXROZXh0QmFja3VwSW5kZXgoKSB7CisgICAgICAgIGludCBzaXplID0gbWFwTWVtYmVycy5zaXplKCk7CisgICAgICAgIGlmIChtYXBNZW1iZXJzLnNpemUoKSA9PSAwKXJldHVybiAtMTsKKyAgICAgICAgaW50IG5vZGUgPSBjdXJyZW50Tm9kZSsrOworICAgICAgICBpZiAobm9kZSA+PSBzaXplKSB7CisgICAgICAgICAgICBub2RlID0gMDsKKyAgICAgICAgICAgIGN1cnJlbnROb2RlID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisgICAgcHVibGljIE1lbWJlciBnZXROZXh0QmFja3VwTm9kZSgpIHsKKyAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IGdldE1hcE1lbWJlcnMoKTsKKyAgICAgICAgaW50IG5vZGUgPSBnZXROZXh0QmFja3VwSW5kZXgoKTsKKyAgICAgICAgaWYgKCBtZW1iZXJzLmxlbmd0aCA9PSAwIHx8IG5vZGU9PS0xKSByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKCBub2RlID49IG1lbWJlcnMubGVuZ3RoICkgbm9kZSA9IDA7CisgICAgICAgIHJldHVybiBtZW1iZXJzW25vZGVdOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNZW1iZXJbXSBwdWJsaXNoRW50cnlJbmZvKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgdGhyb3dzIENoYW5uZWxFeGNlcHRpb247CisgICAgCisgICAgcHVibGljIHZvaWQgaGVhcnRiZWF0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGluZyhhY2Nlc3NUaW1lb3V0KTsKKyAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzZW5kIEFic3RyYWN0UmVwbGljYXRlZE1hcC5waW5nIG1lc3NhZ2UiLHgpOworICAgICAgICB9CisgICAgfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKKy8vICAgICAgICAgICAgICBNRVRIT0RTIFRPIE9WRVJSSURFICAgIAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbiBvYmplY3QgZnJvbSB0aGlzIG1hcCwgaXQgd2lsbCBhbHNvIHJlbW92ZSBpdCBmcm9tIAorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkgT2JqZWN0CisgICAgICogQHJldHVybiBPYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7CisgICAgICAgIE1hcEVudHJ5IGVudHJ5ID0gKE1hcEVudHJ5KXN1cGVyLnJlbW92ZShrZXkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNYXBNZXNzYWdlIG1zZyA9IG5ldyBNYXBNZXNzYWdlKGdldE1hcENvbnRleHROYW1lKCksTWFwTWVzc2FnZS5NU0dfUkVNT1ZFLGZhbHNlLChTZXJpYWxpemFibGUpa2V5LG51bGwsbnVsbCxudWxsKTsKKyAgICAgICAgICAgIGdldENoYW5uZWwoKS5zZW5kKGdldE1hcE1lbWJlcnMoKSwgbXNnLGdldENoYW5uZWxTZW5kT3B0aW9ucygpKTsKKyAgICAgICAgfSBjYXRjaCAoIENoYW5uZWxFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHJlcGxpY2F0ZSBvdXQgZGF0YSBmb3IgYSBMYXp5UmVwbGljYXRlZE1hcC5yZW1vdmUgb3BlcmF0aW9uIix4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZW50cnkhPW51bGw/ZW50cnkuZ2V0VmFsdWUoKTpudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7CisgICAgICAgICAgICBNYXBFbnRyeSBlbnRyeSA9IChNYXBFbnRyeSlzdXBlci5nZXQoa2V5KTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgbG9nLnRyYWNlKCJSZXF1ZXN0aW5nIGlkOiIra2V5KyIgZW50cnk6IitlbnRyeSk7CisgICAgICAgICAgICBpZiAoIGVudHJ5ID09IG51bGwgKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGlmICggIWVudHJ5LmlzUHJpbWFyeSgpICkgeworICAgICAgICAgICAgICAgIC8vaWYgdGhlIG1lc3NhZ2UgaXMgbm90IHByaW1hcnksIHdlIG5lZWQgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCB2YWx1ZQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIE1lbWJlcltdIGJhY2t1cCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIE1hcE1lc3NhZ2UgbXNnID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhZW50cnkuaXNCYWNrdXAoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vbWFrZSBzdXJlIHdlIGRvbid0IHJldHJpZXZlIGZyb20gb3Vyc2VsdmVzCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBuZXcgTWFwTWVzc2FnZShnZXRNYXBDb250ZXh0TmFtZSgpLCBNYXBNZXNzYWdlLk1TR19SRVRSSUVWRV9CQUNLVVAsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNlcmlhbGl6YWJsZSkga2V5LCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlW10gcmVzcCA9IGdldFJwY0NoYW5uZWwoKS5zZW5kKGVudHJ5LmdldEJhY2t1cE5vZGVzKCksbXNnLCB0aGlzLmdldFJwY0NoYW5uZWwoKS5GSVJTVF9SRVBMWSwgQ2hhbm5lbC5TRU5EX09QVElPTlNfREVGQVVMVCwgZ2V0UnBjVGltZW91dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwID09IG51bGwgfHwgcmVzcC5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbm8gcmVzcG9uc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIlVuYWJsZSB0byByZXRyaWV2ZSByZW1vdGUgb2JqZWN0IGZvciBrZXk6IiArIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAoTWFwTWVzc2FnZSkgcmVzcFswXS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtc2cuZGVzZXJpYWxpemUoZ2V0RXh0ZXJuYWxMb2FkZXJzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwID0gZW50cnkuZ2V0QmFja3VwTm9kZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFJlcGxpY2F0ZWRNYXBFbnRyeSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBsaWNhdGVkTWFwRW50cnkgdmFsID0gKFJlcGxpY2F0ZWRNYXBFbnRyeSllbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5zZXRPd25lcihnZXRNYXBPd25lcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbXNnLmdldFZhbHVlKCkhPW51bGwgKSBlbnRyeS5zZXRWYWx1ZShtc2cuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzQmFja3VwKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vc2VsZWN0IGEgbmV3IGJhY2t1cCBub2RlCisgICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXAgPSBwdWJsaXNoRW50cnlJbmZvKGtleSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGVudHJ5LmlzUHJveHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaW52YWxpZGF0ZSB0aGUgcHJldmlvdXMgcHJpbWFyeQorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gbmV3IE1hcE1lc3NhZ2UoZ2V0TWFwQ29udGV4dE5hbWUoKSxNYXBNZXNzYWdlLk1TR19QUk9YWSxmYWxzZSwoU2VyaWFsaXphYmxlKWtleSxudWxsLG51bGwsYmFja3VwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlcltdIGRlc3QgPSBnZXRNYXBNZW1iZXJzRXhjbChiYWNrdXApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBkZXN0IT1udWxsICYmIGRlc3QubGVuZ3RoID4wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhbm5lbCgpLnNlbmQoZGVzdCwgbXNnLCBnZXRDaGFubmVsU2VuZE9wdGlvbnMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuc2V0QmFja3VwTm9kZXMoYmFja3VwKTsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuc2V0QmFja3VwKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuc2V0UHJveHkoZmFsc2UpOworICAgIAorICAgIAorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHJlcGxpY2F0ZSBvdXQgZGF0YSBmb3IgYSBMYXp5UmVwbGljYXRlZE1hcC5nZXQgb3BlcmF0aW9uIiwgeCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgbG9nLnRyYWNlKCJSZXF1ZXN0aW5nIGlkOiIra2V5KyIgcmVzdWx0OiIrZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICB9ICAgIAorCisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRNYXAoU3RyaW5nIGhlYWRlcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkRFQlVHIE1BUDoiK2hlYWRlcik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1hcFsiKyBuZXcgU3RyaW5nKG1hcENvbnRleHROYW1lLCBjaHNldCkgKyAiLCBNYXAgU2l6ZToiICsgc3VwZXIuc2l6ZSgpKTsKKyAgICAgICAgICAgIE1lbWJlcltdIG1icnMgPSBnZXRNYXBNZW1iZXJzKCk7CisgICAgICAgICAgICBmb3IgKCBpbnQgaT0wOyBpPG1icnMubGVuZ3RoO2krKyApIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1iclsiKyhpKzEpKyI9IittYnJzW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJdGVyYXRvciBpID0gc3VwZXIuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgaW50IGNudCA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAoKytjbnQpICsgIi4gIiArIGUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVuZE1hcF1cblxuIik7CisgICAgICAgIH1jYXRjaCAoIEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIGlnbm9yZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBrZXkgaGFzIGFuIGVudHJ5IGluIHRoZSBtYXAuCisgICAgICAgICAqIFRoZSBlbnRyeSBjYW4gYmUgYSBwcm94eSBvciBhIGJhY2t1cCBlbnRyeSwgaW52b2tpbmcgPGNvZGU+Z2V0KGtleSk8L2NvZGU+CisgICAgICAgICAqIHdpbGwgbWFrZSB0aGlzIGVudHJ5IHByaW1hcnkgZm9yIHRoZSBncm91cAorICAgICAgICAgKiBAcGFyYW0ga2V5IE9iamVjdAorICAgICAgICAgKiBAcmV0dXJuIGJvb2xlYW4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5jb250YWluc0tleShrZXkpOworICAgICAgICB9CisgICAgCisgICAgCisgICAgICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgICAgICAgICAgTWFwRW50cnkgZW50cnkgPSBuZXcgTWFwRW50cnkoa2V5LHZhbHVlKTsKKyAgICAgICAgICAgIGVudHJ5LnNldEJhY2t1cChmYWxzZSk7CisgICAgICAgICAgICBlbnRyeS5zZXRQcm94eShmYWxzZSk7CisgICAgCisgICAgICAgICAgICBPYmplY3Qgb2xkID0gbnVsbDsKKyAgICAKKyAgICAgICAgICAgIC8vbWFrZSBzdXJlIHRoYXQgYW55IG9sZCB2YWx1ZXMgZ2V0IHJlbW92ZWQKKyAgICAgICAgICAgIGlmICggY29udGFpbnNLZXkoa2V5KSApIG9sZCA9IHJlbW92ZShrZXkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBNZW1iZXJbXSBiYWNrdXAgPSBwdWJsaXNoRW50cnlJbmZvKGtleSwgdmFsdWUpOworICAgICAgICAgICAgICAgIGVudHJ5LnNldEJhY2t1cE5vZGVzKGJhY2t1cCk7CisgICAgICAgICAgICB9IGNhdGNoIChDaGFubmVsRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byByZXBsaWNhdGUgb3V0IGRhdGEgZm9yIGEgTGF6eVJlcGxpY2F0ZWRNYXAucHV0IG9wZXJhdGlvbiIsIHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIucHV0KGtleSxlbnRyeSk7CisgICAgICAgICAgICByZXR1cm4gb2xkOworICAgICAgICB9CisgICAgCisgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb3BpZXMgYWxsIHZhbHVlcyBmcm9tIG9uZSBtYXAgdG8gdGhpcyBpbnN0YW5jZQorICAgICAgICAgKiBAcGFyYW0gbSBNYXAKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgbSkgeworICAgICAgICAgICAgSXRlcmF0b3IgaSA9IG0uZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKCBpLmhhc05leHQoKSApIHsKKyAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWkubmV4dCgpOworICAgICAgICAgICAgICAgIHB1dChlbnRyeS5nZXRLZXkoKSxlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIC8vb25seSBkZWxldGUgYWN0aXZlIGtleXMKKyAgICAgICAgICAgIEl0ZXJhdG9yIGtleXMgPSBrZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKCBrZXlzLmhhc05leHQoKSApIHJlbW92ZShrZXlzLm5leHQoKSk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICggdmFsdWUgPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuY29udGFpbnNWYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBzdXBlci5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIE1hcEVudHJ5IGVudHJ5ID0gKE1hcEVudHJ5KSBlLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5pc1ByaW1hcnkoKSAmJiB2YWx1ZS5lcXVhbHMoZW50cnkuZ2V0VmFsdWUoKSkpIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0vL3doaWxlCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgIH0KKyAgICAKKyAgICAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhpcyBvcGVyYXRpb24gaXMgbm90IHZhbGlkIG9uIGEgcmVwbGljYXRlZCBtYXAiKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBtYXAKKyAgICAgICAgICogTWFwLkVudHJ5LmdldFZhbHVlKCkgd2lsbCByZXR1cm4gYSBMYXp5UmVwbGljYXRlZE1hcC5NYXBFbnRyeSBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIGluZm9ybWF0aW9uIAorICAgICAgICAgKiBhYm91dCB0aGUgb2JqZWN0LgorICAgICAgICAgKiBAcmV0dXJuIFNldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFNldCBlbnRyeVNldEZ1bGwoKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZW50cnlTZXQoKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICBwdWJsaWMgU2V0IGtleVNldEZ1bGwoKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIua2V5U2V0KCk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgcHVibGljIGludCBzaXplRnVsbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5zaXplKCk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsKKyAgICAgICAgICAgIExpbmtlZEhhc2hTZXQgc2V0ID0gbmV3IExpbmtlZEhhc2hTZXQoc3VwZXIuc2l6ZSgpKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBzdXBlci5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoIGkuaGFzTmV4dCgpICkgeworICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSlpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBNYXBFbnRyeSBlbnRyeSA9IChNYXBFbnRyeSllLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKCBlbnRyeS5pc1ByaW1hcnkoKSApIHNldC5hZGQoZW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChzZXQpOworICAgICAgICB9CisgICAgCisgICAgICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgeworICAgICAgICAgICAgLy90b2RvIGltcGxlbWVudAorICAgICAgICAgICAgLy9zaG91bGQgb25seSByZXR1cm4ga2V5cyB3aGVyZSB0aGlzIGlzIGFjdGl2ZS4KKyAgICAgICAgICAgIExpbmtlZEhhc2hTZXQgc2V0ID0gbmV3IExpbmtlZEhhc2hTZXQoc3VwZXIuc2l6ZSgpKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBzdXBlci5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoIGkuaGFzTmV4dCgpICkgeworICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSlpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBNYXBFbnRyeSBlbnRyeSA9IChNYXBFbnRyeSllLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKCBlbnRyeS5pc1ByaW1hcnkoKSApIHNldC5hZGQoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChzZXQpOworICAgICAgICB9CisgICAgCisgICAgCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIC8vdG9kbywgaW1wbGVtZW50IGEgY291bnRlciB2YXJpYWJsZSBpbnN0ZWFkCisgICAgICAgICAgICAvL29ubHkgY291bnQgYWN0aXZlIG1lbWJlcnMgaW4gdGhpcyBub2RlCisgICAgICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgICAgICAgICBPYmplY3RbXSBpdGVtcyA9IHN1cGVyLmVudHJ5U2V0KCkudG9BcnJheSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGl0ZW1zLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaXRlbXNbaV07CisgICAgICAgICAgICAgICAgaWYgKCBlICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIE1hcEVudHJ5IGVudHJ5ID0gKE1hcEVudHJ5KSBlLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5pc1ByaW1hcnkoKSAmJiBlbnRyeS5nZXRWYWx1ZSgpICE9IG51bGwpIGNvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY291bnRlcjsKKyAgICAgICAgfQorICAgIAorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShNYXAuRW50cnkgZWxkZXN0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBzaXplKCk9PTA7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgeworICAgICAgICAgICAgQXJyYXlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuc2l6ZSgpKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBzdXBlci5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoIGkuaGFzTmV4dCgpICkgeworICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSlpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBNYXBFbnRyeSBlbnRyeSA9IChNYXBFbnRyeSllLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKCBlbnRyeS5pc1ByaW1hcnkoKSAmJiBlbnRyeS5nZXRWYWx1ZSgpIT1udWxsKSB2YWx1ZXMuYWRkKGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24odmFsdWVzKTsKKyAgICAgICAgfQorICAgICAgICAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgIE1hcCBFbnRyeSBjbGFzcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcEVudHJ5IGltcGxlbWVudHMgTWFwLkVudHJ5IHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGJhY2t1cDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHByb3h5OworICAgICAgICBwcml2YXRlIE1lbWJlcltdIGJhY2t1cE5vZGVzOworCisgICAgICAgIHByaXZhdGUgT2JqZWN0IGtleTsKKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7CisKKyAgICAgICAgcHVibGljIE1hcEVudHJ5KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgICAgICAgICAgc2V0S2V5KGtleSk7CisgICAgICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNLZXlTZXJpYWxpemFibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gKGtleSA9PSBudWxsKSB8fCAoa2V5IGluc3RhbmNlb2YgU2VyaWFsaXphYmxlKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWYWx1ZVNlcmlhbGl6YWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAodmFsdWU9PW51bGwpIHx8ICh2YWx1ZSBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VyaWFsaXphYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIGlzS2V5U2VyaWFsaXphYmxlKCkgJiYgaXNWYWx1ZVNlcmlhbGl6YWJsZSgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0JhY2t1cCgpIHsKKyAgICAgICAgICAgIHJldHVybiBiYWNrdXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRCYWNrdXAoYm9vbGVhbiBiYWNrdXApIHsKKyAgICAgICAgICAgIHRoaXMuYmFja3VwID0gYmFja3VwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQcm94eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm94eTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiAoICghcHJveHkpICYmICghYmFja3VwKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm94eShib29sZWFuIHByb3h5KSB7CisgICAgICAgICAgICB0aGlzLnByb3h5ID0gcHJveHk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RpZmZhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIFJlcGxpY2F0ZWRNYXBFbnRyeSkgJiYKKyAgICAgICAgICAgICAgICAgICAoKFJlcGxpY2F0ZWRNYXBFbnRyeSl2YWx1ZSkuaXNEaWZmYWJsZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QmFja3VwTm9kZXMoTWVtYmVyW10gbm9kZXMpIHsKKyAgICAgICAgICAgIHRoaXMuYmFja3VwTm9kZXMgPSBub2RlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZW1iZXJbXSBnZXRCYWNrdXBOb2RlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBiYWNrdXBOb2RlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICAgICAgT2JqZWN0IG9sZCA9IHRoaXMudmFsdWU7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gKFNlcmlhbGl6YWJsZSkgdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gb2xkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4ga2V5OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgT2JqZWN0IHNldEtleShPYmplY3Qga2V5KSB7CisgICAgICAgICAgICBPYmplY3Qgb2xkID0gdGhpcy5rZXk7CisgICAgICAgICAgICB0aGlzLmtleSA9IChTZXJpYWxpemFibGUpa2V5OworICAgICAgICAgICAgcmV0dXJuIG9sZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4ga2V5Lmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiBrZXkuZXF1YWxzKG8pOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGFwcGx5IGEgZGlmZiwgb3IgYW4gZW50aXJlIG9iamVjdAorICAgICAgICAgKiBAcGFyYW0gZGF0YSBieXRlW10KKyAgICAgICAgICogQHBhcmFtIG9mZnNldCBpbnQKKyAgICAgICAgICogQHBhcmFtIGxlbmd0aCBpbnQKKyAgICAgICAgICogQHBhcmFtIGRpZmYgYm9vbGVhbgorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gZGlmZikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChpc0RpZmZhYmxlKCkgJiYgZGlmZikgeworICAgICAgICAgICAgICAgIFJlcGxpY2F0ZWRNYXBFbnRyeSByZW50cnkgPSAoUmVwbGljYXRlZE1hcEVudHJ5KSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZW50cnkubG9jaygpOworICAgICAgICAgICAgICAgICAgICByZW50cnkuYXBwbHlEaWZmKGRhdGEsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICByZW50cnkudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChsZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBwcm94eSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhbHVlID0gWEJ5dGVCdWZmZXIuZGVzZXJpYWxpemUoZGF0YSwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIk1hcEVudHJ5W2tleToiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZ2V0S2V5KCkpLmFwcGVuZCgiOyAiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoInZhbHVlOiIpLmFwcGVuZChnZXRWYWx1ZSgpKS5hcHBlbmQoIjsgIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJwcmltYXJ5OiIpLmFwcGVuZChpc1ByaW1hcnkoKSkuYXBwZW5kKCI7ICIpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiYmFja3VwOiIpLmFwcGVuZChpc0JhY2t1cCgpKS5hcHBlbmQoIjsgIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJwcm94eToiKS5hcHBlbmQoaXNQcm94eSgpKS5hcHBlbmQoIjtdIik7CisgICAgICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgIH0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgIG1hcCBtZXNzYWdlIHRvIHNlbmQgdG8gYW5kIGZyb20gb3RoZXIgbWFwcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFwTWVzc2FnZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19CQUNLVVAgPSAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUkVUUklFVkVfQkFDS1VQID0gMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST1hZID0gMzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JFTU9WRSA9IDQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19TVEFURSA9IDU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19TVEFSVCA9IDY7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19TVE9QID0gNzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0lOSVQgPSA4OworCisgICAgICAgIHByaXZhdGUgYnl0ZVtdIG1hcElkOworICAgICAgICBwcml2YXRlIGludCBtc2d0eXBlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZGlmZjsKKyAgICAgICAgcHJpdmF0ZSB0cmFuc2llbnQgU2VyaWFsaXphYmxlIGtleTsKKyAgICAgICAgcHJpdmF0ZSB0cmFuc2llbnQgU2VyaWFsaXphYmxlIHZhbHVlOworICAgICAgICBwcml2YXRlIGJ5dGVbXSB2YWx1ZWRhdGE7CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGtleWRhdGE7CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGRpZmZ2YWx1ZTsKKyAgICAgICAgcHJpdmF0ZSBNZW1iZXJbXSBub2RlczsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiTWFwTWVzc2FnZVtjb250ZXh0PSIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChuZXcgU3RyaW5nKG1hcElkKSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCI7IHR5cGU9Iik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGdldFR5cGVEZXNjKCkpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiOyBrZXk9Iik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGtleSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCI7IHZhbHVlPSIpOworICAgICAgICAgICAgYnVmLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZURlc2MoKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZ3R5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19CQUNLVVA6IHJldHVybiAiTVNHX0JBQ0tVUCI7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUkVUUklFVkVfQkFDS1VQOiByZXR1cm4gIk1TR19SRVRSSUVWRV9CQUNLVVAiOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST1hZOiByZXR1cm4gIk1TR19QUk9YWSI7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUkVNT1ZFOiByZXR1cm4gIk1TR19SRU1PVkUiOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NUQVRFOiByZXR1cm4gIk1TR19TVEFURSI7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU1RBUlQ6IHJldHVybiAiTVNHX1NUQVJUIjsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TVE9QOiByZXR1cm4gIk1TR19TVE9QIjsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19JTklUOiByZXR1cm4gIk1TR19JTklUIjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDogcmV0dXJuICJVTktOT1dOIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNYXBNZXNzYWdlKCkge30KKworICAgICAgICBwdWJsaWMgTWFwTWVzc2FnZShieXRlW10gbWFwSWQsaW50IG1zZ3R5cGUsIGJvb2xlYW4gZGlmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphYmxlIGtleSwgU2VyaWFsaXphYmxlIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gZGlmZnZhbHVlLCBNZW1iZXJbXSBub2RlcykgIHsKKyAgICAgICAgICAgIHRoaXMubWFwSWQgPSBtYXBJZDsKKyAgICAgICAgICAgIHRoaXMubXNndHlwZSA9IG1zZ3R5cGU7CisgICAgICAgICAgICB0aGlzLmRpZmYgPSBkaWZmOworICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB0aGlzLmRpZmZ2YWx1ZSA9IGRpZmZ2YWx1ZTsKKyAgICAgICAgICAgIHRoaXMubm9kZXMgPSBub2RlczsKKyAgICAgICAgICAgIHNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgICAgIHNldEtleShrZXkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZShDbGFzc0xvYWRlcltdIGNscykgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGtleShjbHMpOworICAgICAgICAgICAgdmFsdWUoY2xzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TXNnVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtc2d0eXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEaWZmKCkgeworICAgICAgICAgICAgcmV0dXJuIGRpZmY7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2VyaWFsaXphYmxlIGdldEtleSgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGtleShudWxsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkRlc2VyaWFsaXphdGlvbiBlcnJvciBvZiB0aGUgTWFwTWVzc2FnZS5rZXkiLHgpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNlcmlhbGl6YWJsZSBrZXkoQ2xhc3NMb2FkZXJbXSBjbHMpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoIGtleSE9bnVsbCApIHJldHVybiBrZXk7CisgICAgICAgICAgICBpZiAoIGtleWRhdGEgPT0gbnVsbCB8fCBrZXlkYXRhLmxlbmd0aCA9PSAwICkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBrZXkgPSBYQnl0ZUJ1ZmZlci5kZXNlcmlhbGl6ZShrZXlkYXRhLDAsa2V5ZGF0YS5sZW5ndGgsY2xzKTsKKyAgICAgICAgICAgIGtleWRhdGEgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRLZXlEYXRhKCkgeworICAgICAgICAgICAgcmV0dXJuIGtleWRhdGE7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTZXJpYWxpemFibGUgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZShudWxsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkRlc2VyaWFsaXphdGlvbiBlcnJvciBvZiB0aGUgTWFwTWVzc2FnZS52YWx1ZSIseCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2VyaWFsaXphYmxlIHZhbHVlKENsYXNzTG9hZGVyW10gY2xzKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gIHsKKyAgICAgICAgICAgIGlmICggdmFsdWUhPW51bGwgKSByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICBpZiAoIHZhbHVlZGF0YSA9PSBudWxsIHx8IHZhbHVlZGF0YS5sZW5ndGggPT0gMCApIHJldHVybiBudWxsOworICAgICAgICAgICAgdmFsdWUgPSBYQnl0ZUJ1ZmZlci5kZXNlcmlhbGl6ZSh2YWx1ZWRhdGEsMCx2YWx1ZWRhdGEubGVuZ3RoLGNscyk7CisgICAgICAgICAgICB2YWx1ZWRhdGEgPSBudWxsOzsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRWYWx1ZURhdGEoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWVkYXRhOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXREaWZmVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gZGlmZnZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lbWJlcltdIGdldEJhY2t1cE5vZGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5vZGVzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNldEJhY2tVcE5vZGVzKE1lbWJlcltdIG5vZGVzKSB7CisgICAgICAgICAgICB0aGlzLm5vZGVzID0gbm9kZXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldE1hcElkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1hcElkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU2VyaWFsaXphYmxlIHZhbHVlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICggdmFsdWUgIT0gbnVsbCApIHZhbHVlZGF0YSA9IFhCeXRlQnVmZmVyLnNlcmlhbGl6ZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgfWNhdGNoICggSU9FeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgc2V0S2V5KFNlcmlhbGl6YWJsZSBrZXkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSBrZXlkYXRhID0gWEJ5dGVCdWZmZXIuc2VyaWFsaXplKGtleSk7CisgICAgICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCBNZW1iZXJbXSByZWFkTWVtYmVycyhPYmplY3RJbnB1dCBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCBub2RlY291bnQgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICBNZW1iZXJbXSBtZW1iZXJzID0gbmV3IE1lbWJlcltub2RlY291bnRdOworICAgICAgICAgICAgZm9yICggaW50IGk9MDsgaTxtZW1iZXJzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBkID0gbmV3IGJ5dGVbaW4ucmVhZEludCgpXTsKKyAgICAgICAgICAgICAgICBpbi5yZWFkKGQpOworICAgICAgICAgICAgICAgIGlmIChkLmxlbmd0aCA+IDApIG1lbWJlcnNbaV0gPSBNZW1iZXJJbXBsLmdldE1lbWJlcihkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtZW1iZXJzOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZU1lbWJlcnMoT2JqZWN0T3V0cHV0IG91dCxNZW1iZXJbXSBtZW1iZXJzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKCBtZW1iZXJzID09IG51bGwgKSBtZW1iZXJzID0gbmV3IE1lbWJlclswXTsKKyAgICAgICAgICAgIG91dC53cml0ZUludChtZW1iZXJzLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bWVtYmVycy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIG1lbWJlcnNbaV0gIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGQgPSBtZW1iZXJzW2ldICE9IG51bGwgPyAoIChNZW1iZXJJbXBsKW1lbWJlcnNbaV0pLmdldERhdGEoZmFsc2UpIDogbmV3IGJ5dGVbMF07CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUludChkLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogc2hhbGxvdyBjbG9uZQorICAgICAgICAgKiBAcmV0dXJuIE9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKyAgICAgICAgICAgIE1hcE1lc3NhZ2UgbXNnID0gbmV3IE1hcE1lc3NhZ2UodGhpcy5tYXBJZCwgdGhpcy5tc2d0eXBlLCB0aGlzLmRpZmYsIHRoaXMua2V5LCB0aGlzLnZhbHVlLCB0aGlzLmRpZmZ2YWx1ZSwgdGhpcy5ub2Rlcyk7CisgICAgICAgICAgICBtc2cua2V5ZGF0YSA9IHRoaXMua2V5ZGF0YTsKKyAgICAgICAgICAgIG1zZy52YWx1ZWRhdGEgPSB0aGlzLnZhbHVlZGF0YTsKKyAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgIH0KKyAgICB9IC8vTWFwTWVzc2FnZQorCisKKyAgICBwdWJsaWMgQ2hhbm5lbCBnZXRDaGFubmVsKCkgeworICAgICAgICByZXR1cm4gY2hhbm5lbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldE1hcENvbnRleHROYW1lKCkgeworICAgICAgICByZXR1cm4gbWFwQ29udGV4dE5hbWU7CisgICAgfQorCisgICAgcHVibGljIFJwY0NoYW5uZWwgZ2V0UnBjQ2hhbm5lbCgpIHsKKyAgICAgICAgcmV0dXJuIHJwY0NoYW5uZWw7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0UnBjVGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIHJwY1RpbWVvdXQ7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRTdGF0ZU11dGV4KCkgeworICAgICAgICByZXR1cm4gc3RhdGVNdXRleDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRlVHJhbnNmZXJyZWQoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZVRyYW5zZmVycmVkOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0TWFwT3duZXIoKSB7CisgICAgICAgIHJldHVybiBtYXBPd25lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXJbXSBnZXRFeHRlcm5hbExvYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBleHRlcm5hbExvYWRlcnM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDaGFubmVsU2VuZE9wdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBjaGFubmVsU2VuZE9wdGlvbnM7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0QWNjZXNzVGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIGFjY2Vzc1RpbWVvdXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWFwT3duZXIoT2JqZWN0IG1hcE93bmVyKSB7CisgICAgICAgIHRoaXMubWFwT3duZXIgPSBtYXBPd25lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbExvYWRlcnMoQ2xhc3NMb2FkZXJbXSBleHRlcm5hbExvYWRlcnMpIHsKKyAgICAgICAgdGhpcy5leHRlcm5hbExvYWRlcnMgPSBleHRlcm5hbExvYWRlcnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hhbm5lbFNlbmRPcHRpb25zKGludCBjaGFubmVsU2VuZE9wdGlvbnMpIHsKKyAgICAgICAgdGhpcy5jaGFubmVsU2VuZE9wdGlvbnMgPSBjaGFubmVsU2VuZE9wdGlvbnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWNjZXNzVGltZW91dChsb25nIGFjY2Vzc1RpbWVvdXQpIHsKKyAgICAgICAgdGhpcy5hY2Nlc3NUaW1lb3V0ID0gYWNjZXNzVGltZW91dDsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGlwaXMvTGF6eVJlcGxpY2F0ZWRNYXAuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90aXBpcy9MYXp5UmVwbGljYXRlZE1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZjI3ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGlwaXMvTGF6eVJlcGxpY2F0ZWRNYXAuamF2YQpAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50aXBpczsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyc2hpcExpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLlJwY0NhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnV0aWwuQXJyYXlzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLlVuaXF1ZUlkOworCisvKioKKyAqIEEgc21hcnQgaW1wbGVtZW50YXRpb24gb2YgYSBzdGF0ZWZ1bCByZXBsaWNhdGVkIG1hcC4gdXNlcyBwcmltYXJ5L3NlY29uZGFyeSBiYWNrdXAgc3RyYXRlZ3kuIAorICogT25lIG5vZGUgaXMgYWx3YXlzIHRoZSBwcmltYXJ5IGFuZCBvbmUgbm9kZSBpcyBhbHdheXMgdGhlIGJhY2t1cC4KKyAqIFRoaXMgbWFwIGlzIHN5bmNocm9uaXplZCBhY3Jvc3MgYSBjbHVzdGVyLCBhbmQgb25seSBoYXMgb25lIGJhY2t1cCBtZW1iZXIuPGJyLz4KKyAqIEEgcGVyZmVjdCB1c2FnZSBmb3IgdGhpcyBtYXAgd291bGQgYmUgYSBzZXNzaW9uIG1hcCBmb3IgYSBzZXNzaW9uIG1hbmFnZXIgaW4gYSBjbHVzdGVyZWQgZW52aXJvbm1lbnQuPGJyLz4KKyAqIFRoZSBvbmx5IHdheSB0byBtb2RpZnkgdGhpcyBsaXN0IGlzIHRvIHVzZSB0aGUgPGNvZGU+cHV0LCBwdXRBbGwsIHJlbW92ZTwvY29kZT4gbWV0aG9kcy4KKyAqIGVudHJ5U2V0LCBlbnRyeVNldEZ1bGwsIGtleVNldCwga2V5U2V0RnVsbCwgcmV0dXJucyBhbGwgbm9uIG1vZGlmaWFibGUgc2V0cy48YnI+PGJyPgorICogSWYgb2JqZWN0cyAodmFsdWVzKSBpbiB0aGUgbWFwIGNoYW5nZSB3aXRob3V0IGludm9raW5nIDxjb2RlPnB1dCgpPC9jb2RlPiBvciA8Y29kZT5yZW1vdmUoKTwvY29kZT4KKyAqIHRoZSBkYXRhIGNhbiBiZSBkaXN0cmlidXRlZCB1c2luZyB0d28gZGlmZmVyZW50IG1ldGhvZHM6PGJyPgorICogPGNvZGU+cmVwbGljYXRlKGJvb2xlYW4pPC9jb2RlPiBhbmQgPGNvZGU+cmVwbGljYXRlKE9iamVjdCwgYm9vbGVhbik8L2NvZGU+PGJyPgorICogVGhlc2UgdHdvIG1ldGhvZHMgYXJlIHZlcnkgaW1wb3J0YW50IHR3byB1bmRlcnN0YW5kLiBUaGUgbWFwIGNhbiB3b3JrIHdpdGggdHdvIHNldCBvZiB2YWx1ZSBvYmplY3RzOjxicj4KKyAqIDEuIFNlcmlhbGl6YWJsZSAtIHRoZSBlbnRpcmUgb2JqZWN0IGdldHMgc2VyaWFsaXplZCBlYWNoIHRpbWUgaXQgaXMgcmVwbGljYXRlZDxicj4KKyAqIDIuIFJlcGxpY2F0ZWRNYXBFbnRyeSAtIHRoaXMgaW50ZXJmYWNlIGFsbG93cyBmb3IgYSBpc0RpcnR5KCkgZmxhZyBhbmQgdG8gcmVwbGljYXRlIGRpZmZzIGlmIGRlc2lyZWQuPGJyPgorICogSW1wbGVtZW50aW5nIHRoZSA8Y29kZT5SZXBsaWNhdGVkTWFwRW50cnk8L2NvZGU+IGludGVyZmFjZSBhbGxvd3MgeW91IHRvIGRlY2lkZSB3aGF0IG9iamVjdHMgCisgKiBnZXQgcmVwbGljYXRlZCBhbmQgaG93IG11Y2ggZGF0YSBnZXRzIHJlcGxpY2F0ZWQgZWFjaCB0aW1lLjxicj4KKyAqIElmIHlvdSBpbXBsZW1lbnQgYSBzbWFydCBBT1AgbWVjaGFuaXNtIHRvIGRldGVjdCBjaGFuZ2VzIGluIHVuZGVybHlpbmcgb2JqZWN0cywgeW91IGNhbiByZXBsaWNhdGUKKyAqIG9ubHkgdGhvc2UgY2hhbmdlcyBieSBpbXBsZW1lbnRpbmcgdGhlIFJlcGxpY2F0ZWRNYXBFbnRyeSBpbnRlcmZhY2UsIGFuZCByZXR1cm4gdHJ1ZSB3aGVuIGlzRGlmZmFibGUoKQorICogaXMgaW52b2tlZC48YnI+PGJyPgorICogCisgKiBUaGlzIG1hcCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGhhdmUgYSBiYWNrZ3JvdW5kIHRocmVhZCBydW5uaW5nIHRvIHJlcGxpY2F0ZSBjaGFuZ2VzLgorICogSWYgeW91IGRvIGhhdmUgY2hhbmdlcyB3aXRob3V0IGludm9raW5nIHB1dC9yZW1vdmUgdGhlbiB5b3UgbmVlZCB0byBpbnZva2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKyAqIDx1bD4KKyAqIDxsaT48Y29kZT5yZXBsaWNhdGUoT2JqZWN0LGJvb2xlYW4pPC9jb2RlPiAtIHJlcGxpY2F0ZXMgb25seSB0aGUgb2JqZWN0IHRoYXQgYmVsb25ncyB0byB0aGUga2V5PC9saT4KKyAqIDxsaT48Y29kZT5yZXBsaWNhdGUoYm9vbGVhbik8L2NvZGU+IC0gU2NhbnMgdGhlIGVudGlyZSBtYXAgZm9yIGNoYW5nZXMgYW5kIHJlcGxpY2F0ZXMgZGF0YTwvbGk+CisgKiAgPC91bD4KKyAqIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpbiB0aGUgPGNvZGU+cmVwbGljYXRlPC9jb2RlPiBtZXRob2QgdXNlZCB0byBkZWNpZGUgCisgKiB3aGV0aGVyIHRvIG9ubHkgcmVwbGljYXRlIG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhlIDxjb2RlPlJlcGxpY2F0ZWRNYXBFbnRyeTwvY29kZT4gaW50ZXJmYWNlCisgKiBvciB0byByZXBsaWNhdGUgYWxsIG9iamVjdHMuIElmIGFuIG9iamVjdCBkb2Vzbid0IGltcGxlbWVudCB0aGUgPGNvZGU+UmVwbGljYXRlZE1hcEVudHJ5PC9jb2RlPiBpbnRlcmZhY2UKKyAqIGVhY2ggdGltZSB0aGUgb2JqZWN0IGdldHMgcmVwbGljYXRlZCB0aGUgZW50aXJlIG9iamVjdCBnZXRzIHNlcmlhbGl6ZWQsIGhlbmNlIGEgY2FsbCB0byA8Y29kZT5yZXBsaWNhdGUodHJ1ZSk8L2NvZGU+CisgKiB3aWxsIHJlcGxpY2F0ZSBhbGwgb2JqZWN0cyBpbiB0aGlzIG1hcCB0aGF0IGFyZSB1c2luZyB0aGlzIG5vZGUgYXMgcHJpbWFyeS4KKyAqIAorICogPGJyPjxicj48Yj5SRU1CRVIgVE8gQ0FMTCA8Y29kZT5icmVha2Rvd24oKTwvY29kZT4gb3IgPGNvZGU+ZmluYWxpemUoKTwvY29kZT4gd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGUgbWFwIHRvIAorICogYXZvaWQgbWVtb3J5IGxlYWtzLjxicj48YnI+CisgKiBAdG9kbyBpbXBsZW1lbnQgcGVyaW9kaWMgc3luYy90cmFuc2ZlciB0aHJlYWQKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgTGF6eVJlcGxpY2F0ZWRNYXAgZXh0ZW5kcyBBYnN0cmFjdFJlcGxpY2F0ZWRNYXAgCisgICAgaW1wbGVtZW50cyBScGNDYWxsYmFjaywgQ2hhbm5lbExpc3RlbmVyLCBNZW1iZXJzaGlwTGlzdGVuZXIgeworICAgIHByb3RlY3RlZCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKExhenlSZXBsaWNhdGVkTWFwLmNsYXNzKTsKKyAgICAKKyAgICAKKyAgICAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIAorLy8gICAgICAgICAgICAgIENPTlNUUlVDVE9SUyAvIERFU1RSVUNUT1JTCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIAorICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IG1hcAorICAgICAgICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCB0byB1c2UgZm9yIGNvbW11bmljYXRpb24KKyAgICAgICAgICogQHBhcmFtIHRpbWVvdXQgbG9uZyAtIHRpbWVvdXQgZm9yIFJQQyBtZXNzYWdzCisgICAgICAgICAqIEBwYXJhbSBtYXBDb250ZXh0TmFtZSBTdHJpbmcgLSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBtYXAsIHRvIGFsbG93IG11bHRpcGxlIG1hcHMgcGVyIGNoYW5uZWwKKyAgICAgICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSBpbnQgLSB0aGUgc2l6ZSBvZiB0aGlzIG1hcCwgc2VlIEhhc2hNYXAKKyAgICAgICAgICogQHBhcmFtIGxvYWRGYWN0b3IgZmxvYXQgLSBsb2FkIGZhY3Rvciwgc2VlIEhhc2hNYXAKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMYXp5UmVwbGljYXRlZE1hcChPYmplY3Qgb3duZXIsIENoYW5uZWwgY2hhbm5lbCwgbG9uZyB0aW1lb3V0LCBTdHJpbmcgbWFwQ29udGV4dE5hbWUsIGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IsIENsYXNzTG9hZGVyW10gY2xzKSB7CisgICAgICAgICAgICBzdXBlcihvd25lcixjaGFubmVsLHRpbWVvdXQsbWFwQ29udGV4dE5hbWUsaW5pdGlhbENhcGFjaXR5LGxvYWRGYWN0b3IsIENoYW5uZWwuU0VORF9PUFRJT05TX0RFRkFVTFQsY2xzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IG1hcAorICAgICAgICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCB0byB1c2UgZm9yIGNvbW11bmljYXRpb24KKyAgICAgICAgICogQHBhcmFtIHRpbWVvdXQgbG9uZyAtIHRpbWVvdXQgZm9yIFJQQyBtZXNzYWdzCisgICAgICAgICAqIEBwYXJhbSBtYXBDb250ZXh0TmFtZSBTdHJpbmcgLSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBtYXAsIHRvIGFsbG93IG11bHRpcGxlIG1hcHMgcGVyIGNoYW5uZWwKKyAgICAgICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSBpbnQgLSB0aGUgc2l6ZSBvZiB0aGlzIG1hcCwgc2VlIEhhc2hNYXAKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMYXp5UmVwbGljYXRlZE1hcChPYmplY3Qgb3duZXIsIENoYW5uZWwgY2hhbm5lbCwgbG9uZyB0aW1lb3V0LCBTdHJpbmcgbWFwQ29udGV4dE5hbWUsIGludCBpbml0aWFsQ2FwYWNpdHksIENsYXNzTG9hZGVyW10gY2xzKSB7CisgICAgICAgICAgICBzdXBlcihvd25lciwgY2hhbm5lbCx0aW1lb3V0LG1hcENvbnRleHROYW1lLGluaXRpYWxDYXBhY2l0eSwgTGF6eVJlcGxpY2F0ZWRNYXAuREVGQVVMVF9MT0FEX0ZBQ1RPUiwgQ2hhbm5lbC5TRU5EX09QVElPTlNfREVGQVVMVCwgY2xzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IG1hcAorICAgICAgICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCB0byB1c2UgZm9yIGNvbW11bmljYXRpb24KKyAgICAgICAgICogQHBhcmFtIHRpbWVvdXQgbG9uZyAtIHRpbWVvdXQgZm9yIFJQQyBtZXNzYWdzCisgICAgICAgICAqIEBwYXJhbSBtYXBDb250ZXh0TmFtZSBTdHJpbmcgLSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBtYXAsIHRvIGFsbG93IG11bHRpcGxlIG1hcHMgcGVyIGNoYW5uZWwKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMYXp5UmVwbGljYXRlZE1hcChPYmplY3Qgb3duZXIsIENoYW5uZWwgY2hhbm5lbCwgbG9uZyB0aW1lb3V0LCBTdHJpbmcgbWFwQ29udGV4dE5hbWUsIENsYXNzTG9hZGVyW10gY2xzKSB7CisgICAgICAgICAgICBzdXBlcihvd25lciwgY2hhbm5lbCx0aW1lb3V0LG1hcENvbnRleHROYW1lLCBMYXp5UmVwbGljYXRlZE1hcC5ERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFksTGF6eVJlcGxpY2F0ZWRNYXAuREVGQVVMVF9MT0FEX0ZBQ1RPUixDaGFubmVsLlNFTkRfT1BUSU9OU19ERUZBVUxULCBjbHMpOworICAgICAgICB9CisKKworCisKKyAgICAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIAorLy8gICAgICAgICAgICAgIE1FVEhPRFMgVE8gT1ZFUlJJREUgICAgCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8qKgorICAgICAqIHB1Ymxpc2ggaW5mbyBhYm91dCBhIG1hcCBwYWlyIChrZXkvdmFsdWUpIHRvIG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyCisgICAgICogQHBhcmFtIGtleSBPYmplY3QKKyAgICAgKiBAcGFyYW0gdmFsdWUgT2JqZWN0CisgICAgICogQHJldHVybiBNZW1iZXIgLSB0aGUgYmFja3VwIG5vZGUKKyAgICAgKiBAdGhyb3dzIENoYW5uZWxFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWVtYmVyW10gcHVibGlzaEVudHJ5SW5mbyhPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHRocm93cyBDaGFubmVsRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgICghIChrZXkgaW5zdGFuY2VvZiBTZXJpYWxpemFibGUgJiYgdmFsdWUgaW5zdGFuY2VvZiBTZXJpYWxpemFibGUpICApIHJldHVybiBuZXcgTWVtYmVyWzBdOworICAgICAgICBNZW1iZXJbXSBtZW1iZXJzID0gZ2V0TWFwTWVtYmVycygpOworICAgICAgICBpbnQgZmlyc3RJZHggPSBnZXROZXh0QmFja3VwSW5kZXgoKTsKKyAgICAgICAgaW50IG5leHRJZHggPSBmaXJzdElkeDsKKyAgICAgICAgTWVtYmVyW10gYmFja3VwID0gbmV3IE1lbWJlclswXTsKKyAgICAgICAgCisgICAgICAgIC8vdGhlcmUgYXJlIG5vIGJhY2t1cHMKKyAgICAgICAgaWYgKCBtZW1iZXJzLmxlbmd0aCA9PSAwIHx8IGZpcnN0SWR4ID09IC0xICkgcmV0dXJuIGJhY2t1cDsKKyAgICAgICAgCisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOworICAgICAgICBkbyB7CisgICAgICAgICAgICAvL3NlbGVjdCBhIGJhY2t1cCBub2RlCisgICAgICAgICAgICBNZW1iZXIgbmV4dCA9IG1lbWJlcnNbZmlyc3RJZHhdOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL2luY3JlbWVudCBmb3IgdGhlIG5leHQgcm91bmQgb2YgYmFjayB1cCBzZWxlY3Rpb24KKyAgICAgICAgICAgIG5leHRJZHggPSBmaXJzdElkeCArIDE7CisgICAgICAgICAgICBpZiAoIG5leHRJZHggPj0gbWVtYmVycy5sZW5ndGggKSBuZXh0SWR4ID0gMDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKG5leHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWFwTWVzc2FnZSBtc2cgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiYWNrdXAgPSB3cmFwKG5leHQpOworICAgICAgICAgICAgICAgIC8vcHVibGlzaCB0aGUgYmFja3VwIGRhdGEgdG8gb25lIG5vZGUKKyAgICAgICAgICAgICAgICBtc2cgPSBuZXcgTWFwTWVzc2FnZShnZXRNYXBDb250ZXh0TmFtZSgpLCBNYXBNZXNzYWdlLk1TR19CQUNLVVAsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTZXJpYWxpemFibGUpIGtleSwgKFNlcmlhbGl6YWJsZSkgdmFsdWUsIG51bGwsIGJhY2t1cCk7CisgICAgICAgICAgICAgICAgaWYgKCBsb2cuaXNUcmFjZUVuYWJsZWQoKSApIAorICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIlB1Ymxpc2hpbmcgYmFja3VwIGRhdGE6Iittc2crIiB0bzogIituZXh0LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgVW5pcXVlSWQgaWQgPSBnZXRDaGFubmVsKCkuc2VuZChiYWNrdXAsIG1zZywgZ2V0Q2hhbm5lbFNlbmRPcHRpb25zKCkpOworICAgICAgICAgICAgICAgIGlmICggbG9nLmlzVHJhY2VFbmFibGVkKCkgKQorICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIkRhdGEgcHVibGlzaGVkOiIrbXNnKyIgbXNnIElkOiIraWQpOworICAgICAgICAgICAgICAgIC8vd2UgcHVibGlzaGVkIG91dCB0byBhIGJhY2t1cCwgbWFyayB0aGUgdGVzdCBzdWNjZXNzCisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICB9Y2F0Y2ggKCBDaGFubmVsRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gcmVwbGljYXRlIGJhY2t1cCBrZXk6IitrZXkrIiB0byBiYWNrdXA6IituZXh0KyIuIFJlYXNvbjoiK3guZ2V0TWVzc2FnZSgpLHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvL3B1Ymxpc2ggdGhlIGRhdGEgb3V0IHRvIGFsbCBub2RlcworICAgICAgICAgICAgICAgIE1lbWJlcltdIHByb3hpZXMgPSBleGNsdWRlRnJvbVNldChiYWNrdXAsIGdldE1hcE1lbWJlcnMoKSk7CisgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MgJiYgcHJveGllcy5sZW5ndGggPiAwICkgeworICAgICAgICAgICAgICAgICAgICBtc2cgPSBuZXcgTWFwTWVzc2FnZShnZXRNYXBDb250ZXh0TmFtZSgpLCBNYXBNZXNzYWdlLk1TR19QUk9YWSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTZXJpYWxpemFibGUpIGtleSwgbnVsbCwgbnVsbCwgYmFja3VwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBsb2cuaXNUcmFjZUVuYWJsZWQoKSApIAorICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIlB1Ymxpc2hpbmcgcHJveHkgZGF0YToiK21zZysiIHRvOiAiK0FycmF5cy50b05hbWVTdHJpbmcocHJveGllcykpOworICAgICAgICAgICAgICAgICAgICBnZXRDaGFubmVsKCkuc2VuZChwcm94aWVzLCBtc2csIGdldENoYW5uZWxTZW5kT3B0aW9ucygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Y2F0Y2ggICggQ2hhbm5lbEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgICAgIC8vbG9nIHRoZSBlcnJvciwgYnV0IHByb2NlZWQsIHRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIGEgbm9kZSB3ZW50IGRvd24sCisgICAgICAgICAgICAgICAgLy9hbmQgaWYgdGhlIG5vZGUgd2VudCBkb3duLCB0aGVuIGl0IGNhbid0IHJlY2VpdmUgdGhlIG1lc3NhZ2UsIHRoZSBvdGhlcnMKKyAgICAgICAgICAgICAgICAvL3Nob3VsZCBzdGlsbCBnZXQgaXQuCisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gcmVwbGljYXRlIHByb3h5IGtleToiK2tleSsiIHRvIGJhY2t1cDoiK25leHQrIi4gUmVhc29uOiIreC5nZXRNZXNzYWdlKCkseCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKCAhc3VjY2VzcyAmJiAoZmlyc3RJZHghPW5leHRJZHgpKTsKKyAgICAgICAgcmV0dXJuIGJhY2t1cDsKKyAgICB9CisgICAgCisgICAgCisKKworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RpcGlzL1JlcGxpY2F0ZWRNYXAuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90aXBpcy9SZXBsaWNhdGVkTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgwMzE0MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90aXBpcy9SZXBsaWNhdGVkTWFwLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudGlwaXM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcnNoaXBMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5ScGNDYWxsYmFjazsKKworLyoqCisgKiBBbGwtdG8tYWxsIHJlcGxpY2F0aW9uIGZvciBhIGhhc2ggbWFwIGltcGxlbWVudGF0aW9uLiBFYWNoIG5vZGUgaW4gdGhlIGNsdXN0ZXIgd2lsbCBjYXJyeSBhbiBpZGVudGljYWwgCisgKiBjb3B5IG9mIHRoZSBtYXAuPGJyPjxicj4KKyAqIFRoaXMgbWFwIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgaGF2ZSBhIGJhY2tncm91bmQgdGhyZWFkIHJ1bm5pbmcgdG8gcmVwbGljYXRlIGNoYW5nZXMuCisgKiBJZiB5b3UgZG8gaGF2ZSBjaGFuZ2VzIHdpdGhvdXQgaW52b2tpbmcgcHV0L3JlbW92ZSB0aGVuIHlvdSBuZWVkIHRvIGludm9rZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorICogPHVsPgorICogPGxpPjxjb2RlPnJlcGxpY2F0ZShPYmplY3QsYm9vbGVhbik8L2NvZGU+IC0gcmVwbGljYXRlcyBvbmx5IHRoZSBvYmplY3QgdGhhdCBiZWxvbmdzIHRvIHRoZSBrZXk8L2xpPgorICogPGxpPjxjb2RlPnJlcGxpY2F0ZShib29sZWFuKTwvY29kZT4gLSBTY2FucyB0aGUgZW50aXJlIG1hcCBmb3IgY2hhbmdlcyBhbmQgcmVwbGljYXRlcyBkYXRhPC9saT4KKyAqICA8L3VsPgorICogdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGluIHRoZSA8Y29kZT5yZXBsaWNhdGU8L2NvZGU+IG1ldGhvZCB1c2VkIHRvIGRlY2lkZQorICogd2hldGhlciB0byBvbmx5IHJlcGxpY2F0ZSBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoZSA8Y29kZT5SZXBsaWNhdGVkTWFwRW50cnk8L2NvZGU+IGludGVyZmFjZQorICogb3IgdG8gcmVwbGljYXRlIGFsbCBvYmplY3RzLiBJZiBhbiBvYmplY3QgZG9lc24ndCBpbXBsZW1lbnQgdGhlIDxjb2RlPlJlcGxpY2F0ZWRNYXBFbnRyeTwvY29kZT4gaW50ZXJmYWNlCisgKiBlYWNoIHRpbWUgdGhlIG9iamVjdCBnZXRzIHJlcGxpY2F0ZWQgdGhlIGVudGlyZSBvYmplY3QgZ2V0cyBzZXJpYWxpemVkLCBoZW5jZSBhIGNhbGwgdG8gPGNvZGU+cmVwbGljYXRlKHRydWUpPC9jb2RlPgorICogd2lsbCByZXBsaWNhdGUgYWxsIG9iamVjdHMgaW4gdGhpcyBtYXAgdGhhdCBhcmUgdXNpbmcgdGhpcyBub2RlIGFzIHByaW1hcnkuCisgKgorICogPGJyPjxicj48Yj5SRU1CRVIgVE8gQ0FMTCA8Y29kZT5icmVha2Rvd24oKTwvY29kZT4gb3IgPGNvZGU+ZmluYWxpemUoKTwvY29kZT4gd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGUgbWFwIHRvCisgKiBhdm9pZCBtZW1vcnkgbGVha3MuPGJyPjxicj4KKyAqIEB0b2RvIGltcGxlbWVudCBwZXJpb2RpYyBzeW5jL3RyYW5zZmVyIHRocmVhZAorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gMS4wCisgKiAKKyAqIEB0b2RvIG1lbWJlckRpc2FwcGVhcmVkLCBzaG91bGQgZG8gbm90aGluZyBleGNlcHQgY2hhbmdlIG1hcCBtZW1iZXJzaGlwCisgKiAgICAgICBieSBkZWZhdWx0IGl0IHJlbG9jYXRlcyB0aGUgcHJpbWFyeSBvYmplY3RzCisgKi8KK3B1YmxpYyBjbGFzcyBSZXBsaWNhdGVkTWFwIGV4dGVuZHMgQWJzdHJhY3RSZXBsaWNhdGVkTWFwIGltcGxlbWVudHMgUnBjQ2FsbGJhY2ssIENoYW5uZWxMaXN0ZW5lciwgTWVtYmVyc2hpcExpc3RlbmVyIHsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKFJlcGxpY2F0ZWRNYXAuY2xhc3MpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgIENPTlNUUlVDVE9SUyAvIERFU1RSVUNUT1JTCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgbWFwCisgICAgICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgdG8gdXNlIGZvciBjb21tdW5pY2F0aW9uCisgICAgICogQHBhcmFtIHRpbWVvdXQgbG9uZyAtIHRpbWVvdXQgZm9yIFJQQyBtZXNzYWdzCisgICAgICogQHBhcmFtIG1hcENvbnRleHROYW1lIFN0cmluZyAtIHVuaXF1ZSBuYW1lIGZvciB0aGlzIG1hcCwgdG8gYWxsb3cgbXVsdGlwbGUgbWFwcyBwZXIgY2hhbm5lbAorICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgaW50IC0gdGhlIHNpemUgb2YgdGhpcyBtYXAsIHNlZSBIYXNoTWFwCisgICAgICogQHBhcmFtIGxvYWRGYWN0b3IgZmxvYXQgLSBsb2FkIGZhY3Rvciwgc2VlIEhhc2hNYXAKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVwbGljYXRlZE1hcChPYmplY3Qgb3duZXIsIENoYW5uZWwgY2hhbm5lbCwgbG9uZyB0aW1lb3V0LCBTdHJpbmcgbWFwQ29udGV4dE5hbWUsIGludCBpbml0aWFsQ2FwYWNpdHksZmxvYXQgbG9hZEZhY3RvciwgQ2xhc3NMb2FkZXJbXSBjbHMpIHsKKyAgICAgICAgc3VwZXIob3duZXIsY2hhbm5lbCwgdGltZW91dCwgbWFwQ29udGV4dE5hbWUsIGluaXRpYWxDYXBhY2l0eSwgbG9hZEZhY3RvciwgQ2hhbm5lbC5TRU5EX09QVElPTlNfREVGQVVMVCwgY2xzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IG1hcAorICAgICAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIHRvIHVzZSBmb3IgY29tbXVuaWNhdGlvbgorICAgICAqIEBwYXJhbSB0aW1lb3V0IGxvbmcgLSB0aW1lb3V0IGZvciBSUEMgbWVzc2FncworICAgICAqIEBwYXJhbSBtYXBDb250ZXh0TmFtZSBTdHJpbmcgLSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBtYXAsIHRvIGFsbG93IG11bHRpcGxlIG1hcHMgcGVyIGNoYW5uZWwKKyAgICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IGludCAtIHRoZSBzaXplIG9mIHRoaXMgbWFwLCBzZWUgSGFzaE1hcAorICAgICAqLworICAgIHB1YmxpYyBSZXBsaWNhdGVkTWFwKE9iamVjdCBvd25lciwgQ2hhbm5lbCBjaGFubmVsLCBsb25nIHRpbWVvdXQsIFN0cmluZyBtYXBDb250ZXh0TmFtZSwgaW50IGluaXRpYWxDYXBhY2l0eSwgQ2xhc3NMb2FkZXJbXSBjbHMpIHsKKyAgICAgICAgc3VwZXIob3duZXIsY2hhbm5lbCwgdGltZW91dCwgbWFwQ29udGV4dE5hbWUsIGluaXRpYWxDYXBhY2l0eSwgQWJzdHJhY3RSZXBsaWNhdGVkTWFwLkRFRkFVTFRfTE9BRF9GQUNUT1IsQ2hhbm5lbC5TRU5EX09QVElPTlNfREVGQVVMVCwgY2xzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IG1hcAorICAgICAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIHRvIHVzZSBmb3IgY29tbXVuaWNhdGlvbgorICAgICAqIEBwYXJhbSB0aW1lb3V0IGxvbmcgLSB0aW1lb3V0IGZvciBSUEMgbWVzc2FncworICAgICAqIEBwYXJhbSBtYXBDb250ZXh0TmFtZSBTdHJpbmcgLSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBtYXAsIHRvIGFsbG93IG11bHRpcGxlIG1hcHMgcGVyIGNoYW5uZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVwbGljYXRlZE1hcChPYmplY3Qgb3duZXIsIENoYW5uZWwgY2hhbm5lbCwgbG9uZyB0aW1lb3V0LCBTdHJpbmcgbWFwQ29udGV4dE5hbWUsIENsYXNzTG9hZGVyW10gY2xzKSB7CisgICAgICAgIHN1cGVyKG93bmVyLCBjaGFubmVsLCB0aW1lb3V0LCBtYXBDb250ZXh0TmFtZSxBYnN0cmFjdFJlcGxpY2F0ZWRNYXAuREVGQVVMVF9JTklUSUFMX0NBUEFDSVRZLCBBYnN0cmFjdFJlcGxpY2F0ZWRNYXAuREVGQVVMVF9MT0FEX0ZBQ1RPUiwgQ2hhbm5lbC5TRU5EX09QVElPTlNfREVGQVVMVCwgY2xzKTsKKyAgICB9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgTUVUSE9EUyBUTyBPVkVSUklERQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvKioKKyAgICAgKiBwdWJsaXNoIGluZm8gYWJvdXQgYSBtYXAgcGFpciAoa2V5L3ZhbHVlKSB0byBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3RlcgorICAgICAqIEBwYXJhbSBrZXkgT2JqZWN0CisgICAgICogQHBhcmFtIHZhbHVlIE9iamVjdAorICAgICAqIEByZXR1cm4gTWVtYmVyIC0gdGhlIGJhY2t1cCBub2RlCisgICAgICogQHRocm93cyBDaGFubmVsRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIE1lbWJlcltdIHB1Ymxpc2hFbnRyeUluZm8oT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICAoISAoa2V5IGluc3RhbmNlb2YgU2VyaWFsaXphYmxlICYmIHZhbHVlIGluc3RhbmNlb2YgU2VyaWFsaXphYmxlKSAgKSByZXR1cm4gbmV3IE1lbWJlclswXTsKKyAgICAgICAgLy9zZWxlY3QgYSBiYWNrdXAgbm9kZQorICAgICAgICBNZW1iZXJbXSBiYWNrdXAgPSBnZXRNYXBNZW1iZXJzKCk7CisKKyAgICAgICAgaWYgKGJhY2t1cCA9PSBudWxsIHx8IGJhY2t1cC5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy9wdWJsaXNoIHRoZSBkYXRhIG91dCB0byBhbGwgbm9kZXMKKyAgICAgICAgTWFwTWVzc2FnZSBtc2cgPSBuZXcgTWFwTWVzc2FnZShnZXRNYXBDb250ZXh0TmFtZSgpLCBNYXBNZXNzYWdlLk1TR19CQUNLVVAsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTZXJpYWxpemFibGUpIGtleSwgbnVsbCwgbnVsbCwgYmFja3VwKTsKKworICAgICAgICBnZXRDaGFubmVsKCkuc2VuZChnZXRNYXBNZW1iZXJzKCksIG1zZywgZ2V0Q2hhbm5lbFNlbmRPcHRpb25zKCkpOworCisgICAgICAgIHJldHVybiBiYWNrdXA7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RpcGlzL1JlcGxpY2F0ZWRNYXBFbnRyeS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RpcGlzL1JlcGxpY2F0ZWRNYXBFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDA0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGlwaXMvUmVwbGljYXRlZE1hcEVudHJ5LmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudGlwaXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisvKioKKyAqIAorICogRm9yIHNtYXJ0ZXIgcmVwbGljYXRpb24sIGFuIG9iamVjdCBjYW4gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIHJlcGxpY2F0ZSBkaWZmczxicj4KKyAqIFRoZSByZXBsaWNhdGlvbiBsb2dpYyB3aWxsIGNhbGwgdGhlIG1ldGhvZHMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjo8YnI+CisgKiA8Y29kZT4KKyAqIDEuIGlmICggZW50cnkuaXNEaXJ0eSgpICkgPGJyPgorICogICAgICB0cnkgeworICogMi4gICAgIGVudHJ5LmxvY2soKTs8YnI+CisgKiAzLiAgICAgYnl0ZVtdIGRpZmYgPSBlbnRyeS5nZXREaWZmKCk7PGJyPgorICogNC4gICAgIGVudHJ5LnJlc2V0KCk7PGJyPgorICogICAgICB9IGZpbmFsbHkgezxicj4KKyAqIDUuICAgICBlbnRyeS51bmxvY2soKTs8YnI+CisgKiAgICAgIH08YnI+CisgKiAgICB9PGJyPgorICogPC9jb2RlPgorICogPGJyPgorICogPGJyPgorICogV2hlbiB0aGUgZGF0YSBpcyBkZXNlcmlhbGl6ZWQgdGhlIGxvZ2ljIGlzIGNhbGxlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyPGJyPgorICogPGNvZGU+CisgKiAxLiBSZXBsaWNhdGVkTWFwRW50cnkgZW50cnkgPSAoUmVwbGljYXRlZE1hcEVudHJ5KW9iamVjdEluLnJlYWRPYmplY3QoKTs8YnI+CisgKiAyLiBpZiAoIGlzQmFja3VwKGVudHJ5KXx8aXNQcmltYXJ5KGVudHJ5KSApIGVudHJ5LnNldE93bmVyKG93bmVyKTsgPGJyPgorICogPC9jb2RlPgorICogPGJyPgorICogCisgKiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlcGxpY2F0ZWRNYXBFbnRyeSBleHRlbmRzIFNlcmlhbGl6YWJsZSB7CisgICAgCisgICAgLyoqCisgICAgICogSGFzIHRoZSBvYmplY3QgY2hhbmdlZCBzaW5jZSBsYXN0IHJlcGxpY2F0aW9uCisgICAgICogYW5kIGlzIG5vdCBpbiBhIGxvY2tlZCBzdGF0ZQorICAgICAqIEByZXR1cm4gYm9vbGVhbgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgdGhlIG1hcCB3aWxsIGV4dHJhY3QgdGhlIGRpZmYgdXNpbmcgZ2V0RGlmZigpCisgICAgICogT3RoZXJ3aXNlIGl0IHdpbGwgc2VyaWFsaXplIHRoZSBlbnRpcmUgb2JqZWN0LgorICAgICAqIEByZXR1cm4gYm9vbGVhbgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGlmZmFibGUoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZGlmZiBhbmQgc2V0cyB0aGUgZGlydHkgbWFwIHRvIGZhbHNlCisgICAgICogQHJldHVybiBieXRlW10KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXREaWZmKCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEFwcGxpZXMgYSBkaWZmIHRvIGFuIGV4aXN0aW5nIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gZGlmZiBieXRlW10KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IGludAorICAgICAqIEBwYXJhbSBsZW5ndGggaW50CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFwcGx5RGlmZihieXRlW10gZGlmZiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uOworICAgIAorICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgY3VycmVudCBkaWZmIHN0YXRlIGFuZCByZXNldHMgdGhlIGRpcnR5IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldERpZmYoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBMb2NrIGR1cmluZyBzZXJpYWxpemF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9jaygpOworICAgIAorICAgIC8qKgorICAgICAqIFVubG9jayBhZnRlciBzZXJpYWxpemF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5sb2NrKCk7CisgICAgCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBvYmplY3QgaGFzIGJlZW4gCisgICAgICogY3JlYXRlZCBvbiBhIHJlbW90ZSBtYXAuIE9uIHRoaXMgbWV0aG9kLAorICAgICAqIHRoZSBvYmplY3QgY2FuIGluaXRpYWxpemUgaXRzZWxmIGZvciBhbnkgZGF0YSB0aGF0IHdhc24ndCAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3duZXIgT2JqZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3duZXIoT2JqZWN0IG93bmVyKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBGb3IgYWNjdXJhY3kgY2hlY2tpbmcsIGEgc2VyaWFsaXplZCBhdHRyaWJ1dGUgY2FuIGNvbnRhaW4gYSB2ZXJzaW9uIG51bWJlcgorICAgICAqIFRoaXMgbnVtYmVyIGluY3JlYXNlcyBhcyBtb2RpZmljYXRpb25zIGFyZSBtYWRlIHRvIHRoZSBkYXRhLgorICAgICAqIFRoZSByZXBsaWNhdGVkIG1hcCBjYW4gdXNlIHRoaXMgdG8gZW5zdXJlIGFjY3VyYWN5IG9uIGEgcGVyaW9kaWMgYmFzaXMKKyAgICAgKiBAcmV0dXJuIGxvbmcgLSB0aGUgdmVyc2lvbiBudW1iZXIgb3IgLTEgaWYgdGhlIGRhdGEgaXMgbm90IHZlcnNpb25lZAorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFZlcnNpb24oKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBGb3JjZXMgYSBjZXJ0YWluIHZlcnNpb24gdG8gYSByZXBsaWNhdGVkIG1hcCBlbnRyeTxicj4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbiBsb25nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihsb25nIHZlcnNpb24pOworICAgIAorICAgIAorICAgIAorICAgIAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90aXBpcy9TdHJlYW1hYmxlLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGlwaXMvU3RyZWFtYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDdiYjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGlwaXMvU3RyZWFtYWJsZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50aXBpczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogRXhhbXBsZSB1c2FnZToKKyAqIDxjb2RlPjxwcmU+CisgKiBieXRlW10gZGF0YSA9IG5ldyBieXRlWzEwMjRdOworICogU3RyZWFtYWJsZSBzdCA9IC4uLi47CisgKiB3aGlsZSAoICFzdC5lb2YoKSApIHsKKyAqICZuYnNwOyZuYnNwO2ludCBsZW5ndGggPSBzdC5yZWFkKGRhdGEsMCxkYXRhLmxlbmd0aCk7CisgKiAmbmJzcDsmbmJzcDtTdHJpbmcgcyA9IG5ldyBTdHJpbmcoZGF0YSwwLGxlbmd0aCk7CisgKiAmbmJzcDsmbmJzcDtTeXN0ZW0ub3V0LnByaW50bG4ocyk7CisgKiB9CisgKiA8L3ByZT48L2NvZGU+CisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGludGVyZmFjZSBTdHJlYW1hYmxlIHsKKyAgICAKKyAgICAvKioKKyAgICAgKiByZXR1cm5zIHRydWUgaWYgdGhlIHN0cmVhbSBoYXMgcmVhY2hlZCBpdHMgZW5kCisgICAgICogQHJldHVybiBib29sZWFuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZW9mKCk7CisgICAKKyAgICAvKioKKyAgICAgKiB3cml0ZSBkYXRhIGludG8gdGhlIGJ5dGUgYXJyYXkgc3RhcnRpbmcgYXQgb2Zmc2V0LCBtYXhpbXVtIGJ5dGVzIHJlYWQgYXJlIChkYXRhLmxlbmd0aC1vZmZzZXQpCisgICAgICogQHBhcmFtIGRhdGEgYnl0ZVtdIC0gdGhlIGFycmF5IHRvIHJlYWQgZGF0YSBpbnRvCisgICAgICogQHBhcmFtIG9mZnNldCBpbnQgLSBzdGFydCBwb3NpdGlvbiBmb3Igd3JpdGluZyBkYXRhCisgICAgICogQHJldHVybiBpbnQgLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW50byB0aGUgZGF0YSBidWZmZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHdyaXRlKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgCisgICAgLyoqCisgICAgICogcmVhZCBkYXRhIGludG8gdGhlIGJ5dGUgYXJyYXkgc3RhcnRpbmcgYXQgb2Zmc2V0CisgICAgICogQHBhcmFtIGRhdGEgYnl0ZVtdIC0gdGhlIGFycmF5IHRvIHJlYWQgZGF0YSBpbnRvCisgICAgICogQHBhcmFtIG9mZnNldCBpbnQgLSBzdGFydCBwb3NpdGlvbiBmb3Igd3JpdGluZyBkYXRhCisgICAgICogQHBhcmFtIGxlbmd0aCAtIHRoZSBkZXNpcmVkIHJlYWQgbGVuZ3RoCisgICAgICogQHJldHVybiBpbnQgLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSB0aGUgZGF0YSBidWZmZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9BYnN0cmFjdFNlbmRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9BYnN0cmFjdFNlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZmI3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L0Fic3RyYWN0U2VuZGVyLmphdmEKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKKworLyoqCisgKiA8cD5UaXRsZTogPC9wPgorICoKKyAqIDxwPkRlc2NyaXB0aW9uOiA8L3A+CisgKgorICogPHA+Q29weXJpZ2h0OiBDb3B5cmlnaHQgKGMpIDIwMDU8L3A+CisgKgorICogPHA+Q29tcGFueTogPC9wPgorICoKKyAqIEBhdXRob3Igbm90IGF0dHJpYnV0YWJsZQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlbmRlciBpbXBsZW1lbnRzIERhdGFTZW5kZXIgeworICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCByeEJ1ZlNpemUgPSAyNTE4ODsKKyAgICBwcml2YXRlIGludCB0eEJ1ZlNpemUgPSA0MzgwMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZGlyZWN0QnVmZmVyID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQga2VlcEFsaXZlQ291bnQgPSAtMTsKKyAgICBwcml2YXRlIGludCByZXF1ZXN0Q291bnQgPSAwOworICAgIHByaXZhdGUgbG9uZyBjb25uZWN0VGltZTsKKyAgICBwcml2YXRlIGxvbmcga2VlcEFsaXZlVGltZSA9IC0xOworICAgIHByaXZhdGUgbG9uZyB0aW1lb3V0ID0gMzAwMDsKKyAgICBwcml2YXRlIE1lbWJlciBkZXN0aW5hdGlvbjsKKyAgICBwcml2YXRlIEluZXRBZGRyZXNzIGFkZHJlc3M7CisgICAgcHJpdmF0ZSBpbnQgcG9ydDsKKyAgICBwcml2YXRlIGludCBtYXhSZXRyeUF0dGVtcHRzID0gMTsvLzEgcmVzZW5kcworICAgIHByaXZhdGUgaW50IGF0dGVtcHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIHRjcE5vRGVsYXkgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBzb0tlZXBBbGl2ZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBvb0JJbmxpbmUgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBzb1JldXNlQWRkcmVzcyA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIHNvTGluZ2VyT24gPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBzb0xpbmdlclRpbWUgPSAzOworICAgIHByaXZhdGUgaW50IHNvVHJhZmZpY0NsYXNzID0gMHgwNCB8IDB4MDggfCAweDAxMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gdGhyb3dPbkZhaWxlZEFjayA9IGZhbHNlOworICAgIAorICAgIC8qKgorICAgICAqIHRyYW5zZmVycyBzZW5kZXIgcHJvcGVydGllcyBmcm9tIG9uZSBzZW5kZXIgdG8gYW5vdGhlcgorICAgICAqIEBwYXJhbSBmcm9tIEFic3RyYWN0U2VuZGVyCisgICAgICogQHBhcmFtIHRvIEFic3RyYWN0U2VuZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZmVyUHJvcGVydGllcyhBYnN0cmFjdFNlbmRlciBmcm9tLCBBYnN0cmFjdFNlbmRlciB0bykgeworICAgICAgICB0by5yeEJ1ZlNpemUgPSBmcm9tLnJ4QnVmU2l6ZTsKKyAgICAgICAgdG8udHhCdWZTaXplID0gZnJvbS50eEJ1ZlNpemU7CisgICAgICAgIHRvLmRpcmVjdEJ1ZmZlciA9IGZyb20uZGlyZWN0QnVmZmVyOworICAgICAgICB0by5rZWVwQWxpdmVDb3VudCA9IGZyb20ua2VlcEFsaXZlQ291bnQ7CisgICAgICAgIHRvLmtlZXBBbGl2ZVRpbWUgPSBmcm9tLmtlZXBBbGl2ZVRpbWU7CisgICAgICAgIHRvLnRpbWVvdXQgPSBmcm9tLnRpbWVvdXQ7CisgICAgICAgIHRvLmRlc3RpbmF0aW9uID0gZnJvbS5kZXN0aW5hdGlvbjsKKyAgICAgICAgdG8uYWRkcmVzcyA9IGZyb20uYWRkcmVzczsKKyAgICAgICAgdG8ucG9ydCA9IGZyb20ucG9ydDsKKyAgICAgICAgdG8ubWF4UmV0cnlBdHRlbXB0cyA9IGZyb20ubWF4UmV0cnlBdHRlbXB0czsKKyAgICAgICAgdG8udGNwTm9EZWxheSA9IGZyb20udGNwTm9EZWxheTsKKyAgICAgICAgdG8uc29LZWVwQWxpdmUgPSBmcm9tLnNvS2VlcEFsaXZlOworICAgICAgICB0by5vb0JJbmxpbmUgPSBmcm9tLm9vQklubGluZTsKKyAgICAgICAgdG8uc29SZXVzZUFkZHJlc3MgPSBmcm9tLnNvUmV1c2VBZGRyZXNzOworICAgICAgICB0by5zb0xpbmdlck9uID0gZnJvbS5zb0xpbmdlck9uOworICAgICAgICB0by5zb0xpbmdlclRpbWUgPSBmcm9tLnNvTGluZ2VyVGltZTsKKyAgICAgICAgdG8uc29UcmFmZmljQ2xhc3MgPSBmcm9tLnNvVHJhZmZpY0NsYXNzOworICAgICAgICB0by50aHJvd09uRmFpbGVkQWNrID0gZnJvbS50aHJvd09uRmFpbGVkQWNrOworICAgIH0gICAKKworICAgIAorICAgIHB1YmxpYyBBYnN0cmFjdFNlbmRlcigpIHsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIGNvbm5lY3QKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuRGF0YVNlbmRlciBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogZGlzY29ubmVjdAorICAgICAqCisgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LkRhdGFTZW5kZXIgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZGlzY29ubmVjdCgpOworCisgICAgLyoqCisgICAgICoga2VlcGFsaXZlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuRGF0YVNlbmRlciBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBrZWVwYWxpdmUoKSB7CisgICAgICAgIGJvb2xlYW4gZGlzY29ubmVjdCA9IGZhbHNlOworICAgICAgICBpZiAoIGtlZXBBbGl2ZUNvdW50ID49IDAgJiYgcmVxdWVzdENvdW50PmtlZXBBbGl2ZUNvdW50ICkgZGlzY29ubmVjdCA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKCBrZWVwQWxpdmVUaW1lID49IDAgJiYga2VlcEFsaXZlVGltZT4gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLWNvbm5lY3RUaW1lKSApIGRpc2Nvbm5lY3QgPSB0cnVlOworICAgICAgICBpZiAoIGRpc2Nvbm5lY3QgKSBkaXNjb25uZWN0KCk7CisgICAgICAgIHJldHVybiBkaXNjb25uZWN0OworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDb25uZWN0ZWQoYm9vbGVhbiBjb25uZWN0ZWQpeworICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGNvbm5lY3RlZDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7CisgICAgICAgIHJldHVybiBjb25uZWN0ZWQ7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0Q29ubmVjdFRpbWUoKSB7CisgICAgICAgIHJldHVybiBjb25uZWN0VGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVtYmVyIGdldERlc3RpbmF0aW9uKCkgeworICAgICAgICByZXR1cm4gZGVzdGluYXRpb247CisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IGdldEtlZXBBbGl2ZUNvdW50KCkgeworICAgICAgICByZXR1cm4ga2VlcEFsaXZlQ291bnQ7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0S2VlcEFsaXZlVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIGtlZXBBbGl2ZVRpbWU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0Q291bnQoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0Q291bnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSeEJ1ZlNpemUoKSB7CisgICAgICAgIHJldHVybiByeEJ1ZlNpemU7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0VGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIHRpbWVvdXQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUeEJ1ZlNpemUoKSB7CisgICAgICAgIHJldHVybiB0eEJ1ZlNpemU7CisgICAgfQorCisgICAgcHVibGljIEluZXRBZGRyZXNzIGdldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYXhSZXRyeUF0dGVtcHRzKCkgeworICAgICAgICByZXR1cm4gbWF4UmV0cnlBdHRlbXB0czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RCdWZmZXIoYm9vbGVhbiBkaXJlY3RCdWZmZXIpIHsKKyAgICAgICAgdGhpcy5kaXJlY3RCdWZmZXIgPSBkaXJlY3RCdWZmZXI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGlyZWN0QnVmZmVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3RCdWZmZXI7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRBdHRlbXB0KCkgeworICAgICAgICByZXR1cm4gYXR0ZW1wdDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUY3BOb0RlbGF5KCkgeworICAgICAgICByZXR1cm4gdGNwTm9EZWxheTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTb0tlZXBBbGl2ZSgpIHsKKyAgICAgICAgcmV0dXJuIHNvS2VlcEFsaXZlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldE9vQklubGluZSgpIHsKKyAgICAgICAgcmV0dXJuIG9vQklubGluZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTb1JldXNlQWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIHNvUmV1c2VBZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFNvTGluZ2VyT24oKSB7CisgICAgICAgIHJldHVybiBzb0xpbmdlck9uOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U29MaW5nZXJUaW1lKCkgeworICAgICAgICByZXR1cm4gc29MaW5nZXJUaW1lOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U29UcmFmZmljQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBzb1RyYWZmaWNDbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUaHJvd09uRmFpbGVkQWNrKCkgeworICAgICAgICByZXR1cm4gdGhyb3dPbkZhaWxlZEFjazsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRLZWVwQWxpdmVDb3VudChpbnQga2VlcEFsaXZlQ291bnQpIHsKKyAgICAgICAgdGhpcy5rZWVwQWxpdmVDb3VudCA9IGtlZXBBbGl2ZUNvdW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEtlZXBBbGl2ZVRpbWUobG9uZyBrZWVwQWxpdmVUaW1lKSB7CisgICAgICAgIHRoaXMua2VlcEFsaXZlVGltZSA9IGtlZXBBbGl2ZVRpbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdENvdW50KGludCByZXF1ZXN0Q291bnQpIHsKKyAgICAgICAgdGhpcy5yZXF1ZXN0Q291bnQgPSByZXF1ZXN0Q291bnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UnhCdWZTaXplKGludCByeEJ1ZlNpemUpIHsKKyAgICAgICAgdGhpcy5yeEJ1ZlNpemUgPSByeEJ1ZlNpemU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGltZW91dChsb25nIHRpbWVvdXQpIHsKKyAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeEJ1ZlNpemUoaW50IHR4QnVmU2l6ZSkgeworICAgICAgICB0aGlzLnR4QnVmU2l6ZSA9IHR4QnVmU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0VGltZShsb25nIGNvbm5lY3RUaW1lKSB7CisgICAgICAgIHRoaXMuY29ubmVjdFRpbWUgPSBjb25uZWN0VGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhSZXRyeUF0dGVtcHRzKGludCBtYXhSZXRyeUF0dGVtcHRzKSB7CisgICAgICAgIHRoaXMubWF4UmV0cnlBdHRlbXB0cyA9IG1heFJldHJ5QXR0ZW1wdHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXR0ZW1wdChpbnQgYXR0ZW1wdCkgeworICAgICAgICB0aGlzLmF0dGVtcHQgPSBhdHRlbXB0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRjcE5vRGVsYXkoYm9vbGVhbiB0Y3BOb0RlbGF5KSB7CisgICAgICAgIHRoaXMudGNwTm9EZWxheSA9IHRjcE5vRGVsYXk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U29LZWVwQWxpdmUoYm9vbGVhbiBzb0tlZXBBbGl2ZSkgeworICAgICAgICB0aGlzLnNvS2VlcEFsaXZlID0gc29LZWVwQWxpdmU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T29CSW5saW5lKGJvb2xlYW4gb29CSW5saW5lKSB7CisgICAgICAgIHRoaXMub29CSW5saW5lID0gb29CSW5saW5lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNvUmV1c2VBZGRyZXNzKGJvb2xlYW4gc29SZXVzZUFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5zb1JldXNlQWRkcmVzcyA9IHNvUmV1c2VBZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNvTGluZ2VyT24oYm9vbGVhbiBzb0xpbmdlck9uKSB7CisgICAgICAgIHRoaXMuc29MaW5nZXJPbiA9IHNvTGluZ2VyT247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U29MaW5nZXJUaW1lKGludCBzb0xpbmdlclRpbWUpIHsKKyAgICAgICAgdGhpcy5zb0xpbmdlclRpbWUgPSBzb0xpbmdlclRpbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U29UcmFmZmljQ2xhc3MoaW50IHNvVHJhZmZpY0NsYXNzKSB7CisgICAgICAgIHRoaXMuc29UcmFmZmljQ2xhc3MgPSBzb1RyYWZmaWNDbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUaHJvd09uRmFpbGVkQWNrKGJvb2xlYW4gdGhyb3dPbkZhaWxlZEFjaykgeworICAgICAgICB0aGlzLnRocm93T25GYWlsZWRBY2sgPSB0aHJvd09uRmFpbGVkQWNrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlc3RpbmF0aW9uKE1lbWJlciBkZXN0aW5hdGlvbikgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOworICAgICAgICB0aGlzLmFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoZGVzdGluYXRpb24uZ2V0SG9zdCgpKTsKKyAgICAgICAgdGhpcy5wb3J0ID0gZGVzdGluYXRpb24uZ2V0UG9ydCgpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgeworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3MoSW5ldEFkZHJlc3MgYWRkcmVzcykgeworICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvQ29uc3RhbnRzLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOTI0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uWEJ5dGVCdWZmZXI7CisKKy8qKgorICogTWFuaWZlc3QgY29uc3RhbnRzIGZvciB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0PC9jb2RlPgorICogcGFja2FnZS4KKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbnN0YW50cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQYWNrYWdlID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydCI7CisgICAgCisgICAgLyoKKyAgICAgKiBEbyBub3QgY2hhbmdlIGFueSBvZiB0aGVzZSB2YWx1ZXMhCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gQUNLX0RBVEEgPSBuZXcgYnl0ZVtdIHs2LCAyLCAzfTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBGQUlMX0FDS19EQVRBID0gbmV3IGJ5dGVbXSB7MTEsIDAsIDV9OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIEFDS19DT01NQU5EID0gWEJ5dGVCdWZmZXIuY3JlYXRlRGF0YVBhY2thZ2UoQUNLX0RBVEEpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIEZBSUxfQUNLX0NPTU1BTkQgPSBYQnl0ZUJ1ZmZlci5jcmVhdGVEYXRhUGFja2FnZShGQUlMX0FDS19EQVRBKTsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9EYXRhU2VuZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L0RhdGFTZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGNlMzAwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9EYXRhU2VuZGVyLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogPHA+VGl0bGU6IDwvcD4KKyAqCisgKiA8cD5EZXNjcmlwdGlvbjogPC9wPgorICoKKyAqIDxwPkNvcHlyaWdodDogQ29weXJpZ2h0IChjKSAyMDA1PC9wPgorICoKKyAqIDxwPkNvbXBhbnk6IDwvcD4KKyAqCisgKiBAYXV0aG9yIG5vdCBhdHRyaWJ1dGFibGUKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIERhdGFTZW5kZXIgeworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpOworICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCk7CisgICAgcHVibGljIHZvaWQgc2V0UnhCdWZTaXplKGludCBzaXplKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRUeEJ1ZlNpemUoaW50IHNpemUpOworICAgIHB1YmxpYyBib29sZWFuIGtlZXBhbGl2ZSgpOworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQobG9uZyB0aW1lb3V0KTsKKyAgICBwdWJsaWMgdm9pZCBzZXRLZWVwQWxpdmVDb3VudChpbnQgbWF4UmVxdWVzdHMpOworICAgIHB1YmxpYyB2b2lkIHNldEtlZXBBbGl2ZVRpbWUobG9uZyBrZWVwQWxpdmVUaW1lSW5Ncyk7CisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0Q291bnQoKTsKKyAgICBwdWJsaWMgbG9uZyBnZXRDb25uZWN0VGltZSgpOworICAgIAorICAgIAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNTRjYTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNjkgQEAKK0FzeW5jU29ja2V0U2VuZGVyLmNyZWF0ZS50aHJlYWQ9Q3JlYXRlIHNlbmRlciBbezB9OnsxLG51bWJlcixpbnRlZ2VyfV0gcXVldWUgdGhyZWFkIHRvIHRjcCBiYWNrZ3JvdW5kIHJlcGxpY2F0aW9uCitBc3luY1NvY2tldFNlbmRlci5xdWV1ZS5tZXNzYWdlPVF1ZXVlIG1lc3NhZ2UgdG8gW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIGlkPVt7Mn1dIHNpemU9ezN9CitBc3luY1NvY2tldFNlbmRlci5zZW5kLmVycm9yPVVuYWJsZSB0byBhc3luY2hyb25vdXNseSBzZW5kIHNlc3Npb24gd2l0aCBpZD1bezB9XSAtIG1lc3NhZ2Ugd2lsbCBiZSBpZ25vcmVkLgorQXN5bmNTb2NrZXRTZW5kZXIucXVldWUuZW1wdHk9UXVldWUgaW4gc2VuZGVyIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSByZXR1cm5lZCBudWxsIGVsZW1lbnQhCitjbHVzdGVyLm1iZWFuLnJlZ2lzdGVyLmFscmVhZHk9TUJlYW4gezB9IGFscmVhZHkgcmVnaXN0ZXJlZCEKK0lEYXRhU2VuZGVyLmFjay5lb2Y9RU9GIHJlYWNoZWQgYXQgbG9jYWwgcG9ydCBbezB9OnsxLG51bWJlcixpbnRlZ2VyfV0KK0lEYXRhU2VuZGVyLmFjay5yZWNlaXZlPUdvdCBBQ0sgYXQgbG9jYWwgcG9ydCBbezB9OnsxLG51bWJlcixpbnRlZ2VyfV0KK0lEYXRhU2VuZGVyLmFjay5taXNzaW5nPVVuYWJsZSB0byByZWFkIGFja25vd2xlZGdlbWVudCBmcm9tIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSBpbiB7MixudW1iZXIsaW50ZWdlcn0gbXMuIERpc2Nvbm5lY3Rpbmcgc29ja2V0LCBhbmQgdHJ5aW5nIGFnYWluLgorSURhdGFTZW5kZXIuYWNrLnJlYWQ9UmVhZCB3YWl0IGFjayBjaGFyICd7Mn0nIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XQorSURhdGFTZW5kZXIuYWNrLnN0YXJ0PVdhaXRpbmcgZm9yIEFDSyBtZXNzYWdlIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XQorSURhdGFTZW5kZXIuYWNrLndyb25nPU1pc3NpbmcgY29ycmVjdCBBQ0sgYWZ0ZXIgMTAgYnl0ZXMgcmVhZCBhdCBsb2NhbCBwb3J0IFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XQorSURhdGFTZW5kZXIuY2xvc2VTb2NrZXQ9U2VuZGVyIGNsb3NlIHNvY2tldCB0byBbezB9OnsxLG51bWJlcixpbnRlZ2VyfV0gKGNsb3NlIGNvdW50IHsyLG51bWJlcixpbnRlZ2VyfSkKK0lEYXRhU2VuZGVyLmNvbm5lY3Q9U2VuZGVyIGNvbm5lY3QgdG8gW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIChjb25uZWN0IGNvdW50IHsyLG51bWJlcixpbnRlZ2VyfSkKK0lEYXRhU2VuZGVyLmNyZWF0ZT1DcmVhdGUgc2VuZGVyIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XQorSURhdGFTZW5kZXIuZGlzY29ubmVjdD1TZW5kZXIgZGlzY29ubmVjdCBmcm9tIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSAoZGlzY29ubmVjdCBjb3VudCB7MixudW1iZXIsaW50ZWdlcn0pCitJRGF0YVNlbmRlci5tZXNzYWdlLmRpc2Nvbm5lY3Q9TWVzc2FnZSB0cmFuc2ZlcmVkOiBTZW5kZXIgY2FuJ3QgZGlzY29ubmVjdCBmcm9tIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XQorSURhdGFTZW5kZXIubWVzc2FnZS5jcmVhdGU9TWVzc2FnZSB0cmFuc2ZlcmVkOiBTZW5kZXIgY2FuJ3QgY3JlYXRlIGN1cnJlbnQgc29ja2V0IFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XQorSURhdGFTZW5kZXIub3BlblNvY2tldD1TZW5kZXIgb3BlbiBzb2NrZXQgdG8gW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIChvcGVuIGNvdW50IHsyLG51bWJlcixpbnRlZ2VyfSkKK0lEYXRhU2VuZGVyLm9wZW5Tb2NrZXQuZmFpbHVyZT1PcGVuIHNlbmRlciBzb2NrZXQgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIGZhaWx1cmUhIChvcGVuIGZhaWx1cmUgY291bnQgezIsbnVtYmVyLGludGVnZXJ9KQorSURhdGFTZW5kZXIuc2VuZC5hZ2Fpbj1TZW5kIGRhdGEgYWdhaW4gdG8gW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dCitJRGF0YVNlbmRlci5zZW5kLmNyYXNoPVNlbmQgbWVzc2FnZSBjcmFzaGVkIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSB0eXBlPVt7Mn1dLCBpZD1bezN9XQorSURhdGFTZW5kZXIuc2VuZC5tZXNzYWdlPVNlbmQgbWVzc2FnZSB0byBbezB9OnsxLG51bWJlcixpbnRlZ2VyfV0gaWQ9W3syfV0gc2l6ZT17MyxudW1iZXIsaW50ZWdlcn0KK0lEYXRhU2VuZGVyLnNlbmQubG9zdD1NZXNzYWdlIGxvc3Q6IFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSB0eXBlPVt7Mn1dLCBpZD1bezN9XQorSURhdGFTZW5kZXIuc2VuZGVyTW9kZXMuQ29uZmlndXJlZD1Db25maWd1cmVkIGEgZGF0YSByZXBsaWNhdGlvbiBzZW5kZXIgZm9yIG1vZGUgezB9CitJRGF0YVNlbmRlci5zZW5kZXJNb2Rlcy5JbnN0YW50aWF0ZT1DYW4ndCBpbnN0YW50aWF0ZSBhIGRhdGEgcmVwbGljYXRpb24gc2VuZGVyIG9mIGNsYXNzIHswfQorSURhdGFTZW5kZXIuc2VuZGVyTW9kZXMuTWlzc2luZz1DYW4ndCBjb25maWd1cmUgYSBkYXRhIHJlcGxpY2F0aW9uIHNlbmRlciBmb3IgbW9kZSB7MH0KK0lEYXRhU2VuZGVyLnNlbmRlck1vZGVzLlJlc291cmNlcz1DYW4ndCBsb2FkIGRhdGEgcmVwbGljYXRpb24gc2VuZGVyIG1hcHBpbmcgbGlzdAorSURhdGFTZW5kZXIuc3RhdHM9U2VuZCBzdGF0cyBmcm9tIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSwgTnIgb2YgYnl0ZXMgc2VudD17MixudW1iZXIsaW50ZWdlcn0gb3ZlciB7M30gPSB7NCxudW1iZXIsaW50ZWdlcn0gYnl0ZXMvcmVxdWVzdCwgcHJvY2Vzc2luZyB0aW1lIHs1LG51bWJlcixpbnRlZ2VyfSBtc2VjLCBhdmcgcHJvY2Vzc2luZyB0aW1lIHs2LG51bWJlcixpbnRlZ2VyfSBtc2VjCitQb29sU29ja2V0U2VuZGVyLnNlbmRlclF1ZXVlLnNlbmRlci5mYWlsZWQ9UG9vbFNvY2tldFNlbmRlciBjcmVhdGUgbmV3IHNlbmRlciB0byBbezB9OnsxLG51bWJlcixpbnRlZ2VyfV0gZmFpbGVkCitQb29sU29ja2V0U2VuZGVyLm5vTW9yZVNlbmRlcj1ObyBzb2NrZXQgc2VuZGVyIGF2YWlsYWJsZSBmb3IgY2xpZW50IFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSBkaWQgaXQgZGlzYXBwZWFyZWQ/CitSZXBsaWNhdGlvblRyYW5zbWl0dGVyLmdldFByb3BlcnR5PWdldCBwcm9wZXJ0eSB7MH0KK1JlcGxpY2F0aW9uVHJhbnNtaXR0ZXIuc2V0UHJvcGVydHk9c2V0IHByb3BlcnR5IHswfTogezF9IG9sZCB2YWx1ZSB7Mn0KK1JlcGxpY2F0aW9uVHJhbnNtaXR0ZXIuc3RhcnRlZD1TdGFydCBDbHVzdGVyU2VuZGVyIGF0IGNsdXN0ZXIgezB9IHdpdGggbmFtZSB7MX0KK1JlcGxpY2F0aW9uVHJhbnNtaXR0ZXIuc3RvcHBlZD1TdG9wcGVkIENsdXN0ZXJTZW5kZXIgYXQgY2x1c3RlciB7MH0gd2l0aCBuYW1lIHsxfQorUmVwbGljYXRpb25WYWx2ZS5jcm9zc0NvbnRleHQuYWRkPWFkZCBDcm9zcyBDb250ZXh0IHNlc3Npb24gcmVwbGljYXRpb24gY29udGFpbmVyIHRvIHJlcGxpY2F0aW9uVmFsdmUgdGhyZWFkbG9jYWwKK1JlcGxpY2F0aW9uVmFsdmUuY3Jvc3NDb250ZXh0LnJlZ2lzdGVyU2Vzc2lvbj1yZWdpc3RlciBDcm9zcyBjb250ZXh0IHNlc3Npb24gaWQ9ezB9IGZyb20gY29udGV4dCB7MX0KK1JlcGxpY2F0aW9uVmFsdmUuY3Jvc3NDb250ZXh0LnJlbW92ZT1yZW1vdmUgQ3Jvc3MgQ29udGV4dCBzZXNzaW9uIHJlcGxpY2F0aW9uIGNvbnRhaW5lciBmcm9tIHJlcGxpY2F0aW9uVmFsdmUgdGhyZWFkbG9jYWwKK1JlcGxpY2F0aW9uVmFsdmUuY3Jvc3NDb250ZXh0LnNlbmREZWx0YT1zZW5kIENyb3NzIENvbnRleHQgc2Vzc2lvbiBkZWx0YSBmcm9tIGNvbnRleHQgezB9LgorUmVwbGljYXRpb25WYWx2ZS5maWx0ZXIubG9hZGluZz1Mb2FkaW5nIHJlcXVlc3QgZmlsdGVycz17MH0KK1JlcGxpY2F0aW9uVmFsdmUuZmlsdGVyLnRva2VuPVJlcXVlc3QgZmlsdGVyPXswfQorUmVwbGljYXRpb25WYWx2ZS5maWx0ZXIudG9rZW4uZmFpbHVyZT1VbmFibGUgdG8gY29tcGlsZSBmaWx0ZXI9ezB9CitSZXBsaWNhdGlvblZhbHZlLmludm9rZS51cmk9SW52b2tpbmcgcmVwbGljYXRpb24gcmVxdWVzdCBvbiB7MH0KK1JlcGxpY2F0aW9uVmFsdmUubm9jbHVzdGVyPU5vIGNsdXN0ZXIgY29uZmlndXJlZCBmb3IgdGhpcyByZXF1ZXN0LgorUmVwbGljYXRpb25WYWx2ZS5yZXNldERlbHRhUmVxdWVzdD1DbHVzdGVyIGlzIHN0YW5kYWxvbmU6IHJlc2V0IFNlc3Npb24gUmVxdWVzdCBEZWx0YSBhdCBjb250ZXh0IHswfQorUmVwbGljYXRpb25WYWx2ZS5zZW5kLmZhaWx1cmU9VW5hYmxlIHRvIHBlcmZvcm0gcmVwbGljYXRpb24gcmVxdWVzdC4KK1JlcGxpY2F0aW9uVmFsdmUuc2VuZC5pbnZhbGlkLmZhaWx1cmU9VW5hYmxlIHRvIHNlbmQgc2Vzc2lvbiBbaWQ9ezB9XSBpbnZhbGlkIG1lc3NhZ2Ugb3ZlciBjbHVzdGVyLgorUmVwbGljYXRpb25WYWx2ZS5zZXNzaW9uLmZvdW5kPUNvbnRleHQgezB9OiBGb3VuZCBzZXNzaW9uIHsxfSBidXQgaXQgaXNuJ3QgYSBDbHVzdGVyU2Vzc2lvbi4KK1JlcGxpY2F0aW9uVmFsdmUuc2Vzc2lvbi5pbmRpY2F0b3I9Q29udGV4dCB7MH06IFByaW1hcml0eSBvZiBzZXNzaW9uIHswfSBpbiByZXF1ZXN0IGF0dHJpYnV0ZSB7MX0gaXMgezJ9LgorUmVwbGljYXRpb25WYWx2ZS5zZXNzaW9uLmludmFsaWQ9Q29udGV4dCB7MH06IFJlcXVlc3RlZCBzZXNzaW9uIHsxfSBpcyBpbnZhbGlkLCByZW1vdmVkIG9yIG5vdCByZXBsaWNhdGVkIGF0IHRoaXMgbm9kZS4KK1JlcGxpY2F0aW9uVmFsdmUuc3RhdHM9QXZlcmFnZSByZXF1ZXN0IHRpbWU9IHswfSBtcyBmb3IgQ2x1c3RlciBvdmVyaGVhZCB0aW1lPXsxfSBtcyBmb3IgezJ9IHJlcXVlc3RzIHszfSBmaWx0ZXIgcmVxdWVzdHMgezR9IHNlbmQgcmVxdWVzdHMgezV9IGNyb3NzIGNvbnRleHQgcmVxdWVzdHMgKFJlcXVlc3Q9ezZ9IG1zIENsdXN0ZXI9ezd9IG1zKS4KK1NpbXBsZVRjcENsdXN0ZXIuZXZlbnQubG9nPUNsdXN0ZXIgcmVjZWl2ZSBsaXN0ZW5lciBldmVudCB7MH0gd2l0aCBkYXRhIHsxfQorU2ltcGxlVGNwQ2x1c3Rlci5nZXRQcm9wZXJ0eT1nZXQgcHJvcGVydHkgezB9CitTaW1wbGVUY3BDbHVzdGVyLnNldFByb3BlcnR5PXNldCBwcm9wZXJ0eSB7MH06IHsxfSBvbGQgdmFsdWUgezJ9CitTaW1wbGVUY3BDbHVzdGVyLmRlZmF1bHQuYWRkQ2x1c3Rlckxpc3RlbmVyPUFkZCBEZWZhdWx0IENsdXN0ZXJMaXN0ZW5lciBhdCBjbHVzdGVyIHswfQorU2ltcGxlVGNwQ2x1c3Rlci5kZWZhdWx0LmFkZENsdXN0ZXJWYWx2ZXM9QWRkIERlZmF1bHQgQ2x1c3RlclZhbHZlcyBhdCBjbHVzdGVyIHswfQorU2ltcGxlVGNwQ2x1c3Rlci5kZWZhdWx0LmFkZENsdXN0ZXJSZWNlaXZlcj1BZGQgRGVmYXVsdCBDbHVzdGVyUmVjZWl2ZXIgYXQgY2x1c3RlciB7MH0KK1NpbXBsZVRjcENsdXN0ZXIuZGVmYXVsdC5hZGRDbHVzdGVyU2VuZGVyPUFkZCBEZWZhdWx0IENsdXN0ZXJTZW5kZXIgYXQgY2x1c3RlciB7MH0KK1NpbXBsZVRjcENsdXN0ZXIuZGVmYXVsdC5hZGRNZW1iZXJzaGlwU2VydmljZT1BZGQgRGVmYXVsdCBNZW1iZXJzaGlwIFNlcnZpY2UgYXQgY2x1c3RlciB7MH0KK1NpbXBsZVRjcENsdXN0ZXIubG9nLnJlY2VpdmU9UkVDRUlWRSB7MCxkYXRlfTp7MCx0aW1lfSB7MSxudW1iZXJ9IHsyfTp7MyxudW1iZXIsaW50ZWdlcn0gezR9IHs1fQorU2ltcGxlVGNwQ2x1c3Rlci5sb2cuc2VuZD1TRU5EIHswLGRhdGV9OnswLHRpbWV9IHsxLG51bWJlcn0gezJ9OnszLG51bWJlcixpbnRlZ2VyfSB7NH0gCitTaW1wbGVUY3BDbHVzdGVyLmxvZy5zZW5kLmFsbD1TRU5EIHswLGRhdGV9OnswLHRpbWV9IHsxLG51bWJlcn0gLSB7Mn0KK1NvY2tldFJlcGxpY3Rpb25MaXN0ZW5lci5hbGxyZWFkeUV4aXN0cz1TZXJ2ZXJTb2NrZXQgW3swfTp7MX1dIGFsbHJlYWR5IHN0YXJ0ZWQhCitTb2NrZXRSZXBsaWN0aW9uTGlzdGVuZXIuYWNjZXB0LmZhaWx1cmU9U2VydmVyU29ja2V0IFt7MH06ezF9XSAtIEV4Y2VwdGlvbiB0byBzdGFydCB0aHJlYWQgb3IgYWNjZXB0IHNlcnZlciBzb2NrZXQKK1NvY2tldFJlcGxpY3Rpb25MaXN0ZW5lci5vcGVuPU9wZW4gU29ja2V0IGF0IFt7MH06ezF9XQorU29ja2V0UmVwbGljdGlvbkxpc3RlbmVyLm9wZW5jbG9zZS5mYWlsdXJlPVNlcnZlclNvY2tldCBbezB9OnsxfV0gLSBFeGNlcHRpb24gdG8gb3BlbiBvciBjbG9zZSBzZXJ2ZXIgc29ja2V0CitTb2NrZXRSZXBsaWN0aW9uTGlzdGVuZXIucG9ydGJ1c3k9UG9ydCBidXN5IGF0IFt7MH06e2l9XSAtIHJlYXNvbiBbezJ9XQorU29ja2V0UmVwbGljdGlvbkxpc3RlbmVyLnNlcnZlclNvY2tldC5ub3RFeGlzdHM9RmF0YWwgZXJyb3I6IFJlY2VpdmVyIHNvY2tldCBub3QgYm91bmQgYWRkcmVzcz17MH0gcG9ydD17MX0gbWF4cG9ydD17Mn0KK1NvY2tldFJlcGxpY3Rpb25MaXN0ZW5lci50aW1lb3V0PVJlY2VpdmVyIFNlcnZlclNvY2tldCBubyBzdGFydGVkIFt7MH06ezF9XSAtIHJlYXNvbjogdGltZW91dD17Mn0gb3IgbGlzdGVuPXszfQorU29ja2V0UmVwbGljdGlvbkxpc3RlbmVyLnVubG9ja1NvY2tldC5mYWlsdXJlPVVuTG9ja3NvY2tldCBmYWlsdXJlIGF0IFNlcnZlclNvY2tldCBbezA6ezF9XQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9NdWx0aVBvaW50U2VuZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L011bHRpUG9pbnRTZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTVmMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9NdWx0aVBvaW50U2VuZGVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworCisvKioKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNS41LjE2CisgKi8KKworcHVibGljIGludGVyZmFjZSBNdWx0aVBvaW50U2VuZGVyIGV4dGVuZHMgRGF0YVNlbmRlcgoreworICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKE1lbWJlcltdIGRlc3RpbmF0aW9uLCBDaGFubmVsTWVzc2FnZSBkYXRhKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgdm9pZCBzZXRSeEJ1ZlNpemUoaW50IHNpemUpOworICAgIHB1YmxpYyB2b2lkIHNldFR4QnVmU2l6ZShpbnQgc2l6ZSk7CisgICAgcHVibGljIHZvaWQgc2V0TWF4UmV0cnlBdHRlbXB0cyhpbnQgYXR0ZW1wdHMpOworICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdEJ1ZmZlcihib29sZWFuIGRpcmVjdEJ1Zik7CisgICAgcHVibGljIHZvaWQgbWVtYmVyQWRkZWQoTWVtYmVyIG1lbWJlcik7CisgICAgcHVibGljIHZvaWQgbWVtYmVyRGlzYXBwZWFyZWQoTWVtYmVyIG1lbWJlcik7Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L1Bvb2xlZFNlbmRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9Qb29sZWRTZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTI0YjE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9Qb29sZWRTZW5kZXIuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIDxwPlRpdGxlOiA8L3A+CisgKgorICogPHA+RGVzY3JpcHRpb246IDwvcD4KKyAqCisgKiA8cD5Db3B5cmlnaHQ6IENvcHlyaWdodCAoYykgMjAwNTwvcD4KKyAqCisgKiA8cD5Db21wYW55OiA8L3A+CisgKgorICogQGF1dGhvciBub3QgYXR0cmlidXRhYmxlCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFBvb2xlZFNlbmRlciBleHRlbmRzIEFic3RyYWN0U2VuZGVyIGltcGxlbWVudHMgTXVsdGlQb2ludFNlbmRlciB7CisgICAgCisgICAgcHJpdmF0ZSBTZW5kZXJRdWV1ZSBxdWV1ZSA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgcG9vbFNpemUgPSAyNTsKKyAgICBwdWJsaWMgUG9vbGVkU2VuZGVyKCkgeworICAgICAgICBxdWV1ZSA9IG5ldyBTZW5kZXJRdWV1ZSh0aGlzLHBvb2xTaXplKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGFic3RyYWN0IERhdGFTZW5kZXIgZ2V0TmV3RGF0YVNlbmRlcigpOworICAgIAorICAgIHB1YmxpYyBEYXRhU2VuZGVyIGdldFNlbmRlcigpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXVlLmdldFNlbmRlcihnZXRUaW1lb3V0KCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCByZXR1cm5TZW5kZXIoRGF0YVNlbmRlciBzZW5kZXIpIHsKKyAgICAgICAgc2VuZGVyLmtlZXBhbGl2ZSgpOworICAgICAgICBxdWV1ZS5yZXR1cm5TZW5kZXIoc2VuZGVyKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvL2RvIG5vdGhpbmcsIGhhcHBlbnMgaW4gdGhlIHNvY2tldCBzZW5kZXIgaXRzZWxmCisgICAgICAgIHF1ZXVlLm9wZW4oKTsKKyAgICAgICAgc2V0Q29ubmVjdGVkKHRydWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgcXVldWUuY2xvc2UoKTsKKyAgICAgICAgc2V0Q29ubmVjdGVkKGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgCisgICAgcHVibGljIGludCBnZXRJblBvb2xTaXplKCkgeworICAgICAgICByZXR1cm4gcXVldWUuZ2V0SW5Qb29sU2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SW5Vc2VQb29sU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXVlLmdldEluVXNlUG9vbFNpemUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFBvb2xTaXplKGludCBwb29sU2l6ZSkgeworICAgICAgICB0aGlzLnBvb2xTaXplID0gcG9vbFNpemU7CisgICAgICAgIHF1ZXVlLnNldExpbWl0KHBvb2xTaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBvb2xTaXplKCkgeworICAgICAgICByZXR1cm4gcG9vbFNpemU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4ga2VlcGFsaXZlKCkgeworICAgICAgICAvL2RvIG5vdGhpbmcsIHRoZSBwb29sIGNoZWNrcyBvbiBldmVyeSByZXR1cm4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIAorCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElubmVyIENsYXNzCisKKyAgICBwcml2YXRlIGNsYXNzIFNlbmRlclF1ZXVlIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbGltaXQgPSAyNTsKKworICAgICAgICBQb29sZWRTZW5kZXIgcGFyZW50ID0gbnVsbDsKKworICAgICAgICBwcml2YXRlIExpc3Qgbm90aW51c2UgPSBudWxsOworCisgICAgICAgIHByaXZhdGUgTGlzdCBpbnVzZSA9IG51bGw7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzT3BlbiA9IHRydWU7CisKKyAgICAgICAgcHVibGljIFNlbmRlclF1ZXVlKFBvb2xlZFNlbmRlciBwYXJlbnQsIGludCBsaW1pdCkgeworICAgICAgICAgICAgdGhpcy5saW1pdCA9IGxpbWl0OworICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgICAgICBub3RpbnVzZSA9IG5ldyBqYXZhLnV0aWwuTGlua2VkTGlzdCgpOworICAgICAgICAgICAgaW51c2UgPSBuZXcgamF2YS51dGlsLkxpbmtlZExpc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxpbWl0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRMaW1pdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdDsKKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGxpbWl0IFRoZSBsaW1pdCB0byBzZXQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRMaW1pdChpbnQgbGltaXQpIHsKKyAgICAgICAgICAgIHRoaXMubGltaXQgPSBsaW1pdDsKKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRJblVzZVBvb2xTaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIGludXNlLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldEluUG9vbFNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gbm90aW51c2Uuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBEYXRhU2VuZGVyIGdldFNlbmRlcihsb25nIHRpbWVvdXQpIHsKKyAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIHdoaWxlICggdHJ1ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzT3Blbil0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJRdWV1ZSBpcyBjbG9zZWQiKTsKKyAgICAgICAgICAgICAgICBEYXRhU2VuZGVyIHNlbmRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKG5vdGludXNlLnNpemUoKSA9PSAwICYmIGludXNlLnNpemUoKSA8IGxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRlciA9IHBhcmVudC5nZXROZXdEYXRhU2VuZGVyKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub3RpbnVzZS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRlciA9IChEYXRhU2VuZGVyKSBub3RpbnVzZS5yZW1vdmUoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzZW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbnVzZS5hZGQoc2VuZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbmRlcjsKKyAgICAgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgICAgICBsb25nIGRlbHRhID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKKyAgICAgICAgICAgICAgICBpZiAoIGRlbHRhID4gdGltZW91dCAmJiB0aW1lb3V0PjApIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2FpdChNYXRoLm1heCh0aW1lb3V0IC0gZGVsdGEsMSkpOworICAgICAgICAgICAgICAgICAgICB9Y2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHgpe30KKyAgICAgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXR1cm5TZW5kZXIoRGF0YVNlbmRlciBzZW5kZXIpIHsKKyAgICAgICAgICAgIGlmICggIWlzT3BlbikgeworICAgICAgICAgICAgICAgIHNlbmRlci5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy90byBkbworICAgICAgICAgICAgaW51c2UucmVtb3ZlKHNlbmRlcik7CisgICAgICAgICAgICAvL2p1c3QgaW4gY2FzZSB0aGUgbGltaXQgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgIGlmICggbm90aW51c2Uuc2l6ZSgpIDwgdGhpcy5nZXRMaW1pdCgpICkgbm90aW51c2UuYWRkKHNlbmRlcik7CisgICAgICAgICAgICBlbHNlIHRyeSB7c2VuZGVyLmRpc2Nvbm5lY3QoKTsgfSBjYXRjaCAoIEV4Y2VwdGlvbiBpZ25vcmUpe30KKyAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgeworICAgICAgICAgICAgaXNPcGVuID0gZmFsc2U7CisgICAgICAgICAgICBPYmplY3RbXSB1bnVzZWQgPSBub3RpbnVzZS50b0FycmF5KCk7CisgICAgICAgICAgICBPYmplY3RbXSB1c2VkID0gaW51c2UudG9BcnJheSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bnVzZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBEYXRhU2VuZGVyIHNlbmRlciA9IChEYXRhU2VuZGVyKSB1bnVzZWRbaV07CisgICAgICAgICAgICAgICAgc2VuZGVyLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIH0vL2ZvcgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1c2VkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgRGF0YVNlbmRlciBzZW5kZXIgPSAoRGF0YVNlbmRlcikgdXNlZFtpXTsKKyAgICAgICAgICAgICAgICBzZW5kZXIuZGlzY29ubmVjdCgpOworICAgICAgICAgICAgfS8vZm9yCisgICAgICAgICAgICBub3RpbnVzZS5jbGVhcigpOworICAgICAgICAgICAgaW51c2UuY2xlYXIoKTsKKyAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICAgICAgCisKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG9wZW4oKSB7CisgICAgICAgICAgICBpc09wZW4gPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5KCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9SZWNlaXZlckJhc2UuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvUmVjZWl2ZXJCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5Yjk1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvUmVjZWl2ZXJCYXNlLmphdmEKQEAgLTAsMCArMSwzODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbFJlY2VpdmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lc3NhZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pby5MaXN0ZW5DYWxsYmFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CisKKy8qKgorICogPHA+VGl0bGU6IDwvcD4KKyAqCisgKiA8cD5EZXNjcmlwdGlvbjogPC9wPgorICoKKyAqIDxwPkNvcHlyaWdodDogQ29weXJpZ2h0IChjKSAyMDA1PC9wPgorICoKKyAqIDxwPkNvbXBhbnk6IDwvcD4KKyAqCisgKiBAYXV0aG9yIG5vdCBhdHRyaWJ1dGFibGUKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVjZWl2ZXJCYXNlIGltcGxlbWVudHMgQ2hhbm5lbFJlY2VpdmVyLCBMaXN0ZW5DYWxsYmFjaywgVGhyZWFkUG9vbC5UaHJlYWRDcmVhdG9yIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTl9ESVJFQ1RfQlVGRkVSID0gMHgwMDA0OworCisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyhSZWNlaXZlckJhc2UuY2xhc3MpOworICAgIAorICAgIHByaXZhdGUgTWVzc2FnZUxpc3RlbmVyIGxpc3RlbmVyOworICAgIHByaXZhdGUgU3RyaW5nIGhvc3QgPSAiYXV0byI7CisgICAgcHJpdmF0ZSBJbmV0QWRkcmVzcyBiaW5kOworICAgIHByaXZhdGUgaW50IHBvcnQgID0gNDAwMDsKKyAgICBwcml2YXRlIGludCByeEJ1ZlNpemUgPSA0MzgwMDsKKyAgICBwcml2YXRlIGludCB0eEJ1ZlNpemUgPSAyNTE4ODsKKyAgICBwcml2YXRlIGJvb2xlYW4gbGlzdGVuID0gZmFsc2U7CisgICAgcHJpdmF0ZSBUaHJlYWRQb29sIHBvb2w7CisgICAgcHJpdmF0ZSBib29sZWFuIGRpcmVjdCA9IHRydWU7CisgICAgcHJpdmF0ZSBsb25nIHRjcFNlbGVjdG9yVGltZW91dCA9IDUwMDA7CisgICAgLy9ob3cgbWFueSB0aW1lcyB0byBzZWFyY2ggZm9yIGFuIGF2YWlsYWJsZSBzb2NrZXQKKyAgICBwcml2YXRlIGludCBhdXRvQmluZCA9IDEwOworICAgIHByaXZhdGUgaW50IG1heFRocmVhZHMgPSAxNTsKKyAgICBwcml2YXRlIGludCBtaW5UaHJlYWRzID0gNjsKKyAgICBwcml2YXRlIGJvb2xlYW4gdGNwTm9EZWxheSA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIHNvS2VlcEFsaXZlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG9vQklubGluZSA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIHNvUmV1c2VBZGRyZXNzID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc29MaW5nZXJPbiA9IHRydWU7CisgICAgcHJpdmF0ZSBpbnQgc29MaW5nZXJUaW1lID0gMzsKKyAgICBwcml2YXRlIGludCBzb1RyYWZmaWNDbGFzcyA9IDB4MDQgfCAweDA4IHwgMHgwMTA7CisgICAgcHJpdmF0ZSBpbnQgdGltZW91dCA9IDMwMDA7IC8vMyBzZWNvbmRzCisgICAgcHJpdmF0ZSBib29sZWFuIHVzZUJ1ZmZlclBvb2wgPSB0cnVlOworCisKKyAgICBwdWJsaWMgUmVjZWl2ZXJCYXNlKCkgeworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBnZXRNZXNzYWdlTGlzdGVuZXIKKyAgICAgKgorICAgICAqIEByZXR1cm4gTWVzc2FnZUxpc3RlbmVyCisgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbFJlY2VpdmVyIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlTGlzdGVuZXIgZ2V0TWVzc2FnZUxpc3RlbmVyKCkgeworICAgICAgICByZXR1cm4gbGlzdGVuZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBwb3J0CisgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbFJlY2VpdmVyIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSeEJ1ZlNpemUoKSB7CisgICAgICAgIHJldHVybiByeEJ1ZlNpemU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUeEJ1ZlNpemUoKSB7CisgICAgICAgIHJldHVybiB0eEJ1ZlNpemU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSBnZXRNaW5UaHJlYWRzKCkvZ2V0TWF4VGhyZWFkcygpCisgICAgICogQHJldHVybiBpbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRjcFRocmVhZENvdW50KCkgeworICAgICAgICByZXR1cm4gZ2V0TWluVGhyZWFkcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldE1lc3NhZ2VMaXN0ZW5lcgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIE1lc3NhZ2VMaXN0ZW5lcgorICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxSZWNlaXZlciBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlTGlzdGVuZXIoTWVzc2FnZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUY3BMaXN0ZW5Qb3J0KGludCB0Y3BMaXN0ZW5Qb3J0KSB7CisgICAgICAgIHRoaXMucG9ydCA9IHRjcExpc3RlblBvcnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGNwTGlzdGVuQWRkcmVzcyhTdHJpbmcgdGNwTGlzdGVuSG9zdCkgeworICAgICAgICB0aGlzLmhvc3QgPSB0Y3BMaXN0ZW5Ib3N0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJ4QnVmU2l6ZShpbnQgcnhCdWZTaXplKSB7CisgICAgICAgIHRoaXMucnhCdWZTaXplID0gcnhCdWZTaXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR4QnVmU2l6ZShpbnQgdHhCdWZTaXplKSB7CisgICAgICAgIHRoaXMudHhCdWZTaXplID0gdHhCdWZTaXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRjcFRocmVhZENvdW50KGludCB0Y3BUaHJlYWRDb3VudCkgeworICAgICAgICBzZXRNaW5UaHJlYWRzKHRjcFRocmVhZENvdW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGJpbmQuCisgICAgICovCisgICAgcHVibGljIEluZXRBZGRyZXNzIGdldEJpbmQoKSB7CisgICAgICAgIGlmIChiaW5kID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKCJhdXRvIi5lcXVhbHMoaG9zdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaG9zdCA9IGphdmEubmV0LkluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3RBZGRyZXNzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTdGFydGluZyByZXBsaWNhdGlvbiBsaXN0ZW5lciBvbiBhZGRyZXNzOiIrIGhvc3QpOworICAgICAgICAgICAgICAgIGJpbmQgPSBqYXZhLm5ldC5JbmV0QWRkcmVzcy5nZXRCeU5hbWUoaG9zdCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkZhaWxlZCBiaW5kIHJlcGxpY2F0aW9uIGxpc3RlbmVyIG9uIGFkZHJlc3M6IisgaG9zdCwgaW9lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmluZDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogcmVjdXJzaXZlIGJpbmQgdG8gZmluZCB0aGUgbmV4dCBhdmFpbGFibGUgcG9ydAorICAgICAqIEBwYXJhbSBzb2NrZXQgU2VydmVyU29ja2V0CisgICAgICogQHBhcmFtIHBvcnRzdGFydCBpbnQKKyAgICAgKiBAcGFyYW0gcmV0cmllcyBpbnQKKyAgICAgKiBAcmV0dXJuIGludAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGJpbmQoU2VydmVyU29ja2V0IHNvY2tldCwgaW50IHBvcnRzdGFydCwgaW50IHJldHJpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIGFkZHIgPSBudWxsOworICAgICAgICB3aGlsZSAoIHJldHJpZXMgPiAwICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGdldEJpbmQoKSwgcG9ydHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBzb2NrZXQuYmluZChhZGRyKTsKKyAgICAgICAgICAgICAgICBzZXRUY3BMaXN0ZW5Qb3J0KHBvcnRzdGFydCk7CisgICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlY2VpdmVyIFNlcnZlciBTb2NrZXQgYm91bmQgdG86IithZGRyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH1jYXRjaCAoIElPRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICByZXRyaWVzLS07CisgICAgICAgICAgICAgICAgaWYgKCByZXRyaWVzIDw9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJVbmFibGUgdG8gYmluZCBzZXJ2ZXIgc29ja2V0IHRvOiIrYWRkcisiIHRocm93aW5nIGVycm9yLiIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwb3J0c3RhcnQrKzsKKyAgICAgICAgICAgICAgICB0cnkge1RocmVhZC5zbGVlcCgyNSk7fWNhdGNoKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB0aSl7VGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHRlZCgpO30KKyAgICAgICAgICAgICAgICByZXRyaWVzID0gYmluZChzb2NrZXQscG9ydHN0YXJ0LHJldHJpZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXRyaWVzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlRGF0YVJlY2VpdmVkKENoYW5uZWxNZXNzYWdlIGRhdGEpIHsKKyAgICAgICAgaWYgKCB0aGlzLmxpc3RlbmVyICE9IG51bGwgKSB7CisgICAgICAgICAgICBpZiAoIGxpc3RlbmVyLmFjY2VwdChkYXRhKSApIGxpc3RlbmVyLm1lc3NhZ2VSZWNlaXZlZChkYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldFdvcmtlclRocmVhZE9wdGlvbnMoKSB7CisgICAgICAgIGludCBvcHRpb25zID0gMDsKKyAgICAgICAgaWYgKCBnZXREaXJlY3QoKSApIG9wdGlvbnMgPSBvcHRpb25zIHwgT1BUSU9OX0RJUkVDVF9CVUZGRVI7CisgICAgICAgIHJldHVybiBvcHRpb25zOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQHBhcmFtIGJpbmQgVGhlIGJpbmQgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJpbmQoamF2YS5uZXQuSW5ldEFkZHJlc3MgYmluZCkgeworICAgICAgICB0aGlzLmJpbmQgPSBiaW5kOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRUY3BMaXN0ZW5Qb3J0KCkgeworICAgICAgICByZXR1cm4gdGhpcy5wb3J0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldERpcmVjdCgpIHsKKyAgICAgICAgcmV0dXJuIGRpcmVjdDsKKyAgICB9CisKKworCisgICAgcHVibGljIHZvaWQgc2V0RGlyZWN0KGJvb2xlYW4gZGlyZWN0KSB7CisgICAgICAgIHRoaXMuZGlyZWN0ID0gZGlyZWN0OworICAgIH0KKworCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7CisgICAgICAgIGdldEJpbmQoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuaG9zdDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRUY3BTZWxlY3RvclRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiB0Y3BTZWxlY3RvclRpbWVvdXQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZG9MaXN0ZW4oKSB7CisgICAgICAgIHJldHVybiBsaXN0ZW47CisgICAgfQorCisgICAgcHVibGljIE1lc3NhZ2VMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKKyAgICAgICAgcmV0dXJuIGxpc3RlbmVyOworICAgIH0KKworICAgIHB1YmxpYyBUaHJlYWRQb29sIGdldFBvb2woKSB7CisgICAgICAgIHJldHVybiBwb29sOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGNwTGlzdGVuQWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIGdldEhvc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEF1dG9CaW5kKCkgeworICAgICAgICByZXR1cm4gYXV0b0JpbmQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYXhUaHJlYWRzKCkgeworICAgICAgICByZXR1cm4gbWF4VGhyZWFkczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1pblRocmVhZHMoKSB7CisgICAgICAgIHJldHVybiBtaW5UaHJlYWRzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFRjcE5vRGVsYXkoKSB7CisgICAgICAgIHJldHVybiB0Y3BOb0RlbGF5OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFNvS2VlcEFsaXZlKCkgeworICAgICAgICByZXR1cm4gc29LZWVwQWxpdmU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0T29CSW5saW5lKCkgeworICAgICAgICByZXR1cm4gb29CSW5saW5lOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U29MaW5nZXJPbigpIHsKKyAgICAgICAgcmV0dXJuIHNvTGluZ2VyT247CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTb0xpbmdlclRpbWUoKSB7CisgICAgICAgIHJldHVybiBzb0xpbmdlclRpbWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U29SZXVzZUFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBzb1JldXNlQWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFNvVHJhZmZpY0NsYXNzKCkgeworICAgICAgICByZXR1cm4gc29UcmFmZmljQ2xhc3M7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUaW1lb3V0KCkgeworICAgICAgICByZXR1cm4gdGltZW91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRVc2VCdWZmZXJQb29sKCkgeworICAgICAgICByZXR1cm4gdXNlQnVmZmVyUG9vbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUY3BTZWxlY3RvclRpbWVvdXQobG9uZyBzZWxUaW1lb3V0KSB7CisgICAgICAgIHRjcFNlbGVjdG9yVGltZW91dCA9IHNlbFRpbWVvdXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlzdGVuKGJvb2xlYW4gZG9MaXN0ZW4pIHsKKyAgICAgICAgdGhpcy5saXN0ZW4gPSBkb0xpc3RlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoTWVzc2FnZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2coTG9nIGxvZykgeworICAgICAgICB0aGlzLmxvZyA9IGxvZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQb29sKFRocmVhZFBvb2wgcG9vbCkgeworICAgICAgICB0aGlzLnBvb2wgPSBwb29sOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHBvcnQpIHsKKyAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvQmluZChpbnQgYXV0b0JpbmQpIHsKKyAgICAgICAgdGhpcy5hdXRvQmluZCA9IGF1dG9CaW5kOworICAgICAgICBpZiAoIHRoaXMuYXV0b0JpbmQgPD0gMCApIHRoaXMuYXV0b0JpbmQgPSAxOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1heFRocmVhZHMoaW50IG1heFRocmVhZHMpIHsKKyAgICAgICAgdGhpcy5tYXhUaHJlYWRzID0gbWF4VGhyZWFkczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNaW5UaHJlYWRzKGludCBtaW5UaHJlYWRzKSB7CisgICAgICAgIHRoaXMubWluVGhyZWFkcyA9IG1pblRocmVhZHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGNwTm9EZWxheShib29sZWFuIHRjcE5vRGVsYXkpIHsKKyAgICAgICAgdGhpcy50Y3BOb0RlbGF5ID0gdGNwTm9EZWxheTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTb0tlZXBBbGl2ZShib29sZWFuIHNvS2VlcEFsaXZlKSB7CisgICAgICAgIHRoaXMuc29LZWVwQWxpdmUgPSBzb0tlZXBBbGl2ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPb0JJbmxpbmUoYm9vbGVhbiBvb0JJbmxpbmUpIHsKKyAgICAgICAgdGhpcy5vb0JJbmxpbmUgPSBvb0JJbmxpbmU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRTb0xpbmdlck9uKGJvb2xlYW4gc29MaW5nZXJPbikgeworICAgICAgICB0aGlzLnNvTGluZ2VyT24gPSBzb0xpbmdlck9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNvTGluZ2VyVGltZShpbnQgc29MaW5nZXJUaW1lKSB7CisgICAgICAgIHRoaXMuc29MaW5nZXJUaW1lID0gc29MaW5nZXJUaW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNvUmV1c2VBZGRyZXNzKGJvb2xlYW4gc29SZXVzZUFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5zb1JldXNlQWRkcmVzcyA9IHNvUmV1c2VBZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNvVHJhZmZpY0NsYXNzKGludCBzb1RyYWZmaWNDbGFzcykgeworICAgICAgICB0aGlzLnNvVHJhZmZpY0NsYXNzID0gc29UcmFmZmljQ2xhc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dCkgeworICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVzZUJ1ZmZlclBvb2woYm9vbGVhbiB1c2VCdWZmZXJQb29sKSB7CisgICAgICAgIHRoaXMudXNlQnVmZmVyUG9vbCA9IHVzZUJ1ZmZlclBvb2w7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGVhcnRiZWF0KCkgeworICAgICAgICAvL2VtcHR5IG9wZXJhdGlvbgorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L1JlcGxpY2F0aW9uVHJhbnNtaXR0ZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvUmVwbGljYXRpb25UcmFuc21pdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMmE0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L1JlcGxpY2F0aW9uVHJhbnNtaXR0ZXIuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQtMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbFNlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5uaW8uUG9vbGVkUGFyYWxsZWxTZW5kZXI7CisKKy8qKgorICogVHJhbnNtaXQgbWVzc2FnZSB0byBvdGhlciBjbHVzdGVyIG1lbWJlcnMKKyAqIEFjdHVhbCBzZW5kZXJzIGFyZSBjcmVhdGVkIGJhc2VkIG9uIHRoZSByZXBsaWNhdGlvbk1vZGUKKyAqIHR5cGUgCisgKiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBSZXBsaWNhdGlvblRyYW5zbWl0dGVyIGltcGxlbWVudHMgQ2hhbm5lbFNlbmRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIuY2xhc3MpOworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAiUmVwbGljYXRpb25UcmFuc21pdHRlci8zLjAiOworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ01hbmFnZXIgc20gPSBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgCisKKyAgICBwdWJsaWMgUmVwbGljYXRpb25UcmFuc21pdHRlcigpIHsKKyAgICB9CisKKyAgICBwcml2YXRlIE11bHRpUG9pbnRTZW5kZXIgdHJhbnNwb3J0ID0gbmV3IFBvb2xlZFBhcmFsbGVsU2VuZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisgICAgICAgIHJldHVybiAoaW5mbyk7CisgICAgfQorCisgICAgcHVibGljIE11bHRpUG9pbnRTZW5kZXIgZ2V0VHJhbnNwb3J0KCkgeworICAgICAgICByZXR1cm4gdHJhbnNwb3J0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zcG9ydChNdWx0aVBvaW50U2VuZGVyIHRyYW5zcG9ydCkgeworICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwdWJsaWMKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZW5kIGRhdGEgdG8gb25lIG1lbWJlcgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2x1c3RlclNlbmRlciNzZW5kTWVzc2FnZShvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DbHVzdGVyTWVzc2FnZSwgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKENoYW5uZWxNZXNzYWdlIG1lc3NhZ2UsIE1lbWJlcltdIGRlc3RpbmF0aW9uKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIE11bHRpUG9pbnRTZW5kZXIgc2VuZGVyID0gZ2V0VHJhbnNwb3J0KCk7CisgICAgICAgIHNlbmRlci5zZW5kTWVzc2FnZShkZXN0aW5hdGlvbixtZXNzYWdlKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogc3RhcnQgdGhlIHNlbmRlciBhbmQgcmVnaXN0ZXIgdHJhbnNtaXR0ZXIgbWJlYW4KKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNsdXN0ZXJTZW5kZXIjc3RhcnQoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBnZXRUcmFuc3BvcnQoKS5jb25uZWN0KCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBzdG9wIHRoZSBzZW5kZXIgYW5kIGRlcmVnaXN0ZXIgbWJlYW5zICh0cmFuc21pdHRlciwgc2VuZGVycykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNsdXN0ZXJTZW5kZXIjc3RvcCgpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7CisgICAgICAgIGdldFRyYW5zcG9ydCgpLmRpc2Nvbm5lY3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRyYW5zbWl0dGVyIHRvIGNoZWNrIGZvciBzZW5kZXIgc29ja2V0IHN0YXR1cworICAgICAqIAorICAgICAqIEBzZWUgU2ltcGxlVGNwQ2x1c3RlciNiYWNrZ3JvdW5kUHJvY2VzcygpCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBoZWFydGJlYXQoKSB7CisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBuZXcgY2x1c3RlciBtZW1iZXIgYW5kIGNyZWF0ZSBzZW5kZXIgKCBzLiByZXBsaWNhdGlvbk1vZGUpIHRyYW5zZmVyCisgICAgICogY3VycmVudCBwcm9wZXJ0aWVzIHRvIHNlbmRlcgorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2x1c3RlclNlbmRlciNhZGQob3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyKQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoTWVtYmVyIG1lbWJlcikgeworICAgICAgICBnZXRUcmFuc3BvcnQoKS5tZW1iZXJBZGRlZChtZW1iZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZSBzZW5kZXIgZnJvbSB0cmFuc21pdHRlci4gKCBkZXJlZ2lzdGVyIG1iZWFuIGFuZCBkaXNjb25uZWN0IHNlbmRlciApCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DbHVzdGVyU2VuZGVyI3JlbW92ZShvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXIpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZShNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIGdldFRyYW5zcG9ydCgpLm1lbWJlckRpc2FwcGVhcmVkKG1lbWJlcik7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcm90ZWN0ZWQKKworICAgIAorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L1NlbmRlclN0YXRlLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L1NlbmRlclN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlZWJiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvU2VuZGVyU3RhdGUuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisKKy8qKgorICogCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAxLjAKKyAqIEBzaW5jZSA1LjUuMTYKKyAqLworCitwdWJsaWMgY2xhc3MgU2VuZGVyU3RhdGUgeworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVVNQRUNUID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUlMSU5HID0gMjsKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJTZW5kZXJTdGF0ZS8xLjAiOworICAgIAorICAgIAorICAgIHByb3RlY3RlZCBzdGF0aWMgSGFzaE1hcCBtZW1iZXJTdGF0ZXMgPSBuZXcgSGFzaE1hcCgpOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU2VuZGVyU3RhdGUgZ2V0U2VuZGVyU3RhdGUoTWVtYmVyIG1lbWJlcikgeworICAgICAgICByZXR1cm4gZ2V0U2VuZGVyU3RhdGUobWVtYmVyLHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2VuZGVyU3RhdGUgZ2V0U2VuZGVyU3RhdGUoTWVtYmVyIG1lbWJlciwgYm9vbGVhbiBjcmVhdGUpIHsKKyAgICAgICAgU2VuZGVyU3RhdGUgc3RhdGUgPSAoU2VuZGVyU3RhdGUpbWVtYmVyU3RhdGVzLmdldChtZW1iZXIpOworICAgICAgICBpZiAoIHN0YXRlID09IG51bGwgJiYgY3JlYXRlKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtZW1iZXJTdGF0ZXMgKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSAoU2VuZGVyU3RhdGUpbWVtYmVyU3RhdGVzLmdldChtZW1iZXIpOworICAgICAgICAgICAgICAgIGlmICggc3RhdGUgPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBuZXcgU2VuZGVyU3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtYmVyU3RhdGVzLnB1dChtZW1iZXIsc3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVTZW5kZXJTdGF0ZShNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1lbWJlclN0YXRlcyApIHsKKyAgICAgICAgICAgIG1lbWJlclN0YXRlcy5yZW1vdmUobWVtYmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgcHJpdmF0ZSBpbnQgc3RhdGUgPSBSRUFEWTsKKworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorCisgICAgCisgICAgcHJpdmF0ZSBTZW5kZXJTdGF0ZSgpIHsKKyAgICAgICAgdGhpcyhSRUFEWSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZW5kZXJTdGF0ZShpbnQgc3RhdGUpIHsKKyAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N1c3BlY3QoKSB7CisgICAgICAgIHJldHVybiAoc3RhdGUgPT0gU1VTUEVDVCkgfHwgKHN0YXRlID09IEZBSUxJTkcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN1c3BlY3QoKSB7CisgICAgICAgIHN0YXRlID0gU1VTUEVDVDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkeSgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlID09IFJFQURZOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWFkeSgpIHsKKyAgICAgICAgc3RhdGUgPSBSRUFEWTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNGYWlsaW5nKCkgeworICAgICAgICByZXR1cm4gc3RhdGUgPT0gRkFJTElORzsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RmFpbGluZygpIHsKKyAgICAgICAgc3RhdGUgPSBGQUlMSU5HOworICAgIH0KKyAgICAKKworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgUHJvcGVydGllcworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L1RocmVhZFBvb2wuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvVGhyZWFkUG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNWEwMTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L1RocmVhZFBvb2wuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIG5vdCBhdHRyaWJ1dGFibGUKKyAqIEB2ZXJzaW9uIDEuMAorICovCisKK3B1YmxpYyBjbGFzcyBUaHJlYWRQb29sCit7CisgICAgLyoqCisgICAgICogQSB2ZXJ5IHNpbXBsZSB0aHJlYWQgcG9vbCBjbGFzcy4gIFRoZSBwb29sIHNpemUgaXMgc2V0IGF0CisgICAgICogY29uc3RydWN0aW9uIHRpbWUgYW5kIHJlbWFpbnMgZml4ZWQuICBUaHJlYWRzIGFyZSBjeWNsZWQKKyAgICAgKiB0aHJvdWdoIGEgRklGTyBpZGxlIHF1ZXVlLgorICAgICAqLworCisgICAgTGlzdCBpZGxlID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICBMaXN0IHVzZWQgPSBuZXcgTGlua2VkTGlzdCgpOworICAgIAorICAgIE9iamVjdCBtdXRleCA9IG5ldyBPYmplY3QoKTsKKyAgICBib29sZWFuIHJ1bm5pbmcgPSB0cnVlOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudGVyID0gMTsKKyAgICBwcml2YXRlIGludCBtYXhUaHJlYWRzOworICAgIHByaXZhdGUgaW50IG1pblRocmVhZHM7CisgICAgCisgICAgcHJpdmF0ZSBUaHJlYWRDcmVhdG9yIGNyZWF0b3IgPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIGludCBpbmMoKSB7CisgICAgICAgIHJldHVybiBjb3VudGVyKys7CisgICAgfQorCisgICAgCisgICAgcHVibGljIFRocmVhZFBvb2wgKGludCBtYXhUaHJlYWRzLCBpbnQgbWluVGhyZWFkcywgVGhyZWFkQ3JlYXRvciBjcmVhdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZmlsbCB1cCB0aGUgcG9vbCB3aXRoIHdvcmtlciB0aHJlYWRzCisgICAgICAgIHRoaXMubWF4VGhyZWFkcyA9IG1heFRocmVhZHM7CisgICAgICAgIHRoaXMubWluVGhyZWFkcyA9IG1pblRocmVhZHM7CisgICAgICAgIHRoaXMuY3JlYXRvciA9IGNyZWF0b3I7CisgICAgICAgIC8vZm9yIChpbnQgaSA9IDA7IGkgPCBtaW5UaHJlYWRzOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhUaHJlYWRzOyBpKyspIHsgLy90ZW1wb3JhcnkgZml4IGZvciB0aHJlYWQgaGFuZCBvZmYgcHJvYmxlbQorICAgICAgICAgICAgV29ya2VyVGhyZWFkIHRocmVhZCA9IGNyZWF0b3IuZ2V0V29ya2VyVGhyZWFkKCk7CisgICAgICAgICAgICBzZXR1cFRocmVhZCh0aHJlYWQpOworICAgICAgICAgICAgaWRsZS5hZGQgKHRocmVhZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBUaHJlYWQoV29ya2VyVGhyZWFkIHRocmVhZCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRocmVhZCkgeworICAgICAgICAgICAgdGhyZWFkLnNldFBvb2wodGhpcyk7CisgICAgICAgICAgICB0aHJlYWQuc2V0TmFtZSh0aHJlYWQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiWyIgKyBpbmMoKSArICJdIik7CisgICAgICAgICAgICB0aHJlYWQuc2V0RGFlbW9uKHRydWUpOworICAgICAgICAgICAgdGhyZWFkLnNldFByaW9yaXR5KFRocmVhZC5NQVhfUFJJT1JJVFkpOworICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICB0cnkge3RocmVhZC53YWl0KDUwMCk7IH1jYXRjaCAoIEludGVycnVwdGVkRXhjZXB0aW9uIHggKSB7fQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBhbiBpZGxlIHdvcmtlciB0aHJlYWQsIGlmIGFueS4gIENvdWxkIHJldHVybiBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBXb3JrZXJUaHJlYWQgZ2V0V29ya2VyKCkKKyAgICB7CisgICAgICAgIFdvcmtlclRocmVhZCB3b3JrZXIgPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKG11dGV4KSB7CisgICAgICAgICAgICB3aGlsZSAoIHdvcmtlciA9PSBudWxsICYmIHJ1bm5pbmcgKSB7CisgICAgICAgICAgICAgICAgaWYgKGlkbGUuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyID0gKFdvcmtlclRocmVhZCkgaWRsZS5yZW1vdmUoMCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZSBubyBhdmFpbGFibGUgd29ya2VycworICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHVzZWQuc2l6ZSgpIDwgdGhpcy5tYXhUaHJlYWRzICYmIGNyZWF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB3b3JrZXIgPSBjcmVhdG9yLmdldFdvcmtlclRocmVhZCgpOworICAgICAgICAgICAgICAgICAgICBzZXR1cFRocmVhZCh3b3JrZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7IG11dGV4LndhaXQoKTsgfSBjYXRjaCAoIGphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiB4ICkge1RocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0ZWQoKTt9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfS8vd2hpbGUKKyAgICAgICAgICAgIGlmICggd29ya2VyICE9IG51bGwgKSB1c2VkLmFkZCh3b3JrZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAod29ya2VyKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBpZGxlLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIHdvcmtlciB0aHJlYWQgdG8gcmV0dXJuIGl0c2VsZiB0byB0aGUKKyAgICAgKiBpZGxlIHBvb2wuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmV0dXJuV29ya2VyIChXb3JrZXJUaHJlYWQgd29ya2VyKSB7CisgICAgICAgIGlmICggcnVubmluZyApIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobXV0ZXgpIHsKKyAgICAgICAgICAgICAgICB1c2VkLnJlbW92ZSh3b3JrZXIpOworICAgICAgICAgICAgICAgIC8vaWYgKCBpZGxlLnNpemUoKSA8IG1pblRocmVhZHMgJiYgIWlkbGUuY29udGFpbnMod29ya2VyKSkgaWRsZS5hZGQod29ya2VyKTsKKyAgICAgICAgICAgICAgICBpZiAoIGlkbGUuc2l6ZSgpIDwgbWF4VGhyZWFkcyAmJiAhaWRsZS5jb250YWlucyh3b3JrZXIpKSBpZGxlLmFkZCh3b3JrZXIpOyAvL2xldCBtYXggYmUgdGhlIHVwcGVyIGxpbWl0CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmtlci5zZXREb1J1bihmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAod29ya2VyKXt3b3JrZXIubm90aWZ5KCk7fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtdXRleC5ub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgd29ya2VyLnNldERvUnVuKGZhbHNlKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAod29ya2VyKXt3b3JrZXIubm90aWZ5KCk7fQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYXhUaHJlYWRzKCkgeworICAgICAgICByZXR1cm4gbWF4VGhyZWFkczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1pblRocmVhZHMoKSB7CisgICAgICAgIHJldHVybiBtaW5UaHJlYWRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgc3luY2hyb25pemVkIChtdXRleCkgeworICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGlkbGUuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlICggaS5oYXNOZXh0KCkgKSB7CisgICAgICAgICAgICAgICAgV29ya2VyVGhyZWFkIHdvcmtlciA9IChXb3JrZXJUaHJlYWQpaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuV29ya2VyKHdvcmtlcik7CisgICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1heFRocmVhZHMoaW50IG1heFRocmVhZHMpIHsKKyAgICAgICAgdGhpcy5tYXhUaHJlYWRzID0gbWF4VGhyZWFkczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNaW5UaHJlYWRzKGludCBtaW5UaHJlYWRzKSB7CisgICAgICAgIHRoaXMubWluVGhyZWFkcyA9IG1pblRocmVhZHM7CisgICAgfQorCisgICAgcHVibGljIFRocmVhZENyZWF0b3IgZ2V0VGhyZWFkQ3JlYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRvcjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVGhyZWFkQ3JlYXRvciB7CisgICAgICAgIHB1YmxpYyBXb3JrZXJUaHJlYWQgZ2V0V29ya2VyVGhyZWFkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9Xb3JrZXJUaHJlYWQuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvV29ya2VyVGhyZWFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3ZGY4NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvV29ya2VyVGhyZWFkLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uTGlzdGVuQ2FsbGJhY2s7CisKKworCisKKy8qKgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFdvcmtlclRocmVhZCBleHRlbmRzIFRocmVhZCAKK3sKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fRElSRUNUX0JVRkZFUiA9IFJlY2VpdmVyQmFzZS5PUFRJT05fRElSRUNUX0JVRkZFUjsKKyAgICAKKyAgICBwcml2YXRlIExpc3RlbkNhbGxiYWNrIGNhbGxiYWNrOworICAgIHByaXZhdGUgVGhyZWFkUG9vbCBwb29sOworICAgIHByaXZhdGUgYm9vbGVhbiBkb1J1biA9IHRydWU7CisgICAgcHJpdmF0ZSBpbnQgb3B0aW9uczsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VCdWZmZXJQb29sID0gdHJ1ZTsKKworICAgIHB1YmxpYyBXb3JrZXJUaHJlYWQoTGlzdGVuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBvb2woVGhyZWFkUG9vbCBwb29sKSB7CisgICAgICAgIHRoaXMucG9vbCA9IHBvb2w7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3B0aW9ucyhpbnQgb3B0aW9ucykgeworICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrKExpc3RlbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREb1J1bihib29sZWFuIGRvUnVuKSB7CisgICAgICAgIHRoaXMuZG9SdW4gPSBkb1J1bjsKKyAgICB9CisKKyAgICBwdWJsaWMgVGhyZWFkUG9vbCBnZXRQb29sKCkgeworICAgICAgICByZXR1cm4gcG9vbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE9wdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBvcHRpb25zOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0ZW5DYWxsYmFjayBnZXRDYWxsYmFjaygpIHsKKyAgICAgICAgcmV0dXJuIGNhbGxiYWNrOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRG9SdW4oKSB7CisgICAgICAgIHJldHVybiBkb1J1bjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICBkb1J1biA9IGZhbHNlOworICAgICAgICBub3RpZnkoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0VXNlQnVmZmVyUG9vbChib29sZWFuIHVzZWJ1ZnBvb2wpIHsKKyAgICAgICAgdXNlQnVmZmVyUG9vbCA9IHVzZWJ1ZnBvb2w7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGdldFVzZUJ1ZmZlclBvb2woKSB7CisgICAgICAgIHJldHVybiB1c2VCdWZmZXJQb29sOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvYmlvL0Jpb1JlY2VpdmVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L2Jpby9CaW9SZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNGI2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L2Jpby9CaW9SZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuYmlvOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbFJlY2VpdmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLkxpc3RlbkNhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLk9iamVjdFJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuUmVjZWl2ZXJCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5UaHJlYWRQb29sOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5Xb3JrZXJUaHJlYWQ7CisKKy8qKgorICogPHA+VGl0bGU6IDwvcD4KKyAqCisgKiA8cD5EZXNjcmlwdGlvbjogPC9wPgorICoKKyAqIDxwPkNvcHlyaWdodDogQ29weXJpZ2h0IChjKSAyMDA1PC9wPgorICoKKyAqIDxwPkNvbXBhbnk6IDwvcD4KKyAqCisgKiBAYXV0aG9yIG5vdCBhdHRyaWJ1dGFibGUKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgQmlvUmVjZWl2ZXIgZXh0ZW5kcyBSZWNlaXZlckJhc2UgaW1wbGVtZW50cyBSdW5uYWJsZSwgQ2hhbm5lbFJlY2VpdmVyLCBMaXN0ZW5DYWxsYmFjayB7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyhCaW9SZWNlaXZlci5jbGFzcyk7CisKKyAgICBwcm90ZWN0ZWQgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldDsKKworICAgIHB1YmxpYyBCaW9SZWNlaXZlcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsUmVjZWl2ZXIgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0UG9vbChuZXcgVGhyZWFkUG9vbChnZXRNYXhUaHJlYWRzKCksZ2V0TWluVGhyZWFkcygpLHRoaXMpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy5mYXRhbCgiVGhyZWFkUG9vbCBjYW4gaW5pdGlsemVkLiBMaXN0ZW5lciBub3Qgc3RhcnRlZCIsIHgpOworICAgICAgICAgICAgaWYgKCB4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24gKSB0aHJvdyAoSU9FeGNlcHRpb24peDsKKyAgICAgICAgICAgIGVsc2UgdGhyb3cgbmV3IElPRXhjZXB0aW9uKHguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0QmluZCgpOworICAgICAgICAgICAgYmluZCgpOworICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKHRoaXMsICJCaW9SZWNlaXZlciIpOworICAgICAgICAgICAgdC5zZXREYWVtb24odHJ1ZSk7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICBsb2cuZmF0YWwoIlVuYWJsZSB0byBzdGFydCBjbHVzdGVyIHJlY2VpdmVyIiwgeCk7CisgICAgICAgICAgICBpZiAoIHggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbiApIHRocm93IChJT0V4Y2VwdGlvbil4OworICAgICAgICAgICAgZWxzZSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oeC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBXb3JrZXJUaHJlYWQgZ2V0V29ya2VyVGhyZWFkKCkgeworICAgICAgICByZXR1cm4gZ2V0UmVwbGljYXRpb25UaHJlYWQoKTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIEJpb1JlcGxpY2F0aW9uVGhyZWFkIGdldFJlcGxpY2F0aW9uVGhyZWFkKCkgeworICAgICAgICBCaW9SZXBsaWNhdGlvblRocmVhZCByZXN1bHQgPSBuZXcgQmlvUmVwbGljYXRpb25UaHJlYWQodGhpcyk7CisgICAgICAgIHJlc3VsdC5zZXRPcHRpb25zKGdldFdvcmtlclRocmVhZE9wdGlvbnMoKSk7CisgICAgICAgIHJlc3VsdC5zZXRVc2VCdWZmZXJQb29sKHRoaXMuZ2V0VXNlQnVmZmVyUG9vbCgpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxSZWNlaXZlciBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBzZXRMaXN0ZW4oZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5zZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIHggKSB7fQorICAgIH0KKworICAgIAorICAgIAorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGJpbmQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBhbGxvY2F0ZSBhbiB1bmJvdW5kIHNlcnZlciBzb2NrZXQgY2hhbm5lbAorICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7CisgICAgICAgIC8vIHNldCB0aGUgcG9ydCB0aGUgc2VydmVyIGNoYW5uZWwgd2lsbCBsaXN0ZW4gdG8KKyAgICAgICAgLy9zZXJ2ZXJTb2NrZXQuYmluZChuZXcgSW5ldFNvY2tldEFkZHJlc3MoZ2V0QmluZCgpLCBnZXRUY3BMaXN0ZW5Qb3J0KCkpKTsKKyAgICAgICAgYmluZChzZXJ2ZXJTb2NrZXQsZ2V0UG9ydCgpLGdldEF1dG9CaW5kKCkpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsaXN0ZW4oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHJ1biByZXBsaWNhdGlvbiBsaXN0ZW5lci4iLCB4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBsaXN0ZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRvTGlzdGVuKCkpIHsKKyAgICAgICAgICAgIGxvZy53YXJuKCJTZXJ2ZXJTb2NrZXQgYWxyZWFkeSBzdGFydGVkIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2V0TGlzdGVuKHRydWUpOworCisgICAgICAgIHdoaWxlICggZG9MaXN0ZW4oKSApIHsKKyAgICAgICAgICAgIFNvY2tldCBzb2NrZXQgPSBudWxsOworICAgICAgICAgICAgaWYgKCBnZXRQb29sKCkuYXZhaWxhYmxlKCkgPCAxICkgeworICAgICAgICAgICAgICAgIGlmICggbG9nLmlzV2FybkVuYWJsZWQoKSApCisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJBbGwgQklPIHNlcnZlciByZXBsaWNhdGlvbiB0aHJlYWRzIGFyZSBidXN5LCB1bmFibGUgdG8gaGFuZGxlIG1vcmUgcmVxdWVzdHMgdW50aWwgYSB0aHJlYWQgaXMgZnJlZWQgdXAuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCaW9SZXBsaWNhdGlvblRocmVhZCB0aHJlYWQgPSAoQmlvUmVwbGljYXRpb25UaHJlYWQpZ2V0UG9vbCgpLmdldFdvcmtlcigpOworICAgICAgICAgICAgaWYgKCB0aHJlYWQgPT0gbnVsbCApIGNvbnRpbnVlOyAvL3Nob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc29ja2V0ID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgaWYgKCBkb0xpc3RlbigpICkgdGhyb3cgeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggIWRvTGlzdGVuKCkgKSB7CisgICAgICAgICAgICAgICAgdGhyZWFkLnNldERvUnVuKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB0aHJlYWQuc2VydmljZVNvY2tldChudWxsLG51bGwpOworICAgICAgICAgICAgICAgIGJyZWFrOyAvL3JlZ3VsYXIgc2h1dGRvd24KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc29ja2V0ID09IG51bGwgKSBjb250aW51ZTsKKyAgICAgICAgICAgIHNvY2tldC5zZXRSZWNlaXZlQnVmZmVyU2l6ZShnZXRSeEJ1ZlNpemUoKSk7CisgICAgICAgICAgICBzb2NrZXQuc2V0U2VuZEJ1ZmZlclNpemUoZ2V0UnhCdWZTaXplKCkpOworICAgICAgICAgICAgc29ja2V0LnNldFRjcE5vRGVsYXkoZ2V0VGNwTm9EZWxheSgpKTsKKyAgICAgICAgICAgIHNvY2tldC5zZXRLZWVwQWxpdmUoZ2V0U29LZWVwQWxpdmUoKSk7CisgICAgICAgICAgICBzb2NrZXQuc2V0T09CSW5saW5lKGdldE9vQklubGluZSgpKTsKKyAgICAgICAgICAgIHNvY2tldC5zZXRSZXVzZUFkZHJlc3MoZ2V0U29SZXVzZUFkZHJlc3MoKSk7CisgICAgICAgICAgICBzb2NrZXQuc2V0U29MaW5nZXIoZ2V0U29MaW5nZXJPbigpLGdldFNvTGluZ2VyVGltZSgpKTsKKyAgICAgICAgICAgIHNvY2tldC5zZXRUcmFmZmljQ2xhc3MoZ2V0U29UcmFmZmljQ2xhc3MoKSk7CisgICAgICAgICAgICBzb2NrZXQuc2V0U29UaW1lb3V0KGdldFRpbWVvdXQoKSk7CisgICAgICAgICAgICBPYmplY3RSZWFkZXIgcmVhZGVyID0gbmV3IE9iamVjdFJlYWRlcihzb2NrZXQpOworICAgICAgICAgICAgdGhyZWFkLnNlcnZpY2VTb2NrZXQoc29ja2V0LHJlYWRlcik7CisgICAgICAgIH0vL3doaWxlCisgICAgfQorICAgIAorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9iaW8vQmlvUmVwbGljYXRpb25UaHJlYWQuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvYmlvL0Jpb1JlcGxpY2F0aW9uVGhyZWFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2YTRmNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvYmlvL0Jpb1JlcGxpY2F0aW9uVGhyZWFkLmphdmEKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5iaW87CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLk9iamVjdFJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5Xb3JrZXJUaHJlYWQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LlJlY2VpdmVyQmFzZTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pby5MaXN0ZW5DYWxsYmFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pby5DaGFubmVsRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pby5CdWZmZXJQb29sOworCisvKioKKyAqIEEgd29ya2VyIHRocmVhZCBjbGFzcyB3aGljaCBjYW4gZHJhaW4gY2hhbm5lbHMgYW5kIGVjaG8tYmFjayB0aGUgaW5wdXQuIEVhY2gKKyAqIGluc3RhbmNlIGlzIGNvbnN0cnVjdGVkIHdpdGggYSByZWZlcmVuY2UgdG8gdGhlIG93bmluZyB0aHJlYWQgcG9vbCBvYmplY3QuCisgKiBXaGVuIHN0YXJ0ZWQsIHRoZSB0aHJlYWQgbG9vcHMgZm9yZXZlciB3YWl0aW5nIHRvIGJlIGF3YWtlbmVkIHRvIHNlcnZpY2UgdGhlCisgKiBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCBhIFNlbGVjdGlvbktleSBvYmplY3QuIFRoZSB3b3JrZXIgaXMgdGFza2VkIGJ5CisgKiBjYWxsaW5nIGl0cyBzZXJ2aWNlQ2hhbm5lbCgpIG1ldGhvZCB3aXRoIGEgU2VsZWN0aW9uS2V5IG9iamVjdC4gVGhlCisgKiBzZXJ2aWNlQ2hhbm5lbCgpIG1ldGhvZCBzdG9yZXMgdGhlIGtleSByZWZlcmVuY2UgaW4gdGhlIHRocmVhZCBvYmplY3QgdGhlbgorICogY2FsbHMgbm90aWZ5KCkgdG8gd2FrZSBpdCB1cC4gV2hlbiB0aGUgY2hhbm5lbCBoYXMgYmVlbiBkcmFpbmVkLCB0aGUgd29ya2VyCisgKiB0aHJlYWQgcmV0dXJucyBpdHNlbGYgdG8gaXRzIHBhcmVudCBwb29sLgorICogCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiAKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgQmlvUmVwbGljYXRpb25UaHJlYWQgZXh0ZW5kcyBXb3JrZXJUaHJlYWQgeworCisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggQmlvUmVwbGljYXRpb25UaHJlYWQuY2xhc3MgKTsKKyAgICAKKyAgICBwcm90ZWN0ZWQgU29ja2V0IHNvY2tldDsKKyAgICBwcm90ZWN0ZWQgT2JqZWN0UmVhZGVyIHJlYWRlcjsKKyAgICAKKyAgICBwdWJsaWMgQmlvUmVwbGljYXRpb25UaHJlYWQgKExpc3RlbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHN1cGVyKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvLyBsb29wIGZvcmV2ZXIgd2FpdGluZyBmb3Igd29yayB0byBkbworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBydW4oKQorICAgIHsKKyAgICAgICAgdGhpcy5ub3RpZnkoKTsKKyAgICAgICAgd2hpbGUgKGlzRG9SdW4oKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBzbGVlcCBhbmQgcmVsZWFzZSBvYmplY3QgbG9jaworICAgICAgICAgICAgICAgIHRoaXMud2FpdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJUQ1Agd29ya2VyIHRocmVhZCBpbnRlcnJ1cHRlZCBpbiBjbHVzdGVyIixlKTsKKyAgICAgICAgICAgICAgICAvLyBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzCisgICAgICAgICAgICAgICAgVGhyZWFkLmludGVycnVwdGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHNvY2tldCA9PSBudWxsICkgY29udGludWU7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRyYWluU29ja2V0KCk7CisgICAgICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gc2VydmljZSBiaW8gc29ja2V0Iik7CisgICAgICAgICAgICB9ZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHtzb2NrZXQuY2xvc2UoKTt9Y2F0Y2ggKCBFeGNlcHRpb24gaWdub3JlKXt9CisgICAgICAgICAgICAgICAgdHJ5IHtyZWFkZXIuY2xvc2UoKTt9Y2F0Y2ggKCBFeGNlcHRpb24gaWdub3JlKXt9CisgICAgICAgICAgICAgICAgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBzb2NrZXQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZG9uZSwgcmVhZHkgZm9yIG1vcmUsIHJldHVybiB0byBwb29sCisgICAgICAgICAgICBpZiAoIGdldFBvb2woKSAhPSBudWxsICkgZ2V0UG9vbCgpLnJldHVybldvcmtlciAodGhpcyk7CisgICAgICAgICAgICBlbHNlIHNldERvUnVuKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIAorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXJ2aWNlU29ja2V0KFNvY2tldCBzb2NrZXQsIE9iamVjdFJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7CisgICAgICAgIHRoaXMucmVhZGVyID0gcmVhZGVyOworICAgICAgICB0aGlzLm5vdGlmeSgpOwkJLy8gYXdha2VuIHRoZSB0aHJlYWQKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShPYmplY3RSZWFkZXIgcmVhZGVyKSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICBpbnQgcGtnY250ID0gcmVhZGVyLmNvdW50KCk7CisKKyAgICAgICAgaWYgKCBwa2djbnQgPiAwICkgeworICAgICAgICAgICAgQ2hhbm5lbE1lc3NhZ2VbXSBtc2dzID0gcmVhZGVyLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIGZvciAoIGludCBpPTA7IGk8bXNncy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBVc2Ugc2VuZCBhY2sgaGVyZSBpZiB5b3Ugd2FudCB0byBhY2sgdGhlIHJlcXVlc3QgdG8gdGhlIHJlbW90ZSAKKyAgICAgICAgICAgICAgICAgKiBzZXJ2ZXIgYmVmb3JlIGNvbXBsZXRpbmcgdGhlIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIGNvbnNpZGVyZWQgYW4gYXN5bmNocm9uaXplZCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKENoYW5uZWxEYXRhLnNlbmRBY2tBc3luYyhtc2dzW2ldLmdldE9wdGlvbnMoKSkpIHNlbmRBY2soQ29uc3RhbnRzLkFDS19DT01NQU5EKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvL3Byb2Nlc3MgdGhlIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2FsbGJhY2soKS5tZXNzYWdlRGF0YVJlY2VpdmVkKG1zZ3NbaV0pOworICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogVXNlIHNlbmQgYWNrIGhlcmUgaWYgeW91IHdhbnQgdGhlIHJlcXVlc3QgdG8gY29tcGxldGUgb24gdGhpcworICAgICAgICAgICAgICAgICAgICAgKiBzZXJ2ZXIgYmVmb3JlIHNlbmRpbmcgdGhlIGFjayB0byB0aGUgcmVtb3RlIHNlcnZlcgorICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIGNvbnNpZGVyZWQgYSBzeW5jaHJvbml6ZWQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKENoYW5uZWxEYXRhLnNlbmRBY2tTeW5jKG1zZ3NbaV0uZ2V0T3B0aW9ucygpKSkgc2VuZEFjayhDb25zdGFudHMuQUNLX0NPTU1BTkQpOworICAgICAgICAgICAgICAgIH1jYXRjaCAgKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKENoYW5uZWxEYXRhLnNlbmRBY2tTeW5jKG1zZ3NbaV0uZ2V0T3B0aW9ucygpKSkgc2VuZEFjayhDb25zdGFudHMuRkFJTF9BQ0tfQ09NTUFORCk7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXJyb3IgdGhyb3duIGZyb20gbWVzc2FnZURhdGFSZWNlaXZlZC4iLHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIGdldFVzZUJ1ZmZlclBvb2woKSApIHsKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVyUG9vbC5nZXRCdWZmZXJQb29sKCkucmV0dXJuQnVmZmVyKG1zZ3NbaV0uZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnc1tpXS5zZXRNZXNzYWdlKG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWN0dWFsIGNvZGUgd2hpY2ggZHJhaW5zIHRoZSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBnaXZlbiBrZXkuICBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoZSBrZXkgaGFzIGJlZW4KKyAgICAgKiBtb2RpZmllZCBwcmlvciB0byBpbnZvY2F0aW9uIHRvIHR1cm4gb2ZmIHNlbGVjdGlvbgorICAgICAqIGludGVyZXN0IGluIE9QX1JFQUQuICBXaGVuIHRoaXMgbWV0aG9kIGNvbXBsZXRlcyBpdAorICAgICAqIHJlLWVuYWJsZXMgT1BfUkVBRCBhbmQgY2FsbHMgd2FrZXVwKCkgb24gdGhlIHNlbGVjdG9yCisgICAgICogc28gdGhlIHNlbGVjdG9yIHdpbGwgcmVzdW1lIHdhdGNoaW5nIHRoaXMgY2hhbm5lbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkcmFpblNvY2tldCAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgLy8gbG9vcCB3aGlsZSBkYXRhIGF2YWlsYWJsZSwgY2hhbm5lbCBpcyBub24tYmxvY2tpbmcKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICBpbnQgbGVuZ3RoID0gaW4ucmVhZChidWYpOworICAgICAgICB3aGlsZSAoIGxlbmd0aCA+PSAwICkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gcmVhZGVyLmFwcGVuZChidWYsMCxsZW5ndGgsdHJ1ZSk7CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIGV4ZWN1dGUocmVhZGVyKTsKKyAgICAgICAgICAgIGxlbmd0aCA9IGluLnJlYWQoYnVmKTsKKyAgICAgICAgfQorICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqIHNlbmQgYSByZXBseS1hY2tub3dsZWRnZW1lbnQgKDYsMiwzKQorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiBAcGFyYW0gY2hhbm5lbAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlbmRBY2soYnl0ZVtdIGNvbW1hbmQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBvdXQud3JpdGUoY29tbWFuZCk7CisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiQUNLIHNlbnQgdG8gIiArIHNvY2tldC5nZXRQb3J0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoICggamF2YS5pby5JT0V4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgbG9nLndhcm4oIlVuYWJsZSB0byBzZW5kIEFDSyBiYWNrIHRocm91Z2ggY2hhbm5lbCwgY2hhbm5lbCBkaXNjb25uZWN0ZWQ/OiAiK3guZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgc2V0RG9SdW4oZmFsc2UpOworICAgICAgICB0cnkge3NvY2tldC5jbG9zZSgpO31jYXRjaCAoIEV4Y2VwdGlvbiBpZ25vcmUpe30KKyAgICAgICAgdHJ5IHtyZWFkZXIuY2xvc2UoKTt9Y2F0Y2ggKCBFeGNlcHRpb24gaWdub3JlKXt9CisgICAgICAgIHJlYWRlciA9IG51bGw7CisgICAgICAgIHNvY2tldCA9IG51bGw7CisgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9iaW8vQmlvU2VuZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L2Jpby9CaW9TZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Y1ZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9iaW8vQmlvU2VuZGVyLmphdmEKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LmJpbzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5SZW1vdGVQcm9jZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLlhCeXRlQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5BYnN0cmFjdFNlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5EYXRhU2VuZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5TZW5kZXJTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy51dGlsLlN0cmluZ01hbmFnZXI7CisKKy8qKgorICogU2VuZCBjbHVzdGVyIG1lc3NhZ2VzIHdpdGggb25seSBvbmUgc29ja2V0LiBBY2sgYW5kIGtlZXAgQWxpdmUgSGFuZGxpbmcgaXMKKyAqIHN1cHBvcnRlZAorICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDUuNS4xNgorICovCitwdWJsaWMgY2xhc3MgQmlvU2VuZGVyIGV4dGVuZHMgQWJzdHJhY3RTZW5kZXIgaW1wbGVtZW50cyBEYXRhU2VuZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyhCaW9TZW5kZXIuY2xhc3MpOworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0gU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAiRGF0YVNlbmRlci8zLjAiOworCisgICAgCisgICAgLyoqCisgICAgICogY3VycmVudCBzZW5kZXIgc29ja2V0CisgICAgICovCisgICAgcHJpdmF0ZSBTb2NrZXQgc29ja2V0ID0gbnVsbDsKKyAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBzb091dCA9IG51bGw7CisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBzb0luID0gbnVsbDsKKyAgICAKKyAgICBwcm90ZWN0ZWQgWEJ5dGVCdWZmZXIgYWNrYnVmID0gbmV3IFhCeXRlQnVmZmVyKENvbnN0YW50cy5BQ0tfQ09NTUFORC5sZW5ndGgsdHJ1ZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKyAgICAKKyAgICBwdWJsaWMgQmlvU2VuZGVyKCkgIHsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24gYW5kIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworICAgICAgICByZXR1cm4gKGluZm8pOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogQ29ubmVjdCBvdGhlciBjbHVzdGVyIG1lbWJlciByZWNlaXZlciAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5JRGF0YVNlbmRlciNjb25uZWN0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgIHZvaWQgY29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG9wZW5Tb2NrZXQoKTsKKyAgIH0KKworIAorICAgIC8qKgorICAgICAqIGRpc2Nvbm5lY3QgYW5kIGNsb3NlIHNvY2tldAorICAgICAqIAorICAgICAqIEBzZWUgSURhdGFTZW5kZXIjZGlzY29ubmVjdCgpCisgICAgICovCisgICAgcHVibGljICB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIGJvb2xlYW4gY29ubmVjdCA9IGlzQ29ubmVjdGVkKCk7CisgICAgICAgIGNsb3NlU29ja2V0KCk7CisgICAgICAgIGlmIChjb25uZWN0KSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiSURhdGFTZW5kZXIuZGlzY29ubmVjdCIsIGdldEFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpLCBuZXcgSW50ZWdlcihnZXRQb3J0KCkpLCBuZXcgTG9uZygwKSkpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgbWVzc2FnZQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LklEYXRhU2VuZGVyI3NlbmRNZXNzYWdlKCwKKyAgICAgKiAgICAgIENoYW5uZWxNZXNzYWdlKQorICAgICAqLworICAgIHB1YmxpYyAgdm9pZCBzZW5kTWVzc2FnZShieXRlW10gZGF0YSwgYm9vbGVhbiB3YWl0Rm9yQWNrKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBib29sZWFuIG1lc3NhZ2VUcmFuc2ZlcmVkID0gZmFsc2UgOworICAgICAgICBJT0V4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworICAgICAgICBzZXRBdHRlbXB0KDApOworICAgICAgICB0cnkgeworICAgICAgICAgICAgIC8vIGZpcnN0IHRyeSB3aXRoIGV4aXN0aW5nIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICBwdXNoTWVzc2FnZShkYXRhLGZhbHNlLHdhaXRGb3JBY2spOworICAgICAgICAgICAgIG1lc3NhZ2VUcmFuc2ZlcmVkID0gdHJ1ZSA7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIFNlbmRlclN0YXRlLmdldFNlbmRlclN0YXRlKGdldERlc3RpbmF0aW9uKCkpLnNldFN1c3BlY3QoKTsKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IHg7CisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIGxvZy50cmFjZShzbS5nZXRTdHJpbmcoIklEYXRhU2VuZGVyLnNlbmQuYWdhaW4iLCBnZXRBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKSxuZXcgSW50ZWdlcihnZXRQb3J0KCkpKSx4KTsKKyAgICAgICAgICAgIHdoaWxlICggZ2V0QXR0ZW1wdCgpPGdldE1heFJldHJ5QXR0ZW1wdHMoKSApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZXRBdHRlbXB0KGdldEF0dGVtcHQoKSsxKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2Vjb25kIHRyeSB3aXRoIGZyZXNoIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgcHVzaE1lc3NhZ2UoZGF0YSwgdHJ1ZSx3YWl0Rm9yQWNrKTsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVRyYW5zZmVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHh4KSB7CisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IHh4OworICAgICAgICAgICAgICAgICAgICBjbG9zZVNvY2tldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNldFJlcXVlc3RDb3VudChnZXRSZXF1ZXN0Q291bnQoKSsxKTsKKyAgICAgICAgICAgIGtlZXBhbGl2ZSgpOworICAgICAgICAgICAgaWYobWVzc2FnZVRyYW5zZmVyZWQpIHsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIGV4Y2VwdGlvbiAhPSBudWxsICkgdGhyb3cgZXhjZXB0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoaXMgU29ja2VyU2VuZGVyCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIkRhdGFTZW5kZXJbKCIpOworICAgICAgICBidWYuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpLmFwcGVuZCgiKSIpOworICAgICAgICBidWYuYXBwZW5kKGdldEFkZHJlc3MoKSkuYXBwZW5kKCI6IikuYXBwZW5kKGdldFBvcnQoKSkuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKyAKKyAgICAvKioKKyAgICAgKiBvcGVuIHJlYWwgc29ja2V0IGFuZCBzZXQgdGltZSBvdXQgd2hlbiB3YWl0Rm9yQWNrIGlzIGVuYWJsZWQKKyAgICAgKiBpcyBzb2NrZXQgb3BlbiByZXR1cm4gZGlyZWN0bHkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgIHZvaWQgb3BlblNvY2tldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgaWYoaXNDb25uZWN0ZWQoKSkgcmV0dXJuIDsKKyAgICAgICB0cnkgeworICAgICAgICAgICBzb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHNvY2thZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGdldEFkZHJlc3MoKSwgZ2V0UG9ydCgpKTsKKyAgICAgICAgICAgc29ja2V0LmNvbm5lY3Qoc29ja2FkZHIsKGludClnZXRUaW1lb3V0KCkpOworICAgICAgICAgICBzb2NrZXQuc2V0U2VuZEJ1ZmZlclNpemUoZ2V0VHhCdWZTaXplKCkpOworICAgICAgICAgICBzb2NrZXQuc2V0UmVjZWl2ZUJ1ZmZlclNpemUoZ2V0UnhCdWZTaXplKCkpOworICAgICAgICAgICBzb2NrZXQuc2V0U29UaW1lb3V0KCAoaW50KSBnZXRUaW1lb3V0KCkpOworICAgICAgICAgICBzb2NrZXQuc2V0VGNwTm9EZWxheShnZXRUY3BOb0RlbGF5KCkpOworICAgICAgICAgICBzb2NrZXQuc2V0S2VlcEFsaXZlKGdldFNvS2VlcEFsaXZlKCkpOworICAgICAgICAgICBzb2NrZXQuc2V0UmV1c2VBZGRyZXNzKGdldFNvUmV1c2VBZGRyZXNzKCkpOworICAgICAgICAgICBzb2NrZXQuc2V0T09CSW5saW5lKGdldE9vQklubGluZSgpKTsKKyAgICAgICAgICAgc29ja2V0LnNldFNvTGluZ2VyKGdldFNvTGluZ2VyT24oKSxnZXRTb0xpbmdlclRpbWUoKSk7CisgICAgICAgICAgIHNvY2tldC5zZXRUcmFmZmljQ2xhc3MoZ2V0U29UcmFmZmljQ2xhc3MoKSk7CisgICAgICAgICAgIHNldENvbm5lY3RlZCh0cnVlKTsKKyAgICAgICAgICAgc29PdXQgPSBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgIHNvSW4gID0gc29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgIHNldFJlcXVlc3RDb3VudCgwKTsKKyAgICAgICAgICAgc2V0Q29ubmVjdFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJJRGF0YVNlbmRlci5vcGVuU29ja2V0IiwgZ2V0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCksIG5ldyBJbnRlZ2VyKGdldFBvcnQoKSksIG5ldyBMb25nKDApKSk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleDEpIHsKKyAgICAgICAgICBTZW5kZXJTdGF0ZS5nZXRTZW5kZXJTdGF0ZShnZXREZXN0aW5hdGlvbigpKS5zZXRTdXNwZWN0KCk7CisgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJJRGF0YVNlbmRlci5vcGVuU29ja2V0LmZhaWx1cmUiLGdldEFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpLCBuZXcgSW50ZWdlcihnZXRQb3J0KCkpLG5ldyBMb25nKDApKSwgZXgxKTsKKyAgICAgICAgICB0aHJvdyAoZXgxKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgfQorCisgICAgLyoqCisgICAgICogY2xvc2Ugc29ja2V0CisgICAgICogCisgICAgICogQHNlZSBEYXRhU2VuZGVyI2Rpc2Nvbm5lY3QoKQorICAgICAqIEBzZWUgRGF0YVNlbmRlciNjbG9zZVNvY2tldCgpCisgICAgICovCisgICAgcHJvdGVjdGVkICB2b2lkIGNsb3NlU29ja2V0KCkgeworICAgICAgICBpZihpc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgaWYgKHNvY2tldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHNvY2tldCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHNvT3V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgc29JbiA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0UmVxdWVzdENvdW50KDApOworICAgICAgICAgICAgc2V0Q29ubmVjdGVkKGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJJRGF0YVNlbmRlci5jbG9zZVNvY2tldCIsZ2V0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCksIG5ldyBJbnRlZ2VyKGdldFBvcnQoKSksbmV3IExvbmcoMCkpKTsKKyAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHVzaCBtZXNzYWdlcyB3aXRoIG9ubHkgb25lIHNvY2tldCBhdCBhIHRpbWUKKyAgICAgKiBXYWl0IGZvciBhY2sgaXMgbmVlZGVkIGFuZCBtYWtlIGF1dG8gcmV0cnkgd2hlbiB3cml0ZSBtZXNzYWdlIGlzIGZhaWxlZC4KKyAgICAgKiBBZnRlciBzZW5kaW5nIGVycm9yIGNsb3NlIGFuZCByZW9wZW4gc29ja2V0IGFnYWluLgorICAgICAqIAorICAgICAqIEFmdGVyIHN1Y2Nlc3NmdWxsIHNlbmRpbmcgdXBkYXRlIHN0YXRzCisgICAgICogCisgICAgICogV0FSTklORzogU3ViY2xhc3NlcyBtdXN0IGJlIHZlcnkgY2FyZWZ1bGwgdGhhdCBvbmx5IG9uZSB0aHJlYWQgY2FsbCB0aGlzIHB1c2hNZXNzYWdlIGF0IG9uY2UhISEKKyAgICAgKiAKKyAgICAgKiBAc2VlICNjbG9zZVNvY2tldCgpCisgICAgICogQHNlZSAjb3BlblNvY2tldCgpCisgICAgICogQHNlZSAjd3JpdGVEYXRhKENoYW5uZWxNZXNzYWdlKQorICAgICAqIAorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICBkYXRhIHRvIHNlbmQKKyAgICAgKiBAc2luY2UgNS41LjEwCisgICAgICovCisgICAgCisgICAgcHJvdGVjdGVkICB2b2lkIHB1c2hNZXNzYWdlKGJ5dGVbXSBkYXRhLCBib29sZWFuIHJlY29ubmVjdCwgYm9vbGVhbiB3YWl0Rm9yQWNrKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBrZWVwYWxpdmUoKTsKKyAgICAgICAgaWYgKCByZWNvbm5lY3QgKSBjbG9zZVNvY2tldCgpOworICAgICAgICBpZiAoIWlzQ29ubmVjdGVkKCkpIG9wZW5Tb2NrZXQoKTsKKyAgICAgICAgc29PdXQud3JpdGUoZGF0YSk7CisgICAgICAgIHNvT3V0LmZsdXNoKCk7CisgICAgICAgIGlmICh3YWl0Rm9yQWNrKSB3YWl0Rm9yQWNrKCk7CisgICAgICAgIFNlbmRlclN0YXRlLmdldFNlbmRlclN0YXRlKGdldERlc3RpbmF0aW9uKCkpLnNldFJlYWR5KCk7CisKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogV2FpdCBmb3IgQWNrbm93bGVkZ2VtZW50IGZyb20gb3RoZXIgc2VydmVyCisgICAgICogRklYTUUgUGxlYXNlLCBub3Qgd2FpdCBvbmx5IGZvciB0aHJlZSBjaGFyY3RlcnMsIGJldHRlciBjb250cm9sIHRoYXQgdGhlIHdhaXQgYWNrIG1lc3NhZ2UgaXMgY29ycmVjdC4KKyAgICAgKiBAcGFyYW0gdGltZW91dAorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCAgdm9pZCB3YWl0Rm9yQWNrKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9vbGVhbiBhY2tSZWNlaXZlZCA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBmYWlsQWNrUmVjZWl2ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGFja2J1Zi5jbGVhcigpOworICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IDA7CisgICAgICAgICAgICBpbnQgaSA9IHNvSW4ucmVhZCgpOworICAgICAgICAgICAgd2hpbGUgKChpICE9IC0xKSAmJiAoYnl0ZXNSZWFkIDwgQ29uc3RhbnRzLkFDS19DT01NQU5ELmxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICBieXRlc1JlYWQrKzsKKyAgICAgICAgICAgICAgICBieXRlIGQgPSAoYnl0ZSlpOworICAgICAgICAgICAgICAgIGFja2J1Zi5hcHBlbmQoZCk7CisgICAgICAgICAgICAgICAgaWYgKGFja2J1Zi5kb2VzUGFja2FnZUV4aXN0KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBhY2tjbWQgPSBhY2tidWYuZXh0cmFjdERhdGFQYWNrYWdlKHRydWUpLmdldEJ5dGVzKCk7CisgICAgICAgICAgICAgICAgICAgIGFja1JlY2VpdmVkID0gQXJyYXlzLmVxdWFscyhhY2tjbWQsb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LkNvbnN0YW50cy5BQ0tfREFUQSk7CisgICAgICAgICAgICAgICAgICAgIGZhaWxBY2tSZWNlaXZlZCA9IEFycmF5cy5lcXVhbHMoYWNrY21kLG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5Db25zdGFudHMuRkFJTF9BQ0tfREFUQSk7CisgICAgICAgICAgICAgICAgICAgIGFja1JlY2VpdmVkID0gYWNrUmVjZWl2ZWQgfHwgZmFpbEFja1JlY2VpdmVkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSA9IHNvSW4ucmVhZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFhY2tSZWNlaXZlZCkgeworICAgICAgICAgICAgICAgIGlmIChpID09IC0xKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oc20uZ2V0U3RyaW5nKCJJRGF0YVNlbmRlci5hY2suZW9mIixnZXRBZGRyZXNzKCksIG5ldyBJbnRlZ2VyKHNvY2tldC5nZXRMb2NhbFBvcnQoKSkpKTsKKyAgICAgICAgICAgICAgICBlbHNlIHRocm93IG5ldyBJT0V4Y2VwdGlvbihzbS5nZXRTdHJpbmcoIklEYXRhU2VuZGVyLmFjay53cm9uZyIsZ2V0QWRkcmVzcygpLCBuZXcgSW50ZWdlcihzb2NrZXQuZ2V0TG9jYWxQb3J0KCkpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBmYWlsQWNrUmVjZWl2ZWQgJiYgZ2V0VGhyb3dPbkZhaWxlZEFjaygpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZVByb2Nlc3NFeGNlcHRpb24oIlJlY2VpdmVkIGEgZmFpbGVkIGFjazpvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuQ29uc3RhbnRzLkZBSUxfQUNLX0RBVEEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24geCkgeworICAgICAgICAgICAgU3RyaW5nIGVycm1zZyA9IHNtLmdldFN0cmluZygiSURhdGFTZW5kZXIuYWNrLm1pc3NpbmciLCBnZXRBZGRyZXNzKCksbmV3IEludGVnZXIoc29ja2V0LmdldExvY2FsUG9ydCgpKSwgbmV3IExvbmcoZ2V0VGltZW91dCgpKSk7CisgICAgICAgICAgICBpZiAoIFNlbmRlclN0YXRlLmdldFNlbmRlclN0YXRlKGdldERlc3RpbmF0aW9uKCkpLmlzUmVhZHkoKSApIHsKKyAgICAgICAgICAgICAgICBTZW5kZXJTdGF0ZS5nZXRTZW5kZXJTdGF0ZShnZXREZXN0aW5hdGlvbigpKS5zZXRTdXNwZWN0KCk7CisgICAgICAgICAgICAgICAgaWYgKCBsb2cuaXNXYXJuRW5hYmxlZCgpICkgbG9nLndhcm4oZXJybXNnLCB4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApbG9nLmRlYnVnKGVycm1zZywgeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYWNrYnVmLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L2Jpby9NdWx0aXBvaW50QmlvU2VuZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L2Jpby9NdWx0aXBvaW50QmlvU2VuZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0NTA4MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvYmlvL011bHRpcG9pbnRCaW9TZW5kZXIuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuYmlvOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uQ2hhbm5lbERhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uWEJ5dGVCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0Lk11bHRpUG9pbnRTZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LkFic3RyYWN0U2VuZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWw7CisKKy8qKgorICogPHA+VGl0bGU6IDwvcD4KKyAqCisgKiA8cD5EZXNjcmlwdGlvbjogPC9wPgorICoKKyAqIDxwPkNvcHlyaWdodDogQ29weXJpZ2h0IChjKSAyMDA1PC9wPgorICoKKyAqIDxwPkNvbXBhbnk6IDwvcD4KKyAqCisgKiBAYXV0aG9yIG5vdCBhdHRyaWJ1dGFibGUKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgTXVsdGlwb2ludEJpb1NlbmRlciBleHRlbmRzIEFic3RyYWN0U2VuZGVyIGltcGxlbWVudHMgTXVsdGlQb2ludFNlbmRlciB7CisgICAgcHVibGljIE11bHRpcG9pbnRCaW9TZW5kZXIoKSB7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBsb25nIHNlbGVjdFRpbWVvdXQgPSAxMDAwOyAKKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCBiaW9TZW5kZXJzID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gYXV0b0Nvbm5lY3Q7CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2VuZE1lc3NhZ2UoTWVtYmVyW10gZGVzdGluYXRpb24sIENoYW5uZWxNZXNzYWdlIG1zZykgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICBieXRlW10gZGF0YSA9IFhCeXRlQnVmZmVyLmNyZWF0ZURhdGFQYWNrYWdlKChDaGFubmVsRGF0YSltc2cpOworICAgICAgICBCaW9TZW5kZXJbXSBzZW5kZXJzID0gc2V0dXBGb3JTZW5kKGRlc3RpbmF0aW9uKTsKKyAgICAgICAgQ2hhbm5lbEV4Y2VwdGlvbiBjeCA9IG51bGw7CisgICAgICAgIGZvciAoIGludCBpPTA7IGk8c2VuZGVycy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VuZGVyc1tpXS5zZW5kTWVzc2FnZShkYXRhLChtc2cuZ2V0T3B0aW9ucygpJkNoYW5uZWwuU0VORF9PUFRJT05TX1VTRV9BQ0spPT1DaGFubmVsLlNFTkRfT1BUSU9OU19VU0VfQUNLKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgaWYgKGN4ID09IG51bGwpIGN4ID0gbmV3IENoYW5uZWxFeGNlcHRpb24oeCk7CisgICAgICAgICAgICAgICAgY3guYWRkRmF1bHR5TWVtYmVyKGRlc3RpbmF0aW9uW2ldLHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjeCE9bnVsbCApIHRocm93IGN4OworICAgIH0KKworCisKKyAgICBwcm90ZWN0ZWQgQmlvU2VuZGVyW10gc2V0dXBGb3JTZW5kKE1lbWJlcltdIGRlc3RpbmF0aW9uKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIENoYW5uZWxFeGNlcHRpb24gY3ggPSBudWxsOworICAgICAgICBCaW9TZW5kZXJbXSByZXN1bHQgPSBuZXcgQmlvU2VuZGVyW2Rlc3RpbmF0aW9uLmxlbmd0aF07CisgICAgICAgIGZvciAoIGludCBpPTA7IGk8ZGVzdGluYXRpb24ubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEJpb1NlbmRlciBzZW5kZXIgPSAoQmlvU2VuZGVyKSBiaW9TZW5kZXJzLmdldChkZXN0aW5hdGlvbltpXSk7CisgICAgICAgICAgICAgICAgaWYgKHNlbmRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRlciA9IG5ldyBCaW9TZW5kZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZGVyLnRyYW5zZmVyUHJvcGVydGllcyh0aGlzLHNlbmRlcik7CisgICAgICAgICAgICAgICAgICAgIHNlbmRlci5zZXREZXN0aW5hdGlvbihkZXN0aW5hdGlvbltpXSk7CisgICAgICAgICAgICAgICAgICAgIGJpb1NlbmRlcnMucHV0KGRlc3RpbmF0aW9uW2ldLCBzZW5kZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBzZW5kZXI7CisgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRbaV0uaXNDb25uZWN0ZWQoKSApIHJlc3VsdFtpXS5jb25uZWN0KCk7CisgICAgICAgICAgICAgICAgcmVzdWx0W2ldLmtlZXBhbGl2ZSgpOworICAgICAgICAgICAgfWNhdGNoIChFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGN4PT0gbnVsbCApIGN4ID0gbmV3IENoYW5uZWxFeGNlcHRpb24oeCk7CisgICAgICAgICAgICAgICAgY3guYWRkRmF1bHR5TWVtYmVyKGRlc3RpbmF0aW9uW2ldLHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICggY3ghPW51bGwgKSB0aHJvdyBjeDsKKyAgICAgICAgZWxzZSByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvL2RvIG5vdGhpbmcsIHdlIGNvbm5lY3Qgb24gZGVtYW5kCisgICAgICAgIHNldENvbm5lY3RlZCh0cnVlKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiAgeworICAgICAgICBDaGFubmVsRXhjZXB0aW9uIHggPSBudWxsOworICAgICAgICBPYmplY3RbXSBtZW1iZXJzID0gYmlvU2VuZGVycy5rZXlTZXQoKS50b0FycmF5KCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxtZW1iZXJzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgTWVtYmVyIG1iciA9IChNZW1iZXIpbWVtYmVyc1tpXTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQmlvU2VuZGVyIHNlbmRlciA9IChCaW9TZW5kZXIpYmlvU2VuZGVycy5nZXQobWJyKTsKKyAgICAgICAgICAgICAgICBzZW5kZXIuZGlzY29ubmVjdCgpOworICAgICAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIGUgKSB7CisgICAgICAgICAgICAgICAgaWYgKCB4ID09IG51bGwgKSB4ID0gbmV3IENoYW5uZWxFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgeC5hZGRGYXVsdHlNZW1iZXIobWJyLGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmlvU2VuZGVycy5yZW1vdmUobWJyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHggIT0gbnVsbCApIHRocm93IHg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWVtYmVyQWRkZWQoTWVtYmVyIG1lbWJlcikgeworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWVtYmVyRGlzYXBwZWFyZWQoTWVtYmVyIG1lbWJlcikgeworICAgICAgICAvL2Rpc2Nvbm5lY3Qgc2VuZGVycworICAgICAgICBCaW9TZW5kZXIgc2VuZGVyID0gKEJpb1NlbmRlciliaW9TZW5kZXJzLnJlbW92ZShtZW1iZXIpOworICAgICAgICBpZiAoIHNlbmRlciAhPSBudWxsICkgc2VuZGVyLmRpc2Nvbm5lY3QoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNjb25uZWN0KCkgeworICAgICAgICB0cnkge2Nsb3NlKCk7IH1jYXRjaCAoRXhjZXB0aW9uIHgpe30KKyAgICAgICAgc2V0Q29ubmVjdGVkKGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmaW5hbGl6ZSgpIHsKKyAgICAgICAgdHJ5IHtkaXNjb25uZWN0KCk7IH1jYXRjaCAoIEV4Y2VwdGlvbiBpZ25vcmUpe30KKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGtlZXBhbGl2ZSgpIHsKKyAgICAgICAgLy90aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCBQYXJhbGxlbEJpb1NlbmRlci5jaGVja0tlZXBBbGl2ZSgpIG5vdCBpbXBsZW1lbnRlZCIpOworICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOworICAgICAgICBNYXAuRW50cnlbXSBlbnRyaWVzID0gKE1hcC5FbnRyeVtdKWJpb1NlbmRlcnMuZW50cnlTZXQoKS50b0FycmF5KG5ldyBNYXAuRW50cnlbYmlvU2VuZGVycy5zaXplKCldKTsKKyAgICAgICAgZm9yICggaW50IGk9MDsgaTxlbnRyaWVzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgQmlvU2VuZGVyIHNlbmRlciA9IChCaW9TZW5kZXIpZW50cmllc1tpXS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKCBzZW5kZXIua2VlcGFsaXZlKCkgKSB7CisgICAgICAgICAgICAgICAgYmlvU2VuZGVycy5yZW1vdmUoZW50cmllc1tpXS5nZXRLZXkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L2Jpby9Qb29sZWRNdWx0aVNlbmRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9iaW8vUG9vbGVkTXVsdGlTZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWY1YTM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9iaW8vUG9vbGVkTXVsdGlTZW5kZXIuamF2YQpAQCAtMCwwICsxLDY3IEBACitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5iaW87CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuRGF0YVNlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuUG9vbGVkU2VuZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5NdWx0aVBvaW50U2VuZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxNZXNzYWdlOworCisvKioKKyAqIDxwPlRpdGxlOiA8L3A+CisgKgorICogPHA+RGVzY3JpcHRpb246IDwvcD4KKyAqCisgKiA8cD5Db3B5cmlnaHQ6IENvcHlyaWdodCAoYykgMjAwNTwvcD4KKyAqCisgKiA8cD5Db21wYW55OiA8L3A+CisgKgorICogQGF1dGhvciBub3QgYXR0cmlidXRhYmxlCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIFBvb2xlZE11bHRpU2VuZGVyIGV4dGVuZHMgUG9vbGVkU2VuZGVyIHsKKyAgICAKKworICAgIHB1YmxpYyBQb29sZWRNdWx0aVNlbmRlcigpIHsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoTWVtYmVyW10gZGVzdGluYXRpb24sIENoYW5uZWxNZXNzYWdlIG1zZykgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICBNdWx0aVBvaW50U2VuZGVyIHNlbmRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZW5kZXIgPSAoTXVsdGlQb2ludFNlbmRlcilnZXRTZW5kZXIoKTsKKyAgICAgICAgICAgIGlmIChzZW5kZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENoYW5uZWxFeGNlcHRpb24gY3ggPSBuZXcgQ2hhbm5lbEV4Y2VwdGlvbigiVW5hYmxlIHRvIHJldHJpZXZlIGEgZGF0YSBzZW5kZXIsIHRpbWUgb3V0IGVycm9yLiIpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzdGluYXRpb24ubGVuZ3RoOyBpKyspIGN4LmFkZEZhdWx0eU1lbWJlcihkZXN0aW5hdGlvbltpXSwgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJVbmFibGUgdG8gcmV0cmlldmUgYSBzZW5kZXIgZnJvbSB0aGUgc2VuZGVyIHBvb2wiKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgY3g7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbmRlci5zZW5kTWVzc2FnZShkZXN0aW5hdGlvbiwgbXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlbmRlci5rZWVwYWxpdmUoKTsKKyAgICAgICAgfWZpbmFsbHkgeworICAgICAgICAgICAgaWYgKCBzZW5kZXIgIT0gbnVsbCApIHJldHVyblNlbmRlcihzZW5kZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0TmV3RGF0YVNlbmRlcgorICAgICAqCisgICAgICogQHJldHVybiBEYXRhU2VuZGVyCisgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LlBvb2xlZFNlbmRlcgorICAgICAqICAgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIERhdGFTZW5kZXIgZ2V0TmV3RGF0YVNlbmRlcigpIHsKKyAgICAgICAgTXVsdGlwb2ludEJpb1NlbmRlciBzZW5kZXIgPSBuZXcgTXVsdGlwb2ludEJpb1NlbmRlcigpOworICAgICAgICBzZW5kZXIudHJhbnNmZXJQcm9wZXJ0aWVzKHRoaXMsc2VuZGVyKTsKKyAgICAgICAgcmV0dXJuIHNlbmRlcjsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIG1lbWJlckFkZGVkKE1lbWJlciBtZW1iZXIpIHsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgLy9kaXNjb25uZWN0IHNlbmRlcnMKKyAgICB9IAorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9iaW8vdXRpbC9GYXN0UXVldWUuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvYmlvL3V0aWwvRmFzdFF1ZXVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2NzQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvYmlvL3V0aWwvRmFzdFF1ZXVlLmphdmEKQEAgLTAsMCArMSwzOTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5iaW8udXRpbDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuSW50ZXJjZXB0b3JQYXlsb2FkOworCisKKworLyoqCisgKiBBIGZhc3QgcXVldWUgdGhhdCByZW1vdmVyIHRocmVhZCBsb2NrIHRoZSBhZGRlciB0aHJlYWQuIDxici8+TGltaXQgdGhlIHF1ZXVlCisgKiBsZW5ndGggd2hlbiB5b3UgaGF2ZSBzdHJhbmdlIHByb2R1Y2VyIHRocmVhZCBwcm9ibGVtZXMuCisgKiAKKyAqIEZJWE1FIGFkZCBpMThuIHN1cHBvcnQgdG8gbG9nIG1lc3NhZ2VzCisgKiBAYXV0aG9yIFJhaW5lciBKdW5nCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgRmFzdFF1ZXVlIHsKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyhGYXN0UXVldWUuY2xhc3MpOworCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgYWN0dWFsIHF1ZXVlCisgICAgICovCisgICAgcHJpdmF0ZSBTaW5nbGVSZW1vdmVTeW5jaHJvbml6ZWRBZGRMb2NrIGxvY2sgPSBudWxsOworCisgICAgLyoqCisgICAgICogRmlyc3QgT2JqZWN0IGF0IHF1ZXVlIChjb25zdW1lciBtZXNzYWdlKQorICAgICAqLworICAgIHByaXZhdGUgTGlua09iamVjdCBmaXJzdCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBMYXN0IG9iamVjdCBpbiBxdWV1ZSAocHJvZHVjZXIgT2JqZWN0KQorICAgICAqLworICAgIHByaXZhdGUgTGlua09iamVjdCBsYXN0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEN1cnJlbnQgUXVldWUgZWxlbWVudHMgc2l6ZQorICAgICAqLworICAgIHByaXZhdGUgaW50IHNpemUgPSAwOworCisgICAgLyoqCisgICAgICogY2hlY2sgbG9jayB0byBkZXRlY3Qgc3RyYW5nZSB0aHJlYWRpbmdzIHRoaW5ncworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0xvY2sgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIHByb3RvY29sIHRoZSB0aHJlYWQgd2FpdCB0aW1lcworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB0aW1lV2FpdCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBib29sZWFuIGluQWRkID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5SZW1vdmUgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpbk11dGV4ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBsaW1pdCB0aGUgcXVldWUgbGVnbnRoICggZGVmYXVsdCBpcyB1bmxpbWl0ZWQpCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbWF4UXVldWVMZW5ndGggPSAwOworCisgICAgLyoqCisgICAgICogYWRkV2FpdFRpbWVvdXQgZm9yIHByb2R1Y2VyCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIGFkZFdhaXRUaW1lb3V0ID0gMTAwMDBMOworCisgICAgCisgICAgLyoqCisgICAgICogcmVtb3ZlV2FpdFRpbWVvdXQgZm9yIGNvbnN1bWVyCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHJlbW92ZVdhaXRUaW1lb3V0ID0gMzAwMDBMOworCisgICAgLyoqCisgICAgICogZW5hYmxlZCB0aGUgcXVldWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiAgbWF4IHF1ZXVlIHNpemUKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtYXhTaXplID0gMDsKKworICAgIC8qKgorICAgICAqICBhdmcgc2l6ZSBzYW1wbGUgaW50ZXJ2YWwKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzYW1wbGVJbnRlcnZhbCA9IDEwMDsKKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIFF1ZXVlIFNpbmdsZVJlbW92ZVN5bmNocm9uaXplZEFkZExvY2sgYW5kIHNldCBhZGQgYW5kIHdhaXQKKyAgICAgKiBUaW1lb3V0cworICAgICAqLworICAgIHB1YmxpYyBGYXN0UXVldWUoKSB7CisgICAgICAgIGxvY2sgPSBuZXcgU2luZ2xlUmVtb3ZlU3luY2hyb25pemVkQWRkTG9jaygpOworICAgICAgICBsb2NrLnNldEFkZFdhaXRUaW1lb3V0KGFkZFdhaXRUaW1lb3V0KTsKKyAgICAgICAgbG9jay5zZXRSZW1vdmVXYWl0VGltZW91dChyZW1vdmVXYWl0VGltZW91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGN1cnJlbnQgYWRkIHdhaXQgdGltZW91dAorICAgICAqIAorICAgICAqIEByZXR1cm4gY3VycmVudCB3YWl0IHRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRBZGRXYWl0VGltZW91dCgpIHsKKyAgICAgICAgYWRkV2FpdFRpbWVvdXQgPSBsb2NrLmdldEFkZFdhaXRUaW1lb3V0KCk7CisgICAgICAgIHJldHVybiBhZGRXYWl0VGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYWRkIHdhaXQgdGltZW91dCAoZGVmYXVsdCAxMDAwMCBtc2VjKQorICAgICAqIAorICAgICAqIEBwYXJhbSB0aW1lb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWRkV2FpdFRpbWVvdXQobG9uZyB0aW1lb3V0KSB7CisgICAgICAgIGFkZFdhaXRUaW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgbG9jay5zZXRBZGRXYWl0VGltZW91dChhZGRXYWl0VGltZW91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGN1cnJlbnQgcmVtb3ZlIHdhaXQgdGltZW91dAorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIHRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRSZW1vdmVXYWl0VGltZW91dCgpIHsKKyAgICAgICAgcmVtb3ZlV2FpdFRpbWVvdXQgPSBsb2NrLmdldFJlbW92ZVdhaXRUaW1lb3V0KCk7CisgICAgICAgIHJldHVybiByZW1vdmVXYWl0VGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgcmVtb3ZlIHdhaXQgdGltZW91dCAoIGRlZmF1bHQgMzAwMDAgbXNlYykKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGltZW91dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbW92ZVdhaXRUaW1lb3V0KGxvbmcgdGltZW91dCkgeworICAgICAgICByZW1vdmVXYWl0VGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgIGxvY2suc2V0UmVtb3ZlV2FpdFRpbWVvdXQocmVtb3ZlV2FpdFRpbWVvdXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBNYXggUXVldWUgbGVuZ3RoCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy51dGlsLklRdWV1ZSNnZXRNYXhRdWV1ZUxlbmd0aCgpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhRdWV1ZUxlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1heFF1ZXVlTGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1heFF1ZXVlTGVuZ3RoKGludCBsZW5ndGgpIHsKKyAgICAgICAgbWF4UXVldWVMZW5ndGggPSBsZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gZW5hYmxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIGVuYWJsZWQgPSBlbmFibGU7CisgICAgICAgIGlmICghZW5hYmxlZCkgeworICAgICAgICAgICAgbG9jay5hYm9ydFJlbW92ZSgpOworICAgICAgICAgICAgbGFzdCA9IGZpcnN0ID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2hlY2tMb2NrLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tMb2NrKCkgeworICAgICAgICByZXR1cm4gY2hlY2tMb2NrOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBjaGVja0xvY2sgVGhlIGNoZWNrTG9jayB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tMb2NrKGJvb2xlYW4gY2hlY2tMb2NrKSB7CisgICAgICAgIHRoaXMuY2hlY2tMb2NrID0gY2hlY2tMb2NrOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIG1heCBzaXplCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhTaXplKCkgeworICAgICAgICByZXR1cm4gbWF4U2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heFNpemUoaW50IHNpemUpIHsKKyAgICAgICAgbWF4U2l6ZSA9IHNpemU7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogdW5sb2NrIHF1ZXVlIGZvciBuZXh0IGFkZCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmxvY2tBZGQoKSB7CisgICAgICAgIGxvY2sudW5sb2NrQWRkKHNpemUgPiAwID8gdHJ1ZSA6IGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB1bmxvY2sgcXVldWUgZm9yIG5leHQgcmVtb3ZlIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVubG9ja1JlbW92ZSgpIHsKKyAgICAgICAgbG9jay51bmxvY2tSZW1vdmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzdGFydCBxdWV1aW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIHNldEVuYWJsZWQodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc3RhcnQgcXVldWluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHNldEVuYWJsZWQoZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgcHVibGljIFNpbmdsZVJlbW92ZVN5bmNocm9uaXplZEFkZExvY2sgZ2V0TG9jaygpIHsKKyAgICAgICAgcmV0dXJuIGxvY2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIG5ldyBkYXRhIHRvIHRoZSBxdWV1ZQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbC5JUXVldWUjYWRkKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCisgICAgICogRklYTUUgZXh0cmFjdCBzb21lIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFkZChDaGFubmVsTWVzc2FnZSBtc2csIE1lbWJlcltdIGRlc3RpbmF0aW9uLCBJbnRlcmNlcHRvclBheWxvYWQgcGF5bG9hZCkgeworICAgICAgICBib29sZWFuIG9rID0gdHJ1ZTsKKyAgICAgICAgbG9uZyB0aW1lID0gMDsKKworICAgICAgICBpZiAoIWVuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJGYXN0UXVldWUuYWRkOiBxdWV1ZSBkaXNhYmxlZCwgYWRkIGFib3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aW1lV2FpdCkgeworICAgICAgICAgICAgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB9CisgICAgICAgIGxvY2subG9ja0FkZCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJGYXN0UXVldWUuYWRkOiBzdGFydGluZyB3aXRoIHNpemUgIiArIHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoZWNrTG9jaykgeworICAgICAgICAgICAgICAgIGlmIChpbkFkZCkKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkZhc3RRdWV1ZS5hZGQ6IERldGVjdGVkIG90aGVyIGFkZCIpOworICAgICAgICAgICAgICAgIGluQWRkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoaW5NdXRleCkKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkZhc3RRdWV1ZS5hZGQ6IERldGVjdGVkIG90aGVyIG11dGV4IGluIGFkZCIpOworICAgICAgICAgICAgICAgIGluTXV0ZXggPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKG1heFF1ZXVlTGVuZ3RoID4gMCkgJiYgKHNpemUgPj0gbWF4UXVldWVMZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJGYXN0UXVldWUuYWRkOiBDb3VsZCBub3QgYWRkLCBzaW5jZSBxdWV1ZSBpcyBmdWxsICgiICsgc2l6ZSArICI+PSIgKyBtYXhRdWV1ZUxlbmd0aCArICIpIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMaW5rT2JqZWN0IGVsZW1lbnQgPSBuZXcgTGlua09iamVjdChtc2csZGVzdGluYXRpb24sIHBheWxvYWQpOworICAgICAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBsYXN0ID0gZWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRmFzdFF1ZXVlLmFkZDogQ291bGQgbm90IGFkZCwgc2luY2UgbGFzdCBpcyBudWxsIGFsdGhvdWdoIHNpemUgaXMgIisgc2l6ZSArICIgKD4wKSIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdC5hcHBlbmQoZWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gZWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkZhc3RRdWV1ZS5hZGQ6IGZpcnN0IGlzIG51bGwsIHNpemUgaXMgIiArIHNpemUgKyAiIGF0IGVuZCBvZiBhZGQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkZhc3RRdWV1ZS5hZGQ6IGxhc3QgaXMgbnVsbCwgc2l6ZSBpcyAiICsgc2l6ZSsgIiBhdCBlbmQgb2YgYWRkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaGVja0xvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAoIWluTXV0ZXgpIGxvZy53YXJuKCJGYXN0UXVldWUuYWRkOiBDYW5jZWxsZWQgYnkgb3RoZXIgbXV0ZXggaW4gYWRkIik7CisgICAgICAgICAgICAgICAgaW5NdXRleCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmICghaW5BZGQpIGxvZy53YXJuKCJGYXN0UXVldWUuYWRkOiBDYW5jZWxsZWQgYnkgb3RoZXIgYWRkIik7CisgICAgICAgICAgICAgICAgaW5BZGQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgbG9nLnRyYWNlKCJGYXN0UXVldWUuYWRkOiBhZGQgZW5kaW5nIHdpdGggc2l6ZSAiICsgc2l6ZSk7CisKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrQWRkKHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUgdGhlIGNvbXBsZXRlIHF1ZXVlZCBvYmplY3QgbGlzdAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbC5JUXVldWUjcmVtb3ZlKCkKKyAgICAgKiBGSVhNRSBleHRyYWN0IHNvbWUgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIExpbmtPYmplY3QgcmVtb3ZlKCkgeworICAgICAgICBMaW5rT2JqZWN0IGVsZW1lbnQ7CisgICAgICAgIGJvb2xlYW4gZ290TG9jazsKKyAgICAgICAgbG9uZyB0aW1lID0gMDsKKworICAgICAgICBpZiAoIWVuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJGYXN0UXVldWUucmVtb3ZlOiBxdWV1ZSBkaXNhYmxlZCwgcmVtb3ZlIGFib3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRpbWVXYWl0KSB7CisgICAgICAgICAgICB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIH0KKyAgICAgICAgZ290TG9jayA9IGxvY2subG9ja1JlbW92ZSgpOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBpZiAoIWdvdExvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJGYXN0UXVldWUucmVtb3ZlOiBSZW1vdmUgYWJvcnRlZCBhbHRob3VnaCBxdWV1ZSBlbmFibGVkIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiRmFzdFF1ZXVlLnJlbW92ZTogcXVldWUgZGlzYWJsZWQsIHJlbW92ZSBhYm9ydGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cudHJhY2UoIkZhc3RRdWV1ZS5yZW1vdmU6IHJlbW92ZSBzdGFydGluZyB3aXRoIHNpemUgIiArIHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoZWNrTG9jaykgeworICAgICAgICAgICAgICAgIGlmIChpblJlbW92ZSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkZhc3RRdWV1ZS5yZW1vdmU6IERldGVjdGVkIG90aGVyIHJlbW92ZSIpOworICAgICAgICAgICAgICAgIGluUmVtb3ZlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoaW5NdXRleCkKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkZhc3RRdWV1ZS5yZW1vdmU6IERldGVjdGVkIG90aGVyIG11dGV4IGluIHJlbW92ZSIpOworICAgICAgICAgICAgICAgIGluTXV0ZXggPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbGVtZW50ID0gZmlyc3Q7CisKKyAgICAgICAgICAgIGZpcnN0ID0gbGFzdCA9IG51bGw7CisgICAgICAgICAgICBzaXplID0gMDsKKworICAgICAgICAgICAgaWYgKGNoZWNrTG9jaykgeworICAgICAgICAgICAgICAgIGlmICghaW5NdXRleCkKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkZhc3RRdWV1ZS5yZW1vdmU6IENhbmNlbGxlZCBieSBvdGhlciBtdXRleCBpbiByZW1vdmUiKTsKKyAgICAgICAgICAgICAgICBpbk11dGV4ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKCFpblJlbW92ZSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkZhc3RRdWV1ZS5yZW1vdmU6IENhbmNlbGxlZCBieSBvdGhlciByZW1vdmUiKTsKKyAgICAgICAgICAgICAgICBpblJlbW92ZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJGYXN0UXVldWUucmVtb3ZlOiByZW1vdmUgZW5kaW5nIHdpdGggc2l6ZSAiICsgc2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aW1lV2FpdCkgeworICAgICAgICAgICAgICAgIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrUmVtb3ZlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L2Jpby91dGlsL0xpbmtPYmplY3QuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvYmlvL3V0aWwvTGlua09iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMWMxZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L2Jpby91dGlsL0xpbmtPYmplY3QuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LmJpby51dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuRXJyb3JIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5JbnRlcmNlcHRvclBheWxvYWQ7CisKKy8qKgorICogVGhlIGNsYXNzIDxiPkxpbmtPYmplY3Q8L2I+IGltcGxlbWVudHMgYW4gZWxlbWVudAorICogZm9yIGEgbGlua2VkIGxpc3QsIGNvbnNpc3Rpbmcgb2YgYSBnZW5lcmFsCisgKiBkYXRhIG9iamVjdCBhbmQgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGVsZW1lbnQuCisgKgorICogQGF1dGhvciBSYWluZXIgSnVuZworICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKworICovCisKK3B1YmxpYyBjbGFzcyBMaW5rT2JqZWN0IHsKKworICAgIHByaXZhdGUgQ2hhbm5lbE1lc3NhZ2UgbXNnOworICAgIHByaXZhdGUgTGlua09iamVjdCBuZXh0OworICAgIHByaXZhdGUgYnl0ZVtdIGtleSA7CisgICAgcHJpdmF0ZSBNZW1iZXJbXSBkZXN0aW5hdGlvbjsKKyAgICBwcml2YXRlIEludGVyY2VwdG9yUGF5bG9hZCBwYXlsb2FkOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGVsZW1lbnQgZnJvbSB0aGUgZGF0YSBvYmplY3QuCisgICAgICogU2V0cyB0aGUgcG9pbnRlciB0byBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBUaGUga2V5CisgICAgICogQHBhcmFtIHBheWxvYWQgVGhlIGRhdGEgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBMaW5rT2JqZWN0KENoYW5uZWxNZXNzYWdlIG1zZywgTWVtYmVyW10gZGVzdGluYXRpb24sIEludGVyY2VwdG9yUGF5bG9hZCBwYXlsb2FkKSB7CisgICAgICAgIHRoaXMubXNnID0gbXNnOworICAgICAgICB0aGlzLm5leHQgPSBudWxsOworICAgICAgICB0aGlzLmtleSA9IG1zZy5nZXRVbmlxdWVJZCgpOworICAgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkOworICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuZXh0IGVsZW1lbnQuCisgICAgICogQHBhcmFtIG5leHQgVGhlIG5leHQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBlbmQoTGlua09iamVjdCBuZXh0KSB7CisgICAgICAgIHRoaXMubmV4dCA9IG5leHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuZXh0IGVsZW1lbnQuCisgICAgICogQHJldHVybiBUaGUgbmV4dCBlbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBMaW5rT2JqZWN0IG5leHQoKSB7CisgICAgICAgIHJldHVybiBuZXh0OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXROZXh0KExpbmtPYmplY3QgbmV4dCkgeworICAgICAgICB0aGlzLm5leHQgPSBuZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGF0YSBvYmplY3QgZnJvbSB0aGUgZWxlbWVudC4KKyAgICAgKiBAcmV0dXJuIFRoZSBkYXRhIG9iamVjdCBmcm9tIHRoZSBlbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBDaGFubmVsTWVzc2FnZSBkYXRhKCkgeworICAgICAgICByZXR1cm4gbXNnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdW5pcXVlIG1lc3NhZ2UgaWQKKyAgICAgKiBAcmV0dXJuIHRoZSB1bmlxdWUgbWVzc2FnZSBpZAorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0S2V5KCkgeworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIHB1YmxpYyBFcnJvckhhbmRsZXIgZ2V0SGFuZGxlcigpIHsKKyAgICAgICAgcmV0dXJuIHBheWxvYWQhPW51bGw/cGF5bG9hZC5nZXRFcnJvckhhbmRsZXIoKTpudWxsOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlcmNlcHRvclBheWxvYWQgZ2V0UGF5bG9hZCgpIHsKKyAgICAgICAgcmV0dXJuIHBheWxvYWQ7CisgICAgfQorCisgICAgcHVibGljIE1lbWJlcltdIGdldERlc3RpbmF0aW9uKCkgeworICAgICAgICByZXR1cm4gZGVzdGluYXRpb247CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L2Jpby91dGlsL1NpbmdsZVJlbW92ZVN5bmNocm9uaXplZEFkZExvY2suamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvYmlvL3V0aWwvU2luZ2xlUmVtb3ZlU3luY2hyb25pemVkQWRkTG9jay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4Y2EyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L2Jpby91dGlsL1NpbmdsZVJlbW92ZVN5bmNocm9uaXplZEFkZExvY2suamF2YQpAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LmJpby51dGlsOworCisvKioKKyAqIFRoZSBjbGFzcyA8Yj5TaW5nbGVSZW1vdmVTeW5jaHJvbml6ZWRBZGRMb2NrPC9iPiBpbXBsZW1lbnQgbG9ja2luZyBmb3IgYWNjZXNzaW5nIHRoZSBxdWV1ZQorICogYnkgYSBzaW5nbGUgcmVtb3ZlIHRocmVhZCBhbmQgbXVsdGlwbGUgYWRkIHRocmVhZHMuCisgKgorICogQSB0aHJlYWQgaXMgb25seSBhbGxvd2VkIHRvIGJlIGVpdGhlciB0aGUgcmVtb3ZlIG9yCisgKiBhbiBhZGQgdGhyZWFkLgorICoKKyAqIFRoZSBsb2NrIGNhbiBlaXRoZXIgYmUgb3duZWQgYnkgdGhlIHJlbW92ZSB0aHJlYWQKKyAqIG9yIGJ5IGEgc2luZ2xlIGFkZCB0aHJlYWQuCisgKgorICogSWYgdGhlIHJlbW92ZSB0aHJlYWQgdHJpZXMgdG8gZ2V0IHRoZSBsb2NrLAorICogYnV0IHRoZSBxdWV1ZSBpcyBlbXB0eSwgaXQgd2lsbCBibG9jayAocG9sbCkKKyAqIHVudGlsIGFuIGFkZCB0aHJlYWRzIGFkZHMgYW4gZW50cnkgdG8gdGhlIHF1ZXVlIGFuZAorICogcmVsZWFzZXMgdGhlIGxvY2suCisgKiAKKyAqIElmIHRoZSByZW1vdmUgdGhyZWFkIGFuZCBhZGQgdGhyZWFkcyBjb21wZXRlIGZvcgorICogdGhlIGxvY2sgYW5kIGFuIGFkZCB0aHJlYWQgcmVsZWFzZXMgdGhlIGxvY2ssIHRoZW4KKyAqIHRoZSByZW1vdmUgdGhyZWFkIHdpbGwgZ2V0IHRoZSBsb2NrIGZpcnN0LgorICoKKyAqIFRoZSByZW1vdmUgdGhyZWFkIHJlbW92ZXMgYWxsIGVudHJpZXMgaW4gdGhlIHF1ZXVlCisgKiBhdCBvbmNlIGFuZCBwcm9jZWVzZXMgdGhlbSB3aXRob3V0IGZ1cnRoZXIKKyAqIHBvbGxpbmcgdGhlIHF1ZXVlLgorICoKKyAqIFRoZSBsb2NrIGlzIG5vdCByZWVudHJhbnQsIGluIHRoZSBzZW5zZSwgdGhhdCBhbGwKKyAqIHRocmVhZHMgbXVzdCByZWxlYXNlIGFuIG93bmVkIGxvY2sgYmVmb3JlIGNvbXBldGluZworICogZm9yIHRoZSBsb2NrIGFnYWluIQorICoKKyAqIEBhdXRob3IgUmFpbmVyIEp1bmcKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uIDEuMQorICovCisgCitwdWJsaWMgY2xhc3MgU2luZ2xlUmVtb3ZlU3luY2hyb25pemVkQWRkTG9jayB7CisgICAgCisgICAgcHVibGljIFNpbmdsZVJlbW92ZVN5bmNocm9uaXplZEFkZExvY2soKSB7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTaW5nbGVSZW1vdmVTeW5jaHJvbml6ZWRBZGRMb2NrKGJvb2xlYW4gZGF0YUF2YWlsYWJsZSkgeworICAgICAgICB0aGlzLmRhdGFBdmFpbGFibGU9ZGF0YUF2YWlsYWJsZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhyZWFkcworICAgICAqIHdhaXRpbmcgZm9yIGFuIGFkZCBsb2NrIGFyZSB3b2tlbiB1cC4KKyAgICAgKiBUaGlzIGlzIHVzZWQgYXMgYSBzYWZldHkgbWVhc3VyZSBpbiBjYXNlCisgICAgICogdGhyZWFkIG5vdGlmaWNhdGlvbiB2aWEgdGhlIHVubG9jayBtZXRob2RzCisgICAgICogaGFzIGEgYnVnLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBhZGRXYWl0VGltZW91dCA9IDEwMDAwTDsKKworICAgIC8qKgorICAgICAqIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIHRocmVhZHMKKyAgICAgKiB3YWl0aW5nIGZvciBhIHJlbW92ZSBsb2NrIGFyZSB3b2tlbiB1cC4KKyAgICAgKiBUaGlzIGlzIHVzZWQgYXMgYSBzYWZldHkgbWVhc3VyZSBpbiBjYXNlCisgICAgICogdGhyZWFkIG5vdGlmaWNhdGlvbiB2aWEgdGhlIHVubG9jayBtZXRob2RzCisgICAgICogaGFzIGEgYnVnLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyByZW1vdmVXYWl0VGltZW91dCA9IDMwMDAwTDsKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IHJlbW92ZSB0aHJlYWQuCisgICAgICogSXQgaXMgc2V0IHRvIHRoZSByZW1vdmUgdGhyZWFkIHBvbGxpbmcgZm9yIGVudHJpZXMuCisgICAgICogSXQgaXMgcmVzZXQgdG8gbnVsbCB3aGVuIHRoZSByZW1vdmUgdGhyZWFkCisgICAgICogcmVsZWFzZXMgdGhlIGxvY2sgYW5kIHByb2NlZWRzIHByb2Nlc3NpbmcKKyAgICAgKiB0aGUgcmVtb3ZlZCBlbnRyaWVzLgorICAgICAqLworICAgIHByaXZhdGUgVGhyZWFkIHJlbW92ZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogQSBmbGFnIGluZGljYXRpbmcsIGlmIGFuIGFkZCB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYWRkTG9ja2VkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBBIGZsYWcgaW5kaWNhdGluZywgaWYgdGhlIHJlbW92ZSB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlTG9ja2VkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBBIGZsYWcgaW5kaWNhdGluZywgaWYgdGhlIHJlbW92ZSB0aHJlYWQgaXMgYWxsb3dlZAorICAgICAqIHRvIHdhaXQgZm9yIHRoZSBsb2NrLiBUaGUgZmxhZyBpcyBzZXQgdG8gZmFsc2UsIHdoZW4gYWJvcnRpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZUVuYWJsZWQgPSB0cnVlOworCisgICAgLyoqCisgICAgICogQSBmbGFnIGluZGljYXRpbmcsIGlmIHRoZSByZW1vdmVyIG5lZWRzIHBvbGxpbmcuCisgICAgICogSXQgaW5kaWNhdGVzLCBpZiB0aGUgbG9ja2VkIG9iamVjdCBoYXMgZGF0YSBhdmFpbGFibGUKKyAgICAgKiB0byBiZSByZW1vdmVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkYXRhQXZhaWxhYmxlID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIGFkZFdhaXRUaW1lb3V0CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldEFkZFdhaXRUaW1lb3V0KCkgeworICAgICAgICByZXR1cm4gYWRkV2FpdFRpbWVvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHZhbHVlIG9mIGFkZFdhaXRUaW1lb3V0CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEFkZFdhaXRUaW1lb3V0KGxvbmcgdGltZW91dCkgeworICAgICAgICBhZGRXYWl0VGltZW91dCA9IHRpbWVvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBWYWx1ZSBvZiByZW1vdmVXYWl0VGltZW91dAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRSZW1vdmVXYWl0VGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIHJlbW92ZVdhaXRUaW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB2YWx1ZSBvZiByZW1vdmVXYWl0VGltZW91dAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRSZW1vdmVXYWl0VGltZW91dChsb25nIHRpbWVvdXQpIHsKKyAgICAgICAgcmVtb3ZlV2FpdFRpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBsb2NrZWQgb2JqZWN0IGhhcyBkYXRhIGF2YWlsYWJsZQorICAgICAqIGkuZS4gdGhlIHJlbW92ZXIgY2FuIHN0b3AgcG9saW5nIGFuZCBnZXQgdGhlIGxvY2suCisgICAgICogQHJldHVybiBUcnVlIGlmZiB0aGUgbG9jayBPYmplY3QgaGFzIGRhdGEgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0RhdGFBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBkYXRhQXZhaWxhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIGFuIGFkZCB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWZmIGFuIGFkZCB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBZGRMb2NrZWQoKSB7CisgICAgICAgIHJldHVybiBhZGRMb2NrZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIHJlbW92ZSB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWZmIHRoZSByZW1vdmUgdGhyZWFkIG93bnMgdGhlIGxvY2suCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzUmVtb3ZlTG9ja2VkKCkgeworICAgICAgICByZXR1cm4gcmVtb3ZlTG9ja2VkOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSByZW1vdmUgdGhyZWFkIGlzIHBvbGxpbmcuCisgICAgICogQHJldHVybiBUcnVlIGlmZiB0aGUgcmVtb3ZlIHRocmVhZCBpcyBwb2xsaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1JlbW92ZVBvbGxpbmcoKSB7CisgICAgICAgIGlmICggcmVtb3ZlciAhPSBudWxsICkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjcXVpcmVzIHRoZSBsb2NrIGJ5IGFuIGFkZCB0aHJlYWQgYW5kIHNldHMgdGhlIGFkZCBmbGFnLgorICAgICAqIElmIGFueSBhZGQgdGhyZWFkIG9yIHRoZSByZW1vdmUgdGhyZWFkIGFscmVhZHkgYWNxdWlyZWQgdGhlIGxvY2sKKyAgICAgKiB0aGlzIGFkZCB0aHJlYWQgd2lsbCBibG9jayB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbG9ja0FkZCgpIHsKKyAgICAgICAgaWYgKCBhZGRMb2NrZWQgfHwgcmVtb3ZlTG9ja2VkICkgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdhaXQoYWRkV2FpdFRpbWVvdXQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlICkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdGVkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoIGFkZExvY2tlZCB8fCByZW1vdmVMb2NrZWQgKTsKKyAgICAgICAgfQorICAgICAgICBhZGRMb2NrZWQ9dHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY3F1aXJlcyB0aGUgbG9jayBieSB0aGUgcmVtb3ZlIHRocmVhZCBhbmQgc2V0cyB0aGUgcmVtb3ZlIGZsYWcuCisgICAgICogSWYgYW55IGFkZCB0aHJlYWQgYWxyZWFkeSBhY3F1aXJlZCB0aGUgbG9jayBvciB0aGUgcXVldWUgaXMKKyAgICAgKiBlbXB0eSwgdGhlIHJlbW92ZSB0aHJlYWQgd2lsbCBibG9jayB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZAorICAgICAqIGFuZCB0aGUgcXVldWUgaXMgbm90IGVtcHR5LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBsb2NrUmVtb3ZlKCkgeworICAgICAgICByZW1vdmVMb2NrZWQ9ZmFsc2U7CisgICAgICAgIHJlbW92ZUVuYWJsZWQ9dHJ1ZTsKKyAgICAgICAgaWYgKCAoIGFkZExvY2tlZCB8fCAhIGRhdGFBdmFpbGFibGUgKSAmJiByZW1vdmVFbmFibGVkICkgeworICAgICAgICAgICAgcmVtb3Zlcj1UaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdhaXQocmVtb3ZlV2FpdFRpbWVvdXQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlICkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdGVkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoICggYWRkTG9ja2VkIHx8ICEgZGF0YUF2YWlsYWJsZSApICYmIHJlbW92ZUVuYWJsZWQgKTsKKyAgICAgICAgICAgIHJlbW92ZXI9bnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHJlbW92ZUVuYWJsZWQgKSB7CisgICAgICAgICAgICByZW1vdmVMb2NrZWQ9dHJ1ZTsKKyAgICAgICAgfSAKKyAgICAgICAgcmV0dXJuIHJlbW92ZUxvY2tlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyB0aGUgbG9jayBieSBhbiBhZGQgdGhyZWFkIGFuZCByZXNldCB0aGUgcmVtb3ZlIGZsYWcuCisgICAgICogSWYgdGhlIHJlYWRlciB0aHJlYWQgaXMgcG9sbGluZywgbm90aWZ5IGl0LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB1bmxvY2tBZGQoYm9vbGVhbiBkYXRhQXZhaWxhYmxlKSB7CisgICAgICAgIGFkZExvY2tlZD1mYWxzZTsKKyAgICAgICAgdGhpcy5kYXRhQXZhaWxhYmxlPWRhdGFBdmFpbGFibGU7CisgICAgICAgIGlmICggKCByZW1vdmVyICE9IG51bGwgKSAmJiAoIGRhdGFBdmFpbGFibGUgfHwgISByZW1vdmVFbmFibGVkICkgKSB7CisgICAgICAgICAgICByZW1vdmVyLmludGVycnVwdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbm90aWZ5QWxsKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyB0aGUgbG9jayBieSB0aGUgcmVtb3ZlIHRocmVhZCBhbmQgcmVzZXQgdGhlIGFkZCBmbGFnLgorICAgICAqIE5vdGlmeSBhbGwgd2FpdGluZyBhZGQgdGhyZWFkcywKKyAgICAgKiB0aGF0IHRoZSBsb2NrIGhhcyBiZWVuIHJlbGVhc2VkIGJ5IHRoZSByZW1vdmUgdGhyZWFkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB1bmxvY2tSZW1vdmUoKSB7CisgICAgICAgIHJlbW92ZUxvY2tlZD1mYWxzZTsKKyAgICAgICAgZGF0YUF2YWlsYWJsZT1mYWxzZTsKKyAgICAgICAgbm90aWZ5QWxsKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWJvcnQgYW55IHBvbGxpbmcgcmVtb3ZlciB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWJvcnRSZW1vdmUoKSB7CisgICAgICAgIHJlbW92ZUVuYWJsZWQ9ZmFsc2U7CisgICAgICAgIGlmICggcmVtb3ZlciAhPSBudWxsICkgeworICAgICAgICAgICAgcmVtb3Zlci5pbnRlcnJ1cHQoKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3Yjg2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSw4MzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgbWJlYW5zLWRlc2NyaXB0b3JzIFBVQkxJQworICAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9EVEQgTW9kZWwgTUJlYW5zIENvbmZpZ3VyYXRpb24gRmlsZSIKKyAgICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvZHRkcy9tYmVhbnMtZGVzY3JpcHRvcnMuZHRkIj4KKzxtYmVhbnMtZGVzY3JpcHRvcnM+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iU2ltcGxlVGNwQ2x1c3RlciIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IlRjcCBDbHVzdGVyIGltcGxlbWVudGF0aW9uIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iQ2x1c3RlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5TaW1wbGVUY3BDbHVzdGVyIj4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iaW5mbyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2xhc3MgdmVyc2lvbiBpbmZvIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5vdGlmeUxpZmVjeWNsZUxpc3RlbmVyT25GYWlsdXJlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJub3RpZnkgbGlmZWN5Y2xlTGlzdGVuZXIgZnJvbSBtZXNzYWdlIHRyYW5zZmVyIGZhaWx1cmUiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+ICAgICAgICAgICAgICAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY2x1c3Rlck5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Im5hbWUgb2YgY2x1c3RlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYW5hZ2VyQ2xhc3NOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZXNzaW9uIG1hbmFuYWdlciBjbGFzc25hbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY2x1c3RlckxvZ05hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik5hbWUgb2YgY2x1c3RlciB0cmFuc2ZlciBsb2cgZGV2aWNlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRvQ2x1c3RlckxvZyIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgZGVzY3JpcHRpb249ImVuYWJsZSBjbHVzdGVyIGxvZyB0cmFuc2ZlciBsb2dnaW5nIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InNldFByb3BlcnR5IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InNldCBhIHByb3BlcnR5IHRvIGFsbCBjbHVzdGVyIG1hbmFnZXJzICh3aXRoIHByZWZpeCAnbWFuYWdlci4nKSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImtleSIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlByb3BlcnR5IG5hbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJQcm9wZXJ0eSB2YWx1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InNlbmQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZCBtZXNzYWdlIHRvIGFsbCBjbHVzdGVyIG1lbWJlcnMiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJtZXNzYWdlIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0icmVwbGljYXRpb24gbWVzc2FnZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlIi8+CisgICAgPC9vcGVyYXRpb24+CisgICAgCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InNlbmRDbHVzdGVyRG9tYWluIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InNlbmQgbWVzc2FnZSB0byBhbGwgY2x1c3RlciBtZW1iZXJzIHdpdGggc2FtZSBkb21haW4iCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJtZXNzYWdlIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0icmVwbGljYXRpb24gbWVzc2FnZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlIi8+CisgICAgPC9vcGVyYXRpb24+CisgICAgICAgIAorICAgIDxvcGVyYXRpb24gICBuYW1lPSJzZW5kVG9NZW1iZXIiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZCBtZXNzYWdlIHRvIG9uZSBjbHVzdGVyIG1lbWJlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lc3NhZ2UiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJyZXBsaWNhdGlvbiBtZXNzYWdlIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLi5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lbWJlciIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249ImNsdXN0ZXIgbWVtYmVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0ic3RhcnQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhcnQgdGhlIGNsdXN0ZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdG9wIHRoZSBjbHVzdGVyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgCisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iQ2x1c3RlclJlY2VpdmVyQmFzZSIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IlRjcCBDbHVzdGVyIE5pb1JlY2VpdmVyIGltcGxlbWVudGF0aW9uIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iQ2x1c3RlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5DbHVzdGVyUmVjZWl2ZXJCYXNlIj4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iaW5mbyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2xhc3MgdmVyc2lvbiBpbmZvIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InRjcExpc3RlbkFkZHJlc3MiCisgICAgICAgICAgZGVzY3JpcHRpb249InRjcCBsaXN0ZW5lciBhZGRyZXNzIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InRjcExpc3RlblBvcnQiCisgICAgICAgICAgZGVzY3JpcHRpb249InRjcCBsaXN0ZW5lciBwb3J0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idGNwVGhyZWFkQ291bnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiB0Y3AgbGlzdGVuZXIgd29ya2VyIHRocmVhZHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0Y3BTZWxlY3RvclRpbWVvdXQiCisgICAgICAgICAgZGVzY3JpcHRpb249InRjcCBsaXN0ZW5lciBTZWxlY3RvciB0aW1lb3V0IgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5yT2ZNc2dzUmVjZWl2ZWQiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIG90aGVyIG5vZGVzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlY2VpdmVkVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0idG90YWwgdGltZSBtZXNzYWdlIHNlbmQgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyZWNlaXZlZFByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJyZWNlaXZlZCBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWluUmVjZWl2ZWRQcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWluaW1hbCByZWNlaXZlZCBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXZnUmVjZWl2ZWRQcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icmVjZWl2ZWQgcHJvY2Vzc2luZyB0aW1lIC8gbnJPZlJlcXVlc3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJkb3VibGUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4UmVjZWl2ZWRQcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWF4aW1hbCByZWNlaXZlZCBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZG9SZWNlaXZlZFByb2Nlc3NpbmdTdGF0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY3JlYXRlIHJlY2VpdmVkIHByb2Nlc3NpbmcgdGltZSBzdGF0cyIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+ICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhdmdUb3RhbFJlY2VpdmVkQnl0ZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249InJlY2VpdmVkIHRvdGFsUmVjZWl2ZWRCeXRlcyAvIG5yT2ZNc2dzUmVjZWl2ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idG90YWxSZWNlaXZlZEJ5dGVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic2VuZEFjayIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZCBhY2sgYWZ0ZXIgZGF0YSByZWNlaXZlZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbXByZXNzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJkYXRhIHJlY2VpdmVkIGNvbXByZXNzZWQiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkb0xpc3RlbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iaXMgcG9ydCByZWFsbHkgc3RhcnRlZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgIAorCTxvcGVyYXRpb24gbmFtZT0icmVzZXRTdGF0aXN0aWNzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJlc2V0IGFsbCBzdGF0aXN0aWNzIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4JCisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0ic3RhcnQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhcnQgdGhlIGNsdXN0ZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdG9wIHRoZSBjbHVzdGVyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgCisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iU29ja2V0UmVwbGljYXRpb25MaXN0ZW5lciIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IlRjcCBDbHVzdGVyIFNvY2tldFJlcGxpY2F0aW9uTGlzdGVuZXIgaW1wbGVtZW50YXRpb24iCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJDbHVzdGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlNvY2tldFJlcGxpY2F0aW9uTGlzdGVuZXIiPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJpbmZvIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDbGFzcyB2ZXJzaW9uIGluZm8iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idGNwTGlzdGVuQWRkcmVzcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0idGNwIGxpc3RlbmVyIGFkZHJlc3MiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idGNwTGlzdGVuUG9ydCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0idGNwIGxpc3RlbmVyIHBvcnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0Y3BMaXN0ZW5NYXhQb3J0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXggdGNwIGxpc3RlbiB1c2VkIHBvcnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0Y3BMaXN0ZW5UaW1lb3V0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXggdGNwIGxpc3RlbiB0aW1lb3V0IChzZWMpIHdhaXQgZm9yIFNlcnZlclNvY2tldCBzdGFydCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+ICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJuck9mTXNnc1JlY2VpdmVkIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2YgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSBvdGhlciBub2RlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyZWNlaXZlZFRpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InRvdGFsIHRpbWUgbWVzc2FnZSBzZW5kIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVjZWl2ZWRQcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icmVjZWl2ZWQgcHJvY2Vzc2luZyB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1pblJlY2VpdmVkUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1pbmltYWwgcmVjZWl2ZWQgcHJvY2Vzc2luZyB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImF2Z1JlY2VpdmVkUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InJlY2VpdmVkIHByb2Nlc3NpbmcgdGltZSAvIG5yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iZG91YmxlIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heFJlY2VpdmVkUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1heGltYWwgcmVjZWl2ZWQgcHJvY2Vzc2luZyB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRvUmVjZWl2ZWRQcm9jZXNzaW5nU3RhdHMiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNyZWF0ZSByZWNlaXZlZCBwcm9jZXNzaW5nIHRpbWUgc3RhdHMiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIiAvPiAgICAgICAgICAgICAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXZnVG90YWxSZWNlaXZlZEJ5dGVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJyZWNlaXZlZCB0b3RhbFJlY2VpdmVkQnl0ZXMgLyBuck9mTXNnc1JlY2VpdmVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InRvdGFsUmVjZWl2ZWRCeXRlcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNlbmRBY2siCisgICAgICAgICAgZGVzY3JpcHRpb249InNlbmQgYWNrIGFmdGVyIGRhdGEgcmVjZWl2ZWQiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbXByZXNzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJkYXRhIHJlY2VpdmVkIGNvbXByZXNzZWQiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRvTGlzdGVuIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJpcyBwb3J0IHJlYWxseSBzdGFydGVkIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICAgCisJPG9wZXJhdGlvbiBuYW1lPSJyZXNldFN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVzZXQgYWxsIHN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgkKKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJzdGFydCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdGFydCB0aGUgY2x1c3RlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisgICAgCisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0b3AgdGhlIGNsdXN0ZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorICAgICAgICAgICAgICAgICAKKyAgPC9tYmVhbj4KKyAgCisgIDxtYmVhbiAgICAgICAgIG5hbWU9IlJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRjcCByZXBsaWNhdGlvbiB0cmFuc21pdHRlciIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IkNsdXN0ZXJTZW5kZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25UcmFuc21pdHRlciI+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImluZm8iCisgICAgICAgICAgZGVzY3JpcHRpb249IkNsYXNzIHZlcnNpb24gaW5mbyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyZXBsaWNhdGlvbk1vZGUiCisgICAgICAgICAgZGVzY3JpcHRpb249InJlcGxpY2F0aW9uIG1vZGUgKHN5bmNobm91cyxwb29sZWQuYXN5bmNobm91cyxmYXN0YXN5bmNxdWV1ZSkiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWNrVGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWNrbm93bGVkZ2UgdGltZW91dCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhdXRvQ29ubmVjdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iaXMgc2VuZGVyIGRpc2FibGVkLCBmb3JrIGEgbmV3IHNvY2tldCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9IndhaXRGb3JBY2siCisgICAgICAgICAgZGVzY3JpcHRpb249IldhaXQgZm9yIGFjayBhZnRlciBkYXRhIHNlbmQiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGluZyBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWluUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1pbmltYWwgc2VuZGluZyBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXZnUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InByb2Nlc3NpbmcgdGltZSAvIG5yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iZG91YmxlIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heFByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXhpbWFsIHNlbmRpbmcgcHJvY2Vzc2luZyB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRvVHJhbnNtaXR0ZXJQcm9jZXNzaW5nU3RhdHMiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNyZWF0ZSBwcm9jZXNzaW5nIHRpbWUgc3RhdHMiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIiAvPiAgICAgICAgICAgICAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibnJPZlJlcXVlc3RzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2Ygc2VuZCBtZXNzYWdlcyB0byBvdGhlciBtZW1iZXJzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InRvdGFsQnl0ZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBieXRlcyB0cmFuc2ZlcmVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImZhaWx1cmVDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2Ygd3JvbmcgdHJhbnNmZXJzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisJPGF0dHJpYnV0ZSBuYW1lPSJzZW5kZXJPYmplY3ROYW1lcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJnZXQgYWxsIHNlbmRlciBvYmplY3QgbmFtZXMiCisgICAgICAgICAgICAgICB0eXBlPSJbTGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsiCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InN0YXJ0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0YXJ0IHRoZSBjbHVzdGVyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4gICAgCisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0b3AgdGhlIGNsdXN0ZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCTxvcGVyYXRpb24gbmFtZT0icmVzZXRTdGF0aXN0aWNzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJlc2V0IGFsbCBzdGF0aXN0aWNzIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4JCisJPG9wZXJhdGlvbiBuYW1lPSJjaGVja0tlZXBBbGl2ZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDaGVjayBhbGwgc2VuZGVyIGNvbm5lY3Rpb24gZm9yIGNsb3NlIHNvY2tldCAoa2VlcGFsaXZlKSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iQXN5bmNTb2NrZXRTZW5kZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IkFzeW5jIENsdXN0ZXIgU2VuZGVyIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iSURhdGFTZW5kZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuQXN5bmNTb2NrZXRTZW5kZXIiPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJpbmZvIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDbGFzcyB2ZXJzaW9uIGluZm8iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWRkcmVzcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGVyIGlwIGFkZHJlc3MiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubmV0LkluZXRBZGRyZXNzIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InBvcnQiCisgICAgICAgICAgZGVzY3JpcHRpb249InNlbmRlciBwb3J0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InN1c3BlY3QiCisgICAgICAgICAgZGVzY3JpcHRpb249IlNvY2tldCBpcyBnb25lIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9IndhaXRGb3JBY2siCisgICAgICAgICAgZGVzY3JpcHRpb249IldhaXQgZm9yIGFjayBhZnRlciBkYXRhIHNlbmQiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImFja1RpbWVvdXQiCisgICAgICAgICAgZGVzY3JpcHRpb249ImFja25vd2xlZGdlIHRpbWVvdXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4gICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhdmdNZXNzYWdlU2l6ZSIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYXZnIG1lc3NhZ2Ugc2l6ZSAodG90YWxieXRlcy9uck9mUmVxdWVzdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icXVldWVTaXplIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJxdWV1ZSBzaXplIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icXVldWVkTnJPZkJ5dGVzIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2YgYnl0ZXMgb3ZlciBhbGwgcXVldWVkIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1lc3NhZ2VUcmFuc2ZlclN0YXJ0ZWQiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1lc3NhZ2UgaXMgaW4gdHJhbnNmZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtlZXBBbGl2ZVRpbWVvdXQiCisgICAgICAgICAgZGVzY3JpcHRpb249ImFjdGl2ZSBzb2NrZXQga2VlcCBhbGl2ZSB0aW1lb3V0IgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWF4IHJlcXVlc3Qgb3ZlciB0aGlzIHNvY2tldCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtlZXBBbGl2ZUNvdW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJrZWVwIEFsaXZlIHJlcXVlc3QgY291bnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJrZWVwQWxpdmVDb25uZWN0VGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29ubmVjdCB0aW1lIGZvciBrZWVwIGFsaXZlIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlc2VuZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWZ0ZXIgc2VuZCBmYWlsdXJlIG1ha2UgYSByZXNlbmQiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIiAvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0ZWQiCisgICAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzb2NrZXQgY29ubmVjdGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIHNlbmQgbWVzc2FnZXMgdG8gb3RoZXIgbWVtYmVycyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0b3RhbEJ5dGVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGluZyBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWluUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1pbmltYWwgc2VuZGluZyBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXZnUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InByb2Nlc3NpbmcgdGltZSAvIG5yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iZG91YmxlIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heFByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXhpbWFsIHNlbmRpbmcgcHJvY2Vzc2luZyB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRvUHJvY2Vzc2luZ1N0YXRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjcmVhdGUgcHJvY2Vzc2luZyB0aW1lIHN0YXRzIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0id2FpdEFja1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InNlbmRpbmcgd2FpdEFjayB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1pbldhaXRBY2tUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtaW5pbWFsIHNlbmRpbmcgd2FpdEFjayB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImF2Z1dhaXRBY2tUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJ3YWl0QWNrIHRpbWUgLyBuck9mUmVxdWVzdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImRvdWJsZSIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhXYWl0QWNrVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWF4aW1hbCBzZW5kaW5nIHdhaXRBY2sgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkb1dhaXRBY2tTdGF0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY3JlYXRlIHdhaXRBY2sgdGltZSBzdGF0cyIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3RDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgY29ubmVjdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGlzY29ubmVjdENvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBkaXNjb25uZWN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzb2NrZXRPcGVuQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIG9wZW4gc29ja2V0IChLZWVwQWxpdmUgYW5kIGNvbm5lY3RzKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzb2NrZXRPcGVuRmFpbHVyZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBvcGVuIHNvY2tldCBmYWlsdXJlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPiAgICAgICAgICAgICAgICAgCQkJCSAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic29ja2V0Q2xvc2VDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgY2xvc2VkIHNvY2tldCAoS2VlcEFsaXZlIGFuZCBkaXNjb25uZWN0cykiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWlzc2luZ0Fja0NvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBtaXNzaW5nIGFjayIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkYXRhUmVzZW5kQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGRhdGEgcmVzZW5kcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkYXRhRmFpbHVyZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBkYXRhIHNlbmQgZmFpbHVyZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iaW5RdWV1ZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBhbGwgcXVldWVkIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im91dFF1ZXVlQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGFsbCBzdWNjZXNzZnVsbHkgc2VuZGVkIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisJPG9wZXJhdGlvbiBuYW1lPSJjb25uZWN0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249ImNvbm5lY3QgdG8gb3RoZXIgcmVwbGljYXRpb24gbm9kZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisJPG9wZXJhdGlvbiBuYW1lPSJkaXNjb25uZWN0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249ImRpc2Nvbm5lY3QgdG8gb3RoZXIgcmVwbGljYXRpb24gbm9kZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisJPG9wZXJhdGlvbiBuYW1lPSJjaGVja0tlZXBBbGl2ZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDaGVjayBjb25uZWN0aW9uIGZvciBjbG9zZSBzb2NrZXQiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9ImJvb2xlYW4iPgorICAgIDwvb3BlcmF0aW9uPgorCTxvcGVyYXRpb24gbmFtZT0icmVzZXRTdGF0aXN0aWNzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJlc2V0IGFsbCBzdGF0aXN0aWNzIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKwkJCQkgCisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iTXVsdGlTb2NrZXRTZW5kZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik11bHRpIFNvY2tldCBTZW5kZXIsIG1vcmUgdGhhbiBvbmUgc29ja2V0IHBlciBtZW1iZXIiCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJJRGF0YVNlbmRlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5Qb29sZWRTb2NrZXRTZW5kZXIiPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhZGRyZXNzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZW5kZXIgaXAgYWRkcmVzcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5uZXQuSW5ldEFkZHJlc3MiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icG9ydCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGVyIHBvcnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic3VzcGVjdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU29ja2V0IGlzIGdvbmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWNrVGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWNrbm93bGVkZ2UgdGltZW91dCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ3YWl0Rm9yQWNrIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJXYWl0IGZvciBhY2sgYWZ0ZXIgZGF0YSBzZW5kIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4UG9vbFNvY2tldExpbWl0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNYXggcGFyYWxsZWwgc29ja2V0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtlZXBBbGl2ZVRpbWVvdXQiCisgICAgICAgICAgZGVzY3JpcHRpb249ImFjdGl2ZSBzb2NrZXQga2VlcCBhbGl2ZSB0aW1lb3V0IgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWF4IHJlcXVlc3Qgb3ZlciB0aGlzIHNvY2tldCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlc2VuZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWZ0ZXIgc2VuZCBmYWlsdXJlIG1ha2UgYSByZXNlbmQiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIiAvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0ZWQiCisgICAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzb2NrZXQgY29ubmVjdGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImF2Z01lc3NhZ2VTaXplIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJhdmcgbWVzc2FnZSBzaXplICh0b3RhbGJ5dGVzL25yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJuck9mUmVxdWVzdHMiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBzZW5kIG1lc3NhZ2VzIHRvIG90aGVyIG1lbWJlcnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idG90YWxCeXRlcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVyZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY29ubmVjdENvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBjb25uZWN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkaXNjb25uZWN0Q291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGRpc2Nvbm5lY3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisJPG9wZXJhdGlvbiBuYW1lPSJjb25uZWN0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InN0YXJ0IFF1ZXVlIHRvIGNvbm5lY3QgdG8gb2h0ZXIgcmVwbGljYXRpb24gbm9kZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisJPG9wZXJhdGlvbiBuYW1lPSJkaXNjb25uZWN0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InN0b3AgUXVldWUgdG8gb3RoZXIgcmVwbGljYXRpb24gbm9kZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisJPG9wZXJhdGlvbiBuYW1lPSJyZXNldFN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVzZXQgYWxsIHN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCQkJCSAKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gICAgICAgICBuYW1lPSJTb2NrZXRTZW5kZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IlN5bmMgQ2x1c3RlciBTZW5kZXIiCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJJRGF0YVNlbmRlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5Tb2NrZXRTZW5kZXIiPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhZGRyZXNzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZW5kZXIgaXAgYWRkcmVzcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5uZXQuSW5ldEFkZHJlc3MiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icG9ydCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGVyIHBvcnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic3VzcGVjdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU29ja2V0IGlzIGdvbmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWNrVGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWNrbm93bGVkZ2UgdGltZW91dCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ3YWl0Rm9yQWNrIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJXYWl0IGZvciBhY2sgYWZ0ZXIgZGF0YSBzZW5kIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ia2VlcEFsaXZlVGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWN0aXZlIHNvY2tldCBrZWVwIGFsaXZlIHRpbWVvdXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ia2VlcEFsaXZlTWF4UmVxdWVzdENvdW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXggcmVxdWVzdCBvdmVyIHRoaXMgc29ja2V0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWVzc2FnZVRyYW5zZmVyU3RhcnRlZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWVzc2FnZSBpcyBpbiB0cmFuc2ZlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ia2VlcEFsaXZlQ291bnQiCisgICAgICAgICAgZGVzY3JpcHRpb249ImtlZXAgQWxpdmUgcmVxdWVzdCBjb3VudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtlZXBBbGl2ZUNvbm5lY3RUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb25uZWN0IHRpbWUgZm9yIGtlZXAgYWxpdmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVzZW5kIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJhZnRlciBzZW5kIGZhaWx1cmUgbWFrZSBhIHJlc2VuZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3RlZCIKKyAgICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InNvY2tldCBjb25uZWN0ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXZnTWVzc2FnZVNpemUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiCisgICAgICAgICAgZGVzY3JpcHRpb249ImF2ZyBtZXNzYWdlIHNpemUgKHRvdGFsYnl0ZXMvbnJPZlJlcXVlc3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIHNlbmQgbWVzc2FnZXMgdG8gb3RoZXIgbWVtYmVycyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0b3RhbEJ5dGVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGluZyBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWluUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1pbmltYWwgc2VuZGluZyBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXZnUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InByb2Nlc3NpbmcgdGltZSAvIG5yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iZG91YmxlIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heFByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXhpbWFsIHNlbmRpbmcgcHJvY2Vzc2luZyB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRvUHJvY2Vzc2luZ1N0YXRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjcmVhdGUgUHJvY2Vzc2luZyB0aW1lIHN0YXRzIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0id2FpdEFja1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InNlbmRpbmcgd2FpdEFjayB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1pbldhaXRBY2tUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtaW5pbWFsIHNlbmRpbmcgd2FpdEFjayB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImF2Z1dhaXRBY2tUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJ3YWl0QWNrIHRpbWUgLyBuck9mUmVxdWVzdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImRvdWJsZSIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhXYWl0QWNrVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWF4aW1hbCBzZW5kaW5nIHdhaXRBY2sgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkb1dhaXRBY2tTdGF0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY3JlYXRlIHdhaXRBY2sgdGltZSBzdGF0cyIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3RDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgY29ubmVjdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGlzY29ubmVjdENvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBkaXNjb25uZWN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzb2NrZXRDbG9zZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBjbG9zZWQgc29ja2V0IChLZWVwQWxpdmUgYW5kIGRpc2Nvbm5lY3RzKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzb2NrZXRPcGVuRmFpbHVyZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBvcGVuIHNvY2tldCBmYWlsdXJlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPiAgICAgICAgICAgICAgICAgCQkJCSAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic29ja2V0T3BlbkNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBvcGVuIHNvY2tldCAoS2VlcEFsaXZlIGFuZCBjb25uZWN0cykiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4JCQkJIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtaXNzaW5nQWNrQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIG1pc3NpbmcgYWNrIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRhdGFSZXNlbmRDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgZGF0YSByZXNlbmRzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRhdGFGYWlsdXJlQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGRhdGEgc2VuZCBmYWlsdXJlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCTxvcGVyYXRpb24gbmFtZT0iY29ubmVjdCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb25uZWN0IHRvIG90aGVyIHJlcGxpY2F0aW9uIG5vZGUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCTxvcGVyYXRpb24gbmFtZT0iZGlzY29ubmVjdCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkaXNjb25uZWN0IHRvIG90aGVyIHJlcGxpY2F0aW9uIG5vZGUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCTxvcGVyYXRpb24gbmFtZT0iY2hlY2tLZWVwQWxpdmUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2hlY2sgY29ubmVjdGlvbiBmb3IgY2xvc2Ugc29ja2V0IgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJib29sZWFuIj4KKyAgICA8L29wZXJhdGlvbj4KKwk8b3BlcmF0aW9uIG5hbWU9InJlc2V0U3RhdGlzdGljcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXNldCBhbGwgc3RhdGlzdGljcyIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisJCQkJIAorICA8L21iZWFuPgorICAgIAorICA8bWJlYW4gICAgICAgICBuYW1lPSJSZXBsaWNhdGlvblZhbHZlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJWYWx2ZSBmb3Igc2ltcGxlIHRjcCByZXBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IlZhbHZlIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlJlcGxpY2F0aW9uVmFsdmUiPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJpbmZvIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDbGFzcyB2ZXJzaW9uIGluZm8iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZmlsdGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJyZXNvdXJjZSBmaWx0ZXIgdG8gZGlzYWJsZSBzZXNzaW9uIHJlcGxpY2F0aW9uIGNoZWNrIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InByaW1hcnlJbmRpY2F0b3IiCisgCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2V0IGluZGljYXRvciB0aGF0IHJlcXVlc3QgcHJvY2Vzc2luZyBpcyBhdCBwcmltYXJ5IHNlc3Npb24gbm9kZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwcmltYXJ5SW5kaWNhdG9yTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVxdWVzdCBhdHRyaWJ1dGUgbmFtZSB0byBpbmRpY2F0ZSB0aGF0IHJlcXVlc3QgcHJvY2Vzc2luZyBpcyBhdCBwcmltYXJ5IHNlc3Npb24gbm9kZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkb1Byb2Nlc3NpbmdTdGF0cyIKKyAJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJhY3RpdmUgc3RhdGlzdGljcyBjb3VudGluZyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCTxhdHRyaWJ1dGUgICBuYW1lPSJuck9mUmVxdWVzdHMiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiByZXBsaWNhdGVkIHJlcXVlc3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisJPGF0dHJpYnV0ZSAgIG5hbWU9Im5yT2ZGaWx0ZXJSZXF1ZXN0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIGZpbHRlcmVkIHJlcXVlc3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisJPGF0dHJpYnV0ZSAgIG5hbWU9Im5yT2ZTZW5kUmVxdWVzdHMiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBzZW5kIHJlcXVlc3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisJPGF0dHJpYnV0ZSAgIG5hbWU9Im5yT2ZDcm9zc0NvbnRleHRTZW5kUmVxdWVzdHMiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBzZW5kIGNyb3NzIGNvbnRleHQgc2Vzc2lvbiByZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0b3RhbFJlcXVlc3RUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJ0b3RhbCByZXBsaWNhdGVkIHJlcXVlc3QgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0b3RhbFNlbmRUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJ0b3RhbCByZXBsaWNhdGVkIHNlbmQgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJsYXN0U2VuZFRpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Imxhc3QgcmVwbGljYXRlZCByZXF1ZXN0IHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8b3BlcmF0aW9uIG5hbWU9InJlc2V0U3RhdGlzdGljcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXNldCBhbGwgc3RhdGlzdGljcyIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisgICAgICAgICAgICAgICAgIAorICA8L21iZWFuPgorCisKKzwvbWJlYW5zLWRlc2NyaXB0b3JzPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9uaW8vTmlvUmVjZWl2ZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvbmlvL05pb1JlY2VpdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiZWJkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvbmlvL05pb1JlY2VpdmVyLmphdmEKQEAgLTAsMCArMSwzODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQubmlvOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlcnZlclNvY2tldENoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsUmVjZWl2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uTGlzdGVuQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uT2JqZWN0UmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5Db25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LlJlY2VpdmVyQmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuVGhyZWFkUG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuV29ya2VyVGhyZWFkOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNhbmNlbGxlZEtleUV4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgTmlvUmVjZWl2ZXIgZXh0ZW5kcyBSZWNlaXZlckJhc2UgaW1wbGVtZW50cyBSdW5uYWJsZSwgQ2hhbm5lbFJlY2VpdmVyLCBMaXN0ZW5DYWxsYmFjayB7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyhOaW9SZWNlaXZlci5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nTWFuYWdlciBzbSA9IFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJOaW9SZWNlaXZlci8xLjAiOworCisgICAgcHJpdmF0ZSBTZWxlY3RvciBzZWxlY3RvciA9IG51bGw7CisgICAgcHJpdmF0ZSBTZXJ2ZXJTb2NrZXRDaGFubmVsIHNlcnZlckNoYW5uZWwgPSBudWxsOworCisgICAgcHJvdGVjdGVkIExpbmtlZExpc3QgZXZlbnRzID0gbmV3IExpbmtlZExpc3QoKTsKKy8vICAgIHByaXZhdGUgT2JqZWN0IGludGVyZXN0T3BzTXV0ZXggPSBuZXcgT2JqZWN0KCk7CisKKyAgICBwdWJsaWMgTmlvUmVjZWl2ZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24gYW5kIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworICAgICAgICByZXR1cm4gKGluZm8pOworICAgIH0KKworLy8gICAgcHVibGljIE9iamVjdCBnZXRJbnRlcmVzdE9wc011dGV4KCkgeworLy8gICAgICAgIHJldHVybiBpbnRlcmVzdE9wc011dGV4OworLy8gICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgdGhpcy5zdG9wTGlzdGVuaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc3RhcnQgY2x1c3RlciByZWNlaXZlcgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DbHVzdGVyUmVjZWl2ZXIjc3RhcnQoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKy8vICAgICAgICAgICAgc2V0UG9vbChuZXcgVGhyZWFkUG9vbChpbnRlcmVzdE9wc011dGV4LCBnZXRNYXhUaHJlYWRzKCksZ2V0TWluVGhyZWFkcygpLHRoaXMpKTsKKyAgICAgICAgICAgIHNldFBvb2wobmV3IFRocmVhZFBvb2woZ2V0TWF4VGhyZWFkcygpLGdldE1pblRocmVhZHMoKSx0aGlzKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICBsb2cuZmF0YWwoIlRocmVhZFBvb2wgY2FuIGluaXRpbHplZC4gTGlzdGVuZXIgbm90IHN0YXJ0ZWQiLCB4KTsKKyAgICAgICAgICAgIGlmICggeCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uICkgdGhyb3cgKElPRXhjZXB0aW9uKXg7CisgICAgICAgICAgICBlbHNlIHRocm93IG5ldyBJT0V4Y2VwdGlvbih4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldEJpbmQoKTsKKyAgICAgICAgICAgIGJpbmQoKTsKKyAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCh0aGlzLCAiTmlvUmVjZWl2ZXIiKTsKKyAgICAgICAgICAgIHQuc2V0RGFlbW9uKHRydWUpOworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgbG9nLmZhdGFsKCJVbmFibGUgdG8gc3RhcnQgY2x1c3RlciByZWNlaXZlciIsIHgpOworICAgICAgICAgICAgaWYgKCB4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24gKSB0aHJvdyAoSU9FeGNlcHRpb24peDsKKyAgICAgICAgICAgIGVsc2UgdGhyb3cgbmV3IElPRXhjZXB0aW9uKHguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgV29ya2VyVGhyZWFkIGdldFdvcmtlclRocmVhZCgpIHsKKyAgICAgICAgTmlvUmVwbGljYXRpb25UaHJlYWQgdGhyZWFkID0gbmV3IE5pb1JlcGxpY2F0aW9uVGhyZWFkKHRoaXMsdGhpcyk7CisgICAgICAgIHRocmVhZC5zZXRVc2VCdWZmZXJQb29sKHRoaXMuZ2V0VXNlQnVmZmVyUG9vbCgpKTsKKyAgICAgICAgdGhyZWFkLnNldFJ4QnVmU2l6ZShnZXRSeEJ1ZlNpemUoKSk7CisgICAgICAgIHRocmVhZC5zZXRPcHRpb25zKGdldFdvcmtlclRocmVhZE9wdGlvbnMoKSk7CisgICAgICAgIHJldHVybiB0aHJlYWQ7CisgICAgfQorICAgIAorICAgIAorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGJpbmQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBhbGxvY2F0ZSBhbiB1bmJvdW5kIHNlcnZlciBzb2NrZXQgY2hhbm5lbAorICAgICAgICBzZXJ2ZXJDaGFubmVsID0gU2VydmVyU29ja2V0Q2hhbm5lbC5vcGVuKCk7CisgICAgICAgIC8vIEdldCB0aGUgYXNzb2NpYXRlZCBTZXJ2ZXJTb2NrZXQgdG8gYmluZCBpdCB3aXRoCisgICAgICAgIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBzZXJ2ZXJDaGFubmVsLnNvY2tldCgpOworICAgICAgICAvLyBjcmVhdGUgYSBuZXcgU2VsZWN0b3IgZm9yIHVzZSBiZWxvdworICAgICAgICBzZWxlY3RvciA9IFNlbGVjdG9yLm9wZW4oKTsKKyAgICAgICAgLy8gc2V0IHRoZSBwb3J0IHRoZSBzZXJ2ZXIgY2hhbm5lbCB3aWxsIGxpc3RlbiB0bworICAgICAgICAvL3NlcnZlclNvY2tldC5iaW5kKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhnZXRCaW5kKCksIGdldFRjcExpc3RlblBvcnQoKSkpOworICAgICAgICBiaW5kKHNlcnZlclNvY2tldCxnZXRUY3BMaXN0ZW5Qb3J0KCksZ2V0QXV0b0JpbmQoKSk7CisgICAgICAgIC8vIHNldCBub24tYmxvY2tpbmcgbW9kZSBmb3IgdGhlIGxpc3RlbmluZyBzb2NrZXQKKyAgICAgICAgc2VydmVyQ2hhbm5lbC5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CisgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBTZXJ2ZXJTb2NrZXRDaGFubmVsIHdpdGggdGhlIFNlbGVjdG9yCisgICAgICAgIHNlcnZlckNoYW5uZWwucmVnaXN0ZXIoc2VsZWN0b3IsIFNlbGVjdGlvbktleS5PUF9BQ0NFUFQpOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkRXZlbnQoUnVubmFibGUgZXZlbnQpIHsKKyAgICAgICAgaWYgKCBzZWxlY3RvciAhPSBudWxsICkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChldmVudHMpIHsKKyAgICAgICAgICAgICAgICBldmVudHMuYWRkKGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggbG9nLmlzVHJhY2VFbmFibGVkKCkgKSBsb2cudHJhY2UoIkFkZGluZyBldmVudCB0byBzZWxlY3RvcjoiK2V2ZW50KTsKKyAgICAgICAgICAgIHNlbGVjdG9yLndha2V1cCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXZlbnRzKCkgeworICAgICAgICBpZiAoIGV2ZW50cy5zaXplKCkgPT0gMCApIHJldHVybjsKKyAgICAgICAgc3luY2hyb25pemVkIChldmVudHMpIHsKKyAgICAgICAgICAgIFJ1bm5hYmxlIHIgPSBudWxsOworICAgICAgICAgICAgd2hpbGUgKCAoZXZlbnRzLnNpemUoKSA+IDApICYmIChyID0gKFJ1bm5hYmxlKWV2ZW50cy5yZW1vdmVGaXJzdCgpKSAhPSBudWxsICkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggbG9nLmlzVHJhY2VFbmFibGVkKCkgKSBsb2cudHJhY2UoIlByb2Nlc3NpbmcgZXZlbnQgaW4gc2VsZWN0b3I6IityKTsKKyAgICAgICAgICAgICAgICAgICAgci5ydW4oKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiIix4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBldmVudHMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2FuY2VsbGVkS2V5KFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICAgICAgT2JqZWN0UmVhZGVyIHJlYWRlciA9IChPYmplY3RSZWFkZXIpa2V5LmF0dGFjaG1lbnQoKTsKKyAgICAgICAgaWYgKCByZWFkZXIgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHJlYWRlci5zZXRDYW5jZWxsZWQodHJ1ZSk7CisgICAgICAgICAgICByZWFkZXIuZmluaXNoKCk7CisgICAgICAgIH0KKyAgICAgICAga2V5LmNhbmNlbCgpOyAKKyAgICAgICAga2V5LmF0dGFjaChudWxsKTsKKyAgICAgICAgdHJ5IHsgKChTb2NrZXRDaGFubmVsKWtleS5jaGFubmVsKCkpLnNvY2tldCgpLmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSBsb2cuZGVidWcoIiIsIGUpOyB9CisgICAgICAgIHRyeSB7IGtleS5jaGFubmVsKCkuY2xvc2UoKTsgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiIiwgZSk7IH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIHNvY2tldFRpbWVvdXRzKCkgeworICAgICAgICAvL3RpbWVvdXQKKyAgICAgICAgU2V0IGtleXMgPSBzZWxlY3Rvci5rZXlzKCk7CisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgU2VsZWN0aW9uS2V5IGtleSA9IChTZWxlY3Rpb25LZXkpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgdHJ5IHsKKy8vICAgICAgICAgICAgICAgIGlmIChrZXkuaW50ZXJlc3RPcHMoKSA9PSBTZWxlY3Rpb25LZXkuT1BfUkVBRCkgeworLy8gICAgICAgICAgICAgICAgICAgIC8vb25seSB0aW1lb3V0IHNvY2tldHMgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3IgYSByZWFkIGZyb20KKy8vICAgICAgICAgICAgICAgICAgICBPYmplY3RSZWFkZXIga2EgPSAoT2JqZWN0UmVhZGVyKSBrZXkuYXR0YWNobWVudCgpOworLy8gICAgICAgICAgICAgICAgICAgIGxvbmcgZGVsdGEgPSBub3cgLSBrYS5nZXRMYXN0QWNjZXNzKCk7CisvLyAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhID4gKGxvbmcpIGdldFRpbWVvdXQoKSkgeworLy8gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWRLZXkoa2V5KTsKKy8vICAgICAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaWYgKCBrZXkuaW50ZXJlc3RPcHMoKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGZvciBrZXlzIHRoYXQgZGlkbid0IG1ha2UgaXQgaW4uCisgICAgICAgICAgICAgICAgICAgIE9iamVjdFJlYWRlciBrYSA9IChPYmplY3RSZWFkZXIpIGtleS5hdHRhY2htZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgga2EgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZGVsdGEgPSBub3cgLSBrYS5nZXRMYXN0QWNjZXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPiAobG9uZykgZ2V0VGltZW91dCgpICYmICgha2EuaXNBY2Nlc3NlZCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJDaGFubmVsIGtleSBpcyByZWdpc3RlcmVkLCBidXQgaGFzIGhhZCBubyBpbnRlcmVzdCBvcHMgZm9yIHRoZSBsYXN0ICIrZ2V0VGltZW91dCgpKyIgbXMuIChjYW5jZWxsZWQ6IitrYS5pc0NhbmNlbGxlZCgpKyIpOiIra2V5KyIgbGFzdCBhY2Nlc3M6IituZXcgamF2YS5zcWwuVGltZXN0YW1wKGthLmdldExhc3RBY2Nlc3MoKSkpOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmVzdDoiK2tleS5pbnRlcmVzdE9wcygpKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVhZHkgT3BzOiIra2V5LnJlYWR5T3BzKCkpOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWYWxpZDoiK2tleS5pc1ZhbGlkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGthLnNldExhc3RBY2Nlc3Mobm93KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2tleS5pbnRlcmVzdE9wcyhTZWxlY3Rpb25LZXkuT1BfUkVBRCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxlZEtleShrZXkpOworICAgICAgICAgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgIH1jYXRjaCAoIENhbmNlbGxlZEtleUV4Y2VwdGlvbiBja3ggKSB7CisgICAgICAgICAgICAgICAgY2FuY2VsbGVkS2V5KGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGdldCBkYXRhIGZyb20gY2hhbm5lbCBhbmQgc3RvcmUgaW4gYnl0ZSBhcnJheQorICAgICAqIHNlbmQgaXQgdG8gY2x1c3RlcgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBsaXN0ZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRvTGlzdGVuKCkpIHsKKyAgICAgICAgICAgIGxvZy53YXJuKCJTZXJ2ZXJTb2NrZXRDaGFubmVsIGFscmVhZHkgc3RhcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzZXRMaXN0ZW4odHJ1ZSk7CisKKyAgICAgICAgd2hpbGUgKGRvTGlzdGVuKCkgJiYgc2VsZWN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gdGhpcyBtYXkgYmxvY2sgZm9yIGEgbG9uZyB0aW1lLCB1cG9uIHJldHVybiB0aGUKKyAgICAgICAgICAgIC8vIHNlbGVjdGVkIHNldCBjb250YWlucyBrZXlzIG9mIHRoZSByZWFkeSBjaGFubmVscworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBldmVudHMoKTsKKyAgICAgICAgICAgICAgICBzb2NrZXRUaW1lb3V0cygpOworICAgICAgICAgICAgICAgIGludCBuID0gc2VsZWN0b3Iuc2VsZWN0KGdldFRjcFNlbGVjdG9yVGltZW91dCgpKTsKKyAgICAgICAgICAgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vdGhlcmUgaXMgYSBnb29kIGNoYW5jZSB0aGF0IHdlIGdvdCBoZXJlCisgICAgICAgICAgICAgICAgICAgIC8vYmVjYXVzZSB0aGUgVGNwUmVwbGljYXRpb25UaHJlYWQgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgIC8vc2VsZWN0b3Igd2FrZXVwKCkuCisgICAgICAgICAgICAgICAgICAgIC8vaWYgdGhhdCBoYXBwZW5zLCB3ZSBtdXN0IGVuc3VyZSB0aGF0IHRoYXQKKyAgICAgICAgICAgICAgICAgICAgLy90aHJlYWQgaGFzIGVub3VnaCB0aW1lIHRvIGNhbGwgaW50ZXJlc3RPcHMKKy8vICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGludGVyZXN0T3BzTXV0ZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgd2UgZ290IHRoZSBsb2NrLCBtZWFucyB0aGVyZSBhcmUgbm8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8va2V5cyB0cnlpbmcgdG8gcmVnaXN0ZXIgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy9pbnRlcmVzdE9wcyBtZXRob2QKKy8vICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3RoaW5nIHRvIGRvCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGdldCBhbiBpdGVyYXRvciBvdmVyIHRoZSBzZXQgb2Ygc2VsZWN0ZWQga2V5cworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gc2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAvLyBsb29rIGF0IGVhY2gga2V5IGluIHRoZSBzZWxlY3RlZCBzZXQKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbktleSBrZXkgPSAoU2VsZWN0aW9uS2V5KSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIElzIGEgbmV3IGNvbm5lY3Rpb24gY29taW5nIGluPworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmlzQWNjZXB0YWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJTb2NrZXRDaGFubmVsIHNlcnZlciA9IChTZXJ2ZXJTb2NrZXRDaGFubmVsKSBrZXkuY2hhbm5lbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0Q2hhbm5lbCBjaGFubmVsID0gc2VydmVyLmFjY2VwdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC5zb2NrZXQoKS5zZXRSZWNlaXZlQnVmZmVyU2l6ZShnZXRSeEJ1ZlNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLnNvY2tldCgpLnNldFNlbmRCdWZmZXJTaXplKGdldFR4QnVmU2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwuc29ja2V0KCkuc2V0VGNwTm9EZWxheShnZXRUY3BOb0RlbGF5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC5zb2NrZXQoKS5zZXRLZWVwQWxpdmUoZ2V0U29LZWVwQWxpdmUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLnNvY2tldCgpLnNldE9PQklubGluZShnZXRPb0JJbmxpbmUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLnNvY2tldCgpLnNldFJldXNlQWRkcmVzcyhnZXRTb1JldXNlQWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwuc29ja2V0KCkuc2V0U29MaW5nZXIoZ2V0U29MaW5nZXJPbigpLGdldFNvTGluZ2VyVGltZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwuc29ja2V0KCkuc2V0VHJhZmZpY0NsYXNzKGdldFNvVHJhZmZpY0NsYXNzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC5zb2NrZXQoKS5zZXRTb1RpbWVvdXQoZ2V0VGltZW91dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhdHRhY2ggPSBuZXcgT2JqZWN0UmVhZGVyKGNoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJDaGFubmVsKHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uS2V5Lk9QX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBpcyB0aGVyZSBkYXRhIHRvIHJlYWQgb24gdGhpcyBjaGFubmVsPworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmlzUmVhZGFibGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVhZERhdGFGcm9tU29ja2V0KGtleSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkuaW50ZXJlc3RPcHMoa2V5LmludGVyZXN0T3BzKCkgJiAoflNlbGVjdGlvbktleS5PUF9XUklURSkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGtleSBmcm9tIHNlbGVjdGVkIHNldCwgaXQncyBiZWVuIGhhbmRsZWQKKyAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkU2VsZWN0b3JFeGNlcHRpb24gY3NlKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlIGlzIG5vcm1hbCBhdCBzaHV0ZG93biBvciBzdG9wIGxpc3RlbiBzb2NrZXQKKyAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubmlvLmNoYW5uZWxzLkNhbmNlbGxlZEtleUV4Y2VwdGlvbiBueCkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKCJSZXBsaWNhdGlvbiBjbGllbnQgZGlzY29ubmVjdGVkLCBlcnJvciB3aGVuIHBvbGxpbmcga2V5LiBJZ25vcmluZyBjbGllbnQuIik7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgeCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHByb2Nlc3MgcmVxdWVzdCBpbiBOaW9SZWNlaXZlciIsIHgpOworICAgICAgICAgICAgICAgIH1jYXRjaCAoIFRocm93YWJsZSB0eCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy9pbiBjYXNlIGFuIG91dCBvZiBtZW1vcnkgZXJyb3IsIHdpbGwgYWZmZWN0IHRoZSBsb2dnaW5nIGZyYW1ld29yayBhcyB3ZWxsCisgICAgICAgICAgICAgICAgICAgIHR4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIHNlcnZlckNoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpCisgICAgICAgICAgICBzZWxlY3Rvci5jbG9zZSgpOworICAgIH0KKworICAgIAorCisgICAgLyoqCisgICAgICogQ2xvc2UgU2VsZWN0b3IuCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5DbHVzdGVyUmVjZWl2ZXJCYXNlI3N0b3BMaXN0ZW5pbmcoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7CisgICAgICAgIC8vIEJ1Z3ppbGxhIDM3NTI5OiBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM3NTI5CisgICAgICAgIHNldExpc3RlbihmYWxzZSk7CisgICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0TWF4VGhyZWFkcygpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3Iud2FrZXVwKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGVjdG9yLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGNsb3NlIGNsdXN0ZXIgcmVjZWl2ZXIgc2VsZWN0b3IuIiwgeCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIHRoZSBnaXZlbiBjaGFubmVsIHdpdGggdGhlIGdpdmVuIHNlbGVjdG9yIGZvcgorICAgICAqIHRoZSBnaXZlbiBvcGVyYXRpb25zIG9mIGludGVyZXN0CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJDaGFubmVsKFNlbGVjdG9yIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RhYmxlQ2hhbm5lbCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXR0YWNoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNoYW5uZWwgPT0gbnVsbClyZXR1cm47IC8vIGNvdWxkIGhhcHBlbgorICAgICAgICAvLyBzZXQgdGhlIG5ldyBjaGFubmVsIG5vbi1ibG9ja2luZworICAgICAgICBjaGFubmVsLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKKyAgICAgICAgLy8gcmVnaXN0ZXIgaXQgd2l0aCB0aGUgc2VsZWN0b3IKKyAgICAgICAgY2hhbm5lbC5yZWdpc3RlcihzZWxlY3Rvciwgb3BzLCBhdHRhY2gpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRocmVhZCBhbmQgbGlzdGVuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbGlzdGVuKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBydW4gcmVwbGljYXRpb24gbGlzdGVuZXIuIiwgeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBTYW1wbGUgZGF0YSBoYW5kbGVyIG1ldGhvZCBmb3IgYSBjaGFubmVsIHdpdGggZGF0YSByZWFkeSB0byByZWFkLgorICAgICAqIEBwYXJhbSBrZXkgQSBTZWxlY3Rpb25LZXkgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIGNoYW5uZWwKKyAgICAgKiAgZGV0ZXJtaW5lZCBieSB0aGUgc2VsZWN0b3IgdG8gYmUgcmVhZHkgZm9yIHJlYWRpbmcuICBJZiB0aGUKKyAgICAgKiAgY2hhbm5lbCByZXR1cm5zIGFuIEVPRiBjb25kaXRpb24sIGl0IGlzIGNsb3NlZCBoZXJlLCB3aGljaAorICAgICAqICBhdXRvbWF0aWNhbGx5IGludmFsaWRhdGVzIHRoZSBhc3NvY2lhdGVkIGtleS4gIFRoZSBzZWxlY3RvcgorICAgICAqICB3aWxsIHRoZW4gZGUtcmVnaXN0ZXIgdGhlIGNoYW5uZWwgb24gdGhlIG5leHQgc2VsZWN0IGNhbGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVhZERhdGFGcm9tU29ja2V0KFNlbGVjdGlvbktleSBrZXkpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBOaW9SZXBsaWNhdGlvblRocmVhZCB3b3JrZXIgPSAoTmlvUmVwbGljYXRpb25UaHJlYWQpIGdldFBvb2woKS5nZXRXb3JrZXIoKTsKKyAgICAgICAgaWYgKHdvcmtlciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBObyB0aHJlYWRzIGF2YWlsYWJsZSwgZG8gbm90aGluZywgdGhlIHNlbGVjdGlvbgorICAgICAgICAgICAgLy8gbG9vcCB3aWxsIGtlZXAgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBhCisgICAgICAgICAgICAvLyB0aHJlYWQgYmVjb21lcyBhdmFpbGFibGUsIHRoZSB0aHJlYWQgcG9vbCBpdHNlbGYgaGFzIGEgd2FpdGluZyBtZWNoYW5pc20KKyAgICAgICAgICAgIC8vIHNvIHdlIHdpbGwgbm90IHdhaXQgaGVyZS4KKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5vIFRjcFJlcGxpY2F0aW9uVGhyZWFkIGF2YWlsYWJsZSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaW52b2tpbmcgdGhpcyB3YWtlcyB1cCB0aGUgd29ya2VyIHRocmVhZCB0aGVuIHJldHVybnMKKyAgICAgICAgICAgIHdvcmtlci5zZXJ2aWNlQ2hhbm5lbChrZXkpOworICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvbmlvL05pb1JlcGxpY2F0aW9uVGhyZWFkLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L25pby9OaW9SZXBsaWNhdGlvblRocmVhZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOGNiNjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L25pby9OaW9SZXBsaWNhdGlvblRocmVhZC5qYXZhCkBAIC0wLDAgKzEsMzExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQubmlvOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLk9iamVjdFJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5Xb3JrZXJUaHJlYWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uTGlzdGVuQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uQ2hhbm5lbERhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uQnVmZmVyUG9vbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DYW5jZWxsZWRLZXlFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuVW5pcXVlSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuUmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy51dGlsLkxvZ3M7CisKKy8qKgorICogQSB3b3JrZXIgdGhyZWFkIGNsYXNzIHdoaWNoIGNhbiBkcmFpbiBjaGFubmVscyBhbmQgZWNoby1iYWNrIHRoZSBpbnB1dC4gRWFjaAorICogaW5zdGFuY2UgaXMgY29uc3RydWN0ZWQgd2l0aCBhIHJlZmVyZW5jZSB0byB0aGUgb3duaW5nIHRocmVhZCBwb29sIG9iamVjdC4KKyAqIFdoZW4gc3RhcnRlZCwgdGhlIHRocmVhZCBsb29wcyBmb3JldmVyIHdhaXRpbmcgdG8gYmUgYXdha2VuZWQgdG8gc2VydmljZSB0aGUKKyAqIGNoYW5uZWwgYXNzb2NpYXRlZCB3aXRoIGEgU2VsZWN0aW9uS2V5IG9iamVjdC4gVGhlIHdvcmtlciBpcyB0YXNrZWQgYnkKKyAqIGNhbGxpbmcgaXRzIHNlcnZpY2VDaGFubmVsKCkgbWV0aG9kIHdpdGggYSBTZWxlY3Rpb25LZXkgb2JqZWN0LiBUaGUKKyAqIHNlcnZpY2VDaGFubmVsKCkgbWV0aG9kIHN0b3JlcyB0aGUga2V5IHJlZmVyZW5jZSBpbiB0aGUgdGhyZWFkIG9iamVjdCB0aGVuCisgKiBjYWxscyBub3RpZnkoKSB0byB3YWtlIGl0IHVwLiBXaGVuIHRoZSBjaGFubmVsIGhhcyBiZWVuIGRyYWluZWQsIHRoZSB3b3JrZXIKKyAqIHRocmVhZCByZXR1cm5zIGl0c2VsZiB0byBpdHMgcGFyZW50IHBvb2wuCisgKiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIAorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBOaW9SZXBsaWNhdGlvblRocmVhZCBleHRlbmRzIFdvcmtlclRocmVhZCB7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBOaW9SZXBsaWNhdGlvblRocmVhZC5jbGFzcyApOworICAgIAorICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBidWZmZXIgPSBudWxsOworICAgIHByaXZhdGUgU2VsZWN0aW9uS2V5IGtleTsKKyAgICBwcml2YXRlIGludCByeEJ1ZlNpemU7CisgICAgcHJpdmF0ZSBOaW9SZWNlaXZlciByZWNlaXZlcjsKKyAgICBwdWJsaWMgTmlvUmVwbGljYXRpb25UaHJlYWQgKExpc3RlbkNhbGxiYWNrIGNhbGxiYWNrLCBOaW9SZWNlaXZlciByZWNlaXZlcikKKyAgICB7CisgICAgICAgIHN1cGVyKGNhbGxiYWNrKTsKKyAgICAgICAgdGhpcy5yZWNlaXZlciA9IHJlY2VpdmVyOworICAgIH0KKworICAgIC8vIGxvb3AgZm9yZXZlciB3YWl0aW5nIGZvciB3b3JrIHRvIGRvCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJ1bigpIHsgCisgICAgICAgIHRoaXMubm90aWZ5KCk7CisgICAgICAgIGlmICggKGdldE9wdGlvbnMoKSAmIE9QVElPTl9ESVJFQ1RfQlVGRkVSKSA9PSBPUFRJT05fRElSRUNUX0JVRkZFUiApIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoZ2V0UnhCdWZTaXplKCkpOworICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlIChnZXRSeEJ1ZlNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGlzRG9SdW4oKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBzbGVlcCBhbmQgcmVsZWFzZSBvYmplY3QgbG9jaworICAgICAgICAgICAgICAgIHRoaXMud2FpdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpIGxvZy5pbmZvKCJUQ1Agd29ya2VyIHRocmVhZCBpbnRlcnJ1cHRlZCBpbiBjbHVzdGVyIixlKTsKKyAgICAgICAgICAgICAgICAvLyBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzCisgICAgICAgICAgICAgICAgVGhyZWFkLmludGVycnVwdGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsJLy8ganVzdCBpbiBjYXNlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGxvZy5pc1RyYWNlRW5hYmxlZCgpICkgCisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJTZXJ2aWNpbmcga2V5OiIra2V5KTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3RSZWFkZXIgcmVhZGVyID0gKE9iamVjdFJlYWRlcilrZXkuYXR0YWNobWVudCgpOworICAgICAgICAgICAgICAgIGlmICggcmVhZGVyID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggbG9nLmlzVHJhY2VFbmFibGVkKCkgKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiTm8gb2JqZWN0IHJlYWRlciwgY2FuY2VsbGluZzoiK2tleSk7CisgICAgICAgICAgICAgICAgICAgIGNhbmNlbEtleShrZXkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggbG9nLmlzVHJhY2VFbmFibGVkKCkgKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiRHJhaW5pbmcgY2hhbm5lbDoiK2tleSk7CisKKyAgICAgICAgICAgICAgICAgICAgZHJhaW5DaGFubmVsKGtleSwgcmVhZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vdGhpcyBpcyBjb21tb24sIHNpbmNlIHRoZSBzb2NrZXRzIG9uIHRoZSBvdGhlcgorICAgICAgICAgICAgICAgIC8vZW5kIGV4cGlyZSBhZnRlciBhIGNlcnRhaW4gdGltZS4KKyAgICAgICAgICAgICAgICBpZiAoIGUgaW5zdGFuY2VvZiBDYW5jZWxsZWRLZXlFeGNlcHRpb24gKSB7CisgICAgICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbiApIHsKKyAgICAgICAgICAgICAgICAgICAgLy9kb250IHNwZXcgb3V0IHN0YWNrIHRyYWNlcyBmb3IgSU8gZXhjZXB0aW9ucyB1bmxlc3MgZGVidWcgaXMgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSBsb2cuZGVidWcgKCJJT0V4Y2VwdGlvbiBpbiByZXBsaWNhdGlvbiB3b3JrZXIsIHVuYWJsZSB0byBkcmFpbiBjaGFubmVsLiBQcm9iYWJsZSBjYXVzZTogS2VlcCBhbGl2ZSBzb2NrZXQgY2xvc2VkWyIrZS5nZXRNZXNzYWdlKCkrIl0uIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgbG9nLndhcm4gKCJJT0V4Y2VwdGlvbiBpbiByZXBsaWNhdGlvbiB3b3JrZXIsIHVuYWJsZSB0byBkcmFpbiBjaGFubmVsLiBQcm9iYWJsZSBjYXVzZTogS2VlcCBhbGl2ZSBzb2NrZXQgY2xvc2VkWyIrZS5nZXRNZXNzYWdlKCkrIl0uIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggbG9nLmlzRXJyb3JFbmFibGVkKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBpcyBhIHJlYWwgZXJyb3IsIGxvZyBpdC4KKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFeGNlcHRpb24gY2F1Z2h0IGluIFRjcFJlcGxpY2F0aW9uVGhyZWFkLmRyYWluQ2hhbm5lbC4iLGUpOworICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgY2FuY2VsS2V5KGtleSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAga2V5ID0gbnVsbDsKKyAgICAgICAgICAgIC8vIGRvbmUsIHJlYWR5IGZvciBtb3JlLCByZXR1cm4gdG8gcG9vbAorICAgICAgICAgICAgZ2V0UG9vbCgpLnJldHVybldvcmtlciAodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gaW5pdGlhdGUgYSB1bml0IG9mIHdvcmsgYnkgdGhpcyB3b3JrZXIgdGhyZWFkCisgICAgICogb24gdGhlIHByb3ZpZGVkIFNlbGVjdGlvbktleSBvYmplY3QuICBUaGlzIG1ldGhvZCBpcworICAgICAqIHN5bmNocm9uaXplZCwgYXMgaXMgdGhlIHJ1bigpIG1ldGhvZCwgc28gb25seSBvbmUga2V5CisgICAgICogY2FuIGJlIHNlcnZpY2VkIGF0IGEgZ2l2ZW4gdGltZS4KKyAgICAgKiBCZWZvcmUgd2FraW5nIHRoZSB3b3JrZXIgdGhyZWFkLCBhbmQgYmVmb3JlIHJldHVybmluZworICAgICAqIHRvIHRoZSBtYWluIHNlbGVjdGlvbiBsb29wLCB0aGlzIGtleSdzIGludGVyZXN0IHNldCBpcworICAgICAqIHVwZGF0ZWQgdG8gcmVtb3ZlIE9QX1JFQUQuICBUaGlzIHdpbGwgY2F1c2UgdGhlIHNlbGVjdG9yCisgICAgICogdG8gaWdub3JlIHJlYWQtcmVhZGluZXNzIGZvciB0aGlzIGNoYW5uZWwgd2hpbGUgdGhlCisgICAgICogd29ya2VyIHRocmVhZCBpcyBzZXJ2aWNpbmcgaXQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNlcnZpY2VDaGFubmVsIChTZWxlY3Rpb25LZXkga2V5KSB7CisgICAgICAgIGlmICggbG9nLmlzVHJhY2VFbmFibGVkKCkgKSAKKyAgICAgICAgICAgIGxvZy50cmFjZSgiQWJvdXQgdG8gc2VydmljZSBrZXk6IitrZXkpOworICAgICAgICBPYmplY3RSZWFkZXIgcmVhZGVyID0gKE9iamVjdFJlYWRlcilrZXkuYXR0YWNobWVudCgpOworICAgICAgICBpZiAoIHJlYWRlciAhPSBudWxsICkgcmVhZGVyLnNldExhc3RBY2Nlc3MoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAga2V5LmludGVyZXN0T3BzIChrZXkuaW50ZXJlc3RPcHMoKSAmICh+U2VsZWN0aW9uS2V5Lk9QX1JFQUQpKTsKKyAgICAgICAga2V5LmludGVyZXN0T3BzIChrZXkuaW50ZXJlc3RPcHMoKSAmICh+U2VsZWN0aW9uS2V5Lk9QX1dSSVRFKSk7CisgICAgICAgIHRoaXMubm90aWZ5KCk7CQkvLyBhd2FrZW4gdGhlIHRocmVhZAorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhY3R1YWwgY29kZSB3aGljaCBkcmFpbnMgdGhlIGNoYW5uZWwgYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhlIGdpdmVuIGtleS4gIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhlIGtleSBoYXMgYmVlbgorICAgICAqIG1vZGlmaWVkIHByaW9yIHRvIGludm9jYXRpb24gdG8gdHVybiBvZmYgc2VsZWN0aW9uCisgICAgICogaW50ZXJlc3QgaW4gT1BfUkVBRC4gIFdoZW4gdGhpcyBtZXRob2QgY29tcGxldGVzIGl0CisgICAgICogcmUtZW5hYmxlcyBPUF9SRUFEIGFuZCBjYWxscyB3YWtldXAoKSBvbiB0aGUgc2VsZWN0b3IKKyAgICAgKiBzbyB0aGUgc2VsZWN0b3Igd2lsbCByZXN1bWUgd2F0Y2hpbmcgdGhpcyBjaGFubmVsLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRyYWluQ2hhbm5lbCAoZmluYWwgU2VsZWN0aW9uS2V5IGtleSwgT2JqZWN0UmVhZGVyIHJlYWRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJlYWRlci5zZXRMYXN0QWNjZXNzKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgcmVhZGVyLmFjY2VzcygpOworICAgICAgICBTb2NrZXRDaGFubmVsIGNoYW5uZWwgPSAoU29ja2V0Q2hhbm5lbCkga2V5LmNoYW5uZWwoKTsKKyAgICAgICAgaW50IGNvdW50OworICAgICAgICBidWZmZXIuY2xlYXIoKTsJCQkvLyBtYWtlIGJ1ZmZlciBlbXB0eQorCisgICAgICAgIC8vIGxvb3Agd2hpbGUgZGF0YSBhdmFpbGFibGUsIGNoYW5uZWwgaXMgbm9uLWJsb2NraW5nCisgICAgICAgIHdoaWxlICgoY291bnQgPSBjaGFubmVsLnJlYWQgKGJ1ZmZlcikpID4gMCkgeworICAgICAgICAgICAgYnVmZmVyLmZsaXAoKTsJCS8vIG1ha2UgYnVmZmVyIHJlYWRhYmxlCisgICAgICAgICAgICBpZiAoIGJ1ZmZlci5oYXNBcnJheSgpICkgCisgICAgICAgICAgICAgICAgcmVhZGVyLmFwcGVuZChidWZmZXIuYXJyYXkoKSwwLGNvdW50LGZhbHNlKTsKKyAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgcmVhZGVyLmFwcGVuZChidWZmZXIsY291bnQsZmFsc2UpOworICAgICAgICAgICAgYnVmZmVyLmNsZWFyKCk7CQkvLyBtYWtlIGJ1ZmZlciBlbXB0eQorICAgICAgICAgICAgLy9kbyB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBwYWNrYWdlPworICAgICAgICAgICAgaWYgKCByZWFkZXIuaGFzUGFja2FnZSgpICkgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcGtnY250ID0gcmVhZGVyLmNvdW50KCk7CisgICAgICAgIAorICAgICAgICBpZiAoY291bnQgPCAwICYmIHBrZ2NudCA9PSAwICkgeworICAgICAgICAgICAgLy9lbmQgb2Ygc3RyZWFtLCBhbmQgbm8gbW9yZSBwYWNrYWdlcyB0byBwcm9jZXNzCisgICAgICAgICAgICByZW1vdGVFb2Yoa2V5KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQ2hhbm5lbE1lc3NhZ2VbXSBtc2dzID0gcGtnY250ID09IDA/IENoYW5uZWxEYXRhLkVNUFRZX0RBVEFfQVJSQVkgOiByZWFkZXIuZXhlY3V0ZSgpOworICAgICAgICAKKyAgICAgICAgcmVnaXN0ZXJGb3JSZWFkKGtleSxyZWFkZXIpOy8vcmVnaXN0ZXIgdG8gcmVhZCBuZXcgZGF0YSwgYmVmb3JlIHdlIHNlbmQgaXQgb2ZmIHRvIGF2b2lkIGRlYWQgbG9ja3MKKyAgICAgICAgCisgICAgICAgIGZvciAoIGludCBpPTA7IGk8bXNncy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVXNlIHNlbmQgYWNrIGhlcmUgaWYgeW91IHdhbnQgdG8gYWNrIHRoZSByZXF1ZXN0IHRvIHRoZSByZW1vdGUgCisgICAgICAgICAgICAgKiBzZXJ2ZXIgYmVmb3JlIGNvbXBsZXRpbmcgdGhlIHJlcXVlc3QKKyAgICAgICAgICAgICAqIFRoaXMgaXMgY29uc2lkZXJlZCBhbiBhc3luY2hyb25pemVkIHJlcXVlc3QKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKENoYW5uZWxEYXRhLnNlbmRBY2tBc3luYyhtc2dzW2ldLmdldE9wdGlvbnMoKSkpIHNlbmRBY2soa2V5LGNoYW5uZWwsQ29uc3RhbnRzLkFDS19DT01NQU5EKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKCBMb2dzLk1FU1NBR0VTLmlzVHJhY2VFbmFibGVkKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2dzLk1FU1NBR0VTLnRyYWNlKCJOaW9SZXBsaWNhdGlvblRocmVhZCAtIFJlY2VpdmVkIG1zZzoiICsgbmV3IFVuaXF1ZUlkKG1zZ3NbaV0uZ2V0VW5pcXVlSWQoKSkgKyAiIGF0ICIgKyBuZXcgamF2YS5zcWwuVGltZXN0YW1wKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7CisgICAgICAgICAgICAgICAgICAgIH1jYXRjaCAoIFRocm93YWJsZSB0ICkge30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9wcm9jZXNzIHRoZSBtZXNzYWdlCisgICAgICAgICAgICAgICAgZ2V0Q2FsbGJhY2soKS5tZXNzYWdlRGF0YVJlY2VpdmVkKG1zZ3NbaV0pOworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIFVzZSBzZW5kIGFjayBoZXJlIGlmIHlvdSB3YW50IHRoZSByZXF1ZXN0IHRvIGNvbXBsZXRlIG9uIHRoaXMgCisgICAgICAgICAgICAgICAgICogc2VydmVyIGJlZm9yZSBzZW5kaW5nIHRoZSBhY2sgdG8gdGhlIHJlbW90ZSBzZXJ2ZXIKKyAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIGNvbnNpZGVyZWQgYSBzeW5jaHJvbml6ZWQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChDaGFubmVsRGF0YS5zZW5kQWNrU3luYyhtc2dzW2ldLmdldE9wdGlvbnMoKSkpIHNlbmRBY2soa2V5LGNoYW5uZWwsQ29uc3RhbnRzLkFDS19DT01NQU5EKTsKKyAgICAgICAgICAgIH1jYXRjaCAoIFJlbW90ZVByb2Nlc3NFeGNlcHRpb24gZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgbG9nLmVycm9yKCJQcm9jZXNzaW5nIG9mIGNsdXN0ZXIgbWVzc2FnZSBmYWlsZWQuIixlKTsKKyAgICAgICAgICAgICAgICBpZiAoQ2hhbm5lbERhdGEuc2VuZEFja1N5bmMobXNnc1tpXS5nZXRPcHRpb25zKCkpKSBzZW5kQWNrKGtleSxjaGFubmVsLENvbnN0YW50cy5GQUlMX0FDS19DT01NQU5EKTsKKyAgICAgICAgICAgIH1jYXRjaCAoIEV4Y2VwdGlvbiBlICkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiUHJvY2Vzc2luZyBvZiBjbHVzdGVyIG1lc3NhZ2UgZmFpbGVkLiIsZSk7CisgICAgICAgICAgICAgICAgaWYgKENoYW5uZWxEYXRhLnNlbmRBY2tTeW5jKG1zZ3NbaV0uZ2V0T3B0aW9ucygpKSkgc2VuZEFjayhrZXksY2hhbm5lbCxDb25zdGFudHMuRkFJTF9BQ0tfQ09NTUFORCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGdldFVzZUJ1ZmZlclBvb2woKSApIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJQb29sLmdldEJ1ZmZlclBvb2woKS5yZXR1cm5CdWZmZXIobXNnc1tpXS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIG1zZ3NbaV0uc2V0TWVzc2FnZShudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgaWYgKGNvdW50IDwgMCkgeworICAgICAgICAgICAgcmVtb3RlRW9mKGtleSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVtb3RlRW9mKFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICAgICAgLy8gY2xvc2UgY2hhbm5lbCBvbiBFT0YsIGludmFsaWRhdGVzIHRoZSBrZXkKKyAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIGxvZy5kZWJ1ZygiQ2hhbm5lbCBjbG9zZWQgb24gdGhlIHJlbW90ZSBlbmQsIGRpc2Nvbm5lY3RpbmciKTsKKyAgICAgICAgY2FuY2VsS2V5KGtleSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJGb3JSZWFkKGZpbmFsIFNlbGVjdGlvbktleSBrZXksIE9iamVjdFJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgaWYgKCBsb2cuaXNUcmFjZUVuYWJsZWQoKSApIAorICAgICAgICAgICAgbG9nLnRyYWNlKCJBZGRpbmcga2V5IGZvciByZWFkIGV2ZW50OiIra2V5KTsKKyAgICAgICAgcmVhZGVyLmZpbmlzaCgpOworICAgICAgICAvL3JlZ2lzdGVyIG91ciBPUF9SRUFEIGludGVyZXN0CisgICAgICAgIFJ1bm5hYmxlIHIgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN5Y2xlIHRoZSBzZWxlY3RvciBzbyB0aGlzIGtleSBpcyBhY3RpdmUgYWdhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGtleS5zZWxlY3RvcigpLndha2V1cCgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIGludGVyZXN0IGluIE9QX1JFQUQsIE9QX1dSSVRFCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzdW1lT3BzID0ga2V5LmludGVyZXN0T3BzKCkgfCBTZWxlY3Rpb25LZXkuT1BfUkVBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleS5pbnRlcmVzdE9wcyhyZXN1bWVPcHMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsb2cuaXNUcmFjZUVuYWJsZWQoKSApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiUmVnaXN0ZXJpbmcga2V5IGZvciByZWFkOiIra2V5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENhbmNlbGxlZEtleUV4Y2VwdGlvbiBja3ggKSB7CisgICAgICAgICAgICAgICAgICAgIE5pb1JlY2VpdmVyLmNhbmNlbGxlZEtleShrZXkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIGxvZy5pc1RyYWNlRW5hYmxlZCgpICkgCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIkNLWCBDYW5jZWxsaW5nIGtleToiK2tleSk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHJlZ2lzdGVyaW5nIGtleSBmb3IgcmVhZDoiK2tleSx4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHJlY2VpdmVyLmFkZEV2ZW50KHIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjYW5jZWxLZXkoZmluYWwgU2VsZWN0aW9uS2V5IGtleSkgeworICAgICAgICBpZiAoIGxvZy5pc1RyYWNlRW5hYmxlZCgpICkgCisgICAgICAgICAgICBsb2cudHJhY2UoIkFkZGluZyBrZXkgZm9yIGNhbmNlbCBldmVudDoiK2tleSk7CisKKyAgICAgICAgT2JqZWN0UmVhZGVyIHJlYWRlciA9IChPYmplY3RSZWFkZXIpa2V5LmF0dGFjaG1lbnQoKTsKKyAgICAgICAgaWYgKCByZWFkZXIgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHJlYWRlci5zZXRDYW5jZWxsZWQodHJ1ZSk7CisgICAgICAgICAgICByZWFkZXIuZmluaXNoKCk7CisgICAgICAgIH0KKyAgICAgICAgUnVubmFibGUgY3ggPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgaWYgKCBsb2cuaXNUcmFjZUVuYWJsZWQoKSApIAorICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIkNhbmNlbGxpbmcga2V5OiIra2V5KTsKKworICAgICAgICAgICAgICAgIE5pb1JlY2VpdmVyLmNhbmNlbGxlZEtleShrZXkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICByZWNlaXZlci5hZGRFdmVudChjeCk7CisgICAgfQorICAgIAorICAgIAorCisKKworICAgIC8qKgorICAgICAqIHNlbmQgYSByZXBseS1hY2tub3dsZWRnZW1lbnQgKDYsMiwzKQorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiBAcGFyYW0gY2hhbm5lbAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlbmRBY2soU2VsZWN0aW9uS2V5IGtleSwgU29ja2V0Q2hhbm5lbCBjaGFubmVsLCBieXRlW10gY29tbWFuZCkgeworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci53cmFwKGNvbW1hbmQpOworICAgICAgICAgICAgaW50IHRvdGFsID0gMDsKKyAgICAgICAgICAgIHdoaWxlICggdG90YWwgPCBjb21tYW5kLmxlbmd0aCApIHsKKyAgICAgICAgICAgICAgICB0b3RhbCArPSBjaGFubmVsLndyaXRlKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cudHJhY2UoIkFDSyBzZW50IHRvICIgKyBjaGFubmVsLnNvY2tldCgpLmdldFBvcnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKCBqYXZhLmlvLklPRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBsb2cud2FybigiVW5hYmxlIHRvIHNlbmQgQUNLIGJhY2sgdGhyb3VnaCBjaGFubmVsLCBjaGFubmVsIGRpc2Nvbm5lY3RlZD86ICIreC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UnhCdWZTaXplKGludCByeEJ1ZlNpemUpIHsKKyAgICAgICAgdGhpcy5yeEJ1ZlNpemUgPSByeEJ1ZlNpemU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSeEJ1ZlNpemUoKSB7CisgICAgICAgIHJldHVybiByeEJ1ZlNpemU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9uaW8vTmlvU2VuZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L25pby9OaW9TZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQ4MmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3RyYW5zcG9ydC9uaW8vTmlvU2VuZGVyLmphdmEKQEAgLTAsMCArMSwzMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5uaW87CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pby5YQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuQWJzdHJhY3RTZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LkRhdGFTZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuUmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIE5PVCB0aHJlYWQgc2FmZSBhbmQgc2hvdWxkIG5ldmVyIGJlIHVzZWQgd2l0aCBtb3JlIHRoYW4gb25lIHRocmVhZCBhdCBhIHRpbWUKKyAqIAorICogVGhpcyBpcyBhIHN0YXRlIG1hY2hpbmUsIGhhbmRsZWQgYnkgdGhlIHByb2Nlc3MgbWV0aG9kCisgKiBTdGF0ZXMgYXJlOgorICogLSBOT1RfQ09OTkVDVEVEIC0+IGNvbm5lY3QoKSAtPiBDT05ORUNURUQKKyAqIC0gQ09OTkVDVEVEIC0+IHNldE1lc3NhZ2UoKSAtPiBSRUFEWSBUTyBXUklURQorICogLSBSRUFEWV9UT19XUklURSAtPiB3cml0ZSgpIC0+IFJFQURZIFRPIFdSSVRFIHwgUkVBRFkgVE8gUkVBRAorICogLSBSRUFEWV9UT19SRUFEIC0+IHJlYWQoKSAtPiBSRUFEWV9UT19SRUFEIHwgVFJBTlNGRVJfQ09NUExFVEUKKyAqIC0gVFJBTlNGRVJfQ09NUExFVEUgLT4gQ09OTkVDVEVECisgKiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgTmlvU2VuZGVyIGV4dGVuZHMgQWJzdHJhY3RTZW5kZXIgaW1wbGVtZW50cyBEYXRhU2VuZGVyeworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coTmlvU2VuZGVyLmNsYXNzKTsKKworICAgIAorICAgIAorICAgIHByb3RlY3RlZCBTZWxlY3RvciBzZWxlY3RvcjsgICAgCisgICAgcHJvdGVjdGVkIFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbDsKKworICAgIC8qCisgICAgICogU1RBVEUgVkFSSUFCTEVTICoKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciByZWFkYnVmID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciB3cml0ZWJ1ZiA9IG51bGw7CisgICAgcHJvdGVjdGVkIGJ5dGVbXSBjdXJyZW50ID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgWEJ5dGVCdWZmZXIgYWNrYnVmID0gbmV3IFhCeXRlQnVmZmVyKDEyOCx0cnVlKTsKKyAgICBwcm90ZWN0ZWQgaW50IHJlbWFpbmluZyA9IDA7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29tcGxldGU7CisgICAgCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGluZyA9IGZhbHNlOworICAgIAorICAgIHB1YmxpYyBOaW9TZW5kZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTdGF0ZSBtYWNoaW5lIHRvIHNlbmQgZGF0YQorICAgICAqIEBwYXJhbSBrZXkgU2VsZWN0aW9uS2V5CisgICAgICogQHJldHVybiBib29sZWFuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoU2VsZWN0aW9uS2V5IGtleSwgYm9vbGVhbiB3YWl0Rm9yQWNrKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgb3BzID0ga2V5LnJlYWR5T3BzKCk7CisgICAgICAgIGtleS5pbnRlcmVzdE9wcyhrZXkuaW50ZXJlc3RPcHMoKSAmIH5vcHMpOworICAgICAgICAvL2luIGNhc2UgZGlzY29ubmVjdCBoYXMgYmVlbiBjYWxsZWQKKyAgICAgICAgaWYgKCghaXNDb25uZWN0ZWQoKSkgJiYgKCFjb25uZWN0aW5nKSkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTZW5kZXIgaGFzIGJlZW4gZGlzY29ubmVjdGVkLCBjYW4ndCBzZWxlY3Rpb24ga2V5LiIpOworICAgICAgICBpZiAoICFrZXkuaXNWYWxpZCgpICkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJLZXkgaXMgbm90IHZhbGlkLCBpdCBtdXN0IGhhdmUgYmVlbiBjYW5jZWxsZWQuIik7CisgICAgICAgIGlmICgga2V5LmlzQ29ubmVjdGFibGUoKSApIHsKKyAgICAgICAgICAgIGlmICggc29ja2V0Q2hhbm5lbC5maW5pc2hDb25uZWN0KCkgKSB7CisgICAgICAgICAgICAgICAgLy93ZSBjb25uZWN0ZWQsIHJlZ2lzdGVyIG91cnNlbHZlcyBmb3Igd3JpdGluZworICAgICAgICAgICAgICAgIHNldENvbm5lY3RlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc2V0UmVxdWVzdENvdW50KDApOworICAgICAgICAgICAgICAgIHNldENvbm5lY3RUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICBzb2NrZXRDaGFubmVsLnNvY2tldCgpLnNldFNlbmRCdWZmZXJTaXplKGdldFR4QnVmU2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBzb2NrZXRDaGFubmVsLnNvY2tldCgpLnNldFJlY2VpdmVCdWZmZXJTaXplKGdldFJ4QnVmU2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBzb2NrZXRDaGFubmVsLnNvY2tldCgpLnNldFNvVGltZW91dCgoaW50KWdldFRpbWVvdXQoKSk7CisgICAgICAgICAgICAgICAgc29ja2V0Q2hhbm5lbC5zb2NrZXQoKS5zZXRTb0xpbmdlcihmYWxzZSwwKTsKKyAgICAgICAgICAgICAgICBzb2NrZXRDaGFubmVsLnNvY2tldCgpLnNldFRjcE5vRGVsYXkoZ2V0VGNwTm9EZWxheSgpKTsKKyAgICAgICAgICAgICAgICBzb2NrZXRDaGFubmVsLnNvY2tldCgpLnNldEtlZXBBbGl2ZShnZXRTb0tlZXBBbGl2ZSgpKTsKKyAgICAgICAgICAgICAgICBzb2NrZXRDaGFubmVsLnNvY2tldCgpLnNldFJldXNlQWRkcmVzcyhnZXRTb1JldXNlQWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICBzb2NrZXRDaGFubmVsLnNvY2tldCgpLnNldE9PQklubGluZShnZXRPb0JJbmxpbmUoKSk7CisgICAgICAgICAgICAgICAgc29ja2V0Q2hhbm5lbC5zb2NrZXQoKS5zZXRTb0xpbmdlcihnZXRTb0xpbmdlck9uKCksZ2V0U29MaW5nZXJUaW1lKCkpOworICAgICAgICAgICAgICAgIHNvY2tldENoYW5uZWwuc29ja2V0KCkuc2V0VHJhZmZpY0NsYXNzKGdldFNvVHJhZmZpY0NsYXNzKCkpOworICAgICAgICAgICAgICAgIGlmICggY3VycmVudCAhPSBudWxsICkga2V5LmludGVyZXN0T3BzKGtleS5pbnRlcmVzdE9wcygpIHwgU2VsZWN0aW9uS2V5Lk9QX1dSSVRFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgIHsgCisgICAgICAgICAgICAgICAgLy93YWl0IGZvciB0aGUgY29ubmVjdGlvbiB0byBmaW5pc2gKKyAgICAgICAgICAgICAgICBrZXkuaW50ZXJlc3RPcHMoa2V5LmludGVyZXN0T3BzKCkgfCBTZWxlY3Rpb25LZXkuT1BfQ09OTkVDVCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgIH0gZWxzZSBpZiAoIGtleS5pc1dyaXRhYmxlKCkgKSB7CisgICAgICAgICAgICBib29sZWFuIHdyaXRlY29tcGxldGUgPSB3cml0ZShrZXkpOworICAgICAgICAgICAgaWYgKCB3cml0ZWNvbXBsZXRlICkgeworICAgICAgICAgICAgICAgIC8vd2UgYXJlIGNvbXBsZXRlZCwgc2hvdWxkIHdlIHJlYWQgYW4gYWNrPworICAgICAgICAgICAgICAgIGlmICggd2FpdEZvckFjayApIHsKKyAgICAgICAgICAgICAgICAgICAgLy9yZWdpc3RlciB0byByZWFkIHRoZSBhY2sKKyAgICAgICAgICAgICAgICAgICAga2V5LmludGVyZXN0T3BzKGtleS5pbnRlcmVzdE9wcygpIHwgU2VsZWN0aW9uS2V5Lk9QX1JFQUQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vaWYgbm90LCB3ZSBhcmUgcmVhZHksIHNldE1lc3NhZ2Ugd2lsbCByZXJlZ2lzdGVyIHVzIGZvciBhbm90aGVyIHdyaXRlIGludGVyZXN0CisgICAgICAgICAgICAgICAgICAgIC8vZG8gYSBoZWFsdGggY2hlY2ssIHdlIGhhdmUgbm8gd2F5IG9mIHZlcmlmeSBhIGRpc2Nvbm5lY3RlZAorICAgICAgICAgICAgICAgICAgICAvL3NvY2tldCBzaW5jZSB3ZSBkb24ndCByZWdpc3RlciBmb3IgT1BfUkVBRCBvbiB3YWl0Rm9yQWNrPWZhbHNlCisgICAgICAgICAgICAgICAgICAgIHJlYWQoa2V5KTsvL3RoaXMgY2F1c2VzIG92ZXJoZWFkCisgICAgICAgICAgICAgICAgICAgIHNldFJlcXVlc3RDb3VudChnZXRSZXF1ZXN0Q291bnQoKSsxKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL3dlIGFyZSBub3QgY29tcGxldGUsIGxldHMgd3JpdGUgc29tZSBtb3JlCisgICAgICAgICAgICAgICAga2V5LmludGVyZXN0T3BzKGtleS5pbnRlcmVzdE9wcygpfFNlbGVjdGlvbktleS5PUF9XUklURSk7CisgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgfSBlbHNlIGlmICgga2V5LmlzUmVhZGFibGUoKSApIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVhZGNvbXBsZXRlID0gcmVhZChrZXkpOworICAgICAgICAgICAgaWYgKCByZWFkY29tcGxldGUgKSB7CisgICAgICAgICAgICAgICAgc2V0UmVxdWVzdENvdW50KGdldFJlcXVlc3RDb3VudCgpKzEpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBrZXkuaW50ZXJlc3RPcHMoa2V5LmludGVyZXN0T3BzKCkgfCBTZWxlY3Rpb25LZXkuT1BfUkVBRCk7CisgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vdW5rbm93biBzdGF0ZSwgc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgbG9nLndhcm4oIkRhdGEgaXMgaW4gdW5rbm93biBzdGF0ZS4gcmVhZHlPcHM9IitvcHMpOworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJEYXRhIGlzIGluIHVua25vd24gc3RhdGUuIHJlYWR5T3BzPSIrb3BzKTsKKyAgICAgICAgfS8vZW5kIGlmCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgCisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFNlbGVjdGlvbktleSBrZXkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vaWYgdGhlcmUgaXMgbm8gbWVzc2FnZSBoZXJlLCB3ZSBhcmUgZG9uZQorICAgICAgICBpZiAoIGN1cnJlbnQgPT0gbnVsbCApIHJldHVybiB0cnVlOworICAgICAgICBpbnQgcmVhZCA9IHNvY2tldENoYW5uZWwucmVhZChyZWFkYnVmKTsKKyAgICAgICAgLy9lbmQgb2Ygc3RyZWFtCisgICAgICAgIGlmICggcmVhZCA9PSAtMSApIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIHJlY2VpdmUgYW4gYWNrIG1lc3NhZ2UuIEVPRiBvbiBzb2NrZXQgY2hhbm5lbCBoYXMgYmVlbiByZWFjaGVkLiIpOworICAgICAgICAvL25vIGRhdGEgcmVhZAorICAgICAgICBlbHNlIGlmICggcmVhZCA9PSAwICkgcmV0dXJuIGZhbHNlOworICAgICAgICByZWFkYnVmLmZsaXAoKTsKKyAgICAgICAgYWNrYnVmLmFwcGVuZChyZWFkYnVmLHJlYWQpOworICAgICAgICByZWFkYnVmLmNsZWFyKCk7CisgICAgICAgIGlmIChhY2tidWYuZG9lc1BhY2thZ2VFeGlzdCgpICkgeworICAgICAgICAgICAgYnl0ZVtdIGFja2NtZCA9IGFja2J1Zi5leHRyYWN0RGF0YVBhY2thZ2UodHJ1ZSkuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gYWNrID0gQXJyYXlzLmVxdWFscyhhY2tjbWQsb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LkNvbnN0YW50cy5BQ0tfREFUQSk7CisgICAgICAgICAgICBib29sZWFuIGZhY2sgPSBBcnJheXMuZXF1YWxzKGFja2NtZCxvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuQ29uc3RhbnRzLkZBSUxfQUNLX0RBVEEpOworICAgICAgICAgICAgaWYgKCBmYWNrICYmIGdldFRocm93T25GYWlsZWRBY2soKSApIHRocm93IG5ldyBSZW1vdGVQcm9jZXNzRXhjZXB0aW9uKCJSZWNlaXZlZCBhIGZhaWxlZCBhY2s6b3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LkNvbnN0YW50cy5GQUlMX0FDS19EQVRBIik7CisgICAgICAgICAgICByZXR1cm4gYWNrIHx8IGZhY2s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB3cml0ZShTZWxlY3Rpb25LZXkga2V5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoICghaXNDb25uZWN0ZWQoKSkgfHwgKHRoaXMuc29ja2V0Q2hhbm5lbD09bnVsbCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTmlvU2VuZGVyIGlzIG5vdCBjb25uZWN0ZWQsIHRoaXMgc2hvdWxkIG5vdCBvY2N1ci4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGN1cnJlbnQgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIGlmICggcmVtYWluaW5nID4gMCApIHsKKyAgICAgICAgICAgICAgICAvL3dldmUgd3JpdHRlbiBldmVyeXRoaW5nLCBvciB3ZSBhcmUgc3RhcnRpbmcgYSBuZXcgcGFja2FnZQorICAgICAgICAgICAgICAgIC8vcHJvdGVjdCBhZ2FpbnN0IGJ1ZmZlciBvdmVyd3JpdGUKKyAgICAgICAgICAgICAgICBpbnQgYnl0ZXN3cml0dGVuID0gc29ja2V0Q2hhbm5lbC53cml0ZSh3cml0ZWJ1Zik7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IGJ5dGVzd3JpdHRlbjsKKyAgICAgICAgICAgICAgICAvL2lmIHRoZSBlbnRpcmUgbWVzc2FnZSB3YXMgd3JpdHRlbiBmcm9tIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICAvL3Jlc2V0IHRoZSBwb3NpdGlvbiBjb3VudGVyCisgICAgICAgICAgICAgICAgaWYgKCByZW1haW5pbmcgPCAwICkgeworICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAocmVtYWluaW5nPT0wKTsKKyAgICAgICAgfQorICAgICAgICAvL25vIG1lc3NhZ2UgdG8gc2VuZCwgd2UgY2FuIGNvbnNpZGVyIHRoYXQgY29tcGxldGUKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29ubmVjdCAtIGJsb2NraW5nIGluIHRoaXMgb3BlcmF0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LklEYXRhU2VuZGVyIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCBjb25uZWN0aW5nICkgcmV0dXJuOworICAgICAgICBjb25uZWN0aW5nID0gdHJ1ZTsKKyAgICAgICAgaWYgKCBpc0Nvbm5lY3RlZCgpICkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJOaW9TZW5kZXIgaXMgYWxyZWFkeSBpbiBjb25uZWN0ZWQgc3RhdGUuIik7CisgICAgICAgIGlmICggcmVhZGJ1ZiA9PSBudWxsICkgeworICAgICAgICAgICAgcmVhZGJ1ZiA9IGdldFJlYWRCdWZmZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlYWRidWYuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHdyaXRlYnVmID09IG51bGwgKSB7CisgICAgICAgICAgICB3cml0ZWJ1ZiA9IGdldFdyaXRlQnVmZmVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZWJ1Zi5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBhZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGdldEFkZHJlc3MoKSxnZXRQb3J0KCkpOworICAgICAgICBpZiAoIHNvY2tldENoYW5uZWwgIT0gbnVsbCApIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU29ja2V0IGNoYW5uZWwgaGFzIGFscmVhZHkgYmVlbiBlc3RhYmxpc2hlZC4gQ29ubmVjdGlvbiBtaWdodCBiZSBpbiBwcm9ncmVzcy4iKTsKKyAgICAgICAgc29ja2V0Q2hhbm5lbCA9IFNvY2tldENoYW5uZWwub3BlbigpOworICAgICAgICBzb2NrZXRDaGFubmVsLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKKyAgICAgICAgc29ja2V0Q2hhbm5lbC5jb25uZWN0KGFkZHIpOworICAgICAgICBzb2NrZXRDaGFubmVsLnJlZ2lzdGVyKGdldFNlbGVjdG9yKCksU2VsZWN0aW9uS2V5Lk9QX0NPTk5FQ1QsdGhpcyk7CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogZGlzY29ubmVjdAorICAgICAqCisgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LklEYXRhU2VuZGVyIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uZWN0aW5nID0gZmFsc2U7CisgICAgICAgICAgICBzZXRDb25uZWN0ZWQoZmFsc2UpOworICAgICAgICAgICAgaWYgKCBzb2NrZXRDaGFubmVsICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHtzb2NrZXRDaGFubmVsLnNvY2tldCgpLmNsb3NlKCk7fWNhdGNoICggRXhjZXB0aW9uIHgpe30KKyAgICAgICAgICAgICAgICAgICAgLy9lcnJvciBmcmVlIGNsb3NlLCBhbGwgdGhlIHdheQorICAgICAgICAgICAgICAgICAgICAvL3RyeSB7c29ja2V0LnNodXRkb3duT3V0cHV0KCk7fWNhdGNoICggRXhjZXB0aW9uIHgpe30KKyAgICAgICAgICAgICAgICAgICAgLy90cnkge3NvY2tldC5zaHV0ZG93bklucHV0KCk7fWNhdGNoICggRXhjZXB0aW9uIHgpe30KKyAgICAgICAgICAgICAgICAgICAgLy90cnkge3NvY2tldC5jbG9zZSgpO31jYXRjaCAoIEV4Y2VwdGlvbiB4KXt9CisgICAgICAgICAgICAgICAgICAgIHRyeSB7c29ja2V0Q2hhbm5lbC5jbG9zZSgpO31jYXRjaCAoIEV4Y2VwdGlvbiB4KXt9CisgICAgICAgICAgICAgICAgfWZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBzb2NrZXRDaGFubmVsID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGRpc2Nvbm5lY3QgTmlvU2VuZGVyLiBtc2c9Iit4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgbG9nLmRlYnVnKCJVbmFibGUgdG8gZGlzY29ubmVjdCBOaW9TZW5kZXIuIG1zZz0iK3guZ2V0TWVzc2FnZSgpLHgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIGlmICggaXNDb25uZWN0ZWQoKSAmJiByZWFkYnVmID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlYWRidWYgPSBnZXRSZWFkQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCByZWFkYnVmICE9IG51bGwgKSByZWFkYnVmLmNsZWFyKCk7CisgICAgICAgIGlmICggd3JpdGVidWYgIT0gbnVsbCApIHdyaXRlYnVmLmNsZWFyKCk7CisgICAgICAgIGN1cnJlbnQgPSBudWxsOworICAgICAgICBhY2tidWYuY2xlYXIoKTsKKyAgICAgICAgcmVtYWluaW5nID0gMDsKKyAgICAgICAgY29tcGxldGUgPSBmYWxzZTsKKyAgICAgICAgc2V0QXR0ZW1wdCgwKTsKKyAgICAgICAgc2V0UmVxdWVzdENvdW50KDApOworICAgICAgICBzZXRDb25uZWN0VGltZSgtMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGdldFJlYWRCdWZmZXIoKSB7IAorICAgICAgICByZXR1cm4gZ2V0QnVmZmVyKGdldFJ4QnVmU2l6ZSgpKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGdldFdyaXRlQnVmZmVyKCkgeworICAgICAgICByZXR1cm4gZ2V0QnVmZmVyKGdldFR4QnVmU2l6ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJ5dGVCdWZmZXIgZ2V0QnVmZmVyKGludCBzaXplKSB7CisgICAgICAgIHJldHVybiAoZ2V0RGlyZWN0QnVmZmVyKCk/Qnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChzaXplKTpCeXRlQnVmZmVyLmFsbG9jYXRlKHNpemUpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgKiBzZW5kTWVzc2FnZQorICAgICoKKyAgICAqIEBwYXJhbSBkYXRhIENoYW5uZWxNZXNzYWdlCisgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuSURhdGFTZW5kZXIgbWV0aG9kCisgICAgKi8KKyAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRNZXNzYWdlKGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgIHNldE1lc3NhZ2UoZGF0YSwwLGRhdGEubGVuZ3RoKTsKKyAgIH0KKworICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldE1lc3NhZ2UoYnl0ZVtdIGRhdGEsaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICBpZiAoIGRhdGEgIT0gbnVsbCApIHsKKyAgICAgICAgICAgY3VycmVudCA9IGRhdGE7CisgICAgICAgICAgIHJlbWFpbmluZyA9IGxlbmd0aDsKKyAgICAgICAgICAgYWNrYnVmLmNsZWFyKCk7CisgICAgICAgICAgIGlmICggd3JpdGVidWYgIT0gbnVsbCApIHdyaXRlYnVmLmNsZWFyKCk7CisgICAgICAgICAgIGVsc2Ugd3JpdGVidWYgPSBnZXRCdWZmZXIobGVuZ3RoKTsKKyAgICAgICAgICAgaWYgKCB3cml0ZWJ1Zi5jYXBhY2l0eSgpIDwgbGVuZ3RoICkgd3JpdGVidWYgPSBnZXRCdWZmZXIobGVuZ3RoKTsKKyAgICAgICAgICAgd3JpdGVidWYucHV0KGRhdGEsb2Zmc2V0LGxlbmd0aCk7CisgICAgICAgICAgIC8vd3JpdGVidWYucmV3aW5kKCk7CisgICAgICAgICAgIC8vc2V0IHRoZSBsaW1pdCBzbyB0aGF0IHdlIGRvbid0IHdyaXRlIG5vbiB3YW50ZWQgZGF0YQorICAgICAgICAgICAvL3dyaXRlYnVmLmxpbWl0KGxlbmd0aCk7CisgICAgICAgICAgIHdyaXRlYnVmLmZsaXAoKTsKKyAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgIHNvY2tldENoYW5uZWwucmVnaXN0ZXIoZ2V0U2VsZWN0b3IoKSwgU2VsZWN0aW9uS2V5Lk9QX1dSSVRFLCB0aGlzKTsKKyAgICAgICAgICAgfQorICAgICAgIH0gCisgICB9CisgICAKKyAgIHB1YmxpYyBieXRlW10gZ2V0TWVzc2FnZSgpIHsKKyAgICAgICByZXR1cm4gY3VycmVudDsKKyAgIH0KKworCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeworICAgICAgICByZXR1cm4gY29tcGxldGU7CisgICAgfQorCisgICAgcHVibGljIFNlbGVjdG9yIGdldFNlbGVjdG9yKCkgeworICAgICAgICByZXR1cm4gc2VsZWN0b3I7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0b3IoU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGxldGUoYm9vbGVhbiBjb21wbGV0ZSkgeworICAgICAgICB0aGlzLmNvbXBsZXRlID0gY29tcGxldGU7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvbmlvL1BhcmFsbGVsTmlvU2VuZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L25pby9QYXJhbGxlbE5pb1NlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZDM4OTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L25pby9QYXJhbGxlbE5pb1NlbmRlci5qYXZhCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0Lm5pbzsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pby5DaGFubmVsRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pby5YQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuTXVsdGlQb2ludFNlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuU2VuZGVyU3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LkFic3RyYWN0U2VuZGVyOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuUnBjQ2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy51dGlsLkxvZ3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuVW5pcXVlSWQ7CisKKy8qKgorICogPHA+VGl0bGU6IDwvcD4KKyAqCisgKiA8cD5EZXNjcmlwdGlvbjogPC9wPgorICoKKyAqIDxwPkNvcHlyaWdodDogQ29weXJpZ2h0IChjKSAyMDA1PC9wPgorICoKKyAqIDxwPkNvbXBhbnk6IDwvcD4KKyAqCisgKiBAYXV0aG9yIG5vdCBhdHRyaWJ1dGFibGUKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxOaW9TZW5kZXIgZXh0ZW5kcyBBYnN0cmFjdFNlbmRlciBpbXBsZW1lbnRzIE11bHRpUG9pbnRTZW5kZXIgeworICAgIAorICAgIHByb3RlY3RlZCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKFBhcmFsbGVsTmlvU2VuZGVyLmNsYXNzKTsKKyAgICBwcm90ZWN0ZWQgbG9uZyBzZWxlY3RUaW1lb3V0ID0gNTAwMDsgLy9kZWZhdWx0IDUgc2Vjb25kcywgc2FtZSBhcyBzZW5kIHRpbWVvdXQKKyAgICBwcm90ZWN0ZWQgU2VsZWN0b3Igc2VsZWN0b3I7CisgICAgcHJvdGVjdGVkIEhhc2hNYXAgbmlvU2VuZGVycyA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICBwdWJsaWMgUGFyYWxsZWxOaW9TZW5kZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzZWxlY3RvciA9IFNlbGVjdG9yLm9wZW4oKTsKKyAgICAgICAgc2V0Q29ubmVjdGVkKHRydWUpOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2VuZE1lc3NhZ2UoTWVtYmVyW10gZGVzdGluYXRpb24sIENoYW5uZWxNZXNzYWdlIG1zZykgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gWEJ5dGVCdWZmZXIuY3JlYXRlRGF0YVBhY2thZ2UoKENoYW5uZWxEYXRhKW1zZyk7CisgICAgICAgIE5pb1NlbmRlcltdIHNlbmRlcnMgPSBzZXR1cEZvclNlbmQoZGVzdGluYXRpb24pOworICAgICAgICBjb25uZWN0KHNlbmRlcnMpOworICAgICAgICBzZXREYXRhKHNlbmRlcnMsZGF0YSk7CisgICAgICAgIAorICAgICAgICBpbnQgcmVtYWluaW5nID0gc2VuZGVycy5sZW5ndGg7CisgICAgICAgIENoYW5uZWxFeGNlcHRpb24gY3ggPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy9sb29wIHVudGlsIGNvbXBsZXRlLCBhbiBlcnJvciBoYXBwZW5zLCBvciB3ZSB0aW1lb3V0CisgICAgICAgICAgICBsb25nIGRlbHRhID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKKyAgICAgICAgICAgIGJvb2xlYW4gd2FpdEZvckFjayA9IChDaGFubmVsLlNFTkRfT1BUSU9OU19VU0VfQUNLICYgbXNnLmdldE9wdGlvbnMoKSkgPT0gQ2hhbm5lbC5TRU5EX09QVElPTlNfVVNFX0FDSzsKKyAgICAgICAgICAgIHdoaWxlICggKHJlbWFpbmluZz4wKSAmJiAoZGVsdGE8Z2V0VGltZW91dCgpKSApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gZG9Mb29wKHNlbGVjdFRpbWVvdXQsIGdldE1heFJldHJ5QXR0ZW1wdHMoKSx3YWl0Rm9yQWNrLG1zZyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggY3ggPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggeCBpbnN0YW5jZW9mIENoYW5uZWxFeGNlcHRpb24gKSBjeCA9IChDaGFubmVsRXhjZXB0aW9uKXg7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGN4ID0gbmV3IENoYW5uZWxFeGNlcHRpb24oIlBhcmFsbGVsIE5JTyBzZW5kIGZhaWxlZC4iLCB4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4IGluc3RhbmNlb2YgQ2hhbm5lbEV4Y2VwdGlvbikgY3guYWRkRmF1bHR5TWVtYmVyKCAoIChDaGFubmVsRXhjZXB0aW9uKSB4KS5nZXRGYXVsdHlNZW1iZXJzKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vYmFpbCBvdXQgaWYgYWxsIHJlbWFpbmluZyBzZW5kZXJzIGFyZSBmYWlsaW5nCisgICAgICAgICAgICAgICAgaWYgKCBjeCAhPSBudWxsICYmIGN4LmdldEZhdWx0eU1lbWJlcnMoKS5sZW5ndGggPT0gcmVtYWluaW5nICkgdGhyb3cgY3g7CisgICAgICAgICAgICAgICAgZGVsdGEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCByZW1haW5pbmcgPiAwICkgeworICAgICAgICAgICAgICAgIC8vdGltZW91dCBoYXMgb2NjdXJlZAorICAgICAgICAgICAgICAgIGN4ID0gbmV3IENoYW5uZWxFeGNlcHRpb24oIk9wZXJhdGlvbiBoYXMgdGltZWQgb3V0KCIrZ2V0VGltZW91dCgpKyIgbXMuKS4iKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8c2VuZGVycy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzZW5kZXJzW2ldLmlzQ29tcGxldGUoKSApIGN4LmFkZEZhdWx0eU1lbWJlcihzZW5kZXJzW2ldLmdldERlc3RpbmF0aW9uKCksbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IGN4OworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIHRyeSB7IHRoaXMuZGlzY29ubmVjdCgpOyB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7fQorICAgICAgICAgICAgaWYgKCB4IGluc3RhbmNlb2YgQ2hhbm5lbEV4Y2VwdGlvbiApIHRocm93IChDaGFubmVsRXhjZXB0aW9uKXg7CisgICAgICAgICAgICBlbHNlIHRocm93IG5ldyBDaGFubmVsRXhjZXB0aW9uKHgpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGludCBkb0xvb3AobG9uZyBzZWxlY3RUaW1lT3V0LCBpbnQgbWF4QXR0ZW1wdHMsIGJvb2xlYW4gd2FpdEZvckFjaywgQ2hhbm5lbE1lc3NhZ2UgbXNnKSB0aHJvd3MgSU9FeGNlcHRpb24sIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICBpbnQgY29tcGxldGVkID0gMDsKKyAgICAgICAgaW50IHNlbGVjdGVkS2V5cyA9IHNlbGVjdG9yLnNlbGVjdChzZWxlY3RUaW1lT3V0KTsKKyAgICAgICAgCisgICAgICAgIGlmIChzZWxlY3RlZEtleXMgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEl0ZXJhdG9yIGl0ID0gc2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgU2VsZWN0aW9uS2V5IHNrID0gKFNlbGVjdGlvbktleSkgaXQubmV4dCgpOworICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICBpbnQgcmVhZHlPcHMgPSBzay5yZWFkeU9wcygpOworICAgICAgICAgICAgc2suaW50ZXJlc3RPcHMoc2suaW50ZXJlc3RPcHMoKSAmIH5yZWFkeU9wcyk7CisgICAgICAgICAgICBOaW9TZW5kZXIgc2VuZGVyID0gKE5pb1NlbmRlcikgc2suYXR0YWNobWVudCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoc2VuZGVyLnByb2Nlc3Moc2ssd2FpdEZvckFjaykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkKys7CisgICAgICAgICAgICAgICAgICAgIHNlbmRlci5zZXRDb21wbGV0ZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBMb2dzLk1FU1NBR0VTLmlzVHJhY2VFbmFibGVkKCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2dzLk1FU1NBR0VTLnRyYWNlKCJQYXJhbGxlbE5pb1NlbmRlciAtIFNlbnQgbXNnOiIgKyBuZXcgVW5pcXVlSWQobXNnLmdldFVuaXF1ZUlkKCkpICsgIiBhdCAiICtuZXcgamF2YS5zcWwuVGltZXN0YW1wKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSsgIiB0byAiK3NlbmRlci5nZXREZXN0aW5hdGlvbigpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU2VuZGVyU3RhdGUuZ2V0U2VuZGVyU3RhdGUoc2VuZGVyLmdldERlc3RpbmF0aW9uKCkpLnNldFJlYWR5KCk7CisgICAgICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIFNlbmRlclN0YXRlIHN0YXRlID0gU2VuZGVyU3RhdGUuZ2V0U2VuZGVyU3RhdGUoc2VuZGVyLmdldERlc3RpbmF0aW9uKCkpOworICAgICAgICAgICAgICAgIGludCBhdHRlbXB0ID0gc2VuZGVyLmdldEF0dGVtcHQoKSsxOworICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV0cnkgPSAoc2VuZGVyLmdldEF0dGVtcHQoKSA8PSBtYXhBdHRlbXB0cyAmJiBtYXhBdHRlbXB0cz4wKTsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHN0YXRlKSB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vc2suY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5pc1N1c3BlY3QoKSkgc3RhdGUuc2V0RmFpbGluZygpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuaXNSZWFkeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zZXRTdXNwZWN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHJldHJ5ICkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIk1lbWJlciBzZW5kIGlzIGZhaWxpbmcgZm9yOiIgKyBzZW5kZXIuZ2V0RGVzdGluYXRpb24oKS5nZXROYW1lKCkgKyIgOyBTZXR0aW5nIHRvIHN1c3BlY3QgYW5kIHJldHJ5aW5nLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiTWVtYmVyIHNlbmQgaXMgZmFpbGluZyBmb3I6IiArIHNlbmRlci5nZXREZXN0aW5hdGlvbigpLmdldE5hbWUoKSArIiA7IFNldHRpbmcgdG8gc3VzcGVjdC4iLCB4KTsKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggIWlzQ29ubmVjdGVkKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJOb3QgcmV0cnlpbmcgc2VuZCBmb3I6IiArIHNlbmRlci5nZXREZXN0aW5hdGlvbigpLmdldE5hbWUoKSArICI7IFNlbmRlciBpcyBkaXNjb25uZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgIENoYW5uZWxFeGNlcHRpb24gY3ggPSBuZXcgQ2hhbm5lbEV4Y2VwdGlvbigiU2VuZCBmYWlsZWQsIGFuZCBzZW5kZXIgaXMgZGlzY29ubmVjdGVkLiBOb3QgcmV0cnlpbmcuIix4KTsKKyAgICAgICAgICAgICAgICAgICAgY3guYWRkRmF1bHR5TWVtYmVyKHNlbmRlci5nZXREZXN0aW5hdGlvbigpLHgpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBjeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBzZW5kZXIuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgIGlmICggcmV0cnkgKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7IAorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmRpc2Nvbm5lY3QoKTsgCisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIuY29ubmVjdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLnNldEF0dGVtcHQoYXR0ZW1wdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIuc2V0TWVzc2FnZShkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIGlnbm9yZSl7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zZXRGYWlsaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDaGFubmVsRXhjZXB0aW9uIGN4ID0gbmV3IENoYW5uZWxFeGNlcHRpb24oIlNlbmQgZmFpbGVkLCBhdHRlbXB0OiIrc2VuZGVyLmdldEF0dGVtcHQoKSsiIG1heDoiK21heEF0dGVtcHRzLHgpOworICAgICAgICAgICAgICAgICAgICBjeC5hZGRGYXVsdHlNZW1iZXIoc2VuZGVyLmdldERlc3RpbmF0aW9uKCkseCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGN4OworICAgICAgICAgICAgICAgIH0vL2VuZCBpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21wbGV0ZWQ7CisKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3QoTmlvU2VuZGVyW10gc2VuZGVycykgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24geworICAgICAgICBDaGFubmVsRXhjZXB0aW9uIHggPSBudWxsOworICAgICAgICBmb3IgKGludCBpPTA7IGk8c2VuZGVycy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKCFzZW5kZXJzW2ldLmlzQ29ubmVjdGVkKCkpIHNlbmRlcnNbaV0uY29ubmVjdCgpOworICAgICAgICAgICAgfWNhdGNoICggSU9FeGNlcHRpb24gaW8gKSB7CisgICAgICAgICAgICAgICAgaWYgKCB4PT1udWxsICkgeCA9IG5ldyBDaGFubmVsRXhjZXB0aW9uKGlvKTsKKyAgICAgICAgICAgICAgICB4LmFkZEZhdWx0eU1lbWJlcihzZW5kZXJzW2ldLmdldERlc3RpbmF0aW9uKCksaW8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICggeCAhPSBudWxsICkgdGhyb3cgeDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHNldERhdGEoTmlvU2VuZGVyW10gc2VuZGVycywgYnl0ZVtdIGRhdGEpIHRocm93cyBDaGFubmVsRXhjZXB0aW9uIHsKKyAgICAgICAgQ2hhbm5lbEV4Y2VwdGlvbiB4ID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNlbmRlcnMubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlbmRlcnNbaV0uc2V0TWVzc2FnZShkYXRhKTsKKyAgICAgICAgICAgIH1jYXRjaCAoIElPRXhjZXB0aW9uIGlvICkgeworICAgICAgICAgICAgICAgIGlmICggeD09bnVsbCApIHggPSBuZXcgQ2hhbm5lbEV4Y2VwdGlvbihpbyk7CisgICAgICAgICAgICAgICAgeC5hZGRGYXVsdHlNZW1iZXIoc2VuZGVyc1tpXS5nZXREZXN0aW5hdGlvbigpLGlvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIHggIT0gbnVsbCApIHRocm93IHg7CisgICAgfQorICAgIAorICAgIAorICAgIHByaXZhdGUgTmlvU2VuZGVyW10gc2V0dXBGb3JTZW5kKE1lbWJlcltdIGRlc3RpbmF0aW9uKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIENoYW5uZWxFeGNlcHRpb24gY3ggPSBudWxsOworICAgICAgICBOaW9TZW5kZXJbXSByZXN1bHQgPSBuZXcgTmlvU2VuZGVyW2Rlc3RpbmF0aW9uLmxlbmd0aF07CisgICAgICAgIGZvciAoIGludCBpPTA7IGk8ZGVzdGluYXRpb24ubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICBOaW9TZW5kZXIgc2VuZGVyID0gKE5pb1NlbmRlciluaW9TZW5kZXJzLmdldChkZXN0aW5hdGlvbltpXSk7CisgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgaWYgKHNlbmRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRlciA9IG5ldyBOaW9TZW5kZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZGVyLnRyYW5zZmVyUHJvcGVydGllcyh0aGlzLCBzZW5kZXIpOworICAgICAgICAgICAgICAgICAgICBuaW9TZW5kZXJzLnB1dChkZXN0aW5hdGlvbltpXSwgc2VuZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNlbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRlci5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICBzZW5kZXIuc2V0RGVzdGluYXRpb24oZGVzdGluYXRpb25baV0pOworICAgICAgICAgICAgICAgICAgICBzZW5kZXIuc2V0U2VsZWN0b3Ioc2VsZWN0b3IpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBzZW5kZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWNhdGNoICggVW5rbm93bkhvc3RFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICBpZiAoY3ggPT0gbnVsbCkgY3ggPSBuZXcgQ2hhbm5lbEV4Y2VwdGlvbigiVW5hYmxlIHRvIHNldHVwIE5pb1NlbmRlci4iLCB4KTsKKyAgICAgICAgICAgICAgICBjeC5hZGRGYXVsdHlNZW1iZXIoZGVzdGluYXRpb25baV0sIHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICggY3ggIT0gbnVsbCApIHRocm93IGN4OworICAgICAgICBlbHNlIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoKSB7CisgICAgICAgIC8vZG8gbm90aGluZywgd2UgY29ubmVjdCBvbiBkZW1hbmQKKyAgICAgICAgc2V0Q29ubmVjdGVkKHRydWUpOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgdGhyb3dzIENoYW5uZWxFeGNlcHRpb24gIHsKKyAgICAgICAgQ2hhbm5lbEV4Y2VwdGlvbiB4ID0gbnVsbDsKKyAgICAgICAgT2JqZWN0W10gbWVtYmVycyA9IG5pb1NlbmRlcnMua2V5U2V0KCkudG9BcnJheSgpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bWVtYmVycy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgIE1lbWJlciBtYnIgPSAoTWVtYmVyKW1lbWJlcnNbaV07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE5pb1NlbmRlciBzZW5kZXIgPSAoTmlvU2VuZGVyKW5pb1NlbmRlcnMuZ2V0KG1icik7CisgICAgICAgICAgICAgICAgc2VuZGVyLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIH1jYXRjaCAoIEV4Y2VwdGlvbiBlICkgeworICAgICAgICAgICAgICAgIGlmICggeCA9PSBudWxsICkgeCA9IG5ldyBDaGFubmVsRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIHguYWRkRmF1bHR5TWVtYmVyKG1icixlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5pb1NlbmRlcnMucmVtb3ZlKG1icik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCB4ICE9IG51bGwgKSB0aHJvdyB4OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJEaXNhcHBlYXJlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIC8vZGlzY29ubmVjdCBzZW5kZXJzCisgICAgICAgIE5pb1NlbmRlciBzZW5kZXIgPSAoTmlvU2VuZGVyKW5pb1NlbmRlcnMucmVtb3ZlKG1lbWJlcik7CisgICAgICAgIGlmICggc2VuZGVyICE9IG51bGwgKSBzZW5kZXIuZGlzY29ubmVjdCgpOworICAgIH0KKworICAgIAorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNjb25uZWN0KCkgeworICAgICAgICBzZXRDb25uZWN0ZWQoZmFsc2UpOworICAgICAgICB0cnkge2Nsb3NlKCk7IH1jYXRjaCAoRXhjZXB0aW9uIHgpe30KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGZpbmFsaXplKCkgeworICAgICAgICB0cnkge2Rpc2Nvbm5lY3QoKTsgfWNhdGNoICggRXhjZXB0aW9uIGlnbm9yZSl7fQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGtlZXBhbGl2ZSgpIHsKKyAgICAgICAgLy90aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCBQYXJhbGxlbE5pb1NlbmRlci5jaGVja0tlZXBBbGl2ZSgpIG5vdCBpbXBsZW1lbnRlZCIpOworICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOworICAgICAgICBmb3IgKCBJdGVyYXRvciBpID0gbmlvU2VuZGVycy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyAgKSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWkubmV4dCgpOworICAgICAgICAgICAgTmlvU2VuZGVyIHNlbmRlciA9IChOaW9TZW5kZXIpZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmICggc2VuZGVyLmtlZXBhbGl2ZSgpICkgeworICAgICAgICAgICAgICAgIG5pb1NlbmRlcnMucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90cmFuc3BvcnQvbmlvL1Bvb2xlZFBhcmFsbGVsU2VuZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L25pby9Qb29sZWRQYXJhbGxlbFNlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOWZhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdHJhbnNwb3J0L25pby9Qb29sZWRQYXJhbGxlbFNlbmRlci5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0Lm5pbzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuRGF0YVNlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuTXVsdGlQb2ludFNlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuUG9vbGVkU2VuZGVyOworCisvKioKKyAqIDxwPlRpdGxlOiA8L3A+CisgKgorICogPHA+RGVzY3JpcHRpb246IDwvcD4KKyAqCisgKiA8cD5Db3B5cmlnaHQ6IENvcHlyaWdodCAoYykgMjAwNTwvcD4KKyAqCisgKiA8cD5Db21wYW55OiA8L3A+CisgKgorICogQGF1dGhvciBub3QgYXR0cmlidXRhYmxlCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIFBvb2xlZFBhcmFsbGVsU2VuZGVyIGV4dGVuZHMgUG9vbGVkU2VuZGVyIGltcGxlbWVudHMgTXVsdGlQb2ludFNlbmRlciB7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGVkID0gdHJ1ZTsKKyAgICBwdWJsaWMgUG9vbGVkUGFyYWxsZWxTZW5kZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKE1lbWJlcltdIGRlc3RpbmF0aW9uLCBDaGFubmVsTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgQ2hhbm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICggIWNvbm5lY3RlZCApIHRocm93IG5ldyBDaGFubmVsRXhjZXB0aW9uKCJTZW5kZXIgbm90IGNvbm5lY3RlZC4iKTsKKyAgICAgICAgUGFyYWxsZWxOaW9TZW5kZXIgc2VuZGVyID0gKFBhcmFsbGVsTmlvU2VuZGVyKWdldFNlbmRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VuZGVyLnNlbmRNZXNzYWdlKGRlc3RpbmF0aW9uLCBtZXNzYWdlKTsKKyAgICAgICAgICAgIHNlbmRlci5rZWVwYWxpdmUoKTsKKyAgICAgICAgfWZpbmFsbHkgeworICAgICAgICAgICAgaWYgKCAhY29ubmVjdGVkICkgZGlzY29ubmVjdCgpOworICAgICAgICAgICAgcmV0dXJuU2VuZGVyKHNlbmRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YVNlbmRlciBnZXROZXdEYXRhU2VuZGVyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGFyYWxsZWxOaW9TZW5kZXIgc2VuZGVyID0gbmV3IFBhcmFsbGVsTmlvU2VuZGVyKCk7CisgICAgICAgICAgICBzZW5kZXIudHJhbnNmZXJQcm9wZXJ0aWVzKHRoaXMsc2VuZGVyKTsKKyAgICAgICAgICAgIHJldHVybiBzZW5kZXI7CisgICAgICAgIH0gY2F0Y2ggKCBJT0V4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBvcGVuIE5JTyBzZWxlY3Rvci4iLHgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNjb25uZWN0KCkgeworICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICBzdXBlci5kaXNjb25uZWN0KCk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7CisgICAgICAgIHN1cGVyLmNvbm5lY3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgLy9kaXNjb25uZWN0IHNlbmRlcnMKKyAgICB9ICAgIAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy91dGlsL0FycmF5cy5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3V0aWwvQXJyYXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ0YTUxNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy91dGlsL0FycmF5cy5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLlVuaXF1ZUlkOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkFic29sdXRlT3JkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMubWVtYmVyc2hpcC5NZW1iZXJJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLm1lbWJlcnNoaXAuTWVtYmVyc2hpcDsKKworLyoqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIEFycmF5cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoYnl0ZVtdIHNvdXJjZSwgaW50IHNyY29mZnNldCwgYnl0ZVtdIGtleSwgaW50IGtleW9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAoIHNyY29mZnNldCA8IDAgfHwgc3Jjb2Zmc2V0ID49IHNvdXJjZS5sZW5ndGgpIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oInNyY29mZnNldCBpcyBvdXQgb2YgYm91bmRzLiIpOworICAgICAgICBpZiAoIGtleW9mZnNldCA8IDAgfHwga2V5b2Zmc2V0ID49IGtleS5sZW5ndGgpIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oImtleW9mZnNldCBpcyBvdXQgb2YgYm91bmRzLiIpOworICAgICAgICBpZiAoIGxlbmd0aCA+IChrZXkubGVuZ3RoLWtleW9mZnNldCkgKSB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJub3QgZW5vdWdoIGRhdGEgZWxlbWVudHMgaW4gdGhlIGtleSwgbGVuZ3RoIGlzIG91dCBvZiBib3VuZHMuIik7CisgICAgICAgIC8vd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZGF0YSB0byB2YWxpZGF0ZSBpdAorICAgICAgICBpZiAoIGxlbmd0aCA+IChzb3VyY2UubGVuZ3RoLXNyY29mZnNldCkgKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gbWF0Y2ggPSB0cnVlOworICAgICAgICBpbnQgcG9zID0ga2V5b2Zmc2V0OworICAgICAgICBmb3IgKCBpbnQgaT1zcmNvZmZzZXQ7IG1hdGNoICYmIGk8bGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICBtYXRjaCA9IChzb3VyY2VbaV0gPT0ga2V5W3BvcysrXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hdGNoOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhieXRlW10gZGF0YSkgeworICAgICAgICByZXR1cm4gdG9TdHJpbmcoZGF0YSwwLGRhdGEhPW51bGw/ZGF0YS5sZW5ndGg6MCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoInsiKTsKKyAgICAgICAgaWYgKCBkYXRhICE9IG51bGwgJiYgbGVuZ3RoID4gMCApIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZGF0YVtvZmZzZXQrK10pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKS5hcHBlbmQoZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgifSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKE9iamVjdFtdIGRhdGEpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKGRhdGEsMCxkYXRhIT1udWxsP2RhdGEubGVuZ3RoOjApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhPYmplY3RbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJ7Iik7CisgICAgICAgIGlmICggZGF0YSAhPSBudWxsICYmIGxlbmd0aCA+IDAgKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKGRhdGFbb2Zmc2V0KytdKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIikuYXBwZW5kKGRhdGFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b05hbWVTdHJpbmcoTWVtYmVyW10gZGF0YSkgeworICAgICAgICByZXR1cm4gdG9OYW1lU3RyaW5nKGRhdGEsMCxkYXRhIT1udWxsP2RhdGEubGVuZ3RoOjApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b05hbWVTdHJpbmcoTWVtYmVyW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigieyIpOworICAgICAgICBpZiAoIGRhdGEgIT0gbnVsbCAmJiBsZW5ndGggPiAwICkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChkYXRhW29mZnNldCsrXS5nZXROYW1lKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKS5hcHBlbmQoZGF0YVtpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGFkZChpbnRbXSBkYXRhKSB7CisgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICBmb3IgKGludCBpPTA7aTxkYXRhLmxlbmd0aDsgaSsrICkgcmVzdWx0ICs9IGRhdGFbaV07CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgVW5pcXVlSWQgZ2V0VW5pcXVkSWQoQ2hhbm5lbE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHJldHVybiBuZXcgVW5pcXVlSWQobXNnLmdldFVuaXF1ZUlkKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVW5pcXVlSWQgZ2V0VW5pcXVkSWQoYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBVbmlxdWVJZChkYXRhKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhieXRlW10gbzEsIGJ5dGVbXSBvMikgeworICAgICAgICByZXR1cm4gamF2YS51dGlsLkFycmF5cy5lcXVhbHMobzEsbzIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0W10gbzEsIE9iamVjdFtdIG8yKSB7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gbzEubGVuZ3RoID09IG8yLmxlbmd0aDsKKyAgICAgICAgaWYgKCByZXN1bHQgKSBmb3IgKGludCBpPTA7IGk8bzEubGVuZ3RoICYmIHJlc3VsdDsgaSsrICkgcmVzdWx0ID0gbzFbaV0uZXF1YWxzKG8yW2ldKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNhbWVNZW1iZXJzKE1lbWJlcltdIG0xLCBNZW1iZXJbXSBtMikgeworICAgICAgICBBYnNvbHV0ZU9yZGVyLmFic29sdXRlT3JkZXIobTEpOworICAgICAgICBBYnNvbHV0ZU9yZGVyLmFic29sdXRlT3JkZXIobTIpOworICAgICAgICByZXR1cm4gZXF1YWxzKG0xLG0yKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBNZW1iZXJbXSBtZXJnZShNZW1iZXJbXSBtMSwgTWVtYmVyW10gbTIpIHsKKyAgICAgICAgQWJzb2x1dGVPcmRlci5hYnNvbHV0ZU9yZGVyKG0xKTsKKyAgICAgICAgQWJzb2x1dGVPcmRlci5hYnNvbHV0ZU9yZGVyKG0yKTsKKyAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGphdmEudXRpbC5BcnJheXMuYXNMaXN0KG0xKSk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxtMi5sZW5ndGg7IGkrKykgaWYgKCAhbGlzdC5jb250YWlucyhtMltpXSkgKSBsaXN0LmFkZChtMltpXSk7CisgICAgICAgIE1lbWJlcltdIHJlc3VsdCA9IG5ldyBNZW1iZXJbbGlzdC5zaXplKCldOworICAgICAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKKyAgICAgICAgQWJzb2x1dGVPcmRlci5hYnNvbHV0ZU9yZGVyKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKE1lbWJlcnNoaXAgbWJyc2hpcCwgTWVtYmVyW10gbSkgeworICAgICAgICBmb3IgKGludCBpPTA7IGk8bS5sZW5ndGg7IGkrKyApIG1icnNoaXAuYWRkTWVtYmVyKChNZW1iZXJJbXBsKW1baV0pOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIE1lbWJlcltdIGRpZmYoTWVtYmVyc2hpcCBjb21wbGV0ZSwgTWVtYmVyc2hpcCBsb2NhbCwgTWVtYmVySW1wbCBpZ25vcmUpIHsKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgTWVtYmVySW1wbFtdIGNvbXAgPSBjb21wbGV0ZS5nZXRNZW1iZXJzKCk7CisgICAgICAgIGZvciAoIGludCBpPTA7IGk8Y29tcC5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgIGlmICggaWdub3JlIT1udWxsICYmIGlnbm9yZS5lcXVhbHMoY29tcFtpXSkgKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICggbG9jYWwuZ2V0TWVtYmVyKGNvbXBbaV0pID09IG51bGwgKSByZXN1bHQuYWRkKGNvbXBbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoTWVtYmVySW1wbFtdKXJlc3VsdC50b0FycmF5KG5ldyBNZW1iZXJJbXBsW3Jlc3VsdC5zaXplKCldKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBNZW1iZXJbXSByZW1vdmUoTWVtYmVyW10gYWxsLCBNZW1iZXIgcmVtb3ZlKSB7CisgICAgICAgIHJldHVybiBleHRyYWN0KGFsbCxuZXcgTWVtYmVyW10ge3JlbW92ZX0pOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIE1lbWJlcltdIGV4dHJhY3QoTWVtYmVyW10gYWxsLCBNZW1iZXJbXSByZW1vdmUpIHsKKyAgICAgICAgTGlzdCBhbGlzdCA9IGphdmEudXRpbC5BcnJheXMuYXNMaXN0KGFsbCk7CisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChhbGlzdCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxyZW1vdmUubGVuZ3RoOyBpKysgKSBsaXN0LnJlbW92ZShyZW1vdmVbaV0pOworICAgICAgICByZXR1cm4gKE1lbWJlcltdKWxpc3QudG9BcnJheShuZXcgTWVtYmVyW2xpc3Quc2l6ZSgpXSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoTWVtYmVyIG1lbWJlciwgTWVtYmVyW10gbWVtYmVycykgeworICAgICAgICBpbnQgcmVzdWx0ID0gLTE7CisgICAgICAgIGZvciAoaW50IGk9MDsgKHJlc3VsdD09LTEpICYmIChpPG1lbWJlcnMubGVuZ3RoKTsgaSsrICkgCisgICAgICAgICAgICBpZiAoIG1lbWJlci5lcXVhbHMobWVtYmVyc1tpXSkgKSByZXN1bHQgPSBpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGludCBuZXh0SW5kZXgoTWVtYmVyIG1lbWJlciwgTWVtYmVyW10gbWVtYmVycykgeworICAgICAgICBpbnQgaWR4ID0gaW5kZXhPZihtZW1iZXIsbWVtYmVycykrMTsKKyAgICAgICAgaWYgKGlkeCA+PSBtZW1iZXJzLmxlbmd0aCApIGlkeCA9ICgobWVtYmVycy5sZW5ndGg+MCk/MDotMSk7CisgICAgICAgIAorLy9TeXN0ZW0ub3V0LnByaW50bG4oIk5leHQgaW5kZXg6IitpZHgpOworLy9TeXN0ZW0ub3V0LnByaW50bG4oIk1lbWJlcjoiK21lbWJlci5nZXROYW1lKCkpOworLy9TeXN0ZW0ub3V0LnByaW50bG4oIk1lbWJlcnM6Iit0b05hbWVTdHJpbmcobWVtYmVycykpOworICAgICAgICByZXR1cm4gaWR4OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShieXRlIGFbXSkgeworICAgICAgICBpZiAoYSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaW50IHJlc3VsdCA9IDE7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBieXRlIGVsZW1lbnQgPSBhW2ldOworICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBlbGVtZW50OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisKKyAgICAKKyAgICAKKyAgICAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdXRpbC9Mb2dzLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdXRpbC9Mb2dzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBlMGFjMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy91dGlsL0xvZ3MuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworLyoqCisgKiAKKyAqIFNpbXBsZSBjbGFzcyB0aGF0IGhvbGRzIHJlZmVyZW5jZXMgdG8gZ2xvYmFsIGxvZ2dlcnMKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgTG9ncyB7CisgICAgcHVibGljIHN0YXRpYyBMb2cgTUVTU0FHRVMgPSBMb2dGYWN0b3J5LmdldExvZyggIm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1FU1NBR0VTIiApOworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3V0aWwvU3RyaW5nTWFuYWdlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3V0aWwvU3RyaW5nTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMThkZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdXRpbC9TdHJpbmdNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbDsKKworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKKworLyoqCisgKiBBbiBpbnRlcm5hdGlvbmFsaXphdGlvbiAvIGxvY2FsaXphdGlvbiBoZWxwZXIgY2xhc3Mgd2hpY2ggcmVkdWNlcworICogdGhlIGJvdGhlciBvZiBoYW5kbGluZyBSZXNvdXJjZUJ1bmRsZXMgYW5kIHRha2VzIGNhcmUgb2YgdGhlCisgKiBjb21tb24gY2FzZXMgb2YgbWVzc2FnZSBmb3JtYXRpbmcgd2hpY2ggb3RoZXJ3aXNlIHJlcXVpcmUgdGhlCisgKiBjcmVhdGlvbiBvZiBPYmplY3QgYXJyYXlzIGFuZCBzdWNoLgorICoKKyAqIDxwPlRoZSBTdHJpbmdNYW5hZ2VyIG9wZXJhdGVzIG9uIGEgcGFja2FnZSBiYXNpcy4gT25lIFN0cmluZ01hbmFnZXIKKyAqIHBlciBwYWNrYWdlIGNhbiBiZSBjcmVhdGVkIGFuZCBhY2Nlc3NlZCB2aWEgdGhlIGdldE1hbmFnZXIgbWV0aG9kCisgKiBjYWxsLgorICoKKyAqIDxwPlRoZSBTdHJpbmdNYW5hZ2VyIHdpbGwgbG9vayBmb3IgYSBSZXNvdXJjZUJ1bmRsZSBuYW1lZCBieQorICogdGhlIHBhY2thZ2UgbmFtZSBnaXZlbiBwbHVzIHRoZSBzdWZmaXggb2YgIkxvY2FsU3RyaW5ncyIuIEluCisgKiBwcmFjdGljZSwgdGhpcyBtZWFucyB0aGF0IHRoZSBsb2NhbGl6ZWQgaW5mb3JtYXRpb24gd2lsbCBiZSBjb250YWluZWQKKyAqIGluIGEgTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgZmlsZSBsb2NhdGVkIGluIHRoZSBwYWNrYWdlCisgKiBkaXJlY3Rvcnkgb2YgdGhlIGNsYXNzcGF0aC4KKyAqCisgKiA8cD5QbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgZm9yCisgKiBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIEBhdXRob3IgSmFtZXMgRHVuY2FuIERhdmlkc29uIFtkdW5jYW5AZW5nLnN1bi5jb21dCisgKiBAYXV0aG9yIEphbWVzIFRvZGQgW2dvbnpvQGVuZy5zdW4uY29tXQorICovCisKK3B1YmxpYyBjbGFzcyBTdHJpbmdNYW5hZ2VyIHsKKworICAgIC8qKgorICAgICAqIFRoZSBSZXNvdXJjZUJ1bmRsZSBmb3IgdGhpcyBTdHJpbmdNYW5hZ2VyLgorICAgICAqLworCisgICAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBidW5kbGU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggU3RyaW5nTWFuYWdlci5jbGFzcyApOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBTdHJpbmdNYW5hZ2VyIGZvciBhIGdpdmVuIHBhY2thZ2UuIFRoaXMgaXMgYQorICAgICAqIHByaXZhdGUgbWV0aG9kIGFuZCBhbGwgYWNjZXNzIHRvIGl0IGlzIGFyYml0cmF0ZWQgYnkgdGhlCisgICAgICogc3RhdGljIGdldE1hbmFnZXIgbWV0aG9kIGNhbGwgc28gdGhhdCBvbmx5IG9uZSBTdHJpbmdNYW5hZ2VyCisgICAgICogcGVyIHBhY2thZ2Ugd2lsbCBiZSBjcmVhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIE5hbWUgb2YgcGFja2FnZSB0byBjcmVhdGUgU3RyaW5nTWFuYWdlciBmb3IuCisgICAgICovCisKKyAgICBwcml2YXRlIFN0cmluZ01hbmFnZXIoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIFN0cmluZyBidW5kbGVOYW1lID0gcGFja2FnZU5hbWUgKyAiLkxvY2FsU3RyaW5ncyI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2goIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgIC8vIFRyeSBmcm9tIHRoZSBjdXJyZW50IGxvYWRlciAoIHRoYXQncyB0aGUgY2FzZSBmb3IgdHJ1c3RlZCBhcHBzICkKKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsPVRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICBpZiggY2wgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBidW5kbGU9UmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUsIExvY2FsZS5nZXREZWZhdWx0KCksIGNsKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4MikgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBjbD09bnVsbCApCisgICAgICAgICAgICAgICAgY2w9dGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNhbid0IGZpbmQgcmVzb3VyY2UgIiArIGJ1bmRsZU5hbWUgKworICAgICAgICAgICAgICAgICAgICAiICIgKyBjbCk7CisgICAgICAgICAgICBpZiggY2wgaW5zdGFuY2VvZiBVUkxDbGFzc0xvYWRlciApIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIAorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoICgoVVJMQ2xhc3NMb2FkZXIpY2wpLmdldFVSTHMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzdHJpbmcgZnJvbSB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBidW5kbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nSW50ZXJuYWwoa2V5KSwgKE9iamVjdCBbXSludWxsKTsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nSW50ZXJuYWwoU3RyaW5nIGtleSkgeworICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAia2V5IGlzIG51bGwiOworCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24obXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBzdHIgPSBudWxsOworCisgICAgICAgIGlmKCBidW5kbGU9PW51bGwgKQorICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0ciA9IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKKyAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkgeworICAgICAgICAgICAgc3RyID0gIkNhbm5vdCBmaW5kIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIGtleSAnIiArIGtleSArICInIjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdHI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgc3RyaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgYnVuZGxlIGFuZCBmb3JtYXQKKyAgICAgKiBpdCB3aXRoIHRoZSBnaXZlbiBzZXQgb2YgYXJndW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBUaGUgcmVzb3VyY2UgbmFtZQorICAgICAqIEBwYXJhbSBhcmdzIEZvcm1hdHRpbmcgZGlyZWN0aXZlcworICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgeworICAgICAgICBTdHJpbmcgaVN0cmluZyA9IG51bGw7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldFN0cmluZ0ludGVybmFsKGtleSk7CisKKyAgICAgICAgLy8gdGhpcyBjaGVjayBmb3IgdGhlIHJ1bnRpbWUgZXhjZXB0aW9uIGlzIHNvbWUgcHJlIDEuMS42CisgICAgICAgIC8vIFZNJ3MgZG9uJ3QgZG8gYW4gYXV0b21hdGljIHRvU3RyaW5nKCkgb24gdGhlIHBhc3NlZCBpbgorICAgICAgICAvLyBvYmplY3RzIGFuZCBiYXJmIG91dAorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBlbnN1cmUgdGhlIGFyZ3VtZW50cyBhcmUgbm90IG51bGwgc28gcHJlIDEuMiBWTSdzIGRvbid0IGJhcmYKKyAgICAgICAgICAgIE9iamVjdCBub25OdWxsQXJnc1tdID0gYXJnczsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobm9uTnVsbEFyZ3M9PWFyZ3MpIG5vbk51bGxBcmdzPShPYmplY3RbXSlhcmdzLmNsb25lKCk7CisgICAgICAgICAgICAgICAgICAgIG5vbk51bGxBcmdzW2ldID0gIm51bGwiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaVN0cmluZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHZhbHVlLCBub25OdWxsQXJncyk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBidWYuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBhcmdbIiArIGkgKyAiXT0iICsgYXJnc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpU3RyaW5nID0gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlTdHJpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgc3RyaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgYnVuZGxlIGFuZCBmb3JtYXQgaXQKKyAgICAgKiB3aXRoIHRoZSBnaXZlbiBvYmplY3QgYXJndW1lbnQuIFRoaXMgYXJndW1lbnQgY2FuIG9mIGNvdXJzZSBiZQorICAgICAqIGEgU3RyaW5nIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgVGhlIHJlc291cmNlIG5hbWUKKyAgICAgKiBAcGFyYW0gYXJnIEZvcm1hdHRpbmcgZGlyZWN0aXZlCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJnKSB7CisgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W10ge2FyZ307CisgICAgICAgIHJldHVybiBnZXRTdHJpbmcoa2V5LCBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzdHJpbmcgZnJvbSB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBidW5kbGUgYW5kIGZvcm1hdCBpdAorICAgICAqIHdpdGggdGhlIGdpdmVuIG9iamVjdCBhcmd1bWVudHMuIFRoZXNlIGFyZ3VtZW50cyBjYW4gb2YgY291cnNlCisgICAgICogYmUgU3RyaW5nIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBuYW1lCisgICAgICogQHBhcmFtIGFyZzEgRm9ybWF0dGluZyBkaXJlY3RpdmUKKyAgICAgKiBAcGFyYW0gYXJnMiBGb3JtYXR0aW5nIGRpcmVjdGl2ZQorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W10ge2FyZzEsIGFyZzJ9OworICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKGtleSwgYXJncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgc3RyaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgYnVuZGxlIGFuZCBmb3JtYXQgaXQKKyAgICAgKiB3aXRoIHRoZSBnaXZlbiBvYmplY3QgYXJndW1lbnRzLiBUaGVzZSBhcmd1bWVudHMgY2FuIG9mIGNvdXJzZQorICAgICAqIGJlIFN0cmluZyBvYmplY3RzLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBUaGUgcmVzb3VyY2UgbmFtZQorICAgICAqIEBwYXJhbSBhcmcxIEZvcm1hdHRpbmcgZGlyZWN0aXZlCisgICAgICogQHBhcmFtIGFyZzIgRm9ybWF0dGluZyBkaXJlY3RpdmUKKyAgICAgKiBAcGFyYW0gYXJnMyBGb3JtYXR0aW5nIGRpcmVjdGl2ZQorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhcmczKSB7CisgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W10ge2FyZzEsIGFyZzIsIGFyZzN9OworICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKGtleSwgYXJncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgc3RyaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgYnVuZGxlIGFuZCBmb3JtYXQgaXQKKyAgICAgKiB3aXRoIHRoZSBnaXZlbiBvYmplY3QgYXJndW1lbnRzLiBUaGVzZSBhcmd1bWVudHMgY2FuIG9mIGNvdXJzZQorICAgICAqIGJlIFN0cmluZyBvYmplY3RzLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBUaGUgcmVzb3VyY2UgbmFtZQorICAgICAqIEBwYXJhbSBhcmcxIEZvcm1hdHRpbmcgZGlyZWN0aXZlCisgICAgICogQHBhcmFtIGFyZzIgRm9ybWF0dGluZyBkaXJlY3RpdmUKKyAgICAgKiBAcGFyYW0gYXJnMyBGb3JtYXR0aW5nIGRpcmVjdGl2ZQorICAgICAqIEBwYXJhbSBhcmc0IEZvcm1hdHRpbmcgZGlyZWN0aXZlCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFyZzMsIE9iamVjdCBhcmc0KSB7CisgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W10ge2FyZzEsIGFyZzIsIGFyZzMsIGFyZzR9OworICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKGtleSwgYXJncyk7CisgICAgfQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gU1RBVElDIFNVUFBPUlQgTUVUSE9EUworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgbWFuYWdlcnMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFN0cmluZ01hbmFnZXIgZm9yIGEgcGFydGljdWxhciBwYWNrYWdlLiBJZiBhIG1hbmFnZXIgZm9yCisgICAgICogYSBwYWNrYWdlIGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIHJldXNlZCwgZWxzZSBhIG5ldworICAgICAqIFN0cmluZ01hbmFnZXIgd2lsbCBiZSBjcmVhdGVkIGFuZCByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBUaGUgcGFja2FnZSBuYW1lCisgICAgICovCisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIGdldE1hbmFnZXIoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIFN0cmluZ01hbmFnZXIgbWdyID0gKFN0cmluZ01hbmFnZXIpbWFuYWdlcnMuZ2V0KHBhY2thZ2VOYW1lKTsKKworICAgICAgICBpZiAobWdyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1nciA9IG5ldyBTdHJpbmdNYW5hZ2VyKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIG1hbmFnZXJzLnB1dChwYWNrYWdlTmFtZSwgbWdyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWdyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy91dGlsL1VVSURHZW5lcmF0b3IuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy91dGlsL1VVSURHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTE0ZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3V0aWwvVVVJREdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy51dGlsOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworLyoqCisgKiBzaW1wbGUgZ2VuZXJhdGlvbiBvZiBhIFVVSUQgCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIFVVSURHZW5lcmF0b3IgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVVSURfTEVOR1RIID0gMTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVVJRF9WRVJTSU9OID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCWVRFU19QRVJfSU5UID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSVRTX1BFUl9CWVRFID0gODsKKyAgICAKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFNlY3VyZVJhbmRvbSBzZWNyYW5kID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgc3RhdGljIHsKKyAgICAgICAgc2VjcmFuZCA9IG5ldyBTZWN1cmVSYW5kb20oKTsKKyAgICAgICAgc2VjcmFuZC5zZXRTZWVkKHJhbmQubmV4dExvbmcoKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHJhbmRvbVVVSUQoYm9vbGVhbiBzZWN1cmUpIHsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW1VVSURfTEVOR1RIXTsKKyAgICAgICAgcmV0dXJuIHJhbmRvbVVVSUQoc2VjdXJlLHJlc3VsdCwwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSByYW5kb21VVUlEKGJvb2xlYW4gc2VjdXJlLCBieXRlW10gaW50bywgaW50IG9mZnNldCkgeworICAgICAgICBpZiAoIChvZmZzZXQrVVVJRF9MRU5HVEgpPmludG8ubGVuZ3RoICkKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIlVuYWJsZSB0byBmaXQgIitVVUlEX0xFTkdUSCsiIGJ5dGVzIGludG8gdGhlIGFycmF5LiBsZW5ndGg6IitpbnRvLmxlbmd0aCsiIHJlcXVpcmVkIGxlbmd0aDoiKyhvZmZzZXQrVVVJRF9MRU5HVEgpKTsKKyAgICAgICAgUmFuZG9tIHIgPSAoc2VjdXJlJiYoc2VjcmFuZCE9bnVsbCkpP3NlY3JhbmQ6cmFuZDsKKyAgICAgICAgbmV4dEJ5dGVzKGludG8sb2Zmc2V0LFVVSURfTEVOR1RILHIpOworICAgICAgICBpbnRvWzYrb2Zmc2V0XSAmPSAweDBGOworICAgICAgICBpbnRvWzYrb2Zmc2V0XSB8PSAoVVVJRF9WRVJTSU9OIDw8IDQpOworICAgICAgICBpbnRvWzgrb2Zmc2V0XSAmPSAweDNGOyAvLzAwMTEgMTExMQorICAgICAgICBpbnRvWzgrb2Zmc2V0XSB8PSAweDgwOyAvLzEwMDAgMDAwMAorICAgICAgICByZXR1cm4gaW50bzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2FtZSBhcyBqYXZhLnV0aWwuUmFuZG9tLm5leHRCeXRlcyBleGNlcHQgdGhpcyBvbmUgd2UgZG9udCBoYXZlIHRvIGFsbG9jYXRlIGEgbmV3IGJ5dGUgYXJyYXkKKyAgICAgKiBAcGFyYW0gaW50byBieXRlW10KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IGludAorICAgICAqIEBwYXJhbSBsZW5ndGggaW50CisgICAgICogQHBhcmFtIHIgUmFuZG9tCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG5leHRCeXRlcyhieXRlW10gaW50bywgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgUmFuZG9tIHIpIHsKKyAgICAgICAgaW50IG51bVJlcXVlc3RlZCA9IGxlbmd0aDsKKyAgICAgICAgaW50IG51bUdvdCA9IDAsIHJuZCA9IDA7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJZVEVTX1BFUl9JTlQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChudW1Hb3QgPT0gbnVtUmVxdWVzdGVkKSByZXR1cm47CisgICAgICAgICAgICAgICAgcm5kID0gKGkgPT0gMCA/IHIubmV4dEludCgpIDogcm5kID4+IEJJVFNfUEVSX0JZVEUpOworICAgICAgICAgICAgICAgIGludG9bb2Zmc2V0K251bUdvdF0gPSAoYnl0ZSkgcm5kOworICAgICAgICAgICAgICAgIG51bUdvdCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC1jYXNlcy50eHQgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0LWNhc2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjQ1Y2QzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC1jYXNlcy50eHQKQEAgLTAsMCArMSwzMSBAQAorQ2F0ZWdvcmllcworICAtLSBNZW1iZXJzaGlwCisgIC0tIFNlbmRpbmcgZGF0YQorICAtLSBSZWNlaXZpbmcgZGF0YQorICAKKworTWVtYmVyc2hpcCBUZXN0Y2FzZQorCitJLiBNZW1iZXJzaGlwIAorICAgLSBhbGwgZGF0YSB0cmFuc2ZlcnJlZAorICAgLSBkaXNjb3ZlcnkKKyAgIC0gc3RhcnR1cCBsaXN0ZW4gb25seQorICAgLSBzdGFydHVwIGJyb2FkY2FzdCBvbmx5CisgICAtIHRpbWVvdXRzCisgICAtIG1lbWJlciBsZWF2ZXMKKyAgIC0gdGVzdCBmYWlsdXJlIGRldGVjdG9yLCBzdG9wIGJyb2FkY2FzdGluZywgYnV0IGV2ZXJ5dGhpbmcgZWxzZSBzdGF5cyBhbGl2ZQorCitJSS4gTWVzc2FnZSBhY2N1cmFjeQorCitJSUkuIE1lc3NhZ2UgdGhyb3VnaHB1dAorCitJVi4gVGlwaXMKKyAgIC0gUmVwbGljYXRlZE1hcCAtIHN0YXRlIHRyYW5zZmVyCisgICAtIEFkZCBlbGVtZW50CisgICAtIFJlbW92ZSBlbGVtZW50CisgICAtIENoYW5nZSBlbGVtZW50CisgICAKK1YuIENoYW5uZWwKKyAgIC0gU3RhcnQvc3RvcCBsZXZlbHMKKyAgIC0gYm9ndXMgZmxhZ3MgaW4gc3RhcnQvc3RvcAorICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2RlbW9zL0NoYW5uZWxDcmVhdG9yLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZGVtb3MvQ2hhbm5lbENyZWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmRlMDlkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2RlbW9zL0NoYW5uZWxDcmVhdG9yLmphdmEKQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZGVtb3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1hbmFnZWRDaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkdyb3VwQ2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuRnJhZ21lbnRhdGlvbkludGVyY2VwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9ycy5HemlwSW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzLk1lc3NhZ2VEaXNwYXRjaEludGVyY2VwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9ycy5PcmRlckludGVyY2VwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLm1lbWJlcnNoaXAuTWNhc3RTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5NdWx0aVBvaW50U2VuZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5SZWNlaXZlckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LlJlcGxpY2F0aW9uVHJhbnNtaXR0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzLlRocm91Z2hwdXRJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuTWVzc2FnZURpc3BhdGNoMTVJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuVGNwRmFpbHVyZURldGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9ycy5Eb21haW5GaWx0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLm1lbWJlcnNoaXAuTWVtYmVySW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuU3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKKworLyoqCisgKiA8cD5UaXRsZTogPC9wPgorICoKKyAqIDxwPkRlc2NyaXB0aW9uOiA8L3A+CisgKgorICoKKyAqIDxwPkNvbXBhbnk6IDwvcD4KKyAqCisgKiBAYXV0aG9yIGZoYW5paworICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFubmVsQ3JlYXRvciB7CisgICAgCisgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Mb2dGYWN0b3J5SW1wbCBpbXBsPW51bGw7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgdXNhZ2UoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIlxuXHRcdFstYmluZCB0Y3BiaW5kYWRkcmVzc10iKQorICAgICAgICAgICAuYXBwZW5kKCJcblx0XHRbLXRjcHNlbHRvIHRjcHNlbGVjdG9ydGltZW91dF0iKSAKKyAgICAgICAgICAgLmFwcGVuZCgiXG5cdFx0Wy10Y3B0aHJlYWRzIHRjcHRocmVhZGNvdW50XSIpIAorICAgICAgICAgICAuYXBwZW5kKCJcblx0XHRbLXBvcnQgdGNwbGlzdGVucG9ydF0iKQorICAgICAgICAgICAuYXBwZW5kKCJcblx0XHRbLWF1dG9iaW5kIHRjcGJpbmR0cnlyYW5nZV0iKQorICAgICAgICAgICAuYXBwZW5kKCJcblx0XHRbLWFja3RvIGFja3RpbWVvdXRdIikgCisgICAgICAgICAgIC5hcHBlbmQoIlxuXHRcdFstcmVjZWl2ZXIgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0Lm5pby5OaW9SZWNlaXZlcnxvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuYmlvLkJpb1JlY2VpdmVyfF0iKQorICAgICAgICAgICAuYXBwZW5kKCJcblx0XHRbLXRyYW5zcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQubmlvLlBvb2xlZFBhcmFsbGVsU2VuZGVyfG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5iaW8uUG9vbGVkTXVsdGlTZW5kZXJdIikKKyAgICAgICAgICAgLmFwcGVuZCgiXG5cdFx0Wy10cmFuc3BvcnQueHh4IHRyYW5zcG9ydCBzcGVjaWZpYyBwcm9wZXJ0eV0iKQorICAgICAgICAgICAuYXBwZW5kKCJcblx0XHRbLW1hZGRyIG11bHRpY2FzdGFkZHJdIikKKyAgICAgICAgICAgLmFwcGVuZCgiXG5cdFx0Wy1tcG9ydCBtdWx0aWNhc3Rwb3J0XSIpCisgICAgICAgICAgIC5hcHBlbmQoIlxuXHRcdFstbWJpbmQgbXVsdGljYXN0YmluZGFkZHJdIikKKyAgICAgICAgICAgLmFwcGVuZCgiXG5cdFx0Wy1tZnJlcSBtdWx0aWNhc3RmcmVxdWVuY3ldIikKKyAgICAgICAgICAgLmFwcGVuZCgiXG5cdFx0Wy1tZHJvcCBtdWx0aWNhc3Rkcm9wdGltZV0iKQorICAgICAgICAgICAuYXBwZW5kKCJcblx0XHRbLWd6aXBdIikKKyAgICAgICAgICAgLmFwcGVuZCgiXG5cdFx0Wy1zdGF0aWMgaG9zdG5hbWU6cG9ydCAoLXN0YXRpYyBsb2NhbGhvc3Q6OTk5OSAtc3RhdGljIDEyNy4wLjAuMTo4ODg4IGNhbiBiZSByZXBlYXRlZCldIikKKyAgICAgICAgICAgLmFwcGVuZCgiXG5cdFx0Wy1vcmRlcl0iKQorICAgICAgICAgICAuYXBwZW5kKCJcblx0XHRbLW9yZGVyc2l6ZSBtYXhvcmRlcnF1ZXVlc2l6ZV0iKQorICAgICAgICAgICAuYXBwZW5kKCJcblx0XHRbLWZyYWddIikKKyAgICAgICAgICAgLmFwcGVuZCgiXG5cdFx0Wy1mcmFnc2l6ZSBtYXhtc2dzaXplXSIpCisgICAgICAgICAgIC5hcHBlbmQoIlxuXHRcdFstdGhyb3VnaHB1dF0iKQorICAgICAgICAgICAuYXBwZW5kKCJcblx0XHRbLWZhaWx1cmVkZXRlY3RdIikKKyAgICAgICAgICAgLmFwcGVuZCgiXG5cdFx0Wy1hc3luY10iKQorICAgICAgICAgICAuYXBwZW5kKCJcblx0XHRbLWFzeW5jc2l6ZSBtYXhxdWV1ZXNpemVpbmtpbG9ieXRlc10iKTsKKyAgICAgICByZXR1cm4gYnVmOworCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDaGFubmVsIGNyZWF0ZUNoYW5uZWwoU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBiaW5kID0gImF1dG8iOworICAgICAgICBpbnQgcG9ydCA9IDQwMDE7CisgICAgICAgIFN0cmluZyBtYmluZCA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gZ3ppcCA9IGZhbHNlOworICAgICAgICBpbnQgdGNwc2VsdGltZW91dCA9IDUwMDA7CisgICAgICAgIGludCB0Y3B0aHJlYWRjb3VudCA9IDQ7CisgICAgICAgIGludCBhY2t0aW1lb3V0ID0gMTUwMDA7CisgICAgICAgIFN0cmluZyBtY2FzdGFkZHIgPSAiMjI4LjAuMC41IjsKKyAgICAgICAgaW50IG1jYXN0cG9ydCA9IDQ1NTY1OworICAgICAgICBsb25nIG1jYXN0ZnJlcSA9IDUwMDsKKyAgICAgICAgbG9uZyBtY2FzdGRyb3AgPSAyMDAwOworICAgICAgICBib29sZWFuIG9yZGVyID0gZmFsc2U7CisgICAgICAgIGludCBvcmRlcnNpemUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgYm9vbGVhbiBmcmFnID0gZmFsc2U7CisgICAgICAgIGludCBmcmFnc2l6ZSA9IDEwMjQ7CisgICAgICAgIGludCBhdXRvQmluZCA9IDEwOworICAgICAgICBBcnJheUxpc3Qgc3RhdGljTWVtYmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgUHJvcGVydGllcyB0cmFuc3BvcnRQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgU3RyaW5nIHRyYW5zcG9ydCA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQubmlvLlBvb2xlZFBhcmFsbGVsU2VuZGVyIjsKKyAgICAgICAgU3RyaW5nIHJlY2VpdmVyID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5uaW8uTmlvUmVjZWl2ZXIiOworICAgICAgICBib29sZWFuIGFzeW5jID0gZmFsc2U7CisgICAgICAgIGludCBhc3luY3NpemUgPSAxMDI0KjEwMjQqNTA7IC8vNTBNQgorICAgICAgICBib29sZWFuIHRocm91Z2hwdXQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBmYWlsdXJlZGV0ZWN0ID0gZmFsc2U7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgiLWJpbmQiLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgIGJpbmQgPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKCItcG9ydCIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgcG9ydCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1srK2ldKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1hdXRvYmluZCIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgYXV0b0JpbmQgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCItdGNwc2VsdG8iLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgIHRjcHNlbHRpbWVvdXQgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCItdGNwdGhyZWFkcyIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgdGNwdGhyZWFkY291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCItZ3ppcCIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgZ3ppcCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCItYXN5bmMiLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgIGFzeW5jID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1mYWlsdXJlZGV0ZWN0Ii5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICBmYWlsdXJlZGV0ZWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1hc3luY3NpemUiLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgIGFzeW5jc2l6ZSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1srK2ldKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNldHRpbmcgTWVzc2FnZURpc3BhdGNoSW50ZXJjZXB0b3IubWF4UXVldWVTaXplPSIrYXN5bmNzaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1zdGF0aWMiLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBkID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgIFN0cmluZyBoID0gZC5zdWJzdHJpbmcoMCxkLmluZGV4T2YoIjoiKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHAgPSBkLnN1YnN0cmluZyhoLmxlbmd0aCgpKzEpOworICAgICAgICAgICAgICAgIE1lbWJlckltcGwgbSA9IG5ldyBNZW1iZXJJbXBsKGgsSW50ZWdlci5wYXJzZUludChwKSwyMDAwKTsKKyAgICAgICAgICAgICAgICBzdGF0aWNNZW1iZXJzLmFkZChtKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi10aHJvdWdocHV0Ii5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdWdocHV0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1vcmRlciIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgb3JkZXIgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICgiLW9yZGVyc2l6ZSIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgb3JkZXJzaXplID0gSW50ZWdlci5wYXJzZUludChhcmdzWysraV0pOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2V0dGluZyBPcmRlckludGVyY2VwdG9yLm1heFF1ZXVlPSIrb3JkZXJzaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1mcmFnIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICBmcmFnID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1mcmFnc2l6ZSIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgZnJhZ3NpemUgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXR0aW5nIEZyYWdtZW50YXRpb25JbnRlcmNlcHRvci5tYXhTaXplPSIrZnJhZ3NpemUpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiLWFja3RvIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICBhY2t0aW1lb3V0ID0gSW50ZWdlci5wYXJzZUludChhcmdzWysraV0pOworICAgICAgICAgICAgfSBlbHNlIGlmICgiLXRyYW5zcG9ydCIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldIT1udWxsICYmIGFyZ3NbaV0uc3RhcnRzV2l0aCgidHJhbnNwb3J0LiIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGFyZ3NbaV07CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbCA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnRQcm9wZXJ0aWVzLnNldFByb3BlcnR5KGtleSx2YWwpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiLXJlY2VpdmVyIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICByZWNlaXZlciA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1tYWRkciIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgbWNhc3RhZGRyID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmICgiLW1wb3J0Ii5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICBtY2FzdHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCItbWZyZXEiLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgIG1jYXN0ZnJlcSA9IExvbmcucGFyc2VMb25nKGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCItbWRyb3AiLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgIG1jYXN0ZHJvcCA9IExvbmcucGFyc2VMb25nKGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCItbWJpbmQiLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgIG1iaW5kID0gYXJnc1srK2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0aW5nIHJlY2VpdmVyIGNsYXNzPSIrcmVjZWl2ZXIpOworICAgICAgICBDbGFzcyBjbCA9IENsYXNzLmZvck5hbWUocmVjZWl2ZXIsdHJ1ZSxDaGFubmVsQ3JlYXRvci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgUmVjZWl2ZXJCYXNlIHJ4ID0gKFJlY2VpdmVyQmFzZSljbC5uZXdJbnN0YW5jZSgpOworICAgICAgICByeC5zZXRUY3BMaXN0ZW5BZGRyZXNzKGJpbmQpOworICAgICAgICByeC5zZXRUY3BMaXN0ZW5Qb3J0KHBvcnQpOworICAgICAgICByeC5zZXRUY3BTZWxlY3RvclRpbWVvdXQodGNwc2VsdGltZW91dCk7CisgICAgICAgIHJ4LnNldFRjcFRocmVhZENvdW50KHRjcHRocmVhZGNvdW50KTsKKyAgICAgICAgcnguZ2V0QmluZCgpOworICAgICAgICByeC5zZXRSeEJ1ZlNpemUoNDM4MDApOworICAgICAgICByeC5zZXRUeEJ1ZlNpemUoMjUxODgpOworICAgICAgICByeC5zZXRBdXRvQmluZChhdXRvQmluZCk7CisKKyAgICAgICAgCisgICAgICAgIFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIgcHMgPSBuZXcgUmVwbGljYXRpb25UcmFuc21pdHRlcigpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0aW5nIHRyYW5zcG9ydCBjbGFzcz0iK3RyYW5zcG9ydCk7CisgICAgICAgIE11bHRpUG9pbnRTZW5kZXIgc2VuZGVyID0gKE11bHRpUG9pbnRTZW5kZXIpQ2xhc3MuZm9yTmFtZSh0cmFuc3BvcnQsdHJ1ZSxDaGFubmVsQ3JlYXRvci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKS5uZXdJbnN0YW5jZSgpOworICAgICAgICBzZW5kZXIuc2V0VGltZW91dChhY2t0aW1lb3V0KTsKKyAgICAgICAgc2VuZGVyLnNldE1heFJldHJ5QXR0ZW1wdHMoMik7CisgICAgICAgIHNlbmRlci5zZXRSeEJ1ZlNpemUoNDM4MDApOworICAgICAgICBzZW5kZXIuc2V0VHhCdWZTaXplKDI1MTg4KTsKKworICAgICAgICBJdGVyYXRvciBpID0gdHJhbnNwb3J0UHJvcGVydGllcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoIGkuaGFzTmV4dCgpICkgeworICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpaS5uZXh0KCk7CisgICAgICAgICAgICBJbnRyb3NwZWN0aW9uVXRpbHMuc2V0UHJvcGVydHkoc2VuZGVyLGtleSx0cmFuc3BvcnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KGtleSkpOworICAgICAgICB9CisgICAgICAgIHBzLnNldFRyYW5zcG9ydChzZW5kZXIpOworCisgICAgICAgIE1jYXN0U2VydmljZSBzZXJ2aWNlID0gbmV3IE1jYXN0U2VydmljZSgpOworICAgICAgICBzZXJ2aWNlLnNldE1jYXN0QWRkcihtY2FzdGFkZHIpOworICAgICAgICBpZiAobWJpbmQgIT0gbnVsbCkgc2VydmljZS5zZXRNY2FzdEJpbmRBZGRyZXNzKG1iaW5kKTsKKyAgICAgICAgc2VydmljZS5zZXRNY2FzdEZyZXF1ZW5jeShtY2FzdGZyZXEpOworICAgICAgICBzZXJ2aWNlLnNldE1jYXN0RHJvcFRpbWUobWNhc3Rkcm9wKTsKKyAgICAgICAgc2VydmljZS5zZXRNY2FzdFBvcnQobWNhc3Rwb3J0KTsKKworICAgICAgICBNYW5hZ2VkQ2hhbm5lbCBjaGFubmVsID0gbmV3IEdyb3VwQ2hhbm5lbCgpOworICAgICAgICBjaGFubmVsLnNldENoYW5uZWxSZWNlaXZlcihyeCk7CisgICAgICAgIGNoYW5uZWwuc2V0Q2hhbm5lbFNlbmRlcihwcyk7CisgICAgICAgIGNoYW5uZWwuc2V0TWVtYmVyc2hpcFNlcnZpY2Uoc2VydmljZSk7CisgICAgICAgIAorICAgICAgICBpZiAoIHRocm91Z2hwdXQgKSBjaGFubmVsLmFkZEludGVyY2VwdG9yKG5ldyBUaHJvdWdocHV0SW50ZXJjZXB0b3IoKSk7CisgICAgICAgIGlmIChnemlwKSBjaGFubmVsLmFkZEludGVyY2VwdG9yKG5ldyBHemlwSW50ZXJjZXB0b3IoKSk7CisgICAgICAgIGlmICggZnJhZyApIHsKKyAgICAgICAgICAgIEZyYWdtZW50YXRpb25JbnRlcmNlcHRvciBmaSA9IG5ldyBGcmFnbWVudGF0aW9uSW50ZXJjZXB0b3IoKTsKKyAgICAgICAgICAgIGZpLnNldE1heFNpemUoZnJhZ3NpemUpOworICAgICAgICAgICAgY2hhbm5lbC5hZGRJbnRlcmNlcHRvcihmaSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9yZGVyKSB7CisgICAgICAgICAgICBPcmRlckludGVyY2VwdG9yIG9pID0gbmV3IE9yZGVySW50ZXJjZXB0b3IoKTsKKyAgICAgICAgICAgIG9pLnNldE1heFF1ZXVlKG9yZGVyc2l6ZSk7CisgICAgICAgICAgICBjaGFubmVsLmFkZEludGVyY2VwdG9yKG9pKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCBhc3luYyApIHsKKyAgICAgICAgICAgIE1lc3NhZ2VEaXNwYXRjaEludGVyY2VwdG9yIG1pID0gbmV3IE1lc3NhZ2VEaXNwYXRjaDE1SW50ZXJjZXB0b3IoKTsKKyAgICAgICAgICAgIG1pLnNldE1heFF1ZXVlU2l6ZShhc3luY3NpemUpOworICAgICAgICAgICAgY2hhbm5lbC5hZGRJbnRlcmNlcHRvcihtaSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGVkIE1lc3NhZ2VEaXNwYXRjaEludGVyY2VwdG9yIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICggZmFpbHVyZWRldGVjdCApIHsKKyAgICAgICAgICAgIFRjcEZhaWx1cmVEZXRlY3RvciB0Y3BmaSA9IG5ldyBUY3BGYWlsdXJlRGV0ZWN0b3IoKTsKKyAgICAgICAgICAgIGNoYW5uZWwuYWRkSW50ZXJjZXB0b3IodGNwZmkpOworICAgICAgICB9CisgICAgICAgIGlmICggc3RhdGljTWVtYmVycy5zaXplKCkgPiAwICkgeworICAgICAgICAgICAgU3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yIHNtaSA9IG5ldyBTdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3IoKTsKKyAgICAgICAgICAgIGZvciAoaW50IHg9MDsgeDxzdGF0aWNNZW1iZXJzLnNpemUoKTsgeCsrICkgeworICAgICAgICAgICAgICAgIHNtaS5hZGRTdGF0aWNNZW1iZXIoKE1lbWJlcilzdGF0aWNNZW1iZXJzLmdldCh4KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFubmVsLmFkZEludGVyY2VwdG9yKHNtaSk7CisgICAgICAgIH0KKworCisgICAgICAgIGJ5dGVbXSBkb21haW4gPSBuZXcgYnl0ZVtdIHsxLDIsMyw0LDUsNiw3LDgsOSwwfTsKKyAgICAgICAgKChNY2FzdFNlcnZpY2UpY2hhbm5lbC5nZXRNZW1iZXJzaGlwU2VydmljZSgpKS5zZXREb21haW4oZG9tYWluKTsKKyAgICAgICAgRG9tYWluRmlsdGVySW50ZXJjZXB0b3IgZmlsdGVyID0gbmV3IERvbWFpbkZpbHRlckludGVyY2VwdG9yKCk7CisgICAgICAgIGZpbHRlci5zZXREb21haW4oZG9tYWluKTsKKyAgICAgICAgY2hhbm5lbC5hZGRJbnRlcmNlcHRvcihmaWx0ZXIpOworICAgICAgICByZXR1cm4gY2hhbm5lbDsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZGVtb3MvQ29vcmRpbmF0aW9uRGVtby5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2RlbW9zL0Nvb3JkaW5hdGlvbkRlbW8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzJmZjIwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2RlbW9zL0Nvb3JkaW5hdGlvbkRlbW8uamF2YQpAQCAtMCwwICsxLDM0OCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5kZW1vczsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsSW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbEludGVyY2VwdG9yLkludGVyY2VwdG9yRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkdyb3VwQ2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuTWVzc2FnZURpc3BhdGNoMTVJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuTm9uQmxvY2tpbmdDb29yZGluYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuVGNwRmFpbHVyZURldGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5SZWNlaXZlckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbC5BcnJheXM7CisKKworCitwdWJsaWMgY2xhc3MgQ29vcmRpbmF0aW9uRGVtbyB7CisgICAgc3RhdGljIGludCBDSEFOTkVMX0NPVU5UID0gNTsKKyAgICBzdGF0aWMgaW50IFNDUkVFTl9XSURUSCA9IDEyMDsKKyAgICBzdGF0aWMgbG9uZyBTTEVFUF9USU1FID0gMTA7CisgICAgc3RhdGljIGludCBDTEVBUl9TQ1JFRU4gPSAzMDsKKyAgICBzdGF0aWMgYm9vbGVhbiBNVUxUSV9USFJFQUQgPSBmYWxzZTsKKyAgICBzdGF0aWMgYm9vbGVhbltdIFZJRVdfRVZFTlRTID0gbmV3IGJvb2xlYW5bMjU1XTsKKyAgICBTdHJpbmdCdWZmZXIgc3RhdHVzTGluZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBTdGF0dXNbXSBzdGF0dXMgPSBudWxsOworICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG51bGw7CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuZCBzaG93IHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29vcmRpbmF0aW9uRGVtbygpIHsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihTeXN0ZW0uaW4pKTsKKyAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1c1tDSEFOTkVMX0NPVU5UXTsKKyAgICB9CisgICAgCisgICAgCisgICAgcHVibGljIHZvaWQgY2xlYXJTY3JlZW4oKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKDcwMCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxDTEVBUl9TQ1JFRU47IGkrKyApIGJ1Zi5hcHBlbmQoIlxuIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihidWYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50TWVudU9wdGlvbnMoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29tbWFuZHM6Iik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRzdGFydCBbbWVtYmVyIGlkXSIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0c3RvcCAgW21lbWJlciBpZF0iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdHByaW50IChyZWZyZXNoKSIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0cXVpdCIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJFbnRlciBjb21tYW5kOiIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHJpbnRTY3JlZW4oKSB7CisgICAgICAgIGNsZWFyU2NyZWVuKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICMjIy4iK2dldEhlYWRlcigpKTsKKyAgICAgICAgZm9yICggaW50IGk9MDsgaTxzdGF0dXMubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGxlZnRmaWxsKFN0cmluZy52YWx1ZU9mKGkrMSkrIi4iLDUsIiAiKSk7CisgICAgICAgICAgICBpZiAoIHN0YXR1c1tpXSAhPSBudWxsICkgU3lzdGVtLm91dC5wcmludChzdGF0dXNbaV0uZ2V0U3RhdHVzTGluZSgpKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG4iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPdmVyYWxsIHN0YXR1czoiK3N0YXR1c0xpbmUpOworICAgICAgICBwcmludE1lbnVPcHRpb25zKCk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcigpIHsKKyAgICAgICAgLy9tZW1iZXIgLSAzMAorICAgICAgICAvL3J1bm5pbmctIDEwCisgICAgICAgIC8vY29vcmQgLSAzMAorICAgICAgICAvL3ZpZXctaWQgLSAyNAorICAgICAgICAvL3ZpZXcgY291bnQgLSA4CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZChsZWZ0ZmlsbCgiTWVtYmVyIiwzMCwiICIpKTsKKyAgICAgICAgYnVmLmFwcGVuZChsZWZ0ZmlsbCgiUnVubmluZyIsMTAsIiAiKSk7CisgICAgICAgIGJ1Zi5hcHBlbmQobGVmdGZpbGwoIkNvb3JkIiwzMCwiICIpKTsKKyAgICAgICAgYnVmLmFwcGVuZChsZWZ0ZmlsbCgiVmlldy1pZChzaG9ydCkiLDI0LCIgIikpOworICAgICAgICBidWYuYXBwZW5kKGxlZnRmaWxsKCJDb3VudCIsOCwiICIpKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgCisgICAgICAgIGJ1Zi5hcHBlbmQocmlnaHRmaWxsKCI9PT0iK25ldyBqYXZhLnNxbC5UaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpLnRvU3RyaW5nKCksU0NSRUVOX1dJRFRILCI9IikpOworICAgICAgICBidWYuYXBwZW5kKCJcbiIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmdbXSB0b2tlbml6ZShTdHJpbmcgbGluZSkgeworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdHogPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpbmUsIiAiKTsKKyAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1t0ei5jb3VudFRva2VucygpXTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPHJlc3VsdC5sZW5ndGg7IGkrKyApIHJlc3VsdFtpXSA9IHR6Lm5leHRUb2tlbigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB3YWl0Rm9ySW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmb3IgKCBpbnQgaT0wOyBpPHN0YXR1cy5sZW5ndGg7IGkrKyApIHN0YXR1c1tpXSA9IG5ldyBTdGF0dXModGhpcyk7CisgICAgICAgIHByaW50U2NyZWVuKCk7CisgICAgICAgIFN0cmluZyBsID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSB0b2tlbml6ZShsKTsKKyAgICAgICAgd2hpbGUgKCBhcmdzLmxlbmd0aCA+PSAxICYmICghInF1aXQiLmVxdWFsc0lnbm9yZUNhc2UoYXJnc1swXSkpKSB7CisgICAgICAgICAgICBpZiAoInN0YXJ0Ii5lcXVhbHNJZ25vcmVDYXNlKGFyZ3NbMF0pKSB7CisgICAgICAgICAgICAgICAgY21kU3RhcnQoYXJncyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJzdG9wIi5lcXVhbHNJZ25vcmVDYXNlKGFyZ3NbMF0pKSB7CisgICAgICAgICAgICAgICAgY21kU3RvcChhcmdzKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRTY3JlZW4oKTsKKyAgICAgICAgICAgIGwgPSByZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIGFyZ3MgPSB0b2tlbml6ZShsKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKCBpbnQgaT0wOyBpPHN0YXR1cy5sZW5ndGg7IGkrKyApIHN0YXR1c1tpXS5zdG9wKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNtZFN0b3AoU3RyaW5nW10gYXJncykgeworICAgICAgICBpZiAoIGFyZ3MubGVuZ3RoID09IDEgKSB7CisgICAgICAgICAgICBzZXRTeXN0ZW1TdGF0dXMoIlN5c3RlbSBzaHV0dGluZyBkb3duLi4uIik7CisgICAgICAgICAgICBUaHJlYWRbXSB0ID0gbmV3IFRocmVhZFtDSEFOTkVMX0NPVU5UXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGogPSBpOworICAgICAgICAgICAgICAgIHRbal0gPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNbal0uc3RvcCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzLmxlbmd0aDsgaSsrKSBpZiAoTVVMVElfVEhSRUFEICkgdFtpXS5zdGFydCgpOyBlbHNlIHRbaV0ucnVuKCk7CisgICAgICAgICAgICBzZXRTeXN0ZW1TdGF0dXMoIlN5c3RlbSBzdG9wcGVkLiIpOworICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgIGludCBpbmRleCA9IC0xOworICAgICAgICAgICAgdHJ5IHsgaW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbMV0pLTE7fWNhdGNoICggRXhjZXB0aW9uIHggKSB7c2V0U3lzdGVtU3RhdHVzKCJJbnZhbGlkIGluZGV4OiIrYXJnc1sxXSk7fQorICAgICAgICAgICAgaWYgKCBpbmRleCA+PSAwICkgeworICAgICAgICAgICAgICAgIHNldFN5c3RlbVN0YXR1cygiU3RvcHBpbmcgbWVtYmVyOiIrKGluZGV4KzEpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNbaW5kZXhdLnN0b3AoKTsKKyAgICAgICAgICAgICAgICBzZXRTeXN0ZW1TdGF0dXMoIk1lbWJlciBzdG9wcGVkOiIrKGluZGV4KzEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjbWRTdGFydChTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGlmICggYXJncy5sZW5ndGggPT0gMSApIHsKKyAgICAgICAgICAgIHNldFN5c3RlbVN0YXR1cygiU3lzdGVtIHN0YXJ0aW5nIHVwLi4uIik7CisgICAgICAgICAgICBUaHJlYWRbXSB0ID0gbmV3IFRocmVhZFtDSEFOTkVMX0NPVU5UXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGogPSBpOworICAgICAgICAgICAgICAgIHRbal0gPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNbal0uc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1cy5sZW5ndGg7IGkrKykgaWYgKE1VTFRJX1RIUkVBRCApIHRbaV0uc3RhcnQoKTsgZWxzZSB0W2ldLnJ1bigpOworICAgICAgICAgICAgc2V0U3lzdGVtU3RhdHVzKCJTeXN0ZW0gc3RhcnRlZC4iKTsKKyAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICBpbnQgaW5kZXggPSAtMTsKKyAgICAgICAgICAgIHRyeSB7IGluZGV4ID0gSW50ZWdlci5wYXJzZUludChhcmdzWzFdKS0xO31jYXRjaCAoIEV4Y2VwdGlvbiB4ICkge3NldFN5c3RlbVN0YXR1cygiSW52YWxpZCBpbmRleDoiK2FyZ3NbMV0pO30KKyAgICAgICAgICAgIGlmICggaW5kZXggPj0gMCApIHsKKyAgICAgICAgICAgICAgICBzZXRTeXN0ZW1TdGF0dXMoIlN0YXJ0aW5nIG1lbWJlcjoiKyhpbmRleCsxKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzW2luZGV4XS5zdGFydCgpOworICAgICAgICAgICAgICAgIHNldFN5c3RlbVN0YXR1cygiTWVtYmVyIHN0YXJ0ZWQ6IisoaW5kZXgrMSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3lzdGVtU3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKyAgICAgICAgc3RhdHVzTGluZS5kZWxldGUoMCxzdGF0dXNMaW5lLmxlbmd0aCgpKTsKKyAgICAgICAgc3RhdHVzTGluZS5hcHBlbmQoc3RhdHVzKTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEV2ZW50cyhTdHJpbmcgZXZlbnRzKSB7CisgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbChWSUVXX0VWRU5UUyxmYWxzZSk7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciB0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihldmVudHMsIiwiKTsKKyAgICAgICAgd2hpbGUgKHQuaGFzTW9yZVRva2VucygpICkgeworICAgICAgICAgICAgaW50IGlkeCA9IEludGVnZXIucGFyc2VJbnQodC5uZXh0VG9rZW4oKSk7CisgICAgICAgICAgICBWSUVXX0VWRU5UU1tpZHhdID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuKFN0cmluZ1tdIGFyZ3MsQ29vcmRpbmF0aW9uRGVtbyBkZW1vKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKFZJRVdfRVZFTlRTLHRydWUpOworCisgICAgICAgIGZvciAoaW50IGk9MDsgaTxhcmdzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgaWYgKCAiLWMiLmVxdWFscyhhcmdzW2ldKSApCisgICAgICAgICAgICAgICAgQ0hBTk5FTF9DT1VOVCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1srK2ldKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAiLXQiLmVxdWFscyhhcmdzW2ldKSApCisgICAgICAgICAgICAgICAgTVVMVElfVEhSRUFEID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oYXJnc1srK2ldKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAiLXMiLmVxdWFscyhhcmdzW2ldKSApCisgICAgICAgICAgICAgICAgU0xFRVBfVElNRSA9IExvbmcucGFyc2VMb25nKGFyZ3NbKytpXSk7CisgICAgICAgICAgICBlbHNlIGlmICggIi1zYyIuZXF1YWxzKGFyZ3NbaV0pICkKKyAgICAgICAgICAgICAgICBDTEVBUl9TQ1JFRU4gPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbKytpXSk7CisgICAgICAgICAgICBlbHNlIGlmICggIi1wIi5lcXVhbHMoYXJnc1tpXSkgKQorICAgICAgICAgICAgICAgIHNldEV2ZW50cyhhcmdzWysraV0pOworICAgICAgICAgICAgZWxzZSBpZiAoICItaCIuZXF1YWxzKGFyZ3NbaV0pICkgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgIH0KKyAgICAgICAgZGVtby5pbml0KCk7CisgICAgICAgIGRlbW8ud2FpdEZvcklucHV0KCk7CisgICAgfSAgICAKKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXNhZ2UoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6Iik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRqYXZhIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmRlbW9zLkNvb3JkaW5hdGlvbkRlbW8gLWMgY2hhbm5lbC1jb3VudChpbnQpIC10IG11bHRpLXRocmVhZCh0cnVlfGZhbHNlKSAtcyBzbGVlcC10aW1lKG1zKSAtc2MgY2xlYXItc2NyZWVuKGludCkgLXAgdmlld19ldmVudHNfY3N2KDEsMiw1LDcpIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhhbXBsZToiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdGphdmEgby5hLmMudC5kLkNvb3JkaW5hdGlvbkRlbW8gLT4gc3RhcnRzIGRlbW8gc2luZ2xlIHRocmVhZGVkIHN0YXJ0L3N0b3Agd2l0aCA1IGNoYW5uZWxzIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRqYXZhIG8uYS5jLnQuZC5Db29yZGluYXRpb25EZW1vIC1jIDEwIC0+IHN0YXJ0cyBkZW1vIHNpbmdsZSB0aHJlYWRlZCBzdGFydC9zdG9wIHdpdGggMTAgY2hhbm5lbHMiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdGphdmEgby5hLmMudC5kLkNvb3JkaW5hdGlvbkRlbW8gLWMgNyAtdCB0cnVlIC1zIDEwMDAgLXNjIDUwLT4gc3RhcnRzIGRlbW8gbXVsdGkgdGhyZWFkZWQgc3RhcnQvc3RvcCB3aXRoIDcgY2hhbm5lbHMgYW5kIDEgc2Vjb25kIHNsZWVwIHRpbWUgYmV0d2VlbiBldmVudHMgYW5kIDUwIGxpbmVzIHRvIGNsZWFyIHNjcmVlbiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0amF2YSBvLmEuYy50LmQuQ29vcmRpbmF0aW9uRGVtbyAtdCB0cnVlIC1wIDEyIC0+IHN0YXJ0cyBkZW1vIG11bHRpIHRocmVhZGVkIHN0YXJ0L3N0b3Agd2l0aCA1IGNoYW5uZWxzIGFuZCBvbmx5IHByaW50cyB0aGUgRVZUX0NPTkZfUlggZXZlbnQiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb29yZGluYXRpb25EZW1vIGRlbW8gPSBuZXcgQ29vcmRpbmF0aW9uRGVtbygpOworICAgICAgICBydW4oYXJncyxkZW1vKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbGVmdGZpbGwoU3RyaW5nIHZhbHVlLCBpbnQgbGVuZ3RoLCBTdHJpbmcgY2gpIHsKKyAgICAgICAgcmV0dXJuIGZpbGwodmFsdWUsbGVuZ3RoLGNoLHRydWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByaWdodGZpbGwoU3RyaW5nIHZhbHVlLCBpbnQgbGVuZ3RoLCBTdHJpbmcgY2gpIHsKKyAgICAgICAgcmV0dXJuIGZpbGwodmFsdWUsbGVuZ3RoLGNoLGZhbHNlKTsKKyAgICB9ICAgIAorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsbChTdHJpbmcgdmFsdWUsIGludCBsZW5ndGgsIFN0cmluZyBjaCwgYm9vbGVhbiBsZWZ0KSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGlmICggIWxlZnQgKSBidWYuYXBwZW5kKHZhbHVlLnRyaW0oKSk7CisgICAgICAgIGZvciAoaW50IGk9dmFsdWUudHJpbSgpLmxlbmd0aCgpOyBpPGxlbmd0aDsgaSsrICkgYnVmLmFwcGVuZChjaCk7CisgICAgICAgIGlmICggbGVmdCApIGJ1Zi5hcHBlbmQodmFsdWUudHJpbSgpKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0YXR1cyB7CisgICAgICAgIHB1YmxpYyBDb29yZGluYXRpb25EZW1vIHBhcmVudDsKKyAgICAgICAgcHVibGljIEdyb3VwQ2hhbm5lbCBjaGFubmVsOworICAgICAgICBOb25CbG9ja2luZ0Nvb3JkaW5hdG9yIGludGVyY2VwdG9yID0gbnVsbDsKKyAgICAgICAgcHVibGljIFN0cmluZyBzdGF0dXM7CisgICAgICAgIHB1YmxpYyBFeGNlcHRpb24gZXJyb3I7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgc3RhcnRzdGF0dXMgPSAibmV3IjsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTdGF0dXMoQ29vcmRpbmF0aW9uRGVtbyBwYXJlbnQpIHsKKyAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0xpbmUoKSB7CisgICAgICAgICAgICAvL21lbWJlciAtIDMwCisgICAgICAgICAgICAvL3J1bm5pbmctIDEwCisgICAgICAgICAgICAvL2Nvb3JkIC0gMzAKKyAgICAgICAgICAgIC8vdmlldy1pZCAtIDI0CisgICAgICAgICAgICAvL3ZpZXcgY291bnQgLSA4CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgU3RyaW5nIGxvY2FsID0gIiI7CisgICAgICAgICAgICBTdHJpbmcgY29vcmQgPSAiIjsKKyAgICAgICAgICAgIFN0cmluZyB2aWV3SWQgPSAiIjsKKyAgICAgICAgICAgIFN0cmluZyBjb3VudCA9ICIwIjsKKyAgICAgICAgICAgIGlmICggY2hhbm5lbCAhPSBudWxsICkgeworICAgICAgICAgICAgICAgIE1lbWJlciBsbSA9IGNoYW5uZWwuZ2V0TG9jYWxNZW1iZXIoZmFsc2UpOworICAgICAgICAgICAgICAgIGxvY2FsID0gbG0hPW51bGw/bG0uZ2V0TmFtZSgpOiIiOworICAgICAgICAgICAgICAgIGNvb3JkID0gaW50ZXJjZXB0b3IhPW51bGwgJiYgaW50ZXJjZXB0b3IuZ2V0Q29vcmRpbmF0b3IoKSE9bnVsbD9pbnRlcmNlcHRvci5nZXRDb29yZGluYXRvcigpLmdldE5hbWUoKToiIjsKKyAgICAgICAgICAgICAgICB2aWV3SWQgPSBnZXRCeXRlU3RyaW5nKGludGVyY2VwdG9yLmdldFZpZXdJZCgpIT1udWxsP2ludGVyY2VwdG9yLmdldFZpZXdJZCgpLmdldEJ5dGVzKCk6bmV3IGJ5dGVbMF0pOworICAgICAgICAgICAgICAgIGNvdW50ID0gU3RyaW5nLnZhbHVlT2YoaW50ZXJjZXB0b3IuZ2V0VmlldygpLmxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKGxlZnRmaWxsKGxvY2FsLDMwLCIgIikpOworICAgICAgICAgICAgYnVmLmFwcGVuZChsZWZ0ZmlsbChzdGFydHN0YXR1cywgMTAsICIgIikpOworICAgICAgICAgICAgYnVmLmFwcGVuZChsZWZ0ZmlsbChjb29yZCwgMzAsICIgIikpOworICAgICAgICAgICAgYnVmLmFwcGVuZChsZWZ0ZmlsbCh2aWV3SWQsIDI0LCAiICIpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQobGVmdGZpbGwoY291bnQsIDgsICIgIikpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlN0YXR1czoiK3N0YXR1cyk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEJ5dGVTdHJpbmcoYnl0ZVtdIGIpIHsKKyAgICAgICAgICAgIGlmICggYiA9PSBudWxsICkgcmV0dXJuICJ7fSI7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLnRvU3RyaW5nKGIsMCxNYXRoLm1pbihiLmxlbmd0aCw0KSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoIGNoYW5uZWwgPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IGNyZWF0ZUNoYW5uZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRzdGF0dXMgPSAic3RhcnRpbmciOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsLnN0YXJ0KGNoYW5uZWwuREVGQVVMVCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0c3RhdHVzID0gInJ1bm5pbmciOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICJDaGFubmVsIGFscmVhZHkgc3RhcnRlZC4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFN5c3RlbS5lcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTdGFydCBmYWlsZWQ6Iik7CisgICAgICAgICAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50W10gZWxzID0geC5nZXRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxzLmxlbmd0aDsgaSsrKSBTeXN0ZW0uZXJyLnByaW50bG4oZWxzW2ldLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAiU3RhcnQgZmFpbGVkOiIreC5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB4OworICAgICAgICAgICAgICAgIHN0YXJ0c3RhdHVzID0gImZhaWxlZCI7CisgICAgICAgICAgICAgICAgdHJ5IHsgY2hhbm5lbC5zdG9wKEdyb3VwQ2hhbm5lbC5ERUZBVUxUKTt9Y2F0Y2goRXhjZXB0aW9uIGlnbm9yZSl7fQorICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBudWxsOworICAgICAgICAgICAgICAgIGludGVyY2VwdG9yID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKCBjaGFubmVsICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwuc3RvcChjaGFubmVsLkRFRkFVTFQpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAiQ2hhbm5lbCBTdG9wcGVkIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAiQ2hhbm5lbCBBbHJlYWR5IFN0b3BwZWQiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1jYXRjaCAoIEV4Y2VwdGlvbiB4ICkgIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFN5c3RlbS5lcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTdG9wIGZhaWxlZDoiKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnRbXSBlbHMgPSB4LmdldFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbHMubGVuZ3RoOyBpKyspIFN5c3RlbS5lcnIucHJpbnRsbihlbHNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdHVzID0gIlN0b3AgZmFpbGVkOiIreC5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB4OworICAgICAgICAgICAgfWZpbmFsbHkgeworICAgICAgICAgICAgICAgIHN0YXJ0c3RhdHVzID0gInN0b3BwZWQiOworICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBudWxsOworICAgICAgICAgICAgICAgIGludGVyY2VwdG9yID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIEdyb3VwQ2hhbm5lbCBjcmVhdGVDaGFubmVsKCkgeworICAgICAgICAgICAgY2hhbm5lbCA9IG5ldyBHcm91cENoYW5uZWwoKTsKKyAgICAgICAgICAgICgoUmVjZWl2ZXJCYXNlKWNoYW5uZWwuZ2V0Q2hhbm5lbFJlY2VpdmVyKCkpLnNldEF1dG9CaW5kKDEwMCk7CisgICAgICAgICAgICBpbnRlcmNlcHRvciA9IG5ldyBOb25CbG9ja2luZ0Nvb3JkaW5hdG9yKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpcmVJbnRlcmNlcHRvckV2ZW50KEludGVyY2VwdG9yRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZXZlbnQuZ2V0RXZlbnRUeXBlRGVzYygpOworICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSA9IGV2ZW50LmdldEV2ZW50VHlwZSgpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRpc3BsYXkgPSBWSUVXX0VWRU5UU1t0eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBkaXNwbGF5ICkgcGFyZW50LnByaW50U2NyZWVuKCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7IFRocmVhZC5zbGVlcChTTEVFUF9USU1FKTsgfWNhdGNoICggRXhjZXB0aW9uIHgpe30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2hhbm5lbC5hZGRJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7CisgICAgICAgICAgICBjaGFubmVsLmFkZEludGVyY2VwdG9yKG5ldyBUY3BGYWlsdXJlRGV0ZWN0b3IoKSk7CisgICAgICAgICAgICBjaGFubmVsLmFkZEludGVyY2VwdG9yKG5ldyBNZXNzYWdlRGlzcGF0Y2gxNUludGVyY2VwdG9yKCkpOworICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWw7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2RlbW9zL0VjaG9ScGNUZXN0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZGVtb3MvRWNob1JwY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWZkMWI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2RlbW9zL0VjaG9ScGNUZXN0LmphdmEKQEAgLTAsMCArMSwyMDQgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZGVtb3M7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5ScGNDYWxsYmFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1hbmFnZWRDaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLlJwY0NoYW5uZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuUmVzcG9uc2U7CisKKworLyoqCisgKiA8cD5UaXRsZTogPC9wPgorICoKKyAqIDxwPkRlc2NyaXB0aW9uOiA8L3A+CisgKgorICogPHA+Q29weXJpZ2h0OiBDb3B5cmlnaHQgKGMpIDIwMDU8L3A+CisgKgorICogPHA+Q29tcGFueTogPC9wPgorICoKKyAqIEBhdXRob3Igbm90IGF0dHJpYnV0YWJsZQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBFY2hvUnBjVGVzdCBpbXBsZW1lbnRzIFJwY0NhbGxiYWNrLCBSdW5uYWJsZSB7CisgICAgCisgICAgQ2hhbm5lbCBjaGFubmVsOworICAgIGludCBjb3VudDsKKyAgICBTdHJpbmcgbWVzc2FnZTsKKyAgICBsb25nIHBhdXNlOworICAgIFJwY0NoYW5uZWwgcnBjOworICAgIGludCBvcHRpb25zOworICAgIGxvbmcgdGltZW91dDsKKyAgICBTdHJpbmcgbmFtZTsKKyAgICAKKyAgICBwdWJsaWMgRWNob1JwY1Rlc3QoQ2hhbm5lbCBjaGFubmVsLCBTdHJpbmcgbmFtZSwgaW50IGNvdW50LCBTdHJpbmcgbWVzc2FnZSwgbG9uZyBwYXVzZSwgaW50IG9wdGlvbnMsIGxvbmcgdGltZW91dCkgeworICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsOworICAgICAgICB0aGlzLmNvdW50ID0gY291bnQ7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIHRoaXMucGF1c2UgPSBwYXVzZTsKKyAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgICAgICAgdGhpcy5ycGMgPSBuZXcgUnBjQ2hhbm5lbChuYW1lLmdldEJ5dGVzKCksY2hhbm5lbCx0aGlzKTsKKyAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgcmVwbHkgaGFzIGFscmVhZHkgYmVlbiBzZW50IHRvIHRoZSByZXF1ZXN0aW5nIHRocmVhZCwgdGhlIHJwYworICAgICAqIGNhbGxiYWNrIGNhbiBoYW5kbGUgYW55IGRhdGEgdGhhdCBjb21lcyBpbiBhZnRlciB0aGUgZmFjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cgU2VyaWFsaXphYmxlCisgICAgICogQHBhcmFtIHNlbmRlciBNZW1iZXIKKyAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50aXBpcy5ScGNDYWxsYmFjaworICAgICAqICAgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIHZvaWQgbGVmdE92ZXIoU2VyaWFsaXphYmxlIG1zZywgTWVtYmVyIHNlbmRlcikgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY2VpdmVkIGEgbGVmdCBvdmVyIG1lc3NhZ2UgZnJvbSBbIitzZW5kZXIuZ2V0TmFtZSgpKyJdIHdpdGggZGF0YSBbIittc2crIl0iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cgU2VyaWFsaXphYmxlCisgICAgICogQHBhcmFtIHNlbmRlciBNZW1iZXIKKyAgICAgKiBAcmV0dXJuIFNlcmlhbGl6YWJsZSAtIG51bGwgaWYgbm8gcmVwbHkgc2hvdWxkIGJlIHNlbnQKKyAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50aXBpcy5ScGNDYWxsYmFjaworICAgICAqICAgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIFNlcmlhbGl6YWJsZSByZXBseVJlcXVlc3QoU2VyaWFsaXphYmxlIG1zZywgTWVtYmVyIHNlbmRlcikgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY2VpdmVkIGEgcmVwbHkgcmVxdWVzdCBtZXNzYWdlIGZyb20gWyIrc2VuZGVyLmdldE5hbWUoKSsiXSB3aXRoIGRhdGEgWyIrbXNnKyJdIik7CisgICAgICAgIHJldHVybiAiUmVwbHkoIituYW1lKyIpOiIrbXNnOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIGxvbmcgY291bnRlciA9IDA7CisgICAgICAgIHdoaWxlIChjb3VudGVyPGNvdW50KSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gbWVzc2FnZSArICIgY250PSIrKCsrY291bnRlcik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VuZGluZyBbIittc2crIl0iKTsKKyAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgUmVzcG9uc2VbXSByZXNwID0gcnBjLnNlbmQoY2hhbm5lbC5nZXRNZW1iZXJzKCksKFNlcmlhbGl6YWJsZSltc2csb3B0aW9ucyxDaGFubmVsLlNFTkRfT1BUSU9OU19ERUZBVUxULHRpbWVvdXQpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VuZCBvZiBbIittc2crIl0gY29tcGxldGVkLiBOciBvZiByZXNwb25zZXM9IityZXNwLmxlbmd0aCsiIFRpbWU6IisoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktc3RhcnQpKyIgbXMuIik7CisgICAgICAgICAgICAgICAgZm9yICggaW50IGk9MDsgaTxyZXNwLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY2VpdmVkIGEgcmVzcG9uc2UgbWVzc2FnZSBmcm9tIFsiK3Jlc3BbaV0uZ2V0U291cmNlKCkuZ2V0TmFtZSgpKyJdIHdpdGggZGF0YSBbIityZXNwW2ldLmdldE1lc3NhZ2UoKSsiXSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChwYXVzZSk7CisgICAgICAgIH1jYXRjaChFeGNlcHRpb24geCl7fQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1c2FnZSgpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJpYmVzIFJQQyB0ZXN0ZXIuIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOlxuXHQiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhIEVjaG9ScGNUZXN0IFtvcHRpb25zXVxuXHQiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcHRpb25zOlxuXHRcdCIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlstbW9kZSBhbGx8Zmlyc3R8bWFqb3JpdHldICBcblx0XHQiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbLWRlYnVnXSAgXG5cdFx0IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWy1jb3VudCBtZXNzYWdlY291bnRdICBcblx0XHQiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbLXRpbWVvdXQgdGltZW91dGlubXNdICBcblx0XHQiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbLXN0YXRzIHN0YXRpbnRlcnZhbF0gIFxuXHRcdCIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlstcGF1c2UgbnJvZnNlY29uZHN0b3BhdXNlYmV0d2VlbnNlbmRzXSAgXG5cdFx0IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWy1tZXNzYWdlIG1lc3NhZ2VdICBcblx0XHQiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbLW5hbWUgcnBjbmFtZV0gIFxuXHRcdCIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlstYnJlYWsgKGhhbHRzIGV4ZWN1dGlvbiBvbiBleGNlcHRpb24pXVxuIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRDaGFubmVsIG9wdGlvbnM6IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsQ3JlYXRvci51c2FnZSgpKyJcblxuIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhhbXBsZTpcblx0IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YSBFY2hvUnBjVGVzdCAtcG9ydCA0MDA0XG5cdCIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmEgRWNob1JwY1Rlc3QgLWJpbmQgMTkyLjE2OC4wLjQ1IC1wb3J0IDQwMDVcblx0IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YSBFY2hvUnBjVGVzdCAtYmluZCAxOTIuMTY4LjAuNDUgLXBvcnQgNDAwNSAtbWJpbmQgMTkyLjE2OC4wLjQ1IC1jb3VudCAxMDAgLXN0YXRzIDEwXG4iKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGJvb2xlYW4gc2VuZCA9IHRydWU7CisgICAgICAgICAgICBib29sZWFuIGRlYnVnID0gZmFsc2U7CisgICAgICAgICAgICBsb25nIHBhdXNlID0gMzAwMDsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDEwMDAwMDA7CisgICAgICAgICAgICBpbnQgc3RhdHMgPSAxMDAwMDsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gIkVjaG9ScGNJZCI7CisgICAgICAgICAgICBib29sZWFuIGJyZWFrT25FeCA9IGZhbHNlOworICAgICAgICAgICAgaW50IHRocmVhZHMgPSAxOworICAgICAgICAgICAgaW50IG9wdGlvbnMgPSBScGNDaGFubmVsLkFMTF9SRVBMWTsKKyAgICAgICAgICAgIGxvbmcgdGltZW91dCA9IDE1MDAwOworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRWNob1JwY01lc3NhZ2UiOworICAgICAgICAgICAgaWYgKCBhcmdzLmxlbmd0aCA9PSAwICkgeworICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgU3RyaW5nW10geyItaGVscCJ9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCItdGhyZWFkcyIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZHMgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLWNvdW50Ii5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VuZGluZyAiK2NvdW50KyIgbWVzc2FnZXMuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLXBhdXNlIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF1c2UgPSBMb25nLnBhcnNlTG9uZyhhcmdzWysraV0pKjEwMDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLWJyZWFrIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWtPbkV4ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCItc3RhdHMiLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0cyA9IEludGVnZXIucGFyc2VJbnQoYXJnc1srK2ldKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGF0cyBldmVyeSAiK3N0YXRzKyIgbWVzc2FnZSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIi10aW1lb3V0Ii5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IExvbmcucGFyc2VMb25nKGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLW1lc3NhZ2UiLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1uYW1lIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCItbW9kZSIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggImFsbCIuZXF1YWxzKGFyZ3NbKytpXSkgKSBvcHRpb25zID0gUnBjQ2hhbm5lbC5BTExfUkVQTFk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAiZmlyc3QiLmVxdWFscyhhcmdzW2ldKSApIG9wdGlvbnMgPSBScGNDaGFubmVsLkZJUlNUX1JFUExZOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggIm1ham9yaXR5Ii5lcXVhbHMoYXJnc1tpXSkgKSBvcHRpb25zID0gUnBjQ2hhbm5lbC5NQUpPUklUWV9SRVBMWTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCItZGVidWciLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLWhlbHAiLmVxdWFscyhhcmdzW2ldKSkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgCisgICAgCisgICAgICAgICAgICBNYW5hZ2VkQ2hhbm5lbCBjaGFubmVsID0gKE1hbmFnZWRDaGFubmVsKUNoYW5uZWxDcmVhdG9yLmNyZWF0ZUNoYW5uZWwoYXJncyk7CisgICAgICAgICAgICBFY2hvUnBjVGVzdCB0ZXN0ID0gbmV3IEVjaG9ScGNUZXN0KGNoYW5uZWwsbmFtZSxjb3VudCxtZXNzYWdlLHBhdXNlLG9wdGlvbnMsdGltZW91dCk7CisgICAgICAgICAgICBjaGFubmVsLnN0YXJ0KGNoYW5uZWwuREVGQVVMVCk7CisgICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFNodXRkb3duKGNoYW5uZWwpKTsKKyAgICAgICAgICAgIHRlc3QucnVuKCk7CisgICAgCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN5c3RlbSB0ZXN0IGNvbXBsZXRlLCBzbGVlcGluZyB0byBsZXQgdGhyZWFkcyBmaW5pc2guIik7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNjAqMTAwMCo2MCk7CisgICAgICAgIH0gCisgICAgCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2h1dGRvd24gZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICAgICAgTWFuYWdlZENoYW5uZWwgY2hhbm5lbCA9IG51bGw7CisgICAgICAgICAgICBwdWJsaWMgU2h1dGRvd24oTWFuYWdlZENoYW5uZWwgY2hhbm5lbCkgeworICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTaHV0dGluZyBkb3duLi4uIik7CisgICAgICAgICAgICAgICAgU3lzdGVtRXhpdCBleGl0ID0gbmV3IFN5c3RlbUV4aXQoNTAwMCk7CisgICAgICAgICAgICAgICAgZXhpdC5zZXREYWVtb24odHJ1ZSk7CisgICAgICAgICAgICAgICAgZXhpdC5zdGFydCgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwuc3RvcChjaGFubmVsLkRFRkFVTFQpOworICAgIAorICAgICAgICAgICAgICAgIH1jYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgICAgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNoYW5uZWwgc3RvcHBlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN5c3RlbUV4aXQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICAgICAgcHJpdmF0ZSBsb25nIGRlbGF5OworICAgICAgICAgICAgcHVibGljIFN5c3RlbUV4aXQobG9uZyBkZWxheSkgeworICAgICAgICAgICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1biAoKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKGRlbGF5KTsKKyAgICAgICAgICAgICAgICB9Y2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICAgICAgeC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgCisgICAgICAgICAgICB9CisgICAgfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZGVtb3MvSW50cm9zcGVjdGlvblV0aWxzLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZGVtb3MvSW50cm9zcGVjdGlvblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1OTY2MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9kZW1vcy9JbnRyb3NwZWN0aW9uVXRpbHMuamF2YQpAQCAtMCwwICsxLDEwMDMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmRlbW9zOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvLyBEZXBlbmRzOiBKREsxLjEKKworLyoqCisgKiBVdGlscyBmb3IgaW50cm9zcGVjdGlvbiBhbmQgcmVmbGVjdGlvbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSW50cm9zcGVjdGlvblV0aWxzIHsKKworCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIEludHJvc3BlY3Rpb25VdGlscy5jbGFzcyApOworCisgICAgLyoqCisgICAgICogQ2FsbCBleGVjdXRlKCkgLSBhbnkgYW50LWxpa2UgdGFzayBzaG91bGQgd29yaworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleGVjdXRlKE9iamVjdCBwcm94eSwgU3RyaW5nIG1ldGhvZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1ldGhvZCBleGVjdXRlTSA9IG51bGw7CisgICAgICAgIENsYXNzIGMgPSBwcm94eS5nZXRDbGFzcygpOworICAgICAgICBDbGFzcyBwYXJhbXNbXSA9IG5ldyBDbGFzc1swXTsKKyAgICAgICAgLy8JcGFyYW1zWzBdPWFyZ3MuZ2V0Q2xhc3MoKTsKKyAgICAgICAgZXhlY3V0ZU0gPSBmaW5kTWV0aG9kKGMsIG1ldGhvZCwgcGFyYW1zKTsKKyAgICAgICAgaWYgKGV4ZWN1dGVNID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBleGVjdXRlIGluICIgKyBwcm94eS5nZXRDbGFzcygpKTsKKyAgICAgICAgfQorICAgICAgICBleGVjdXRlTS5pbnZva2UocHJveHksIChPYmplY3RbXSkgbnVsbCk7Ly9uZXcgT2JqZWN0W10geyBhcmdzIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgdm9pZCBzZXRBdHRyaWJ1dGUoIFN0cmluZyAsT2JqZWN0ICkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXR0cmlidXRlKE9iamVjdCBwcm94eSwgU3RyaW5nIG4sIE9iamVjdCB2KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwcm94eSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUhvbGRlcikgeworICAgICAgICAgICAgKChBdHRyaWJ1dGVIb2xkZXIpIHByb3h5KS5zZXRBdHRyaWJ1dGUobiwgdik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBNZXRob2QgZXhlY3V0ZU0gPSBudWxsOworICAgICAgICBDbGFzcyBjID0gcHJveHkuZ2V0Q2xhc3MoKTsKKyAgICAgICAgQ2xhc3MgcGFyYW1zW10gPSBuZXcgQ2xhc3NbMl07CisgICAgICAgIHBhcmFtc1swXSA9IFN0cmluZy5jbGFzczsKKyAgICAgICAgcGFyYW1zWzFdID0gT2JqZWN0LmNsYXNzOworICAgICAgICBleGVjdXRlTSA9IGZpbmRNZXRob2QoYywgInNldEF0dHJpYnV0ZSIsIHBhcmFtcyk7CisgICAgICAgIGlmIChleGVjdXRlTSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBzZXRBdHRyaWJ1dGUgaW4gIiArIHByb3h5LmdldENsYXNzKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChmYWxzZSkKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgIiArIG4gKyAiPSIgKyB2ICsgIiAgaW4gIiArIHByb3h5KTsKKyAgICAgICAgZXhlY3V0ZU0uaW52b2tlKHByb3h5LCBuZXcgT2JqZWN0W10geyBuLCB2IH0pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCB2b2lkIGdldEF0dHJpYnV0ZSggU3RyaW5nICkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoT2JqZWN0IHByb3h5LCBTdHJpbmcgbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1ldGhvZCBleGVjdXRlTSA9IG51bGw7CisgICAgICAgIENsYXNzIGMgPSBwcm94eS5nZXRDbGFzcygpOworICAgICAgICBDbGFzcyBwYXJhbXNbXSA9IG5ldyBDbGFzc1sxXTsKKyAgICAgICAgcGFyYW1zWzBdID0gU3RyaW5nLmNsYXNzOworICAgICAgICBleGVjdXRlTSA9IGZpbmRNZXRob2QoYywgImdldEF0dHJpYnV0ZSIsIHBhcmFtcyk7CisgICAgICAgIGlmIChleGVjdXRlTSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBnZXRBdHRyaWJ1dGUgaW4gIiArIHByb3h5LmdldENsYXNzKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4ZWN1dGVNLmludm9rZShwcm94eSwgbmV3IE9iamVjdFtdIHsgbiB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBVUkxDbGFzc0xvYWRlci4gV2lsbCBjb21waWxlIGFuZCB3b3JrIGluIEpESzEuMSB0b28uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRVUkxDbGFzc0xvYWRlcihVUkwgdXJsc1tdLCBDbGFzc0xvYWRlciBwYXJlbnQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzIHVybENMID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIiKTsKKyAgICAgICAgICAgIENsYXNzIHBhcmFtVFtdID0gbmV3IENsYXNzWzJdOworICAgICAgICAgICAgcGFyYW1UWzBdID0gdXJscy5nZXRDbGFzcygpOworICAgICAgICAgICAgcGFyYW1UWzFdID0gQ2xhc3NMb2FkZXIuY2xhc3M7CisgICAgICAgICAgICBNZXRob2QgbSA9IGZpbmRNZXRob2QodXJsQ0wsICJuZXdJbnN0YW5jZSIsIHBhcmFtVCk7CisgICAgICAgICAgICBpZiAobSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IChDbGFzc0xvYWRlcikgbS5pbnZva2UodXJsQ0wsIG5ldyBPYmplY3RbXSB7IHVybHMsCisgICAgICAgICAgICAgICAgICAgIHBhcmVudCB9KTsKKyAgICAgICAgICAgIHJldHVybiBjbDsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gamRrMS4xCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ3Vlc3NJbnN0YWxsKFN0cmluZyBpbnN0YWxsU3lzUHJvcCwKKyAgICAgICAgICAgIFN0cmluZyBob21lU3lzUHJvcCwgU3RyaW5nIGphck5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGd1ZXNzSW5zdGFsbChpbnN0YWxsU3lzUHJvcCwgaG9tZVN5c1Byb3AsIGphck5hbWUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEd1ZXNzIGEgcHJvZHVjdCBpbnN0YWxsL2hvbWUgYnkgYW5hbHl6aW5nIHRoZSBjbGFzcyBwYXRoLiBJdCB3b3JrcyBmb3IKKyAgICAgKiBwcm9kdWN0IHVzaW5nIHRoZSBwYXR0ZXJuOiBsaWIvZXhlY3V0YWJsZS5qYXIgb3IgaWYgZXhlY3V0YWJsZS5qYXIgaXMKKyAgICAgKiBpbmNsdWRlZCBpbiBjbGFzc3BhdGggYnkgYSBzaGVsbCBzY3JpcHQuICggamF2YSAtamFyIGFsc28gd29ya3MgKQorICAgICAqCisgICAgICogSW5zdXJlcyBib3RoICJpbnN0YWxsIiBhbmQgImhvbWUiIFN5c3RlbSBwcm9wZXJ0aWVzIGFyZSBzZXQuIElmIGVpdGhlciBvcgorICAgICAqIGJvdGggU3lzdGVtIHByb3BlcnRpZXMgYXJlIHVuc2V0LCAiaW5zdGFsbCIgYW5kICJob21lIiB3aWxsIGJlIHNldCB0byB0aGUKKyAgICAgKiBzYW1lIHZhbHVlLiBUaGlzIHZhbHVlIHdpbGwgYmUgdGhlIG90aGVyIFN5c3RlbSBwcm9wZXJ0eSB0aGF0IGlzIHNldCwgb3IKKyAgICAgKiB0aGUgZ3Vlc3NlZCB2YWx1ZSBpZiBuZWl0aGVyIGlzIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBndWVzc0luc3RhbGwoU3RyaW5nIGluc3RhbGxTeXNQcm9wLAorICAgICAgICAgICAgU3RyaW5nIGhvbWVTeXNQcm9wLCBTdHJpbmcgamFyTmFtZSwgU3RyaW5nIGNsYXNzRmlsZSkgeworICAgICAgICBTdHJpbmcgaW5zdGFsbCA9IG51bGw7CisgICAgICAgIFN0cmluZyBob21lID0gbnVsbDsKKworICAgICAgICBpZiAoaW5zdGFsbFN5c1Byb3AgIT0gbnVsbCkKKyAgICAgICAgICAgIGluc3RhbGwgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoaW5zdGFsbFN5c1Byb3ApOworCisgICAgICAgIGlmIChob21lU3lzUHJvcCAhPSBudWxsKQorICAgICAgICAgICAgaG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShob21lU3lzUHJvcCk7CisKKyAgICAgICAgaWYgKGluc3RhbGwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGhvbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChob21lU3lzUHJvcCwgaW5zdGFsbCk7CisgICAgICAgICAgICByZXR1cm4gaW5zdGFsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmQgdGhlIGRpcmVjdG9yeSB3aGVyZSBqYXJOYW1lLmphciBpcyBsb2NhdGVkCisKKyAgICAgICAgU3RyaW5nIGNwYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKKyAgICAgICAgU3RyaW5nIHBhdGhTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIik7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY3BhdGgsIHBhdGhTZXApOworICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHN0Lm5leHRUb2tlbigpOworICAgICAgICAgICAgLy8JICAgIGxvZyggInBhdGggIiArIHBhdGggKTsKKyAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKGphck5hbWUpKSB7CisgICAgICAgICAgICAgICAgaG9tZSA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSBqYXJOYW1lLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIiIuZXF1YWxzKGhvbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBob21lID0gbmV3IEZpbGUoIi4vIikuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhvbWUuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBob21lID0gaG9tZS5zdWJzdHJpbmcoMCwgaG9tZS5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGhvbWUpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyZW50RGlyID0gZi5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudERpciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RGlyID0gaG9tZTsgLy8gdW5peCBzdHlsZQorICAgICAgICAgICAgICAgICAgICBGaWxlIGYxID0gbmV3IEZpbGUocGFyZW50RGlyKTsKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFsbCA9IGYxLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbGxTeXNQcm9wICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dChpbnN0YWxsU3lzUHJvcCwgaW5zdGFsbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChob21lID09IG51bGwgJiYgaG9tZVN5c1Byb3AgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KGhvbWVTeXNQcm9wLCBpbnN0YWxsKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbGw7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZuYW1lID0gcGF0aCArIChwYXRoLmVuZHNXaXRoKCIvIikgPyAiIiA6ICIvIikKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY2xhc3NGaWxlOworICAgICAgICAgICAgICAgIGlmIChuZXcgRmlsZShmbmFtZSkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmVudERpciA9IGYuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RGlyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RGlyID0gcGF0aDsgLy8gdW5peCBzdHlsZQorICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmMSA9IG5ldyBGaWxlKHBhcmVudERpcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsID0gZjEuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbGxTeXNQcm9wICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoaW5zdGFsbFN5c1Byb3AsIGluc3RhbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvbWUgPT0gbnVsbCAmJiBob21lU3lzUHJvcCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KGhvbWVTeXNQcm9wLCBpbnN0YWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YWxsOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgaW5zdGFsbCBkaXJlY3RvcnkgY2FuJ3QgYmUgZm91bmQsIHVzZSBob21lIGFzIHRoZSBkZWZhdWx0CisgICAgICAgIGlmIChob21lICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KGluc3RhbGxTeXNQcm9wLCBob21lKTsKKyAgICAgICAgICAgIHJldHVybiBob21lOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVidWcgbWV0aG9kLCBkaXNwbGF5IHRoZSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGlzcGxheUNsYXNzUGF0aChTdHJpbmcgbXNnLCBVUkxbXSBjcCkgeworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1Zyhtc2cpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhjcFtpXS5nZXRGaWxlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEFUSF9TRVBBUkFUT1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIik7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGNsYXNzcGF0aCBlbnRyaWVzIGZyb20gYSB2ZWN0b3Igb2YgVVJMJ3MgdG8gdGhlICJ0Y19wYXRoX2FkZCIgU3lzdGVtCisgICAgICogcHJvcGVydHkuIFRoaXMgU3lzdGVtIHByb3BlcnR5IGxpc3RzIHRoZSBjbGFzc3BhdGggZW50cmllcyBjb21tb24gdG8gd2ViCisgICAgICogYXBwbGljYXRpb25zLiBUaGlzIFN5c3RlbSBwcm9wZXJ0eSBpcyBjdXJyZW50bHkgdXNlZCBieSBKYXNwZXIgd2hlbiBpdHMKKyAgICAgKiBKU1Agc2VydmxldCBjb21waWxlcyB0aGUgSmF2YSBmaWxlIGZvciBhIEpTUC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc1BhdGhBZGQoVVJMIHVybHNbXSwgU3RyaW5nIGNwKSB7CisgICAgICAgIGlmICh1cmxzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gY3A7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY3AgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjcCArPSBQQVRIX1NFUEFSQVRPUiArIHVybHNbaV0uZ2V0RmlsZSgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNwID0gdXJsc1tpXS5nZXRGaWxlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgYSBtZXRob2Qgd2l0aCB0aGUgcmlnaHQgbmFtZSBJZiBmb3VuZCwgY2FsbCB0aGUgbWV0aG9kICggaWYgcGFyYW0gaXMKKyAgICAgKiBpbnQgb3IgYm9vbGVhbiB3ZSdsbCBjb252ZXJ0IHZhbHVlIHRvIHRoZSByaWdodCB0eXBlIGJlZm9yZSkgLSB0aGF0IG1lYW5zCisgICAgICogeW91IGNhbiBoYXZlIHNldERlYnVnKDEpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShPYmplY3QgbywgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAoZGJnID4gMSkKKyAgICAgICAgICAgIGQoInNldFByb3BlcnR5KCIgKyBvLmdldENsYXNzKCkgKyAiICIgKyBuYW1lICsgIj0iICsgdmFsdWUgKyAiKSIpOworCisgICAgICAgIFN0cmluZyBzZXR0ZXIgPSAic2V0IiArIGNhcGl0YWxpemUobmFtZSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2RzW10gPSBmaW5kTWV0aG9kcyhvLmdldENsYXNzKCkpOworICAgICAgICAgICAgTWV0aG9kIHNldFByb3BlcnR5TWV0aG9kID0gbnVsbDsKKworICAgICAgICAgICAgLy8gRmlyc3QsIHRoZSBpZGVhbCBjYXNlIC0gYSBzZXRGb28oIFN0cmluZyApIG1ldGhvZAorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgcGFyYW1UW10gPSBtZXRob2RzW2ldLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICAgICAgaWYgKHNldHRlci5lcXVhbHMobWV0aG9kc1tpXS5nZXROYW1lKCkpICYmIHBhcmFtVC5sZW5ndGggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgImphdmEubGFuZy5TdHJpbmciLmVxdWFscyhwYXJhbVRbMF0uZ2V0TmFtZSgpKSkgeworCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZHNbaV0uaW52b2tlKG8sIG5ldyBPYmplY3RbXSB7IHZhbHVlIH0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUcnkgYSBzZXRGb28gKCBpbnQgKSBvciAoIGJvb2xlYW4gKQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKHNldHRlci5lcXVhbHMobWV0aG9kc1tpXS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtZXRob2RzW2ldLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDEpIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCAtIGZpbmQgdGhlIHR5cGUgYW5kIGludm9rZSBpdAorICAgICAgICAgICAgICAgICAgICBDbGFzcyBwYXJhbVR5cGUgPSBtZXRob2RzW2ldLmdldFBhcmFtZXRlclR5cGVzKClbMF07CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwYXJhbXNbXSA9IG5ldyBPYmplY3RbMV07CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IGEgc2V0Rm9vICggaW50ICkKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJqYXZhLmxhbmcuSW50ZWdlciIuZXF1YWxzKHBhcmFtVHlwZS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgImludCIuZXF1YWxzKHBhcmFtVHlwZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1swXSA9IG5ldyBJbnRlZ2VyKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFRyeSBhIHNldEZvbyAoIGxvbmcgKQorICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZiAoImphdmEubGFuZy5Mb25nIi5lcXVhbHMocGFyYW1UeXBlLmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgImxvbmciLmVxdWFscyhwYXJhbVR5cGUuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1swXSA9IG5ldyBMb25nKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyeSBhIHNldEZvbyAoIGJvb2xlYW4gKQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJqYXZhLmxhbmcuQm9vbGVhbiIuZXF1YWxzKHBhcmFtVHlwZS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgImJvb2xlYW4iLmVxdWFscyhwYXJhbVR5cGUuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gbmV3IEJvb2xlYW4odmFsdWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkgYSBzZXRGb28gKCBJbmV0QWRkcmVzcyApCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImphdmEubmV0LkluZXRBZGRyZXNzIi5lcXVhbHMocGFyYW1UeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQoIlVuYWJsZSB0byByZXNvbHZlIGhvc3QgbmFtZToiICsgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVua25vd24gdHlwZQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZCgiVW5rbm93biB0eXBlICIgKyBwYXJhbVR5cGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kc1tpXS5pbnZva2UobywgcGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHNhdmUgInNldFByb3BlcnR5IiBmb3IgbGF0ZXIKKyAgICAgICAgICAgICAgICBpZiAoInNldFByb3BlcnR5Ii5lcXVhbHMobWV0aG9kc1tpXS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFByb3BlcnR5TWV0aG9kID0gbWV0aG9kc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE9rLCBubyBzZXRYWFggZm91bmQsIHRyeSBhIHNldFByb3BlcnR5KCJuYW1lIiwgInZhbHVlIikKKyAgICAgICAgICAgIGlmIChzZXRQcm9wZXJ0eU1ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdID0gbmV3IE9iamVjdFsyXTsKKyAgICAgICAgICAgICAgICBwYXJhbXNbMF0gPSBuYW1lOworICAgICAgICAgICAgICAgIHBhcmFtc1sxXSA9IHZhbHVlOworICAgICAgICAgICAgICAgIHNldFByb3BlcnR5TWV0aG9kLmludm9rZShvLCBwYXJhbXMpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleDIpIHsKKyAgICAgICAgICAgIGxvZy53YXJuKCJJQUUgIiArIG8gKyAiICIgKyBuYW1lICsgIiAiICsgdmFsdWUsIGV4Mik7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4MSkgeworICAgICAgICAgICAgaWYgKGRiZyA+IDApCisgICAgICAgICAgICAgICAgZCgiU2VjdXJpdHlFeGNlcHRpb24gZm9yICIgKyBvLmdldENsYXNzKCkgKyAiICIgKyBuYW1lICsgIj0iCisgICAgICAgICAgICAgICAgICAgICAgICArIHZhbHVlICsgIikiKTsKKyAgICAgICAgICAgIGlmIChkYmcgPiAxKQorICAgICAgICAgICAgICAgIGV4MS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKKyAgICAgICAgICAgIGlmIChkYmcgPiAwKQorICAgICAgICAgICAgICAgIGQoIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZm9yICIgKyBvLmdldENsYXNzKCkgKyAiICIgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICI9IiArIHZhbHVlICsgIikiKTsKKyAgICAgICAgICAgIGlmIChkYmcgPiAxKQorICAgICAgICAgICAgICAgIGlhZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgaWYgKGRiZyA+IDApCisgICAgICAgICAgICAgICAgZCgiSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBmb3IgIiArIG8uZ2V0Q2xhc3MoKSArICIgIiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIj0iICsgdmFsdWUgKyAiKSIpOworICAgICAgICAgICAgaWYgKGRiZyA+IDEpCisgICAgICAgICAgICAgICAgaWUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3QgbywgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RyaW5nIGdldHRlciA9ICJnZXQiICsgY2FwaXRhbGl6ZShuYW1lKTsKKyAgICAgICAgU3RyaW5nIGlzR2V0dGVyID0gImlzIiArIGNhcGl0YWxpemUobmFtZSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2RzW10gPSBmaW5kTWV0aG9kcyhvLmdldENsYXNzKCkpOworICAgICAgICAgICAgTWV0aG9kIGdldFByb3BlcnR5TWV0aG9kID0gbnVsbDsKKworICAgICAgICAgICAgLy8gRmlyc3QsIHRoZSBpZGVhbCBjYXNlIC0gYSBnZXRGb28oKSBtZXRob2QKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIENsYXNzIHBhcmFtVFtdID0gbWV0aG9kc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgICAgIGlmIChnZXR0ZXIuZXF1YWxzKG1ldGhvZHNbaV0uZ2V0TmFtZSgpKSAmJiBwYXJhbVQubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZHNbaV0uaW52b2tlKG8sIChPYmplY3RbXSkgbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpc0dldHRlci5lcXVhbHMobWV0aG9kc1tpXS5nZXROYW1lKCkpICYmIHBhcmFtVC5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kc1tpXS5pbnZva2UobywgKE9iamVjdFtdKSBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoImdldFByb3BlcnR5Ii5lcXVhbHMobWV0aG9kc1tpXS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGdldFByb3BlcnR5TWV0aG9kID0gbWV0aG9kc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE9rLCBubyBzZXRYWFggZm91bmQsIHRyeSBhIGdldFByb3BlcnR5KCJuYW1lIikKKyAgICAgICAgICAgIGlmIChnZXRQcm9wZXJ0eU1ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdID0gbmV3IE9iamVjdFsxXTsKKyAgICAgICAgICAgICAgICBwYXJhbXNbMF0gPSBuYW1lOworICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eU1ldGhvZC5pbnZva2UobywgcGFyYW1zKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgyKSB7CisgICAgICAgICAgICBsb2cud2FybigiSUFFICIgKyBvICsgIiAiICsgbmFtZSwgZXgyKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXgxKSB7CisgICAgICAgICAgICBpZiAoZGJnID4gMCkKKyAgICAgICAgICAgICAgICBkKCJTZWN1cml0eUV4Y2VwdGlvbiBmb3IgIiArIG8uZ2V0Q2xhc3MoKSArICIgIiArIG5hbWUgKyAiKSIpOworICAgICAgICAgICAgaWYgKGRiZyA+IDEpCisgICAgICAgICAgICAgICAgZXgxLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgaWYgKGRiZyA+IDApCisgICAgICAgICAgICAgICAgZCgiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBmb3IgIiArIG8uZ2V0Q2xhc3MoKSArICIgIiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIikiKTsKKyAgICAgICAgICAgIGlmIChkYmcgPiAxKQorICAgICAgICAgICAgICAgIGlhZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgaWYgKGRiZyA+IDApCisgICAgICAgICAgICAgICAgZCgiSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBmb3IgIiArIG8uZ2V0Q2xhc3MoKSArICIgIiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIikiKTsKKyAgICAgICAgICAgIGlmIChkYmcgPiAxKQorICAgICAgICAgICAgICAgIGllLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShPYmplY3QgbywgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RyaW5nIHNldHRlciA9ICJzZXQiICsgY2FwaXRhbGl6ZShuYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2RzW10gPSBmaW5kTWV0aG9kcyhvLmdldENsYXNzKCkpOworICAgICAgICAgICAgTWV0aG9kIHNldFByb3BlcnR5TWV0aG9kID0gbnVsbDsKKyAgICAgICAgICAgIC8vIGZpbmQgc2V0Rm9vKCkgbWV0aG9kCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBDbGFzcyBwYXJhbVRbXSA9IG1ldGhvZHNbaV0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2V0dGVyLmVxdWFscyhtZXRob2RzW2ldLmdldE5hbWUoKSkgJiYgcGFyYW1ULmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZHNbaV0uaW52b2tlKG8sIG5ldyBPYmplY3RbXSB7fSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleDEpIHsKKyAgICAgICAgICAgIGlmIChkYmcgPiAwKQorICAgICAgICAgICAgICAgIGQoIkV4Y2VwdGlvbiBmb3IgIiArIG8uZ2V0Q2xhc3MoKSArICIgIiArIG5hbWUpOworICAgICAgICAgICAgaWYgKGRiZyA+IDEpCisgICAgICAgICAgICAgICAgZXgxLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZSAke05BTUV9IHdpdGggdGhlIHByb3BlcnR5IHZhbHVlCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGV4cGxpY2l0IG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VQcm9wZXJ0aWVzKFN0cmluZyB2YWx1ZSwgT2JqZWN0IGdldHRlcikgeworICAgICAgICBpZiAoZ2V0dGVyIGluc3RhbmNlb2YgSGFzaHRhYmxlKQorICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VQcm9wZXJ0aWVzKHZhbHVlLCAoSGFzaHRhYmxlKSBnZXR0ZXIsIG51bGwpOworCisgICAgICAgIGlmIChnZXR0ZXIgaW5zdGFuY2VvZiBQcm9wZXJ0eVNvdXJjZSkgeworICAgICAgICAgICAgUHJvcGVydHlTb3VyY2Ugc3JjW10gPSBuZXcgUHJvcGVydHlTb3VyY2VbXSB7IChQcm9wZXJ0eVNvdXJjZSkgZ2V0dGVyIH07CisgICAgICAgICAgICByZXR1cm4gcmVwbGFjZVByb3BlcnRpZXModmFsdWUsIG51bGwsIHNyYyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2UgJHtOQU1FfSB3aXRoIHRoZSBwcm9wZXJ0eSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VQcm9wZXJ0aWVzKFN0cmluZyB2YWx1ZSwgSGFzaHRhYmxlIHN0YXRpY1Byb3AsCisgICAgICAgICAgICBQcm9wZXJ0eVNvdXJjZSBkeW5hbWljUHJvcFtdKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaW50IHByZXYgPSAwOworICAgICAgICAvLyBhc3NlcnQgdmFsdWUhPW5pbAorICAgICAgICBpbnQgcG9zOworICAgICAgICB3aGlsZSAoKHBvcyA9IHZhbHVlLmluZGV4T2YoIiQiLCBwcmV2KSkgPj0gMCkgeworICAgICAgICAgICAgaWYgKHBvcyA+IDApIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuc3Vic3RyaW5nKHByZXYsIHBvcykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvcyA9PSAodmFsdWUubGVuZ3RoKCkgLSAxKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnJCcpOworICAgICAgICAgICAgICAgIHByZXYgPSBwb3MgKyAxOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5jaGFyQXQocG9zICsgMSkgIT0gJ3snKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCckJyk7CisgICAgICAgICAgICAgICAgcHJldiA9IHBvcyArIDE7IC8vIFhYWAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgZW5kTmFtZSA9IHZhbHVlLmluZGV4T2YoJ30nLCBwb3MpOworICAgICAgICAgICAgICAgIGlmIChlbmROYW1lIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuc3Vic3RyaW5nKHBvcykpOworICAgICAgICAgICAgICAgICAgICBwcmV2ID0gdmFsdWUubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgbiA9IHZhbHVlLnN1YnN0cmluZyhwb3MgKyAyLCBlbmROYW1lKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdiA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRpY1Byb3AgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB2ID0gKFN0cmluZykgKChIYXNodGFibGUpIHN0YXRpY1Byb3ApLmdldChuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCAmJiBkeW5hbWljUHJvcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZHluYW1pY1Byb3AubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBkeW5hbWljUHJvcFtpXS5nZXRQcm9wZXJ0eShuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB2ID0gIiR7IiArIG4gKyAifSI7CisKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQodik7CisgICAgICAgICAgICAgICAgcHJldiA9IGVuZE5hbWUgKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwcmV2IDwgdmFsdWUubGVuZ3RoKCkpCisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuc3Vic3RyaW5nKHByZXYpKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV2ZXJzZSBvZiBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2FwaXRhbGl6ZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKyAgICAgICAgY2hhciBjaGFyc1tdID0gbmFtZS50b0NoYXJBcnJheSgpOworICAgICAgICBjaGFyc1swXSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaGFyc1swXSk7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNoYXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1bkNhcGl0YWxpemUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisgICAgICAgIGNoYXIgY2hhcnNbXSA9IG5hbWUudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgY2hhcnNbMF0gPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2hhcnNbMF0pOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjaGFycyk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xhc3MgcGF0aCB0b29scyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQWRkIGFsbCB0aGUgamFyIGZpbGVzIGluIGEgZGlyIHRvIHRoZSBjbGFzc3BhdGgsIHJlcHJlc2VudGVkIGFzIGEgVmVjdG9yCisgICAgICogb2YgVVJMcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVG9DbGFzc1BhdGgoVmVjdG9yIGNwViwgU3RyaW5nIGRpcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGNwQ29tcFtdID0gZ2V0RmlsZXNCeUV4dChkaXIsICIuamFyIik7CisgICAgICAgICAgICBpZiAoY3BDb21wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgamFyQ291bnQgPSBjcENvbXAubGVuZ3RoOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgamFyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBVUkwgdXJsID0gZ2V0VVJMKGRpciwgY3BDb21wW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY3BWLmFkZEVsZW1lbnQodXJsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVG9vbHNKYXIoVmVjdG9yIHYpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEFkZCB0b29scy5qYXIgaW4gYW55IGNhc2UKKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikKKyAgICAgICAgICAgICAgICAgICAgKyAiLy4uL2xpYi90b29scy5qYXIiKTsKKworICAgICAgICAgICAgaWYgKCFmLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgLy8gT24gc29tZSBzeXN0ZW1zIGphdmEuaG9tZSBnZXRzIHNldCB0byB0aGUgcm9vdCBvZiBqZGsuCisgICAgICAgICAgICAgICAgLy8gVGhhdCdzIGEgYnVnLCBidXQgd2UgY2FuIHdvcmsgYXJvdW5kIGFuZCBiZSBuaWNlLgorICAgICAgICAgICAgICAgIGYgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpICsgIi9saWIvdG9vbHMuamFyIik7CisgICAgICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXRlY3RlZCBzdHJhbmdlIGphdmEuaG9tZSB2YWx1ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpdCBzaG91bGQgcG9pbnQgdG8ganJlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLCAiIiwgZi5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudCh1cmwpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCBmaWxlcyB3aXRoIGEgZ2l2ZW4gZXh0ZW5zaW9uIGluIGEgZGlyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRGaWxlc0J5RXh0KFN0cmluZyBsZCwgU3RyaW5nIGV4dCkgeworICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKGxkKTsKKyAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBudWxsOworICAgICAgICBmaW5hbCBTdHJpbmcgbGV4dCA9IGV4dDsKKyAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBuYW1lcyA9IGRpci5saXN0KG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aChsZXh0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBmaWxlIHVybCBmcm9tIGEgZmlsZSwgdXNpbmcgYSBiYXNlIGRpcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVVJMIGdldFVSTChTdHJpbmcgYmFzZSwgU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGUgYmFzZUYgPSBuZXcgRmlsZShiYXNlKTsKKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGJhc2VGLCBmaWxlKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZi5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgcGF0aCArPSAiLyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWYuZXhpc3RzKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCgiZmlsZSIsICIiLCBwYXRoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGVsZW1lbnRzIGZyb20gdGhlIGNsYXNzcGF0aCA8aT5jcCA8L2k+IHRvIGEgVmVjdG9yIDxpPmphcnMgPC9pPiBhcworICAgICAqIGZpbGUgVVJMcyAoV2UgdXNlIFZlY3RvciBmb3IgSkRLIDEuMSBjb21wYXQpLgorICAgICAqIDxwPgorICAgICAqCisgICAgICogQHBhcmFtIGphcnMgVGhlIGphciBsaXN0CisgICAgICogQHBhcmFtIGNwIGEgU3RyaW5nIGNsYXNzcGF0aCBvZiBkaXJlY3Rvcnkgb3IgamFyIGZpbGUgZWxlbWVudHMKKyAgICAgKiAgIHNlcGFyYXRlZCBieSBwYXRoLnNlcGFyYXRvciBkZWxpbWl0ZXJzLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIERvaCA7KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRKYXJzRnJvbUNsYXNzUGF0aChWZWN0b3IgamFycywgU3RyaW5nIGNwKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgc2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJwYXRoLnNlcGFyYXRvciIpOworICAgICAgICBTdHJpbmcgdG9rZW47CisgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdDsKKyAgICAgICAgaWYgKGNwICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihjcCwgc2VwKTsKKyAgICAgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShzdC5uZXh0VG9rZW4oKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBmLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGggKz0gIi8iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCBwYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWphcnMuY29udGFpbnModXJsKSkgeworICAgICAgICAgICAgICAgICAgICBqYXJzLmFkZEVsZW1lbnQodXJsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBVUkxbXSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBhIGNsYXNzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVVJMW10gZ2V0Q2xhc3NQYXRoKFZlY3RvciB2KSB7CisgICAgICAgIFVSTFtdIHVybHMgPSBuZXcgVVJMW3Yuc2l6ZSgpXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICB1cmxzW2ldID0gKFVSTCkgdi5lbGVtZW50QXQoaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVybHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgVVJMIGNsYXNzcGF0aCBmcm9tIGZpbGVzIGluIGEgZGlyZWN0b3J5LCBhIGNwYXRoIHByb3BlcnR5LAorICAgICAqIGFuZCB0b29scy5qYXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBVUkxbXSBnZXRDbGFzc1BhdGgoU3RyaW5nIGRpciwgU3RyaW5nIGNwYXRoLAorICAgICAgICAgICAgU3RyaW5nIGNwYXRoUHJvcCwgYm9vbGVhbiBhZGRUb29scykgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGphcnNWID0gbmV3IFZlY3RvcigpOworICAgICAgICBpZiAoZGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEFkZCBkaXIvY2xhc3NlcyBmaXJzdCwgaWYgaXQgZXhpc3RzCisgICAgICAgICAgICBVUkwgdXJsID0gZ2V0VVJMKGRpciwgImNsYXNzZXMiKTsKKyAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBqYXJzVi5hZGRFbGVtZW50KHVybCk7CisgICAgICAgICAgICBhZGRUb0NsYXNzUGF0aChqYXJzViwgZGlyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjcGF0aCAhPSBudWxsKQorICAgICAgICAgICAgYWRkSmFyc0Zyb21DbGFzc1BhdGgoamFyc1YsIGNwYXRoKTsKKworICAgICAgICBpZiAoY3BhdGhQcm9wICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBjcGF0aDEgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoY3BhdGhQcm9wKTsKKyAgICAgICAgICAgIGFkZEphcnNGcm9tQ2xhc3NQYXRoKGphcnNWLCBjcGF0aDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFkZFRvb2xzKQorICAgICAgICAgICAgYWRkVG9vbHNKYXIoamFyc1YpOworCisgICAgICAgIHJldHVybiBnZXRDbGFzc1BhdGgoamFyc1YpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hcHBpbmcgY29tbWFuZCBsaW5lIHBhcmFtcyB0byBzZXR0ZXJzCisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvY2Vzc0FyZ3MoT2JqZWN0IHByb3h5LCBTdHJpbmcgYXJnc1tdKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBhcmdzMFtdID0gbnVsbDsKKyAgICAgICAgaWYgKG51bGwgIT0gZmluZE1ldGhvZChwcm94eS5nZXRDbGFzcygpLCAiZ2V0T3B0aW9uczEiLCBuZXcgQ2xhc3NbXSB7fSkpIHsKKyAgICAgICAgICAgIGFyZ3MwID0gKFN0cmluZ1tdKSBjYWxsTWV0aG9kMChwcm94eSwgImdldE9wdGlvbnMxIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXJnczAgPT0gbnVsbCkgeworICAgICAgICAgICAgLy9hcmdzMD1maW5kVm9pZFNldHRlcnMocHJveHkuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhcmdzMCA9IGZpbmRCb29sZWFuU2V0dGVycyhwcm94eS5nZXRDbGFzcygpKTsKKyAgICAgICAgfQorICAgICAgICBIYXNodGFibGUgaCA9IG51bGw7CisgICAgICAgIGlmIChudWxsICE9IGZpbmRNZXRob2QocHJveHkuZ2V0Q2xhc3MoKSwgImdldE9wdGlvbkFsaWFzZXMiLAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHt9KSkgeworICAgICAgICAgICAgaCA9IChIYXNodGFibGUpIGNhbGxNZXRob2QwKHByb3h5LCAiZ2V0T3B0aW9uQWxpYXNlcyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm9jZXNzQXJncyhwcm94eSwgYXJncywgYXJnczAsIG51bGwsIGgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9jZXNzQXJncyhPYmplY3QgcHJveHksIFN0cmluZyBhcmdzW10sCisgICAgICAgICAgICBTdHJpbmcgYXJnczBbXSwgU3RyaW5nIGFyZ3MxW10sIEhhc2h0YWJsZSBhbGlhc2VzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgYXJnID0gYXJnc1tpXTsKKyAgICAgICAgICAgIGlmIChhcmcuc3RhcnRzV2l0aCgiLSIpKQorICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICBpZiAoYWxpYXNlcyAhPSBudWxsICYmIGFsaWFzZXMuZ2V0KGFyZykgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBhcmcgPSAoU3RyaW5nKSBhbGlhc2VzLmdldChhcmcpOworCisgICAgICAgICAgICBpZiAoYXJnczAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gc2V0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhcmdzMC5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXJnczBbal0uZXF1YWxzSWdub3JlQ2FzZShhcmcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eShwcm94eSwgYXJnczBbal0sICJ0cnVlIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNldCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXJnczEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYXJnczEubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MxW2pdLmVxdWFsc0lnbm9yZUNhc2UoYXJnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gYXJncy5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvcGVydHkocHJveHksIGFyZywgYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaWYgYXJnczEgaXMgbm90IHNwZWNpZmllZCxhc3N1bWUgYWxsIG90aGVyIG9wdGlvbnMgaGF2ZSBwYXJhbQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBpZiAoaSA+PSBhcmdzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHNldFByb3BlcnR5KHByb3h5LCBhcmcsIGFyZ3NbaV0pOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gb3RoZXIgdXRpbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG9iamVjdE1ldGhvZHMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGZpbmRWb2lkU2V0dGVycyhDbGFzcyBjKSB7CisgICAgICAgIE1ldGhvZCBtW10gPSBmaW5kTWV0aG9kcyhjKTsKKyAgICAgICAgaWYgKG0gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobVtpXS5nZXROYW1lKCkuc3RhcnRzV2l0aCgic2V0IikKKyAgICAgICAgICAgICAgICAgICAgJiYgbVtpXS5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFyZyA9IG1baV0uZ2V0TmFtZSgpLnN1YnN0cmluZygzKTsKKyAgICAgICAgICAgICAgICB2LmFkZEVsZW1lbnQodW5DYXBpdGFsaXplKGFyZykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN0cmluZyBzW10gPSBuZXcgU3RyaW5nW3Yuc2l6ZSgpXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzW2ldID0gKFN0cmluZykgdi5lbGVtZW50QXQoaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBmaW5kQm9vbGVhblNldHRlcnMoQ2xhc3MgYykgeworICAgICAgICBNZXRob2QgbVtdID0gZmluZE1ldGhvZHMoYyk7CisgICAgICAgIGlmIChtID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1baV0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInNldCIpCisgICAgICAgICAgICAgICAgICAgICYmIG1baV0uZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiAiYm9vbGVhbiIuZXF1YWxzSWdub3JlQ2FzZShtW2ldLmdldFBhcmFtZXRlclR5cGVzKClbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBhcmcgPSBtW2ldLmdldE5hbWUoKS5zdWJzdHJpbmcoMyk7CisgICAgICAgICAgICAgICAgdi5hZGRFbGVtZW50KHVuQ2FwaXRhbGl6ZShhcmcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgc1tdID0gbmV3IFN0cmluZ1t2LnNpemUoKV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc1tpXSA9IChTdHJpbmcpIHYuZWxlbWVudEF0KGkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIHN0YXRpYyBIYXNodGFibGUgb2JqZWN0TWV0aG9kcyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kW10gZmluZE1ldGhvZHMoQ2xhc3MgYykgeworICAgICAgICBNZXRob2QgbWV0aG9kc1tdID0gKE1ldGhvZFtdKSBvYmplY3RNZXRob2RzLmdldChjKTsKKyAgICAgICAgaWYgKG1ldGhvZHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBtZXRob2RzOworCisgICAgICAgIG1ldGhvZHMgPSBjLmdldE1ldGhvZHMoKTsKKyAgICAgICAgb2JqZWN0TWV0aG9kcy5wdXQoYywgbWV0aG9kcyk7CisgICAgICAgIHJldHVybiBtZXRob2RzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGZpbmRNZXRob2QoQ2xhc3MgYywgU3RyaW5nIG5hbWUsIENsYXNzIHBhcmFtc1tdKSB7CisgICAgICAgIE1ldGhvZCBtZXRob2RzW10gPSBmaW5kTWV0aG9kcyhjKTsKKyAgICAgICAgaWYgKG1ldGhvZHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtZXRob2RzW2ldLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBDbGFzcyBtZXRob2RQYXJhbXNbXSA9IG1ldGhvZHNbaV0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kUGFyYW1zID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCB8fCBwYXJhbXMubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1zID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2RQYXJhbXMgPT0gbnVsbCB8fCBtZXRob2RQYXJhbXMubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPSBtZXRob2RQYXJhbXMubGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBhcmFtcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zW2pdICE9IG1ldGhvZFBhcmFtc1tqXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZHNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqIFRlc3QgaWYgdGhlIG9iamVjdCBpbXBsZW1lbnRzIGEgcGFydGljdWxhcgorICAgICAqICBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSG9vayhPYmplY3Qgb2JqLCBTdHJpbmcgbWV0aG9kTikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIG15TWV0aG9kc1tdID0gZmluZE1ldGhvZHMob2JqLmdldENsYXNzKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBteU1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kTi5lcXVhbHMobXlNZXRob2RzW2ldLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBvdmVycmlkZW4KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3MgZGVjbGFyaW5nID0gbXlNZXRob2RzW2ldLmdldERlY2xhcmluZ0NsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgIENsYXNzIHBhcmVudE9mRGVjbGFyaW5nID0gZGVjbGFyaW5nLmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB3b3JrcyBvbmx5IGlmIHRoZSBiYXNlIGNsYXNzIGRvZXNuJ3QgZXh0ZW5kCisgICAgICAgICAgICAgICAgICAgIC8vIGFub3RoZXIgY2xhc3MuCisKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIG1ldGhvZCBpcyBkZWNsYXJlZCBpbiBhIHRvcCBsZXZlbCBjbGFzcworICAgICAgICAgICAgICAgICAgICAvLyBsaWtlIEJhc2VJbnRlcmNlcHRvciBwYXJlbnQgaXMgT2JqZWN0LCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50IGlzIEJhc2VJbnRlcmNlcHRvciBvciBhbiBpbnRlcm1lZGlhdGUgY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEiamF2YS5sYW5nLk9iamVjdCIuZXF1YWxzKHBhcmVudE9mRGVjbGFyaW5nLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2FsbE1haW4oQ2xhc3MgYywgU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzIHBbXSA9IG5ldyBDbGFzc1sxXTsKKyAgICAgICAgcFswXSA9IGFyZ3MuZ2V0Q2xhc3MoKTsKKyAgICAgICAgTWV0aG9kIG0gPSBjLmdldE1ldGhvZCgibWFpbiIsIHApOworICAgICAgICBtLmludm9rZShjLCBuZXcgT2JqZWN0W10geyBhcmdzIH0pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNhbGxNZXRob2QxKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROLAorICAgICAgICAgICAgT2JqZWN0IHBhcmFtMSwgU3RyaW5nIHR5cGVQYXJhbTEsIENsYXNzTG9hZGVyIGNsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IHBhcmFtMSA9PSBudWxsKSB7CisgICAgICAgICAgICBkKCJBc3NlcnQ6IElsbGVnYWwgcGFyYW1zICIgKyB0YXJnZXQgKyAiICIgKyBwYXJhbTEpOworICAgICAgICB9CisgICAgICAgIGlmIChkYmcgPiAwKQorICAgICAgICAgICAgZCgiY2FsbE1ldGhvZDEgIiArIHRhcmdldC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgIgorICAgICAgICAgICAgICAgICAgICArIHBhcmFtMS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgIiArIHR5cGVQYXJhbTEpOworCisgICAgICAgIENsYXNzIHBhcmFtc1tdID0gbmV3IENsYXNzWzFdOworICAgICAgICBpZiAodHlwZVBhcmFtMSA9PSBudWxsKQorICAgICAgICAgICAgcGFyYW1zWzBdID0gcGFyYW0xLmdldENsYXNzKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBhcmFtc1swXSA9IGNsLmxvYWRDbGFzcyh0eXBlUGFyYW0xKTsKKyAgICAgICAgTWV0aG9kIG0gPSBmaW5kTWV0aG9kKHRhcmdldC5nZXRDbGFzcygpLCBtZXRob2ROLCBwYXJhbXMpOworICAgICAgICBpZiAobSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbih0YXJnZXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiICIKKyAgICAgICAgICAgICAgICAgICAgKyBtZXRob2ROKTsKKyAgICAgICAgcmV0dXJuIG0uaW52b2tlKHRhcmdldCwgbmV3IE9iamVjdFtdIHsgcGFyYW0xIH0pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNhbGxNZXRob2QwKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZCgiQXNzZXJ0OiBJbGxlZ2FsIHBhcmFtcyAiICsgdGFyZ2V0KTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChkYmcgPiAwKQorICAgICAgICAgICAgZCgiY2FsbE1ldGhvZDAgIiArIHRhcmdldC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIuIiArIG1ldGhvZE4pOworCisgICAgICAgIENsYXNzIHBhcmFtc1tdID0gbmV3IENsYXNzWzBdOworICAgICAgICBNZXRob2QgbSA9IGZpbmRNZXRob2QodGFyZ2V0LmdldENsYXNzKCksIG1ldGhvZE4sIHBhcmFtcyk7CisgICAgICAgIGlmIChtID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKHRhcmdldC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgIgorICAgICAgICAgICAgICAgICAgICArIG1ldGhvZE4pOworICAgICAgICByZXR1cm4gbS5pbnZva2UodGFyZ2V0LCBlbXB0eUFycmF5KTsKKyAgICB9CisKKyAgICBzdGF0aWMgT2JqZWN0W10gZW1wdHlBcnJheSA9IG5ldyBPYmplY3RbXSB7fTsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNhbGxNZXRob2ROKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROLAorICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdLCBDbGFzcyB0eXBlUGFyYW1zW10pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXRob2QgbSA9IG51bGw7CisgICAgICAgIG0gPSBmaW5kTWV0aG9kKHRhcmdldC5nZXRDbGFzcygpLCBtZXRob2ROLCB0eXBlUGFyYW1zKTsKKyAgICAgICAgaWYgKG0gPT0gbnVsbCkgeworICAgICAgICAgICAgZCgiQ2FuJ3QgZmluZCBtZXRob2QgIiArIG1ldGhvZE4gKyAiIGluICIgKyB0YXJnZXQgKyAiIENMQVNTICIKKyAgICAgICAgICAgICAgICAgICAgKyB0YXJnZXQuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBPYmplY3QgbyA9IG0uaW52b2tlKHRhcmdldCwgcGFyYW1zKTsKKworICAgICAgICBpZiAoZGJnID4gMCkgeworICAgICAgICAgICAgLy8gZGVidWcKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIiArIHRhcmdldC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIuIiArIG1ldGhvZE4gKyAiKCAiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhcmFtc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgICAgIGQoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG87CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY29udmVydChTdHJpbmcgb2JqZWN0LCBDbGFzcyBwYXJhbVR5cGUpIHsKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7CisgICAgICAgIGlmICgiamF2YS5sYW5nLlN0cmluZyIuZXF1YWxzKHBhcmFtVHlwZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBvYmplY3Q7CisgICAgICAgIH0gZWxzZSBpZiAoImphdmEubGFuZy5JbnRlZ2VyIi5lcXVhbHMocGFyYW1UeXBlLmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICB8fCAiaW50Ii5lcXVhbHMocGFyYW1UeXBlLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEludGVnZXIob2JqZWN0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVHJ5IGEgc2V0Rm9vICggYm9vbGVhbiApCisgICAgICAgIH0gZWxzZSBpZiAoImphdmEubGFuZy5Cb29sZWFuIi5lcXVhbHMocGFyYW1UeXBlLmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICB8fCAiYm9vbGVhbiIuZXF1YWxzKHBhcmFtVHlwZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgQm9vbGVhbihvYmplY3QpOworCisgICAgICAgICAgICAvLyBUcnkgYSBzZXRGb28gKCBJbmV0QWRkcmVzcyApCisgICAgICAgIH0gZWxzZSBpZiAoImphdmEubmV0LkluZXRBZGRyZXNzIi5lcXVhbHMocGFyYW1UeXBlCisgICAgICAgICAgICAgICAgLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKG9iamVjdCk7CisgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgICAgICBkKCJVbmFibGUgdG8gcmVzb2x2ZSBob3N0IG5hbWU6IiArIG9iamVjdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVua25vd24gdHlwZQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZCgiVW5rbm93biB0eXBlICIgKyBwYXJhbVR5cGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IGNvbnZlcnQgYXJndW1lbnQ6ICIgKyBvYmplY3QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2V0IHByb3BlcnR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gVGhpcyBwcm92aWRlcyBhIGxheWVyIG9mIGFic3RyYWN0aW9uCisKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBQcm9wZXJ0eVNvdXJjZSB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KTsKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEF0dHJpYnV0ZUhvbGRlciB7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBrZXksIE9iamVjdCBvKTsKKworICAgIH0KKworICAgIC8vIGRlYnVnIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgc3RhdGljIGZpbmFsIGludCBkYmcgPSAwOworCisgICAgc3RhdGljIHZvaWQgZChTdHJpbmcgcykgeworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkludHJvc3BlY3Rpb25VdGlsczogIiArIHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9kZW1vcy9Mb2FkVGVzdC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL2RlbW9zL0xvYWRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiM2M1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9kZW1vcy9Mb2FkVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZGVtb3M7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQnl0ZU1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWFuYWdlZENoYW5uZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcnNoaXBMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pby5YQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsOworaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7CisKKworLyoqCisgKiA8cD5UaXRsZTogPC9wPgorICoKKyAqIDxwPkRlc2NyaXB0aW9uOiA8L3A+CisgKgorICogPHA+Q29weXJpZ2h0OiBDb3B5cmlnaHQgKGMpIDIwMDU8L3A+CisgKgorICogPHA+Q29tcGFueTogPC9wPgorICoKKyAqIEBhdXRob3Igbm90IGF0dHJpYnV0YWJsZQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBMb2FkVGVzdCBpbXBsZW1lbnRzIE1lbWJlcnNoaXBMaXN0ZW5lcixDaGFubmVsTGlzdGVuZXIsIFJ1bm5hYmxlIHsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyhMb2FkVGVzdC5jbGFzcyk7CisgICAgcHVibGljIHN0YXRpYyBpbnQgc2l6ZSA9IDI0MDAwOworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IG11dGV4ID0gbmV3IE9iamVjdCgpOworICAgIHB1YmxpYyBib29sZWFuIGRvUnVuID0gdHJ1ZTsKKyAgICAKKyAgICBwdWJsaWMgbG9uZyBieXRlc1JlY2VpdmVkID0gMDsKKyAgICBwdWJsaWMgZmxvYXQgbUJ5dGVzUmVjZWl2ZWQgPSAwOworICAgIHB1YmxpYyBpbnQgIG1lc3NhZ2VzUmVjZWl2ZWQgPSAwOworICAgIHB1YmxpYyBib29sZWFuIHNlbmQgPSB0cnVlOworICAgIHB1YmxpYyBib29sZWFuIGRlYnVnID0gZmFsc2U7CisgICAgcHVibGljIGludCBtc2dDb3VudCA9IDEwMDsKKyAgICBNYW5hZ2VkQ2hhbm5lbCBjaGFubmVsPW51bGw7CisgICAgcHVibGljIGludCBzdGF0c0ludGVydmFsID0gMTAwMDA7CisgICAgcHVibGljIGxvbmcgcGF1c2UgPSAwOworICAgIHB1YmxpYyBib29sZWFuIGJyZWFrb25DaGFubmVsRXhjZXB0aW9uID0gZmFsc2U7CisgICAgcHVibGljIGJvb2xlYW4gYXN5bmMgPSBmYWxzZTsKKyAgICBwdWJsaWMgbG9uZyByZWNlaXZlU3RhcnQgPSAwOworICAgIHB1YmxpYyBpbnQgY2hhbm5lbE9wdGlvbnMgPSBDaGFubmVsLlNFTkRfT1BUSU9OU19ERUZBVUxUOworICAgIAorICAgIHN0YXRpYyBpbnQgbWVzc2FnZVNpemUgPSAwOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBtZXNzYWdlc1NlbnQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBtZXNzYWdlU3RhcnRTZW5kVGltZSA9IDA7CisgICAgcHVibGljIHN0YXRpYyBsb25nIG1lc3NhZ2VFbmRTZW5kVGltZSA9IDA7CisgICAgcHVibGljIHN0YXRpYyBpbnQgIHRocmVhZENvdW50ID0gMDsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0VGVzdCgpIHsKKyAgICAgICAgdGhyZWFkQ291bnQrKzsKKyAgICAgICAgaWYgKCBtZXNzYWdlU3RhcnRTZW5kVGltZSA9PSAwICkgbWVzc2FnZVN0YXJ0U2VuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBlbmRUZXN0KCkgeworICAgICAgICB0aHJlYWRDb3VudC0tOworICAgICAgICBpZiAoIG1lc3NhZ2VFbmRTZW5kVGltZSA9PSAwICYmIHRocmVhZENvdW50PT0wICkgbWVzc2FnZUVuZFNlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgfQorCisgICAgCisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgbG9uZyBhZGRTZW5kU3RhdHMobG9uZyBjb3VudCkgeworICAgICAgICBtZXNzYWdlc1NlbnQrPWNvdW50OworICAgICAgICByZXR1cm4gMGw7CisgICAgfSAgICAKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50U2VuZFN0YXRzKGxvbmcgY291bnRlciwgaW50IG1lc3NhZ2VTaXplKSB7CisgICAgICAgIGZsb2F0IGNudCA9IChmbG9hdCljb3VudGVyOworICAgICAgICBmbG9hdCBzaXplID0gKGZsb2F0KW1lc3NhZ2VTaXplOworICAgICAgICBmbG9hdCB0aW1lID0gKGZsb2F0KShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS1tZXNzYWdlU3RhcnRTZW5kVGltZSkgLyAxMDAwZjsKKyAgICAgICAgbG9nLmluZm8oIioqKipTRU5EIFNUQVRTLSIrVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkrIioqKioqIisKKyAgICAgICAgICAgICAgICAgIlxuXHRNZXNzYWdlIGNvdW50OiIrY291bnRlcisKKyAgICAgICAgICAgICAgICAgIlxuXHRUb3RhbCBieXRlcyAgOiIrKGxvbmcpKHNpemUqY250KSsKKyAgICAgICAgICAgICAgICAgIlxuXHRUb3RhbCBzZWNvbmRzOiIrKHRpbWUpKworICAgICAgICAgICAgICAgICAiXG5cdEJ5dGVzL3NlY29uZCA6Iisoc2l6ZSpjbnQvdGltZSkrCisgICAgICAgICAgICAgICAgICJcblx0TUJ5dGVzL3NlY29uZDoiKyhzaXplKmNudC90aW1lLzEwMjRmLzEwMjRmKSk7CisgICAgfQorCisgICAgCisgICAgCisgICAgcHVibGljIExvYWRUZXN0KE1hbmFnZWRDaGFubmVsIGNoYW5uZWwsIAorICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlbmQsCisgICAgICAgICAgICAgICAgICAgIGludCBtc2dDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWJ1ZywKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBwYXVzZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRzLAorICAgICAgICAgICAgICAgICAgICBib29sZWFuIGJyZWFrT25FeCkgeworICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsOworICAgICAgICB0aGlzLnNlbmQgPSBzZW5kOworICAgICAgICB0aGlzLm1zZ0NvdW50ID0gbXNnQ291bnQ7CisgICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKKyAgICAgICAgdGhpcy5wYXVzZSA9IHBhdXNlOworICAgICAgICB0aGlzLnN0YXRzSW50ZXJ2YWwgPSBzdGF0czsKKyAgICAgICAgdGhpcy5icmVha29uQ2hhbm5lbEV4Y2VwdGlvbiA9IGJyZWFrT25FeDsKKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAKKyAgICAgICAgbG9uZyBjb3VudGVyID0gMDsKKyAgICAgICAgbG9uZyB0b3RhbCA9IDA7CisgICAgICAgIExvYWRNZXNzYWdlIG1zZyA9IG5ldyBMb2FkTWVzc2FnZSgpOworICAgICAgICBpbnQgbWVzc2FnZVNpemUgPSBMb2FkVGVzdC5tZXNzYWdlU2l6ZTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdGFydFRlc3QoKTsKKyAgICAgICAgICAgIHdoaWxlICh0b3RhbCA8IG1zZ0NvdW50KSB7CisgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwuZ2V0TWVtYmVycygpLmxlbmd0aCA9PSAwIHx8ICghc2VuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtdXRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRleC53YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIlRocmVhZCBpbnRlcnJ1cHRlZCBmcm9tIHdhaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL21zZy5zZXRNc2dOcigoaW50KSsrdG90YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRBcnJheShtc2cuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwuc2VuZChjaGFubmVsLmdldE1lbWJlcnMoKSwgbXNnLCBjaGFubmVsT3B0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBhdXNlID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGRlYnVnKSBTeXN0ZW0ub3V0LnByaW50bG4oIlBhdXNpbmcgc2VuZGVyIGZvciAiK3BhdXNlKyIgbXMuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHBhdXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2hhbm5lbEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGRlYnVnICkgbG9nLmVycm9yKCJVbmFibGUgdG8gc2VuZCBtZXNzYWdlOiIreC5nZXRNZXNzYWdlKCkseCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzZW5kIG1lc3NhZ2U6Iit4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsRXhjZXB0aW9uLkZhdWx0eU1lbWJlcltdIGZhdWx0eSA9IHguZ2V0RmF1bHR5TWVtYmVycygpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZhdWx0eS5sZW5ndGg7IGkrKyApIGxvZy5lcnJvcigiRmF1bHR5OiAiK2ZhdWx0eVtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAtLWNvdW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHRoaXMuYnJlYWtvbkNoYW5uZWxFeGNlcHRpb24gKSB0aHJvdyB4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggKGNvdW50ZXIgJSBzdGF0c0ludGVydmFsKSA9PSAwICYmIChjb3VudGVyID4gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9hZGQgdG8gdGhlIGdsb2JhbCBjb3VudGVyCisgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgPSBhZGRTZW5kU3RhdHMoY291bnRlcik7CisgICAgICAgICAgICAgICAgICAgIC8vcHJpbnQgZnJvbSB0aGUgZ2xvYmFsIGNvdW50ZXIKKyAgICAgICAgICAgICAgICAgICAgLy9wcmludFNlbmRTdGF0cyhMb2FkVGVzdC5tZXNzYWdlc1NlbnQsIExvYWRUZXN0Lm1lc3NhZ2VTaXplLCBMb2FkVGVzdC5tZXNzYWdlU2VuZFRpbWUpOworICAgICAgICAgICAgICAgICAgICBwcmludFNlbmRTdGF0cyhMb2FkVGVzdC5tZXNzYWdlc1NlbnQsIExvYWRUZXN0Lm1lc3NhZ2VTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH1jYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJDYXB0dXJlZCBlcnJvciB3aGlsZSBzZW5kaW5nOiIreC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgaWYgKCBkZWJ1ZyApIGxvZy5lcnJvcigiIix4KTsKKyAgICAgICAgICAgIHByaW50U2VuZFN0YXRzKExvYWRUZXN0Lm1lc3NhZ2VzU2VudCwgTG9hZFRlc3QubWVzc2FnZVNpemUpOworICAgICAgICB9CisgICAgICAgIGVuZFRlc3QoKTsKKyAgICB9CisKKyAgICAKKworICAgIC8qKgorICAgICAqIG1lbWJlckFkZGVkCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVtYmVyIE1lbWJlcgorICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcnNoaXBMaXN0ZW5lcgorICAgICAqICAgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWVtYmVyQWRkZWQoTWVtYmVyIG1lbWJlcikgeworICAgICAgICBsb2cuaW5mbygiTWVtYmVyIGFkZGVkOiIrbWVtYmVyKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtdXRleCkgeworICAgICAgICAgICAgbXV0ZXgubm90aWZ5QWxsKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtZW1iZXJEaXNhcHBlYXJlZAorICAgICAqCisgICAgICogQHBhcmFtIG1lbWJlciBNZW1iZXIKKyAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXJzaGlwTGlzdGVuZXIKKyAgICAgKiAgIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgbG9nLmluZm8oIk1lbWJlciBkaXNhcHBlYXJlZDoiK21lbWJlcik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChTZXJpYWxpemFibGUgbXNnLCBNZW1iZXIgbWJyKXsgCisgICAgICAgcmV0dXJuIChtc2cgaW5zdGFuY2VvZiBMb2FkTWVzc2FnZSkgfHwgKG1zZyBpbnN0YW5jZW9mIEJ5dGVNZXNzYWdlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKFNlcmlhbGl6YWJsZSBtc2csIE1lbWJlciBtYnIpeyAKKyAgICAgICAgaWYgKCByZWNlaXZlU3RhcnQgPT0gMCApIHJlY2VpdmVTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBpZiAoIGRlYnVnICkgeworICAgICAgICAgICAgaWYgKCBtc2cgaW5zdGFuY2VvZiBMb2FkTWVzc2FnZSApIHsKKyAgICAgICAgICAgICAgICBwcmludEFycmF5KCgoTG9hZE1lc3NhZ2UpbXNnKS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIG1zZyBpbnN0YW5jZW9mIEJ5dGVNZXNzYWdlICYmICEobXNnIGluc3RhbmNlb2YgTG9hZE1lc3NhZ2UpKSB7CisgICAgICAgICAgICBMb2FkTWVzc2FnZSB0bXAgPSBuZXcgTG9hZE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIHRtcC5zZXRNZXNzYWdlKCgoQnl0ZU1lc3NhZ2UpbXNnKS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgbXNnID0gdG1wOworICAgICAgICAgICAgdG1wID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIGJ5dGVzUmVjZWl2ZWQrPSgoTG9hZE1lc3NhZ2UpbXNnKS5nZXRNZXNzYWdlKCkubGVuZ3RoOworICAgICAgICBtQnl0ZXNSZWNlaXZlZCs9KChmbG9hdCkoKExvYWRNZXNzYWdlKW1zZykuZ2V0TWVzc2FnZSgpLmxlbmd0aCkvMTAyNGYvMTAyNGY7CisgICAgICAgIG1lc3NhZ2VzUmVjZWl2ZWQrKzsKKyAgICAgICAgaWYgKCAobWVzc2FnZXNSZWNlaXZlZCVzdGF0c0ludGVydmFsKT09MCB8fCAobWVzc2FnZXNSZWNlaXZlZD09bXNnQ291bnQpKSB7CisgICAgICAgICAgICBmbG9hdCBieXRlcyA9IChmbG9hdCkoKChMb2FkTWVzc2FnZSltc2cpLmdldE1lc3NhZ2UoKS5sZW5ndGgqbWVzc2FnZXNSZWNlaXZlZCk7CisgICAgICAgICAgICBmbG9hdCBzZWNvbmRzID0gKChmbG9hdCkoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktcmVjZWl2ZVN0YXJ0KSkgLyAxMDAwZjsKKyAgICAgICAgICAgIGxvZy5pbmZvKCIqKioqUkVDRUlWRSBTVEFUUy0iK1RocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKyIqKioqKiIrCisgICAgICAgICAgICAgICAgICAgICAiXG5cdE1lc3NhZ2UgY291bnQgOiIrKGxvbmcpbWVzc2FnZXNSZWNlaXZlZCsKKyAgICAgICAgICAgICAgICAgICAgICJcblx0VG90YWwgYnl0ZXMgICA6IisobG9uZylieXRlcysKKyAgICAgICAgICAgICAgICAgICAgICJcblx0VG90YWwgbWJ5dGVzICA6IisobG9uZyltQnl0ZXNSZWNlaXZlZCsKKyAgICAgICAgICAgICAgICAgICAgICJcblx0VGltZSBzaW5jZSAxc3Q6IitzZWNvbmRzKyIgc2Vjb25kcyIrCisgICAgICAgICAgICAgICAgICAgICAiXG5cdEJ5dGVzL3NlY29uZCAgOiIrKGJ5dGVzL3NlY29uZHMpKworICAgICAgICAgICAgICAgICAgICAgIlxuXHRNQnl0ZXMvc2Vjb25kIDoiKyhtQnl0ZXNSZWNlaXZlZC9zZWNvbmRzKSsiXG4iKTsKKworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEFycmF5KGJ5dGVbXSBkYXRhKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGRhdGEubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGRhdGFbaV0pOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLCIpOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigifSBzaXplOiIrZGF0YS5sZW5ndGgpOworICAgIH0KKworICAgIAorICAgIAorICAgIC8vcHVibGljIHN0YXRpYyBjbGFzcyBMb2FkTWVzc2FnZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSAgeworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTG9hZE1lc3NhZ2UgZXh0ZW5kcyBCeXRlTWVzc2FnZSAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgICAgICAKKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gb3V0ZGF0YSA9IG5ldyBieXRlW3NpemVdOworICAgICAgICBwdWJsaWMgc3RhdGljIFJhbmRvbSByID0gbmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE1lc3NhZ2VTaXplIChMb2FkTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGludCBtZXNzYWdlU2l6ZSA9IG1zZy5nZXRNZXNzYWdlKCkubGVuZ3RoOworICAgICAgICAgICAgaWYgKCAoKE9iamVjdCltc2cpIGluc3RhbmNlb2YgQnl0ZU1lc3NhZ2UgKSByZXR1cm4gbWVzc2FnZVNpemU7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2VTaXplICA9IFhCeXRlQnVmZmVyLnNlcmlhbGl6ZShuZXcgTG9hZE1lc3NhZ2UoKSkubGVuZ3RoOworICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJBdmVyYWdlIG1lc3NhZ2Ugc2l6ZToiICsgbWVzc2FnZVNpemUgKyAiIGJ5dGVzIik7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGNhbGN1bGF0ZSB0ZXN0IG1lc3NhZ2Ugc2l6ZS4iLCB4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgeworICAgICAgICAgICAgci5uZXh0Qnl0ZXMob3V0ZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCBieXRlW10gbWVzc2FnZSA9IGdldE1lc3NhZ2UoKTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBMb2FkTWVzc2FnZSgpIHsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRNZXNzYWdlKCkgeworICAgICAgICAgICAgaWYgKCBtZXNzYWdlID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG91dGRhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShieXRlW10gZGF0YSkgeworICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gZGF0YTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdXNhZ2UoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJpYmVzIExvYWQgdGVzdGVyLiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBsb2FkIHRlc3RlciBjYW4gYmUgdXNlZCBpbiBzZW5kZXIgb3IgcmVjZWl2ZWQgbW9kZSBvciBib3RoIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6XG5cdCIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YSBMb2FkVGVzdCBbb3B0aW9uc11cblx0IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcHRpb25zOlxuXHRcdCIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiWy1tb2RlIHJlY2VpdmV8c2VuZHxib3RoXSAgXG5cdFx0IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJbLXN0YXJ0b3B0aW9ucyBzdGFydGZsYWdzIChkZWZhdWx0IGlzIENoYW5uZWwuREVGQVVMVCkgXSAgXG5cdFx0IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJbLWRlYnVnXSAgXG5cdFx0IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJbLWNvdW50IG1lc3NhZ2Vjb3VudF0gIFxuXHRcdCIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiWy1zdGF0cyBzdGF0aW50ZXJ2YWxdICBcblx0XHQiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlstcGF1c2UgbnJvZnNlY29uZHN0b3BhdXNlYmV0d2VlbnNlbmRzXSAgXG5cdFx0IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJbLXRocmVhZHMgbnVtYmVyb2ZzZW5kZXJ0aHJlYWRzXSAgXG5cdFx0IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJbLXNpemUgbWVzc2FnZXNpemVdICBcblx0XHQiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlstc2VuZG9wdGlvbnMgY2hhbm5lbG9wdGlvbnNdICBcblx0XHQiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlstYnJlYWsgKGhhbHRzIGV4ZWN1dGlvbiBvbiBleGNlcHRpb24pXVxuIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJbLXNodXRkb3duIChpc3N1ZXMgYSBjaGFubmVsLnN0b3AoKSBjb21tYW5kIGFmdGVyIHNlbmQgaXMgY29tcGxldGVkKV1cbiIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRDaGFubmVsIG9wdGlvbnM6IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxDcmVhdG9yLnVzYWdlKCkrIlxuXG4iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4YW1wbGU6XG5cdCIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YSBMb2FkVGVzdCAtcG9ydCA0MDA0XG5cdCIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YSBMb2FkVGVzdCAtYmluZCAxOTIuMTY4LjAuNDUgLXBvcnQgNDAwNVxuXHQiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmEgTG9hZFRlc3QgLWJpbmQgMTkyLjE2OC4wLjQ1IC1wb3J0IDQwMDUgLW1iaW5kIDE5Mi4xNjguMC40NSAtY291bnQgMTAwIC1zdGF0cyAxMFxuIik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIHNlbmQgPSB0cnVlOworICAgICAgICBib29sZWFuIGRlYnVnID0gZmFsc2U7CisgICAgICAgIGxvbmcgcGF1c2UgPSAwOworICAgICAgICBpbnQgY291bnQgPSAxMDAwMDAwOworICAgICAgICBpbnQgc3RhdHMgPSAxMDAwMDsKKyAgICAgICAgYm9vbGVhbiBicmVha09uRXggPSBmYWxzZTsKKyAgICAgICAgaW50IHRocmVhZHMgPSAxOworICAgICAgICBib29sZWFuIHNodXRkb3duID0gZmFsc2U7CisgICAgICAgIGludCBzdGFydG9wdGlvbnMgPSBDaGFubmVsLkRFRkFVTFQ7CisgICAgICAgIGludCBjaGFubmVsT3B0aW9ucyA9IENoYW5uZWwuU0VORF9PUFRJT05TX0RFRkFVTFQ7CisgICAgICAgIGlmICggYXJncy5sZW5ndGggPT0gMCApIHsKKyAgICAgICAgICAgIGFyZ3MgPSBuZXcgU3RyaW5nW10geyItaGVscCJ9OworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCItdGhyZWFkcyIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgdGhyZWFkcyA9IEludGVnZXIucGFyc2VJbnQoYXJnc1srK2ldKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1jb3VudCIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgY291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZW5kaW5nICIrY291bnQrIiBtZXNzYWdlcy4iKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1wYXVzZSIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgcGF1c2UgPSBMb25nLnBhcnNlTG9uZyhhcmdzWysraV0pKjEwMDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCItYnJlYWsiLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgIGJyZWFrT25FeCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCItc2h1dGRvd24iLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgIHNodXRkb3duID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1zdGF0cyIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgc3RhdHMgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGF0cyBldmVyeSAiK3N0YXRzKyIgbWVzc2FnZSIpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiLXNlbmRvcHRpb25zIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsT3B0aW9ucyA9IEludGVnZXIucGFyc2VJbnQoYXJnc1srK2ldKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNldHRpbmcgc2VuZCBvcHRpb25zIHRvICIrY2hhbm5lbE9wdGlvbnMpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiLXN0YXJ0b3B0aW9ucyIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgc3RhcnRvcHRpb25zID0gSW50ZWdlci5wYXJzZUludChhcmdzWysraV0pOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2V0dGluZyBzdGFydCBvcHRpb25zIHRvICIrc3RhcnRvcHRpb25zKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1zaXplIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICBzaXplID0gSW50ZWdlci5wYXJzZUludChhcmdzWysraV0pLTQ7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNZXNzYWdlIHNpemUgd2lsbCBiZToiKyhzaXplKzQpKyIgYnl0ZXMiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1tb2RlIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoICJyZWNlaXZlIi5lcXVhbHMoYXJnc1srK2ldKSApIHNlbmQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1kZWJ1ZyIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgZGVidWcgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICgiLWhlbHAiLmVxdWFscyhhcmdzW2ldKSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgTWFuYWdlZENoYW5uZWwgY2hhbm5lbCA9IChNYW5hZ2VkQ2hhbm5lbClDaGFubmVsQ3JlYXRvci5jcmVhdGVDaGFubmVsKGFyZ3MpOworICAgICAgICAKKyAgICAgICAgTG9hZFRlc3QgdGVzdCA9IG5ldyBMb2FkVGVzdChjaGFubmVsLHNlbmQsY291bnQsZGVidWcscGF1c2Usc3RhdHMsYnJlYWtPbkV4KTsKKyAgICAgICAgdGVzdC5jaGFubmVsT3B0aW9ucyA9IGNoYW5uZWxPcHRpb25zOworICAgICAgICBMb2FkTWVzc2FnZSBtc2cgPSBuZXcgTG9hZE1lc3NhZ2UoKTsKKyAgICAgICAgCisgICAgICAgIG1lc3NhZ2VTaXplID0gTG9hZE1lc3NhZ2UuZ2V0TWVzc2FnZVNpemUobXNnKTsKKyAgICAgICAgY2hhbm5lbC5hZGRDaGFubmVsTGlzdGVuZXIodGVzdCk7CisgICAgICAgIGNoYW5uZWwuYWRkTWVtYmVyc2hpcExpc3RlbmVyKHRlc3QpOworICAgICAgICBjaGFubmVsLnN0YXJ0KHN0YXJ0b3B0aW9ucyk7CisgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgU2h1dGRvd24oY2hhbm5lbCkpOworICAgICAgICB3aGlsZSAoIHRocmVhZHMgPiAxICkgeworICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKHRlc3QpOworICAgICAgICAgICAgdC5zZXREYWVtb24odHJ1ZSk7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0aHJlYWRzLS07CisgICAgICAgICAgICB0ZXN0ID0gbmV3IExvYWRUZXN0KGNoYW5uZWwsc2VuZCxjb3VudCxkZWJ1ZyxwYXVzZSxzdGF0cyxicmVha09uRXgpOworICAgICAgICAgICAgdGVzdC5jaGFubmVsT3B0aW9ucyA9IGNoYW5uZWxPcHRpb25zOworICAgICAgICB9CisgICAgICAgIHRlc3QucnVuKCk7CisgICAgICAgIGlmICggc2h1dGRvd24gJiYgc2VuZCApIGNoYW5uZWwuc3RvcChjaGFubmVsLkRFRkFVTFQpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN5c3RlbSB0ZXN0IGNvbXBsZXRlLCBzbGVlcGluZyB0byBsZXQgdGhyZWFkcyBmaW5pc2guIik7CisgICAgICAgIFRocmVhZC5zbGVlcCg2MCoxMDAwKjYwKTsKKyAgICB9IAorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2h1dGRvd24gZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBNYW5hZ2VkQ2hhbm5lbCBjaGFubmVsID0gbnVsbDsKKyAgICAgICAgcHVibGljIFNodXRkb3duKE1hbmFnZWRDaGFubmVsIGNoYW5uZWwpIHsKKyAgICAgICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2h1dHRpbmcgZG93bi4uLiIpOworICAgICAgICAgICAgU3lzdGVtRXhpdCBleGl0ID0gbmV3IFN5c3RlbUV4aXQoNTAwMCk7CisgICAgICAgICAgICBleGl0LnNldERhZW1vbih0cnVlKTsKKyAgICAgICAgICAgIGV4aXQuc3RhcnQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbC5zdG9wKGNoYW5uZWwuREVGQVVMVCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9Y2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDaGFubmVsIHN0b3BwZWQuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTeXN0ZW1FeGl0IGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgcHJpdmF0ZSBsb25nIGRlbGF5OworICAgICAgICBwdWJsaWMgU3lzdGVtRXhpdChsb25nIGRlbGF5KSB7CisgICAgICAgICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgcnVuICgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKGRlbGF5KTsKKyAgICAgICAgICAgIH1jYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKworICAgICAgICB9CisgICAgfQorICAgIAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy9kZW1vcy9NYXBEZW1vLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZGVtb3MvTWFwRGVtby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2N2U5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvZGVtb3MvTWFwRGVtby5qYXZhCkBAIC0wLDAgKzEsNDE1IEBACitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmRlbW9zOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudE9yaWVudGF0aW9uOworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUFkYXB0ZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VFdmVudDsKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlvdXQ7CitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7CitpbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOworaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOworaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLkFic3RyYWN0VGFibGVNb2RlbDsKK2ltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZU1vZGVsOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWFuYWdlZENoYW5uZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcnNoaXBMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50aXBpcy5BYnN0cmFjdFJlcGxpY2F0ZWRNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudGlwaXMuTGF6eVJlcGxpY2F0ZWRNYXA7CitpbXBvcnQgamF2YXguc3dpbmcudGFibGUuRGVmYXVsdFRhYmxlQ2VsbFJlbmRlcmVyOworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKK2ltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZUNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy51dGlsLlVVSURHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbC5BcnJheXM7CisKKy8qKgorICogPHA+VGl0bGU6IDwvcD4KKyAqCisgKiA8cD5EZXNjcmlwdGlvbjogPC9wPgorICoKKyAqIDxwPkNvcHlyaWdodDogQ29weXJpZ2h0IChjKSAyMDA1PC9wPgorICoKKyAqIDxwPkNvbXBhbnk6IDwvcD4KKyAqCisgKiBAYXV0aG9yIG5vdCBhdHRyaWJ1dGFibGUKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgTWFwRGVtbyBpbXBsZW1lbnRzIENoYW5uZWxMaXN0ZW5lciwgTWVtYmVyc2hpcExpc3RlbmVyeworICAgIAorICAgIHByb3RlY3RlZCBMYXp5UmVwbGljYXRlZE1hcCBtYXA7CisgICAgcHJvdGVjdGVkIFNpbXBsZVRhYmxlRGVtbyB0YWJsZTsKKyAgICAKKyAgICBwdWJsaWMgTWFwRGVtbyhDaGFubmVsIGNoYW5uZWwsIFN0cmluZyBtYXBOYW1lICkgeworICAgICAgICBtYXAgPSBuZXcgTGF6eVJlcGxpY2F0ZWRNYXAobnVsbCxjaGFubmVsLDUwMDAsIG1hcE5hbWUsbnVsbCk7CisgICAgICAgIHRhYmxlID0gU2ltcGxlVGFibGVEZW1vLmNyZWF0ZUFuZFNob3dHVUkobWFwLGNoYW5uZWwuZ2V0TG9jYWxNZW1iZXIoZmFsc2UpLmdldE5hbWUoKSk7CisgICAgICAgIGNoYW5uZWwuYWRkQ2hhbm5lbExpc3RlbmVyKHRoaXMpOworICAgICAgICBjaGFubmVsLmFkZE1lbWJlcnNoaXBMaXN0ZW5lcih0aGlzKTsKKy8vICAgICAgICBmb3IgKCBpbnQgaT0wOyBpPDEwMDA7IGkrKyApIHsKKy8vICAgICAgICAgICAgbWFwLnB1dCgiTXlLZXktIitpLCJNeSBTdHJpbmcgVmFsdWUtIitpKTsKKy8vICAgICAgICB9CisgICAgICAgIHRoaXMubWVzc2FnZVJlY2VpdmVkKG51bGwsbnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChTZXJpYWxpemFibGUgbXNnLCBNZW1iZXIgc291cmNlKSB7CisgICAgICAgIHRhYmxlLmRhdGFNb2RlbC5nZXRWYWx1ZUF0KC0xLC0xKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoU2VyaWFsaXphYmxlIG1zZywgTWVtYmVyIHNvdXJjZSkgeworICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgbWVtYmVyQWRkZWQoTWVtYmVyIG1lbWJlcikgeworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJEaXNhcHBlYXJlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIHRhYmxlLmRhdGFNb2RlbC5nZXRWYWx1ZUF0KC0xLC0xKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVzYWdlKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRyaWJlcyBNYXBEZW1vLiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOlxuXHQiICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YSBNYXBEZW1vIFtjaGFubmVsIG9wdGlvbnNdIG1hcE5hbWVcblx0IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRDaGFubmVsIG9wdGlvbnM6IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsQ3JlYXRvci51c2FnZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBNYW5hZ2VkQ2hhbm5lbCBjaGFubmVsID0gKE1hbmFnZWRDaGFubmVsKSBDaGFubmVsQ3JlYXRvci5jcmVhdGVDaGFubmVsKGFyZ3MpOworICAgICAgICBTdHJpbmcgbWFwTmFtZSA9ICJNYXBEZW1vIjsKKyAgICAgICAgaWYgKCBhcmdzLmxlbmd0aCA+IDAgJiYgKCFhcmdzW2FyZ3MubGVuZ3RoLTFdLnN0YXJ0c1dpdGgoIi0iKSkpIHsKKyAgICAgICAgICAgIG1hcE5hbWUgPSBhcmdzW2FyZ3MubGVuZ3RoLTFdOworICAgICAgICB9CisgICAgICAgIGNoYW5uZWwuc3RhcnQoY2hhbm5lbC5ERUZBVUxUKTsKKyAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBTaHV0ZG93bihjaGFubmVsKSk7CisgICAgICAgIE1hcERlbW8gZGVtbyA9IG5ldyBNYXBEZW1vKGNoYW5uZWwsbWFwTmFtZSk7CisgICAgICAgIAorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN5c3RlbSB0ZXN0IGNvbXBsZXRlLCB0aW1lIHRvIHN0YXJ0PSIrKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0KSsiIG1zLiBTbGVlcGluZyB0byBsZXQgdGhyZWFkcyBmaW5pc2guIik7CisgICAgICAgIFRocmVhZC5zbGVlcCg2MCAqIDEwMDAgKiA2MCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaHV0ZG93bgorICAgICAgICBleHRlbmRzIFRocmVhZCB7CisgICAgICAgIE1hbmFnZWRDaGFubmVsIGNoYW5uZWwgPSBudWxsOworICAgICAgICBwdWJsaWMgU2h1dGRvd24oTWFuYWdlZENoYW5uZWwgY2hhbm5lbCkgeworICAgICAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2h1dHRpbmcgZG93bi4uLiIpOworICAgICAgICAgICAgU3lzdGVtRXhpdCBleGl0ID0gbmV3IFN5c3RlbUV4aXQoNTAwMCk7CisgICAgICAgICAgICBleGl0LnNldERhZW1vbih0cnVlKTsKKyAgICAgICAgICAgIGV4aXQuc3RhcnQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbC5zdG9wKGNoYW5uZWwuREVGQVVMVCk7CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgeC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2hhbm5lbCBzdG9wcGVkLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTeXN0ZW1FeGl0CisgICAgICAgIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgcHJpdmF0ZSBsb25nIGRlbGF5OworICAgICAgICBwdWJsaWMgU3lzdGVtRXhpdChsb25nIGRlbGF5KSB7CisgICAgICAgICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChkZWxheSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW1wbGVUYWJsZURlbW8KKyAgICAgICAgZXh0ZW5kcyBKUGFuZWwgaW1wbGVtZW50cyBBY3Rpb25MaXN0ZW5lcnsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFdJRFRIID0gNTUwOworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBMYXp5UmVwbGljYXRlZE1hcCBtYXA7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworICAgICAgICBBYnN0cmFjdFRhYmxlTW9kZWwgZGF0YU1vZGVsID0gbmV3IEFic3RyYWN0VGFibGVNb2RlbCgpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmdbXSBjb2x1bW5OYW1lcyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWNrdXAgTm9kZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpc1ByaW1hcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNQcm94eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpc0JhY2t1cCJ9OworCisgICAgICAgICAgICBwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkgeyByZXR1cm4gY29sdW1uTmFtZXMubGVuZ3RoOyB9CisgICAgCisgICAgICAgICAgICBwdWJsaWMgaW50IGdldFJvd0NvdW50KCkge3JldHVybiBtYXAuc2l6ZUZ1bGwoKSArMTsgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGdldE1lbWJlck5hbWVzKE1lbWJlcltdIG1lbWJlcnMpeworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgaWYgKCBtZW1iZXJzIT1udWxsICkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7aTxtZW1iZXJzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChtZW1iZXJzW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCI7ICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgcm93LCBpbnQgY29sKSB7CisgICAgICAgICAgICAgICAgaWYgKCByb3c9PS0xICkgeworICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIHJvdyA9PSAwICkgcmV0dXJuIGNvbHVtbk5hbWVzW2NvbF07CisgICAgICAgICAgICAgICAgT2JqZWN0W10gZW50cmllcyA9IG1hcC5lbnRyeVNldEZ1bGwoKS50b0FycmF5KCk7CisgICAgICAgICAgICAgICAgTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KWVudHJpZXMgW3Jvdy0xXTsKKyAgICAgICAgICAgICAgICBMYXp5UmVwbGljYXRlZE1hcC5NYXBFbnRyeSBlbnRyeSA9IChMYXp5UmVwbGljYXRlZE1hcC5NYXBFbnRyeSllLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIGdldE1lbWJlck5hbWVzKGVudHJ5LmdldEJhY2t1cE5vZGVzKCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgQm9vbGVhbihlbnRyeS5pc1ByaW1hcnkoKSk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIG5ldyBCb29sZWFuKGVudHJ5LmlzUHJveHkoKSk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIG5ldyBCb29sZWFuKGVudHJ5LmlzQmFja3VwKCkpOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gIiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisgICAgICAgICAgICAgICAgZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgCisgICAgICAgIEpUZXh0RmllbGQgdHh0QWRkS2V5ID0gbmV3IEpUZXh0RmllbGQoMjApOworICAgICAgICBKVGV4dEZpZWxkIHR4dEFkZFZhbHVlID0gbmV3IEpUZXh0RmllbGQoMjApOworICAgICAgICBKVGV4dEZpZWxkIHR4dFJlbW92ZUtleSA9IG5ldyBKVGV4dEZpZWxkKDIwKTsKKyAgICAgICAgSlRleHRGaWVsZCB0eHRDaGFuZ2VLZXkgPSBuZXcgSlRleHRGaWVsZCgyMCk7CisgICAgICAgIEpUZXh0RmllbGQgdHh0Q2hhbmdlVmFsdWUgPSBuZXcgSlRleHRGaWVsZCgyMCk7CisgICAgICAgIAorICAgICAgICBKVGFibGUgdGFibGUgPSBudWxsOworICAgICAgICBwdWJsaWMgU2ltcGxlVGFibGVEZW1vKExhenlSZXBsaWNhdGVkTWFwIG1hcCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMubWFwID0gbWFwOworICAgICAgICAgICAgCisgICAgICAgICAgICB0aGlzLnNldENvbXBvbmVudE9yaWVudGF0aW9uKENvbXBvbmVudE9yaWVudGF0aW9uLkxFRlRfVE9fUklHSFQpOworCisgICAgICAgICAgICAvL2ZpbmFsIEpUYWJsZSB0YWJsZSA9IG5ldyBKVGFibGUoZGF0YSwgY29sdW1uTmFtZXMpOworICAgICAgICAgICAgdGFibGUgPSBuZXcgSlRhYmxlKGRhdGFNb2RlbCk7CisKKyAgICAgICAgICAgIHRhYmxlLnNldFByZWZlcnJlZFNjcm9sbGFibGVWaWV3cG9ydFNpemUobmV3IERpbWVuc2lvbihXSURUSCwgMTUwKSk7CisgICAgICAgICAgICBmb3IgKCBpbnQgaT0wOyBpPHRhYmxlLmdldENvbHVtbkNvdW50KCk7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBUYWJsZUNvbHVtbiB0bSA9IHRhYmxlLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKGkpOworICAgICAgICAgICAgICAgIHRtLnNldENlbGxSZW5kZXJlcihuZXcgQ29sb3JSZW5kZXJlcigpKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICB0YWJsZS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2tlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RGVidWdEYXRhKHRhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvL3NldExheW91dChuZXcgR3JpZExheW91dCg1LCAwKSk7CisgICAgICAgICAgICBzZXRMYXlvdXQobmV3IEJveExheW91dCh0aGlzLCBCb3hMYXlvdXQuWV9BWElTKSk7CisKKyAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSBzY3JvbGwgcGFuZSBhbmQgYWRkIHRoZSB0YWJsZSB0byBpdC4KKyAgICAgICAgICAgIEpTY3JvbGxQYW5lIHNjcm9sbFBhbmUgPSBuZXcgSlNjcm9sbFBhbmUodGFibGUpOworCisgICAgICAgICAgICAvL0FkZCB0aGUgc2Nyb2xsIHBhbmUgdG8gdGhpcyBwYW5lbC4KKyAgICAgICAgICAgIGFkZChzY3JvbGxQYW5lKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9jcmVhdGUgYSBhZGQgdmFsdWUgYnV0dG9uCisgICAgICAgICAgICBKUGFuZWwgYWRkcGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgICAgICAgICBhZGRwYW5lbC5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oV0lEVEgsMzApKTsKKyAgICAgICAgICAgIGFkZHBhbmVsLmFkZChjcmVhdGVCdXR0b24oIkFkZCIsImFkZCIpKTsKKyAgICAgICAgICAgIGFkZHBhbmVsLmFkZCh0eHRBZGRLZXkpOworICAgICAgICAgICAgYWRkcGFuZWwuYWRkKHR4dEFkZFZhbHVlKTsKKyAgICAgICAgICAgIGFkZHBhbmVsLnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oV0lEVEgsMzApKTsKKyAgICAgICAgICAgIGFkZChhZGRwYW5lbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vY3JlYXRlIGEgcmVtb3ZlIHZhbHVlIGJ1dHRvbgorICAgICAgICAgICAgSlBhbmVsIHJlbW92ZXBhbmVsID0gbmV3IEpQYW5lbCggKTsKKyAgICAgICAgICAgIHJlbW92ZXBhbmVsLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihXSURUSCwzMCkpOworICAgICAgICAgICAgcmVtb3ZlcGFuZWwuYWRkKGNyZWF0ZUJ1dHRvbigiUmVtb3ZlIiwicmVtb3ZlIikpOworICAgICAgICAgICAgcmVtb3ZlcGFuZWwuYWRkKHR4dFJlbW92ZUtleSk7CisgICAgICAgICAgICByZW1vdmVwYW5lbC5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKFdJRFRILDMwKSk7CisgICAgICAgICAgICBhZGQocmVtb3ZlcGFuZWwpOworCisgICAgICAgICAgICAvL2NyZWF0ZSBhIGNoYW5nZSB2YWx1ZSBidXR0b24KKyAgICAgICAgICAgIEpQYW5lbCBjaGFuZ2VwYW5lbCA9IG5ldyBKUGFuZWwoICk7CisgICAgICAgICAgICBjaGFuZ2VwYW5lbC5hZGQoY3JlYXRlQnV0dG9uKCJDaGFuZ2UiLCJjaGFuZ2UiKSk7CisgICAgICAgICAgICBjaGFuZ2VwYW5lbC5hZGQodHh0Q2hhbmdlS2V5KTsKKyAgICAgICAgICAgIGNoYW5nZXBhbmVsLmFkZCh0eHRDaGFuZ2VWYWx1ZSk7CisgICAgICAgICAgICBjaGFuZ2VwYW5lbC5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oV0lEVEgsMzApKTsKKyAgICAgICAgICAgIGNoYW5nZXBhbmVsLnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oV0lEVEgsMzApKTsKKyAgICAgICAgICAgIGFkZChjaGFuZ2VwYW5lbCk7CisKKworICAgICAgICAgICAgLy9jcmVhdGUgc3luYyBidXR0b24KKyAgICAgICAgICAgIEpQYW5lbCBzeW5jcGFuZWwgPSBuZXcgSlBhbmVsKCApOworICAgICAgICAgICAgc3luY3BhbmVsLmFkZChjcmVhdGVCdXR0b24oIlN5bmNocm9uaXplIiwic3luYyIpKTsKKyAgICAgICAgICAgIHN5bmNwYW5lbC5hZGQoY3JlYXRlQnV0dG9uKCJSZXBsaWNhdGUiLCJyZXBsaWNhdGUiKSk7CisgICAgICAgICAgICBzeW5jcGFuZWwuYWRkKGNyZWF0ZUJ1dHRvbigiUmFuZG9tIiwicmFuZG9tIikpOworICAgICAgICAgICAgc3luY3BhbmVsLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihXSURUSCwzMCkpOworICAgICAgICAgICAgc3luY3BhbmVsLnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oV0lEVEgsMzApKTsKKyAgICAgICAgICAgIGFkZChzeW5jcGFuZWwpOworCisKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIEpCdXR0b24gY3JlYXRlQnV0dG9uKFN0cmluZyB0ZXh0LCBTdHJpbmcgY29tbWFuZCkgeworICAgICAgICAgICAgSkJ1dHRvbiBidXR0b24gPSBuZXcgSkJ1dHRvbih0ZXh0KTsKKyAgICAgICAgICAgIGJ1dHRvbi5zZXRBY3Rpb25Db21tYW5kKGNvbW1hbmQpOworICAgICAgICAgICAgYnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIGJ1dHRvbjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlLmdldEFjdGlvbkNvbW1hbmQoKSk7CisgICAgICAgICAgICBpZiAoICJhZGQiLmVxdWFscyhlLmdldEFjdGlvbkNvbW1hbmQoKSkgKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGQga2V5OiIrdHh0QWRkS2V5LmdldFRleHQoKSsiIHZhbHVlOiIrdHh0QWRkVmFsdWUuZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KHR4dEFkZEtleS5nZXRUZXh0KCksbmV3IFN0cmluZ0J1ZmZlcih0eHRBZGRWYWx1ZS5nZXRUZXh0KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggImNoYW5nZSIuZXF1YWxzKGUuZ2V0QWN0aW9uQ29tbWFuZCgpKSApIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNoYW5nZSBrZXk6Iit0eHRDaGFuZ2VLZXkuZ2V0VGV4dCgpKyIgdmFsdWU6Iit0eHRDaGFuZ2VWYWx1ZS5nZXRUZXh0KCkpOworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSAoU3RyaW5nQnVmZmVyKW1hcC5nZXQodHh0Q2hhbmdlS2V5LmdldFRleHQoKSk7CisgICAgICAgICAgICAgICAgaWYgKCBidWYhPW51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5kZWxldGUoMCxidWYubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKHR4dENoYW5nZVZhbHVlLmdldFRleHQoKSk7CisgICAgICAgICAgICAgICAgICAgIG1hcC5yZXBsaWNhdGUodHh0Q2hhbmdlS2V5LmdldFRleHQoKSx0cnVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQodHh0Q2hhbmdlVmFsdWUuZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbWFwLnB1dCh0eHRDaGFuZ2VLZXkuZ2V0VGV4dCgpLGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCAicmVtb3ZlIi5lcXVhbHMoZS5nZXRBY3Rpb25Db21tYW5kKCkpICkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVtb3ZlIGtleToiK3R4dFJlbW92ZUtleS5nZXRUZXh0KCkpOworICAgICAgICAgICAgICAgIG1hcC5yZW1vdmUodHh0UmVtb3ZlS2V5LmdldFRleHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoICJzeW5jIi5lcXVhbHMoZS5nZXRBY3Rpb25Db21tYW5kKCkpICkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3luY2luZyBmcm9tIGFub3RoZXIgbm9kZS4iKTsKKyAgICAgICAgICAgICAgICBtYXAudHJhbnNmZXJTdGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCAicmFuZG9tIi5lcXVhbHMoZS5nZXRBY3Rpb25Db21tYW5kKCkpICkgeworICAgICAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBBcnJheXMudG9TdHJpbmcoVVVJREdlbmVyYXRvci5yYW5kb21VVUlEKGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChrZXksIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU1vZGVsLmZpcmVUYWJsZURhdGFDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUucGFpbnQodGFibGUuZ2V0R3JhcGhpY3MoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdGVkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICggInJlcGxpY2F0ZSIuZXF1YWxzKGUuZ2V0QWN0aW9uQ29tbWFuZCgpKSApIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlcGxpY2F0aW5nIG91dCB0byB0aGUgb3RoZXIgbm9kZXMuIik7CisgICAgICAgICAgICAgICAgbWFwLnJlcGxpY2F0ZSh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGFNb2RlbC5nZXRWYWx1ZUF0KC0xLC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwcmludERlYnVnRGF0YShKVGFibGUgdGFibGUpIHsKKyAgICAgICAgICAgIGludCBudW1Sb3dzID0gdGFibGUuZ2V0Um93Q291bnQoKTsKKyAgICAgICAgICAgIGludCBudW1Db2xzID0gdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsKKyAgICAgICAgICAgIGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlTW9kZWwgbW9kZWwgPSB0YWJsZS5nZXRNb2RlbCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlZhbHVlIG9mIGRhdGE6ICIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Sb3dzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgICAgcm93ICIgKyBpICsgIjoiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bUNvbHM7IGorKykgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgICIgKyBtb2RlbC5nZXRWYWx1ZUF0KGksIGopKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIHRoZSBHVUkgYW5kIHNob3cgaXQuICBGb3IgdGhyZWFkIHNhZmV0eSwKKyAgICAgICAgICogdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGludm9rZWQgZnJvbSB0aGUKKyAgICAgICAgICogZXZlbnQtZGlzcGF0Y2hpbmcgdGhyZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBTaW1wbGVUYWJsZURlbW8gY3JlYXRlQW5kU2hvd0dVSShMYXp5UmVwbGljYXRlZE1hcCBtYXAsIFN0cmluZyB0aXRsZSkgeworICAgICAgICAgICAgLy9NYWtlIHN1cmUgd2UgaGF2ZSBuaWNlIHdpbmRvdyBkZWNvcmF0aW9ucy4KKyAgICAgICAgICAgIEpGcmFtZS5zZXREZWZhdWx0TG9va0FuZEZlZWxEZWNvcmF0ZWQodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vQ3JlYXRlIGFuZCBzZXQgdXAgdGhlIHdpbmRvdy4KKyAgICAgICAgICAgIEpGcmFtZSBmcmFtZSA9IG5ldyBKRnJhbWUoIlNpbXBsZVRhYmxlRGVtbyAtICIrdGl0bGUpOworICAgICAgICAgICAgZnJhbWUuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEpGcmFtZS5FWElUX09OX0NMT1NFKTsKKworICAgICAgICAgICAgLy9DcmVhdGUgYW5kIHNldCB1cCB0aGUgY29udGVudCBwYW5lLgorICAgICAgICAgICAgU2ltcGxlVGFibGVEZW1vIG5ld0NvbnRlbnRQYW5lID0gbmV3IFNpbXBsZVRhYmxlRGVtbyhtYXApOworICAgICAgICAgICAgbmV3Q29udGVudFBhbmUuc2V0T3BhcXVlKHRydWUpOyAvL2NvbnRlbnQgcGFuZXMgbXVzdCBiZSBvcGFxdWUKKyAgICAgICAgICAgIGZyYW1lLnNldENvbnRlbnRQYW5lKG5ld0NvbnRlbnRQYW5lKTsKKworICAgICAgICAgICAgLy9EaXNwbGF5IHRoZSB3aW5kb3cuCisgICAgICAgICAgICBmcmFtZS5zZXRTaXplKDQ1MCwyNTApOworICAgICAgICAgICAgbmV3Q29udGVudFBhbmUuc2V0U2l6ZSg0NTAsMzAwKTsKKyAgICAgICAgICAgIGZyYW1lLnBhY2soKTsKKyAgICAgICAgICAgIGZyYW1lLnNldFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3Q29udGVudFBhbmU7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgc3RhdGljIGNsYXNzIENvbG9yUmVuZGVyZXIgZXh0ZW5kcyBEZWZhdWx0VGFibGVDZWxsUmVuZGVyZXIgeworICAgICAgICAKKyAgICAgICAgcHVibGljIENvbG9yUmVuZGVyZXIoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbXBvbmVudCBnZXRUYWJsZUNlbGxSZW5kZXJlckNvbXBvbmVudAorICAgICAgICAgICAgKEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIGlzU2VsZWN0ZWQsCisgICAgICAgICAgICAgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgeworICAgICAgICAgICAgQ29tcG9uZW50IGNlbGwgPSBzdXBlci5nZXRUYWJsZUNlbGxSZW5kZXJlckNvbXBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGFibGUsIHZhbHVlLCBpc1NlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pOworICAgICAgICAgICAgY2VsbC5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKKyAgICAgICAgICAgIGlmICggcm93ID4gMCApIHsKKyAgICAgICAgICAgICAgICBDb2xvciBjb2xvciA9IG51bGw7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBwcmltYXJ5ID0gKCAoQm9vbGVhbikgdGFibGUuZ2V0VmFsdWVBdChyb3csIDMpKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIHByb3h5ID0gKCAoQm9vbGVhbikgdGFibGUuZ2V0VmFsdWVBdChyb3csIDQpKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGJhY2t1cCA9ICggKEJvb2xlYW4pIHRhYmxlLmdldFZhbHVlQXQocm93LCA1KSkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHByaW1hcnkpIGNvbG9yID0gQ29sb3IuR1JFRU47CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJveHkpIGNvbG9yID0gQ29sb3IuUkVEOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJhY2t1cCkgY29sb3IgPSBDb2xvci5CTFVFOworICAgICAgICAgICAgICAgIGlmICggY29sb3IgIT0gbnVsbCApIGNlbGwuc2V0QmFja2dyb3VuZChjb2xvcik7CisgICAgICAgICAgICB9CisvLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUm93OiIrcm93KyIgQ29sdW1uOiIrY29sdW1uKyIgQ29sb3I6IitjZWxsLmdldEJhY2tncm91bmQoKSk7CisvLyAgICAgICAgICAgIGNlbGwuc2V0QmFja2dyb3VuZChia2duZENvbG9yKTsKKy8vICAgICAgICAgICAgY2VsbC5zZXRGb3JlZ3JvdW5kKGZnbmRDb2xvcik7CisKKyAgICAgICAgICAgIHJldHVybiBjZWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvVGVzdE5pb1NlbmRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvVGVzdE5pb1NlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDBlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9UZXN0TmlvU2VuZGVyLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQubmlvLk5pb1NlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5tZW1iZXJzaGlwLk1lbWJlckltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uQ2hhbm5lbERhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uWEJ5dGVCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWw7CisKKy8qKgorICogPHA+VGl0bGU6IDwvcD4KKyAqCisgKiA8cD5EZXNjcmlwdGlvbjogPC9wPgorICoKKyAqIDxwPkNvcHlyaWdodDogQ29weXJpZ2h0IChjKSAyMDA1PC9wPgorICoKKyAqIDxwPkNvbXBhbnk6IDwvcD4KKyAqCisgKiBAYXV0aG9yIG5vdCBhdHRyaWJ1dGFibGUKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgVGVzdE5pb1NlbmRlciB7CisgICAgcHJpdmF0ZSBTZWxlY3RvciBzZWxlY3RvciA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisgICAgTWVtYmVySW1wbCBtYnI7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHRlc3RPcHRpb25zID0gQ2hhbm5lbC5TRU5EX09QVElPTlNfREVGQVVMVDsKKyAgICBwdWJsaWMgVGVzdE5pb1NlbmRlcigpICB7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBpbmMoKSB7CisgICAgICAgIHJldHVybiArK2NvdW50ZXI7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ2hhbm5lbERhdGEgZ2V0TWVzc2FnZShNZW1iZXIgbWJyKSB7CisgICAgICAgIFN0cmluZyBtc2cgPSBuZXcgU3RyaW5nKCJUaHJlYWQtIitUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSsiIE1lc3NhZ2U6IitpbmMoKSk7CisgICAgICAgIENoYW5uZWxEYXRhIGRhdGEgPSBuZXcgQ2hhbm5lbERhdGEodHJ1ZSk7CisgICAgICAgIGRhdGEuc2V0TWVzc2FnZShuZXcgWEJ5dGVCdWZmZXIobXNnLmdldEJ5dGVzKCksZmFsc2UpKTsKKyAgICAgICAgZGF0YS5zZXRBZGRyZXNzKG1icik7CisgICAgICAgIAorICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNlbGVjdG9yID0gU2VsZWN0b3Iub3BlbigpOworICAgICAgICBtYnIgPSBuZXcgTWVtYmVySW1wbCgibG9jYWxob3N0Iiw0NDQ0LDApOworICAgICAgICBOaW9TZW5kZXIgc2VuZGVyID0gbmV3IE5pb1NlbmRlcigpOworICAgICAgICBzZW5kZXIuc2V0RGVzdGluYXRpb24obWJyKTsKKyAgICAgICAgc2VuZGVyLnNldERpcmVjdEJ1ZmZlcih0cnVlKTsKKyAgICAgICAgc2VuZGVyLnNldFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICAgICAgc2VuZGVyLnNldE1lc3NhZ2UoWEJ5dGVCdWZmZXIuY3JlYXRlRGF0YVBhY2thZ2UoZ2V0TWVzc2FnZShtYnIpKSk7CisgICAgICAgIHNlbmRlci5jb25uZWN0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICB3aGlsZSAodHJ1ZSkgeworCisgICAgICAgICAgICBpbnQgc2VsZWN0ZWRLZXlzID0gMDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRLZXlzID0gc2VsZWN0b3Iuc2VsZWN0KDEwMCk7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBpZiAoIHNlbGVjdGVkS2V5cyA9PSAwICkgeworICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm8gcmVnaXN0ZXJlZCBpbnRlcmVzdHMuIFNsZWVwaW5nIGZvciBhIHNlY29uZC4iKTsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNlbGVjdGVkS2V5cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gc2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTZWxlY3Rpb25LZXkgc2sgPSAoU2VsZWN0aW9uS2V5KSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlYWR5T3BzID0gc2sucmVhZHlPcHMoKTsKKyAgICAgICAgICAgICAgICAgICAgc2suaW50ZXJlc3RPcHMoc2suaW50ZXJlc3RPcHMoKSAmIH5yZWFkeU9wcyk7CisgICAgICAgICAgICAgICAgICAgIE5pb1NlbmRlciBzZW5kZXIgPSAoTmlvU2VuZGVyKSBzay5hdHRhY2htZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICggc2VuZGVyLnByb2Nlc3Moc2ssICh0ZXN0T3B0aW9ucyZDaGFubmVsLlNFTkRfT1BUSU9OU19VU0VfQUNLKT09Q2hhbm5lbC5TRU5EX09QVElPTlNfVVNFX0FDSykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1lc3NhZ2UgY29tcGxldGVkIGZvciBoYW5kbGVyOiIrc2VuZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2xlZXAoMjAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5zZXRNZXNzYWdlKFhCeXRlQnVmZmVyLmNyZWF0ZURhdGFQYWNrYWdlKGdldE1lc3NhZ2UobWJyKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUZXN0TmlvU2VuZGVyIHNlbmRlciA9IG5ldyBUZXN0TmlvU2VuZGVyKCk7CisgICAgICAgIHNlbmRlci5pbml0KCk7CisgICAgICAgIHNlbmRlci5ydW4oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9UcmliZXNUZXN0U3VpdGUuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L1RyaWJlc1Rlc3RTdWl0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODQ2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9UcmliZXNUZXN0U3VpdGUuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRlc3Q7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworcHVibGljIGNsYXNzIFRyaWJlc1Rlc3RTdWl0ZQorICAgIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIFRyaWJlc1Rlc3RTdWl0ZShTdHJpbmcgcykgeworICAgICAgICBzdXBlcihzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRlc3QuY2hhbm5lbC5DaGFubmVsU3RhcnRTdG9wLmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRlc3QuY2hhbm5lbC5UZXN0Q2hhbm5lbE9wdGlvbkZsYWcuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudGVzdC5tZW1iZXJzaGlwLk1lbWJlclNlcmlhbGl6YXRpb24uY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudGVzdC5tZW1iZXJzaGlwLlRlc3RNZW1iZXJBcnJpdmFsLmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRlc3QubWVtYmVyc2hpcC5UZXN0VGNwRmFpbHVyZURldGVjdG9yLmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRlc3QuY2hhbm5lbC5UZXN0RGF0YUludGVncml0eS5jbGFzcyk7CisgICAgICAgIHJldHVybiBzdWl0ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9jaGFubmVsL0NoYW5uZWxTdGFydFN0b3AuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L2NoYW5uZWwvQ2hhbm5lbFN0YXJ0U3RvcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MTQwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9jaGFubmVsL0NoYW5uZWxTdGFydFN0b3AuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50ZXN0LmNoYW5uZWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5Hcm91cENoYW5uZWw7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgQ2hhbm5lbFN0YXJ0U3RvcCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBHcm91cENoYW5uZWwgY2hhbm5lbCA9IG51bGw7CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgY2hhbm5lbCA9IG5ldyBHcm91cENoYW5uZWwoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICB0cnkge2NoYW5uZWwuc3RvcChjaGFubmVsLkRFRkFVTFQpO31jYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSl7fQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlRnVsbFN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGFubmVsLnN0YXJ0KGNoYW5uZWwuREVGQVVMVCk7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHgpe3gucHJpbnRTdGFja1RyYWNlKCk7fQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhbm5lbC5zdGFydChjaGFubmVsLkRFRkFVTFQpOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4KXt4LnByaW50U3RhY2tUcmFjZSgpO30KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50LDIpOworICAgICAgICBjaGFubmVsLnN0b3AoY2hhbm5lbC5ERUZBVUxUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUGFydGlhbFN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vdHJ5IHRvIGRvdWJsZSBzdGFydCB0aGUgUlggCisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGFubmVsLnN0YXJ0KGNoYW5uZWwuU05EX1JYX1NFUSk7CisgICAgICAgICAgICBjaGFubmVsLnN0YXJ0KGNoYW5uZWwuTUJSX1JYX1NFUSk7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHgpe3gucHJpbnRTdGFja1RyYWNlKCk7fQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhbm5lbC5zdGFydChjaGFubmVsLk1CUl9SWF9TRVEpOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4KXsvKmV4cGVjdGVkKi99CisgICAgICAgIGFzc2VydEVxdWFscyhjb3VudCwxKTsKKyAgICAgICAgY2hhbm5lbC5zdG9wKGNoYW5uZWwuREVGQVVMVCk7CisgICAgICAgIC8vZG91YmxlIHRoZSBtZW1iZXJzaGlwIHNlbmRlcgorICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGFubmVsLnN0YXJ0KGNoYW5uZWwuU05EX1JYX1NFUSk7CisgICAgICAgICAgICBjaGFubmVsLnN0YXJ0KGNoYW5uZWwuTUJSX1RYX1NFUSk7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHgpe3gucHJpbnRTdGFja1RyYWNlKCk7fQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhbm5lbC5zdGFydChjaGFubmVsLk1CUl9UWF9TRVEpOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4KXsvKmV4cGVjdGVkKi99CisgICAgICAgIGFzc2VydEVxdWFscyhjb3VudCwxKTsKKyAgICAgICAgY2hhbm5lbC5zdG9wKGNoYW5uZWwuREVGQVVMVCk7CisgICAgICAgIAorICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGFubmVsLnN0YXJ0KGNoYW5uZWwuU05EX1JYX1NFUSk7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHgpe3gucHJpbnRTdGFja1RyYWNlKCk7fQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhbm5lbC5zdGFydChjaGFubmVsLlNORF9SWF9TRVEpOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4KXsvKmV4cGVjdGVkKi99CisgICAgICAgIGFzc2VydEVxdWFscyhjb3VudCwxKTsKKyAgICAgICAgY2hhbm5lbC5zdG9wKGNoYW5uZWwuREVGQVVMVCk7CisKKyAgICAgICAgY291bnQgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhbm5lbC5zdGFydChjaGFubmVsLlNORF9UWF9TRVEpOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4KXt4LnByaW50U3RhY2tUcmFjZSgpO30KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoYW5uZWwuc3RhcnQoY2hhbm5lbC5TTkRfVFhfU0VRKTsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCl7LypleHBlY3RlZCovfQorICAgICAgICBhc3NlcnRFcXVhbHMoY291bnQsMSk7CisgICAgICAgIGNoYW5uZWwuc3RvcChjaGFubmVsLkRFRkFVTFQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFsc2VPcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGZsYWcgPSAweEZGRjA7Ly9zaG91bGQgZ2V0IGlnbm9yZWQgYnkgdGhlIHVuZGVybHlpbmcgY29tcG9uZW50cworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhbm5lbC5zdGFydChmbGFnKTsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCl7eC5wcmludFN0YWNrVHJhY2UoKTt9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGFubmVsLnN0YXJ0KGZsYWcpOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4KXsvKmV4cGVjdGVkKi99CisgICAgICAgIGFzc2VydEVxdWFscyhjb3VudCwyKTsKKyAgICAgICAgY2hhbm5lbC5zdG9wKGNoYW5uZWwuREVGQVVMVCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9jaGFubmVsL1Rlc3RDaGFubmVsT3B0aW9uRmxhZy5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvY2hhbm5lbC9UZXN0Q2hhbm5lbE9wdGlvbkZsYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjExOWU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvY2hhbm5lbC9UZXN0Q2hhbm5lbE9wdGlvbkZsYWcuamF2YQpAQCAtMCwwICsxLDc2IEBACitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRlc3QuY2hhbm5lbDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbEludGVyY2VwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxFeGNlcHRpb247CisKKy8qKgorICogPHA+VGl0bGU6IDwvcD4gCisgKiAKKyAqIDxwPkRlc2NyaXB0aW9uOiA8L3A+IAorICogCisgKiA8cD5Db3B5cmlnaHQ6IENvcHlyaWdodCAoYykgMjAwNTwvcD4gCisgKiAKKyAqIDxwPkNvbXBhbnk6IDwvcD4KKyAqIAorICogQGF1dGhvciBub3QgYXR0cmlidXRhYmxlCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIFRlc3RDaGFubmVsT3B0aW9uRmxhZyBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBHcm91cENoYW5uZWwgY2hhbm5lbCA9IG51bGw7CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgY2hhbm5lbCA9IG5ldyBHcm91cENoYW5uZWwoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBpZiAoIGNoYW5uZWwgIT0gbnVsbCApIHRyeSB7Y2hhbm5lbC5zdG9wKGNoYW5uZWwuREVGQVVMVCk7fWNhdGNoICggRXhjZXB0aW9uIGlnbm9yZSkge30KKyAgICAgICAgY2hhbm5lbCA9IG51bGw7CisgICAgfQorICAgIAorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RPcHRpb25Db25mbGljdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGVycm9yID0gZmFsc2U7CisgICAgICAgIGNoYW5uZWwuc2V0T3B0aW9uQ2hlY2sodHJ1ZSk7CisgICAgICAgIENoYW5uZWxJbnRlcmNlcHRvciBpID0gbmV3IFRlc3RJbnRlcmNlcHRvcigpOworICAgICAgICBpLnNldE9wdGlvbkZsYWcoMTI4KTsKKyAgICAgICAgY2hhbm5lbC5hZGRJbnRlcmNlcHRvcihpKTsKKyAgICAgICAgaSA9IG5ldyBUZXN0SW50ZXJjZXB0b3IoKTsKKyAgICAgICAgaS5zZXRPcHRpb25GbGFnKDEyOCk7CisgICAgICAgIGNoYW5uZWwuYWRkSW50ZXJjZXB0b3IoaSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGFubmVsLnN0YXJ0KGNoYW5uZWwuREVGQVVMVCk7CisgICAgICAgIH1jYXRjaCAoIENoYW5uZWxFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIGlmICggeC5nZXRNZXNzYWdlKCkuaW5kZXhPZigib3B0aW9uIGZsYWcgY29uZmxpY3QiKSA+PSAwICkgZXJyb3IgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLGVycm9yKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW9uTm9Db25mbGljdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGVycm9yID0gZmFsc2U7CisgICAgICAgIGNoYW5uZWwuc2V0T3B0aW9uQ2hlY2sodHJ1ZSk7CisgICAgICAgIENoYW5uZWxJbnRlcmNlcHRvciBpID0gbmV3IFRlc3RJbnRlcmNlcHRvcigpOworICAgICAgICBpLnNldE9wdGlvbkZsYWcoMTI4KTsKKyAgICAgICAgY2hhbm5lbC5hZGRJbnRlcmNlcHRvcihpKTsKKyAgICAgICAgaSA9IG5ldyBUZXN0SW50ZXJjZXB0b3IoKTsKKyAgICAgICAgaS5zZXRPcHRpb25GbGFnKDY0KTsKKyAgICAgICAgY2hhbm5lbC5hZGRJbnRlcmNlcHRvcihpKTsKKyAgICAgICAgaSA9IG5ldyBUZXN0SW50ZXJjZXB0b3IoKTsKKyAgICAgICAgaS5zZXRPcHRpb25GbGFnKDI1Nik7CisgICAgICAgIGNoYW5uZWwuYWRkSW50ZXJjZXB0b3IoaSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGFubmVsLnN0YXJ0KGNoYW5uZWwuREVGQVVMVCk7CisgICAgICAgIH1jYXRjaCAoIENoYW5uZWxFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIGlmICggeC5nZXRNZXNzYWdlKCkuaW5kZXhPZigib3B0aW9uIGZsYWcgY29uZmxpY3QiKSA+PSAwICkgZXJyb3IgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSxlcnJvcik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEludGVyY2VwdG9yIGV4dGVuZHMgQ2hhbm5lbEludGVyY2VwdG9yQmFzZSB7CisgICAgICAgIAorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9jaGFubmVsL1Rlc3REYXRhSW50ZWdyaXR5LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9jaGFubmVsL1Rlc3REYXRhSW50ZWdyaXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNmMjdmZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L2NoYW5uZWwvVGVzdERhdGFJbnRlZ3JpdHkuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50ZXN0LmNoYW5uZWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuR3JvdXBDaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRlc3QuY2hhbm5lbC5UZXN0RGF0YUludGVncml0eS5MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuTWVzc2FnZURpc3BhdGNoSW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzLk1lc3NhZ2VEaXNwYXRjaDE1SW50ZXJjZXB0b3I7CisKKy8qKgorICogPHA+VGl0bGU6IDwvcD4gCisgKiAKKyAqIDxwPkRlc2NyaXB0aW9uOiA8L3A+IAorICogCisgKiA8cD5Db3B5cmlnaHQ6IENvcHlyaWdodCAoYykgMjAwNTwvcD4gCisgKiAKKyAqIDxwPkNvbXBhbnk6IDwvcD4KKyAqIAorICogQGF1dGhvciBub3QgYXR0cmlidXRhYmxlCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIFRlc3REYXRhSW50ZWdyaXR5IGV4dGVuZHMgVGVzdENhc2UgeworICAgIGludCBtc2dDb3VudCA9IDEwMDA7CisgICAgaW50IHRocmVhZENvdW50ID0gMjA7CisgICAgR3JvdXBDaGFubmVsIGNoYW5uZWwxOworICAgIEdyb3VwQ2hhbm5lbCBjaGFubmVsMjsKKyAgICBMaXN0ZW5lciBsaXN0ZW5lcjE7CisgICAgaW50IHRocmVhZENvdW50ZXIgPSAwOworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIGNoYW5uZWwxID0gbmV3IEdyb3VwQ2hhbm5lbCgpOworICAgICAgICBjaGFubmVsMS5hZGRJbnRlcmNlcHRvcihuZXcgTWVzc2FnZURpc3BhdGNoMTVJbnRlcmNlcHRvcigpKTsKKyAgICAgICAgY2hhbm5lbDIgPSBuZXcgR3JvdXBDaGFubmVsKCk7CisgICAgICAgIGNoYW5uZWwyLmFkZEludGVyY2VwdG9yKG5ldyBNZXNzYWdlRGlzcGF0Y2gxNUludGVyY2VwdG9yKCkpOworICAgICAgICBsaXN0ZW5lcjEgPSBuZXcgTGlzdGVuZXIoKTsKKyAgICAgICAgY2hhbm5lbDIuYWRkQ2hhbm5lbExpc3RlbmVyKGxpc3RlbmVyMSk7CisgICAgICAgIGNoYW5uZWwxLnN0YXJ0KEdyb3VwQ2hhbm5lbC5ERUZBVUxUKTsKKyAgICAgICAgY2hhbm5lbDIuc3RhcnQoR3JvdXBDaGFubmVsLkRFRkFVTFQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgICAgIGNoYW5uZWwxLnN0b3AoR3JvdXBDaGFubmVsLkRFRkFVTFQpOworICAgICAgICBjaGFubmVsMi5zdG9wKEdyb3VwQ2hhbm5lbC5ERUZBVUxUKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdERhdGFTZW5kTk9fQUNLKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU3RhcnRpbmcgTk9fQUNLIik7CisgICAgICAgIFRocmVhZFtdIHRocmVhZHMgPSBuZXcgVGhyZWFkW3RocmVhZENvdW50XTsKKyAgICAgICAgZm9yIChpbnQgeD0wOyB4PHRocmVhZHMubGVuZ3RoOyB4KysgKSB7CisgICAgICAgICAgICB0aHJlYWRzW3hdID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ0NvdW50OyBpKyspIGNoYW5uZWwxLnNlbmQobmV3IE1lbWJlcltdIHtjaGFubmVsMi5nZXRMb2NhbE1lbWJlcihmYWxzZSl9LCBEYXRhLmNyZWF0ZVJhbmRvbURhdGEoKSwwKTsKKyAgICAgICAgICAgICAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQ291bnRlcisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCB4PTA7IHg8dGhyZWFkcy5sZW5ndGg7IHgrKyApIHsgdGhyZWFkc1t4XS5zdGFydCgpO30KKyAgICAgICAgZm9yIChpbnQgeD0wOyB4PHRocmVhZHMubGVuZ3RoOyB4KysgKSB7IHRocmVhZHNbeF0uam9pbigpO30KKyAgICAgICAgLy9zbGVlcCBmb3IgNTAgc2VjLCBsZXQgdGhlIG90aGVyIG1lc3NhZ2VzIGluCisgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgd2hpbGUgKCAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktc3RhcnQpPDE1MDAwICYmIG1zZ0NvdW50KnRocmVhZENvdW50IT1saXN0ZW5lcjEuY291bnQpIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkZpbmlzaGVkIE5PX0FDSyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNoZWNraW5nIHN1Y2Nlc3MgbWVzc2FnZXMuIixtc2dDb3VudCp0aHJlYWRDb3VudCxsaXN0ZW5lcjEuY291bnQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YVNlbmRBU1lOQ00oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU3RhcnRpbmcgQVNZTkMgTVVMVEkgVEhSRUFEIik7CisgICAgICAgICAgICBUaHJlYWRbXSB0aHJlYWRzID0gbmV3IFRocmVhZFt0aHJlYWRDb3VudF07CisgICAgICAgICAgICBmb3IgKGludCB4PTA7IHg8dGhyZWFkcy5sZW5ndGg7IHgrKyApIHsKKyAgICAgICAgICAgICAgICB0aHJlYWRzW3hdID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ0NvdW50OyBpKyspIGNoYW5uZWwxLnNlbmQobmV3IE1lbWJlcltdIHtjaGFubmVsMi5nZXRMb2NhbE1lbWJlcihmYWxzZSl9LCBEYXRhLmNyZWF0ZVJhbmRvbURhdGEoKSxHcm91cENoYW5uZWwuU0VORF9PUFRJT05TX0FTWU5DSFJPTk9VUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9Y2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQ291bnRlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IHg9MDsgeDx0aHJlYWRzLmxlbmd0aDsgeCsrICkgeyB0aHJlYWRzW3hdLnN0YXJ0KCk7fQorICAgICAgICAgICAgZm9yIChpbnQgeD0wOyB4PHRocmVhZHMubGVuZ3RoOyB4KysgKSB7IHRocmVhZHNbeF0uam9pbigpO30KKyAgICAgICAgICAgIC8vc2xlZXAgZm9yIDUwIHNlYywgbGV0IHRoZSBvdGhlciBtZXNzYWdlcyBpbgorICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgd2hpbGUgKCAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktc3RhcnQpPDE1MDAwICYmIG1zZ0NvdW50KnRocmVhZENvdW50IT1saXN0ZW5lcjEuY291bnQpIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJGaW5pc2hlZCBBU1lOQyBNVUxUSSBUSFJFQUQiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ2hlY2tpbmcgc3VjY2VzcyBtZXNzYWdlcy4iLG1zZ0NvdW50KnRocmVhZENvdW50LGxpc3RlbmVyMS5jb3VudCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhU2VuZEFTWU5DKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU3RhcnRpbmcgQVNZTkMiKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1zZ0NvdW50OyBpKyspIGNoYW5uZWwxLnNlbmQobmV3IE1lbWJlcltdIHtjaGFubmVsMi5nZXRMb2NhbE1lbWJlcihmYWxzZSl9LERhdGEuY3JlYXRlUmFuZG9tRGF0YSgpLEdyb3VwQ2hhbm5lbC5TRU5EX09QVElPTlNfQVNZTkNIUk9OT1VTKTsKKyAgICAgICAgLy9zbGVlcCBmb3IgNTAgc2VjLCBsZXQgdGhlIG90aGVyIG1lc3NhZ2VzIGluCisgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgd2hpbGUgKCAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktc3RhcnQpPDUwMDAgJiYgbXNnQ291bnQhPWxpc3RlbmVyMS5jb3VudCkgVGhyZWFkLnNsZWVwKDUwMCk7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRmluaXNoZWQgQVNZTkMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDaGVja2luZyBzdWNjZXNzIG1lc3NhZ2VzLiIsbXNnQ291bnQsbGlzdGVuZXIxLmNvdW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YVNlbmRBQ0soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTdGFydGluZyBBQ0siKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1zZ0NvdW50OyBpKyspIGNoYW5uZWwxLnNlbmQobmV3IE1lbWJlcltdIHtjaGFubmVsMi5nZXRMb2NhbE1lbWJlcihmYWxzZSl9LERhdGEuY3JlYXRlUmFuZG9tRGF0YSgpLEdyb3VwQ2hhbm5lbC5TRU5EX09QVElPTlNfVVNFX0FDSyk7CisgICAgICAgIFRocmVhZC5zbGVlcCgyNTApOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkZpbmlzaGVkIEFDSyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNoZWNraW5nIHN1Y2Nlc3MgbWVzc2FnZXMuIixtc2dDb3VudCxsaXN0ZW5lcjEuY291bnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhU2VuZFNZTkNBQ0soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTdGFydGluZyBTWU5DX0FDSyIpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bXNnQ291bnQ7IGkrKykgY2hhbm5lbDEuc2VuZChuZXcgTWVtYmVyW10ge2NoYW5uZWwyLmdldExvY2FsTWVtYmVyKGZhbHNlKX0sRGF0YS5jcmVhdGVSYW5kb21EYXRhKCksR3JvdXBDaGFubmVsLlNFTkRfT1BUSU9OU19TWU5DSFJPTklaRURfQUNLfEdyb3VwQ2hhbm5lbC5TRU5EX09QVElPTlNfVVNFX0FDSyk7CisgICAgICAgIFRocmVhZC5zbGVlcCgyNTApOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkZpbmlzaGVkIFNZTkNfQUNLIik7CisgICAgICAgIGFzc2VydEVxdWFscygiQ2hlY2tpbmcgc3VjY2VzcyBtZXNzYWdlcy4iLG1zZ0NvdW50LGxpc3RlbmVyMS5jb3VudCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5uZWxMaXN0ZW5lciB7CisgICAgICAgIGxvbmcgY291bnQgPSAwOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU2VyaWFsaXphYmxlIHMsIE1lbWJlciBtKSB7CisgICAgICAgICAgICByZXR1cm4gKHMgaW5zdGFuY2VvZiBEYXRhKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKFNlcmlhbGl6YWJsZSBzLCBNZW1iZXIgbSkgeworICAgICAgICAgICAgRGF0YSBkID0gKERhdGEpczsKKyAgICAgICAgICAgIGlmICggIURhdGEudmVyaWZ5KGQpICkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRVJST1IiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICBpZiAoKGNvdW50ICUxMDAwKSA9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU1VDQ0VTUzoiK2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEYXRhIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHVibGljIGludCBsZW5ndGg7CisgICAgICAgIHB1YmxpYyBieXRlW10gZGF0YTsKKyAgICAgICAgcHVibGljIGJ5dGUga2V5OworICAgICAgICBwdWJsaWMgc3RhdGljIFJhbmRvbSByID0gbmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgRGF0YSBjcmVhdGVSYW5kb21EYXRhKCkgeworICAgICAgICAgICAgaW50IGkgPSByLm5leHRJbnQoKTsKKyAgICAgICAgICAgIGkgPSAoIGkgJSAxMjcgKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBNYXRoLmFicyhyLm5leHRJbnQoKSAlIDY1NTU1KTsKKyAgICAgICAgICAgIERhdGEgZCA9IG5ldyBEYXRhKCk7CisgICAgICAgICAgICBkLmxlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgICAgIGQua2V5ID0gKGJ5dGUpaTsKKyAgICAgICAgICAgIGQuZGF0YSA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgICAgICBBcnJheXMuZmlsbChkLmRhdGEsZC5rZXkpOworICAgICAgICAgICAgcmV0dXJuIGQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJpZnkoRGF0YSBkKSB7CisgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IChkLmxlbmd0aCA9PSBkLmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoIGludCBpPTA7IHJlc3VsdCAmJiAoaTxkLmRhdGEubGVuZ3RoKTsgaSsrICkgcmVzdWx0ID0gcmVzdWx0ICYmIGQuZGF0YVtpXSA9PSBkLmtleTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L2NoYW5uZWwvVGVzdFJlbW90ZVByb2Nlc3NFeGNlcHRpb24uamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L2NoYW5uZWwvVGVzdFJlbW90ZVByb2Nlc3NFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTEwODViCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvY2hhbm5lbC9UZXN0UmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRlc3QuY2hhbm5lbDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbExpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5Hcm91cENoYW5uZWw7CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKKworLyoqCisgKiA8cD5UaXRsZTogPC9wPiAKKyAqIAorICogPHA+RGVzY3JpcHRpb246IDwvcD4gCisgKiAKKyAqIDxwPkNvcHlyaWdodDogQ29weXJpZ2h0IChjKSAyMDA1PC9wPiAKKyAqIAorICogPHA+Q29tcGFueTogPC9wPgorICogCisgKiBAYXV0aG9yIG5vdCBhdHRyaWJ1dGFibGUKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgVGVzdFJlbW90ZVByb2Nlc3NFeGNlcHRpb24gZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgaW50IG1zZ0NvdW50ID0gMTAwMDA7CisgICAgR3JvdXBDaGFubmVsIGNoYW5uZWwxOworICAgIEdyb3VwQ2hhbm5lbCBjaGFubmVsMjsKKyAgICBMaXN0ZW5lciBsaXN0ZW5lcjE7CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgY2hhbm5lbDEgPSBuZXcgR3JvdXBDaGFubmVsKCk7CisgICAgICAgIGNoYW5uZWwyID0gbmV3IEdyb3VwQ2hhbm5lbCgpOworICAgICAgICBsaXN0ZW5lcjEgPSBuZXcgTGlzdGVuZXIoKTsKKyAgICAgICAgY2hhbm5lbDIuYWRkQ2hhbm5lbExpc3RlbmVyKGxpc3RlbmVyMSk7CisgICAgICAgIGNoYW5uZWwxLnN0YXJ0KEdyb3VwQ2hhbm5lbC5ERUZBVUxUKTsKKyAgICAgICAgY2hhbm5lbDIuc3RhcnQoR3JvdXBDaGFubmVsLkRFRkFVTFQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgICAgIGNoYW5uZWwxLnN0b3AoR3JvdXBDaGFubmVsLkRFRkFVTFQpOworICAgICAgICBjaGFubmVsMi5zdG9wKEdyb3VwQ2hhbm5lbC5ERUZBVUxUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YVNlbmRTWU5DQUNLKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU3RhcnRpbmcgU1lOQ19BQ0siKTsKKyAgICAgICAgaW50IGVyckM9MCwgbmVyckM9MDsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1zZ0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZXJyb3IgPSBEYXRhLnIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIGNoYW5uZWwxLnNlbmQoY2hhbm5lbDEuZ2V0TWVtYmVycygpLERhdGEuY3JlYXRlUmFuZG9tRGF0YShlcnJvciksR3JvdXBDaGFubmVsLlNFTkRfT1BUSU9OU19TWU5DSFJPTklaRURfQUNLfEdyb3VwQ2hhbm5lbC5TRU5EX09QVElPTlNfVVNFX0FDSyk7CisgICAgICAgICAgICBpZiAoIGVycm9yICkgZXJyQysrOyBlbHNlIG5lcnJDKys7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJGaW5pc2hlZCBTWU5DX0FDSyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNoZWNraW5nIGZhaWx1cmUgbWVzc2FnZXMuIixlcnJDLGxpc3RlbmVyMS5lcnJDbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNoZWNraW5nIHN1Y2Nlc3MgbWVzc2FnZXMuIixuZXJyQyxsaXN0ZW5lcjEubm9FcnJDbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNoZWNraW5nIGFsbCBtZXNzYWdlcy4iLG1zZ0NvdW50LGxpc3RlbmVyMS5ub0VyckNudCtsaXN0ZW5lcjEuZXJyQ250KTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMaXN0ZW5lciAxIHN0YXRzOiIpOworICAgICAgICBsaXN0ZW5lcjEucHJpbnRTdGF0cyhTeXN0ZW0ub3V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExpc3RlbmVyIGltcGxlbWVudHMgQ2hhbm5lbExpc3RlbmVyIHsKKyAgICAgICAgbG9uZyBub0VyckNudCA9IDA7CisgICAgICAgIGxvbmcgZXJyQ250ID0gMDsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KFNlcmlhbGl6YWJsZSBzLCBNZW1iZXIgbSkgeworICAgICAgICAgICAgcmV0dXJuIChzIGluc3RhbmNlb2YgRGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoU2VyaWFsaXphYmxlIHMsIE1lbWJlciBtKSB7CisgICAgICAgICAgICBEYXRhIGQgPSAoRGF0YSlzOworICAgICAgICAgICAgaWYgKCAhRGF0YS52ZXJpZnkoZCkgKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFUlJPUiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZC5lcnJvcikgeworICAgICAgICAgICAgICAgICAgICBlcnJDbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoZXJyQ250ICUgMTAwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFN0YXRzKFN5c3RlbS5lcnIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBub0VyckNudCsrOworICAgICAgICAgICAgICAgICAgICBpZiAoIChub0VyckNudCAlIDEwMCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRTdGF0cyhTeXN0ZW0uZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByaW50U3RhdHMoUHJpbnRTdHJlYW0gc3RyZWFtKSB7CisgICAgICAgICAgICBzdHJlYW0ucHJpbnRsbigiTk9STUFMOiIgKyBub0VyckNudCk7CisgICAgICAgICAgICBzdHJlYW0ucHJpbnRsbigiRkFJTFVSRVM6IiArIGVyckNudCk7CisgICAgICAgICAgICBzdHJlYW0ucHJpbnRsbigiVE9UQUw6IiArIChlcnJDbnQrbm9FcnJDbnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGF0YSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIHB1YmxpYyBpbnQgbGVuZ3RoOworICAgICAgICBwdWJsaWMgYnl0ZVtdIGRhdGE7CisgICAgICAgIHB1YmxpYyBieXRlIGtleTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBSYW5kb20gciA9IG5ldyBSYW5kb20oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICBwdWJsaWMgc3RhdGljIERhdGEgY3JlYXRlUmFuZG9tRGF0YShib29sZWFuIGVycm9yKSB7CisgICAgICAgICAgICBpbnQgaSA9IHIubmV4dEludCgpOworICAgICAgICAgICAgaSA9ICggaSAlIDEyNyApOworICAgICAgICAgICAgaW50IGxlbmd0aCA9IE1hdGguYWJzKHIubmV4dEludCgpICUgNjU1NTUpOworICAgICAgICAgICAgRGF0YSBkID0gbmV3IERhdGEoKTsKKyAgICAgICAgICAgIGQubGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgZC5rZXkgPSAoYnl0ZSlpOworICAgICAgICAgICAgZC5kYXRhID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIEFycmF5cy5maWxsKGQuZGF0YSxkLmtleSk7CisgICAgICAgICAgICBkLmVycm9yID0gZXJyb3I7CisgICAgICAgICAgICByZXR1cm4gZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJpZnkoRGF0YSBkKSB7CisgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IChkLmxlbmd0aCA9PSBkLmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoIGludCBpPTA7IHJlc3VsdCAmJiAoaTxkLmRhdGEubGVuZ3RoKTsgaSsrICkgcmVzdWx0ID0gcmVzdWx0ICYmIGQuZGF0YVtpXSA9PSBkLmtleTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9pbnRlcmNlcHRvcnMvVGVzdE5vbkJsb2NraW5nQ29vcmRpbmF0b3IuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L2ludGVyY2VwdG9ycy9UZXN0Tm9uQmxvY2tpbmdDb29yZGluYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NDI1NzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9pbnRlcmNlcHRvcnMvVGVzdE5vbkJsb2NraW5nQ29vcmRpbmF0b3IuamF2YQpAQCAtMCwwICsxLDk1IEBACitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRlc3QuaW50ZXJjZXB0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuR3JvdXBDaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9ycy5Ob25CbG9ja2luZ0Nvb3JkaW5hdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9ycy5UY3BGYWlsdXJlRGV0ZWN0b3I7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK3B1YmxpYyBjbGFzcyBUZXN0Tm9uQmxvY2tpbmdDb29yZGluYXRvciBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIEdyb3VwQ2hhbm5lbFtdIGNoYW5uZWxzID0gbnVsbDsKKyAgICBOb25CbG9ja2luZ0Nvb3JkaW5hdG9yW10gY29vcmRpbmF0b3JzID0gbnVsbDsKKyAgICBpbnQgY2hhbm5lbENvdW50ID0gMTA7CisgICAgVGhyZWFkW10gdGhyZWFkcyA9IG51bGw7CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXR1cCIpOworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBjaGFubmVscyA9IG5ldyBHcm91cENoYW5uZWxbY2hhbm5lbENvdW50XTsKKyAgICAgICAgY29vcmRpbmF0b3JzID0gbmV3IE5vbkJsb2NraW5nQ29vcmRpbmF0b3JbY2hhbm5lbENvdW50XTsKKyAgICAgICAgdGhyZWFkcyA9IG5ldyBUaHJlYWRbY2hhbm5lbENvdW50XTsKKyAgICAgICAgZm9yICggaW50IGk9MDsgaTxjaGFubmVsQ291bnQ7IGkrKyApIHsKKyAgICAgICAgICAgIGNoYW5uZWxzW2ldID0gbmV3IEdyb3VwQ2hhbm5lbCgpOworICAgICAgICAgICAgY29vcmRpbmF0b3JzW2ldID0gbmV3IE5vbkJsb2NraW5nQ29vcmRpbmF0b3IoKTsKKyAgICAgICAgICAgIGNoYW5uZWxzW2ldLmFkZEludGVyY2VwdG9yKGNvb3JkaW5hdG9yc1tpXSk7CisgICAgICAgICAgICBjaGFubmVsc1tpXS5hZGRJbnRlcmNlcHRvcihuZXcgVGNwRmFpbHVyZURldGVjdG9yKCkpOworICAgICAgICAgICAgZmluYWwgaW50IGogPSBpOworICAgICAgICAgICAgdGhyZWFkc1tpXSA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNbal0uc3RhcnQoQ2hhbm5lbC5ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKCBpbnQgaT0wOyBpPGNoYW5uZWxDb3VudDsgaSsrICkgdGhyZWFkc1tpXS5zdGFydCgpOworICAgICAgICBmb3IgKCBpbnQgaT0wOyBpPGNoYW5uZWxDb3VudDsgaSsrICkgdGhyZWFkc1tpXS5qb2luKCk7CisgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdENvb3JkMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpPTE7IGk8Y2hhbm5lbENvdW50OyBpKysgKSAKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTWVzc2FnZSBjb3VudCBleHBlY3RlZCB0byBiZSBlcXVhbC4iLGNoYW5uZWxzW2ktMV0uZ2V0TWVtYmVycygpLmxlbmd0aCxjaGFubmVsc1tpXS5nZXRNZW1iZXJzKCkubGVuZ3RoKTsKKyAgICAgICAgTWVtYmVyIG1lbWJlciA9IGNvb3JkaW5hdG9yc1swXS5nZXRDb29yZGluYXRvcigpOworICAgICAgICBpbnQgY250ID0gMDsKKyAgICAgICAgd2hpbGUgKCBtZW1iZXIgPT0gbnVsbCAmJiAoY250KysgPCAxMDAgKSApIHRyeSB7VGhyZWFkLnNsZWVwKDEwMCk7IG1lbWJlciA9IGNvb3JkaW5hdG9yc1swXS5nZXRDb29yZGluYXRvcigpO31jYXRjaCAoIEV4Y2VwdGlvbiB4KXt9CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxjaGFubmVsQ291bnQ7IGkrKyApIHN1cGVyLmFzc2VydEVxdWFscyhtZW1iZXIsY29vcmRpbmF0b3JzW2ldLmdldENvb3JkaW5hdG9yKCkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvb3JkaW5hdG9yWzFdIGlzOiIrbWVtYmVyKTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb29yZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWVtYmVyIG1lbWJlciA9IGNvb3JkaW5hdG9yc1sxXS5nZXRDb29yZGluYXRvcigpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvb3JkaW5hdG9yWzJhXSBpczoiICsgbWVtYmVyKTsKKyAgICAgICAgaW50IGluZGV4ID0gLTE7CisgICAgICAgIGZvciAoIGludCBpPTA7IGk8Y2hhbm5lbENvdW50OyBpKysgKSB7CisgICAgICAgICAgICBpZiAoIGNoYW5uZWxzW2ldLmdldExvY2FsTWVtYmVyKGZhbHNlKS5lcXVhbHMobWVtYmVyKSApIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNodXR0aW5nIGRvd246IiArIGNoYW5uZWxzW2ldLmdldExvY2FsTWVtYmVyKHRydWUpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGNoYW5uZWxzW2ldLnN0b3AoQ2hhbm5lbC5ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50IGRlYWQgPSBpbmRleDsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICBpZiAoIGluZGV4ID09IDAgKSBpbmRleCA9IDE7IGVsc2UgaW5kZXggPSAwOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1lbWJlciBjb3VudDoiK2NoYW5uZWxzW2luZGV4XS5nZXRNZW1iZXJzKCkubGVuZ3RoKTsKKyAgICAgICAgbWVtYmVyID0gY29vcmRpbmF0b3JzW2luZGV4XS5nZXRDb29yZGluYXRvcigpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGNoYW5uZWxDb3VudDsgaSsrKSBpZiAoIGkgIT0gZGVhZCApIHN1cGVyLmFzc2VydEVxdWFscyhtZW1iZXIsIGNvb3JkaW5hdG9yc1tpXS5nZXRDb29yZGluYXRvcigpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb29yZGluYXRvclsyYl0gaXM6IiArIG1lbWJlcik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZWFyRG93biIpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBmb3IgKCBpbnQgaT0wOyBpPGNoYW5uZWxDb3VudDsgaSsrICkgeworICAgICAgICAgICAgY2hhbm5lbHNbaV0uc3RvcChDaGFubmVsLkRFRkFVTFQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShUZXN0Tm9uQmxvY2tpbmdDb29yZGluYXRvci5jbGFzcyk7CisgICAgICAgIHN1aXRlLnJ1bihuZXcgVGVzdFJlc3VsdCgpKTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L2ludGVyY2VwdG9ycy9UZXN0VHdvUGhhc2VDb21taXQuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L2ludGVyY2VwdG9ycy9UZXN0VHdvUGhhc2VDb21taXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGFmMjMzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvaW50ZXJjZXB0b3JzL1Rlc3RUd29QaGFzZUNvbW1pdC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50ZXN0LmludGVyY2VwdG9yczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiA8cD5UaXRsZTogPC9wPiAKKyAqIAorICogPHA+RGVzY3JpcHRpb246IDwvcD4gCisgKiAKKyAqIDxwPkNvcHlyaWdodDogQ29weXJpZ2h0IChjKSAyMDA1PC9wPiAKKyAqIAorICogPHA+Q29tcGFueTogPC9wPgorICogCisgKiBAYXV0aG9yIG5vdCBhdHRyaWJ1dGFibGUKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgVGVzdFR3b1BoYXNlQ29tbWl0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvaW8vVGVzdFNlbmRlckNvbm5lY3Rpb25zLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9pby9UZXN0U2VuZGVyQ29ubmVjdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGZkMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvaW8vVGVzdFNlbmRlckNvbm5lY3Rpb25zLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudGVzdC5pbzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1hbmFnZWRDaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXJzaGlwTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuR3JvdXBDaGFubmVsOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsTGlzdGVuZXI7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuUmVwbGljYXRpb25UcmFuc21pdHRlcjsKKworcHVibGljIGNsYXNzIFRlc3RTZW5kZXJDb25uZWN0aW9ucyBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY291bnQgPSAyOworICAgIHByaXZhdGUgTWFuYWdlZENoYW5uZWxbXSBjaGFubmVscyA9IG5ldyBNYW5hZ2VkQ2hhbm5lbFtjb3VudF07CisgICAgcHJpdmF0ZSBUZXN0TXNnTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBuZXcgVGVzdE1zZ0xpc3RlbmVyW2NvdW50XTsKKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNoYW5uZWxzW2ldID0gbmV3IEdyb3VwQ2hhbm5lbCgpOworICAgICAgICAgICAgY2hhbm5lbHNbaV0uZ2V0TWVtYmVyc2hpcFNlcnZpY2UoKS5zZXRQYXlsb2FkKCAoIkNoYW5uZWwtIiArIChpICsgMSkpLmdldEJ5dGVzKCJBU0NJSSIpKTsKKyAgICAgICAgICAgIGxpc3RlbmVyc1tpXSA9IG5ldyBUZXN0TXNnTGlzdGVuZXIoICgiTGlzdGVuZXItIiArIChpICsgMSkpKTsKKyAgICAgICAgICAgIGNoYW5uZWxzW2ldLmFkZENoYW5uZWxMaXN0ZW5lcihsaXN0ZW5lcnNbaV0pOworICAgICAgICAgICAgY2hhbm5lbHNbaV0uc3RhcnQoQ2hhbm5lbC5TTkRfUlhfU0VRfENoYW5uZWwuU05EX1RYX1NFUSk7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlcyhsb25nIGRlbGF5LCBsb25nIHNsZWVwKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWVtYmVyIGxvY2FsID0gY2hhbm5lbHNbMF0uZ2V0TG9jYWxNZW1iZXIodHJ1ZSk7CisgICAgICAgIE1lbWJlciBkZXN0ID0gY2hhbm5lbHNbMV0uZ2V0TG9jYWxNZW1iZXIodHJ1ZSk7CisgICAgICAgIGludCBuID0gMzsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZW5kaW5nICIgKyBuICsgIiBtZXNzYWdlcyBmcm9tIFsiICsgbG9jYWwuZ2V0TmFtZSgpICsgIl0gdG8gWyIgKyBkZXN0LmdldE5hbWUoKSArICJdIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBjaGFubmVsc1swXS5zZW5kKG5ldyBNZW1iZXJbXSB7ZGVzdH0sIG5ldyBUZXN0TXNnKCksIDApOworICAgICAgICAgICAgaWYgKCBkZWxheSA+IDAgKSBUaHJlYWQuc2xlZXAoZGVsYXkpOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWVzc2FnZXMgc2VudC4gU2xlZXBpbmcgZm9yICIrKHNsZWVwLzEwMDApKyIgc2Vjb25kcyB0byBpbnNwZWN0IGNvbm5lY3Rpb25zIik7CisgICAgICAgIGlmICggc2xlZXAgPiAwICkgVGhyZWFkLnNsZWVwKHNsZWVwKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uTGluZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNlbmRNZXNzYWdlcygwLDE1MDAwKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEtlZXBBbGl2ZUNvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2V0dGluZyBrZWVwIGFsaXZlIGNvdW50IHRvIDAiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgUmVwbGljYXRpb25UcmFuc21pdHRlciB0ID0gKFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIpY2hhbm5lbHNbMF0uZ2V0Q2hhbm5lbFNlbmRlcigpOworICAgICAgICAgICAgdC5nZXRUcmFuc3BvcnQoKS5zZXRLZWVwQWxpdmVDb3VudCgwKTsKKyAgICAgICAgfQorICAgICAgICBzZW5kTWVzc2FnZXMoMTAwMCwxNTAwMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtlZXBBbGl2ZVRpbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXR0aW5nIGtlZXAgYWxpdmUgY291bnQgdG8gMSBzZWNvbmQiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgUmVwbGljYXRpb25UcmFuc21pdHRlciB0ID0gKFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIpY2hhbm5lbHNbMF0uZ2V0Q2hhbm5lbFNlbmRlcigpOworICAgICAgICAgICAgdC5nZXRUcmFuc3BvcnQoKS5zZXRLZWVwQWxpdmVUaW1lKDEwMDApOworICAgICAgICB9CisgICAgICAgIHNlbmRNZXNzYWdlcygyMDAwLDE1MDAwKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYW5uZWxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjaGFubmVsc1tpXS5zdG9wKENoYW5uZWwuREVGQVVMVCk7CisgICAgICAgIH0KKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RNc2cgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgICAgICBzdGF0aWMgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBwdWJsaWMgVGVzdE1zZygpIHsKKyAgICAgICAgICAgIGludCBzaXplID0gTWF0aC5hYnMoci5uZXh0SW50KCkgJSAyMDApOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gTWF0aC5hYnMoci5uZXh0SW50KCkgJTY1MDAwKTsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QobGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KG5ldyBJbnRlZ2VyKGkpLGxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFRlc3RNc2dMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5uZWxMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgICAgIHB1YmxpYyBUZXN0TXNnTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZWNlaXZlZChTZXJpYWxpemFibGUgbXNnLCBNZW1iZXIgc2VuZGVyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlsiK25hbWUrIl0gUmVjZWl2ZWQgbWVzc2FnZToiK21zZysiIGZyb20gIiArIHNlbmRlci5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KFNlcmlhbGl6YWJsZSBtc2csIE1lbWJlciBzZW5kZXIpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKworICAgICAgICAKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L2lvL1Rlc3RTZXJpYWxpemF0aW9uLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9pby9UZXN0U2VyaWFsaXphdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ODhkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9pby9UZXN0U2VyaWFsaXphdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudGVzdC5pbzsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLlhCeXRlQnVmZmVyOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RTZXJpYWxpemF0aW9uIGV4dGVuZHMgVGVzdENhc2UgeworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvL1hCeXRlQnVmZmVyLmRlc2VyaWFsaXplKG5ldyBieXRlWzBdKTsKKyAgICAgICAgWEJ5dGVCdWZmZXIuZGVzZXJpYWxpemUobmV3IGJ5dGVbXSB7LTg0LCAtMTksIDAsIDUsIDExNSwgMTE0LCAwLCAxNywgMTA2fSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9tZW1iZXJzaGlwL01lbWJlclNlcmlhbGl6YXRpb24uamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L21lbWJlcnNoaXAvTWVtYmVyU2VyaWFsaXphdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYTBhZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9tZW1iZXJzaGlwL01lbWJlclNlcmlhbGl6YXRpb24uamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudGVzdC5tZW1iZXJzaGlwOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLm1lbWJlcnNoaXAuTWVtYmVySW1wbDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIDxwPlRpdGxlOiA8L3A+CisgKgorICogPHA+RGVzY3JpcHRpb246IDwvcD4KKyAqCisgKiA8cD5Db3B5cmlnaHQ6IENvcHlyaWdodCAoYykgMjAwNTwvcD4KKyAqCisgKiA8cD5Db21wYW55OiA8L3A+CisgKgorICogQGF1dGhvciBub3QgYXR0cmlidXRhYmxlCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIE1lbWJlclNlcmlhbGl6YXRpb24gZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgTWVtYmVySW1wbCBtMSwgbTIsIHAxLHAyOworICAgIGJ5dGVbXSBwYXlsb2FkID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBwYXlsb2FkID0gbmV3IGJ5dGVbMzMzXTsKKyAgICAgICAgQXJyYXlzLmZpbGwocGF5bG9hZCwoYnl0ZSkxKTsKKyAgICAgICAgbTEgPSBuZXcgTWVtYmVySW1wbCgibG9jYWxob3N0IiwzMzMzLDEscGF5bG9hZCk7CisgICAgICAgIG0yID0gbmV3IE1lbWJlckltcGwoImxvY2FsaG9zdCIsMzMzMywxKTsKKyAgICAgICAgcGF5bG9hZCA9IG5ldyBieXRlWzMzM107CisgICAgICAgIEFycmF5cy5maWxsKHBheWxvYWQsKGJ5dGUpMik7CisgICAgICAgIHAxID0gbmV3IE1lbWJlckltcGwoIjEyNy4wLjAuMSIsMzMzMywxLHBheWxvYWQpOworICAgICAgICBwMiA9IG5ldyBNZW1iZXJJbXBsKCJsb2NhbGhvc3QiLDMzMzEsMSxwYXlsb2FkKTsKKyAgICAgICAgbTEuc2V0RG9tYWluKG5ldyBieXRlW10gezEsMiwzLDQsNSw2LDcsOCw5fSk7CisgICAgICAgIG0yLnNldERvbWFpbihuZXcgYnl0ZVtdIHsxLDIsMyw0LDUsNiw3LDgsOX0pOworICAgICAgICBtMS5zZXRDb21tYW5kKG5ldyBieXRlW10gezEsMiw0LDUsNiw3LDgsOX0pOworICAgICAgICBtMi5zZXRDb21tYW5kKG5ldyBieXRlW10gezEsMiw0LDUsNiw3LDgsOX0pOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKG0xLmVxdWFscyhtMikpOworICAgICAgICBhc3NlcnRUcnVlKG0yLmVxdWFscyhtMSkpOworICAgICAgICBhc3NlcnRUcnVlKHAxLmVxdWFscyhtMikpOworICAgICAgICBhc3NlcnRGYWxzZShtMS5lcXVhbHMocDIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobTEuZXF1YWxzKHAyKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG0yLmVxdWFscyhwMikpOworICAgICAgICBhc3NlcnRGYWxzZShwMS5lcXVhbHMocDIpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWVtYmVySW1wbCBtID0gbTE7CisgICAgICAgIGJ5dGVbXSBtZDEgPSBtLmdldERhdGEoZmFsc2UsdHJ1ZSk7CisgICAgICAgIGJ5dGVbXSBtZGExID0gbS5nZXREYXRhKGZhbHNlLGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG1kMSxtZGExKSk7CisgICAgICAgIGFzc2VydFRydWUobWQxPT1tZGExKTsKKyAgICAgICAgbWRhMSA9IG0uZ2V0RGF0YSh0cnVlLHRydWUpOworICAgICAgICBNZW1iZXJJbXBsIG1hMSA9IE1lbWJlckltcGwuZ2V0TWVtYmVyKG1kYTEpOworICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVNZW1iZXJzKG0sbWExKSk7CisgICAgICAgIG1kYTEgPSBwMS5nZXREYXRhKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoQXJyYXlzLmVxdWFscyhtZDEsbWRhMSkpOworICAgICAgICBtYTEgPSBNZW1iZXJJbXBsLmdldE1lbWJlcihtZGExKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlTWVtYmVycyhwMSxtYTEpKTsKKyAgICAgICAgCisgICAgICAgIG1kMSA9IG0uZ2V0RGF0YSh0cnVlLHRydWUpOworICAgICAgICBUaHJlYWQuc2xlZXAoNSk7CisgICAgICAgIG1kYTEgPSBtLmdldERhdGEodHJ1ZSx0cnVlKTsKKyAgICAgICAgTWVtYmVySW1wbCBhMSA9IE1lbWJlckltcGwuZ2V0TWVtYmVyKG1kMSk7CisgICAgICAgIE1lbWJlckltcGwgYTIgPSBNZW1iZXJJbXBsLmdldE1lbWJlcihtZGExKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhMS5lcXVhbHMoYTIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoQXJyYXlzLmVxdWFscyhtZDEsbWRhMSkpOworICAgICAgICAKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGNvbXBhcmVNZW1iZXJzKE1lbWJlckltcGwgaW1wbDEsIE1lbWJlckltcGwgaW1wbDIpIHsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOworICAgICAgICByZXN1bHQgPSByZXN1bHQgJiYgQXJyYXlzLmVxdWFscyhpbXBsMS5nZXRIb3N0KCksaW1wbDIuZ2V0SG9zdCgpKTsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmIEFycmF5cy5lcXVhbHMoaW1wbDEuZ2V0UGF5bG9hZCgpLGltcGwyLmdldFBheWxvYWQoKSk7CisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCAmJiBBcnJheXMuZXF1YWxzKGltcGwxLmdldFVuaXF1ZUlkKCksaW1wbDIuZ2V0VW5pcXVlSWQoKSk7CisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCAmJiBpbXBsMS5nZXRQb3J0KCkgPT0gaW1wbDIuZ2V0UG9ydCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9tZW1iZXJzaGlwL1Rlc3REb21haW5GaWx0ZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L21lbWJlcnNoaXAvVGVzdERvbWFpbkZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMjE4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9tZW1iZXJzaGlwL1Rlc3REb21haW5GaWx0ZXIuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50ZXN0Lm1lbWJlcnNoaXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NYW5hZ2VkQ2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyc2hpcExpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkdyb3VwQ2hhbm5lbDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzLkRvbWFpbkZpbHRlckludGVyY2VwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnV0aWwuVVVJREdlbmVyYXRvcjsKKworcHVibGljIGNsYXNzIFRlc3REb21haW5GaWx0ZXIKKyAgICBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY291bnQgPSAxMDsKKyAgICBwcml2YXRlIE1hbmFnZWRDaGFubmVsW10gY2hhbm5lbHMgPSBuZXcgTWFuYWdlZENoYW5uZWxbY291bnRdOworICAgIHByaXZhdGUgVGVzdE1ickxpc3RlbmVyW10gbGlzdGVuZXJzID0gbmV3IFRlc3RNYnJMaXN0ZW5lcltjb3VudF07CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYW5uZWxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjaGFubmVsc1tpXSA9IG5ldyBHcm91cENoYW5uZWwoKTsKKyAgICAgICAgICAgIGNoYW5uZWxzW2ldLmdldE1lbWJlcnNoaXBTZXJ2aWNlKCkuc2V0UGF5bG9hZCggKCJDaGFubmVsLSIgKyAoaSArIDEpKS5nZXRCeXRlcygiQVNDSUkiKSk7CisgICAgICAgICAgICBsaXN0ZW5lcnNbaV0gPSBuZXcgVGVzdE1ickxpc3RlbmVyKCAoIkxpc3RlbmVyLSIgKyAoaSArIDEpKSk7CisgICAgICAgICAgICBjaGFubmVsc1tpXS5hZGRNZW1iZXJzaGlwTGlzdGVuZXIobGlzdGVuZXJzW2ldKTsKKyAgICAgICAgICAgIERvbWFpbkZpbHRlckludGVyY2VwdG9yIGZpbHRlciA9IG5ldyBEb21haW5GaWx0ZXJJbnRlcmNlcHRvcigpOworICAgICAgICAgICAgZmlsdGVyLnNldERvbWFpbihVVUlER2VuZXJhdG9yLnJhbmRvbVVVSUQoZmFsc2UpKTsKKyAgICAgICAgICAgIGNoYW5uZWxzW2ldLmFkZEludGVyY2VwdG9yKGZpbHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbGlzdGVuZXJzW2ldLm1lbWJlcnMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZW1iZXJBcnJpdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vcHVycG9zZSBvZiB0aGlzIHRlc3QgaXMgdG8gbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSByZWNlaXZlZCBhbGwgdGhlIG1lbWJlcnMKKyAgICAgICAgLy90aGF0IHdlIGNhbiBleHBlY3QgYmVmb3JlIHRoZSBzdGFydCBtZXRob2QgcmV0dXJucworICAgICAgICBUaHJlYWRbXSB0aHJlYWRzID0gbmV3IFRocmVhZFtjaGFubmVscy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2hhbm5lbHMubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICBmaW5hbCBDaGFubmVsIGNoYW5uZWwgPSBjaGFubmVsc1tpXTsKKyAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLnN0YXJ0KENoYW5uZWwuREVGQVVMVCk7CisgICAgICAgICAgICAgICAgICAgIH1jYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGhyZWFkc1tpXSA9IHQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPHRocmVhZHMubGVuZ3RoOyBpKysgKSB0aHJlYWRzW2ldLnN0YXJ0KCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTx0aHJlYWRzLmxlbmd0aDsgaSsrICkgdGhyZWFkc1tpXS5qb2luKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWxsIGNoYW5uZWxzIHN0YXJ0ZWQuIik7CisgICAgICAgIGZvciAoaW50IGk9bGlzdGVuZXJzLmxlbmd0aC0xOyBpPj0wOyBpLS0gKSBhc3NlcnRFcXVhbHMoIkNoZWNraW5nIG1lbWJlciBhcnJpdmFsIGxlbmd0aCIsMCxsaXN0ZW5lcnNbaV0ubWVtYmVycy5zaXplKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjaGFubmVsc1tpXS5zdG9wKENoYW5uZWwuREVGQVVMVCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7fQorICAgICAgICB9CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFRlc3RNYnJMaXN0ZW5lcgorICAgICAgICBpbXBsZW1lbnRzIE1lbWJlcnNoaXBMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgICAgIHB1YmxpYyBUZXN0TWJyTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQXJyYXlMaXN0IG1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHB1YmxpYyB2b2lkIG1lbWJlckFkZGVkKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgICAgIGlmICghbWVtYmVycy5jb250YWlucyhtZW1iZXIpKSB7CisgICAgICAgICAgICAgICAgbWVtYmVycy5hZGQobWVtYmVyKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSArICI6bWVtYmVyIGFkZGVkWyIgKyBuZXcgU3RyaW5nKG1lbWJlci5nZXRQYXlsb2FkKCksICJBU0NJSSIpICsgIjsgVGhyZWFkOiIrVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkrIl0iKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSArICI6bWVtYmVyIGFkZGVkW3Vua25vd25dIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbWVtYmVyRGlzYXBwZWFyZWQoTWVtYmVyIG1lbWJlcikgeworICAgICAgICAgICAgaWYgKG1lbWJlcnMuY29udGFpbnMobWVtYmVyKSkgeworICAgICAgICAgICAgICAgIG1lbWJlcnMucmVtb3ZlKG1lbWJlcik7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5hbWUgKyAiOm1lbWJlciBkaXNhcHBlYXJlZFsiICsgbmV3IFN0cmluZyhtZW1iZXIuZ2V0UGF5bG9hZCgpLCAiQVNDSUkiKSArICI7IFRocmVhZDoiK1RocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKyJdIik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5hbWUgKyAiOm1lbWJlciBkaXNhcHBlYXJlZFt1bmtub3duXSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9tZW1iZXJzaGlwL1Rlc3RNZW1iZXJBcnJpdmFsLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9tZW1iZXJzaGlwL1Rlc3RNZW1iZXJBcnJpdmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM4MmM3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L21lbWJlcnNoaXAvVGVzdE1lbWJlckFycml2YWwuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50ZXN0Lm1lbWJlcnNoaXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NYW5hZ2VkQ2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyc2hpcExpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkdyb3VwQ2hhbm5lbDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0TWVtYmVyQXJyaXZhbAorICAgIGV4dGVuZHMgVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudCA9IDEwOworICAgIHByaXZhdGUgTWFuYWdlZENoYW5uZWxbXSBjaGFubmVscyA9IG5ldyBNYW5hZ2VkQ2hhbm5lbFtjb3VudF07CisgICAgcHJpdmF0ZSBUZXN0TWJyTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBuZXcgVGVzdE1ickxpc3RlbmVyW2NvdW50XTsKKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNoYW5uZWxzW2ldID0gbmV3IEdyb3VwQ2hhbm5lbCgpOworICAgICAgICAgICAgY2hhbm5lbHNbaV0uZ2V0TWVtYmVyc2hpcFNlcnZpY2UoKS5zZXRQYXlsb2FkKCAoIkNoYW5uZWwtIiArIChpICsgMSkpLmdldEJ5dGVzKCJBU0NJSSIpKTsKKyAgICAgICAgICAgIGxpc3RlbmVyc1tpXSA9IG5ldyBUZXN0TWJyTGlzdGVuZXIoICgiTGlzdGVuZXItIiArIChpICsgMSkpKTsKKyAgICAgICAgICAgIGNoYW5uZWxzW2ldLmFkZE1lbWJlcnNoaXBMaXN0ZW5lcihsaXN0ZW5lcnNbaV0pOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbGlzdGVuZXJzW2ldLm1lbWJlcnMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZW1iZXJBcnJpdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vcHVycG9zZSBvZiB0aGlzIHRlc3QgaXMgdG8gbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSByZWNlaXZlZCBhbGwgdGhlIG1lbWJlcnMKKyAgICAgICAgLy90aGF0IHdlIGNhbiBleHBlY3QgYmVmb3JlIHRoZSBzdGFydCBtZXRob2QgcmV0dXJucworICAgICAgICBUaHJlYWRbXSB0aHJlYWRzID0gbmV3IFRocmVhZFtjaGFubmVscy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2hhbm5lbHMubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICBmaW5hbCBDaGFubmVsIGNoYW5uZWwgPSBjaGFubmVsc1tpXTsKKyAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLnN0YXJ0KENoYW5uZWwuREVGQVVMVCk7CisgICAgICAgICAgICAgICAgICAgIH1jYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGhyZWFkc1tpXSA9IHQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPHRocmVhZHMubGVuZ3RoOyBpKysgKSB0aHJlYWRzW2ldLnN0YXJ0KCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTx0aHJlYWRzLmxlbmd0aDsgaSsrICkgdGhyZWFkc1tpXS5qb2luKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWxsIGNoYW5uZWxzIHN0YXJ0ZWQuIik7CisgICAgICAgIGZvciAoaW50IGk9bGlzdGVuZXJzLmxlbmd0aC0xOyBpPj0wOyBpLS0gKSBhc3NlcnRFcXVhbHMoIkNoZWNraW5nIG1lbWJlciBhcnJpdmFsIGxlbmd0aCIsY2hhbm5lbHMubGVuZ3RoLTEsbGlzdGVuZXJzW2ldLm1lbWJlcnMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbHNbaV0uc3RvcChDaGFubmVsLkRFRkFVTFQpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkge30KKyAgICAgICAgfQorICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBUZXN0TWJyTGlzdGVuZXIKKyAgICAgICAgaW1wbGVtZW50cyBNZW1iZXJzaGlwTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICBwdWJsaWMgVGVzdE1ickxpc3RlbmVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFycmF5TGlzdCBtZW1iZXJzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgICAgICBpZiAoIW1lbWJlcnMuY29udGFpbnMobWVtYmVyKSkgeworICAgICAgICAgICAgICAgIG1lbWJlcnMuYWRkKG1lbWJlcik7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5hbWUgKyAiOm1lbWJlciBhZGRlZFsiICsgbmV3IFN0cmluZyhtZW1iZXIuZ2V0UGF5bG9hZCgpLCAiQVNDSUkiKSArICI7IFRocmVhZDoiK1RocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKyJdIik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5hbWUgKyAiOm1lbWJlciBhZGRlZFt1bmtub3duXSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgICAgIGlmIChtZW1iZXJzLmNvbnRhaW5zKG1lbWJlcikpIHsKKyAgICAgICAgICAgICAgICBtZW1iZXJzLnJlbW92ZShtZW1iZXIpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lICsgIjptZW1iZXIgZGlzYXBwZWFyZWRbIiArIG5ldyBTdHJpbmcobWVtYmVyLmdldFBheWxvYWQoKSwgIkFTQ0lJIikgKyAiOyBUaHJlYWQ6IitUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSsiXSIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lICsgIjptZW1iZXIgZGlzYXBwZWFyZWRbdW5rbm93bl0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvbWVtYmVyc2hpcC9UZXN0VGNwRmFpbHVyZURldGVjdG9yLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC9tZW1iZXJzaGlwL1Rlc3RUY3BGYWlsdXJlRGV0ZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTg1NThmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvbWVtYmVyc2hpcC9UZXN0VGNwRmFpbHVyZURldGVjdG9yLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudGVzdC5tZW1iZXJzaGlwOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkJ5dGVNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NYW5hZ2VkQ2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyc2hpcExpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkdyb3VwQ2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuVGNwRmFpbHVyZURldGVjdG9yOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiA8cD5UaXRsZTogPC9wPiAKKyAqIAorICogPHA+RGVzY3JpcHRpb246IDwvcD4gCisgKiAKKyAqIDxwPkNvcHlyaWdodDogQ29weXJpZ2h0IChjKSAyMDA1PC9wPiAKKyAqIAorICogPHA+Q29tcGFueTogPC9wPgorICogCisgKiBAYXV0aG9yIG5vdCBhdHRyaWJ1dGFibGUKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgVGVzdFRjcEZhaWx1cmVEZXRlY3RvciBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIFRjcEZhaWx1cmVEZXRlY3RvciB0Y3BGYWlsdXJlRGV0ZWN0b3IxID0gbnVsbDsKKyAgICBwcml2YXRlIFRjcEZhaWx1cmVEZXRlY3RvciB0Y3BGYWlsdXJlRGV0ZWN0b3IyID0gbnVsbDsKKyAgICBwcml2YXRlIE1hbmFnZWRDaGFubmVsIGNoYW5uZWwxID0gbnVsbDsKKyAgICBwcml2YXRlIE1hbmFnZWRDaGFubmVsIGNoYW5uZWwyID0gbnVsbDsKKyAgICBwcml2YXRlIFRlc3RNYnJMaXN0ZW5lciBtYnJsaXN0MSA9IG51bGw7CisgICAgcHJpdmF0ZSBUZXN0TWJyTGlzdGVuZXIgbWJybGlzdDIgPSBudWxsOworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIGNoYW5uZWwxID0gbmV3IEdyb3VwQ2hhbm5lbCgpOworICAgICAgICBjaGFubmVsMiA9IG5ldyBHcm91cENoYW5uZWwoKTsKKyAgICAgICAgY2hhbm5lbDEuZ2V0TWVtYmVyc2hpcFNlcnZpY2UoKS5zZXRQYXlsb2FkKCJDaGFubmVsLTEiLmdldEJ5dGVzKCJBU0NJSSIpKTsKKyAgICAgICAgY2hhbm5lbDIuZ2V0TWVtYmVyc2hpcFNlcnZpY2UoKS5zZXRQYXlsb2FkKCJDaGFubmVsLTIiLmdldEJ5dGVzKCJBU0NJSSIpKTsKKyAgICAgICAgbWJybGlzdDEgPSBuZXcgVGVzdE1ickxpc3RlbmVyKCJDaGFubmVsLTEiKTsKKyAgICAgICAgbWJybGlzdDIgPSBuZXcgVGVzdE1ickxpc3RlbmVyKCJDaGFubmVsLTIiKTsKKyAgICAgICAgdGNwRmFpbHVyZURldGVjdG9yMSA9IG5ldyBUY3BGYWlsdXJlRGV0ZWN0b3IoKTsKKyAgICAgICAgdGNwRmFpbHVyZURldGVjdG9yMiA9IG5ldyBUY3BGYWlsdXJlRGV0ZWN0b3IoKTsKKyAgICAgICAgY2hhbm5lbDEuYWRkSW50ZXJjZXB0b3IodGNwRmFpbHVyZURldGVjdG9yMSk7CisgICAgICAgIGNoYW5uZWwyLmFkZEludGVyY2VwdG9yKHRjcEZhaWx1cmVEZXRlY3RvcjIpOworICAgICAgICBjaGFubmVsMS5hZGRNZW1iZXJzaGlwTGlzdGVuZXIobWJybGlzdDEpOworICAgICAgICBjaGFubmVsMi5hZGRNZW1iZXJzaGlwTGlzdGVuZXIobWJybGlzdDIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgbWJybGlzdDEubWVtYmVycy5jbGVhcigpOworICAgICAgICBtYnJsaXN0Mi5tZW1iZXJzLmNsZWFyKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RUY3BTZW5kRmFpbHVyZU1lbWJlckRyb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0VGNwU2VuZEZhaWx1cmVNZW1iZXJEcm9wKCkiKTsKKyAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgY2hhbm5lbDEuc3RhcnQoY2hhbm5lbDEuREVGQVVMVCk7CisgICAgICAgIGNoYW5uZWwyLnN0YXJ0KGNoYW5uZWwyLkRFRkFVTFQpOworICAgICAgICAvL1RocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RpbmcgbWVtYmVyIGNvdW50IHRvIGJlIGVxdWFsIixtYnJsaXN0MS5tZW1iZXJzLnNpemUoKSxtYnJsaXN0Mi5tZW1iZXJzLnNpemUoKSk7CisgICAgICAgIGNoYW5uZWwyLnN0b3AoY2hhbm5lbDIuU05EX1JYX1NFUSk7CisgICAgICAgIEJ5dGVNZXNzYWdlIG1zZyA9IG5ldyBCeXRlTWVzc2FnZShuZXcgYnl0ZVsxMDI0XSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGFubmVsMS5zZW5kKGNoYW5uZWwxLmdldE1lbWJlcnMoKSwgbXNnLCAwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTWVzc2FnZSBzZW5kIHNob3VsZCBoYXZlIGZhaWxlZC4iLHRydWUsZmFsc2UpOworICAgICAgICB9IGNhdGNoICggQ2hhbm5lbEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RpbmcgbWVtYmVyIGNvdW50IHRvIG5vdCBiZSBlcXVhbCIsbWJybGlzdDEubWVtYmVycy5zaXplKCkrMSxtYnJsaXN0Mi5tZW1iZXJzLnNpemUoKSk7CisgICAgICAgIGNoYW5uZWwxLnN0b3AoQ2hhbm5lbC5ERUZBVUxUKTsKKyAgICAgICAgY2hhbm5lbDIuc3RvcChDaGFubmVsLkRFRkFVTFQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGNwRmFpbHVyZU1lbWJlckFkZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RUY3BGYWlsdXJlTWVtYmVyQWRkKCkiKTsKKyAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgY2hhbm5lbDEuc3RhcnQoY2hhbm5lbDEuREVGQVVMVCk7CisgICAgICAgIGNoYW5uZWwyLnN0YXJ0KGNoYW5uZWwyLlNORF9SWF9TRVEpOworICAgICAgICBjaGFubmVsMi5zdGFydChjaGFubmVsMi5TTkRfVFhfU0VRKTsKKyAgICAgICAgY2hhbm5lbDIuc3RhcnQoY2hhbm5lbDIuTUJSX1JYX1NFUSk7CisgICAgICAgIGNoYW5uZWwyLnN0b3AoY2hhbm5lbDIuU05EX1JYX1NFUSk7CisgICAgICAgIGNoYW5uZWwyLnN0YXJ0KGNoYW5uZWwyLk1CUl9UWF9TRVEpOworICAgICAgICAvL1RocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RpbmcgbWVtYmVyIGNvdW50IHRvIG5vdCBiZSBlcXVhbCIsbWJybGlzdDEubWVtYmVycy5zaXplKCkrMSxtYnJsaXN0Mi5tZW1iZXJzLnNpemUoKSk7CisgICAgICAgIGNoYW5uZWwxLnN0b3AoQ2hhbm5lbC5ERUZBVUxUKTsKKyAgICAgICAgY2hhbm5lbDIuc3RvcChDaGFubmVsLkRFRkFVTFQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUY3BNY2FzdEZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0VGNwTWNhc3RGYWlsKCkiKTsKKyAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgY2hhbm5lbDEuc3RhcnQoY2hhbm5lbDEuREVGQVVMVCk7CisgICAgICAgIGNoYW5uZWwyLnN0YXJ0KGNoYW5uZWwyLkRFRkFVTFQpOworICAgICAgICAvL1RocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RpbmcgbWVtYmVyIGNvdW50IHRvIGJlIGVxdWFsIixtYnJsaXN0MS5tZW1iZXJzLnNpemUoKSxtYnJsaXN0Mi5tZW1iZXJzLnNpemUoKSk7CisgICAgICAgIGNoYW5uZWwyLnN0b3AoY2hhbm5lbDIuTUJSX1RYX1NFUSk7CisgICAgICAgIEJ5dGVNZXNzYWdlIG1zZyA9IG5ldyBCeXRlTWVzc2FnZShuZXcgYnl0ZVsxMDI0XSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGluZyBtZW1iZXIgY291bnQgdG8gYmUgZXF1YWwiLG1icmxpc3QxLm1lbWJlcnMuc2l6ZSgpLG1icmxpc3QyLm1lbWJlcnMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGNoYW5uZWwxLnNlbmQoY2hhbm5lbDEuZ2V0TWVtYmVycygpLCBtc2csIDApOworICAgICAgICB9IGNhdGNoICggQ2hhbm5lbEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJNZXNzYWdlIHNlbmQgc2hvdWxkIGhhdmUgc3VjY2VlZGVkLiIsdHJ1ZSxmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgY2hhbm5lbDEuc3RvcChDaGFubmVsLkRFRkFVTFQpOworICAgICAgICBjaGFubmVsMi5zdG9wKENoYW5uZWwuREVGQVVMVCk7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0Y3BGYWlsdXJlRGV0ZWN0b3IxID0gbnVsbDsKKyAgICAgICAgdGNwRmFpbHVyZURldGVjdG9yMiA9IG51bGw7CisgICAgICAgIHRyeSB7IGNoYW5uZWwxLnN0b3AoQ2hhbm5lbC5ERUZBVUxUKTt9Y2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpe30KKyAgICAgICAgY2hhbm5lbDEgPSBudWxsOworICAgICAgICB0cnkgeyBjaGFubmVsMi5zdG9wKENoYW5uZWwuREVGQVVMVCk7fWNhdGNoIChFeGNlcHRpb24gaWdub3JlKXt9CisgICAgICAgIGNoYW5uZWwyID0gbnVsbDsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGNsYXNzIFRlc3RNYnJMaXN0ZW5lciBpbXBsZW1lbnRzIE1lbWJlcnNoaXBMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgICAgIHB1YmxpYyBUZXN0TWJyTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEFycmF5TGlzdCBtZW1iZXJzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgICAgICBpZiAoICFtZW1iZXJzLmNvbnRhaW5zKG1lbWJlcikgKSB7CisgICAgICAgICAgICAgICAgbWVtYmVycy5hZGQobWVtYmVyKTsKKyAgICAgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lICsgIjptZW1iZXIgYWRkZWRbIiArIG5ldyBTdHJpbmcobWVtYmVyLmdldFBheWxvYWQoKSwgIkFTQ0lJIikgKyAiXSIpOworICAgICAgICAgICAgICAgIH1jYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSArICI6bWVtYmVyIGFkZGVkW3Vua25vd25dIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBtZW1iZXJEaXNhcHBlYXJlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgICAgICBpZiAoIG1lbWJlcnMuY29udGFpbnMobWVtYmVyKSApIHsKKyAgICAgICAgICAgICAgICBtZW1iZXJzLnJlbW92ZShtZW1iZXIpOworICAgICAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5hbWUgKyAiOm1lbWJlciBkaXNhcHBlYXJlZFsiICsgbmV3IFN0cmluZyhtZW1iZXIuZ2V0UGF5bG9hZCgpLCAiQVNDSUkiKSArICJdIik7CisgICAgICAgICAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lICsgIjptZW1iZXIgZGlzYXBwZWFyZWRbdW5rbm93bl0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC90cmFuc3BvcnQvU29ja2V0TmlvUmVjZWl2ZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvdHJhbnNwb3J0L1NvY2tldE5pb1JlY2VpdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjRmOWNkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvdHJhbnNwb3J0L1NvY2tldE5pb1JlY2VpdmUuamF2YQpAQCAtMCwwICsxLDc2IEBACitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRlc3QudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVzc2FnZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLkNoYW5uZWxEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLlhCeXRlQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLm1lbWJlcnNoaXAuTWVtYmVySW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQubmlvLk5pb1JlY2VpdmVyOworCitwdWJsaWMgY2xhc3MgU29ja2V0TmlvUmVjZWl2ZSB7CisgICAgc3RhdGljIGludCBjb3VudCA9IDA7CisgICAgc3RhdGljIGludCBhY2NlcHQgPSAwOworICAgIHN0YXRpYyBsb25nIHN0YXJ0ID0gMDsKKyAgICBzdGF0aWMgZG91YmxlIG1iID0gMDsKKyAgICBzdGF0aWMgaW50IGxlbiA9IDA7CisgICAgc3RhdGljIERlY2ltYWxGb3JtYXQgZGYgPSBuZXcgRGVjaW1hbEZvcm1hdCgiIyMuMDAiKTsKKyAgICBzdGF0aWMgZG91YmxlIHNlY29uZHMgPSAwOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgbXV0ZXggPSBuZXcgT2JqZWN0KCk7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1lbWJlciBtYnIgPSBuZXcgTWVtYmVySW1wbCgibG9jYWxob3N0IiwgOTk5OSwgMCk7CisgICAgICAgIENoYW5uZWxEYXRhIGRhdGEgPSBuZXcgQ2hhbm5lbERhdGEoKTsKKyAgICAgICAgZGF0YS5zZXRBZGRyZXNzKG1icik7CisgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs4MTkyICogNF07CisgICAgICAgIGRhdGEuc2V0TWVzc2FnZShuZXcgWEJ5dGVCdWZmZXIoYnVmLCBmYWxzZSkpOworICAgICAgICBidWYgPSBYQnl0ZUJ1ZmZlci5jcmVhdGVEYXRhUGFja2FnZShkYXRhKTsKKyAgICAgICAgbGVuID0gYnVmLmxlbmd0aDsKKyAgICAgICAgTmlvUmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgTmlvUmVjZWl2ZXIoKTsKKyAgICAgICAgcmVjZWl2ZXIuc2V0UG9ydCg5OTk5KTsKKyAgICAgICAgcmVjZWl2ZXIuc2V0SG9zdCgibG9jYWxob3N0Iik7CisgICAgICAgIE15TGlzdCBsaXN0ID0gbmV3IE15TGlzdCgpOworICAgICAgICByZWNlaXZlci5zZXRNZXNzYWdlTGlzdGVuZXIobGlzdCk7CisgICAgICAgIHJlY2VpdmVyLnN0YXJ0KCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTGlzdGVuaW5nIG9uIDk5OTkiKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtdXRleCkgeworICAgICAgICAgICAgICAgICAgICBtdXRleC53YWl0KDUwMDApOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXJ0ICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRocm91Z2hwdXQgIiArIGRmLmZvcm1hdChtYiAvIHNlY29uZHMpICsgIiBNQi9zZWNvbmRzLCBtZXNzYWdlcyAiK2NvdW50KyIgYWNjZXB0cyAiK2FjY2VwdCsiLCB0b3RhbCAiK21iKyIgTUIuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Y2F0Y2ggKFRocm93YWJsZSB4KSB7CisgICAgICAgICAgICAgICAgeC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15TGlzdCBpbXBsZW1lbnRzIE1lc3NhZ2VMaXN0ZW5lciB7CisgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZWNlaXZlZChDaGFubmVsTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1iICs9ICggKGRvdWJsZSkgbGVuKSAvIDEwMjQgLyAxMDI0OworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Y291bnQrKzt9CisgICAgICAgICAgICBpZiAoICggKGNvdW50KSAlIDEwMDAwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgc2Vjb25kcyA9ICggKGRvdWJsZSkgKHRpbWUgLSBzdGFydCkpIC8gMTAwMDsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRocm91Z2hwdXQgIiArIGRmLmZvcm1hdChtYiAvIHNlY29uZHMpICsgIiBNQi9zZWNvbmRzLCBtZXNzYWdlcyAiK2NvdW50KyIsIHRvdGFsICIrbWIrIiBNQi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgCisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KENoYW5uZWxNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7YWNjZXB0Kys7fQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L3RyYW5zcG9ydC9Tb2NrZXROaW9TZW5kLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC90cmFuc3BvcnQvU29ja2V0TmlvU2VuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZWMxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC90cmFuc3BvcnQvU29ja2V0TmlvU2VuZC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudGVzdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0Lm5pby5OaW9TZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMubWVtYmVyc2hpcC5NZW1iZXJJbXBsOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLlhCeXRlQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uQ2hhbm5lbERhdGE7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CisKK3B1YmxpYyBjbGFzcyBTb2NrZXROaW9TZW5kIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZWxlY3RvciBzZWxlY3RvciA9IFNlbGVjdG9yLm9wZW4oKTsKKyAgICAgICAgTWVtYmVyIG1iciA9IG5ldyBNZW1iZXJJbXBsKCJsb2NhbGhvc3QiLCA5OTk5LCAwKTsKKyAgICAgICAgQ2hhbm5lbERhdGEgZGF0YSA9IG5ldyBDaGFubmVsRGF0YSgpOworICAgICAgICBkYXRhLnNldE9wdGlvbnMoQ2hhbm5lbC5TRU5EX09QVElPTlNfQllURV9NRVNTQUdFKTsKKyAgICAgICAgZGF0YS5zZXRBZGRyZXNzKG1icik7CisgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs4MTkyICogNF07CisgICAgICAgIGRhdGEuc2V0TWVzc2FnZShuZXcgWEJ5dGVCdWZmZXIoYnVmLGZhbHNlKSk7CisgICAgICAgIGJ1ZiA9IFhCeXRlQnVmZmVyLmNyZWF0ZURhdGFQYWNrYWdlKGRhdGEpOworICAgICAgICBpbnQgbGVuID0gYnVmLmxlbmd0aDsKKyAgICAgICAgQmlnRGVjaW1hbCB0b3RhbCA9IG5ldyBCaWdEZWNpbWFsKChkb3VibGUpMCk7CisgICAgICAgIEJpZ0RlY2ltYWwgYnl0ZXMgPSBuZXcgQmlnRGVjaW1hbCgoZG91YmxlKWxlbik7CisgICAgICAgIE5pb1NlbmRlciBzZW5kZXIgPSBuZXcgTmlvU2VuZGVyKCk7CisgICAgICAgIHNlbmRlci5zZXREZXN0aW5hdGlvbihtYnIpOworICAgICAgICBzZW5kZXIuc2V0RGlyZWN0QnVmZmVyKHRydWUpOworICAgICAgICBzZW5kZXIuc2V0U2VsZWN0b3Ioc2VsZWN0b3IpOworICAgICAgICBzZW5kZXIuc2V0VHhCdWZTaXplKDEwMjQqMTAyNCk7CisgICAgICAgIHNlbmRlci5jb25uZWN0KCk7CisgICAgICAgIHNlbmRlci5zZXRNZXNzYWdlKGJ1Zik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV3JpdGluZyB0byA5OTk5Iik7CisgICAgICAgIGxvbmcgc3RhcnQgPSAwOworICAgICAgICBkb3VibGUgbWIgPSAwOworICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgRGVjaW1hbEZvcm1hdCBkZiA9IG5ldyBEZWNpbWFsRm9ybWF0KCIjIy4wMCIpOworICAgICAgICB3aGlsZSAoY291bnQ8MTAwMDAwKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZW5kZXIuc2V0TWVzc2FnZShidWYpOworICAgICAgICAgICAgaW50IHNlbGVjdGVkS2V5cyA9IDA7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlbGVjdGVkS2V5cyA9IHNlbGVjdG9yLnNlbGVjdCgwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNlbGVjdGVkS2V5cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gc2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTZWxlY3Rpb25LZXkgc2sgPSAoU2VsZWN0aW9uS2V5KSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlYWR5T3BzID0gc2sucmVhZHlPcHMoKTsKKyAgICAgICAgICAgICAgICAgICAgc2suaW50ZXJlc3RPcHMoc2suaW50ZXJlc3RPcHMoKSAmIH5yZWFkeU9wcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZW5kZXIucHJvY2VzcyhzaywgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCA9IHRvdGFsLmFkZChieXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5zZXRNZXNzYWdlKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBtYiArPSAoIChkb3VibGUpIGxlbikgLyAxMDI0IC8gMTAyNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKCAoKytjb3VudCkgJSAxMDAwMCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzZWNvbmRzID0gKCAoZG91YmxlKSAodGltZSAtIHN0YXJ0KSkgLyAxMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhyb3VnaHB1dCAiICsgZGYuZm9ybWF0KG1iIC8gc2Vjb25kcykgKyAiIE1CL3NlY29uZHMsIHRvdGFsICIrbWIrIiBNQiwgdG90YWwgIit0b3RhbCsiIGJ5dGVzLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBsZXRlLCBzbGVlcGluZyAxNSBzZWNvbmRzIik7CisgICAgICAgIFRocmVhZC5zbGVlcCgxNTAwMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvdHJhbnNwb3J0L1NvY2tldE5pb1ZhbGlkYXRlU2VuZC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvdHJhbnNwb3J0L1NvY2tldE5pb1ZhbGlkYXRlU2VuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNDE1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC90cmFuc3BvcnQvU29ja2V0TmlvVmFsaWRhdGVTZW5kLmphdmEKQEAgLTAsMCArMSw5MCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50ZXN0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQubmlvLk5pb1NlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5tZW1iZXJzaGlwLk1lbWJlckltcGw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uWEJ5dGVCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pby5DaGFubmVsRGF0YTsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitwdWJsaWMgY2xhc3MgU29ja2V0TmlvVmFsaWRhdGVTZW5kIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZWxlY3RvciBzZWxlY3RvciA9IFNlbGVjdG9yLm9wZW4oKTsKKyAgICAgICAgTWVtYmVyIG1iciA9IG5ldyBNZW1iZXJJbXBsKCJsb2NhbGhvc3QiLCA5OTk5LCAwKTsKKyAgICAgICAgYnl0ZSBzZXEgPSAwOworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNTAwMDBdOworICAgICAgICBBcnJheXMuZmlsbChidWYsc2VxKTsKKyAgICAgICAgaW50IGxlbiA9IGJ1Zi5sZW5ndGg7CisgICAgICAgIEJpZ0RlY2ltYWwgdG90YWwgPSBuZXcgQmlnRGVjaW1hbCgoZG91YmxlKTApOworICAgICAgICBCaWdEZWNpbWFsIGJ5dGVzID0gbmV3IEJpZ0RlY2ltYWwoKGRvdWJsZSlsZW4pOworICAgICAgICBOaW9TZW5kZXIgc2VuZGVyID0gbmV3IE5pb1NlbmRlcigpOworICAgICAgICBzZW5kZXIuc2V0RGVzdGluYXRpb24obWJyKTsKKyAgICAgICAgc2VuZGVyLnNldERpcmVjdEJ1ZmZlcih0cnVlKTsKKyAgICAgICAgc2VuZGVyLnNldFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICAgICAgc2VuZGVyLmNvbm5lY3QoKTsKKyAgICAgICAgc2VuZGVyLnNldE1lc3NhZ2UoYnVmKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXcml0aW5nIHRvIDk5OTkiKTsKKyAgICAgICAgbG9uZyBzdGFydCA9IDA7CisgICAgICAgIGRvdWJsZSBtYiA9IDA7CisgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAKKyAgICAgICAgRGVjaW1hbEZvcm1hdCBkZiA9IG5ldyBEZWNpbWFsRm9ybWF0KCIjIy4wMCIpOworICAgICAgICB3aGlsZSAoY291bnQ8MTAwMDAwKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZW5kZXIuc2V0TWVzc2FnZShidWYpOworICAgICAgICAgICAgaW50IHNlbGVjdGVkS2V5cyA9IDA7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlbGVjdGVkS2V5cyA9IHNlbGVjdG9yLnNlbGVjdCgwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNlbGVjdGVkS2V5cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gc2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTZWxlY3Rpb25LZXkgc2sgPSAoU2VsZWN0aW9uS2V5KSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlYWR5T3BzID0gc2sucmVhZHlPcHMoKTsKKyAgICAgICAgICAgICAgICAgICAgc2suaW50ZXJlc3RPcHMoc2suaW50ZXJlc3RPcHMoKSAmIH5yZWFkeU9wcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZW5kZXIucHJvY2VzcyhzaywgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCA9IHRvdGFsLmFkZChieXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcSsrOworICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmZpbGwoYnVmLHNlcSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIuc2V0TWVzc2FnZShidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgbWIgKz0gKCAoZG91YmxlKSBsZW4pIC8gMTAyNCAvIDEwMjQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICggKCsrY291bnQpICUgMTAwMDApID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2Vjb25kcyA9ICggKGRvdWJsZSkgKHRpbWUgLSBzdGFydCkpIC8gMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRocm91Z2hwdXQgIiArIGRmLmZvcm1hdChtYiAvIHNlY29uZHMpICsgIiBNQi9zZWNvbmRzLCB0b3RhbCAiK21iKyIgTUIsIHRvdGFsICIrdG90YWwrIiBieXRlcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBsZXRlLCBzbGVlcGluZyAxNSBzZWNvbmRzIik7CisgICAgICAgIFRocmVhZC5zbGVlcCgxNTAwMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvdHJhbnNwb3J0L1NvY2tldFJlY2VpdmUuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L3RyYW5zcG9ydC9Tb2NrZXRSZWNlaXZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiZTEwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L3RyYW5zcG9ydC9Tb2NrZXRSZWNlaXZlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50ZXN0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKKworcHVibGljIGNsYXNzIFNvY2tldFJlY2VpdmUgeworICAgIHN0YXRpYyBsb25nIHN0YXJ0ID0gMDsKKyAgICBzdGF0aWMgZG91YmxlIG1iID0gMDsKKyAgICBzdGF0aWMgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzgxOTIgKiA0XTsKKyAgICBzdGF0aWMgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgc3RhdGljIGludCBjb3VudCA9IDA7CisgICAgc3RhdGljIERlY2ltYWxGb3JtYXQgZGYgPSBuZXcgRGVjaW1hbEZvcm1hdCgiIyMuMDAiKTsKKyAgICBzdGF0aWMgQmlnRGVjaW1hbCB0b3RhbCA9IG5ldyBCaWdEZWNpbWFsKDApOworICAgIHN0YXRpYyBCaWdEZWNpbWFsIGJ5dGVzID0gbmV3IEJpZ0RlY2ltYWwoMzI4NzEpOworCisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgCisgICAgICAgIFNlcnZlclNvY2tldCBzcnZTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KDk5OTkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxpc3RlbmluZyBvbiA5OTk5Iik7CisgICAgICAgIFNvY2tldCBzb2NrZXQgPSBzcnZTb2NrZXQuYWNjZXB0KCk7CisgICAgICAgIHNvY2tldC5zZXRSZWNlaXZlQnVmZmVyU2l6ZSg0MzgwMCk7CisgICAgICAgIElucHV0U3RyZWFtIGluID0gc29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIHRydWUgKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFN0YXRzKHN0YXJ0LCBtYiwgY291bnQsIGRmLCB0b3RhbCk7CisgICAgICAgICAgICAgICAgICAgIH1jYXRjaCAoIEV4Y2VwdGlvbiB4ICkge30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQuc2V0RGFlbW9uKHRydWUpOworICAgICAgICB0LnN0YXJ0KCk7CisKKyAgICAgICAgd2hpbGUgKCB0cnVlICkgeworICAgICAgICAgICAgaWYgKCBmaXJzdCApIHsgZmlyc3QgPSBmYWxzZTsgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTt9CisgICAgICAgICAgICBpbnQgbGVuID0gaW4ucmVhZChidWYpOworICAgICAgICAgICAgaWYgKCBsZW4gPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRTdGF0cyhzdGFydCwgbWIsIGNvdW50LCBkZiwgdG90YWwpOworICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBieXRlcy5pbnRWYWx1ZSgpICE9IGxlbiApIGJ5dGVzID0gbmV3IEJpZ0RlY2ltYWwoKGRvdWJsZSlsZW4pOworICAgICAgICAgICAgdG90YWwgPSB0b3RhbC5hZGQoYnl0ZXMpOworICAgICAgICAgICAgbWIgKz0gKCAoZG91YmxlKSBsZW4pIC8gMTAyNCAvIDEwMjQ7CisgICAgICAgICAgICBpZiAoICgoKytjb3VudCkgJSAxMDAwMCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICBwcmludFN0YXRzKHN0YXJ0LCBtYiwgY291bnQsIGRmLCB0b3RhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFN0YXRzKGxvbmcgc3RhcnQsIGRvdWJsZSBtYiwgaW50IGNvdW50LCBEZWNpbWFsRm9ybWF0IGRmLCBCaWdEZWNpbWFsIHRvdGFsKSB7CisgICAgICAgIGxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBkb3VibGUgc2Vjb25kcyA9ICgoZG91YmxlKSh0aW1lLXN0YXJ0KSkvMTAwMDsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaHJvdWdocHV0ICIrZGYuZm9ybWF0KG1iL3NlY29uZHMpKyIgTUIvc2Vjb25kcyBtZXNzYWdlcyAiK2NvdW50KyIsIHRvdGFsICIrbWIrIiBNQiwgdG90YWwgIit0b3RhbCsiIGJ5dGVzLiIpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC90cmFuc3BvcnQvU29ja2V0U2VuZC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvdHJhbnNwb3J0L1NvY2tldFNlbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2FlODliCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvdHJhbnNwb3J0L1NvY2tldFNlbmQuamF2YQpAQCAtMCwwICsxLDUzIEBACitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRlc3QudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLm1lbWJlcnNoaXAuTWVtYmVySW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pby5YQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uQ2hhbm5lbERhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKKworcHVibGljIGNsYXNzIFNvY2tldFNlbmQgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTWVtYmVyIG1iciA9IG5ldyBNZW1iZXJJbXBsKCJsb2NhbGhvc3QiLCA5OTk5LCAwKTsKKyAgICAgICAgQ2hhbm5lbERhdGEgZGF0YSA9IG5ldyBDaGFubmVsRGF0YSgpOworICAgICAgICBkYXRhLnNldE9wdGlvbnMoQ2hhbm5lbC5TRU5EX09QVElPTlNfQllURV9NRVNTQUdFKTsKKyAgICAgICAgZGF0YS5zZXRBZGRyZXNzKG1icik7CisgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs4MTkyICogNF07CisgICAgICAgIGRhdGEuc2V0TWVzc2FnZShuZXcgWEJ5dGVCdWZmZXIoYnVmLGZhbHNlKSk7CisgICAgICAgIGJ1ZiA9IFhCeXRlQnVmZmVyLmNyZWF0ZURhdGFQYWNrYWdlKGRhdGEpOworICAgICAgICBpbnQgbGVuID0gYnVmLmxlbmd0aDsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNZXNzYWdlIHNpemU6IitsZW4rIiBieXRlcyIpOworICAgICAgICBCaWdEZWNpbWFsIHRvdGFsID0gbmV3IEJpZ0RlY2ltYWwoKGRvdWJsZSkwKTsKKyAgICAgICAgQmlnRGVjaW1hbCBieXRlcyA9IG5ldyBCaWdEZWNpbWFsKChkb3VibGUpbGVuKTsKKyAgICAgICAgU29ja2V0IHNvY2tldCA9IG5ldyBTb2NrZXQoImxvY2FsaG9zdCIsOTk5OSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV3JpdGluZyB0byA5OTk5Iik7CisgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGxvbmcgc3RhcnQgPSAwOworICAgICAgICBkb3VibGUgbWIgPSAwOworICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgRGVjaW1hbEZvcm1hdCBkZiA9IG5ldyBEZWNpbWFsRm9ybWF0KCIjIy4wMCIpOworICAgICAgICB3aGlsZSAoIGNvdW50PDEwMDAwMCApIHsKKyAgICAgICAgICAgIGlmICggZmlyc3QgKSB7IGZpcnN0ID0gZmFsc2U7IHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7fQorICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwwLGJ1Zi5sZW5ndGgpOworICAgICAgICAgICAgbWIgKz0gKCAoZG91YmxlKSBidWYubGVuZ3RoKSAvIDEwMjQgLyAxMDI0OworICAgICAgICAgICAgdG90YWwgPSB0b3RhbC5hZGQoYnl0ZXMpOworICAgICAgICAgICAgaWYgKCAoKCsrY291bnQpICUgMTAwMDApID09IDAgKSB7CisgICAgICAgICAgICAgICAgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgZG91YmxlIHNlY29uZHMgPSAoKGRvdWJsZSkodGltZS1zdGFydCkpLzEwMDA7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaHJvdWdocHV0ICIrZGYuZm9ybWF0KG1iL3NlY29uZHMpKyIgTUIvc2Vjb25kcyBtZXNzYWdlcyAiK2NvdW50KyIsIHRvdGFsICIrbWIrIiBNQiwgdG90YWwgIit0b3RhbCsiIGJ5dGVzLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG91dC5mbHVzaCgpOyAKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb21wbGV0ZSwgc2xlZXBpbmcgNSBzZWNvbmRzIik7CisgICAgICAgIFRocmVhZC5zbGVlcCg1MDAwKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L3RyYW5zcG9ydC9Tb2NrZXRUcmliZXNSZWNlaXZlLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC90cmFuc3BvcnQvU29ja2V0VHJpYmVzUmVjZWl2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYWQ1OGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90ZXN0L2phdmEvb3JnL2FwYWNoZS9jYXRhbGluYS90cmliZXMvdGVzdC90cmFuc3BvcnQvU29ja2V0VHJpYmVzUmVjZWl2ZS5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudGVzdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQ7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uWEJ5dGVCdWZmZXI7CisKK3B1YmxpYyBjbGFzcyBTb2NrZXRUcmliZXNSZWNlaXZlIHsKKyAgICBzdGF0aWMgbG9uZyBzdGFydCA9IDA7CisgICAgc3RhdGljIGRvdWJsZSBtYiA9IDA7CisgICAgLy9zdGF0aWMgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzMyODcxXTsKKyAgICBzdGF0aWMgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzMyODcxXTsKKyAgICBzdGF0aWMgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgc3RhdGljIGludCBjb3VudCA9IDA7CisgICAgc3RhdGljIERlY2ltYWxGb3JtYXQgZGYgPSBuZXcgRGVjaW1hbEZvcm1hdCgiIyMuMDAiKTsKKyAgICBzdGF0aWMgQmlnRGVjaW1hbCB0b3RhbCA9IG5ldyBCaWdEZWNpbWFsKChkb3VibGUpMCk7CisgICAgc3RhdGljIEJpZ0RlY2ltYWwgYnl0ZXMgPSBuZXcgQmlnRGVjaW1hbCgoZG91YmxlKTMyODcxKTsKKworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgc2l6ZSA9IDQzODAwOworICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwICkgdHJ5IHtzaXplPUludGVnZXIucGFyc2VJbnQoYXJnc1swXSk7fWNhdGNoKEV4Y2VwdGlvbiB4KXt9CisgICAgICAgIFhCeXRlQnVmZmVyIHhidWYgPSBuZXcgWEJ5dGVCdWZmZXIoNDM4MDAsdHJ1ZSk7CisgICAgICAgIFNlcnZlclNvY2tldCBzcnZTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KDk5OTkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxpc3RlbmluZyBvbiA5OTk5Iik7CisgICAgICAgIFNvY2tldCBzb2NrZXQgPSBzcnZTb2NrZXQuYWNjZXB0KCk7CisgICAgICAgIHNvY2tldC5zZXRSZWNlaXZlQnVmZmVyU2l6ZShzaXplKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHdoaWxlICggdHJ1ZSApIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50U3RhdHMoc3RhcnQsIG1iLCBjb3VudCwgZGYsIHRvdGFsKTsKKyAgICAgICAgICAgICAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIHggKSB7fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdC5zZXREYWVtb24odHJ1ZSk7CisgICAgICAgIHQuc3RhcnQoKTsKKworICAgICAgICB3aGlsZSAoIHRydWUgKSB7CisgICAgICAgICAgICBpZiAoIGZpcnN0ICkgeyBmaXJzdCA9IGZhbHNlOyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpO30KKyAgICAgICAgICAgIGludCBsZW4gPSBpbi5yZWFkKGJ1Zik7CisgICAgICAgICAgICBpZiAoIGxlbiA9PSAtMSApIHsKKyAgICAgICAgICAgICAgICBwcmludFN0YXRzKHN0YXJ0LCBtYiwgY291bnQsIGRmLCB0b3RhbCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4YnVmLmFwcGVuZChidWYsMCxsZW4pOworICAgICAgICAgICAgaWYgKCBieXRlcy5pbnRWYWx1ZSgpICE9IGxlbiApIGJ5dGVzID0gbmV3IEJpZ0RlY2ltYWwoKGRvdWJsZSlsZW4pOworICAgICAgICAgICAgdG90YWwgPSB0b3RhbC5hZGQoYnl0ZXMpOworICAgICAgICAgICAgd2hpbGUgKCB4YnVmLmNvdW50UGFja2FnZXModHJ1ZSkgPiAwICkgeworICAgICAgICAgICAgICAgIHhidWYuZXh0cmFjdFBhY2thZ2UodHJ1ZSk7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1iICs9ICggKGRvdWJsZSkgbGVuKSAvIDEwMjQgLyAxMDI0OworICAgICAgICAgICAgaWYgKCAoKGNvdW50KSAlIDEwMDAwKSA9PSAwICkgeworICAgICAgICAgICAgICAgIHByaW50U3RhdHMoc3RhcnQsIG1iLCBjb3VudCwgZGYsIHRvdGFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50U3RhdHMobG9uZyBzdGFydCwgZG91YmxlIG1iLCBpbnQgY291bnQsIERlY2ltYWxGb3JtYXQgZGYsIEJpZ0RlY2ltYWwgdG90YWwpIHsKKyAgICAgICAgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGRvdWJsZSBzZWNvbmRzID0gKChkb3VibGUpKHRpbWUtc3RhcnQpKS8xMDAwOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRocm91Z2hwdXQgIitkZi5mb3JtYXQobWIvc2Vjb25kcykrIiBNQi9zZWNvbmRzIG1lc3NhZ2VzICIrY291bnQrIiwgdG90YWwgIittYisiIE1CLCB0b3RhbCAiK3RvdGFsKyIgYnl0ZXMuIik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L3RyYW5zcG9ydC9Tb2NrZXRWYWxpZGF0ZVJlY2VpdmUuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NhdGFsaW5hL3RyaWJlcy90ZXN0L3RyYW5zcG9ydC9Tb2NrZXRWYWxpZGF0ZVJlY2VpdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGU1NmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvZ3JvdXBjb20vdGVzdC9qYXZhL29yZy9hcGFjaGUvY2F0YWxpbmEvdHJpYmVzL3Rlc3QvdHJhbnNwb3J0L1NvY2tldFZhbGlkYXRlUmVjZWl2ZS5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudGVzdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQ7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CisKK3B1YmxpYyBjbGFzcyBTb2NrZXRWYWxpZGF0ZVJlY2VpdmUgeworICAgIHN0YXRpYyBsb25nIHN0YXJ0ID0gMDsKKyAgICBzdGF0aWMgZG91YmxlIG1iID0gMDsKKyAgICBzdGF0aWMgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzgxOTIgKiA0XTsKKyAgICBzdGF0aWMgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgc3RhdGljIGludCBjb3VudCA9IDA7CisgICAgc3RhdGljIERlY2ltYWxGb3JtYXQgZGYgPSBuZXcgRGVjaW1hbEZvcm1hdCgiIyMuMDAiKTsKKyAgICBzdGF0aWMgQmlnRGVjaW1hbCB0b3RhbCA9IG5ldyBCaWdEZWNpbWFsKDApOworICAgIHN0YXRpYyBCaWdEZWNpbWFsIGJ5dGVzID0gbmV3IEJpZ0RlY2ltYWwoMzI4NzEpOworCisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBzaXplID0gNDM4MDA7CisgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDAgKSB0cnkge3NpemU9SW50ZWdlci5wYXJzZUludChhcmdzWzBdKTt9Y2F0Y2goRXhjZXB0aW9uIHgpe30KKyAgIAorICAgICAgICBTZXJ2ZXJTb2NrZXQgc3J2U29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCg5OTk5KTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMaXN0ZW5pbmcgb24gOTk5OSIpOworICAgICAgICBTb2NrZXQgc29ja2V0ID0gc3J2U29ja2V0LmFjY2VwdCgpOworICAgICAgICBzb2NrZXQuc2V0UmVjZWl2ZUJ1ZmZlclNpemUoc2l6ZSk7CisgICAgICAgIElucHV0U3RyZWFtIGluID0gc29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIE15RGF0YVJlYWRlciByZWFkZXIgPSBuZXcgTXlEYXRhUmVhZGVyKDUwMDAwKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHdoaWxlICggdHJ1ZSApIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50U3RhdHMoc3RhcnQsIG1iLCBjb3VudCwgZGYsIHRvdGFsKTsKKyAgICAgICAgICAgICAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIHggKSB7fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdC5zZXREYWVtb24odHJ1ZSk7CisgICAgICAgIHQuc3RhcnQoKTsKKworICAgICAgICB3aGlsZSAoIHRydWUgKSB7CisgICAgICAgICAgICBpZiAoIGZpcnN0ICkgeyBmaXJzdCA9IGZhbHNlOyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpO30KKyAgICAgICAgICAgIGludCBsZW4gPSBpbi5yZWFkKGJ1Zik7CisgICAgICAgICAgICBpZiAoIGxlbiA9PSAtMSApIHsKKyAgICAgICAgICAgICAgICBwcmludFN0YXRzKHN0YXJ0LCBtYiwgY291bnQsIGRmLCB0b3RhbCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3VudCArPSByZWFkZXIuYXBwZW5kKGJ1ZiwwLGxlbik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICggYnl0ZXMuaW50VmFsdWUoKSAhPSBsZW4gKSBieXRlcyA9IG5ldyBCaWdEZWNpbWFsKChkb3VibGUpbGVuKTsKKyAgICAgICAgICAgIHRvdGFsID0gdG90YWwuYWRkKGJ5dGVzKTsKKyAgICAgICAgICAgIG1iICs9ICggKGRvdWJsZSkgbGVuKSAvIDEwMjQgLyAxMDI0OworICAgICAgICAgICAgaWYgKCAoKGNvdW50KSAlIDEwMDAwKSA9PSAwICkgeworICAgICAgICAgICAgICAgIHByaW50U3RhdHMoc3RhcnQsIG1iLCBjb3VudCwgZGYsIHRvdGFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50U3RhdHMobG9uZyBzdGFydCwgZG91YmxlIG1iLCBpbnQgY291bnQsIERlY2ltYWxGb3JtYXQgZGYsIEJpZ0RlY2ltYWwgdG90YWwpIHsKKyAgICAgICAgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGRvdWJsZSBzZWNvbmRzID0gKChkb3VibGUpKHRpbWUtc3RhcnQpKS8xMDAwOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRocm91Z2hwdXQgIitkZi5mb3JtYXQobWIvc2Vjb25kcykrIiBNQi9zZWNvbmRzIG1lc3NhZ2VzICIrY291bnQrIiwgdG90YWwgIittYisiIE1CLCB0b3RhbCAiK3RvdGFsKyIgYnl0ZXMuIik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlEYXRhUmVhZGVyIHsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVs0MzgwMF07CisgICAgICAgIGludCBsZW5ndGggPSAxMDsKKyAgICAgICAgaW50IGN1ciA9IDA7CisgICAgICAgIGJ5dGUgc2VxID0gMDsKKyAgICAgICAgcHVibGljIE15RGF0YVJlYWRlcihpbnQgbGVuKSB7CisgICAgICAgICAgICBsZW5ndGggPSBsZW47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBpbnQgYXBwZW5kKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCBwYWNrYWdlcyA9IDA7CisgICAgICAgICAgICBmb3IgKCBpbnQgaT1vZmY7IGk8bGVuOyBpKysgKSB7IAorICAgICAgICAgICAgICAgIGlmICggY3VyID09IGxlbmd0aCApIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc2VxKys7CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggYltpXSAhPSBzZXEgKSB0aHJvdyBuZXcgRXhjZXB0aW9uKCJtaXNtYXRjaCBvbiBzZXE6IitzZXErIiBhbmQgYnl0ZSBucjoiK2N1cisiIGNvdW50OiIrY291bnQrIiBwYWNrYWdlczoiK3BhY2thZ2VzKTsKKyAgICAgICAgICAgICAgICBjdXIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwYWNrYWdlczsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90by1kby50eHQgYi9jb250YWluZXIvbW9kdWxlcy9ncm91cGNvbS90by1kby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjZGNjNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2dyb3VwY29tL3RvLWRvLnR4dApAQCAtMCwwICsxLDMxNyBAQAorVG8gRG86Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0RvY3VtZW50YXRpb246Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgV2h5IGlzIHRyaWJlcyB1bmlxdWUgY29tcGFyZWQgdG8gSkdyb3Vwcy9BcHBpYSBhbmQgb3RoZXIgZ3JvdXAgY29tbSBwcm90b2NvbHMKKworIDEuIFVzZXMgTklPIGFuZCBUQ1AgZm9yIGd1YXJhbnRlZWQgZGVsaXZlcnkgYW5kIHRoZSBhYmlsaXR5IHRvIGpvaW4gbGFyZ2UgZ3JvdXBzCisKKyAyLiBHdWFyYW50ZWVzIG1lc3NhZ2VzIHRoZSBmb2xsb3dpbmcgd2F5CisgICAgYSkgVENQIG1lc3NhZ2luZywgd2l0aCBhIGZvbGxvd2luZyBSRUFEIGZvciBOSU8gdG8gZW5zdXJlIG5vbiBicm9rZW4gY2hhbm5lbAorICAgIGIpIEFDSyBtZXNzYWdlcyBmcm9tIHRoZSByZWNlaXZlcgorICAgIGMpIEFDSyBhZnRlciBwcm9jZXNzaW5nCisKKyAzLiBTYW1lIChzaW5nbGUpIGNoYW5uZWwgY2FuIGhhbmRsZSBhbGwgdHlwZXMgb2YgZ3VhcmFudGVlcyAoYSxiLGMpIGF0IHRoZSBzYW1lIHRpbWUKKyAgICBhbmQgYm90aCBwcm9jZXNzIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgbWVzc2FnaW5nLgorICAgIFRoaXMgaXMga2V5IHRvIHN1cHBvcnQgZGlmZmVyZW50IHJlcXVpcmVtZW50cyBmb3IgbWVzc2FnaW5nIHRocm91Z2gKKyAgICB0aGUgc2FtZSBjaGFubmVsIHRvIHNhdmUgc3lzdGVtIHJlc291cmNlcy4KKworIDQuIEZvciBhc3luYyBtZXNzYWdpbmcsIGVycm9ycyBhcmUgcmVwb3J0ZWQgdGhyb3VnaCBhbiBlcnJvciBoYW5kbGVyLCBjYWxsYmFjaworCisgNS4gQWJpbGl0eSB0byBzZW5kIG9uIG11bHRpcGxlIHN0cmVhbXMgYXQgdGhlIHNhbWUgdGltZSwgaW4gcGFyYWxsZWwsIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKKworIDYuIERlc2lnbmVkIHdpdGggcmVwbGljYXRpb24gaW4gbWluZCwgdGhhdCBzb21lIHBpZWNlcyBvZiBkYXRhIGRvbid0IG5lZWQgdG8gYmUgdG90YWxseSBvcmRlcmVkLgorCisgNy4gSXRzIG5vdCBidWlsdCB3aXRoIHRoZSB1bmlmb3JtIGdyb3VwIG1vZGVsIGluIG1pbmQsIGJ1dCBpdCBjYW4gYmUgYWNjb21wbGlzaGVkIHVzaW5nIGludGVyY2VwdG9ycy4KKworIDguIEZ1dHVyZSB2ZXJzaW9uIHdpbGwgaGF2ZSBXQU4gbWVtYmVyc2hpcCBhbmQgcmVwbGljYXRpb24KKworIDkuIFNpbGVudCBtZW1iZXJzLCB0aGUgYWJpbGl0eSB0byBzZW5kIG1lc3NhZ2VzIHRvIGEgbm9kZSBub3QgaW4gdGhlIG1lbWJlcnNoaXAKKworMTAuIFNlbmRlciBidXJzdCwgY29uY3VycmVudCBtZXNzYWdpbmcgYmV0d2VlbiB0d28gb3IgbW9yZSBub2RlcworCisxMS4gTXVsdGljYXN0aW5nIGNhbiBzdGlsbCBiZSBkb25lIG9uIGEgcGVyIG1lc3NhZ2UgYmFzaXMgdXNpbmcgYSBNdWx0aWNhc3RJbnRlcmNlcHRvcgorCitCdWdzOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIGEpIFNvbWVob3cgdGhlIGZpcnN0IE5JTyBjb25uZWN0aW9uIG1hZGUsIGFsd2F5cyBjbG9zZXMgZG93biwgd2h5CisKKyBiKSBwdWxsIHRoZSBuZXR3b3JrIGNvcmQgYW5kIHdhdGNoIHRoZSBtZW1iZXJzaGlwIGxheWVyIGZyZWFrIG91dAorIAorIGMpIEFic3RyYWN0UmVwbGljYXRlZE1hcC5zaXplKCkgdGhyb3dzIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24sCisgICAgaW1wbGVtZW50IGEgc2l6ZSBjb3VudGVyIGluc3RlYWQKKworQ29kZSBUYXNrczoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzUxLiBOaW9TZW5kZXIuc2V0RGF0YSBzaG91bGQgbm90IGV4cGFuZCB0aGUgYnl0ZSBidWZmZXIgaWYgaXRzIHRvbyBsYXJnZQorICAgIGluc3RlYWQganVzdCByZWZpbGwgaXQgZnJvbSB0aGUgWEJ5dGVCdWZmZXIKKworNTAuIE9uIHRvcCBvZiB2ZXJzaW9uaW5nLCBpbXBsZW1lbnQgdmVyc2lvbiBzeW5jcyBmcm9tIHByaW1hcnkgdG8gYmFja3VwCisgICAgT3Igd2hlbiBhIGJhY2t1cCByZWNlaXZlcyBhbiB1cGRhdGUgdGhhdCBpcyBvdXQgb2Ygc3luYworCis0OS4gSW1wbGVtZW50IHZlcnNpb25pbmcgb24gdGhlIEFic3RyYWN0UmVwbGljYXRlZE1hcAorCis0OC4gUGVyaW9kaWMgcmVmcmVzaCBvZiB0aGUgcmVwbGljYXRlZCBtYXAgKHByaW1hcnkgLT5iYWNrdXApCisKKzQ3LiBEZWx0YShzZXNzaW9uKSB2ZXJzaW9uaW5nLiBpbmNyZWFzZSB2ZXJzaW9uIG51bWJlciBlYWNoIHRpbWUsIGVhc2llciB0byBrZWVwIG1hcHMgaW4gc3luYworCis0MS4gQnVpbGQgYSB0aXBpIHRoYXQgaXMgYSBzb2Z0IG1lbWJlcnNoaXAKKworMzguIE1ha2UgdGhlIEFic3RyYWN0UmVwbGljYXRlZE1hcCBhY2NlcHQgbm9uIHNlcmlhbGl6YWJsZSBlbGVtZW50cywgYnV0IGp1c3QgZG9uJ3QgcmVwbGljYXRlIHRoZW0KKworMzYuIFVEUCBTZW5kZXIgYW5kIFJlY2VpdmVyLCBpbml0aWFsbHkgd2l0aG91dCBmbG93IGNvbnRyb2wgYW5kIGd1YXJhbnRlZWQgZGVsaXZlcnkuCisgICAgVGhpcyBjYW4gYmUgZWFzaWx5IGRvbmUgYXMgYW4gaW50ZXJjZXB0b3IsIGFuZCBvcGVyYXRlIGluIHBhcmFsbGVsIHdpdGggdGhlIFRDUCBzZW5kZXIuCisgICAgSXQgY2FuIGltcGxlbWVudCBhbiBhdXRvIGRldGVjdCwgc28gdGhhdCBpZiB0aGUgbWVzc2FnZSBpcyBnb2luZyB0byBhIGRlc3RpbmF0aW9uIGluIHRoZSBzYW1lIG5ldHdvcmsKKyAgICBwYXRjaCwgdGhlbiBzZW5kIGl0IG92ZXIgVURQLgorCiszNS4gVGhlIGFiaWxpdHkgdG8gc2hhcmUgb25lIGNoYW5uZWwgYW1vbmdzdCBtdWx0aXBsZSBwcm9jZXNzZXMKKworMzIuIFJlcGxpY2F0ZWQgSk5ESSBlbnRyaWVzIGluIFRvbWNhdCBpbiB0aGUgZm9ybWF0CisgICAgY2x1c3Rlcjo8bWFwIG5hbWU+LzxlbnRyeSBrZXk+IGZvciBleGFtcGxlCisgICAgY2x1c3RlcjpteWFwcHMvZGIvc2hhcmVkL2RiaW5mbworCiszMS4gQSBsYXllciBvbiB0b3Agb2YgdGhlIEdyb3VwQ2hhbm5lbCwgdG8gYWxsb3cgbXVsdGlwbGUgcHJvY2Vzc2VzIHNoYXJlCisgICAgYSBjaGFubmVsIHRvIHNlbmQvcmVjZWl2ZSBtZXNzYWdlIHRvIGNvbnNlcnZlIHN5c3RlbSByZXNvdXJjZXMgLSB0aGlzIGlzIHdheSBpbiB0aGUgZnV0dXJlLgorCiszMC4gQ29va2llQmFzZWRSZXBsaWNhdGlvbk1hcCAtIGEgdmVyeSBzaW1wbGUgZXh0ZW5zaW9uIHRvIHRoZSBMYXp5UmVwbGljYXRlZE1hcAorICAgIGJ1dCBpbnN0ZWFkIG9mIHJhbmRvbWx5IHNlbGVjdGluZyBhIGJhY2t1cCBub2RlIGFuZCB0aGVuIHB1Ymxpc2hpbmcgdGhlIFBST1hZIHRvIGFsbAorICAgIHRoZSBvdGhlciBub2RlcyBpbiB0aGUgZ3JvdXAsIHRoaXMgd2lsbCBzaW1wbHkKKyAgICByZWFkL3dyaXRlIGEgY29va2llLCBmb3IgYSBiYWNrdXAgbG9jYXRpb24sIHNvIHRoZSBub2RlcyB3aWxsCisgICAgbmV2ZXIga25vdyB1bnRpbCB0aGUgcmVxdWVzdCBjb21lcyBpbi4KKyAgICBUaGlzIGlzIHVzZWZ1bCBpbiBleHRyZW1lbHkgbGFyZ2UgY2x1c3RlcnMsIGFuZCBlc3NlbnRpYWxseSByZWR1Y2VzCisgICAgdmVyeSBtdWNoIG9mIHRoZSBuZXR3b3JrIGNoYXR0ZXIsIHRoaXMgdGFzayBpcyBkZXBlbmRlbnQgb24gdGFzazI1CisgICAgUXVlc3Rpb24gdG8gYmUgYW5zd2VyZWQ6IEhvdyBkb2VzIHRoZSBtYXAga25vdyBvZiB0aGUgY29va2llPworICAgIFBvdGVudGlhbCBhbnN3ZXI6IFVzZSBhIHRocmVhZCBsb2NhbCBhbmQgYmluZCB0aGUgcmVxdWVzdC9yZXNwb25zZSB0byBpdAorICAgIFF1ZXN0aW9uOiBpcyB0aGVyZSBvbmUgY29va2llIHBlciBtYXAsIG9yIG9uZSBjb29raWUgcGVyIHNlcnZlci4KKyAgICBQb3RlbnRpYWwgYW5zd2VyOiBPbmUgY29va2llIHBlciBhcHAgYWxsb3dzIGZvciBoZXRlcm9nZW5vdXMgaW5zdGFuY2VzCisgICAgICAgICAgICAgICAgICAgICAgaXMgdGhlcmUgYSBsaW1pdCBvbiBudW1iZXIgb2YgY29va2llcworICAgICAgICAgICAgICAgICAgICAgIHBlciBuZXRzY2FwZSBhbmQgUkZDIDIxMDksIHNlY3Rpb24gNi4zLCwgaXRzIDIwCisgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3dwLm5ldHNjYXBlLmNvbS9uZXdzcmVmL3N0ZC9jb29raWVfc3BlYy5odG1sCisgICAgVG8gd29yayBhcm91bmQgdGhlIGNvb2tpZSBsaW1pdCBwcm9ibGVtIHRoZXJlIHdvdWxkIGJlIGEgc3VnZ2VzdGVkIHNldHRpbmcKKyAgICBvZiBzdG9yaW5nIHRoZSBwcmVmZXJyZWQgYmFja3VwIG9yZGVyLCBvciBzaW1wbHkgcmVxdWlyZSBob21vZ2VuZW91cyBpbnN0YW5jZXMuCisKKzI5LiBUaHJlYWQgcG9vbCwgc2hyaW5rIGR5bmFtaWNhbGx5CisKKzI3LiBYbWxDb25maWd1cmF0b3IgLSByZWFkIGFuIFhNTCBmaWxlIHRvIGNvbmZpZ3VyZSB0aGUgY2hhbm5lbC4KKworMjYuIEpORElDaGFubmVsIC0gYSB3YXkgdG8gYmluZCB0aGUgZ3JvdXAgY2hhbm5lbCBpbiBhIEpOREkgdHJlZSwKKyAgICBzbyB0aGF0IHNoYXJlZCByZXNvdXJjZXMgY2FuIGFjY2VzcyBpdC4KKworMjMuIFRvdGFsT3JkZXJJbnRlcmNlcHRvciAtIGZhaXJseSBzdHJhaWdodCBmb3J3YXJkIGltcGxlbWVudGF0aW9uCisgICAgVGhpcyBpbnRlcmNlcHRvciB3b3VsZCBkZXBlbmQgb24gdGhlIGZhY3QgdGhhdCB0aGVyZSBpcyBzb21lIHNvcnQgb2YKKyAgICBtZW1iZXJzaGlwIGNvb3JkaW5hdG9yLCBzZWUgdGFzayA5LgorICAgIE9uY2UgdGhlcmUgaXMgYSBjb29yZGluYXRvciBpbiB0aGUgZ3JvdXAsIHRoZSB0b3RhbCBvcmRlciBwcm90b2NvbCBpcyB0aGUgc2FtZQorICAgIGFzIHRoZSBPcmRlckludGVyY2VwdG9yLCBleGNlcHQgdGhhdCBpdCBnZXRzIGl0cyBtZXNzYWdlIG51bWJlciBmcm9tCisgICAgdGhlIGNvb3JkaW5hdG9yLCBwcmlvciB0byBzZW5kaW5nIGl0IG91dC4KKyAgICBUaGUgVG90YWxPcmRlckludGVyY2VwdG9yLCB3aWxsIGtlZXAgYSBvcmRlciBudW1iZXIgcGVyIG1lbWJlciwKKyAgICB0aGlzIHdheSwgb3JkZXJpbmcgaXMga2VwdCBpbnRhY3Qgd2hlbiBkaWZmZXJlbnQgbWVzc2FnZXMgYXJlIHNlbnQKKyAgICB0d28gZGlmZmVyZW50IG1lbWJlcnMsIGllCisgICAgTWVzc2FnZSBBIC0gYWxsIG1lbWJlcnMgLSB0b3RhbCBvcmRlciAobWJyQS0yLCBtYnJCLTIsIG1ickMtMiwgbWJyRC0yKQorICAgIE1lc3NhZ2UgQiAtIG1ickMsbWJyRCBvbmx5IC0gdG90YWwgb3JkZXIgKG1ickEtMiwgbWJyQi0yLCBtYnJDLTMsIG1ickQtMykKKyAgICAtIFRoZSBjb21iaW5hdGlvbiBvZiBNZW1iZXIgdW5pcXVlSWQsb3JkZXJJZCBpcyB1bmlxdWUsIG5vdGhpbmcgZWxzZQorICAgICAgdGhpcyB3YXksIGlmIGEgbWVtYmVyIGNyYXNoZXMsIHdlIGRvbid0IGhvbGQgdGhlIHF1ZXVlLCBpbnN0ZWFkIHdlIHN0YXJ0IG92ZXIuCisgICAgLSBBIFRvdGFsT3JkZXIgdG9rZW4sIHdpbGwgY29udGFpbiB0aGUgY29vcmRpbmF0b3IgdW5pcXVlSWQgYXMgd2VsbC4KKyAgICAtIE9uZSBwYXJhbWV0ZXIgc2hvdWxkIGJlICJyZWNlaXZlIHNlcXVlbmNlIHRpbWVvdXQiIGluY2FzZSB0aGUgY29vcmRpbmF0b3IgaXMgbm90IHJlc3BvbmRpbmcuCisgICAgLSBPUFRJT04gQSkKKyAgICAgIHRoZSBjb29yZGluYXRvciBkb2Vzbid0IGZvcndhcmQgdGhlIG1lc3NhZ2UKKyAgICAgIHNpbmNlIHRoZSBhcHAgd2lsbCBub3QgcmVjZWl2ZSB0aGUgcHJvcGVyIGVycm9yIG1lc3NhZ2UsCisgICAgICBpbnN0ZWFkIHRoZSBzZXF1ZW5jZXIganVzdCByZXR1cm5zIHRoZSBzZXF1ZW5jZSwgdGhlbiB0aGUgbWVtYmVyIGl0c2VsZiBzZW5kcyB0aGUgbWVzc2FnZQorICAgICAgcHJvczogdGhlIGFwcCB3aWxsIGZpbmQgb3V0IGlmIHRoZSBzZW5kIGZhaWxlZC9zdWNjZWVkZWQKKyAgICAgIGNvbnM6IGlmIHRoZSBzZW5kIGZhaWxzLCB0aGUgc2VxdWVuY2VyIGlzIG91dCBvZiBzeW5jIGZvciB0aGUgZmFpbGVkIG1lbWJlcgorICAgICAgT1BUSU9OIEIpCisgICAgICBUaGUgY29vcmRpbmF0b3IsIHJlY2VpdmVzIHRoZSBtZXNzYWdlLCBhZGRzIG9uIHRoZSBzZXF1ZW5jZSBudW1iZXIKKyAgICAgIHRoZW4gc2VuZHMgdGhlIG1lc3NhZ2Ugb24gYmVoYWxmIG9mIHRoZSByZXF1ZXN0aW5nIG1lbWJlcnMKKyAgICAgIHByb3M6IHNlcXVlbmNlciBpcyBpbiBjaGFyZ2Ugb2YgdGhlIHNlcXVlbmNlCisgICAgICBjb25zOiB0aGUgc2VxdWVuY2UgY2FuIGJlY29tZSBvdmVybG9hZGVkLCBzaW5jZSBpdCBoYXMgdG8gZG8gYWxsIHRoZSB0cmFmZmljaW5nCisgICAgICAgICAgICB0aGUgcmVxdWVzdGluZyBtZW1iZXIgd2lsbCBub3Qga25vdyBpZiB0aGUgbWVzc2FnZSBmYWlsZWQvc3VjY2VlZGVkCisgICAgICBPUFRJT04gQykgUmVzZWFyY2ggcGFwZXJzIG9uIHRvdGFsIG9yZGVyLCBiZXR0ZXIgYWxnb3JpdGhtcyBleGlzdC4KKyAgICAgIE5PVEVTISBUSElTIENBTlQgQkUgRE9ORSBVU0lORyBBIFNFUVVFTkNFUiBUSEFUIFNFTkRTIFRIRSBNRVNTQUdFIFNJTkNFIFdFCisgICAgICBMT1NFIFRIRSBBQklMSVRZIFRPIFJFUE9SVCBGRUVEQkFDSworCisyMS4gSW1wbGVtZW50IGEgV0FOIG1lbWJlcnNoaXAgbGF5ZXIsIHVzaW5nIGEgV0FOTWJySW50ZXJjZXB0b3IgYW5kIGEKKyAgICBXQU4gUm91dGVyL0ZvcndhcmRlciAoVGlwaSBvbiB0b3Agb2YgYSBNYW5hZ2VkQ2hhbm5lbCkKKworMjAuIEltcGxlbWVudCBhIFRDUCBtZW1iZXJzaGlwIGludGVyY2VwdG9yLCBmb3IgZ3VhcmFudGVlZCBmdW5jdGlvbmFsaXR5LCBub3QganVzdCBkaXNjb3ZlcnkKKworMTguIEltcGxlbWVudCBTU0wgZW5jcnlwdGlvbiBvdmVyIG1lc3NhZ2UgdHJhbnNmZXJzLCBCSU8gYW5kIE5JTworCis4LiBXYWl0Rm9yQ29tcGxldGlvbkludGVyY2VwdG9yIC0gd2FpdHMgZm9yIHRoZSBtZXNzYWdlIHRvIGdldCBwcm9jZXNzZWQgYnkgYWxsIHJlY2VpdmVycyBiZWZvcmUgcmV0dXJuaW5nCisgICAoVGhpcyBpcyB1c2VmdWwgd2hlbiBzeW5jaHJvbml6ZWQ9ZmFsc2UgYW5kIHdhaXRGb3JBY2s9ZmFsc2UsIHRvIGltcHJvdmUKKyAgIHBhcmFsbGVsIHByb2Nlc3NpbmcsIGJ1dCB5b3Ugd2FudCB0byBoYXZlIGFsbCBtZXNzYWdlcyBzZW50IGluIHBhcmFsbGVsIGFuZAorICAgZG9uJ3QgcmV0dXJuIHVudGlsIGFsbCBoYXZlIGJlZW4gcHJvY2Vzc2VkIG9uIHRoZSByZW1vdGUgZW5kLikKKworMTEuIENvZGUgYSBSZXBsaWNhdGVkRmlsZVN5c3RlbSBleGFtcGxlLCBwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudGlwaXMKKworMTMuIFN0YXRlVHJhbnNmZXIgaW50ZXJjZXB0b3IKKyAgICB0aGUgaWRlYXMganVzdCBjb21lIHVwIGluIG15IGhlYWQuIHRoZSBzdGF0ZSB0cmFuc2ZlciBpbnRlcmNlcHRvcgorICAgIHdpbGwgaG9sZCBhbGwgaW5jb21pbmcgbWVzc2FnZXMgdW50aWwgaXQgaGFzIHJlY2VpdmVkIGEgbWVzc2FnZQorICAgIHdpdGggYSBTVEFURV9UUkFOU0ZFUiBoZWFkZXIgYXMgdGhlIGZpcnN0IG9mIHRoZSBieXRlcy4KKyAgICBPbmNlIGl0IGhhcyByZWNlaXZlZCBzdGF0ZSwgaXQgd2lsbCBwcmV0dHkgbXVjaCB0YWtlIGl0c2VsZiBvdXQgb2YgdGhlIGxvb3AKKyAgICBUaGUgYmVuZWZpdCBvZiB0aGUgbmV3IFBhcmFsbGVsTmlvU2VuZGVyIGlzIHRoYXQgaXQgZG9lc24ndCByZXF1aXJlIHRvIGtub3cgYWJvdXQKKyAgICBhIG1lbWJlciB0byB0cmFuc2ZlciBzdGF0ZSwgYWxsIGl0IGhhcyB0byBkbyBpcyB0byByZXBseSB0byBhIG1lc3NhZ2UgdGhhdCBjYW1lIGluLgorICAgIFN0YXRlIGlzIGEgb25lIHRpbWUgZGVhbCBmb3IgdGhlIGVudGlyZSBjaGFubmVsLCBzbyBhCisgICAgc2Vzc2lvbiByZXBsaWNhdGlvbiBjbHVzdGVyLCB3b3VsZCB0cmFuc2ZlciBzdGF0ZSBhcyBvbmUgYmxvY2ssIG5vdCBvbmUgcGVyIGNvbnRleHQKKworMTQuIEtlZXBhbGl2ZSBjb3VudCBhbmQgaWRsZSBraWxsIG9mZiBmb3IgTmlvIHNlbmRlcnMKKworMTcuIEltcGxlbWVudCB0cmFuc2FjdGlvbnMgLSB0aGUgYWJpbGl0eSB0byBzdGFydCBhIHRyYW5zYWN0aW9uLCBzZW5kIHNldmVyYWwgbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24KKworVGFza3MgQ29tcGxldGVkCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisxLiBUcnVlIHN5bmNocm9uaXplZC9hc3luY2hyb25pemVkIHJlcGxpY2F0aW9uIGVuYWJsZWQgdXNpbmcgZmxhZ3MKK1NlbmRlci5zZW5kQWNrL1JlY2VpdmVyLndhaXRGb3JBY2svUmVjZWl2ZXIuc3luY2hyb25pemVkCitUYXNrIERlc2M6IHdhaXRGb3JBY2sgLSBzaG91bGQgb25seSBtZWFuLCB3ZSByZWNlaXZlZCB0aGUgbWVzc2FnZSwgbm90IGZvciB0aGUKK21lc3NhZ2UgdG8gZ2V0IHByb2Nlc3Nlc2VkLiBUaGlzIHNob3VsZCBpbXByb3ZlIHRocm91Z2hwdXQsIGFuZCBhbiBpbnRlcmNlcHRvcgorY2FuIGRvIHdhaXRGb3JDb21wbGV0aW9uCitTdGF0dXM6IENvbXBsZXRlCitOb3RlczoKKworMi4gVW5pcXVlIGlkLCBzZW5kIGl0IGluIGJ5dGUgYXJyYXkgaW5zdGVhZCBvZiBzdHJpbmcKKworMy4gRGF0YVNlbmRlciBvciBSZXBsaWNhdGlvblRyYW5zbWl0dGVyIHN3YWxsb3dzIElPRXhjZXB0aW9uLCB0aGlzIHNob3VsZCBiZQorTm90ZXM6IFRoaXMgaGFzIG9ubHkgYmVlbiBmaXhlZCBmb3IgdGhlIHBvb2xlZCBzeW5jaHJvbml6ZWQuIHRoZSBmYXN0YXN5bmNoCithaW50IHdvcmtpbmcgdGhhdCB3ZWxsCisKKzQuIENoYW5uZWxNZXNzYWdlLmdldE1lc3NhZ2Ugc2hvdWxkIHJldHVybiBzdHJlYW1hYmxlLCB0aGF0IHdheSB3ZSBjYW4gd3JhcCwKK3Bhc3MgaXQgYXJvdW5kIGFuZCBhbGwgdGhvc2UgZ29vZCB0aGluZ3Mgd2l0aG91dCBoYXZpbmcgdG8gY29weSBieXRlIGFycmF5cworbGVmdCBhbmQgcmlnaHQKK05vdGVzOiBJbnN0ZWFkIG9mIHVzaW5nIGEgc3RyZWFtYWJsZSwgdGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgWEJ5dGVCdWZmZXIsCisgICAgICAgd2hpY2ggaXMgdmVyeSBlYXN5IHRvIHVzZS4gSXQgYWxzbyBiZWNvbWVzIGEgc2luZ2xlIHNwb3QgZm9yIG9wdGltaXphdGlvbnMuCisgICAgICAgSWRlYWxseSwgdGhlcmUgd291bGQgYmUgYSBwb29sIG9mIFhCeXRlQnVmZmVycywgdGhhdCBhbGwgdXNlIGRpcmVjdCBCeXRlQnVmZmVycworICAgICAgIGZvciBpdHMgZGF0YSBoYW5kbGluZy4KKworNS4gT3JkZXJJbnRlcmNlcHRvciAtIGd1YXJhbnRlZXMgdGhlIG9yZGVyIG9mIG1lc3NhZ2VzCitOb3RlczogY29tcGxldGVkCisKKzYuIE5JTyBhbmQgSU8gRGF0YVNlbmRlciwgc2luY2UgdGhlIElPIGlzIGJsb2NraW5nCitOb3RlczogY29tcGxldGVkLiB3b3JrcyB2ZXJ5IHdlbGwsIGhhdmUgbm90IGltcGxlbWVudGVkIHN1c3BlY3QgZXJyb3IgbG9nZ2luZy4KKworNy4gRnJhZ21lbnRhdGlvbkludGVyY2VwdG9yIC0gc3BsaXRzIHVwIG1lc3NhZ2VzIHRoYXQgYXJlIGxhcmdlciB0aGFuIFggYnl0ZXMuCitOb3RlczogY29tcGxhdGVkCisKKzE1LiByZW1vdmUgRGF0YVNlbmRlckZhY3RvcnkgYW5kIERhdGFTZW5kZXIucHJvcGVydGllcyAtCisgICAgdGhlc2UgY2F1c2UgdGhlIHNldHRpbmdzIHRvIGJlIGhhcmQgY29kZWQgYW50IG5vdCBwbHVnZ2FibGUuCitOb3RlczogQ29tcGxldGVkLCBub3cgeW91IGNhbiBpbml0aWFsaXplIGEgdHJhbnNwb3J0IGNsYXNzCisKKzEyLiBMYXp5UmVwbGljYXRlZEhhc2hNYXAgLSBtZW1vcnkgZWZmaWNpZW50IGNsdXN0ZXJlZCBtYXAuCisgICAgVGhpcyBtYXAgY2FuIGJlIHVzZWQgZm9yIFBSSU1BUlkvU0VDT05EQVJZIHNlc3Npb24gcmVwbGljYXRpb24KKyAgICBBaGgsIHRoZSBiZWF1dHkgb2Ygc3RvcmluZyBkYXRhIGluIHJlbW90ZSBsb2NhdGlvbnMKKyAgICBUaGUgbGF6eSBoYXNoIG1hcCB3aWxsIG9ubHkgcmVwbGljYXRlIGl0cyBhdHRyaWJ1dGUgbmFtZXMgdG8gYWxsIG1lbWJlcnMgaW4gdGhlIGdyb3VwCisgICAgd2l0aCB0aGF0IG5hbWUsIGl0IHdpbGwgYWxzbyByZXBsaWNhdGUgdGhlIHNvdXJjZSAod2hlcmUgdG8gZ2V0IHRoZSBvYmplY3QpCisgICAgYW5kIHRoZSBiYWNrdXAgbWVtYmVyIHdoZXJlIGl0IGNhbiBmaW5kIGEgYmFja3VwIGlmIHRoZSBzb3VyY2UgaXMgZ29uZS4KKyAgICBJZiB0aGUgc291cmNlIGRpc2FwcGVhcnMsIHRoZSBiYWNrdXAgbm9kZSB3aWxsIHJlcGxpY2F0ZSBhdHRyaWJ1dGVzIHRoYXQKKyAgICBhcmUgc3RvcmVkIHRvIGEgbmV3IHByaW1hcnkgYmFja3VwcyBjYW4gYmUgY2hvc2VuIG9uIHJvdW5kIHJvYmluLgorICAgIFdoZW4gYSBuZXcgbWVtYmVyIGFycml2ZXMgYW5kIHJlcXVlc3RzIHN0YXRlLCB0aGF0IG1lbWJlciB3aWxsIGdldCBhbGwgdGhlIGF0dHJpYnV0ZQorICAgIG5hbWVzIGFuZCB0aGUgbG9jYXRpb25zLgorICAgIEl0IGNhbiByZXBsaWNhdGUgZXZlcnkgWCBzZWNvbmRzLCBvciBvbiBkaXJ0eSBmbGFncyBieSB0aGUgb2JqZWN0cyBzdG9yZWQsCisgICAgb3IgYSByZXF1ZXN0IHRvIHNjYW4gZm9yIGRpcnR5IGZsYWdzLCBvciBhIHJlcXVlc3Qgd2l0aCB0aGUgb2JqZWN0cy4KK05vdGVzOiB0aGUgbWFwIGhhcyBiZWVuIGNvbXBsZXRlZAorCisyMi4gc2VuZEFjayBhbmQgc3luY2hyb25pemVkIHNob3VsZCBub3QgaGF2ZSB0byBiZSBhIFhNTCBjb25maWcsCisgICAgaXQgY2FuIGJlIGNvbmZpZ3VyZWQgb24gYSBwZXIgcGFja2V0IGJhc2lzIHVzaW5nIENsdXN0ZXJEYXRhLmdldE9wdGlvbnMoKQorTm90ZXM6IHNlZSBDaGFubmVsLlNFTkRfT1BUX1hYWFggdmFyaWFibGVzCisKKzI4LiBUaHJlYWQgcG9vbCBzaG91bGQgaGF2ZSBtYXhUaHJlYWRzIGFuZCBtaW5UaHJlYWRzIGFuZCBncm93IGR5bmFtaWNhbGx5CisKKzI0LiBNZXNzYWdlRGlzcGF0Y2hJbnRlcmNlcHRvciAtIGZvciBhc3luY2hyb25vdXMgc2VuZGluZworICAgIC0gbG9va3MgYXQgdGhlIG9wdGlvbnMgZmxhZyBTRU5EX09QVElPTlNfQVNZTkNIUk9OT1VTCisgICAgLSBoYXMgdHdvIG1vZGVzCisgICAgICBhKSBhc3luYyBwYXJhbGxlbCBzZW5kIC0gZWFjaCBtZXNzYWdlIHRvIGFsbCBkZXN0aW5hdGlvbnMgYmVmb3JlIG5leHQgbWVzc2FnZQorICAgICAgYikgYXN5bmMgcGVyL21lbWJlciAtIG9uZSB0aHJlYWQgcGVyIG1lbWJlciB1c2luZyB0aGUgRmFzdEFzeW5jUXVldWUgKGdvb2QgZm9yIGdyb3VwcyB3aXRoIHNsb3cgcmVjZWl2ZXJzKQorICAgIC0gQ2FsbGJhY2sgZXJyb3IgaGFuZGxlciAtIGZvciB3aGVuIG1lc3NhZ2VzIGZhaWwsIGFuZCB0aGUgYXBwbGljYXRpb24gd2lzaGVzIHRvIGJlY29tZSBub3RpZmllZAorICAgIC0gTVVTVCBIQVZFIEEgTElNSVQgUVVFVUUgU0laRSBJTiBNQiwgdG8gYXZvaWQgT09NIGVycm9ycyBvciBwZXJzaXN0IHRoZSBxdWV1ZS4KKyAgICAtIE1VU1QgVVNFIENsdXN0ZXJEYXRhLmRlZXBjbG9uZSgpIHRvIGVuc3VyZSB0aHJlYWQgc2FmZXR5IGlmIENsdXN0ZXJEYXRhIG9iamVjdHMgZ2V0IHJlY3ljbGVkCitOb3RlczogU2ltcGxlIGltcGxlbWVudGF0aW9uLCBvbmUgdGhyZWFkLCBpbnZva2VzIGFsbCBzZW5kZXJzIGluIHBhcmFsbGVsLgorICAgICAgIERlZXAgY2xvbmluZyBpcyBjb25maWd1cmFibGUgYXMgb3B0aW1pemF0aW9uLgorCiszNy4gSW50ZXJjZXB0b3IuZ2V0T3B0aW9uRmxhZygpIC0gbGV0cyB0aGUgc3lzdGVtIGNvbmZpZ3VyZSBhIGZsYWcgdG8gYmUgdXNlZAorICAgIGZvciB0aGUgaW50ZXJjZXB0b3IuIHRoYXQgd2F5LCBhbGwgY29uc3RhbnRzIGRvbid0IGhhdmUgdG8gYmUgY29uZmlndXJlZAorICAgIGluIENoYW5uZWwuU0VORF9GTEFHX1hYWFguCisgICAgQWxzbywgdGhlIEdyb3VwQ2hhbm5lbCB3aWxsIG1ha2UgYSBjb25mbGljdCBjaGVjayB1cG9uIHN0YXJ0dXAsCisgICAgc28gdGhhdCB0aGVyZSBpcyBubyBjb25mbGljdC4gSSB3aWxsIGNoYW5nZSBvcHRpb25zIHRvIGEgbG9uZywKKyAgICBzbyB0aGF0IHdlIGNhbiBoYXZlIDYzIGZsYWdzLCBoZW5jZSB1cCB0byA2MCBpbnRlcmNlcHRvcnMuCitOb3RlczogQ29tcGxldGVkLCByZW1haW5lZCBhbiBpbnQsIHNvIDMxIGZsYWdzCisKKyBiKSBTdGF0ZSBzeW5jaHJvbml6YXRpb24gZm9yIHRoZSBtYXAgLSB3aWxsIG5lZWQgdG8gYWRkIGluIE1TR19JTklUCisgRml4ZWQgbWFwIGJ1ZworCisgYykgUnBjQ2hhbm5lbCAtIGNvbGxlY3QgIm5vIHJlcGx5IiByZXBsaWVzLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gdGltZSBvdXQKK1RoZSBScGNDaGFubmVsIG5vdyB3b3JrcyB0b2dldGhlciB3aXRoIHRoZSBncm91cCBjaGFubmVsLCBzbyB0aGF0IHdoZW4gaXQgcmVjZWl2ZXMgYW4gUlBDIG1lc3NhZ2UKK2FuZCBubyBvbmUgYWNjZXB0cyBpdCwgdGhlbiBpdCBjYW4gcmVwbHkgaW1tZWRpYXRlbHkuIHRoaXMgd2F5IHRoZSBycGMgc2VuZGVyIGRvZXNuJ3QgaGF2ZSB0byB0aW1lIG91dC4KKworMzkuIFN1cHBvcnQgZm9yIElQdjYKK05vdGVzOiBDb21wbGV0ZWQuIFRoZSBtZW1iZXJzaGlwIG5vdyBjYXJyaWVzIGEgdmFyaWFibGUgbGVuZ3RoIGhvc3QgYWRkcmVzcyB0byBzdXBwb3J0IElQdjYKKworNDAuIGNoYW5uZWwuc3RvcCgpIC0gc2hvdWxkIGJyb2FkY2FzdCBhIHN0b3AgbWVzc2FnZSwgdG8gYXZvaWQgdGltZW91dAorTm90ZXM6IENvbXBsZXRlZC4KKworNDIuIFdoZW4gdGhlIG9wdGlvbiBTRU5EX09QVElPTlNfU1lOQ0hST05JWkVEX0FDSywgYW5kIGFuIGVycm9yIGhhcHBlbnMgZHVyaW5nCisgICAgcHJvY2Vzc2luZyBvbiB0aGUgcmVtb3RlIG5vZGUsIGEgRkFJTF9BQ0sgY29tbWFuZCBzaG91bGQgYmUgc2VudAorICAgIHNvIHRoYXQgdGhlIHNlbmRpbmcgbm9kZSBkb2Vzbid0IGhhdmUgdG8gdGltZSBvdXQKK05vdGVzOiBDb21wbGV0ZWQuIFRoZSBlcnJvciB3aWxsIGJlIHdyYXBwZWQgaW4gYSBDaGFubmVsRXhjZXB0aW9uIGFuZCBtYXJrZWQgYXMgYQorICAgICAgIFJlbW90ZVByb2Nlc3NFeGNlcHRpb24gZm9yIHRoYXQgbm9kZS4KKyAgICAgICBUbyByZWNlaXZlIHRoaXMgZXhjZXB0aW9uLCBvbmUgbXVzdCB0dXJuIG9uCisKKzQzLiBTaWxlbnQgbWVtYmVyLCBub2RlIGRpc2NvdmVyeS4KKyAgICBBZGQgaW4gdGhlIGFiaWxpdHkgdG8gc3RhcnQgdXAgdHJpYmVzLCBidXQgZG9uJ3Qgc3RhcnQgdGhlIG1lbWJlcnNoaXAgYnJvYWRjYXN0CisgICAgY29tcG9uZW50LCBvbmx5IHRoZSBsaXN0ZW5lcgorTm90ZXM6IENvbXBsZXRlZC4gYWRkZWQgaW4gY29ycmVjdCBzdGFydHVwIHNlcXVlbmNlcy4KKworNDYuIEhlYXJ0YmVhdCBJbnRlcmZhY2UsIHRvIG5vdGlmeSBsaXN0ZW5lcnMgYXMgd2VsbAorTm90ZXM6IEltcGxlbWVudGVkCisKKzQ0LiBTb2Z0IG1lbWJlcnNoaXAgZmFpbHVyZSBkZXRlY3Rpb24sIGllIGlmIGEgd2ViYXBwIGlzIHN0b3BwZWQsIGJ1dAorICAgIHRoZSBBYnN0cmFjdFJlcGxpY2F0ZWRNYXAgZG9lc24ndCBicm9hZGNhc3QgYSBzdG9wIG1lc3NhZ2UKKyAgICBUaGlzIGlzIG9uZSBwb3RlbnRpYWwgc29sdXRpb246CisgICAgMS4ga2VlcCBhIHN0YXRpYyBXZWFrSGFzaE1hcCBvZiBhbGwgbWFwIGltcGxlbWVudGF0aW9ucyBydW5uaW5nCisgICAgICAgc28gdGhhdCB3ZSBjYW4gc2hhcmUgb25lIGhlYXJ0YmVhdCB0aHJlYWQgZm9yIHRpbWVvdXRzCisgICAgMi4gZXZlcnl0aW1lIGEgbWVzc2FnZSBpcyByZWNlaXZlZCwgdXBkYXRlIHRoZSBsYXN0IGNoZWNrIHRpbWUgZm9yIHRoYXQKKyAgICAgICBtZW1iZXIgc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRoZSB0aHJlYWQgdG8gYWN0aXZlbHkgY2hlY2sKKyAgICAzLiB3aGVuIHRoZSB0aHJlYWQgd2FrZXMgdXAsIGl0IHdpbGwgY2hlY2sgbWFwcyB0aGF0IGFyZSBvdXRzaWRlCisgICAgICAgdGhlIHZhbGlkIHJhbmdlIGZvciBjaGVjayB0aW1lLAorICAgIDQuIHNlbmQgYSBSUEMgbWVzc2FnZSwgaWYgbm8gcmVwbHksIHJlbW92ZSB0aGUgbWFwIGZyb20gaXRzZWxmCisgICAgT3RoZXIgc29sdXRpb24sIHVzZSB0aGUgVGNwRmFpbHVyZURldGVjdG9yLCBjYXRjaCBzZW5kIGVycm9ycworTm90ZXM6IEltcGxlbWVudGVkIHVzaW5nIGEgcGVyaW9kaWMgcGluZyBpbiB0aGUgQWJzdHJhY3RSZXBsaWNhdGVkTWFwCisKKzQ1LiBNY2FzdFNlcnZpY2VJbXBsLnJlY2VpdmUgc2hvdWxkIGhhdmUgYSBTT19USU1FT1VUIHNvIHRoYXQgd2UgY2FuIGNoZWNrCisgICAgZm9yIG1lbWJlcnMgZHJvcHBpbmcgb24gdGhlIHNhbWUgdGhyZWFkCitOb3RlczogQ29tcGxldGVkCisKKzMzLiBUY3BGYWlsdXJlRGV0ZWN0b3IsIHdoZW4gYSBtZW1iZXIgaXMgcmVwb3J0ZWQgbWlzc2luZywgZmlyc3QgY2hlY2sgVENQIHBhdGggdG9vLgorTm90ZXM6IENvbXBsZXRlZAorCiszNC4gQ29uZmlndXJhYmxlIHBheWxvYWQgZm9yIHRoZSBtZW1iZXJzaGlwIGhlYXJ0YmVhdCwgc28gdGhhdCB0aGUgYXBwIGNhbiBkZWNpZGUgd2hhdCB0byBoZWFydGJlYXQuCisgICAgc3VjaCBhcyBKTVggbWFuYWdlbWVudCBwb3J0LCBhbGEgQW5keSBQaXBlcidzIHN1Z2dlc3Rpb24uCitOb3RlczogQ29tcGxldGVkCisKKzQ5LiBNYWtlIHN1cmUgdGhhdCBtZW1iZXJzaGlwIGlzIGVzdGFibGlzaGVkIGJlZm9yZSB0aGUgc3RhcnQgcHJvY2VzcyByZXR1cm5zLgorTm90ZXM6IENvbXBsZXRlZAorCisxNi4gR3VhcmFudGVlZCBkZWxpdmVyeSBvZiBtZXNzYWdlcywgaWUgZWl0aGVyIGFsbCBnZXQgaXQgb3Igbm9uZSBnZXQgaXQuCisgICAgTWVhbmluZywgdGhhdCBhbGwgcmVjZWl2ZXJzIGdldCBpdCwgdGhlbiB3YWl0IGZvciBhIHByb2Nlc3MgY29tbWFuZC4KKyAgICBhbGEgR29zc2lwIHByb3RvY29sIC0gdGhpcyBpcyBmYWlybHkgcmVkdW5kYW50IHdpdGggYSBYYTJQaGFzZUNvbW1pdEludGVyY2VwdG9yCisgICAgZXhjZXB0IGl0IGRvZXNuJ3Qga2VlcCBhIHRyYW5zYWN0aW9uIGxvZy4KK05vdGVzOiBDb21wbGV0ZWQgaW4gYW5vdGhlciB0YXNrCisKKzEwLiBYYTJQaGFzZUNvbW1pdEludGVyY2VwdG9yIC0gbWFrZSBzdXJlIHRoZSBtZXNzYWdlIGRvZXNuJ3QgcmVhY2ggdGhlIHJlY2VpdmVyIHVubGVzcyBhbGwgbWVtYmVycyBnb3QgaXQKK05vdGVzOiBDb21wbGV0ZWQKKworMjUuIE1lbWJlci51bmlxdWVJZCAtIDE2IGJ5dGVzIHVuaXF1ZSBmb3IgYSBtZW1iZXIsIFVVSUQKKyAgICBOZWVkZWQgdG8gbm90IGNvbmZ1c2UgYSBjcmFzaGVkIG1lbWJlciB3aXRoIGEgcmV2aXZlZCBtZW1iZXIgb24gdGhlIHNhbWUgcG9ydAorTm90ZXM6IENvbXBsZXRlZAorCisxOS4gSW1wbGVtZW50IGEgaGFyZGNvZGVkIHRjcCBtZW1iZXJzaGlwCitOb3RlczogQ29tcGxldGVkCisKKzkuIENvb3JkaW5hdG9ySW50ZXJjZXB0b3IgLSBtYW5hZ2VzIHRoZSBzZWxlY3Rpb24gb2YgYSBjbHVzdGVyIGNvb3JkaW5hdG9yCisgICBqdXN0IGhhZCBhIGJyaWxsaWFudCBpZGVhLCBpZiBHcm91cENoYW5uZWwga2VlcHMgaXRzIG93biB2aWV3IG9mIG1lbWJlcnMsCisgICB0aGUgY29vcmRpbmF0b3IgaW50ZXJjZXB0b3IgY2FuIGhvbGQgb24gdG8gdGhlIG1lbWJlciBhZGRlZC9kaXNhcHBhcmVkIGV2ZW50CisgICBJdCBjYW4gYWxzbyBpbnRlcmNlcHQgZG93biBnb2luZyBtZXNzYWdlcyBpZiB0aGUgY29vcmRpbmF0b3IgZGlzYXBwZWFyZWQKKyAgIHdoaWxlIGEgbmV3IGNvb3JkaW5hdG9yIGlzIGNob3NlbgorICAgSXQgY2FuIGFsc28gaW50ZXJjZXB0IGRvd24gZ29pbmcgbWVzc2FnZXMgZm9yIG1lbWJlcnMgZGlzYXBwZWFyZWQgdGhhdCB0aGUKKyAgIGNhbGxpbmcgYXBwIG5vdCB5ZXQga25vd3MgYWJvdXQsIHRvIGF2b2lkIGEgQ2hhbm5lbEV4Y2VwdGlvbgorICAgVGhlIGNvb3JkaW5hdG9yIGlzIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBtaXh1cCB3aGVuIHR3byBjaGFubmVscyBzdGFydHVwIGluc3RhbnRseQorTm90ZXM6IENvbXBsZXRlZC4gb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzLk5vbkJsb2NraW5nQ29vcmRpbmF0b3JJbnRlcmNlcHRvcgorICAgICAgIGltcGxlbWVudHMgYW4gYXV0b21lcmdpbmcgYWxnb3JpdGhtLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2hhL2J1aWxkLnhtbCBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGYzM2VlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvYnVpbGQueG1sCkBAIC0wLDAgKzEsMTU3IEBACis8cHJvamVjdCBuYW1lPSJDbHVzdGVyIiBkZWZhdWx0PSJkaXN0IiBiYXNlZGlyPSIuIj4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgUHJvcGVydHkgVmFsdWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHByb3BlcnR5IGZpbGU9Ii4uLy4uLy4uL2J1aWxkLnByb3BlcnRpZXMiIC8+CisgIDxwcm9wZXJ0eSBmaWxlPSIuLi8uLi8uLi9idWlsZC9idWlsZC5wcm9wZXJ0aWVzIiAvPgorICA8cHJvcGVydHkgZmlsZT0iLi4vLi4vLi4vYnVpbGQvYnVpbGQucHJvcGVydGllcy5kZWZhdWx0IiAvPgorCisgIDwhLS0gQnVpbGQgRGVmYXVsdHMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5ob21lIiAgbG9jYXRpb249Ii4uLy4uIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5idWlsZCIgbG9jYXRpb249Ii4uLy4uLy4uL2J1aWxkL2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJoYS5idWlsZCIgIHZhbHVlPSIke2NhdGFsaW5hLmhvbWV9L21vZHVsZXMvaGEvYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImhhLmRpc3QiICAgdmFsdWU9IiR7Y2F0YWxpbmEuaG9tZX0vbW9kdWxlcy9oYS9kaXN0Ii8+CisgIAorICA8cHJvcGVydHkgbmFtZT0iZ3JvdXBjb20uZGlzdCIgICB2YWx1ZT0iJHtjYXRhbGluYS5ob21lfS9tb2R1bGVzL2dyb3VwY29tL2Rpc3QiLz4KKworICAgIDwhLS0gQ29uc3RydWN0IENhdGFsaW5hIGNsYXNzcGF0aCAtLT4KKyAgPHBhdGggaWQ9ImhhLmNsYXNzcGF0aCI+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NhdGFsaW5hLmJ1aWxkfS9zZXJ2ZXIvbGliL2NhdGFsaW5hLmphciIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjYXRhbGluYS5idWlsZH0vc2VydmVyL2xpYi90b21jYXQtdXRpbC5qYXIiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2F0YWxpbmEuYnVpbGR9L3NlcnZlci9saWIvY2F0YWxpbmEtZ3JvdXBzLmphciIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLW1vZGVsZXIuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxvZ2dpbmcuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqbXguamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjYXRhbGluYS5idWlsZH0vY29tbW9uL2xpYi9zZXJ2bGV0LWFwaS5qYXIiLz4KKyAgPC9wYXRoPgorCisgICAgPCEtLSBTb3VyY2UgcGF0aCAtLT4KKyAgPHBhdGggaWQ9ImphdmFkb2Muc291cmNlcGF0aCI+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvc2hhcmUiLz4KKyAgPC9wYXRoPgorICAKKyAgCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogU2V0IGNvbXBpbGUgZmxhZ3MgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtZ3JvdXBzIj4KKyAgICAgIDxhbnQgYW50ZmlsZT0iLi4vZ3JvdXBjb20vYnVpbGQueG1sIiBkaXI9Ii4uL2dyb3VwY29tLyIvPgorICA8L3RhcmdldD4KKyAgCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBTZXQgY29tcGlsZSBmbGFncyA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJmbGFncyI+CisgICAgPCEtLSBKREsgZmxhZ3MgLS0+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrLjEuMi5wcmVzZW50IiBjbGFzc25hbWU9ImphdmEudXRpbC5IYXNoTWFwIiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Impkay4xLjMucHJlc2VudCIgY2xhc3NuYW1lPSJqYXZhLmxhbmcucmVmbGVjdC5Qcm94eSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsuMS40LnByZXNlbnQiIGNsYXNzbmFtZT0iamF2YS5uaW8uQnVmZmVyIiAvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogU2V0IGNvbXBpbGUgZmxhZ3MgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZmxhZ3MuZGlzcGxheSIgZGVwZW5kcz0iZmxhZ3MiIHVubGVzcz0iZmxhZ3MuaGlkZSI+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gQnVpbGQgZW52aXJvbm1lbnQgZm9yIENhdGFsaW5hIC0tLSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9IklmICR7cHJvcGVydHlfbmFtZX0gaXMgZGlzcGxheWVkLCB0aGVuIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0KSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBCdWlsZCBvcHRpb25zIC0tLSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJmdWxsLmRpc3Q9JHtmdWxsLmRpc3R9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImJ1aWxkLnN5c2NsYXNzcGF0aD0ke2J1aWxkLnN5c2NsYXNzcGF0aH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5kZWJ1Zz0ke2NvbXBpbGUuZGVidWd9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUuZGVwcmVjYXRpb249JHtjb21waWxlLmRlcHJlY2F0aW9ufSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlLm9wdGltaXplPSR7Y29tcGlsZS5vcHRpbWl6ZX0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gQW50IEZsYWdzIC0tLSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSImbHQ7c3R5bGUmZ3Q7IHRhc2sgYXZhaWxhYmxlIChyZXF1aXJlZCk9JHtzdHlsZS5hdmFpbGFibGV9IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIEpESyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iamRrLjEuMi5wcmVzZW50PSR7amRrLjEuMi5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqZGsuMS4zLnByZXNlbnQ9JHtqZGsuMS4zLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Impkay4xLjQucHJlc2VudD0ke2pkay4xLjQucHJlc2VudH0iIC8+CisKKyAgPC90YXJnZXQ+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDcmVhdGUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfSIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NsYXNzZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke2hhLmRpc3R9Ii8+CisgIDwvdGFyZ2V0PgorCisKKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ29tcGlsZSBDYXRhbGluYSBDb21wb25lbnRzID09PT09PT09PT09PT09PT0gLS0+CisgIAorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNhdGFsaW5hLWhhIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlLCBidWlsZC1ncm91cHMiPgorICAgIDwhLS0gQ29tcGlsZSBpbnRlcm5hbCBzZXJ2ZXIgY29tcG9uZW50cyAtLT4KKyAgICA8amF2YWMgc3JjZGlyPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZSIgZGVzdGRpcj0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3NlcyIKKyAgICAgICAgICAgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iIGRlcHJlY2F0aW9uPSIke2NvbXBpbGUuZGVwcmVjYXRpb259IgorICAgICAgICAgICBvcHRpbWl6ZT0iJHtjb21waWxlLm9wdGltaXplfSIKKyAgICAgICAgICAgZXhjbHVkZXM9IioqL0NWUy8qKiIgIAkgICAKKyAgICAJPgorICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJoYS5jbGFzc3BhdGgiIC8+CisgICAgPC9qYXZhYz4KKyAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIgorICAgIAkgIHRvZmlsZT0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIi8+CisgICAgPGNvcHkgZmlsZT0iJHtiYXNlZGlyfS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIgorICAgIAkgIHRvZmlsZT0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMiLz4KKyAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3RjcC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyIKKyAgICAJICB0b2ZpbGU9IiR7Y2F0YWxpbmEuYnVpbGR9L2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS90Y3AvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMiLz4KKyAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCIKKyAgICAJICB0b2ZpbGU9IiR7Y2F0YWxpbmEuYnVpbGR9L2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL21iZWFucy1kZXNjcmlwdG9ycy54bWwiLz4KKyAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3RjcC9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIgorICAgIAkgIHRvZmlsZT0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3RjcC9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIi8+CisgICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ3JlYXRlIENhdGFsaW5hIEphdmFkb2NzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iamF2YWRvYyI+CisgICAgPGRlbGV0ZSBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2phdmFkb2MiLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9qYXZhZG9jIi8+CisgICAgPGphdmFkb2MgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLiosb3JnLmFwYWNoZS5uYW1pbmcuKiIKKyAgICAgIGNsYXNzcGF0aHJlZj0iY2F0YWxpbmEuY2xhc3NwYXRoIgorICAgICAgc291cmNlcGF0aHJlZj0iamF2YWRvYy5zb3VyY2VwYXRoIgorICAgICAgZGVzdGRpcj0iJHtjYXRhbGluYS5idWlsZH0vamF2YWRvYyIKKyAgICAgIGF1dGhvcj0idHJ1ZSIKKyAgICAgIHZlcnNpb249InRydWUiCisgICAgICB3aW5kb3d0aXRsZT0iQ2F0YWxpbmEgSW50ZXJuYWwgQVBJIERvY3VtZW50YXRpb24iCisgICAgICBkb2N0aXRsZT0iQ2F0YWxpbmEgQVBJIgorICAgICAgYm90dG9tPSJDb3B5cmlnaHQgJiMxNjk7IDIwMDAtMjAwMiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIgorICAgIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBCVUlMRDogUmVidWlsZCBFdmVyeXRoaW5nID09PT09PT09PT09PT09PT09PT09PSAtLT4KKworCisKKworICA8IS0tID09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpc3RyaWJ1dGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImJ1aWxkLWNhdGFsaW5hLWhhIj4KKyAgICAKKyAgICA8amFyIGRlc3RmaWxlPSIke2hhLmRpc3R9L2NhdGFsaW5hLWNsdXN0ZXIuamFyIgorICAgICAgICAgYmFzZWRpcj0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3NlcyI+CisgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9oYS8qKiIgLz4KKyAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9wYWNrYWdlLmh0bWwiIC8+CisgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovTG9jYWxTdHJpbmdzXyoiIC8+CisgICAgPC9qYXI+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29weSIgZGVwZW5kcz0iZGlzdCIgPgorICAgICA8Y29weSBmaWxlPSIke2hhLmRpc3R9L2NhdGFsaW5hLWNsdXN0ZXIuamFyIiB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vc2VydmVyL2xpYiIgLz4KKyAgPC90YXJnZXQ+CisgIAorICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IENvbnZlbmllbnQgU3lub255bXMgPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9ldGMvY2x1c3Rlci1zZXJ2ZXIueG1sIGIvY29udGFpbmVyL21vZHVsZXMvaGEvZXRjL2NsdXN0ZXItc2VydmVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDI0MTg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvZXRjL2NsdXN0ZXItc2VydmVyLnhtbApAQCAtMCwwICsxLDM5NCBAQAorPCEtLSBFeGFtcGxlIFNlcnZlciBDb25maWd1cmF0aW9uIEZpbGUgLS0+Cis8IS0tIE5vdGUgdGhhdCBjb21wb25lbnQgZWxlbWVudHMgYXJlIG5lc3RlZCBjb3JyZXNwb25kaW5nIHRvIHRoZWlyCisgICAgIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzIHdpdGggZWFjaCBvdGhlciAtLT4KKworPCEtLSBBICJTZXJ2ZXIiIGlzIGEgc2luZ2xldG9uIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSBlbnRpcmUgSlZNLAorICAgICB3aGljaCBtYXkgY29udGFpbiBvbmUgb3IgbW9yZSAiU2VydmljZSIgaW5zdGFuY2VzLiAgVGhlIFNlcnZlcgorICAgICBsaXN0ZW5zIGZvciBhIHNodXRkb3duIGNvbW1hbmQgb24gdGhlIGluZGljYXRlZCBwb3J0LgorCisgICAgIE5vdGU6ICBBICJTZXJ2ZXIiIGlzIG5vdCBpdHNlbGYgYSAiQ29udGFpbmVyIiwgc28geW91IG1heSBub3QKKyAgICAgZGVmaW5lIHN1YmNvbXBvbmVudHMgc3VjaCBhcyAiVmFsdmVzIiBvciAiTG9nZ2VycyIgYXQgdGhpcyBsZXZlbC4KKyAtLT4KKworPFNlcnZlciBwb3J0PSI3MDA1IiBzaHV0ZG93bj0iU0hVVERPV04iPgorCisgIDwhLS0gQ29tbWVudCB0aGVzZSBlbnRyaWVzIG91dCB0byBkaXNhYmxlIEpNWCBNQmVhbnMgc3VwcG9ydCB1c2VkIGZvciB0aGUgCisgICAgICAgYWRtaW5pc3RyYXRpb24gd2ViIGFwcGxpY2F0aW9uIC0tPgorICA8TGlzdGVuZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQXByTGlmZWN5Y2xlTGlzdGVuZXIiIC8+CisgIDxMaXN0ZW5lciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIiAvPgorICA8TGlzdGVuZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5HbG9iYWxSZXNvdXJjZXNMaWZlY3ljbGVMaXN0ZW5lciIgLz4KKyAgPExpc3RlbmVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUNvbmZpZ0xpZmVjeWNsZUxpc3RlbmVyIi8+CisKKyAgPCEtLSBHbG9iYWwgSk5ESSByZXNvdXJjZXMgLS0+CisgIDxHbG9iYWxOYW1pbmdSZXNvdXJjZXM+CisKKyAgICA8IS0tIFRlc3QgZW50cnkgZm9yIGRlbW9uc3RyYXRpb24gcHVycG9zZXMgLS0+CisgICAgPEVudmlyb25tZW50IG5hbWU9InNpbXBsZVZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciIgdmFsdWU9IjMwIi8+CisKKyAgICA8IS0tIEVkaXRhYmxlIHVzZXIgZGF0YWJhc2UgdGhhdCBjYW4gYWxzbyBiZSB1c2VkIGJ5CisgICAgICAgICBVc2VyRGF0YWJhc2VSZWFsbSB0byBhdXRoZW50aWNhdGUgdXNlcnMgLS0+CisgICAgPFJlc291cmNlIG5hbWU9IlVzZXJEYXRhYmFzZSIgYXV0aD0iQ29udGFpbmVyIgorICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZSIKKyAgICAgICBkZXNjcmlwdGlvbj0iVXNlciBkYXRhYmFzZSB0aGF0IGNhbiBiZSB1cGRhdGVkIGFuZCBzYXZlZCIKKyAgICAgICAgICAgZmFjdG9yeT0ib3JnLmFwYWNoZS5jYXRhbGluYS51c2Vycy5NZW1vcnlVc2VyRGF0YWJhc2VGYWN0b3J5IgorICAgICAgICAgIHBhdGhuYW1lPSJjb25mL3RvbWNhdC11c2Vycy54bWwiIC8+CisKKyAgPC9HbG9iYWxOYW1pbmdSZXNvdXJjZXM+CisKKyAgPCEtLSBBICJTZXJ2aWNlIiBpcyBhIGNvbGxlY3Rpb24gb2Ygb25lIG9yIG1vcmUgIkNvbm5lY3RvcnMiIHRoYXQgc2hhcmUKKyAgICAgICBhIHNpbmdsZSAiQ29udGFpbmVyIiAoYW5kIHRoZXJlZm9yZSB0aGUgd2ViIGFwcGxpY2F0aW9ucyB2aXNpYmxlCisgICAgICAgd2l0aGluIHRoYXQgQ29udGFpbmVyKS4gIE5vcm1hbGx5LCB0aGF0IENvbnRhaW5lciBpcyBhbiAiRW5naW5lIiwKKyAgICAgICBidXQgdGhpcyBpcyBub3QgcmVxdWlyZWQuCisKKyAgICAgICBOb3RlOiAgQSAiU2VydmljZSIgaXMgbm90IGl0c2VsZiBhICJDb250YWluZXIiLCBzbyB5b3UgbWF5IG5vdAorICAgICAgIGRlZmluZSBzdWJjb21wb25lbnRzIHN1Y2ggYXMgIlZhbHZlcyIgb3IgIkxvZ2dlcnMiIGF0IHRoaXMgbGV2ZWwuCisgICAtLT4KKworICA8IS0tIERlZmluZSB0aGUgVG9tY2F0IFN0YW5kLUFsb25lIFNlcnZpY2UgLS0+CisgIDxTZXJ2aWNlIG5hbWU9IkNhdGFsaW5hIj4KKworICAgIDwhLS0gQSAiQ29ubmVjdG9yIiByZXByZXNlbnRzIGFuIGVuZHBvaW50IGJ5IHdoaWNoIHJlcXVlc3RzIGFyZSByZWNlaXZlZAorICAgICAgICAgYW5kIHJlc3BvbnNlcyBhcmUgcmV0dXJuZWQuICBFYWNoIENvbm5lY3RvciBwYXNzZXMgcmVxdWVzdHMgb24gdG8gdGhlCisgICAgICAgICBhc3NvY2lhdGVkICJDb250YWluZXIiIChub3JtYWxseSBhbiBFbmdpbmUpIGZvciBwcm9jZXNzaW5nLgorCisgICAgICAgICBCeSBkZWZhdWx0LCBhIG5vbi1TU0wgSFRUUC8xLjEgQ29ubmVjdG9yIGlzIGVzdGFibGlzaGVkIG9uIHBvcnQgODA4MC4KKyAgICAgICAgIFlvdSBjYW4gYWxzbyBlbmFibGUgYW4gU1NMIEhUVFAvMS4xIENvbm5lY3RvciBvbiBwb3J0IDg0NDMgYnkKKyAgICAgICAgIGZvbGxvd2luZyB0aGUgaW5zdHJ1Y3Rpb25zIGJlbG93IGFuZCB1bmNvbW1lbnRpbmcgdGhlIHNlY29uZCBDb25uZWN0b3IKKyAgICAgICAgIGVudHJ5LiAgU1NMIHN1cHBvcnQgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBzdGVwcyAoc2VlIHRoZSBTU0wgQ29uZmlnCisgICAgICAgICBIT1dUTyBpbiB0aGUgVG9tY2F0IDUgZG9jdW1lbnRhdGlvbiBidW5kbGUgZm9yIG1vcmUgZGV0YWlsZWQKKyAgICAgICAgIGluc3RydWN0aW9ucyk6CisgICAgICAgICAqIElmIHlvdXIgSkRLIHZlcnNpb24gMS4zIG9yIHByaW9yLCBkb3dubG9hZCBhbmQgaW5zdGFsbCBKU1NFIDEuMC4yIG9yCisgICAgICAgICAgIGxhdGVyLCBhbmQgcHV0IHRoZSBKQVIgZmlsZXMgaW50byAiJEpBVkFfSE9NRS9qcmUvbGliL2V4dCIuCisgICAgICAgICAqIEV4ZWN1dGU6CisgICAgICAgICAgICAgJUpBVkFfSE9NRSVcYmluXGtleXRvb2wgLWdlbmtleSAtYWxpYXMgdG9tY2F0IC1rZXlhbGcgUlNBIChXaW5kb3dzKQorICAgICAgICAgICAgICRKQVZBX0hPTUUvYmluL2tleXRvb2wgLWdlbmtleSAtYWxpYXMgdG9tY2F0IC1rZXlhbGcgUlNBICAoVW5peCkKKyAgICAgICAgICAgd2l0aCBhIHBhc3N3b3JkIHZhbHVlIG9mICJjaGFuZ2VpdCIgZm9yIGJvdGggdGhlIGNlcnRpZmljYXRlIGFuZAorICAgICAgICAgICB0aGUga2V5c3RvcmUgaXRzZWxmLgorCisgICAgICAgICBCeSBkZWZhdWx0LCBETlMgbG9va3VwcyBhcmUgZW5hYmxlZCB3aGVuIGEgd2ViIGFwcGxpY2F0aW9uIGNhbGxzCisgICAgICAgICByZXF1ZXN0LmdldFJlbW90ZUhvc3QoKS4gIFRoaXMgY2FuIGhhdmUgYW4gYWR2ZXJzZSBpbXBhY3Qgb24KKyAgICAgICAgIHBlcmZvcm1hbmNlLCBzbyB5b3UgY2FuIGRpc2FibGUgaXQgYnkgc2V0dGluZyB0aGUKKyAgICAgICAgICJlbmFibGVMb29rdXBzIiBhdHRyaWJ1dGUgdG8gImZhbHNlIi4gIFdoZW4gRE5TIGxvb2t1cHMgYXJlIGRpc2FibGVkLAorICAgICAgICAgcmVxdWVzdC5nZXRSZW1vdGVIb3N0KCkgd2lsbCByZXR1cm4gdGhlIFN0cmluZyB2ZXJzaW9uIG9mIHRoZQorICAgICAgICAgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIGNsaWVudC4KKyAgICAtLT4KKworICAgIDwhLS0gRGVmaW5lIGEgbm9uLVNTTCBIVFRQLzEuMSBDb25uZWN0b3Igb24gcG9ydCA4MDgwIC0tPgorICAgIDxDb25uZWN0b3IgcG9ydD0iNzA4MCIgbWF4SHR0cEhlYWRlclNpemU9IjgxOTIiCisgICAgICAgICAgICAgICBtYXhUaHJlYWRzPSIxNTAiIG1pblNwYXJlVGhyZWFkcz0iMjUiIG1heFNwYXJlVGhyZWFkcz0iNzUiCisgICAgICAgICAgICAgICBlbmFibGVMb29rdXBzPSJmYWxzZSIgcmVkaXJlY3RQb3J0PSI4NDQzIiBhY2NlcHRDb3VudD0iMTAwIgorICAgICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ9IjIwMDAwIiBkaXNhYmxlVXBsb2FkVGltZW91dD0idHJ1ZSIgLz4KKyAgICA8IS0tIE5vdGUgOiBUbyBkaXNhYmxlIGNvbm5lY3Rpb24gdGltZW91dHMsIHNldCBjb25uZWN0aW9uVGltZW91dCB2YWx1ZQorICAgICB0byAwIC0tPgorCQorCTwhLS0gTm90ZSA6IFRvIHVzZSBnemlwIGNvbXByZXNzaW9uIHlvdSBjb3VsZCBzZXQgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIDoKKwkKKwkJCSAgIGNvbXByZXNzaW9uPSJvbiIgCisJCQkgICBjb21wcmVzc2lvbk1pblNpemU9IjIwNDgiIAorCQkJICAgbm9Db21wcmVzc2lvblVzZXJBZ2VudHM9ImdvemlsbGEsIHRyYXZpYXRhIiAKKwkJCSAgIGNvbXByZXNzYWJsZU1pbWVUeXBlPSJ0ZXh0L2h0bWwsdGV4dC94bWwiCisJLS0+CisKKyAgICA8IS0tIERlZmluZSBhIFNTTCBIVFRQLzEuMSBDb25uZWN0b3Igb24gcG9ydCA4NDQzIC0tPgorICAgIDwhLS0KKyAgICA8Q29ubmVjdG9yIHBvcnQ9Ijg0NDMiIG1heEh0dHBIZWFkZXJTaXplPSI4MTkyIgorICAgICAgICAgICAgICAgbWF4VGhyZWFkcz0iMTUwIiBtaW5TcGFyZVRocmVhZHM9IjI1IiBtYXhTcGFyZVRocmVhZHM9Ijc1IgorICAgICAgICAgICAgICAgZW5hYmxlTG9va3Vwcz0iZmFsc2UiIGRpc2FibGVVcGxvYWRUaW1lb3V0PSJ0cnVlIgorICAgICAgICAgICAgICAgYWNjZXB0Q291bnQ9IjEwMCIgc2NoZW1lPSJodHRwcyIgc2VjdXJlPSJ0cnVlIgorICAgICAgICAgICAgICAgY2xpZW50QXV0aD0iZmFsc2UiIHNzbFByb3RvY29sPSJUTFMiIC8+CisgICAgLS0+CisKKyAgICA8IS0tIERlZmluZSBhbiBBSlAgMS4zIENvbm5lY3RvciBvbiBwb3J0IDgwMDkgLS0+CisgICAgPENvbm5lY3RvciBwb3J0PSI3MDA5IiAKKyAgICAgICAgICAgICAgIGVuYWJsZUxvb2t1cHM9ImZhbHNlIiByZWRpcmVjdFBvcnQ9Ijg0NDMiIHByb3RvY29sPSJBSlAvMS4zIiAvPgorCisgICAgPCEtLSBEZWZpbmUgYSBQcm94aWVkIEhUVFAvMS4xIENvbm5lY3RvciBvbiBwb3J0IDgwODIgLS0+CisgICAgPCEtLSBTZWUgcHJveHkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyB0aGlzLiAtLT4KKyAgICA8IS0tCisgICAgPENvbm5lY3RvciBwb3J0PSI3MDgyIiAKKyAgICAgICAgICAgICAgIG1heFRocmVhZHM9IjE1MCIgbWluU3BhcmVUaHJlYWRzPSIyNSIgbWF4U3BhcmVUaHJlYWRzPSI3NSIKKyAgICAgICAgICAgICAgIGVuYWJsZUxvb2t1cHM9ImZhbHNlIiBhY2NlcHRDb3VudD0iMTAwIiBjb25uZWN0aW9uVGltZW91dD0iMjAwMDAiCisgICAgICAgICAgICAgICBwcm94eVBvcnQ9IjgwIiBkaXNhYmxlVXBsb2FkVGltZW91dD0idHJ1ZSIgLz4KKyAgICAtLT4KKworICAgIDwhLS0gQW4gRW5naW5lIHJlcHJlc2VudHMgdGhlIGVudHJ5IHBvaW50ICh3aXRoaW4gQ2F0YWxpbmEpIHRoYXQgcHJvY2Vzc2VzCisgICAgICAgICBldmVyeSByZXF1ZXN0LiAgVGhlIEVuZ2luZSBpbXBsZW1lbnRhdGlvbiBmb3IgVG9tY2F0IHN0YW5kIGFsb25lCisgICAgICAgICBhbmFseXplcyB0aGUgSFRUUCBoZWFkZXJzIGluY2x1ZGVkIHdpdGggdGhlIHJlcXVlc3QsIGFuZCBwYXNzZXMgdGhlbQorICAgICAgICAgb24gdG8gdGhlIGFwcHJvcHJpYXRlIEhvc3QgKHZpcnR1YWwgaG9zdCkuIC0tPgorCisgICAgPCEtLSBZb3Ugc2hvdWxkIHNldCBqdm1Sb3V0ZSB0byBzdXBwb3J0IGxvYWQtYmFsYW5jaW5nIHZpYSBBSlAgaWUgOgorICAgIDxFbmdpbmUgbmFtZT0iU3RhbmRhbG9uZSIgZGVmYXVsdEhvc3Q9ImxvY2FsaG9zdCIganZtUm91dGU9Imp2bTEiPiAgICAgICAgIAorICAgIC0tPiAKKyAgICAgICAgIAorICAgIDwhLS0gRGVmaW5lIHRoZSB0b3AgbGV2ZWwgY29udGFpbmVyIGluIG91ciBjb250YWluZXIgaGllcmFyY2h5IC0tPgorICAgIDxFbmdpbmUgbmFtZT0iQ2F0YWxpbmEiIGRlZmF1bHRIb3N0PSJsb2NhbGhvc3QiPgorCisgICAgICA8IS0tIFRoZSByZXF1ZXN0IGR1bXBlciB2YWx2ZSBkdW1wcyB1c2VmdWwgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFib3V0CisgICAgICAgICAgIHRoZSByZXF1ZXN0IGhlYWRlcnMgYW5kIGNvb2tpZXMgdGhhdCB3ZXJlIHJlY2VpdmVkLCBhbmQgdGhlIHJlc3BvbnNlCisgICAgICAgICAgIGhlYWRlcnMgYW5kIGNvb2tpZXMgdGhhdCB3ZXJlIHNlbnQsIGZvciBhbGwgcmVxdWVzdHMgcmVjZWl2ZWQgYnkKKyAgICAgICAgICAgdGhpcyBpbnN0YW5jZSBvZiBUb21jYXQuICBJZiB5b3UgY2FyZSBvbmx5IGFib3V0IHJlcXVlc3RzIHRvIGEKKyAgICAgICAgICAgcGFydGljdWxhciB2aXJ0dWFsIGhvc3QsIG9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbiwgbmVzdCB0aGlzCisgICAgICAgICAgIGVsZW1lbnQgaW5zaWRlIHRoZSBjb3JyZXNwb25kaW5nIDxIb3N0PiBvciA8Q29udGV4dD4gZW50cnkgaW5zdGVhZC4KKworICAgICAgICAgICBGb3IgYSBzaW1pbGFyIG1lY2hhbmlzbSB0aGF0IGlzIHBvcnRhYmxlIHRvIGFsbCBTZXJ2bGV0IDIuNAorICAgICAgICAgICBjb250YWluZXJzLCBjaGVjayBvdXQgdGhlICJSZXF1ZXN0RHVtcGVyRmlsdGVyIiBGaWx0ZXIgaW4gdGhlCisgICAgICAgICAgIGV4YW1wbGUgYXBwbGljYXRpb24gKHRoZSBzb3VyY2UgZm9yIHRoaXMgZmlsdGVyIG1heSBiZSBmb3VuZCBpbgorICAgICAgICAgICAiJENBVEFMSU5BX0hPTUUvd2ViYXBwcy9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycyIpLgorCisgICAgICAgICAgIFJlcXVlc3QgZHVtcGluZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LiAgVW5jb21tZW50IHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgZWxlbWVudCB0byBlbmFibGUgaXQuIC0tPgorICAgICAgPCEtLQorICAgICAgPFZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVxdWVzdER1bXBlclZhbHZlIi8+CisgICAgICAtLT4KKworICAgICAgPCEtLSBCZWNhdXNlIHRoaXMgUmVhbG0gaXMgaGVyZSwgYW4gaW5zdGFuY2Ugd2lsbCBiZSBzaGFyZWQgZ2xvYmFsbHkgLS0+CisKKyAgICAgIDwhLS0gVGhpcyBSZWFsbSB1c2VzIHRoZSBVc2VyRGF0YWJhc2UgY29uZmlndXJlZCBpbiB0aGUgZ2xvYmFsIEpOREkKKyAgICAgICAgICAgcmVzb3VyY2VzIHVuZGVyIHRoZSBrZXkgIlVzZXJEYXRhYmFzZSIuICBBbnkgZWRpdHMKKyAgICAgICAgICAgdGhhdCBhcmUgcGVyZm9ybWVkIGFnYWluc3QgdGhpcyBVc2VyRGF0YWJhc2UgYXJlIGltbWVkaWF0ZWx5CisgICAgICAgICAgIGF2YWlsYWJsZSBmb3IgdXNlIGJ5IHRoZSBSZWFsbS4gIC0tPgorICAgICAgPFJlYWxtIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5Vc2VyRGF0YWJhc2VSZWFsbSIKKyAgICAgICAgICAgICByZXNvdXJjZU5hbWU9IlVzZXJEYXRhYmFzZSIvPgorCisgICAgICA8IS0tIENvbW1lbnQgb3V0IHRoZSBvbGQgcmVhbG0gYnV0IGxlYXZlIGhlcmUgZm9yIG5vdyBpbiBjYXNlIHdlCisgICAgICAgICAgIG5lZWQgdG8gZ28gYmFjayBxdWlja2x5IC0tPgorICAgICAgPCEtLQorICAgICAgPFJlYWxtIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5NZW1vcnlSZWFsbSIgLz4KKyAgICAgIC0tPgorCisgICAgICA8IS0tIFJlcGxhY2UgdGhlIGFib3ZlIFJlYWxtIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgdG8gZ2V0IGEgUmVhbG0KKyAgICAgICAgICAgc3RvcmVkIGluIGEgZGF0YWJhc2UgYW5kIGFjY2Vzc2VkIHZpYSBKREJDIC0tPgorCisgICAgICA8IS0tCisgICAgICA8UmVhbG0gIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG0iCisgICAgICAgICAgICAgZHJpdmVyTmFtZT0ib3JnLmdqdC5tbS5teXNxbC5Ecml2ZXIiCisgICAgICAgICAgY29ubmVjdGlvblVSTD0iamRiYzpteXNxbDovL2xvY2FsaG9zdC9hdXRob3JpdHkiCisgICAgICAgICBjb25uZWN0aW9uTmFtZT0idGVzdCIgY29ubmVjdGlvblBhc3N3b3JkPSJ0ZXN0IgorICAgICAgICAgICAgICB1c2VyVGFibGU9InVzZXJzIiB1c2VyTmFtZUNvbD0idXNlcl9uYW1lIiB1c2VyQ3JlZENvbD0idXNlcl9wYXNzIgorICAgICAgICAgIHVzZXJSb2xlVGFibGU9InVzZXJfcm9sZXMiIHJvbGVOYW1lQ29sPSJyb2xlX25hbWUiIC8+CisgICAgICAtLT4KKworICAgICAgPCEtLQorICAgICAgPFJlYWxtICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkRCQ1JlYWxtIgorICAgICAgICAgICAgIGRyaXZlck5hbWU9Im9yYWNsZS5qZGJjLmRyaXZlci5PcmFjbGVEcml2ZXIiCisgICAgICAgICAgY29ubmVjdGlvblVSTD0iamRiYzpvcmFjbGU6dGhpbjpAbnRzZXJ2ZXI6MTUyMTpPUkNMIgorICAgICAgICAgY29ubmVjdGlvbk5hbWU9InNjb3R0IiBjb25uZWN0aW9uUGFzc3dvcmQ9InRpZ2VyIgorICAgICAgICAgICAgICB1c2VyVGFibGU9InVzZXJzIiB1c2VyTmFtZUNvbD0idXNlcl9uYW1lIiB1c2VyQ3JlZENvbD0idXNlcl9wYXNzIgorICAgICAgICAgIHVzZXJSb2xlVGFibGU9InVzZXJfcm9sZXMiIHJvbGVOYW1lQ29sPSJyb2xlX25hbWUiIC8+CisgICAgICAtLT4KKworICAgICAgPCEtLQorICAgICAgPFJlYWxtICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkRCQ1JlYWxtIgorICAgICAgICAgICAgIGRyaXZlck5hbWU9InN1bi5qZGJjLm9kYmMuSmRiY09kYmNEcml2ZXIiCisgICAgICAgICAgY29ubmVjdGlvblVSTD0iamRiYzpvZGJjOkNBVEFMSU5BIgorICAgICAgICAgICAgICB1c2VyVGFibGU9InVzZXJzIiB1c2VyTmFtZUNvbD0idXNlcl9uYW1lIiB1c2VyQ3JlZENvbD0idXNlcl9wYXNzIgorICAgICAgICAgIHVzZXJSb2xlVGFibGU9InVzZXJfcm9sZXMiIHJvbGVOYW1lQ29sPSJyb2xlX25hbWUiIC8+CisgICAgICAtLT4KKworICAgICAgPCEtLSBEZWZpbmUgdGhlIGRlZmF1bHQgdmlydHVhbCBob3N0CisgICAgICAgICAgIE5vdGU6IFhNTCBTY2hlbWEgdmFsaWRhdGlvbiB3aWxsIG5vdCB3b3JrIHdpdGggWGVyY2VzIDIuMi4KKyAgICAgICAtLT4KKyAgICAgIDxIb3N0IG5hbWU9ImxvY2FsaG9zdCIgYXBwQmFzZT0id2ViYXBwcyIKKyAgICAgICB1bnBhY2tXQVJzPSJ0cnVlIiBhdXRvRGVwbG95PSJ0cnVlIgorICAgICAgIHhtbFZhbGlkYXRpb249ImZhbHNlIiB4bWxOYW1lc3BhY2VBd2FyZT0iZmFsc2UiPgorCisgICAgICAgIDwhLS0gRGVmaW5lcyBhIGNsdXN0ZXIgZm9yIHRoaXMgbm9kZSwKKyAgICAgICAgICAgICBCeSBkZWZpbmluZyB0aGlzIGVsZW1lbnQsIG1lYW5zIHRoYXQgZXZlcnkgbWFuYWdlciB3aWxsIGJlIGNoYW5nZWQuCisgICAgICAgICAgICAgU28gd2hlbiBydW5uaW5nIGEgY2x1c3Rlciwgb25seSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB3ZWJhcHBzIGluIHRoZXJlCisgICAgICAgICAgICAgdGhhdCBuZWVkIHRvIGJlIGNsdXN0ZXJlZCBhbmQgcmVtb3ZlIHRoZSBvdGhlciBvbmVzLgorICAgICAgICAgICAgIEEgY2x1c3RlciBoYXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorCisgICAgICAgICAgICAgY2xhc3NOYW1lID0gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbHVzdGVyIGNsYXNzCisKKyAgICAgICAgICAgICBjbHVzdGVyTmFtZSA9IGEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgeW91ciBjbHVzdGVyLCBjYW4gYmUgYW55dGhpbmcKKworICAgICAgICAgICAgIG1jYXN0QWRkciA9IHRoZSBtdWx0aWNhc3QgYWRkcmVzcywgaGFzIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgdGhlIG5vZGVzCisKKyAgICAgICAgICAgICBtY2FzdFBvcnQgPSB0aGUgbXVsdGljYXN0IHBvcnQsIGhhcyB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIHRoZSBub2RlcworICAgICAgICAgICAgIAorICAgICAgICAgICAgIG1jYXN0QmluZEFkZHIgPSBiaW5kIHRoZSBtdWx0aWNhc3Qgc29ja2V0IHRvIGEgc3BlY2lmaWMgYWRkcmVzcworICAgICAgICAgICAgIAorICAgICAgICAgICAgIG1jYXN0VFRMID0gdGhlIG11bHRpY2FzdCBUVEwgaWYgeW91IHdhbnQgdG8gbGltaXQgeW91ciBicm9hZGNhc3QKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICBtY2FzdFNvVGltZW91dCA9IHRoZSBtdWx0aWNhc3QgcmVhZHRpbWVvdXQgCisKKyAgICAgICAgICAgICBtY2FzdEZyZXF1ZW5jeSA9IHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIGJldHdlZW4gc2VuZGluZyBhICJJJ20gYWxpdmUiIGhlYXJ0YmVhdAorCisgICAgICAgICAgICAgbWNhc3REcm9wVGltZSA9IHRoZSBudW1iZXIgYSBtaWxsaXNlY29uZHMgYmVmb3JlIGEgbm9kZSBpcyBjb25zaWRlcmVkICJkZWFkIiBpZiBubyBoZWFydGJlYXQgaXMgcmVjZWl2ZWQKKworICAgICAgICAgICAgIHRjcFRocmVhZENvdW50ID0gdGhlIG51bWJlciBvZiB0aHJlYWRzIHRvIGhhbmRsZSBpbmNvbWluZyByZXBsaWNhdGlvbiByZXF1ZXN0cywgb3B0aW1hbCB3b3VsZCBiZSB0aGUgc2FtZSBhbW91bnQgb2YgdGhyZWFkcyBhcyBub2RlcyAKKworICAgICAgICAgICAgIHRjcExpc3RlbkFkZHJlc3MgPSB0aGUgbGlzdGVuIGFkZHJlc3MgKGJpbmQgYWRkcmVzcykgZm9yIFRDUCBjbHVzdGVyIHJlcXVlc3Qgb24gdGhpcyBob3N0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY2FzZSBvZiBtdWx0aXBsZSBldGhlcm5ldCBjYXJkcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBtZWFucyB0aGF0IGFkZHJlc3MgYmVjb21lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0QWRkcmVzcygpCisKKyAgICAgICAgICAgICB0Y3BMaXN0ZW5Qb3J0ID0gdGhlIHRjcCBsaXN0ZW4gcG9ydAorCisgICAgICAgICAgICAgdGNwU2VsZWN0b3JUaW1lb3V0ID0gdGhlIHRpbWVvdXQgKG1zKSBmb3IgdGhlIFNlbGVjdG9yLnNlbGVjdCgpIG1ldGhvZCBpbiBjYXNlIHRoZSBPUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBhIHdha3VwIGJ1ZyBpbiBqYXZhLm5pby4gU2V0IHRvIDAgZm9yIG5vIHRpbWVvdXQKKworICAgICAgICAgICAgIHByaW50VG9TY3JlZW4gPSB0cnVlIG1lYW5zIHRoYXQgbWFuYWdlcnMgd2lsbCBhbHNvIHByaW50IHRvIHN0ZC5vdXQKKworICAgICAgICAgICAgIGV4cGlyZVNlc3Npb25zT25TaHV0ZG93biA9IHRydWUgbWVhbnMgdGhhdCAKKworICAgICAgICAgICAgIHVzZURpcnR5RmxhZyA9IHRydWUgbWVhbnMgdGhhdCB3ZSBvbmx5IHJlcGxpY2F0ZSBhIHNlc3Npb24gYWZ0ZXIgc2V0QXR0cmlidXRlLHJlbW92ZUF0dHJpYnV0ZSBoYXMgYmVlbiBjYWxsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgbWVhbnMgdG8gcmVwbGljYXRlIHRoZSBzZXNzaW9uIGFmdGVyIGVhY2ggcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBtZWFucyB0aGF0IHJlcGxpY2F0aW9uIHdvdWxkIHdvcmsgZm9yIHRoZSBmb2xsb3dpbmcgcGllY2Ugb2YgY29kZTogKG9ubHkgZm9yIFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8JQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hNYXAgbWFwID0gKEhhc2hNYXApc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoIm1hcCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoImtleSIsInZhbHVlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJT4KKyAgICAgICAgICAgICByZXBsaWNhdGlvbk1vZGUgPSBjYW4gYmUgZWl0aGVyICdwb29sZWQnLCAnc3luY2hyb25vdXMnIG9yICdhc3luY2hyb25vdXMnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUG9vbGVkIG1lYW5zIHRoYXQgdGhlIHJlcGxpY2F0aW9uIGhhcHBlbnMgdXNpbmcgc2V2ZXJhbCBzb2NrZXRzIGluIGEgc3luY2hyb25vdXMgd2F5LiBJZSwgdGhlIGRhdGEgZ2V0cyByZXBsaWNhdGVkLCB0aGVuIHRoZSByZXF1ZXN0IHJldHVybi4gVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgJ3N5bmNocm9ub3VzJyBzZXR0aW5nIGV4Y2VwdCBpdCB1c2VzIGEgcG9vbCBvZiBzb2NrZXRzLCBoZW5jZSBpdCBpcyBtdWx0aXRocmVhZGVkLiBUaGlzIGlzIHRoZSBmYXN0ZXN0IGFuZCBzYWZlc3QgY29uZmlndXJhdGlvbi4gVG8gdXNlIHRoaXMsIGFsc28gaW5jcmVhc2UgdGhlIG5yIG9mIHRjcCB0aHJlYWRzIHRoYXQgeW91IGhhdmUgZGVhbGluZyB3aXRoIHJlcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU3luY2hyb25vdXMgbWVhbnMgdGhhdCB0aGUgdGhyZWFkIHRoYXQgZXhlY3V0ZXMgdGhlIHJlcXVlc3QsIGlzIGFsc28gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkIHRoZSByZXBsaWNhdGVzIHRoZSBkYXRhIHRvIHRoZSBvdGhlciBub2RlcywgYW5kIHdpbGwgbm90IHJldHVybiB1bnRpbCBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlcyBoYXZlIHJlY2VpdmVkIHRoZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFzeW5jaHJvbm91cyBtZWFucyB0aGF0IHRoZXJlIGlzIGEgc3BlY2lmaWMgJ3NlbmRlcicgdGhyZWFkIGZvciBlYWNoIGNsdXN0ZXIgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGUgcmVxdWVzdCB0aHJlYWQgd2lsbCBxdWV1ZSB0aGUgcmVwbGljYXRpb24gcmVxdWVzdCBpbnRvIGEgInNtYXJ0IiBxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiByZXR1cm4gdG8gdGhlIGNsaWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgInNtYXJ0IiBxdWV1ZSBpcyBhIHF1ZXVlIHdoZXJlIHdoZW4gYSBzZXNzaW9uIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZSwgYW5kIHRoZSBzYW1lIHNlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcXVldWUgZnJvbSBhIHByZXZpb3VzIHJlcXVlc3QsIHRoYXQgc2Vzc2lvbiB3aWxsIGJlIHJlcGxhY2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHF1ZXVlIGluc3RlYWQgb2YgcmVwbGljYXRpbmcgdHdvIHJlcXVlc3RzLiBUaGlzIGFsbW9zdCBuZXZlciBoYXBwZW5zLCB1bmxlc3MgdGhlcmUgaXMgYSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXJnZSBuZXR3b3JrIGRlbGF5LgorICAgICAgICAtLT4gICAgICAgICAgICAgCisgICAgICAgIDwhLS0KKyAgICAgICAgICAgIFdoZW4gY29uZmlndXJpbmcgZm9yIGNsdXN0ZXJpbmcsIHlvdSBhbHNvIGFkZCBpbiBhIHZhbHZlIHRvIGNhdGNoIGFsbCB0aGUgcmVxdWVzdHMKKyAgICAgICAgICAgIGNvbWluZyBpbiwgYXQgdGhlIGVuZCBvZiB0aGUgcmVxdWVzdCwgdGhlIHNlc3Npb24gbWF5IG9yIG1heSBub3QgYmUgcmVwbGljYXRlZC4KKyAgICAgICAgICAgIEEgc2Vzc2lvbiBpcyByZXBsaWNhdGVkIGlmIGFuZCBvbmx5IGlmIGFsbCB0aGUgY29uZGl0aW9ucyBhcmUgbWV0OgorICAgICAgICAgICAgMS4gdXNlRGlydHlGbGFnIGlzIHRydWUgb3Igc2V0QXR0cmlidXRlIG9yIHJlbW92ZUF0dHJpYnV0ZSBoYXMgYmVlbiBjYWxsZWQgQU5ECisgICAgICAgICAgICAyLiBhIHNlc3Npb24gZXhpc3RzIChoYXMgYmVlbiBjcmVhdGVkKQorICAgICAgICAgICAgMy4gdGhlIHJlcXVlc3QgaXMgbm90IHRyYXBwZWQgYnkgdGhlICJmaWx0ZXIiIGF0dHJpYnV0ZQorCisgICAgICAgICAgICBUaGUgZmlsdGVyIGF0dHJpYnV0ZSBpcyB0byBmaWx0ZXIgb3V0IHJlcXVlc3RzIHRoYXQgY291bGQgbm90IG1vZGlmeSB0aGUgc2Vzc2lvbiwKKyAgICAgICAgICAgIGhlbmNlIHdlIGRvbid0IHJlcGxpY2F0ZSB0aGUgc2Vzc2lvbiBhZnRlciB0aGUgZW5kIG9mIHRoaXMgcmVxdWVzdC4KKyAgICAgICAgICAgIFRoZSBmaWx0ZXIgaXMgbmVnYXRpdmUsIGllLCBhbnl0aGluZyB5b3UgcHV0IGluIHRoZSBmaWx0ZXIsIHlvdSBtZWFuIHRvIGZpbHRlciBvdXQsCisgICAgICAgICAgICBpZSwgbm8gcmVwbGljYXRpb24gd2lsbCBiZSBkb25lIG9uIHJlcXVlc3RzIHRoYXQgbWF0Y2ggb25lIG9mIHRoZSBmaWx0ZXJzLgorICAgICAgICAgICAgVGhlIGZpbHRlciBhdHRyaWJ1dGUgaXMgZGVsaW1pdGVkIGJ5IDssIHNvIHlvdSBjYW4ndCBlc2NhcGUgb3V0IDsgZXZlbiBpZiB5b3Ugd2FudGVkIHRvLgorCisgICAgICAgICAgICBmaWx0ZXI9Ii4qXC5naWY7LipcLmpzOyIgbWVhbnMgdGhhdCB3ZSB3aWxsIG5vdCByZXBsaWNhdGUgdGhlIHNlc3Npb24gYWZ0ZXIgcmVxdWVzdHMgd2l0aCB0aGUgVVJJCisgICAgICAgICAgICBlbmRpbmcgd2l0aCAuZ2lmIGFuZCAuanMgYXJlIGludGVyY2VwdGVkLgorICAgICAgICAgICAgCisgICAgICAgICAgICBUaGUgZGVwbG95ZXIgZWxlbWVudCBjYW4gYmUgdXNlZCB0byBkZXBsb3kgYXBwcyBjbHVzdGVyIHdpZGUuCisgICAgICAgICAgICBDdXJyZW50bHkgdGhlIGRlcGxveW1lbnQgb25seSBkZXBsb3lzL3VuZGVwbG95cyB0byB3b3JraW5nIG1lbWJlcnMgaW4gdGhlIGNsdXN0ZXIKKyAgICAgICAgICAgIHNvIG5vIFdBUnMgYXJlIGNvcGllZCB1cG9ucyBzdGFydHVwIG9mIGEgYnJva2VuIG5vZGUuCisgICAgICAgICAgICBUaGUgZGVwbG95ZXIgd2F0Y2hlcyBhIGRpcmVjdG9yeSAod2F0Y2hEaXIpIGZvciBXQVIgZmlsZXMgd2hlbiB3YXRjaEVuYWJsZWQ9InRydWUiCisgICAgICAgICAgICBXaGVuIGEgbmV3IHdhciBmaWxlIGlzIGFkZGVkIHRoZSB3YXIgZ2V0cyBkZXBsb3llZCB0byB0aGUgbG9jYWwgaW5zdGFuY2UsCisgICAgICAgICAgICBhbmQgdGhlbiBkZXBsb3llZCB0byB0aGUgb3RoZXIgaW5zdGFuY2VzIGluIHRoZSBjbHVzdGVyLgorICAgICAgICAgICAgV2hlbiBhIHdhciBmaWxlIGlzIGRlbGV0ZWQgZnJvbSB0aGUgd2F0Y2hEaXIgdGhlIHdhciBpcyB1bmRlcGxveWVkIGxvY2FsbHkgCisgICAgICAgICAgICBhbmQgY2x1c3RlciB3aWRlCisgICAgICAgIC0tPgorICAgICAgICAKKyAgICAgICAgPENsdXN0ZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnRjcC5TaW1wbGVUY3BDbHVzdGVyIgorICAgICAgICAgICAgICAgICBtYW5hZ2VyQ2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnNlc3Npb24uQmFja3VwTWFuYWdlciIKKyAgICAgICAgICAgICAgICAgZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbj0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgY2hhbm5lbFNlbmRPcHRpb25zPSIxMSIKKyAgICAgICAgICAgICAgICAgbWFuYWdlci5tYXBTZW5kT3B0aW9ucz0iMTEiPgorCisgICAgICAgICAgICA8Q2hhbm5lbCBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkdyb3VwQ2hhbm5lbCI+CisgICAgICAgICAgICAgICAgPE1lbWJlcnNoaXAgCisgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMubWVtYmVyc2hpcC5NY2FzdFNlcnZpY2UiCisgICAgICAgICAgICAgICAgICAgIG1jYXN0QWRkcj0iMjI4LjAuMC40IgorICAgICAgICAgICAgICAgICAgICBtY2FzdFBvcnQ9IjQ1NTY0IgorICAgICAgICAgICAgICAgICAgICBtY2FzdEZyZXF1ZW5jeT0iNTAwIgorICAgICAgICAgICAgICAgICAgICBtY2FzdERyb3BUaW1lPSIzMDAwIi8+CisKKyAgICAgICAgICAgICAgICA8UmVjZWl2ZXIgCisgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0Lm5pby5OaW9SZWNlaXZlciIKKyAgICAgICAgICAgICAgICAgICAgdGNwTGlzdGVuQWRkcmVzcz0iYXV0byIKKyAgICAgICAgICAgICAgICAgICAgdGNwTGlzdGVuUG9ydD0iNDAwMSIKKyAgICAgICAgICAgICAgICAgICAgbWluVGhyZWFkcz0iNiIKKyAgICAgICAgICAgICAgICAgICAgbWF4VGhyZWFkcz0iMjUiCisgICAgICAgICAgICAgICAgICAgIHJ4QnVmU2l6ZT0iNDM4MDAiCisgICAgICAgICAgICAgICAgICAgIHR4QnVmU2l6ZT0iMjUxODgiCisgICAgICAgICAgICAgICAgICAgIGF1dG9CaW5kPSIxMCIvPgorCisgICAgICAgICAgICAgICAgPFNlbmRlcgorICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5SZXBsaWNhdGlvblRyYW5zbWl0dGVyIj4KKyAgICAgICAgICAgICAgICAgICAgPFRyYW5zcG9ydCBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5uaW8uUG9vbGVkUGFyYWxsZWxTZW5kZXIiCisgICAgICAgICAgICAgICAgICAgICAgICByeEJ1ZlNpemU9IjQzODAwIgorICAgICAgICAgICAgICAgICAgICAgICAgdHhCdWZTaXplPSIyNTE4OCIvPgorICAgICAgICAgICAgICAgIDwvU2VuZGVyPgorICAgICAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICA8SW50ZXJjZXB0b3IgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuR3ppcEludGVyY2VwdG9yIi8+CisgICAgICAgICAgICAgICAgPEludGVyY2VwdG9yIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzLkZyYWdtZW50YXRpb25JbnRlcmNlcHRvciIvPgorICAgICAgICAgICAgICAgIDxJbnRlcmNlcHRvciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9ycy5PcmRlckludGVyY2VwdG9yIi8+CisgICAgICAgICAgICAgICAgPEludGVyY2VwdG9yIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzLk1lc3NhZ2VEaXNwYXRjaEludGVyY2VwdG9yIi8+CisgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICA8L0NoYW5uZWw+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDxWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuaGEudGNwLlJlcGxpY2F0aW9uVmFsdmUiCisgICAgICAgICAgICAgICAgICAgZmlsdGVyPSIuKlwuZ2lmOy4qXC5qczsuKlwuanBnOy4qXC5wbmc7LipcLmh0bTsuKlwuaHRtbDsuKlwuY3NzOy4qXC50eHQ7Ii8+CisgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICA8RGVwbG95ZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLmRlcGxveS5GYXJtV2FyRGVwbG95ZXIiCisgICAgICAgICAgICAgICAgICAgICAgdGVtcERpcj0iL3RtcC93YXItdGVtcC8iCisgICAgICAgICAgICAgICAgICAgICAgZGVwbG95RGlyPSIvdG1wL3dhci1kZXBsb3kvIgorICAgICAgICAgICAgICAgICAgICAgIHdhdGNoRGlyPSIvdG1wL3dhci1saXN0ZW4vIgorICAgICAgICAgICAgICAgICAgICAgIHdhdGNoRW5hYmxlZD0iZmFsc2UiLz4KKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIDxDbHVzdGVyTGlzdGVuZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnNlc3Npb24uQ2x1c3RlclNlc3Npb25MaXN0ZW5lciIvPgorICAgICAgICA8L0NsdXN0ZXI+CisgICAgCisKKworCisgICAgICAgIDwhLS0gTm9ybWFsbHksIHVzZXJzIG11c3QgYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMgdG8gZWFjaCB3ZWIgYXBwCisgICAgICAgICAgICAgaW5kaXZpZHVhbGx5LiAgVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgZW50cnkgaWYgeW91IHdvdWxkIGxpa2UKKyAgICAgICAgICAgICBhIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZCB0aGUgZmlyc3QgdGltZSB0aGV5IGVuY291bnRlciBhCisgICAgICAgICAgICAgcmVzb3VyY2UgcHJvdGVjdGVkIGJ5IGEgc2VjdXJpdHkgY29uc3RyYWludCwgYW5kIHRoZW4gaGF2ZSB0aGF0CisgICAgICAgICAgICAgdXNlciBpZGVudGl0eSBtYWludGFpbmVkIGFjcm9zcyAqYWxsKiB3ZWIgYXBwbGljYXRpb25zIGNvbnRhaW5lZAorICAgICAgICAgICAgIGluIHRoaXMgdmlydHVhbCBob3N0LiAtLT4KKyAgICAgICAgPCEtLQorICAgICAgICA8VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuU2luZ2xlU2lnbk9uIiAvPgorICAgICAgICAtLT4KKworICAgICAgICA8IS0tIEFjY2VzcyBsb2cgcHJvY2Vzc2VzIGFsbCByZXF1ZXN0cyBmb3IgdGhpcyB2aXJ0dWFsIGhvc3QuICBCeQorICAgICAgICAgICAgIGRlZmF1bHQsIGxvZyBmaWxlcyBhcmUgY3JlYXRlZCBpbiB0aGUgImxvZ3MiIGRpcmVjdG9yeSByZWxhdGl2ZSB0bworICAgICAgICAgICAgICRDQVRBTElOQV9IT01FLiAgSWYgeW91IHdpc2gsIHlvdSBjYW4gc3BlY2lmeSBhIGRpZmZlcmVudAorICAgICAgICAgICAgIGRpcmVjdG9yeSB3aXRoIHRoZSAiZGlyZWN0b3J5IiBhdHRyaWJ1dGUuICBTcGVjaWZ5IGVpdGhlciBhIHJlbGF0aXZlCisgICAgICAgICAgICAgKHRvICRDQVRBTElOQV9IT01FKSBvciBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBkZXNpcmVkIGRpcmVjdG9yeS4KKyAgICAgICAgLS0+CisgICAgICAgIDwhLS0KKyAgICAgICAgPFZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuQWNjZXNzTG9nVmFsdmUiCisgICAgICAgICAgICAgICAgIGRpcmVjdG9yeT0ibG9ncyIgIHByZWZpeD0ibG9jYWxob3N0X2FjY2Vzc19sb2cuIiBzdWZmaXg9Ii50eHQiCisgICAgICAgICAgICAgICAgIHBhdHRlcm49ImNvbW1vbiIgcmVzb2x2ZUhvc3RzPSJmYWxzZSIvPgorICAgICAgICAtLT4KKworICAgICAgICA8IS0tIEFjY2VzcyBsb2cgcHJvY2Vzc2VzIGFsbCByZXF1ZXN0cyBmb3IgdGhpcyB2aXJ0dWFsIGhvc3QuICBCeQorICAgICAgICAgICAgIGRlZmF1bHQsIGxvZyBmaWxlcyBhcmUgY3JlYXRlZCBpbiB0aGUgImxvZ3MiIGRpcmVjdG9yeSByZWxhdGl2ZSB0bworICAgICAgICAgICAgICRDQVRBTElOQV9IT01FLiAgSWYgeW91IHdpc2gsIHlvdSBjYW4gc3BlY2lmeSBhIGRpZmZlcmVudAorICAgICAgICAgICAgIGRpcmVjdG9yeSB3aXRoIHRoZSAiZGlyZWN0b3J5IiBhdHRyaWJ1dGUuICBTcGVjaWZ5IGVpdGhlciBhIHJlbGF0aXZlCisgICAgICAgICAgICAgKHRvICRDQVRBTElOQV9IT01FKSBvciBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBkZXNpcmVkIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICBUaGlzIGFjY2VzcyBsb2cgaW1wbGVtZW50YXRpb24gaXMgb3B0aW1pemVkIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlLAorICAgICAgICAgICAgIGJ1dCBpcyBoYXJkY29kZWQgdG8gc3VwcG9ydCBvbmx5IHRoZSAiY29tbW9uIiBhbmQgImNvbWJpbmVkIiBwYXR0ZXJucy4KKyAgICAgICAgLS0+CisgICAgICAgIDwhLS0KKyAgICAgICAgPFZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuRmFzdENvbW1vbkFjY2Vzc0xvZ1ZhbHZlIgorICAgICAgICAgICAgICAgICBkaXJlY3Rvcnk9ImxvZ3MiICBwcmVmaXg9ImxvY2FsaG9zdF9hY2Nlc3NfbG9nLiIgc3VmZml4PSIudHh0IgorICAgICAgICAgICAgICAgICBwYXR0ZXJuPSJjb21tb24iIHJlc29sdmVIb3N0cz0iZmFsc2UiLz4KKyAgICAgICAgLS0+CisgICAgICAgIDwhLS0gQWNjZXNzIGxvZyBwcm9jZXNzZXMgYWxsIHJlcXVlc3RzIGZvciB0aGlzIHZpcnR1YWwgaG9zdC4gIEJ5CisgICAgICAgICAgICAgZGVmYXVsdCwgbG9nIGZpbGVzIGFyZSBjcmVhdGVkIGluIHRoZSAibG9ncyIgZGlyZWN0b3J5IHJlbGF0aXZlIHRvCisgICAgICAgICAgICAgJENBVEFMSU5BX0hPTUUuICBJZiB5b3Ugd2lzaCwgeW91IGNhbiBzcGVjaWZ5IGEgZGlmZmVyZW50CisgICAgICAgICAgICAgZGlyZWN0b3J5IHdpdGggdGhlICJkaXJlY3RvcnkiIGF0dHJpYnV0ZS4gIFNwZWNpZnkgZWl0aGVyIGEgcmVsYXRpdmUKKyAgICAgICAgICAgICAodG8gJENBVEFMSU5BX0hPTUUpIG9yIGFic29sdXRlIHBhdGggdG8gdGhlIGRlc2lyZWQgZGlyZWN0b3J5LgorICAgICAgICAgICAgIFRoaXMgYWNjZXNzIGxvZyBpbXBsZW1lbnRhdGlvbiBpcyBvcHRpbWl6ZWQgZm9yIG1heGltdW0gcGVyZm9ybWFuY2UsCisgICAgICAgICAgICAgYnV0IGlzIGhhcmRjb2RlZCB0byBzdXBwb3J0IG9ubHkgdGhlICJjb21tb24iIGFuZCAiY29tYmluZWQiIHBhdHRlcm5zLgorCisgICAgICAgICAgICAgVGhpcyB2YWx2ZSB1c2UgTklPIGRpcmVjdCBCeXRlIEJ1ZmZlciB0byBhc3luY2hvcm5vdXNseSBzdG9yZSB0aGUKKyAgICAgICAgICAgICBsb2cuCisgICAgICAgIC0tPgorICAgICAgICA8IS0tCisgICAgICAgIDxWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkJ5dGVCdWZmZXJBY2Nlc3NMb2dWYWx2ZSIKKyAgICAgICAgICAgICAgICAgZGlyZWN0b3J5PSJsb2dzIiAgcHJlZml4PSJsb2NhbGhvc3RfYWNjZXNzX2xvZy4iIHN1ZmZpeD0iLnR4dCIKKyAgICAgICAgICAgICAgICAgcGF0dGVybj0iY29tbW9uIiByZXNvbHZlSG9zdHM9ImZhbHNlIi8+CisgICAgICAgIC0tPgorCisgICAgICA8L0hvc3Q+CisKKyAgICA8L0VuZ2luZT4KKworICA8L1NlcnZpY2U+CisKKzwvU2VydmVyPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvQ2F0YWxpbmFDbHVzdGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9DYXRhbGluYUNsdXN0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTk4ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvQ2F0YWxpbmFDbHVzdGVyLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKKworCisKKy8qKgorICogQSA8Yj5DYXRhbGluYUNsdXN0ZXI8L2I+IGludGVyZmFjZSBhbGxvd3MgdG8gcGx1ZyBpbiBhbmQgb3V0IHRoZSAKKyAqIGRpZmZlcmVudCBjbHVzdGVyIGltcGxlbWVudGF0aW9ucworICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgQ2F0YWxpbmFDbHVzdGVyIGV4dGVuZHMgQ2x1c3RlciB7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGluZm8gPSAiQ2F0YWxpbmFDbHVzdGVyLzIuMCI7CisgICAgCisgICAgLyoqCisgICAgICogU3RhcnQgdGhlIGNsdXN0ZXIsIHRoZSBvd25pbmcgY29udGFpbmVyIHdpbGwgaW52b2tlIHRoaXMKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiAtIGlmIGZhaWx1cmUgdG8gc3RhcnQgY2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgY2x1c3RlciwgdGhlIG93bmluZyBjb250YWluZXIgd2lsbCBpbnZva2UgdGhpcworICAgICAqIEB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb247CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXNzb2NpYXRlcyBsb2dnZXIgd2l0aCB0aGlzIGNsdXN0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIExvZworICAgICAqLworICAgIHB1YmxpYyBMb2cgZ2V0TG9nZ2VyKCk7CisgICAgCisgICAgLyoqCisgICAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGFsbCB0aGUgbWVtYmVycyBpbiB0aGUgY2x1c3RlcgorICAgICAqIEBwYXJhbSBtc2cgQ2x1c3Rlck1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kKENsdXN0ZXJNZXNzYWdlIG1zZyk7CisgICAgCisgICAgLyoqCisgICAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGEgc3BlY2lmaWMgbWVtYmVyIGluIHRoZSBjbHVzdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZyBDbHVzdGVyTWVzc2FnZQorICAgICAqIEBwYXJhbSBkZXN0IE1lbWJlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmQoQ2x1c3Rlck1lc3NhZ2UgbXNnLCBNZW1iZXIgZGVzdCk7CisgICAgCisgICAgLyoqCisgICAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGEgYWxsIG1lbWJlcnMgYXQgbG9jYWwgY2x1c3RlciBkb21haW4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cgQ2x1c3Rlck1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kQ2x1c3RlckRvbWFpbihDbHVzdGVyTWVzc2FnZSBtc2cpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGF0IGNsdXN0ZXIgaGFzIG1lbWJlcnMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTWVtYmVycygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgdGhlIG1lbWJlcnMgY3VycmVudGx5IHBhcnRpY2lwYXRpbmcgaW4gdGhlIGNsdXN0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1lbWJlcltdCisgICAgICovCisgICAgcHVibGljIE1lbWJlcltdIGdldE1lbWJlcnMoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1lbWJlciB0aGF0IHJlcHJlc2VudHMgdGhpcyBub2RlLgorICAgICAqCisgICAgICogQHJldHVybiBNZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyIGdldExvY2FsTWVtYmVyKCk7CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkVmFsdmUoVmFsdmUgdmFsdmUpOworICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZENsdXN0ZXJMaXN0ZW5lcihDbHVzdGVyTGlzdGVuZXIgbGlzdGVuZXIpOworICAgIAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNsdXN0ZXJMaXN0ZW5lcihDbHVzdGVyTGlzdGVuZXIgbGlzdGVuZXIpOworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXJEZXBsb3llcihDbHVzdGVyRGVwbG95ZXIgZGVwbG95ZXIpOworICAgIAorICAgIHB1YmxpYyBDbHVzdGVyRGVwbG95ZXIgZ2V0Q2x1c3RlckRlcGxveWVyKCk7CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgbWFwIG9mIG1hbmFnZXJzCisgICAgICovCisgICAgcHVibGljIE1hcCBnZXRNYW5hZ2VycygpOworCisgICAgcHVibGljIE1hbmFnZXIgZ2V0TWFuYWdlcihTdHJpbmcgbmFtZSk7CisgICAgcHVibGljIHZvaWQgcmVtb3ZlTWFuYWdlcihTdHJpbmcgbmFtZSxNYW5hZ2VyIG1hbmFnZXIpOworICAgIHB1YmxpYyB2b2lkIGFkZE1hbmFnZXIoU3RyaW5nIG5hbWUsTWFuYWdlciBtYW5hZ2VyKTsKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1hbmFnZXJOYW1lKFN0cmluZyBuYW1lLCBNYW5hZ2VyIG1hbmFnZXIpOworICAgIHB1YmxpYyBWYWx2ZVtdIGdldFZhbHZlcygpOworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENoYW5uZWwoQ2hhbm5lbCBjaGFubmVsKTsKKyAgICBwdWJsaWMgQ2hhbm5lbCBnZXRDaGFubmVsKCk7CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL0NsdXN0ZXJEZXBsb3llci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvQ2x1c3RlckRlcGxveWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzOGVlYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL0NsdXN0ZXJEZXBsb3llci5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5oYTsKKworLyoqCisgKiBBIDxiPkNsdXN0ZXJEZXBsb3llcjwvYj4gaW50ZXJmYWNlIGFsbG93cyB0byBwbHVnIGluIGFuZCBvdXQgdGhlCisgKiBkaWZmZXJlbnQgZGVwbG95bWVudCBpbXBsZW1lbnRhdGlvbnMKKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxMaXN0ZW5lcjsKKworcHVibGljIGludGVyZmFjZSBDbHVzdGVyRGVwbG95ZXIgZXh0ZW5kcyBDaGFubmVsTGlzdGVuZXIgeworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29tcG9uZW50IGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgaW5mbyA9ICJDbHVzdGVyRGVwbG95ZXIvMS4wIjsKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGUgY2x1c3RlciBkZXBsb3llciwgdGhlIG93bmluZyBjb250YWluZXIgd2lsbCBpbnZva2UgdGhpcworICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIC0gaWYgZmFpbHVyZSB0byBzdGFydCBjbHVzdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIGNsdXN0ZXIgZGVwbG95ZXIsIHRoZSBvd25pbmcgY29udGFpbmVyIHdpbGwgaW52b2tlIHRoaXMKKyAgICAgKiBAdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVwbG95ZXIgZm9yIHRoaXMgY2x1c3RlciBkZXBsb3llciB0byB1c2UuCisgICAgICogQHBhcmFtIGRlcGxveWVyIERlcGxveWVyCisgICAgICovCisgICAgLy8gRklYTUUKKyAgICAvL3B1YmxpYyB2b2lkIHNldERlcGxveWVyKERlcGxveWVyIGRlcGxveWVyKTsKKworICAgIC8qKgorICAgICAqIEluc3RhbGwgYSBuZXcgd2ViIGFwcGxpY2F0aW9uLCB3aG9zZSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSBpcyBhdCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgVVJMLCBpbnRvIHRoaXMgY29udGFpbmVyIGFuZCBhbGwgdGhlIG90aGVyCisgICAgICogbWVtYmVycyBvZiB0aGUgY2x1c3RlciB3aXRoIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoLgorICAgICAqIEEgY29udGV4dCBwYXRoIG9mICIiICh0aGUgZW1wdHkgc3RyaW5nKSBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHJvb3QKKyAgICAgKiBhcHBsaWNhdGlvbiBmb3IgdGhpcyBjb250YWluZXIuICBPdGhlcndpc2UsIHRoZSBjb250ZXh0IHBhdGggbXVzdAorICAgICAqIHN0YXJ0IHdpdGggYSBzbGFzaC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGlzIGFwcGxpY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgbG9jYWxseSwgCisgICAgICogYSBDb250YWluZXJFdmVudCBvZiB0eXBlCisgICAgICogPGNvZGU+SU5TVEFMTF9FVkVOVDwvY29kZT4gd2lsbCBiZSBzZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycywKKyAgICAgKiB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbnRleHQ8L2NvZGU+IGFzIGFuIGFyZ3VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHRQYXRoIFRoZSBjb250ZXh0IHBhdGggdG8gd2hpY2ggdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQKKyAgICAgKiAgYmUgaW5zdGFsbGVkIChtdXN0IGJlIHVuaXF1ZSkKKyAgICAgKiBAcGFyYW0gd2FyIEEgVVJMIG9mIHR5cGUgImphcjoiIHRoYXQgcG9pbnRzIHRvIGEgV0FSIGZpbGUsIG9yIHR5cGUKKyAgICAgKiAgImZpbGU6IiB0aGF0IHBvaW50cyB0byBhbiB1bnBhY2tlZCBkaXJlY3Rvcnkgc3RydWN0dXJlIGNvbnRhaW5pbmcKKyAgICAgKiAgdGhlIHdlYiBhcHBsaWNhdGlvbiB0byBiZSBpbnN0YWxsZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoCisgICAgICogIGlzIG1hbGZvcm1lZCAoaXQgbXVzdCBiZSAiIiBvciBzdGFydCB3aXRoIGEgc2xhc2gpCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGgKKyAgICAgKiAgaXMgYWxyZWFkeSBhdHRhY2hlZCB0byBhbiBleGlzdGluZyB3ZWIgYXBwbGljYXRpb24KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciB3YXMgZW5jb3VudGVyZWQKKyAgICAgKiAgZHVyaW5nIGluc3RhbGxhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluc3RhbGwoU3RyaW5nIGNvbnRleHRQYXRoLCBVUkwgd2FyKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXhpc3Rpbmcgd2ViIGFwcGxpY2F0aW9uLCBhdHRhY2hlZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQKKyAgICAgKiBwYXRoLiAgSWYgdGhpcyBhcHBsaWNhdGlvbiBpcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZCwgYQorICAgICAqIENvbnRhaW5lckV2ZW50IG9mIHR5cGUgPGNvZGU+UkVNT1ZFX0VWRU5UPC9jb2RlPiB3aWxsIGJlIHNlbnQgdG8gYWxsCisgICAgICogcmVnaXN0ZXJlZCBsaXN0ZW5lcnMsIHdpdGggdGhlIHJlbW92ZWQgPGNvZGU+Q29udGV4dDwvY29kZT4gYXMKKyAgICAgKiBhbiBhcmd1bWVudC4gRGVsZXRlcyB0aGUgd2ViIGFwcGxpY2F0aW9uIHdhciBmaWxlIGFuZC9vciBkaXJlY3RvcnkKKyAgICAgKiBpZiB0aGV5IGV4aXN0IGluIHRoZSBIb3N0J3MgYXBwQmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCBUaGUgY29udGV4dCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSByZW1vdmVkCisgICAgICogQHBhcmFtIHVuZGVwbG95IGJvb2xlYW4gZmxhZyB0byByZW1vdmUgd2ViIGFwcGxpY2F0aW9uIGZyb20gc2VydmVyCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aAorICAgICAqICBpcyBtYWxmb3JtZWQgKGl0IG11c3QgYmUgIiIgb3Igc3RhcnQgd2l0aCBhIHNsYXNoKQorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoIGRvZXMKKyAgICAgKiAgbm90IGlkZW50aWZ5IGEgY3VycmVudGx5IGluc3RhbGxlZCB3ZWIgYXBwbGljYXRpb24KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMgZHVyaW5nCisgICAgICogIHJlbW92YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGNvbnRleHRQYXRoLCBib29sZWFuIHVuZGVwbG95KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBjYWxsIGZyb20gY29udGFpbmVyIEJhY2tncm91bmQgUHJvY2VzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJhY2tncm91bmRQcm9jZXNzKCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2x1c3RlciB0aGUgY2x1c3RlciBkZXBsb3llciBpcyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiBAcmV0dXJuIENhdGFsaW5hQ2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyBDYXRhbGluYUNsdXN0ZXIgZ2V0Q2x1c3RlcigpOworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlcyB0aGUgY2x1c3RlciBkZXBsb3llciB3aXRoIGEgY2x1c3RlcgorICAgICAqIEBwYXJhbSBjbHVzdGVyIENhdGFsaW5hQ2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXIoQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIpOworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9DbHVzdGVyTGlzdGVuZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL0NsdXN0ZXJMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZTkzNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9DbHVzdGVyTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGE7CisKKworCisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworCisKKy8qKgorICogUmVjZWl2ZSBTZXNzaW9uSUQgY2x1c3RlciBjaGFuZ2UgZnJvbSBvdGhlciBiYWNrdXAgbm9kZSBhZnRlciBwcmltYXJ5IHNlc3Npb24KKyAqIG5vZGUgaXMgZmFpbGVkLgorICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2x1c3Rlckxpc3RlbmVyIGltcGxlbWVudHMgQ2hhbm5lbExpc3RlbmVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKENsdXN0ZXJMaXN0ZW5lci5jbGFzcyk7CisKKworICAgIC8vLS1JbnN0YW5jZSBWYXJpYWJsZXMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ01hbmFnZXIgc20gPSBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgcHJvdGVjdGVkIENhdGFsaW5hQ2x1c3RlciBjbHVzdGVyID0gbnVsbDsKKworICAgIC8vLS1Db25zdHJ1Y3Rvci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIENsdXN0ZXJMaXN0ZW5lcigpIHsKKyAgICB9CisgICAgCisgICAgLy8tLUluc3RhbmNlIEdldHRlcnMvU2V0dGVycy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgCisgICAgcHVibGljIENhdGFsaW5hQ2x1c3RlciBnZXRDbHVzdGVyKCkgeworICAgICAgICByZXR1cm4gY2x1c3RlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDbHVzdGVyKENhdGFsaW5hQ2x1c3RlciBjbHVzdGVyKSB7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgaWYgKGNsdXN0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoImFkZCBDbHVzdGVyTGlzdGVuZXIgIiArIHRoaXMudG9TdHJpbmcoKSArICIgdG8gY2x1c3RlciIgKyBjbHVzdGVyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoInJlbW92ZSBDbHVzdGVyTGlzdGVuZXIgIiArIHRoaXMudG9TdHJpbmcoKSArICIgZnJvbSBjbHVzdGVyIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5jbHVzdGVyID0gY2x1c3RlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGxpc3RlbmVyKSB7CisgICAgICAgIHJldHVybiBzdXBlci5lcXVhbHMobGlzdGVuZXIpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8vLS1Mb2dpYy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgbWVzc2FnZVJlY2VpdmVkKFNlcmlhbGl6YWJsZSBtc2csIE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgaWYgKCBtc2cgaW5zdGFuY2VvZiBDbHVzdGVyTWVzc2FnZSApIG1lc3NhZ2VSZWNlaXZlZCgoQ2x1c3Rlck1lc3NhZ2UpbXNnKTsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gYWNjZXB0KFNlcmlhbGl6YWJsZSBtc2csIE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgaWYgKCBtc2cgaW5zdGFuY2VvZiBDbHVzdGVyTWVzc2FnZSApIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZyb20gdGhlIGNsdXN0ZXIsIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkLCBUaGUgY2x1c3RlciB3aWxsCisgICAgICogYnJvYWRjYXN0IGl0IGludm9raW5nIHRoZSBtZXNzYWdlUmVjZWl2ZWQgb24gdGhlIHJlY2VpdmVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgICAgICAgIENsdXN0ZXJNZXNzYWdlIC0gdGhlIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgY2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG1lc3NhZ2VSZWNlaXZlZChDbHVzdGVyTWVzc2FnZSBtc2cpIDsKKyAgICAKKworICAgIC8qKgorICAgICAqIEFjY2VwdCBvbmx5IFNlc3Npb25JRE1lc3NhZ2VzCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgQ2x1c3Rlck1lc3NhZ2UKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gLSByZXR1cm5zIHRydWUgdG8gaW5kaWNhdGUgdGhhdCBtZXNzYWdlUmVjZWl2ZWQgc2hvdWxkIGJlCisgICAgICogICAgICAgICBpbnZva2VkLiBJZiBmYWxzZSBpcyByZXR1cm5lZCwgdGhlIG1lc3NhZ2VSZWNlaXZlZCBtZXRob2Qgd2lsbAorICAgICAqICAgICAgICAgbm90IGJlIGludm9rZWQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYWNjZXB0KENsdXN0ZXJNZXNzYWdlIG1zZykgOworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9DbHVzdGVyTWFuYWdlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvQ2x1c3Rlck1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGI4M2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvQ2x1c3Rlck1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5oYTsKKworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uUmVwbGljYXRpb25TdHJlYW07CisKKworLyoqCisgKiBUaGUgY29tbW9uIGludGVyZmFjZSB1c2VkIGJ5IGFsbCBjbHVzdGVyIG1hbmFnZXIuCisgKiBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuIGhhdmUgYSBtb3JlIHBsdWdnYWJsZSB3YXkKKyAqIG9mIHN3YXBwaW5nIHNlc3Npb24gbWFuYWdlcnMgZm9yIGRpZmZlcmVudCBhbGdvcml0aG1zLgorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqLworcHVibGljIGludGVyZmFjZSBDbHVzdGVyTWFuYWdlciBleHRlbmRzIE1hbmFnZXIgeworCisgICAvKioKKyAgICAqIEEgbWVzc2FnZSB3YXMgcmVjZWl2ZWQgZnJvbSBhbm90aGVyIG5vZGUsIHRoaXMKKyAgICAqIGlzIHRoZSBjYWxsYmFjayBtZXRob2QgdG8gaW1wbGVtZW50IGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbgorICAgICogcmVjZWl2aW5nIHJlcGxpY2F0aW9uIG1lc3NhZ2VzLgorICAgICogQHBhcmFtIG1zZyAtIHRoZSBtZXNzYWdlIHJlY2VpdmVkLgorICAgICovCisgICBwdWJsaWMgdm9pZCBtZXNzYWdlRGF0YVJlY2VpdmVkKENsdXN0ZXJNZXNzYWdlIG1zZyk7CisKKyAgIC8qKgorICAgICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBjb21wbGV0ZWQsIHRoZSByZXBsaWNhdGlvbiB2YWx2ZQorICAgICogd2lsbCBub3RpZnkgdGhlIG1hbmFnZXIsIGFuZCB0aGUgbWFuYWdlciB3aWxsIGRlY2lkZSB3aGV0aGVyCisgICAgKiBhbnkgcmVwbGljYXRpb24gaXMgbmVlZGVkIG9yIG5vdC4KKyAgICAqIElmIHRoZXJlIGlzIGEgbmVlZCBmb3IgcmVwbGljYXRpb24sIHRoZSBtYW5hZ2VyIHdpbGwKKyAgICAqIGNyZWF0ZSBhIHNlc3Npb24gbWVzc2FnZSBhbmQgdGhhdCB3aWxsIGJlIHJlcGxpY2F0ZWQuCisgICAgKiBUaGUgY2x1c3RlciBkZXRlcm1pbmVzIHdoZXJlIGl0IGdldHMgc2VudC4KKyAgICAqIEBwYXJhbSBzZXNzaW9uSWQgLSB0aGUgc2Vzc2lvbklkIHRoYXQganVzdCBjb21wbGV0ZWQuCisgICAgKiBAcmV0dXJuIGEgU2Vzc2lvbk1lc3NhZ2UgdG8gYmUgc2VudC4KKyAgICAqLworICAgcHVibGljIENsdXN0ZXJNZXNzYWdlIHJlcXVlc3RDb21wbGV0ZWQoU3RyaW5nIHNlc3Npb25JZCk7CisKKyAgIC8qKgorICAgICogV2hlbiB0aGUgbWFuYWdlciBleHBpcmVzIHNlc3Npb24gbm90IHRpZWQgdG8gYSByZXF1ZXN0LgorICAgICogVGhlIGNsdXN0ZXIgd2lsbCBwZXJpb2RpY2FsbHkgYXNrIGZvciBhIGxpc3Qgb2Ygc2Vzc2lvbnMKKyAgICAqIHRoYXQgc2hvdWxkIGV4cGlyZSBhbmQgdGhhdCBzaG91bGQgYmUgc2VudCBhY3Jvc3MgdGhlIHdpcmUuCisgICAgKiBAcmV0dXJuIFN0cmluZ1tdIFRoZSBpbnZhbGlkYXRlZCBzZXNzaW9ucworICAgICovCisgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW52YWxpZGF0ZWRTZXNzaW9ucygpOworICAgCisgICAvKioKKyAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWFuYWdlciwgYXQgaG9zdCAvY29udGV4dCBuYW1lIGFuZCBhdCBlbmdpbmUgaG9zdG5hbWUrL2NvbnRleHQuCisgICAgKiBAcmV0dXJuIFN0cmluZworICAgICogQHNpbmNlIDUuNS4xMAorICAgICovCisgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKyAgIAorICAgLyoqCisgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIG1hbmFnZXIsIGF0IGhvc3QgL2NvbnRleHQgbmFtZSBhbmQgYXQgZW5naW5lIGhvc3RuYW1lKy9jb250ZXh0CisgICAgKiBAcGFyYW0gbmFtZQorICAgICogQHNpbmNlIDUuNS4xMAorICAgICovCisgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKKyAgICAgICAgIAorICAgcHVibGljIENhdGFsaW5hQ2x1c3RlciBnZXRDbHVzdGVyKCk7CisKKyAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXIoQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIpOworICAgCisgICAvKioKKyAgICAqIEByZXR1cm4gTWFuYWdlciBzZW5kIG9ubHkgdG8gc2FtZSBjbHVzdGVyIGRvbWFpbi4KKyAgICAqIEBzaW5jZSA1LjUuMTAKKyAgICAqLworICAgcHVibGljIGJvb2xlYW4gaXNTZW5kQ2x1c3RlckRvbWFpbk9ubHkoKTsKKworICAgLyoqCisgICAgKiBAcGFyYW0gc2VuZENsdXN0ZXJEb21haW5Pbmx5IEZsYWcgdmFsdWUuCisgICAgKiBAc2luY2UgNS41LjEwCisgICAgKi8KKyAgIHB1YmxpYyB2b2lkIHNldFNlbmRDbHVzdGVyRG9tYWluT25seShib29sZWFuIHNlbmRDbHVzdGVyRG9tYWluT25seSk7CisKKyAgIC8qKgorICAgICogQHBhcmFtIG1vZGUgVGhlIG1vZGUKKyAgICAqIEBzaW5jZSA1LjUuMTAKKyAgICAqLworICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdE1vZGUoYm9vbGVhbiBtb2RlKTsKKworICAgLyoqCisgICAgKiBAc2luY2UgNS41LjEwCisgICAgKi8KKyAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE1vZGUoKTsKKyAgIAorICAgcHVibGljIFJlcGxpY2F0aW9uU3RyZWFtIGdldFJlcGxpY2F0aW9uU3RyZWFtKGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgIHB1YmxpYyBSZXBsaWNhdGlvblN0cmVhbSBnZXRSZXBsaWNhdGlvblN0cmVhbShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgCisgICBwdWJsaWMgYm9vbGVhbiBpc05vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24oKTsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvQ2x1c3Rlck1lc3NhZ2UuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL0NsdXN0ZXJNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2MmE4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL0NsdXN0ZXJNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworCisKKy8qKgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2x1c3Rlck1lc3NhZ2UgZXh0ZW5kcyBTZXJpYWxpemFibGUgeworICAgIHB1YmxpYyBNZW1iZXIgZ2V0QWRkcmVzcygpOworICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3MoTWVtYmVyIG1lbWJlcik7CisgICAgcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpOworICAgIHB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyBpZCk7CisgICAgcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCk7CisgICAgcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKGxvbmcgdGltZXN0YW1wKTsKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL0NsdXN0ZXJNZXNzYWdlQmFzZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvQ2x1c3Rlck1lc3NhZ2VCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiZTgxMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL0NsdXN0ZXJNZXNzYWdlQmFzZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5oYTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKKworCisvKioKKyAqIDxwPlRpdGxlOiA8L3A+CisgKgorICogPHA+RGVzY3JpcHRpb246IDwvcD4KKyAqCisgKiA8cD5Db3B5cmlnaHQ6IENvcHlyaWdodCAoYykgMjAwNTwvcD4KKyAqCisgKiA8cD5Db21wYW55OiA8L3A+CisgKgorICogQGF1dGhvciBub3QgYXR0cmlidXRhYmxlCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIENsdXN0ZXJNZXNzYWdlQmFzZSBpbXBsZW1lbnRzIENsdXN0ZXJNZXNzYWdlIHsKKyAgICAKKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IE1lbWJlciBhZGRyZXNzOworICAgIHByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkOworICAgIHByaXZhdGUgbG9uZyB0aW1lc3RhbXA7CisgICAgcHVibGljIENsdXN0ZXJNZXNzYWdlQmFzZSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRBZGRyZXNzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1lbWJlcgorICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3Rlck1lc3NhZ2UgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBnZXRBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gYWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworICAgICAgICByZXR1cm4gdW5pcXVlSWQ7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCkgeworICAgICAgICByZXR1cm4gdGltZXN0YW1wOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldEFkZHJlc3MKKyAgICAgKgorICAgICAqIEBwYXJhbSBtZW1iZXIgTWVtYmVyCisgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyTWVzc2FnZSBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gbWVtYmVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworICAgICAgICB0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKGxvbmcgdGltZXN0YW1wKSB7CisgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9DbHVzdGVyUnVsZVNldC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvQ2x1c3RlclJ1bGVTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGUwYWZjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvQ2x1c3RlclJ1bGVTZXQuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLkRpZ2VzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuUnVsZVNldEJhc2U7CisKKworLyoqCisgKiA8cD48c3Ryb25nPlJ1bGVTZXQ8L3N0cm9uZz4gZm9yIHByb2Nlc3NpbmcgdGhlIGNvbnRlbnRzIG9mIGEKKyAqIENsdXN0ZXIgZGVmaW5pdGlvbiBlbGVtZW50LiAgPC9wPgorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENsdXN0ZXJSdWxlU2V0IGV4dGVuZHMgUnVsZVNldEJhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4IHRvIHVzZSBmb3IgcmVjb2duaXppbmcgb3VyIGVsZW1lbnRzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcHJlZml4ID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IHdpdGggdGhlIGRlZmF1bHQKKyAgICAgKiBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2x1c3RlclJ1bGVTZXQoKSB7CisKKyAgICAgICAgdGhpcygiIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4LgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBQcmVmaXggZm9yIG1hdGNoaW5nIHBhdHRlcm4gcnVsZXMgKGluY2x1ZGluZyB0aGUKKyAgICAgKiAgdHJhaWxpbmcgc2xhc2ggY2hhcmFjdGVyKQorICAgICAqLworICAgIHB1YmxpYyBDbHVzdGVyUnVsZVNldChTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbnVsbDsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogPHA+QWRkIHRoZSBzZXQgb2YgUnVsZSBpbnN0YW5jZXMgZGVmaW5lZCBpbiB0aGlzIFJ1bGVTZXQgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIDxjb2RlPkRpZ2VzdGVyPC9jb2RlPiBpbnN0YW5jZSwgYXNzb2NpYXRpbmcgdGhlbSB3aXRoCisgICAgICogb3VyIG5hbWVzcGFjZSBVUkkgKGlmIGFueSkuICBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQKKyAgICAgKiBieSBhIERpZ2VzdGVyIGluc3RhbmNlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaWdlc3RlciBEaWdlc3RlciBpbnN0YW5jZSB0byB3aGljaCB0aGUgbmV3IFJ1bGUgaW5zdGFuY2VzCisgICAgICogIHNob3VsZCBiZSBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSdWxlSW5zdGFuY2VzKERpZ2VzdGVyIGRpZ2VzdGVyKSB7CisgICAgICAgIC8vQ2x1c3RlciBjb25maWd1cmF0aW9uIHN0YXJ0CisgICAgICAgIAorICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkNoYW5uZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiQ2hhbm5lbCIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJDaGFubmVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0Q2hhbm5lbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWwiKTsKKworCisgICAgICAgIFN0cmluZyBjaGFubmVsUHJlZml4ID0gcHJlZml4ICsgIkNoYW5uZWwvIjsKKyAgICAgICAgeyAvL2NoYW5uZWwgcHJvcGVydGllcworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKGNoYW5uZWxQcmVmaXggKyAiTWVtYmVyc2hpcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKGNoYW5uZWxQcmVmaXggKyAiTWVtYmVyc2hpcCIpOworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChjaGFubmVsUHJlZml4ICsgIk1lbWJlcnNoaXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TWVtYmVyc2hpcFNlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyc2hpcFNlcnZpY2UiKTsKKworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKGNoYW5uZWxQcmVmaXggKyAiU2VuZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBNVVNUIGJlIHNwZWNpZmllZCBpbiB0aGUgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMoY2hhbm5lbFByZWZpeCArICJTZW5kZXIiKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoY2hhbm5lbFByZWZpeCArICJTZW5kZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0Q2hhbm5lbFNlbmRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsU2VuZGVyIik7CisKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShjaGFubmVsUHJlZml4ICsgIlNlbmRlci9UcmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhjaGFubmVsUHJlZml4ICsgIlNlbmRlci9UcmFuc3BvcnQiKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoY2hhbm5lbFByZWZpeCArICJTZW5kZXIvVHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50Y3AuTXVsdGlQb2ludFNlbmRlciIpOworCisKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShjaGFubmVsUHJlZml4ICsgIlJlY2VpdmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBNVVNUIGJlIHNwZWNpZmllZCBpbiB0aGUgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMoY2hhbm5lbFByZWZpeCArICJSZWNlaXZlciIpOworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChjaGFubmVsUHJlZml4ICsgIlJlY2VpdmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldENoYW5uZWxSZWNlaXZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsUmVjZWl2ZXIiKTsKKworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKGNoYW5uZWxQcmVmaXggKyAiSW50ZXJjZXB0b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhjaGFubmVsUHJlZml4ICsgIkludGVyY2VwdG9yIik7CisgICAgICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KGNoYW5uZWxQcmVmaXggKyAiSW50ZXJjZXB0b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkSW50ZXJjZXB0b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbEludGVyY2VwdG9yIik7CisgICAgICAgIH0KKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIlZhbHZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIlZhbHZlIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIlZhbHZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkVmFsdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlIik7CisgICAgICAgIAorICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkRlcGxveWVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkRlcGxveWVyIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIkRlcGxveWVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0Q2x1c3RlckRlcGxveWVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyRGVwbG95ZXIiKTsKKyAgICAgICAgCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJMaXN0ZW5lciIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZExpZmVjeWNsZUxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lciIpOworICAgICAgICAKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJDbHVzdGVyTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJDbHVzdGVyTGlzdGVuZXIiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiQ2x1c3Rlckxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkQ2x1c3Rlckxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyTGlzdGVuZXIiKTsKKyAgICAgICAgLy9DbHVzdGVyIGNvbmZpZ3VyYXRpb24gZW5kCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9DbHVzdGVyU2Vzc2lvbi5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvQ2x1c3RlclNlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGUzYzkzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvQ2x1c3RlclNlc3Npb24uamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlc3Npb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworCitwdWJsaWMgaW50ZXJmYWNlIENsdXN0ZXJTZXNzaW9uIGV4dGVuZHMgU2Vzc2lvbiwgSHR0cFNlc3Npb24geworICAgLyoqCisgICAgKiByZXR1cm5zIHRydWUgaWYgdGhpcyBzZXNzaW9uIGlzIHRoZSBwcmltYXJ5IHNlc3Npb24sIGlmIHRoYXQgaXMgdGhlCisgICAgKiBjYXNlLCB0aGUgbWFuYWdlciBjYW4gZXhwaXJlIGl0IHVwb24gdGltZW91dC4KKyAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHNlc3Npb24gaXMgcHJpbWFyeQorICAgICovCisgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnlTZXNzaW9uKCk7CisKKyAgIC8qKgorICAgICogU2V0cyB3aGV0aGVyIHRoaXMgaXMgdGhlIHByaW1hcnkgc2Vzc2lvbiBvciBub3QuCisgICAgKiBAcGFyYW0gcHJpbWFyeVNlc3Npb24gRmxhZyB2YWx1ZQorICAgICovCisgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5U2Vzc2lvbihib29sZWFuIHByaW1hcnlTZXNzaW9uKTsKKyAgIAorICAgCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL0NsdXN0ZXJWYWx2ZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvQ2x1c3RlclZhbHZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU4YzZkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL0NsdXN0ZXJWYWx2ZS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhOworCisvKioKKyAqIENsdXN0ZXIgVmFsdmUgSW50ZXJmYWNlIHRvIG1hcmsgYWxsIENsdXN0ZXIgVmFsdmVzIAorICogT25seSB0aG9zZSBWYWx2ZSBjYW4nYmUgY29uZmlndXJlZCBhcyBDbHVzdGVyIFZhbHZlcworICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2x1c3RlclZhbHZlIHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjbHVzdGVyIHRoZSBjbHVzdGVyIGRlcGxveWVyIGlzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIEByZXR1cm4gQ2F0YWxpbmFDbHVzdGVyCisgICAgICovCisgICAgcHVibGljIENhdGFsaW5hQ2x1c3RlciBnZXRDbHVzdGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVzIHRoZSBjbHVzdGVyIGRlcGxveWVyIHdpdGggYSBjbHVzdGVyCisgICAgICogQHBhcmFtIGNsdXN0ZXIgQ2F0YWxpbmFDbHVzdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlcihDYXRhbGluYUNsdXN0ZXIgY2x1c3Rlcik7Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9Db25zdGFudHMuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYmY2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGE7CisKKy8qKgorICogTWFuaWZlc3QgY29uc3RhbnRzIGZvciB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5oYTwvY29kZT4KKyAqIHBhY2thZ2UuCisgKgorICogQGF1dGhvciBCaXAgVGhlbGluCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RhbnRzIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQYWNrYWdlID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuaGEiOworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGFmYTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSBAQAorY2x1c3Rlci5tYmVhbi5yZWdpc3Rlci5hbHJlYWR5PU1CZWFuIHswfSBhbHJlYWR5IHJlZ2lzdGVyZWQhCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9jb250ZXh0L1JlcGxpY2F0ZWRDb250ZXh0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9jb250ZXh0L1JlcGxpY2F0ZWRDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiNmMwMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL2NvbnRleHQvUmVwbGljYXRlZENvbnRleHQuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuY29udGV4dDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DYXRhbGluYUNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudGlwaXMuUmVwbGljYXRlZE1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5BcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudGlwaXMuTGF6eVJlcGxpY2F0ZWRNYXA7CisKKy8qKgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBSZXBsaWNhdGVkQ29udGV4dCBleHRlbmRzIFN0YW5kYXJkQ29udGV4dCB7CisgICAgcHJpdmF0ZSBpbnQgbWFwU2VuZE9wdGlvbnMgPSBDaGFubmVsLlNFTkRfT1BUSU9OU19ERUZBVUxUOworICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBSZXBsaWNhdGVkQ29udGV4dC5jbGFzcyApOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBsb25nIERFRkFVTFRfUkVQTF9USU1FT1VUID0gMTUwMDA7Ly8xNSBzZWNvbmRzCisgICAgCisKKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICBpZiAoIHRoaXMuc3RhcnRlZCApIHJldHVybjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENhdGFsaW5hQ2x1c3RlciBjYXRjbHVzdCA9IChDYXRhbGluYUNsdXN0ZXIpdGhpcy5nZXRDbHVzdGVyKCk7CisgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0ID09IG51bGwpIHRoaXMuY29udGV4dCA9IG5ldyBSZXBsQXBwbENvbnRleHQodGhpcy5nZXRCYXNlUGF0aCgpLCB0aGlzKTsKKyAgICAgICAgICAgIGlmICggY2F0Y2x1c3QgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICBSZXBsaWNhdGVkTWFwIG1hcCA9IG5ldyBSZXBsaWNhdGVkTWFwKHRoaXMsY2F0Y2x1c3QuZ2V0Q2hhbm5lbCgpLERFRkFVTFRfUkVQTF9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpLGdldENsYXNzTG9hZGVycygpKTsKKyAgICAgICAgICAgICAgICBtYXAuc2V0Q2hhbm5lbFNlbmRPcHRpb25zKG1hcFNlbmRPcHRpb25zKTsKKyAgICAgICAgICAgICAgICAoKFJlcGxBcHBsQ29udGV4dCl0aGlzLmNvbnRleHQpLnNldEF0dHJpYnV0ZU1hcChtYXApOworICAgICAgICAgICAgICAgIGlmIChnZXRBbHRERE5hbWUoKSAhPSBudWxsKSBjb250ZXh0LnNldEF0dHJpYnV0ZShHbG9iYWxzLkFMVF9ERF9BVFRSLCBnZXRBbHRERE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXBlci5zdGFydCgpOworICAgICAgICB9ICBjYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gc3RhcnQgUmVwbGljYXRlZENvbnRleHQiLHgpOworICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbigiRmFpbGVkIHRvIHN0YXJ0IFJlcGxpY2F0ZWRDb250ZXh0Iix4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFJlcGxpY2F0ZWRNYXAgbWFwID0gKFJlcGxpY2F0ZWRNYXApKChSZXBsQXBwbENvbnRleHQpdGhpcy5jb250ZXh0KS5nZXRBdHRyaWJ1dGVNYXAoKTsKKyAgICAgICAgaWYgKCBtYXAhPW51bGwgKSB7CisgICAgICAgICAgICBtYXAuYnJlYWtkb3duKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhdGhpcy5zdGFydGVkICkgcmV0dXJuOworICAgICAgICB0cnkgeworICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKXsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHN0b3AgUmVwbGljYXRlZENvbnRleHQiLHgpOworICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbigiRmFpbGVkIHRvIHN0b3AgUmVwbGljYXRlZENvbnRleHQiLHgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3VwZXIuc3RvcCgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldE1hcFNlbmRPcHRpb25zKGludCBtYXBTZW5kT3B0aW9ucykgeworICAgICAgICB0aGlzLm1hcFNlbmRPcHRpb25zID0gbWFwU2VuZE9wdGlvbnM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYXBTZW5kT3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG1hcFNlbmRPcHRpb25zOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXJbXSBnZXRDbGFzc0xvYWRlcnMoKSB7CisgICAgICAgIExvYWRlciBsb2FkZXIgPSBudWxsOworICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7CisgICAgICAgIGxvYWRlciA9IHRoaXMuZ2V0TG9hZGVyKCk7CisgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgY2xhc3NMb2FkZXIgPSBsb2FkZXIuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgaWYgKCBjbGFzc0xvYWRlciA9PSBudWxsICkgY2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBpZiAoIGNsYXNzTG9hZGVyID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzTG9hZGVyW10ge2NsYXNzTG9hZGVyfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3NMb2FkZXJbXSB7Y2xhc3NMb2FkZXIsVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKX07CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gKChSZXBsQXBwbENvbnRleHQpY29udGV4dCkuZ2V0RmFjYWRlKCk7CisKKyAgICB9CisKKyAgICAKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJlcGxBcHBsQ29udGV4dCBleHRlbmRzIEFwcGxpY2F0aW9uQ29udGV4dCB7CisgICAgICAgIHB1YmxpYyBSZXBsQXBwbENvbnRleHQoU3RyaW5nIGJhc2VQYXRoLCBTdGFuZGFyZENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoYmFzZVBhdGgsY29udGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICBwcm90ZWN0ZWQgU2VydmxldENvbnRleHQgZ2V0RmFjYWRlKCkgeworICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRGYWNhZGUoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIEhhc2hNYXAgZ2V0QXR0cmlidXRlTWFwKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlczsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVNYXAoSGFzaE1hcCBtYXApIHsKKyAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IG1hcDsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9kZXBsb3kvRmFybVdhckRlcGxveWVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9kZXBsb3kvRmFybVdhckRlcGxveWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc3NmVlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL2RlcGxveS9GYXJtV2FyRGVwbG95ZXIuamF2YQpAQCAtMCwwICsxLDc0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuZGVwbG95OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNhdGFsaW5hQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJEZXBsb3llcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKKworLyoqCisgKiA8cD4KKyAqIEEgZmFybSB3YXIgZGVwbG95ZXIgaXMgYSBjbGFzcyB0aGF0IGlzIGFibGUgdG8gZGVwbG95L3VuZGVwbG95IHdlYgorICogYXBwbGljYXRpb25zIGluIFdBUiBmb3JtIHdpdGhpbiB0aGUgY2x1c3Rlci4KKyAqIDwvcD4KKyAqIEFueSBob3N0IGNhbiBhY3QgYXMgdGhlIGFkbWluLCBhbmQgd2lsbCBoYXZlIHRocmVlIGRpcmVjdG9yaWVzCisgKiA8dWw+CisgKiA8bGk+ZGVwbG95RGlyIC0gdGhlIGRpcmVjdG9yeSB3aGVyZSB3ZSB3YXRjaCBmb3IgY2hhbmdlczwvbGk+CisgKiA8bGk+YXBwbGljYXRpb25EaXIgLSB0aGUgZGlyZWN0b3J5IHdoZXJlIHdlIGluc3RhbGwgYXBwbGljYXRpb25zPC9saT4KKyAqIDxsaT50ZW1wRGlyIC0gYSB0ZW1wb3JhcnlEaXJlY3RvcnkgdG8gc3RvcmUgYmluYXJ5IGRhdGEgd2hlbiBkb3dubG9hZGluZyBhCisgKiB3YXIgZnJvbSB0aGUgY2x1c3RlcjwvbGk+CisgKiA8L3VsPgorICogQ3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCBkZXBsb3ltZW50IG9mIFdBUiBmaWxlcyBzaW5jZSB0aGV5IGFyZSBlYXNpZXIgdG8KKyAqIHNlbmQgYWNyb3NzIHRoZSB3aXJlLgorICogCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBGYXJtV2FyRGVwbG95ZXIgZXh0ZW5kcyBDbHVzdGVyTGlzdGVuZXIgaW1wbGVtZW50cyBDbHVzdGVyRGVwbG95ZXIsIEZpbGVDaGFuZ2VMaXN0ZW5lciB7CisgICAgLyotLVN0YXRpYyBWYXJpYWJsZXMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5CisgICAgICAgICAgICAuZ2V0TG9nKEZhcm1XYXJEZXBsb3llci5jbGFzcyk7CisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAiRmFybVdhckRlcGxveWVyLzEuMiI7CisKKyAgICAvKi0tSW5zdGFuY2UgVmFyaWFibGVzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHByb3RlY3RlZCBDYXRhbGluYUNsdXN0ZXIgY2x1c3RlciA9IG51bGw7CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7IC8vZGVmYXVsdCA1IHNlY29uZHMKKworICAgIHByb3RlY3RlZCBIYXNoTWFwIGZpbGVGYWN0b3JpZXMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgcHJvdGVjdGVkIFN0cmluZyBkZXBsb3lEaXI7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRlbXBEaXI7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHdhdGNoRGlyOworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gd2F0Y2hFbmFibGVkID0gZmFsc2U7CisKKyAgICBwcm90ZWN0ZWQgV2FyV2F0Y2hlciB3YXRjaGVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEl0ZXJhdGlvbiBjb3VudCBmb3IgYmFja2dyb3VuZCBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGNvdW50ID0gMDsKKworICAgIC8qKgorICAgICAqIEZyZXF1ZW5jeSBvZiB0aGUgRmFybSB3YXRjaERpciBjaGVjay4gQ2x1c3RlciB3aWRlIGRlcGxveW1lbnQgd2lsbCBiZQorICAgICAqIGRvbmUgb25jZSBmb3IgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgYmFja2dyb25kUHJvY2VzcyBjYWxscyAoaWUsIHRoZQorICAgICAqIGxvd2VyIHRoZSBhbW91bnQsIHRoZSBtb3N0IG9mdGVuIHRoZSBjaGVja3Mgd2lsbCBvY2N1cikuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBwcm9jZXNzRGVwbG95RnJlcXVlbmN5ID0gMjsKKworICAgIC8qKgorICAgICAqIFBhdGggd2hlcmUgY29udGV4dCBkZXNjcmlwdG9ycyBzaG91bGQgYmUgZGVwbG95ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgY29uZmlnQmFzZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYXNzb2NpYXRlZCBob3N0LgorICAgICAqLworICAgIHByb3RlY3RlZCBIb3N0IGhvc3QgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIGhvc3QgYXBwQmFzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBhcHBCYXNlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIE1CZWFuIHNlcnZlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTUJlYW5TZXJ2ZXIgbUJlYW5TZXJ2ZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIGFzc29jaWF0ZWQgZGVwbG95ZXIgT2JqZWN0TmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0TmFtZSBvbmFtZSA9IG51bGw7CisKKyAgICAvKi0tQ29uc3RydWN0b3ItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHB1YmxpYyBGYXJtV2FyRGVwbG95ZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGVwbG95ZXIgaW1wbGVtZW50YXRpb24gYW5kIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKyAgICAvKi0tTG9naWMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGFydGVkKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBnZXRDbHVzdGVyKCkuYWRkQ2x1c3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICBpZiAod2F0Y2hFbmFibGVkKSB7CisgICAgICAgICAgICB3YXRjaGVyID0gbmV3IFdhcldhdGNoZXIodGhpcywgbmV3IEZpbGUoZ2V0V2F0Y2hEaXIoKSkpOworICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oIkNsdXN0ZXIgZGVwbG95bWVudCBpcyB3YXRjaGluZyAiICsgZ2V0V2F0Y2hEaXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZvciBjaGFuZ2VzLiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdG8gY29ycmVjdCBlbmdpbmUgYW5kIGhvc3Qgc2V0dXAKKyAgICAgICAgaG9zdCA9IChIb3N0KSBnZXRDbHVzdGVyKCkuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIEVuZ2luZSBlbmdpbmUgPSAoRW5naW5lKSBob3N0LmdldFBhcmVudCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShlbmdpbmUuZ2V0TmFtZSgpICsgIjp0eXBlPURlcGxveWVyLGhvc3Q9IgorICAgICAgICAgICAgICAgICAgICArIGhvc3QuZ2V0TmFtZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiQ2FuJ3QgY29uc3RydWN0IE1CZWFuIG9iamVjdCBuYW1lIiArIGUpOworICAgICAgICB9CisgICAgICAgIGNvbmZpZ0Jhc2UgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwgImNvbmYiKTsKKyAgICAgICAgaWYgKGVuZ2luZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb25maWdCYXNlID0gbmV3IEZpbGUoY29uZmlnQmFzZSwgZW5naW5lLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgY29uZmlnQmFzZSA9IG5ldyBGaWxlKGNvbmZpZ0Jhc2UsIGhvc3QuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHJpZXZlIHRoZSBNQmVhbiBzZXJ2ZXIKKyAgICAgICAgbUJlYW5TZXJ2ZXIgPSBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS5nZXRNQmVhblNlcnZlcigpOworCisgICAgICAgIHN0YXJ0ZWQgPSB0cnVlOworICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oIkNsdXN0ZXIgRmFybVdhckRlcGxveWVyIHN0YXJ0ZWQuIik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBzdG9wIGNsdXN0ZXIgd2lkZSBkZXBsb3ltZW50cworICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJEZXBsb3llciNzdG9wKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgZ2V0Q2x1c3RlcigpLnJlbW92ZUNsdXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgY291bnQgPSAwOworICAgICAgICBpZiAod2F0Y2hlciAhPSBudWxsKSB7CisgICAgICAgICAgICB3YXRjaGVyLmNsZWFyKCk7CisgICAgICAgICAgICB3YXRjaGVyID0gbnVsbDsKKworICAgICAgICB9CisgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oIkNsdXN0ZXIgRmFybVdhckRlcGxveWVyIHN0b3BwZWQuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYW5EZXBsb3lEaXIoKSB7CisgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIk1ldGhvZCBjbGVhbkRlcGxveURpcigpIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgZnJvbSB0aGUgY2x1c3Rlciwgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQsIFRoZSBjbHVzdGVyIHdpbGwKKyAgICAgKiBicm9hZGNhc3QgaXQgaW52b2tpbmcgdGhlIG1lc3NhZ2VSZWNlaXZlZCBvbiB0aGUgcmVjZWl2ZXIuCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgQ2x1c3Rlck1lc3NhZ2UgLSB0aGUgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBjbHVzdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKENsdXN0ZXJNZXNzYWdlIG1zZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1zZyBpbnN0YW5jZW9mIEZpbGVNZXNzYWdlICYmIG1zZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRmlsZU1lc3NhZ2UgZm1zZyA9IChGaWxlTWVzc2FnZSkgbXNnOworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJyZWNlaXZlIGNsdXN0ZXIgZGVwbG95bWVudCBbIHBhdGg6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZtc2cuZ2V0Q29udGV4dFBhdGgoKSArICIgd2FyOiAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZm1zZy5nZXRGaWxlTmFtZSgpICsgIiBdIik7CisgICAgICAgICAgICAgICAgRmlsZU1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KGZtc2cpOworICAgICAgICAgICAgICAgIC8vIFRPRE8gY29ycmVjdCBzZWNvbmQgdHJ5IGFmdGVyIGFwcCBpcyBpbiBzZXJ2aWNlIQorICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5LndyaXRlTWVzc2FnZShmbXNnKSkgeworICAgICAgICAgICAgICAgICAgICAvL2xhc3QgbWVzc2FnZSByZWNlaXZlZCB3YXIgZmlsZSBpcyBjb21wbGV0ZWQKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmYWN0b3J5LmdldEZpbGUoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbmFtZS5lbmRzV2l0aCgiLndhciIpKQorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAiLndhciI7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZGVwbG95YWJsZSA9IG5ldyBGaWxlKGdldERlcGxveURpcigpLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZm1zZy5nZXRDb250ZXh0UGF0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VkKHBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU2VydmljZWQocGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LmdldEZpbGUoKS5yZW5hbWVUbyhkZXBsb3lhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2socGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU2VydmljZWQocGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJkZXBsb3ltZW50IGZyb20gIiArIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZmluaXNoZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkFwcGxpY2F0aW9uICIgKyBwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW4gdXNlZC4gdG91Y2ggd2FyIGZpbGUgIiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhZ2FpbiEiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZXgpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRmFjdG9yeShmbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnIGluc3RhbmNlb2YgVW5kZXBsb3lNZXNzYWdlICYmIG1zZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVW5kZXBsb3lNZXNzYWdlIHVtc2cgPSAoVW5kZXBsb3lNZXNzYWdlKSBtc2c7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gdW1zZy5nZXRDb250ZXh0UGF0aCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInJlY2VpdmUgY2x1c3RlciB1bmRlcGxveW1lbnQgZnJvbSAiICsgcGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNTZXJ2aWNlZChwYXRoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU2VydmljZWQocGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU2VydmljZWQocGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJ1bmRlcGxveW1lbnQgZnJvbSAiICsgcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZpbmlzaGVkLiIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQXBwbGljYXRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbiB1c2VkLiBTb3JyeSBub3QgcmVtb3ZlIGZyb20gYmFja3VwIGNsdXN0ZXIgbm9kZXMhIik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHJlYWQgZmFybSBkZXBsb3kgZmlsZSBtZXNzYWdlLiIsIHgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlIGZhY3RvcnkgZm9yIGFsbCB0cmFuc3BvcnRlZCB3YXIgZmlsZXMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICogQHJldHVybiBGYWN0b3J5IGZvciBhbGwgYXBwIG1lc3NhZ2UgKHdhciBmaWxlcykKKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBGaWxlTWVzc2FnZUZhY3RvcnkgZ2V0RmFjdG9yeShGaWxlTWVzc2FnZSBtc2cpCisgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIHRtcEZpbGUgPSBuZXcgRmlsZShtc2cuZ2V0RmlsZU5hbWUoKSk7CisgICAgICAgIEZpbGUgd3JpdGVUb0ZpbGUgPSBuZXcgRmlsZShnZXRUZW1wRGlyKCksIHRtcEZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgRmlsZU1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSAoRmlsZU1lc3NhZ2VGYWN0b3J5KSBmaWxlRmFjdG9yaWVzLmdldChtc2cKKyAgICAgICAgICAgICAgICAuZ2V0RmlsZU5hbWUoKSk7CisgICAgICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhY3RvcnkgPSBGaWxlTWVzc2FnZUZhY3RvcnkuZ2V0SW5zdGFuY2Uod3JpdGVUb0ZpbGUsIHRydWUpOworICAgICAgICAgICAgZmlsZUZhY3Rvcmllcy5wdXQobXNnLmdldEZpbGVOYW1lKCksIGZhY3RvcnkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBmaWxlICh3YXIpIGZyb20gbWVzc2FnZXMpCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZhY3RvcnkoRmlsZU1lc3NhZ2UgbXNnKSB7CisgICAgICAgIGZpbGVGYWN0b3JpZXMucmVtb3ZlKG1zZy5nZXRGaWxlTmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCZWZvcmUgdGhlIGNsdXN0ZXIgaW52b2tlcyBtZXNzYWdlUmVjZWl2ZWQgdGhlIGNsdXN0ZXIgd2lsbCBhc2sgdGhlCisgICAgICogcmVjZWl2ZXIgdG8gYWNjZXB0IG9yIGRlY2xpbmUgdGhlIG1lc3NhZ2UsIEluIHRoZSBmdXR1cmUsIHdoZW4gbWVzc2FnZXMKKyAgICAgKiBnZXQgYmlnLCB0aGUgYWNjZXB0IG1ldGhvZCB3aWxsIG9ubHkgdGFrZSBhIG1lc3NhZ2UgaGVhZGVyCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgQ2x1c3Rlck1lc3NhZ2UKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gLSByZXR1cm5zIHRydWUgdG8gaW5kaWNhdGUgdGhhdCBtZXNzYWdlUmVjZWl2ZWQgc2hvdWxkIGJlCisgICAgICogICAgICAgICBpbnZva2VkLiBJZiBmYWxzZSBpcyByZXR1cm5lZCwgdGhlIG1lc3NhZ2VSZWNlaXZlZCBtZXRob2Qgd2lsbAorICAgICAqICAgICAgICAgbm90IGJlIGludm9rZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KENsdXN0ZXJNZXNzYWdlIG1zZykgeworICAgICAgICByZXR1cm4gKG1zZyBpbnN0YW5jZW9mIEZpbGVNZXNzYWdlKSB8fCAobXNnIGluc3RhbmNlb2YgVW5kZXBsb3lNZXNzYWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YWxsIGEgbmV3IHdlYiBhcHBsaWNhdGlvbiwgd2hvc2Ugd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgaXMgYXQgdGhlCisgICAgICogc3BlY2lmaWVkIFVSTCwgaW50byB0aGlzIGNvbnRhaW5lciBhbmQgYWxsIHRoZSBvdGhlciBtZW1iZXJzIG9mIHRoZQorICAgICAqIGNsdXN0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aC4gQSBjb250ZXh0IHBhdGggb2YgIiIgKHRoZSBlbXB0eQorICAgICAqIHN0cmluZykgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSByb290IGFwcGxpY2F0aW9uIGZvciB0aGlzIGNvbnRhaW5lci4KKyAgICAgKiBPdGhlcndpc2UsIHRoZSBjb250ZXh0IHBhdGggbXVzdCBzdGFydCB3aXRoIGEgc2xhc2guCisgICAgICogPHA+CisgICAgICogSWYgdGhpcyBhcHBsaWNhdGlvbiBpcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkIGxvY2FsbHksIGEgQ29udGFpbmVyRXZlbnQKKyAgICAgKiBvZiB0eXBlIDxjb2RlPklOU1RBTExfRVZFTlQ8L2NvZGU+IHdpbGwgYmUgc2VudCB0byBhbGwgcmVnaXN0ZXJlZAorICAgICAqIGxpc3RlbmVycywgd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db250ZXh0PC9jb2RlPiBhcyBhbiBhcmd1bWVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGgKKyAgICAgKiAgICAgICAgICAgIFRoZSBjb250ZXh0IHBhdGggdG8gd2hpY2ggdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgYmUgaW5zdGFsbGVkCisgICAgICogICAgICAgICAgICAobXVzdCBiZSB1bmlxdWUpCisgICAgICogQHBhcmFtIHdhcgorICAgICAqICAgICAgICAgICAgQSBVUkwgb2YgdHlwZSAiamFyOiIgdGhhdCBwb2ludHMgdG8gYSBXQVIgZmlsZSwgb3IgdHlwZQorICAgICAqICAgICAgICAgICAgImZpbGU6IiB0aGF0IHBvaW50cyB0byBhbiB1bnBhY2tlZCBkaXJlY3Rvcnkgc3RydWN0dXJlCisgICAgICogICAgICAgICAgICBjb250YWluaW5nIHRoZSB3ZWIgYXBwbGljYXRpb24gdG8gYmUgaW5zdGFsbGVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aCBpcyBtYWxmb3JtZWQgKGl0IG11c3QgYmUgIiIKKyAgICAgKiAgICAgICAgICAgICAgICBvciBzdGFydCB3aXRoIGEgc2xhc2gpCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aCBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIGFuCisgICAgICogICAgICAgICAgICAgICAgZXhpc3Rpbmcgd2ViIGFwcGxpY2F0aW9uCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciB3YXMgZW5jb3VudGVyZWQgZHVyaW5nCisgICAgICogICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5zdGFsbChTdHJpbmcgY29udGV4dFBhdGgsIFVSTCB3YXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIE1lbWJlcltdIG1lbWJlcnMgPSBnZXRDbHVzdGVyKCkuZ2V0TWVtYmVycygpOworICAgICAgICBNZW1iZXIgbG9jYWxNZW1iZXIgPSBnZXRDbHVzdGVyKCkuZ2V0TG9jYWxNZW1iZXIoKTsKKyAgICAgICAgRmlsZU1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBGaWxlTWVzc2FnZUZhY3RvcnkuZ2V0SW5zdGFuY2UobmV3IEZpbGUoCisgICAgICAgICAgICAgICAgd2FyLmdldEZpbGUoKSksIGZhbHNlKTsKKyAgICAgICAgRmlsZU1lc3NhZ2UgbXNnID0gbmV3IEZpbGVNZXNzYWdlKGxvY2FsTWVtYmVyLCB3YXIuZ2V0RmlsZSgpLAorICAgICAgICAgICAgICAgIGNvbnRleHRQYXRoKTsKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlNlbmQgY2x1c3RlciB3YXIgZGVwbG95bWVudCBbIHBhdGg6IgorICAgICAgICAgICAgICAgICAgICArIGNvbnRleHRQYXRoICsgIiB3YXI6ICIgKyB3YXIgKyAiIF0gc3RhcnRlZC4iKTsKKyAgICAgICAgbXNnID0gZmFjdG9yeS5yZWFkTWVzc2FnZShtc2cpOworICAgICAgICB3aGlsZSAobXNnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZW5kIGNsdXN0ZXIgd2FyIGZyYWdtZW50IFsgcGF0aDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udGV4dFBhdGggKyAiIHdhcjogIiArIHdhciArICIgdG86ICIgKyAgbWVtYmVyc1tpXSArICIgXSIpOworICAgICAgICAgICAgICAgIGdldENsdXN0ZXIoKS5zZW5kKG1zZywgbWVtYmVyc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2cgPSBmYWN0b3J5LnJlYWRNZXNzYWdlKG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlNlbmQgY2x1c3RlciB3YXIgZGVwbG95bWVudCBbIHBhdGg6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBjb250ZXh0UGF0aCArICIgd2FyOiAiICsgd2FyICsgIiBdIGZpbmlzaGVkLiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBleGlzdGluZyB3ZWIgYXBwbGljYXRpb24sIGF0dGFjaGVkIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dAorICAgICAqIHBhdGguIElmIHRoaXMgYXBwbGljYXRpb24gaXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQsIGEgQ29udGFpbmVyRXZlbnQgb2YKKyAgICAgKiB0eXBlIDxjb2RlPlJFTU9WRV9FVkVOVDwvY29kZT4gd2lsbCBiZSBzZW50IHRvIGFsbCByZWdpc3RlcmVkCisgICAgICogbGlzdGVuZXJzLCB3aXRoIHRoZSByZW1vdmVkIDxjb2RlPkNvbnRleHQ8L2NvZGU+IGFzIGFuIGFyZ3VtZW50LgorICAgICAqIERlbGV0ZXMgdGhlIHdlYiBhcHBsaWNhdGlvbiB3YXIgZmlsZSBhbmQvb3IgZGlyZWN0b3J5IGlmIHRoZXkgZXhpc3QgaW4KKyAgICAgKiB0aGUgSG9zdCdzIGFwcEJhc2UuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHRQYXRoCisgICAgICogICAgICAgICAgICBUaGUgY29udGV4dCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSByZW1vdmVkCisgICAgICogQHBhcmFtIHVuZGVwbG95CisgICAgICogICAgICAgICAgICBib29sZWFuIGZsYWcgdG8gcmVtb3ZlIHdlYiBhcHBsaWNhdGlvbiBmcm9tIHNlcnZlcgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGggaXMgbWFsZm9ybWVkIChpdCBtdXN0IGJlICIiCisgICAgICogICAgICAgICAgICAgICAgb3Igc3RhcnQgd2l0aCBhIHNsYXNoKQorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGggZG9lcyBub3QgaWRlbnRpZnkgYQorICAgICAqICAgICAgICAgICAgICAgIGN1cnJlbnRseSBpbnN0YWxsZWQgd2ViIGFwcGxpY2F0aW9uCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMgZHVyaW5nIHJlbW92YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGNvbnRleHRQYXRoLCBib29sZWFuIHVuZGVwbG95KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5pbmZvKCJDbHVzdGVyIHdpZGUgcmVtb3ZlIG9mIHdlYiBhcHAgIiArIGNvbnRleHRQYXRoKTsKKyAgICAgICAgTWVtYmVyIGxvY2FsTWVtYmVyID0gZ2V0Q2x1c3RlcigpLmdldExvY2FsTWVtYmVyKCk7CisgICAgICAgIFVuZGVwbG95TWVzc2FnZSBtc2cgPSBuZXcgVW5kZXBsb3lNZXNzYWdlKGxvY2FsTWVtYmVyLCBTeXN0ZW0KKyAgICAgICAgICAgICAgICAuY3VycmVudFRpbWVNaWxsaXMoKSwgIlVuZGVwbG95OiIgKyBjb250ZXh0UGF0aCArICI6IgorICAgICAgICAgICAgICAgICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIGNvbnRleHRQYXRoLCB1bmRlcGxveSk7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VuZCBjbHVzdGVyIHdpZGUgdW5kZXBsb3ltZW50IGZyb20gIgorICAgICAgICAgICAgICAgICAgICArIGNvbnRleHRQYXRoICk7CisgICAgICAgIGNsdXN0ZXIuc2VuZChtc2cpOworICAgICAgICAvLyByZW1vdmUgbG9jYWxseQorICAgICAgICBpZiAodW5kZXBsb3kpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VkKGNvbnRleHRQYXRoKSkgeworICAgICAgICAgICAgICAgICAgICBhZGRTZXJ2aWNlZChjb250ZXh0UGF0aCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoY29udGV4dFBhdGgpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU2VydmljZWQoY29udGV4dFBhdGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiTG9jYWwgcmVtb3ZlIGZyb20gIiArIGNvbnRleHRQYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZmFpbGVkLCBvdGhlciBtYW5hZ2VyIGhhcyBhcHAgaW4gc2VydmljZSEiKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJsb2NhbCByZW1vdmUgZnJvbSAiICsgY29udGV4dFBhdGggKyAiIGZhaWxlZCIsIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoKKyAgICAgKiBNb2RpZmNhdGlvbiBmcm9tIHdhdGNoRGlyIHdhciBkZXRlY3RlZCEKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5kZXBsb3kuRmlsZUNoYW5nZUxpc3RlbmVyI2ZpbGVNb2RpZmllZChqYXZhLmlvLkZpbGUpCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlsZU1vZGlmaWVkKEZpbGUgbmV3V2FyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIGRlcGxveVdhciA9IG5ldyBGaWxlKGdldERlcGxveURpcigpLCBuZXdXYXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGNvcHkobmV3V2FyLCBkZXBsb3lXYXIpOworICAgICAgICAgICAgU3RyaW5nIGNvbnRleHROYW1lID0gZ2V0Q29udGV4dE5hbWUoZGVwbG95V2FyKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJJbnN0YWxsaW5nIHdlYmFwcFsiICsgY29udGV4dE5hbWUgKyAiXSBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGVwbG95V2FyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlKGNvbnRleHROYW1lLCBmYWxzZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiTm8gcmVtb3ZhbCIsIHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5zdGFsbChjb250ZXh0TmFtZSwgZGVwbG95V2FyLnRvVVJMKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gaW5zdGFsbCBXQVIgZmlsZSIsIHgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBXYXIgcmVtdm9lIGZyb20gd2F0Y2hEaXIKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5kZXBsb3kuRmlsZUNoYW5nZUxpc3RlbmVyI2ZpbGVSZW1vdmVkKGphdmEuaW8uRmlsZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaWxlUmVtb3ZlZChGaWxlIHJlbW92ZVdhcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGNvbnRleHROYW1lID0gZ2V0Q29udGV4dE5hbWUocmVtb3ZlV2FyKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJSZW1vdmluZyB3ZWJhcHBbIiArIGNvbnRleHROYW1lICsgIl0iKTsKKyAgICAgICAgICAgIHJlbW92ZShjb250ZXh0TmFtZSwgdHJ1ZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byByZW1vdmUgV0FSIGZpbGUiLCB4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGNvbnRleHQgcGF0aCBmcm9tIHdhcgorICAgICAqIEBwYXJhbSB3YXIgV2FyIGZpbGVuYW1lCisgICAgICogQHJldHVybiAnL2ZpbGVuYW1lJyBvciBpZiB3YXIgbmFtZSBpcyBST09ULndhciBjb250ZXh0IG5hbWUgaXMgZW1wdHkgc3RyaW5nICcnIAorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dE5hbWUoRmlsZSB3YXIpIHsKKyAgICAgICAgU3RyaW5nIGNvbnRleHROYW1lID0gIi8iCisgICAgICAgICsgd2FyLmdldE5hbWUoKS5zdWJzdHJpbmcoMCwKKyAgICAgICAgICAgICAgICB3YXIuZ2V0TmFtZSgpLmxhc3RJbmRleE9mKCIud2FyIikpOworICAgICAgICBpZigiL1JPT1QiLmVxdWFscyhjb250ZXh0TmFtZSkpCisgICAgICAgICAgICBjb250ZXh0TmFtZT0gIiIgOworICAgICAgICByZXR1cm4gY29udGV4dE5hbWUgOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIGNvbnRleHQgcGF0aCwgZ2V0IHRoZSBjb25maWcgZmlsZSBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnRmlsZShTdHJpbmcgcGF0aCkgeworICAgICAgICBTdHJpbmcgYmFzZW5hbWUgPSBudWxsOworICAgICAgICBpZiAocGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBiYXNlbmFtZSA9ICJST09UIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJhc2VuYW1lID0gcGF0aC5zdWJzdHJpbmcoMSkucmVwbGFjZSgnLycsICcjJyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChiYXNlbmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBjb250ZXh0IHBhdGgsIGdldCB0aGUgY29uZmlnIGZpbGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERvY0Jhc2UoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgU3RyaW5nIGJhc2VuYW1lID0gbnVsbDsKKyAgICAgICAgaWYgKHBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgYmFzZW5hbWUgPSAiUk9PVCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiYXNlbmFtZSA9IHBhdGguc3Vic3RyaW5nKDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoYmFzZW5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgImFwcGxpY2F0aW9uIHJvb3QiIGRpcmVjdG9yeSBmb3IKKyAgICAgKiBvdXIgYXNzb2NpYXRlZCBIb3N0LgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGdldEFwcEJhc2UoKSB7CisKKyAgICAgICAgaWYgKGFwcEJhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGFwcEJhc2U7CisgICAgICAgIH0KKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShob3N0LmdldEFwcEJhc2UoKSk7CisgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksIGhvc3QKKyAgICAgICAgICAgICAgICAgICAgLmdldEFwcEJhc2UoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhcHBCYXNlID0gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFwcEJhc2UgPSBmaWxlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoYXBwQmFzZSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgdGhlIHJlbW92ZSBtZXRob2Qgb24gdGhlIGRlcGxveWVyLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZShTdHJpbmcgcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRPRE8gSGFuZGxlIHJlbW92ZSBhbHNvIHdvcmsgZGlyIGNvbnRlbnQgIQorICAgICAgICAvLyBTdG9wIHRoZSBjb250ZXh0IGZpcnN0IHRvIGJlIG5pY2VyCisgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChwYXRoKTsKKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmRlcGxveSBsb2NhbCBjb250ZXh0ICIgK3BhdGggKTsKKyAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjb250ZXh0KS5zdG9wKCk7CisgICAgICAgICAgICBGaWxlIHdhciA9IG5ldyBGaWxlKGdldEFwcEJhc2UoKSwgZ2V0RG9jQmFzZShwYXRoKSArICIud2FyIik7CisgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKGdldEFwcEJhc2UoKSwgZ2V0RG9jQmFzZShwYXRoKSk7CisgICAgICAgICAgICBGaWxlIHhtbCA9IG5ldyBGaWxlKGNvbmZpZ0Jhc2UsIGdldENvbmZpZ0ZpbGUocGF0aCkgKyAiLnhtbCIpOworICAgICAgICAgICAgaWYgKHdhci5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHdhci5kZWxldGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgdW5kZXBsb3lEaXIoZGlyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgeG1sLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUGVyZm9ybSBuZXcgZGVwbG95bWVudCBhbmQgcmVtb3ZlIGludGVybmFsIEhvc3RDb25maWcgc3RhdGUKKyAgICAgICAgICAgIGNoZWNrKHBhdGgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxldGUgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnksIGluY2x1ZGluZyBhbGwgb2YgaXRzIGNvbnRlbnRzIGFuZAorICAgICAqIHN1YmRpcmVjdG9yaWVzIHJlY3Vyc2l2ZWx5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBkaXIKKyAgICAgKiAgICAgICAgICAgIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGlyZWN0b3J5IHRvIGJlIGRlbGV0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB1bmRlcGxveURpcihGaWxlIGRpcikgeworCisgICAgICAgIFN0cmluZyBmaWxlc1tdID0gZGlyLmxpc3QoKTsKKyAgICAgICAgaWYgKGZpbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIGZpbGVzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIGZpbGVzW2ldKTsKKyAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICB1bmRlcGxveURpcihmaWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkaXIuZGVsZXRlKCk7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIENhbGwgd2F0Y2hlciB0byBjaGVjayBmb3IgZGVwbG95IGNoYW5nZXMKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyRGVwbG95ZXIjYmFja2dyb3VuZFByb2Nlc3MoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJhY2tncm91bmRQcm9jZXNzKCkgeworICAgICAgICBpZiAoc3RhcnRlZCkgeworICAgICAgICAgICAgY291bnQgPSAoY291bnQgKyAxKSAlIHByb2Nlc3NEZXBsb3lGcmVxdWVuY3k7CisgICAgICAgICAgICBpZiAoY291bnQgPT0gMCAmJiB3YXRjaEVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICB3YXRjaGVyLmNoZWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qLS1EZXBsb3llciBPcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgdGhlIGNoZWNrIG1ldGhvZCBvbiB0aGUgZGVwbG95ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2soU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSB7IG5hbWUgfTsKKyAgICAgICAgU3RyaW5nW10gc2lnbmF0dXJlID0geyAiamF2YS5sYW5nLlN0cmluZyIgfTsKKyAgICAgICAgbUJlYW5TZXJ2ZXIuaW52b2tlKG9uYW1lLCAiY2hlY2siLCBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSBjaGVjayBtZXRob2Qgb24gdGhlIGRlcGxveWVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU2VydmljZWQoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSB7IG5hbWUgfTsKKyAgICAgICAgU3RyaW5nW10gc2lnbmF0dXJlID0geyAiamF2YS5sYW5nLlN0cmluZyIgfTsKKyAgICAgICAgQm9vbGVhbiByZXN1bHQgPSAoQm9vbGVhbikgbUJlYW5TZXJ2ZXIuaW52b2tlKG9uYW1lLCAiaXNTZXJ2aWNlZCIsCisgICAgICAgICAgICAgICAgcGFyYW1zLCBzaWduYXR1cmUpOworICAgICAgICByZXR1cm4gcmVzdWx0LmJvb2xlYW5WYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZSB0aGUgY2hlY2sgbWV0aG9kIG9uIHRoZSBkZXBsb3llci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2aWNlZChTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IHsgbmFtZSB9OworICAgICAgICBTdHJpbmdbXSBzaWduYXR1cmUgPSB7ICJqYXZhLmxhbmcuU3RyaW5nIiB9OworICAgICAgICBtQmVhblNlcnZlci5pbnZva2Uob25hbWUsICJhZGRTZXJ2aWNlZCIsIHBhcmFtcywgc2lnbmF0dXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgdGhlIGNoZWNrIG1ldGhvZCBvbiB0aGUgZGVwbG95ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VydmljZWQoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSB7IG5hbWUgfTsKKyAgICAgICAgU3RyaW5nW10gc2lnbmF0dXJlID0geyAiamF2YS5sYW5nLlN0cmluZyIgfTsKKyAgICAgICAgbUJlYW5TZXJ2ZXIuaW52b2tlKG9uYW1lLCAicmVtb3ZlU2VydmljZWQiLCBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgfQorCisgICAgLyotLUluc3RhbmNlIEdldHRlcnMvU2V0dGVycy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBwdWJsaWMgQ2F0YWxpbmFDbHVzdGVyIGdldENsdXN0ZXIoKSB7CisgICAgICAgIHJldHVybiBjbHVzdGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXIoQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIpIHsKKyAgICAgICAgdGhpcy5jbHVzdGVyID0gY2x1c3RlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGxpc3RlbmVyKSB7CisgICAgICAgIHJldHVybiBzdXBlci5lcXVhbHMobGlzdGVuZXIpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVwbG95RGlyKCkgeworICAgICAgICByZXR1cm4gZGVwbG95RGlyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlcGxveURpcihTdHJpbmcgZGVwbG95RGlyKSB7CisgICAgICAgIHRoaXMuZGVwbG95RGlyID0gZGVwbG95RGlyOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVtcERpcigpIHsKKyAgICAgICAgcmV0dXJuIHRlbXBEaXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGVtcERpcihTdHJpbmcgdGVtcERpcikgeworICAgICAgICB0aGlzLnRlbXBEaXIgPSB0ZW1wRGlyOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0V2F0Y2hEaXIoKSB7CisgICAgICAgIHJldHVybiB3YXRjaERpcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXYXRjaERpcihTdHJpbmcgd2F0Y2hEaXIpIHsKKyAgICAgICAgdGhpcy53YXRjaERpciA9IHdhdGNoRGlyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzV2F0Y2hFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gd2F0Y2hFbmFibGVkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFdhdGNoRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIHdhdGNoRW5hYmxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXYXRjaEVuYWJsZWQoYm9vbGVhbiB3YXRjaEVuYWJsZWQpIHsKKyAgICAgICAgdGhpcy53YXRjaEVuYWJsZWQgPSB3YXRjaEVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmcmVxdWVuY3kgb2Ygd2F0Y2hlciBjaGVja3MuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQcm9jZXNzRGVwbG95RnJlcXVlbmN5KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5wcm9jZXNzRGVwbG95RnJlcXVlbmN5KTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgd2F0Y2hlciBjaGVja3MgZnJlcXVlbmN5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9jZXNzRXhwaXJlc0ZyZXF1ZW5jeQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBtYW5hZ2VyIGNoZWNrcyBmcmVxdWVuY3kKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzRGVwbG95RnJlcXVlbmN5KGludCBwcm9jZXNzRXhwaXJlc0ZyZXF1ZW5jeSkgeworCisgICAgICAgIGlmIChwcm9jZXNzRXhwaXJlc0ZyZXF1ZW5jeSA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5wcm9jZXNzRGVwbG95RnJlcXVlbmN5ID0gcHJvY2Vzc0V4cGlyZXNGcmVxdWVuY3k7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBhIGZpbGUgdG8gdGhlIHNwZWNpZmllZCB0ZW1wIGRpcmVjdG9yeS4KKyAgICAgKiBAcGFyYW0gZnJvbSBjb3B5IGZyb20gdGVtcAorICAgICAqIEBwYXJhbSB0byAgIHRvIGhvc3QgYXBwQmFzZSBkaXJlY3RvcnkKKyAgICAgKiBAcmV0dXJuIHRydWUsIGNvcHkgc3VjY2Vzc2Z1bAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNvcHkoRmlsZSBmcm9tLCBGaWxlIHRvKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIXRvLmV4aXN0cygpKQorICAgICAgICAgICAgICAgIHRvLmNyZWF0ZU5ld0ZpbGUoKTsKKyAgICAgICAgICAgIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtIGlzID0gbmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKGZyb20pOworICAgICAgICAgICAgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtIG9zID0gbmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSh0bywKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzQwOTZdOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gaXMucmVhZChidWYpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBvcy53cml0ZShidWYsIDAsIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gY29weSBmaWxlIGZyb206IiArIGZyb20gKyAiIHRvOiIgKyB0bywgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9kZXBsb3kvRmlsZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9kZXBsb3kvRmlsZUNoYW5nZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1OGNhYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL2RlcGxveS9GaWxlQ2hhbmdlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLmRlcGxveTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK3B1YmxpYyBpbnRlcmZhY2UgRmlsZUNoYW5nZUxpc3RlbmVyIHsKKyAgICBwdWJsaWMgdm9pZCBmaWxlTW9kaWZpZWQoRmlsZSBmKTsKKyAgICBwdWJsaWMgdm9pZCBmaWxlUmVtb3ZlZChGaWxlIGYpOworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvZGVwbG95L0ZpbGVNZXNzYWdlLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9kZXBsb3kvRmlsZU1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjJkMGVmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvZGVwbG95L0ZpbGVNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuZGVwbG95OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJNZXNzYWdlQmFzZTsKKworLyoqCisgKiBDb250YWlucyB0aGUgZGF0YSBmb3IgYSBmaWxlIGJlaW5nIHRyYW5zZmVycmVkIG92ZXIgVENQLCB0aGlzIGlzIAorICogZXNzZW50aWFsbHkgYSBmcmFnbWVudCBvZiBhIGZpbGUsIHJlYWQgYW5kIHdyaXR0ZW4gYnkgdGhlIEZpbGVNZXNzYWdlRmFjdG9yeQorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gMS4wCisgKi8KKworcHVibGljIGNsYXNzIEZpbGVNZXNzYWdlIGV4dGVuZHMgQ2x1c3Rlck1lc3NhZ2VCYXNlIGltcGxlbWVudHMgQ2x1c3Rlck1lc3NhZ2UsIFNlcmlhbGl6YWJsZSB7CisgICAgcHJpdmF0ZSBpbnQgbWVzc2FnZU51bWJlcjsKKyAgICBwcml2YXRlIGJ5dGVbXSBkYXRhOworICAgIHByaXZhdGUgaW50IGRhdGFMZW5ndGg7CisgICAgCisgICAgcHJpdmF0ZSBsb25nIHRvdGFsTGVuZ3RoOworICAgIHByaXZhdGUgbG9uZyB0b3RhbE5yT2ZNc2dzOworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVOYW1lOworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRleHRQYXRoOworICAgIAorICAgIHB1YmxpYyBGaWxlTWVzc2FnZShNZW1iZXIgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCkgeworICAgICAgICB0aGlzLmFkZHJlc3M9c291cmNlOworICAgICAgICB0aGlzLmZpbGVOYW1lPWZpbGVOYW1lOworICAgICAgICB0aGlzLmNvbnRleHRQYXRoPWNvbnRleHRQYXRoOworICAgIH0KKyAgICAKKyAgICAvKgorICAgIHB1YmxpYyB2b2lkIHdyaXRlRXh0ZXJuYWwoT2JqZWN0T3V0cHV0IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKE9iamVjdElucHV0IGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgICovCisgICAKKyAgICBwdWJsaWMgaW50IGdldE1lc3NhZ2VOdW1iZXIoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlTnVtYmVyOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlTnVtYmVyKGludCBtZXNzYWdlTnVtYmVyKSB7CisgICAgICAgIHRoaXMubWVzc2FnZU51bWJlciA9IG1lc3NhZ2VOdW1iZXI7CisgICAgfQorICAgIHB1YmxpYyBsb25nIGdldFRvdGFsTnJPZk1zZ3MoKSB7CisgICAgICAgIHJldHVybiB0b3RhbE5yT2ZNc2dzOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRUb3RhbE5yT2ZNc2dzKGxvbmcgdG90YWxOck9mTXNncykgeworICAgICAgICB0aGlzLnRvdGFsTnJPZk1zZ3MgPSB0b3RhbE5yT2ZNc2dzOworICAgIH0KKyAgICBwdWJsaWMgYnl0ZVtdIGdldERhdGEoKSB7CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhKGJ5dGVbXSBkYXRhLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgICAgIHRoaXMuZGF0YUxlbmd0aCA9IGxlbmd0aDsKKyAgICB9CisgICAgcHVibGljIGludCBnZXREYXRhTGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gZGF0YUxlbmd0aDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0RGF0YUxlbmd0aChpbnQgZGF0YUxlbmd0aCkgeworICAgICAgICB0aGlzLmRhdGFMZW5ndGggPSBkYXRhTGVuZ3RoOworICAgIH0KKyAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbExlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIHRvdGFsTGVuZ3RoOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRUb3RhbExlbmd0aChsb25nIHRvdGFsTGVuZ3RoKSB7CisgICAgICAgIHRoaXMudG90YWxMZW5ndGggPSB0b3RhbExlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRGaWxlTmFtZSgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIy0jIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoZ2V0TWVzc2FnZU51bWJlcigpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIy0jIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVOYW1lOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQYXRoKCkgeworICAgICAgICByZXR1cm4gY29udGV4dFBhdGg7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvZGVwbG95L0ZpbGVNZXNzYWdlRmFjdG9yeS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvZGVwbG95L0ZpbGVNZXNzYWdlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZDAxYjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9kZXBsb3kvRmlsZU1lc3NhZ2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuZGVwbG95OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgZmFjdG9yeSBpcyB1c2VkIHRvIHJlYWQgZmlsZXMgYW5kIHdyaXRlIGZpbGVzIGJ5IHNwbGl0dGluZyB0aGVtIHVwIGludG8KKyAqIHNtYWxsZXIgbWVzc2FnZXMuIFNvIHRoYXQgZW50aXJlIGZpbGVzIGRvbid0IGhhdmUgdG8gYmUgcmVhZCBpbnRvIG1lbW9yeS4KKyAqIDxCUj4KKyAqIFRoZSBmYWN0b3J5IGNhbiBiZSB1c2VkIGFzIGEgcmVhZGVyIG9yIHdyaXRlciBidXQgbm90IGJvdGggYXQgdGhlIHNhbWUgdGltZS4KKyAqIFdoZW4gZG9uZSByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIGZhY3Rvcnkgd2lsbCBjbG9zZSB0aGUgaW5wdXQgb3Igb3V0cHV0CisgKiBzdHJlYW1zIGFuZCBtYXJrIHRoZSBmYWN0b3J5IGFzIGNsb3NlZC4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSBpdCBhZnRlcgorICogdGhhdC4gPEJSPgorICogVG8gZm9yY2UgYSBjbGVhbnVwLCBjYWxsIGNsZWFudXAoKSBmcm9tIHRoZSBjYWxsaW5nIG9iamVjdC4gPEJSPgorICogVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkIHNhZmUuCisgKiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgRmlsZU1lc3NhZ2VGYWN0b3J5IHsKKyAgICAvKi0tU3RhdGljIFZhcmlhYmxlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkKKyAgICAgICAgICAgIC5nZXRMb2coRmlsZU1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZSByZWFkIGZyb20gZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURfU0laRSA9IDEwMjQgKiAxMDsgLy8xMGtiCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSB0aGF0IHdlIGFyZSByZWFkaW5nL3dyaXRpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBmaWxlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRydWUgbWVhbnMgdGhhdCB3ZSBhcmUgd3JpdGluZyB3aXRoIHRoaXMgZmFjdG9yeS4gRmFsc2UgbWVhbnMgdGhhdCB3ZSBhcmUKKyAgICAgKiByZWFkaW5nIHdpdGggdGhpcyBmYWN0b3J5CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gb3BlbkZvcldyaXRlOworCisgICAgLyoqCisgICAgICogT25jZSB0aGUgZmFjdG9yeSBpcyB1c2VkLCBpdCBjYW4gbm90IGJlIHJldXNlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFdoZW4gb3BlbkZvcldyaXRlPWZhbHNlLCB0aGUgaW5wdXQgc3RyZWFtIGlzIGhlbGQgYnkgdGhpcyB2YXJpYWJsZQorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlSW5wdXRTdHJlYW0gaW47CisKKyAgICAvKioKKyAgICAgKiBXaGVuIG9wZW5Gb3JXcml0ZT10cnVlLCB0aGUgb3V0cHV0IHN0cmVhbSBpcyBoZWxkIGJ5IHRoaXMgdmFyaWFibGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZU91dHB1dFN0cmVhbSBvdXQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIG1lc3NhZ2VzIHdlIGhhdmUgcmVhZCBvciB3cml0dGVuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBuck9mTWVzc2FnZXNQcm9jZXNzZWQgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIHRvdGFsIHNpemUgb2YgdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBzaXplID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgcGFja2V0cyB0aGF0IHdlIHNwbGl0IHRoaXMgZmlsZSBpbnRvCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgdG90YWxOck9mTWVzc2FnZXMgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGJ5dGVzIHRoYXQgd2UgaG9sZCB0aGUgZGF0YSBpbiwgbm90IHRocmVhZCBzYWZlLgorICAgICAqLworICAgIHByb3RlY3RlZCBieXRlW10gZGF0YSA9IG5ldyBieXRlW1JFQURfU0laRV07CisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLCBlaXRoZXIgaW5zdGFudGlhdGVzIGEgZmFjdG9yeSB0byByZWFkIG9yIHdyaXRlLiA8QlI+CisgICAgICogV2hlbiBvcGVuRm9yV3JpdGU9PXRydWUsIHRoZW4gYSB0aGUgZmlsZSwgZiwgd2lsbCBiZSBjcmVhdGVkIGFuZCBhbgorICAgICAqIG91dHB1dCBzdHJlYW0gaXMgb3BlbmVkIHRvIHdyaXRlIHRvIGl0LiA8QlI+CisgICAgICogV2hlbiBvcGVuRm9yV3JpdGU9PWZhbHNlLCBhbiBpbnB1dCBzdHJlYW0gaXMgb3BlbmVkLCB0aGUgZmlsZSBoYXMgdG8KKyAgICAgKiBleGlzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZgorICAgICAqICAgICAgICAgICAgRmlsZSAtIHRoZSBmaWxlIHRvIGJlIHJlYWQvd3JpdHRlbgorICAgICAqIEBwYXJhbSBvcGVuRm9yV3JpdGUKKyAgICAgKiAgICAgICAgICAgIGJvb2xlYW4gLSB0cnVlIG1lYW5zIHdlIGFyZSB3cml0aW5nIHRvIHRoZSBmaWxlLCBmYWxzZSBtZWFucworICAgICAqICAgICAgICAgICAgd2UgYXJlIHJlYWRpbmcgZnJvbSB0aGUgZmlsZQorICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZmlsZSB0byBiZSByZWFkIGRvZXNuJ3QgZXhpc3QKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3lzdGVtIGZhaWxzIHRvIG9wZW4gaW5wdXQvb3V0cHV0IHN0cmVhbXMgdG8gdGhlIGZpbGUKKyAgICAgKiAgICAgICAgICAgICBvciBpZiBpdCBmYWlscyB0byBjcmVhdGUgdGhlIGZpbGUgdG8gYmUgd3JpdHRlbiB0by4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGVNZXNzYWdlRmFjdG9yeShGaWxlIGYsIGJvb2xlYW4gb3BlbkZvcldyaXRlKQorICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLmZpbGUgPSBmOworICAgICAgICB0aGlzLm9wZW5Gb3JXcml0ZSA9IG9wZW5Gb3JXcml0ZTsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJvcGVuIGZpbGUgIiArIGYgKyAiIHdyaXRlICIgKyBvcGVuRm9yV3JpdGUpOworICAgICAgICBpZiAob3BlbkZvcldyaXRlKSB7CisgICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpCisgICAgICAgICAgICAgICAgZmlsZS5jcmVhdGVOZXdGaWxlKCk7CisgICAgICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemUgPSBmaWxlLmxlbmd0aCgpOworICAgICAgICAgICAgdG90YWxOck9mTWVzc2FnZXMgPSAoc2l6ZSAvIFJFQURfU0laRSkgKyAxOworICAgICAgICAgICAgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOworICAgICAgICB9Ly9lbmQgaWYKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBmYWN0b3J5IHRvIHJlYWQgb3Igd3JpdGUgZnJvbSBhIGZpbGUuIFdoZW4gb3BlbmluZyBmb3IgcmVhZCwKKyAgICAgKiB0aGUgcmVhZE1lc3NhZ2UgY2FuIGJlIGludm9rZWQsIGFuZCB3aGVuIG9wZW5pbmcgZm9yIHdyaXRlIHRoZQorICAgICAqIHdyaXRlTWVzc2FnZSBjYW4gYmUgaW52b2tlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZgorICAgICAqICAgICAgICAgICAgRmlsZSAtIHRoZSBmaWxlIHRvIGJlIHJlYWQgb3Igd3JpdHRlbgorICAgICAqIEBwYXJhbSBvcGVuRm9yV3JpdGUKKyAgICAgKiAgICAgICAgICAgIGJvb2xlYW4gLSB0cnVlLCBtZWFucyB3ZSBhcmUgd3JpdGluZyB0byB0aGUgZmlsZSwgZmFsc2UgbWVhbnMKKyAgICAgKiAgICAgICAgICAgIHdlIGFyZSByZWFkaW5nIGZyb20gaXQKKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiAtCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGZpbGUgdG8gYmUgcmVhZCBkb2Vzbid0IGV4aXN0CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAtCisgICAgICogICAgICAgICAgICAgaWYgaXQgZmFpbHMgdG8gY3JlYXRlIHRoZSBmaWxlIHRoYXQgaXMgdG8gYmUgd3JpdHRlbgorICAgICAqIEByZXR1cm4gRmlsZU1lc3NhZ2VGYWN0b3J5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWxlTWVzc2FnZUZhY3RvcnkgZ2V0SW5zdGFuY2UoRmlsZSBmLCBib29sZWFuIG9wZW5Gb3JXcml0ZSkKKyAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlTWVzc2FnZUZhY3RvcnkoZiwgb3BlbkZvcldyaXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBmaWxlIGRhdGEgaW50byB0aGUgZmlsZSBtZXNzYWdlIGFuZCBzZXRzIHRoZSBzaXplLCB0b3RhbExlbmd0aCwKKyAgICAgKiB0b3RhbE5yT2ZNc2dzIGFuZCB0aGUgbWVzc2FnZSBudW1iZXIgPEJSPgorICAgICAqIElmIEVPRiBpcyByZWFjaGVkLCB0aGUgZmFjdG9yeSByZXR1cm5zIG51bGwsIGFuZCBjbG9zZXMgaXRzZWxmLCBvdGhlcndpc2UKKyAgICAgKiB0aGUgc2FtZSBtZXNzYWdlIGlzIHJldHVybmVkIGFzIHdhcyBwYXNzZWQgaW4uIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG5vdAorICAgICAqIG1vcmUgbWVtb3J5IGlzIGV2ZXIgdXNlZC4gVG8gcmVtZW1iZXIsIG5laXRoZXIgdGhlIGZpbGUgbWVzc2FnZSBvciB0aGUKKyAgICAgKiBmYWN0b3J5IGFyZSB0aHJlYWQgc2FmZS4gZG9udCBoYW5kIG9mZiB0aGUgbWVzc2FnZSB0byBvbmUgdGhyZWFkIGFuZCByZWFkCisgICAgICogdGhlIHNhbWUgd2l0aCBhbm90aGVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmCisgICAgICogICAgICAgICAgICBGaWxlTWVzc2FnZSAtIHRoZSBtZXNzYWdlIHRvIGJlIHBvcHVsYXRlZCB3aXRoIGZpbGUgZGF0YQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZmFjdG9yeSBpcyBmb3Igd3JpdGluZyBvciBpcyBjbG9zZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiBhIGZpbGUgcmVhZCBleGNlcHRpb24gb2NjdXJzCisgICAgICogQHJldHVybiBGaWxlTWVzc2FnZSAtIHJldHVybnMgdGhlIHNhbWUgbWVzc2FnZSBwYXNzZWQgaW4gYXMgYSBwYXJhbWV0ZXIsCisgICAgICogICAgICAgICBvciBudWxsIGlmIEVPRgorICAgICAqLworICAgIHB1YmxpYyBGaWxlTWVzc2FnZSByZWFkTWVzc2FnZShGaWxlTWVzc2FnZSBmKQorICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBjaGVja1N0YXRlKGZhbHNlKTsKKyAgICAgICAgaW50IGxlbmd0aCA9IGluLnJlYWQoZGF0YSk7CisgICAgICAgIGlmIChsZW5ndGggPT0gLTEpIHsKKyAgICAgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZi5zZXREYXRhKGRhdGEsIGxlbmd0aCk7CisgICAgICAgICAgICBmLnNldFRvdGFsTGVuZ3RoKHNpemUpOworICAgICAgICAgICAgZi5zZXRUb3RhbE5yT2ZNc2dzKHRvdGFsTnJPZk1lc3NhZ2VzKTsKKyAgICAgICAgICAgIGYuc2V0TWVzc2FnZU51bWJlcigrK25yT2ZNZXNzYWdlc1Byb2Nlc3NlZCk7CisgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgfS8vZW5kIGlmCisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgbWVzc2FnZSB0byBmaWxlLiBJZiAobXNnLmdldE1lc3NhZ2VOdW1iZXIoKSA9PQorICAgICAqIG1zZy5nZXRUb3RhbE5yT2ZNc2dzKCkpIHRoZSBvdXRwdXQgc3RyZWFtIHdpbGwgYmUgY2xvc2VkIGFmdGVyIHdyaXRpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgICAgICAgRmlsZU1lc3NhZ2UgLSBtZXNzYWdlIGNvbnRhaW5pbmcgZGF0YSB0byBiZSB3cml0dGVuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gLQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmYWN0b3J5IGlzIG9wZW5lZCBmb3IgcmVhZCBvciBjbG9zZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0KKyAgICAgKiAgICAgICAgICAgICBpZiBhIGZpbGUgd3JpdGUgZXJyb3Igb2NjdXJzCisgICAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgaXMgY29tcGxldGUgYW5kIG91dHB1dHN0cmVhbSBpcyBjbG9zZWQsCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gd3JpdGVNZXNzYWdlKEZpbGVNZXNzYWdlIG1zZykKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFvcGVuRm9yV3JpdGUpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgd3JpdGUgbWVzc2FnZSwgdGhpcyBmYWN0b3J5IGlzIHJlYWRpbmcuIik7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVzc2FnZSAiICsgbXNnICsgIiBkYXRhICIgKyBtc2cuZ2V0RGF0YSgpCisgICAgICAgICAgICAgICAgICAgICsgIiBkYXRhIGxlbmd0aCAiICsgbXNnLmdldERhdGFMZW5ndGgoKSArICIgb3V0ICIgKyBvdXQpOworICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC53cml0ZShtc2cuZ2V0RGF0YSgpLCAwLCBtc2cuZ2V0RGF0YUxlbmd0aCgpKTsKKyAgICAgICAgICAgIG5yT2ZNZXNzYWdlc1Byb2Nlc3NlZCsrOworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgICAgICBpZiAobXNnLmdldE1lc3NhZ2VOdW1iZXIoKSA9PSBtc2cuZ2V0VG90YWxOck9mTXNncygpKSB7CisgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgY2xlYW51cCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cud2FybigiUmVjZWl2ZSBNZXNzYWdlIGFnYWluIC0tIFNlbmRlciBBY3RUaW1lb3V0IHRvIHNob3J0IFsgcGF0aDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5nZXRDb250ZXh0UGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3YXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtc2cuZ2V0RmlsZU5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGF0YTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5nZXREYXRhKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRhdGEgbGVuZ3RoOiAiICsgbXNnLmdldERhdGFMZW5ndGgoKSArICIgXSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Ly93cml0ZU1lc3NhZ2UKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgZmFjdG9yeSwgaXRzIHN0cmVhbXMgYW5kIHNldHMgYWxsIGl0cyByZWZlcmVuY2VzIHRvIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgeworICAgICAgICBpZiAoaW4gIT0gbnVsbCkKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKG91dCAhPSBudWxsKQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaW4gPSBudWxsOworICAgICAgICBvdXQgPSBudWxsOworICAgICAgICBzaXplID0gMDsKKyAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgZGF0YSA9IG51bGw7CisgICAgICAgIG5yT2ZNZXNzYWdlc1Byb2Nlc3NlZCA9IDA7CisgICAgICAgIHRvdGFsTnJPZk1lc3NhZ2VzID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGZhY3RvcnkgaXMgYWJsZSB0byBwZXJmb3JtIHRoZSBmdW5jdGlvbiBpdCBpcworICAgICAqIGFza2VkIHRvIGRvLiBJbnZva2VkIGJ5IHJlYWRNZXNzYWdlL3dyaXRlTWVzc2FnZSBiZWZvcmUgdGhvc2UgbWV0aG9kcworICAgICAqIHByb2NlZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG9wZW5Gb3JXcml0ZQorICAgICAqICAgICAgICAgICAgYm9vbGVhbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tTdGF0ZShib29sZWFuIG9wZW5Gb3JXcml0ZSkKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBpZiAodGhpcy5vcGVuRm9yV3JpdGUgIT0gb3BlbkZvcldyaXRlKSB7CisgICAgICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgICAgICBpZiAob3BlbkZvcldyaXRlKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgd3JpdGUgbWVzc2FnZSwgdGhpcyBmYWN0b3J5IGlzIHJlYWRpbmcuIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCByZWFkIG1lc3NhZ2UsIHRoaXMgZmFjdG9yeSBpcyB3cml0aW5nLiIpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmNsb3NlZCkgeworICAgICAgICAgICAgY2xlYW51cCgpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmFjdG9yeSBoYXMgYmVlbiBjbG9zZWQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGFtcGxlIHVzYWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICogICAgICAgICAgICBTdHJpbmdbXSwgYXJnc1swXSAtIHJlYWQgZnJvbSBmaWxlbmFtZSwgYXJnc1sxXSB3cml0ZSB0bworICAgICAqICAgICAgICAgICAgZmlsZW5hbWUKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN5c3RlbS5vdXQKKyAgICAgICAgICAgICAgICAucHJpbnRsbigiVXNhZ2U6IEZpbGVNZXNzYWdlRmFjdG9yeSBmaWxlVG9CZVJlYWQgZmlsZVRvQmVXcml0dGVuIik7CisgICAgICAgIFN5c3RlbS5vdXQKKyAgICAgICAgICAgICAgICAucHJpbnRsbigiVXNhZ2U6IFRoaXMgd2lsbCBtYWtlIGEgY29weSBvZiB0aGUgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0iKTsKKyAgICAgICAgRmlsZU1lc3NhZ2VGYWN0b3J5IHJlYWQgPSBnZXRJbnN0YW5jZShuZXcgRmlsZShhcmdzWzBdKSwgZmFsc2UpOworICAgICAgICBGaWxlTWVzc2FnZUZhY3Rvcnkgd3JpdGUgPSBnZXRJbnN0YW5jZShuZXcgRmlsZShhcmdzWzFdKSwgdHJ1ZSk7CisgICAgICAgIEZpbGVNZXNzYWdlIG1zZyA9IG5ldyBGaWxlTWVzc2FnZShudWxsLCBhcmdzWzBdLCBhcmdzWzBdKTsKKyAgICAgICAgbXNnID0gcmVhZC5yZWFkTWVzc2FnZShtc2cpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGVjdGluZyB0byB3cml0ZSAiICsgbXNnLmdldFRvdGFsTnJPZk1zZ3MoKQorICAgICAgICAgICAgICAgICsgIiBtZXNzYWdlcy4iKTsKKyAgICAgICAgaW50IGNudCA9IDA7CisgICAgICAgIHdoaWxlIChtc2cgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGUud3JpdGVNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICBjbnQrKzsKKyAgICAgICAgICAgIG1zZyA9IHJlYWQucmVhZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgfS8vd2hpbGUKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBY3R1YWxseSB3cm90ZSAiICsgY250ICsgIiBtZXNzYWdlcy4iKTsKKyAgICB9Ly8vbWFpbgorCisgICAgcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvZGVwbG95L1VuZGVwbG95TWVzc2FnZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvZGVwbG95L1VuZGVwbG95TWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZDI4NGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9kZXBsb3kvVW5kZXBsb3lNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLmRlcGxveTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworcHVibGljIGNsYXNzIFVuZGVwbG95TWVzc2FnZSBpbXBsZW1lbnRzIENsdXN0ZXJNZXNzYWdlLFNlcmlhbGl6YWJsZSB7CisgICAgcHJpdmF0ZSBNZW1iZXIgYWRkcmVzczsKKyAgICBwcml2YXRlIGxvbmcgdGltZXN0YW1wOworICAgIHByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkOworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRleHRQYXRoOworICAgIHByaXZhdGUgYm9vbGVhbiB1bmRlcGxveTsKKyAgICBwcml2YXRlIGludCByZXNlbmQgPSAwOworICAgIHByaXZhdGUgaW50IGNvbXByZXNzID0gMDsKKworICAgIHB1YmxpYyBVbmRlcGxveU1lc3NhZ2UoKSB7fSAvL2ZvciBzZXJpYWxpemF0aW9uCisgICAgcHVibGljIFVuZGVwbG95TWVzc2FnZShNZW1iZXIgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1bmRlcGxveSkgeworICAgICAgICB0aGlzLmFkZHJlc3MgID0gYWRkcmVzczsKKyAgICAgICAgdGhpcy50aW1lc3RhbXA9IHRpbWVzdGFtcDsKKyAgICAgICAgdGhpcy51bmRlcGxveSA9IHVuZGVwbG95OworICAgICAgICB0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisgICAgICAgIHRoaXMudW5kZXBsb3kgPSB1bmRlcGxveTsKKyAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoOworICAgIH0KKworICAgIHB1YmxpYyBNZW1iZXIgZ2V0QWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWRkcmVzcyhNZW1iZXIgYWRkcmVzcykgeworICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKKyAgICAgICAgcmV0dXJuIHRpbWVzdGFtcDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAobG9uZyB0aW1lc3RhbXApIHsKKyAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKyAgICAgICAgcmV0dXJuIHVuaXF1ZUlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworICAgICAgICB0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHRQYXRoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRQYXRoKFN0cmluZyBjb250ZXh0UGF0aCkgeworICAgICAgICB0aGlzLmNvbnRleHRQYXRoID0gY29udGV4dFBhdGg7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VW5kZXBsb3koKSB7CisgICAgICAgIHJldHVybiB1bmRlcGxveTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVbmRlcGxveShib29sZWFuIHVuZGVwbG95KSB7CisgICAgICAgIHRoaXMudW5kZXBsb3kgPSB1bmRlcGxveTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb21wcmVzcy4KKyAgICAgKiBAc2luY2UgNS41LjEwIAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q29tcHJlc3MoKSB7CisgICAgICAgIHJldHVybiBjb21wcmVzczsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIGNvbXByZXNzIFRoZSBjb21wcmVzcyB0byBzZXQuCisgICAgICogQHNpbmNlIDUuNS4xMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzKGludCBjb21wcmVzcykgeworICAgICAgICB0aGlzLmNvbXByZXNzID0gY29tcHJlc3M7CisgICAgfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVzZW5kLgorICAgICAqIEBzaW5jZSA1LjUuMTAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlc2VuZCgpIHsKKyAgICAgICAgcmV0dXJuIHJlc2VuZDsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIHJlc2VuZCBUaGUgcmVzZW5kIHRvIHNldC4KKyAgICAgKiBAc2luY2UgNS41LjEwCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzZW5kKGludCByZXNlbmQpIHsKKyAgICAgICAgdGhpcy5yZXNlbmQgPSByZXNlbmQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9kZXBsb3kvV2FyV2F0Y2hlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvZGVwbG95L1dhcldhdGNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmIwNTVhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvZGVwbG95L1dhcldhdGNoZXIuamF2YQpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5kZXBsb3k7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogPHA+CisgKiBUaGUgPGI+V2FyV2F0Y2hlciA8L2I+IHdhdGNoZXMgdGhlIGRlcGxveURpciBmb3IgY2hhbmdlcyBtYWRlIHRvIHRoZQorICogZGlyZWN0b3J5IChhZGRpbmcgbmV3IFdBUiBmaWxlcy0+ZGVwbG95IG9yIHJlbW92ZSBXQVIgZmlsZXMtPnVuZGVwbG95KSBBbmQKKyAqIG5vdGlmaWVzIGEgbGlzdGVuZXIgb2YgdGhlIGNoYW5nZXMgbWFkZQorICogPC9wPgorICogCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAxLjEKKyAqLworCitwdWJsaWMgY2xhc3MgV2FyV2F0Y2hlciB7CisKKyAgICAvKi0tU3RhdGljIFZhcmlhYmxlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkKKyAgICAgICAgICAgIC5nZXRMb2coV2FyV2F0Y2hlci5jbGFzcyk7CisKKyAgICAvKi0tSW5zdGFuY2UgVmFyaWFibGVzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qKgorICAgICAqIERpcmVjdG9yeSB0byB3YXRjaCBmb3Igd2FyIGZpbGVzCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgd2F0Y2hEaXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogUGFyZW50IHRvIGJlIG5vdGlmaWVkIG9mIGNoYW5nZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEN1cnJlbnRseSBkZXBsb3llZCBmaWxlcworICAgICAqLworICAgIHByb3RlY3RlZCBNYXAgY3VycmVudFN0YXR1cyA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAvKi0tQ29uc3RydWN0b3ItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgcHVibGljIFdhcldhdGNoZXIoKSB7CisgICAgfQorCisgICAgcHVibGljIFdhcldhdGNoZXIoRmlsZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyLCBGaWxlIHdhdGNoRGlyKSB7CisgICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgdGhpcy53YXRjaERpciA9IHdhdGNoRGlyOworICAgIH0KKworICAgIC8qLS1Mb2dpYy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICAgKiBjaGVjayBmb3IgbW9kaWZpY2F0aW9uIGFuZCBzZW5kIG5vdGlmY2F0aW9uIHRvIGxpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2hlY2soKSB7CisgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oImNoZWNrIGNsdXN0ZXIgd2FycyBhdCAiICsgd2F0Y2hEaXIpOworICAgICAgICBGaWxlW10gbGlzdCA9IHdhdGNoRGlyLmxpc3RGaWxlcyhuZXcgV2FyRmlsdGVyKCkpOworICAgICAgICBpZiAobGlzdCA9PSBudWxsKQorICAgICAgICAgICAgbGlzdCA9IG5ldyBGaWxlWzBdOworICAgICAgICAvL2ZpcnN0IG1ha2Ugc3VyZSBhbGwgdGhlIGZpbGVzIGFyZSBsaXN0ZWQgaW4gb3VyIGN1cnJlbnQgc3RhdHVzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYWRkV2FySW5mbyhsaXN0W2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vY2hlY2sgYWxsIHRoZSBzdGF0dXMgY29kZXMgYW5kIHVwZGF0ZSB0aGUgRmFybURlcGxveWVyCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGN1cnJlbnRTdGF0dXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGkubmV4dCgpOworICAgICAgICAgICAgV2FySW5mbyBpbmZvID0gKFdhckluZm8pIGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBpbnQgY2hlY2sgPSBpbmZvLmNoZWNrKCk7CisgICAgICAgICAgICBpZiAoY2hlY2sgPT0gMSkgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLmZpbGVNb2RpZmllZChpbmZvLmdldFdhcigpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2sgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5maWxlUmVtb3ZlZChpbmZvLmdldFdhcigpKTsKKyAgICAgICAgICAgICAgICAvL25vIG5lZWQgdG8ga2VlcCBpbiBtZW1vcnkKKyAgICAgICAgICAgICAgICBjdXJyZW50U3RhdHVzLnJlbW92ZShpbmZvLmdldFdhcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGNsdXN0ZXIgd2FyIHRvIHRoZSB3YXRjaGVyIHN0YXRlCisgICAgICogQHBhcmFtIHdhcmZpbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRXYXJJbmZvKEZpbGUgd2FyZmlsZSkgeworICAgICAgICBXYXJJbmZvIGluZm8gPSAoV2FySW5mbykgY3VycmVudFN0YXR1cy5nZXQod2FyZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgIGluZm8gPSBuZXcgV2FySW5mbyh3YXJmaWxlKTsKKyAgICAgICAgICAgIGluZm8uc2V0TGFzdFN0YXRlKC0xKTsgLy9hc3N1bWUgZmlsZSBpcyBub24gZXhpc3RlbnQKKyAgICAgICAgICAgIGN1cnJlbnRTdGF0dXMucHV0KHdhcmZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGluZm8pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY2xlYXIgd2F0Y2hlciBzdGF0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBjdXJyZW50U3RhdHVzLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3YXRjaERpci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRXYXRjaERpcigpIHsKKyAgICAgICAgcmV0dXJuIHdhdGNoRGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB3YXRjaERpcgorICAgICAqICAgICAgICAgICAgVGhlIHdhdGNoRGlyIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXYXRjaERpcihGaWxlIHdhdGNoRGlyKSB7CisgICAgICAgIHRoaXMud2F0Y2hEaXIgPSB3YXRjaERpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxpc3RlbmVyLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlQ2hhbmdlTGlzdGVuZXIgZ2V0TGlzdGVuZXIoKSB7CisgICAgICAgIHJldHVybiBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIFRoZSBsaXN0ZW5lciB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoRmlsZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKi0tSW5uZXIgY2xhc3Nlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoqCisgICAgICogRmlsZSBuYW1lIGZpbHRlciBmb3Igd2FyIGZpbGVzCisgICAgICovCisgICAgcHJvdGVjdGVkIGNsYXNzIFdhckZpbHRlciBpbXBsZW1lbnRzIGphdmEuaW8uRmlsZW5hbWVGaWx0ZXIgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRoLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gbmFtZS5lbmRzV2l0aCgiLndhciIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsZSBpbmZvcm1hdGlvbiBvbiBleGlzdGluZyBXQVIgZmlsZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgY2xhc3MgV2FySW5mbyB7CisgICAgICAgIHByb3RlY3RlZCBGaWxlIHdhciA9IG51bGw7CisKKyAgICAgICAgcHJvdGVjdGVkIGxvbmcgbGFzdENoZWNrZWQgPSAwOworCisgICAgICAgIHByb3RlY3RlZCBsb25nIGxhc3RTdGF0ZSA9IDA7CisKKyAgICAgICAgcHVibGljIFdhckluZm8oRmlsZSB3YXIpIHsKKyAgICAgICAgICAgIHRoaXMud2FyID0gd2FyOworICAgICAgICAgICAgdGhpcy5sYXN0Q2hlY2tlZCA9IHdhci5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIGlmICghd2FyLmV4aXN0cygpKQorICAgICAgICAgICAgICAgIGxhc3RTdGF0ZSA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbW9kaWZpZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gd2FyLmV4aXN0cygpICYmIHdhci5sYXN0TW9kaWZpZWQoKSA+IGxhc3RDaGVja2VkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgeworICAgICAgICAgICAgcmV0dXJuIHdhci5leGlzdHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIDEgaWYgdGhlIGZpbGUgaGFzIGJlZW4gYWRkZWQvbW9kaWZpZWQsIDAgaWYgdGhlIGZpbGUgaXMKKyAgICAgICAgICogdW5jaGFuZ2VkIGFuZCAtMSBpZiB0aGUgZmlsZSBoYXMgYmVlbiByZW1vdmVkCisgICAgICAgICAqIAorICAgICAgICAgKiBAcmV0dXJuIGludCAxPWZpbGUgYWRkZWQ7IDA9dW5jaGFuZ2VkOyAtMT1maWxlIHJlbW92ZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgY2hlY2soKSB7CisgICAgICAgICAgICAvL2ZpbGUgdW5jaGFuZ2VkIGJ5IGRlZmF1bHQKKyAgICAgICAgICAgIGludCByZXN1bHQgPSAwOworCisgICAgICAgICAgICBpZiAobW9kaWZpZWQoKSkgeworICAgICAgICAgICAgICAgIC8vZmlsZSBoYXMgY2hhbmdlZCAtIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgICAgICAgICAgbGFzdFN0YXRlID0gcmVzdWx0OworICAgICAgICAgICAgfSBlbHNlIGlmICgoIWV4aXN0cygpKSAmJiAoIShsYXN0U3RhdGUgPT0gLTEpKSkgeworICAgICAgICAgICAgICAgIC8vZmlsZSB3YXMgcmVtb3ZlZAorICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgICAgICAgICAgIGxhc3RTdGF0ZSA9IHJlc3VsdDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGxhc3RTdGF0ZSA9PSAtMSkgJiYgZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAvL2ZpbGUgd2FzIGFkZGVkCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgICAgICAgICBsYXN0U3RhdGUgPSByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmxhc3RDaGVja2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEZpbGUgZ2V0V2FyKCkgeworICAgICAgICAgICAgcmV0dXJuIHdhcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gd2FyLmdldEFic29sdXRlUGF0aCgpLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBXYXJJbmZvKSB7CisgICAgICAgICAgICAgICAgV2FySW5mbyB3byA9IChXYXJJbmZvKSBvdGhlcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gd28uZ2V0V2FyKCkuZXF1YWxzKGdldFdhcigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0TGFzdFN0YXRlKGludCBsYXN0U3RhdGUpIHsKKyAgICAgICAgICAgIHRoaXMubGFzdFN0YXRlID0gbGFzdFN0YXRlOworICAgICAgICB9CisKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjU0NTUwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApAQCAtMCwwICsxLDk0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxtYmVhbnMtZGVzY3JpcHRvcnM+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iU2ltcGxlVGNwQ2x1c3RlciIKKyAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuQ2xhc3NOYW1lTUJlYW4iCisgICAgICAgICAgZGVzY3JpcHRpb249IlRjcCBDbHVzdGVyIGltcGxlbWVudGF0aW9uIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iQ2x1c3RlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5oYS50Y3AuU2ltcGxlVGNwQ2x1c3RlciI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icHJvdG9jb2xTdGFjayIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSmF2YUdyb3VwcyBwcm90b2NvbCBzdGFjayBzZWxlY3Rpb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICA8L21iZWFuPgorCisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyIgorICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5DbGFzc05hbWVNQmVhbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2x1c3RlcmVkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNYW5hZ2VyIGludGVyZmFjZSIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9Ik1hbmFnZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuaGEudGNwLlNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlciI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWxnb3JpdGhtIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtIHRvIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nCisgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gaWRlbnRpZmllcnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjaGVja0ludGVydmFsIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgaW50ZXJ2YWwgKGluIHNlY29uZHMpIGJldHdlZW4gY2hlY2tzIGZvciBleHBpcmVkCisgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25zIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkaXN0cmlidXRhYmxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGlzdHJpYnV0YWJsZSBmbGFnIGZvciBTZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgTWFuYWdlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImVudHJvcHkiCisgICAgICAgICAgZGVzY3JpcHRpb249IkEgU3RyaW5nIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB1c2VkIHRvIGluY3JlYXNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5IG9mIHRoZSBpbml0aWFsaXphdGlvbiBvZiBvdXIgcmFuZG9tIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYW5hZ2VkUmVzb3VyY2UiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtYW5hZ2VkIHJlc291cmNlIHRoaXMgTUJlYW4gaXMgYXNzb2NpYXRlZCB3aXRoIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4QWN0aXZlU2Vzc2lvbnMiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgU2Vzc2lvbnMgYWxsb3dlZCwgb3IgLTEKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5vIGxpbWl0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhJbmFjdGl2ZUludGVydmFsIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGVmYXVsdCBtYXhpbXVtIGluYWN0aXZlIGludGVydmFsIGZvciBTZXNzaW9ucworICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIGJ5IHRoaXMgTWFuYWdlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGRlc2NyaXB0aXZlIG5hbWUgb2YgdGhpcyBNYW5hZ2VyIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgIChmb3IgbG9nZ2luZykiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgPC9tYmVhbj4KKworCisKKzxtYmVhbiAgICAgICAgIG5hbWU9IlJlcGxpY2F0aW9uVmFsdmUiCisgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLkNsYXNzTmFtZU1CZWFuIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJWYWx2ZSBmb3Igc2ltcGxlIHRjcCByZXBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IlZhbHZlIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnRjcC5SZXBsaWNhdGlvblZhbHZlIj4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkZWJ1ZyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGRlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgZm9yIHRoaXMgY29tcG9uZW50IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICA8L21iZWFuPgorCisKKzwvbWJlYW5zLWRlc2NyaXB0b3JzPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvcGFja2FnZS5odG1sIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlODNhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwxMSBAQAorPGJvZHk+CisKKzxwPlRoaXMgcGFja2FnZSBjb250YWlucyBjb2RlIGZvciBDbHVzdGVyaW5nLCB0aGUgYmFzZSBjbGFzcworb2YgYSBDbHVzdGVyIGlzIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuQ2x1c3RlcjwvY29kZT4gaW1wbGVtZW50YXRpb25zCitvZiB0aGlzIGNsYXNzIGlzIGRvbmUgd2hlbiBpbXBsZW1lbnRpbmcgYSBuZXcgQ2x1c3RlciBwcm90b2NvbDwvcD4KKworPHA+VGhlIG9ubHkgQ2x1c3RlciBwcm90b2NvbCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgaXMgYSBKYXZhR3JvdXBzIGJhc2VkPGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+SkdDbHVzdGVyLmphdmE8L2I+Cis8L3A+CisKKzwvYm9keT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vQmFja3VwTWFuYWdlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9CYWNrdXBNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4YzQ3NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vQmFja3VwTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5zZXNzaW9uOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2F0YWxpbmFDbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3Rlck1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uU3RhbmRhcmRNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pby5SZXBsaWNhdGlvblN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50aXBpcy5MYXp5UmVwbGljYXRlZE1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsOworCisvKioKKyAqQGF1dGhvciBGaWxpcCBIYW5paworICpAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIEJhY2t1cE1hbmFnZXIgZXh0ZW5kcyBTdGFuZGFyZE1hbmFnZXIgaW1wbGVtZW50cyBDbHVzdGVyTWFuYWdlcgoreworICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBCYWNrdXBNYW5hZ2VyLmNsYXNzICk7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgREVGQVVMVF9SRVBMX1RJTUVPVVQgPSAxNTAwMDsvLzE1IHNlY29uZHMKKworICAgIC8qKiBTZXQgdG8gdHJ1ZSBpZiB3ZSBkb24ndCB3YW50IHRoZSBzZXNzaW9ucyB0byBleHBpcmUgb24gc2h1dGRvd24gKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtRXhwaXJlU2Vzc2lvbnNPblNodXRkb3duID0gdHJ1ZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIG1hbmFnZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CisKKyAgICAvKioKKyAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgY2x1c3RlcgorICAgICAqLworICAgIHByb3RlY3RlZCBDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTaG91bGQgbGlzdGVuZXJzIGJlIG5vdGlmaWVkPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBub3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uOworICAgIC8qKgorICAgICAqIAorICAgICAqLworICAgIHByaXZhdGUgaW50IG1hcFNlbmRPcHRpb25zID0gQ2hhbm5lbC5TRU5EX09QVElPTlNfU1lOQ0hST05JWkVEX0FDS3xDaGFubmVsLlNFTkRfT1BUSU9OU19VU0VfQUNLOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IsIGp1c3QgY2FsbHMgc3VwZXIoKQorICAgICAqCisgICAgICovCisgICAgcHVibGljIEJhY2t1cE1hbmFnZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gICAgICBDbHVzdGVyTWFuYWdlciBJbnRlcmZhY2UgICAgIAorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlRGF0YVJlY2VpdmVkKENsdXN0ZXJNZXNzYWdlIG1zZykgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2VuZENsdXN0ZXJEb21haW5Pbmx5KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHNlbmRDbHVzdGVyRG9tYWluT25seSBUaGUgc2VuZENsdXN0ZXJEb21haW5Pbmx5IHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZW5kQ2x1c3RlckRvbWFpbk9ubHkoYm9vbGVhbiBzZW5kQ2x1c3RlckRvbWFpbk9ubHkpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlZmF1bHRNb2RlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE1vZGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIGRlZmF1bHRNb2RlIFRoZSBkZWZhdWx0TW9kZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdE1vZGUoYm9vbGVhbiBkZWZhdWx0TW9kZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4cGlyZVNlc3Npb25zT25TaHV0ZG93bihib29sZWFuIGV4cGlyZVNlc3Npb25zT25TaHV0ZG93bikKKyAgICB7CisgICAgICAgIG1FeHBpcmVTZXNzaW9uc09uU2h1dGRvd24gPSBleHBpcmVTZXNzaW9uc09uU2h1dGRvd247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlcihDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2x1c3RlciBhc3NvY2lhdGVkIHdpdGggU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyIik7CisgICAgICAgIHRoaXMuY2x1c3RlciA9IGNsdXN0ZXI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RXhwaXJlU2Vzc2lvbnNPblNodXRkb3duKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtRXhwaXJlU2Vzc2lvbnNPblNodXRkb3duOworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgcGVyc2lzdGVuY2Ugc2luY2UgdGhleSBkb24ndCBnbyBoYW5kIGluIGhhbmQgd2l0aCByZXBsaWNhdGlvbiBmb3Igbm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVubG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDbHVzdGVyTWVzc2FnZSByZXF1ZXN0Q29tcGxldGVkKFN0cmluZyBzZXNzaW9uSWQpIHsKKyAgICAgICAgaWYgKCAhdGhpcy5zdGFydGVkICkgcmV0dXJuIG51bGw7CisgICAgICAgIExhenlSZXBsaWNhdGVkTWFwIG1hcCA9IChMYXp5UmVwbGljYXRlZE1hcClzZXNzaW9uczsKKyAgICAgICAgbWFwLnJlcGxpY2F0ZShzZXNzaW9uSWQsZmFsc2UpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBPVkVSUklERSBUSEVTRSBNRVRIT0RTIFRPIElNUExFTUVOVCBUSEUgUkVQTElDQVRJT04KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgcHVibGljIFNlc3Npb24gY3JlYXRlRW1wdHlTZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gbmV3IERlbHRhU2Vzc2lvbih0aGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIENsYXNzTG9hZGVyW10gZ2V0Q2xhc3NMb2FkZXJzKCkgeworICAgICAgICByZXR1cm4gQ2x1c3Rlck1hbmFnZXJCYXNlLmdldENsYXNzTG9hZGVycyh0aGlzLmNvbnRhaW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbiBTdHJlYW0gYW5kIHVzZSBjb3JyZWN0IENsYXNzTG9hZGVyIChDb250YWluZXIpIFN3aXRjaAorICAgICAqIFRocmVhZENsYXNzTG9hZGVyCisgICAgICogCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiBAcmV0dXJuIFRoZSBvYmplY3QgaW5wdXQgc3RyZWFtCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBSZXBsaWNhdGlvblN0cmVhbSBnZXRSZXBsaWNhdGlvblN0cmVhbShieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldFJlcGxpY2F0aW9uU3RyZWFtKGRhdGEsMCxkYXRhLmxlbmd0aCk7CisgICAgfQorCisgICAgcHVibGljIFJlcGxpY2F0aW9uU3RyZWFtIGdldFJlcGxpY2F0aW9uU3RyZWFtKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBmaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICByZXR1cm4gbmV3IFJlcGxpY2F0aW9uU3RyZWFtKGZpcywgZ2V0Q2xhc3NMb2FkZXJzKCkpOworICAgIH0gICAgCisKKworCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgPGNvZGU+Y29uZmlndXJlKCk8L2NvZGU+LAorICAgICAqIGFuZCBiZWZvcmUgYW55IG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgY29tcG9uZW50IGFyZSB1dGlsaXplZC48QlI+CisgICAgICogU3RhcnRzIHRoZSBjbHVzdGVyIGNvbW11bmljYXRpb24gY2hhbm5lbCwgdGhpcyB3aWxsIGNvbm5lY3Qgd2l0aCB0aGUgb3RoZXIgbm9kZXMKKyAgICAgKiBpbiB0aGUgY2x1c3RlciwgYW5kIHJlcXVlc3QgdGhlIGN1cnJlbnQgc2Vzc2lvbiBzdGF0ZSB0byBiZSB0cmFuc2ZlcnJlZCB0byB0aGlzIG5vZGUuCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlbgorICAgICAqICBzdGFydGVkCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgdGhpcyBjb21wb25lbnQgZnJvbSBiZWluZyB1c2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCB0aGlzLnN0YXJ0ZWQgKSByZXR1cm47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDYXRhbGluYUNsdXN0ZXIgY2F0Y2x1c3QgPSAoQ2F0YWxpbmFDbHVzdGVyKWNsdXN0ZXI7CisgICAgICAgICAgICBjYXRjbHVzdC5hZGRNYW5hZ2VyKGdldE5hbWUoKSwgdGhpcyk7CisgICAgICAgICAgICBMYXp5UmVwbGljYXRlZE1hcCBtYXAgPSBuZXcgTGF6eVJlcGxpY2F0ZWRNYXAodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjbHVzdC5nZXRDaGFubmVsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9SRVBMX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWFwTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENsYXNzTG9hZGVycygpKTsKKyAgICAgICAgICAgIG1hcC5zZXRDaGFubmVsU2VuZE9wdGlvbnMobWFwU2VuZE9wdGlvbnMpOworICAgICAgICAgICAgdGhpcy5zZXNzaW9ucyA9IG1hcDsKKyAgICAgICAgICAgIHN1cGVyLnN0YXJ0KCk7CisgICAgICAgIH0gIGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzdGFydCBCYWNrdXBNYW5hZ2VyIix4KTsKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24oIkZhaWxlZCB0byBzdGFydCBCYWNrdXBNYW5hZ2VyIix4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1hcE5hbWUoKSB7CisgICAgICAgIENhdGFsaW5hQ2x1c3RlciBjYXRjbHVzdCA9IChDYXRhbGluYUNsdXN0ZXIpY2x1c3RlcjsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBjYXRjbHVzdC5nZXRNYW5hZ2VyTmFtZShnZXROYW1lKCksdGhpcykrIi0iKyIiOworICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgbG9nLmRlYnVnKCJCYWNrdXAgbWFuYWdlciwgU2V0dGluZyBtYXAgbmFtZSB0bzoiK25hbWUpOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHRlcm1pbmF0ZSB0aGUgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB0aGUgbGFzdCBvbmUgY2FsbGVkIG9uIGEgZ2l2ZW4KKyAgICAgKiBpbnN0YW5jZSBvZiB0aGlzIGNvbXBvbmVudC48QlI+CisgICAgICogVGhpcyB3aWxsIGRpc2Nvbm5lY3QgdGhlIGNsdXN0ZXIgY29tbXVuaWNhdGlvbiBjaGFubmVsIGFuZCBzdG9wIHRoZSBsaXN0ZW5lciB0aHJlYWQuCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBuZWVkcyB0byBiZSByZXBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgeworICAgICAgICAKKyAgICAgICAgTGF6eVJlcGxpY2F0ZWRNYXAgbWFwID0gKExhenlSZXBsaWNhdGVkTWFwKXNlc3Npb25zOworICAgICAgICBpZiAoIG1hcCE9bnVsbCApIHsKKyAgICAgICAgICAgIG1hcC5icmVha2Rvd24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICF0aGlzLnN0YXJ0ZWQgKSByZXR1cm47CisgICAgICAgIHRyeSB7CisgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gc3RvcCBCYWNrdXBNYW5hZ2VyIix4KTsKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24oIkZhaWxlZCB0byBzdG9wIEJhY2t1cE1hbmFnZXIiLHgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3VwZXIuc3RvcCgpOworICAgICAgICB9CisgICAgICAgIGNsdXN0ZXIucmVtb3ZlTWFuYWdlcihnZXROYW1lKCksdGhpcyk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXN0cmlidXRhYmxlKGJvb2xlYW4gZGlzdCkgeworICAgICAgICB0aGlzLmRpc3RyaWJ1dGFibGUgPSBkaXN0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldERpc3RyaWJ1dGFibGUoKSB7CisgICAgICAgIHJldHVybiBkaXN0cmlidXRhYmxlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisgICAgcHVibGljIGJvb2xlYW4gaXNOb3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gbm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbjsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0Tm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbihib29sZWFuIG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24pIHsKKyAgICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uID0gbm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXBTZW5kT3B0aW9ucyhpbnQgbWFwU2VuZE9wdGlvbnMpIHsKKyAgICAgICAgdGhpcy5tYXBTZW5kT3B0aW9ucyA9IG1hcFNlbmRPcHRpb25zOworICAgIH0KKworICAgIC8qIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyTWFuYWdlciNnZXRDbHVzdGVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2F0YWxpbmFDbHVzdGVyIGdldENsdXN0ZXIoKSB7CisgICAgICAgIHJldHVybiBjbHVzdGVyOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TWFwU2VuZE9wdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtYXBTZW5kT3B0aW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW52YWxpZGF0ZWRTZXNzaW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL0NsdXN0ZXJNYW5hZ2VyQmFzZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9DbHVzdGVyTWFuYWdlckJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGE1MGYxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9DbHVzdGVyTWFuYWdlckJhc2UuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnNlc3Npb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJNYW5hZ2VyOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uTWFuYWdlckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLlJlcGxpY2F0aW9uU3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworCisvKioKKyAqIAorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2x1c3Rlck1hbmFnZXJCYXNlIGV4dGVuZHMgTWFuYWdlckJhc2UgaW1wbGVtZW50cyBMaWZlY3ljbGUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIENsdXN0ZXJNYW5hZ2VyeworICAgIAorCisgICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlcltdIGdldENsYXNzTG9hZGVycyhDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgIExvYWRlciBsb2FkZXIgPSBudWxsOworICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7CisgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgbG9hZGVyID0gY29udGFpbmVyLmdldExvYWRlcigpOworICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIGNsYXNzTG9hZGVyID0gbG9hZGVyLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIGVsc2UgY2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBpZiAoIGNsYXNzTG9hZGVyID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzTG9hZGVyW10ge2NsYXNzTG9hZGVyfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3NMb2FkZXJbXSB7Y2xhc3NMb2FkZXIsVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKX07CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBDbGFzc0xvYWRlcltdIGdldENsYXNzTG9hZGVycygpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzTG9hZGVycyhjb250YWluZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW4gU3RyZWFtIGFuZCB1c2UgY29ycmVjdCBDbGFzc0xvYWRlciAoQ29udGFpbmVyKSBTd2l0Y2gKKyAgICAgKiBUaHJlYWRDbGFzc0xvYWRlcgorICAgICAqIAorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogQHJldHVybiBUaGUgb2JqZWN0IGlucHV0IHN0cmVhbQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVwbGljYXRpb25TdHJlYW0gZ2V0UmVwbGljYXRpb25TdHJlYW0oYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRSZXBsaWNhdGlvblN0cmVhbShkYXRhLDAsZGF0YS5sZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBSZXBsaWNhdGlvblN0cmVhbSBnZXRSZXBsaWNhdGlvblN0cmVhbShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gZmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXBsaWNhdGlvblN0cmVhbShmaXMsIGdldENsYXNzTG9hZGVycygpKTsKKyAgICB9ICAgIAorCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL0NsdXN0ZXJTZXNzaW9uTGlzdGVuZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vQ2x1c3RlclNlc3Npb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YTkxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL0NsdXN0ZXJTZXNzaW9uTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuc2Vzc2lvbjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS4qOworCisvKioKKyAqIFJlY2VpdmUgcmVwbGljYXRlZCBTZXNzaW9uTWVzc2FnZSBmb3JtIG90aGVyIGNsdXN0ZXIgbm9kZS4KKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBDbHVzdGVyU2Vzc2lvbkxpc3RlbmVyIGV4dGVuZHMgQ2x1c3Rlckxpc3RlbmVyIHsKKyAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5DbHVzdGVyU2Vzc2lvbkxpc3RlbmVyLzEuMSI7CisKKyAgICAvLy0tQ29uc3RydWN0b3ItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyBDbHVzdGVyU2Vzc2lvbkxpc3RlbmVyKCkgeworICAgIH0KKworICAgIC8vLS1Mb2dpYy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmcm9tIHRoZSBjbHVzdGVyLCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCwgVGhlIGNsdXN0ZXIgd2lsbAorICAgICAqIGJyb2FkY2FzdCBpdCBpbnZva2luZyB0aGUgbWVzc2FnZVJlY2VpdmVkIG9uIHRoZSByZWNlaXZlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXlvYmoKKyAgICAgKiAgICAgICAgICAgIENsdXN0ZXJNZXNzYWdlIC0gdGhlIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgY2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZWNlaXZlZChDbHVzdGVyTWVzc2FnZSBteW9iaikgeworICAgICAgICBpZiAobXlvYmogIT0gbnVsbCAmJiBteW9iaiBpbnN0YW5jZW9mIFNlc3Npb25NZXNzYWdlKSB7CisgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZSBtc2cgPSAoU2Vzc2lvbk1lc3NhZ2UpIG15b2JqOworICAgICAgICAgICAgU3RyaW5nIGN0eG5hbWUgPSBtc2cuZ2V0Q29udGV4dE5hbWUoKTsKKyAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlIG1lc3NhZ2UgaXMgYSBFVlRfR0VUX0FMTF9TRVNTSU9OUywKKyAgICAgICAgICAgIC8vaWYgc28sIHdhaXQgdW50aWwgd2UgYXJlIGZ1bGx5IHN0YXJ0ZWQgdXAKKyAgICAgICAgICAgIE1hcCBtYW5hZ2VycyA9IGNsdXN0ZXIuZ2V0TWFuYWdlcnMoKSA7CisgICAgICAgICAgICBpZiAoY3R4bmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIGkgPSBtYW5hZ2Vycy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJNYW5hZ2VyIG1nciA9IChDbHVzdGVyTWFuYWdlcikgbWFuYWdlcnMuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZ3IgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1nci5tZXNzYWdlRGF0YVJlY2VpdmVkKG1zZyk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIGhhcHBlbnMgYSBsb3QgYmVmb3JlIHRoZSBzeXN0ZW0gaGFzIHN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb250ZXh0IG1hbmFnZXIgZG9lc24ndCBleGlzdDoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGtleSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENsdXN0ZXJNYW5hZ2VyIG1nciA9IChDbHVzdGVyTWFuYWdlcikgbWFuYWdlcnMuZ2V0KGN0eG5hbWUpOworICAgICAgICAgICAgICAgIGlmIChtZ3IgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgbWdyLm1lc3NhZ2VEYXRhUmVjZWl2ZWQobXNnKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiQ29udGV4dCBtYW5hZ2VyIGRvZXNuJ3QgZXhpc3Q6IiArIGN0eG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2NlcHQgb25seSBTZXNzaW9uTWVzc2FnZQorICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgICAgICAgIENsdXN0ZXJNZXNzYWdlCisgICAgICogQHJldHVybiBib29sZWFuIC0gcmV0dXJucyB0cnVlIHRvIGluZGljYXRlIHRoYXQgbWVzc2FnZVJlY2VpdmVkIHNob3VsZCBiZQorICAgICAqICAgICAgICAgaW52b2tlZC4gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIHRoZSBtZXNzYWdlUmVjZWl2ZWQgbWV0aG9kIHdpbGwKKyAgICAgKiAgICAgICAgIG5vdCBiZSBpbnZva2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChDbHVzdGVyTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgcmV0dXJuIChtc2cgaW5zdGFuY2VvZiBTZXNzaW9uTWVzc2FnZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL0NvbnN0YW50cy5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmU5OTZiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuc2Vzc2lvbjsKKworLyoqCisgKiBNYW5pZmVzdCBjb25zdGFudHMgZm9yIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnNlc3Npb248L2NvZGU+CisgKiBwYWNrYWdlLgorICoKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2ggUGVybworICovCisKK3B1YmxpYyBjbGFzcyBDb25zdGFudHMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnNlc3Npb24iOworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL0RlbHRhTWFuYWdlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9EZWx0YU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2QzZTIyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9EZWx0YU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDE1MDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuc2Vzc2lvbjsKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNhdGFsaW5hQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEudGNwLlJlcGxpY2F0aW9uVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLlJlcGxpY2F0aW9uU3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5MaWZlY3ljbGVTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworCisvKioKKyAqIFRoZSBEZWx0YU1hbmFnZXIgbWFuYWdlcyByZXBsaWNhdGVkIHNlc3Npb25zIGJ5IG9ubHkgcmVwbGljYXRpbmcgdGhlIGRlbHRhcworICogaW4gZGF0YS4gRm9yIGFwcGxpY2F0aW9ucyB3cml0dGVuIHRvIGhhbmRsZSB0aGlzLCB0aGUgRGVsdGFNYW5hZ2VyIGlzIHRoZQorICogb3B0aW1hbCB3YXkgb2YgcmVwbGljYXRpbmcgZGF0YS4KKyAqIAorICogVGhpcyBjb2RlIGlzIGFsbW9zdCBpZGVudGljYWwgdG8gU3RhbmRhcmRNYW5hZ2VyIHdpdGggYSBkaWZmZXJlbmNlIGluIGhvdyBpdAorICogcGVyc2lzdHMgc2Vzc2lvbnMgYW5kIHNvbWUgbW9kaWZpY2F0aW9ucyB0byBpdC4KKyAqIAorICogPGI+SU1QTEVNRU5UQVRJT04gTk9URSA8L2I+OiBDb3JyZWN0IGJlaGF2aW9yIG9mIHNlc3Npb24gc3RvcmluZyBhbmQKKyAqIHJlbG9hZGluZyBkZXBlbmRzIHVwb24gZXh0ZXJuYWwgY2FsbHMgdG8gdGhlIDxjb2RlPnN0YXJ0KCk8L2NvZGU+IGFuZAorICogPGNvZGU+c3RvcCgpPC9jb2RlPiBtZXRob2RzIG9mIHRoaXMgY2xhc3MgYXQgdGhlIGNvcnJlY3QgdGltZXMuCisgKiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBKZWFuLUZyYW5jb2lzIEFyY2FuZAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsdGFNYW5hZ2VyIGV4dGVuZHMgQ2x1c3Rlck1hbmFnZXJCYXNleworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZWN1cml0eSBDbGFzc2VzCisgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coRGVsdGFNYW5hZ2VyLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9IFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIkRlbHRhTWFuYWdlci8yLjEiOworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZCB5ZXQ/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBuYW1lIG9mIHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbiAoZm9yIGxvZ2dpbmcpLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIG1hbmFnZXJOYW1lID0gIkRlbHRhTWFuYWdlciI7CisgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0TW9kZSA9IGZhbHNlOworICAgIHByaXZhdGUgQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogY2FjaGVkIHJlcGxpY2F0aW9uIHZhbHZlIGNsdXN0ZXIgY29udGFpbmVyIQorICAgICAqLworICAgIHByaXZhdGUgUmVwbGljYXRpb25WYWx2ZSByZXBsaWNhdGlvblZhbHZlID0gbnVsbCA7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGxpZmVjeWNsZSBldmVudCBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlmZWN5Y2xlU3VwcG9ydCBsaWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlU3VwcG9ydCh0aGlzKTsKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgU2Vzc2lvbnMgYWxsb3dlZCwgb3IgLTEgZm9yIG5vIGxpbWl0LgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1heEFjdGl2ZVNlc3Npb25zID0gLTE7CisgICAgcHJpdmF0ZSBib29sZWFuIGV4cGlyZVNlc3Npb25zT25TaHV0ZG93biA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBub3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbm90aWZ5U2Vzc2lvbkxpc3RlbmVyc09uUmVwbGljYXRpb24gPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBzdGF0ZVRyYW5zZmVyZWQgPSBmYWxzZSA7CisgICAgcHJpdmF0ZSBpbnQgc3RhdGVUcmFuc2ZlclRpbWVvdXQgPSA2MDsKKyAgICBwcml2YXRlIGJvb2xlYW4gc2VuZEFsbFNlc3Npb25zID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc2VuZENsdXN0ZXJEb21haW5Pbmx5ID0gdHJ1ZSA7CisgICAgcHJpdmF0ZSBpbnQgc2VuZEFsbFNlc3Npb25zU2l6ZSA9IDEwMDAgOworICAgIAorICAgIC8qKgorICAgICAqIHdhaXQgdGltZSBiZXR3ZWVuIHNlbmQgc2Vzc2lvbiBibG9jayAoZGVmYXVsdCAyIHNlYykgCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc2VuZEFsbFNlc3Npb25zV2FpdFRpbWUgPSAyICogMTAwMCA7IAorICAgIHByaXZhdGUgQXJyYXlMaXN0IHJlY2VpdmVkTWVzc2FnZVF1ZXVlID0gbmV3IEFycmF5TGlzdCgpIDsKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVjZWl2ZXJRdWV1ZSA9IGZhbHNlIDsKKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhdGVUaW1lc3RhbXBEcm9wID0gdHJ1ZSA7CisgICAgcHJpdmF0ZSBsb25nIHN0YXRlVHJhbnNmZXJDcmVhdGVTZW5kVGltZTsgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0YXRzIGF0dHJpYnV0ZXMKKyAgICAKKyAgICBpbnQgcmVqZWN0ZWRTZXNzaW9ucyA9IDA7CisgICAgcHJpdmF0ZSBsb25nIHNlc3Npb25SZXBsYWNlQ291bnRlciA9IDAgOworICAgIGxvbmcgcHJvY2Vzc2luZ1RpbWUgPSAwOworICAgIHByaXZhdGUgbG9uZyBjb3VudGVyUmVjZWl2ZV9FVlRfR0VUX0FMTF9TRVNTSU9OUyA9IDAgOworICAgIHByaXZhdGUgbG9uZyBjb3VudGVyU2VuZF9FVlRfQUxMX1NFU1NJT05fREFUQSA9IDAgOworICAgIHByaXZhdGUgbG9uZyBjb3VudGVyUmVjZWl2ZV9FVlRfQUxMX1NFU1NJT05fREFUQSA9IDAgOworICAgIHByaXZhdGUgbG9uZyBjb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9DUkVBVEVEID0gMCA7CisgICAgcHJpdmF0ZSBsb25nIGNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0VYUElSRUQgPSAwOworICAgIHByaXZhdGUgbG9uZyBjb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9BQ0NFU1NFRCA9IDAgOworICAgIHByaXZhdGUgbG9uZyBjb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9ERUxUQSA9IDA7CisgICAgcHJpdmF0ZSBsb25nIGNvdW50ZXJTZW5kX0VWVF9HRVRfQUxMX1NFU1NJT05TID0gMCA7CisgICAgcHJpdmF0ZSBsb25nIGNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0NSRUFURUQgPSAwOworICAgIHByaXZhdGUgbG9uZyBjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9ERUxUQSA9IDAgOworICAgIHByaXZhdGUgbG9uZyBjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9BQ0NFU1NFRCA9IDA7CisgICAgcHJpdmF0ZSBsb25nIGNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0VYUElSRUQgPSAwOworICAgIHByaXZhdGUgaW50IGNvdW50ZXJTZW5kX0VWVF9BTExfU0VTU0lPTl9UUkFOU0ZFUkNPTVBMRVRFID0gMCA7CisgICAgcHJpdmF0ZSBpbnQgY291bnRlclJlY2VpdmVfRVZUX0FMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEUgPSAwIDsKKyAgICBwcml2YXRlIGludCBjb3VudGVyTm9TdGF0ZVRyYW5zZmVyZWQgPSAwIDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBEZWx0YU1hbmFnZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlc2NyaXB0aXZlIHNob3J0IG5hbWUgb2YgdGhpcyBNYW5hZ2VyIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb3VudGVyU2VuZF9FVlRfR0VUX0FMTF9TRVNTSU9OUy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDb3VudGVyU2VuZF9FVlRfR0VUX0FMTF9TRVNTSU9OUygpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXJTZW5kX0VWVF9HRVRfQUxMX1NFU1NJT05TOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0FDQ0VTU0VELgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldENvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0FDQ0VTU0VEKCkgeworICAgICAgICByZXR1cm4gY291bnRlclNlbmRfRVZUX1NFU1NJT05fQUNDRVNTRUQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY291bnRlclNlbmRfRVZUX1NFU1NJT05fQ1JFQVRFRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9DUkVBVEVEKCkgeworICAgICAgICByZXR1cm4gY291bnRlclNlbmRfRVZUX1NFU1NJT05fQ1JFQVRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0RFTFRBLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldENvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0RFTFRBKCkgeworICAgICAgICByZXR1cm4gY291bnRlclNlbmRfRVZUX1NFU1NJT05fREVMVEE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9FWFBJUkVELgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldENvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0VYUElSRUQoKSB7CisgICAgICAgIHJldHVybiBjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9FWFBJUkVEOworICAgIH0KKyAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvdW50ZXJTZW5kX0VWVF9BTExfU0VTU0lPTl9EQVRBLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldENvdW50ZXJTZW5kX0VWVF9BTExfU0VTU0lPTl9EQVRBKCkgeworICAgICAgICByZXR1cm4gY291bnRlclNlbmRfRVZUX0FMTF9TRVNTSU9OX0RBVEE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb3VudGVyU2VuZF9FVlRfQUxMX1NFU1NJT05fVFJBTlNGRVJDT01QTEVURS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvdW50ZXJTZW5kX0VWVF9BTExfU0VTU0lPTl9UUkFOU0ZFUkNPTVBMRVRFKCkgeworICAgICAgICByZXR1cm4gY291bnRlclNlbmRfRVZUX0FMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEU7CisgICAgfQorIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY291bnRlclJlY2VpdmVfRVZUX0FMTF9TRVNTSU9OX0RBVEEuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q291bnRlclJlY2VpdmVfRVZUX0FMTF9TRVNTSU9OX0RBVEEoKSB7CisgICAgICAgIHJldHVybiBjb3VudGVyUmVjZWl2ZV9FVlRfQUxMX1NFU1NJT05fREFUQTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb3VudGVyUmVjZWl2ZV9FVlRfR0VUX0FMTF9TRVNTSU9OUy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDb3VudGVyUmVjZWl2ZV9FVlRfR0VUX0FMTF9TRVNTSU9OUygpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXJSZWNlaXZlX0VWVF9HRVRfQUxMX1NFU1NJT05TOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0FDQ0VTU0VELgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldENvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0FDQ0VTU0VEKCkgeworICAgICAgICByZXR1cm4gY291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fQUNDRVNTRUQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fQ1JFQVRFRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9DUkVBVEVEKCkgeworICAgICAgICByZXR1cm4gY291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fQ1JFQVRFRDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9ERUxUQS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9ERUxUQSgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0RFTFRBOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0VYUElSRUQuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fRVhQSVJFRCgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0VYUElSRUQ7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY291bnRlclJlY2VpdmVfRVZUX0FMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb3VudGVyUmVjZWl2ZV9FVlRfQUxMX1NFU1NJT05fVFJBTlNGRVJDT01QTEVURSgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXJSZWNlaXZlX0VWVF9BTExfU0VTU0lPTl9UUkFOU0ZFUkNPTVBMRVRFOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByb2Nlc3NpbmdUaW1lLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFByb2Nlc3NpbmdUaW1lKCkgeworICAgICAgICByZXR1cm4gcHJvY2Vzc2luZ1RpbWU7CisgICAgfQorIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2Vzc2lvblJlcGxhY2VDb3VudGVyLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFNlc3Npb25SZXBsYWNlQ291bnRlcigpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb25SZXBsYWNlQ291bnRlcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIHNlc3Npb24gY3JlYXRpb25zIHRoYXQgZmFpbGVkIGR1ZSB0byBtYXhBY3RpdmVTZXNzaW9ucworICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGNvdW50CisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZWplY3RlZFNlc3Npb25zKCkgeworICAgICAgICByZXR1cm4gcmVqZWN0ZWRTZXNzaW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWplY3RlZFNlc3Npb25zKGludCByZWplY3RlZFNlc3Npb25zKSB7CisgICAgICAgIHRoaXMucmVqZWN0ZWRTZXNzaW9ucyA9IHJlamVjdGVkU2Vzc2lvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb3VudGVyTm9TdGF0ZVRyYW5zZmVyZWQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb3VudGVyTm9TdGF0ZVRyYW5zZmVyZWQoKSB7CisgICAgICAgIHJldHVybiBjb3VudGVyTm9TdGF0ZVRyYW5zZmVyZWQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0UmVjZWl2ZWRRdWV1ZVNpemUoKSB7CisgICAgICAgIHJldHVybiByZWNlaXZlZE1lc3NhZ2VRdWV1ZS5zaXplKCkgOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YXRlVHJhbnNmZXJUaW1lb3V0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U3RhdGVUcmFuc2ZlclRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZVRyYW5zZmVyVGltZW91dDsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIHRpbWVvdXRBbGxTZXNzaW9uIFRoZSB0aW1lb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhdGVUcmFuc2ZlclRpbWVvdXQoaW50IHRpbWVvdXRBbGxTZXNzaW9uKSB7CisgICAgICAgIHRoaXMuc3RhdGVUcmFuc2ZlclRpbWVvdXQgPSB0aW1lb3V0QWxsU2Vzc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpcyBzZXNzaW9uIHN0YXRlIHRyYW5zZmVyZWQgY29tcGxldGU/CisgICAgICogCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U3RhdGVUcmFuc2ZlcmVkKCkgeworICAgICAgICByZXR1cm4gc3RhdGVUcmFuc2ZlcmVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldCB0aGF0IHN0YXRlIGlzdCBjb21wbGV0ZSB0cmFuc2ZlcmVkICAKKyAgICAgKiBAcGFyYW0gc3RhdGVUcmFuc2ZlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhdGVUcmFuc2ZlcmVkKGJvb2xlYW4gc3RhdGVUcmFuc2ZlcmVkKSB7CisgICAgICAgIHRoaXMuc3RhdGVUcmFuc2ZlcmVkID0gc3RhdGVUcmFuc2ZlcmVkOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlbmRBbGxTZXNzaW9uc1dhaXRUaW1lIGluIG1zZWMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNlbmRBbGxTZXNzaW9uc1dhaXRUaW1lKCkgeworICAgICAgICByZXR1cm4gc2VuZEFsbFNlc3Npb25zV2FpdFRpbWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSBzZW5kQWxsU2Vzc2lvbnNXYWl0VGltZSBUaGUgc2VuZEFsbFNlc3Npb25zV2FpdFRpbWUgdG8gc2V0IGF0IG1zZWMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VuZEFsbFNlc3Npb25zV2FpdFRpbWUoaW50IHNlbmRBbGxTZXNzaW9uc1dhaXRUaW1lKSB7CisgICAgICAgIHRoaXMuc2VuZEFsbFNlc3Npb25zV2FpdFRpbWUgPSBzZW5kQWxsU2Vzc2lvbnNXYWl0VGltZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZW5kQ2x1c3RlckRvbWFpbk9ubHkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZW5kQ2x1c3RlckRvbWFpbk9ubHkoKSB7CisgICAgICAgIHJldHVybiBzZW5kQ2x1c3RlckRvbWFpbk9ubHk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSBzZW5kQ2x1c3RlckRvbWFpbk9ubHkgVGhlIHNlbmRDbHVzdGVyRG9tYWluT25seSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VuZENsdXN0ZXJEb21haW5Pbmx5KGJvb2xlYW4gc2VuZENsdXN0ZXJEb21haW5Pbmx5KSB7CisgICAgICAgIHRoaXMuc2VuZENsdXN0ZXJEb21haW5Pbmx5ID0gc2VuZENsdXN0ZXJEb21haW5Pbmx5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RhdGVUaW1lc3RhbXBEcm9wLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdGVUaW1lc3RhbXBEcm9wKCkgeworICAgICAgICByZXR1cm4gc3RhdGVUaW1lc3RhbXBEcm9wOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gaXNUaW1lc3RhbXBEcm9wIFRoZSBuZXcgZmxhZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0YXRlVGltZXN0YW1wRHJvcChib29sZWFuIGlzVGltZXN0YW1wRHJvcCkgeworICAgICAgICB0aGlzLnN0YXRlVGltZXN0YW1wRHJvcCA9IGlzVGltZXN0YW1wRHJvcDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgU2Vzc2lvbnMgYWxsb3dlZCwgb3IgLTEgZm9yIG5vIGxpbWl0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4QWN0aXZlU2Vzc2lvbnMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5tYXhBY3RpdmVTZXNzaW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmVzIFNlc3Npb25zIGFsbG93ZWQsIG9yIC0xIGZvciBubyBsaW1pdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWF4CisgICAgICogICAgICAgICAgICBUaGUgbmV3IG1heGltdW0gbnVtYmVyIG9mIHNlc3Npb25zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWF4QWN0aXZlU2Vzc2lvbnMoaW50IG1heCkgeworICAgICAgICBpbnQgb2xkTWF4QWN0aXZlU2Vzc2lvbnMgPSB0aGlzLm1heEFjdGl2ZVNlc3Npb25zOworICAgICAgICB0aGlzLm1heEFjdGl2ZVNlc3Npb25zID0gbWF4OworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgibWF4QWN0aXZlU2Vzc2lvbnMiLCBuZXcgSW50ZWdlcihvbGRNYXhBY3RpdmVTZXNzaW9ucyksIG5ldyBJbnRlZ2VyKHRoaXMubWF4QWN0aXZlU2Vzc2lvbnMpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZW5kQWxsU2Vzc2lvbnMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZW5kQWxsU2Vzc2lvbnMoKSB7CisgICAgICAgIHJldHVybiBzZW5kQWxsU2Vzc2lvbnM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSBzZW5kQWxsU2Vzc2lvbnMgVGhlIHNlbmRBbGxTZXNzaW9ucyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VuZEFsbFNlc3Npb25zKGJvb2xlYW4gc2VuZEFsbFNlc3Npb25zKSB7CisgICAgICAgIHRoaXMuc2VuZEFsbFNlc3Npb25zID0gc2VuZEFsbFNlc3Npb25zOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlbmRBbGxTZXNzaW9uc1NpemUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZW5kQWxsU2Vzc2lvbnNTaXplKCkgeworICAgICAgICByZXR1cm4gc2VuZEFsbFNlc3Npb25zU2l6ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIHNlbmRBbGxTZXNzaW9uc1NpemUgVGhlIHNlbmRBbGxTZXNzaW9uc1NpemUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlbmRBbGxTZXNzaW9uc1NpemUoaW50IHNlbmRBbGxTZXNzaW9uc1NpemUpIHsKKyAgICAgICAgdGhpcy5zZW5kQWxsU2Vzc2lvbnNTaXplID0gc2VuZEFsbFNlc3Npb25zU2l6ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBub3RpZnlTZXNzaW9uTGlzdGVuZXJzT25SZXBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc05vdGlmeVNlc3Npb25MaXN0ZW5lcnNPblJlcGxpY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gbm90aWZ5U2Vzc2lvbkxpc3RlbmVyc09uUmVwbGljYXRpb247CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSBub3RpZnlMaXN0ZW5lcnNDcmVhdGVTZXNzaW9uT25SZXBsaWNhdGlvbiBUaGUgbm90aWZ5U2Vzc2lvbkxpc3RlbmVyc09uUmVwbGljYXRpb24gdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmeVNlc3Npb25MaXN0ZW5lcnNPblJlcGxpY2F0aW9uKGJvb2xlYW4gbm90aWZ5TGlzdGVuZXJzQ3JlYXRlU2Vzc2lvbk9uUmVwbGljYXRpb24pIHsKKyAgICAgICAgdGhpcy5ub3RpZnlTZXNzaW9uTGlzdGVuZXJzT25SZXBsaWNhdGlvbiA9IG5vdGlmeUxpc3RlbmVyc0NyZWF0ZVNlc3Npb25PblJlcGxpY2F0aW9uOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cGlyZVNlc3Npb25zT25TaHV0ZG93bigpIHsKKyAgICAgICAgcmV0dXJuIGV4cGlyZVNlc3Npb25zT25TaHV0ZG93bjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBpcmVTZXNzaW9uc09uU2h1dGRvd24oYm9vbGVhbiBleHBpcmVTZXNzaW9uc09uU2h1dGRvd24pIHsKKyAgICAgICAgdGhpcy5leHBpcmVTZXNzaW9uc09uU2h1dGRvd24gPSBleHBpcmVTZXNzaW9uc09uU2h1dGRvd247CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzTm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Tm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbihib29sZWFuIG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24pIHsKKyAgICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uID0gbm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbjsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlZmF1bHRNb2RlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE1vZGUoKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0TW9kZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIGRlZmF1bHRNb2RlIFRoZSBkZWZhdWx0TW9kZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdE1vZGUoYm9vbGVhbiBkZWZhdWx0TW9kZSkgeworICAgICAgICB0aGlzLmRlZmF1bHRNb2RlID0gZGVmYXVsdE1vZGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDYXRhbGluYUNsdXN0ZXIgZ2V0Q2x1c3RlcigpIHsKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlcihDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICB0aGlzLmNsdXN0ZXIgPSBjbHVzdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBNYW5hZ2VyIGhhcyBiZWVuIGFzc29jaWF0ZWQuIElmIGl0IGlzIGEKKyAgICAgKiBDb250ZXh0ICh0aGUgdXN1YWwgY2FzZSksIGxpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGUgc2Vzc2lvbiB0aW1lb3V0CisgICAgICogcHJvcGVydHkuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRhaW5lcgorICAgICAqICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgQ29udGFpbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgLy8gRGUtcmVnaXN0ZXIgZnJvbSB0aGUgb2xkIENvbnRhaW5lciAoaWYgYW55KQorICAgICAgICBpZiAoKHRoaXMuY29udGFpbmVyICE9IG51bGwpICYmICh0aGlzLmNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgKChDb250ZXh0KSB0aGlzLmNvbnRhaW5lcikucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICAvLyBEZWZhdWx0IHByb2Nlc3NpbmcgcHJvdmlkZWQgYnkgb3VyIHN1cGVyY2xhc3MKKyAgICAgICAgc3VwZXIuc2V0Q29udGFpbmVyKGNvbnRhaW5lcik7CisKKyAgICAgICAgLy8gUmVnaXN0ZXIgd2l0aCB0aGUgbmV3IENvbnRhaW5lciAoaWYgYW55KQorICAgICAgICBpZiAoKHRoaXMuY29udGFpbmVyICE9IG51bGwpICYmICh0aGlzLmNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpKSB7CisgICAgICAgICAgICBzZXRNYXhJbmFjdGl2ZUludGVydmFsKCgoQ29udGV4dCkgdGhpcy5jb250YWluZXIpLmdldFNlc3Npb25UaW1lb3V0KCkgKiA2MCk7CisgICAgICAgICAgICAoKENvbnRleHQpIHRoaXMuY29udGFpbmVyKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW5kIHJldHVybiBhIG5ldyBzZXNzaW9uIG9iamVjdCwgYmFzZWQgb24gdGhlIGRlZmF1bHQgc2V0dGluZ3MKKyAgICAgKiBzcGVjaWZpZWQgYnkgdGhpcyBNYW5hZ2VyJ3MgcHJvcGVydGllcy4gVGhlIHNlc3Npb24gaWQgd2lsbCBiZSBhc3NpZ25lZAorICAgICAqIGJ5IHRoaXMgbWV0aG9kLCBhbmQgYXZhaWxhYmxlIHZpYSB0aGUgZ2V0SWQoKSBtZXRob2Qgb2YgdGhlIHJldHVybmVkCisgICAgICogc2Vzc2lvbi4gSWYgYSBuZXcgc2Vzc2lvbiBjYW5ub3QgYmUgY3JlYXRlZCBmb3IgYW55IHJlYXNvbiwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhIG5ldyBzZXNzaW9uIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgZm9yIGFueSByZWFzb24KKyAgICAgKiAKKyAgICAgKiBDb25zdHJ1Y3QgYW5kIHJldHVybiBhIG5ldyBzZXNzaW9uIG9iamVjdCwgYmFzZWQgb24gdGhlIGRlZmF1bHQgc2V0dGluZ3MKKyAgICAgKiBzcGVjaWZpZWQgYnkgdGhpcyBNYW5hZ2VyJ3MgcHJvcGVydGllcy4gVGhlIHNlc3Npb24gaWQgd2lsbCBiZSBhc3NpZ25lZAorICAgICAqIGJ5IHRoaXMgbWV0aG9kLCBhbmQgYXZhaWxhYmxlIHZpYSB0aGUgZ2V0SWQoKSBtZXRob2Qgb2YgdGhlIHJldHVybmVkCisgICAgICogc2Vzc2lvbi4gSWYgYSBuZXcgc2Vzc2lvbiBjYW5ub3QgYmUgY3JlYXRlZCBmb3IgYW55IHJlYXNvbiwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhIG5ldyBzZXNzaW9uIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgZm9yIGFueSByZWFzb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKFN0cmluZyBzZXNzaW9uSWQpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVNlc3Npb24oc2Vzc2lvbklkLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGUgbmV3IHNlc3Npb24gd2l0aCBjaGVjayBtYXhBY3RpdmVTZXNzaW9ucyBhbmQgc2VuZCBzZXNzaW9uIGNyZWF0aW9uCisgICAgICogdG8gb3RoZXIgY2x1c3RlciBub2Rlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGlzdHJpYnV0ZQorICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKFN0cmluZyBzZXNzaW9uSWQsIGJvb2xlYW4gZGlzdHJpYnV0ZSkgeworICAgICAgICBpZiAoKG1heEFjdGl2ZVNlc3Npb25zID49IDApICYmIChzZXNzaW9ucy5zaXplKCkgPj0gbWF4QWN0aXZlU2Vzc2lvbnMpKSB7CisgICAgICAgICAgICByZWplY3RlZFNlc3Npb25zKys7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLmNyZWF0ZVNlc3Npb24uaXNlIikpOworICAgICAgICB9CisgICAgICAgIERlbHRhU2Vzc2lvbiBzZXNzaW9uID0gKERlbHRhU2Vzc2lvbikgc3VwZXIuY3JlYXRlU2Vzc2lvbihzZXNzaW9uSWQpIDsKKyAgICAgICAgaWYgKGRpc3RyaWJ1dGUpIHsKKyAgICAgICAgICAgIHNlbmRDcmVhdGVTZXNzaW9uKHNlc3Npb24uZ2V0SWQoKSwgc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLmNyZWF0ZVNlc3Npb24ubmV3U2Vzc2lvbiIsc2Vzc2lvbi5nZXRJZCgpLCBuZXcgSW50ZWdlcihzZXNzaW9ucy5zaXplKCkpKSk7CisgICAgICAgIHJldHVybiAoc2Vzc2lvbik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIGNyZWF0ZSBzZXNzaW9uIGV2dCB0byBhbGwgYmFja3VwIG5vZGUKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbklkCisgICAgICogQHBhcmFtIHNlc3Npb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kQ3JlYXRlU2Vzc2lvbihTdHJpbmcgc2Vzc2lvbklkLCBEZWx0YVNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICBpZihjbHVzdGVyLmdldE1lbWJlcnMoKS5sZW5ndGggPiAwICkgeworICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbXNnID0gCisgICAgICAgICAgICAgICAgbmV3IFNlc3Npb25NZXNzYWdlSW1wbChnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9DUkVBVEVELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkICsgIi0iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIuc2VuZE1lc3NhZ2UubmV3U2Vzc2lvbiIsbmFtZSwgc2Vzc2lvbklkKSk7CisgICAgICAgICAgICBtc2cuc2V0VGltZXN0YW1wKHNlc3Npb24uZ2V0Q3JlYXRpb25UaW1lKCkpOworICAgICAgICAgICAgY291bnRlclNlbmRfRVZUX1NFU1NJT05fQ1JFQVRFRCsrOworICAgICAgICAgICAgc2VuZChtc2cpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNlbmQgbWVzc2FnZXMgdG8gb3RoZXIgYmFja3VwIG1lbWJlciAoZG9tYWluIG9yIGFsbCkKKyAgICAgKiBAcGFyYW0gbXNnIFNlc3Npb24gbWVzc2FnZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlbmQoU2Vzc2lvbk1lc3NhZ2UgbXNnKSB7CisgICAgICAgIGlmKGNsdXN0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYoaXNTZW5kQ2x1c3RlckRvbWFpbk9ubHkoKSkKKyAgICAgICAgICAgICAgICBjbHVzdGVyLnNlbmRDbHVzdGVyRG9tYWluKG1zZyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY2x1c3Rlci5zZW5kKG1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgRGVsdGFTZXNzaW9uCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXIjY3JlYXRlRW1wdHlTZXNzaW9uKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU2Vzc2lvbiBjcmVhdGVFbXB0eVNlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBnZXROZXdEZWx0YVNlc3Npb24oKSA7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldCBuZXcgc2Vzc2lvbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkb0xvYWQoKSBtZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIERlbHRhU2Vzc2lvbiBnZXROZXdEZWx0YVNlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgRGVsdGFTZXNzaW9uKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgRGVsdGFyZXF1ZXN0IGZyb20gZXh0ZXJuYWwgbm9kZQorICAgICAqIExvYWQgdGhlIENsYXNzIGF0IGNvbnRhaW5lciBjbGFzc2xvYWRlcgorICAgICAqIEBzZWUgRGVsdGFSZXF1ZXN0I3JlYWRFeHRlcm5hbChqYXZhLmlvLk9iamVjdElucHV0KQorICAgICAqIEBwYXJhbSBzZXNzaW9uCisgICAgICogQHBhcmFtIGRhdGEgbWVzc2FnZSBkYXRhCisgICAgICogQHJldHVybiBUaGUgcmVxdWVzdAorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGVsdGFSZXF1ZXN0IGRlc2VyaWFsaXplRGVsdGFSZXF1ZXN0KERlbHRhU2Vzc2lvbiBzZXNzaW9uLCBieXRlW10gZGF0YSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUmVwbGljYXRpb25TdHJlYW0gb2lzID0gZ2V0UmVwbGljYXRpb25TdHJlYW0oZGF0YSk7CisgICAgICAgIHNlc3Npb24uZ2V0RGVsdGFSZXF1ZXN0KCkucmVhZEV4dGVybmFsKG9pcyk7CisgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXREZWx0YVJlcXVlc3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXJpYWxpemUgRGVsdGFSZXF1ZXN0CisgICAgICogQHNlZSBEZWx0YVJlcXVlc3Qjd3JpdGVFeHRlcm5hbChqYXZhLmlvLk9iamVjdE91dHB1dCkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVsdGFSZXF1ZXN0CisgICAgICogQHJldHVybiBzZXJpYWxpemVkIGRlbHRhIHJlcXVlc3QKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBzZXJpYWxpemVEZWx0YVJlcXVlc3QoRGVsdGFSZXF1ZXN0IGRlbHRhUmVxdWVzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRlbHRhUmVxdWVzdC5zZXJpYWxpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHNlc3Npb25zIGZyb20gb3RoZXIgY2x1c3RlciBub2RlLgorICAgICAqIEZJWE1FIHJlcGxhY2UgY3VycmVudGx5IHNlc3Npb25zIHdpdGggc2FtZSBpZCB3aXRob3V0IG5vdGlmY2F0aW9uLgorICAgICAqIEZJWE1FIFNTTyBoYW5kbGluZyBpcyBub3QgcmVhbGx5IGNvcnJlY3Qgd2l0aCB0aGUgc2Vzc2lvbiByZXBsYWNlbWVudCEKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhIHNlcmlhbGl6ZWQgY2xhc3MgY2Fubm90IGJlIGZvdW5kIGR1cmluZyB0aGUgcmVsb2FkCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXNlcmlhbGl6ZVNlc3Npb25zKGJ5dGVbXSBkYXRhKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbixJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBvdXIgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzCisgICAgICAgIC8vc2Vzc2lvbnMuY2xlYXIoKTsgLy9zaG91bGQgbm90IGRvIHRoaXMKKyAgICAgICAgLy8gT3BlbiBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZCBwYXRobmFtZSwgaWYgYW55CisgICAgICAgIENsYXNzTG9hZGVyIG9yaWdpbmFsTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbnVsbDsKKyAgICAgICAgLy8gTG9hZCB0aGUgcHJldmlvdXNseSB1bmxvYWRlZCBhY3RpdmUgc2Vzc2lvbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9pcyA9IGdldFJlcGxpY2F0aW9uU3RyZWFtKGRhdGEpOworICAgICAgICAgICAgSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBvaXMucmVhZE9iamVjdCgpOworICAgICAgICAgICAgaW50IG4gPSBjb3VudC5pbnRWYWx1ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBEZWx0YVNlc3Npb24gc2Vzc2lvbiA9IChEZWx0YVNlc3Npb24pIGNyZWF0ZUVtcHR5U2Vzc2lvbigpOworICAgICAgICAgICAgICAgIHNlc3Npb24ucmVhZE9iamVjdERhdGEob2lzKTsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLnNldE1hbmFnZXIodGhpcyk7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRWYWxpZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLnNldFByaW1hcnlTZXNzaW9uKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAvL2luIGNhc2UgdGhlIG5vZGVzIGluIHRoZSBjbHVzdGVyIGFyZSBvdXQgb2YKKyAgICAgICAgICAgICAgICAvL3RpbWUgc3luY2gsIHRoaXMgd2lsbCBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIHRoZQorICAgICAgICAgICAgICAgIC8vY29ycmVjdCB0aW1lc3RhbXAsIGlzVmFsaWQgcmV0dXJucyB0cnVlLCBjYXVzZQorICAgICAgICAgICAgICAgIC8vIGFjY2Vzc0NvdW50PTEKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmFjY2VzcygpOworICAgICAgICAgICAgICAgIC8vbWFrZSBzdXJlIHRoYXQgdGhlIHNlc3Npb24gZ2V0cyByZWFkeSB0byBleHBpcmUgaWYKKyAgICAgICAgICAgICAgICAvLyBuZWVkZWQKKyAgICAgICAgICAgICAgICBzZXNzaW9uLnNldEFjY2Vzc0NvdW50KDApOworICAgICAgICAgICAgICAgIHNlc3Npb24ucmVzZXREZWx0YVJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSBIb3cgaW5mb3JtIG90aGVyIHNlc3Npb24gaWQgY2FjaGUgbGlrZSBTaW5nbGVTaWduT24KKyAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgc2Vzc2lvbkNvdW50ZXIgdG8gY29ycmVjdCBzdGF0cyByZXBvcnQKKyAgICAgICAgICAgICAgICBpZiAoZmluZFNlc3Npb24oc2Vzc2lvbi5nZXRJZEludGVybmFsKCkpID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Db3VudGVyKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblJlcGxhY2VDb3VudGVyKys7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGJldHRlciBpcyB0byBncmFwIHRoaXMgc2Vzc2lvbnMgYWdhaW4gIQorICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgbG9nLndhcm4oc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIubG9hZGluZy5leGlzdGluZy5zZXNzaW9uIixzZXNzaW9uLmdldElkSW50ZXJuYWwoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGQoc2Vzc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLmxvYWRpbmcuY25mZSIsIGUpLCBlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImRlbHRhTWFuYWdlci5sb2FkaW5nLmlvZSIsIGUpLCBlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBDbG9zZSB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChvaXMgIT0gbnVsbCkgb2lzLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb2lzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChvcmlnaW5hbExvYWRlciAhPSBudWxsKSBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihvcmlnaW5hbExvYWRlcik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIAorCisgICAgLyoqCisgICAgICogU2F2ZSBhbnkgY3VycmVudGx5IGFjdGl2ZSBzZXNzaW9ucyBpbiB0aGUgYXBwcm9wcmlhdGUgcGVyc2lzdGVuY2UKKyAgICAgKiBtZWNoYW5pc20sIGlmIGFueS4gSWYgcGVyc2lzdGVuY2UgaXMgbm90IHN1cHBvcnRlZCwgdGhpcyBtZXRob2QgcmV0dXJucworICAgICAqIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIHNlcmlhbGl6ZVNlc3Npb25zKFNlc3Npb25bXSBjdXJyZW50U2Vzc2lvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gT3BlbiBhbiBvdXRwdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQgcGF0aG5hbWUsIGlmIGFueQorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKKyAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGZvcykpOworICAgICAgICAgICAgb29zLndyaXRlT2JqZWN0KG5ldyBJbnRlZ2VyKGN1cnJlbnRTZXNzaW9ucy5sZW5ndGgpKTsKKyAgICAgICAgICAgIGZvcihpbnQgaT0wIDsgaSA8IGN1cnJlbnRTZXNzaW9ucy5sZW5ndGg7aSsrKSB7CisgICAgICAgICAgICAgICAgKChEZWx0YVNlc3Npb24pY3VycmVudFNlc3Npb25zW2ldKS53cml0ZU9iamVjdERhdGEob29zKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGbHVzaCBhbmQgY2xvc2UgdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICAgIG9vcy5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIudW5sb2FkaW5nLmlvZSIsIGUpLCBlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAob29zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb29zID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBzZW5kIG9iamVjdCBkYXRhIGFzIGJ5dGVbXQorICAgICAgICByZXR1cm4gZm9zLnRvQnl0ZUFycmF5KCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlmZWN5Y2xlLiBJZiB0aGlzCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gbGlmZWN5Y2xlLmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciA8Y29kZT5jb25maWd1cmUoKTwvY29kZT4sCisgICAgICogYW5kIGJlZm9yZSBhbnkgb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoZSBjb21wb25lbnQgYXJlIHV0aWxpemVkLgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yIHRoYXQgcHJldmVudHMgdGhpcworICAgICAqICAgICAgICAgICAgICAgIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICBpZiAoIWluaXRpYWxpemVkKSBpbml0KCk7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgLy8gRm9yY2UgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgIGdlbmVyYXRlU2Vzc2lvbklkKCk7CisKKyAgICAgICAgLy8gTG9hZCB1bmxvYWRlZCBzZXNzaW9ucywgaWYgYW55CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvL3RoZSBjaGFubmVsIGlzIGFscmVhZHkgcnVubmluZworICAgICAgICAgICAgQ2x1c3RlciBjbHVzdGVyID0gZ2V0Q2x1c3RlcigpIDsKKyAgICAgICAgICAgIC8vIHN0b3AgcmVtb3ZlIGNsdXN0ZXIgYmluZGluZworICAgICAgICAgICAgLy93b3csIGhvdyBtYW55IG5lc3RlZCBsZXZlbHMgb2YgaWYgc3RhdGVtZW50cyBjYW4gd2UgaGF2ZSA7KQorICAgICAgICAgICAgaWYoY2x1c3RlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGFpbmVyIGNvbnRleHQgPSBnZXRDb250YWluZXIoKSA7CisgICAgICAgICAgICAgICAgaWYoY29udGV4dCAhPSBudWxsICYmIGNvbnRleHQgaW5zdGFuY2VvZiBDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICBDb250YWluZXIgaG9zdCA9IGNvbnRleHQuZ2V0UGFyZW50KCkgOworICAgICAgICAgICAgICAgICAgICAgaWYoaG9zdCAhPSBudWxsICYmIGhvc3QgaW5zdGFuY2VvZiBIb3N0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlciA9IGhvc3QuZ2V0Q2x1c3RlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNsdXN0ZXIgIT0gbnVsbCAmJiBjbHVzdGVyIGluc3RhbmNlb2YgQ2F0YWxpbmFDbHVzdGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENsdXN0ZXIoKENhdGFsaW5hQ2x1c3RlcikgY2x1c3RlcikgOworICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lciBlbmdpbmUgPSBob3N0LmdldFBhcmVudCgpIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZW5naW5lICE9IG51bGwgJiYgZW5naW5lIGluc3RhbmNlb2YgRW5naW5lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyID0gZW5naW5lLmdldENsdXN0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNsdXN0ZXIgIT0gbnVsbCAmJiBjbHVzdGVyIGluc3RhbmNlb2YgQ2F0YWxpbmFDbHVzdGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2x1c3RlcigoQ2F0YWxpbmFDbHVzdGVyKSBjbHVzdGVyKSA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlciA9IG51bGwgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbHVzdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIubm9DbHVzdGVyIiwgZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9ICJ1bmtub3duIiA7CisgICAgICAgICAgICAgICAgICAgIGlmKCBjbHVzdGVyLmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgSG9zdCl7CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIkhvc3QiIDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCBjbHVzdGVyLmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgRW5naW5lKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiRW5naW5lIiA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIucmVnaXN0ZXJDbHVzdGVyIiwgZ2V0TmFtZSgpLCB0eXBlLCBjbHVzdGVyLmdldENsdXN0ZXJOYW1lKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIuc3RhcnRDbHVzdGVyaW5nIiwgZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAvL3RvIHN1cnZpY2UgY29udGV4dCByZWxvYWRzLCBhcyBvbmx5IGEgc3RvcC9zdGFydCBpcyBjYWxsZWQsIG5vdAorICAgICAgICAgICAgLy8gY3JlYXRlTWFuYWdlcgorICAgICAgICAgICAgKChDYXRhbGluYUNsdXN0ZXIpY2x1c3RlcikuYWRkTWFuYWdlcihnZXROYW1lKCksIHRoaXMpOworCisgICAgICAgICAgICBnZXRBbGxDbHVzdGVyU2Vzc2lvbnMoKTsKKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLm1hbmFnZXJMb2FkIiksIHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGZyb20gZmlyc3Qgc2Vzc2lvbiBtYXN0ZXIgdGhlIGJhY2t1cCBmcm9tIGFsbCBjbHVzdGVyZWQgc2Vzc2lvbnMKKyAgICAgKiBAc2VlICNmaW5kU2Vzc2lvbk1hc3Rlck1lbWJlcigpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGdldEFsbENsdXN0ZXJTZXNzaW9ucygpIHsKKyAgICAgICAgaWYgKGNsdXN0ZXIgIT0gbnVsbCAmJiBjbHVzdGVyLmdldE1lbWJlcnMoKS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBsb25nIGJlZm9yZVNlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBNZW1iZXIgbWJyID0gZmluZFNlc3Npb25NYXN0ZXJNZW1iZXIoKTsKKyAgICAgICAgICAgIGlmKG1iciA9PSBudWxsKSB7IC8vIE5vIGRvbWFpbiBtZW1iZXIgZm91bmQKKyAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbXNnID0gbmV3IFNlc3Npb25NZXNzYWdlSW1wbCh0aGlzLmdldE5hbWUoKSxTZXNzaW9uTWVzc2FnZS5FVlRfR0VUX0FMTF9TRVNTSU9OUywgbnVsbCwgIkdFVC1BTEwiLCJHRVQtQUxMLSIgKyBnZXROYW1lKCkpOworICAgICAgICAgICAgLy8gc2V0IHJlZmVyZW5jZSB0aW1lCisgICAgICAgICAgICBzdGF0ZVRyYW5zZmVyQ3JlYXRlU2VuZFRpbWUgPSBiZWZvcmVTZW5kVGltZSA7CisgICAgICAgICAgICAvLyByZXF1ZXN0IHNlc3Npb24gc3RhdGUKKyAgICAgICAgICAgIGNvdW50ZXJTZW5kX0VWVF9HRVRfQUxMX1NFU1NJT05TKys7CisgICAgICAgICAgICBzdGF0ZVRyYW5zZmVyZWQgPSBmYWxzZSA7CisgICAgICAgICAgICAvLyBGSVhNRSBUaGlzIHNlbmQgY2FsbCBibG9jayB0aGUgZGVwbG95IHRocmVhZCwgd2hlbiBzZW5kZXIgd2FpdEZvckFjayBpcyBlbmFibGVkCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZChyZWNlaXZlZE1lc3NhZ2VRdWV1ZSkgeworICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJRdWV1ZSA9IHRydWUgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbHVzdGVyLnNlbmQobXNnLCBtYnIpOworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSBsb2cud2FybihzbS5nZXRTdHJpbmcoImRlbHRhTWFuYWdlci53YWl0Rm9yU2Vzc2lvblN0YXRlIixnZXROYW1lKCksIG1icikpOworICAgICAgICAgICAgICAgIC8vIEZJWE1FIEF0IHNlbmRlciBhY2sgbW9kZSB0aGlzIG1ldGhvZCBjaGVjayBvbmx5IHRoZSBzdGF0ZSB0cmFuc2ZlciBhbmQgcmVzZW5kIGlzIGEgcHJvYmxlbSEKKyAgICAgICAgICAgICAgICB3YWl0Rm9yU2VuZEFsbFNlc3Npb25zKGJlZm9yZVNlbmRUaW1lKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKHJlY2VpdmVkTWVzc2FnZVF1ZXVlKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlY2VpdmVkTWVzc2FnZVF1ZXVlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2Ugc21zZyA9IChTZXNzaW9uTWVzc2FnZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXRlVGltZXN0YW1wRHJvcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWNlaXZlZChzbXNnLCBzbXNnLmdldEFkZHJlc3MoKSAhPSBudWxsID8gKE1lbWJlcikgc21zZy5nZXRBZGRyZXNzKCkgOiBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNtc2cuZ2V0RXZlbnRUeXBlKCkgIT0gU2Vzc2lvbk1lc3NhZ2UuRVZUX0dFVF9BTExfU0VTU0lPTlMgJiYgc21zZy5nZXRUaW1lc3RhbXAoKSA+PSBzdGF0ZVRyYW5zZmVyQ3JlYXRlU2VuZFRpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgaGFuZGxlIEVWVF9HRVRfQUxMX1NFU1NJT05TIGxhdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWNlaXZlZChzbXNnLHNtc2cuZ2V0QWRkcmVzcygpICE9IG51bGwgPyAoTWVtYmVyKSBzbXNnLmdldEFkZHJlc3MoKSA6IG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcoImRlbHRhTWFuYWdlci5kcm9wTWVzc2FnZSIsZ2V0TmFtZSgpLCBzbXNnLmdldEV2ZW50VHlwZVN0cmluZygpLG5ldyBEYXRlKHN0YXRlVHJhbnNmZXJDcmVhdGVTZW5kVGltZSksIG5ldyBEYXRlKHNtc2cuZ2V0VGltZXN0YW1wKCkpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZWNlaXZlZE1lc3NhZ2VRdWV1ZS5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICByZWNlaXZlclF1ZXVlID0gZmFsc2UgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpIGxvZy5pbmZvKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLm5vTWVtYmVycyIsIGdldE5hbWUoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgY3Jvc3MgY29udGV4dCBzZXNzaW9uIGF0IHJlcGxpY2F0aW9uIHZhbHZlIHRocmVhZCBsb2NhbAorICAgICAqIEBwYXJhbSBzZXNzaW9uIGNyb3NzIGNvbnRleHQgc2Vzc2lvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyU2Vzc2lvbkF0UmVwbGljYXRpb25WYWx2ZShEZWx0YVNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICBpZihyZXBsaWNhdGlvblZhbHZlID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmKGNvbnRhaW5lciBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCAmJiAoKFN0YW5kYXJkQ29udGV4dCljb250YWluZXIpLmdldENyb3NzQ29udGV4dCgpKSB7CisgICAgICAgICAgICAgICAgQ2x1c3RlciBjbHVzdGVyID0gZ2V0Q2x1c3RlcigpIDsKKyAgICAgICAgICAgICAgICBpZihjbHVzdGVyICE9IG51bGwgJiYgY2x1c3RlciBpbnN0YW5jZW9mIENhdGFsaW5hQ2x1c3RlcikgeworICAgICAgICAgICAgICAgICAgICBWYWx2ZVtdIHZhbHZlcyA9ICgoQ2F0YWxpbmFDbHVzdGVyKWNsdXN0ZXIpLmdldFZhbHZlcygpOworICAgICAgICAgICAgICAgICAgICBpZih2YWx2ZXMgIT0gbnVsbCAmJiB2YWx2ZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGludCBpPTA7IHJlcGxpY2F0aW9uVmFsdmUgPT0gbnVsbCAmJiBpIDwgdmFsdmVzLmxlbmd0aCA7IGkrKyApeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZhbHZlc1tpXSBpbnN0YW5jZW9mIFJlcGxpY2F0aW9uVmFsdmUpIHJlcGxpY2F0aW9uVmFsdmUgPSAoUmVwbGljYXRpb25WYWx2ZSl2YWx2ZXNbaV0gOworICAgICAgICAgICAgICAgICAgICAgICAgfS8vZm9yCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcGxpY2F0aW9uVmFsdmUgPT0gbnVsbCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zygibm8gUmVwbGljYXRpb25WYWx2ZSBmb3VuZCBmb3IgQ3Jvc3NDb250ZXh0IFN1cHBvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0vL2VuZGlmIAorICAgICAgICAgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgICAgICB9Ly9lbmRpZgorICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgIH0vL2VuZCBpZgorICAgICAgICBpZihyZXBsaWNhdGlvblZhbHZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcGxpY2F0aW9uVmFsdmUucmVnaXN0ZXJSZXBsaWNhdGlvblNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogRmluZCB0aGUgbWFzdGVyIG9mIHRoZSBzZXNzaW9uIHN0YXRlCisgICAgICogQHJldHVybiBtYXN0ZXIgbWVtYmVyIG9mIHNlc3Npb25zIAorICAgICAqLworICAgIHByb3RlY3RlZCBNZW1iZXIgZmluZFNlc3Npb25NYXN0ZXJNZW1iZXIoKSB7CisgICAgICAgIE1lbWJlciBtYnIgPSBudWxsOworICAgICAgICBNZW1iZXIgbWJyc1tdID0gY2x1c3Rlci5nZXRNZW1iZXJzKCk7CisgICAgICAgIGlmKG1icnMubGVuZ3RoICE9IDAgKSBtYnIgPSBtYnJzWzBdOworICAgICAgICBpZihtYnIgPT0gbnVsbCAmJiBsb2cuaXNXYXJuRW5hYmxlZCgpKSBsb2cud2FybihzbS5nZXRTdHJpbmcoImRlbHRhTWFuYWdlci5ub01hc3Rlck1lbWJlciIsZ2V0TmFtZSgpLCAiIikpOworICAgICAgICBpZihtYnIgIT0gbnVsbCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLndhcm4oc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIuZm91bmRNYXN0ZXJNZW1iZXIiLGdldE5hbWUoKSwgbWJyKSk7CisgICAgICAgIHJldHVybiBtYnI7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FpdCB0aGF0IGNsdXN0ZXIgc2Vzc2lvbiBzdGF0ZSBpcyB0cmFuc2ZlciBvciB0aW1lb3V0IGFmdGVyIDYwIFNlYworICAgICAqIFdpdGggc3RhdGVUcmFuc2ZlclRpbWVvdXQgPT0gLTEgd2FpdCB0aGF0IGJhY2t1cCBpcyB0cmFuc2ZlcmVkIChmb3JldmVyIG1vZGUpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvclNlbmRBbGxTZXNzaW9ucyhsb25nIGJlZm9yZVNlbmRUaW1lKSB7CisgICAgICAgIGxvbmcgcmVxU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9uZyByZXFOb3cgPSByZXFTdGFydCA7CisgICAgICAgIGJvb2xlYW4gaXNUaW1lb3V0ID0gZmFsc2U7CisgICAgICAgIGlmKGdldFN0YXRlVHJhbnNmZXJUaW1lb3V0KCkgPiAwKSB7CisgICAgICAgICAgICAvLyB3YWl0IHRoYXQgc3RhdGUgaXMgdHJhbnNmZXJlZCB3aXRoIHRpbWVvdXQgY2hlY2sKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gc2xlZXApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVxTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgaXNUaW1lb3V0ID0gKChyZXFOb3cgLSByZXFTdGFydCkgPiAoMTAwMCAqIGdldFN0YXRlVHJhbnNmZXJUaW1lb3V0KCkpKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKCghZ2V0U3RhdGVUcmFuc2ZlcmVkKCkpICYmICghaXNUaW1lb3V0KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZihnZXRTdGF0ZVRyYW5zZmVyVGltZW91dCgpID09IC0xKSB7CisgICAgICAgICAgICAgICAgLy8gd2FpdCB0aGF0IHN0YXRlIGlzIHRyYW5zZmVyZWQKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHNsZWVwKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlICgoIWdldFN0YXRlVHJhbnNmZXJlZCgpKSk7CisgICAgICAgICAgICAgICAgcmVxTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzVGltZW91dCB8fCAoIWdldFN0YXRlVHJhbnNmZXJlZCgpKSkgeworICAgICAgICAgICAgY291bnRlck5vU3RhdGVUcmFuc2ZlcmVkKysgOworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLm5vU2Vzc2lvblN0YXRlIixnZXROYW1lKCksbmV3IERhdGUoYmVmb3JlU2VuZFRpbWUpLG5ldyBMb25nKHJlcU5vdyAtIGJlZm9yZVNlbmRUaW1lKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIuc2Vzc2lvblJlY2VpdmVkIixnZXROYW1lKCksIG5ldyBEYXRlKGJlZm9yZVNlbmRUaW1lKSwgbmV3IExvbmcocmVxTm93IC0gYmVmb3JlU2VuZFRpbWUpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHRlcm1pbmF0ZSB0aGUgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHRoZSBsYXN0IG9uZSBjYWxsZWQgb24gYSBnaXZlbiBpbnN0YW5jZQorICAgICAqIG9mIHRoaXMgY29tcG9uZW50LgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yIHRoYXQgbmVlZHMgdG8gYmUKKyAgICAgKiAgICAgICAgICAgICAgICByZXBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIuc3RvcHBlZCIsIGdldE5hbWUoKSkpOworCisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKCFzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbihzbS5nZXRTdHJpbmcoImRlbHRhTWFuYWdlci5ub3RTdGFydGVkIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUT1BfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gZmFsc2U7CisKKyAgICAgICAgLy8gRXhwaXJlIGFsbCBhY3RpdmUgc2Vzc2lvbnMKKyAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpIGxvZy5pbmZvKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLmV4cGlyZVNlc3Npb25zIiwgZ2V0TmFtZSgpKSk7CisgICAgICAgIFNlc3Npb24gc2Vzc2lvbnNbXSA9IGZpbmRTZXNzaW9ucygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlc3Npb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBEZWx0YVNlc3Npb24gc2Vzc2lvbiA9IChEZWx0YVNlc3Npb24pIHNlc3Npb25zW2ldOworICAgICAgICAgICAgaWYgKCFzZXNzaW9uLmlzVmFsaWQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5leHBpcmUodHJ1ZSwgaXNFeHBpcmVTZXNzaW9uc09uU2h1dGRvd24oKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgaWdub3JlKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfSAKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcXVpcmUgYSBuZXcgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaWYgd2UgYXJlIHJlc3RhcnRlZAorICAgICAgICB0aGlzLnJhbmRvbSA9IG51bGw7CisgICAgICAgIGdldENsdXN0ZXIoKS5yZW1vdmVNYW5hZ2VyKGdldE5hbWUoKSx0aGlzKTsKKyAgICAgICAgcmVwbGljYXRpb25WYWx2ZSA9IG51bGw7CisgICAgICAgIGlmIChpbml0aWFsaXplZCkgeworICAgICAgICAgICAgZGVzdHJveSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHByb3BlcnR5IGNoYW5nZSBldmVudHMgZnJvbSBvdXIgYXNzb2NpYXRlZCBDb250ZXh0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBldmVudAorICAgICAqICAgICAgICAgICAgVGhlIHByb3BlcnR5IGNoYW5nZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgc291cmNlIG9mIHRoaXMgZXZlbnQKKyAgICAgICAgaWYgKCEoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBDb250ZXh0KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gUHJvY2VzcyBhIHJlbGV2YW50IHByb3BlcnR5IGNoYW5nZQorICAgICAgICBpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKCJzZXNzaW9uVGltZW91dCIpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNldE1heEluYWN0aXZlSW50ZXJ2YWwoKChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpKS5pbnRWYWx1ZSgpICogNjApOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIuc2Vzc2lvblRpbWVvdXQiLCBldmVudC5nZXROZXdWYWx1ZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlcGxpY2F0aW9uCisgICAgLy8gTWV0aG9kcworCisgICAgLyoqCisgICAgICogQSBtZXNzYWdlIHdhcyByZWNlaXZlZCBmcm9tIGFub3RoZXIgbm9kZSwgdGhpcyBpcyB0aGUgY2FsbGJhY2sgbWV0aG9kIHRvCisgICAgICogaW1wbGVtZW50IGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiByZWNlaXZpbmcgcmVwbGljYXRpb24gbWVzc2FnZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGNtc2cgLQorICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgcmVjZWl2ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWVzc2FnZURhdGFSZWNlaXZlZChDbHVzdGVyTWVzc2FnZSBjbXNnKSB7CisgICAgICAgIGlmIChjbXNnICE9IG51bGwgJiYgY21zZyBpbnN0YW5jZW9mIFNlc3Npb25NZXNzYWdlKSB7CisgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZSBtc2cgPSAoU2Vzc2lvbk1lc3NhZ2UpIGNtc2c7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX0dFVF9BTExfU0VTU0lPTlM6CisgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9DUkVBVEVEOiAKKyAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0VYUElSRUQ6IAorICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fQUNDRVNTRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9ERUxUQTogeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQocmVjZWl2ZWRNZXNzYWdlUXVldWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlY2VpdmVyUXVldWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZE1lc3NhZ2VRdWV1ZS5hZGQobXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgLy93ZSBkaWRuJ3QgcXVldWUsIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvL3N3aXRjaAorICAgICAgICAgICAgCisgICAgICAgICAgICBtZXNzYWdlUmVjZWl2ZWQobXNnLCBtc2cuZ2V0QWRkcmVzcygpICE9IG51bGwgPyAoTWVtYmVyKSBtc2cuZ2V0QWRkcmVzcygpIDogbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGNvbXBsZXRlZCwgdGhlIHJlcGxpY2F0aW9uIHZhbHZlIHdpbGwgbm90aWZ5CisgICAgICogdGhlIG1hbmFnZXIsIGFuZCB0aGUgbWFuYWdlciB3aWxsIGRlY2lkZSB3aGV0aGVyIGFueSByZXBsaWNhdGlvbiBpcworICAgICAqIG5lZWRlZCBvciBub3QuIElmIHRoZXJlIGlzIGEgbmVlZCBmb3IgcmVwbGljYXRpb24sIHRoZSBtYW5hZ2VyIHdpbGwKKyAgICAgKiBjcmVhdGUgYSBzZXNzaW9uIG1lc3NhZ2UgYW5kIHRoYXQgd2lsbCBiZSByZXBsaWNhdGVkLiBUaGUgY2x1c3RlcgorICAgICAqIGRldGVybWluZXMgd2hlcmUgaXQgZ2V0cyBzZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgLQorICAgICAqICAgICAgICAgICAgdGhlIHNlc3Npb25JZCB0aGF0IGp1c3QgY29tcGxldGVkLgorICAgICAqIEByZXR1cm4gYSBTZXNzaW9uTWVzc2FnZSB0byBiZSBzZW50LAorICAgICAqLworICAgIHB1YmxpYyBDbHVzdGVyTWVzc2FnZSByZXF1ZXN0Q29tcGxldGVkKFN0cmluZyBzZXNzaW9uSWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERlbHRhU2Vzc2lvbiBzZXNzaW9uID0gKERlbHRhU2Vzc2lvbikgZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIERlbHRhUmVxdWVzdCBkZWx0YVJlcXVlc3QgPSBzZXNzaW9uLmdldERlbHRhUmVxdWVzdCgpOworICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbXNnID0gbnVsbDsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNEZWx0YVJlcXVlc3QgPSBmYWxzZSA7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQoZGVsdGFSZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgaXNEZWx0YVJlcXVlc3QgPSBkZWx0YVJlcXVlc3QuZ2V0U2l6ZSgpID4gMCA7CisgICAgICAgICAgICAgICAgaWYgKGlzRGVsdGFSZXF1ZXN0KSB7ICAgIAorICAgICAgICAgICAgICAgICAgICBjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9ERUxUQSsrOworICAgICAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IHNlcmlhbGl6ZURlbHRhUmVxdWVzdChkZWx0YVJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBtc2cgPSBuZXcgU2Vzc2lvbk1lc3NhZ2VJbXBsKGdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9ERUxUQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCArICItIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZXNldERlbHRhUmVxdWVzdCgpOworICAgICAgICAgICAgICAgIH0gIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIWlzRGVsdGFSZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgaWYoIXNlc3Npb24uaXNQcmltYXJ5U2Vzc2lvbigpKSB7ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0FDQ0VTU0VEKys7CisgICAgICAgICAgICAgICAgICAgIG1zZyA9IG5ldyBTZXNzaW9uTWVzc2FnZUltcGwoZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0FDQ0VTU0VELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkICsgIi0iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImRlbHRhTWFuYWdlci5jcmVhdGVNZXNzYWdlLmFjY2Vzc0NoYW5nZVByaW1hcnkiLGdldE5hbWUoKSwgc2Vzc2lvbklkKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ICAgIAorICAgICAgICAgICAgfSBlbHNlIHsgLy8gbG9nIG9ubHkgb3V0c2lkZSBzeW5jaCBibG9jayEKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLmNyZWF0ZU1lc3NhZ2UuZGVsdGEiLGdldE5hbWUoKSwgc2Vzc2lvbklkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2Vzc2lvbi5zZXRQcmltYXJ5U2Vzc2lvbih0cnVlKTsKKyAgICAgICAgICAgIC8vY2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gc2VuZCBvdXQgYW4gYWNjZXNzIG1lc3NhZ2UKKyAgICAgICAgICAgIGlmICgobXNnID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgbG9uZyByZXBsRGVsdGEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHNlc3Npb24uZ2V0TGFzdFRpbWVSZXBsaWNhdGVkKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcGxEZWx0YSA+IChnZXRNYXhJbmFjdGl2ZUludGVydmFsKCkgKiAxMDAwKSkgeworICAgICAgICAgICAgICAgICAgICBjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9BQ0NFU1NFRCsrOworICAgICAgICAgICAgICAgICAgICBtc2cgPSBuZXcgU2Vzc2lvbk1lc3NhZ2VJbXBsKGdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9BQ0NFU1NFRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCArICItIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIuY3JlYXRlTWVzc2FnZS5hY2Nlc3MiLCBnZXROYW1lKCksc2Vzc2lvbklkKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy91cGRhdGUgbGFzdCByZXBsaWNhdGVkIHRpbWUKKyAgICAgICAgICAgIGlmIChtc2cgIT0gbnVsbCkgc2Vzc2lvbi5zZXRMYXN0VGltZVJlcGxpY2F0ZWQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24geCkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLmNyZWF0ZU1lc3NhZ2UudW5hYmxlQ3JlYXRlRGVsdGFSZXF1ZXN0IixzZXNzaW9uSWQpLCB4KTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICB9CisgICAgLyoqCisgICAgICogUmVzZXQgbWFuYWdlciBzdGF0aXN0aWNzCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0U3RhdGlzdGljcygpIHsKKyAgICAgICAgcHJvY2Vzc2luZ1RpbWUgPSAwIDsKKyAgICAgICAgZXhwaXJlZFNlc3Npb25zID0gMCA7CisgICAgICAgIHJlamVjdGVkU2Vzc2lvbnMgPSAwIDsKKyAgICAgICAgc2Vzc2lvblJlcGxhY2VDb3VudGVyID0gMCA7CisgICAgICAgIGNvdW50ZXJOb1N0YXRlVHJhbnNmZXJlZCA9IDAgOworICAgICAgICBtYXhBY3RpdmUgPSBnZXRBY3RpdmVTZXNzaW9ucygpIDsKKyAgICAgICAgc2Vzc2lvbkNvdW50ZXIgPSBnZXRBY3RpdmVTZXNzaW9ucygpIDsKKyAgICAgICAgY291bnRlclJlY2VpdmVfRVZUX0FMTF9TRVNTSU9OX0RBVEEgPSAwOworICAgICAgICBjb3VudGVyUmVjZWl2ZV9FVlRfR0VUX0FMTF9TRVNTSU9OUyA9IDA7CisgICAgICAgIGNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0FDQ0VTU0VEID0gMCA7CisgICAgICAgIGNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0NSRUFURUQgPSAwIDsKKyAgICAgICAgY291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fREVMVEEgPSAwIDsKKyAgICAgICAgY291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fRVhQSVJFRCA9IDAgOworICAgICAgICBjb3VudGVyUmVjZWl2ZV9FVlRfQUxMX1NFU1NJT05fVFJBTlNGRVJDT01QTEVURSA9IDA7CisgICAgICAgIGNvdW50ZXJTZW5kX0VWVF9BTExfU0VTU0lPTl9EQVRBID0gMDsKKyAgICAgICAgY291bnRlclNlbmRfRVZUX0dFVF9BTExfU0VTU0lPTlMgPSAwOworICAgICAgICBjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9BQ0NFU1NFRCA9IDAgOworICAgICAgICBjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9DUkVBVEVEID0gMCA7CisgICAgICAgIGNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0RFTFRBID0gMCA7CisgICAgICAgIGNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0VYUElSRUQgPSAwIDsKKyAgICAgICAgY291bnRlclNlbmRfRVZUX0FMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEUgPSAwOworICAgICAgICAKKyAgICB9CisgICAKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGVyc2lzdGVuY2UgaGFuZGxlcgorCisgICAgcHVibGljIHZvaWQgbG9hZCgpIHsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVubG9hZCgpIHsKKworICAgIH0KKworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBleHBpcmUKKworICAgIC8qKgorICAgICAqIHNlbmQgc2Vzc2lvbiBleHBpcmVkIHRvIG90aGVyIGNsdXN0ZXIgbm9kZXMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICAgIHNlc3Npb24gaWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXNzaW9uRXhwaXJlZChTdHJpbmcgaWQpIHsKKyAgICAgICAgY291bnRlclNlbmRfRVZUX1NFU1NJT05fRVhQSVJFRCsrIDsKKyAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbXNnID0gbmV3IFNlc3Npb25NZXNzYWdlSW1wbChnZXROYW1lKCksU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fRVhQSVJFRCwgbnVsbCwgaWQsIGlkKyAiLUVYUElSRUQtTVNHIik7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLmNyZWF0ZU1lc3NhZ2UuZXhwaXJlIixnZXROYW1lKCksIGlkKSk7CisgICAgICAgIHNlbmQobXNnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGlwcmUgYWxsIGZpbmQgc2Vzc2lvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhwaXJlQWxsTG9jYWxTZXNzaW9ucygpCisgICAgeworICAgICAgICBsb25nIHRpbWVOb3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uc1tdID0gZmluZFNlc3Npb25zKCk7CisgICAgICAgIGludCBleHBpcmVEaXJlY3QgID0gMCA7CisgICAgICAgIGludCBleHBpcmVJbmRpcmVjdCA9IDAgOworICAgICAgICAKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiU3RhcnQgZXhwaXJlIGFsbCBzZXNzaW9ucyAiICsgZ2V0TmFtZSgpICsgIiBhdCAiICsgdGltZU5vdyArICIgc2Vzc2lvbmNvdW50ICIgKyBzZXNzaW9ucy5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlc3Npb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbnNbaV0gaW5zdGFuY2VvZiBEZWx0YVNlc3Npb24pIHsKKyAgICAgICAgICAgICAgICBEZWx0YVNlc3Npb24gc2Vzc2lvbiA9IChEZWx0YVNlc3Npb24pIHNlc3Npb25zW2ldOworICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLmlzUHJpbWFyeVNlc3Npb24oKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZXhwaXJlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVEaXJlY3QrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZUluZGlyZWN0Kys7CisgICAgICAgICAgICAgICAgICAgIH0vL2VuZCBpZgorICAgICAgICAgICAgICAgIH0vL2VuZCBpZgorICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgIH0vL2ZvcgorICAgICAgICBsb25nIHRpbWVFbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiRW5kIGV4cGlyZSBzZXNzaW9ucyAiICsgZ2V0TmFtZSgpICsgIiBleGlwcmUgcHJvY2Vzc2luZ1RpbWUgIiArICh0aW1lRW5kIC0gdGltZU5vdykgKyAiIGV4cGlyZWQgZGlyZWN0IHNlc3Npb25zOiAiICsgZXhwaXJlRGlyZWN0ICsgIiBleHBpcmVkIGRpcmVjdCBzZXNzaW9uczogIiArIGV4cGlyZUluZGlyZWN0KTsKKyAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBXaGVuIHRoZSBtYW5hZ2VyIGV4cGlyZXMgc2Vzc2lvbiBub3QgdGllZCB0byBhIHJlcXVlc3QuIFRoZSBjbHVzdGVyIHdpbGwKKyAgICAgKiBwZXJpb2RpY2FsbHkgYXNrIGZvciBhIGxpc3Qgb2Ygc2Vzc2lvbnMgdGhhdCBzaG91bGQgZXhwaXJlIGFuZCB0aGF0CisgICAgICogc2hvdWxkIGJlIHNlbnQgYWNyb3NzIHRoZSB3aXJlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGludmFsaWRhdGVkIHNlc3Npb25zIGFycmF5CisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEludmFsaWRhdGVkU2Vzc2lvbnMoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworICAgIH0KKworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtZXNzYWdlIHJlY2VpdmUKKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBzZW5kZXIgYW5kIGxvY2FsIGRvbWFpbiBpcyB0aGUgc2FtZQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrU2VuZGVyRG9tYWluKFNlc3Npb25NZXNzYWdlIG1zZyxNZW1iZXIgc2VuZGVyKSB7CisgICAgICAgIGJvb2xlYW4gc2FtZURvbWFpbj0gdHJ1ZTsKKyAgICAgICAgaWYgKCFzYW1lRG9tYWluICYmIGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcoImRlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS5mcm9tV3JvbmdEb21haW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Z2V0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuZ2V0RXZlbnRUeXBlU3RyaW5nKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIiB9KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNhbWVEb21haW4gOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgcmVjZWl2ZWQgdGhyZWFkIHdoZW4gYSBTZXNzaW9uTWVzc2FnZSBoYXMKKyAgICAgKiBiZWVuIHJlY2VpdmVkIGZyb20gb25lIG9mIHRoZSBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3Rlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnIC0KKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHJlY2VpdmVkCisgICAgICogQHBhcmFtIHNlbmRlciAtCisgICAgICogICAgICAgICAgICB0aGUgc2VuZGVyIG9mIHRoZSBtZXNzYWdlLCB0aGlzIGlzIHVzZWQgaWYgd2UgcmVjZWl2ZSBhCisgICAgICogICAgICAgICAgICBFVlRfR0VUX0FMTF9TRVNTSU9OIG1lc3NhZ2UsIHNvIHRoYXQgd2Ugb25seSByZXBseSB0byB0aGUKKyAgICAgKiAgICAgICAgICAgIHJlcXVlc3Rpbmcgbm9kZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIG1lc3NhZ2VSZWNlaXZlZChTZXNzaW9uTWVzc2FnZSBtc2csIE1lbWJlciBzZW5kZXIpIHsKKyAgICAgICAgaWYoaXNTZW5kQ2x1c3RlckRvbWFpbk9ubHkoKSAmJiAhY2hlY2tTZW5kZXJEb21haW4obXNnLHNlbmRlcikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDbGFzc0xvYWRlciBjb250ZXh0TG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQ2xhc3NMb2FkZXJbXSBsb2FkZXJzID0gZ2V0Q2xhc3NMb2FkZXJzKCk7CisgICAgICAgICAgICBpZiAoIGxvYWRlcnMgIT0gbnVsbCAmJiBsb2FkZXJzLmxlbmd0aCA+IDApIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGxvYWRlcnNbMF0pOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIucmVjZWl2ZU1lc3NhZ2UuZXZlbnRUeXBlIixnZXROYW1lKCksIG1zZy5nZXRFdmVudFR5cGVTdHJpbmcoKSwgc2VuZGVyKSk7CisgCisgICAgICAgICAgICBzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX0dFVF9BTExfU0VTU0lPTlM6IHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlR0VUX0FMTF9TRVNTSU9OUyhtc2csc2VuZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX0FMTF9TRVNTSU9OX0RBVEE6IHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlQUxMX1NFU1NJT05fREFUQShtc2csc2VuZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX0FMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEU6IHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlQUxMX1NFU1NJT05fVFJBTlNGRVJDT01QTEVURShtc2csc2VuZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fQ1JFQVRFRDogeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVTRVNTSU9OX0NSRUFURUQobXNnLHNlbmRlcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0VYUElSRUQ6IHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlU0VTU0lPTl9FWFBJUkVEKG1zZyxzZW5kZXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9BQ0NFU1NFRDogeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVTRVNTSU9OX0FDQ0VTU0VEKG1zZyxzZW5kZXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9ERUxUQTogeworICAgICAgICAgICAgICAgICAgIGhhbmRsZVNFU1NJT05fREVMVEEobXNnLHNlbmRlcik7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgLy93ZSBkaWRuJ3QgcmVjb2duaXplIHRoZSBtZXNzYWdlIHR5cGUsIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvL3N3aXRjaAorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLmVycm9yIixnZXROYW1lKCkpLCB4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNvbnRleHRMb2FkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWVzc2FnZSByZWNlaXZlciBoYW5kbGVyCisKKworICAgIC8qKgorICAgICAqIGhhbmRsZSByZWNlaXZlIHNlc3Npb24gc3RhdGUgaXMgY29tcGxldGUgdHJhbnNmZXJlZAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiBAcGFyYW0gc2VuZGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQUxMX1NFU1NJT05fVFJBTlNGRVJDT01QTEVURShTZXNzaW9uTWVzc2FnZSBtc2csIE1lbWJlciBzZW5kZXIpIHsKKyAgICAgICAgY291bnRlclJlY2VpdmVfRVZUX0FMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEUrKyA7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLnRyYW5zZmVyY29tcGxldGUiLGdldE5hbWUoKSwgc2VuZGVyLmdldEhvc3QoKSwgbmV3IEludGVnZXIoc2VuZGVyLmdldFBvcnQoKSkpKTsKKyAgICAgICAgc3RhdGVUcmFuc2ZlckNyZWF0ZVNlbmRUaW1lID0gbXNnLmdldFRpbWVzdGFtcCgpIDsKKyAgICAgICAgc3RhdGVUcmFuc2ZlcmVkID0gdHJ1ZSA7CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFuZGxlIHJlY2VpdmUgc2Vzc2lvbiBkZWx0YQorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiBAcGFyYW0gc2VuZGVyCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVNFU1NJT05fREVMVEEoU2Vzc2lvbk1lc3NhZ2UgbXNnLCBNZW1iZXIgc2VuZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBjb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9ERUxUQSsrOworICAgICAgICBieXRlW10gZGVsdGEgPSBtc2cuZ2V0U2Vzc2lvbigpOworICAgICAgICBEZWx0YVNlc3Npb24gc2Vzc2lvbiA9IChEZWx0YVNlc3Npb24pIGZpbmRTZXNzaW9uKG1zZy5nZXRTZXNzaW9uSUQoKSk7CisgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLmRlbHRhIixnZXROYW1lKCksIG1zZy5nZXRTZXNzaW9uSUQoKSkpOworICAgICAgICAgICAgRGVsdGFSZXF1ZXN0IGRyZXEgPSBkZXNlcmlhbGl6ZURlbHRhUmVxdWVzdChzZXNzaW9uLCBkZWx0YSk7CisgICAgICAgICAgICBkcmVxLmV4ZWN1dGUoc2Vzc2lvbiwgbm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbik7CisgICAgICAgICAgICBzZXNzaW9uLnNldFByaW1hcnlTZXNzaW9uKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGhhbmRsZSByZWNlaXZlIHNlc3Npb24gaXMgYWNjZXNzIGF0IG90aGVyIG5vZGUgKCBwcmltYXJ5IHNlc3Npb24gaXMgbm93IGZhbHNlKQorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiBAcGFyYW0gc2VuZGVyCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVNFU1NJT05fQUNDRVNTRUQoU2Vzc2lvbk1lc3NhZ2UgbXNnLE1lbWJlciBzZW5kZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0FDQ0VTU0VEKys7CisgICAgICAgIERlbHRhU2Vzc2lvbiBzZXNzaW9uID0gKERlbHRhU2Vzc2lvbikgZmluZFNlc3Npb24obXNnLmdldFNlc3Npb25JRCgpKTsKKyAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIucmVjZWl2ZU1lc3NhZ2UuYWNjZXNzZWQiLGdldE5hbWUoKSwgbXNnLmdldFNlc3Npb25JRCgpKSk7CisgICAgICAgICAgICBzZXNzaW9uLmFjY2VzcygpOworICAgICAgICAgICAgc2Vzc2lvbi5zZXRQcmltYXJ5U2Vzc2lvbihmYWxzZSk7CisgICAgICAgICAgICBzZXNzaW9uLmVuZEFjY2VzcygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFuZGxlIHJlY2VpdmUgc2Vzc2lvbiBpcyBleHBpcmUgYXQgb3RoZXIgbm9kZSAoIGV4cGlyZSBzZXNzaW9uIGFsc28gaGVyZSkKKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICogQHBhcmFtIHNlbmRlcgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTRVNTSU9OX0VYUElSRUQoU2Vzc2lvbk1lc3NhZ2UgbXNnLE1lbWJlciBzZW5kZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0VYUElSRUQrKzsKKyAgICAgICAgRGVsdGFTZXNzaW9uIHNlc3Npb24gPSAoRGVsdGFTZXNzaW9uKSBmaW5kU2Vzc2lvbihtc2cuZ2V0U2Vzc2lvbklEKCkpOworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImRlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS5leHBpcmVkIixnZXROYW1lKCksIG1zZy5nZXRTZXNzaW9uSUQoKSkpOworICAgICAgICAgICAgc2Vzc2lvbi5leHBpcmUobm90aWZ5U2Vzc2lvbkxpc3RlbmVyc09uUmVwbGljYXRpb24sIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGhhbmRsZSByZWNlaXZlIG5ldyBzZXNzaW9uIGlzIGNyZWF0ZWQgYXQgb3RoZXIgbm9kZSAoY3JlYXRlIGJhY2t1cCAtIHByaW1hcnkgZmFsc2UpCisgICAgICogQHBhcmFtIG1zZworICAgICAqIEBwYXJhbSBzZW5kZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTRVNTSU9OX0NSRUFURUQoU2Vzc2lvbk1lc3NhZ2UgbXNnLE1lbWJlciBzZW5kZXIpIHsKKyAgICAgICAgY291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fQ1JFQVRFRCsrOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImRlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS5jcmVhdGVOZXdTZXNzaW9uIixnZXROYW1lKCksIG1zZy5nZXRTZXNzaW9uSUQoKSkpOworICAgICAgICBEZWx0YVNlc3Npb24gc2Vzc2lvbiA9IChEZWx0YVNlc3Npb24pIGNyZWF0ZUVtcHR5U2Vzc2lvbigpOworICAgICAgICBzZXNzaW9uLnNldE1hbmFnZXIodGhpcyk7CisgICAgICAgIHNlc3Npb24uc2V0VmFsaWQodHJ1ZSk7CisgICAgICAgIHNlc3Npb24uc2V0UHJpbWFyeVNlc3Npb24oZmFsc2UpOworICAgICAgICBzZXNzaW9uLnNldENyZWF0aW9uVGltZShtc2cuZ2V0VGltZXN0YW1wKCkpOworICAgICAgICBzZXNzaW9uLmFjY2VzcygpOworICAgICAgICBpZihub3RpZnlTZXNzaW9uTGlzdGVuZXJzT25SZXBsaWNhdGlvbikKKyAgICAgICAgICAgIHNlc3Npb24uc2V0SWQobXNnLmdldFNlc3Npb25JRCgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2Vzc2lvbi5zZXRJZEludGVybmFsKG1zZy5nZXRTZXNzaW9uSUQoKSk7CisgICAgICAgIHNlc3Npb24ucmVzZXREZWx0YVJlcXVlc3QoKTsKKyAgICAgICAgc2Vzc2lvbi5lbmRBY2Nlc3MoKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIGhhbmRsZSByZWNlaXZlIHNlc3Npb25zIGZyb20gb3RoZXIgbm90ICggcmVzdGFydCApCisgICAgICogQHBhcmFtIG1zZworICAgICAqIEBwYXJhbSBzZW5kZXIKKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQUxMX1NFU1NJT05fREFUQShTZXNzaW9uTWVzc2FnZSBtc2csTWVtYmVyIHNlbmRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY291bnRlclJlY2VpdmVfRVZUX0FMTF9TRVNTSU9OX0RBVEErKzsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIucmVjZWl2ZU1lc3NhZ2UuYWxsU2Vzc2lvbkRhdGFCZWdpbiIsZ2V0TmFtZSgpKSk7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbXNnLmdldFNlc3Npb24oKTsKKyAgICAgICAgZGVzZXJpYWxpemVTZXNzaW9ucyhkYXRhKTsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIucmVjZWl2ZU1lc3NhZ2UuYWxsU2Vzc2lvbkRhdGFBZnRlciIsZ2V0TmFtZSgpKSk7CisgICAgICAgIC8vc3RhdGVUcmFuc2ZlcnJlZCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFuZGxlIHJlY2VpdmUgdGhhdCBvdGhlciBub2RlIHdhbnQgYWxsIHNlc3Npb25zICggcmVzdGFydCApCisgICAgICogYSkgc2VuZCBhbGwgc2Vzc2lvbnMgd2l0aCBvbmUgbWVzc2FnZQorICAgICAqIGIpIHNlbmQgc2Vzc2lvbiBhdCBibG9ja3MKKyAgICAgKiBBZnRlciBzZW5kaW5nIHNlbmQgc3RhdGUgaXMgY29tcGxldGUgdHJhbnNmZXJlZAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiBAcGFyYW0gc2VuZGVyCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUdFVF9BTExfU0VTU0lPTlMoU2Vzc2lvbk1lc3NhZ2UgbXNnLCBNZW1iZXIgc2VuZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb3VudGVyUmVjZWl2ZV9FVlRfR0VUX0FMTF9TRVNTSU9OUysrOworICAgICAgICAvL2dldCBhIGxpc3Qgb2YgYWxsIHRoZSBzZXNzaW9uIGZyb20gdGhpcyBtYW5hZ2VyCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLnVubG9hZGluZ0JlZ2luIiwgZ2V0TmFtZSgpKSk7CisgICAgICAgIC8vIFdyaXRlIHRoZSBudW1iZXIgb2YgYWN0aXZlIHNlc3Npb25zLCBmb2xsb3dlZCBieSB0aGUgZGV0YWlscworICAgICAgICAvLyBnZXQgYWxsIHNlc3Npb25zIGFuZCBzZXJpYWxpemUgd2l0aG91dCBzeW5jCisgICAgICAgIFNlc3Npb25bXSBjdXJyZW50U2Vzc2lvbnMgPSBmaW5kU2Vzc2lvbnMoKTsKKyAgICAgICAgbG9uZyBmaW5kU2Vzc2lvblRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDsKKyAgICAgICAgaWYgKGlzU2VuZEFsbFNlc3Npb25zKCkpIHsKKyAgICAgICAgICAgIHNlbmRTZXNzaW9ucyhzZW5kZXIsIGN1cnJlbnRTZXNzaW9ucywgZmluZFNlc3Npb25UaW1lc3RhbXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc2VuZCBzZXNzaW9uIGF0IGJsb2NrcworICAgICAgICAgICAgaW50IGxlbiA9IGN1cnJlbnRTZXNzaW9ucy5sZW5ndGggPCBnZXRTZW5kQWxsU2Vzc2lvbnNTaXplKCkgPyBjdXJyZW50U2Vzc2lvbnMubGVuZ3RoIDogZ2V0U2VuZEFsbFNlc3Npb25zU2l6ZSgpOworICAgICAgICAgICAgU2Vzc2lvbltdIHNlbmRTZXNzaW9ucyA9IG5ldyBTZXNzaW9uW2xlbl07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRTZXNzaW9ucy5sZW5ndGg7IGkgKz0gZ2V0U2VuZEFsbFNlc3Npb25zU2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgbGVuID0gaSArIGdldFNlbmRBbGxTZXNzaW9uc1NpemUoKSA+IGN1cnJlbnRTZXNzaW9ucy5sZW5ndGggPyBjdXJyZW50U2Vzc2lvbnMubGVuZ3RoIC0gaSA6IGdldFNlbmRBbGxTZXNzaW9uc1NpemUoKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnRTZXNzaW9ucywgaSwgc2VuZFNlc3Npb25zLCAwLCBsZW4pOworICAgICAgICAgICAgICAgIHNlbmRTZXNzaW9ucyhzZW5kZXIsIHNlbmRTZXNzaW9ucyxmaW5kU2Vzc2lvblRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgaWYgKGdldFNlbmRBbGxTZXNzaW9uc1dhaXRUaW1lKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoZ2V0U2VuZEFsbFNlc3Npb25zV2FpdFRpbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBzbGVlcCkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICB9Ly9mb3IKKyAgICAgICAgfS8vZW5kIGlmCisgICAgICAgIAorICAgICAgICBTZXNzaW9uTWVzc2FnZSBuZXdtc2cgPSBuZXcgU2Vzc2lvbk1lc3NhZ2VJbXBsKG5hbWUsU2Vzc2lvbk1lc3NhZ2UuRVZUX0FMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEUsIG51bGwsIlNFU1NJT04tU1RBVEUtVFJBTlNGRVJFRCIsICJTRVNTSU9OLVNUQVRFLVRSQU5TRkVSRUQiKyBnZXROYW1lKCkpOworICAgICAgICBuZXdtc2cuc2V0VGltZXN0YW1wKGZpbmRTZXNzaW9uVGltZXN0YW1wKTsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJkZWx0YU1hbmFnZXIuY3JlYXRlTWVzc2FnZS5hbGxTZXNzaW9uVHJhbnNmZXJlZCIsZ2V0TmFtZSgpKSk7CisgICAgICAgIGNvdW50ZXJTZW5kX0VWVF9BTExfU0VTU0lPTl9UUkFOU0ZFUkNPTVBMRVRFKys7CisgICAgICAgIGNsdXN0ZXIuc2VuZChuZXdtc2csIHNlbmRlcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBzZW5kIGEgYmxvY2sgb2Ygc2Vzc2lvbiB0byBzZW5kZXIKKyAgICAgKiBAcGFyYW0gc2VuZGVyCisgICAgICogQHBhcmFtIGN1cnJlbnRTZXNzaW9ucworICAgICAqIEBwYXJhbSBzZW5kVGltZXN0YW1wCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlbmRTZXNzaW9ucyhNZW1iZXIgc2VuZGVyLCBTZXNzaW9uW10gY3VycmVudFNlc3Npb25zLGxvbmcgc2VuZFRpbWVzdGFtcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBzZXJpYWxpemVTZXNzaW9ucyhjdXJyZW50U2Vzc2lvbnMpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImRlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS51bmxvYWRpbmdBZnRlciIsZ2V0TmFtZSgpKSk7CisgICAgICAgIFNlc3Npb25NZXNzYWdlIG5ld21zZyA9IG5ldyBTZXNzaW9uTWVzc2FnZUltcGwobmFtZSxTZXNzaW9uTWVzc2FnZS5FVlRfQUxMX1NFU1NJT05fREFUQSwgZGF0YSwiU0VTU0lPTi1TVEFURSIsICJTRVNTSU9OLVNUQVRFLSIgKyBnZXROYW1lKCkpOworICAgICAgICBuZXdtc2cuc2V0VGltZXN0YW1wKHNlbmRUaW1lc3RhbXApOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImRlbHRhTWFuYWdlci5jcmVhdGVNZXNzYWdlLmFsbFNlc3Npb25EYXRhIixnZXROYW1lKCkpKTsKKyAgICAgICAgY291bnRlclNlbmRfRVZUX0FMTF9TRVNTSU9OX0RBVEErKzsKKyAgICAgICAgY2x1c3Rlci5zZW5kKG5ld21zZywgc2VuZGVyKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vRGVsdGFSZXF1ZXN0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL0RlbHRhUmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMzQwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL0RlbHRhUmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuc2Vzc2lvbjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIHNlcmllcyBvZiBhY3Rpb25zIHRoYXQgaGFwcGVucyB3aGVuCisgKiBhIHJlcXVlc3QgaXMgZXhlY3V0ZWQuIFRoZXNlIGFjdGlvbnMgd2lsbCB0aGVuIHRyYW5zbGF0ZSBpbnRvIGludm9rYXRpb25zIG9mIG1ldGhvZHMgCisgKiBvbiB0aGUgYWN0dWFsIHNlc3Npb24uCisgKiBUaGlzIGNsYXNzIGlzIE5PVCB0aHJlYWQgc2FmZS4gT25lIERlbHRhUmVxdWVzdCBwZXIgc2Vzc2lvbgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZmhhbmlrQGFwYWNoZS5vcmciPkZpbGlwIEhhbmlrPC9hPgorICogQHZlcnNpb24gMS4wCisgKi8KKworaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkdlbmVyaWNQcmluY2lwYWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKKworCitwdWJsaWMgY2xhc3MgRGVsdGFSZXF1ZXN0IGltcGxlbWVudHMgRXh0ZXJuYWxpemFibGUgeworCisgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIERlbHRhUmVxdWVzdC5jbGFzcyApOworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0gU3RyaW5nTWFuYWdlcgorICAgICAgICAgICAgLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9BVFRSSUJVVEUgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUFJJTkNJUEFMID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lTTkVXID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX01BWElOVEVSVkFMID0gMzsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9TRVQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9SRU1PVkUgPSAxOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUklOQ0lQQUwgPSAiX19TRVRfX1BSSU5DSVBBTF9fIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX01BWElOVEVSVkFMID0gIl9fU0VUX19NQVhJTlRFUlZBTF9fIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0lTTkVXID0gIl9fU0VUX19JU05FV19fIjsKKworICAgIHByaXZhdGUgU3RyaW5nIHNlc3Npb25JZDsKKyAgICBwcml2YXRlIExpbmtlZExpc3QgYWN0aW9ucyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgcHJpdmF0ZSBMaW5rZWRMaXN0IGFjdGlvblBvb2wgPSBuZXcgTGlua2VkTGlzdCgpOworICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiByZWNvcmRBbGxBY3Rpb25zID0gZmFsc2U7CisKKyAgICBwdWJsaWMgRGVsdGFSZXF1ZXN0KCkgeworICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIERlbHRhUmVxdWVzdChTdHJpbmcgc2Vzc2lvbklkLCBib29sZWFuIHJlY29yZEFsbEFjdGlvbnMpIHsKKyAgICAgICAgdGhpcy5yZWNvcmRBbGxBY3Rpb25zPXJlY29yZEFsbEFjdGlvbnM7CisgICAgICAgIGlmKHNlc3Npb25JZCAhPSBudWxsKQorICAgICAgICAgICAgc2V0U2Vzc2lvbklkKHNlc3Npb25JZCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpbnQgYWN0aW9uID0gKHZhbHVlPT1udWxsKT9BQ1RJT05fUkVNT1ZFOkFDVElPTl9TRVQ7CisgICAgICAgIGFkZEFjdGlvbihUWVBFX0FUVFJJQlVURSxhY3Rpb24sbmFtZSx2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGludCBhY3Rpb24gPSBBQ1RJT05fUkVNT1ZFOworICAgICAgICBhZGRBY3Rpb24oVFlQRV9BVFRSSUJVVEUsYWN0aW9uLG5hbWUsbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWF4SW5hY3RpdmVJbnRlcnZhbChpbnQgaW50ZXJ2YWwpIHsKKyAgICAgICAgaW50IGFjdGlvbiA9IEFDVElPTl9TRVQ7CisgICAgICAgIGFkZEFjdGlvbihUWVBFX01BWElOVEVSVkFMLGFjdGlvbixOQU1FX01BWElOVEVSVkFMLG5ldyBJbnRlZ2VyKGludGVydmFsKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIGNvbnZlcnQgcHJpbmNpcGFsIGF0IFNlcmlhbGl6YWJsZVByaW5jaXBhbCBmb3IgYmFja3VwIG5vZGVzLgorICAgICAqIE9ubHkgc3VwcG9ydCBwcmluY2lwYWxzIGZyb20gdHlwZSB7QGxpbmsgR2VuZXJpY1ByaW5jaXBhbCBHZW5lcmljUHJpbmNpcGFsfQorICAgICAqIEBwYXJhbSBwIFNlc3Npb24gcHJpbmNpcGFsCisgICAgICogQHNlZSBHZW5lcmljUHJpbmNpcGFsCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbmNpcGFsKFByaW5jaXBhbCBwKSB7CisgICAgICAgIGludCBhY3Rpb24gPSAocD09bnVsbCk/QUNUSU9OX1JFTU9WRTpBQ1RJT05fU0VUOworICAgICAgICBTZXJpYWxpemFibGVQcmluY2lwYWwgc3AgPSBudWxsOworICAgICAgICBpZiAoIHAgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIGlmKHAgaW5zdGFuY2VvZiBHZW5lcmljUHJpbmNpcGFsKSB7CisgICAgICAgICAgICAgICAgc3AgPSBTZXJpYWxpemFibGVQcmluY2lwYWwuY3JlYXRlUHJpbmNpcGFsKChHZW5lcmljUHJpbmNpcGFsKXApOworICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJkZWx0YVJlcXVlc3Quc2hvd1ByaW5jaXBhbCIsIHAuZ2V0TmFtZSgpICwgZ2V0U2Vzc2lvbklkKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImRlbHRhUmVxdWVzdC53cm9uZ1ByaW5jaXBhbENsYXNzIixwLmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgYWRkQWN0aW9uKFRZUEVfUFJJTkNJUEFMLGFjdGlvbixOQU1FX1BSSU5DSVBBTCxzcCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmV3KGJvb2xlYW4gbikgeworICAgICAgICBpbnQgYWN0aW9uID0gQUNUSU9OX1NFVDsKKyAgICAgICAgYWRkQWN0aW9uKFRZUEVfSVNORVcsYWN0aW9uLE5BTUVfSVNORVcsbmV3IEJvb2xlYW4obikpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBhZGRBY3Rpb24oaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgQXR0cmlidXRlSW5mbyBpbmZvID0gbnVsbDsKKyAgICAgICAgaWYgKCB0aGlzLmFjdGlvblBvb2wuc2l6ZSgpID4gMCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW5mbyA9IChBdHRyaWJ1dGVJbmZvKSBhY3Rpb25Qb29sLnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICB9Y2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byByZW1vdmUgZWxlbWVudDoiLHgpOworICAgICAgICAgICAgICAgIGluZm8gPSBuZXcgQXR0cmlidXRlSW5mbyh0eXBlLCBhY3Rpb24sIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZm8uaW5pdCh0eXBlLGFjdGlvbixuYW1lLHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluZm8gPSBuZXcgQXR0cmlidXRlSW5mbyh0eXBlLCBhY3Rpb24sIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICAvL2lmIHdlIGhhdmUgYWxyZWFkeSBkb25lIHNvbWV0aGluZyB0byB0aGlzIGF0dHJpYnV0ZSwgbWFrZSBzdXJlCisgICAgICAgIC8vd2UgZG9uJ3Qgc2VuZCBtdWx0aXBsZSBhY3Rpb25zIGFjcm9zcyB0aGUgd2lyZQorICAgICAgICBpZiAoICFyZWNvcmRBbGxBY3Rpb25zKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGFjdGlvbnMucmVtb3ZlKGluZm8pOworICAgICAgICAgICAgfSBjYXRjaCAoamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZywgd2Ugd2FudGVkIHRvIHJlbW92ZSBpdCBhbnl3YXkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL2FkZCB0aGUgYWN0aW9uCisgICAgICAgIGFjdGlvbnMuYWRkTGFzdChpbmZvKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZShEZWx0YVNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICBleGVjdXRlKHNlc3Npb24sdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGV4ZWN1dGUoRGVsdGFTZXNzaW9uIHNlc3Npb24sIGJvb2xlYW4gbm90aWZ5TGlzdGVuZXJzKSB7CisgICAgICAgIGlmICggIXRoaXMuc2Vzc2lvbklkLmVxdWFscyggc2Vzc2lvbi5nZXRJZCgpICkgKQorICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNlc3Npb24gaWQgbWlzbWF0Y2gsIG5vdCBleGVjdXRpbmcgdGhlIGRlbHRhIHJlcXVlc3QiKTsKKyAgICAgICAgc2Vzc2lvbi5hY2Nlc3MoKTsKKyAgICAgICAgZm9yICggaW50IGk9MDsgaTxhY3Rpb25zLnNpemUoKTsgaSsrICkgeworICAgICAgICAgICAgQXR0cmlidXRlSW5mbyBpbmZvID0gKEF0dHJpYnV0ZUluZm8pYWN0aW9ucy5nZXQoaSk7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbmZvLmdldFR5cGUoKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRZUEVfQVRUUklCVVRFOiB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5mby5nZXRBY3Rpb24oKSA9PSBBQ1RJT05fU0VUICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsb2cuaXNUcmFjZUVuYWJsZWQoKSApIGxvZy50cmFjZSgiU2Vzc2lvbi5zZXRBdHRyaWJ1dGUoJyIraW5mby5nZXROYW1lKCkrIicsICciK2luZm8uZ2V0VmFsdWUoKSsiJykiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKGluZm8uZ2V0TmFtZSgpLCBpbmZvLmdldFZhbHVlKCksbm90aWZ5TGlzdGVuZXJzLGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfSAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxvZy5pc1RyYWNlRW5hYmxlZCgpICkgbG9nLnRyYWNlKCJTZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZSgnIitpbmZvLmdldE5hbWUoKSsiJykiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKGluZm8uZ2V0TmFtZSgpLG5vdGlmeUxpc3RlbmVycyxmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9Ly9jYXNlCisgICAgICAgICAgICAgICAgY2FzZSBUWVBFX0lTTkVXOiB7CisgICAgICAgICAgICAgICAgaWYgKCBsb2cuaXNUcmFjZUVuYWJsZWQoKSApIGxvZy50cmFjZSgiU2Vzc2lvbi5zZXROZXcoJyIraW5mby5nZXRWYWx1ZSgpKyInKSIpOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnNldE5ldygoKEJvb2xlYW4paW5mby5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSxmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0vL2Nhc2UKKyAgICAgICAgICAgICAgICBjYXNlIFRZUEVfTUFYSU5URVJWQUw6IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBsb2cuaXNUcmFjZUVuYWJsZWQoKSApIGxvZy50cmFjZSgiU2Vzc2lvbi5zZXRNYXhJbmFjdGl2ZUludGVydmFsKCciK2luZm8uZ2V0VmFsdWUoKSsiJykiKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRNYXhJbmFjdGl2ZUludGVydmFsKCgoSW50ZWdlcilpbmZvLmdldFZhbHVlKCkpLmludFZhbHVlKCksZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9Ly9jYXNlCisgICAgICAgICAgICAgICAgY2FzZSBUWVBFX1BSSU5DSVBBTDogeworICAgICAgICAgICAgICAgICAgICBQcmluY2lwYWwgcCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5mby5nZXRBY3Rpb24oKSA9PSBBQ1RJT05fU0VUICkgeworICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphYmxlUHJpbmNpcGFsIHNwID0gKFNlcmlhbGl6YWJsZVByaW5jaXBhbClpbmZvLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwID0gKFByaW5jaXBhbClzcC5nZXRQcmluY2lwYWwoc2Vzc2lvbi5nZXRNYW5hZ2VyKCkuZ2V0Q29udGFpbmVyKCkuZ2V0UmVhbG0oKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRQcmluY2lwYWwocCxmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0vL2Nhc2UKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDogdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgYXR0cmlidXRlIGluZm8gdHlwZT0iK2luZm8pOworICAgICAgICAgICAgfS8vc3dpdGNoCisgICAgICAgIH0vL2ZvcgorICAgICAgICBzZXNzaW9uLmVuZEFjY2VzcygpOworICAgICAgICByZXNldCgpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHsKKyAgICAgICAgd2hpbGUgKCBhY3Rpb25zLnNpemUoKSA+IDAgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUluZm8gaW5mbyA9IChBdHRyaWJ1dGVJbmZvKSBhY3Rpb25zLnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICAgICAgaW5mby5yZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgYWN0aW9uUG9vbC5hZGRMYXN0KGluZm8pOworICAgICAgICAgICAgfWNhdGNoICAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHJlbW92ZSBlbGVtZW50Iix4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhY3Rpb25zLmNsZWFyKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2Vzc2lvbklkKCkgeworICAgICAgICByZXR1cm4gc2Vzc2lvbklkOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uSWQoU3RyaW5nIHNlc3Npb25JZCkgeworICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICAgICAgaWYgKCBzZXNzaW9uSWQgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oIlNlc3Npb24gSWQgaXMgbnVsbCBmb3Igc2V0U2Vzc2lvbklkIikuZmlsbEluU3RhY2tUcmFjZSgpLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGFjdGlvbnMuc2l6ZSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGFjdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgYWN0aW9uUG9vbC5jbGVhcigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVhZEV4dGVybmFsKGphdmEuaW8uT2JqZWN0SW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbixDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgLy9zZXNzaW9uSWQgLSBTdHJpbmcKKyAgICAgICAgLy9yZWNvcmRBbGwgLSBib29sZWFuCisgICAgICAgIC8vc2l6ZSAtIGludAorICAgICAgICAvL0F0dHJpYnV0ZUluZm8gLSBpbiBhbiBhcnJheQorICAgICAgICByZXNldCgpOworICAgICAgICBzZXNzaW9uSWQgPSBpbi5yZWFkVVRGKCk7CisgICAgICAgIHJlY29yZEFsbEFjdGlvbnMgPSBpbi5yZWFkQm9vbGVhbigpOworICAgICAgICBpbnQgY250ID0gaW4ucmVhZEludCgpOworICAgICAgICBpZiAoYWN0aW9ucyA9PSBudWxsKQorICAgICAgICAgICAgYWN0aW9ucyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFjdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworICAgICAgICAgICAgQXR0cmlidXRlSW5mbyBpbmZvID0gbnVsbDsKKyAgICAgICAgICAgIGlmICh0aGlzLmFjdGlvblBvb2wuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8gPSAoQXR0cmlidXRlSW5mbykgYWN0aW9uUG9vbC5yZW1vdmVGaXJzdCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApICB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHJlbW92ZSBlbGVtZW50Iix4KTsKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9IG5ldyBBdHRyaWJ1dGVJbmZvKC0xLC0xLG51bGwsbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW5mbyA9IG5ldyBBdHRyaWJ1dGVJbmZvKC0xLC0xLG51bGwsbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmZvLnJlYWRFeHRlcm5hbChpbik7CisgICAgICAgICAgICBhY3Rpb25zLmFkZExhc3QoaW5mbyk7CisgICAgICAgIH0vL2ZvcgorICAgIH0KKyAgICAgICAgCisKKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZUV4dGVybmFsKGphdmEuaW8uT2JqZWN0T3V0cHV0IG91dCApIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgLy9zZXNzaW9uSWQgLSBTdHJpbmcKKyAgICAgICAgLy9yZWNvcmRBbGwgLSBib29sZWFuCisgICAgICAgIC8vc2l6ZSAtIGludAorICAgICAgICAvL0F0dHJpYnV0ZUluZm8gLSBpbiBhbiBhcnJheQorICAgICAgICBvdXQud3JpdGVVVEYoZ2V0U2Vzc2lvbklkKCkpOworICAgICAgICBvdXQud3JpdGVCb29sZWFuKHJlY29yZEFsbEFjdGlvbnMpOworICAgICAgICBvdXQud3JpdGVJbnQoZ2V0U2l6ZSgpKTsKKyAgICAgICAgZm9yICggaW50IGk9MDsgaTxnZXRTaXplKCk7IGkrKyApIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZUluZm8gaW5mbyA9IChBdHRyaWJ1dGVJbmZvKWFjdGlvbnMuZ2V0KGkpOworICAgICAgICAgICAgaW5mby53cml0ZUV4dGVybmFsKG91dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogc2VyaWFsaXplIERlbHRhUmVxdWVzdAorICAgICAqIEBzZWUgRGVsdGFSZXF1ZXN0I3dyaXRlRXh0ZXJuYWwoamF2YS5pby5PYmplY3RPdXRwdXQpCisgICAgICogCisgICAgICogQHBhcmFtIGRlbHRhUmVxdWVzdAorICAgICAqIEByZXR1cm4gc2VyaWFsaXplZCBkZWx0YSByZXF1ZXN0CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBieXRlW10gc2VyaWFsaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYm9zKTsKKyAgICAgICAgd3JpdGVFeHRlcm5hbChvb3MpOworICAgICAgICBvb3MuZmx1c2goKTsKKyAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgIHJldHVybiBib3MudG9CeXRlQXJyYXkoKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXR0cmlidXRlSW5mbyBpbXBsZW1lbnRzIGphdmEuaW8uRXh0ZXJuYWxpemFibGUgeworICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgdmFsdWUgPSBudWxsOworICAgICAgICBwcml2YXRlIGludCBhY3Rpb247CisgICAgICAgIHByaXZhdGUgaW50IHR5cGU7CisKKyAgICAgICAgcHVibGljIEF0dHJpYnV0ZUluZm8oKSB7fQorCisgICAgICAgIHB1YmxpYyBBdHRyaWJ1dGVJbmZvKGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgaW5pdCh0eXBlLGFjdGlvbixuYW1lLHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGluaXQoaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QWN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGFjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAgICAgICAgIG5hbWUgPSBudWxsOworICAgICAgICAgICAgdmFsdWUgPSBudWxsOworICAgICAgICAgICAgdHlwZT0tMTsKKyAgICAgICAgICAgIGFjdGlvbj0tMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKCAhIChvIGluc3RhbmNlb2YgQXR0cmlidXRlSW5mbyApICkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgQXR0cmlidXRlSW5mbyBvdGhlciA9ICAoQXR0cmlidXRlSW5mbylvOworICAgICAgICAgICAgcmV0dXJuIG90aGVyLmdldE5hbWUoKS5lcXVhbHModGhpcy5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVhZEV4dGVybmFsKGphdmEuaW8uT2JqZWN0SW5wdXQgaW4gKSB0aHJvd3MgSU9FeGNlcHRpb24sQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvL3R5cGUgLSBpbnQKKyAgICAgICAgICAgIC8vYWN0aW9uIC0gaW50CisgICAgICAgICAgICAvL25hbWUgLSBTdHJpbmcKKyAgICAgICAgICAgIC8vaGFzdmFsdWUgLSBib29sZWFuCisgICAgICAgICAgICAvL3ZhbHVlIC0gb2JqZWN0CisgICAgICAgICAgICB0eXBlID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgYWN0aW9uID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgbmFtZSA9IGluLnJlYWRVVEYoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzVmFsdWUgPSBpbi5yZWFkQm9vbGVhbigpOworICAgICAgICAgICAgaWYgKCBoYXNWYWx1ZSApIHZhbHVlID0gaW4ucmVhZE9iamVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlRXh0ZXJuYWwoamF2YS5pby5PYmplY3RPdXRwdXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgLy90eXBlIC0gaW50CisgICAgICAgICAgICAvL2FjdGlvbiAtIGludAorICAgICAgICAgICAgLy9uYW1lIC0gU3RyaW5nCisgICAgICAgICAgICAvL2hhc3ZhbHVlIC0gYm9vbGVhbgorICAgICAgICAgICAgLy92YWx1ZSAtIG9iamVjdAorICAgICAgICAgICAgb3V0LndyaXRlSW50KGdldFR5cGUoKSk7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQoZ2V0QWN0aW9uKCkpOworICAgICAgICAgICAgb3V0LndyaXRlVVRGKGdldE5hbWUoKSk7CisgICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKGdldFZhbHVlKCkhPW51bGwpOworICAgICAgICAgICAgaWYgKGdldFZhbHVlKCkhPW51bGwpIG91dC53cml0ZU9iamVjdChnZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJBdHRyaWJ1dGVJbmZvW3R5cGU9Iik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGdldFR5cGUoKSkuYXBwZW5kKCIsIGFjdGlvbj0iKS5hcHBlbmQoZ2V0QWN0aW9uKCkpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCBuYW1lPSIpLmFwcGVuZChnZXROYW1lKCkpLmFwcGVuZCgiLCB2YWx1ZT0iKS5hcHBlbmQoZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIsIGFkZHI9IikuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpLmFwcGVuZCgiXSIpOworICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vRGVsdGFTZXNzaW9uLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL0RlbHRhU2Vzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMzBmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL0RlbHRhU2Vzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNzUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5zZXNzaW9uOworCitpbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXQ7CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXQ7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Mb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkNvbnRleHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uR2VuZXJpY1ByaW5jaXBhbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uU3RhbmRhcmRTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmlvLlJlcGxpY2F0aW9uU3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRpcGlzLlJlcGxpY2F0ZWRNYXBFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuRW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uU3RhbmRhcmRNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5NYW5hZ2VyQmFzZTsKKworLyoqCisgKgorICogU2ltaWxhciB0byB0aGUgU3RhbmRhcmRTZXNzaW9uIGV4Y2VwdCB0aGF0IHRoaXMgc2Vzc2lvbiB3aWxsIGtlZXAKKyAqIHRyYWNrIG9mIGRlbHRhcyBkdXJpbmcgYSByZXF1ZXN0LgorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlbHRhU2Vzc2lvbiBleHRlbmRzIFN0YW5kYXJkU2Vzc2lvbiBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlLENsdXN0ZXJTZXNzaW9uLFJlcGxpY2F0ZWRNYXBFbnRyeSB7CisKKyAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyhEZWx0YVNlc3Npb24uY2xhc3MpOworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0gU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogb25seSB0aGUgcHJpbWFyeSBzZXNzaW9uIHdpbGwgZXhwaXJlLCBvciBiZSBhYmxlIHRvIGV4cGlyZSBkdWUgdG8KKyAgICAgKiBpbmFjdGl2aXR5LiBUaGlzIGlzIHNldCB0byBmYWxzZSBhcyBzb29uIGFzIEkgcmVjZWl2ZSB0aGlzIHNlc3Npb24gb3ZlcgorICAgICAqIHRoZSB3aXJlIGluIGEgc2Vzc2lvbiBtZXNzYWdlLiBUaGF0IG1lYW5zIHRoYXQgc29tZW9uZSBlbHNlIGhhcyBtYWRlIGEKKyAgICAgKiByZXF1ZXN0IG9uIGFub3RoZXIgc2VydmVyLgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gaXNQcmltYXJ5U2Vzc2lvbiA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVsdGEgcmVxdWVzdCBjb250YWlucyBhbGwgdGhlIGFjdGlvbiBpbmZvCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBEZWx0YVJlcXVlc3QgZGVsdGFSZXF1ZXN0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIExhc3QgdGltZSB0aGUgc2Vzc2lvbiB3YXMgcmVwbGljYXRkLCB1c2VkIGZvciBkaXN0cmlidXRlZCBleHBpcmluZyBvZgorICAgICAqIHNlc3Npb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBsb25nIGxhc3RUaW1lUmVwbGljYXRlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisKKyAgICBwcm90ZWN0ZWQgTG9jayBkaWZmTG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCkud3JpdGVMb2NrKCk7CisKKyAgICBwcml2YXRlIGxvbmcgdmVyc2lvbjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyCisgICAgICogICAgICAgICAgICBUaGUgbWFuYWdlciB3aXRoIHdoaWNoIHRoaXMgU2Vzc2lvbiBpcyBhc3NvY2lhdGVkCisgICAgICovCisgICAgcHVibGljIERlbHRhU2Vzc2lvbigpIHsKKyAgICAgICAgdGhpcyhudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGVsdGFTZXNzaW9uKE1hbmFnZXIgbWFuYWdlcikgeworICAgICAgICBzdXBlcihtYW5hZ2VyKTsKKyAgICAgICAgdGhpcy5yZXNldERlbHRhUmVxdWVzdCgpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlcGxpY2F0ZWRNYXBFbnRyeQorCisgICAgLyoqCisgICAgICAgICAqIEhhcyB0aGUgb2JqZWN0IGNoYW5nZWQgc2luY2UgbGFzdCByZXBsaWNhdGlvbgorICAgICAgICAgKiBhbmQgaXMgbm90IGluIGEgbG9ja2VkIHN0YXRlCisgICAgICAgICAqIEByZXR1cm4gYm9vbGVhbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXREZWx0YVJlcXVlc3QoKS5nZXRTaXplKCk+MDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgdGhlIG1hcCB3aWxsIGV4dHJhY3QgdGhlIGRpZmYgdXNpbmcgZ2V0RGlmZigpCisgICAgICAgICAqIE90aGVyd2lzZSBpdCB3aWxsIHNlcmlhbGl6ZSB0aGUgZW50aXJlIG9iamVjdC4KKyAgICAgICAgICogQHJldHVybiBib29sZWFuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RpZmZhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIGRpZmYgYW5kIHNldHMgdGhlIGRpcnR5IG1hcCB0byBmYWxzZQorICAgICAgICAgKiBAcmV0dXJuIGJ5dGVbXQorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldERpZmYoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGdldERlbHRhUmVxdWVzdCgpLnNlcmlhbGl6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzTG9hZGVyW10gZ2V0Q2xhc3NMb2FkZXJzKCkgeworICAgICAgICAgICAgaWYgKCBtYW5hZ2VyIGluc3RhbmNlb2YgQmFja3VwTWFuYWdlciApIHJldHVybiAoKEJhY2t1cE1hbmFnZXIpbWFuYWdlcikuZ2V0Q2xhc3NMb2FkZXJzKCk7CisgICAgICAgICAgICBlbHNlIGlmICggbWFuYWdlciBpbnN0YW5jZW9mIENsdXN0ZXJNYW5hZ2VyQmFzZSApIHJldHVybiAoKENsdXN0ZXJNYW5hZ2VyQmFzZSltYW5hZ2VyKS5nZXRDbGFzc0xvYWRlcnMoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBtYW5hZ2VyIGluc3RhbmNlb2YgU3RhbmRhcmRNYW5hZ2VyICkgeworICAgICAgICAgICAgICAgIFN0YW5kYXJkTWFuYWdlciBzbSA9IChTdGFuZGFyZE1hbmFnZXIpbWFuYWdlcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2x1c3Rlck1hbmFnZXJCYXNlLmdldENsYXNzTG9hZGVycyhzbS5nZXRDb250YWluZXIoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBtYW5hZ2VyIGluc3RhbmNlb2YgTWFuYWdlckJhc2UgKSB7CisgICAgICAgICAgICAgICAgTWFuYWdlckJhc2UgbWIgPSAoTWFuYWdlckJhc2UpbWFuYWdlcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2x1c3Rlck1hbmFnZXJCYXNlLmdldENsYXNzTG9hZGVycyhtYi5nZXRDb250YWluZXIoKSk7CisgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFwcGxpZXMgYSBkaWZmIHRvIGFuIGV4aXN0aW5nIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIGRpZmYgYnl0ZVtdCisgICAgICAgICAqIEBwYXJhbSBvZmZzZXQgaW50CisgICAgICAgICAqIEBwYXJhbSBsZW5ndGggaW50CisgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5RGlmZihieXRlW10gZGlmZiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFJlcGxpY2F0aW9uU3RyZWFtIHN0cmVhbSA9ICgoQ2x1c3Rlck1hbmFnZXIpZ2V0TWFuYWdlcigpKS5nZXRSZXBsaWNhdGlvblN0cmVhbShkaWZmLG9mZnNldCxsZW5ndGgpOworICAgICAgICAgICAgZ2V0RGVsdGFSZXF1ZXN0KCkucmVhZEV4dGVybmFsKHN0cmVhbSk7CisgICAgICAgICAgICBDbGFzc0xvYWRlciBjb250ZXh0TG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXJbXSBsb2FkZXJzID0gZ2V0Q2xhc3NMb2FkZXJzKCk7CisgICAgICAgICAgICAgICAgaWYgKCBsb2FkZXJzICE9IG51bGwgJiYgbG9hZGVycy5sZW5ndGggPjAgKSBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihsb2FkZXJzWzBdKTsKKyAgICAgICAgICAgICAgICBnZXREZWx0YVJlcXVlc3QoKS5leGVjdXRlKHRoaXMpOworICAgICAgICAgICAgfWZpbmFsbHkgeworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNvbnRleHRMb2FkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc2V0cyB0aGUgY3VycmVudCBkaWZmIHN0YXRlIGFuZCByZXNldHMgdGhlIGRpcnR5IGZsYWcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0RGlmZigpIHsKKyAgICAgICAgICAgIHJlc2V0RGVsdGFSZXF1ZXN0KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTG9jayBkdXJpbmcgc2VyaWFsaXphdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgbG9jaygpIHsKKyAgICAgICAgICAgIGRpZmZMb2NrLmxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVbmxvY2sgYWZ0ZXIgc2VyaWFsaXphdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdW5sb2NrKCkgeworICAgICAgICAgICAgZGlmZkxvY2sudW5sb2NrKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRPd25lcihPYmplY3Qgb3duZXIpIHsKKyAgICAgICAgICAgIGlmICggb3duZXIgaW5zdGFuY2VvZiBDbHVzdGVyTWFuYWdlciAmJiBnZXRNYW5hZ2VyKCk9PW51bGwpIHsKKyAgICAgICAgICAgICAgICBDbHVzdGVyTWFuYWdlciBjbSA9IChDbHVzdGVyTWFuYWdlcilvd25lcjsKKyAgICAgICAgICAgICAgICB0aGlzLnNldE1hbmFnZXIoY20pOworICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsaWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgdGhpcy5zZXRQcmltYXJ5U2Vzc2lvbihmYWxzZSk7CisgICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3MoKTsKKyAgICAgICAgICAgICAgICBpZiAoY20uaXNOb3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uKCkpIHRoaXMuc2V0SWQoZ2V0SWRJbnRlcm5hbCgpKTsKKyAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RGVsdGFSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgdGhpcy5lbmRBY2Nlc3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlc3Npb24gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogcmV0dXJucyB0cnVlIGlmIHRoaXMgc2Vzc2lvbiBpcyB0aGUgcHJpbWFyeSBzZXNzaW9uLCBpZiB0aGF0IGlzIHRoZSBjYXNlLAorICAgICAqIHRoZSBtYW5hZ2VyIGNhbiBleHBpcmUgaXQgdXBvbiB0aW1lb3V0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeVNlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBpc1ByaW1hcnlTZXNzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGlzIGlzIHRoZSBwcmltYXJ5IHNlc3Npb24gb3Igbm90LgorICAgICAqCisgICAgICogQHBhcmFtIHByaW1hcnlTZXNzaW9uCisgICAgICogICAgICAgICAgICBGbGFnIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeVNlc3Npb24oYm9vbGVhbiBwcmltYXJ5U2Vzc2lvbikgeworICAgICAgICB0aGlzLmlzUHJpbWFyeVNlc3Npb24gPSBwcmltYXJ5U2Vzc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlc3Npb24gaWRlbnRpZmllciBmb3IgdGhpcyBzZXNzaW9uIHdpdGhvdXQgbm90aWZ5IGxpc3RlbmVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZAorICAgICAqICAgICAgICAgICAgVGhlIG5ldyBzZXNzaW9uIGlkZW50aWZpZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZEludGVybmFsKFN0cmluZyBpZCkgeworICAgICAgICBzdXBlci5zZXRJZChpZCk7CisgICAgICAgIHJlc2V0RGVsdGFSZXF1ZXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZXNzaW9uIGlkZW50aWZpZXIgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZAorICAgICAqICAgICAgICAgICAgVGhlIG5ldyBzZXNzaW9uIGlkZW50aWZpZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKyAgICAgICAgc2V0SWRJbnRlcm5hbChpZCk7CisgICAgfQorCisgICAKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGFzdCBjbGllbnQgYWNjZXNzIHRpbWUgd2l0aG91dCBpbnZhbGlkYXRpb24gY2hlY2sKKyAgICAgKiBAc2VlICNnZXRMYXN0QWNjZXNzZWRUaW1lKCkuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TGFzdEFjY2Vzc2VkVGltZUludGVybmFsKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubGFzdEFjY2Vzc2VkVGltZSk7CisgICAgfQorCisKKyAgIAorICAgIHB1YmxpYyB2b2lkIHNldE1heEluYWN0aXZlSW50ZXJ2YWwoaW50IGludGVydmFsLCBib29sZWFuIGFkZERlbHRhUmVxdWVzdCkgeworICAgICAgICBzdXBlci5tYXhJbmFjdGl2ZUludGVydmFsID0gaW50ZXJ2YWw7CisgICAgICAgIGlmIChpc1ZhbGlkICYmIGludGVydmFsID09IDApIHsKKyAgICAgICAgICAgIGV4cGlyZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGFkZERlbHRhUmVxdWVzdCAmJiAoZGVsdGFSZXF1ZXN0ICE9IG51bGwpKQorICAgICAgICAgICAgICAgIGRlbHRhUmVxdWVzdC5zZXRNYXhJbmFjdGl2ZUludGVydmFsKGludGVydmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+aXNOZXc8L2NvZGU+IGZsYWcgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpc05ldworICAgICAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIDxjb2RlPmlzTmV3PC9jb2RlPiBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmV3KGJvb2xlYW4gaXNOZXcpIHsKKyAgICAgICAgc2V0TmV3KGlzTmV3LCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROZXcoYm9vbGVhbiBpc05ldywgYm9vbGVhbiBhZGREZWx0YVJlcXVlc3QpIHsKKyAgICAgICAgc3VwZXIuc2V0TmV3KGlzTmV3KTsKKyAgICAgICAgaWYgKGFkZERlbHRhUmVxdWVzdCAmJiAoZGVsdGFSZXF1ZXN0ICE9IG51bGwpKQorICAgICAgICAgICAgZGVsdGFSZXF1ZXN0LnNldE5ldyhpc05ldyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNlc3Npb24uCisgICAgICogVGhpcyBwcm92aWRlcyBhbiA8Y29kZT5BdXRoZW50aWNhdG9yPC9jb2RlPiB3aXRoIGEgbWVhbnMgdG8gY2FjaGUgYQorICAgICAqIHByZXZpb3VzbHkgYXV0aGVudGljYXRlZCBQcmluY2lwYWwsIGFuZCBhdm9pZCBwb3RlbnRpYWxseSBleHBlbnNpdmUKKyAgICAgKiA8Y29kZT5SZWFsbS5hdXRoZW50aWNhdGUoKTwvY29kZT4gY2FsbHMgb24gZXZlcnkgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmluY2lwYWwKKyAgICAgKiAgICAgICAgICAgIFRoZSBuZXcgUHJpbmNpcGFsLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbmNpcGFsKFByaW5jaXBhbCBwcmluY2lwYWwpIHsKKyAgICAgICAgc2V0UHJpbmNpcGFsKHByaW5jaXBhbCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJpbmNpcGFsKFByaW5jaXBhbCBwcmluY2lwYWwsIGJvb2xlYW4gYWRkRGVsdGFSZXF1ZXN0KSB7CisgICAgICAgIHRyeSB7IAorICAgICAgICAgICAgbG9jaygpOworICAgICAgICAgICAgc3VwZXIuc2V0UHJpbmNpcGFsKHByaW5jaXBhbCk7CisgICAgICAgICAgICBpZiAoYWRkRGVsdGFSZXF1ZXN0ICYmIChkZWx0YVJlcXVlc3QgIT0gbnVsbCkpCisgICAgICAgICAgICAgICAgZGVsdGFSZXF1ZXN0LnNldFByaW5jaXBhbChwcmluY2lwYWwpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPmlzVmFsaWQ8L2NvZGU+IGZsYWcgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgeworICAgICAgICBpZiAodGhpcy5leHBpcmluZykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWNjZXNzQ291bnQgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF4SW5hY3RpdmVJbnRlcnZhbCA+PSAwKSB7CisgICAgICAgICAgICBsb25nIHRpbWVOb3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGludCB0aW1lSWRsZSA9IChpbnQpICggKHRpbWVOb3cgLSB0aGlzQWNjZXNzZWRUaW1lKSAvIDEwMDBMKTsKKyAgICAgICAgICAgIGlmIChpc1ByaW1hcnlTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodGltZUlkbGUgPj0gbWF4SW5hY3RpdmVJbnRlcnZhbCkgeworICAgICAgICAgICAgICAgICAgICBleHBpcmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodGltZUlkbGUgPj0gKDIgKiBtYXhJbmFjdGl2ZUludGVydmFsKSkgeworICAgICAgICAgICAgICAgICAgICAvL2lmIHRoZSBzZXNzaW9uIGhhcyBiZWVuIGlkbGUgdHdpY2UgYXMgbG9uZyBhcyBhbGxvd2VkLAorICAgICAgICAgICAgICAgICAgICAvL3RoZSBwcmltYXJ5IHNlc3Npb24gaGFzIHByb2JhYmx5IGNyYXNoZWQsIGFuZCBubyBvdGhlcgorICAgICAgICAgICAgICAgICAgICAvL3JlcXVlc3RzIGFyZSBjb21pbmcgaW4uIHRoYXQgaXMgd2h5IHdlIGRvIHRoaXMuIG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICAvL3dlIHdvdWxkIGhhdmUgYSBtZW1vcnkgbGVhaworICAgICAgICAgICAgICAgICAgICBleHBpcmUodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHRoaXMuaXNWYWxpZCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXNzaW9uIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHRoZSBpbnRlcm5hbCBwcm9jZXNzaW5nIHJlcXVpcmVkIHRvIGludmFsaWRhdGUgdGhpcyBzZXNzaW9uLAorICAgICAqIHdpdGhvdXQgdHJpZ2dlcmluZyBhbiBleGNlcHRpb24gaWYgdGhlIHNlc3Npb24gaGFzIGFscmVhZHkgZXhwaXJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBub3RpZnkKKyAgICAgKiAgICAgICAgICAgIFNob3VsZCB3ZSBub3RpZnkgbGlzdGVuZXJzIGFib3V0IHRoZSBkZW1pc2Ugb2YgdGhpcyBzZXNzaW9uPworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cGlyZShib29sZWFuIG5vdGlmeSkgeworICAgICAgICBleHBpcmUobm90aWZ5LCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBleHBpcmUoYm9vbGVhbiBub3RpZnksIGJvb2xlYW4gbm90aWZ5Q2x1c3RlcikgeworICAgICAgICBTdHJpbmcgZXhwaXJlZElkID0gZ2V0SWRJbnRlcm5hbCgpOworICAgICAgICBzdXBlci5leHBpcmUobm90aWZ5KTsKKworICAgICAgICBpZiAobm90aWZ5Q2x1c3RlcikgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImRlbHRhU2Vzc2lvbi5ub3RpZnlpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEZWx0YU1hbmFnZXIpbWFuYWdlcikuZ2V0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKGlzUHJpbWFyeVNlc3Npb24oKSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlZElkKSk7CisgICAgICAgICAgICBpZiAoIG1hbmFnZXIgaW5zdGFuY2VvZiBEZWx0YU1hbmFnZXIgKSB7CisgICAgICAgICAgICAgICAgKCAoRGVsdGFNYW5hZ2VyKSBtYW5hZ2VyKS5zZXNzaW9uRXhwaXJlZChleHBpcmVkSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsZWFzZSBhbGwgb2JqZWN0IHJlZmVyZW5jZXMsIGFuZCBpbml0aWFsaXplIGluc3RhbmNlIHZhcmlhYmxlcywgaW4KKyAgICAgKiBwcmVwYXJhdGlvbiBmb3IgcmV1c2Ugb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAgICAgc3VwZXIucmVjeWNsZSgpOworICAgICAgICBkZWx0YVJlcXVlc3QuY2xlYXIoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgiRGVsdGFTZXNzaW9uWyIpOworICAgICAgICBzYi5hcHBlbmQoaWQpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2Vzc2lvbiBQYWNrYWdlIE1ldGhvZHMKKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbixDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgcmVhZE9iamVjdERhdGEoaW4pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVhZCBhIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgY29udGVudHMgb2YgdGhpcyBzZXNzaW9uIG9iamVjdCBmcm9tIHRoZQorICAgICAqIHNwZWNpZmllZCBvYmplY3QgaW5wdXQgc3RyZWFtLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IHRoZSBTdGFuZGFyZFNlc3Npb24KKyAgICAgKiBpdHNlbGYgaGF2ZSBiZWVuIHNlcmlhbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtCisgICAgICogICAgICAgICAgICBUaGUgb2JqZWN0IGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIHVua25vd24gY2xhc3MgaXMgc3BlY2lmaWVkCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFkT2JqZWN0RGF0YShPYmplY3RJbnB1dCBzdHJlYW0pIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJlYWRPYmplY3Qoc3RyZWFtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgY29udGVudHMgb2YgdGhpcyBzZXNzaW9uIG9iamVjdCB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgb2JqZWN0IG91dHB1dCBzdHJlYW0sIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgdGhlCisgICAgICogU3RhbmRhcmRTZXNzaW9uIGl0c2VsZiBoYXZlIGJlZW4gc2VyaWFsaXplZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgIFRoZSBvYmplY3Qgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0bworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZU9iamVjdERhdGEoT2JqZWN0T3V0cHV0IHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVPYmplY3Qoc3RyZWFtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldERlbHRhUmVxdWVzdCgpIHsKKyAgICAgICAgaWYgKGRlbHRhUmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBkZWx0YVJlcXVlc3QgPSBuZXcgRGVsdGFSZXF1ZXN0KGdldElkSW50ZXJuYWwoKSwgZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVsdGFSZXF1ZXN0LnJlc2V0KCk7CisgICAgICAgICAgICBkZWx0YVJlcXVlc3Quc2V0U2Vzc2lvbklkKGdldElkSW50ZXJuYWwoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRGVsdGFSZXF1ZXN0IGdldERlbHRhUmVxdWVzdCgpIHsKKyAgICAgICAgaWYgKGRlbHRhUmVxdWVzdCA9PSBudWxsKSByZXNldERlbHRhUmVxdWVzdCgpOworICAgICAgICByZXR1cm4gZGVsdGFSZXF1ZXN0OworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSHR0cFNlc3Npb24gUHJvcGVydGllcworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUh0dHBTZXNzaW9uIFB1YmxpYyBNZXRob2RzCisKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBvYmplY3QgYm91bmQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgZnJvbSB0aGlzIHNlc3Npb24uIElmIHRoZQorICAgICAqIHNlc3Npb24gZG9lcyBub3QgaGF2ZSBhbiBvYmplY3QgYm91bmQgd2l0aCB0aGlzIG5hbWUsIHRoaXMgbWV0aG9kIGRvZXMKKyAgICAgKiBub3RoaW5nLgorICAgICAqIDxwPgorICAgICAqIEFmdGVyIHRoaXMgbWV0aG9kIGV4ZWN1dGVzLCBhbmQgaWYgdGhlIG9iamVjdCBpbXBsZW1lbnRzCisgICAgICogPGNvZGU+SHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI8L2NvZGU+LCB0aGUgY29udGFpbmVyIGNhbGxzCisgICAgICogPGNvZGU+dmFsdWVVbmJvdW5kKCk8L2NvZGU+IG9uIHRoZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgTmFtZSBvZiB0aGUgb2JqZWN0IHRvIHJlbW92ZSBmcm9tIHRoaXMgc2Vzc2lvbi4KKyAgICAgKiBAcGFyYW0gbm90aWZ5CisgICAgICogICAgICAgICAgICBTaG91bGQgd2Ugbm90aWZ5IGludGVyZXN0ZWQgbGlzdGVuZXJzIHRoYXQgdGhpcyBhdHRyaWJ1dGUgaXMKKyAgICAgKiAgICAgICAgICAgIGJlaW5nIHJlbW92ZWQ/CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbiBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lLCBib29sZWFuIG5vdGlmeSkgeworICAgICAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSwgbm90aWZ5LCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gbm90aWZ5LGJvb2xlYW4gYWRkRGVsdGFSZXF1ZXN0KSB7CisgICAgICAgIC8vIFZhbGlkYXRlIG91ciBjdXJyZW50IHN0YXRlCisgICAgICAgIGlmICghaXNWYWxpZCgpKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZS5pc2UiKSk7CisgICAgICAgIHJlbW92ZUF0dHJpYnV0ZUludGVybmFsKG5hbWUsIG5vdGlmeSwgYWRkRGVsdGFSZXF1ZXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIG9iamVjdCB0byB0aGlzIHNlc3Npb24sIHVzaW5nIHRoZSBzcGVjaWZpZWQgbmFtZS4gSWYgYW4gb2JqZWN0IG9mCisgICAgICogdGhlIHNhbWUgbmFtZSBpcyBhbHJlYWR5IGJvdW5kIHRvIHRoaXMgc2Vzc2lvbiwgdGhlIG9iamVjdCBpcyByZXBsYWNlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBBZnRlciB0aGlzIG1ldGhvZCBleGVjdXRlcywgYW5kIGlmIHRoZSBvYmplY3QgaW1wbGVtZW50cworICAgICAqIDxjb2RlPkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyPC9jb2RlPiwgdGhlIGNvbnRhaW5lciBjYWxscworICAgICAqIDxjb2RlPnZhbHVlQm91bmQoKTwvY29kZT4gb24gdGhlIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICBOYW1lIHRvIHdoaWNoIHRoZSBvYmplY3QgaXMgYm91bmQsIGNhbm5vdCBiZSBudWxsCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICBPYmplY3QgdG8gYmUgYm91bmQsIGNhbm5vdCBiZSBudWxsCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhZGQgYSBub24tc2VyaWFsaXphYmxlIG9iamVjdCBpbgorICAgICAqICAgICAgICAgICAgICAgIGFuIGVudmlyb25tZW50IG1hcmtlZCBkaXN0cmlidXRhYmxlLgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIG5vdGlmeSxib29sZWFuIGFkZERlbHRhUmVxdWVzdCkgeworCisgICAgICAgIC8vIE5hbWUgY2Fubm90IGJlIG51bGwKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5zZXRBdHRyaWJ1dGUubmFtZW51bGwiKSk7CisKKyAgICAgICAgLy8gTnVsbCB2YWx1ZSBpcyB0aGUgc2FtZSBhcyByZW1vdmVBdHRyaWJ1dGUoKQorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgIHN1cGVyLnNldEF0dHJpYnV0ZShuYW1lLHZhbHVlLCBub3RpZnkpOworICAgICAgICAgICAgaWYgKGFkZERlbHRhUmVxdWVzdCAmJiAoZGVsdGFSZXF1ZXN0ICE9IG51bGwpKSBkZWx0YVJlcXVlc3Quc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSHR0cFNlc3Npb24gUHJpdmF0ZSBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgc2VyaWFsaXplZCB2ZXJzaW9uIG9mIHRoaXMgc2Vzc2lvbiBvYmplY3QgZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogb2JqZWN0IGlucHV0IHN0cmVhbS4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFIDwvYj46IFRoZSByZWZlcmVuY2UgdG8gdGhlIG93bmluZyBNYW5hZ2VyIGlzIG5vdAorICAgICAqIHJlc3RvcmVkIGJ5IHRoaXMgbWV0aG9kLCBhbmQgbXVzdCBiZSBzZXQgZXhwbGljaXRseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgIFRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiB1bmtub3duIGNsYXNzIGlzIHNwZWNpZmllZAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXQgc3RyZWFtKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIERlc2VyaWFsaXplIHRoZSBzY2FsYXIgaW5zdGFuY2UgdmFyaWFibGVzIChleGNlcHQgTWFuYWdlcikKKyAgICAgICAgYXV0aFR5cGUgPSBudWxsOyAvLyBUcmFuc2llbnQgb25seQorICAgICAgICBjcmVhdGlvblRpbWUgPSAoIChMb25nKSBzdHJlYW0ucmVhZE9iamVjdCgpKS5sb25nVmFsdWUoKTsKKyAgICAgICAgbGFzdEFjY2Vzc2VkVGltZSA9ICggKExvbmcpIHN0cmVhbS5yZWFkT2JqZWN0KCkpLmxvbmdWYWx1ZSgpOworICAgICAgICBtYXhJbmFjdGl2ZUludGVydmFsID0gKCAoSW50ZWdlcikgc3RyZWFtLnJlYWRPYmplY3QoKSkuaW50VmFsdWUoKTsKKyAgICAgICAgaXNOZXcgPSAoIChCb29sZWFuKSBzdHJlYW0ucmVhZE9iamVjdCgpKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgaXNWYWxpZCA9ICggKEJvb2xlYW4pIHN0cmVhbS5yZWFkT2JqZWN0KCkpLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICB0aGlzQWNjZXNzZWRUaW1lID0gKCAoTG9uZykgc3RyZWFtLnJlYWRPYmplY3QoKSkubG9uZ1ZhbHVlKCk7CisgICAgICAgIHZlcnNpb24gPSAoIChMb25nKSBzdHJlYW0ucmVhZE9iamVjdCgpKS5sb25nVmFsdWUoKTsKKyAgICAgICAgYm9vbGVhbiBoYXNQcmluY2lwYWwgPSBzdHJlYW0ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgcHJpbmNpcGFsID0gbnVsbDsKKyAgICAgICAgaWYgKGhhc1ByaW5jaXBhbCkgeworICAgICAgICAgICAgcHJpbmNpcGFsID0gU2VyaWFsaXphYmxlUHJpbmNpcGFsLnJlYWRQcmluY2lwYWwoc3RyZWFtLGdldE1hbmFnZXIoKS5nZXRDb250YWluZXIoKS5nZXRSZWFsbSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICAgICAgICBzZXRJZCgoU3RyaW5nKSBzdHJlYW0ucmVhZE9iamVjdCgpKTsKKyAgICAgICAgaWQgPSAoU3RyaW5nKSBzdHJlYW0ucmVhZE9iamVjdCgpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImRlbHRhU2Vzc2lvbi5yZWFkU2Vzc2lvbiIsIGlkKSk7CisKKyAgICAgICAgLy8gRGVzZXJpYWxpemUgdGhlIGF0dHJpYnV0ZSBjb3VudCBhbmQgYXR0cmlidXRlIHZhbHVlcworICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSBhdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBpbnQgbiA9ICggKEludGVnZXIpIHN0cmVhbS5yZWFkT2JqZWN0KCkpLmludFZhbHVlKCk7CisgICAgICAgIGJvb2xlYW4gaXNWYWxpZFNhdmUgPSBpc1ZhbGlkOworICAgICAgICBpc1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgc3RyZWFtLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IChPYmplY3QpIHN0cmVhbS5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBpZiAoICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgJiYgKHZhbHVlLmVxdWFscyhOT1RfU0VSSUFMSVpFRCkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlzVmFsaWQgPSBpc1ZhbGlkU2F2ZTsKKworICAgICAgICBpZiAobGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChub3RlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBub3RlcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvdXQgKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlT2JqZWN0KG91dCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGlzIHNlc3Npb24gb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0CisgICAgICogb3V0cHV0IHN0cmVhbS4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFIDwvYj46IFRoZSBvd25pbmcgTWFuYWdlciB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gdGhlCisgICAgICogc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFNlc3Npb24uIEFmdGVyIGNhbGxpbmcKKyAgICAgKiA8Y29kZT5yZWFkT2JqZWN0KCk8L2NvZGU+LCB5b3UgbXVzdCBzZXQgdGhlIGFzc29jaWF0ZWQgTWFuYWdlcgorICAgICAqIGV4cGxpY2l0bHkuCisgICAgICogPHA+CisgICAgICogPGI+SU1QTEVNRU5UQVRJT04gTk9URSA8L2I+OiBBbnkgYXR0cmlidXRlIHRoYXQgaXMgbm90IFNlcmlhbGl6YWJsZSB3aWxsCisgICAgICogYmUgdW5ib3VuZCBmcm9tIHRoZSBzZXNzaW9uLCB3aXRoIGFwcHJvcHJpYXRlIGFjdGlvbnMgaWYgaXQgaW1wbGVtZW50cworICAgICAqIEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyLiBJZiB5b3UgZG8gbm90IHdhbnQgYW55IHN1Y2ggYXR0cmlidXRlcywgYmUKKyAgICAgKiBzdXJlIHRoZSA8Y29kZT5kaXN0cmlidXRhYmxlPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGUgYXNzb2NpYXRlZCBNYW5hZ2VyCisgICAgICogaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmVhbQorICAgICAqICAgICAgICAgICAgVGhlIG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgdG8KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dCBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gV3JpdGUgdGhlIHNjYWxhciBpbnN0YW5jZSB2YXJpYWJsZXMgKGV4Y2VwdCBNYW5hZ2VyKQorICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QobmV3IExvbmcoY3JlYXRpb25UaW1lKSk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChuZXcgTG9uZyhsYXN0QWNjZXNzZWRUaW1lKSk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChuZXcgSW50ZWdlcihtYXhJbmFjdGl2ZUludGVydmFsKSk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChuZXcgQm9vbGVhbihpc05ldykpOworICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QobmV3IEJvb2xlYW4oaXNWYWxpZCkpOworICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QobmV3IExvbmcodGhpc0FjY2Vzc2VkVGltZSkpOworICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QobmV3IExvbmcodmVyc2lvbikpOworICAgICAgICBzdHJlYW0ud3JpdGVCb29sZWFuKGdldFByaW5jaXBhbCgpICE9IG51bGwpOworICAgICAgICBpZiAoZ2V0UHJpbmNpcGFsKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgU2VyaWFsaXphYmxlUHJpbmNpcGFsLndyaXRlUHJpbmNpcGFsKChHZW5lcmljUHJpbmNpcGFsKSBwcmluY2lwYWwsc3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChpZCk7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiZGVsdGFTZXNzaW9uLndyaXRlU2Vzc2lvbiIsIGlkKSk7CisKKyAgICAgICAgLy8gQWNjdW11bGF0ZSB0aGUgbmFtZXMgb2Ygc2VyaWFsaXphYmxlIGFuZCBub24tc2VyaWFsaXphYmxlIGF0dHJpYnV0ZXMKKyAgICAgICAgU3RyaW5nIGtleXNbXSA9IGtleXMoKTsKKyAgICAgICAgQXJyYXlMaXN0IHNhdmVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgQXJyYXlMaXN0IHNhdmVWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIHZhbHVlID0gYXR0cmlidXRlcy5nZXQoa2V5c1tpXSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2VyaWFsaXphYmxlKSB7CisgICAgICAgICAgICAgICAgc2F2ZU5hbWVzLmFkZChrZXlzW2ldKTsKKyAgICAgICAgICAgICAgICBzYXZlVmFsdWVzLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXJpYWxpemUgdGhlIGF0dHJpYnV0ZSBjb3VudCBhbmQgdGhlIFNlcmlhbGl6YWJsZSBhdHRyaWJ1dGVzCisgICAgICAgIGludCBuID0gc2F2ZU5hbWVzLnNpemUoKTsKKyAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KG5ldyBJbnRlZ2VyKG4pKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdCggKFN0cmluZykgc2F2ZU5hbWVzLmdldChpKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChzYXZlVmFsdWVzLmdldChpKSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb3RTZXJpYWxpemFibGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5ub3RTZXJpYWxpemFibGUiLHNhdmVOYW1lcy5nZXQoaSksIGlkKSwgZSk7CisgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KE5PVF9TRVJJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIiAgc3RvcmluZyBhdHRyaWJ1dGUgJyIgKyBzYXZlTmFtZXMuZ2V0KGkpKyAiJyB3aXRoIHZhbHVlIE5PVF9TRVJJQUxJWkVEIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSB3aXRob3V0IGEgY2hlY2sgZm9yIHZhbGlkaXR5LgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0QXR0cmlidXRlSW50ZXJuYWwoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIChhdHRyaWJ1dGVzLmdldChuYW1lKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQXR0cmlidXRlSW50ZXJuYWwoU3RyaW5nIG5hbWUsIGJvb2xlYW4gbm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWRkRGVsdGFSZXF1ZXN0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrKCk7CisgICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyBhdHRyaWJ1dGUgZnJvbSBvdXIgY29sbGVjdGlvbgorICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gYXR0cmlidXRlcy5nZXQobmFtZSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBzdXBlci5yZW1vdmVBdHRyaWJ1dGVJbnRlcm5hbChuYW1lLG5vdGlmeSk7CisgICAgICAgICAgICBpZiAoYWRkRGVsdGFSZXF1ZXN0ICYmIChkZWx0YVJlcXVlc3QgIT0gbnVsbCkpIGRlbHRhUmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisKKyAgICAgICAgfWZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgbG9uZyBnZXRMYXN0VGltZVJlcGxpY2F0ZWQoKSB7CisgICAgICAgIHJldHVybiBsYXN0VGltZVJlcGxpY2F0ZWQ7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIHZlcnNpb247CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0TGFzdFRpbWVSZXBsaWNhdGVkKGxvbmcgbGFzdFRpbWVSZXBsaWNhdGVkKSB7CisgICAgICAgIHRoaXMubGFzdFRpbWVSZXBsaWNhdGVkID0gbGFzdFRpbWVSZXBsaWNhdGVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24obG9uZyB2ZXJzaW9uKSB7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0QWNjZXNzQ291bnQoaW50IGNvdW50KSB7CisgICAgICAgIHN1cGVyLmFjY2Vzc0NvdW50ID0gY291bnQ7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIENsYXNzCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIGR1bW15IGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5IdHRwU2Vzc2lvbkNvbnRleHQ8L2NvZGU+CisgKiBpbnRlcmZhY2UsIHRvIGNvbmZvcm0gdG8gdGhlIHJlcXVpcmVtZW50IHRoYXQgc3VjaCBhbiBvYmplY3QgYmUgcmV0dXJuZWQgd2hlbgorICogPGNvZGU+SHR0cFNlc3Npb24uZ2V0U2Vzc2lvbkNvbnRleHQoKTwvY29kZT4gaXMgY2FsbGVkLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICoKKyAqIEBkZXByZWNhdGVkIEFzIG9mIEphdmEgU2VydmxldCBBUEkgMi4xIHdpdGggbm8gcmVwbGFjZW1lbnQuIFRoZSBpbnRlcmZhY2UKKyAqICAgICAgICAgICAgIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoaXMgQVBJLgorICovCisKK2ZpbmFsIGNsYXNzIFN0YW5kYXJkU2Vzc2lvbkNvbnRleHQKKyAgICBpbXBsZW1lbnRzIEh0dHBTZXNzaW9uQ29udGV4dCB7CisKKyAgICBwcml2YXRlIEhhc2hNYXAgZHVtbXkgPSBuZXcgSGFzaE1hcCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXNzaW9uIGlkZW50aWZpZXJzIG9mIGFsbCBzZXNzaW9ucyBkZWZpbmVkIHdpdGhpbiB0aGlzCisgICAgICogY29udGV4dC4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIEphdmEgU2VydmxldCBBUEkgMi4xIHdpdGggbm8gcmVwbGFjZW1lbnQuIFRoaXMgbWV0aG9kCisgICAgICogICAgICAgICAgICAgbXVzdCByZXR1cm4gYW4gZW1wdHkgPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IGFuZCB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoZSBBUEkuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldElkcygpIHsKKyAgICAgICAgcmV0dXJuIChuZXcgRW51bWVyYXRvcihkdW1teSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgPGNvZGU+SHR0cFNlc3Npb248L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogc2Vzc2lvbiBpZGVudGlmaWVyLgorICAgICAqCisgICAgICogQHBhcmFtIGlkCisgICAgICogICAgICAgICAgICBTZXNzaW9uIGlkZW50aWZpZXIgZm9yIHdoaWNoIHRvIGxvb2sgdXAgYSBzZXNzaW9uCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBKYXZhIFNlcnZsZXQgQVBJIDIuMSB3aXRoIG5vIHJlcGxhY2VtZW50LiBUaGlzIG1ldGhvZAorICAgICAqICAgICAgICAgICAgIG11c3QgcmV0dXJuIG51bGwgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mCisgICAgICogICAgICAgICAgICAgdGhlIEFQSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbihTdHJpbmcgaWQpIHsKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vSnZtUm91dGVCaW5kZXJWYWx2ZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9Kdm1Sb3V0ZUJpbmRlclZhbHZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVjMzY2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vSnZtUm91dGVCaW5kZXJWYWx2ZS5qYXZhCkBAIC0wLDAgKzEsNTQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5zZXNzaW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2F0YWxpbmFDbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3Rlck1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJWYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5NYW5hZ2VyQmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5WYWx2ZUJhc2U7CisKKy8qKgorICogVmFsdmUgdG8gaGFuZGxlIFRvbWNhdCBqdm1Sb3V0ZSB0YWtlb3ZlciB1c2luZyBtb2RfamsgbW9kdWxlIGFmdGVyIG5vZGUKKyAqIGZhaWx1cmUuIEFmdGVyIGEgbm9kZSBjcmFzaGVkIHRoZSBuZXh0IHJlcXVlc3QgZ29pbmcgdG8gb3RoZXIgY2x1c3RlciBub2RlLgorICogTm93IHRoZSBhbnN3ZXJpbmcgZnJvbSBhcGFjaGUgaXMgc2xvd2VyICggbWFrZSBzb21lIGVycm9yIGhhbmRzaGFraW5nLiBWZXJ5CisgKiBiYWQgd2l0aCBhcGFjaGUgYXQgbXkgd2luZG93cy4pLiBXZSByZXdyaXRlIG5vdyB0aGUgY29va2llIGpzZXNzaW9uaWQKKyAqIGluZm9ybWF0aW9uIHRvIHRoZSBiYWNrdXAgY2x1c3RlciBub2RlLiBBZnRlciB0aGUgbmV4dCByZXNwb25zZSBhbGwgY2xpZW50CisgKiByZXF1ZXN0IGdvZXMgZGlyZWN0IHRvIHRoZSBiYWNrdXAgbm9kZS4gVGhlIGNoYW5nZSBzZXNzaW9uaWQgc2VuZCBhbHNvIHRvIGFsbAorICogb3RoZXIgY2x1c3RlciBub2Rlcy4gV2VsbCwgbm93IHRoZSBzZXNzaW9uIHN0aWNreW5lc3Mgd29yayBkaXJlY3RseSB0byB0aGUKKyAqIGJhY2t1cCBub2RlIGFuZCB0cmFmZmljIGRvbid0IGdvIGJhY2sgdG9vIHJlc3RhcnRlZCBjbHVzdGVyIG5vZGVzIQorICogCisgKiBBdCBhbGwgY2x1c3RlciBub2RlIHlvdSBtdXN0IGNvbmZpZ3VyZSB0aGUgYXMgQ2x1c3Rlckxpc3RlbmVyIHNpbmNlIDUuNS4xMAorICoge0BsaW5rIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuc2Vzc2lvbi5Kdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyIEp2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXJ9CisgKiBvciBiZWZvcmUgd2l0aAorICogb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5zZXNzaW9uLkp2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXJMaWZlY3ljbGUuCisgKiAKKyAqIEFkZCB0aGlzIFZhbHZlIHRvIHlvdXIgaG9zdCBkZWZpbml0aW9uIGF0IGNvbmYvc2VydmVyLnhtbCAuCisgKiAKKyAqIFNpbmNlIDUuNS4xMCBhcyBkaXJlY3QgY2x1c3RlciB2YWx2ZTo8YnIvPgorICogPHByZT4KKyAqICAmbHQ7Q2x1c3RlciZndDsKKyAqICAmbHQ7VmFsdmUgY2xhc3NOYW1lPSZxdW90O29yZy5hcGFjaGUuY2F0YWxpbmEuaGEuc2Vzc2lvbi5Kdm1Sb3V0ZUJpbmRlclZhbHZlJnF1b3Q7IC8mZ3Q7ICAKKyAqICAmbHQ7L0NsdXN0ZXImZ3Q7CisgKiA8L3ByZT4KKyAqIDxiciAvPgorICogQmVmb3JlIDUuNS4xMCBhcyBIb3N0IGVsZW1lbnQ6PGJyLz4KKyAqIDxwcmU+CisgKiAgJmx0O0hvc3RyJmd0OworICogICZsdDtWYWx2ZSBjbGFzc05hbWU9JnF1b3Q7b3JnLmFwYWNoZS5jYXRhbGluYS5oYS5zZXNzaW9uLkp2bVJvdXRlQmluZGVyVmFsdmUmcXVvdDsgLyZndDsgIAorICogICZsdDsvSG9zdHImZ3Q7CisgKiA8L3ByZT4KKyAqIAorICogVHJpY2s6PGJyLz4KKyAqIFlvdSBjYW4gZW5hYmxlIHRoaXMgbW9kX2prIHR1cm5vdmVyIG1vZGUgdmlhIEpNWCBiZWZvcmUgeW91IGRyb3AgYSBub2RlIHRvIGFsbCBiYWNrdXAgbm9kZXMhCisgKiBTZXQgZW5hYmxlIHRydWUgb24gYWxsIEp2bVJvdXRlQmluZGVyVmFsdmUgYmFja3VwcywgZGlzYWJsZSB3b3JrZXIgYXQgbW9kX2prIAorICogYW5kIHRoZW4gZHJvcCBub2RlIGFuZCByZXN0YXJ0IGl0ISBUaGVuIGVuYWJsZSBtb2RfamsgV29ya2VyIGFuZCBkaXNhYmxlIEp2bVJvdXRlQmluZGVyVmFsdmVzIGFnYWluLiAKKyAqIFRoaXMgdXNlIGNhc2UgbWVhbnMgdGhhdCBvbmx5IHJlcXVlc3RlZCBzZXNzaW9uIGFyZSBtaWdyYXRlZC4KKyAqIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIEp2bVJvdXRlQmluZGVyVmFsdmUgZXh0ZW5kcyBWYWx2ZUJhc2UgaW1wbGVtZW50cyBDbHVzdGVyVmFsdmUsIExpZmVjeWNsZSB7CisKKyAgICAvKi0tU3RhdGljIFZhcmlhYmxlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkKKyAgICAgICAgICAgIC5nZXRMb2coSnZtUm91dGVCaW5kZXJWYWx2ZS5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuc2Vzc2lvbi5Kdm1Sb3V0ZUJpbmRlclZhbHZlLzEuMiI7CisKKyAgICAvKi0tSW5zdGFuY2UgVmFyaWFibGVzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoqCisgICAgICogdGhlIGNsdXN0ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nTWFuYWdlciBzbSA9IFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhpcyBjb21wb25lbnQgYmVlbiBzdGFydGVkIHlldD8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBlbmFibGVkIHRoaXMgY29tcG9uZW50CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBudW1iZXIgb2Ygc2Vzc2lvbiB0aGF0IG5vIGF0IHRoaXMgdG9tY2F0IGluc3RhbnogaG9zdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgbnVtYmVyT2ZTZXNzaW9ucyA9IDA7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlc3Npb25JZEF0dHJpYnV0ZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnNlc3Npb24uSnZtUm91dGVPcmlnbmFsU2Vzc2lvbklEIjsKKworICAgIC8qKgorICAgICAqIFRoZSBsaWZlY3ljbGUgZXZlbnQgc3VwcG9ydCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIExpZmVjeWNsZVN1cHBvcnQgbGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZVN1cHBvcnQodGhpcyk7CisKKyAgICAvKi0tTG9naWMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgc2Vzc2lvbiBpZCBhdHRyaWJ1dGUgdG8gZmFpbGVkIG5vZGUgZm9yIHJlcXVlc3QuCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXNzaW9uSWRBdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSWRBdHRyaWJ1dGUoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uSWRBdHRyaWJ1dGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IG5hbWUgb2YgZmFpbGVkIHJlcWV1c3Qgc2Vzc2lvbiBhdHRyaWJ1dGUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbklkQXR0cmlidXRlCisgICAgICogICAgICAgICAgICBUaGUgc2Vzc2lvbklkQXR0cmlidXRlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uSWRBdHRyaWJ1dGUoU3RyaW5nIHNlc3Npb25JZEF0dHJpYnV0ZSkgeworICAgICAgICB0aGlzLnNlc3Npb25JZEF0dHJpYnV0ZSA9IHNlc3Npb25JZEF0dHJpYnV0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG51bWJlciBvZiBtaWdyYXRlZCBzZXNzaW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXROdW1iZXJPZlNlc3Npb25zKCkgeworICAgICAgICByZXR1cm4gbnVtYmVyT2ZTZXNzaW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIGVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGVuYWJsZWQKKyAgICAgKiAgICAgICAgICAgIFRoZSBlbmFibGVkIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVjdCBwb3NzaWJsZSB0aGUgSlZNUm91dGUgY2hhbmdlIGF0IGNsdXN0ZXIgYmFja3VwIG5vZGUuLgorICAgICAqIAorICAgICAqIEBwYXJhbSByZXF1ZXN0CisgICAgICogICAgICAgICAgICB0b21jYXQgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UKKyAgICAgKiAgICAgICAgICAgIHRvbWNhdCByZXNwb25zZSBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIGhhcyBvY2N1cnJlZAorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGEgc2VydmxldCBlcnJvciBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZva2UoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgIGlmIChnZXRFbmFibGVkKCkgCisgICAgICAgICAgICAgJiYgZ2V0Q2x1c3RlcigpICE9IG51bGwKKyAgICAgICAgICAgICAmJiByZXF1ZXN0LmdldENvbnRleHQoKSAhPSBudWxsCisgICAgICAgICAgICAgJiYgcmVxdWVzdC5nZXRDb250ZXh0KCkuZ2V0RGlzdHJpYnV0YWJsZSgpICkgeworICAgICAgICAgICAgIC8vIHZhbHZlIGNsdXN0ZXIgY2FuIGFjY2VzcyBtYW5hZ2VyIC0gb3RoZXIgY2x1c3RlciBoYW5kbGUgdHVybm92ZXIgCisgICAgICAgICAgICAgLy8gYXQgaG9zdCBsZXZlbCAtIGhvcGVmdWxseSEKKyAgICAgICAgICAgICBNYW5hZ2VyIG1hbmFnZXIgPSByZXF1ZXN0LmdldENvbnRleHQoKS5nZXRNYW5hZ2VyKCk7CisgICAgICAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCAmJiBtYW5hZ2VyIGluc3RhbmNlb2YgQ2x1c3Rlck1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICYmIGdldENsdXN0ZXIoKS5nZXRNYW5hZ2VyKCgoQ2x1c3Rlck1hbmFnZXIpbWFuYWdlcikuZ2V0TmFtZSgpKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICBoYW5kbGVQb3NzaWJsZVR1cm5vdmVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBQYXNzIHRoaXMgcmVxdWVzdCBvbiB0byB0aGUgbmV4dCB2YWx2ZSBpbiBvdXIgcGlwZWxpbmUKKyAgICAgICAgZ2V0TmV4dCgpLmludm9rZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFuZGxlIHBvc3NpYmxlIHNlc3Npb24gdHVybiBvdmVyLgorICAgICAqIAorICAgICAqIEBzZWUgSnZtUm91dGVCaW5kZXJWYWx2ZSNoYW5kbGVKdm1Sb3V0ZShSZXF1ZXN0LCBSZXNwb25zZSwgU3RyaW5nLCBTdHJpbmcpCisgICAgICogQHBhcmFtIHJlcXVlc3QgY3VycmVudCByZXF1ZXN0CisgICAgICogQHBhcmFtIHJlc3BvbnNlIGN1cnJlbnQgcmVzcG9uc2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQb3NzaWJsZVR1cm5vdmVyKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwoZmFsc2UpOworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBsb25nIHQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBTdHJpbmcganZtUm91dGUgPSBnZXRMb2NhbEp2bVJvdXRlKHJlcXVlc3QpOworICAgICAgICAgICAgaWYgKGp2bVJvdXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS5taXNzaW5nSnZtUm91dGVBdHRyaWJ1dGUiKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFuZGxlSnZtUm91dGUoIHJlcXVlc3QsIHJlc3BvbnNlLHNlc3Npb24uZ2V0SWRJbnRlcm5hbCgpLCBqdm1Sb3V0ZSk7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgbG9uZyB0aW1lID0gdDIgLSB0MTsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS50dXJub3ZlckluZm8iLCBuZXcgTG9uZyh0aW1lKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGp2bXJvdXRlIGZyb20gZW5naW5lCisgICAgICogCisgICAgICogQHBhcmFtIHJlcXVlc3QgY3VycmVudCByZXF1ZXN0CisgICAgICogQHJldHVybiByZXR1cm4ganZtUm91dGUgZnJvbSBNYW5hZ2VyQmFzZSBvciBudWxsCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhbEp2bVJvdXRlKFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNYW5hZ2VyKHJlcXVlc3QpOworICAgICAgICBpZihtYW5hZ2VyIGluc3RhbmNlb2YgTWFuYWdlckJhc2UpCisgICAgICAgICAgICByZXR1cm4gKChNYW5hZ2VyQmFzZSkgbWFuYWdlcikuZ2V0SnZtUm91dGUoKTsKKyAgICAgICAgcmV0dXJuIG51bGwgOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBDbHVzdGVyIERlbHRhTWFuYWdlcgorICAgICAqIAorICAgICAqIEBwYXJhbSByZXF1ZXN0IGN1cnJlbnQgcmVxdWVzdAorICAgICAqIEByZXR1cm4gbWFuYWdlciBvciBudWxsCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hbmFnZXIgZ2V0TWFuYWdlcihSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgTWFuYWdlciBtYW5hZ2VyID0gcmVxdWVzdC5nZXRDb250ZXh0KCkuZ2V0TWFuYWdlcigpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmKG1hbmFnZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS5mb3VuZE1hbmFnZXIiLCBtYW5hZ2VyLCAgcmVxdWVzdC5nZXRDb250ZXh0KCkuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImp2bVJvdXRlLm5vdEZvdW5kTWFuYWdlciIsIG1hbmFnZXIsICByZXF1ZXN0LmdldENvbnRleHQoKS5nZXROYW1lKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWFuYWdlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsdXN0ZXIuCisgICAgICovCisgICAgcHVibGljIENhdGFsaW5hQ2x1c3RlciBnZXRDbHVzdGVyKCkgeworICAgICAgICByZXR1cm4gY2x1c3RlcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIGNsdXN0ZXIgVGhlIGNsdXN0ZXIgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXIoQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIpIHsKKyAgICAgICAgdGhpcy5jbHVzdGVyID0gY2x1c3RlcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSGFuZGxlIGp2bVJvdXRlIHN0aWNreW5lc3MgYWZ0ZXIgdG9tY2F0IGluc3RhbmNlIGZhaWxlZC4gQWZ0ZXIgdGhpcworICAgICAqIGNvcnJlY3Rpb24gYSBuZXcgQ29va2llIHNlbmQgdG8gY2xpZW50IHdpdGggbmV3IGp2bVJvdXRlIGFuZCB0aGUKKyAgICAgKiBTZXNzaW9uSUQgY2hhbmdlIHByb3BhZ2UgdG8gdGhlIG90aGVyIGNsdXN0ZXIgbm9kZXMuCisgICAgICogCisgICAgICogQHBhcmFtIHJlcXVlc3QgY3VycmVudCByZXF1ZXN0CisgICAgICogQHBhcmFtIHJlc3BvbnNlCisgICAgICogICAgICAgICAgICBUb21jYXQgUmVzcG9uc2UKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbklkCisgICAgICogICAgICAgICAgICByZXF1ZXN0IFNlc3Npb25JRCBmcm9tIENvb2tpZQorICAgICAqIEBwYXJhbSBsb2NhbEp2bVJvdXRlCisgICAgICogICAgICAgICAgICBsb2NhbCBqdm1Sb3V0ZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUp2bVJvdXRlKAorICAgICAgICAgICAgUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSxTdHJpbmcgc2Vzc2lvbklkLCBTdHJpbmcgbG9jYWxKdm1Sb3V0ZSkgeworICAgICAgICAvLyBnZXQgcmVxdWVzdGVkIGp2bVJvdXRlLgorICAgICAgICBTdHJpbmcgcmVxdWVzdEp2bVJvdXRlID0gbnVsbDsKKyAgICAgICAgaW50IGluZGV4ID0gc2Vzc2lvbklkLmluZGV4T2YoIi4iKTsKKyAgICAgICAgaWYgKGluZGV4ID4gMCkgeworICAgICAgICAgICAgcmVxdWVzdEp2bVJvdXRlID0gc2Vzc2lvbklkCisgICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoaW5kZXggKyAxLCBzZXNzaW9uSWQubGVuZ3RoKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXF1ZXN0SnZtUm91dGUgIT0gbnVsbCAmJiAhcmVxdWVzdEp2bVJvdXRlLmVxdWFscyhsb2NhbEp2bVJvdXRlKSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygianZtUm91dGUuZmFpbG92ZXIiLCByZXF1ZXN0SnZtUm91dGUsCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbEp2bVJvdXRlLCBzZXNzaW9uSWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE9LIC0gdHVybm92ZXIgdGhlIHNlc3Npb24gPworICAgICAgICAgICAgU3RyaW5nIG5ld1Nlc3Npb25JRCA9IHNlc3Npb25JZC5zdWJzdHJpbmcoMCwgaW5kZXgpICsgIi4iCisgICAgICAgICAgICAgICAgICAgICsgbG9jYWxKdm1Sb3V0ZTsKKyAgICAgICAgICAgIFNlc3Npb24gY2F0YWxpbmFTZXNzaW9uID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2F0YWxpbmFTZXNzaW9uID0gZ2V0TWFuYWdlcihyZXF1ZXN0KS5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEh1cHMhCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2F0YWxpbmFTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjaGFuZ2VTZXNzaW9uSUQocmVxdWVzdCwgcmVzcG9uc2UsIHNlc3Npb25JZCwgbmV3U2Vzc2lvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgY2F0YWxpbmFTZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBudW1iZXJPZlNlc3Npb25zKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS5jYW5ub3RGaW5kU2Vzc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY2hhbmdlIHNlc3Npb24gaWQgYW5kIHNlbmQgdG8gYWxsIGNsdXN0ZXIgbm9kZXMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBjdXJyZW50IHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgY3VycmVudCByZXNwb25zZQorICAgICAqIEBwYXJhbSBzZXNzaW9uSWQKKyAgICAgKiAgICAgICAgICAgIG9yaWdpbmFsIHNlc3Npb24gaWQKKyAgICAgKiBAcGFyYW0gbmV3U2Vzc2lvbklECisgICAgICogICAgICAgICAgICBuZXcgc2Vzc2lvbiBpZCBmb3Igbm9kZSBtaWdyYXRpb24KKyAgICAgKiBAcGFyYW0gY2F0YWxpbmFTZXNzaW9uCisgICAgICogICAgICAgICAgICBjdXJyZW50IHNlc3Npb24gd2l0aCBvcmlnaW5hbCBzZXNzaW9uIGlkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlU2Vzc2lvbklEKFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgc2Vzc2lvbklkLCBTdHJpbmcgbmV3U2Vzc2lvbklELCBTZXNzaW9uIGNhdGFsaW5hU2Vzc2lvbikgeworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KCJCZWZvcmUgc2Vzc2lvbiBtaWdyYXRpb24iLAorICAgICAgICAgICAgICAgIGNhdGFsaW5hU2Vzc2lvbik7CisgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdGVkU2Vzc2lvbklkKG5ld1Nlc3Npb25JRCk7CisgICAgICAgIGNhdGFsaW5hU2Vzc2lvbi5zZXRJZChuZXdTZXNzaW9uSUQpOworICAgICAgICBpZiAoY2F0YWxpbmFTZXNzaW9uIGluc3RhbmNlb2YgRGVsdGFTZXNzaW9uKQorICAgICAgICAgICAgKChEZWx0YVNlc3Npb24pIGNhdGFsaW5hU2Vzc2lvbikucmVzZXREZWx0YVJlcXVlc3QoKTsKKyAgICAgICAgaWYocmVxdWVzdC5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKSkgc2V0TmV3U2Vzc2lvbkNvb2tpZShyZXF1ZXN0LCByZXNwb25zZSxuZXdTZXNzaW9uSUQpOworICAgICAgICAvLyBzZXQgb3JnaW5hbCBzZXNzaW9uaWQgYXQgcmVxdWVzdCwgdG8gYWxsb3cgYXBwbGljYXRpb24gZGV0ZWN0IHRoZQorICAgICAgICAvLyBjaGFuZ2UKKyAgICAgICAgaWYgKHNlc3Npb25JZEF0dHJpYnV0ZSAhPSBudWxsICYmICEiIi5lcXVhbHMoc2Vzc2lvbklkQXR0cmlidXRlKSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygianZtUm91dGUuc2V0Lm9yaWduYWxzZXNzaW9uaWQiLHNlc3Npb25JZEF0dHJpYnV0ZSxzZXNzaW9uSWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKHNlc3Npb25JZEF0dHJpYnV0ZSwgc2Vzc2lvbklkKTsKKyAgICAgICAgfQorICAgICAgICAvLyBub3cgc2VuZGluZyB0aGUgY2hhbmdlIHRvIGFsbCBvdGhlciBjbHVzdGVybm9kZSEKKyAgICAgICAgQ2x1c3Rlck1hbmFnZXIgbWFuYWdlciA9IChDbHVzdGVyTWFuYWdlciljYXRhbGluYVNlc3Npb24uZ2V0TWFuYWdlcigpOworICAgICAgICBzZW5kU2Vzc2lvbklEQ2x1c3RlckJhY2t1cChtYW5hZ2VyLHJlcXVlc3Qsc2Vzc2lvbklkLCBuZXdTZXNzaW9uSUQpOworICAgICAgICBsaWZlY3ljbGUKKyAgICAgICAgICAgICAgICAuZmlyZUxpZmVjeWNsZUV2ZW50KCJBZnRlciBzZXNzaW9uIG1pZ3JhdGlvbiIsIGNhdGFsaW5hU2Vzc2lvbik7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygianZtUm91dGUuY2hhbmdlU2Vzc2lvbiIsIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgbmV3U2Vzc2lvbklEKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSBjaGFuZ2VkIFNlc3Npb25pZCB0byBhbGwgY2x1c3Rlcm5vZGVzLgorICAgICAqIAorICAgICAqIEBzZWUgSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lciNtZXNzYWdlUmVjZWl2ZWQoQ2x1c3Rlck1lc3NhZ2UpCisgICAgICogQHBhcmFtIG1hbmFnZXIKKyAgICAgKiAgICAgICAgICAgIENsdXN0ZXJNYW5hZ2VyCisgICAgICogQHBhcmFtIHNlc3Npb25JZAorICAgICAqICAgICAgICAgICAgY3VycmVudCBmYWlsZWQgc2Vzc2lvbmlkCisgICAgICogQHBhcmFtIG5ld1Nlc3Npb25JRAorICAgICAqICAgICAgICAgICAgbmV3IHNlc3Npb24gaWQsIGJpbmQgdG8gdGhlIG5ldyBjbHVzdGVyIG5vZGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kU2Vzc2lvbklEQ2x1c3RlckJhY2t1cChDbHVzdGVyTWFuYWdlciBtYW5hZ2VyLFJlcXVlc3QgcmVxdWVzdCxTdHJpbmcgc2Vzc2lvbklkLAorICAgICAgICAgICAgU3RyaW5nIG5ld1Nlc3Npb25JRCkgeworICAgICAgICBTZXNzaW9uSURNZXNzYWdlIG1zZyA9IG5ldyBTZXNzaW9uSURNZXNzYWdlKCk7CisgICAgICAgIG1zZy5zZXRPcmlnbmFsU2Vzc2lvbklEKHNlc3Npb25JZCk7CisgICAgICAgIG1zZy5zZXRCYWNrdXBTZXNzaW9uSUQobmV3U2Vzc2lvbklEKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRDb250ZXh0KCk7CisgICAgICAgIG1zZy5zZXRDb250ZXh0UGF0aChjb250ZXh0LmdldFBhdGgoKSk7CisgICAgICAgIG1zZy5zZXRIb3N0KGNvbnRleHQuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYobWFuYWdlci5pc1NlbmRDbHVzdGVyRG9tYWluT25seSgpKQorICAgICAgICAgICAgY2x1c3Rlci5zZW5kQ2x1c3RlckRvbWFpbihtc2cpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjbHVzdGVyLnNlbmQobXNnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgbmV3IGNvb2tpZSBmb3IgdGhlIGdpdmVuIHNlc3Npb24gaWQgYW5kIHJlc3BvbnNlIGFuZCBzZWUKKyAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdCNjb25maWd1cmVTZXNzaW9uQ29va2llKGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWUpfQorICAgICAqIAorICAgICAqIEBwYXJhbSByZXF1ZXN0IGN1cnJlbnQgcmVxdWVzdAorICAgICAqIEBwYXJhbSByZXNwb25zZSBUb21jYXQgUmVzcG9uc2UKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0TmV3U2Vzc2lvbkNvb2tpZShSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIHNlc3Npb25JZCkgeworICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRDb250ZXh0KCk7CisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRDb29raWVzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBzZXQgYSBuZXcgc2Vzc2lvbiBjb29raWUKKyAgICAgICAgICAgICAgICBDb29raWUgbmV3Q29va2llID0gbmV3IENvb2tpZShHbG9iYWxzLlNFU1NJT05fQ09PS0lFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIG5ld0Nvb2tpZS5zZXRNYXhBZ2UoLTEpOworICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5nZXRDb25uZWN0b3IoKS5nZXRFbXB0eVNlc3Npb25QYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChjb250ZXh0ICE9IG51bGwpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRQYXRoID0gY29udGV4dC5nZXRFbmNvZGVkUGF0aCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGNvbnRleHRQYXRoICE9IG51bGwpICYmIChjb250ZXh0UGF0aC5sZW5ndGgoKSA+IDApKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld0Nvb2tpZS5zZXRQYXRoKGNvbnRleHRQYXRoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuZXdDb29raWUuc2V0UGF0aCgiLyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5pc1NlY3VyZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld0Nvb2tpZS5zZXRTZWN1cmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS5uZXdTZXNzaW9uQ29va2llIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIEdsb2JhbHMuU0VTU0lPTl9DT09LSUVfTkFNRSwgbmV3Q29va2llCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGF0aCgpLCBuZXcgQm9vbGVhbihuZXdDb29raWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZWN1cmUoKSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkQ29va2llKG5ld0Nvb2tpZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIEFkZCBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlmZWN5Y2xlLiBJZiB0aGlzCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiBsaWZlY3ljbGUuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGFyZSBmb3IgdGhlIGJlZ2lubmluZyBvZiBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzCisgICAgICogY29tcG9uZW50LiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIDxjb2RlPmNvbmZpZ3VyZSgpPC9jb2RlPiwKKyAgICAgKiBhbmQgYmVmb3JlIGFueSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhlIGNvbXBvbmVudCBhcmUgdXRpbGl6ZWQuCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IgdGhhdCBwcmV2ZW50cyB0aGlzCisgICAgICogICAgICAgICAgICAgICAgY29tcG9uZW50IGZyb20gYmVpbmcgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uKHNtCisgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoImp2bVJvdXRlLnZhbHZlLmFscmVhZHlTdGFydGVkIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisgICAgICAgIGlmIChjbHVzdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIENvbnRhaW5lciBob3N0Q29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7CisgICAgICAgICAgICAvLyBjb21wYXRpYmlsaXR5IHdpdGggSnZtUm91dGVCaW5kZXJWYWx2ZSB2ZXJzaW9uIDEuMQorICAgICAgICAgICAgLy8gKCBzZXR1cCBhdCBjb250ZXh0LnhtbCBvciBjb250ZXh0LnhtbC5kZWZhdWx0ICkKKyAgICAgICAgICAgIGlmICghKGhvc3RDb250YWluZXIgaW5zdGFuY2VvZiBIb3N0KSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcoImp2bVJvdXRlLmNvbmZpZ3VyZS53YXJuIikpOworICAgICAgICAgICAgICAgIGhvc3RDb250YWluZXIgPSBob3N0Q29udGFpbmVyLmdldFBhcmVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhvc3RDb250YWluZXIgaW5zdGFuY2VvZiBIb3N0CisgICAgICAgICAgICAgICAgICAgICYmICgoSG9zdCkgaG9zdENvbnRhaW5lcikuZ2V0Q2x1c3RlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjbHVzdGVyID0gKENhdGFsaW5hQ2x1c3RlcikgKChIb3N0KSBob3N0Q29udGFpbmVyKS5nZXRDbHVzdGVyKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENvbnRhaW5lciBlbmdpbmUgPSBob3N0Q29udGFpbmVyLmdldFBhcmVudCgpIDsKKyAgICAgICAgICAgICAgICBpZiAoZW5naW5lIGluc3RhbmNlb2YgRW5naW5lCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKEVuZ2luZSkgZW5naW5lKS5nZXRDbHVzdGVyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjbHVzdGVyID0gKENhdGFsaW5hQ2x1c3RlcikgKChFbmdpbmUpIGVuZ2luZSkuZ2V0Q2x1c3RlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2x1c3RlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gY2x1c3RlcmluZyBzdXBwb3J0IGF0IGNvbnRhaW5lciAiCisgICAgICAgICAgICAgICAgICAgICsgY29udGFpbmVyLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS52YWx2ZS5zdGFydGVkIikpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSB0ZXJtaW5hdGUgdGhlIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB0aGUgbGFzdCBvbmUgY2FsbGVkIG9uIGEgZ2l2ZW4gaW5zdGFuY2UKKyAgICAgKiBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvciB0aGF0IG5lZWRzIHRvIGJlCisgICAgICogICAgICAgICAgICAgICAgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKCFzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbihzbQorICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJqdm1Sb3V0ZS52YWx2ZS5ub3RTdGFydGVkIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUT1BfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gZmFsc2U7CisgICAgICAgIGNsdXN0ZXIgPSBudWxsOworICAgICAgICBudW1iZXJPZlNlc3Npb25zID0gMDsKKyAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoImp2bVJvdXRlLnZhbHZlLnN0b3BwZWQiKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9Kdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpZmVjeWNsZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmNGI0YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuc2Vzc2lvbjsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4uTW9kZWxNQmVhbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNhdGFsaW5hQ2x1c3RlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuTWFuYWdlZEJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS4qOworCisvKioKKyAqIFJlZ2lzdGVyIG5ldyBKdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyIHRvIHJlY2VpdmUgU2Vzc2lvbiBJRCBjaGFuZ2VzLgorICogCisgKiBhZGQgZm9sbG93aW5nIGF0IHlvdXIgc2VydmVyLnhtbCBIb3N0IHNlY3Rpb24KKyAqIAorICogPHByZT4KKyAqICAgICAgICAmbHQ7SG9zdCAmZ3Q7Li4uIAorICogICAgICAgICAgJmx0O0xpc3RlbmVyIGNsYXNzTmFtZT0mcXVvdDtvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnNlc3Npb24uSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaWZlY3ljbGVMaXN0ZW5lciZxdW90OyAvJmd0OworICogICAgICAgICAgJmx0O0NsdXN0ZXIgLi4uJmd0OworICogICAgICAgICZsdDsvSG9zdCZndDsKKyAqIDwvcHJlPgorICogRklYTUUgYWRkIEVuZ2luZSBzdXBwb3J0CisgKiBAZGVwcmVjYXRlZAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICovCitwdWJsaWMgY2xhc3MgSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaWZlY3ljbGVMaXN0ZW5lciBpbXBsZW1lbnRzCisgICAgICAgIExpZmVjeWNsZUxpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeQorICAgICAgICAgICAgLmdldExvZyhKdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpZmVjeWNsZUxpc3RlbmVyLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBzdHJpbmcgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAib3JnLmFwYWNoZS5jYXRhbGluYS5oYS5zZXNzaW9uLkp2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlmZWN5Y2xlTGlzdGVuZXIvMS4wIjsKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgcmVzb3VyY2VzIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0gU3RyaW5nTWFuYWdlcgorICAgICAgICAgICAgLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQgPSB0cnVlOworCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworICAgIHByaXZhdGUgUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOworCisgICAgcHJpdmF0ZSBDbHVzdGVyTGlzdGVuZXIgc2Vzc2lvbk1vdmVyTGlzdGVuZXI7CisKKyAgICAvKgorICAgICAqIHN0YXJ0IGFuZCBzdG9wIGNsdXN0ZXIKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXIjbGlmZWN5Y2xlRXZlbnQob3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFdmVudCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsaWZlY3ljbGVFdmVudChMaWZlY3ljbGVFdmVudCBldmVudCkgeworCisgICAgICAgIGlmIChlbmFibGVkICYmIGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgU3RhbmRhcmRIb3N0KSB7CisKKyAgICAgICAgICAgIGlmIChMaWZlY3ljbGUuQUZURVJfU1RBUlRfRVZFTlQuZXF1YWxzKGV2ZW50LmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImp2bVJvdXRlLmxpc3RlbmVyLnN0YXJ0ZWQiKSk7CisgICAgICAgICAgICAgICAgc3RhcnRTZXNzaW9uSURMaXN0ZW5lcigoU3RhbmRhcmRIb3N0KSBldmVudC5nZXRTb3VyY2UoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKExpZmVjeWNsZS5CRUZPUkVfU1RPUF9FVkVOVC5lcXVhbHMoZXZlbnQuZ2V0VHlwZSgpKSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygianZtUm91dGUubGlzdGVuZXIuc3RvcHBlZCIpKTsKKyAgICAgICAgICAgICAgICBzdG9wU2Vzc2lvbklETGlzdGVuZXIoKFN0YW5kYXJkSG9zdCkgZXZlbnQuZ2V0U291cmNlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogc3RvcCBzZXNzaW9uSUQgYmluZGVyIGF0IGNsdXN0ZXIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaG9zdAorICAgICAqICAgICAgICAgICAgY2x1c3RlcmVkIGhvc3QKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzdG9wU2Vzc2lvbklETGlzdGVuZXIoU3RhbmRhcmRIb3N0IGhvc3QpIHsKKyAgICAgICAgaWYgKHNlc3Npb25Nb3Zlckxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIENhdGFsaW5hQ2x1c3RlciBjbHVzdGVyID0gKENhdGFsaW5hQ2x1c3RlcikgaG9zdC5nZXRDbHVzdGVyKCk7CisgICAgICAgICAgICBjbHVzdGVyLnJlbW92ZUNsdXN0ZXJMaXN0ZW5lcihzZXNzaW9uTW92ZXJMaXN0ZW5lcik7CisgICAgICAgICAgICBpZiAobXNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gZ2V0T2JqZWN0TmFtZShob3N0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBob3N0CisgICAgICogQHJldHVybiBUaGUgb2JqZWN0IG5hbWUKKyAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0TmFtZSBnZXRPYmplY3ROYW1lKFN0YW5kYXJkSG9zdCBob3N0KSB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKAorICAgICAgICAgICAgICAgIGhvc3QuZ2V0RG9tYWluKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjp0eXBlPUxpc3RlbmVyLG5hbWU9SnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lcixob3N0PSIgKyBob3N0LmdldE5hbWUoKSk7CisgICAgICAgIHJldHVybiBvYmplY3ROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIHN0YXJ0IHNlc3Npb25JRCBtb3ZlciBhdCBjbHVzdGVyCisgICAgICogCisgICAgICogQHBhcmFtIGhvc3QKKyAgICAgKiAgICAgICAgICAgIGNsdXN0ZXJlZCBob3N0CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRTZXNzaW9uSURMaXN0ZW5lcihTdGFuZGFyZEhvc3QgaG9zdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gbnVsbDsKKyAgICAgICAgICAgIGdldE1CZWFuU2VydmVyKCk7CisgICAgICAgICAgICBvYmplY3ROYW1lID0gZ2V0T2JqZWN0TmFtZShob3N0KTsKKyAgICAgICAgICAgIGlmIChtc2VydmVyLmlzUmVnaXN0ZXJlZChvYmplY3ROYW1lKSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoImp2bVJvdXRlLnJ1bi5hbHJlYWR5IikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb25Nb3Zlckxpc3RlbmVyID0gbmV3IEp2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXIoKTsKKyAgICAgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihnZXRNYW5hZ2VkQmVhbihzZXNzaW9uTW92ZXJMaXN0ZW5lciksCisgICAgICAgICAgICAgICAgICAgIG9iamVjdE5hbWUpOworICAgICAgICAgICAgQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIgPSAoQ2F0YWxpbmFDbHVzdGVyKSBob3N0LmdldENsdXN0ZXIoKTsKKyAgICAgICAgICAgIHNlc3Npb25Nb3Zlckxpc3RlbmVyLnNldENsdXN0ZXIoY2x1c3Rlcik7CisgICAgICAgICAgICAoKEp2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXIpIHNlc3Npb25Nb3Zlckxpc3RlbmVyKS5zdGFydCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihleC5nZXRNZXNzYWdlKCksIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBNQmVhblNlcnZlciBnZXRNQmVhblNlcnZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoTUJlYW5TZXJ2ZXJGYWN0b3J5LmZpbmRNQmVhblNlcnZlcihudWxsKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbXNlcnZlciA9IChNQmVhblNlcnZlcikgTUJlYW5TZXJ2ZXJGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAuZmluZE1CZWFuU2VydmVyKG51bGwpLmdldCgwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbXNlcnZlciA9IE1CZWFuU2VydmVyRmFjdG9yeS5jcmVhdGVNQmVhblNlcnZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVnaXN0cnkgPSBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKTsKKyAgICAgICAgICAgIHJlZ2lzdHJ5LmxvYWRNZXRhZGF0YSh0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgIm1iZWFucy1kZXNjcmlwdG9ycy54bWwiKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChtc2VydmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBNb2RlbE1CZWFuCisgICAgICogCisgICAgICogQHBhcmFtIG9iamVjdAorICAgICAqICAgICAgICAgICAgVGhlIE9iamVjdCB0byBnZXQgdGhlIE1vZGVsTUJlYW4gZm9yCisgICAgICogQHJldHVybiBUaGUgTW9kZWxNQmVhbgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIHRoaXMgY29uc3RydWN0b3JzIHRocm93cyB0aGlzIGV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBNb2RlbE1CZWFuIGdldE1hbmFnZWRCZWFuKE9iamVjdCBvYmplY3QpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNb2RlbE1CZWFuIG1iZWFuID0gbnVsbDsKKyAgICAgICAgaWYgKHJlZ2lzdHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWRCZWFuID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG9iamVjdAorICAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgbWJlYW4gPSBtYW5hZ2VkQmVhbi5jcmVhdGVNQmVhbihvYmplY3QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtYmVhbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gZW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZW5hYmxlZAorICAgICAqICAgICAgICAgICAgVGhlIGVuYWJsZWQgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIHRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gYW5kIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL0p2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNTdmODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL0p2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuc2Vzc2lvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuKjsKKworLyoqCisgKiBSZWNlaXZlIFNlc3Npb25JRCBjbHVzdGVyIGNoYW5nZSBmcm9tIG90aGVyIGJhY2t1cCBub2RlIGFmdGVyIHByaW1hcnkgc2Vzc2lvbgorICogbm9kZSBpcyBmYWlsZWQuCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBKdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyIGV4dGVuZHMgQ2x1c3Rlckxpc3RlbmVyIHsKKyAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuc2Vzc2lvbi5Kdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyLzEuMSI7CisKKyAgICAvLy0tSW5zdGFuY2UgVmFyaWFibGVzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogbnVtYmVyIG9mIHNlc3Npb24gdGhhdCBnb2VzIHRvIHRoaXMgY2x1c3RlciBub2RlCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIG51bWJlck9mU2Vzc2lvbnMgPSAwOworCisgICAgLy8tLUNvbnN0cnVjdG9yLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwdWJsaWMgSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lcigpIHsKKyAgICB9CisKKyAgICAvLy0tTG9naWMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBudW1iZXJPZlNlc3Npb25zLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldE51bWJlck9mU2Vzc2lvbnMoKSB7CisgICAgICAgIHJldHVybiBudW1iZXJPZlNlc3Npb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGlzIE1vdmVyIGFzIENsdXN0ZXIgTGlzdGVuZXIgKCByZWNlaXZlcikKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGFydGVkKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBnZXRDbHVzdGVyKCkuYWRkQ2x1c3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoImp2bVJvdXRlLmNsdXN0ZXJMaXN0ZW5lci5zdGFydGVkIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGlzIGZyb20gQ2x1c3RlciBMaXN0ZW5lcgorICAgICAqIAorICAgICAqIEB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICBzdGFydGVkID0gZmFsc2U7CisgICAgICAgIGdldENsdXN0ZXIoKS5yZW1vdmVDbHVzdGVyTGlzdGVuZXIodGhpcyk7CisgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS5jbHVzdGVyTGlzdGVuZXIuc3RvcHBlZCIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmcm9tIHRoZSBjbHVzdGVyLCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCwgVGhlIGNsdXN0ZXIgd2lsbAorICAgICAqIGJyb2FkY2FzdCBpdCBpbnZva2luZyB0aGUgbWVzc2FnZVJlY2VpdmVkIG9uIHRoZSByZWNlaXZlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICogICAgICAgICAgICBDbHVzdGVyTWVzc2FnZSAtIHRoZSBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIGNsdXN0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoQ2x1c3Rlck1lc3NhZ2UgbXNnKSB7CisgICAgICAgIGlmIChtc2cgaW5zdGFuY2VvZiBTZXNzaW9uSURNZXNzYWdlICYmIG1zZyAhPSBudWxsKSB7CisgICAgICAgICAgICBTZXNzaW9uSURNZXNzYWdlIHNlc3Npb25tc2cgPSAoU2Vzc2lvbklETWVzc2FnZSkgbXNnOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAianZtUm91dGUucmVjZWl2ZU1lc3NhZ2Uuc2Vzc2lvbklEQ2hhbmdlZCIsIHNlc3Npb25tc2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE9yaWduYWxTZXNzaW9uSUQoKSwgc2Vzc2lvbm1zZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QmFja3VwU2Vzc2lvbklEKCksIHNlc3Npb25tc2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbnRleHRQYXRoKCkpKTsKKyAgICAgICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBnZXRDbHVzdGVyKCkuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgICAgICBDb250YWluZXIgaG9zdCA9IG51bGwgOworICAgICAgICAgICAgaWYoY29udGFpbmVyIGluc3RhbmNlb2YgRW5naW5lKSB7CisgICAgICAgICAgICAgICAgaG9zdCA9IGNvbnRhaW5lci5maW5kQ2hpbGQoc2Vzc2lvbm1zZy5nZXRIb3N0KCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBob3N0ID0gY29udGFpbmVyIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgaG9zdC5maW5kQ2hpbGQoc2Vzc2lvbm1zZworICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbnRleHRQYXRoKCkpOworICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGNvbnRleHQuZ2V0TWFuYWdlcigpLmZpbmRTZXNzaW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9ubXNnLmdldE9yaWduYWxTZXNzaW9uSUQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRJZChzZXNzaW9ubXNnLmdldEJhY2t1cFNlc3Npb25JRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoImp2bVJvdXRlLmxvc3RTZXNzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25tc2cuZ2V0T3JpZ25hbFNlc3Npb25JRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbm1zZy5nZXRDb250ZXh0UGF0aCgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygianZtUm91dGUuY29udGV4dE5vdEZvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9ubXNnLmdldENvbnRleHRQYXRoKCksICgoU3RhbmRhcmRFbmdpbmUpIGhvc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYXJlbnQoKSkuZ2V0SnZtUm91dGUoKSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJqdm1Sb3V0ZS5ob3N0Tm90Rm91bmQiLCBzZXNzaW9ubXNnLmdldENvbnRleHRQYXRoKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjZXB0IG9ubHkgU2Vzc2lvbklETWVzc2FnZXMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICogICAgICAgICAgICBDbHVzdGVyTWVzc2FnZQorICAgICAqIEByZXR1cm4gYm9vbGVhbiAtIHJldHVybnMgdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IG1lc3NhZ2VSZWNlaXZlZCBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgIGludm9rZWQuIElmIGZhbHNlIGlzIHJldHVybmVkLCB0aGUgbWVzc2FnZVJlY2VpdmVkIG1ldGhvZCB3aWxsCisgICAgICogICAgICAgICBub3QgYmUgaW52b2tlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQ2x1c3Rlck1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHJldHVybiAobXNnIGluc3RhbmNlb2YgU2Vzc2lvbklETWVzc2FnZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2Y0NzA1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMCwwICsxLDk2IEBACitkZWx0YU1hbmFnZXIuY3JlYXRlU2Vzc2lvbi5pc2U9Y3JlYXRlU2Vzc2lvbjogVG9vIG1hbnkgYWN0aXZlIHNlc3Npb25zCitkZWx0YU1hbmFnZXIuY3JlYXRlU2Vzc2lvbi5uZXdTZXNzaW9uPUNyZWF0ZWQgYSBEZWx0YVNlc3Npb24gd2l0aCBJZCBbezB9XSBUb3RhbCBjb3VudD17MX0KK2RlbHRhTWFuYWdlci5jcmVhdGVNZXNzYWdlLmFjY2Vzcz1NYW5hZ2VyIFt7MH1dOiBjcmVhdGUgc2Vzc2lvbiBtZXNzYWdlIFt7MX1dIGFjY2Vzcy4KK2RlbHRhTWFuYWdlci5jcmVhdGVNZXNzYWdlLmFjY2Vzc0NoYW5nZVByaW1hcnk9TWFuYWdlciBbezB9XTogY3JlYXRlIHNlc3Npb24gbWVzc2FnZSBbezF9XSBhY2Nlc3MgdG8gY2hhbmdlIHByaW1hcnkuCitkZWx0YU1hbmFnZXIuY3JlYXRlTWVzc2FnZS5hbGxTZXNzaW9uRGF0YT1NYW5hZ2VyIFt7MH1dIHNlbmQgYWxsIHNlc3Npb24gZGF0YS4KK2RlbHRhTWFuYWdlci5jcmVhdGVNZXNzYWdlLmFsbFNlc3Npb25UcmFuc2ZlcmVkPU1hbmFnZXIgW3swfV0gc2VuZCBhbGwgc2Vzc2lvbiBkYXRhIHRyYW5zZmVyZWQKK2RlbHRhTWFuYWdlci5jcmVhdGVNZXNzYWdlLmRlbHRhPU1hbmFnZXIgW3swfV06IGNyZWF0ZSBzZXNzaW9uIG1lc3NhZ2UgW3sxfV0gZGVsdGEgcmVxdWVzdC4KK2RlbHRhTWFuYWdlci5jcmVhdGVNZXNzYWdlLmV4cGlyZT1NYW5hZ2VyIFt7MH1dOiBjcmVhdGUgc2Vzc2lvbiBtZXNzYWdlIFt7MX1dIGV4cGlyZS4KK2RlbHRhTWFuYWdlci5jcmVhdGVNZXNzYWdlLnVuYWJsZUNyZWF0ZURlbHRhUmVxdWVzdD1VbmFibGUgdG8gc2VyaWFsaXplIGRlbHRhIHJlcXVlc3QgZm9yIHNlc3Npb25pZCBbezB9XQorZGVsdGFNYW5hZ2VyLmRyb3BNZXNzYWdlPU1hbmFnZXIgW3swfV06IERyb3AgbWVzc2FnZSB7MX0gaW5zaWRlIEdFVF9BTExfU0VTU0lPTlMgc3luYyBwaGFzZSBzdGFydCBkYXRlIHsyfSBtZXNzYWdlIGRhdGUgezN9CitkZWx0YU1hbmFnZXIuZm91bmRNYXN0ZXJNZW1iZXI9Rm91bmQgZm9yIGNvbnRleHQgW3swfV0gdGhlIHJlcGxpY2F0aW9uIG1hc3RlciBtZW1iZXIgW3sxfV0KK2RlbHRhTWFuYWdlci5sb2FkaW5nLmNuZmU9Q2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB3aGlsZSBsb2FkaW5nIHBlcnNpc3RlZCBzZXNzaW9uczogezB9CitkZWx0YU1hbmFnZXIubG9hZGluZy5leGlzdGluZy5zZXNzaW9uPW92ZXJsb2FkIGV4aXN0aW5nIHNlc3Npb24gezB9IAorZGVsdGFNYW5hZ2VyLmxvYWRpbmcuaW9lPUlPRXhjZXB0aW9uIHdoaWxlIGxvYWRpbmcgcGVyc2lzdGVkIHNlc3Npb25zOiB7MH0KK2RlbHRhTWFuYWdlci5sb2FkaW5nLndpdGhDb250ZXh0Q2xhc3NMb2FkZXI9TWFuYWdlciBbezB9XTogTG9hZGluZyB0aGUgb2JqZWN0IGRhdGEgd2l0aCBhIGNvbnRleHQgY2xhc3MgbG9hZGVyLgorZGVsdGFNYW5hZ2VyLmxvYWRpbmcud2l0aG91dENsYXNzTG9hZGVyPU1hbmFnZXIgW3swfV06IExvYWRpbmcgdGhlIG9iamVjdCBkYXRhIHdpdGhvdXQgYSBjb250ZXh0IGNsYXNzIGxvYWRlci4KK2RlbHRhTWFuYWdlci5tYW5hZ2VyTG9hZD1FeGNlcHRpb24gbG9hZGluZyBzZXNzaW9ucyBmcm9tIHBlcnNpc3RlbnQgc3RvcmFnZQorZGVsdGFNYW5hZ2VyLm5vQ2x1c3Rlcj1TdGFydGluZy4uLiBubyBjbHVzdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQ6IFt7MH1dCitkZWx0YU1hbmFnZXIubm9NYXN0ZXJNZW1iZXI9U3RhcnRpbmcuLi4gd2l0aCBubyBvdGhlciBtZW1iZXIgZm9yIGNvbnRleHQgW3swfV0gYXQgZG9tYWluIFt7MX1dCitkZWx0YU1hbmFnZXIubm9NZW1iZXJzPU1hbmFnZXIgW3swfV06IHNraXBwaW5nIHN0YXRlIHRyYW5zZmVyLiBObyBtZW1iZXJzIGFjdGl2ZSBpbiBjbHVzdGVyIGdyb3VwLgorZGVsdGFNYW5hZ2VyLm5vU2Vzc2lvblN0YXRlPU1hbmFnZXIgW3swfV06IE5vIHNlc3Npb24gc3RhdGUgc2VuZCBhdCB7MX0gcmVjZWl2ZWQsIHRpbWluZyBvdXQgYWZ0ZXIgezJ9IG1zLgorZGVsdGFNYW5hZ2VyLm5vdFN0YXJ0ZWQ9TWFuYWdlciBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQKK2RlbHRhTWFuYWdlci5zZW5kTWVzc2FnZS5uZXdTZXNzaW9uPU1hbmFnZXIgW3swfV0gc2VuZCBuZXcgc2Vzc2lvbiAoezF9KQorZGVsdGFNYW5hZ2VyLmV4cGlyZVNlc3Npb25zPU1hbmFnZXIgW3swfV0gZXhwaXJpbmcgc2Vzc2lvbnMgdXBvbiBzaHV0ZG93bgorZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLmFjY2Vzc2VkPU1hbmFnZXIgW3swfV06IHJlY2VpdmVkIHNlc3Npb24gW3sxfV0gYWNjZXNzZWQuCitkZWx0YU1hbmFnZXIucmVjZWl2ZU1lc3NhZ2UuY3JlYXRlTmV3U2Vzc2lvbj1NYW5hZ2VyIFt7MH1dOiByZWNlaXZlZCBzZXNzaW9uIFt7MX1dIGNyZWF0ZWQuCitkZWx0YU1hbmFnZXIucmVjZWl2ZU1lc3NhZ2UuZGVsdGE9TWFuYWdlciBbezB9XTogcmVjZWl2ZWQgc2Vzc2lvbiBbezF9XSBkZWx0YS4KK2RlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS5lcnJvcj1NYW5hZ2VyIFt7MH1dOiBVbmFibGUgdG8gcmVjZWl2ZSBtZXNzYWdlIHRocm91Z2ggVENQIGNoYW5uZWwKK2RlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS5ldmVudFR5cGU9TWFuYWdlciBbezB9XTogUmVjZWl2ZWQgU2Vzc2lvbk1lc3NhZ2Ugb2YgdHlwZT0oezF9KSBmcm9tIFt7Mn1dCitkZWx0YU1hbmFnZXIucmVjZWl2ZU1lc3NhZ2UuZXhwaXJlZD1NYW5hZ2VyIFt7MH1dOiByZWNlaXZlZCBzZXNzaW9uIFt7MX1dIGV4cGlyZWQuCitkZWx0YU1hbmFnZXIucmVjZWl2ZU1lc3NhZ2UudHJhbnNmZXJjb21wbGV0ZT1NYW5hZ2VyIFt7MH1dIHJlY2VpdmVkIGZyb20gbm9kZSBbezF9OnsyfV0gc2Vzc2lvbiBzdGF0ZSB0cmFuc2ZlcmVkLgorZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLnVubG9hZGluZ0FmdGVyPU1hbmFnZXIgW3swfV06IHVubG9hZGluZyBzZXNzaW9ucyBjb21wbGV0ZQorZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLnVubG9hZGluZ0JlZ2luPU1hbmFnZXIgW3swfV06IHN0YXJ0IHVubG9hZGluZyBzZXNzaW9ucworZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLmFsbFNlc3Npb25EYXRhQWZ0ZXI9TWFuYWdlciBbezB9XTogc2Vzc2lvbiBzdGF0ZSBkZXNlcmlhbGl6ZWQKK2RlbHRhTWFuYWdlci5yZWNlaXZlTWVzc2FnZS5hbGxTZXNzaW9uRGF0YUJlZ2luPU1hbmFnZXIgW3swfV06IHJlY2VpdmVkIHNlc3Npb24gc3RhdGUgZGF0YQorZGVsdGFNYW5hZ2VyLnJlY2VpdmVNZXNzYWdlLmZyb21Xcm9uZ0RvbWFpbj1NYW5hZ2VyIFt7MH1dOiBSZWNlaXZlZCB3cm9uZyBTZXNzaW9uTWVzc2FnZSBvZiB0eXBlPSh7MX0pIGZyb20gW3syfV0gd2l0aCBkb21haW4gW3szfV0gKGxvY2FsZG9tYWluIFt7NH1dIAorZGVsdGFNYW5hZ2VyLnJlZ2lzdGVyQ2x1c3Rlcj1SZWdpc3RlciBtYW5hZ2VyIHswfSB0byBjbHVzdGVyIGVsZW1lbnQgezF9IHdpdGggbmFtZSB7Mn0KK2RlbHRhTWFuYWdlci5zZXNzaW9uUmVjZWl2ZWQ9TWFuYWdlciBbezB9XTsgc2Vzc2lvbiBzdGF0ZSBzZW5kIGF0IHsxfSByZWNlaXZlZCBpbiB7Mn0gbXMuCitkZWx0YU1hbmFnZXIuc2Vzc2lvblRpbWVvdXQ9SW52YWxpZCBzZXNzaW9uIHRpbWVvdXQgc2V0dGluZyB7MH0KK2RlbHRhTWFuYWdlci5zdGFydENsdXN0ZXJpbmc9U3RhcnRpbmcgY2x1c3RlcmluZyBtYW5hZ2VyIGF0IHswfQorZGVsdGFNYW5hZ2VyLnN0b3BwZWQ9TWFuYWdlciBbezB9XSBpcyBzdG9wcGluZworZGVsdGFNYW5hZ2VyLnVubG9hZGluZy5pb2U9SU9FeGNlcHRpb24gd2hpbGUgc2F2aW5nIHBlcnNpc3RlZCBzZXNzaW9uczogezB9CitkZWx0YU1hbmFnZXIud2FpdEZvclNlc3Npb25TdGF0ZT1NYW5hZ2VyIFt7MH1dLCByZXF1ZXN0aW5nIHNlc3Npb24gc3RhdGUgZnJvbSB7MX0uIFRoaXMgb3BlcmF0aW9uIHdpbGwgdGltZW91dCBpZiBubyBzZXNzaW9uIHN0YXRlIGhhcyBiZWVuIHJlY2VpdmVkIHdpdGhpbiA2MCBzZWNvbmRzLgorZGVsdGFSZXF1ZXN0LnNob3dQcmluY2lwYWw9UHJpbmNpcGFsIFt7MH1dIGlzIHNldCB0byBzZXNzaW9uIHsxfQorZGVsdGFSZXF1ZXN0Lndyb25nUHJpbmNpcGFsQ2xhc3M9RGVsdGFNYW5hZ2VyIG9ubHkgc3VwcG9ydCBHZW5lcmljUHJpbmNpcGFsLiBZb3VyIHJlYWxtIHVzZWQgcHJpbmNpcGFsIGNsYXNzIHswfS4KK2RlbHRhU2Vzc2lvbi5ub3RpZnlpbmc9Tm90aWZ5aW5nIGNsdXN0ZXIgb2YgZXhwaXJhdGlvbiBwcmltYXJ5PXswfSBzZXNzaW9uSWQgW3sxfV0KK2RlbHRhU2Vzc2lvbi52YWx1ZUJvdW5kLmV4PVNlc3Npb24gYm91bmQgbGlzdGVuZXIgdGhyb3cgYW4gZXhjZXB0aW9uCitkZWx0YVNlc3Npb24udmFsdWVCaW5kaW5nLmV4PVNlc3Npb24gYmluZGluZyBsaXN0ZW5lciB0aHJvdyBhbiBleGNlcHRpb24KK2RlbHRhU2Vzc2lvbi52YWx1ZVVuYm91bmQuZXg9U2Vzc2lvbiB1bmJvdW5kIGxpc3RlbmVyIHRocm93IGFuIGV4Y2VwdGlvbgorZGVsdGFTZXNzaW9uLnJlYWRTZXNzaW9uPXJlYWRPYmplY3QoKSBsb2FkaW5nIHNlc3Npb24gW3swfV0KK2RlbHRhU2Vzc2lvbi5yZWFkQXR0cmlidXRlPXNlc3Npb24gW3swfV0gbG9hZGluZyBhdHRyaWJ1dGUgJ3sxfScgd2l0aCB2YWx1ZSAnezJ9JworZGVsdGFTZXNzaW9uLndyaXRlU2Vzc2lvbj13cml0ZU9iamVjdCgpIHN0b3Jpbmcgc2Vzc2lvbiBbezB9XQoranZtUm91dGUuY2Fubm90RmluZFNlc3Npb249Q2FuJ3QgZmluZCBzZXNzaW9uIFt7MH1dCitqdm1Sb3V0ZS5jaGFuZ2VTZXNzaW9uPUNoYW5nZWQgc2Vzc2lvbiBmcm9tIFt7MH1dIHRvIFt7MX1dCitqdm1Sb3V0ZS5jbHVzdGVyTGlzdGVuZXIuc3RhcnRlZD1DbHVzdGVyIEp2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXIgc3RhcnRlZAoranZtUm91dGUuY2x1c3Rlckxpc3RlbmVyLnN0b3BwZWQ9Q2x1c3RlciBKdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyIHN0b3BwZWQKK2p2bVJvdXRlLmNvbmZpZ3VyZS53YXJuPVBsZWFzZSwgc2V0dXAgeW91ciBKdm1Sb3V0ZUJpbmRlclZhbHZlIGF0IGhvc3QgdmFsdmUsIG5vdCBhdCBjb250ZXh0IHZhbHZlIQoranZtUm91dGUuY29udGV4dE5vdEZvdW5kPUNvbnRleHQgW3swfV0gbm90IGZvdW5kIGF0IG5vZGUgW3sxfV0hCitqdm1Sb3V0ZS5mYWlsb3Zlcj1EZXRlY3RlZCBhIGZhaWxvdmVyIHdpdGggZGlmZmVyZW50IGp2bVJvdXRlIC0gb3JnaW5hbCByb3V0ZTogW3swfV0gbmV3IG9uZTogW3sxfV0gYXQgc2Vzc2lvbiBpZCBbezJ9XQoranZtUm91dGUuZm91bmRNYW5hZ2VyPUZvdW5kIENsdXN0ZXIgRGVsdGFNYW5hZ2VyIHswfSBhdCB7MX0KK2p2bVJvdXRlLmhvc3ROb3RGb3VuZD1ObyBob3N0IGZvdW5kIFt7MH1dCitqdm1Sb3V0ZS5saXN0ZW5lci5zdGFydGVkPVNlc3Npb25JRCBCaW5kZXIgTGlzdGVuZXIgc3RhcnRlZAoranZtUm91dGUubGlzdGVuZXIuc3RvcHBlZD1TZXNzaW9uSUQgQmluZGVyIExpc3RlbmVyIHN0b3BwZWQKK2p2bVJvdXRlLmxvc3RTZXNzaW9uPUxvc3QgU2Vzc2lvbiBbezB9XSBhdCBwYXRoIFt7MX1dCitqdm1Sb3V0ZS5taXNzaW5nSnZtUm91dGVBdHRyaWJ1dGU9Tm8gZW5naW5lIGp2bVJvdXRlIGF0dHJpYnV0ZSBjb25maWd1cmVkIQoranZtUm91dGUubmV3U2Vzc2lvbkNvb2tpZT1TZXR0aW5nIGNvb2tpZSB3aXRoIHNlc3Npb24gaWQgW3swfV0gbmFtZTogW3sxfV0gcGF0aDogW3syfV0gc2VjdXJlOiBbezN9XQoranZtUm91dGUubm90Rm91bmRNYW5hZ2VyPU5vdCBmb3VuZCBDbHVzdGVyIERlbHRhTWFuYWdlciB7MH0gYXQgezF9Citqdm1Sb3V0ZS5yZWNlaXZlTWVzc2FnZS5zZXNzaW9uSURDaGFuZ2VkPUNsdXN0ZXIgSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lciByZWNlaXZlZCBvcmdpbmFsIHNlc3Npb24gSUQgW3swfV0gc2V0IHRvIG5ldyBpZCBbezF9XSBmb3IgY29udGV4dCBwYXRoIFt7Mn1dCitqdm1Sb3V0ZS5ydW4uYWxyZWFkeT1qdm1Sb3V0ZSBTZXNzaW9uSUQgcmVjZWl2ZXIgcnVuIGFscmVhZHkKK2p2bVJvdXRlLnNraXBVUkxTZXNzaW9uSURzPVNraXAgcmVhc3NpZ24ganZtIHJvdXRlIGNoZWNrLCBzZXNzaW9uaWQgY29tZXMgZnJvbSBVUkwhCitqdm1Sb3V0ZS50dXJub3ZlckluZm89VHVybm92ZXIgQ2hlY2sgdGltZSB7MH0gbXNlYworanZtUm91dGUudmFsdmUuYWxyZWFkeVN0YXJ0ZWQ9anZtUm91dGUgYmFja3VwIHNlc3Npb25JRCBjb3JyZWN0aW9uIGlzIHN0YXJ0ZWQKK2p2bVJvdXRlLnZhbHZlLm5vdFN0YXJ0ZWQ9anZtUm91dGUgYmFja3VwIHNlc3Npb25JRCBjb3JyZWN0aW9uIHJ1biBhbHJlYWR5Citqdm1Sb3V0ZS52YWx2ZS5zdGFydGVkPUp2bVJvdXRlQmluZGVyVmFsdmUgc3RhcnRlZAoranZtUm91dGUudmFsdmUuc3RvcHBlZD1Kdm1Sb3V0ZUJpbmRlclZhbHZlIHN0b3BwZWQKK2p2bVJvdXRlLnNldC5vcmlnbmFsc2Vzc2lvbmlkPVNldCBPcmdpbmFsIFNlc3Npb24gaWQgYXQgcmVxdWVzdCBhdHRyaXV0ZSB7MH0gdmFsdWU6IHsxfQorc3RhbmRhcmRTZXNzaW9uLmdldElkLmlzZT1nZXRJZDogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uYXR0cmlidXRlRXZlbnQ9U2Vzc2lvbiBhdHRyaWJ1dGUgZXZlbnQgbGlzdGVuZXIgdGhyZXcgZXhjZXB0aW9uCitzdGFuZGFyZFNlc3Npb24uYXR0cmlidXRlRXZlbnQ9U2Vzc2lvbiBhdHRyaWJ1dGUgZXZlbnQgbGlzdGVuZXIgdGhyZXcgZXhjZXB0aW9uCitzdGFuZGFyZFNlc3Npb24uYmluZGluZ0V2ZW50PVNlc3Npb24gYmluZGluZyBldmVudCBsaXN0ZW5lciB0aHJldyBleGNlcHRpb24KK3N0YW5kYXJkU2Vzc2lvbi5pbnZhbGlkYXRlLmlzZT1pbnZhbGlkYXRlOiBTZXNzaW9uIGFscmVhZHkgaW52YWxpZGF0ZWQKK3N0YW5kYXJkU2Vzc2lvbi5pc05ldy5pc2U9aXNOZXc6IFNlc3Npb24gYWxyZWFkeSBpbnZhbGlkYXRlZAorc3RhbmRhcmRTZXNzaW9uLmdldEF0dHJpYnV0ZS5pc2U9Z2V0QXR0cmlidXRlOiBTZXNzaW9uIGFscmVhZHkgaW52YWxpZGF0ZWQKK3N0YW5kYXJkU2Vzc2lvbi5nZXRBdHRyaWJ1dGVOYW1lcy5pc2U9Z2V0QXR0cmlidXRlTmFtZXM6IFNlc3Npb24gYWxyZWFkeSBpbnZhbGlkYXRlZAorc3RhbmRhcmRTZXNzaW9uLmdldENyZWF0aW9uVGltZS5pc2U9Z2V0Q3JlYXRpb25UaW1lOiBTZXNzaW9uIGFscmVhZHkgaW52YWxpZGF0ZWQKK3N0YW5kYXJkU2Vzc2lvbi5nZXRMYXN0QWNjZXNzZWRUaW1lLmlzZT1nZXRMYXN0QWNjZXNzZWRUaW1lOiBTZXNzaW9uIGFscmVhZHkgaW52YWxpZGF0ZWQKK3N0YW5kYXJkU2Vzc2lvbi5nZXRJZC5pc2U9Z2V0SWQ6IFNlc3Npb24gYWxyZWFkeSBpbnZhbGlkYXRlZAorc3RhbmRhcmRTZXNzaW9uLmdldE1heEluYWN0aXZlSW50ZXJ2YWwuaXNlPWdldE1heEluYWN0aXZlSW50ZXJ2YWw6IFNlc3Npb24gYWxyZWFkeSBpbnZhbGlkYXRlZAorc3RhbmRhcmRTZXNzaW9uLmdldFZhbHVlTmFtZXMuaXNlPWdldFZhbHVlTmFtZXM6IFNlc3Npb24gYWxyZWFkeSBpbnZhbGlkYXRlZAorc3RhbmRhcmRTZXNzaW9uLm5vdFNlcmlhbGl6YWJsZT1DYW5ub3Qgc2VyaWFsaXplIHNlc3Npb24gYXR0cmlidXRlIHswfSBmb3Igc2Vzc2lvbiB7MX0KK3N0YW5kYXJkU2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUuaXNlPXJlbW92ZUF0dHJpYnV0ZTogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uc2Vzc2lvbkV2ZW50PVNlc3Npb24gZXZlbnQgbGlzdGVuZXIgdGhyZXcgZXhjZXB0aW9uCitzdGFuZGFyZFNlc3Npb24uc2V0QXR0cmlidXRlLmlhZT1zZXRBdHRyaWJ1dGU6IE5vbi1zZXJpYWxpemFibGUgYXR0cmlidXRlCitzdGFuZGFyZFNlc3Npb24uc2V0QXR0cmlidXRlLmlzZT1zZXRBdHRyaWJ1dGU6IFNlc3Npb24gYWxyZWFkeSBpbnZhbGlkYXRlZAorc3RhbmRhcmRTZXNzaW9uLnNldEF0dHJpYnV0ZS5uYW1lbnVsbD1zZXRBdHRyaWJ1dGU6IG5hbWUgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsCitzdGFuZGFyZFNlc3Npb24uc2Vzc2lvbkNyZWF0ZWQ9Q3JlYXRlZCBTZXNzaW9uIGlkID0gezB9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL1JlcGxpY2F0ZWRTZXNzaW9uLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL1JlcGxpY2F0ZWRTZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1OWYyZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vUmVwbGljYXRlZFNlc3Npb24uamF2YQpAQCAtMCwwICsxLDI4NiBAQAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnNlc3Npb247CisKKy8qKgorICogVGl0bGU6ICAgICAgICBUb21jYXQgU2Vzc2lvbiBSZXBsaWNhdGlvbiBmb3IgVG9tY2F0IDQuMCA8QlI+CisgKiBEZXNjcmlwdGlvbjogIEEgdmVyeSBzaW1wbGUgc3RyYWlnaHQgZm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZgorICogICAgICAgICAgICAgICBzZXNzaW9uIHJlcGxpY2F0aW9uIG9mIHNlcnZlcnMgaW4gYSBjbHVzdGVyLjxCUj4KKyAqICAgICAgICAgICAgICAgVGhpcyBzZXNzaW9uIHJlcGxpY2F0aW9uIGlzIGltcGxlbWVudGVkICJsaXZlIi4gQnkgbGl2ZQorICogICAgICAgICAgICAgICBJIG1lYW4sIHdoZW4gYSBzZXNzaW9uIGF0dHJpYnV0ZSBpcyBhZGRlZCBpbnRvIGEgc2Vzc2lvbiBvbiBOb2RlIEEKKyAqICAgICAgICAgICAgICAgYSBtZXNzYWdlIGlzIGJyb2FkY2FzdGVkIHRvIG90aGVyIG1lc3NhZ2VzIGFuZCBzZXRBdHRyaWJ1dGUgaXMgY2FsbGVkIG9uIHRoZSByZXBsaWNhdGVkCisgKiAgICAgICAgICAgICAgIHNlc3Npb25zLjxCUj4KKyAqICAgICAgICAgICAgICAgQSBmdWxsIGRlc2NyaXB0aW9uIG9mIHRoaXMgaW1wbGVtZW50YXRpb24gY2FuIGJlIGZvdW5kIHVuZGVyCisgKiAgICAgICAgICAgICAgIDxocmVmPSJodHRwOi8vd3d3LmZpbGlwLm5ldC90b21jYXQvIj5GaWxpcCdzIFRvbWNhdCBQYWdlPC9hPjxCUj4KKyAqCisgKiBDb3B5cmlnaHQ6ICAgIFNlZSBhcGFjaGUgbGljZW5zZQorICogQGF1dGhvciAgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBEZXNjcmlwdGlvbjo8QlI+CisgKiBUaGUgUmVwbGljYXRlZFNlc3Npb24gY2xhc3MgaXMgYSBzaW1wbGUgZXh0ZW5zaW9uIG9mIHRoZSBTdGFuZGFyZFNlc3Npb24gY2xhc3MKKyAqIEl0IG92ZXJyaWRlcyBhIGZldyBtZXRob2RzIChzZXRBdHRyaWJ1dGUsIHJlbW92ZUF0dHJpYnV0ZSwgZXhwaXJlLCBhY2Nlc3MpIGFuZCBoYXMKKyAqIGhvb2tzIGludG8gdGhlIEluTWVtb3J5UmVwbGljYXRpb25NYW5hZ2VyIHRvIGJyb2FkY2FzdCBhbmQgcmVjZWl2ZSBldmVudHMgZnJvbSB0aGUgY2x1c3Rlci48QlI+CisgKiBUaGlzIGNsYXNzIGluaGVyaXRzIHRoZSByZWFkT2JqZWN0RGF0YSBhbmQgd3JpdGVPYmplY3QgZGF0YSBtZXRob2RzIGZyb20gdGhlIFN0YW5kYXJkU2Vzc2lvbgorICogYW5kIGRvZXMgbm90IGNvbnRhaW4gYW55IHNlcmlhbGl6YWJsZSBlbGVtZW50cyBpbiBhZGRpdGlvbiB0byB0aGUgaW5oZXJpdGVkIG9uZXMgZnJvbSB0aGUgU3RhbmRhcmRTZXNzaW9uCisgKgorICovCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKKworcHVibGljIGNsYXNzIFJlcGxpY2F0ZWRTZXNzaW9uIGV4dGVuZHMgb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlN0YW5kYXJkU2Vzc2lvbgoraW1wbGVtZW50cyBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJTZXNzaW9ueworCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgTWFuYWdlciBtTWFuYWdlciA9IG51bGw7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEaXJ0eSA9IGZhbHNlOworICAgIHByaXZhdGUgdHJhbnNpZW50IGxvbmcgbGFzdEFjY2Vzc1dhc0Rpc3RyaWJ1dGVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzUHJpbWFyeVNlc3Npb249dHJ1ZTsKKyAgICAKKworICAgIHB1YmxpYyBSZXBsaWNhdGVkU2Vzc2lvbihNYW5hZ2VyIG1hbmFnZXIpIHsKKyAgICAgICAgc3VwZXIobWFuYWdlcik7CisgICAgICAgIG1NYW5hZ2VyID0gbWFuYWdlcjsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRGlydHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SXNEaXJ0eShib29sZWFuIGRpcnR5KQorICAgIHsKKyAgICAgICAgaXNEaXJ0eSA9IGRpcnR5OworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0TGFzdEFjY2Vzc1dhc0Rpc3RyaWJ1dGVkKGxvbmcgdGltZSkgeworICAgICAgICBsYXN0QWNjZXNzV2FzRGlzdHJpYnV0ZWQgPSB0aW1lOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldExhc3RBY2Nlc3NXYXNEaXN0cmlidXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGxhc3RBY2Nlc3NXYXNEaXN0cmlidXRlZDsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworICAgICAgICBzZXRJc0RpcnR5KHRydWUpOworICAgICAgICBzdXBlci5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIHBhcmVudCBkZXNjcmlwdGlvbiwKKyAgICAgKiBwbHVzIHdlIGFsc28gbm90aWZ5IG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lLCBib29sZWFuIG5vdGlmeSkgeworICAgICAgICBzZXRJc0RpcnR5KHRydWUpOworICAgICAgICBzdXBlci5yZW1vdmVBdHRyaWJ1dGUobmFtZSxub3RpZnkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyBhbiBhdHRyaWJ1dGUgYW5kIG5vdGlmaWVzIHRoZSBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKCB2YWx1ZSA9PSBudWxsICkgeworICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBqYXZhLmlvLlNlcmlhbGl6YWJsZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgZm9yIGF0dHJpYnV0ZSAiK25hbWUrIiBpcyBub3Qgc2VyaWFsaXphYmxlLiIpOworICAgICAgICBzZXRJc0RpcnR5KHRydWUpOworICAgICAgICBzdXBlci5zZXRBdHRyaWJ1dGUobmFtZSx2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWF4SW5hY3RpdmVJbnRlcnZhbChpbnQgaW50ZXJ2YWwpIHsKKyAgICAgICAgc2V0SXNEaXJ0eSh0cnVlKTsKKyAgICAgICAgc3VwZXIuc2V0TWF4SW5hY3RpdmVJbnRlcnZhbChpbnRlcnZhbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYW5hZ2VyIGZvciB0aGlzIHNlc3Npb24KKyAgICAgKiBAcGFyYW0gbWdyIC0gdGhlIHNlcnZlcnMgSW5NZW1vcnlSZXBsaWNhdGlvbk1hbmFnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlciBtZ3IpCisgICAgeworICAgICAgICBtTWFuYWdlciA9IG1ncjsKKyAgICAgICAgc3VwZXIuc2V0TWFuYWdlcihtZ3IpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNlc3Npb24uCisgICAgICogVGhpcyBwcm92aWRlcyBhbiA8Y29kZT5BdXRoZW50aWNhdG9yPC9jb2RlPiB3aXRoIGEgbWVhbnMgdG8gY2FjaGUgYQorICAgICAqIHByZXZpb3VzbHkgYXV0aGVudGljYXRlZCBQcmluY2lwYWwsIGFuZCBhdm9pZCBwb3RlbnRpYWxseSBleHBlbnNpdmUKKyAgICAgKiA8Y29kZT5SZWFsbS5hdXRoZW50aWNhdGUoKTwvY29kZT4gY2FsbHMgb24gZXZlcnkgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmluY2lwYWwgVGhlIG5ldyBQcmluY2lwYWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmluY2lwYWwoUHJpbmNpcGFsIHByaW5jaXBhbCkgeworICAgICAgICBzdXBlci5zZXRQcmluY2lwYWwocHJpbmNpcGFsKTsKKyAgICAgICAgc2V0SXNEaXJ0eSh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBleHBpcmUoKSB7CisgICAgICAgIFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlciBtZ3IgPShTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIpZ2V0TWFuYWdlcigpOworICAgICAgICBtZ3Iuc2Vzc2lvbkludmFsaWRhdGVkKGdldElkSW50ZXJuYWwoKSk7CisgICAgICAgIHNldElzRGlydHkodHJ1ZSk7CisgICAgICAgIHN1cGVyLmV4cGlyZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgIFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlciBtZ3IgPShTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIpZ2V0TWFuYWdlcigpOworICAgICAgICBtZ3Iuc2Vzc2lvbkludmFsaWRhdGVkKGdldElkSW50ZXJuYWwoKSk7CisgICAgICAgIHNldElzRGlydHkodHJ1ZSk7CisgICAgICAgIHN1cGVyLmludmFsaWRhdGUoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlYWQgYSBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc2Vzc2lvbiBvYmplY3QgZnJvbQorICAgICAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlucHV0IHN0cmVhbSwgd2l0aG91dCByZXF1aXJpbmcgdGhhdCB0aGUKKyAgICAgKiBTdGFuZGFyZFNlc3Npb24gaXRzZWxmIGhhdmUgYmVlbiBzZXJpYWxpemVkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmVhbSBUaGUgb2JqZWN0IGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiB1bmtub3duIGNsYXNzIGlzIHNwZWNpZmllZAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlYWRPYmplY3REYXRhKE9iamVjdElucHV0U3RyZWFtIHN0cmVhbSkKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5yZWFkT2JqZWN0RGF0YShzdHJlYW0pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgY29udGVudHMgb2YgdGhpcyBzZXNzaW9uIG9iamVjdCB0bworICAgICAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0IG91dHB1dCBzdHJlYW0sIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgdGhlCisgICAgICogU3RhbmRhcmRTZXNzaW9uIGl0c2VsZiBoYXZlIGJlZW4gc2VyaWFsaXplZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIG9iamVjdCBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRvCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZU9iamVjdERhdGEoT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci53cml0ZU9iamVjdERhdGEoc3RyZWFtKTsKKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQsIGJvb2xlYW4gdGVsbE5ldykgeworCisgICAgICAgIGlmICgodGhpcy5pZCAhPSBudWxsKSAmJiAobWFuYWdlciAhPSBudWxsKSkKKyAgICAgICAgICAgIG1hbmFnZXIucmVtb3ZlKHRoaXMpOworCisgICAgICAgIHRoaXMuaWQgPSBpZDsKKworICAgICAgICBpZiAobWFuYWdlciAhPSBudWxsKQorICAgICAgICAgICAgbWFuYWdlci5hZGQodGhpcyk7CisgICAgICAgIGlmICh0ZWxsTmV3KSB0ZWxsTmV3KCk7CisgICAgfQorICAgIAorICAgIAorCisKKworCisKKworICAgIC8qKgorICAgICAqIHJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlc3Npb24gaXMgdGhlIHByaW1hcnkgc2Vzc2lvbiwgaWYgdGhhdCBpcyB0aGUKKyAgICAgKiBjYXNlLCB0aGUgbWFuYWdlciBjYW4gZXhwaXJlIGl0IHVwb24gdGltZW91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnlTZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gaXNQcmltYXJ5U2Vzc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgdGhpcyBpcyB0aGUgcHJpbWFyeSBzZXNzaW9uIG9yIG5vdC4KKyAgICAgKiBAcGFyYW0gcHJpbWFyeVNlc3Npb24gRmxhZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlTZXNzaW9uKGJvb2xlYW4gcHJpbWFyeVNlc3Npb24pIHsKKyAgICAgICAgdGhpcy5pc1ByaW1hcnlTZXNzaW9uPXByaW1hcnlTZXNzaW9uOworICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqIEltcGxlbWVudHMgYSBsb2cgbWV0aG9kIHRvIGxvZyB0aHJvdWdoIHRoZSBtYW5hZ2VyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisKKyAgICAgICAgaWYgKChtTWFuYWdlciAhPSBudWxsKSAmJiAobU1hbmFnZXIgaW5zdGFuY2VvZiBTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIpKSB7CisgICAgICAgICAgICAoKFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlcikgbU1hbmFnZXIpLmxvZy5kZWJ1ZygiUmVwbGljYXRlZFNlc3Npb246ICIgKyBtZXNzYWdlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVwbGljYXRlZFNlc3Npb246ICIgKyBtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgeCkgeworCisgICAgICAgIGlmICgobU1hbmFnZXIgIT0gbnVsbCkgJiYgKG1NYW5hZ2VyIGluc3RhbmNlb2YgU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyKSkgeworICAgICAgICAgICAgKChTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIpIG1NYW5hZ2VyKS5sb2cuZXJyb3IoIlJlcGxpY2F0ZWRTZXNzaW9uOiAiICsgbWVzc2FnZSx4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVwbGljYXRlZFNlc3Npb246ICIgKyBtZXNzYWdlKTsKKyAgICAgICAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJSZXBsaWNhdGVkU2Vzc2lvbiBpZD0iKTsKKyAgICAgICAgYnVmLmFwcGVuZChnZXRJZEludGVybmFsKCkpLmFwcGVuZCgiIHJlZj0iKS5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSkuYXBwZW5kKCJcbiIpOworICAgICAgICBqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IGdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgICAgIHdoaWxlICggZS5oYXNNb3JlRWxlbWVudHMoKSApIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcdG5hbWU9IikuYXBwZW5kKG5hbWUpLmFwcGVuZCgiOyB2YWx1ZT0iKS5hcHBlbmQodmFsdWUpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCJcdExhc3RBY2Nlc3M9IikuYXBwZW5kKGdldExhc3RBY2Nlc3NlZFRpbWUoKSkuYXBwZW5kKCJcbiIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorICAgIHB1YmxpYyBpbnQgZ2V0QWNjZXNzQ291bnQoKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3NDb3VudDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0QWNjZXNzQ291bnQoaW50IGFjY2Vzc0NvdW50KSB7CisgICAgICAgIHRoaXMuYWNjZXNzQ291bnQgPSBhY2Nlc3NDb3VudDsKKyAgICB9CisgICAgcHVibGljIGxvbmcgZ2V0TGFzdEFjY2Vzc2VkVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIGxhc3RBY2Nlc3NlZFRpbWU7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldExhc3RBY2Nlc3NlZFRpbWUobG9uZyBsYXN0QWNjZXNzZWRUaW1lKSB7CisgICAgICAgIHRoaXMubGFzdEFjY2Vzc2VkVGltZSA9IGxhc3RBY2Nlc3NlZFRpbWU7CisgICAgfQorICAgIHB1YmxpYyBsb25nIGdldFRoaXNBY2Nlc3NlZFRpbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzQWNjZXNzZWRUaW1lOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRUaGlzQWNjZXNzZWRUaW1lKGxvbmcgdGhpc0FjY2Vzc2VkVGltZSkgeworICAgICAgICB0aGlzLnRoaXNBY2Nlc3NlZFRpbWUgPSB0aGlzQWNjZXNzZWRUaW1lOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9TZXJpYWxpemFibGVQcmluY2lwYWwuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vU2VyaWFsaXphYmxlUHJpbmNpcGFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyNDBmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vU2VyaWFsaXphYmxlUHJpbmNpcGFsLmphdmEKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5zZXNzaW9uOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG07CisKKworLyoqCisgKiBHZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+amF2YS5zZWN1cml0eS5QcmluY2lwYWw8L3N0cm9uZz4gdGhhdAorICogaXMgYXZhaWxhYmxlIGZvciB1c2UgYnkgPGNvZGU+UmVhbG08L2NvZGU+IGltcGxlbWVudGF0aW9ucy4KKyAqIFRoZSBHZW5lcmljUHJpbmNpcGFsIGRvZXMgTk9UIGltcGxlbWVudCBzZXJpYWxpemFibGUgYW5kIEkgZGlkbid0IHdhbnQgdG8gY2hhbmdlIHRoYXQgaW1wbGVtZW50YXRpb24KKyAqIGhlbmNlIEkgaW1wbGVtZW50ZWQgdGhpcyBvbmUgaW5zdGVhZC4KKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkdlbmVyaWNQcmluY2lwYWw7CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKK3B1YmxpYyBjbGFzcyBTZXJpYWxpemFibGVQcmluY2lwYWwgIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworICAgIHB1YmxpYyBTZXJpYWxpemFibGVQcmluY2lwYWwoKQorICAgIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFByaW5jaXBhbCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgUmVhbG0sIGZvciB0aGUKKyAgICAgKiBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWxtIFRoZSBSZWFsbSB0aGF0IG93bnMgdGhpcyBQcmluY2lwYWwKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdXNlcm5hbWUgb2YgdGhlIHVzZXIgcmVwcmVzZW50ZWQgYnkgdGhpcyBQcmluY2lwYWwKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgQ3JlZGVudGlhbHMgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhpcyB1c2VyCisgICAgICovCisgICAgcHVibGljIFNlcmlhbGl6YWJsZVByaW5jaXBhbChSZWFsbSByZWFsbSwgU3RyaW5nIG5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworCisgICAgICAgIHRoaXMocmVhbG0sIG5hbWUsIHBhc3N3b3JkLCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFByaW5jaXBhbCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgUmVhbG0sIGZvciB0aGUKKyAgICAgKiBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLCB3aXRoIHRoZSBzcGVjaWZpZWQgcm9sZSBuYW1lcworICAgICAqIChhcyBTdHJpbmdzKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFsbSBUaGUgUmVhbG0gdGhhdCBvd25zIHRoaXMgcHJpbmNpcGFsCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHVzZXJuYW1lIG9mIHRoZSB1c2VyIHJlcHJlc2VudGVkIGJ5IHRoaXMgUHJpbmNpcGFsCisgICAgICogQHBhcmFtIHBhc3N3b3JkIENyZWRlbnRpYWxzIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgdXNlcgorICAgICAqIEBwYXJhbSByb2xlcyBMaXN0IG9mIHJvbGVzIChtdXN0IGJlIFN0cmluZ3MpIHBvc3Nlc3NlZCBieSB0aGlzIHVzZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VyaWFsaXphYmxlUHJpbmNpcGFsKFJlYWxtIHJlYWxtLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Qgcm9sZXMpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLnJlYWxtID0gcmVhbG07CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICAgICAgaWYgKHJvbGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucm9sZXMgPSBuZXcgU3RyaW5nW3JvbGVzLnNpemUoKV07CisgICAgICAgICAgICB0aGlzLnJvbGVzID0gKFN0cmluZ1tdKSByb2xlcy50b0FycmF5KHRoaXMucm9sZXMpOworICAgICAgICAgICAgaWYgKHRoaXMucm9sZXMubGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgICBBcnJheXMuc29ydCh0aGlzLnJvbGVzKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHVzZXJuYW1lIG9mIHRoZSB1c2VyIHJlcHJlc2VudGVkIGJ5IHRoaXMgUHJpbmNpcGFsLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5uYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscyBmb3IgdGhlIHVzZXIgcmVwcmVzZW50ZWQgYnkKKyAgICAgKiB0aGlzIFByaW5jaXBhbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wYXNzd29yZCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgUmVhbG0gd2l0aCB3aGljaCB0aGlzIFByaW5jaXBhbCBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgUmVhbG0gcmVhbG0gPSBudWxsOworCisgICAgcHVibGljIFJlYWxtIGdldFJlYWxtKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucmVhbG0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlYWxtKFJlYWxtIHJlYWxtKSB7CisgICAgICAgIHRoaXMucmVhbG0gPSByZWFsbTsKKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByb2xlc1tdID0gbmV3IFN0cmluZ1swXTsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRSb2xlcygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnJvbGVzKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LCB3aGljaCBleHBvc2VzIG9ubHkKKyAgICAgKiBpbmZvcm1hdGlvbiB0aGF0IHNob3VsZCBiZSBwdWJsaWMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJTZXJpYWxpemFibGVQcmluY2lwYWxbIik7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLm5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2VyaWFsaXphYmxlUHJpbmNpcGFsIGNyZWF0ZVByaW5jaXBhbChHZW5lcmljUHJpbmNpcGFsIHByaW5jaXBhbCkKKyAgICB7CisgICAgICAgIGlmICggcHJpbmNpcGFsPT1udWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemFibGVQcmluY2lwYWwocHJpbmNpcGFsLmdldFJlYWxtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW5jaXBhbC5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW5jaXBhbC5nZXRQYXNzd29yZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmluY2lwYWwuZ2V0Um9sZXMoKSE9bnVsbD9BcnJheXMuYXNMaXN0KHByaW5jaXBhbC5nZXRSb2xlcygpKTpudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR2VuZXJpY1ByaW5jaXBhbCBnZXRQcmluY2lwYWwoIFJlYWxtIHJlYWxtICkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY1ByaW5jaXBhbChyZWFsbSxuYW1lLHBhc3N3b3JkLGdldFJvbGVzKCkhPW51bGw/QXJyYXlzLmFzTGlzdChnZXRSb2xlcygpKTpudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBHZW5lcmljUHJpbmNpcGFsIHJlYWRQcmluY2lwYWwoT2JqZWN0SW5wdXQgaW4sIFJlYWxtIHJlYWxtKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbnsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkVVRGKCk7CisgICAgICAgIGJvb2xlYW4gaGFzUHdkID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgU3RyaW5nIHB3ZCA9IG51bGw7CisgICAgICAgIGlmICggaGFzUHdkICkgcHdkID0gaW4ucmVhZFVURigpOworICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgU3RyaW5nW10gcm9sZXMgPSBuZXcgU3RyaW5nW3NpemVdOworICAgICAgICBmb3IgKCBpbnQgaT0wOyBpPHNpemU7IGkrKyApIHJvbGVzW2ldID0gaW4ucmVhZFVURigpOworICAgICAgICByZXR1cm4gbmV3IEdlbmVyaWNQcmluY2lwYWwocmVhbG0sbmFtZSxwd2QsQXJyYXlzLmFzTGlzdChyb2xlcykpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVQcmluY2lwYWwoR2VuZXJpY1ByaW5jaXBhbCBwLCBPYmplY3RPdXRwdXQgb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZVVURihwLmdldE5hbWUoKSk7CisgICAgICAgIG91dC53cml0ZUJvb2xlYW4ocC5nZXRQYXNzd29yZCgpIT1udWxsKTsKKyAgICAgICAgaWYgKCBwLmdldFBhc3N3b3JkKCkhPSBudWxsICkgb3V0LndyaXRlVVRGKHAuZ2V0UGFzc3dvcmQoKSk7CisgICAgICAgIFN0cmluZ1tdIHJvbGVzID0gcC5nZXRSb2xlcygpOworICAgICAgICBpZiAoIHJvbGVzID09IG51bGwgKSByb2xlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIG91dC53cml0ZUludChyb2xlcy5sZW5ndGgpOworICAgICAgICBmb3IgKCBpbnQgaT0wOyBpPHJvbGVzLmxlbmd0aDsgaSsrICkgb3V0LndyaXRlVVRGKHJvbGVzW2ldKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9TZXNzaW9uSURNZXNzYWdlLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL1Nlc3Npb25JRE1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2QzZTAzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9TZXNzaW9uSURNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5zZXNzaW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJNZXNzYWdlQmFzZTsKKworLyoqCisgKiBTZXNzaW9uIGlkIGNoYW5nZSBjbHVzdGVyIG1lc3NhZ2UKKyAqIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgU2Vzc2lvbklETWVzc2FnZSBleHRlbmRzIENsdXN0ZXJNZXNzYWdlQmFzZSBpbXBsZW1lbnRzIENsdXN0ZXJNZXNzYWdlIHsKKworCXByaXZhdGUgaW50IG1lc3NhZ2VOdW1iZXI7CisKKwlwcml2YXRlIFN0cmluZyBvcmlnbmFsU2Vzc2lvbklEOworCisJcHJpdmF0ZSBTdHJpbmcgYmFja3VwU2Vzc2lvbklEOworCisJcHJpdmF0ZSBTdHJpbmcgaG9zdCA7CisJcHJpdmF0ZSBTdHJpbmcgY29udGV4dFBhdGg7CisKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRPcmlnbmFsU2Vzc2lvbklEKCkpOworCQlyZXN1bHQuYXBwZW5kKCIjLSMiKTsKKwkJcmVzdWx0LmFwcGVuZChnZXRIb3N0KCkpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiMtIyIpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZ2V0Q29udGV4dFBhdGgoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiMtIyIpOworCQlyZXN1bHQuYXBwZW5kKGdldE1lc3NhZ2VOdW1iZXIoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiMtIyIpOworCQlyZXN1bHQuYXBwZW5kKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaG9zdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7CisgICAgICAgIHJldHVybiBob3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBob3N0IFRoZSBob3N0IHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgfQorICAgIAorCS8qKgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29udGV4dFBhdGguCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpIHsKKwkJcmV0dXJuIGNvbnRleHRQYXRoOworCX0KKwkvKioKKwkgKiBAcGFyYW0gY29udGV4dFBhdGggVGhlIGNvbnRleHRQYXRoIHRvIHNldC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb250ZXh0UGF0aChTdHJpbmcgY29udGV4dFBhdGgpIHsKKwkJdGhpcy5jb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoOworCX0KKwkvKioKKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1lc3NhZ2VOdW1iZXIuCisJICovCisJcHVibGljIGludCBnZXRNZXNzYWdlTnVtYmVyKCkgeworCQlyZXR1cm4gbWVzc2FnZU51bWJlcjsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbWVzc2FnZU51bWJlcgorCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2VOdW1iZXIgdG8gc2V0LgorCSAqLworCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VOdW1iZXIoaW50IG1lc3NhZ2VOdW1iZXIpIHsKKwkJdGhpcy5tZXNzYWdlTnVtYmVyID0gbWVzc2FnZU51bWJlcjsKKwl9CisKKwkKKwkvKioKKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGJhY2t1cFNlc3Npb25JRC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEJhY2t1cFNlc3Npb25JRCgpIHsKKwkJcmV0dXJuIGJhY2t1cFNlc3Npb25JRDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYmFja3VwU2Vzc2lvbklECisJICogICAgICAgICAgICBUaGUgYmFja3VwU2Vzc2lvbklEIHRvIHNldC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCYWNrdXBTZXNzaW9uSUQoU3RyaW5nIGJhY2t1cFNlc3Npb25JRCkgeworCQl0aGlzLmJhY2t1cFNlc3Npb25JRCA9IGJhY2t1cFNlc3Npb25JRDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9yaWduYWxTZXNzaW9uSUQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRPcmlnbmFsU2Vzc2lvbklEKCkgeworCQlyZXR1cm4gb3JpZ25hbFNlc3Npb25JRDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gb3JpZ25hbFNlc3Npb25JRAorCSAqICAgICAgICAgICAgVGhlIG9yaWduYWxTZXNzaW9uSUQgdG8gc2V0LgorCSAqLworCXB1YmxpYyB2b2lkIHNldE9yaWduYWxTZXNzaW9uSUQoU3RyaW5nIG9yaWduYWxTZXNzaW9uSUQpIHsKKwkJdGhpcy5vcmlnbmFsU2Vzc2lvbklEID0gb3JpZ25hbFNlc3Npb25JRDsKKwl9CisKKyAgICAKKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vU2Vzc2lvbk1lc3NhZ2UuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vU2Vzc2lvbk1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDA4NjU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9TZXNzaW9uTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5zZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3Rlck1lc3NhZ2U7CisKKy8qKgorICoKKyAqIDxCPkNsYXNzIERlc2NyaXB0aW9uOjwvQj48QlI+CisgKiBUaGUgU2Vzc2lvbk1lc3NhZ2UgY2xhc3MgaXMgYSBjbGFzcyB0aGF0IGlzIHVzZWQgd2hlbiBhIHNlc3Npb24gaGFzIGJlZW4KKyAqIGNyZWF0ZWQsIG1vZGlmaWVkLCBleHBpcmVkIGluIGEgVG9tY2F0IGNsdXN0ZXIgbm9kZS48QlI+CisgKgorICogVGhlIGZvbGxvd2luZyBldmVudHMgYXJlIGN1cnJlbnRseSBhdmFpbGFibGU6CisgKiA8dWw+CisgKiAgIDxsaT48cHJlPnB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9TRVNTSU9OX0NSRUFURUQ8L3ByZT48bGk+CisgKiAgIDxsaT48cHJlPnB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9TRVNTSU9OX0FDQ0VTU0VEPC9wcmU+PGxpPgorICogICA8bGk+PHByZT5wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfQVRUUklCVVRFX0FEREVEPC9wcmU+PGxpPgorICogICA8bGk+PHByZT5wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfQVRUUklCVVRFX1JFTU9WRUQ8L3ByZT48bGk+CisgKiAgIDxsaT48cHJlPnB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9TRVNTSU9OX0VYUElSRURfV09OT1RJRlk8L3ByZT48bGk+CisgKiAgIDxsaT48cHJlPnB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9TRVNTSU9OX0VYUElSRURfV05PVElGWTwvcHJlPjxsaT4KKyAqICAgPGxpPjxwcmU+cHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX0dFVF9BTExfU0VTU0lPTlM8L3ByZT48bGk+CisgKiAgIDxsaT48cHJlPnB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9TRVRfVVNFUl9QUklOQ0lQQUw8L3ByZT48bGk+CisgKiAgIDxsaT48cHJlPnB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9TRVRfU0VTU0lPTl9OT1RFPC9wcmU+PGxpPgorICogICA8bGk+PHByZT5wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfUkVNT1ZFX1NFU1NJT05fTk9URTwvcHJlPjxsaT4KKyAqIDwvdWw+CisgKgorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgU2Vzc2lvbk1lc3NhZ2UgZXh0ZW5kcyBDbHVzdGVyTWVzc2FnZSwgamF2YS5pby5TZXJpYWxpemFibGUKK3sKKworICAgIC8qKgorICAgICAqIEV2ZW50IHR5cGUgdXNlZCB3aGVuIGEgc2Vzc2lvbiBoYXMgYmVlbiBjcmVhdGVkIG9uIGEgbm9kZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9TRVNTSU9OX0NSRUFURUQgPSAxOworICAgIC8qKgorICAgICAqIEV2ZW50IHR5cGUgdXNlZCB3aGVuIGEgc2Vzc2lvbiBoYXMgZXhwaXJlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9TRVNTSU9OX0VYUElSRUQgPSAyOworCisgICAgLyoqCisgICAgICogRXZlbnQgdHlwZSB1c2VkIHdoZW4gYSBzZXNzaW9uIGhhcyBiZWVuIGFjY2Vzc2VkIChpZSwgbGFzdCBhY2Nlc3MgdGltZQorICAgICAqIGhhcyBiZWVuIHVwZGF0ZWQuIFRoaXMgaXMgdXNlZCBzbyB0aGF0IHRoZSByZXBsaWNhdGVkIHNlc3Npb25zIHdpbGwgbm90IGV4cGlyZQorICAgICAqIG9uIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX1NFU1NJT05fQUNDRVNTRUQgPSAzOworICAgIC8qKgorICAgICAqIEV2ZW50IHR5cGUgdXNlZCB3aGVuIGEgc2VydmVyIGNvbWVzIG9ubGluZSBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgICogVGhlIGZpcnN0IHRoaW5nIHRoZSBuZXdseSBzdGFydGVkIHNlcnZlciB3YW50cyB0byBkbyBpcyB0byBncmFiIHRoZQorICAgICAqIGFsbCB0aGUgc2Vzc2lvbnMgZnJvbSBvbmUgb2YgdGhlIG5vZGVzIGFuZCBrZWVwIHRoZSBzYW1lIHN0YXRlIGluIHRoZXJlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX0dFVF9BTExfU0VTU0lPTlMgPSA0OworICAgIC8qKgorICAgICAqIEV2ZW50IHR5cGUgdXNlZCB3aGVuIGFuIGF0dHJpYnV0ZSBoYXMgYmVlbiBhZGRlZCB0byBhIHNlc3Npb24sCisgICAgICogdGhlIGF0dHJpYnV0ZSB3aWxsIGJlIHNlbnQgdG8gYWxsIHRoZSBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9TRVNTSU9OX0RFTFRBICA9IDEzOworCisgICAgLyoqCisgICAgICogV2hlbiBhIHNlc3Npb24gc3RhdGUgaXMgdHJhbnNmZXJyZWQsIHRoaXMgaXMgdGhlIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9BTExfU0VTU0lPTl9EQVRBID0gMTI7CisgICAgCisgICAgLyoqCisgICAgICogV2hlbiBhIHNlc3Npb24gc3RhdGUgaXMgY29tcGxldGUgdHJhbnNmZXJyZWQsIHRoaXMgaXMgdGhlIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9BTExfU0VTU0lPTl9UUkFOU0ZFUkNPTVBMRVRFID0gMTQ7CisgICAgCisKKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHROYW1lKCk7CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRFdmVudFR5cGVTdHJpbmcoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiByZXR1cm5zIHRoZSBldmVudCB0eXBlCisgICAgICogQHJldHVybiBvbmUgb2YgdGhlIGV2ZW50IHR5cGVzIEVWVF9YWFhYCisgICAgICovCisgICAgcHVibGljIGludCBnZXRFdmVudFR5cGUoKTsgCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgc2VyaWFsaXplZCBkYXRhIGZvciB0aGUgc2Vzc2lvbgorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0U2Vzc2lvbigpOworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHNlc3Npb24gSUQgZm9yIHRoZSBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSUQoKTsKKyAgICAKKworCit9Ly9TZXNzaW9uTWVzc2FnZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9TZXNzaW9uTWVzc2FnZUltcGwuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vU2Vzc2lvbk1lc3NhZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y4OTY2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vU2Vzc2lvbk1lc3NhZ2VJbXBsLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnNlc3Npb247CisKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3Rlck1lc3NhZ2VCYXNlOworCisvKioKKyAqIFNlc3Npb24gY2x1c3RlciBtZXNzYWdlCisgKiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFNlc3Npb25NZXNzYWdlSW1wbCBleHRlbmRzIENsdXN0ZXJNZXNzYWdlQmFzZSBpbXBsZW1lbnRzIFNlc3Npb25NZXNzYWdlLCBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgCisgICAgcHVibGljIFNlc3Npb25NZXNzYWdlSW1wbCgpIHsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoKKworICAgICAqIFByaXZhdGUgc2VyaWFsaXphYmxlIHZhcmlhYmxlcyB0byBrZWVwIHRoZSBtZXNzYWdlcyBzdGF0ZQorICAgICAqLworICAgIHByaXZhdGUgaW50IG1FdnRUeXBlID0gLTE7CisgICAgcHJpdmF0ZSBieXRlW10gbVNlc3Npb247CisgICAgcHJpdmF0ZSBTdHJpbmcgbVNlc3Npb25JRDsKKworICAgIHByaXZhdGUgU3RyaW5nIG1Db250ZXh0TmFtZTsKKyAgICBwcml2YXRlIGxvbmcgc2VyaWFsaXphdGlvblRpbWVzdGFtcDsKKyAgICBwcml2YXRlIGJvb2xlYW4gdGltZXN0YW1wU2V0ID0gZmFsc2UgOworICAgIHByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkOworCisKKyAgICBwcml2YXRlIFNlc3Npb25NZXNzYWdlSW1wbCggU3RyaW5nIGNvbnRleHROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JRCkKKyAgICB7CisgICAgICAgIG1FdnRUeXBlID0gZXZlbnR0eXBlOworICAgICAgICBtU2Vzc2lvbiA9IHNlc3Npb247CisgICAgICAgIG1TZXNzaW9uSUQgPSBzZXNzaW9uSUQ7CisgICAgICAgIG1Db250ZXh0TmFtZSA9IGNvbnRleHROYW1lOworICAgICAgICB1bmlxdWVJZCA9IHNlc3Npb25JRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgc2Vzc2lvbiBtZXNzYWdlLiBEZXBlbmRpbmcgb24gd2hhdCBldmVudCB0eXBlIHlvdSB3YW50IHRoaXMKKyAgICAgKiBtZXNzYWdlIHRvIHJlcHJlc2VudCwgeW91IHBvcHVsYXRlIHRoZSBkaWZmZXJlbnQgcGFyYW1ldGVycyBpbiB0aGUgY29uc3RydWN0b3I8QlI+CisgICAgICAqIFRoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHkgZGVwZW5kZW50IG9uIHdoYXQgZXZlbnQgdHlwZSBhcmd1bWVudCB5b3UgdXNlOjxCUj4KKyAgICAgKiA8Qj5FVlRfU0VTU0lPTl9DUkVBVEVEPC9CPjxCUj4KKyAgICAgKiAgICBUaGUgcGFyYW1ldGVyczogc2Vzc2lvbiwgc2Vzc2lvbklEIG11c3QgYmUgc2V0LjxCUj4KKyAgICAgKiA8Qj5FVlRfU0VTU0lPTl9FWFBJUkVEPC9CPjxCUj4KKyAgICAgKiAgICBUaGUgcGFyYW1ldGVyczogc2Vzc2lvbklEIG11c3QgYmUgc2V0LjxCUj4KKyAgICAgKiA8Qj5FVlRfU0VTU0lPTl9BQ0NFU1NFRDwvQj48QlI+CisgICAgICogICAgVGhlIHBhcmFtZXRlcnM6IHNlc3Npb25JRCBtdXN0IGJlIHNldC48QlI+CisgICAgICogPEI+RVZUX1NFU1NJT05fRVhQSVJFRF9YWFhYPC9CPjxCUj4KKyAgICAgKiAgICBUaGUgcGFyYW1ldGVyczogc2Vzc2lvbklEIG11c3QgYmUgc2V0LjxCUj4KKyAgICAgKiA8Qj5FVlRfU0VTU0lPTl9ERUxUQTwvQj48QlI+CisgICAgICogICAgU2VuZCBhdHRyaWJ1dGUgZGVsdGEgKGFkZCx1cGRhdGUscmVtb3ZlIGF0dHJpYnV0ZSBvciBwcmluY2lwYWwsIC4uLikuPEJSPgorICAgICAqIDxCPkVWVF9BTExfU0VTU0lPTl9EQVRBPC9CPjxCUj4KKyAgICAgKiAgICBTZW5kIGNvbXBsZXRlIHNlcmlhbGl6ZXMgc2Vzc2lvbiBsaXN0PEJSPgorICAgICAqIDxCPkVWVF9BTExfU0VTU0lPTl9UUkFOU0ZFUkNPTVBMRVRFPC9CPjxCUj4KKyAgICAgKiAgICBzZW5kIHRoYXQgYWxsIHNlc3Npb24gc3RhdGUgaW5mb3JtYXRpb24gYXJlIHRyYW5zZmVyZWQKKyAgICAgKiAgICBhZnRlciBHRVRfQUxMX1NFU1NJT04gcmVjZWl2ZWQgZnJvbSB0aGlzIHNlbmRlci48QlI+CisgICAgICogQHBhcmFtIGNvbnRleHROYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgKGFwcGxpY2F0aW9uCisgICAgICogQHBhcmFtIGV2ZW50dHlwZSAtIG9uZSBvZiB0aGUgOCBldmVudCB0eXBlIGRlZmluZWQgaW4gdGhpcyBjbGFzcworICAgICAqIEBwYXJhbSBzZXNzaW9uIC0gdGhlIHNlcmlhbGl6ZWQgYnl0ZSBhcnJheSBvZiB0aGUgc2Vzc2lvbiBpdHNlbGYKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbklEIC0gdGhlIGlkIHRoYXQgaWRlbnRpZmllcyB0aGlzIHNlc3Npb24KKyAgICAgKiBAcGFyYW0gdW5pcXVlSUQgLSB0aGUgaWQgdGhhdCBpZGVudGlmaWVzIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uTWVzc2FnZUltcGwoIFN0cmluZyBjb250ZXh0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlSUQpCisgICAgeworICAgICAgICB0aGlzKGNvbnRleHROYW1lLGV2ZW50dHlwZSxzZXNzaW9uLHNlc3Npb25JRCk7CisgICAgICAgIHVuaXF1ZUlkID0gdW5pcXVlSUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJucyB0aGUgZXZlbnQgdHlwZQorICAgICAqIEByZXR1cm4gb25lIG9mIHRoZSBldmVudCB0eXBlcyBFVlRfWFhYWAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgeyByZXR1cm4gbUV2dFR5cGU7IH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHNlcmlhbGl6ZWQgZGF0YSBmb3IgdGhlIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldFNlc3Npb24oKSB7IHJldHVybiBtU2Vzc2lvbjt9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXNzaW9uIElEIGZvciB0aGUgc2Vzc2lvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2Vzc2lvbklEKCl7IHJldHVybiBtU2Vzc2lvbklEOyB9CisgICAgCisgICAgLyoqCisgICAgICogc2V0IG1lc3NhZ2Ugc2VuZCB0aW1lIGJ1dCBvbmx5IHRoZSBmaXJzdCBzZXR0aW5nIHdvcmtzIChvbmUgc2hvdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAobG9uZyB0aW1lKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBpZighdGltZXN0YW1wU2V0KSB7CisgICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvblRpbWVzdGFtcD10aW1lOworICAgICAgICAgICAgICAgIHRpbWVzdGFtcFNldCA9IHRydWUgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsgcmV0dXJuIHNlcmlhbGl6YXRpb25UaW1lc3RhbXA7fQorICAgIAorICAgIC8qKgorICAgICAqIGNsZWFyIHRleHQgZXZlbnQgdHlwZSBuYW1lIChmb3IgbG9nZ2luZyBwdXJwb3NlIG9ubHkpIAorICAgICAqIEByZXR1cm4gdGhlIGV2ZW50IHR5cGUgaW4gYSBzdHJpbmcgcmVwcmVzZW50YXRpbmcsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFdmVudFR5cGVTdHJpbmcoKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChtRXZ0VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBFVlRfU0VTU0lPTl9DUkVBVEVEIDogcmV0dXJuICJTRVNTSU9OLU1PRElGSUVEIjsKKyAgICAgICAgICAgIGNhc2UgRVZUX1NFU1NJT05fRVhQSVJFRCA6IHJldHVybiAiU0VTU0lPTi1FWFBJUkVEIjsKKyAgICAgICAgICAgIGNhc2UgRVZUX1NFU1NJT05fQUNDRVNTRUQgOiByZXR1cm4gIlNFU1NJT04tQUNDRVNTRUQiOworICAgICAgICAgICAgY2FzZSBFVlRfR0VUX0FMTF9TRVNTSU9OUyA6IHJldHVybiAiU0VTU0lPTi1HRVQtQUxMIjsKKyAgICAgICAgICAgIGNhc2UgRVZUX1NFU1NJT05fREVMVEEgOiByZXR1cm4gIlNFU1NJT04tREVMVEEiOworICAgICAgICAgICAgY2FzZSBFVlRfQUxMX1NFU1NJT05fREFUQSA6IHJldHVybiAiQUxMLVNFU1NJT04tREFUQSI7CisgICAgICAgICAgICBjYXNlIEVWVF9BTExfU0VTU0lPTl9UUkFOU0ZFUkNPTVBMRVRFIDogcmV0dXJuICJTRVNTSU9OLVNUQVRFLVRSQU5TRkVSRUQiOworICAgICAgICAgICAgZGVmYXVsdCA6IHJldHVybiAiVU5LTk9XTi1FVkVOVC1UWVBFIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dE5hbWUoKSB7CisgICAgICAgcmV0dXJuIG1Db250ZXh0TmFtZTsKKyAgICB9CisgICAgcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKyAgICAgICAgcmV0dXJuIHVuaXF1ZUlkOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKyAgICAgICAgdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9TaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAyNmFmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3Nlc3Npb24vU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw2OTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnNlc3Npb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2F0YWxpbmFDbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3Rlck1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5HZW5lcmljUHJpbmNpcGFsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5TdGFuZGFyZE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uUmVwbGljYXRpb25TdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxvYWRlcjsKKworLyoqCisgKiBUaXRsZTogICAgICAgIFRvbWNhdCBTZXNzaW9uIFJlcGxpY2F0aW9uIGZvciBUb21jYXQgNC4wIDxCUj4KKyAqIERlc2NyaXB0aW9uOiAgQSB2ZXJ5IHNpbXBsZSBzdHJhaWdodCBmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mCisgKiAgICAgICAgICAgICAgIHNlc3Npb24gcmVwbGljYXRpb24gb2Ygc2VydmVycyBpbiBhIGNsdXN0ZXIuPEJSPgorICogICAgICAgICAgICAgICBUaGlzIHNlc3Npb24gcmVwbGljYXRpb24gaXMgaW1wbGVtZW50ZWQgImxpdmUiLiBCeSBsaXZlCisgKiAgICAgICAgICAgICAgIEkgbWVhbiwgd2hlbiBhIHNlc3Npb24gYXR0cmlidXRlIGlzIGFkZGVkIGludG8gYSBzZXNzaW9uIG9uIE5vZGUgQQorICogICAgICAgICAgICAgICBhIG1lc3NhZ2UgaXMgYnJvYWRjYXN0ZWQgdG8gb3RoZXIgbWVzc2FnZXMgYW5kIHNldEF0dHJpYnV0ZSBpcyBjYWxsZWQgb24gdGhlCisgKiAgICAgICAgICAgICAgIHJlcGxpY2F0ZWQgc2Vzc2lvbnMuPEJSPgorICogICAgICAgICAgICAgICBBIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgZm91bmQgdW5kZXIKKyAqICAgICAgICAgICAgICAgPGhyZWY9Imh0dHA6Ly93d3cuZmlsaXAubmV0L3RvbWNhdC8iPkZpbGlwJ3MgVG9tY2F0IFBhZ2U8L2E+PEJSPgorICoKKyAqIENvcHlyaWdodDogICAgU2VlIGFwYWNoZSBsaWNlbnNlCisgKiBDb21wYW55OiAgICAgIHd3dy5maWxpcC5uZXQKKyAqIEBhdXRob3IgIDxhIGhyZWY9Im1haWx0bzptYWlsQGZpbGlwLm5ldCI+RmlsaXAgSGFuaWs8L2E+CisgKiBAYXV0aG9yIEJlbGEgQmFuIChtb2RpZmljYXRpb25zIGZvciBzeW5jaHJvbm91cyByZXBsaWNhdGlvbikKKyAqIEB2ZXJzaW9uIDEuMCBmb3IgVEMgNC4wCisgKiBEZXNjcmlwdGlvbjogVGhlIEluTWVtb3J5UmVwbGljYXRpb25NYW5hZ2VyIGlzIGEgc2Vzc2lvbiBtYW5hZ2VyIHRoYXQgcmVwbGljYXRlZAorICogc2Vzc2lvbiBpbmZvcm1hdGlvbiBpbiBtZW1vcnkuIEl0IHVzZXMgPGEgaHJlZj0id3d3LmphdmFncm91cHMuY29tIj5KYXZhR3JvdXBzPC9hPiBhcworICogYSBjb21tdW5pY2F0aW9uIHByb3RvY29sIHRvIGVuc3VyZSBndWFyYW50ZWVkIGFuZCBvcmRlcmVkIG1lc3NhZ2UgZGVsaXZlcnkuCisgKiBKYXZhR3JvdXBzIGFsc28gcHJvdmlkZXMgYSB2ZXJ5IGZsZXhpYmxlIHByb3RvY29sIHN0YWNrIHRvIGVuc3VyZSB0aGF0IHRoZSByZXBsaWNhdGlvbgorICogY2FuIGJlIHVzZWQgaW4gYW55IGVudmlyb25tZW50LgorICogPEJSPjxCUj4KKyAqIFRoZSBJbk1lbW9yeVJlcGxpY2F0aW9uTWFuYWdlciBleHRlbmRzIHRoZSBTdGFuZGFyZE1hbmFnZXIgaGVuY2UgaXQgYWxsb3dzIGZvciB1cworICogdG8gaW5oZXJpdCBhbGwgdGhlIGJhc2ljIHNlc3Npb24gbWFuYWdlbWVudCBmZWF0dXJlcyBsaWtlIGV4cGlyYXRpb24sIHNlc3Npb24gbGlzdGVuZXJzIGV0YworICogPEJSPjxCUj4KKyAqIFRvIGNvbW11bmljYXRlIHdpdGggb3RoZXIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIsIHRoZSBJbk1lbW9yeVJlcGxpY2F0aW9uTWFuYWdlciBzZW5kcyBvdXQgNyBkaWZmZXJlbnQgdHlwZSBvZiBtdWx0aWNhc3QgbWVzc2FnZXMKKyAqIGFsbCBkZWZpbmVkIGluIHRoZSBTZXNzaW9uTWVzc2FnZSBjbGFzcy48QlI+CisgKiBXaGVuIGEgc2Vzc2lvbiBpcyByZXBsaWNhdGVkIChub3QgYW4gYXR0cmlidXRlIGFkZGVkL3JlbW92ZWQpIHRoZSBzZXNzaW9uIGlzIHNlcmlhbGl6ZWQgaW50bworICogYSBieXRlIGFycmF5IHVzaW5nIHRoZSBTdGFuZGFyZFNlc3Npb24ucmVhZE9iamVjdERhdGEsIFN0YW5kYXJkU2Vzc2lvbi53cml0ZU9iamVjdERhdGEgbWV0aG9kcy4KKyAqLworcHVibGljIGNsYXNzIFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlciBleHRlbmRzIFN0YW5kYXJkTWFuYWdlciBpbXBsZW1lbnRzIENsdXN0ZXJNYW5hZ2VyCit7CisgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlci5jbGFzcyApOworCisgICAgLy90aGUgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgICAgcHJvdGVjdGVkIFN0cmluZyBtQ2hhbm5lbENvbmZpZyA9IG51bGw7CisKKyAgICAvL3RoZSBncm91cCBuYW1lCisgICAgcHJvdGVjdGVkIFN0cmluZyBtR3JvdXBOYW1lID0gIlRvbWNhdFJlcGxpY2F0aW9uIjsKKworICAgIC8vc29tZWhvdyBzdGFydCgpIGdldHMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUNoYW5uZWxTdGFydGVkID0gZmFsc2U7CisKKyAgICAvL2xvZyB0byBzY3JlZW4KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtUHJpbnRUb1NjcmVlbiA9IHRydWU7CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0TW9kZSA9IGZhbHNlOworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbU1hbmFnZXJSdW5uaW5nID0gZmFsc2U7CisKKyAgICAvKiogVXNlIHN5bmNocm9ub3VzIHJhdGhlciB0aGFuIGFzeW5jaHJvbm91cyByZXBsaWNhdGlvbi4gRXZlcnkgc2Vzc2lvbiBtb2RpZmljYXRpb24gKGNyZWF0aW9uLCBjaGFuZ2UsIHJlbW92YWwgZXRjKQorICAgICAqIHdpbGwgYmUgc2VudCB0byBhbGwgbWVtYmVycy4gVGhlIGNhbGwgd2lsbCB0aGVuIHdhaXQgZm9yIG1heCBtaWxsaXNlY29uZHMsIG9yIGZvcmV2ZXIgKGlmIHRpbWVvdXQgaXMgMCkgZm9yCisgICAgICogYWxsIHJlc3BvbnNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzeW5jaHJvbm91c1JlcGxpY2F0aW9uPXRydWU7CisKKyAgICAvKiogU2V0IHRvIHRydWUgaWYgd2UgZG9uJ3Qgd2FudCB0aGUgc2Vzc2lvbnMgdG8gZXhwaXJlIG9uIHNodXRkb3duICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUV4cGlyZVNlc3Npb25zT25TaHV0ZG93biA9IHRydWU7CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VEaXJ0eUZsYWcgPSBmYWxzZTsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKKworICAgIHByb3RlY3RlZCBib29sZWFuIGRpc3RyaWJ1dGFibGUgPSB0cnVlOworCisgICAgcHJvdGVjdGVkIENhdGFsaW5hQ2x1c3RlciBjbHVzdGVyOworCisgICAgcHJvdGVjdGVkIGphdmEudXRpbC5IYXNoTWFwIGludmFsaWRhdGVkU2Vzc2lvbnMgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKKworICAgIC8qKgorICAgICAqIEZsYWcgdG8ga2VlcCB0cmFjayBpZiB0aGUgc3RhdGUgaGFzIGJlZW4gdHJhbnNmZXJyZWQgb3Igbm90CisgICAgICogQXNzdW1lcyBmYWxzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGF0ZVRyYW5zZmVycmVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb247CisgICAgcHJpdmF0ZSBib29sZWFuIHNlbmRDbHVzdGVyRG9tYWluT25seSA9IHRydWUgOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IsIGp1c3QgY2FsbHMgc3VwZXIoKQorICAgICAqCisgICAgICovCisgICAgcHVibGljIFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlcigpCisgICAgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2VuZENsdXN0ZXJEb21haW5Pbmx5KCkgeworICAgICAgICByZXR1cm4gc2VuZENsdXN0ZXJEb21haW5Pbmx5OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc2VuZENsdXN0ZXJEb21haW5Pbmx5IFRoZSBzZW5kQ2x1c3RlckRvbWFpbk9ubHkgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlbmRDbHVzdGVyRG9tYWluT25seShib29sZWFuIHNlbmRDbHVzdGVyRG9tYWluT25seSkgeworICAgICAgICB0aGlzLnNlbmRDbHVzdGVyRG9tYWluT25seSA9IHNlbmRDbHVzdGVyRG9tYWluT25seTsKKyAgICB9CisgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVmYXVsdE1vZGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRNb2RlOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZGVmYXVsdE1vZGUgVGhlIGRlZmF1bHRNb2RlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0TW9kZShib29sZWFuIGRlZmF1bHRNb2RlKSB7CisgICAgICAgIHRoaXMuZGVmYXVsdE1vZGUgPSBkZWZhdWx0TW9kZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VyUnVubmluZygpCisgICAgeworICAgICAgICByZXR1cm4gbU1hbmFnZXJSdW5uaW5nOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVzZURpcnR5RmxhZyhib29sZWFuIHVzZWRpcnR5ZmxhZykKKyAgICB7CisgICAgICAgIHRoaXMudXNlRGlydHlGbGFnID0gdXNlZGlydHlmbGFnOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4cGlyZVNlc3Npb25zT25TaHV0ZG93bihib29sZWFuIGV4cGlyZVNlc3Npb25zT25TaHV0ZG93bikKKyAgICB7CisgICAgICAgIG1FeHBpcmVTZXNzaW9uc09uU2h1dGRvd24gPSBleHBpcmVTZXNzaW9uc09uU2h1dGRvd247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlcihDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2x1c3RlciBhc3NvY2lhdGVkIHdpdGggU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyIik7CisgICAgICAgIHRoaXMuY2x1c3RlciA9IGNsdXN0ZXI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RXhwaXJlU2Vzc2lvbnNPblNodXRkb3duKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtRXhwaXJlU2Vzc2lvbnNPblNodXRkb3duOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByaW50VG9TY3JlZW4oYm9vbGVhbiBwcmludHRvc2NyZWVuKQorICAgIHsKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgc2NyZWVuIGRlYnVnIHRvOiIrcHJpbnR0b3NjcmVlbik7CisgICAgICAgIG1QcmludFRvU2NyZWVuID0gcHJpbnR0b3NjcmVlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbm91c1JlcGxpY2F0aW9uKGJvb2xlYW4gZmxhZykKKyAgICB7CisgICAgICAgIHN5bmNocm9ub3VzUmVwbGljYXRpb249ZmxhZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBwZXJzaXN0ZW5jZSBzaW5jZSB0aGV5IGRvbid0IGdvIGhhbmQgaW4gaGFuZCB3aXRoIHJlcGxpY2F0aW9uIGZvciBub3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5sb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCAhZ2V0RGlzdHJpYnV0YWJsZSgpICkgeworICAgICAgICAgICAgc3VwZXIudW5sb2FkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgSFRUUCBzZXNzaW9uLgorICAgICAqIE1vc3Qgb2YgdGhlIGNvZGUgaW4gaGVyZSBpcyBjb3BpZWQgZnJvbSB0aGUgU3RhbmRhcmRNYW5hZ2VyLgorICAgICAqIFRoaXMgaXMgbm90IHByZXR0eSwgeWVhaCBJIGtub3csIGJ1dCBpdCB3YXMgbmVjZXNzYXJ5IHNpbmNlIHRoZQorICAgICAqIFN0YW5kYXJkTWFuYWdlciBoYWQgaGFyZCBjb2RlZCB0aGUgc2Vzc2lvbiBpbnN0YW50aWF0aW9uIHRvIHRoZSBhCisgICAgICogU3RhbmRhcmRTZXNzaW9uLCB3aGVuIHdlIGFjdHVhbGx5IHdhbnQgdG8gaW5zdGFudGlhdGUgYSBSZXBsaWNhdGVkU2Vzc2lvbjxCUj4KKyAgICAgKiBJZiB0aGUgY2FsbCBjb21lcyBmcm9tIHRoZSBUb21jYXQgc2VydmxldCBlbmdpbmUsIGEgU2Vzc2lvbk1lc3NhZ2UgZ29lcyBvdXQgdG8gdGhlIG90aGVyCisgICAgICogbm9kZXMgaW4gdGhlIGNsdXN0ZXIgdGhhdCB0aGlzIHNlc3Npb24gaGFzIGJlZW4gY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gbm90aWZ5IC0gaWYgc2V0IHRvIHRydWUgdGhlIG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyIHdpbGwgYmUgbm90aWZpZWQuCisgICAgICogICAgICAgICAgICAgICAgIFRoaXMgZmxhZyBpcyBuZWVkZWQgc28gdGhhdCB3ZSBjYW4gY3JlYXRlIGEgc2Vzc2lvbiBiZWZvcmUgd2UgZGVzZXJpYWxpemUKKyAgICAgKiAgICAgICAgICAgICAgICAgYSByZXBsaWNhdGVkIG9uZQorICAgICAqCisgICAgICogQHNlZSBSZXBsaWNhdGVkU2Vzc2lvbgorICAgICAqLworICAgIHByb3RlY3RlZCBTZXNzaW9uIGNyZWF0ZVNlc3Npb24oU3RyaW5nIHNlc3Npb25JZCwgYm9vbGVhbiBub3RpZnksIGJvb2xlYW4gc2V0SWQpCisgICAgeworCisgICAgICAgIC8vaW5oZXJpdGVkIGZyb20gdGhlIGJhc2ljIG1hbmFnZXIKKyAgICAgICAgaWYgKChnZXRNYXhBY3RpdmVTZXNzaW9ucygpID49IDApICYmCisgICAgICAgICAgIChzZXNzaW9ucy5zaXplKCkgPj0gZ2V0TWF4QWN0aXZlU2Vzc2lvbnMoKSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHNtLmdldFN0cmluZygic3RhbmRhcmRNYW5hZ2VyLmNyZWF0ZVNlc3Npb24uaXNlIikpOworCisKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbmV3IFJlcGxpY2F0ZWRTZXNzaW9uKHRoaXMpOworCisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIG5ldyBzZXNzaW9uIGFuZCByZXR1cm4gaXQKKyAgICAgICAgc2Vzc2lvbi5zZXROZXcodHJ1ZSk7CisgICAgICAgIHNlc3Npb24uc2V0VmFsaWQodHJ1ZSk7CisgICAgICAgIHNlc3Npb24uc2V0Q3JlYXRpb25UaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRNYXhJbmFjdGl2ZUludGVydmFsKHRoaXMubWF4SW5hY3RpdmVJbnRlcnZhbCk7CisgICAgICAgIGlmKHNlc3Npb25JZCA9PSBudWxsKQorICAgICAgICAgICAgc2Vzc2lvbklkID0gZ2VuZXJhdGVTZXNzaW9uSWQoKTsKKyAgICAgICAgaWYgKCBzZXRJZCApIHNlc3Npb24uc2V0SWQoc2Vzc2lvbklkKTsKKyAgICAgICAgaWYgKCBub3RpZnkgJiYgKGNsdXN0ZXIhPW51bGwpICkgeworICAgICAgICAgICAgKChSZXBsaWNhdGVkU2Vzc2lvbilzZXNzaW9uKS5zZXRJc0RpcnR5KHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoc2Vzc2lvbik7CisgICAgfS8vY3JlYXRlU2Vzc2lvbgorCisgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gT1ZFUlJJREUgVEhFU0UgTUVUSE9EUyBUTyBJTVBMRU1FTlQgVEhFIFJFUExJQ0FUSU9OCisgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW5kIHJldHVybiBhIG5ldyBzZXNzaW9uIG9iamVjdCwgYmFzZWQgb24gdGhlIGRlZmF1bHQKKyAgICAgKiBzZXR0aW5ncyBzcGVjaWZpZWQgYnkgdGhpcyBNYW5hZ2VyJ3MgcHJvcGVydGllcy4gIFRoZSBzZXNzaW9uCisgICAgICogaWQgd2lsbCBiZSBhc3NpZ25lZCBieSB0aGlzIG1ldGhvZCwgYW5kIGF2YWlsYWJsZSB2aWEgdGhlIGdldElkKCkKKyAgICAgKiBtZXRob2Qgb2YgdGhlIHJldHVybmVkIHNlc3Npb24uICBJZiBhIG5ldyBzZXNzaW9uIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICogZm9yIGFueSByZWFzb24sIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgbmV3IHNlc3Npb24gY2Fubm90IGJlCisgICAgICogIGluc3RhbnRpYXRlZCBmb3IgYW55IHJlYXNvbgorICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uIGNyZWF0ZVNlc3Npb24oU3RyaW5nIHNlc3Npb25JZCkKKyAgICB7CisgICAgICAgIC8vY3JlYXRlIGEgc2Vzc2lvbiBhbmQgbm90aWZ5IHRoZSBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3RlcgorICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSAgY3JlYXRlU2Vzc2lvbihzZXNzaW9uSWQsZ2V0RGlzdHJpYnV0YWJsZSgpLHRydWUpOworICAgICAgICBhZGQoc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBzZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlc3Npb25JbnZhbGlkYXRlZChTdHJpbmcgc2Vzc2lvbklkKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIGludmFsaWRhdGVkU2Vzc2lvbnMgKSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlZFNlc3Npb25zLnB1dChzZXNzaW9uSWQsIHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW52YWxpZGF0ZWRTZXNzaW9ucygpIHsKKyAgICAgICAgc3luY2hyb25pemVkICggaW52YWxpZGF0ZWRTZXNzaW9ucyApIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbaW52YWxpZGF0ZWRTZXNzaW9ucy5zaXplKCldOworICAgICAgICAgICAgaW52YWxpZGF0ZWRTZXNzaW9ucy52YWx1ZXMoKS50b0FycmF5KHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgQ2x1c3Rlck1lc3NhZ2UgcmVxdWVzdENvbXBsZXRlZChTdHJpbmcgc2Vzc2lvbklkKQorICAgIHsKKyAgICAgICAgaWYgKCAgIWdldERpc3RyaWJ1dGFibGUoKSApIHsKKyAgICAgICAgICAgIGxvZy53YXJuKCJSZWNlaXZlZCByZXF1ZXN0Q29tcGxldGVkIG1lc3NhZ2UsIGFsdGhvdWdoIHRoaXMgY29udGV4dFsiKworICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpKyJdIGlzIG5vdCBkaXN0cmlidXRhYmxlLiBJZ25vcmluZyBtZXNzYWdlIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvL25vdGlmeSBqYXZhZ3JvdXBzCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGludmFsaWRhdGVkU2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCkgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBpbnZhbGlkYXRlZFNlc3Npb25zICkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlZFNlc3Npb25zLnJlbW92ZShzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZSBtc2cgPSBuZXcgU2Vzc2lvbk1lc3NhZ2VJbXBsKG5hbWUsCisgICAgICAgICAgICAgICAgICAgIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0VYUElSRUQsCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUmVwbGljYXRlZFNlc3Npb24gc2Vzc2lvbiA9IChSZXBsaWNhdGVkU2Vzc2lvbikgZmluZFNlc3Npb24oCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBpbW1lZGlhdGVseSBpZiB0aGUgc2Vzc2lvbiBpcyBub3QgZGlydHkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZURpcnR5RmxhZyAmJiAoIXNlc3Npb24uaXNEaXJ0eSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9idXQgYmVmb3JlIHdlIHJldHVybiBkb2luZyBub3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgLy9zZWUgaWYgd2Ugc2hvdWxkIHNlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vYW4gdXBkYXRlZCBsYXN0IGFjY2VzcyBtZXNzYWdlIHNvIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vc2Vzc2lvbnMgYWNyb3NzIGNsdXN0ZXIgZG9udCBleHBpcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgaW50ZXJ2YWwgPSBzZXNzaW9uLmdldE1heEluYWN0aXZlSW50ZXJ2YWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGFzdGFjY2Rpc3QgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRMYXN0QWNjZXNzV2FzRGlzdHJpYnV0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKChpbnRlcnZhbCoxMDAwKSAvIGxhc3RhY2NkaXN0KTwgMyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZSBhY2Ntc2cgPSBuZXcgU2Vzc2lvbk1lc3NhZ2VJbXBsKG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0FDQ0VTU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRMYXN0QWNjZXNzV2FzRGlzdHJpYnV0ZWQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2Ntc2c7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0SXNEaXJ0eShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlbmRpbmcgc2Vzc2lvbiB0byBjbHVzdGVyPSIgKyBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7fQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFNlc3Npb25NZXNzYWdlIG1zZyA9IG5ldyBTZXNzaW9uTWVzc2FnZUltcGwobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0NSRUFURUQsCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNlc3Npb24oc2Vzc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldElkSW50ZXJuYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SWRJbnRlcm5hbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgICAgICAgICB9IC8vZW5kIGlmCisgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHggKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byByZXBsaWNhdGUgc2Vzc2lvbiIseCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplIGEgc2Vzc2lvbiBpbnRvIGEgYnl0ZSBhcnJheTxCUj4KKyAgICAgKiBUaGlzIG1ldGhvZCBzaW1wbGUgY2FsbHMgdGhlIHdyaXRlT2JqZWN0RGF0YSBtZXRob2Qgb24gdGhlIHNlc3Npb24KKyAgICAgKiBhbmQgcmV0dXJucyB0aGUgYnl0ZSBkYXRhIGZyb20gdGhhdCBjYWxsCisgICAgICogQHBhcmFtIHNlc3Npb24gLSB0aGUgc2Vzc2lvbiB0byBiZSBzZXJpYWxpemVkCisgICAgICogQHJldHVybiBhIGJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgc2Vzc2lvbiBkYXRhLCBudWxsIGlmIHRoZSBzZXJpYWxpemF0aW9uIGZhaWxlZAorICAgICAqLworICAgIHByb3RlY3RlZCBieXRlW10gd3JpdGVTZXNzaW9uKCBTZXNzaW9uIHNlc3Npb24gKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHNlc3Npb25fZGF0YSA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gc2Vzc2lvbl9vdXQgPSBuZXcgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0oc2Vzc2lvbl9kYXRhKTsKKyAgICAgICAgICAgIHNlc3Npb25fb3V0LmZsdXNoKCk7CisgICAgICAgICAgICBib29sZWFuIGhhc1ByaW5jaXBhbCA9IHNlc3Npb24uZ2V0UHJpbmNpcGFsKCkgIT0gbnVsbDsKKyAgICAgICAgICAgIHNlc3Npb25fb3V0LndyaXRlQm9vbGVhbihoYXNQcmluY2lwYWwpOworICAgICAgICAgICAgaWYgKCBoYXNQcmluY2lwYWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlc3Npb25fb3V0LndyaXRlT2JqZWN0KFNlcmlhbGl6YWJsZVByaW5jaXBhbC5jcmVhdGVQcmluY2lwYWwoKEdlbmVyaWNQcmluY2lwYWwpc2Vzc2lvbi5nZXRQcmluY2lwYWwoKSkpOworICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICAoKFJlcGxpY2F0ZWRTZXNzaW9uKXNlc3Npb24pLndyaXRlT2JqZWN0RGF0YShzZXNzaW9uX291dCk7CisgICAgICAgICAgICByZXR1cm4gc2Vzc2lvbl9kYXRhLnRvQnl0ZUFycmF5KCk7CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiB4ICkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gc2VyaWFsaXplIHRoZSBzZXNzaW9uISIseCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIE9wZW4gU3RyZWFtIGFuZCB1c2UgY29ycmVjdCBDbGFzc0xvYWRlciAoQ29udGFpbmVyKSBTd2l0Y2gKKyAgICAgKiBUaHJlYWRDbGFzc0xvYWRlcgorICAgICAqIAorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogQHJldHVybiBUaGUgb2JqZWN0IGlucHV0IHN0cmVhbQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVwbGljYXRpb25TdHJlYW0gZ2V0UmVwbGljYXRpb25TdHJlYW0oYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRSZXBsaWNhdGlvblN0cmVhbShkYXRhLDAsZGF0YS5sZW5ndGgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgUmVwbGljYXRpb25TdHJlYW0gZ2V0UmVwbGljYXRpb25TdHJlYW0oYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGZpcyA9bnVsbDsKKyAgICAgICAgUmVwbGljYXRpb25TdHJlYW0gb2lzID0gbnVsbDsKKyAgICAgICAgTG9hZGVyIGxvYWRlciA9IG51bGw7CisgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKKyAgICAgICAgLy9maXggdG8gYmUgYWJsZSB0byBydW4gdGhlIERlbHRhTWFuYWdlcgorICAgICAgICAvL3N0YW5kIGFsb25lIHdpdGhvdXQgYSBjb250YWluZXIuCisgICAgICAgIC8vdXNlIHRoZSBUaHJlYWRzIGNvbnRleHQgY2xhc3MgbG9hZGVyCisgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGxvYWRlciA9IGNvbnRhaW5lci5nZXRMb2FkZXIoKTsKKyAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKQorICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBsb2FkZXIuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICAvL2VuZCBmaXgKKyAgICAgICAgZmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgaWYgKCBjbGFzc0xvYWRlciA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpICkgeworICAgICAgICAgICAgb2lzID0gbmV3IFJlcGxpY2F0aW9uU3RyZWFtKGZpcywgbmV3IENsYXNzTG9hZGVyW10ge2NsYXNzTG9hZGVyfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvaXMgPSBuZXcgUmVwbGljYXRpb25TdHJlYW0oZmlzLCBuZXcgQ2xhc3NMb2FkZXJbXSB7Y2xhc3NMb2FkZXIsVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKX0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvaXM7CisgICAgfSAgICAKKworCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZWluc3RhbnRpYXRlcyBhIHNlcmlhbGl6ZWQgc2Vzc2lvbiBmcm9tIHRoZSBkYXRhIHBhc3NlZCBpbi4KKyAgICAgKiBUaGlzIHdpbGwgZmlyc3QgY2FsbCBjcmVhdGVTZXNzaW9uKCkgc28gdGhhdCB3ZSBnZXQgYSBmcmVzaCBpbnN0YW5jZSB3aXRoIGFsbAorICAgICAqIHRoZSBtYW5hZ2VycyBzZXQgYW5kIGFsbCB0aGUgdHJhbnNpZW50IGZpZWxkcyB2YWxpZGF0ZWQuCisgICAgICogVGhlbiBpdCBjYWxscyBTZXNzaW9uLnJlYWRPYmplY3REYXRhKGJ5dGVbXSkgdG8gZGVzZXJpYWxpemUgdGhlIG9iamVjdAorICAgICAqIEBwYXJhbSBkYXRhIC0gYSBieXRlIGFycmF5IGNvbnRhaW5pbmcgc2Vzc2lvbiBkYXRhCisgICAgICogQHJldHVybiBhIHZhbGlkIFNlc3Npb24gb2JqZWN0LCBudWxsIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqCisgICAgICovCisgICAgcHJvdGVjdGVkIFNlc3Npb24gcmVhZFNlc3Npb24oIGJ5dGVbXSBkYXRhLCBTdHJpbmcgc2Vzc2lvbklkICkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBSZXBsaWNhdGlvblN0cmVhbSBzZXNzaW9uX2luID0gZ2V0UmVwbGljYXRpb25TdHJlYW0oZGF0YSk7CisKKyAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHNlc3Npb25JZCE9bnVsbD90aGlzLmZpbmRTZXNzaW9uKHNlc3Npb25JZCk6bnVsbDsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNOZXcgPSAoc2Vzc2lvbj09bnVsbCk7CisgICAgICAgICAgICAvL2NsZWFyIHRoZSBvbGQgdmFsdWVzIGZyb20gdGhlIGV4aXN0aW5nIHNlc3Npb24KKyAgICAgICAgICAgIGlmICggc2Vzc2lvbiE9bnVsbCApIHsKKyAgICAgICAgICAgICAgICBSZXBsaWNhdGVkU2Vzc2lvbiBycyA9IChSZXBsaWNhdGVkU2Vzc2lvbilzZXNzaW9uOworICAgICAgICAgICAgICAgIHJzLmV4cGlyZShmYWxzZSk7ICAvL2NsZWFucyB1cCB0aGUgcHJldmlvdXMgdmFsdWVzLCBzaW5jZSB3ZSBhcmUgbm90IGRvaW5nIHJlbW92ZXMKKyAgICAgICAgICAgICAgICBzZXNzaW9uID0gbnVsbDsKKyAgICAgICAgICAgIH0vL2VuZCBpZgorCisgICAgICAgICAgICBpZiAoc2Vzc2lvbj09bnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24gPSBjcmVhdGVTZXNzaW9uKG51bGwsZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzZXNzaW9ucy5yZW1vdmUoc2Vzc2lvbi5nZXRJZEludGVybmFsKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzUHJpbmNpcGFsID0gc2Vzc2lvbl9pbi5yZWFkQm9vbGVhbigpOworICAgICAgICAgICAgU2VyaWFsaXphYmxlUHJpbmNpcGFsIHAgPSBudWxsOworICAgICAgICAgICAgaWYgKCBoYXNQcmluY2lwYWwgKQorICAgICAgICAgICAgICAgIHAgPSAoU2VyaWFsaXphYmxlUHJpbmNpcGFsKXNlc3Npb25faW4ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgKChSZXBsaWNhdGVkU2Vzc2lvbilzZXNzaW9uKS5yZWFkT2JqZWN0RGF0YShzZXNzaW9uX2luKTsKKyAgICAgICAgICAgIGlmICggaGFzUHJpbmNpcGFsICkKKyAgICAgICAgICAgICAgICBzZXNzaW9uLnNldFByaW5jaXBhbChwLmdldFByaW5jaXBhbChnZXRDb250YWluZXIoKS5nZXRSZWFsbSgpKSk7CisgICAgICAgICAgICAoKFJlcGxpY2F0ZWRTZXNzaW9uKXNlc3Npb24pLnNldElkKHNlc3Npb25JZCxpc05ldyk7CisgICAgICAgICAgICBSZXBsaWNhdGVkU2Vzc2lvbiByc2Vzc2lvbiA9IChSZXBsaWNhdGVkU2Vzc2lvbilzZXNzaW9uOyAKKyAgICAgICAgICAgIHJzZXNzaW9uLnNldEFjY2Vzc0NvdW50KDEpOworICAgICAgICAgICAgc2Vzc2lvbi5zZXRNYW5hZ2VyKHRoaXMpOworICAgICAgICAgICAgc2Vzc2lvbi5zZXRWYWxpZCh0cnVlKTsKKyAgICAgICAgICAgIHJzZXNzaW9uLnNldExhc3RBY2Nlc3NlZFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgcnNlc3Npb24uc2V0VGhpc0FjY2Vzc2VkVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAoKFJlcGxpY2F0ZWRTZXNzaW9uKXNlc3Npb24pLnNldEFjY2Vzc0NvdW50KDApOworICAgICAgICAgICAgc2Vzc2lvbi5zZXROZXcoZmFsc2UpOworICAgICAgICAgICAgaWYobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiU2Vzc2lvbiBsb2FkZWQgaWQ9IitzZXNzaW9uSWQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYWN0dWFsSWQ9IitzZXNzaW9uLmdldElkKCkrIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZXhpc3RzPSIrdGhpcy5zZXNzaW9ucy5jb250YWluc0tleShzZXNzaW9uSWQpKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdmFsaWQ9Iityc2Vzc2lvbi5pc1ZhbGlkKCkpOworICAgICAgICAgICAgcmV0dXJuIHNlc3Npb247CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiB4ICkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gZGVzZXJpYWxpemUgdGhlIHNlc3Npb24hIix4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgPGNvZGU+Y29uZmlndXJlKCk8L2NvZGU+LAorICAgICAqIGFuZCBiZWZvcmUgYW55IG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgY29tcG9uZW50IGFyZSB1dGlsaXplZC48QlI+CisgICAgICogU3RhcnRzIHRoZSBjbHVzdGVyIGNvbW11bmljYXRpb24gY2hhbm5lbCwgdGhpcyB3aWxsIGNvbm5lY3Qgd2l0aCB0aGUgb3RoZXIgbm9kZXMKKyAgICAgKiBpbiB0aGUgY2x1c3RlciwgYW5kIHJlcXVlc3QgdGhlIGN1cnJlbnQgc2Vzc2lvbiBzdGF0ZSB0byBiZSB0cmFuc2ZlcnJlZCB0byB0aGlzIG5vZGUuCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlbgorICAgICAqICBzdGFydGVkCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgdGhpcyBjb21wb25lbnQgZnJvbSBiZWluZyB1c2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgbU1hbmFnZXJSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgc3VwZXIuc3RhcnQoKTsKKyAgICAgICAgLy9zdGFydCB0aGUgamF2YWdyb3VwcyBjaGFubmVsCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvL3RoZSBjaGFubmVsIGlzIGFscmVhZHkgcnVubmluZworICAgICAgICAgICAgaWYgKCBtQ2hhbm5lbFN0YXJ0ZWQgKSByZXR1cm47CisgICAgICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJTdGFydGluZyBjbHVzdGVyaW5nIG1hbmFnZXIuLi46IitnZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKCBjbHVzdGVyID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJTdGFydGluZy4uLiBubyBjbHVzdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQ6IitnZXROYW1lKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsdXN0ZXIuYWRkTWFuYWdlcihnZXROYW1lKCksdGhpcyk7CisKKyAgICAgICAgICAgIGlmIChjbHVzdGVyLmdldE1lbWJlcnMoKS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgTWVtYmVyIG1iciA9IGNsdXN0ZXIuZ2V0TWVtYmVycygpWzBdOworICAgICAgICAgICAgICAgIFNlc3Npb25NZXNzYWdlIG1zZyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBTZXNzaW9uTWVzc2FnZUltcGwodGhpcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZS5FVlRfR0VUX0FMTF9TRVNTSU9OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0VULUFMTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0VULUFMTC0iK3RoaXMuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBjbHVzdGVyLnNlbmQobXNnLCBtYnIpOworICAgICAgICAgICAgICAgIGlmKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiTWFuYWdlclsiK2dldE5hbWUoKSsiXSwgcmVxdWVzdGluZyBzZXNzaW9uIHN0YXRlIGZyb20gIittYnIrCisgICAgICAgICAgICAgICAgICAgICAgICAgIi4gVGhpcyBvcGVyYXRpb24gd2lsbCB0aW1lb3V0IGlmIG5vIHNlc3Npb24gc3RhdGUgaGFzIGJlZW4gcmVjZWl2ZWQgd2l0aGluICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgIjYwIHNlY29uZHMiKTsKKyAgICAgICAgICAgICAgICBsb25nIHJlcVN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgbG9uZyByZXFOb3cgPSAwOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNUaW1lb3V0PWZhbHNlOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOworICAgICAgICAgICAgICAgICAgICB9Y2F0Y2ggKCBFeGNlcHRpb24gc2xlZXApIHt9CisgICAgICAgICAgICAgICAgICAgIHJlcU5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgICAgICBpc1RpbWVvdXQ9KChyZXFOb3ctcmVxU3RhcnQpPigxMDAwKjYwKSk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoICghaXNTdGF0ZVRyYW5zZmVycmVkKCkpICYmICghaXNUaW1lb3V0KSk7CisgICAgICAgICAgICAgICAgaWYgKCBpc1RpbWVvdXQgfHwgKCFpc1N0YXRlVHJhbnNmZXJyZWQoKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiTWFuYWdlclsiK2dldE5hbWUoKSsiXSwgTm8gc2Vzc2lvbiBzdGF0ZSByZWNlaXZlZCwgdGltaW5nIG91dC4iKTsKKyAgICAgICAgICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiTWFuYWdlclsiK2dldE5hbWUoKSsiXSwgc2Vzc2lvbiBzdGF0ZSByZWNlaXZlZCBpbiAiKyhyZXFOb3ctcmVxU3RhcnQpKyIgbXMuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiTWFuYWdlclsiK2dldE5hbWUoKSsiXSwgc2tpcHBpbmcgc3RhdGUgdHJhbnNmZXIuIE5vIG1lbWJlcnMgYWN0aXZlIGluIGNsdXN0ZXIgZ3JvdXAuIik7CisgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgIG1DaGFubmVsU3RhcnRlZCA9IHRydWU7CisgICAgICAgIH0gIGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzdGFydCBTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIiLHgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSB0ZXJtaW5hdGUgdGhlIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdGhlIGxhc3Qgb25lIGNhbGxlZCBvbiBhIGdpdmVuCisgICAgICogaW5zdGFuY2Ugb2YgdGhpcyBjb21wb25lbnQuPEJSPgorICAgICAqIFRoaXMgd2lsbCBkaXNjb25uZWN0IHRoZSBjbHVzdGVyIGNvbW11bmljYXRpb24gY2hhbm5lbCBhbmQgc3RvcCB0aGUgbGlzdGVuZXIgdGhyZWFkLgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGhhcyBub3QgYmVlbiBzdGFydGVkCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbU1hbmFnZXJSdW5uaW5nID0gZmFsc2U7CisgICAgICAgIG1DaGFubmVsU3RhcnRlZCA9IGZhbHNlOworICAgICAgICBzdXBlci5zdG9wKCk7CisgICAgICAgIC8vc3RvcCB0aGUgamF2YWdyb3VwIGNoYW5uZWwKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc2Vzc2lvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgIGNsdXN0ZXIucmVtb3ZlTWFuYWdlcihnZXROYW1lKCksdGhpcyk7CisvLyAgICAgICAgICAgIG1SZXBsaWNhdGlvbkxpc3RlbmVyLnN0b3BMaXN0ZW5pbmcoKTsKKy8vICAgICAgICAgICAgbVJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIuc3RvcCgpOworLy8gICAgICAgICAgICBzZXJ2aWNlLnN0b3AoKTsKKy8vICAgICAgICAgICAgc2VydmljZSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24geCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHN0b3AgU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyIix4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpc3RyaWJ1dGFibGUoYm9vbGVhbiBkaXN0KSB7CisgICAgICAgIHRoaXMuZGlzdHJpYnV0YWJsZSA9IGRpc3Q7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGlzdHJpYnV0YWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGRpc3RyaWJ1dGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSByZWNlaXZlZCB0aHJlYWQgd2hlbiBhIFNlc3Npb25NZXNzYWdlIGhhcworICAgICAqIGJlZW4gcmVjZWl2ZWQgZnJvbSBvbmUgb2YgdGhlIG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyLgorICAgICAqIEBwYXJhbSBtc2cgLSB0aGUgbWVzc2FnZSByZWNlaXZlZAorICAgICAqIEBwYXJhbSBzZW5kZXIgLSB0aGUgc2VuZGVyIG9mIHRoZSBtZXNzYWdlLCB0aGlzIGlzIHVzZWQgaWYgd2UgcmVjZWl2ZSBhCisgICAgICogICAgICAgICAgICAgICAgIEVWVF9HRVRfQUxMX1NFU1NJT04gbWVzc2FnZSwgc28gdGhhdCB3ZSBvbmx5IHJlcGx5IHRvCisgICAgICogICAgICAgICAgICAgICAgIHRoZSByZXF1ZXN0aW5nIG5vZGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoIFNlc3Npb25NZXNzYWdlIG1zZywgTWVtYmVyIHNlbmRlciApIHsKKyAgICAgICAgdHJ5ICB7CisgICAgICAgICAgICBpZihsb2cuaXNJbmZvRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWNlaXZlZCBTZXNzaW9uTWVzc2FnZSBvZiB0eXBlPSIrbXNnLmdldEV2ZW50VHlwZVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlY2VpdmVkIFNlc3Npb25NZXNzYWdlIHNlbmRlcj0iK3NlbmRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKCBtc2cuZ2V0RXZlbnRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfR0VUX0FMTF9TRVNTSU9OUzogeworICAgICAgICAgICAgICAgICAgICAvL2dldCBhIGxpc3Qgb2YgYWxsIHRoZSBzZXNzaW9uIGZyb20gdGhpcyBtYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHNlc3Npb25zID0gZmluZFNlc3Npb25zKCk7CisgICAgICAgICAgICAgICAgICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvdXQgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb291dCA9IG5ldyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbShib3V0KTsKKyAgICAgICAgICAgICAgICAgICAgb291dC53cml0ZUludChzZXNzaW9ucy5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8c2Vzc2lvbnMubGVuZ3RoOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGljYXRlZFNlc3Npb24gc2VzID0gKFJlcGxpY2F0ZWRTZXNzaW9uKXNlc3Npb25zW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgb291dC53cml0ZVVURihzZXMuZ2V0SWRJbnRlcm5hbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gd3JpdGVTZXNzaW9uKHNlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvb3V0LndyaXRlT2JqZWN0KGRhdGEpOworICAgICAgICAgICAgICAgICAgICB9Ly9mb3IKKyAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBzZW5kIGEgbWVzc2FnZSBpZiB3ZSBkb24ndCBoYXZlIHRvCisgICAgICAgICAgICAgICAgICAgIG9vdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgb291dC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IGJvdXQudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbmV3bXNnID0gbmV3IFNlc3Npb25NZXNzYWdlSW1wbChuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UuRVZUX0FMTF9TRVNTSU9OX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCAiU0VTU0lPTi1TVEFURSIsIlNFU1NJT04tU1RBVEUtIitnZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLnNlbmQobmV3bXNnLCBzZW5kZXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfQUxMX1NFU1NJT05fREFUQTogeworICAgICAgICAgICAgICAgICAgICBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtIGJpbiA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbShtc2cuZ2V0U2Vzc2lvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBvaW4gPSBuZXcgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbShiaW4pOworICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IG9pbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoIGludCBpPTA7IGk8c2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBvaW4ucmVhZFVURigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSAoYnl0ZVtdKW9pbi5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSByZWFkU2Vzc2lvbihkYXRhLGlkKTsKKyAgICAgICAgICAgICAgICAgICAgfS8vZm9yCisgICAgICAgICAgICAgICAgICAgIHN0YXRlVHJhbnNmZXJyZWQ9dHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fQ1JFQVRFRDogeworICAgICAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSB0aGlzLnJlYWRTZXNzaW9uKG1zZy5nZXRTZXNzaW9uKCksbXNnLmdldFNlc3Npb25JRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVjZWl2ZWQgcmVwbGljYXRlZCBzZXNzaW9uPSIgKyBzZXNzaW9uICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzVmFsaWQ9IiArIHNlc3Npb24uaXNWYWxpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9FWFBJUkVEOiB7CisgICAgICAgICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGZpbmRTZXNzaW9uKG1zZy5nZXRTZXNzaW9uSUQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICggc2Vzc2lvbiAhPSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5leHBpcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fQUNDRVNTRUQgOnsKKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gZmluZFNlc3Npb24obXNnLmdldFNlc3Npb25JRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzZXNzaW9uICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmFjY2VzcygpOworICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5lbmRBY2Nlc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDogIHsKKyAgICAgICAgICAgICAgICAgICAgLy93ZSBkaWRuJ3QgcmVjb2duaXplIHRoZSBtZXNzYWdlIHR5cGUsIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfS8vc3dpdGNoCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24geCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHJlY2VpdmUgbWVzc2FnZSB0aHJvdWdoIFRDUCBjaGFubmVsIix4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VEYXRhUmVjZWl2ZWQoQ2x1c3Rlck1lc3NhZ2UgY21zZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCBjbXNnIGluc3RhbmNlb2YgU2Vzc2lvbk1lc3NhZ2UgKSB7CisgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbXNnID0gKFNlc3Npb25NZXNzYWdlKWNtc2c7CisgICAgICAgICAgICAgICAgbWVzc2FnZVJlY2VpdmVkKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmdldEFkZHJlc3MoKSAhPSBudWxsID8gKE1lbWJlcikgbXNnLmdldEFkZHJlc3MoKSA6IG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKFRocm93YWJsZSBleCl7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkluTWVtb3J5UmVwbGljYXRpb25NYW5hZ2VyLm1lc3NhZ2VEYXRhUmVjZWl2ZWQoKSIsIGV4KTsKKyAgICAgICAgfS8vY2F0Y2gKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRlVHJhbnNmZXJyZWQoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZVRyYW5zZmVycmVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisgICAgcHVibGljIGJvb2xlYW4gaXNOb3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gbm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbjsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0Tm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbihib29sZWFuIG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24pIHsKKyAgICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uID0gbm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbjsKKyAgICB9CisKKworICAgIC8qIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyTWFuYWdlciNnZXRDbHVzdGVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2F0YWxpbmFDbHVzdGVyIGdldENsdXN0ZXIoKSB7CisgICAgICAgIHJldHVybiBjbHVzdGVyOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvc2Vzc2lvbi9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNjIxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS9zZXNzaW9uL21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSwzMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgbWJlYW5zLWRlc2NyaXB0b3JzIFBVQkxJQworICAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9EVEQgTW9kZWwgTUJlYW5zIENvbmZpZ3VyYXRpb24gRmlsZSIKKyAgICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvZHRkcy9tYmVhbnMtZGVzY3JpcHRvcnMuZHRkIj4KKzxtYmVhbnMtZGVzY3JpcHRvcnM+CisgICAgPG1iZWFuIG5hbWU9Ikp2bVJvdXRlQmluZGVyVmFsdmUiIGRlc2NyaXB0aW9uPSJtb2RfamsganZtUm91dGUganNlc3Npb25pZCBjb29raWUgYmFja3VwIGNvcnJlY3Rpb24iIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgIGdyb3VwPSJWYWx2ZSIgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5oYS5zZXNzaW9uLkp2bVJvdXRlQmluZGVyVmFsdmUiPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPiAgICAgICAgCisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5mbyIgCisJCSAgICAgICAgICAgZGVzY3JpcHRpb249ImRlc2NyaWJlIHZlcnNpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmFibGVkIiAKKwkJICAgICAgICAgICBkZXNjcmlwdGlvbj0iZW5hYmxlIGEganZtIFJvdXRlIGNoZWNrIiB0eXBlPSJib29sZWFuIi8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibnVtYmVyT2ZTZXNzaW9ucyIKKwkJICAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIGp2bVJvdXRlIHNlc3Npb24gY29ycmVjdGlvbnMiIHR5cGU9ImxvbmciIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXNzaW9uSWRBdHRyaWJ1dGUiIAorCQkgICAgZGVzY3JpcHRpb249Ik5hbWUgb2YgYXR0cmlidXRlIHdpdGggc2Vzc2lvbmlkIHZhbHVlIGJlZm9yZSB0dXJub3ZlciBhIHNlc3Npb24iIAorCQkgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgCisJCSAgICAvPgorICAgICAgICA8b3BlcmF0aW9uIG5hbWU9InN0YXJ0IiBkZXNjcmlwdGlvbj0iU3RvcHMgdGhlIENsdXN0ZXIgSnZtUm91dGVCaW5kZXJWYWx2ZSIgCisJCSAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiLz4KKyAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIiBkZXNjcmlwdGlvbj0iU3RvcHMgdGhlIENsdXN0ZXIgSnZtUm91dGVCaW5kZXJWYWx2ZSIgCisJCSAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiLz4KKyAgICA8L21iZWFuPgorCTxtYmVhbiBuYW1lPSJKdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyIgorCQlkZXNjcmlwdGlvbj0iTW9uaXRvcnMgdGhlIGp2bVJvdXRlIGFjdGl2aXR5IgorCQlkb21haW49IkNhdGFsaW5hIgorICAgICAgICBncm91cD0iTGlzdGVuZXIiCisJCXR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuc2Vzc2lvbi5Kdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyIj4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmZvIiAKKwkJICAgICAgICAgICBkZXNjcmlwdGlvbj0iZGVzY3JpYmUgdmVyc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im51bWJlck9mU2Vzc2lvbnMiIAorCQkgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBqdm1Sb3V0ZSBzZXNzaW9uIGNvcnJlY3Rpb25zIiAKKwkJICAgIHR5cGU9ImxvbmciIAorCQkgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDwvbWJlYW4+CisgICAgCisgICA8bWJlYW4gICAgICAgIG5hbWU9IkRlbHRhTWFuYWdlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2x1c3RlciBNYW5hZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNYW5hZ2VyIGludGVyZmFjZSIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9Ik1hbmFnZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuc2Vzc2lvbi5EZWx0YU1hbmFnZXIiPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImluZm8iIAorCQkgIGRlc2NyaXB0aW9uPSJkZXNjcmliZSB2ZXJzaW9uIgorCQkgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorCQkgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCQkgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImFsZ29yaXRobSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSB0byBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZworICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIGlkZW50aWZpZXJzIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyYW5kb21GaWxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJGaWxlIHNvdXJjZSBvZiByYW5kb20gLSAvZGV2L3VyYW5kb20gb3IgYSBwaXBlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGlzdHJpYnV0YWJsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGRpc3RyaWJ1dGFibGUgZmxhZyBmb3IgU2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgIE1hbmFnZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJlbnRyb3B5IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJBIFN0cmluZyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgdXNlZCB0byBpbmNyZWFzZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgZW50cm9weSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gb2Ygb3VyIHJhbmRvbSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4QWN0aXZlU2Vzc2lvbnMiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgU2Vzc2lvbnMgYWxsb3dlZCwgb3IgLTEKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5vIGxpbWl0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhJbmFjdGl2ZUludGVydmFsIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGVmYXVsdCBtYXhpbXVtIGluYWN0aXZlIGludGVydmFsIGZvciBTZXNzaW9ucworICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIGJ5IHRoaXMgTWFuYWdlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InByb2Nlc3NFeHBpcmVzRnJlcXVlbmN5IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBmcmVxdWVuY3kgb2YgdGhlIG1hbmFnZXIgY2hlY2tzIChleHBpcmF0aW9uIGFuZCBwYXNzaXZhdGlvbikiCisgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzZXNzaW9uSWRMZW5ndGgiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBzZXNzaW9uIGlkIGxlbmd0aCAoaW4gYnl0ZXMpIG9mIFNlc3Npb25zCisgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgYnkgdGhpcyBNYW5hZ2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGVzY3JpcHRpdmUgbmFtZSBvZiB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgKGZvciBsb2dnaW5nKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhY3RpdmVTZXNzaW9ucyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyBhdCB0aGlzIG1vbWVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzZXNzaW9uQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVG90YWwgbnVtYmVyIG9mIHNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyBtYW5hZ2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic2Vzc2lvblJlcGxhY2VDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUb3RhbCBudW1iZXIgb2YgcmVwbGFjZWQgc2Vzc2lvbnMgdGhhdCBsb2FkIGZyb20gZXh0ZXJuYWwgbm9kZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4QWN0aXZlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMgc28gZmFyIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic2Vzc2lvbk1heEFsaXZlVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTG9uZ2VzdCB0aW1lIGFuIGV4cGlyZWQgc2Vzc2lvbiBoYWQgYmVlbiBhbGl2ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNlc3Npb25BdmVyYWdlQWxpdmVUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJBdmVyYWdlIHRpbWUgYW4gZXhwaXJlZCBzZXNzaW9uIGhhZCBiZWVuIGFsaXZlIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic2VuZENsdXN0ZXJEb21haW5Pbmx5IgorICAgICAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgc2VuZENsdXN0ZXJEb21haW5Pbmx5IGZsYWcgc2VuZCBzZXNzaW9ucyBvbmx5IHRvIG1lbWJlcnMgYXMgc2FtZSBjbHVzdGVyIGRvbWFpbiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlamVjdGVkU2Vzc2lvbnMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik51bWJlciBvZiBzZXNzaW9ucyB3ZSByZWplY3RlZCBkdWUgdG8gbWF4QWN0aXZlIGJlZWluZyByZWFjaGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZXhwaXJlZFNlc3Npb25zIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJOdW1iZXIgb2Ygc2Vzc2lvbnMgdGhhdCBleHBpcmVkICggZG9lc24ndCBpbmNsdWRlIGV4cGxpY2l0IGludmFsaWRhdGlvbnMgKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InN0YXRlVHJhbnNmZXJUaW1lb3V0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzdGF0ZSB0cmFuc2ZlciB0aW1lb3V0IGluIHNlYyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRpbWUgc3BlbnQgZG9pbmcgaG91c2VrZWVwaW5nIGFuZCBleHBpcmF0aW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImR1cGxpY2F0ZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik51bWJlciBvZiBkdXBsaWNhdGVkIHNlc3Npb24gaWRzIGdlbmVyYXRlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvdW50ZXJSZWNlaXZlX0VWVF9HRVRfQUxMX1NFU1NJT05TIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3VudCByZWNlaXZlIEVWVF9HRVRfQUxMX1NFU1NJT05TIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb3VudGVyUmVjZWl2ZV9FVlRfQUxMX1NFU1NJT05fREFUQSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ291bnQgcmVjZWl2ZSBFVlRfQUxMX1NFU1NJT05fREFUQSBtZXNzYWdlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fQ1JFQVRFRCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ291bnQgcmVjZWl2ZSBFVlRfU0VTU0lPTl9DUkVBVEVEIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb3VudGVyUmVjZWl2ZV9FVlRfU0VTU0lPTl9ERUxUQSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ291bnQgcmVjZWl2ZSBFVlRfU0VTU0lPTl9ERUxUQSBtZXNzYWdlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY291bnRlclJlY2VpdmVfRVZUX1NFU1NJT05fQUNDRVNTRUQiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvdW50IHJlY2VpdmUgRVZUX1NFU1NJT05fQUNDRVNTRUQgbWVzc2FnZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvdW50ZXJSZWNlaXZlX0VWVF9TRVNTSU9OX0VYUElSRUQiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvdW50IHJlY2VpdmUgRVZUX1NFU1NJT05fRVhQSVJFRCBtZXNzYWdlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY291bnRlclJlY2VpdmVfRVZUX0FMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvdW50IHJlY2VpdmUgRVZUX0FMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEUgbWVzc2FnZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvdW50ZXJTZW5kX0VWVF9HRVRfQUxMX1NFU1NJT05TIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3VudCBzZW5kIEVWVF9HRVRfQUxMX1NFU1NJT05TIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb3VudGVyU2VuZF9FVlRfQUxMX1NFU1NJT05fREFUQSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ291bnQgc2VuZCBFVlRfQUxMX1NFU1NJT05fREFUQSBtZXNzYWdlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY291bnRlclNlbmRfRVZUX1NFU1NJT05fQ1JFQVRFRCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ291bnQgc2VuZCBFVlRfU0VTU0lPTl9DUkVBVEVEIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9ERUxUQSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ291bnQgc2VuZCBFVlRfU0VTU0lPTl9ERUxUQSBtZXNzYWdlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY291bnRlclNlbmRfRVZUX1NFU1NJT05fQUNDRVNTRUQiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvdW50IHNlbmQgRVZUX1NFU1NJT05fQUNDRVNTRUQgbWVzc2FnZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvdW50ZXJTZW5kX0VWVF9TRVNTSU9OX0VYUElSRUQiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvdW50IHNlbmQgRVZUX1NFU1NJT05fRVhQSVJFRCBtZXNzYWdlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY291bnRlclNlbmRfRVZUX0FMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvdW50IHNlbmQgRVZUX0FMTF9TRVNTSU9OX1RSQU5TRkVSQ09NUExFVEUgbWVzc2FnZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvdW50ZXJOb1N0YXRlVHJhbnNmZXJlZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ291bnQgdGhlIGZhaWxlZCBzZXNzaW9uIHRyYW5zZmVycyBub1N0YXRlVHJhbnNmZXJlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKyAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyZWNlaXZlZFF1ZXVlU2l6ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibGVuZ3RoIG9mIHJlY2VpdmUgcXVldWUgc2l6ZSB3aGVuIHNlc3Npb24gcmVjZWl2ZWQgZnJvbSBvdGhlciBub2RlIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPiAgICAgICAgICAgIAorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImV4cGlyZVNlc3Npb25zT25TaHV0ZG93biIKKyAgICAgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iZXhpcHJlIGFsbCBzZXNzaW9ucyBjbHVzdGVyIHdpZGUgYXMgb25lIG5vZGUgZ29lcyBkb3duIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24iCisgICAgICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlNlbmQgc2Vzc2lvbiBhdHRyaWJ1dGUgY2hhbmdlIGV2ZW50cyBvbiBiYWNrdXAgbm9kZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibm90aWZ5U2Vzc2lvbkxpc3RlbmVyc09uUmVwbGljYXRpb24iCisgICAgICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlNlbmQgc2Vzc2lvbiBzdGFydC9zdG9wIGV2ZW50cyBvbiBiYWNrdXAgbm9kZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic2VuZEFsbFNlc3Npb25zIgorICAgICAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJTZW5kIGFsbCBzZXNzaW9ucyBhdCBvbmUgYmlnIGJsb2NrIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNlbmRBbGxTZXNzaW9uc1NpemUiCisgICAgICAgICAgZGVzY3JpcHRpb249InNlc3Npb24gYmxvY2sgc2l6ZSB3aGVuIHNlbmRBbGxTZXNzaW9ucz1mYWxzZSAoZGVmYXVsdD0xMDAwKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNlbmRBbGxTZXNzaW9uc1dhaXRUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJ3YWl0IHRpbWUgYmV0d2VlbiBzZW5kIHNlc3Npb24gYmxvY2sgKGRlZmF1bHQgMiBzZWMpIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0ibGlzdFNlc3Npb25JZHMiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJldHVybiB0aGUgbGlzdCBvZiBhY3RpdmUgc2Vzc2lvbiBpZHMiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iZ2V0U2Vzc2lvbkF0dHJpYnV0ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmV0dXJuIGEgc2Vzc2lvbiBhdHRyaWJ1dGUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InNlc3Npb25JZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSWQgb2YgdGhlIHNlc3Npb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ia2V5IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJrZXkgb2YgdGhlIGF0dHJpYnV0ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImV4cGlyZVNlc3Npb24iCisgICAgICAgICAgZGVzY3JpcHRpb249IkV4cGlyZSBhIHNlc3Npb24iCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InNlc3Npb25JZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSWQgb2YgdGhlIHNlc3Npb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJnZXRMYXN0QWNjZXNzZWRUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJHZXQgdGhlIGxhc3QgYWNjZXNzIHRpbWUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InNlc3Npb25JZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSWQgb2YgdGhlIHNlc3Npb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAKKwk8b3BlcmF0aW9uIG5hbWU9ImV4cGlyZUFsbExvY2FsU2Vzc2lvbnMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRXhpcHJlIGFsbCBhY3RpdmUgbG9jYWwgc2Vzc2lvbnMgYW5kIHJlcGxpY2F0ZSB0aGUgaW52YWxpZCBzZXNzaW9ucyIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisKKwk8b3BlcmF0aW9uIG5hbWU9InByb2Nlc3NFeHBpcmVzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249ImZvcmNlIHByb2Nlc3MgdG8gZXhwaXJlIHNlc3Npb25zIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAKKwk8b3BlcmF0aW9uIG5hbWU9InJlc2V0U3RhdGlzdGljcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXNldCBhbGwgc3RhdGlzdGljcyIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisJPG9wZXJhdGlvbiBuYW1lPSJnZXRBbGxDbHVzdGVyU2Vzc2lvbnMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZCB0byBvbGRlc3QgY2x1c3RlciBtZW1iZXIgdGhhdCB0aGlzIG5vZGUgbmVlZCBhbGwgY2x1c3RlciBzZXNzaW9ucyAocmVzeW5jIG1lbWJlcikiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCisgIDwvbWJlYW4+CisKKzwvbWJlYW5zLWRlc2NyaXB0b3JzPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvdGNwL0NvbnN0YW50cy5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvdGNwL0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkM2Y3YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS90Y3AvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnRjcDsKKworLyoqCisgKiBNYW5pZmVzdCBjb25zdGFudHMgZm9yIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnRjcDwvY29kZT4KKyAqIHBhY2thZ2UuCisgKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhY2thZ2UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5oYS50Y3AiOworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS90Y3AvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS90Y3AvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiMmQzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3RjcC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMCwwICsxLDcyIEBACitBc3luY1NvY2tldFNlbmRlci5jcmVhdGUudGhyZWFkPUNyZWF0ZSBzZW5kZXIgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIHF1ZXVlIHRocmVhZCB0byB0Y3AgYmFja2dyb3VuZCByZXBsaWNhdGlvbgorQXN5bmNTb2NrZXRTZW5kZXIucXVldWUubWVzc2FnZT1RdWV1ZSBtZXNzYWdlIHRvIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSBpZD1bezJ9XSBzaXplPXszfQorQXN5bmNTb2NrZXRTZW5kZXIuc2VuZC5lcnJvcj1VbmFibGUgdG8gYXN5bmNocm9ub3VzbHkgc2VuZCBzZXNzaW9uIHdpdGggaWQ9W3swfV0gLSBtZXNzYWdlIHdpbGwgYmUgaWdub3JlZC4KK0FzeW5jU29ja2V0U2VuZGVyLnF1ZXVlLmVtcHR5PVF1ZXVlIGluIHNlbmRlciBbezB9OnsxLG51bWJlcixpbnRlZ2VyfV0gcmV0dXJuZWQgbnVsbCBlbGVtZW50IQorY2x1c3Rlci5tYmVhbi5yZWdpc3Rlci5hbHJlYWR5PU1CZWFuIHswfSBhbHJlYWR5IHJlZ2lzdGVyZWQhCitGYXN0QXN5bmNTb2NrZXRTZW5kZXIuc2V0VGhyZWFkUHJpb3JpdHk9W3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIHNldCBwcmlvcml0eSB0byB7Mn0KK0Zhc3RBc3luY1NvY2tldFNlbmRlci5taW4uZXhjZXB0aW9uPVt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSBuZXcgcHJpb3JpdHkgezJ9IDwgTUlOX1BSSU9SSVRZCitGYXN0QXN5bmNTb2NrZXRTZW5kZXIubWF4LmV4Y2VwdGlvbj1bezB9OnsxLG51bWJlcixpbnRlZ2VyfV0gbmV3IHByaW9yaXR5IHsyfSA+IE1BWF9QUklPUklUWQorSURhdGFTZW5kZXIuYWNrLmVvZj1FT0YgcmVhY2hlZCBhdCBsb2NhbCBwb3J0IFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XQorSURhdGFTZW5kZXIuYWNrLnJlY2VpdmU9R290IEFDSyBhdCBsb2NhbCBwb3J0IFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XQorSURhdGFTZW5kZXIuYWNrLm1pc3Npbmc9VW5hYmxlIHRvIHJlYWQgYWNrbm93bGVkZ2VtZW50IGZyb20gW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIGluIHsyLG51bWJlcixpbnRlZ2VyfSBtcy4gRGlzY29ubmVjdGluZyBzb2NrZXQsIGFuZCB0cnlpbmcgYWdhaW4uCitJRGF0YVNlbmRlci5hY2sucmVhZD1SZWFkIHdhaXQgYWNrIGNoYXIgJ3syfScgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dCitJRGF0YVNlbmRlci5hY2suc3RhcnQ9V2FpdGluZyBmb3IgQUNLIG1lc3NhZ2UgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dCitJRGF0YVNlbmRlci5hY2sud3Jvbmc9TWlzc2luZyBjb3JyZWN0IEFDSyBhZnRlciAxMCBieXRlcyByZWFkIGF0IGxvY2FsIHBvcnQgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dCitJRGF0YVNlbmRlci5jbG9zZVNvY2tldD1TZW5kZXIgY2xvc2Ugc29ja2V0IHRvIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSAoY2xvc2UgY291bnQgezIsbnVtYmVyLGludGVnZXJ9KQorSURhdGFTZW5kZXIuY29ubmVjdD1TZW5kZXIgY29ubmVjdCB0byBbezB9OnsxLG51bWJlcixpbnRlZ2VyfV0gKGNvbm5lY3QgY291bnQgezIsbnVtYmVyLGludGVnZXJ9KQorSURhdGFTZW5kZXIuY3JlYXRlPUNyZWF0ZSBzZW5kZXIgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dCitJRGF0YVNlbmRlci5kaXNjb25uZWN0PVNlbmRlciBkaXNjb25uZWN0IGZyb20gW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIChkaXNjb25uZWN0IGNvdW50IHsyLG51bWJlcixpbnRlZ2VyfSkKK0lEYXRhU2VuZGVyLm1lc3NhZ2UuZGlzY29ubmVjdD1NZXNzYWdlIHRyYW5zZmVyZWQ6IFNlbmRlciBjYW4ndCBkaXNjb25uZWN0IGZyb20gW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dCitJRGF0YVNlbmRlci5tZXNzYWdlLmNyZWF0ZT1NZXNzYWdlIHRyYW5zZmVyZWQ6IFNlbmRlciBjYW4ndCBjcmVhdGUgY3VycmVudCBzb2NrZXQgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dCitJRGF0YVNlbmRlci5vcGVuU29ja2V0PVNlbmRlciBvcGVuIHNvY2tldCB0byBbezB9OnsxLG51bWJlcixpbnRlZ2VyfV0gKG9wZW4gY291bnQgezIsbnVtYmVyLGludGVnZXJ9KQorSURhdGFTZW5kZXIub3BlblNvY2tldC5mYWlsdXJlPU9wZW4gc2VuZGVyIHNvY2tldCBbezB9OnsxLG51bWJlcixpbnRlZ2VyfV0gZmFpbHVyZSEgKG9wZW4gZmFpbHVyZSBjb3VudCB7MixudW1iZXIsaW50ZWdlcn0pCitJRGF0YVNlbmRlci5zZW5kLmFnYWluPVNlbmQgZGF0YSBhZ2FpbiB0byBbezB9OnsxLG51bWJlcixpbnRlZ2VyfV0KK0lEYXRhU2VuZGVyLnNlbmQuY3Jhc2g9U2VuZCBtZXNzYWdlIGNyYXNoZWQgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIHR5cGU9W3syfV0sIGlkPVt7M31dCitJRGF0YVNlbmRlci5zZW5kLm1lc3NhZ2U9U2VuZCBtZXNzYWdlIHRvIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSBpZD1bezJ9XSBzaXplPXszLG51bWJlcixpbnRlZ2VyfQorSURhdGFTZW5kZXIuc2VuZC5sb3N0PU1lc3NhZ2UgbG9zdDogW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIHR5cGU9W3syfV0sIGlkPVt7M31dCitJRGF0YVNlbmRlci5zZW5kZXJNb2Rlcy5Db25maWd1cmVkPUNvbmZpZ3VyZWQgYSBkYXRhIHJlcGxpY2F0aW9uIHNlbmRlciBmb3IgbW9kZSB7MH0KK0lEYXRhU2VuZGVyLnNlbmRlck1vZGVzLkluc3RhbnRpYXRlPUNhbid0IGluc3RhbnRpYXRlIGEgZGF0YSByZXBsaWNhdGlvbiBzZW5kZXIgb2YgY2xhc3MgezB9CitJRGF0YVNlbmRlci5zZW5kZXJNb2Rlcy5NaXNzaW5nPUNhbid0IGNvbmZpZ3VyZSBhIGRhdGEgcmVwbGljYXRpb24gc2VuZGVyIGZvciBtb2RlIHswfQorSURhdGFTZW5kZXIuc2VuZGVyTW9kZXMuUmVzb3VyY2VzPUNhbid0IGxvYWQgZGF0YSByZXBsaWNhdGlvbiBzZW5kZXIgbWFwcGluZyBsaXN0CitJRGF0YVNlbmRlci5zdGF0cz1TZW5kIHN0YXRzIGZyb20gW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dLCBOciBvZiBieXRlcyBzZW50PXsyLG51bWJlcixpbnRlZ2VyfSBvdmVyIHszfSA9IHs0LG51bWJlcixpbnRlZ2VyfSBieXRlcy9yZXF1ZXN0LCBwcm9jZXNzaW5nIHRpbWUgezUsbnVtYmVyLGludGVnZXJ9IG1zZWMsIGF2ZyBwcm9jZXNzaW5nIHRpbWUgezYsbnVtYmVyLGludGVnZXJ9IG1zZWMKK1Bvb2xTb2NrZXRTZW5kZXIuc2VuZGVyUXVldWUuc2VuZGVyLmZhaWxlZD1Qb29sU29ja2V0U2VuZGVyIGNyZWF0ZSBuZXcgc2VuZGVyIHRvIFt7MH06ezEsbnVtYmVyLGludGVnZXJ9XSBmYWlsZWQKK1Bvb2xTb2NrZXRTZW5kZXIubm9Nb3JlU2VuZGVyPU5vIHNvY2tldCBzZW5kZXIgYXZhaWxhYmxlIGZvciBjbGllbnQgW3swfTp7MSxudW1iZXIsaW50ZWdlcn1dIGRpZCBpdCBkaXNhcHBlYXJlZD8KK1JlcGxpY2F0aW9uVHJhbnNtaXR0ZXIuZ2V0UHJvcGVydHk9Z2V0IHByb3BlcnR5IHswfQorUmVwbGljYXRpb25UcmFuc21pdHRlci5zZXRQcm9wZXJ0eT1zZXQgcHJvcGVydHkgezB9OiB7MX0gb2xkIHZhbHVlIHsyfQorUmVwbGljYXRpb25UcmFuc21pdHRlci5zdGFydGVkPVN0YXJ0IENsdXN0ZXJTZW5kZXIgYXQgY2x1c3RlciB7MH0gd2l0aCBuYW1lIHsxfQorUmVwbGljYXRpb25UcmFuc21pdHRlci5zdG9wcGVkPVN0b3BwZWQgQ2x1c3RlclNlbmRlciBhdCBjbHVzdGVyIHswfSB3aXRoIG5hbWUgezF9CitSZXBsaWNhdGlvblZhbHZlLmNyb3NzQ29udGV4dC5hZGQ9YWRkIENyb3NzIENvbnRleHQgc2Vzc2lvbiByZXBsaWNhdGlvbiBjb250YWluZXIgdG8gcmVwbGljYXRpb25WYWx2ZSB0aHJlYWRsb2NhbAorUmVwbGljYXRpb25WYWx2ZS5jcm9zc0NvbnRleHQucmVnaXN0ZXJTZXNzaW9uPXJlZ2lzdGVyIENyb3NzIGNvbnRleHQgc2Vzc2lvbiBpZD17MH0gZnJvbSBjb250ZXh0IHsxfQorUmVwbGljYXRpb25WYWx2ZS5jcm9zc0NvbnRleHQucmVtb3ZlPXJlbW92ZSBDcm9zcyBDb250ZXh0IHNlc3Npb24gcmVwbGljYXRpb24gY29udGFpbmVyIGZyb20gcmVwbGljYXRpb25WYWx2ZSB0aHJlYWRsb2NhbAorUmVwbGljYXRpb25WYWx2ZS5jcm9zc0NvbnRleHQuc2VuZERlbHRhPXNlbmQgQ3Jvc3MgQ29udGV4dCBzZXNzaW9uIGRlbHRhIGZyb20gY29udGV4dCB7MH0uCitSZXBsaWNhdGlvblZhbHZlLmZpbHRlci5sb2FkaW5nPUxvYWRpbmcgcmVxdWVzdCBmaWx0ZXJzPXswfQorUmVwbGljYXRpb25WYWx2ZS5maWx0ZXIudG9rZW49UmVxdWVzdCBmaWx0ZXI9ezB9CitSZXBsaWNhdGlvblZhbHZlLmZpbHRlci50b2tlbi5mYWlsdXJlPVVuYWJsZSB0byBjb21waWxlIGZpbHRlcj17MH0KK1JlcGxpY2F0aW9uVmFsdmUuaW52b2tlLnVyaT1JbnZva2luZyByZXBsaWNhdGlvbiByZXF1ZXN0IG9uIHswfQorUmVwbGljYXRpb25WYWx2ZS5ub2NsdXN0ZXI9Tm8gY2x1c3RlciBjb25maWd1cmVkIGZvciB0aGlzIHJlcXVlc3QuCitSZXBsaWNhdGlvblZhbHZlLnJlc2V0RGVsdGFSZXF1ZXN0PUNsdXN0ZXIgaXMgc3RhbmRhbG9uZTogcmVzZXQgU2Vzc2lvbiBSZXF1ZXN0IERlbHRhIGF0IGNvbnRleHQgezB9CitSZXBsaWNhdGlvblZhbHZlLnNlbmQuZmFpbHVyZT1VbmFibGUgdG8gcGVyZm9ybSByZXBsaWNhdGlvbiByZXF1ZXN0LgorUmVwbGljYXRpb25WYWx2ZS5zZW5kLmludmFsaWQuZmFpbHVyZT1VbmFibGUgdG8gc2VuZCBzZXNzaW9uIFtpZD17MH1dIGludmFsaWQgbWVzc2FnZSBvdmVyIGNsdXN0ZXIuCitSZXBsaWNhdGlvblZhbHZlLnNlc3Npb24uZm91bmQ9Q29udGV4dCB7MH06IEZvdW5kIHNlc3Npb24gezF9IGJ1dCBpdCBpc24ndCBhIENsdXN0ZXJTZXNzaW9uLgorUmVwbGljYXRpb25WYWx2ZS5zZXNzaW9uLmluZGljYXRvcj1Db250ZXh0IHswfTogUHJpbWFyaXR5IG9mIHNlc3Npb24gezB9IGluIHJlcXVlc3QgYXR0cmlidXRlIHsxfSBpcyB7Mn0uCitSZXBsaWNhdGlvblZhbHZlLnNlc3Npb24uaW52YWxpZD1Db250ZXh0IHswfTogUmVxdWVzdGVkIHNlc3Npb24gezF9IGlzIGludmFsaWQsIHJlbW92ZWQgb3Igbm90IHJlcGxpY2F0ZWQgYXQgdGhpcyBub2RlLgorUmVwbGljYXRpb25WYWx2ZS5zdGF0cz1BdmVyYWdlIHJlcXVlc3QgdGltZT0gezB9IG1zIGZvciBDbHVzdGVyIG92ZXJoZWFkIHRpbWU9ezF9IG1zIGZvciB7Mn0gcmVxdWVzdHMgezN9IGZpbHRlciByZXF1ZXN0cyB7NH0gc2VuZCByZXF1ZXN0cyB7NX0gY3Jvc3MgY29udGV4dCByZXF1ZXN0cyAoUmVxdWVzdD17Nn0gbXMgQ2x1c3Rlcj17N30gbXMpLgorU2ltcGxlVGNwQ2x1c3Rlci5ldmVudC5sb2c9Q2x1c3RlciByZWNlaXZlIGxpc3RlbmVyIGV2ZW50IHswfSB3aXRoIGRhdGEgezF9CitTaW1wbGVUY3BDbHVzdGVyLmdldFByb3BlcnR5PWdldCBwcm9wZXJ0eSB7MH0KK1NpbXBsZVRjcENsdXN0ZXIuc2V0UHJvcGVydHk9c2V0IHByb3BlcnR5IHswfTogezF9IG9sZCB2YWx1ZSB7Mn0KK1NpbXBsZVRjcENsdXN0ZXIuZGVmYXVsdC5hZGRDbHVzdGVyTGlzdGVuZXI9QWRkIERlZmF1bHQgQ2x1c3Rlckxpc3RlbmVyIGF0IGNsdXN0ZXIgezB9CitTaW1wbGVUY3BDbHVzdGVyLmRlZmF1bHQuYWRkQ2x1c3RlclZhbHZlcz1BZGQgRGVmYXVsdCBDbHVzdGVyVmFsdmVzIGF0IGNsdXN0ZXIgezB9CitTaW1wbGVUY3BDbHVzdGVyLmRlZmF1bHQuYWRkQ2x1c3RlclJlY2VpdmVyPUFkZCBEZWZhdWx0IENsdXN0ZXJSZWNlaXZlciBhdCBjbHVzdGVyIHswfQorU2ltcGxlVGNwQ2x1c3Rlci5kZWZhdWx0LmFkZENsdXN0ZXJTZW5kZXI9QWRkIERlZmF1bHQgQ2x1c3RlclNlbmRlciBhdCBjbHVzdGVyIHswfQorU2ltcGxlVGNwQ2x1c3Rlci5kZWZhdWx0LmFkZE1lbWJlcnNoaXBTZXJ2aWNlPUFkZCBEZWZhdWx0IE1lbWJlcnNoaXAgU2VydmljZSBhdCBjbHVzdGVyIHswfQorU2ltcGxlVGNwQ2x1c3Rlci5sb2cucmVjZWl2ZT1SRUNFSVZFIHswLGRhdGV9OnswLHRpbWV9IHsxLG51bWJlcn0gezJ9OnszLG51bWJlcixpbnRlZ2VyfSB7NH0gezV9CitTaW1wbGVUY3BDbHVzdGVyLmxvZy5zZW5kPVNFTkQgezAsZGF0ZX06ezAsdGltZX0gezEsbnVtYmVyfSB7Mn06ezMsbnVtYmVyLGludGVnZXJ9IHs0fSAKK1NpbXBsZVRjcENsdXN0ZXIubG9nLnNlbmQuYWxsPVNFTkQgezAsZGF0ZX06ezAsdGltZX0gezEsbnVtYmVyfSAtIHsyfQorU29ja2V0UmVwbGljdGlvbkxpc3RlbmVyLmFsbHJlYWR5RXhpc3RzPVNlcnZlclNvY2tldCBbezB9OnsxfV0gYWxscmVhZHkgc3RhcnRlZCEKK1NvY2tldFJlcGxpY3Rpb25MaXN0ZW5lci5hY2NlcHQuZmFpbHVyZT1TZXJ2ZXJTb2NrZXQgW3swfTp7MX1dIC0gRXhjZXB0aW9uIHRvIHN0YXJ0IHRocmVhZCBvciBhY2NlcHQgc2VydmVyIHNvY2tldAorU29ja2V0UmVwbGljdGlvbkxpc3RlbmVyLm9wZW49T3BlbiBTb2NrZXQgYXQgW3swfTp7MX1dCitTb2NrZXRSZXBsaWN0aW9uTGlzdGVuZXIub3BlbmNsb3NlLmZhaWx1cmU9U2VydmVyU29ja2V0IFt7MH06ezF9XSAtIEV4Y2VwdGlvbiB0byBvcGVuIG9yIGNsb3NlIHNlcnZlciBzb2NrZXQKK1NvY2tldFJlcGxpY3Rpb25MaXN0ZW5lci5wb3J0YnVzeT1Qb3J0IGJ1c3kgYXQgW3swfTp7aX1dIC0gcmVhc29uIFt7Mn1dCitTb2NrZXRSZXBsaWN0aW9uTGlzdGVuZXIuc2VydmVyU29ja2V0Lm5vdEV4aXN0cz1GYXRhbCBlcnJvcjogUmVjZWl2ZXIgc29ja2V0IG5vdCBib3VuZCBhZGRyZXNzPXswfSBwb3J0PXsxfSBtYXhwb3J0PXsyfQorU29ja2V0UmVwbGljdGlvbkxpc3RlbmVyLnRpbWVvdXQ9UmVjZWl2ZXIgU2VydmVyU29ja2V0IG5vIHN0YXJ0ZWQgW3swfTp7MX1dIC0gcmVhc29uOiB0aW1lb3V0PXsyfSBvciBsaXN0ZW49ezN9CitTb2NrZXRSZXBsaWN0aW9uTGlzdGVuZXIudW5sb2NrU29ja2V0LmZhaWx1cmU9VW5Mb2Nrc29ja2V0IGZhaWx1cmUgYXQgU2VydmVyU29ja2V0IFt7MDp7MX1dCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS90Y3AvUmVwbGljYXRpb25WYWx2ZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvdGNwL1JlcGxpY2F0aW9uVmFsdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2QwOWZkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvdGNwL1JlcGxpY2F0aW9uVmFsdmUuamF2YQpAQCAtMCwwICsxLDY1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5oYS50Y3A7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNhdGFsaW5hQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJWYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnNlc3Npb24uRGVsdGFNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuc2Vzc2lvbi5EZWx0YVNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5WYWx2ZUJhc2U7CisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgYSBWYWx2ZSB0aGF0IGxvZ3MgaW50ZXJlc3RpbmcgY29udGVudHMgZnJvbSB0aGUKKyAqIHNwZWNpZmllZCBSZXF1ZXN0IChiZWZvcmUgcHJvY2Vzc2luZykgYW5kIHRoZSBjb3JyZXNwb25kaW5nIFJlc3BvbnNlCisgKiAoYWZ0ZXIgcHJvY2Vzc2luZykuICBJdCBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpbiBkZWJ1Z2dpbmcgcHJvYmxlbXMKKyAqIHJlbGF0ZWQgdG8gaGVhZGVycyBhbmQgY29va2llcy48L3A+CisgKgorICogPHA+VGhpcyBWYWx2ZSBtYXkgYmUgYXR0YWNoZWQgdG8gYW55IENvbnRhaW5lciwgZGVwZW5kaW5nIG9uIHRoZSBncmFudWxhcml0eQorICogb2YgdGhlIGxvZ2dpbmcgeW91IHdpc2ggdG8gcGVyZm9ybS48L3A+CisgKgorICogPHA+cHJpbWFyeUluZGljYXRvcj10cnVlLCB0aGVuIHRoZSByZXF1ZXN0IGF0dHJpYnV0ZSA8aT5vcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnRjcC5pc1ByaW1hcnlTZXNzaW9uLjwvaT4KKyAqIGlzIHNldCB0cnVlLCB3aGVuIHJlcXVlc3QgcHJvY2Vzc2luZyBpcyBhdCBzZXNzaW9ucyBwcmltYXJ5IG5vZGUuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXBsaWNhdGlvblZhbHZlCisgICAgZXh0ZW5kcyBWYWx2ZUJhc2UgaW1wbGVtZW50cyBDbHVzdGVyVmFsdmUgeworICAgIAorICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggUmVwbGljYXRpb25WYWx2ZS5jbGFzcyApOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuaGEudGNwLlJlcGxpY2F0aW9uVmFsdmUvMi4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIFN0cmluZ01hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgcHJpdmF0ZSBDYXRhbGluYUNsdXN0ZXIgY2x1c3RlciA9IG51bGwgOworCisgICAgLyoqCisgICAgICogaG9sZHMgZmlsZSBlbmRpbmdzIHRvIG5vdCBjYWxsIGZvciBsaWtlIGltYWdlcyBhbmQgb3RoZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuW10gcmVxRmlsdGVycyA9IG5ldyBqYXZhLnV0aWwucmVnZXguUGF0dGVyblswXTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBPcmdpbmFsIGZpbHRlciAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpbHRlciA7CisgICAgCisgICAgLyoqCisgICAgICogY3Jvc3NDb250ZXh0IHNlc3Npb24gY29udGFpbmVyIAorICAgICAqLworICAgIHByb3RlY3RlZCBUaHJlYWRMb2NhbCBjcm9zc0NvbnRleHRTZXNzaW9ucyA9IG5ldyBUaHJlYWRMb2NhbCgpIDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBkb1Byb2Nlc3NpbmdTdGF0cyAoZGVmYXVsdCA9IG9mZikKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb1Byb2Nlc3NpbmdTdGF0cyA9IGZhbHNlOworICAgIAorICAgIHByb3RlY3RlZCBsb25nIHRvdGFsUmVxdWVzdFRpbWUgPSAwOworICAgIHByb3RlY3RlZCBsb25nIHRvdGFsU2VuZFRpbWUgPSAwOworICAgIHByb3RlY3RlZCBsb25nIG5yT2ZSZXF1ZXN0cyA9IDA7CisgICAgcHJvdGVjdGVkIGxvbmcgbGFzdFNlbmRUaW1lID0gMDsKKyAgICBwcm90ZWN0ZWQgbG9uZyBuck9mRmlsdGVyUmVxdWVzdHMgPSAwOworICAgIHByb3RlY3RlZCBsb25nIG5yT2ZTZW5kUmVxdWVzdHMgPSAwOworICAgIHByb3RlY3RlZCBsb25nIG5yT2ZDcm9zc0NvbnRleHRTZW5kUmVxdWVzdHMgPSAwOworICAgIAorICAgIC8qKgorICAgICAqIG11c3QgcHJpbWFyeSBjaGFuZ2UgaW5kaWNhdG9yIHNldCAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmltYXJ5SW5kaWNhdG9yID0gZmFsc2UgOworICAgIAorICAgIC8qKgorICAgICAqIE5hbWUgb2YgcHJpbWFyeSBjaGFuZ2UgaW5kaWNhdG9yIGFzIHJlcXVlc3QgYXR0cmlidXRlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwcmltYXJ5SW5kaWNhdG9yTmFtZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnRjcC5pc1ByaW1hcnlTZXNzaW9uIjsKKyAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgcHVibGljIFJlcGxpY2F0aW9uVmFsdmUoKSB7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFZhbHZlIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2x1c3Rlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2F0YWxpbmFDbHVzdGVyIGdldENsdXN0ZXIoKSB7CisgICAgICAgIHJldHVybiBjbHVzdGVyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY2x1c3RlciBUaGUgY2x1c3RlciB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlcihDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICB0aGlzLmNsdXN0ZXIgPSBjbHVzdGVyOworICAgIH0KKyAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpbHRlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyKCkgeworICAgICAgIHJldHVybiBmaWx0ZXIgOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbXBpbGUgZmlsdGVyIHN0cmluZyB0byByZWd1bGFyIGV4cHJlc3Npb25zCisgICAgICogQHNlZSBQYXR0ZXJuI2NvbXBpbGUoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKiBAcGFyYW0gZmlsdGVyCisgICAgICogICAgICAgICAgICBUaGUgZmlsdGVyIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoU3RyaW5nIGZpbHRlcikgeworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJSZXBsaWNhdGlvblZhbHZlLmZpbHRlci5sb2FkaW5nIiwgZmlsdGVyKSk7CisgICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyOworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZmlsdGVyLCAiOyIpOworICAgICAgICB0aGlzLnJlcUZpbHRlcnMgPSBuZXcgUGF0dGVyblt0LmNvdW50VG9rZW5zKCldOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIHdoaWxlICh0Lmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHMgPSB0Lm5leHRUb2tlbigpOworICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy50cmFjZShzbS5nZXRTdHJpbmcoIlJlcGxpY2F0aW9uVmFsdmUuZmlsdGVyLnRva2VuIiwgcykpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXFGaWx0ZXJzW2krK10gPSBQYXR0ZXJuLmNvbXBpbGUocyk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoIlJlcGxpY2F0aW9uVmFsdmUuZmlsdGVyLnRva2VuLmZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgcyksIHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcmltYXJ5SW5kaWNhdG9yLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeUluZGljYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIHByaW1hcnlJbmRpY2F0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHByaW1hcnlJbmRpY2F0b3IgVGhlIHByaW1hcnlJbmRpY2F0b3IgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlJbmRpY2F0b3IoYm9vbGVhbiBwcmltYXJ5SW5kaWNhdG9yKSB7CisgICAgICAgIHRoaXMucHJpbWFyeUluZGljYXRvciA9IHByaW1hcnlJbmRpY2F0b3I7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJpbWFyeUluZGljYXRvck5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcmltYXJ5SW5kaWNhdG9yTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHByaW1hcnlJbmRpY2F0b3JOYW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcHJpbWFyeUluZGljYXRvck5hbWUgVGhlIHByaW1hcnlJbmRpY2F0b3JOYW1lIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5SW5kaWNhdG9yTmFtZShTdHJpbmcgcHJpbWFyeUluZGljYXRvck5hbWUpIHsKKyAgICAgICAgdGhpcy5wcmltYXJ5SW5kaWNhdG9yTmFtZSA9IHByaW1hcnlJbmRpY2F0b3JOYW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxjIHByb2Nlc3Npbmcgc3RhdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RvUHJvY2Vzc2luZ1N0YXRzKCkgeworICAgICAgICByZXR1cm4gZG9Qcm9jZXNzaW5nU3RhdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IENhbGMgcHJvY2Vzc2luZyBzdGF0cworICAgICAqIEBzZWUgI3Jlc2V0U3RhdGlzdGljcygpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9Qcm9jZXNzaW5nU3RhdHMoYm9vbGVhbiBkb1Byb2Nlc3NpbmdTdGF0cykgeworICAgICAgICB0aGlzLmRvUHJvY2Vzc2luZ1N0YXRzID0gZG9Qcm9jZXNzaW5nU3RhdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsYXN0U2VuZFRpbWUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TGFzdFNlbmRUaW1lKCkgeworICAgICAgICByZXR1cm4gbGFzdFNlbmRUaW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5yT2ZSZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXROck9mUmVxdWVzdHMoKSB7CisgICAgICAgIHJldHVybiBuck9mUmVxdWVzdHM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbnJPZkZpbHRlclJlcXVlc3RzLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldE5yT2ZGaWx0ZXJSZXF1ZXN0cygpIHsKKyAgICAgICAgcmV0dXJuIG5yT2ZGaWx0ZXJSZXF1ZXN0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5yT2ZDcm9zc0NvbnRleHRTZW5kUmVxdWVzdHMuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TnJPZkNyb3NzQ29udGV4dFNlbmRSZXF1ZXN0cygpIHsKKyAgICAgICAgcmV0dXJuIG5yT2ZDcm9zc0NvbnRleHRTZW5kUmVxdWVzdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuck9mU2VuZFJlcXVlc3RzLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldE5yT2ZTZW5kUmVxdWVzdHMoKSB7CisgICAgICAgIHJldHVybiBuck9mU2VuZFJlcXVlc3RzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdG90YWxSZXF1ZXN0VGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbFJlcXVlc3RUaW1lKCkgeworICAgICAgICByZXR1cm4gdG90YWxSZXF1ZXN0VGltZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0b3RhbFNlbmRUaW1lLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFRvdGFsU2VuZFRpbWUoKSB7CisgICAgICAgIHJldHVybiB0b3RhbFNlbmRUaW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVxRmlsdGVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5bXSBnZXRSZXFGaWx0ZXJzKCkgeworICAgICAgICByZXR1cm4gcmVxRmlsdGVyczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIHJlcUZpbHRlcnMgVGhlIHJlcUZpbHRlcnMgdG8gc2V0LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFJlcUZpbHRlcnMoamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5bXSByZXFGaWx0ZXJzKSB7CisgICAgICAgIHRoaXMucmVxRmlsdGVycyA9IHJlcUZpbHRlcnM7CisgICAgfQorICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGFsbCBjcm9zcyBjb250ZXh0IHNlc3Npb25zIGluc2lkZSBlbmRBY2Nlc3MuCisgICAgICogVXNlIGEgbGlzdCB3aXRoIGNvbnRhaW5zIGNoZWNrLCB0aGF0IHRoZSBQb3J0bGV0IEFQSSBjYW4gaW5jbHVkZSBhIGxvdCBvZiBmcmFnbWVudHMgZnJvbSBzYW1lIG9yCisgICAgICogZGlmZmVyZW50IGFwcGxpY2F0aW9ucyB3aXRoIHNlc3Npb24gY2hhbmdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uIGNyb3NzIGNvbnRleHQgc2Vzc2lvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVwbGljYXRpb25TZXNzaW9uKERlbHRhU2Vzc2lvbiBzZXNzaW9uKSB7CisgICAgICAgIExpc3Qgc2Vzc2lvbnMgPSAoTGlzdCljcm9zc0NvbnRleHRTZXNzaW9ucy5nZXQoKTsKKyAgICAgICAgaWYoc2Vzc2lvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYoIXNlc3Npb25zLmNvbnRhaW5zKHNlc3Npb24pKSB7CisgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIlJlcGxpY2F0aW9uVmFsdmUuY3Jvc3NDb250ZXh0LnJlZ2lzdGVyU2Vzc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldElkSW50ZXJuYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0TWFuYWdlcigpLmdldENvbnRhaW5lcigpLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgIHNlc3Npb25zLmFkZChzZXNzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExvZyB0aGUgaW50ZXJlc3RpbmcgcmVxdWVzdCBwYXJhbWV0ZXJzLCBpbnZva2UgdGhlIG5leHQgVmFsdmUgaW4gdGhlCisgICAgICogc2VxdWVuY2UsIGFuZCBsb2cgdGhlIGludGVyZXN0aW5nIHJlc3BvbnNlIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB0byBiZSBjcmVhdGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgdG90YWxzdGFydCA9IDA7CisKKyAgICAgICAgLy90aGlzIGhhcHBlbnMgYmVmb3JlIHRoZSByZXF1ZXN0CisgICAgICAgIGlmKGlzRG9Qcm9jZXNzaW5nU3RhdHMoKSkgeworICAgICAgICAgICAgdG90YWxzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB9CisgICAgICAgIGlmIChwcmltYXJ5SW5kaWNhdG9yKSB7CisgICAgICAgICAgICBjcmVhdGVQcmltYXJ5SW5kaWNhdG9yKHJlcXVlc3QpIDsKKyAgICAgICAgfQorICAgICAgICBDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldENvbnRleHQoKTsKKyAgICAgICAgYm9vbGVhbiBpc0Nyb3NzQ29udGV4dCA9IGNvbnRleHQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGNvbnRleHQgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQKKyAgICAgICAgICAgICAgICAmJiAoKFN0YW5kYXJkQ29udGV4dCkgY29udGV4dCkuZ2V0Q3Jvc3NDb250ZXh0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZihpc0Nyb3NzQ29udGV4dCkgeworICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJSZXBsaWNhdGlvblZhbHZlLmNyb3NzQ29udGV4dC5hZGQiKSk7CisgICAgICAgICAgICAgICAgLy9GSVhNRSBhZGQgUG9vbCBvZiBBcnJheWxpc3RzCisgICAgICAgICAgICAgICAgY3Jvc3NDb250ZXh0U2Vzc2lvbnMuc2V0KG5ldyBBcnJheUxpc3QoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZXROZXh0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIE1hbmFnZXIgbWFuYWdlciA9IHJlcXVlc3QuZ2V0Q29udGV4dCgpLmdldE1hbmFnZXIoKTsKKyAgICAgICAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwgJiYgbWFuYWdlciBpbnN0YW5jZW9mIENsdXN0ZXJNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgQ2x1c3Rlck1hbmFnZXIgY2x1c3Rlck1hbmFnZXIgPSAoQ2x1c3Rlck1hbmFnZXIpIG1hbmFnZXI7CisgICAgICAgICAgICAgICAgQ2F0YWxpbmFDbHVzdGVyIGNvbnRhaW5lckNsdXN0ZXIgPSAoQ2F0YWxpbmFDbHVzdGVyKSBnZXRDb250YWluZXIoKS5nZXRDbHVzdGVyKCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lckNsdXN0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiUmVwbGljYXRpb25WYWx2ZS5ub2NsdXN0ZXIiKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gdmFsdmUgY2x1c3RlciBjYW4gYWNjZXNzIG1hbmFnZXIgLSBvdGhlciBjbHVzdGVyIGhhbmRsZSByZXBsaWNhdGlvbiAKKyAgICAgICAgICAgICAgICAvLyBhdCBob3N0IGxldmVsIC0gaG9wZWZ1bGx5IQorICAgICAgICAgICAgICAgIGlmKGNvbnRhaW5lckNsdXN0ZXIuZ2V0TWFuYWdlcihjbHVzdGVyTWFuYWdlci5nZXROYW1lKCkpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgaWYoY29udGFpbmVyQ2x1c3Rlci5oYXNNZW1iZXJzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGxpY2F0aW9uTWVzc2FnZShyZXF1ZXN0LCB0b3RhbHN0YXJ0LCBpc0Nyb3NzQ29udGV4dCwgY2x1c3Rlck1hbmFnZXIsIGNvbnRhaW5lckNsdXN0ZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0UmVwbGljYXRpb25SZXF1ZXN0KHJlcXVlc3QsaXNDcm9zc0NvbnRleHQpOworICAgICAgICAgICAgICAgIH0gICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gQXJyYXkgbXVzdCBiZSByZW1vdmU6IEN1cnJlbnQgbWFzdGVyIHJlcXVlc3Qgc2VuZCBlbmRBY2Nlc3MgYXQgcmVjeWNsZS4gCisgICAgICAgICAgICAvLyBEb24ndCByZWdpc3RlciB0aGlzIHJlcXVlc3Qgc2Vzc2lvbiBhZ2FpbiEKKyAgICAgICAgICAgIGlmKGlzQ3Jvc3NDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIlJlcGxpY2F0aW9uVmFsdmUuY3Jvc3NDb250ZXh0LnJlbW92ZSIpKTsKKyAgICAgICAgICAgICAgICAvLyBjcm9zc0NvbnRleHRTZXNzaW9ucy5yZW1vdmUoKSBvbmx5IGV4aXN0IGF0IEphdmEgNQorICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIEFycmF5TGlzdCBhdCBhIHBvb2wKKyAgICAgICAgICAgICAgICBjcm9zc0NvbnRleHRTZXNzaW9ucy5zZXQobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiByZXNldCB0aGUgYWN0aXZlIHN0YXRpdGljcyAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldFN0YXRpc3RpY3MoKSB7CisgICAgICAgIHRvdGFsUmVxdWVzdFRpbWUgPSAwIDsKKyAgICAgICAgdG90YWxTZW5kVGltZSA9IDAgOworICAgICAgICBsYXN0U2VuZFRpbWUgPSAwIDsKKyAgICAgICAgbnJPZkZpbHRlclJlcXVlc3RzID0gMCA7CisgICAgICAgIG5yT2ZSZXF1ZXN0cyA9IDAgOworICAgICAgICBuck9mU2VuZFJlcXVlc3RzID0gMDsKKyAgICAgICAgbnJPZkNyb3NzQ29udGV4dFNlbmRSZXF1ZXN0cyA9IDA7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZW5kZXJpbmcgb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJSZXBsaWNhdGlvblZhbHZlWyIpOworICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoY29udGFpbmVyLmdldE5hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcmVxdWVzdAorICAgICAqIEBwYXJhbSB0b3RhbHN0YXJ0CisgICAgICogQHBhcmFtIGlzQ3Jvc3NDb250ZXh0CisgICAgICogQHBhcmFtIGNsdXN0ZXJNYW5hZ2VyCisgICAgICogQHBhcmFtIGNvbnRhaW5lckNsdXN0ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kUmVwbGljYXRpb25NZXNzYWdlKFJlcXVlc3QgcmVxdWVzdCwgbG9uZyB0b3RhbHN0YXJ0LCBib29sZWFuIGlzQ3Jvc3NDb250ZXh0LCBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlciwgQ2F0YWxpbmFDbHVzdGVyIGNvbnRhaW5lckNsdXN0ZXIpIHsKKyAgICAgICAgLy90aGlzIGhhcHBlbnMgYWZ0ZXIgdGhlIHJlcXVlc3QKKyAgICAgICAgbG9uZyBzdGFydCA9IDA7CisgICAgICAgIGlmKGlzRG9Qcm9jZXNzaW5nU3RhdHMoKSkgeworICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gc2VuZCBpbnZhbGlkIHNlc3Npb25zCisgICAgICAgICAgICAvLyBEZWx0YU1hbmFnZXIgcmV0dXJucyBTdHJpbmdbMF0KKyAgICAgICAgICAgIGlmICghKGNsdXN0ZXJNYW5hZ2VyIGluc3RhbmNlb2YgRGVsdGFNYW5hZ2VyKSkKKyAgICAgICAgICAgICAgICBzZW5kSW52YWxpZFNlc3Npb25zKGNsdXN0ZXJNYW5hZ2VyLCBjb250YWluZXJDbHVzdGVyKTsKKyAgICAgICAgICAgIC8vIHNlbmQgcmVwbGljYXRpb24KKyAgICAgICAgICAgIHNlbmRTZXNzaW9uUmVwbGljYXRpb25NZXNzYWdlKHJlcXVlc3QsIGNsdXN0ZXJNYW5hZ2VyLCBjb250YWluZXJDbHVzdGVyKTsKKyAgICAgICAgICAgIGlmKGlzQ3Jvc3NDb250ZXh0KQorICAgICAgICAgICAgICAgIHNlbmRDcm9zc0NvbnRleHRTZXNzaW9uKGNvbnRhaW5lckNsdXN0ZXIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgLy8gRklYTUUgd2UgaGF2ZSBhIGxvdCBvZiBzZW5kcywgYnV0IHRoZSB0cm91YmxlIHdpdGggb25lIG5vZGUgc3RvcHMgdGhlIGNvcnJlY3QgcmVwbGljYXRpb24gdG8gb3RoZXIgbm9kZXMhCisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJSZXBsaWNhdGlvblZhbHZlLnNlbmQuZmFpbHVyZSIpLCB4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgc3RhdHMgdXBkYXRlIGFyZSBub3QgY2hlYXAhIQorICAgICAgICAgICAgaWYoaXNEb1Byb2Nlc3NpbmdTdGF0cygpKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlU3RhdHModG90YWxzdGFydCxzdGFydCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIGFsbCBjaGFuZ2VkIGNyb3NzIGNvbnRleHQgc2Vzc2lvbnMgdG8gYmFja3VwcworICAgICAqIEBwYXJhbSBjb250YWluZXJDbHVzdGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2VuZENyb3NzQ29udGV4dFNlc3Npb24oQ2F0YWxpbmFDbHVzdGVyIGNvbnRhaW5lckNsdXN0ZXIpIHsKKyAgICAgICAgT2JqZWN0IHNlc3Npb25zID0gY3Jvc3NDb250ZXh0U2Vzc2lvbnMuZ2V0KCk7CisgICAgICAgIGlmKHNlc3Npb25zICE9IG51bGwgJiYgc2Vzc2lvbnMgaW5zdGFuY2VvZiBMaXN0CisgICAgICAgICAgICAgICAgJiYgKChMaXN0KXNlc3Npb25zKS5zaXplKCkgPjApIHsKKyAgICAgICAgICAgIGZvcihJdGVyYXRvciBpdGVyID0gKChMaXN0KXNlc3Npb25zKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKSA7KSB7ICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IChTZXNzaW9uKWl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJSZXBsaWNhdGlvblZhbHZlLmNyb3NzQ29udGV4dC5zZW5kRGVsdGEiLCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRNYW5hZ2VyKCkuZ2V0Q29udGFpbmVyKCkuZ2V0TmFtZSgpICkpOworICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKHNlc3Npb24sKENsdXN0ZXJNYW5hZ2VyKXNlc3Npb24uZ2V0TWFuYWdlcigpLGNvbnRhaW5lckNsdXN0ZXIpOworICAgICAgICAgICAgICAgIGlmKGlzRG9Qcm9jZXNzaW5nU3RhdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBuck9mQ3Jvc3NDb250ZXh0U2VuZFJlcXVlc3RzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAKKyAgICAvKioKKyAgICAgKiBGaXggbWVtb3J5IGxlYWsgZm9yIGxvbmcgc2Vzc2lvbnMgd2l0aCBtYW55IGNoYW5nZXMsIHdoZW4gbm8gYmFja3VwIG1lbWJlciBleGlzdHMhCisgICAgICogQHBhcmFtIHJlcXVlc3QgY3VycmVudCByZXF1ZXN0IGFmdGVyIHJlc3BvbmNlIGlzIGdlbmVyYXRlZAorICAgICAqIEBwYXJhbSBpc0Nyb3NzQ29udGV4dCBjaGVjayBjcm9zc2NvbnRleHQgdGhyZWFkbG9jYWwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZXNldFJlcGxpY2F0aW9uUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QsIGJvb2xlYW4gaXNDcm9zc0NvbnRleHQpIHsKKyAgICAgICAgU2Vzc2lvbiBjb250ZXh0U2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbkludGVybmFsKGZhbHNlKTsKKyAgICAgICAgaWYoY29udGV4dFNlc3Npb24gIT0gbnVsbCAmIGNvbnRleHRTZXNzaW9uIGluc3RhbmNlb2YgRGVsdGFTZXNzaW9uKXsKKyAgICAgICAgICAgIHJlc2V0RGVsdGFSZXF1ZXN0KGNvbnRleHRTZXNzaW9uKTsKKyAgICAgICAgICAgICgoRGVsdGFTZXNzaW9uKWNvbnRleHRTZXNzaW9uKS5zZXRQcmltYXJ5U2Vzc2lvbih0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZihpc0Nyb3NzQ29udGV4dCkgeworICAgICAgICAgICAgT2JqZWN0IHNlc3Npb25zID0gY3Jvc3NDb250ZXh0U2Vzc2lvbnMuZ2V0KCk7CisgICAgICAgICAgICBpZihzZXNzaW9ucyAhPSBudWxsICYmIHNlc3Npb25zIGluc3RhbmNlb2YgTGlzdAorICAgICAgICAgICAgICAgJiYgKChMaXN0KXNlc3Npb25zKS5zaXplKCkgPjApIHsKKyAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gKChMaXN0KXNlc3Npb25zKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIGZvcig7IGl0ZXIuaGFzTmV4dCgpIDspIHsgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IChTZXNzaW9uKWl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICByZXNldERlbHRhUmVxdWVzdChzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoc2Vzc2lvbiBpbnN0YW5jZW9mIERlbHRhU2Vzc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICgoRGVsdGFTZXNzaW9uKWNvbnRleHRTZXNzaW9uKS5zZXRQcmltYXJ5U2Vzc2lvbih0cnVlKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc2V0IERlbHRhUmVxdWVzdCBmcm9tIHNlc3Npb24KKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiBIdHRwU2Vzc2lvbiBmcm9tIGN1cnJlbnQgcmVxdWVzdCBvciBjcm9zcyBjb250ZXh0IHNlc3Npb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZXNldERlbHRhUmVxdWVzdChTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIlJlcGxpY2F0aW9uVmFsdmUucmVzZXREZWx0YVJlcXVlc3QiICwgCisgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRNYW5hZ2VyKCkuZ2V0Q29udGFpbmVyKCkuZ2V0TmFtZSgpICkpOworICAgICAgICB9CisgICAgICAgICgoRGVsdGFTZXNzaW9uKXNlc3Npb24pLnJlc2V0RGVsdGFSZXF1ZXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBDbHVzdGVyIFJlcGxpY2F0aW9uIFJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBjdXJyZW50IHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gbWFuYWdlciBzZXNzaW9uIG1hbmFnZXIKKyAgICAgKiBAcGFyYW0gY2x1c3RlciByZXBsaWNhdGlvbiBjbHVzdGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2VuZFNlc3Npb25SZXBsaWNhdGlvbk1lc3NhZ2UoUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgQ2x1c3Rlck1hbmFnZXIgbWFuYWdlciwgQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIpIHsKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwoZmFsc2UpOworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdXJpID0gcmVxdWVzdC5nZXREZWNvZGVkUmVxdWVzdFVSSSgpOworICAgICAgICAgICAgLy8gcmVxdWVzdCB3aXRob3V0IHNlc3Npb24gY2hhbmdlCisgICAgICAgICAgICBpZiAoIWlzUmVxdWVzdFdpdGhvdXRTZXNzaW9uQ2hhbmdlKHVyaSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIlJlcGxpY2F0aW9uVmFsdmUuaW52b2tlLnVyaSIsIHVyaSkpOworICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKHNlc3Npb24sbWFuYWdlcixjbHVzdGVyKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGlmKGlzRG9Qcm9jZXNzaW5nU3RhdHMoKSkKKyAgICAgICAgICAgICAgICAgICAgbnJPZkZpbHRlclJlcXVlc3RzKys7CisgICAgICAgIH0KKworICAgIH0KKworICAgLyoqCisgICAgKiBTZW5kIG1lc3NhZ2UgZGVsdGEgbWVzc2FnZSBmcm9tIHJlcXVlc3Qgc2Vzc2lvbiAKKyAgICAqIEBwYXJhbSByZXF1ZXN0IGN1cnJlbnQgcmVxdWVzdAorICAgICogQHBhcmFtIG1hbmFnZXIgc2Vzc2lvbiBtYW5hZ2VyCisgICAgKiBAcGFyYW0gY2x1c3RlciByZXBsaWNhdGlvbiBjbHVzdGVyCisgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kTWVzc2FnZShTZXNzaW9uIHNlc3Npb24sCisgICAgICAgICAgICAgQ2x1c3Rlck1hbmFnZXIgbWFuYWdlciwgQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIpIHsKKyAgICAgICAgU3RyaW5nIGlkID0gc2Vzc2lvbi5nZXRJZEludGVybmFsKCk7CisgICAgICAgIGlmIChpZCAhPSBudWxsKSB7CisgICAgICAgICAgICBzZW5kKG1hbmFnZXIsIGNsdXN0ZXIsIGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHNlbmQgbWFuYWdlciByZXF1ZXN0Q29tcGxldGVkIG1lc3NhZ2UgdG8gY2x1c3RlcgorICAgICAqIEBwYXJhbSBtYW5hZ2VyIFNlc3Npb25NYW5hZ2VyCisgICAgICogQHBhcmFtIGNsdXN0ZXIgcmVwbGljYXRpb24gY2x1c3RlcgorICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgc2Vzc2lvbmlkIGZyb20gdGhlIG1hbmFnZXIKKyAgICAgKiBAc2VlIERlbHRhTWFuYWdlciNyZXF1ZXN0Q29tcGxldGVkKFN0cmluZykKKyAgICAgKiBAc2VlIFNpbXBsZVRjcENsdXN0ZXIjc2VuZChDbHVzdGVyTWVzc2FnZSkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kKENsdXN0ZXJNYW5hZ2VyIG1hbmFnZXIsIENhdGFsaW5hQ2x1c3RlciBjbHVzdGVyLCBTdHJpbmcgc2Vzc2lvbklkKSB7CisgICAgICAgIENsdXN0ZXJNZXNzYWdlIG1zZyA9IG1hbmFnZXIucmVxdWVzdENvbXBsZXRlZChzZXNzaW9uSWQpOworICAgICAgICBpZiAobXNnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmKG1hbmFnZXIuaXNTZW5kQ2x1c3RlckRvbWFpbk9ubHkoKSkgeworICAgICAgICAgICAgICAgIGNsdXN0ZXIuc2VuZENsdXN0ZXJEb21haW4obXNnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2x1c3Rlci5zZW5kKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihpc0RvUHJvY2Vzc2luZ1N0YXRzKCkpCisgICAgICAgICAgICAgICAgbnJPZlNlbmRSZXF1ZXN0cysrOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIGNoZWNrIGZvciBzZXNzaW9uIGludmFsaWRhdGlvbnMKKyAgICAgKiBAcGFyYW0gbWFuYWdlcgorICAgICAqIEBwYXJhbSBjbHVzdGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2VuZEludmFsaWRTZXNzaW9ucyhDbHVzdGVyTWFuYWdlciBtYW5hZ2VyLCBDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICBTdHJpbmdbXSBpbnZhbGlkSWRzPW1hbmFnZXIuZ2V0SW52YWxpZGF0ZWRTZXNzaW9ucygpOworICAgICAgICBpZiAoIGludmFsaWRJZHMubGVuZ3RoID4gMCApIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpPTA7aTxpbnZhbGlkSWRzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNlbmQobWFuYWdlcixjbHVzdGVyLGludmFsaWRJZHNbaV0pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiUmVwbGljYXRpb25WYWx2ZS5zZW5kLmludmFsaWQuZmFpbHVyZSIsaW52YWxpZElkc1tpXSkseCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIGlzIHJlcXVlc3Qgd2l0aG91dCBwb3NzaWJsZSBzZXNzaW9uIGNoYW5nZQorICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlcXVlc3QgdXJpCisgICAgICogQHJldHVybiBUcnVlIGlmIG5vIHNlc3Npb24gY2hhbmdlCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXF1ZXN0V2l0aG91dFNlc3Npb25DaGFuZ2UoU3RyaW5nIHVyaSkgeworCisgICAgICAgIGJvb2xlYW4gZmlsdGVyZm91bmQgPSBmYWxzZTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgKGkgPCByZXFGaWx0ZXJzLmxlbmd0aCkgJiYgKCFmaWx0ZXJmb3VuZCk7IGkrKykgeworICAgICAgICAgICAgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXIgbWF0Y2hlciA9IHJlcUZpbHRlcnNbaV0ubWF0Y2hlcih1cmkpOworICAgICAgICAgICAgZmlsdGVyZm91bmQgPSBtYXRjaGVyLm1hdGNoZXMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmlsdGVyZm91bmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogcHJvdG9jb2wgY2x1c3RlciByZXBsaWNhdGlvbnMgc3RhdHMKKyAgICAgKiBAcGFyYW0gcmVxdWVzdFRpbWUKKyAgICAgKiBAcGFyYW0gY2x1c3RlclRpbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgIHZvaWQgdXBkYXRlU3RhdHMobG9uZyByZXF1ZXN0VGltZSwgbG9uZyBjbHVzdGVyVGltZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgbGFzdFNlbmRUaW1lPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgdG90YWxTZW5kVGltZSs9bGFzdFNlbmRUaW1lIC0gY2x1c3RlclRpbWU7CisgICAgICAgICAgICB0b3RhbFJlcXVlc3RUaW1lKz1sYXN0U2VuZFRpbWUgLSByZXF1ZXN0VGltZTsKKyAgICAgICAgICAgIG5yT2ZSZXF1ZXN0cysrOworICAgICAgICB9CisgICAgICAgIGlmKGxvZy5pc0luZm9FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmICggKG5yT2ZSZXF1ZXN0cyAlIDEwMCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJSZXBsaWNhdGlvblZhbHZlLnN0YXRzIiwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyh0b3RhbFJlcXVlc3RUaW1lL25yT2ZSZXF1ZXN0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcodG90YWxTZW5kVGltZS9uck9mUmVxdWVzdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKG5yT2ZSZXF1ZXN0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcobnJPZlNlbmRSZXF1ZXN0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcobnJPZkNyb3NzQ29udGV4dFNlbmRSZXF1ZXN0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcobnJPZkZpbHRlclJlcXVlc3RzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyh0b3RhbFJlcXVlc3RUaW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyh0b3RhbFNlbmRUaW1lKX0pKTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE1hcmsgUmVxdWVzdCB0aGF0IHByb2Nlc3NlZCBhdCBwcmltYXJ5IG5vZGUgd2l0aCBhdHRyaWJ1dGUKKyAgICAgKiBwcmltYXJ5SW5kaWNhdG9yTmFtZQorICAgICAqIAorICAgICAqIEBwYXJhbSByZXF1ZXN0CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByaW1hcnlJbmRpY2F0b3IoUmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgaWQgPSByZXF1ZXN0LmdldFJlcXVlc3RlZFNlc3Npb25JZCgpOworICAgICAgICBpZiAoKGlkICE9IG51bGwpICYmIChpZC5sZW5ndGgoKSA+IDApKSB7CisgICAgICAgICAgICBNYW5hZ2VyIG1hbmFnZXIgPSByZXF1ZXN0LmdldENvbnRleHQoKS5nZXRNYW5hZ2VyKCk7CisgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBtYW5hZ2VyLmZpbmRTZXNzaW9uKGlkKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uIGluc3RhbmNlb2YgQ2x1c3RlclNlc3Npb24pIHsKKyAgICAgICAgICAgICAgICBDbHVzdGVyU2Vzc2lvbiBjc2VzID0gKENsdXN0ZXJTZXNzaW9uKSBzZXNzaW9uOworICAgICAgICAgICAgICAgIGlmIChjc2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgQm9vbGVhbiBpc1ByaW1hcnkgPSBuZXcgQm9vbGVhbihjc2VzLmlzUHJpbWFyeVNlc3Npb24oKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXBsaWNhdGlvblZhbHZlLnNlc3Npb24uaW5kaWNhdG9yIiwgcmVxdWVzdC5nZXRDb250ZXh0KCkuZ2V0TmFtZSgpLGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5SW5kaWNhdG9yTmFtZSwgaXNQcmltYXJ5KSk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKHByaW1hcnlJbmRpY2F0b3JOYW1lLCBpc1ByaW1hcnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXBsaWNhdGlvblZhbHZlLnNlc3Npb24uZm91bmQiLCByZXF1ZXN0LmdldENvbnRleHQoKS5nZXROYW1lKCksaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXBsaWNhdGlvblZhbHZlLnNlc3Npb24uaW52YWxpZCIsIHJlcXVlc3QuZ2V0Q29udGV4dCgpLmdldE5hbWUoKSxpZCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS90Y3AvU2VuZE1lc3NhZ2VEYXRhLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS90Y3AvU2VuZE1lc3NhZ2VEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmNWNjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3RjcC9TZW5kTWVzc2FnZURhdGEuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEudGNwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBTZW5kTWVzc2FnZURhdGEgeworCisgICAgcHJpdmF0ZSBPYmplY3QgbWVzc2FnZSA7CisgICAgcHJpdmF0ZSBNZW1iZXIgZGVzdGluYXRpb24gOworICAgIHByaXZhdGUgRXhjZXB0aW9uIGV4Y2VwdGlvbiA7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24KKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIFNlbmRNZXNzYWdlRGF0YShPYmplY3QgbWVzc2FnZSwgTWVtYmVyIGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247CisgICAgICAgIHRoaXMuZXhjZXB0aW9uID0gZXhjZXB0aW9uOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlc3RpbmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXIgZ2V0RGVzdGluYXRpb24oKSB7CisgICAgICAgIHJldHVybiBkZXN0aW5hdGlvbjsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIFRoZSBkZXN0aW5hdGlvbiB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdGluYXRpb24oTWVtYmVyIGRlc3RpbmF0aW9uKSB7CisgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBleGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7CisgICAgICAgIHJldHVybiBleGNlcHRpb247CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgdGhpcy5leGNlcHRpb24gPSBleGNlcHRpb247CisgICAgfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShPYmplY3QgbWVzc2FnZSkgeworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3RjcC9TaW1wbGVUY3BDbHVzdGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS90Y3AvU2ltcGxlVGNwQ2x1c3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NjVlMDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS90Y3AvU2ltcGxlVGNwQ2x1c3Rlci5qYXZhCkBAIC0wLDAgKzEsOTQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnRjcDsKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0OworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNhdGFsaW5hQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcnNoaXBMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5Hcm91cENoYW5uZWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnNlc3Npb24uRGVsdGFNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEudXRpbC5JRHluYW1pY1Byb3BlcnR5OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5MaWZlY3ljbGVTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuSW50cm9zcGVjdGlvblV0aWxzOworCisvKioKKyAqIEEgPGI+Q2x1c3RlciA8L2I+IGltcGxlbWVudGF0aW9uIHVzaW5nIHNpbXBsZSBtdWx0aWNhc3QuIFJlc3BvbnNpYmxlIGZvcgorICogc2V0dGluZyB1cCBhIGNsdXN0ZXIgYW5kIHByb3ZpZGVzIGNhbGxlcnMgd2l0aCBhIHZhbGlkIG11bHRpY2FzdAorICogcmVjZWl2ZXIvc2VuZGVyLgorICogCisgKiBGSVhNRSByZW1vdmUgaW5zdGFsbC9yZW1vdmUvc3RhcnQvc3RvcCBjb250ZXh0IGR1bW15cworICogRklYTUUgd3JvdGUgdGVzdGNhc2VzIAorICogCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFNpbXBsZVRjcENsdXN0ZXIgCisgICAgaW1wbGVtZW50cyBDYXRhbGluYUNsdXN0ZXIsIExpZmVjeWNsZSwgTGlmZWN5Y2xlTGlzdGVuZXIsIElEeW5hbWljUHJvcGVydHksCisgICAgICAgICAgICAgICBNZW1iZXJzaGlwTGlzdGVuZXIsIENoYW5uZWxMaXN0ZW5lcnsKKworICAgIHB1YmxpYyBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNpbXBsZVRjcENsdXN0ZXIuY2xhc3MpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIlNpbXBsZVRjcENsdXN0ZXIvMi4yIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFRk9SRV9NRU1CRVJSRUdJU1RFUl9FVkVOVCA9ICJiZWZvcmVfbWVtYmVyX3JlZ2lzdGVyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFGVEVSX01FTUJFUlJFR0lTVEVSX0VWRU5UID0gImFmdGVyX21lbWJlcl9yZWdpc3RlciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUZPUkVfTUFOQUdFUlJFR0lTVEVSX0VWRU5UID0gImJlZm9yZV9tYW5hZ2VyX3JlZ2lzdGVyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFGVEVSX01BTkFHRVJSRUdJU1RFUl9FVkVOVCA9ICJhZnRlcl9tYW5hZ2VyX3JlZ2lzdGVyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFRk9SRV9NQU5BR0VSVU5SRUdJU1RFUl9FVkVOVCA9ICJiZWZvcmVfbWFuYWdlcl91bnJlZ2lzdGVyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFGVEVSX01BTkFHRVJVTlJFR0lTVEVSX0VWRU5UID0gImFmdGVyX21hbmFnZXJfdW5yZWdpc3RlciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUZPUkVfTUVNQkVSVU5SRUdJU1RFUl9FVkVOVCA9ICJiZWZvcmVfbWVtYmVyX3VucmVnaXN0ZXIiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUZURVJfTUVNQkVSVU5SRUdJU1RFUl9FVkVOVCA9ICJhZnRlcl9tZW1iZXJfdW5yZWdpc3RlciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRU5EX01FU1NBR0VfRkFJTFVSRV9FVkVOVCA9ICJzZW5kX21lc3NhZ2VfZmFpbHVyZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNFSVZFX01FU1NBR0VfRkFJTFVSRV9FVkVOVCA9ICJyZWNlaXZlX21lc3NhZ2VfZmFpbHVyZSI7CisgICAgCisgICAgLyoqCisgICAgICogR3JvdXAgY2hhbm5lbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2hhbm5lbCBjaGFubmVsID0gbmV3IEdyb3VwQ2hhbm5lbCgpOworCisKKyAgICAvKioKKyAgICAgKiBOYW1lIGZvciBsb2dnaW5nIHB1cnBvc2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNsdXN0ZXJJbXBOYW1lID0gIlNpbXBsZVRjcENsdXN0ZXIiOworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ01hbmFnZXIgc20gPSBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgLyoqCisgICAgICogVGhlIGNsdXN0ZXIgbmFtZSB0byBqb2luCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjbHVzdGVyTmFtZSA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENsdXN0ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbnRhaW5lciBjb250YWluZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIGxpZmVjeWNsZSBldmVudCBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlmZWN5Y2xlU3VwcG9ydCBsaWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlU3VwcG9ydCh0aGlzKTsKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIHN0YXJ0ZWQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IHN1cHBvcnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VTdXBwb3J0KHRoaXMpOworCisgICAgLyoqCisgICAgICogVGhlIGNvbnRleHQgbmFtZSA8LT5tYW5hZ2VyIGFzc29jaWF0aW9uIGZvciBkaXN0cmlidXRlZCBjb250ZXh0cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFwIG1hbmFnZXJzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIHByaXZhdGUgU3RyaW5nIG1hbmFnZXJDbGFzc05hbWUgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5oYS5zZXNzaW9uLkRlbHRhTWFuYWdlciI7CisKKworICAgIHByaXZhdGUgTGlzdCB2YWx2ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICBwcml2YXRlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3RlckRlcGxveWVyIGNsdXN0ZXJEZXBsb3llcjsKKworICAgIC8qKgorICAgICAqIExpc3RlbmVycyBvZiBtZXNzYWdlcworICAgICAqLworICAgIHByb3RlY3RlZCBMaXN0IGNsdXN0ZXJMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBDb21tZW50IGZvciA8Y29kZT5ub3RpZnlMaWZlY3ljbGVMaXN0ZW5lck9uRmFpbHVyZTwvY29kZT4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbm90aWZ5TGlmZWN5Y2xlTGlzdGVuZXJPbkZhaWx1cmUgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIGR5bmFtaWMgc2VuZGVyIDxjb2RlPnByb3BlcnRpZXM8L2NvZGU+CisgICAgICovCisgICAgcHJpdmF0ZSBNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgY2hhbm5lbFNlbmRPcHRpb25zID0gCisgICAgICAgIENoYW5uZWwuU0VORF9PUFRJT05TX0FTWU5DSFJPTk9VUyB8CisgICAgICAgIENoYW5uZWwuU0VORF9PUFRJT05TX1NZTkNIUk9OSVpFRF9BQ0sgfAorICAgICAgICBDaGFubmVsLlNFTkRfT1BUSU9OU19VU0VfQUNLOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICBwdWJsaWMgU2ltcGxlVGNwQ2x1c3RlcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBDbHVzdGVyIGltcGxlbWVudGF0aW9uIGFuZCB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGNsdXN0ZXIgdG8gam9pbiwgaWYgbm8gY2x1c3RlciB3aXRoIHRoaXMgbmFtZSBpcworICAgICAqIHByZXNlbnQgY3JlYXRlIG9uZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2x1c3Rlck5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBjbHVzdGVybmFtZSB0byBqb2luCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3Rlck5hbWUoU3RyaW5nIGNsdXN0ZXJOYW1lKSB7CisgICAgICAgIHRoaXMuY2x1c3Rlck5hbWUgPSBjbHVzdGVyTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNsdXN0ZXIgdGhhdCB0aGlzIFNlcnZlciBpcyBjdXJyZW50bHkgY29uZmlndXJlZAorICAgICAqIHRvIG9wZXJhdGUgd2l0aGluLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGNsdXN0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmVyCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbHVzdGVyTmFtZSgpIHsKKyAgICAgICAgaWYoY2x1c3Rlck5hbWUgPT0gbnVsbCAmJiBjb250YWluZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuZ2V0TmFtZSgpIDsKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXJOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCBvdXIgQ2x1c3RlcgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250YWluZXIKKyAgICAgKiAgICAgICAgICAgIFRoZSBDb250YWluZXIgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgQ29udGFpbmVyIG9sZENvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyOworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImNvbnRhaW5lciIsIG9sZENvbnRhaW5lciwgdGhpcy5jb250YWluZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgQ29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCBvdXIgQ2x1c3RlcgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIENvbnRhaW5lciBhc3NvY2lhdGVkIHdpdGggb3VyIENsdXN0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRhaW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBub3RpZnlMaWZlY3ljbGVMaXN0ZW5lck9uRmFpbHVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc05vdGlmeUxpZmVjeWNsZUxpc3RlbmVyT25GYWlsdXJlKCkgeworICAgICAgICByZXR1cm4gbm90aWZ5TGlmZWN5Y2xlTGlzdGVuZXJPbkZhaWx1cmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG5vdGlmeUxpc3RlbmVyT25GYWlsdXJlCisgICAgICogICAgICAgICAgICBUaGUgbm90aWZ5TGlmZWN5Y2xlTGlzdGVuZXJPbkZhaWx1cmUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmeUxpZmVjeWNsZUxpc3RlbmVyT25GYWlsdXJlKAorICAgICAgICAgICAgYm9vbGVhbiBub3RpZnlMaXN0ZW5lck9uRmFpbHVyZSkgeworICAgICAgICBib29sZWFuIG9sZE5vdGlmeUxpc3RlbmVyT25GYWlsdXJlID0gdGhpcy5ub3RpZnlMaWZlY3ljbGVMaXN0ZW5lck9uRmFpbHVyZTsKKyAgICAgICAgdGhpcy5ub3RpZnlMaWZlY3ljbGVMaXN0ZW5lck9uRmFpbHVyZSA9IG5vdGlmeUxpc3RlbmVyT25GYWlsdXJlOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgibm90aWZ5TGlmZWN5Y2xlTGlzdGVuZXJPbkZhaWx1cmUiLAorICAgICAgICAgICAgICAgIG9sZE5vdGlmeUxpc3RlbmVyT25GYWlsdXJlLAorICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5TGlmZWN5Y2xlTGlzdGVuZXJPbkZhaWx1cmUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFuYWdlckNsYXNzTmFtZSgpIHsKKyAgICAgICAgaWYobWFuYWdlckNsYXNzTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG1hbmFnZXJDbGFzc05hbWU7CisgICAgICAgIHJldHVybiAoU3RyaW5nKWdldFByb3BlcnR5KCJtYW5hZ2VyLmNsYXNzTmFtZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1hbmFnZXJDbGFzc05hbWUoU3RyaW5nIG1hbmFnZXJDbGFzc05hbWUpIHsKKyAgICAgICAgdGhpcy5tYW5hZ2VyQ2xhc3NOYW1lID0gbWFuYWdlckNsYXNzTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgY2x1c3RlciB2YWx2ZSAKKyAgICAgKiBDbHVzdGVyIFZhbHZlcyBhcmUgb25seSBhZGQgdG8gY29udGFpbmVyIHdoZW4gY2x1c3RlciBpcyBzdGFydGVkIQorICAgICAqIEBwYXJhbSB2YWx2ZSBUaGUgbmV3IGNsdXN0ZXIgVmFsdmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVmFsdmUoVmFsdmUgdmFsdmUpIHsKKyAgICAgICAgaWYgKHZhbHZlIGluc3RhbmNlb2YgQ2x1c3RlclZhbHZlKQorICAgICAgICAgICAgdmFsdmVzLmFkZCh2YWx2ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGFsbCBjbHVzdGVyIHZhbHZlcworICAgICAqIEByZXR1cm4gY3VycmVudCBjbHVzdGVyIHZhbHZlcworICAgICAqLworICAgIHB1YmxpYyBWYWx2ZVtdIGdldFZhbHZlcygpIHsKKyAgICAgICAgcmV0dXJuIChWYWx2ZVtdKSB2YWx2ZXMudG9BcnJheShuZXcgVmFsdmVbdmFsdmVzLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2x1c3RlciBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2x1c3Rlci4gSWYgdGhpcyBBcnJheSBoYXMKKyAgICAgKiBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2x1c3Rlckxpc3RlbmVyW10gZmluZENsdXN0ZXJMaXN0ZW5lcnMoKSB7CisgICAgICAgIGlmIChjbHVzdGVyTGlzdGVuZXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIENsdXN0ZXJMaXN0ZW5lcltdIGxpc3RlbmVyID0gbmV3IENsdXN0ZXJMaXN0ZW5lcltjbHVzdGVyTGlzdGVuZXJzLnNpemUoKV07CisgICAgICAgICAgICBjbHVzdGVyTGlzdGVuZXJzLnRvQXJyYXkobGlzdGVuZXIpOworICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2x1c3Rlckxpc3RlbmVyWzBdOworCisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGNsdXN0ZXIgbWVzc2FnZSBsaXN0ZW5lciBhbmQgcmVnaXN0ZXIgY2x1c3RlciB0byB0aGlzIGxpc3RlbmVyCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNhdGFsaW5hQ2x1c3RlciNhZGRDbHVzdGVyTGlzdGVuZXIob3JnLmFwYWNoZS5jYXRhbGluYS5oYS5NZXNzYWdlTGlzdGVuZXIpCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ2x1c3Rlckxpc3RlbmVyKENsdXN0ZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCAmJiAhY2x1c3Rlckxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKKyAgICAgICAgICAgIGNsdXN0ZXJMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLnNldENsdXN0ZXIodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUgbWVzc2FnZSBsaXN0ZW5lciBhbmQgZGVyZWdpc3RlciBDbHVzdGVyIGZyb20gbGlzdGVuZXIKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2F0YWxpbmFDbHVzdGVyI3JlbW92ZUNsdXN0ZXJMaXN0ZW5lcihvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLk1lc3NhZ2VMaXN0ZW5lcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDbHVzdGVyTGlzdGVuZXIoQ2x1c3Rlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBjbHVzdGVyTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgICAgICBsaXN0ZW5lci5zZXRDbHVzdGVyKG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGN1cnJlbnQgRGVwbG95ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyRGVwbG95ZXIgZ2V0Q2x1c3RlckRlcGxveWVyKCkgeworICAgICAgICByZXR1cm4gY2x1c3RlckRlcGxveWVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldCBhIG5ldyBEZXBsb3llciwgbXVzdCBiZSBzZXQgYmVmb3JlIGNsdXN0ZXIgc3RhcnRlZCEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbHVzdGVyRGVwbG95ZXIoCisgICAgICAgICAgICBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJEZXBsb3llciBjbHVzdGVyRGVwbG95ZXIpIHsKKyAgICAgICAgdGhpcy5jbHVzdGVyRGVwbG95ZXIgPSBjbHVzdGVyRGVwbG95ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hhbm5lbChDaGFubmVsIGNoYW5uZWwpIHsKKyAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBoYXMgbWVtYmVycworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc01lbWJlcnMgPSBmYWxzZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZW1iZXJzKCkgeworICAgICAgICByZXR1cm4gaGFzTWVtYmVyczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IGFsbCBjdXJyZW50IGNsdXN0ZXIgbWVtYmVycworICAgICAqIEByZXR1cm4gYWxsIG1lbWJlcnMgb3IgZW1wdHkgYXJyYXkgCisgICAgICovCisgICAgcHVibGljIE1lbWJlcltdIGdldE1lbWJlcnMoKSB7CisgICAgICAgIHJldHVybiBjaGFubmVsLmdldE1lbWJlcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1lbWJlciB0aGF0IHJlcHJlc2VudHMgdGhpcyBub2RlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gTWVtYmVyCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBnZXRMb2NhbE1lbWJlcigpIHsKKyAgICAgICAgcmV0dXJuIGNoYW5uZWwuZ2V0TG9jYWxNZW1iZXIodHJ1ZSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkeW5hbWljCisgICAgLy8gbWFuYWdlciBwcm9wZXJ0eSBoYW5kbGluZworCisgICAgLyoqCisgICAgICogSk1YIGhhY2sgdG8gZGlyZWN0IHVzZSBhdCBqY29uc29sZQorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBzZXRQcm9wZXJ0eShuYW1lLCAoT2JqZWN0KSB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IGNvbmZpZyBhdHRyaWJ1dGVzIHdpdGggcmVmbGVjdCBhbmQgcHJvcGFnYXRlIHRvIGFsbCBtYW5hZ2VycworICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cudHJhY2Uoc20uZ2V0U3RyaW5nKCJTaW1wbGVUY3BDbHVzdGVyLnNldFByb3BlcnR5IiwgbmFtZSwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0KG5hbWUpKSk7CisKKyAgICAgICAgcHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOworICAgICAgICBpZihzdGFydGVkKSB7CisgICAgICAgICAgICAvLyBGSVhNRSBIbW0sIGlzIHRoYXQgY29ycmVjdCB3aGVuIHNvbWUgRGVsdGFNYW5hZ2VycyBhcmUgZGlyZWN0IGNvbmZpZ3VyZWQgaW5zaWRlIENvbnRleHQ/CisgICAgICAgICAgICAvLyBXaHkgd2Ugbm90IHN1cHBvcnQgaXQgZm9yIG90aGVyIGVsZW1lbnRzLCBsaWtlIHNlbmRlciwgcmVjZWl2ZXIgb3IgbWVtYmVyc2hpcD8KKyAgICAgICAgICAgIC8vIE11c3Qgd2UgcmVzdGFydCBlbGVtZW50IGFmdGVyIGNoYW5nZT8KKyAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIm1hbmFnZXIiKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBuYW1lLnN1YnN0cmluZygibWFuYWdlciIubGVuZ3RoKCkgKyAxKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYW5hZ2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgTWFuYWdlciBtYW5hZ2VyID0gKE1hbmFnZXIpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZihtYW5hZ2VyIGluc3RhbmNlb2YgRGVsdGFNYW5hZ2VyICYmICgoQ2x1c3Rlck1hbmFnZXIpIG1hbmFnZXIpLmlzRGVmYXVsdE1vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgSW50cm9zcGVjdGlvblV0aWxzLnNldFByb3BlcnR5KG1hbmFnZXIsIGtleSwgcHZhbHVlICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGN1cnJlbnQgY29uZmlnCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqIEByZXR1cm4gVGhlIHByb3BlcnR5CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZShzbS5nZXRTdHJpbmcoIlNpbXBsZVRjcENsdXN0ZXIuZ2V0UHJvcGVydHkiLCBrZXkpKTsKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFsbCBwcm9wZXJ0aWVzIGtleXMKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIG92ZXIgdGhlIHByb3BlcnR5IG5hbWVzLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRQcm9wZXJ0eU5hbWVzKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydGllcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZSBhIGNvbmZpZ3VyZWQgcHJvcGVydHkuCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBrZXkpIHsKKyAgICAgICAgcHJvcGVydGllcy5yZW1vdmUoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0cmFuc2ZlciBwcm9wZXJ0aWVzIGZyb20gY2x1c3RlciBjb25maWd1cmF0aW9uIHRvIHN1YmVsZW1lbnQgYmVhbi4KKyAgICAgKiBAcGFyYW0gcHJlZml4CisgICAgICogQHBhcmFtIGJlYW4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0cmFuc2ZlclByb3BlcnR5KFN0cmluZyBwcmVmaXgsIE9iamVjdCBiZWFuKSB7CisgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UHJvcGVydHlOYW1lcygpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChwa2V5LnN0YXJ0c1dpdGgocHJlZml4KSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gcGtleS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCgpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldFByb3BlcnR5KHBrZXkpOworICAgICAgICAgICAgICAgICAgICBJbnRyb3NwZWN0aW9uVXRpbHMuc2V0UHJvcGVydHkoYmVhbiwga2V5LCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWFuYWdlcnMuCisgICAgICovCisgICAgcHVibGljIE1hcCBnZXRNYW5hZ2VycygpIHsKKyAgICAgICAgcmV0dXJuIG1hbmFnZXJzOworICAgIH0KKworICAgIHB1YmxpYyBDaGFubmVsIGdldENoYW5uZWwoKSB7CisgICAgICAgIHJldHVybiBjaGFubmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgTWFuYWdlciB3aXRob3V0IGFkZCB0byBjbHVzdGVyIChjb21lcyB3aXRoIHN0YXJ0IHRoZSBtYW5hZ2VyKQorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICBDb250ZXh0IE5hbWUgb2YgdGhpcyBtYW5hZ2VyCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLkNsdXN0ZXIjY3JlYXRlTWFuYWdlcihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqIEBzZWUgI2FkZE1hbmFnZXIoU3RyaW5nLCBNYW5hZ2VyKQorICAgICAqIEBzZWUgRGVsdGFNYW5hZ2VyI3N0YXJ0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE1hbmFnZXIgY3JlYXRlTWFuYWdlcihTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgQ2x1c3Rlck1hbmFnZXIgZm9yIGNvbnRleHQgIiArIG5hbWUgKyAiIHVzaW5nIGNsYXNzICIgKyBnZXRNYW5hZ2VyQ2xhc3NOYW1lKCkpOworICAgICAgICBNYW5hZ2VyIG1hbmFnZXIgPSBudWxsOworICAgICAgICBDbGFzc0xvYWRlciBvbGRDdHhMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoU2ltcGxlVGNwQ2x1c3Rlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIG1hbmFnZXIgPSAoTWFuYWdlcikgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhnZXRNYW5hZ2VyQ2xhc3NOYW1lKCkpLm5ld0luc3RhbmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBsb2FkIGNsYXNzIGZvciByZXBsaWNhdGlvbiBtYW5hZ2VyIiwgeCk7CisgICAgICAgICAgICBtYW5hZ2VyID0gbmV3IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuc2Vzc2lvbi5EZWx0YU1hbmFnZXIoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKG9sZEN0eExvYWRlcik7CisgICAgICAgICAgICBpZihtYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtYW5hZ2VyLnNldERpc3RyaWJ1dGFibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKG1hbmFnZXIgaW5zdGFuY2VvZiBDbHVzdGVyTWFuYWdlcikgeworICAgICAgICAgICAgICAgICAgICBDbHVzdGVyTWFuYWdlciBjbWFuYWdlciA9IChDbHVzdGVyTWFuYWdlcikgbWFuYWdlciA7CisgICAgICAgICAgICAgICAgICAgIGNtYW5hZ2VyLnNldERlZmF1bHRNb2RlKHRydWUpOworICAgICAgICAgICAgICAgICAgICBjbWFuYWdlci5zZXROYW1lKGdldE1hbmFnZXJOYW1lKG5hbWUsbWFuYWdlcikpOworICAgICAgICAgICAgICAgICAgICBjbWFuYWdlci5zZXRDbHVzdGVyKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWFuYWdlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUgYW4gYXBwbGljYXRpb24gZm9ybSBjbHVzdGVyIHJlcGxpY2F0aW9uIGJ1cworICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DYXRhbGluYUNsdXN0ZXIjcmVtb3ZlTWFuYWdlcihqYXZhLmxhbmcuU3RyaW5nLE1hbmFnZXIpCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTWFuYWdlcihTdHJpbmcgbmFtZSxNYW5hZ2VyIG1hbmFnZXIpIHsKKyAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfTUFOQUdFUlVOUkVHSVNURVJfRVZFTlQsbWFuYWdlcik7CisgICAgICAgICAgICBtYW5hZ2Vycy5yZW1vdmUoZ2V0TWFuYWdlck5hbWUobmFtZSxtYW5hZ2VyKSk7CisgICAgICAgICAgICBpZiAobWFuYWdlciBpbnN0YW5jZW9mIENsdXN0ZXJNYW5hZ2VyKSAoKENsdXN0ZXJNYW5hZ2VyKSBtYW5hZ2VyKS5zZXRDbHVzdGVyKG51bGwpOworICAgICAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChBRlRFUl9NQU5BR0VSVU5SRUdJU1RFUl9FVkVOVCwgbWFuYWdlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYW4gYXBwbGljYXRpb24gdG8gY2x1c3RlciByZXBsaWNhdGlvbiBidXMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gbWFuYWdlcgorICAgICAqICAgICAgICAgICAgbWFuYWdlciB0byByZWdpc3RlcgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DYXRhbGluYUNsdXN0ZXIjYWRkTWFuYWdlcihqYXZhLmxhbmcuU3RyaW5nLAorICAgICAqICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1hbmFnZXIoU3RyaW5nIG5hbWUsIE1hbmFnZXIgbWFuYWdlcikgeworICAgICAgICBpZiAoIW1hbmFnZXIuZ2V0RGlzdHJpYnV0YWJsZSgpKSB7CisgICAgICAgICAgICBsb2cud2FybigiTWFuYWdlciB3aXRoIG5hbWUgIiArIG5hbWUgKyAiIGlzIG5vdCBkaXN0cmlidXRhYmxlLCBjYW4ndCBhZGQgYXMgY2x1c3RlciBtYW5hZ2VyIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9NQU5BR0VSUkVHSVNURVJfRVZFTlQsIG1hbmFnZXIpOworICAgICAgICBTdHJpbmcgY2x1c3Rlck5hbWUgPSBnZXRNYW5hZ2VyTmFtZShuYW1lLCBtYW5hZ2VyKTsKKyAgICAgICAgaWYgKG1hbmFnZXIgaW5zdGFuY2VvZiBDbHVzdGVyTWFuYWdlcikgeworICAgICAgICAgICAgQ2x1c3Rlck1hbmFnZXIgY21hbmFnZXIgPSAoQ2x1c3Rlck1hbmFnZXIpIG1hbmFnZXIgOworICAgICAgICAgICAgY21hbmFnZXIuc2V0TmFtZShjbHVzdGVyTmFtZSk7CisgICAgICAgICAgICBjbWFuYWdlci5zZXRDbHVzdGVyKHRoaXMpOworICAgICAgICAgICAgaWYoY21hbmFnZXIuaXNEZWZhdWx0TW9kZSgpKSB0cmFuc2ZlclByb3BlcnR5KCJtYW5hZ2VyIixjbWFuYWdlcik7CisgICAgICAgIH0KKyAgICAgICAgbWFuYWdlcnMucHV0KGNsdXN0ZXJOYW1lLCBtYW5hZ2VyKTsKKyAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEFGVEVSX01BTkFHRVJSRUdJU1RFUl9FVkVOVCwgbWFuYWdlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBmb3IgdGhlIGNsdXN0ZXIgbWFuYWdlci4gIFRoaXMgbmFtZQorICAgICAqIGRlcGVuZHMgb24gd2hldGhlciB0aGUgY2x1c3RlciBtYW5hZ2VyIGlzIGRlZmluZWQgaW5zaWRlCisgICAgICogYSBIb3N0IG9yIGFuIEVuZ2luZS4KKyAgICAgKiBTaG91bGQgdGhlIGNsdXN0ZXIgYmUgZGVmaW5lZCBpbiB0aGUgRW5naW5lIGVsZW1lbnQsIHRoZSBtYW5hZ2VyIG5hbWUKKyAgICAgKiBpcyBIb3N0LmdldE5hbWUrIiMiK0NvbnRleHQuZ2V0TWFuYWdlcigpLmdldE5hbWUoKQorICAgICAqIG90aGVyd2lzZSB0aGUgbmFtZSBpcyBzaW1wbHkgQ29udGV4dC5nZXRNYW5hZ2VyKCkuZ2V0TmFtZSgpCisgICAgICogQHBhcmFtIG5hbWUgVGhlIGN1cnJlbnQgbmFtZQorICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBjbHVzdGVyIG1hbmFnZXIgaW1wbGVtZW50YXRpb24KKyAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGNsdXN0ZXIgbWFuYWdlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFuYWdlck5hbWUoU3RyaW5nIG5hbWUsIE1hbmFnZXIgbWFuYWdlcikgeworICAgICAgICBTdHJpbmcgY2x1c3Rlck5hbWUgPSBuYW1lIDsKKyAgICAgICAgaWYgKCBjbHVzdGVyTmFtZSA9PSBudWxsICkgY2x1c3Rlck5hbWUgPSBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldE5hbWUoKTsKKyAgICAgICAgaWYoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBFbmdpbmUpIHsKKyAgICAgICAgICAgIENvbnRhaW5lciBjb250ZXh0ID0gbWFuYWdlci5nZXRDb250YWluZXIoKSA7CisgICAgICAgICAgICBpZihjb250ZXh0ICE9IG51bGwgJiYgY29udGV4dCBpbnN0YW5jZW9mIENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBDb250YWluZXIgaG9zdCA9ICgoQ29udGV4dCljb250ZXh0KS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBpZihob3N0ICE9IG51bGwgJiYgaG9zdCBpbnN0YW5jZW9mIEhvc3QgJiYgY2x1c3Rlck5hbWUhPW51bGwgJiYgIShjbHVzdGVyTmFtZS5pbmRleE9mKCIjIik+PTApKQorICAgICAgICAgICAgICAgICAgICBjbHVzdGVyTmFtZSA9IGhvc3QuZ2V0TmFtZSgpICsiIyIgKyBjbHVzdGVyTmFtZSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsdXN0ZXJOYW1lOworICAgIH0KKworICAgIC8qCisgICAgICogR2V0IE1hbmFnZXIKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2F0YWxpbmFDbHVzdGVyI2dldE1hbmFnZXIoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFuYWdlciBnZXRNYW5hZ2VyKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiAoTWFuYWdlcikgbWFuYWdlcnMuZ2V0KG5hbWUpOworICAgIH0KKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgYSBwZXJpb2RpYyB0YXNrLCBzdWNoIGFzIHJlbG9hZGluZywgZXRjLiBUaGlzIG1ldGhvZCB3aWxsIGJlCisgICAgICogaW52b2tlZCBpbnNpZGUgdGhlIGNsYXNzbG9hZGluZyBjb250ZXh0IG9mIHRoaXMgY29udGFpbmVyLiBVbmV4cGVjdGVkCisgICAgICogdGhyb3dhYmxlcyB3aWxsIGJlIGNhdWdodCBhbmQgbG9nZ2VkLgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5kZXBsb3kuRmFybVdhckRlcGxveWVyI2JhY2tncm91bmRQcm9jZXNzKCkKKyAgICAgKiBAc2VlIFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIjYmFja2dyb3VuZFByb2Nlc3MoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJhY2tncm91bmRQcm9jZXNzKCkgeworICAgICAgICBpZiAoY2x1c3RlckRlcGxveWVyICE9IG51bGwpIGNsdXN0ZXJEZXBsb3llci5iYWNrZ3JvdW5kUHJvY2VzcygpOworICAgICAgICAvL3NlbmQgYSBoZWFydGJlYXQgdGhyb3VnaCB0aGUgY2hhbm5lbAorICAgICAgICBpZiAoIGNoYW5uZWwgIT1udWxsICkgY2hhbm5lbC5oZWFydGJlYXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlmZWN5Y2xlLiBJZiB0aGlzCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiBsaWZlY3ljbGUuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbGlmZWN5Y2xlLnJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2UgYXMgYmFzZSB0byBoYW5kbGUgc3RhcnQvc3RvcC9wZXJpb2RpYyBFdmVudHMgZnJvbSBob3N0LiBDdXJyZW50bHkKKyAgICAgKiBvbmx5IGxvZyB0aGUgbWVzc2FnZXMgYXMgdHJhY2UgbGV2ZWwuCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyI2xpZmVjeWNsZUV2ZW50KG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXZlbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgbGlmZWN5Y2xlRXZlbnQoTGlmZWN5Y2xlRXZlbnQgbGlmZWN5Y2xlRXZlbnQpIHsKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLnRyYWNlKHNtLmdldFN0cmluZygiU2ltcGxlVGNwQ2x1c3Rlci5ldmVudC5sb2ciLCBsaWZlY3ljbGVFdmVudC5nZXRUeXBlKCksIGxpZmVjeWNsZUV2ZW50LmdldERhdGEoKSkpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwdWJsaWMKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciA8Y29kZT5jb25maWd1cmUoKTwvY29kZT4sCisgICAgICogYW5kIGJlZm9yZSBhbnkgb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoZSBjb21wb25lbnQgYXJlIHV0aWxpemVkLiA8QlI+CisgICAgICogU3RhcnRzIHRoZSBjbHVzdGVyIGNvbW11bmljYXRpb24gY2hhbm5lbCwgdGhpcyB3aWxsIGNvbm5lY3Qgd2l0aCB0aGUKKyAgICAgKiBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3RlciwgYW5kIHJlcXVlc3QgdGhlIGN1cnJlbnQgc2Vzc2lvbiBzdGF0ZSB0byBiZQorICAgICAqIHRyYW5zZmVycmVkIHRvIHRoaXMgbm9kZS4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yIHRoYXQgcHJldmVudHMgdGhpcworICAgICAqICAgICAgICAgICAgICAgIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24oc20uZ2V0U3RyaW5nKCJjbHVzdGVyLmFscmVhZHlTdGFydGVkIikpOworICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkgbG9nLmluZm8oIkNsdXN0ZXIgaXMgYWJvdXQgdG8gc3RhcnQiKTsKKworICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQkVGT1JFX1NUQVJUX0VWRU5ULCB0aGlzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICggY2x1c3RlckRlcGxveWVyICE9IG51bGwgKSBjbHVzdGVyRGVwbG95ZXIuc2V0Q2x1c3Rlcih0aGlzKTsKKyAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJDbHVzdGVyVmFsdmUoKTsKKyAgICAgICAgICAgIGlmICggY2hhbm5lbCA9PSBudWxsICkgY2hhbm5lbCA9IG5ldyBHcm91cENoYW5uZWwoKTsKKyAgICAgICAgICAgIGNoYW5uZWwuYWRkTWVtYmVyc2hpcExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgY2hhbm5lbC5hZGRDaGFubmVsTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICBjaGFubmVsLnN0YXJ0KGNoYW5uZWwuREVGQVVMVCk7CisgICAgICAgICAgICBpZiAoY2x1c3RlckRlcGxveWVyICE9IG51bGwpIGNsdXN0ZXJEZXBsb3llci5zdGFydCgpOworICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQUZURVJfU1RBUlRfRVZFTlQsIHRoaXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gc3RhcnQgY2x1c3Rlci4iLCB4KTsKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24oeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWdpc3RlciBhbGwgY2x1c3RlciB2YWx2ZSB0byBob3N0IG9yIGVuZ2luZQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJDbHVzdGVyVmFsdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoY29udGFpbmVyICE9IG51bGwgKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2YWx2ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgQ2x1c3RlclZhbHZlIHZhbHZlID0gKENsdXN0ZXJWYWx2ZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIGFkZFZhbHZlIG9uICIgKyBnZXRDb250YWluZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aXRoIGNsYXNzPSIgKyB2YWx2ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHZlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgSW50cm9zcGVjdGlvblV0aWxzLmNhbGxNZXRob2ROKGdldENvbnRhaW5lcigpLCAiYWRkVmFsdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IHZhbHZlIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlLmNsYXNzIH0pOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbHZlLnNldENsdXN0ZXIodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB1bnJlZ2lzdGVyIGFsbCBjbHVzdGVyIHZhbHZlIHRvIGhvc3Qgb3IgZW5naW5lCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB1bnJlZ2lzdGVyQ2x1c3RlclZhbHZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHZhbHZlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIENsdXN0ZXJWYWx2ZSB2YWx2ZSA9IChDbHVzdGVyVmFsdmUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgcmVtb3ZlVmFsdmUgb24gIiArIGdldENvbnRhaW5lcigpCisgICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCBjbGFzcz0iICsgdmFsdmUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKHZhbHZlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgSW50cm9zcGVjdGlvblV0aWxzLmNhbGxNZXRob2ROKGdldENvbnRhaW5lcigpLCAicmVtb3ZlVmFsdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgdmFsdmUgfSwgbmV3IENsYXNzW10geyBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlLmNsYXNzIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdmUuc2V0Q2x1c3Rlcih0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgdGVybWluYXRlIHRoZSBhY3RpdmUgY2x1c3RlciBjb21wb25lbnQuPGJyLz4KKyAgICAgKiBUaGlzIHdpbGwgZGlzY29ubmVjdCB0aGUgY2x1c3RlciBjb21tdW5pY2F0aW9uIGNoYW5uZWwsIHN0b3AgdGhlCisgICAgICogbGlzdGVuZXIgYW5kIGRlcmVnaXN0ZXIgdGhlIHZhbHZlcyBmcm9tIGhvc3Qgb3IgZW5naW5lLjxici8+PGJyLz4KKyAgICAgKiA8Yj5Ob3RlOjwvYj48YnIvPlRoZSBzdWIgZWxlbWVudHMgcmVjZWl2ZXIsIHNlbmRlciwgbWVtYmVyc2hpcCwKKyAgICAgKiBsaXN0ZW5lciBvciB2YWx2ZXMgYXJlIG5vdCByZW1vdmVkLiBZb3UgY2FuIGVhc2lseSBzdGFydCB0aGUgY2x1c3RlciBhZ2Fpbi4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoaXMgY29tcG9uZW50IGhhcyBub3QgYmVlbiBzdGFydGVkCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IgdGhhdCBuZWVkcyB0byBiZQorICAgICAqICAgICAgICAgICAgICAgIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIGlmICghc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oc20uZ2V0U3RyaW5nKCJjbHVzdGVyLm5vdFN0YXJ0ZWQiKSk7CisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RPUF9FVkVOVCwgdGhpcyk7CisKKyAgICAgICAgaWYgKGNsdXN0ZXJEZXBsb3llciAhPSBudWxsKSBjbHVzdGVyRGVwbG95ZXIuc3RvcCgpOworICAgICAgICB0aGlzLm1hbmFnZXJzLmNsZWFyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIGNsdXN0ZXJEZXBsb3llciAhPSBudWxsICkgY2x1c3RlckRlcGxveWVyLnNldENsdXN0ZXIobnVsbCk7CisgICAgICAgICAgICBjaGFubmVsLnN0b3AoQ2hhbm5lbC5ERUZBVUxUKTsKKyAgICAgICAgICAgIGNoYW5uZWwucmVtb3ZlQ2hhbm5lbExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgY2hhbm5lbC5yZW1vdmVNZW1iZXJzaGlwTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICB0aGlzLnVucmVnaXN0ZXJDbHVzdGVyVmFsdmUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHN0b3AgY2x1c3RlciB2YWx2ZS4iLCB4KTsKKyAgICAgICAgfQorICAgICAgICBzdGFydGVkID0gZmFsc2U7CisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChBRlRFUl9TVE9QX0VWRU5ULCB0aGlzKTsKKyAgIH0KKworICAgIAorCisKKyAgICAvKioKKyAgICAgKiBzZW5kIG1lc3NhZ2UgdG8gYWxsIGNsdXN0ZXIgbWVtYmVycworICAgICAqIEBwYXJhbSBtc2cgbWVzc2FnZSB0byB0cmFuc2ZlcgorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DYXRhbGluYUNsdXN0ZXIjc2VuZChvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJNZXNzYWdlKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmQoQ2x1c3Rlck1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHNlbmQobXNnLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZW5kIG1lc3NhZ2UgdG8gYWxsIGNsdXN0ZXIgbWVtYmVycyBzYW1lIGNsdXN0ZXIgZG9tYWluCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNhdGFsaW5hQ2x1c3RlciNzZW5kKG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3Rlck1lc3NhZ2UpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VuZENsdXN0ZXJEb21haW4oQ2x1c3Rlck1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHNlbmQobXNnLG51bGwpOworICAgIH0gCisKKyAgICAKKyAgICAvKioKKyAgICAgKiBzZW5kIGEgY2x1c3RlciBtZXNzYWdlIHRvIG9uZSBtZW1iZXIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnIG1lc3NhZ2UgdG8gdHJhbnNmZXIKKyAgICAgKiBAcGFyYW0gZGVzdCBSZWNlaXZlciBtZW1iZXIKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2F0YWxpbmFDbHVzdGVyI3NlbmQob3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyTWVzc2FnZSwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuTWVtYmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmQoQ2x1c3Rlck1lc3NhZ2UgbXNnLCBNZW1iZXIgZGVzdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbXNnLnNldEFkZHJlc3MoZ2V0TG9jYWxNZW1iZXIoKSk7CisgICAgICAgICAgICBpZiAoZGVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKCFnZXRMb2NhbE1lbWJlcigpLmVxdWFscyhkZXN0KSkgeworICAgICAgICAgICAgICAgICAgICBjaGFubmVsLnNlbmQobmV3IE1lbWJlcltdIHtkZXN0fSwgbXNnLGNoYW5uZWxTZW5kT3B0aW9ucyk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHNlbmQgbWVzc2FnZSB0byBsb2NhbCBtZW1iZXIgIiArIG1zZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNoYW5uZWwuc2VuZChjaGFubmVsLmdldE1lbWJlcnMoKSxtc2csY2hhbm5lbFNlbmRPcHRpb25zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHNlbmQgbWVzc2FnZSB0aHJvdWdoIGNsdXN0ZXIgc2VuZGVyLiIsIHgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTmV3IGNsdXN0ZXIgbWVtYmVyIGlzIHJlZ2lzdGVyZWQKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuTWVtYmVyc2hpcExpc3RlbmVyI21lbWJlckFkZGVkKG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuTWVtYmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1lbWJlckFkZGVkKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGhhc01lbWJlcnMgPSBjaGFubmVsLmhhc01lbWJlcnMoKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKSBsb2cuaW5mbygiUmVwbGljYXRpb24gbWVtYmVyIGFkZGVkOiIgKyBtZW1iZXIpOworICAgICAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfTUVNQkVSUkVHSVNURVJfRVZFTlQsIG1lbWJlcik7CisgICAgICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEFGVEVSX01FTUJFUlJFR0lTVEVSX0VWRU5ULCBtZW1iZXIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gY29ubmVjdCB0byByZXBsaWNhdGlvbiBzeXN0ZW0uIiwgeCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIENsdXN0ZXIgbWVtYmVyIGlzIGdvbmUKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuTWVtYmVyc2hpcExpc3RlbmVyI21lbWJlckRpc2FwcGVhcmVkKG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuTWVtYmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGhhc01lbWJlcnMgPSBjaGFubmVsLmhhc01lbWJlcnMoKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKSBsb2cuaW5mbygiUmVjZWl2ZWQgbWVtYmVyIGRpc2FwcGVhcmVkOiIgKyBtZW1iZXIpOworICAgICAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfTUVNQkVSVU5SRUdJU1RFUl9FVkVOVCwgbWVtYmVyKTsKKyAgICAgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQUZURVJfTUVNQkVSVU5SRUdJU1RFUl9FVkVOVCwgbWVtYmVyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHJlbW92ZSBjbHVzdGVyIG5vZGUgZnJvbSByZXBsaWNhdGlvbiBzeXN0ZW0uIiwgeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVjZWl2ZXIKKyAgICAvLyBtZXNzYWdlcworCisgICAgLyoqCisgICAgICogbm90aWZ5IGFsbCBsaXN0ZW5lcnMgZnJvbSByZWNlaXZpbmcgYSBuZXcgbWVzc2FnZSBpcyBub3QgQ2x1c3Rlck1lc3NhZ2UKKyAgICAgKiBlbWl0dCBGYWlsdXJlIEV2ZW50IHRvIExpZmVjeWxjZUxpc3RlbmVyCisgICAgICogCisgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHJlY2V2ZWl2ZWQgTWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChTZXJpYWxpemFibGUgbXNnLCBNZW1iZXIgc2VuZGVyKSB7CisgICAgICAgIHJldHVybiAobXNnIGluc3RhbmNlb2YgQ2x1c3Rlck1lc3NhZ2UpOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoU2VyaWFsaXphYmxlIG1lc3NhZ2UsIE1lbWJlciBzZW5kZXIpIHsKKyAgICAgICAgQ2x1c3Rlck1lc3NhZ2UgZndkID0gKENsdXN0ZXJNZXNzYWdlKW1lc3NhZ2U7CisgICAgICAgIGZ3ZC5zZXRBZGRyZXNzKHNlbmRlcik7CisgICAgICAgIG1lc3NhZ2VSZWNlaXZlZChmd2QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZWNlaXZlZChDbHVzdGVyTWVzc2FnZSBtZXNzYWdlKSB7CisKKyAgICAgICAgbG9uZyBzdGFydCA9IDA7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSAmJiBtZXNzYWdlICE9IG51bGwpCisgICAgICAgICAgICBsb2cuZGVidWcoIkFzc3VtaW5nIGNsb2NrcyBhcmUgc3luY2hlZDogUmVwbGljYXRpb24gZm9yICIKKyAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlLmdldFVuaXF1ZUlkKCkgKyAiIHRvb2s9IgorICAgICAgICAgICAgICAgICAgICArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIChtZXNzYWdlKS5nZXRUaW1lc3RhbXAoKSkKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1zLiIpOworCisgICAgICAgIC8vaW52b2tlIGFsbCB0aGUgbGlzdGVuZXJzCisgICAgICAgIGJvb2xlYW4gYWNjZXB0ZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY2x1c3Rlckxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBDbHVzdGVyTGlzdGVuZXIgbGlzdGVuZXIgPSAoQ2x1c3Rlckxpc3RlbmVyKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIuYWNjZXB0KG1lc3NhZ2UpKSB7CisgICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubWVzc2FnZVJlY2VpdmVkKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWFjY2VwdGVkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBpZiAobm90aWZ5TGlmZWN5Y2xlTGlzdGVuZXJPbkZhaWx1cmUpIHsKKyAgICAgICAgICAgICAgICBNZW1iZXIgZGVzdCA9IG1lc3NhZ2UuZ2V0QWRkcmVzcygpOworICAgICAgICAgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFJFQ0VJVkVfTUVTU0FHRV9GQUlMVVJFX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlbmRNZXNzYWdlRGF0YShtZXNzYWdlLCBkZXN0LCBudWxsKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2cuZGVidWcoIk1lc3NhZ2UgIiArIG1lc3NhZ2UudG9TdHJpbmcoKSArICIgZnJvbSB0eXBlICIKKyAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlLmdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiB0cmFuc2ZlcmVkIGJ1dCBubyBsaXN0ZW5lciByZWdpc3RlcmVkIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMb2dnZXIKKworICAgIHB1YmxpYyBMb2cgZ2V0TG9nZ2VyKCkgeworICAgICAgICByZXR1cm4gbG9nOworICAgIH0KKworCisKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlcHJlY2F0ZWQKKworICAgIC8qKgorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5DbHVzdGVyI3NldFByb3RvY29sKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvdG9jb2woU3RyaW5nIHByb3RvY29sKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLkNsdXN0ZXIjZ2V0UHJvdG9jb2woKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5DbHVzdGVyI3N0YXJ0Q29udGV4dChqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q29udGV4dChTdHJpbmcgY29udGV4dFBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5DbHVzdGVyI2luc3RhbGxDb250ZXh0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubmV0LlVSTCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnN0YWxsQ29udGV4dChTdHJpbmcgY29udGV4dFBhdGgsIFVSTCB3YXIpIHsKKyAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLkNsdXN0ZXIjc3RvcChqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoU3RyaW5nIGNvbnRleHRQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS90Y3AvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3RjcC9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMDQxNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9oYS90Y3AvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApAQCAtMCwwICsxLDEwNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgbWJlYW5zLWRlc2NyaXB0b3JzIFBVQkxJQworICAgIi0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9EVEQgTW9kZWwgTUJlYW5zIENvbmZpZ3VyYXRpb24gRmlsZSIKKyAgICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvZHRkcy9tYmVhbnMtZGVzY3JpcHRvcnMuZHRkIj4KKzxtYmVhbnMtZGVzY3JpcHRvcnM+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iU2ltcGxlVGNwQ2x1c3RlciIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IlRjcCBDbHVzdGVyIGltcGxlbWVudGF0aW9uIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iQ2x1c3RlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5oYS50Y3AuU2ltcGxlVGNwQ2x1c3RlciI+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImluZm8iCisgICAgICAgICAgZGVzY3JpcHRpb249IkNsYXNzIHZlcnNpb24gaW5mbyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJub3RpZnlMaWZlY3ljbGVMaXN0ZW5lck9uRmFpbHVyZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibm90aWZ5IGxpZmVjeWNsZUxpc3RlbmVyIGZyb20gbWVzc2FnZSB0cmFuc2ZlciBmYWlsdXJlIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPiAgICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsdXN0ZXJOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJuYW1lIG9mIGNsdXN0ZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWFuYWdlckNsYXNzTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2Vzc2lvbiBtYW5hbmFnZXIgY2xhc3NuYW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsdXN0ZXJMb2dOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJOYW1lIG9mIGNsdXN0ZXIgdHJhbnNmZXIgbG9nIGRldmljZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkb0NsdXN0ZXJMb2ciCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJlbmFibGUgY2x1c3RlciBsb2cgdHJhbnNmZXIgbG9nZ2luZyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgIDxvcGVyYXRpb24gICBuYW1lPSJzZXRQcm9wZXJ0eSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZXQgYSBwcm9wZXJ0eSB0byBhbGwgY2x1c3RlciBtYW5hZ2VycyAod2l0aCBwcmVmaXggJ21hbmFnZXIuJykiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJrZXkiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJQcm9wZXJ0eSBuYW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUHJvcGVydHkgdmFsdWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJzZW5kIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InNlbmQgbWVzc2FnZSB0byBhbGwgY2x1c3RlciBtZW1iZXJzIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWVzc2FnZSIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InJlcGxpY2F0aW9uIG1lc3NhZ2UiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3Rlck1lc3NhZ2UiLz4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0ic2VuZENsdXN0ZXJEb21haW4iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZCBtZXNzYWdlIHRvIGFsbCBjbHVzdGVyIG1lbWJlcnMgd2l0aCBzYW1lIGRvbWFpbiIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lc3NhZ2UiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJyZXBsaWNhdGlvbiBtZXNzYWdlIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJNZXNzYWdlIi8+CisgICAgPC9vcGVyYXRpb24+CisgICAgICAgIAorICAgIDxvcGVyYXRpb24gICBuYW1lPSJzZW5kVG9NZW1iZXIiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZCBtZXNzYWdlIHRvIG9uZSBjbHVzdGVyIG1lbWJlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lc3NhZ2UiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJyZXBsaWNhdGlvbiBtZXNzYWdlIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLi5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lbWJlciIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249ImNsdXN0ZXIgbWVtYmVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0ic3RhcnQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhcnQgdGhlIGNsdXN0ZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdG9wIHRoZSBjbHVzdGVyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgCisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iQ2x1c3RlclJlY2VpdmVyQmFzZSIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IlRjcCBDbHVzdGVyIFJlcGxpY2F0aW9uTGlzdGVuZXIgaW1wbGVtZW50YXRpb24iCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJDbHVzdGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnRjcC5DbHVzdGVyUmVjZWl2ZXJCYXNlIj4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iaW5mbyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2xhc3MgdmVyc2lvbiBpbmZvIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InRjcExpc3RlbkFkZHJlc3MiCisgICAgICAgICAgZGVzY3JpcHRpb249InRjcCBsaXN0ZW5lciBhZGRyZXNzIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InRjcExpc3RlblBvcnQiCisgICAgICAgICAgZGVzY3JpcHRpb249InRjcCBsaXN0ZW5lciBwb3J0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idGNwVGhyZWFkQ291bnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiB0Y3AgbGlzdGVuZXIgd29ya2VyIHRocmVhZHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0Y3BTZWxlY3RvclRpbWVvdXQiCisgICAgICAgICAgZGVzY3JpcHRpb249InRjcCBsaXN0ZW5lciBTZWxlY3RvciB0aW1lb3V0IgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5yT2ZNc2dzUmVjZWl2ZWQiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIG90aGVyIG5vZGVzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlY2VpdmVkVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0idG90YWwgdGltZSBtZXNzYWdlIHNlbmQgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyZWNlaXZlZFByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJyZWNlaXZlZCBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWluUmVjZWl2ZWRQcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWluaW1hbCByZWNlaXZlZCBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXZnUmVjZWl2ZWRQcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icmVjZWl2ZWQgcHJvY2Vzc2luZyB0aW1lIC8gbnJPZlJlcXVlc3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJkb3VibGUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4UmVjZWl2ZWRQcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWF4aW1hbCByZWNlaXZlZCBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZG9SZWNlaXZlZFByb2Nlc3NpbmdTdGF0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY3JlYXRlIHJlY2VpdmVkIHByb2Nlc3NpbmcgdGltZSBzdGF0cyIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+ICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhdmdUb3RhbFJlY2VpdmVkQnl0ZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249InJlY2VpdmVkIHRvdGFsUmVjZWl2ZWRCeXRlcyAvIG5yT2ZNc2dzUmVjZWl2ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idG90YWxSZWNlaXZlZEJ5dGVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic2VuZEFjayIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZCBhY2sgYWZ0ZXIgZGF0YSByZWNlaXZlZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbXByZXNzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJkYXRhIHJlY2VpdmVkIGNvbXByZXNzZWQiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkb0xpc3RlbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iaXMgcG9ydCByZWFsbHkgc3RhcnRlZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgIAorCTxvcGVyYXRpb24gbmFtZT0icmVzZXRTdGF0aXN0aWNzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJlc2V0IGFsbCBzdGF0aXN0aWNzIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4JCisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0ic3RhcnQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhcnQgdGhlIGNsdXN0ZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdG9wIHRoZSBjbHVzdGVyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgCisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iU29ja2V0UmVwbGljYXRpb25MaXN0ZW5lciIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IlRjcCBDbHVzdGVyIFNvY2tldFJlcGxpY2F0aW9uTGlzdGVuZXIgaW1wbGVtZW50YXRpb24iCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJDbHVzdGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnRjcC5Tb2NrZXRSZXBsaWNhdGlvbkxpc3RlbmVyIj4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iaW5mbyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2xhc3MgdmVyc2lvbiBpbmZvIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InRjcExpc3RlbkFkZHJlc3MiCisgICAgICAgICAgZGVzY3JpcHRpb249InRjcCBsaXN0ZW5lciBhZGRyZXNzIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InRjcExpc3RlblBvcnQiCisgICAgICAgICAgZGVzY3JpcHRpb249InRjcCBsaXN0ZW5lciBwb3J0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idGNwTGlzdGVuTWF4UG9ydCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWF4IHRjcCBsaXN0ZW4gdXNlZCBwb3J0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idGNwTGlzdGVuVGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWF4IHRjcCBsaXN0ZW4gdGltZW91dCAoc2VjKSB3YWl0IGZvciBTZXJ2ZXJTb2NrZXQgc3RhcnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPiAgICAgICAgICAgICAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibnJPZk1zZ3NSZWNlaXZlZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gb3RoZXIgbm9kZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVjZWl2ZWRUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJ0b3RhbCB0aW1lIG1lc3NhZ2Ugc2VuZCB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlY2VpdmVkUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InJlY2VpdmVkIHByb2Nlc3NpbmcgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtaW5SZWNlaXZlZFByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtaW5pbWFsIHJlY2VpdmVkIHByb2Nlc3NpbmcgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhdmdSZWNlaXZlZFByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJyZWNlaXZlZCBwcm9jZXNzaW5nIHRpbWUgLyBuck9mUmVxdWVzdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImRvdWJsZSIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhSZWNlaXZlZFByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXhpbWFsIHJlY2VpdmVkIHByb2Nlc3NpbmcgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkb1JlY2VpdmVkUHJvY2Vzc2luZ1N0YXRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjcmVhdGUgcmVjZWl2ZWQgcHJvY2Vzc2luZyB0aW1lIHN0YXRzIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIgLz4gICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImF2Z1RvdGFsUmVjZWl2ZWRCeXRlcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icmVjZWl2ZWQgdG90YWxSZWNlaXZlZEJ5dGVzIC8gbnJPZk1zZ3NSZWNlaXZlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0b3RhbFJlY2VpdmVkQnl0ZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBieXRlcyByZWNlaXZlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzZW5kQWNrIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZW5kIGFjayBhZnRlciBkYXRhIHJlY2VpdmVkIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKyAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb21wcmVzcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iZGF0YSByZWNlaXZlZCBjb21wcmVzc2VkIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKyAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkb0xpc3RlbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iaXMgcG9ydCByZWFsbHkgc3RhcnRlZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgIAorCTxvcGVyYXRpb24gbmFtZT0icmVzZXRTdGF0aXN0aWNzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJlc2V0IGFsbCBzdGF0aXN0aWNzIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4JCisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0ic3RhcnQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhcnQgdGhlIGNsdXN0ZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdG9wIHRoZSBjbHVzdGVyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgCisgIDwvbWJlYW4+CisgIAorICA8bWJlYW4gICAgICAgICBuYW1lPSJSZXBsaWNhdGlvblRyYW5zbWl0dGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUY3AgcmVwbGljYXRpb24gdHJhbnNtaXR0ZXIiCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJDbHVzdGVyU2VuZGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnRjcC5SZXBsaWNhdGlvblRyYW5zbWl0dGVyIj4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iaW5mbyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2xhc3MgdmVyc2lvbiBpbmZvIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlcGxpY2F0aW9uTW9kZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icmVwbGljYXRpb24gbW9kZSAoc3luY2hub3VzLHBvb2xlZC5hc3luY2hub3VzLGZhc3Rhc3luY3F1ZXVlKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhY2tUaW1lb3V0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJhY2tub3dsZWRnZSB0aW1lb3V0IgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImF1dG9Db25uZWN0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJpcyBzZW5kZXIgZGlzYWJsZWQsIGZvcmsgYSBuZXcgc29ja2V0IgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0id2FpdEZvckFjayIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iV2FpdCBmb3IgYWNrIGFmdGVyIGRhdGEgc2VuZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZW5kaW5nIHByb2Nlc3NpbmcgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtaW5Qcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWluaW1hbCBzZW5kaW5nIHByb2Nlc3NpbmcgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhdmdQcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icHJvY2Vzc2luZyB0aW1lIC8gbnJPZlJlcXVlc3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJkb3VibGUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4UHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1heGltYWwgc2VuZGluZyBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZG9UcmFuc21pdHRlclByb2Nlc3NpbmdTdGF0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY3JlYXRlIHByb2Nlc3NpbmcgdGltZSBzdGF0cyIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+ICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJuck9mUmVxdWVzdHMiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBzZW5kIG1lc3NhZ2VzIHRvIG90aGVyIG1lbWJlcnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idG90YWxCeXRlcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVyZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZmFpbHVyZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiB3cm9uZyB0cmFuc2ZlcnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKwk8YXR0cmlidXRlIG5hbWU9InNlbmRlck9iamVjdE5hbWVzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249ImdldCBhbGwgc2VuZGVyIG9iamVjdCBuYW1lcyIKKyAgICAgICAgICAgICAgIHR5cGU9IltMamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8b3BlcmF0aW9uICAgbmFtZT0ic3RhcnQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhcnQgdGhlIGNsdXN0ZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPiAgICAKKyAgICA8b3BlcmF0aW9uIG5hbWU9InN0b3AiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RvcCB0aGUgY2x1c3RlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisJPG9wZXJhdGlvbiBuYW1lPSJyZXNldFN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVzZXQgYWxsIHN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgkKKwk8b3BlcmF0aW9uIG5hbWU9ImNoZWNrS2VlcEFsaXZlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkNoZWNrIGFsbCBzZW5kZXIgY29ubmVjdGlvbiBmb3IgY2xvc2Ugc29ja2V0IChrZWVwYWxpdmUpIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgPC9tYmVhbj4KKworICA8bWJlYW4gICAgICAgICBuYW1lPSJBc3luY1NvY2tldFNlbmRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQXN5bmMgQ2x1c3RlciBTZW5kZXIiCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJJRGF0YVNlbmRlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5oYS50Y3AuQXN5bmNTb2NrZXRTZW5kZXIiPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJpbmZvIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDbGFzcyB2ZXJzaW9uIGluZm8iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWRkcmVzcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGVyIGlwIGFkZHJlc3MiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubmV0LkluZXRBZGRyZXNzIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InBvcnQiCisgICAgICAgICAgZGVzY3JpcHRpb249InNlbmRlciBwb3J0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InN1c3BlY3QiCisgICAgICAgICAgZGVzY3JpcHRpb249IlNvY2tldCBpcyBnb25lIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9IndhaXRGb3JBY2siCisgICAgICAgICAgZGVzY3JpcHRpb249IldhaXQgZm9yIGFjayBhZnRlciBkYXRhIHNlbmQiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImFja1RpbWVvdXQiCisgICAgICAgICAgZGVzY3JpcHRpb249ImFja25vd2xlZGdlIHRpbWVvdXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4gICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhdmdNZXNzYWdlU2l6ZSIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYXZnIG1lc3NhZ2Ugc2l6ZSAodG90YWxieXRlcy9uck9mUmVxdWVzdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icXVldWVTaXplIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJxdWV1ZSBzaXplIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icXVldWVkTnJPZkJ5dGVzIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2YgYnl0ZXMgb3ZlciBhbGwgcXVldWVkIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1lc3NhZ2VUcmFuc2ZlclN0YXJ0ZWQiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1lc3NhZ2UgaXMgaW4gdHJhbnNmZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtlZXBBbGl2ZVRpbWVvdXQiCisgICAgICAgICAgZGVzY3JpcHRpb249ImFjdGl2ZSBzb2NrZXQga2VlcCBhbGl2ZSB0aW1lb3V0IgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWF4IHJlcXVlc3Qgb3ZlciB0aGlzIHNvY2tldCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtlZXBBbGl2ZUNvdW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJrZWVwIEFsaXZlIHJlcXVlc3QgY291bnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJrZWVwQWxpdmVDb25uZWN0VGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29ubmVjdCB0aW1lIGZvciBrZWVwIGFsaXZlIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlc2VuZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWZ0ZXIgc2VuZCBmYWlsdXJlIG1ha2UgYSByZXNlbmQiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIiAvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0ZWQiCisgICAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzb2NrZXQgY29ubmVjdGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIHNlbmQgbWVzc2FnZXMgdG8gb3RoZXIgbWVtYmVycyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0b3RhbEJ5dGVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGluZyBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWluUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1pbmltYWwgc2VuZGluZyBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXZnUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InByb2Nlc3NpbmcgdGltZSAvIG5yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iZG91YmxlIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heFByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXhpbWFsIHNlbmRpbmcgcHJvY2Vzc2luZyB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRvUHJvY2Vzc2luZ1N0YXRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjcmVhdGUgcHJvY2Vzc2luZyB0aW1lIHN0YXRzIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0id2FpdEFja1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InNlbmRpbmcgd2FpdEFjayB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1pbldhaXRBY2tUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtaW5pbWFsIHNlbmRpbmcgd2FpdEFjayB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImF2Z1dhaXRBY2tUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJ3YWl0QWNrIHRpbWUgLyBuck9mUmVxdWVzdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImRvdWJsZSIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhXYWl0QWNrVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWF4aW1hbCBzZW5kaW5nIHdhaXRBY2sgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkb1dhaXRBY2tTdGF0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY3JlYXRlIHdhaXRBY2sgdGltZSBzdGF0cyIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3RDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgY29ubmVjdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGlzY29ubmVjdENvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBkaXNjb25uZWN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzb2NrZXRPcGVuQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIG9wZW4gc29ja2V0IChLZWVwQWxpdmUgYW5kIGNvbm5lY3RzKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzb2NrZXRPcGVuRmFpbHVyZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBvcGVuIHNvY2tldCBmYWlsdXJlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPiAgICAgICAgICAgICAgICAgCQkJCSAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic29ja2V0Q2xvc2VDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgY2xvc2VkIHNvY2tldCAoS2VlcEFsaXZlIGFuZCBkaXNjb25uZWN0cykiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWlzc2luZ0Fja0NvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBtaXNzaW5nIGFjayIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkYXRhUmVzZW5kQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGRhdGEgcmVzZW5kcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkYXRhRmFpbHVyZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBkYXRhIHNlbmQgZmFpbHVyZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iaW5RdWV1ZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBhbGwgcXVldWVkIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im91dFF1ZXVlQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGFsbCBzdWNjZXNzZnVsbHkgc2VuZGVkIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisJPG9wZXJhdGlvbiBuYW1lPSJjb25uZWN0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249ImNvbm5lY3QgdG8gb3RoZXIgcmVwbGljYXRpb24gbm9kZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisJPG9wZXJhdGlvbiBuYW1lPSJkaXNjb25uZWN0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249ImRpc2Nvbm5lY3QgdG8gb3RoZXIgcmVwbGljYXRpb24gbm9kZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisJPG9wZXJhdGlvbiBuYW1lPSJjaGVja0tlZXBBbGl2ZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDaGVjayBjb25uZWN0aW9uIGZvciBjbG9zZSBzb2NrZXQiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9ImJvb2xlYW4iPgorICAgIDwvb3BlcmF0aW9uPgorCTxvcGVyYXRpb24gbmFtZT0icmVzZXRTdGF0aXN0aWNzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJlc2V0IGFsbCBzdGF0aXN0aWNzIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKwkJCQkgCisgIDwvbWJlYW4+CisKKyA8bWJlYW4gICAgICAgICBuYW1lPSJGYXN0QXN5bmNTb2NrZXRTZW5kZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZhc3QgQXN5bmMgQ2x1c3RlciBTZW5kZXIiCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJJRGF0YVNlbmRlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5oYS50Y3AuRmFzdEFzeW5jU29ja2V0U2VuZGVyIj4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iaW5mbyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2xhc3MgdmVyc2lvbiBpbmZvIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InRocmVhZFByaW9yaXR5IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjaGFuZ2UgcXVldWUgdGhyZWFkIHByaW9yaXR5IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4gICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhZGRyZXNzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZW5kZXIgaXAgYWRkcmVzcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5uZXQuSW5ldEFkZHJlc3MiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icG9ydCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGVyIHBvcnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic3VzcGVjdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU29ja2V0IGlzIGdvbmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0id2FpdEZvckFjayIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iV2FpdCBmb3IgYWNrIGFmdGVyIGRhdGEgc2VuZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWNrVGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWNrbm93bGVkZ2UgdGltZW91dCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhdmdNZXNzYWdlU2l6ZSIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYXZnIG1lc3NhZ2Ugc2l6ZSAodG90YWxieXRlcy9uck9mUmVxdWVzdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InF1ZXVlU2l6ZSIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icXVldWUgc2l6ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InF1ZXVlZE5yT2ZCeXRlcyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIGJ5dGVzIG92ZXIgYWxsIHF1ZXVlZCBtZXNzYWdlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtZXNzYWdlVHJhbnNmZXJTdGFydGVkIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtZXNzYWdlIGlzIGluIHRyYW5zZmVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJrZWVwQWxpdmVUaW1lb3V0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJhY3RpdmUgc29ja2V0IGtlZXAgYWxpdmUgdGltZW91dCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJrZWVwQWxpdmVNYXhSZXF1ZXN0Q291bnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1heCByZXF1ZXN0IG92ZXIgdGhpcyBzb2NrZXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJxdWV1ZUFkZFdhaXRUaW1lb3V0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJhZGQgd2FpdCB0aW1lb3V0IChkZWZhdWx0IDEwMDAwIG1zZWMpIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InF1ZXVlUmVtb3ZlV2FpdFRpbWVvdXQiCisgICAgICAgICAgZGVzY3JpcHRpb249InJlbW92ZSB3YWl0IHRpbWVvdXQgKGRlZmF1bHQgMzAwMDAgbXNlYykiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4UXVldWVMZW5ndGgiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1heCBxdWV1ZSBsZW5ndGgiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJxdWV1ZVRpbWVXYWl0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJyZW1lbWJlciBxdWV1ZSB3YWl0IHRpbWVzIgorICAgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJxdWV1ZUNoZWNrTG9jayIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY2hlY2sgdG8gbG9zdCBsb2NrcyIKKyAgICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icXVldWVEb1N0YXRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJhY3RpdmF0ZWQgcXVldWUgc3RhdHMiCisgICAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtlZXBBbGl2ZUNvdW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJrZWVwIEFsaXZlIHJlcXVlc3QgY291bnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJrZWVwQWxpdmVDb25uZWN0VGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29ubmVjdCB0aW1lIGZvciBrZWVwIGFsaXZlIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlc2VuZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWZ0ZXIgc2VuZCBmYWlsdXJlIG1ha2UgYSByZXNlbmQiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIiAvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0ZWQiCisgICAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzb2NrZXQgY29ubmVjdGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIHNlbmQgbWVzc2FnZXMgdG8gb3RoZXIgbWVtYmVycyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0b3RhbEJ5dGVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGluZyBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWluUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1pbmltYWwgc2VuZGluZyBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXZnUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InByb2Nlc3NpbmcgdGltZSAvIG5yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iZG91YmxlIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heFByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXhpbWFsIHNlbmRpbmcgcHJvY2Vzc2luZyB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRvUHJvY2Vzc2luZ1N0YXRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjcmVhdGUgUHJvY2Vzc2luZyB0aW1lIHN0YXRzIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIgLz4gICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ3YWl0QWNrVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGluZyB3YWl0QWNrIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWluV2FpdEFja1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1pbmltYWwgc2VuZGluZyB3YWl0QWNrIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXZnV2FpdEFja1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IndhaXRBY2sgdGltZSAvIG5yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iZG91YmxlIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heFdhaXRBY2tUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXhpbWFsIHNlbmRpbmcgd2FpdEFjayB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRvV2FpdEFja1N0YXRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjcmVhdGUgd2FpdEFjayB0aW1lIHN0YXRzIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY29ubmVjdENvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBjb25uZWN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkaXNjb25uZWN0Q291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGRpc2Nvbm5lY3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNvY2tldE9wZW5Db3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgb3BlbiBzb2NrZXQgKEtlZXBBbGl2ZSBhbmQgY29ubmVjdHMpIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CQkJCSAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic29ja2V0T3BlbkZhaWx1cmVDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgb3BlbiBzb2NrZXQgZmFpbHVyZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4gICAgICAgICAgICAgICAgIAkJCQkgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNvY2tldENsb3NlQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGNsb3NlZCBzb2NrZXQgKEtlZXBBbGl2ZSBhbmQgZGlzY29ubmVjdHMpIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1pc3NpbmdBY2tDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgbWlzc2luZyBhY2siCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGF0YVJlc2VuZENvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBkYXRhIHJlc2VuZHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGF0YUZhaWx1cmVDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgZGF0YSBzZW5kIGZhaWx1cmVzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImluUXVldWVDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgYWxsIHF1ZXVlZCBtZXNzYWdlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJvdXRRdWV1ZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBhbGwgc3VjY2Vzc2Z1bGx5IHNlbmRlZCBtZXNzYWdlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJxdWV1ZUFkZFdhaXRUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJxdWV1ZSBhZGQgd2FpdCB0aW1lICh0b21jYXQgdGhyZWFkIHdhaXRzKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJxdWV1ZVJlbW92ZVdhaXRUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJxdWV1ZSByZW1vdmUgd2FpdCB0aW1lIChxdWV1ZSB0aHJlYWQgd2FpdHMpIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgCTxvcGVyYXRpb24gbmFtZT0iY29ubmVjdCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb25uZWN0IHRvIG90aGVyIHJlcGxpY2F0aW9uIG5vZGUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCTxvcGVyYXRpb24gbmFtZT0iZGlzY29ubmVjdCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkaXNjb25uZWN0IHRvIG90aGVyIHJlcGxpY2F0aW9uIG5vZGUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCTxvcGVyYXRpb24gbmFtZT0iY2hlY2tLZWVwQWxpdmUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2hlY2sgY29ubmVjdGlvbiBmb3IgY2xvc2Ugc29ja2V0IgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJib29sZWFuIj4KKyAgICA8L29wZXJhdGlvbj4KKwk8b3BlcmF0aW9uIG5hbWU9InJlc2V0U3RhdGlzdGljcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXNldCBhbGwgc3RhdGlzdGljcyIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisJCQkJIAorICA8L21iZWFuPgorCisgIDxtYmVhbiAgICAgICAgIG5hbWU9IlBvb2xlZFNvY2tldFNlbmRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUG9vbGVkIENsdXN0ZXIgU2VuZGVyIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iSURhdGFTZW5kZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuaGEudGNwLlBvb2xlZFNvY2tldFNlbmRlciI+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImFkZHJlc3MiCisgICAgICAgICAgZGVzY3JpcHRpb249InNlbmRlciBpcCBhZGRyZXNzIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLm5ldC5JbmV0QWRkcmVzcyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwb3J0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZW5kZXIgcG9ydCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzdXNwZWN0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJTb2NrZXQgaXMgZ29uZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhY2tUaW1lb3V0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJhY2tub3dsZWRnZSB0aW1lb3V0IgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9IndhaXRGb3JBY2siCisgICAgICAgICAgZGVzY3JpcHRpb249IldhaXQgZm9yIGFjayBhZnRlciBkYXRhIHNlbmQiCisJCQkgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhQb29sU29ja2V0TGltaXQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1heCBwYXJhbGxlbCBzb2NrZXRzIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ia2VlcEFsaXZlVGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWN0aXZlIHNvY2tldCBrZWVwIGFsaXZlIHRpbWVvdXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ia2VlcEFsaXZlTWF4UmVxdWVzdENvdW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXggcmVxdWVzdCBvdmVyIHRoaXMgc29ja2V0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVzZW5kIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJhZnRlciBzZW5kIGZhaWx1cmUgbWFrZSBhIHJlc2VuZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3RlZCIKKyAgICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InNvY2tldCBjb25uZWN0ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXZnTWVzc2FnZVNpemUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiCisgICAgICAgICAgZGVzY3JpcHRpb249ImF2ZyBtZXNzYWdlIHNpemUgKHRvdGFsYnl0ZXMvbnJPZlJlcXVlc3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIHNlbmQgbWVzc2FnZXMgdG8gb3RoZXIgbWVtYmVycyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0b3RhbEJ5dGVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0Q291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGNvbm5lY3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRpc2Nvbm5lY3RDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgZGlzY29ubmVjdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKwk8b3BlcmF0aW9uIG5hbWU9ImNvbm5lY3QiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0ic3RhcnQgUXVldWUgdG8gY29ubmVjdCB0byBvaHRlciByZXBsaWNhdGlvbiBub2RlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKwk8b3BlcmF0aW9uIG5hbWU9ImRpc2Nvbm5lY3QiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0ic3RvcCBRdWV1ZSB0byBvdGhlciByZXBsaWNhdGlvbiBub2RlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKwk8b3BlcmF0aW9uIG5hbWU9InJlc2V0U3RhdGlzdGljcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXNldCBhbGwgc3RhdGlzdGljcyIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisJCQkJIAorICA8L21iZWFuPgorCisgIDxtYmVhbiAgICAgICAgIG5hbWU9IlNvY2tldFNlbmRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU3luYyBDbHVzdGVyIFNlbmRlciIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IklEYXRhU2VuZGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnRjcC5Tb2NrZXRTZW5kZXIiPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhZGRyZXNzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZW5kZXIgaXAgYWRkcmVzcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5uZXQuSW5ldEFkZHJlc3MiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icG9ydCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGVyIHBvcnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic3VzcGVjdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU29ja2V0IGlzIGdvbmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWNrVGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWNrbm93bGVkZ2UgdGltZW91dCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ3YWl0Rm9yQWNrIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJXYWl0IGZvciBhY2sgYWZ0ZXIgZGF0YSBzZW5kIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ia2VlcEFsaXZlVGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWN0aXZlIHNvY2tldCBrZWVwIGFsaXZlIHRpbWVvdXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ia2VlcEFsaXZlTWF4UmVxdWVzdENvdW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXggcmVxdWVzdCBvdmVyIHRoaXMgc29ja2V0IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWVzc2FnZVRyYW5zZmVyU3RhcnRlZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWVzc2FnZSBpcyBpbiB0cmFuc2ZlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ia2VlcEFsaXZlQ291bnQiCisgICAgICAgICAgZGVzY3JpcHRpb249ImtlZXAgQWxpdmUgcmVxdWVzdCBjb3VudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtlZXBBbGl2ZUNvbm5lY3RUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb25uZWN0IHRpbWUgZm9yIGtlZXAgYWxpdmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVzZW5kIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJhZnRlciBzZW5kIGZhaWx1cmUgbWFrZSBhIHJlc2VuZCIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3RlZCIKKyAgICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InNvY2tldCBjb25uZWN0ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXZnTWVzc2FnZVNpemUiCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiCisgICAgICAgICAgZGVzY3JpcHRpb249ImF2ZyBtZXNzYWdlIHNpemUgKHRvdGFsYnl0ZXMvbnJPZlJlcXVlc3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibnVtYmVyIG9mIHNlbmQgbWVzc2FnZXMgdG8gb3RoZXIgbWVtYmVycyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0b3RhbEJ5dGVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ic2VuZGluZyBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWluUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Im1pbmltYWwgc2VuZGluZyBwcm9jZXNzaW5nIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXZnUHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InByb2Nlc3NpbmcgdGltZSAvIG5yT2ZSZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iZG91YmxlIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heFByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtYXhpbWFsIHNlbmRpbmcgcHJvY2Vzc2luZyB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRvUHJvY2Vzc2luZ1N0YXRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjcmVhdGUgUHJvY2Vzc2luZyB0aW1lIHN0YXRzIgorCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIgLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0id2FpdEFja1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InNlbmRpbmcgd2FpdEFjayB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1pbldhaXRBY2tUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJtaW5pbWFsIHNlbmRpbmcgd2FpdEFjayB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImF2Z1dhaXRBY2tUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJ3YWl0QWNrIHRpbWUgLyBuck9mUmVxdWVzdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImRvdWJsZSIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhXYWl0QWNrVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibWF4aW1hbCBzZW5kaW5nIHdhaXRBY2sgdGltZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkb1dhaXRBY2tTdGF0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY3JlYXRlIHdhaXRBY2sgdGltZSBzdGF0cyIKKwkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iIC8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3RDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgY29ubmVjdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGlzY29ubmVjdENvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBkaXNjb25uZWN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzb2NrZXRDbG9zZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBjbG9zZWQgc29ja2V0IChLZWVwQWxpdmUgYW5kIGRpc2Nvbm5lY3RzKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzb2NrZXRPcGVuRmFpbHVyZUNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBvcGVuIHNvY2tldCBmYWlsdXJlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPiAgICAgICAgICAgICAgICAgCQkJCSAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic29ja2V0T3BlbkNvdW50ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImNvdW50cyBvcGVuIHNvY2tldCAoS2VlcEFsaXZlIGFuZCBjb25uZWN0cykiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4JCQkJIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtaXNzaW5nQWNrQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIG1pc3NpbmcgYWNrIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRhdGFSZXNlbmRDb3VudGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb3VudHMgZGF0YSByZXNlbmRzIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRhdGFGYWlsdXJlQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iY291bnRzIGRhdGEgc2VuZCBmYWlsdXJlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCTxvcGVyYXRpb24gbmFtZT0iY29ubmVjdCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJjb25uZWN0IHRvIG90aGVyIHJlcGxpY2F0aW9uIG5vZGUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCTxvcGVyYXRpb24gbmFtZT0iZGlzY29ubmVjdCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJkaXNjb25uZWN0IHRvIG90aGVyIHJlcGxpY2F0aW9uIG5vZGUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCTxvcGVyYXRpb24gbmFtZT0iY2hlY2tLZWVwQWxpdmUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2hlY2sgY29ubmVjdGlvbiBmb3IgY2xvc2Ugc29ja2V0IgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJib29sZWFuIj4KKyAgICA8L29wZXJhdGlvbj4KKwk8b3BlcmF0aW9uIG5hbWU9InJlc2V0U3RhdGlzdGljcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXNldCBhbGwgc3RhdGlzdGljcyIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisJCQkJIAorICA8L21iZWFuPgorICAgIAorICA8bWJlYW4gICAgICAgICBuYW1lPSJSZXBsaWNhdGlvblZhbHZlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJWYWx2ZSBmb3Igc2ltcGxlIHRjcCByZXBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IlZhbHZlIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnRjcC5SZXBsaWNhdGlvblZhbHZlIj4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iaW5mbyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2xhc3MgdmVyc2lvbiBpbmZvIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImZpbHRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0icmVzb3VyY2UgZmlsdGVyIHRvIGRpc2FibGUgc2Vzc2lvbiByZXBsaWNhdGlvbiBjaGVjayIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwcmltYXJ5SW5kaWNhdG9yIgorIAkJCSAgICAgaXM9InRydWUiCisgICAgICAgICAgZGVzY3JpcHRpb249InNldCBpbmRpY2F0b3IgdGhhdCByZXF1ZXN0IHByb2Nlc3NpbmcgaXMgYXQgcHJpbWFyeSBzZXNzaW9uIG5vZGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0icHJpbWFyeUluZGljYXRvck5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlcXVlc3QgYXR0cmlidXRlIG5hbWUgdG8gaW5kaWNhdGUgdGhhdCByZXF1ZXN0IHByb2Nlc3NpbmcgaXMgYXQgcHJpbWFyeSBzZXNzaW9uIG5vZGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZG9Qcm9jZXNzaW5nU3RhdHMiCisgCQkJICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iYWN0aXZlIHN0YXRpc3RpY3MgY291bnRpbmciCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKwk8YXR0cmlidXRlICAgbmFtZT0ibnJPZlJlcXVlc3RzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2YgcmVwbGljYXRlZCByZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCTxhdHRyaWJ1dGUgICBuYW1lPSJuck9mRmlsdGVyUmVxdWVzdHMiCisgICAgICAgICAgZGVzY3JpcHRpb249Im51bWJlciBvZiBmaWx0ZXJlZCByZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCTxhdHRyaWJ1dGUgICBuYW1lPSJuck9mU2VuZFJlcXVlc3RzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2Ygc2VuZCByZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCTxhdHRyaWJ1dGUgICBuYW1lPSJuck9mQ3Jvc3NDb250ZXh0U2VuZFJlcXVlc3RzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJudW1iZXIgb2Ygc2VuZCBjcm9zcyBjb250ZXh0IHNlc3Npb24gcmVxdWVzdHMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idG90YWxSZXF1ZXN0VGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0idG90YWwgcmVwbGljYXRlZCByZXF1ZXN0IHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0idG90YWxTZW5kVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0idG90YWwgcmVwbGljYXRlZCBzZW5kIHRpbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibGFzdFNlbmRUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJsYXN0IHJlcGxpY2F0ZWQgcmVxdWVzdCB0aW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJyZXNldFN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVzZXQgYWxsIHN0YXRpc3RpY3MiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorICAgICAgICAgICAgICAgICAKKyAgPC9tYmVhbj4KKworCis8L21iZWFucy1kZXNjcmlwdG9ycz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3V0aWwvSUR5bmFtaWNQcm9wZXJ0eS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvaGEvdXRpbC9JRHluYW1pY1Byb3BlcnR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4ZDY2YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2hhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2hhL3V0aWwvSUR5bmFtaWNQcm9wZXJ0eS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIElEeW5hbWljUHJvcGVydHkgeworCisgICAgLyoqCisgICAgICogc2V0IGNvbmZpZyBhdHRyaWJ1dGVzIHdpdGggcmVmbGVjdAorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgOworCisgICAgLyoqCisgICAgICogZ2V0IGN1cnJlbnQgY29uZmlnCisgICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqIEByZXR1cm4gVGhlIHByb3BlcnR5CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSA7CisgICAgLyoqCisgICAgICogR2V0IGFsbCBwcm9wZXJ0aWVzIGtleXMKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIG92ZXIgdGhlIHByb3BlcnR5IG5hbWVzCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGdldFByb3BlcnR5TmFtZXMoKSA7CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUgYSBjb25maWd1cmVkIHByb3BlcnR5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcga2V5KSA7CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL2J1aWxkLnhtbCBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDEyMTg3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvYnVpbGQueG1sCkBAIC0wLDAgKzEsMTM4IEBACis8cHJvamVjdCBuYW1lPSJTdG9yZUNvbmZpZyIgZGVmYXVsdD0iZGlzdCIgYmFzZWRpcj0iLiI+CisKKworCTwhLS0gPT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgUHJvcGVydHkgVmFsdWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisKKwk8IS0tIFNlZSAiYnVpbGQucHJvcGVydGllcy5zYW1wbGUiIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGZvciBhbGwgICAgIC0tPgorCTwhLS0gcHJvcGVydHkgdmFsdWVzIHlvdSBtdXN0IGN1c3RvbWl6ZSBmb3Igc3VjY2Vzc2Z1bCBidWlsZGluZyEhISAgICAgICAgLS0+CisgICAgPHByb3BlcnR5IGZpbGU9Ii4uLy4uLy4uL2J1aWxkL2J1aWxkLnByb3BlcnRpZXMiIC8+CisgICAgPHByb3BlcnR5IGZpbGU9Ii4uLy4uLy4uL2J1aWxkL2J1aWxkLnByb3BlcnRpZXMuZGVmYXVsdCIgLz4KKworICAgIDwhLS0gQnVpbGQgRGVmYXVsdHMgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9ImNhdGFsaW5hLmhvbWUiICBsb2NhdGlvbj0iLi4vLi4iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuYnVpbGQiIGxvY2F0aW9uPSIuLi8uLi8uLi9idWlsZC9idWlsZCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjb25maWcuYnVpbGQiIHZhbHVlPSIke2NhdGFsaW5hLmhvbWV9L21vZHVsZXMvc3RvcmVjb25maWcvYnVpbGQiIC8+CisJPHByb3BlcnR5IG5hbWU9ImNvbmZpZy5kaXN0IiB2YWx1ZT0iJHtjYXRhbGluYS5ob21lfS9tb2R1bGVzL3N0b3JlY29uZmlnL2Rpc3QiIC8+CisKKwk8IS0tIENvbnN0cnVjdCBDYXRhbGluYSBjbGFzc3BhdGggLS0+CisJPHBhdGggaWQ9ImNvbmZpZy5jbGFzc3BhdGgiPgorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2F0YWxpbmEuYnVpbGR9L3NlcnZlci9saWIvY2F0YWxpbmEuamFyIiAvPgorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2F0YWxpbmEuYnVpbGR9L3NlcnZlci9saWIvdG9tY2F0LXV0aWwuamFyIiAvPgorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sb2dnaW5nLmphcn0iIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLW1vZGVsZXIuamFyfSIgLz4KKwkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pteC5qYXJ9IiAvPgorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2F0YWxpbmEuYnVpbGR9L2NvbW1vbi9saWIvc2VydmxldC1hcGkuamFyIiAvPgorCTwvcGF0aD4KKworCTwhLS0gU291cmNlIHBhdGggLS0+CisJPHBhdGggaWQ9ImphdmFkb2Muc291cmNlcGF0aCI+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL3NoYXJlIiAvPgorCTwvcGF0aD4KKworCisJPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBTZXQgY29tcGlsZSBmbGFncyA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwk8dGFyZ2V0IG5hbWU9ImZsYWdzIj4KKwkJPCEtLSBKREsgZmxhZ3MgLS0+CisJCTxhdmFpbGFibGUgcHJvcGVydHk9Impkay4xLjIucHJlc2VudCIgY2xhc3NuYW1lPSJqYXZhLnV0aWwuSGFzaE1hcCIgLz4KKwkJPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrLjEuMy5wcmVzZW50IiBjbGFzc25hbWU9ImphdmEubGFuZy5yZWZsZWN0LlByb3h5IiAvPgorCQk8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsuMS40LnByZXNlbnQiIGNsYXNzbmFtZT0iamF2YS5uaW8uQnVmZmVyIiAvPgorCTwvdGFyZ2V0PgorCisKKwk8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IFNldCBjb21waWxlIGZsYWdzID09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTx0YXJnZXQgbmFtZT0iZmxhZ3MuZGlzcGxheSIgZGVwZW5kcz0iZmxhZ3MiIHVubGVzcz0iZmxhZ3MuaGlkZSI+CisKKwkJPGVjaG8gbWVzc2FnZT0iLS0tIEJ1aWxkIGVudmlyb25tZW50IGZvciBDYXRhbGluYSAtLS0iIC8+CisKKwkJPGVjaG8gbWVzc2FnZT0iSWYgJHtwcm9wZXJ0eV9uYW1lfSBpcyBkaXNwbGF5ZWQsIHRoZW4gdGhlIHByb3BlcnR5IGlzIG5vdCBzZXQpIiAvPgorCisJCTxlY2hvIG1lc3NhZ2U9Ii0tLSBCdWlsZCBvcHRpb25zIC0tLSIgLz4KKwkJPGVjaG8gbWVzc2FnZT0iZnVsbC5kaXN0PSR7ZnVsbC5kaXN0fSIgLz4KKwkJPGVjaG8gbWVzc2FnZT0iYnVpbGQuc3lzY2xhc3NwYXRoPSR7YnVpbGQuc3lzY2xhc3NwYXRofSIgLz4KKwkJPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5kZWJ1Zz0ke2NvbXBpbGUuZGVidWd9IiAvPgorCQk8ZWNobyBtZXNzYWdlPSJjb21waWxlLmRlcHJlY2F0aW9uPSR7Y29tcGlsZS5kZXByZWNhdGlvbn0iIC8+CisJCTxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUub3B0aW1pemU9JHtjb21waWxlLm9wdGltaXplfSIgLz4KKwkJPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5zb3VyY2U9JHtjb21waWxlLnNvdXJjZX0iIC8+CisKKwkJPGVjaG8gbWVzc2FnZT0iLS0tIEFudCBGbGFncyAtLS0iIC8+CisJCTxlY2hvIG1lc3NhZ2U9IiZsdDtzdHlsZSZndDsgdGFzayBhdmFpbGFibGUgKHJlcXVpcmVkKT0ke3N0eWxlLmF2YWlsYWJsZX0iIC8+CisKKwkJPGVjaG8gbWVzc2FnZT0iLS0tIEpESyAtLS0iIC8+CisJCTxlY2hvIG1lc3NhZ2U9Impkay4xLjIucHJlc2VudD0ke2pkay4xLjIucHJlc2VudH0iIC8+CisJCTxlY2hvIG1lc3NhZ2U9Impkay4xLjMucHJlc2VudD0ke2pkay4xLjMucHJlc2VudH0iIC8+CisJCTxlY2hvIG1lc3NhZ2U9Impkay4xLjQucHJlc2VudD0ke2pkay4xLjQucHJlc2VudH0iIC8+CisKKwk8L3RhcmdldD4KKworCTwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJPHRhcmdldCBuYW1lPSJidWlsZC1wcmVwYXJlIj4KKwkJPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5idWlsZH0iIC8+CisJCTxta2RpciBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NsYXNzZXMiIC8+CisJCTxta2RpciBkaXI9IiR7Y29uZmlnLmRpc3R9IiAvPgorCTwvdGFyZ2V0PgorCisKKworCisJPCEtLSA9PT09PT09PT09PT09PT09IEJVSUxEOiBDb21waWxlIENhdGFsaW5hIENvbXBvbmVudHMgPT09PT09PT09PT09PT09PSAtLT4KKworCTx0YXJnZXQgbmFtZT0iYnVpbGQtY2F0YWxpbmEtY29uZmlnIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlIj4KKwkJPCEtLSBDb21waWxlIGludGVybmFsIHNlcnZlciBjb21wb25lbnRzIC0tPgorCQk8amF2YWMgc3JjZGlyPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZSIgZGVzdGRpcj0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3NlcyIgZGVwcmVjYXRpb249IiR7Y29tcGlsZS5kZXByZWNhdGlvbn0iIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IiBzb3VyY2U9IiR7Y29tcGlsZS5zb3VyY2V9IiBvcHRpbWl6ZT0iJHtjb21waWxlLm9wdGltaXplfSIgZXhjbHVkZXM9IioqL0NWUy8qKiI+CisJCQk8Y2xhc3NwYXRoIHJlZmlkPSJjb25maWcuY2xhc3NwYXRoIiAvPgorCQk8L2phdmFjPgorCQk8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnIj4KKwkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZyI+CisJCQkJPGluY2x1ZGUgbmFtZT0iKi5wcm9wZXJ0aWVzIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9IioueG1sIiAvPgorCQkJPC9maWxlc2V0PgorCQk8L2NvcHk+CisJPC90YXJnZXQ+CisKKworCTwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ3JlYXRlIENhdGFsaW5hIEphdmFkb2NzID09PT09PT09PT09PT09PT09PT0gLS0+CisJPHRhcmdldCBuYW1lPSJqYXZhZG9jIj4KKwkJPGRlbGV0ZSBkaXI9IiR7Y29uZmlnLmJ1aWxkfS9qYXZhZG9jIiAvPgorCQk8bWtkaXIgZGlyPSIke2NvbmZpZy5idWlsZH0vamF2YWRvYyIgLz4KKwkJPGphdmFkb2MgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLioiIGNsYXNzcGF0aHJlZj0iY29uZmlnLmNsYXNzcGF0aCIgc291cmNlcGF0aHJlZj0iamF2YWRvYy5zb3VyY2VwYXRoIiBkZXN0ZGlyPSIke2NvbmZpZy5idWlsZH0vamF2YWRvYyIgYXV0aG9yPSJ0cnVlIiB2ZXJzaW9uPSJ0cnVlIiB3aW5kb3d0aXRsZT0iQ2F0YWxpbmEgSW50ZXJuYWwgU3RvcmVDb25maWcgQVBJIERvY3VtZW50YXRpb24iIGRvY3RpdGxlPSJDYXRhbGluYSBTdG9yZUNvbmZpZyBBUEkiIGJvdHRvbT0iQ29weXJpZ2h0ICYjMTY5OyAyMDAwLTIwMDQgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLiIgLz4KKwk8L3RhcmdldD4KKworCisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PSAtLT4KKwk8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNsZWFuIj4KKwkJPGRlbGV0ZSBkaXI9IiR7Y29uZmlnLmJ1aWxkfSIgLz4KKwkJPGRlbGV0ZSBkaXI9IiR7Y29uZmlnLmRpc3R9IiAvPgorICAgICAgICA8ZGVsZXRlPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jbGFzc2VzIj4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnLyoqLyoiIC8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvZGVsZXRlPgorCTwvdGFyZ2V0PgorCisKKwk8IS0tID09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBSZWJ1aWxkIEV2ZXJ5dGhpbmcgPT09PT09PT09PT09PT09PT09PT09IC0tPgorCisKKworCisJPCEtLSA9PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXN0cmlidXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwk8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImJ1aWxkLWNhdGFsaW5hLWNvbmZpZyI+CisKKwkJPGphciBkZXN0ZmlsZT0iJHtjb25maWcuZGlzdH0vY2F0YWxpbmEtc3RvcmVjb25maWcuamFyIiBiYXNlZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jbGFzc2VzIj4KKwkJCTxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvKioiIC8+CisJCQk8ZXhjbHVkZSBuYW1lPSIqKi9wYWNrYWdlLmh0bWwiIC8+CisgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9Mb2NhbFN0cmluZ3NfKiIgLz4KKwkJPC9qYXI+CisJPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNvcHkiIGRlcGVuZHM9ImRpc3QiID4KKyAgICAgICA8Y29weSBmaWxlPSIke2NvbmZpZy5kaXN0fS9jYXRhbGluYS1zdG9yZWNvbmZpZy5qYXIiIHRvZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9zZXJ2ZXIvbGliIiAvPgorICAgPC90YXJnZXQ+CisKKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorCisKKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT0gQ29udmVuaWVudCBTeW5vbnltcyA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL2RvY3MvUmVhZG1lLnR4dCBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL2RvY3MvUmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTljNDg1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvZG9jcy9SZWFkbWUudHh0CkBAIC0wLDAgKzEsNjMgQEAKK1N0YXR1czoKKworUGV0ZXIgUm/fYmFjaAorMjkuMTEuMjAwNAorCQorRmVhdHVyZQorPT09PT09PT09PT09PT09PT09PT09PT09PQorCUJhY2t1cCBjb250ZXh0LnhtbAorCUJhY2t1cCBm/HIgc2VydmVyLnhtbAorCUNsdXN0ZXIgSGFuZGxpbmcKKwlTdG9yZSBhbGwgNS41LjUgZWxlbWVudHMKKwlDb250ZXh0IHdvcmtEaXIgZGVmYXVsdCBIYW5kbGluZworCVdhdGNoZWRSZXNvdXJjZSBEZWZhdWx0IEhhbmRsaW5nCisJV3JpdGUgeW91ciBvd24gUmVnaXN0cnkKKwkJU3lzdGVtIFByb3BlcnR5IC1EY2F0YWxpbmEuc3RvcmVjb25maWc9ZmlsZTouLi94eHgueG1sCisJCSR7Y2F0YWxpbmEuYmFzZX0vY29uZiBiencgJHtjYXRhbGluYS5ob21lfS9jb25mCisJCUNsYXNzcGF0aCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnCisJSk1YIFN0b3JlQ29uZmlnIE1CZWFuCisJCVN0b3JlIGNvbnRleHQueG1sIGFuZCBzZXJ2ZXIueG1scworCVN0b3JlIEZvcm1hdCBpcyBjaGFuZ2VhYmxlIHdpdGggU3RvcmVBcHBlbmRlcnMKKwlFYXN5IGV4dGVuZGFibGUgCisJQ29ubmVjdG9yIHN1cHBvcnQKKwkJQUpQCisJCUhUVFAKKwkJSFRUUFMKKwlDb250ZXh0LnhtbCBhbmQgc2VydmVyLnhtbCB3aXRoIGJhY2t1cAkJCQkKKwkJIAorRXhhbXBsZQorPT09PT09PT09PT09PT09PT09PT09PT09PQorCQorCTxTZXJ2ZXIgLi4uPgorCSAgICAgIDxMaXN0ZW5lciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVDb25maWdMaWZlY3ljbGVMaXN0ZW5lciIvPgorICAgICAgICAgIDxTZXJ2aWNlIC4uLgorCQkgIDwvU2VydmljZT4KKyAgICA8L1NlcnZlcj4KKwkKKwlVc2FnZXMgd2l0aCBKTVggQWRhcHRvciAKKwkJT2JqZWN0TmFtZSA6IENhdGFsaW5hOnR5cGU9U3RvcmVDb25maWcKKwkJCisJCWltcG9ydGFudCBvcGVyYXRpb25zOgorCQkJc3RvcmVDb25maWcJCQlTdG9yZSBjb21wbGV0ZSBzZXJ2ZXIKKwkJCXN0b3JlU2VydmVyCQkJU3RvcmUgU2VydmVyIHdpdGggT2JqZWN0TmFtZSIgICAgICAgICAgICAgICAKKwkJCSAgIHBhcmFtZXRlciBuYW1lPSJvYmplY3RuYW1lIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iT2JqZWN0bmFtZSBmcm9tIFNlcnZlciIKKyAgICAgICAgICAgICAgICAgZGVmYXVsdD0iQ2F0YWxpbmE6dHlwZT1TZXJ2ZXIiCisJCQkgICBwYXJhbWV0ZXIgbmFtZT0iYmFja3VwIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0ic3RvcmUgQ29udGV4dCB3aXRoIGJhY2t1cCIKKyAgICAgICAgICAgICAgIHBhcmFtZXRlciBuYW1lPSJleHRlcm5hbEFsbG93ZWQiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJzdG9yZSBhbGwgQ29udGV4dCBleHRlcm5hbCB0aGF0IGhhdmUgYSBjb25maWdGaWxlIgorICAgICAgICAgICAgc3RvcmVDb250ZXh0IAkJU3RvcmUgQ29udGV4dCBmcm9tIE9iamVjdE5hbWUgCisgICAgICAgICAgICAgICBwYXJhbWV0ZXIgbmFtZT0ib2JqZWN0bmFtZSIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9iamVjdE5hbWUgZnJvbSBDb250ZXh0IgorICAgICAgICAgICAgICAgICBleGFtcGxlPSJDYXRhbGluYTpqMmVlVHlwZT1XZWJNb2R1bGUsbmFtZT0vL2xvY2FsaG9zdC9tYW5hZ2VyLEoyRUVBcHBsaWNhdGlvbj1ub25lLEoyRUVTZXJ2ZXI9bm9uZQorCQkJICAgcGFyYW1ldGVyIG5hbWU9ImJhY2t1cCIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InN0b3JlIHdpdGggQmFja3VwIgorICAgICAgICAgICAgICAgcGFyYW1ldGVyIG5hbWU9ImV4dGVybmFsQWxsb3dlZCIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InN0b3JlIGFsbCBvciBzdG9yZSBvbmx5IGludGVybmFsIHNlcnZlci54bWwgY29udGV4dCAoY29uZmlnRmlsZSA9PSBudWxsKSIKKwkJCQorSGF2ZSBmdW4KK1BldGVyIFJvc3NiYWNoCisKKworCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0NhdGFsaW5hQ2x1c3RlclNGLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9DYXRhbGluYUNsdXN0ZXJTRi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYTllYzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9DYXRhbGluYUNsdXN0ZXJTRi5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNhdGFsaW5hQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNsdXN0ZXJEZXBsb3llcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsUmVjZWl2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbFNlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXJzaGlwU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZXNzYWdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS50Y3AuU2ltcGxlVGNwQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NYW5hZ2VkQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyTGlzdGVuZXI7CisKKy8qKgorICogR2VuZXJhdGUgQ2x1c3RlciBFbGVtZW50IHdpdGggTWVtYmVyc2hpcCxTZW5kZXIsUmVjZWl2ZXIsRGVwbG95ZXIgYW5kCisgKiBSZXBsaWNhdGlvblZhbHZlCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqLworcHVibGljIGNsYXNzIENhdGFsaW5hQ2x1c3RlclNGIGV4dGVuZHMgU3RvcmVGYWN0b3J5QmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ2F0YWxpbmFDbHVzdGVyU0YuY2xhc3MpOworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBDbHVzdGVyIGNoaWxkcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVdyaXRlcgorICAgICAqICAgICAgICAgICAgUHJpbnRXcml0ZXIgdG8gd2hpY2ggd2UgYXJlIHN0b3JpbmcKKyAgICAgKiBAcGFyYW0gaW5kZW50CisgICAgICogICAgICAgICAgICBOdW1iZXIgb2Ygc3BhY2VzIHRvIGluZGVudCB0aGlzIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gYUNsdXN0ZXIKKyAgICAgKiAgICAgICAgICAgIENsdXN0ZXIgd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgc3RvcmVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZUNoaWxkcyhQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LCBPYmplY3QgYUNsdXN0ZXIsCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIHBhcmVudERlc2MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoYUNsdXN0ZXIgaW5zdGFuY2VvZiBDYXRhbGluYUNsdXN0ZXIpIHsKKyAgICAgICAgICAgIENhdGFsaW5hQ2x1c3RlciBjbHVzdGVyID0gKENhdGFsaW5hQ2x1c3RlcikgYUNsdXN0ZXI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vc3RvcmUgbmVzdGVkIDxHcm91cD4gZWxlbWVudAorICAgICAgICAgICAgTWFuYWdlZENoYW5uZWwgY2hhbm5lbCA9IChNYW5hZ2VkQ2hhbm5lbCljbHVzdGVyLmdldENoYW5uZWwoKTsKKyAgICAgICAgICAgIGlmIChjaGFubmVsICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgc3RvcmVFbGVtZW50KGFXcml0ZXIsIGluZGVudCwgY2hhbm5lbCk7CisKKyAgICAgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPE1lbWJlcnNoaXA+IGVsZW1lbnQKKyAgICAgICAgICAgICAgICBNZW1iZXJzaGlwU2VydmljZSBzZXJ2aWNlID0gY2hhbm5lbC5nZXRNZW1iZXJzaGlwU2VydmljZSgpOworICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVFbGVtZW50KGFXcml0ZXIsIGluZGVudCwgc2VydmljZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8U2VuZGVyPiBlbGVtZW50CisgICAgICAgICAgICAgICAgQ2hhbm5lbFNlbmRlciBzZW5kZXIgPSBjaGFubmVsLmdldENoYW5uZWxTZW5kZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VuZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVFbGVtZW50KGFXcml0ZXIsIGluZGVudCwgc2VuZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxSZWNlaXZlcj4gZWxlbWVudAorICAgICAgICAgICAgICAgIENoYW5uZWxSZWNlaXZlciByZWNlaXZlciA9IGNoYW5uZWwuZ2V0Q2hhbm5lbFJlY2VpdmVyKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlY2VpdmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVFbGVtZW50KGFXcml0ZXIsIGluZGVudCwgcmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBJdGVyYXRvciBpbnRpID0gY2hhbm5lbC5nZXRJbnRlcmNlcHRvcnMoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIGludGkuaGFzTmV4dCgpICkgeworICAgICAgICAgICAgICAgICAgICBzdG9yZUVsZW1lbnQoYVdyaXRlcixpbmRlbnQsaW50aS5uZXh0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8RGVwbG95ZXI+IGVsZW1lbnQKKyAgICAgICAgICAgIENsdXN0ZXJEZXBsb3llciBkZXBsb3llciA9IGNsdXN0ZXIuZ2V0Q2x1c3RlckRlcGxveWVyKCk7CisgICAgICAgICAgICBpZiAoZGVwbG95ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudChhV3JpdGVyLCBpbmRlbnQsIGRlcGxveWVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8VmFsdmU+IGVsZW1lbnQKKyAgICAgICAgICAgIC8vIENsdXN0ZXJWYWx2ZSBhcmUgbm90IHN0b3JlIGF0IEhvc3RzIGVsZW1lbnQsIHNlZQorICAgICAgICAgICAgVmFsdmUgdmFsdmVzW10gPSBjbHVzdGVyLmdldFZhbHZlcygpOworICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCB2YWx2ZXMpOworIAorICAgICAgICAgICAgaWYgKGFDbHVzdGVyIGluc3RhbmNlb2YgU2ltcGxlVGNwQ2x1c3RlcikgeworICAgICAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8TGlzdGVuZXI+IGVsZW1lbnRzCisgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXJzW10gPSAoKFNpbXBsZVRjcENsdXN0ZXIpY2x1c3RlcikuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudEFycmF5KGFXcml0ZXIsIGluZGVudCwgbGlzdGVuZXJzKTsKKyAgICAgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPENsdXN0ZXJMaXN0ZW5lcj4gZWxlbWVudHMKKyAgICAgICAgICAgICAgICBDbHVzdGVyTGlzdGVuZXIgbWxpc3RlbmVyc1tdID0gKChTaW1wbGVUY3BDbHVzdGVyKWNsdXN0ZXIpLmZpbmRDbHVzdGVyTGlzdGVuZXJzKCk7CisgICAgICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCBtbGlzdGVuZXJzKTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Db25uZWN0b3JTRi5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvQ29ubmVjdG9yU0YuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjhiM2VlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvQ29ubmVjdG9yU0YuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLyoqCisgKiBTdG9yZSBDb25uZWN0b3IgYW5kIExpc3RlbmVycworICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKi8KK3B1YmxpYyBjbGFzcyBDb25uZWN0b3JTRiBleHRlbmRzIFN0b3JlRmFjdG9yeUJhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvbm5lY3RvclNGLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFN0b3JlIENvbm5lY3RvciBkZXNjcmlwdGlvbgorICAgICAqIAorICAgICAqIEBwYXJhbSBhV3JpdGVyCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqIEBwYXJhbSBhQ29ubmVjdG9yCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZUNoaWxkcyhQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LCBPYmplY3QgYUNvbm5lY3RvciwKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gcGFyZW50RGVzYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGFDb25uZWN0b3IgaW5zdGFuY2VvZiBDb25uZWN0b3IpIHsKKyAgICAgICAgICAgIENvbm5lY3RvciBjb25uZWN0b3IgPSAoQ29ubmVjdG9yKSBhQ29ubmVjdG9yOworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxMaXN0ZW5lcj4gZWxlbWVudHMKKyAgICAgICAgICAgIGlmIChjb25uZWN0b3IgaW5zdGFuY2VvZiBMaWZlY3ljbGUpIHsKKyAgICAgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcnNbXSA9ICgoTGlmZWN5Y2xlKSBjb25uZWN0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudEFycmF5KGFXcml0ZXIsIGluZGVudCwgbGlzdGVuZXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHByaW50T3BlblRhZyhQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LCBPYmplY3QgYmVhbiwKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gYURlc2MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhV3JpdGVyLnByaW50KCI8Iik7CisgICAgICAgIGFXcml0ZXIucHJpbnQoYURlc2MuZ2V0VGFnKCkpOworICAgICAgICBzdG9yZUNvbm5lY3RvckF0dHJpYnR1ZXMoYVdyaXRlciwgaW5kZW50LCBiZWFuLCBhRGVzYyk7CisgICAgICAgIGFXcml0ZXIucHJpbnRsbigiPiIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHN0b3JlQ29ubmVjdG9yQXR0cmlidHVlcyhQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LAorICAgICAgICAgICAgT2JqZWN0IGJlYW4sIFN0b3JlRGVzY3JpcHRpb24gYURlc2MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoYURlc2MuaXNBdHRyaWJ1dGVzKCkpIHsKKyAgICAgICAgICAgIGdldFN0b3JlQXBwZW5kZXIoKS5wcmludEF0dHJpYnV0ZXMoYVdyaXRlciwgaW5kZW50LCBmYWxzZSwgYmVhbiwKKyAgICAgICAgICAgICAgICAgICAgYURlc2MpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGlmIChiZWFuIGluc3RhbmNlb2YgQ29ubmVjdG9yKSB7IFN0b3JlRGVzY3JpcHRpb24gZWxlbWVudERlc2MgPQorICAgICAgICAgICAgICogZ2V0UmVnaXN0cnkoKS5maW5kRGVzY3JpcHRpb24oIGJlYW4uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKworICAgICAgICAgICAgICogIi5bUHJvdG9jb2xIYW5kbGVyXSIpOyBpZiAoZWxlbWVudERlc2MgIT0gbnVsbCkgeyBQcm90b2NvbEhhbmRsZXIKKyAgICAgICAgICAgICAqIHByb3RvY29sSGFuZGxlciA9ICgoQ29ubmVjdG9yKSBiZWFuKSAuZ2V0UHJvdG9jb2xIYW5kbGVyKCk7IGlmCisgICAgICAgICAgICAgKiAocHJvdG9jb2xIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgKiBnZXRTdG9yZUFwcGVuZGVyKCkucHJpbnRBdHRyaWJ1dGVzKGFXcml0ZXIsIGluZGVudCwgZmFsc2UsCisgICAgICAgICAgICAgKiBwcm90b2NvbEhhbmRsZXIsIGVsZW1lbnREZXNjKTsgfSB9CisgICAgICAgICAgICAgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHByaW50VGFnKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBiZWFuLAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBhRGVzYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFXcml0ZXIucHJpbnQoIjwiKTsKKyAgICAgICAgYVdyaXRlci5wcmludChhRGVzYy5nZXRUYWcoKSk7CisgICAgICAgIHN0b3JlQ29ubmVjdG9yQXR0cmlidHVlcyhhV3JpdGVyLCBpbmRlbnQsIGJlYW4sIGFEZXNjKTsKKyAgICAgICAgYVdyaXRlci5wcmludGxuKCIvPiIpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0Nvbm5lY3RvclN0b3JlQXBwZW5kZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0Nvbm5lY3RvclN0b3JlQXBwZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjY0NjRmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvQ29ubmVjdG9yU3RvcmVBcHBlbmRlci5qYXZhCkBAIC0wLDAgKzEsMjgyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmJlYW5zLkluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jb3lvdGUuUHJvdG9jb2xIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuSW50cm9zcGVjdGlvblV0aWxzOworCisvKioKKyAqIFN0b3JlIHRoZSBDb25uZWN0b3IgYXR0cmlidXRlcy4gQ29ubmVjdG9yIGhhcyByZWFsbHkgc3BlY2lhbCBkZXNpZ24uIEEKKyAqIENvbm5lY3RvciBpcyBvbmx5IGEgc3RhcnR1cCBXcmFwcGVyIGZvciBhIFByb3RvY29sSGFuZGxlci4gVGhpcyBtZWFudCB0aGF0CisgKiBQcm90b2NvbEhhbmRsZXIgZ2V0IGFsbCB0aGVyZSBhdHRyaWJ0dWVzIGZyb20gdGhlIENvbm5lY3RvciBhdHRyaWJ0dWUgbWFwLgorICogU3RyYW5nZSBpcyB0aGF0IHNvbWUgYXR0cmlidXRlcyBjaGFuZ2UgdGhlcmUgbmFtZSBhbmQgdGhlIGF0dHJpYnV0ZQorICogc3NsUHJvdG9jb2wgbmVlZCBhIHNlcHppYWwgaGFuZGxpbmcKKyAqIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogIAorICovCitwdWJsaWMgY2xhc3MgQ29ubmVjdG9yU3RvcmVBcHBlbmRlciBleHRlbmRzIFN0b3JlQXBwZW5kZXIgeworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBIYXNoTWFwIHJlcGxhY2VtZW50cyA9IG5ldyBIYXNoTWFwKCk7CisgICAgc3RhdGljIHsKKyAgICAgICAgcmVwbGFjZW1lbnRzLnB1dCgiYmFja2xvZyIsICJhY2NlcHRDb3VudCIpOworICAgICAgICByZXBsYWNlbWVudHMucHV0KCJzb0xpbmdlciIsICJjb25uZWN0aW9uTGluZ2VyIik7CisgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoInNvVGltZW91dCIsICJjb25uZWN0aW9uVGltZW91dCIpOworICAgICAgICByZXBsYWNlbWVudHMucHV0KCJ0aW1lb3V0IiwgImNvbm5lY3Rpb25VcGxvYWRUaW1lb3V0Iik7CisgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoImNsaWVudGF1dGgiLCAiY2xpZW50QXV0aCIpOworICAgICAgICByZXBsYWNlbWVudHMucHV0KCJrZXlzdG9yZSIsICJrZXlzdG9yZUZpbGUiKTsKKyAgICAgICAgcmVwbGFjZW1lbnRzLnB1dCgicmFuZG9tZmlsZSIsICJyYW5kb21GaWxlIik7CisgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoInJvb3RmaWxlIiwgInJvb3RGaWxlIik7CisgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoImtleXBhc3MiLCAia2V5c3RvcmVQYXNzIik7CisgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoImtleXR5cGUiLCAia2V5c3RvcmVUeXBlIik7CisgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoInByb3RvY29sIiwgInNzbFByb3RvY29sIik7CisgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoInByb3RvY29scyIsICJzc2xQcm90b2NvbHMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgcmVsZXZhbnQgYXR0cmlidXRlcyBvZiB0aGUgc3BlY2lmaWVkIEphdmFCZWFuLgorICAgICAqIAorICAgICAqIEBwYXJhbSB3cml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluY2x1ZGUKKyAgICAgKiAgICAgICAgICAgIFNob3VsZCB3ZSBpbmNsdWRlIGEgPGNvZGU+Y2xhc3NOYW1lPC9jb2RlPiBhdHRyaWJ1dGU/CisgICAgICogQHBhcmFtIGJlYW4KKyAgICAgKiAgICAgICAgICAgIEJlYW4gd2hvc2UgcHJvcGVydGllcyBhcmUgdG8gYmUgcmVuZGVyZWQgYXMgYXR0cmlidXRlcywKKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgUmVnaXN0cnlEZXNjcnBpdG9yIGZyb20gdGhpcyBiZWFuCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludEF0dHJpYnV0ZXMoUHJpbnRXcml0ZXIgd3JpdGVyLCBpbnQgaW5kZW50LAorICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlLCBPYmplY3QgYmVhbiwgU3RvcmVEZXNjcmlwdGlvbiBkZXNjKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUmVuZGVyIHRoZSByZWxldmFudCBwcm9wZXJ0aWVzIG9mIHRoaXMgYmVhbgorICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKTsKKworICAgICAgICAvLyBSZW5kZXIgYSBjbGFzc05hbWUgYXR0cmlidXRlIGlmIHJlcXVlc3RlZAorICAgICAgICBpZiAoaW5jbHVkZSAmJiBkZXNjICE9IG51bGwgJiYgIWRlc2MuaXNTdGFuZGFyZCgpKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBjbGFzc05hbWU9XCIiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChiZWFuLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiXCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIExpc3QgcHJvcGVydHlLZXlzID0gZ2V0UHJvcGVydHlLZXlzKChDb25uZWN0b3IpIGJlYW4pOworICAgICAgICAvLyBDcmVhdGUgYmxhbmsgaW5zdGFuY2UKKyAgICAgICAgT2JqZWN0IGJlYW4yID0gZGVmYXVsdEluc3RhbmNlKGJlYW4pOworICAgICAgICBmb3IgKEl0ZXJhdG9yIHByb3BlcnR5SXRlcmF0b3IgPSBwcm9wZXJ0eUtleXMuaXRlcmF0b3IoKTsgcHJvcGVydHlJdGVyYXRvcgorICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgcHJvcGVydHlJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnRzLmdldChrZXkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBrZXkgPSAoU3RyaW5nKSByZXBsYWNlbWVudHMuZ2V0KGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSAoT2JqZWN0KSBJbnRyb3NwZWN0aW9uVXRpbHMuZ2V0UHJvcGVydHkoYmVhbiwga2V5KTsKKworICAgICAgICAgICAgaWYgKGRlc2MuaXNUcmFuc2llbnRBdHRyaWJ1dGUoa2V5KSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9ucworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gTnVsbCB2YWx1ZXMgYXJlIG5vdCBwZXJzaXN0ZWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaXNQZXJzaXN0YWJsZSh2YWx1ZS5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgT2JqZWN0IHZhbHVlMiA9IEludHJvc3BlY3Rpb25VdGlscy5nZXRQcm9wZXJ0eShiZWFuMiwga2V5KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHModmFsdWUyKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBwcm9wZXJ0eSBoYXMgaXRzIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc1ByaW50VmFsdWUoYmVhbiwgYmVhbjIsIGtleSwgZGVzYykpCisgICAgICAgICAgICAgICAgcHJpbnRWYWx1ZSh3cml0ZXIsIGluZGVudCwga2V5LCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHByb3RvY29sID0gKChDb25uZWN0b3IpIGJlYW4pLmdldFByb3RvY29sKCk7CisgICAgICAgIGlmIChwcm90b2NvbCAhPSBudWxsICYmICEiSFRUUC8xLjEiLmVxdWFscyhwcm90b2NvbCkpCisgICAgICAgICAgICBzdXBlci5wcmludFZhbHVlKHdyaXRlciwgaW5kZW50LCAicHJvdG9jb2wiLCBwcm90b2NvbCk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIHByb3BlcnRpZXMgZnJvbSBDb25uZWN0b3IgYW5kIGN1cnJlbnQgUHJvdG9jb2xIYW5kbGVyCisgICAgICogCisgICAgICogQHBhcmFtIGJlYW4KKyAgICAgKiBAcmV0dXJuIExpc3Qgb2YgQ29ubmVjdG9yIFByb3BlcnRpZXMKKyAgICAgKiBAdGhyb3dzIEludHJvc3BlY3Rpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlzdCBnZXRQcm9wZXJ0eUtleXMoQ29ubmVjdG9yIGJlYW4pCisgICAgICAgICAgICB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIC8vIEFjcXVpcmUgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBmb3IgdGhpcyBiZWFuCisgICAgICAgIFByb3RvY29sSGFuZGxlciBwcm90b2NvbEhhbmRsZXIgPSBiZWFuLmdldFByb3RvY29sSGFuZGxlcigpOworICAgICAgICAvLyBBY3F1aXJlIHRoZSBsaXN0IG9mIHByb3BlcnRpZXMgZm9yIHRoaXMgYmVhbgorICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcnNbXSA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbygKKyAgICAgICAgICAgICAgICBiZWFuLmdldENsYXNzKCkpLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3JzID09IG51bGwpIHsKKyAgICAgICAgICAgIGRlc2NyaXB0b3JzID0gbmV3IFByb3BlcnR5RGVzY3JpcHRvclswXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvcnNbaV0gaW5zdGFuY2VvZiBJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIEluZGV4ZWQgcHJvcGVydGllcyBhcmUgbm90IHBlcnNpc3RlZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFpc1BlcnNpc3RhYmxlKGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5VHlwZSgpKQorICAgICAgICAgICAgICAgICAgICB8fCAoZGVzY3JpcHRvcnNbaV0uZ2V0UmVhZE1ldGhvZCgpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHx8IChkZXNjcmlwdG9yc1tpXS5nZXRXcml0ZU1ldGhvZCgpID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIE11c3QgYmUgYSByZWFkLXdyaXRlIHByaW1pdGl2ZSBvciBTdHJpbmcKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgicHJvdG9jb2wiLmVxdWFscyhkZXNjcmlwdG9yc1tpXS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgIHx8ICJwcm90b2NvbEhhbmRsZXJDbGFzc05hbWUiLmVxdWFscyhkZXNjcmlwdG9yc1tpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcHJvcGVydHlLZXlzLmFkZChkZXNjcmlwdG9yc1tpXS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoSXRlcmF0b3IgcHJvcGVydHlJdGVyYXRvciA9IHByb3RvY29sSGFuZGxlci5nZXRBdHRyaWJ1dGVOYW1lcygpOyBwcm9wZXJ0eUl0ZXJhdG9yCisgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBrZXkgPSBwcm9wZXJ0eUl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eUtleXMuY29udGFpbnMoa2V5KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHByb3BlcnR5S2V5cy5hZGQoa2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvcGVydHlLZXlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIHByaW50IEF0dHJpYnV0ZXMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVdyaXRlcgorICAgICAqIEBwYXJhbSBpbmRlbnQKKyAgICAgKiBAcGFyYW0gYmVhbgorICAgICAqIEBwYXJhbSBhRGVzYworICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3RvcmVDb25uZWN0b3JBdHRyaWJ0dWVzKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsCisgICAgICAgICAgICBPYmplY3QgYmVhbiwgU3RvcmVEZXNjcmlwdGlvbiBhRGVzYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhRGVzYy5pc0F0dHJpYnV0ZXMoKSkgeworICAgICAgICAgICAgcHJpbnRBdHRyaWJ1dGVzKGFXcml0ZXIsIGluZGVudCwgZmFsc2UsIGJlYW4sIGFEZXNjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUHJpbnQgdGhlIG9wZW4gdGFnIGZvciBjb25uZWN0b3IgYXR0cmlidXRlcyAob3ZlcnJpZGUpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlQXBwZW5kZXIjcHJpbnRPcGVuVGFnKGphdmEuaW8uUHJpbnRXcml0ZXIsCisgICAgICogICAgICBpbnQsIGphdmEubGFuZy5PYmplY3QsCisgICAgICogICAgICBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRGVzY3JpcHRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRPcGVuVGFnKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBiZWFuLAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBhRGVzYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFXcml0ZXIucHJpbnQoIjwiKTsKKyAgICAgICAgYVdyaXRlci5wcmludChhRGVzYy5nZXRUYWcoKSk7CisgICAgICAgIHN0b3JlQ29ubmVjdG9yQXR0cmlidHVlcyhhV3JpdGVyLCBpbmRlbnQsIGJlYW4sIGFEZXNjKTsKKyAgICAgICAgYVdyaXRlci5wcmludGxuKCI+Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogcHJpbnQgYSB0YWcgZm9yIGNvbm5lY3RvciBhdHRyaWJ1dGVzIChvdmVycmlkZSkKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVBcHBlbmRlciNwcmludFRhZyhqYXZhLmlvLlByaW50V3JpdGVyLAorICAgICAqICAgICAgaW50LCBqYXZhLmxhbmcuT2JqZWN0LAorICAgICAqICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZURlc2NyaXB0aW9uKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50VGFnKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBiZWFuLAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBhRGVzYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFXcml0ZXIucHJpbnQoIjwiKTsKKyAgICAgICAgYVdyaXRlci5wcmludChhRGVzYy5nZXRUYWcoKSk7CisgICAgICAgIHN0b3JlQ29ubmVjdG9yQXR0cmlidHVlcyhhV3JpdGVyLCBpbmRlbnQsIGJlYW4sIGFEZXNjKTsKKyAgICAgICAgYVdyaXRlci5wcmludGxuKCIvPiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHByaW50IGEgdmFsdWUgYnV0IHJlcGxhY2UgYXR0cmlidXRlIG5hbWUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd3JpdGVyCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVBcHBlbmRlciNwcmludFZhbHVlKGphdmEuaW8uUHJpbnRXcml0ZXIsCisgICAgICogICAgICBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRWYWx1ZShQcmludFdyaXRlciB3cml0ZXIsIGludCBpbmRlbnQsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIFN0cmluZyByZXBsID0gbmFtZTsKKyAgICAgICAgaWYgKHJlcGxhY2VtZW50cy5nZXQobmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVwbCA9IChTdHJpbmcpIHJlcGxhY2VtZW50cy5nZXQobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIucHJpbnRWYWx1ZSh3cml0ZXIsIGluZGVudCwgcmVwbCwgdmFsdWUpOworICAgIH0KKyAgICAKKyAgICAvKgorICAgICAqIFByaW50IENvbm5lY3RvciBWYWx1ZXMuIDx1bD48bGk+IFNwZXppYWwgaGFuZGxpbmcgdG8gZGVmYXVsdCBqa0hvbWUuCisgICAgICogPC9saT48bGk+IERvbid0IHNhdmUgY2F0YWxpbmEuYmFzZSBwYXRoIGF0IHNlcnZlci54bWw8L2xpPjxsaT48L3VsPgorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25maWcuU3RvcmVBcHBlbmRlciNpc1ByaW50VmFsdWUoamF2YS5sYW5nLk9iamVjdCwKKyAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsCisgICAgICogICAgICBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5TdG9yZURlc2NyaXB0aW9uKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbnRWYWx1ZShPYmplY3QgYmVhbiwgT2JqZWN0IGJlYW4yLCBTdHJpbmcgYXR0ck5hbWUsCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2MpIHsKKyAgICAgICAgYm9vbGVhbiBpc1ByaW50ID0gc3VwZXIuaXNQcmludFZhbHVlKGJlYW4sIGJlYW4yLCBhdHRyTmFtZSwgZGVzYyk7CisgICAgICAgIGlmIChpc1ByaW50KSB7CisgICAgICAgICAgICBpZiAoImprSG9tZSIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIENvbm5lY3RvciBjb25uZWN0b3IgPSAoKENvbm5lY3RvcikgYmVhbik7CisgICAgICAgICAgICAgICAgRmlsZSBjYXRhbGluYUJhc2UgPSBnZXRDYXRhbGluYUJhc2UoKTsKKyAgICAgICAgICAgICAgICBGaWxlIGprSG9tZUJhc2UgPSBnZXRKa0hvbWVCYXNlKChTdHJpbmcpIGNvbm5lY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJqa0hvbWUiKSwgY2F0YWxpbmFCYXNlKTsKKyAgICAgICAgICAgICAgICBpc1ByaW50ID0gIWNhdGFsaW5hQmFzZS5lcXVhbHMoamtIb21lQmFzZSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXNQcmludDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRDYXRhbGluYUJhc2UoKSB7CisKKyAgICAgICAgRmlsZSBhcHBCYXNlOworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaWxlID0gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGZpbGUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBGaWxlIGdldEprSG9tZUJhc2UoU3RyaW5nIGprSG9tZSwgRmlsZSBhcHBCYXNlKSB7CisKKyAgICAgICAgRmlsZSBqa0hvbWVCYXNlOworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShqa0hvbWUpOworICAgICAgICBpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKQorICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGFwcEJhc2UsIGprSG9tZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqa0hvbWVCYXNlID0gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGprSG9tZUJhc2UgPSBmaWxlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoamtIb21lQmFzZSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvQ29uc3RhbnRzLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGNkYjk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBDb25zdGFudHMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnIjsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0dsb2JhbE5hbWluZ1Jlc291cmNlc1NGLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9HbG9iYWxOYW1pbmdSZXNvdXJjZXNTRi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOTZkMmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9HbG9iYWxOYW1pbmdSZXNvdXJjZXNTRi5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk5hbWluZ1Jlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLyoqCisgKiBzdG9yZSBzZXJ2ZXIueG1sIEdsb2JhbE5hbWluZ1Jlc291cmNlLgorICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoIAorICogIAorICovCitwdWJsaWMgY2xhc3MgR2xvYmFsTmFtaW5nUmVzb3VyY2VzU0YgZXh0ZW5kcyBTdG9yZUZhY3RvcnlCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coR2xvYmFsTmFtaW5nUmVzb3VyY2VzU0YuY2xhc3MpOworCisgICAgLyoKKyAgICAgKiBTdG9yZSB3aXRoIE5hbWluZ1Jlc291cmNlIEZhY3RvcnkKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSVN0b3JlRmFjdG9yeSNzdG9yZShqYXZhLmlvLlByaW50V3JpdGVyLAorICAgICAqICAgICAgaW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBhRWxlbWVudCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChhRWxlbWVudCBpbnN0YW5jZW9mIE5hbWluZ1Jlc291cmNlcykgeworCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGVsZW1lbnREZXNjID0gZ2V0UmVnaXN0cnkoKS5maW5kRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgIE5hbWluZ1Jlc291cmNlcy5jbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuW0dsb2JhbE5hbWluZ1Jlc291cmNlc10iKTsKKworICAgICAgICAgICAgaWYgKGVsZW1lbnREZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBnZXRTdG9yZUFwcGVuZGVyKCkucHJpbnRJbmRlbnQoYVdyaXRlciwgaW5kZW50ICsgMik7CisgICAgICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50T3BlblRhZyhhV3JpdGVyLCBpbmRlbnQgKyAyLCBhRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnREZXNjKTsKKyAgICAgICAgICAgICAgICBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gKE5hbWluZ1Jlc291cmNlcykgYUVsZW1lbnQ7CisgICAgICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiByZXNvdXJjZXNkZXNjID0gZ2V0UmVnaXN0cnkoKS5maW5kRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBOYW1pbmdSZXNvdXJjZXMuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzZGVzYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlc2Rlc2MuZ2V0U3RvcmVGYWN0b3J5KCkuc3RvcmUoYVdyaXRlciwgaW5kZW50ICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiQ2FuJ3QgZmluZCBOYW1pbmdSc291cmNlcyBTdG9yZSBGYWN0b3J5ISIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50SW5kZW50KGFXcml0ZXIsIGluZGVudCArIDIpOworICAgICAgICAgICAgICAgIGdldFN0b3JlQXBwZW5kZXIoKS5wcmludENsb3NlVGFnKGFXcml0ZXIsIGVsZW1lbnREZXNjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJEZXNjcmlwdG9yIGZvciBlbGVtZW50IiArIGFFbGVtZW50LmdldENsYXNzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbm90IGNvbmZpZ3VyZWQhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cud2Fybigid3JvbmcgZWxlbWVudCAiICsgYUVsZW1lbnQuZ2V0Q2xhc3MoKSk7CisKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvSUR5bmFtaWNQcm9wZXJ0eVN0b3JlQXBwZW5kZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0lEeW5hbWljUHJvcGVydHlTdG9yZUFwcGVuZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkNzU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0lEeW5hbWljUHJvcGVydHlTdG9yZUFwcGVuZGVyLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuYmVhbnMuSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEudXRpbC5JRHluYW1pY1Byb3BlcnR5OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuSW50cm9zcGVjdGlvblV0aWxzOworCisvKioKKyAqIFN0b3JlIHRoZSBJRHluYW1pY1Byb3BlcnR5IGF0dHJpYnV0ZXMuIAorICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBJRHluYW1pY1Byb3BlcnR5U3RvcmVBcHBlbmRlciBleHRlbmRzIFN0b3JlQXBwZW5kZXIgeworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHJlbGV2YW50IGF0dHJpYnV0ZXMgb2YgdGhlIHNwZWNpZmllZCBKYXZhQmVhbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd3JpdGVyCisgICAgICogICAgICAgICAgICBQcmludFdyaXRlciB0byB3aGljaCB3ZSBhcmUgc3RvcmluZworICAgICAqIEBwYXJhbSBpbmNsdWRlCisgICAgICogICAgICAgICAgICBTaG91bGQgd2UgaW5jbHVkZSBhIDxjb2RlPmNsYXNzTmFtZTwvY29kZT4gYXR0cmlidXRlPworICAgICAqIEBwYXJhbSBiZWFuCisgICAgICogICAgICAgICAgICBCZWFuIHdob3NlIHByb3BlcnRpZXMgYXJlIHRvIGJlIHJlbmRlcmVkIGFzIGF0dHJpYnV0ZXMsCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiAgICAgICAgICAgIFJlZ2lzdHJ5RGVzY3JwaXRvciBmcm9tIHRoaXMgYmVhbgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzdG9yaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRBdHRyaWJ1dGVzKFByaW50V3JpdGVyIHdyaXRlciwgaW50IGluZGVudCwKKyAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZSwgT2JqZWN0IGJlYW4sIFN0b3JlRGVzY3JpcHRpb24gZGVzYykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIFJlbmRlciB0aGUgcmVsZXZhbnQgcHJvcGVydGllcyBvZiB0aGlzIGJlYW4KKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGJlYW4uZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisKKyAgICAgICAgLy8gUmVuZGVyIGEgY2xhc3NOYW1lIGF0dHJpYnV0ZSBpZiByZXF1ZXN0ZWQKKyAgICAgICAgaWYgKGluY2x1ZGUgJiYgZGVzYyAhPSBudWxsICYmICFkZXNjLmlzU3RhbmRhcmQoKSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgY2xhc3NOYW1lPVwiIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIlwiIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmVhbiBpbnN0YW5jZW9mIElEeW5hbWljUHJvcGVydHkpIHsKKyAgICAgICAgICAgIExpc3QgcHJvcGVydHlLZXlzID0gZ2V0UHJvcGVydHlLZXlzKChJRHluYW1pY1Byb3BlcnR5KSBiZWFuKTsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBibGFuayBpbnN0YW5jZQorICAgICAgICAgICAgT2JqZWN0IGJlYW4yID0gZGVmYXVsdEluc3RhbmNlKGJlYW4pOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBwcm9wZXJ0eUl0ZXJhdG9yID0gcHJvcGVydHlLZXlzLml0ZXJhdG9yKCk7IHByb3BlcnR5SXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgcHJvcGVydHlJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gKE9iamVjdCkgSW50cm9zcGVjdGlvblV0aWxzLmdldFByb3BlcnR5KGJlYW4sCisgICAgICAgICAgICAgICAgICAgICAgICBrZXkpOworCisgICAgICAgICAgICAgICAgaWYgKGRlc2MuaXNUcmFuc2llbnRBdHRyaWJ1dGUoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbnMKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIE51bGwgdmFsdWVzIGFyZSBub3QgcGVyc2lzdGVkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghaXNQZXJzaXN0YWJsZSh2YWx1ZS5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlMiA9IEludHJvc3BlY3Rpb25VdGlscy5nZXRQcm9wZXJ0eShiZWFuMiwga2V5KTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKHZhbHVlMikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHByb3BlcnR5IGhhcyBpdHMgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlzUHJpbnRWYWx1ZShiZWFuLCBiZWFuMiwga2V5LCBkZXNjKSkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRWYWx1ZSh3cml0ZXIsIGluZGVudCwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIHByb3BlcnRpZXMgZnJvbSBSZXBsaWNhdGlvblRyYW5zbWl0dGVyIChhbHNvIGR5bmFtaWMgcHJvcGVydGllcykKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYmVhbgorICAgICAqIEByZXR1cm4gTGlzdCBvZiBDb25uZWN0b3IgUHJvcGVydGllcworICAgICAqIEB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBMaXN0IGdldFByb3BlcnR5S2V5cyhJRHluYW1pY1Byb3BlcnR5IGJlYW4pCisgICAgICAgICAgICB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIC8vIEFjcXVpcmUgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBmb3IgdGhpcyBiZWFuCisgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yc1tdID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKAorICAgICAgICAgICAgICAgIGJlYW4uZ2V0Q2xhc3MoKSkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOworICAgICAgICBpZiAoZGVzY3JpcHRvcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgZGVzY3JpcHRvcnMgPSBuZXcgUHJvcGVydHlEZXNjcmlwdG9yWzBdOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yc1tpXSBpbnN0YW5jZW9mIEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gSW5kZXhlZCBwcm9wZXJ0aWVzIGFyZSBub3QgcGVyc2lzdGVkCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWlzUGVyc2lzdGFibGUoZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgIHx8IChkZXNjcmlwdG9yc1tpXS5nZXRSZWFkTWV0aG9kKCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKGRlc2NyaXB0b3JzW2ldLmdldFdyaXRlTWV0aG9kKCkgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gTXVzdCBiZSBhIHJlYWQtd3JpdGUgcHJpbWl0aXZlIG9yIFN0cmluZworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvcGVydHlLZXlzLmFkZChkZXNjcmlwdG9yc1tpXS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoSXRlcmF0b3IgcHJvcGVydHlJdGVyYXRvciA9IGJlYW4uZ2V0UHJvcGVydHlOYW1lcygpOyBwcm9wZXJ0eUl0ZXJhdG9yCisgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBrZXkgPSBwcm9wZXJ0eUl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eUtleXMuY29udGFpbnMoa2V5KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICgiY2xhc3NOYW1lIi5lcXVhbHMoa2V5KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHByb3BlcnR5S2V5cy5hZGQoa2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvcGVydHlLZXlzOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0lTdG9yZUNvbmZpZy5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvSVN0b3JlQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzZGM3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0lTdG9yZUNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2aWNlOworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2ggCisgKiAgCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVN0b3JlQ29uZmlnIHsKKworICAgIC8qKgorICAgICAqIEdldCBDb25maWd1cmF0aW9uIFJlZ2lzdHJ5CisgICAgICogCisgICAgICogQHJldHVybiBhUmVnaXN0cnkgdGhhdCBoYW5kbGUgdGhlIHN0b3JlIG9wZXJhdGlvbnMKKyAgICAgKi8KKyAgICBTdG9yZVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgQ29uZmlndXJhdGlvbiBSZWdpc3RyeQorICAgICAqIAorICAgICAqIEBwYXJhbSBhUmVnaXN0cnkKKyAgICAgKiAgICAgICAgICAgIGFyZWdpc3RyeSB0aGF0IGhhbmRsZSB0aGUgc3RvcmUgb3BlcmF0aW9ucworICAgICAqLworICAgIHZvaWQgc2V0UmVnaXN0cnkoU3RvcmVSZWdpc3RyeSBhUmVnaXN0cnkpOworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIGN1cnJlbnQgU3RvcmVGYWN0b3J5IFNlcnZlci4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqLworICAgIHZvaWQgc3RvcmVDb25maWcoKSB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBTZXJ2ZXIgcHJvcGVydGllcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVNlcnZlcgorICAgICAqICAgICAgICAgICAgT2JqZWN0IHRvIGJlIHN0b3JlZAorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzdG9yaW5nCisgICAgICovCisgICAgdm9pZCBzdG9yZShTZXJ2ZXIgYVNlcnZlcikgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzcGVjaWZpZWQgU2VydmVyIHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIGFTZXJ2ZXIKKyAgICAgKiAgICAgICAgICAgIE9iamVjdCB0byBiZSBzdG9yZWQKKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqLworICAgIHZvaWQgc3RvcmUoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgU2VydmVyIGFTZXJ2ZXIpOworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBTZXJ2aWNlIHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIGFTZXJ2aWNlCisgICAgICogICAgICAgICAgICBPYmplY3QgdG8gYmUgc3RvcmVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIFNlcnZpY2UgYVNlcnZpY2UpOworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBIb3N0IHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIGFIb3N0CisgICAgICogICAgICAgICAgICBPYmplY3QgdG8gYmUgc3RvcmVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIEhvc3QgYUhvc3QpOworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBDb250ZXh0IHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFDb250ZXh0CisgICAgICogICAgICAgICAgICBPYmplY3QgdG8gYmUgc3RvcmVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICB2b2lkIHN0b3JlKENvbnRleHQgYUNvbnRleHQpOworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBDb250ZXh0IHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIGFDb250ZXh0CisgICAgICogICAgICAgICAgICBPYmplY3QgdG8gYmUgc3RvcmVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIENvbnRleHQgYUNvbnRleHQpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0lTdG9yZUZhY3RvcnkuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0lTdG9yZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWZlZmMwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvSVN0b3JlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoIAorICogIAorICovCitwdWJsaWMgaW50ZXJmYWNlIElTdG9yZUZhY3RvcnkgeworICAgIFN0b3JlQXBwZW5kZXIgZ2V0U3RvcmVBcHBlbmRlcigpOworCisgICAgdm9pZCBzZXRTdG9yZUFwcGVuZGVyKFN0b3JlQXBwZW5kZXIgc3RvcmVXcml0ZXIpOworCisgICAgdm9pZCBzZXRSZWdpc3RyeShTdG9yZVJlZ2lzdHJ5IGFSZWdpc3RyeSk7CisKKyAgICBTdG9yZVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCk7CisKKyAgICB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBhRWxlbWVudCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb247CisKKyAgICB2b2lkIHN0b3JlWE1MSGVhZChQcmludFdyaXRlciBhV3JpdGVyKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9JbnN0YW5jZUxpc3RlbmVyU0YuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0luc3RhbmNlTGlzdGVuZXJTRi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NDAxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9JbnN0YW5jZUxpc3RlbmVyU0YuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKy8qKgorICogU3RvcmUgQ29udGV4dCBJbnN0YW5jZUxpc3RlbmVyCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2ggCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBJbnN0YW5jZUxpc3RlbmVyU0YgZXh0ZW5kcyBTdG9yZUZhY3RvcnlCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSW5zdGFuY2VMaXN0ZW5lclNGLmNsYXNzKTsKKworICAgIC8qCisgICAgICogU3RvcmUgbmVzdGVkIEVsZW1lbnQgVmFsdWUgQXJyYXlzCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5JU3RvcmVGYWN0b3J5I3N0b3JlKGphdmEuaW8uUHJpbnRXcml0ZXIsCisgICAgICogICAgICBpbnQsIGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmUoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFFbGVtZW50KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhRWxlbWVudCBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCkgeworICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBlbGVtZW50RGVzYyA9IGdldFJlZ2lzdHJ5KCkuZmluZERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBhRWxlbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIuW0luc3RhbmNlTGlzdGVuZXJdIik7CisgICAgICAgICAgICBTdHJpbmdbXSBsaXN0ZW5lcnMgPSAoKFN0YW5kYXJkQ29udGV4dCkgYUVsZW1lbnQpCisgICAgICAgICAgICAgICAgICAgIC5maW5kSW5zdGFuY2VMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50RGVzYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInN0b3JlICIgKyBlbGVtZW50RGVzYy5nZXRUYWcoKSArICIoICIgKyBhRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiApIik7CisgICAgICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50VGFnQXJyYXkoYVdyaXRlciwgIkluc3RhbmNlTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50LCBsaXN0ZW5lcnMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLndhcm4oIkRlc2NyaXB0b3IgZm9yIGVsZW1lbnQiICsgYUVsZW1lbnQuZ2V0Q2xhc3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLltJbnN0YW5jZUxpc3RlbmVyXSBub3QgY29uZmlndXJlZCEiKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Mb2FkZXJTRi5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTG9hZGVyU0YuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjkwNDUxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTG9hZGVyU0YuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcExvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLyoqCisgKiBTdG9yZSBMb2FkZXIgRWxlbWVudC4KKyAqIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICovCitwdWJsaWMgY2xhc3MgTG9hZGVyU0YgZXh0ZW5kcyBTdG9yZUZhY3RvcnlCYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhMb2FkZXJTRi5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgb25seSB0aGUgTG9hZGVyIGVsZW1lbnRzLCB3aGVuIG5vdCBkZWZhdWx0CisgICAgICogCisgICAgICogQHNlZSBOYW1pbmdSZXNvdXJjZXNTRiNzdG9yZUNoaWxkcyhQcmludFdyaXRlciwgaW50LCBPYmplY3QsIFN0b3JlRGVzY3JpcHRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmUoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFFbGVtZW50KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZWxlbWVudERlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICBhRWxlbWVudC5nZXRDbGFzcygpKTsKKyAgICAgICAgaWYgKGVsZW1lbnREZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvYWRlciBsb2FkZXIgPSAoTG9hZGVyKSBhRWxlbWVudDsKKyAgICAgICAgICAgIGlmICghaXNEZWZhdWx0TG9hZGVyKGxvYWRlcikpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zygic3RvcmUgIiArIGVsZW1lbnREZXNjLmdldFRhZygpICsgIiggIiArIGFFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICkiKTsKKyAgICAgICAgICAgICAgICBnZXRTdG9yZUFwcGVuZGVyKCkucHJpbnRJbmRlbnQoYVdyaXRlciwgaW5kZW50ICsgMik7CisgICAgICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50VGFnKGFXcml0ZXIsIGluZGVudCArIDIsIGxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnREZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nCisgICAgICAgICAgICAgICAgICAgICAgICAud2FybigiRGVzY3JpcHRvciBmb3IgZWxlbWVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhRWxlbWVudC5nZXRDbGFzcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3QgY29uZmlndXJlZCBvciBlbGVtZW50IGNsYXNzIG5vdCBTdGFuZGFyZE1hbmFnZXIhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IDxjb2RlPkxvYWRlcjwvY29kZT4gY29uZmlndXJhdGlvbiwKKyAgICAgKiB3aXRoIGFsbC1kZWZhdWx0IHByb3BlcnRpZXM/CisgICAgICogCisgICAgICogQHBhcmFtIGxvYWRlcgorICAgICAqICAgICAgICAgICAgTG9hZGVyIHRvIGJlIHRlc3RlZAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdExvYWRlcihMb2FkZXIgbG9hZGVyKSB7CisKKyAgICAgICAgaWYgKCEobG9hZGVyIGluc3RhbmNlb2YgV2ViYXBwTG9hZGVyKSkgeworICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgV2ViYXBwTG9hZGVyIHdsb2FkZXIgPSAoV2ViYXBwTG9hZGVyKSBsb2FkZXI7CisgICAgICAgIGlmICgod2xvYWRlci5nZXREZWxlZ2F0ZSgpICE9IGZhbHNlKQorICAgICAgICAgICAgICAgIHx8ICF3bG9hZGVyLmdldExvYWRlckNsYXNzKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcENsYXNzTG9hZGVyIikpIHsKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTNkNGZiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyIEBACitmYWN0b3J5LnN0b3JlVGFnPXN0b3JlIHRhZyB7MH0gKCBPYmplY3Q6IHsxfSApCitmYWN0b3J5LnN0b3JlTm9EZXNjcmlwdG9yPURlc2NyaXB0b3IgZm9yIGVsZW1lbnQgY2xhc3MgezB9IG5vdCBjb25maWd1cmVkIQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTWFuYWdlclNGLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9NYW5hZ2VyU0YuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDI2ZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTWFuYWdlclNGLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uU3RhbmRhcmRNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisvKioKKyAqIFN0b3JlIHNlcnZlci54bWwgTWFuYWdlciBlbGVtZW50CisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqLworcHVibGljIGNsYXNzIE1hbmFnZXJTRiBleHRlbmRzIFN0b3JlRmFjdG9yeUJhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1hbmFnZXJTRi5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgb25seSB0aGUgTWFuYWdlciBlbGVtZW50cworICAgICAqIAorICAgICAqIEBzZWUgTmFtaW5nUmVzb3VyY2VzU0Yjc3RvcmVDaGlsZHMoUHJpbnRXcml0ZXIsIGludCwgT2JqZWN0LCBTdG9yZURlc2NyaXB0aW9uKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBhRWxlbWVudCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGVsZW1lbnREZXNjID0gZ2V0UmVnaXN0cnkoKS5maW5kRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgYUVsZW1lbnQuZ2V0Q2xhc3MoKSk7CisgICAgICAgIGlmIChlbGVtZW50RGVzYyAhPSBudWxsICYmIGFFbGVtZW50IGluc3RhbmNlb2YgU3RhbmRhcmRNYW5hZ2VyKSB7CisgICAgICAgICAgICBTdGFuZGFyZE1hbmFnZXIgbWFuYWdlciA9IChTdGFuZGFyZE1hbmFnZXIpIGFFbGVtZW50OworICAgICAgICAgICAgaWYgKCFpc0RlZmF1bHRNYW5hZ2VyKG1hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJmYWN0b3J5LnN0b3JlVGFnIiwgZWxlbWVudERlc2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VGFnKCksIGFFbGVtZW50KSk7CisgICAgICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50SW5kZW50KGFXcml0ZXIsIGluZGVudCArIDIpOworICAgICAgICAgICAgICAgIGdldFN0b3JlQXBwZW5kZXIoKS5wcmludFRhZyhhV3JpdGVyLCBpbmRlbnQgKyAyLCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudERlc2MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nKCJmYWN0b3J5LnN0b3JlTm9EZXNjcmlwdG9yIiwgYUVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzcygpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IDxjb2RlPk1hbmFnZXI8L2NvZGU+IGNvbmZpZ3VyYXRpb24sCisgICAgICogd2l0aCBhbGwtZGVmYXVsdCBwcm9wZXJ0aWVzPworICAgICAqIAorICAgICAqIEBwYXJhbSBzbWFuYWdlcgorICAgICAqICAgICAgICAgICAgTWFuYWdlciB0byBiZSB0ZXN0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRNYW5hZ2VyKFN0YW5kYXJkTWFuYWdlciBzbWFuYWdlcikgeworCisgICAgICAgIGlmICghIlNFU1NJT05TLnNlciIuZXF1YWxzKHNtYW5hZ2VyLmdldFBhdGhuYW1lKCkpCisgICAgICAgICAgICAgICAgfHwgISJqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSIuZXF1YWxzKHNtYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmFuZG9tQ2xhc3MoKSkKKyAgICAgICAgICAgICAgICB8fCAoc21hbmFnZXIuZ2V0TWF4QWN0aXZlU2Vzc2lvbnMoKSAhPSAtMSkKKyAgICAgICAgICAgICAgICB8fCAhIk1ENSIuZXF1YWxzKHNtYW5hZ2VyLmdldEFsZ29yaXRobSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh0cnVlKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTmFtaW5nUmVzb3VyY2VzU0YuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL05hbWluZ1Jlc291cmNlc1NGLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3MTAwZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL05hbWluZ1Jlc291cmNlc1NGLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFamI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVudmlyb25tZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRMb2NhbEVqYjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlRW52UmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUxpbms7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisvKioKKyAqIFN0b3JlIHNlcnZlci54bWwgZWxlbWVudHMgUmVzb3VyY2VzIGF0IGNvbnRleHQgYW5kIEdsb2JhbE5hbWluZ1Jlc291cmNlcworICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBOYW1pbmdSZXNvdXJjZXNTRiBleHRlbmRzIFN0b3JlRmFjdG9yeUJhc2UgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhOYW1pbmdSZXNvdXJjZXNTRi5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgb25seSB0aGUgTmFtaW5nUmVzb3VyY2VzIGVsZW1lbnRzCisgICAgICogCisgICAgICogQHNlZSBOYW1pbmdSZXNvdXJjZXNTRiNzdG9yZUNoaWxkcyhQcmludFdyaXRlciwgaW50LCBPYmplY3QsIFN0b3JlRGVzY3JpcHRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmUoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFFbGVtZW50KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZWxlbWVudERlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICBhRWxlbWVudC5nZXRDbGFzcygpKTsKKyAgICAgICAgaWYgKGVsZW1lbnREZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoInN0b3JlICIgKyBlbGVtZW50RGVzYy5nZXRUYWcoKSArICIoICIgKyBhRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICkiKTsKKyAgICAgICAgICAgIHN0b3JlQ2hpbGRzKGFXcml0ZXIsIGluZGVudCwgYUVsZW1lbnQsIGVsZW1lbnREZXNjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy53YXJuKCJEZXNjcmlwdG9yIGZvciBlbGVtZW50IiArIGFFbGVtZW50LmdldENsYXNzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3QgY29uZmlndXJlZCEiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzcGVjaWZpZWQgTmFtaW5nUmVzb3VyY2VzIHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIGFFbGVtZW50CisgICAgICogICAgICAgICAgICBPYmplY3Qgd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgc3RvcmVkCisgICAgICogQHBhcmFtIGVsZW1lbnREZXNjCisgICAgICogICAgICAgICAgICBlbGVtZW50IGRlc2NyaXB0b3IKKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlI3N0b3JlQ2hpbGRzKGphdmEuaW8uUHJpbnRXcml0ZXIsCisgICAgICogICAgICBpbnQsIGphdmEubGFuZy5PYmplY3QsIFN0b3JlRGVzY3JpcHRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmVDaGlsZHMoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFFbGVtZW50LAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBlbGVtZW50RGVzYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGFFbGVtZW50IGluc3RhbmNlb2YgTmFtaW5nUmVzb3VyY2VzKSB7CisgICAgICAgICAgICBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gKE5hbWluZ1Jlc291cmNlcykgYUVsZW1lbnQ7CisgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPEVqYj4gZWxlbWVudHMKKyAgICAgICAgICAgIENvbnRleHRFamJbXSBlamJzID0gcmVzb3VyY2VzLmZpbmRFamJzKCk7CisgICAgICAgICAgICBzdG9yZUVsZW1lbnRBcnJheShhV3JpdGVyLCBpbmRlbnQsIGVqYnMpOworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxFbnZpcm9ubWVudD4gZWxlbWVudHMKKyAgICAgICAgICAgIENvbnRleHRFbnZpcm9ubWVudFtdIGVudnMgPSByZXNvdXJjZXMuZmluZEVudmlyb25tZW50cygpOworICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCBlbnZzKTsKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8TG9jYWxFamI+IGVsZW1lbnRzCisgICAgICAgICAgICBDb250ZXh0TG9jYWxFamJbXSBsZWpicyA9IHJlc291cmNlcy5maW5kTG9jYWxFamJzKCk7CisgICAgICAgICAgICBzdG9yZUVsZW1lbnRBcnJheShhV3JpdGVyLCBpbmRlbnQsIGxlamJzKTsKKworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxSZXNvdXJjZT4gZWxlbWVudHMKKyAgICAgICAgICAgIENvbnRleHRSZXNvdXJjZVtdIGRyZXNvdXJjZXMgPSByZXNvdXJjZXMuZmluZFJlc291cmNlcygpOworICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCBkcmVzb3VyY2VzKTsKKworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxSZXNvdXJjZUVudlJlZj4gZWxlbWVudHMKKyAgICAgICAgICAgIENvbnRleHRSZXNvdXJjZUVudlJlZltdIHJlc0VudiA9IHJlc291cmNlcy5maW5kUmVzb3VyY2VFbnZSZWZzKCk7CisgICAgICAgICAgICBzdG9yZUVsZW1lbnRBcnJheShhV3JpdGVyLCBpbmRlbnQsIHJlc0Vudik7CisKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8UmVzb3VyY2VMaW5rPiBlbGVtZW50cworICAgICAgICAgICAgQ29udGV4dFJlc291cmNlTGlua1tdIHJlc291cmNlTGlua3MgPSByZXNvdXJjZXMuZmluZFJlc291cmNlTGlua3MoKTsKKyAgICAgICAgICAgIHN0b3JlRWxlbWVudEFycmF5KGFXcml0ZXIsIGluZGVudCwgcmVzb3VyY2VMaW5rcyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1BlcnNpc3RlbnRNYW5hZ2VyU0YuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1BlcnNpc3RlbnRNYW5hZ2VyU0YuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRjODRmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvUGVyc2lzdGVudE1hbmFnZXJTRi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uUGVyc2lzdGVudE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKy8qKgorICogc3RvcmUgc2VydmVyLnhtbCBQZXJzaXN0ZW50TWFuYWdlciBlbGVtZW50IHdpdGggbmVzdGVkICJTdG9yZSIKKyAqIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICovCitwdWJsaWMgY2xhc3MgUGVyc2lzdGVudE1hbmFnZXJTRiBleHRlbmRzIFN0b3JlRmFjdG9yeUJhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBlcnNpc3RlbnRNYW5hZ2VyU0YuY2xhc3MpOworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBQZXJzaXN0ZW50TWFuYWdlciBwcm9wZXJ0aWVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhV3JpdGVyCisgICAgICogICAgICAgICAgICBQcmludFdyaXRlciB0byB3aGljaCB3ZSBhcmUgc3RvcmluZworICAgICAqIEBwYXJhbSBpbmRlbnQKKyAgICAgKiAgICAgICAgICAgIE51bWJlciBvZiBzcGFjZXMgdG8gaW5kZW50IHRoaXMgZWxlbWVudAorICAgICAqIEBwYXJhbSBhTWFuYWdlcgorICAgICAqICAgICAgICAgICAgUGVyc2lzdGVudE1hbmFnZXIgd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgc3RvcmVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZUNoaWxkcyhQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LCBPYmplY3QgYU1hbmFnZXIsCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIHBhcmVudERlc2MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoYU1hbmFnZXIgaW5zdGFuY2VvZiBQZXJzaXN0ZW50TWFuYWdlcikgeworICAgICAgICAgICAgUGVyc2lzdGVudE1hbmFnZXIgbWFuYWdlciA9IChQZXJzaXN0ZW50TWFuYWdlcikgYU1hbmFnZXI7CisKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8TWFuYWdlcj4gZWxlbWVudHMKKyAgICAgICAgICAgIFN0b3JlIHN0b3JlID0gbWFuYWdlci5nZXRTdG9yZSgpOworICAgICAgICAgICAgc3RvcmVFbGVtZW50KGFXcml0ZXIsIGluZGVudCwgc3RvcmUpOworCisgICAgICAgIH0KKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdGFuZGFyZENvbnRleHRTRi5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRDb250ZXh0U0YuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODA5ZjRlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRDb250ZXh0U0YuamF2YQpAQCAtMCwwICsxLDM1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUGlwZWxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQXBwbGljYXRpb25QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5Qcm94eURpckNvbnRleHQ7CisKKy8qKgorICogU3RvcmUgc2VydmVyLnhtbCBDb250ZXh0IGVsZW1lbnQgd2l0aCBhbGwgY2hpbGRzCisgKiA8dWw+CisgKiA8bGk+U3RvcmUgYWxsIGNvbnRleHQgYXQgc2VydmVyLnhtbDwvbGk+CisgKiA8bGk+U3RvcmUgZXhpc3RpbmcgYXBwLnhtbCBjb250ZXh0IGEgY29uZi9lbmdpbmVuYW1lL2hvc3RuYW1lL2FwcC54bWw8L2xpPgorICogPGxpPlN0b3JlIHdpdGggYmFja3VwPC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkQ29udGV4dFNGIGV4dGVuZHMgU3RvcmVGYWN0b3J5QmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3RhbmRhcmRDb250ZXh0U0YuY2xhc3MpOworCisgICAgLyoKKyAgICAgKiBTdG9yZSBhIENvbnRleHQgYXMgU2VwYXJhdGUgZmlsZSBhcyBjb25maWdGaWxlIHZhbHVlIGZyb20gY29udGV4dCBleGlzdHMuCisgICAgICogZmlsZW5hbWUgY2FuIGJlIHJlbGF0aXZlIHRvIGNhdGFsaW5hLmJhc2UuCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5JU3RvcmVGYWN0b3J5I3N0b3JlKGphdmEuaW8uUHJpbnRXcml0ZXIsCisgICAgICogICAgICBpbnQsIGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmUoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFDb250ZXh0KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGFDb250ZXh0IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KSB7CisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgYUNvbnRleHQuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBpZiAoZGVzYy5pc1N0b3JlU2VwYXJhdGUoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjb25maWdGaWxlID0gKChTdGFuZGFyZENvbnRleHQpIGFDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbmZpZ0ZpbGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLmlzRXh0ZXJuYWxBbGxvd2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLmlzQmFja3VwKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVXaXRoQmFja3VwKChTdGFuZGFyZENvbnRleHQpIGFDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUNvbnRleHRTZXBhcmF0ZShhV3JpdGVyLCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RhbmRhcmRDb250ZXh0KSBhQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuc3RvcmUoYVdyaXRlciwgaW5kZW50LCBhQ29udGV4dCk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSBhIENvbnRleHQgd2l0aG91dCBiYWNrdXAgYWRkIHNlcGFyYXRlIGZpbGUgb3Igd2hlbiBjb25maWdGaWxlID0KKyAgICAgKiBudWxsIGEgYVdyaXRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVdyaXRlcgorICAgICAqIEBwYXJhbSBpbmRlbnQKKyAgICAgKiBAcGFyYW0gYUNvbnRleHQKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0b3JlQ29udGV4dFNlcGFyYXRlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsCisgICAgICAgICAgICBTdGFuZGFyZENvbnRleHQgYUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY29uZmlnRmlsZSA9IGFDb250ZXh0LmdldENvbmZpZ0ZpbGUoKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgaWYgKGNvbmZpZ0ZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgRmlsZSBjb25maWcgPSBuZXcgRmlsZShjb25maWdGaWxlKTsKKyAgICAgICAgICAgIGlmICghY29uZmlnLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZyA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiU3RvcmUgQ29udGV4dCAiICsgYUNvbnRleHQuZ2V0UGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICArICIgc2VwYXJhdGUgYXQgZmlsZSAiICsgY29uZmlnKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShjb25maWcpLCBnZXRSZWdpc3RyeSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmNvZGluZygpKSk7CisgICAgICAgICAgICAgICAgc3RvcmVYTUxIZWFkKHdyaXRlcik7CisgICAgICAgICAgICAgICAgc3VwZXIuc3RvcmUod3JpdGVyLCAtMiwgYUNvbnRleHQpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLnN0b3JlKGFXcml0ZXIsIGluZGVudCwgYUNvbnRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIENvbnRleHQgd2l0aCBhIEJhY2t1cAorICAgICAqIAorICAgICAqIEBwYXJhbSBhQ29udGV4dAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3RvcmVXaXRoQmFja3VwKFN0YW5kYXJkQ29udGV4dCBhQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0b3JlRmlsZU1vdmVyIG1vdmVyID0gZ2V0Q29uZmlnRmlsZVdyaXRlcigoQ29udGV4dCkgYUNvbnRleHQpOworICAgICAgICBpZiAobW92ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oIlN0b3JlIENvbnRleHQgIiArIGFDb250ZXh0LmdldFBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNlcGFyYXRlIHdpdGggYmFja3VwIChhdCBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbW92ZXIuZ2V0Q29uZmlnU2F2ZSgpICsgIiApIik7CisgICAgICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBtb3Zlci5nZXRXcml0ZXIoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RvcmVYTUxIZWFkKHdyaXRlcik7CisgICAgICAgICAgICAgICAgc3VwZXIuc3RvcmUod3JpdGVyLCAtMiwgYUNvbnRleHQpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAvLyBGbHVzaCBhbmQgY2xvc2UgdGhlIG91dHB1dCBmaWxlCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAoZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbW92ZXIubW92ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGV4cGxpY2l0IHdyaXRlciBmb3IgY29udGV4dCAoY29udGV4dC5nZXRDb25maWdGaWxlKCkpLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogQHJldHVybiBUaGUgZmlsZSBtb3ZlcgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RvcmVGaWxlTW92ZXIgZ2V0Q29uZmlnRmlsZVdyaXRlcihDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY29uZmlnRmlsZSA9IGNvbnRleHQuZ2V0Q29uZmlnRmlsZSgpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBudWxsOworICAgICAgICBTdG9yZUZpbGVNb3ZlciBtb3ZlciA9IG51bGw7CisgICAgICAgIGlmIChjb25maWdGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpbGUgY29uZmlnID0gbmV3IEZpbGUoY29uZmlnRmlsZSk7CisgICAgICAgICAgICBpZiAoIWNvbmZpZy5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgICAgICBjb25maWcgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gT3BlbiBhbiBvdXRwdXQgd3JpdGVyIGZvciB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZQorICAgICAgICAgICAgbW92ZXIgPSBuZXcgU3RvcmVGaWxlTW92ZXIoIiIsIGNvbmZpZy5nZXRDYW5vbmljYWxQYXRoKCksCisgICAgICAgICAgICAgICAgICAgIGdldFJlZ2lzdHJ5KCkuZ2V0RW5jb2RpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1vdmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzcGVjaWZpZWQgSG9zdCBwcm9wZXJ0aWVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhV3JpdGVyCisgICAgICogICAgICAgICAgICBQcmludFdyaXRlciB0byB3aGljaCB3ZSBhcmUgc3RvcmluZworICAgICAqIEBwYXJhbSBpbmRlbnQKKyAgICAgKiAgICAgICAgICAgIE51bWJlciBvZiBzcGFjZXMgdG8gaW5kZW50IHRoaXMgZWxlbWVudAorICAgICAqIEBwYXJhbSBhQ29udGV4dAorICAgICAqICAgICAgICAgICAgQ29udGV4dCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBiZWluZyBzdG9yZWQKKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3JlQ2hpbGRzKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBhQ29udGV4dCwKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gcGFyZW50RGVzYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhQ29udGV4dCBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCkgeworICAgICAgICAgICAgU3RhbmRhcmRDb250ZXh0IGNvbnRleHQgPSAoU3RhbmRhcmRDb250ZXh0KSBhQ29udGV4dDsKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8TGlzdGVuZXI+IGVsZW1lbnRzCisgICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgICAgIExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyc1tdID0gY29udGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgICAgICBzdG9yZUVsZW1lbnRBcnJheShhV3JpdGVyLCBpbmRlbnQsIGxpc3RlbmVycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPFZhbHZlPiBlbGVtZW50cworICAgICAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBQaXBlbGluZSkgeworICAgICAgICAgICAgICAgIFZhbHZlIHZhbHZlc1tdID0gKChQaXBlbGluZSkgY29udGV4dCkuZ2V0VmFsdmVzKCk7CisgICAgICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCB2YWx2ZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPExvYWRlcj4gZWxlbWVudHMKKyAgICAgICAgICAgIExvYWRlciBsb2FkZXIgPSBjb250ZXh0LmdldExvYWRlcigpOworICAgICAgICAgICAgc3RvcmVFbGVtZW50KGFXcml0ZXIsIGluZGVudCwgbG9hZGVyKTsKKworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxNYW5hZ2VyPiBlbGVtZW50cworICAgICAgICAgICAgTWFuYWdlciBtYW5hZ2VyID0gY29udGV4dC5nZXRNYW5hZ2VyKCk7CisgICAgICAgICAgICBzdG9yZUVsZW1lbnQoYVdyaXRlciwgaW5kZW50LCBtYW5hZ2VyKTsKKworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxSZWFsbT4gZWxlbWVudAorICAgICAgICAgICAgUmVhbG0gcmVhbG0gPSBjb250ZXh0LmdldFJlYWxtKCk7CisgICAgICAgICAgICBpZiAocmVhbG0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFJlYWxtIHBhcmVudFJlYWxtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAvLyBAVE9ETyBpcyB0aGlzIGNhc2UgcG9zc2libGU/CisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnRSZWFsbSA9IGNvbnRleHQuZ2V0UGFyZW50KCkuZ2V0UmVhbG0oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlYWxtICE9IHBhcmVudFJlYWxtKSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudChhV3JpdGVyLCBpbmRlbnQsIHJlYWxtKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCByZXNvdXJjZXMKKyAgICAgICAgICAgIERpckNvbnRleHQgcmVzb3VyY2VzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZXMgaW5zdGFuY2VvZiBQcm94eURpckNvbnRleHQpCisgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0gKChQcm94eURpckNvbnRleHQpIHJlc291cmNlcykuZ2V0RGlyQ29udGV4dCgpOworICAgICAgICAgICAgc3RvcmVFbGVtZW50KGFXcml0ZXIsIGluZGVudCwgcmVzb3VyY2VzKTsKKworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxJbnN0YW5jZUxpc3RlbmVyPiBlbGVtZW50cworICAgICAgICAgICAgU3RyaW5nIGlMaXN0ZW5lcnNbXSA9IGNvbnRleHQuZmluZEluc3RhbmNlTGlzdGVuZXJzKCk7CisgICAgICAgICAgICBnZXRTdG9yZUFwcGVuZGVyKCkucHJpbnRUYWdBcnJheShhV3JpdGVyLCAiSW5zdGFuY2VMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgIGluZGVudCArIDIsIGlMaXN0ZW5lcnMpOworCisgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPFdyYXBwZXJMaXN0ZW5lcj4gZWxlbWVudHMKKyAgICAgICAgICAgIFN0cmluZyB3TGlmZWN5Y2xlc1tdID0gY29udGV4dC5maW5kV3JhcHBlckxpZmVjeWNsZXMoKTsKKyAgICAgICAgICAgIGdldFN0b3JlQXBwZW5kZXIoKS5wcmludFRhZ0FycmF5KGFXcml0ZXIsICJXcmFwcGVyTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKyAyLCB3TGlmZWN5Y2xlcyk7CisgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPFdyYXBwZXJMaWZlY3ljbGU+IGVsZW1lbnRzCisgICAgICAgICAgICBTdHJpbmcgd0xpc3RlbmVyc1tdID0gY29udGV4dC5maW5kV3JhcHBlckxpc3RlbmVycygpOworICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50VGFnQXJyYXkoYVdyaXRlciwgIldyYXBwZXJMaWZlY3ljbGUiLAorICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKyAyLCB3TGlzdGVuZXJzKTsKKworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxQYXJhbWV0ZXI+IGVsZW1lbnRzCisgICAgICAgICAgICBBcHBsaWNhdGlvblBhcmFtZXRlcltdIGFwcFBhcmFtcyA9IGNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgLmZpbmRBcHBsaWNhdGlvblBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIHN0b3JlRWxlbWVudEFycmF5KGFXcml0ZXIsIGluZGVudCwgYXBwUGFyYW1zKTsKKworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIG5hbWluZyByZXNvdXJjZXMgZWxlbWVudHMgKEVKQixSZXNvdXJjZSwuLi4pCisgICAgICAgICAgICBOYW1pbmdSZXNvdXJjZXMgbnJlc291cmNlcyA9IGNvbnRleHQuZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgICAgICBzdG9yZUVsZW1lbnQoYVdyaXRlciwgaW5kZW50LCBucmVzb3VyY2VzKTsKKworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIHdhdGNoZWQgcmVzb3VyY2VzIDxXYXRjaGVkUmVzb3VyY2U+CisgICAgICAgICAgICBTdHJpbmdbXSB3cmVzb3VyY2VzID0gY29udGV4dC5maW5kV2F0Y2hlZFJlc291cmNlcygpOworICAgICAgICAgICAgd3Jlc291cmNlcyA9IGZpbHRlcldhdGNoZWRSZXNvdXJjZXMoY29udGV4dCwgd3Jlc291cmNlcyk7CisgICAgICAgICAgICBnZXRTdG9yZUFwcGVuZGVyKCkucHJpbnRUYWdBcnJheShhV3JpdGVyLCAiV2F0Y2hlZFJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ICsgMiwgd3Jlc291cmNlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlICJjb25maWd1cmF0aW9uIHJvb3QiIGRpcmVjdG9yeSBmb3IKKyAgICAgKiBvdXIgYXNzb2NpYXRlZCBIb3N0LgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGNvbmZpZ0Jhc2UoQ29udGV4dCBjb250ZXh0KSB7CisKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksICJjb25mIik7CisgICAgICAgIENvbnRhaW5lciBob3N0ID0gKEhvc3QpIGNvbnRleHQuZ2V0UGFyZW50KCk7CisKKyAgICAgICAgaWYgKChob3N0ICE9IG51bGwpICYmIChob3N0IGluc3RhbmNlb2YgSG9zdCkpIHsKKyAgICAgICAgICAgIENvbnRhaW5lciBlbmdpbmUgPSBob3N0LmdldFBhcmVudCgpOworICAgICAgICAgICAgaWYgKChlbmdpbmUgIT0gbnVsbCkgJiYgKGVuZ2luZSBpbnN0YW5jZW9mIEVuZ2luZSkpIHsKKyAgICAgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoZmlsZSwgZW5naW5lLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoZmlsZSwgaG9zdC5nZXROYW1lKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaWxlID0gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoZmlsZSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmaWx0ZXIgb3V0IHRoZSBkZWZhdWx0IHdhdGNoZWQgcmVzb3VyY2VzCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gd3Jlc291cmNlcworICAgICAqIEByZXR1cm4gVGhlIHdhdGNoZWQgcmVzb3VyY2VzCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIFRPRE8gcmVsYXRpdmUgd2F0Y2hlZHJlc291cmNlCisgICAgICogVE9ETyBhYnNvbHV0ZSBoYW5kbGluZyBjb25maWdGaWxlCisgICAgICogVE9ETyBGaWxlbmFtZSBjYXNlIGhhbmRsaW5nIGZvciBXaW5kb3dzPworICAgICAqIFRPRE8gZGlnZXN0ZXIgdmFyaWFibGUgc3Vic2l0dXRpb24gJGNhdGFsaW5hLmJhc2UsICRjYXRhbGluYS5ob21lCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGZpbHRlcldhdGNoZWRSZXNvdXJjZXMoU3RhbmRhcmRDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBTdHJpbmdbXSB3cmVzb3VyY2VzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIGNvbmZpZ0Jhc2UgPSBjb25maWdCYXNlKGNvbnRleHQpOworICAgICAgICBTdHJpbmcgY29uZkNvbnRleHQgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwKKyAgICAgICAgICAgICAgICAiY29uZi9jb250ZXh0LnhtbCIpLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgU3RyaW5nIGNvbmZIb3N0RGVmYXVsdCA9IG5ldyBGaWxlKGNvbmZpZ0Jhc2UsICJjb250ZXh0LnhtbC5kZWZhdWx0IikKKyAgICAgICAgICAgICAgICAuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICBTdHJpbmcgY29uZmlnRmlsZSA9IGNvbnRleHQuZ2V0Q29uZmlnRmlsZSgpOworICAgICAgICBTdHJpbmcgd2VieG1sID0gIldFQi1JTkYvd2ViLnhtbCIgOworICAgICAgICAKKyAgICAgICAgTGlzdCByZXNvdXJjZSA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3cmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CisKKyAgICAgICAgICAgIGlmICh3cmVzb3VyY2VzW2ldLmVxdWFscyhjb25mQ29udGV4dCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAod3Jlc291cmNlc1tpXS5lcXVhbHMoY29uZkhvc3REZWZhdWx0KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICh3cmVzb3VyY2VzW2ldLmVxdWFscyhjb25maWdGaWxlKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICh3cmVzb3VyY2VzW2ldLmVxdWFscyh3ZWJ4bWwpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcmVzb3VyY2UuYWRkKHdyZXNvdXJjZXNbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoU3RyaW5nW10pIHJlc291cmNlLnRvQXJyYXkobmV3IFN0cmluZ1tyZXNvdXJjZS5zaXplKCldKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkRW5naW5lU0YuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkRW5naW5lU0YuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDNlYzU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRFbmdpbmVTRi5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlBpcGVsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRFbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKy8qKgorICogU3RvcmUgc2VydmVyLnhtbCBFbGVtZW50IEVuZ2luZQorICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFuZGFyZEVuZ2luZVNGIGV4dGVuZHMgU3RvcmVGYWN0b3J5QmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3RhbmRhcmRFbmdpbmVTRi5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgc3BlY2lmaWVkIEVuZ2luZSBwcm9wZXJ0aWVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhV3JpdGVyCisgICAgICogICAgICAgICAgICBQcmludFdyaXRlciB0byB3aGljaCB3ZSBhcmUgc3RvcmluZworICAgICAqIEBwYXJhbSBpbmRlbnQKKyAgICAgKiAgICAgICAgICAgIE51bWJlciBvZiBzcGFjZXMgdG8gaW5kZW50IHRoaXMgZWxlbWVudAorICAgICAqIEBwYXJhbSBhRW5naW5lCisgICAgICogICAgICAgICAgICBPYmplY3Qgd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgc3RvcmVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZUNoaWxkcyhQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LCBPYmplY3QgYUVuZ2luZSwKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gcGFyZW50RGVzYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhRW5naW5lIGluc3RhbmNlb2YgU3RhbmRhcmRFbmdpbmUpIHsKKyAgICAgICAgICAgIFN0YW5kYXJkRW5naW5lIGVuZ2luZSA9IChTdGFuZGFyZEVuZ2luZSkgYUVuZ2luZTsKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8TGlzdGVuZXI+IGVsZW1lbnRzCisgICAgICAgICAgICBpZiAoZW5naW5lIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXJzW10gPSAoKExpZmVjeWNsZSkgZW5naW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgICAgICBzdG9yZUVsZW1lbnRBcnJheShhV3JpdGVyLCBpbmRlbnQsIGxpc3RlbmVycyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8UmVhbG0+IGVsZW1lbnQKKyAgICAgICAgICAgIFJlYWxtIHJlYWxtID0gZW5naW5lLmdldFJlYWxtKCk7CisgICAgICAgICAgICBpZiAocmVhbG0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFJlYWxtIHBhcmVudFJlYWxtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIGlzIHRoaXMgY2FzZSBwb3NzaWJsZT8gKHNlZSBpdCBhIG9sZCBTZXJ2ZXIgNS4wIGltcGwpCisgICAgICAgICAgICAgICAgaWYgKGVuZ2luZS5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudFJlYWxtID0gZW5naW5lLmdldFBhcmVudCgpLmdldFJlYWxtKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZWFsbSAhPSBwYXJlbnRSZWFsbSkgeworICAgICAgICAgICAgICAgICAgICBzdG9yZUVsZW1lbnQoYVdyaXRlciwgaW5kZW50LCByZWFsbSk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8VmFsdmU+IGVsZW1lbnRzCisgICAgICAgICAgICBpZiAoZW5naW5lIGluc3RhbmNlb2YgUGlwZWxpbmUpIHsKKyAgICAgICAgICAgICAgICBWYWx2ZSB2YWx2ZXNbXSA9ICgoUGlwZWxpbmUpIGVuZ2luZSkuZ2V0VmFsdmVzKCk7CisgICAgICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCB2YWx2ZXMpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBzdG9yZSBhbGwgPEhvc3Q+IGVsZW1lbnRzCisgICAgICAgICAgICBDb250YWluZXIgY2hpbGRyZW5bXSA9IGVuZ2luZS5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgICAgIHN0b3JlRWxlbWVudEFycmF5KGFXcml0ZXIsIGluZGVudCwgY2hpbGRyZW4pOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkSG9zdFNGLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdGFuZGFyZEhvc3RTRi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YjczMjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdGFuZGFyZEhvc3RTRi5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5QaXBlbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLyoqCisgKiBTdG9yZSBzZXJ2ZXIueG1sIEVsZW1lbnQgSG9zdAorICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFuZGFyZEhvc3RTRiBleHRlbmRzIFN0b3JlRmFjdG9yeUJhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFN0YW5kYXJkSG9zdFNGLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzcGVjaWZpZWQgSG9zdCBwcm9wZXJ0aWVzIGFuZCBjaGlsZHMKKyAgICAgKiAoTGlzdGVuZXIsQWxpYXMsUmVhbG0sVmFsdmUsQ2x1c3RlciwgQ29udGV4dCkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVdyaXRlcgorICAgICAqICAgICAgICAgICAgUHJpbnRXcml0ZXIgdG8gd2hpY2ggd2UgYXJlIHN0b3JpbmcKKyAgICAgKiBAcGFyYW0gaW5kZW50CisgICAgICogICAgICAgICAgICBOdW1iZXIgb2Ygc3BhY2VzIHRvIGluZGVudCB0aGlzIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gYUhvc3QKKyAgICAgKiAgICAgICAgICAgIEhvc3Qgd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgc3RvcmVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZUNoaWxkcyhQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LCBPYmplY3QgYUhvc3QsCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIHBhcmVudERlc2MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoYUhvc3QgaW5zdGFuY2VvZiBTdGFuZGFyZEhvc3QpIHsKKyAgICAgICAgICAgIFN0YW5kYXJkSG9zdCBob3N0ID0gKFN0YW5kYXJkSG9zdCkgYUhvc3Q7CisgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPExpc3RlbmVyPiBlbGVtZW50cworICAgICAgICAgICAgaWYgKGhvc3QgaW5zdGFuY2VvZiBMaWZlY3ljbGUpIHsKKyAgICAgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcnNbXSA9ICgoTGlmZWN5Y2xlKSBob3N0KQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgICAgICBzdG9yZUVsZW1lbnRBcnJheShhV3JpdGVyLCBpbmRlbnQsIGxpc3RlbmVycyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8QWxpYXM+IGVsZW1lbnRzCisgICAgICAgICAgICBTdHJpbmcgYWxpYXNlc1tdID0gaG9zdC5maW5kQWxpYXNlcygpOworICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50VGFnQXJyYXkoYVdyaXRlciwgIkFsaWFzIiwgaW5kZW50ICsgMiwKKyAgICAgICAgICAgICAgICAgICAgYWxpYXNlcyk7CisKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8UmVhbG0+IGVsZW1lbnQKKyAgICAgICAgICAgIFJlYWxtIHJlYWxtID0gaG9zdC5nZXRSZWFsbSgpOworICAgICAgICAgICAgaWYgKHJlYWxtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBSZWFsbSBwYXJlbnRSZWFsbSA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKGhvc3QuZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnRSZWFsbSA9IGhvc3QuZ2V0UGFyZW50KCkuZ2V0UmVhbG0oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlYWxtICE9IHBhcmVudFJlYWxtKSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudChhV3JpdGVyLCBpbmRlbnQsIHJlYWxtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8VmFsdmU+IGVsZW1lbnRzCisgICAgICAgICAgICBpZiAoaG9zdCBpbnN0YW5jZW9mIFBpcGVsaW5lKSB7CisgICAgICAgICAgICAgICAgVmFsdmUgdmFsdmVzW10gPSAoKFBpcGVsaW5lKSBob3N0KS5nZXRWYWx2ZXMoKTsKKyAgICAgICAgICAgICAgICBpZih2YWx2ZXMgIT0gbnVsbCAmJiB2YWx2ZXMubGVuZ3RoID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgTGlzdCBob3N0VmFsdmVzID0gbmV3IEFycmF5TGlzdCgpIDsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMCA7IGkgPCB2YWx2ZXMubGVuZ3RoIDsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoISggdmFsdmVzW2ldIGluc3RhbmNlb2YgQ2x1c3RlclZhbHZlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0VmFsdmVzLmFkZCh2YWx2ZXNbaV0pOworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzdG9yZUVsZW1lbnRBcnJheShhV3JpdGVyLCBpbmRlbnQsIGhvc3RWYWx2ZXMudG9BcnJheSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHN0b3JlIGFsbCA8Q2x1c3Rlcj4gZWxlbWVudHMKKyAgICAgICAgICAgIENsdXN0ZXIgY2x1c3RlciA9IGhvc3QuZ2V0Q2x1c3RlcigpOworICAgICAgICAgICAgaWYgKGNsdXN0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudChhV3JpdGVyLCBpbmRlbnQsIGNsdXN0ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzdG9yZSBhbGwgPENvbnRleHQ+IGVsZW1lbnRzCisgICAgICAgICAgICBDb250YWluZXIgY2hpbGRyZW5bXSA9IGhvc3QuZmluZENoaWxkcmVuKCk7CisgICAgICAgICAgICBzdG9yZUVsZW1lbnRBcnJheShhV3JpdGVyLCBpbmRlbnQsIGNoaWxkcmVuKTsKKyAgICAgICAgfQorICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkU2VydmVyU0YuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkU2VydmVyU0YuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDRmYTY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRTZXJ2ZXJTRi5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKy8qKgorICogU3RvcmUgc2VydmVyLnhtbCBTZXJ2ZXIgZWxlbWVudCBhbmQgY2hpbGRzICgKKyAqIExpc3RlbmVyLEdsb2JhbE5hbWluZ1Jlc291cmNlLFNlcnZpY2UpCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkU2VydmVyU0YgZXh0ZW5kcyBTdG9yZUZhY3RvcnlCYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTdGFuZGFyZFNlcnZlclNGLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzcGVjaWZpZWQgU2VydmVyIHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIGFTZXJ2ZXIKKyAgICAgKiAgICAgICAgICAgIE9iamVjdCB0byBiZSBzdG9yZWQKKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JU3RvcmVGYWN0b3J5I3N0b3JlKGphdmEuaW8uUHJpbnRXcml0ZXIsCisgICAgICogICAgICBpbnQsIGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmUoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFTZXJ2ZXIpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RvcmVYTUxIZWFkKGFXcml0ZXIpOworICAgICAgICBzdXBlci5zdG9yZShhV3JpdGVyLCBpbmRlbnQsIGFTZXJ2ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlIENoaWxkcyBmcm9tIHRoaXMgU3RhbmRhcmRTZXJ2ZXIgZGVzY3JpdGlvbgorICAgICAqIAorICAgICAqIEBwYXJhbSBhV3JpdGVyCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqIEBwYXJhbSBhT2JqZWN0CisgICAgICogQHBhcmFtIHBhcmVudERlc2MKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3JlQ2hpbGRzKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBhT2JqZWN0LAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBwYXJlbnREZXNjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGFPYmplY3QgaW5zdGFuY2VvZiBTdGFuZGFyZFNlcnZlcikgeworICAgICAgICAgICAgU3RhbmRhcmRTZXJ2ZXIgc2VydmVyID0gKFN0YW5kYXJkU2VydmVyKSBhT2JqZWN0OworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxMaXN0ZW5lcj4gZWxlbWVudHMKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpIHsKKyAgICAgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcnNbXSA9ICgoTGlmZWN5Y2xlKSBzZXJ2ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudEFycmF5KGFXcml0ZXIsIGluZGVudCwgbGlzdGVuZXJzKTsKKyAgICAgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGxpc3RlbmVyID09IG51bGwgJiYgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXSBpbnN0YW5jZW9mIFNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBlbGVtZW50RGVzYyA9IGdldFJlZ2lzdHJ5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRTZXJ2ZXIuY2xhc3MuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5bU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXJdIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50RGVzYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RGVzYy5nZXRTdG9yZUZhY3RvcnkoKS5zdG9yZShhV3JpdGVyLCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8R2xvYmFsTmFtaW5nUmVzb3VyY2VzPiBlbGVtZW50CisgICAgICAgICAgICBOYW1pbmdSZXNvdXJjZXMgZ2xvYmFsTmFtaW5nUmVzb3VyY2VzID0gc2VydmVyCisgICAgICAgICAgICAgICAgICAgIC5nZXRHbG9iYWxOYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZWxlbWVudERlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTmFtaW5nUmVzb3VyY2VzLmNsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5bR2xvYmFsTmFtaW5nUmVzb3VyY2VzXSIpOworICAgICAgICAgICAgaWYgKGVsZW1lbnREZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlbGVtZW50RGVzYy5nZXRTdG9yZUZhY3RvcnkoKS5zdG9yZShhV3JpdGVyLCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxOYW1pbmdSZXNvdXJjZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxTZXJ2aWNlPiBlbGVtZW50cworICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlc1tdID0gc2VydmVyLmZpbmRTZXJ2aWNlcygpOworICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCBzZXJ2aWNlcyk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkU2VydmljZVNGLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdGFuZGFyZFNlcnZpY2VTRi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMjllYzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdGFuZGFyZFNlcnZpY2VTRi5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLyoqCisgKiBTdG9yZSBzZXJ2ZXIueG1sIEVsZW1lbnQgU2VydmljZSBhbmQgYWxsIGNoaWxkcyAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2ggKHBlcm9AYXBhY2hlLm9yZykKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkU2VydmljZVNGIGV4dGVuZHMgU3RvcmVGYWN0b3J5QmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3RhbmRhcmRTZXJ2aWNlU0YuY2xhc3MpOworCisgICAgLyoqCisgICAgICogU3RvcmUgQ2hpbGRzIGZyb20gdGhpcyBTdGFuZGFyZFNlcnZpY2UgZGVzY3JpcHRpb24KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVdyaXRlcgorICAgICAqIEBwYXJhbSBpbmRlbnQKKyAgICAgKiBAcGFyYW0gYVNlcnZpY2UKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3JlQ2hpbGRzKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBhU2VydmljZSwKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gcGFyZW50RGVzYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhU2VydmljZSBpbnN0YW5jZW9mIFN0YW5kYXJkU2VydmljZSkgeworICAgICAgICAgICAgU3RhbmRhcmRTZXJ2aWNlIHNlcnZpY2UgPSAoU3RhbmRhcmRTZXJ2aWNlKSBhU2VydmljZTsKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8TGlzdGVuZXI+IGVsZW1lbnRzCisgICAgICAgICAgICBpZiAoc2VydmljZSBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgICAgIExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyc1tdID0gKChMaWZlY3ljbGUpIHNlcnZpY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudEFycmF5KGFXcml0ZXIsIGluZGVudCwgbGlzdGVuZXJzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29ubmVjdG9yIGNvbm5lY3RvcnNbXSA9IHNlcnZpY2UuZmluZENvbm5lY3RvcnMoKTsKKyAgICAgICAgICAgIHN0b3JlRWxlbWVudEFycmF5KGFXcml0ZXIsIGluZGVudCwgY29ubmVjdG9ycyk7CisKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8RW5naW5lPiBlbGVtZW50IChvciBvdGhlciBhcHByb3ByaWF0ZSBjb250YWluZXIpCisgICAgICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gc2VydmljZS5nZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZWxlbWVudERlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudERlc2MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBJU3RvcmVGYWN0b3J5IGZhY3RvcnkgPSBlbGVtZW50RGVzYy5nZXRTdG9yZUZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS5zdG9yZShhV3JpdGVyLCBpbmRlbnQsIGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUFwcGVuZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUFwcGVuZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwMmEyZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlQXBwZW5kZXIuamF2YQpAQCAtMCwwICsxLDM4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuYmVhbnMuSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LlJlc291cmNlQmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLkludHJvc3BlY3Rpb25VdGlsczsKKworLyoqCisgKiBTdG9yZUFwcGVuZHMgZ2VuZXJhdGUgcmVhbGx5IHRoZSB4bWwgdGFnIGVsZW1lbnRzCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqICAKKyAqLworcHVibGljIGNsYXNzIFN0b3JlQXBwZW5kZXIgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTdG9yZUFwcGVuZGVyLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgY2xhc3NlcyB0aGF0IHJlcHJlc2VudCBwZXJzaXN0YWJsZSBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENsYXNzIHBlcnNpc3RhYmxlc1tdID0geyBTdHJpbmcuY2xhc3MsIEludGVnZXIuY2xhc3MsCisgICAgICAgICAgICBJbnRlZ2VyLlRZUEUsIEJvb2xlYW4uY2xhc3MsIEJvb2xlYW4uVFlQRSwgQnl0ZS5jbGFzcywgQnl0ZS5UWVBFLAorICAgICAgICAgICAgQ2hhcmFjdGVyLmNsYXNzLCBDaGFyYWN0ZXIuVFlQRSwgRG91YmxlLmNsYXNzLCBEb3VibGUuVFlQRSwKKyAgICAgICAgICAgIEZsb2F0LmNsYXNzLCBGbG9hdC5UWVBFLCBMb25nLmNsYXNzLCBMb25nLlRZUEUsIFNob3J0LmNsYXNzLAorICAgICAgICAgICAgU2hvcnQuVFlQRSwgfTsKKworICAgIC8qKgorICAgICAqIHByaW50IHRoZSBjbG9zaW5nIHRhZworICAgICAqIAorICAgICAqIEBwYXJhbSBhV3JpdGVyCisgICAgICogQHBhcmFtIGFEZXNjCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludENsb3NlVGFnKFByaW50V3JpdGVyIGFXcml0ZXIsIFN0b3JlRGVzY3JpcHRpb24gYURlc2MpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYVdyaXRlci5wcmludCgiPC8iKTsKKyAgICAgICAgYVdyaXRlci5wcmludChhRGVzYy5nZXRUYWcoKSk7CisgICAgICAgIGFXcml0ZXIucHJpbnRsbigiPiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHByaW50IG9ubHkgdGhlIG9wZW4gdGFnIHdpdGggYWxsIGF0dHJpYnV0ZXMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVdyaXRlcgorICAgICAqIEBwYXJhbSBpbmRlbnQKKyAgICAgKiBAcGFyYW0gYmVhbgorICAgICAqIEBwYXJhbSBhRGVzYworICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRPcGVuVGFnKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBiZWFuLAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBhRGVzYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFXcml0ZXIucHJpbnQoIjwiKTsKKyAgICAgICAgYVdyaXRlci5wcmludChhRGVzYy5nZXRUYWcoKSk7CisgICAgICAgIGlmIChhRGVzYy5pc0F0dHJpYnV0ZXMoKSAmJiBiZWFuICE9IG51bGwpCisgICAgICAgICAgICBwcmludEF0dHJpYnV0ZXMoYVdyaXRlciwgaW5kZW50LCBiZWFuLCBhRGVzYyk7CisgICAgICAgIGFXcml0ZXIucHJpbnRsbigiPiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IHRhZyB3aXRoIGFsbCBhdHRyaWJ1dGVzCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiBAcGFyYW0gaW5kZW50CisgICAgICogQHBhcmFtIGJlYW4KKyAgICAgKiBAcGFyYW0gYURlc2MKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50VGFnKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBiZWFuLAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBhRGVzYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFXcml0ZXIucHJpbnQoIjwiKTsKKyAgICAgICAgYVdyaXRlci5wcmludChhRGVzYy5nZXRUYWcoKSk7CisgICAgICAgIGlmIChhRGVzYy5pc0F0dHJpYnV0ZXMoKSAmJiBiZWFuICE9IG51bGwpCisgICAgICAgICAgICBwcmludEF0dHJpYnV0ZXMoYVdyaXRlciwgaW5kZW50LCBiZWFuLCBhRGVzYyk7CisgICAgICAgIGFXcml0ZXIucHJpbnRsbigiLz4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwcmludCB0aGUgdmFsdWUgZnJvbSB0YWcgYXMgY29udGVudAorICAgICAqIAorICAgICAqIEBwYXJhbSBhV3JpdGVyCisgICAgICogQHBhcmFtIHRhZworICAgICAqIEBwYXJhbSBjb250ZW50CisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludFRhZ0NvbnRlbnQoUHJpbnRXcml0ZXIgYVdyaXRlciwgU3RyaW5nIHRhZywgU3RyaW5nIGNvbnRlbnQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYVdyaXRlci5wcmludCgiPCIpOworICAgICAgICBhV3JpdGVyLnByaW50KHRhZyk7CisgICAgICAgIGFXcml0ZXIucHJpbnQoIj4iKTsKKyAgICAgICAgYVdyaXRlci5wcmludChjb252ZXJ0U3RyKGNvbnRlbnQpKTsKKyAgICAgICAgYVdyaXRlci5wcmludCgiPC8iKTsKKyAgICAgICAgYVdyaXRlci5wcmludCh0YWcpOworICAgICAgICBhV3JpdGVyLnByaW50bG4oIj4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwcmludCBhbiBhcnJheSBvZiB2YWx1ZXMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVdyaXRlcgorICAgICAqIEBwYXJhbSB0YWcKKyAgICAgKiBAcGFyYW0gaW5kZW50CisgICAgICogQHBhcmFtIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRUYWdWYWx1ZUFycmF5KFByaW50V3JpdGVyIGFXcml0ZXIsIFN0cmluZyB0YWcsIGludCBpbmRlbnQsCisgICAgICAgICAgICBTdHJpbmdbXSBlbGVtZW50cykgeworICAgICAgICBpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBwcmludEluZGVudChhV3JpdGVyLCBpbmRlbnQgKyAyKTsKKyAgICAgICAgICAgIGFXcml0ZXIucHJpbnQoIjwiKTsKKyAgICAgICAgICAgIGFXcml0ZXIucHJpbnQodGFnKTsKKyAgICAgICAgICAgIGFXcml0ZXIucHJpbnQoIj4iKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwcmludEluZGVudChhV3JpdGVyLCBpbmRlbnQgKyA0KTsKKyAgICAgICAgICAgICAgICBhV3JpdGVyLnByaW50KGVsZW1lbnRzW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBlbGVtZW50cy5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIGFXcml0ZXIucHJpbnRsbigiLCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRJbmRlbnQoYVdyaXRlciwgaW5kZW50ICsgMik7CisgICAgICAgICAgICBhV3JpdGVyLnByaW50KCI8LyIpOworICAgICAgICAgICAgYVdyaXRlci5wcmludCh0YWcpOworICAgICAgICAgICAgYVdyaXRlci5wcmludGxuKCI+Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwcmludCBhIGFycmF5IG9mIGVsZW1lbnRzCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiBAcGFyYW0gdGFnCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqIEBwYXJhbSBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50VGFnQXJyYXkoUHJpbnRXcml0ZXIgYVdyaXRlciwgU3RyaW5nIHRhZywgaW50IGluZGVudCwKKyAgICAgICAgICAgIFN0cmluZ1tdIGVsZW1lbnRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwcmludEluZGVudChhV3JpdGVyLCBpbmRlbnQpOworICAgICAgICAgICAgICAgIHByaW50VGFnQ29udGVudChhV3JpdGVyLCB0YWcsIGVsZW1lbnRzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IHNvbWUgc3BhY2VzCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiBAcGFyYW0gaW5kZW50CisgICAgICogICAgICAgICAgICBudW1iZXIgb2Ygc3BhY2VzCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRJbmRlbnQoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSB7CisgICAgICAgICAgICBhV3JpdGVyLnByaW50KCcgJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgcmVsZXZhbnQgYXR0cmlidXRlcyBvZiB0aGUgc3BlY2lmaWVkIEphdmFCZWFuLCBwbHVzIGEKKyAgICAgKiA8Y29kZT5jbGFzc05hbWU8L2NvZGU+IGF0dHJpYnV0ZSBkZWZpbmluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIEphdmEKKyAgICAgKiBjbGFzcyBuYW1lIG9mIHRoZSBiZWFuLgorICAgICAqIAorICAgICAqIEBwYXJhbSB3cml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGJlYW4KKyAgICAgKiAgICAgICAgICAgIEJlYW4gd2hvc2UgcHJvcGVydGllcyBhcmUgdG8gYmUgcmVuZGVyZWQgYXMgYXR0cmlidXRlcywKKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50QXR0cmlidXRlcyhQcmludFdyaXRlciB3cml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBiZWFuLAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBwcmludEF0dHJpYnV0ZXMod3JpdGVyLCBpbmRlbnQsIHRydWUsIGJlYW4sIGRlc2MpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHJlbGV2YW50IGF0dHJpYnV0ZXMgb2YgdGhlIHNwZWNpZmllZCBKYXZhQmVhbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd3JpdGVyCisgICAgICogICAgICAgICAgICBQcmludFdyaXRlciB0byB3aGljaCB3ZSBhcmUgc3RvcmluZworICAgICAqIEBwYXJhbSBpbmNsdWRlCisgICAgICogICAgICAgICAgICBTaG91bGQgd2UgaW5jbHVkZSBhIDxjb2RlPmNsYXNzTmFtZTwvY29kZT4gYXR0cmlidXRlPworICAgICAqIEBwYXJhbSBiZWFuCisgICAgICogICAgICAgICAgICBCZWFuIHdob3NlIHByb3BlcnRpZXMgYXJlIHRvIGJlIHJlbmRlcmVkIGFzIGF0dHJpYnV0ZXMsCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiAgICAgICAgICAgIFJlZ2lzdHJ5RGVzY3JwaXRvciBmcm9tIHRoaXMgYmVhbgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzdG9yaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRBdHRyaWJ1dGVzKFByaW50V3JpdGVyIHdyaXRlciwgaW50IGluZGVudCwKKyAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZSwgT2JqZWN0IGJlYW4sIFN0b3JlRGVzY3JpcHRpb24gZGVzYykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIFJlbmRlciB0aGUgcmVsZXZhbnQgcHJvcGVydGllcyBvZiB0aGlzIGJlYW4KKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGJlYW4uZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisKKyAgICAgICAgLy8gUmVuZGVyIGEgY2xhc3NOYW1lIGF0dHJpYnV0ZSBpZiByZXF1ZXN0ZWQKKyAgICAgICAgaWYgKGluY2x1ZGUgJiYgZGVzYyAhPSBudWxsICYmICFkZXNjLmlzU3RhbmRhcmQoKSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgY2xhc3NOYW1lPVwiIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIlwiIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBBY3F1aXJlIHRoZSBsaXN0IG9mIHByb3BlcnRpZXMgZm9yIHRoaXMgYmVhbgorICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcnNbXSA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbygKKyAgICAgICAgICAgICAgICBiZWFuLmdldENsYXNzKCkpLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3JzID09IG51bGwpIHsKKyAgICAgICAgICAgIGRlc2NyaXB0b3JzID0gbmV3IFByb3BlcnR5RGVzY3JpcHRvclswXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBibGFuayBpbnN0YW5jZQorICAgICAgICBPYmplY3QgYmVhbjIgPSBkZWZhdWx0SW5zdGFuY2UoYmVhbik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yc1tpXSBpbnN0YW5jZW9mIEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gSW5kZXhlZCBwcm9wZXJ0aWVzIGFyZSBub3QgcGVyc2lzdGVkCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWlzUGVyc2lzdGFibGUoZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgIHx8IChkZXNjcmlwdG9yc1tpXS5nZXRSZWFkTWV0aG9kKCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKGRlc2NyaXB0b3JzW2ldLmdldFdyaXRlTWV0aG9kKCkgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gTXVzdCBiZSBhIHJlYWQtd3JpdGUgcHJpbWl0aXZlIG9yIFN0cmluZworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRlc2MuaXNUcmFuc2llbnRBdHRyaWJ1dGUoZGVzY3JpcHRvcnNbaV0uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9ucworICAgICAgICAgICAgfQorICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gSW50cm9zcGVjdGlvblV0aWxzLmdldFByb3BlcnR5KGJlYW4sIGRlc2NyaXB0b3JzW2ldCisgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gTnVsbCB2YWx1ZXMgYXJlIG5vdCBwZXJzaXN0ZWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZTIgPSBJbnRyb3NwZWN0aW9uVXRpbHMuZ2V0UHJvcGVydHkoYmVhbjIsCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKHZhbHVlMikpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgcHJvcGVydHkgaGFzIGl0cyBkZWZhdWx0IHZhbHVlCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNQcmludFZhbHVlKGJlYW4sIGJlYW4yLCBkZXNjcmlwdG9yc1tpXS5nZXROYW1lKCksIGRlc2MpKQorICAgICAgICAgICAgICAgIHByaW50VmFsdWUod3JpdGVyLCBpbmRlbnQsIGRlc2NyaXB0b3JzW2ldLmdldE5hbWUoKSwgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJlYW4gaW5zdGFuY2VvZiBSZXNvdXJjZUJhc2UpIHsKKyAgICAgICAgICAgIFJlc291cmNlQmFzZSByZXNvdXJjZSA9IChSZXNvdXJjZUJhc2UpIGJlYW47CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5saXN0UHJvcGVydGllcygpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHJlc291cmNlLmdldFByb3BlcnR5KG5hbWUpOworICAgICAgICAgICAgICAgIGlmICghaXNQZXJzaXN0YWJsZSh2YWx1ZS5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRlc2MuaXNUcmFuc2llbnRBdHRyaWJ1dGUobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIFNraXAgdGhlIHNwZWNpZmllZCBleGNlcHRpb25zCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50VmFsdWUod3JpdGVyLCBpbmRlbnQsIG5hbWUsIHZhbHVlKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcHJpbnQgdGhpcyBBdHRyaWJ1dGUgdmFsdWUgb3Igbm90CisgICAgICogCisgICAgICogQHBhcmFtIGJlYW4KKyAgICAgKiAgICAgICAgICAgIG9yZ2luYWwgYmVhbgorICAgICAqIEBwYXJhbSBiZWFuMgorICAgICAqICAgICAgICAgICAgZGVmYXVsdCBiZWFuCisgICAgICogQHBhcmFtIGF0dHJOYW1lCisgICAgICogICAgICAgICAgICBhdHRyaWJ1dGUgbmFtZQorICAgICAqIEBwYXJhbSBkZXNjCisgICAgICogICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGZyb20gYmVhbgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBpdCdzIGEgcHJpbnRpbmcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW50VmFsdWUoT2JqZWN0IGJlYW4sIE9iamVjdCBiZWFuMiwgU3RyaW5nIGF0dHJOYW1lLAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjKSB7CisgICAgICAgIGJvb2xlYW4gcHJpbnRWYWx1ZSA9IGZhbHNlOworCisgICAgICAgIE9iamVjdCB2YWx1ZSA9IEludHJvc3BlY3Rpb25VdGlscy5nZXRQcm9wZXJ0eShiZWFuLCBhdHRyTmFtZSk7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUyID0gSW50cm9zcGVjdGlvblV0aWxzLmdldFByb3BlcnR5KGJlYW4yLCBhdHRyTmFtZSk7CisgICAgICAgICAgICBwcmludFZhbHVlID0gIXZhbHVlLmVxdWFscyh2YWx1ZTIpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByaW50VmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2VuZXJhdGUgZGVmYXVsdCBJbnN0YW5jZQorICAgICAqIAorICAgICAqIEBwYXJhbSBiZWFuCisgICAgICogQHJldHVybiBhbiBvYmplY3QgZnJvbSBzYW1lIGNsYXNzIGFzIGJlYW4gcGFyYW1ldGVyCisgICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBkZWZhdWx0SW5zdGFuY2UoT2JqZWN0IGJlYW4pIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBiZWFuLmdldENsYXNzKCkubmV3SW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwcmludCBhbiBhdHRyaWJ1dGUgdmFsdWUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd3JpdGVyCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludFZhbHVlKFByaW50V3JpdGVyIHdyaXRlciwgaW50IGluZGVudCwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKKyAgICAgICAgcHJpbnRJbmRlbnQod3JpdGVyLCBpbmRlbnQgKyA0KTsKKyAgICAgICAgd3JpdGVyLnByaW50KG5hbWUpOworICAgICAgICB3cml0ZXIucHJpbnQoIj1cIiIpOworICAgICAgICBTdHJpbmcgc3RyVmFsdWUgPSBjb252ZXJ0U3RyKChTdHJpbmcpIHZhbHVlKTsKKyAgICAgICAgd3JpdGVyLnByaW50KHN0clZhbHVlKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCJcIiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgc3RyaW5nLCB0aGlzIG1ldGhvZCByZXBsYWNlcyBhbGwgb2NjdXJyZW5jZXMgb2YgJyA8JywgJz4nLCAnJicsCisgICAgICogYW5kICciJy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdHIoU3RyaW5nIGlucHV0KSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGZpbHRlcmVkID0gbmV3IFN0cmluZ0J1ZmZlcihpbnB1dC5sZW5ndGgoKSk7CisgICAgICAgIGNoYXIgYzsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBjID0gaW5wdXQuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGMgPT0gJzwnKSB7CisgICAgICAgICAgICAgICAgZmlsdGVyZWQuYXBwZW5kKCImbHQ7Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJz4nKSB7CisgICAgICAgICAgICAgICAgZmlsdGVyZWQuYXBwZW5kKCImZ3Q7Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1wnJykgeworICAgICAgICAgICAgICAgIGZpbHRlcmVkLmFwcGVuZCgiJmFwb3M7Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyInKSB7CisgICAgICAgICAgICAgICAgZmlsdGVyZWQuYXBwZW5kKCImcXVvdDsiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnJicpIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZC5hcHBlbmQoIiZhbXA7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbHRlcmVkLmFwcGVuZChjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGZpbHRlcmVkLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgdHlwZSBvbmUgZm9yIHdoaWNoIHdlIHNob3VsZCBnZW5lcmF0ZSBhCisgICAgICogcGVyc2lzdGVuY2UgYXR0cmlidXRlPworICAgICAqIAorICAgICAqIEBwYXJhbSBjbGF6egorICAgICAqICAgICAgICAgICAgSmF2YSBjbGFzcyB0byBiZSB0ZXN0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1BlcnNpc3RhYmxlKENsYXNzIGNsYXp6KSB7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJzaXN0YWJsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwZXJzaXN0YWJsZXNbaV0gPT0gY2xhenopIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVDb25maWcuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxNDJmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlQ29uZmlnLmphdmEKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLk1CZWFuVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKy8qKgorICogU3RvcmUgU2VydmVyL1NlcnZpY2UvSG9zdC9Db250ZXh0IGF0IGZpbGUgb3IgUHJpbnRXcml0ZXIuIERlZmF1bHQgc2VydmVyLnhtbAorICogaXMgYXQgJGNhdGFsaW5hLmJhc2UvY29uZi9zZXJ2ZXIueG1sCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqICAKKyAqLworcHVibGljIGNsYXNzIFN0b3JlQ29uZmlnIGltcGxlbWVudHMgSVN0b3JlQ29uZmlnIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3RvcmVDb25maWcuY2xhc3MpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyRmlsZW5hbWUgPSAiY29uZi9zZXJ2ZXIueG1sIjsKKworICAgIHByaXZhdGUgU3RvcmVSZWdpc3RyeSByZWdpc3RyeTsKKworICAgIC8qKgorICAgICAqIGdldCBzZXJ2ZXIueG1sIGxvY2F0aW9uCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgc2VydmVyIGZpbGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyRmlsZW5hbWUoKSB7CisgICAgICAgIHJldHVybiBzZXJ2ZXJGaWxlbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgbmV3IHNlcnZlci54bWwgbG9jYXRpb24KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VydmVyRmlsZW5hbWUoU3RyaW5nIHN0cmluZykgeworICAgICAgICBzZXJ2ZXJGaWxlbmFtZSA9IHN0cmluZzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEdldCB0aGUgU3RvcmVSZWdpc3RyeSB3aXRoIGFsbCBmYWN0b3J5IHRvIGdlbmVyYXRlIHRoZQorICAgICAqIHNlcnZlci54bWwvY29udGV4dC54bWwgZmlsZXMKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29uZmlnLklTdG9yZUNvbmZpZyNnZXRSZWdpc3RyeSgpCisgICAgICovCisgICAgcHVibGljIFN0b3JlUmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7CisgICAgICAgIHJldHVybiByZWdpc3RyeTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHNldCBTdG9yZVJlZ2lzdHJ5CisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5JU3RvcmVDb25maWcjc2V0UmVnaXN0cnkob3JnLmFwYWNoZS5jYXRhbGluYS5jb25maWcuQ29uZmlndXJhdGlvblJlZ2lzdHJ5KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZ2lzdHJ5KFN0b3JlUmVnaXN0cnkgYVJlZ2lzdHJ5KSB7CisgICAgICAgIHJlZ2lzdHJ5ID0gYVJlZ2lzdHJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlIGN1cnJlbnQgU2VydmVyCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlckZhY3RvcnkjZ2V0U2VydmVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcmVDb25maWcoKSB7CisgICAgICAgIHN0b3JlKFNlcnZlckZhY3RvcnkuZ2V0U2VydmVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlIFNlcnZlciBmcm9tIE9iamVjdCBOYW1lIChDYXRhbGluYTp0eXBlPVNlcnZlcikKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVNlcnZlck5hbWUKKyAgICAgKiAgICAgICAgICAgIFNlcnZlciBPYmplY3ROYW1lCisgICAgICogQHBhcmFtIGJhY2t1cAorICAgICAqIEBwYXJhbSBleHRlcm5hbEFsbG93ZWQKKyAgICAgKiAgICAgICAgICAgIHMgKgorICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9yZVNlcnZlcihTdHJpbmcgYVNlcnZlck5hbWUsIGJvb2xlYW4gYmFja3VwLAorICAgICAgICAgICAgYm9vbGVhbiBleHRlcm5hbEFsbG93ZWQpIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGFTZXJ2ZXJOYW1lID09IG51bGwgfHwgYVNlcnZlck5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0Vycm9yRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiUGxlYXNlLCBjYWxsIHdpdGggYSBjb3JyZWN0IHNlcnZlciBPYmplY3ROYW1lISIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBNQmVhblV0aWxzLmNyZWF0ZVNlcnZlcigpOworICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZShhU2VydmVyTmFtZSk7CisgICAgICAgIGlmIChtc2VydmVyLmlzUmVnaXN0ZXJlZChvYmplY3ROYW1lKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTZXJ2ZXIgYVNlcnZlciA9IChTZXJ2ZXIpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAibWFuYWdlZFJlc291cmNlIik7CisgICAgICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjID0gbnVsbDsKKyAgICAgICAgICAgICAgICBkZXNjID0gZ2V0UmVnaXN0cnkoKS5maW5kRGVzY3JpcHRpb24oU3RhbmRhcmRDb250ZXh0LmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb2xkU2VwYXJhdGUgPSBkZXNjLmlzU3RvcmVTZXBhcmF0ZSgpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIG9sZEJhY2t1cCA9IGRlc2MuaXNCYWNrdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvbGRFeHRlcm5hbEFsbG93ZWQgPSBkZXNjLmlzRXh0ZXJuYWxBbGxvd2VkKCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLnNldFN0b3JlU2VwYXJhdGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLnNldEJhY2t1cChiYWNrdXApOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5zZXRFeHRlcm5hbEFsbG93ZWQoZXh0ZXJuYWxBbGxvd2VkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlKChTZXJ2ZXIpIGFTZXJ2ZXIpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5zZXRTdG9yZVNlcGFyYXRlKG9sZFNlcGFyYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2Muc2V0QmFja3VwKG9sZEJhY2t1cCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLnNldEV4dGVybmFsQWxsb3dlZChvbGRFeHRlcm5hbEFsbG93ZWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0b3JlKChTZXJ2ZXIpIGFTZXJ2ZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIk9iamVjdCAiICsgYVNlcnZlck5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm8gYSBTZXJ2ZXIgaW5zdGFuY2Ugb3Igc3RvcmUgZXhjZXB0aW9uIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5pbmZvKCJTZXJ2ZXIgIiArIGFTZXJ2ZXJOYW1lICsgIiBub3QgZm91bmQhIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmUgYSBDb250ZXh0IGZyb20gT2JqZWN0TmFtZQorICAgICAqIAorICAgICAqIEBwYXJhbSBhQ29udGV4dE5hbWUKKyAgICAgKiAgICAgICAgICAgIE1CZWFuIE9iamVjdE5hbWUKKyAgICAgKiBAcGFyYW0gYmFja3VwCisgICAgICogQHBhcmFtIGV4dGVybmFsQWxsb3dlZAorICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9yZUNvbnRleHQoU3RyaW5nIGFDb250ZXh0TmFtZSwgYm9vbGVhbiBiYWNrdXAsCisgICAgICAgICAgICBib29sZWFuIGV4dGVybmFsQWxsb3dlZCkgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworICAgICAgICBpZiAoYUNvbnRleHROYW1lID09IG51bGwgfHwgYUNvbnRleHROYW1lLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlBsZWFzZSwgY2FsbCB3aXRoIGEgY29ycmVjdCBjb250ZXh0IE9iamVjdE5hbWUhIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IE1CZWFuVXRpbHMuY3JlYXRlU2VydmVyKCk7CisgICAgICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKGFDb250ZXh0TmFtZSk7CisgICAgICAgIGlmIChtc2VydmVyLmlzUmVnaXN0ZXJlZChvYmplY3ROYW1lKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDb250ZXh0IGFDb250ZXh0ID0gKENvbnRleHQpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAibWFuYWdlZFJlc291cmNlIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNvbmZpZ0ZpbGUgPSBhQ29udGV4dC5nZXRDb25maWdGaWxlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ0ZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbnRleHQuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvbGRTZXBhcmF0ZSA9IGRlc2MuaXNTdG9yZVNlcGFyYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvbGRCYWNrdXAgPSBkZXNjLmlzQmFja3VwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvbGRFeHRlcm5hbEFsbG93ZWQgPSBkZXNjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNFeHRlcm5hbEFsbG93ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLnNldFN0b3JlU2VwYXJhdGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2Muc2V0QmFja3VwKGJhY2t1cCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2Muc2V0RXh0ZXJuYWxBbGxvd2VkKGV4dGVybmFsQWxsb3dlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MuZ2V0U3RvcmVGYWN0b3J5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RvcmUobnVsbCwgLTIsIGFDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLnNldFN0b3JlU2VwYXJhdGUob2xkU2VwYXJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLnNldEJhY2t1cChvbGRCYWNrdXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLnNldEJhY2t1cChvbGRFeHRlcm5hbEFsbG93ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIk1pc3NpbmcgY29uZmlnRmlsZSBhdCBDb250ZXh0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFDb250ZXh0LmdldFBhdGgoKSArICIgdG8gc3RvcmUhIik7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPYmplY3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFDb250ZXh0TmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm8gYSBjb250ZXh0IGluc3RhbmNlIG9yIHN0b3JlIGV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oIkNvbnRleHQgIiArIGFDb250ZXh0TmFtZSArICIgbm90IGZvdW5kISIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIGVudGlyZSA8Y29kZT5TZXJ2ZXI8L2NvZGU+CisgICAgICogb3V0IHRvIHRoZSBzZXJ2ZXIueG1sIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKiAgCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3JlKFNlcnZlciBhU2VydmVyKSB7CisKKyAgICAgICAgU3RvcmVGaWxlTW92ZXIgbW92ZXIgPSBuZXcgU3RvcmVGaWxlTW92ZXIoU3lzdGVtCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksIGdldFNlcnZlckZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgZ2V0UmVnaXN0cnkoKS5nZXRFbmNvZGluZygpKTsKKyAgICAgICAgLy8gT3BlbiBhbiBvdXRwdXQgd3JpdGVyIGZvciB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbW92ZXIuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RvcmUod3JpdGVyLCAtMiwgYVNlcnZlcik7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIC8vIEZsdXNoIGFuZCBjbG9zZSB0aGUgb3V0cHV0IGZpbGUKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtb3Zlci5tb3ZlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29uZmlnLklTdG9yZUNvbmZpZyNzdG9yZShvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3JlKENvbnRleHQgYUNvbnRleHQpIHsKKyAgICAgICAgU3RyaW5nIGNvbmZpZ0ZpbGUgPSBhQ29udGV4dC5nZXRDb25maWdGaWxlKCk7CisgICAgICAgIGlmIChjb25maWdGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjID0gbnVsbDsKKyAgICAgICAgICAgICAgICBkZXNjID0gZ2V0UmVnaXN0cnkoKS5maW5kRGVzY3JpcHRpb24oYUNvbnRleHQuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIG9sZCA9IGRlc2MuaXNTdG9yZVNlcGFyYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLnNldFN0b3JlU2VwYXJhdGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLmdldFN0b3JlRmFjdG9yeSgpLnN0b3JlKG51bGwsIC0yLCBhQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLnNldFN0b3JlU2VwYXJhdGUob2xkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGxvZy5lcnJvcigiTWlzc2luZyBjb25maWdGaWxlIGF0IENvbnRleHQgIiArIGFDb250ZXh0LmdldFBhdGgoKSk7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29uZmlnLklTdG9yZUNvbmZpZyNzdG9yZShqYXZhLmlvLlByaW50V3JpdGVyLAorICAgICAqICAgICAgaW50LCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsCisgICAgICAgICAgICBDb250ZXh0IGFDb250ZXh0KSB7CisgICAgICAgIGJvb2xlYW4gb2xkU2VwYXJhdGUgPSB0cnVlOworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2MgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGVzYyA9IGdldFJlZ2lzdHJ5KCkuZmluZERlc2NyaXB0aW9uKGFDb250ZXh0LmdldENsYXNzKCkpOworICAgICAgICAgICAgb2xkU2VwYXJhdGUgPSBkZXNjLmlzU3RvcmVTZXBhcmF0ZSgpOworICAgICAgICAgICAgZGVzYy5zZXRTdG9yZVNlcGFyYXRlKGZhbHNlKTsKKyAgICAgICAgICAgIGRlc2MuZ2V0U3RvcmVGYWN0b3J5KCkuc3RvcmUoYVdyaXRlciwgaW5kZW50LCBhQ29udGV4dCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZGVzYyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGRlc2Muc2V0U3RvcmVTZXBhcmF0ZShvbGRTZXBhcmF0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29uZmlnLklTdG9yZUNvbmZpZyNzdG9yZShqYXZhLmlvLlByaW50V3JpdGVyLAorICAgICAqICAgICAgaW50LCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3QpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIEhvc3QgYUhvc3QpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYyA9IGdldFJlZ2lzdHJ5KCkuZmluZERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBhSG9zdC5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGRlc2MuZ2V0U3RvcmVGYWN0b3J5KCkuc3RvcmUoYVdyaXRlciwgaW5kZW50LCBhSG9zdCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29uZmlnLklTdG9yZUNvbmZpZyNzdG9yZShqYXZhLmlvLlByaW50V3JpdGVyLAorICAgICAqICAgICAgaW50LCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZpY2UpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsCisgICAgICAgICAgICBTZXJ2aWNlIGFTZXJ2aWNlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgYVNlcnZpY2UuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBkZXNjLmdldFN0b3JlRmFjdG9yeSgpLnN0b3JlKGFXcml0ZXIsIGluZGVudCwgYVNlcnZpY2UpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHN0YXRlIG9mIHRoaXMgU2VydmVyIE1CZWFuICh3aGljaCB3aWxsIHJlY3Vyc2l2ZWx5IHN0b3JlCisgICAgICogZXZlcnl0aGluZykKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd3JpdGVyCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqIEBwYXJhbSBhU2VydmVyCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3JlKFByaW50V3JpdGVyIHdyaXRlciwgaW50IGluZGVudCwKKyAgICAgICAgICAgIFNlcnZlciBhU2VydmVyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgYVNlcnZlci5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGRlc2MuZ2V0U3RvcmVGYWN0b3J5KCkuc3RvcmUod3JpdGVyLCBpbmRlbnQsIGFTZXJ2ZXIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKGUpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUNvbmZpZ0xpZmVjeWNsZUxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUNvbmZpZ0xpZmVjeWNsZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1YzY2MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlQ29uZmlnTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5tb2RlbG1iZWFuLk1vZGVsTUJlYW47CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLk1CZWFuVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuTWFuYWdlZEJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CisKKy8qKgorICogTG9hZCBhbmQgUmVnaXN0ZXIgU3RvcmVDb25maWcgTUJlYW4gPGk+Q2F0YWxpbmE6dHlwZT1TdG9yZUNvbmZpZyxyZXNvdXJjZT0idXJsIjwvaT4KKyAqIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICovCitwdWJsaWMgY2xhc3MgU3RvcmVDb25maWdMaWZlY3ljbGVMaXN0ZW5lciBpbXBsZW1lbnRzIExpZmVjeWNsZUxpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeQorICAgICAgICAgICAgLmdldExvZyhTdG9yZUNvbmZpZ0xpZmVjeWNsZUxpc3RlbmVyLmNsYXNzKTsKKworICAgIElTdG9yZUNvbmZpZyBzdG9yZUNvbmZpZzsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0b3JlQ29uZmlnQ2xhc3MgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUNvbmZpZyI7CisKKyAgICBwcml2YXRlIFN0cmluZyBzdG9yZVJlZ2lzdHJ5ID0gbnVsbDsKKworICAgIC8qCisgICAgICogcmVnaXN0ZXIgU3RvcmVSZWdpc3RyeSBhZnRlciBTdGFydCB0aGUgY29tcGxldGUgU2VydmVyCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyI2xpZmVjeWNsZUV2ZW50KG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXZlbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgbGlmZWN5Y2xlRXZlbnQoTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKExpZmVjeWNsZS5BRlRFUl9TVEFSVF9FVkVOVC5lcXVhbHMoZXZlbnQuZ2V0VHlwZSgpKSkgeworICAgICAgICAgICAgaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgU3RhbmRhcmRTZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVNQmVhbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlIFN0b3JlQ29uZmlnIE1CZWFuIGFuZCBsb2FkIFN0b3JlUmdpc3RyeSBNQmVhbnMgbmFtZSBpcworICAgICAqIDxpPkNhdGFsaW5hOnR5cGU9U3RvcmVDb25maWcgPC9pPgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1CZWFuKCkgeworICAgICAgICBTdG9yZUxvYWRlciBsb2FkZXIgPSBuZXcgU3RvcmVMb2FkZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShnZXRTdG9yZUNvbmZpZ0NsYXNzKCksIHRydWUsIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICBzdG9yZUNvbmZpZyA9IChJU3RvcmVDb25maWcpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBnZXRTdG9yZVJlZ2lzdHJ5KCkpCisgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBMb2FkaW5nCisgICAgICAgICAgICAgICAgbG9hZGVyLmxvYWQoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAvLyBsb2FkIGEgc3BlemlhbCBmaWxlIHJlZ2lzdHJ5ICh1cmwpCisgICAgICAgICAgICAgICAgbG9hZGVyLmxvYWQoZ2V0U3RvcmVSZWdpc3RyeSgpKTsKKyAgICAgICAgICAgIC8vIHVzZSB0aGUgbG9hZGVyIFJlZ2lzdHJ5CisgICAgICAgICAgICBzdG9yZUNvbmZpZy5zZXRSZWdpc3RyeShsb2FkZXIuZ2V0UmVnaXN0cnkoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoImNyZWF0ZU1CZWFuIGxvYWQiLCBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNQmVhblNlcnZlciBtc2VydmVyID0gTUJlYW5VdGlscy5jcmVhdGVTZXJ2ZXIoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gZGVzY3JpcHRvciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZSgiQ2F0YWxpbmE6dHlwZT1TdG9yZUNvbmZpZyIgKTsKKyAgICAgICAgICAgIGlmICghbXNlcnZlci5pc1JlZ2lzdGVyZWQob2JqZWN0TmFtZSkpIHsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAibWJlYW5zLWRlc2NyaXB0b3JzLnhtbCIpOworICAgICAgICAgICAgICAgIFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gTUJlYW5VdGlscy5jcmVhdGVSZWdpc3RyeSgpOworICAgICAgICAgICAgICAgIHJlZ2lzdHJ5LmxvYWRNZXRhZGF0YShkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICBtc2VydmVyLnJlZ2lzdGVyTUJlYW4oZ2V0TWFuYWdlZEJlYW4oc3RvcmVDb25maWcpLCBvYmplY3ROYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoImNyZWF0ZU1CZWFuIHJlZ2lzdGVyIE1CZWFuIiwgZXgpOworCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJjcmVhdGVNQmVhbiByZWdpc3RlciBNQmVhbiIsIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBNYW5hZ2VkQmVhbiAoU3RvcmVDb25maWcpCisgICAgICogCisgICAgICogQHBhcmFtIG9iamVjdAorICAgICAqIEByZXR1cm4gVGhlIGJlYW4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBNb2RlbE1CZWFuIGdldE1hbmFnZWRCZWFuKE9iamVjdCBvYmplY3QpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkQmVhbiA9IFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpCisgICAgICAgICAgICAgICAgLmZpbmRNYW5hZ2VkQmVhbihvYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICByZXR1cm4gbWFuYWdlZEJlYW4uY3JlYXRlTUJlYW4ob2JqZWN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0b3JlQ29uZmlnLgorICAgICAqLworICAgIHB1YmxpYyBJU3RvcmVDb25maWcgZ2V0U3RvcmVDb25maWcoKSB7CisgICAgICAgIHJldHVybiBzdG9yZUNvbmZpZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc3RvcmVDb25maWcKKyAgICAgKiAgICAgICAgICAgIFRoZSBzdG9yZUNvbmZpZyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RvcmVDb25maWcoSVN0b3JlQ29uZmlnIHN0b3JlQ29uZmlnKSB7CisgICAgICAgIHRoaXMuc3RvcmVDb25maWcgPSBzdG9yZUNvbmZpZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0b3JlQ29uZmlnQ2xhc3MuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdG9yZUNvbmZpZ0NsYXNzKCkgeworICAgICAgICByZXR1cm4gc3RvcmVDb25maWdDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc3RvcmVDb25maWdDbGFzcworICAgICAqICAgICAgICAgICAgVGhlIHN0b3JlQ29uZmlnQ2xhc3MgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlQ29uZmlnQ2xhc3MoU3RyaW5nIHN0b3JlQ29uZmlnQ2xhc3MpIHsKKyAgICAgICAgdGhpcy5zdG9yZUNvbmZpZ0NsYXNzID0gc3RvcmVDb25maWdDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0b3JlUmVnaXN0cnkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdG9yZVJlZ2lzdHJ5KCkgeworICAgICAgICByZXR1cm4gc3RvcmVSZWdpc3RyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc3RvcmVSZWdpc3RyeQorICAgICAqICAgICAgICAgICAgVGhlIHN0b3JlUmVnaXN0cnkgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlUmVnaXN0cnkoU3RyaW5nIHN0b3JlUmVnaXN0cnkpIHsKKyAgICAgICAgdGhpcy5zdG9yZVJlZ2lzdHJ5ID0gc3RvcmVSZWdpc3RyeTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUNvbnRleHRBcHBlbmRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVDb250ZXh0QXBwZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2M4YzdmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVDb250ZXh0QXBwZW5kZXIuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdDsKKworLyoqCisgKiBzdG9yZSBTdGFuZGFyZENvbnRleHQgQXR0cmlidXRlcyAuLi4gVE9ETyBEZWZhdWx0Q29udGV4dCBIYW5kbGluZworICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBTdG9yZUNvbnRleHRBcHBlbmRlciBleHRlbmRzIFN0b3JlQXBwZW5kZXIgeworCisgICAgLyoKKyAgICAgKiBQcmludCBDb250ZXh0IFZhbHVlcy4gPHVsPjxsaT4gU3BlemlhbCBoYW5kbGluZyB0byBkZWZhdWx0IHdvcmtEaXIuCisgICAgICogPC9saT48bGk+IERvbid0IHNhdmUgcGF0aCBhdCBleHRlcm5hbCBjb250ZXh0LnhtbCA8L2xpPjxsaT4gRG9uJ3QKKyAgICAgKiBnZW5lcmF0ZSBkb2NCYXNlIGZvciBob3N0LmFwcEJhc2Ugd2ViYXBwcyA8TEk+PC91bD4KKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29uZmlnLlN0b3JlQXBwZW5kZXIjaXNQcmludFZhbHVlKGphdmEubGFuZy5PYmplY3QsCisgICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLAorICAgICAqICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25maWcuU3RvcmVEZXNjcmlwdGlvbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW50VmFsdWUoT2JqZWN0IGJlYW4sIE9iamVjdCBiZWFuMiwgU3RyaW5nIGF0dHJOYW1lLAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjKSB7CisgICAgICAgIGJvb2xlYW4gaXNQcmludCA9IHN1cGVyLmlzUHJpbnRWYWx1ZShiZWFuLCBiZWFuMiwgYXR0ck5hbWUsIGRlc2MpOworICAgICAgICBpZiAoaXNQcmludCkgeworICAgICAgICAgICAgU3RhbmRhcmRDb250ZXh0IGNvbnRleHQgPSAoKFN0YW5kYXJkQ29udGV4dCkgYmVhbik7CisgICAgICAgICAgICBpZiAoIndvcmtEaXIiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFdvcmtEaXIgPSBnZXREZWZhdWx0V29ya0Rpcihjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBpc1ByaW50ID0gIWRlZmF1bHRXb3JrRGlyLmVxdWFscyhjb250ZXh0LmdldFdvcmtEaXIoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJwYXRoIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgaXNQcmludCA9IGRlc2MuaXNTdG9yZVNlcGFyYXRlKCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVzYy5pc0V4dGVybmFsQWxsb3dlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29udGV4dC5nZXRDb25maWdGaWxlKCkgPT0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImRvY0Jhc2UiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBDb250YWluZXIgaG9zdCA9IGNvbnRleHQuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKGhvc3QgaW5zdGFuY2VvZiBTdGFuZGFyZEhvc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBhcHBCYXNlID0gZ2V0QXBwQmFzZSgoKFN0YW5kYXJkSG9zdCkgaG9zdCkpOworICAgICAgICAgICAgICAgICAgICBGaWxlIGRvY0Jhc2UgPSBnZXREb2NCYXNlKGNvbnRleHQsYXBwQmFzZSk7CisgICAgICAgICAgICAgICAgICAgIGlzUHJpbnQgPSAhYXBwQmFzZS5lcXVhbHMoZG9jQmFzZS5nZXRQYXJlbnRGaWxlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXNQcmludDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRBcHBCYXNlKFN0YW5kYXJkSG9zdCBob3N0KSB7CisKKyAgICAgICAgRmlsZSBhcHBCYXNlOworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShob3N0LmdldEFwcEJhc2UoKSk7CisgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksIGhvc3QKKyAgICAgICAgICAgICAgICAgICAgLmdldEFwcEJhc2UoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhcHBCYXNlID0gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFwcEJhc2UgPSBmaWxlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoYXBwQmFzZSk7CisKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXREb2NCYXNlKFN0YW5kYXJkQ29udGV4dCBjb250ZXh0LCBGaWxlIGFwcEJhc2UpIHsKKworICAgICAgICBGaWxlIGRvY0Jhc2U7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGNvbnRleHQuZ2V0RG9jQmFzZSgpKTsKKyAgICAgICAgaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkKKyAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShhcHBCYXNlLCBjb250ZXh0LmdldERvY0Jhc2UoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkb2NCYXNlID0gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGRvY0Jhc2UgPSBmaWxlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoZG9jQmFzZSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGRlZmF1bHQgV29yayBEaXIuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQKKyAgICAgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRXb3JrRGlyKFN0YW5kYXJkQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIFN0cmluZyBkZWZhdWx0V29ya0RpciA9IG51bGw7CisgICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpLmxlbmd0aCgpID09IDAgPyAiXyIgOiBjb250ZXh0CisgICAgICAgICAgICAgICAgLmdldFBhdGgoKS5zdWJzdHJpbmcoMSk7CisgICAgICAgIENvbnRhaW5lciBob3N0ID0gY29udGV4dC5nZXRQYXJlbnQoKTsKKyAgICAgICAgaWYgKGhvc3QgaW5zdGFuY2VvZiBTdGFuZGFyZEhvc3QpIHsKKyAgICAgICAgICAgIFN0cmluZyBob3N0V29ya0RpciA9ICgoU3RhbmRhcmRIb3N0KSBob3N0KS5nZXRXb3JrRGlyKCk7CisgICAgICAgICAgICBpZiAoaG9zdFdvcmtEaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlZmF1bHRXb3JrRGlyID0gaG9zdFdvcmtEaXIgKyBGaWxlLnNlcGFyYXRvciArIGNvbnRleHRQYXRoOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW5naW5lTmFtZSA9IGNvbnRleHQuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIFN0cmluZyBob3N0TmFtZSA9IGNvbnRleHQuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGRlZmF1bHRXb3JrRGlyID0gIndvcmsiICsgRmlsZS5zZXBhcmF0b3IgKyBlbmdpbmVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgaG9zdE5hbWUgKyBGaWxlLnNlcGFyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250ZXh0UGF0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVmYXVsdFdvcmtEaXI7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZW5lcmF0ZSBhIHJlYWwgZGVmYXVsdCBTdGFuZGFyZENvbnRleHQgVE9ETyByZWFkIGFuZCBpbnRlcnByZXQgdGhlCisgICAgICogZGVmYXVsdCBjb250ZXh0LnhtbCBhbmQgY29udGV4dC54bWwuZGVmYXVsdCBUT0RPIENhY2hlIGEgRGVmYXVsdAorICAgICAqIFN0YW5kYXJkQ29udGV4dCAoIHdpdGggcmVsb2FkaW5nIHN0cmF0ZWd5KSBUT0RPIHJlbW92ZSByZWFsbHkgYWxsCisgICAgICogZWxlbWVudHMsIGJ1dCBkZXRlY3Rpb24gaXMgaGFyZC4uLiBUbyBMaXN0ZW5lciBvciBWYWx2ZSBmcm9tIHNhbWUgY2xhc3M/PgorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUFwcGVuZGVyI2RlZmF1bHRJbnN0YW5jZShqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZGVmYXVsdEluc3RhbmNlKE9iamVjdCBiZWFuKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICBpZiAoYmVhbiBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCkgeworICAgICAgICAgICAgU3RhbmRhcmRDb250ZXh0IGRlZmF1bHRDb250ZXh0ID0gbmV3IFN0YW5kYXJkQ29udGV4dCgpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGlmICghKChTdGFuZGFyZENvbnRleHQpIGJlYW4pLmdldE92ZXJyaWRlKCkpIHsKKyAgICAgICAgICAgICAqIGRlZmF1bHRDb250ZXh0LnNldFBhcmVudCgoKFN0YW5kYXJkQ29udGV4dCliZWFuKS5nZXRQYXJlbnQoKSk7CisgICAgICAgICAgICAgKiBDb250ZXh0Q29uZmlnIGNvbnRleHRDb25maWcgPSBuZXcgQ29udGV4dENvbmZpZygpOworICAgICAgICAgICAgICogZGVmYXVsdENvbnRleHQuYWRkTGlmZWN5Y2xlTGlzdGVuZXIoY29udGV4dENvbmZpZyk7CisgICAgICAgICAgICAgKiBjb250ZXh0Q29uZmlnLnNldENvbnRleHQoZGVmYXVsdENvbnRleHQpOworICAgICAgICAgICAgICogY29udGV4dENvbmZpZy5wcm9jZXNzQ29udGV4dENvbmZpZyhuZXcgRmlsZShjb250ZXh0Q29uZmlnCisgICAgICAgICAgICAgKiAuZ2V0QmFzZURpcigpLCAiY29uZi9jb250ZXh0LnhtbCIpKTsKKyAgICAgICAgICAgICAqIGNvbnRleHRDb25maWcucHJvY2Vzc0NvbnRleHRDb25maWcobmV3IEZpbGUoY29udGV4dENvbmZpZworICAgICAgICAgICAgICogLmdldENvbmZpZ0Jhc2UoKSwgImNvbnRleHQueG1sLmRlZmF1bHQiKSk7IH0KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRDb250ZXh0OworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5kZWZhdWx0SW5zdGFuY2UoYmVhbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVEZXNjcmlwdGlvbi5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVEZXNjcmlwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNGUzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZURlc2NyaXB0aW9uLmphdmEKQEAgLTAsMCArMSwzNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEJlYW4gb2YgYSBTdG9yZURlc2NyaXB0aW9uIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaCAKKyAqIAorICogPHByZT4KKyAqIAorICogICZsdDtEZXNjcmlwdGlvbgorICogIHRhZz0mcXVvdDtDb250ZXh0JnF1b3Q7CisgKiAgc3RhbmRhcmQ9JnF1b3Q7dHJ1ZSZxdW90OworICogIGRlZmF1bHQ9JnF1b3Q7dHJ1ZSZxdW90OyAKKyAqICBleHRlcm5hbEFsbG93ZWQ9JnF1b3Q7dHJ1ZSZxdW90OyAKKyAqICBzdG9yZVNlcGFyYXRlPSZxdW90O3RydWUmcXVvdDsKKyAqICBiYWNrdXA9JnF1b3Q7dHJ1ZSZxdW90OyAKKyAqICBjaGlsZHM9JnF1b3Q7dHJ1ZSZxdW90OworICogIHRhZ0NsYXNzPSZxdW90O29yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQmcXVvdDsKKyAqICBzdG9yZUZhY3RvcnlDbGFzcz0mcXVvdDtvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0YW5kYXJkQ29udGV4dFNGJnF1b3Q7CisgKiAgc3RvcmVBcHBlbmRlckNsYXNzPSZxdW90O29yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVDb250ZXh0QXBwZW5kZXImcXVvdDsmZ3Q7CisgKiAgICAgJmx0O1RyYW5zaWVudEF0dHJpYnV0ZSZndDthdmFpbGFibGUmbHQ7L1RyYW5zaWVudEF0dHJpYnV0ZSZndDsKKyAqICAgICAmbHQ7VHJhbnNpZW50QXR0cmlidXRlJmd0O2NvbmZpZ0ZpbGUmbHQ7L1RyYW5zaWVudEF0dHJpYnV0ZSZndDsKKyAqICAgICAmbHQ7VHJhbnNpZW50QXR0cmlidXRlJmd0O2NvbmZpZ3VyZWQmbHQ7L1RyYW5zaWVudEF0dHJpYnV0ZSZndDsKKyAqICAgICAmbHQ7VHJhbnNpZW50QXR0cmlidXRlJmd0O2Rpc3BsYXlOYW1lJmx0Oy9UcmFuc2llbnRBdHRyaWJ1dGUmZ3Q7CisgKiAgICAgJmx0O1RyYW5zaWVudEF0dHJpYnV0ZSZndDtkaXN0cmlidXRhYmxlJmx0Oy9UcmFuc2llbnRBdHRyaWJ1dGUmZ3Q7CisgKiAgICAgJmx0O1RyYW5zaWVudEF0dHJpYnV0ZSZndDtkb21haW4mbHQ7L1RyYW5zaWVudEF0dHJpYnV0ZSZndDsKKyAqICAgICAmbHQ7VHJhbnNpZW50QXR0cmlidXRlJmd0O2VuZ2luZU5hbWUmbHQ7L1RyYW5zaWVudEF0dHJpYnV0ZSZndDsKKyAqICAgICAmbHQ7VHJhbnNpZW50QXR0cmlidXRlJmd0O25hbWUmbHQ7L1RyYW5zaWVudEF0dHJpYnV0ZSZndDsKKyAqICAgICAmbHQ7VHJhbnNpZW50QXR0cmlidXRlJmd0O3B1YmxpY0lkJmx0Oy9UcmFuc2llbnRBdHRyaWJ1dGUmZ3Q7CisgKiAgICAgJmx0O1RyYW5zaWVudEF0dHJpYnV0ZSZndDtyZXBsYWNlV2VsY29tZUZpbGVzJmx0Oy9UcmFuc2llbnRBdHRyaWJ1dGUmZ3Q7CisgKiAgICAgJmx0O1RyYW5zaWVudEF0dHJpYnV0ZSZndDtzYXZlQ29uZmlnJmx0Oy9UcmFuc2llbnRBdHRyaWJ1dGUmZ3Q7CisgKiAgICAgJmx0O1RyYW5zaWVudEF0dHJpYnV0ZSZndDtzZXNzaW9uVGltZW91dCZsdDsvVHJhbnNpZW50QXR0cmlidXRlJmd0OworICogICAgICZsdDtUcmFuc2llbnRBdHRyaWJ1dGUmZ3Q7c3RhcnR1cFRpbWUmbHQ7L1RyYW5zaWVudEF0dHJpYnV0ZSZndDsKKyAqICAgICAmbHQ7VHJhbnNpZW50QXR0cmlidXRlJmd0O3RsZFNjYW5UaW1lJmx0Oy9UcmFuc2llbnRBdHRyaWJ1dGUmZ3Q7CisgKiAgJmx0Oy9EZXNjcmlwdGlvbiZndDsKKyAqIAorICogIAorICogPC9wcmU+CisgKi8KK3B1YmxpYyBjbGFzcyBTdG9yZURlc2NyaXB0aW9uIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGlkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgdGFnOworCisgICAgcHJpdmF0ZSBTdHJpbmcgdGFnQ2xhc3M7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhbmRhcmQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBiYWNrdXAgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBleHRlcm5hbEFsbG93ZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBteURlZmF1bHQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBhdHRyaWJ1dGVzID0gdHJ1ZTsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0b3JlRmFjdG9yeUNsYXNzOworCisgICAgcHJpdmF0ZSBJU3RvcmVGYWN0b3J5IHN0b3JlRmFjdG9yeTsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0b3JlV3JpdGVyQ2xhc3M7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2hpbGRzID0gZmFsc2U7CisKKyAgICBwcml2YXRlIExpc3QgdHJhbnNpZW50QXR0cmlidXRlczsKKworICAgIHByaXZhdGUgTGlzdCB0cmFuc2llbnRDaGlsZHM7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc3RvcmVTZXBhcmF0ZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBleHRlcm5hbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsQWxsb3dlZCgpIHsKKyAgICAgICAgcmV0dXJuIGV4dGVybmFsQWxsb3dlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZXh0ZXJuYWwKKyAgICAgKiAgICAgICAgICAgIFRoZSBleHRlcm5hbCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxBbGxvd2VkKGJvb2xlYW4gZXh0ZXJuYWwpIHsKKyAgICAgICAgdGhpcy5leHRlcm5hbEFsbG93ZWQgPSBleHRlcm5hbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YW5kYXJkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhcmQoKSB7CisgICAgICAgIHJldHVybiBzdGFuZGFyZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc3RhbmRhcmQKKyAgICAgKiAgICAgICAgICAgIFRoZSBzdGFuZGFyZCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmQoYm9vbGVhbiBzdGFuZGFyZCkgeworICAgICAgICB0aGlzLnN0YW5kYXJkID0gc3RhbmRhcmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBiYWNrdXAuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNCYWNrdXAoKSB7CisgICAgICAgIHJldHVybiBiYWNrdXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGJhY2t1cAorICAgICAqICAgICAgICAgICAgVGhlIGJhY2t1cCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmFja3VwKGJvb2xlYW4gYmFja3VwKSB7CisgICAgICAgIHRoaXMuYmFja3VwID0gYmFja3VwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbXlEZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKKyAgICAgICAgcmV0dXJuIG15RGVmYXVsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYURlZmF1bHQKKyAgICAgKiAgICAgICAgICAgIFRoZSBteURlZmF1bHQgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoYm9vbGVhbiBhRGVmYXVsdCkgeworICAgICAgICB0aGlzLm15RGVmYXVsdCA9IGFEZWZhdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RvcmVGYWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmVGYWN0b3J5Q2xhc3MoKSB7CisgICAgICAgIHJldHVybiBzdG9yZUZhY3RvcnlDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc3RvcmVGYWN0b3J5Q2xhc3MKKyAgICAgKiAgICAgICAgICAgIFRoZSBzdG9yZUZhY3RvcnkgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlRmFjdG9yeUNsYXNzKFN0cmluZyBzdG9yZUZhY3RvcnlDbGFzcykgeworICAgICAgICB0aGlzLnN0b3JlRmFjdG9yeUNsYXNzID0gc3RvcmVGYWN0b3J5Q2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzdG9yZUZhY3RvcnkuCisgICAgICovCisgICAgcHVibGljIElTdG9yZUZhY3RvcnkgZ2V0U3RvcmVGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gc3RvcmVGYWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBzdG9yZUZhY3RvcnkKKyAgICAgKiAgICAgICAgICAgIFRoZSBzdG9yZUZhY3RvcnkgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlRmFjdG9yeShJU3RvcmVGYWN0b3J5IHN0b3JlRmFjdG9yeSkgeworICAgICAgICB0aGlzLnN0b3JlRmFjdG9yeSA9IHN0b3JlRmFjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0b3JlV3JpdGVyQ2xhc3MuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdG9yZVdyaXRlckNsYXNzKCkgeworICAgICAgICByZXR1cm4gc3RvcmVXcml0ZXJDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc3RvcmVXcml0ZXJDbGFzcworICAgICAqICAgICAgICAgICAgVGhlIHN0b3JlV3JpdGVyQ2xhc3MgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlV3JpdGVyQ2xhc3MoU3RyaW5nIHN0b3JlV3JpdGVyQ2xhc3MpIHsKKyAgICAgICAgdGhpcy5zdG9yZVdyaXRlckNsYXNzID0gc3RvcmVXcml0ZXJDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRhZ0NsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnKCkgeworICAgICAgICByZXR1cm4gdGFnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB0YWcKKyAgICAgKiAgICAgICAgICAgIFRoZSB0YWcgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhZyhTdHJpbmcgdGFnKSB7CisgICAgICAgIHRoaXMudGFnID0gdGFnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGFnQ2xhc3MuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUYWdDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIHRhZ0NsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB0YWdDbGFzcworICAgICAqICAgICAgICAgICAgVGhlIHRhZ0NsYXNzIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYWdDbGFzcyhTdHJpbmcgdGFnQ2xhc3MpIHsKKyAgICAgICAgdGhpcy50YWdDbGFzcyA9IHRhZ0NsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdHJhbnNpZW50QXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRUcmFuc2llbnRBdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gdHJhbnNpZW50QXR0cmlidXRlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdHJhbnNpZW50QXR0cmlidXRlcworICAgICAqICAgICAgICAgICAgVGhlIHRyYW5zaWVudEF0dHJpYnV0ZXMgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zaWVudEF0dHJpYnV0ZXMoTGlzdCB0cmFuc2llbnRBdHRyaWJ1dGVzKSB7CisgICAgICAgIHRoaXMudHJhbnNpZW50QXR0cmlidXRlcyA9IHRyYW5zaWVudEF0dHJpYnV0ZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVHJhbnNpZW50QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGUpIHsKKyAgICAgICAgaWYgKHRyYW5zaWVudEF0dHJpYnV0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHRyYW5zaWVudEF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHRyYW5zaWVudEF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVHJhbnNpZW50QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGUpIHsKKyAgICAgICAgaWYgKHRyYW5zaWVudEF0dHJpYnV0ZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRyYW5zaWVudEF0dHJpYnV0ZXMucmVtb3ZlKGF0dHJpYnV0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0cmFuc2llbnRDaGlsZHMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0VHJhbnNpZW50Q2hpbGRzKCkgeworICAgICAgICByZXR1cm4gdHJhbnNpZW50Q2hpbGRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB0cmFuc2llbnRDaGlsZHMKKyAgICAgKiAgICAgICAgICAgIFRoZSB0cmFuc2llbnRDaGlsZHMgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zaWVudENoaWxkcyhMaXN0IHRyYW5zaWVudENoaWxkcykgeworICAgICAgICB0aGlzLnRyYW5zaWVudENoaWxkcyA9IHRyYW5zaWVudENoaWxkczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRUcmFuc2llbnRDaGlsZChTdHJpbmcgY2xhc3NuYW1lKSB7CisgICAgICAgIGlmICh0cmFuc2llbnRDaGlsZHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHRyYW5zaWVudENoaWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgdHJhbnNpZW50Q2hpbGRzLmFkZChjbGFzc25hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRyYW5zaWVudENoaWxkKFN0cmluZyBjbGFzc25hbWUpIHsKKyAgICAgICAgaWYgKHRyYW5zaWVudENoaWxkcyAhPSBudWxsKQorICAgICAgICAgICAgdHJhbnNpZW50Q2hpbGRzLnJlbW92ZShjbGFzc25hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlzIGNoaWxkIHRyYW5zaWVudCwgcGxlYXNlIGRvbid0IHNhdmUgdGhpcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lCisgICAgICogQHJldHVybiBpcyBjbGFzc25hbWUgYXR0cmlidXRlPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50Q2hpbGQoU3RyaW5nIGNsYXNzbmFtZSkgeworICAgICAgICBpZiAodHJhbnNpZW50Q2hpbGRzICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdHJhbnNpZW50Q2hpbGRzLmNvbnRhaW5zKGNsYXNzbmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpcyBhdHRyaWJ1dGUgdHJhbnNpZW50LCBwbGVhc2UgZG9uJ3Qgc2F2ZSB0aGlzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUKKyAgICAgKiBAcmV0dXJuIGlzIHRyYW5zaWVudCBhdHRyaWJ1dGU/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNUcmFuc2llbnRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSkgeworICAgICAgICBpZiAodHJhbnNpZW50QXR0cmlidXRlcyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRyYW5zaWVudEF0dHJpYnV0ZXMuY29udGFpbnMoYXR0cmlidXRlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVhbCBpZCBvciBUYWdDbGFzcworICAgICAqIAorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICAgICAgaWYgKGlkICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBnZXRUYWdDbGFzcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBpZAorICAgICAqICAgICAgICAgICAgVGhlIGlkIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZXMoKSB7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzCisgICAgICogICAgICAgICAgICBUaGUgYXR0cmlidXRlcyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhib29sZWFuIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgaXQncyBhIHNlcGFyYXRlIHN0b3JlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdG9yZVNlcGFyYXRlKCkgeworICAgICAgICByZXR1cm4gc3RvcmVTZXBhcmF0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdG9yZVNlcGFyYXRlKGJvb2xlYW4gc3RvcmVTZXBhcmF0ZSkgeworICAgICAgICB0aGlzLnN0b3JlU2VwYXJhdGUgPSBzdG9yZVNlcGFyYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2hpbGRzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2hpbGRzKCkgeworICAgICAgICByZXR1cm4gY2hpbGRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBjaGlsZHMKKyAgICAgKiAgICAgICAgICAgIFRoZSBjaGlsZHMgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENoaWxkcyhib29sZWFuIGNoaWxkcykgeworICAgICAgICB0aGlzLmNoaWxkcyA9IGNoaWxkczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUZhY3RvcnlCYXNlLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUZhY3RvcnlCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5YzczYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlRmFjdG9yeUJhc2UuamF2YQpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLyoqCisgKiBTdG9yZUZhY3Rvcnkgc2F2ZXMgc3BlemlhbCBlbGVtZW50cy4KKyAqIE91dHB1dCB3YXMgZ2VuZXJhdGUgd2l0aCBTdG9yZUFwcGVuZGVycy4KKyAqIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogQHZlcnNpb24gMS4wCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBTdG9yZUZhY3RvcnlCYXNlIGltcGxlbWVudHMgSVN0b3JlRmFjdG9yeSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFN0b3JlRmFjdG9yeUJhc2UuY2xhc3MpOworCisgICAgcHJpdmF0ZSBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5OworCisgICAgcHJpdmF0ZSBTdG9yZUFwcGVuZGVyIHN0b3JlQXBwZW5kZXIgPSBuZXcgU3RvcmVBcHBlbmRlcigpOworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0gU3RyaW5nTWFuYWdlcgorICAgICAgICAgICAgLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIHN0cmluZyBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlLzEuMCI7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBGYWNvdHJ5IGltcGxlbWVudGF0aW9uIGFuZCB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzdG9yZUFwcGVuZGVyLgorICAgICAqLworICAgIHB1YmxpYyBTdG9yZUFwcGVuZGVyIGdldFN0b3JlQXBwZW5kZXIoKSB7CisgICAgICAgIHJldHVybiBzdG9yZUFwcGVuZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBzdG9yZUFwcGVuZGVyCisgICAgICogICAgICAgICAgICBUaGUgc3RvcmVBcHBlbmRlciB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RvcmVBcHBlbmRlcihTdG9yZUFwcGVuZGVyIHN0b3JlQXBwZW5kZXIpIHsKKyAgICAgICAgdGhpcy5zdG9yZUFwcGVuZGVyID0gc3RvcmVBcHBlbmRlcjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHNldCBSZWdpc3RyeQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25maWcuSVN0b3JlRmFjdG9yeSNzZXRSZWdpc3RyeShvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5Db25maWd1cmF0aW9uUmVnaXN0cnkpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVnaXN0cnkoU3RvcmVSZWdpc3RyeSBhUmVnaXN0cnkpIHsKKyAgICAgICAgcmVnaXN0cnkgPSBhUmVnaXN0cnk7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIGdldCBSZWdpc3RyeQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25maWcuSVN0b3JlRmFjdG9yeSNnZXRSZWdpc3RyeSgpCisgICAgICovCisgICAgcHVibGljIFN0b3JlUmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7CisKKyAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlWE1MSGVhZChQcmludFdyaXRlciBhV3JpdGVyKSB7CisgICAgICAgIC8vIFN0b3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBlbGVtZW50CisgICAgICAgIGFXcml0ZXIucHJpbnQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiIpOworICAgICAgICBhV3JpdGVyLnByaW50KGdldFJlZ2lzdHJ5KCkuZ2V0RW5jb2RpbmcoKSk7CisgICAgICAgIGFXcml0ZXIucHJpbnRsbigiXCI/PiIpOworICAgIH0KKworICAgIC8qCisgICAgICogU3RvcmUgYSBzZXJ2ZXIueG1sIGVsZW1lbnQgd2l0aCBhdHRyaWJ1dGVzIGFuZCBjaGlsZHMKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSVN0b3JlRmFjdG9yeSNzdG9yZShqYXZhLmlvLlByaW50V3JpdGVyLAorICAgICAqICAgICAgaW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBhRWxlbWVudCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZWxlbWVudERlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICBhRWxlbWVudC5nZXRDbGFzcygpKTsKKworICAgICAgICBpZiAoZWxlbWVudERlc2MgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImZhY3Rvcnkuc3RvcmVUYWciLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudERlc2MuZ2V0VGFnKCksIGFFbGVtZW50KSk7CisgICAgICAgICAgICBnZXRTdG9yZUFwcGVuZGVyKCkucHJpbnRJbmRlbnQoYVdyaXRlciwgaW5kZW50ICsgMik7CisgICAgICAgICAgICBpZiAoIWVsZW1lbnREZXNjLmlzQ2hpbGRzKCkpIHsKKyAgICAgICAgICAgICAgICBnZXRTdG9yZUFwcGVuZGVyKCkucHJpbnRUYWcoYVdyaXRlciwgaW5kZW50LCBhRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnREZXNjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50T3BlblRhZyhhV3JpdGVyLCBpbmRlbnQgKyAyLCBhRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnREZXNjKTsKKyAgICAgICAgICAgICAgICBzdG9yZUNoaWxkcyhhV3JpdGVyLCBpbmRlbnQgKyAyLCBhRWxlbWVudCwgZWxlbWVudERlc2MpOworICAgICAgICAgICAgICAgIGdldFN0b3JlQXBwZW5kZXIoKS5wcmludEluZGVudChhV3JpdGVyLCBpbmRlbnQgKyAyKTsKKyAgICAgICAgICAgICAgICBnZXRTdG9yZUFwcGVuZGVyKCkucHJpbnRDbG9zZVRhZyhhV3JpdGVyLCBlbGVtZW50RGVzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nKCJmYWN0b3J5LnN0b3JlTm9EZXNjcmlwdG9yIiwgYUVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLmdldENsYXNzKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXN0IEltcGxlbWVudCBhdCBzdWJjbGFzcyBmb3Igc2VwemlhbCBzdG9yZSBjaGlsZHMgaGFuZGxpbmcKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVdyaXRlcgorICAgICAqIEBwYXJhbSBpbmRlbnQKKyAgICAgKiBAcGFyYW0gYUVsZW1lbnQKKyAgICAgKiBAcGFyYW0gZWxlbWVudERlc2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZUNoaWxkcyhQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LCBPYmplY3QgYUVsZW1lbnQsCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGVsZW1lbnREZXNjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSBvbmx5IGVsZW1lbnRzIGZyb20gc3RvcmVDaGlsZHMgbWV0aG9kcyB0aGF0IGFyZSBub3QgYSB0cmFuc2llbnQKKyAgICAgKiBjaGlsZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVdyaXRlcgorICAgICAqIEBwYXJhbSBpbmRlbnQKKyAgICAgKiBAcGFyYW0gYVRhZ0VsZW1lbnQKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0b3JlRWxlbWVudChQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LAorICAgICAgICAgICAgT2JqZWN0IGFUYWdFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGFUYWdFbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIElTdG9yZUZhY3RvcnkgZWxlbWVudEZhY3RvcnkgPSBnZXRSZWdpc3RyeSgpLmZpbmRTdG9yZUZhY3RvcnkoCisgICAgICAgICAgICAgICAgICAgIGFUYWdFbGVtZW50LmdldENsYXNzKCkpOworCisgICAgICAgICAgICBpZiAoZWxlbWVudEZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYyA9IGdldFJlZ2lzdHJ5KCkuZmluZERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgYVRhZ0VsZW1lbnQuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICAgICAgaWYgKCFkZXNjLmlzVHJhbnNpZW50Q2hpbGQoYVRhZ0VsZW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICBlbGVtZW50RmFjdG9yeS5zdG9yZShhV3JpdGVyLCBpbmRlbnQsIGFUYWdFbGVtZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nKCJmYWN0b3J5LnN0b3JlTm9EZXNjcmlwdG9yIiwgYVRhZ0VsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzcygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNhdmUgYSBhcnJheSBvZiBlbGVtZW50cyBAcGFyYW0gYVdyaXRlciBAcGFyYW0gaW5kZW50IEBwYXJhbSBlbGVtZW50cworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0b3JlRWxlbWVudEFycmF5KFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsCisgICAgICAgICAgICBPYmplY3RbXSBlbGVtZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChlbGVtZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3RvcmVFbGVtZW50KGFXcml0ZXIsIGluZGVudCwgZWxlbWVudHNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlRmFjdG9yeVJ1bGUuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlRmFjdG9yeVJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjg3MDczCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVGYWN0b3J5UnVsZS5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5SdWxlOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CisKKy8qKgorICogPHA+CisgKiBSdWxlIHRoYXQgY3JlYXRlcyBhIG5ldyA8Y29kZT5JU3RvcmVGYWN0b3J5PC9jb2RlPiBpbnN0YW5jZSwgYW5kIGFzc29jaWF0ZXMKKyAqIGl0IHdpdGggdGhlIHRvcCBvYmplY3Qgb24gdGhlIHN0YWNrICh3aGljaCBtdXN0IGltcGxlbWVudAorICogPGNvZGU+SVN0b3JlRmFjdG9yeTwvY29kZT4pLgorICogPC9wPgorICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKi8KKworcHVibGljIGNsYXNzIFN0b3JlRmFjdG9yeVJ1bGUgZXh0ZW5kcyBSdWxlIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgUnVsZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RvcmVGYWN0b3J5Q2xhc3MKKyAgICAgKiAgICAgICAgICAgIERlZmF1bHQgbmFtZSBvZiB0aGUgU3RvcmVGYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRvIGJlCisgICAgICogICAgICAgICAgICBjcmVhdGVkCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKKyAgICAgKiAgICAgICAgICAgIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IG9wdGlvbmFsbHkgaW5jbHVkZXMgYW4gb3ZlcnJpZGUKKyAgICAgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIElTdG9yZUZhY3RvcnkgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RvcmVGYWN0b3J5UnVsZShTdHJpbmcgc3RvcmVGYWN0b3J5Q2xhc3MsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLAorICAgICAgICAgICAgU3RyaW5nIHN0b3JlQXBwZW5kZXJDbGFzcywgU3RyaW5nIGFwcGVuZGVyQXR0cmlidXRlTmFtZSkgeworCisgICAgICAgIHRoaXMuc3RvcmVGYWN0b3J5Q2xhc3MgPSBzdG9yZUZhY3RvcnlDbGFzczsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsKKyAgICAgICAgdGhpcy5hcHBlbmRlckF0dHJpYnV0ZU5hbWUgPSBhcHBlbmRlckF0dHJpYnV0ZU5hbWU7CisgICAgICAgIHRoaXMuc3RvcmVBcHBlbmRlckNsYXNzID0gc3RvcmVBcHBlbmRlckNsYXNzOworCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXR0cmlidXRlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHRoYXQgY2FuIG92ZXJyaWRlIHRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAqIGNsYXNzIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlTmFtZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGFwcGVuZGVyQXR0cmlidXRlTmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSA8Y29kZT5JU3RvcmVGYWN0b3J5PC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzdG9yZUZhY3RvcnlDbGFzczsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0b3JlQXBwZW5kZXJDbGFzczsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogSGFuZGxlIHRoZSBiZWdpbm5pbmcgb2YgYW4gWE1MIGVsZW1lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMKKyAgICAgKiAgICAgICAgICAgIFRoZSBhdHRyaWJ1dGVzIG9mIHRoaXMgZWxlbWVudAorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYSBwcm9jZXNzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBJU3RvcmVGYWN0b3J5IGZhY3RvcnkgPSAoSVN0b3JlRmFjdG9yeSkgbmV3SW5zdGFuY2UoYXR0cmlidXRlTmFtZSwKKyAgICAgICAgICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcywgYXR0cmlidXRlcyk7CisgICAgICAgIFN0b3JlQXBwZW5kZXIgc3RvcmVBcHBlbmRlciA9IChTdG9yZUFwcGVuZGVyKSBuZXdJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBhcHBlbmRlckF0dHJpYnV0ZU5hbWUsIHN0b3JlQXBwZW5kZXJDbGFzcywgYXR0cmlidXRlcyk7CisgICAgICAgIGZhY3Rvcnkuc2V0U3RvcmVBcHBlbmRlcihzdG9yZUFwcGVuZGVyKTsKKworICAgICAgICAvLyBBZGQgdGhpcyBTdG9yZUZhY3RvcnkgdG8gb3VyIGFzc29jaWF0ZWQgY29tcG9uZW50CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYyA9IChTdG9yZURlc2NyaXB0aW9uKSBkaWdlc3Rlci5wZWVrKDApOworICAgICAgICBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gKFN0b3JlUmVnaXN0cnkpIGRpZ2VzdGVyLnBlZWsoMSk7CisgICAgICAgIGZhY3Rvcnkuc2V0UmVnaXN0cnkocmVnaXN0cnkpOworICAgICAgICBkZXNjLnNldFN0b3JlRmFjdG9yeShmYWN0b3J5KTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIGNyZWF0ZSBuZXcgaW5zdGFuY2UgZnJvbSBhdHRyaWJ0ZSBjbGFzc05hbWUhCisgICAgICogCisgICAgICogQHBhcmFtIGF0dHIgY2xhc3MgTmFtZSBhdHRyaWJ1dGUKKyAgICAgKiBAcGFyYW0gZGVmYXVsdE5hbWUgRGVmYXVsdCBDbGFzcworICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIGN1cnJlbnQgZGlnZXN0ZXIgYXR0cmlidXRlIGVsZW1lbnRzCisgICAgICogQHJldHVybiBuZXcgY29uZmlnIG9iamVjdCBpbnN0YW5jZQorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGF0dHIsIFN0cmluZyBkZWZhdWx0TmFtZSwKKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGRlZmF1bHROYW1lOworICAgICAgICBpZiAoYXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGF0dHIpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7CisgICAgICAgIHJldHVybiBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUZpbGVNb3Zlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVGaWxlTW92ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGZhZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVGaWxlTW92ZXIuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CisKKy8qKgorICogTW92ZSBzZXJ2ZXIueG1sIG9yIGNvbnRleHQueG1sIGFzIGJhY2t1cAorICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAKKyAqIFRPRE8gR2V0IEVuY29kaW5nIGZyb20gUmVnaXN0cnkKKyAqLworcHVibGljIGNsYXNzIFN0b3JlRmlsZU1vdmVyIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVuYW1lID0gImNvbmYvc2VydmVyLnhtbCI7CisKKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZyA9ICJVVEYtOCI7CisKKyAgICBwcml2YXRlIFN0cmluZyBiYXNlbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpOworCisgICAgcHJpdmF0ZSBGaWxlIGNvbmZpZ09sZDsKKworICAgIHByaXZhdGUgRmlsZSBjb25maWdOZXc7CisKKyAgICBwcml2YXRlIEZpbGUgY29uZmlnU2F2ZTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29uZmlnTmV3LgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldENvbmZpZ05ldygpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ05ldzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbmZpZ09sZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRDb25maWdPbGQoKSB7CisgICAgICAgIHJldHVybiBjb25maWdPbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb25maWdTYXZlLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldENvbmZpZ1NhdmUoKSB7CisgICAgICAgIHJldHVybiBjb25maWdTYXZlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYmFzZW5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRCYXNlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGJhc2VuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBiYXNlbmFtZQorICAgICAqICAgICAgICAgICAgVGhlIGJhc2VuYW1lIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlbmFtZShTdHJpbmcgYmFzZW5hbWUpIHsKKyAgICAgICAgdGhpcy5iYXNlbmFtZSA9IGJhc2VuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGZpbGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZW5hbWUoKSB7CisgICAgICAgIHJldHVybiBmaWxlbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZW5hbWUoU3RyaW5nIHN0cmluZykgeworICAgICAgICBmaWxlbmFtZSA9IHN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBlbmNvZGluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7CisgICAgICAgIHJldHVybiBlbmNvZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIHN0cmluZykgeworICAgICAgICBlbmNvZGluZyA9IHN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGUgZmlsZSBvYmplY3RzIGZvciB0aGUgb2xkIGFuZCBuZXcgY29uZmlndXJhdGlvbiBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RvcmVGaWxlTW92ZXIoU3RyaW5nIGJhc2VuYW1lLCBTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBlbmNvZGluZykgeworICAgICAgICBzZXRCYXNlbmFtZShiYXNlbmFtZSk7CisgICAgICAgIHNldEVuY29kaW5nKGVuY29kaW5nKTsKKyAgICAgICAgc2V0RmlsZW5hbWUoZmlsZW5hbWUpOworICAgICAgICBpbml0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIGZpbGUgb2JqZWN0cyBmb3IgdGhlIG9sZCBhbmQgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgICAgICovCisgICAgcHVibGljIFN0b3JlRmlsZU1vdmVyKCkgeworICAgICAgICBpbml0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2VuZXJhdGUgdGhlIEZpbGVuYW1lIHRvIG5ldyB3aXRoIFRpbWVTdGFtcAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIFN0cmluZyBjb25maWdGaWxlID0gZ2V0RmlsZW5hbWUoKTsKKyAgICAgICAgY29uZmlnT2xkID0gbmV3IEZpbGUoY29uZmlnRmlsZSk7CisgICAgICAgIGlmICghY29uZmlnT2xkLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgY29uZmlnT2xkID0gbmV3IEZpbGUoZ2V0QmFzZW5hbWUoKSwgY29uZmlnRmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgY29uZmlnTmV3ID0gbmV3IEZpbGUoY29uZmlnRmlsZSArICIubmV3Iik7CisgICAgICAgIGlmICghY29uZmlnTmV3LmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgY29uZmlnTmV3ID0gbmV3IEZpbGUoZ2V0QmFzZW5hbWUoKSwgY29uZmlnRmlsZSArICIubmV3Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb25maWdOZXcuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpKSB7CisgICAgICAgICAgICBjb25maWdOZXcuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBzYiA9IGdldFRpbWVUYWcoKTsKKyAgICAgICAgY29uZmlnU2F2ZSA9IG5ldyBGaWxlKGNvbmZpZ0ZpbGUgKyBzYik7CisgICAgICAgIGlmICghY29uZmlnU2F2ZS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgIGNvbmZpZ1NhdmUgPSBuZXcgRmlsZShnZXRCYXNlbmFtZSgpLCBjb25maWdGaWxlICsgc2IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2h1ZmZsZSBvbGQtPnNhdmUgYW5kIG5ldy0+b2xkCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1vdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoY29uZmlnT2xkLnJlbmFtZVRvKGNvbmZpZ1NhdmUpKSB7CisgICAgICAgICAgICBpZiAoIWNvbmZpZ05ldy5yZW5hbWVUbyhjb25maWdPbGQpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnU2F2ZS5yZW5hbWVUbyhjb25maWdPbGQpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IHJlbmFtZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGNvbmZpZ05ldy5nZXRBYnNvbHV0ZVBhdGgoKSArICIgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBjb25maWdPbGQuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFjb25maWdPbGQuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ05ldy5yZW5hbWVUbyhjb25maWdPbGQpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IG1vdmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29uZmlnTmV3LmdldEFic29sdXRlUGF0aCgpICsgIiB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb25maWdPbGQuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgcmVuYW1lICIKKyAgICAgICAgICAgICAgICAgICAgKyBjb25maWdPbGQuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIHRvICIKKyAgICAgICAgICAgICAgICAgICAgKyBjb25maWdTYXZlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW4gYW4gb3V0cHV0IHdyaXRlciBmb3IgdGhlIG5ldyBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSB3cml0ZXIKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcigKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0oY29uZmlnTmV3KSwgZ2V0RW5jb2RpbmcoKSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgKGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3cml0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGltZSB2YWx1ZSBmb3IgYmFja3VwIHl5eXktbW0tZGQuaGgtbW0tc3MKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSB0aW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUaW1lVGFnKCkgeworICAgICAgICBTdHJpbmcgdHMgPSAobmV3IFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpLnRvU3RyaW5nKCk7CisgICAgICAgIC8vICAgICAgICB5eXl5LW1tLWRkIGhoOm1tOnNzCisgICAgICAgIC8vICAgICAgICAwMTIzNDU2Nzg5MDEyMzQ1Njc4CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIi4iKTsKKyAgICAgICAgc2IuYXBwZW5kKHRzLnN1YnN0cmluZygwLCAxMCkpOworICAgICAgICBzYi5hcHBlbmQoJy4nKTsKKyAgICAgICAgc2IuYXBwZW5kKHRzLnN1YnN0cmluZygxMSwgMTMpKTsKKyAgICAgICAgc2IuYXBwZW5kKCctJyk7CisgICAgICAgIHNiLmFwcGVuZCh0cy5zdWJzdHJpbmcoMTQsIDE2KSk7CisgICAgICAgIHNiLmFwcGVuZCgnLScpOworICAgICAgICBzYi5hcHBlbmQodHMuc3Vic3RyaW5nKDE3LCAxOSkpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlTG9hZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NDc3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUxvYWRlci5qYXZhCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAKKyAqIDxiPlhNTCBGb3JtYXQgPC9iPgorICogCisgKiA8cHJlPgorICogICAgCisgKiAgICAgICAmbHQ7UmVnaXN0cnkgbmFtZT0mcXVvdDsmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGOCZxdW90OyAmZ3Q7CisgKiAgICAgICAmbHQ7RGVzY3JpcHRpb24gdGFnPSZxdW90O1NlcnZlciZxdW90OyBzdGFuZGFyZD0mcXVvdDt0cnVlJnF1b3Q7IGRlZmF1bHQ9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7IAorICogICAgICAgICAgdGFnQ2xhc3M9JnF1b3Q7b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyJnF1b3Q7CisgKiAgICAgICAgICBzdG9yZUZhY3Rvcnk9JnF1b3Q7b3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdGFuZGFyZFNlcnZlclNGJnF1b3Q7Jmd0OworICogICAgICAgICZsdDtUcmFuc2llbnRBdHRyaWJ1dGVzJmd0OworICogICAgICAgICAgJmx0O0F0dHJpYnV0ZSZndDsmbHQ7L0F0dHJpYnV0ZSZndDsKKyAqICAgICAgICAmbHQ7L1RyYW5zaWVudEF0dHJpYnV0ZXMmZ3Q7CisgKiAgICAgICAgJmx0O1RyYW5zaWVudENoaWxkcyZndDsKKyAqICAgICAgICAgICZsdDtDaGlsZCZndDsmbHQ7L0NoaWxkJmd0OworICogICAgICAgICZsdDsvVHJhbnNpZW50Q2hpbGRzJmd0OworICogICAgICAgJmx0Oy9EZXNjcmlwdGlvbiZndDsKKyAqICAgLi4uCisgKiAgICAgICAmbHQ7L1RlZ2lzdHJ5Jmd0OworICogICAgIAorICogPC9wcmU+CisgKiAKKyAqIAorICogQ29udmVudGlvbjoKKyAqIDx1bD4KKyAqIDxsaT5GYWN0b3JpZXMgYXQgc3VicGFja2FnZSA8aT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuc3RvcmVjb25maWcueHh4U0YKKyAqIDwvaT4uPC9saT4KKyAqIDxsaT5FbGVtZW50IG5hbWUgYXJlIHRoZSB1bmlxdWUgQ2xhc3MgbmFtZTwvbGk+CisgKiA8bGk+U0YgZm9yIFN0b3JlRmFjdG9yeTwvbGk+CisgKiA8bGk+c3RhbmRhcmQgaW1wbGVtZW50YXRpb24gaXMgZmFsc2U8L2xpPgorICogPC91bD4KKyAqIG90aGVyIHRoaW5nczoKKyAqIDx1bD4KKyAqIDxsaT5SZWdpc3RyeSBYTUwgZm9ybWF0IGlzIGEgdmVyeSBnb29kIG9wdGlvbjwvbGk+CisgKiA8bGk+U3RvcmUgZm9ybWF0IGlzIG5vdCBmaXg8L2xpPgorICogPGxpPldlIGhvcGUgd2l0aCB0aGUgcGFyZW50IGRlY2xhcmF0aW9uIHdlIGNhbiBidWlsZCByZWN1cnNpdmUgY2hpbGQgc3RvcmUKKyAqIG9wZXJhdGlvbiAvL2RyZWFtPC9saT4KKyAqIDxsaT5Qcm9ibGVtIGlzIHRvIGFjY2VzcyBjaGlsZCBkYXRhIGZyb20gYXJyYXksY29sbGVjdGlvbnMgb3Igbm9ybWFsIGRldGFpbAorICogb2JqZWN0PC9saT4KKyAqIDxsaT5EZWZhdWx0IGRlZmluaXRpb25zIGZvciBMaXN0ZW5lciwgVmFsdmUgUmVzb3VyY2U/IC0gQmFzZWQgb24gaW50ZXJmYWNlCisgKiB0eXBlITwvbGk+CisgKiA8L3VsPgorICovCitwdWJsaWMgY2xhc3MgU3RvcmVMb2FkZXIgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTdG9yZUxvYWRlci5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IGluc3RhbmNlIHVzZWQgdG8gcGFyc2UgcmVnaXN0cnkgZGVzY3JpcHRvcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBEaWdlc3RlciBkaWdlc3RlciA9IGNyZWF0ZURpZ2VzdGVyKCk7CisKKyAgICBwcml2YXRlIFN0b3JlUmVnaXN0cnkgcmVnaXN0cnk7CisgICAgCisgICAgcHJpdmF0ZSBVUkwgcmVnaXN0cnlSZXNvdXJjZSA7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlZ2lzdHJ5LgorICAgICAqLworICAgIHB1YmxpYyBTdG9yZVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCkgeworICAgICAgICByZXR1cm4gcmVnaXN0cnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHJlZ2lzdHJ5CisgICAgICogICAgICAgICAgICBUaGUgcmVnaXN0cnkgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZ2lzdHJ5KFN0b3JlUmVnaXN0cnkgcmVnaXN0cnkpIHsKKyAgICAgICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgY29uZmlndXJlIHRoZSBEaWdlc3RlciB3ZSB3aWxsIGJlIHVzaW5nIGZvciBzZXR1cCBzdG9yZQorICAgICAqIHJlZ2lzdHJ5LgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgRGlnZXN0ZXIgY3JlYXRlRGlnZXN0ZXIoKSB7CisgICAgICAgIGxvbmcgdDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZGlnZXN0ZXIKKyAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBuZXcgRGlnZXN0ZXIoKTsKKyAgICAgICAgZGlnZXN0ZXIuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisgICAgICAgIGRpZ2VzdGVyLnNldENsYXNzTG9hZGVyKFN0b3JlUmVnaXN0cnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisKKyAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBhY3Rpb25zIHdlIHdpbGwgYmUgdXNpbmcKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJSZWdpc3RyeSIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVSZWdpc3RyeSIsICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcygiUmVnaXN0cnkiKTsKKyAgICAgICAgZGlnZXN0ZXIKKyAgICAgICAgICAgICAgICAuYWRkT2JqZWN0Q3JlYXRlKCJSZWdpc3RyeS9EZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZURlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcygiUmVnaXN0cnkvRGVzY3JpcHRpb24iKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZSgiUmVnaXN0cnkvRGVzY3JpcHRpb24iLCBuZXcgU3RvcmVGYWN0b3J5UnVsZSgKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwKKyAgICAgICAgICAgICAgICAic3RvcmVGYWN0b3J5Q2xhc3MiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlQXBwZW5kZXIiLAorICAgICAgICAgICAgICAgICJzdG9yZUFwcGVuZGVyQ2xhc3MiKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoIlJlZ2lzdHJ5L0Rlc2NyaXB0aW9uIiwgInJlZ2lzdGVyRGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRGVzY3JpcHRpb24iKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiUmVnaXN0cnkvRGVzY3JpcHRpb24vVHJhbnNpZW50QXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAiYWRkVHJhbnNpZW50QXR0cmlidXRlIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoIlJlZ2lzdHJ5L0Rlc2NyaXB0aW9uL1RyYW5zaWVudENoaWxkIiwKKyAgICAgICAgICAgICAgICAiYWRkVHJhbnNpZW50Q2hpbGQiLCAwKTsKKworICAgICAgICBsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGlnZXN0ZXIgZm9yIHNlcnZlci1yZWdpc3RyeS54bWwgY3JlYXRlZCAiICsgKHQyIC0gdDEpKTsKKyAgICAgICAgcmV0dXJuIChkaWdlc3Rlcik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYUZpbGUKKyAgICAgKiBAcmV0dXJuIFRoZSBzZXJ2ZXIgZmlsZQorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIHNlcnZlckZpbGUoU3RyaW5nIGFGaWxlKSB7CisKKyAgICAgICAgaWYgKGFGaWxlID09IG51bGwgfHwgKGFGaWxlICE9IG51bGwgJiYgYUZpbGUubGVuZ3RoKCkgPCAxKSkKKyAgICAgICAgICAgIGFGaWxlID0gInNlcnZlci1yZWdpc3RyeS54bWwiOworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShhRmlsZSk7CisgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIikgKyAiL2NvbmYiLAorICAgICAgICAgICAgICAgICAgICBhRmlsZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaWxlID0gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGZpbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgRGVzY3JpcHRpb24gZnJvbSBleHRlcm5hbCBzb3VyY2UKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVVSTAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWQoU3RyaW5nIGFVUkwpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChkaWdlc3RlcikgeworICAgICAgICAgICAgRmlsZSBhUmVnaXN0cnlGaWxlID0gc2VydmVyRmlsZShhVVJMKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVnaXN0cnkgPSAoU3RvcmVSZWdpc3RyeSkgZGlnZXN0ZXIucGFyc2UoYVJlZ2lzdHJ5RmlsZSk7CisgICAgICAgICAgICAgICAgcmVnaXN0cnlSZXNvdXJjZSA9IGFSZWdpc3RyeUZpbGUudG9VUkwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7CisgICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCBmcm9tIGRlZmF1bHRzCisgICAgICogPHVsPgorICAgICAqIDxsaT5TeXN0ZW0gUHJvcGVydHkgVVJMIGNhdGFsaW5hLnN0b3JlcmVnaXN0cnk8L2xpPgorICAgICAqIDxsaT5GaWxlICRjYXRhbGluYS5iYXNlL2NvbmYvc2VydmVyLXJlZ2lzdHJ5LnhtbDwvbGk+CisgICAgICogPGxpPmNsYXNzIHJlc291cmNlIG9yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvc2VydmVyLXJlZ2lzdHJ5LnhtbAorICAgICAqIDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkKCkgeworCisgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgVGhyb3dhYmxlIGVycm9yID0gbnVsbDsKKyAgICAgICAgcmVnaXN0cnlSZXNvdXJjZSA9IG51bGwgOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGNvbmZpZ1VybCA9IGdldENvbmZpZ1VybCgpOworICAgICAgICAgICAgaWYgKGNvbmZpZ1VybCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaXMgPSAobmV3IFVSTChjb25maWdVcmwpKS5vcGVuU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbmZvKCJGaW5kIHJlZ2lzdHJ5IHNlcnZlci1yZWdpc3RyeS54bWwgZnJvbSBzeXN0ZW0gcHJvcGVydHkgYXQgdXJsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29uZmlnVXJsKTsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgcmVnaXN0cnlSZXNvdXJjZSA9IG5ldyBVUkwoY29uZmlnVXJsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICB9CisgICAgICAgIGlmIChpcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpbGUgaG9tZSA9IG5ldyBGaWxlKGdldENhdGFsaW5hQmFzZSgpKTsKKyAgICAgICAgICAgICAgICBGaWxlIGNvbmYgPSBuZXcgRmlsZShob21lLCAiY29uZiIpOworICAgICAgICAgICAgICAgIEZpbGUgcmVnID0gbmV3IEZpbGUoY29uZiwgInNlcnZlci1yZWdpc3RyeS54bWwiKTsKKyAgICAgICAgICAgICAgICBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVnKTsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkZpbmQgcmVnaXN0cnkgc2VydmVyLXJlZ2lzdHJ5LnhtbCBhdCBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlZy5nZXRDYW5vbmljYWxQYXRoKCkpOworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICByZWdpc3RyeVJlc291cmNlID0gcmVnLnRvVVJMKCkgOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpcyA9IFN0b3JlTG9hZGVyLmNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvc2VydmVyLXJlZ2lzdHJ5LnhtbCIpOworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5mbygiRmluZCByZWdpc3RyeSBzZXJ2ZXItcmVnaXN0cnkueG1sIGF0IGNsYXNzcGF0aCByZXNvdXJjZSIpOworICAgICAgICAgICAgICAgIHJlZ2lzdHJ5UmVzb3VyY2UgPSBTdG9yZUxvYWRlci5jbGFzcworICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2UoIi9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL3NlcnZlci1yZWdpc3RyeS54bWwiKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChkaWdlc3RlcikgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RyeSA9IChTdG9yZVJlZ2lzdHJ5KSBkaWdlc3Rlci5wYXJzZShpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IHQ7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGlzID09IG51bGwpIHx8IChlcnJvciAhPSBudWxsKSkgeworICAgICAgICAgICAgbG9nLmVycm9yKGVycm9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGNhdGFsaW5hLmhvbWUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENhdGFsaW5hSG9tZSgpIHsKKyAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuaG9tZSIsIFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgY2F0YWxpbmEuYmFzZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2F0YWxpbmFCYXNlKCkgeworICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiwgZ2V0Q2F0YWxpbmFIb21lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gVVJMLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDb25maWdVcmwoKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLnN0b3JlY29uZmlnIik7CisgICAgfQorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByZWdpc3RyeVJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBVUkwgZ2V0UmVnaXN0cnlSZXNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5UmVzb3VyY2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVSZWdpc3RyeS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVSZWdpc3RyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MDg1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZVJlZ2lzdHJ5LmphdmEKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2F0YWxpbmFDbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3RlckRlcGxveWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxSZWNlaXZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsU2VuZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcnNoaXBTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lc3NhZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLyoqCisgKiBDZW50cmFsIFN0b3JlUmVnaXN0cnkgZm9yIGFsbCBzZXJ2ZXIueG1sIGVsZW1lbnRzCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqICAKKyAqLworcHVibGljIGNsYXNzIFN0b3JlUmVnaXN0cnkgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTdG9yZVJlZ2lzdHJ5LmNsYXNzKTsKKworICAgIHByaXZhdGUgTWFwIGRlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nID0gIlVURi04IjsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBwcml2YXRlIFN0cmluZyB2ZXJzaW9uOworCisgICAgLy8gQWNjZXNzIEluZm9ybWF0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgaW50ZXJmYWNlc1tdID0geyBDYXRhbGluYUNsdXN0ZXIuY2xhc3MsCisgICAgICAgICAgICBDaGFubmVsU2VuZGVyLmNsYXNzLCBDaGFubmVsUmVjZWl2ZXIuY2xhc3MsCisgICAgICAgICAgICBNZW1iZXJzaGlwU2VydmljZS5jbGFzcywgQ2x1c3RlckRlcGxveWVyLmNsYXNzLCBSZWFsbS5jbGFzcywKKyAgICAgICAgICAgIE1hbmFnZXIuY2xhc3MsIERpckNvbnRleHQuY2xhc3MsIExpZmVjeWNsZUxpc3RlbmVyLmNsYXNzLAorICAgICAgICAgICAgVmFsdmUuY2xhc3MsIE1lc3NhZ2VMaXN0ZW5lci5jbGFzcyB9OworCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB2ZXJzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIHZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHZlcnNpb24KKyAgICAgKiAgICAgICAgICAgIFRoZSB2ZXJzaW9uIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBhIGRlc2NyaXB0aW9uIGZvciBpZC4gSGFuZGxlIGludGVyZmFjZSBzZWFyY2ggd2hlbiBubyBkaXJlY3QgbWF0Y2gKKyAgICAgKiBmb3VuZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBTdG9yZURlc2NyaXB0aW9uIGZpbmREZXNjcmlwdGlvbihTdHJpbmcgaWQpIHsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJzZWFyY2ggZGVzY3JpcHRvciAiICsgaWQpOworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2MgPSAoU3RvcmVEZXNjcmlwdGlvbikgZGVzY3JpcHRvcnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKGRlc2MgPT0gbnVsbCkgeworICAgICAgICAgICAgQ2xhc3MgYUNsYXNzID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYUNsYXNzID0gQ2xhc3MuZm9yTmFtZShpZCwgdHJ1ZSwgdGhpcy5nZXRDbGFzcygpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNsYXNzTmFtZToiICsgaWQsIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVzYyA9IChTdG9yZURlc2NyaXB0aW9uKSBkZXNjcmlwdG9ycy5nZXQoYUNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGRlc2MgPT0gbnVsbCAmJiBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlc1tpXS5pc0Fzc2lnbmFibGVGcm9tKGFDbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSAoU3RvcmVEZXNjcmlwdGlvbikgZGVzY3JpcHRvcnMuZ2V0KGludGVyZmFjZXNbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgaWYgKGRlc2MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoImZpbmQgZGVzY3JpcHRvciAiICsgaWQgKyAiIyIgKyBkZXNjLmdldFRhZygpICsgIiMiCisgICAgICAgICAgICAgICAgICAgICAgICArIGRlc2MuZ2V0U3RvcmVGYWN0b3J5Q2xhc3MoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCgiQ2FuJ3QgZmluZCBkZXNjcmlwdG9yIGZvciBrZXkgIiArIGlkKSk7CisgICAgICAgIHJldHVybiBkZXNjOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgRGVzY3JpcHRpb24gYnkgY2xhc3MKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYUNsYXNzCisgICAgICogQHJldHVybiBUaGUgZGVzY3JpcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RvcmVEZXNjcmlwdGlvbiBmaW5kRGVzY3JpcHRpb24oQ2xhc3MgYUNsYXNzKSB7CisgICAgICAgIHJldHVybiBmaW5kRGVzY3JpcHRpb24oYUNsYXNzLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBmYWN0b3J5IGZyb20gY2xhc3NuYW1lCisgICAgICogCisgICAgICogQHBhcmFtIGFDbGFzc05hbWUKKyAgICAgKiBAcmV0dXJuIFRoZSBmYWN0b3J5CisgICAgICovCisgICAgcHVibGljIElTdG9yZUZhY3RvcnkgZmluZFN0b3JlRmFjdG9yeShTdHJpbmcgYUNsYXNzTmFtZSkgeworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2MgPSBmaW5kRGVzY3JpcHRpb24oYUNsYXNzTmFtZSk7CisgICAgICAgIGlmIChkZXNjICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZGVzYy5nZXRTdG9yZUZhY3RvcnkoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmaW5kIGZhY3RvcnkgZnJvbSBjbGFzcworICAgICAqIAorICAgICAqIEBwYXJhbSBhQ2xhc3MKKyAgICAgKiBAcmV0dXJuIFRoZSBmYWN0b3J5CisgICAgICovCisgICAgcHVibGljIElTdG9yZUZhY3RvcnkgZmluZFN0b3JlRmFjdG9yeShDbGFzcyBhQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIGZpbmRTdG9yZUZhY3RvcnkoYUNsYXNzLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBuZXcgZGVzY3JpcHRpb24KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGVzY3JpcHRpb24oU3RvcmVEZXNjcmlwdGlvbiBkZXNjKSB7CisgICAgICAgIFN0cmluZyBrZXkgPSBkZXNjLmdldElkKCk7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCAiIi5lcXVhbHMoa2V5KSkKKyAgICAgICAgICAgIGtleSA9IGRlc2MuZ2V0VGFnQ2xhc3MoKTsKKyAgICAgICAgZGVzY3JpcHRvcnMucHV0KGtleSwgZGVzYyk7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygicmVnaXN0ZXIgc3RvcmUgZGVzY3JpcHRvciAiICsga2V5ICsgIiMiICsgZGVzYy5nZXRUYWcoKQorICAgICAgICAgICAgICAgICAgICArICIjIiArIGRlc2MuZ2V0VGFnQ2xhc3MoKSk7CisgICAgfQorCisgICAgcHVibGljIFN0b3JlRGVzY3JpcHRpb24gdW5yZWdpc3RlckRlc2NyaXB0aW9uKFN0b3JlRGVzY3JpcHRpb24gZGVzYykgeworICAgICAgICBTdHJpbmcga2V5ID0gZGVzYy5nZXRJZCgpOworICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwgIiIuZXF1YWxzKGtleSkpCisgICAgICAgICAgICBrZXkgPSBkZXNjLmdldFRhZ0NsYXNzKCk7CisgICAgICAgIHJldHVybiAoU3RvcmVEZXNjcmlwdGlvbikgZGVzY3JpcHRvcnMucmVtb3ZlKGtleSk7CisgICAgfQorCisgICAgLy8gQXR0cmlidXRlcworCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgZW5jb2RpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgeworICAgICAgICByZXR1cm4gZW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHN0cmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgZW5jb2RpbmcgPSBzdHJpbmc7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9XYXRjaGVkUmVzb3VyY2VTRi5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvV2F0Y2hlZFJlc291cmNlU0YuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjk2ODcxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvV2F0Y2hlZFJlc291cmNlU0YuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogIAorICovCitwdWJsaWMgY2xhc3MgV2F0Y2hlZFJlc291cmNlU0YgZXh0ZW5kcyBTdG9yZUZhY3RvcnlCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coV2F0Y2hlZFJlc291cmNlU0YuY2xhc3MpOworCisgICAgLyoKKyAgICAgKiBTdG9yZSBuZXN0ZWQgRWxlbWVudCBWYWx1ZSBBcnJheXMgV2F0Y2hlZFJlc291cmNlCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5JU3RvcmVGYWN0b3J5I3N0b3JlKGphdmEuaW8uUHJpbnRXcml0ZXIsCisgICAgICogICAgICBpbnQsIGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmUoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFFbGVtZW50KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhRWxlbWVudCBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCkgeworICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBlbGVtZW50RGVzYyA9IGdldFJlZ2lzdHJ5KCkuZmluZERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBhRWxlbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIuW1dhdGNoZWRSZXNvdXJjZV0iKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHJlc291cmNlcyA9ICgoU3RhbmRhcmRDb250ZXh0KSBhRWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICAgLmZpbmRXYXRjaGVkUmVzb3VyY2VzKCk7CisgICAgICAgICAgICBpZiAoZWxlbWVudERlc2MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzdG9yZSAiICsgZWxlbWVudERlc2MuZ2V0VGFnKCkgKyAiKCAiICsgYUVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgKSIpOworICAgICAgICAgICAgICAgIGdldFN0b3JlQXBwZW5kZXIoKS5wcmludFRhZ0FycmF5KGFXcml0ZXIsICJXYXRjaGVkUmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50LCByZXNvdXJjZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGxvZy53YXJuKCJEZXNjcmlwdG9yIGZvciBlbGVtZW50IiArIGFFbGVtZW50LmdldENsYXNzKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiLltXYXRjaGVkUmVzb3VyY2VdIG5vdCBjb25maWd1cmVkISIpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9XcmFwcGVyTGlmZWN5Y2xlU0YuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1dyYXBwZXJMaWZlY3ljbGVTRi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZTIzNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9XcmFwcGVyTGlmZWN5Y2xlU0YuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogIAorICovCitwdWJsaWMgY2xhc3MgV3JhcHBlckxpZmVjeWNsZVNGIGV4dGVuZHMgU3RvcmVGYWN0b3J5QmFzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFdyYXBwZXJMaWZlY3ljbGVTRi5jbGFzcyk7CisKKyAgICAvKgorICAgICAqIFN0b3JlIG5lc3RlZCBFbGVtZW50IFZhbHVlIEFycmF5cworICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25maWcuSVN0b3JlRmFjdG9yeSNzdG9yZShqYXZhLmlvLlByaW50V3JpdGVyLAorICAgICAqICAgICAgaW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBhRWxlbWVudCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoYUVsZW1lbnQgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQpIHsKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZWxlbWVudERlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgYUVsZW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLltXcmFwcGVyTGlmZWN5Y2xlXSIpOworICAgICAgICAgICAgU3RyaW5nW10gbGlzdGVuZXJzID0gKChTdGFuZGFyZENvbnRleHQpIGFFbGVtZW50KQorICAgICAgICAgICAgICAgICAgICAuZmluZFdyYXBwZXJMaWZlY3ljbGVzKCk7CisgICAgICAgICAgICBpZiAoZWxlbWVudERlc2MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzdG9yZSAiICsgZWxlbWVudERlc2MuZ2V0VGFnKCkgKyAiKCAiICsgYUVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgKSIpOworICAgICAgICAgICAgICAgIGdldFN0b3JlQXBwZW5kZXIoKS5wcmludFRhZ0FycmF5KGFXcml0ZXIsICJXcmFwcGVyTGlmZWN5Y2xlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCwgbGlzdGVuZXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBsb2cud2FybigiRGVzY3JpcHRvciBmb3IgZWxlbWVudCIgKyBhRWxlbWVudC5nZXRDbGFzcygpCisgICAgICAgICAgICAgICAgICAgICsgIi5bV3JhcHBlckxpZmVjeWNsZV0gbm90IGNvbmZpZ3VyZWQhIik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1dyYXBwZXJMaXN0ZW5lclNGLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9XcmFwcGVyTGlzdGVuZXJTRi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZWVlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9XcmFwcGVyTGlzdGVuZXJTRi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoIChwZXJvQGFwYWNoZS5vcmcpCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBXcmFwcGVyTGlzdGVuZXJTRiBleHRlbmRzIFN0b3JlRmFjdG9yeUJhc2UgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhXcmFwcGVyTGlzdGVuZXJTRi5jbGFzcyk7CisKKyAgICAvKgorICAgICAqIFN0b3JlIG5lc3RlZCBFbGVtZW50IFZhbHVlIEFycmF5cworICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25maWcuSVN0b3JlRmFjdG9yeSNzdG9yZShqYXZhLmlvLlByaW50V3JpdGVyLAorICAgICAqICAgICAgaW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBhRWxlbWVudCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoYUVsZW1lbnQgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQpIHsKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZWxlbWVudERlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgYUVsZW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLltXcmFwcGVyTGlzdGVuZXJdIik7CisgICAgICAgICAgICBTdHJpbmdbXSBsaXN0ZW5lcnMgPSAoKFN0YW5kYXJkQ29udGV4dCkgYUVsZW1lbnQpCisgICAgICAgICAgICAgICAgICAgIC5maW5kV3JhcHBlckxpc3RlbmVycygpOworICAgICAgICAgICAgaWYgKGVsZW1lbnREZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zygic3RvcmUgIiArIGVsZW1lbnREZXNjLmdldFRhZygpICsgIiggIiArIGFFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICkiKTsKKyAgICAgICAgICAgICAgICBnZXRTdG9yZUFwcGVuZGVyKCkucHJpbnRUYWdBcnJheShhV3JpdGVyLCAiV3JhcHBlckxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCwgbGlzdGVuZXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBsb2cud2FybigiRGVzY3JpcHRvciBmb3IgZWxlbWVudCIgKyBhRWxlbWVudC5nZXRDbGFzcygpCisgICAgICAgICAgICAgICAgICAgICsgIi5bV3JhcHBlckxpc3RlbmVyXSBub3QgY29uZmlndXJlZCEiKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL21iZWFucy1kZXNjcmlwdG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4NTQwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSw3NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8bWJlYW5zLWRlc2NyaXB0b3JzPgorCisgIDxtYmVhbiAgICAgICAgIG5hbWU9IlN0b3JlQ29uZmlnIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJJbXBsZW1lbnRhdGlvbiBvZiBhIHN0b3JlIHNlcnZlci54bWwgY29uZmlnIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iU3RvcmVDb25maWciCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVDb25maWciPgorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcmVDb25maWciIAorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0b3JlIFNlcnZlciIgCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIgcmV0dXJuVHlwZT0idm9pZCIgLz4KKyAgICA8b3BlcmF0aW9uIG5hbWU9InN0b3JlU2VydmVyIiAKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdG9yZSBTZXJ2ZXIgZnJvbSBPYmplY3ROYW1lIiAKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiA+CisgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im9iamVjdG5hbWUiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJPYmplY3RuYW1lIGZyb20gU2VydmVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBkZWZhdWx0PSJDYXRhbGluYTp0eXBlPVNlcnZlciIvPgorICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJiYWNrdXAiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJzdG9yZSBDb250ZXh0IHdpdGggYmFja3VwIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImV4dGVybmFsQWxsb3dlZCIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InN0b3JlIGFsbCBDb250ZXh0IGV4dGVybmFsIHRoYXQgaGF2ZSBhIGNvbmZpZ0ZpbGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICA8L29wZXJhdGlvbj4KKworPCEtLQorICAgQ2F0YWxpbmE6ajJlZVR5cGU9V2ViTW9kdWxlLG5hbWU9Ly9sb2NhbGhvc3QvbWFuYWdlcixKMkVFQXBwbGljYXRpb249bm9uZSxKMkVFU2VydmVyPW5vbmUKKy0tPgorICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9yZUNvbnRleHQiIAorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0b3JlIENvbnRleHQgZnJvbSBPYmplY3ROYW1lIiAKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiA+CisgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im9iamVjdG5hbWUiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJPYmplY3ROYW1lIGZyb20gQ29udGV4dCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJiYWNrdXAiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJzdG9yZSB3aXRoIEJhY2t1cCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJleHRlcm5hbEFsbG93ZWQiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJzdG9yZSBhbGwgb3Igc3RvcmUgb25seSBpbnRlcm5hbCBzZXJ2ZXIueG1sIGNvbnRleHQgKGNvbmZpZ0ZpbGUgPT0gbnVsbCkiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICA8L29wZXJhdGlvbj4gICAgICAgICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcmUiIAorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0b3JlIFNlcnZlciIgCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIgcmV0dXJuVHlwZT0idm9pZCIgPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VydmVyIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU2VydmVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlciIKKyAgICAgICAgICAgICAgICAgLz4KKyAgICA8L29wZXJhdGlvbj4gICAgICAgICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcmUiIAorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0b3JlIENvbnRleHQiIAorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiID4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb250ZXh0IgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbnRleHQiLz4KKyAgICA8L29wZXJhdGlvbj4gICAgICAgICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcmUiIAorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0b3JlIEhvc3QiIAorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiID4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Imhvc3QiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJIb3N0IgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3QiLz4KKyAgICA8L29wZXJhdGlvbj4gICAgICAgICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcmUiIAorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0b3JlIFNlcnZpY2UiIAorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiID4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InNlcnZpY2UiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJzZXJ2aWNlIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZpY2UiLz4KKyAgICA8L29wZXJhdGlvbj4gICAgICAgICAgIAorIAorICA8L21iZWFuPgorCis8L21iZWFucy1kZXNjcmlwdG9ycz4KKworCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9zZXJ2ZXItcmVnaXN0cnkueG1sIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvc2VydmVyLXJlZ2lzdHJ5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODE4NDFhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvc2VydmVyLXJlZ2lzdHJ5LnhtbApAQCAtMCwwICsxLDMzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxSZWdpc3RyeSBuYW1lPSJUb21jYXQiIHZlcnNpb249IjUuNS41IiBlbmNvZGluZz0iVVRGLTgiID4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iU2VydmVyIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0idHJ1ZSIgCisJCWV4dGVybmFsQWxsb3dlZD0idHJ1ZSIgCisgICAgICAgIGNoaWxkcz0idHJ1ZSIKKyAgICAgICAgdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlciIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RhbmRhcmRTZXJ2ZXJTRiI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlNlcnZpY2UiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJ0cnVlIiAKKyAgICAgICAgY2hpbGRzPSJ0cnVlIgorICAgICAgICB0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmljZSIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RhbmRhcmRTZXJ2aWNlU0YiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJFbmdpbmUiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJ0cnVlIiAKKyAgICAgICAgY2hpbGRzPSJ0cnVlIgorICAgICAgICB0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdGFuZGFyZEVuZ2luZVNGIj4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5kb21haW48L1RyYW5zaWVudEF0dHJpYnV0ZT4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iSG9zdCIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9InRydWUiIAorICAgICAgICBjaGlsZHM9InRydWUiCisgICAgICAgIHRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0IgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdGFuZGFyZEhvc3RTRiI+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZG9tYWluPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IkNvbnRleHQiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJ0cnVlIiAKKwkJZXh0ZXJuYWxBbGxvd2VkPSJ0cnVlIiAKKyAJCXN0b3JlU2VwYXJhdGU9InRydWUiCisJCWJhY2t1cD0idHJ1ZSIgCisgICAgICAgIGNoaWxkcz0idHJ1ZSIKKyAgICAgICAgdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0YW5kYXJkQ29udGV4dFNGIgorICAgICAgICBzdG9yZUFwcGVuZGVyQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVDb250ZXh0QXBwZW5kZXIiPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmF2YWlsYWJsZTwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmNvbmZpZ0ZpbGU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5jb25maWd1cmVkPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZGlzcGxheU5hbWU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5kaXN0cmlidXRhYmxlPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZG9tYWluPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZW5naW5lTmFtZTwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPm5hbWU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5wdWJsaWNJZDwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPnJlcGxhY2VXZWxjb21lRmlsZXM8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5zYXZlQ29uZmlnPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+c2Vzc2lvblRpbWVvdXQ8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5zdGFydHVwVGltZTwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPnRsZFNjYW5UaW1lPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorICAgICAgICBpZD0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzLltHbG9iYWxOYW1pbmdSZXNvdXJjZXNdIgorCSAgICB0YWc9Ikdsb2JhbE5hbWluZ1Jlc291cmNlcyIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIgorCQlhdHRyaWJ1dGVzPSJmYWxzZSIKKyAgICAgICAgY2hpbGRzPSJ0cnVlIgorICAgICAgICB0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5HbG9iYWxOYW1pbmdSZXNvdXJjZXNTRiI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJDb25uZWN0b3IiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJ0cnVlIiAKKyAgICAgICAgdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvciIKKyAgICAgICAgY2hpbGRzPSJ0cnVlIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5Db25uZWN0b3JTRiIKKyAgICAgICAgc3RvcmVBcHBlbmRlckNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkNvbm5lY3RvclN0b3JlQXBwZW5kZXIiPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPm1heFByb2Nlc3NvcjwvVHJhbnNpZW50QXR0cmlidXRlPgorIAkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5taW5Qcm9jZXNzb3I8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iTmFtaW5nUmVzb3VyY2VzIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiCisJCWF0dHJpYnV0ZXM9ImZhbHNlIgorICAgICAgICBjaGlsZHM9InRydWUiCisgICAgICAgIHRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXMiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLk5hbWluZ1Jlc291cmNlc1NGIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKwkgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iTWFuYWdlciIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLk1hbmFnZXJTRiI+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZW50cm9weTwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmRpc3RyaWJ1dGFibGU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKyAgICAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuc2Vzc2lvbi5EZWx0YU1hbmFnZXI8L1RyYW5zaWVudENoaWxkPgorICAgICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5oYS5zZXNzaW9uLlNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlcjwvVHJhbnNpZW50Q2hpbGQ+CisgICAgPC9EZXNjcmlwdGlvbj4KKyAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJNYW5hZ2VyIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKyAgICAgICAgY2hpbGRzPSJ0cnVlIgorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlBlcnNpc3RlbnRNYW5hZ2VyIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5QZXJzaXN0ZW50TWFuYWdlclNGIj4KKyAgICAgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5lbnRyb3B5PC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZGlzdHJpYnV0YWJsZTwvVHJhbnNpZW50QXR0cmlidXRlPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJTdG9yZSIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uRmlsZVN0b3JlIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iU3RvcmUiCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLkpEQkNTdG9yZSIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IkNsdXN0ZXIiCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorICAgICAgICBjaGlsZHM9InRydWUiCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLkNhdGFsaW5hQ2x1c3RlciIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuQ2F0YWxpbmFDbHVzdGVyU0YiCisgICAgICAgIHN0b3JlQXBwZW5kZXJDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JRHluYW1pY1Byb3BlcnR5U3RvcmVBcHBlbmRlciI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlJlYWxtIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG0iCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJQYXJhbWV0ZXIiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkFwcGxpY2F0aW9uUGFyYW1ldGVyIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iTG9hZGVyIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIuV2ViYXBwTG9hZGVyIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5Mb2FkZXJTRiI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJMaXN0ZW5lciIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXI8L1RyYW5zaWVudENoaWxkPgorICAgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuTmFtaW5nQ29udGV4dExpc3RlbmVyPC9UcmFuc2llbnRDaGlsZD4KKyAgICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNvbnRleHRDb25maWc8L1RyYW5zaWVudENoaWxkPgorICAgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuRW5naW5lQ29uZmlnPC9UcmFuc2llbnRDaGlsZD4KKyAgICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkhvc3RDb25maWc8L1RyYW5zaWVudENoaWxkPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKyAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlci5bU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXJdIgorCSAgICB0YWc9Ikxpc3RlbmVyIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKyAgICAgICAgdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iVmFsdmUiCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZSIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisJICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkJhc2ljQXV0aGVudGljYXRvcjwvVHJhbnNpZW50Q2hpbGQ+CisJICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkRpZ2VzdEF1dGhlbnRpY2F0b3I8L1RyYW5zaWVudENoaWxkPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5Gb3JtQXV0aGVudGljYXRvcjwvVHJhbnNpZW50Q2hpbGQ+CisJICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLk5vbkxvZ2luQXV0aGVudGljYXRvcjwvVHJhbnNpZW50Q2hpbGQ+CisJICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLlNTTEF1dGhlbnRpY2F0b3I8L1RyYW5zaWVudENoaWxkPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHRWYWx2ZTwvVHJhbnNpZW50Q2hpbGQ+CisJICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lVmFsdmU8L1RyYW5zaWVudENoaWxkPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3RWYWx2ZTwvVHJhbnNpZW50Q2hpbGQ+CisJICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuQ2VydGlmaWNhdGVzVmFsdmU8L1RyYW5zaWVudENoaWxkPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkVycm9yUmVwb3J0VmFsdmU8L1RyYW5zaWVudENoaWxkPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlcXVlc3RMaXN0ZW5lclZhbHZlPC9UcmFuc2llbnRDaGlsZD4KKwkgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iRW52aXJvbm1lbnQiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RW52aXJvbm1lbnQiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJFSkIiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RWpiIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iTG9jYWxFamIiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0TG9jYWxFamIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJSZXNvdXJjZSIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZSIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iUmVzb3VyY2VzIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9ImphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dCIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZG9jQmFzZTwvVHJhbnNpZW50QXR0cmlidXRlPgorICAgICAgICA8VHJhbnNpZW50QXR0cmlidXRlPmFsbG93TGlua2luZzwvVHJhbnNpZW50QXR0cmlidXRlPgorICAgICAgICA8VHJhbnNpZW50QXR0cmlidXRlPmNhY2hlTWF4U2l6ZTwvVHJhbnNpZW50QXR0cmlidXRlPgorICAgICAgICA8VHJhbnNpZW50QXR0cmlidXRlPmNhY2hlVFRMPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisgICAgICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+Y2FjaGVkPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisgICAgICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+Y2FzZVNlbnNpdGl2ZTwvVHJhbnNpZW50QXR0cmlidXRlPgorICAgICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLldBUkRpckNvbnRleHQ8L1RyYW5zaWVudENoaWxkPgorICAgICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLkZpbGVEaXJDb250ZXh0PC9UcmFuc2llbnRDaGlsZD4KKyAgICAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5Qcm94eURpckNvbnRleHQ8L1RyYW5zaWVudENoaWxkPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJSZXNvdXJjZUVudlJlZiIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUVudlJlZiIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlJlc291cmNlTGluayIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUxpbmsiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJUcmFuc2FjdGlvbiIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRUcmFuc2FjdGlvbiIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICBpZD0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dC5bSW5zdGFuY2VMaXN0ZW5lcl0iCisJICAgIHRhZz0iSW5zdGFuY2VMaXN0ZW5lciIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJYXR0cmlidXRlcz0iZmFsc2UiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkluc3RhbmNlTGlzdGVuZXJTRiI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICBpZD0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dC5bV3JhcHBlckxpZmVjeWNsZV0iCisJICAgIHRhZz0iV3JhcHBlckxpZmVjeWNsZSIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJYXR0cmlidXRlcz0iZmFsc2UiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLldyYXBwZXJMaWZlY3ljbGVTRiI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICBpZD0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dC5bV3JhcHBlckxpc3RlbmVyXSIKKwkgICAgdGFnPSJXcmFwcGVyTGlzdGVuZXIiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCWF0dHJpYnV0ZXM9ImZhbHNlIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5XcmFwcGVyTGlzdGVuZXJTRiI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICBpZD0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dC5bV2F0Y2hlZFJlc291cmNlXSIKKwkgICAgdGFnPSJXYXRjaGVkUmVzb3VyY2UiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCWF0dHJpYnV0ZXM9ImZhbHNlIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5XYXRjaGVkUmVzb3VyY2VTRiI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlNlbmRlciIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLnRjcC5SZXBsaWNhdGlvblRyYW5zbWl0dGVyIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIgorICAgICAgICBzdG9yZUFwcGVuZGVyQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSUR5bmFtaWNQcm9wZXJ0eVN0b3JlQXBwZW5kZXIiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJTZW5kZXIiCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyU2VuZGVyIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iUmVjZWl2ZXIiCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5oYS5DbHVzdGVyUmVjZWl2ZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJNZW1iZXJzaGlwIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIgorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5oYS5NZW1iZXJzaGlwU2VydmljZSIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IkRlcGxveWVyIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuaGEuQ2x1c3RlckRlcGxveWVyIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4gCisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IkNsdXN0ZXJMaXN0ZW5lciIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmhhLk1lc3NhZ2VMaXN0ZW5lciIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+Cis8L1JlZ2lzdHJ5PgorCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L2J1aWxkLnhtbCBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3QvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZDdkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L2J1aWxkLnhtbApAQCAtMCwwICsxLDExMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCEtLSBAYXV0aG9yIFBldGVyIFJvc3NiYWNoIC0tPgorPHByb2plY3QgbmFtZT0iVG9tY2F0OiBTdG9yZUNvbmZpZyBUZXN0Y2FzZXMiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QiPgorCTxwcm9wZXJ0eSBmaWxlPSIuLi8uLi8uLi8uLi9idWlsZC5wcm9wZXJ0aWVzIiAvPgorCTxwcm9wZXJ0eSBmaWxlPSIuLi8uLi8uLi8uLi9qYWthcnRhLXRvbWNhdC01L2J1aWxkLnByb3BlcnRpZXMuZGVmYXVsdCIgLz4KKwk8cHJvcGVydHkgbmFtZT0idGVzdC5yZXBvcnQubG9ncyIgdmFsdWU9ImxvZ3MvcmVwb3J0cyIgLz4KKwk8cHJvcGVydHkgbmFtZT0idGVzdC5yZXN1bHRzIiB2YWx1ZT0ibG9ncy90ZXN0LXJlc3VsdHMiIC8+CisKKwk8cHJvcGVydHkgbmFtZT0iY29tcGlsZS5vcHRpbWl6ZSIgdmFsdWU9InRydWUiIC8+CisJPHByb3BlcnR5IG5hbWU9ImNvbXBpbGUuZGVidWciIHZhbHVlPSJ0cnVlIiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLnNvdXJjZSIgdmFsdWU9IjEuNCIgLz4KKwk8cHJvcGVydHkgbmFtZT0iY29tcGlsZS5kZXByZWNhdGlvbiIgdmFsdWU9InRydWUiIC8+CisJPHByb3BlcnR5IG5hbWU9ImNvbXBpbGUubm93YXJuIiB2YWx1ZT0ib2ZmIiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLmVuY29kaW5nIiB2YWx1ZT0iSVNPLTg4NTktMSIgLz4KKwk8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iYnVpbGQvdGVzdCIgLz4KKwk8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9InNyYy9zaGFyZSIgLz4KKwk8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuaG9tZSIgdmFsdWU9Ii4uLy4uLy4uLy4uL2pha2FydGEtdG9tY2F0LTUvYnVpbGQiIC8+CisKKwk8IS0tIEJ1aWxkIHRoZSBjbGFzc3BhdGggLS0+CisJPHBhdGggaWQ9InByb2plY3QuY2xhc3NwYXRoIj4KKwkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pteC5qYXJ9IiAvPgorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sb2dnaW5nLmphcn0iIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtsb2c0ai5qYXJ9IiAvPgorCQk8ZmlsZXNldCBkaXI9IiR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2VuZG9yc2VkIj4KKwkJCTxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorCQk8L2ZpbGVzZXQ+CisJCTxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5ob21lfS9jb21tb24vbGliIj4KKwkJCTxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorCQk8L2ZpbGVzZXQ+CisJCTxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5ob21lfS9zZXJ2ZXIvbGliIj4KKwkJCTxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorCQk8L2ZpbGVzZXQ+CisJPC9wYXRoPgorCisJPHRhcmdldCBuYW1lPSJidWlsZC1wcmVwYXJlIj4KKwkJPGF2YWlsYWJsZSBwcm9wZXJ0eT0iY2VydHN0b3JlLnByZXNlbnQiIGZpbGU9ImNvbmYvY2F0YWxpbmEua2V5c3RvcmUiIC8+CisJCTxta2RpciBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KKwkJPG1rZGlyIGRpcj0id2ViYXBwcy9teWFwcHMiIC8+CisJCTxta2RpciBkaXI9ImNvbmYvQ2F0YWxpbmEvbG9jYWxob3N0IiAvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJpbmZvIiBkZXNjcmlwdGlvbj0iU2hvd3MgYSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFudCBzY3JpcHQiPgorCQk8ZWNobz4KKwkJCVRoaXMgYW50IHNjcmlwdCBpbXBsZW1lbnRzIHNvbWUgdGVzdGNhc2VzIHRvIHZlcmlmeSB0aGUga2V5IGZ1bmN0aW9ucyBvZiBzdG9yZSB0b21jYXQgc2VydmVyLnhtbCAuCisJCQlZb3UgZmluZCB0aGlzIHNjcmlwdCBhdDogJHthbnQuZmlsZX0KKwkJPC9lY2hvPgorCTwvdGFyZ2V0PgorCisJPCEtLSBUaGlzIHRhcmdldCBjb21waWxlcyBhbGwgc291cmNlcyBvdXQgb2YgdGhlIAorCQkJcHJvamVjdHMgc291cmNlIHRyZWUgLS0+CisJPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlIiBkZXNjcmlwdGlvbj0iVGhpcyB0YXJnZXQgY29tcGlsZXMgYWxsIHNvdXJjZXMgb3V0IG9mIHRoZSBwcm9qZWN0cyBzb3VyY2UgdHJlZSI+CisKKwkJPCEtLSBDb3BpZXMgdGhlIHN0YXRpYyByZXNvdXJjZXMgb3V0IG9mIHRoZSBzcmMgdHJlZQorCQkJCXRvIHRoZSBidWlsZC9jbGFzc2VzIGRpciAtLT4KKwkJPGNvcHkgdG9kaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIj4KKwkJCTxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSI+CisJCQkJPGluY2x1ZGUgbmFtZT0iKioiIC8+CisJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgorCQkJPC9maWxlc2V0PgorCQk8L2NvcHk+CisKKwkJPCEtLSBDb21waWxlcyBhbGwgc291cmNlcyAtLT4KKwkJPGphdmFjIGRlc3RkaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIiBzcmNkaXI9IiR7c3JjLmRpcn0iIGluY2x1ZGVzPSIqKi8qLmphdmEiIGV4Y2x1ZGVzPSIqKi9DVlMvKioiIGRlcHJlY2F0aW9uPSIke2NvbXBpbGUuZGVwcmVjYXRpb259IiBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIgc291cmNlPSIke2NvbXBpbGUuc291cmNlfSIgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iIG5vd2Fybj0iJHtjb21waWxlLm5vd2Fybn0iIGVuY29kaW5nPSIke2NvbXBpbGUuZW5jb2Rpbmd9Ij4KKwkJCTxjbGFzc3BhdGg+CisJCQkJPHBhdGggcmVmaWQ9InByb2plY3QuY2xhc3NwYXRoIiAvPgorCQkJPC9jbGFzc3BhdGg+CisJCTwvamF2YWM+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9ImNvbXBpbGUsZ2Vuc3RvcmUiIGRlc2NyaXB0aW9uPSJSdW4gdW5pdCB0ZXN0cyI+CisJCTxkZWxldGUgZGlyPSIke3Rlc3QucmVzdWx0c30iIC8+CisJCTxta2RpciBkaXI9IiR7dGVzdC5yZXN1bHRzfSIgLz4KKwkJPGp1bml0IGZvcms9InllcyIgZmFpbHVyZVByb3BlcnR5PSJ0ZXN0LmZhaWx1cmUiIGZpbHRlcnRyYWNlPSJmYWxzZSIgPgorCQkJPGp2bWFyZyB2YWx1ZT0iLURjYXRhbGluYS5iYXNlPSR7YmFzZWRpcn0iIC8+CisJCQk8anZtYXJnIHZhbHVlPSItRGNhdGFsaW5hLmhvbWU9JHtjYXRhbGluYS5ob21lfSIgLz4KKwkJCTxqdm1hcmcgdmFsdWU9Ii1EbG9nNGouY29uZmlndXJhdGlvbj1maWxlOmNvbmYvbG9nNGoueG1sIiAvPgorCQkJPGNsYXNzcGF0aD4KKwkJCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9jbGFzc2VzIiAvPgorCQkJCTxwYXRoIHJlZmlkPSJwcm9qZWN0LmNsYXNzcGF0aCIgLz4KKwkJCTwvY2xhc3NwYXRoPgorCQkJPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIgdXNlZmlsZT0iZmFsc2UiIC8+CisJCQk8Zm9ybWF0dGVyIHR5cGU9InhtbCIgLz4KKwkJCTxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdC5yZXN1bHRzfSI+CisJCQkJPGZpbGVzZXQgZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIgaW5jbHVkZXM9IioqLypUZXN0LmNsYXNzIiAvPgorCQkJPC9iYXRjaHRlc3Q+CisJCTwvanVuaXQ+CisJCTxta2RpciBkaXI9IiR7dGVzdC5yZXBvcnQubG9nc30iIC8+CisJCTxqdW5pdHJlcG9ydCB0b2Rpcj0iJHt0ZXN0LnJlcG9ydC5sb2dzfSI+CisJCQk8ZmlsZXNldCBkaXI9IiR7dGVzdC5yZXN1bHRzfSIgLz4KKwkJCTxyZXBvcnQgZm9ybWF0PSJmcmFtZXMiIHRvZGlyPSIke3Rlc3QucmVwb3J0LmxvZ3N9IiAvPgorCQk8L2p1bml0cmVwb3J0PgorCQk8YW50Y2FsbCB0YXJnZXQ9ImNoZWNrdGVzdCIgLz4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iZ2Vuc3RvcmUiIHVubGVzcz0iY2VydHN0b3JlLnByZXNlbnQiPgorCQk8YW50IGFudGZpbGU9ImdlbnN0b3JlLnhtbCIgdGFyZ2V0PSJzdG9yZSIgLz4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iY2hlY2t0ZXN0IiBpZj0idGVzdC5mYWlsdXJlIj4KKwkJPGZhaWwgbWVzc2FnZT0ic29tZSB0ZXN0IGZhaWxlZCIgLz4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iY2xlYW4iPgorCQk8ZGVsZXRlIGRpcj0iJHtidWlsZH0vZGlyIiAvPgorCQk8ZGVsZXRlIGRpcj0id2ViYXBwcyIgLz4KKwkJPGRlbGV0ZSBkaXI9ImJ1aWxkIiAvPgorCQk8ZGVsZXRlIGRpcj0iJHt0ZXN0LnJlcG9ydC5sb2dzfSIgLz4KKwkJPGRlbGV0ZSBkaXI9IiR7dGVzdC5yZXN1bHRzfSIgLz4KKwkJPGRlbGV0ZSBkaXI9ImxvZ3MiIC8+CisJPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L2NvbmYvY2F0YWxpbmEua2V5c3RvcmUgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L2NvbmYvY2F0YWxpbmEua2V5c3RvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhMTI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3QvY29uZi9jYXRhbGluYS5rZXlzdG9yZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L2NvbmYvY29udGV4dC54bWwgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L2NvbmYvY29udGV4dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlODhmZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3QvY29uZi9jb250ZXh0LnhtbApAQCAtMCwwICsxLDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Q29udGV4dAorICAgIGNvb2tpZXM9ImZhbHNlIgorICAgIHJlbG9hZGFibGU9InRydWUiPgorCTxMaXN0ZW5lciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSW5mb0xpZmVjeWNsZUxpc3RlbmVyIiAvPgorPC9Db250ZXh0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9jb25mL2xvZzRqLnhtbCBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3QvY29uZi9sb2c0ai54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRmYWQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3QvY29uZi9sb2c0ai54bWwKQEAgLTAsMCArMSw1NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCFET0NUWVBFIGxvZzRqOmNvbmZpZ3VyYXRpb24gU1lTVEVNICJsb2c0ai5kdGQiPgorPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIC0tPgorPCEtLSBMb2c0aiBDb25maWd1cmF0aW9uIC0tPgorPCEtLSAtLT4KKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSAkSWQkIC0tPgorPCEtLQorfCBGb3IgbW9yZSBjb25maWd1cmF0aW9uIGluZnJvbWF0aW9uIGFuZCBleGFtcGxlcyBzZWUgdGhlIEpha2FydGEgTG9nNGoKK3wgb3dlYnNpdGU6IGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbG9nNGoKKy0tPgorPGxvZzRqOmNvbmZpZ3VyYXRpb24geG1sbnM6bG9nNGo9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbG9nNGovIiBkZWJ1Zz0iZmFsc2UiPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0gQXBwZW5kIG1lc3NhZ2VzIHRvIHRoZSBjb25zb2xlIC0tPgorPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworPGFwcGVuZGVyIG5hbWU9IkNPTlNPTEUiIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlciI+Cis8cGFyYW0gbmFtZT0iVGFyZ2V0IiB2YWx1ZT0iU3lzdGVtLm91dCIvPgorPHBhcmFtIG5hbWU9IlRocmVzaG9sZCIgdmFsdWU9ImRlYnVnIi8+Cis8bGF5b3V0IGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQiPgorPCEtLVRoZSBkZWZhdWx0IHBhdHRlcm46IERhdGUgUHJpb3JpdHkgW0NhdGVnb3J5XSBNZXNzYWdlXG4tLT4KKzxwYXJhbSBuYW1lPSJDb252ZXJzaW9uUGF0dGVybiIgdmFsdWU9IiVke0FCU09MVVRFfSAlLTVwIFslY3sxfV0gJW0lbiIvPgorPC9sYXlvdXQ+Cis8L2FwcGVuZGVyPgorCisKKzxjYXRlZ29yeSBuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnIiAKKyAgICAgICAgICAgYWRkaXRpdml0eT0iZmFsc2UiPiAKKyAgIDxwcmlvcml0eSB2YWx1ZT0iaW5mbyIgLz4KKyAgIDxhcHBlbmRlci1yZWYgcmVmPSJDT05TT0xFIiAvPgorPC9jYXRlZ29yeT4KKworPGNhdGVnb3J5IG5hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEiIAorICAgICAgICAgICBhZGRpdGl2aXR5PSJmYWxzZSI+IAorICAgPHByaW9yaXR5IHZhbHVlPSJpbmZvIiAvPgorICAgPGFwcGVuZGVyLXJlZiByZWY9IkNPTlNPTEUiIC8+Cis8L2NhdGVnb3J5PgorPGNhdGVnb3J5IG5hbWU9Im9yZy5hcGFjaGUudG9tY2F0IiAKKyAgICAgICAgICAgYWRkaXRpdml0eT0iZmFsc2UiPiAKKyAgIDxwcmlvcml0eSB2YWx1ZT0iZXJyb3IiIC8+CisgICA8YXBwZW5kZXItcmVmIHJlZj0iQ09OU09MRSIgLz4KKzwvY2F0ZWdvcnk+Cis8Y2F0ZWdvcnkgbmFtZT0ib3JnLmFwYWNoZS5uYW1pbmciIAorICAgICAgICAgICBhZGRpdGl2aXR5PSJmYWxzZSI+IAorICAgPHByaW9yaXR5IHZhbHVlPSJpbmZvIiAvPgorICAgPGFwcGVuZGVyLXJlZiByZWY9IkNPTlNPTEUiIC8+Cis8L2NhdGVnb3J5PgorCis8IS0tIFNldHVwIHRoZSBSb290IGMgIC0tPgorPHJvb3Q+CisgICA8cHJpb3JpdHkgdmFsdWU9ImluZm8iIC8+CisgICA8YXBwZW5kZXItcmVmIHJlZj0iQ09OU09MRSIvPgorPC9yb290PgorPC9sb2c0ajpjb25maWd1cmF0aW9uPiAKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9jb25mL3NlcnZlci1yZWdpc3RyeS10ZXN0LnhtbCBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3QvY29uZi9zZXJ2ZXItcmVnaXN0cnktdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyOGU5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3QvY29uZi9zZXJ2ZXItcmVnaXN0cnktdGVzdC54bWwKQEAgLTAsMCArMSwzMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8UmVnaXN0cnkgbmFtZT0iVG9tY2F0IiB2ZXJzaW9uPSI1LjEuMCIgZW5jb2Rpbmc9IlVURi04IiA+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlNlcnZlciIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9InRydWUiIAorICAgICAgICBjaGlsZHM9InRydWUiCisgICAgICAgIHRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0YW5kYXJkU2VydmVyU0YiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJTZXJ2aWNlIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0idHJ1ZSIgCisgICAgICAgIGNoaWxkcz0idHJ1ZSIKKyAgICAgICAgdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZpY2UiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0YW5kYXJkU2VydmljZVNGIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iRW5naW5lIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0idHJ1ZSIgCisgICAgICAgIGNoaWxkcz0idHJ1ZSIKKyAgICAgICAgdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEVuZ2luZSIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RhbmRhcmRFbmdpbmVTRiI+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZG9tYWluPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9Ikhvc3QiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJ0cnVlIiAKKyAgICAgICAgY2hpbGRzPSJ0cnVlIgorICAgICAgICB0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdCIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RhbmRhcmRIb3N0U0YiPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmRvbWFpbjwvVHJhbnNpZW50QXR0cmlidXRlPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJDb250ZXh0IgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0idHJ1ZSIgCisJCXN0b3JlU2VwYXJhdGU9InRydWUiCisJCWJhY2t1cD0idHJ1ZSIgCisgICAgICAgIGNoaWxkcz0idHJ1ZSIKKyAgICAgICAgdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0YW5kYXJkQ29udGV4dFNGIgorICAgICAgICBzdG9yZUFwcGVuZGVyQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVDb250ZXh0QXBwZW5kZXIiPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmF2YWlsYWJsZTwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmNvbmZpZ0ZpbGU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5jb25maWd1cmVkPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZGlzcGxheU5hbWU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5kaXN0cmlidXRhYmxlPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZG9tYWluPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZW5naW5lTmFtZTwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPm5hbWU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5wdWJsaWNJZDwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPnJlcGxhY2VXZWxjb21lRmlsZXM8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5zYXZlQ29uZmlnPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+c2Vzc2lvblRpbWVvdXQ8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5zdGFydHVwVGltZTwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPnRsZFNjYW5UaW1lPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorICAgICAgICBpZD0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzLltHbG9iYWxOYW1pbmdSZXNvdXJjZXNdIgorCSAgICB0YWc9Ikdsb2JhbE5hbWluZ1Jlc291cmNlcyIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIgorCQlhdHRyaWJ1dGVzPSJmYWxzZSIKKyAgICAgICAgY2hpbGRzPSJ0cnVlIgorICAgICAgICB0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5HbG9iYWxOYW1pbmdSZXNvdXJjZXNTRiI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJDb25uZWN0b3IiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJ0cnVlIiAKKyAgICAgICAgdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvciIKKyAgICAgICAgY2hpbGRzPSJ0cnVlIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5Db25uZWN0b3JTRiIKKyAgICAgICAgc3RvcmVXcml0ZXJDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5Db25uZWN0b3JTdG9yZUFwcGVuZGVyIj4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5tYXhQcm9jZXNzb3I8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKyAJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+bWluUHJvY2Vzc29yPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgICA8RGVzY3JpcHRpb24KKyAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3Rvci5bUHJvdG9jb2xIYW5kbGVyXSIKKwkgICAgdGFnPSJQcm90b2NvbEhhbmRsZXIiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisgICAgICAgIHRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNveW90ZS5Qcm90b2NvbEhhbmRsZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmNsaWVudGF1dGg8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKyAJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+a2V5cGFzczwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmtleXN0b3JlPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+a2V5dHlwZTwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPm5hbWU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5wb3J0PC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+cHJvdG9jb2w8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5wcm90b2NvbHM8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5yYW5kb21maWxlPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+c2VjdXJlPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9Ik5hbWluZ1Jlc291cmNlcyIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIgorCQlhdHRyaWJ1dGVzPSJmYWxzZSIKKyAgICAgICAgY2hpbGRzPSJ0cnVlIgorICAgICAgICB0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5OYW1pbmdSZXNvdXJjZXNTRiI+CisgICAgIDwvRGVzY3JpcHRpb24+CisJIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9Ik1hbmFnZXIiCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlN0YW5kYXJkTWFuYWdlciIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuTWFuYWdlclNGIj4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5lbnRyb3B5PC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZGlzdHJpYnV0YWJsZTwvVHJhbnNpZW50QXR0cmlidXRlPgorICAgIDwvRGVzY3JpcHRpb24+CisgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iTWFuYWdlciIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisgICAgICAgIGNoaWxkcz0idHJ1ZSIKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5QZXJzaXN0ZW50TWFuYWdlciIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuUGVyc2lzdGVudE1hbmFnZXJTRiI+CisgICAgICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZW50cm9weTwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmRpc3RyaWJ1dGFibGU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iU3RvcmUiCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLkZpbGVTdG9yZSIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlN0b3JlIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5KREJDU3RvcmUiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJDbHVzdGVyIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKyAgICAgICAgY2hpbGRzPSJ0cnVlIgorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNhdGFsaW5hQ2x1c3RlciIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuQ2F0YWxpbmFDbHVzdGVyU0YiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJSZWFsbSIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iUGFyYW1ldGVyIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5BcHBsaWNhdGlvblBhcmFtZXRlciIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IkxvYWRlciIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcExvYWRlciIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuTG9hZGVyU0YiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iTGlzdGVuZXIiCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lciIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyPC9UcmFuc2llbnRDaGlsZD4KKyAgICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLk5hbWluZ0NvbnRleHRMaXN0ZW5lcjwvVHJhbnNpZW50Q2hpbGQ+CisgICAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Db250ZXh0Q29uZmlnPC9UcmFuc2llbnRDaGlsZD4KKyAgICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkVuZ2luZUNvbmZpZzwvVHJhbnNpZW50Q2hpbGQ+CisgICAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Ib3N0Q29uZmlnPC9UcmFuc2llbnRDaGlsZD4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisgICAgICAgIGlkPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXIuW1NlcnZlckxpZmVjeWNsZUxpc3RlbmVyXSIKKwkgICAgdGFnPSJMaXN0ZW5lciIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisgICAgICAgIHRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5TZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlZhbHZlIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmUiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5CYXNpY0F1dGhlbnRpY2F0b3I8L1RyYW5zaWVudENoaWxkPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5EaWdlc3RBdXRoZW50aWNhdG9yPC9UcmFuc2llbnRDaGlsZD4KKwkgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuRm9ybUF1dGhlbnRpY2F0b3I8L1RyYW5zaWVudENoaWxkPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5Ob25Mb2dpbkF1dGhlbnRpY2F0b3I8L1RyYW5zaWVudENoaWxkPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5TU0xBdXRoZW50aWNhdG9yPC9UcmFuc2llbnRDaGlsZD4KKwkgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0VmFsdmU8L1RyYW5zaWVudENoaWxkPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEVuZ2luZVZhbHZlPC9UcmFuc2llbnRDaGlsZD4KKwkgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0VmFsdmU8L1RyYW5zaWVudENoaWxkPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkNlcnRpZmljYXRlc1ZhbHZlPC9UcmFuc2llbnRDaGlsZD4KKwkgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5FcnJvclJlcG9ydFZhbHZlPC9UcmFuc2llbnRDaGlsZD4KKwkgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZXF1ZXN0TGlzdGVuZXJWYWx2ZTwvVHJhbnNpZW50Q2hpbGQ+CisJICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblZhbHZlPC9UcmFuc2llbnRDaGlsZD4KKwkgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iRW52aXJvbm1lbnQiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RW52aXJvbm1lbnQiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJFSkIiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RWpiIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iTG9jYWxFamIiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0TG9jYWxFamIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJSZXNvdXJjZSIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZSIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlJlc291cmNlRW52UmVmIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlRW52UmVmIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iUmVzb3VyY2VMaW5rIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlTGluayIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCQlpZD0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dC5bSW5zdGFuY2VMaXN0ZW5lcl0iCisJICAgIHRhZz0iSW5zdGFuY2VMaXN0ZW5lciIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJYXR0cmlidXRlcz0iZmFsc2UiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkluc3RhbmNlTGlzdGVuZXJTRiI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCQlpZD0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dC5bV3JhcHBlckxpZmVjeWNsZV0iCisJICAgIHRhZz0iV3JhcHBlckxpZmVjeWNsZSIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJYXR0cmlidXRlcz0iZmFsc2UiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLldyYXBwZXJMaWZlY3ljbGVTRiI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCQlpZD0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dC5bV3JhcHBlckxpc3RlbmVyXSIKKwkgICAgdGFnPSJXcmFwcGVyTGlzdGVuZXIiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCWF0dHJpYnV0ZXM9ImZhbHNlIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5XcmFwcGVyTGlzdGVuZXJTRiI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCQlpZD0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dC5bV2F0Y2hlZFJlc291cmNlXSIKKwkgICAgdGFnPSJXYXRjaGVkUmVzb3VyY2UiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCWF0dHJpYnV0ZXM9ImZhbHNlIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5XYXRjaGVkUmVzb3VyY2VTRiI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlNlbmRlciIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclNlbmRlciIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlJlY2VpdmVyIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyUmVjZWl2ZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJNZW1iZXJzaGlwIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWVtYmVyc2hpcCIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IkRlcGxveWVyIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyRGVwbG95ZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPiAKKzwvUmVnaXN0cnk+CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3QvY29uZi9zZXJ2ZXIueG1sIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9jb25mL3NlcnZlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlZGVmNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3QvY29uZi9zZXJ2ZXIueG1sCkBAIC0wLDAgKzEsMzU5IEBACis8IS0tIEV4YW1wbGUgU2VydmVyIENvbmZpZ3VyYXRpb24gRmlsZSAtLT4KKzwhLS0gTm90ZSB0aGF0IGNvbXBvbmVudCBlbGVtZW50cyBhcmUgbmVzdGVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlaXIKKyAgICAgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcHMgd2l0aCBlYWNoIG90aGVyIC0tPgorCis8IS0tIEEgIlNlcnZlciIgaXMgYSBzaW5nbGV0b24gZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIGVudGlyZSBKVk0sCisgICAgIHdoaWNoIG1heSBjb250YWluIG9uZSBvciBtb3JlICJTZXJ2aWNlIiBpbnN0YW5jZXMuICBUaGUgU2VydmVyCisgICAgIGxpc3RlbnMgZm9yIGEgc2h1dGRvd24gY29tbWFuZCBvbiB0aGUgaW5kaWNhdGVkIHBvcnQuCisKKyAgICAgTm90ZTogIEEgIlNlcnZlciIgaXMgbm90IGl0c2VsZiBhICJDb250YWluZXIiLCBzbyB5b3UgbWF5IG5vdAorICAgICBkZWZpbmUgc3ViY29tcG9uZW50cyBzdWNoIGFzICJWYWx2ZXMiIG9yICJMb2dnZXJzIiBhdCB0aGlzIGxldmVsLgorIC0tPgorCis8U2VydmVyIHBvcnQ9IjgwMDUiIHNodXRkb3duPSJTSFVURE9XTiIgZGVidWc9IjAiPgorCisKKyAgPCEtLSBDb21tZW50IHRoZXNlIGVudHJpZXMgb3V0IHRvIGRpc2FibGUgSk1YIE1CZWFucyBzdXBwb3J0IC0tPgorICA8IS0tIFlvdSBtYXkgYWxzbyBjb25maWd1cmUgY3VzdG9tIGNvbXBvbmVudHMgKGUuZy4gVmFsdmVzL1JlYWxtcykgYnkgCisgICAgICAgaW5jbHVkaW5nIHlvdXIgb3duIG1iZWFuLWRlc2NyaXB0b3IgZmlsZShzKSwgYW5kIHNldHRpbmcgdGhlIAorICAgICAgICJkZXNjcmlwdG9ycyIgYXR0cmlidXRlIHRvIHBvaW50IHRvIGEgJzsnIHNlcGVyYXRlZCBsaXN0IG9mIHBhdGhzCisgICAgICAgKGluIHRoZSBDbGFzc0xvYWRlciBzZW5zZSkgb2YgZmlsZXMgdG8gYWRkIHRvIHRoZSBkZWZhdWx0IGxpc3QuCisgICAgICAgZS5nLiBkZXNjcmlwdG9ycz0iL2NvbS9teWZpcm0vbXlwYWNrYWdlL21iZWFuLWRlc2NyaXB0b3IueG1sIgorICAtLT4KKyAgPExpc3RlbmVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIiCisgICAgICAgICAgICBkZWJ1Zz0iMCIvPgorICA8TGlzdGVuZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5HbG9iYWxSZXNvdXJjZXNMaWZlY3ljbGVMaXN0ZW5lciIKKyAgICAgICAgICAgIGRlYnVnPSIwIi8+CisKKyAgPCEtLSBHbG9iYWwgSk5ESSByZXNvdXJjZXMgLS0+CisgIDxHbG9iYWxOYW1pbmdSZXNvdXJjZXM+CisKKyAgICA8IS0tIFRlc3QgZW50cnkgZm9yIGRlbW9uc3RyYXRpb24gcHVycG9zZXMgLS0+CisgICAgPEVudmlyb25tZW50IG5hbWU9InNpbXBsZVZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciIgdmFsdWU9IjMwIi8+CisKKyAgICA8IS0tIEVkaXRhYmxlIHVzZXIgZGF0YWJhc2UgdGhhdCBjYW4gYWxzbyBiZSB1c2VkIGJ5CisgICAgICAgICBVc2VyRGF0YWJhc2VSZWFsbSB0byBhdXRoZW50aWNhdGUgdXNlcnMgLS0+CisgICAgPFJlc291cmNlIG5hbWU9IlVzZXJEYXRhYmFzZSIgYXV0aD0iQ29udGFpbmVyIgorICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZSIKKyAgICAgICBkZXNjcmlwdGlvbj0iVXNlciBkYXRhYmFzZSB0aGF0IGNhbiBiZSB1cGRhdGVkIGFuZCBzYXZlZCIKKyAgICAgICAgICAgZmFjdG9yeT0ib3JnLmFwYWNoZS5jYXRhbGluYS51c2Vycy5NZW1vcnlVc2VyRGF0YWJhc2VGYWN0b3J5IgorICAgICAgICAgIHBhdGhuYW1lPSJjb25mL3RvbWNhdC11c2Vycy54bWwiIC8+CisKKyAgPC9HbG9iYWxOYW1pbmdSZXNvdXJjZXM+CisKKyAgPCEtLSBBICJTZXJ2aWNlIiBpcyBhIGNvbGxlY3Rpb24gb2Ygb25lIG9yIG1vcmUgIkNvbm5lY3RvcnMiIHRoYXQgc2hhcmUKKyAgICAgICBhIHNpbmdsZSAiQ29udGFpbmVyIiAoYW5kIHRoZXJlZm9yZSB0aGUgd2ViIGFwcGxpY2F0aW9ucyB2aXNpYmxlCisgICAgICAgd2l0aGluIHRoYXQgQ29udGFpbmVyKS4gIE5vcm1hbGx5LCB0aGF0IENvbnRhaW5lciBpcyBhbiAiRW5naW5lIiwKKyAgICAgICBidXQgdGhpcyBpcyBub3QgcmVxdWlyZWQuCisKKyAgICAgICBOb3RlOiAgQSAiU2VydmljZSIgaXMgbm90IGl0c2VsZiBhICJDb250YWluZXIiLCBzbyB5b3UgbWF5IG5vdAorICAgICAgIGRlZmluZSBzdWJjb21wb25lbnRzIHN1Y2ggYXMgIlZhbHZlcyIgb3IgIkxvZ2dlcnMiIGF0IHRoaXMgbGV2ZWwuCisgICAtLT4KKworICA8IS0tIERlZmluZSB0aGUgVG9tY2F0IFN0YW5kLUFsb25lIFNlcnZpY2UgLS0+CisgIDxTZXJ2aWNlIG5hbWU9IkNhdGFsaW5hIj4KKworICAgIDwhLS0gQSAiQ29ubmVjdG9yIiByZXByZXNlbnRzIGFuIGVuZHBvaW50IGJ5IHdoaWNoIHJlcXVlc3RzIGFyZSByZWNlaXZlZAorICAgICAgICAgYW5kIHJlc3BvbnNlcyBhcmUgcmV0dXJuZWQuICBFYWNoIENvbm5lY3RvciBwYXNzZXMgcmVxdWVzdHMgb24gdG8gdGhlCisgICAgICAgICBhc3NvY2lhdGVkICJDb250YWluZXIiIChub3JtYWxseSBhbiBFbmdpbmUpIGZvciBwcm9jZXNzaW5nLgorCisgICAgICAgICBCeSBkZWZhdWx0LCBhIG5vbi1TU0wgSFRUUC8xLjEgQ29ubmVjdG9yIGlzIGVzdGFibGlzaGVkIG9uIHBvcnQgODA4MC4KKyAgICAgICAgIFlvdSBjYW4gYWxzbyBlbmFibGUgYW4gU1NMIEhUVFAvMS4xIENvbm5lY3RvciBvbiBwb3J0IDg0NDMgYnkKKyAgICAgICAgIGZvbGxvd2luZyB0aGUgaW5zdHJ1Y3Rpb25zIGJlbG93IGFuZCB1bmNvbW1lbnRpbmcgdGhlIHNlY29uZCBDb25uZWN0b3IKKyAgICAgICAgIGVudHJ5LiAgU1NMIHN1cHBvcnQgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBzdGVwcyAoc2VlIHRoZSBTU0wgQ29uZmlnCisgICAgICAgICBIT1dUTyBpbiB0aGUgVG9tY2F0IDUgZG9jdW1lbnRhdGlvbiBidW5kbGUgZm9yIG1vcmUgZGV0YWlsZWQKKyAgICAgICAgIGluc3RydWN0aW9ucyk6CisgICAgICAgICAqIElmIHlvdXIgSkRLIHZlcnNpb24gMS4zIG9yIHByaW9yLCBkb3dubG9hZCBhbmQgaW5zdGFsbCBKU1NFIDEuMC4yIG9yCisgICAgICAgICAgIGxhdGVyLCBhbmQgcHV0IHRoZSBKQVIgZmlsZXMgaW50byAiJEpBVkFfSE9NRS9qcmUvbGliL2V4dCIuCisgICAgICAgICAqIEV4ZWN1dGU6CisgICAgICAgICAgICAgJUpBVkFfSE9NRSVcYmluXGtleXRvb2wgLWdlbmtleSAtYWxpYXMgdG9tY2F0IC1rZXlhbGcgUlNBIChXaW5kb3dzKQorICAgICAgICAgICAgICRKQVZBX0hPTUUvYmluL2tleXRvb2wgLWdlbmtleSAtYWxpYXMgdG9tY2F0IC1rZXlhbGcgUlNBICAoVW5peCkKKyAgICAgICAgICAgd2l0aCBhIHBhc3N3b3JkIHZhbHVlIG9mICJjaGFuZ2VpdCIgZm9yIGJvdGggdGhlIGNlcnRpZmljYXRlIGFuZAorICAgICAgICAgICB0aGUga2V5c3RvcmUgaXRzZWxmLgorCisgICAgICAgICBCeSBkZWZhdWx0LCBETlMgbG9va3VwcyBhcmUgZW5hYmxlZCB3aGVuIGEgd2ViIGFwcGxpY2F0aW9uIGNhbGxzCisgICAgICAgICByZXF1ZXN0LmdldFJlbW90ZUhvc3QoKS4gIFRoaXMgY2FuIGhhdmUgYW4gYWR2ZXJzZSBpbXBhY3Qgb24KKyAgICAgICAgIHBlcmZvcm1hbmNlLCBzbyB5b3UgY2FuIGRpc2FibGUgaXQgYnkgc2V0dGluZyB0aGUKKyAgICAgICAgICJlbmFibGVMb29rdXBzIiBhdHRyaWJ1dGUgdG8gImZhbHNlIi4gIFdoZW4gRE5TIGxvb2t1cHMgYXJlIGRpc2FibGVkLAorICAgICAgICAgcmVxdWVzdC5nZXRSZW1vdGVIb3N0KCkgd2lsbCByZXR1cm4gdGhlIFN0cmluZyB2ZXJzaW9uIG9mIHRoZQorICAgICAgICAgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIGNsaWVudC4KKyAgICAtLT4KKworICAgIDwhLS0gRGVmaW5lIGEgbm9uLVNTTCBIVFRQLzEuMSBDb25uZWN0b3Igb24gcG9ydCA4MDgwIC0tPgorICAgIDxDb25uZWN0b3IgcG9ydD0iODA4MCIKKyAgICAgICAgICAgICAgIG1heFRocmVhZHM9IjE1MCIgbWluU3BhcmVUaHJlYWRzPSIyNSIgbWF4U3BhcmVUaHJlYWRzPSI3NSIKKyAgICAgICAgICAgICAgIGVuYWJsZUxvb2t1cHM9ImZhbHNlIiByZWRpcmVjdFBvcnQ9Ijg0NDMiIGFjY2VwdENvdW50PSIxMDAiCisgICAgICAgICAgICAgICBkZWJ1Zz0iMCIgY29ubmVjdGlvblRpbWVvdXQ9IjIwMDAwIiAKKyAgICAgICAgICAgICAgIGRpc2FibGVVcGxvYWRUaW1lb3V0PSJ0cnVlIiAvPgorICAgIDwhLS0gTm90ZSA6IFRvIGRpc2FibGUgY29ubmVjdGlvbiB0aW1lb3V0cywgc2V0IGNvbm5lY3Rpb25UaW1lb3V0IHZhbHVlCisgICAgIHRvIDAgLS0+CisJCisJPCEtLSBOb3RlIDogVG8gdXNlIGd6aXAgY29tcHJlc3Npb24geW91IGNvdWxkIHNldCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgOgorCQorCQkJICAgY29tcHJlc3Npb249Im9uIiAKKwkJCSAgIGNvbXByZXNzaW9uTWluU2l6ZT0iMjA0OCIgCisJCQkgICBub0NvbXByZXNzaW9uVXNlckFnZW50cz0iZ296aWxsYSwgdHJhdmlhdGEiIAorCQkJICAgY29tcHJlc3NhYmxlTWltZVR5cGU9InRleHQvaHRtbCx0ZXh0L3htbCIKKwktLT4KKworICAgIDwhLS0gRGVmaW5lIGEgU1NMIEhUVFAvMS4xIENvbm5lY3RvciBvbiBwb3J0IDg0NDMgLS0+CisgICAgPCEtLQorICAgIDxDb25uZWN0b3IgcG9ydD0iODQ0MyIgCisgICAgICAgICAgICAgICBtYXhUaHJlYWRzPSIxNTAiIG1pblNwYXJlVGhyZWFkcz0iMjUiIG1heFNwYXJlVGhyZWFkcz0iNzUiCisgICAgICAgICAgICAgICBlbmFibGVMb29rdXBzPSJmYWxzZSIgZGlzYWJsZVVwbG9hZFRpbWVvdXQ9InRydWUiCisgICAgICAgICAgICAgICBhY2NlcHRDb3VudD0iMTAwIiBkZWJ1Zz0iMCIgc2NoZW1lPSJodHRwcyIgc2VjdXJlPSJ0cnVlIgorICAgICAgICAgICAgICAgY2xpZW50QXV0aD0iZmFsc2UiIHNzbFByb3RvY29sPSJUTFMiIC8+CisgICAgLS0+CisKKyAgICA8IS0tIERlZmluZSBhbiBBSlAgMS4zIENvbm5lY3RvciBvbiBwb3J0IDgwMDkgLS0+CisgICAgPENvbm5lY3RvciBwb3J0PSI4MDA5IiAKKyAgICAgICAgICAgICAgIGVuYWJsZUxvb2t1cHM9ImZhbHNlIiByZWRpcmVjdFBvcnQ9Ijg0NDMiIGRlYnVnPSIwIgorICAgICAgICAgICAgICAgcHJvdG9jb2w9IkFKUC8xLjMiIC8+CisKKyAgICA8IS0tIERlZmluZSBhIFByb3hpZWQgSFRUUC8xLjEgQ29ubmVjdG9yIG9uIHBvcnQgODA4MiAtLT4KKyAgICA8IS0tIFNlZSBwcm94eSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIHRoaXMuIC0tPgorICAgIDwhLS0KKyAgICA8Q29ubmVjdG9yIHBvcnQ9IjgwODIiIAorICAgICAgICAgICAgICAgbWF4VGhyZWFkcz0iMTUwIiBtaW5TcGFyZVRocmVhZHM9IjI1IiBtYXhTcGFyZVRocmVhZHM9Ijc1IgorICAgICAgICAgICAgICAgZW5hYmxlTG9va3Vwcz0iZmFsc2UiCisgICAgICAgICAgICAgICBhY2NlcHRDb3VudD0iMTAwIiBkZWJ1Zz0iMCIgY29ubmVjdGlvblRpbWVvdXQ9IjIwMDAwIgorICAgICAgICAgICAgICAgcHJveHlQb3J0PSI4MCIgZGlzYWJsZVVwbG9hZFRpbWVvdXQ9InRydWUiIC8+CisgICAgLS0+CisKKyAgICA8IS0tIEFuIEVuZ2luZSByZXByZXNlbnRzIHRoZSBlbnRyeSBwb2ludCAod2l0aGluIENhdGFsaW5hKSB0aGF0IHByb2Nlc3NlcworICAgICAgICAgZXZlcnkgcmVxdWVzdC4gIFRoZSBFbmdpbmUgaW1wbGVtZW50YXRpb24gZm9yIFRvbWNhdCBzdGFuZCBhbG9uZQorICAgICAgICAgYW5hbHl6ZXMgdGhlIEhUVFAgaGVhZGVycyBpbmNsdWRlZCB3aXRoIHRoZSByZXF1ZXN0LCBhbmQgcGFzc2VzIHRoZW0KKyAgICAgICAgIG9uIHRvIHRoZSBhcHByb3ByaWF0ZSBIb3N0ICh2aXJ0dWFsIGhvc3QpLiAtLT4KKworICAgIDwhLS0gWW91IHNob3VsZCBzZXQganZtUm91dGUgdG8gc3VwcG9ydCBsb2FkLWJhbGFuY2luZyB2aWEgQUpQIGllIDoKKyAgICA8RW5naW5lIG5hbWU9IlN0YW5kYWxvbmUiIGRlZmF1bHRIb3N0PSJsb2NhbGhvc3QiIGRlYnVnPSIwIiBqdm1Sb3V0ZT0ianZtMSI+ICAgICAgICAgCisgICAgLS0+IAorICAgICAgICAgCisgICAgPCEtLSBEZWZpbmUgdGhlIHRvcCBsZXZlbCBjb250YWluZXIgaW4gb3VyIGNvbnRhaW5lciBoaWVyYXJjaHkgLS0+CisgICAgPEVuZ2luZSBuYW1lPSJDYXRhbGluYSIgZGVmYXVsdEhvc3Q9ImxvY2FsaG9zdCIgZGVidWc9IjAiPgorCisgICAgICA8IS0tIFRoZSByZXF1ZXN0IGR1bXBlciB2YWx2ZSBkdW1wcyB1c2VmdWwgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFib3V0CisgICAgICAgICAgIHRoZSByZXF1ZXN0IGhlYWRlcnMgYW5kIGNvb2tpZXMgdGhhdCB3ZXJlIHJlY2VpdmVkLCBhbmQgdGhlIHJlc3BvbnNlCisgICAgICAgICAgIGhlYWRlcnMgYW5kIGNvb2tpZXMgdGhhdCB3ZXJlIHNlbnQsIGZvciBhbGwgcmVxdWVzdHMgcmVjZWl2ZWQgYnkKKyAgICAgICAgICAgdGhpcyBpbnN0YW5jZSBvZiBUb21jYXQuICBJZiB5b3UgY2FyZSBvbmx5IGFib3V0IHJlcXVlc3RzIHRvIGEKKyAgICAgICAgICAgcGFydGljdWxhciB2aXJ0dWFsIGhvc3QsIG9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbiwgbmVzdCB0aGlzCisgICAgICAgICAgIGVsZW1lbnQgaW5zaWRlIHRoZSBjb3JyZXNwb25kaW5nIDxIb3N0PiBvciA8Q29udGV4dD4gZW50cnkgaW5zdGVhZC4KKworICAgICAgICAgICBGb3IgYSBzaW1pbGFyIG1lY2hhbmlzbSB0aGF0IGlzIHBvcnRhYmxlIHRvIGFsbCBTZXJ2bGV0IDIuNAorICAgICAgICAgICBjb250YWluZXJzLCBjaGVjayBvdXQgdGhlICJSZXF1ZXN0RHVtcGVyRmlsdGVyIiBGaWx0ZXIgaW4gdGhlCisgICAgICAgICAgIGV4YW1wbGUgYXBwbGljYXRpb24gKHRoZSBzb3VyY2UgZm9yIHRoaXMgZmlsdGVyIG1heSBiZSBmb3VuZCBpbgorICAgICAgICAgICAiJENBVEFMSU5BX0hPTUUvd2ViYXBwcy9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycyIpLgorCisgICAgICAgICAgIFJlcXVlc3QgZHVtcGluZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LiAgVW5jb21tZW50IHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgZWxlbWVudCB0byBlbmFibGUgaXQuIC0tPgorICAgICAgPCEtLQorICAgICAgPFZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVxdWVzdER1bXBlclZhbHZlIi8+CisgICAgICAtLT4KKworICAgICAgPCEtLSBCZWNhdXNlIHRoaXMgUmVhbG0gaXMgaGVyZSwgYW4gaW5zdGFuY2Ugd2lsbCBiZSBzaGFyZWQgZ2xvYmFsbHkgLS0+CisKKyAgICAgIDwhLS0gVGhpcyBSZWFsbSB1c2VzIHRoZSBVc2VyRGF0YWJhc2UgY29uZmlndXJlZCBpbiB0aGUgZ2xvYmFsIEpOREkKKyAgICAgICAgICAgcmVzb3VyY2VzIHVuZGVyIHRoZSBrZXkgIlVzZXJEYXRhYmFzZSIuICBBbnkgZWRpdHMKKyAgICAgICAgICAgdGhhdCBhcmUgcGVyZm9ybWVkIGFnYWluc3QgdGhpcyBVc2VyRGF0YWJhc2UgYXJlIGltbWVkaWF0ZWx5CisgICAgICAgICAgIGF2YWlsYWJsZSBmb3IgdXNlIGJ5IHRoZSBSZWFsbS4gIC0tPgorICAgICAgPFJlYWxtIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5Vc2VyRGF0YWJhc2VSZWFsbSIKKyAgICAgICAgICAgICAgICAgZGVidWc9IjAiIHJlc291cmNlTmFtZT0iVXNlckRhdGFiYXNlIi8+CisKKyAgICAgIDwhLS0gQ29tbWVudCBvdXQgdGhlIG9sZCByZWFsbSBidXQgbGVhdmUgaGVyZSBmb3Igbm93IGluIGNhc2Ugd2UKKyAgICAgICAgICAgbmVlZCB0byBnbyBiYWNrIHF1aWNrbHkgLS0+CisgICAgICA8IS0tCisgICAgICA8UmVhbG0gY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLk1lbW9yeVJlYWxtIiAvPgorICAgICAgLS0+CisKKyAgICAgIDwhLS0gUmVwbGFjZSB0aGUgYWJvdmUgUmVhbG0gd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0byBnZXQgYSBSZWFsbQorICAgICAgICAgICBzdG9yZWQgaW4gYSBkYXRhYmFzZSBhbmQgYWNjZXNzZWQgdmlhIEpEQkMgLS0+CisKKyAgICAgIDwhLS0KKyAgICAgIDxSZWFsbSAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpEQkNSZWFsbSIgZGVidWc9Ijk5IgorICAgICAgICAgICAgIGRyaXZlck5hbWU9Im9yZy5nanQubW0ubXlzcWwuRHJpdmVyIgorICAgICAgICAgIGNvbm5lY3Rpb25VUkw9ImpkYmM6bXlzcWw6Ly9sb2NhbGhvc3QvYXV0aG9yaXR5IgorICAgICAgICAgY29ubmVjdGlvbk5hbWU9InRlc3QiIGNvbm5lY3Rpb25QYXNzd29yZD0idGVzdCIKKyAgICAgICAgICAgICAgdXNlclRhYmxlPSJ1c2VycyIgdXNlck5hbWVDb2w9InVzZXJfbmFtZSIgdXNlckNyZWRDb2w9InVzZXJfcGFzcyIKKyAgICAgICAgICB1c2VyUm9sZVRhYmxlPSJ1c2VyX3JvbGVzIiByb2xlTmFtZUNvbD0icm9sZV9uYW1lIiAvPgorICAgICAgLS0+CisKKyAgICAgIDwhLS0KKyAgICAgIDxSZWFsbSAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpEQkNSZWFsbSIgZGVidWc9Ijk5IgorICAgICAgICAgICAgIGRyaXZlck5hbWU9Im9yYWNsZS5qZGJjLmRyaXZlci5PcmFjbGVEcml2ZXIiCisgICAgICAgICAgY29ubmVjdGlvblVSTD0iamRiYzpvcmFjbGU6dGhpbjpAbnRzZXJ2ZXI6MTUyMTpPUkNMIgorICAgICAgICAgY29ubmVjdGlvbk5hbWU9InNjb3R0IiBjb25uZWN0aW9uUGFzc3dvcmQ9InRpZ2VyIgorICAgICAgICAgICAgICB1c2VyVGFibGU9InVzZXJzIiB1c2VyTmFtZUNvbD0idXNlcl9uYW1lIiB1c2VyQ3JlZENvbD0idXNlcl9wYXNzIgorICAgICAgICAgIHVzZXJSb2xlVGFibGU9InVzZXJfcm9sZXMiIHJvbGVOYW1lQ29sPSJyb2xlX25hbWUiIC8+CisgICAgICAtLT4KKworICAgICAgPCEtLQorICAgICAgPFJlYWxtICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkRCQ1JlYWxtIiBkZWJ1Zz0iOTkiCisgICAgICAgICAgICAgZHJpdmVyTmFtZT0ic3VuLmpkYmMub2RiYy5KZGJjT2RiY0RyaXZlciIKKyAgICAgICAgICBjb25uZWN0aW9uVVJMPSJqZGJjOm9kYmM6Q0FUQUxJTkEiCisgICAgICAgICAgICAgIHVzZXJUYWJsZT0idXNlcnMiIHVzZXJOYW1lQ29sPSJ1c2VyX25hbWUiIHVzZXJDcmVkQ29sPSJ1c2VyX3Bhc3MiCisgICAgICAgICAgdXNlclJvbGVUYWJsZT0idXNlcl9yb2xlcyIgcm9sZU5hbWVDb2w9InJvbGVfbmFtZSIgLz4KKyAgICAgIC0tPgorCisgICAgICA8IS0tIERlZmluZSB0aGUgZGVmYXVsdCB2aXJ0dWFsIGhvc3QKKyAgICAgICAgICAgTm90ZTogWE1MIFNjaGVtYSB2YWxpZGF0aW9uIHdpbGwgbm90IHdvcmsgd2l0aCBYZXJjZXMgMi4yLgorICAgICAgIC0tPgorICAgICAgPEhvc3QgbmFtZT0ibG9jYWxob3N0IiBkZWJ1Zz0iMCIgYXBwQmFzZT0id2ViYXBwcyIKKyAgICAgICB1bnBhY2tXQVJzPSJ0cnVlIiBhdXRvRGVwbG95PSJ0cnVlIgorICAgICAgIHhtbFZhbGlkYXRpb249ImZhbHNlIiB4bWxOYW1lc3BhY2VBd2FyZT0iZmFsc2UiPgorCisgICAgICAgIDwhLS0gRGVmaW5lcyBhIGNsdXN0ZXIgZm9yIHRoaXMgbm9kZSwKKyAgICAgICAgICAgICBCeSBkZWZpbmluZyB0aGlzIGVsZW1lbnQsIG1lYW5zIHRoYXQgZXZlcnkgbWFuYWdlciB3aWxsIGJlIGNoYW5nZWQuCisgICAgICAgICAgICAgU28gd2hlbiBydW5uaW5nIGEgY2x1c3Rlciwgb25seSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB3ZWJhcHBzIGluIHRoZXJlCisgICAgICAgICAgICAgdGhhdCBuZWVkIHRvIGJlIGNsdXN0ZXJlZCBhbmQgcmVtb3ZlIHRoZSBvdGhlciBvbmVzLgorICAgICAgICAgICAgIEEgY2x1c3RlciBoYXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorCisgICAgICAgICAgICAgY2xhc3NOYW1lID0gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbHVzdGVyIGNsYXNzCisKKyAgICAgICAgICAgICBuYW1lID0gYSBkZXNjcmlwdGl2ZSBuYW1lIGZvciB5b3VyIGNsdXN0ZXIsIGNhbiBiZSBhbnl0aGluZworCisgICAgICAgICAgICAgZGVidWcgPSB0aGUgZGVidWcgbGV2ZWwsIGhpZ2hlciBtZWFucyBtb3JlIG91dHB1dAorCisgICAgICAgICAgICAgbWNhc3RBZGRyID0gdGhlIG11bHRpY2FzdCBhZGRyZXNzLCBoYXMgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCB0aGUgbm9kZXMKKworICAgICAgICAgICAgIG1jYXN0UG9ydCA9IHRoZSBtdWx0aWNhc3QgcG9ydCwgaGFzIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgdGhlIG5vZGVzCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgbWNhc3RCaW5kQWRkciA9IGJpbmQgdGhlIG11bHRpY2FzdCBzb2NrZXQgdG8gYSBzcGVjaWZpYyBhZGRyZXNzCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgbWNhc3RUVEwgPSB0aGUgbXVsdGljYXN0IFRUTCBpZiB5b3Ugd2FudCB0byBsaW1pdCB5b3VyIGJyb2FkY2FzdAorICAgICAgICAgICAgIAorICAgICAgICAgICAgIG1jYXN0U29UaW1lb3V0ID0gdGhlIG11bHRpY2FzdCByZWFkdGltZW91dCAKKworICAgICAgICAgICAgIG1jYXN0RnJlcXVlbmN5ID0gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYmV0d2VlbiBzZW5kaW5nIGEgIkknbSBhbGl2ZSIgaGVhcnRiZWF0CisKKyAgICAgICAgICAgICBtY2FzdERyb3BUaW1lID0gdGhlIG51bWJlciBhIG1pbGxpc2Vjb25kcyBiZWZvcmUgYSBub2RlIGlzIGNvbnNpZGVyZWQgImRlYWQiIGlmIG5vIGhlYXJ0YmVhdCBpcyByZWNlaXZlZAorCisgICAgICAgICAgICAgdGNwVGhyZWFkQ291bnQgPSB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdG8gaGFuZGxlIGluY29taW5nIHJlcGxpY2F0aW9uIHJlcXVlc3RzLCBvcHRpbWFsIHdvdWxkIGJlIHRoZSBzYW1lIGFtb3VudCBvZiB0aHJlYWRzIGFzIG5vZGVzIAorCisgICAgICAgICAgICAgdGNwTGlzdGVuQWRkcmVzcyA9IHRoZSBsaXN0ZW4gYWRkcmVzcyAoYmluZCBhZGRyZXNzKSBmb3IgVENQIGNsdXN0ZXIgcmVxdWVzdCBvbiB0aGlzIGhvc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBjYXNlIG9mIG11bHRpcGxlIGV0aGVybmV0IGNhcmRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIG1lYW5zIHRoYXQgYWRkcmVzcyBiZWNvbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3RBZGRyZXNzKCkKKworICAgICAgICAgICAgIHRjcExpc3RlblBvcnQgPSB0aGUgdGNwIGxpc3RlbiBwb3J0CisKKyAgICAgICAgICAgICB0Y3BTZWxlY3RvclRpbWVvdXQgPSB0aGUgdGltZW91dCAobXMpIGZvciB0aGUgU2VsZWN0b3Iuc2VsZWN0KCkgbWV0aG9kIGluIGNhc2UgdGhlIE9TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGEgd2FrdXAgYnVnIGluIGphdmEubmlvLiBTZXQgdG8gMCBmb3Igbm8gdGltZW91dAorCisgICAgICAgICAgICAgcHJpbnRUb1NjcmVlbiA9IHRydWUgbWVhbnMgdGhhdCBtYW5hZ2VycyB3aWxsIGFsc28gcHJpbnQgdG8gc3RkLm91dAorCisgICAgICAgICAgICAgZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duID0gdHJ1ZSBtZWFucyB0aGF0IAorCisgICAgICAgICAgICAgdXNlRGlydHlGbGFnID0gdHJ1ZSBtZWFucyB0aGF0IHdlIG9ubHkgcmVwbGljYXRlIGEgc2Vzc2lvbiBhZnRlciBzZXRBdHRyaWJ1dGUscmVtb3ZlQXR0cmlidXRlIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBtZWFucyB0byByZXBsaWNhdGUgdGhlIHNlc3Npb24gYWZ0ZXIgZWFjaCByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG1lYW5zIHRoYXQgcmVwbGljYXRpb24gd291bGQgd29yayBmb3IgdGhlIGZvbGxvd2luZyBwaWVjZSBvZiBjb2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaE1hcCBtYXAgPSAoSGFzaE1hcClzZXNzaW9uLmdldEF0dHJpYnV0ZSgibWFwIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dCgia2V5IiwidmFsdWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlPgorICAgICAgICAgICAgIHJlcGxpY2F0aW9uTW9kZSA9IGNhbiBiZSBlaXRoZXIgJ3Bvb2xlZCcsICdzeW5jaHJvbm91cycgb3IgJ2FzeW5jaHJvbm91cycuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQb29sZWQgbWVhbnMgdGhhdCB0aGUgcmVwbGljYXRpb24gaGFwcGVucyB1c2luZyBzZXZlcmFsIHNvY2tldHMgaW4gYSBzeW5jaHJvbm91cyB3YXkuIEllLCB0aGUgZGF0YSBnZXRzIHJlcGxpY2F0ZWQsIHRoZW4gdGhlIHJlcXVlc3QgcmV0dXJuLiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSAnc3luY2hyb25vdXMnIHNldHRpbmcgZXhjZXB0IGl0IHVzZXMgYSBwb29sIG9mIHNvY2tldHMsIGhlbmNlIGl0IGlzIG11bHRpdGhyZWFkZWQuIFRoaXMgaXMgdGhlIGZhc3Rlc3QgYW5kIHNhZmVzdCBjb25maWd1cmF0aW9uLiBUbyB1c2UgdGhpcywgYWxzbyBpbmNyZWFzZSB0aGUgbnIgb2YgdGNwIHRocmVhZHMgdGhhdCB5b3UgaGF2ZSBkZWFsaW5nIHdpdGggcmVwbGljYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTeW5jaHJvbm91cyBtZWFucyB0aGF0IHRoZSB0aHJlYWQgdGhhdCBleGVjdXRlcyB0aGUgcmVxdWVzdCwgaXMgYWxzbyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQgdGhlIHJlcGxpY2F0ZXMgdGhlIGRhdGEgdG8gdGhlIG90aGVyIG5vZGVzLCBhbmQgd2lsbCBub3QgcmV0dXJuIHVudGlsIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzIGhhdmUgcmVjZWl2ZWQgdGhlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXN5bmNocm9ub3VzIG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBzcGVjaWZpYyAnc2VuZGVyJyB0aHJlYWQgZm9yIGVhY2ggY2x1c3RlciBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoZSByZXF1ZXN0IHRocmVhZCB3aWxsIHF1ZXVlIHRoZSByZXBsaWNhdGlvbiByZXF1ZXN0IGludG8gYSAic21hcnQiIHF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIHJldHVybiB0byB0aGUgY2xpZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAic21hcnQiIHF1ZXVlIGlzIGEgcXVldWUgd2hlcmUgd2hlbiBhIHNlc3Npb24gaXMgYWRkZWQgdG8gdGhlIHF1ZXVlLCBhbmQgdGhlIHNhbWUgc2Vzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgZXhpc3RzIGluIHRoZSBxdWV1ZSBmcm9tIGEgcHJldmlvdXMgcmVxdWVzdCwgdGhhdCBzZXNzaW9uIHdpbGwgYmUgcmVwbGFjZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcXVldWUgaW5zdGVhZCBvZiByZXBsaWNhdGluZyB0d28gcmVxdWVzdHMuIFRoaXMgYWxtb3N0IG5ldmVyIGhhcHBlbnMsIHVubGVzcyB0aGVyZSBpcyBhIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlIG5ldHdvcmsgZGVsYXkuCisgICAgICAgIC0tPiAgICAgICAgICAgICAKKyAgICAgICAgPCEtLQorICAgICAgICAgICAgV2hlbiBjb25maWd1cmluZyBmb3IgY2x1c3RlcmluZywgeW91IGFsc28gYWRkIGluIGEgdmFsdmUgdG8gY2F0Y2ggYWxsIHRoZSByZXF1ZXN0cworICAgICAgICAgICAgY29taW5nIGluLCBhdCB0aGUgZW5kIG9mIHRoZSByZXF1ZXN0LCB0aGUgc2Vzc2lvbiBtYXkgb3IgbWF5IG5vdCBiZSByZXBsaWNhdGVkLgorICAgICAgICAgICAgQSBzZXNzaW9uIGlzIHJlcGxpY2F0ZWQgaWYgYW5kIG9ubHkgaWYgYWxsIHRoZSBjb25kaXRpb25zIGFyZSBtZXQ6CisgICAgICAgICAgICAxLiB1c2VEaXJ0eUZsYWcgaXMgdHJ1ZSBvciBzZXRBdHRyaWJ1dGUgb3IgcmVtb3ZlQXR0cmlidXRlIGhhcyBiZWVuIGNhbGxlZCBBTkQKKyAgICAgICAgICAgIDIuIGEgc2Vzc2lvbiBleGlzdHMgKGhhcyBiZWVuIGNyZWF0ZWQpCisgICAgICAgICAgICAzLiB0aGUgcmVxdWVzdCBpcyBub3QgdHJhcHBlZCBieSB0aGUgImZpbHRlciIgYXR0cmlidXRlCisKKyAgICAgICAgICAgIFRoZSBmaWx0ZXIgYXR0cmlidXRlIGlzIHRvIGZpbHRlciBvdXQgcmVxdWVzdHMgdGhhdCBjb3VsZCBub3QgbW9kaWZ5IHRoZSBzZXNzaW9uLAorICAgICAgICAgICAgaGVuY2Ugd2UgZG9uJ3QgcmVwbGljYXRlIHRoZSBzZXNzaW9uIGFmdGVyIHRoZSBlbmQgb2YgdGhpcyByZXF1ZXN0LgorICAgICAgICAgICAgVGhlIGZpbHRlciBpcyBuZWdhdGl2ZSwgaWUsIGFueXRoaW5nIHlvdSBwdXQgaW4gdGhlIGZpbHRlciwgeW91IG1lYW4gdG8gZmlsdGVyIG91dCwKKyAgICAgICAgICAgIGllLCBubyByZXBsaWNhdGlvbiB3aWxsIGJlIGRvbmUgb24gcmVxdWVzdHMgdGhhdCBtYXRjaCBvbmUgb2YgdGhlIGZpbHRlcnMuCisgICAgICAgICAgICBUaGUgZmlsdGVyIGF0dHJpYnV0ZSBpcyBkZWxpbWl0ZWQgYnkgOywgc28geW91IGNhbid0IGVzY2FwZSBvdXQgOyBldmVuIGlmIHlvdSB3YW50ZWQgdG8uCisKKyAgICAgICAgICAgIGZpbHRlcj0iLipcLmdpZjsuKlwuanM7IiBtZWFucyB0aGF0IHdlIHdpbGwgbm90IHJlcGxpY2F0ZSB0aGUgc2Vzc2lvbiBhZnRlciByZXF1ZXN0cyB3aXRoIHRoZSBVUkkKKyAgICAgICAgICAgIGVuZGluZyB3aXRoIC5naWYgYW5kIC5qcyBhcmUgaW50ZXJjZXB0ZWQuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIFRoZSBkZXBsb3llciBlbGVtZW50IGNhbiBiZSB1c2VkIHRvIGRlcGxveSBhcHBzIGNsdXN0ZXIgd2lkZS4KKyAgICAgICAgICAgIEN1cnJlbnRseSB0aGUgZGVwbG95bWVudCBvbmx5IGRlcGxveXMvdW5kZXBsb3lzIHRvIHdvcmtpbmcgbWVtYmVycyBpbiB0aGUgY2x1c3RlcgorICAgICAgICAgICAgc28gbm8gV0FScyBhcmUgY29waWVkIHVwb25zIHN0YXJ0dXAgb2YgYSBicm9rZW4gbm9kZS4KKyAgICAgICAgICAgIFRoZSBkZXBsb3llciB3YXRjaGVzIGEgZGlyZWN0b3J5ICh3YXRjaERpcikgZm9yIFdBUiBmaWxlcyB3aGVuIHdhdGNoRW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICAgIFdoZW4gYSBuZXcgd2FyIGZpbGUgaXMgYWRkZWQgdGhlIHdhciBnZXRzIGRlcGxveWVkIHRvIHRoZSBsb2NhbCBpbnN0YW5jZSwKKyAgICAgICAgICAgIGFuZCB0aGVuIGRlcGxveWVkIHRvIHRoZSBvdGhlciBpbnN0YW5jZXMgaW4gdGhlIGNsdXN0ZXIuCisgICAgICAgICAgICBXaGVuIGEgd2FyIGZpbGUgaXMgZGVsZXRlZCBmcm9tIHRoZSB3YXRjaERpciB0aGUgd2FyIGlzIHVuZGVwbG95ZWQgbG9jYWxseSAKKyAgICAgICAgICAgIGFuZCBjbHVzdGVyIHdpZGUKKyAgICAgICAgLS0+CisgICAgICAgIAorICAgICAgICA8IS0tCisgICAgICAgIDxDbHVzdGVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5TaW1wbGVUY3BDbHVzdGVyIgorICAgICAgICAgICAgICAgICBtYW5hZ2VyQ2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5EZWx0YU1hbmFnZXIiCisgICAgICAgICAgICAgICAgIGV4cGlyZVNlc3Npb25zT25TaHV0ZG93bj0iZmFsc2UiCisgICAgICAgICAgICAgICAgIHVzZURpcnR5RmxhZz0idHJ1ZSI+CisKKyAgICAgICAgICAgIDxNZW1iZXJzaGlwIAorICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLm1jYXN0Lk1jYXN0U2VydmljZSIKKyAgICAgICAgICAgICAgICBtY2FzdEFkZHI9IjIyOC4wLjAuNCIKKyAgICAgICAgICAgICAgICBtY2FzdFBvcnQ9IjQ1NTY0IgorICAgICAgICAgICAgICAgIG1jYXN0RnJlcXVlbmN5PSI1MDAiCisgICAgICAgICAgICAgICAgbWNhc3REcm9wVGltZT0iMzAwMCIvPgorCisgICAgICAgICAgICA8UmVjZWl2ZXIgCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlJlcGxpY2F0aW9uTGlzdGVuZXIiCisgICAgICAgICAgICAgICAgdGNwTGlzdGVuQWRkcmVzcz0iYXV0byIKKyAgICAgICAgICAgICAgICB0Y3BMaXN0ZW5Qb3J0PSI0MDAxIgorICAgICAgICAgICAgICAgIHRjcFNlbGVjdG9yVGltZW91dD0iMTAwIgorICAgICAgICAgICAgICAgIHRjcFRocmVhZENvdW50PSI2Ii8+CisKKyAgICAgICAgICAgIDxTZW5kZXIKKyAgICAgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25UcmFuc21pdHRlciIKKyAgICAgICAgICAgICAgICByZXBsaWNhdGlvbk1vZGU9InBvb2xlZCIvPgorCisgICAgICAgICAgICA8VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlJlcGxpY2F0aW9uVmFsdmUiCisgICAgICAgICAgICAgICAgICAgZmlsdGVyPSIuKlwuZ2lmOy4qXC5qczsuKlwuanBnOy4qXC5odG07LipcLmh0bWw7LipcLnR4dDsiLz4KKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIDxEZXBsb3llciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5kZXBsb3kuRmFybVdhckRlcGxveWVyIgorICAgICAgICAgICAgICAgICAgICAgIHRlbXBEaXI9Ii90bXAvd2FyLXRlbXAvIgorICAgICAgICAgICAgICAgICAgICAgIGRlcGxveURpcj0iL3RtcC93YXItZGVwbG95LyIKKyAgICAgICAgICAgICAgICAgICAgICB3YXRjaERpcj0iL3RtcC93YXItbGlzdGVuLyIKKyAgICAgICAgICAgICAgICAgICAgICB3YXRjaEVuYWJsZWQ9ImZhbHNlIi8+CisgICAgICAgIDwvQ2x1c3Rlcj4KKyAgICAgICAgLS0+ICAgICAgICAKKworCisKKyAgICAgICAgPCEtLSBOb3JtYWxseSwgdXNlcnMgbXVzdCBhdXRoZW50aWNhdGUgdGhlbXNlbHZlcyB0byBlYWNoIHdlYiBhcHAKKyAgICAgICAgICAgICBpbmRpdmlkdWFsbHkuICBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBlbnRyeSBpZiB5b3Ugd291bGQgbGlrZQorICAgICAgICAgICAgIGEgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkIHRoZSBmaXJzdCB0aW1lIHRoZXkgZW5jb3VudGVyIGEKKyAgICAgICAgICAgICByZXNvdXJjZSBwcm90ZWN0ZWQgYnkgYSBzZWN1cml0eSBjb25zdHJhaW50LCBhbmQgdGhlbiBoYXZlIHRoYXQKKyAgICAgICAgICAgICB1c2VyIGlkZW50aXR5IG1haW50YWluZWQgYWNyb3NzICphbGwqIHdlYiBhcHBsaWNhdGlvbnMgY29udGFpbmVkCisgICAgICAgICAgICAgaW4gdGhpcyB2aXJ0dWFsIGhvc3QuIC0tPgorICAgICAgICA8IS0tCisgICAgICAgIDxWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5TaW5nbGVTaWduT24iCisgICAgICAgICAgICAgICAgICAgZGVidWc9IjAiLz4KKyAgICAgICAgLS0+CisKKyAgICAgICAgPCEtLSBBY2Nlc3MgbG9nIHByb2Nlc3NlcyBhbGwgcmVxdWVzdHMgZm9yIHRoaXMgdmlydHVhbCBob3N0LiAgQnkKKyAgICAgICAgICAgICBkZWZhdWx0LCBsb2cgZmlsZXMgYXJlIGNyZWF0ZWQgaW4gdGhlICJsb2dzIiBkaXJlY3RvcnkgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgICAkQ0FUQUxJTkFfSE9NRS4gIElmIHlvdSB3aXNoLCB5b3UgY2FuIHNwZWNpZnkgYSBkaWZmZXJlbnQKKyAgICAgICAgICAgICBkaXJlY3Rvcnkgd2l0aCB0aGUgImRpcmVjdG9yeSIgYXR0cmlidXRlLiAgU3BlY2lmeSBlaXRoZXIgYSByZWxhdGl2ZQorICAgICAgICAgICAgICh0byAkQ0FUQUxJTkFfSE9NRSkgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgZGVzaXJlZCBkaXJlY3RvcnkuCisgICAgICAgIC0tPgorICAgICAgICA8IS0tCisgICAgICAgIDxWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkFjY2Vzc0xvZ1ZhbHZlIgorICAgICAgICAgICAgICAgICBkaXJlY3Rvcnk9ImxvZ3MiICBwcmVmaXg9ImxvY2FsaG9zdF9hY2Nlc3NfbG9nLiIgc3VmZml4PSIudHh0IgorICAgICAgICAgICAgICAgICBwYXR0ZXJuPSJjb21tb24iIHJlc29sdmVIb3N0cz0iZmFsc2UiLz4KKyAgICAgICAgLS0+CisKKyAgICAgIDwvSG9zdD4KKworICAgIDwvRW5naW5lPgorCisgIDwvU2VydmljZT4KKworPC9TZXJ2ZXI+CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L2dlbnN0b3JlLnhtbCBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3QvZ2Vuc3RvcmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMGJmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L2dlbnN0b3JlLnhtbApAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8cHJvamVjdCBuYW1lPSJzdG9yZSIgZGVmYXVsdD0ic3RvcmUiIGJhc2VkaXI9Ii4iPgorCisgICAgIDx0YXJnZXQgbmFtZT0ic3RvcmUiPgorICAgICAgICA8ZGVsZXRlIGZpbGU9ImNvbmYvY2F0YWxpbmEua2V5c3RvcmUiLz4KKwkJPGdlbmtleSBhbGlhcz0idG9tY2F0IiBzdG9yZXBhc3M9ImNoYW5nZWl0IiBrZXlwYXNzPSJjaGFuZ2VpdCIgCisJCQlrZXlzdG9yZT0iY29uZi9jYXRhbGluYS5rZXlzdG9yZSIga2V5YWxnPSJyc2EiPgorCQkJPGRuYW1lPgorCQkJCTxwYXJhbSBuYW1lPSJDTiIgdmFsdWU9ImxvY2FsaG9zdCIvPgorCQkJCTxwYXJhbSBuYW1lPSJPVSIgdmFsdWU9IlNvZnR3YXJlIERldmVwbG9tZW50IFRvbWNhdCIvPgorCQkJCTxwYXJhbSBuYW1lPSJPIiB2YWx1ZT0iQXBhY2hlIEZvdW5kYXRpb24iLz4KKwkJCQk8cGFyYW0gbmFtZT0iTCIgdmFsdWU9IkJvY2h1bSIvPgorCQkJCTxwYXJhbSBuYW1lPSJDIiB2YWx1ZT0iREUiLz4KKwkJCTwvZG5hbWU+CisJCTwvZ2Vua2V5PgorICAgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0Nvbm5lY3RvclNGVGVzdC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Db25uZWN0b3JTRlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTRkMTY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Db25uZWN0b3JTRlRlc3QuamF2YQpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuQ29ubmVjdG9yOworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqICAKKyAqLworcHVibGljIGNsYXNzIENvbm5lY3RvclNGVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5OworCisgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgIFByaW50V3JpdGVyIHBXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKKworICAgIENvbm5lY3RvciBjb25uZWN0b3I7CisKKyAgICBDb25uZWN0b3JTRiBmYWN0b3J5OworCisgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjOworCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgcmVnaXN0cnkgPSBuZXcgU3RvcmVSZWdpc3RyeSgpOworICAgICAgICBkZXNjID0gbmV3IFN0b3JlRGVzY3JpcHRpb24oKTsKKyAgICAgICAgZGVzYy5zZXRUYWcoIkNvbm5lY3RvciIpOworICAgICAgICBkZXNjLnNldFRhZ0NsYXNzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5Db25uZWN0b3IiKTsKKyAgICAgICAgZGVzYy5zZXRTdGFuZGFyZChmYWxzZSk7CisgICAgICAgIGRlc2MKKyAgICAgICAgICAgICAgICAuc2V0U3RvcmVGYWN0b3J5Q2xhc3MoIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuQ29ubmVjdG9yU0YiKTsKKyAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJEZXNjcmlwdGlvbihkZXNjKTsKKyAgICAgICAgZmFjdG9yeSA9IG5ldyBDb25uZWN0b3JTRigpOworICAgICAgICBkZXNjLnNldFN0b3JlRmFjdG9yeShmYWN0b3J5KTsKKyAgICAgICAgZGVzYy5nZXRTdG9yZUZhY3RvcnkoKS5zZXRTdG9yZUFwcGVuZGVyKG5ldyBDb25uZWN0b3JTdG9yZUFwcGVuZGVyKCkpOworICAgICAgICBmYWN0b3J5LnNldFJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKKyAgICAgICAgZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoIm1pblByb2Nlc3NvciIpOworICAgICAgICBkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgibWF4UHJvY2Vzc29yIik7CisgICAgICAgIHJlZ2lzdGVyRGVzY3JpcHRvcigiTGlzdGVuZXIiLCBMaWZlY3ljbGVMaXN0ZW5lci5jbGFzcyk7CisgICAgICAgIGNvbm5lY3RvciA9IG5ldyBDb25uZWN0b3IoIkhUVFAvMS4xIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdG9yZURlc2NyaXB0aW9uIHJlZ2lzdGVyRGVzY3JpcHRvcihTdHJpbmcgdGFnLCBDbGFzcyBhQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIHJlZ2lzdGVyRGVzY3JpcHRvcih0YWcsIGFDbGFzcywKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgU3RvcmVEZXNjcmlwdGlvbiByZWdpc3RlckRlc2NyaXB0b3IoU3RyaW5nIHRhZywgQ2xhc3MgYUNsYXNzLAorICAgICAgICAgICAgU3RyaW5nIGZhY3RvcnlDbGFzcywgYm9vbGVhbiBmc3RhbmRhcmQsIGJvb2xlYW4gZmRlZmF1bHQpIHsKKyAgICAgICAgcmV0dXJuIERlc2NyaXB0b3JIZWxwZXIucmVnaXN0ZXJEZXNjcmlwdG9yKGRlc2MsIHJlZ2lzdHJ5LCBhQ2xhc3MKKyAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLCB0YWcsIGFDbGFzcy5nZXROYW1lKCksIGZhY3RvcnlDbGFzcywgZnN0YW5kYXJkLAorICAgICAgICAgICAgICAgIGZkZWZhdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY29ubmVjdG9yCisgICAgICAgICAgICAgICAgLmFkZExpZmVjeWNsZUxpc3RlbmVyKG5ldyBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5TZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcigpKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxDb25uZWN0b3I+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxMaXN0ZW5lciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5TZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lclwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICI8L0Nvbm5lY3Rvcj4iICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aFByb3RvY29sSGFuZGxlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb25uZWN0b3Iuc2V0UHJvcGVydHkoImFjY2VwdENvdW50IiwgIjEwIik7CisgICAgICAgIGNvbm5lY3Rvci5zZXRQcm9wZXJ0eSgibWF4U3BhcmVUaHJlYWRzIiwgIjc0Iik7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8Q29ubmVjdG9yIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIG1heFNwYXJlVGhyZWFkcz1cIjc0XCIiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgYWNjZXB0Q291bnQ9XCIxMFwiPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIjwvQ29ubmVjdG9yPiIgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZUFKUCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb25uZWN0b3Iuc2V0UHJvdG9jb2woIkFKUC8xLjMiKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxDb25uZWN0b3IiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgcHJvdG9jb2w9XCJBSlAvMS4zXCI+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiPC9Db25uZWN0b3I+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNTTCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXR1cFNlY3VyZUNvbm5lY3RvcigpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPENvbm5lY3RvciIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBwb3J0PVwiODQ0M1wiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIHNjaGVtZT1cImh0dHBzXCIiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgc2VjdXJlPVwidHJ1ZVwiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIG1pblNwYXJlVGhyZWFkcz1cIjMwXCIiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgY2xpZW50QXV0aD1cImZhbHNlXCIiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAga2V5c3RvcmVQYXNzPVwiY2hhbmdlaXRcIiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBrZXlzdG9yZUZpbGU9XCJjb25mL2NhdGFsaW5hLmtleXN0b3JlXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgICAgbWF4U3BhcmVUaHJlYWRzPVwiMTc1XCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgICAgc3NsUHJvdG9jb2w9XCJUTFNcIj4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICI8L0Nvbm5lY3Rvcj4iICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFNlY3VyZUNvbm5lY3RvcigpIHsKKyAgICAgICAgY29ubmVjdG9yLnNldFBvcnQoODQ0Myk7CisgICAgICAgIGNvbm5lY3Rvci5zZXRQcm9wZXJ0eSgibWluU3BhcmVUaHJlYWRzIiwgIjMwIik7CisgICAgICAgIGNvbm5lY3Rvci5zZXRQcm9wZXJ0eSgibWF4U3BhcmVUaHJlYWRzIiwgIjE3NSIpOworICAgICAgICBjb25uZWN0b3Iuc2V0RW5hYmxlTG9va3VwcyhmYWxzZSk7CisgICAgICAgIGNvbm5lY3Rvci5zZXRQcm9wZXJ0eSgiZGlzYWJsZVVwbG9hZFRpbWVvdXQiLCAidHJ1ZSIpOworICAgICAgICBjb25uZWN0b3Iuc2V0U2VjdXJlKHRydWUpOworICAgICAgICBjb25uZWN0b3Iuc2V0UHJvcGVydHkoImJhY2tsb2ciLCAiMTAwIik7CisgICAgICAgIGNvbm5lY3Rvci5zZXRTY2hlbWUoImh0dHBzIik7CisgICAgICAgIGNvbm5lY3Rvci5zZXRQcm9wZXJ0eSgiY2xpZW50QXV0aCIsICJmYWxzZSIpOworICAgICAgICBjb25uZWN0b3Iuc2V0UHJvcGVydHkoInNzbFByb3RvY29sIiwgIlRMUyIpOworICAgICAgICBjb25uZWN0b3Iuc2V0UHJvcGVydHkoImtleXN0b3JlRmlsZSIsICJjb25mL2NhdGFsaW5hLmtleXN0b3JlIik7CisgICAgICAgIGNvbm5lY3Rvci5zZXRQcm9wZXJ0eSgia2V5c3RvcmVQYXNzIiwgImNoYW5nZWl0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RvckFwcGVuZGVyKCkgdGhyb3dzIEludHJvc3BlY3Rpb25FeGNlcHRpb24geworICAgICAgICBzZXR1cFNlY3VyZUNvbm5lY3RvcigpOworICAgICAgICBDb25uZWN0b3JTdG9yZUFwcGVuZGVyIGFwcGVuZGVyID0gKENvbm5lY3RvclN0b3JlQXBwZW5kZXIpZGVzYy5nZXRTdG9yZUZhY3RvcnkoKS5nZXRTdG9yZUFwcGVuZGVyKCk7CisgICAgICAgIExpc3QgcHJvcGVydHlMaXN0ID0gYXBwZW5kZXIuZ2V0UHJvcGVydHlLZXlzKGNvbm5lY3Rvcik7CisgICAgICAgIGFzc2VydFRydWUocHJvcGVydHlMaXN0LmNvbnRhaW5zKCJwcm90b2NvbCIpKTsgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3JlRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxDb25uZWN0b3I+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiPC9Db25uZWN0b3I+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2soU3RyaW5nIGFzcGVjdGVkUmVzdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmFjdG9yeS5zdG9yZShwV3JpdGVyLCAtMiwgY29ubmVjdG9yKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzcGVjdGVkUmVzdWx0LCB3cml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Db25uZWN0b3JTdG9yZUFwcGVuZGVyVGVzdC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Db25uZWN0b3JTdG9yZUFwcGVuZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMWY2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0Nvbm5lY3RvclN0b3JlQXBwZW5kZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuQ29ubmVjdG9yOworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqICAKKyAqLworcHVibGljIGNsYXNzIENvbm5lY3RvclN0b3JlQXBwZW5kZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIFN0b3JlUmVnaXN0cnkgcmVnaXN0cnk7CisKKyAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCisgICAgUHJpbnRXcml0ZXIgcFdyaXRlciA9IG5ldyBQcmludFdyaXRlcih3cml0ZXIpOworCisgICAgQ29ubmVjdG9yIGNvbm5lY3RvcjsKKworICAgIENvbm5lY3RvclNGIGZhY3Rvcnk7CisKKyAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2M7CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICByZWdpc3RyeSA9IG5ldyBTdG9yZVJlZ2lzdHJ5KCk7CisgICAgICAgIGRlc2MgPSBuZXcgU3RvcmVEZXNjcmlwdGlvbigpOworICAgICAgICBkZXNjLnNldFRhZygiQ29ubmVjdG9yIik7CisgICAgICAgIGRlc2Muc2V0VGFnQ2xhc3MoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvciIpOworICAgICAgICBkZXNjLnNldFN0YW5kYXJkKGZhbHNlKTsKKyAgICAgICAgZGVzYworICAgICAgICAgICAgICAgIC5zZXRTdG9yZUZhY3RvcnlDbGFzcygib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5Db25uZWN0b3JTRiIpOworICAgICAgICByZWdpc3RyeS5yZWdpc3RlckRlc2NyaXB0aW9uKGRlc2MpOworICAgICAgICBmYWN0b3J5ID0gbmV3IENvbm5lY3RvclNGKCk7CisgICAgICAgIGRlc2Muc2V0U3RvcmVGYWN0b3J5KGZhY3RvcnkpOworICAgICAgICBkZXNjLmdldFN0b3JlRmFjdG9yeSgpLnNldFN0b3JlQXBwZW5kZXIobmV3IENvbm5lY3RvclN0b3JlQXBwZW5kZXIoKSk7CisgICAgICAgIGZhY3Rvcnkuc2V0UmVnaXN0cnkocmVnaXN0cnkpOworICAgICAgICByZWdpc3RlckRlc2NyaXB0b3IoIkxpc3RlbmVyIiwgTGlmZWN5Y2xlTGlzdGVuZXIuY2xhc3MpOworICAgICAgICBjb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9yKCJIVFRQLzEuMSIpOworICAgIH0KKworICAgIHByaXZhdGUgU3RvcmVEZXNjcmlwdGlvbiByZWdpc3RlckRlc2NyaXB0b3IoU3RyaW5nIHRhZywgQ2xhc3MgYUNsYXNzKSB7CisgICAgICAgIHJldHVybiByZWdpc3RlckRlc2NyaXB0b3IodGFnLCBhQ2xhc3MsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIGZhbHNlLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0b3JlRGVzY3JpcHRpb24gcmVnaXN0ZXJEZXNjcmlwdG9yKFN0cmluZyB0YWcsIENsYXNzIGFDbGFzcywKKyAgICAgICAgICAgIFN0cmluZyBmYWN0b3J5Q2xhc3MsIGJvb2xlYW4gZnN0YW5kYXJkLCBib29sZWFuIGZkZWZhdWx0KSB7CisgICAgICAgIHJldHVybiBEZXNjcmlwdG9ySGVscGVyLnJlZ2lzdGVyRGVzY3JpcHRvcihkZXNjLCByZWdpc3RyeSwgYUNsYXNzCisgICAgICAgICAgICAgICAgLmdldE5hbWUoKSwgdGFnLCBhQ2xhc3MuZ2V0TmFtZSgpLCBmYWN0b3J5Q2xhc3MsIGZzdGFuZGFyZCwKKyAgICAgICAgICAgICAgICBmZGVmYXVsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdG9yU3RvcmVBcHBlbmRlciBhcHBlbmRlciA9IG5ldyBDb25uZWN0b3JTdG9yZUFwcGVuZGVyKCk7CisgICAgICAgIExpc3QgcHJvcGVydGllcyA9IGFwcGVuZGVyLmdldFByb3BlcnR5S2V5cyhjb25uZWN0b3IpOworICAgICAgICBhc3NlcnRUcnVlKHByb3BlcnRpZXMuY29udGFpbnMoImVtcHR5U2Vzc2lvblBhdGgiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHByb3BlcnRpZXMuY29udGFpbnMoInByb3RvY29sIikpOworICAgICAgICBhc3NlcnRGYWxzZShwcm9wZXJ0aWVzLmNvbnRhaW5zKCJwcm90b2NvbEhhbmRsZXJDbGFzc05hbWUiKSk7CisgICAgICAgIC8vIEhUVFAvMS4xIFNTTCBQcm90b2NvbCBUZXN0CisgICAgICAgIGNvbm5lY3Rvci5zZXRQcm9wZXJ0eSgic3NsUHJvdG9jb2wiLCAiVExTIik7CisgICAgICAgIHByb3BlcnRpZXMgPSBhcHBlbmRlci5nZXRQcm9wZXJ0eUtleXMoY29ubmVjdG9yKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wZXJ0aWVzLmNvbnRhaW5zKCJwcm90b2NvbCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3RvclN0b3JlQXBwZW5kZXIgYXBwZW5kZXIgPSBuZXcgQ29ubmVjdG9yU3RvcmVBcHBlbmRlcigpOworICAgICAgICBjb25uZWN0b3Iuc2V0UHJveHlQb3J0KDgwKTsKKyAgICAgICAgY29ubmVjdG9yLnNldFByb3BlcnR5KCJhY2NlcHRDb3VudCIsICIxMTAiKTsKKyAgICAgICAgYXBwZW5kZXIucHJpbnRBdHRyaWJ1dGVzKHBXcml0ZXIsIC0yLCBmYWxzZSwgY29ubmVjdG9yLCBkZXNjKTsKKworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSBMRi5MSU5FX1NFUEFSQVRPUiArICIgIHByb3h5UG9ydD1cIjgwXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgIGFjY2VwdENvdW50PVwiMTEwXCIiOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNwZWN0ZWRSZXN1bHQsIHdyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0Rlc2NyaXB0b3JIZWxwZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvRGVzY3JpcHRvckhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MDA5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0Rlc2NyaXB0b3JIZWxwZXIuamF2YQpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2F0YWxpbmFDbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyRGVwbG95ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJSZWNlaXZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclNlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVtYmVyc2hpcFNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lc3NhZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RWpiOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0TG9jYWxFamI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUVudlJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VMaW5rOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk5hbWluZ1Jlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBEZXNjcmlwdG9ySGVscGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGVzY3JpcHRvckhlbHBlci5jbGFzcyk7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0b3JlRGVzY3JpcHRpb24gcmVnaXN0ZXJEZXNjcmlwdG9yKAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBwYXJlbnRkZXNjLCBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgdGFnLAorICAgICAgICAgICAgQ2xhc3MgYUNsYXNzKSB7CisgICAgICAgIHJldHVybiByZWdpc3RlckRlc2NyaXB0b3IocGFyZW50ZGVzYywgcmVnaXN0cnksIGFDbGFzcy5nZXROYW1lKCksIHRhZywKKyAgICAgICAgICAgICAgICBhQ2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdG9yZURlc2NyaXB0aW9uIHJlZ2lzdGVyRGVzY3JpcHRvcigKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gcGFyZW50ZGVzYywgU3RvcmVSZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHRhZywKKyAgICAgICAgICAgIFN0cmluZyBhQ2xhc3NUb2tlbiwgU3RyaW5nIGZhY3RvcnlDbGFzcywgYm9vbGVhbiBmc3RhbmRhcmQsCisgICAgICAgICAgICBib29sZWFuIGZkZWZhdWx0KSB7CisgICAgICAgIHJldHVybiByZWdpc3RlckRlc2NyaXB0b3IocGFyZW50ZGVzYywgcmVnaXN0cnksIGFDbGFzc1Rva2VuLCB0YWcsCisgICAgICAgICAgICAgICAgYUNsYXNzVG9rZW4sCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIGZhbHNlLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBhIGRlc2NyaXB0b3IgYW5kIHJlZ2lzdGVyIHRoaXMgdG8gYW5vdGhlciBwYXJlbnQgZGVzY3JpcHRvci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyZW50ZGVzYworICAgICAqIEBwYXJhbSByZWdpc3RyeQorICAgICAqIEBwYXJhbSBpZAorICAgICAqIEBwYXJhbSB0YWcKKyAgICAgKiBAcGFyYW0gYUNsYXNzVG9rZW4KKyAgICAgKiBAcGFyYW0gZmFjdG9yeUNsYXNzCisgICAgICogQHBhcmFtIGZzdGFuZGFyZAorICAgICAqIEBwYXJhbSBmZGVmYXVsdAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0b3JlRGVzY3JpcHRpb24gcmVnaXN0ZXJEZXNjcmlwdG9yKAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBwYXJlbnRkZXNjLCBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgaWQsCisgICAgICAgICAgICBTdHJpbmcgdGFnLCBTdHJpbmcgYUNsYXNzVG9rZW4sIFN0cmluZyBmYWN0b3J5Q2xhc3MsCisgICAgICAgICAgICBib29sZWFuIGZzdGFuZGFyZCwgYm9vbGVhbiBmZGVmYXVsdCkgeworICAgICAgICAvLyBhZGQgTGlzdGVuZXIKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjQ2hpbGQgPSBuZXcgU3RvcmVEZXNjcmlwdGlvbigpOworICAgICAgICBkZXNjQ2hpbGQuc2V0SWQoaWQpOworICAgICAgICBkZXNjQ2hpbGQuc2V0VGFnKHRhZyk7CisgICAgICAgIGRlc2NDaGlsZC5zZXRUYWdDbGFzcyhhQ2xhc3NUb2tlbik7CisgICAgICAgIGRlc2NDaGlsZC5zZXRTdGFuZGFyZChmc3RhbmRhcmQpOworICAgICAgICBkZXNjQ2hpbGQuc2V0RGVmYXVsdChmZGVmYXVsdCk7CisgICAgICAgIGRlc2NDaGlsZC5zZXRTdG9yZUZhY3RvcnlDbGFzcyhmYWN0b3J5Q2xhc3MpOworICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBhRmFjdG9yeUNsYXNzID0gQ2xhc3MuZm9yTmFtZShmYWN0b3J5Q2xhc3MpOworICAgICAgICAgICAgZmFjdG9yeSA9IGFGYWN0b3J5Q2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICAoKElTdG9yZUZhY3RvcnkpIGZhY3RvcnkpLnNldFJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKKyAgICAgICAgICAgIGRlc2NDaGlsZC5zZXRTdG9yZUZhY3RvcnkoKElTdG9yZUZhY3RvcnkpIGZhY3RvcnkpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJlbnRkZXNjICE9IG51bGwpCisgICAgICAgICAgICBwYXJlbnRkZXNjLnNldENoaWxkcyh0cnVlKTsKKyAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJEZXNjcmlwdGlvbihkZXNjQ2hpbGQpOworICAgICAgICByZXR1cm4gZGVzY0NoaWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlZ2lzdGVyIGFsbCBSZWdpc3RlcnkgZGVzY3JpcHRvcnMgb24gbmFtaW5nIHN1cHBvcnQgdG8gY29udGV4dCEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyZW50CisgICAgICogQHBhcmFtIHJlZ2lzdHJ5CisgICAgICogQHJldHVybgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdG9yZURlc2NyaXB0aW9uIHJlZ2lzdGVyTmFtaW5nRGVzY3JpcHRvcigKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gcGFyZW50LCBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIG5hbWVpbmdEZXNjID0gRGVzY3JpcHRvckhlbHBlci5yZWdpc3RlckRlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgcGFyZW50LCByZWdpc3RyeSwgTmFtaW5nUmVzb3VyY2VzLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAiTmFtaW5nUmVzb3VyY2VzIiwgTmFtaW5nUmVzb3VyY2VzLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5OYW1pbmdSZXNvdXJjZXNTRiIsIHRydWUsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICByZWdpc3RlckRlc2NyaXB0b3IobmFtZWluZ0Rlc2MsIHJlZ2lzdHJ5LCBDb250ZXh0RWpiLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAiRUpCIiwgQ29udGV4dEVqYi5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgcmVnaXN0ZXJEZXNjcmlwdG9yKG5hbWVpbmdEZXNjLCByZWdpc3RyeSwgQ29udGV4dEVudmlyb25tZW50LmNsYXNzCisgICAgICAgICAgICAgICAgLmdldE5hbWUoKSwgIkVudmlyb25tZW50IiwgQ29udGV4dEVudmlyb25tZW50LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgdHJ1ZSwgZmFsc2UpOworICAgICAgICByZWdpc3RlckRlc2NyaXB0b3IobmFtZWluZ0Rlc2MsIHJlZ2lzdHJ5LCBDb250ZXh0TG9jYWxFamIuY2xhc3MKKyAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLCAiTG9jYWxFamIiLCBDb250ZXh0TG9jYWxFamIuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIHJlZ2lzdGVyRGVzY3JpcHRvcihuYW1laW5nRGVzYywgcmVnaXN0cnksIENvbnRleHRSZXNvdXJjZS5jbGFzcworICAgICAgICAgICAgICAgIC5nZXROYW1lKCksICJSZXNvdXJjZSIsIENvbnRleHRSZXNvdXJjZS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgcmVnaXN0ZXJEZXNjcmlwdG9yKG5hbWVpbmdEZXNjLCByZWdpc3RyeSwgQ29udGV4dFJlc291cmNlTGluay5jbGFzcworICAgICAgICAgICAgICAgIC5nZXROYW1lKCksICJSZXNvdXJjZUxpbmsiLAorICAgICAgICAgICAgICAgIENvbnRleHRSZXNvdXJjZUxpbmsuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIHJlZ2lzdGVyRGVzY3JpcHRvcihuYW1laW5nRGVzYywgcmVnaXN0cnksIENvbnRleHRSZXNvdXJjZUVudlJlZi5jbGFzcworICAgICAgICAgICAgICAgIC5nZXROYW1lKCksICJSZXNvdXJjZUVudlJlZiIsIENvbnRleHRSZXNvdXJjZUVudlJlZi5jbGFzcworICAgICAgICAgICAgICAgIC5nZXROYW1lKCksICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLAorICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIG5hbWVpbmdEZXNjOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlZ2lzdGVyIGFsbCBjbHVzdGVyIGFuZCBzdWJlbGVtZW50IGRlc2NyaXB0b3JzIHRvIHJlZ2lzdGVyeQorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJlbnQKKyAgICAgKiBAcGFyYW0gcmVnaXN0cnkKKyAgICAgKiBAcmV0dXJuCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0b3JlRGVzY3JpcHRpb24gcmVnaXN0ZXJDbHVzdGVyRGVzY3JpcHRvcigKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gcGFyZW50LCBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGNsdXN0ZXJEZXNjID0gRGVzY3JpcHRvckhlbHBlci5yZWdpc3RlckRlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgcGFyZW50LCByZWdpc3RyeSwgQ2F0YWxpbmFDbHVzdGVyLmNsYXNzLmdldE5hbWUoKSwgIkNsdXN0ZXIiLAorICAgICAgICAgICAgICAgIENhdGFsaW5hQ2x1c3Rlci5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuQ2F0YWxpbmFDbHVzdGVyU0YiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIHJlZ2lzdGVyRGVzY3JpcHRvcihjbHVzdGVyRGVzYywgcmVnaXN0cnksCisgICAgICAgICAgICAgICAgQ2x1c3RlclNlbmRlci5jbGFzcy5nZXROYW1lKCksICJTZW5kZXIiLCBDbHVzdGVyU2VuZGVyLmNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIHJlZ2lzdGVyRGVzY3JpcHRvcihjbHVzdGVyRGVzYywgcmVnaXN0cnksIENsdXN0ZXJSZWNlaXZlci5jbGFzcworICAgICAgICAgICAgICAgIC5nZXROYW1lKCksICJSZWNlaXZlciIsIENsdXN0ZXJSZWNlaXZlci5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIGZhbHNlLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgcmVnaXN0ZXJEZXNjcmlwdG9yKGNsdXN0ZXJEZXNjLCByZWdpc3RyeSwgTWVtYmVyc2hpcFNlcnZpY2UuY2xhc3MKKyAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLCAiTWVtYmVyc2hpcCIsIE1lbWJlcnNoaXBTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICByZWdpc3RlckRlc2NyaXB0b3IoY2x1c3RlckRlc2MsIHJlZ2lzdHJ5LCBDbHVzdGVyRGVwbG95ZXIuY2xhc3MKKyAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLCAiRGVwbG95ZXIiLCBDbHVzdGVyRGVwbG95ZXIuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIHJlZ2lzdGVyRGVzY3JpcHRvcihjbHVzdGVyRGVzYywgcmVnaXN0cnksIE1lc3NhZ2VMaXN0ZW5lci5jbGFzcworICAgICAgICAgICAgICAgIC5nZXROYW1lKCksICJDbHVzdGVyTGlzdGVuZXIiLCBNZXNzYWdlTGlzdGVuZXIuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIHJldHVybiBjbHVzdGVyRGVzYzsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0dsb2JhbE5hbWluZ1Jlc291cmNlc1NGVGVzdC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9HbG9iYWxOYW1pbmdSZXNvdXJjZXNTRlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWFiOTAxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9HbG9iYWxOYW1pbmdSZXNvdXJjZXNTRlRlc3QuamF2YQpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVqYjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dExvY2FsRWpiOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VFbnZSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlTGluazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5HbG9iYWxOYW1pbmdSZXNvdXJjZXNTRjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZVJlZ2lzdHJ5OworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqICAKKyAqLworcHVibGljIGNsYXNzIEdsb2JhbE5hbWluZ1Jlc291cmNlc1NGVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5OworCisgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgIFByaW50V3JpdGVyIHBXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKKworICAgIE5hbWluZ1Jlc291cmNlcyByZW91cmNlID0gbmV3IE5hbWluZ1Jlc291cmNlcygpOworCisgICAgR2xvYmFsTmFtaW5nUmVzb3VyY2VzU0YgZmFjdG9yeTsKKworICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYzsKKworICAgIFN0b3JlRGVzY3JpcHRpb24gbmFtZWluZ0Rlc2M7CisKKyAgICAvKgorICAgICAqIGNyZWF0ZSByZWdpc3RlcnkgYW5kIGNvbmZpZ3VyZSBuYW1pbmcgZGVjcmlwdG9ycworICAgICAqIAorICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZWdpc3RyeSA9IG5ldyBTdG9yZVJlZ2lzdHJ5KCk7CisgICAgICAgIGRlc2MgPSBEZXNjcmlwdG9ySGVscGVyLnJlZ2lzdGVyRGVzY3JpcHRvcihudWxsLCByZWdpc3RyeSwKKyAgICAgICAgICAgICAgICBOYW1pbmdSZXNvdXJjZXMuY2xhc3MuZ2V0TmFtZSgpICsgIi5bR2xvYmFsTmFtaW5nUmVzb3VyY2VzXSIsCisgICAgICAgICAgICAgICAgIkdsb2JhbE5hbWluZ1Jlc291cmNlcyIsIE5hbWluZ1Jlc291cmNlcy5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuR2xvYmFsTmFtaW5nUmVzb3VyY2VzU0YiLAorICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKTsKKyAgICAgICAgZmFjdG9yeSA9IChHbG9iYWxOYW1pbmdSZXNvdXJjZXNTRikgZGVzYy5nZXRTdG9yZUZhY3RvcnkoKTsKKyAgICAgICAgbmFtZWluZ0Rlc2MgPSBEZXNjcmlwdG9ySGVscGVyLnJlZ2lzdGVyTmFtaW5nRGVzY3JpcHRvcihkZXNjLCByZWdpc3RyeSk7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJEZXNjcmlwdG9yKFN0cmluZyB0YWcsIENsYXNzIGFDbGFzcywKKyAgICAgICAgICAgIFN0cmluZyBmYWN0b3J5Q2xhc3MsIGJvb2xlYW4gZnN0YW5kYXJkLCBib29sZWFuIGZkZWZhdWx0KSB7CisgICAgICAgIERlc2NyaXB0b3JIZWxwZXIucmVnaXN0ZXJEZXNjcmlwdG9yKG5hbWVpbmdEZXNjLCByZWdpc3RyeSwgYUNsYXNzCisgICAgICAgICAgICAgICAgLmdldE5hbWUoKSwgdGFnLCBhQ2xhc3MuZ2V0TmFtZSgpLCBmYWN0b3J5Q2xhc3MsIGZzdGFuZGFyZCwKKyAgICAgICAgICAgICAgICBmZGVmYXVsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE5vdE51bGwocmVnaXN0cnkuZmluZERlc2NyaXB0aW9uKE5hbWluZ1Jlc291cmNlcy5jbGFzcykpOworICAgICAgICBhc3NlcnROb3ROdWxsKHJlZ2lzdHJ5LmZpbmREZXNjcmlwdGlvbihDb250ZXh0UmVzb3VyY2VFbnZSZWYuY2xhc3MKKyAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUmVzb3VyY2VFbnZSZWYiLCByZWdpc3RyeS5maW5kRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgQ29udGV4dFJlc291cmNlRW52UmVmLmNsYXNzLmdldE5hbWUoKSkuZ2V0VGFnKCkpOworCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMgPSBuZXcgTmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIENvbnRleHRSZXNvdXJjZUVudlJlZiByZWYgPSBuZXcgQ29udGV4dFJlc291cmNlRW52UmVmKCk7CisgICAgICAgIHJlZi5zZXROYW1lKCJwZXRlciIpOworICAgICAgICByZWYuc2V0VHlwZSgidHlwZSIpOworICAgICAgICByZXNvdXJjZXMuYWRkUmVzb3VyY2VFbnZSZWYocmVmKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxHbG9iYWxOYW1pbmdSZXNvdXJjZXM+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8UmVzb3VyY2VFbnZSZWYiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgbmFtZT1cInBldGVyXCIiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgdHlwZT1cInR5cGVcIi8+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiPC9HbG9iYWxOYW1pbmdSZXNvdXJjZXM+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhyZXNvdXJjZXMsIGFzcGVjdGVkUmVzdWx0KTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFSkJTdG9yZSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMgPSBuZXcgTmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIENvbnRleHRFamIgZWpiID0gbmV3IENvbnRleHRFamIoKTsKKyAgICAgICAgZWpiLnNldE5hbWUoImVqYi9TZXJ2aWNlIik7CisgICAgICAgIGVqYi5zZXRUeXBlKCJvcmcuc3VwZXIuQmVhbiIpOworICAgICAgICBlamIuc2V0SG9tZSgib3JnLnN1cGVyLkJlYW5Ib21lIik7CisgICAgICAgIHJlc291cmNlcy5hZGRFamIoZWpiKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxHbG9iYWxOYW1pbmdSZXNvdXJjZXM+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8RUpCIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIGhvbWU9XCJvcmcuc3VwZXIuQmVhbkhvbWVcIiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBuYW1lPVwiZWpiL1NlcnZpY2VcIiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICB0eXBlPVwib3JnLnN1cGVyLkJlYW5cIi8+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiPC9HbG9iYWxOYW1pbmdSZXNvdXJjZXM+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhyZXNvdXJjZXMsIGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxFamJTdG9yZSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMgPSBuZXcgTmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIENvbnRleHRMb2NhbEVqYiBlamIgPSBuZXcgQ29udGV4dExvY2FsRWpiKCk7CisgICAgICAgIGVqYi5zZXROYW1lKCJlamIvU2VydmljZSIpOworICAgICAgICBlamIuc2V0VHlwZSgib3JnLnN1cGVyLkJlYW4iKTsKKyAgICAgICAgZWpiLnNldEhvbWUoIm9yZy5zdXBlci5CZWFuSG9tZSIpOworICAgICAgICByZXNvdXJjZXMuYWRkTG9jYWxFamIoZWpiKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxHbG9iYWxOYW1pbmdSZXNvdXJjZXM+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8TG9jYWxFamIiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgaG9tZT1cIm9yZy5zdXBlci5CZWFuSG9tZVwiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIG5hbWU9XCJlamIvU2VydmljZVwiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIHR5cGU9XCJvcmcuc3VwZXIuQmVhblwiLz4iICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICI8L0dsb2JhbE5hbWluZ1Jlc291cmNlcz4iICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKHJlc291cmNlcywgYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbnZpcm9ubWVudFN0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIHJlc291cmNlcyA9IG5ldyBOYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgQ29udGV4dEVudmlyb25tZW50IGVudiA9IG5ldyBDb250ZXh0RW52aXJvbm1lbnQoKTsKKyAgICAgICAgZW52LnNldE5hbWUoImVudi9TZWxlY3RFbXAiKTsKKyAgICAgICAgZW52LnNldFR5cGUoImphdmEubGFuZy5TdHJpbmciKTsKKyAgICAgICAgZW52LnNldFZhbHVlKCJzZWxlY3QgKiBmcm9tIGVtcCIpOworICAgICAgICByZXNvdXJjZXMuYWRkRW52aXJvbm1lbnQoZW52KTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxHbG9iYWxOYW1pbmdSZXNvdXJjZXM+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8RW52aXJvbm1lbnQiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgbmFtZT1cImVudi9TZWxlY3RFbXBcIiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICB0eXBlPVwiamF2YS5sYW5nLlN0cmluZ1wiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIHZhbHVlPVwic2VsZWN0ICogZnJvbSBlbXBcIi8+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiPC9HbG9iYWxOYW1pbmdSZXNvdXJjZXM+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhyZXNvdXJjZXMsIGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VTdG9yZSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMgPSBuZXcgTmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIENvbnRleHRSZXNvdXJjZSByZXMgPSBuZXcgQ29udGV4dFJlc291cmNlKCk7CisgICAgICAgIHJlcy5zZXROYW1lKCJqZGJjL0VtcCIpOworICAgICAgICByZXMuc2V0VHlwZSgiamF2YXguc3FsLkRhdGFTb3VyY2UiKTsKKyAgICAgICAgcmVzLnNldEF1dGgoIkNvbnRhaW5lciIpOworICAgICAgICByZXNvdXJjZXMuYWRkUmVzb3VyY2UocmVzKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxHbG9iYWxOYW1pbmdSZXNvdXJjZXM+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8UmVzb3VyY2UiICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICAgIGF1dGg9XCJDb250YWluZXJcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgICBuYW1lPVwiamRiYy9FbXBcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgICB0eXBlPVwiamF2YXguc3FsLkRhdGFTb3VyY2VcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiPC9HbG9iYWxOYW1pbmdSZXNvdXJjZXM+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKHJlc291cmNlcywgYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVN0b3JlUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gbmV3IE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBDb250ZXh0UmVzb3VyY2UgcmVzID0gbmV3IENvbnRleHRSZXNvdXJjZSgpOworICAgICAgICByZXMuc2V0TmFtZSgibWFpbC9NYWlsU2Vzc2lvbiIpOworICAgICAgICByZXMuc2V0VHlwZSgiamF2YXgubWFpbC5TZXNzaW9uIik7CisgICAgICAgIHJlcy5zZXRBdXRoKCJDb250YWluZXIiKTsKKyAgICAgICAgcmVzLnNldFByb3BlcnR5KCJtYWlsLmhvc3QiLCAibG9jYWxob3N0Iik7CisgICAgICAgIHJlc291cmNlcy5hZGRSZXNvdXJjZShyZXMpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPEdsb2JhbE5hbWluZ1Jlc291cmNlcz4iICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxSZXNvdXJjZSIgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgICAgYXV0aD1cIkNvbnRhaW5lclwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICAgIG5hbWU9XCJtYWlsL01haWxTZXNzaW9uXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgICAgdHlwZT1cImphdmF4Lm1haWwuU2Vzc2lvblwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICAgIG1haWwuaG9zdD1cImxvY2FsaG9zdFwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICI8L0dsb2JhbE5hbWluZ1Jlc291cmNlcz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2socmVzb3VyY2VzLCBhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgLy8gQFRPRE8gUmVzb3VyY2VMaW5rIGNhbiBvbmx5IGJlIGV4aXN0cyBhdCBDb250ZXh0IFRhZworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUxpbmtTdG9yZSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMgPSBuZXcgTmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIENvbnRleHRSZXNvdXJjZUxpbmsgcmVzID0gbmV3IENvbnRleHRSZXNvdXJjZUxpbmsoKTsKKyAgICAgICAgcmVzLnNldE5hbWUoImpkYmMvRW1wMSIpOworICAgICAgICByZXMuc2V0VHlwZSgiamF2YXguc3FsLkRhdGFTb3VyY2UiKTsKKyAgICAgICAgcmVzLnNldEdsb2JhbCgiamRiYy9FbXAiKTsKKyAgICAgICAgcmVzb3VyY2VzLmFkZFJlc291cmNlTGluayhyZXMpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPEdsb2JhbE5hbWluZ1Jlc291cmNlcz4iICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxSZXNvdXJjZUxpbmsiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgZ2xvYmFsPVwiamRiYy9FbXBcIiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBuYW1lPVwiamRiYy9FbXAxXCIiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgdHlwZT1cImphdmF4LnNxbC5EYXRhU291cmNlXCIvPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIjwvR2xvYmFsTmFtaW5nUmVzb3VyY2VzPiIgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2socmVzb3VyY2VzLCBhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3JlRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIHJlc291cmNlcyA9IG5ldyBOYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxHbG9iYWxOYW1pbmdSZXNvdXJjZXM+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiPC9HbG9iYWxOYW1pbmdSZXNvdXJjZXM+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhyZXNvdXJjZXMsIGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVjayhOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzLCBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmFjdG9yeS5zdG9yZShwV3JpdGVyLCAtMiwgcmVzb3VyY2VzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzcGVjdGVkUmVzdWx0LCB3cml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9JbmZvTGlmZWN5Y2xlTGlzdGVuZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvSW5mb0xpZmVjeWNsZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxYzA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvSW5mb0xpZmVjeWNsZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBJbmZvTGlmZWN5Y2xlTGlzdGVuZXIgaW1wbGVtZW50cyBMaWZlY3ljbGVMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSW5mb0xpZmVjeWNsZUxpc3RlbmVyLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBzdHJpbmcgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAib3JnLmFwYWNoZS5jYXRhbGluYS5saXN0ZW5lci5JbmZvTGlmZWN5Y2xlTGlzdGVuZXIvMS4wIjsKKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lciNsaWZlY3ljbGVFdmVudChvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV2ZW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50IGFyZzApIHsKKyAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuaW5mbyhhcmcwLmdldFNvdXJjZSgpLnRvU3RyaW5nKCkgKyAiOiAiICsgYXJnMC5nZXRUeXBlKCkpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTEYuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTEYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDIyNzA0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9MRi5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqICAKKyAqLworCitwdWJsaWMgY2xhc3MgTEYgeworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBMSU5FX1NFUEFSQVRPUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTG9hZGVyU0ZUZXN0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0xvYWRlclNGVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNTI4MTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0xvYWRlclNGVGVzdC5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcExvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkxvYWRlclNGOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlUmVnaXN0cnk7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogIAorICovCitwdWJsaWMgY2xhc3MgTG9hZGVyU0ZUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIFN0b3JlUmVnaXN0cnkgcmVnaXN0cnk7CisKKyAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCisgICAgUHJpbnRXcml0ZXIgcFdyaXRlciA9IG5ldyBQcmludFdyaXRlcih3cml0ZXIpOworCisgICAgTG9hZGVyIGxvYWRlcjsKKworICAgIExvYWRlclNGIGZhY3Rvcnk7CisKKyAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2M7CisKKyAgICAvKgorICAgICAqIGNyZWF0ZSBSZWdpc3RyeSBhbmQgcmVnaXN0ZXIgTG9hZGVyCisgICAgICogCisgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgcmVnaXN0cnkgPSBuZXcgU3RvcmVSZWdpc3RyeSgpOworICAgICAgICBkZXNjID0gRGVzY3JpcHRvckhlbHBlci5yZWdpc3RlckRlc2NyaXB0b3IobnVsbCwgcmVnaXN0cnksCisgICAgICAgICAgICAgICAgV2ViYXBwTG9hZGVyLmNsYXNzLmdldE5hbWUoKSwgIkxvYWRlciIsIFdlYmFwcExvYWRlci5jbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSwgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuTG9hZGVyU0YiLAorICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGZhY3RvcnkgPSAoTG9hZGVyU0YpIGRlc2MuZ2V0U3RvcmVGYWN0b3J5KCk7CisgICAgICAgIGxvYWRlciA9IG5ldyBXZWJhcHBMb2FkZXIoKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNYW5hZ2VyTm9uU3RhbmRhcmRTdG9yZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKGZhY3RvcnkuaXNEZWZhdWx0TG9hZGVyKGxvYWRlcikpOworICAgICAgICBsb2FkZXIuc2V0RGVsZWdhdGUodHJ1ZSk7CisgICAgICAgIGFzc2VydEZhbHNlKGZhY3RvcnkuaXNEZWZhdWx0TG9hZGVyKGxvYWRlcikpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPExvYWRlciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLmxvYWRlci5XZWJhcHBMb2FkZXJcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIGRlbGVnYXRlPVwidHJ1ZVwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUoZmFjdG9yeS5pc0RlZmF1bHRMb2FkZXIobG9hZGVyKSk7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICIiOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2soU3RyaW5nIGFzcGVjdGVkUmVzdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmFjdG9yeS5zdG9yZShwV3JpdGVyLCAtMiwgbG9hZGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzcGVjdGVkUmVzdWx0LCB3cml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9NYW5hZ2VyU0ZUZXN0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL01hbmFnZXJTRlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTYxOTRkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9NYW5hZ2VyU0ZUZXN0LmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5TdGFuZGFyZE1hbmFnZXI7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogIAorICovCitwdWJsaWMgY2xhc3MgTWFuYWdlclNGVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5OworCisgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgIFByaW50V3JpdGVyIHBXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKKworICAgIFN0YW5kYXJkTWFuYWdlciBtYW5hZ2VyOworCisgICAgTWFuYWdlclNGIGZhY3Rvcnk7CisKKyAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2M7CisKKyAgICAvKgorICAgICAqIGNyZWF0ZSByZWdpc3RlcnkgYW5kIHJlZ2lzdGVyIE1hbmFnZXIgZGVzY3JpcHRvcgorICAgICAqIAorICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHJlZ2lzdHJ5ID0gbmV3IFN0b3JlUmVnaXN0cnkoKTsKKyAgICAgICAgZGVzYyA9IERlc2NyaXB0b3JIZWxwZXIucmVnaXN0ZXJEZXNjcmlwdG9yKG51bGwsIHJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgIE1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpLCAiTWFuYWdlciIsCisgICAgICAgICAgICAgICAgTWFuYWdlci5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuTWFuYWdlclNGIiwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoImVudHJvcHkiKTsKKyAgICAgICAgZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoImRpc3RyaWJ1dGFibGUiKTsKKyAgICAgICAgZmFjdG9yeSA9IChNYW5hZ2VyU0YpIGRlc2MuZ2V0U3RvcmVGYWN0b3J5KCk7CisgICAgICAgIG1hbmFnZXIgPSBuZXcgU3RhbmRhcmRNYW5hZ2VyKCk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZFN0YW5kYXJkTWFuYWdlcigpIHsKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBtYW5hZ2VyZGVzYyA9IHJlZ2lzdHJ5LmZpbmREZXNjcmlwdGlvbihtYW5hZ2VyLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGVzYyxtYW5hZ2VyZGVzYyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW5hZ2VyTm9uU3RhbmRhcmRTdG9yZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKGZhY3RvcnkuaXNEZWZhdWx0TWFuYWdlcihtYW5hZ2VyKSk7CisgICAgICAgIG1hbmFnZXIuc2V0TWF4QWN0aXZlU2Vzc2lvbnMoMTAwKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZmFjdG9yeS5pc0RlZmF1bHRNYW5hZ2VyKG1hbmFnZXIpKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxNYW5hZ2VyIGNsYXNzTmFtZT1cIm9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5TdGFuZGFyZE1hbmFnZXJcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIG1heEFjdGl2ZVNlc3Npb25zPVwiMTAwXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3JlRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmYWN0b3J5LmlzRGVmYXVsdE1hbmFnZXIobWFuYWdlcikpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiIjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrKFN0cmluZyBhc3BlY3RlZFJlc3VsdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZhY3Rvcnkuc3RvcmUocFdyaXRlciwgLTIsIG1hbmFnZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNwZWN0ZWRSZXN1bHQsIHdyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1NlcnZlckNoaWxkc1Rlc3QuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU2VydmVyQ2hpbGRzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNTA5NDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1NlcnZlckNoaWxkc1Rlc3QuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdGFuZGFyZFNlcnZlclNGOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlUmVnaXN0cnk7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogIAorICovCitwdWJsaWMgY2xhc3MgU2VydmVyQ2hpbGRzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIFN0b3JlUmVnaXN0cnkgcmVnaXN0cnk7CisKKyAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCisgICAgUHJpbnRXcml0ZXIgcFdyaXRlciA9IG5ldyBQcmludFdyaXRlcih3cml0ZXIpOworCisgICAgU3RhbmRhcmRTZXJ2ZXIgc3RhbmRhcmRTZXJ2ZXIgPSBuZXcgU3RhbmRhcmRTZXJ2ZXIoKTsKKworICAgIFN0YW5kYXJkU2VydmVyU0YgZmFjdG9yeTsKKworICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYzsKKworICAgIC8qCisgICAgICogY3JlYXRlIHJlZ2lzdGVyeSBhbmQgcmVnaXN0ZXIgU2VydmVyIGFuZCBkaXJlY3Qgc3ViZWxlbWVudCBkZXNjcmlwdG9ycworICAgICAqIAorICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHJlZ2lzdHJ5ID0gbmV3IFN0b3JlUmVnaXN0cnkoKTsKKyAgICAgICAgZGVzYyA9IG5ldyBTdG9yZURlc2NyaXB0aW9uKCk7CisgICAgICAgIGRlc2Muc2V0VGFnKCJTZXJ2ZXIiKTsKKyAgICAgICAgZGVzYy5zZXRUYWdDbGFzcygib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyIik7CisgICAgICAgIGRlc2Muc2V0U3RhbmRhcmQodHJ1ZSk7CisgICAgICAgIGRlc2MKKyAgICAgICAgICAgICAgICAuc2V0U3RvcmVGYWN0b3J5Q2xhc3MoIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RhbmRhcmRTZXJ2ZXJTRiIpOworICAgICAgICByZWdpc3RyeS5yZWdpc3RlckRlc2NyaXB0aW9uKGRlc2MpOworICAgICAgICBmYWN0b3J5ID0gbmV3IFN0YW5kYXJkU2VydmVyU0YoKTsKKyAgICAgICAgZGVzYy5zZXRTdG9yZUZhY3RvcnkoZmFjdG9yeSk7CisgICAgICAgIGZhY3Rvcnkuc2V0UmVnaXN0cnkocmVnaXN0cnkpOworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGxpc3RkZXNjID0gcmVnaXN0ZXJEZXNjcmlwdG9yKCJMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIuY2xhc3MpOworICAgICAgICBsaXN0ZGVzYworICAgICAgICAgICAgICAgIC5hZGRUcmFuc2llbnRDaGlsZCgib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLk5hbWluZ0NvbnRleHRMaXN0ZW5lciIpOworICAgICAgICBsaXN0ZGVzYworICAgICAgICAgICAgICAgIC5hZGRUcmFuc2llbnRDaGlsZCgib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIiKTsKKyAgICAgICAgc3RhbmRhcmRTZXJ2ZXIKKyAgICAgICAgICAgICAgICAuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobmV3IG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKCkpOworICAgICAgICAvLyBhZGQgR2xvYmFsTmFtaW5nUmVzb3VyY2UKKyAgICAgICAgRGVzY3JpcHRvckhlbHBlci5yZWdpc3RlckRlc2NyaXB0b3IoZGVzYywgcmVnaXN0cnksCisgICAgICAgICAgICAgICAgTmFtaW5nUmVzb3VyY2VzLmNsYXNzLmdldE5hbWUoKSArICIuW0dsb2JhbE5hbWluZ1Jlc291cmNlc10iLAorICAgICAgICAgICAgICAgICJHbG9iYWxOYW1pbmdSZXNvdXJjZXMiLCBOYW1pbmdSZXNvdXJjZXMuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkdsb2JhbE5hbWluZ1Jlc291cmNlc1NGIiwKKyAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSk7CisgICAgICAgIERlc2NyaXB0b3JIZWxwZXIucmVnaXN0ZXJOYW1pbmdEZXNjcmlwdG9yKGRlc2MsIHJlZ2lzdHJ5KTsKKyAgICAgICAgcmVnaXN0ZXJEZXNjcmlwdG9yKCJTZXJ2aWNlIiwgU3RhbmRhcmRTZXJ2aWNlLmNsYXNzLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0YW5kYXJkU2VydmljZVNGIiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIERlc2NyaXB0b3JIZWxwZXIucmVnaXN0ZXJEZXNjcmlwdG9yKGRlc2MsIHJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgIFN0YW5kYXJkU2VydmVyLmNsYXNzLmdldE5hbWUoKSArICIuW1NlcnZlckxpZmVjeWNsZUxpc3RlbmVyXSIsCisgICAgICAgICAgICAgICAgIlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIiwgU3RhbmRhcmRTZXJ2ZXIuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIHN0YW5kYXJkU2VydmVyLmFkZFNlcnZpY2UobmV3IFN0YW5kYXJkU2VydmljZSgpKTsKKworICAgIH0KKworICAgIHByaXZhdGUgU3RvcmVEZXNjcmlwdGlvbiByZWdpc3RlckRlc2NyaXB0b3IoU3RyaW5nIHRhZywgQ2xhc3MgYUNsYXNzKSB7CisgICAgICAgIHJldHVybiByZWdpc3RlckRlc2NyaXB0b3IodGFnLCBhQ2xhc3MsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIGZhbHNlLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0b3JlRGVzY3JpcHRpb24gcmVnaXN0ZXJEZXNjcmlwdG9yKFN0cmluZyB0YWcsIENsYXNzIGFDbGFzcywKKyAgICAgICAgICAgIFN0cmluZyBmYWN0b3J5Q2xhc3MsIGJvb2xlYW4gZnN0YW5kYXJkLCBib29sZWFuIGZkZWZhdWx0KSB7CisgICAgICAgIHJldHVybiBEZXNjcmlwdG9ySGVscGVyLnJlZ2lzdGVyRGVzY3JpcHRvcihkZXNjLCByZWdpc3RyeSwgYUNsYXNzCisgICAgICAgICAgICAgICAgLmdldE5hbWUoKSwgdGFnLCBhQ2xhc3MuZ2V0TmFtZSgpLCBmYWN0b3J5Q2xhc3MsIGZzdGFuZGFyZCwKKyAgICAgICAgICAgICAgICBmZGVmYXVsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNhdmVMaXN0ZW5lckFkZFNlcnZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKHN0YW5kYXJkU2VydmVyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgKKyAgICAgICAgICAgICAgICAiTm8gTGlzdGVuZXIgRGVzY3JpcHRvciIsCisgICAgICAgICAgICAgICAgcmVnaXN0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kRGVzY3JpcHRpb24oIm9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIikpOworICAgICAgICBhc3NlcnROb3ROdWxsKAorICAgICAgICAgICAgICAgICJObyBMaXN0ZW5lciBTdG9yZUZhY3RvcnkiLAorICAgICAgICAgICAgICAgIHJlZ2lzdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAuZmluZFN0b3JlRmFjdG9yeSgib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIiKSk7CisgICAgICAgIGZhY3Rvcnkuc3RvcmUocFdyaXRlciwgLTIsIHN0YW5kYXJkU2VydmVyKTsKKyAKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiIKKyAgICAgICAgICAgICAgICArIHJlZ2lzdHJ5LmdldEVuY29kaW5nKCkKKyAgICAgICAgICAgICAgICArICJcIj8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICI8U2VydmVyPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8TGlzdGVuZXIgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXJcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICA8R2xvYmFsTmFtaW5nUmVzb3VyY2VzPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgPC9HbG9iYWxOYW1pbmdSZXNvdXJjZXM+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICA8U2VydmljZS8+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiPC9TZXJ2ZXI+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNwZWN0ZWRSZXN1bHQsIHdyaXRlci50b1N0cmluZygpKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdGFuZGFyZENvbnRleHRTRlRlc3QuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRDb250ZXh0U0ZUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNjN2QwMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRDb250ZXh0U0ZUZXN0LmphdmEKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlRW52UmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUxpbms7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkFBU1JlYWxtOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5GaWxlU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uUGVyc2lzdGVudE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlN0YW5kYXJkTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0YW5kYXJkQ29udGV4dFNGOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLkZpbGVEaXJDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5Qcm94eURpckNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLldBUkRpckNvbnRleHQ7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogIAorICovCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRDb250ZXh0U0ZUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIFN0b3JlUmVnaXN0cnkgcmVnaXN0cnk7CisKKyAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCisgICAgUHJpbnRXcml0ZXIgcFdyaXRlciA9IG5ldyBQcmludFdyaXRlcih3cml0ZXIpOworCisgICAgU3RhbmRhcmRDb250ZXh0IHN0YW5kYXJkQ29udGV4dDsKKworICAgIFN0YW5kYXJkQ29udGV4dFNGIGZhY3Rvcnk7CisKKyAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2M7CisKKyAgICAvKgorICAgICAqIGNyZWF0ZSByZWdpc3RlcnkgYW5kIHJlZ2lzdGVyIENvbnRleHQgYW5kIGFsbCBzdWJlbGVtZW50cworICAgICAqIAorICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHJlZ2lzdHJ5ID0gbmV3IFN0b3JlUmVnaXN0cnkoKTsKKyAgICAgICAgZGVzYyA9IG5ldyBTdG9yZURlc2NyaXB0aW9uKCk7CisgICAgICAgIGRlc2Muc2V0VGFnKCJDb250ZXh0Iik7CisgICAgICAgIGRlc2Muc2V0VGFnQ2xhc3MoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiKTsKKyAgICAgICAgZGVzYy5zZXRTdGFuZGFyZCh0cnVlKTsKKyAgICAgICAgZGVzYworICAgICAgICAgICAgICAgIC5zZXRTdG9yZUZhY3RvcnlDbGFzcygib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdGFuZGFyZENvbnRleHRTRiIpOworICAgICAgICBTdHJpbmcgZXhjZXB0aW9uc1tdID0geyAiYXZhaWxhYmxlIiwgImNvbmZpZ0ZpbGUiLCAiY29uZmlndXJlZCIsCisgICAgICAgICAgICAgICAgImRpc3RyaWJ1dGFibGUiLCAiZG9tYWluIiwgImVuZ2luZU5hbWUiLCAibmFtZSIsICJvdmVycmlkZSIsCisgICAgICAgICAgICAgICAgInB1YmxpY0lkIiwgInJlcGxhY2VXZWxjb21lRmlsZXMiLCAic2Vzc2lvblRpbWVvdXQiLAorICAgICAgICAgICAgICAgICJzdGFydHVwVGltZSIsICJ0bGRTY2FuVGltZSIgfTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoZXhjZXB0aW9uc1tpXSk7CisKKyAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJEZXNjcmlwdGlvbihkZXNjKTsKKyAgICAgICAgZmFjdG9yeSA9IG5ldyBTdGFuZGFyZENvbnRleHRTRigpOworICAgICAgICBkZXNjLnNldFN0b3JlRmFjdG9yeShmYWN0b3J5KTsKKyAgICAgICAgZmFjdG9yeS5zZXRSZWdpc3RyeShyZWdpc3RyeSk7CisKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBsaXN0ZW5lcmRlc2MgPSByZWdpc3RlckRlc2NyaXB0b3IoIkxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lci5jbGFzcyk7CisKKyAgICAgICAgU3RyaW5nIGxpc3RlbmVyc2tpcHBhYmxlc1tdID0geworICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuTmFtaW5nQ29udGV4dExpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNvbnRleHRDb25maWciLCB9OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVyc2tpcHBhYmxlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGxpc3RlbmVyZGVzYy5hZGRUcmFuc2llbnRDaGlsZChsaXN0ZW5lcnNraXBwYWJsZXNbaV0pOworCisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gcmVhbG1kZXNjID0gcmVnaXN0ZXJEZXNjcmlwdG9yKCJSZWFsbSIsCisgICAgICAgICAgICAgICAgSkFBU1JlYWxtLmNsYXNzLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gbWFuYWdlcmRlc2MgPSByZWdpc3RlckRlc2NyaXB0b3IoIk1hbmFnZXIiLAorICAgICAgICAgICAgICAgIFN0YW5kYXJkTWFuYWdlci5jbGFzcywKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5NYW5hZ2VyU0YiLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBtYW5hZ2VyZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoImVudHJvcHkiKTsKKyAgICAgICAgbWFuYWdlcmRlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKCJkaXN0cmlidXRhYmxlIik7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gcG1hbmFnZXJkZXNjID0gcmVnaXN0ZXJEZXNjcmlwdG9yKCJNYW5hZ2VyIiwKKyAgICAgICAgICAgICAgICBQZXJzaXN0ZW50TWFuYWdlci5jbGFzcywKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5QZXJzaXN0ZW50TWFuYWdlclNGIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICBwbWFuYWdlcmRlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKCJlbnRyb3B5Iik7CisgICAgICAgIHBtYW5hZ2VyZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoImRpc3RyaWJ1dGFibGUiKTsKKyAgICAgICAgRGVzY3JpcHRvckhlbHBlci5yZWdpc3RlckRlc2NyaXB0b3IocG1hbmFnZXJkZXNjLCByZWdpc3RyeSwKKyAgICAgICAgICAgICAgICBGaWxlU3RvcmUuY2xhc3MuZ2V0TmFtZSgpLCAiU3RvcmUiLCBGaWxlU3RvcmUuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIERlc2NyaXB0b3JIZWxwZXIucmVnaXN0ZXJEZXNjcmlwdG9yKHBtYW5hZ2VyZGVzYywgcmVnaXN0cnksCisgICAgICAgICAgICAgICAgSkRCQ1N0b3JlLmNsYXNzLmdldE5hbWUoKSwgIlN0b3JlIiwgSkRCQ1N0b3JlLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICBEZXNjcmlwdG9ySGVscGVyLnJlZ2lzdGVyTmFtaW5nRGVzY3JpcHRvcihkZXNjLCByZWdpc3RyeSk7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gdmFsdmVkZXNjID0gcmVnaXN0ZXJEZXNjcmlwdG9yKCJWYWx2ZSIsIFZhbHZlLmNsYXNzLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIFN0cmluZyBza2lwcGFibGVzW10gPSB7CisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5CYXNpY0F1dGhlbnRpY2F0b3IiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuRGlnZXN0QXV0aGVudGljYXRvciIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5Gb3JtQXV0aGVudGljYXRvciIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5Ob25Mb2dpbkF1dGhlbnRpY2F0b3IiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuU1NMQXV0aGVudGljYXRvciIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHRWYWx2ZSIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkNlcnRpZmljYXRlc1ZhbHZlIiB9OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNraXBwYWJsZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB2YWx2ZWRlc2MuYWRkVHJhbnNpZW50Q2hpbGQoc2tpcHBhYmxlc1tpXSk7CisKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiByZXNkZXNjID0gcmVnaXN0ZXJEZXNjcmlwdG9yKCJSZXNvdXJjZXMiLAorICAgICAgICAgICAgICAgIERpckNvbnRleHQuY2xhc3MsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIGZhbHNlLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgcmVzZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoImRvY0Jhc2UiKTsKKyAgICAgICAgcmVzZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoImFsbG93TGlua2luZyIpOworICAgICAgICByZXNkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgiY2FjaGVNYXhTaXplIik7CisgICAgICAgIHJlc2Rlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKCJjYWNoZVRUTCIpOworICAgICAgICByZXNkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgiY2FzZVNlbnNpdGl2ZSIpOworICAgICAgICByZXNkZXNjLmFkZFRyYW5zaWVudENoaWxkKEZpbGVEaXJDb250ZXh0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIHJlc2Rlc2MuYWRkVHJhbnNpZW50Q2hpbGQoUHJveHlEaXJDb250ZXh0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIHJlc2Rlc2MuYWRkVHJhbnNpZW50Q2hpbGQoV0FSRGlyQ29udGV4dC5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBzdGFuZGFyZENvbnRleHQgPSBuZXcgU3RhbmRhcmRDb250ZXh0KCk7CisgICAgICAgIHN0YW5kYXJkQ29udGV4dC5zZXRQYXRoKCIvbXlhcHBzIik7CisgICAgICAgIHN0YW5kYXJkQ29udGV4dC5zZXREb2NCYXNlKCJteWFwcHMiKTsKKworICAgIH0KKworICAgIHByaXZhdGUgU3RvcmVEZXNjcmlwdGlvbiByZWdpc3RlckRlc2NyaXB0b3IoU3RyaW5nIHRhZywgQ2xhc3MgYUNsYXNzKSB7CisgICAgICAgIHJldHVybiByZWdpc3RlckRlc2NyaXB0b3IodGFnLCBhQ2xhc3MsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIGZhbHNlLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0b3JlRGVzY3JpcHRpb24gcmVnaXN0ZXJEZXNjcmlwdG9yKFN0cmluZyB0YWcsIENsYXNzIGFDbGFzcywKKyAgICAgICAgICAgIFN0cmluZyBmYWN0b3J5Q2xhc3MsIGJvb2xlYW4gZnN0YW5kYXJkLCBib29sZWFuIGZkZWZhdWx0KSB7CisgICAgICAgIHJldHVybiBEZXNjcmlwdG9ySGVscGVyLnJlZ2lzdGVyRGVzY3JpcHRvcihkZXNjLCByZWdpc3RyeSwgYUNsYXNzCisgICAgICAgICAgICAgICAgLmdldE5hbWUoKSwgdGFnLCBhQ2xhc3MuZ2V0TmFtZSgpLCBmYWN0b3J5Q2xhc3MsIGZzdGFuZGFyZCwKKyAgICAgICAgICAgICAgICBmZGVmYXVsdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQFRPRE8gTGlzdGVuZXIgb25seSBzYXZlZCBhdCByZWFsIGNvbnRleHQuIFdyb25nIHdoZW4gbmV4dCBDb250ZXh0CisgICAgICogICAgICAgZGVwbG95ZWQhIHNlZSBDaGFuZ2VzLnR4dAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdExpc3RlbmVyU3RvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhbmRhcmRDb250ZXh0CisgICAgICAgICAgICAgICAgLmFkZExpZmVjeWNsZUxpc3RlbmVyKG5ldyBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkluZm9MaWZlY3ljbGVMaXN0ZW5lcigpKTsKKyAgICAgICAgc3RhbmRhcmRDb250ZXh0CisgICAgICAgICAgICAgICAgLmFkZEluc3RhbmNlTGlzdGVuZXIoIm9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyTGlzdGVuZXIiKTsKKyAgICAgICAgc3RhbmRhcmRDb250ZXh0CisgICAgICAgICAgICAgICAgLmFkZFdyYXBwZXJMaXN0ZW5lcigib3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXJMaXN0ZW5lciIpOworICAgICAgICBzdGFuZGFyZENvbnRleHQKKyAgICAgICAgICAgICAgICAuYWRkV3JhcHBlckxpZmVjeWNsZSgib3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXJMaXN0ZW5lciIpOworICAgICAgICBzdGFuZGFyZENvbnRleHQuYWRkV2F0Y2hlZFJlc291cmNlKCIvdG1wL3JlbG9hZGVkIik7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8Q29udGV4dCIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIGRvY0Jhc2U9XCJteWFwcHNcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIHBhdGg9XCIvbXlhcHBzXCI+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxMaXN0ZW5lciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkluZm9MaWZlY3ljbGVMaXN0ZW5lclwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPEluc3RhbmNlTGlzdGVuZXI+b3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXJMaXN0ZW5lcjwvSW5zdGFuY2VMaXN0ZW5lcj4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPFdyYXBwZXJMaXN0ZW5lcj5vcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lckxpc3RlbmVyPC9XcmFwcGVyTGlzdGVuZXI+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxXcmFwcGVyTGlmZWN5Y2xlPm9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyTGlzdGVuZXI8L1dyYXBwZXJMaWZlY3ljbGU+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxXYXRjaGVkUmVzb3VyY2U+L3RtcC9yZWxvYWRlZDwvV2F0Y2hlZFJlc291cmNlPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIjwvQ29udGV4dD4iICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtaW5nU3RvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhbmRhcmRDb250ZXh0CisgICAgICAgICAgICAgICAgLmFkZExpZmVjeWNsZUxpc3RlbmVyKG5ldyBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkluZm9MaWZlY3ljbGVMaXN0ZW5lcigpKTsKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIHJlc291cmNlcyA9IHN0YW5kYXJkQ29udGV4dC5nZXROYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgQ29udGV4dFJlc291cmNlRW52UmVmIHJlZiA9IG5ldyBDb250ZXh0UmVzb3VyY2VFbnZSZWYoKTsKKyAgICAgICAgcmVmLnNldE5hbWUoImZvbyIpOworICAgICAgICByZWYuc2V0VHlwZSgidHlwZSIpOworICAgICAgICByZXNvdXJjZXMuYWRkUmVzb3VyY2VFbnZSZWYocmVmKTsKKyAgICAgICAgQ29udGV4dFJlc291cmNlTGluayByZXMgPSBuZXcgQ29udGV4dFJlc291cmNlTGluaygpOworICAgICAgICByZXMuc2V0TmFtZSgiamRiYy9CYXJsb2NhbCIpOworICAgICAgICByZXMuc2V0VHlwZSgiamF2YXguc3FsLkRhdGFTb3VyY2UiKTsKKyAgICAgICAgcmVzLnNldEdsb2JhbCgiamRiYy9CYXIiKTsKKyAgICAgICAgcmVzb3VyY2VzLmFkZFJlc291cmNlTGluayhyZXMpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPENvbnRleHQiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBkb2NCYXNlPVwibXlhcHBzXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBwYXRoPVwiL215YXBwc1wiPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8TGlzdGVuZXIgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JbmZvTGlmZWN5Y2xlTGlzdGVuZXJcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICA8UmVzb3VyY2VFbnZSZWYiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgbmFtZT1cImZvb1wiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIHR5cGU9XCJ0eXBlXCIvPiIgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgIDxSZXNvdXJjZUxpbmsiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgICAgZ2xvYmFsPVwiamRiYy9CYXJcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgICBuYW1lPVwiamRiYy9CYXJsb2NhbFwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICAgIHR5cGU9XCJqYXZheC5zcWwuRGF0YVNvdXJjZVwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICI8L0NvbnRleHQ+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1hbmFnZXJTdG9yZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdGFuZGFyZENvbnRleHQuc2V0TWFuYWdlcihuZXcgU3RhbmRhcmRNYW5hZ2VyKCkpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPENvbnRleHQiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgZG9jQmFzZT1cIm15YXBwc1wiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIHBhdGg9XCIvbXlhcHBzXCI+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiPC9Db250ZXh0PlxyXG4iOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWxtU3RvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhbmRhcmRDb250ZXh0LnNldE1hbmFnZXIobmV3IFN0YW5kYXJkTWFuYWdlcigpKTsKKyAgICAgICAgSkFBU1JlYWxtIHJlYWxtID0gbmV3IEpBQVNSZWFsbSgpOworICAgICAgICBzdGFuZGFyZENvbnRleHQuc2V0UmVhbG0ocmVhbG0pOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPENvbnRleHQiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgZG9jQmFzZT1cIm15YXBwc1wiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIHBhdGg9XCIvbXlhcHBzXCI+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8UmVhbG0gY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KQUFTUmVhbG1cIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgICBhcHBOYW1lPVwibXlhcHBzXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIjwvQ29udGV4dD4iICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICAvLyBAVE9ETyBXaHkgdGhlIE1heEluYWN0aXZlSW50ZXJ2YWwgaXMgYWZ0ZXIgc2V0TWFuYWdlciBzZXQgdG8gMTgwMCBzZWM/CisgICAgcHVibGljIHZvaWQgdGVzdE1hbmFnZXJOb25TdGFuZGFyZFN0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0YW5kYXJkTWFuYWdlciBtYW5hZ2VyID0gbmV3IFN0YW5kYXJkTWFuYWdlcigpOworICAgICAgICBtYW5hZ2VyLnNldE1heEFjdGl2ZVNlc3Npb25zKDEwMCk7CisgICAgICAgIGFzc2VydEVxdWFscyg2MCwgbWFuYWdlci5nZXRNYXhJbmFjdGl2ZUludGVydmFsKCkpOworICAgICAgICBzdGFuZGFyZENvbnRleHQuc2V0TWFuYWdlcihtYW5hZ2VyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE4MDAsIG1hbmFnZXIuZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxDb250ZXh0IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgZG9jQmFzZT1cIm15YXBwc1wiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgcGF0aD1cIi9teWFwcHNcIj4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPE1hbmFnZXIgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlN0YW5kYXJkTWFuYWdlclwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICAgICAgbWF4QWN0aXZlU2Vzc2lvbnM9XCIxMDBcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgICAgIG1heEluYWN0aXZlSW50ZXJ2YWw9XCIxODAwXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIjwvQ29udGV4dD5cclxuIjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJzaXN0ZW50TWFuYWdlclN0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBlcnNpc3RlbnRNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgUGVyc2lzdGVudE1hbmFnZXIoKTsKKyAgICAgICAgbWFuYWdlci5zZXRTYXZlT25SZXN0YXJ0KGZhbHNlKTsKKyAgICAgICAgc3RhbmRhcmRDb250ZXh0LnNldE1hbmFnZXIobWFuYWdlcik7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8Q29udGV4dCIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIGRvY0Jhc2U9XCJteWFwcHNcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIHBhdGg9XCIvbXlhcHBzXCI+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxNYW5hZ2VyIGNsYXNzTmFtZT1cIm9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5QZXJzaXN0ZW50TWFuYWdlclwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICAgICAgbWF4SW5hY3RpdmVJbnRlcnZhbD1cIjE4MDBcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgICAgIHNhdmVPblJlc3RhcnQ9XCJmYWxzZVwiPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgPC9NYW5hZ2VyPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIjwvQ29udGV4dD4iICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdGVudE1hbmFnZXJGaWxlU3RvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGVyc2lzdGVudE1hbmFnZXIgbWFuYWdlciA9IG5ldyBQZXJzaXN0ZW50TWFuYWdlcigpOworICAgICAgICBtYW5hZ2VyLnNldFNhdmVPblJlc3RhcnQoZmFsc2UpOworICAgICAgICBGaWxlU3RvcmUgc3RvcmUgPSBuZXcgRmlsZVN0b3JlKCk7CisgICAgICAgIG1hbmFnZXIuc2V0U3RvcmUoc3RvcmUpOworICAgICAgICBzdGFuZGFyZENvbnRleHQuc2V0TWFuYWdlcihtYW5hZ2VyKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxDb250ZXh0IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgZG9jQmFzZT1cIm15YXBwc1wiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgcGF0aD1cIi9teWFwcHNcIj4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPE1hbmFnZXIgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlBlcnNpc3RlbnRNYW5hZ2VyXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICAgIG1heEluYWN0aXZlSW50ZXJ2YWw9XCIxODAwXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICAgIHNhdmVPblJlc3RhcnQ9XCJmYWxzZVwiPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIDxTdG9yZSBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uRmlsZVN0b3JlXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgPC9NYW5hZ2VyPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIjwvQ29udGV4dD4iICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0UmVzb3VyY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVEaXJDb250ZXh0IGRpckMgPSBuZXcgRmlsZURpckNvbnRleHQoKTsKKyAgICAgICAgc3RhbmRhcmRDb250ZXh0LnNldEFsbG93TGlua2luZyh0cnVlKTsKKyAgICAgICAgc3RhbmRhcmRDb250ZXh0LnNldFJlc291cmNlcyhkaXJDKTsKKyAgICAgICAgU3RhbmRhcmRIb3N0IGhvc3QgPSBuZXcgU3RhbmRhcmRIb3N0KCk7CisgICAgICAgIGhvc3QuYWRkQ2hpbGQoc3RhbmRhcmRDb250ZXh0KTsKKyAgICAgICAgaG9zdC5zZXROYW1lKCJsb2NhbGhvc3QiKTsKKyAgICAgICAgaG9zdC5zZXRBcHBCYXNlKCJ3ZWJhcHBzIik7CisgICAgICAgIHN0YW5kYXJkQ29udGV4dC5yZXNvdXJjZXNTdGFydCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKHN0YW5kYXJkQ29udGV4dC5nZXRSZXNvdXJjZXMoKSk7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8Q29udGV4dCIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBkb2NCYXNlPVwibXlhcHBzXCIiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgcGF0aD1cIi9teWFwcHNcIj4iICsgTEYuTElORV9TRVBBUkFUT1IgKyAiPC9Db250ZXh0PiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiArICIgPFJlc291cmNlcyBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuRmlsZURpckNvbnRleHRcIiIgKworICAgICAqIENvbnN0YW50cy5MSU5FX1NFUEFSQVRPUiArICIgYWxsb3dMaW5raW5nPVwidHJ1ZVwiLz4iICsKKyAgICAgKiBDb25zdGFudHMuTElORV9TRVBBUkFUT1IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcmVFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPENvbnRleHQiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgZG9jQmFzZT1cIm15YXBwc1wiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIHBhdGg9XCIvbXlhcHBzXCI+IiArIExGLkxJTkVfU0VQQVJBVE9SICsgIjwvQ29udGV4dD4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrKFN0cmluZyBhc3BlY3RlZFJlc3VsdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZhY3Rvcnkuc3RvcmUocFdyaXRlciwgLTIsIHN0YW5kYXJkQ29udGV4dCk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc3BlY3RlZFJlc3VsdCwgd3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRFbmdpbmVTRlRlc3QuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRFbmdpbmVTRlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGZhZTgxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdGFuZGFyZEVuZ2luZVNGVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KQUFTUmVhbG07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdGFuZGFyZEVuZ2luZVNGOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlUmVnaXN0cnk7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogIAorICovCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRFbmdpbmVTRlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgU3RvcmVSZWdpc3RyeSByZWdpc3RyeTsKKworICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisKKyAgICBQcmludFdyaXRlciBwV3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHdyaXRlcik7CisKKyAgICBTdGFuZGFyZEVuZ2luZSBzdGFuZGFyZEVuZ2luZTsKKworICAgIFN0YW5kYXJkRW5naW5lU0YgZmFjdG9yeTsKKworICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYzsKKworICAgIC8qCisgICAgICogY3JlYXRlIHJlZ2lzdGVyeSBhbmQgcmVnaXN0ZXIgRW5naW5lIGFuZCBkaXJlY3Qgc3ViZWxlbWVudCBkZXNjcmlwdG9ycworICAgICAqIAorICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHJlZ2lzdHJ5ID0gbmV3IFN0b3JlUmVnaXN0cnkoKTsKKyAgICAgICAgZGVzYyA9IG5ldyBTdG9yZURlc2NyaXB0aW9uKCk7CisgICAgICAgIGRlc2Muc2V0VGFnKCJFbmdpbmUiKTsKKyAgICAgICAgZGVzYy5zZXRUYWdDbGFzcygib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lIik7CisgICAgICAgIGRlc2Muc2V0U3RhbmRhcmQodHJ1ZSk7CisgICAgICAgIGRlc2MKKyAgICAgICAgICAgICAgICAuc2V0U3RvcmVGYWN0b3J5Q2xhc3MoIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RhbmRhcmRFbmdpbmVTRiIpOworICAgICAgICBkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgiZG9tYWluIik7CisgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRGVzY3JpcHRpb24oZGVzYyk7CisgICAgICAgIGZhY3RvcnkgPSBuZXcgU3RhbmRhcmRFbmdpbmVTRigpOworICAgICAgICBkZXNjLnNldFN0b3JlRmFjdG9yeShmYWN0b3J5KTsKKyAgICAgICAgZmFjdG9yeS5zZXRSZWdpc3RyeShyZWdpc3RyeSk7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gbGlzdGVuZXJkZXNjID0gcmVnaXN0ZXJEZXNjcmlwdG9yKCJMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIuY2xhc3MpOworCisgICAgICAgIFN0cmluZyBsaXN0ZW5lcnNraXBwYWJsZXNbXSA9IHsKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLk5hbWluZ0NvbnRleHRMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Db250ZXh0Q29uZmlnIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkVuZ2luZUNvbmZpZyIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Ib3N0Q29uZmlnIiwgfTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnNraXBwYWJsZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBsaXN0ZW5lcmRlc2MuYWRkVHJhbnNpZW50Q2hpbGQobGlzdGVuZXJza2lwcGFibGVzW2ldKTsKKworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIHJlYWxtZGVzYyA9IHJlZ2lzdGVyRGVzY3JpcHRvcigiUmVhbG0iLAorICAgICAgICAgICAgICAgIEpBQVNSZWFsbS5jbGFzcywKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGhvc3RkZXNjID0gcmVnaXN0ZXJEZXNjcmlwdG9yKCJIb3N0IiwKKyAgICAgICAgICAgICAgICBTdGFuZGFyZEhvc3QuY2xhc3MsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgaG9zdGRlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKCJkb21haW4iKTsKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiB2YWx2ZWRlc2MgPSByZWdpc3RlckRlc2NyaXB0b3IoIlZhbHZlIiwgVmFsdmUuY2xhc3MsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIGZhbHNlLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKworICAgICAgICBTdHJpbmcgc2tpcHBhYmxlc1tdID0geworICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuQmFzaWNBdXRoZW50aWNhdG9yIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkRpZ2VzdEF1dGhlbnRpY2F0b3IiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuRm9ybUF1dGhlbnRpY2F0b3IiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuTm9uTG9naW5BdXRoZW50aWNhdG9yIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLlNTTEF1dGhlbnRpY2F0b3IiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0VmFsdmUiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRFbmdpbmVWYWx2ZSIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3RWYWx2ZSIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkNlcnRpZmljYXRlc1ZhbHZlIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuRXJyb3JSZXBvcnRWYWx2ZSIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlcXVlc3RMaXN0ZW5lclZhbHZlIiwgfTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBza2lwcGFibGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgdmFsdmVkZXNjLmFkZFRyYW5zaWVudENoaWxkKHNraXBwYWJsZXNbaV0pOworCisgICAgICAgIHN0YW5kYXJkRW5naW5lID0gbmV3IFN0YW5kYXJkRW5naW5lKCk7CisgICAgICAgIHN0YW5kYXJkRW5naW5lLnNldE5hbWUoIkNhdGFsaW5hIik7CisKKyAgICB9CisKKyAgICBwcml2YXRlIFN0b3JlRGVzY3JpcHRpb24gcmVnaXN0ZXJEZXNjcmlwdG9yKFN0cmluZyB0YWcsIENsYXNzIGFDbGFzcykgeworICAgICAgICByZXR1cm4gcmVnaXN0ZXJEZXNjcmlwdG9yKHRhZywgYUNsYXNzLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIAorICAgICAqLworICAgIHByaXZhdGUgU3RvcmVEZXNjcmlwdGlvbiByZWdpc3RlckRlc2NyaXB0b3IoU3RyaW5nIHRhZywgQ2xhc3MgYUNsYXNzLAorICAgICAgICAgICAgU3RyaW5nIGZhY3RvcnlDbGFzcywgYm9vbGVhbiBmc3RhbmRhcmQsIGJvb2xlYW4gZmRlZmF1bHQpIHsKKyAgICAgICAgcmV0dXJuIERlc2NyaXB0b3JIZWxwZXIucmVnaXN0ZXJEZXNjcmlwdG9yKGRlc2MsIHJlZ2lzdHJ5LCBhQ2xhc3MKKyAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLCB0YWcsIGFDbGFzcy5nZXROYW1lKCksIGZhY3RvcnlDbGFzcywgZnN0YW5kYXJkLAorICAgICAgICAgICAgICAgIGZkZWZhdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhbmRhcmRFbmdpbmUKKyAgICAgICAgICAgICAgICAuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobmV3IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSW5mb0xpZmVjeWNsZUxpc3RlbmVyKCkpOworICAgICAgICBTdGFuZGFyZEhvc3QgaG9zdCA9IG5ldyBTdGFuZGFyZEhvc3QoKTsKKyAgICAgICAgaG9zdC5zZXROYW1lKCJsb2NhbGhvc3QiKTsKKyAgICAgICAgc3RhbmRhcmRFbmdpbmUuYWRkQ2hpbGQoaG9zdCk7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8RW5naW5lIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgbmFtZT1cIkNhdGFsaW5hXCI+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxMaXN0ZW5lciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkluZm9MaWZlY3ljbGVMaXN0ZW5lclwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgIDxSZWFsbSIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBhcHBOYW1lPVwiQ2F0YWxpbmFcIi8+IiArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgPEhvc3QiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgICAgbmFtZT1cImxvY2FsaG9zdFwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICI8L0VuZ2luZT4iICsgTEYuTElORV9TRVBBUkFUT1I7CisKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbGVtZW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdGFuZGFyZEVuZ2luZS5zZXROYW1lKCJDYXRhbGluYSIpOworICAgICAgICBzdGFuZGFyZEVuZ2luZQorICAgICAgICAgICAgICAgIC5hZGRMaWZlY3ljbGVMaXN0ZW5lcihuZXcgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JbmZvTGlmZWN5Y2xlTGlzdGVuZXIoKSk7CisgICAgICAgIHN0YW5kYXJkRW5naW5lCisgICAgICAgICAgICAgICAgLmFkZExpZmVjeWNsZUxpc3RlbmVyKG5ldyBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuRW5naW5lQ29uZmlnKCkpOworICAgICAgICBTdGFuZGFyZEhvc3QgaG9zdCA9IG5ldyBTdGFuZGFyZEhvc3QoKTsKKyAgICAgICAgaG9zdC5zZXROYW1lKCJsb2NhbGhvc3QiKTsKKyAgICAgICAgc3RhbmRhcmRFbmdpbmUuYWRkQ2hpbGQoaG9zdCk7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8RW5naW5lIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgbmFtZT1cIkNhdGFsaW5hXCI+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxMaXN0ZW5lciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkluZm9MaWZlY3ljbGVMaXN0ZW5lclwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgIDxSZWFsbSIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBhcHBOYW1lPVwiQ2F0YWxpbmFcIi8+IiArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgPEhvc3QiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgICAgbmFtZT1cImxvY2FsaG9zdFwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICI8L0VuZ2luZT4iICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhbmRhcmRFbmdpbmUuc2V0TmFtZSgiQ2F0YWxpbmEiKTsKKyAgICAgICAgc3RhbmRhcmRFbmdpbmUKKyAgICAgICAgICAgICAgICAuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobmV3IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSW5mb0xpZmVjeWNsZUxpc3RlbmVyKCkpOworICAgICAgICBzdGFuZGFyZEVuZ2luZQorICAgICAgICAgICAgICAgIC5hZGRMaWZlY3ljbGVMaXN0ZW5lcihuZXcgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkVuZ2luZUNvbmZpZygpKTsKKyAgICAgICAgU3RhbmRhcmRIb3N0IGhvc3QgPSBuZXcgU3RhbmRhcmRIb3N0KCk7CisgICAgICAgIGhvc3Quc2V0TmFtZSgibG9jYWxob3N0Iik7CisgICAgICAgIHN0YW5kYXJkRW5naW5lLmFkZENoaWxkKGhvc3QpOworICAgICAgICBzdGFuZGFyZEVuZ2luZQorICAgICAgICAgICAgICAgIC5hZGRWYWx2ZShuZXcgb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuRXJyb3JSZXBvcnRWYWx2ZSgpKTsKKyAgICAgICAgc3RhbmRhcmRFbmdpbmUKKyAgICAgICAgICAgICAgICAuYWRkVmFsdmUobmV3IG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlcXVlc3REdW1wZXJWYWx2ZSgpKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxFbmdpbmUiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBuYW1lPVwiQ2F0YWxpbmFcIj4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPExpc3RlbmVyIGNsYXNzTmFtZT1cIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSW5mb0xpZmVjeWNsZUxpc3RlbmVyXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8UmVhbG0iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBhcHBOYW1lPVwiQ2F0YWxpbmFcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxWYWx2ZSBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZXF1ZXN0RHVtcGVyVmFsdmVcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICA8SG9zdCIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBuYW1lPVwibG9jYWxob3N0XCIvPiIgKyBMRi5MSU5FX1NFUEFSQVRPUiArICI8L0VuZ2luZT4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8RW5naW5lIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIG5hbWU9XCJDYXRhbGluYVwiPiIgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgIDxSZWFsbSIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgICBhcHBOYW1lPVwiQ2F0YWxpbmFcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiPC9FbmdpbmU+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2soU3RyaW5nIGFzcGVjdGVkUmVzdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmFjdG9yeS5zdG9yZShwV3JpdGVyLCAtMiwgc3RhbmRhcmRFbmdpbmUpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNwZWN0ZWRSZXN1bHQsIHdyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkSG9zdFNGVGVzdC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdGFuZGFyZEhvc3RTRlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWVmMTBlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdGFuZGFyZEhvc3RTRlRlc3QuamF2YQpAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DYXRhbGluYUNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmRlcGxveS5GYXJtV2FyRGVwbG95ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLm1jYXN0Lk1jYXN0U2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5Kdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlJlcGxpY2F0aW9uVHJhbnNtaXR0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuU2ltcGxlVGNwQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KQUFTUmVhbG07CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogIAorICovCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRIb3N0U0ZUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIFN0b3JlUmVnaXN0cnkgcmVnaXN0cnk7CisKKyAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCisgICAgUHJpbnRXcml0ZXIgcFdyaXRlciA9IG5ldyBQcmludFdyaXRlcih3cml0ZXIpOworCisgICAgU3RhbmRhcmRIb3N0IHN0YW5kYXJkSG9zdDsKKworICAgIFN0YW5kYXJkSG9zdFNGIGZhY3Rvcnk7CisKKyAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2M7CisKKyAgICAvKgorICAgICAqIGNyZWF0ZSByZWdpc3RyeSBhbmQgcmVnaXN0ZXIgSG9zdCBhbmQgYWxsIHN1YmVsZW1lbnQgZGVzY3JpcHRvcnMKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICByZWdpc3RyeSA9IG5ldyBTdG9yZVJlZ2lzdHJ5KCk7CisgICAgICAgIGRlc2MgPSBuZXcgU3RvcmVEZXNjcmlwdGlvbigpOworICAgICAgICBkZXNjLnNldFRhZygiSG9zdCIpOworICAgICAgICBkZXNjLnNldFRhZ0NsYXNzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0Iik7CisgICAgICAgIGRlc2Muc2V0U3RhbmRhcmQodHJ1ZSk7CisgICAgICAgIGRlc2Muc2V0U3RvcmVGYWN0b3J5Q2xhc3MoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3RTRiIpOworICAgICAgICBkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgiZG9tYWluIik7CisgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRGVzY3JpcHRpb24oZGVzYyk7CisgICAgICAgIGZhY3RvcnkgPSBuZXcgU3RhbmRhcmRIb3N0U0YoKTsKKyAgICAgICAgZGVzYy5zZXRTdG9yZUZhY3RvcnkoZmFjdG9yeSk7CisgICAgICAgIGZhY3Rvcnkuc2V0UmVnaXN0cnkocmVnaXN0cnkpOworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGxpc3RlbmVyZGVzYyA9IHJlZ2lzdGVyRGVzY3JpcHRvcigiTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgIExpZmVjeWNsZUxpc3RlbmVyLmNsYXNzKTsKKworICAgICAgICBTdHJpbmcgbGlzdGVuZXJza2lwcGFibGVzW10gPSB7CisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5OYW1pbmdDb250ZXh0TGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuSG9zdENvbmZpZyIsIH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJza2lwcGFibGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgbGlzdGVuZXJkZXNjLmFkZFRyYW5zaWVudENoaWxkKGxpc3RlbmVyc2tpcHBhYmxlc1tpXSk7CisKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiByZWFsbWRlc2MgPSByZWdpc3RlckRlc2NyaXB0b3IoIlJlYWxtIiwKKyAgICAgICAgICAgICAgICBKQUFTUmVhbG0uY2xhc3MsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIGZhbHNlLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBjb250ZXh0ZGVzYyA9IHJlZ2lzdGVyRGVzY3JpcHRvcigiQ29udGV4dCIsCisgICAgICAgICAgICAgICAgU3RhbmRhcmRDb250ZXh0LmNsYXNzLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIFN0cmluZyBleGNlcHRpb25zW10gPSB7ICJhdmFpbGFibGUiLCAiY29uZmlnRmlsZSIsICJjb25maWd1cmVkIiwKKyAgICAgICAgICAgICAgICAiZGlzdHJpYnV0YWJsZSIsICJkb21haW4iLCAiZW5naW5lTmFtZSIsICJuYW1lIiwgInB1YmxpY0lkIiwKKyAgICAgICAgICAgICAgICAic2Vzc2lvblRpbWVvdXQiLCAic3RhcnR1cFRpbWUiLCAidGxkU2NhblRpbWUiIH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9ucy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGNvbnRleHRkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZShleGNlcHRpb25zW2ldKTsKKworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIHZhbHZlZGVzYyA9IHJlZ2lzdGVyRGVzY3JpcHRvcigiVmFsdmUiLCBWYWx2ZS5jbGFzcywKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpOworCisgICAgICAgIFN0cmluZyBza2lwcGFibGVzW10gPSB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0VmFsdmUiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5DZXJ0aWZpY2F0ZXNWYWx2ZSIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkVycm9yUmVwb3J0VmFsdmUiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZXF1ZXN0TGlzdGVuZXJWYWx2ZSIsIH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2tpcHBhYmxlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHZhbHZlZGVzYy5hZGRUcmFuc2llbnRDaGlsZChza2lwcGFibGVzW2ldKTsKKworICAgICAgICBEZXNjcmlwdG9ySGVscGVyLnJlZ2lzdGVyQ2x1c3RlckRlc2NyaXB0b3IoZGVzYywgcmVnaXN0cnkpOworICAgICAgICBzdGFuZGFyZEhvc3QgPSBuZXcgU3RhbmRhcmRIb3N0KCk7CisgICAgICAgIHN0YW5kYXJkSG9zdC5zZXROYW1lKCJsb2NhbGhvc3QiKTsKKworICAgIH0KKworICAgIHByaXZhdGUgU3RvcmVEZXNjcmlwdGlvbiByZWdpc3RlckRlc2NyaXB0b3IoU3RyaW5nIHRhZywgQ2xhc3MgYUNsYXNzKSB7CisgICAgICAgIHJldHVybiByZWdpc3RlckRlc2NyaXB0b3IodGFnLCBhQ2xhc3MsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIGZhbHNlLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0b3JlRGVzY3JpcHRpb24gcmVnaXN0ZXJEZXNjcmlwdG9yKFN0cmluZyB0YWcsIENsYXNzIGFDbGFzcywKKyAgICAgICAgICAgIFN0cmluZyBmYWN0b3J5Q2xhc3MsIGJvb2xlYW4gZnN0YW5kYXJkLCBib29sZWFuIGZkZWZhdWx0KSB7CisgICAgICAgIHJldHVybiBEZXNjcmlwdG9ySGVscGVyLnJlZ2lzdGVyRGVzY3JpcHRvcihkZXNjLCByZWdpc3RyeSwgYUNsYXNzCisgICAgICAgICAgICAgICAgLmdldE5hbWUoKSwgdGFnLCBhQ2xhc3MuZ2V0TmFtZSgpLCBmYWN0b3J5Q2xhc3MsIGZzdGFuZGFyZCwKKyAgICAgICAgICAgICAgICBmZGVmYXVsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YW5kYXJkSG9zdAorICAgICAgICAgICAgICAgIC5hZGRMaWZlY3ljbGVMaXN0ZW5lcihuZXcgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JbmZvTGlmZWN5Y2xlTGlzdGVuZXIoKSk7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8SG9zdCIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIG5hbWU9XCJsb2NhbGhvc3RcIj4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPExpc3RlbmVyIGNsYXNzTmFtZT1cIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSW5mb0xpZmVjeWNsZUxpc3RlbmVyXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIjwvSG9zdD4iICsgTEYuTElORV9TRVBBUkFUT1I7CisKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbGVtZW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdGFuZGFyZEhvc3QKKyAgICAgICAgICAgICAgICAuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobmV3IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSW5mb0xpZmVjeWNsZUxpc3RlbmVyKCkpOworICAgICAgICBzdGFuZGFyZEhvc3QKKyAgICAgICAgICAgICAgICAuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobmV3IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Ib3N0Q29uZmlnKCkpOworICAgICAgICBzdGFuZGFyZEhvc3Quc2V0UmVhbG0obmV3IEpBQVNSZWFsbSgpKTsKKyAgICAgICAgU3RhbmRhcmRDb250ZXh0IGNvbnRleHQgPSBuZXcgU3RhbmRhcmRDb250ZXh0KCk7CisgICAgICAgIGNvbnRleHQuc2V0RG9jQmFzZSgibXlhcHBzIik7CisgICAgICAgIGNvbnRleHQuc2V0UGF0aCgiL215YXBwcyIpOworICAgICAgICBzdGFuZGFyZEhvc3QuYWRkQ2hpbGQoY29udGV4dCk7CisgICAgICAgIHN0YW5kYXJkSG9zdC5hZGRBbGlhcygiam92aSIpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPEhvc3QiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBuYW1lPVwibG9jYWxob3N0XCI+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxMaXN0ZW5lciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkluZm9MaWZlY3ljbGVMaXN0ZW5lclwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgIDxBbGlhcz5qb3ZpPC9BbGlhcz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPFJlYWxtIGNsYXNzTmFtZT1cIm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkFBU1JlYWxtXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgICAgYXBwTmFtZT1cImxvY2FsaG9zdFwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgIDxDb250ZXh0IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIGRvY0Jhc2U9XCJteWFwcHNcIiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBwYXRoPVwiL215YXBwc1wiLz4iICsgTEYuTElORV9TRVBBUkFUT1IgKyAiPC9Ib3N0PiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZhbHZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YW5kYXJkSG9zdAorICAgICAgICAgICAgICAgIC5hZGRMaWZlY3ljbGVMaXN0ZW5lcihuZXcgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JbmZvTGlmZWN5Y2xlTGlzdGVuZXIoKSk7CisgICAgICAgIHN0YW5kYXJkSG9zdAorICAgICAgICAgICAgICAgIC5hZGRWYWx2ZShuZXcgb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuRXJyb3JSZXBvcnRWYWx2ZSgpKTsKKyAgICAgICAgc3RhbmRhcmRIb3N0CisgICAgICAgICAgICAgICAgLmFkZFZhbHZlKG5ldyBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZXF1ZXN0RHVtcGVyVmFsdmUoKSk7CisgICAgICAgIHN0YW5kYXJkSG9zdC5hZGRWYWx2ZShuZXcgUmVwbGljYXRpb25WYWx2ZSgpKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxIb3N0IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgbmFtZT1cImxvY2FsaG9zdFwiPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8TGlzdGVuZXIgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JbmZvTGlmZWN5Y2xlTGlzdGVuZXJcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxWYWx2ZSBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZXF1ZXN0RHVtcGVyVmFsdmVcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiPC9Ib3N0PiIgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbHVzdGVyRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIgPSBuZXcgU2ltcGxlVGNwQ2x1c3RlcigpOworICAgICAgICBzdGFuZGFyZEhvc3Quc2V0Q2x1c3RlcihjbHVzdGVyKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxIb3N0IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgbmFtZT1cImxvY2FsaG9zdFwiPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8Q2x1c3RlciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlNpbXBsZVRjcENsdXN0ZXJcIj4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgIDwvQ2x1c3Rlcj4iICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICI8L0hvc3Q+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsdXN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2ltcGxlVGNwQ2x1c3RlciBjbHVzdGVyID0gbmV3IFNpbXBsZVRjcENsdXN0ZXIoKTsKKyAgICAgICAgY2x1c3Rlci5zZXRDbHVzdGVyTmFtZSgiY2x1c3RlciIpOworICAgICAgICBjbHVzdGVyLnNldFByb3BlcnR5KCJleHBpcmVTZXNzaW9uc09uU2h1dGRvd24iLCJmYWxzZSIpOworICAgICAgICBjbHVzdGVyCisgICAgICAgICAgICAgICAgLnNldE1hbmFnZXJDbGFzc05hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uLkRlbHRhTWFuYWdlciIpOworICAgICAgICBNY2FzdFNlcnZpY2Ugc2VydmljZSA9IG5ldyBNY2FzdFNlcnZpY2UoKTsKKyAgICAgICAgc2VydmljZS5zZXRNY2FzdEFkZHIoIjIyOC4wLjAuNCIpOworICAgICAgICBzZXJ2aWNlLnNldE1jYXN0UG9ydCg0NTU2NCk7CisgICAgICAgIHNlcnZpY2Uuc2V0TWNhc3RGcmVxdWVuY3koNTAwbCk7CisgICAgICAgIHNlcnZpY2Uuc2V0TWNhc3REcm9wVGltZSgzMDAwbCk7CisgICAgICAgIGNsdXN0ZXIuc2V0TWVtYmVyc2hpcFNlcnZpY2Uoc2VydmljZSk7CisgICAgICAgIFJlcGxpY2F0aW9uTGlzdGVuZXIgcmVjZWl2ZXIgPSBuZXcgUmVwbGljYXRpb25MaXN0ZW5lcigpOworICAgICAgICByZWNlaXZlci5zZXRUY3BMaXN0ZW5BZGRyZXNzKCJhdXRvIik7CisgICAgICAgIHJlY2VpdmVyLnNldFRjcExpc3RlblBvcnQoNDAwMSk7CisgICAgICAgIHJlY2VpdmVyLnNldFRjcFNlbGVjdG9yVGltZW91dCgxMDBsKTsKKyAgICAgICAgcmVjZWl2ZXIuc2V0VGNwVGhyZWFkQ291bnQoNik7CisgICAgICAgIGNsdXN0ZXIuc2V0Q2x1c3RlclJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgUmVwbGljYXRpb25UcmFuc21pdHRlciBzZW5kZXIgPSBuZXcgUmVwbGljYXRpb25UcmFuc21pdHRlcigpOworICAgICAgICBzZW5kZXIuc2V0UmVwbGljYXRpb25Nb2RlKCJwb29sZWQiKTsKKyAgICAgICAgY2x1c3Rlci5zZXRDbHVzdGVyU2VuZGVyKHNlbmRlcik7CisgICAgICAgIFJlcGxpY2F0aW9uVmFsdmUgdmFsdmUgPSBuZXcgUmVwbGljYXRpb25WYWx2ZSgpOworICAgICAgICB2YWx2ZQorICAgICAgICAgICAgICAgIC5zZXRGaWx0ZXIoIi4qXFwuZ2lmOy4qXFwuanM7LipcXC5qcGc7LipcXC5qcGVnOy4qXFwuaHRtOy4qXFwuaHRtbDsuKlxcLnR4dDsiKTsKKyAgICAgICAgY2x1c3Rlci5hZGRWYWx2ZSh2YWx2ZSk7CisgICAgICAgIEZhcm1XYXJEZXBsb3llciBkZXBsb3llciA9IG5ldyBGYXJtV2FyRGVwbG95ZXIoKTsKKyAgICAgICAgZGVwbG95ZXIuc2V0VGVtcERpcigiL3RtcC93YXItdGVtcC8iKTsKKyAgICAgICAgZGVwbG95ZXIuc2V0RGVwbG95RGlyKCIvdG1wL3dhci1kZXBsb3kvIik7CisgICAgICAgIGRlcGxveWVyLnNldFdhdGNoRGlyKCIvdG1wL3dhci1saXN0ZW4vIik7CisgICAgICAgIGRlcGxveWVyLnNldFdhdGNoRW5hYmxlZChmYWxzZSk7CisgICAgICAgIGNsdXN0ZXIuc2V0Q2x1c3RlckRlcGxveWVyKGRlcGxveWVyKTsKKyAgICAgICAgc3RhbmRhcmRIb3N0LnNldENsdXN0ZXIoY2x1c3Rlcik7CisgICAgICAgIGNsdXN0ZXIuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobmV3IEluZm9MaWZlY3ljbGVMaXN0ZW5lcigpKTsKKyAgICAgICAgY2x1c3Rlci5hZGRDbHVzdGVyTGlzdGVuZXIobmV3IEp2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXIoKSk7CisgICAgICAgIC8vIERlbHRhTWFuYWdlciBpcyBkZWZhdWx0IQorICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPEhvc3QiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBuYW1lPVwibG9jYWxob3N0XCI+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxDbHVzdGVyIGNsYXNzTmFtZT1cIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuU2ltcGxlVGNwQ2x1c3RlclwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgICBjbHVzdGVyTmFtZT1cImNsdXN0ZXJcIj4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICA8TWVtYmVyc2hpcCBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIubWNhc3QuTWNhc3RTZXJ2aWNlXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICAgIG1jYXN0QWRkcj1cIjIyOC4wLjAuNFwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgICBtY2FzdERyb3BUaW1lPVwiMzAwMFwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgICBtY2FzdEZyZXF1ZW5jeT1cIjUwMFwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgICBtY2FzdFBvcnQ9XCI0NTU2NFwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICA8U2VuZGVyIGNsYXNzTmFtZT1cIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25UcmFuc21pdHRlclwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgICByZXBsaWNhdGlvbk1vZGU9XCJwb29sZWRcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgPFJlY2VpdmVyIGNsYXNzTmFtZT1cIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25MaXN0ZW5lclwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgICB0Y3BMaXN0ZW5BZGRyZXNzPVwiYXV0b1wiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgICB0Y3BMaXN0ZW5Qb3J0PVwiNDAwMVwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgICB0Y3BTZWxlY3RvclRpbWVvdXQ9XCIxMDBcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgICAgdGNwVGhyZWFkQ291bnQ9XCI2XCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIDxEZXBsb3llciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuZGVwbG95LkZhcm1XYXJEZXBsb3llclwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgICBkZXBsb3lEaXI9XCIvdG1wL3dhci1kZXBsb3kvXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICAgIHRlbXBEaXI9XCIvdG1wL3dhci10ZW1wL1wiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgICB3YXRjaERpcj1cIi90bXAvd2FyLWxpc3Rlbi9cIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgPFZhbHZlIGNsYXNzTmFtZT1cIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25WYWx2ZVwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgICBmaWx0ZXI9XCIuKlxcLmdpZjsuKlxcLmpzOy4qXFwuanBnOy4qXFwuanBlZzsuKlxcLmh0bTsuKlxcLmh0bWw7LipcXC50eHQ7XCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIDxMaXN0ZW5lciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkluZm9MaWZlY3ljbGVMaXN0ZW5lclwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICA8Q2x1c3Rlckxpc3RlbmVyIGNsYXNzTmFtZT1cIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uLkp2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXJcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICA8L0NsdXN0ZXI+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiPC9Ib3N0PiIgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8SG9zdCIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBuYW1lPVwibG9jYWxob3N0XCI+IiArIExGLkxJTkVfU0VQQVJBVE9SICsgIjwvSG9zdD4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrKFN0cmluZyBhc3BlY3RlZFJlc3VsdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZhY3Rvcnkuc3RvcmUocFdyaXRlciwgLTIsIHN0YW5kYXJkSG9zdCk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc3BlY3RlZFJlc3VsdCwgd3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRTZXJ2aWNlU0ZUZXN0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkU2VydmljZVNGVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YmRjODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkU2VydmljZVNGVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRFbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmljZTsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFNlcnZpY2VTRlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgU3RvcmVSZWdpc3RyeSByZWdpc3RyeTsKKworICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisKKyAgICBQcmludFdyaXRlciBwV3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHdyaXRlcik7CisKKyAgICBTdGFuZGFyZFNlcnZpY2Ugc3RhbmRhcmRTZXJ2aWNlID0gbmV3IFN0YW5kYXJkU2VydmljZSgpOworCisgICAgU3RhbmRhcmRTZXJ2aWNlU0YgZmFjdG9yeTsKKworICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYzsKKworICAgIC8qCisgICAgICogY3JlYXRlIHJlZ2lzdHJ5IGFuZCByZWdpc3RlciBTZXJ2aWNlIGFuZCBhbGwgZGlyZWN0IHN1YmVsZW1lbnQKKyAgICAgKiBkZXNjcmlwdG9ycworICAgICAqIAorICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHJlZ2lzdHJ5ID0gbmV3IFN0b3JlUmVnaXN0cnkoKTsKKyAgICAgICAgZGVzYyA9IG5ldyBTdG9yZURlc2NyaXB0aW9uKCk7CisgICAgICAgIGRlc2Muc2V0VGFnKCJTZXJ2aWNlIik7CisgICAgICAgIGRlc2Muc2V0VGFnQ2xhc3MoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZpY2UiKTsKKyAgICAgICAgZGVzYy5zZXRTdGFuZGFyZCh0cnVlKTsKKyAgICAgICAgZGVzYy5zZXRTdG9yZUZhY3RvcnlDbGFzcygib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmljZVNGIik7CisgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRGVzY3JpcHRpb24oZGVzYyk7CisgICAgICAgIGZhY3RvcnkgPSBuZXcgU3RhbmRhcmRTZXJ2aWNlU0YoKTsKKyAgICAgICAgZGVzYy5zZXRTdG9yZUZhY3RvcnkoZmFjdG9yeSk7CisgICAgICAgIGZhY3Rvcnkuc2V0UmVnaXN0cnkocmVnaXN0cnkpOworICAgICAgICByZWdpc3RlckRlc2NyaXB0b3IoIkxpc3RlbmVyIiwgTGlmZWN5Y2xlTGlzdGVuZXIuY2xhc3MpOworICAgICAgICByZWdpc3RlckRlc2NyaXB0b3IoIkVuZ2luZSIsIFN0YW5kYXJkRW5naW5lLmNsYXNzLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gY2Rlc2MgPSByZWdpc3RlckRlc2NyaXB0b3IoIkNvbm5lY3RvciIsCisgICAgICAgICAgICAgICAgQ29ubmVjdG9yLmNsYXNzLCAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5Db25uZWN0b3JTRiIsCisgICAgICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIGNkZXNjLmdldFN0b3JlRmFjdG9yeSgpLnNldFN0b3JlQXBwZW5kZXIobmV3IENvbm5lY3RvclN0b3JlQXBwZW5kZXIoKSk7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gcGRlc2MgPSBEZXNjcmlwdG9ySGVscGVyCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyRGVzY3JpcHRvcihudWxsLCByZWdpc3RyeSwgQ29ubmVjdG9yLmNsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLltQcm90b2NvbEhhbmRsZXJdIiwgIlByb3RvY29sSGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSk7CisgICAgICAgIHBkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgia2V5c3RvcmUiKTsKKyAgICAgICAgcGRlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKCJrZXlwYXNzIik7CisgICAgICAgIHBkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgia2V5dHlwZSIpOworICAgICAgICBwZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoInJhbmRvbWZpbGUiKTsKKyAgICAgICAgcGRlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKCJwcm90b2NvbHMiKTsKKyAgICAgICAgcGRlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKCJjbGllbnRhdXRoIik7CisgICAgICAgIHBkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgicHJvdG9jb2wiKTsKKyAgICAgICAgcGRlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKCJwb3J0Iik7CisgICAgICAgIHBkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgic2VjdXJlIik7CisKKyAgICB9CisKKyAgICBwcml2YXRlIFN0b3JlRGVzY3JpcHRpb24gcmVnaXN0ZXJEZXNjcmlwdG9yKFN0cmluZyB0YWcsIENsYXNzIGFDbGFzcykgeworICAgICAgICByZXR1cm4gcmVnaXN0ZXJEZXNjcmlwdG9yKHRhZywgYUNsYXNzLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdG9yZURlc2NyaXB0aW9uIHJlZ2lzdGVyRGVzY3JpcHRvcihTdHJpbmcgdGFnLCBDbGFzcyBhQ2xhc3MsCisgICAgICAgICAgICBTdHJpbmcgZmFjdG9yeUNsYXNzLCBib29sZWFuIGZzdGFuZGFyZCwgYm9vbGVhbiBmZGVmYXVsdCkgeworICAgICAgICByZXR1cm4gRGVzY3JpcHRvckhlbHBlci5yZWdpc3RlckRlc2NyaXB0b3IoZGVzYywgcmVnaXN0cnksIGFDbGFzcworICAgICAgICAgICAgICAgIC5nZXROYW1lKCksIHRhZywgYUNsYXNzLmdldE5hbWUoKSwgZmFjdG9yeUNsYXNzLCBmc3RhbmRhcmQsCisgICAgICAgICAgICAgICAgZmRlZmF1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZUFKUCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdGFuZGFyZFNlcnZpY2UKKyAgICAgICAgICAgICAgICAuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobmV3IG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKCkpOworICAgICAgICBDb25uZWN0b3IgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvcigpOworICAgICAgICBzdGFuZGFyZFNlcnZpY2UuYWRkQ29ubmVjdG9yKGNvbm5lY3Rvcik7CisgICAgICAgIHN0YW5kYXJkU2VydmljZS5zZXRDb250YWluZXIobmV3IFN0YW5kYXJkRW5naW5lKCkpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPFNlcnZpY2U+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxMaXN0ZW5lciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5TZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lclwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgIDxDb25uZWN0b3IvPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPEVuZ2luZS8+IiArIExGLkxJTkVfU0VQQVJBVE9SICsgIjwvU2VydmljZT4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8U2VydmljZT4iICsgTEYuTElORV9TRVBBUkFUT1IgKyAiPC9TZXJ2aWNlPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2soU3RyaW5nIGFzcGVjdGVkUmVzdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmFjdG9yeS5zdG9yZShwV3JpdGVyLCAtMiwgc3RhbmRhcmRTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzcGVjdGVkUmVzdWx0LCB3cml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUFwcGVuZGVyVGVzdC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUFwcGVuZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NDg4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlQXBwZW5kZXJUZXN0LmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlJlcGxpY2F0aW9uVHJhbnNtaXR0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuU2V0QWxsUHJvcGVydGllc1J1bGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICovCitwdWJsaWMgY2xhc3MgU3RvcmVBcHBlbmRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIGRpZ2VzdGVyIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBwYXJzZSBjb250ZXh0IGNvbmZpZyBmaWxlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlnZXN0ZXIgY3JlYXRlRGlnZXN0ZXIoKSB7CisgICAgICAgIERpZ2VzdGVyIGRpZ2VzdGVyID0gbmV3IERpZ2VzdGVyKCk7CisgICAgICAgIGRpZ2VzdGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoIlJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUoIlJlc291cmNlIiwgbmV3IFNldEFsbFByb3BlcnRpZXNSdWxlKCkpOworICAgICAgICByZXR1cm4gZGlnZXN0ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbFJlc291cmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworICAgICAgICBEaWdlc3RlciBkaWdlc3RlciA9IGNyZWF0ZURpZ2VzdGVyKCk7CisgICAgICAgIFN0cmluZyBleGFtcGxlID0gIjxSZXNvdXJjZSBhdXRoPVwiQ29udGFpbmVyXCIgbmFtZT1cImpkYmMvRW1wXCIgdHlwZT1cImphdmF4LnNxbC5EYXRhU291cmNlXCIvPiI7CisgICAgICAgIFN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKGV4YW1wbGUpOworICAgICAgICBDb250ZXh0UmVzb3VyY2UgcmVzb3VyY2UgPSAoQ29udGV4dFJlc291cmNlKSBkaWdlc3Rlci5wYXJzZShyZWFkZXIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZheC5zcWwuRGF0YVNvdXJjZSIsIHJlc291cmNlLmdldFR5cGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5UmVzb3VjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBjcmVhdGVEaWdlc3RlcigpOworICAgICAgICBTdHJpbmcgZXhhbXBsZSA9ICI8UmVzb3VyY2UgYXV0aD1cIkNvbnRhaW5lclwiIG5hbWU9XCJtYWlsL01haWxTZXNzaW9uXCIgdHlwZT1cImphdmF4Lm1haWwuc2Vzc2lvblwiIG1haWwuaG9zdD1cImxvY2FsaG9zdFwiLz4iOworICAgICAgICBTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihleGFtcGxlKTsKKyAgICAgICAgQ29udGV4dFJlc291cmNlIHJlc291cmNlID0gKENvbnRleHRSZXNvdXJjZSkgZGlnZXN0ZXIucGFyc2UocmVhZGVyKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7CisgICAgICAgIGFzc2VydEVxdWFscygibG9jYWxob3N0IiwgcmVzb3VyY2UuZ2V0UHJvcGVydHkoIm1haWwuaG9zdCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcmVTdGFuZGFyZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2MgPSBuZXcgU3RvcmVEZXNjcmlwdGlvbigpOworICAgICAgICBkZXNjLnNldFN0YW5kYXJkKHRydWUpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IFN0cmluZ1dyaXRlcigpKTsKKyAgICAgICAgU3RhbmRhcmRTZXJ2ZXIgYmVhbiA9IG5ldyBTdGFuZGFyZFNlcnZlcigpOworICAgICAgICBuZXcgU3RvcmVBcHBlbmRlcigpLnByaW50QXR0cmlidXRlcyh3cml0ZXIsIDAsIHRydWUsIGJlYW4sIGRlc2MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZVJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjID0gbmV3IFN0b3JlRGVzY3JpcHRpb24oKTsKKyAgICAgICAgZGVzYy5zZXRTdGFuZGFyZCh0cnVlKTsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzd3JpdGVyKTsKKyAgICAgICAgUmVwbGljYXRpb25UcmFuc21pdHRlciBiZWFuID0gbmV3IFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIoKTsKKyAgICAgICAgYmVhbi5zZXRSZXBsaWNhdGlvbk1vZGUoImFzeW5jaHJvbm91cyIpOworICAgICAgICBiZWFuLnNldFByb3BlcnR5KCJrZWVwQWxpdmVUaW1lb3V0IiwiODAwMDAiKTsKKyAgICAgICAgbmV3IElEeW5hbWljUHJvcGVydHlTdG9yZUFwcGVuZGVyKCkucHJpbnRBdHRyaWJ1dGVzKHdyaXRlciwgMCwgdHJ1ZSwgYmVhbiwgZGVzYyk7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9TEYuTElORV9TRVBBUkFUT1IgICAgICAgICAgIAorICAgICAgICAgICArICIgICAgcmVwbGljYXRpb25Nb2RlPVwiYXN5bmNocm9ub3VzXCIiICsgTEYuTElORV9TRVBBUkFUT1IgCisgICAgICAgICAgICsgIiAgICBrZWVwQWxpdmVUaW1lb3V0PVwiODAwMDBcIiIgOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNwZWN0ZWRSZXN1bHQsIHN3cml0ZXIuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKSk7CisKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlQ29udGV4dEFwcGVuZGVyVGVzdC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUNvbnRleHRBcHBlbmRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTU1ZDEyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUNvbnRleHRBcHBlbmRlclRlc3QuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENyZWF0ZWQgb24gMjQuMDguMjAwNAorICoKKyAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bworICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNvbnRleHRDb25maWc7CitpbXBvcnQgamF2YS5pby5GaWxlIDsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBTdG9yZUNvbnRleHRBcHBlbmRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBTdG9yZUNvbnRleHRBcHBlbmRlciBhcHBlbmRlciA9IG5ldyBTdG9yZUNvbnRleHRBcHBlbmRlcigpOworCisgICAgU3RhbmRhcmRDb250ZXh0IGNvbnRleHQgPSBuZXcgU3RhbmRhcmRDb250ZXh0KCk7CisKKyAgICBTdGFuZGFyZEhvc3QgaG9zdCA9IG5ldyBTdGFuZGFyZEhvc3QoKTsKKworICAgIC8qCisgICAgICogc2V0dXAgZGVmYXVsdCBFbmdpbmUsIEhvc3QgYW5kIENvbnRleHQKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaG9zdC5zZXROYW1lKCJsb2NhbGhvc3QiKTsKKyAgICAgICAgY29udGV4dC5zZXRQYXJlbnQoaG9zdCk7CisgICAgICAgIFN0YW5kYXJkRW5naW5lIGVuZ2luZSA9IG5ldyBTdGFuZGFyZEVuZ2luZSgpOworICAgICAgICBlbmdpbmUuc2V0TmFtZSgiQ2F0YWxpbmEiKTsKKyAgICAgICAgaG9zdC5zZXRQYXJlbnQoZW5naW5lKTsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V29ya0Rpck1hbmFnZXIoKSB7CisgICAgICAgIGNvbnRleHQuc2V0UGF0aCgiL21hbmFnZXIiKTsKKyAgICAgICAgU3RyaW5nIGRlZmF1bHREaXIgPSBhcHBlbmRlci5nZXREZWZhdWx0V29ya0Rpcihjb250ZXh0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3b3JrXFxDYXRhbGluYVxcbG9jYWxob3N0XFxtYW5hZ2VyIiwgZGVmYXVsdERpcik7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V29ya0RpclJvb3QoKSB7CisgICAgICAgIGNvbnRleHQuc2V0UGF0aCgiIik7CisgICAgICAgIFN0cmluZyBkZWZhdWx0RGlyID0gYXBwZW5kZXIuZ2V0RGVmYXVsdFdvcmtEaXIoY29udGV4dCk7CisgICAgICAgIGFzc2VydEVxdWFscygid29ya1xcQ2F0YWxpbmFcXGxvY2FsaG9zdFxcXyIsIGRlZmF1bHREaXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIb3N0V29ya0RpclJvb3QoKSB7CisgICAgICAgIGNvbnRleHQuc2V0UGF0aCgiIik7CisgICAgICAgIGhvc3Quc2V0V29ya0RpcigiaG9zdHdvcmsiKTsKKyAgICAgICAgU3RyaW5nIGRlZmF1bHREaXIgPSBhcHBlbmRlci5nZXREZWZhdWx0V29ya0Rpcihjb250ZXh0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJob3N0d29ya1xcXyIsIGRlZmF1bHREaXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJc1ByaW50VmFsdWVEZWZhdWx0KCkgeworICAgICAgICBTdGFuZGFyZENvbnRleHQgY29udGV4dDIgPSBuZXcgU3RhbmRhcmRDb250ZXh0KCk7CisgICAgICAgIGNvbnRleHQuc2V0UGF0aCgiIik7CisgICAgICAgIGNvbnRleHQuc2V0V29ya0Rpcigid29ya1xcQ2F0YWxpbmFcXGxvY2FsaG9zdFxcXyIpOworICAgICAgICBhc3NlcnRGYWxzZShhcHBlbmRlci5pc1ByaW50VmFsdWUoY29udGV4dCwgY29udGV4dDIsICJ3b3JrRGlyIiwgbnVsbCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJc1ByaW50VmFsdWUoKSB7CisgICAgICAgIFN0YW5kYXJkQ29udGV4dCBjb250ZXh0MiA9IG5ldyBTdGFuZGFyZENvbnRleHQoKTsKKyAgICAgICAgY29udGV4dC5zZXRQYXRoKCIiKTsKKyAgICAgICAgY29udGV4dC5zZXRXb3JrRGlyKCJDOlxcd29ya1xcQ2F0YWxpbmFcXGxvY2FsaG9zdFxcXyIpOworICAgICAgICBhc3NlcnRUcnVlKGFwcGVuZGVyLmlzUHJpbnRWYWx1ZShjb250ZXh0LCBjb250ZXh0MiwgIndvcmtEaXIiLCBudWxsKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEhvc3RJc1ByaW50VmFsdWVkZWZhdWx0KCkgeworICAgICAgICBTdGFuZGFyZENvbnRleHQgY29udGV4dDIgPSBuZXcgU3RhbmRhcmRDb250ZXh0KCk7CisgICAgICAgIGNvbnRleHQuc2V0UGF0aCgiIik7CisgICAgICAgIGhvc3Quc2V0V29ya0RpcigiaG9zdHdvcmsiKTsKKyAgICAgICAgY29udGV4dC5zZXRXb3JrRGlyKCJob3N0d29ya1xcXyIpOworICAgICAgICBhc3NlcnRGYWxzZShhcHBlbmRlci5pc1ByaW50VmFsdWUoY29udGV4dCwgY29udGV4dDIsICJ3b3JrRGlyIiwgbnVsbCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIF90ZXN0RGVmYXVsdEluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUoY29udGV4dC5nZXRDb29raWVzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjb250ZXh0LmdldFJlbG9hZGFibGUoKSk7CisgICAgICAgIFN0YW5kYXJkQ29udGV4dCBkZWZhdWx0Q29udGV4dCA9IChTdGFuZGFyZENvbnRleHQpIGFwcGVuZGVyCisgICAgICAgICAgICAgICAgLmRlZmF1bHRJbnN0YW5jZShjb250ZXh0KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZGVmYXVsdENvbnRleHQuZ2V0Q29va2llcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkZWZhdWx0Q29udGV4dC5nZXRSZWxvYWRhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZGVmYXVsdENvbnRleHQuZmluZExpZmVjeWNsZUxpc3RlbmVycygpLmxlbmd0aCk7CisgICAgICAgIGFzc2VydFRydWUoZGVmYXVsdENvbnRleHQuZmluZExpZmVjeWNsZUxpc3RlbmVycygpWzBdIGluc3RhbmNlb2YgQ29udGV4dENvbmZpZyk7CisgICAgICAgIGFzc2VydFRydWUoZGVmYXVsdENvbnRleHQuZmluZExpZmVjeWNsZUxpc3RlbmVycygpWzFdIGluc3RhbmNlb2YgSW5mb0xpZmVjeWNsZUxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBfdGVzdERlZmF1bHRJbnN0YW5jZVdpdGhvdXRPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb250ZXh0LnNldE92ZXJyaWRlKHRydWUpOworICAgICAgICBTdGFuZGFyZENvbnRleHQgZGVmYXVsdENvbnRleHQgPSAoU3RhbmRhcmRDb250ZXh0KSBhcHBlbmRlcgorICAgICAgICAgICAgICAgIC5kZWZhdWx0SW5zdGFuY2UoY29udGV4dCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBkZWZhdWx0Q29udGV4dC5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkubGVuZ3RoKTsKKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdGFuZGFyZENvbnRleHQgZGVmYXVsdENvbnRleHQgPSAoU3RhbmRhcmRDb250ZXh0KSBhcHBlbmRlcgorICAgICAgICAuZGVmYXVsdEluc3RhbmNlKGNvbnRleHQpOworICAgICAgICBjb250ZXh0LnNldFBhdGgoIi9teWFwcHMiKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjb250ZXh0LmdldENvbmZpZ0ZpbGUoKSk7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYyA9IG5ldyBTdG9yZURlc2NyaXB0aW9uKCk7CisgICAgICAgIGRlc2Muc2V0RXh0ZXJuYWxBbGxvd2VkKHRydWUpOworICAgICAgICBkZXNjLnNldFN0b3JlU2VwYXJhdGUodHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoYXBwZW5kZXIuaXNQcmludFZhbHVlKGNvbnRleHQsIGRlZmF1bHRDb250ZXh0LCAicGF0aCIsIGRlc2MpKTsKKyAgICAgICAgY29udGV4dC5zZXRDb25maWdGaWxlKCJjb25mL0NhdGFsaW5hL2xvY2Fob3N0L215YXBwcy54bWwiKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYXBwZW5kZXIuaXNQcmludFZhbHVlKGNvbnRleHQsIGRlZmF1bHRDb250ZXh0LCAicGF0aCIsIGRlc2MpKTsKKyAgICAgICAgZGVzYy5zZXRFeHRlcm5hbEFsbG93ZWQoZmFsc2UpOworICAgICAgICBhc3NlcnRGYWxzZShhcHBlbmRlci5pc1ByaW50VmFsdWUoY29udGV4dCwgZGVmYXVsdENvbnRleHQsICJwYXRoIiwgZGVzYykpOworICAgICAgICBkZXNjLnNldEV4dGVybmFsQWxsb3dlZCh0cnVlKTsKKyAgICAgICAgZGVzYy5zZXRTdG9yZVNlcGFyYXRlKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYXBwZW5kZXIuaXNQcmludFZhbHVlKGNvbnRleHQsIGRlZmF1bHRDb250ZXh0LCAicGF0aCIsIGRlc2MpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdERvY0Jhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhbmRhcmRDb250ZXh0IGRlZmF1bHRDb250ZXh0ID0gKFN0YW5kYXJkQ29udGV4dCkgYXBwZW5kZXIKKyAgICAgICAgLmRlZmF1bHRJbnN0YW5jZShjb250ZXh0KTsKKyAgICAgICAgY29udGV4dC5zZXRQYXRoKCIvbXlhcHBzIik7CisgICAgICAgIGNvbnRleHQuc2V0RG9jQmFzZSgibXlhcHBzIik7CisgICAgICAgIGhvc3Quc2V0QXBwQmFzZSgid2ViYXBwcyIpOworICAgICAgICBhc3NlcnRGYWxzZShhcHBlbmRlci5pc1ByaW50VmFsdWUoY29udGV4dCwgZGVmYXVsdENvbnRleHQsICJkb2NCYXNlIiwgbnVsbCkpOworICAgICAgICBjb250ZXh0LnNldERvY0Jhc2UoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpICsgIi9teWFwcHMiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhcHBlbmRlci5pc1ByaW50VmFsdWUoY29udGV4dCwgZGVmYXVsdENvbnRleHQsICJkb2NCYXNlIiwgbnVsbCkpOworICAgICAgICAKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUxvYWRlclRlc3QuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVMb2FkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwYWIwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVMb2FkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblRyYW5zbWl0dGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuRGlnZXN0ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqICAKKyAqLworcHVibGljIGNsYXNzIFN0b3JlTG9hZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3REaWdlc3RlcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBTdG9yZUxvYWRlci5jcmVhdGVEaWdlc3RlcigpOworICAgICAgICBTdHJpbmcgZXhhbXBsZSA9ICI8UmVnaXN0cnkgbmFtZT1cIlRvbWNhdFwiIHZlcnNpb249XCI1LjUuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA+IgorICAgICAgICAgICAgICAgICsgIiA8RGVzY3JpcHRpb24gIgorICAgICAgICAgICAgICAgICsgIiAgdGFnPVwiU2VydmVyXCIiCisgICAgICAgICAgICAgICAgKyAiCXN0YW5kYXJkPVwidHJ1ZVwiIgorICAgICAgICAgICAgICAgICsgIglkZWZhdWx0PVwidHJ1ZVwiIgorICAgICAgICAgICAgICAgICsgIiAgdGFnQ2xhc3M9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXJcIiIKKyAgICAgICAgICAgICAgICArICIgIHN0b3JlRmFjdG9yeUNsYXNzPVwib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdGFuZGFyZFNlcnZlclNGXCI+IgorICAgICAgICAgICAgICAgICsgIiA8L0Rlc2NyaXB0aW9uPiIgKyAiPC9SZWdpc3RyeT4iOworICAgICAgICBTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihleGFtcGxlKTsKKyAgICAgICAgU3RvcmVSZWdpc3RyeSByZWdpc3RyeSA9IChTdG9yZVJlZ2lzdHJ5KSBkaWdlc3Rlci5wYXJzZShyZWFkZXIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHJlZ2lzdHJ5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUb21jYXQiLCByZWdpc3RyeS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjUuNS4wIiwgcmVnaXN0cnkuZ2V0VmVyc2lvbigpKTsKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjID0gcmVnaXN0cnkuZmluZERlc2NyaXB0aW9uKFN0YW5kYXJkU2VydmVyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXIiLCBkZXNjCisgICAgICAgICAgICAgICAgLmdldFRhZ0NsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNlcnZlciIsIGRlc2MuZ2V0VGFnKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkUmVnaXN0cnkoKSB7CisgICAgICAgIFN0b3JlTG9hZGVyIGxvYWRlciA9IG5ldyBTdG9yZUxvYWRlcigpOworICAgICAgICBsb2FkZXIubG9hZCgpOworICAgICAgICBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbG9hZGVyLmdldFJlZ2lzdHJ5KCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocmVnaXN0cnkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVURi04IiwgcmVnaXN0cnkuZ2V0RW5jb2RpbmcoKSk7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYyA9IHJlZ2lzdHJ5LmZpbmREZXNjcmlwdGlvbihTdGFuZGFyZFNlcnZlci5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGVzYyk7CisgICAgICAgIGFzc2VydEVxdWFscygib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyIiwgZGVzYworICAgICAgICAgICAgICAgIC5nZXRUYWdDbGFzcygpKTsKKyAgICAgICAgZGVzYyA9IHJlZ2lzdHJ5LmZpbmREZXNjcmlwdGlvbihTdGFuZGFyZENvbnRleHQuY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRlc2MpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RhbmRhcmRDb250ZXh0LmNsYXNzLmdldE5hbWUoKSwgZGVzYy5nZXRUYWdDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkZXNjLmlzU3RvcmVTZXBhcmF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjLmdldFN0b3JlRmFjdG9yeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlZ2lzdHJ5LCBkZXNjLmdldFN0b3JlRmFjdG9yeSgpLmdldFJlZ2lzdHJ5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RhbmRhcmRDb250ZXh0U0YuY2xhc3MsIGRlc2MuZ2V0U3RvcmVGYWN0b3J5KCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIGRlc2MgPSByZWdpc3RyeQorICAgICAgICAgICAgICAgIC5maW5kRGVzY3JpcHRpb24oIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlci5bU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXJdIik7CisgICAgICAgIGFzc2VydEVxdWFscyhTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lci5jbGFzcy5nZXROYW1lKCksIGRlc2MKKyAgICAgICAgICAgICAgICAuZ2V0VGFnQ2xhc3MoKSk7CisgICAgICAgIGRlc2MgPSByZWdpc3RyeS5maW5kRGVzY3JpcHRpb24oUmVwbGljYXRpb25UcmFuc21pdHRlci5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGVzYyk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXBsaWNhdGlvblRyYW5zbWl0dGVyLmNsYXNzLmdldE5hbWUoKSwgZGVzYworICAgICAgICAgICAgICAgIC5nZXRUYWdDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjLmdldFN0b3JlRmFjdG9yeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKElEeW5hbWljUHJvcGVydHlTdG9yZUFwcGVuZGVyLmNsYXNzLCBkZXNjLmdldFN0b3JlRmFjdG9yeSgpLmdldFN0b3JlQXBwZW5kZXIoKS5nZXRDbGFzcygpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVSZWdpc3RyeVRlc3QuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnLWhhL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVSZWdpc3RyeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDlkYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZVJlZ2lzdHJ5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlcjsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBTdG9yZVJlZ2lzdHJ5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIFN0b3JlUmVnaXN0cnkgcmVnaXN0cnk7CisKKyAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCisgICAgUHJpbnRXcml0ZXIgcFdyaXRlciA9IG5ldyBQcmludFdyaXRlcih3cml0ZXIpOworCisgICAgU3RhbmRhcmRTZXJ2ZXIgc3RhbmRhcmRTZXJ2ZXIgPSBuZXcgU3RhbmRhcmRTZXJ2ZXIoKTsKKworICAgIElTdG9yZUZhY3RvcnkgZmFjdG9yeTsKKworICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYzsKKworICAgIC8qCisgICAgICogY3JlYXRlIHJlZ2lzdHJ5IGFuZCByZWdpc3RlciBTZXJ2ZXIgCisgICAgICogCisgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgcmVnaXN0cnkgPSBuZXcgU3RvcmVSZWdpc3RyeSgpOworICAgICAgICBkZXNjID0gbmV3IFN0b3JlRGVzY3JpcHRpb24oKTsKKyAgICAgICAgZGVzYy5zZXRUYWcoIlNlcnZlciIpOworICAgICAgICBkZXNjLnNldFRhZ0NsYXNzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXIiKTsKKyAgICAgICAgZGVzYy5zZXRTdGFuZGFyZCh0cnVlKTsKKyAgICAgICAgZGVzYworICAgICAgICAgICAgICAgIC5zZXRTdG9yZUZhY3RvcnlDbGFzcygib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIik7CisgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRGVzY3JpcHRpb24oZGVzYyk7CisgICAgICAgIGZhY3RvcnkgPSBuZXcgU3RvcmVGYWN0b3J5QmFzZSgpOworICAgICAgICBmYWN0b3J5LnNldFJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZVNlcnZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKHJlZ2lzdHJ5LmZpbmREZXNjcmlwdGlvbihTdGFuZGFyZFNlcnZlci5jbGFzcykpOworICAgICAgICBmYWN0b3J5LnN0b3JlKHBXcml0ZXIsIC0yLCBzdGFuZGFyZFNlcnZlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiWE1MIERpZmYiLCAiPFNlcnZlci8+IiArIExGLkxJTkVfU0VQQVJBVE9SLCB3cml0ZXIKKyAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhbmRhcmRTZXJ2ZXIuc2V0UG9ydCg3MzA1KTsKKyAgICAgICAgZmFjdG9yeS5zdG9yZShwV3JpdGVyLCAtMiwgc3RhbmRhcmRTZXJ2ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlhNTCBEaWZmIiwgIjxTZXJ2ZXIiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIHBvcnQ9XCI3MzA1XCIvPiIgKyBMRi5MSU5FX1NFUEFSQVRPUiwgd3JpdGVyLnRvU3RyaW5nKCkpOworCisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdG8tZG8udHh0IGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWctaGEvdG8tZG8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMjk3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy1oYS90by1kby50eHQKQEAgLTAsMCArMSw5IEBACisxLiBGaXggbmV3IGNvbm5lY3RvciBwcm9wZXJ0aWVzIGFuZCBwcm90b2NvbGhhbmRsZXIgZm9yIDUuNSAodGVzdGNhc2VzKQorCSBXb3JrIQorMi4gRml4IGNvbnRleHQgZGVmYXVsdCBoYW5kbGluZyAoaGFyZCBzdHVmZikKKzMuIENoZWNrIGNsdXN0ZXIgdHJhbnNpZW50IGF0dHJpYnV0ZXMKKzQuIGFkZCBkb2N1bWVudGF0aW9uCis1LiByZXBsYWNlIG9sZCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gaW5zdGVhZCBjdXJyZW50IGxpc3RlbmVyIGltcGxlbWVudGF0aW9uCis2LiBDb250ZXh0IHBhdGggYXR0cmlidXRlIGhhbmRsaW5nICggZGVsZXRlIGF0IGV4dGVybmFsIGNvbnRleHQueG1sIGFuZCB1c2VkIGluc2lkZSBzZXJ2ZXIueG1sISkKKzcuIFRlc3Qgd2l0aCBBZG1pbiBBcHAKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvYnVpbGQueG1sIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MTIxODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9idWlsZC54bWwKQEAgLTAsMCArMSwxMzggQEAKKzxwcm9qZWN0IG5hbWU9IlN0b3JlQ29uZmlnIiBkZWZhdWx0PSJkaXN0IiBiYXNlZGlyPSIuIj4KKworCisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSBQcm9wZXJ0eSBWYWx1ZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKworCTwhLS0gU2VlICJidWlsZC5wcm9wZXJ0aWVzLnNhbXBsZSIgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgZm9yIGFsbCAgICAgLS0+CisJPCEtLSBwcm9wZXJ0eSB2YWx1ZXMgeW91IG11c3QgY3VzdG9taXplIGZvciBzdWNjZXNzZnVsIGJ1aWxkaW5nISEhICAgICAgICAtLT4KKyAgICA8cHJvcGVydHkgZmlsZT0iLi4vLi4vLi4vYnVpbGQvYnVpbGQucHJvcGVydGllcyIgLz4KKyAgICA8cHJvcGVydHkgZmlsZT0iLi4vLi4vLi4vYnVpbGQvYnVpbGQucHJvcGVydGllcy5kZWZhdWx0IiAvPgorCisgICAgPCEtLSBCdWlsZCBEZWZhdWx0cyAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuaG9tZSIgIGxvY2F0aW9uPSIuLi8uLiIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5idWlsZCIgbG9jYXRpb249Ii4uLy4uLy4uL2J1aWxkL2J1aWxkIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNvbmZpZy5idWlsZCIgdmFsdWU9IiR7Y2F0YWxpbmEuaG9tZX0vbW9kdWxlcy9zdG9yZWNvbmZpZy9idWlsZCIgLz4KKwk8cHJvcGVydHkgbmFtZT0iY29uZmlnLmRpc3QiIHZhbHVlPSIke2NhdGFsaW5hLmhvbWV9L21vZHVsZXMvc3RvcmVjb25maWcvZGlzdCIgLz4KKworCTwhLS0gQ29uc3RydWN0IENhdGFsaW5hIGNsYXNzcGF0aCAtLT4KKwk8cGF0aCBpZD0iY29uZmlnLmNsYXNzcGF0aCI+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjYXRhbGluYS5idWlsZH0vc2VydmVyL2xpYi9jYXRhbGluYS5qYXIiIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjYXRhbGluYS5idWlsZH0vc2VydmVyL2xpYi90b21jYXQtdXRpbC5qYXIiIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxvZ2dpbmcuamFyfSIgLz4KKwkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbW9kZWxlci5qYXJ9IiAvPgorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7am14Lmphcn0iIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjYXRhbGluYS5idWlsZH0vY29tbW9uL2xpYi9zZXJ2bGV0LWFwaS5qYXIiIC8+CisJPC9wYXRoPgorCisJPCEtLSBTb3VyY2UgcGF0aCAtLT4KKwk8cGF0aCBpZD0iamF2YWRvYy5zb3VyY2VwYXRoIj4KKwkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMvc2hhcmUiIC8+CisJPC9wYXRoPgorCisKKwk8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IFNldCBjb21waWxlIGZsYWdzID09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTx0YXJnZXQgbmFtZT0iZmxhZ3MiPgorCQk8IS0tIEpESyBmbGFncyAtLT4KKwkJPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrLjEuMi5wcmVzZW50IiBjbGFzc25hbWU9ImphdmEudXRpbC5IYXNoTWFwIiAvPgorCQk8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsuMS4zLnByZXNlbnQiIGNsYXNzbmFtZT0iamF2YS5sYW5nLnJlZmxlY3QuUHJveHkiIC8+CisJCTxhdmFpbGFibGUgcHJvcGVydHk9Impkay4xLjQucHJlc2VudCIgY2xhc3NuYW1lPSJqYXZhLm5pby5CdWZmZXIiIC8+CisJPC90YXJnZXQ+CisKKworCTwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogU2V0IGNvbXBpbGUgZmxhZ3MgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJPHRhcmdldCBuYW1lPSJmbGFncy5kaXNwbGF5IiBkZXBlbmRzPSJmbGFncyIgdW5sZXNzPSJmbGFncy5oaWRlIj4KKworCQk8ZWNobyBtZXNzYWdlPSItLS0gQnVpbGQgZW52aXJvbm1lbnQgZm9yIENhdGFsaW5hIC0tLSIgLz4KKworCQk8ZWNobyBtZXNzYWdlPSJJZiAke3Byb3BlcnR5X25hbWV9IGlzIGRpc3BsYXllZCwgdGhlbiB0aGUgcHJvcGVydHkgaXMgbm90IHNldCkiIC8+CisKKwkJPGVjaG8gbWVzc2FnZT0iLS0tIEJ1aWxkIG9wdGlvbnMgLS0tIiAvPgorCQk8ZWNobyBtZXNzYWdlPSJmdWxsLmRpc3Q9JHtmdWxsLmRpc3R9IiAvPgorCQk8ZWNobyBtZXNzYWdlPSJidWlsZC5zeXNjbGFzc3BhdGg9JHtidWlsZC5zeXNjbGFzc3BhdGh9IiAvPgorCQk8ZWNobyBtZXNzYWdlPSJjb21waWxlLmRlYnVnPSR7Y29tcGlsZS5kZWJ1Z30iIC8+CisJCTxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUuZGVwcmVjYXRpb249JHtjb21waWxlLmRlcHJlY2F0aW9ufSIgLz4KKwkJPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5vcHRpbWl6ZT0ke2NvbXBpbGUub3B0aW1pemV9IiAvPgorCQk8ZWNobyBtZXNzYWdlPSJjb21waWxlLnNvdXJjZT0ke2NvbXBpbGUuc291cmNlfSIgLz4KKworCQk8ZWNobyBtZXNzYWdlPSItLS0gQW50IEZsYWdzIC0tLSIgLz4KKwkJPGVjaG8gbWVzc2FnZT0iJmx0O3N0eWxlJmd0OyB0YXNrIGF2YWlsYWJsZSAocmVxdWlyZWQpPSR7c3R5bGUuYXZhaWxhYmxlfSIgLz4KKworCQk8ZWNobyBtZXNzYWdlPSItLS0gSkRLIC0tLSIgLz4KKwkJPGVjaG8gbWVzc2FnZT0iamRrLjEuMi5wcmVzZW50PSR7amRrLjEuMi5wcmVzZW50fSIgLz4KKwkJPGVjaG8gbWVzc2FnZT0iamRrLjEuMy5wcmVzZW50PSR7amRrLjEuMy5wcmVzZW50fSIgLz4KKwkJPGVjaG8gbWVzc2FnZT0iamRrLjEuNC5wcmVzZW50PSR7amRrLjEuNC5wcmVzZW50fSIgLz4KKworCTwvdGFyZ2V0PgorCisJPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDcmVhdGUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwk8dGFyZ2V0IG5hbWU9ImJ1aWxkLXByZXBhcmUiPgorCQk8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfSIgLz4KKwkJPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3NlcyIgLz4KKwkJPG1rZGlyIGRpcj0iJHtjb25maWcuZGlzdH0iIC8+CisJPC90YXJnZXQ+CisKKworCisKKwk8IS0tID09PT09PT09PT09PT09PT0gQlVJTEQ6IENvbXBpbGUgQ2F0YWxpbmEgQ29tcG9uZW50cyA9PT09PT09PT09PT09PT09IC0tPgorCisJPHRhcmdldCBuYW1lPSJidWlsZC1jYXRhbGluYS1jb25maWciIGRlcGVuZHM9ImJ1aWxkLXByZXBhcmUiPgorCQk8IS0tIENvbXBpbGUgaW50ZXJuYWwgc2VydmVyIGNvbXBvbmVudHMgLS0+CisJCTxqYXZhYyBzcmNkaXI9IiR7YmFzZWRpcn0vc3JjL3NoYXJlIiBkZXN0ZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jbGFzc2VzIiBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iIHNvdXJjZT0iJHtjb21waWxlLnNvdXJjZX0iIG9wdGltaXplPSIke2NvbXBpbGUub3B0aW1pemV9IiBleGNsdWRlcz0iKiovQ1ZTLyoqIj4KKwkJCTxjbGFzc3BhdGggcmVmaWQ9ImNvbmZpZy5jbGFzc3BhdGgiIC8+CisJCTwvamF2YWM+CisJCTxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWciPgorCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnIj4KKwkJCQk8aW5jbHVkZSBuYW1lPSIqLnByb3BlcnRpZXMiIC8+CisJCQkJPGluY2x1ZGUgbmFtZT0iKi54bWwiIC8+CisJCQk8L2ZpbGVzZXQ+CisJCTwvY29weT4KKwk8L3RhcmdldD4KKworCisJPCEtLSA9PT09PT09PT09PT09PT09IEJVSUxEOiBDcmVhdGUgQ2F0YWxpbmEgSmF2YWRvY3MgPT09PT09PT09PT09PT09PT09PSAtLT4KKwk8dGFyZ2V0IG5hbWU9ImphdmFkb2MiPgorCQk8ZGVsZXRlIGRpcj0iJHtjb25maWcuYnVpbGR9L2phdmFkb2MiIC8+CisJCTxta2RpciBkaXI9IiR7Y29uZmlnLmJ1aWxkfS9qYXZhZG9jIiAvPgorCQk8amF2YWRvYyBwYWNrYWdlbmFtZXM9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuKiIgY2xhc3NwYXRocmVmPSJjb25maWcuY2xhc3NwYXRoIiBzb3VyY2VwYXRocmVmPSJqYXZhZG9jLnNvdXJjZXBhdGgiIGRlc3RkaXI9IiR7Y29uZmlnLmJ1aWxkfS9qYXZhZG9jIiBhdXRob3I9InRydWUiIHZlcnNpb249InRydWUiIHdpbmRvd3RpdGxlPSJDYXRhbGluYSBJbnRlcm5hbCBTdG9yZUNvbmZpZyBBUEkgRG9jdW1lbnRhdGlvbiIgZG9jdGl0bGU9IkNhdGFsaW5hIFN0b3JlQ29uZmlnIEFQSSIgYm90dG9tPSJDb3B5cmlnaHQgJiMxNjk7IDIwMDAtMjAwNCBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIiAvPgorCTwvdGFyZ2V0PgorCisKKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorCTx0YXJnZXQgbmFtZT0iYnVpbGQtY2xlYW4iPgorCQk8ZGVsZXRlIGRpcj0iJHtjb25maWcuYnVpbGR9IiAvPgorCQk8ZGVsZXRlIGRpcj0iJHtjb25maWcuZGlzdH0iIC8+CisgICAgICAgIDxkZWxldGU+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NsYXNzZXMiPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvKiovKiIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPC9kZWxldGU+CisJPC90YXJnZXQ+CisKKworCTwhLS0gPT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IFJlYnVpbGQgRXZlcnl0aGluZyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKworCisKKwk8IS0tID09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpc3RyaWJ1dGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0iYnVpbGQtY2F0YWxpbmEtY29uZmlnIj4KKworCQk8amFyIGRlc3RmaWxlPSIke2NvbmZpZy5kaXN0fS9jYXRhbGluYS1zdG9yZWNvbmZpZy5qYXIiIGJhc2VkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NsYXNzZXMiPgorCQkJPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy8qKiIgLz4KKwkJCTxleGNsdWRlIG5hbWU9IioqL3BhY2thZ2UuaHRtbCIgLz4KKyAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL0xvY2FsU3RyaW5nc18qIiAvPgorCQk8L2phcj4KKwk8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iY29weSIgZGVwZW5kcz0iZGlzdCIgPgorICAgICAgIDxjb3B5IGZpbGU9IiR7Y29uZmlnLmRpc3R9L2NhdGFsaW5hLXN0b3JlY29uZmlnLmphciIgdG9kaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L3NlcnZlci9saWIiIC8+CisgICA8L3RhcmdldD4KKworCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENsZWFuIERpcmVjdG9yeSA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKworCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBDb252ZW5pZW50IFN5bm9ueW1zID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvZG9jcy9SZWFkbWUudHh0IGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvZG9jcy9SZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOWM0ODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9kb2NzL1JlYWRtZS50eHQKQEAgLTAsMCArMSw2MyBAQAorU3RhdHVzOgorCitQZXRlciBSb99iYWNoCisyOS4xMS4yMDA0CisJCitGZWF0dXJlCis9PT09PT09PT09PT09PT09PT09PT09PT09CisJQmFja3VwIGNvbnRleHQueG1sCisJQmFja3VwIGb8ciBzZXJ2ZXIueG1sCisJQ2x1c3RlciBIYW5kbGluZworCVN0b3JlIGFsbCA1LjUuNSBlbGVtZW50cworCUNvbnRleHQgd29ya0RpciBkZWZhdWx0IEhhbmRsaW5nCisJV2F0Y2hlZFJlc291cmNlIERlZmF1bHQgSGFuZGxpbmcKKwlXcml0ZSB5b3VyIG93biBSZWdpc3RyeQorCQlTeXN0ZW0gUHJvcGVydHkgLURjYXRhbGluYS5zdG9yZWNvbmZpZz1maWxlOi4uL3h4eC54bWwKKwkJJHtjYXRhbGluYS5iYXNlfS9jb25mIGJ6dyAke2NhdGFsaW5hLmhvbWV9L2NvbmYKKwkJQ2xhc3NwYXRoIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcKKwlKTVggU3RvcmVDb25maWcgTUJlYW4KKwkJU3RvcmUgY29udGV4dC54bWwgYW5kIHNlcnZlci54bWxzCisJU3RvcmUgRm9ybWF0IGlzIGNoYW5nZWFibGUgd2l0aCBTdG9yZUFwcGVuZGVycworCUVhc3kgZXh0ZW5kYWJsZSAKKwlDb25uZWN0b3Igc3VwcG9ydAorCQlBSlAKKwkJSFRUUAorCQlIVFRQUworCUNvbnRleHQueG1sIGFuZCBzZXJ2ZXIueG1sIHdpdGggYmFja3VwCQkJCQorCQkgCitFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09PT09CisJCisJPFNlcnZlciAuLi4+CisJICAgICAgPExpc3RlbmVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUNvbmZpZ0xpZmVjeWNsZUxpc3RlbmVyIi8+CisgICAgICAgICAgPFNlcnZpY2UgLi4uCisJCSAgPC9TZXJ2aWNlPgorICAgIDwvU2VydmVyPgorCQorCVVzYWdlcyB3aXRoIEpNWCBBZGFwdG9yIAorCQlPYmplY3ROYW1lIDogQ2F0YWxpbmE6dHlwZT1TdG9yZUNvbmZpZworCQkKKwkJaW1wb3J0YW50IG9wZXJhdGlvbnM6CisJCQlzdG9yZUNvbmZpZwkJCVN0b3JlIGNvbXBsZXRlIHNlcnZlcgorCQkJc3RvcmVTZXJ2ZXIJCQlTdG9yZSBTZXJ2ZXIgd2l0aCBPYmplY3ROYW1lIiAgICAgICAgICAgICAgIAorCQkJICAgcGFyYW1ldGVyIG5hbWU9Im9iamVjdG5hbWUiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJPYmplY3RuYW1lIGZyb20gU2VydmVyIgorICAgICAgICAgICAgICAgICBkZWZhdWx0PSJDYXRhbGluYTp0eXBlPVNlcnZlciIKKwkJCSAgIHBhcmFtZXRlciBuYW1lPSJiYWNrdXAiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJzdG9yZSBDb250ZXh0IHdpdGggYmFja3VwIgorICAgICAgICAgICAgICAgcGFyYW1ldGVyIG5hbWU9ImV4dGVybmFsQWxsb3dlZCIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InN0b3JlIGFsbCBDb250ZXh0IGV4dGVybmFsIHRoYXQgaGF2ZSBhIGNvbmZpZ0ZpbGUiCisgICAgICAgICAgICBzdG9yZUNvbnRleHQgCQlTdG9yZSBDb250ZXh0IGZyb20gT2JqZWN0TmFtZSAKKyAgICAgICAgICAgICAgIHBhcmFtZXRlciBuYW1lPSJvYmplY3RuYW1lIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iT2JqZWN0TmFtZSBmcm9tIENvbnRleHQiCisgICAgICAgICAgICAgICAgIGV4YW1wbGU9IkNhdGFsaW5hOmoyZWVUeXBlPVdlYk1vZHVsZSxuYW1lPS8vbG9jYWxob3N0L21hbmFnZXIsSjJFRUFwcGxpY2F0aW9uPW5vbmUsSjJFRVNlcnZlcj1ub25lCisJCQkgICBwYXJhbWV0ZXIgbmFtZT0iYmFja3VwIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0ic3RvcmUgd2l0aCBCYWNrdXAiCisgICAgICAgICAgICAgICBwYXJhbWV0ZXIgbmFtZT0iZXh0ZXJuYWxBbGxvd2VkIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0ic3RvcmUgYWxsIG9yIHN0b3JlIG9ubHkgaW50ZXJuYWwgc2VydmVyLnhtbCBjb250ZXh0IChjb25maWdGaWxlID09IG51bGwpIgorCQkJCitIYXZlIGZ1bgorUGV0ZXIgUm9zc2JhY2gKKworCisJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvQ2F0YWxpbmFDbHVzdGVyU0YuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0NhdGFsaW5hQ2x1c3RlclNGLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgyNDMyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0NhdGFsaW5hQ2x1c3RlclNGLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNhdGFsaW5hQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlckRlcGxveWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyUmVjZWl2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJTZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcnNoaXBTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZXNzYWdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5TaW1wbGVUY3BDbHVzdGVyOworCisvKioKKyAqIEdlbmVyYXRlIENsdXN0ZXIgRWxlbWVudCB3aXRoIE1lbWJlcnNoaXAsU2VuZGVyLFJlY2VpdmVyLERlcGxveWVyIGFuZAorICogUmVwbGljYXRpb25WYWx2ZQorICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKi8KK3B1YmxpYyBjbGFzcyBDYXRhbGluYUNsdXN0ZXJTRiBleHRlbmRzIFN0b3JlRmFjdG9yeUJhc2UgeworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBDbHVzdGVyIGNoaWxkcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVdyaXRlcgorICAgICAqICAgICAgICAgICAgUHJpbnRXcml0ZXIgdG8gd2hpY2ggd2UgYXJlIHN0b3JpbmcKKyAgICAgKiBAcGFyYW0gaW5kZW50CisgICAgICogICAgICAgICAgICBOdW1iZXIgb2Ygc3BhY2VzIHRvIGluZGVudCB0aGlzIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gYUNsdXN0ZXIKKyAgICAgKiAgICAgICAgICAgIENsdXN0ZXIgd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgc3RvcmVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZUNoaWxkcyhQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LCBPYmplY3QgYUNsdXN0ZXIsCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIHBhcmVudERlc2MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoYUNsdXN0ZXIgaW5zdGFuY2VvZiBDYXRhbGluYUNsdXN0ZXIpIHsKKyAgICAgICAgICAgIENhdGFsaW5hQ2x1c3RlciBjbHVzdGVyID0gKENhdGFsaW5hQ2x1c3RlcikgYUNsdXN0ZXI7CisKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8TWVtYmVyc2hpcD4gZWxlbWVudAorICAgICAgICAgICAgTWVtYmVyc2hpcFNlcnZpY2Ugc2VydmljZSA9IGNsdXN0ZXIuZ2V0TWVtYmVyc2hpcFNlcnZpY2UoKTsKKyAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdG9yZUVsZW1lbnQoYVdyaXRlciwgaW5kZW50LCBzZXJ2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8U2VuZGVyPiBlbGVtZW50CisgICAgICAgICAgICBDbHVzdGVyU2VuZGVyIHNlbmRlciA9IGNsdXN0ZXIuZ2V0Q2x1c3RlclNlbmRlcigpOworICAgICAgICAgICAgaWYgKHNlbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3RvcmVFbGVtZW50KGFXcml0ZXIsIGluZGVudCwgc2VuZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8UmVjZWl2ZXI+IGVsZW1lbnQKKyAgICAgICAgICAgIENsdXN0ZXJSZWNlaXZlciByZWNlaXZlciA9IGNsdXN0ZXIuZ2V0Q2x1c3RlclJlY2VpdmVyKCk7CisgICAgICAgICAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudChhV3JpdGVyLCBpbmRlbnQsIHJlY2VpdmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8RGVwbG95ZXI+IGVsZW1lbnQKKyAgICAgICAgICAgIENsdXN0ZXJEZXBsb3llciBkZXBsb3llciA9IGNsdXN0ZXIuZ2V0Q2x1c3RlckRlcGxveWVyKCk7CisgICAgICAgICAgICBpZiAoZGVwbG95ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudChhV3JpdGVyLCBpbmRlbnQsIGRlcGxveWVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8VmFsdmU+IGVsZW1lbnQKKyAgICAgICAgICAgIC8vIENsdXN0ZXJWYWx2ZSBhcmUgbm90IHN0b3JlIGF0IEhvc3RzIGVsZW1lbnQsIHNlZQorICAgICAgICAgICAgVmFsdmUgdmFsdmVzW10gPSBjbHVzdGVyLmdldFZhbHZlcygpOworICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCB2YWx2ZXMpOworIAorICAgICAgICAgICAgaWYgKGFDbHVzdGVyIGluc3RhbmNlb2YgU2ltcGxlVGNwQ2x1c3RlcikgeworICAgICAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8TGlzdGVuZXI+IGVsZW1lbnRzCisgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXJzW10gPSAoKFNpbXBsZVRjcENsdXN0ZXIpY2x1c3RlcikuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudEFycmF5KGFXcml0ZXIsIGluZGVudCwgbGlzdGVuZXJzKTsKKyAgICAgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPENsdXN0ZXJMaXN0ZW5lcj4gZWxlbWVudHMKKyAgICAgICAgICAgICAgICBNZXNzYWdlTGlzdGVuZXIgbWxpc3RlbmVyc1tdID0gKChTaW1wbGVUY3BDbHVzdGVyKWNsdXN0ZXIpLmZpbmRDbHVzdGVyTGlzdGVuZXJzKCk7CisgICAgICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCBtbGlzdGVuZXJzKTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Db25uZWN0b3JTRi5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvQ29ubmVjdG9yU0YuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQ0MTdiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvQ29ubmVjdG9yU0YuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvcjsKKworLyoqCisgKiBTdG9yZSBDb25uZWN0b3IgYW5kIExpc3RlbmVycworICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKi8KK3B1YmxpYyBjbGFzcyBDb25uZWN0b3JTRiBleHRlbmRzIFN0b3JlRmFjdG9yeUJhc2UgeworCisgICAgLyoqCisgICAgICogU3RvcmUgQ29ubmVjdG9yIGRlc2NyaXB0aW9uCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiBAcGFyYW0gaW5kZW50CisgICAgICogQHBhcmFtIGFDb25uZWN0b3IKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3JlQ2hpbGRzKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBhQ29ubmVjdG9yLAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBwYXJlbnREZXNjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoYUNvbm5lY3RvciBpbnN0YW5jZW9mIENvbm5lY3RvcikgeworICAgICAgICAgICAgQ29ubmVjdG9yIGNvbm5lY3RvciA9IChDb25uZWN0b3IpIGFDb25uZWN0b3I7CisgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPExpc3RlbmVyPiBlbGVtZW50cworICAgICAgICAgICAgaWYgKGNvbm5lY3RvciBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgICAgIExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyc1tdID0gKChMaWZlY3ljbGUpIGNvbm5lY3RvcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisgICAgICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCBsaXN0ZW5lcnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRPcGVuVGFnKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBiZWFuLAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBhRGVzYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFXcml0ZXIucHJpbnQoIjwiKTsKKyAgICAgICAgYVdyaXRlci5wcmludChhRGVzYy5nZXRUYWcoKSk7CisgICAgICAgIHN0b3JlQ29ubmVjdG9yQXR0cmlidHVlcyhhV3JpdGVyLCBpbmRlbnQsIGJlYW4sIGFEZXNjKTsKKyAgICAgICAgYVdyaXRlci5wcmludGxuKCI+Iik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc3RvcmVDb25uZWN0b3JBdHRyaWJ0dWVzKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsCisgICAgICAgICAgICBPYmplY3QgYmVhbiwgU3RvcmVEZXNjcmlwdGlvbiBhRGVzYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhRGVzYy5pc0F0dHJpYnV0ZXMoKSkgeworICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50QXR0cmlidXRlcyhhV3JpdGVyLCBpbmRlbnQsIGZhbHNlLCBiZWFuLAorICAgICAgICAgICAgICAgICAgICBhRGVzYyk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogaWYgKGJlYW4gaW5zdGFuY2VvZiBDb25uZWN0b3IpIHsgU3RvcmVEZXNjcmlwdGlvbiBlbGVtZW50RGVzYyA9CisgICAgICAgICAgICAgKiBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbiggYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSArCisgICAgICAgICAgICAgKiAiLltQcm90b2NvbEhhbmRsZXJdIik7IGlmIChlbGVtZW50RGVzYyAhPSBudWxsKSB7IFByb3RvY29sSGFuZGxlcgorICAgICAgICAgICAgICogcHJvdG9jb2xIYW5kbGVyID0gKChDb25uZWN0b3IpIGJlYW4pIC5nZXRQcm90b2NvbEhhbmRsZXIoKTsgaWYKKyAgICAgICAgICAgICAqIChwcm90b2NvbEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAqIGdldFN0b3JlQXBwZW5kZXIoKS5wcmludEF0dHJpYnV0ZXMoYVdyaXRlciwgaW5kZW50LCBmYWxzZSwKKyAgICAgICAgICAgICAqIHByb3RvY29sSGFuZGxlciwgZWxlbWVudERlc2MpOyB9IH0KKyAgICAgICAgICAgICAqLworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRUYWcoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGJlYW4sCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGFEZXNjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYVdyaXRlci5wcmludCgiPCIpOworICAgICAgICBhV3JpdGVyLnByaW50KGFEZXNjLmdldFRhZygpKTsKKyAgICAgICAgc3RvcmVDb25uZWN0b3JBdHRyaWJ0dWVzKGFXcml0ZXIsIGluZGVudCwgYmVhbiwgYURlc2MpOworICAgICAgICBhV3JpdGVyLnByaW50bG4oIi8+Iik7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvQ29ubmVjdG9yU3RvcmVBcHBlbmRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvQ29ubmVjdG9yU3RvcmVBcHBlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOTg4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Db25uZWN0b3JTdG9yZUFwcGVuZGVyLmphdmEKQEAgLTAsMCArMSwyODMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuYmVhbnMuSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNveW90ZS5Qcm90b2NvbEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5JbnRyb3NwZWN0aW9uVXRpbHM7CisKKy8qKgorICogU3RvcmUgdGhlIENvbm5lY3RvciBhdHRyaWJ1dGVzLiBDb25uZWN0b3IgaGFzIHJlYWxseSBzcGVjaWFsIGRlc2lnbi4gQQorICogQ29ubmVjdG9yIGlzIG9ubHkgYSBzdGFydHVwIFdyYXBwZXIgZm9yIGEgUHJvdG9jb2xIYW5kbGVyLiBUaGlzIG1lYW50IHRoYXQKKyAqIFByb3RvY29sSGFuZGxlciBnZXQgYWxsIHRoZXJlIGF0dHJpYnR1ZXMgZnJvbSB0aGUgQ29ubmVjdG9yIGF0dHJpYnR1ZSBtYXAuCisgKiBTdHJhbmdlIGlzIHRoYXQgc29tZSBhdHRyaWJ1dGVzIGNoYW5nZSB0aGVyZSBuYW1lIGFuZCB0aGUgYXR0cmlidXRlCisgKiBzc2xQcm90b2NvbCBuZWVkIGEgc2VwemlhbCBoYW5kbGluZworICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBDb25uZWN0b3JTdG9yZUFwcGVuZGVyIGV4dGVuZHMgU3RvcmVBcHBlbmRlciB7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIEhhc2hNYXAgcmVwbGFjZW1lbnRzID0gbmV3IEhhc2hNYXAoKTsKKyAgICBzdGF0aWMgeworICAgICAgICByZXBsYWNlbWVudHMucHV0KCJiYWNrbG9nIiwgImFjY2VwdENvdW50Iik7CisgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoInNvTGluZ2VyIiwgImNvbm5lY3Rpb25MaW5nZXIiKTsKKyAgICAgICAgcmVwbGFjZW1lbnRzLnB1dCgic29UaW1lb3V0IiwgImNvbm5lY3Rpb25UaW1lb3V0Iik7CisgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoInRpbWVvdXQiLCAiY29ubmVjdGlvblVwbG9hZFRpbWVvdXQiKTsKKyAgICAgICAgcmVwbGFjZW1lbnRzLnB1dCgiY2xpZW50YXV0aCIsICJjbGllbnRBdXRoIik7CisgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoImtleXN0b3JlIiwgImtleXN0b3JlRmlsZSIpOworICAgICAgICByZXBsYWNlbWVudHMucHV0KCJyYW5kb21maWxlIiwgInJhbmRvbUZpbGUiKTsKKyAgICAgICAgcmVwbGFjZW1lbnRzLnB1dCgicm9vdGZpbGUiLCAicm9vdEZpbGUiKTsKKyAgICAgICAgcmVwbGFjZW1lbnRzLnB1dCgia2V5cGFzcyIsICJrZXlzdG9yZVBhc3MiKTsKKyAgICAgICAgcmVwbGFjZW1lbnRzLnB1dCgia2V5dHlwZSIsICJrZXlzdG9yZVR5cGUiKTsKKyAgICAgICAgcmVwbGFjZW1lbnRzLnB1dCgicHJvdG9jb2wiLCAic3NsUHJvdG9jb2wiKTsKKyAgICAgICAgcmVwbGFjZW1lbnRzLnB1dCgicHJvdG9jb2xzIiwgInNzbFByb3RvY29scyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSByZWxldmFudCBhdHRyaWJ1dGVzIG9mIHRoZSBzcGVjaWZpZWQgSmF2YUJlYW4uCisgICAgICogCisgICAgICogQHBhcmFtIHdyaXRlcgorICAgICAqICAgICAgICAgICAgUHJpbnRXcml0ZXIgdG8gd2hpY2ggd2UgYXJlIHN0b3JpbmcKKyAgICAgKiBAcGFyYW0gaW5jbHVkZQorICAgICAqICAgICAgICAgICAgU2hvdWxkIHdlIGluY2x1ZGUgYSA8Y29kZT5jbGFzc05hbWU8L2NvZGU+IGF0dHJpYnV0ZT8KKyAgICAgKiBAcGFyYW0gYmVhbgorICAgICAqICAgICAgICAgICAgQmVhbiB3aG9zZSBwcm9wZXJ0aWVzIGFyZSB0byBiZSByZW5kZXJlZCBhcyBhdHRyaWJ1dGVzLAorICAgICAqIEBwYXJhbSBkZXNjCisgICAgICogICAgICAgICAgICBSZWdpc3RyeURlc2NycGl0b3IgZnJvbSB0aGlzIGJlYW4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50QXR0cmlidXRlcyhQcmludFdyaXRlciB3cml0ZXIsIGludCBpbmRlbnQsCisgICAgICAgICAgICBib29sZWFuIGluY2x1ZGUsIE9iamVjdCBiZWFuLCBTdG9yZURlc2NyaXB0aW9uIGRlc2MpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBSZW5kZXIgYSBjbGFzc05hbWUgYXR0cmlidXRlIGlmIHJlcXVlc3RlZAorICAgICAgICBpZiAoaW5jbHVkZSAmJiBkZXNjICE9IG51bGwgJiYgIWRlc2MuaXNTdGFuZGFyZCgpKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBjbGFzc05hbWU9XCIiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChiZWFuLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiXCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIExpc3QgcHJvcGVydHlLZXlzID0gZ2V0UHJvcGVydHlLZXlzKChDb25uZWN0b3IpIGJlYW4pOworICAgICAgICAvLyBDcmVhdGUgYmxhbmsgaW5zdGFuY2UKKyAgICAgICAgT2JqZWN0IGJlYW4yID0gZGVmYXVsdEluc3RhbmNlKGJlYW4pOworICAgICAgICBmb3IgKEl0ZXJhdG9yIHByb3BlcnR5SXRlcmF0b3IgPSBwcm9wZXJ0eUtleXMuaXRlcmF0b3IoKTsgcHJvcGVydHlJdGVyYXRvcgorICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgcHJvcGVydHlJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnRzLmdldChrZXkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBrZXkgPSAoU3RyaW5nKSByZXBsYWNlbWVudHMuZ2V0KGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSAoT2JqZWN0KSBJbnRyb3NwZWN0aW9uVXRpbHMuZ2V0UHJvcGVydHkoYmVhbiwga2V5KTsKKworICAgICAgICAgICAgaWYgKGRlc2MuaXNUcmFuc2llbnRBdHRyaWJ1dGUoa2V5KSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9ucworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gTnVsbCB2YWx1ZXMgYXJlIG5vdCBwZXJzaXN0ZWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENvbnZlcnQgSVAgYWRkcmVzc2VzIHRvIHN0cmluZ3Mgc28gdGhleSB3aWxsIGJlIHBlcnNpc3RlZAorICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW5ldEFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICgoSW5ldEFkZHJlc3MpIHZhbHVlKS5nZXRIb3N0QWRkcmVzcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFpc1BlcnNpc3RhYmxlKHZhbHVlLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPYmplY3QgdmFsdWUyID0gSW50cm9zcGVjdGlvblV0aWxzLmdldFByb3BlcnR5KGJlYW4yLCBrZXkpOworICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyh2YWx1ZTIpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHByb3BlcnR5IGhhcyBpdHMgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzUHJpbnRWYWx1ZShiZWFuLCBiZWFuMiwga2V5LCBkZXNjKSkKKyAgICAgICAgICAgICAgICBwcmludFZhbHVlKHdyaXRlciwgaW5kZW50LCBrZXksIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcHJvdG9jb2wgPSAoKENvbm5lY3RvcikgYmVhbikuZ2V0UHJvdG9jb2woKTsKKyAgICAgICAgaWYgKHByb3RvY29sICE9IG51bGwgJiYgISJIVFRQLzEuMSIuZXF1YWxzKHByb3RvY29sKSkKKyAgICAgICAgICAgIHN1cGVyLnByaW50VmFsdWUod3JpdGVyLCBpbmRlbnQsICJwcm90b2NvbCIsIHByb3RvY29sKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbGwgcHJvcGVydGllcyBmcm9tIENvbm5lY3RvciBhbmQgY3VycmVudCBQcm90b2NvbEhhbmRsZXIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYmVhbgorICAgICAqIEByZXR1cm4gTGlzdCBvZiBDb25uZWN0b3IgUHJvcGVydGllcworICAgICAqIEB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBMaXN0IGdldFByb3BlcnR5S2V5cyhDb25uZWN0b3IgYmVhbikKKyAgICAgICAgICAgIHRocm93cyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQXJyYXlMaXN0IHByb3BlcnR5S2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzIGZvciB0aGlzIGJlYW4KKyAgICAgICAgUHJvdG9jb2xIYW5kbGVyIHByb3RvY29sSGFuZGxlciA9IGJlYW4uZ2V0UHJvdG9jb2xIYW5kbGVyKCk7CisgICAgICAgIC8vIEFjcXVpcmUgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBmb3IgdGhpcyBiZWFuCisgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yc1tdID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKAorICAgICAgICAgICAgICAgIGJlYW4uZ2V0Q2xhc3MoKSkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOworICAgICAgICBpZiAoZGVzY3JpcHRvcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgZGVzY3JpcHRvcnMgPSBuZXcgUHJvcGVydHlEZXNjcmlwdG9yWzBdOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yc1tpXSBpbnN0YW5jZW9mIEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gSW5kZXhlZCBwcm9wZXJ0aWVzIGFyZSBub3QgcGVyc2lzdGVkCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWlzUGVyc2lzdGFibGUoZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgIHx8IChkZXNjcmlwdG9yc1tpXS5nZXRSZWFkTWV0aG9kKCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKGRlc2NyaXB0b3JzW2ldLmdldFdyaXRlTWV0aG9kKCkgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gTXVzdCBiZSBhIHJlYWQtd3JpdGUgcHJpbWl0aXZlIG9yIFN0cmluZworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCJwcm90b2NvbCIuZXF1YWxzKGRlc2NyaXB0b3JzW2ldLmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgInByb3RvY29sSGFuZGxlckNsYXNzTmFtZSIuZXF1YWxzKGRlc2NyaXB0b3JzW2ldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBwcm9wZXJ0eUtleXMuYWRkKGRlc2NyaXB0b3JzW2ldLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChJdGVyYXRvciBwcm9wZXJ0eUl0ZXJhdG9yID0gcHJvdG9jb2xIYW5kbGVyLmdldEF0dHJpYnV0ZU5hbWVzKCk7IHByb3BlcnR5SXRlcmF0b3IKKyAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT2JqZWN0IGtleSA9IHByb3BlcnR5SXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgaWYgKHByb3BlcnR5S2V5cy5jb250YWlucyhrZXkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcHJvcGVydHlLZXlzLmFkZChrZXkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm9wZXJ0eUtleXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogcHJpbnQgQXR0cmlidXRlcworICAgICAqIAorICAgICAqIEBwYXJhbSBhV3JpdGVyCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqIEBwYXJhbSBiZWFuCisgICAgICogQHBhcmFtIGFEZXNjCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzdG9yZUNvbm5lY3RvckF0dHJpYnR1ZXMoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwKKyAgICAgICAgICAgIE9iamVjdCBiZWFuLCBTdG9yZURlc2NyaXB0aW9uIGFEZXNjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGFEZXNjLmlzQXR0cmlidXRlcygpKSB7CisgICAgICAgICAgICBwcmludEF0dHJpYnV0ZXMoYVdyaXRlciwgaW5kZW50LCBmYWxzZSwgYmVhbiwgYURlc2MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQcmludCB0aGUgb3BlbiB0YWcgZm9yIGNvbm5lY3RvciBhdHRyaWJ1dGVzIChvdmVycmlkZSkKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVBcHBlbmRlciNwcmludE9wZW5UYWcoamF2YS5pby5QcmludFdyaXRlciwKKyAgICAgKiAgICAgIGludCwgamF2YS5sYW5nLk9iamVjdCwKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVEZXNjcmlwdGlvbikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludE9wZW5UYWcoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGJlYW4sCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGFEZXNjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYVdyaXRlci5wcmludCgiPCIpOworICAgICAgICBhV3JpdGVyLnByaW50KGFEZXNjLmdldFRhZygpKTsKKyAgICAgICAgc3RvcmVDb25uZWN0b3JBdHRyaWJ0dWVzKGFXcml0ZXIsIGluZGVudCwgYmVhbiwgYURlc2MpOworICAgICAgICBhV3JpdGVyLnByaW50bG4oIj4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwcmludCBhIHRhZyBmb3IgY29ubmVjdG9yIGF0dHJpYnV0ZXMgKG92ZXJyaWRlKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUFwcGVuZGVyI3ByaW50VGFnKGphdmEuaW8uUHJpbnRXcml0ZXIsCisgICAgICogICAgICBpbnQsIGphdmEubGFuZy5PYmplY3QsCisgICAgICogICAgICBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRGVzY3JpcHRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRUYWcoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGJlYW4sCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGFEZXNjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYVdyaXRlci5wcmludCgiPCIpOworICAgICAgICBhV3JpdGVyLnByaW50KGFEZXNjLmdldFRhZygpKTsKKyAgICAgICAgc3RvcmVDb25uZWN0b3JBdHRyaWJ0dWVzKGFXcml0ZXIsIGluZGVudCwgYmVhbiwgYURlc2MpOworICAgICAgICBhV3JpdGVyLnByaW50bG4oIi8+Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogcHJpbnQgYSB2YWx1ZSBidXQgcmVwbGFjZSBhdHRyaWJ1dGUgbmFtZQorICAgICAqIAorICAgICAqIEBwYXJhbSB3cml0ZXIKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUFwcGVuZGVyI3ByaW50VmFsdWUoamF2YS5pby5QcmludFdyaXRlciwKKyAgICAgKiAgICAgIGludCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludFZhbHVlKFByaW50V3JpdGVyIHdyaXRlciwgaW50IGluZGVudCwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgU3RyaW5nIHJlcGwgPSBuYW1lOworICAgICAgICBpZiAocmVwbGFjZW1lbnRzLmdldChuYW1lKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXBsID0gKFN0cmluZykgcmVwbGFjZW1lbnRzLmdldChuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5wcmludFZhbHVlKHdyaXRlciwgaW5kZW50LCByZXBsLCB2YWx1ZSk7CisgICAgfQorICAgIAorICAgIC8qCisgICAgICogUHJpbnQgQ29ubmVjdG9yIFZhbHVlcy4gPHVsPjxsaT4gU3BlemlhbCBoYW5kbGluZyB0byBkZWZhdWx0IGprSG9tZS4KKyAgICAgKiA8L2xpPjxsaT4gRG9uJ3Qgc2F2ZSBjYXRhbGluYS5iYXNlIHBhdGggYXQgc2VydmVyLnhtbDwvbGk+PGxpPjwvdWw+CisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5TdG9yZUFwcGVuZGVyI2lzUHJpbnRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LAorICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywKKyAgICAgKiAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29uZmlnLlN0b3JlRGVzY3JpcHRpb24pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmludFZhbHVlKE9iamVjdCBiZWFuLCBPYmplY3QgYmVhbjIsIFN0cmluZyBhdHRyTmFtZSwKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYykgeworICAgICAgICBib29sZWFuIGlzUHJpbnQgPSBzdXBlci5pc1ByaW50VmFsdWUoYmVhbiwgYmVhbjIsIGF0dHJOYW1lLCBkZXNjKTsKKyAgICAgICAgaWYgKGlzUHJpbnQpIHsKKyAgICAgICAgICAgIGlmICgiamtIb21lIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgQ29ubmVjdG9yIGNvbm5lY3RvciA9ICgoQ29ubmVjdG9yKSBiZWFuKTsKKyAgICAgICAgICAgICAgICBGaWxlIGNhdGFsaW5hQmFzZSA9IGdldENhdGFsaW5hQmFzZSgpOworICAgICAgICAgICAgICAgIEZpbGUgamtIb21lQmFzZSA9IGdldEprSG9tZUJhc2UoKFN0cmluZykgY29ubmVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoImprSG9tZSIpLCBjYXRhbGluYUJhc2UpOworICAgICAgICAgICAgICAgIGlzUHJpbnQgPSAhY2F0YWxpbmFCYXNlLmVxdWFscyhqa0hvbWVCYXNlKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpc1ByaW50OworICAgIH0KKworICAgIHByb3RlY3RlZCBGaWxlIGdldENhdGFsaW5hQmFzZSgpIHsKKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaWxlID0gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGZpbGUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBGaWxlIGdldEprSG9tZUJhc2UoU3RyaW5nIGprSG9tZSwgRmlsZSBhcHBCYXNlKSB7CisKKyAgICAgICAgRmlsZSBqa0hvbWVCYXNlOworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShqa0hvbWUpOworICAgICAgICBpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKQorICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGFwcEJhc2UsIGprSG9tZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqa0hvbWVCYXNlID0gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGprSG9tZUJhc2UgPSBmaWxlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoamtIb21lQmFzZSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvQ29uc3RhbnRzLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGNkYjk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBDb25zdGFudHMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnIjsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0dsb2JhbE5hbWluZ1Jlc291cmNlc1NGLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9HbG9iYWxOYW1pbmdSZXNvdXJjZXNTRi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOTZkMmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9HbG9iYWxOYW1pbmdSZXNvdXJjZXNTRi5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk5hbWluZ1Jlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLyoqCisgKiBzdG9yZSBzZXJ2ZXIueG1sIEdsb2JhbE5hbWluZ1Jlc291cmNlLgorICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoIAorICogIAorICovCitwdWJsaWMgY2xhc3MgR2xvYmFsTmFtaW5nUmVzb3VyY2VzU0YgZXh0ZW5kcyBTdG9yZUZhY3RvcnlCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coR2xvYmFsTmFtaW5nUmVzb3VyY2VzU0YuY2xhc3MpOworCisgICAgLyoKKyAgICAgKiBTdG9yZSB3aXRoIE5hbWluZ1Jlc291cmNlIEZhY3RvcnkKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSVN0b3JlRmFjdG9yeSNzdG9yZShqYXZhLmlvLlByaW50V3JpdGVyLAorICAgICAqICAgICAgaW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBhRWxlbWVudCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChhRWxlbWVudCBpbnN0YW5jZW9mIE5hbWluZ1Jlc291cmNlcykgeworCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGVsZW1lbnREZXNjID0gZ2V0UmVnaXN0cnkoKS5maW5kRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgIE5hbWluZ1Jlc291cmNlcy5jbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuW0dsb2JhbE5hbWluZ1Jlc291cmNlc10iKTsKKworICAgICAgICAgICAgaWYgKGVsZW1lbnREZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBnZXRTdG9yZUFwcGVuZGVyKCkucHJpbnRJbmRlbnQoYVdyaXRlciwgaW5kZW50ICsgMik7CisgICAgICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50T3BlblRhZyhhV3JpdGVyLCBpbmRlbnQgKyAyLCBhRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnREZXNjKTsKKyAgICAgICAgICAgICAgICBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gKE5hbWluZ1Jlc291cmNlcykgYUVsZW1lbnQ7CisgICAgICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiByZXNvdXJjZXNkZXNjID0gZ2V0UmVnaXN0cnkoKS5maW5kRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBOYW1pbmdSZXNvdXJjZXMuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzZGVzYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlc2Rlc2MuZ2V0U3RvcmVGYWN0b3J5KCkuc3RvcmUoYVdyaXRlciwgaW5kZW50ICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiQ2FuJ3QgZmluZCBOYW1pbmdSc291cmNlcyBTdG9yZSBGYWN0b3J5ISIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50SW5kZW50KGFXcml0ZXIsIGluZGVudCArIDIpOworICAgICAgICAgICAgICAgIGdldFN0b3JlQXBwZW5kZXIoKS5wcmludENsb3NlVGFnKGFXcml0ZXIsIGVsZW1lbnREZXNjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJEZXNjcmlwdG9yIGZvciBlbGVtZW50IiArIGFFbGVtZW50LmdldENsYXNzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbm90IGNvbmZpZ3VyZWQhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cud2Fybigid3JvbmcgZWxlbWVudCAiICsgYUVsZW1lbnQuZ2V0Q2xhc3MoKSk7CisKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvSUR5bmFtaWNQcm9wZXJ0eVN0b3JlQXBwZW5kZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0lEeW5hbWljUHJvcGVydHlTdG9yZUFwcGVuZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0OGQ5MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0lEeW5hbWljUHJvcGVydHlTdG9yZUFwcGVuZGVyLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuYmVhbnMuSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci51dGlsLklEeW5hbWljUHJvcGVydHk7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5JbnRyb3NwZWN0aW9uVXRpbHM7CisKKy8qKgorICogU3RvcmUgdGhlIElEeW5hbWljUHJvcGVydHkgYXR0cmlidXRlcy4gCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqICAKKyAqLworcHVibGljIGNsYXNzIElEeW5hbWljUHJvcGVydHlTdG9yZUFwcGVuZGVyIGV4dGVuZHMgU3RvcmVBcHBlbmRlciB7CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgcmVsZXZhbnQgYXR0cmlidXRlcyBvZiB0aGUgc3BlY2lmaWVkIEphdmFCZWFuLgorICAgICAqIAorICAgICAqIEBwYXJhbSB3cml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluY2x1ZGUKKyAgICAgKiAgICAgICAgICAgIFNob3VsZCB3ZSBpbmNsdWRlIGEgPGNvZGU+Y2xhc3NOYW1lPC9jb2RlPiBhdHRyaWJ1dGU/CisgICAgICogQHBhcmFtIGJlYW4KKyAgICAgKiAgICAgICAgICAgIEJlYW4gd2hvc2UgcHJvcGVydGllcyBhcmUgdG8gYmUgcmVuZGVyZWQgYXMgYXR0cmlidXRlcywKKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgUmVnaXN0cnlEZXNjcnBpdG9yIGZyb20gdGhpcyBiZWFuCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludEF0dHJpYnV0ZXMoUHJpbnRXcml0ZXIgd3JpdGVyLCBpbnQgaW5kZW50LAorICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlLCBPYmplY3QgYmVhbiwgU3RvcmVEZXNjcmlwdGlvbiBkZXNjKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUmVuZGVyIGEgY2xhc3NOYW1lIGF0dHJpYnV0ZSBpZiByZXF1ZXN0ZWQKKyAgICAgICAgaWYgKGluY2x1ZGUgJiYgZGVzYyAhPSBudWxsICYmICFkZXNjLmlzU3RhbmRhcmQoKSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgY2xhc3NOYW1lPVwiIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIlwiIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmVhbiBpbnN0YW5jZW9mIElEeW5hbWljUHJvcGVydHkpIHsKKyAgICAgICAgICAgIExpc3QgcHJvcGVydHlLZXlzID0gZ2V0UHJvcGVydHlLZXlzKChJRHluYW1pY1Byb3BlcnR5KSBiZWFuKTsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBibGFuayBpbnN0YW5jZQorICAgICAgICAgICAgT2JqZWN0IGJlYW4yID0gZGVmYXVsdEluc3RhbmNlKGJlYW4pOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBwcm9wZXJ0eUl0ZXJhdG9yID0gcHJvcGVydHlLZXlzLml0ZXJhdG9yKCk7IHByb3BlcnR5SXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgcHJvcGVydHlJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gKE9iamVjdCkgSW50cm9zcGVjdGlvblV0aWxzLmdldFByb3BlcnR5KGJlYW4sCisgICAgICAgICAgICAgICAgICAgICAgICBrZXkpOworCisgICAgICAgICAgICAgICAgaWYgKGRlc2MuaXNUcmFuc2llbnRBdHRyaWJ1dGUoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbnMKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIE51bGwgdmFsdWVzIGFyZSBub3QgcGVyc2lzdGVkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghaXNQZXJzaXN0YWJsZSh2YWx1ZS5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlMiA9IEludHJvc3BlY3Rpb25VdGlscy5nZXRQcm9wZXJ0eShiZWFuMiwga2V5KTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKHZhbHVlMikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHByb3BlcnR5IGhhcyBpdHMgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlzUHJpbnRWYWx1ZShiZWFuLCBiZWFuMiwga2V5LCBkZXNjKSkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRWYWx1ZSh3cml0ZXIsIGluZGVudCwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIHByb3BlcnRpZXMgZnJvbSBSZXBsaWNhdGlvblRyYW5zbWl0dGVyIChhbHNvIGR5bmFtaWMgcHJvcGVydGllcykKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYmVhbgorICAgICAqIEByZXR1cm4gTGlzdCBvZiBDb25uZWN0b3IgUHJvcGVydGllcworICAgICAqIEB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBMaXN0IGdldFByb3BlcnR5S2V5cyhJRHluYW1pY1Byb3BlcnR5IGJlYW4pCisgICAgICAgICAgICB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIC8vIEFjcXVpcmUgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBmb3IgdGhpcyBiZWFuCisgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yc1tdID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKAorICAgICAgICAgICAgICAgIGJlYW4uZ2V0Q2xhc3MoKSkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOworICAgICAgICBpZiAoZGVzY3JpcHRvcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgZGVzY3JpcHRvcnMgPSBuZXcgUHJvcGVydHlEZXNjcmlwdG9yWzBdOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yc1tpXSBpbnN0YW5jZW9mIEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gSW5kZXhlZCBwcm9wZXJ0aWVzIGFyZSBub3QgcGVyc2lzdGVkCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWlzUGVyc2lzdGFibGUoZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgIHx8IChkZXNjcmlwdG9yc1tpXS5nZXRSZWFkTWV0aG9kKCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKGRlc2NyaXB0b3JzW2ldLmdldFdyaXRlTWV0aG9kKCkgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gTXVzdCBiZSBhIHJlYWQtd3JpdGUgcHJpbWl0aXZlIG9yIFN0cmluZworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvcGVydHlLZXlzLmFkZChkZXNjcmlwdG9yc1tpXS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoSXRlcmF0b3IgcHJvcGVydHlJdGVyYXRvciA9IGJlYW4uZ2V0UHJvcGVydHlOYW1lcygpOyBwcm9wZXJ0eUl0ZXJhdG9yCisgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBrZXkgPSBwcm9wZXJ0eUl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eUtleXMuY29udGFpbnMoa2V5KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICgiY2xhc3NOYW1lIi5lcXVhbHMoa2V5KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHByb3BlcnR5S2V5cy5hZGQoa2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvcGVydHlLZXlzOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0lTdG9yZUNvbmZpZy5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvSVN0b3JlQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzZGM3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0lTdG9yZUNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2aWNlOworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2ggCisgKiAgCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVN0b3JlQ29uZmlnIHsKKworICAgIC8qKgorICAgICAqIEdldCBDb25maWd1cmF0aW9uIFJlZ2lzdHJ5CisgICAgICogCisgICAgICogQHJldHVybiBhUmVnaXN0cnkgdGhhdCBoYW5kbGUgdGhlIHN0b3JlIG9wZXJhdGlvbnMKKyAgICAgKi8KKyAgICBTdG9yZVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgQ29uZmlndXJhdGlvbiBSZWdpc3RyeQorICAgICAqIAorICAgICAqIEBwYXJhbSBhUmVnaXN0cnkKKyAgICAgKiAgICAgICAgICAgIGFyZWdpc3RyeSB0aGF0IGhhbmRsZSB0aGUgc3RvcmUgb3BlcmF0aW9ucworICAgICAqLworICAgIHZvaWQgc2V0UmVnaXN0cnkoU3RvcmVSZWdpc3RyeSBhUmVnaXN0cnkpOworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIGN1cnJlbnQgU3RvcmVGYWN0b3J5IFNlcnZlci4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqLworICAgIHZvaWQgc3RvcmVDb25maWcoKSB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBTZXJ2ZXIgcHJvcGVydGllcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVNlcnZlcgorICAgICAqICAgICAgICAgICAgT2JqZWN0IHRvIGJlIHN0b3JlZAorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzdG9yaW5nCisgICAgICovCisgICAgdm9pZCBzdG9yZShTZXJ2ZXIgYVNlcnZlcikgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzcGVjaWZpZWQgU2VydmVyIHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIGFTZXJ2ZXIKKyAgICAgKiAgICAgICAgICAgIE9iamVjdCB0byBiZSBzdG9yZWQKKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqLworICAgIHZvaWQgc3RvcmUoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgU2VydmVyIGFTZXJ2ZXIpOworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBTZXJ2aWNlIHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIGFTZXJ2aWNlCisgICAgICogICAgICAgICAgICBPYmplY3QgdG8gYmUgc3RvcmVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIFNlcnZpY2UgYVNlcnZpY2UpOworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBIb3N0IHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIGFIb3N0CisgICAgICogICAgICAgICAgICBPYmplY3QgdG8gYmUgc3RvcmVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIEhvc3QgYUhvc3QpOworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBDb250ZXh0IHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFDb250ZXh0CisgICAgICogICAgICAgICAgICBPYmplY3QgdG8gYmUgc3RvcmVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICB2b2lkIHN0b3JlKENvbnRleHQgYUNvbnRleHQpOworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBDb250ZXh0IHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIGFDb250ZXh0CisgICAgICogICAgICAgICAgICBPYmplY3QgdG8gYmUgc3RvcmVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIENvbnRleHQgYUNvbnRleHQpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0lTdG9yZUZhY3RvcnkuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0lTdG9yZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWZlZmMwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvSVN0b3JlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoIAorICogIAorICovCitwdWJsaWMgaW50ZXJmYWNlIElTdG9yZUZhY3RvcnkgeworICAgIFN0b3JlQXBwZW5kZXIgZ2V0U3RvcmVBcHBlbmRlcigpOworCisgICAgdm9pZCBzZXRTdG9yZUFwcGVuZGVyKFN0b3JlQXBwZW5kZXIgc3RvcmVXcml0ZXIpOworCisgICAgdm9pZCBzZXRSZWdpc3RyeShTdG9yZVJlZ2lzdHJ5IGFSZWdpc3RyeSk7CisKKyAgICBTdG9yZVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCk7CisKKyAgICB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBhRWxlbWVudCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb247CisKKyAgICB2b2lkIHN0b3JlWE1MSGVhZChQcmludFdyaXRlciBhV3JpdGVyKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9JbnN0YW5jZUxpc3RlbmVyU0YuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0luc3RhbmNlTGlzdGVuZXJTRi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NDAxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9JbnN0YW5jZUxpc3RlbmVyU0YuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKy8qKgorICogU3RvcmUgQ29udGV4dCBJbnN0YW5jZUxpc3RlbmVyCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2ggCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBJbnN0YW5jZUxpc3RlbmVyU0YgZXh0ZW5kcyBTdG9yZUZhY3RvcnlCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSW5zdGFuY2VMaXN0ZW5lclNGLmNsYXNzKTsKKworICAgIC8qCisgICAgICogU3RvcmUgbmVzdGVkIEVsZW1lbnQgVmFsdWUgQXJyYXlzCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5JU3RvcmVGYWN0b3J5I3N0b3JlKGphdmEuaW8uUHJpbnRXcml0ZXIsCisgICAgICogICAgICBpbnQsIGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmUoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFFbGVtZW50KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhRWxlbWVudCBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCkgeworICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBlbGVtZW50RGVzYyA9IGdldFJlZ2lzdHJ5KCkuZmluZERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBhRWxlbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIuW0luc3RhbmNlTGlzdGVuZXJdIik7CisgICAgICAgICAgICBTdHJpbmdbXSBsaXN0ZW5lcnMgPSAoKFN0YW5kYXJkQ29udGV4dCkgYUVsZW1lbnQpCisgICAgICAgICAgICAgICAgICAgIC5maW5kSW5zdGFuY2VMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50RGVzYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInN0b3JlICIgKyBlbGVtZW50RGVzYy5nZXRUYWcoKSArICIoICIgKyBhRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiApIik7CisgICAgICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50VGFnQXJyYXkoYVdyaXRlciwgIkluc3RhbmNlTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50LCBsaXN0ZW5lcnMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLndhcm4oIkRlc2NyaXB0b3IgZm9yIGVsZW1lbnQiICsgYUVsZW1lbnQuZ2V0Q2xhc3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLltJbnN0YW5jZUxpc3RlbmVyXSBub3QgY29uZmlndXJlZCEiKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Mb2FkZXJTRi5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTG9hZGVyU0YuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjkwNDUxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTG9hZGVyU0YuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcExvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLyoqCisgKiBTdG9yZSBMb2FkZXIgRWxlbWVudC4KKyAqIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICovCitwdWJsaWMgY2xhc3MgTG9hZGVyU0YgZXh0ZW5kcyBTdG9yZUZhY3RvcnlCYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhMb2FkZXJTRi5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgb25seSB0aGUgTG9hZGVyIGVsZW1lbnRzLCB3aGVuIG5vdCBkZWZhdWx0CisgICAgICogCisgICAgICogQHNlZSBOYW1pbmdSZXNvdXJjZXNTRiNzdG9yZUNoaWxkcyhQcmludFdyaXRlciwgaW50LCBPYmplY3QsIFN0b3JlRGVzY3JpcHRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmUoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFFbGVtZW50KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZWxlbWVudERlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICBhRWxlbWVudC5nZXRDbGFzcygpKTsKKyAgICAgICAgaWYgKGVsZW1lbnREZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvYWRlciBsb2FkZXIgPSAoTG9hZGVyKSBhRWxlbWVudDsKKyAgICAgICAgICAgIGlmICghaXNEZWZhdWx0TG9hZGVyKGxvYWRlcikpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zygic3RvcmUgIiArIGVsZW1lbnREZXNjLmdldFRhZygpICsgIiggIiArIGFFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICkiKTsKKyAgICAgICAgICAgICAgICBnZXRTdG9yZUFwcGVuZGVyKCkucHJpbnRJbmRlbnQoYVdyaXRlciwgaW5kZW50ICsgMik7CisgICAgICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50VGFnKGFXcml0ZXIsIGluZGVudCArIDIsIGxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnREZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nCisgICAgICAgICAgICAgICAgICAgICAgICAud2FybigiRGVzY3JpcHRvciBmb3IgZWxlbWVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhRWxlbWVudC5nZXRDbGFzcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3QgY29uZmlndXJlZCBvciBlbGVtZW50IGNsYXNzIG5vdCBTdGFuZGFyZE1hbmFnZXIhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IDxjb2RlPkxvYWRlcjwvY29kZT4gY29uZmlndXJhdGlvbiwKKyAgICAgKiB3aXRoIGFsbC1kZWZhdWx0IHByb3BlcnRpZXM/CisgICAgICogCisgICAgICogQHBhcmFtIGxvYWRlcgorICAgICAqICAgICAgICAgICAgTG9hZGVyIHRvIGJlIHRlc3RlZAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdExvYWRlcihMb2FkZXIgbG9hZGVyKSB7CisKKyAgICAgICAgaWYgKCEobG9hZGVyIGluc3RhbmNlb2YgV2ViYXBwTG9hZGVyKSkgeworICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgV2ViYXBwTG9hZGVyIHdsb2FkZXIgPSAoV2ViYXBwTG9hZGVyKSBsb2FkZXI7CisgICAgICAgIGlmICgod2xvYWRlci5nZXREZWxlZ2F0ZSgpICE9IGZhbHNlKQorICAgICAgICAgICAgICAgIHx8ICF3bG9hZGVyLmdldExvYWRlckNsYXNzKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcENsYXNzTG9hZGVyIikpIHsKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTNkNGZiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyIEBACitmYWN0b3J5LnN0b3JlVGFnPXN0b3JlIHRhZyB7MH0gKCBPYmplY3Q6IHsxfSApCitmYWN0b3J5LnN0b3JlTm9EZXNjcmlwdG9yPURlc2NyaXB0b3IgZm9yIGVsZW1lbnQgY2xhc3MgezB9IG5vdCBjb25maWd1cmVkIQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTWFuYWdlclNGLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9NYW5hZ2VyU0YuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDI2ZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTWFuYWdlclNGLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uU3RhbmRhcmRNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisvKioKKyAqIFN0b3JlIHNlcnZlci54bWwgTWFuYWdlciBlbGVtZW50CisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqLworcHVibGljIGNsYXNzIE1hbmFnZXJTRiBleHRlbmRzIFN0b3JlRmFjdG9yeUJhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1hbmFnZXJTRi5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgb25seSB0aGUgTWFuYWdlciBlbGVtZW50cworICAgICAqIAorICAgICAqIEBzZWUgTmFtaW5nUmVzb3VyY2VzU0Yjc3RvcmVDaGlsZHMoUHJpbnRXcml0ZXIsIGludCwgT2JqZWN0LCBTdG9yZURlc2NyaXB0aW9uKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3JlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBhRWxlbWVudCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGVsZW1lbnREZXNjID0gZ2V0UmVnaXN0cnkoKS5maW5kRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgYUVsZW1lbnQuZ2V0Q2xhc3MoKSk7CisgICAgICAgIGlmIChlbGVtZW50RGVzYyAhPSBudWxsICYmIGFFbGVtZW50IGluc3RhbmNlb2YgU3RhbmRhcmRNYW5hZ2VyKSB7CisgICAgICAgICAgICBTdGFuZGFyZE1hbmFnZXIgbWFuYWdlciA9IChTdGFuZGFyZE1hbmFnZXIpIGFFbGVtZW50OworICAgICAgICAgICAgaWYgKCFpc0RlZmF1bHRNYW5hZ2VyKG1hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJmYWN0b3J5LnN0b3JlVGFnIiwgZWxlbWVudERlc2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VGFnKCksIGFFbGVtZW50KSk7CisgICAgICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50SW5kZW50KGFXcml0ZXIsIGluZGVudCArIDIpOworICAgICAgICAgICAgICAgIGdldFN0b3JlQXBwZW5kZXIoKS5wcmludFRhZyhhV3JpdGVyLCBpbmRlbnQgKyAyLCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudERlc2MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nKCJmYWN0b3J5LnN0b3JlTm9EZXNjcmlwdG9yIiwgYUVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzcygpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IDxjb2RlPk1hbmFnZXI8L2NvZGU+IGNvbmZpZ3VyYXRpb24sCisgICAgICogd2l0aCBhbGwtZGVmYXVsdCBwcm9wZXJ0aWVzPworICAgICAqIAorICAgICAqIEBwYXJhbSBzbWFuYWdlcgorICAgICAqICAgICAgICAgICAgTWFuYWdlciB0byBiZSB0ZXN0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRNYW5hZ2VyKFN0YW5kYXJkTWFuYWdlciBzbWFuYWdlcikgeworCisgICAgICAgIGlmICghIlNFU1NJT05TLnNlciIuZXF1YWxzKHNtYW5hZ2VyLmdldFBhdGhuYW1lKCkpCisgICAgICAgICAgICAgICAgfHwgISJqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSIuZXF1YWxzKHNtYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmFuZG9tQ2xhc3MoKSkKKyAgICAgICAgICAgICAgICB8fCAoc21hbmFnZXIuZ2V0TWF4QWN0aXZlU2Vzc2lvbnMoKSAhPSAtMSkKKyAgICAgICAgICAgICAgICB8fCAhIk1ENSIuZXF1YWxzKHNtYW5hZ2VyLmdldEFsZ29yaXRobSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh0cnVlKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTmFtaW5nUmVzb3VyY2VzU0YuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL05hbWluZ1Jlc291cmNlc1NGLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3MTAwZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL05hbWluZ1Jlc291cmNlc1NGLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFamI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVudmlyb25tZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRMb2NhbEVqYjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlRW52UmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUxpbms7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisvKioKKyAqIFN0b3JlIHNlcnZlci54bWwgZWxlbWVudHMgUmVzb3VyY2VzIGF0IGNvbnRleHQgYW5kIEdsb2JhbE5hbWluZ1Jlc291cmNlcworICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBOYW1pbmdSZXNvdXJjZXNTRiBleHRlbmRzIFN0b3JlRmFjdG9yeUJhc2UgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhOYW1pbmdSZXNvdXJjZXNTRi5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgb25seSB0aGUgTmFtaW5nUmVzb3VyY2VzIGVsZW1lbnRzCisgICAgICogCisgICAgICogQHNlZSBOYW1pbmdSZXNvdXJjZXNTRiNzdG9yZUNoaWxkcyhQcmludFdyaXRlciwgaW50LCBPYmplY3QsIFN0b3JlRGVzY3JpcHRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmUoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFFbGVtZW50KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZWxlbWVudERlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICBhRWxlbWVudC5nZXRDbGFzcygpKTsKKyAgICAgICAgaWYgKGVsZW1lbnREZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoInN0b3JlICIgKyBlbGVtZW50RGVzYy5nZXRUYWcoKSArICIoICIgKyBhRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICkiKTsKKyAgICAgICAgICAgIHN0b3JlQ2hpbGRzKGFXcml0ZXIsIGluZGVudCwgYUVsZW1lbnQsIGVsZW1lbnREZXNjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy53YXJuKCJEZXNjcmlwdG9yIGZvciBlbGVtZW50IiArIGFFbGVtZW50LmdldENsYXNzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3QgY29uZmlndXJlZCEiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzcGVjaWZpZWQgTmFtaW5nUmVzb3VyY2VzIHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIGFFbGVtZW50CisgICAgICogICAgICAgICAgICBPYmplY3Qgd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgc3RvcmVkCisgICAgICogQHBhcmFtIGVsZW1lbnREZXNjCisgICAgICogICAgICAgICAgICBlbGVtZW50IGRlc2NyaXB0b3IKKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlI3N0b3JlQ2hpbGRzKGphdmEuaW8uUHJpbnRXcml0ZXIsCisgICAgICogICAgICBpbnQsIGphdmEubGFuZy5PYmplY3QsIFN0b3JlRGVzY3JpcHRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmVDaGlsZHMoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFFbGVtZW50LAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBlbGVtZW50RGVzYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGFFbGVtZW50IGluc3RhbmNlb2YgTmFtaW5nUmVzb3VyY2VzKSB7CisgICAgICAgICAgICBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gKE5hbWluZ1Jlc291cmNlcykgYUVsZW1lbnQ7CisgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPEVqYj4gZWxlbWVudHMKKyAgICAgICAgICAgIENvbnRleHRFamJbXSBlamJzID0gcmVzb3VyY2VzLmZpbmRFamJzKCk7CisgICAgICAgICAgICBzdG9yZUVsZW1lbnRBcnJheShhV3JpdGVyLCBpbmRlbnQsIGVqYnMpOworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxFbnZpcm9ubWVudD4gZWxlbWVudHMKKyAgICAgICAgICAgIENvbnRleHRFbnZpcm9ubWVudFtdIGVudnMgPSByZXNvdXJjZXMuZmluZEVudmlyb25tZW50cygpOworICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCBlbnZzKTsKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8TG9jYWxFamI+IGVsZW1lbnRzCisgICAgICAgICAgICBDb250ZXh0TG9jYWxFamJbXSBsZWpicyA9IHJlc291cmNlcy5maW5kTG9jYWxFamJzKCk7CisgICAgICAgICAgICBzdG9yZUVsZW1lbnRBcnJheShhV3JpdGVyLCBpbmRlbnQsIGxlamJzKTsKKworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxSZXNvdXJjZT4gZWxlbWVudHMKKyAgICAgICAgICAgIENvbnRleHRSZXNvdXJjZVtdIGRyZXNvdXJjZXMgPSByZXNvdXJjZXMuZmluZFJlc291cmNlcygpOworICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCBkcmVzb3VyY2VzKTsKKworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxSZXNvdXJjZUVudlJlZj4gZWxlbWVudHMKKyAgICAgICAgICAgIENvbnRleHRSZXNvdXJjZUVudlJlZltdIHJlc0VudiA9IHJlc291cmNlcy5maW5kUmVzb3VyY2VFbnZSZWZzKCk7CisgICAgICAgICAgICBzdG9yZUVsZW1lbnRBcnJheShhV3JpdGVyLCBpbmRlbnQsIHJlc0Vudik7CisKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8UmVzb3VyY2VMaW5rPiBlbGVtZW50cworICAgICAgICAgICAgQ29udGV4dFJlc291cmNlTGlua1tdIHJlc291cmNlTGlua3MgPSByZXNvdXJjZXMuZmluZFJlc291cmNlTGlua3MoKTsKKyAgICAgICAgICAgIHN0b3JlRWxlbWVudEFycmF5KGFXcml0ZXIsIGluZGVudCwgcmVzb3VyY2VMaW5rcyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1BlcnNpc3RlbnRNYW5hZ2VyU0YuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1BlcnNpc3RlbnRNYW5hZ2VyU0YuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmU5MjkwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvUGVyc2lzdGVudE1hbmFnZXJTRi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uUGVyc2lzdGVudE1hbmFnZXI7CisKKy8qKgorICogc3RvcmUgc2VydmVyLnhtbCBQZXJzaXN0ZW50TWFuYWdlciBlbGVtZW50IHdpdGggbmVzdGVkICJTdG9yZSIKKyAqIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICovCitwdWJsaWMgY2xhc3MgUGVyc2lzdGVudE1hbmFnZXJTRiBleHRlbmRzIFN0b3JlRmFjdG9yeUJhc2UgeworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBQZXJzaXN0ZW50TWFuYWdlciBwcm9wZXJ0aWVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhV3JpdGVyCisgICAgICogICAgICAgICAgICBQcmludFdyaXRlciB0byB3aGljaCB3ZSBhcmUgc3RvcmluZworICAgICAqIEBwYXJhbSBpbmRlbnQKKyAgICAgKiAgICAgICAgICAgIE51bWJlciBvZiBzcGFjZXMgdG8gaW5kZW50IHRoaXMgZWxlbWVudAorICAgICAqIEBwYXJhbSBhTWFuYWdlcgorICAgICAqICAgICAgICAgICAgUGVyc2lzdGVudE1hbmFnZXIgd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgc3RvcmVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZUNoaWxkcyhQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LCBPYmplY3QgYU1hbmFnZXIsCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIHBhcmVudERlc2MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoYU1hbmFnZXIgaW5zdGFuY2VvZiBQZXJzaXN0ZW50TWFuYWdlcikgeworICAgICAgICAgICAgUGVyc2lzdGVudE1hbmFnZXIgbWFuYWdlciA9IChQZXJzaXN0ZW50TWFuYWdlcikgYU1hbmFnZXI7CisKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8TWFuYWdlcj4gZWxlbWVudHMKKyAgICAgICAgICAgIFN0b3JlIHN0b3JlID0gbWFuYWdlci5nZXRTdG9yZSgpOworICAgICAgICAgICAgc3RvcmVFbGVtZW50KGFXcml0ZXIsIGluZGVudCwgc3RvcmUpOworCisgICAgICAgIH0KKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdGFuZGFyZENvbnRleHRTRi5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRDb250ZXh0U0YuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGE3MjMxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRDb250ZXh0U0YuamF2YQpAQCAtMCwwICsxLDM3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUGlwZWxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQXBwbGljYXRpb25QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5Qcm94eURpckNvbnRleHQ7CisKKy8qKgorICogU3RvcmUgc2VydmVyLnhtbCBDb250ZXh0IGVsZW1lbnQgd2l0aCBhbGwgY2hpbGRzCisgKiA8dWw+CisgKiA8bGk+U3RvcmUgYWxsIGNvbnRleHQgYXQgc2VydmVyLnhtbDwvbGk+CisgKiA8bGk+U3RvcmUgZXhpc3RpbmcgYXBwLnhtbCBjb250ZXh0IGEgY29uZi9lbmdpbmVuYW1lL2hvc3RuYW1lL2FwcC54bWw8L2xpPgorICogPGxpPlN0b3JlIHdpdGggYmFja3VwPC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkQ29udGV4dFNGIGV4dGVuZHMgU3RvcmVGYWN0b3J5QmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3RhbmRhcmRDb250ZXh0U0YuY2xhc3MpOworCisgICAgLyoKKyAgICAgKiBTdG9yZSBhIENvbnRleHQgYXMgU2VwYXJhdGUgZmlsZSBhcyBjb25maWdGaWxlIHZhbHVlIGZyb20gY29udGV4dCBleGlzdHMuCisgICAgICogZmlsZW5hbWUgY2FuIGJlIHJlbGF0aXZlIHRvIGNhdGFsaW5hLmJhc2UuCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5JU3RvcmVGYWN0b3J5I3N0b3JlKGphdmEuaW8uUHJpbnRXcml0ZXIsCisgICAgICogICAgICBpbnQsIGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmUoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFDb250ZXh0KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGFDb250ZXh0IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KSB7CisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgYUNvbnRleHQuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBpZiAoZGVzYy5pc1N0b3JlU2VwYXJhdGUoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjb25maWdGaWxlID0gKChTdGFuZGFyZENvbnRleHQpIGFDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbmZpZ0ZpbGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLmlzRXh0ZXJuYWxBbGxvd2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLmlzQmFja3VwKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVXaXRoQmFja3VwKChTdGFuZGFyZENvbnRleHQpIGFDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUNvbnRleHRTZXBhcmF0ZShhV3JpdGVyLCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RhbmRhcmRDb250ZXh0KSBhQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuc3RvcmUoYVdyaXRlciwgaW5kZW50LCBhQ29udGV4dCk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSBhIENvbnRleHQgd2l0aG91dCBiYWNrdXAgYWRkIHNlcGFyYXRlIGZpbGUgb3Igd2hlbiBjb25maWdGaWxlID0KKyAgICAgKiBudWxsIGEgYVdyaXRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVdyaXRlcgorICAgICAqIEBwYXJhbSBpbmRlbnQKKyAgICAgKiBAcGFyYW0gYUNvbnRleHQKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0b3JlQ29udGV4dFNlcGFyYXRlKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsCisgICAgICAgICAgICBTdGFuZGFyZENvbnRleHQgYUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY29uZmlnRmlsZSA9IGFDb250ZXh0LmdldENvbmZpZ0ZpbGUoKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgaWYgKGNvbmZpZ0ZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgRmlsZSBjb25maWcgPSBuZXcgRmlsZShjb25maWdGaWxlKTsKKyAgICAgICAgICAgIGlmICghY29uZmlnLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZyA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRmlsZSk7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggKCFjb25maWcuaXNGaWxlKCkpIHx8ICghY29uZmlnLmNhbldyaXRlKCkpKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3Qgd3JpdGUgY29udGV4dCBvdXRwdXQgZmlsZSBhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb25maWdGaWxlICsgIiwgbm90IHNhdmluZy4iKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvbnRleHQgc2F2ZSBmaWxlIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb25maWdGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3QgYSBmaWxlLCBvciBub3Qgd3JpdGFibGUuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiU3RvcmUgQ29udGV4dCAiICsgYUNvbnRleHQuZ2V0UGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICArICIgc2VwYXJhdGUgYXQgZmlsZSAiICsgY29uZmlnKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShjb25maWcpLCBnZXRSZWdpc3RyeSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmNvZGluZygpKSk7CisgICAgICAgICAgICAgICAgc3RvcmVYTUxIZWFkKHdyaXRlcik7CisgICAgICAgICAgICAgICAgc3VwZXIuc3RvcmUod3JpdGVyLCAtMiwgYUNvbnRleHQpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLnN0b3JlKGFXcml0ZXIsIGluZGVudCwgYUNvbnRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIENvbnRleHQgd2l0aCBhIEJhY2t1cAorICAgICAqIAorICAgICAqIEBwYXJhbSBhQ29udGV4dAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3RvcmVXaXRoQmFja3VwKFN0YW5kYXJkQ29udGV4dCBhQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0b3JlRmlsZU1vdmVyIG1vdmVyID0gZ2V0Q29uZmlnRmlsZVdyaXRlcigoQ29udGV4dCkgYUNvbnRleHQpOworICAgICAgICBpZiAobW92ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gQnVnemlsbGEgMzc3ODEgQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGNhbiB3cml0ZSB0aGlzIG91dHB1dCBmaWxlCisgICAgICAgICAgICBpZiAoKG1vdmVyLmdldENvbmZpZ09sZCgpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHx8ICghbW92ZXIuZ2V0Q29uZmlnT2xkKCkuaXNGaWxlKCkpCisgICAgICAgICAgICAgICAgICAgIHx8ICghbW92ZXIuZ2V0Q29uZmlnT2xkKCkuY2FuV3JpdGUoKSkpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBtb3ZlIG9yaWduYWwgY29udGV4dCBvdXRwdXQgZmlsZSBhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIG1vdmVyLmdldENvbmZpZ09sZCgpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvbnRleHQgb3JnaW5hbCBmaWxlIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbW92ZXIuZ2V0Q29uZmlnT2xkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBudWxsLCBub3QgYSBmaWxlIG9yIG5vdCB3cml0YWJsZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpbGUgZGlyID0gbW92ZXIuZ2V0Q29uZmlnU2F2ZSgpLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgIGlmIChkaXIgIT0gbnVsbCAmJiBkaXIuaXNEaXJlY3RvcnkoKSAmJiAoIWRpci5jYW5Xcml0ZSgpKSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IHNhdmUgY29udGV4dCBvdXRwdXQgZmlsZSBhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIG1vdmVyLmdldENvbmZpZ1NhdmUoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb250ZXh0IHNhdmUgZmlsZSBhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIG1vdmVyLmdldENvbmZpZ1NhdmUoKSArICIgaXMgbm90IHdyaXRhYmxlLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oIlN0b3JlIENvbnRleHQgIiArIGFDb250ZXh0LmdldFBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNlcGFyYXRlIHdpdGggYmFja3VwIChhdCBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbW92ZXIuZ2V0Q29uZmlnU2F2ZSgpICsgIiApIik7CisKKyAgICAgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG1vdmVyLmdldFdyaXRlcigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdG9yZVhNTEhlYWQod3JpdGVyKTsKKyAgICAgICAgICAgICAgICBzdXBlci5zdG9yZSh3cml0ZXIsIC0yLCBhQ29udGV4dCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIC8vIEZsdXNoIGFuZCBjbG9zZSB0aGUgb3V0cHV0IGZpbGUKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtb3Zlci5tb3ZlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgZXhwbGljaXQgd3JpdGVyIGZvciBjb250ZXh0IChjb250ZXh0LmdldENvbmZpZ0ZpbGUoKSkuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQKKyAgICAgKiBAcmV0dXJuIFRoZSBmaWxlIG1vdmVyCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBTdG9yZUZpbGVNb3ZlciBnZXRDb25maWdGaWxlV3JpdGVyKENvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjb25maWdGaWxlID0gY29udGV4dC5nZXRDb25maWdGaWxlKCk7CisgICAgICAgIFN0b3JlRmlsZU1vdmVyIG1vdmVyID0gbnVsbDsKKyAgICAgICAgaWYgKGNvbmZpZ0ZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgRmlsZSBjb25maWcgPSBuZXcgRmlsZShjb25maWdGaWxlKTsKKyAgICAgICAgICAgIGlmICghY29uZmlnLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZyA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBPcGVuIGFuIG91dHB1dCB3cml0ZXIgZm9yIHRoZSBuZXcgY29uZmlndXJhdGlvbiBmaWxlCisgICAgICAgICAgICBtb3ZlciA9IG5ldyBTdG9yZUZpbGVNb3ZlcigiIiwgY29uZmlnLmdldENhbm9uaWNhbFBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0UmVnaXN0cnkoKS5nZXRFbmNvZGluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbW92ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBIb3N0IHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIGFDb250ZXh0CisgICAgICogICAgICAgICAgICBDb250ZXh0IHdob3NlIHByb3BlcnRpZXMgYXJlIGJlaW5nIHN0b3JlZAorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzdG9yaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmVDaGlsZHMoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFDb250ZXh0LAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBwYXJlbnREZXNjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGFDb250ZXh0IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KSB7CisgICAgICAgICAgICBTdGFuZGFyZENvbnRleHQgY29udGV4dCA9IChTdGFuZGFyZENvbnRleHQpIGFDb250ZXh0OworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxMaXN0ZW5lcj4gZWxlbWVudHMKKyAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXJzW10gPSBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudEFycmF5KGFXcml0ZXIsIGluZGVudCwgbGlzdGVuZXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8VmFsdmU+IGVsZW1lbnRzCisgICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIFBpcGVsaW5lKSB7CisgICAgICAgICAgICAgICAgVmFsdmUgdmFsdmVzW10gPSAoKFBpcGVsaW5lKSBjb250ZXh0KS5nZXRWYWx2ZXMoKTsKKyAgICAgICAgICAgICAgICBzdG9yZUVsZW1lbnRBcnJheShhV3JpdGVyLCBpbmRlbnQsIHZhbHZlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8TG9hZGVyPiBlbGVtZW50cworICAgICAgICAgICAgTG9hZGVyIGxvYWRlciA9IGNvbnRleHQuZ2V0TG9hZGVyKCk7CisgICAgICAgICAgICBzdG9yZUVsZW1lbnQoYVdyaXRlciwgaW5kZW50LCBsb2FkZXIpOworCisgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPE1hbmFnZXI+IGVsZW1lbnRzCisgICAgICAgICAgICBNYW5hZ2VyIG1hbmFnZXIgPSBjb250ZXh0LmdldE1hbmFnZXIoKTsKKyAgICAgICAgICAgIHN0b3JlRWxlbWVudChhV3JpdGVyLCBpbmRlbnQsIG1hbmFnZXIpOworCisgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPFJlYWxtPiBlbGVtZW50CisgICAgICAgICAgICBSZWFsbSByZWFsbSA9IGNvbnRleHQuZ2V0UmVhbG0oKTsKKyAgICAgICAgICAgIGlmIChyZWFsbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgUmVhbG0gcGFyZW50UmVhbG0gPSBudWxsOworICAgICAgICAgICAgICAgIC8vIEBUT0RPIGlzIHRoaXMgY2FzZSBwb3NzaWJsZT8KKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudFJlYWxtID0gY29udGV4dC5nZXRQYXJlbnQoKS5nZXRSZWFsbSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVhbG0gIT0gcGFyZW50UmVhbG0pIHsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVFbGVtZW50KGFXcml0ZXIsIGluZGVudCwgcmVhbG0pOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIHJlc291cmNlcworICAgICAgICAgICAgRGlyQ29udGV4dCByZXNvdXJjZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICAgICAgaWYgKHJlc291cmNlcyBpbnN0YW5jZW9mIFByb3h5RGlyQ29udGV4dCkKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSAoKFByb3h5RGlyQ29udGV4dCkgcmVzb3VyY2VzKS5nZXREaXJDb250ZXh0KCk7CisgICAgICAgICAgICBzdG9yZUVsZW1lbnQoYVdyaXRlciwgaW5kZW50LCByZXNvdXJjZXMpOworCisgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPEluc3RhbmNlTGlzdGVuZXI+IGVsZW1lbnRzCisgICAgICAgICAgICBTdHJpbmcgaUxpc3RlbmVyc1tdID0gY29udGV4dC5maW5kSW5zdGFuY2VMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIGdldFN0b3JlQXBwZW5kZXIoKS5wcmludFRhZ0FycmF5KGFXcml0ZXIsICJJbnN0YW5jZUxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ICsgMiwgaUxpc3RlbmVycyk7CisKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8V3JhcHBlckxpc3RlbmVyPiBlbGVtZW50cworICAgICAgICAgICAgU3RyaW5nIHdMaWZlY3ljbGVzW10gPSBjb250ZXh0LmZpbmRXcmFwcGVyTGlmZWN5Y2xlcygpOworICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50VGFnQXJyYXkoYVdyaXRlciwgIldyYXBwZXJMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgIGluZGVudCArIDIsIHdMaWZlY3ljbGVzKTsKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8V3JhcHBlckxpZmVjeWNsZT4gZWxlbWVudHMKKyAgICAgICAgICAgIFN0cmluZyB3TGlzdGVuZXJzW10gPSBjb250ZXh0LmZpbmRXcmFwcGVyTGlzdGVuZXJzKCk7CisgICAgICAgICAgICBnZXRTdG9yZUFwcGVuZGVyKCkucHJpbnRUYWdBcnJheShhV3JpdGVyLCAiV3JhcHBlckxpZmVjeWNsZSIsCisgICAgICAgICAgICAgICAgICAgIGluZGVudCArIDIsIHdMaXN0ZW5lcnMpOworCisgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPFBhcmFtZXRlcj4gZWxlbWVudHMKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uUGFyYW1ldGVyW10gYXBwUGFyYW1zID0gY29udGV4dAorICAgICAgICAgICAgICAgICAgICAuZmluZEFwcGxpY2F0aW9uUGFyYW1ldGVycygpOworICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCBhcHBQYXJhbXMpOworCisgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgbmFtaW5nIHJlc291cmNlcyBlbGVtZW50cyAoRUpCLFJlc291cmNlLC4uLikKKyAgICAgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gY29udGV4dC5nZXROYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIHN0b3JlRWxlbWVudChhV3JpdGVyLCBpbmRlbnQsIG5yZXNvdXJjZXMpOworCisgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgd2F0Y2hlZCByZXNvdXJjZXMgPFdhdGNoZWRSZXNvdXJjZT4KKyAgICAgICAgICAgIFN0cmluZ1tdIHdyZXNvdXJjZXMgPSBjb250ZXh0LmZpbmRXYXRjaGVkUmVzb3VyY2VzKCk7CisgICAgICAgICAgICB3cmVzb3VyY2VzID0gZmlsdGVyV2F0Y2hlZFJlc291cmNlcyhjb250ZXh0LCB3cmVzb3VyY2VzKTsKKyAgICAgICAgICAgIGdldFN0b3JlQXBwZW5kZXIoKS5wcmludFRhZ0FycmF5KGFXcml0ZXIsICJXYXRjaGVkUmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKyAyLCB3cmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgImNvbmZpZ3VyYXRpb24gcm9vdCIgZGlyZWN0b3J5IGZvcgorICAgICAqIG91ciBhc3NvY2lhdGVkIEhvc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgY29uZmlnQmFzZShDb250ZXh0IGNvbnRleHQpIHsKKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwgImNvbmYiKTsKKyAgICAgICAgQ29udGFpbmVyIGhvc3QgPSAoSG9zdCkgY29udGV4dC5nZXRQYXJlbnQoKTsKKworICAgICAgICBpZiAoKGhvc3QgIT0gbnVsbCkgJiYgKGhvc3QgaW5zdGFuY2VvZiBIb3N0KSkgeworICAgICAgICAgICAgQ29udGFpbmVyIGVuZ2luZSA9IGhvc3QuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBpZiAoKGVuZ2luZSAhPSBudWxsKSAmJiAoZW5naW5lIGluc3RhbmNlb2YgRW5naW5lKSkgeworICAgICAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShmaWxlLCBlbmdpbmUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShmaWxlLCBob3N0LmdldE5hbWUoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbGUgPSBmaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChmaWxlKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIGZpbHRlciBvdXQgdGhlIGRlZmF1bHQgd2F0Y2hlZCByZXNvdXJjZXMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqIEBwYXJhbSB3cmVzb3VyY2VzCisgICAgICogQHJldHVybiBUaGUgd2F0Y2hlZCByZXNvdXJjZXMKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogVE9ETyByZWxhdGl2ZSB3YXRjaGVkcmVzb3VyY2UKKyAgICAgKiBUT0RPIGFic29sdXRlIGhhbmRsaW5nIGNvbmZpZ0ZpbGUKKyAgICAgKiBUT0RPIEZpbGVuYW1lIGNhc2UgaGFuZGxpbmcgZm9yIFdpbmRvd3M/CisgICAgICogVE9ETyBkaWdlc3RlciB2YXJpYWJsZSBzdWJzaXR1dGlvbiAkY2F0YWxpbmEuYmFzZSwgJGNhdGFsaW5hLmhvbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZmlsdGVyV2F0Y2hlZFJlc291cmNlcyhTdGFuZGFyZENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIFN0cmluZ1tdIHdyZXNvdXJjZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgY29uZmlnQmFzZSA9IGNvbmZpZ0Jhc2UoY29udGV4dCk7CisgICAgICAgIFN0cmluZyBjb25mQ29udGV4dCA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLAorICAgICAgICAgICAgICAgICJjb25mL2NvbnRleHQueG1sIikuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICBTdHJpbmcgY29uZkhvc3REZWZhdWx0ID0gbmV3IEZpbGUoY29uZmlnQmFzZSwgImNvbnRleHQueG1sLmRlZmF1bHQiKQorICAgICAgICAgICAgICAgIC5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgIFN0cmluZyBjb25maWdGaWxlID0gY29udGV4dC5nZXRDb25maWdGaWxlKCk7CisgICAgICAgIFN0cmluZyB3ZWJ4bWwgPSAiV0VCLUlORi93ZWIueG1sIiA7CisgICAgICAgIAorICAgICAgICBMaXN0IHJlc291cmNlID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKKworICAgICAgICAgICAgaWYgKHdyZXNvdXJjZXNbaV0uZXF1YWxzKGNvbmZDb250ZXh0KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICh3cmVzb3VyY2VzW2ldLmVxdWFscyhjb25mSG9zdERlZmF1bHQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHdyZXNvdXJjZXNbaV0uZXF1YWxzKGNvbmZpZ0ZpbGUpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHdyZXNvdXJjZXNbaV0uZXF1YWxzKHdlYnhtbCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICByZXNvdXJjZS5hZGQod3Jlc291cmNlc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgcmVzb3VyY2UudG9BcnJheShuZXcgU3RyaW5nW3Jlc291cmNlLnNpemUoKV0pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRFbmdpbmVTRi5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRFbmdpbmVTRi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OWYwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdGFuZGFyZEVuZ2luZVNGLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUGlwZWxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEVuZ2luZTsKKworLyoqCisgKiBTdG9yZSBzZXJ2ZXIueG1sIEVsZW1lbnQgRW5naW5lCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkRW5naW5lU0YgZXh0ZW5kcyBTdG9yZUZhY3RvcnlCYXNlIHsKKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzcGVjaWZpZWQgRW5naW5lIHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIGFFbmdpbmUKKyAgICAgKiAgICAgICAgICAgIE9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBiZWluZyBzdG9yZWQKKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3JlQ2hpbGRzKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBhRW5naW5lLAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBwYXJlbnREZXNjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGFFbmdpbmUgaW5zdGFuY2VvZiBTdGFuZGFyZEVuZ2luZSkgeworICAgICAgICAgICAgU3RhbmRhcmRFbmdpbmUgZW5naW5lID0gKFN0YW5kYXJkRW5naW5lKSBhRW5naW5lOworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxMaXN0ZW5lcj4gZWxlbWVudHMKKyAgICAgICAgICAgIGlmIChlbmdpbmUgaW5zdGFuY2VvZiBMaWZlY3ljbGUpIHsKKyAgICAgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcnNbXSA9ICgoTGlmZWN5Y2xlKSBlbmdpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudEFycmF5KGFXcml0ZXIsIGluZGVudCwgbGlzdGVuZXJzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxSZWFsbT4gZWxlbWVudAorICAgICAgICAgICAgUmVhbG0gcmVhbG0gPSBlbmdpbmUuZ2V0UmVhbG0oKTsKKyAgICAgICAgICAgIGlmIChyZWFsbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgUmVhbG0gcGFyZW50UmVhbG0gPSBudWxsOworICAgICAgICAgICAgICAgIC8vIFRPRE8gaXMgdGhpcyBjYXNlIHBvc3NpYmxlPyAoc2VlIGl0IGEgb2xkIFNlcnZlciA1LjAgaW1wbCkKKyAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmdldFBhcmVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50UmVhbG0gPSBlbmdpbmUuZ2V0UGFyZW50KCkuZ2V0UmVhbG0oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlYWxtICE9IHBhcmVudFJlYWxtKSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudChhV3JpdGVyLCBpbmRlbnQsIHJlYWxtKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxWYWx2ZT4gZWxlbWVudHMKKyAgICAgICAgICAgIGlmIChlbmdpbmUgaW5zdGFuY2VvZiBQaXBlbGluZSkgeworICAgICAgICAgICAgICAgIFZhbHZlIHZhbHZlc1tdID0gKChQaXBlbGluZSkgZW5naW5lKS5nZXRWYWx2ZXMoKTsKKyAgICAgICAgICAgICAgICBzdG9yZUVsZW1lbnRBcnJheShhV3JpdGVyLCBpbmRlbnQsIHZhbHZlcyk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHN0b3JlIGFsbCA8SG9zdD4gZWxlbWVudHMKKyAgICAgICAgICAgIENvbnRhaW5lciBjaGlsZHJlbltdID0gZW5naW5lLmZpbmRDaGlsZHJlbigpOworICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCBjaGlsZHJlbik7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRIb3N0U0YuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkSG9zdFNGLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiMzM4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkSG9zdFNGLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlBpcGVsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3Q7CisKKy8qKgorICogU3RvcmUgc2VydmVyLnhtbCBFbGVtZW50IEhvc3QKKyAqIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICovCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRIb3N0U0YgZXh0ZW5kcyBTdG9yZUZhY3RvcnlCYXNlIHsKKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzcGVjaWZpZWQgSG9zdCBwcm9wZXJ0aWVzIGFuZCBjaGlsZHMKKyAgICAgKiAoTGlzdGVuZXIsQWxpYXMsUmVhbG0sVmFsdmUsQ2x1c3RlciwgQ29udGV4dCkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVdyaXRlcgorICAgICAqICAgICAgICAgICAgUHJpbnRXcml0ZXIgdG8gd2hpY2ggd2UgYXJlIHN0b3JpbmcKKyAgICAgKiBAcGFyYW0gaW5kZW50CisgICAgICogICAgICAgICAgICBOdW1iZXIgb2Ygc3BhY2VzIHRvIGluZGVudCB0aGlzIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gYUhvc3QKKyAgICAgKiAgICAgICAgICAgIEhvc3Qgd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgc3RvcmVkCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZUNoaWxkcyhQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LCBPYmplY3QgYUhvc3QsCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIHBhcmVudERlc2MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoYUhvc3QgaW5zdGFuY2VvZiBTdGFuZGFyZEhvc3QpIHsKKyAgICAgICAgICAgIFN0YW5kYXJkSG9zdCBob3N0ID0gKFN0YW5kYXJkSG9zdCkgYUhvc3Q7CisgICAgICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPExpc3RlbmVyPiBlbGVtZW50cworICAgICAgICAgICAgaWYgKGhvc3QgaW5zdGFuY2VvZiBMaWZlY3ljbGUpIHsKKyAgICAgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcnNbXSA9ICgoTGlmZWN5Y2xlKSBob3N0KQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgICAgICBzdG9yZUVsZW1lbnRBcnJheShhV3JpdGVyLCBpbmRlbnQsIGxpc3RlbmVycyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8QWxpYXM+IGVsZW1lbnRzCisgICAgICAgICAgICBTdHJpbmcgYWxpYXNlc1tdID0gaG9zdC5maW5kQWxpYXNlcygpOworICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50VGFnQXJyYXkoYVdyaXRlciwgIkFsaWFzIiwgaW5kZW50ICsgMiwKKyAgICAgICAgICAgICAgICAgICAgYWxpYXNlcyk7CisKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8UmVhbG0+IGVsZW1lbnQKKyAgICAgICAgICAgIFJlYWxtIHJlYWxtID0gaG9zdC5nZXRSZWFsbSgpOworICAgICAgICAgICAgaWYgKHJlYWxtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBSZWFsbSBwYXJlbnRSZWFsbSA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKGhvc3QuZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnRSZWFsbSA9IGhvc3QuZ2V0UGFyZW50KCkuZ2V0UmVhbG0oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlYWxtICE9IHBhcmVudFJlYWxtKSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudChhV3JpdGVyLCBpbmRlbnQsIHJlYWxtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8VmFsdmU+IGVsZW1lbnRzCisgICAgICAgICAgICBpZiAoaG9zdCBpbnN0YW5jZW9mIFBpcGVsaW5lKSB7CisgICAgICAgICAgICAgICAgVmFsdmUgdmFsdmVzW10gPSAoKFBpcGVsaW5lKSBob3N0KS5nZXRWYWx2ZXMoKTsKKyAgICAgICAgICAgICAgICBpZih2YWx2ZXMgIT0gbnVsbCAmJiB2YWx2ZXMubGVuZ3RoID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgTGlzdCBob3N0VmFsdmVzID0gbmV3IEFycmF5TGlzdCgpIDsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMCA7IGkgPCB2YWx2ZXMubGVuZ3RoIDsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoISggdmFsdmVzW2ldIGluc3RhbmNlb2YgQ2x1c3RlclZhbHZlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0VmFsdmVzLmFkZCh2YWx2ZXNbaV0pOworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzdG9yZUVsZW1lbnRBcnJheShhV3JpdGVyLCBpbmRlbnQsIGhvc3RWYWx2ZXMudG9BcnJheSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHN0b3JlIGFsbCA8Q2x1c3Rlcj4gZWxlbWVudHMKKyAgICAgICAgICAgIENsdXN0ZXIgY2x1c3RlciA9IGhvc3QuZ2V0Q2x1c3RlcigpOworICAgICAgICAgICAgaWYgKGNsdXN0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudChhV3JpdGVyLCBpbmRlbnQsIGNsdXN0ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzdG9yZSBhbGwgPENvbnRleHQ+IGVsZW1lbnRzCisgICAgICAgICAgICBDb250YWluZXIgY2hpbGRyZW5bXSA9IGhvc3QuZmluZENoaWxkcmVuKCk7CisgICAgICAgICAgICBzdG9yZUVsZW1lbnRBcnJheShhV3JpdGVyLCBpbmRlbnQsIGNoaWxkcmVuKTsKKyAgICAgICAgfQorICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkU2VydmVyU0YuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkU2VydmVyU0YuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGE5YjJmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRTZXJ2ZXJTRi5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXI7CisKKy8qKgorICogU3RvcmUgc2VydmVyLnhtbCBTZXJ2ZXIgZWxlbWVudCBhbmQgY2hpbGRzICgKKyAqIExpc3RlbmVyLEdsb2JhbE5hbWluZ1Jlc291cmNlLFNlcnZpY2UpCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkU2VydmVyU0YgZXh0ZW5kcyBTdG9yZUZhY3RvcnlCYXNlIHsKKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzcGVjaWZpZWQgU2VydmVyIHByb3BlcnRpZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiAgICAgICAgICAgIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIGFTZXJ2ZXIKKyAgICAgKiAgICAgICAgICAgIE9iamVjdCB0byBiZSBzdG9yZWQKKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JU3RvcmVGYWN0b3J5I3N0b3JlKGphdmEuaW8uUHJpbnRXcml0ZXIsCisgICAgICogICAgICBpbnQsIGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmUoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFTZXJ2ZXIpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RvcmVYTUxIZWFkKGFXcml0ZXIpOworICAgICAgICBzdXBlci5zdG9yZShhV3JpdGVyLCBpbmRlbnQsIGFTZXJ2ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlIENoaWxkcyBmcm9tIHRoaXMgU3RhbmRhcmRTZXJ2ZXIgZGVzY3JpdGlvbgorICAgICAqIAorICAgICAqIEBwYXJhbSBhV3JpdGVyCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqIEBwYXJhbSBhT2JqZWN0CisgICAgICogQHBhcmFtIHBhcmVudERlc2MKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3JlQ2hpbGRzKFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQsIE9iamVjdCBhT2JqZWN0LAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBwYXJlbnREZXNjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGFPYmplY3QgaW5zdGFuY2VvZiBTdGFuZGFyZFNlcnZlcikgeworICAgICAgICAgICAgU3RhbmRhcmRTZXJ2ZXIgc2VydmVyID0gKFN0YW5kYXJkU2VydmVyKSBhT2JqZWN0OworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxMaXN0ZW5lcj4gZWxlbWVudHMKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpIHsKKyAgICAgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcnNbXSA9ICgoTGlmZWN5Y2xlKSBzZXJ2ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudEFycmF5KGFXcml0ZXIsIGluZGVudCwgbGlzdGVuZXJzKTsKKyAgICAgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGxpc3RlbmVyID09IG51bGwgJiYgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXSBpbnN0YW5jZW9mIFNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBlbGVtZW50RGVzYyA9IGdldFJlZ2lzdHJ5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRTZXJ2ZXIuY2xhc3MuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5bU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXJdIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50RGVzYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RGVzYy5nZXRTdG9yZUZhY3RvcnkoKS5zdG9yZShhV3JpdGVyLCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8R2xvYmFsTmFtaW5nUmVzb3VyY2VzPiBlbGVtZW50CisgICAgICAgICAgICBOYW1pbmdSZXNvdXJjZXMgZ2xvYmFsTmFtaW5nUmVzb3VyY2VzID0gc2VydmVyCisgICAgICAgICAgICAgICAgICAgIC5nZXRHbG9iYWxOYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZWxlbWVudERlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTmFtaW5nUmVzb3VyY2VzLmNsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5bR2xvYmFsTmFtaW5nUmVzb3VyY2VzXSIpOworICAgICAgICAgICAgaWYgKGVsZW1lbnREZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlbGVtZW50RGVzYy5nZXRTdG9yZUZhY3RvcnkoKS5zdG9yZShhV3JpdGVyLCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxOYW1pbmdSZXNvdXJjZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxTZXJ2aWNlPiBlbGVtZW50cworICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlc1tdID0gc2VydmVyLmZpbmRTZXJ2aWNlcygpOworICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCBzZXJ2aWNlcyk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkU2VydmljZVNGLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdGFuZGFyZFNlcnZpY2VTRi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZmIxMDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdGFuZGFyZFNlcnZpY2VTRi5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmljZTsKKworLyoqCisgKiBTdG9yZSBzZXJ2ZXIueG1sIEVsZW1lbnQgU2VydmljZSBhbmQgYWxsIGNoaWxkcyAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2ggKHBlcm9AYXBhY2hlLm9yZykKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkU2VydmljZVNGIGV4dGVuZHMgU3RvcmVGYWN0b3J5QmFzZSB7CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSBDaGlsZHMgZnJvbSB0aGlzIFN0YW5kYXJkU2VydmljZSBkZXNjcmlwdGlvbgorICAgICAqIAorICAgICAqIEBwYXJhbSBhV3JpdGVyCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqIEBwYXJhbSBhU2VydmljZQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmVDaGlsZHMoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFTZXJ2aWNlLAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBwYXJlbnREZXNjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGFTZXJ2aWNlIGluc3RhbmNlb2YgU3RhbmRhcmRTZXJ2aWNlKSB7CisgICAgICAgICAgICBTdGFuZGFyZFNlcnZpY2Ugc2VydmljZSA9IChTdGFuZGFyZFNlcnZpY2UpIGFTZXJ2aWNlOworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxMaXN0ZW5lcj4gZWxlbWVudHMKKyAgICAgICAgICAgIGlmIChzZXJ2aWNlIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXJzW10gPSAoKExpZmVjeWNsZSkgc2VydmljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisgICAgICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCBsaXN0ZW5lcnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25uZWN0b3IgY29ubmVjdG9yc1tdID0gc2VydmljZS5maW5kQ29ubmVjdG9ycygpOworICAgICAgICAgICAgc3RvcmVFbGVtZW50QXJyYXkoYVdyaXRlciwgaW5kZW50LCBjb25uZWN0b3JzKTsKKworICAgICAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxFbmdpbmU+IGVsZW1lbnQgKG9yIG90aGVyIGFwcHJvcHJpYXRlIGNvbnRhaW5lcikKKyAgICAgICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBzZXJ2aWNlLmdldENvbnRhaW5lcigpOworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBlbGVtZW50RGVzYyA9IGdldFJlZ2lzdHJ5KCkuZmluZERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldENsYXNzKCkpOworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50RGVzYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIElTdG9yZUZhY3RvcnkgZmFjdG9yeSA9IGVsZW1lbnREZXNjLmdldFN0b3JlRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LnN0b3JlKGFXcml0ZXIsIGluZGVudCwgY29udGFpbmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlQXBwZW5kZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlQXBwZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWJjNTkxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVBcHBlbmRlci5qYXZhCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5iZWFucy5JbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuUmVzb3VyY2VCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuSW50cm9zcGVjdGlvblV0aWxzOworCisvKioKKyAqIFN0b3JlQXBwZW5kcyBnZW5lcmF0ZSByZWFsbHkgdGhlIHhtbCB0YWcgZWxlbWVudHMKKyAqIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogIAorICovCitwdWJsaWMgY2xhc3MgU3RvcmVBcHBlbmRlciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgcGVyc2lzdGFibGUgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBwZXJzaXN0YWJsZXNbXSA9IHsgU3RyaW5nLmNsYXNzLCBJbnRlZ2VyLmNsYXNzLAorICAgICAgICAgICAgSW50ZWdlci5UWVBFLCBCb29sZWFuLmNsYXNzLCBCb29sZWFuLlRZUEUsIEJ5dGUuY2xhc3MsIEJ5dGUuVFlQRSwKKyAgICAgICAgICAgIENoYXJhY3Rlci5jbGFzcywgQ2hhcmFjdGVyLlRZUEUsIERvdWJsZS5jbGFzcywgRG91YmxlLlRZUEUsCisgICAgICAgICAgICBGbG9hdC5jbGFzcywgRmxvYXQuVFlQRSwgTG9uZy5jbGFzcywgTG9uZy5UWVBFLCBTaG9ydC5jbGFzcywKKyAgICAgICAgICAgIFNob3J0LlRZUEUsIH07CisKKyAgICAvKioKKyAgICAgKiBwcmludCB0aGUgY2xvc2luZyB0YWcKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVdyaXRlcgorICAgICAqIEBwYXJhbSBhRGVzYworICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRDbG9zZVRhZyhQcmludFdyaXRlciBhV3JpdGVyLCBTdG9yZURlc2NyaXB0aW9uIGFEZXNjKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFXcml0ZXIucHJpbnQoIjwvIik7CisgICAgICAgIGFXcml0ZXIucHJpbnQoYURlc2MuZ2V0VGFnKCkpOworICAgICAgICBhV3JpdGVyLnByaW50bG4oIj4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwcmludCBvbmx5IHRoZSBvcGVuIHRhZyB3aXRoIGFsbCBhdHRyaWJ1dGVzCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiBAcGFyYW0gaW5kZW50CisgICAgICogQHBhcmFtIGJlYW4KKyAgICAgKiBAcGFyYW0gYURlc2MKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50T3BlblRhZyhQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LCBPYmplY3QgYmVhbiwKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gYURlc2MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhV3JpdGVyLnByaW50KCI8Iik7CisgICAgICAgIGFXcml0ZXIucHJpbnQoYURlc2MuZ2V0VGFnKCkpOworICAgICAgICBpZiAoYURlc2MuaXNBdHRyaWJ1dGVzKCkgJiYgYmVhbiAhPSBudWxsKQorICAgICAgICAgICAgcHJpbnRBdHRyaWJ1dGVzKGFXcml0ZXIsIGluZGVudCwgYmVhbiwgYURlc2MpOworICAgICAgICBhV3JpdGVyLnByaW50bG4oIj4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCB0YWcgd2l0aCBhbGwgYXR0cmlidXRlcworICAgICAqIAorICAgICAqIEBwYXJhbSBhV3JpdGVyCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqIEBwYXJhbSBiZWFuCisgICAgICogQHBhcmFtIGFEZXNjCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludFRhZyhQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LCBPYmplY3QgYmVhbiwKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gYURlc2MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhV3JpdGVyLnByaW50KCI8Iik7CisgICAgICAgIGFXcml0ZXIucHJpbnQoYURlc2MuZ2V0VGFnKCkpOworICAgICAgICBpZiAoYURlc2MuaXNBdHRyaWJ1dGVzKCkgJiYgYmVhbiAhPSBudWxsKQorICAgICAgICAgICAgcHJpbnRBdHRyaWJ1dGVzKGFXcml0ZXIsIGluZGVudCwgYmVhbiwgYURlc2MpOworICAgICAgICBhV3JpdGVyLnByaW50bG4oIi8+Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogcHJpbnQgdGhlIHZhbHVlIGZyb20gdGFnIGFzIGNvbnRlbnQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVdyaXRlcgorICAgICAqIEBwYXJhbSB0YWcKKyAgICAgKiBAcGFyYW0gY29udGVudAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRUYWdDb250ZW50KFByaW50V3JpdGVyIGFXcml0ZXIsIFN0cmluZyB0YWcsIFN0cmluZyBjb250ZW50KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFXcml0ZXIucHJpbnQoIjwiKTsKKyAgICAgICAgYVdyaXRlci5wcmludCh0YWcpOworICAgICAgICBhV3JpdGVyLnByaW50KCI+Iik7CisgICAgICAgIGFXcml0ZXIucHJpbnQoY29udmVydFN0cihjb250ZW50KSk7CisgICAgICAgIGFXcml0ZXIucHJpbnQoIjwvIik7CisgICAgICAgIGFXcml0ZXIucHJpbnQodGFnKTsKKyAgICAgICAgYVdyaXRlci5wcmludGxuKCI+Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogcHJpbnQgYW4gYXJyYXkgb2YgdmFsdWVzCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiBAcGFyYW0gdGFnCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqIEBwYXJhbSBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50VGFnVmFsdWVBcnJheShQcmludFdyaXRlciBhV3JpdGVyLCBTdHJpbmcgdGFnLCBpbnQgaW5kZW50LAorICAgICAgICAgICAgU3RyaW5nW10gZWxlbWVudHMpIHsKKyAgICAgICAgaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgcHJpbnRJbmRlbnQoYVdyaXRlciwgaW5kZW50ICsgMik7CisgICAgICAgICAgICBhV3JpdGVyLnByaW50KCI8Iik7CisgICAgICAgICAgICBhV3JpdGVyLnByaW50KHRhZyk7CisgICAgICAgICAgICBhV3JpdGVyLnByaW50KCI+Iik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcHJpbnRJbmRlbnQoYVdyaXRlciwgaW5kZW50ICsgNCk7CisgICAgICAgICAgICAgICAgYVdyaXRlci5wcmludChlbGVtZW50c1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgZWxlbWVudHMubGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBhV3JpdGVyLnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50SW5kZW50KGFXcml0ZXIsIGluZGVudCArIDIpOworICAgICAgICAgICAgYVdyaXRlci5wcmludCgiPC8iKTsKKyAgICAgICAgICAgIGFXcml0ZXIucHJpbnQodGFnKTsKKyAgICAgICAgICAgIGFXcml0ZXIucHJpbnRsbigiPiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcHJpbnQgYSBhcnJheSBvZiBlbGVtZW50cworICAgICAqIAorICAgICAqIEBwYXJhbSBhV3JpdGVyCisgICAgICogQHBhcmFtIHRhZworICAgICAqIEBwYXJhbSBpbmRlbnQKKyAgICAgKiBAcGFyYW0gZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludFRhZ0FycmF5KFByaW50V3JpdGVyIGFXcml0ZXIsIFN0cmluZyB0YWcsIGludCBpbmRlbnQsCisgICAgICAgICAgICBTdHJpbmdbXSBlbGVtZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChlbGVtZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcHJpbnRJbmRlbnQoYVdyaXRlciwgaW5kZW50KTsKKyAgICAgICAgICAgICAgICBwcmludFRhZ0NvbnRlbnQoYVdyaXRlciwgdGFnLCBlbGVtZW50c1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCBzb21lIHNwYWNlcworICAgICAqIAorICAgICAqIEBwYXJhbSBhV3JpdGVyCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIHNwYWNlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50SW5kZW50KFByaW50V3JpdGVyIGFXcml0ZXIsIGludCBpbmRlbnQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykgeworICAgICAgICAgICAgYVdyaXRlci5wcmludCgnICcpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHJlbGV2YW50IGF0dHJpYnV0ZXMgb2YgdGhlIHNwZWNpZmllZCBKYXZhQmVhbiwgcGx1cyBhCisgICAgICogPGNvZGU+Y2xhc3NOYW1lPC9jb2RlPiBhdHRyaWJ1dGUgZGVmaW5pbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhCisgICAgICogY2xhc3MgbmFtZSBvZiB0aGUgYmVhbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd3JpdGVyCisgICAgICogICAgICAgICAgICBQcmludFdyaXRlciB0byB3aGljaCB3ZSBhcmUgc3RvcmluZworICAgICAqIEBwYXJhbSBiZWFuCisgICAgICogICAgICAgICAgICBCZWFuIHdob3NlIHByb3BlcnRpZXMgYXJlIHRvIGJlIHJlbmRlcmVkIGFzIGF0dHJpYnV0ZXMsCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludEF0dHJpYnV0ZXMoUHJpbnRXcml0ZXIgd3JpdGVyLCBpbnQgaW5kZW50LCBPYmplY3QgYmVhbiwKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcHJpbnRBdHRyaWJ1dGVzKHdyaXRlciwgaW5kZW50LCB0cnVlLCBiZWFuLCBkZXNjKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSByZWxldmFudCBhdHRyaWJ1dGVzIG9mIHRoZSBzcGVjaWZpZWQgSmF2YUJlYW4uCisgICAgICogCisgICAgICogQHBhcmFtIHdyaXRlcgorICAgICAqICAgICAgICAgICAgUHJpbnRXcml0ZXIgdG8gd2hpY2ggd2UgYXJlIHN0b3JpbmcKKyAgICAgKiBAcGFyYW0gaW5jbHVkZQorICAgICAqICAgICAgICAgICAgU2hvdWxkIHdlIGluY2x1ZGUgYSA8Y29kZT5jbGFzc05hbWU8L2NvZGU+IGF0dHJpYnV0ZT8KKyAgICAgKiBAcGFyYW0gYmVhbgorICAgICAqICAgICAgICAgICAgQmVhbiB3aG9zZSBwcm9wZXJ0aWVzIGFyZSB0byBiZSByZW5kZXJlZCBhcyBhdHRyaWJ1dGVzLAorICAgICAqIEBwYXJhbSBkZXNjCisgICAgICogICAgICAgICAgICBSZWdpc3RyeURlc2NycGl0b3IgZnJvbSB0aGlzIGJlYW4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50QXR0cmlidXRlcyhQcmludFdyaXRlciB3cml0ZXIsIGludCBpbmRlbnQsCisgICAgICAgICAgICBib29sZWFuIGluY2x1ZGUsIE9iamVjdCBiZWFuLCBTdG9yZURlc2NyaXB0aW9uIGRlc2MpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBSZW5kZXIgYSBjbGFzc05hbWUgYXR0cmlidXRlIGlmIHJlcXVlc3RlZAorICAgICAgICBpZiAoaW5jbHVkZSAmJiBkZXNjICE9IG51bGwgJiYgIWRlc2MuaXNTdGFuZGFyZCgpKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBjbGFzc05hbWU9XCIiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChiZWFuLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiXCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBmb3IgdGhpcyBiZWFuCisgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yc1tdID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKAorICAgICAgICAgICAgICAgIGJlYW4uZ2V0Q2xhc3MoKSkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOworICAgICAgICBpZiAoZGVzY3JpcHRvcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgZGVzY3JpcHRvcnMgPSBuZXcgUHJvcGVydHlEZXNjcmlwdG9yWzBdOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGJsYW5rIGluc3RhbmNlCisgICAgICAgIE9iamVjdCBiZWFuMiA9IGRlZmF1bHRJbnN0YW5jZShiZWFuKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JzW2ldIGluc3RhbmNlb2YgSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvcikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBJbmRleGVkIHByb3BlcnRpZXMgYXJlIG5vdCBwZXJzaXN0ZWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaXNQZXJzaXN0YWJsZShkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eVR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKGRlc2NyaXB0b3JzW2ldLmdldFJlYWRNZXRob2QoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB8fCAoZGVzY3JpcHRvcnNbaV0uZ2V0V3JpdGVNZXRob2QoKSA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBNdXN0IGJlIGEgcmVhZC13cml0ZSBwcmltaXRpdmUgb3IgU3RyaW5nCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVzYy5pc1RyYW5zaWVudEF0dHJpYnV0ZShkZXNjcmlwdG9yc1tpXS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIFNraXAgdGhlIHNwZWNpZmllZCBleGNlcHRpb25zCisgICAgICAgICAgICB9CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBJbnRyb3NwZWN0aW9uVXRpbHMuZ2V0UHJvcGVydHkoYmVhbiwgZGVzY3JpcHRvcnNbaV0KKyAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBOdWxsIHZhbHVlcyBhcmUgbm90IHBlcnNpc3RlZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgT2JqZWN0IHZhbHVlMiA9IEludHJvc3BlY3Rpb25VdGlscy5nZXRQcm9wZXJ0eShiZWFuMiwKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnNbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHModmFsdWUyKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBwcm9wZXJ0eSBoYXMgaXRzIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50QXR0cmlidXRlKHdyaXRlciwgaW5kZW50LCBiZWFuLCBkZXNjLCBkZXNjcmlwdG9yc1tpXS5nZXROYW1lKCksIGJlYW4yLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmVhbiBpbnN0YW5jZW9mIFJlc291cmNlQmFzZSkgeworICAgICAgICAgICAgUmVzb3VyY2VCYXNlIHJlc291cmNlID0gKFJlc291cmNlQmFzZSkgYmVhbjsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlLmxpc3RQcm9wZXJ0aWVzKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gcmVzb3VyY2UuZ2V0UHJvcGVydHkobmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKCFpc1BlcnNpc3RhYmxlKHZhbHVlLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZGVzYy5pc1RyYW5zaWVudEF0dHJpYnV0ZShuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbnMKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRWYWx1ZSh3cml0ZXIsIGluZGVudCwgbmFtZSwgdmFsdWUpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gd3JpdGVyCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqIEBwYXJhbSBiZWFuCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZQorICAgICAqIEBwYXJhbSBiZWFuMgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByaW50QXR0cmlidXRlKFByaW50V3JpdGVyIHdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGJlYW4sIFN0b3JlRGVzY3JpcHRpb24gZGVzYywgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIE9iamVjdCBiZWFuMiwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmIChpc1ByaW50VmFsdWUoYmVhbiwgYmVhbjIsIGF0dHJpYnV0ZU5hbWUsIGRlc2MpKQorICAgICAgICAgICAgcHJpbnRWYWx1ZSh3cml0ZXIsIGluZGVudCwgYXR0cmlidXRlTmFtZSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHByaW50IHRoaXMgQXR0cmlidXRlIHZhbHVlIG9yIG5vdAorICAgICAqIAorICAgICAqIEBwYXJhbSBiZWFuCisgICAgICogICAgICAgICAgICBvcmdpbmFsIGJlYW4KKyAgICAgKiBAcGFyYW0gYmVhbjIKKyAgICAgKiAgICAgICAgICAgIGRlZmF1bHQgYmVhbgorICAgICAqIEBwYXJhbSBhdHRyTmFtZQorICAgICAqICAgICAgICAgICAgYXR0cmlidXRlIG5hbWUKKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBmcm9tIGJlYW4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgaXQncyBhIHByaW50aW5nIHZhbHVlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmludFZhbHVlKE9iamVjdCBiZWFuLCBPYmplY3QgYmVhbjIsIFN0cmluZyBhdHRyTmFtZSwKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYykgeworICAgICAgICBib29sZWFuIHByaW50VmFsdWUgPSBmYWxzZTsKKworICAgICAgICBPYmplY3QgdmFsdWUgPSBJbnRyb3NwZWN0aW9uVXRpbHMuZ2V0UHJvcGVydHkoYmVhbiwgYXR0ck5hbWUpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgT2JqZWN0IHZhbHVlMiA9IEludHJvc3BlY3Rpb25VdGlscy5nZXRQcm9wZXJ0eShiZWFuMiwgYXR0ck5hbWUpOworICAgICAgICAgICAgcHJpbnRWYWx1ZSA9ICF2YWx1ZS5lcXVhbHModmFsdWUyKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcmludFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdlbmVyYXRlIGRlZmF1bHQgSW5zdGFuY2UKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYmVhbgorICAgICAqIEByZXR1cm4gYW4gb2JqZWN0IGZyb20gc2FtZSBjbGFzcyBhcyBiZWFuIHBhcmFtZXRlcgorICAgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZGVmYXVsdEluc3RhbmNlKE9iamVjdCBiZWFuKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICByZXR1cm4gYmVhbi5nZXRDbGFzcygpLm5ld0luc3RhbmNlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcHJpbnQgYW4gYXR0cmlidXRlIHZhbHVlCisgICAgICogCisgICAgICogQHBhcmFtIHdyaXRlcgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRWYWx1ZShQcmludFdyaXRlciB3cml0ZXIsIGludCBpbmRlbnQsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgeworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIHdyaXRlci5wcmludGxuKCk7CisgICAgICAgIHByaW50SW5kZW50KHdyaXRlciwgaW5kZW50ICsgNCk7CisgICAgICAgIHdyaXRlci5wcmludChuYW1lKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCI9XCIiKTsKKyAgICAgICAgU3RyaW5nIHN0clZhbHVlID0gY29udmVydFN0cigoU3RyaW5nKSB2YWx1ZSk7CisgICAgICAgIHdyaXRlci5wcmludChzdHJWYWx1ZSk7CisgICAgICAgIHdyaXRlci5wcmludCgiXCIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIHN0cmluZywgdGhpcyBtZXRob2QgcmVwbGFjZXMgYWxsIG9jY3VycmVuY2VzIG9mICcgPCcsICc+JywgJyYnLAorICAgICAqIGFuZCAnIicuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjb252ZXJ0U3RyKFN0cmluZyBpbnB1dCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBmaWx0ZXJlZCA9IG5ldyBTdHJpbmdCdWZmZXIoaW5wdXQubGVuZ3RoKCkpOworICAgICAgICBjaGFyIGM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgYyA9IGlucHV0LmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChjID09ICc8JykgeworICAgICAgICAgICAgICAgIGZpbHRlcmVkLmFwcGVuZCgiJmx0OyIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICc+JykgeworICAgICAgICAgICAgICAgIGZpbHRlcmVkLmFwcGVuZCgiJmd0OyIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcJycpIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZC5hcHBlbmQoIiZhcG9zOyIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICciJykgeworICAgICAgICAgICAgICAgIGZpbHRlcmVkLmFwcGVuZCgiJnF1b3Q7Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyYnKSB7CisgICAgICAgICAgICAgICAgZmlsdGVyZWQuYXBwZW5kKCImYW1wOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZC5hcHBlbmQoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChmaWx0ZXJlZC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IHR5cGUgb25lIGZvciB3aGljaCB3ZSBzaG91bGQgZ2VuZXJhdGUgYQorICAgICAqIHBlcnNpc3RlbmNlIGF0dHJpYnV0ZT8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2xhenoKKyAgICAgKiAgICAgICAgICAgIEphdmEgY2xhc3MgdG8gYmUgdGVzdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNQZXJzaXN0YWJsZShDbGFzcyBjbGF6eikgeworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGVyc2lzdGFibGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocGVyc2lzdGFibGVzW2ldID09IGNsYXp6KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlQ29uZmlnLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMTQyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5NQmVhblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisvKioKKyAqIFN0b3JlIFNlcnZlci9TZXJ2aWNlL0hvc3QvQ29udGV4dCBhdCBmaWxlIG9yIFByaW50V3JpdGVyLiBEZWZhdWx0IHNlcnZlci54bWwKKyAqIGlzIGF0ICRjYXRhbGluYS5iYXNlL2NvbmYvc2VydmVyLnhtbAorICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBTdG9yZUNvbmZpZyBpbXBsZW1lbnRzIElTdG9yZUNvbmZpZyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFN0b3JlQ29uZmlnLmNsYXNzKTsKKworICAgIHByaXZhdGUgU3RyaW5nIHNlcnZlckZpbGVuYW1lID0gImNvbmYvc2VydmVyLnhtbCI7CisKKyAgICBwcml2YXRlIFN0b3JlUmVnaXN0cnkgcmVnaXN0cnk7CisKKyAgICAvKioKKyAgICAgKiBnZXQgc2VydmVyLnhtbCBsb2NhdGlvbgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIHNlcnZlciBmaWxlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckZpbGVuYW1lKCkgeworICAgICAgICByZXR1cm4gc2VydmVyRmlsZW5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IG5ldyBzZXJ2ZXIueG1sIGxvY2F0aW9uCisgICAgICogCisgICAgICogQHBhcmFtIHN0cmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlckZpbGVuYW1lKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgc2VydmVyRmlsZW5hbWUgPSBzdHJpbmc7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIFN0b3JlUmVnaXN0cnkgd2l0aCBhbGwgZmFjdG9yeSB0byBnZW5lcmF0ZSB0aGUKKyAgICAgKiBzZXJ2ZXIueG1sL2NvbnRleHQueG1sIGZpbGVzCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5JU3RvcmVDb25maWcjZ2V0UmVnaXN0cnkoKQorICAgICAqLworICAgIHB1YmxpYyBTdG9yZVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCkgeworICAgICAgICByZXR1cm4gcmVnaXN0cnk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBzZXQgU3RvcmVSZWdpc3RyeQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25maWcuSVN0b3JlQ29uZmlnI3NldFJlZ2lzdHJ5KG9yZy5hcGFjaGUuY2F0YWxpbmEuY29uZmlnLkNvbmZpZ3VyYXRpb25SZWdpc3RyeSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWdpc3RyeShTdG9yZVJlZ2lzdHJ5IGFSZWdpc3RyeSkgeworICAgICAgICByZWdpc3RyeSA9IGFSZWdpc3RyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSBjdXJyZW50IFNlcnZlcgorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2ZXJGYWN0b3J5I2dldFNlcnZlcigpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3JlQ29uZmlnKCkgeworICAgICAgICBzdG9yZShTZXJ2ZXJGYWN0b3J5LmdldFNlcnZlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSBTZXJ2ZXIgZnJvbSBPYmplY3QgTmFtZSAoQ2F0YWxpbmE6dHlwZT1TZXJ2ZXIpCisgICAgICogCisgICAgICogQHBhcmFtIGFTZXJ2ZXJOYW1lCisgICAgICogICAgICAgICAgICBTZXJ2ZXIgT2JqZWN0TmFtZQorICAgICAqIEBwYXJhbSBiYWNrdXAKKyAgICAgKiBAcGFyYW0gZXh0ZXJuYWxBbGxvd2VkCisgICAgICogICAgICAgICAgICBzICoKKyAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcmVTZXJ2ZXIoU3RyaW5nIGFTZXJ2ZXJOYW1lLCBib29sZWFuIGJhY2t1cCwKKyAgICAgICAgICAgIGJvb2xlYW4gZXh0ZXJuYWxBbGxvd2VkKSB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhU2VydmVyTmFtZSA9PSBudWxsIHx8IGFTZXJ2ZXJOYW1lLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlBsZWFzZSwgY2FsbCB3aXRoIGEgY29ycmVjdCBzZXJ2ZXIgT2JqZWN0TmFtZSEiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNQmVhblNlcnZlciBtc2VydmVyID0gTUJlYW5VdGlscy5jcmVhdGVTZXJ2ZXIoKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUoYVNlcnZlck5hbWUpOworICAgICAgICBpZiAobXNlcnZlci5pc1JlZ2lzdGVyZWQob2JqZWN0TmFtZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU2VydmVyIGFTZXJ2ZXIgPSAoU2VydmVyKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1hbmFnZWRSZXNvdXJjZSIpOworICAgICAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYyA9IG51bGw7CisgICAgICAgICAgICAgICAgZGVzYyA9IGdldFJlZ2lzdHJ5KCkuZmluZERlc2NyaXB0aW9uKFN0YW5kYXJkQ29udGV4dC5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIG9sZFNlcGFyYXRlID0gZGVzYy5pc1N0b3JlU2VwYXJhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvbGRCYWNrdXAgPSBkZXNjLmlzQmFja3VwKCk7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb2xkRXh0ZXJuYWxBbGxvd2VkID0gZGVzYy5pc0V4dGVybmFsQWxsb3dlZCgpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5zZXRTdG9yZVNlcGFyYXRlKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5zZXRCYWNrdXAoYmFja3VwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2Muc2V0RXh0ZXJuYWxBbGxvd2VkKGV4dGVybmFsQWxsb3dlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSgoU2VydmVyKSBhU2VydmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2Muc2V0U3RvcmVTZXBhcmF0ZShvbGRTZXBhcmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLnNldEJhY2t1cChvbGRCYWNrdXApOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5zZXRFeHRlcm5hbEFsbG93ZWQob2xkRXh0ZXJuYWxBbGxvd2VkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBzdG9yZSgoU2VydmVyKSBhU2VydmVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJPYmplY3QgIiArIGFTZXJ2ZXJOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vIGEgU2VydmVyIGluc3RhbmNlIG9yIHN0b3JlIGV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuaW5mbygiU2VydmVyICIgKyBhU2VydmVyTmFtZSArICIgbm90IGZvdW5kISIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlIGEgQ29udGV4dCBmcm9tIE9iamVjdE5hbWUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYUNvbnRleHROYW1lCisgICAgICogICAgICAgICAgICBNQmVhbiBPYmplY3ROYW1lCisgICAgICogQHBhcmFtIGJhY2t1cAorICAgICAqIEBwYXJhbSBleHRlcm5hbEFsbG93ZWQKKyAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcmVDb250ZXh0KFN0cmluZyBhQ29udGV4dE5hbWUsIGJvb2xlYW4gYmFja3VwLAorICAgICAgICAgICAgYm9vbGVhbiBleHRlcm5hbEFsbG93ZWQpIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGFDb250ZXh0TmFtZSA9PSBudWxsIHx8IGFDb250ZXh0TmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJQbGVhc2UsIGNhbGwgd2l0aCBhIGNvcnJlY3QgY29udGV4dCBPYmplY3ROYW1lISIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBNQmVhblV0aWxzLmNyZWF0ZVNlcnZlcigpOworICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZShhQ29udGV4dE5hbWUpOworICAgICAgICBpZiAobXNlcnZlci5pc1JlZ2lzdGVyZWQob2JqZWN0TmFtZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ29udGV4dCBhQ29udGV4dCA9IChDb250ZXh0KSBtc2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1hbmFnZWRSZXNvdXJjZSIpOworICAgICAgICAgICAgICAgIFN0cmluZyBjb25maWdGaWxlID0gYUNvbnRleHQuZ2V0Q29uZmlnRmlsZSgpOworICAgICAgICAgICAgICAgIGlmIChjb25maWdGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjID0gZ2V0UmVnaXN0cnkoKS5maW5kRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb250ZXh0LmdldENsYXNzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb2xkU2VwYXJhdGUgPSBkZXNjLmlzU3RvcmVTZXBhcmF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb2xkQmFja3VwID0gZGVzYy5pc0JhY2t1cCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb2xkRXh0ZXJuYWxBbGxvd2VkID0gZGVzYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzRXh0ZXJuYWxBbGxvd2VkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5zZXRTdG9yZVNlcGFyYXRlKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLnNldEJhY2t1cChiYWNrdXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLnNldEV4dGVybmFsQWxsb3dlZChleHRlcm5hbEFsbG93ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLmdldFN0b3JlRmFjdG9yeSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0b3JlKG51bGwsIC0yLCBhQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5zZXRTdG9yZVNlcGFyYXRlKG9sZFNlcGFyYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5zZXRCYWNrdXAob2xkQmFja3VwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5zZXRCYWNrdXAob2xkRXh0ZXJuYWxBbGxvd2VkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJNaXNzaW5nIGNvbmZpZ0ZpbGUgYXQgQ29udGV4dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhQ29udGV4dC5nZXRQYXRoKCkgKyAiIHRvIHN0b3JlISIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT2JqZWN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhQ29udGV4dE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vIGEgY29udGV4dCBpbnN0YW5jZSBvciBzdG9yZSBleGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5pbmZvKCJDb250ZXh0ICIgKyBhQ29udGV4dE5hbWUgKyAiIG5vdCBmb3VuZCEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBlbnRpcmUgPGNvZGU+U2VydmVyPC9jb2RlPgorICAgICAqIG91dCB0byB0aGUgc2VydmVyLnhtbCBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICogIAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9yZShTZXJ2ZXIgYVNlcnZlcikgeworCisgICAgICAgIFN0b3JlRmlsZU1vdmVyIG1vdmVyID0gbmV3IFN0b3JlRmlsZU1vdmVyKFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLCBnZXRTZXJ2ZXJGaWxlbmFtZSgpLAorICAgICAgICAgICAgICAgIGdldFJlZ2lzdHJ5KCkuZ2V0RW5jb2RpbmcoKSk7CisgICAgICAgIC8vIE9wZW4gYW4gb3V0cHV0IHdyaXRlciBmb3IgdGhlIG5ldyBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG1vdmVyLmdldFdyaXRlcigpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0b3JlKHdyaXRlciwgLTIsIGFTZXJ2ZXIpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAvLyBGbHVzaCBhbmQgY2xvc2UgdGhlIG91dHB1dCBmaWxlCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAoZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbW92ZXIubW92ZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5JU3RvcmVDb25maWcjc3RvcmUob3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0KQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9yZShDb250ZXh0IGFDb250ZXh0KSB7CisgICAgICAgIFN0cmluZyBjb25maWdGaWxlID0gYUNvbnRleHQuZ2V0Q29uZmlnRmlsZSgpOworICAgICAgICBpZiAoY29uZmlnRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYyA9IG51bGw7CisgICAgICAgICAgICAgICAgZGVzYyA9IGdldFJlZ2lzdHJ5KCkuZmluZERlc2NyaXB0aW9uKGFDb250ZXh0LmdldENsYXNzKCkpOworICAgICAgICAgICAgICAgIGlmIChkZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvbGQgPSBkZXNjLmlzU3RvcmVTZXBhcmF0ZSgpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5zZXRTdG9yZVNlcGFyYXRlKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5nZXRTdG9yZUZhY3RvcnkoKS5zdG9yZShudWxsLCAtMiwgYUNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5zZXRTdG9yZVNlcGFyYXRlKG9sZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBsb2cuZXJyb3IoIk1pc3NpbmcgY29uZmlnRmlsZSBhdCBDb250ZXh0ICIgKyBhQ29udGV4dC5nZXRQYXRoKCkpOworCisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5JU3RvcmVDb25maWcjc3RvcmUoamF2YS5pby5QcmludFdyaXRlciwKKyAgICAgKiAgICAgIGludCwgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0KQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9yZShQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LAorICAgICAgICAgICAgQ29udGV4dCBhQ29udGV4dCkgeworICAgICAgICBib29sZWFuIG9sZFNlcGFyYXRlID0gdHJ1ZTsKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbihhQ29udGV4dC5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIG9sZFNlcGFyYXRlID0gZGVzYy5pc1N0b3JlU2VwYXJhdGUoKTsKKyAgICAgICAgICAgIGRlc2Muc2V0U3RvcmVTZXBhcmF0ZShmYWxzZSk7CisgICAgICAgICAgICBkZXNjLmdldFN0b3JlRmFjdG9yeSgpLnN0b3JlKGFXcml0ZXIsIGluZGVudCwgYUNvbnRleHQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGRlc2MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkZXNjLnNldFN0b3JlU2VwYXJhdGUob2xkU2VwYXJhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5JU3RvcmVDb25maWcjc3RvcmUoamF2YS5pby5QcmludFdyaXRlciwKKyAgICAgKiAgICAgIGludCwgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0KQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9yZShQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LCBIb3N0IGFIb3N0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgYUhvc3QuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBkZXNjLmdldFN0b3JlRmFjdG9yeSgpLnN0b3JlKGFXcml0ZXIsIGluZGVudCwgYUhvc3QpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5JU3RvcmVDb25maWcjc3RvcmUoamF2YS5pby5QcmludFdyaXRlciwKKyAgICAgKiAgICAgIGludCwgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2aWNlKQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9yZShQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LAorICAgICAgICAgICAgU2VydmljZSBhU2VydmljZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjID0gZ2V0UmVnaXN0cnkoKS5maW5kRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgIGFTZXJ2aWNlLmdldENsYXNzKCkpOworICAgICAgICAgICAgZGVzYy5nZXRTdG9yZUZhY3RvcnkoKS5zdG9yZShhV3JpdGVyLCBpbmRlbnQsIGFTZXJ2aWNlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzdGF0ZSBvZiB0aGlzIFNlcnZlciBNQmVhbiAod2hpY2ggd2lsbCByZWN1cnNpdmVseSBzdG9yZQorICAgICAqIGV2ZXJ5dGhpbmcpCisgICAgICogCisgICAgICogQHBhcmFtIHdyaXRlcgorICAgICAqIEBwYXJhbSBpbmRlbnQKKyAgICAgKiBAcGFyYW0gYVNlcnZlcgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9yZShQcmludFdyaXRlciB3cml0ZXIsIGludCBpbmRlbnQsCisgICAgICAgICAgICBTZXJ2ZXIgYVNlcnZlcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjID0gZ2V0UmVnaXN0cnkoKS5maW5kRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgIGFTZXJ2ZXIuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBkZXNjLmdldFN0b3JlRmFjdG9yeSgpLnN0b3JlKHdyaXRlciwgaW5kZW50LCBhU2VydmVyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVDb25maWdMaWZlY3ljbGVMaXN0ZW5lci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVDb25maWdMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNWM2NjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUNvbmZpZ0xpZmVjeWNsZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQubW9kZWxtYmVhbi5Nb2RlbE1CZWFuOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5NQmVhblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLk1hbmFnZWRCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworCisvKioKKyAqIExvYWQgYW5kIFJlZ2lzdGVyIFN0b3JlQ29uZmlnIE1CZWFuIDxpPkNhdGFsaW5hOnR5cGU9U3RvcmVDb25maWcscmVzb3VyY2U9InVybCI8L2k+CisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqLworcHVibGljIGNsYXNzIFN0b3JlQ29uZmlnTGlmZWN5Y2xlTGlzdGVuZXIgaW1wbGVtZW50cyBMaWZlY3ljbGVMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkKKyAgICAgICAgICAgIC5nZXRMb2coU3RvcmVDb25maWdMaWZlY3ljbGVMaXN0ZW5lci5jbGFzcyk7CisKKyAgICBJU3RvcmVDb25maWcgc3RvcmVDb25maWc7CisKKyAgICBwcml2YXRlIFN0cmluZyBzdG9yZUNvbmZpZ0NsYXNzID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVDb25maWciOworCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RvcmVSZWdpc3RyeSA9IG51bGw7CisKKyAgICAvKgorICAgICAqIHJlZ2lzdGVyIFN0b3JlUmVnaXN0cnkgYWZ0ZXIgU3RhcnQgdGhlIGNvbXBsZXRlIFNlcnZlcgorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lciNsaWZlY3ljbGVFdmVudChvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV2ZW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChMaWZlY3ljbGUuQUZURVJfU1RBUlRfRVZFTlQuZXF1YWxzKGV2ZW50LmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFN0YW5kYXJkU2VydmVyKSB7CisgICAgICAgICAgICAgICAgY3JlYXRlTUJlYW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNyZWF0ZSBTdG9yZUNvbmZpZyBNQmVhbiBhbmQgbG9hZCBTdG9yZVJnaXN0cnkgTUJlYW5zIG5hbWUgaXMKKyAgICAgKiA8aT5DYXRhbGluYTp0eXBlPVN0b3JlQ29uZmlnIDwvaT4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNQmVhbigpIHsKKyAgICAgICAgU3RvcmVMb2FkZXIgbG9hZGVyID0gbmV3IFN0b3JlTG9hZGVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoZ2V0U3RvcmVDb25maWdDbGFzcygpLCB0cnVlLCB0aGlzCisgICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgc3RvcmVDb25maWcgPSAoSVN0b3JlQ29uZmlnKSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgaWYgKG51bGwgPT0gZ2V0U3RvcmVSZWdpc3RyeSgpKQorICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgTG9hZGluZworICAgICAgICAgICAgICAgIGxvYWRlci5sb2FkKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgLy8gbG9hZCBhIHNwZXppYWwgZmlsZSByZWdpc3RyeSAodXJsKQorICAgICAgICAgICAgICAgIGxvYWRlci5sb2FkKGdldFN0b3JlUmVnaXN0cnkoKSk7CisgICAgICAgICAgICAvLyB1c2UgdGhlIGxvYWRlciBSZWdpc3RyeQorICAgICAgICAgICAgc3RvcmVDb25maWcuc2V0UmVnaXN0cnkobG9hZGVyLmdldFJlZ2lzdHJ5KCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJjcmVhdGVNQmVhbiBsb2FkIiwgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IE1CZWFuVXRpbHMuY3JlYXRlU2VydmVyKCk7CisgICAgICAgIElucHV0U3RyZWFtIGRlc2NyaXB0b3IgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUoIkNhdGFsaW5hOnR5cGU9U3RvcmVDb25maWciICk7CisgICAgICAgICAgICBpZiAoIW1zZXJ2ZXIuaXNSZWdpc3RlcmVkKG9iamVjdE5hbWUpKSB7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgIm1iZWFucy1kZXNjcmlwdG9ycy54bWwiKTsKKyAgICAgICAgICAgICAgICBSZWdpc3RyeSByZWdpc3RyeSA9IE1CZWFuVXRpbHMuY3JlYXRlUmVnaXN0cnkoKTsKKyAgICAgICAgICAgICAgICByZWdpc3RyeS5sb2FkTWV0YWRhdGEoZGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgbXNlcnZlci5yZWdpc3Rlck1CZWFuKGdldE1hbmFnZWRCZWFuKHN0b3JlQ29uZmlnKSwgb2JqZWN0TmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJjcmVhdGVNQmVhbiByZWdpc3RlciBNQmVhbiIsIGV4KTsKKworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IG51bGw7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiY3JlYXRlTUJlYW4gcmVnaXN0ZXIgTUJlYW4iLCBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgTWFuYWdlZEJlYW4gKFN0b3JlQ29uZmlnKQorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmplY3QKKyAgICAgKiBAcmV0dXJuIFRoZSBiZWFuCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTW9kZWxNQmVhbiBnZXRNYW5hZ2VkQmVhbihPYmplY3Qgb2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZEJlYW4gPSBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKQorICAgICAgICAgICAgICAgIC5maW5kTWFuYWdlZEJlYW4ob2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIG1hbmFnZWRCZWFuLmNyZWF0ZU1CZWFuKG9iamVjdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzdG9yZUNvbmZpZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSVN0b3JlQ29uZmlnIGdldFN0b3JlQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gc3RvcmVDb25maWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHN0b3JlQ29uZmlnCisgICAgICogICAgICAgICAgICBUaGUgc3RvcmVDb25maWcgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlQ29uZmlnKElTdG9yZUNvbmZpZyBzdG9yZUNvbmZpZykgeworICAgICAgICB0aGlzLnN0b3JlQ29uZmlnID0gc3RvcmVDb25maWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzdG9yZUNvbmZpZ0NsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmVDb25maWdDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIHN0b3JlQ29uZmlnQ2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHN0b3JlQ29uZmlnQ2xhc3MKKyAgICAgKiAgICAgICAgICAgIFRoZSBzdG9yZUNvbmZpZ0NsYXNzIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdG9yZUNvbmZpZ0NsYXNzKFN0cmluZyBzdG9yZUNvbmZpZ0NsYXNzKSB7CisgICAgICAgIHRoaXMuc3RvcmVDb25maWdDbGFzcyA9IHN0b3JlQ29uZmlnQ2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzdG9yZVJlZ2lzdHJ5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmVSZWdpc3RyeSgpIHsKKyAgICAgICAgcmV0dXJuIHN0b3JlUmVnaXN0cnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHN0b3JlUmVnaXN0cnkKKyAgICAgKiAgICAgICAgICAgIFRoZSBzdG9yZVJlZ2lzdHJ5IHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdG9yZVJlZ2lzdHJ5KFN0cmluZyBzdG9yZVJlZ2lzdHJ5KSB7CisgICAgICAgIHRoaXMuc3RvcmVSZWdpc3RyeSA9IHN0b3JlUmVnaXN0cnk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVDb250ZXh0QXBwZW5kZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlQ29udGV4dEFwcGVuZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyNzE3NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlQ29udGV4dEFwcGVuZGVyLmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdDsKKworLyoqCisgKiBzdG9yZSBTdGFuZGFyZENvbnRleHQgQXR0cmlidXRlcyAuLi4gCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqICAKKyAqLworcHVibGljIGNsYXNzIFN0b3JlQ29udGV4dEFwcGVuZGVyIGV4dGVuZHMgU3RvcmVBcHBlbmRlciB7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gd3JpdGVyCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqIEBwYXJhbSBiZWFuCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZQorICAgICAqIEBwYXJhbSBiZWFuMgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByaW50QXR0cmlidXRlKFByaW50V3JpdGVyIHdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGJlYW4sIFN0b3JlRGVzY3JpcHRpb24gZGVzYywgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIE9iamVjdCBiZWFuMiwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmIChpc1ByaW50VmFsdWUoYmVhbiwgYmVhbjIsIGF0dHJpYnV0ZU5hbWUsIGRlc2MpKSB7CisgICAgICAgICAgICBpZihhdHRyaWJ1dGVOYW1lLmVxdWFscygiZG9jQmFzZSIpKSB7CisgICAgICAgICAgICAgICAgaWYoYmVhbiBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZG9jQmFzZSA9ICgoU3RhbmRhcmRDb250ZXh0KWJlYW4pLmdldE9yaWdpbmFsRG9jQmFzZSgpIDsKKyAgICAgICAgICAgICAgICAgICAgaWYoZG9jQmFzZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkb2NCYXNlIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludFZhbHVlKHdyaXRlciwgaW5kZW50LCBhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFByaW50IENvbnRleHQgVmFsdWVzLiA8dWw+PGxpPiBTcGV6aWFsIGhhbmRsaW5nIHRvIGRlZmF1bHQgd29ya0Rpci4KKyAgICAgKiA8L2xpPjxsaT4gRG9uJ3Qgc2F2ZSBwYXRoIGF0IGV4dGVybmFsIGNvbnRleHQueG1sIDwvbGk+PGxpPiBEb24ndAorICAgICAqIGdlbmVyYXRlIGRvY0Jhc2UgZm9yIGhvc3QuYXBwQmFzZSB3ZWJhcHBzIDxMST48L3VsPgorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25maWcuU3RvcmVBcHBlbmRlciNpc1ByaW50VmFsdWUoamF2YS5sYW5nLk9iamVjdCwKKyAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsCisgICAgICogICAgICBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5TdG9yZURlc2NyaXB0aW9uKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbnRWYWx1ZShPYmplY3QgYmVhbiwgT2JqZWN0IGJlYW4yLCBTdHJpbmcgYXR0ck5hbWUsCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2MpIHsKKyAgICAgICAgYm9vbGVhbiBpc1ByaW50ID0gc3VwZXIuaXNQcmludFZhbHVlKGJlYW4sIGJlYW4yLCBhdHRyTmFtZSwgZGVzYyk7CisgICAgICAgIGlmIChpc1ByaW50KSB7CisgICAgICAgICAgICBTdGFuZGFyZENvbnRleHQgY29udGV4dCA9ICgoU3RhbmRhcmRDb250ZXh0KSBiZWFuKTsKKyAgICAgICAgICAgIGlmICgid29ya0RpciIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0V29ya0RpciA9IGdldERlZmF1bHRXb3JrRGlyKGNvbnRleHQpOworICAgICAgICAgICAgICAgIGlzUHJpbnQgPSAhZGVmYXVsdFdvcmtEaXIuZXF1YWxzKGNvbnRleHQuZ2V0V29ya0RpcigpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoInBhdGgiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpc1ByaW50ID0gZGVzYy5pc1N0b3JlU2VwYXJhdGUoKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkZXNjLmlzRXh0ZXJuYWxBbGxvd2VkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjb250ZXh0LmdldENvbmZpZ0ZpbGUoKSA9PSBudWxsOworICAgICAgICAgICAgfSBlbHNlIGlmICgiZG9jQmFzZSIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIENvbnRhaW5lciBob3N0ID0gY29udGV4dC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoaG9zdCBpbnN0YW5jZW9mIFN0YW5kYXJkSG9zdCkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGFwcEJhc2UgPSBnZXRBcHBCYXNlKCgoU3RhbmRhcmRIb3N0KSBob3N0KSk7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZG9jQmFzZSA9IGdldERvY0Jhc2UoY29udGV4dCxhcHBCYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgaXNQcmludCA9ICFhcHBCYXNlLmVxdWFscyhkb2NCYXNlLmdldFBhcmVudEZpbGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpc1ByaW50OworICAgIH0KKworICAgIHByb3RlY3RlZCBGaWxlIGdldEFwcEJhc2UoU3RhbmRhcmRIb3N0IGhvc3QpIHsKKworICAgICAgICBGaWxlIGFwcEJhc2U7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGhvc3QuZ2V0QXBwQmFzZSgpKTsKKyAgICAgICAgaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkKKyAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwgaG9zdAorICAgICAgICAgICAgICAgICAgICAuZ2V0QXBwQmFzZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFwcEJhc2UgPSBmaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXBwQmFzZSA9IGZpbGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChhcHBCYXNlKTsKKworICAgIH0KKworICAgIHByb3RlY3RlZCBGaWxlIGdldERvY0Jhc2UoU3RhbmRhcmRDb250ZXh0IGNvbnRleHQsIEZpbGUgYXBwQmFzZSkgeworCisgICAgICAgIEZpbGUgZG9jQmFzZTsKKyAgICAgICAgU3RyaW5nIGNvbnRleHREb2NCYXNlID0gY29udGV4dC5nZXRPcmlnaW5hbERvY0Jhc2UoKSA7CisgICAgICAgIGlmKGNvbnRleHREb2NCYXNlID09IG51bGwpCisgICAgICAgICAgICBjb250ZXh0RG9jQmFzZSA9IGNvbnRleHQuZ2V0RG9jQmFzZSgpIDsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoY29udGV4dERvY0Jhc2UpOworICAgICAgICBpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKQorICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGFwcEJhc2UsIGNvbnRleHREb2NCYXNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRvY0Jhc2UgPSBmaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZG9jQmFzZSA9IGZpbGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChkb2NCYXNlKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2UgZGVmYXVsdCBXb3JrIERpci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBjb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFdvcmtEaXIoU3RhbmRhcmRDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgU3RyaW5nIGRlZmF1bHRXb3JrRGlyID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGNvbnRleHRQYXRoID0gY29udGV4dC5nZXRQYXRoKCkubGVuZ3RoKCkgPT0gMCA/ICJfIiA6IGNvbnRleHQKKyAgICAgICAgICAgICAgICAuZ2V0UGF0aCgpLnN1YnN0cmluZygxKTsKKyAgICAgICAgQ29udGFpbmVyIGhvc3QgPSBjb250ZXh0LmdldFBhcmVudCgpOworICAgICAgICBpZiAoaG9zdCBpbnN0YW5jZW9mIFN0YW5kYXJkSG9zdCkgeworICAgICAgICAgICAgU3RyaW5nIGhvc3RXb3JrRGlyID0gKChTdGFuZGFyZEhvc3QpIGhvc3QpLmdldFdvcmtEaXIoKTsKKyAgICAgICAgICAgIGlmIChob3N0V29ya0RpciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFdvcmtEaXIgPSBob3N0V29ya0RpciArIEZpbGUuc2VwYXJhdG9yICsgY29udGV4dFBhdGg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZyBlbmdpbmVOYW1lID0gY29udGV4dC5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gY29udGV4dC5nZXRQYXJlbnQoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgZGVmYXVsdFdvcmtEaXIgPSAid29yayIgKyBGaWxlLnNlcGFyYXRvciArIGVuZ2luZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyBob3N0TmFtZSArIEZpbGUuc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnRleHRQYXRoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkZWZhdWx0V29ya0RpcjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEdlbmVyYXRlIGEgcmVhbCBkZWZhdWx0IFN0YW5kYXJkQ29udGV4dCBUT0RPIHJlYWQgYW5kIGludGVycHJldCB0aGUKKyAgICAgKiBkZWZhdWx0IGNvbnRleHQueG1sIGFuZCBjb250ZXh0LnhtbC5kZWZhdWx0IFRPRE8gQ2FjaGUgYSBEZWZhdWx0CisgICAgICogU3RhbmRhcmRDb250ZXh0ICggd2l0aCByZWxvYWRpbmcgc3RyYXRlZ3kpIFRPRE8gcmVtb3ZlIHJlYWxseSBhbGwKKyAgICAgKiBlbGVtZW50cywgYnV0IGRldGVjdGlvbiBpcyBoYXJkLi4uIFRvIExpc3RlbmVyIG9yIFZhbHZlIGZyb20gc2FtZSBjbGFzcz8+CisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlQXBwZW5kZXIjZGVmYXVsdEluc3RhbmNlKGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBkZWZhdWx0SW5zdGFuY2UoT2JqZWN0IGJlYW4pIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChiZWFuIGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KSB7CisgICAgICAgICAgICBTdGFuZGFyZENvbnRleHQgZGVmYXVsdENvbnRleHQgPSBuZXcgU3RhbmRhcmRDb250ZXh0KCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogaWYgKCEoKFN0YW5kYXJkQ29udGV4dCkgYmVhbikuZ2V0T3ZlcnJpZGUoKSkgeworICAgICAgICAgICAgICogZGVmYXVsdENvbnRleHQuc2V0UGFyZW50KCgoU3RhbmRhcmRDb250ZXh0KWJlYW4pLmdldFBhcmVudCgpKTsKKyAgICAgICAgICAgICAqIENvbnRleHRDb25maWcgY29udGV4dENvbmZpZyA9IG5ldyBDb250ZXh0Q29uZmlnKCk7CisgICAgICAgICAgICAgKiBkZWZhdWx0Q29udGV4dC5hZGRMaWZlY3ljbGVMaXN0ZW5lcihjb250ZXh0Q29uZmlnKTsKKyAgICAgICAgICAgICAqIGNvbnRleHRDb25maWcuc2V0Q29udGV4dChkZWZhdWx0Q29udGV4dCk7CisgICAgICAgICAgICAgKiBjb250ZXh0Q29uZmlnLnByb2Nlc3NDb250ZXh0Q29uZmlnKG5ldyBGaWxlKGNvbnRleHRDb25maWcKKyAgICAgICAgICAgICAqIC5nZXRCYXNlRGlyKCksICJjb25mL2NvbnRleHQueG1sIikpOworICAgICAgICAgICAgICogY29udGV4dENvbmZpZy5wcm9jZXNzQ29udGV4dENvbmZpZyhuZXcgRmlsZShjb250ZXh0Q29uZmlnCisgICAgICAgICAgICAgKiAuZ2V0Q29uZmlnQmFzZSgpLCAiY29udGV4dC54bWwuZGVmYXVsdCIpKTsgfQorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdENvbnRleHQ7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRlZmF1bHRJbnN0YW5jZShiZWFuKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZURlc2NyaXB0aW9uLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZURlc2NyaXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY0ZTNlMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlRGVzY3JpcHRpb24uamF2YQpAQCAtMCwwICsxLDM2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQmVhbiBvZiBhIFN0b3JlRGVzY3JpcHRpb24gCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoIAorICogCisgKiA8cHJlPgorICogCisgKiAgJmx0O0Rlc2NyaXB0aW9uCisgKiAgdGFnPSZxdW90O0NvbnRleHQmcXVvdDsKKyAqICBzdGFuZGFyZD0mcXVvdDt0cnVlJnF1b3Q7CisgKiAgZGVmYXVsdD0mcXVvdDt0cnVlJnF1b3Q7IAorICogIGV4dGVybmFsQWxsb3dlZD0mcXVvdDt0cnVlJnF1b3Q7IAorICogIHN0b3JlU2VwYXJhdGU9JnF1b3Q7dHJ1ZSZxdW90OworICogIGJhY2t1cD0mcXVvdDt0cnVlJnF1b3Q7IAorICogIGNoaWxkcz0mcXVvdDt0cnVlJnF1b3Q7CisgKiAgdGFnQ2xhc3M9JnF1b3Q7b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dCZxdW90OworICogIHN0b3JlRmFjdG9yeUNsYXNzPSZxdW90O29yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RhbmRhcmRDb250ZXh0U0YmcXVvdDsKKyAqICBzdG9yZUFwcGVuZGVyQ2xhc3M9JnF1b3Q7b3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUNvbnRleHRBcHBlbmRlciZxdW90OyZndDsKKyAqICAgICAmbHQ7VHJhbnNpZW50QXR0cmlidXRlJmd0O2F2YWlsYWJsZSZsdDsvVHJhbnNpZW50QXR0cmlidXRlJmd0OworICogICAgICZsdDtUcmFuc2llbnRBdHRyaWJ1dGUmZ3Q7Y29uZmlnRmlsZSZsdDsvVHJhbnNpZW50QXR0cmlidXRlJmd0OworICogICAgICZsdDtUcmFuc2llbnRBdHRyaWJ1dGUmZ3Q7Y29uZmlndXJlZCZsdDsvVHJhbnNpZW50QXR0cmlidXRlJmd0OworICogICAgICZsdDtUcmFuc2llbnRBdHRyaWJ1dGUmZ3Q7ZGlzcGxheU5hbWUmbHQ7L1RyYW5zaWVudEF0dHJpYnV0ZSZndDsKKyAqICAgICAmbHQ7VHJhbnNpZW50QXR0cmlidXRlJmd0O2Rpc3RyaWJ1dGFibGUmbHQ7L1RyYW5zaWVudEF0dHJpYnV0ZSZndDsKKyAqICAgICAmbHQ7VHJhbnNpZW50QXR0cmlidXRlJmd0O2RvbWFpbiZsdDsvVHJhbnNpZW50QXR0cmlidXRlJmd0OworICogICAgICZsdDtUcmFuc2llbnRBdHRyaWJ1dGUmZ3Q7ZW5naW5lTmFtZSZsdDsvVHJhbnNpZW50QXR0cmlidXRlJmd0OworICogICAgICZsdDtUcmFuc2llbnRBdHRyaWJ1dGUmZ3Q7bmFtZSZsdDsvVHJhbnNpZW50QXR0cmlidXRlJmd0OworICogICAgICZsdDtUcmFuc2llbnRBdHRyaWJ1dGUmZ3Q7cHVibGljSWQmbHQ7L1RyYW5zaWVudEF0dHJpYnV0ZSZndDsKKyAqICAgICAmbHQ7VHJhbnNpZW50QXR0cmlidXRlJmd0O3JlcGxhY2VXZWxjb21lRmlsZXMmbHQ7L1RyYW5zaWVudEF0dHJpYnV0ZSZndDsKKyAqICAgICAmbHQ7VHJhbnNpZW50QXR0cmlidXRlJmd0O3NhdmVDb25maWcmbHQ7L1RyYW5zaWVudEF0dHJpYnV0ZSZndDsKKyAqICAgICAmbHQ7VHJhbnNpZW50QXR0cmlidXRlJmd0O3Nlc3Npb25UaW1lb3V0Jmx0Oy9UcmFuc2llbnRBdHRyaWJ1dGUmZ3Q7CisgKiAgICAgJmx0O1RyYW5zaWVudEF0dHJpYnV0ZSZndDtzdGFydHVwVGltZSZsdDsvVHJhbnNpZW50QXR0cmlidXRlJmd0OworICogICAgICZsdDtUcmFuc2llbnRBdHRyaWJ1dGUmZ3Q7dGxkU2NhblRpbWUmbHQ7L1RyYW5zaWVudEF0dHJpYnV0ZSZndDsKKyAqICAmbHQ7L0Rlc2NyaXB0aW9uJmd0OworICogCisgKiAgCisgKiA8L3ByZT4KKyAqLworcHVibGljIGNsYXNzIFN0b3JlRGVzY3JpcHRpb24geworCisgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7CisKKyAgICBwcml2YXRlIFN0cmluZyB0YWc7CisKKyAgICBwcml2YXRlIFN0cmluZyB0YWdDbGFzczsKKworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFuZGFyZCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBib29sZWFuIGJhY2t1cCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBib29sZWFuIGV4dGVybmFsQWxsb3dlZCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBib29sZWFuIG15RGVmYXVsdCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBib29sZWFuIGF0dHJpYnV0ZXMgPSB0cnVlOworCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RvcmVGYWN0b3J5Q2xhc3M7CisKKyAgICBwcml2YXRlIElTdG9yZUZhY3Rvcnkgc3RvcmVGYWN0b3J5OworCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RvcmVXcml0ZXJDbGFzczsKKworICAgIHByaXZhdGUgYm9vbGVhbiBjaGlsZHMgPSBmYWxzZTsKKworICAgIHByaXZhdGUgTGlzdCB0cmFuc2llbnRBdHRyaWJ1dGVzOworCisgICAgcHJpdmF0ZSBMaXN0IHRyYW5zaWVudENoaWxkczsKKworICAgIHByaXZhdGUgYm9vbGVhbiBzdG9yZVNlcGFyYXRlID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4dGVybmFsLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWxBbGxvd2VkKCkgeworICAgICAgICByZXR1cm4gZXh0ZXJuYWxBbGxvd2VkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBleHRlcm5hbAorICAgICAqICAgICAgICAgICAgVGhlIGV4dGVybmFsIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbEFsbG93ZWQoYm9vbGVhbiBleHRlcm5hbCkgeworICAgICAgICB0aGlzLmV4dGVybmFsQWxsb3dlZCA9IGV4dGVybmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RhbmRhcmQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGFuZGFyZCgpIHsKKyAgICAgICAgcmV0dXJuIHN0YW5kYXJkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBzdGFuZGFyZAorICAgICAqICAgICAgICAgICAgVGhlIHN0YW5kYXJkIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFuZGFyZChib29sZWFuIHN0YW5kYXJkKSB7CisgICAgICAgIHRoaXMuc3RhbmRhcmQgPSBzdGFuZGFyZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGJhY2t1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0JhY2t1cCgpIHsKKyAgICAgICAgcmV0dXJuIGJhY2t1cDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYmFja3VwCisgICAgICogICAgICAgICAgICBUaGUgYmFja3VwIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrdXAoYm9vbGVhbiBiYWNrdXApIHsKKyAgICAgICAgdGhpcy5iYWNrdXAgPSBiYWNrdXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBteURlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgeworICAgICAgICByZXR1cm4gbXlEZWZhdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhRGVmYXVsdAorICAgICAqICAgICAgICAgICAgVGhlIG15RGVmYXVsdCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChib29sZWFuIGFEZWZhdWx0KSB7CisgICAgICAgIHRoaXMubXlEZWZhdWx0ID0gYURlZmF1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzdG9yZUZhY3RvcnkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdG9yZUZhY3RvcnlDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIHN0b3JlRmFjdG9yeUNsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBzdG9yZUZhY3RvcnlDbGFzcworICAgICAqICAgICAgICAgICAgVGhlIHN0b3JlRmFjdG9yeSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RvcmVGYWN0b3J5Q2xhc3MoU3RyaW5nIHN0b3JlRmFjdG9yeUNsYXNzKSB7CisgICAgICAgIHRoaXMuc3RvcmVGYWN0b3J5Q2xhc3MgPSBzdG9yZUZhY3RvcnlDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0b3JlRmFjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSVN0b3JlRmFjdG9yeSBnZXRTdG9yZUZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBzdG9yZUZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHN0b3JlRmFjdG9yeQorICAgICAqICAgICAgICAgICAgVGhlIHN0b3JlRmFjdG9yeSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RvcmVGYWN0b3J5KElTdG9yZUZhY3Rvcnkgc3RvcmVGYWN0b3J5KSB7CisgICAgICAgIHRoaXMuc3RvcmVGYWN0b3J5ID0gc3RvcmVGYWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RvcmVXcml0ZXJDbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JlV3JpdGVyQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBzdG9yZVdyaXRlckNsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBzdG9yZVdyaXRlckNsYXNzCisgICAgICogICAgICAgICAgICBUaGUgc3RvcmVXcml0ZXJDbGFzcyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RvcmVXcml0ZXJDbGFzcyhTdHJpbmcgc3RvcmVXcml0ZXJDbGFzcykgeworICAgICAgICB0aGlzLnN0b3JlV3JpdGVyQ2xhc3MgPSBzdG9yZVdyaXRlckNsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGFnQ2xhc3MuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUYWcoKSB7CisgICAgICAgIHJldHVybiB0YWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHRhZworICAgICAqICAgICAgICAgICAgVGhlIHRhZyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFnKFN0cmluZyB0YWcpIHsKKyAgICAgICAgdGhpcy50YWcgPSB0YWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0YWdDbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhZ0NsYXNzKCkgeworICAgICAgICByZXR1cm4gdGFnQ2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHRhZ0NsYXNzCisgICAgICogICAgICAgICAgICBUaGUgdGFnQ2xhc3MgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhZ0NsYXNzKFN0cmluZyB0YWdDbGFzcykgeworICAgICAgICB0aGlzLnRhZ0NsYXNzID0gdGFnQ2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0cmFuc2llbnRBdHRyaWJ1dGVzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldFRyYW5zaWVudEF0dHJpYnV0ZXMoKSB7CisgICAgICAgIHJldHVybiB0cmFuc2llbnRBdHRyaWJ1dGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB0cmFuc2llbnRBdHRyaWJ1dGVzCisgICAgICogICAgICAgICAgICBUaGUgdHJhbnNpZW50QXR0cmlidXRlcyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNpZW50QXR0cmlidXRlcyhMaXN0IHRyYW5zaWVudEF0dHJpYnV0ZXMpIHsKKyAgICAgICAgdGhpcy50cmFuc2llbnRBdHRyaWJ1dGVzID0gdHJhbnNpZW50QXR0cmlidXRlczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRUcmFuc2llbnRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSkgeworICAgICAgICBpZiAodHJhbnNpZW50QXR0cmlidXRlcyA9PSBudWxsKQorICAgICAgICAgICAgdHJhbnNpZW50QXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgdHJhbnNpZW50QXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVUcmFuc2llbnRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSkgeworICAgICAgICBpZiAodHJhbnNpZW50QXR0cmlidXRlcyAhPSBudWxsKQorICAgICAgICAgICAgdHJhbnNpZW50QXR0cmlidXRlcy5yZW1vdmUoYXR0cmlidXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRyYW5zaWVudENoaWxkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRUcmFuc2llbnRDaGlsZHMoKSB7CisgICAgICAgIHJldHVybiB0cmFuc2llbnRDaGlsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHRyYW5zaWVudENoaWxkcworICAgICAqICAgICAgICAgICAgVGhlIHRyYW5zaWVudENoaWxkcyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNpZW50Q2hpbGRzKExpc3QgdHJhbnNpZW50Q2hpbGRzKSB7CisgICAgICAgIHRoaXMudHJhbnNpZW50Q2hpbGRzID0gdHJhbnNpZW50Q2hpbGRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFRyYW5zaWVudENoaWxkKFN0cmluZyBjbGFzc25hbWUpIHsKKyAgICAgICAgaWYgKHRyYW5zaWVudENoaWxkcyA9PSBudWxsKQorICAgICAgICAgICAgdHJhbnNpZW50Q2hpbGRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB0cmFuc2llbnRDaGlsZHMuYWRkKGNsYXNzbmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVHJhbnNpZW50Q2hpbGQoU3RyaW5nIGNsYXNzbmFtZSkgeworICAgICAgICBpZiAodHJhbnNpZW50Q2hpbGRzICE9IG51bGwpCisgICAgICAgICAgICB0cmFuc2llbnRDaGlsZHMucmVtb3ZlKGNsYXNzbmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaXMgY2hpbGQgdHJhbnNpZW50LCBwbGVhc2UgZG9uJ3Qgc2F2ZSB0aGlzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjbGFzc25hbWUKKyAgICAgKiBAcmV0dXJuIGlzIGNsYXNzbmFtZSBhdHRyaWJ1dGU/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNUcmFuc2llbnRDaGlsZChTdHJpbmcgY2xhc3NuYW1lKSB7CisgICAgICAgIGlmICh0cmFuc2llbnRDaGlsZHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2llbnRDaGlsZHMuY29udGFpbnMoY2xhc3NuYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlzIGF0dHJpYnV0ZSB0cmFuc2llbnQsIHBsZWFzZSBkb24ndCBzYXZlIHRoaXMuCisgICAgICogCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZQorICAgICAqIEByZXR1cm4gaXMgdHJhbnNpZW50IGF0dHJpYnV0ZT8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlKSB7CisgICAgICAgIGlmICh0cmFuc2llbnRBdHRyaWJ1dGVzICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdHJhbnNpZW50QXR0cmlidXRlcy5jb250YWlucyhhdHRyaWJ1dGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZWFsIGlkIG9yIFRhZ0NsYXNzCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICBpZiAoaWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGdldFRhZ0NsYXNzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGlkCisgICAgICogICAgICAgICAgICBUaGUgaWQgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlcygpIHsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMKKyAgICAgKiAgICAgICAgICAgIFRoZSBhdHRyaWJ1dGVzIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKGJvb2xlYW4gYXR0cmlidXRlcykgeworICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBpdCdzIGEgc2VwYXJhdGUgc3RvcmUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0b3JlU2VwYXJhdGUoKSB7CisgICAgICAgIHJldHVybiBzdG9yZVNlcGFyYXRlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlU2VwYXJhdGUoYm9vbGVhbiBzdG9yZVNlcGFyYXRlKSB7CisgICAgICAgIHRoaXMuc3RvcmVTZXBhcmF0ZSA9IHN0b3JlU2VwYXJhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjaGlsZHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGlsZHMoKSB7CisgICAgICAgIHJldHVybiBjaGlsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGNoaWxkcworICAgICAqICAgICAgICAgICAgVGhlIGNoaWxkcyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hpbGRzKGJvb2xlYW4gY2hpbGRzKSB7CisgICAgICAgIHRoaXMuY2hpbGRzID0gY2hpbGRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlRmFjdG9yeUJhc2UuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlRmFjdG9yeUJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTVjMzI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVGYWN0b3J5QmFzZS5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKy8qKgorICogU3RvcmVGYWN0b3J5IHNhdmVzIHNwZXppYWwgZWxlbWVudHMuCisgKiBPdXRwdXQgd2FzIGdlbmVyYXRlIHdpdGggU3RvcmVBcHBlbmRlcnMuCisgKiAKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqIEB2ZXJzaW9uIDEuMAorICogIAorICovCitwdWJsaWMgY2xhc3MgU3RvcmVGYWN0b3J5QmFzZSBpbXBsZW1lbnRzIElTdG9yZUZhY3RvcnkgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTdG9yZUZhY3RvcnlCYXNlLmNsYXNzKTsKKworICAgIHByaXZhdGUgU3RvcmVSZWdpc3RyeSByZWdpc3RyeTsKKworICAgIHByaXZhdGUgU3RvcmVBcHBlbmRlciBzdG9yZUFwcGVuZGVyID0gbmV3IFN0b3JlQXBwZW5kZXIoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nTWFuYWdlciBzbSA9IFN0cmluZ01hbmFnZXIKKyAgICAgICAgICAgIC5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBzdHJpbmcgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jb25maWcuU3RvcmVGYWN0b3J5QmFzZS8xLjAiOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgRmFjb3RyeSBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RvcmVBcHBlbmRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RvcmVBcHBlbmRlciBnZXRTdG9yZUFwcGVuZGVyKCkgeworICAgICAgICByZXR1cm4gc3RvcmVBcHBlbmRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc3RvcmVBcHBlbmRlcgorICAgICAqICAgICAgICAgICAgVGhlIHN0b3JlQXBwZW5kZXIgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlQXBwZW5kZXIoU3RvcmVBcHBlbmRlciBzdG9yZUFwcGVuZGVyKSB7CisgICAgICAgIHRoaXMuc3RvcmVBcHBlbmRlciA9IHN0b3JlQXBwZW5kZXI7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBzZXQgUmVnaXN0cnkKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29uZmlnLklTdG9yZUZhY3Rvcnkjc2V0UmVnaXN0cnkob3JnLmFwYWNoZS5jYXRhbGluYS5jb25maWcuQ29uZmlndXJhdGlvblJlZ2lzdHJ5KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZ2lzdHJ5KFN0b3JlUmVnaXN0cnkgYVJlZ2lzdHJ5KSB7CisgICAgICAgIHJlZ2lzdHJ5ID0gYVJlZ2lzdHJ5OworCisgICAgfQorCisgICAgLyoKKyAgICAgKiBnZXQgUmVnaXN0cnkKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29uZmlnLklTdG9yZUZhY3RvcnkjZ2V0UmVnaXN0cnkoKQorICAgICAqLworICAgIHB1YmxpYyBTdG9yZVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCkgeworCisgICAgICAgIHJldHVybiByZWdpc3RyeTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZVhNTEhlYWQoUHJpbnRXcml0ZXIgYVdyaXRlcikgeworICAgICAgICAvLyBTdG9yZSB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgZWxlbWVudAorICAgICAgICBhV3JpdGVyLnByaW50KCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiKTsKKyAgICAgICAgYVdyaXRlci5wcmludChnZXRSZWdpc3RyeSgpLmdldEVuY29kaW5nKCkpOworICAgICAgICBhV3JpdGVyLnByaW50bG4oIlwiPz4iKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFN0b3JlIGEgc2VydmVyLnhtbCBlbGVtZW50IHdpdGggYXR0cmlidXRlcyBhbmQgY2hpbGRzCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLklTdG9yZUZhY3Rvcnkjc3RvcmUoamF2YS5pby5QcmludFdyaXRlciwKKyAgICAgKiAgICAgIGludCwgamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZShQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LCBPYmplY3QgYUVsZW1lbnQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGVsZW1lbnREZXNjID0gZ2V0UmVnaXN0cnkoKS5maW5kRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgYUVsZW1lbnQuZ2V0Q2xhc3MoKSk7CisKKyAgICAgICAgaWYgKGVsZW1lbnREZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJmYWN0b3J5LnN0b3JlVGFnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnREZXNjLmdldFRhZygpLCBhRWxlbWVudCkpOworICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50SW5kZW50KGFXcml0ZXIsIGluZGVudCArIDIpOworICAgICAgICAgICAgaWYgKCFlbGVtZW50RGVzYy5pc0NoaWxkcygpKSB7CisgICAgICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50VGFnKGFXcml0ZXIsIGluZGVudCwgYUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RGVzYyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdldFN0b3JlQXBwZW5kZXIoKS5wcmludE9wZW5UYWcoYVdyaXRlciwgaW5kZW50ICsgMiwgYUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RGVzYyk7CisgICAgICAgICAgICAgICAgc3RvcmVDaGlsZHMoYVdyaXRlciwgaW5kZW50ICsgMiwgYUVsZW1lbnQsIGVsZW1lbnREZXNjKTsKKyAgICAgICAgICAgICAgICBnZXRTdG9yZUFwcGVuZGVyKCkucHJpbnRJbmRlbnQoYVdyaXRlciwgaW5kZW50ICsgMik7CisgICAgICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50Q2xvc2VUYWcoYVdyaXRlciwgZWxlbWVudERlc2MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiZmFjdG9yeS5zdG9yZU5vRGVzY3JpcHRvciIsIGFFbGVtZW50CisgICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzcygpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTXVzdCBJbXBsZW1lbnQgYXQgc3ViY2xhc3MgZm9yIHNlcHppYWwgc3RvcmUgY2hpbGRzIGhhbmRsaW5nCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIKKyAgICAgKiBAcGFyYW0gaW5kZW50CisgICAgICogQHBhcmFtIGFFbGVtZW50CisgICAgICogQHBhcmFtIGVsZW1lbnREZXNjCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmVDaGlsZHMoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFFbGVtZW50LAorICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBlbGVtZW50RGVzYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmUgb25seSBlbGVtZW50cyBmcm9tIHN0b3JlQ2hpbGRzIG1ldGhvZHMgdGhhdCBhcmUgbm90IGEgdHJhbnNpZW50CisgICAgICogY2hpbGQuCisgICAgICogCisgICAgICogQHBhcmFtIGFXcml0ZXIgY3VycmVudCBvdXRwdXQgd3JpdGVyCisgICAgICogQHBhcmFtIGluZGVudCBpbmRlbnRhdGlvbiBsZXZlbAorICAgICAqIEBwYXJhbSBhVGFnRWxlbWVudCBjdXJyZW50IHRvbWNhdCBlbGVtZW50CisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzdG9yZUVsZW1lbnQoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwKKyAgICAgICAgICAgIE9iamVjdCBhVGFnRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhVGFnRWxlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBJU3RvcmVGYWN0b3J5IGVsZW1lbnRGYWN0b3J5ID0gZ2V0UmVnaXN0cnkoKS5maW5kU3RvcmVGYWN0b3J5KAorICAgICAgICAgICAgICAgICAgICBhVGFnRWxlbWVudC5nZXRDbGFzcygpKTsKKworICAgICAgICAgICAgaWYgKGVsZW1lbnRGYWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2MgPSBnZXRSZWdpc3RyeSgpLmZpbmREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGFUYWdFbGVtZW50LmdldENsYXNzKCkpOworICAgICAgICAgICAgICAgIGlmICghZGVzYy5pc1RyYW5zaWVudENoaWxkKGFUYWdFbGVtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZhY3Rvcnkuc3RvcmUoYVdyaXRlciwgaW5kZW50LCBhVGFnRWxlbWVudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiZmFjdG9yeS5zdG9yZU5vRGVzY3JpcHRvciIsIGFUYWdFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3MoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTYXZlIGEgYXJyYXkgb2YgZWxlbWVudHMKKyAgICAgKiBAcGFyYW0gYVdyaXRlciBjdXJyZW50IG91dHB1dCB3cml0ZXIKKyAgICAgKiBAcGFyYW0gaW5kZW50IGluZGVudGF0aW9uIGxldmVsCisgICAgICogQHBhcmFtIGVsZW1lbnRzIGxpc3Qgb2YgY2hpbGQgZWxtZW50cyB0byBzdG9yZSEKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzdG9yZUVsZW1lbnRBcnJheShQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LAorICAgICAgICAgICAgT2JqZWN0W10gZWxlbWVudHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZWxlbWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudChhV3JpdGVyLCBpbmRlbnQsIGVsZW1lbnRzW2ldKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5nb3JlIGNoaWxkcyByZXBvcnQgZXJyb3IgdGhlbSBzZWxmIQorICAgICAgICAgICAgICAgICAgICAvLyBzZWUgU3RhbmRhcnRDb250ZXh0LnN0b3JlV2l0aEJhY2t1cCgpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlRmFjdG9yeVJ1bGUuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlRmFjdG9yeVJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjg3MDczCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVGYWN0b3J5UnVsZS5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5SdWxlOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CisKKy8qKgorICogPHA+CisgKiBSdWxlIHRoYXQgY3JlYXRlcyBhIG5ldyA8Y29kZT5JU3RvcmVGYWN0b3J5PC9jb2RlPiBpbnN0YW5jZSwgYW5kIGFzc29jaWF0ZXMKKyAqIGl0IHdpdGggdGhlIHRvcCBvYmplY3Qgb24gdGhlIHN0YWNrICh3aGljaCBtdXN0IGltcGxlbWVudAorICogPGNvZGU+SVN0b3JlRmFjdG9yeTwvY29kZT4pLgorICogPC9wPgorICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKi8KKworcHVibGljIGNsYXNzIFN0b3JlRmFjdG9yeVJ1bGUgZXh0ZW5kcyBSdWxlIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgUnVsZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RvcmVGYWN0b3J5Q2xhc3MKKyAgICAgKiAgICAgICAgICAgIERlZmF1bHQgbmFtZSBvZiB0aGUgU3RvcmVGYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRvIGJlCisgICAgICogICAgICAgICAgICBjcmVhdGVkCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKKyAgICAgKiAgICAgICAgICAgIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IG9wdGlvbmFsbHkgaW5jbHVkZXMgYW4gb3ZlcnJpZGUKKyAgICAgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIElTdG9yZUZhY3RvcnkgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RvcmVGYWN0b3J5UnVsZShTdHJpbmcgc3RvcmVGYWN0b3J5Q2xhc3MsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLAorICAgICAgICAgICAgU3RyaW5nIHN0b3JlQXBwZW5kZXJDbGFzcywgU3RyaW5nIGFwcGVuZGVyQXR0cmlidXRlTmFtZSkgeworCisgICAgICAgIHRoaXMuc3RvcmVGYWN0b3J5Q2xhc3MgPSBzdG9yZUZhY3RvcnlDbGFzczsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsKKyAgICAgICAgdGhpcy5hcHBlbmRlckF0dHJpYnV0ZU5hbWUgPSBhcHBlbmRlckF0dHJpYnV0ZU5hbWU7CisgICAgICAgIHRoaXMuc3RvcmVBcHBlbmRlckNsYXNzID0gc3RvcmVBcHBlbmRlckNsYXNzOworCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXR0cmlidXRlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHRoYXQgY2FuIG92ZXJyaWRlIHRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAqIGNsYXNzIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlTmFtZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGFwcGVuZGVyQXR0cmlidXRlTmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSA8Y29kZT5JU3RvcmVGYWN0b3J5PC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzdG9yZUZhY3RvcnlDbGFzczsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0b3JlQXBwZW5kZXJDbGFzczsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogSGFuZGxlIHRoZSBiZWdpbm5pbmcgb2YgYW4gWE1MIGVsZW1lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMKKyAgICAgKiAgICAgICAgICAgIFRoZSBhdHRyaWJ1dGVzIG9mIHRoaXMgZWxlbWVudAorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgaWYgYSBwcm9jZXNzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBJU3RvcmVGYWN0b3J5IGZhY3RvcnkgPSAoSVN0b3JlRmFjdG9yeSkgbmV3SW5zdGFuY2UoYXR0cmlidXRlTmFtZSwKKyAgICAgICAgICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcywgYXR0cmlidXRlcyk7CisgICAgICAgIFN0b3JlQXBwZW5kZXIgc3RvcmVBcHBlbmRlciA9IChTdG9yZUFwcGVuZGVyKSBuZXdJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBhcHBlbmRlckF0dHJpYnV0ZU5hbWUsIHN0b3JlQXBwZW5kZXJDbGFzcywgYXR0cmlidXRlcyk7CisgICAgICAgIGZhY3Rvcnkuc2V0U3RvcmVBcHBlbmRlcihzdG9yZUFwcGVuZGVyKTsKKworICAgICAgICAvLyBBZGQgdGhpcyBTdG9yZUZhY3RvcnkgdG8gb3VyIGFzc29jaWF0ZWQgY29tcG9uZW50CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYyA9IChTdG9yZURlc2NyaXB0aW9uKSBkaWdlc3Rlci5wZWVrKDApOworICAgICAgICBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gKFN0b3JlUmVnaXN0cnkpIGRpZ2VzdGVyLnBlZWsoMSk7CisgICAgICAgIGZhY3Rvcnkuc2V0UmVnaXN0cnkocmVnaXN0cnkpOworICAgICAgICBkZXNjLnNldFN0b3JlRmFjdG9yeShmYWN0b3J5KTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIGNyZWF0ZSBuZXcgaW5zdGFuY2UgZnJvbSBhdHRyaWJ0ZSBjbGFzc05hbWUhCisgICAgICogCisgICAgICogQHBhcmFtIGF0dHIgY2xhc3MgTmFtZSBhdHRyaWJ1dGUKKyAgICAgKiBAcGFyYW0gZGVmYXVsdE5hbWUgRGVmYXVsdCBDbGFzcworICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIGN1cnJlbnQgZGlnZXN0ZXIgYXR0cmlidXRlIGVsZW1lbnRzCisgICAgICogQHJldHVybiBuZXcgY29uZmlnIG9iamVjdCBpbnN0YW5jZQorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGF0dHIsIFN0cmluZyBkZWZhdWx0TmFtZSwKKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGRlZmF1bHROYW1lOworICAgICAgICBpZiAoYXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGF0dHIpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7CisgICAgICAgIHJldHVybiBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUZpbGVNb3Zlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVGaWxlTW92ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGZhZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVGaWxlTW92ZXIuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CisKKy8qKgorICogTW92ZSBzZXJ2ZXIueG1sIG9yIGNvbnRleHQueG1sIGFzIGJhY2t1cAorICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAKKyAqIFRPRE8gR2V0IEVuY29kaW5nIGZyb20gUmVnaXN0cnkKKyAqLworcHVibGljIGNsYXNzIFN0b3JlRmlsZU1vdmVyIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVuYW1lID0gImNvbmYvc2VydmVyLnhtbCI7CisKKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZyA9ICJVVEYtOCI7CisKKyAgICBwcml2YXRlIFN0cmluZyBiYXNlbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpOworCisgICAgcHJpdmF0ZSBGaWxlIGNvbmZpZ09sZDsKKworICAgIHByaXZhdGUgRmlsZSBjb25maWdOZXc7CisKKyAgICBwcml2YXRlIEZpbGUgY29uZmlnU2F2ZTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29uZmlnTmV3LgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldENvbmZpZ05ldygpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ05ldzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbmZpZ09sZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRDb25maWdPbGQoKSB7CisgICAgICAgIHJldHVybiBjb25maWdPbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb25maWdTYXZlLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldENvbmZpZ1NhdmUoKSB7CisgICAgICAgIHJldHVybiBjb25maWdTYXZlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYmFzZW5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRCYXNlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGJhc2VuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBiYXNlbmFtZQorICAgICAqICAgICAgICAgICAgVGhlIGJhc2VuYW1lIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlbmFtZShTdHJpbmcgYmFzZW5hbWUpIHsKKyAgICAgICAgdGhpcy5iYXNlbmFtZSA9IGJhc2VuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGZpbGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZW5hbWUoKSB7CisgICAgICAgIHJldHVybiBmaWxlbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZW5hbWUoU3RyaW5nIHN0cmluZykgeworICAgICAgICBmaWxlbmFtZSA9IHN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBlbmNvZGluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7CisgICAgICAgIHJldHVybiBlbmNvZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIHN0cmluZykgeworICAgICAgICBlbmNvZGluZyA9IHN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGUgZmlsZSBvYmplY3RzIGZvciB0aGUgb2xkIGFuZCBuZXcgY29uZmlndXJhdGlvbiBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RvcmVGaWxlTW92ZXIoU3RyaW5nIGJhc2VuYW1lLCBTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBlbmNvZGluZykgeworICAgICAgICBzZXRCYXNlbmFtZShiYXNlbmFtZSk7CisgICAgICAgIHNldEVuY29kaW5nKGVuY29kaW5nKTsKKyAgICAgICAgc2V0RmlsZW5hbWUoZmlsZW5hbWUpOworICAgICAgICBpbml0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIGZpbGUgb2JqZWN0cyBmb3IgdGhlIG9sZCBhbmQgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgICAgICovCisgICAgcHVibGljIFN0b3JlRmlsZU1vdmVyKCkgeworICAgICAgICBpbml0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2VuZXJhdGUgdGhlIEZpbGVuYW1lIHRvIG5ldyB3aXRoIFRpbWVTdGFtcAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIFN0cmluZyBjb25maWdGaWxlID0gZ2V0RmlsZW5hbWUoKTsKKyAgICAgICAgY29uZmlnT2xkID0gbmV3IEZpbGUoY29uZmlnRmlsZSk7CisgICAgICAgIGlmICghY29uZmlnT2xkLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgY29uZmlnT2xkID0gbmV3IEZpbGUoZ2V0QmFzZW5hbWUoKSwgY29uZmlnRmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgY29uZmlnTmV3ID0gbmV3IEZpbGUoY29uZmlnRmlsZSArICIubmV3Iik7CisgICAgICAgIGlmICghY29uZmlnTmV3LmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgY29uZmlnTmV3ID0gbmV3IEZpbGUoZ2V0QmFzZW5hbWUoKSwgY29uZmlnRmlsZSArICIubmV3Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb25maWdOZXcuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpKSB7CisgICAgICAgICAgICBjb25maWdOZXcuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBzYiA9IGdldFRpbWVUYWcoKTsKKyAgICAgICAgY29uZmlnU2F2ZSA9IG5ldyBGaWxlKGNvbmZpZ0ZpbGUgKyBzYik7CisgICAgICAgIGlmICghY29uZmlnU2F2ZS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgIGNvbmZpZ1NhdmUgPSBuZXcgRmlsZShnZXRCYXNlbmFtZSgpLCBjb25maWdGaWxlICsgc2IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2h1ZmZsZSBvbGQtPnNhdmUgYW5kIG5ldy0+b2xkCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1vdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoY29uZmlnT2xkLnJlbmFtZVRvKGNvbmZpZ1NhdmUpKSB7CisgICAgICAgICAgICBpZiAoIWNvbmZpZ05ldy5yZW5hbWVUbyhjb25maWdPbGQpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnU2F2ZS5yZW5hbWVUbyhjb25maWdPbGQpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IHJlbmFtZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGNvbmZpZ05ldy5nZXRBYnNvbHV0ZVBhdGgoKSArICIgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBjb25maWdPbGQuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFjb25maWdPbGQuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ05ldy5yZW5hbWVUbyhjb25maWdPbGQpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IG1vdmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29uZmlnTmV3LmdldEFic29sdXRlUGF0aCgpICsgIiB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb25maWdPbGQuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgcmVuYW1lICIKKyAgICAgICAgICAgICAgICAgICAgKyBjb25maWdPbGQuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIHRvICIKKyAgICAgICAgICAgICAgICAgICAgKyBjb25maWdTYXZlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW4gYW4gb3V0cHV0IHdyaXRlciBmb3IgdGhlIG5ldyBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSB3cml0ZXIKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcigKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0oY29uZmlnTmV3KSwgZ2V0RW5jb2RpbmcoKSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgKGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3cml0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGltZSB2YWx1ZSBmb3IgYmFja3VwIHl5eXktbW0tZGQuaGgtbW0tc3MKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSB0aW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUaW1lVGFnKCkgeworICAgICAgICBTdHJpbmcgdHMgPSAobmV3IFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpLnRvU3RyaW5nKCk7CisgICAgICAgIC8vICAgICAgICB5eXl5LW1tLWRkIGhoOm1tOnNzCisgICAgICAgIC8vICAgICAgICAwMTIzNDU2Nzg5MDEyMzQ1Njc4CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIi4iKTsKKyAgICAgICAgc2IuYXBwZW5kKHRzLnN1YnN0cmluZygwLCAxMCkpOworICAgICAgICBzYi5hcHBlbmQoJy4nKTsKKyAgICAgICAgc2IuYXBwZW5kKHRzLnN1YnN0cmluZygxMSwgMTMpKTsKKyAgICAgICAgc2IuYXBwZW5kKCctJyk7CisgICAgICAgIHNiLmFwcGVuZCh0cy5zdWJzdHJpbmcoMTQsIDE2KSk7CisgICAgICAgIHNiLmFwcGVuZCgnLScpOworICAgICAgICBzYi5hcHBlbmQodHMuc3Vic3RyaW5nKDE3LCAxOSkpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlTG9hZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NDc3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUxvYWRlci5qYXZhCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAKKyAqIDxiPlhNTCBGb3JtYXQgPC9iPgorICogCisgKiA8cHJlPgorICogICAgCisgKiAgICAgICAmbHQ7UmVnaXN0cnkgbmFtZT0mcXVvdDsmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGOCZxdW90OyAmZ3Q7CisgKiAgICAgICAmbHQ7RGVzY3JpcHRpb24gdGFnPSZxdW90O1NlcnZlciZxdW90OyBzdGFuZGFyZD0mcXVvdDt0cnVlJnF1b3Q7IGRlZmF1bHQ9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7IAorICogICAgICAgICAgdGFnQ2xhc3M9JnF1b3Q7b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyJnF1b3Q7CisgKiAgICAgICAgICBzdG9yZUZhY3Rvcnk9JnF1b3Q7b3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdGFuZGFyZFNlcnZlclNGJnF1b3Q7Jmd0OworICogICAgICAgICZsdDtUcmFuc2llbnRBdHRyaWJ1dGVzJmd0OworICogICAgICAgICAgJmx0O0F0dHJpYnV0ZSZndDsmbHQ7L0F0dHJpYnV0ZSZndDsKKyAqICAgICAgICAmbHQ7L1RyYW5zaWVudEF0dHJpYnV0ZXMmZ3Q7CisgKiAgICAgICAgJmx0O1RyYW5zaWVudENoaWxkcyZndDsKKyAqICAgICAgICAgICZsdDtDaGlsZCZndDsmbHQ7L0NoaWxkJmd0OworICogICAgICAgICZsdDsvVHJhbnNpZW50Q2hpbGRzJmd0OworICogICAgICAgJmx0Oy9EZXNjcmlwdGlvbiZndDsKKyAqICAgLi4uCisgKiAgICAgICAmbHQ7L1RlZ2lzdHJ5Jmd0OworICogICAgIAorICogPC9wcmU+CisgKiAKKyAqIAorICogQ29udmVudGlvbjoKKyAqIDx1bD4KKyAqIDxsaT5GYWN0b3JpZXMgYXQgc3VicGFja2FnZSA8aT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuc3RvcmVjb25maWcueHh4U0YKKyAqIDwvaT4uPC9saT4KKyAqIDxsaT5FbGVtZW50IG5hbWUgYXJlIHRoZSB1bmlxdWUgQ2xhc3MgbmFtZTwvbGk+CisgKiA8bGk+U0YgZm9yIFN0b3JlRmFjdG9yeTwvbGk+CisgKiA8bGk+c3RhbmRhcmQgaW1wbGVtZW50YXRpb24gaXMgZmFsc2U8L2xpPgorICogPC91bD4KKyAqIG90aGVyIHRoaW5nczoKKyAqIDx1bD4KKyAqIDxsaT5SZWdpc3RyeSBYTUwgZm9ybWF0IGlzIGEgdmVyeSBnb29kIG9wdGlvbjwvbGk+CisgKiA8bGk+U3RvcmUgZm9ybWF0IGlzIG5vdCBmaXg8L2xpPgorICogPGxpPldlIGhvcGUgd2l0aCB0aGUgcGFyZW50IGRlY2xhcmF0aW9uIHdlIGNhbiBidWlsZCByZWN1cnNpdmUgY2hpbGQgc3RvcmUKKyAqIG9wZXJhdGlvbiAvL2RyZWFtPC9saT4KKyAqIDxsaT5Qcm9ibGVtIGlzIHRvIGFjY2VzcyBjaGlsZCBkYXRhIGZyb20gYXJyYXksY29sbGVjdGlvbnMgb3Igbm9ybWFsIGRldGFpbAorICogb2JqZWN0PC9saT4KKyAqIDxsaT5EZWZhdWx0IGRlZmluaXRpb25zIGZvciBMaXN0ZW5lciwgVmFsdmUgUmVzb3VyY2U/IC0gQmFzZWQgb24gaW50ZXJmYWNlCisgKiB0eXBlITwvbGk+CisgKiA8L3VsPgorICovCitwdWJsaWMgY2xhc3MgU3RvcmVMb2FkZXIgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTdG9yZUxvYWRlci5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IGluc3RhbmNlIHVzZWQgdG8gcGFyc2UgcmVnaXN0cnkgZGVzY3JpcHRvcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBEaWdlc3RlciBkaWdlc3RlciA9IGNyZWF0ZURpZ2VzdGVyKCk7CisKKyAgICBwcml2YXRlIFN0b3JlUmVnaXN0cnkgcmVnaXN0cnk7CisgICAgCisgICAgcHJpdmF0ZSBVUkwgcmVnaXN0cnlSZXNvdXJjZSA7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlZ2lzdHJ5LgorICAgICAqLworICAgIHB1YmxpYyBTdG9yZVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCkgeworICAgICAgICByZXR1cm4gcmVnaXN0cnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHJlZ2lzdHJ5CisgICAgICogICAgICAgICAgICBUaGUgcmVnaXN0cnkgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZ2lzdHJ5KFN0b3JlUmVnaXN0cnkgcmVnaXN0cnkpIHsKKyAgICAgICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgY29uZmlndXJlIHRoZSBEaWdlc3RlciB3ZSB3aWxsIGJlIHVzaW5nIGZvciBzZXR1cCBzdG9yZQorICAgICAqIHJlZ2lzdHJ5LgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgRGlnZXN0ZXIgY3JlYXRlRGlnZXN0ZXIoKSB7CisgICAgICAgIGxvbmcgdDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZGlnZXN0ZXIKKyAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBuZXcgRGlnZXN0ZXIoKTsKKyAgICAgICAgZGlnZXN0ZXIuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisgICAgICAgIGRpZ2VzdGVyLnNldENsYXNzTG9hZGVyKFN0b3JlUmVnaXN0cnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisKKyAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBhY3Rpb25zIHdlIHdpbGwgYmUgdXNpbmcKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJSZWdpc3RyeSIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVSZWdpc3RyeSIsICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcygiUmVnaXN0cnkiKTsKKyAgICAgICAgZGlnZXN0ZXIKKyAgICAgICAgICAgICAgICAuYWRkT2JqZWN0Q3JlYXRlKCJSZWdpc3RyeS9EZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZURlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcygiUmVnaXN0cnkvRGVzY3JpcHRpb24iKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZSgiUmVnaXN0cnkvRGVzY3JpcHRpb24iLCBuZXcgU3RvcmVGYWN0b3J5UnVsZSgKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwKKyAgICAgICAgICAgICAgICAic3RvcmVGYWN0b3J5Q2xhc3MiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlQXBwZW5kZXIiLAorICAgICAgICAgICAgICAgICJzdG9yZUFwcGVuZGVyQ2xhc3MiKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoIlJlZ2lzdHJ5L0Rlc2NyaXB0aW9uIiwgInJlZ2lzdGVyRGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRGVzY3JpcHRpb24iKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiUmVnaXN0cnkvRGVzY3JpcHRpb24vVHJhbnNpZW50QXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAiYWRkVHJhbnNpZW50QXR0cmlidXRlIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoIlJlZ2lzdHJ5L0Rlc2NyaXB0aW9uL1RyYW5zaWVudENoaWxkIiwKKyAgICAgICAgICAgICAgICAiYWRkVHJhbnNpZW50Q2hpbGQiLCAwKTsKKworICAgICAgICBsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGlnZXN0ZXIgZm9yIHNlcnZlci1yZWdpc3RyeS54bWwgY3JlYXRlZCAiICsgKHQyIC0gdDEpKTsKKyAgICAgICAgcmV0dXJuIChkaWdlc3Rlcik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYUZpbGUKKyAgICAgKiBAcmV0dXJuIFRoZSBzZXJ2ZXIgZmlsZQorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIHNlcnZlckZpbGUoU3RyaW5nIGFGaWxlKSB7CisKKyAgICAgICAgaWYgKGFGaWxlID09IG51bGwgfHwgKGFGaWxlICE9IG51bGwgJiYgYUZpbGUubGVuZ3RoKCkgPCAxKSkKKyAgICAgICAgICAgIGFGaWxlID0gInNlcnZlci1yZWdpc3RyeS54bWwiOworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShhRmlsZSk7CisgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIikgKyAiL2NvbmYiLAorICAgICAgICAgICAgICAgICAgICBhRmlsZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaWxlID0gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGZpbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgRGVzY3JpcHRpb24gZnJvbSBleHRlcm5hbCBzb3VyY2UKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYVVSTAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWQoU3RyaW5nIGFVUkwpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChkaWdlc3RlcikgeworICAgICAgICAgICAgRmlsZSBhUmVnaXN0cnlGaWxlID0gc2VydmVyRmlsZShhVVJMKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVnaXN0cnkgPSAoU3RvcmVSZWdpc3RyeSkgZGlnZXN0ZXIucGFyc2UoYVJlZ2lzdHJ5RmlsZSk7CisgICAgICAgICAgICAgICAgcmVnaXN0cnlSZXNvdXJjZSA9IGFSZWdpc3RyeUZpbGUudG9VUkwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7CisgICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCBmcm9tIGRlZmF1bHRzCisgICAgICogPHVsPgorICAgICAqIDxsaT5TeXN0ZW0gUHJvcGVydHkgVVJMIGNhdGFsaW5hLnN0b3JlcmVnaXN0cnk8L2xpPgorICAgICAqIDxsaT5GaWxlICRjYXRhbGluYS5iYXNlL2NvbmYvc2VydmVyLXJlZ2lzdHJ5LnhtbDwvbGk+CisgICAgICogPGxpPmNsYXNzIHJlc291cmNlIG9yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvc2VydmVyLXJlZ2lzdHJ5LnhtbAorICAgICAqIDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkKCkgeworCisgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgVGhyb3dhYmxlIGVycm9yID0gbnVsbDsKKyAgICAgICAgcmVnaXN0cnlSZXNvdXJjZSA9IG51bGwgOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGNvbmZpZ1VybCA9IGdldENvbmZpZ1VybCgpOworICAgICAgICAgICAgaWYgKGNvbmZpZ1VybCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaXMgPSAobmV3IFVSTChjb25maWdVcmwpKS5vcGVuU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbmZvKCJGaW5kIHJlZ2lzdHJ5IHNlcnZlci1yZWdpc3RyeS54bWwgZnJvbSBzeXN0ZW0gcHJvcGVydHkgYXQgdXJsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29uZmlnVXJsKTsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgcmVnaXN0cnlSZXNvdXJjZSA9IG5ldyBVUkwoY29uZmlnVXJsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICB9CisgICAgICAgIGlmIChpcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpbGUgaG9tZSA9IG5ldyBGaWxlKGdldENhdGFsaW5hQmFzZSgpKTsKKyAgICAgICAgICAgICAgICBGaWxlIGNvbmYgPSBuZXcgRmlsZShob21lLCAiY29uZiIpOworICAgICAgICAgICAgICAgIEZpbGUgcmVnID0gbmV3IEZpbGUoY29uZiwgInNlcnZlci1yZWdpc3RyeS54bWwiKTsKKyAgICAgICAgICAgICAgICBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVnKTsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkZpbmQgcmVnaXN0cnkgc2VydmVyLXJlZ2lzdHJ5LnhtbCBhdCBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlZy5nZXRDYW5vbmljYWxQYXRoKCkpOworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICByZWdpc3RyeVJlc291cmNlID0gcmVnLnRvVVJMKCkgOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpcyA9IFN0b3JlTG9hZGVyLmNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvc2VydmVyLXJlZ2lzdHJ5LnhtbCIpOworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5mbygiRmluZCByZWdpc3RyeSBzZXJ2ZXItcmVnaXN0cnkueG1sIGF0IGNsYXNzcGF0aCByZXNvdXJjZSIpOworICAgICAgICAgICAgICAgIHJlZ2lzdHJ5UmVzb3VyY2UgPSBTdG9yZUxvYWRlci5jbGFzcworICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2UoIi9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL3NlcnZlci1yZWdpc3RyeS54bWwiKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChkaWdlc3RlcikgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RyeSA9IChTdG9yZVJlZ2lzdHJ5KSBkaWdlc3Rlci5wYXJzZShpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IHQ7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGlzID09IG51bGwpIHx8IChlcnJvciAhPSBudWxsKSkgeworICAgICAgICAgICAgbG9nLmVycm9yKGVycm9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGNhdGFsaW5hLmhvbWUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENhdGFsaW5hSG9tZSgpIHsKKyAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuaG9tZSIsIFN5c3RlbQorICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgY2F0YWxpbmEuYmFzZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2F0YWxpbmFCYXNlKCkgeworICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiwgZ2V0Q2F0YWxpbmFIb21lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gVVJMLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDb25maWdVcmwoKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLnN0b3JlY29uZmlnIik7CisgICAgfQorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByZWdpc3RyeVJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBVUkwgZ2V0UmVnaXN0cnlSZXNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5UmVzb3VyY2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVSZWdpc3RyeS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVSZWdpc3RyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZWY5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZVJlZ2lzdHJ5LmphdmEKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DYXRhbGluYUNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJEZXBsb3llcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclJlY2VpdmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyU2VuZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXJzaGlwU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVzc2FnZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisvKioKKyAqIENlbnRyYWwgU3RvcmVSZWdpc3RyeSBmb3IgYWxsIHNlcnZlci54bWwgZWxlbWVudHMKKyAqIAorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogIAorICovCitwdWJsaWMgY2xhc3MgU3RvcmVSZWdpc3RyeSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFN0b3JlUmVnaXN0cnkuY2xhc3MpOworCisgICAgcHJpdmF0ZSBNYXAgZGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RpbmcgPSAiVVRGLTgiOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgU3RyaW5nIHZlcnNpb247CisKKyAgICAvLyBBY2Nlc3MgSW5mb3JtYXRpb24KKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBpbnRlcmZhY2VzW10gPSB7IENhdGFsaW5hQ2x1c3Rlci5jbGFzcywKKyAgICAgICAgICAgIENsdXN0ZXJTZW5kZXIuY2xhc3MsIENsdXN0ZXJSZWNlaXZlci5jbGFzcywKKyAgICAgICAgICAgIE1lbWJlcnNoaXBTZXJ2aWNlLmNsYXNzLCBDbHVzdGVyRGVwbG95ZXIuY2xhc3MsIFJlYWxtLmNsYXNzLAorICAgICAgICAgICAgTWFuYWdlci5jbGFzcywgRGlyQ29udGV4dC5jbGFzcywgTGlmZWN5Y2xlTGlzdGVuZXIuY2xhc3MsCisgICAgICAgICAgICBWYWx2ZS5jbGFzcywgTWVzc2FnZUxpc3RlbmVyLmNsYXNzIH07CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZlcnNpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gdmVyc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdmVyc2lvbgorICAgICAqICAgICAgICAgICAgVGhlIHZlcnNpb24gdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKKyAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGEgZGVzY3JpcHRpb24gZm9yIGlkLiBIYW5kbGUgaW50ZXJmYWNlIHNlYXJjaCB3aGVuIG5vIGRpcmVjdCBtYXRjaAorICAgICAqIGZvdW5kLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpZAorICAgICAqIEByZXR1cm4gVGhlIGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIFN0b3JlRGVzY3JpcHRpb24gZmluZERlc2NyaXB0aW9uKFN0cmluZyBpZCkgeworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoInNlYXJjaCBkZXNjcmlwdG9yICIgKyBpZCk7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYyA9IChTdG9yZURlc2NyaXB0aW9uKSBkZXNjcmlwdG9ycy5nZXQoaWQpOworICAgICAgICBpZiAoZGVzYyA9PSBudWxsKSB7CisgICAgICAgICAgICBDbGFzcyBhQ2xhc3MgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGlkLCB0cnVlLCB0aGlzLmdldENsYXNzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3NOYW1lOiIgKyBpZCwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYUNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXNjID0gKFN0b3JlRGVzY3JpcHRpb24pIGRlc2NyaXB0b3JzLmdldChhQ2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgZGVzYyA9PSBudWxsICYmIGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VzW2ldLmlzQXNzaWduYWJsZUZyb20oYUNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IChTdG9yZURlc2NyaXB0aW9uKSBkZXNjcmlwdG9ycy5nZXQoaW50ZXJmYWNlc1tpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBpZiAoZGVzYyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZmluZCBkZXNjcmlwdG9yICIgKyBpZCArICIjIiArIGRlc2MuZ2V0VGFnKCkgKyAiIyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGVzYy5nZXRTdG9yZUZhY3RvcnlDbGFzcygpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoKCJDYW4ndCBmaW5kIGRlc2NyaXB0b3IgZm9yIGtleSAiICsgaWQpKTsKKyAgICAgICAgcmV0dXJuIGRlc2M7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBEZXNjcmlwdGlvbiBieSBjbGFzcworICAgICAqIAorICAgICAqIEBwYXJhbSBhQ2xhc3MKKyAgICAgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBTdG9yZURlc2NyaXB0aW9uIGZpbmREZXNjcmlwdGlvbihDbGFzcyBhQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIGZpbmREZXNjcmlwdGlvbihhQ2xhc3MuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGZhY3RvcnkgZnJvbSBjbGFzc25hbWUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYUNsYXNzTmFtZQorICAgICAqIEByZXR1cm4gVGhlIGZhY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgSVN0b3JlRmFjdG9yeSBmaW5kU3RvcmVGYWN0b3J5KFN0cmluZyBhQ2xhc3NOYW1lKSB7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYyA9IGZpbmREZXNjcmlwdGlvbihhQ2xhc3NOYW1lKTsKKyAgICAgICAgaWYgKGRlc2MgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBkZXNjLmdldFN0b3JlRmFjdG9yeSgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIGZpbmQgZmFjdG9yeSBmcm9tIGNsYXNzCisgICAgICogCisgICAgICogQHBhcmFtIGFDbGFzcworICAgICAqIEByZXR1cm4gVGhlIGZhY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgSVN0b3JlRmFjdG9yeSBmaW5kU3RvcmVGYWN0b3J5KENsYXNzIGFDbGFzcykgeworICAgICAgICByZXR1cm4gZmluZFN0b3JlRmFjdG9yeShhQ2xhc3MuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIG5ldyBkZXNjcmlwdGlvbgorICAgICAqIAorICAgICAqIEBwYXJhbSBkZXNjCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEZXNjcmlwdGlvbihTdG9yZURlc2NyaXB0aW9uIGRlc2MpIHsKKyAgICAgICAgU3RyaW5nIGtleSA9IGRlc2MuZ2V0SWQoKTsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8ICIiLmVxdWFscyhrZXkpKQorICAgICAgICAgICAga2V5ID0gZGVzYy5nZXRUYWdDbGFzcygpOworICAgICAgICBkZXNjcmlwdG9ycy5wdXQoa2V5LCBkZXNjKTsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJyZWdpc3RlciBzdG9yZSBkZXNjcmlwdG9yICIgKyBrZXkgKyAiIyIgKyBkZXNjLmdldFRhZygpCisgICAgICAgICAgICAgICAgICAgICsgIiMiICsgZGVzYy5nZXRUYWdDbGFzcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RvcmVEZXNjcmlwdGlvbiB1bnJlZ2lzdGVyRGVzY3JpcHRpb24oU3RvcmVEZXNjcmlwdGlvbiBkZXNjKSB7CisgICAgICAgIFN0cmluZyBrZXkgPSBkZXNjLmdldElkKCk7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCAiIi5lcXVhbHMoa2V5KSkKKyAgICAgICAgICAgIGtleSA9IGRlc2MuZ2V0VGFnQ2xhc3MoKTsKKyAgICAgICAgcmV0dXJuIChTdG9yZURlc2NyaXB0aW9uKSBkZXNjcmlwdG9ycy5yZW1vdmUoa2V5KTsKKyAgICB9CisKKyAgICAvLyBBdHRyaWJ1dGVzCisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBlbmNvZGluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7CisgICAgICAgIHJldHVybiBlbmNvZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIHN0cmluZykgeworICAgICAgICBlbmNvZGluZyA9IHN0cmluZzsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1dhdGNoZWRSZXNvdXJjZVNGLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9XYXRjaGVkUmVzb3VyY2VTRi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOTY4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9XYXRjaGVkUmVzb3VyY2VTRi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBXYXRjaGVkUmVzb3VyY2VTRiBleHRlbmRzIFN0b3JlRmFjdG9yeUJhc2UgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhXYXRjaGVkUmVzb3VyY2VTRi5jbGFzcyk7CisKKyAgICAvKgorICAgICAqIFN0b3JlIG5lc3RlZCBFbGVtZW50IFZhbHVlIEFycmF5cyBXYXRjaGVkUmVzb3VyY2UKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29uZmlnLklTdG9yZUZhY3Rvcnkjc3RvcmUoamF2YS5pby5QcmludFdyaXRlciwKKyAgICAgKiAgICAgIGludCwgamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZShQcmludFdyaXRlciBhV3JpdGVyLCBpbnQgaW5kZW50LCBPYmplY3QgYUVsZW1lbnQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGFFbGVtZW50IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KSB7CisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGVsZW1lbnREZXNjID0gZ2V0UmVnaXN0cnkoKS5maW5kRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgIGFFbGVtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5bV2F0Y2hlZFJlc291cmNlXSIpOworICAgICAgICAgICAgU3RyaW5nW10gcmVzb3VyY2VzID0gKChTdGFuZGFyZENvbnRleHQpIGFFbGVtZW50KQorICAgICAgICAgICAgICAgICAgICAuZmluZFdhdGNoZWRSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50RGVzYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInN0b3JlICIgKyBlbGVtZW50RGVzYy5nZXRUYWcoKSArICIoICIgKyBhRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiApIik7CisgICAgICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50VGFnQXJyYXkoYVdyaXRlciwgIldhdGNoZWRSZXNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQsIHJlc291cmNlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbG9nLndhcm4oIkRlc2NyaXB0b3IgZm9yIGVsZW1lbnQiICsgYUVsZW1lbnQuZ2V0Q2xhc3MoKQorICAgICAgICAgICAgICAgICAgICArICIuW1dhdGNoZWRSZXNvdXJjZV0gbm90IGNvbmZpZ3VyZWQhIik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1dyYXBwZXJMaWZlY3ljbGVTRi5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvV3JhcHBlckxpZmVjeWNsZVNGLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlMjM0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1dyYXBwZXJMaWZlY3ljbGVTRi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBXcmFwcGVyTGlmZWN5Y2xlU0YgZXh0ZW5kcyBTdG9yZUZhY3RvcnlCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coV3JhcHBlckxpZmVjeWNsZVNGLmNsYXNzKTsKKworICAgIC8qCisgICAgICogU3RvcmUgbmVzdGVkIEVsZW1lbnQgVmFsdWUgQXJyYXlzCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5JU3RvcmVGYWN0b3J5I3N0b3JlKGphdmEuaW8uUHJpbnRXcml0ZXIsCisgICAgICogICAgICBpbnQsIGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmUoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFFbGVtZW50KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhRWxlbWVudCBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCkgeworICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBlbGVtZW50RGVzYyA9IGdldFJlZ2lzdHJ5KCkuZmluZERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBhRWxlbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIuW1dyYXBwZXJMaWZlY3ljbGVdIik7CisgICAgICAgICAgICBTdHJpbmdbXSBsaXN0ZW5lcnMgPSAoKFN0YW5kYXJkQ29udGV4dCkgYUVsZW1lbnQpCisgICAgICAgICAgICAgICAgICAgIC5maW5kV3JhcHBlckxpZmVjeWNsZXMoKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50RGVzYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInN0b3JlICIgKyBlbGVtZW50RGVzYy5nZXRUYWcoKSArICIoICIgKyBhRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiApIik7CisgICAgICAgICAgICAgICAgZ2V0U3RvcmVBcHBlbmRlcigpLnByaW50VGFnQXJyYXkoYVdyaXRlciwgIldyYXBwZXJMaWZlY3ljbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50LCBsaXN0ZW5lcnMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGxvZy53YXJuKCJEZXNjcmlwdG9yIGZvciBlbGVtZW50IiArIGFFbGVtZW50LmdldENsYXNzKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiLltXcmFwcGVyTGlmZWN5Y2xlXSBub3QgY29uZmlndXJlZCEiKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvV3JhcHBlckxpc3RlbmVyU0YuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1dyYXBwZXJMaXN0ZW5lclNGLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRlZWU3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1dyYXBwZXJMaXN0ZW5lclNGLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2ggKHBlcm9AYXBhY2hlLm9yZykKKyAqICAKKyAqLworcHVibGljIGNsYXNzIFdyYXBwZXJMaXN0ZW5lclNGIGV4dGVuZHMgU3RvcmVGYWN0b3J5QmFzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFdyYXBwZXJMaXN0ZW5lclNGLmNsYXNzKTsKKworICAgIC8qCisgICAgICogU3RvcmUgbmVzdGVkIEVsZW1lbnQgVmFsdWUgQXJyYXlzCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbmZpZy5JU3RvcmVGYWN0b3J5I3N0b3JlKGphdmEuaW8uUHJpbnRXcml0ZXIsCisgICAgICogICAgICBpbnQsIGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmUoUHJpbnRXcml0ZXIgYVdyaXRlciwgaW50IGluZGVudCwgT2JqZWN0IGFFbGVtZW50KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhRWxlbWVudCBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCkgeworICAgICAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBlbGVtZW50RGVzYyA9IGdldFJlZ2lzdHJ5KCkuZmluZERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBhRWxlbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIuW1dyYXBwZXJMaXN0ZW5lcl0iKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGxpc3RlbmVycyA9ICgoU3RhbmRhcmRDb250ZXh0KSBhRWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICAgLmZpbmRXcmFwcGVyTGlzdGVuZXJzKCk7CisgICAgICAgICAgICBpZiAoZWxlbWVudERlc2MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzdG9yZSAiICsgZWxlbWVudERlc2MuZ2V0VGFnKCkgKyAiKCAiICsgYUVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgKSIpOworICAgICAgICAgICAgICAgIGdldFN0b3JlQXBwZW5kZXIoKS5wcmludFRhZ0FycmF5KGFXcml0ZXIsICJXcmFwcGVyTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50LCBsaXN0ZW5lcnMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGxvZy53YXJuKCJEZXNjcmlwdG9yIGZvciBlbGVtZW50IiArIGFFbGVtZW50LmdldENsYXNzKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiLltXcmFwcGVyTGlzdGVuZXJdIG5vdCBjb25maWd1cmVkISIpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTg1NDA1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApAQCAtMCwwICsxLDc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxtYmVhbnMtZGVzY3JpcHRvcnM+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iU3RvcmVDb25maWciCisgICAgICAgICAgZGVzY3JpcHRpb249IkltcGxlbWVudGF0aW9uIG9mIGEgc3RvcmUgc2VydmVyLnhtbCBjb25maWciCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJTdG9yZUNvbmZpZyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUNvbmZpZyI+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9yZUNvbmZpZyIgCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RvcmUgU2VydmVyIiAKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcmVTZXJ2ZXIiIAorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0b3JlIFNlcnZlciBmcm9tIE9iamVjdE5hbWUiIAorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiID4KKyAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ib2JqZWN0bmFtZSIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9iamVjdG5hbWUgZnJvbSBTZXJ2ZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IkNhdGFsaW5hOnR5cGU9U2VydmVyIi8+CisgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImJhY2t1cCIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InN0b3JlIENvbnRleHQgd2l0aCBiYWNrdXAiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZXh0ZXJuYWxBbGxvd2VkIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0ic3RvcmUgYWxsIENvbnRleHQgZXh0ZXJuYWwgdGhhdCBoYXZlIGEgY29uZmlnRmlsZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgIDwvb3BlcmF0aW9uPgorCis8IS0tCisgICBDYXRhbGluYTpqMmVlVHlwZT1XZWJNb2R1bGUsbmFtZT0vL2xvY2FsaG9zdC9tYW5hZ2VyLEoyRUVBcHBsaWNhdGlvbj1ub25lLEoyRUVTZXJ2ZXI9bm9uZQorLS0+CisgICA8b3BlcmF0aW9uIG5hbWU9InN0b3JlQ29udGV4dCIgCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RvcmUgQ29udGV4dCBmcm9tIE9iamVjdE5hbWUiIAorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiID4KKyAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ib2JqZWN0bmFtZSIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9iamVjdE5hbWUgZnJvbSBDb250ZXh0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImJhY2t1cCIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InN0b3JlIHdpdGggQmFja3VwIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImV4dGVybmFsQWxsb3dlZCIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InN0b3JlIGFsbCBvciBzdG9yZSBvbmx5IGludGVybmFsIHNlcnZlci54bWwgY29udGV4dCAoY29uZmlnRmlsZSA9PSBudWxsKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgIDwvb3BlcmF0aW9uPiAgICAgICAgICAgCisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9yZSIgCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RvcmUgU2VydmVyIiAKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiA+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJzZXJ2ZXIiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTZXJ2ZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyIgorICAgICAgICAgICAgICAgICAvPgorICAgIDwvb3BlcmF0aW9uPiAgICAgICAgICAgCisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9yZSIgCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RvcmUgQ29udGV4dCIgCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIgcmV0dXJuVHlwZT0idm9pZCIgPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkNvbnRleHQiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29udGV4dCIvPgorICAgIDwvb3BlcmF0aW9uPiAgICAgICAgICAgCisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9yZSIgCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RvcmUgSG9zdCIgCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIgcmV0dXJuVHlwZT0idm9pZCIgPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG9zdCIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ikhvc3QiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuSG9zdCIvPgorICAgIDwvb3BlcmF0aW9uPiAgICAgICAgICAgCisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9yZSIgCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RvcmUgU2VydmljZSIgCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIgcmV0dXJuVHlwZT0idm9pZCIgPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VydmljZSIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249InNlcnZpY2UiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmljZSIvPgorICAgIDwvb3BlcmF0aW9uPiAgICAgICAgICAgCisgCisgIDwvbWJlYW4+CisKKzwvbWJlYW5zLWRlc2NyaXB0b3JzPgorCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL3NlcnZlci1yZWdpc3RyeS54bWwgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9zZXJ2ZXItcmVnaXN0cnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYTM0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9zZXJ2ZXItcmVnaXN0cnkueG1sCkBAIC0wLDAgKzEsMzQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFJlZ2lzdHJ5IG5hbWU9IlRvbWNhdCIgdmVyc2lvbj0iNS41LjE4IiBlbmNvZGluZz0iVVRGLTgiID4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iU2VydmVyIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0idHJ1ZSIgCisJCWV4dGVybmFsQWxsb3dlZD0idHJ1ZSIgCisgICAgICAgIGNoaWxkcz0idHJ1ZSIKKyAgICAgICAgdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlciIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RhbmRhcmRTZXJ2ZXJTRiI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlNlcnZpY2UiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJ0cnVlIiAKKyAgICAgICAgY2hpbGRzPSJ0cnVlIgorICAgICAgICB0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmljZSIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RhbmRhcmRTZXJ2aWNlU0YiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJFbmdpbmUiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJ0cnVlIiAKKyAgICAgICAgY2hpbGRzPSJ0cnVlIgorICAgICAgICB0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdGFuZGFyZEVuZ2luZVNGIj4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5kb21haW48L1RyYW5zaWVudEF0dHJpYnV0ZT4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iSG9zdCIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9InRydWUiIAorICAgICAgICBjaGlsZHM9InRydWUiCisgICAgICAgIHRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0IgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdGFuZGFyZEhvc3RTRiI+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZG9tYWluPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IkNvbnRleHQiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJ0cnVlIiAKKwkJZXh0ZXJuYWxBbGxvd2VkPSJ0cnVlIiAKKyAJCXN0b3JlU2VwYXJhdGU9InRydWUiCisJCWJhY2t1cD0idHJ1ZSIgCisgICAgICAgIGNoaWxkcz0idHJ1ZSIKKyAgICAgICAgdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0YW5kYXJkQ29udGV4dFNGIgorICAgICAgICBzdG9yZUFwcGVuZGVyQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVDb250ZXh0QXBwZW5kZXIiPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmF2YWlsYWJsZTwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmNvbmZpZ0ZpbGU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5jb25maWd1cmVkPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZGlzcGxheU5hbWU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5kaXN0cmlidXRhYmxlPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZG9tYWluPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZW5naW5lTmFtZTwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPm5hbWU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5wdWJsaWNJZDwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPm9yaWdpbmFsRG9jQmFzZTwvVHJhbnNpZW50QXR0cmlidXRlPgkgICAgCisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+cmVwbGFjZVdlbGNvbWVGaWxlczwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPnNhdmVDb25maWc8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5zZXNzaW9uVGltZW91dDwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPnN0YXJ0dXBUaW1lPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+dGxkU2NhblRpbWU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisgICAgICAgIGlkPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXMuW0dsb2JhbE5hbWluZ1Jlc291cmNlc10iCisJICAgIHRhZz0iR2xvYmFsTmFtaW5nUmVzb3VyY2VzIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiCisJCWF0dHJpYnV0ZXM9ImZhbHNlIgorICAgICAgICBjaGlsZHM9InRydWUiCisgICAgICAgIHRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXMiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkdsb2JhbE5hbWluZ1Jlc291cmNlc1NGIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IkNvbm5lY3RvciIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9InRydWUiIAorICAgICAgICB0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuQ29ubmVjdG9yIgorICAgICAgICBjaGlsZHM9InRydWUiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkNvbm5lY3RvclNGIgorICAgICAgICBzdG9yZUFwcGVuZGVyQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuQ29ubmVjdG9yU3RvcmVBcHBlbmRlciI+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+VVJJRW5jb2Rpbmc8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5tYXhQcm9jZXNzb3I8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKyAJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+bWluUHJvY2Vzc29yPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9Ik5hbWluZ1Jlc291cmNlcyIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIgorCQlhdHRyaWJ1dGVzPSJmYWxzZSIKKyAgICAgICAgY2hpbGRzPSJ0cnVlIgorICAgICAgICB0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5OYW1pbmdSZXNvdXJjZXNTRiI+CisgICAgIDwvRGVzY3JpcHRpb24+CisJIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9Ik1hbmFnZXIiCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5NYW5hZ2VyU0YiPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmVudHJvcHk8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5kaXN0cmlidXRhYmxlPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisgICAgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5EZWx0YU1hbmFnZXI8L1RyYW5zaWVudENoaWxkPgorICAgICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyPC9UcmFuc2llbnRDaGlsZD4KKyAgICA8L0Rlc2NyaXB0aW9uPgorICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9Ik1hbmFnZXIiCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorICAgICAgICBjaGlsZHM9InRydWUiCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uUGVyc2lzdGVudE1hbmFnZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlBlcnNpc3RlbnRNYW5hZ2VyU0YiPgorICAgICAgICA8VHJhbnNpZW50QXR0cmlidXRlPmVudHJvcHk8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5kaXN0cmlidXRhYmxlPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlN0b3JlIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5GaWxlU3RvcmUiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJTdG9yZSIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uSkRCQ1N0b3JlIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iQ2x1c3RlciIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisgICAgICAgIGNoaWxkcz0idHJ1ZSIKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DYXRhbGluYUNsdXN0ZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkNhdGFsaW5hQ2x1c3RlclNGIgorICAgICAgICBzdG9yZUFwcGVuZGVyQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSUR5bmFtaWNQcm9wZXJ0eVN0b3JlQXBwZW5kZXIiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJSZWFsbSIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iUGFyYW1ldGVyIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5BcHBsaWNhdGlvblBhcmFtZXRlciIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IkxvYWRlciIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcExvYWRlciIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuTG9hZGVyU0YiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iTGlzdGVuZXIiCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lciIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyPC9UcmFuc2llbnRDaGlsZD4KKyAgICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLk5hbWluZ0NvbnRleHRMaXN0ZW5lcjwvVHJhbnNpZW50Q2hpbGQ+CisgICAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Db250ZXh0Q29uZmlnPC9UcmFuc2llbnRDaGlsZD4KKyAgICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkVuZ2luZUNvbmZpZzwvVHJhbnNpZW50Q2hpbGQ+CisgICAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Ib3N0Q29uZmlnPC9UcmFuc2llbnRDaGlsZD4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisgICAgICAgIGlkPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXIuW1NlcnZlckxpZmVjeWNsZUxpc3RlbmVyXSIKKwkgICAgdGFnPSJMaXN0ZW5lciIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisgICAgICAgIHRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5TZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlZhbHZlIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmUiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5CYXNpY0F1dGhlbnRpY2F0b3I8L1RyYW5zaWVudENoaWxkPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5EaWdlc3RBdXRoZW50aWNhdG9yPC9UcmFuc2llbnRDaGlsZD4KKwkgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuRm9ybUF1dGhlbnRpY2F0b3I8L1RyYW5zaWVudENoaWxkPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5Ob25Mb2dpbkF1dGhlbnRpY2F0b3I8L1RyYW5zaWVudENoaWxkPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5TU0xBdXRoZW50aWNhdG9yPC9UcmFuc2llbnRDaGlsZD4KKwkgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0VmFsdmU8L1RyYW5zaWVudENoaWxkPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEVuZ2luZVZhbHZlPC9UcmFuc2llbnRDaGlsZD4KKwkgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0VmFsdmU8L1RyYW5zaWVudENoaWxkPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkNlcnRpZmljYXRlc1ZhbHZlPC9UcmFuc2llbnRDaGlsZD4KKwkgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5FcnJvclJlcG9ydFZhbHZlPC9UcmFuc2llbnRDaGlsZD4KKwkgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZXF1ZXN0TGlzdGVuZXJWYWx2ZTwvVHJhbnNpZW50Q2hpbGQ+CisJIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IkVudmlyb25tZW50IgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVudmlyb25tZW50IgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iRUpCIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVqYiIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IkxvY2FsRWpiIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dExvY2FsRWpiIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iUmVzb3VyY2UiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2UiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlJlc291cmNlcyIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICAgICA8VHJhbnNpZW50QXR0cmlidXRlPmRvY0Jhc2U8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKyAgICAgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5hbGxvd0xpbmtpbmc8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKyAgICAgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5jYWNoZU1heFNpemU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKyAgICAgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5jYWNoZVRUTDwvVHJhbnNpZW50QXR0cmlidXRlPgorICAgICAgICA8VHJhbnNpZW50QXR0cmlidXRlPmNhY2hlZDwvVHJhbnNpZW50QXR0cmlidXRlPgorICAgICAgICA8VHJhbnNpZW50QXR0cmlidXRlPmNhc2VTZW5zaXRpdmU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKyAgICAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5XQVJEaXJDb250ZXh0PC9UcmFuc2llbnRDaGlsZD4KKyAgICAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5GaWxlRGlyQ29udGV4dDwvVHJhbnNpZW50Q2hpbGQ+CisgICAgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuUHJveHlEaXJDb250ZXh0PC9UcmFuc2llbnRDaGlsZD4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iUmVzb3VyY2VFbnZSZWYiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VFbnZSZWYiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJSZXNvdXJjZUxpbmsiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VMaW5rIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iVHJhbnNhY3Rpb24iCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0VHJhbnNhY3Rpb24iCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgaWQ9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQuW0luc3RhbmNlTGlzdGVuZXJdIgorCSAgICB0YWc9Ikluc3RhbmNlTGlzdGVuZXIiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCWF0dHJpYnV0ZXM9ImZhbHNlIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JbnN0YW5jZUxpc3RlbmVyU0YiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgaWQ9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQuW1dyYXBwZXJMaWZlY3ljbGVdIgorCSAgICB0YWc9IldyYXBwZXJMaWZlY3ljbGUiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCWF0dHJpYnV0ZXM9ImZhbHNlIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5XcmFwcGVyTGlmZWN5Y2xlU0YiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgaWQ9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQuW1dyYXBwZXJMaXN0ZW5lcl0iCisJICAgIHRhZz0iV3JhcHBlckxpc3RlbmVyIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQlhdHRyaWJ1dGVzPSJmYWxzZSIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuV3JhcHBlckxpc3RlbmVyU0YiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgaWQ9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQuW1dhdGNoZWRSZXNvdXJjZV0iCisJICAgIHRhZz0iV2F0Y2hlZFJlc291cmNlIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQlhdHRyaWJ1dGVzPSJmYWxzZSIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuV2F0Y2hlZFJlc291cmNlU0YiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJTZW5kZXIiCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblRyYW5zbWl0dGVyIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIgorICAgICAgICBzdG9yZUFwcGVuZGVyQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSUR5bmFtaWNQcm9wZXJ0eVN0b3JlQXBwZW5kZXIiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJTZW5kZXIiCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJTZW5kZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJSZWNlaXZlciIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclJlY2VpdmVyIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iTWVtYmVyc2hpcCIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXJzaGlwU2VydmljZSIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IkRlcGxveWVyIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyRGVwbG95ZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPiAKKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iQ2x1c3Rlckxpc3RlbmVyIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZXNzYWdlTGlzdGVuZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorPC9SZWdpc3RyeT4KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9idWlsZC54bWwgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWQ3ZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9idWlsZC54bWwKQEAgLTAsMCArMSwxMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhLS0gQGF1dGhvciBQZXRlciBSb3NzYmFjaCAtLT4KKzxwcm9qZWN0IG5hbWU9IlRvbWNhdDogU3RvcmVDb25maWcgVGVzdGNhc2VzIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0Ij4KKwk8cHJvcGVydHkgZmlsZT0iLi4vLi4vLi4vLi4vYnVpbGQucHJvcGVydGllcyIgLz4KKwk8cHJvcGVydHkgZmlsZT0iLi4vLi4vLi4vLi4vamFrYXJ0YS10b21jYXQtNS9idWlsZC5wcm9wZXJ0aWVzLmRlZmF1bHQiIC8+CisJPHByb3BlcnR5IG5hbWU9InRlc3QucmVwb3J0LmxvZ3MiIHZhbHVlPSJsb2dzL3JlcG9ydHMiIC8+CisJPHByb3BlcnR5IG5hbWU9InRlc3QucmVzdWx0cyIgdmFsdWU9ImxvZ3MvdGVzdC1yZXN1bHRzIiAvPgorCisJPHByb3BlcnR5IG5hbWU9ImNvbXBpbGUub3B0aW1pemUiIHZhbHVlPSJ0cnVlIiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLmRlYnVnIiB2YWx1ZT0idHJ1ZSIgLz4KKwk8cHJvcGVydHkgbmFtZT0iY29tcGlsZS5zb3VyY2UiIHZhbHVlPSIxLjQiIC8+CisJPHByb3BlcnR5IG5hbWU9ImNvbXBpbGUuZGVwcmVjYXRpb24iIHZhbHVlPSJ0cnVlIiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLm5vd2FybiIgdmFsdWU9Im9mZiIgLz4KKwk8cHJvcGVydHkgbmFtZT0iY29tcGlsZS5lbmNvZGluZyIgdmFsdWU9IklTTy04ODU5LTEiIC8+CisJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkL3Rlc3QiIC8+CisJPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJzcmMvc2hhcmUiIC8+CisJPHByb3BlcnR5IG5hbWU9ImNhdGFsaW5hLmhvbWUiIHZhbHVlPSIuLi8uLi8uLi8uLi9qYWthcnRhLXRvbWNhdC01L2J1aWxkIiAvPgorCisJPCEtLSBCdWlsZCB0aGUgY2xhc3NwYXRoIC0tPgorCTxwYXRoIGlkPSJwcm9qZWN0LmNsYXNzcGF0aCI+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqbXguamFyfSIgLz4KKwkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbG9nZ2luZy5qYXJ9IiAvPgorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bG9nNGouamFyfSIgLz4KKwkJPGZpbGVzZXQgZGlyPSIke2NhdGFsaW5hLmhvbWV9L2NvbW1vbi9lbmRvcnNlZCI+CisJCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKwkJPC9maWxlc2V0PgorCQk8ZmlsZXNldCBkaXI9IiR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2xpYiI+CisJCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKwkJPC9maWxlc2V0PgorCQk8ZmlsZXNldCBkaXI9IiR7Y2F0YWxpbmEuaG9tZX0vc2VydmVyL2xpYiI+CisJCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKwkJPC9maWxlc2V0PgorCTwvcGF0aD4KKworCTx0YXJnZXQgbmFtZT0iYnVpbGQtcHJlcGFyZSI+CisJCTxhdmFpbGFibGUgcHJvcGVydHk9ImNlcnRzdG9yZS5wcmVzZW50IiBmaWxlPSJjb25mL2NhdGFsaW5hLmtleXN0b3JlIiAvPgorCQk8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iIC8+CisJCTxta2RpciBkaXI9IndlYmFwcHMvbXlhcHBzIiAvPgorCQk8bWtkaXIgZGlyPSJjb25mL0NhdGFsaW5hL2xvY2FsaG9zdCIgLz4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iaW5mbyIgZGVzY3JpcHRpb249IlNob3dzIGEgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhbnQgc2NyaXB0Ij4KKwkJPGVjaG8+CisJCQlUaGlzIGFudCBzY3JpcHQgaW1wbGVtZW50cyBzb21lIHRlc3RjYXNlcyB0byB2ZXJpZnkgdGhlIGtleSBmdW5jdGlvbnMgb2Ygc3RvcmUgdG9tY2F0IHNlcnZlci54bWwgLgorCQkJWW91IGZpbmQgdGhpcyBzY3JpcHQgYXQ6ICR7YW50LmZpbGV9CisJCTwvZWNobz4KKwk8L3RhcmdldD4KKworCTwhLS0gVGhpcyB0YXJnZXQgY29tcGlsZXMgYWxsIHNvdXJjZXMgb3V0IG9mIHRoZSAKKwkJCXByb2plY3RzIHNvdXJjZSB0cmVlIC0tPgorCTx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iYnVpbGQtcHJlcGFyZSIgZGVzY3JpcHRpb249IlRoaXMgdGFyZ2V0IGNvbXBpbGVzIGFsbCBzb3VyY2VzIG91dCBvZiB0aGUgcHJvamVjdHMgc291cmNlIHRyZWUiPgorCisJCTwhLS0gQ29waWVzIHRoZSBzdGF0aWMgcmVzb3VyY2VzIG91dCBvZiB0aGUgc3JjIHRyZWUKKwkJCQl0byB0aGUgYnVpbGQvY2xhc3NlcyBkaXIgLS0+CisJCTxjb3B5IHRvZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyI+CisJCQk8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iPgorCQkJCTxpbmNsdWRlIG5hbWU9IioqIiAvPgorCQkJCTxleGNsdWRlIG5hbWU9IioqLyouamF2YSIgLz4KKwkJCTwvZmlsZXNldD4KKwkJPC9jb3B5PgorCisJCTwhLS0gQ29tcGlsZXMgYWxsIHNvdXJjZXMgLS0+CisJCTxqYXZhYyBkZXN0ZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIgc3JjZGlyPSIke3NyYy5kaXJ9IiBpbmNsdWRlcz0iKiovKi5qYXZhIiBleGNsdWRlcz0iKiovQ1ZTLyoqIiBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iIHNvdXJjZT0iJHtjb21waWxlLnNvdXJjZX0iIG9wdGltaXplPSIke2NvbXBpbGUub3B0aW1pemV9IiBub3dhcm49IiR7Y29tcGlsZS5ub3dhcm59IiBlbmNvZGluZz0iJHtjb21waWxlLmVuY29kaW5nfSI+CisJCQk8Y2xhc3NwYXRoPgorCQkJCTxwYXRoIHJlZmlkPSJwcm9qZWN0LmNsYXNzcGF0aCIgLz4KKwkJCTwvY2xhc3NwYXRoPgorCQk8L2phdmFjPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJjb21waWxlLGdlbnN0b3JlIiBkZXNjcmlwdGlvbj0iUnVuIHVuaXQgdGVzdHMiPgorCQk8ZGVsZXRlIGRpcj0iJHt0ZXN0LnJlc3VsdHN9IiAvPgorCQk8bWtkaXIgZGlyPSIke3Rlc3QucmVzdWx0c30iIC8+CisJCTxqdW5pdCBmb3JrPSJ5ZXMiIGZhaWx1cmVQcm9wZXJ0eT0idGVzdC5mYWlsdXJlIiBmaWx0ZXJ0cmFjZT0iZmFsc2UiID4KKwkJCTxqdm1hcmcgdmFsdWU9Ii1EY2F0YWxpbmEuYmFzZT0ke2Jhc2VkaXJ9IiAvPgorCQkJPGp2bWFyZyB2YWx1ZT0iLURjYXRhbGluYS5ob21lPSR7Y2F0YWxpbmEuaG9tZX0iIC8+CisJCQk8anZtYXJnIHZhbHVlPSItRGxvZzRqLmNvbmZpZ3VyYXRpb249ZmlsZTpjb25mL2xvZzRqLnhtbCIgLz4KKwkJCTxjbGFzc3BhdGg+CisJCQkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIgLz4KKwkJCQk8cGF0aCByZWZpZD0icHJvamVjdC5jbGFzc3BhdGgiIC8+CisJCQk8L2NsYXNzcGF0aD4KKwkJCTxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIHVzZWZpbGU9ImZhbHNlIiAvPgorCQkJPGZvcm1hdHRlciB0eXBlPSJ4bWwiIC8+CisJCQk8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3QucmVzdWx0c30iPgorCQkJCTxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiIGluY2x1ZGVzPSIqKi8qVGVzdC5jbGFzcyIgLz4KKwkJCTwvYmF0Y2h0ZXN0PgorCQk8L2p1bml0PgorCQk8bWtkaXIgZGlyPSIke3Rlc3QucmVwb3J0LmxvZ3N9IiAvPgorCQk8anVuaXRyZXBvcnQgdG9kaXI9IiR7dGVzdC5yZXBvcnQubG9nc30iPgorCQkJPGZpbGVzZXQgZGlyPSIke3Rlc3QucmVzdWx0c30iIC8+CisJCQk8cmVwb3J0IGZvcm1hdD0iZnJhbWVzIiB0b2Rpcj0iJHt0ZXN0LnJlcG9ydC5sb2dzfSIgLz4KKwkJPC9qdW5pdHJlcG9ydD4KKwkJPGFudGNhbGwgdGFyZ2V0PSJjaGVja3Rlc3QiIC8+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9ImdlbnN0b3JlIiB1bmxlc3M9ImNlcnRzdG9yZS5wcmVzZW50Ij4KKwkJPGFudCBhbnRmaWxlPSJnZW5zdG9yZS54bWwiIHRhcmdldD0ic3RvcmUiIC8+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9ImNoZWNrdGVzdCIgaWY9InRlc3QuZmFpbHVyZSI+CisJCTxmYWlsIG1lc3NhZ2U9InNvbWUgdGVzdCBmYWlsZWQiIC8+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KKwkJPGRlbGV0ZSBkaXI9IiR7YnVpbGR9L2RpciIgLz4KKwkJPGRlbGV0ZSBkaXI9IndlYmFwcHMiIC8+CisJCTxkZWxldGUgZGlyPSJidWlsZCIgLz4KKwkJPGRlbGV0ZSBkaXI9IiR7dGVzdC5yZXBvcnQubG9nc30iIC8+CisJCTxkZWxldGUgZGlyPSIke3Rlc3QucmVzdWx0c30iIC8+CisJCTxkZWxldGUgZGlyPSJsb2dzIiAvPgorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9jb25mL2NhdGFsaW5hLmtleXN0b3JlIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9jb25mL2NhdGFsaW5hLmtleXN0b3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YTEyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L2NvbmYvY2F0YWxpbmEua2V5c3RvcmUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9jb25mL2NvbnRleHQueG1sIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9jb25mL2NvbnRleHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZTg4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L2NvbmYvY29udGV4dC54bWwKQEAgLTAsMCArMSw2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPENvbnRleHQKKyAgICBjb29raWVzPSJmYWxzZSIKKyAgICByZWxvYWRhYmxlPSJ0cnVlIj4KKwk8TGlzdGVuZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkluZm9MaWZlY3ljbGVMaXN0ZW5lciIgLz4KKzwvQ29udGV4dD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3QvY29uZi9sb2c0ai54bWwgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L2NvbmYvbG9nNGoueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZmFkNGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L2NvbmYvbG9nNGoueG1sCkBAIC0wLDAgKzEsNTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhRE9DVFlQRSBsb2c0ajpjb25maWd1cmF0aW9uIFNZU1RFTSAibG9nNGouZHRkIj4KKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSAtLT4KKzwhLS0gTG9nNGogQ29uZmlndXJhdGlvbiAtLT4KKzwhLS0gLS0+Cis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0gJElkJCAtLT4KKzwhLS0KK3wgRm9yIG1vcmUgY29uZmlndXJhdGlvbiBpbmZyb21hdGlvbiBhbmQgZXhhbXBsZXMgc2VlIHRoZSBKYWthcnRhIExvZzRqCit8IG93ZWJzaXRlOiBodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2xvZzRqCistLT4KKzxsb2c0ajpjb25maWd1cmF0aW9uIHhtbG5zOmxvZzRqPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2xvZzRqLyIgZGVidWc9ImZhbHNlIj4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIEFwcGVuZCBtZXNzYWdlcyB0byB0aGUgY29uc29sZSAtLT4KKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzxhcHBlbmRlciBuYW1lPSJDT05TT0xFIiBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIiPgorPHBhcmFtIG5hbWU9IlRhcmdldCIgdmFsdWU9IlN5c3RlbS5vdXQiLz4KKzxwYXJhbSBuYW1lPSJUaHJlc2hvbGQiIHZhbHVlPSJkZWJ1ZyIvPgorPGxheW91dCBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ij4KKzwhLS1UaGUgZGVmYXVsdCBwYXR0ZXJuOiBEYXRlIFByaW9yaXR5IFtDYXRlZ29yeV0gTWVzc2FnZVxuLS0+Cis8cGFyYW0gbmFtZT0iQ29udmVyc2lvblBhdHRlcm4iIHZhbHVlPSIlZHtBQlNPTFVURX0gJS01cCBbJWN7MX1dICVtJW4iLz4KKzwvbGF5b3V0PgorPC9hcHBlbmRlcj4KKworCis8Y2F0ZWdvcnkgbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZyIgCisgICAgICAgICAgIGFkZGl0aXZpdHk9ImZhbHNlIj4gCisgICA8cHJpb3JpdHkgdmFsdWU9ImluZm8iIC8+CisgICA8YXBwZW5kZXItcmVmIHJlZj0iQ09OU09MRSIgLz4KKzwvY2F0ZWdvcnk+CisKKzxjYXRlZ29yeSBuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hIiAKKyAgICAgICAgICAgYWRkaXRpdml0eT0iZmFsc2UiPiAKKyAgIDxwcmlvcml0eSB2YWx1ZT0iaW5mbyIgLz4KKyAgIDxhcHBlbmRlci1yZWYgcmVmPSJDT05TT0xFIiAvPgorPC9jYXRlZ29yeT4KKzxjYXRlZ29yeSBuYW1lPSJvcmcuYXBhY2hlLnRvbWNhdCIgCisgICAgICAgICAgIGFkZGl0aXZpdHk9ImZhbHNlIj4gCisgICA8cHJpb3JpdHkgdmFsdWU9ImVycm9yIiAvPgorICAgPGFwcGVuZGVyLXJlZiByZWY9IkNPTlNPTEUiIC8+Cis8L2NhdGVnb3J5PgorPGNhdGVnb3J5IG5hbWU9Im9yZy5hcGFjaGUubmFtaW5nIiAKKyAgICAgICAgICAgYWRkaXRpdml0eT0iZmFsc2UiPiAKKyAgIDxwcmlvcml0eSB2YWx1ZT0iaW5mbyIgLz4KKyAgIDxhcHBlbmRlci1yZWYgcmVmPSJDT05TT0xFIiAvPgorPC9jYXRlZ29yeT4KKworPCEtLSBTZXR1cCB0aGUgUm9vdCBjICAtLT4KKzxyb290PgorICAgPHByaW9yaXR5IHZhbHVlPSJpbmZvIiAvPgorICAgPGFwcGVuZGVyLXJlZiByZWY9IkNPTlNPTEUiLz4KKzwvcm9vdD4KKzwvbG9nNGo6Y29uZmlndXJhdGlvbj4gCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3QvY29uZi9zZXJ2ZXItcmVnaXN0cnktdGVzdC54bWwgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L2NvbmYvc2VydmVyLXJlZ2lzdHJ5LXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjhlOTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L2NvbmYvc2VydmVyLXJlZ2lzdHJ5LXRlc3QueG1sCkBAIC0wLDAgKzEsMzE0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFJlZ2lzdHJ5IG5hbWU9IlRvbWNhdCIgdmVyc2lvbj0iNS4xLjAiIGVuY29kaW5nPSJVVEYtOCIgPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJTZXJ2ZXIiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJ0cnVlIiAKKyAgICAgICAgY2hpbGRzPSJ0cnVlIgorICAgICAgICB0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdGFuZGFyZFNlcnZlclNGIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iU2VydmljZSIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9InRydWUiIAorICAgICAgICBjaGlsZHM9InRydWUiCisgICAgICAgIHRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2aWNlIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdGFuZGFyZFNlcnZpY2VTRiI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IkVuZ2luZSIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9InRydWUiIAorICAgICAgICBjaGlsZHM9InRydWUiCisgICAgICAgIHRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRFbmdpbmUiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0YW5kYXJkRW5naW5lU0YiPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmRvbWFpbjwvVHJhbnNpZW50QXR0cmlidXRlPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJIb3N0IgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0idHJ1ZSIgCisgICAgICAgIGNoaWxkcz0idHJ1ZSIKKyAgICAgICAgdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3QiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0YW5kYXJkSG9zdFNGIj4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5kb21haW48L1RyYW5zaWVudEF0dHJpYnV0ZT4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iQ29udGV4dCIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9InRydWUiIAorCQlzdG9yZVNlcGFyYXRlPSJ0cnVlIgorCQliYWNrdXA9InRydWUiIAorICAgICAgICBjaGlsZHM9InRydWUiCisgICAgICAgIHRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0IgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdGFuZGFyZENvbnRleHRTRiIKKyAgICAgICAgc3RvcmVBcHBlbmRlckNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlQ29udGV4dEFwcGVuZGVyIj4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5hdmFpbGFibGU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5jb25maWdGaWxlPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+Y29uZmlndXJlZDwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmRpc3BsYXlOYW1lPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZGlzdHJpYnV0YWJsZTwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmRvbWFpbjwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmVuZ2luZU5hbWU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5uYW1lPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+cHVibGljSWQ8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5yZXBsYWNlV2VsY29tZUZpbGVzPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+c2F2ZUNvbmZpZzwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPnNlc3Npb25UaW1lb3V0PC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+c3RhcnR1cFRpbWU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT50bGRTY2FuVGltZTwvVHJhbnNpZW50QXR0cmlidXRlPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKyAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk5hbWluZ1Jlc291cmNlcy5bR2xvYmFsTmFtaW5nUmVzb3VyY2VzXSIKKwkgICAgdGFnPSJHbG9iYWxOYW1pbmdSZXNvdXJjZXMiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIKKwkJYXR0cmlidXRlcz0iZmFsc2UiCisgICAgICAgIGNoaWxkcz0idHJ1ZSIKKyAgICAgICAgdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk5hbWluZ1Jlc291cmNlcyIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuR2xvYmFsTmFtaW5nUmVzb3VyY2VzU0YiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iQ29ubmVjdG9yIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0idHJ1ZSIgCisgICAgICAgIHRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5Db25uZWN0b3IiCisgICAgICAgIGNoaWxkcz0idHJ1ZSIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuQ29ubmVjdG9yU0YiCisgICAgICAgIHN0b3JlV3JpdGVyQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuQ29ubmVjdG9yU3RvcmVBcHBlbmRlciI+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+bWF4UHJvY2Vzc29yPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisgCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPm1pblByb2Nlc3NvcjwvVHJhbnNpZW50QXR0cmlidXRlPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICAgPERlc2NyaXB0aW9uCisgICAgICAgIGlkPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5Db25uZWN0b3IuW1Byb3RvY29sSGFuZGxlcl0iCisJICAgIHRhZz0iUHJvdG9jb2xIYW5kbGVyIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorICAgICAgICB0YWdDbGFzcz0ib3JnLmFwYWNoZS5jb3lvdGUuUHJvdG9jb2xIYW5kbGVyIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5jbGllbnRhdXRoPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisgCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmtleXBhc3M8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5rZXlzdG9yZTwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmtleXR5cGU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5uYW1lPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+cG9ydDwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPnByb3RvY29sPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+cHJvdG9jb2xzPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+cmFuZG9tZmlsZTwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPnNlY3VyZTwvVHJhbnNpZW50QXR0cmlidXRlPgorCSA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJOYW1pbmdSZXNvdXJjZXMiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIKKwkJYXR0cmlidXRlcz0iZmFsc2UiCisgICAgICAgIGNoaWxkcz0idHJ1ZSIKKyAgICAgICAgdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk5hbWluZ1Jlc291cmNlcyIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuTmFtaW5nUmVzb3VyY2VzU0YiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorCSA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJNYW5hZ2VyIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5TdGFuZGFyZE1hbmFnZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLk1hbmFnZXJTRiI+CisJICAgIDxUcmFuc2llbnRBdHRyaWJ1dGU+ZW50cm9weTwvVHJhbnNpZW50QXR0cmlidXRlPgorCSAgICA8VHJhbnNpZW50QXR0cmlidXRlPmRpc3RyaWJ1dGFibGU8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKyAgICA8L0Rlc2NyaXB0aW9uPgorICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9Ik1hbmFnZXIiCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorICAgICAgICBjaGlsZHM9InRydWUiCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uUGVyc2lzdGVudE1hbmFnZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlBlcnNpc3RlbnRNYW5hZ2VyU0YiPgorICAgICAgICA8VHJhbnNpZW50QXR0cmlidXRlPmVudHJvcHk8L1RyYW5zaWVudEF0dHJpYnV0ZT4KKwkgICAgPFRyYW5zaWVudEF0dHJpYnV0ZT5kaXN0cmlidXRhYmxlPC9UcmFuc2llbnRBdHRyaWJ1dGU+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlN0b3JlIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5GaWxlU3RvcmUiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJTdG9yZSIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uSkRCQ1N0b3JlIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iQ2x1c3RlciIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisgICAgICAgIGNoaWxkcz0idHJ1ZSIKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DYXRhbGluYUNsdXN0ZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkNhdGFsaW5hQ2x1c3RlclNGIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iUmVhbG0iCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbSIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlBhcmFtZXRlciIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIgorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQXBwbGljYXRpb25QYXJhbWV0ZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJMb2FkZXIiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmxvYWRlci5XZWJhcHBMb2FkZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkxvYWRlclNGIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9Ikxpc3RlbmVyIgorCQlzdGFuZGFyZD0iZmFsc2UiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5TZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcjwvVHJhbnNpZW50Q2hpbGQ+CisgICAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5OYW1pbmdDb250ZXh0TGlzdGVuZXI8L1RyYW5zaWVudENoaWxkPgorICAgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQ29udGV4dENvbmZpZzwvVHJhbnNpZW50Q2hpbGQ+CisgICAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5FbmdpbmVDb25maWc8L1RyYW5zaWVudENoaWxkPgorICAgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuSG9zdENvbmZpZzwvVHJhbnNpZW50Q2hpbGQ+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorICAgICAgICBpZD0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyLltTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcl0iCisJICAgIHRhZz0iTGlzdGVuZXIiCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorICAgICAgICB0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJWYWx2ZSIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKwkgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuQmFzaWNBdXRoZW50aWNhdG9yPC9UcmFuc2llbnRDaGlsZD4KKwkgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuRGlnZXN0QXV0aGVudGljYXRvcjwvVHJhbnNpZW50Q2hpbGQ+CisJICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkZvcm1BdXRoZW50aWNhdG9yPC9UcmFuc2llbnRDaGlsZD4KKwkgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuTm9uTG9naW5BdXRoZW50aWNhdG9yPC9UcmFuc2llbnRDaGlsZD4KKwkgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuU1NMQXV0aGVudGljYXRvcjwvVHJhbnNpZW50Q2hpbGQ+CisJICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dFZhbHZlPC9UcmFuc2llbnRDaGlsZD4KKwkgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRFbmdpbmVWYWx2ZTwvVHJhbnNpZW50Q2hpbGQ+CisJICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdFZhbHZlPC9UcmFuc2llbnRDaGlsZD4KKwkgICAgIDxUcmFuc2llbnRDaGlsZD5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5DZXJ0aWZpY2F0ZXNWYWx2ZTwvVHJhbnNpZW50Q2hpbGQ+CisJICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuRXJyb3JSZXBvcnRWYWx2ZTwvVHJhbnNpZW50Q2hpbGQ+CisJICAgICA8VHJhbnNpZW50Q2hpbGQ+b3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVxdWVzdExpc3RlbmVyVmFsdmU8L1RyYW5zaWVudENoaWxkPgorCSAgICAgPFRyYW5zaWVudENoaWxkPm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25WYWx2ZTwvVHJhbnNpZW50Q2hpbGQ+CisJIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IkVudmlyb25tZW50IgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVudmlyb25tZW50IgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iRUpCIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVqYiIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IkxvY2FsRWpiIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dExvY2FsRWpiIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iUmVzb3VyY2UiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2UiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJSZXNvdXJjZUVudlJlZiIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUVudlJlZiIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSI+CisgICAgIDwvRGVzY3JpcHRpb24+CisgICAgIDxEZXNjcmlwdGlvbgorCSAgICB0YWc9IlJlc291cmNlTGluayIKKwkJc3RhbmRhcmQ9InRydWUiCisJCWRlZmF1bHQ9ImZhbHNlIiAKKwkJdGFnQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUxpbmsiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkJaWQ9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQuW0luc3RhbmNlTGlzdGVuZXJdIgorCSAgICB0YWc9Ikluc3RhbmNlTGlzdGVuZXIiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCWF0dHJpYnV0ZXM9ImZhbHNlIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JbnN0YW5jZUxpc3RlbmVyU0YiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkJaWQ9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQuW1dyYXBwZXJMaWZlY3ljbGVdIgorCSAgICB0YWc9IldyYXBwZXJMaWZlY3ljbGUiCisJCXN0YW5kYXJkPSJ0cnVlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCWF0dHJpYnV0ZXM9ImZhbHNlIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5XcmFwcGVyTGlmZWN5Y2xlU0YiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkJaWQ9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQuW1dyYXBwZXJMaXN0ZW5lcl0iCisJICAgIHRhZz0iV3JhcHBlckxpc3RlbmVyIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQlhdHRyaWJ1dGVzPSJmYWxzZSIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuV3JhcHBlckxpc3RlbmVyU0YiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkJaWQ9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQuW1dhdGNoZWRSZXNvdXJjZV0iCisJICAgIHRhZz0iV2F0Y2hlZFJlc291cmNlIgorCQlzdGFuZGFyZD0idHJ1ZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQlhdHRyaWJ1dGVzPSJmYWxzZSIKKyAgICAgICAgc3RvcmVGYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuV2F0Y2hlZFJlc291cmNlU0YiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJTZW5kZXIiCisJCXN0YW5kYXJkPSJmYWxzZSIKKwkJZGVmYXVsdD0iZmFsc2UiIAorCQl0YWdDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJTZW5kZXIiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJSZWNlaXZlciIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclJlY2VpdmVyIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4KKyAgICAgPERlc2NyaXB0aW9uCisJICAgIHRhZz0iTWVtYmVyc2hpcCIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1lbWJlcnNoaXAiCisgICAgICAgIHN0b3JlRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiPgorICAgICA8L0Rlc2NyaXB0aW9uPgorICAgICA8RGVzY3JpcHRpb24KKwkgICAgdGFnPSJEZXBsb3llciIKKwkJc3RhbmRhcmQ9ImZhbHNlIgorCQlkZWZhdWx0PSJmYWxzZSIgCisJCXRhZ0NsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlckRlcGxveWVyIgorICAgICAgICBzdG9yZUZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIj4KKyAgICAgPC9EZXNjcmlwdGlvbj4gCis8L1JlZ2lzdHJ5PgorCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L2NvbmYvc2VydmVyLnhtbCBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3QvY29uZi9zZXJ2ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZWRlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L2NvbmYvc2VydmVyLnhtbApAQCAtMCwwICsxLDM1OSBAQAorPCEtLSBFeGFtcGxlIFNlcnZlciBDb25maWd1cmF0aW9uIEZpbGUgLS0+Cis8IS0tIE5vdGUgdGhhdCBjb21wb25lbnQgZWxlbWVudHMgYXJlIG5lc3RlZCBjb3JyZXNwb25kaW5nIHRvIHRoZWlyCisgICAgIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzIHdpdGggZWFjaCBvdGhlciAtLT4KKworPCEtLSBBICJTZXJ2ZXIiIGlzIGEgc2luZ2xldG9uIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSBlbnRpcmUgSlZNLAorICAgICB3aGljaCBtYXkgY29udGFpbiBvbmUgb3IgbW9yZSAiU2VydmljZSIgaW5zdGFuY2VzLiAgVGhlIFNlcnZlcgorICAgICBsaXN0ZW5zIGZvciBhIHNodXRkb3duIGNvbW1hbmQgb24gdGhlIGluZGljYXRlZCBwb3J0LgorCisgICAgIE5vdGU6ICBBICJTZXJ2ZXIiIGlzIG5vdCBpdHNlbGYgYSAiQ29udGFpbmVyIiwgc28geW91IG1heSBub3QKKyAgICAgZGVmaW5lIHN1YmNvbXBvbmVudHMgc3VjaCBhcyAiVmFsdmVzIiBvciAiTG9nZ2VycyIgYXQgdGhpcyBsZXZlbC4KKyAtLT4KKworPFNlcnZlciBwb3J0PSI4MDA1IiBzaHV0ZG93bj0iU0hVVERPV04iIGRlYnVnPSIwIj4KKworCisgIDwhLS0gQ29tbWVudCB0aGVzZSBlbnRyaWVzIG91dCB0byBkaXNhYmxlIEpNWCBNQmVhbnMgc3VwcG9ydCAtLT4KKyAgPCEtLSBZb3UgbWF5IGFsc28gY29uZmlndXJlIGN1c3RvbSBjb21wb25lbnRzIChlLmcuIFZhbHZlcy9SZWFsbXMpIGJ5IAorICAgICAgIGluY2x1ZGluZyB5b3VyIG93biBtYmVhbi1kZXNjcmlwdG9yIGZpbGUocyksIGFuZCBzZXR0aW5nIHRoZSAKKyAgICAgICAiZGVzY3JpcHRvcnMiIGF0dHJpYnV0ZSB0byBwb2ludCB0byBhICc7JyBzZXBlcmF0ZWQgbGlzdCBvZiBwYXRocworICAgICAgIChpbiB0aGUgQ2xhc3NMb2FkZXIgc2Vuc2UpIG9mIGZpbGVzIHRvIGFkZCB0byB0aGUgZGVmYXVsdCBsaXN0LgorICAgICAgIGUuZy4gZGVzY3JpcHRvcnM9Ii9jb20vbXlmaXJtL215cGFja2FnZS9tYmVhbi1kZXNjcmlwdG9yLnhtbCIKKyAgLS0+CisgIDxMaXN0ZW5lciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIgorICAgICAgICAgICAgZGVidWc9IjAiLz4KKyAgPExpc3RlbmVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuR2xvYmFsUmVzb3VyY2VzTGlmZWN5Y2xlTGlzdGVuZXIiCisgICAgICAgICAgICBkZWJ1Zz0iMCIvPgorCisgIDwhLS0gR2xvYmFsIEpOREkgcmVzb3VyY2VzIC0tPgorICA8R2xvYmFsTmFtaW5nUmVzb3VyY2VzPgorCisgICAgPCEtLSBUZXN0IGVudHJ5IGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIC0tPgorICAgIDxFbnZpcm9ubWVudCBuYW1lPSJzaW1wbGVWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLkludGVnZXIiIHZhbHVlPSIzMCIvPgorCisgICAgPCEtLSBFZGl0YWJsZSB1c2VyIGRhdGFiYXNlIHRoYXQgY2FuIGFsc28gYmUgdXNlZCBieQorICAgICAgICAgVXNlckRhdGFiYXNlUmVhbG0gdG8gYXV0aGVudGljYXRlIHVzZXJzIC0tPgorICAgIDxSZXNvdXJjZSBuYW1lPSJVc2VyRGF0YWJhc2UiIGF1dGg9IkNvbnRhaW5lciIKKyAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2UiCisgICAgICAgZGVzY3JpcHRpb249IlVzZXIgZGF0YWJhc2UgdGhhdCBjYW4gYmUgdXBkYXRlZCBhbmQgc2F2ZWQiCisgICAgICAgICAgIGZhY3Rvcnk9Im9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnMuTWVtb3J5VXNlckRhdGFiYXNlRmFjdG9yeSIKKyAgICAgICAgICBwYXRobmFtZT0iY29uZi90b21jYXQtdXNlcnMueG1sIiAvPgorCisgIDwvR2xvYmFsTmFtaW5nUmVzb3VyY2VzPgorCisgIDwhLS0gQSAiU2VydmljZSIgaXMgYSBjb2xsZWN0aW9uIG9mIG9uZSBvciBtb3JlICJDb25uZWN0b3JzIiB0aGF0IHNoYXJlCisgICAgICAgYSBzaW5nbGUgIkNvbnRhaW5lciIgKGFuZCB0aGVyZWZvcmUgdGhlIHdlYiBhcHBsaWNhdGlvbnMgdmlzaWJsZQorICAgICAgIHdpdGhpbiB0aGF0IENvbnRhaW5lcikuICBOb3JtYWxseSwgdGhhdCBDb250YWluZXIgaXMgYW4gIkVuZ2luZSIsCisgICAgICAgYnV0IHRoaXMgaXMgbm90IHJlcXVpcmVkLgorCisgICAgICAgTm90ZTogIEEgIlNlcnZpY2UiIGlzIG5vdCBpdHNlbGYgYSAiQ29udGFpbmVyIiwgc28geW91IG1heSBub3QKKyAgICAgICBkZWZpbmUgc3ViY29tcG9uZW50cyBzdWNoIGFzICJWYWx2ZXMiIG9yICJMb2dnZXJzIiBhdCB0aGlzIGxldmVsLgorICAgLS0+CisKKyAgPCEtLSBEZWZpbmUgdGhlIFRvbWNhdCBTdGFuZC1BbG9uZSBTZXJ2aWNlIC0tPgorICA8U2VydmljZSBuYW1lPSJDYXRhbGluYSI+CisKKyAgICA8IS0tIEEgIkNvbm5lY3RvciIgcmVwcmVzZW50cyBhbiBlbmRwb2ludCBieSB3aGljaCByZXF1ZXN0cyBhcmUgcmVjZWl2ZWQKKyAgICAgICAgIGFuZCByZXNwb25zZXMgYXJlIHJldHVybmVkLiAgRWFjaCBDb25uZWN0b3IgcGFzc2VzIHJlcXVlc3RzIG9uIHRvIHRoZQorICAgICAgICAgYXNzb2NpYXRlZCAiQ29udGFpbmVyIiAobm9ybWFsbHkgYW4gRW5naW5lKSBmb3IgcHJvY2Vzc2luZy4KKworICAgICAgICAgQnkgZGVmYXVsdCwgYSBub24tU1NMIEhUVFAvMS4xIENvbm5lY3RvciBpcyBlc3RhYmxpc2hlZCBvbiBwb3J0IDgwODAuCisgICAgICAgICBZb3UgY2FuIGFsc28gZW5hYmxlIGFuIFNTTCBIVFRQLzEuMSBDb25uZWN0b3Igb24gcG9ydCA4NDQzIGJ5CisgICAgICAgICBmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyBiZWxvdyBhbmQgdW5jb21tZW50aW5nIHRoZSBzZWNvbmQgQ29ubmVjdG9yCisgICAgICAgICBlbnRyeS4gIFNTTCBzdXBwb3J0IHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgc3RlcHMgKHNlZSB0aGUgU1NMIENvbmZpZworICAgICAgICAgSE9XVE8gaW4gdGhlIFRvbWNhdCA1IGRvY3VtZW50YXRpb24gYnVuZGxlIGZvciBtb3JlIGRldGFpbGVkCisgICAgICAgICBpbnN0cnVjdGlvbnMpOgorICAgICAgICAgKiBJZiB5b3VyIEpESyB2ZXJzaW9uIDEuMyBvciBwcmlvciwgZG93bmxvYWQgYW5kIGluc3RhbGwgSlNTRSAxLjAuMiBvcgorICAgICAgICAgICBsYXRlciwgYW5kIHB1dCB0aGUgSkFSIGZpbGVzIGludG8gIiRKQVZBX0hPTUUvanJlL2xpYi9leHQiLgorICAgICAgICAgKiBFeGVjdXRlOgorICAgICAgICAgICAgICVKQVZBX0hPTUUlXGJpblxrZXl0b29sIC1nZW5rZXkgLWFsaWFzIHRvbWNhdCAta2V5YWxnIFJTQSAoV2luZG93cykKKyAgICAgICAgICAgICAkSkFWQV9IT01FL2Jpbi9rZXl0b29sIC1nZW5rZXkgLWFsaWFzIHRvbWNhdCAta2V5YWxnIFJTQSAgKFVuaXgpCisgICAgICAgICAgIHdpdGggYSBwYXNzd29yZCB2YWx1ZSBvZiAiY2hhbmdlaXQiIGZvciBib3RoIHRoZSBjZXJ0aWZpY2F0ZSBhbmQKKyAgICAgICAgICAgdGhlIGtleXN0b3JlIGl0c2VsZi4KKworICAgICAgICAgQnkgZGVmYXVsdCwgRE5TIGxvb2t1cHMgYXJlIGVuYWJsZWQgd2hlbiBhIHdlYiBhcHBsaWNhdGlvbiBjYWxscworICAgICAgICAgcmVxdWVzdC5nZXRSZW1vdGVIb3N0KCkuICBUaGlzIGNhbiBoYXZlIGFuIGFkdmVyc2UgaW1wYWN0IG9uCisgICAgICAgICBwZXJmb3JtYW5jZSwgc28geW91IGNhbiBkaXNhYmxlIGl0IGJ5IHNldHRpbmcgdGhlCisgICAgICAgICAiZW5hYmxlTG9va3VwcyIgYXR0cmlidXRlIHRvICJmYWxzZSIuICBXaGVuIEROUyBsb29rdXBzIGFyZSBkaXNhYmxlZCwKKyAgICAgICAgIHJlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpIHdpbGwgcmV0dXJuIHRoZSBTdHJpbmcgdmVyc2lvbiBvZiB0aGUKKyAgICAgICAgIElQIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBjbGllbnQuCisgICAgLS0+CisKKyAgICA8IS0tIERlZmluZSBhIG5vbi1TU0wgSFRUUC8xLjEgQ29ubmVjdG9yIG9uIHBvcnQgODA4MCAtLT4KKyAgICA8Q29ubmVjdG9yIHBvcnQ9IjgwODAiCisgICAgICAgICAgICAgICBtYXhUaHJlYWRzPSIxNTAiIG1pblNwYXJlVGhyZWFkcz0iMjUiIG1heFNwYXJlVGhyZWFkcz0iNzUiCisgICAgICAgICAgICAgICBlbmFibGVMb29rdXBzPSJmYWxzZSIgcmVkaXJlY3RQb3J0PSI4NDQzIiBhY2NlcHRDb3VudD0iMTAwIgorICAgICAgICAgICAgICAgZGVidWc9IjAiIGNvbm5lY3Rpb25UaW1lb3V0PSIyMDAwMCIgCisgICAgICAgICAgICAgICBkaXNhYmxlVXBsb2FkVGltZW91dD0idHJ1ZSIgLz4KKyAgICA8IS0tIE5vdGUgOiBUbyBkaXNhYmxlIGNvbm5lY3Rpb24gdGltZW91dHMsIHNldCBjb25uZWN0aW9uVGltZW91dCB2YWx1ZQorICAgICB0byAwIC0tPgorCQorCTwhLS0gTm90ZSA6IFRvIHVzZSBnemlwIGNvbXByZXNzaW9uIHlvdSBjb3VsZCBzZXQgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIDoKKwkKKwkJCSAgIGNvbXByZXNzaW9uPSJvbiIgCisJCQkgICBjb21wcmVzc2lvbk1pblNpemU9IjIwNDgiIAorCQkJICAgbm9Db21wcmVzc2lvblVzZXJBZ2VudHM9ImdvemlsbGEsIHRyYXZpYXRhIiAKKwkJCSAgIGNvbXByZXNzYWJsZU1pbWVUeXBlPSJ0ZXh0L2h0bWwsdGV4dC94bWwiCisJLS0+CisKKyAgICA8IS0tIERlZmluZSBhIFNTTCBIVFRQLzEuMSBDb25uZWN0b3Igb24gcG9ydCA4NDQzIC0tPgorICAgIDwhLS0KKyAgICA8Q29ubmVjdG9yIHBvcnQ9Ijg0NDMiIAorICAgICAgICAgICAgICAgbWF4VGhyZWFkcz0iMTUwIiBtaW5TcGFyZVRocmVhZHM9IjI1IiBtYXhTcGFyZVRocmVhZHM9Ijc1IgorICAgICAgICAgICAgICAgZW5hYmxlTG9va3Vwcz0iZmFsc2UiIGRpc2FibGVVcGxvYWRUaW1lb3V0PSJ0cnVlIgorICAgICAgICAgICAgICAgYWNjZXB0Q291bnQ9IjEwMCIgZGVidWc9IjAiIHNjaGVtZT0iaHR0cHMiIHNlY3VyZT0idHJ1ZSIKKyAgICAgICAgICAgICAgIGNsaWVudEF1dGg9ImZhbHNlIiBzc2xQcm90b2NvbD0iVExTIiAvPgorICAgIC0tPgorCisgICAgPCEtLSBEZWZpbmUgYW4gQUpQIDEuMyBDb25uZWN0b3Igb24gcG9ydCA4MDA5IC0tPgorICAgIDxDb25uZWN0b3IgcG9ydD0iODAwOSIgCisgICAgICAgICAgICAgICBlbmFibGVMb29rdXBzPSJmYWxzZSIgcmVkaXJlY3RQb3J0PSI4NDQzIiBkZWJ1Zz0iMCIKKyAgICAgICAgICAgICAgIHByb3RvY29sPSJBSlAvMS4zIiAvPgorCisgICAgPCEtLSBEZWZpbmUgYSBQcm94aWVkIEhUVFAvMS4xIENvbm5lY3RvciBvbiBwb3J0IDgwODIgLS0+CisgICAgPCEtLSBTZWUgcHJveHkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyB0aGlzLiAtLT4KKyAgICA8IS0tCisgICAgPENvbm5lY3RvciBwb3J0PSI4MDgyIiAKKyAgICAgICAgICAgICAgIG1heFRocmVhZHM9IjE1MCIgbWluU3BhcmVUaHJlYWRzPSIyNSIgbWF4U3BhcmVUaHJlYWRzPSI3NSIKKyAgICAgICAgICAgICAgIGVuYWJsZUxvb2t1cHM9ImZhbHNlIgorICAgICAgICAgICAgICAgYWNjZXB0Q291bnQ9IjEwMCIgZGVidWc9IjAiIGNvbm5lY3Rpb25UaW1lb3V0PSIyMDAwMCIKKyAgICAgICAgICAgICAgIHByb3h5UG9ydD0iODAiIGRpc2FibGVVcGxvYWRUaW1lb3V0PSJ0cnVlIiAvPgorICAgIC0tPgorCisgICAgPCEtLSBBbiBFbmdpbmUgcmVwcmVzZW50cyB0aGUgZW50cnkgcG9pbnQgKHdpdGhpbiBDYXRhbGluYSkgdGhhdCBwcm9jZXNzZXMKKyAgICAgICAgIGV2ZXJ5IHJlcXVlc3QuICBUaGUgRW5naW5lIGltcGxlbWVudGF0aW9uIGZvciBUb21jYXQgc3RhbmQgYWxvbmUKKyAgICAgICAgIGFuYWx5emVzIHRoZSBIVFRQIGhlYWRlcnMgaW5jbHVkZWQgd2l0aCB0aGUgcmVxdWVzdCwgYW5kIHBhc3NlcyB0aGVtCisgICAgICAgICBvbiB0byB0aGUgYXBwcm9wcmlhdGUgSG9zdCAodmlydHVhbCBob3N0KS4gLS0+CisKKyAgICA8IS0tIFlvdSBzaG91bGQgc2V0IGp2bVJvdXRlIHRvIHN1cHBvcnQgbG9hZC1iYWxhbmNpbmcgdmlhIEFKUCBpZSA6CisgICAgPEVuZ2luZSBuYW1lPSJTdGFuZGFsb25lIiBkZWZhdWx0SG9zdD0ibG9jYWxob3N0IiBkZWJ1Zz0iMCIganZtUm91dGU9Imp2bTEiPiAgICAgICAgIAorICAgIC0tPiAKKyAgICAgICAgIAorICAgIDwhLS0gRGVmaW5lIHRoZSB0b3AgbGV2ZWwgY29udGFpbmVyIGluIG91ciBjb250YWluZXIgaGllcmFyY2h5IC0tPgorICAgIDxFbmdpbmUgbmFtZT0iQ2F0YWxpbmEiIGRlZmF1bHRIb3N0PSJsb2NhbGhvc3QiIGRlYnVnPSIwIj4KKworICAgICAgPCEtLSBUaGUgcmVxdWVzdCBkdW1wZXIgdmFsdmUgZHVtcHMgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhYm91dAorICAgICAgICAgICB0aGUgcmVxdWVzdCBoZWFkZXJzIGFuZCBjb29raWVzIHRoYXQgd2VyZSByZWNlaXZlZCwgYW5kIHRoZSByZXNwb25zZQorICAgICAgICAgICBoZWFkZXJzIGFuZCBjb29raWVzIHRoYXQgd2VyZSBzZW50LCBmb3IgYWxsIHJlcXVlc3RzIHJlY2VpdmVkIGJ5CisgICAgICAgICAgIHRoaXMgaW5zdGFuY2Ugb2YgVG9tY2F0LiAgSWYgeW91IGNhcmUgb25seSBhYm91dCByZXF1ZXN0cyB0byBhCisgICAgICAgICAgIHBhcnRpY3VsYXIgdmlydHVhbCBob3N0LCBvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24sIG5lc3QgdGhpcworICAgICAgICAgICBlbGVtZW50IGluc2lkZSB0aGUgY29ycmVzcG9uZGluZyA8SG9zdD4gb3IgPENvbnRleHQ+IGVudHJ5IGluc3RlYWQuCisKKyAgICAgICAgICAgRm9yIGEgc2ltaWxhciBtZWNoYW5pc20gdGhhdCBpcyBwb3J0YWJsZSB0byBhbGwgU2VydmxldCAyLjQKKyAgICAgICAgICAgY29udGFpbmVycywgY2hlY2sgb3V0IHRoZSAiUmVxdWVzdER1bXBlckZpbHRlciIgRmlsdGVyIGluIHRoZQorICAgICAgICAgICBleGFtcGxlIGFwcGxpY2F0aW9uICh0aGUgc291cmNlIGZvciB0aGlzIGZpbHRlciBtYXkgYmUgZm91bmQgaW4KKyAgICAgICAgICAgIiRDQVRBTElOQV9IT01FL3dlYmFwcHMvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2ZpbHRlcnMiKS4KKworICAgICAgICAgICBSZXF1ZXN0IGR1bXBpbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4gIFVuY29tbWVudCB0aGUgZm9sbG93aW5nCisgICAgICAgICAgIGVsZW1lbnQgdG8gZW5hYmxlIGl0LiAtLT4KKyAgICAgIDwhLS0KKyAgICAgIDxWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlcXVlc3REdW1wZXJWYWx2ZSIvPgorICAgICAgLS0+CisKKyAgICAgIDwhLS0gQmVjYXVzZSB0aGlzIFJlYWxtIGlzIGhlcmUsIGFuIGluc3RhbmNlIHdpbGwgYmUgc2hhcmVkIGdsb2JhbGx5IC0tPgorCisgICAgICA8IS0tIFRoaXMgUmVhbG0gdXNlcyB0aGUgVXNlckRhdGFiYXNlIGNvbmZpZ3VyZWQgaW4gdGhlIGdsb2JhbCBKTkRJCisgICAgICAgICAgIHJlc291cmNlcyB1bmRlciB0aGUga2V5ICJVc2VyRGF0YWJhc2UiLiAgQW55IGVkaXRzCisgICAgICAgICAgIHRoYXQgYXJlIHBlcmZvcm1lZCBhZ2FpbnN0IHRoaXMgVXNlckRhdGFiYXNlIGFyZSBpbW1lZGlhdGVseQorICAgICAgICAgICBhdmFpbGFibGUgZm9yIHVzZSBieSB0aGUgUmVhbG0uICAtLT4KKyAgICAgIDxSZWFsbSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uVXNlckRhdGFiYXNlUmVhbG0iCisgICAgICAgICAgICAgICAgIGRlYnVnPSIwIiByZXNvdXJjZU5hbWU9IlVzZXJEYXRhYmFzZSIvPgorCisgICAgICA8IS0tIENvbW1lbnQgb3V0IHRoZSBvbGQgcmVhbG0gYnV0IGxlYXZlIGhlcmUgZm9yIG5vdyBpbiBjYXNlIHdlCisgICAgICAgICAgIG5lZWQgdG8gZ28gYmFjayBxdWlja2x5IC0tPgorICAgICAgPCEtLQorICAgICAgPFJlYWxtIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5NZW1vcnlSZWFsbSIgLz4KKyAgICAgIC0tPgorCisgICAgICA8IS0tIFJlcGxhY2UgdGhlIGFib3ZlIFJlYWxtIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgdG8gZ2V0IGEgUmVhbG0KKyAgICAgICAgICAgc3RvcmVkIGluIGEgZGF0YWJhc2UgYW5kIGFjY2Vzc2VkIHZpYSBKREJDIC0tPgorCisgICAgICA8IS0tCisgICAgICA8UmVhbG0gIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG0iIGRlYnVnPSI5OSIKKyAgICAgICAgICAgICBkcml2ZXJOYW1lPSJvcmcuZ2p0Lm1tLm15c3FsLkRyaXZlciIKKyAgICAgICAgICBjb25uZWN0aW9uVVJMPSJqZGJjOm15c3FsOi8vbG9jYWxob3N0L2F1dGhvcml0eSIKKyAgICAgICAgIGNvbm5lY3Rpb25OYW1lPSJ0ZXN0IiBjb25uZWN0aW9uUGFzc3dvcmQ9InRlc3QiCisgICAgICAgICAgICAgIHVzZXJUYWJsZT0idXNlcnMiIHVzZXJOYW1lQ29sPSJ1c2VyX25hbWUiIHVzZXJDcmVkQ29sPSJ1c2VyX3Bhc3MiCisgICAgICAgICAgdXNlclJvbGVUYWJsZT0idXNlcl9yb2xlcyIgcm9sZU5hbWVDb2w9InJvbGVfbmFtZSIgLz4KKyAgICAgIC0tPgorCisgICAgICA8IS0tCisgICAgICA8UmVhbG0gIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG0iIGRlYnVnPSI5OSIKKyAgICAgICAgICAgICBkcml2ZXJOYW1lPSJvcmFjbGUuamRiYy5kcml2ZXIuT3JhY2xlRHJpdmVyIgorICAgICAgICAgIGNvbm5lY3Rpb25VUkw9ImpkYmM6b3JhY2xlOnRoaW46QG50c2VydmVyOjE1MjE6T1JDTCIKKyAgICAgICAgIGNvbm5lY3Rpb25OYW1lPSJzY290dCIgY29ubmVjdGlvblBhc3N3b3JkPSJ0aWdlciIKKyAgICAgICAgICAgICAgdXNlclRhYmxlPSJ1c2VycyIgdXNlck5hbWVDb2w9InVzZXJfbmFtZSIgdXNlckNyZWRDb2w9InVzZXJfcGFzcyIKKyAgICAgICAgICB1c2VyUm9sZVRhYmxlPSJ1c2VyX3JvbGVzIiByb2xlTmFtZUNvbD0icm9sZV9uYW1lIiAvPgorICAgICAgLS0+CisKKyAgICAgIDwhLS0KKyAgICAgIDxSZWFsbSAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpEQkNSZWFsbSIgZGVidWc9Ijk5IgorICAgICAgICAgICAgIGRyaXZlck5hbWU9InN1bi5qZGJjLm9kYmMuSmRiY09kYmNEcml2ZXIiCisgICAgICAgICAgY29ubmVjdGlvblVSTD0iamRiYzpvZGJjOkNBVEFMSU5BIgorICAgICAgICAgICAgICB1c2VyVGFibGU9InVzZXJzIiB1c2VyTmFtZUNvbD0idXNlcl9uYW1lIiB1c2VyQ3JlZENvbD0idXNlcl9wYXNzIgorICAgICAgICAgIHVzZXJSb2xlVGFibGU9InVzZXJfcm9sZXMiIHJvbGVOYW1lQ29sPSJyb2xlX25hbWUiIC8+CisgICAgICAtLT4KKworICAgICAgPCEtLSBEZWZpbmUgdGhlIGRlZmF1bHQgdmlydHVhbCBob3N0CisgICAgICAgICAgIE5vdGU6IFhNTCBTY2hlbWEgdmFsaWRhdGlvbiB3aWxsIG5vdCB3b3JrIHdpdGggWGVyY2VzIDIuMi4KKyAgICAgICAtLT4KKyAgICAgIDxIb3N0IG5hbWU9ImxvY2FsaG9zdCIgZGVidWc9IjAiIGFwcEJhc2U9IndlYmFwcHMiCisgICAgICAgdW5wYWNrV0FScz0idHJ1ZSIgYXV0b0RlcGxveT0idHJ1ZSIKKyAgICAgICB4bWxWYWxpZGF0aW9uPSJmYWxzZSIgeG1sTmFtZXNwYWNlQXdhcmU9ImZhbHNlIj4KKworICAgICAgICA8IS0tIERlZmluZXMgYSBjbHVzdGVyIGZvciB0aGlzIG5vZGUsCisgICAgICAgICAgICAgQnkgZGVmaW5pbmcgdGhpcyBlbGVtZW50LCBtZWFucyB0aGF0IGV2ZXJ5IG1hbmFnZXIgd2lsbCBiZSBjaGFuZ2VkLgorICAgICAgICAgICAgIFNvIHdoZW4gcnVubmluZyBhIGNsdXN0ZXIsIG9ubHkgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgd2ViYXBwcyBpbiB0aGVyZQorICAgICAgICAgICAgIHRoYXQgbmVlZCB0byBiZSBjbHVzdGVyZWQgYW5kIHJlbW92ZSB0aGUgb3RoZXIgb25lcy4KKyAgICAgICAgICAgICBBIGNsdXN0ZXIgaGFzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2x1c3RlciBjbGFzcworCisgICAgICAgICAgICAgbmFtZSA9IGEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgeW91ciBjbHVzdGVyLCBjYW4gYmUgYW55dGhpbmcKKworICAgICAgICAgICAgIGRlYnVnID0gdGhlIGRlYnVnIGxldmVsLCBoaWdoZXIgbWVhbnMgbW9yZSBvdXRwdXQKKworICAgICAgICAgICAgIG1jYXN0QWRkciA9IHRoZSBtdWx0aWNhc3QgYWRkcmVzcywgaGFzIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgdGhlIG5vZGVzCisKKyAgICAgICAgICAgICBtY2FzdFBvcnQgPSB0aGUgbXVsdGljYXN0IHBvcnQsIGhhcyB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIHRoZSBub2RlcworICAgICAgICAgICAgIAorICAgICAgICAgICAgIG1jYXN0QmluZEFkZHIgPSBiaW5kIHRoZSBtdWx0aWNhc3Qgc29ja2V0IHRvIGEgc3BlY2lmaWMgYWRkcmVzcworICAgICAgICAgICAgIAorICAgICAgICAgICAgIG1jYXN0VFRMID0gdGhlIG11bHRpY2FzdCBUVEwgaWYgeW91IHdhbnQgdG8gbGltaXQgeW91ciBicm9hZGNhc3QKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICBtY2FzdFNvVGltZW91dCA9IHRoZSBtdWx0aWNhc3QgcmVhZHRpbWVvdXQgCisKKyAgICAgICAgICAgICBtY2FzdEZyZXF1ZW5jeSA9IHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIGJldHdlZW4gc2VuZGluZyBhICJJJ20gYWxpdmUiIGhlYXJ0YmVhdAorCisgICAgICAgICAgICAgbWNhc3REcm9wVGltZSA9IHRoZSBudW1iZXIgYSBtaWxsaXNlY29uZHMgYmVmb3JlIGEgbm9kZSBpcyBjb25zaWRlcmVkICJkZWFkIiBpZiBubyBoZWFydGJlYXQgaXMgcmVjZWl2ZWQKKworICAgICAgICAgICAgIHRjcFRocmVhZENvdW50ID0gdGhlIG51bWJlciBvZiB0aHJlYWRzIHRvIGhhbmRsZSBpbmNvbWluZyByZXBsaWNhdGlvbiByZXF1ZXN0cywgb3B0aW1hbCB3b3VsZCBiZSB0aGUgc2FtZSBhbW91bnQgb2YgdGhyZWFkcyBhcyBub2RlcyAKKworICAgICAgICAgICAgIHRjcExpc3RlbkFkZHJlc3MgPSB0aGUgbGlzdGVuIGFkZHJlc3MgKGJpbmQgYWRkcmVzcykgZm9yIFRDUCBjbHVzdGVyIHJlcXVlc3Qgb24gdGhpcyBob3N0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY2FzZSBvZiBtdWx0aXBsZSBldGhlcm5ldCBjYXJkcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBtZWFucyB0aGF0IGFkZHJlc3MgYmVjb21lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0QWRkcmVzcygpCisKKyAgICAgICAgICAgICB0Y3BMaXN0ZW5Qb3J0ID0gdGhlIHRjcCBsaXN0ZW4gcG9ydAorCisgICAgICAgICAgICAgdGNwU2VsZWN0b3JUaW1lb3V0ID0gdGhlIHRpbWVvdXQgKG1zKSBmb3IgdGhlIFNlbGVjdG9yLnNlbGVjdCgpIG1ldGhvZCBpbiBjYXNlIHRoZSBPUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBhIHdha3VwIGJ1ZyBpbiBqYXZhLm5pby4gU2V0IHRvIDAgZm9yIG5vIHRpbWVvdXQKKworICAgICAgICAgICAgIHByaW50VG9TY3JlZW4gPSB0cnVlIG1lYW5zIHRoYXQgbWFuYWdlcnMgd2lsbCBhbHNvIHByaW50IHRvIHN0ZC5vdXQKKworICAgICAgICAgICAgIGV4cGlyZVNlc3Npb25zT25TaHV0ZG93biA9IHRydWUgbWVhbnMgdGhhdCAKKworICAgICAgICAgICAgIHVzZURpcnR5RmxhZyA9IHRydWUgbWVhbnMgdGhhdCB3ZSBvbmx5IHJlcGxpY2F0ZSBhIHNlc3Npb24gYWZ0ZXIgc2V0QXR0cmlidXRlLHJlbW92ZUF0dHJpYnV0ZSBoYXMgYmVlbiBjYWxsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgbWVhbnMgdG8gcmVwbGljYXRlIHRoZSBzZXNzaW9uIGFmdGVyIGVhY2ggcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBtZWFucyB0aGF0IHJlcGxpY2F0aW9uIHdvdWxkIHdvcmsgZm9yIHRoZSBmb2xsb3dpbmcgcGllY2Ugb2YgY29kZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8JQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hNYXAgbWFwID0gKEhhc2hNYXApc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoIm1hcCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoImtleSIsInZhbHVlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJT4KKyAgICAgICAgICAgICByZXBsaWNhdGlvbk1vZGUgPSBjYW4gYmUgZWl0aGVyICdwb29sZWQnLCAnc3luY2hyb25vdXMnIG9yICdhc3luY2hyb25vdXMnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUG9vbGVkIG1lYW5zIHRoYXQgdGhlIHJlcGxpY2F0aW9uIGhhcHBlbnMgdXNpbmcgc2V2ZXJhbCBzb2NrZXRzIGluIGEgc3luY2hyb25vdXMgd2F5LiBJZSwgdGhlIGRhdGEgZ2V0cyByZXBsaWNhdGVkLCB0aGVuIHRoZSByZXF1ZXN0IHJldHVybi4gVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgJ3N5bmNocm9ub3VzJyBzZXR0aW5nIGV4Y2VwdCBpdCB1c2VzIGEgcG9vbCBvZiBzb2NrZXRzLCBoZW5jZSBpdCBpcyBtdWx0aXRocmVhZGVkLiBUaGlzIGlzIHRoZSBmYXN0ZXN0IGFuZCBzYWZlc3QgY29uZmlndXJhdGlvbi4gVG8gdXNlIHRoaXMsIGFsc28gaW5jcmVhc2UgdGhlIG5yIG9mIHRjcCB0aHJlYWRzIHRoYXQgeW91IGhhdmUgZGVhbGluZyB3aXRoIHJlcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU3luY2hyb25vdXMgbWVhbnMgdGhhdCB0aGUgdGhyZWFkIHRoYXQgZXhlY3V0ZXMgdGhlIHJlcXVlc3QsIGlzIGFsc28gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkIHRoZSByZXBsaWNhdGVzIHRoZSBkYXRhIHRvIHRoZSBvdGhlciBub2RlcywgYW5kIHdpbGwgbm90IHJldHVybiB1bnRpbCBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlcyBoYXZlIHJlY2VpdmVkIHRoZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFzeW5jaHJvbm91cyBtZWFucyB0aGF0IHRoZXJlIGlzIGEgc3BlY2lmaWMgJ3NlbmRlcicgdGhyZWFkIGZvciBlYWNoIGNsdXN0ZXIgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGUgcmVxdWVzdCB0aHJlYWQgd2lsbCBxdWV1ZSB0aGUgcmVwbGljYXRpb24gcmVxdWVzdCBpbnRvIGEgInNtYXJ0IiBxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiByZXR1cm4gdG8gdGhlIGNsaWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgInNtYXJ0IiBxdWV1ZSBpcyBhIHF1ZXVlIHdoZXJlIHdoZW4gYSBzZXNzaW9uIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZSwgYW5kIHRoZSBzYW1lIHNlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcXVldWUgZnJvbSBhIHByZXZpb3VzIHJlcXVlc3QsIHRoYXQgc2Vzc2lvbiB3aWxsIGJlIHJlcGxhY2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHF1ZXVlIGluc3RlYWQgb2YgcmVwbGljYXRpbmcgdHdvIHJlcXVlc3RzLiBUaGlzIGFsbW9zdCBuZXZlciBoYXBwZW5zLCB1bmxlc3MgdGhlcmUgaXMgYSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXJnZSBuZXR3b3JrIGRlbGF5LgorICAgICAgICAtLT4gICAgICAgICAgICAgCisgICAgICAgIDwhLS0KKyAgICAgICAgICAgIFdoZW4gY29uZmlndXJpbmcgZm9yIGNsdXN0ZXJpbmcsIHlvdSBhbHNvIGFkZCBpbiBhIHZhbHZlIHRvIGNhdGNoIGFsbCB0aGUgcmVxdWVzdHMKKyAgICAgICAgICAgIGNvbWluZyBpbiwgYXQgdGhlIGVuZCBvZiB0aGUgcmVxdWVzdCwgdGhlIHNlc3Npb24gbWF5IG9yIG1heSBub3QgYmUgcmVwbGljYXRlZC4KKyAgICAgICAgICAgIEEgc2Vzc2lvbiBpcyByZXBsaWNhdGVkIGlmIGFuZCBvbmx5IGlmIGFsbCB0aGUgY29uZGl0aW9ucyBhcmUgbWV0OgorICAgICAgICAgICAgMS4gdXNlRGlydHlGbGFnIGlzIHRydWUgb3Igc2V0QXR0cmlidXRlIG9yIHJlbW92ZUF0dHJpYnV0ZSBoYXMgYmVlbiBjYWxsZWQgQU5ECisgICAgICAgICAgICAyLiBhIHNlc3Npb24gZXhpc3RzIChoYXMgYmVlbiBjcmVhdGVkKQorICAgICAgICAgICAgMy4gdGhlIHJlcXVlc3QgaXMgbm90IHRyYXBwZWQgYnkgdGhlICJmaWx0ZXIiIGF0dHJpYnV0ZQorCisgICAgICAgICAgICBUaGUgZmlsdGVyIGF0dHJpYnV0ZSBpcyB0byBmaWx0ZXIgb3V0IHJlcXVlc3RzIHRoYXQgY291bGQgbm90IG1vZGlmeSB0aGUgc2Vzc2lvbiwKKyAgICAgICAgICAgIGhlbmNlIHdlIGRvbid0IHJlcGxpY2F0ZSB0aGUgc2Vzc2lvbiBhZnRlciB0aGUgZW5kIG9mIHRoaXMgcmVxdWVzdC4KKyAgICAgICAgICAgIFRoZSBmaWx0ZXIgaXMgbmVnYXRpdmUsIGllLCBhbnl0aGluZyB5b3UgcHV0IGluIHRoZSBmaWx0ZXIsIHlvdSBtZWFuIHRvIGZpbHRlciBvdXQsCisgICAgICAgICAgICBpZSwgbm8gcmVwbGljYXRpb24gd2lsbCBiZSBkb25lIG9uIHJlcXVlc3RzIHRoYXQgbWF0Y2ggb25lIG9mIHRoZSBmaWx0ZXJzLgorICAgICAgICAgICAgVGhlIGZpbHRlciBhdHRyaWJ1dGUgaXMgZGVsaW1pdGVkIGJ5IDssIHNvIHlvdSBjYW4ndCBlc2NhcGUgb3V0IDsgZXZlbiBpZiB5b3Ugd2FudGVkIHRvLgorCisgICAgICAgICAgICBmaWx0ZXI9Ii4qXC5naWY7LipcLmpzOyIgbWVhbnMgdGhhdCB3ZSB3aWxsIG5vdCByZXBsaWNhdGUgdGhlIHNlc3Npb24gYWZ0ZXIgcmVxdWVzdHMgd2l0aCB0aGUgVVJJCisgICAgICAgICAgICBlbmRpbmcgd2l0aCAuZ2lmIGFuZCAuanMgYXJlIGludGVyY2VwdGVkLgorICAgICAgICAgICAgCisgICAgICAgICAgICBUaGUgZGVwbG95ZXIgZWxlbWVudCBjYW4gYmUgdXNlZCB0byBkZXBsb3kgYXBwcyBjbHVzdGVyIHdpZGUuCisgICAgICAgICAgICBDdXJyZW50bHkgdGhlIGRlcGxveW1lbnQgb25seSBkZXBsb3lzL3VuZGVwbG95cyB0byB3b3JraW5nIG1lbWJlcnMgaW4gdGhlIGNsdXN0ZXIKKyAgICAgICAgICAgIHNvIG5vIFdBUnMgYXJlIGNvcGllZCB1cG9ucyBzdGFydHVwIG9mIGEgYnJva2VuIG5vZGUuCisgICAgICAgICAgICBUaGUgZGVwbG95ZXIgd2F0Y2hlcyBhIGRpcmVjdG9yeSAod2F0Y2hEaXIpIGZvciBXQVIgZmlsZXMgd2hlbiB3YXRjaEVuYWJsZWQ9InRydWUiCisgICAgICAgICAgICBXaGVuIGEgbmV3IHdhciBmaWxlIGlzIGFkZGVkIHRoZSB3YXIgZ2V0cyBkZXBsb3llZCB0byB0aGUgbG9jYWwgaW5zdGFuY2UsCisgICAgICAgICAgICBhbmQgdGhlbiBkZXBsb3llZCB0byB0aGUgb3RoZXIgaW5zdGFuY2VzIGluIHRoZSBjbHVzdGVyLgorICAgICAgICAgICAgV2hlbiBhIHdhciBmaWxlIGlzIGRlbGV0ZWQgZnJvbSB0aGUgd2F0Y2hEaXIgdGhlIHdhciBpcyB1bmRlcGxveWVkIGxvY2FsbHkgCisgICAgICAgICAgICBhbmQgY2x1c3RlciB3aWRlCisgICAgICAgIC0tPgorICAgICAgICAKKyAgICAgICAgPCEtLQorICAgICAgICA8Q2x1c3RlciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuU2ltcGxlVGNwQ2x1c3RlciIKKyAgICAgICAgICAgICAgICAgbWFuYWdlckNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uRGVsdGFNYW5hZ2VyIgorICAgICAgICAgICAgICAgICBleHBpcmVTZXNzaW9uc09uU2h1dGRvd249ImZhbHNlIgorICAgICAgICAgICAgICAgICB1c2VEaXJ0eUZsYWc9InRydWUiPgorCisgICAgICAgICAgICA8TWVtYmVyc2hpcCAKKyAgICAgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5tY2FzdC5NY2FzdFNlcnZpY2UiCisgICAgICAgICAgICAgICAgbWNhc3RBZGRyPSIyMjguMC4wLjQiCisgICAgICAgICAgICAgICAgbWNhc3RQb3J0PSI0NTU2NCIKKyAgICAgICAgICAgICAgICBtY2FzdEZyZXF1ZW5jeT0iNTAwIgorICAgICAgICAgICAgICAgIG1jYXN0RHJvcFRpbWU9IjMwMDAiLz4KKworICAgICAgICAgICAgPFJlY2VpdmVyIAorICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvbkxpc3RlbmVyIgorICAgICAgICAgICAgICAgIHRjcExpc3RlbkFkZHJlc3M9ImF1dG8iCisgICAgICAgICAgICAgICAgdGNwTGlzdGVuUG9ydD0iNDAwMSIKKyAgICAgICAgICAgICAgICB0Y3BTZWxlY3RvclRpbWVvdXQ9IjEwMCIKKyAgICAgICAgICAgICAgICB0Y3BUaHJlYWRDb3VudD0iNiIvPgorCisgICAgICAgICAgICA8U2VuZGVyCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIiCisgICAgICAgICAgICAgICAgcmVwbGljYXRpb25Nb2RlPSJwb29sZWQiLz4KKworICAgICAgICAgICAgPFZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblZhbHZlIgorICAgICAgICAgICAgICAgICAgIGZpbHRlcj0iLipcLmdpZjsuKlwuanM7LipcLmpwZzsuKlwuaHRtOy4qXC5odG1sOy4qXC50eHQ7Ii8+CisgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICA8RGVwbG95ZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuZGVwbG95LkZhcm1XYXJEZXBsb3llciIKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wRGlyPSIvdG1wL3dhci10ZW1wLyIKKyAgICAgICAgICAgICAgICAgICAgICBkZXBsb3lEaXI9Ii90bXAvd2FyLWRlcGxveS8iCisgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hEaXI9Ii90bXAvd2FyLWxpc3Rlbi8iCisgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hFbmFibGVkPSJmYWxzZSIvPgorICAgICAgICA8L0NsdXN0ZXI+CisgICAgICAgIC0tPiAgICAgICAgCisKKworCisgICAgICAgIDwhLS0gTm9ybWFsbHksIHVzZXJzIG11c3QgYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMgdG8gZWFjaCB3ZWIgYXBwCisgICAgICAgICAgICAgaW5kaXZpZHVhbGx5LiAgVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgZW50cnkgaWYgeW91IHdvdWxkIGxpa2UKKyAgICAgICAgICAgICBhIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZCB0aGUgZmlyc3QgdGltZSB0aGV5IGVuY291bnRlciBhCisgICAgICAgICAgICAgcmVzb3VyY2UgcHJvdGVjdGVkIGJ5IGEgc2VjdXJpdHkgY29uc3RyYWludCwgYW5kIHRoZW4gaGF2ZSB0aGF0CisgICAgICAgICAgICAgdXNlciBpZGVudGl0eSBtYWludGFpbmVkIGFjcm9zcyAqYWxsKiB3ZWIgYXBwbGljYXRpb25zIGNvbnRhaW5lZAorICAgICAgICAgICAgIGluIHRoaXMgdmlydHVhbCBob3N0LiAtLT4KKyAgICAgICAgPCEtLQorICAgICAgICA8VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuU2luZ2xlU2lnbk9uIgorICAgICAgICAgICAgICAgICAgIGRlYnVnPSIwIi8+CisgICAgICAgIC0tPgorCisgICAgICAgIDwhLS0gQWNjZXNzIGxvZyBwcm9jZXNzZXMgYWxsIHJlcXVlc3RzIGZvciB0aGlzIHZpcnR1YWwgaG9zdC4gIEJ5CisgICAgICAgICAgICAgZGVmYXVsdCwgbG9nIGZpbGVzIGFyZSBjcmVhdGVkIGluIHRoZSAibG9ncyIgZGlyZWN0b3J5IHJlbGF0aXZlIHRvCisgICAgICAgICAgICAgJENBVEFMSU5BX0hPTUUuICBJZiB5b3Ugd2lzaCwgeW91IGNhbiBzcGVjaWZ5IGEgZGlmZmVyZW50CisgICAgICAgICAgICAgZGlyZWN0b3J5IHdpdGggdGhlICJkaXJlY3RvcnkiIGF0dHJpYnV0ZS4gIFNwZWNpZnkgZWl0aGVyIGEgcmVsYXRpdmUKKyAgICAgICAgICAgICAodG8gJENBVEFMSU5BX0hPTUUpIG9yIGFic29sdXRlIHBhdGggdG8gdGhlIGRlc2lyZWQgZGlyZWN0b3J5LgorICAgICAgICAtLT4KKyAgICAgICAgPCEtLQorICAgICAgICA8VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5BY2Nlc3NMb2dWYWx2ZSIKKyAgICAgICAgICAgICAgICAgZGlyZWN0b3J5PSJsb2dzIiAgcHJlZml4PSJsb2NhbGhvc3RfYWNjZXNzX2xvZy4iIHN1ZmZpeD0iLnR4dCIKKyAgICAgICAgICAgICAgICAgcGF0dGVybj0iY29tbW9uIiByZXNvbHZlSG9zdHM9ImZhbHNlIi8+CisgICAgICAgIC0tPgorCisgICAgICA8L0hvc3Q+CisKKyAgICA8L0VuZ2luZT4KKworICA8L1NlcnZpY2U+CisKKzwvU2VydmVyPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9nZW5zdG9yZS54bWwgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L2dlbnN0b3JlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDBiZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9nZW5zdG9yZS54bWwKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPHByb2plY3QgbmFtZT0ic3RvcmUiIGRlZmF1bHQ9InN0b3JlIiBiYXNlZGlyPSIuIj4KKworICAgICA8dGFyZ2V0IG5hbWU9InN0b3JlIj4KKyAgICAgICAgPGRlbGV0ZSBmaWxlPSJjb25mL2NhdGFsaW5hLmtleXN0b3JlIi8+CisJCTxnZW5rZXkgYWxpYXM9InRvbWNhdCIgc3RvcmVwYXNzPSJjaGFuZ2VpdCIga2V5cGFzcz0iY2hhbmdlaXQiIAorCQkJa2V5c3RvcmU9ImNvbmYvY2F0YWxpbmEua2V5c3RvcmUiIGtleWFsZz0icnNhIj4KKwkJCTxkbmFtZT4KKwkJCQk8cGFyYW0gbmFtZT0iQ04iIHZhbHVlPSJsb2NhbGhvc3QiLz4KKwkJCQk8cGFyYW0gbmFtZT0iT1UiIHZhbHVlPSJTb2Z0d2FyZSBEZXZlcGxvbWVudCBUb21jYXQiLz4KKwkJCQk8cGFyYW0gbmFtZT0iTyIgdmFsdWU9IkFwYWNoZSBGb3VuZGF0aW9uIi8+CisJCQkJPHBhcmFtIG5hbWU9IkwiIHZhbHVlPSJCb2NodW0iLz4KKwkJCQk8cGFyYW0gbmFtZT0iQyIgdmFsdWU9IkRFIi8+CisJCQk8L2RuYW1lPgorCQk8L2dlbmtleT4KKyAgICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Db25uZWN0b3JTRlRlc3QuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvQ29ubmVjdG9yU0ZUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU0ZDE2NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvQ29ubmVjdG9yU0ZUZXN0LmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvcjsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBDb25uZWN0b3JTRlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgU3RvcmVSZWdpc3RyeSByZWdpc3RyeTsKKworICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisKKyAgICBQcmludFdyaXRlciBwV3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHdyaXRlcik7CisKKyAgICBDb25uZWN0b3IgY29ubmVjdG9yOworCisgICAgQ29ubmVjdG9yU0YgZmFjdG9yeTsKKworICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYzsKKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHJlZ2lzdHJ5ID0gbmV3IFN0b3JlUmVnaXN0cnkoKTsKKyAgICAgICAgZGVzYyA9IG5ldyBTdG9yZURlc2NyaXB0aW9uKCk7CisgICAgICAgIGRlc2Muc2V0VGFnKCJDb25uZWN0b3IiKTsKKyAgICAgICAgZGVzYy5zZXRUYWdDbGFzcygib3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuQ29ubmVjdG9yIik7CisgICAgICAgIGRlc2Muc2V0U3RhbmRhcmQoZmFsc2UpOworICAgICAgICBkZXNjCisgICAgICAgICAgICAgICAgLnNldFN0b3JlRmFjdG9yeUNsYXNzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkNvbm5lY3RvclNGIik7CisgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRGVzY3JpcHRpb24oZGVzYyk7CisgICAgICAgIGZhY3RvcnkgPSBuZXcgQ29ubmVjdG9yU0YoKTsKKyAgICAgICAgZGVzYy5zZXRTdG9yZUZhY3RvcnkoZmFjdG9yeSk7CisgICAgICAgIGRlc2MuZ2V0U3RvcmVGYWN0b3J5KCkuc2V0U3RvcmVBcHBlbmRlcihuZXcgQ29ubmVjdG9yU3RvcmVBcHBlbmRlcigpKTsKKyAgICAgICAgZmFjdG9yeS5zZXRSZWdpc3RyeShyZWdpc3RyeSk7CisgICAgICAgIGRlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKCJtaW5Qcm9jZXNzb3IiKTsKKyAgICAgICAgZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoIm1heFByb2Nlc3NvciIpOworICAgICAgICByZWdpc3RlckRlc2NyaXB0b3IoIkxpc3RlbmVyIiwgTGlmZWN5Y2xlTGlzdGVuZXIuY2xhc3MpOworICAgICAgICBjb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9yKCJIVFRQLzEuMSIpOworICAgIH0KKworICAgIHByaXZhdGUgU3RvcmVEZXNjcmlwdGlvbiByZWdpc3RlckRlc2NyaXB0b3IoU3RyaW5nIHRhZywgQ2xhc3MgYUNsYXNzKSB7CisgICAgICAgIHJldHVybiByZWdpc3RlckRlc2NyaXB0b3IodGFnLCBhQ2xhc3MsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIGZhbHNlLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0b3JlRGVzY3JpcHRpb24gcmVnaXN0ZXJEZXNjcmlwdG9yKFN0cmluZyB0YWcsIENsYXNzIGFDbGFzcywKKyAgICAgICAgICAgIFN0cmluZyBmYWN0b3J5Q2xhc3MsIGJvb2xlYW4gZnN0YW5kYXJkLCBib29sZWFuIGZkZWZhdWx0KSB7CisgICAgICAgIHJldHVybiBEZXNjcmlwdG9ySGVscGVyLnJlZ2lzdGVyRGVzY3JpcHRvcihkZXNjLCByZWdpc3RyeSwgYUNsYXNzCisgICAgICAgICAgICAgICAgLmdldE5hbWUoKSwgdGFnLCBhQ2xhc3MuZ2V0TmFtZSgpLCBmYWN0b3J5Q2xhc3MsIGZzdGFuZGFyZCwKKyAgICAgICAgICAgICAgICBmZGVmYXVsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbm5lY3RvcgorICAgICAgICAgICAgICAgIC5hZGRMaWZlY3ljbGVMaXN0ZW5lcihuZXcgb3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoKSk7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8Q29ubmVjdG9yPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8TGlzdGVuZXIgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXJcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiPC9Db25uZWN0b3I+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhQcm90b2NvbEhhbmRsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY29ubmVjdG9yLnNldFByb3BlcnR5KCJhY2NlcHRDb3VudCIsICIxMCIpOworICAgICAgICBjb25uZWN0b3Iuc2V0UHJvcGVydHkoIm1heFNwYXJlVGhyZWFkcyIsICI3NCIpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPENvbm5lY3RvciIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBtYXhTcGFyZVRocmVhZHM9XCI3NFwiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIGFjY2VwdENvdW50PVwiMTBcIj4iICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICI8L0Nvbm5lY3Rvcj4iICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcmVBSlAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY29ubmVjdG9yLnNldFByb3RvY29sKCJBSlAvMS4zIik7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8Q29ubmVjdG9yIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIHByb3RvY29sPVwiQUpQLzEuM1wiPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIjwvQ29ubmVjdG9yPiIgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTU0woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0dXBTZWN1cmVDb25uZWN0b3IoKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxDb25uZWN0b3IiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgcG9ydD1cIjg0NDNcIiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBzY2hlbWU9XCJodHRwc1wiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIHNlY3VyZT1cInRydWVcIiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBtaW5TcGFyZVRocmVhZHM9XCIzMFwiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIGNsaWVudEF1dGg9XCJmYWxzZVwiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIGtleXN0b3JlUGFzcz1cImNoYW5nZWl0XCIiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAga2V5c3RvcmVGaWxlPVwiY29uZi9jYXRhbGluYS5rZXlzdG9yZVwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICAgIG1heFNwYXJlVGhyZWFkcz1cIjE3NVwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICAgIHNzbFByb3RvY29sPVwiVExTXCI+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiPC9Db25uZWN0b3I+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBTZWN1cmVDb25uZWN0b3IoKSB7CisgICAgICAgIGNvbm5lY3Rvci5zZXRQb3J0KDg0NDMpOworICAgICAgICBjb25uZWN0b3Iuc2V0UHJvcGVydHkoIm1pblNwYXJlVGhyZWFkcyIsICIzMCIpOworICAgICAgICBjb25uZWN0b3Iuc2V0UHJvcGVydHkoIm1heFNwYXJlVGhyZWFkcyIsICIxNzUiKTsKKyAgICAgICAgY29ubmVjdG9yLnNldEVuYWJsZUxvb2t1cHMoZmFsc2UpOworICAgICAgICBjb25uZWN0b3Iuc2V0UHJvcGVydHkoImRpc2FibGVVcGxvYWRUaW1lb3V0IiwgInRydWUiKTsKKyAgICAgICAgY29ubmVjdG9yLnNldFNlY3VyZSh0cnVlKTsKKyAgICAgICAgY29ubmVjdG9yLnNldFByb3BlcnR5KCJiYWNrbG9nIiwgIjEwMCIpOworICAgICAgICBjb25uZWN0b3Iuc2V0U2NoZW1lKCJodHRwcyIpOworICAgICAgICBjb25uZWN0b3Iuc2V0UHJvcGVydHkoImNsaWVudEF1dGgiLCAiZmFsc2UiKTsKKyAgICAgICAgY29ubmVjdG9yLnNldFByb3BlcnR5KCJzc2xQcm90b2NvbCIsICJUTFMiKTsKKyAgICAgICAgY29ubmVjdG9yLnNldFByb3BlcnR5KCJrZXlzdG9yZUZpbGUiLCAiY29uZi9jYXRhbGluYS5rZXlzdG9yZSIpOworICAgICAgICBjb25uZWN0b3Iuc2V0UHJvcGVydHkoImtleXN0b3JlUGFzcyIsICJjaGFuZ2VpdCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0b3JBcHBlbmRlcigpIHRocm93cyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0dXBTZWN1cmVDb25uZWN0b3IoKTsKKyAgICAgICAgQ29ubmVjdG9yU3RvcmVBcHBlbmRlciBhcHBlbmRlciA9IChDb25uZWN0b3JTdG9yZUFwcGVuZGVyKWRlc2MuZ2V0U3RvcmVGYWN0b3J5KCkuZ2V0U3RvcmVBcHBlbmRlcigpOworICAgICAgICBMaXN0IHByb3BlcnR5TGlzdCA9IGFwcGVuZGVyLmdldFByb3BlcnR5S2V5cyhjb25uZWN0b3IpOworICAgICAgICBhc3NlcnRUcnVlKHByb3BlcnR5TGlzdC5jb250YWlucygicHJvdG9jb2wiKSk7ICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8Q29ubmVjdG9yPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIjwvQ29ubmVjdG9yPiIgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrKFN0cmluZyBhc3BlY3RlZFJlc3VsdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZhY3Rvcnkuc3RvcmUocFdyaXRlciwgLTIsIGNvbm5lY3Rvcik7CisgICAgICAgIGFzc2VydEVxdWFscyhhc3BlY3RlZFJlc3VsdCwgd3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvQ29ubmVjdG9yU3RvcmVBcHBlbmRlclRlc3QuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvQ29ubmVjdG9yU3RvcmVBcHBlbmRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzFmNmJjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Db25uZWN0b3JTdG9yZUFwcGVuZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvcjsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBDb25uZWN0b3JTdG9yZUFwcGVuZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5OworCisgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgIFByaW50V3JpdGVyIHBXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKKworICAgIENvbm5lY3RvciBjb25uZWN0b3I7CisKKyAgICBDb25uZWN0b3JTRiBmYWN0b3J5OworCisgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjOworCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgcmVnaXN0cnkgPSBuZXcgU3RvcmVSZWdpc3RyeSgpOworICAgICAgICBkZXNjID0gbmV3IFN0b3JlRGVzY3JpcHRpb24oKTsKKyAgICAgICAgZGVzYy5zZXRUYWcoIkNvbm5lY3RvciIpOworICAgICAgICBkZXNjLnNldFRhZ0NsYXNzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5Db25uZWN0b3IiKTsKKyAgICAgICAgZGVzYy5zZXRTdGFuZGFyZChmYWxzZSk7CisgICAgICAgIGRlc2MKKyAgICAgICAgICAgICAgICAuc2V0U3RvcmVGYWN0b3J5Q2xhc3MoIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuQ29ubmVjdG9yU0YiKTsKKyAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJEZXNjcmlwdGlvbihkZXNjKTsKKyAgICAgICAgZmFjdG9yeSA9IG5ldyBDb25uZWN0b3JTRigpOworICAgICAgICBkZXNjLnNldFN0b3JlRmFjdG9yeShmYWN0b3J5KTsKKyAgICAgICAgZGVzYy5nZXRTdG9yZUZhY3RvcnkoKS5zZXRTdG9yZUFwcGVuZGVyKG5ldyBDb25uZWN0b3JTdG9yZUFwcGVuZGVyKCkpOworICAgICAgICBmYWN0b3J5LnNldFJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKKyAgICAgICAgcmVnaXN0ZXJEZXNjcmlwdG9yKCJMaXN0ZW5lciIsIExpZmVjeWNsZUxpc3RlbmVyLmNsYXNzKTsKKyAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvcigiSFRUUC8xLjEiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0b3JlRGVzY3JpcHRpb24gcmVnaXN0ZXJEZXNjcmlwdG9yKFN0cmluZyB0YWcsIENsYXNzIGFDbGFzcykgeworICAgICAgICByZXR1cm4gcmVnaXN0ZXJEZXNjcmlwdG9yKHRhZywgYUNsYXNzLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdG9yZURlc2NyaXB0aW9uIHJlZ2lzdGVyRGVzY3JpcHRvcihTdHJpbmcgdGFnLCBDbGFzcyBhQ2xhc3MsCisgICAgICAgICAgICBTdHJpbmcgZmFjdG9yeUNsYXNzLCBib29sZWFuIGZzdGFuZGFyZCwgYm9vbGVhbiBmZGVmYXVsdCkgeworICAgICAgICByZXR1cm4gRGVzY3JpcHRvckhlbHBlci5yZWdpc3RlckRlc2NyaXB0b3IoZGVzYywgcmVnaXN0cnksIGFDbGFzcworICAgICAgICAgICAgICAgIC5nZXROYW1lKCksIHRhZywgYUNsYXNzLmdldE5hbWUoKSwgZmFjdG9yeUNsYXNzLCBmc3RhbmRhcmQsCisgICAgICAgICAgICAgICAgZmRlZmF1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3RvclN0b3JlQXBwZW5kZXIgYXBwZW5kZXIgPSBuZXcgQ29ubmVjdG9yU3RvcmVBcHBlbmRlcigpOworICAgICAgICBMaXN0IHByb3BlcnRpZXMgPSBhcHBlbmRlci5nZXRQcm9wZXJ0eUtleXMoY29ubmVjdG9yKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wZXJ0aWVzLmNvbnRhaW5zKCJlbXB0eVNlc3Npb25QYXRoIikpOworICAgICAgICBhc3NlcnRGYWxzZShwcm9wZXJ0aWVzLmNvbnRhaW5zKCJwcm90b2NvbCIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocHJvcGVydGllcy5jb250YWlucygicHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lIikpOworICAgICAgICAvLyBIVFRQLzEuMSBTU0wgUHJvdG9jb2wgVGVzdAorICAgICAgICBjb25uZWN0b3Iuc2V0UHJvcGVydHkoInNzbFByb3RvY29sIiwgIlRMUyIpOworICAgICAgICBwcm9wZXJ0aWVzID0gYXBwZW5kZXIuZ2V0UHJvcGVydHlLZXlzKGNvbm5lY3Rvcik7CisgICAgICAgIGFzc2VydFRydWUocHJvcGVydGllcy5jb250YWlucygicHJvdG9jb2wiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByaW50QXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb25uZWN0b3JTdG9yZUFwcGVuZGVyIGFwcGVuZGVyID0gbmV3IENvbm5lY3RvclN0b3JlQXBwZW5kZXIoKTsKKyAgICAgICAgY29ubmVjdG9yLnNldFByb3h5UG9ydCg4MCk7CisgICAgICAgIGNvbm5lY3Rvci5zZXRQcm9wZXJ0eSgiYWNjZXB0Q291bnQiLCAiMTEwIik7CisgICAgICAgIGFwcGVuZGVyLnByaW50QXR0cmlidXRlcyhwV3JpdGVyLCAtMiwgZmFsc2UsIGNvbm5lY3RvciwgZGVzYyk7CisKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gTEYuTElORV9TRVBBUkFUT1IgKyAiICBwcm94eVBvcnQ9XCI4MFwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICBhY2NlcHRDb3VudD1cIjExMFwiIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzcGVjdGVkUmVzdWx0LCB3cml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9EZXNjcmlwdG9ySGVscGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0Rlc2NyaXB0b3JIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDAwOTUwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9EZXNjcmlwdG9ySGVscGVyLmphdmEKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNhdGFsaW5hQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlckRlcGxveWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyUmVjZWl2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJTZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcnNoaXBTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZXNzYWdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVqYjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dExvY2FsRWpiOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VFbnZSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlTGluazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogIAorICovCitwdWJsaWMgY2xhc3MgRGVzY3JpcHRvckhlbHBlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERlc2NyaXB0b3JIZWxwZXIuY2xhc3MpOworCisgICAgcHVibGljIHN0YXRpYyBTdG9yZURlc2NyaXB0aW9uIHJlZ2lzdGVyRGVzY3JpcHRvcigKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gcGFyZW50ZGVzYywgU3RvcmVSZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHRhZywKKyAgICAgICAgICAgIENsYXNzIGFDbGFzcykgeworICAgICAgICByZXR1cm4gcmVnaXN0ZXJEZXNjcmlwdG9yKHBhcmVudGRlc2MsIHJlZ2lzdHJ5LCBhQ2xhc3MuZ2V0TmFtZSgpLCB0YWcsCisgICAgICAgICAgICAgICAgYUNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RvcmVEZXNjcmlwdGlvbiByZWdpc3RlckRlc2NyaXB0b3IoCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIHBhcmVudGRlc2MsIFN0b3JlUmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZyB0YWcsCisgICAgICAgICAgICBTdHJpbmcgYUNsYXNzVG9rZW4sIFN0cmluZyBmYWN0b3J5Q2xhc3MsIGJvb2xlYW4gZnN0YW5kYXJkLAorICAgICAgICAgICAgYm9vbGVhbiBmZGVmYXVsdCkgeworICAgICAgICByZXR1cm4gcmVnaXN0ZXJEZXNjcmlwdG9yKHBhcmVudGRlc2MsIHJlZ2lzdHJ5LCBhQ2xhc3NUb2tlbiwgdGFnLAorICAgICAgICAgICAgICAgIGFDbGFzc1Rva2VuLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgYSBkZXNjcmlwdG9yIGFuZCByZWdpc3RlciB0aGlzIHRvIGFub3RoZXIgcGFyZW50IGRlc2NyaXB0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIHBhcmVudGRlc2MKKyAgICAgKiBAcGFyYW0gcmVnaXN0cnkKKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiBAcGFyYW0gdGFnCisgICAgICogQHBhcmFtIGFDbGFzc1Rva2VuCisgICAgICogQHBhcmFtIGZhY3RvcnlDbGFzcworICAgICAqIEBwYXJhbSBmc3RhbmRhcmQKKyAgICAgKiBAcGFyYW0gZmRlZmF1bHQKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdG9yZURlc2NyaXB0aW9uIHJlZ2lzdGVyRGVzY3JpcHRvcigKKyAgICAgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gcGFyZW50ZGVzYywgU3RvcmVSZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIGlkLAorICAgICAgICAgICAgU3RyaW5nIHRhZywgU3RyaW5nIGFDbGFzc1Rva2VuLCBTdHJpbmcgZmFjdG9yeUNsYXNzLAorICAgICAgICAgICAgYm9vbGVhbiBmc3RhbmRhcmQsIGJvb2xlYW4gZmRlZmF1bHQpIHsKKyAgICAgICAgLy8gYWRkIExpc3RlbmVyCisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzY0NoaWxkID0gbmV3IFN0b3JlRGVzY3JpcHRpb24oKTsKKyAgICAgICAgZGVzY0NoaWxkLnNldElkKGlkKTsKKyAgICAgICAgZGVzY0NoaWxkLnNldFRhZyh0YWcpOworICAgICAgICBkZXNjQ2hpbGQuc2V0VGFnQ2xhc3MoYUNsYXNzVG9rZW4pOworICAgICAgICBkZXNjQ2hpbGQuc2V0U3RhbmRhcmQoZnN0YW5kYXJkKTsKKyAgICAgICAgZGVzY0NoaWxkLnNldERlZmF1bHQoZmRlZmF1bHQpOworICAgICAgICBkZXNjQ2hpbGQuc2V0U3RvcmVGYWN0b3J5Q2xhc3MoZmFjdG9yeUNsYXNzKTsKKyAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgYUZhY3RvcnlDbGFzcyA9IENsYXNzLmZvck5hbWUoZmFjdG9yeUNsYXNzKTsKKyAgICAgICAgICAgIGZhY3RvcnkgPSBhRmFjdG9yeUNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgKChJU3RvcmVGYWN0b3J5KSBmYWN0b3J5KS5zZXRSZWdpc3RyeShyZWdpc3RyeSk7CisgICAgICAgICAgICBkZXNjQ2hpbGQuc2V0U3RvcmVGYWN0b3J5KChJU3RvcmVGYWN0b3J5KSBmYWN0b3J5KTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyZW50ZGVzYyAhPSBudWxsKQorICAgICAgICAgICAgcGFyZW50ZGVzYy5zZXRDaGlsZHModHJ1ZSk7CisgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRGVzY3JpcHRpb24oZGVzY0NoaWxkKTsKKyAgICAgICAgcmV0dXJuIGRlc2NDaGlsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWdpc3RlciBhbGwgUmVnaXN0ZXJ5IGRlc2NyaXB0b3JzIG9uIG5hbWluZyBzdXBwb3J0IHRvIGNvbnRleHQhCisgICAgICogCisgICAgICogQHBhcmFtIHBhcmVudAorICAgICAqIEBwYXJhbSByZWdpc3RyeQorICAgICAqIEByZXR1cm4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RvcmVEZXNjcmlwdGlvbiByZWdpc3Rlck5hbWluZ0Rlc2NyaXB0b3IoCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIHBhcmVudCwgU3RvcmVSZWdpc3RyeSByZWdpc3RyeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBuYW1laW5nRGVzYyA9IERlc2NyaXB0b3JIZWxwZXIucmVnaXN0ZXJEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIHBhcmVudCwgcmVnaXN0cnksIE5hbWluZ1Jlc291cmNlcy5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgIk5hbWluZ1Jlc291cmNlcyIsIE5hbWluZ1Jlc291cmNlcy5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuTmFtaW5nUmVzb3VyY2VzU0YiLCB0cnVlLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgcmVnaXN0ZXJEZXNjcmlwdG9yKG5hbWVpbmdEZXNjLCByZWdpc3RyeSwgQ29udGV4dEVqYi5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgIkVKQiIsIENvbnRleHRFamIuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIHJlZ2lzdGVyRGVzY3JpcHRvcihuYW1laW5nRGVzYywgcmVnaXN0cnksIENvbnRleHRFbnZpcm9ubWVudC5jbGFzcworICAgICAgICAgICAgICAgIC5nZXROYW1lKCksICJFbnZpcm9ubWVudCIsIENvbnRleHRFbnZpcm9ubWVudC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgcmVnaXN0ZXJEZXNjcmlwdG9yKG5hbWVpbmdEZXNjLCByZWdpc3RyeSwgQ29udGV4dExvY2FsRWpiLmNsYXNzCisgICAgICAgICAgICAgICAgLmdldE5hbWUoKSwgIkxvY2FsRWpiIiwgQ29udGV4dExvY2FsRWpiLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgdHJ1ZSwgZmFsc2UpOworICAgICAgICByZWdpc3RlckRlc2NyaXB0b3IobmFtZWluZ0Rlc2MsIHJlZ2lzdHJ5LCBDb250ZXh0UmVzb3VyY2UuY2xhc3MKKyAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLCAiUmVzb3VyY2UiLCBDb250ZXh0UmVzb3VyY2UuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIHJlZ2lzdGVyRGVzY3JpcHRvcihuYW1laW5nRGVzYywgcmVnaXN0cnksIENvbnRleHRSZXNvdXJjZUxpbmsuY2xhc3MKKyAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLCAiUmVzb3VyY2VMaW5rIiwKKyAgICAgICAgICAgICAgICBDb250ZXh0UmVzb3VyY2VMaW5rLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgdHJ1ZSwgZmFsc2UpOworICAgICAgICByZWdpc3RlckRlc2NyaXB0b3IobmFtZWluZ0Rlc2MsIHJlZ2lzdHJ5LCBDb250ZXh0UmVzb3VyY2VFbnZSZWYuY2xhc3MKKyAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLCAiUmVzb3VyY2VFbnZSZWYiLCBDb250ZXh0UmVzb3VyY2VFbnZSZWYuY2xhc3MKKyAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLCAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwKKyAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBuYW1laW5nRGVzYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWdpc3RlciBhbGwgY2x1c3RlciBhbmQgc3ViZWxlbWVudCBkZXNjcmlwdG9ycyB0byByZWdpc3RlcnkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyZW50CisgICAgICogQHBhcmFtIHJlZ2lzdHJ5CisgICAgICogQHJldHVybgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdG9yZURlc2NyaXB0aW9uIHJlZ2lzdGVyQ2x1c3RlckRlc2NyaXB0b3IoCisgICAgICAgICAgICBTdG9yZURlc2NyaXB0aW9uIHBhcmVudCwgU3RvcmVSZWdpc3RyeSByZWdpc3RyeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBjbHVzdGVyRGVzYyA9IERlc2NyaXB0b3JIZWxwZXIucmVnaXN0ZXJEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIHBhcmVudCwgcmVnaXN0cnksIENhdGFsaW5hQ2x1c3Rlci5jbGFzcy5nZXROYW1lKCksICJDbHVzdGVyIiwKKyAgICAgICAgICAgICAgICBDYXRhbGluYUNsdXN0ZXIuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkNhdGFsaW5hQ2x1c3RlclNGIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICByZWdpc3RlckRlc2NyaXB0b3IoY2x1c3RlckRlc2MsIHJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgIENsdXN0ZXJTZW5kZXIuY2xhc3MuZ2V0TmFtZSgpLCAiU2VuZGVyIiwgQ2x1c3RlclNlbmRlci5jbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICByZWdpc3RlckRlc2NyaXB0b3IoY2x1c3RlckRlc2MsIHJlZ2lzdHJ5LCBDbHVzdGVyUmVjZWl2ZXIuY2xhc3MKKyAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLCAiUmVjZWl2ZXIiLCBDbHVzdGVyUmVjZWl2ZXIuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIHJlZ2lzdGVyRGVzY3JpcHRvcihjbHVzdGVyRGVzYywgcmVnaXN0cnksIE1lbWJlcnNoaXBTZXJ2aWNlLmNsYXNzCisgICAgICAgICAgICAgICAgLmdldE5hbWUoKSwgIk1lbWJlcnNoaXAiLCBNZW1iZXJzaGlwU2VydmljZS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIGZhbHNlLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgcmVnaXN0ZXJEZXNjcmlwdG9yKGNsdXN0ZXJEZXNjLCByZWdpc3RyeSwgQ2x1c3RlckRlcGxveWVyLmNsYXNzCisgICAgICAgICAgICAgICAgLmdldE5hbWUoKSwgIkRlcGxveWVyIiwgQ2x1c3RlckRlcGxveWVyLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICByZWdpc3RlckRlc2NyaXB0b3IoY2x1c3RlckRlc2MsIHJlZ2lzdHJ5LCBNZXNzYWdlTGlzdGVuZXIuY2xhc3MKKyAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLCAiQ2x1c3Rlckxpc3RlbmVyIiwgTWVzc2FnZUxpc3RlbmVyLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICByZXR1cm4gY2x1c3RlckRlc2M7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9HbG9iYWxOYW1pbmdSZXNvdXJjZXNTRlRlc3QuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvR2xvYmFsTmFtaW5nUmVzb3VyY2VzU0ZUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVhYjkwMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvR2xvYmFsTmFtaW5nUmVzb3VyY2VzU0ZUZXN0LmphdmEKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFamI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVudmlyb25tZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRMb2NhbEVqYjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlRW52UmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUxpbms7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuR2xvYmFsTmFtaW5nUmVzb3VyY2VzU0Y7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVSZWdpc3RyeTsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBHbG9iYWxOYW1pbmdSZXNvdXJjZXNTRlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgU3RvcmVSZWdpc3RyeSByZWdpc3RyeTsKKworICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisKKyAgICBQcmludFdyaXRlciBwV3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHdyaXRlcik7CisKKyAgICBOYW1pbmdSZXNvdXJjZXMgcmVvdXJjZSA9IG5ldyBOYW1pbmdSZXNvdXJjZXMoKTsKKworICAgIEdsb2JhbE5hbWluZ1Jlc291cmNlc1NGIGZhY3Rvcnk7CisKKyAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2M7CisKKyAgICBTdG9yZURlc2NyaXB0aW9uIG5hbWVpbmdEZXNjOworCisgICAgLyoKKyAgICAgKiBjcmVhdGUgcmVnaXN0ZXJ5IGFuZCBjb25maWd1cmUgbmFtaW5nIGRlY3JpcHRvcnMKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmVnaXN0cnkgPSBuZXcgU3RvcmVSZWdpc3RyeSgpOworICAgICAgICBkZXNjID0gRGVzY3JpcHRvckhlbHBlci5yZWdpc3RlckRlc2NyaXB0b3IobnVsbCwgcmVnaXN0cnksCisgICAgICAgICAgICAgICAgTmFtaW5nUmVzb3VyY2VzLmNsYXNzLmdldE5hbWUoKSArICIuW0dsb2JhbE5hbWluZ1Jlc291cmNlc10iLAorICAgICAgICAgICAgICAgICJHbG9iYWxOYW1pbmdSZXNvdXJjZXMiLCBOYW1pbmdSZXNvdXJjZXMuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkdsb2JhbE5hbWluZ1Jlc291cmNlc1NGIiwKKyAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSk7CisgICAgICAgIGZhY3RvcnkgPSAoR2xvYmFsTmFtaW5nUmVzb3VyY2VzU0YpIGRlc2MuZ2V0U3RvcmVGYWN0b3J5KCk7CisgICAgICAgIG5hbWVpbmdEZXNjID0gRGVzY3JpcHRvckhlbHBlci5yZWdpc3Rlck5hbWluZ0Rlc2NyaXB0b3IoZGVzYywgcmVnaXN0cnkpOworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyRGVzY3JpcHRvcihTdHJpbmcgdGFnLCBDbGFzcyBhQ2xhc3MsCisgICAgICAgICAgICBTdHJpbmcgZmFjdG9yeUNsYXNzLCBib29sZWFuIGZzdGFuZGFyZCwgYm9vbGVhbiBmZGVmYXVsdCkgeworICAgICAgICBEZXNjcmlwdG9ySGVscGVyLnJlZ2lzdGVyRGVzY3JpcHRvcihuYW1laW5nRGVzYywgcmVnaXN0cnksIGFDbGFzcworICAgICAgICAgICAgICAgIC5nZXROYW1lKCksIHRhZywgYUNsYXNzLmdldE5hbWUoKSwgZmFjdG9yeUNsYXNzLCBmc3RhbmRhcmQsCisgICAgICAgICAgICAgICAgZmRlZmF1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKHJlZ2lzdHJ5LmZpbmREZXNjcmlwdGlvbihOYW1pbmdSZXNvdXJjZXMuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZWdpc3RyeS5maW5kRGVzY3JpcHRpb24oQ29udGV4dFJlc291cmNlRW52UmVmLmNsYXNzCisgICAgICAgICAgICAgICAgLmdldE5hbWUoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc291cmNlRW52UmVmIiwgcmVnaXN0cnkuZmluZERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgIENvbnRleHRSZXNvdXJjZUVudlJlZi5jbGFzcy5nZXROYW1lKCkpLmdldFRhZygpKTsKKworICAgICAgICBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gbmV3IE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBDb250ZXh0UmVzb3VyY2VFbnZSZWYgcmVmID0gbmV3IENvbnRleHRSZXNvdXJjZUVudlJlZigpOworICAgICAgICByZWYuc2V0TmFtZSgicGV0ZXIiKTsKKyAgICAgICAgcmVmLnNldFR5cGUoInR5cGUiKTsKKyAgICAgICAgcmVzb3VyY2VzLmFkZFJlc291cmNlRW52UmVmKHJlZik7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8R2xvYmFsTmFtaW5nUmVzb3VyY2VzPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPFJlc291cmNlRW52UmVmIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIG5hbWU9XCJwZXRlclwiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIHR5cGU9XCJ0eXBlXCIvPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIjwvR2xvYmFsTmFtaW5nUmVzb3VyY2VzPiIgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2socmVzb3VyY2VzLCBhc3BlY3RlZFJlc3VsdCk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RUpCU3RvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gbmV3IE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBDb250ZXh0RWpiIGVqYiA9IG5ldyBDb250ZXh0RWpiKCk7CisgICAgICAgIGVqYi5zZXROYW1lKCJlamIvU2VydmljZSIpOworICAgICAgICBlamIuc2V0VHlwZSgib3JnLnN1cGVyLkJlYW4iKTsKKyAgICAgICAgZWpiLnNldEhvbWUoIm9yZy5zdXBlci5CZWFuSG9tZSIpOworICAgICAgICByZXNvdXJjZXMuYWRkRWpiKGVqYik7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8R2xvYmFsTmFtaW5nUmVzb3VyY2VzPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPEVKQiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBob21lPVwib3JnLnN1cGVyLkJlYW5Ib21lXCIiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgbmFtZT1cImVqYi9TZXJ2aWNlXCIiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgdHlwZT1cIm9yZy5zdXBlci5CZWFuXCIvPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIjwvR2xvYmFsTmFtaW5nUmVzb3VyY2VzPiIgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2socmVzb3VyY2VzLCBhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsRWpiU3RvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gbmV3IE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBDb250ZXh0TG9jYWxFamIgZWpiID0gbmV3IENvbnRleHRMb2NhbEVqYigpOworICAgICAgICBlamIuc2V0TmFtZSgiZWpiL1NlcnZpY2UiKTsKKyAgICAgICAgZWpiLnNldFR5cGUoIm9yZy5zdXBlci5CZWFuIik7CisgICAgICAgIGVqYi5zZXRIb21lKCJvcmcuc3VwZXIuQmVhbkhvbWUiKTsKKyAgICAgICAgcmVzb3VyY2VzLmFkZExvY2FsRWpiKGVqYik7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8R2xvYmFsTmFtaW5nUmVzb3VyY2VzPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPExvY2FsRWpiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIGhvbWU9XCJvcmcuc3VwZXIuQmVhbkhvbWVcIiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBuYW1lPVwiZWpiL1NlcnZpY2VcIiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICB0eXBlPVwib3JnLnN1cGVyLkJlYW5cIi8+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiPC9HbG9iYWxOYW1pbmdSZXNvdXJjZXM+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhyZXNvdXJjZXMsIGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW52aXJvbm1lbnRTdG9yZSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMgPSBuZXcgTmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIENvbnRleHRFbnZpcm9ubWVudCBlbnYgPSBuZXcgQ29udGV4dEVudmlyb25tZW50KCk7CisgICAgICAgIGVudi5zZXROYW1lKCJlbnYvU2VsZWN0RW1wIik7CisgICAgICAgIGVudi5zZXRUeXBlKCJqYXZhLmxhbmcuU3RyaW5nIik7CisgICAgICAgIGVudi5zZXRWYWx1ZSgic2VsZWN0ICogZnJvbSBlbXAiKTsKKyAgICAgICAgcmVzb3VyY2VzLmFkZEVudmlyb25tZW50KGVudik7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8R2xvYmFsTmFtaW5nUmVzb3VyY2VzPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPEVudmlyb25tZW50IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIG5hbWU9XCJlbnYvU2VsZWN0RW1wXCIiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgdHlwZT1cImphdmEubGFuZy5TdHJpbmdcIiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICB2YWx1ZT1cInNlbGVjdCAqIGZyb20gZW1wXCIvPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIjwvR2xvYmFsTmFtaW5nUmVzb3VyY2VzPiIgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2socmVzb3VyY2VzLCBhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlU3RvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gbmV3IE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBDb250ZXh0UmVzb3VyY2UgcmVzID0gbmV3IENvbnRleHRSZXNvdXJjZSgpOworICAgICAgICByZXMuc2V0TmFtZSgiamRiYy9FbXAiKTsKKyAgICAgICAgcmVzLnNldFR5cGUoImphdmF4LnNxbC5EYXRhU291cmNlIik7CisgICAgICAgIHJlcy5zZXRBdXRoKCJDb250YWluZXIiKTsKKyAgICAgICAgcmVzb3VyY2VzLmFkZFJlc291cmNlKHJlcyk7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8R2xvYmFsTmFtaW5nUmVzb3VyY2VzPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPFJlc291cmNlIiArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgICBhdXRoPVwiQ29udGFpbmVyXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgICAgbmFtZT1cImpkYmMvRW1wXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgICAgdHlwZT1cImphdmF4LnNxbC5EYXRhU291cmNlXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIjwvR2xvYmFsTmFtaW5nUmVzb3VyY2VzPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhyZXNvdXJjZXMsIGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VTdG9yZVByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIHJlc291cmNlcyA9IG5ldyBOYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgQ29udGV4dFJlc291cmNlIHJlcyA9IG5ldyBDb250ZXh0UmVzb3VyY2UoKTsKKyAgICAgICAgcmVzLnNldE5hbWUoIm1haWwvTWFpbFNlc3Npb24iKTsKKyAgICAgICAgcmVzLnNldFR5cGUoImphdmF4Lm1haWwuU2Vzc2lvbiIpOworICAgICAgICByZXMuc2V0QXV0aCgiQ29udGFpbmVyIik7CisgICAgICAgIHJlcy5zZXRQcm9wZXJ0eSgibWFpbC5ob3N0IiwgImxvY2FsaG9zdCIpOworICAgICAgICByZXNvdXJjZXMuYWRkUmVzb3VyY2UocmVzKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxHbG9iYWxOYW1pbmdSZXNvdXJjZXM+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8UmVzb3VyY2UiICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICAgIGF1dGg9XCJDb250YWluZXJcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgICBuYW1lPVwibWFpbC9NYWlsU2Vzc2lvblwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICAgIHR5cGU9XCJqYXZheC5tYWlsLlNlc3Npb25cIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgICBtYWlsLmhvc3Q9XCJsb2NhbGhvc3RcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiPC9HbG9iYWxOYW1pbmdSZXNvdXJjZXM+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKHJlc291cmNlcywgYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIC8vIEBUT0RPIFJlc291cmNlTGluayBjYW4gb25seSBiZSBleGlzdHMgYXQgQ29udGV4dCBUYWcKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VMaW5rU3RvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gbmV3IE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBDb250ZXh0UmVzb3VyY2VMaW5rIHJlcyA9IG5ldyBDb250ZXh0UmVzb3VyY2VMaW5rKCk7CisgICAgICAgIHJlcy5zZXROYW1lKCJqZGJjL0VtcDEiKTsKKyAgICAgICAgcmVzLnNldFR5cGUoImphdmF4LnNxbC5EYXRhU291cmNlIik7CisgICAgICAgIHJlcy5zZXRHbG9iYWwoImpkYmMvRW1wIik7CisgICAgICAgIHJlc291cmNlcy5hZGRSZXNvdXJjZUxpbmsocmVzKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxHbG9iYWxOYW1pbmdSZXNvdXJjZXM+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8UmVzb3VyY2VMaW5rIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIGdsb2JhbD1cImpkYmMvRW1wXCIiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgbmFtZT1cImpkYmMvRW1wMVwiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIHR5cGU9XCJqYXZheC5zcWwuRGF0YVNvdXJjZVwiLz4iICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICI8L0dsb2JhbE5hbWluZ1Jlc291cmNlcz4iICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKHJlc291cmNlcywgYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMgPSBuZXcgTmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8R2xvYmFsTmFtaW5nUmVzb3VyY2VzPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIjwvR2xvYmFsTmFtaW5nUmVzb3VyY2VzPiIgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2socmVzb3VyY2VzLCBhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2soTmFtaW5nUmVzb3VyY2VzIHJlc291cmNlcywgU3RyaW5nIGFzcGVjdGVkUmVzdWx0KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZhY3Rvcnkuc3RvcmUocFdyaXRlciwgLTIsIHJlc291cmNlcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc3BlY3RlZFJlc3VsdCwgd3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvSW5mb0xpZmVjeWNsZUxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0luZm9MaWZlY3ljbGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMWMwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0luZm9MaWZlY3ljbGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogIAorICovCitwdWJsaWMgY2xhc3MgSW5mb0xpZmVjeWNsZUxpc3RlbmVyIGltcGxlbWVudHMgTGlmZWN5Y2xlTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEluZm9MaWZlY3ljbGVMaXN0ZW5lci5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gc3RyaW5nIGZvciB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEubGlzdGVuZXIuSW5mb0xpZmVjeWNsZUxpc3RlbmVyLzEuMCI7CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXIjbGlmZWN5Y2xlRXZlbnQob3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFdmVudCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsaWZlY3ljbGVFdmVudChMaWZlY3ljbGVFdmVudCBhcmcwKSB7CisgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oYXJnMC5nZXRTb3VyY2UoKS50b1N0cmluZygpICsgIjogIiArIGFyZzAuZ2V0VHlwZSgpKTsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0xGLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0xGLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyMjcwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTEYuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KKworcHVibGljIGNsYXNzIExGIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTElORV9TRVBBUkFUT1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL0xvYWRlclNGVGVzdC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Mb2FkZXJTRlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTUyODEwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9Mb2FkZXJTRlRlc3QuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmxvYWRlci5XZWJhcHBMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5Mb2FkZXJTRjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZVJlZ2lzdHJ5OworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqICAKKyAqLworcHVibGljIGNsYXNzIExvYWRlclNGVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5OworCisgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgIFByaW50V3JpdGVyIHBXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKKworICAgIExvYWRlciBsb2FkZXI7CisKKyAgICBMb2FkZXJTRiBmYWN0b3J5OworCisgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjOworCisgICAgLyoKKyAgICAgKiBjcmVhdGUgUmVnaXN0cnkgYW5kIHJlZ2lzdGVyIExvYWRlcgorICAgICAqIAorICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHJlZ2lzdHJ5ID0gbmV3IFN0b3JlUmVnaXN0cnkoKTsKKyAgICAgICAgZGVzYyA9IERlc2NyaXB0b3JIZWxwZXIucmVnaXN0ZXJEZXNjcmlwdG9yKG51bGwsIHJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgIFdlYmFwcExvYWRlci5jbGFzcy5nZXROYW1lKCksICJMb2FkZXIiLCBXZWJhcHBMb2FkZXIuY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCksICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkxvYWRlclNGIiwKKyAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOworICAgICAgICBmYWN0b3J5ID0gKExvYWRlclNGKSBkZXNjLmdldFN0b3JlRmFjdG9yeSgpOworICAgICAgICBsb2FkZXIgPSBuZXcgV2ViYXBwTG9hZGVyKCk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFuYWdlck5vblN0YW5kYXJkU3RvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmYWN0b3J5LmlzRGVmYXVsdExvYWRlcihsb2FkZXIpKTsKKyAgICAgICAgbG9hZGVyLnNldERlbGVnYXRlKHRydWUpOworICAgICAgICBhc3NlcnRGYWxzZShmYWN0b3J5LmlzRGVmYXVsdExvYWRlcihsb2FkZXIpKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxMb2FkZXIgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIuV2ViYXBwTG9hZGVyXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBkZWxlZ2F0ZT1cInRydWVcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcmVFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKGZhY3RvcnkuaXNEZWZhdWx0TG9hZGVyKGxvYWRlcikpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiIjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrKFN0cmluZyBhc3BlY3RlZFJlc3VsdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZhY3Rvcnkuc3RvcmUocFdyaXRlciwgLTIsIGxvYWRlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhhc3BlY3RlZFJlc3VsdCwgd3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTWFuYWdlclNGVGVzdC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9NYW5hZ2VyU0ZUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2MTk0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvTWFuYWdlclNGVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uU3RhbmRhcmRNYW5hZ2VyOworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqICAKKyAqLworcHVibGljIGNsYXNzIE1hbmFnZXJTRlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgU3RvcmVSZWdpc3RyeSByZWdpc3RyeTsKKworICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisKKyAgICBQcmludFdyaXRlciBwV3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHdyaXRlcik7CisKKyAgICBTdGFuZGFyZE1hbmFnZXIgbWFuYWdlcjsKKworICAgIE1hbmFnZXJTRiBmYWN0b3J5OworCisgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjOworCisgICAgLyoKKyAgICAgKiBjcmVhdGUgcmVnaXN0ZXJ5IGFuZCByZWdpc3RlciBNYW5hZ2VyIGRlc2NyaXB0b3IKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICByZWdpc3RyeSA9IG5ldyBTdG9yZVJlZ2lzdHJ5KCk7CisgICAgICAgIGRlc2MgPSBEZXNjcmlwdG9ySGVscGVyLnJlZ2lzdGVyRGVzY3JpcHRvcihudWxsLCByZWdpc3RyeSwKKyAgICAgICAgICAgICAgICBNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSwgIk1hbmFnZXIiLAorICAgICAgICAgICAgICAgIE1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLk1hbmFnZXJTRiIsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGRlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKCJlbnRyb3B5Iik7CisgICAgICAgIGRlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKCJkaXN0cmlidXRhYmxlIik7CisgICAgICAgIGZhY3RvcnkgPSAoTWFuYWdlclNGKSBkZXNjLmdldFN0b3JlRmFjdG9yeSgpOworICAgICAgICBtYW5hZ2VyID0gbmV3IFN0YW5kYXJkTWFuYWdlcigpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRTdGFuZGFyZE1hbmFnZXIoKSB7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gbWFuYWdlcmRlc2MgPSByZWdpc3RyeS5maW5kRGVzY3JpcHRpb24obWFuYWdlci5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRlc2MsbWFuYWdlcmRlc2MpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFuYWdlck5vblN0YW5kYXJkU3RvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmYWN0b3J5LmlzRGVmYXVsdE1hbmFnZXIobWFuYWdlcikpOworICAgICAgICBtYW5hZ2VyLnNldE1heEFjdGl2ZVNlc3Npb25zKDEwMCk7CisgICAgICAgIGFzc2VydEZhbHNlKGZhY3RvcnkuaXNEZWZhdWx0TWFuYWdlcihtYW5hZ2VyKSk7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8TWFuYWdlciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uU3RhbmRhcmRNYW5hZ2VyXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBtYXhBY3RpdmVTZXNzaW9ucz1cIjEwMFwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUoZmFjdG9yeS5pc0RlZmF1bHRNYW5hZ2VyKG1hbmFnZXIpKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIiI7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVjayhTdHJpbmcgYXNwZWN0ZWRSZXN1bHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmYWN0b3J5LnN0b3JlKHBXcml0ZXIsIC0yLCBtYW5hZ2VyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzcGVjdGVkUmVzdWx0LCB3cml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TZXJ2ZXJDaGlsZHNUZXN0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1NlcnZlckNoaWxkc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTUwOTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TZXJ2ZXJDaGlsZHNUZXN0LmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RhbmRhcmRTZXJ2ZXJTRjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZVJlZ2lzdHJ5OworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqICAKKyAqLworcHVibGljIGNsYXNzIFNlcnZlckNoaWxkc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5OworCisgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgIFByaW50V3JpdGVyIHBXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKKworICAgIFN0YW5kYXJkU2VydmVyIHN0YW5kYXJkU2VydmVyID0gbmV3IFN0YW5kYXJkU2VydmVyKCk7CisKKyAgICBTdGFuZGFyZFNlcnZlclNGIGZhY3Rvcnk7CisKKyAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2M7CisKKyAgICAvKgorICAgICAqIGNyZWF0ZSByZWdpc3RlcnkgYW5kIHJlZ2lzdGVyIFNlcnZlciBhbmQgZGlyZWN0IHN1YmVsZW1lbnQgZGVzY3JpcHRvcnMKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICByZWdpc3RyeSA9IG5ldyBTdG9yZVJlZ2lzdHJ5KCk7CisgICAgICAgIGRlc2MgPSBuZXcgU3RvcmVEZXNjcmlwdGlvbigpOworICAgICAgICBkZXNjLnNldFRhZygiU2VydmVyIik7CisgICAgICAgIGRlc2Muc2V0VGFnQ2xhc3MoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlciIpOworICAgICAgICBkZXNjLnNldFN0YW5kYXJkKHRydWUpOworICAgICAgICBkZXNjCisgICAgICAgICAgICAgICAgLnNldFN0b3JlRmFjdG9yeUNsYXNzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0YW5kYXJkU2VydmVyU0YiKTsKKyAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJEZXNjcmlwdGlvbihkZXNjKTsKKyAgICAgICAgZmFjdG9yeSA9IG5ldyBTdGFuZGFyZFNlcnZlclNGKCk7CisgICAgICAgIGRlc2Muc2V0U3RvcmVGYWN0b3J5KGZhY3RvcnkpOworICAgICAgICBmYWN0b3J5LnNldFJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBsaXN0ZGVzYyA9IHJlZ2lzdGVyRGVzY3JpcHRvcigiTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgIExpZmVjeWNsZUxpc3RlbmVyLmNsYXNzKTsKKyAgICAgICAgbGlzdGRlc2MKKyAgICAgICAgICAgICAgICAuYWRkVHJhbnNpZW50Q2hpbGQoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5OYW1pbmdDb250ZXh0TGlzdGVuZXIiKTsKKyAgICAgICAgbGlzdGRlc2MKKyAgICAgICAgICAgICAgICAuYWRkVHJhbnNpZW50Q2hpbGQoIm9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIik7CisgICAgICAgIHN0YW5kYXJkU2VydmVyCisgICAgICAgICAgICAgICAgLmFkZExpZmVjeWNsZUxpc3RlbmVyKG5ldyBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5TZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcigpKTsKKyAgICAgICAgLy8gYWRkIEdsb2JhbE5hbWluZ1Jlc291cmNlCisgICAgICAgIERlc2NyaXB0b3JIZWxwZXIucmVnaXN0ZXJEZXNjcmlwdG9yKGRlc2MsIHJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgIE5hbWluZ1Jlc291cmNlcy5jbGFzcy5nZXROYW1lKCkgKyAiLltHbG9iYWxOYW1pbmdSZXNvdXJjZXNdIiwKKyAgICAgICAgICAgICAgICAiR2xvYmFsTmFtaW5nUmVzb3VyY2VzIiwgTmFtaW5nUmVzb3VyY2VzLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5HbG9iYWxOYW1pbmdSZXNvdXJjZXNTRiIsCisgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UpOworICAgICAgICBEZXNjcmlwdG9ySGVscGVyLnJlZ2lzdGVyTmFtaW5nRGVzY3JpcHRvcihkZXNjLCByZWdpc3RyeSk7CisgICAgICAgIHJlZ2lzdGVyRGVzY3JpcHRvcigiU2VydmljZSIsIFN0YW5kYXJkU2VydmljZS5jbGFzcywKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdGFuZGFyZFNlcnZpY2VTRiIsIHRydWUsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICBEZXNjcmlwdG9ySGVscGVyLnJlZ2lzdGVyRGVzY3JpcHRvcihkZXNjLCByZWdpc3RyeSwKKyAgICAgICAgICAgICAgICBTdGFuZGFyZFNlcnZlci5jbGFzcy5nZXROYW1lKCkgKyAiLltTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcl0iLAorICAgICAgICAgICAgICAgICJTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciIsIFN0YW5kYXJkU2VydmVyLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICBzdGFuZGFyZFNlcnZlci5hZGRTZXJ2aWNlKG5ldyBTdGFuZGFyZFNlcnZpY2UoKSk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIFN0b3JlRGVzY3JpcHRpb24gcmVnaXN0ZXJEZXNjcmlwdG9yKFN0cmluZyB0YWcsIENsYXNzIGFDbGFzcykgeworICAgICAgICByZXR1cm4gcmVnaXN0ZXJEZXNjcmlwdG9yKHRhZywgYUNsYXNzLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdG9yZURlc2NyaXB0aW9uIHJlZ2lzdGVyRGVzY3JpcHRvcihTdHJpbmcgdGFnLCBDbGFzcyBhQ2xhc3MsCisgICAgICAgICAgICBTdHJpbmcgZmFjdG9yeUNsYXNzLCBib29sZWFuIGZzdGFuZGFyZCwgYm9vbGVhbiBmZGVmYXVsdCkgeworICAgICAgICByZXR1cm4gRGVzY3JpcHRvckhlbHBlci5yZWdpc3RlckRlc2NyaXB0b3IoZGVzYywgcmVnaXN0cnksIGFDbGFzcworICAgICAgICAgICAgICAgIC5nZXROYW1lKCksIHRhZywgYUNsYXNzLmdldE5hbWUoKSwgZmFjdG9yeUNsYXNzLCBmc3RhbmRhcmQsCisgICAgICAgICAgICAgICAgZmRlZmF1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlTGlzdGVuZXJBZGRTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGFuZGFyZFNlcnZlciBpbnN0YW5jZW9mIExpZmVjeWNsZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoCisgICAgICAgICAgICAgICAgIk5vIExpc3RlbmVyIERlc2NyaXB0b3IiLAorICAgICAgICAgICAgICAgIHJlZ2lzdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAuZmluZERlc2NyaXB0aW9uKCJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5TZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciIpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgKKyAgICAgICAgICAgICAgICAiTm8gTGlzdGVuZXIgU3RvcmVGYWN0b3J5IiwKKyAgICAgICAgICAgICAgICByZWdpc3RyeQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRTdG9yZUZhY3RvcnkoIm9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIikpOworICAgICAgICBmYWN0b3J5LnN0b3JlKHBXcml0ZXIsIC0yLCBzdGFuZGFyZFNlcnZlcik7CisgCisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiCisgICAgICAgICAgICAgICAgKyByZWdpc3RyeS5nZXRFbmNvZGluZygpCisgICAgICAgICAgICAgICAgKyAiXCI/PiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiPFNlcnZlcj4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPExpc3RlbmVyIGNsYXNzTmFtZT1cIm9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgPEdsb2JhbE5hbWluZ1Jlc291cmNlcz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgIDwvR2xvYmFsTmFtaW5nUmVzb3VyY2VzPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgPFNlcnZpY2UvPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIjwvU2VydmVyPiIgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzcGVjdGVkUmVzdWx0LCB3cml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRDb250ZXh0U0ZUZXN0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkQ29udGV4dFNGVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYzdkMDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkQ29udGV4dFNGVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUVudlJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VMaW5rOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk5hbWluZ1Jlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpBQVNSZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uRmlsZVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlBlcnNpc3RlbnRNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5TdGFuZGFyZE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdGFuZGFyZENvbnRleHRTRjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZVJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5GaWxlRGlyQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuUHJveHlEaXJDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5XQVJEaXJDb250ZXh0OworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqICAKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkQ29udGV4dFNGVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5OworCisgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgIFByaW50V3JpdGVyIHBXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKKworICAgIFN0YW5kYXJkQ29udGV4dCBzdGFuZGFyZENvbnRleHQ7CisKKyAgICBTdGFuZGFyZENvbnRleHRTRiBmYWN0b3J5OworCisgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjOworCisgICAgLyoKKyAgICAgKiBjcmVhdGUgcmVnaXN0ZXJ5IGFuZCByZWdpc3RlciBDb250ZXh0IGFuZCBhbGwgc3ViZWxlbWVudHMKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICByZWdpc3RyeSA9IG5ldyBTdG9yZVJlZ2lzdHJ5KCk7CisgICAgICAgIGRlc2MgPSBuZXcgU3RvcmVEZXNjcmlwdGlvbigpOworICAgICAgICBkZXNjLnNldFRhZygiQ29udGV4dCIpOworICAgICAgICBkZXNjLnNldFRhZ0NsYXNzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0Iik7CisgICAgICAgIGRlc2Muc2V0U3RhbmRhcmQodHJ1ZSk7CisgICAgICAgIGRlc2MKKyAgICAgICAgICAgICAgICAuc2V0U3RvcmVGYWN0b3J5Q2xhc3MoIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RhbmRhcmRDb250ZXh0U0YiKTsKKyAgICAgICAgU3RyaW5nIGV4Y2VwdGlvbnNbXSA9IHsgImF2YWlsYWJsZSIsICJjb25maWdGaWxlIiwgImNvbmZpZ3VyZWQiLAorICAgICAgICAgICAgICAgICJkaXN0cmlidXRhYmxlIiwgImRvbWFpbiIsICJlbmdpbmVOYW1lIiwgIm5hbWUiLCAib3ZlcnJpZGUiLAorICAgICAgICAgICAgICAgICJwdWJsaWNJZCIsICJyZXBsYWNlV2VsY29tZUZpbGVzIiwgInNlc3Npb25UaW1lb3V0IiwKKyAgICAgICAgICAgICAgICAic3RhcnR1cFRpbWUiLCAidGxkU2NhblRpbWUiIH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9ucy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGRlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKGV4Y2VwdGlvbnNbaV0pOworCisgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRGVzY3JpcHRpb24oZGVzYyk7CisgICAgICAgIGZhY3RvcnkgPSBuZXcgU3RhbmRhcmRDb250ZXh0U0YoKTsKKyAgICAgICAgZGVzYy5zZXRTdG9yZUZhY3RvcnkoZmFjdG9yeSk7CisgICAgICAgIGZhY3Rvcnkuc2V0UmVnaXN0cnkocmVnaXN0cnkpOworCisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gbGlzdGVuZXJkZXNjID0gcmVnaXN0ZXJEZXNjcmlwdG9yKCJMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIuY2xhc3MpOworCisgICAgICAgIFN0cmluZyBsaXN0ZW5lcnNraXBwYWJsZXNbXSA9IHsKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLk5hbWluZ0NvbnRleHRMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Db250ZXh0Q29uZmlnIiwgfTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnNraXBwYWJsZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBsaXN0ZW5lcmRlc2MuYWRkVHJhbnNpZW50Q2hpbGQobGlzdGVuZXJza2lwcGFibGVzW2ldKTsKKworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIHJlYWxtZGVzYyA9IHJlZ2lzdGVyRGVzY3JpcHRvcigiUmVhbG0iLAorICAgICAgICAgICAgICAgIEpBQVNSZWFsbS5jbGFzcywKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIG1hbmFnZXJkZXNjID0gcmVnaXN0ZXJEZXNjcmlwdG9yKCJNYW5hZ2VyIiwKKyAgICAgICAgICAgICAgICBTdGFuZGFyZE1hbmFnZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuTWFuYWdlclNGIiwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgbWFuYWdlcmRlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKCJlbnRyb3B5Iik7CisgICAgICAgIG1hbmFnZXJkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgiZGlzdHJpYnV0YWJsZSIpOworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIHBtYW5hZ2VyZGVzYyA9IHJlZ2lzdGVyRGVzY3JpcHRvcigiTWFuYWdlciIsCisgICAgICAgICAgICAgICAgUGVyc2lzdGVudE1hbmFnZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuUGVyc2lzdGVudE1hbmFnZXJTRiIsIGZhbHNlLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgcG1hbmFnZXJkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgiZW50cm9weSIpOworICAgICAgICBwbWFuYWdlcmRlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKCJkaXN0cmlidXRhYmxlIik7CisgICAgICAgIERlc2NyaXB0b3JIZWxwZXIucmVnaXN0ZXJEZXNjcmlwdG9yKHBtYW5hZ2VyZGVzYywgcmVnaXN0cnksCisgICAgICAgICAgICAgICAgRmlsZVN0b3JlLmNsYXNzLmdldE5hbWUoKSwgIlN0b3JlIiwgRmlsZVN0b3JlLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICBEZXNjcmlwdG9ySGVscGVyLnJlZ2lzdGVyRGVzY3JpcHRvcihwbWFuYWdlcmRlc2MsIHJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgIEpEQkNTdG9yZS5jbGFzcy5nZXROYW1lKCksICJTdG9yZSIsIEpEQkNTdG9yZS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIGZhbHNlLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgRGVzY3JpcHRvckhlbHBlci5yZWdpc3Rlck5hbWluZ0Rlc2NyaXB0b3IoZGVzYywgcmVnaXN0cnkpOworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIHZhbHZlZGVzYyA9IHJlZ2lzdGVyRGVzY3JpcHRvcigiVmFsdmUiLCBWYWx2ZS5jbGFzcywKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICBTdHJpbmcgc2tpcHBhYmxlc1tdID0geworICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuQmFzaWNBdXRoZW50aWNhdG9yIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkRpZ2VzdEF1dGhlbnRpY2F0b3IiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuRm9ybUF1dGhlbnRpY2F0b3IiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuTm9uTG9naW5BdXRoZW50aWNhdG9yIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLlNTTEF1dGhlbnRpY2F0b3IiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0VmFsdmUiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5DZXJ0aWZpY2F0ZXNWYWx2ZSIgfTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBza2lwcGFibGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgdmFsdmVkZXNjLmFkZFRyYW5zaWVudENoaWxkKHNraXBwYWJsZXNbaV0pOworCisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gcmVzZGVzYyA9IHJlZ2lzdGVyRGVzY3JpcHRvcigiUmVzb3VyY2VzIiwKKyAgICAgICAgICAgICAgICBEaXJDb250ZXh0LmNsYXNzLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIHJlc2Rlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKCJkb2NCYXNlIik7CisgICAgICAgIHJlc2Rlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKCJhbGxvd0xpbmtpbmciKTsKKyAgICAgICAgcmVzZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoImNhY2hlTWF4U2l6ZSIpOworICAgICAgICByZXNkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgiY2FjaGVUVEwiKTsKKyAgICAgICAgcmVzZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoImNhc2VTZW5zaXRpdmUiKTsKKyAgICAgICAgcmVzZGVzYy5hZGRUcmFuc2llbnRDaGlsZChGaWxlRGlyQ29udGV4dC5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICByZXNkZXNjLmFkZFRyYW5zaWVudENoaWxkKFByb3h5RGlyQ29udGV4dC5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICByZXNkZXNjLmFkZFRyYW5zaWVudENoaWxkKFdBUkRpckNvbnRleHQuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgc3RhbmRhcmRDb250ZXh0ID0gbmV3IFN0YW5kYXJkQ29udGV4dCgpOworICAgICAgICBzdGFuZGFyZENvbnRleHQuc2V0UGF0aCgiL215YXBwcyIpOworICAgICAgICBzdGFuZGFyZENvbnRleHQuc2V0RG9jQmFzZSgibXlhcHBzIik7CisKKyAgICB9CisKKyAgICBwcml2YXRlIFN0b3JlRGVzY3JpcHRpb24gcmVnaXN0ZXJEZXNjcmlwdG9yKFN0cmluZyB0YWcsIENsYXNzIGFDbGFzcykgeworICAgICAgICByZXR1cm4gcmVnaXN0ZXJEZXNjcmlwdG9yKHRhZywgYUNsYXNzLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdG9yZURlc2NyaXB0aW9uIHJlZ2lzdGVyRGVzY3JpcHRvcihTdHJpbmcgdGFnLCBDbGFzcyBhQ2xhc3MsCisgICAgICAgICAgICBTdHJpbmcgZmFjdG9yeUNsYXNzLCBib29sZWFuIGZzdGFuZGFyZCwgYm9vbGVhbiBmZGVmYXVsdCkgeworICAgICAgICByZXR1cm4gRGVzY3JpcHRvckhlbHBlci5yZWdpc3RlckRlc2NyaXB0b3IoZGVzYywgcmVnaXN0cnksIGFDbGFzcworICAgICAgICAgICAgICAgIC5nZXROYW1lKCksIHRhZywgYUNsYXNzLmdldE5hbWUoKSwgZmFjdG9yeUNsYXNzLCBmc3RhbmRhcmQsCisgICAgICAgICAgICAgICAgZmRlZmF1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBUT0RPIExpc3RlbmVyIG9ubHkgc2F2ZWQgYXQgcmVhbCBjb250ZXh0LiBXcm9uZyB3aGVuIG5leHQgQ29udGV4dAorICAgICAqICAgICAgIGRlcGxveWVkISBzZWUgQ2hhbmdlcy50eHQKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lclN0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YW5kYXJkQ29udGV4dAorICAgICAgICAgICAgICAgIC5hZGRMaWZlY3ljbGVMaXN0ZW5lcihuZXcgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JbmZvTGlmZWN5Y2xlTGlzdGVuZXIoKSk7CisgICAgICAgIHN0YW5kYXJkQ29udGV4dAorICAgICAgICAgICAgICAgIC5hZGRJbnN0YW5jZUxpc3RlbmVyKCJvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lckxpc3RlbmVyIik7CisgICAgICAgIHN0YW5kYXJkQ29udGV4dAorICAgICAgICAgICAgICAgIC5hZGRXcmFwcGVyTGlzdGVuZXIoIm9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyTGlzdGVuZXIiKTsKKyAgICAgICAgc3RhbmRhcmRDb250ZXh0CisgICAgICAgICAgICAgICAgLmFkZFdyYXBwZXJMaWZlY3ljbGUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyTGlzdGVuZXIiKTsKKyAgICAgICAgc3RhbmRhcmRDb250ZXh0LmFkZFdhdGNoZWRSZXNvdXJjZSgiL3RtcC9yZWxvYWRlZCIpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPENvbnRleHQiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBkb2NCYXNlPVwibXlhcHBzXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBwYXRoPVwiL215YXBwc1wiPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8TGlzdGVuZXIgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JbmZvTGlmZWN5Y2xlTGlzdGVuZXJcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxJbnN0YW5jZUxpc3RlbmVyPm9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyTGlzdGVuZXI8L0luc3RhbmNlTGlzdGVuZXI+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxXcmFwcGVyTGlzdGVuZXI+b3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXJMaXN0ZW5lcjwvV3JhcHBlckxpc3RlbmVyPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8V3JhcHBlckxpZmVjeWNsZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lckxpc3RlbmVyPC9XcmFwcGVyTGlmZWN5Y2xlPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8V2F0Y2hlZFJlc291cmNlPi90bXAvcmVsb2FkZWQ8L1dhdGNoZWRSZXNvdXJjZT4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICI8L0NvbnRleHQ+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5hbWluZ1N0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YW5kYXJkQ29udGV4dAorICAgICAgICAgICAgICAgIC5hZGRMaWZlY3ljbGVMaXN0ZW5lcihuZXcgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JbmZvTGlmZWN5Y2xlTGlzdGVuZXIoKSk7CisgICAgICAgIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMgPSBzdGFuZGFyZENvbnRleHQuZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIENvbnRleHRSZXNvdXJjZUVudlJlZiByZWYgPSBuZXcgQ29udGV4dFJlc291cmNlRW52UmVmKCk7CisgICAgICAgIHJlZi5zZXROYW1lKCJmb28iKTsKKyAgICAgICAgcmVmLnNldFR5cGUoInR5cGUiKTsKKyAgICAgICAgcmVzb3VyY2VzLmFkZFJlc291cmNlRW52UmVmKHJlZik7CisgICAgICAgIENvbnRleHRSZXNvdXJjZUxpbmsgcmVzID0gbmV3IENvbnRleHRSZXNvdXJjZUxpbmsoKTsKKyAgICAgICAgcmVzLnNldE5hbWUoImpkYmMvQmFybG9jYWwiKTsKKyAgICAgICAgcmVzLnNldFR5cGUoImphdmF4LnNxbC5EYXRhU291cmNlIik7CisgICAgICAgIHJlcy5zZXRHbG9iYWwoImpkYmMvQmFyIik7CisgICAgICAgIHJlc291cmNlcy5hZGRSZXNvdXJjZUxpbmsocmVzKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxDb250ZXh0IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgZG9jQmFzZT1cIm15YXBwc1wiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgcGF0aD1cIi9teWFwcHNcIj4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPExpc3RlbmVyIGNsYXNzTmFtZT1cIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSW5mb0xpZmVjeWNsZUxpc3RlbmVyXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgPFJlc291cmNlRW52UmVmIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIG5hbWU9XCJmb29cIiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICB0eXBlPVwidHlwZVwiLz4iICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICA8UmVzb3VyY2VMaW5rIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICAgIGdsb2JhbD1cImpkYmMvQmFyXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgICAgbmFtZT1cImpkYmMvQmFybG9jYWxcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgICB0eXBlPVwiamF2YXguc3FsLkRhdGFTb3VyY2VcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiPC9Db250ZXh0PiIgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNYW5hZ2VyU3RvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhbmRhcmRDb250ZXh0LnNldE1hbmFnZXIobmV3IFN0YW5kYXJkTWFuYWdlcigpKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxDb250ZXh0IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIGRvY0Jhc2U9XCJteWFwcHNcIiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBwYXRoPVwiL215YXBwc1wiPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIjwvQ29udGV4dD5cclxuIjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFsbVN0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YW5kYXJkQ29udGV4dC5zZXRNYW5hZ2VyKG5ldyBTdGFuZGFyZE1hbmFnZXIoKSk7CisgICAgICAgIEpBQVNSZWFsbSByZWFsbSA9IG5ldyBKQUFTUmVhbG0oKTsKKyAgICAgICAgc3RhbmRhcmRDb250ZXh0LnNldFJlYWxtKHJlYWxtKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxDb250ZXh0IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIGRvY0Jhc2U9XCJteWFwcHNcIiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBwYXRoPVwiL215YXBwc1wiPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPFJlYWxtIGNsYXNzTmFtZT1cIm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkFBU1JlYWxtXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgICAgYXBwTmFtZT1cIm15YXBwc1wiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICI8L0NvbnRleHQ+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgLy8gQFRPRE8gV2h5IHRoZSBNYXhJbmFjdGl2ZUludGVydmFsIGlzIGFmdGVyIHNldE1hbmFnZXIgc2V0IHRvIDE4MDAgc2VjPworICAgIHB1YmxpYyB2b2lkIHRlc3RNYW5hZ2VyTm9uU3RhbmRhcmRTdG9yZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdGFuZGFyZE1hbmFnZXIgbWFuYWdlciA9IG5ldyBTdGFuZGFyZE1hbmFnZXIoKTsKKyAgICAgICAgbWFuYWdlci5zZXRNYXhBY3RpdmVTZXNzaW9ucygxMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoNjAsIG1hbmFnZXIuZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpKTsKKyAgICAgICAgc3RhbmRhcmRDb250ZXh0LnNldE1hbmFnZXIobWFuYWdlcik7CisgICAgICAgIGFzc2VydEVxdWFscygxODAwLCBtYW5hZ2VyLmdldE1heEluYWN0aXZlSW50ZXJ2YWwoKSk7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8Q29udGV4dCIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIGRvY0Jhc2U9XCJteWFwcHNcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIHBhdGg9XCIvbXlhcHBzXCI+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxNYW5hZ2VyIGNsYXNzTmFtZT1cIm9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5TdGFuZGFyZE1hbmFnZXJcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgICAgIG1heEFjdGl2ZVNlc3Npb25zPVwiMTAwXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgICAgICBtYXhJbmFjdGl2ZUludGVydmFsPVwiMTgwMFwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICI8L0NvbnRleHQ+XHJcbiI7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdGVudE1hbmFnZXJTdG9yZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQZXJzaXN0ZW50TWFuYWdlciBtYW5hZ2VyID0gbmV3IFBlcnNpc3RlbnRNYW5hZ2VyKCk7CisgICAgICAgIG1hbmFnZXIuc2V0U2F2ZU9uUmVzdGFydChmYWxzZSk7CisgICAgICAgIHN0YW5kYXJkQ29udGV4dC5zZXRNYW5hZ2VyKG1hbmFnZXIpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPENvbnRleHQiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBkb2NCYXNlPVwibXlhcHBzXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBwYXRoPVwiL215YXBwc1wiPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8TWFuYWdlciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uUGVyc2lzdGVudE1hbmFnZXJcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgICAgIG1heEluYWN0aXZlSW50ZXJ2YWw9XCIxODAwXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgICAgICBzYXZlT25SZXN0YXJ0PVwiZmFsc2VcIj4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgIDwvTWFuYWdlcj4iICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICI8L0NvbnRleHQ+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBlcnNpc3RlbnRNYW5hZ2VyRmlsZVN0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBlcnNpc3RlbnRNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgUGVyc2lzdGVudE1hbmFnZXIoKTsKKyAgICAgICAgbWFuYWdlci5zZXRTYXZlT25SZXN0YXJ0KGZhbHNlKTsKKyAgICAgICAgRmlsZVN0b3JlIHN0b3JlID0gbmV3IEZpbGVTdG9yZSgpOworICAgICAgICBtYW5hZ2VyLnNldFN0b3JlKHN0b3JlKTsKKyAgICAgICAgc3RhbmRhcmRDb250ZXh0LnNldE1hbmFnZXIobWFuYWdlcik7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8Q29udGV4dCIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIGRvY0Jhc2U9XCJteWFwcHNcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIHBhdGg9XCIvbXlhcHBzXCI+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxNYW5hZ2VyIGNsYXNzTmFtZT1cIm9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5QZXJzaXN0ZW50TWFuYWdlclwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgICBtYXhJbmFjdGl2ZUludGVydmFsPVwiMTgwMFwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgICBzYXZlT25SZXN0YXJ0PVwiZmFsc2VcIj4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICA8U3RvcmUgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLkZpbGVTdG9yZVwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgIDwvTWFuYWdlcj4iICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICI8L0NvbnRleHQ+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFJlc291cmNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlRGlyQ29udGV4dCBkaXJDID0gbmV3IEZpbGVEaXJDb250ZXh0KCk7CisgICAgICAgIHN0YW5kYXJkQ29udGV4dC5zZXRBbGxvd0xpbmtpbmcodHJ1ZSk7CisgICAgICAgIHN0YW5kYXJkQ29udGV4dC5zZXRSZXNvdXJjZXMoZGlyQyk7CisgICAgICAgIFN0YW5kYXJkSG9zdCBob3N0ID0gbmV3IFN0YW5kYXJkSG9zdCgpOworICAgICAgICBob3N0LmFkZENoaWxkKHN0YW5kYXJkQ29udGV4dCk7CisgICAgICAgIGhvc3Quc2V0TmFtZSgibG9jYWxob3N0Iik7CisgICAgICAgIGhvc3Quc2V0QXBwQmFzZSgid2ViYXBwcyIpOworICAgICAgICBzdGFuZGFyZENvbnRleHQucmVzb3VyY2VzU3RhcnQoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzdGFuZGFyZENvbnRleHQuZ2V0UmVzb3VyY2VzKCkpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPENvbnRleHQiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgZG9jQmFzZT1cIm15YXBwc1wiIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIHBhdGg9XCIvbXlhcHBzXCI+IiArIExGLkxJTkVfU0VQQVJBVE9SICsgIjwvQ29udGV4dD4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIC8qCisgICAgICogKyAiIDxSZXNvdXJjZXMgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLkZpbGVEaXJDb250ZXh0XCIiICsKKyAgICAgKiBDb25zdGFudHMuTElORV9TRVBBUkFUT1IgKyAiIGFsbG93TGlua2luZz1cInRydWVcIi8+IiArCisgICAgICogQ29uc3RhbnRzLkxJTkVfU0VQQVJBVE9SCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3JlRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxDb250ZXh0IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIGRvY0Jhc2U9XCJteWFwcHNcIiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBwYXRoPVwiL215YXBwc1wiPiIgKyBMRi5MSU5FX1NFUEFSQVRPUiArICI8L0NvbnRleHQ+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVjayhTdHJpbmcgYXNwZWN0ZWRSZXN1bHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmYWN0b3J5LnN0b3JlKHBXcml0ZXIsIC0yLCBzdGFuZGFyZENvbnRleHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNwZWN0ZWRSZXN1bHQsIHdyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkRW5naW5lU0ZUZXN0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkRW5naW5lU0ZUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmYWU4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRFbmdpbmVTRlRlc3QuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkFBU1JlYWxtOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RhbmRhcmRFbmdpbmVTRjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZVJlZ2lzdHJ5OworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqICAKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkRW5naW5lU0ZUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIFN0b3JlUmVnaXN0cnkgcmVnaXN0cnk7CisKKyAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCisgICAgUHJpbnRXcml0ZXIgcFdyaXRlciA9IG5ldyBQcmludFdyaXRlcih3cml0ZXIpOworCisgICAgU3RhbmRhcmRFbmdpbmUgc3RhbmRhcmRFbmdpbmU7CisKKyAgICBTdGFuZGFyZEVuZ2luZVNGIGZhY3Rvcnk7CisKKyAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2M7CisKKyAgICAvKgorICAgICAqIGNyZWF0ZSByZWdpc3RlcnkgYW5kIHJlZ2lzdGVyIEVuZ2luZSBhbmQgZGlyZWN0IHN1YmVsZW1lbnQgZGVzY3JpcHRvcnMKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICByZWdpc3RyeSA9IG5ldyBTdG9yZVJlZ2lzdHJ5KCk7CisgICAgICAgIGRlc2MgPSBuZXcgU3RvcmVEZXNjcmlwdGlvbigpOworICAgICAgICBkZXNjLnNldFRhZygiRW5naW5lIik7CisgICAgICAgIGRlc2Muc2V0VGFnQ2xhc3MoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEVuZ2luZSIpOworICAgICAgICBkZXNjLnNldFN0YW5kYXJkKHRydWUpOworICAgICAgICBkZXNjCisgICAgICAgICAgICAgICAgLnNldFN0b3JlRmFjdG9yeUNsYXNzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0YW5kYXJkRW5naW5lU0YiKTsKKyAgICAgICAgZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoImRvbWFpbiIpOworICAgICAgICByZWdpc3RyeS5yZWdpc3RlckRlc2NyaXB0aW9uKGRlc2MpOworICAgICAgICBmYWN0b3J5ID0gbmV3IFN0YW5kYXJkRW5naW5lU0YoKTsKKyAgICAgICAgZGVzYy5zZXRTdG9yZUZhY3RvcnkoZmFjdG9yeSk7CisgICAgICAgIGZhY3Rvcnkuc2V0UmVnaXN0cnkocmVnaXN0cnkpOworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGxpc3RlbmVyZGVzYyA9IHJlZ2lzdGVyRGVzY3JpcHRvcigiTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgIExpZmVjeWNsZUxpc3RlbmVyLmNsYXNzKTsKKworICAgICAgICBTdHJpbmcgbGlzdGVuZXJza2lwcGFibGVzW10gPSB7CisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5OYW1pbmdDb250ZXh0TGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQ29udGV4dENvbmZpZyIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5FbmdpbmVDb25maWciLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuSG9zdENvbmZpZyIsIH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJza2lwcGFibGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgbGlzdGVuZXJkZXNjLmFkZFRyYW5zaWVudENoaWxkKGxpc3RlbmVyc2tpcHBhYmxlc1tpXSk7CisKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiByZWFsbWRlc2MgPSByZWdpc3RlckRlc2NyaXB0b3IoIlJlYWxtIiwKKyAgICAgICAgICAgICAgICBKQUFTUmVhbG0uY2xhc3MsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBob3N0ZGVzYyA9IHJlZ2lzdGVyRGVzY3JpcHRvcigiSG9zdCIsCisgICAgICAgICAgICAgICAgU3RhbmRhcmRIb3N0LmNsYXNzLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIGhvc3RkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgiZG9tYWluIik7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gdmFsdmVkZXNjID0gcmVnaXN0ZXJEZXNjcmlwdG9yKCJWYWx2ZSIsIFZhbHZlLmNsYXNzLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisKKyAgICAgICAgU3RyaW5nIHNraXBwYWJsZXNbXSA9IHsKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkJhc2ljQXV0aGVudGljYXRvciIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5EaWdlc3RBdXRoZW50aWNhdG9yIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkZvcm1BdXRoZW50aWNhdG9yIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLk5vbkxvZ2luQXV0aGVudGljYXRvciIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5TU0xBdXRoZW50aWNhdG9yIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dFZhbHZlIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lVmFsdmUiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0VmFsdmUiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5DZXJ0aWZpY2F0ZXNWYWx2ZSIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkVycm9yUmVwb3J0VmFsdmUiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZXF1ZXN0TGlzdGVuZXJWYWx2ZSIsIH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2tpcHBhYmxlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHZhbHZlZGVzYy5hZGRUcmFuc2llbnRDaGlsZChza2lwcGFibGVzW2ldKTsKKworICAgICAgICBzdGFuZGFyZEVuZ2luZSA9IG5ldyBTdGFuZGFyZEVuZ2luZSgpOworICAgICAgICBzdGFuZGFyZEVuZ2luZS5zZXROYW1lKCJDYXRhbGluYSIpOworCisgICAgfQorCisgICAgcHJpdmF0ZSBTdG9yZURlc2NyaXB0aW9uIHJlZ2lzdGVyRGVzY3JpcHRvcihTdHJpbmcgdGFnLCBDbGFzcyBhQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIHJlZ2lzdGVyRGVzY3JpcHRvcih0YWcsIGFDbGFzcywKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0b3JlRGVzY3JpcHRpb24gcmVnaXN0ZXJEZXNjcmlwdG9yKFN0cmluZyB0YWcsIENsYXNzIGFDbGFzcywKKyAgICAgICAgICAgIFN0cmluZyBmYWN0b3J5Q2xhc3MsIGJvb2xlYW4gZnN0YW5kYXJkLCBib29sZWFuIGZkZWZhdWx0KSB7CisgICAgICAgIHJldHVybiBEZXNjcmlwdG9ySGVscGVyLnJlZ2lzdGVyRGVzY3JpcHRvcihkZXNjLCByZWdpc3RyeSwgYUNsYXNzCisgICAgICAgICAgICAgICAgLmdldE5hbWUoKSwgdGFnLCBhQ2xhc3MuZ2V0TmFtZSgpLCBmYWN0b3J5Q2xhc3MsIGZzdGFuZGFyZCwKKyAgICAgICAgICAgICAgICBmZGVmYXVsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YW5kYXJkRW5naW5lCisgICAgICAgICAgICAgICAgLmFkZExpZmVjeWNsZUxpc3RlbmVyKG5ldyBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkluZm9MaWZlY3ljbGVMaXN0ZW5lcigpKTsKKyAgICAgICAgU3RhbmRhcmRIb3N0IGhvc3QgPSBuZXcgU3RhbmRhcmRIb3N0KCk7CisgICAgICAgIGhvc3Quc2V0TmFtZSgibG9jYWxob3N0Iik7CisgICAgICAgIHN0YW5kYXJkRW5naW5lLmFkZENoaWxkKGhvc3QpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPEVuZ2luZSIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIG5hbWU9XCJDYXRhbGluYVwiPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8TGlzdGVuZXIgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JbmZvTGlmZWN5Y2xlTGlzdGVuZXJcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICA8UmVhbG0iICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgYXBwTmFtZT1cIkNhdGFsaW5hXCIvPiIgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgIDxIb3N0IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICAgIG5hbWU9XCJsb2NhbGhvc3RcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiPC9FbmdpbmU+IiArIExGLkxJTkVfU0VQQVJBVE9SOworCisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhbmRhcmRFbmdpbmUuc2V0TmFtZSgiQ2F0YWxpbmEiKTsKKyAgICAgICAgc3RhbmRhcmRFbmdpbmUKKyAgICAgICAgICAgICAgICAuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobmV3IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSW5mb0xpZmVjeWNsZUxpc3RlbmVyKCkpOworICAgICAgICBzdGFuZGFyZEVuZ2luZQorICAgICAgICAgICAgICAgIC5hZGRMaWZlY3ljbGVMaXN0ZW5lcihuZXcgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkVuZ2luZUNvbmZpZygpKTsKKyAgICAgICAgU3RhbmRhcmRIb3N0IGhvc3QgPSBuZXcgU3RhbmRhcmRIb3N0KCk7CisgICAgICAgIGhvc3Quc2V0TmFtZSgibG9jYWxob3N0Iik7CisgICAgICAgIHN0YW5kYXJkRW5naW5lLmFkZENoaWxkKGhvc3QpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPEVuZ2luZSIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIG5hbWU9XCJDYXRhbGluYVwiPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8TGlzdGVuZXIgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JbmZvTGlmZWN5Y2xlTGlzdGVuZXJcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICA8UmVhbG0iICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgYXBwTmFtZT1cIkNhdGFsaW5hXCIvPiIgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgIDxIb3N0IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICAgIG5hbWU9XCJsb2NhbGhvc3RcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiPC9FbmdpbmU+IiArIExGLkxJTkVfU0VQQVJBVE9SOworICAgICAgICBjaGVjayhhc3BlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZhbHZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YW5kYXJkRW5naW5lLnNldE5hbWUoIkNhdGFsaW5hIik7CisgICAgICAgIHN0YW5kYXJkRW5naW5lCisgICAgICAgICAgICAgICAgLmFkZExpZmVjeWNsZUxpc3RlbmVyKG5ldyBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkluZm9MaWZlY3ljbGVMaXN0ZW5lcigpKTsKKyAgICAgICAgc3RhbmRhcmRFbmdpbmUKKyAgICAgICAgICAgICAgICAuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobmV3IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5FbmdpbmVDb25maWcoKSk7CisgICAgICAgIFN0YW5kYXJkSG9zdCBob3N0ID0gbmV3IFN0YW5kYXJkSG9zdCgpOworICAgICAgICBob3N0LnNldE5hbWUoImxvY2FsaG9zdCIpOworICAgICAgICBzdGFuZGFyZEVuZ2luZS5hZGRDaGlsZChob3N0KTsKKyAgICAgICAgc3RhbmRhcmRFbmdpbmUKKyAgICAgICAgICAgICAgICAuYWRkVmFsdmUobmV3IG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkVycm9yUmVwb3J0VmFsdmUoKSk7CisgICAgICAgIHN0YW5kYXJkRW5naW5lCisgICAgICAgICAgICAgICAgLmFkZFZhbHZlKG5ldyBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZXF1ZXN0RHVtcGVyVmFsdmUoKSk7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8RW5naW5lIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgbmFtZT1cIkNhdGFsaW5hXCI+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxMaXN0ZW5lciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkluZm9MaWZlY3ljbGVMaXN0ZW5lclwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPFJlYWxtIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgYXBwTmFtZT1cIkNhdGFsaW5hXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8VmFsdmUgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVxdWVzdER1bXBlclZhbHZlXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgPEhvc3QiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgbmFtZT1cImxvY2FsaG9zdFwiLz4iICsgTEYuTElORV9TRVBBUkFUT1IgKyAiPC9FbmdpbmU+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcmVFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPEVuZ2luZSIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBuYW1lPVwiQ2F0YWxpbmFcIj4iICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICA8UmVhbG0iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICIgICAgYXBwTmFtZT1cIkNhdGFsaW5hXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIjwvRW5naW5lPiIgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrKFN0cmluZyBhc3BlY3RlZFJlc3VsdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZhY3Rvcnkuc3RvcmUocFdyaXRlciwgLTIsIHN0YW5kYXJkRW5naW5lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzcGVjdGVkUmVzdWx0LCB3cml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdGFuZGFyZEhvc3RTRlRlc3QuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRIb3N0U0ZUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VlZjEwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RhbmRhcmRIb3N0U0ZUZXN0LmphdmEKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2F0YWxpbmFDbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5kZXBsb3kuRmFybVdhckRlcGxveWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5tY2FzdC5NY2FzdFNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlJlcGxpY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblRyYW5zbWl0dGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25WYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlNpbXBsZVRjcENsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkFBU1JlYWxtOworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqICAKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkSG9zdFNGVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5OworCisgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgIFByaW50V3JpdGVyIHBXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKKworICAgIFN0YW5kYXJkSG9zdCBzdGFuZGFyZEhvc3Q7CisKKyAgICBTdGFuZGFyZEhvc3RTRiBmYWN0b3J5OworCisgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjOworCisgICAgLyoKKyAgICAgKiBjcmVhdGUgcmVnaXN0cnkgYW5kIHJlZ2lzdGVyIEhvc3QgYW5kIGFsbCBzdWJlbGVtZW50IGRlc2NyaXB0b3JzCisgICAgICogCisgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgcmVnaXN0cnkgPSBuZXcgU3RvcmVSZWdpc3RyeSgpOworICAgICAgICBkZXNjID0gbmV3IFN0b3JlRGVzY3JpcHRpb24oKTsKKyAgICAgICAgZGVzYy5zZXRUYWcoIkhvc3QiKTsKKyAgICAgICAgZGVzYy5zZXRUYWdDbGFzcygib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdCIpOworICAgICAgICBkZXNjLnNldFN0YW5kYXJkKHRydWUpOworICAgICAgICBkZXNjLnNldFN0b3JlRmFjdG9yeUNsYXNzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0U0YiKTsKKyAgICAgICAgZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoImRvbWFpbiIpOworICAgICAgICByZWdpc3RyeS5yZWdpc3RlckRlc2NyaXB0aW9uKGRlc2MpOworICAgICAgICBmYWN0b3J5ID0gbmV3IFN0YW5kYXJkSG9zdFNGKCk7CisgICAgICAgIGRlc2Muc2V0U3RvcmVGYWN0b3J5KGZhY3RvcnkpOworICAgICAgICBmYWN0b3J5LnNldFJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBsaXN0ZW5lcmRlc2MgPSByZWdpc3RlckRlc2NyaXB0b3IoIkxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lci5jbGFzcyk7CisKKyAgICAgICAgU3RyaW5nIGxpc3RlbmVyc2tpcHBhYmxlc1tdID0geworICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuTmFtaW5nQ29udGV4dExpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkhvc3RDb25maWciLCB9OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVyc2tpcHBhYmxlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGxpc3RlbmVyZGVzYy5hZGRUcmFuc2llbnRDaGlsZChsaXN0ZW5lcnNraXBwYWJsZXNbaV0pOworCisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gcmVhbG1kZXNjID0gcmVnaXN0ZXJEZXNjcmlwdG9yKCJSZWFsbSIsCisgICAgICAgICAgICAgICAgSkFBU1JlYWxtLmNsYXNzLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gY29udGV4dGRlc2MgPSByZWdpc3RlckRlc2NyaXB0b3IoIkNvbnRleHQiLAorICAgICAgICAgICAgICAgIFN0YW5kYXJkQ29udGV4dC5jbGFzcywKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBTdHJpbmcgZXhjZXB0aW9uc1tdID0geyAiYXZhaWxhYmxlIiwgImNvbmZpZ0ZpbGUiLCAiY29uZmlndXJlZCIsCisgICAgICAgICAgICAgICAgImRpc3RyaWJ1dGFibGUiLCAiZG9tYWluIiwgImVuZ2luZU5hbWUiLCAibmFtZSIsICJwdWJsaWNJZCIsCisgICAgICAgICAgICAgICAgInNlc3Npb25UaW1lb3V0IiwgInN0YXJ0dXBUaW1lIiwgInRsZFNjYW5UaW1lIiB9OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBjb250ZXh0ZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoZXhjZXB0aW9uc1tpXSk7CisKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiB2YWx2ZWRlc2MgPSByZWdpc3RlckRlc2NyaXB0b3IoIlZhbHZlIiwgVmFsdmUuY2xhc3MsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIsIGZhbHNlLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKworICAgICAgICBTdHJpbmcgc2tpcHBhYmxlc1tdID0geyAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdFZhbHZlIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuQ2VydGlmaWNhdGVzVmFsdmUiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5FcnJvclJlcG9ydFZhbHZlIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVxdWVzdExpc3RlbmVyVmFsdmUiLCB9OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNraXBwYWJsZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB2YWx2ZWRlc2MuYWRkVHJhbnNpZW50Q2hpbGQoc2tpcHBhYmxlc1tpXSk7CisKKyAgICAgICAgRGVzY3JpcHRvckhlbHBlci5yZWdpc3RlckNsdXN0ZXJEZXNjcmlwdG9yKGRlc2MsIHJlZ2lzdHJ5KTsKKyAgICAgICAgc3RhbmRhcmRIb3N0ID0gbmV3IFN0YW5kYXJkSG9zdCgpOworICAgICAgICBzdGFuZGFyZEhvc3Quc2V0TmFtZSgibG9jYWxob3N0Iik7CisKKyAgICB9CisKKyAgICBwcml2YXRlIFN0b3JlRGVzY3JpcHRpb24gcmVnaXN0ZXJEZXNjcmlwdG9yKFN0cmluZyB0YWcsIENsYXNzIGFDbGFzcykgeworICAgICAgICByZXR1cm4gcmVnaXN0ZXJEZXNjcmlwdG9yKHRhZywgYUNsYXNzLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdG9yZURlc2NyaXB0aW9uIHJlZ2lzdGVyRGVzY3JpcHRvcihTdHJpbmcgdGFnLCBDbGFzcyBhQ2xhc3MsCisgICAgICAgICAgICBTdHJpbmcgZmFjdG9yeUNsYXNzLCBib29sZWFuIGZzdGFuZGFyZCwgYm9vbGVhbiBmZGVmYXVsdCkgeworICAgICAgICByZXR1cm4gRGVzY3JpcHRvckhlbHBlci5yZWdpc3RlckRlc2NyaXB0b3IoZGVzYywgcmVnaXN0cnksIGFDbGFzcworICAgICAgICAgICAgICAgIC5nZXROYW1lKCksIHRhZywgYUNsYXNzLmdldE5hbWUoKSwgZmFjdG9yeUNsYXNzLCBmc3RhbmRhcmQsCisgICAgICAgICAgICAgICAgZmRlZmF1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdGFuZGFyZEhvc3QKKyAgICAgICAgICAgICAgICAuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobmV3IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSW5mb0xpZmVjeWNsZUxpc3RlbmVyKCkpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPEhvc3QiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBuYW1lPVwibG9jYWxob3N0XCI+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxMaXN0ZW5lciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkluZm9MaWZlY3ljbGVMaXN0ZW5lclwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUiArICI8L0hvc3Q+IiArIExGLkxJTkVfU0VQQVJBVE9SOworCisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhbmRhcmRIb3N0CisgICAgICAgICAgICAgICAgLmFkZExpZmVjeWNsZUxpc3RlbmVyKG5ldyBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLkluZm9MaWZlY3ljbGVMaXN0ZW5lcigpKTsKKyAgICAgICAgc3RhbmRhcmRIb3N0CisgICAgICAgICAgICAgICAgLmFkZExpZmVjeWNsZUxpc3RlbmVyKG5ldyBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuSG9zdENvbmZpZygpKTsKKyAgICAgICAgc3RhbmRhcmRIb3N0LnNldFJlYWxtKG5ldyBKQUFTUmVhbG0oKSk7CisgICAgICAgIFN0YW5kYXJkQ29udGV4dCBjb250ZXh0ID0gbmV3IFN0YW5kYXJkQ29udGV4dCgpOworICAgICAgICBjb250ZXh0LnNldERvY0Jhc2UoIm15YXBwcyIpOworICAgICAgICBjb250ZXh0LnNldFBhdGgoIi9teWFwcHMiKTsKKyAgICAgICAgc3RhbmRhcmRIb3N0LmFkZENoaWxkKGNvbnRleHQpOworICAgICAgICBzdGFuZGFyZEhvc3QuYWRkQWxpYXMoImpvdmkiKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxIb3N0IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgbmFtZT1cImxvY2FsaG9zdFwiPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8TGlzdGVuZXIgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JbmZvTGlmZWN5Y2xlTGlzdGVuZXJcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICA8QWxpYXM+am92aTwvQWxpYXM+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxSZWFsbSBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpBQVNSZWFsbVwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICAgIGFwcE5hbWU9XCJsb2NhbGhvc3RcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICA8Q29udGV4dCIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICBkb2NCYXNlPVwibXlhcHBzXCIiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgcGF0aD1cIi9teWFwcHNcIi8+IiArIExGLkxJTkVfU0VQQVJBVE9SICsgIjwvSG9zdD4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdGFuZGFyZEhvc3QKKyAgICAgICAgICAgICAgICAuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobmV3IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSW5mb0xpZmVjeWNsZUxpc3RlbmVyKCkpOworICAgICAgICBzdGFuZGFyZEhvc3QKKyAgICAgICAgICAgICAgICAuYWRkVmFsdmUobmV3IG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkVycm9yUmVwb3J0VmFsdmUoKSk7CisgICAgICAgIHN0YW5kYXJkSG9zdAorICAgICAgICAgICAgICAgIC5hZGRWYWx2ZShuZXcgb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVxdWVzdER1bXBlclZhbHZlKCkpOworICAgICAgICBzdGFuZGFyZEhvc3QuYWRkVmFsdmUobmV3IFJlcGxpY2F0aW9uVmFsdmUoKSk7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8SG9zdCIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIG5hbWU9XCJsb2NhbGhvc3RcIj4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPExpc3RlbmVyIGNsYXNzTmFtZT1cIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuSW5mb0xpZmVjeWNsZUxpc3RlbmVyXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8VmFsdmUgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVxdWVzdER1bXBlclZhbHZlXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIjwvSG9zdD4iICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2x1c3RlckVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENhdGFsaW5hQ2x1c3RlciBjbHVzdGVyID0gbmV3IFNpbXBsZVRjcENsdXN0ZXIoKTsKKyAgICAgICAgc3RhbmRhcmRIb3N0LnNldENsdXN0ZXIoY2x1c3Rlcik7CisgICAgICAgIFN0cmluZyBhc3BlY3RlZFJlc3VsdCA9ICI8SG9zdCIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIG5hbWU9XCJsb2NhbGhvc3RcIj4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgPENsdXN0ZXIgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5TaW1wbGVUY3BDbHVzdGVyXCI+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICA8L0NsdXN0ZXI+IiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiPC9Ib3N0PiIgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbHVzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNpbXBsZVRjcENsdXN0ZXIgY2x1c3RlciA9IG5ldyBTaW1wbGVUY3BDbHVzdGVyKCk7CisgICAgICAgIGNsdXN0ZXIuc2V0Q2x1c3Rlck5hbWUoImNsdXN0ZXIiKTsKKyAgICAgICAgY2x1c3Rlci5zZXRQcm9wZXJ0eSgiZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duIiwiZmFsc2UiKTsKKyAgICAgICAgY2x1c3RlcgorICAgICAgICAgICAgICAgIC5zZXRNYW5hZ2VyQ2xhc3NOYW1lKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5EZWx0YU1hbmFnZXIiKTsKKyAgICAgICAgTWNhc3RTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgTWNhc3RTZXJ2aWNlKCk7CisgICAgICAgIHNlcnZpY2Uuc2V0TWNhc3RBZGRyKCIyMjguMC4wLjQiKTsKKyAgICAgICAgc2VydmljZS5zZXRNY2FzdFBvcnQoNDU1NjQpOworICAgICAgICBzZXJ2aWNlLnNldE1jYXN0RnJlcXVlbmN5KDUwMGwpOworICAgICAgICBzZXJ2aWNlLnNldE1jYXN0RHJvcFRpbWUoMzAwMGwpOworICAgICAgICBjbHVzdGVyLnNldE1lbWJlcnNoaXBTZXJ2aWNlKHNlcnZpY2UpOworICAgICAgICBSZXBsaWNhdGlvbkxpc3RlbmVyIHJlY2VpdmVyID0gbmV3IFJlcGxpY2F0aW9uTGlzdGVuZXIoKTsKKyAgICAgICAgcmVjZWl2ZXIuc2V0VGNwTGlzdGVuQWRkcmVzcygiYXV0byIpOworICAgICAgICByZWNlaXZlci5zZXRUY3BMaXN0ZW5Qb3J0KDQwMDEpOworICAgICAgICByZWNlaXZlci5zZXRUY3BTZWxlY3RvclRpbWVvdXQoMTAwbCk7CisgICAgICAgIHJlY2VpdmVyLnNldFRjcFRocmVhZENvdW50KDYpOworICAgICAgICBjbHVzdGVyLnNldENsdXN0ZXJSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgIFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIgc2VuZGVyID0gbmV3IFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIoKTsKKyAgICAgICAgc2VuZGVyLnNldFJlcGxpY2F0aW9uTW9kZSgicG9vbGVkIik7CisgICAgICAgIGNsdXN0ZXIuc2V0Q2x1c3RlclNlbmRlcihzZW5kZXIpOworICAgICAgICBSZXBsaWNhdGlvblZhbHZlIHZhbHZlID0gbmV3IFJlcGxpY2F0aW9uVmFsdmUoKTsKKyAgICAgICAgdmFsdmUKKyAgICAgICAgICAgICAgICAuc2V0RmlsdGVyKCIuKlxcLmdpZjsuKlxcLmpzOy4qXFwuanBnOy4qXFwuanBlZzsuKlxcLmh0bTsuKlxcLmh0bWw7LipcXC50eHQ7Iik7CisgICAgICAgIGNsdXN0ZXIuYWRkVmFsdmUodmFsdmUpOworICAgICAgICBGYXJtV2FyRGVwbG95ZXIgZGVwbG95ZXIgPSBuZXcgRmFybVdhckRlcGxveWVyKCk7CisgICAgICAgIGRlcGxveWVyLnNldFRlbXBEaXIoIi90bXAvd2FyLXRlbXAvIik7CisgICAgICAgIGRlcGxveWVyLnNldERlcGxveURpcigiL3RtcC93YXItZGVwbG95LyIpOworICAgICAgICBkZXBsb3llci5zZXRXYXRjaERpcigiL3RtcC93YXItbGlzdGVuLyIpOworICAgICAgICBkZXBsb3llci5zZXRXYXRjaEVuYWJsZWQoZmFsc2UpOworICAgICAgICBjbHVzdGVyLnNldENsdXN0ZXJEZXBsb3llcihkZXBsb3llcik7CisgICAgICAgIHN0YW5kYXJkSG9zdC5zZXRDbHVzdGVyKGNsdXN0ZXIpOworICAgICAgICBjbHVzdGVyLmFkZExpZmVjeWNsZUxpc3RlbmVyKG5ldyBJbmZvTGlmZWN5Y2xlTGlzdGVuZXIoKSk7CisgICAgICAgIGNsdXN0ZXIuYWRkQ2x1c3Rlckxpc3RlbmVyKG5ldyBKdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyKCkpOworICAgICAgICAvLyBEZWx0YU1hbmFnZXIgaXMgZGVmYXVsdCEKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxIb3N0IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgbmFtZT1cImxvY2FsaG9zdFwiPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8Q2x1c3RlciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlNpbXBsZVRjcENsdXN0ZXJcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgICAgY2x1c3Rlck5hbWU9XCJjbHVzdGVyXCI+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgPE1lbWJlcnNoaXAgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLm1jYXN0Lk1jYXN0U2VydmljZVwiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgICBtY2FzdEFkZHI9XCIyMjguMC4wLjRcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgICAgbWNhc3REcm9wVGltZT1cIjMwMDBcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgICAgbWNhc3RGcmVxdWVuY3k9XCI1MDBcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgICAgbWNhc3RQb3J0PVwiNDU1NjRcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgPFNlbmRlciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlJlcGxpY2F0aW9uVHJhbnNtaXR0ZXJcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgICAgcmVwbGljYXRpb25Nb2RlPVwicG9vbGVkXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIDxSZWNlaXZlciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlJlcGxpY2F0aW9uTGlzdGVuZXJcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgICAgdGNwTGlzdGVuQWRkcmVzcz1cImF1dG9cIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgICAgdGNwTGlzdGVuUG9ydD1cIjQwMDFcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgICAgdGNwU2VsZWN0b3JUaW1lb3V0PVwiMTAwXCIiCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICAgIHRjcFRocmVhZENvdW50PVwiNlwiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICA8RGVwbG95ZXIgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmRlcGxveS5GYXJtV2FyRGVwbG95ZXJcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgICAgZGVwbG95RGlyPVwiL3RtcC93YXItZGVwbG95L1wiIgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgICB0ZW1wRGlyPVwiL3RtcC93YXItdGVtcC9cIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgICAgd2F0Y2hEaXI9XCIvdG1wL3dhci1saXN0ZW4vXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgIDxWYWx2ZSBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlJlcGxpY2F0aW9uVmFsdmVcIiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICAgICAgZmlsdGVyPVwiLipcXC5naWY7LipcXC5qczsuKlxcLmpwZzsuKlxcLmpwZWc7LipcXC5odG07LipcXC5odG1sOy4qXFwudHh0O1wiLz4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIiAgICA8TGlzdGVuZXIgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5JbmZvTGlmZWN5Y2xlTGlzdGVuZXJcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgPENsdXN0ZXJMaXN0ZW5lciBjbGFzc05hbWU9XCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5Kdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyXCIvPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SICsgIiAgPC9DbHVzdGVyPiIgKyBMRi5MSU5FX1NFUEFSQVRPUgorICAgICAgICAgICAgICAgICsgIjwvSG9zdD4iICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcmVFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPEhvc3QiICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgICAgbmFtZT1cImxvY2FsaG9zdFwiPiIgKyBMRi5MSU5FX1NFUEFSQVRPUiArICI8L0hvc3Q+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVjayhTdHJpbmcgYXNwZWN0ZWRSZXN1bHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmYWN0b3J5LnN0b3JlKHBXcml0ZXIsIC0yLCBzdGFuZGFyZEhvc3QpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNwZWN0ZWRSZXN1bHQsIHdyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0YW5kYXJkU2VydmljZVNGVGVzdC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdGFuZGFyZFNlcnZpY2VTRlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWJkYzg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdGFuZGFyZFNlcnZpY2VTRlRlc3QuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZpY2U7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogIAorICovCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRTZXJ2aWNlU0ZUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIFN0b3JlUmVnaXN0cnkgcmVnaXN0cnk7CisKKyAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCisgICAgUHJpbnRXcml0ZXIgcFdyaXRlciA9IG5ldyBQcmludFdyaXRlcih3cml0ZXIpOworCisgICAgU3RhbmRhcmRTZXJ2aWNlIHN0YW5kYXJkU2VydmljZSA9IG5ldyBTdGFuZGFyZFNlcnZpY2UoKTsKKworICAgIFN0YW5kYXJkU2VydmljZVNGIGZhY3Rvcnk7CisKKyAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2M7CisKKyAgICAvKgorICAgICAqIGNyZWF0ZSByZWdpc3RyeSBhbmQgcmVnaXN0ZXIgU2VydmljZSBhbmQgYWxsIGRpcmVjdCBzdWJlbGVtZW50CisgICAgICogZGVzY3JpcHRvcnMKKyAgICAgKiAKKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICByZWdpc3RyeSA9IG5ldyBTdG9yZVJlZ2lzdHJ5KCk7CisgICAgICAgIGRlc2MgPSBuZXcgU3RvcmVEZXNjcmlwdGlvbigpOworICAgICAgICBkZXNjLnNldFRhZygiU2VydmljZSIpOworICAgICAgICBkZXNjLnNldFRhZ0NsYXNzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2aWNlIik7CisgICAgICAgIGRlc2Muc2V0U3RhbmRhcmQodHJ1ZSk7CisgICAgICAgIGRlc2Muc2V0U3RvcmVGYWN0b3J5Q2xhc3MoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZpY2VTRiIpOworICAgICAgICByZWdpc3RyeS5yZWdpc3RlckRlc2NyaXB0aW9uKGRlc2MpOworICAgICAgICBmYWN0b3J5ID0gbmV3IFN0YW5kYXJkU2VydmljZVNGKCk7CisgICAgICAgIGRlc2Muc2V0U3RvcmVGYWN0b3J5KGZhY3RvcnkpOworICAgICAgICBmYWN0b3J5LnNldFJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKKyAgICAgICAgcmVnaXN0ZXJEZXNjcmlwdG9yKCJMaXN0ZW5lciIsIExpZmVjeWNsZUxpc3RlbmVyLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXJEZXNjcmlwdG9yKCJFbmdpbmUiLCBTdGFuZGFyZEVuZ2luZS5jbGFzcywKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGNkZXNjID0gcmVnaXN0ZXJEZXNjcmlwdG9yKCJDb25uZWN0b3IiLAorICAgICAgICAgICAgICAgIENvbm5lY3Rvci5jbGFzcywgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuQ29ubmVjdG9yU0YiLAorICAgICAgICAgICAgICAgIHRydWUsIHRydWUpOworICAgICAgICBjZGVzYy5nZXRTdG9yZUZhY3RvcnkoKS5zZXRTdG9yZUFwcGVuZGVyKG5ldyBDb25uZWN0b3JTdG9yZUFwcGVuZGVyKCkpOworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIHBkZXNjID0gRGVzY3JpcHRvckhlbHBlcgorICAgICAgICAgICAgICAgIC5yZWdpc3RlckRlc2NyaXB0b3IobnVsbCwgcmVnaXN0cnksIENvbm5lY3Rvci5jbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIi5bUHJvdG9jb2xIYW5kbGVyXSIsICJQcm90b2NvbEhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdG9yLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnLlN0b3JlRmFjdG9yeUJhc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UpOworICAgICAgICBwZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoImtleXN0b3JlIik7CisgICAgICAgIHBkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgia2V5cGFzcyIpOworICAgICAgICBwZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoImtleXR5cGUiKTsKKyAgICAgICAgcGRlc2MuYWRkVHJhbnNpZW50QXR0cmlidXRlKCJyYW5kb21maWxlIik7CisgICAgICAgIHBkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgicHJvdG9jb2xzIik7CisgICAgICAgIHBkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgiY2xpZW50YXV0aCIpOworICAgICAgICBwZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoInByb3RvY29sIik7CisgICAgICAgIHBkZXNjLmFkZFRyYW5zaWVudEF0dHJpYnV0ZSgicG9ydCIpOworICAgICAgICBwZGVzYy5hZGRUcmFuc2llbnRBdHRyaWJ1dGUoInNlY3VyZSIpOworCisgICAgfQorCisgICAgcHJpdmF0ZSBTdG9yZURlc2NyaXB0aW9uIHJlZ2lzdGVyRGVzY3JpcHRvcihTdHJpbmcgdGFnLCBDbGFzcyBhQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIHJlZ2lzdGVyRGVzY3JpcHRvcih0YWcsIGFDbGFzcywKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZy5TdG9yZUZhY3RvcnlCYXNlIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgU3RvcmVEZXNjcmlwdGlvbiByZWdpc3RlckRlc2NyaXB0b3IoU3RyaW5nIHRhZywgQ2xhc3MgYUNsYXNzLAorICAgICAgICAgICAgU3RyaW5nIGZhY3RvcnlDbGFzcywgYm9vbGVhbiBmc3RhbmRhcmQsIGJvb2xlYW4gZmRlZmF1bHQpIHsKKyAgICAgICAgcmV0dXJuIERlc2NyaXB0b3JIZWxwZXIucmVnaXN0ZXJEZXNjcmlwdG9yKGRlc2MsIHJlZ2lzdHJ5LCBhQ2xhc3MKKyAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLCB0YWcsIGFDbGFzcy5nZXROYW1lKCksIGZhY3RvcnlDbGFzcywgZnN0YW5kYXJkLAorICAgICAgICAgICAgICAgIGZkZWZhdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcmVBSlAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhbmRhcmRTZXJ2aWNlCisgICAgICAgICAgICAgICAgLmFkZExpZmVjeWNsZUxpc3RlbmVyKG5ldyBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5TZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcigpKTsKKyAgICAgICAgQ29ubmVjdG9yIGNvbm5lY3RvciA9IG5ldyBDb25uZWN0b3IoKTsKKyAgICAgICAgc3RhbmRhcmRTZXJ2aWNlLmFkZENvbm5lY3Rvcihjb25uZWN0b3IpOworICAgICAgICBzdGFuZGFyZFNlcnZpY2Uuc2V0Q29udGFpbmVyKG5ldyBTdGFuZGFyZEVuZ2luZSgpKTsKKyAgICAgICAgU3RyaW5nIGFzcGVjdGVkUmVzdWx0ID0gIjxTZXJ2aWNlPiIKKyAgICAgICAgICAgICAgICArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICA8TGlzdGVuZXIgY2xhc3NOYW1lPVwib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXJcIi8+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1IgKyAiICA8Q29ubmVjdG9yLz4iICsgTEYuTElORV9TRVBBUkFUT1IKKyAgICAgICAgICAgICAgICArICIgIDxFbmdpbmUvPiIgKyBMRi5MSU5FX1NFUEFSQVRPUiArICI8L1NlcnZpY2U+IgorICAgICAgICAgICAgICAgICsgTEYuTElORV9TRVBBUkFUT1I7CisgICAgICAgIGNoZWNrKGFzcGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcmVFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPSAiPFNlcnZpY2U+IiArIExGLkxJTkVfU0VQQVJBVE9SICsgIjwvU2VydmljZT4iCisgICAgICAgICAgICAgICAgKyBMRi5MSU5FX1NFUEFSQVRPUjsKKyAgICAgICAgY2hlY2soYXNwZWN0ZWRSZXN1bHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrKFN0cmluZyBhc3BlY3RlZFJlc3VsdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZhY3Rvcnkuc3RvcmUocFdyaXRlciwgLTIsIHN0YW5kYXJkU2VydmljZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc3BlY3RlZFJlc3VsdCwgd3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVBcHBlbmRlclRlc3QuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVBcHBlbmRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDQ4OGYwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUFwcGVuZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblRyYW5zbWl0dGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLlNldEFsbFByb3BlcnRpZXNSdWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuRGlnZXN0ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2gKKyAqLworcHVibGljIGNsYXNzIFN0b3JlQXBwZW5kZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBkaWdlc3RlciB3aGljaCB3aWxsIGJlIHVzZWQgdG8gcGFyc2UgY29udGV4dCBjb25maWcgZmlsZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIERpZ2VzdGVyIGNyZWF0ZURpZ2VzdGVyKCkgeworICAgICAgICBEaWdlc3RlciBkaWdlc3RlciA9IG5ldyBEaWdlc3RlcigpOworICAgICAgICBkaWdlc3Rlci5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJSZXNvdXJjZSIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKCJSZXNvdXJjZSIsIG5ldyBTZXRBbGxQcm9wZXJ0aWVzUnVsZSgpKTsKKyAgICAgICAgcmV0dXJuIGRpZ2VzdGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxSZXNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBjcmVhdGVEaWdlc3RlcigpOworICAgICAgICBTdHJpbmcgZXhhbXBsZSA9ICI8UmVzb3VyY2UgYXV0aD1cIkNvbnRhaW5lclwiIG5hbWU9XCJqZGJjL0VtcFwiIHR5cGU9XCJqYXZheC5zcWwuRGF0YVNvdXJjZVwiLz4iOworICAgICAgICBTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihleGFtcGxlKTsKKyAgICAgICAgQ29udGV4dFJlc291cmNlIHJlc291cmNlID0gKENvbnRleHRSZXNvdXJjZSkgZGlnZXN0ZXIucGFyc2UocmVhZGVyKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YXguc3FsLkRhdGFTb3VyY2UiLCByZXNvdXJjZS5nZXRUeXBlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eVJlc291Y2UoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIERpZ2VzdGVyIGRpZ2VzdGVyID0gY3JlYXRlRGlnZXN0ZXIoKTsKKyAgICAgICAgU3RyaW5nIGV4YW1wbGUgPSAiPFJlc291cmNlIGF1dGg9XCJDb250YWluZXJcIiBuYW1lPVwibWFpbC9NYWlsU2Vzc2lvblwiIHR5cGU9XCJqYXZheC5tYWlsLnNlc3Npb25cIiBtYWlsLmhvc3Q9XCJsb2NhbGhvc3RcIi8+IjsKKyAgICAgICAgU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoZXhhbXBsZSk7CisgICAgICAgIENvbnRleHRSZXNvdXJjZSByZXNvdXJjZSA9IChDb250ZXh0UmVzb3VyY2UpIGRpZ2VzdGVyLnBhcnNlKHJlYWRlcik7CisgICAgICAgIGFzc2VydE5vdE51bGwocmVzb3VyY2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoImxvY2FsaG9zdCIsIHJlc291cmNlLmdldFByb3BlcnR5KCJtYWlsLmhvc3QiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3JlU3RhbmRhcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RvcmVEZXNjcmlwdGlvbiBkZXNjID0gbmV3IFN0b3JlRGVzY3JpcHRpb24oKTsKKyAgICAgICAgZGVzYy5zZXRTdGFuZGFyZCh0cnVlKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBTdHJpbmdXcml0ZXIoKSk7CisgICAgICAgIFN0YW5kYXJkU2VydmVyIGJlYW4gPSBuZXcgU3RhbmRhcmRTZXJ2ZXIoKTsKKyAgICAgICAgbmV3IFN0b3JlQXBwZW5kZXIoKS5wcmludEF0dHJpYnV0ZXMod3JpdGVyLCAwLCB0cnVlLCBiZWFuLCBkZXNjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcmVSZXBsaWNhdGlvblRyYW5zbWl0dGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYyA9IG5ldyBTdG9yZURlc2NyaXB0aW9uKCk7CisgICAgICAgIGRlc2Muc2V0U3RhbmRhcmQodHJ1ZSk7CisgICAgICAgIFN0cmluZ1dyaXRlciBzd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3dyaXRlcik7CisgICAgICAgIFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIgYmVhbiA9IG5ldyBSZXBsaWNhdGlvblRyYW5zbWl0dGVyKCk7CisgICAgICAgIGJlYW4uc2V0UmVwbGljYXRpb25Nb2RlKCJhc3luY2hyb25vdXMiKTsKKyAgICAgICAgYmVhbi5zZXRQcm9wZXJ0eSgia2VlcEFsaXZlVGltZW91dCIsIjgwMDAwIik7CisgICAgICAgIG5ldyBJRHluYW1pY1Byb3BlcnR5U3RvcmVBcHBlbmRlcigpLnByaW50QXR0cmlidXRlcyh3cml0ZXIsIDAsIHRydWUsIGJlYW4sIGRlc2MpOworICAgICAgICBTdHJpbmcgYXNwZWN0ZWRSZXN1bHQgPUxGLkxJTkVfU0VQQVJBVE9SICAgICAgICAgICAKKyAgICAgICAgICAgKyAiICAgIHJlcGxpY2F0aW9uTW9kZT1cImFzeW5jaHJvbm91c1wiIiArIExGLkxJTkVfU0VQQVJBVE9SIAorICAgICAgICAgICArICIgICAga2VlcEFsaXZlVGltZW91dD1cIjgwMDAwXCIiIDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzcGVjdGVkUmVzdWx0LCBzd3JpdGVyLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCkpOworCisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdGVzdC9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdG9yZWNvbmZpZy9TdG9yZUNvbnRleHRBcHBlbmRlclRlc3QuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVDb250ZXh0QXBwZW5kZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1NWQxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVDb250ZXh0QXBwZW5kZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDcmVhdGVkIG9uIDI0LjA4LjIwMDQKKyAqCisgKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KKyAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcworICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWc7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Db250ZXh0Q29uZmlnOworaW1wb3J0IGphdmEuaW8uRmlsZSA7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogIAorICovCitwdWJsaWMgY2xhc3MgU3RvcmVDb250ZXh0QXBwZW5kZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgU3RvcmVDb250ZXh0QXBwZW5kZXIgYXBwZW5kZXIgPSBuZXcgU3RvcmVDb250ZXh0QXBwZW5kZXIoKTsKKworICAgIFN0YW5kYXJkQ29udGV4dCBjb250ZXh0ID0gbmV3IFN0YW5kYXJkQ29udGV4dCgpOworCisgICAgU3RhbmRhcmRIb3N0IGhvc3QgPSBuZXcgU3RhbmRhcmRIb3N0KCk7CisKKyAgICAvKgorICAgICAqIHNldHVwIGRlZmF1bHQgRW5naW5lLCBIb3N0IGFuZCBDb250ZXh0CisgICAgICogCisgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGhvc3Quc2V0TmFtZSgibG9jYWxob3N0Iik7CisgICAgICAgIGNvbnRleHQuc2V0UGFyZW50KGhvc3QpOworICAgICAgICBTdGFuZGFyZEVuZ2luZSBlbmdpbmUgPSBuZXcgU3RhbmRhcmRFbmdpbmUoKTsKKyAgICAgICAgZW5naW5lLnNldE5hbWUoIkNhdGFsaW5hIik7CisgICAgICAgIGhvc3Quc2V0UGFyZW50KGVuZ2luZSk7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdvcmtEaXJNYW5hZ2VyKCkgeworICAgICAgICBjb250ZXh0LnNldFBhdGgoIi9tYW5hZ2VyIik7CisgICAgICAgIFN0cmluZyBkZWZhdWx0RGlyID0gYXBwZW5kZXIuZ2V0RGVmYXVsdFdvcmtEaXIoY29udGV4dCk7CisgICAgICAgIGFzc2VydEVxdWFscygid29ya1xcQ2F0YWxpbmFcXGxvY2FsaG9zdFxcbWFuYWdlciIsIGRlZmF1bHREaXIpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdvcmtEaXJSb290KCkgeworICAgICAgICBjb250ZXh0LnNldFBhdGgoIiIpOworICAgICAgICBTdHJpbmcgZGVmYXVsdERpciA9IGFwcGVuZGVyLmdldERlZmF1bHRXb3JrRGlyKGNvbnRleHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndvcmtcXENhdGFsaW5hXFxsb2NhbGhvc3RcXF8iLCBkZWZhdWx0RGlyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SG9zdFdvcmtEaXJSb290KCkgeworICAgICAgICBjb250ZXh0LnNldFBhdGgoIiIpOworICAgICAgICBob3N0LnNldFdvcmtEaXIoImhvc3R3b3JrIik7CisgICAgICAgIFN0cmluZyBkZWZhdWx0RGlyID0gYXBwZW5kZXIuZ2V0RGVmYXVsdFdvcmtEaXIoY29udGV4dCk7CisgICAgICAgIGFzc2VydEVxdWFscygiaG9zdHdvcmtcXF8iLCBkZWZhdWx0RGlyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNQcmludFZhbHVlRGVmYXVsdCgpIHsKKyAgICAgICAgU3RhbmRhcmRDb250ZXh0IGNvbnRleHQyID0gbmV3IFN0YW5kYXJkQ29udGV4dCgpOworICAgICAgICBjb250ZXh0LnNldFBhdGgoIiIpOworICAgICAgICBjb250ZXh0LnNldFdvcmtEaXIoIndvcmtcXENhdGFsaW5hXFxsb2NhbGhvc3RcXF8iKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYXBwZW5kZXIuaXNQcmludFZhbHVlKGNvbnRleHQsIGNvbnRleHQyLCAid29ya0RpciIsIG51bGwpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNQcmludFZhbHVlKCkgeworICAgICAgICBTdGFuZGFyZENvbnRleHQgY29udGV4dDIgPSBuZXcgU3RhbmRhcmRDb250ZXh0KCk7CisgICAgICAgIGNvbnRleHQuc2V0UGF0aCgiIik7CisgICAgICAgIGNvbnRleHQuc2V0V29ya0RpcigiQzpcXHdvcmtcXENhdGFsaW5hXFxsb2NhbGhvc3RcXF8iKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhcHBlbmRlci5pc1ByaW50VmFsdWUoY29udGV4dCwgY29udGV4dDIsICJ3b3JrRGlyIiwgbnVsbCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIb3N0SXNQcmludFZhbHVlZGVmYXVsdCgpIHsKKyAgICAgICAgU3RhbmRhcmRDb250ZXh0IGNvbnRleHQyID0gbmV3IFN0YW5kYXJkQ29udGV4dCgpOworICAgICAgICBjb250ZXh0LnNldFBhdGgoIiIpOworICAgICAgICBob3N0LnNldFdvcmtEaXIoImhvc3R3b3JrIik7CisgICAgICAgIGNvbnRleHQuc2V0V29ya0RpcigiaG9zdHdvcmtcXF8iKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYXBwZW5kZXIuaXNQcmludFZhbHVlKGNvbnRleHQsIGNvbnRleHQyLCAid29ya0RpciIsIG51bGwpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBfdGVzdERlZmF1bHRJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKGNvbnRleHQuZ2V0Q29va2llcygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29udGV4dC5nZXRSZWxvYWRhYmxlKCkpOworICAgICAgICBTdGFuZGFyZENvbnRleHQgZGVmYXVsdENvbnRleHQgPSAoU3RhbmRhcmRDb250ZXh0KSBhcHBlbmRlcgorICAgICAgICAgICAgICAgIC5kZWZhdWx0SW5zdGFuY2UoY29udGV4dCk7CisgICAgICAgIGFzc2VydEZhbHNlKGRlZmF1bHRDb250ZXh0LmdldENvb2tpZXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoZGVmYXVsdENvbnRleHQuZ2V0UmVsb2FkYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGRlZmF1bHRDb250ZXh0LmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKS5sZW5ndGgpOworICAgICAgICBhc3NlcnRUcnVlKGRlZmF1bHRDb250ZXh0LmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKVswXSBpbnN0YW5jZW9mIENvbnRleHRDb25maWcpOworICAgICAgICBhc3NlcnRUcnVlKGRlZmF1bHRDb250ZXh0LmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKVsxXSBpbnN0YW5jZW9mIEluZm9MaWZlY3ljbGVMaXN0ZW5lcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgX3Rlc3REZWZhdWx0SW5zdGFuY2VXaXRob3V0T3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY29udGV4dC5zZXRPdmVycmlkZSh0cnVlKTsKKyAgICAgICAgU3RhbmRhcmRDb250ZXh0IGRlZmF1bHRDb250ZXh0ID0gKFN0YW5kYXJkQ29udGV4dCkgYXBwZW5kZXIKKyAgICAgICAgICAgICAgICAuZGVmYXVsdEluc3RhbmNlKGNvbnRleHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdENvbnRleHQuZmluZExpZmVjeWNsZUxpc3RlbmVycygpLmxlbmd0aCk7CisKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhbmRhcmRDb250ZXh0IGRlZmF1bHRDb250ZXh0ID0gKFN0YW5kYXJkQ29udGV4dCkgYXBwZW5kZXIKKyAgICAgICAgLmRlZmF1bHRJbnN0YW5jZShjb250ZXh0KTsKKyAgICAgICAgY29udGV4dC5zZXRQYXRoKCIvbXlhcHBzIik7CisgICAgICAgIGFzc2VydE51bGwoY29udGV4dC5nZXRDb25maWdGaWxlKCkpOworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2MgPSBuZXcgU3RvcmVEZXNjcmlwdGlvbigpOworICAgICAgICBkZXNjLnNldEV4dGVybmFsQWxsb3dlZCh0cnVlKTsKKyAgICAgICAgZGVzYy5zZXRTdG9yZVNlcGFyYXRlKHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKGFwcGVuZGVyLmlzUHJpbnRWYWx1ZShjb250ZXh0LCBkZWZhdWx0Q29udGV4dCwgInBhdGgiLCBkZXNjKSk7CisgICAgICAgIGNvbnRleHQuc2V0Q29uZmlnRmlsZSgiY29uZi9DYXRhbGluYS9sb2NhaG9zdC9teWFwcHMueG1sIik7CisgICAgICAgIGFzc2VydEZhbHNlKGFwcGVuZGVyLmlzUHJpbnRWYWx1ZShjb250ZXh0LCBkZWZhdWx0Q29udGV4dCwgInBhdGgiLCBkZXNjKSk7CisgICAgICAgIGRlc2Muc2V0RXh0ZXJuYWxBbGxvd2VkKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYXBwZW5kZXIuaXNQcmludFZhbHVlKGNvbnRleHQsIGRlZmF1bHRDb250ZXh0LCAicGF0aCIsIGRlc2MpKTsKKyAgICAgICAgZGVzYy5zZXRFeHRlcm5hbEFsbG93ZWQodHJ1ZSk7CisgICAgICAgIGRlc2Muc2V0U3RvcmVTZXBhcmF0ZShmYWxzZSk7CisgICAgICAgIGFzc2VydEZhbHNlKGFwcGVuZGVyLmlzUHJpbnRWYWx1ZShjb250ZXh0LCBkZWZhdWx0Q29udGV4dCwgInBhdGgiLCBkZXNjKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3REb2NCYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0YW5kYXJkQ29udGV4dCBkZWZhdWx0Q29udGV4dCA9IChTdGFuZGFyZENvbnRleHQpIGFwcGVuZGVyCisgICAgICAgIC5kZWZhdWx0SW5zdGFuY2UoY29udGV4dCk7CisgICAgICAgIGNvbnRleHQuc2V0UGF0aCgiL215YXBwcyIpOworICAgICAgICBjb250ZXh0LnNldERvY0Jhc2UoIm15YXBwcyIpOworICAgICAgICBob3N0LnNldEFwcEJhc2UoIndlYmFwcHMiKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYXBwZW5kZXIuaXNQcmludFZhbHVlKGNvbnRleHQsIGRlZmF1bHRDb250ZXh0LCAiZG9jQmFzZSIsIG51bGwpKTsKKyAgICAgICAgY29udGV4dC5zZXREb2NCYXNlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSArICIvbXlhcHBzIik7CisgICAgICAgIGFzc2VydFRydWUoYXBwZW5kZXIuaXNQcmludFZhbHVlKGNvbnRleHQsIGRlZmF1bHRDb250ZXh0LCAiZG9jQmFzZSIsIG51bGwpKTsKKyAgICAgICAgCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVMb2FkZXJUZXN0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlTG9hZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMGFiMGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlTG9hZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0b3JlY29uZmlnOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25UcmFuc21pdHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5TZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLkRpZ2VzdGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBTdG9yZUxvYWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlnZXN0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIERpZ2VzdGVyIGRpZ2VzdGVyID0gU3RvcmVMb2FkZXIuY3JlYXRlRGlnZXN0ZXIoKTsKKyAgICAgICAgU3RyaW5nIGV4YW1wbGUgPSAiPFJlZ2lzdHJ5IG5hbWU9XCJUb21jYXRcIiB2ZXJzaW9uPVwiNS41LjBcIiBlbmNvZGluZz1cIlVURi04XCIgPiIKKyAgICAgICAgICAgICAgICArICIgPERlc2NyaXB0aW9uICIKKyAgICAgICAgICAgICAgICArICIgIHRhZz1cIlNlcnZlclwiIgorICAgICAgICAgICAgICAgICsgIglzdGFuZGFyZD1cInRydWVcIiIKKyAgICAgICAgICAgICAgICArICIJZGVmYXVsdD1cInRydWVcIiIKKyAgICAgICAgICAgICAgICArICIgIHRhZ0NsYXNzPVwib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyXCIiCisgICAgICAgICAgICAgICAgKyAiICBzdG9yZUZhY3RvcnlDbGFzcz1cIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RhbmRhcmRTZXJ2ZXJTRlwiPiIKKyAgICAgICAgICAgICAgICArICIgPC9EZXNjcmlwdGlvbj4iICsgIjwvUmVnaXN0cnk+IjsKKyAgICAgICAgU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoZXhhbXBsZSk7CisgICAgICAgIFN0b3JlUmVnaXN0cnkgcmVnaXN0cnkgPSAoU3RvcmVSZWdpc3RyeSkgZGlnZXN0ZXIucGFyc2UocmVhZGVyKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZWdpc3RyeSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVG9tY2F0IiwgcmVnaXN0cnkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI1LjUuMCIsIHJlZ2lzdHJ5LmdldFZlcnNpb24oKSk7CisgICAgICAgIFN0b3JlRGVzY3JpcHRpb24gZGVzYyA9IHJlZ2lzdHJ5LmZpbmREZXNjcmlwdGlvbihTdGFuZGFyZFNlcnZlci5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGVzYyk7CisgICAgICAgIGFzc2VydEVxdWFscygib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyIiwgZGVzYworICAgICAgICAgICAgICAgIC5nZXRUYWdDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTZXJ2ZXIiLCBkZXNjLmdldFRhZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZFJlZ2lzdHJ5KCkgeworICAgICAgICBTdG9yZUxvYWRlciBsb2FkZXIgPSBuZXcgU3RvcmVMb2FkZXIoKTsKKyAgICAgICAgbG9hZGVyLmxvYWQoKTsKKyAgICAgICAgU3RvcmVSZWdpc3RyeSByZWdpc3RyeSA9IGxvYWRlci5nZXRSZWdpc3RyeSgpOworICAgICAgICBhc3NlcnROb3ROdWxsKHJlZ2lzdHJ5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVVEYtOCIsIHJlZ2lzdHJ5LmdldEVuY29kaW5nKCkpOworICAgICAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2MgPSByZWdpc3RyeS5maW5kRGVzY3JpcHRpb24oU3RhbmRhcmRTZXJ2ZXIuY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRlc2MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlciIsIGRlc2MKKyAgICAgICAgICAgICAgICAuZ2V0VGFnQ2xhc3MoKSk7CisgICAgICAgIGRlc2MgPSByZWdpc3RyeS5maW5kRGVzY3JpcHRpb24oU3RhbmRhcmRDb250ZXh0LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0YW5kYXJkQ29udGV4dC5jbGFzcy5nZXROYW1lKCksIGRlc2MuZ2V0VGFnQ2xhc3MoKSk7CisgICAgICAgIGFzc2VydFRydWUoZGVzYy5pc1N0b3JlU2VwYXJhdGUoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGVzYy5nZXRTdG9yZUZhY3RvcnkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZWdpc3RyeSwgZGVzYy5nZXRTdG9yZUZhY3RvcnkoKS5nZXRSZWdpc3RyeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0YW5kYXJkQ29udGV4dFNGLmNsYXNzLCBkZXNjLmdldFN0b3JlRmFjdG9yeSgpLmdldENsYXNzKCkpOworICAgICAgICBkZXNjID0gcmVnaXN0cnkKKyAgICAgICAgICAgICAgICAuZmluZERlc2NyaXB0aW9uKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXIuW1NlcnZlckxpZmVjeWNsZUxpc3RlbmVyXSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIuY2xhc3MuZ2V0TmFtZSgpLCBkZXNjCisgICAgICAgICAgICAgICAgLmdldFRhZ0NsYXNzKCkpOworICAgICAgICBkZXNjID0gcmVnaXN0cnkuZmluZERlc2NyaXB0aW9uKFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIuY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRlc2MpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVwbGljYXRpb25UcmFuc21pdHRlci5jbGFzcy5nZXROYW1lKCksIGRlc2MKKyAgICAgICAgICAgICAgICAuZ2V0VGFnQ2xhc3MoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGVzYy5nZXRTdG9yZUZhY3RvcnkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJRHluYW1pY1Byb3BlcnR5U3RvcmVBcHBlbmRlci5jbGFzcywgZGVzYy5nZXRTdG9yZUZhY3RvcnkoKS5nZXRTdG9yZUFwcGVuZGVyKCkuZ2V0Q2xhc3MoKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlUmVnaXN0cnlUZXN0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9zdG9yZWNvbmZpZy90ZXN0L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0b3JlY29uZmlnL1N0b3JlUmVnaXN0cnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5ZGI0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3Rlc3Qvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RvcmVjb25maWcvU3RvcmVSZWdpc3RyeVRlc3QuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdG9yZWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXI7CisKKy8qKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICogIAorICovCitwdWJsaWMgY2xhc3MgU3RvcmVSZWdpc3RyeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBTdG9yZVJlZ2lzdHJ5IHJlZ2lzdHJ5OworCisgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgIFByaW50V3JpdGVyIHBXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKKworICAgIFN0YW5kYXJkU2VydmVyIHN0YW5kYXJkU2VydmVyID0gbmV3IFN0YW5kYXJkU2VydmVyKCk7CisKKyAgICBJU3RvcmVGYWN0b3J5IGZhY3Rvcnk7CisKKyAgICBTdG9yZURlc2NyaXB0aW9uIGRlc2M7CisKKyAgICAvKgorICAgICAqIGNyZWF0ZSByZWdpc3RyeSBhbmQgcmVnaXN0ZXIgU2VydmVyIAorICAgICAqIAorICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHJlZ2lzdHJ5ID0gbmV3IFN0b3JlUmVnaXN0cnkoKTsKKyAgICAgICAgZGVzYyA9IG5ldyBTdG9yZURlc2NyaXB0aW9uKCk7CisgICAgICAgIGRlc2Muc2V0VGFnKCJTZXJ2ZXIiKTsKKyAgICAgICAgZGVzYy5zZXRUYWdDbGFzcygib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyIik7CisgICAgICAgIGRlc2Muc2V0U3RhbmRhcmQodHJ1ZSk7CisgICAgICAgIGRlc2MKKyAgICAgICAgICAgICAgICAuc2V0U3RvcmVGYWN0b3J5Q2xhc3MoIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVGYWN0b3J5QmFzZSIpOworICAgICAgICByZWdpc3RyeS5yZWdpc3RlckRlc2NyaXB0aW9uKGRlc2MpOworICAgICAgICBmYWN0b3J5ID0gbmV3IFN0b3JlRmFjdG9yeUJhc2UoKTsKKyAgICAgICAgZmFjdG9yeS5zZXRSZWdpc3RyeShyZWdpc3RyeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNhdmVTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZWdpc3RyeS5maW5kRGVzY3JpcHRpb24oU3RhbmRhcmRTZXJ2ZXIuY2xhc3MpKTsKKyAgICAgICAgZmFjdG9yeS5zdG9yZShwV3JpdGVyLCAtMiwgc3RhbmRhcmRTZXJ2ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlhNTCBEaWZmIiwgIjxTZXJ2ZXIvPiIgKyBMRi5MSU5FX1NFUEFSQVRPUiwgd3JpdGVyCisgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YW5kYXJkU2VydmVyLnNldFBvcnQoNzMwNSk7CisgICAgICAgIGZhY3Rvcnkuc3RvcmUocFdyaXRlciwgLTIsIHN0YW5kYXJkU2VydmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJYTUwgRGlmZiIsICI8U2VydmVyIiArIExGLkxJTkVfU0VQQVJBVE9SCisgICAgICAgICAgICAgICAgKyAiICBwb3J0PVwiNzMwNVwiLz4iICsgTEYuTElORV9TRVBBUkFUT1IsIHdyaXRlci50b1N0cmluZygpKTsKKworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3RvLWRvLnR4dCBiL2NvbnRhaW5lci9tb2R1bGVzL3N0b3JlY29uZmlnL3RvLWRvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzI5N2M0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvc3RvcmVjb25maWcvdG8tZG8udHh0CkBAIC0wLDAgKzEsOSBAQAorMS4gRml4IG5ldyBjb25uZWN0b3IgcHJvcGVydGllcyBhbmQgcHJvdG9jb2xoYW5kbGVyIGZvciA1LjUgKHRlc3RjYXNlcykKKwkgV29yayEKKzIuIEZpeCBjb250ZXh0IGRlZmF1bHQgaGFuZGxpbmcgKGhhcmQgc3R1ZmYpCiszLiBDaGVjayBjbHVzdGVyIHRyYW5zaWVudCBhdHRyaWJ1dGVzCis0LiBhZGQgZG9jdW1lbnRhdGlvbgorNS4gcmVwbGFjZSBvbGQgc2VydmVyIGltcGxlbWVudGF0aW9uIGluc3RlYWQgY3VycmVudCBsaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgorNi4gQ29udGV4dCBwYXRoIGF0dHJpYnV0ZSBoYW5kbGluZyAoIGRlbGV0ZSBhdCBleHRlcm5hbCBjb250ZXh0LnhtbCBhbmQgdXNlZCBpbnNpZGUgc2VydmVyLnhtbCEpCis3LiBUZXN0IHdpdGggQWRtaW4gQXBwCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvLmN2c2lnbm9yZSBiL2NvbnRhaW5lci90ZXN0ZXIvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDBiNzFhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci8uY3ZzaWdub3JlCkBAIC0wLDAgKzEsMiBAQAorYnVpbGQKK2Rpc3QKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvYnVpbGQueG1sIGIvY29udGFpbmVyL3Rlc3Rlci9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkMDAyMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvYnVpbGQueG1sCkBAIC0wLDAgKzEsMjI2IEBACis8cHJvamVjdCBuYW1lPSJUZXN0ZXIiIGRlZmF1bHQ9ImJ1aWxkLW1haW4iIGJhc2VkaXI9Ii4iPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSBQcm9wZXJ0eSBWYWx1ZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iLi4vYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9L2J1aWxkLnByb3BlcnRpZXMiLz4KKworICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiICB2YWx1ZT0ibW9kZXJuIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJhcGkuaG9tZSIgdmFsdWU9Ii4uLy4uL2pha2FydGEtc2VydmxldGFwaS01L2Rpc3QiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRlc3Rlci5idWlsZCIgICAgdmFsdWU9IiR7YmFzZWRpcn0vYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRlc3Rlci5kZXBsb3kiICAgdmFsdWU9IiR7YmFzZWRpcn0vLi4vYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRlc3Rlci5kaXN0IiAgICAgdmFsdWU9IiR7YmFzZWRpcn0vZGlzdCIvPgorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09IERlcml2ZWQgUHJvcGVydHkgVmFsdWVzID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJhbnQuamFyIiAgICAgICAgIHZhbHVlPSIke2FudC5ob21lfS9saWIvYW50LmphciIvPgorICA8cHJvcGVydHkgbmFtZT0ic2VydmxldC1hcGkuamFyIiB2YWx1ZT0iJHthcGkuaG9tZX0vanNyMTU0L2Rpc3QvbGliL3NlcnZsZXQtYXBpLmphciIvPgorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtcHJlcGFyZSI+CisgICAgPG1rZGlyIGRpcj0iJHt0ZXN0ZXIuYnVpbGR9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHt0ZXN0ZXIuYnVpbGR9L2JpbiIvPgorICAgIDxta2RpciBkaXI9IiR7dGVzdGVyLmJ1aWxkfS9jbGFzc2VzIi8+CisgICAgPG1rZGlyIGRpcj0iJHt0ZXN0ZXIuYnVpbGR9L2NvbmYiLz4KKyAgICA8bWtkaXIgZGlyPSIke3Rlc3Rlci5idWlsZH0vbGliIi8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDb3B5IFN0YXRpYyBGaWxlcyA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1zdGF0aWMiIGRlcGVuZHM9ImJ1aWxkLXByZXBhcmUiPgorCisgICAgPCEtLSBFeGVjdXRhYmxlIENvbW1hbmRzIC0tPgorICAgIDxta2RpciAgZGlyPSIke3Rlc3Rlci5idWlsZH0vYmluIi8+CisgICAgPGNvcHkgdG9kaXI9IiR7dGVzdGVyLmJ1aWxkfS9iaW4iPgorICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvYmluIiAvPgorICAgIDwvY29weT4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7dGVzdGVyLmJ1aWxkfS9iaW4iIGluY2x1ZGVzPSIqLnNoIiAgZW9sPSJsZiIvPgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHt0ZXN0ZXIuYnVpbGR9L2JpbiIgaW5jbHVkZXM9IiouYmF0IiBlb2w9ImNybGYiLz4KKyAgICA8Y2htb2QgcGVybT0iK3giIGZpbGU9IiR7dGVzdGVyLmJ1aWxkfS9iaW4vdGVzdGVyLnNoIi8+CisgICAgPGNvcHkgdG9kaXI9IiR7dGVzdGVyLmJ1aWxkfS9jb25mIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2NvbmYiIC8+CisgICAgPC9jb3B5PgorCisgICAgPCEtLSBDb21waWxlZCBDbGFzc2VzIC0tPgorICAgIDxta2RpciAgZGlyPSIke3Rlc3Rlci5idWlsZH0vY2xhc3NlcyIvPgorCisgICAgPCEtLSBXZWIgQXBwbGljYXRpb24gLS0+CisgICAgPG1rZGlyICBkaXI9IiR7dGVzdGVyLmJ1aWxkfS93ZWIiLz4KKyAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0ZXIuYnVpbGR9L3dlYiI+CisgICAgICA8ZmlsZXNldCBkaXI9IndlYiIvPgorICAgIDwvY29weT4KKyAgICA8bWtkaXIgIGRpcj0iJHt0ZXN0ZXIuYnVpbGR9L3dlYi9XRUItSU5GL2NsYXNzZXMiLz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT0gQlVJTEQ6IENvbXBpbGUgU2VydmVyIENvbXBvbmVudHMgPT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtbWFpbiIgZGVwZW5kcz0iYnVpbGQtc3RhdGljIj4KKworICAgIDwhLS0gQ29tcGlsZSB0ZXN0ZXIgY29tcG9uZW50cyBhbmQgdG9vbHMgLS0+CisgICAgPGphdmFjIHNyY2Rpcj0ic3JjL3Rlc3RlciIgZGVzdGRpcj0iJHt0ZXN0ZXIuYnVpbGR9L2NsYXNzZXMiCisgICAgIGNsYXNzcGF0aD0iJHthbnQuamFyfToke3NlcnZsZXQtYXBpLmphcn06JHt4ZXJjZXNJbXBsLmphcn0iCisgICAgIGRlcHJlY2F0aW9uPSIke2NvbXBpbGUuZGVwcmVjYXRpb259IgorICAgICBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIgb3B0aW1pemU9Im9mZiIKKyAgICAgZXhjbHVkZXM9IioqL0NWUy8qKiIvPgorCisgICAgPCEtLSBDb3B5IHN0YXRpYyByZXNvdXJjZSBmaWxlcyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0ZXIuYnVpbGR9L2NsYXNzZXMiPgorICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdGVyIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8ZmlsZXNldCBkaXI9InNyYy90ZXN0ZXIiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnR4dCIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY29weT4KKyAgICA8Y29weSBmaWxlPSIke3Rlc3Rlci5idWlsZH0vY2xhc3Nlcy9vcmcvYXBhY2hlL3Rlc3Rlci91bnNoYXJlZC9VbnNoYXJlZFNlc3Npb25CZWFuLmNsYXNzIgorICAgICAgICB0b2ZpbGU9IiR7dGVzdGVyLmJ1aWxkfS93ZWIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvdGVzdGVyL3Vuc2hhcmVkL1Vuc2hhcmVkU2Vzc2lvbkJlYW4uY2xhc3MiLz4KKyAgICA8Y29weSBmaWxlPSJzcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczAxLnR4dCIKKyAgICAgICAgdG9maWxlPSIke3Rlc3Rlci5idWlsZH0vd2ViL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3Rlc3Rlci9VbnBhY2tlZDAxLnR4dCIvPgorICAgIDxjb3B5IGZpbGU9InNyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDEudHh0IgorICAgICAgICB0b2ZpbGU9IiR7dGVzdGVyLmJ1aWxkfS9jbGFzc2VzL29yZy9hcGFjaGUvdGVzdGVyL3NoYXJlZC9TaGFyZWQwMS50eHQiLz4KKyAgICA8Y29weSBmaWxlPSJzcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczAxLnR4dCIKKyAgICAgICAgdG9maWxlPSIke3Rlc3Rlci5idWlsZH0vY2xhc3Nlcy9vcmcvYXBhY2hlL3Rlc3Rlci91bnBzaGFyZWQvVW5wU2hhcmVkMDEudHh0Ii8+CisgICAgPGNvcHkgZmlsZT0ic3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMy50eHQiCisgICAgICAgIHRvZmlsZT0iJHt0ZXN0ZXIuYnVpbGR9L3dlYi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS90ZXN0ZXIvVW5wYWNrZWQwMy50eHQiLz4KKyAgICA8Y29weSBmaWxlPSJzcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczAzLnR4dCIKKyAgICAgICAgdG9maWxlPSIke3Rlc3Rlci5idWlsZH0vY2xhc3Nlcy9vcmcvYXBhY2hlL3Rlc3Rlci9zaGFyZWQvU2hhcmVkMDMudHh0Ii8+CisgICAgPGNvcHkgZmlsZT0ic3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMy50eHQiCisgICAgICAgIHRvZmlsZT0iJHt0ZXN0ZXIuYnVpbGR9L2NsYXNzZXMvb3JnL2FwYWNoZS90ZXN0ZXIvdW5wc2hhcmVkL1VucFNoYXJlZDAzLnR4dCIvPgorICAgIDxjb3B5IGZpbGU9InNyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDUudHh0IgorICAgICAgICB0b2ZpbGU9IiR7dGVzdGVyLmJ1aWxkfS93ZWIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvdGVzdGVyL1VucGFja2VkMDUudHh0Ii8+CisKKyAgICA8IS0tIEluc3RhbGwgWGVyY2VzIC0tPgorICAgIDxjb3B5ICB0b2Rpcj0iJHt0ZXN0ZXIuYnVpbGR9L3dlYi9XRUItSU5GL2xpYiIgZmlsZT0iJHt4ZXJjZXNJbXBsLmphcn0iLz4KKyAgICA8Y29weSAgdG9kaXI9IiR7dGVzdGVyLmJ1aWxkfS93ZWIvV0VCLUlORi9saWIiIGZpbGU9IiR7eG1sLWFwaXMuamFyfSIvPgorCisgICAgPCEtLSBDcmVhdGUgYW5kIGluc3RhbGwgdGVzdGVyIGxpYnJhcnkgLS0+CisgICAgPG1rZGlyICAgZGlyPSIke3Rlc3Rlci5idWlsZH0vd2ViL1dFQi1JTkYvbGliIi8+CisgICAgPGphciBqYXJmaWxlPSIke3Rlc3Rlci5idWlsZH0vd2ViL1dFQi1JTkYvbGliL3Rlc3Rlci5qYXIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3Rlci5idWlsZH0vY2xhc3NlcyI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL3NoYXJlZC8qIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL3Vuc2hhcmVkLyoiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2phcj4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ3JlYXRlIFRlc3RlciBKYXZhZG9jcyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVwZW5kcz0iYnVpbGQtbWFpbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7dGVzdGVyLmJ1aWxkfS9qYXZhZG9jIi8+CisgICAgPG1rZGlyIGRpcj0iJHt0ZXN0ZXIuYnVpbGR9L2phdmFkb2MiLz4KKyAgICA8amF2YWRvYyBwYWNrYWdlbmFtZXM9Im9yZy5hcGFjaGUudGVzdGVyLioiCisgICAgIGNsYXNzcGF0aD0iJHthbnQuamFyfToke3Rlc3Rlci5idWlsZH0vY2xhc3NlcyIKKyAgICAgc291cmNlcGF0aD0ic3JjL3Rlc3RlciIKKyAgICAgZGVzdGRpcj0iJHt0ZXN0ZXIuYnVpbGR9L2phdmFkb2MiCisgICAgIGF1dGhvcj0idHJ1ZSIKKyAgICAgdmVyc2lvbj0idHJ1ZSIKKyAgICAgd2luZG93dGl0bGU9IlRlc3RlciBJbnRlcm5hbCBBUEkgRG9jdW1lbnRhdGlvbiIKKyAgICAgZG9jdGl0bGU9IlRlc3RlciBUb29scyBhbmQgVGVzdHMgQVBJIgorICAgICBib3R0b209IkNvcHlyaWdodCAmIzE2OTsgMjAwMC0yMDA0IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4iCisgICAgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHt0ZXN0ZXIuYnVpbGR9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBCVUlMRDogUmVidWlsZCBFdmVyeXRoaW5nID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGJ1aWxkLW1haW4iLz4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBERVBMT1k6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGVwbG95LXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7dGVzdGVyLmRlcGxveX0iLz4KKyAgICA8bWtkaXIgZGlyPSIke3Rlc3Rlci5kZXBsb3l9L2JpbiIvPgorICAgIDxta2RpciBkaXI9IiR7dGVzdGVyLmRlcGxveX0vY29uZiIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBERVBMT1k6IENvcHkgU3RhdGljIEZpbGVzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGVwbG95LXN0YXRpYyIgZGVwZW5kcz0iYnVpbGQtbWFpbixkZXBsb3ktcHJlcGFyZSI+CisKKyAgICA8IS0tIEV4ZWN1dGFibGUgQ29tbWFuZHMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7dGVzdGVyLmRlcGxveX0vYmluIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0ZXIuYnVpbGR9L2JpbiIgLz4KKyAgICA8L2NvcHk+CisgICAgPGZpeGNybGYgc3JjZGlyPSIke3Rlc3Rlci5kZXBsb3l9L2JpbiIgaW5jbHVkZXM9Iiouc2giICBlb2w9ImxmIi8+CisgICAgPGZpeGNybGYgc3JjZGlyPSIke3Rlc3Rlci5kZXBsb3l9L2JpbiIgaW5jbHVkZXM9IiouYmF0IiBlb2w9ImNybGYiLz4KKyAgICA8Y2htb2QgcGVybT0iK3giIGZpbGU9IiR7dGVzdGVyLmRlcGxveX0vYmluL3Rlc3Rlci5zaCIvPgorICAgIDxjb3B5IHRvZGlyPSIke3Rlc3Rlci5kZXBsb3l9L2NvbmYiIG92ZXJ3cml0ZT0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdGVyLmJ1aWxkfS9jb25mIiAvPgorICAgIDwvY29weT4KKworICAgIDwhLS0gVW5wYWNrZWQgU2hhcmVkIENsYXNzZXMgLS0+CisgICAgPG1rZGlyICAgZGlyPSIke3Rlc3Rlci5kZXBsb3l9L3NoYXJlZC9jbGFzc2VzIi8+CisgICAgPGNvcHkgIHRvZGlyPSIke3Rlc3Rlci5kZXBsb3l9L3NoYXJlZC9jbGFzc2VzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0ZXIuYnVpbGR9L2NsYXNzZXMiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi91bnBzaGFyZWQvKiIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY29weT4KKworICAgIDwhLS0gU2hhcmVkIExpYnJhcnkgLS0+CisgICAgPG1rZGlyICAgZGlyPSIke3Rlc3Rlci5kZXBsb3l9L3NoYXJlZC9saWIiLz4KKyAgICA8amFyIGphcmZpbGU9IiR7dGVzdGVyLmRlcGxveX0vc2hhcmVkL2xpYi90ZXN0ZXItc2hhcmVkLmphciI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdGVyLmJ1aWxkfS9jbGFzc2VzIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovc2hhcmVkLyoiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2phcj4KKworICAgIDwhLS0gV2ViIEFwcGxpY2F0aW9uIC0tPgorICAgIDxta2RpciAgZGlyPSIke3Rlc3Rlci5kZXBsb3l9L3dlYmFwcHMvdGVzdGVyIi8+CisgICAgPGNvcHkgdG9kaXI9IiR7dGVzdGVyLmRlcGxveX0vd2ViYXBwcy90ZXN0ZXIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3Rlci5idWlsZH0vd2ViIi8+CisgICAgPC9jb3B5PgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IERFUExPWTogQ3JlYXRlIFRlc3RlciBKQVIgPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkZXBsb3ktbWFpbiIgZGVwZW5kcz0iZGVwbG95LXN0YXRpYyIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IERFUExPWTogRGVwbG95IFRlc3RlciBCdWlsZCA9PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkZXBsb3kiIGRlcGVuZHM9ImRlcGxveS1tYWluIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gREVQTE9ZOiBDbGVhbiBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRlcGxveS1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7dGVzdGVyLmRlcGxveX0vd2ViYXBwcy90ZXN0ZXIiLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpc3RyaWJ1dGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImJ1aWxkLW1haW4iPgorCisgICAgPG1rZGlyIGRpcj0iJHt0ZXN0ZXIuZGlzdH0vYmluIi8+CisgICAgPGNvcHkgdG9kaXI9IiR7dGVzdGVyLmRpc3R9L2JpbiI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdGVyLmJ1aWxkfS9iaW4iIC8+CisgICAgPC9jb3B5PgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHt0ZXN0ZXIuZGlzdH0vYmluIiBpbmNsdWRlcz0iKi5zaCIgIGVvbD0ibGYiLz4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7dGVzdGVyLmRpc3R9L2JpbiIgaW5jbHVkZXM9IiouYmF0IiBlb2w9ImNybGYiLz4KKyAgICA8Y2htb2QgcGVybT0iK3giIGZpbGU9IiR7dGVzdGVyLmRpc3R9L2Jpbi90ZXN0ZXIuc2giLz4KKworICAgIDxta2RpciAgIGRpcj0iJHt0ZXN0ZXIuZGlzdH0vd2ViYXBwcyIvPgorICAgIDxqYXIgamFyZmlsZT0iJHt0ZXN0ZXIuZGlzdH0vd2ViYXBwcy90ZXN0ZXIud2FyIgorICAgICAgICAgYmFzZWRpcj0iJHt0ZXN0ZXIuYnVpbGR9L3dlYiIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0LWNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHt0ZXN0ZXIuZGlzdH0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gQ29udmVuaWVudCBTeW5vbnltcyA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJidWlsZC1jbGVhbiwgZGlzdC1jbGVhbiIvPgorCisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL2Jpbi90ZXN0ZXIueG1sIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvYmluL3Rlc3Rlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk5NDk1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL2Jpbi90ZXN0ZXIueG1sCkBAIC0wLDAgKzEsMTkzOSBAQAorPHByb2plY3QgbmFtZT0iVGVzdGVyIiBkZWZhdWx0PSJhbGwiPgorCisgIDwhLS0gPT09PT09PT09PSBHbG9iYWwgUHJvcGVydGllcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5ob21lIiAgdmFsdWU9Ii4uLy4uL2J1aWxkL3RvbWNhdC00LjAiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImRlYnVnIiAgICAgICAgICB2YWx1ZT0iMCIvPgorICA8cHJvcGVydHkgbmFtZT0iaG9zdCIgICAgICAgICAgIHZhbHVlPSJsb2NhbGhvc3QiLz4KKyAgPHByb3BlcnR5IG5hbWU9InBvcnQiICAgICAgICAgICB2YWx1ZT0iODA4MCIvPgorPCEtLSAgPHByb3BlcnR5IG5hbWU9InByb3RvY29sIiAgICAgICB2YWx1ZT0iSFRUUC8xLjAiLz4gLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJwcm90b2NvbCIgICAgICAgdmFsdWU9IkhUVFAvMS4wIi8+IDwhLS0gVXNlIEh0dHBVUkxDb25uZWN0aW9uIC0tPgorICA8cHJvcGVydHkgbmFtZT0iY29udGV4dC5wYXRoIiAgIHZhbHVlPSIvdGVzdGVyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqc3AtZXhhbXBsZXMucGF0aCIgIHZhbHVlPSIvanNwLWV4YW1wbGVzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2bGV0cy1leGFtcGxlcy5wYXRoIiAgdmFsdWU9Ii9zZXJ2bGV0cy1leGFtcGxlcyIvPgorICA8cHJvcGVydHkgbmFtZT0iZ29sZGVuLnBhdGgiICAgIHZhbHVlPSIke2NvbnRleHQucGF0aH0vZ29sZGVuIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJtYW5hZ2VyLnBhdGgiICAgdmFsdWU9Ii9tYW5hZ2VyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJyZWxvYWQucGF0aCIgICAgdmFsdWU9Ii90ZXN0ZXIiLz4KKyAgPHRhc2tkZWYgIG5hbWU9InRlc3RlciIgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50ZXN0ZXIuVGVzdENsaWVudCI+CisgICAgPGNsYXNzcGF0aD4KKyAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjYXRhbGluYS5ob21lfS93ZWJhcHBzL3Rlc3Rlci9XRUItSU5GL2xpYi90ZXN0ZXIuamFyIi8+CisgICAgPC9jbGFzc3BhdGg+CisgIDwvdGFza2RlZj4KKworCisgIDx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJST09ULEF1dGhlbnRpY2F0aW9uLENhc2VTZW5zaXRpdmUsRGVjb2RpbmcsRXJyb3JQYWdlLEZpbHRlclJlcXVlc3QsRmlsdGVyUmVzcG9uc2UsSm5kaSxKc3AsTGlmZWN5Y2xlLFJlcXVlc3REaXNwYXRjaGVyLFJlc291cmNlcyxTZWN1cml0eSxTZXJ2bGV0Q29udGV4dCxTZXJ2bGV0UmVxdWVzdCxTZXJ2bGV0UmVzcG9uc2UsSHR0cFNlc3Npb24sWGVyY2VzVGVzdCIvPgorCisgIDx0YXJnZXQgbmFtZT0iUk9PVCI+CisKKyAgICA8IS0tID09PT09PT09PT0gQmFzaWMgUnVuIFN0YXRlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gU2hvdWxkIGJlIGFibGUgdG8gc2VlIHRoZSBob21lIHBhZ2UgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIvaW5kZXguanNwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiLz4KKworICAgIDwhLS0gU2hvdWxkIGJlIGFibGUgdG8gdXNlIHJlbGF0aXZlIHBhdGggdG8gZG9jdW1lbnQgcm9vdCAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7anNwLWV4YW1wbGVzLnBhdGh9Ly4uIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiLz4KKworICAgIDwhLS0gU2hvdWxkIGJlIGFibGUgdG8gc3VjY2Vzc2Z1bGx5IHJldHJpZXZlIGEgZ29sZGVuIGZpbGUgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vR29sZGVuMDEiCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9Hb2xkZW4wMS50eHQiLz4KKworICAgIDwhLS0gU2hvdWxkIGJlIGFibGUgdG8gc3VjY2Vzc2Z1bGx5IHJldHJpZXZlIGEgZ29sZGVuIGZpbGUgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEdvbGRlbjAxIgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vR29sZGVuMDEudHh0Ii8+CisKKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9IkF1dGhlbnRpY2F0aW9uIj4KKworICAgIDwhLS0gPT09PT09PT09PSBBdXRoZW50aWNhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPCEtLSBPbmNlIGEgdXNlciBoYXMgYmVlbiBhdXRoZW50aWNhdGVkLCB0aGUgY29ycmVzcG9uZGluZyB1c2VyIGlkZW50aXR5CisgICAgICAgICBzaG91bGQgYmUgdmlzaWJsZSB0byBhbGwgb3RoZXIgcmVxdWVzdHMgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24sIGV2ZW4KKyAgICAgICAgIGZvciBVUklzIHRoYXQgYXJlIG5vdCBwcm90ZWN0ZWQgYnkgc2VjdXJpdHkgY29uc3RyYWludHMuICBUaGlzIGlzCisgICAgICAgICB0ZXN0ZWQgYnkgaW52b2tpbmcgYSBwcm90ZWN0ZWQgVVJJIGZvbGxvd2VkIGJ5IGEgbm9uLXByb3RlY3RlZCBVUkkKKyAgICAtLT4KKworICAgIDwhLS0gPT09PT09PT09PSBCYXNpYyBBY2Nlc3MgdG8gQXV0aGVudGljYXRlZCBSZXNvdXJjZXMgPT09PT09PT09PT09PT09IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L3Byb3RlY3RlZC9BdXRoZW50aWNhdGlvbjAxIgorICAgICAgIGluSGVhZGVycz0iQXV0aG9yaXphdGlvbjpCYXNpYyBkRzl0WTJGME9uUnZiV05oZEE9PSIKKyAgICAgIG91dENvbnRlbnQ9IkF1dGhlbnRpY2F0aW9uMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vcHJvdGVjdGVkL0F1dGhlbnRpY2F0aW9uMDIiCisgICAgICAgaW5IZWFkZXJzPSJBdXRob3JpemF0aW9uOkJhc2ljIGRHOXRZMkYwT25SdmJXTmhkQT09IgorICAgICAgb3V0Q29udGVudD0iQXV0aGVudGljYXRpb24wMiBQQVNTRUQiLz4KKworICAgIDwhLS0gVGVzdCBpc1VzZXJJblJvbGUoKSBvbiBhY3R1YWwgcm9sZSBhbmQgb24gYW4gYWxpYXMgKHNlcnZsZXQpIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9wcm90ZWN0ZWQvQXV0aGVudGljYXRpb24wMyIKKyAgICAgICBpbkhlYWRlcnM9IkF1dGhvcml6YXRpb246QmFzaWMgZEc5dFkyRjBPblJ2YldOaGRBPT0iCisgICAgICBvdXRDb250ZW50PSJBdXRoZW50aWNhdGlvbjAzIFBBU1NFRCIvPgorCisgICAgPCEtLSBUZXN0IGlzVXNlckluUm9sZSgpIG9uIGFjdHVhbCByb2xlIGFuZCBvbiBhbiBhbGlhcyAoSlNQIHBhZ2UpIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9wcm90ZWN0ZWQvQXV0aGVudGljYXRpb24wNCIKKyAgICAgICBpbkhlYWRlcnM9IkF1dGhvcml6YXRpb246QmFzaWMgZEc5dFkyRjBPblJ2YldOaGRBPT0iCisgICAgICBvdXRDb250ZW50PSJBdXRoZW50aWNhdGlvbjA0IFBBU1NFRCIvPgorCisgICAgPCEtLSA9PT09PT09PT09ICJBbGwgQWxsb3dlZCIgYW5kICJBbGwgRGlzYWxsb3dlZCIgQWNjZXNzID09PT09PT09PT09PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vYWxsb3dlZC9BdXRoZW50aWNhdGlvbjA1IgorICAgICAgIGluSGVhZGVycz0iQXV0aG9yaXphdGlvbjpCYXNpYyBkRzl0WTJGME9uUnZiV05oZEE9PSIKKyAgICAgIG91dENvbnRlbnQ9IkF1dGhlbnRpY2F0aW9uMDUgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vZGlzYWxsb3dlZC9BdXRoZW50aWNhdGlvbjA1IgorICAgICAgIGluSGVhZGVycz0iQXV0aG9yaXphdGlvbjpCYXNpYyBkRzl0WTJGME9uUnZiV05oZEE9PSIKKyAgICAgICAgICBzdGF0dXM9IjQwMyIvPgorCisgICAgPCEtLSA9PT09PT09PT09IENvbWJpbmluZyBDb25zdHJhaW50IEFjY2VzcyA9PT09PT09PT09PT09IC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9kaXNhbGxvd2VkL3ByaXZhdGUvQXV0aGVudGljYXRpb24wNSIKKyAgICAgICBpbkhlYWRlcnM9IkF1dGhvcml6YXRpb246QmFzaWMgZEc5dFkyRjBPblJ2YldOaGRBPT0iCisgICAgICAgICAgc3RhdHVzPSI0MDMiLz4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vYWxsb3dlZC9wdWJsaWMvQXV0aGVudGljYXRpb24wNiIKKyAgICAgIG91dENvbnRlbnQ9IkF1dGhlbnRpY2F0aW9uMDYgUEFTU0VEIi8+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L2FsbG93ZWQvcHJpdmF0ZS9BdXRoZW50aWNhdGlvbjA1IgorICAgICAgIGluSGVhZGVycz0iQXV0aG9yaXphdGlvbjpCYXNpYyBkRzl0WTJGME9uUnZiV05oZEE9PSIKKyAgICAgICAgICBzdGF0dXM9IjQwMyIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJDYXNlU2Vuc2l0aXZlIj4KKworICAgIDwhLS0gPT09PT09PT09PSBDYXNlIFNlbnNpdGl2ZSBSZXF1ZXN0IFVSSSBNYXRjaGluZyA9PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPCEtLSBNYWtlIHN1cmUgdGhhdCBzdGF0aWMgcmVzb3VyY2VzIGFyZSBtYXRjaGVkIGNhc2Ugc2Vuc2l0aXZlbHkgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIvaW5kZXguSFRNTCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iNDA0Ii8+CisKKyAgICA8IS0tIFNob3VsZCBiZSBhYmxlIHRvIGV4ZWN1dGUgdGhlIERhdGUgZXhhbXBsZSAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7anNwLWV4YW1wbGVzLnBhdGh9L2RhdGVzL2RhdGUuanNwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiLz4KKworICAgIDwhLS0gU2hvdWxkIG5vdCBiZSBhYmxlIHRvIHZpZXcgdGhlIHNvdXJjZSBvZiB0aGUgRGF0ZSBleGFtcGxlIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtqc3AtZXhhbXBsZXMucGF0aH0vZGF0ZXMvZGF0ZS5Kc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjQwNCIvPgorCisgICAgPCEtLSBTaG91bGQgbm90IGJlIGFibGUgdG8gdmlldyB0aGUgc291cmNlIG9mIHRoZSBEYXRlIGV4YW1wbGUgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2pzcC1leGFtcGxlcy5wYXRofS9kYXRlcy9EYXRlLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iNDA0Ii8+CisKKyAgICA8IS0tIFNob3VsZCBub3QgYmUgYWJsZSB0byB2aWV3IHRoZSBzb3VyY2Ugb2YgdGhlIERhdGUgZXhhbXBsZSAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7anNwLWV4YW1wbGVzLnBhdGh9L0RhdGVzL2RhdGUuanNwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI0MDQiLz4KKworICAgIDwhLS0gU2hvdWxkIGJlIGFibGUgdG8gZXhlY3V0ZSB0aGUgSGVsbG9Xb3JsZCBzZXJ2bGV0IGV4YW1wbGUgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke3NlcnZsZXRzLWV4YW1wbGVzLnBhdGh9L3NlcnZsZXQvSGVsbG9Xb3JsZEV4YW1wbGUiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjIwMCIvPgorCisgICAgPCEtLSBTaG91bGQgbm90IGJlIGFibGUgdG8gZXhlY3V0ZSBIZWxsb1dvcmxkIHdpdGggZGlmZmVyZW50IGNhc2VzIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtzZXJ2bGV0cy1leGFtcGxlcy5wYXRofS9zZXJ2bGV0L2hlbGxvV29ybGRFeGFtcGxlIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI0MDQiLz4KKworICAgIDwhLS0gU2hvdWxkIG5vdCBiZSBhYmxlIHRvIGV4ZWN1dGUgSGVsbG9Xb3JsZCB3aXRoIGRpZmZlcmVudCBjYXNlcyAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7c2VydmxldHMtZXhhbXBsZXMucGF0aH0vU2VydmxldC9IZWxsb1dvcmxkRXhhbXBsZSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iNDA0Ii8+CisKKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9IkRlY29kaW5nIj4KKworICAgIDwhLS0gPT09PT09PT09PSBVUkwgRGVjb2RpbmcgVGVzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRGVjb2RpbmcwMT9zZXJ2bGV0PS9EZWNvZGluZzAxIgorICAgICAgb3V0Q29udGVudD0iRGVjb2RpbmcwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0RlY29kaW5nMDEvZXh0cmE/c2VydmxldD0vRGVjb2RpbmcwMSZhbXA7cGF0aD0vZXh0cmEiCisgICAgICBvdXRDb250ZW50PSJEZWNvZGluZzAxIFBBU1NFRCIvPgorIAorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0RlY29kaW5nMCUzMT9zZXJ2bGV0PS9EZWNvZGluZzAxIgorICAgICAgb3V0Q29udGVudD0iRGVjb2RpbmcwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0RlY29kaW5nMDEvZXh0ciU2MT9zZXJ2bGV0PS9EZWNvZGluZzAxJmFtcDtwYXRoPS9leHRyYSIKKyAgICAgIG91dENvbnRlbnQ9IkRlY29kaW5nMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9EZWNvZGluZzAlMzEvZXh0ciU2MT9zZXJ2bGV0PS9EZWNvZGluZzAxJmFtcDtwYXRoPS9leHRyYSIKKyAgICAgIG91dENvbnRlbnQ9IkRlY29kaW5nMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRGVjb2RpbmcwMT9zZXJ2bGV0PS9XcmFwcGVkRGVjb2RpbmcwMSIKKyAgICAgIG91dENvbnRlbnQ9IkRlY29kaW5nMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRGVjb2RpbmcwMS9leHRyYT9zZXJ2bGV0PS9XcmFwcGVkRGVjb2RpbmcwMSZhbXA7cGF0aD0vZXh0cmEiCisgICAgICBvdXRDb250ZW50PSJEZWNvZGluZzAxIFBBU1NFRCIvPgorIAorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWREZWNvZGluZzAlMzE/c2VydmxldD0vV3JhcHBlZERlY29kaW5nMDEiCisgICAgICBvdXRDb250ZW50PSJEZWNvZGluZzAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZERlY29kaW5nMDEvZXh0ciU2MT9zZXJ2bGV0PS9XcmFwcGVkRGVjb2RpbmcwMSZhbXA7cGF0aD0vZXh0cmEiCisgICAgICBvdXRDb250ZW50PSJEZWNvZGluZzAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZERlY29kaW5nMCUzMS9leHRyJTYxP3NlcnZsZXQ9L1dyYXBwZWREZWNvZGluZzAxJmFtcDtwYXRoPS9leHRyYSIKKyAgICAgIG91dENvbnRlbnQ9IkRlY29kaW5nMDEgUEFTU0VEIi8+CisKKyAgICA8IS0tIFZlcmlmeSB3ZSBjYW4gYWNjZXNzIHRoZSBKU1AgcGFnZSBub3JtYWxseSAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7anNwLWV4YW1wbGVzLnBhdGh9L3NucC9zbm9vcC5qc3AiCisgICAgICAgICAgc3RhdHVzPSIyMDAiLz4KKworICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0iRXJyb3JQYWdlIj4KKworICAgIDwhLS0gPT09PT09PT09PSBFcnJvciBDb2RlIE1hcHBpbmcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRXJyb3JQYWdlMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IkVycm9yUGFnZTAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEVycm9yUGFnZTAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UwMiBQQVNTRUQiLz4KKworCisgICAgPCEtLSA9PT09PT09PT09IEV4Y2VwdGlvbiBNYXBwaW5nIChTZXJ2bGV0IFNvdXJjZSkgPT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9FcnJvclBhZ2UwMyIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iMjAwIgorICAgICAgb3V0Q29udGVudD0iRXJyb3JQYWdlMDQgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRXJyb3JQYWdlMDMiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjIwMCIKKyAgICAgIG91dENvbnRlbnQ9IkVycm9yUGFnZTA0IFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRXJyb3JQYWdlMDU/dHlwZT1Bcml0aG1ldGljIgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UwNiBQQVNTRUQgLSBTRVJWTEVUIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRXJyb3JQYWdlMDU/dHlwZT1Bcml0aG1ldGljIgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UwNiBQQVNTRUQgLSBTRVJWTEVUIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9FcnJvclBhZ2UwNT90eXBlPUFycmF5IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI1MDAiCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UwNiBQQVNTRUQgLSBKU1AiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRFcnJvclBhZ2UwNT90eXBlPUFycmF5IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI1MDAiCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UwNiBQQVNTRUQgLSBKU1AiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0Vycm9yUGFnZTA1P3R5cGU9TnVtYmVyIgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI1MDAiCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UwNiBQQVNTRUQgLSBIVE1MIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRXJyb3JQYWdlMDU/dHlwZT1OdW1iZXIiCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjUwMCIKKyAgICAgIG91dENvbnRlbnQ9IkVycm9yUGFnZTA2IFBBU1NFRCAtIEhUTUwiLz4KKworICAgIDwhLS0gPT09PT09PT09PSBMb2FkIE9uIFN0YXJ0dXAgRXhjZXB0aW9uIEhhbmRsaW5nID09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPCEtLSBOT1RFOiBIdHRwVVJMQ29ubmVjdGlvbiB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIG9uIDUwM3MgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRXJyb3JQYWdlMDciCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjQwNCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEVycm9yUGFnZTA3IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI0MDQiLz4KKworICAgIDwhLS0gPT09PT09PT09PSBFeGNlcHRpb24gTWFwcGluZyAoSlNQIFNvdXJjZSkgPT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRXJyb3JQYWdlMDg/dHlwZT1Bcml0aG1ldGljIgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UwNiBQQVNTRUQgLSBTRVJWTEVUIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRXJyb3JQYWdlMDg/dHlwZT1Bcml0aG1ldGljIgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UwNiBQQVNTRUQgLSBTRVJWTEVUIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9FcnJvclBhZ2UwOD90eXBlPUFycmF5IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI1MDAiCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UwNiBQQVNTRUQgLSBKU1AiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRFcnJvclBhZ2UwOD90eXBlPUFycmF5IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI1MDAiCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UwNiBQQVNTRUQgLSBKU1AiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0Vycm9yUGFnZTA4P3R5cGU9TnVtYmVyIgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI1MDAiCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UwNiBQQVNTRUQgLSBIVE1MIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRXJyb3JQYWdlMDg/dHlwZT1OdW1iZXIiCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjUwMCIKKyAgICAgIG91dENvbnRlbnQ9IkVycm9yUGFnZTA2IFBBU1NFRCAtIEhUTUwiLz4KKworICAgIDwhLS0gPT09PT09PT09PSBFeGNlcHRpb24gTWFwcGluZyAoSlNQIEVycm9yIFBhZ2UpID09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRXJyb3JQYWdlMDkiCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjUwMCIKKyAgICAgIG91dENvbnRlbnQ9IkVycm9yUGFnZTEwIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEVycm9yUGFnZTA5IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI1MDAiCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UxMCBQQVNTRUQiLz4KKworICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0iRmlsdGVyUmVxdWVzdCI+CisKKyAgICA8IS0tID09PT09PT09PT0gQXBwbHkgVXBwZXIgQ2FzZSBGaWx0ZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gSW5wdXQgdmlhIGJ1ZmZlcmVkIHJlYWRlciAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9GaWx0ZXJSZXF1ZXN0MDE/dHlwZT1yZWFkZXIiCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjIwMCIKKyAgICAgICBpbkNvbnRlbnQ9IkZpbHRlclJlcXVlc3QwMSBVbndyYXBwZWQgUmVhZGVyIFBBU1NFRCIKKyAgICAgIG91dENvbnRlbnQ9IkZJTFRFUlJFUVVFU1QwMSBVTldSQVBQRUQgUkVBREVSIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZpbHRlclJlcXVlc3QwMT90eXBlPXJlYWRlciIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iMjAwIgorICAgICAgIGluQ29udGVudD0iRmlsdGVyUmVxdWVzdDAxIFdyYXBwZWQgUmVhZGVyIFBBU1NFRCIKKyAgICAgIG91dENvbnRlbnQ9IkZJTFRFUlJFUVVFU1QwMSBXUkFQUEVEIFJFQURFUiBQQVNTRUQiLz4KKworICAgIDwhLS0gSW5wdXQgdmlhIHNlcnZsZXQgaW5wdXQgc3RyZWFtIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0ZpbHRlclJlcXVlc3QwMT90eXBlPXJlYWRlciIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iMjAwIgorICAgICAgIGluQ29udGVudD0iRmlsdGVyUmVxdWVzdDAxIFVud3JhcHBlZCBTdHJlYW0gUEFTU0VEIgorICAgICAgb3V0Q29udGVudD0iRklMVEVSUkVRVUVTVDAxIFVOV1JBUFBFRCBTVFJFQU0gUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRmlsdGVyUmVxdWVzdDAxP3R5cGU9cmVhZGVyIgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiCisgICAgICAgaW5Db250ZW50PSJGaWx0ZXJSZXF1ZXN0MDEgV3JhcHBlZCBTdHJlYW0gUEFTU0VEIgorICAgICAgb3V0Q29udGVudD0iRklMVEVSUkVRVUVTVDAxIFdSQVBQRUQgU1RSRUFNIFBBU1NFRCIvPgorCisgICAgPCEtLSA9PT09PT09PT09IFNlcnZsZXQgU2VlcyBBcHBsaWNhdGlvbiBXcmFwcGVyID09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRmlsdGVyUmVxdWVzdDAyP3dyYXA9ZmFsc2UiCisgICAgICBvdXRDb250ZW50PSJGaWx0ZXJSZXF1ZXN0MDIgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRGaWx0ZXJSZXF1ZXN0MDI/d3JhcD10cnVlIgorICAgICAgb3V0Q29udGVudD0iRmlsdGVyUmVxdWVzdDAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9GaWx0ZXJSZXF1ZXN0MDI/d3JhcD1mYWxzZSZhbXA7ZGlzcGF0Y2g9RiIKKyAgICAgIG91dENvbnRlbnQ9IkZpbHRlclJlcXVlc3QwMiBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZpbHRlclJlcXVlc3QwMj93cmFwPXRydWUmYW1wO2Rpc3BhdGNoPUYiCisgICAgICBvdXRDb250ZW50PSJGaWx0ZXJSZXF1ZXN0MDIgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0ZpbHRlclJlcXVlc3QwMj93cmFwPWZhbHNlJmFtcDtkaXNwYXRjaD1JIgorICAgICAgb3V0Q29udGVudD0iRmlsdGVyUmVxdWVzdDAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRmlsdGVyUmVxdWVzdDAyP3dyYXA9dHJ1ZSZhbXA7ZGlzcGF0Y2g9SSIKKyAgICAgIG91dENvbnRlbnQ9IkZpbHRlclJlcXVlc3QwMiBQQVNTRUQiLz4KKworICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0iRmlsdGVyUmVzcG9uc2UiPgorCisgICAgPCEtLSA9PT09PT09PT09IEFwcGx5IFVwcGVyIENhc2UgRmlsdGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8IS0tIE91dHB1dCBmcm9tIGEgc2VydmxldCAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9GaWx0ZXJSZXNwb25zZTAxIgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiCisgICAgICBvdXRDb250ZW50PSJGSUxURVJSRVNQT05TRTAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZpbHRlclJlc3BvbnNlMDEiCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjIwMCIKKyAgICAgIG91dENvbnRlbnQ9IkZJTFRFUlJFU1BPTlNFMDEgUEFTU0VEIi8+CisKKyAgICA8IS0tIE91dHB1dCBmcm9tIGEgSlNQIFBhZ2UgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRmlsdGVyUmVzcG9uc2UwMi5qc3AiCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjIwMCIKKyAgICAgIG91dENvbnRlbnQ9IkZJTFRFUlJFU1BPTlNFMDIgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwMi5qc3AiCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjIwMCIKKyAgICAgIG91dENvbnRlbnQ9IkZJTFRFUlJFU1BPTlNFMDIgUEFTU0VEIi8+CisKKyAgICA8IS0tIE91dHB1dCBmcm9tIGEgc3RhdGljIHBhZ2UgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRmlsdGVyUmVzcG9uc2UwMy50eHQiCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjIwMCIKKyAgICAgIG91dENvbnRlbnQ9IkZJTFRFUlJFU1BPTlNFMDMgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwMy50eHQiCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjIwMCIKKyAgICAgIG91dENvbnRlbnQ9IkZJTFRFUlJFU1BPTlNFMDMgUEFTU0VEIi8+CisKKyAgICA8IS0tID09PT09PT09PT0gU2VydmxldCBTZWVzIEFwcGxpY2F0aW9uIFdyYXBwZXIgPT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRmlsdGVyUmVzcG9uc2UwND93cmFwPWZhbHNlIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJGaWx0ZXJSZXNwb25zZTA0IFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwND93cmFwPXRydWUiCisgICAgICBvdXRDb250ZW50PSJGaWx0ZXJSZXNwb25zZTA0IFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9GaWx0ZXJSZXNwb25zZTA0P3dyYXA9ZmFsc2UmYW1wO2Rpc3BhdGNoPUYiCisgICAgICBvdXRDb250ZW50PSJGaWx0ZXJSZXNwb25zZTA0IFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwND93cmFwPXRydWUmYW1wO2Rpc3BhdGNoPUYiCisgICAgICBvdXRDb250ZW50PSJGaWx0ZXJSZXNwb25zZTA0IFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9GaWx0ZXJSZXNwb25zZTA0P3dyYXA9ZmFsc2UmYW1wO2Rpc3BhdGNoPUkiCisgICAgICBvdXRDb250ZW50PSJGaWx0ZXJSZXNwb25zZTA0IFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwND93cmFwPXRydWUmYW1wO2Rpc3BhdGNoPUkiCisgICAgICBvdXRDb250ZW50PSJGaWx0ZXJSZXNwb25zZTA0IFBBU1NFRCIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJJbnRlcm5hbHMiPgorCisKKyAgICA8IS0tID09PT09PT09PT0gQWNjZXNzIEludGVybmFscyBWaWEgUmVmbGVjdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1JlZmxlY3Rpb24wMSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iUmVmbGVjdGlvbjAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZFJlZmxlY3Rpb24wMSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iUmVmbGVjdGlvbjAxIFBBU1NFRCIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJKbmRpIj4KKworICAgIDwhLS0gPT09PT09PT09PSBKTkRJIE5hbWluZyBDb250ZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPCEtLSBQZXJmb3JtIHRoZSB0ZXN0cyBiZWZvcmUgcmVzdGFydGluZyB0aGUgYXBwbGljYXRpb24gLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSm5kaTAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJKbmRpMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSm5kaTAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJKbmRpMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9KbmRpMDIiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IkpuZGkwMiBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRKbmRpMDIiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IkpuZGkwMiBQQVNTRUQiLz4KKworICAgIDwhLS0gUmVzdGFydCB0aGlzIHdlYiBhcHBsaWNhdGlvbiAtLT4KKyAgICA8IS0tIE5PVEU6IEFzc2lnbiByb2xlICJtYW5hZ2VyIiB0byB1c2VyICJ0b21jYXQiIGZvciB0aGlzIHRvIHdvcmsgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICBpbkhlYWRlcnM9IkF1dGhvcml6YXRpb246QmFzaWMgZEc5dFkyRjBPblJ2YldOaGRBPT0iCisgICAgICAgICByZXF1ZXN0PSIke21hbmFnZXIucGF0aH0vcmVsb2FkP3BhdGg9JHtyZWxvYWQucGF0aH0iCisgICAgICBvdXRDb250ZW50PSJPSyAtICIvPgorCisgICAgPCEtLSBSZXBlYXQgdGhlIHRlc3RzIHRvIGVuc3VyZSB0aGUgbmFtaW5nIGNvbnRleHQgaXMgcmVpbml0aWFsaXplZCAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9KbmRpMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IkpuZGkwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRKbmRpMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IkpuZGkwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0puZGkwMiIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iSm5kaTAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEpuZGkwMiIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iSm5kaTAyIFBBU1NFRCIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJKc3AiPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gSlNQIEFjY2VzcyBUbyBCZWFuIENsYXNzZXMgLS0tLS0iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0pzcEJlYW5zMDEuanNwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJKc3BCZWFuczAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSnNwQmVhbnMwMi5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IkpzcEJlYW5zMDIgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Kc3BCZWFuczAzLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iSnNwQmVhbnMwMyBQQVNTRUQiLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLS0tIGpzcDpwYXJhbXMgbm90IGxlZ2FsIGluIGpzcDppbmNsdWRlL2ZvcndhcmQgLS0tLS0iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0pzcFBhcmFtczAxLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iNTAwIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Kc3BQYXJhbXMwMi5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjUwMCIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gQ2hhcmFjdGVyIEVuY29kaW5nIGFuZCBFc2NhcGluZyBUZXN0cyAtLS0tLSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRW5jb2RpbmcwMS5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L0VuY29kaW5nMDEudHh0Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9FbmNvZGluZzAyLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vRW5jb2RpbmcwMi50eHQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0VuY29kaW5nMDMuanNwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9FbmNvZGluZzAzLnR4dCIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gUHJvcGVydHlFZGl0b3IgU3VwcG9ydCAtLS0tLSIvPgorCis8IS0tIENhbm5vdCB0ZXN0IFByb3BlcnR5RWRpdG9yIHN1cHBvcnQgdW5kZXIgc2VjdXJpdHkgbWFuYWdlcgorICAgICB1bmxlc3MgY2F0YWxpbmEucG9saWN5IGdyYW50cyByZWFkL3dyaXRlIGFjY2VzcyB0bworICAgICBzeXN0ZW0gcHJvcGVydGllcyAtLT4KKzwhLS0KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Qcm9wZXJ0eTAxLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vUHJvcGVydHkwMS50eHQiLz4KKy0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUHJvcGVydHkwMi5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjUwMCIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gSlNQIERvY3VtZW50IFBhcnNpbmcgLS0tLS0iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0pzcERvYzAxLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vSnNwRG9jMDEudHh0Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Kc3BEb2MwMi5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L0pzcERvYzAyLnR4dCIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0ganNwOmZvcndhcmQgLS0tLS0iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0pzcEZvcndhcmQwMS5qc3A/cGF0aD0vSnNwRm9yd2FyZDAxYS5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IkpzcEZvcndhcmQwMWEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Kc3BGb3J3YXJkMDEuanNwP3BhdGg9L0ZvcndhcmQwMGEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMGEgUEFTU0VEIi8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0tLSBqc3A6aW5jbHVkZSBmbHVzaD10cnVlIC0tLS0tIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Kc3BJbmNsdWRlMDEuanNwP3BhdGg9L0pzcEluY2x1ZGUwMWEuanNwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9Kc3BJbmNsdWRlMDEudHh0Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Kc3BJbmNsdWRlMDEuanNwP3BhdGg9L0luY2x1ZGUwMGEiCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L0pzcEluY2x1ZGUwMWEudHh0Ii8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0tLSBqc3A6aW5jbHVkZSBmbHVzaD1mYWxzZSAtLS0tLSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSnNwSW5jbHVkZTAyLmpzcD9wYXRoPS9Kc3BJbmNsdWRlMDJhLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vSnNwSW5jbHVkZTAyLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSnNwSW5jbHVkZTAyLmpzcD9wYXRoPS9JbmNsdWRlMDBhIgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9Kc3BJbmNsdWRlMDJhLnR4dCIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJMaWZlY3ljbGUiPgorCisgICAgPCEtLSA9PT09PT09PT09IExpZmVjeWNsZSBNYW5hZ2VtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9MaWZlY3ljbGUwMSIKKyAgICAgIG91dENvbnRlbnQ9IkxpZmVjeWNsZTAxIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkTGlmZWN5Y2xlMDEiCisgICAgICBvdXRDb250ZW50PSJMaWZlY3ljbGUwMSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vTGlmZWN5Y2xlMDIiIG1ldGhvZD0iUE9TVCIKKyAgICAgIG91dENvbnRlbnQ9IkxpZmVjeWNsZTAyIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkTGlmZWN5Y2xlMDIiIG1ldGhvZD0iUE9TVCIKKyAgICAgIG91dENvbnRlbnQ9IkxpZmVjeWNsZTAyIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9MaWZlY3ljbGUwMz9zdGVwPTEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjQwNCIvPgorCis8IS0tIE5PVEUgLSBjYW5ub3QgZG8gdGhpcyBhcyBvcmlnaW5hbGx5IGludGVuZGVkLCBiZWNhdXNlIHRoZQorICAgICBzZXJ2bGV0IHdhcyBtYXJrZWQgYXMgcGVybWFuZW50bHkgdW5hdmFpbGFibGUsIHNvIGp1c3QKKyAgICAgY2hlY2sgZm9yIGFub3RoZXIgNTAzIGluc3RlYWQhCisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9MaWZlY3ljbGUwMz9zdGVwPTIiCisgICAgICBvdXRDb250ZW50PSJMaWZlY3ljbGUwMyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9MaWZlY3ljbGUwMz9zdGVwPTIiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjQwNCIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJSZXF1ZXN0RGlzcGF0Y2hlciI+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0tLSBCYXNpYyBGb3J3YXJkIEZ1bmN0aW9uYWxpdHkgLS0tLS0iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0ZvcndhcmQwMD9wYXRoPS9Gb3J3YXJkMDBhIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAwYSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZvcndhcmQwMD9wYXRoPS9Gb3J3YXJkMDBhIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAwYSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDAwP3BhdGg9L0ZvcndhcmQwMGIiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBiIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRm9yd2FyZDAwP3BhdGg9L0ZvcndhcmQwMGIiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBiIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Gb3J3YXJkMDA/cGF0aD0vRm9yd2FyZDAwYy5qc3AiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBjIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRm9yd2FyZDAwP3BhdGg9L0ZvcndhcmQwMGMuanNwIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAwYyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDAwP3BhdGg9IUZvcndhcmQwMGQiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBkIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRm9yd2FyZDAwP3BhdGg9IUZvcndhcmQwMGQiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBkIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Gb3J3YXJkMDA/cGF0aD0hRm9yd2FyZDAwZSIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMGUgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRGb3J3YXJkMDA/cGF0aD0hRm9yd2FyZDAwZSIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMGUgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLS0tIEJhc2ljIEluY2x1ZGUgRnVuY3Rpb25hbGl0eSAoZmx1c2g9ZmFsc2UpIC0tLS0tIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDA/cGF0aD0vSW5jbHVkZTAwYSZhbXA7Zmx1c2g9ZmFsc2UiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBhIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTAwP3BhdGg9L0luY2x1ZGUwMGEmYW1wO2ZsdXNoPWZhbHNlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTAwP3BhdGg9L0luY2x1ZGUwMGImYW1wO2ZsdXNoPWZhbHNlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwMD9wYXRoPS9JbmNsdWRlMDBiJmFtcDtmbHVzaD1mYWxzZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwMD9wYXRoPS9JbmNsdWRlMDBjLmpzcCZhbXA7Zmx1c2g9ZmFsc2UiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBjIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTAwP3BhdGg9L0luY2x1ZGUwMGMuanNwJmFtcDtmbHVzaD1mYWxzZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGMgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwMD9wYXRoPSFJbmNsdWRlMDBkJmFtcDtmbHVzaD1mYWxzZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGQgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRJbmNsdWRlMDA/cGF0aD0hSW5jbHVkZTAwZCZhbXA7Zmx1c2g9ZmFsc2UiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBkIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDA/cGF0aD0hSW5jbHVkZTAwZSZhbXA7Zmx1c2g9ZmFsc2UiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBlIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTAwP3BhdGg9IUluY2x1ZGUwMGUmYW1wO2ZsdXNoPWZhbHNlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwZSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gQmFzaWMgSW5jbHVkZSAoZmx1c2g9dHJ1ZSwgY3JlYXRlPXRydWUpIC0tLS0tIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDA/cGF0aD0vSW5jbHVkZTAwYSZhbXA7Zmx1c2g9dHJ1ZSZhbXA7Y3JlYXRlPXRydWUiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBhIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTAwP3BhdGg9L0luY2x1ZGUwMGEmYW1wO2ZsdXNoPXRydWUmYW1wO2NyZWF0ZT10cnVlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTAwP3BhdGg9L0luY2x1ZGUwMGImYW1wO2ZsdXNoPXRydWUmYW1wO2NyZWF0ZT10cnVlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwMD9wYXRoPS9JbmNsdWRlMDBiJmFtcDtmbHVzaD10cnVlJmFtcDtjcmVhdGU9dHJ1ZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwMD9wYXRoPS9JbmNsdWRlMDBjLmpzcCZhbXA7Zmx1c2g9dHJ1ZSZhbXA7Y3JlYXRlPXRydWUiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBjIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTAwP3BhdGg9L0luY2x1ZGUwMGMuanNwJmFtcDtmbHVzaD10cnVlJmFtcDtjcmVhdGU9dHJ1ZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGMgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwMD9wYXRoPSFJbmNsdWRlMDBkJmFtcDtmbHVzaD10cnVlJmFtcDtjcmVhdGU9dHJ1ZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGQgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRJbmNsdWRlMDA/cGF0aD0hSW5jbHVkZTAwZCZhbXA7Zmx1c2g9dHJ1ZSZhbXA7Y3JlYXRlPXRydWUiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBkIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDA/cGF0aD0hSW5jbHVkZTAwZSZhbXA7Zmx1c2g9dHJ1ZSZhbXA7Y3JlYXRlPXRydWUiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBlIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTAwP3BhdGg9IUluY2x1ZGUwMGUmYW1wO2ZsdXNoPXRydWUmYW1wO2NyZWF0ZT10cnVlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwZSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gQmFzaWMgSW5jbHVkZSAoZmx1c2g9dHJ1ZSwgY3JlYXRlPWZhbHNlKSAtLS0tLSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTAwP3BhdGg9L0luY2x1ZGUwMGEmYW1wO2ZsdXNoPXRydWUmYW1wO2NyZWF0ZT1mYWxzZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGEgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRJbmNsdWRlMDA/cGF0aD0vSW5jbHVkZTAwYSZhbXA7Zmx1c2g9dHJ1ZSZhbXA7Y3JlYXRlPWZhbHNlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTAwP3BhdGg9L0luY2x1ZGUwMGImYW1wO2ZsdXNoPXRydWUmYW1wO2NyZWF0ZT1mYWxzZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRJbmNsdWRlMDA/cGF0aD0vSW5jbHVkZTAwYiZhbXA7Zmx1c2g9dHJ1ZSZhbXA7Y3JlYXRlPWZhbHNlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTAwP3BhdGg9L0luY2x1ZGUwMGMuanNwJmFtcDtmbHVzaD10cnVlJmFtcDtjcmVhdGU9ZmFsc2UiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBjIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTAwP3BhdGg9L0luY2x1ZGUwMGMuanNwJmFtcDtmbHVzaD10cnVlJmFtcDtjcmVhdGU9ZmFsc2UiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBjIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDA/cGF0aD0hSW5jbHVkZTAwZCZhbXA7Zmx1c2g9dHJ1ZSZhbXA7Y3JlYXRlPWZhbHNlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwZCBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwMD9wYXRoPSFJbmNsdWRlMDBkJmFtcDtmbHVzaD10cnVlJmFtcDtjcmVhdGU9ZmFsc2UiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBkIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDA/cGF0aD0hSW5jbHVkZTAwZSZhbXA7Zmx1c2g9dHJ1ZSZhbXA7Y3JlYXRlPWZhbHNlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwZSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwMD9wYXRoPSFJbmNsdWRlMDBlJmFtcDtmbHVzaD10cnVlJmFtcDtjcmVhdGU9ZmFsc2UiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBlIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0tLSBGb3J3YXJkIGFuZCBJbmNsdWRlIHRvIFN0YXRpYyBSZXNvdXJjZSAtLS0tLSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRm9yd2FyZDAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgIGluSGVhZGVycz0iSWYtbW9kaWZpZWQtc2luY2U6IE1vbiwgMjAgRGVjIDIwMTAgMTI6MTI6NTQgR01UIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAxIFBBU1NFRCIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gSW5jbHVkZWQgU2VydmxldCBUaHJvd2luZyBFeGNlcHRpb25zIC0tLS0tIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDI/ZXhjZXB0aW9uPUlPRXhjZXB0aW9uIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAyIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDI/ZXhjZXB0aW9uPVNlcnZsZXRFeGNlcHRpb24iCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwMj9leGNlcHRpb249TnVsbFBvaW50ZXJFeGNlcHRpb24iCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRJbmNsdWRlMDI/ZXhjZXB0aW9uPUlPRXhjZXB0aW9uIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAyIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTAyP2V4Y2VwdGlvbj1TZXJ2bGV0RXhjZXB0aW9uIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAyIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTAyP2V4Y2VwdGlvbj1OdWxsUG9pbnRlckV4Y2VwdGlvbiIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gRm9yd2FyZGVkIFNlcnZsZXQvUGFnZSBTZXRzIEF0dHJpYnV0ZSAtLS0tLSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDAzP3BhdGg9L0ZvcndhcmQwM2EiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDMgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRGb3J3YXJkMDM/cGF0aD0vRm9yd2FyZDAzYSIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDAzP3BhdGg9L0ZvcndhcmQwM2IuanNwIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAzIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRm9yd2FyZDAzP3BhdGg9L0ZvcndhcmQwM2IuanNwIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAzIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0tLSBJbmNsdWRlZCBTZXJ2bGV0L1BhZ2UgU2V0cyBBdHRyaWJ1dGUgLS0tLS0iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwMz9wYXRoPS9JbmNsdWRlMDNhIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAzIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTAzP3BhdGg9L0luY2x1ZGUwM2EiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDMgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwMz9wYXRoPS9JbmNsdWRlMDNiLmpzcCIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwMz9wYXRoPS9JbmNsdWRlMDNiLmpzcCIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTAzYy5qc3A/cGF0aD0vSW5jbHVkZTAzYSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwM2MuanNwIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDNjLmpzcD9wYXRoPS9JbmNsdWRlMDNiLmpzcCIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwM2MuanNwIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0tLSBJbmNsdWRlIFRoZW4gRm9yd2FyZCAtLS0tLSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTA0IgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTA0YiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwNCIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwNGIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwNS5qc3AiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDViIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0tLSBJbmNsdWRlIFRoZW4gSW5jbHVkZSAtLS0tLSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTA2LmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vSW5jbHVkZTA2LnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTA3IiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9JbmNsdWRlMDcudHh0Ii8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0tLSBGb3J3YXJkIFRoZW4gRm9yd2FyZCAtLS0tLSIvPgorCisgICAgPCEtLSBTZXJ2bGV0IHRvIFNlcnZsZXQgdG8gU2VydmxldCAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0ZvcndhcmQwNCIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwNGIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRGb3J3YXJkMDQiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDRiIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8IS0tIEpTUCB0byBKU1AgdG8gSlNQIC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDA0LmpzcCIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwNGIuanNwIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8IS0tIFNlcnZsZXQgdG8gSlNQIHRvIFNlcnZsZXQgLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Gb3J3YXJkMDUiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDViIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRm9yd2FyZDA1IgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDA1YiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPCEtLSBKU1AgdG8gU2VydmxldCB0byBKU1AgLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Gb3J3YXJkMDUuanNwIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDA1Yi5qc3AgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDwhLS0gSW52b2tlciB0byBKU1AgdG8gSW52b2tlciAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L3NlcnZsZXQvRm9yd2FyZDA2IgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDA2YiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPCEtLSBKU1AgdG8gSW52b2tlciB0byBKU1AgLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Gb3J3YXJkMDYuanNwIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDA2Yi5qc3AgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDwhLS0gU2VydmxldCB0byBJbnZva2VyIHRvIFNlcnZsZXQgLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Gb3J3YXJkMDciCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDdiIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRm9yd2FyZDA3IgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDA3YiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPCEtLSBJbnZva2VyIHRvIFNlcnZsZXQgdG8gSW52b2tlciAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L3NlcnZsZXQvRm9yd2FyZDA4IgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDA4YiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gU2VydmxldFJlcXVlc3QuZ2V0UmVxdWVzdERpc3BhdGNoZXIoKSAtLS0tLSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDA5P3BhdGg9L0ZvcndhcmQwMGEiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBhIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRm9yd2FyZDA5P3BhdGg9L0ZvcndhcmQwMGEiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBhIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Gb3J3YXJkMDk/cGF0aD0vRm9yd2FyZDAwYiIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMGIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRGb3J3YXJkMDk/cGF0aD0vRm9yd2FyZDAwYiIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMGIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0ZvcndhcmQwOT9wYXRoPS9Gb3J3YXJkMDBjLmpzcCIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMGMgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRGb3J3YXJkMDk/cGF0aD0vRm9yd2FyZDAwYy5qc3AiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBjIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Gb3J3YXJkMDk/cGF0aD1Gb3J3YXJkMDBhIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAwYSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZvcndhcmQwOT9wYXRoPUZvcndhcmQwMGEiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBhIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Gb3J3YXJkMDk/cGF0aD1Gb3J3YXJkMDBiIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAwYiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZvcndhcmQwOT9wYXRoPUZvcndhcmQwMGIiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBiIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Gb3J3YXJkMDk/cGF0aD1Gb3J3YXJkMDBjLmpzcCIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMGMgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRGb3J3YXJkMDk/cGF0aD1Gb3J3YXJkMDBjLmpzcCIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMGMgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwOT9wYXRoPS9JbmNsdWRlMDBhIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwOT9wYXRoPS9JbmNsdWRlMDBhIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTA5P3BhdGg9L0luY2x1ZGUwMGIiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBiIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTA5P3BhdGg9L0luY2x1ZGUwMGIiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBiIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDk/cGF0aD0vSW5jbHVkZTAwYy5qc3AiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBjIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTA5P3BhdGg9L0luY2x1ZGUwMGMuanNwIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTA5P3BhdGg9SW5jbHVkZTAwYSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGEgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRJbmNsdWRlMDk/cGF0aD1JbmNsdWRlMDBhIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTA5P3BhdGg9SW5jbHVkZTAwYiIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRJbmNsdWRlMDk/cGF0aD1JbmNsdWRlMDBiIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTA5P3BhdGg9SW5jbHVkZTAwYy5qc3AiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBjIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTA5P3BhdGg9SW5jbHVkZTAwYy5qc3AiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBjIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0tLSBDb250YWluZXItQ3JlYXRlZCBJbmNsdWRlIEF0dHJpYnV0ZXMgLS0tLS0iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUxMC9leHRyYS9wYXRoP25hbWUxPXZhbHVlMSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUxMGEgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRJbmNsdWRlMTAvZXh0cmEvcGF0aD9uYW1lMT12YWx1ZTEiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMTBhIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0tLSBSZXNwb25zZSBXcmFwcGluZyAtLS0tLSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzcG9uc2VXcmFwMDE/dHlwZT1GJmFtcDtwYWdlPS9SZXNwb25zZVdyYXAwMWEiCisgICAgICBvdXRDb250ZW50PSJSRVNQT05TRVdSQVAwMUEgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iIC8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNwb25zZVdyYXAwMT90eXBlPUYmYW1wO3BhZ2U9L1Jlc3BvbnNlV3JhcDAxYi5qc3AiCisgICAgICBvdXRDb250ZW50PSJSRVNQT05TRVdSQVAwMUIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iIC8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNwb25zZVdyYXAwMT90eXBlPUkmYW1wO3BhZ2U9L1Jlc3BvbnNlV3JhcDAxYyIKKyAgICAgIG91dENvbnRlbnQ9IlJFU1BPTlNFV1JBUDAxQyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIgLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc3BvbnNlV3JhcDAxP3R5cGU9SSZhbXA7cGFnZT0vUmVzcG9uc2VXcmFwMDFkLmpzcCIKKyAgICAgIG91dENvbnRlbnQ9IlJFU1BPTlNFV1JBUDAxRCBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIgLz4KKworICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0iUmVzb3VyY2VzIj4KKworICAgIDwhLS0gPT09PT09PT09PSBQb3NpdGl2ZSBTZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZSgpIFRlc3RzID09PT09PT09PT09IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMT9tb2RlPWNvbnRleHQmYW1wO3BhdGg9L1dFQi1JTkYvd2ViLnhtbCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMT9tb2RlPWNvbnRleHQmYW1wO3BhdGg9L0ZvcndhcmQwMS50eHQiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDE/bW9kZT1jb250ZXh0JmFtcDtwYXRoPS9JbmNsdWRlMDEudHh0IgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDEgUEFTU0VEIi8+CisKKyAgICA8IS0tID09PT09PT09PT0gUG9zaXRpdmUgQ2xhc3MuZ2V0UmVzb3VyY2UoKSBUZXN0cyA9PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDE/bW9kZT1jbGFzcyZhbXA7cGF0aD0vb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDEudHh0IgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczAxP21vZGU9Y2xhc3MmYW1wO3BhdGg9L29yZy9hcGFjaGUvdGVzdGVyL1VucGFja2VkMDEudHh0IgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczAxP21vZGU9Y2xhc3MmYW1wO3BhdGg9L29yZy9hcGFjaGUvdGVzdGVyL3NoYXJlZC9TaGFyZWQwMS50eHQiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDE/bW9kZT1jbGFzcyZhbXA7cGF0aD0vb3JnL2FwYWNoZS90ZXN0ZXIvdW5wc2hhcmVkL1VucFNoYXJlZDAxLnR4dCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczAxIFBBU1NFRCIvPgorCisgICAgPCEtLSA9PT09PT09PT09IE5lZ2F0aXZlIFNlcnZsZXRDb250ZXh0LmdldFJlc291cmNlKCkgVGVzdHMgPT09PT09PT09PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczAyP21vZGU9Y29udGV4dCZhbXA7cGF0aD0vV0VCLUlORi93ZWIueG1sLmJhZCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMj9tb2RlPWNvbnRleHQmYW1wO3BhdGg9L0ZvcndhcmQwMi50eHQuYmFkIgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDIgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczAyP21vZGU9Y29udGV4dCZhbXA7cGF0aD0vSW5jbHVkZTAyLnR4dC5iYWQiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwMiBQQVNTRUQiLz4KKworICAgIDwhLS0gPT09PT09PT09PSBOZWdhdGl2ZSBDbGFzcy5nZXRSZXNvdXJjZSgpIFRlc3RzID09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMj9tb2RlPWNsYXNzJmFtcDtwYXRoPS9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMi50eHQuYmFkIgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDIgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczAyP21vZGU9Y2xhc3MmYW1wO3BhdGg9L29yZy9hcGFjaGUvdGVzdGVyL1VucGFja2VkMDIudHh0LmJhZCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMj9tb2RlPWNsYXNzJmFtcDtwYXRoPS9vcmcvYXBhY2hlL3Rlc3Rlci9zaGFyZWQvU2hhcmVkMDEudHh0LmJhZCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMj9tb2RlPWNsYXNzJmFtcDtwYXRoPS9vcmcvYXBhY2hlL3Rlc3Rlci91bnBzaGFyZWQvVW5wU2hhcmVkMDEudHh0LmJhZCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczAyIFBBU1NFRCIvPgorCisgICAgPCEtLSA9PT09PT09PT09IFBvc2l0aXZlIFNlcnZsZXRDb250ZXh0LmdldFJlc291cmNlQXNTdHJlYW0oKSBUZXN0cyA9PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczAzP21vZGU9Y29udGV4dCZhbXA7cGF0aD0vV0VCLUlORi93ZWIueG1sIgorICAgICAgb3V0Q29udGVudD0iJmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7SVNPLTg4NTktMSZxdW90Oz8mZ3Q7Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczAzP21vZGU9Y29udGV4dCZhbXA7cGF0aD0vRm9yd2FyZDAxLnR4dCIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDM/bW9kZT1jb250ZXh0JmFtcDtwYXRoPS9JbmNsdWRlMDEudHh0IgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAxIFBBU1NFRCIvPgorCisgICAgPCEtLSA9PT09PT09PT09IFBvc2l0aXZlIENsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oKSBUZXN0cyA9PT09PT09PT09PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczAzP21vZGU9Y2xhc3MmYW1wO3BhdGg9L29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczAzLnR4dCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczAzIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMz9tb2RlPWNsYXNzJmFtcDtwYXRoPS9vcmcvYXBhY2hlL3Rlc3Rlci9VbnBhY2tlZDAzLnR4dCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczAzIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMz9tb2RlPWNsYXNzJmFtcDtwYXRoPS9vcmcvYXBhY2hlL3Rlc3Rlci9zaGFyZWQvU2hhcmVkMDMudHh0IgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDMgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczAzP21vZGU9Y2xhc3MmYW1wO3BhdGg9L29yZy9hcGFjaGUvdGVzdGVyL3VucHNoYXJlZC9VbnBTaGFyZWQwMy50eHQiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwMyBQQVNTRUQiLz4KKworICAgIDwhLS0gPT09PT09PT09PSBOZWdhdGl2ZSBTZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKCkgVGVzdHMgPT09IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwND9tb2RlPWNvbnRleHQmYW1wO3BhdGg9L1dFQi1JTkYvd2ViLnhtbC5iYWQiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwNCBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDQ/bW9kZT1jb250ZXh0JmFtcDtwYXRoPS9Gb3J3YXJkMDQudHh0LmJhZCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczA0IFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwND9tb2RlPWNvbnRleHQmYW1wO3BhdGg9L0luY2x1ZGUwNC50eHQuYmFkIgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDQgUEFTU0VEIi8+CisKKyAgICA8IS0tID09PT09PT09PT0gTmVnYXRpdmUgQ2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgpIFRlc3RzID09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDQ/bW9kZT1jbGFzcyZhbXA7cGF0aD0vb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDQudHh0LmJhZCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczA0IFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwND9tb2RlPWNsYXNzJmFtcDtwYXRoPS9vcmcvYXBhY2hlL3Rlc3Rlci9VbnBhY2tlZDA0LnR4dC5iYWQiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwNCBQQVNTRUQiLz4KKworICAgIDwhLS0gPT09PT09PT09PSBQb3NpdGl2ZSBDb21iaW5lZCBnZXRSZXNvdXJjZS9PcGVuIFRlc3RzID09PT09PT09PT09PT09IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwNT9tb2RlPWNvbnRleHQmYW1wO3BhdGg9L1dFQi1JTkYvd2ViLnhtbCIKKyAgICAgIG91dENvbnRlbnQ9IiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O0lTTy04ODU5LTEmcXVvdDs/Jmd0OyIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwNT9tb2RlPWNvbnRleHQmYW1wO3BhdGg9L0ZvcndhcmQwMS50eHQiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczA1P21vZGU9Y29udGV4dCZhbXA7cGF0aD0vSW5jbHVkZTAxLnR4dCIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDU/bW9kZT1jbGFzcyZhbXA7cGF0aD0vb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDUudHh0IgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDUgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczA1P21vZGU9Y2xhc3MmYW1wO3BhdGg9L29yZy9hcGFjaGUvdGVzdGVyL1VucGFja2VkMDUudHh0IgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDUgUEFTU0VEIi8+CisKKyAgICA8IS0tID09PT09PT09PT0gUG9zaXRpdmUgQ29tYmluZWQgZ2V0UmVzb3VyY2UvT3Blbi9TdHJpbmdpZnkgVGVzdHMgPT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDU/bW9kZT1jb250ZXh0JmFtcDtwYXRoPS9XRUItSU5GL3dlYi54bWwmYW1wO3N0cmluZ2lmeT10cnVlIgorICAgICAgb3V0Q29udGVudD0iJmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7SVNPLTg4NTktMSZxdW90Oz8mZ3Q7Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczA1P21vZGU9Y29udGV4dCZhbXA7cGF0aD0vRm9yd2FyZDAxLnR4dCZhbXA7c3RyaW5naWZ5PXRydWUiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczA1P21vZGU9Y29udGV4dCZhbXA7cGF0aD0vSW5jbHVkZTAxLnR4dCZhbXA7c3RyaW5naWZ5PXRydWUiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczA1P21vZGU9Y2xhc3MmYW1wO3BhdGg9L29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczA1LnR4dCZhbXA7c3RyaW5naWZ5PXRydWUiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwNSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDU/bW9kZT1jbGFzcyZhbXA7cGF0aD0vb3JnL2FwYWNoZS90ZXN0ZXIvVW5wYWNrZWQwNS50eHQmYW1wO3N0cmluZ2lmeT10cnVlIgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDUgUEFTU0VEIi8+CisKKyAgICA8IS0tID09PT09PT09PT0gZ2V0UmVzb3VyY2VQYXRocygpID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDY/cGF0aD0vIgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDYgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczA2P3BhdGg9L2dvbGRlbiIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczA2IFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwNj9wYXRoPS9XRUItSU5GIgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDYgUEFTU0VEIi8+CisKKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9IlNlY3VyaXR5Ij4KKworICAgIDwhLS0gPT09PT09PT09PSBTZWN1cml0eSBUZXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPCEtLSBTaG91bGQgbm90IGJlIGFibGUgdG8gdXNlIHJlbGF0aXZlIHBhdGggYWJvdmUgZG9jdW1lbnQgcm9vdCAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7anNwLWV4YW1wbGVzLnBhdGh9Ly4uLy4uIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI0MDAiLz4KKworICAgIDwhLS0gU2hvdWxkIG5vdCBiZSBhYmxlIHRvIHVzZSBzcGVjaWFsbHkgY3JhZnRlZCBVUkxzIHRvIGdldCBhcm91bmQgCisgICAgICAgICBzZWN1cml0eSBjb25zdHJhaW50cyAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9Ii90ZXN0ZXIvLy4vcHJvdGVjdGVkLy9BdXRoZW50aWNhdGlvbjAxIiAKKyAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIgc3RhdHVzPSI0MDEiLz4KKworICAgIDwhLS0gRGVmYXVsdFNlcnZsZXQgc2hvdWxkIG5vdCBkZWNvZGUgdGhlIHBhdGggYWdhaW4gLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2pzcC1leGFtcGxlcy5wYXRofS9zbnAvc25vb3AlMjUyZWpzcCIKKyAgICAgICAgICBzdGF0dXM9IjQwNCIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJTZXJ2bGV0Q29udGV4dCI+CisKKyAgICA8IS0tID09PT09PT09PT0gU2VydmxldCBDb250ZXh0IEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vQ29udGV4dDAwIgorICAgICAgb3V0Q29udGVudD0iQ29udGV4dDAwIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Db250ZXh0MDEiCisgICAgICBvdXRDb250ZW50PSJDb250ZXh0MDEgUEFTU0VEIi8+CisKKyAgICA8IS0tIE5PVEU6IEFzc2lnbiByb2xlICJtYW5hZ2VyIiB0byB1c2VyICJ0b21jYXQiIGZvciB0aGlzIHRvIHdvcmsgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICBpbkhlYWRlcnM9IkF1dGhvcml6YXRpb246QmFzaWMgZEc5dFkyRjBPblJ2YldOaGRBPT0iCisgICAgICAgICByZXF1ZXN0PSIke21hbmFnZXIucGF0aH0vcmVsb2FkP3BhdGg9JHtyZWxvYWQucGF0aH0iCisgICAgICBvdXRDb250ZW50PSJPSyAtICIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Db250ZXh0MDIiCisgICAgICBvdXRDb250ZW50PSJDb250ZXh0MDIgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRDb250ZXh0MDAiCisgICAgICBvdXRDb250ZW50PSJDb250ZXh0MDAgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRDb250ZXh0MDEiCisgICAgICBvdXRDb250ZW50PSJDb250ZXh0MDEgUEFTU0VEIi8+CisKKyAgICA8IS0tIE5PVEU6IEFzc2lnbiByb2xlICJtYW5hZ2VyIiB0byB1c2VyICJ0b21jYXQiIGZvciB0aGlzIHRvIHdvcmsgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICBpbkhlYWRlcnM9IkF1dGhvcml6YXRpb246QmFzaWMgZEc5dFkyRjBPblJ2YldOaGRBPT0iCisgICAgICAgICByZXF1ZXN0PSIke21hbmFnZXIucGF0aH0vcmVsb2FkP3BhdGg9JHtyZWxvYWQucGF0aH0iCisgICAgICBvdXRDb250ZW50PSJPSyAtICIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkQ29udGV4dDAyIgorICAgICAgb3V0Q29udGVudD0iQ29udGV4dDAyIFBBU1NFRCIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJTZXJ2bGV0UmVxdWVzdCI+CisKKyAgICA8IS0tID09PT09PT09PT0gUGFyYW1ldGVycyBhbmQgUXVlcnkgU3RyaW5ncyA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0dldFBhcmFtZXRlcjAxP2Zvbz0xIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJHZXRQYXJhbWV0ZXIwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRHZXRQYXJhbWV0ZXIwMT9mb289MSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iR2V0UGFyYW1ldGVyMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9HZXRQYXJhbWV0ZXJNYXAwMD9CZXN0TGFuZ3VhZ2U9SmF2YSZhbXA7QmVzdEpTUD1KYXZhMiIKKyAgICAgIG91dENvbnRlbnQ9IkdldFBhcmFtZXRlck1hcDAwIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkR2V0UGFyYW1ldGVyTWFwMDA/QmVzdExhbmd1YWdlPUphdmEmYW1wO0Jlc3RKU1A9SmF2YTIiCisgICAgICBvdXRDb250ZW50PSJHZXRQYXJhbWV0ZXJNYXAwMCBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vR2V0UXVlcnlTdHJpbmcwMT9mb289MSIKKyAgICAgIG91dENvbnRlbnQ9IkdldFF1ZXJ5U3RyaW5nMDEgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRHZXRRdWVyeVN0cmluZzAxP2Zvbz0xIgorICAgICAgb3V0Q29udGVudD0iR2V0UXVlcnlTdHJpbmcwMSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIgbWV0aG9kPSJQT1NUIgorICAgICAgIGluSGVhZGVycz0iQ29udGVudC1UeXBlOmFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKKyAgICAgICBpbkNvbnRlbnQ9ImI9MyZhbXA7YT0yIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0FnZ3JlZ2F0ZTAxP2E9MSIKKyAgICAgIG91dENvbnRlbnQ9IkFnZ3JlZ2F0ZTAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIgbWV0aG9kPSJQT1NUIgorICAgICAgIGluSGVhZGVycz0iQ29udGVudC1UeXBlOmFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKKyAgICAgICBpbkNvbnRlbnQ9ImI9MyZhbXA7YT0yIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRBZ2dyZWdhdGUwMT9hPTEiCisgICAgICBvdXRDb250ZW50PSJBZ2dyZWdhdGUwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iIG1ldGhvZD0iUE9TVCIKKyAgICAgICBpbkhlYWRlcnM9IkNvbnRlbnQtVHlwZTphcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCisgICAgICAgaW5Db250ZW50PSJiPTMmYW1wO2E9MiIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9BZ2dyZWdhdGUwMj9hPTEiCisgICAgICBvdXRDb250ZW50PSJBZ2dyZWdhdGUwMiBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iIG1ldGhvZD0iUE9TVCIKKyAgICAgICBpbkhlYWRlcnM9IkNvbnRlbnQtVHlwZTphcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCisgICAgICAgaW5Db250ZW50PSJiPTMmYW1wO2E9MiIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkQWdncmVnYXRlMDI/YT0xIgorICAgICAgb3V0Q29udGVudD0iQWdncmVnYXRlMDIgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1JlcXVlc3QwMSIKKyAgICAgIG91dENvbnRlbnQ9IlJlcXVlc3QwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZFJlcXVlc3QwMSIKKyAgICAgIG91dENvbnRlbnQ9IlJlcXVlc3QwMSBQQVNTRUQiLz4KKworICAgIDwhLS0gPT09PT09PT09PSBPdGhlciBTZXJ2bGV0UmVxdWVzdCBUZXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPCEtLSBIdHRwVVJMQ29ubmVjdGlvbiBkb2VzIG5vdCBoYW5kbGUgbXVsdGlwbGUgaGVhZGVycyBmb3IgdGhlIHNhbWUKKyAgICAgICAgIG5hbWUgY29ycmVjdGx5LCBzbyB1c2UgbmF0aXZlIHNvY2tldCBjb25uZWN0aW9ucywgc2VsZWN0ZWQgYnkKKyAgICAgICAgIHNldHRpbmcgdGhlIHByb3RvY29sIHRvICJIVFRQLzEuMCIgLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9HZXRIZWFkZXJzMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICBpbkhlYWRlcnM9IkFjY2VwdC1MYW5ndWFnZTplbi11cyMjQWNjZXB0LUxhbmd1YWdlOmVuLWdiIgorICAgICAgb3V0Q29udGVudD0iR2V0SGVhZGVyczAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEdldEhlYWRlcnMwMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgIGluSGVhZGVycz0iQWNjZXB0LUxhbmd1YWdlOmVuLXVzIyNBY2NlcHQtTGFuZ3VhZ2U6ZW4tZ2IiCisgICAgICBvdXRDb250ZW50PSJHZXRIZWFkZXJzMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9HZXRJbnB1dFN0cmVhbTAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJHZXRJbnB1dFN0cmVhbTAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEdldElucHV0U3RyZWFtMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IkdldElucHV0U3RyZWFtMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9HZXRMb2NhbGVzMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICBpbkhlYWRlcnM9IkFjY2VwdC1MYW5ndWFnZTplbi1jYSMjQWNjZXB0LUxhbmd1YWdlOmVuLWdiIgorICAgICAgb3V0Q29udGVudD0iR2V0TG9jYWxlczAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEdldExvY2FsZXMwMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgIGluSGVhZGVycz0iQWNjZXB0LUxhbmd1YWdlOmVuLWNhIyNBY2NlcHQtTGFuZ3VhZ2U6ZW4tZ2IiCisgICAgICBvdXRDb250ZW50PSJHZXRMb2NhbGVzMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9HZXRMb2NhbGVzMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICBpbkhlYWRlcnM9IkFjY2VwdC1MYW5ndWFnZTplbi1jYSxlbi1nYiIKKyAgICAgIG91dENvbnRlbnQ9IkdldExvY2FsZXMwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRHZXRMb2NhbGVzMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICBpbkhlYWRlcnM9IkFjY2VwdC1MYW5ndWFnZTplbi1jYSxlbi1nYiIKKyAgICAgIG91dENvbnRlbnQ9IkdldExvY2FsZXMwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0dldExvY2FsZXMwMiIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgIGluSGVhZGVycz0iQWNjZXB0LUxhbmd1YWdlOmVuLWNhIyNBY2NlcHQtTGFuZ3VhZ2U6ZW4tZ2IiCisgICAgICBvdXRDb250ZW50PSJHZXRMb2NhbGVzMDIgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkR2V0TG9jYWxlczAyIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgaW5IZWFkZXJzPSJBY2NlcHQtTGFuZ3VhZ2U6ZW4tY2EjI0FjY2VwdC1MYW5ndWFnZTplbi1nYiIKKyAgICAgIG91dENvbnRlbnQ9IkdldExvY2FsZXMwMiBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0dldExvY2FsZXMwMiIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgIGluSGVhZGVycz0iQWNjZXB0LUxhbmd1YWdlOmVuLWNhLGVuLWdiIgorICAgICAgb3V0Q29udGVudD0iR2V0TG9jYWxlczAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEdldExvY2FsZXMwMiIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgIGluSGVhZGVycz0iQWNjZXB0LUxhbmd1YWdlOmVuLWNhLGVuLWdiIgorICAgICAgb3V0Q29udGVudD0iR2V0TG9jYWxlczAyIFBBU1NFRCIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJTZXJ2bGV0UmVzcG9uc2UiPgorCisKKyAgICA8IS0tID09PT09PT09PT0gT3RoZXIgU2VydmxldFJlc3BvbnNlIFRlc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc2V0MDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlJlc2V0MDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkUmVzZXQwMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iUmVzZXQwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1NldEJ1ZmZlclNpemUwMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iU2V0QnVmZmVyU2l6ZTAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZFNldEJ1ZmZlclNpemUwMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iU2V0QnVmZmVyU2l6ZTAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU2V0TG9jYWxlMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlNldExvY2FsZTAxIFBBU1NFRCIKKyAgICAgIG91dEhlYWRlcnM9IkNvbnRlbnQtTGFuZ3VhZ2U6ZW4tVVMiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRTZXRMb2NhbGUwMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iU2V0TG9jYWxlMDEgUEFTU0VEIgorICAgICAgb3V0SGVhZGVycz0iQ29udGVudC1MYW5ndWFnZTplbi1VUyIvPgorCisKKyAgICA8IS0tID09PT09PT09PT0gU2VuZFJlZGlyZWN0IEhhbmRsaW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gQWxzbyBjaGVjayBkZWJ1ZyBvdXRwdXQgdG8gbWFrZSBzdXJlIG5vIGV4dHJhIGNvbnRlbnQgd2FzIGluY2x1ZGVkIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZWRpcmVjdDAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSIiCisgICAgICAgICAgc3RhdHVzPSIzMDIiIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1JlZGlyZWN0MDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlJlZGlyZWN0MDFhIFBBU1NFRCIgcmVkaXJlY3Q9InRydWUiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkUmVkaXJlY3QwMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iUmVkaXJlY3QwMWEgUEFTU0VEIiByZWRpcmVjdD0idHJ1ZSIvPgorCisgICAgPCEtLSBKU1AgcGFnZSBpbmNsdWRlcyAicmV0dXJuIiBhZnRlciByZWRpcmVjdCAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVkaXJlY3QwMi5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlJlZGlyZWN0MDJhLmpzcCBQQVNTRUQiIHJlZGlyZWN0PSJ0cnVlIi8+CisKKyAgICA8IS0tIFNhbWUgYXMgIlJlZGlyZWN0MDIuanNwIiBleGNlcHQgd2l0aG91dCB0aGUgInJldHVybiIgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1JlZGlyZWN0MDMuanNwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJSZWRpcmVjdDAzYS5qc3AgUEFTU0VEIiByZWRpcmVjdD0idHJ1ZSIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJIdHRwU2Vzc2lvbiI+CisKKyAgICA8IS0tID09PT09PT09PT0gU2Vzc2lvbiBBdHRyaWJ1dGUgUGVyc2lzdGVuY2UgPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Nlc3Npb24wMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iU2Vzc2lvbjAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU2Vzc2lvbjAyIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgIGpvaW5TZXNzaW9uPSJ0cnVlIgorICAgICAgb3V0Q29udGVudD0iU2Vzc2lvbjAyIFBBU1NFRCIvPgorCisgICAgPCEtLSBOT1RFOiBBc3NpZ24gcm9sZSAibWFuYWdlciIgdG8gdXNlciAidG9tY2F0IiBmb3IgdGhpcyB0byB3b3JrIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgaW5IZWFkZXJzPSJBdXRob3JpemF0aW9uOkJhc2ljIGRHOXRZMkYwT25SdmJXTmhkQT09IgorICAgICAgICAgcmVxdWVzdD0iJHttYW5hZ2VyLnBhdGh9L3JlbG9hZD9wYXRoPSR7cmVsb2FkLnBhdGh9IgorICAgICAgb3V0Q29udGVudD0iT0sgLSAiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Nlc3Npb24wMyIgZGVidWc9IiR7ZGVidWd9IgorICAgICBqb2luU2Vzc2lvbj0idHJ1ZSIKKyAgICAgIG91dENvbnRlbnQ9IlNlc3Npb24wMyBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Nlc3Npb24wNCIgZGVidWc9IiR7ZGVidWd9IgorICAgICBqb2luU2Vzc2lvbj0idHJ1ZSIKKyAgICAgIG91dENvbnRlbnQ9IlNlc3Npb24wNCBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRTZXNzaW9uMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlNlc3Npb24wMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRTZXNzaW9uMDIiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgam9pblNlc3Npb249InRydWUiCisgICAgICBvdXRDb250ZW50PSJTZXNzaW9uMDIgUEFTU0VEIi8+CisKKyAgICA8IS0tIE5PVEU6IEFzc2lnbiByb2xlICJtYW5hZ2VyIiB0byB1c2VyICJ0b21jYXQiIGZvciB0aGlzIHRvIHdvcmsgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICBpbkhlYWRlcnM9IkF1dGhvcml6YXRpb246QmFzaWMgZEc5dFkyRjBPblJ2YldOaGRBPT0iCisgICAgICAgICByZXF1ZXN0PSIke21hbmFnZXIucGF0aH0vcmVsb2FkP3BhdGg9JHtyZWxvYWQucGF0aH0iCisgICAgICBvdXRDb250ZW50PSJPSyAtICIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZFNlc3Npb24wMyIgZGVidWc9IiR7ZGVidWd9IgorICAgICBqb2luU2Vzc2lvbj0idHJ1ZSIKKyAgICAgIG91dENvbnRlbnQ9IlNlc3Npb24wMyBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRTZXNzaW9uMDQiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgam9pblNlc3Npb249InRydWUiCisgICAgICBvdXRDb250ZW50PSJTZXNzaW9uMDQgUEFTU0VEIi8+CisKKyAgICA8IS0tIEV4ZXJjaXNlIHNlc3Npb24gZXZlbnQgbGlzdGVuZXJzIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Nlc3Npb24wNSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vU2Vzc2lvbjA1LnR4dCIvPgorCisgICAgPCEtLSBFeGVyY2lzZSBzZXNzaW9uIGV2ZW50IGxpc3RlbmVycyAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkU2Vzc2lvbjA1IiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9XcmFwcGVkU2Vzc2lvbjA1LnR4dCIvPgorCisgICAgPCEtLSBTZXNzaW9uIGNyZWF0aW9uIGFmdGVyIHJlc3BvbnNlIGhhcyBiZWVuIGNvbW1pdHRlZCAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TZXNzaW9uMDYiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlNlc3Npb24wNiBQQVNTRUQiLz4KKworICAgIDwhLS0gU2Vzc2lvbiBjcmVhdGlvbiBhZnRlciByZXNwb25zZSBoYXMgYmVlbiBjb21taXR0ZWQgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZFNlc3Npb24wNiIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iU2Vzc2lvbjA2IFBBU1NFRCIvPgorCisgICAgPCEtLSA9PT09PT09PT09IFBhc3MgQXR0cmlidXRlcyBBY3Jvc3MgUmVkaXJlY3QgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8IS0tIFNlc3Npb24gbWFpbnRhaW5lZCBhY3Jvc3MgcmVkaXJlY3QgLS0+CisgICAgPCEtLSBOT1RFOiAgVGhlIGZvbGxvd2luZyB0d28tc3RlcCBwYXR0ZXJuIGlzIHJlcXVpcmVkIGJlY2F1c2UKKyAgICAgICAgIEh0dHBVUkxDb25uZWN0aW9uIGRvZXMgbm90IGZvcndhcmQgdGhlIHNlc3Npb24gY29va2llIGl0CisgICAgICAgICByZWNlaXZlcyBvbiB0byB0aGUgcmVkaXJlY3RlZCBsb2NhdGlvbiAodGhlIHdheSB0aGF0IGEKKyAgICAgICAgIGJyb3dzZXIgd2lsbCBkbyBzbykgLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TZXNzaW9uMDdhLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iMzAyIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TZXNzaW9uMDdiLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICBqb2luU2Vzc2lvbj0idHJ1ZSIKKyAgICAgIG91dENvbnRlbnQ9IlNlc3Npb24wNyBQQVNTRUQiLz4KKworICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0iWGVyY2VzVGVzdCI+CisKKyAgICA8IS0tID09PT09PT09PT0gWGVyY2VzIFNlYWxpbmcgVmlvbGF0aW9uIFRlc3QgPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1hlcmNlczAwLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iWGVyY2VzMDAgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9YZXJjZXMwMCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iWGVyY2VzMDAgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkWGVyY2VzMDAiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlhlcmNlczAwIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vWGVyY2VzMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlhlcmNlczAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZFhlcmNlczAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJYZXJjZXMwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1hlcmNlczAyLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iWGVyY2VzMDIgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9YZXJjZXMwMiIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iWGVyY2VzMDIgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkWGVyY2VzMDIiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlhlcmNlczAyIFBBU1NFRCIvPgorCisgIDwvdGFyZ2V0PgorCis8IS0tCis8dGFyZ2V0IG5hbWU9IlNTSVRlc3QiPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU1NJSW5jbHVkZTAxLnNodG1sIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9TU0lJbmNsdWRlMDEudHh0Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TU0lJbmNsdWRlMDIuc2h0bWwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L1NTSUluY2x1ZGUwMi50eHQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1NTSUluY2x1ZGUwMy5zaHRtbCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vU1NJSW5jbHVkZTAyLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU1NJSW5jbHVkZTA0LnNodG1sIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9TU0lJbmNsdWRlMDIudHh0Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TU0lJbmNsdWRlMDUuc2h0bWwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L1NTSUluY2x1ZGUwMi50eHQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1NTSUluY2x1ZGUwNi5zaHRtbCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vU1NJSW5jbHVkZTAyLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU1NJSW5jbHVkZTA3LnNodG1sIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9TU0lJbmNsdWRlMDIudHh0Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TU0lJbmNsdWRlMDguc2h0bWwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L1NTSUluY2x1ZGUwMi50eHQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1NTSUluY2x1ZGUwOS5zaHRtbCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vU1NJSW5jbHVkZTAzLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU1NJQ29uZmlnMDEuc2h0bWwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L1NTSUNvbmZpZzAxLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU1NJQ29uZmlnMDMuc2h0bWwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L1NTSUNvbmZpZzAzLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU1NJRnNpemUwMS5zaHRtbCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vU1NJSW5jbHVkZTAxLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU1NJRnNpemUwMi5zaHRtbCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vU1NJRnNpemUwMi50eHQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1NTSUZzaXplMDMuc2h0bWwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L1NTSUZzaXplMDIudHh0Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TU0lGc2l6ZTA0LnNodG1sIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9TU0lGc2l6ZTAyLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU1NJRnNpemUwNS5zaHRtbCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vU1NJRnNpemUwMi50eHQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1NTSUZzaXplMDYuc2h0bWwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L1NTSUZzaXplMDIudHh0Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TU0lGc2l6ZTA3LnNodG1sIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9TU0lGc2l6ZTAyLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU1NJRnNpemUwOC5zaHRtbCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vU1NJRnNpemUwMi50eHQiLz4KKworICA8L3RhcmdldD4KKy0tPgorCis8IS0tCisgIDx0YXJnZXQgbmFtZT0iQ0dJVGVzdCI+CisKKyAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9jZ2ktYmluL2FycmF5LnBsIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vYXJyYXkudHh0Ii8+CisKKyAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9jZ2ktYmluL2JpbmFyeS5wbD9jb3VudGVyPTEwMiIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L2JpbmFyeS50eHQiLz4KKworICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L2NnaS1iaW4vY29uY2F0LnBsP2ZpcnN0X25hbWU9amFuZSZhbXA7bGFzdF9uYW1lPWpvaG5zb24mYW1wO2ZpYW5jZV9maXJzdD1qb2huJmFtcDtmaWFuY2VfbGFzdD1zbWl0aCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L2NvbmNhdC50eHQiLz4KKworICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L2NnaS1iaW4vZGF5cy5wbCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L2RheXMudHh0Ii8+CisKKyAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9jZ2ktYmluL2Rvd2hpbGUucGw/c3RhcnQ9MTAiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9kb3doaWxlLnR4dCIvPgorCisgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vY2dpLWJpbi9lbHNlLnBsP2Zvb2Q9c3BpbmFjaCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L2Vsc2UudHh0Ii8+CisKKyAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9jZ2ktYmluL2Vsc2lmLnBsP2Zvb2Q9Y2hvY29sYXRlIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vZWxzaWYudHh0Ii8+CisKKyAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9jZ2ktYmluL2V4cG9uZW50cy5wbD9udW1iZXI9MiZhbXA7cG93ZXI9NCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L2V4cG9uZW50cy50eHQiLz4KKworICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L2NnaS1iaW4vZm9yLnBsP3N0YXJ0PTEwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vZG93aGlsZS50eHQiLz4KKworICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L2NnaS1iaW4vZ2V0ZGF5LnBsIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vZ2V0ZGF5LnR4dCIvPgorCisgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vY2dpLWJpbi9oZWxsb3BlcmwucGwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9oZWxsb3BlcmwudHh0Ii8+CisKKyAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9jZ2ktYmluL2lmLnBsP2Zvb2Q9c3BpbmFjaCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L2Vsc2UudHh0Ii8+CisKKyAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9jZ2ktYmluL2luY3JlbWVudC5wbD9jb3VudGVyPTciIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9pbmNyZW1lbnQudHh0Ii8+CisKKyAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9jZ2ktYmluL21vZGlmeWFsbC5wbD9udW1iZXI9Mjg5IiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vbW9kaWZ5YWxsLnR4dCIvPgorCisgIDwvdGFyZ2V0PgorLS0+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL2NvbmYvdG9tY2F0LXVzZXJzLnhtbCBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL2NvbmYvdG9tY2F0LXVzZXJzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmY1NzdhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvY29uZi90b21jYXQtdXNlcnMueG1sCkBAIC0wLDAgKzEsOCBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4KKzx0b21jYXQtdXNlcnM+CisgIDxyb2xlIHJvbGVuYW1lPSJ0b21jYXQiLz4KKyAgPHJvbGUgcm9sZW5hbWU9InJvbGUxIi8+CisgIDx1c2VyIHVzZXJuYW1lPSJ0b21jYXQiIHBhc3N3b3JkPSJ0b21jYXQiIHJvbGVzPSJ0b21jYXQsYWRtaW4sbWFuYWdlciIvPgorICA8dXNlciB1c2VybmFtZT0icm9sZTEiIHBhc3N3b3JkPSJ0b21jYXQiIHJvbGVzPSJyb2xlMSIvPgorICA8dXNlciB1c2VybmFtZT0iYm90aCIgcGFzc3dvcmQ9InRvbWNhdCIgcm9sZXM9InRvbWNhdCxyb2xlMSIvPgorPC90b21jYXQtdXNlcnM+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQWdncmVnYXRlMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9BZ2dyZWdhdGUwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Y2M1MmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQWdncmVnYXRlMDEuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0IGFnZ3JlZ2F0aW9uIG9mIHF1ZXJ5IHN0cmluZyBhbmQgUE9TVCBwYXJhbWV0ZXJzLiAgQWNjb3JkaW5nIHRvCisgKiBTZXJ2bGV0IDIuNCBQRkQsIFNlY3Rpb24gNC4xLCBhbGwgc3VjaCBwYXJhbWV0ZXJzIHNob3VsZCBiZSBhZ2dyZWdhdGVkLAorICogYW5kIGlmIHRoZXJlIGFyZSBkdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWVzIGZyb20gYm90aCBzb3VyY2VzLCB0aGUKKyAqIHBhcmFtZXRlciB2YWx1ZShzKSBmcm9tIHRoZSBxdWVyeSBzdHJpbmcgc2hvdWxkIGFwcGVhciBmaXJzdCBpbiB0aGUKKyAqIHZhbHVlcyByZXR1cm5lZCBieSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcygpLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQWdncmVnYXRlMDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gQWNjdW11bGF0ZSBhbnkgZXJyb3JzIHRoYXQgYXJlIG5vdGljZWQKKyAgICAgICAgU3RyaW5nQnVmZmVyIGVycm9ycyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMoImEiKTsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKQorICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiICBSZWNlaXZlZCBubyBwYXJhbWV0ZXIgdmFsdWVzIGZvciAnYScuIik7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlcy5sZW5ndGggIT0gMikKKyAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoIiAgUmVjZWl2ZWQgIiArIHZhbHVlcy5sZW5ndGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAiIHBhcmFtZXRlciB2YWx1ZXMgZm9yICdhJyBpbnN0ZWFkIG9mIDIuIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKCEiMSIuZXF1YWxzKHZhbHVlc1swXSkpCisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiICBGaXJzdCB2YWx1ZSBmb3IgJ2EnIHdhcyAnIiArIHZhbHVlc1swXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpbnN0ZWFkIG9mICcxJy4iKTsKKyAgICAgICAgICAgIGlmICghIjIiLmVxdWFscyh2YWx1ZXNbMV0pKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoIiAgU2Vjb25kIHZhbHVlIGZvciAnYScgd2FzICciICsgdmFsdWVzWzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGluc3RlYWQgb2YgJzInLiIpOworICAgICAgICB9CisgICAgICAgIHZhbHVlcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyVmFsdWVzKCJiIik7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoIiAgUmVjZWl2ZWQgbm8gcGFyYW1ldGVyIHZhbHVlcyBmb3IgJ2InLiIpOworICAgICAgICBlbHNlIGlmICh2YWx1ZXMubGVuZ3RoICE9IDEpCisgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCIgIFJlY2VpdmVkICIgKyB2YWx1ZXMubGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiBwYXJhbWV0ZXIgdmFsdWVzIGZvciAnYicgaW5zdGVhZCBvZiAxLiIpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICghIjMiLmVxdWFscyh2YWx1ZXNbMF0pKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoIiAgVmFsdWUgZm9yICdiJyB3YXMgJyIgKyB2YWx1ZXNbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgaW5zdGVhZCBvZiAnMycuIik7CisgICAgICAgIH0KKyAgICAgICAgRW51bWVyYXRpb24gbmFtZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIHdoaWxlIChuYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKCJhIi5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoImIiLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoIiAgUmVjZWl2ZWQgcGFyYW1ldGVyICciICsgbmFtZSArICInLiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHRoZSByZXN1bHRzCisgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkFnZ3JlZ2F0ZTAxIFBBU1NFRCIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQWdncmVnYXRlMDEgRkFJTEVEIC0iICsgZXJyb3JzLnRvU3RyaW5nKCkpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQWdncmVnYXRlMDIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9BZ2dyZWdhdGUwMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZjkwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQWdncmVnYXRlMDIuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0IGFnZ3JlZ2F0aW9uIG9mIHF1ZXJ5IHN0cmluZyBhbmQgUE9TVCBwYXJhbWV0ZXJzLiAgQWNjb3JkaW5nIHRvCisgKiBTZXJ2bGV0IDIuNCBQRkQsIFNlY3Rpb24gNC4xLCBhbGwgc3VjaCBwYXJhbWV0ZXJzIHNob3VsZCBiZSBhZ2dyZWdhdGVkLAorICogYW5kIGlmIHRoZXJlIGFyZSBkdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWVzIGZyb20gYm90aCBzb3VyY2VzLCB0aGUKKyAqIHBhcmFtZXRlciB2YWx1ZShzKSBmcm9tIHRoZSBxdWVyeSBzdHJpbmcgc2hvdWxkIGFwcGVhciBmaXJzdCBpbiB0aGUKKyAqIHZhbHVlcyByZXR1cm5lZCBieSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcygpLgorICogPHA+CisgKiBUaGlzIHRlc3QgaXMgdGhlIHNhbWUgYXMgQWdncmVnYXRlMDEsIGV4Y2VwdCB0aGF0IGl0IHVzZXMgdGhlIG5ldworICogPGNvZGU+Z2V0UGFyYW1ldGVyTWFwKCk8L2NvZGU+IG1ldGhvZCB0byByZXRyaWV2ZSBwYXJhbWV0ZXIgdmFsdWVzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQWdncmVnYXRlMDIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gQWNjdW11bGF0ZSBhbnkgZXJyb3JzIHRoYXQgYXJlIG5vdGljZWQKKyAgICAgICAgU3RyaW5nQnVmZmVyIGVycm9ycyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgTWFwIG1hcCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTWFwKCk7CisgICAgICAgIGlmIChtYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiICBObyBwYXJhbWV0ZXIgbWFwIHJldHVybmVkLiIpOworICAgICAgICAgICAgbWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdmFsdWVzW10gPSAoU3RyaW5nW10pIG1hcC5nZXQoImEiKTsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKQorICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiICBSZWNlaXZlZCBubyBwYXJhbWV0ZXIgdmFsdWVzIGZvciAnYScuIik7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlcy5sZW5ndGggIT0gMikKKyAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoIiAgUmVjZWl2ZWQgIiArIHZhbHVlcy5sZW5ndGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAiIHBhcmFtZXRlciB2YWx1ZXMgZm9yICdhJyBpbnN0ZWFkIG9mIDIuIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKCEiMSIuZXF1YWxzKHZhbHVlc1swXSkpCisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiICBGaXJzdCB2YWx1ZSBmb3IgJ2EnIHdhcyAnIiArIHZhbHVlc1swXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpbnN0ZWFkIG9mICcxJy4iKTsKKyAgICAgICAgICAgIGlmICghIjIiLmVxdWFscyh2YWx1ZXNbMV0pKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoIiAgU2Vjb25kIHZhbHVlIGZvciAnYScgd2FzICciICsgdmFsdWVzWzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGluc3RlYWQgb2YgJzInLiIpOworICAgICAgICB9CisgICAgICAgIHZhbHVlcyA9IChTdHJpbmdbXSkgbWFwLmdldCgiYiIpOworICAgICAgICBpZiAodmFsdWVzID09IG51bGwpCisgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCIgIFJlY2VpdmVkIG5vIHBhcmFtZXRlciB2YWx1ZXMgZm9yICdiJy4iKTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWVzLmxlbmd0aCAhPSAxKQorICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiICBSZWNlaXZlZCAiICsgdmFsdWVzLmxlbmd0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgcGFyYW1ldGVyIHZhbHVlcyBmb3IgJ2InIGluc3RlYWQgb2YgMS4iKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoISIzIi5lcXVhbHModmFsdWVzWzBdKSkKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCIgIFZhbHVlIGZvciAnYicgd2FzICciICsgdmFsdWVzWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGluc3RlYWQgb2YgJzMnLiIpOworICAgICAgICB9CisgICAgICAgIEl0ZXJhdG9yIG5hbWVzID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMubmV4dCgpOworICAgICAgICAgICAgaWYgKCJhIi5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoImIiLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoIiAgUmVjZWl2ZWQgcGFyYW1ldGVyICciICsgbmFtZSArICInLiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHRoZSByZXN1bHRzCisgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkFnZ3JlZ2F0ZTAyIFBBU1NFRCIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQWdncmVnYXRlMDIgRkFJTEVEIC0iICsgZXJyb3JzLnRvU3RyaW5nKCkpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQXV0aGVudGljYXRpb24wMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0F1dGhlbnRpY2F0aW9uMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWY5NTU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0F1dGhlbnRpY2F0aW9uMDEuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIEVuc3VyZSB0aGF0IHRoZSAidG9tY2F0IiB1c2VyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkLiAgVGhpcworICogc2hvdWxkIGJlIGd1YXJhbnRlZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGlzIFVSSSBpcyBwcm90ZWN0ZWQgYnkgYSBzZWN1cml0eQorICogY29uc3RyYWludCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQXV0aGVudGljYXRpb24wMSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBTdHJpbmcgcmVtb3RlVXNlciA9IHJlcXVlc3QuZ2V0UmVtb3RlVXNlcigpOworICAgICAgICBQcmluY2lwYWwgdXNlclByaW5jaXBhbCA9IHJlcXVlc3QuZ2V0VXNlclByaW5jaXBhbCgpOworICAgICAgICBTdHJpbmcgZXJyb3JzID0gIiI7CisgICAgICAgIGlmIChyZW1vdGVVc2VyID09IG51bGwpCisgICAgICAgICAgICBlcnJvcnMgKz0gIiAgZ2V0UmVtb3RlVXNlcigpIHJldHVybmVkIE5VTEwuIjsKKyAgICAgICAgZWxzZSBpZiAoIXJlbW90ZVVzZXIuZXF1YWxzKCJ0b21jYXQiKSkKKyAgICAgICAgICAgIGVycm9ycyArPSAiICByZW1vdGVVc2VyPSIgKyByZW1vdGVVc2VyICsgIi4iOworICAgICAgICBpZiAodXNlclByaW5jaXBhbCA9PSBudWxsKQorICAgICAgICAgICAgZXJyb3JzICs9ICIgIGdldFVzZXJQcmluY3BhbCgpIHJldHVybmVkIE5VTEwuIjsKKyAgICAgICAgZWxzZSBpZiAoIXVzZXJQcmluY2lwYWwuZ2V0TmFtZSgpLmVxdWFscygidG9tY2F0IikpCisgICAgICAgICAgICBlcnJvcnMgKz0gIiAgdXNlclByaW5jaXBhbD0iICsgdXNlclByaW5jaXBhbC5nZXROYW1lKCkgKyAiLiI7CisgICAgICAgIGlmICgocmVtb3RlVXNlciAhPSBudWxsKSAmJgorICAgICAgICAgICAgKHVzZXJQcmluY2lwYWwgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgICFyZW1vdGVVc2VyLmVxdWFscyh1c2VyUHJpbmNpcGFsLmdldE5hbWUoKSkpCisgICAgICAgICAgICBlcnJvcnMgKz0gIiAgcmVtb3RlVXNlcj0iICsgcmVtb3RlVXNlciArICIgdXNlclByaW5jaXBhbD0iICsKKyAgICAgICAgICAgICAgICB1c2VyUHJpbmNpcGFsLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQXV0aGVudGljYXRpb24wMSBGQUlMRUQ6IiArIGVycm9ycyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJBdXRoZW50aWNhdGlvbjAxIFBBU1NFRCIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQXV0aGVudGljYXRpb24wMi5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0F1dGhlbnRpY2F0aW9uMDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTY5NTRjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0F1dGhlbnRpY2F0aW9uMDIuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIEVuc3VyZSB0aGF0IHRoZSAidG9tY2F0IiB1c2VyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkLiAgQWx0aG91Z2gKKyAqIHRoaXMgVVJJIGlzIG5vdCBwcm90ZWN0ZWQgYnkgYSBzZWN1cml0eSBjb25zdHJhaW50LCB0aGUgdGVzdCBjbGllbnQgd2lsbAorICogaGF2ZSBhdXRoZW50aWNhdGVkIGEgdXNlciBwcmV2aW91c2x5IGJ5IGNhbGxpbmcgIi9BdXRoZW50aWNhdGlvbjAxIi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEF1dGhlbnRpY2F0aW9uMDIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgU3RyaW5nIHJlbW90ZVVzZXIgPSByZXF1ZXN0LmdldFJlbW90ZVVzZXIoKTsKKyAgICAgICAgUHJpbmNpcGFsIHVzZXJQcmluY2lwYWwgPSByZXF1ZXN0LmdldFVzZXJQcmluY2lwYWwoKTsKKyAgICAgICAgU3RyaW5nIGVycm9ycyA9ICIiOworICAgICAgICBpZiAocmVtb3RlVXNlciA9PSBudWxsKQorICAgICAgICAgICAgZXJyb3JzICs9ICIgIGdldFJlbW90ZVVzZXIoKSByZXR1cm5lZCBOVUxMLiI7CisgICAgICAgIGVsc2UgaWYgKCFyZW1vdGVVc2VyLmVxdWFscygidG9tY2F0IikpCisgICAgICAgICAgICBlcnJvcnMgKz0gIiAgcmVtb3RlVXNlcj0iICsgcmVtb3RlVXNlciArICIuIjsKKyAgICAgICAgaWYgKHVzZXJQcmluY2lwYWwgPT0gbnVsbCkKKyAgICAgICAgICAgIGVycm9ycyArPSAiICBnZXRVc2VyUHJpbmNwYWwoKSByZXR1cm5lZCBOVUxMLiI7CisgICAgICAgIGVsc2UgaWYgKCF1c2VyUHJpbmNpcGFsLmdldE5hbWUoKS5lcXVhbHMoInRvbWNhdCIpKQorICAgICAgICAgICAgZXJyb3JzICs9ICIgIHVzZXJQcmluY2lwYWw9IiArIHVzZXJQcmluY2lwYWwuZ2V0TmFtZSgpICsgIi4iOworICAgICAgICBpZiAoKHJlbW90ZVVzZXIgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgICh1c2VyUHJpbmNpcGFsICE9IG51bGwpICYmCisgICAgICAgICAgICAhcmVtb3RlVXNlci5lcXVhbHModXNlclByaW5jaXBhbC5nZXROYW1lKCkpKQorICAgICAgICAgICAgZXJyb3JzICs9ICIgIHJlbW90ZVVzZXI9IiArIHJlbW90ZVVzZXIgKyAiIHVzZXJQcmluY2lwYWw9IiArCisgICAgICAgICAgICAgICAgdXNlclByaW5jaXBhbC5nZXROYW1lKCk7CisgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkF1dGhlbnRpY2F0aW9uMDIgRkFJTEVEOiIgKyBlcnJvcnMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQXV0aGVudGljYXRpb24wMiBQQVNTRUQiKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0F1dGhlbnRpY2F0aW9uMDMuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9BdXRoZW50aWNhdGlvbjAzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzNGQzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9BdXRoZW50aWNhdGlvbjAzLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBFbnN1cmUgdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3QgcmVzdWx0cyBmcm9tIDxjb2RlPmlzVXNlckluUm9sZSgpPC9jb2RlPgorICogZm9yIGFuIGFjdHVhbCByb2xlLCBhIHJvbGUgYWxpYXNlZCB3aXRoIGEKKyAqIDxjb2RlPiZsdDtzZWN1cml0eS1yb2xlLXJlZiZndDs8L2NvZGU+IGVsZW1lbnQsIGFuZCBmb3IgYSByb2xlIHRoYXQgaXMKKyAqIG5vdCBhc3NpZ25lZCB0byB0aGUgc3BlY2lmaWVkIHVzZXIuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBBdXRoZW50aWNhdGlvbjAzIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0byBjcmVhdGUgdGhpcyByZXNwb25zZQorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB3ZSBoYXZlIGJlZW4gYXV0aGVudGljYXRlZCBjb3JyZWN0bHkKKyAgICAgICAgU3RyaW5nIHJlbW90ZVVzZXIgPSByZXF1ZXN0LmdldFJlbW90ZVVzZXIoKTsKKyAgICAgICAgaWYgKHJlbW90ZVVzZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiAgTm90IEF1dGhlbnRpY2F0ZWQvIik7CisgICAgICAgIH0gZWxzZSBpZiAoISJ0b21jYXQiLmVxdWFscyhyZW1vdGVVc2VyKSkgeworICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiAgQXV0aGVudGljYXRlZCBhcyAnIik7CisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChyZW1vdGVVc2VyKTsKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCInLyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGlzIHVzZXIgaXMgcGFydCBvZiB0aGUgInRvbWNhdCIgcm9sZQorICAgICAgICBpZiAoIXJlcXVlc3QuaXNVc2VySW5Sb2xlKCJ0b21jYXQiKSkgeworICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiAgTm90IGluIHJvbGUgJ3RvbWNhdCcvIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoaXMgdXNlciBpcyBwYXJ0IG9mIHRoZSAiYWxpYXMiIHJvbGUKKyAgICAgICAgLy8gKG1hcHBlZCB0byAidG9tY2F0IiBpbiBhIDxzZWN1cml0eS1yb2xlLXJlZj4gZWxlbWVudAorICAgICAgICBpZiAoIXJlcXVlc3QuaXNVc2VySW5Sb2xlKCJhbGlhcyIpKSB7CisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiICBOb3QgaW4gcm9sZSAnYWxpYXMnLyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGlzIHVzZXIgaXMgTk9UIHBhcnQgb2YgdGhlICJ1bmtub3duIiByb2xlCisgICAgICAgIGlmIChyZXF1ZXN0LmlzVXNlckluUm9sZSgidW5rbm93biIpKSB7CisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiICBJbiByb2xlICd1bmtub3duJy8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdlbmVyYXRlIG91ciByZXNwb25zZQorICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGgoKSA8IDEpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJBdXRoZW50aWNhdGlvbjAzIFBBU1NFRCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCJBdXRoZW50aWNhdGlvbjAzIEZBSUxFRCAtIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihyZXN1bHRzLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHdyYXBwZXIgbWVzc2FnZXMgYXMgcmVxdWlyZWQKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQXV0aGVudGljYXRpb24wNS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0F1dGhlbnRpY2F0aW9uMDUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2EzMTFlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0F1dGhlbnRpY2F0aW9uMDUuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIEVuc3VyZSB0aGF0IGEgcmVzb3VyY2UgcHJvdGVjdGVkIGEgYSBzZWN1cml0eSBjb25zdHJhdGludCB0aGF0IGFsbG93cyBhbGwKKyAqIHJvbGVzIHdpbGwgcGVybWl0IGFjY2VzcyB0byBhbiBhdXRoZW50aWNhdGVkIHVzZXIuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBBdXRoZW50aWNhdGlvbjA1IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBTdHJpbmcgcmVtb3RlVXNlciA9IHJlcXVlc3QuZ2V0UmVtb3RlVXNlcigpOworICAgICAgICBpZiAocmVtb3RlVXNlciA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgTm8gcmVtb3RlIHVzZXIgcmV0dXJuZWQvIik7CisgICAgICAgIGVsc2UgaWYgKCEidG9tY2F0Ii5lcXVhbHMocmVtb3RlVXNlcikpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIFJlbW90ZSB1c2VyIGlzICciKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChyZW1vdGVVc2VyKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiJy8iKTsKKyAgICAgICAgfQorCisgICAgICAgIFByaW5jaXBhbCB1c2VyUHJpbmNpcGFsID0gcmVxdWVzdC5nZXRVc2VyUHJpbmNpcGFsKCk7CisgICAgICAgIGlmICh1c2VyUHJpbmNpcGFsID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBObyB1c2VyIHByaW5jaXBhbCByZXR1cm5lZC8iKTsKKyAgICAgICAgZWxzZSBpZiAoISJ0b21jYXQiLmVxdWFscyh1c2VyUHJpbmNpcGFsLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIFVzZXIgcHJpbmNpcGFsIGlzICciKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh1c2VyUHJpbmNpcGFsKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiJy8iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmVxdWVzdC5pc1VzZXJJblJvbGUoInRvbWNhdCIpKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgTm90IGluIHJvbGUgJ3RvbWNhdCcvIik7CisKKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJBdXRoZW50aWNhdGlvbjA1IFBBU1NFRCIpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiQXV0aGVudGljYXRpb24wNSBGQUlMRUQgLSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc2IudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9BdXRoZW50aWNhdGlvbjA2LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQXV0aGVudGljYXRpb24wNi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NzEzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQXV0aGVudGljYXRpb24wNi5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogRW5zdXJlIHRoYXQgYSByZXNvdXJjZSBwcm90ZWN0ZWQgYSBhIHNlY3VyaXR5IGNvbnN0cmF0aW50IHRoYXQgYWxsb3dzIGFsbAorICogcm9sZXMgd2lsbCBwZXJtaXQgYWNjZXNzIHRvIGFuIGF1dGhlbnRpY2F0ZWQgdXNlci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEF1dGhlbnRpY2F0aW9uMDYgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICB3cml0ZXIucHJpbnRsbigiQXV0aGVudGljYXRpb24wNiBQQVNTRUQiKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ2hhckFycmF5UmVzcG9uc2UuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9DaGFyQXJyYXlSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzM2FmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ2hhckFycmF5UmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogSHR0cFNlcnZsZXRSZXNwb25zZSB3cmFwcGVyIHRoYXQgY29udmVydHMgYWxsIG91dHB1dCBjaGFyYWN0ZXJzIHRvCisgKiB1cHBlciBjYXNlIHZpYSBhbiBpbnRlcm1lZGlhdGUgYnVmZmVyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ2hhckFycmF5UmVzcG9uc2UgZXh0ZW5kcyBIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlciB7CisKKworICAgIENoYXJBcnJheVdyaXRlclVwcGVyQ2FzZSB3cml0ZXIgPSBudWxsOworCisgICAgcHVibGljIENoYXJBcnJheVJlc3BvbnNlKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgc3VwZXIocmVzcG9uc2UpOworICAgICAgICB3cml0ZXIgPSBuZXcgQ2hhckFycmF5V3JpdGVyVXBwZXJDYXNlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmx1c2hCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgIFJlYWRlciByZWFkZXIgPSBnZXRSZWFkZXIoKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gZ2V0UmVzcG9uc2UoKS5nZXRXcml0ZXIoKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBjaCA9IHJlYWRlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAoY2ggPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbisrOworICAgICAgICAgICAgd3JpdGVyLnByaW50KChjaGFyKSBjaCk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLnByaW50bG4oIlsiICsgbiArICJdIik7CisgICAgICAgIHRoaXMud3JpdGVyLnJlc2V0KCk7CisgICAgfQorCisgICAgcHVibGljIFJlYWRlciBnZXRSZWFkZXIoKSB7CisgICAgICAgIHJldHVybiAobmV3IENoYXJBcnJheVJlYWRlcih3cml0ZXIudG9DaGFyQXJyYXkoKSkpOworICAgIH0KKworICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gKG5ldyBQcmludFdyaXRlcih3cml0ZXIsIHRydWUpKTsKKyAgICB9CisKKworfQorCisKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0NoYXJBcnJheVdyaXRlclVwcGVyQ2FzZS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0NoYXJBcnJheVdyaXRlclVwcGVyQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTc1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ2hhckFycmF5V3JpdGVyVXBwZXJDYXNlLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIENoYXJBcnJheVdyaXRlciB0aGF0IHVwcGVyIGNhc2VzIGl0cyBvdXRwdXQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDaGFyQXJyYXlXcml0ZXJVcHBlckNhc2UgZXh0ZW5kcyBDaGFyQXJyYXlXcml0ZXIgeworCisKKyAgICBDaGFyQXJyYXlXcml0ZXIgd3JpdGVyID0gbmV3IENoYXJBcnJheVdyaXRlcigpOworCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgeworICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgd3JpdGVyLnJlc2V0KCk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gKHdyaXRlci5zaXplKCkpOworICAgIH0KKworICAgIHB1YmxpYyBjaGFyW10gdG9DaGFyQXJyYXkoKSB7CisgICAgICAgIHJldHVybiAod3JpdGVyLnRvQ2hhckFycmF5KCkpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAod3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBjKSB7CisgICAgICAgIGNoYXIgY2ggPSAoY2hhcikgYzsKKyAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjaCkpCisgICAgICAgICAgICBjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaCk7CisgICAgICAgIHdyaXRlci53cml0ZSgoaW50KSBjaCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUoY2hhciBjW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlKGMsIDAsIGMubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShjaGFyIGNbXSwgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICBmb3IgKGludCBpID0gb2ZmOyBpIDwgKG9mZiArIGxlbik7IGkrKykKKyAgICAgICAgICAgIHdyaXRlKGNbaV0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlKHN0ciwgMCwgc3RyLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgc3RyLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBvZmY7IGkgPCAob2ZmICsgbGVuKTsgaSsrKQorICAgICAgICAgICAgd3JpdGUoc3RyLmNoYXJBdChpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVUbyhvdXQpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ29udGV4dDAwLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ29udGV4dDAwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0ZDA5MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Db250ZXh0MDAuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLnNoYXJlZC5TaGFyZWRTZXNzaW9uQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRlc3Rlci51bnNoYXJlZC5VbnNoYXJlZFNlc3Npb25CZWFuOworCisKKy8qKgorICogUGFydCAwIG9mIENvbnRleHQgVGVzdHMuICBUaGlzIHNlcnZsZXQgaXMgbmV2ZXIgZXhlY3V0ZWQgZGlyZWN0bHkuICBJdHMKKyAqIHB1cnBvc2UgaXMgdG8gY3JlYXRlIGEgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSBhdCA8Y29kZT5pbml0KCk8L2NvZGU+CisgKiB0aW1lLCBhbmQgcmVtb3ZlIGl0IGF0IDxjb2RlPmRlc3Ryb3koKTwvY29kZT4gdGltZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbnRleHQwMCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5sb2coIkNvbnRleHQwMDogUmVtb3ZpbmcgYXR0cmlidXRlICdjb250ZXh0MDAnIik7CisgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkucmVtb3ZlQXR0cmlidXRlKCJjb250ZXh0MDAiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkubG9nKCJDb250ZXh0MDA6IFNldHRpbmcgYXR0cmlidXRlICdjb250ZXh0MDAnIik7CisgICAgICAgIENvbnRleHRCZWFuIGNiID0gbmV3IENvbnRleHRCZWFuKCk7CisgICAgICAgIGNiLnNldFN0cmluZ1Byb3BlcnR5KCJDb250ZXh0MDAiKTsKKyAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5zZXRBdHRyaWJ1dGUoImNvbnRleHQwMCIsIGNiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIkNvbnRleHQwMCBQQVNTRUQiKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0NvbnRleHQwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0NvbnRleHQwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjBjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ29udGV4dDAxLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CitpbXBvcnQgb3JnLmFwYWNoZS50ZXN0ZXIuc2hhcmVkLlNoYXJlZFNlc3Npb25CZWFuOworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLnVuc2hhcmVkLlVuc2hhcmVkU2Vzc2lvbkJlYW47CisKKworLyoqCisgKiBQYXJ0IDEgb2YgQ29udGV4dCBUZXN0cy4gIEV4ZXJjaXNlIHZhcmlvdXMgbWV0aG9kcyBmb3IgZGVhbGluZyB3aXRoCisgKiBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlcy4gIExlYXZlIGFuIGF0dHJpYnV0ZSBuYW1lZCAiY29udGV4dDAxIgorICogcHJlc2VudCwgd2hpY2ggc2hvdWxkIGJlIGVyYXNlZCBhZnRlciBhIHdlYiBhcHBsaWNhdGlvbiByZXN0YXJ0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dDAxIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gZ2V0U2VydmxldENvbnRleHQoKTsKKworICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBleGlzdGluZyBhdHRyaWJ1dGUKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRBdHRyaWJ1dGUoImNvbnRleHQwMSIpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQ29udGV4dDAxIEZBSUxFRCAtIEF0dHJpYnV0ZSBhbHJlYWR5IGV4aXN0cyIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYW5kIHN0YXNoIGEgY29udGV4dCBhdHRyaWJ1dGUKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBDb250ZXh0QmVhbiBiZWFuID0gbmV3IENvbnRleHRCZWFuKCk7CisgICAgICAgICAgICBiZWFuLnNldFN0cmluZ1Byb3BlcnR5KCJDb250ZXh0MDEiKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0QXR0cmlidXRlKCJjb250ZXh0MDEiLCBiZWFuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGNhbiByZXRyaWV2ZSB0aGUgYXR0cmlidXRlIHN1Y2Nlc3NmdWxseQorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIE9iamVjdCBiZWFuID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoImNvbnRleHQwMSIpOworICAgICAgICAgICAgaWYgKGJlYW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJDb250ZXh0MDEgRkFJTEVEIC0gQ2Fubm90IHJldHJpZXZlIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgICAgICBpZiAoIShiZWFuIGluc3RhbmNlb2YgQ29udGV4dEJlYW4pKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJDb250ZXh0MDEgRkFJTEVEIC0gQmVhbiBpbnN0YW5jZSBvZiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKChDb250ZXh0QmVhbikgYmVhbikuZ2V0U3RyaW5nUHJvcGVydHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoISJDb250ZXh0MDEiLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkNvbnRleHQwMSBGQUlMRUQgLSBWYWx1ZSA9ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxpZmVjeWNsZSA9ICgoQ29udGV4dEJlYW4pIGJlYW4pLmdldExpZmVjeWNsZSgpOworICAgICAgICAgICAgICAgIGlmICghIi9hZGQiLmVxdWFscyhsaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJDb250ZXh0MDEgRkFJTEVEIC0gQmVhbiBsaWZlY3ljbGUgaXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZSk7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgY2FuIHVwZGF0ZSB0aGlzIGF0dHJpYnV0ZSBhbmQgY2hlY2sgaXRzIGxpZmVjeWNsZQorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIENvbnRleHRCZWFuIGJlYW4gPSAoQ29udGV4dEJlYW4pIGNvbnRleHQuZ2V0QXR0cmlidXRlKCJjb250ZXh0MDEiKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0QXR0cmlidXRlKCJjb250ZXh0MDEiLCBiZWFuKTsKKyAgICAgICAgICAgIFN0cmluZyBsaWZlY3ljbGUgPSBiZWFuLmdldExpZmVjeWNsZSgpOworICAgICAgICAgICAgaWYgKCEiL2FkZC9yZXAiLmVxdWFscyhsaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkNvbnRleHQwMSBGQUlMRUQgLSBCZWFuIGxpZmVjeWNsZSBpcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGUpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSBjYW4gcmVtb3ZlIHRoaXMgYXR0cmlidXRlIGFuZCBjaGVjayBpdHMgbGlmZWN5Y2xlCisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgQ29udGV4dEJlYW4gYmVhbiA9IChDb250ZXh0QmVhbikgY29udGV4dC5nZXRBdHRyaWJ1dGUoImNvbnRleHQwMSIpOworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoImNvbnRleHQwMSIpOworICAgICAgICAgICAgU3RyaW5nIGxpZmVjeWNsZSA9IGJlYW4uZ2V0TGlmZWN5Y2xlKCk7CisgICAgICAgICAgICBpZiAoISIvYWRkL3JlcC9yZW0iLmVxdWFscyhsaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkNvbnRleHQwMSBGQUlMRUQgLSBCZWFuIGxpZmVjeWNsZSBpcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGUpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgYSBiZWFuIGJhY2sgZm9yIHRoZSByZXN0YXJ0IGFwcGxpY2F0aW9uIHRlc3QKKyAgICAgICAgY29udGV4dC5zZXRBdHRyaWJ1dGUoImNvbnRleHQwMSIsIG5ldyBDb250ZXh0QmVhbigpKTsKKworICAgICAgICAvLyBFbnN1cmUgdGhhdCBzZXRBdHRyaWJ1dGUoIm5hbWUiLCBudWxsKSB3b3JrcyBjb3JyZWN0bHkKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBjb250ZXh0LnNldEF0dHJpYnV0ZSgiRk9PIiwgIkJBUiIpOworICAgICAgICAgICAgY29udGV4dC5zZXRBdHRyaWJ1dGUoIkZPTyIsIG51bGwpOworICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0QXR0cmlidXRlKCJGT08iKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkNvbnRleHQwMSBGQUlMRUQgLSBzZXRBdHRyaWJ1dGUobmFtZSxudWxsKSIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgc3VjY2VzcyBpZiBldmVyeXRoaW5nIGlzIHN0aWxsIG9rCisgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJDb250ZXh0MDEgUEFTU0VEIik7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Db250ZXh0MDIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Db250ZXh0MDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGE2Yzk3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0NvbnRleHQwMi5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLnNoYXJlZC5TaGFyZWRTZXNzaW9uQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRlc3Rlci51bnNoYXJlZC5VbnNoYXJlZFNlc3Npb25CZWFuOworCisKKy8qKgorICogUGFydCAyIG9mIENvbnRleHQgVGVzdHMuICBUaGUgY29udGV4dCBhdHRyaWJ1dGUgZnJvbSBDb250ZXh0MDAgc2hvdWxkCisgKiBzdGlsbCBiZSBoZXJlIGFmdGVyIGEgcmVzdGFydCAoYmVjYXVzZSBDb250ZXh0MDAgaXMgYSBsb2FkLW9uLXN0YXJ0dXAKKyAqIHNlcnZsZXQsIHNvIHRoZSA8Y29kZT5pbml0KCk8L2NvZGU+IG1ldGhvZCBzaG91bGQgaGF2ZSBiZWVuIHRyaWdnZXJlZAorICogZHVyaW5nIHRoZSByZXN0YXJ0KS4gIEhvd2V2ZXIsIHRoZSBjb250ZXh0IGF0dHJpYnV0ZSBmcm9tIENvbnRleHQwMQorICogc2hvdWxkIDxzdHJvbmc+bm90PC9zdHJvbmc+IGJlIGhlcmUsIGJlY2F1c2UgY29udGV4dCBhdHRyaWJ1dGVzIHNob3VsZAorICogYmUgY2xlYW5lZCB1cCBkdXJpbmcgYSByZXN0YXJ0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dDAyIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gZ2V0U2VydmxldENvbnRleHQoKTsKKworICAgICAgICAvLyBDaGVjayBmb3IgdGhlIGF0dHJpYnV0ZSBmcm9tIENvbnRleHQwMQorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIE9iamVjdCBiZWFuID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoImNvbnRleHQwMSIpOworICAgICAgICAgICAgaWYgKGJlYW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJDb250ZXh0MDIgRkFJTEVEIC0gY29udGV4dDAxIHZhbHVlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW4pOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoImNvbnRleHQwMSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBhdHRyaWJ1dGUgZnJvbSBDb250ZXh0MDAKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBPYmplY3QgYmVhbiA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCJjb250ZXh0MDAiKTsKKyAgICAgICAgICAgIGlmIChiZWFuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQ29udGV4dDAyIEZBSUxFRCAtIGNvbnRleHQwMCBtaXNzaW5nIik7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShiZWFuIGluc3RhbmNlb2YgQ29udGV4dEJlYW4pKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkNvbnRleHQwMiBGQUlMRUQgLSBjb250ZXh0MDAgY2xhc3MgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKChDb250ZXh0QmVhbikgYmVhbikuZ2V0U3RyaW5nUHJvcGVydHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoISJDb250ZXh0MDAiLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkNvbnRleHQwMiBGQUlMRUQgLSBjb250ZXh0MDAgdmFsdWUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGlmZWN5Y2xlID0gKChDb250ZXh0QmVhbikgYmVhbikuZ2V0TGlmZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghIi9hZGQiLmVxdWFscyhsaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQ29udGV4dDAyIEZBSUxFRCAtIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNvbnRleHQwMCBsaWZlY3ljbGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGZvciB0aGUgYXR0cmlidXRlIGZyb20gQ29udGV4dExpc3RlbmVyMDEKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBPYmplY3QgYmVhbiA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCJjb250ZXh0TGlzdGVuZXIwMSIpOworICAgICAgICAgICAgaWYgKGJlYW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJDb250ZXh0MDIgRkFJTEVEIC0gY29udGV4dExpc3RlbmVyMDEgbWlzc2luZyIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCEoYmVhbiBpbnN0YW5jZW9mIENvbnRleHRCZWFuKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJDb250ZXh0MDIgRkFJTEVEIC0gY29udGV4dExpc3RlbmVyMDEgY2xhc3MgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKChDb250ZXh0QmVhbikgYmVhbikuZ2V0U3RyaW5nUHJvcGVydHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoISJDb250ZXh0TGlzdGVuZXIwMSIuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQ29udGV4dDAyIEZBSUxFRCAtIGNvbnRleHRMaXN0ZW5lcjAxICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUgIiArIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGlmZWN5Y2xlID0gKChDb250ZXh0QmVhbikgYmVhbikuZ2V0TGlmZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghIi9hZGQiLmVxdWFscyhsaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQ29udGV4dDAyIEZBSUxFRCAtIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNvbnRleHRMaXN0ZW5lcjAxIGxpZmVjeWNsZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHN1Y2Nlc3MgaWYgZXZlcnl0aGluZyBpcyBzdGlsbCBvaworICAgICAgICBpZiAob2spCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQ29udGV4dDAyIFBBU1NFRCIpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ29udGV4dEJlYW4uamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Db250ZXh0QmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMzIyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ29udGV4dEJlYW4uamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworCisvKioKKyAqIFNpbXBsZSBKYXZhQmVhbiB0byB1c2UgZm9yIGNvbnRleHQgYXR0cmlidXRlIHRlc3RzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dEJlYW4gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGxpZmVjeWNsZSBldmVudHMgdGhhdCBoYXZlIGhhcHBlbmVkIG9uIHRoaXMgYmVhbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxpZmVjeWNsZSA9ICIiOworCisgICAgcHVibGljIFN0cmluZyBnZXRMaWZlY3ljbGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5saWZlY3ljbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpZmVjeWNsZShTdHJpbmcgbGlmZWN5Y2xlKSB7CisgICAgICAgIHRoaXMubGlmZWN5Y2xlID0gbGlmZWN5Y2xlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQSBzdHJpbmcgcHJvcGVydHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzdHJpbmdQcm9wZXJ0eSA9ICJEZWZhdWx0IFN0cmluZyBQcm9wZXJ0eSBWYWx1ZSI7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1Byb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gKHRoaXMuc3RyaW5nUHJvcGVydHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZ1Byb3BlcnR5KFN0cmluZyBzdHJpbmdQcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnN0cmluZ1Byb3BlcnR5ID0gc3RyaW5nUHJvcGVydHk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYmVhbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkNvbnRleHRCZWFuW2xpZmVjeWNsZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGxpZmVjeWNsZSk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBzdHJpbmdQcm9wZXJ0eT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMuc3RyaW5nUHJvcGVydHkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Db250ZXh0TGlzdGVuZXIwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0NvbnRleHRMaXN0ZW5lcjAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzZTI2YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Db250ZXh0TGlzdGVuZXIwMS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogQXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXIgZm9yIGNvbnRleHQgZXZlbnRzLiAgQWxsIGV2ZW50cyB0aGF0IG9jY3VyCisgKiBhcmUgbG9nZ2VkIGFwcHJvcHJpYXRlbHkgdG8gdGhlIHN0YXRpYyBsb2dnZXIuLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dExpc3RlbmVyMDEKKyAgICBpbXBsZW1lbnRzIFNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXIsIFNlcnZsZXRDb250ZXh0TGlzdGVuZXIgeworCisKKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVBZGRlZChTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiQ29udGV4dExpc3RlbmVyMDE6IGF0dHJpYnV0ZUFkZGVkKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0TmFtZSgpICsgIiwiICsgZXZlbnQuZ2V0VmFsdWUoKSArICIpIik7CisgICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSAoU2VydmxldENvbnRleHQpIGV2ZW50LmdldFNvdXJjZSgpOworICAgICAgICBjb250ZXh0LmxvZygiQ29udGV4dExpc3RlbmVyMDE6IGF0dHJpYnV0ZUFkZGVkKCIgKworICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROYW1lKCkgKyAiLCIgKyBldmVudC5nZXRWYWx1ZSgpICsgIikiKTsKKyAgICAgICAgaWYgKGV2ZW50LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBDb250ZXh0QmVhbikgeworICAgICAgICAgICAgQ29udGV4dEJlYW4gYmVhbiA9IChDb250ZXh0QmVhbikgZXZlbnQuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGJlYW4uc2V0TGlmZWN5Y2xlKGJlYW4uZ2V0TGlmZWN5Y2xlKCkgKyAiL2FkZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlUmVtb3ZlZChTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiQ29udGV4dExpc3RlbmVyMDE6IGF0dHJpYnV0ZVJlbW92ZWQoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROYW1lKCkgKyAiLCIgKyBldmVudC5nZXRWYWx1ZSgpICsgIikiKTsKKyAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCA9IChTZXJ2bGV0Q29udGV4dCkgZXZlbnQuZ2V0U291cmNlKCk7CisgICAgICAgIGNvbnRleHQubG9nKCJDb250ZXh0TGlzdGVuZXIwMTogYXR0cmlidXRlUmVtb3ZlZCgiICsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0TmFtZSgpICsgIiwiICsgZXZlbnQuZ2V0VmFsdWUoKSArICIpIik7CisgICAgICAgIGlmIChldmVudC5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQ29udGV4dEJlYW4pIHsKKyAgICAgICAgICAgIENvbnRleHRCZWFuIGJlYW4gPSAoQ29udGV4dEJlYW4pIGV2ZW50LmdldFZhbHVlKCk7CisgICAgICAgICAgICBiZWFuLnNldExpZmVjeWNsZShiZWFuLmdldExpZmVjeWNsZSgpICsgIi9yZW0iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZVJlcGxhY2VkKFNlcnZsZXRDb250ZXh0QXR0cmlidXRlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJDb250ZXh0TGlzdGVuZXIwMTogYXR0cmlidXRlUmVwbGFjZWQoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROYW1lKCkgKyAiLCIgKyBldmVudC5nZXRWYWx1ZSgpICsgIikiKTsKKyAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCA9IChTZXJ2bGV0Q29udGV4dCkgZXZlbnQuZ2V0U291cmNlKCk7CisgICAgICAgIGNvbnRleHQubG9nKCJDb250ZXh0TGlzdGVuZXIwMTogYXR0cmlidXRlUmVwbGFjZWQoIiArCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIsIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiKSIpOworICAgICAgICBpZiAoZXZlbnQuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENvbnRleHRCZWFuKSB7CisgICAgICAgICAgICBDb250ZXh0QmVhbiBiZWFuID0gKENvbnRleHRCZWFuKSBldmVudC5nZXRWYWx1ZSgpOworICAgICAgICAgICAgYmVhbi5zZXRMaWZlY3ljbGUoYmVhbi5nZXRMaWZlY3ljbGUoKSArICIvcmVwIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0RGVzdHJveWVkKFNlcnZsZXRDb250ZXh0RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJDb250ZXh0TGlzdGVuZXIwMTogY29udGV4dERlc3Ryb3llZCgpIik7CisgICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSAoU2VydmxldENvbnRleHQpIGV2ZW50LmdldFNvdXJjZSgpOworICAgICAgICBjb250ZXh0LmxvZygiQ29udGV4dExpc3RlbmVyMDE6IGNvbnRleHREZXN0cm95ZWQoKSIpOworICAgICAgICBjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSgiY29udGV4dExpc3RlbmVyMDEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0SW5pdGlhbGl6ZWQoU2VydmxldENvbnRleHRFdmVudCBldmVudCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIkNvbnRleHRMaXN0ZW5lcjAxOiBjb250ZXh0SW5pdGlhbGl6ZWQoKSIpOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gKFNlcnZsZXRDb250ZXh0KSBldmVudC5nZXRTb3VyY2UoKTsKKyAgICAgICAgY29udGV4dC5sb2coIkNvbnRleHRMaXN0ZW5lcjAxOiBjb250ZXh0SW5pdGlhbGl6ZWQoKSIpOworICAgICAgICBDb250ZXh0QmVhbiBiZWFuID0gbmV3IENvbnRleHRCZWFuKCk7CisgICAgICAgIGJlYW4uc2V0U3RyaW5nUHJvcGVydHkoIkNvbnRleHRMaXN0ZW5lcjAxIik7CisgICAgICAgIGNvbnRleHQuc2V0QXR0cmlidXRlKCJjb250ZXh0TGlzdGVuZXIwMSIsIGJlYW4pOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ29udGV4dExpc3RlbmVyMDIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Db250ZXh0TGlzdGVuZXIwMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MDY5MzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ29udGV4dExpc3RlbmVyMDIuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RWRpdG9yTWFuYWdlcjsKK2ltcG9ydCBqYXZhLnNxbC5EYXRlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEV2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRMaXN0ZW5lcjsKKworCisvKioKKyAqIEFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIGZvciBjb250ZXh0IGV2ZW50cy4gIEVuc3VyZXMgdGhhdCB0aGUgcHJvcGVydHkKKyAqIGVkaXRvciBjbGFzc2VzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiBhcmUgYXBwcm9wcmlhdGVseSByZWdpc3RlcmVkLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dExpc3RlbmVyMDIKKyAgICBpbXBsZW1lbnRzIFNlcnZsZXRDb250ZXh0TGlzdGVuZXIgeworCisKKyAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSBudWxsOworCisKKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0RGVzdHJveWVkKFNlcnZsZXRDb250ZXh0RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgY29udGV4dC5sb2coIkNvbnRleHRMaXN0ZW5lcjAyOiBjb250ZXh0RGVzdHJveWVkKCkiKTsKKyAgICAgICAgY29udGV4dCA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29udGV4dEluaXRpYWxpemVkKFNlcnZsZXRDb250ZXh0RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgY29udGV4dCA9IChTZXJ2bGV0Q29udGV4dCkgZXZlbnQuZ2V0U291cmNlKCk7CisgICAgICAgIGNvbnRleHQubG9nKCJDb250ZXh0TGlzdGVuZXIwMjogY29udGV4dEluaXRpYWxpemVkKCkiKTsKKyAgICAgICAgUHJvcGVydHlFZGl0b3JNYW5hZ2VyLnJlZ2lzdGVyRWRpdG9yKERhdGUuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlUHJvcGVydHlFZGl0b3IuY2xhc3MpOworICAgICAgICBjb250ZXh0LmxvZygiQ29udGV4dExpc3RlbmVyMDI6IGdldEVkaXRvclNlYXJjaFBhdGgoKSAtLT4iKTsKKyAgICAgICAgU3RyaW5nIHNlYXJjaFtdID0gUHJvcGVydHlFZGl0b3JNYW5hZ2VyLmdldEVkaXRvclNlYXJjaFBhdGgoKTsKKyAgICAgICAgaWYgKHNlYXJjaCA9PSBudWxsKQorICAgICAgICAgICAgc2VhcmNoID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2gubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBjb250ZXh0LmxvZygiQ29udGV4dExpc3RlbmVyMDI6ICAgIiArIHNlYXJjaFtpXSk7CisgICAgICAgIGNvbnRleHQubG9nKCJDb250ZXh0TGlzdGVuZXIwMjogZmluZEVkaXRvcigpIC0tPiAiICsKKyAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlFZGl0b3JNYW5hZ2VyLmZpbmRFZGl0b3IoRGF0ZS5jbGFzcykpOworICAgICAgICAgICAgICAgCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9EYXRlUHJvcGVydHlFZGl0b3IuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9EYXRlUHJvcGVydHlFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTU2ZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0RhdGVQcm9wZXJ0eUVkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUVkaXRvclN1cHBvcnQ7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS5zcWwuRGF0ZTsKKworLyoqCisgKiBQcm9wZXJ0eUVkaXRvciBpbXBsZW1lbnRhdGlvbiBmb3IgYSBqYXZhLnNxbC5EYXRlIHByb3BlcnR5LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHJldmlzaW9uICREYXRlJCAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRlUHJvcGVydHlFZGl0b3IgZXh0ZW5kcyBQcm9wZXJ0eUVkaXRvclN1cHBvcnQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRhdGUgZm9ybWF0IHRvIHdoaWNoIGRhdGVzIGNvbnZlcnRlZCBieSB0aGlzIHByb3BlcnR5IGVkaXRvcgorICAgICAqIG11c3QgY29uZm9ybS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIk1NL2RkL3l5eXkiKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgb3VyIERhdGUgb2JqZWN0IGludG8gYSBTdHJpbmcgdGhhdCBjb25mb3JtcyB0byBvdXIKKyAgICAgKiBzcGVjaWZpZWQgPGNvZGU+Zm9ybWF0PC9jb2RlPiwgYW5kIHJldHVybiBpdC4gIElmIHRoaXMgaXMgbm90CisgICAgICogcG9zc2libGUsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFzVGV4dCgpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgRGF0ZSBkYXRlID0gKERhdGUpIGdldFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gKGZvcm1hdC5mb3JtYXQoZGF0ZSkpOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3BlY2lmaWVkIFN0cmluZyB2YWx1ZSBpbnRvIGEgRGF0ZSwgaWYgaXQgY29uZm9ybXMgdG8KKyAgICAgKiBvdXIgc3BlY2lmaWVkIDxjb2RlPmZvcm1hdDwvY29kZT4gLCBlbHNlIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBTdHJpbmcgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhIGNvbnZlcnNpb24gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXNUZXh0KFN0cmluZyB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGZvcm1hdCBvZiB0aGUgaW5wdXQgc3RyaW5nCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiQ2Fubm90IGNvbnZlcnQgbnVsbCBTdHJpbmcgdG8gYSBEYXRlIik7CisgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSAhPSAxMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIlN0cmluZyAnIiArIHZhbHVlICsgIicgaGFzIGludmFsaWQgbGVuZ3RoICIgKworICAgICAgICAgICAgICAgICB2YWx1ZS5sZW5ndGgoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmICgoaSA9PSAyKSB8fCAoaSA9PSA1KSkgeworICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnLycpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICgiU3RyaW5nICciICsgdmFsdWUgKyAiJyBtaXNzaW5nIHNsYXNoIGF0IGluZGV4ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0RpZ2l0KGNoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgKCJTdHJpbmcgJyIgKyB2YWx1ZSArICInIG1pc3NpbmcgZGlnaXQgYXQgaW5kZXggIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0IHRoZSBpbmNvbWluZyB2YWx1ZSB0byBhIGphdmEuc3FsLkRhdGUKKyAgICAgICAgamF2YS51dGlsLkRhdGUgdGVtcCA9IGZvcm1hdC5wYXJzZSh2YWx1ZSwgbmV3IFBhcnNlUG9zaXRpb24oMCkpOyAKKyAgICAgICAgamF2YS5zcWwuRGF0ZSBkYXRlID0gbmV3IGphdmEuc3FsLkRhdGUodGVtcC5nZXRUaW1lKCkpOworICAgICAgICBzZXRWYWx1ZShkYXRlKTsKKyAgICB9CisKKyAgICAgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRGVjb2RpbmcwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0RlY29kaW5nMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjQ3OGZhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0RlY29kaW5nMDEuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogVGVzdCBmb3IgcHJvcGVyIFVSTCBkZWNvZGluZyBvZiB0aGUgZ2V0U2VydmxldFBhdGgoKSBhbmQgZ2V0UGF0aEluZm8oKQorICogbWV0aG9kcyBvZiBIdHRwU2VydmxldFJlcXVlc3QuICBUaGUgZGVzaXJlZCB2YWx1ZXMgYXJlIHNwZWNpZmllZCBieSB0aGUKKyAqIDxzdHJvbmc+c2VydmxldDwvc3Ryb25nPiBhbmQgPHN0cm9uZz5wYXRoPC9zdHJvbmc+IHJlcXVlc3QgcGFyYW1ldGVycywKKyAqIHJlc3BlY3RpdmVseS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlY29kaW5nMDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJZGVudGlmeSBvdXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIFN0cmluZyBkZXNpcmVkU2VydmxldCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZXJ2bGV0Iik7CisgICAgICAgIFN0cmluZyBkZXNpcmVkUGF0aCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXRoIik7CisKKyAgICAgICAgLy8gUHJlcGFyZSBmb3IgdGhlIGRlc2lyZWQgdGVzdAorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGdldFNlcnZsZXRQYXRoKCkKKyAgICAgICAgU3RyaW5nIHNlcnZsZXRQYXRoID0gcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpOworICAgICAgICBpZiAoZGVzaXJlZFNlcnZsZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHNlcnZsZXRQYXRoICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBzZXJ2bGV0UGF0aCBpcyAnIiArIHNlcnZsZXRQYXRoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpbnN0ZWFkIG9mIE5VTEwvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc2VydmxldFBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIHNlcnZsZXRQYXRoIGlzIE5VTEwgaW5zdGVhZCBvZiAnIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFBhdGggKyAiJy8iKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFzZXJ2bGV0UGF0aC5lcXVhbHMoZGVzaXJlZFNlcnZsZXQpKQorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgc2VydmxldFBhdGggaXMgJyIgKyBzZXJ2bGV0UGF0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgaW5zdGVhZCBvZiAnIiArIGRlc2lyZWRTZXJ2bGV0ICsgIicvIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZ2V0UGF0aEluZm8oKQorICAgICAgICBTdHJpbmcgcGF0aEluZm8gPSByZXF1ZXN0LmdldFBhdGhJbmZvKCk7CisgICAgICAgIGlmIChkZXNpcmVkUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAocGF0aEluZm8gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIHBhdGhJbmZvIGlzICciICsgcGF0aEluZm8gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGluc3RlYWQgb2YgTlVMTC8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwYXRoSW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgcGF0aEluZm8gaXMgTlVMTCBpbnN0ZWFkIG9mICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkUGF0aCArICInLyIpOworICAgICAgICAgICAgZWxzZSBpZiAoIXBhdGhJbmZvLmVxdWFscyhkZXNpcmVkUGF0aCkpCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBwYXRoSW5mbyBpcyAnIiArIHBhdGhJbmZvICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpbnN0ZWFkIG9mICciICsgZGVzaXJlZFBhdGggKyAiJy8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBzdWNjZXNzIG9yIGZhaWx1cmUKKyAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkRlY29kaW5nMDEgUEFTU0VEIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCJEZWNvZGluZzAxIEZBSUxFRCAtIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihyZXN1bHRzLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHdyYXBwZXIgbWVzc2FnZXMgYXMgcmVxdWlyZWQKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTAxLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRXJyb3JQYWdlMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjk5NmVlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTAxLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBQYXJ0IDEgb2YgdGhlIEVycm9yUGFnZSBUZXN0cy4gIFJldHVybnMgYSByZXNwb25zZSBzdGF0dXMgY29kZSBvZiA0MTIKKyAqIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX1BSRUNPTkRJVElPTl9GQUlMRUQpIHdoaWNoIGlzIG1hcHBlZCB0byB0aGUKKyAqIEVycm9yUGFnZTAyIHNlcnZsZXQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEVycm9yUGFnZTAxIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gV3JpdGUgYSBGQUlMRUQgbWVzc2FnZSB0aGF0IHNob3VsZCBnZXQgcmVwbGFjZWQgYnkgdGhlIGVycm9yIHRleHQKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIkVycm9yUGFnZTAxIEZBSUxFRCAtIE9yaWdpbmFsIHJlc3BvbnNlIHJldHVybmVkIik7CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSByZXNwb25zZSBjb2RlCisgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX1BSRUNPTkRJVElPTl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3JQYWdlMDEgUmV0dXJuZWQgU3RhdHVzIENvZGUgNDEyIik7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9FcnJvclBhZ2UwMi5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTAyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYyNGY2NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9FcnJvclBhZ2UwMi5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFBhcnQgMiBvZiB0aGUgRXJyb3JQYWdlIFRlc3RzLiAgU2hvdWxkIGJlIG1hcHBlZCBieSB0aGUgY29udGFpbmVyIHdoZW4KKyAqIHRoZSBFcnJvclBhZ2UwMSBzZXJ2bGV0IHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyBjb2RlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRXJyb3JQYWdlMDIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnJlc2V0KCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEFjY3VtdWxhdGUgYWxsIHRoZSByZWFzb25zIHRoaXMgcmVxdWVzdCBtaWdodCBmYWlsCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKworICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLnN0YXR1c19jb2RlIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgc3RhdHVzX2NvZGUgaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBzdGF0dXNfY29kZSBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBpbnRWYWx1ZSA9ICgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoaW50VmFsdWUgIT0gSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19QUkVDT05ESVRJT05fRkFJTEVEKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgc3RhdHVzX2NvZGUgaXMgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3IubWVzc2FnZSIpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIG1lc3NhZ2UgaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIG1lc3NhZ2UgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IChTdHJpbmcpIHZhbHVlOworICAgICAgICAgICAgaWYgKCEiRXJyb3JQYWdlMDEgUmV0dXJuZWQgU3RhdHVzIENvZGUgNDEyIi5lcXVhbHMobWVzc2FnZSkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBtZXNzYWdlIGlzICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3IucmVxdWVzdF91cmkiKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiByZXF1ZXN0X3VyaSBpcyBtaXNzaW5nLyIpOworICAgICAgICBlbHNlIGlmICghKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgcmVxdWVzdF91cmkgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgcmVxdWVzdF91cmkgPSAoU3RyaW5nKSB2YWx1ZTsKKyAgICAgICAgICAgIFN0cmluZyB0ZXN0MSA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvRXJyb3JQYWdlMDEiOworICAgICAgICAgICAgU3RyaW5nIHRlc3QyID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi9XcmFwcGVkRXJyb3JQYWdlMDEiOworICAgICAgICAgICAgaWYgKCFyZXF1ZXN0X3VyaS5lcXVhbHModGVzdDEpICYmICFyZXF1ZXN0X3VyaS5lcXVhbHModGVzdDIpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgcmVxdWVzdF91cmkgaXMgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHJlcXVlc3RfdXJpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3Iuc2VydmxldF9uYW1lIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgc2VydmxldF9uYW1lIGlzIG1pc3NpbmcvIik7CisgICAgICAgIGVsc2UgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBzZXJ2bGV0X25hbWUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgc2VydmxldF9uYW1lID0gKFN0cmluZykgdmFsdWU7CisgICAgICAgICAgICBpZiAoISJFcnJvclBhZ2UwMSIuZXF1YWxzKHNlcnZsZXRfbmFtZSkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBzZXJ2bGV0X25hbWUgaXMgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHNlcnZsZXRfbmFtZSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgdWx0aW1hdGUgc3VjY2VzcyBvciBmYWlsdXJlCisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRXJyb3JQYWdlMDIgUEFTU0VEIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJFcnJvclBhZ2UwMiBGQUlMRUQgLSIgKyBzYi50b1N0cmluZygpKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9FcnJvclBhZ2UwMy5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTAzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmMWY1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9FcnJvclBhZ2UwMy5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogUGFydCAzIG9mIHRoZSBFcnJvclBhZ2UgVGVzdHMuICBUaHJvd3MgYW4gZXhjZXB0aW9uIG9mIGEgc3BlY2lmaWVkIHR5cGUKKyAqICh3cmFwcGVkIGluIGEgc2VydmxldCBleGNlcHRpb24gYXMgcmVxdWlyZWQgYnkgdGhlIHRocm93cyBjbGF1c2UpLCB3aGljaAorICogaXMgbWFwcGVkIHRvIHRoZSBFcnJvclBhZ2UwNCBzZXJ2bGV0IGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBFcnJvclBhZ2UwMyBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIFdyaXRlIGEgRkFJTEVEIG1lc3NhZ2UgdGhhdCBzaG91bGQgZ2V0IHJlcGxhY2VkIGJ5IHRoZSBlcnJvciB0ZXh0CisgICAgICAgIHdyaXRlci5wcmludGxuKCJFcnJvclBhZ2UwMyBGQUlMRUQgLSBPcmlnaW5hbCByZXNwb25zZSByZXR1cm5lZCIpOworCisgICAgICAgIC8vIFRocm93IHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uCisgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAobmV3IFRlc3RlckV4Y2VwdGlvbigiRXJyb3JQYWdlMDMgVGhyZXcgRXhjZXB0aW9uIikpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRXJyb3JQYWdlMDQuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9FcnJvclBhZ2UwNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZjUxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRXJyb3JQYWdlMDQuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBQYXJ0IDQgb2YgdGhlIEVycm9yUGFnZSBUZXN0cy4gIFNob3VsZCBiZSBtYXBwZWQgYnkgdGhlIGNvbnRhaW5lciB3aGVuCisgKiB0aGUgRXJyb3JQYWdlMDEgc2VydmxldCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBleGNlcHRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBFcnJvclBhZ2UwNCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2UucmVzZXQoKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gQWNjdW11bGF0ZSBhbGwgdGhlIHJlYXNvbnMgdGhpcyByZXF1ZXN0IG1pZ2h0IGZhaWwKKyAgICAgICAgU2VydmxldEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7CisKKyAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5leGNlcHRpb24iKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBleGNlcHRpb24gaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUudGVzdGVyLlRlc3RlckV4Y2VwdGlvbikpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbiBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRlc3RlckV4Y2VwdGlvbiB0ZSA9IChUZXN0ZXJFeGNlcHRpb24pIHZhbHVlOworICAgICAgICAgICAgaWYgKCEiRXJyb3JQYWdlMDMgVGhyZXcgRXhjZXB0aW9uIi5lcXVhbHModGUuZ2V0TWVzc2FnZSgpKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbiBtZXNzYWdlIGlzICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0ZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5leGNlcHRpb25fdHlwZSIpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbl90eXBlIGlzIG1pc3NpbmcvIik7CisgICAgICAgIGVsc2UgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBDbGFzcykpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbl90eXBlIGNsYXNzIGlzICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ2xhc3MgY2xhenogPSAoQ2xhc3MpIHZhbHVlOworICAgICAgICAgICAgaWYgKCEib3JnLmFwYWNoZS50ZXN0ZXIuVGVzdGVyRXhjZXB0aW9uIi5lcXVhbHMoY2xhenouZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbl90eXBlIGNsYXNzIGlzICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjbGF6ei5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5tZXNzYWdlIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgbWVzc2FnZSBpcyBtaXNzaW5nLyIpOworICAgICAgICBlbHNlIGlmICghKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgbWVzc2FnZSBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gKFN0cmluZykgdmFsdWU7CisgICAgICAgICAgICBpZiAoISJFcnJvclBhZ2UwMyBUaHJldyBFeGNlcHRpb24iLmVxdWFscyhtZXNzYWdlKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIG1lc3NhZ2UgaXMgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5yZXF1ZXN0X3VyaSIpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHJlcXVlc3RfdXJpIGlzIG1pc3NpbmcvIik7CisgICAgICAgIGVsc2UgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiByZXF1ZXN0X3VyaSBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0X3VyaSA9IChTdHJpbmcpIHZhbHVlOworICAgICAgICAgICAgU3RyaW5nIHRlc3QxID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi9FcnJvclBhZ2UwMyI7CisgICAgICAgICAgICBTdHJpbmcgdGVzdDIgPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAiL1dyYXBwZWRFcnJvclBhZ2UwMyI7CisgICAgICAgICAgICBpZiAoIXJlcXVlc3RfdXJpLmVxdWFscyh0ZXN0MSkgJiYgIXJlcXVlc3RfdXJpLmVxdWFscyh0ZXN0MikpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiByZXF1ZXN0X3VyaSBpcyAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocmVxdWVzdF91cmkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5zZXJ2bGV0X25hbWUiKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBzZXJ2bGV0X25hbWUgaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNlcnZsZXRfbmFtZSBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBzZXJ2bGV0X25hbWUgPSAoU3RyaW5nKSB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghIkVycm9yUGFnZTAzIi5lcXVhbHMoc2VydmxldF9uYW1lKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNlcnZsZXRfbmFtZSBpcyAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2VydmxldF9uYW1lKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCB1bHRpbWF0ZSBzdWNjZXNzIG9yIGZhaWx1cmUKKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJFcnJvclBhZ2UwNCBQQVNTRUQiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkVycm9yUGFnZTA0IEZBSUxFRCAtIiArIHNiLnRvU3RyaW5nKCkpOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTA1LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRXJyb3JQYWdlMDUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzhjNDcxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTA1LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBQYXJ0IDUgb2YgdGhlIEVycm9yUGFnZSBUZXN0cy4gIFRocm93cyBhIFJ1bnRpbWVFeGNlcHRpb24gb2YgYSB0eXBlCisgKiBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+IHF1ZXJ5IHBhcmFtZXRlciwgd2hpY2ggbXVzdCBiZSBvbmUKKyAqIG9mIHRoZSBmb2xsb3dpbmc6CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5Bcml0aG1ldGljRXhjZXB0aW9uPC9zdHJvbmc+IC0gRm9yd2FyZGVkIHRvICIvRXJyb3JQYWdlMDYiLjwvbGk+CisgKiA8bGk+PHN0cm9uZz5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb248L3N0cm9uZz4gLQorICogICAgIEZvcndhcmRlZCB0byAiL0Vycm9yUGFnZTA2LmpzcCIuPC9saT4KKyAqIDxsaT48c3Ryb25nPk51bWJlckZvcm1hdEV4Y2VwdGlvbjwvc3Ryb25nPiAtCisgKiAgICAgRm9yd2FyZGVkIHRvICIvRXJyb3JQYWdlMDYuaHRtbCIuPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBFcnJvclBhZ2UwNSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIFdyaXRlIGEgRkFJTEVEIG1lc3NhZ2UgdGhhdCBzaG91bGQgZ2V0IHJlcGxhY2VkIGJ5IHRoZSBlcnJvciB0ZXh0CisgICAgICAgIHdyaXRlci5wcmludGxuKCJFcnJvclBhZ2UwNSBGQUlMRUQgLSBPcmlnaW5hbCByZXNwb25zZSByZXR1cm5lZCIpOworCisgICAgICAgIC8vIFRocm93IHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uCisgICAgICAgIFN0cmluZyB0eXBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInR5cGUiKTsKKyAgICAgICAgaWYgKCJBcml0aG1ldGljIi5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcml0aG1ldGljRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJFcnJvclBhZ2UwNSBUaHJldyBBcml0aG1ldGljRXhjZXB0aW9uIik7CisgICAgICAgIH0gZWxzZSBpZiAoIkFycmF5Ii5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkVycm9yUGFnZTA1IFRocmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGVsc2UgaWYgKCJOdW1iZXIiLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiRXJyb3JQYWdlMDUgVGhyZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIik7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTA2LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRXJyb3JQYWdlMDYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWNmOWYwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTA2LmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogUGFydCA2IG9mIHRoZSBFcnJvclBhZ2UgVGVzdHMuICBTaG91bGQgYmUgbWFwcGVkIGJ5IHRoZSBjb250YWluZXIgd2hlbgorICogdGhlIEVycm9yUGFnZTA1IHNlcnZsZXQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgZXhjZXB0aW9uLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRXJyb3JQYWdlMDYgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnJlc2V0KCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEFjY3VtdWxhdGUgYWxsIHRoZSByZWFzb25zIHRoaXMgcmVxdWVzdCBtaWdodCBmYWlsCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKworICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLmV4Y2VwdGlvbiIpOworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoImV4Y2VwdGlvbiBpcyAnIiArIHZhbHVlICsgIiciKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbiBpcyBtaXNzaW5nLyIpOworICAgICAgICB9IGVsc2UgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBqYXZhLmxhbmcuQXJpdGhtZXRpY0V4Y2VwdGlvbikpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbiBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3IuZXhjZXB0aW9uX3R5cGUiKTsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJleGNlcHRpb25fdHlwZSBpcyAnIiArIHZhbHVlICsgIiciKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCisgICAgICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoImV4Y2VwdGlvbl90eXBlIGNsYXNzIGlzICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICInIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgZXhjZXB0aW9uX3R5cGUgaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIENsYXNzKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgZXhjZXB0aW9uX3R5cGUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IChDbGFzcykgdmFsdWU7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGNsYXp6LmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmICghImphdmEubGFuZy5Bcml0aG1ldGljRXhjZXB0aW9uIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBleGNlcHRpb25fdHlwZSBpcyAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQobmFtZSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLm1lc3NhZ2UiKTsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJtZXNzYWdlIGlzICciICsgdmFsdWUgKyAiJyIpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIG1lc3NhZ2UgaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIG1lc3NhZ2UgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIH0gZWxzZSBpZiAoISJFcnJvclBhZ2UwNSBUaHJldyBBcml0aG1ldGljRXhjZXB0aW9uIi5lcXVhbHModmFsdWUpICYmCisgICAgICAgICAgICAgICAgICAgISJFcnJvclBhZ2UwOCBUaHJldyBBcml0aG1ldGljRXhjZXB0aW9uIi5lcXVhbHModmFsdWUpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBtZXNzYWdlIGlzIG5vdCBjb3JyZWN0Iik7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLnJlcXVlc3RfdXJpIik7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgicmVxdWVzdF91cmkgaXMgJyIgKyB2YWx1ZSArICInIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgcmVxdWVzdF91cmkgaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHJlcXVlc3RfdXJpIGNsYXNzIGlzICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RfdXJpID0gKFN0cmluZykgdmFsdWU7CisgICAgICAgICAgICBTdHJpbmcgdGVzdDEgPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAiL0Vycm9yUGFnZTA1IjsKKyAgICAgICAgICAgIFN0cmluZyB0ZXN0MiA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvV3JhcHBlZEVycm9yUGFnZTA1IjsKKyAgICAgICAgICAgIFN0cmluZyB0ZXN0MyA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvRXJyb3JQYWdlMDgiOworICAgICAgICAgICAgU3RyaW5nIHRlc3Q0ID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi9XcmFwcGVkRXJyb3JQYWdlMDgiOworICAgICAgICAgICAgaWYgKCFyZXF1ZXN0X3VyaS5lcXVhbHModGVzdDEpICYmICFyZXF1ZXN0X3VyaS5lcXVhbHModGVzdDIpICYmCisgICAgICAgICAgICAgICAgIXJlcXVlc3RfdXJpLmVxdWFscyh0ZXN0MykgJiYgIXJlcXVlc3RfdXJpLmVxdWFscyh0ZXN0NCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiByZXF1ZXN0X3VyaSBpcyAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocmVxdWVzdF91cmkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5zZXJ2bGV0X25hbWUiKTsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJzZXJ2bGV0X25hbWUgaXMgJyIgKyB2YWx1ZSArICInIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgc2VydmxldF9uYW1lIGlzIG1pc3NpbmcvIik7CisgICAgICAgIGVsc2UgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBzZXJ2bGV0X25hbWUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgc2VydmxldF9uYW1lID0gKFN0cmluZykgdmFsdWU7CisgICAgICAgICAgICBpZiAoISJFcnJvclBhZ2UwNSIuZXF1YWxzKHNlcnZsZXRfbmFtZSkgJiYKKyAgICAgICAgICAgICAgICAhIkVycm9yUGFnZTA4Ii5lcXVhbHMoc2VydmxldF9uYW1lKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNlcnZsZXRfbmFtZSBpcyAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2VydmxldF9uYW1lKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCB1bHRpbWF0ZSBzdWNjZXNzIG9yIGZhaWx1cmUKKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJFcnJvclBhZ2UwNiBQQVNTRUQgLSBTRVJWTEVUIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJFcnJvclBhZ2UwNiBGQUlMRUQgLSIgKyBzYi50b1N0cmluZygpKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9FcnJvclBhZ2UwNy5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTA3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5MDYyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9FcnJvclBhZ2UwNy5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogUGFydCA3IG9mIHRoZSBlcnJvciBwYWdlIHRlc3RzLiAgVGhpcyBzZXJ2bGV0IGlzIGNvbmZpZ3VyZWQgYXMKKyAqIDxjb2RlPmxvYWQtb24tc3RhcnR1cDwvY29kZT4gaW4gdGhlIHdlYi54bWwgZmlsZSwgYW5kIHNob3VsZCByZXR1cm4KKyAqIHN0YXR1cyA1MDMgKHNlcnZpY2UgdW5hdmFpbGFibGUpIHdoZW4gaXQgaXMgY2FsbGVkIGxhdGVyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRXJyb3JQYWdlMDcgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5hdmFpbGFibGVFeGNlcHRpb24KKyAgICAgICAgICAgICgiRXJyb3JQYWdlMDcgVGhyZXcgVW5hdmFpbGFibGVFeGNlcHRpb24gaW4gaW5pdCgpIik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIkVycm9yUGFnZTA3IEZBSUxFRCAtIENhbGxlZCB1bmF2YWlsYWJsZSBzZXJ2bGV0Iik7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZpbHRlclJlcXVlc3QwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZpbHRlclJlcXVlc3QwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZTI3OGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRmlsdGVyUmVxdWVzdDAxLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogUG9zaXRpdmUgdGVzdCBmb3IgYmVpbmcgYWJsZSB0byBmaWx0ZXIgaW5wdXQuICBUaGUgaW5wdXQgd2lsbCBiZSBlY2hvZWQKKyAqIGJhY2sgaW4gdGhlIHJlc3BvbnNlLCBhZnRlciBoYXZpbmcgYmVlbiBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZSBieSB0aGUKKyAqIGFzc29jaWF0ZWQgZmlsdGVyLiAgVXNlIHJlcXVlc3QgcGFyYW1ldGVyIDxjb2RlPnR5cGU8L2NvZGU+IHRvIGRldGVybWluZQorICogd2hldGhlciB0byBjYWxsIGdldFJlYWRlcigpICgicmVhZGVyIikgb3IgZ2V0SW5wdXRTdHJlYW0oKSAoInN0cmVhbSIpLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRmlsdGVyUmVxdWVzdDAxIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBTdHJpbmcgdHlwZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ0eXBlIik7CisgICAgICAgIGlmICh0eXBlID09IG51bGwpCisgICAgICAgICAgICB0eXBlID0gInJlYWRlciI7CisgICAgICAgIGlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoInJlYWRlciIpKSB7CisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IHJlcXVlc3QuZ2V0UmVhZGVyKCk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGludCBjID0gYnIucmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChjIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSBjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyLmNsb3NlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTZXJ2bGV0SW5wdXRTdHJlYW0gc2lzID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IHNpcy5yZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKGMgPCAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpIGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2lzLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICB3cml0ZXIucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZpbHRlclJlcXVlc3QwMi5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZpbHRlclJlcXVlc3QwMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MDc1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRmlsdGVyUmVxdWVzdDAyLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogVmVyaWZ5IHRoYXQgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugd3JhcHBlcnMgYWRkZWQgYnkgYSBGaWx0ZXIgYXJlIGluIGZhY3QKKyAqIHZpc2libGUgdG8gdGhlIGNhbGxlZCBzZXJ2bGV0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRmlsdGVyUmVxdWVzdDAyIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgU3RyaW5nIGRpc3BhdGNoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRpc3BhdGNoIik7CisgICAgICAgIGlmICgiRiIuZXF1YWxzKGRpc3BhdGNoKSkgeworICAgICAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgcmQgPQorICAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9GaWx0ZXJSZXF1ZXN0MDJhIik7CisgICAgICAgICAgICBpZiAocmQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVxdWVzdDAyIEZBSUxFRCAtIE5vIGZvcndhcmQgcmVxdWVzdCBkaXNwYXRjaGVyIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmQuZm9yd2FyZChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIkkiLmVxdWFscyhkaXNwYXRjaCkpIHsKKyAgICAgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKCIvRmlsdGVyUmVxdWVzdDAyYSIpOworICAgICAgICAgICAgaWYgKHJkID09IG51bGwpCisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZpbHRlclJlcXVlc3QwMiBGQUlMRUQgLSBObyBpbmNsdWRlIHJlcXVlc3QgZGlzcGF0Y2hlciIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJkLmluY2x1ZGUocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIHdyYXAgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigid3JhcCIpOworICAgICAgICAgICAgaWYgKCJmYWxzZSIuZXF1YWxzKHdyYXApKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVxdWVzdDAyIEZBSUxFRCAtIFJlcXVlc3Qgd2FzIHdyYXBwZWQiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGaWx0ZXJSZXF1ZXN0MDIgUEFTU0VEIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCIvV3JhcHBlZEZpbHRlclJlcXVlc3QwMiIuZXF1YWxzKHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIpCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGaWx0ZXJSZXF1ZXN0MDIgUEFTU0VEIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVxdWVzdDAyIEZBSUxFRCAtIFdyYXBwZXIgY2xhc3MgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlcXVlc3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZpbHRlclJlcXVlc3QwMmEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9GaWx0ZXJSZXF1ZXN0MDJhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5MzZkNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9GaWx0ZXJSZXF1ZXN0MDJhLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogVmVyaWZ5IHRoYXQgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugd3JhcHBlcnMgYWRkZWQgYnkgYSBGaWx0ZXIgYXJlIGluIGZhY3QKKyAqIHZpc2libGUgdG8gdGhlIGNhbGxlZCBzZXJ2bGV0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRmlsdGVyUmVxdWVzdDAyYSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgcHVibGljIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIFN0cmluZyB3cmFwID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIndyYXAiKTsKKworICAgICAgICBpZiAoImZhbHNlIi5lcXVhbHMod3JhcCkpIHsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcikKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVxdWVzdDAyIEZBSUxFRCAtIFJlcXVlc3Qgd2FzIHdyYXBwZWQiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVxdWVzdDAyIFBBU1NFRCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGaWx0ZXJSZXF1ZXN0MDIgUEFTU0VEIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZpbHRlclJlcXVlc3QwMiBGQUlMRUQgLSBXcmFwcGVyIGNsYXNzIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlcXVlc3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZpbHRlclJlc3BvbnNlMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9GaWx0ZXJSZXNwb25zZTAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkYzJkOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9GaWx0ZXJSZXNwb25zZTAxLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogUG9zaXRpdmUgdGVzdCBmb3IgYmVpbmcgYWJsZSB0byBmaWx0ZXIgb3V0cHV0LiAgVGhlIG91dHB1dCBzaG91bGQgYmUKKyAqIGZpbHRlcmVkIGFuZCBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZSBiZWZvcmUgcmV0dXJuIHRvIHRoZSBjbGllbnQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBGaWx0ZXJSZXNwb25zZTAxIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIkZpbHRlclJlc3BvbnNlMDEgUEFTU0VEIik7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9GaWx0ZXJSZXNwb25zZTA0LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRmlsdGVyUmVzcG9uc2UwNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYjQ3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRmlsdGVyUmVzcG9uc2UwNC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIFZlcmlmeSB0aGF0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHdyYXBwZXJzIGFkZGVkIGJ5IGEgRmlsdGVyIGFyZSBpbiBmYWN0CisgKiB2aXNpYmxlIHRvIHRoZSBjYWxsZWQgc2VydmxldC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZpbHRlclJlc3BvbnNlMDQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICBTdHJpbmcgZGlzcGF0Y2ggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiZGlzcGF0Y2giKTsKKyAgICAgICAgaWYgKCJGIi5lcXVhbHMoZGlzcGF0Y2gpKSB7CisgICAgICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL0ZpbHRlclJlc3BvbnNlMDRhIik7CisgICAgICAgICAgICBpZiAocmQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVzcG9uc2UwNCBGQUlMRUQgLSBObyBmb3J3YXJkIHJlcXVlc3QgZGlzcGF0Y2hlciIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJkLmZvcndhcmQocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9IGVsc2UgaWYgKCJJIi5lcXVhbHMoZGlzcGF0Y2gpKSB7CisgICAgICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL0ZpbHRlclJlc3BvbnNlMDRhIik7CisgICAgICAgICAgICBpZiAocmQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVzcG9uc2UwNCBGQUlMRUQgLSBObyBpbmNsdWRlIHJlcXVlc3QgZGlzcGF0Y2hlciIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJkLmluY2x1ZGUocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIHdyYXAgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigid3JhcCIpOworICAgICAgICAgICAgaWYgKCJmYWxzZSIuZXF1YWxzKHdyYXApKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIpCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGaWx0ZXJSZXNwb25zZTA0IEZBSUxFRCAtIFJlc3BvbnNlIHdhcyB3cmFwcGVkIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVzcG9uc2UwNCBQQVNTRUQiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwNCIuZXF1YWxzKHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcikKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZpbHRlclJlc3BvbnNlMDQgUEFTU0VEIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVzcG9uc2UwNCBGQUlMRUQgLSBXcmFwcGVyIGNsYXNzIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXNwb25zZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRmlsdGVyUmVzcG9uc2UwNGEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9GaWx0ZXJSZXNwb25zZTA0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MTdiODgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRmlsdGVyUmVzcG9uc2UwNGEuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBWZXJpZnkgdGhhdCByZXF1ZXN0IGFuZCByZXNwb25zZSB3cmFwcGVycyBhZGRlZCBieSBhIEZpbHRlciBhcmUgaW4gZmFjdAorICogdmlzaWJsZSB0byB0aGUgY2FsbGVkIHNlcnZsZXQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBGaWx0ZXJSZXNwb25zZTA0YSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgcHVibGljIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIFN0cmluZyB3cmFwID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIndyYXAiKTsKKworICAgICAgICBpZiAoImZhbHNlIi5lcXVhbHMod3JhcCkpIHsKKyAgICAgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIFRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGaWx0ZXJSZXNwb25zZTA0IEZBSUxFRCAtIFJlc3BvbnNlIHdhcyB3cmFwcGVkIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZpbHRlclJlc3BvbnNlMDQgUEFTU0VEIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcikKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVzcG9uc2UwNCBQQVNTRUQiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVzcG9uc2UwNCBGQUlMRUQgLSBXcmFwcGVyIGNsYXNzIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc3BvbnNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDAuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGVjYTM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwMC5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogRXhlcmNpc2UgYmFzaWMgZm9yd2FyZGluZyBmdW5jdGlvbmFsaXR5LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDAwIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHBhdGggdG8gd2hpY2ggd2Ugd2lsbCBpc3N1ZSBhIGZvcndhcmQKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcGF0aCA9ICIvRm9yd2FyZDAwYSI7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCBkaXNwYXRjaGVyIGFuZCBjYWxsIGZvcndhcmQoKSBvbiBpdAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9IG51bGw7CisgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoIiEiKSkKKyAgICAgICAgICAgIHJkID0gZ2V0U2VydmxldENvbnRleHQoKS5nZXROYW1lZERpc3BhdGNoZXIocGF0aC5zdWJzdHJpbmcoMSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZCA9IGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIocGF0aCk7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBObyBSZXF1ZXN0RGlzcGF0Y2hlciByZXR1cm5lZC8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICAgICAgcmQuZm9yd2FyZChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSBvdXIgcmVzcG9uc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpID49IDEpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiRm9yd2FyZDAwIEZBSUxFRCAtIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDAwYS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwMGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDI5ZGNlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwMGEuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIEV4ZXJjaXNlIGJhc2ljIGZvcndhcmRpbmcgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwMGEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gV3JpdGUgb3VyIHJlc3BvbnNlIGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAgICAgIHdyaXRlci5wcmludCgiRm9yd2FyZDAwYSBQQVNTRUQiKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwMGQuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDBkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0Mjk1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDBkLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBFeGVyY2lzZSBiYXNpYyBmb3J3YXJkaW5nIGZ1bmN0aW9uYWxpdHkuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBGb3J3YXJkMDBkIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIFdyaXRlIG91ciByZXNwb25zZSBpZiBhbiBlcnJvciBvY2N1cnJlZAorICAgICAgICB3cml0ZXIucHJpbnQoIkZvcndhcmQwMGQgUEFTU0VEIik7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDg1MGM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwMS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogUG9zaXRpdmUgdGVzdCBmb3IgZm9yd2FyZGluZyB0byBhIHN0YXRpYyByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwMSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9Gb3J3YXJkMDEudHh0Iik7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDEgRkFJTEVEIC0gTm8gUmVxdWVzdERpc3BhdGNoZXIgcmV0dXJuZWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByZC5mb3J3YXJkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDMuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmRjYTBmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwMy5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogVGVzdCB0byBlbnN1cmUgdGhhdCBhIGZvcndhcmRlZC10byBzZXJ2bGV0IGNhbiByZWNlaXZlIHJlcXVlc3QgYXR0cmlidXRlcworICogc2V0IGJ5IHRoZSBjYWxsaW5nIHNlcnZsZXQsIGFzIHdlbGwgYXMgc2V0IHRoZWlyIG93biByZXF1ZXN0IGF0dHJpYnV0ZXMuCisgKgorICogVGhlIHRlc3QgZm9yd2FyZHMgdG8gZWl0aGVyIGEgc2VydmxldCAoIi9Gb3J3YXJkMDNhIikgb3IgYSBKU1AgcGFnZQorICogKCIvRm9yd2FyZDAzYi5qc3AiKSBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIHNwZWNpZmllZCBmb3IgdGhlICJwYXRoIgorICogcGFyYW1ldGVyLiAgVGhlIGRlZmF1bHQgaXMgdGhlIHNlcnZsZXQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBGb3J3YXJkMDMgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcGF0aCB0byB3aGljaCB3ZSB3aWxsIGlzc3VlIGEgZm9yd2FyZAorICAgICAgICBTdHJpbmcgcGF0aCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXRoIik7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpCisgICAgICAgICAgICBwYXRoID0gIi9Gb3J3YXJkMDNhIjsKKworICAgICAgICAvLyBXcml0ZSB0aGUgcmVxdWVzdCBhdHRyaWJ1dGUgd2Ugd2lsbCBiZSBmb3J3YXJkaW5nCisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJGb3J3YXJkMDMiLCAiVGhpcyBpcyB0aGUgZm9yd2FyZGVkIGF0dHJpYnV0ZSIpOworICAgICAgICBpZiAocmVxdWVzdC5nZXRBdHRyaWJ1dGUoIkZvcndhcmQwMyIpID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBDYW5ub3QgcmV0cmlldmUgYXR0cmlidXRlIHRvIGZvcndhcmQvIik7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCBkaXNwYXRjaGVyIGFuZCBjYWxsIGZvcndhcmQoKSBvbiBpdAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKHBhdGgpOworICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgTm8gUmVxdWVzdERpc3BhdGNoZXIgcmV0dXJuZWQvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgICAgIHJkLmZvcndhcmQocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV3JpdGUgb3VyIHJlc3BvbnNlIGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+PSAxKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIkluY2x1ZGUwMyBGQUlMRUQgLSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwM2EuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDNhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkZDAzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDNhLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0IHRvIGVuc3VyZSB0aGF0IGEgZm9yd2FyZGVkLXRvIHNlcnZsZXQgY2FuIHJlY2VpdmUgcmVxdWVzdCBhdHRyaWJ1dGVzCisgKiBzZXQgYnkgdGhlIGNhbGxpbmcgc2VydmxldCwgYXMgd2VsbCBhcyBzZXQgdGhlaXIgb3duIHJlcXVlc3QgYXR0cmlidXRlcy4KKyAqCisgKiBUaGUgdGVzdCBmb3J3YXJkcyB0byBlaXRoZXIgYSBzZXJ2bGV0ICgiL0ZvcndhcmQwM2EiKSBvciBhIEpTUCBwYWdlCisgKiAoIi9Gb3J3YXJkMDNiLmpzcCIpIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgc3BlY2lmaWVkIGZvciB0aGUgInBhdGgiCisgKiBwYXJhbWV0ZXIuICBUaGUgZGVmYXVsdCBpcyB0aGUgc2VydmxldC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwM2EgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3BlY2lhbHNbXSA9CisgICAgeyAiamF2YXguc2VydmxldC5pbmNsdWRlLnJlcXVlc3RfdXJpIiwKKyAgICAgICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUuY29udGV4dF9wYXRoIiwKKyAgICAgICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUuc2VydmxldF9wYXRoIiwKKyAgICAgICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucGF0aF9pbmZvIiwKKyAgICAgICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucXVlcnlfc3RyaW5nIiB9OworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIGNhbiByZXRyaWV2ZSB0aGUgZm9yd2FyZGVkIGF0dHJpYnV0ZQorICAgICAgICBpZiAocmVxdWVzdC5nZXRBdHRyaWJ1dGUoIkZvcndhcmQwMyIpID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBDYW5ub3QgcmV0cmlldmUgZm9yd2FyZGVkIGF0dHJpYnV0ZS8iKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gc2V0IGFuZCByZXRyaWV2ZSBvdXIgb3duIGF0dHJpYnV0ZQorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiRm9yd2FyZDAzYSIsICJUaGlzIGlzIG91ciBvd24gYXR0cmlidXRlIik7CisgICAgICAgIGlmIChyZXF1ZXN0LmdldEF0dHJpYnV0ZSgiRm9yd2FyZDAzYSIpID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBDYW5ub3QgcmV0cmlldmUgb3VyIG93biBhdHRyaWJ1dGUiKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCBubyBzcGVjaWFsIGF0dHJpYnV0ZXMgYXJlIHByZXNlbnQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjaWFscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKHNwZWNpYWxzW2ldKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgUmV0dXJuZWQgYXR0cmlidXRlICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzcGVjaWFsc1tpXSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSBvdXIgcmVzcG9uc2UKKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDMgUEFTU0VEIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCJGb3J3YXJkMDMgRkFJTEVEIC0iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNiLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNC5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5M2JkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA0LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0aW5nIGZvciBkb3VibGUgZm9yd2FyZGluZy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwNCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBmaXJzdCBzZXJ2bGV0CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9Gb3J3YXJkMDRhIik7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRm9yd2FyZDA0IEZBSUxFRCAtIE5vIHJlcXVlc3QgZGlzcGF0Y2hlciIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgL0ZvcndhcmQwNGEiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJkLmZvcndhcmQocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZvcndhcmQwNCB0ZXh0IHNob3VsZCBOT1QgYmUgcHJlc2VudCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhdGljIGxvZ2dlciBvdXRwdXQgKHNob3VsZCBub3QgYWN0dWFsbHkgYmUgcmVuZGVyZWQpCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDRhLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YWIzZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA0YS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogVGVzdGluZyBmb3IgZG91YmxlIGZvcndhcmRpbmcuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBGb3J3YXJkMDRhIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHNlY29uZCBzZXJ2bGV0CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9Gb3J3YXJkMDRiIik7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRm9yd2FyZDA0YSBGQUlMRUQgLSBObyByZXF1ZXN0IGRpc3BhdGNoZXIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIC9Gb3J3YXJkMDRiIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZC5mb3J3YXJkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDRhIHRleHQgc2hvdWxkIE5PVCBiZSBwcmVzZW50Iik7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNGIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDRiLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2MWYwOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDRiLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0aW5nIGZvciBkb3VibGUgZm9yd2FyZGluZy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwNGIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDRiIFBBU1NFRCIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA1LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA1LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlZjE3ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDUuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3RpbmcgZm9yIGRvdWJsZSBmb3J3YXJkaW5nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDA1IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGZpcnN0IHNlcnZsZXQKKyAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgcmQgPQorICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL0ZvcndhcmQwNWEuanNwIik7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRm9yd2FyZDA1IEZBSUxFRCAtIE5vIHJlcXVlc3QgZGlzcGF0Y2hlciIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgL0ZvcndhcmQwNWEuanNwIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZC5mb3J3YXJkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDUgdGV4dCBzaG91bGQgTk9UIGJlIHByZXNlbnQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXRpYyBsb2dnZXIgb3V0cHV0IChzaG91bGQgbm90IGFjdHVhbGx5IGJlIHJlbmRlcmVkKQorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA1YS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNWEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTExMTZlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNWEuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3RpbmcgZm9yIGRvdWJsZSBmb3J3YXJkaW5nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDA1YSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzZWNvbmQgc2VydmxldAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKCIvRm9yd2FyZDA1Yi5qc3AiKTsKKyAgICAgICAgaWYgKHJkID09IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDVhIEZBSUxFRCAtIE5vIHJlcXVlc3QgZGlzcGF0Y2hlciIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgL0ZvcndhcmQwNWIuanNwIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZC5mb3J3YXJkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDVhIHRleHQgc2hvdWxkIE5PVCBiZSBwcmVzZW50Iik7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNWIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDViLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyZDYzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDViLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0aW5nIGZvciBkb3VibGUgZm9yd2FyZGluZy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwNWIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDViIFBBU1NFRCIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA2LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA2LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlNDQwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDYuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3RpbmcgZm9yIGRvdWJsZSBmb3J3YXJkaW5nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDA2IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGZpcnN0IHNlcnZsZXQKKyAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgcmQgPQorICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL0ZvcndhcmQwNmEuanNwIik7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRm9yd2FyZDA1IEZBSUxFRCAtIE5vIHJlcXVlc3QgZGlzcGF0Y2hlciIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgL0ZvcndhcmQwNmEuanNwIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZC5mb3J3YXJkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDYgdGV4dCBzaG91bGQgTk9UIGJlIHByZXNlbnQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXRpYyBsb2dnZXIgb3V0cHV0IChzaG91bGQgbm90IGFjdHVhbGx5IGJlIHJlbmRlcmVkKQorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA2YS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNmEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWU0YmNmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNmEuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3RpbmcgZm9yIGRvdWJsZSBmb3J3YXJkaW5nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDA2YSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzZWNvbmQgc2VydmxldAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKCIvRm9yd2FyZDA2Yi5qc3AiKTsKKyAgICAgICAgaWYgKHJkID09IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDZhIEZBSUxFRCAtIE5vIHJlcXVlc3QgZGlzcGF0Y2hlciIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgL0ZvcndhcmQwNmIuanNwIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZC5mb3J3YXJkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDZhIHRleHQgc2hvdWxkIE5PVCBiZSBwcmVzZW50Iik7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNmIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDZiLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzNGJjZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDZiLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0aW5nIGZvciBkb3VibGUgZm9yd2FyZGluZy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwNmIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDZiIFBBU1NFRCIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA3LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwODMxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDcuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3RpbmcgZm9yIGRvdWJsZSBmb3J3YXJkaW5nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDA3IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGZpcnN0IHNlcnZsZXQKKyAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgcmQgPQorICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL3NlcnZsZXQvRm9yd2FyZDA3YSIpOworICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZvcndhcmQwNyBGQUlMRUQgLSBObyByZXF1ZXN0IGRpc3BhdGNoZXIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIC9zZXJ2bGV0L0ZvcndhcmQwN2EiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJkLmZvcndhcmQocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZvcndhcmQwNyB0ZXh0IHNob3VsZCBOT1QgYmUgcHJlc2VudCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhdGljIGxvZ2dlciBvdXRwdXQgKHNob3VsZCBub3QgYWN0dWFsbHkgYmUgcmVuZGVyZWQpCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDdhLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA3YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMDY5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA3YS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogVGVzdGluZyBmb3IgZG91YmxlIGZvcndhcmRpbmcuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBGb3J3YXJkMDdhIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHNlY29uZCBzZXJ2bGV0CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9Gb3J3YXJkMDdiIik7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRm9yd2FyZDA3YSBGQUlMRUQgLSBObyByZXF1ZXN0IGRpc3BhdGNoZXIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIC9Gb3J3YXJkMDdiIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZC5mb3J3YXJkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDdhIHRleHQgc2hvdWxkIE5PVCBiZSBwcmVzZW50Iik7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwN2IuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDdiLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhZmExYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDdiLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0aW5nIGZvciBkb3VibGUgZm9yd2FyZGluZy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwN2IgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDdiIFBBU1NFRCIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA4LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmZDk0NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDguamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3RpbmcgZm9yIGRvdWJsZSBmb3J3YXJkaW5nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDA4IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGZpcnN0IHNlcnZsZXQKKyAgICAgICAgbG9nKCJHZXR0aW5nIFJEIGZvciAvRm9yd2FyZDA4YSIpOworICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKCIvRm9yd2FyZDA4YSIpOworICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKCJNaXNzaW5nIFJEIGZvciAvRm9yd2FyZDA4YSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZvcndhcmQwOCBGQUlMRUQgLSBObyByZXF1ZXN0IGRpc3BhdGNoZXIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIC9Gb3J3YXJkMDhhIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2coIkZvcndhcmRpbmcgdG8gL0ZvcndhcmQwOGEiKTsKKyAgICAgICAgICAgIHJkLmZvcndhcmQocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgbG9nKCJSZXR1cm5lZCBmcm9tIC9Gb3J3YXJkMDhhIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRm9yd2FyZDA4IHRleHQgc2hvdWxkIE5PVCBiZSBwcmVzZW50Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGF0aWMgbG9nZ2VyIG91dHB1dCAoc2hvdWxkIG5vdCBhY3R1YWxseSBiZSByZW5kZXJlZCkKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwOGEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDhhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2Nzc1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDhhLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0aW5nIGZvciBkb3VibGUgZm9yd2FyZGluZy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwOGEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgc2Vjb25kIHNlcnZsZXQKKyAgICAgICAgbG9nKCJHZXR0aW5nIFJEIGZvciAvc2VydmxldC9Gb3J3YXJkMDhiIik7CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9zZXJ2bGV0L0ZvcndhcmQwOGIiKTsKKyAgICAgICAgaWYgKHJkID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZygiTWlzc2luZyBSRCBmb3IgL3NlcnZsZXQvRm9yd2FyZDA4YiIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZvcndhcmQwOGEgRkFJTEVEIC0gTm8gcmVxdWVzdCBkaXNwYXRjaGVyIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciAvc2VydmxldC9Gb3J3YXJkMDhiIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2coIkZvcndhcmRpbmcgdG8gL3NlcnZsZXQvRm9yd2FyZDA4YiIpOworICAgICAgICAgICAgcmQuZm9yd2FyZChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICBsb2coIlJldHVybmVkIGZyb20gL3NlcnZsZXQvRm9yd2FyZDA4YiIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZvcndhcmQwOGEgdGV4dCBzaG91bGQgTk9UIGJlIHByZXNlbnQiKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA4Yi5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwOGIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWMzNjRjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwOGIuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3RpbmcgZm9yIGRvdWJsZSBmb3J3YXJkaW5nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDA4YiBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIkZvcndhcmQwOGIgUEFTU0VEIik7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDkuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzdlYzI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwOS5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogRXhlcmNpc2UgYmFzaWMgZm9yd2FyZGluZyBmdW5jdGlvbmFsaXR5IHVzaW5nCisgKiA8Y29kZT5yZXF1ZXN0LmdldFJlcXVlc3REaXNwYXRjaGVyKCk8L2NvZGU+LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDA5IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHBhdGggdG8gd2hpY2ggd2Ugd2lsbCBpc3N1ZSBhIGZvcndhcmQKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcGF0aCA9ICIvRm9yd2FyZDAwYSI7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCBkaXNwYXRjaGVyIGFuZCBjYWxsIGZvcndhcmQoKSBvbiBpdAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9IHJlcXVlc3QuZ2V0UmVxdWVzdERpc3BhdGNoZXIocGF0aCk7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBObyBSZXF1ZXN0RGlzcGF0Y2hlciByZXR1cm5lZC8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICAgICAgcmQuZm9yd2FyZChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSBvdXIgcmVzcG9uc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpID49IDEpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiRm9yd2FyZDA5IEZBSUxFRCAtIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvR2V0SGVhZGVyczAxLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvR2V0SGVhZGVyczAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlMGY1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9HZXRIZWFkZXJzMDEuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3QgcmV0cmlldmFsIG9mIGhlYWRlcnMuICBUaGUgY2xpZW50IGlzIGV4cGVjdGVkIHRvIHNlbmQgdHdvCisgKiAiQWNjZXB0LUxhbmd1YWdlIiBoZWFkZXJzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgR2V0SGVhZGVyczAxIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIEFycmF5TGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEVudW1lcmF0aW9uIGhlYWRlcnMgPSByZXF1ZXN0LmdldEhlYWRlcnMoIkFjY2VwdC1MYW5ndWFnZSIpOworICAgICAgICB3aGlsZSAoaGVhZGVycy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9IChTdHJpbmcpIGhlYWRlcnMubmV4dEVsZW1lbnQoKSArICIsIjsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaW50IGNvbW1hID0gaGVhZGVyLmluZGV4T2YoIiwiKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tbWEgPCAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBoZWFkZXIuc3Vic3RyaW5nKDAsIGNvbW1hKS50cmltKCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaGVhZGVyID0gaGVhZGVyLnN1YnN0cmluZyhjb21tYSArIDEpLnRyaW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWVzLnNpemUoKSAhPSAyKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkdldEhlYWRlcnMwMSBGQUlMRUQgLSBSZXR1cm5lZCAiICsgdmFsdWVzLnNpemUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhlYWRlcnMgaW5zdGVhZCBvZiAyIik7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlcy5nZXQoMCkgPT0gdmFsdWVzLmdldCgxKSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJHZXRIZWFkZXJzMDEgRkFJTEVEIC0gUmV0dXJuZWQgaWRlbnRpY2FsIHZhbHVlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZhbHVlcy5nZXQoMCkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCJlbi11cyIuZXF1YWxzKChTdHJpbmcpIHZhbHVlcy5nZXQoaSkpKQorICAgICAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoImVuLWdiIi5lcXVhbHMoKFN0cmluZykgdmFsdWVzLmdldChpKSkpCisgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuICE9IDIpCisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkdldEhlYWRlcnMwMSBGQUlMRUQgLSBSZXR1cm5lZCB1bmtub3duIHZhbHVlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2YWx1ZXMuZ2V0KDApICsgIiBhbmQgIiArIHZhbHVlcy5nZXQoMSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJHZXRIZWFkZXJzMDEgUEFTU0VEIik7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0dldElucHV0U3RyZWFtMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9HZXRJbnB1dFN0cmVhbTAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlYzIwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9HZXRJbnB1dFN0cmVhbTAxLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0IGdldHRpbmcgdGhlIHNlcnZsZXQgaW5wdXQgc3RyZWFtIGFmdGVyIHdlIGhhdmUgcmV0cmlldmVkIHRoZSByZWFkZXIuCisgKiBUaGlzIHNob3VsZCB0aHJvdyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBHZXRJbnB1dFN0cmVhbTAxIGV4dGVuZHMgR2VuZXJpY1NlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IHJlcXVlc3QuZ2V0UmVhZGVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTZXJ2bGV0SW5wdXRTdHJlYW0gc2lzID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkdldElucHV0U3RyZWFtMDEgRkFJTEVEIC0gRGlkIG5vdCB0aHJvdyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJHZXRJbnB1dFN0cmVhbTAxIFBBU1NFRCIpOworICAgICAgICB9CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9HZXRMb2NhbGVzMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9HZXRMb2NhbGVzMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzQ2NGJkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0dldExvY2FsZXMwMS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogUGFydCAxIG9mIHRoZSByZXF1ZXN0IGxvY2FsZSB0ZXN0cy4gIFNob3VsZCByZWNlaXZlIGEgTG9jYWxlIHRoYXQKKyAqIGNvcnJlc3BvbmRzIHRvICJlbl9DQSIgQWNjZXB0LUxhbmd1YWdlIGhlYWRlciB0aGF0IGlzIHNlbnQgZmlyc3QuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBHZXRMb2NhbGVzMDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnJlc2V0KCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIExvY2FsZSBleHBlY3RlZCA9IG5ldyBMb2NhbGUoImVuIiwgIkNBIik7CisgICAgICAgIExvY2FsZSByZWNlaXZlZCA9IHJlcXVlc3QuZ2V0TG9jYWxlKCk7CisgICAgICAgIGlmIChyZWNlaXZlZCA9PSBudWxsKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkdldExvY2FsZXMwMSBGQUlMRUQgLSBObyBsb2NhbGUgd2FzIHJlY2VpdmVkIik7CisgICAgICAgIGVsc2UgaWYgKCFleHBlY3RlZC5lcXVhbHMocmVjZWl2ZWQpKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkdldExvY2FsZXMwMSBGQUlMRUQgLSBFeHBlY3RlZD0nIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC50b1N0cmluZygpICsgIicgUmVjZWl2ZWQ9JyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQudG9TdHJpbmcoKSArICInIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJHZXRMb2NhbGVzMDEgUEFTU0VEIik7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvR2V0TG9jYWxlczAyLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvR2V0TG9jYWxlczAyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5YjgxOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9HZXRMb2NhbGVzMDIuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBQYXJ0IDIgb2YgdGhlIHJlcXVlc3QgbG9jYWxlIHRlc3RzLiAgU2hvdWxkIHJlY2VpdmUgYSBMb2NhbGUgdGhhdAorICogY29ycmVzcG9uZHMgdG8gImVuX0NBIiBhbmQgdGhlbiAiZW5fR0IiIGFzIHNlbnQgYnkgdGhlIGNsaWVudCBpbgorICogIkFjY2VwdC1MYW5ndWFnZSIgaGVhZGVycy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEdldExvY2FsZXMwMiBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2UucmVzZXQoKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisKKyAgICAgICAgRW51bWVyYXRpb24gbG9jYWxlcyA9IHJlcXVlc3QuZ2V0TG9jYWxlcygpOworICAgICAgICBpZiAobG9jYWxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBObyBsb2NhbGVzIHJldHVybmVkLyIpOworICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgaWYgKGxvY2FsZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBMb2NhbGUgZXhwZWN0ZWQgPSBuZXcgTG9jYWxlKCJlbiIsICJDQSIpOworICAgICAgICAgICAgICAgIExvY2FsZSByZWNlaXZlZCA9IChMb2NhbGUpIGxvY2FsZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkLmVxdWFscyhyZWNlaXZlZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgRXhwZWN0ZWQxPSciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnRvU3RyaW5nKCkgKyAiJyBSZWNlaXZlZDE9JyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQudG9TdHJpbmcoKSArICInIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBaZXJvIGxvY2FsZXMgcmV0dXJuZWQvIik7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgaWYgKGxvY2FsZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBMb2NhbGUgZXhwZWN0ZWQgPSBuZXcgTG9jYWxlKCJlbiIsICJHQiIpOworICAgICAgICAgICAgICAgIExvY2FsZSByZWNlaXZlZCA9IChMb2NhbGUpIGxvY2FsZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkLmVxdWFscyhyZWNlaXZlZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgRXhwZWN0ZWQyPSciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnRvU3RyaW5nKCkgKyAiJyBSZWNlaXZlZDI9JyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQudG9TdHJpbmcoKSArICInIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBPbmUgbG9jYWxlIHJldHVybmVkLyIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIGlmIChsb2NhbGVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgTW9yZSB0aGFuIHR3byBsb2NhbGVzIHJldHVybmVkLyIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob2sgJiYgKHNiLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJHZXRMb2NhbGVzMDIgUEFTU0VEIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIkdldExvY2FsZXMwMiBGQUlMRUQgLSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc2IudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0dldFBhcmFtZXRlcjAxLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvR2V0UGFyYW1ldGVyMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2NhYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0dldFBhcmFtZXRlcjAxLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0IHJldHJpZXZhbCBvZiBwYXJhbWV0ZXJzLiAgVGhlIGNsaWVudCBpcyBleHBlY3RlZCB0byBzZW5kIGEgcmVxdWVzdAorICogVVJJIGxpa2UgIi90ZXN0ZXIvR2V0UGFyYW1ldGVyMDE/Zm9vPTEiLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgR2V0UGFyYW1ldGVyMDEgZXh0ZW5kcyBHZW5lcmljU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gIjEiOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImZvbyIpOworICAgICAgICBpZiAoZXhwZWN0ZWQuZXF1YWxzKHJlc3VsdCkpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJHZXRQYXJhbWV0ZXIwMSBQQVNTRUQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJHZXRQYXJhbWV0ZXIwMSBGQUlMRUQgLSBSZWNlaXZlZCAnIiArIHJlc3VsdCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpbnN0ZWFkIG9mICciICsgZXhwZWN0ZWQgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9HZXRQYXJhbWV0ZXJNYXAwMC5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0dldFBhcmFtZXRlck1hcDAwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5ZWU0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9HZXRQYXJhbWV0ZXJNYXAwMC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0IGdldHRpbmcgdGhlIHNlcnZsZXQgaW5wdXQgc3RyZWFtIGFmdGVyIHdlIGhhdmUgcmV0cmlldmVkIHRoZSByZWFkZXIuCisgKiBUaGlzIHNob3VsZCB0aHJvdyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBHZXRQYXJhbWV0ZXJNYXAwMCBleHRlbmRzIEdlbmVyaWNTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBTdHJpbmcgZXJyb3JzID0gIiI7CisgICAgICAgIE1hcCBtYXAgPSByZXF1ZXN0LmdldFBhcmFtZXRlck1hcCgpOworICAgICAgICBpZiAobWFwID09IG51bGwpCisgICAgICAgICAgICBlcnJvcnMgKz0gIiAgZ2V0UGFyYW1ldGVyTWFwKCkgcmV0dXJuZWQgbnVsbC4iOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtYXAuc2l6ZSgpICE9IDIpCisgICAgICAgICAgICAgICAgZXJyb3JzICs9ICIgIG1hcCBzaXplIGlzICIgKyBtYXAuc2l6ZSgpICsgIi4iOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlMVtdID0gKFN0cmluZ1tdKSBtYXAuZ2V0KCJCZXN0TGFuZ3VhZ2UiKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBlcnJvcnMgKz0gIiAgQmVzdExhbmd1YWdlIGlzIE5VTEwuIjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlMS5sZW5ndGggIT0gMSkKKyAgICAgICAgICAgICAgICBlcnJvcnMgKz0gIiAgQmVzdExhbmd1YWdlIGhhcyAiICsgdmFsdWUxLmxlbmd0aCArICIgdmFsdWVzLiI7CisgICAgICAgICAgICBlbHNlIGlmICghdmFsdWUxWzBdLmVxdWFscygiSmF2YSIpKQorICAgICAgICAgICAgICAgIGVycm9ycyArPSAiICBCZXN0TGFuZ3VhZ2UgaXMgIiArIHZhbHVlMSArICIuIjsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZTJbXSA9IChTdHJpbmdbXSkgbWFwLmdldCgiQmVzdEpTUCIpOworICAgICAgICAgICAgaWYgKHZhbHVlMiA9PSBudWxsKQorICAgICAgICAgICAgICAgIGVycm9ycyArPSAiICBCZXN0SlNQIGlzIE5VTEwuIjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlMi5sZW5ndGggIT0gMSkKKyAgICAgICAgICAgICAgICBlcnJvcnMgKz0gIiAgQmVzdEpTUCBoYXMgIiArIHZhbHVlMi5sZW5ndGggKyAiIHZhbHVlcy4iOworICAgICAgICAgICAgZWxzZSBpZiAoIXZhbHVlMlswXS5lcXVhbHMoIkphdmEyIikpCisgICAgICAgICAgICAgICAgZXJyb3JzICs9ICIgIEJlc3RKU1AgaXMgIiArIHZhbHVlMiArICIuIjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWFwLnB1dCgiQUJDIiwgIlhZWiIpOworICAgICAgICAgICAgICAgIGVycm9ycyArPSAiICAgbWFwLnB1dCgpIHdhcyBhbGxvd2VkLiI7CisgICAgICAgICAgICAgICAgaWYgKG1hcC5nZXQoIkFCQyIpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGVycm9ycyArPSAiICBtYXAgaXMgbm90IGltbXV0YWJsZS4iOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyb3JzLmVxdWFscygiIikpCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiR2V0UGFyYW1ldGVyTWFwMDAgUEFTU0VEIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkdldFBhcmFtZXRlck1hcDAwIEZBSUxFRDoiICsgZXJyb3JzKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvR2V0UXVlcnlTdHJpbmcwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0dldFF1ZXJ5U3RyaW5nMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzYyMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0dldFF1ZXJ5U3RyaW5nMDEuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3QgcmV0cmlldmFsIG9mIHF1ZXJ5IHN0cmluZy4gIFRoZSBjbGllbnQgaXMgZXhwZWN0ZWQgdG8gc2VuZCBhIHJlcXVlc3QKKyAqIFVSSSBsaWtlICIvdGVzdGVyL0dldFF1ZXJ5U3RyaW5nMDE/Zm9vPTEiLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgR2V0UXVlcnlTdHJpbmcwMSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiZm9vPTEiOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpOworICAgICAgICBpZiAoZXhwZWN0ZWQuZXF1YWxzKHJlc3VsdCkpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJHZXRRdWVyeVN0cmluZzAxIFBBU1NFRCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkdldFF1ZXJ5U3RyaW5nMDEgRkFJTEVEIC0gUmVjZWl2ZWQgJyIgKyByZXN1bHQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgaW5zdGVhZCBvZiAnIiArIGV4cGVjdGVkICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvR29sZGVuMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Hb2xkZW4wMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNmU5ODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvR29sZGVuMDEuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFNpbXBsZSB0ZXN0IGZvciB0aGUgZ29sZGVuIGZpbGUgbWVjaGFuaXNtLiAgVGhpcyB0ZXN0IGdlbmVyYXRlcyBhIHJlc3BvbnNlCisgKiB3aXRoIGtub3duIGNvbnRlbnRzIGZvciBjb21wYXJpc29uIHRvIHRoZSBnb2xkZW4gZmlsZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEdvbGRlbjAxIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICB3cml0ZXIucHJpbnRsbigiVGhpcyBpcyB0aGUiKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oImZpcnN0IGdvbGRlbiBmaWxlIik7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJ0byBiZSB0ZXN0ZWQuIik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMC5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYWJjMjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTAwLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBFeGVyY2lzZSBiYXNpYyBpbmNsdWRpbmcgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEluY2x1ZGUwMCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKwlQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBBY3F1aXJlIHRoZSBwYXRoIHRvIHdoaWNoIHdlIHdpbGwgaXNzdWUgYSBpbmNsdWRlCisgICAgICAgIFN0cmluZyBwYXRoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhdGgiKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHBhdGggPSAiL0luY2x1ZGUwMGEiOworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIGZsdXNoIGZsYWcKKyAgICAgICAgYm9vbGVhbiBmbHVzaCA9ICJ0cnVlIi5lcXVhbHMocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImZsdXNoIikpOworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlICJjcmVhdGUgYSBzZXNzaW9uIiBmbGFnCisgICAgICAgIGJvb2xlYW4gY3JlYXRlID0gInRydWUiLmVxdWFscyhyZXF1ZXN0LmdldFBhcmFtZXRlcigiY3JlYXRlIikpOworCisgICAgICAgIC8vIENyZWF0ZSBhIHJlcXVlc3QgZGlzcGF0Y2hlciBhbmQgY2FsbCBpbmNsdWRlKCkgb24gaXQKKyAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgcmQgPSBudWxsOworICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIhIikpCisgICAgICAgICAgICByZCA9IGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0TmFtZWREaXNwYXRjaGVyKHBhdGguc3Vic3RyaW5nKDEpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmQgPSBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKHBhdGgpOworICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgTm8gUmVxdWVzdERpc3BhdGNoZXIgcmV0dXJuZWQvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uOworICAgICAgICAgICAgaWYgKGNyZWF0ZSkgeworICAgICAgICAgICAgICAgIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmbHVzaCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmZsdXNoQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBGbHVzaCB0aHJldyBJT0V4Y2VwdGlvbi8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgICAgIHJkLmluY2x1ZGUocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV3JpdGUgb3VyIHJlc3BvbnNlIGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+PSAxKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIkluY2x1ZGUwMCBGQUlMRUQgLSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMGEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDBhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkYjcyMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDBhLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBFeGVyY2lzZSBiYXNpYyBpbmNsdWRpbmcgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEluY2x1ZGUwMGEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gV3JpdGUgb3VyIHJlc3BvbnNlIGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAgICAgIHdyaXRlci5wcmludCgiSW5jbHVkZTAwYSBQQVNTRUQiKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMGQuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDBkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M1MGY0NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDBkLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBFeGVyY2lzZSBiYXNpYyBpbmNsdWRpbmcgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEluY2x1ZGUwMGQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gV3JpdGUgb3VyIHJlc3BvbnNlIGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAgICAgIHdyaXRlci5wcmludCgiSW5jbHVkZTAwZCBQQVNTRUQiKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYjFkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTAxLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBQb3NpdGl2ZSB0ZXN0IGZvciBpbmNsdWRpbmcgYSBzdGF0aWMgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBJbmNsdWRlMDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKCIvSW5jbHVkZTAxLnR4dCIpOworICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiSW5jbHVkZTAxIEZBSUxFRCAtIE5vIFJlcXVlc3REaXNwYXRjaGVyIHJldHVybmVkIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcmQuaW5jbHVkZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTAyLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTAyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVkNGY3MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDIuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBQb3NpdGl2ZSB0ZXN0IGZvciBoYW5kbGluZyBleGNlcHRpb25zIHRocm93biBieSBhbiBpbmNsdWRlZCBzZXJ2bGV0LgorICogUmVxdWVzdCBwYXJhbWV0ZXIgPHN0cm9uZz5leGNlcHRpb248L3N0cm9uZz4gaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgdHlwZQorICogb2YgZXhjZXB0aW9uIHRoYXQgc2hvdWxkIGJlIHRocm93biwgd2hpY2ggbXVzdCBiZSBvbmUgb2YKKyAqIDxjb2RlPklPRXhjZXB0aW9uPC9jb2RlPiwgPGNvZGU+U2VydmxldEV4Y2VwdGlvbjwvY29kZT4sIG9yCisgKiA8Y29kZT5TZXJ2bGV0RXhjZXB0aW9uPC9jb2RlPi4gIEFjY29yZGluZyB0byB0aGUgc3BlYywgYW55IGV4Y2VwdGlvbnMgb2YKKyAqIHRoZXNlIHR5cGVzIHNob3VsZCBiZSBwcm9wb2dhdGVkIGJhY2sgdG8gdGhlIGNhbGxlciB1bmNoYW5nZWQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBJbmNsdWRlMDIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBib29sZWFuIG9rID0gdHJ1ZTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKwlQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgcmQgPQorICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL0luY2x1ZGUwMmEiKTsKKyAgICAgICAgaWYgKHJkID09IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJJbmNsdWRlMDIgRkFJTEVEIC0gTm8gUmVxdWVzdERpc3BhdGNoZXIgcmV0dXJuZWQiKTsKKwkgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfQorCVN0cmluZyB0eXBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImV4Y2VwdGlvbiIpOworCWlmIChvaykgeworCSAgICBpZiAodHlwZSA9PSBudWxsKSB7CisJICAgICAgICB3cml0ZXIucHJpbnRsbigiSW5jbHVkZTAyIEZBSUxFRCAtIE5vIGV4Y2VwdGlvbiB0eXBlIHNwZWNpZmllZCIpOworCQlvayA9IGZhbHNlOworCSAgICB9IGVsc2UgaWYgKCF0eXBlLmVxdWFscygiSU9FeGNlcHRpb24iKSAmJgorCQkgICAgICAgIXR5cGUuZXF1YWxzKCJTZXJ2bGV0RXhjZXB0aW9uIikgJiYKKwkJICAgICAgICF0eXBlLmVxdWFscygiTnVsbFBvaW50ZXJFeGNlcHRpb24iKSkgeworCSAgICAgICAgd3JpdGVyLnByaW50bG4oIkluY2x1ZGUwMiBGQUlMRUQgLSBJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlICIgKworCQkJICAgICAgIHR5cGUgKyAiIHJlcXVlc3RlZCIpOworCQlvayA9IGZhbHNlOworCSAgICB9CisJfQorCisJSU9FeGNlcHRpb24gaW9FeGNlcHRpb24gPSBudWxsOworCVNlcnZsZXRFeGNlcHRpb24gc2VydmxldEV4Y2VwdGlvbiA9IG51bGw7CisJVGhyb3dhYmxlIHRocm93YWJsZSA9IG51bGw7CisJdHJ5IHsKKyAgICAgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgICAgICByZC5pbmNsdWRlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJICAgIGlvRXhjZXB0aW9uID0gZTsKKwl9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKKwkgICAgc2VydmxldEV4Y2VwdGlvbiA9IGU7CisJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkgICAgdGhyb3dhYmxlID0gZTsKKwl9CisKKwlpZiAob2spIHsKKyAgICAgICAgICAgIGlmICh0eXBlLmVxdWFscygiSU9FeGNlcHRpb24iKSkgeworICAgICAgICAgICAgICAgIGlmIChpb0V4Y2VwdGlvbiA9PSBudWxsKSB7CisJCSAgICB3cml0ZXIucHJpbnRsbigiSW5jbHVkZTAyIEZBSUxFRCAtIE5vIElPRXhjZXB0aW9uIHRocm93biIpOworCQkgICAgb2sgPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJICAgIFN0cmluZyBtZXNzYWdlID0gaW9FeGNlcHRpb24uZ2V0TWVzc2FnZSgpOworCQkgICAgaWYgKCEiSW5jbHVkZTAyIElPRXhjZXB0aW9uIi5lcXVhbHMobWVzc2FnZSkpIHsKKwkJICAgICAgICB3cml0ZXIucHJpbnRsbigiSW5jbHVkZTAyIEZBSUxFRCAtIElPRXhjZXB0aW9uIHdhcyAiICsKKwkJCQkgICAgICAgbWVzc2FnZSk7CisJCQlvayA9IGZhbHNlOworCQkgICAgfQorCQl9CisJICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoIlNlcnZsZXRFeGNlcHRpb24iKSkgeworICAgICAgICAgICAgICAgIGlmIChzZXJ2bGV0RXhjZXB0aW9uID09IG51bGwpIHsKKwkJICAgIHdyaXRlci5wcmludGxuKCJJbmNsdWRlMDIgRkFJTEVEIC0gTm8gU2VydmxldEV4Y2VwdGlvbiB0aHJvd24iKTsKKwkJICAgIG9rID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCSAgICBTdHJpbmcgbWVzc2FnZSA9IHNlcnZsZXRFeGNlcHRpb24uZ2V0TWVzc2FnZSgpOworCQkgICAgaWYgKCEiSW5jbHVkZTAyIFNlcnZsZXRFeGNlcHRpb24iLmVxdWFscyhtZXNzYWdlKSkgeworCQkgICAgICAgIHdyaXRlci5wcmludGxuKCJJbmNsdWRlMDIgRkFJTEVEIC0gU2VydmxldEV4Y2VwdGlvbiB3YXMgIiArCisJCQkJICAgICAgIG1lc3NhZ2UpOworCQkJb2sgPSBmYWxzZTsKKwkJICAgIH0KKwkJfQorCSAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHRocm93YWJsZSA9PSBudWxsKSB7CisJCSAgICB3cml0ZXIucHJpbnRsbigiSW5jbHVkZTAyIEZBSUxFRCAtIE5vIE51bGxQb2ludGVyRXhjZXB0aW9uIHRocm93biIpOworCQkgICAgb2sgPSBmYWxzZTsKKwkJfSBlbHNlIGlmICghKHRocm93YWJsZSBpbnN0YW5jZW9mIE51bGxQb2ludGVyRXhjZXB0aW9uKSkgeworCQkgICAgd3JpdGVyLnByaW50bG4oIkluY2x1ZGUwMiBGQUlMRUQgLSBUaHJvd24gRXhjZXB0aW9uIHdhcyAiICsKKwkJCQkgICB0aHJvd2FibGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCQkgICAgb2sgPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJICAgIFN0cmluZyBtZXNzYWdlID0gdGhyb3dhYmxlLmdldE1lc3NhZ2UoKTsKKwkJICAgIGlmICghIkluY2x1ZGUwMiBOdWxsUG9pbnRlckV4Y2VwdGlvbiIuZXF1YWxzKG1lc3NhZ2UpKSB7CisJCSAgICAgICAgd3JpdGVyLnByaW50bG4oIkluY2x1ZGUwMiBGQUlMRUQgLSBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgIiArCisJCQkJICAgICAgIG1lc3NhZ2UpOworCQkJb2sgPSBmYWxzZTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCisJaWYgKG9rKQorCSAgICB3cml0ZXIucHJpbnRsbigiSW5jbHVkZTAyIFBBU1NFRCIpOworICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMmEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDJhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzNjI2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDJhLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBJbmNsdWRlZCBzZXJ2bGV0IGZvciB0aGUgdGVzdCBwZXJmb3JtZWQgYnkgSW5jbHVkZTAyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTAyYSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyB0eXBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImV4Y2VwdGlvbiIpOworCWlmICh0eXBlID09IG51bGwpCisJICAgIHJldHVybjsKKwllbHNlIGlmICh0eXBlLmVxdWFscygiSU9FeGNlcHRpb24iKSkKKwkgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbmNsdWRlMDIgSU9FeGNlcHRpb24iKTsKKwllbHNlIGlmICh0eXBlLmVxdWFscygiU2VydmxldEV4Y2VwdGlvbiIpKQorCSAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiSW5jbHVkZTAyIFNlcnZsZXRFeGNlcHRpb24iKTsKKwllbHNlIGlmICh0eXBlLmVxdWFscygiTnVsbFBvaW50ZXJFeGNlcHRpb24iKSkKKwkgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJJbmNsdWRlMDIgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMy5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZjhhOTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTAzLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogVGVzdCB0byBpbnN1cmUgdGhhdCBhbiBpbmNsdWRlZCBzZXJ2bGV0IGNhbiBzZXQgcmVxdWVzdCBhdHRyaWJ1dGVzIHRoYXQgYXJlCisgKiB2aXNpYmxlIHRvIHRoZSBjYWxsaW5nIHNlcnZsZXQgYWZ0ZXIgdGhlIDxjb2RlPmluY2x1ZGUoKTwvY29kZT4gcmV0dXJucy4KKyAqIFRoZSBzcGVjIGlzIHNpbGVudCBvbiB0aGlzIHRvcGljLCBidXQgaXQgc2VlbXMgY29uc2lzdGVudCB3aXRoIHRoZSBvdmVyYWxsCisgKiBpbnRlbnQgdG8gYmVoYXZlIGluIHRoaXMgbWFubmVyLgorICoKKyAqIFRoZSB0ZXN0IGluY2x1ZGVzIGVpdGhlciBhIHNlcnZsZXQgKCIvSW5jbHVkZTAzYSIpIG9yIGEgSlNQIHBhZ2UKKyAqICgiL0luY2x1ZGUwM2IuanNwIikgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBzcGVjaWZpZWQgZm9yIHRoZSAicGF0aCIKKyAqIHBhcmFtZXRlci4gIFRoZSBkZWZhdWx0IGlzIHRoZSBzZXJ2bGV0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTAzIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNwZWNpYWxzW10gPQorICAgIHsgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5yZXF1ZXN0X3VyaSIsCisgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLmNvbnRleHRfcGF0aCIsCisgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLnNlcnZsZXRfcGF0aCIsCisgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLnBhdGhfaW5mbyIsCisgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLnF1ZXJ5X3N0cmluZyIgfTsKKworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKwlQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBBY3F1aXJlIHRoZSBwYXRoIHRvIHdoaWNoIHdlIHdpbGwgaXNzdWUgYW4gaW5jbHVkZQorICAgICAgICBTdHJpbmcgcGF0aCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXRoIik7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpCisgICAgICAgICAgICBwYXRoID0gIi9JbmNsdWRlMDNhIjsKKworICAgICAgICAvLyBDcmVhdGUgYSByZXF1ZXN0IGRpc3BhdGNoZXIgYW5kIGNhbGwgaW5jbHVkZSgpIG9uIGl0CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIocGF0aCk7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBObyBSZXF1ZXN0RGlzcGF0Y2hlciByZXR1cm5lZC8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJkLmluY2x1ZGUocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9CisgICAgICAgIHJlc3BvbnNlLnJlc2V0QnVmZmVyKCk7CisKKyAgICAgICAgLy8gV2UgTVVTVCBiZSBhYmxlIHRvIHNlZSB0aGUgYXR0cmlidXRlIGNyZWF0ZWQgYnkgdGhlIGluY2x1ZGVlCisgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRBdHRyaWJ1dGUocGF0aC5zdWJzdHJpbmcoMSkpOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgUmV0dXJuZWQgYXR0cmlidXRlIG5vdCBvZiB0eXBlIFN0cmluZy8iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHNiLmxlbmd0aCgpIDwgMSkgJiYgKHZhbHVlID09IG51bGwpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBObyBpbmNsdWRlZS1jcmVhdGVkIGF0dHJpYnV0ZSB3YXMgcmV0dXJuZWQvIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBNVVNUIE5PVCBzZWUgdGhlIHNwZWNpYWwgYXR0cmlidXRlcyBjcmVhdGVkIGJ5IHRoZSBjb250YWluZXIKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjaWFscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKHNwZWNpYWxzW2ldKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgUmV0dXJuZWQgYXR0cmlidXRlICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzcGVjaWFsc1tpXSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSBvdXIgcmVzcG9uc2UKKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJJbmNsdWRlMDMgUEFTU0VEIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCJJbmNsdWRlMDMgRkFJTEVEIC0iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNiLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwM2EuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDNhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmNWE1YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDNhLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0IHRvIGluc3VyZSB0aGF0IGFuIGluY2x1ZGVkIHNlcnZsZXQgY2FuIHNldCByZXF1ZXN0IGF0dHJpYnV0ZXMgdGhhdCBhcmUKKyAqIHZpc2libGUgdG8gdGhlIGNhbGxpbmcgc2VydmxldCBhZnRlciB0aGUgPGNvZGU+aW5jbHVkZSgpPC9jb2RlPiByZXR1cm5zLgorICogVGhlIHNwZWMgaXMgc2lsZW50IG9uIHRoaXMgdG9waWMsIGJ1dCBpdCBzZWVtcyBjb25zaXN0ZW50IHdpdGggdGhlIG92ZXJhbGwKKyAqIGludGVudCB0byBiZWhhdmUgaW4gdGhpcyBtYW5uZXIuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBJbmNsdWRlMDNhIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiSW5jbHVkZTAzYSIsICJUaGlzIGlzIGEgbmV3IGF0dHJpYnV0ZSIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA0LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1YmEzMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDQuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3QgdG8gZW5zdXJlIHRoYXQgd2UgY2FuIGluY2x1ZGUgYSBzZXJ2bGV0ICh3aXRob3V0IGZsdXNoaW5nIHRoZSBidWZmZXIpLAorICogdGhlbiBmb3J3YXJkIHRvIGFub3RoZXIgc2VydmxldCB0aGF0IHJlcGxhY2VzIHRoZSBvcmlnaW5hbCBjb250ZW50cy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEluY2x1ZGUwNCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICByZXNwb25zZS5zZXRCdWZmZXJTaXplKDgxOTIpOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gSW5jbHVkZSBvdXIgZmlyc3Qgc3Vic2VydmxldAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZDEgPQorICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9JbmNsdWRlMDRhIik7CisgICAgICAgIGlmIChyZDEgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgTm8gUkQgZm9yICcvSW5jbHVkZTA0YScvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZDEuaW5jbHVkZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGb3J3YXJkIHRvIG91ciBzZWNvbmQgc3Vic2VydmxldAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZDIgPQorICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9JbmNsdWRlMDRiIik7CisgICAgICAgIGlmIChyZDIgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCJObyBSRCBmb3IgJy9JbmNsdWRlMDRiJy8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZDIuZm9yd2FyZChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBcHBlbmQgZXJyb3IgbWVzc2FnZXMgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiSW5jbHVkZTA0IEZBSUxFRCAtIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDRhLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYWE3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA0YS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogRmlyc3Qgc3Vic2VydmxldCBmb3IgImluY2x1ZGUgdGhlbiBmb3J3YXJkIiB0ZXN0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTA0YSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKwlQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIkluY2x1ZGUwNGEgUEFTU0VEIik7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDRiLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA0Yi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OWEzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA0Yi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogU2Vjb25kIHN1YnNlcnZsZXQgZm9yICJpbmNsdWRlIHRoZW4gZm9yd2FyZCIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEluY2x1ZGUwNGIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJJbmNsdWRlMDRiIFBBU1NFRCIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA2YS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwNmEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTExZmFmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwNmEuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIEZpcnN0IHN1YnNlcnZsZXQgZm9yICJpbmNsdWRlIHRoZW4gaW5jbHVkZSIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEluY2x1ZGUwNmEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJJbmNsdWRlMDZhIG91dHB1dCIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA3LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmOWE1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDcuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3QgdGhhdCBpbnN1cmVzIHdlIGNhbiBpbmNsdWRlIGEgc2VydmxldCB0aGF0IGRvZXMgYSBmb3J3YXJkLCB0aGVuCisgKiBpbmNsdWRlcyBhbm90aGVyIHNlcnZsZXQsIGFuZCB3ZSBzZWUgYWxsIG9mIHRoZSBvdXRwdXQgaW4gdGhlIHJpZ2h0IG9yZGVyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTA3IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIHJlc3BvbnNlLnNldEJ1ZmZlclNpemUoODE5Mik7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJPdXRwdXQgZnJvbSBJbmNsdWRlMDciKTsKKworICAgICAgICAvLyBJbmNsdWRlIG91ciBmaXJzdCBzdWJzZXJ2bGV0CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkMSA9CisgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL0luY2x1ZGUwN2EiKTsKKyAgICAgICAgaWYgKHJkMSA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiTm8gUkQgZm9yICcvSW5jbHVkZTA3YSciKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJkMS5pbmNsdWRlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluY2x1ZGUgb3VyIHNlY29uZCBzdWJzZXJ2bGV0CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkMiA9CisgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL0luY2x1ZGUwN2MiKTsKKyAgICAgICAgaWYgKHJkMiA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiTm8gUkQgZm9yICcvSW5jbHVkZTA3YyciKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJkMi5pbmNsdWRlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmlzaCB0aGlzIHJlc3BvbnNlCisgICAgICAgIHdyaXRlci5wcmludGxuKCJPdXRwdXQgZnJvbSBJbmNsdWRlMDciKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwN2EuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDdhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4YjU1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDdhLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0IHRoYXQgaW5zdXJlcyB3ZSBjYW4gaW5jbHVkZSBhIHNlcnZsZXQgdGhhdCBkb2VzIGEgZm9yd2FyZCwgdGhlbgorICogaW5jbHVkZXMgYW5vdGhlciBzZXJ2bGV0LCBhbmQgd2Ugc2VlIGFsbCBvZiB0aGUgb3V0cHV0IGluIHRoZSByaWdodCBvcmRlci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEluY2x1ZGUwN2EgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKwlQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBGb3J3YXJkIHRvIG91ciBzdWJzdWJzZXJ2bGV0CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKCIvSW5jbHVkZTA3YiIpOworICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIk5vIFJEIGZvciAnL0luY2x1ZGUwN2InIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZC5pbmNsdWRlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA3Yi5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwN2IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmUzYWFhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwN2IuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3QgdGhhdCBpbnN1cmVzIHdlIGNhbiBpbmNsdWRlIGEgc2VydmxldCB0aGF0IGRvZXMgYSBmb3J3YXJkLCB0aGVuCisgKiBpbmNsdWRlcyBhbm90aGVyIHNlcnZsZXQsIGFuZCB3ZSBzZWUgYWxsIG9mIHRoZSBvdXRwdXQgaW4gdGhlIHJpZ2h0IG9yZGVyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTA3YiBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiT3V0cHV0IGZyb20gSW5jbHVkZTA3YiIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA3Yy5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwN2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDlmNDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwN2MuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3QgdGhhdCBpbnN1cmVzIHdlIGNhbiBpbmNsdWRlIGEgc2VydmxldCB0aGF0IGRvZXMgYSBmb3J3YXJkLCB0aGVuCisgKiBpbmNsdWRlcyBhbm90aGVyIHNlcnZsZXQsIGFuZCB3ZSBzZWUgYWxsIG9mIHRoZSBvdXRwdXQgaW4gdGhlIHJpZ2h0IG9yZGVyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTA3YyBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiT3V0cHV0IGZyb20gSW5jbHVkZTA3YyIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA5LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkMWIzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDkuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIEV4ZXJjaXNlIGJhc2ljIGluY2x1ZGluZyBmdW5jdGlvbmFsaXR5IHVzaW5nCisgKiA8Y29kZT5yZXF1ZXN0LmdldFJlcXVlc3REaXNwYXRjaGVyKCk8L2NvZGU+LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTA5IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHBhdGggdG8gd2hpY2ggd2Ugd2lsbCBpc3N1ZSBhIGluY2x1ZGUKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcGF0aCA9ICIvSW5jbHVkZTAwYSI7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCBkaXNwYXRjaGVyIGFuZCBjYWxsIGluY2x1ZGUoKSBvbiBpdAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9IHJlcXVlc3QuZ2V0UmVxdWVzdERpc3BhdGNoZXIocGF0aCk7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBObyBSZXF1ZXN0RGlzcGF0Y2hlciByZXR1cm5lZC8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICAgICAgcmQuaW5jbHVkZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSBvdXIgcmVzcG9uc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpID49IDEpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiSW5jbHVkZTAwIEZBSUxFRCAtIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTEwLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTEwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2Yjg2YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMTAuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIE1ha2Ugc3VyZSBjb250YWluZXIgc2V0cyB1cCBpbmNsdWRlIHJlcXVlcyBhdHRyaWJ1dGVzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTEwIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIFBhc3MgY29waWVzIG9mIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHByb3BlcnRpZXMKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIm9yaWdpbmFsLnJlcXVlc3RfdXJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgib3JpZ2luYWwuY29udGV4dF9wYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpKTsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIm9yaWdpbmFsLnNlcnZsZXRfcGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJvcmlnaW5hbC5wYXRoX2luZm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFBhdGhJbmZvKCkpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgib3JpZ2luYWwucXVlcnlfc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpKTsKKworICAgICAgICAvLyBDcmVhdGUgYSByZXF1ZXN0IGRpc3BhdGNoZXIgYW5kIGNhbGwgaW5jbHVkZSgpIG9uIGl0CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIKKyAgICAgICAgICAgICgiL0luY2x1ZGUxMGEvaW5jbHVkZS9wYXRoP25hbWUyPXZhbHVlMiIpOworICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgTm8gUmVxdWVzdERpc3BhdGNoZXIgcmV0dXJuZWQvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgICAgIHJkLmluY2x1ZGUocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV3JpdGUgb3VyIHJlc3BvbnNlIGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+PSAxKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIkluY2x1ZGUwMCBGQUlMRUQgLSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUxMGEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMTBhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3MzE1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMTBhLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogRW5zdXJlIHRoZSBjb3JyZWN0IGNvbnRhaW5lciBtYW5hZ2VkIHJlcXVlc3QgYXR0cmlidXRlcyBhcmUgc2V0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTEwYSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzcGVjaWFsc1tdID0KKyAgICB7ICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucmVxdWVzdF91cmkiLAorICAgICAgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5jb250ZXh0X3BhdGgiLAorICAgICAgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5zZXJ2bGV0X3BhdGgiLAorICAgICAgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5wYXRoX2luZm8iLAorICAgICAgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5xdWVyeV9zdHJpbmciIH07CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIG9yaWdpbmFsIHJlcXVlc3QgcHJvcGVydGllcworICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOworICAgICAgICB2YWx1ZSA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJvcmlnaW5hbC5yZXF1ZXN0X3VyaSIpOworICAgICAgICBpZiAoIXZhbHVlLmVxdWFscyhyZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSkpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBnZXRSZXF1ZXN0VVJJKCkgaXMgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAiIGJ1dCBzaG91bGQgYmUgIiArIHZhbHVlICsgInwiKTsKKyAgICAgICAgdmFsdWUgPSAoU3RyaW5nKSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgib3JpZ2luYWwuY29udGV4dF9wYXRoIik7CisgICAgICAgIGlmICghdmFsdWUuZXF1YWxzKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSkpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBnZXRDb250ZXh0UGF0aCgpIGlzICIgKyByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKworICAgICAgICAgICAgICAgICAgICAgICIgYnV0IHNob3VsZCBiZSAiICsgdmFsdWUgKyAifCIpOworICAgICAgICB2YWx1ZSA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJvcmlnaW5hbC5zZXJ2bGV0X3BhdGgiKTsKKyAgICAgICAgaWYgKCF2YWx1ZS5lcXVhbHMocmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpKSkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGdldFNlcnZsZXRQYXRoKCkgaXMgIiArIHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSArCisgICAgICAgICAgICAgICAgICAgICAgIiBidXQgc2hvdWxkIGJlICIgKyB2YWx1ZSArICJ8Iik7CisgICAgICAgIHZhbHVlID0gKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoIm9yaWdpbmFsLnBhdGhfaW5mbyIpOworICAgICAgICBpZiAoIXZhbHVlLmVxdWFscyhyZXF1ZXN0LmdldFBhdGhJbmZvKCkpKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgZ2V0UGF0aEluZm8oKSBpcyAiICsgcmVxdWVzdC5nZXRQYXRoSW5mbygpICsKKyAgICAgICAgICAgICAgICAgICAgICAiIGJ1dCBzaG91bGQgYmUgIiArIHZhbHVlICsgInwiKTsKKyAgICAgICAgdmFsdWUgPSAoU3RyaW5nKSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgib3JpZ2luYWwucXVlcnlfc3RyaW5nIik7CisgICAgICAgIGlmICghdmFsdWUuZXF1YWxzKHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSkpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBnZXRRdWVyeVN0cmluZygpIGlzICIgKyByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCkgKworICAgICAgICAgICAgICAgICAgICAgICIgYnV0IHNob3VsZCBiZSAiICsgdmFsdWUgKyAifCIpOworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBjb250YWluZXIgcHJvdmlkZWQgcmVxdWVzdCBhdHRyaWJ1dGVzCisgICAgICAgIHZhbHVlID0gKFN0cmluZykKKyAgICAgICAgICAgIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucmVxdWVzdF91cmkiKTsKKyAgICAgICAgaWYgKCEocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi9JbmNsdWRlMTBhL2luY2x1ZGUvcGF0aCIpLmVxdWFscyh2YWx1ZSkpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiByZXF1ZXN0X3VyaSBpcyAiICsgdmFsdWUgKworICAgICAgICAgICAgICAgICAgICAgICIgYnV0IHNob3VsZCBiZSAiICsgcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAiL0luY2x1ZGUxMGEvaW5jbHVkZS9wYXRofCIpOworICAgICAgICB2YWx1ZSA9IChTdHJpbmcpCisgICAgICAgICAgICByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5pbmNsdWRlLmNvbnRleHRfcGF0aCIpOworICAgICAgICBpZiAoIXJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKS5lcXVhbHModmFsdWUpKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgY29udGV4dF9wYXRoIGlzICIgKyB2YWx1ZSArCisgICAgICAgICAgICAgICAgICAgICAgIiBidXQgc2hvdWxkIGJlICIgKyByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAifCIpOworICAgICAgICB2YWx1ZSA9IChTdHJpbmcpCisgICAgICAgICAgICByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5pbmNsdWRlLnNlcnZsZXRfcGF0aCIpOworICAgICAgICBpZiAoISIvSW5jbHVkZTEwYSIuZXF1YWxzKHZhbHVlKSkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNlcnZsZXRfcGF0aCBpcyAiICsgdmFsdWUgKworICAgICAgICAgICAgICAgICAgICAgICIgYnV0IHNob3VsZCBiZSAvSW5jbHVkZTEwYXwiKTsKKyAgICAgICAgdmFsdWUgPSAoU3RyaW5nKQorICAgICAgICAgICAgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuaW5jbHVkZS5wYXRoX2luZm8iKTsKKyAgICAgICAgaWYgKCEiL2luY2x1ZGUvcGF0aCIuZXF1YWxzKHZhbHVlKSkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHBhdGhfaW5mbyBpcyAiICsgdmFsdWUgKworICAgICAgICAgICAgICAgICAgICAgICIgYnV0IHNob3VsZCBiZSAvaW5jbHVkZS9wYXRofCIpOworICAgICAgICB2YWx1ZSA9IChTdHJpbmcpCisgICAgICAgICAgICByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5pbmNsdWRlLnF1ZXJ5X3N0cmluZyIpOworICAgICAgICBpZiAoISJuYW1lMj12YWx1ZTIiLmVxdWFscyh2YWx1ZSkpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBxdWVyeV9zdHJpbmcgaXMgIiArIHZhbHVlICsKKyAgICAgICAgICAgICAgICAgICAgICAiIGJ1dCBzaG91bGQgYmUgbmFtZTI9dmFsdWUyfCIpOworCisgICAgICAgIC8vIEdlbmVyYXRlIG91ciBzdWNjZXNzIG9yIGZhaWx1cmUgcmVwb3J0CisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiSW5jbHVkZTEwYSBQQVNTRUQiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkluY2x1ZGUxMGEgRkFJTEVEIC0iICsgc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9KbmRpMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9KbmRpMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTc3YjI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0puZGkwMS5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXgubmFtaW5nLkJpbmRpbmc7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRlc3Rlci5TZXNzaW9uQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRlc3Rlci5zaGFyZWQuU2hhcmVkU2Vzc2lvbkJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS50ZXN0ZXIudW5wc2hhcmVkLlVucFNoYXJlZFNlc3Npb25CZWFuOworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLnVuc2hhcmVkLlVuc2hhcmVkU2Vzc2lvbkJlYW47CisKKworLyoqCisgKiBOZWdhdGl2ZSB0ZXN0IGZvciBlbnN1cmluZyB0aGF0IHRoZSBuYW1pbmcgY29udGV4dCBwcm92aWRlZCBieSB0aGUgc2VydmxldAorICogY29udGFpbmVyIGlzIGltbXV0YWJsZS4gIE5vIGF0dGVtcHQgdG8gYWRkLCBtb2RpZnksIG9yIGRlbGV0ZSBhbnkgYmluZGluZworICogc2hvdWxkIHN1Y2NlZWQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBKbmRpMDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIEFjY2VzcyB0aGUgbmFtaW5nIGNvbnRleHQgZnJvbSBpbml0KCkKKyAgICAgICAgQ29udGV4dCBjdHggPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3R4ID0gbmV3IEluaXRpYWxDb250ZXh0KCk7CisgICAgICAgICAgICBjdHgubG9va3VwKCJqYXZhOi9jb21wIik7CisgICAgICAgICAgICBsb2coImluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseSBpbiBpbml0KCkiKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBsb2coIkNhbm5vdCBjcmVhdGUgY29udGV4dCBpbiBpbml0KCkiLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWNjZXNzIHNvbWUgYXBwbGljYXRpb24gYmVhbnMgZnJvbSBpbml0KCkKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2Vzc2lvbkJlYW4gc2IgPSBuZXcgU2Vzc2lvbkJlYW4oKTsKKyAgICAgICAgICAgIGxvZygiT0sgQWNjZXNzaW5nIFNlc3Npb25CZWFuIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIkZBSUwgQWNjZXNzaW5nIFNlc3Npb25CZWFuIiwgdCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2hhcmVkU2Vzc2lvbkJlYW4gc2IgPSBuZXcgU2hhcmVkU2Vzc2lvbkJlYW4oKTsKKyAgICAgICAgICAgIGxvZygiT0sgQWNjZXNzaW5nIFNoYXJlZFNlc3Npb25CZWFuIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIkZBSUwgQWNjZXNzaW5nIFNoYXJlZFNlc3Npb25CZWFuIiwgdCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVW5wU2hhcmVkU2Vzc2lvbkJlYW4gc2IgPSBuZXcgVW5wU2hhcmVkU2Vzc2lvbkJlYW4oKTsKKyAgICAgICAgICAgIGxvZygiT0sgQWNjZXNzaW5nIFVucFNoYXJlZFNlc3Npb25CZWFuIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIkZBSUwgQWNjZXNzaW5nIFVucFNoYXJlZFNlc3Npb25CZWFuIiwgdCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVW5zaGFyZWRTZXNzaW9uQmVhbiBzYiA9IG5ldyBVbnNoYXJlZFNlc3Npb25CZWFuKCk7CisgICAgICAgICAgICBsb2coIk9LIEFjY2Vzc2luZyBVbnNoYXJlZFNlc3Npb25CZWFuIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIkZBSUwgQWNjZXNzaW5nIFVuc2hhcmVkU2Vzc2lvbkJlYW4iLCB0KTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgQ29udGV4dCBjdHggPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3R4ID0gbmV3IEluaXRpYWxDb250ZXh0KCk7CisgICAgICAgICAgICBjdHgubG9va3VwKCJqYXZhOi9jb21wIik7CisgICAgICAgICAgICBsb2coImluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseSBpbiBkZXN0cm95KCkiKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBsb2coIkNhbm5vdCBjcmVhdGUgY29udGV4dCBpbiBkZXN0cm95KCkiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdG8gcmVuZGVyIG91ciBvdXRwdXQKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgaW5pdGlhbCBjb250ZXh0IHByb3ZpZGVkIGJ5IG91ciBzZXJ2bGV0IGNvbnRhaW5lcgorICAgICAgICBDb250ZXh0IGluaXRDb250ZXh0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluaXRDb250ZXh0ID0gbmV3IEluaXRpYWxDb250ZXh0KCk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkNyZWF0ZSBpbml0Q29udGV4dCIsIGUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIENhbm5vdCBjcmVhdGUgaW5pdENvbnRleHQuIik7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgZW52aXJvbm1lbnQgY29udGV4dCBwcm92aWRlZCB0byBvdXIgd2ViIGFwcGxpY2F0aW9uCisgICAgICAgIENvbnRleHQgZW52Q29udGV4dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGluaXRDb250ZXh0Lmxvb2t1cCgiamF2YTpjb21wL2VudiIpOworICAgICAgICAgICAgICAgIGVudkNvbnRleHQgPSAoQ29udGV4dCkgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKGVudkNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgTWlzc2luZyBlbnZDb250ZXh0LiIpOworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBlbnZDb250ZXh0IGNsYXNzIGlzICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOworICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiQ3JlYXRlIGVudkNvbnRleHQiLCBlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBDYW5ub3QgY3JlYXRlIGVudkNvbnRleHQuIik7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXR0ZW1wdCB0byBhZGQgYSBuZXcgYmluZGluZyB0byBvdXIgZW52aXJvbm1lbnQgY29udGV4dAorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgZW52Q29udGV4dC5iaW5kKCJuZXdFbnRyeSIsICJOZXcgVmFsdWUiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgQWxsb3dlZCBiaW5kKCkuIik7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZDb250ZXh0Lmxvb2t1cCgibmV3RW50cnkiKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIEFsbG93ZWQgbG9va3VwKCkgb2YgYWRkZWQgZW50cnkuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBsb2coIkFkZCBiaW5kaW5nIiwgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBdHRlbXB0IHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgYW4gZXhpc3RpbmcgYmluZGluZworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgZW52Q29udGV4dC5yZWJpbmQoInN0cmluZ0VudHJ5IiwgIkNoYW5nZWQgVmFsdWUiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgQWxsb3dlZCByZWJpbmQoKS4iKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudkNvbnRleHQubG9va3VwKCJzdHJpbmdFbnRyeSIpOworICAgICAgICAgICAgICAgIGlmICgodmFsdWUgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSAmJgorICAgICAgICAgICAgICAgICAgICAiQ2hhbmdlZCBWYWx1ZSIuZXF1YWxzKChTdHJpbmcpIHZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIEFsbG93ZWQgbG9va3VwKCkgb2YgY2hhbmdlZCBlbnRyeS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIGxvZygiQ2hhbmdlIGJpbmRpbmciLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEF0dGVtcHQgdG8gZGVsZXRlIGFuIGV4aXN0aW5nIGJpbmRpbmcKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgIGVudkNvbnRleHQudW5iaW5kKCJieXRlRW50cnkiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgQWxsb3dlZCB1bmJpbmQoKS4iKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudkNvbnRleHQubG9va3VwKCJieXRlRW50cnkiKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIEFsbG93ZWQgdW5iaW5kIG9mIGRlbGV0ZWQgZW50cnkuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBsb2coIkRlbGV0ZSBiaW5kaW5nIiwgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgb3VyIHVsdGltYXRlIHN1Y2Nlc3Mgb3IgZmFpbHVyZQorICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkpuZGkwMSBQQVNTRUQiKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIkpuZGkwMSBGQUlMRUQgLSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc2IpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHdyYXBwZXIgbWVzc2FnZXMgYXMgcmVxdWlyZWQKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0puZGkwMi5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0puZGkwMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMDY2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSm5kaTAyLmphdmEKQEAgLTAsMCArMSwzNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQmluZGluZzsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuSW5pdGlhbENvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0VudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLlNlc3Npb25CZWFuOworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLnNoYXJlZC5TaGFyZWRTZXNzaW9uQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRlc3Rlci51bnBzaGFyZWQuVW5wU2hhcmVkU2Vzc2lvbkJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS50ZXN0ZXIudW5zaGFyZWQuVW5zaGFyZWRTZXNzaW9uQmVhbjsKKworCisvKioKKyAqIFBvc2l0aXZlIHRlc3QgZm9yIGxvb2tpbmcgdXAgZW52aXJvbm1lbnQgZW50cmllcyBmcm9tIHRoZSBuYW1pbmcgY29udGV4dAorICogcHJvdmlkZWQgYnkgdGhlIHNlcnZsZXQgY29udGFpbmVyLiAgVGhlIGxvb2tlZC11cCB2YWx1ZXMgYXJlIGluaXRpYWxpemVkCisgKiB2aWEgPGNvZGU+Jmx0O2Vudi1lbnRyeSZndDs8L2NvZGU+IGVsZW1lbnRzIGluIHRoZSB3ZWIgYXBwbGljYXRpb24KKyAqIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEpuZGkwMiBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIC8vIE5hbWVzIG9mIHRoZSBrbm93biA8ZW52LWVudHJ5PiBlbGVtZW50cworICAgIFN0cmluZyBuYW1lc1tdID0KKyAgICB7ICJib29sZWFuRW50cnkiLCAiYnl0ZUVudHJ5IiwgImRvdWJsZUVudHJ5IiwgImZsb2F0RW50cnkiLAorICAgICAgImludGVnZXJFbnRyeSIsICJsb25nRW50cnkiLCAic3RyaW5nRW50cnkiLCAibmVzdGVkIiB9OworCisKKyAgICAvLyBSZWZlcmVuY2Ugc29tZSBhcHBsaWNhdGlvbiBjbGFzc2VzIGZvciB0aGUgZmlyc3QgdGltZSBpbiBkZXN0cm95KCkKKyAgICAvLyBhbmQgbG9nIHRoZSByZXN1bHRzCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2Vzc2lvbkJlYW4gc2IgPSBuZXcgU2Vzc2lvbkJlYW4oKTsKKyAgICAgICAgICAgIGxvZygiT0sgQWNjZXNzaW5nIFNlc3Npb25CZWFuIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIkZBSUwgQWNjZXNzaW5nIFNlc3Npb25CZWFuIiwgdCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2hhcmVkU2Vzc2lvbkJlYW4gc2IgPSBuZXcgU2hhcmVkU2Vzc2lvbkJlYW4oKTsKKyAgICAgICAgICAgIGxvZygiT0sgQWNjZXNzaW5nIFNoYXJlZFNlc3Npb25CZWFuIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIkZBSUwgQWNjZXNzaW5nIFNoYXJlZFNlc3Npb25CZWFuIiwgdCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVW5wU2hhcmVkU2Vzc2lvbkJlYW4gc2IgPSBuZXcgVW5wU2hhcmVkU2Vzc2lvbkJlYW4oKTsKKyAgICAgICAgICAgIGxvZygiT0sgQWNjZXNzaW5nIFVucFNoYXJlZFNlc3Npb25CZWFuIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIkZBSUwgQWNjZXNzaW5nIFVucFNoYXJlZFNlc3Npb25CZWFuIiwgdCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVW5zaGFyZWRTZXNzaW9uQmVhbiBzYiA9IG5ldyBVbnNoYXJlZFNlc3Npb25CZWFuKCk7CisgICAgICAgICAgICBsb2coIk9LIEFjY2Vzc2luZyBVbnNoYXJlZFNlc3Npb25CZWFuIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIkZBSUwgQWNjZXNzaW5nIFVuc2hhcmVkU2Vzc2lvbkJlYW4iLCB0KTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRvIHJlbmRlciBvdXIgb3V0cHV0CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJvb2xlYW4gb2sgPSB0cnVlOworICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGluaXRpYWwgY29udGV4dCBwcm92aWRlZCBieSBvdXIgc2VydmxldCBjb250YWluZXIKKyAgICAgICAgQ29udGV4dCBpbml0Q29udGV4dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbml0Q29udGV4dCA9IG5ldyBJbml0aWFsQ29udGV4dCgpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKCJDcmVhdGUgaW5pdENvbnRleHQiLCBlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBDYW5ub3QgY3JlYXRlIGluaXRDb250ZXh0LiIpOworICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGVudmlyb25tZW50IGNvbnRleHQgcHJvdmlkZWQgdG8gb3VyIHdlYiBhcHBsaWNhdGlvbgorICAgICAgICBDb250ZXh0IGVudkNvbnRleHQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBpbml0Q29udGV4dC5sb29rdXAoImphdmE6Y29tcC9lbnYiKTsKKyAgICAgICAgICAgICAgICBlbnZDb250ZXh0ID0gKENvbnRleHQpIHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChlbnZDb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIE1pc3NpbmcgZW52Q29udGV4dC4iKTsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgZW52Q29udGV4dCBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi4iKTsKKyAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkNyZWF0ZSBlbnZDb250ZXh0IiwgZSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgQ2Fubm90IGNyZWF0ZSBlbnZDb250ZXh0LiIpOworICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBib29sZWFuRW50cnkgZW52aXJvbm1lbnQgZW50cnkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgIHZhbHVlID0gZW52Q29udGV4dC5sb29rdXAoImJvb2xlYW5FbnRyeSIpOworICAgICAgICAgICAgICAgIEJvb2xlYW4gYm9vbGVhblZhbHVlID0gKEJvb2xlYW4pIHZhbHVlOworICAgICAgICAgICAgICAgIGlmICghKGJvb2xlYW5WYWx1ZS5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgYm9vbGVhblZhbHVlIGlzICIpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYm9vbGVhblZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIGJvb2xlYW5WYWx1ZSBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi4iKTsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBib29sZWFuVmFsdWUgaXMgbWlzc2luZy4iKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiR2V0IGJvb2xlYW5WYWx1ZSIsIGUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIENhbm5vdCBnZXQgYm9vbGVhblZhbHVlLiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGJ5dGVFbnRyeSBlbnZpcm9ubWVudCBlbnRyeQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZDb250ZXh0Lmxvb2t1cCgiYnl0ZUVudHJ5Iik7CisgICAgICAgICAgICAgICAgQnl0ZSBieXRlVmFsdWUgPSAoQnl0ZSkgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKCEoYnl0ZVZhbHVlLmJ5dGVWYWx1ZSgpID09IDEyMykpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIGJ5dGVWYWx1ZSBpcyAiKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGJ5dGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBieXRlVmFsdWUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIuIik7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgYnl0ZVZhbHVlIGlzIG1pc3NpbmcuIik7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkdldCBieXRlVmFsdWUiLCBlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBDYW5ub3QgZ2V0IGJ5dGVWYWx1ZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBkb3VibGVFbnRyeSBlbnZpcm9ubWVudCBlbnRyeQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZDb250ZXh0Lmxvb2t1cCgiZG91YmxlRW50cnkiKTsKKyAgICAgICAgICAgICAgICBEb3VibGUgZG91YmxlVmFsdWUgPSAoRG91YmxlKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoIShkb3VibGVWYWx1ZS5kb3VibGVWYWx1ZSgpID09IDEyMy40NSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIGRvdWJsZVZhbHVlIGlzICIpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZG91YmxlVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgZG91YmxlVmFsdWUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIuIik7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgZG91YmxlVmFsdWUgaXMgbWlzc2luZy4iKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiR2V0IGRvdWJsZVZhbHVlIiwgZSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgQ2Fubm90IGdldCBkb3VibGVWYWx1ZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBmbG9hdEVudHJ5IGVudmlyb25tZW50IGVudHJ5CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudkNvbnRleHQubG9va3VwKCJmbG9hdEVudHJ5Iik7CisgICAgICAgICAgICAgICAgRmxvYXQgZmxvYXRWYWx1ZSA9IChGbG9hdCkgdmFsdWU7CisgICAgICAgICAgICAgICAgZmxvYXQgZGlmZmVyZW5jZSA9IGZsb2F0VmFsdWUuZmxvYXRWYWx1ZSgpIC0gKChmbG9hdCkgNTQuMzIpOworICAgICAgICAgICAgICAgIGlmICgoZGlmZmVyZW5jZSA8ICgoZmxvYXQpIC0wLjAxKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGRpZmZlcmVuY2UgPiAoKGZsb2F0KSAgMC4wMSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiICBmbG9hdFZhbHVlIGlzICIpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZmxvYXRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBmbG9hdFZhbHVlIGNsYXNzIGlzICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIGZsb2F0VmFsdWUgaXMgbWlzc2luZy4iKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiR2V0IGZsb2F0VmFsdWUiLCBlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBDYW5ub3QgZ2V0IGZsb2F0VmFsdWUuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgaW50ZWdlckVudHJ5IGVudmlyb25tZW50IGVudHJ5CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudkNvbnRleHQubG9va3VwKCJpbnRlZ2VyRW50cnkiKTsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyIGludGVnZXJWYWx1ZSA9IChJbnRlZ2VyKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoIShpbnRlZ2VyVmFsdWUuaW50VmFsdWUoKSA9PSAxMjM0NSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIGludGVnZXJWYWx1ZSBpcyAiKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGludGVnZXJWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBpbnRlZ2VyVmFsdWUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIuIik7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgaW50ZWdlclZhbHVlIGlzIG1pc3NpbmcuIik7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkdldCBpbnRlZ2VyVmFsdWUiLCBlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBDYW5ub3QgZ2V0IGludGVnZXJWYWx1ZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBsb25nRW50cnkgZW52aXJvbm1lbnQgZW50cnkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgIHZhbHVlID0gZW52Q29udGV4dC5sb29rdXAoImxvbmdFbnRyeSIpOworICAgICAgICAgICAgICAgIExvbmcgbG9uZ1ZhbHVlID0gKExvbmcpIHZhbHVlOworICAgICAgICAgICAgICAgIGlmICghKGxvbmdWYWx1ZS5sb25nVmFsdWUoKSA9PSA1NDMyMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIGxvbmdWYWx1ZSBpcyAiKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGxvbmdWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBsb25nVmFsdWUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIuIik7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgbG9uZ1ZhbHVlIGlzIG1pc3NpbmcuIik7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkdldCBsb25nVmFsdWUiLCBlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBDYW5ub3QgZ2V0IGxvbmdWYWx1ZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBzdHJpbmdFbnRyeSBlbnZpcm9ubWVudCBlbnRyeQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZDb250ZXh0Lmxvb2t1cCgic3RyaW5nRW50cnkiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3RyaW5nVmFsdWUgPSAoU3RyaW5nKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoISJTdHJpbmcgVmFsdWUiLmVxdWFscyhzdHJpbmdWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIHN0cmluZ1ZhbHVlIGlzICIpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc3RyaW5nVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgc3RyaW5nVmFsdWUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIuIik7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgc3RyaW5nVmFsdWUgaXMgbWlzc2luZy4iKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiR2V0IHN0cmluZ1ZhbHVlIiwgZSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgQ2Fubm90IGdldCBzdHJpbmdWYWx1ZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBuZXN0ZWRFbnRyeSBlbnZpcm9ubWVudCBlbnRyeQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZDb250ZXh0Lmxvb2t1cCgibmVzdGVkL25lc3RlZEVudHJ5Iik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlID0gKFN0cmluZykgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKCEiTmVzdGVkIFZhbHVlIi5lcXVhbHMoc3RyaW5nVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiICBzdHJpbmdWYWx1ZSBpcyAiKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHN0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIHN0cmluZ1ZhbHVlIGNsYXNzIGlzICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIHN0cmluZ1ZhbHVlIGlzIG1pc3NpbmcuIik7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkdldCBzdHJpbmdWYWx1ZSIsIGUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIENhbm5vdCBnZXQgc3RyaW5nVmFsdWUuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHdlIGNhbiBlbnVtZXJhdGUgdGhlIGNvbnRlbnRzIG9mIG91ciBlbnZpcm9ubWVudAorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgaW50IGNvdW50c1tdID0gbmV3IGludFtuYW1lcy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGNvdW50c1tpXSA9IDA7CisgICAgICAgICAgICAgICAgTmFtaW5nRW51bWVyYXRpb24gbmFtaW5nRW51bSA9CisgICAgICAgICAgICAgICAgICAgIGluaXRDb250ZXh0Lmxpc3RCaW5kaW5ncygiamF2YTpjb21wL2VudiIpOworICAgICAgICAgICAgICAgIHdoaWxlIChuYW1pbmdFbnVtLmhhc01vcmUoKSkgeworICAgICAgICAgICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgbmFtaW5nRW51bS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYmluZGluZy5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKG5hbWVzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1tpXSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJGb3VuZCBiaW5kaW5nIGZvciAnIiArIG5hbWUgKyAiJyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudHNbaV0gPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgTWlzc2luZyBiaW5kaW5nIGZvciAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChuYW1lc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi4iKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudHNbaV0gPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgRm91bmQgIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY291bnRzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIGJpbmRpbmdzIGZvciAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChuYW1lc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiRW51bWVyYXRlIGVudkNvbnRleHQiLCBlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBDYW5ub3QgZW51bWVyYXRlIGVudkNvbnRleHQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBvdXIgdWx0aW1hdGUgc3VjY2VzcyBvciBmYWlsdXJlCisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiSm5kaTAyIFBBU1NFRCIpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiSm5kaTAyIEZBSUxFRCAtIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzYik7CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgd3JhcHBlciBtZXNzYWdlcyBhcyByZXF1aXJlZAorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvTGlmZWN5Y2xlMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9MaWZlY3ljbGUwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOTQwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvTGlmZWN5Y2xlMDEuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogUG9zaXRpdmUgdGVzdCBmb3Igc2VydmxldCBsaWZlY3ljbGUgbWFuYWdlbWVudC4gIFRoaXMgc2VydmxldCBpcworICogPHN0cm9uZz5ub3Q8L3N0cm9uZz4gZGVjbGFyZWQgdG8gYmUgbG9hZC1vbi1zdGFydHVwLCBhbmQgdGhlIGZpcnN0IHJlcXVlc3QKKyAqIG1hZGUgdG8gaXQgc2hvdWxkIGJlIGEgIkdFVCIuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBMaWZlY3ljbGUwMSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBkb3VibGVkID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbml0aWFsaXplZCkKKyAgICAgICAgICAgIGRvdWJsZWQgPSB0cnVlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgaWYgKGRvdWJsZWQpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJMaWZlY3ljbGUwMSBGQUlMRUQgLSBEb3VibGUgaW5pdGlhbGl6YXRpb24iKTsKKyAgICAgICAgfSBlbHNlIGlmIChpbml0aWFsaXplZCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkxpZmVjeWNsZTAxIFBBU1NFRCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkxpZmVjeWNsZTAxIEZBSUxFRCAtIEdFVCBidXQgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBpZiAoZG91YmxlZCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkxpZmVjeWNsZTAxIEZBSUxFRCAtIFBPU1QgYW5kIGRvdWJsZSBpbml0aWFsaXphdGlvbiIpOworICAgICAgICB9IGVsc2UgaWYgKGluaXRpYWxpemVkKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiTGlmZWN5Y2xlMDEgRkFJTEVEIC0gUE9TVCBjYWxsZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJMaWZlY3ljbGUwMSBGQUlMRUQgLSBQT1NUIGFuZCBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0xpZmVjeWNsZTAyLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvTGlmZWN5Y2xlMDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWM2MDhmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0xpZmVjeWNsZTAyLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIFBvc2l0aXZlIHRlc3QgZm9yIHNlcnZsZXQgbGlmZWN5Y2xlIG1hbmFnZW1lbnQuICBUaGlzIHNlcnZsZXQgaXMKKyAqIDxzdHJvbmc+bm90PC9zdHJvbmc+IGRlY2xhcmVkIHRvIGJlIGxvYWQtb24tc3RhcnR1cCwgYW5kIHRoZSBmaXJzdCByZXF1ZXN0CisgKiBtYWRlIHRvIGl0IHNob3VsZCBiZSBhICJQT1NUIi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIExpZmVjeWNsZTAyIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHJpdmF0ZSBib29sZWFuIGRvdWJsZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGluaXRpYWxpemVkKQorICAgICAgICAgICAgZG91YmxlZCA9IHRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICBpbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBpZiAoZG91YmxlZCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkxpZmVjeWNsZTAyIEZBSUxFRCAtIEdFVCBhbmQgZG91YmxlIGluaXRpYWxpemF0aW9uIik7CisgICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJMaWZlY3ljbGUwMiBGQUlMRUQgLSBHRVQgY2FsbGVkIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiTGlmZWN5Y2xlMDIgRkFJTEVEIC0gR0VUIGFuZCBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIGlmIChkb3VibGVkKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiTGlmZWN5Y2xlMDIgRkFJTEVEIC0gRG91YmxlIGluaXRpYWxpemF0aW9uIik7CisgICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJMaWZlY3ljbGUwMiBQQVNTRUQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJMaWZlY3ljbGUwMiBGQUlMRUQgLSBQT1NUIGJ1dCBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0xpZmVjeWNsZTAzLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvTGlmZWN5Y2xlMDMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTZiY2I2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0xpZmVjeWNsZTAzLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogVGVzdCBmb3Igc2VydmxldCBsaWZlY3ljbGUgbWFuYWdlbWVudC4gIEl0J3MgYmVoYXZpb3IgaXMgY29udHJvbGxlZCBieQorICogYSByZXF1ZXN0IHBhcmFtZXRlciA8c3Ryb25nPnN0ZXA8L3N0cm9uZz4sIHdoaWNoIG11c3QgYmUgc2V0IHRvIG9uZSBvZgorICogdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiA8dWw+CisgKiA8bGk+PGVtPjE8L2VtPiAtIFRocm93IGFuIDxjb2RlPlVuYXZhaWxhYmxlRXhjZXB0aW9uPC9jb2RlPiB0aGF0IGluZGljYXRlcworICogICAgIHBlcm1hbmVudCB1bmF2YWlsYWJsaWxpdHksIHdoaWNoIHNob3VsZCBjYXVzZSB0aGlzIHNlcnZsZXQgaW5zdGFuY2UKKyAqICAgICB0byBiZSBkZXN0cm95ZWQgYW5kIHRocm93biBhd2F5LjwvbGk+CisgKiA8bGk+PGVtPjI8L2VtPiAtIENoZWNrIHRoZSBsaWZlY3ljbGUgdmFyaWFibGVzIHRvIGVuc3VyZSB0aGF0IHRoZSBvbGQKKyAqICAgICBpbnN0YW5jZSB3YXMgbm90IHJldXNlZC48L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIExpZmVjeWNsZTAzIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0YXRpY1RyYWlsID0gIiI7CisKKyAgICBwcml2YXRlIFN0cmluZyBpbnN0YW5jZVRyYWlsID0gIiI7CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBzdGF0aWNUcmFpbCArPSAiSSI7CisgICAgICAgIGluc3RhbmNlVHJhaWwgKz0gIkkiOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIHN0YXRpY1RyYWlsICs9ICJEIjsKKyAgICAgICAgaW5zdGFuY2VUcmFpbCArPSAiRCI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3RhdGljVHJhaWwgKz0gIlMiOworICAgICAgICBpbnN0YW5jZVRyYWlsICs9ICJTIjsKKworICAgICAgICAvLyBGb3Igc3RlcD0xLCB0aHJvdyBhbiBleGNlcHRpb24KKyAgICAgICAgaWYgKCIxIi5lcXVhbHMocmVxdWVzdC5nZXRQYXJhbWV0ZXIoInN0ZXAiKSkpIHsKKyAgICAgICAgICAgIHN0YXRpY1RyYWlsID0gIklTIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbmF2YWlsYWJsZUV4Y2VwdGlvbigiTGlmZWN5Y2xlMDMgaXMgcGVybWFuZW50bHkgdW5hdmFpbGFibGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvciBzdGVwPTIsIGV2YWx1YXRlIHRoZSByZXN1bHRzLgorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgaWYgKHN0YXRpY1RyYWlsLmVxdWFscygiSVNESVMiKSAmJiBpbnN0YW5jZVRyYWlsLmVxdWFscygiSVMiKSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJMaWZlY3ljbGUwMyBQQVNTRUQiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkxpZmVjeWNsZTAzIEZBSUxFRCAtIHN0YXRpY1RyYWlsPSIgKyBzdGF0aWNUcmFpbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBpbnN0YW5jZVRyYWlsPSIgKyBpbnN0YW5jZVRyYWlsKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZWRpcmVjdDAxLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVkaXJlY3QwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZDcyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVkaXJlY3QwMS5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBQb3NpdGl2ZSB0ZXN0IGZvciBIdHRwU2VydmxldFJlc3BvbnNlLnNlbmRSZWRpcmVjdCgpLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVkaXJlY3QwMSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBzZXJ2bGV0IHJlcXVlc3QgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvUmVkaXJlY3QwMWEiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZWRpcmVjdDAxIEZBSUxFRCAtIFRocmV3IElsbGVnYVN0YXRlRXhjZXB0aW9uIik7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVkaXJlY3QwMSBGQUlMRUQgLSBPdXRwdXQgdGV4dCBhZnRlciByZWRpcmVjdCIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIlJlZGlyZWN0MDEgUG9zdC1SZWRpcmVjdCBPdXRwdXQgRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVkaXJlY3QwMWEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZWRpcmVjdDAxYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjA0ODgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVkaXJlY3QwMWEuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogUG9zaXRpdmUgdGVzdCBmb3IgSHR0cFNlcnZsZXRSZXNwb25zZS5zZW5kUmVkaXJlY3QoKS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFJlZGlyZWN0MDFhIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIHNlcnZsZXQgcmVxdWVzdCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVkaXJlY3QwMWEgUEFTU0VEIik7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1JlZmxlY3Rpb24wMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1JlZmxlY3Rpb24wMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NTA3NjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVmbGVjdGlvbjAxLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIE5lZ2F0aXZlIHRlc3QgZm9yIGFjY2VzcyB0byBDYXRhbGluYSBpbnRlcm5hbHMgdGhyb3VnaCB0aGUgb2JqZWN0cyB0aGF0CisgKiBhcmUgZXhwb3NlZCB0byB0aGlzIHNlcnZsZXQgYnkgdGhlIGNvbnRhaW5lci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFJlZmxlY3Rpb24wMSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICAvLyBDaGVjayB0aGUgU2VydmxldENvbmZpZyBvYmplY3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNlcnZsZXRDb25maWcgc2VydmxldENvbmZpZyA9IGdldFNlcnZsZXRDb25maWcoKTsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBzZXJ2bGV0Q29uZmlnLmdldENsYXNzKCkuZ2V0TWV0aG9kCisgICAgICAgICAgICAgICAgKCJnZXRQYXJlbnQiLCBuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICBPYmplY3QgcGFyZW50ID0gbWV0aG9kLmludm9rZShzZXJ2bGV0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt9KTsKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgQ2FuIHJlZmxlY3Qgb24gU2VydmxldENvbmZpZy8iKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiU2VydmxldENvbmZpZzogIiArIHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIFNlcnZsZXRDb250ZXh0IG9iamVjdAorICAgICAgICB0cnkgeworICAgICAgICAgICAgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSBnZXRTZXJ2bGV0Q29udGV4dCgpOworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHNlcnZsZXRDb250ZXh0LmdldENsYXNzKCkuZ2V0TWV0aG9kCisgICAgICAgICAgICAgICAgKCJnZXRSZXNvdXJjZXMiLCBuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICBPYmplY3QgcmVzb3VyY2VzID0gbWV0aG9kLmludm9rZShzZXJ2bGV0Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7fSk7CisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIENhbiByZWZsZWN0IG9uIFNlcnZsZXRDb250ZXh0LyIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJTZXJ2bGV0Q29udGV4dDogIiArIHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIEh0dHBTZXJ2bGV0UmVxdWVzdCBvYmplY3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSByZXF1ZXN0LmdldENsYXNzKCkuZ2V0TWV0aG9kCisgICAgICAgICAgICAgICAgKCJnZXRJbmZvIiwgbmV3IENsYXNzW10ge30pOworICAgICAgICAgICAgT2JqZWN0IGluZm8gPSBtZXRob2QuaW52b2tlKHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt9KTsKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgQ2FuIHJlZmxlY3Qgb24gSHR0cFNlcnZsZXRSZXF1ZXN0LyIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJIdHRwU2VydmxldFJlcXVlc3Q6ICIgKyB0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoZSBIdHRwU2VydmxldFJlc3BvbnNlIG9iamVjdAorICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHJlcXVlc3QuZ2V0Q2xhc3MoKS5nZXRNZXRob2QKKyAgICAgICAgICAgICAgICAoImdldEluZm8iLCBuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICBPYmplY3QgaW5mbyA9IG1ldGhvZC5pbnZva2UocmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge30pOworICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBDYW4gcmVmbGVjdCBvbiBIdHRwU2VydmxldFJlc3BvbnNlLyIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJIdHRwU2VydmxldFJlc3BvbnNlOiAiICsgdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGUgSHR0cFNlc3Npb24gb2JqZWN0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKHRydWUpOworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHNlc3Npb24uZ2V0Q2xhc3MoKS5nZXRNZXRob2QKKyAgICAgICAgICAgICAgICAoImdldEluZm8iLCBuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIENhbiByZWZsZWN0IG9uIEh0dHBTZXNzaW9uLyIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJIdHRwU2Vzc2lvbjogIiArIHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIFJlcXVlc3REaXNwYXRjaGVyIG9iamVjdAorICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgcmQgPQorICAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9pbmRleC5zaHRtbCIpOworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHJkLmdldENsYXNzKCkuZ2V0TWV0aG9kCisgICAgICAgICAgICAgICAgKCJnZXRJbmZvIiwgbmV3IENsYXNzW10ge30pOworICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBDYW4gcmVmbGVjdCBvbiBSZXF1ZXN0RGlzcGF0Y2hlci8iKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiUmVxdWVzdERpc3BhdGNoZXI6ICIgKyB0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBmaW5hbCByZXN1bHRzCisgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZWZsZWN0aW9uMDEgUEFTU0VEIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCJSZWZsZWN0aW9uMDEgRkFJTEVEIC0iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHJlc3VsdHMudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVxdWVzdDAxLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVxdWVzdDAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE3MDE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXF1ZXN0MDEuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIFJlcXVlc3QgbGlzdGVuZXIgdGVzdC4gIEV4ZXJjaXNlIHZhcmlvdXMgbWV0aG9kcyBmb3IgZGVhbGluZyB3aXRoCisgKiBzZXJ2bGV0IHJlcXVlc3QgYXR0cmlidXRlcy4gIExlYXZlIGFuIGF0dHJpYnV0ZSBuYW1lZCAicmVxdWVzdDAxIgorICogcHJlc2VudCwgd2hpY2ggc2hvdWxkIGJlIGVyYXNlZCBhZnRlciBhIHdlYiBhcHBsaWNhdGlvbiByZXN0YXJ0LgorICoKKyAqIEBhdXRob3IgSnVzdHluYSBIb3J3YXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFJlcXVlc3QwMSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIGJvb2xlYW4gb2sgPSB0cnVlOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCA9IGdldFNlcnZsZXRDb250ZXh0KCk7CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlcmUgaXMgbm8gZXhpc3RpbmcgYXR0cmlidXRlCisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJyZXF1ZXN0MDEiKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlJlcXVlc3QwMSBGQUlMRUQgLSBBdHRyaWJ1dGUgYWxyZWFkeSBleGlzdHMiKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGFuZCBzdGFzaCBhIHJlcXVlc3QgYXR0cmlidXRlCisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgQ29udGV4dEJlYW4gYmVhbiA9IG5ldyBDb250ZXh0QmVhbigpOworICAgICAgICAgICAgYmVhbi5zZXRTdHJpbmdQcm9wZXJ0eSgiUmVxdWVzdDAxIik7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgicmVxdWVzdDAxIiwgYmVhbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSBjYW4gcmV0cmlldmUgdGhlIGF0dHJpYnV0ZSBzdWNjZXNzZnVsbHkKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBPYmplY3QgYmVhbiA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJyZXF1ZXN0MDEiKTsKKyAgICAgICAgICAgIGlmIChiZWFuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVxdWVzdDAxIEZBSUxFRCAtIENhbm5vdCByZXRyaWV2ZSBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoYmVhbiBpbnN0YW5jZW9mIENvbnRleHRCZWFuKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVxdWVzdDAxIEZBSUxFRCAtIEJlYW4gaW5zdGFuY2Ugb2YgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW4uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICgoQ29udGV4dEJlYW4pIGJlYW4pLmdldFN0cmluZ1Byb3BlcnR5KCk7CisgICAgICAgICAgICAgICAgaWYgKCEiUmVxdWVzdDAxIi5lcXVhbHModmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXF1ZXN0MDEgRkFJTEVEIC0gVmFsdWUgPSAiICsgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgIFN0cmluZyBsaWZlY3ljbGUgPSAoKENvbnRleHRCZWFuKSBiZWFuKS5nZXRMaWZlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoISIvYWRkIi5lcXVhbHMobGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVxdWVzdDAxIEZBSUxFRCAtIEJlYW4gbGlmZWN5Y2xlIGlzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGUpOworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGNhbiB1cGRhdGUgdGhpcyBhdHRyaWJ1dGUgYW5kIGNoZWNrIGl0cyBsaWZlY3ljbGUKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBDb250ZXh0QmVhbiBiZWFuID0gKENvbnRleHRCZWFuKSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgicmVxdWVzdDAxIik7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgicmVxdWVzdDAxIiwgYmVhbik7CisgICAgICAgICAgICBTdHJpbmcgbGlmZWN5Y2xlID0gYmVhbi5nZXRMaWZlY3ljbGUoKTsKKyAgICAgICAgICAgIGlmICghIi9hZGQvcmVwIi5lcXVhbHMobGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXF1ZXN0MDEgRkFJTEVEIC0gQmVhbiBsaWZlY3ljbGUgaXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgY2FuIHJlbW92ZSB0aGlzIGF0dHJpYnV0ZSBhbmQgY2hlY2sgaXRzIGxpZmVjeWNsZQorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIENvbnRleHRCZWFuIGJlYW4gPSAoQ29udGV4dEJlYW4pIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJyZXF1ZXN0MDEiKTsKKyAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKCJyZXF1ZXN0MDEiKTsKKyAgICAgICAgICAgIFN0cmluZyBsaWZlY3ljbGUgPSBiZWFuLmdldExpZmVjeWNsZSgpOworICAgICAgICAgICAgaWYgKCEiL2FkZC9yZXAvcmVtIi5lcXVhbHMobGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXF1ZXN0MDEgRkFJTEVEIC0gQmVhbiBsaWZlY3ljbGUgaXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIGEgYmVhbiBiYWNrIGZvciB0aGUgcmVzdGFydCBhcHBsaWNhdGlvbiB0ZXN0CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJyZXF1ZXN0MDEiLCBuZXcgQ29udGV4dEJlYW4oKSk7CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgc2V0QXR0cmlidXRlKCJuYW1lIiwgbnVsbCkgd29ya3MgY29ycmVjdGx5CisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIkZPTyIsICJCQVIiKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJGT08iLCBudWxsKTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldEF0dHJpYnV0ZSgiRk9PIikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXF1ZXN0MDEgRkFJTEVEIC0gc2V0QXR0cmlidXRlKG5hbWUsbnVsbCkiKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHN1Y2Nlc3MgaWYgZXZlcnl0aGluZyBpcyBzdGlsbCBvaworICAgICAgICBpZiAob2spCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVxdWVzdDAxIFBBU1NFRCIpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVxdWVzdExpc3RlbmVyMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXF1ZXN0TGlzdGVuZXIwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NTY5M2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVxdWVzdExpc3RlbmVyMDEuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIEFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIGZvciByZXF1ZXN0IGV2ZW50cy4gIEFsbCBldmVudHMgdGhhdCBvY2N1cgorICogYXJlIGxvZ2dlZCBhcHByb3ByaWF0ZWx5IHRvIHRoZSBzdGF0aWMgbG9nZ2VyLi4KKyAqCisgKiBAYXV0aG9yIEp1c3R5bmEgSG9yd2F0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0TGlzdGVuZXIwMQorICAgIGltcGxlbWVudHMgU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVMaXN0ZW5lciwgU2VydmxldFJlcXVlc3RMaXN0ZW5lciB7CisKKworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZUFkZGVkKFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJSZXF1ZXN0TGlzdGVuZXIwMTogYXR0cmlidXRlQWRkZWQoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROYW1lKCkgKyAiLCIgKyBldmVudC5nZXRWYWx1ZSgpICsgIikiKTsKKyAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCA9IChTZXJ2bGV0Q29udGV4dCkgZXZlbnQuZ2V0U291cmNlKCk7CisgICAgICAgIGNvbnRleHQubG9nKCJSZXF1ZXN0TGlzdGVuZXIwMTogYXR0cmlidXRlQWRkZWQoIiArCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIsIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiKSIpOworICAgICAgICBpZiAoZXZlbnQuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENvbnRleHRCZWFuKSB7CisgICAgICAgICAgICBDb250ZXh0QmVhbiBiZWFuID0gKENvbnRleHRCZWFuKSBldmVudC5nZXRWYWx1ZSgpOworICAgICAgICAgICAgYmVhbi5zZXRMaWZlY3ljbGUoYmVhbi5nZXRMaWZlY3ljbGUoKSArICIvYWRkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZW1vdmVkKFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJSZXF1ZXN0TGlzdGVuZXIwMTogYXR0cmlidXRlUmVtb3ZlZCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIsIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiKSIpOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gKFNlcnZsZXRDb250ZXh0KSBldmVudC5nZXRTb3VyY2UoKTsKKyAgICAgICAgY29udGV4dC5sb2coIlJlcXVlc3RMaXN0ZW5lcjAxOiBhdHRyaWJ1dGVSZW1vdmVkKCIgKworICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROYW1lKCkgKyAiLCIgKyBldmVudC5nZXRWYWx1ZSgpICsgIikiKTsKKyAgICAgICAgaWYgKGV2ZW50LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBDb250ZXh0QmVhbikgeworICAgICAgICAgICAgQ29udGV4dEJlYW4gYmVhbiA9IChDb250ZXh0QmVhbikgZXZlbnQuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGJlYW4uc2V0TGlmZWN5Y2xlKGJlYW4uZ2V0TGlmZWN5Y2xlKCkgKyAiL3JlbSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlUmVwbGFjZWQoU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVFdmVudCBldmVudCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlJlcXVlc3RMaXN0ZW5lcjAxOiBhdHRyaWJ1dGVSZXBsYWNlZCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIsIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiKSIpOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gKFNlcnZsZXRDb250ZXh0KSBldmVudC5nZXRTb3VyY2UoKTsKKyAgICAgICAgY29udGV4dC5sb2coIlJlcXVlc3RMaXN0ZW5lcjAxOiBhdHRyaWJ1dGVSZXBsYWNlZCgiICsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0TmFtZSgpICsgIiwiICsgZXZlbnQuZ2V0VmFsdWUoKSArICIpIik7CisgICAgICAgIGlmIChldmVudC5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQ29udGV4dEJlYW4pIHsKKyAgICAgICAgICAgIENvbnRleHRCZWFuIGJlYW4gPSAoQ29udGV4dEJlYW4pIGV2ZW50LmdldFZhbHVlKCk7CisgICAgICAgICAgICBiZWFuLnNldExpZmVjeWNsZShiZWFuLmdldExpZmVjeWNsZSgpICsgIi9yZXAiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3REZXN0cm95ZWQoU2VydmxldFJlcXVlc3RFdmVudCBldmVudCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlJlcXVlc3RMaXN0ZW5lcjAxOiByZXF1ZXN0RGVzdHJveWVkKCkgLS0gcHJvYmFibHkgY2FjaGVkIGZyb20gcHJldmlvdXMgcmVxdWVzdCIpOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gKFNlcnZsZXRDb250ZXh0KSBldmVudC5nZXRTb3VyY2UoKTsKKyAgICAgICAgY29udGV4dC5sb2coIlJlcXVlc3RMaXN0ZW5lcjAxOiByZXF1ZXN0RGVzdHJveWVkKCkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXF1ZXN0SW5pdGlhbGl6ZWQoU2VydmxldFJlcXVlc3RFdmVudCBldmVudCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlJlcXVlc3RMaXN0ZW5lcjAxOiByZXF1ZXN0SW5pdGlhbGl6ZWQoKSIpOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gKFNlcnZsZXRDb250ZXh0KSBldmVudC5nZXRTb3VyY2UoKTsKKyAgICAgICAgY29udGV4dC5sb2coIlJlcXVlc3RMaXN0ZW5lcjAxOiByZXF1ZXN0SW5pdGlhbGl6ZWQoKSIpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzZXQwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc2V0MDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTJhYWE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc2V0MDEuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogUG9zaXRpdmUgdGVzdCBmb3IgU2VydmxldFJlc3BvbnNlLnJlc2V0KCkuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXNldDAxIGV4dGVuZHMgR2VuZXJpY1NlcnZsZXQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIHNlcnZsZXQgcmVxdWVzdCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNldDAxIEZBSUxFRCAtIERpZCBub3QgcmVzZXQgYnVmZmVyIik7CisgICAgICAgICAgICByZXNwb25zZS5yZXNldCgpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNldDAxIFBBU1NFRCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlJlc2V0MDEgRkFJTEVEIC0gVGhyZXcgSWxsZWdhU3RhdGVFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZGI3YmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDEuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBQb3NpdGl2ZSB0ZXN0IGZvciA8Y29kZT5TZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZSgpPC9jb2RlPiBhcyB3ZWxsIGFzCisgKiA8Y29kZT5DbGFzc0xvYWRlci5nZXRSZXNvdXJjZSgpPC9jb2RlPi4gIE9wZXJhdGlvbiBpcyBjb250cm9sbGVkIGJ5IHF1ZXJ5CisgKiBwYXJhbWV0ZXJzOgorICogPHVsPgorICogPGxpPjxzdHJvbmc+bW9kZTwvc3Ryb25nPiAtIFVzZSA8Y29kZT5jb250ZXh0PC9jb2RlPiBmb3Igc2VydmxldCBjb250ZXh0CisgKiAgICAgdGVzdCwgb3IgPGNvZGU+Y2xhc3M8L2NvZGU+IGZvciBjbGFzcyBsb2FkZXIgdGVzdC4gIFtjb250ZXh0XTwvbGk+CisgKiA8bGk+PHN0cm9uZz5wYXRoPC9zdHJvbmc+IC0gUmVzb3VyY2UgcGF0aCB0byB0aGUgcmVxdWVzdGVkIHJlc291cmNlLAorICogICAgIHN0YXJ0aW5nIHdpdGggYSBzbGFzaC4gIFsvV0VCLUlORi93ZWIueG1sXTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzMDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJZGVudGlmeSBvdXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIFN0cmluZyBtb2RlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm1vZGUiKTsKKyAgICAgICAgaWYgKG1vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIG1vZGUgPSAiY29udGV4dCI7CisgICAgICAgIFN0cmluZyBwYXRoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhdGgiKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHBhdGggPSAiL1dFQi1JTkYvd2ViLnhtbCI7CisKKyAgICAgICAgLy8gRXhlY3V0ZSB0aGUgZGVzaXJlZCB0ZXN0CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBVUkwgdXJsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICgiY29udGV4dCIuZXF1YWxzKG1vZGUpKQorICAgICAgICAgICAgICAgIHVybCA9IGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2UocGF0aCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKHBhdGgpOworICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNvdXJjZXMwMSBGQUlMRUQgLSBObyBVUkwgd2FzIHJldHVybmVkIik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzb3VyY2VzMDEgUEFTU0VEIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oInVybCA9ICIgKyB1cmwudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzb3VyY2VzMDEgRkFJTEVEIC0gTWFsZm9ybWVkVVJMRXhjZXB0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHdyYXBwZXIgbWVzc2FnZXMgYXMgcmVxdWlyZWQKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczAxLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1ZGU1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMS50eHQKQEAgLTAsMCArMSBAQAorUmVzb3VyY2VzMDEgUEFTU0VECmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMDBjMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDIuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBOZWdhdGl2ZSB0ZXN0IGZvciA8Y29kZT5TZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZSgpPC9jb2RlPiBhcyB3ZWxsIGFzCisgKiA8Y29kZT5DbGFzc0xvYWRlci5nZXRSZXNvdXJjZSgpPC9jb2RlPi4gIE9wZXJhdGlvbiBpcyBjb250cm9sbGVkIGJ5IHF1ZXJ5CisgKiBwYXJhbWV0ZXJzOgorICogPHVsPgorICogPGxpPjxzdHJvbmc+bW9kZTwvc3Ryb25nPiAtIFVzZSA8Y29kZT5jb250ZXh0PC9jb2RlPiBmb3Igc2VydmxldCBjb250ZXh0CisgKiAgICAgdGVzdCwgb3IgPGNvZGU+Y2xhc3M8L2NvZGU+IGZvciBjbGFzcyBsb2FkZXIgdGVzdC4gIFtjb250ZXh0XTwvbGk+CisgKiA8bGk+PHN0cm9uZz5wYXRoPC9zdHJvbmc+IC0gUmVzb3VyY2UgcGF0aCB0byB0aGUgcmVxdWVzdGVkIHJlc291cmNlLAorICogICAgIHN0YXJ0aW5nIHdpdGggYSBzbGFzaC4gIFsvV0VCLUlORi93ZWIueG1sXTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzMDIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJZGVudGlmeSBvdXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIFN0cmluZyBtb2RlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm1vZGUiKTsKKyAgICAgICAgaWYgKG1vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIG1vZGUgPSAiY29udGV4dCI7CisgICAgICAgIFN0cmluZyBwYXRoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhdGgiKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHBhdGggPSAiL1dFQi1JTkYvd2ViLnhtbCI7CisKKyAgICAgICAgLy8gRXhlY3V0ZSB0aGUgZGVzaXJlZCB0ZXN0CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBVUkwgdXJsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICgiY29udGV4dCIuZXF1YWxzKG1vZGUpKQorICAgICAgICAgICAgICAgIHVybCA9IGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2UocGF0aCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKHBhdGgpOworICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNvdXJjZXMwMiBQQVNTRUQiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzb3VyY2VzMDIgRkFJTEVEIC0gUmV0dXJuZWQgVVJMICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybC50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNvdXJjZXMwMiBGQUlMRUQgLSBNYWxmb3JtZWRVUkxFeGNlcHRpb246ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgd3JhcHBlciBtZXNzYWdlcyBhcyByZXF1aXJlZAorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDMuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTA1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDMuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogUG9zaXRpdmUgdGVzdCBmb3IgPGNvZGU+U2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbSgpPC9jb2RlPiBhcyB3ZWxsCisgKiBhcyA8Y29kZT5DbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCk8L2NvZGU+LiAgT3BlcmF0aW9uIGlzIGNvbnRyb2xsZWQKKyAqIGJ5IHF1ZXJ5IHBhcmFtZXRlcnM6CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5tb2RlPC9zdHJvbmc+IC0gVXNlIDxjb2RlPmNvbnRleHQ8L2NvZGU+IGZvciBzZXJ2bGV0IGNvbnRleHQKKyAqICAgICB0ZXN0LCBvciA8Y29kZT5jbGFzczwvY29kZT4gZm9yIGNsYXNzIGxvYWRlciB0ZXN0LiAgW2NvbnRleHRdPC9saT4KKyAqIDxsaT48c3Ryb25nPnBhdGg8L3N0cm9uZz4gLSBSZXNvdXJjZSBwYXRoIHRvIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UsCisgKiAgICAgc3RhcnRpbmcgd2l0aCBhIHNsYXNoLiAgWy9XRUItSU5GL3dlYi54bWxdPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXMwMyBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIElkZW50aWZ5IG91ciBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgU3RyaW5nIG1vZGUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigibW9kZSIpOworICAgICAgICBpZiAobW9kZSA9PSBudWxsKQorICAgICAgICAgICAgbW9kZSA9ICJjb250ZXh0IjsKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcGF0aCA9ICIvV0VCLUlORi93ZWIueG1sIjsKKworICAgICAgICAvLyBFeGVjdXRlIHRoZSBkZXNpcmVkIHRlc3QKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoImNvbnRleHQiLmVxdWFscyhtb2RlKSkgeworICAgICAgICAgICAgICAgIGlzID0gZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGgpOworICAgICAgICAgICAgICAgIHVybCA9IGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2UocGF0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlzID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0aCk7CisgICAgICAgICAgICAgICAgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKHBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNvdXJjZXMwMyBGQUlMRUQgLSBObyBJUyBvciBVUkwgd2FzIHJldHVybmVkIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzb3VyY2VzMDMgRkFJTEVEIC0gUmV0dXJuZWQgSVMgYnV0IG5vIFVSTCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlJlc291cmNlczAzIEZBSUxFRCAtIFJldHVybmVkIFVSTCBidXQgbm8gSVMiKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjID0gaXNyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSAoY2hhcikgYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8ICcgJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChjaCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaXNyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oInVybCA9ICIgKyB1cmwudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzb3VyY2VzMDMgRkFJTEVEIC0gTWFsZm9ybWVkVVJMRXhjZXB0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzb3VyY2VzMDMgRkFJTEVEIC0gSU9FeGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCB3cmFwcGVyIG1lc3NhZ2VzIGFzIHJlcXVpcmVkCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMy50eHQgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MGI0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDMudHh0CkBAIC0wLDAgKzEgQEAKK1Jlc291cmNlczAzIFBBU1NFRApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczA0LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjRmMTlhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczA0LmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogTmVnYXRpdmUgdGVzdCBmb3IgPGNvZGU+U2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbSgpPC9jb2RlPiBhcyB3ZWxsCisgKiBhcyA8Y29kZT5DbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCk8L2NvZGU+LiAgT3BlcmF0aW9uIGlzIGNvbnRyb2xsZWQKKyAqIGJ5IHF1ZXJ5IHBhcmFtZXRlcnM6CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5tb2RlPC9zdHJvbmc+IC0gVXNlIDxjb2RlPmNvbnRleHQ8L2NvZGU+IGZvciBzZXJ2bGV0IGNvbnRleHQKKyAqICAgICB0ZXN0LCBvciA8Y29kZT5jbGFzczwvY29kZT4gZm9yIGNsYXNzIGxvYWRlciB0ZXN0LiAgW2NvbnRleHRdPC9saT4KKyAqIDxsaT48c3Ryb25nPnBhdGg8L3N0cm9uZz4gLSBSZXNvdXJjZSBwYXRoIHRvIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UsCisgKiAgICAgc3RhcnRpbmcgd2l0aCBhIHNsYXNoLiAgWy9XRUItSU5GL3dlYi54bWxdPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXMwNCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIElkZW50aWZ5IG91ciBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgU3RyaW5nIG1vZGUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigibW9kZSIpOworICAgICAgICBpZiAobW9kZSA9PSBudWxsKQorICAgICAgICAgICAgbW9kZSA9ICJjb250ZXh0IjsKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcGF0aCA9ICIvV0VCLUlORi93ZWIueG1sIjsKKworICAgICAgICAvLyBFeGVjdXRlIHRoZSBkZXNpcmVkIHRlc3QKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoImNvbnRleHQiLmVxdWFscyhtb2RlKSkgeworICAgICAgICAgICAgICAgIGlzID0gZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGgpOworICAgICAgICAgICAgICAgIHVybCA9IGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2UocGF0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlzID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0aCk7CisgICAgICAgICAgICAgICAgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKHBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAodXJsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNvdXJjZXMwNCBQQVNTRUQiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNvdXJjZXMwNCBGQUlMRUQgLSBTdHJlYW0gaXMgbnVsbCBidXQgVVJMIGlzICIgKyB1cmwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodXJsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNvdXJjZXMwNCBGQUlMRUQgLSBTdHJlYW0gaXMgbm90IG51bGwgYW5kICBVUkwgaXMgIiArIHVybCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzb3VyY2VzMDQgRkFJTEVEIC0gU3RyZWFtIGlzIG5vdCBudWxsIGFuZCBVUkwgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlJlc291cmNlczA0IEZBSUxFRCAtIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCB3cmFwcGVyIG1lc3NhZ2VzIGFzIHJlcXVpcmVkCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwNS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczA1LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY0Y2IwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwNS5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBQb3NpdGl2ZSB0ZXN0IGZvciA8Y29kZT5TZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZSgpPC9jb2RlPiBhcyB3ZWxsIGFzCisgKiA8Y29kZT5DbGFzc0xvYWRlci5nZXRSZXNvdXJjZSgpPC9jb2RlPi4gIFRoZSBVUkwgcmV0dXJuZWQgYnkKKyAqIHRoZXNlIGNhbGxzIGlzIHRoZW4gb3BlbmVkIHdpdGggPGNvZGU+dXJsLm9wZW5TdHJlYW0oKTwvY29kZT4KKyAqIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IGRhdGEgaXMgYWN0dWFsbHkgcmVhZC4KKyAqIE9wZXJhdGlvbiBpcyBjb250cm9sbGVkIGJ5IHF1ZXJ5IHBhcmFtZXRlcnM6CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5tb2RlPC9zdHJvbmc+IC0gVXNlIDxjb2RlPmNvbnRleHQ8L2NvZGU+IGZvciBzZXJ2bGV0IGNvbnRleHQKKyAqICAgICB0ZXN0LCBvciA8Y29kZT5jbGFzczwvY29kZT4gZm9yIGNsYXNzIGxvYWRlciB0ZXN0LiAgW2NvbnRleHRdPC9saT4KKyAqIDxsaT48c3Ryb25nPnBhdGg8L3N0cm9uZz4gLSBSZXNvdXJjZSBwYXRoIHRvIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UsCisgKiAgICAgc3RhcnRpbmcgd2l0aCBhIHNsYXNoLiAgWy9XRUItSU5GL3dlYi54bWxdPC9saT4KKyAqIDxsaT48c3Ryb25nPnN0cmluZ2lmeTwvc3Ryb25nPiAtIElmIHNldCB0byBhbnkgYXJiaXRyYXJ5IHZhbHVlLCB0aGUgVVJMCisgKiAgICAgcmV0dXJuZWQgYnkgZ2V0UmVzb3VyY2UoKSB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIFN0cmluZyBhbmQgdGhlbiBiYWNrCisgKiAgICAgdG8gYSBVUkwgYmVmb3JlIGJlaW5nIG9wZW5lZC4gIFtub3Qgc2V0XTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzMDUgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJZGVudGlmeSBvdXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIFN0cmluZyBtb2RlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm1vZGUiKTsKKyAgICAgICAgaWYgKG1vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIG1vZGUgPSAiY29udGV4dCI7CisgICAgICAgIFN0cmluZyBwYXRoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhdGgiKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHBhdGggPSAiL1dFQi1JTkYvd2ViLnhtbCI7CisgICAgICAgIGJvb2xlYW4gc3RyaW5naWZ5ID0gKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzdHJpbmdpZnkiKSAhPSBudWxsKTsKKworICAgICAgICAvLyBQcmVwYXJlIGZvciB0aGUgZGVzaXJlZCB0ZXN0CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzciA9IG51bGw7CisgICAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgYXBwcm9wcmlhdGUgVVJMCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoImNvbnRleHQiLmVxdWFscyhtb2RlKSkKKyAgICAgICAgICAgICAgICB1cmwgPSBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlc291cmNlKHBhdGgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZShwYXRoKTsKKyAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgTm8gVVJMIHJldHVybmVkIik7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgZ2V0UmVzb3VyY2UgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIik7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RyaW5naWZ5IHRoZSBVUkwgaWYgcmVxdWVzdGVkCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlN0cmluZ2lmeWluZyB0aGUgVVJMIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9IHVybC50b1N0cmluZygpOworICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwodXJsU3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgc3RyaW5naWZ5IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3BlbiBhbiBpbnB1dCBzdHJlYW0gYW5kIGlucHV0IHN0cmVhbSByZWFkZXIgb24gdGhpcyBVUkwKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIE9wZW4gSU9FeGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGlzIHN0cmVhbSB0byBvdXIgb3V0cHV0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSBpc3IucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgoY2hhcikgY2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBDb3B5IElPRXhjZXB0aW9uOiAiICsgZSk7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2xvc2UgdGhlIGlucHV0IHN0cmVhbQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgaXNyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgQ2xvc2UgSU9FeGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBhbnkgZmFpbHVyZXMgd2UgaGF2ZSBlbmNvdW50ZXJlZAorICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIlJlc291cmNlczA1IEZBSUxFRCAtIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihyZXN1bHRzLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHdyYXBwZXIgbWVzc2FnZXMgYXMgcmVxdWlyZWQKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczA1LnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwNS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiMDRmMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwNS50eHQKQEAgLTAsMCArMSBAQAorUmVzb3VyY2VzMDUgUEFTU0VECmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDYuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwNi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMThkZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDYuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogUG9zaXRpdmUgdGVzdCBmb3IgPGNvZGU+Z2V0UmVzb3VyY2VQYXRocygpPC9jb2RlPiwgd2hpY2ggd2lsbCBzcGVjaWZ5IHRoZQorICogZGlyZWN0b3J5IHBhdGggaW5kaWNhdGVkIGJ5IHRoZSA8c3Ryb25nPnBhdGg8L3N0cm9uZz4gcmVxdWVzdCBwYXJhbWV0ZXIuCisgKiBGb3Iga25vd24gcGF0aHMsIGF0IGxlYXN0IHRoZSBrbm93biBzZXQgb2YgaW5jbHVkZWQgcmVzb3VyY2VzIG11c3QgYmUKKyAqIGZvdW5kIGluIG9yZGVyIHRvIHBhc3MuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXMwNiBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIC8vIFJlc291cmNlIExpc3RzIChpbmNvbXBsZXRlKSBmb3Iga25vd24gZGlyZWN0b3J5IHBhdGhzCisgICAgU3RyaW5nIHJvb3RQYXRoc1tdID0KKyAgICB7ICIvRXJyb3JQYWdlMDYuaHRtbCIsICIvRXJyb3JQYWdlMDYuanNwIiwgIi9Gb3J3YXJkMDEudHh0IiwKKyAgICAgICIvSW5jbHVkZTAxLnR4dCIsICIvV0VCLUlORi8iLCAiL1hlcmNlczAwLmpzcCIsICIvWGVyY2VzMDEueG1sIiwKKyAgICAgICIvWGVyY2VzMDIuanNwIiwgIi9nb2xkZW4vIiwgIi9pbmNsdWRlbWUudHh0IiwgIi9pbmRleC5zaHRtbCIsCisgICAgICAiL3NzaWRpci8iIH07CisKKyAgICBTdHJpbmcgZ29sZGVuUGF0aHNbXSA9CisgICAgeyAiL2dvbGRlbi9Hb2xkZW4wMS50eHQiLCAiL2dvbGRlbi9TU0lDb25maWcwMS50eHQiLAorICAgICAgIi9nb2xkZW4vU1NJQ29uZmlnMDMudHh0IiwgIi9nb2xkZW4vU1NJRnNpemUwMi50eHQiLAorICAgICAgIi9nb2xkZW4vU1NJSW5jbHVkZTAxLnR4dCIsICIvZ29sZGVuL1NTSUluY2x1ZGUwMi50eHQiLAorICAgICAgIi9nb2xkZW4vU2Vzc2lvbjA1LnR4dCIgfTsKKworICAgIFN0cmluZyB3ZWJpbmZQYXRoc1tdID0KKyAgICB7ICIvV0VCLUlORi9jbGFzc2VzLyIsICIvV0VCLUlORi9saWIvIiwgIi9XRUItSU5GL3dlYi54bWwiIH07CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgb3VyIG91dHB1dCB3cml0ZXIKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gSWRlbnRpZnkgb3VyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyBwYXRoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhdGgiKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgIFN0cmluZyBwYXRoc1tdID0gbnVsbDsKKyAgICAgICAgaWYgKCIvIi5lcXVhbHMocGF0aCkpCisgICAgICAgICAgICBwYXRocyA9IHJvb3RQYXRoczsKKyAgICAgICAgZWxzZSBpZiAoIi9nb2xkZW4iLmVxdWFscyhwYXRoKSkKKyAgICAgICAgICAgIHBhdGhzID0gZ29sZGVuUGF0aHM7CisgICAgICAgIGVsc2UgaWYgKCIvV0VCLUlORiIuZXF1YWxzKHBhdGgpKQorICAgICAgICAgICAgcGF0aHMgPSB3ZWJpbmZQYXRoczsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBVbmtub3duIHBhdGggJyIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHBhdGgpOworICAgICAgICAgICAgc2IuYXBwZW5kKCInLyIpOworICAgICAgICB9CisgICAgICAgIGludCBjb3VudHNbXSA9IG51bGw7CisgICAgICAgIGlmIChwYXRocyAhPSBudWxsKQorICAgICAgICAgICAgY291bnRzID0gbmV3IGludFtwYXRocy5sZW5ndGhdOworCisgICAgICAgIC8vIFJlcXVlc3QgdGhlIHNldCBvZiByZXNvdXJjZXMgaW4gdGhlIHNwZWNpZmllZCBwYXRoCisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiUHJvY2Vzc2luZyBwYXRoICciICsgcGF0aCArICInIik7CisgICAgICAgIFN0cmluZyBmaXJzdCA9IG51bGw7CisgICAgICAgIFNldCBzZXQgPSBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlc291cmNlUGF0aHMocGF0aCk7CisgICAgICAgIGlmIChzZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgTm8gcmVzb3VyY2VzIHJldHVybmVkLyIpOworICAgICAgICAgICAgc2V0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvdW50IHRoZSBvY2N1cnJlbmNlcyBvZiB0aGUgcmVzb3VyY2VzIHdlIGtub3cgYWJvdXQKKyAgICAgICAgSXRlcmF0b3IgcmVzb3VyY2VzID0gc2V0Lml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChyZXNvdXJjZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2UgPSAoU3RyaW5nKSByZXNvdXJjZXMubmV4dCgpOworICAgICAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpCisgICAgICAgICAgICAgICAgZmlyc3QgPSByZXNvdXJjZTsKKyAgICAgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiRm91bmQgcmVzb3VyY2UgJyIgKyByZXNvdXJjZSArICInIik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGhzW2ldLmVxdWFscyhyZXNvdXJjZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnRzW2ldKys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBvbiBhbnkgbWlzc2luZyBvciBkdXBsaWNhdGVkIHJlc291cmNlcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY291bnRzW2ldIDwgMSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIE1pc3NpbmcgcmVzb3VyY2UgJyIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYXRoc1tpXSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCInLyIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudHNbaV0gPiAyKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgUmVzb3VyY2UgJyIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYXRoc1tpXSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCInIG9jY3VycmVkICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjb3VudHNbaV0pOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHRpbWVzLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIHJldHVybmVkIHNldCBpcyBpbW11dGFibGUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBuZXdFbGVtZW50ID0gIk5FVyBGT08iOworICAgICAgICAgICAgc2V0LmFkZChuZXdFbGVtZW50KTsKKyAgICAgICAgICAgIGlmIChzZXQuY29udGFpbnMobmV3RWxlbWVudCkpCisgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIFNldCBhbGxvd2VkIGFkZCgpLyIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZmlyc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldC5yZW1vdmUoZmlyc3QpOworICAgICAgICAgICAgICAgIGlmICghc2V0LmNvbnRhaW5zKGZpcnN0KSkKKyAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIFNldCBhbGxvd2VkIHJlbW92ZSgpLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXQuY2xlYXIoKTsKKyAgICAgICAgICAgIGlmIChzZXQuc2l6ZSgpID09IDApCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgU2V0IGFsbG93ZWQgY2xlYXIoKS8iKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gUmVwb3J0IGFueSBmYWlsdXJlcyB3ZSBoYXZlIGVuY291bnRlcmVkCisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiUmVzb3VyY2VzMDYgRkFJTEVEIC0iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNiLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlJlc291cmNlczA2IFBBU1NFRCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHdyYXBwZXIgbWVzc2FnZXMgYXMgcmVxdWlyZWQKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc3BvbnNlV3JhcDAxLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzcG9uc2VXcmFwMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTIyZDgxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc3BvbnNlV3JhcDAxLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBCYXNpcyBmb3IgdGVzdGluZyB3cmFwcGVkIHJlc3BvbnNlcyB3aXRoIGNvbWJpbmF0aW9ucyBvZiBmb3J3YXJkaW5nIHRvCisgKiBvciBpbmNsdWRpbmcgYm90aCBzZXJ2bGV0cyBhbmQgSlNQIHBhZ2VzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzcG9uc2VXcmFwMDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBBY3F1aXJlIHJlcXVlc3QgcGFyYW1ldGVycworICAgICAgICBTdHJpbmcgdHlwZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ0eXBlIik7CisgICAgICAgIFN0cmluZyBwYWdlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhZ2UiKTsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgLy8JUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gRm9yd2FyZCBvciBpbmNsdWRlIGFzIHJlcXVlc3RlZAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKHBhZ2UpOworICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzcG9uc2VXcmFwMDEgRkFJTEVEIC0gTm8gcmVxdWVzdCBkaXNwYXRjaGVyIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciAiICsgcGFnZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIkYiLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIgd3JhcHBlciA9CisgICAgICAgICAgICAgICAgbmV3IENoYXJBcnJheVJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJkLmZvcndhcmQocmVxdWVzdCwgd3JhcHBlcik7CisgICAgICAgICAgICB3cmFwcGVyLmZsdXNoQnVmZmVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlciB3cmFwcGVyID0KKyAgICAgICAgICAgICAgICBuZXcgQ2hhckFycmF5UmVzcG9uc2UocmVzcG9uc2UpOworICAgICAgICAgICAgcmQuaW5jbHVkZShyZXF1ZXN0LCB3cmFwcGVyKTsKKyAgICAgICAgICAgIHdyYXBwZXIuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIGZpbHRlciB3cmFwcGluZyBmb3IgdGhpcyB0ZXN0IHNlcmllcworICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc3BvbnNlV3JhcDAxYS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc3BvbnNlV3JhcDAxYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MzEyMmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzcG9uc2VXcmFwMDFhLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBCYXNpcyBmb3IgdGVzdGluZyB3cmFwcGVkIHJlc3BvbnNlcyB3aXRoIGNvbWJpbmF0aW9ucyBvZiBmb3J3YXJkaW5nIHRvCisgKiBvciBpbmNsdWRpbmcgYm90aCBzZXJ2bGV0cyBhbmQgSlNQIHBhZ2VzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzcG9uc2VXcmFwMDFhIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzcG9uc2VXcmFwMDFhIFBBU1NFRCIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzcG9uc2VXcmFwMDFjLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzcG9uc2VXcmFwMDFjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NlMDBmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNwb25zZVdyYXAwMWMuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIEJhc2lzIGZvciB0ZXN0aW5nIHdyYXBwZWQgcmVzcG9uc2VzIHdpdGggY29tYmluYXRpb25zIG9mIGZvcndhcmRpbmcgdG8KKyAqIG9yIGluY2x1ZGluZyBib3RoIHNlcnZsZXRzIGFuZCBKU1AgcGFnZXMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXNwb25zZVdyYXAwMWMgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNwb25zZVdyYXAwMWMgUEFTU0VEIik7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjM4OGVlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Nlc3Npb24wMS5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLnNoYXJlZC5TaGFyZWRTZXNzaW9uQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRlc3Rlci51bnBzaGFyZWQuVW5wU2hhcmVkU2Vzc2lvbkJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS50ZXN0ZXIudW5zaGFyZWQuVW5zaGFyZWRTZXNzaW9uQmVhbjsKKworCisvKioKKyAqIFBhcnQgMSBvZiBTZXNzaW9uIFRlc3RzLiAgRW5zdXJlcyB0aGF0IHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbiwgdGhlbgorICogY3JlYXRlcyBhIG5ldyBzZXNzaW9uIGFuZCBzZXRzIGEgc2Vzc2lvbiBhdHRyaWJ1dGUuICBBbHNvLCBlbnN1cmUgdGhhdAorICogY2FsbGluZyBzZXRBdHRyaWJ1dGUoIm5hbWUiLCBudWxsKSBhY3RzIGxpa2UgcmVtb3ZlQXR0cmlidXRlKCkuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZXNzaW9uMDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24KKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpOworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAxIEZBSUxFRCAtIFJlcXVlc3RlZCBleGlzdGluZyBzZXNzaW9uICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJZCgpKTsKKyAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgc2Vzc2lvbgorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24odHJ1ZSk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMSBGQUlMRUQgLSBObyBzZXNzaW9uIGNyZWF0ZWQiKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgYW4gYWN0aXZhdGlvbiBldmVudCBsaXN0ZW5lciBpbiB0aGUgc2Vzc2lvbgorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJhY3RpdmF0aW9uTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlc3Npb25MaXN0ZW5lcjAzKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlcmUgaXMgbm8gZXhpc3RpbmcgYXR0cmlidXRlCisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgaWYgKHNlc3Npb24uZ2V0QXR0cmlidXRlKCJzZXNzaW9uQmVhbiIpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAxIEZBSUxFRCAtIEF0dHJpYnV0ZSBhbHJlYWR5IGV4aXN0cyIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYW5kIHN0YXNoIGEgc2Vzc2lvbiBhdHRyaWJ1dGUKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBTZXNzaW9uQmVhbiBiZWFuID0gbmV3IFNlc3Npb25CZWFuKCk7CisgICAgICAgICAgICBiZWFuLnNldFN0cmluZ1Byb3BlcnR5KCJTZXNzaW9uMDEiKTsKKyAgICAgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJzZXNzaW9uQmVhbiIsIGJlYW4pOworICAgICAgICB9CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgY2FuIHJldHJpZXZlIHRoZSBhdHRyaWJ1dGUgc3VjY2Vzc2Z1bGx5CisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgT2JqZWN0IGJlYW4gPSBzZXNzaW9uLmdldEF0dHJpYnV0ZSgic2Vzc2lvbkJlYW4iKTsKKyAgICAgICAgICAgIGlmIChiZWFuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAxIEZBSUxFRCAtIENhbm5vdCByZXRyaWV2ZSBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmICghKGJlYW4gaW5zdGFuY2VvZiBTZXNzaW9uQmVhbikpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAxIEZBSUxFRCAtIEF0dHJpYnV0ZSBpbnN0YW5jZSBvZiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoKFNlc3Npb25CZWFuKSBiZWFuKS5nZXRTdHJpbmdQcm9wZXJ0eSgpOworICAgICAgICAgICAgICAgIGlmICghIlNlc3Npb24wMSIuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAxIEZBSUxFRCAtIFByb3BlcnR5ID0gIiArIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBFbnN1cmUgdGhhdCBzZXRBdHRyaWJ1dGUoIm5hbWUiLCBudWxsKSB3b3JrcyBjb3JyZWN0bHkKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgiRk9PIiwgIkJBUiIpOworICAgICAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoIkZPTyIsIG51bGwpOworICAgICAgICAgICAgaWYgKHNlc3Npb24uZ2V0QXR0cmlidXRlKCJGT08iKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMSBGQUlMRUQgLSBzZXRBdHRyaWJ1dGUobmFtZSxudWxsKSIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgbW9yZSBiZWFucyB0aGF0IHdpbGwgYmUgdXNlZCB0byB0ZXN0IGFwcGxpY2F0aW9uIHJlc3RhcnQKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBTaGFyZWRTZXNzaW9uQmVhbiBzc2IgPSBuZXcgU2hhcmVkU2Vzc2lvbkJlYW4oKTsKKyAgICAgICAgICAgIHNzYi5zZXRTdHJpbmdQcm9wZXJ0eSgiU2Vzc2lvbjAxIik7CisgICAgICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgic2hhcmVkU2Vzc2lvbkJlYW4iLCBzc2IpOworICAgICAgICAgICAgVW5wU2hhcmVkU2Vzc2lvbkJlYW4gdXNzYiA9IG5ldyBVbnBTaGFyZWRTZXNzaW9uQmVhbigpOworICAgICAgICAgICAgdXNzYi5zZXRTdHJpbmdQcm9wZXJ0eSgiU2Vzc2lvbjAxIik7CisgICAgICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgidW5wU2hhcmVkU2Vzc2lvbkJlYW4iLCB1c3NiKTsKKyAgICAgICAgICAgIFVuc2hhcmVkU2Vzc2lvbkJlYW4gdXNiID0gbmV3IFVuc2hhcmVkU2Vzc2lvbkJlYW4oKTsKKyAgICAgICAgICAgIHVzYi5zZXRTdHJpbmdQcm9wZXJ0eSgiU2Vzc2lvbjAxIik7CisgICAgICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgidW5zaGFyZWRTZXNzaW9uQmVhbiIsIHVzYik7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgc3VjY2VzcyBpZiBldmVyeXRoaW5nIGlzIHN0aWxsIG9rCisgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJTZXNzaW9uMDEgUEFTU0VEIik7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWU5MmU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Nlc3Npb24wMi5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogUGFydCAyIG9mIFNlc3Npb24gVGVzdHMuICBFbnN1cmVzIHRoYXQgdGhlcmUgaXMgYW4gZXhpc3Rpbmcgc2Vzc2lvbiwgYW5kCisgKiB0aGF0IHRoZSBzZXNzaW9uIGJlYW4gc3Rhc2hlZCBpbiBQYXJ0IDEgY2FuIGJlIHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZXNzaW9uMDIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGVyZSBpcyBhIGN1cnJlbnQgc2Vzc2lvbgorICAgICAgICBib29sZWFuIG9rID0gdHJ1ZTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbihmYWxzZSk7CisgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJTZXNzaW9uMDIgRkFJTEVEIC0gTm8gZXhpc3Rpbmcgc2Vzc2lvbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCkpOworICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGNhbiByZXRyaWV2ZSB0aGUgYXR0cmlidXRlIHN1Y2Nlc3NmdWxseQorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIE9iamVjdCBiZWFuID0gc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoInNlc3Npb25CZWFuIik7CisgICAgICAgICAgICBpZiAoYmVhbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMiBGQUlMRUQgLSBDYW5ub3QgcmV0cmlldmUgYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShiZWFuIGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMiBGQUlMRUQgLSBBdHRyaWJ1dGUgaW5zdGFuY2Ugb2YgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKChTZXNzaW9uQmVhbikgYmVhbikuZ2V0U3RyaW5nUHJvcGVydHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoISJTZXNzaW9uMDEiLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMiBGQUlMRUQgLSBQcm9wZXJ0eSA9ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHN1Y2Nlc3MgaWYgZXZlcnl0aGluZyBpcyBzdGlsbCBvaworICAgICAgICBpZiAob2spCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAyIFBBU1NFRCIpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbjAzLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbjAzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJiZDYwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDMuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRlc3Rlci5zaGFyZWQuU2hhcmVkU2Vzc2lvbkJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS50ZXN0ZXIudW5wc2hhcmVkLlVucFNoYXJlZFNlc3Npb25CZWFuOworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLnVuc2hhcmVkLlVuc2hhcmVkU2Vzc2lvbkJlYW47CisKKworLyoqCisgKiBQYXJ0IDMgb2YgU2Vzc2lvbiBUZXN0cy4gIEVuc3VyZXMgdGhhdCB0aGVyZSBpcyBhbiBleGlzdGluZyBzZXNzaW9uLCBhbmQKKyAqIHRoYXQgdGhlIHNlc3Npb24gYmVhbiBzdGFzaGVkIGluIFBhcnQgMSBjYW4gYmUgcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS4KKyAqIFRoZW4sIGl0IHJlbW92ZXMgdGhhdCBhdHRyaWJ1dGUgYW5kIHZlcmlmaWVzIHN1Y2Nlc3NmdWwgcmVtb3ZhbC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFNlc3Npb24wMyBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZXJlIGlzIGEgY3VycmVudCBzZXNzaW9uCisgICAgICAgIGJvb2xlYW4gb2sgPSB0cnVlOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKGZhbHNlKTsKKyAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMyBGQUlMRUQgLSBObyBleGlzdGluZyBzZXNzaW9uICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKSk7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgY2FuIHJldHJpZXZlIHRoZSBhdHRyaWJ1dGUgc3VjY2Vzc2Z1bGx5CisJU2Vzc2lvbkJlYW4gYmVhbiA9IG51bGw7CisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHNlc3Npb24uZ2V0QXR0cmlidXRlKCJzZXNzaW9uQmVhbiIpOworICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMyBGQUlMRUQgLSBDYW5ub3QgcmV0cmlldmUgYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbikpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAzIEZBSUxFRCAtIEF0dHJpYnV0ZSBpbnN0YW5jZSBvZiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJlYW4gPSAoU2Vzc2lvbkJlYW4pIG9iamVjdDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBiZWFuLmdldFN0cmluZ1Byb3BlcnR5KCk7CisgICAgICAgICAgICAgICAgaWYgKCEiU2Vzc2lvbjAxIi5lcXVhbHModmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJTZXNzaW9uMDMgRkFJTEVEIC0gUHJvcGVydHkgPSAiICsgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSB0aGUgYXR0cmlidXRlIGFuZCBndWFyYW50ZWUgdGhhdCB0aGlzIHdhcyBzdWNjZXNzZnVsCisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUoInNlc3Npb25CZWFuIik7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoInNlc3Npb25CZWFuIikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJTZXNzaW9uMDMgRkFJTEVEIC0gUmVtb3ZhbCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKwkvLyBWYWxpZGF0ZSB0aGUgYmVhbiBsaWZlY3ljbGUgb2YgdGhpcyBiZWFuCisJaWYgKG9rKSB7CisJICAgIFN0cmluZyBsaWZlY3ljbGUgPSBiZWFuLmdldExpZmVjeWNsZSgpOworCSAgICBpZiAoISIvdmIvc3dwL3NkYS92dSIuZXF1YWxzKGxpZmVjeWNsZSkpIHsKKwkgICAgICAgIHdyaXRlci5wcmludGxuKCJTZXNzaW9uMDMgRkFJTEVEIC0gSW52YWxpZCBiZWFuIGxpZmVjeWNsZSAnIiArCisJCQkgICAgICAgbGlmZWN5Y2xlICsgIiciKTsKKwkJb2sgPSBmYWxzZTsKKwkgICAgfQorCX0KKworICAgICAgICAvLyBSZXRyaWV2ZSBhbmQgdmFsaWRhdGUgdGhlIHNoYXJlZCBzZXNzaW9uIGJlYW4KKyAgICAgICAgU2hhcmVkU2Vzc2lvbkJlYW4gc3NiID0gbnVsbDsKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoInNoYXJlZFNlc3Npb25CZWFuIik7CisgICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAzIEZBSUxFRCAtIENhbm5vdCByZXRyaWV2ZSBzc2IiKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFNoYXJlZFNlc3Npb25CZWFuKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJTZXNzaW9uMDMgRkFJTEVEIC0gU2hhcmVkIGF0dHJpYnV0ZSBjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNzYiA9IChTaGFyZWRTZXNzaW9uQmVhbikgb2JqZWN0OworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHNzYi5nZXRTdHJpbmdQcm9wZXJ0eSgpOworICAgICAgICAgICAgICAgIGlmICghIlNlc3Npb24wMSIuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAzIEZBSUxFRCAtIFNoYXJlZCBwcm9wZXJ0eSA9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZSgic2hhcmVkU2Vzc2lvbkJlYW4iKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpZmVjeWNsZSA9IHNzYi5nZXRMaWZlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEiL3ZiL3N3cC9zZGEvdnUiLmVxdWFscyhsaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAzIEZBSUxFRCAtIFNoYXJlZCBsaWZlY3ljbGUgPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGlmZWN5Y2xlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXRyaWV2ZSBhbmQgdmFsaWRhdGUgdGhlIHVucGFja2VkIHNoYXJlZCBzZXNzaW9uIGJlYW4KKyAgICAgICAgVW5wU2hhcmVkU2Vzc2lvbkJlYW4gdXNzYiA9IG51bGw7CisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ1bnBTaGFyZWRTZXNzaW9uQmVhbiIpOworICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMyBGQUlMRUQgLSBDYW5ub3QgcmV0cmlldmUgdXNzYiIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgVW5wU2hhcmVkU2Vzc2lvbkJlYW4pKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMyBGQUlMRUQgLSB1bnBTaGFyZWQgYXR0cmlidXRlIGNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXNzYiA9IChVbnBTaGFyZWRTZXNzaW9uQmVhbikgb2JqZWN0OworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHVzc2IuZ2V0U3RyaW5nUHJvcGVydHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoISJTZXNzaW9uMDEiLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMyBGQUlMRUQgLSB1bnBTaGFyZWQgcHJvcGVydHkgPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUoInVucFNoYXJlZFNlc3Npb25CZWFuIik7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaWZlY3ljbGUgPSBzc2IuZ2V0TGlmZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghIi92Yi9zd3Avc2RhL3Z1Ii5lcXVhbHMobGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMyBGQUlMRUQgLSB1bnBTaGFyZWQgbGlmZWN5Y2xlID0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxpZmVjeWNsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0cmlldmUgYW5kIHZhbGlkYXRlIHRoZSB1bnNoYXJlZCBzZXNzaW9uIGJlYW4KKyAgICAgICAgVW5zaGFyZWRTZXNzaW9uQmVhbiB1c2IgPSBudWxsOworICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBzZXNzaW9uLmdldEF0dHJpYnV0ZSgidW5zaGFyZWRTZXNzaW9uQmVhbiIpOworICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMyBGQUlMRUQgLSBDYW5ub3QgcmV0cmlldmUgdXNiIik7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBVbnNoYXJlZFNlc3Npb25CZWFuKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJTZXNzaW9uMDMgRkFJTEVEIC0gVW5zaGFyZWQgYXR0cmlidXRlIGNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXNiID0gKFVuc2hhcmVkU2Vzc2lvbkJlYW4pIG9iamVjdDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSB1c2IuZ2V0U3RyaW5nUHJvcGVydHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoISJTZXNzaW9uMDEiLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMyBGQUlMRUQgLSBVbnNoYXJlZCBwcm9wZXJ0eSA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUoInVuc2hhcmVkU2Vzc2lvbkJlYW4iKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpZmVjeWNsZSA9IHVzYi5nZXRMaWZlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEiL3ZiL3N3cC9zZGEvdnUiLmVxdWFscyhsaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAzIEZBSUxFRCAtIFVuc2hhcmVkIGxpZmVjeWNsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiA9ICIgKyBsaWZlY3ljbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gUmVwb3J0IHN1Y2Nlc3MgaWYgZXZlcnl0aGluZyBpcyBzdGlsbCBvaworICAgICAgICBpZiAob2spCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAzIFBBU1NFRCIpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbjA0LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbjA0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViOTg2OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDQuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBQYXJ0IDQgb2YgU2Vzc2lvbiBUZXN0cy4gIEVuc3VyZXMgdGhhdCB0aGVyZSBpcyBhbiBleGlzdGluZyBzZXNzaW9uLCBhbmQKKyAqIHRoYXQgdGhlIHJlcXVlc3RlZCBzZXNzaW9uIGluZm9ybWF0aW9uIG1hdGNoZXMgaXQuICBBbHNvLCBlbnN1cmUgdGhhdCB3ZQorICogY2FuIGludmFsaWRhdGUgdGhpcyBzZXNzaW9uIGFuZCBjcmVhdGUgYSBuZXcgb25lICh3aXRoIGEgZGlmZmVyZW50IHNlc3Npb24KKyAqIGlkZW50aWZpZXIpIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyByZXF1ZXN0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2Vzc2lvbjA0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgbG9nKCJTZXNzaW9uMDQgLSBTdGFydGluZywgcmVxdWVzdGVkU2Vzc2lvbklkID0gIiArCisgICAgICAgICAgICByZXF1ZXN0LmdldFJlcXVlc3RlZFNlc3Npb25JZCgpKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlcmUgaXMgYSBjdXJyZW50IHNlc3Npb24KKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIEh0dHBTZXNzaW9uIG9sZFNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpOworICAgICAgICBpZiAob2xkU2Vzc2lvbiA9PSBudWxsKQorICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBObyBleGlzdGluZyBzZXNzaW9uLyIpOworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHNlc3Npb24gaWRlbnRpZmllciBvZiB0aGUgb2xkIHNlc3Npb24KKyAgICAgICAgU3RyaW5nIG9sZFNlc3Npb25JZCA9IG51bGw7CisgICAgICAgIGlmIChvbGRTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb2xkU2Vzc2lvbklkID0gb2xkU2Vzc2lvbi5nZXRJZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIE9sZCBzZXNzaW9uIGlzIGV4cGlyZWQvIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBNYXRjaCBhZ2FpbnN0IHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBpZGVudGlmaWVyCisgICAgICAgIFN0cmluZyByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBudWxsOworICAgICAgICBpZiAob2xkU2Vzc2lvbklkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3RlZFNlc3Npb25JZCA9IHJlcXVlc3QuZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCk7CisgICAgICAgICAgICBpZiAocmVxdWVzdGVkU2Vzc2lvbklkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIE5vIHJlcXVlc3RlZCBzZXNzaW9uIGlkLyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3QuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZCgpKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIFJlcXVlc3RlZCBzZXNzaW9uIGlkIGlzIG5vdCB2YWxpZC8iKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9sZFNlc3Npb25JZC5lcXVhbHMocmVxdWVzdGVkU2Vzc2lvbklkKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIFJlcXVlc3RlZCBzZXNzaW9uPSIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIE9sZCBzZXNzaW9uPSIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChvbGRTZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIHJlY2VpdmVkIHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBpZGVudGlmaWVyIGNvcnJlY3RseQorICAgICAgICBpZiAocmVxdWVzdGVkU2Vzc2lvbklkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghcmVxdWVzdC5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKSkKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIFJlcXVlc3RlZCBzZXNzaW9uIG5vdCBmcm9tIGNvb2tpZS8iKTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0LmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpKQorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgUmVxdWVzdGVkIHNlc3Npb24gZnJvbSBVUkwvIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gY3JlYXRlIGFuIGF0dHJpYnV0ZSBpbiB0aGUgb2xkIHNlc3Npb24KKyAgICAgICAgaWYgKG9sZFNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgU2Vzc2lvbkJlYW4gYmVhbiA9IG5ldyBTZXNzaW9uQmVhbigpOworICAgICAgICAgICAgYmVhbi5zZXRTdHJpbmdQcm9wZXJ0eSgiU2Vzc2lvbjA0Iik7CisgICAgICAgICAgICBvbGRTZXNzaW9uLnNldEF0dHJpYnV0ZSgic2Vzc2lvbkJlYW4iLCBiZWFuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIGNhbiBpbnZhbGlkYXRlIHRoZSBvbGQgc2Vzc2lvbgorICAgICAgICBpZiAob2xkU2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9sZFNlc3Npb24uaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIE9sZCBzZXNzaW9uIGlzIGFscmVhZHkgaW52YWxpZGF0ZWQvIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gY3JlYXRlIGEgbmV3IHNlc3Npb24KKyAgICAgICAgSHR0cFNlc3Npb24gbmV3U2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbih0cnVlKTsKKyAgICAgICAgaWYgKG5ld1Nlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBDYW5ub3QgY3JlYXRlIG5ldyBzZXNzaW9uLyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIG5ld1Nlc3Npb25JZCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5ld1Nlc3Npb25JZCA9IG5ld1Nlc3Npb24uZ2V0SWQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBOZXcgc2Vzc2lvbiBpcyBhbHJlYWR5IGludmFsaWRhdGVkLyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChvbGRTZXNzaW9uICE9IG51bGwpICYmIChuZXdTZXNzaW9uICE9IG51bGwpKSB7CisgICAgICAgICAgICAgICAgaWYgKG9sZFNlc3Npb24gPT0gbmV3U2Vzc2lvbikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBvbGRTZXNzaW9uID09IG5ld1Nlc3Npb24vIik7CisgICAgICAgICAgICAgICAgaWYgKG9sZFNlc3Npb24uZXF1YWxzKG5ld1Nlc3Npb24pKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIG9sZFNlc3Npb24gZXF1YWxzIG5ld1Nlc3Npb24vIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG9sZFNlc3Npb25JZCAhPSBudWxsKSAmJiAobmV3U2Vzc2lvbklkICE9IG51bGwpICYmCisgICAgICAgICAgICAgICAgb2xkU2Vzc2lvbklkLmVxdWFscyhuZXdTZXNzaW9uSWQpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBOZXcgc2Vzc2lvbiBpZCA9IG9sZCBzZXNzaW9uIGlkLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIG9sZCBzZXNzaW9uJ3MgYXR0cmlidXRlIGRpZCBub3QgY2FycnkgZm9yd2FyZAorICAgICAgICBpZiAobmV3U2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBTZXNzaW9uQmVhbiBiZWFuID0KKyAgICAgICAgICAgICAgICAoU2Vzc2lvbkJlYW4pIG5ld1Nlc3Npb24uZ2V0QXR0cmlidXRlKCJzZXNzaW9uQmVhbiIpOworICAgICAgICAgICAgaWYgKGJlYW4gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIE5ldyBzZXNzaW9uIGhhcyBhdHRyaWJ1dGUgYWxyZWFkeS8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIGFuIGFjdGl2YXRpb24gZXZlbnQgbGlzdGVuZXIgaW4gdGhlIHNlc3Npb24KKyAgICAgICAgbmV3U2Vzc2lvbi5zZXRBdHRyaWJ1dGUoImFjdGl2YXRpb25MaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2Vzc2lvbkxpc3RlbmVyMDMoKSk7CisKKyAgICAgICAgLy8gUmVwb3J0IHN1Y2Nlc3MgaWYgZXZlcnl0aGluZyBpcyBzdGlsbCBvaworICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wNCBQQVNTRUQiKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIlNlc3Npb24wNCBGQUlMRUQgLSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4ocmVzdWx0cy50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworICAgICAgICBsb2coIlNlc3Npb24wNCAtIFN0b3BwaW5nIik7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDUuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWQ3NWM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Nlc3Npb24wNS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogUGFydCA1IG9mIFNlc3Npb24gVGVzdHMuICBFbnN1cmVzIHRoYXQgdGhlIGFwcHJvcHJpYXRlIHNlc3Npb24gbGlzdGVuZXIKKyAqIGV2ZW50cyBnZXQgY2FsbGVkIGluIHRoZSBhcHByb3ByaWF0ZSBvcmRlci4gIFJlbGllcyBvbiBwcm9wZXIgY29uZmlndXJhdGlvbgorICogb2YgU2Vzc2lvbkxpc3RlbmVyMDEgYW5kIFNlc3Npb25MaXN0ZW5lcjAyIGluIHRoZSB3ZWIueG1sIGZpbGUKKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFNlc3Npb24wNSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFJlc2V0IHRoZSBzdGF0aWMgbG9nZ2VyIHRvIGVuc3VyZSBubyBsZWZ0b3ZlcnMgZXhpc3QKKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICAgICAgLy8gUGVyZm9ybSBzZXNzaW9uIG1hbmFnZW1lbnQgYWN0aXZpdGllcyB0byB0cmlnZ2VyIGxpc3RlbmVyIGV2ZW50cworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKHRydWUpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgiYXR0cmlidXRlMSIsICJ2YWx1ZTEiKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoImF0dHJpYnV0ZTEiLCAidmFsdWUyIik7CisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKCJhdHRyaWJ1dGUxIik7CisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKCJhdHRyaWJ1dGUyIik7IC8vIE5vdCBwcmVzZW50LCBzbyBubyBsb2dnaW5nCisgICAgICAgIHNlc3Npb24uaW52YWxpZGF0ZSgpOworCisgICAgICAgIC8vIFJlbmRlciB0aGUgcmVzcG9uc2UgKHRvIGJlIGNvbXBhcmVkIGFzIGEgZ29sZGVuIGZpbGUpCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbjA2LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbjA2LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkwMzg4ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDYuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFBhcnQgNiBvZiBTZXNzaW9uIFRlc3RzLiAgRW5zdXJlcyB0aGF0IGFuIGF0dGVtcHQgdG8gY3JlYXRlIGEgbmV3IHNlc3Npb24KKyAqIGFmdGVyIHRoZSByZXNwb25zZSBoYXMgYmVlbiBjb21taXR0ZWQgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFNlc3Npb24wNiBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgYW5kIGNvbW1pdCBvdXIgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludCgiU2Vzc2lvbjA2ICIpOworICAgICAgICByZXNwb25zZS5mbHVzaEJ1ZmZlcigpOworCisgICAgICAgIC8vIEF0dGVtcHQgdG8gY3JlYXRlIGEgbmV3IHNlc3Npb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24odHJ1ZSk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGQUlMRUQgLSBEaWQgbm90IHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGQUlMRUQgLSBSZXR1cm5lZCBuZXcgc2Vzc2lvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlBBU1NFRCIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZBSUxFRCAtIFRocmV3ICIgKyB0KTsKKyAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworICAgICAgICByZXNwb25zZS5mbHVzaEJ1ZmZlcigpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbkJlYW4uamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMGJjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbkJlYW4uamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5zcWwuRGF0ZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0V2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25FdmVudDsKKworCisvKioKKyAqIFNpbXBsZSBKYXZhQmVhbiB0byB1c2UgZm9yIHNlc3Npb24gYXR0cmlidXRlIHRlc3RzLiAgSXQgaXMgU2VyaWFsaXphYmxlCisgKiBzbyB0aGF0IGluc3RhbmNlcyBjYW4gYmUgc2F2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyBzZXJ2ZXIgcmVzdGFydHMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZXNzaW9uQmVhbiBpbXBsZW1lbnRzCisgICAgSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXIsIEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyLCBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogQSBkYXRlIHByb3BlcnR5IGZvciB1c2Ugd2l0aCBwcm9wZXJ0eSBlZGl0b3IgdGVzdHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIERhdGUgZGF0ZVByb3BlcnR5ID0KKyAgICAgICAgbmV3IERhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCisgICAgcHVibGljIERhdGUgZ2V0RGF0ZVByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGF0ZVByb3BlcnR5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlUHJvcGVydHkoRGF0ZSBkYXRlUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5kYXRlUHJvcGVydHkgPSBkYXRlUHJvcGVydHk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50cyB0aGF0IGhhdmUgaGFwcGVuZWQgb24gdGhpcyBiZWFuIGluc3RhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbGlmZWN5Y2xlID0gIiI7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExpZmVjeWNsZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxpZmVjeWNsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlmZWN5Y2xlKFN0cmluZyBsaWZlY3ljbGUpIHsKKyAgICAgICAgdGhpcy5saWZlY3ljbGUgPSBsaWZlY3ljbGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIHN0cmluZyBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN0cmluZ1Byb3BlcnR5ID0gIkRlZmF1bHQgU3RyaW5nIFByb3BlcnR5IFZhbHVlIjsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zdHJpbmdQcm9wZXJ0eSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIHN0cmluZ1Byb3BlcnR5KSB7CisgICAgICAgIHRoaXMuc3RyaW5nUHJvcGVydHkgPSBzdHJpbmdQcm9wZXJ0eTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBiZWFuLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiU2Vzc2lvbkJlYW5bbGlmZWN5Y2xlPSIpOworICAgICAgICBzYi5hcHBlbmQodGhpcy5saWZlY3ljbGUpOworICAgICAgICBzYi5hcHBlbmQoIixkYXRlUHJvcGVydHk9Iik7CisgICAgICAgIHNiLmFwcGVuZChkYXRlUHJvcGVydHkpOworICAgICAgICBzYi5hcHBlbmQoIixzdHJpbmdQcm9wZXJ0eT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMuc3RyaW5nUHJvcGVydHkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgdGhpcyBzZXNzaW9uIHdhcyBhY3RpdmF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uRGlkQWN0aXZhdGUoSHR0cFNlc3Npb25FdmVudCBldmVudCkgeworCisgICAgICAgIGxpZmVjeWNsZSArPSAiL3NkYSI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgdGhpcyBzZXNzaW9uIHdpbGwgYmUgcGFzc2l2YXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlc3Npb25XaWxsUGFzc2l2YXRlKEh0dHBTZXNzaW9uRXZlbnQgZXZlbnQpIHsKKworICAgICAgICBsaWZlY3ljbGUgKz0gIi9zd3AiOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gdGhhdCB0aGlzIGF0dHJpYnV0ZSBoYXMgYmVlbiBib3VuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbHVlQm91bmQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpIHsKKworICAgICAgICBsaWZlY3ljbGUgKz0gIi92YiI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgdGhpcyBhdHRyaWJ1dGUgaGFzIGJlZW4gdW5ib3VuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbHVlVW5ib3VuZChIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCkgeworCisgICAgICAgIGxpZmVjeWNsZSArPSAiL3Z1IjsKKworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uTGlzdGVuZXIwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Nlc3Npb25MaXN0ZW5lcjAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4M2NiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uTGlzdGVuZXIwMS5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogQXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXIgZm9yIHNlc3Npb24gZXZlbnRzLiAgQWxsIGV2ZW50cyB0aGF0IG9jY3VyCisgKiBhcmUgbG9nZ2VkIGFwcHJvcHJpYXRlbHkgdG8gdGhlIHN0YXRpYyBsb2dnZXIuICBJbiBhZGRpdGlvbiwgc2Vzc2lvbgorICogY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIGV2ZW50cyBhcmUgbG9nZ2VkIHRvIHRoZSBzZXJ2bGV0IGNvbnRleHQgbG9nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2Vzc2lvbkxpc3RlbmVyMDEKKyAgICBpbXBsZW1lbnRzIEh0dHBTZXNzaW9uTGlzdGVuZXIsIEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIgeworCisKKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVBZGRlZChIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlNlc3Npb25MaXN0ZW5lcjAxOiBhdHRyaWJ1dGVBZGRlZCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIsIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiKSIpOworICAgICAgICBldmVudC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKS5sb2cKKyAgICAgICAgICAgICgiU2Vzc2lvbkxpc3RlbmVyMDE6IGF0dHJpYnV0ZUFkZGVkKCIgKyBldmVudC5nZXRTZXNzaW9uKCkuZ2V0SWQoKQorICAgICAgICAgICAgICsgIiwiICsgZXZlbnQuZ2V0TmFtZSgpICsgIikiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZW1vdmVkKEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50KSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiU2Vzc2lvbkxpc3RlbmVyMDE6IGF0dHJpYnV0ZVJlbW92ZWQoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROYW1lKCkgKyAiLCIgKyBldmVudC5nZXRWYWx1ZSgpICsgIikiKTsKKyAgICAgICAgZXZlbnQuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkubG9nCisgICAgICAgICAgICAoIlNlc3Npb25MaXN0ZW5lcjAxOiBhdHRyaWJ1dGVSZW1vdmVkKCIgKworICAgICAgICAgICAgIGV2ZW50LmdldFNlc3Npb24oKS5nZXRJZCgpICsgIiwiICsgZXZlbnQuZ2V0TmFtZSgpICsgIikiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZXBsYWNlZChIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlNlc3Npb25MaXN0ZW5lcjAxOiBhdHRyaWJ1dGVSZXBsYWNlZCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIsIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiKSIpOworICAgICAgICBldmVudC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKS5sb2cKKyAgICAgICAgICAgICgiU2Vzc2lvbkxpc3RlbmVyMDE6IGF0dHJpYnV0ZVJlcGxhY2VkKCIgKworICAgICAgICAgICAgIGV2ZW50LmdldFNlc3Npb24oKS5nZXRJZCgpICsgIiwiICsgZXZlbnQuZ2V0TmFtZSgpICsgIikiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uQ3JlYXRlZChIdHRwU2Vzc2lvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiU2Vzc2lvbkxpc3RlbmVyMDE6IHNlc3Npb25DcmVhdGVkKCkiKTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IGV2ZW50LmdldFNlc3Npb24oKTsKKyAgICAgICAgc2Vzc2lvbi5nZXRTZXJ2bGV0Q29udGV4dCgpLmxvZygiU2Vzc2lvbkxpc3RlbmVyMDE6IHNlc3Npb25DcmVhdGVkKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SWQoKSArICIpIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2Vzc2lvbkRlc3Ryb3llZChIdHRwU2Vzc2lvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiU2Vzc2lvbkxpc3RlbmVyMDE6IHNlc3Npb25EZXN0cm95ZWQoKSIpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gZXZlbnQuZ2V0U2Vzc2lvbigpOworICAgICAgICBzZXNzaW9uLmdldFNlcnZsZXRDb250ZXh0KCkubG9nKCJTZXNzaW9uTGlzdGVuZXIwMTogc2Vzc2lvbkRlc3Ryb3llZCgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXNzaW9uLmdldElkKCkgKyAiKSIpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbkxpc3RlbmVyMDIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uTGlzdGVuZXIwMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMzVhMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbkxpc3RlbmVyMDIuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIEFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIGZvciBzZXNzaW9uIGV2ZW50cy4gIEFsbCBldmVudHMgdGhhdCBvY2N1cgorICogYXJlIGxvZ2dlZCBhcHByb3ByaWF0ZWx5IHRvIHRoZSBzdGF0aWMgbG9nZ2VyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2Vzc2lvbkxpc3RlbmVyMDIKKyAgICBpbXBsZW1lbnRzIEh0dHBTZXNzaW9uTGlzdGVuZXIsIEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIgeworCisKKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVBZGRlZChIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlNlc3Npb25MaXN0ZW5lcjAyOiBhdHRyaWJ1dGVBZGRlZCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIsIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiKSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZVJlbW92ZWQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJTZXNzaW9uTGlzdGVuZXIwMjogYXR0cmlidXRlUmVtb3ZlZCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIsIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiKSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZVJlcGxhY2VkKEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50KSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiU2Vzc2lvbkxpc3RlbmVyMDI6IGF0dHJpYnV0ZVJlcGxhY2VkKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0TmFtZSgpICsgIiwiICsgZXZlbnQuZ2V0VmFsdWUoKSArICIpIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2Vzc2lvbkNyZWF0ZWQoSHR0cFNlc3Npb25FdmVudCBldmVudCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlNlc3Npb25MaXN0ZW5lcjAyOiBzZXNzaW9uQ3JlYXRlZCgpIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2Vzc2lvbkRlc3Ryb3llZChIdHRwU2Vzc2lvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiU2Vzc2lvbkxpc3RlbmVyMDI6IHNlc3Npb25EZXN0cm95ZWQoKSIpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbkxpc3RlbmVyMDMuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uTGlzdGVuZXIwMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5M2ViMzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbkxpc3RlbmVyMDMuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogU2Vzc2lvbiBhdHRyaWJ1dGUgdGhhdCBsaXN0ZW5zIHRvIHBhc3NpdmF0aW9uIGFuZCBhY3RpdmF0aW9uIGV2ZW50cy4KKyAqIEFsbCBldmVudHMgdGhhdCBvY2N1ciBhcmUgbG9nZ2VkIHRvIHRoZSBzZXJ2bGV0IGNvbnRleHQgbG9nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2Vzc2lvbkxpc3RlbmVyMDMKKyAgICBpbXBsZW1lbnRzIEh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyLCBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lciwKKyAgICAgICAgICAgICAgIFNlcmlhbGl6YWJsZSB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uRGlkQWN0aXZhdGUoSHR0cFNlc3Npb25FdmVudCBldmVudCkgeworICAgICAgICBldmVudC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKS5sb2cKKyAgICAgICAgICAgICgiU2Vzc2lvbkxpc3RlbmVyMDM6IHNlc3Npb25EaWRBY3RpdmF0ZSgiICsKKyAgICAgICAgICAgICBldmVudC5nZXRTZXNzaW9uKCkuZ2V0SWQoKSArICIpIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2Vzc2lvbldpbGxQYXNzaXZhdGUoSHR0cFNlc3Npb25FdmVudCBldmVudCkgeworICAgICAgICBldmVudC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKS5sb2cKKyAgICAgICAgICAgICgiU2Vzc2lvbkxpc3RlbmVyMDM6IHNlc3Npb25XaWxsUGFzc2l2YXRlKCIgKworICAgICAgICAgICAgIGV2ZW50LmdldFNlc3Npb24oKS5nZXRJZCgpICsgIikiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2YWx1ZUJvdW5kKEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpLmxvZworICAgICAgICAgICAgKCJTZXNzaW9uTGlzdGVuZXIwMzogdmFsdWVCb3VuZCgiICsKKyAgICAgICAgICAgICBldmVudC5nZXRTZXNzaW9uKCkuZ2V0SWQoKSArICIsIiArCisgICAgICAgICAgICAgZXZlbnQuZ2V0TmFtZSgpICsgIikiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2YWx1ZVVuYm91bmQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZXZlbnQuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkubG9nCisgICAgICAgICAgICAoIlNlc3Npb25MaXN0ZW5lcjAzOiB2YWx1ZVVuYm91bmQoIiArCisgICAgICAgICAgICAgZXZlbnQuZ2V0TmFtZSgpICsgIikiKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1NldEJ1ZmZlclNpemUwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1NldEJ1ZmZlclNpemUwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMDY3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2V0QnVmZmVyU2l6ZTAxLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIE5lZ2F0aXZlIHRlc3QgZm9yIFNlcnZsZXRSZXNwb25zZS5zZXRCdWZmZXJTaXplKCkuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZXRCdWZmZXJTaXplMDEgZXh0ZW5kcyBHZW5lcmljU2VydmxldCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgc2VydmxldCByZXF1ZXN0IGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCJTZXRCdWZmZXJTaXplMDEgIik7CisgICAgICAgICAgICByZXNwb25zZS5mbHVzaEJ1ZmZlcigpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0QnVmZmVyU2l6ZSgxMDApOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZBSUxFRCAtIERpZCBub3QgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUEFTU0VEIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGQUlMRUQgLSBmbHVzaEJ1ZmZlcigpIHRocmV3IElPRXhjZXB0aW9uIik7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1NldExvY2FsZTAxLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2V0TG9jYWxlMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTg3YTk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1NldExvY2FsZTAxLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIFBvc2l0aXZlIHRlc3QgZm9yIFNlcnZsZXRSZXNwb25zZS5zZXRMb2NhbGUoKS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFNldExvY2FsZTAxIGV4dGVuZHMgR2VuZXJpY1NlcnZsZXQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIHNlcnZsZXQgcmVxdWVzdCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICByZXNwb25zZS5zZXRMb2NhbGUobmV3IExvY2FsZSgiZW4iLCAiVVMiKSk7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiU2V0TG9jYWxlMDEgUEFTU0VEIik7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1N0YXRpY0ZpbHRlci5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1N0YXRpY0ZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNzg3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU3RhdGljRmlsdGVyLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBTaW1wbGUgZmlsdGVyIHRvIHJlc2V0IHRoZSBzdGF0aWMgbG9nIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCByZXF1ZXN0LAorICogc28gdGhhdCBubyBsZWZ0b3ZlcnMgZnJvbSB0aGUgcHJldmlvdXMgcmVxdWVzdCBhcmUgaW5hZHZlcnRlbnRseSBpbmNsdWRlZC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFN0YXRpY0ZpbHRlciBpbXBsZW1lbnRzIEZpbHRlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGlzIGZpbHRlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsdGVyQ29uZmlnIGNvbmZpZyA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoaXMgRmlsdGVyIGluc3RhbmNlIGZyb20gc2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworCisgICAgICAgIGNvbmZpZyA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyYXAgdGhpcyByZXF1ZXN0IGFuZC9vciByZXNwb25zZSBhcyBjb25maWd1cmVkIGFuZCBwYXNzIGl0IG9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IGluUmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIGluUmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyQ2hhaW4gY2hhaW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUmVzZXQgb3VyIGxvZ2dlciBhbmQgcGVyZm9ybSB0aGlzIHJlcXVlc3QKKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisgICAgICAgIGNoYWluLmRvRmlsdGVyKGluUmVxdWVzdCwgaW5SZXNwb25zZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBsYWNlIHRoaXMgRmlsdGVyIGluc3RhbmNlIGludG8gc2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgVGhlIGZpbHRlciBjb25maWd1cmF0aW9uIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TdGF0aWNMb2dnZXIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TdGF0aWNMb2dnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmU5MTdjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1N0YXRpY0xvZ2dlci5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogTG9nZ2VyIHRoYXQgdXNlcyBhIHN0YXRpYyBtZXNzYWdlIGJ1ZmZlciB0byBmYWNpbGl0YXRlIGludHJhLXdlYi1hcHAKKyAqIHJlY29yZGluZyBhbmQgcmV0cmlldmFsIG9mIGxvZyBtZXNzYWdlcy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFN0YXRpY0xvZ2dlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YXRpYyBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBtZXNzYWdlcyB0aGF0IGhhdmUgYmVlbiBsb2dnZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBBcnJheUxpc3QgbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGUgbmV4dCBtZXNzYWdlIHRoYXQgd2lsbCBiZSByZXRyaWV2ZWQgYnkgYSByZWFkKCkgY2FsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGludCBwb3NpdGlvbiA9IDA7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5leHQgbWVzc2FnZSB0aGF0IGhhcyBiZWVuIGxvZ2dlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiBpZiB0aGVyZSBhcmUgbm8gbW9yZSBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobWVzc2FnZXMpIHsKKyAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IG1lc3NhZ2VzLnNpemUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIG1lc3NhZ2VzLmdldChwb3NpdGlvbisrKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXNldCB0aGUgbWVzc2FnZXMgYnVmZmVyIGFuZCBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtZXNzYWdlcykgeworICAgICAgICAgICAgbWVzc2FnZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHBvc2l0aW9uID0gMDsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIG5ldyBtZXNzYWdlIHRvIHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2VzIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKFN0cmluZyBtZXNzYWdlKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtZXNzYWdlcykgeworICAgICAgICAgICAgbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Rlc3RDbGllbnQuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9UZXN0Q2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNlOTBjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9UZXN0Q2xpZW50LmphdmEKQEAgLTAsMCArMSwxMDQ2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworCisvKioKKyAqIDxwPlRoaXMgY2xhc3MgY29udGFpbnMgYSA8c3Ryb25nPlRhc2s8L3N0cm9uZz4gZm9yIEFudCB0aGF0IGlzIHVzZWQgdG8KKyAqIHNlbmQgSFRUUCByZXF1ZXN0cyB0byBhIHNlcnZsZXQgY29udGFpbmVyLCBhbmQgZXhhbWluZSB0aGUgcmVzcG9uc2VzLgorICogSXQgaXMgc2ltaWxhciBpbiBwdXJwb3NlIHRvIHRoZSA8Y29kZT5HVGVzdDwvY29kZT4gdGFzayBpbiBXYXRjaGRvZywKKyAqIGJ1dCB1c2VzIHRoZSBKREsncyBIdHRwVVJMQ29ubmVjdGlvbiBmb3IgdW5kZXJseWluZyBjb25uZWN0aXZpdHkuPC9wPgorICoKKyAqIDxwPlRoZSB0YXNrIGlzIHJlZ2lzdGVyZWQgd2l0aCBBbnQgdXNpbmcgYSA8Y29kZT50YXNrZGVmPC9jb2RlPiBkaXJlY3RpdmU6CisgKiA8cHJlPgorICogICAmbHQ7dGFza2RlZiBuYW1lPSJ0ZXN0ZXIiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50ZXN0ZXIuVGVzdENsaWVudCImZ3Q7CisgKiA8L3ByZT4KKyAqIGFuZCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzOjwvcD4KKyAqIDx1bD4KKyAqIDxsaT48c3Ryb25nPmdvbGRlbjwvc3Ryb25nPiAtIFRoZSBzZXJ2ZXItcmVsYXRpdmUgcGF0aCBvZiB0aGUgc3RhdGljCisgKiAgICAgcmVzb3VyY2UgY29udGFpbmluZyB0aGUgZ29sZGVuIGZpbGUgZm9yIHRoaXMgcmVxdWVzdC48L2xpPgorICogPGxpPjxzdHJvbmc+aG9zdDwvc3Ryb25nPiAtIFRoZSBzZXJ2ZXIgbmFtZSB0byB3aGljaCB0aGlzIHJlcXVlc3Qgd2lsbCBiZQorICogICAgIHNlbnQuICBEZWZhdWx0cyB0byA8Y29kZT5sb2NhbGhvc3Q8L2NvZGU+IGlmIG5vdCBzcGVjaWZpZWQuPC9saT4KKyAqIDxsaT48c3Ryb25nPmluQ29udGVudDwvc3Ryb25nPiAtIFRoZSBkYXRhIGNvbnRlbnQgdGhhdCB3aWxsIGJlIHN1Ym1pdHRlZAorICogICAgIHdpdGggdGhpcyByZXF1ZXN0LiAgVGhlIHRlc3QgY2xpZW50IHdpbGwgdHJhbnNwYXJlbnRseSBhZGQgYSBjYXJyaWFnZQorICogICAgIHJldHVybiBhbmQgbGluZSBmZWVkLCBhbmQgc2V0IHRoZSBjb250ZW50IGxlbmd0aCBoZWFkZXIsIGlmIHRoaXMgaXMKKyAqICAgICBzcGVjaWZpZWQuICBPdGhlcndpc2UsIG5vIGNvbnRlbnQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVxdWVzdC48L2xpPgorICogPGxpPjxzdHJvbmc+aW5IZWFkZXJzPC9zdHJvbmc+IC0gVGhlIHNldCBvZiBvbmUgb3IgbW9yZSBIVFRQIGhlYWRlcnMgdGhhdAorICogICAgIHdpbGwgYmUgaW5jbHVkZWQgb24gdGhlIHJlcXVlc3QuPC9saT4KKyAqIDxsaT48c3Ryb25nPm1lc3NhZ2U8L3N0cm9uZz4gLSBUaGUgSFRUUCByZXNwb25zZSBtZXNzYWdlIHRoYXQgaXMgZXhwZWN0ZWQKKyAqICAgICBpbiB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiAgTm8gY2hlY2sgaXMgbWFkZSBpZiBubyBtZXNzYWdlCisgKiAgICAgaXMgc3BlY2lmaWVkLjwvbGk+CisgKiA8bGk+PHN0cm9uZz5tZXRob2Q8L3N0cm9uZz4gLSBUaGUgSFRUUCByZXF1ZXN0IG1ldGhvZCB0byBiZSB1c2VkIG9uIHRoaXMKKyAqICAgICByZXF1ZXN0LiAgRGVmYXVsdHMgdG8gPG9jZGU+R0VUPC9jb2RlPiBpZiBub3Qgc3BlY2lmaWVkLjwvbGk+CisgKiA8bGk+PHN0cm9uZz5vdXRDb250ZW50PC9zdHJvbmc+IC0gVGhlIGZpcnN0IGxpbmUgb2YgdGhlIHJlc3BvbnNlIGRhdGEKKyAqICAgICBjb250ZW50IHRoYXQgd2UgZXhwZWN0IHRvIHJlY2VpdmUuICBObyBjaGVjayBpcyBtYWRlIGlmIG5vIGNvbnRlbnQgaXMKKyAqICAgICBzcGVjaWZpZWQuPC9saT4KKyAqIDxsaT48c3Ryb25nPm91dEhlYWRlcnM8L3N0cm9uZz4gLSBUaGUgc2V0IG9mIG9uZSBvciBtb3JlIEhUVFAgaGVhZGVycyB0aGF0CisgKiAgICAgYXJlIGV4cGVjdGVkIGluIHRoZSByZXNwb25zZSAob3JkZXIgaW5kZXBlbmRlbnQpLjwvbGk+CisgKiA8bGk+PHN0cm9uZz5wb3J0PC9zdHJvbmc+IC0gVGhlIHBvcnQgbnVtYmVyIHRvIHdoaWNoIHRoaXMgcmVxdWVzdCB3aWxsIGJlCisgKiAgICAgc2VudC4gIERlZmF1bHRzIHRvIDxjb2RlPjgwODA8L2NvZGU+IGlmIG5vdCBzcGVjaWZpZWQuPC9saT4KKyAqIDxsaT48c3Ryb25nPnJlZGlyZWN0PC9zdHJvbmc+IC0gSWYgc2V0IHRvIHRydWUsIGZvbGxvdyBhbnkgcmVkaXJlY3QgdGhhdAorICogICAgIGlzIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIuICAoT25seSB3b3JrcyB3aGVuIHVzaW5nIEh0dHBVUkxDb25uZWN0aW9uKS4KKyAqICAgICA8L2xpPgorICogPGxpPjxzdHJvbmc+cmVxdWVzdDwvc3Ryb25nPiAtIFRoZSByZXF1ZXN0IFVSSSB0byBiZSB0cmFuc21pdHRlZCBmb3IgdGhpcworICogICAgIHJlcXVlc3QuICBUaGlzIHZhbHVlIHNob3VsZCBzdGFydCB3aXRoIGEgc2xhc2ggY2hhcmFjdGVyICgiLyIpLCBhbmQKKyAqICAgICBiZSB0aGUgc2VydmVyLXJlbGF0aXZlIFVSSSBvZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlLjwvbGk+CisgKiA8bGk+PHN0cm9uZz5zdGF0dXM8L3N0cm9uZz4gLSBUaGUgSFRUUCBzdGF0dXMgY29kZSB0aGF0IGlzIGV4cGVjdGVkIGluIHRoZQorICogICAgIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4gIERlZmF1bHRzIHRvIDxjb2RlPjIwMDwvY29kZT4gaWYgbm90CisgKiAgICAgc3BlY2lmaWVkLiAgU2V0IHRvIHplcm8gdG8gZGlzYWJsZSBjaGVja2luZyB0aGUgcmV0dXJuIHZhbHVlLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVGVzdENsaWVudCBleHRlbmRzIFRhc2sgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHNhdmVkIGdvbGRlbiBmaWxlIHdlIHdpbGwgY29tcGFyZSB0byB0aGUgcmVzcG9uc2UuICBFYWNoIGVsZW1lbnQKKyAgICAgKiBjb250YWlucyBhIGxpbmUgb2YgdGV4dCB3aXRob3V0IGFueSBsaW5lIGRlbGltaXRlcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBzYXZlR29sZGVuID0gbmV3IEFycmF5TGlzdCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2F2ZWQgaGVhZGVycyB3ZSByZWNlaXZlZCBpbiBvdXIgcmVzcG9uc2UuICBUaGUga2V5IGlzIHRoZSBoZWFkZXIKKyAgICAgKiBuYW1lIChjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZSksIGFuZCB0aGUgdmFsdWUgaXMgYW4gQXJyYXlMaXN0IG9mIHRoZQorICAgICAqIHN0cmluZyB2YWx1ZShzKSByZWNlaXZlZCBmb3IgdGhhdCBoZWFkZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgc2F2ZUhlYWRlcnMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzcG9uc2UgZmlsZSB0byBiZSBjb21wYXJlZCB0byB0aGUgZ29sZGVuIGZpbGUuICBFYWNoIGVsZW1lbnQKKyAgICAgKiBjb250YWlucyBhIGxpbmUgb2YgdGV4dCB3aXRob3V0IGFueSBsaW5lIGRlbGltaXRlcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBzYXZlUmVzcG9uc2UgPSBuZXcgQXJyYXlMaXN0KCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVidWdnaW5nIGRldGFpbCBsZXZlbCBmb3IgdGhpcyBleGVjdXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBkZWJ1ZyA9IDA7CisKKyAgICBwdWJsaWMgaW50IGdldERlYnVnKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGVidWcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGludCBkZWJ1ZykgeworICAgICAgICB0aGlzLmRlYnVnID0gZGVidWc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmVyLXJlbGF0aXZlIHJlcXVlc3QgVVJJIG9mIHRoZSBnb2xkZW4gZmlsZSBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ29sZGVuID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0R29sZGVuKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZ29sZGVuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHb2xkZW4oU3RyaW5nIGdvbGRlbikgeworICAgICAgICB0aGlzLmdvbGRlbiA9IGdvbGRlbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBob3N0IG5hbWUgdG8gd2hpY2ggd2Ugd2lsbCBjb25uZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOworCisgICAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkgeworICAgICAgICByZXR1cm4gKHRoaXMuaG9zdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkgeworICAgICAgICB0aGlzLmhvc3QgPSBob3N0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGZpcnN0IGxpbmUgb2YgdGhlIHJlcXVlc3QgZGF0YSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgb24gdGhpcworICAgICAqIHJlcXVlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBpbkNvbnRlbnQgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRJbkNvbnRlbnQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5pbkNvbnRlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEluQ29udGVudChTdHJpbmcgaW5Db250ZW50KSB7CisgICAgICAgIHRoaXMuaW5Db250ZW50ID0gaW5Db250ZW50OworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIEhUVFAgaGVhZGVycyB0byBiZSBpbmNsdWRlZCBvbiB0aGUgcmVxdWVzdC4gIFN5bnRheCBpcworICAgICAqIDxjb2RlPntuYW1lfTp7dmFsdWV9WyMje25hbWV9Ont2YWx1ZX1dIC4uLjwvY29kZT4uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBpbkhlYWRlcnMgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRJbkhlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5pbkhlYWRlcnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEluSGVhZGVycyhTdHJpbmcgaW5IZWFkZXJzKSB7CisgICAgICAgIHRoaXMuaW5IZWFkZXJzID0gaW5IZWFkZXJzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIGpvaW4gdGhlIHNlc3Npb24gd2hvc2Ugc2Vzc2lvbiBpZGVudGlmaWVyIHdhcyByZXR1cm5lZAorICAgICAqIG9uIHRoZSBwcmV2aW91cyByZXF1ZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGpvaW5TZXNzaW9uID0gZmFsc2U7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRKb2luU2Vzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmpvaW5TZXNzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRKb2luU2Vzc2lvbihib29sZWFuIGpvaW5TZXNzaW9uKSB7CisgICAgICAgIHRoaXMuam9pblNlc3Npb24gPSB0cnVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIEhUVFAgcmVzcG9uc2UgbWVzc2FnZSB0byBiZSBleHBlY3RlZCBpbiB0aGUgcmVzcG9uc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm1lc3NhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBIVFRQIHJlcXVlc3QgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbWV0aG9kID0gIkdFVCI7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm1ldGhvZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWV0aG9kKFN0cmluZyBtZXRob2QpIHsKKyAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlyc3QgbGluZSBvZiB0aGUgcmVzcG9uc2UgZGF0YSBjb250ZW50IHRoYXQgd2UgZXhwZWN0IHRvIHJlY2VpdmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBvdXRDb250ZW50ID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0Q29udGVudCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm91dENvbnRlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE91dENvbnRlbnQoU3RyaW5nIG91dENvbnRlbnQpIHsKKyAgICAgICAgdGhpcy5vdXRDb250ZW50ID0gb3V0Q29udGVudDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBIVFRQIGhlYWRlcnMgdG8gYmUgY2hlY2tlZCBvbiB0aGUgcmVzcG9uc2UuICBTeW50YXggaXMKKyAgICAgKiA8Y29kZT57bmFtZX06e3ZhbHVlfVsjI3tuYW1lfTp7dmFsdWV9XSAuLi48L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgb3V0SGVhZGVycyA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE91dEhlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5vdXRIZWFkZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRIZWFkZXJzKFN0cmluZyBvdXRIZWFkZXJzKSB7CisgICAgICAgIHRoaXMub3V0SGVhZGVycyA9IG91dEhlYWRlcnM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgcG9ydCBudW1iZXIgdG8gd2hpY2ggd2Ugd2lsbCBjb25uZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgcG9ydCA9IDgwODA7CisKKyAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wb3J0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KSB7CisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvdG9jb2wgYW5kIHZlcnNpb24gdG8gaW5jbHVkZSBpbiB0aGUgcmVxdWVzdCwgaWYgZXhlY3V0ZWQgYXMKKyAgICAgKiBhIGRpcmVjdCBzb2NrZXQgY29ubmVjdGlvbi4gIExhY2sgb2YgYSB2YWx1ZSBoZXJlIGluZGljYXRlcyB0aGF0IGFuCisgICAgICogSHR0cFVSTENvbm5lY3Rpb24gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3RvY29sID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wcm90b2NvbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvdG9jb2woU3RyaW5nIHByb3RvY29sKSB7CisgICAgICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNob3VsZCB3ZSBmb2xsb3cgcmVkaXJlY3RzIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXI/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVkaXJlY3QgPSBmYWxzZTsKKworICAgIHB1YmxpYyBib29sZWFuIGdldFJlZGlyZWN0KCkgeworICAgICAgICByZXR1cm4gKHRoaXMucmVkaXJlY3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlZGlyZWN0KGJvb2xlYW4gcmVkaXJlY3QpIHsKKyAgICAgICAgdGhpcy5yZWRpcmVjdCA9IHJlZGlyZWN0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgVVJJIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4gIFRoaXMgdmFsdWUgaXMgcmVxdWlyZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByZXF1ZXN0ID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlcXVlc3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3QoU3RyaW5nIHJlcXVlc3QpIHsKKyAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBIVFRQIHN0YXR1cyBjb2RlIGV4cGVjdGVkIG9uIHRoZSByZXNwb25zZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHN0YXR1cyA9IDIwMDsKKworICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuc3RhdHVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHN0YXR1cykgeworICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RhdGljIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2Vzc2lvbiBpZGVudGlmaWVyIHJldHVybmVkIGJ5IHRoZSBtb3N0IHJlY2VudCByZXF1ZXN0LCBvcgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwcmV2aW91cyByZXF1ZXN0IGRpZCBub3Qgc3BlY2lmeSBhIHNlc3Npb24KKyAgICAgKiBpZGVudGlmaWVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHNlc3Npb25JZCA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSB0ZXN0IHRoYXQgaGFzIGJlZW4gY29uZmlndXJlZCBieSBvdXIgcHJvcGVydHkgc2V0dGluZ3MuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBzYXZlSGVhZGVycy5jbGVhcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZEdvbGRlbigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkZBSUw6ICByZWFkR29sZGVuKCIgKyBnb2xkZW4gKyAiKSIpOworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwcm90b2NvbCA9PSBudWxsKSB8fCAocHJvdG9jb2wubGVuZ3RoKCkgPT0gMCkpCisgICAgICAgICAgICBleGVjdXRlSHR0cCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBleGVjdXRlU29ja2V0KCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSB0ZXN0IHZpYSB1c2Ugb2YgYW4gSHR0cFVSTENvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlSHR0cCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ29uc3RydWN0IGEgc3VtbWFyeSBvZiB0aGUgcmVxdWVzdCB3ZSB3aWxsIGJlIHNlbmRpbmcKKyAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSAiWyIgKyBtZXRob2QgKyAiICIgKyByZXF1ZXN0ICsgIl0iOworICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgIGxvZygiUlFTVDogIiArIHN1bW1hcnkpOworICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSA9IG51bGw7CisgICAgICAgIEh0dHBVUkxDb25uZWN0aW9uIGNvbm4gPSBudWxsOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBhbiBIdHRwVVJMQ29ubmVjdGlvbiBmb3IgdGhpcyByZXF1ZXN0CisgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCgiaHR0cCIsIGhvc3QsIHBvcnQsIHJlcXVlc3QpOworICAgICAgICAgICAgY29ubiA9IChIdHRwVVJMQ29ubmVjdGlvbikgdXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICBjb25uLnNldEFsbG93VXNlckludGVyYWN0aW9uKGZhbHNlKTsKKyAgICAgICAgICAgIGNvbm4uc2V0RG9JbnB1dCh0cnVlKTsKKyAgICAgICAgICAgIGlmIChpbkNvbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbm4uc2V0RG9PdXRwdXQodHJ1ZSk7CisgICAgICAgICAgICAgICAgY29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtTGVuZ3RoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiArIGluQ29udGVudC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICAgICAgICAgIGxvZygiSU5QSDogQ29udGVudC1MZW5ndGg6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db250ZW50Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29ubi5zZXREb091dHB1dChmYWxzZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNlbmQgdGhlIHNlc3Npb24gaWQgY29va2llIChpZiBhbnkpCisgICAgICAgICAgICBpZiAoam9pblNlc3Npb24gJiYgKHNlc3Npb25JZCAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJDb29raWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKU0VTU0lPTklEPSIgKyBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgICAgICAgICBsb2coIklOUEg6IENvb2tpZTogSlNFU1NJT05JRD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aGlzLnJlZGlyZWN0ICYmIChkZWJ1ZyA+PSAxKSkKKyAgICAgICAgICAgICAgICBsb2coIkZMQUc6IHNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0ICsgIikiKTsKKyAgICAgICAgICAgIGNvbm4uc2V0SW5zdGFuY2VGb2xsb3dSZWRpcmVjdHModGhpcy5yZWRpcmVjdCk7CisgICAgICAgICAgICBjb25uLnNldFJlcXVlc3RNZXRob2QobWV0aG9kKTsKKyAgICAgICAgICAgIGlmIChpbkhlYWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBoZWFkZXJzID0gaW5IZWFkZXJzOworICAgICAgICAgICAgICAgIHdoaWxlIChoZWFkZXJzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZGVsaW1pdGVyID0gaGVhZGVycy5pbmRleE9mKCIjIyIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGltaXRlciA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IGhlYWRlcnM7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gIiI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBoZWFkZXJzLnN1YnN0cmluZygwLCBkZWxpbWl0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc3Vic3RyaW5nKGRlbGltaXRlciArIDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBjb2xvbiA9IGhlYWRlci5pbmRleE9mKCI6Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvbiA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBoZWFkZXIuc3Vic3RyaW5nKDAsIGNvbG9uKS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGhlYWRlci5zdWJzdHJpbmcoY29sb24gKyAxKS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIklOUEg6ICIgKyBuYW1lICsgIjogIiArIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENvbm5lY3QgdG8gdGhlIHNlcnZlciBhbmQgc2VuZCBvdXIgb3V0cHV0IGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgY29ubi5jb25uZWN0KCk7CisgICAgICAgICAgICBpZiAoaW5Db250ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJJTlBEOiAiICsgaW5Db250ZW50KTsKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBjb25uLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5Db250ZW50Lmxlbmd0aCgpOyBpKyspCisgICAgICAgICAgICAgICAgICAgIG9zLndyaXRlKGluQ29udGVudC5jaGFyQXQoaSkpOworICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc3BvbnNlIGRhdGEsIGlmIHRoZXJlIGlzIGFueQorICAgICAgICAgICAgU3RyaW5nIG91dERhdGEgPSAiIjsKKyAgICAgICAgICAgIFN0cmluZyBvdXRUZXh0ID0gIiI7CisgICAgICAgICAgICBib29sZWFuIGVvbCA9IGZhbHNlOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBjb25uLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBpbnQgbGluZXMgPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHJlYWQoaXMpOworICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobGluZXMgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgb3V0RGF0YSA9IGxpbmU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBvdXRUZXh0ICs9IGxpbmUgKyAiXHJcbiI7CisgICAgICAgICAgICAgICAgc2F2ZVJlc3BvbnNlLmFkZChsaW5lKTsKKyAgICAgICAgICAgICAgICBsaW5lcysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXMuY2xvc2UoKTsKKworICAgICAgICAgICAgLy8gRHVtcCBvdXQgdGhlIHJlc3BvbnNlIHN0dWZmCisgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgICAgICBsb2coIlJFU1A6ICIgKyBjb25uLmdldFJlc3BvbnNlQ29kZSgpICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY29ubi5nZXRIZWFkZXJGaWVsZEtleShpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBjb25uLmdldEhlYWRlckZpZWxkKGkpOworICAgICAgICAgICAgICAgIGlmICgobmFtZSA9PSBudWxsKSB8fCAodmFsdWUgPT0gbnVsbCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgICAgICAgICBsb2coIkhFQUQ6ICIgKyBuYW1lICsgIjogIiArIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBzYXZlKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAoIlNldC1Db29raWUiLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VTZXNzaW9uKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAxKSB7CisgICAgICAgICAgICAgICAgbG9nKCJEQVRBOiAiICsgb3V0RGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKG91dFRleHQubGVuZ3RoKCkgPiAyKQorICAgICAgICAgICAgICAgICAgICBsb2coIlRFWFQ6ICIgKyBvdXRUZXh0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHJlc3BvbnNlIGFnYWluc3Qgb3VyIGNyaXRlcmlhCisgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbGlkYXRlU3RhdHVzKGNvbm4uZ2V0UmVzcG9uc2VDb2RlKCkpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWxpZGF0ZU1lc3NhZ2UoY29ubi5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbGlkYXRlSGVhZGVycygpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWxpZGF0ZURhdGEob3V0RGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbGlkYXRlR29sZGVuKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSA0MDQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJOb3QgRm91bmQiOworICAgICAgICAgICAgICAgICAgICB0aHJvd2FibGUgPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJTdGF0dXM9IiArIGNvbm4uZ2V0UmVzcG9uc2VDb2RlKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIE1lc3NhZ2U9IiArIGNvbm4uZ2V0UmVzcG9uc2VNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aHJvd2FibGUgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodCBpbnN0YW5jZW9mIENvbm5lY3RFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdC5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgdGhyb3dhYmxlID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHQuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgIHRocm93YWJsZSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2cgdGhlIHJlc3VsdHMgb2YgZXhlY3V0aW5nIHRoaXMgcmVxdWVzdAorICAgICAgICBpZiAoc3VjY2VzcykKKyAgICAgICAgICAgIGxvZygiT0sgIiArIHN1bW1hcnkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGxvZygiRkFJTCAiICsgc3VtbWFyeSArICIgIiArIHJlc3VsdCk7CisgICAgICAgICAgICBpZiAodGhyb3dhYmxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSB0ZXN0IHZpYSB1c2Ugb2YgYSBzb2NrZXQgd2l0aCBkaXJlY3QgaW5wdXQvb3V0cHV0LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZVNvY2tldCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ29uc3RydWN0IGEgc3VtbWFyeSBvZiB0aGUgcmVxdWVzdCB3ZSB3aWxsIGJlIHNlbmRpbmcKKyAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSBtZXRob2QgKyAiICIgKyByZXF1ZXN0ICsgIiAiICsgcHJvdG9jb2w7CisgICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gIlsiICsgY29tbWFuZCArICJdIjsKKyAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICBsb2coIlJRU1Q6ICIgKyBzdW1tYXJ5KTsKKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7CisgICAgICAgIFNvY2tldCBzb2NrZXQgPSBudWxsOworICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBudWxsOworICAgICAgICBQcmludFdyaXRlciBwdyA9IG51bGw7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSA9IG51bGw7CisgICAgICAgIGludCBvdXRTdGF0dXMgPSAwOworICAgICAgICBTdHJpbmcgb3V0TWVzc2FnZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gT3BlbiBhIGNsaWVudCBzb2NrZXQgZm9yIHRoaXMgcmVxdWVzdAorICAgICAgICAgICAgc29ja2V0ID0gbmV3IFNvY2tldChob3N0LCBwb3J0KTsKKyAgICAgICAgICAgIG9zID0gc29ja2V0LmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgcHcgPSBuZXcgUHJpbnRXcml0ZXIob3MpOworICAgICAgICAgICAgaXMgPSBzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKworICAgICAgICAgICAgLy8gU2VuZCB0aGUgY29tbWFuZCBhbmQgY29udGVudCBsZW5ndGggaGVhZGVyIChpZiBhbnkpCisgICAgICAgICAgICBwdy5wcmludChjb21tYW5kICsgIlxyXG4iKTsKKyAgICAgICAgICAgIGlmIChpbkNvbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgICAgICAgICBsb2coIklOUEg6ICIgKyAiQ29udGVudC1MZW5ndGg6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db250ZW50Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBwdy5wcmludCgiQ29udGVudC1MZW5ndGg6ICIgKyBpbkNvbnRlbnQubGVuZ3RoKCkgKyAiXHJcbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZW5kIHRoZSBzZXNzaW9uIGlkIGNvb2tpZSAoaWYgYW55KQorICAgICAgICAgICAgaWYgKGpvaW5TZXNzaW9uICYmIChzZXNzaW9uSWQgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJDb29raWU6IEpTRVNTSU9OSUQ9IiArIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICAgICAgICAgIGxvZygiSU5QSDogQ29va2llOiBKU0VTU0lPTklEPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2VuZCB0aGUgc3BlY2lmaWVkIGhlYWRlcnMgKGlmIGFueSkKKyAgICAgICAgICAgIGlmIChpbkhlYWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBoZWFkZXJzID0gaW5IZWFkZXJzOworICAgICAgICAgICAgICAgIHdoaWxlIChoZWFkZXJzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZGVsaW1pdGVyID0gaGVhZGVycy5pbmRleE9mKCIjIyIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGltaXRlciA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IGhlYWRlcnM7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gIiI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBoZWFkZXJzLnN1YnN0cmluZygwLCBkZWxpbWl0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc3Vic3RyaW5nKGRlbGltaXRlciArIDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBjb2xvbiA9IGhlYWRlci5pbmRleE9mKCI6Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvbiA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBoZWFkZXIuc3Vic3RyaW5nKDAsIGNvbG9uKS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGhlYWRlci5zdWJzdHJpbmcoY29sb24gKyAxKS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJJTlBIOiAiICsgbmFtZSArICI6ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KG5hbWUgKyAiOiAiICsgdmFsdWUgKyAiXHJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB3LnByaW50KCJcclxuIik7CisKKyAgICAgICAgICAgIC8vIFNlbmQgb3VyIGNvbnRlbnQgKGlmIGFueSkKKyAgICAgICAgICAgIGlmIChpbkNvbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgICAgICAgICBsb2coIklOUEQ6ICIgKyBpbkNvbnRlbnQpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5Db250ZW50Lmxlbmd0aCgpOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KGluQ29udGVudC5jaGFyQXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHcuZmx1c2goKTsKKworICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzcG9uc2Ugc3RhdHVzIGFuZCBhc3NvY2lhdGVkIG1lc3NhZ2UKKyAgICAgICAgICAgIFN0cmluZyBsaW5lID0gcmVhZChpcyk7CisgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0U3RhdHVzID0gLTE7CisgICAgICAgICAgICAgICAgb3V0TWVzc2FnZSA9ICJOTyBSRVNQT05TRSI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSRVNQOiAiICsgbGluZSk7CisgICAgICAgICAgICAgICAgaW50IHNwYWNlID0gbGluZS5pbmRleE9mKCIgIik7CisgICAgICAgICAgICAgICAgaWYgKHNwYWNlID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKHNwYWNlICsgMSkudHJpbSgpOworICAgICAgICAgICAgICAgICAgICBzcGFjZSA9IGxpbmUuaW5kZXhPZigiICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3BhY2UgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRTdGF0dXMgPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0TWVzc2FnZSA9ICIiOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RhdHVzID0gSW50ZWdlci5wYXJzZUludChsaW5lLnN1YnN0cmluZygwLCBzcGFjZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0TWVzc2FnZSA9IGxpbmUuc3Vic3RyaW5nKHNwYWNlICsgMSkudHJpbSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0U3RhdHVzID0gLTE7CisgICAgICAgICAgICAgICAgICAgIG91dE1lc3NhZ2UgPSAiTlVNQkVSIEZPUk1BVCBFWENFUFRJT04iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU1RBVDogIiArIG91dFN0YXR1cyArICIgTUVTRzogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1lc3NhZ2UpOworCisgICAgICAgICAgICAvLyBSZWFkIHRoZSByZXNwb25zZSBoZWFkZXJzIChpZiBhbnkpCisgICAgICAgICAgICBTdHJpbmcgaGVhZGVyTmFtZSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgaGVhZGVyVmFsdWUgPSBudWxsOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBsaW5lID0gcmVhZChpcyk7CisgICAgICAgICAgICAgICAgaWYgKChsaW5lID09IG51bGwpIHx8IChsaW5lLmxlbmd0aCgpID09IDApKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpbnQgY29sb24gPSBsaW5lLmluZGV4T2YoIjoiKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sb24gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI/Pz8/OiAiICsgbGluZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyTmFtZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGNvbG9uKS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlclZhbHVlID0gbGluZS5zdWJzdHJpbmcoY29sb24gKyAxKS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIRUFEOiAiICsgaGVhZGVyTmFtZSArICI6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZShoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgiU2V0LUNvb2tpZSIuZXF1YWxzKGhlYWRlck5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VTZXNzaW9uKGhlYWRlclZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc3BvbnNlIGRhdGEgKGlmIGFueSkKKyAgICAgICAgICAgIFN0cmluZyBvdXREYXRhID0gIiI7CisgICAgICAgICAgICBTdHJpbmcgb3V0VGV4dCA9ICIiOworICAgICAgICAgICAgaW50IGxpbmVzID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgbGluZSA9IHJlYWQoaXMpOworICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobGluZXMgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgb3V0RGF0YSA9IGxpbmU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBvdXRUZXh0ICs9IGxpbmUgKyAiXHJcbiI7CisgICAgICAgICAgICAgICAgc2F2ZVJlc3BvbnNlLmFkZChsaW5lKTsKKyAgICAgICAgICAgICAgICBsaW5lcysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAxKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEQVRBOiAiICsgb3V0RGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKG91dFRleHQubGVuZ3RoKCkgPiAyKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRFWFQ6ICIgKyBvdXRUZXh0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHJlc3BvbnNlIGFnYWluc3Qgb3VyIGNyaXRlcmlhCisgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbGlkYXRlU3RhdHVzKG91dFN0YXR1cyk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbGlkYXRlTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsaWRhdGVIZWFkZXJzKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbGlkYXRlRGF0YShvdXREYXRhKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsaWRhdGVHb2xkZW4oKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgcmVzdWx0ID0gIlN0YXR1cz0iICsgb3V0U3RhdHVzICsKKyAgICAgICAgICAgICAgICAiLCBNZXNzYWdlPSIgKyBvdXRNZXNzYWdlOworICAgICAgICAgICAgdGhyb3dhYmxlID0gbnVsbDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChwdyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcHcuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdykgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB3KSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHcpIHsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzb2NrZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB3KSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3VjY2VzcykKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT0sgIiArIHN1bW1hcnkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTCAiICsgc3VtbWFyeSArICIgIiArIHJlc3VsdCk7CisgICAgICAgICAgICBpZiAodGhyb3dhYmxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyIGZyb20gdGhlIHNwZWNpZmllZCBTZXQtQ29va2llIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBTZXQtQ29va2llIHZhbHVlIHRvIHBhcnNlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VTZXNzaW9uKFN0cmluZyB2YWx1ZSkgeworCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpbnQgZXF1YWxzID0gdmFsdWUuaW5kZXhPZigiSlNFU1NJT05JRD0iKTsKKyAgICAgICAgaWYgKGVxdWFscyA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKGVxdWFscyArICJKU0VTU0lPTklEPSIubGVuZ3RoKCkpOworICAgICAgICBpbnQgc2VtaSA9IHZhbHVlLmluZGV4T2YoIjsiKTsKKyAgICAgICAgaWYgKHNlbWkgPj0gMCkKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHNlbWkpOworCisgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTRVNTSU9OIElEOiAiICsgdmFsdWUpOworICAgICAgICBzZXNzaW9uSWQgPSB2YWx1ZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVhZCBhbmQgcmV0dXJuIHRoZSBuZXh0IGxpbmUgZnJvbSB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbSwgd2l0aAorICAgICAqIG5vIGNhcnJpYWdlIHJldHVybiBvciBsaW5lIGZlZWQgZGVsaW1pdGVycy4gIElmCisgICAgICogZW5kIG9mIGZpbGUgaXMgcmVhY2hlZCwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlYWQoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgYiA9IHN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICBpZiAoYiA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXIgYyA9IChjaGFyKSBiOworICAgICAgICAgICAgaWYgKGMgPT0gJ1xyJykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xuJykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAocmVzdWx0LnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWFkIGFuZCBzYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgZ29sZGVuIGZpbGUgZm9yIHRoaXMgdGVzdCwgaWYgYW55LgorICAgICAqIE90aGVyd2lzZSwgdGhlIDxjb2RlPnNhdmVHb2xkZW48L2NvZGU+IGxpc3Qgd2lsbCBiZSBlbXB0eS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlYWRHb2xkZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIFdhcyBhIGdvbGRlbiBmaWxlIHNwZWNpZmllZD8KKyAgICAgICAgc2F2ZUdvbGRlbi5jbGVhcigpOworICAgICAgICBpZiAoZ29sZGVuID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgY29ubmVjdGlvbiB0byByZWNlaXZlIHRoZSBnb2xkZW4gZmlsZSBjb250ZW50cworICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCgiaHR0cCIsIGhvc3QsIHBvcnQsIGdvbGRlbik7CisgICAgICAgIEh0dHBVUkxDb25uZWN0aW9uIGNvbm4gPQorICAgICAgICAgICAgKEh0dHBVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgY29ubi5zZXRBbGxvd1VzZXJJbnRlcmFjdGlvbihmYWxzZSk7CisgICAgICAgIGNvbm4uc2V0RG9JbnB1dCh0cnVlKTsKKyAgICAgICAgY29ubi5zZXREb091dHB1dChmYWxzZSk7CisgICAgICAgIGNvbm4uc2V0Rm9sbG93UmVkaXJlY3RzKHRydWUpOworICAgICAgICBjb25uLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOworCisgICAgICAgIC8vIENvbm5lY3QgdG8gdGhlIHNlcnZlciBhbmQgcmV0cmlldmUgdGhlIGdvbGRlbiBmaWxlCisgICAgICAgIGNvbm4uY29ubmVjdCgpOworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lID0gcmVhZChpcyk7CisgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgc2F2ZUdvbGRlbi5hZGQobGluZSk7CisgICAgICAgIH0KKyAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgY29ubi5kaXNjb25uZWN0KCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNhdmUgdGhlIHNwZWNpZmllZCBoZWFkZXIgbmFtZSBhbmQgdmFsdWUgaW4gb3VyIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBIZWFkZXIgbmFtZSB0byBzYXZlCisgICAgICogQHBhcmFtIHZhbHVlIEhlYWRlciB2YWx1ZSB0byBzYXZlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2F2ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisKKyAgICAgICAgU3RyaW5nIGtleSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSAoQXJyYXlMaXN0KSBzYXZlSGVhZGVycy5nZXQoa2V5KTsKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIHNhdmVIZWFkZXJzLnB1dChrZXksIGxpc3QpOworICAgICAgICB9CisgICAgICAgIGxpc3QuYWRkKHZhbHVlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIG91dHB1dCBkYXRhIGFnYWluc3Qgd2hhdCB3ZSBleHBlY3RlZC4gIFJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGZvciBubyBwcm9ibGVtcywgb3IgYW4gZXJyb3IgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIFRoZSBvdXRwdXQgZGF0YSB0byBiZSB0ZXN0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlRGF0YShTdHJpbmcgZGF0YSkgeworCisgICAgICAgIGlmIChvdXRDb250ZW50ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBlbHNlIGlmIChkYXRhLnN0YXJ0c1dpdGgob3V0Q29udGVudCkpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKCJFeHBlY3RlZCBkYXRhICciICsgb3V0Q29udGVudCArICInLCBnb3QgZGF0YSAnIiArCisgICAgICAgICAgICAgICAgICAgIGRhdGEgKyAiJyIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcmVzcG9uc2UgYWdhaW5zdCB0aGUgZ29sZGVuIGZpbGUgKGlmIGFueSkuICBSZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm8gcHJvYmxlbXMsIG9yIGFuIGVycm9yIG1lc3NhZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZUdvbGRlbigpIHsKKworICAgICAgICBpZiAoZ29sZGVuID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBib29sZWFuIG9rID0gdHJ1ZTsKKyAgICAgICAgaWYgKHNhdmVHb2xkZW4uc2l6ZSgpICE9IHNhdmVSZXNwb25zZS5zaXplKCkpCisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2F2ZUdvbGRlbi5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBnb2xkZW4gPSAoU3RyaW5nKSBzYXZlR29sZGVuLmdldChpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSAoU3RyaW5nKSBzYXZlUmVzcG9uc2UuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmICghZ29sZGVuLmVxdWFscyhyZXNwb25zZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRVhQRUNURUQ6ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2F2ZUdvbGRlbi5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigoU3RyaW5nKSBzYXZlR29sZGVuLmdldChpKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUkVDRUlWRUQ6ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2F2ZVJlc3BvbnNlLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKChTdHJpbmcpIHNhdmVSZXNwb25zZS5nZXQoaSkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworICAgICAgICByZXR1cm4gKCJGYWlsZWQgR29sZGVuIEZpbGUgQ29tcGFyaXNvbiIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgc2F2ZWQgaGVhZGVycyBhZ2FpbnN0IHRoZSA8Y29kZT5vdXRIZWFkZXJzPC9jb2RlPgorICAgICAqIHByb3BlcnR5LCBhbmQgcmV0dXJuIGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlcmUgaXMgYW55dGhpbmcgbWlzc2luZy4KKyAgICAgKiBJZiBhbGwgb2YgdGhlIGV4cGVjdGVkIGhlYWRlcnMgYXJlIHByZXNlbnQsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlSGVhZGVycygpIHsKKworICAgICAgICAvLyBEbyB3ZSBoYXZlIGFueSBoZWFkZXJzIHRvIGNoZWNrIGZvcj8KKyAgICAgICAgaWYgKG91dEhlYWRlcnMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgLy8gQ2hlY2sgZWFjaCBzcGVjaWZpZWQgbmFtZTp2YWx1ZSBjb21iaW5hdGlvbgorICAgICAgICBTdHJpbmcgaGVhZGVycyA9IG91dEhlYWRlcnM7CisgICAgICAgIHdoaWxlIChoZWFkZXJzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgLy8gUGFyc2UgdGhlIG5leHQgbmFtZTp2YWx1ZSBjb21iaW5hdGlvbgorICAgICAgICAgICAgaW50IGRlbGltaXRlciA9IGhlYWRlcnMuaW5kZXhPZigiIyMiKTsKKyAgICAgICAgICAgIFN0cmluZyBoZWFkZXIgPSBudWxsOworICAgICAgICAgICAgaWYgKGRlbGltaXRlciA8IDApIHsKKyAgICAgICAgICAgICAgICBoZWFkZXIgPSBoZWFkZXJzOworICAgICAgICAgICAgICAgIGhlYWRlcnMgPSAiIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGVhZGVyID0gaGVhZGVycy5zdWJzdHJpbmcoMCwgZGVsaW1pdGVyKTsKKyAgICAgICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zdWJzdHJpbmcoZGVsaW1pdGVyICsgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgY29sb24gPSBoZWFkZXIuaW5kZXhPZigiOiIpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBoZWFkZXIuc3Vic3RyaW5nKDAsIGNvbG9uKS50cmltKCk7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBoZWFkZXIuc3Vic3RyaW5nKGNvbG9uICsgMSkudHJpbSgpOworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBvY2N1cnJlbmNlIG9mIHRoaXMgaGVhZGVyCisgICAgICAgICAgICBBcnJheUxpc3QgbGlzdCA9IChBcnJheUxpc3QpIHNhdmVIZWFkZXJzLmdldChuYW1lLnRvTG93ZXJDYXNlKCkpOworICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKCJNaXNzaW5nIGhlYWRlciBuYW1lICciICsgbmFtZSArICInIik7CisgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKChTdHJpbmcpIGxpc3QuZ2V0KGkpKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICAgICAgcmV0dXJuICgiTWlzc2luZyBoZWFkZXIgbmFtZSAnIiArIG5hbWUgKyAiJyB3aXRoIHZhbHVlICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEV2ZXJ5dGhpbmcgd2FzIGZvdW5kIHN1Y2Nlc3NmdWxseQorICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcmV0dXJuZWQgcmVzcG9uc2UgbWVzc2FnZSBhZ2FpbnN0IHdoYXQgd2UgZXhwZWN0ZWQuCisgICAgICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGZvciBubyBwcm9ibGVtcywgb3IgYW4gZXJyb3IgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSByZXR1cm5lZCByZXNwb25zZSBtZXNzYWdlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZU1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKworICAgICAgICBpZiAodGhpcy5tZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBlbHNlIGlmICh0aGlzLm1lc3NhZ2UuZXF1YWxzKG1lc3NhZ2UpKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICgiRXhwZWN0ZWQgbWVzc2FnZT0nIiArIHRoaXMubWVzc2FnZSArICInLCBnb3QgbWVzc2FnZT0nIiArCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgKyAiJyIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcmV0dXJuZWQgc3RhdHVzIGNvZGUgYWdhaW5zdCB3aGF0IHdlIGV4cGVjdGVkLiAgUmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vIHByb2JsZW1zLCBvciBhbiBlcnJvciBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXR1cyBUaGUgcmV0dXJuZWQgc3RhdHVzIGNvZGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlU3RhdHVzKGludCBzdGF0dXMpIHsKKworICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PSBzdGF0dXMpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKCJFeHBlY3RlZCBzdGF0dXM9IiArIHRoaXMuc3RhdHVzICsgIiwgZ290IHN0YXR1cz0iICsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVGVzdGVyRXhjZXB0aW9uLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVGVzdGVyRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRlOGQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9UZXN0ZXJFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIEdlbmVyaWMgZXhjZXB0aW9uIGNsYXNzIHRvIHVzZSBmb3IgdGVzdGluZyBlcnJvciBwYWdlIGFzc2VydGlvbnMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBUZXN0ZXJFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gZXhjZXB0aW9uIHdpdGggbm8gYXNzb2NpYXRlZCBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBUZXN0ZXJFeGNlcHRpb24oKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBhc3NvY2lhdGVkIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgYXNzb2NpYXRlZCBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIFRlc3RlckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9UZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNDNlNDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3RlciByZXF1ZXN0IHdyYXBwZXIgdGhhdCBsb2dzIGFsbCBjYWxscyB0byB0aGUgY29uZmlndXJlZCBsb2dnZXIsCisgKiBiZWZvcmUgcGFzc2luZyB0aGVtIG9uIHRvIHRoZSB1bmRlcmx5aW5nIHJlcXVlc3QuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyCisgICAgZXh0ZW5kcyBIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZSBhIG5ldyByZXF1ZXN0IHdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdCB3ZSBhcmUgd3JhcHBpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyKHJlcXVlc3QpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLy8gRm9yIGVhY2ggcHVibGljIG1ldGhvZCwgbG9nIHRoZSBjYWxsIGFuZCBwYXNzIGl0IHRvIHRoZSB3cmFwcGVkIHJlc3BvbnNlCisKKworICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRBdHRyaWJ1dGUoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRBdHRyaWJ1dGUobmFtZSkpOworICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0QXR0cmlidXRlTmFtZXMoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRBdHRyaWJ1dGVOYW1lcygpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aFR5cGUoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRBdXRoVHlwZSgpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0QXV0aFR5cGUoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRDaGFyYWN0ZXJFbmNvZGluZygpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0Q29udGVudExlbmd0aCgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldENvbnRlbnRMZW5ndGgoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRDb250ZW50TGVuZ3RoKCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldENvbnRlbnRUeXBlKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0Q29udGVudFR5cGUoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQYXRoKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0Q29udGV4dFBhdGgoKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmdldENvbnRleHRQYXRoKCkpOworICAgIH0KKworCisgICAgcHVibGljIENvb2tpZVtdIGdldENvb2tpZXMoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRDb29raWVzKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRDb29raWVzKCkpOworICAgIH0KKworCisgICAgcHVibGljIGxvbmcgZ2V0RGF0ZUhlYWRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0RGF0ZUhlYWRlcigpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0RGF0ZUhlYWRlcihuYW1lKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0SGVhZGVyKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRIZWFkZXIobmFtZSkpOworICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEhlYWRlcnMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldEhlYWRlcnMoKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmdldEhlYWRlcnMobmFtZSkpOworICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEhlYWRlck5hbWVzKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0SGVhZGVyTmFtZXMoKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmdldEhlYWRlck5hbWVzKCkpOworICAgIH0KKworCisgICAgcHVibGljIFNlcnZsZXRJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRJbnB1dFN0cmVhbSgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldElucHV0U3RyZWFtKCkpOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRJbnRIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldEludEhlYWRlcigpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0SW50SGVhZGVyKG5hbWUpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0TG9jYWxlKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0TG9jYWxlKCkpOworICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldExvY2FsZXMoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRMb2NhbGVzKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0TG9jYWxlcygpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0TWV0aG9kKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRNZXRob2QoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UGFyYW1ldGVyKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVyKG5hbWUpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBNYXAgZ2V0UGFyYW1ldGVyTWFwKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UGFyYW1ldGVyTWFwKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVyTWFwKCkpOworICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFBhcmFtZXRlck5hbWVzKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UGFyYW1ldGVyTmFtZXMoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJOYW1lcygpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFBhcmFtZXRlclZhbHVlcygpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlclZhbHVlcyhuYW1lKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhJbmZvKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UGF0aEluZm8oKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmdldFBhdGhJbmZvKCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoVHJhbnNsYXRlZCgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFBhdGhUcmFuc2xhdGVkKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRQYXRoVHJhbnNsYXRlZCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRQcm90b2NvbCgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFByb3RvY29sKCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFF1ZXJ5U3RyaW5nKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRRdWVyeVN0cmluZygpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBCdWZmZXJlZFJlYWRlciBnZXRSZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UmVhZGVyKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0UmVhZGVyKCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRSZWFsUGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UmVhbFBhdGgoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRSZWFsUGF0aChwYXRoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUFkZHIoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRSZW1vdGVBZGRyKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0UmVtb3RlQWRkcigpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlSG9zdCgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFJlbW90ZUhvc3QoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRSZW1vdGVIb3N0KCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVVc2VyKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UmVtb3RlVXNlcigpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0UmVtb3RlVXNlcigpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBSZXF1ZXN0RGlzcGF0Y2hlciBnZXRSZXF1ZXN0RGlzcGF0Y2hlcihTdHJpbmcgcGF0aCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UmVxdWVzdERpc3BhdGNoZXIoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihwYXRoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RVUkkoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRSZXF1ZXN0VVJJKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRSZXF1ZXN0VVJJKCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZ0J1ZmZlciBnZXRSZXF1ZXN0VVJMKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UmVxdWVzdFVSTCgpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0UmVxdWVzdFVSTCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFNjaGVtZSgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFNjaGVtZSgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTmFtZSgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFNlcnZlck5hbWUoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRTZXJ2ZXJOYW1lKCkpOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRTZXJ2ZXJQb3J0KCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0U2VydmVyUG9ydCgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFNlcnZlclBvcnQoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRQYXRoKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0U2VydmxldFBhdGgoKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmdldFNlcnZsZXRQYXRoKCkpOworICAgIH0KKworCisgICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRTZXNzaW9uKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRTZXNzaW9uKCkpOworICAgIH0KKworCisgICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oYm9vbGVhbiBjcmVhdGUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFNlc3Npb24oYikiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRTZXNzaW9uKGNyZWF0ZSkpOworICAgIH0KKworCisgICAgcHVibGljIFByaW5jaXBhbCBnZXRVc2VyUHJpbmNpcGFsKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0VXNlclByaW5jaXBhbCgpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0VXNlclByaW5jaXBhbCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tQ29va2llKCkpOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVXJsKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVXJsKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VcmwoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VUkwoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VUkwoKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5pc1JlcXVlc3RlZFNlc3Npb25JZFZhbGlkKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5pc1JlcXVlc3RlZFNlc3Npb25JZFZhbGlkKCkpOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5pc1NlY3VyZSgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmlzU2VjdXJlKCkpOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5pc1VzZXJJblJvbGUoKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmlzVXNlckluUm9sZShyb2xlKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgpIik7CisgICAgICAgIGdldFJlcXVlc3QoKS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuc2V0QXR0cmlidXRlKCkiKTsKKyAgICAgICAgZ2V0UmVxdWVzdCgpLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgZW5jKQorICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5zZXRDaGFyYWN0ZXJFbmNvZGluZygpIik7CisgICAgICAgIGdldFJlcXVlc3QoKS5zZXRDaGFyYWN0ZXJFbmNvZGluZyhlbmMpOworICAgIH0KKworCisKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9UZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwN2IxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0ZXIgcmVzcG9uc2Ugd3JhcHBlciB0aGF0IGxvZ3MgYWxsIGNhbGxzIHRvIHRoZSBjb25maWd1cmVkIGxvZ2dlciwKKyAqIGJlZm9yZSBwYXNzaW5nIHRoZW0gb24gdG8gdGhlIHVuZGVybHlpbmcgcmVzcG9uc2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcgorICAgIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIGEgbmV3IHJlc3BvbnNlIHdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIHdlIGFyZSB3cmFwcGluZworICAgICAqLworICAgIHB1YmxpYyBUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcihIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisKKyAgICAgICAgc3VwZXIocmVzcG9uc2UpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLy8gRm9yIGVhY2ggcHVibGljIG1ldGhvZCwgbG9nIHRoZSBjYWxsIGFuZCBwYXNzIGl0IHRvIHRoZSB3cmFwcGVkIHJlc3BvbnNlCisKKworICAgIHB1YmxpYyB2b2lkIGFkZENvb2tpZShDb29raWUgY29va2llKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuYWRkQ29va2llKCkiKTsKKyAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5hZGRDb29raWUoY29va2llKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGFkZERhdGVIZWFkZXIoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5hZGREYXRlSGVhZGVyKCkiKTsKKyAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5hZGREYXRlSGVhZGVyKG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuYWRkSGVhZGVyKCkiKTsKKyAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5hZGRIZWFkZXIobmFtZSwgdmFsdWUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgYWRkSW50SGVhZGVyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5hZGRJbnRIZWFkZXIoKSIpOworICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLmFkZEludEhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0hlYWRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmNvbnRhaW5zSGVhZGVyKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLmNvbnRhaW5zSGVhZGVyKG5hbWUpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlVVJMKFN0cmluZyB1cmwpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5lbmNvZGVVUkwoKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuZW5jb2RlVVJMKHVybCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVVcmwoU3RyaW5nIHVybCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmVuY29kZVVybCgpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5lbmNvZGVVcmwodXJsKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VVJMKFN0cmluZyB1cmwpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5lbmNvZGVSZWRpcmVjdFVSTCgpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5lbmNvZGVSZWRpcmVjdFVSTCh1cmwpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlUmVkaXJlY3RVcmwoU3RyaW5nIHVybCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmVuY29kZVJlZGlyZWN0VXJsKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLmVuY29kZVJlZGlyZWN0VXJsKHVybCkpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgZmx1c2hCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmZsdXNoQnVmZmVyKCkiKTsKKyAgICAgICAgZ2V0UmVzcG9uc2UoKS5mbHVzaEJ1ZmZlcigpOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRCdWZmZXJTaXplKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmdldEJ1ZmZlclNpemUoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlc3BvbnNlKCkuZ2V0QnVmZmVyU2l6ZSgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlc3BvbnNlKCkuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5nZXRMb2NhbGUoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlc3BvbnNlKCkuZ2V0TG9jYWxlKCkpOworICAgIH0KKworCisgICAgcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5nZXRPdXRwdXRTdHJlYW0oKSIpOworICAgICAgICByZXR1cm4gKGdldFJlc3BvbnNlKCkuZ2V0T3V0cHV0U3RyZWFtKCkpOworICAgIH0KKworCisgICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuZ2V0V3JpdGVyKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXNwb25zZSgpLmdldFdyaXRlcigpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWl0dGVkKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmlzQ29tbWl0dGVkKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXNwb25zZSgpLmlzQ29tbWl0dGVkKCkpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIucmVzZXQoKSIpOworICAgICAgICBnZXRSZXNwb25zZSgpLnJlc2V0KCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZXNldEJ1ZmZlcigpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5yZXNldEJ1ZmZlcigpIik7CisgICAgICAgIGdldFJlc3BvbnNlKCkucmVzZXRCdWZmZXIoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgc2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuc2VuZEVycm9yKGkpIik7CisgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuc2VuZEVycm9yKHNjKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgc2MsIFN0cmluZyBtc2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuc2VuZEVycm9yKGkscykiKTsKKyAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5zZW5kRXJyb3Ioc2MsIG1zZyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZW5kUmVkaXJlY3QoU3RyaW5nIGxvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLnNlbmRSZWRpcmVjdCgpIik7CisgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuc2VuZFJlZGlyZWN0KGxvY2F0aW9uKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEJ1ZmZlclNpemUoaW50IHNpemUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5zZXRCdWZmZXJTaXplKCkiKTsKKyAgICAgICAgZ2V0UmVzcG9uc2UoKS5zZXRCdWZmZXJTaXplKHNpemUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudExlbmd0aChpbnQgbGVuKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuc2V0Q29udGVudExlbmd0aCgpIik7CisgICAgICAgIGdldFJlc3BvbnNlKCkuc2V0Q29udGVudExlbmd0aChsZW4pOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5zZXRDb250ZW50VHlwZSgpIik7CisgICAgICAgIGdldFJlc3BvbnNlKCkuc2V0Q29udGVudFR5cGUodHlwZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlSGVhZGVyKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuc2V0RGF0ZUhlYWRlcigpIik7CisgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuc2V0RGF0ZUhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLnNldEhlYWRlcigpIik7CisgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuc2V0SW50SGVhZGVyKCkiKTsKKyAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5zZXRJbnRIZWFkZXIobmFtZSwgdmFsdWUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2NhbGUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5zZXRMb2NhbGUoKSIpOworICAgICAgICBnZXRSZXNwb25zZSgpLnNldExvY2FsZShsb2NhbGUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzYykgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLnNldFN0YXR1cyhpKSIpOworICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLnNldFN0YXR1cyhzYyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHNjLCBTdHJpbmcgbXNnKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuc2V0U3RhdHVzKGkscykiKTsKKyAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5zZXRTdGF0dXMoc2MsIG1zZyk7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9UZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9UZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQxMWFkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Rlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3RlciByZXF1ZXN0IHdyYXBwZXIgdGhhdCBsb2dzIGFsbCBjYWxscyB0byB0aGUgY29uZmlndXJlZCBsb2dnZXIsCisgKiBiZWZvcmUgcGFzc2luZyB0aGVtIG9uIHRvIHRoZSB1bmRlcmx5aW5nIHJlcXVlc3QuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgZXh0ZW5kcyBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIGEgbmV3IHJlcXVlc3Qgd3JhcHBlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0IHdlIGFyZSB3cmFwcGluZworICAgICAqLworICAgIHB1YmxpYyBUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIoU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyKHJlcXVlc3QpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLy8gRm9yIGVhY2ggcHVibGljIG1ldGhvZCwgbG9nIHRoZSBjYWxsIGFuZCBwYXNzIGl0IHRvIHRoZSB3cmFwcGVkIHJlc3BvbnNlCisKKworICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldEF0dHJpYnV0ZSgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldEF0dHJpYnV0ZShuYW1lKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QXR0cmlidXRlTmFtZXMoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldEF0dHJpYnV0ZU5hbWVzKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlTmFtZXMoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRDaGFyYWN0ZXJFbmNvZGluZygpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldENoYXJhY3RlckVuY29kaW5nKCkpOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRDb250ZW50TGVuZ3RoKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0Q29udGVudExlbmd0aCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldENvbnRlbnRUeXBlKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0Q29udGVudFR5cGUoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU2VydmxldElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0SW5wdXRTdHJlYW0oKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRMb2NhbGUoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRMb2NhbGUoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TG9jYWxlcygpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0TG9jYWxlcygpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldExvY2FsZXMoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRQYXJhbWV0ZXIoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXIobmFtZSkpOworICAgIH0KKworCisgICAgcHVibGljIE1hcCBnZXRQYXJhbWV0ZXJNYXAoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFBhcmFtZXRlck1hcCgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlck1hcCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQYXJhbWV0ZXJOYW1lcygpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UGFyYW1ldGVyTmFtZXMoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJOYW1lcygpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVyVmFsdWVzKG5hbWUpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFByb3RvY29sKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0UHJvdG9jb2woKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgQnVmZmVyZWRSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UmVhZGVyKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0UmVhZGVyKCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRSZWFsUGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRSZWFsUGF0aCgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFJlYWxQYXRoKHBhdGgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlQWRkcigpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UmVtb3RlQWRkcigpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFJlbW90ZUFkZHIoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUhvc3QoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFJlbW90ZUhvc3QoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRSZW1vdGVIb3N0KCkpOworICAgIH0KKworCisgICAgcHVibGljIFJlcXVlc3REaXNwYXRjaGVyIGdldFJlcXVlc3REaXNwYXRjaGVyKFN0cmluZyBwYXRoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFJlcXVlc3REaXNwYXRjaGVyKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIocGF0aCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWUoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFNjaGVtZSgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFNjaGVtZSgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTmFtZSgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0U2VydmVyTmFtZSgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFNlcnZlck5hbWUoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IGdldFNlcnZlclBvcnQoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFNlcnZlclBvcnQoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRTZXJ2ZXJQb3J0KCkpOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmlzU2VjdXJlKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuaXNTZWN1cmUoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIucmVtb3ZlQXR0cmlidXRlKCkiKTsKKyAgICAgICAgZ2V0UmVxdWVzdCgpLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLnNldEF0dHJpYnV0ZSgpIik7CisgICAgICAgIGdldFJlcXVlc3QoKS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q2hhcmFjdGVyRW5jb2RpbmcoU3RyaW5nIGVuYykKKyAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5zZXRDaGFyYWN0ZXJFbmNvZGluZygpIik7CisgICAgICAgIGdldFJlcXVlc3QoKS5zZXRDaGFyYWN0ZXJFbmNvZGluZyhlbmMpOworICAgIH0KKworCisKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVGVzdGVyU2VydmxldFJlc3BvbnNlV3JhcHBlci5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Rlc3RlclNlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTE4ODRjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Rlc3RlclNlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0ZXIgcmVzcG9uc2Ugd3JhcHBlciB0aGF0IGxvZ3MgYWxsIGNhbGxzIHRvIHRoZSBjb25maWd1cmVkIGxvZ2dlciwKKyAqIGJlZm9yZSBwYXNzaW5nIHRoZW0gb24gdG8gdGhlIHVuZGVybHlpbmcgcmVzcG9uc2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBUZXN0ZXJTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIGV4dGVuZHMgU2VydmxldFJlc3BvbnNlV3JhcHBlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorCisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgYSBuZXcgcmVzcG9uc2Ugd3JhcHBlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2Ugd2UgYXJlIHdyYXBwaW5nCisgICAgICovCisgICAgcHVibGljIFRlc3RlclNlcnZsZXRSZXNwb25zZVdyYXBwZXIoU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisKKyAgICAgICAgc3VwZXIocmVzcG9uc2UpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLy8gRm9yIGVhY2ggcHVibGljIG1ldGhvZCwgbG9nIHRoZSBjYWxsIGFuZCBwYXNzIGl0IHRvIHRoZSB3cmFwcGVkIHJlc3BvbnNlCisKKworICAgIHB1YmxpYyB2b2lkIGZsdXNoQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmZsdXNoQnVmZmVyKCkiKTsKKyAgICAgICAgZ2V0UmVzcG9uc2UoKS5mbHVzaEJ1ZmZlcigpOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRCdWZmZXJTaXplKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXNwb25zZVdyYXBwZXIuZ2V0QnVmZmVyU2l6ZSgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVzcG9uc2UoKS5nZXRCdWZmZXJTaXplKCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmdldENoYXJhY3RlckVuY29kaW5nKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXNwb25zZSgpLmdldENoYXJhY3RlckVuY29kaW5nKCkpOworICAgIH0KKworCisgICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlc3BvbnNlV3JhcHBlci5nZXRMb2NhbGUoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlc3BvbnNlKCkuZ2V0TG9jYWxlKCkpOworICAgIH0KKworCisgICAgcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmdldE91dHB1dFN0cmVhbSgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVzcG9uc2UoKS5nZXRPdXRwdXRTdHJlYW0oKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmdldFdyaXRlcigpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVzcG9uc2UoKS5nZXRXcml0ZXIoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbW1pdHRlZCgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmlzQ29tbWl0dGVkKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXNwb25zZSgpLmlzQ29tbWl0dGVkKCkpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlc3BvbnNlV3JhcHBlci5yZXNldCgpIik7CisgICAgICAgIGdldFJlc3BvbnNlKCkucmVzZXQoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHJlc2V0QnVmZmVyKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXNwb25zZVdyYXBwZXIucmVzZXRCdWZmZXIoKSIpOworICAgICAgICBnZXRSZXNwb25zZSgpLnJlc2V0QnVmZmVyKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRCdWZmZXJTaXplKGludCBzaXplKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlc3BvbnNlV3JhcHBlci5zZXRCdWZmZXJTaXplKCkiKTsKKyAgICAgICAgZ2V0UmVzcG9uc2UoKS5zZXRCdWZmZXJTaXplKHNpemUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudExlbmd0aChpbnQgbGVuKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlc3BvbnNlV3JhcHBlci5zZXRDb250ZW50TGVuZ3RoKCkiKTsKKyAgICAgICAgZ2V0UmVzcG9uc2UoKS5zZXRDb250ZW50TGVuZ3RoKGxlbik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXNwb25zZVdyYXBwZXIuc2V0Q29udGVudFR5cGUoKSIpOworICAgICAgICBnZXRSZXNwb25zZSgpLnNldENvbnRlbnRUeXBlKHR5cGUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2NhbGUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLnNldExvY2FsZSgpIik7CisgICAgICAgIGdldFJlc3BvbnNlKCkuc2V0TG9jYWxlKGxvY2FsZSk7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9VcHBlckNhc2VGaWx0ZXIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9VcHBlckNhc2VGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTdlMTVmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1VwcGVyQ2FzZUZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBGaWx0ZXIgdGhhdCBzaW1wbHkgdHJhbnNmb3JtcyBpdHMgb3V0cHV0IHRvIHVwcGVyIGNhc2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBVcHBlckNhc2VGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisKKyAgICBwcml2YXRlIEZpbHRlckNvbmZpZyBjb25maWcgPSBudWxsOworCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgOyAvLyBObyBhY3Rpb24gcmVxdWlyZWQKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlckNoYWluIGNoYWluKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCB3cmVxdWVzdCA9CisgICAgICAgICAgICBuZXcgVXBwZXJDYXNlUmVxdWVzdCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSByZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSB3cmVzcG9uc2UgPQorICAgICAgICAgICAgbmV3IFVwcGVyQ2FzZVJlc3BvbnNlKChIdHRwU2VydmxldFJlc3BvbnNlKSByZXNwb25zZSk7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVXBwZXJDYXNlRmlsdGVyLmRvRmlsdGVyKCkgYmVnaW4iKTsKKyAgICAgICAgY2hhaW4uZG9GaWx0ZXIod3JlcXVlc3QsIHdyZXNwb25zZSk7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVXBwZXJDYXNlRmlsdGVyLmRvRmlsdGVyKCkgZW5kIik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1VwcGVyQ2FzZUlucHV0U3RyZWFtLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVXBwZXJDYXNlSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODE0ZjYzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1VwcGVyQ2FzZUlucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIFNlcnZsZXRJbnB1dFN0cmVhbSB0aGF0IGNvbnZlcnRzIGFsbCBjaGFyYWN0ZXJzIHRvIHVwcGVyIGNhc2UuCisgKiBXQVJOSU5HOiAgVGhpcyB3aWxsIG9ubHkgd29yayBvbiA4LWJpdCBjaGFyYWN0ZXIgc2V0cyEKKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFVwcGVyQ2FzZUlucHV0U3RyZWFtIGV4dGVuZHMgU2VydmxldElucHV0U3RyZWFtIHsKKworICAgIFNlcnZsZXRJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworCisgICAgcHVibGljIFVwcGVyQ2FzZUlucHV0U3RyZWFtKFNlcnZsZXRJbnB1dFN0cmVhbSBzdHJlYW0pCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBjID0gc3RyZWFtLnJlYWQoKTsKKyAgICAgICAgaWYgKGMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIChjKTsKKyAgICAgICAgY2hhciBjaCA9IChjaGFyKSBjOworICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGNoKSkKKyAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKTsKKyAgICAgICAgcmV0dXJuICgoaW50KSBjaCk7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkKGJ5dGUgYnVmW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9mZjsgaSA8IChvZmYgKyBsZW4pOyBpKyspIHsKKyAgICAgICAgICAgIGludCBjID0gc3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChjIDwgMCkgeworICAgICAgICAgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhciBjaCA9IChjaGFyKSBjOworICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjaCkpCisgICAgICAgICAgICAgICAgY2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gpOworICAgICAgICAgICAgYnVmW2ldID0gKGJ5dGUpIGNoOworICAgICAgICAgICAgbisrOworICAgICAgICB9CisgICAgICAgIHJldHVybiAobik7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkKGJ5dGUgYnVmW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAocmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWRMaW5lKGJ5dGUgYnVmW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9mZjsgaSA8IChvZmYgKyBsZW4pOyBpKyspIHsKKyAgICAgICAgICAgIGludCBjID0gc3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChjIDwgMCkgeworICAgICAgICAgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhciBjaCA9IChjaGFyKSBjOworICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjaCkpCisgICAgICAgICAgICAgICAgY2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gpOworICAgICAgICAgICAgYnVmW2ldID0gKGJ5dGUpIGNoOworICAgICAgICAgICAgbisrOworICAgICAgICAgICAgaWYgKGNoID09ICdcbicpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChuKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1VwcGVyQ2FzZU91dHB1dFN0cmVhbS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1VwcGVyQ2FzZU91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNGRhYTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVXBwZXJDYXNlT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIFNlcnZsZXRPdXRwdXRTdHJlYW0gdGhhdCBjb252ZXJ0cyBhbGwgY2hhcmFjdGVycyB0byB1cHBlciBjYXNlLgorICogV0FSTklORzogIFRoaXMgd2lsbCBvbmx5IHdvcmsgb24gOC1iaXQgY2hhcmFjdGVyIHNldHMhCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBVcHBlckNhc2VPdXRwdXRTdHJlYW0gZXh0ZW5kcyBTZXJ2bGV0T3V0cHV0U3RyZWFtIHsKKworICAgIFNlcnZsZXRPdXRwdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKworICAgIHB1YmxpYyBVcHBlckNhc2VPdXRwdXRTdHJlYW0oU2VydmxldE91dHB1dFN0cmVhbSBzdHJlYW0pCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hhciBjaCA9IChjaGFyKSBjOworICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGNoKSkKKyAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKTsKKyAgICAgICAgc3RyZWFtLndyaXRlKChpbnQpIGNoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJ1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gb2ZmOyBpIDwgKG9mZiArIGxlbik7IGkrKykgeworICAgICAgICAgICAgY2hhciBjaCA9IChjaGFyKSBidWZbaV07CisgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGNoKSkKKyAgICAgICAgICAgICAgICBjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaCk7CisgICAgICAgICAgICBzdHJlYW0ud3JpdGUoKGludCkgY2gpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBidWZbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGUoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1VwcGVyQ2FzZVJlYWRlci5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1VwcGVyQ2FzZVJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMzUyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVXBwZXJDYXNlUmVhZGVyLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIEJ1ZmZlcmVkUmVhZGVyIHRoYXQgY29udmVydHMgYWxsIGNoYXJhY3RlcnMgdG8gdXBwZXIgY2FzZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFVwcGVyQ2FzZVJlYWRlciBleHRlbmRzIEJ1ZmZlcmVkUmVhZGVyIHsKKworICAgIHB1YmxpYyBVcHBlckNhc2VSZWFkZXIoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlcihyZWFkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBjID0gc3VwZXIucmVhZCgpOworICAgICAgICBpZiAoYyA8IDApCisgICAgICAgICAgICByZXR1cm4gKGMpOworICAgICAgICBjaGFyIGNoID0gKGNoYXIpIGM7CisgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoY2gpKQorICAgICAgICAgICAgY2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gpOworICAgICAgICByZXR1cm4gKChpbnQpIGNoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWQoY2hhciBidWZbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IG4gPSAwOworICAgICAgICBmb3IgKGludCBpID0gb2ZmOyBpIDwgKG9mZiArIGxlbik7IGkrKykgeworICAgICAgICAgICAgaW50IGMgPSBzdXBlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAoYyA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXIgY2ggPSAoY2hhcikgYzsKKyAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoY2gpKQorICAgICAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKTsKKyAgICAgICAgICAgIGJ1ZltpXSA9IGNoOworICAgICAgICAgICAgbisrOworICAgICAgICB9CisgICAgICAgIHJldHVybiAobik7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkKGNoYXIgYnVmW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAocmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1VwcGVyQ2FzZVJlcXVlc3QuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9VcHBlckNhc2VSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwMWJlNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9VcHBlckNhc2VSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIEh0dHBTZXJ2bGV0UmVxdWVzdCB3cmFwcGVyIHRoYXQgY29udmVydHMgYWxsIGlucHV0IGNoYXJhY3RlcnMgdG8KKyAqIHVwcGVyIGNhc2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBVcHBlckNhc2VSZXF1ZXN0IGV4dGVuZHMgSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciB7CisKKworICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gbnVsbDsKKworICAgIHB1YmxpYyBVcHBlckNhc2VSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHN1cGVyKHJlcXVlc3QpOworICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgIH0KKworICAgIHB1YmxpYyBTZXJ2bGV0SW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gKG5ldyBVcHBlckNhc2VJbnB1dFN0cmVhbShyZXF1ZXN0LmdldElucHV0U3RyZWFtKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVmZmVyZWRSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIChuZXcgVXBwZXJDYXNlUmVhZGVyKHJlcXVlc3QuZ2V0UmVhZGVyKCkpKTsKKyAgICB9CisKKworfQorCisKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1VwcGVyQ2FzZVJlc3BvbnNlLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVXBwZXJDYXNlUmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzkxYzFlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1VwcGVyQ2FzZVJlc3BvbnNlLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIEh0dHBTZXJ2bGV0UmVzcG9uc2Ugd3JhcHBlciB0aGF0IGNvbnZlcnRzIGFsbCBvdXRwdXQgY2hhcmFjdGVycyB0bworICogdXBwZXIgY2FzZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFVwcGVyQ2FzZVJlc3BvbnNlIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIgeworCisKKyAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKworICAgIGJvb2xlYW4gc3RyZWFtID0gZmFsc2U7IC8vIFdyYXAgb3VyIG93biBvdXRwdXQgc3RyZWFtCisKKyAgICBwdWJsaWMgVXBwZXJDYXNlUmVzcG9uc2UoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICB0aGlzKHJlc3BvbnNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFVwcGVyQ2FzZVJlc3BvbnNlKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIGJvb2xlYW4gc3RyZWFtKSB7CisgICAgICAgIHN1cGVyKHJlc3BvbnNlKTsKKyAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICAgICAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VydmxldE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gKG5ldyBVcHBlckNhc2VPdXRwdXRTdHJlYW0ocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0cmVhbSkKKyAgICAgICAgICAgIHJldHVybiAobmV3IFByaW50V3JpdGVyKGdldE91dHB1dFN0cmVhbSgpLCB0cnVlKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAobmV3IFVwcGVyQ2FzZVdyaXRlcihyZXNwb25zZS5nZXRXcml0ZXIoKSkpOworICAgIH0KKworCit9CisKKworCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVXBwZXJDYXNlV3JpdGVyLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVXBwZXJDYXNlV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExZWE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9VcHBlckNhc2VXcml0ZXIuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogUHJpbnRXcml0ZXIgdGhhdCBjb252ZXJ0cyBhbGwgY2hhcmFjdGVycyB0byB1cHBlciBjYXNlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVXBwZXJDYXNlV3JpdGVyIGV4dGVuZHMgUHJpbnRXcml0ZXIgeworCisKKyAgICBwdWJsaWMgVXBwZXJDYXNlV3JpdGVyKFByaW50V3JpdGVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIod3JpdGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYykgeworICAgICAgICBjaGFyIGNoID0gKGNoYXIpIGM7CisgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoY2gpKQorICAgICAgICAgICAgY2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gpOworICAgICAgICBzdXBlci53cml0ZSgoaW50KSBjaCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUoY2hhciBidWZbXSwgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICBmb3IgKGludCBpID0gb2ZmOyBpIDwgKG9mZiArIGxlbik7IGkrKykgeworICAgICAgICAgICAgY2hhciBjaCA9IGJ1ZltpXTsKKyAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoY2gpKQorICAgICAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKTsKKyAgICAgICAgICAgIHN1cGVyLndyaXRlKChpbnQpIGNoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgYnVmW10pIHsKKyAgICAgICAgd3JpdGUoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgcywgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICBmb3IgKGludCBpID0gb2ZmOyBpIDwgKG9mZiArIGxlbik7IGkrKykgeworICAgICAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjaCkpCisgICAgICAgICAgICAgICAgY2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gpOworICAgICAgICAgICAgc3VwZXIud3JpdGUoKGludCkgY2gpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHMpIHsKKyAgICAgICAgd3JpdGUocywgMCwgcy5sZW5ndGgoKSk7CisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1dyYXBwZXJGaWx0ZXIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9XcmFwcGVyRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIzNWFiNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9XcmFwcGVyRmlsdGVyLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogQ29uZmlndXJhYmxlIGZpbHRlciB0aGF0IHdpbGwgd3JhcCB0aGUgcmVxdWVzdCBhbmQvb3IgcmVzcG9uc2Ugb2JqZWN0cworICogaXQgcGFzc2VzIG9uIHdpdGggZWl0aGVyIGdlbmVyaWMgb3IgSFRUUC1zcGVjaWZpYyB3cmFwcGVycy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFdyYXBwZXJGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGZpbHRlciBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhpcyBmaWx0ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbHRlckNvbmZpZyBjb25maWcgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB3cmFwcGVyIGZvciBlYWNoIHJlcXVlc3QgKCJub25lIiwgImdlbmVyaWMiLCAiaHR0cCIpLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVxdWVzdFdyYXBwZXIgPSAibm9uZSI7CisKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHdyYXBwZXIgZm9yIGVhY2ggcmVzcG9uc2UgKCJub25lIiwgImdlbmVyaWMiLCAiaHR0cCIpLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzcG9uc2VXcmFwcGVyID0gIm5vbmUiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGlzIEZpbHRlciBpbnN0YW5jZSBmcm9tIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKworICAgICAgICBjb25maWcgPSBudWxsOworICAgICAgICByZXF1ZXN0V3JhcHBlciA9ICJub25lIjsKKyAgICAgICAgcmVzcG9uc2VXcmFwcGVyID0gIm5vbmUiOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcmFwIHRoaXMgcmVxdWVzdCBhbmQvb3IgcmVzcG9uc2UgYXMgY29uZmlndXJlZCBhbmQgcGFzcyBpdCBvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCBpblJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSBpblJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlckNoYWluIGNoYWluKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgd3JhcHBlcnMKKyAgICAgICAgU2VydmxldFJlcXVlc3Qgb3V0UmVxdWVzdCA9IGluUmVxdWVzdDsKKyAgICAgICAgU2VydmxldFJlc3BvbnNlIG91dFJlc3BvbnNlID0gaW5SZXNwb25zZTsKKyAgICAgICAgaWYgKHJlcXVlc3RXcmFwcGVyLmVxdWFscygiZ2VuZXJpYyIpKSB7CisgICAgICAgICAgICBvdXRSZXF1ZXN0ID0gbmV3IFRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlcihpblJlcXVlc3QpOworICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3RXcmFwcGVyLmVxdWFscygiaHR0cCIpKSB7CisgICAgICAgICAgICBvdXRSZXF1ZXN0ID0gbmV3IFRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIKKyAgICAgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgaW5SZXF1ZXN0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzcG9uc2VXcmFwcGVyLmVxdWFscygiZ2VuZXJpYyIpKSB7CisgICAgICAgICAgICBvdXRSZXNwb25zZSA9IG5ldyBUZXN0ZXJTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKGluUmVzcG9uc2UpOworICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlV3JhcHBlci5lcXVhbHMoImh0dHAiKSkgeworICAgICAgICAgICAgb3V0UmVzcG9uc2UgPSBuZXcgVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIKKyAgICAgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGluUmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSB0aGlzIHJlcXVlc3QKKyAgICAgICAgY2hhaW4uZG9GaWx0ZXIob3V0UmVxdWVzdCwgb3V0UmVzcG9uc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQbGFjZSB0aGlzIEZpbHRlciBpbnN0YW5jZSBpbnRvIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKKyAgICAgICAgdmFsdWUgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigicmVxdWVzdCIpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJlcXVlc3RXcmFwcGVyID0gdmFsdWU7CisgICAgICAgIHZhbHVlID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoInJlc3BvbnNlIik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgcmVzcG9uc2VXcmFwcGVyID0gdmFsdWU7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1hlcmNlczAxLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvWGVyY2VzMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTZmZWVkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1hlcmNlczAxLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogRW5zdXJlIHRoYXQgd2UgY2FuIHVzZSB0aGUgWGVyY2VzIHBhcnNlciB3aGlsZSBpbmNsdWRlZCBpbiBhIHdlYiBhcHBsaWNhdGlvbgorICogZXZlbiB0aG91Z2ggdGhlIHNlcnZsZXQgY29udGFpbmVyIG1pZ2h0IHV0aWxpemUgaXRzIG93biBwYXJzZXIgZm9yIGludGVybmFsCisgKiB1c2UuCisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAYXV0aG9yIENyYWlnIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFhlcmNlczAxIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhIHNpbXBsZSBTQVggcGFyc2UgdXNpbmcgWGVyY2VzIChiYXNlZCBvbiB0aGUgU0FYQ291bnQKKyAgICAgKiBleGFtcGxlIGFwcGxpY2F0aW9uKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICB7CisKKyAgICAgICAgLy8gUHJlcGFyZSBvdXIgb3V0cHV0IHN0cmVhbQorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisKKyAgICAgICAgLy8gQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIG91ciBwYXJzZXIgZHJpdmVyCisgICAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXJsID0gZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXNvdXJjZSgiL1hlcmNlczAxLnhtbCIpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlhlcmNlczAxIEZBSUxFRCAtICIgKyBlKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIFhlcmNlczAxUGFyc2VyIHBhcnNlciA9IG5ldyBYZXJjZXMwMVBhcnNlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKQorICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZSh1cmwpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlhlcmNlczAxIEZBSUxFRCAtICIgKyBlKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBpZiBPSworICAgICAgICBpZiAob2spCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiWGVyY2VzMDEgUEFTU0VEIik7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1hlcmNlczAxUGFyc2VyLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvWGVyY2VzMDFQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzBhYThiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1hlcmNlczAxUGFyc2VyLmphdmEKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3Q7CitpbXBvcnQgb3JnLnhtbC5zYXguSGFuZGxlckJhc2U7CitpbXBvcnQgb3JnLnhtbC5zYXguUGFyc2VyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlBhcnNlckZhY3Rvcnk7CisKKworLyoqCisgKiBTQVggcGFyc2VyIChiYXNlZCBvbiBTQVhDb3VudCkgdGhhdCBleGVyY2lzZXMgdGhlIFhlcmNlcyBwYXJzZXIgd2l0aGluIHRoZQorICogZW52aXJvbm1lbnQgb2YgYSB3ZWIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAYXV0aG9yIENyYWlnIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFhlcmNlczAxUGFyc2VyIGV4dGVuZHMgSGFuZGxlckJhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBYTUwgYXR0cmlidXRlcyB3ZSBoYXZlIGVuY291bnRlcmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgYXR0cmlidXRlcyA9IDA7CisKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3ZSBoYXZlIGVuY291bnRlcmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY2hhcmFjdGVycyA9IDA7CisKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgWE1MIGVsZW1lbnRzIHdlIGhhdmUgZW5jb3VudGVyZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBlbGVtZW50cyA9IDA7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgaWdub3JhYmxlIHdoaXRlc3BhY2Ugd2UgaGF2ZSBlbmNvdW50ZXJlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHdoaXRlc3BhY2UgPSAwOworCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSByZXF1ZXN0ZWQgcGFyc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIFhNTCByZXNvdXJjZSB0byBiZSBwYXJzZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFueSBwcm9jZXNzaW5nIGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYXJzZShVUkwgdXJsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDb25zdHJ1Y3QgYSBwYXJzZXIgZm9yIG91ciB1c2UKKyAgICAgICAgUGFyc2VyIHBhcnNlciA9CisgICAgICAgICAgICBQYXJzZXJGYWN0b3J5Lm1ha2VQYXJzZXIoIm9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyIik7CisgICAgICAgIHBhcnNlci5zZXREb2N1bWVudEhhbmRsZXIodGhpcyk7CisgICAgICAgIHBhcnNlci5zZXRFcnJvckhhbmRsZXIodGhpcyk7CisKKyAgICAgICAgLy8gUGVyZm9ybSB0aGUgcmVxdWVzdGVkIHBhcnNlCisgICAgICAgIGxvbmcgYmVmb3JlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIHBhcnNlci5wYXJzZSh1cmwudG9TdHJpbmcoKSk7CisgICAgICAgIGxvbmcgYWZ0ZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICAvLyBMb2cgdGhlIHJlc3VsdHMKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJQYXJzaW5nIHRpbWUgPSAiICsgKGFmdGVyIC0gYmVmb3JlKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG1pbGxpc2Vjb25kcyIpOworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlByb2Nlc3NlZCAiICsgZWxlbWVudHMgKyAiIGVsZW1lbnRzIik7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiUHJvY2Vzc2VkICIgKyBhdHRyaWJ1dGVzICsgIiBhdHRyaWJ1dGVzIik7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiUHJvY2Vzc2VkICIgKyBjaGFyYWN0ZXJzICsgIiBjaGFyYWN0ZXJzIik7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiUHJvY2Vzc2VkICIgKyB3aGl0ZXNwYWNlICsgIiB3aGl0ZXNwYWNlcyIpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0FYIEVycm9yIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgYSBwYXJzZXIgZXJyb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZSBUaGUgcGFyc2VyIGV4Y2VwdGlvbiBiZWluZyByZXBvcnRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gaWYgYSBwYXJzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24geworCisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiW0Vycm9yXSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uU3RyaW5nKGUpICsgIjogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGEgZmF0YWwgZXJyb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZSBUaGUgcGFyc2VyIGV4Y2VwdGlvbiBiZWluZyByZXBvcnRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gaWYgYSBwYXJzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJbRmF0YWxdICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb25TdHJpbmcoZSkgKyAiOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgYSBwYXJzZXIgd2FybmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlIFRoZSBwYXJzZXIgZXhjZXB0aW9uIGJlaW5nIHJlcG9ydGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBpZiBhIHBhcnNpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIltXYXJuaW5nXSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uU3RyaW5nKGUpICsgIjogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9jYXRpb24gYXQgd2hpY2ggdGhpcyBleGNlcHRpb24gb2NjdXJyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZSBUaGUgU0FYUGFyc2VFeGNlcHRpb24gd2UgYXJlIHJlcG9ydGluZyBvbgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldExvY2F0aW9uU3RyaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyBzeXN0ZW1JZCA9IGUuZ2V0U3lzdGVtSWQoKTsKKyAgICAgICAgaWYgKHN5c3RlbUlkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IHN5c3RlbUlkLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpCisgICAgICAgICAgICAgICAgc3lzdGVtSWQgPSBzeXN0ZW1JZC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzeXN0ZW1JZCk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCc6Jyk7CisgICAgICAgIHNiLmFwcGVuZChlLmdldExpbmVOdW1iZXIoKSk7CisgICAgICAgIHNiLmFwcGVuZCgnOicpOworICAgICAgICBzYi5hcHBlbmQoZS5nZXRDb2x1bW5OdW1iZXIoKSk7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTQVggRXZlbnQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDaGFyYWN0ZXIgZGF0YSBldmVudCBoYW5kbGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNoIENoYXJhY3RlciBhcnJheSBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzCisgICAgICogQHBhcmFtIHN0YXJ0IFN0YXJ0aW5nIHBvc2l0aW9uIGluIHRoZSBhcnJheQorICAgICAqIEBwYXJhbSBsZW5ndGggTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcHJvY2VzcworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gaWYgYSBwYXJzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworCisgICAgICAgIGNoYXJhY3RlcnMgKz0gbGVuZ3RoOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJZ25vcmFibGUgd2hpdGVzcGFjZSBldmVudCBoYW5kbGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNoIENoYXJhY3RlciBhcnJheSBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzCisgICAgICogQHBhcmFtIHN0YXJ0IFN0YXJ0aW5nIHBvc2l0aW9uIGluIHRoZSBhcnJheQorICAgICAqIEBwYXJhbSBsZW5ndGggTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcHJvY2VzcworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gaWYgYSBwYXJzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworCisgICAgICAgIHdoaXRlc3BhY2UgKz0gbGVuZ3RoOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdGFydCBvZiBlbGVtZW50IGV2ZW50IGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZWxlbWVudCB0eXBlIG5hbWUKKyAgICAgKiBAcGFyYW0gYXR0cnMgVGhlIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQgYXR0cmlidXRlcworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gaWYgYSBwYXJzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlTGlzdCBhdHRycykgeworCisgICAgICAgIGVsZW1lbnRzKys7CisgICAgICAgIGlmIChhdHRycyAhPSBudWxsKQorICAgICAgICAgICAgYXR0cmlidXRlcyArPSBhdHRycy5nZXRMZW5ndGgoKTsKKworICAgIH0KKworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9zaGFyZWQvU2hhcmVkU2Vzc2lvbkJlYW4uamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9zaGFyZWQvU2hhcmVkU2Vzc2lvbkJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjIxODc5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL3NoYXJlZC9TaGFyZWRTZXNzaW9uQmVhbi5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyLnNoYXJlZDsKKworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5zcWwuRGF0ZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0V2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25FdmVudDsKKworCisvKioKKyAqIFNpbXBsZSBKYXZhQmVhbiB0byB1c2UgZm9yIHNlc3Npb24gYXR0cmlidXRlIHRlc3RzLiAgSXQgaXMgU2VyaWFsaXphYmxlCisgKiBzbyB0aGF0IGluc3RhbmNlcyBjYW4gYmUgc2F2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyBzZXJ2ZXIgcmVzdGFydHMuCisgKiA8cD4KKyAqIFRoaXMgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gPGNvZGU+U2Vzc2lvbkJlYW48L2NvZGU+LCBidXQgc3RvcmVkCisgKiBpbiBhIGRpZmZlcmVudCBwYWNrYWdlIHNvIHRoYXQgaXQgZ2V0cyBkZXBsb3llZCBpbnRvIGEgSkFSIGZpbGUgdW5kZXIKKyAqIDxjb2RlPiRDQVRBTElOQV9IT01FL2xpYjwvY29kZT4uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTaGFyZWRTZXNzaW9uQmVhbiBpbXBsZW1lbnRzCisgICAgSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXIsIEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyLCBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogQSBkYXRlIHByb3BlcnR5IGZvciB1c2Ugd2l0aCBwcm9wZXJ0eSBlZGl0b3IgdGVzdHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIERhdGUgZGF0ZVByb3BlcnR5ID0KKyAgICAgICAgbmV3IERhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCisgICAgcHVibGljIERhdGUgZ2V0RGF0ZVByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGF0ZVByb3BlcnR5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlUHJvcGVydHkoRGF0ZSBkYXRlUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5kYXRlUHJvcGVydHkgPSBkYXRlUHJvcGVydHk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50cyB0aGF0IGhhdmUgaGFwcGVuZWQgb24gdGhpcyBiZWFuIGluc3RhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbGlmZWN5Y2xlID0gIiI7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExpZmVjeWNsZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxpZmVjeWNsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlmZWN5Y2xlKFN0cmluZyBsaWZlY3ljbGUpIHsKKyAgICAgICAgdGhpcy5saWZlY3ljbGUgPSBsaWZlY3ljbGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIHN0cmluZyBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN0cmluZ1Byb3BlcnR5ID0gIkRlZmF1bHQgU3RyaW5nIFByb3BlcnR5IFZhbHVlIjsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zdHJpbmdQcm9wZXJ0eSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIHN0cmluZ1Byb3BlcnR5KSB7CisgICAgICAgIHRoaXMuc3RyaW5nUHJvcGVydHkgPSBzdHJpbmdQcm9wZXJ0eTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBiZWFuLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiU2hhcmVkU2Vzc2lvbkJlYW5bbGlmZWN5Y2xlPSIpOworICAgICAgICBzYi5hcHBlbmQodGhpcy5saWZlY3ljbGUpOworICAgICAgICBzYi5hcHBlbmQoIixkYXRlUHJvcGVydHk9Iik7CisgICAgICAgIHNiLmFwcGVuZChkYXRlUHJvcGVydHkpOworICAgICAgICBzYi5hcHBlbmQoIixzdHJpbmdQcm9wZXJ0eT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMuc3RyaW5nUHJvcGVydHkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgdGhpcyBzZXNzaW9uIHdhcyBhY3RpdmF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uRGlkQWN0aXZhdGUoSHR0cFNlc3Npb25FdmVudCBldmVudCkgeworCisgICAgICAgIGxpZmVjeWNsZSArPSAiL3NkYSI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgdGhpcyBzZXNzaW9uIHdpbGwgYmUgcGFzc2l2YXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlc3Npb25XaWxsUGFzc2l2YXRlKEh0dHBTZXNzaW9uRXZlbnQgZXZlbnQpIHsKKworICAgICAgICBsaWZlY3ljbGUgKz0gIi9zd3AiOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gdGhhdCB0aGlzIGF0dHJpYnV0ZSBoYXMgYmVlbiBib3VuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbHVlQm91bmQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpIHsKKworICAgICAgICBsaWZlY3ljbGUgKz0gIi92YiI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgdGhpcyBhdHRyaWJ1dGUgaGFzIGJlZW4gdW5ib3VuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbHVlVW5ib3VuZChIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCkgeworCisgICAgICAgIGxpZmVjeWNsZSArPSAiL3Z1IjsKKworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci91bnBzaGFyZWQvVW5wU2hhcmVkU2Vzc2lvbkJlYW4uamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci91bnBzaGFyZWQvVW5wU2hhcmVkU2Vzc2lvbkJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDAzZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL3VucHNoYXJlZC9VbnBTaGFyZWRTZXNzaW9uQmVhbi5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyLnVucHNoYXJlZDsKKworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5zcWwuRGF0ZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0V2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25FdmVudDsKKworCisvKioKKyAqIFNpbXBsZSBKYXZhQmVhbiB0byB1c2UgZm9yIHNlc3Npb24gYXR0cmlidXRlIHRlc3RzLiAgSXQgaXMgU2VyaWFsaXphYmxlCisgKiBzbyB0aGF0IGluc3RhbmNlcyBjYW4gYmUgc2F2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyBzZXJ2ZXIgcmVzdGFydHMuCisgKiA8cD4KKyAqIFRoaXMgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gPGNvZGU+U2Vzc2lvbkJlYW48L2NvZGU+LCBidXQgc3RvcmVkCisgKiBpbiBhIGRpZmZlcmVudCBwYWNrYWdlIHNvIHRoYXQgaXQgZ2V0cyBkZXBsb3llZCB1bnBhY2tlZCB1bmRlcgorICogPGNvZGU+JENBVEFMSU5BX0hPTUUvY2xhc3NlczwvY29kZT4uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBVbnBTaGFyZWRTZXNzaW9uQmVhbiBpbXBsZW1lbnRzCisgICAgSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXIsIEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyLCBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogQSBkYXRlIHByb3BlcnR5IGZvciB1c2Ugd2l0aCBwcm9wZXJ0eSBlZGl0b3IgdGVzdHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIERhdGUgZGF0ZVByb3BlcnR5ID0KKyAgICAgICAgbmV3IERhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCisgICAgcHVibGljIERhdGUgZ2V0RGF0ZVByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGF0ZVByb3BlcnR5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlUHJvcGVydHkoRGF0ZSBkYXRlUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5kYXRlUHJvcGVydHkgPSBkYXRlUHJvcGVydHk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50cyB0aGF0IGhhdmUgaGFwcGVuZWQgb24gdGhpcyBiZWFuIGluc3RhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbGlmZWN5Y2xlID0gIiI7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExpZmVjeWNsZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxpZmVjeWNsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlmZWN5Y2xlKFN0cmluZyBsaWZlY3ljbGUpIHsKKyAgICAgICAgdGhpcy5saWZlY3ljbGUgPSBsaWZlY3ljbGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIHN0cmluZyBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN0cmluZ1Byb3BlcnR5ID0gIkRlZmF1bHQgU3RyaW5nIFByb3BlcnR5IFZhbHVlIjsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zdHJpbmdQcm9wZXJ0eSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIHN0cmluZ1Byb3BlcnR5KSB7CisgICAgICAgIHRoaXMuc3RyaW5nUHJvcGVydHkgPSBzdHJpbmdQcm9wZXJ0eTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBiZWFuLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiU2hhcmVkU2Vzc2lvbkJlYW5bbGlmZWN5Y2xlPSIpOworICAgICAgICBzYi5hcHBlbmQodGhpcy5saWZlY3ljbGUpOworICAgICAgICBzYi5hcHBlbmQoIixkYXRlUHJvcGVydHk9Iik7CisgICAgICAgIHNiLmFwcGVuZChkYXRlUHJvcGVydHkpOworICAgICAgICBzYi5hcHBlbmQoIixzdHJpbmdQcm9wZXJ0eT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMuc3RyaW5nUHJvcGVydHkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgdGhpcyBzZXNzaW9uIHdhcyBhY3RpdmF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uRGlkQWN0aXZhdGUoSHR0cFNlc3Npb25FdmVudCBldmVudCkgeworCisgICAgICAgIGxpZmVjeWNsZSArPSAiL3NkYSI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgdGhpcyBzZXNzaW9uIHdpbGwgYmUgcGFzc2l2YXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlc3Npb25XaWxsUGFzc2l2YXRlKEh0dHBTZXNzaW9uRXZlbnQgZXZlbnQpIHsKKworICAgICAgICBsaWZlY3ljbGUgKz0gIi9zd3AiOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gdGhhdCB0aGlzIGF0dHJpYnV0ZSBoYXMgYmVlbiBib3VuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbHVlQm91bmQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpIHsKKworICAgICAgICBsaWZlY3ljbGUgKz0gIi92YiI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgdGhpcyBhdHRyaWJ1dGUgaGFzIGJlZW4gdW5ib3VuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbHVlVW5ib3VuZChIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCkgeworCisgICAgICAgIGxpZmVjeWNsZSArPSAiL3Z1IjsKKworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci91bnNoYXJlZC9VbnNoYXJlZFNlc3Npb25CZWFuLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvdW5zaGFyZWQvVW5zaGFyZWRTZXNzaW9uQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzg1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvdW5zaGFyZWQvVW5zaGFyZWRTZXNzaW9uQmVhbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXIudW5zaGFyZWQ7CisKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLlNlc3Npb25CZWFuOworCisKKy8qKgorICogU2ltcGxlIEphdmFCZWFuIHRvIHVzZSBmb3Igc2Vzc2lvbiBhdHRyaWJ1dGUgdGVzdHMuICBJdCBpcyBTZXJpYWxpemFibGUKKyAqIHNvIHRoYXQgaW5zdGFuY2VzIGNhbiBiZSBzYXZlZCBhbmQgcmVzdG9yZWQgYWNyb3NzIHNlcnZlciByZXN0YXJ0cy4KKyAqIDxwPgorICogVGhpcyBiZWFuIGlzIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvCisgKiA8Y29kZT5vcmcuYXBhY2hlLnRlc3Rlci5TZXNzaW9uQmVhbjwvY29kZT4sIGJ1dCB3aWxsIGJlIGRlcGxveWVkIHVuZGVyCisgKiA8Y29kZT4vV0VCLUlORi9jbGFzc2VzPC9jb2RlPiBpbnN0ZWFkIG9mIGluc2lkZQorICogPGNvZGU+L1dFQi1JTkYvbGliL3Rlc3Rlci5qYXI8L2NvZGU+LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVW5zaGFyZWRTZXNzaW9uQmVhbiBleHRlbmRzIFNlc3Npb25CZWFuIGltcGxlbWVudHMKKyAgICBIdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lciwgSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIsIFNlcmlhbGl6YWJsZSB7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGJlYW4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJVbnNoYXJlZFNlc3Npb25CZWFuW2xpZmVjeWNsZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMubGlmZWN5Y2xlKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsc3RyaW5nUHJvcGVydHk9Iik7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLnN0cmluZ1Byb3BlcnR5KTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9BdXRoZW50aWNhdGlvbjA0LmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0F1dGhlbnRpY2F0aW9uMDQuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMWRkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9BdXRoZW50aWNhdGlvbjA0LmpzcApAQCAtMCwwICsxLDI2IEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT48JQorICBTdHJpbmdCdWZmZXIgcmVzdWx0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgU3RyaW5nIHJlbW90ZVVzZXIgPSByZXF1ZXN0LmdldFJlbW90ZVVzZXIoKTsKKyAgaWYgKHJlbW90ZVVzZXIgPT0gbnVsbCkgeworICAgIHJlc3VsdHMuYXBwZW5kKCIgTm90IEF1dGhlbnRpY2F0ZWQvIik7CisgIH0gZWxzZSBpZiAoISJ0b21jYXQiLmVxdWFscyhyZW1vdGVVc2VyKSkgeworICAgIHJlc3VsdHMuYXBwZW5kKCIgQXV0aGVudGljYXRlZCBhcyAnIik7CisgICAgcmVzdWx0cy5hcHBlbmQocmVtb3RlVXNlcik7CisgICAgcmVzdWx0cy5hcHBlbmQoIicvIik7CisgIH0KKyAgaWYgKCFyZXF1ZXN0LmlzVXNlckluUm9sZSgidG9tY2F0IikpIHsKKyAgICByZXN1bHRzLmFwcGVuZCgiIE5vdCBpbiByb2xlICd0b21jYXQnLyIpOworICB9CisgIGlmICghcmVxdWVzdC5pc1VzZXJJblJvbGUoImFsaWFzIikpIHsKKyAgICByZXN1bHRzLmFwcGVuZCgiIE5vdCBpbiByb2xlICdhbGlhcycvIik7CisgIH0KKyAgaWYgKHJlcXVlc3QuaXNVc2VySW5Sb2xlKCJ1bmtub3duIikpIHsKKyAgICByZXN1bHRzLmFwcGVuZCgiIEluIHJvbGUgJ3Vua25vd24nLyIpOworICB9CisgIGlmIChyZXN1bHRzLmxlbmd0aCgpIDwgMSkgeworICAgIG91dC5wcmludGxuKCJBdXRoZW50aWNhdGlvbjA0IFBBU1NFRCIpOworICB9IGVsc2UgeworICAgIG91dC5wcmludCgiQXV0aGVudGljYXRpb24wNCBGQUlMRUQgLSIpOworICAgIG91dC5wcmludGxuKHJlc3VsdHMudG9TdHJpbmcoKSk7CisgIH0KKyU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9FbmNvZGluZzAxLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0VuY29kaW5nMDEuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NjkxNmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9FbmNvZGluZzAxLmpzcApAQCAtMCwwICsxLDUgQEAKKworPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVNKSVMiICU+CisKKzxoMj5UZXN0IENoYXJhY3RlcjwvaDI+Cis8aDI+PCU9Ilx1OWI1YSIlPiBVbmljb2RlID0gOWI1YTwvaHI+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9FbmNvZGluZzAyLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0VuY29kaW5nMDIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMmMzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9FbmNvZGluZzAyLmpzcApAQCAtMCwwICsxLDkgQEAKKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+RW5jb2RpbmcwMi5qc3A8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorVGhpcyBpcyBsZWdhbCBpbiB0aGUgc3BlYzo8YnI+Cis8JT0gIkpvZSBzYWlkICVcPiBmb28iICU+LgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRW5jb2RpbmcwMy5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9FbmNvZGluZzAzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjRhYzE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRW5jb2RpbmcwMy5qc3AKQEAgLTAsMCArMSw5IEBACis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPkVuY29kaW5nMDMuanNwPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IndoaXRlIj4KK1RoaXMgaXMgbm90IHJlY29nbml6ZWQgYXMgYSBkZWxpbWl0ZXIgZWl0aGVyOjxicj4KKzwlPSAiSm9lIHNhaWQgJVxcPiBiYXIiICU+LgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRXJyb3JQYWdlMDYuaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0Vycm9yUGFnZTA2Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFkNjIzMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0Vycm9yUGFnZTA2Lmh0bWwKQEAgLTAsMCArMSBAQAorRXJyb3JQYWdlMDYgUEFTU0VEIC0gSFRNTApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRXJyb3JQYWdlMDYuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRXJyb3JQYWdlMDYuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzFhODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9FcnJvclBhZ2UwNi5qc3AKQEAgLTAsMCArMSwxMDYgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPjwlCisKKyAgICAgICAgLy8gQWNjdW11bGF0ZSBhbGwgdGhlIHJlYXNvbnMgdGhpcyByZXF1ZXN0IG1pZ2h0IGZhaWwKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOworCisgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3IuZXhjZXB0aW9uIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBleGNlcHRpb24gaXMgbWlzc2luZy8iKTsKKyAgICAgICAgfSBlbHNlIGlmICghKHZhbHVlIGluc3RhbmNlb2YgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbikpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbiBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3IuZXhjZXB0aW9uX3R5cGUiKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBleGNlcHRpb25fdHlwZSBpcyBtaXNzaW5nLyIpOworICAgICAgICBlbHNlIGlmICghKHZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBleGNlcHRpb25fdHlwZSBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gKENsYXNzKSB2YWx1ZTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY2xhenouZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKCEiamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgZXhjZXB0aW9uX3R5cGUgaXMgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG5hbWUpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5tZXNzYWdlIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgbWVzc2FnZSBpcyBtaXNzaW5nLyIpOworICAgICAgICBlbHNlIGlmICghKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgbWVzc2FnZSBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfSBlbHNlIGlmICghIkVycm9yUGFnZTA1IFRocmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIuZXF1YWxzKHZhbHVlKSAmJgorICAgICAgICAgICAgICAgICAgICEiRXJyb3JQYWdlMDggVGhyZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIi5lcXVhbHModmFsdWUpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBtZXNzYWdlIGlzIG5vdCBjb3JyZWN0Iik7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLnJlcXVlc3RfdXJpIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgcmVxdWVzdF91cmkgaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHJlcXVlc3RfdXJpIGNsYXNzIGlzICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RfdXJpID0gKFN0cmluZykgdmFsdWU7CisgICAgICAgICAgICBTdHJpbmcgdGVzdDEgPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAiL0Vycm9yUGFnZTA1IjsKKyAgICAgICAgICAgIFN0cmluZyB0ZXN0MiA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvV3JhcHBlZEVycm9yUGFnZTA1IjsKKyAgICAgICAgICAgIFN0cmluZyB0ZXN0MyA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvRXJyb3JQYWdlMDgiOworICAgICAgICAgICAgU3RyaW5nIHRlc3Q0ID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi9XcmFwcGVkRXJyb3JQYWdlMDgiOworICAgICAgICAgICAgaWYgKCFyZXF1ZXN0X3VyaS5lcXVhbHModGVzdDEpICYmICFyZXF1ZXN0X3VyaS5lcXVhbHModGVzdDIpICYmCisgICAgICAgICAgICAgICAgIXJlcXVlc3RfdXJpLmVxdWFscyh0ZXN0MykgJiYgIXJlcXVlc3RfdXJpLmVxdWFscyh0ZXN0NCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiByZXF1ZXN0X3VyaSBpcyAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocmVxdWVzdF91cmkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5zZXJ2bGV0X25hbWUiKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBzZXJ2bGV0X25hbWUgaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNlcnZsZXRfbmFtZSBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBzZXJ2bGV0X25hbWUgPSAoU3RyaW5nKSB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghIkVycm9yUGFnZTA1Ii5lcXVhbHMoc2VydmxldF9uYW1lKSAmJgorICAgICAgICAgICAgICAgICEiRXJyb3JQYWdlMDgiLmVxdWFscyhzZXJ2bGV0X25hbWUpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgc2VydmxldF9uYW1lIGlzICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzZXJ2bGV0X25hbWUpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHVsdGltYXRlIHN1Y2Nlc3Mgb3IgZmFpbHVyZQorICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgb3V0LnByaW50bG4oIkVycm9yUGFnZTA2IFBBU1NFRCAtIEpTUCIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdXQucHJpbnRsbigiRXJyb3JQYWdlMDYgRkFJTEVEIC0iICsgc2IudG9TdHJpbmcoKSk7CisKKyU+Cis8JQorICBFeGNlcHRpb24gZSA9IChFeGNlcHRpb24pCisgICByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5leGNlcHRpb24iKTsKKyAgb3V0LnByaW50bG4oIkVYQ0VQVElPTjogICIgKyBlKTsKKyAgQ2xhc3MgZXQgPSAoQ2xhc3MpCisgICByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5leGNlcHRpb25fdHlwZSIpOworICBvdXQucHJpbnRsbigiRVhDRVBUSU9OX1RZUEU6ICAiICsgZXQuZ2V0TmFtZSgpKTsKKyAgU3RyaW5nIG0gPSAoU3RyaW5nKQorICAgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3IubWVzc2FnZSIpOworICBvdXQucHJpbnRsbigiTUVTU0FHRTogICIgKyBtKTsKKyAgU3RyaW5nIHJ1ID0gKFN0cmluZykKKyAgIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLnJlcXVlc3RfdXJpIik7CisgIG91dC5wcmludGxuKCJSRVFVRVNUX1VSSTogICIgKyBydSk7CisgIFN0cmluZyBzbiA9IChTdHJpbmcpCisgICByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5zZXJ2bGV0X25hbWUiKTsKKyAgb3V0LnByaW50bG4oIlNFUlZMRVRfTkFNRTogICIgKyBzbik7CislPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRXJyb3JQYWdlMDguanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRXJyb3JQYWdlMDguanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZDQyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9FcnJvclBhZ2UwOC5qc3AKQEAgLTAsMCArMSwxOSBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+PCUKKworICAgICAgICAvLyBXcml0ZSBhIEZBSUxFRCBtZXNzYWdlIHRoYXQgc2hvdWxkIGdldCByZXBsYWNlZCBieSB0aGUgZXJyb3IgdGV4dAorICAgICAgICBvdXQucHJpbnRsbigiRXJyb3JQYWdlMDggRkFJTEVEIC0gT3JpZ2luYWwgcmVzcG9uc2UgcmV0dXJuZWQiKTsKKworICAgICAgICAvLyBUaHJvdyB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbgorICAgICAgICBTdHJpbmcgdHlwZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ0eXBlIik7CisgICAgICAgIGlmICgiQXJpdGhtZXRpYyIuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJpdGhtZXRpY0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiRXJyb3JQYWdlMDggVGhyZXcgQXJpdGhtZXRpY0V4Y2VwdGlvbiIpOworICAgICAgICB9IGVsc2UgaWYgKCJBcnJheSIuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJFcnJvclBhZ2UwOCBUaHJldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKyAgICAgICAgfSBlbHNlIGlmICgiTnVtYmVyIi5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkVycm9yUGFnZTA4IFRocmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbiIpOworICAgICAgICB9CisKKyU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9FcnJvclBhZ2UwOS5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9FcnJvclBhZ2UwOS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjOGU1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0Vycm9yUGFnZTA5LmpzcApAQCAtMCwwICsxLDEzIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgZXJyb3JQYWdlPSIvRXJyb3JQYWdlMTAuanNwIiAlPjwlCisKKyAgICAgICAgLy8gV3JpdGUgYSBGQUlMRUQgbWVzc2FnZSB0aGF0IHNob3VsZCBnZXQgcmVwbGFjZWQgYnkgdGhlIGVycm9yIHRleHQKKyAgICAgICAgb3V0LnByaW50bG4oIkVycm9yUGFnZTA5IEZBSUxFRCAtIE9yaWdpbmFsIHJlc3BvbnNlIHJldHVybmVkIik7CisKKyAgICAgICAgLy8gVGhyb3cgdGhlIHNwZWNpZmllZCBleGNlcHRpb24KKyAgICAgICAgaW50IGkgPSAxOworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkVycm9yUGFnZTA5IFRocmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9CisKKyU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9FcnJvclBhZ2UxMC5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9FcnJvclBhZ2UxMC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2MmJlMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0Vycm9yUGFnZTEwLmpzcApAQCAtMCwwICsxLDMxIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgaXNFcnJvclBhZ2U9InRydWUiICU+PCUKKworICAgICAgICAvLyBBY2N1bXVsYXRlIGFsbCB0aGUgcmVhc29ucyB0aGlzIHJlcXVlc3QgbWlnaHQgZmFpbAorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBleGNlcHRpb24gaXMgbWlzc2luZy8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24pKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgZXhjZXB0aW9uIGNsYXNzIGlzICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChleGNlcHRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEiRXJyb3JQYWdlMDkgVGhyZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIi5lcXVhbHMoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBleGNlcHRpb24gbWVzc2FnZSBpcyAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgdWx0aW1hdGUgc3VjY2VzcyBvciBmYWlsdXJlCisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICBvdXQucHJpbnRsbigiRXJyb3JQYWdlMTAgUEFTU0VEIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5wcmludGxuKCJFcnJvclBhZ2UxMCBGQUlMRUQgLSIgKyBzYi50b1N0cmluZygpKTsKKworJT4KKzwlCisgIG91dC5wcmludGxuKCJFWENFUFRJT046ICAiICsgZXhjZXB0aW9uKTsKKyU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9GaWx0ZXJSZXNwb25zZTAyLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZpbHRlclJlc3BvbnNlMDIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjdkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9GaWx0ZXJSZXNwb25zZTAyLmpzcApAQCAtMCwwICsxLDEwIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT5GaWx0ZXJSZXNwb25zZTAyIFBBU1NFRAorPCUKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gb3JnLmFwYWNoZS50ZXN0ZXIuU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBvdXQucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBvcmcuYXBhY2hlLnRlc3Rlci5TdGF0aWNMb2dnZXIucmVzZXQoKTsKKyU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9GaWx0ZXJSZXNwb25zZTAzLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZpbHRlclJlc3BvbnNlMDMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNWQyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9GaWx0ZXJSZXNwb25zZTAzLnR4dApAQCAtMCwwICsxIEBACitGaWx0ZXJSZXNwb25zZTAzIFBBU1NFRApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDAwYi5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDBiLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQyMDUzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDAwYi5qc3AKQEAgLTAsMCArMSw2IEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT5Gb3J3YXJkMDBiIFBBU1NFRAorcmVxdWVzdFVSST08JT0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkgJT4KK2NvbnRleHRQYXRoPTwlPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgJT4KK3NlcnZsZXRQYXRoPTwlPSByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkgJT4KK3BhdGhJbmZvPTwlPSByZXF1ZXN0LmdldFBhdGhJbmZvKCkgJT4KK3F1ZXJ5U3RyaW5nPTwlPSByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCkgJT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwMGMuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDAwYy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzNTA5YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwMGMuanNwCkBAIC0wLDAgKzEsNiBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+Rm9yd2FyZDAwYyBQQVNTRUQKK3JlcXVlc3RVUkk9PCU9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpICU+Citjb250ZXh0UGF0aD08JT0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICU+CitzZXJ2bGV0UGF0aD08JT0gcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpICU+CitwYXRoSW5mbz08JT0gcmVxdWVzdC5nZXRQYXRoSW5mbygpICU+CitxdWVyeVN0cmluZz08JT0gcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpICU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDBlLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwMGUuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYmE4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDBlLmpzcApAQCAtMCwwICsxLDYgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPkZvcndhcmQwMGUgUEFTU0VECityZXF1ZXN0VVJJPTwlPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSAlPgorY29udGV4dFBhdGg9PCU9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSAlPgorc2VydmxldFBhdGg9PCU9IHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSAlPgorcGF0aEluZm89PCU9IHJlcXVlc3QuZ2V0UGF0aEluZm8oKSAlPgorcXVlcnlTdHJpbmc9PCU9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSAlPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDAxLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkMzJjYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwMS50eHQKQEAgLTAsMCArMSBAQAorRm9yd2FyZDAxIFBBU1NFRApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDAzYi5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDNiLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTJjOTA1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDAzYi5qc3AKQEAgLTAsMCArMSwzMCBAQAorPCUKKyAgU3RyaW5nIHNwZWNpYWxzW10gPQorICAgIHsgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5yZXF1ZXN0X3VyaSIsCisgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLmNvbnRleHRfcGF0aCIsCisgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLnNlcnZsZXRfcGF0aCIsCisgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLnBhdGhfaW5mbyIsCisgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLnF1ZXJ5X3N0cmluZyIgfTsKKworICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgIGlmIChyZXF1ZXN0LmdldEF0dHJpYnV0ZSgiRm9yd2FyZDAzIikgPT0gbnVsbCkKKyAgICBzYi5hcHBlbmQoIiBDYW5ub3QgcmV0cmlldmUgZm9yd2FyZGVkIGF0dHJpYnV0ZS8iKTsKKyAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIkZvcndhcmQwM2IiLCAiVGhpcyBpcyBvdXIgdmVyeSBvd24gYXR0cmlidXRlIik7CisgIGlmIChyZXF1ZXN0LmdldEF0dHJpYnV0ZSgiRm9yd2FyZDAzYiIpID09IG51bGwpCisgICAgc2IuYXBwZW5kKCIgQ2Fubm90IHJldHJpZXZlIG91ciBvd24gYXR0cmlidXRlLyIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BlY2lhbHMubGVuZ3RoOyBpKyspIHsKKyAgICBpZiAocmVxdWVzdC5nZXRBdHRyaWJ1dGUoc3BlY2lhbHNbaV0pICE9IG51bGwpIHsKKyAgICAgIHNiLmFwcGVuZCgiIEV4cG9zZWQgYXR0cmlidXRlICIpOworICAgICAgc2IuYXBwZW5kKHNwZWNpYWxzW2ldKTsKKyAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgIH0KKyAgfQorCisgIGlmIChzYi5sZW5ndGgoKSA8IDEpIHsKKyAgICBvdXQucHJpbnRsbigiRm9yd2FyZDAzIFBBU1NFRCIpOworICB9IGVsc2UgeworICAgIG91dC5wcmludCgiRm9yd2FyZDAzIEZBSUxFRCAtICIpOworICAgIG91dC5wcmludGxuKHNiLnRvU3RyaW5nKCkpOworICB9CislPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA0LmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhYWY1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNC5qc3AKQEAgLTAsMCArMSBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+PGpzcDpmb3J3YXJkIHBhZ2U9Ii9Gb3J3YXJkMDRhLmpzcCIvPkZvcndhcmQwNC5qc3AgRkFJTEVEIC0gQ29udGVudCBzaG91bGQgbm90IGJlIHZpc2libGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNGEuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA0YS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2NmEwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNGEuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPjxqc3A6Zm9yd2FyZCBwYWdlPSIvRm9yd2FyZDA0Yi5qc3AiLz5Gb3J3YXJkMDRhLmpzcCBGQUlMRUQgLSBDb250ZW50IHNob3VsZCBub3QgYmUgdmlzaWJsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA0Yi5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDRiLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmVhMWJmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA0Yi5qc3AKQEAgLTAsMCArMSBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+Rm9yd2FyZDA0Yi5qc3AgUEFTU0VECmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDUuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA1LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjNlMTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA1LmpzcApAQCAtMCwwICsxIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT48anNwOmZvcndhcmQgcGFnZT0iL0ZvcndhcmQwNWEiLz5Gb3J3YXJkMDUuanNwIEZBSUxFRCAtIENvbnRlbnQgc2hvdWxkIG5vdCBiZSB2aXNpYmxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDVhLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNWEuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZmNjNjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDVhLmpzcApAQCAtMCwwICsxIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT48anNwOmZvcndhcmQgcGFnZT0iL0ZvcndhcmQwNWIiLz5Gb3J3YXJkMDVhLmpzcCBGQUlMRUQgLSBDb250ZW50IHNob3VsZCBub3QgYmUgdmlzaWJsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA1Yi5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDViLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjk5YzIzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA1Yi5qc3AKQEAgLTAsMCArMSBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+Rm9yd2FyZDA1Yi5qc3AgUEFTU0VECmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDYuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA2LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2FmY2M5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA2LmpzcApAQCAtMCwwICsxIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT48anNwOmZvcndhcmQgcGFnZT0iL3NlcnZsZXQvRm9yd2FyZDA2YSIvPkZvcndhcmQwNi5qc3AgRkFJTEVEIC0gQ29udGVudCBzaG91bGQgbm90IGJlIHZpc2libGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNmEuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA2YS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcwMDg4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNmEuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPjxqc3A6Zm9yd2FyZCBwYWdlPSIvc2VydmxldC9Gb3J3YXJkMDZiIi8+Rm9yd2FyZDA2YS5qc3AgRkFJTEVEIC0gQ29udGVudCBzaG91bGQgbm90IGJlIHZpc2libGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNmIuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA2Yi5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxZDdiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNmIuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPkZvcndhcmQwNmIuanNwIFBBU1NFRApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTAwYi5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDBiLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDVlNjU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTAwYi5qc3AKQEAgLTAsMCArMSw2IEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgc2Vzc2lvbj0iZmFsc2UiICU+SW5jbHVkZTAwYiBQQVNTRUQKK3JlcXVlc3RVUkk9PCU9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpICU+Citjb250ZXh0UGF0aD08JT0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICU+CitzZXJ2bGV0UGF0aD08JT0gcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpICU+CitwYXRoSW5mbz08JT0gcmVxdWVzdC5nZXRQYXRoSW5mbygpICU+CitxdWVyeVN0cmluZz08JT0gcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpICU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDBjLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwMGMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNzZhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDBjLmpzcApAQCAtMCwwICsxLDYgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiBzZXNzaW9uPSJmYWxzZSIlPkluY2x1ZGUwMGMgUEFTU0VECityZXF1ZXN0VVJJPTwlPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSAlPgorY29udGV4dFBhdGg9PCU9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSAlPgorc2VydmxldFBhdGg9PCU9IHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSAlPgorcGF0aEluZm89PCU9IHJlcXVlc3QuZ2V0UGF0aEluZm8oKSAlPgorcXVlcnlTdHJpbmc9PCU9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSAlPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTAwZS5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDBlLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmU0MGMxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTAwZS5qc3AKQEAgLTAsMCArMSw2IEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgc2Vzc2lvbj0iZmFsc2UiICU+SW5jbHVkZTAwZSBQQVNTRUQKK3JlcXVlc3RVUkk9PCU9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpICU+Citjb250ZXh0UGF0aD08JT0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICU+CitzZXJ2bGV0UGF0aD08JT0gcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpICU+CitwYXRoSW5mbz08JT0gcmVxdWVzdC5nZXRQYXRoSW5mbygpICU+CitxdWVyeVN0cmluZz08JT0gcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpICU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDEudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTAxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzMyN2JiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTAxLnR4dApAQCAtMCwwICsxIEBACitJbmNsdWRlMDEgUEFTU0VECmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDNiLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwM2IuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYWRjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDNiLmpzcApAQCAtMCwwICsxIEBACis8JSByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiSW5jbHVkZTAzYi5qc3AiLCAiVGhpcyBpcyBhIG5ldyBhdHRyaWJ1dGUiKTsgJT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwM2MuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTAzYy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkMzNkMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwM2MuanNwCkBAIC0wLDAgKzEsMzAgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPjwlCisgIC8vIER1cGxpY2F0ZSBsb2dpYyBmcm9tICJJbmNsdWRlMDMuamF2YSIKKyAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICBTdHJpbmcgcGF0aCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXRoIik7CisgIGlmIChwYXRoID09IG51bGwpCisgICAgcGF0aCA9ICIvSW5jbHVkZTAzYSI7CisgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKHBhdGgpOworICBpZiAocmQgPT0gbnVsbCkgeworICAgIHNiLmFwcGVuZCgiIE5vIFJlcXVlc3REaXNwYXRjaGVyIHJldHVybmVkLyIpOworICB9IGVsc2UgeworICAgIHJkLmluY2x1ZGUocmVxdWVzdCwgcmVzcG9uc2UpOworICB9CisgIHJlc3BvbnNlLnJlc2V0QnVmZmVyKCk7CisgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisgIHRyeSB7CisgICAgdmFsdWUgPSAoU3RyaW5nKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShwYXRoLnN1YnN0cmluZygxKSk7CisgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICBzYi5hcHBlbmQoIiBSZXR1cm5lZCBhdHRyaWJ1dGUgbm90IG9mIHR5cGUgU3RyaW5nLyIpOworICB9CisgIGlmICgoc2IubGVuZ3RoKCkgPCAxKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKKyAgICAgIHNiLmFwcGVuZCgiIE5vIGluY2x1ZGVlLWNyZWF0ZWQgYXR0cmlidXRlIHdhcyByZXR1cm5lZC8iKTsKKyAgfQorICBpZiAoc2IubGVuZ3RoKCkgPCAxKQorICAgIG91dC5wcmludGxuKCJJbmNsdWRlMDNjLmpzcCBQQVNTRUQiKTsKKyAgZWxzZSB7CisgICAgb3V0LnByaW50KCJJbmNsdWRlMDNjLmpzcCBGQUlMRUQgLSIpOworICAgIG91dC5wcmludGxuKHNiLnRvU3RyaW5nKCkpOworICB9CislPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTA1LmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwNS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5MzA3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwNS5qc3AKQEAgLTAsMCArMSBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+PGpzcDppbmNsdWRlIHBhZ2U9Ii9JbmNsdWRlMDVhLmpzcCIgZmx1c2g9ImZhbHNlIi8+PGpzcDpmb3J3YXJkIHBhZ2U9Ii9JbmNsdWRlMDViLmpzcCIvPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTA1YS5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDVhLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjgzY2FmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTA1YS5qc3AKQEAgLTAsMCArMSBAQAorSW5jbHVkZTA1YSBQQVNTRUQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwNWIuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTA1Yi5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdkZjFlYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwNWIuanNwCkBAIC0wLDAgKzEgQEAKK0luY2x1ZGUwNWIgUEFTU0VECmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDYuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTA2LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGY2ZjhjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTA2LmpzcApAQCAtMCwwICsxLDMgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPj09PT09PT09PT0KKzxqc3A6aW5jbHVkZSBwYWdlPSJzZXJ2bGV0L29yZy5hcGFjaGUudGVzdGVyLkluY2x1ZGUwNmEiIGZsdXNoPSJmYWxzZSIvPj09PT09PT09PT0KKzxqc3A6aW5jbHVkZSBwYWdlPSIvSW5jbHVkZTA2Yi5qc3AiLz49PT09PT09PT09CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDZiLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwNmIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkN2RiZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDZiLmpzcApAQCAtMCwwICsxIEBACitJbmNsdWRlMDZiLmpzcCBvdXRwdXQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEJlYW5zMDEuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwQmVhbnMwMS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzZGUwMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEJlYW5zMDEuanNwCkBAIC0wLDAgKzEsNCBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+PGpzcDp1c2VCZWFuIGlkPSJiZWFuIiBjbGFzcz0ib3JnLmFwYWNoZS50ZXN0ZXIuU2Vzc2lvbkJlYW4iLz5Kc3BCZWFuczAxIFBBU1NFRAorbGlmZWN5Y2xlID0gPCU9IGJlYW4uZ2V0TGlmZWN5Y2xlKCkgJT4KK3N0cmluZ1Byb3BlcnR5PSA8JT0gYmVhbi5nZXRTdHJpbmdQcm9wZXJ0eSgpICU+Cit0b1N0cmluZyA9IDwlPSBiZWFuLnRvU3RyaW5nKCkgJT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEJlYW5zMDIuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwQmVhbnMwMi5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyYzM4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEJlYW5zMDIuanNwCkBAIC0wLDAgKzEsNCBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+PGpzcDp1c2VCZWFuIGlkPSJiZWFuIiBjbGFzcz0ib3JnLmFwYWNoZS50ZXN0ZXIuc2hhcmVkLlNoYXJlZFNlc3Npb25CZWFuIi8+SnNwQmVhbnMwMiBQQVNTRUQKK2xpZmVjeWNsZSA9IDwlPSBiZWFuLmdldExpZmVjeWNsZSgpICU+CitzdHJpbmdQcm9wZXJ0eT0gPCU9IGJlYW4uZ2V0U3RyaW5nUHJvcGVydHkoKSAlPgordG9TdHJpbmcgPSA8JT0gYmVhbi50b1N0cmluZygpICU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BCZWFuczAzLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEJlYW5zMDMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzdkNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BCZWFuczAzLmpzcApAQCAtMCwwICsxLDQgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPjxqc3A6dXNlQmVhbiBpZD0iYmVhbiIgY2xhc3M9Im9yZy5hcGFjaGUudGVzdGVyLnVuc2hhcmVkLlVuc2hhcmVkU2Vzc2lvbkJlYW4iLz5Kc3BCZWFuczAzIFBBU1NFRAorbGlmZWN5Y2xlID0gPCU9IGJlYW4uZ2V0TGlmZWN5Y2xlKCkgJT4KK3N0cmluZ1Byb3BlcnR5PSA8JT0gYmVhbi5nZXRTdHJpbmdQcm9wZXJ0eSgpICU+Cit0b1N0cmluZyA9IDwlPSBiZWFuLnRvU3RyaW5nKCkgJT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcERvYzAxLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcERvYzAxLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDA1ZTlkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwRG9jMDEuanNwCkBAIC0wLDAgKzEsOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8anNwOnJvb3QgeG1sbnM6anNwPSJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIiB2ZXJzaW9uPSIxLjIiPgorICA8YT50ZXh0PGI+PC9iPjwvYT4KKyAgPGpzcDp0ZXh0PiZsdDthJmd0O3RleHQmbHQ7YiZndDsmbHQ7L2ImZ3Q7Jmx0Oy9hJmd0OzwvanNwOnRleHQ+CisgIDxjPjxkPnRleHQ8L2Q+PC9jPgorICA8anNwOnRleHQ+Jmx0O2MmZ3Q7Jmx0O2QmZ3Q7dGV4dCZsdDsvZCZndDsmbHQ7L2MmZ3Q7PC9qc3A6dGV4dD4KKyAgPGU+PGY+PC9mPnRleHQ8Zj48L2Y+PC9lPgorICA8anNwOnRleHQ+Jmx0O2UmZ3Q7Jmx0O2YmZ3Q7Jmx0Oy9mJmd0O3RleHQmbHQ7ZiZndDsmbHQ7L2YmZ3Q7Jmx0Oy9lJmd0OzwvanNwOnRleHQ+Cis8L2pzcDpyb290PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwRG9jMDIuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwRG9jMDIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMzNjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BEb2MwMi5qc3AKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8anNwOnJvb3QgeG1sbnM6anNwPSJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIgorICB2ZXJzaW9uPSIxLjIiPgorPGpzcDpkaXJlY3RpdmUucGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sIi8+Cis8anNwOmRpcmVjdGl2ZS5wYWdlIGltcG9ydD0iamF2YS51dGlsLkRhdGUsIGphdmEudXRpbC5Mb2NhbGUiLz4KKzxqc3A6ZGlyZWN0aXZlLnBhZ2UgaW1wb3J0PSJqYXZhLnRleHQuKiIvPgorCis8anNwOmRlY2xhcmF0aW9uPgorICBTdHJpbmcgZ2V0RGF0YSgpIHsKKyAgICByZXR1cm4gImZvbyI7CisgIH0KKzwvanNwOmRlY2xhcmF0aW9uPgorCis8aHRtbD4KKzxoZWFkPgorICA8dGl0bGU+RXhhbXBsZSBKU1AgaW4gWE1MIGZvcm1hdDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorVGhpcyBpcyB0aGUgb3V0cHV0IG9mIGEgc2ltcGxlIEpTUCB1c2luZyBYTUwgZm9ybWF0LiAKKzxiciAvPgorCis8ZGl2PlVzZSBhIGpzcDpzY3JpcHRsZXQgdG8gbG9vcCBmcm9tIDEgdG8gMTA6IDwvZGl2PgorPGpzcDpzY3JpcHRsZXQ+CisvLyBOb3RlIHdlIG5lZWQgdG8gZGVjbGFyZSBDREFUQSBiZWNhdXNlIHdlIGRvbid0IGVzY2FwZSB0aGUgbGVzcyB0aGFuIHN5bWJvbAorPCFbQ0RBVEFbCisgIGZvciAoaW50IGkgPSAxOyBpPD0xMDsgaSsrKSB7CisgICAgb3V0LnByaW50KGkpOworICAgIGlmIChpIDwgMTApIHsKKyAgICAgIG91dC5wcmludCgiLCAiKTsKKyAgICB9CisgIH0KK11dPgorPC9qc3A6c2NyaXB0bGV0PgorCis8IS0tIEJlY2F1c2UgSSBvbWl0IGJyJ3MgZW5kIHRhZywgZGVjbGFyZSBpdCBhcyBDREFUQSAtLT4KKzwhW0NEQVRBWworICA8YnI+PGJyPgorXV0+CisKKzxkaXYgYWxpZ249ImxlZnQiPgorICBVc2UgYSBqc3A6ZXhwcmVzc2lvbiB0byB3cml0ZSBzb21ldGhpbmc6IAorICA8anNwOmV4cHJlc3Npb24+Z2V0RGF0YSgpPC9qc3A6ZXhwcmVzc2lvbj4KKzwvZGl2PgorCisKKzxqc3A6dGV4dD4KKyAgJmx0O3AmZ3Q7VGhpcyBzZW50ZW5jZSBpcyBlbmNsb3NlZCBpbiBhIGpzcDp0ZXh0IGVsZW1lbnQuJmx0Oy9wJmd0OworPC9qc3A6dGV4dD4KKworPC9ib2R5PgorPC9odG1sPgorPC9qc3A6cm9vdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEZvcndhcmQwMS5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BGb3J3YXJkMDEuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZTI2MTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BGb3J3YXJkMDEuanNwCkBAIC0wLDAgKzEsMiBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+PGpzcDpmb3J3YXJkIHBhZ2U9IjwlPSByZXF1ZXN0LmdldFBhcmFtZXRlcihcInBhdGhcIikgJT4iLz4KK0pzcEZvcndhcmQwMSBGQUlMRUQgLSBDb250ZW50IGZyb20gZm9yd2FyZGVkLXRvIHBhZ2Ugbm90IGluY2x1ZGVkCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BGb3J3YXJkMDFhLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEZvcndhcmQwMWEuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MmMxMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BGb3J3YXJkMDFhLmpzcApAQCAtMCwwICsxIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT5Kc3BGb3J3YXJkMDFhIFBBU1NFRApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwSW5jbHVkZTAxLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEluY2x1ZGUwMS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkN2IzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEluY2x1ZGUwMS5qc3AKQEAgLTAsMCArMSw0IEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT5UaGlzIGlzIGJlZm9yZSB0aGUgaW5jbHVkZQorPGpzcDppbmNsdWRlIHBhZ2U9IjwlPSByZXF1ZXN0LmdldFBhcmFtZXRlcihcInBhdGhcIikgJT4iIGZsdXNoPSJ0cnVlIi8+CitUaGlzIGlzIGFmdGVyIHRoZSBpbmNsdWRlCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEluY2x1ZGUwMWEuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwSW5jbHVkZTAxYS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0ZGRjYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEluY2x1ZGUwMWEuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPlRoaXMgaXMgdGhlIGluY2x1ZGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEluY2x1ZGUwMi5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BJbmNsdWRlMDIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZTM3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BJbmNsdWRlMDIuanNwCkBAIC0wLDAgKzEsNCBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+VGhpcyBpcyBiZWZvcmUgdGhlIGluY2x1ZGUKKzxqc3A6aW5jbHVkZSBwYWdlPSI8JT0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoXCJwYXRoXCIpICU+IiBmbHVzaD0iZmFsc2UiLz4KK1RoaXMgaXMgYWZ0ZXIgdGhlIGluY2x1ZGUKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwSW5jbHVkZTAyYS5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BJbmNsdWRlMDJhLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjRkZGNjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwSW5jbHVkZTAyYS5qc3AKQEAgLTAsMCArMSBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+VGhpcyBpcyB0aGUgaW5jbHVkZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwUGFyYW1zMDEuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwUGFyYW1zMDEuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMzc3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BQYXJhbXMwMS5qc3AKQEAgLTAsMCArMSw1IEBACis8anNwOmluY2x1ZGUgcGFnZT0iSnNwUGFyYW1zMDFhLmpzcCIgZmx1c2g9InRydWUiPgorICA8anNwOnBhcmFtcz4KKyAgICA8anNwOnBhcmFtIG5hbWU9ImZvbyIgdmFsdWU9ImJhciIvPgorICA8L2pzcDpwYXJhbXM+Cis8L2pzcDppbmNsdWRlPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwUGFyYW1zMDIuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwUGFyYW1zMDIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYTg2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BQYXJhbXMwMi5qc3AKQEAgLTAsMCArMSw1IEBACis8anNwOmZvcndhcmQgcGFnZT0iSnNwUGFyYW1zMDFhLmpzcCI+CisgIDxqc3A6cGFyYW1zPgorICAgIDxqc3A6cGFyYW0gbmFtZT0iZm9vIiB2YWx1ZT0iYmFyIi8+CisgIDwvanNwOnBhcmFtcz4KKzwvanNwOmZvcndhcmQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Qcm9wZXJ0eTAxLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1Byb3BlcnR5MDEuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMWM4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Qcm9wZXJ0eTAxLmpzcApAQCAtMCwwICsxLDEyIEBACis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPlByb3BlcnR5MDEuanNwIC0gUG9zaXRpdmUgUHJvcGVydHlFZGl0b3IgVGVzdDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+Cis8anNwOnVzZUJlYW4gaWQ9ImJlYW4iIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLnRlc3Rlci5TZXNzaW9uQmVhbiIvPgorPGpzcDpzZXRQcm9wZXJ0eSBuYW1lPSJiZWFuIiBwcm9wZXJ0eT0iZGF0ZVByb3BlcnR5IgorICAgICAgICAgICAgICAgIHZhbHVlPSIwNy8yNS8yMDAxIi8+CitEYXRlIHByb3BlcnR5IGlzICc8anNwOmdldFByb3BlcnR5IG5hbWU9ImJlYW4iIHByb3BlcnR5PSJkYXRlUHJvcGVydHkiLz4nLgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvUHJvcGVydHkwMi5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Qcm9wZXJ0eTAyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzZjOWU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvUHJvcGVydHkwMi5qc3AKQEAgLTAsMCArMSwxMiBAQAorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5Qcm9wZXJ0eTAyLmpzcCAtIE5lZ2F0aXZlIFByb3BlcnR5RWRpdG9yIFRlc3Q8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorPGpzcDp1c2VCZWFuIGlkPSJiZWFuIiBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS50ZXN0ZXIuU2Vzc2lvbkJlYW4iLz4KKzxqc3A6c2V0UHJvcGVydHkgbmFtZT0iYmVhbiIgcHJvcGVydHk9ImRhdGVQcm9wZXJ0eSIKKyAgICAgICAgICAgICAgICB2YWx1ZT0iMDcvMjUvMjAwQSIvPgorRGF0ZSBwcm9wZXJ0eSBpcyAnPGpzcDpnZXRQcm9wZXJ0eSBuYW1lPSJiZWFuIiBwcm9wZXJ0eT0iZGF0ZVByb3BlcnR5Ii8+Jy4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1JlZGlyZWN0MDIuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvUmVkaXJlY3QwMi5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0NzcxMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1JlZGlyZWN0MDIuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPjwlIFN0cmluZyBkdW1teSA9IG51bGw7IGlmIChkdW1teSA9PSBudWxsKSB7IHJlc3BvbnNlLnNlbmRSZWRpcmVjdChyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAiL1JlZGlyZWN0MDJhLmpzcCIpOyByZXR1cm47IH0gJT5SZWRpcmVjdDAyLmpzcCBGQUlMRUQgLSBDb250ZW50IHNob3VsZCBub3QgYmUgdmlzaWJsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvUmVkaXJlY3QwMmEuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvUmVkaXJlY3QwMmEuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YThhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9SZWRpcmVjdDAyYS5qc3AKQEAgLTAsMCArMSBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+UmVkaXJlY3QwMmEuanNwIFBBU1NFRApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvUmVkaXJlY3QwMy5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9SZWRpcmVjdDAzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmVmMTRiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvUmVkaXJlY3QwMy5qc3AKQEAgLTAsMCArMSBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+PCUgU3RyaW5nIGR1bW15ID0gbnVsbDsgaWYgKGR1bW15ID09IG51bGwpIHsgcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvUmVkaXJlY3QwM2EuanNwIik7ICB9ICU+UmVkaXJlY3QwMy5qc3AgRkFJTEVEIC0gQ29udGVudCBzaG91bGQgbm90IGJlIHZpc2libGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1JlZGlyZWN0MDNhLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1JlZGlyZWN0MDNhLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWUwMzBiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvUmVkaXJlY3QwM2EuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPlJlZGlyZWN0MDNhLmpzcCBQQVNTRUQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1Jlc3BvbnNlV3JhcDAxYi5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9SZXNwb25zZVdyYXAwMWIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNTRjOWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9SZXNwb25zZVdyYXAwMWIuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiU+UmVzcG9uc2VXcmFwMDFiIFBBU1NFRApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvUmVzcG9uc2VXcmFwMDFkLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1Jlc3BvbnNlV3JhcDAxZC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1ZTdiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1Jlc3BvbnNlV3JhcDAxZC5qc3AKQEAgLTAsMCArMSBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iJT5SZXNwb25zZVdyYXAwMWQgUEFTU0VECmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25kaXRpb25hbDAxLnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwMS5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjU1YzRhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwMS5zaHRtbApAQCAtMCwwICsxLDEwIEBACitCZWZvcmUgaWYgYmxvY2suCis8IS0tI3NldCB2YXI9InRlc3QiIHZhbHVlPSJ2YWx1ZTEiIC0tPgorPCEtLSNpZiBleHByPSJcIiR0ZXN0XCIgPSBcInZhbHVlMVwiIiAtLT4KK3Rlc3QgPSB2YWx1ZTEKKzwhLS0jZWxpZiBleHByPSJcIiR0ZXN0XCIgPSBcInZhbHVlMlwiIiAtLT4KK3Rlc3QgPSB2YWx1ZTIKKzwhLS0jZWxzZSAtLT4KK3Rlc3QgPSBuZWl0aGVyIHZhbHVlMSBvciB2YWx1ZTIKKzwhLS0jZW5kaWYgLS0+CitBZnRlciBpZiBibG9jay4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDIuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25kaXRpb25hbDAyLnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYzdmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25kaXRpb25hbDAyLnNodG1sCkBAIC0wLDAgKzEsMTAgQEAKK0JlZm9yZSBpZiBibG9jay4KKzwhLS0jc2V0IHZhcj0idGVzdCIgdmFsdWU9InZhbHVlMiIgLS0+Cis8IS0tI2lmIGV4cHI9IlwiJHRlc3RcIiA9IFwidmFsdWUxXCIiIC0tPgordGVzdCA9IHZhbHVlMQorPCEtLSNlbGlmIGV4cHI9IlwiJHRlc3RcIiA9IFwidmFsdWUyXCIiIC0tPgordGVzdCA9IHZhbHVlMgorPCEtLSNlbHNlIC0tPgordGVzdCA9IG5laXRoZXIgdmFsdWUxIG9yIHZhbHVlMgorPCEtLSNlbmRpZiAtLT4KK0FmdGVyIGlmIGJsb2NrLgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwMy5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDMuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4ZDdiMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDMuc2h0bWwKQEAgLTAsMCArMSw4IEBACitCZWZvcmUgaWYgYmxvY2suCis8IS0tI3NldCB2YXI9InRlc3QiIHZhbHVlPSJ1bnF1b3RlZCBtdWx0aS13b3JkIHZhbHVlIiAtLT4KKzwhLS0jaWYgZXhwcj0iXCIkdGVzdFwiID0gdW5xdW90ZWQgbXVsdGktd29yZCB2YWx1ZSIgLS0+Cit0ZXN0ID0gInVucXVvdGVkIG11bHRpLXdvcmQgdmFsdWUiCis8IS0tI2Vsc2UgLS0+Cit0ZXN0ID0gbm90ICJ1bnF1b3RlZCBtdWx0aS13b3JkIHZhbHVlIgorPCEtLSNlbmRpZiAtLT4KK0FmdGVyIGlmIGJsb2NrLgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwNC5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDQuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkNTBmNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDQuc2h0bWwKQEAgLTAsMCArMSw4IEBACis8IS0tI3NldCB2YXI9InRlc3QxIiB2YWx1ZT0ibm90IG9uZSIgLS0+Cis8IS0tI3NldCB2YXI9InRlc3QyIiB2YWx1ZT0idHdvIiAtLT4KKzwhLS0jc2V0IHZhcj0idGVzdDMiIHZhbHVlPSJ0aHJlZSIgLS0+Cis8IS0tI2lmIGV4cHI9IlwiJHRlc3QxXCIgPSBcIm9uZVwiICYmIFwiJHRlc3QyXCIgPSBcInR3b1wiIHx8IFwiJHRlc3QzXCIgPSBcInRocmVlXCIiIC0tPgordHJ1ZQorPCEtLSNlbHNlIC0tPgorZmFsc2UKKzwhLS0jZW5kaWYgLS0+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25kaXRpb25hbDA1LnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwNS5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWUxMGU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwNS5zaHRtbApAQCAtMCwwICsxLDggQEAKKzwhLS0jc2V0IHZhcj0idGVzdDEiIHZhbHVlPSJub3Qgb25lIiAtLT4KKzwhLS0jc2V0IHZhcj0idGVzdDIiIHZhbHVlPSJ0d28iIC0tPgorPCEtLSNzZXQgdmFyPSJ0ZXN0MyIgdmFsdWU9InRocmVlIiAtLT4KKzwhLS0jaWYgZXhwcj0iXCIkdGVzdDFcIiA9IFwib25lXCIgJiYgKFwiJHRlc3QyXCIgPSBcInR3b1wiIHx8IFwiJHRlc3QzXCIgPSBcInRocmVlXCIpIiAtLT4KK3RydWUKKzwhLS0jZWxzZSAtLT4KK2ZhbHNlCis8IS0tI2VuZGlmIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwNi5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDYuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjZjFkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDYuc2h0bWwKQEAgLTAsMCArMSwxNiBAQAorPCEtLSNzZXQgdmFyPSJ0ZXN0MSIgdmFsdWU9Im5vdCBvbmUiIC0tPgorPCEtLSNzZXQgdmFyPSJ0ZXN0MiIgdmFsdWU9InR3byIgLS0+Cis8IS0tI3NldCB2YXI9InRlc3QzIiB2YWx1ZT0idGhyZWUiIC0tPgorPCEtLSNpZiBleHByPSJcIiR0ZXN0MVwiID0gXCJvbmVcIiB8fCBcIiR0ZXN0MlwiID0gXCJ0d29cIiIgLS0+Cis8IS0tI2lmIGV4cHI9IlwiJHRlc3QxXCIgPSBcIm9uZVwiIiAtLT4KK29uZQorPCEtLSNlbGlmIGV4cHI9IlwiJHRlc3QxXCIgPSBcIm5vdCBvbmVcIiIgLS0+Citub3Qgb25lCis8IS0tI2VuZGlmIC0tPgorPCEtLSNlbHNlIC0tPgorPCEtLSNpZiBleHByPSJcIiR0ZXN0MlwiID0gXCJ0d29cIiIgLS0+Cit0d28KKzwhLS0jZWxpZiBleHByPSJcIiR0ZXN0MlwiID0gXCJub3QgdHdvXCIiIC0tPgorbm90IHR3bworPCEtLSNlbmRpZiAtLT4KKzwhLS0jZW5kaWYgLS0+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25kaXRpb25hbDA3LnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwNy5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzQ1MGEyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwNy5zaHRtbApAQCAtMCwwICsxLDE2IEBACis8IS0tI3NldCB2YXI9InRlc3QxIiB2YWx1ZT0ibm90IG9uZSIgLS0+Cis8IS0tI3NldCB2YXI9InRlc3QyIiB2YWx1ZT0ibm90IHR3byIgLS0+Cis8IS0tI3NldCB2YXI9InRlc3QzIiB2YWx1ZT0idGhyZWUiIC0tPgorPCEtLSNpZiBleHByPSJcIiR0ZXN0MVwiID0gXCJvbmVcIiB8fCBcIiR0ZXN0MlwiID0gXCJ0d29cIiIgLS0+Cis8IS0tI2lmIGV4cHI9IlwiJHRlc3QxXCIgPSBcIm9uZVwiIiAtLT4KK29uZQorPCEtLSNlbGlmIGV4cHI9IlwiJHRlc3QxXCIgPSBcIm5vdCBvbmVcIiIgLS0+Citub3Qgb25lCis8IS0tI2VuZGlmIC0tPgorPCEtLSNlbHNlIC0tPgorPCEtLSNpZiBleHByPSJcIiR0ZXN0MlwiID0gXCJ0d29cIiIgLS0+Cit0d28KKzwhLS0jZWxpZiBleHByPSJcIiR0ZXN0MlwiID0gXCJub3QgdHdvXCIiIC0tPgorbm90IHR3bworPCEtLSNlbmRpZiAtLT4KKzwhLS0jZW5kaWYgLS0+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25kaXRpb25hbDA4LnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwOC5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGU2NDVmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwOC5zaHRtbApAQCAtMCwwICsxLDcgQEAKKzwhLS0jc2V0IHZhcj0idGVzdCIgdmFsdWU9Im9uZSIgLS0+Cis8IS0tI2lmIGV4cHI9IlwiJHRlc3RcIiA9IFwib25lXCIiIC0tPgorPCEtLSNzZXQgdmFyPSJ0ZXN0IiB2YWx1ZT0idHdvIiAtLT4KKzwhLS0jZWxzZSAtLT4KKzwhLS0jc2V0IHZhcj0idGVzdCIgdmFsdWU9InRocmVlIiAtLT4KKzwhLS0jZW5kaWYgLS0+Cis8IS0tI2VjaG8gdmFyPSJ0ZXN0IiAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmZpZzAxLnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZmlnMDEuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY2ZDliZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmZpZzAxLnNodG1sCkBAIC0wLDAgKzEsMiBAQAorPCEtLSNjb25maWcgZXJybXNnPSJlcnJtc2c6U29ycnkgdGhpcyBjb21tYW5kIHdvbid0IHdvcmsuIiAtLT4KKzwhLS0jZnNpemUgZmlsZT0iZm9vLnNodG1sIiAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmZpZzAzLnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZmlnMDMuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyNWNkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmZpZzAzLnNodG1sCkBAIC0wLDAgKzEsNCBAQAorPCEtLSNjb25maWcgc2l6ZWZtdD0iYnl0ZXMiIC0tPgorPCEtLSNmc2l6ZSBmaWxlPSJpbmNsdWRlbWUudHh0IiAtLT4KKzwhLS0jY29uZmlnIHNpemVmbXQ9ImFiYnJldiIgLS0+Cis8IS0tI2ZzaXplIGZpbGU9ImluY2x1ZGVtZS50eHQiIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRXhlY0NHSS5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUV4ZWNDR0kuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2MDRmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUV4ZWNDR0kuc2h0bWwKQEAgLTAsMCArMSwzOCBAQAorPGh0bWw+IAorICA8aGVhZD4gCisgPHRpdGxlPmV4ZWMgY29tbWFuZCAgdGVzdCBleGFtcGxlcyA8L3RpdGxlPiAKKyA8L2hlYWQ+IAorIDxib2R5PgorCisgPCEtLSNleGVjIGNnaT0iL2NnaS1iaW4vYXJyYXkucGwiIC0tPjxicj4KKworIDwhLS0jZXhlYyBjZ2k9Ii9jZ2ktYmluL2JpbmFyeS5wbD9jb3VudGVyPTEwMiIgLS0+PGJyPgorCisgPCEtLSNleGVjIGNnaT0iL2NnaS1iaW4vY2hvcmVzLnBsIiAtLT48YnI+CisKKyA8IS0tI2V4ZWMgY2dpPSIvY2dpLWJpbi9jb25jYXQucGw/Zmlyc3RfbmFtZT1qYW5lJmxhc3RfbmFtZT1qb2huc29uJmZpYW5jZV9maXJzdD1qb2huJmZpYW5jZV9sYXN0PXNtaXRoIiAtLT48YnI+CisKKyA8IS0tI2V4ZWMgY2dpPSIvY2dpLWJpbi9kYXlzLnBsIiAtLT48YnI+CisKKyA8IS0tI2V4ZWMgY2dpPSIvY2dpLWJpbi9kb3doaWxlLnBsP3N0YXJ0PTEwIiAtLT48YnI+CisKKyA8IS0tI2V4ZWMgY2dpPSIvY2dpLWJpbi9lbHNlLnBsP2Zvb2Q9c3BpbmFjaCIgLS0+PGJyPgorCisgPCEtLSNleGVjIGNnaT0iL2NnaS1iaW4vZWxzaWYucGw/Zm9vZD1jaG9jb2xhdGUiIC0tPjxicj4KKworIDwhLS0jZXhlYyBjZ2k9Ii9jZ2ktYmluL2V4cG9uZW50cy5wbD9udW1iZXI9MiZwb3dlcj00IiAtLT48YnI+CisKKyA8IS0tI2V4ZWMgY2dpPSIvY2dpLWJpbi9mb3IucGw/c3RhcnQ9MTAiIC0tPjxicj4KKworIDwhLS0jZXhlYyBjZ2k9Ii9jZ2ktYmluL2dldGRheS5wbCIgLS0+PGJyPgorCisgPCEtLSNleGVjIGNnaT0iL2NnaS1iaW4vaGVsbG9wZXJsLmNnaSIgLS0+PGJyPgorCisgPCEtLSNleGVjIGNnaT0iL2NnaS1iaW4vaWYucGw/Zm9vZD1zcGluYWNoIiAtLT48YnI+CisKKyA8IS0tI2V4ZWMgY2dpPSIvY2dpLWJpbi9pbmNyZW1lbnQucGw/Y291bnRlcj03IiAtLT48YnI+CisKKyA8IS0tI2V4ZWMgY2dpPSIvY2dpLWJpbi9tb2RpZnlhbGwucGw/bnVtYmVyPTI4OSIgLS0+PGJyPgorCisgPC9ib2R5PiAKKyA8L2h0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lFeGVjQ21kLnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRXhlY0NtZC5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjNlMDc0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRXhlY0NtZC5zaHRtbApAQCAtMCwwICsxLDIzIEBACis8aHRtbD4KKyAgPGhlYWQ+CisgPHRpdGxlPmV4ZWMgY29tbWFuZCAgdGVzdCBleGFtcGxlcyA8L3RpdGxlPgorIDwvaGVhZD4KKyA8Ym9keT4KKyAKKyA8aDM+aGVsbG8uZXhlCisgICAgICA8IS0tI2V4ZWMgY21kPSJoZWxsby5leGUiIC0tPiA8L2gzPgorICAgICAgIHVzaW5nICZsdDshLS0jZXhlYyBjbWQ9ImhlbGxvLmV4ZSIgLS0mZ3Q7IDxicj4KKyAgICAgICAKKyA8aDM+IFRoZSBVTklYIGRhdGUgb2YgdGhlIHNlcnZlciA6OgorICAgICAgPCEtLSNleGVjIGNtZD0iZGF0ZSIgLS0+IDwvaDM+CisgICAgICB1c2luZyAmbHQ7IS0tI2V4ZWMgY21kPSJkYXRlIiAtLSZndDsgPGJyPgorCisgPGhyPgorCisgPGgzPlRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IDo6CisgICAgICA8IS0tI2V4ZWMgY21kPSJwd2QiIC0tPiA8L2gzPgorICAgICAgIHVzaW5nICZsdDshLS0jZXhlYyBjbWQ9InB3ZCIgLS0mZ3Q7IDxicj4KKworCisgPC9ib2R5PgorIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUZzaXplMDEuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTAxLnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOTc1OTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTAxLnNodG1sCkBAIC0wLDAgKzEgQEAKKzwhLS0jZnNpemUgLS0+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTAyLnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRnNpemUwMi5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmNkZThjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRnNpemUwMi5zaHRtbApAQCAtMCwwICsxIEBACis8IS0tI2ZzaXplIGZpbGU9ImluY2x1ZGVtZS50eHQiIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRnNpemUwMy5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUZzaXplMDMuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYzNzNiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUZzaXplMDMuc2h0bWwKQEAgLTAsMCArMSBAQAorPCEtLSNmc2l6ZSBmaWxlPSIuL2luY2x1ZGVtZS50eHQiIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRnNpemUwNC5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUZzaXplMDQuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY3OTFlYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUZzaXplMDQuc2h0bWwKQEAgLTAsMCArMSBAQAorPCEtLSNmc2l6ZSB2aXJ0dWFsPSJpbmNsdWRlbWUudHh0IiAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUZzaXplMDUuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTA1LnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwOWZjZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTA1LnNodG1sCkBAIC0wLDAgKzEgQEAKKzwhLS0jZnNpemUgdmlydHVhbD0iL3Rlc3Rlci9pbmNsdWRlbWUudHh0IiAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUZzaXplMDYuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTA2LnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZWIzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTA2LnNodG1sCkBAIC0wLDAgKzEgQEAKKzwhLS0jZnNpemUgdmlydHVhbD0ic3NpZGlyL2luY2x1ZGVtZS50eHQiIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRnNpemUwNy5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUZzaXplMDcuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjODc2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUZzaXplMDcuc2h0bWwKQEAgLTAsMCArMSBAQAorPCEtLSNmc2l6ZSB2aXJ0dWFsPSIuL3NzaWRpci9pbmNsdWRlbWUudHh0IiAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUZzaXplMDguc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTA4LnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MWZhYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTA4LnNodG1sCkBAIC0wLDAgKzEsMiBAQAorPCEtLSNmc2l6ZSBmaWxlPSJpbmNsdWRlbWUudHh0IgorICAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwMS5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwMS5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzhiNDE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTAxLnNodG1sCkBAIC0wLDAgKzEgQEAKKzwhLS0jaW5jbHVkZSAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwMi5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwMi5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmEzMjcwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTAyLnNodG1sCkBAIC0wLDAgKzEgQEAKKzwhLS0jaW5jbHVkZSBmaWxlPSJpbmNsdWRlbWUudHh0IiAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwMy5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwMy5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGQ0ZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTAzLnNodG1sCkBAIC0wLDAgKzEgQEAKKzwhLS0jaW5jbHVkZSBmaWxlPSIuL2luY2x1ZGVtZS50eHQiIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTA0LnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTA0LnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNzEwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lJbmNsdWRlMDQuc2h0bWwKQEAgLTAsMCArMSBAQAorPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGVtZS50eHQiIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTA1LnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTA1LnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYjE5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lJbmNsdWRlMDUuc2h0bWwKQEAgLTAsMCArMSBAQAorPCEtLSNpbmNsdWRlIHZpcnR1YWw9Ii90ZXN0ZXIvaW5jbHVkZW1lLnR4dCIgLS0+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lJbmNsdWRlMDYuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lJbmNsdWRlMDYuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwYjBkMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwNi5zaHRtbApAQCAtMCwwICsxIEBACis8IS0tI2luY2x1ZGUgdmlydHVhbD0ic3NpZGlyL2luY2x1ZGVtZS50eHQiIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTA3LnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTA3LnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOThhMGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lJbmNsdWRlMDcuc2h0bWwKQEAgLTAsMCArMSBAQAorPCEtLSNpbmNsdWRlIHZpcnR1YWw9Ii4vc3NpZGlyL2luY2x1ZGVtZS50eHQiIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTA4LnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTA4LnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMjNjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lJbmNsdWRlMDguc2h0bWwKQEAgLTAsMCArMSwyIEBACis8IS0tI2luY2x1ZGUgZmlsZT0iaW5jbHVkZW1lLnR4dCIKKyAgLS0+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lJbmNsdWRlMDkuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lJbmNsdWRlMDkuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VhNTFiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwOS5zaHRtbApAQCAtMCwwICsxLDYgQEAKKzwhLS0jaW5jbHVkZSBmaWxlPSJpbmNsdWRlbWUudHh0IgorICAtLT4KKzwhLS0jaW5jbHVkZSBmaWxlPSJTU0lJbmNsdWRlMDguc2h0bWwiCisgIC0tPgorPCEtLSNpbmNsdWRlIGZpbGU9ImluY2x1ZGVtZS50eHQiCisgIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJVmFyU3ViMDEuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lWYXJTdWIwMS5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTgyZTZiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJVmFyU3ViMDEuc2h0bWwKQEAgLTAsMCArMSwzIEBACis8IS0tI3NldCB2YXI9InRlc3QiIHZhbHVlPSIkRE9DVU1FTlRfVVJJIiAtLT4KKzwhLS0jZWNobyB2YXI9InRlc3QiIC0tPgorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lWYXJTdWIwMi5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSVZhclN1YjAyLnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZjgxYTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lWYXJTdWIwMi5zaHRtbApAQCAtMCwwICsxLDQgQEAKKzwhLS0jc2V0IHZhcj0idGVzdCIgdmFsdWU9InZhbHVlIG9mIHRlc3QiIC0tPgorPCEtLSNzZXQgdmFyPSJ0ZXN0MiIgdmFsdWU9IiR7dGVzdH0iIC0tPgorPCEtLSNlY2hvIHZhcj0idGVzdDIiIC0tPgorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lWYXJTdWIwMy5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSVZhclN1YjAzLnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NmE3NzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lWYXJTdWIwMy5zaHRtbApAQCAtMCwwICsxLDUgQEAKKzwhLS0jc2V0IHZhcj0idGVzdCIgdmFsdWU9InZhbHVlIG9mIHRlc3QiIC0tPgorPCEtLSNzZXQgdmFyPSJ0ZXN0MiIgdmFsdWU9InZhbHVlIG9mIHRlc3QyIiAtLT4KKzwhLS0jc2V0IHZhcj0idGVzdDMiIHZhbHVlPSIkdGVzdCAkdGVzdDIiIC0tPgorPCEtLSNlY2hvIHZhcj0idGVzdDMiIC0tPgorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lWYXJTdWIwNC5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSVZhclN1YjA0LnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNmQ5OTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lWYXJTdWIwNC5zaHRtbApAQCAtMCwwICsxLDUgQEAKKzwhLS0jc2V0IHZhcj0idGVzdCIgdmFsdWU9InZhbHVlIG9mIHRlc3QiIC0tPgorPCEtLSNzZXQgdmFyPSJ0ZXN0MiIgdmFsdWU9InZhbHVlIG9mIHRlc3QyIiAtLT4KKzwhLS0jc2V0IHZhcj0idGVzdDMiIHZhbHVlPSIke3Rlc3R9ICR7dGVzdDJ9IiAtLT4KKzwhLS0jZWNobyB2YXI9InRlc3QzIiAtLT4KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJVmFyU3ViMDUuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lWYXJTdWIwNS5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDE2MzgxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJVmFyU3ViMDUuc2h0bWwKQEAgLTAsMCArMSw1IEBACis8IS0tI3NldCB2YXI9InRlc3QiIHZhbHVlPSJ2YWx1ZSBvZiB0ZXN0IiAtLT4KKzwhLS0jc2V0IHZhcj0idGVzdDIiIHZhbHVlPSJ2YWx1ZSBvZiB0ZXN0MiIgLS0+Cis8IS0tI3NldCB2YXI9InRlc3QzIiB2YWx1ZT0iJHt0ZXN0fXwke3Rlc3QyfSIgLS0+Cis8IS0tI2VjaG8gdmFyPSJ0ZXN0MyIgLS0+CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSVZhclN1YjA2LnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJVmFyU3ViMDYuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMwOGJjNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSVZhclN1YjA2LnNodG1sCkBAIC0wLDAgKzEsMyBAQAorPCEtLSNzZXQgdmFyPSJ0ZXN0IiB2YWx1ZT0idmFsdWUgb2YgdGVzdCIgLS0+Cis8IS0tI3NldCB2YXI9InRlc3QzIiB2YWx1ZT0iJHt0ZXN0fVwke3Rlc3QyfSIgLS0+Cis8IS0tI2VjaG8gdmFyPSJ0ZXN0MyIgLS0+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TZXNzaW9uMDdhLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1Nlc3Npb24wN2EuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMTQxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TZXNzaW9uMDdhLmpzcApAQCAtMCwwICsxLDUgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPjxqc3A6dXNlQmVhbiBpZD0ic2ltcGxlQmVhbiIKKyAgICBzY29wZT0ic2Vzc2lvbiIgY2xhc3M9Im9yZy5hcGFjaGUudGVzdGVyLlNlc3Npb25CZWFuIi8+PCUKKyAgc2ltcGxlQmVhbi5zZXRTdHJpbmdQcm9wZXJ0eSgiRnJvbSBTZXNzaW9uMDdhIik7CisgIHJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiU2Vzc2lvbjA3Yi5qc3AiKTsKKyU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TZXNzaW9uMDdiLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1Nlc3Npb24wN2IuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhM2RhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TZXNzaW9uMDdiLmpzcApAQCAtMCwwICsxLDkgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPjxqc3A6dXNlQmVhbiBpZD0ic2ltcGxlQmVhbiIKKyAgICBzY29wZT0ic2Vzc2lvbiIgY2xhc3M9Im9yZy5hcGFjaGUudGVzdGVyLlNlc3Npb25CZWFuIi8+PCUKKyAgaWYgKCJGcm9tIFNlc3Npb24wN2EiLmVxdWFscyhzaW1wbGVCZWFuLmdldFN0cmluZ1Byb3BlcnR5KCkpKSB7CisgICAgb3V0LnByaW50bG4oIlNlc3Npb24wNyBQQVNTRUQiKTsKKyAgfSBlbHNlIHsKKyAgICBvdXQucHJpbnRsbigiU2Vzc2lvbjA3IEZBSUxFRCAtIFByb3BlcnR5ID0gJyIgKworICAgICAgICAgICAgICAgIHNpbXBsZUJlYW4uZ2V0U3RyaW5nUHJvcGVydHkoKSArICInIik7CisgIH0KKyU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9hcnJheS5wbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2FycmF5LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MTQzNWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9hcnJheS5wbApAQCAtMCwwICsxLDE2IEBACisjIS91c3IvYmluL3BlcmwKKworcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG5cbiI7CisKK0BkYXlzID0gKCJNb25kYXkiLCAKKyAgICAgICAgICJUdWVzZGF5IiwgCisgICAgICAgICAiV2VkbmVzZGF5IiwgCisgICAgICAgICAiVGh1cnNkYXkiLCAKKyAgICAgICAgICJGcmlkYXkiLCAKKyAgICAgICAgICJTYXR1cmRheSIsIAorICAgICAgICAgIlN1bmRheSIpOworCitwcmludCAiVGhlc2UgYXJlIHRoZSBkYXlzIG9mIHRoZSB3ZWVrOiI7CisKK3ByaW50ICI8cD4iOworcHJpbnQgIkBkYXlzIjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9iaW5hcnkucGwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9iaW5hcnkucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmMGQ3NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2JpbmFyeS5wbApAQCAtMCwwICsxLDE0IEBACisjIS91c3IvYmluL3BlcmwKKworcmVxdWlyZSAic3VicGFyc2Vmb3JtLmxpYiI7CismUGFyc2VfRm9ybTsKKworJGNvdW50ZXIgPSAkZm9ybWRhdGF7J2NvdW50ZXInfTsKKworJGNvdW50ZXIgKz0xOworCitwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKK3ByaW50ICI8Rk9OVCBTSVpFPSsyPklmIHlvdSBhZGQgb25lIHRvIHlvdXIgbnVtYmVyLCB0aGUgcmVzdWx0IGlzIDxCPiRjb3VudGVyPC9CPiI7CisKKyRjb3VudGVyICs9NTsKK3ByaW50ICI8UD5JZiB5b3UgYWRkIDUgdG8gdGhhdCwgdGhlIHJlc3VsdCBpcyA8Qj4kY291bnRlcjwvQj48L0ZPTlQ+IjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9jb25jYXQucGwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9jb25jYXQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViYWExMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2NvbmNhdC5wbApAQCAtMCwwICsxLDEyIEBACisjIS91c3IvYmluL3BlcmwKKworcmVxdWlyZSAic3VicGFyc2Vmb3JtLmxpYiI7CismUGFyc2VfRm9ybTsKKworJGZpcnN0ID0gJGZvcm1kYXRheydmaXJzdF9uYW1lJ307CiskbWFycmllZCA9ICRmb3JtZGF0YXsnZmlhbmNlX2xhc3QnfTsKKworJGZ1bGxuYW1lID0gJGZpcnN0IC4gIiAiIC4gJG1hcnJpZWQ7CisKK3ByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuXG4iOworcHJpbnQgIkNvbmdyYXR1bGF0aW9ucyEgWW91ciBtYXJyaWVkIG5hbWUgd291bGQgYmUgJGZ1bGxuYW1lLiI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvZGF5cy5wbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2RheXMucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiNDM0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2RheXMucGwKQEAgLTAsMCArMSw4IEBACisjIS91c3IvYmluL3BlcmwKKworQGRheXMgPSAoIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0dXJkYXkiLCAiU3VuZGF5Iik7CisKK3ByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuXG4iOworcHJpbnQgIlRoZXNlIGFyZSB0aGUgZGF5cyBvZiB0aGUgd2VlazoiOworcHJpbnQgIjxQPiI7CitwcmludCAiQGRheXMiOwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvZG93aGlsZS5wbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2Rvd2hpbGUucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RlZDlkYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2Rvd2hpbGUucGwKQEAgLTAsMCArMSwxNiBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3JlcXVpcmUgInN1YnBhcnNlZm9ybS5saWIiOworJlBhcnNlX0Zvcm07CisKKyRzdGFydCA9ICRmb3JtZGF0YXsnc3RhcnQnfTsKKworcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG5cbiI7CitwcmludCAiPFA+U3RhcnRpbmcgY291bnRkb3duLi4uIjsKKworZG8geworCXByaW50ICIkc3RhcnQuLi4gIjsKKwktLSRzdGFydDsKK30gd2hpbGUgKCRzdGFydCA+IDApOworCitwcmludCAiS0FCT09NISI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvZWxzZS5wbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2Vsc2UucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5OTc2MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2Vsc2UucGwKQEAgLTAsMCArMSwxNSBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3JlcXVpcmUgInN1YnBhcnNlZm9ybS5saWIiOworJlBhcnNlX0Zvcm07CisKKyRmb29kID0gJGZvcm1kYXRheydmb29kJ307CisKK3ByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuXG4iOworCitpZiAoJGZvb2QgZXEgInNwaW5hY2giKSB7CisJCisJcHJpbnQgIllvdSBhdGUgc3BpbmFjaCwgc28geW91IGdldCBkZXNzZXJ0ISI7Cit9IGVsc2UgeworCXByaW50ICJObyBzcGluYWNoLCBubyBkZXNzZXJ0ISI7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvZWxzaWYucGwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9lbHNpZi5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2EyOGU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvZWxzaWYucGwKQEAgLTAsMCArMSwxNyBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3JlcXVpcmUgInN1YnBhcnNlZm9ybS5saWIiOworJlBhcnNlX0Zvcm07CisKKyRmb29kID0gJGZvcm1kYXRheydmb29kJ307CisKK3ByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuXG4iOworCitpZiAoJGZvb2QgZXEgInNwaW5hY2giKSB7CisJCisJcHJpbnQgIllvdSBhdGUgc3BpbmFjaCwgc28geW91IGdldCBkZXNzZXJ0ISI7Cit9IGVsc2lmICgkZm9vZCBlcSAiYnJvY2NvbGkiKSB7CisJcHJpbnQgIkJyb2Njb2xpJ3MgT0suIE1heWJlIHlvdSdsbCBnZXQgZGVzc2VydC4iOworfSBlbHNlIHsKKwlwcmludCAiTm8gc3BpbmFjaCwgbm8gZGVzc2VydCEiOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2V4cG9uZW50cy5wbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2V4cG9uZW50cy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRiMTFjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvZXhwb25lbnRzLnBsCkBAIC0wLDAgKzEsMTMgQEAKKyMhL3Vzci9iaW4vcGVybAorCityZXF1aXJlICJzdWJwYXJzZWZvcm0ubGliIjsKKyZQYXJzZV9Gb3JtOworCiskbnVtYmVyID0gJGZvcm1kYXRheydudW1iZXInfTsKKyRwb3dlciA9ICRmb3JtZGF0YXsncG93ZXInfTsKKworJHJlc3VsdCA9ICRudW1iZXIgKiogJHBvd2VyOworCitwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKK3ByaW50ICI8UD5Zb3UgZW50ZXJlZCAkbnVtYmVyIHdpdGggYW4gZXhwb25lbnQgb2YgJHBvd2VyIjsKK3ByaW50ICI8UD4kbnVtYmVyIHJhaXNlZCB0byB0aGUgJHBvd2VyIHBvd2VyIGlzICRyZXN1bHQuIjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9mb3IucGwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9mb3IucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmYzkxOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2Zvci5wbApAQCAtMCwwICsxLDE1IEBACisjIS91c3IvYmluL3BlcmwKKworcmVxdWlyZSAic3VicGFyc2Vmb3JtLmxpYiI7CismUGFyc2VfRm9ybTsKKworJHN0YXJ0ID0gJGZvcm1kYXRheydzdGFydCd9OworCitwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKK3ByaW50ICI8UD5TdGFydGluZyBjb3VudGRvd24uLi4iOworCitmb3IgKCRpID0gJHN0YXJ0OyAkaSA+IDA7IC0tJGkpIHsKKwlwcmludCAiJGkuLi4gIjsKK30gCisKK3ByaW50ICJLQUJPT00hIjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9nZXRkYXkucGwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9nZXRkYXkucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5NzllNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2dldGRheS5wbApAQCAtMCwwICsxLDggQEAKKyMhL3Vzci9iaW4vcGVybAorCitAZGF5cyA9IHF3KFN1bmRheSBNb25kYXkgVHVlc2RheSBXZWRuZXNkYXkgVGh1cnNkYXkgRnJpZGF5IFNhdHVyZGF5KTsKKworcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG5cbiI7CitwcmludCAiVGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayBpcyAkZGF5c1swXSI7CisKK3ByaW50ICI8UD5UaGUgdGhpcmQgZGF5IG9mIHRoZSB3ZWVrIGlzICRkYXlzWzJdIjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9oZWxsb3BlcmwucGwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9oZWxsb3BlcmwucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljYWE3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2hlbGxvcGVybC5wbApAQCAtMCwwICsxLDkgQEAKKyMhL3Vzci9iaW4vcGVybAorCisJJHQJPSAiSGVsbG8gV29ybGQhIjsKKwlwcmludAk8PEVPVDsKK0NvbnRlbnQtdHlwZTogdGV4dC9odG1sCisKKwk8VGl0bGU+ICR0IDwvVGl0bGU+CisJPEgxPgkkdCA8L0gxPgorRU9UCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9pZi5wbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2lmLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDIzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9pZi5wbApAQCAtMCwwICsxLDEzIEBACisjIS91c3IvYmluL3BlcmwKKworcmVxdWlyZSAic3VicGFyc2Vmb3JtLmxpYiI7CismUGFyc2VfRm9ybTsKKworJGZvb2QgPSAkZm9ybWRhdGF7J2Zvb2QnfTsKKworCisKK2lmICgkZm9vZCBlcSAic3BpbmFjaCIpIHsKKwlwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKKwlwcmludCAiWW91IGF0ZSBzcGluYWNoLCBzbyB5b3UgZ2V0IGRlc3NlcnQhXG4iOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2luY3JlbWVudC5wbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2luY3JlbWVudC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjExNjlkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvaW5jcmVtZW50LnBsCkBAIC0wLDAgKzEsMTkgQEAKKyMhL3Vzci9iaW4vcGVybAorCityZXF1aXJlICJzdWJwYXJzZWZvcm0ubGliIjsKKyZQYXJzZV9Gb3JtOworcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG5cbiI7CisKKyRjb3VudGVyID0gJGZvcm1kYXRheydjb3VudGVyJ307CisKKysrJGNvdW50ZXI7CitwcmludCAiWW91ciBudW1iZXIgaW5jcmVtZW50ZWQgYnkgMSBpcyAkY291bnRlciI7Ciskd2F0Y2ggPSArKyRjb3VudGVyOworcHJpbnQgIjxCUj5Zb3VyIG51bWJlciwgaW5jcmVtZW50ZWQgYWdhaW4gYnkgMSwgaXMgbm93ICRjb3VudGVyLiBJZiB3ZSBzdG9yZSB0aGF0IG9wZXJhdGlvbiwgaXRzIHZhbHVlIGlzIGFsc28gJHdhdGNoLiI7CisKKyRjb3VudGVyID0gJGZvcm1kYXRheydjb3VudGVyJ307CitwcmludCAiPEhSPkxldCdzIHN0YXJ0IG92ZXIsIHdpdGggeW91ciBvcmlnaW5hbCBudW1iZXIgJGNvdW50ZXIiOworJGNvdW50ZXIrKzsKK3ByaW50ICI8QlI+QWdhaW4sIHlvdXIgbnVtYmVyIGluY3JlbWVudGVkIGJ5IDEgaXMgJGNvdW50ZXIiOworJHdhdGNoID0gJGNvdW50ZXIrKzsKK3ByaW50ICI8QlI+Tm93IHdlIHN0b3JlIHRoZSB2YWx1ZSBvZiB5b3VyIG51bWJlciBpbiBhIHNlY29uZCB2YXJpYWJsZSwgd2hpY2ggaXMgbm93IGVxdWFsIHRvICR3YXRjaCwgYW5kIHRoZW4gd2UgaW5jcmVtZW50IHlvdXIgbnVtYmVyIGFnYWluLiBJdCdzIG5vdyAkY291bnRlci4iOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL21vZGlmeWFsbC5wbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL21vZGlmeWFsbC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzA4OTY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvbW9kaWZ5YWxsLnBsCkBAIC0wLDAgKzEsMjIgQEAKKyMhL3Vzci9iaW4vcGVybAorCityZXF1aXJlICJzdWJwYXJzZWZvcm0ubGliIjsKKyZQYXJzZV9Gb3JtOworCitAbnVtYmVycyA9IHNwbGl0KC8sLywgJGZvcm1kYXRheydudW1iZXInfSk7CitwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKKworcHJpbnQgIlRoZSBudW1iZXJzIHlvdSBlbnRlcmVkIHdlcmU6IjsKK2ZvcmVhY2ggJG51bWJlciAoQG51bWJlcnMpIHsKKwlwcmludCAiPExJPiRudW1iZXIiOworCX0KKwkKK2ZvcmVhY2ggJG51bWJlcihAbnVtYmVycykgeworCSRudW1iZXIgPSBzcXJ0KCRudW1iZXIpOworCX0KKworcHJpbnQgIjxQPlRoZSBzcXVhcmUgcm9vdHMgb2YgdGhvc2UgbnVtYmVycyBhcmU6ICI7CisKK2ZvcmVhY2ggJG51bWJlcihAbnVtYmVycykgeworCXByaW50ICI8TEk+JG51bWJlciI7CisJfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL3ByZWZlcmVuY2UucGwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9wcmVmZXJlbmNlLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYjc1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9wcmVmZXJlbmNlLnBsCkBAIC0wLDAgKzEsOSBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyRkaXYgPSA0MCAvIDUgKyAzOworJHBhcmVucyA9IDQwIC8gKDUgKyAzKTsKKyRzdWJhZGQgPSA5IC0gMyArIDU7CiskcGFyZW5zX3N1YmFkZCA9IDkgLSAoMyArIDUpOworCitwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKK3ByaW50ICJkaXYgaXMgJGRpdiwgcGFyZW5zIGlzICRwYXJlbnMsIHN1YmFkZCBpcyAkc3ViYWRkIGFuZCBwYXJlbnNfc3ViYWRkIGlzICRwYXJlbnNfc3ViYWRkIjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9zdWJwYXJzZWZvcm0ubGliIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvc3VicGFyc2Vmb3JtLmxpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTM2YmU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvc3VicGFyc2Vmb3JtLmxpYgpAQCAtMCwwICsxLDQzIEBACitzdWIgUGFyc2VfRm9ybSAKK3sKK2lmICgkRU5WeydSRVFVRVNUX01FVEhPRCd9IGVxICdHRVQnKSAKK3sKKyAgICAgICAgQHBhaXJzID0gc3BsaXQoLyYvLCAkRU5WeydRVUVSWV9TVFJJTkcnfSk7Cit9IAorZWxzaWYgKCRFTlZ7J1JFUVVFU1RfTUVUSE9EJ30gZXEgJ1BPU1QnKSAKK3sKKyAgICByZWFkIChTVERJTiwgJGJ1ZmZlciwgJEVOVnsnQ09OVEVOVF9MRU5HVEgnfSk7CisgICAgQHBhaXJzID0gc3BsaXQoLyYvLCAkYnVmZmVyKTsKKwkJCisgICAgaWYgKCRFTlZ7J1FVRVJZX1NUUklORyd9KSAKKyAgICB7CisgICAgICAgIEBnZXRwYWlycyA9c3BsaXQoLyYvLCAkRU5WeydRVUVSWV9TVFJJTkcnfSk7CisgICAgICAgIHB1c2goQHBhaXJzLEBnZXRwYWlycyk7CisgICAgfQorfSAKK2Vsc2UgCit7CisgICAgcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG5cbiI7CisgICAgcHJpbnQgIjxQPlVzZSBQb3N0IG9yIEdldCI7Cit9CisKK2ZvcmVhY2ggJHBhaXIgKEBwYWlycykgCit7CisgICAgKCRrZXksICR2YWx1ZSkgPSBzcGxpdCAoLz0vLCAkcGFpcik7CisgICAgJGtleSA9fiB0ci8rLyAvOworICAgICRrZXkgPX4gcy8lKFthLWZBLUYwLTldW2EtZkEtRjAtOV0pL3BhY2soIkMiLCBoZXgoJDEpKS9lZzsKKyAgICAkdmFsdWUgPX4gdHIvKy8gLzsKKyAgICAkdmFsdWUgPX4gcy8lKFthLWZBLUYwLTldW2EtZkEtRjAtOV0pL3BhY2soIkMiLCBoZXgoJDEpKS9lZzsKKyAgICAkdmFsdWUgPX5zLzwhLS0oLnxcbikqLS0+Ly9nOworCQorICAgIGlmICgkZm9ybWRhdGF7JGtleX0pIAorICAgIHsKKyAgICAgICAgJGZvcm1kYXRheyRrZXl9IC49ICIsICR2YWx1ZSI7CisgICAgfSAKKyAgICBlbHNlIAorICAgIHsKKyAgICAgICAgJGZvcm1kYXRheyRrZXl9ID0gJHZhbHVlOworICAgIH0KK30KK30JCisxOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL3N1YnJvdXRpbmVzLmxpYiBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL3N1YnJvdXRpbmVzLmxpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjZhOGFhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvc3Vicm91dGluZXMubGliCkBAIC0wLDAgKzEsMzQgQEAKKyMhL3Vzci9sb2NhbC9iaW4vcGVybDsKKworc3ViIGNhcCB7CisJJGNhcHRleHQgPSAkX1swXTsKKwkkY2FwdGV4dCA9fiB0ci9hLXovQS1aLzsKKwlyZXR1cm4gJGNhcHRleHQ7Cit9CisKK3N1YiB3aGljaCB7CisJJGJyb3dzZXIgPSAkRU5WeydIVFRQX1VTRVJfQUdFTlQnfTsKKwlpZiAoJGJyb3dzZXIgPX4gL01TSUUvKSB7CisJCSRicm93c2VyID0gIkV4cGxvcmVyIjsKKwl9IGVsc2lmICgkYnJvd3NlciA9fi9Nb3ppbGxhLykgeworCQkkYnJvd3NlciA9ICJOZXRzY2FwZSI7CisJfSBlbHNlIHsKKwkJJGJyb3dzZXIgPSAic29tZXRoaW5nIGJlc2lkZXMgTmV0c2NhcGUgYW5kIEV4cGxvcmVyIjsKKwl9Cit9CisKK3N1YiBoZWFkZXIgeworCXByaW50ICI8SFRNTD48SEVBRD48VElUTEU+IjsKKwlwcmludCAiJF9bMF0iOworCXByaW50ICI8VElUTEU+PEhFQUQ+PEJPRFk+IgorfQorCitzdWIgZm9vdGVyIHsKKwlwcmludCAiPEJPRFk+PEhUTUw+IjsKK30KKworc3ViIG1pbWUgeworCXByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuXG4iOworfQorCisxOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL3Rlc3QtY2dpLnBsIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvdGVzdC1jZ2kucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkYTliZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL3Rlc3QtY2dpLnBsCkBAIC0wLDAgKzEsOTMgQEAKKyMhL3Vzci9sb2NhbC9iaW4vcGVybAorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjICAgICAgICAgICAgICAgICBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsICBWZXJzaW9uIDEuMSAgICAgICAgICAgICAgICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgICAgIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCwgMjAwMSAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAqCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCAgd2l0aCBvciB3aXRob3V0IG1vZGktICoKKyMgZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDogICAqCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlICoKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgICAgICAgICAqCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgIGluIGJpbmFyeSAgZm9ybSAgbXVzdCAgcmVwcm9kdWNlIHRoZSAgYWJvdmUgY29weXJpZ2h0ICoKKyMgICAgbm90aWNlLCAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgIGFuZCB0aGUgZm9sbG93aW5nICBkaXNjbGFpbWVyIGluIHRoZSAqCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCAgaWYgYW55LCAqCisjICAgIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyAgc29mdHdhcmUgZGV2ZWxvcGVkICBieSB0aGUgQXBhY2hlICBTb2Z0d2FyZSAqCisjICAgICAgICBGb3VuZGF0aW9uIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLCBpZiAqCisjICAgIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuICAgICAgICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgNC4gVGhlIG5hbWVzICAiVGhlICBKYWthcnRhICBQcm9qZWN0IiwgICJUb21jYXQiLCAgYW5kICAiQXBhY2hlICBTb2Z0d2FyZSAqCisjICAgIEZvdW5kYXRpb24iICBtdXN0IG5vdCBiZSB1c2VkICB0byBlbmRvcnNlIG9yIHByb21vdGUgIHByb2R1Y3RzIGRlcml2ZWQgKgorIyAgICBmcm9tIHRoaXMgIHNvZnR3YXJlIHdpdGhvdXQgIHByaW9yICB3cml0dGVuICBwZXJtaXNzaW9uLiAgRm9yICB3cml0dGVuICoKKyMgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPGFwYWNoZUBhcGFjaGUub3JnPi4gICAgICAgICAgICAgICAgICAgICAgICAqCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiBub3IgbWF5ICoKKyMgICAgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSAqCisjICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUyAqCisjIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCAgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgKgorIyBBTkQgRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFICBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMICoKKyMgVEhFIEFQQUNIRSAgU09GVFdBUkUgIEZPVU5EQVRJT04gT1IgIElUUyBDT05UUklCVVRPUlMgIEJFIExJQUJMRSAgRk9SIEFOWSAqCisjIERJUkVDVCwgIElORElSRUNULCAgIElOQ0lERU5UQUwsICBTUEVDSUFMLCAgRVhFTVBMQVJZLCAgT1IgIENPTlNFUVVFTlRJQUwgKgorIyBEQU1BR0VTIChJTkNMVURJTkcsICBCVVQgTk9UIExJTUlURUQgVE8sICBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTICoKKyMgT1IgU0VSVklDRVM7ICBMT1NTIE9GIFVTRSwgIERBVEEsICBPUiBQUk9GSVRTOyAgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSAqCisjIEhPV0VWRVIgQ0FVU0VEIEFORCAgT04gQU5ZICBUSEVPUlkgIE9GICBMSUFCSUxJVFksICBXSEVUSEVSIElOICBDT05UUkFDVCwgKgorIyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOICoKKyMgQU5ZICBXQVkgIE9VVCBPRiAgVEhFICBVU0UgT0YgIFRISVMgIFNPRlRXQVJFLCAgRVZFTiAgSUYgIEFEVklTRUQgIE9GIFRIRSAqCisjIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyBUaGlzIHNvZnR3YXJlICBjb25zaXN0cyBvZiB2b2x1bnRhcnkgIGNvbnRyaWJ1dGlvbnMgbWFkZSAgYnkgbWFueSBpbmRpdmktICoKKyMgZHVhbHMgb24gYmVoYWxmIG9mIHRoZSAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZSBpbmZvcm1hdGlvbiAqCisjIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworIworCitwcmludCA8PEVPTTsKK0NvbnRlbnQtdHlwZTogdGV4dC9odG1sCisKKzxodG1sPgorPGhlYWQ+PHRpdGxlPkNHSSBUZXN0PC90aXRsZT48L2hlYWQ+Cis8Ym9keT4KKzxoMT5DR0kgVGVzdDwvaDE+Cis8cHJlPgorRU9NCisKK3ByaW50ICJhcmdjIGlzICIgLiAoJCNBUkdWICsgMSkgLiAiXG5cbiI7CisKK3ByaW50ICJhcmd2IGlzXG4iOworCitmb3IoJGkgPSAwOyAkaTwoJCNBUkdWKzEpOyAkaSsrKSB7CisJcHJpbnQgJEFSR1ZbJGldIC4gIlxuIjsKK30KKworcHJpbnQgIlxuIjsKKwkKK2ZvcmVhY2ggJGtleSAoc29ydCBrZXlzICVFTlYpIHsKKworCXByaW50KCIka2V5OiAkRU5WeyRrZXl9XG4iKTsKKworfQorCitwcmludCA8PEVPTTsKKzwvcHJlPgorPC9ib2R5PgorPC9odG1sPgorRU9NCisKK2Nsb3NlIE9VVDsKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvd2ViLnhtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTBkZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMjEyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCisgICAgdmVyc2lvbj0iMi40Ij4KKworICAgIDwhLS0gPT09PT09PT09PSBGaWx0ZXIgRGVmaW5pdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPkdlbmVyaWNGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLldyYXBwZXJGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5yZXF1ZXN0PC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPmdlbmVyaWM8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+cmVzcG9uc2U8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+Z2VuZXJpYzwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKworCisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLldyYXBwZXJGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5yZXF1ZXN0PC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPmh0dHA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+cmVzcG9uc2U8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+aHR0cDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKworCisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPlN0YXRpY0ZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuU3RhdGljRmlsdGVyPC9maWx0ZXItY2xhc3M+CisgICAgPC9maWx0ZXI+CisKKworICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5VcHBlckNhc2VGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlVwcGVyQ2FzZUZpbHRlcjwvZmlsdGVyLWNsYXNzPgorICAgIDwvZmlsdGVyPgorCisKKyAgICA8IS0tID09PT09PT09PT0gRmlsdGVyIE1hcHBpbmdzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gVXNlIFN0YXRpY0ZpbHRlciBvbiAqYWxsKiByZXF1ZXN0cyB0byBjbGVhciBzdGF0aWMgbG9nIC0tPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPlN0YXRpY0ZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRBZ2dyZWdhdGUwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRBZ2dyZWdhdGUwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRDb250ZXh0MDA8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkQ29udGV4dDAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZENvbnRleHQwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWREZWNvZGluZzAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTAyPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTAzPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA0PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA1PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA2PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA3PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA4PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA5PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+VXBwZXJDYXNlRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9GaWx0ZXJSZXF1ZXN0MDE8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRmlsdGVyUmVxdWVzdDAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+VXBwZXJDYXNlRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRmlsdGVyUmVxdWVzdDAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEZpbHRlclJlcXVlc3QwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPlVwcGVyQ2FzZUZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRmlsdGVyUmVzcG9uc2UwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGaWx0ZXJSZXNwb25zZTAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+VXBwZXJDYXNlRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPlVwcGVyQ2FzZUZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRmlsdGVyUmVzcG9uc2UwMi5qc3A8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwMi5qc3A8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5VcHBlckNhc2VGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGaWx0ZXJSZXNwb25zZTAyLmpzcDwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPlVwcGVyQ2FzZUZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRmlsdGVyUmVzcG9uc2UwMy50eHQ8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwMy50eHQ8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5VcHBlckNhc2VGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGaWx0ZXJSZXNwb25zZTAzLnR4dDwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGaWx0ZXJSZXNwb25zZTA0PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEZvcndhcmQwMDwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGb3J3YXJkMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRm9yd2FyZDAzPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEZvcndhcmQwNDwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGb3J3YXJkMDU8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRm9yd2FyZDA5PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEdldEhlYWRlcnMwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkdlbmVyaWNGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHZXRJbnB1dFN0cmVhbTAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEdldExvY2FsZXMwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHZXRMb2NhbGVzMDI8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5HZW5lcmljRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkR2V0UGFyYW1ldGVyMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5HZW5lcmljRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkR2V0UGFyYW1ldGVyTWFwMDA8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkR2V0UXVlcnlTdHJpbmcwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHb2xkZW4wMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRJbmNsdWRlMDA8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkSW5jbHVkZTAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEluY2x1ZGUwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRJbmNsdWRlMDM8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkSW5jbHVkZTA0PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEluY2x1ZGUwOTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRJbmNsdWRlMTA8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkSm5kaTAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEpuZGkwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRMaWZlY3ljbGUwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRMaWZlY3ljbGUwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRMaWZlY3ljbGUwMzwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZWRpcmVjdDAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFJlZmxlY3Rpb24wMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXF1ZXN0MDE8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5HZW5lcmljRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkUmVzZXQwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwMzwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwNDwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwNTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwNjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRTZXNzaW9uMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkU2Vzc2lvbjAyPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFNlc3Npb24wMzwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRTZXNzaW9uMDQ8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkU2Vzc2lvbjA1PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFNlc3Npb24wNjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkdlbmVyaWNGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRTZXRCdWZmZXJTaXplMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5HZW5lcmljRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkU2V0TG9jYWxlMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkWGVyY2VzMDA8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkWGVyY2VzMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkWGVyY2VzMDI8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKworICAgIDwhLS0gPT09PT09PT09PSBMaXN0ZW5lciBEZWZpbml0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPGxpc3RlbmVyPgorICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuQ29udGV4dExpc3RlbmVyMDE8L2xpc3RlbmVyLWNsYXNzPgorICAgIDwvbGlzdGVuZXI+CisKKzwhLS0gQ2FuIG5vdCBydW4gUHJvcGVydHlFZGl0b3IgdGVzdHMgdW5kZXIgc2VjdXJpdHkgbWFuYWdlciB1bmxlc3MKKyAgICAgY2F0YWxpbmEucG9saWN5IGFsbG93cyByZWFkL3dyaXRlIGFjY2VzcyB0byBzeXN0ZW0gcHJvcGVydGllcyAtLT4KKzwhLS0KKyAgICA8bGlzdGVuZXI+CisgICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Db250ZXh0TGlzdGVuZXIwMjwvbGlzdGVuZXItY2xhc3M+CisgICAgPC9saXN0ZW5lcj4KKy0tPgorCisgICAgPGxpc3RlbmVyPgorICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuUmVxdWVzdExpc3RlbmVyMDE8L2xpc3RlbmVyLWNsYXNzPgorICAgIDwvbGlzdGVuZXI+CisKKyAgICA8bGlzdGVuZXI+CisgICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5TZXNzaW9uTGlzdGVuZXIwMTwvbGlzdGVuZXItY2xhc3M+CisgICAgPC9saXN0ZW5lcj4KKworICAgIDxsaXN0ZW5lcj4KKyAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlNlc3Npb25MaXN0ZW5lcjAyPC9saXN0ZW5lci1jbGFzcz4KKyAgICA8L2xpc3RlbmVyPgorCisKKyAgICA8IS0tID09PT09PT09PT0gU2VydmxldCBEZWZpbml0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkFnZ3JlZ2F0ZTAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkFnZ3JlZ2F0ZTAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkFnZ3JlZ2F0ZTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkFnZ3JlZ2F0ZTAyPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkF1dGhlbnRpY2F0aW9uMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuQXV0aGVudGljYXRpb24wMTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5BdXRoZW50aWNhdGlvbjAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkF1dGhlbnRpY2F0aW9uMDI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+QXV0aGVudGljYXRpb24wMzwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5BdXRoZW50aWNhdGlvbjAzPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+CisgICAgICAgICAgICA8cm9sZS1uYW1lPmFsaWFzPC9yb2xlLW5hbWU+CisgICAgICAgICAgICA8cm9sZS1saW5rPnRvbWNhdDwvcm9sZS1saW5rPgorICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkF1dGhlbnRpY2F0aW9uMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPGpzcC1maWxlPi9BdXRoZW50aWNhdGlvbjA0LmpzcDwvanNwLWZpbGU+CisgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KKyAgICAgICAgICAgIDxyb2xlLW5hbWU+YWxpYXM8L3JvbGUtbmFtZT4KKyAgICAgICAgICAgIDxyb2xlLWxpbms+dG9tY2F0PC9yb2xlLWxpbms+CisgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+QXV0aGVudGljYXRpb24wNTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5BdXRoZW50aWNhdGlvbjA1PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkF1dGhlbnRpY2F0aW9uMDY8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuQXV0aGVudGljYXRpb24wNjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Db250ZXh0MDA8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuQ29udGV4dDAwPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjk5PC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Q29udGV4dDAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkNvbnRleHQwMTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Db250ZXh0MDI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuQ29udGV4dDAyPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkRlY29kaW5nMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRGVjb2RpbmcwMTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5FcnJvclBhZ2UwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5FcnJvclBhZ2UwMTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5FcnJvclBhZ2UwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5FcnJvclBhZ2UwMjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5FcnJvclBhZ2UwMzwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5FcnJvclBhZ2UwMzwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5FcnJvclBhZ2UwNDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5FcnJvclBhZ2UwNDwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5FcnJvclBhZ2UwNTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5FcnJvclBhZ2UwNTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5FcnJvclBhZ2UwNjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5FcnJvclBhZ2UwNjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5FcnJvclBhZ2UwNzwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5FcnJvclBhZ2UwNzwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDg8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPGpzcC1maWxlPi9FcnJvclBhZ2UwOC5qc3A8L2pzcC1maWxlPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA5PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxqc3AtZmlsZT4vRXJyb3JQYWdlMDkuanNwPC9qc3AtZmlsZT4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5GaWx0ZXJSZXF1ZXN0MDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRmlsdGVyUmVxdWVzdDAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZpbHRlclJlcXVlc3QwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5GaWx0ZXJSZXF1ZXN0MDI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RmlsdGVyUmVxdWVzdDAyYTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5GaWx0ZXJSZXF1ZXN0MDJhPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZpbHRlclJlc3BvbnNlMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRmlsdGVyUmVzcG9uc2UwMTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5GaWx0ZXJSZXNwb25zZTA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZpbHRlclJlc3BvbnNlMDQ8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RmlsdGVyUmVzcG9uc2UwNGE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRmlsdGVyUmVzcG9uc2UwNGE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDAwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZvcndhcmQwMDwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDBhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZvcndhcmQwMGE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDAwYjwvc2VydmxldC1uYW1lPgorICAgICAgICA8anNwLWZpbGU+L0ZvcndhcmQwMGIuanNwPC9qc3AtZmlsZT4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDBkPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZvcndhcmQwMGQ8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDAwZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8anNwLWZpbGU+L0ZvcndhcmQwMGUuanNwPC9qc3AtZmlsZT4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRm9yd2FyZDAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwMzwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Gb3J3YXJkMDM8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDAzYTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Gb3J3YXJkMDNhPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Gb3J3YXJkMDQ8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA0YTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Gb3J3YXJkMDRhPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNGI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRm9yd2FyZDA0Yjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRm9yd2FyZDA1PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNWE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRm9yd2FyZDA1YTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDViPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZvcndhcmQwNWI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA2PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZvcndhcmQwNjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDZhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZvcndhcmQwNmE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA2Yjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Gb3J3YXJkMDZiPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNzwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Gb3J3YXJkMDc8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA3YTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Gb3J3YXJkMDdhPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwN2I8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRm9yd2FyZDA3Yjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDg8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRm9yd2FyZDA4PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwOGE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRm9yd2FyZDA4YTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDhiPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZvcndhcmQwOGI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA5PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZvcndhcmQwOTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5HZXRIZWFkZXJzMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuR2V0SGVhZGVyczAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkdldElucHV0U3RyZWFtMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuR2V0SW5wdXRTdHJlYW0wMTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5HZXRMb2NhbGVzMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuR2V0TG9jYWxlczAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkdldExvY2FsZXMwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5HZXRMb2NhbGVzMDI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0UGFyYW1ldGVyMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuR2V0UGFyYW1ldGVyMDE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0UGFyYW1ldGVyTWFwMDA8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuR2V0UGFyYW1ldGVyTWFwMDA8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0UXVlcnlTdHJpbmcwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5HZXRRdWVyeVN0cmluZzAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkdvbGRlbjAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkdvbGRlbjAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwMDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5JbmNsdWRlMDA8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAwYTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5JbmNsdWRlMDBhPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwMGI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPGpzcC1maWxlPi9JbmNsdWRlMDBiLmpzcDwvanNwLWZpbGU+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAwZDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5JbmNsdWRlMDBkPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwMGU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPGpzcC1maWxlPi9JbmNsdWRlMDBlLmpzcDwvanNwLWZpbGU+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkluY2x1ZGUwMTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuSW5jbHVkZTAyPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwMmE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuSW5jbHVkZTAyYTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuSW5jbHVkZTAzPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwM2E8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuSW5jbHVkZTAzYTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuSW5jbHVkZTA0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwNGE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuSW5jbHVkZTA0YTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDRiPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkluY2x1ZGUwNGI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTA2YTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5JbmNsdWRlMDZhPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwNzwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5JbmNsdWRlMDc8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTA3YTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5JbmNsdWRlMDdhPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwN2I8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuSW5jbHVkZTA3Yjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDdjPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkluY2x1ZGUwN2M8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTA5PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkluY2x1ZGUwOTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMTA8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuSW5jbHVkZTEwPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUxMGE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuSW5jbHVkZTEwYTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KbmRpMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuSm5kaTAxPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KbmRpMDI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuSm5kaTAyPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkxpZmVjeWNsZTAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkxpZmVjeWNsZTAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkxpZmVjeWNsZTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkxpZmVjeWNsZTAyPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkxpZmVjeWNsZTAzPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkxpZmVjeWNsZTAzPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlJlZGlyZWN0MDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuUmVkaXJlY3QwMTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZWRpcmVjdDAxYTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5SZWRpcmVjdDAxYTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZWZsZWN0aW9uMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuUmVmbGVjdGlvbjAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlJlcXVlc3QwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5SZXF1ZXN0MDE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVzZXQwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5SZXNldDAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlJlc291cmNlczAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlJlc291cmNlczAyPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczAzPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlJlc291cmNlczAzPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlJlc291cmNlczA0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczA1PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlJlc291cmNlczA1PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczA2PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlJlc291cmNlczA2PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc3BvbnNlV3JhcDAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlJlc3BvbnNlV3JhcDAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc3BvbnNlV3JhcDAxYTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5SZXNwb25zZVdyYXAwMWE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVzcG9uc2VXcmFwMDFjPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlJlc3BvbnNlV3JhcDAxYzwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXNzaW9uMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuU2Vzc2lvbjAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlNlc3Npb24wMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5TZXNzaW9uMDI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+U2Vzc2lvbjAzPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlNlc3Npb24wMzwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXNzaW9uMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuU2Vzc2lvbjA0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlNlc3Npb24wNTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5TZXNzaW9uMDU8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+U2Vzc2lvbjA2PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlNlc3Npb24wNjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXRCdWZmZXJTaXplMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuU2V0QnVmZmVyU2l6ZTAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlNldExvY2FsZTAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlNldExvY2FsZTAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlhlcmNlczAwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxqc3AtZmlsZT4vWGVyY2VzMDAuanNwPC9qc3AtZmlsZT4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5YZXJjZXMwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5YZXJjZXMwMTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5YZXJjZXMwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8anNwLWZpbGU+L1hlcmNlczAyLmpzcDwvanNwLWZpbGU+CisgICAgPC9zZXJ2bGV0PgorCisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5pbnZva2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPgorICAgICAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VydmxldHMuSW52b2tlclNlcnZsZXQKKyAgICAgICAgPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmRlYnVnPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPjA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MjwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKworCisgICAgPCEtLSA9PT09PT09PT09IFNlcnZsZXQgTWFwcGluZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+aW52b2tlcjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L3NlcnZsZXQvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8IS0tIE1hcCBDR0kgR2F0ZXdheSBTZXJ2aWNlIGZvciB0aGlzIFdlYiBBcHAgLS0+Cis8IS0tCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5jZ2k8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9jZ2ktYmluLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorLS0+CisKKyAgICA8IS0tIE1hcCBTU0kgU2VydmljZSBmb3IgdGhpcyBXZWIgQXBwIC0tPgorPCEtLQorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+c3NpPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4qLnNodG1sPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKy0tPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5BZ2dyZWdhdGUwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0FnZ3JlZ2F0ZTAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+QWdncmVnYXRlMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkQWdncmVnYXRlMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5BZ2dyZWdhdGUwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0FnZ3JlZ2F0ZTAyPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+QWdncmVnYXRlMDI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkQWdncmVnYXRlMDI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5BdXRoZW50aWNhdGlvbjAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vcHJvdGVjdGVkL0F1dGhlbnRpY2F0aW9uMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5BdXRoZW50aWNhdGlvbjAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vcHJvdGVjdGVkL0F1dGhlbnRpY2F0aW9uMDI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5BdXRoZW50aWNhdGlvbjAzPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vcHJvdGVjdGVkL0F1dGhlbnRpY2F0aW9uMDM8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5BdXRoZW50aWNhdGlvbjA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vcHJvdGVjdGVkL0F1dGhlbnRpY2F0aW9uMDQ8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5BdXRoZW50aWNhdGlvbjA1PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vYWxsb3dlZC9BdXRoZW50aWNhdGlvbjA1PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+QXV0aGVudGljYXRpb24wNTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2Rpc2FsbG93ZWQvQXV0aGVudGljYXRpb24wNTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkF1dGhlbnRpY2F0aW9uMDU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9kaXNhbGxvd2VkL3ByaXZhdGUvQXV0aGVudGljYXRpb24wNTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkF1dGhlbnRpY2F0aW9uMDY8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9hbGxvd2VkL3B1YmxpYy9BdXRoZW50aWNhdGlvbjA2PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+QXV0aGVudGljYXRpb24wNTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2FsbG93ZWQvcHJpdmF0ZS9BdXRoZW50aWNhdGlvbjA1PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Q29udGV4dDAwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vQ29udGV4dDAwPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Q29udGV4dDAwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZENvbnRleHQwMDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkNvbnRleHQwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0NvbnRleHQwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkNvbnRleHQwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRDb250ZXh0MDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Db250ZXh0MDI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Db250ZXh0MDI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Db250ZXh0MDI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkQ29udGV4dDAyPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RGVjb2RpbmcwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0RlY29kaW5nMDEvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkRlY29kaW5nMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRGVjb2RpbmcwMS8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTAyPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwMzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTAzPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTAzPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwNDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA0PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwNTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA1PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA1PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDY8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwNjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA2PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA2PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDc8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwNzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA3PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA3PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDg8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwODwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA4PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA4PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDk8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwOTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA5PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA5PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RmlsdGVyUmVxdWVzdDAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRmlsdGVyUmVxdWVzdDAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RmlsdGVyUmVxdWVzdDAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEZpbHRlclJlcXVlc3QwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZpbHRlclJlcXVlc3QwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZpbHRlclJlcXVlc3QwMi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RmlsdGVyUmVxdWVzdDAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEZpbHRlclJlcXVlc3QwMi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RmlsdGVyUmVxdWVzdDAyYTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZpbHRlclJlcXVlc3QwMmE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5GaWx0ZXJSZXNwb25zZTAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRmlsdGVyUmVzcG9uc2UwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZpbHRlclJlc3BvbnNlMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZpbHRlclJlc3BvbnNlMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9GaWx0ZXJSZXNwb25zZTA0Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5GaWx0ZXJSZXNwb25zZTA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEZpbHRlclJlc3BvbnNlMDQvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZpbHRlclJlc3BvbnNlMDRhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRmlsdGVyUmVzcG9uc2UwNGE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDA8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Gb3J3YXJkMDA8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDA8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRm9yd2FyZDAwPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDAwYTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZvcndhcmQwMGE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDBiPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRm9yd2FyZDAwYjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZvcndhcmQwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGb3J3YXJkMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Gb3J3YXJkMDM8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRm9yd2FyZDAzPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDAzYTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZvcndhcmQwM2E8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Gb3J3YXJkMDQ8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRm9yd2FyZDA0PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA0YTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZvcndhcmQwNGE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDRiPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRm9yd2FyZDA0YjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZvcndhcmQwNTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGb3J3YXJkMDU8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDVhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRm9yd2FyZDA1YTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNWI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Gb3J3YXJkMDViPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDwhLS0gTm8gbWFwcGluZ3MgZm9yIEZvcndhcmQwNiBzZXJpZXMsIHVzaW5nIGludm9rZXIgdG8gYWNjZXNzIHRoZW0gLS0+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNzwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZvcndhcmQwNzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNzwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGb3J3YXJkMDc8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDdhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRm9yd2FyZDA3YTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwN2I8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Gb3J3YXJkMDdiPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA4PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEZvcndhcmQwODwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwOGE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Gb3J3YXJkMDhhPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA4Yjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZvcndhcmQwOGI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDk8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Gb3J3YXJkMDk8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDk8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRm9yd2FyZDA5PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0SGVhZGVyczAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vR2V0SGVhZGVyczAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0SGVhZGVyczAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEdldEhlYWRlcnMwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkdldElucHV0U3RyZWFtMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9HZXRJbnB1dFN0cmVhbTAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0SW5wdXRTdHJlYW0wMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHZXRJbnB1dFN0cmVhbTAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0TG9jYWxlczAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vR2V0TG9jYWxlczAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0TG9jYWxlczAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEdldExvY2FsZXMwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkdldExvY2FsZXMwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0dldExvY2FsZXMwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkdldExvY2FsZXMwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHZXRMb2NhbGVzMDI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5HZXRQYXJhbWV0ZXIwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHZXRQYXJhbWV0ZXIwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkdldFBhcmFtZXRlcjAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vR2V0UGFyYW1ldGVyMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5HZXRQYXJhbWV0ZXIwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHZXRQYXJhbWV0ZXIwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkdldFBhcmFtZXRlck1hcDAwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vR2V0UGFyYW1ldGVyTWFwMDA8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5HZXRQYXJhbWV0ZXJNYXAwMDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHZXRQYXJhbWV0ZXJNYXAwMDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkdldFF1ZXJ5U3RyaW5nMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9HZXRRdWVyeVN0cmluZzAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0UXVlcnlTdHJpbmcwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHZXRRdWVyeVN0cmluZzAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R29sZGVuMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Hb2xkZW4wMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkdvbGRlbjAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEdvbGRlbjAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vSW5jbHVkZTAwPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEluY2x1ZGUwMDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwMGE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9JbmNsdWRlMDBhPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAwYjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0luY2x1ZGUwMGI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9JbmNsdWRlMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkSW5jbHVkZTAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vSW5jbHVkZTAyPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEluY2x1ZGUwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwMmE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9JbmNsdWRlMDJhPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAyYTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRJbmNsdWRlMDJhPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAzPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vSW5jbHVkZTAzPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAzPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEluY2x1ZGUwMzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwM2E8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9JbmNsdWRlMDNhPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vSW5jbHVkZTA0PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEluY2x1ZGUwNDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwNGE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9JbmNsdWRlMDRhPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTA0Yjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0luY2x1ZGUwNGI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDZhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vSW5jbHVkZTA2YTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwNzwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0luY2x1ZGUwNzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwN2E8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9JbmNsdWRlMDdhPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTA3Yjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0luY2x1ZGUwN2I8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDdjPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vSW5jbHVkZTA3YzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwOTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0luY2x1ZGUwOTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwOTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRJbmNsdWRlMDk8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMTA8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9JbmNsdWRlMTAvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUxMDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRJbmNsdWRlMTAvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUxMGE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9JbmNsdWRlMTBhLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KbmRpMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9KbmRpMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KbmRpMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkSm5kaTAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Sm5kaTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vSm5kaTAyPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Sm5kaTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEpuZGkwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkxpZmVjeWNsZTAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vTGlmZWN5Y2xlMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5MaWZlY3ljbGUwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRMaWZlY3ljbGUwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkxpZmVjeWNsZTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vTGlmZWN5Y2xlMDI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5MaWZlY3ljbGUwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRMaWZlY3ljbGUwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkxpZmVjeWNsZTAzPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vTGlmZWN5Y2xlMDM8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5MaWZlY3ljbGUwMzwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRMaWZlY3ljbGUwMzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlZGlyZWN0MDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9SZWRpcmVjdDAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVkaXJlY3QwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZWRpcmVjdDAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVkaXJlY3QwMWE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9SZWRpcmVjdDAxYTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlZGlyZWN0MDFhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFJlZGlyZWN0MDFhPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVmbGVjdGlvbjAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVmbGVjdGlvbjAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVmbGVjdGlvbjAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFJlZmxlY3Rpb24wMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlcXVlc3QwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1JlcXVlc3QwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlcXVlc3QwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXF1ZXN0MDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNldDAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVzZXQwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc2V0MDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkUmVzZXQwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVzb3VyY2VzMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNvdXJjZXMwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVzb3VyY2VzMDI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNvdXJjZXMwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczAzPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVzb3VyY2VzMDM8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNvdXJjZXMwMzwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwMzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVzb3VyY2VzMDQ8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNvdXJjZXMwNDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwNDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczA1PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVzb3VyY2VzMDU8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNvdXJjZXMwNTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwNTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczA2PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVzb3VyY2VzMDY8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNvdXJjZXMwNjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwNjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc3BvbnNlV3JhcDAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVzcG9uc2VXcmFwMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNwb25zZVdyYXAwMWE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9SZXNwb25zZVdyYXAwMWE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNwb25zZVdyYXAwMWM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9SZXNwb25zZVdyYXAwMWM8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXNzaW9uMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9TZXNzaW9uMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXNzaW9uMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkU2Vzc2lvbjAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+U2Vzc2lvbjAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vU2Vzc2lvbjAyPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+U2Vzc2lvbjAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFNlc3Npb24wMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlNlc3Npb24wMzwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1Nlc3Npb24wMzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlNlc3Npb24wMzwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRTZXNzaW9uMDM8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXNzaW9uMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9TZXNzaW9uMDQ8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXNzaW9uMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkU2Vzc2lvbjA0PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+U2Vzc2lvbjA1PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vU2Vzc2lvbjA1PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+U2Vzc2lvbjA1PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFNlc3Npb24wNTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlNlc3Npb24wNjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1Nlc3Npb24wNjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlNlc3Npb24wNjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRTZXNzaW9uMDY8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXRCdWZmZXJTaXplMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9TZXRCdWZmZXJTaXplMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXRCdWZmZXJTaXplMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkU2V0QnVmZmVyU2l6ZTAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+U2V0TG9jYWxlMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9TZXRMb2NhbGUwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlNldExvY2FsZTAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFNldExvY2FsZTAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+WGVyY2VzMDA8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9YZXJjZXMwMDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlhlcmNlczAwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFhlcmNlczAwPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+WGVyY2VzMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9YZXJjZXMwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlhlcmNlczAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFhlcmNlczAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+WGVyY2VzMDI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9YZXJjZXMwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlhlcmNlczAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFhlcmNlczAyPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworCisgICAgPCEtLSA9PT09PT09PT09IFNlc3Npb24gQ29uZmlndXJhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8c2Vzc2lvbi1jb25maWc+CisgICAgICAgIDxzZXNzaW9uLXRpbWVvdXQ+NTwvc2Vzc2lvbi10aW1lb3V0PgorICAgIDwvc2Vzc2lvbi1jb25maWc+CisKKworICAgIDwhLS0gPT09PT09PT09PSBFcnJvciBQYWdlIE1hcHBpbmdzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPGVycm9yLXBhZ2U+CisgICAgICAgIDxlcnJvci1jb2RlPjQxMjwvZXJyb3ItY29kZT4gIDwhLS0gU0NfUFJFQ09ORElUSU9OX0ZBSUxFRCAtLT4KKyAgICAgICAgPGxvY2F0aW9uPi9FcnJvclBhZ2UwMjwvbG9jYXRpb24+CisgICAgPC9lcnJvci1wYWdlPgorCisgICAgPGVycm9yLXBhZ2U+CisgICAgICAgIDxleGNlcHRpb24tdHlwZT5vcmcuYXBhY2hlLnRlc3Rlci5UZXN0ZXJFeGNlcHRpb248L2V4Y2VwdGlvbi10eXBlPgorICAgICAgICA8bG9jYXRpb24+L0Vycm9yUGFnZTA0PC9sb2NhdGlvbj4KKyAgICA8L2Vycm9yLXBhZ2U+CisKKyAgICA8ZXJyb3ItcGFnZT4KKyAgICAgICAgPGV4Y2VwdGlvbi10eXBlPmphdmEubGFuZy5Bcml0aG1ldGljRXhjZXB0aW9uPC9leGNlcHRpb24tdHlwZT4KKyAgICAgICAgPGxvY2F0aW9uPi9FcnJvclBhZ2UwNjwvbG9jYXRpb24+CisgICAgPC9lcnJvci1wYWdlPgorCisgICAgPGVycm9yLXBhZ2U+CisgICAgICAgIDxleGNlcHRpb24tdHlwZT5qYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uPC9leGNlcHRpb24tdHlwZT4KKyAgICAgICAgPGxvY2F0aW9uPi9FcnJvclBhZ2UwNi5qc3A8L2xvY2F0aW9uPgorICAgIDwvZXJyb3ItcGFnZT4KKworICAgIDxlcnJvci1wYWdlPgorICAgICAgICA8ZXhjZXB0aW9uLXR5cGU+amF2YS5sYW5nLk51bWJlckZvcm1hdEV4Y2VwdGlvbjwvZXhjZXB0aW9uLXR5cGU+CisgICAgICAgIDxsb2NhdGlvbj4vRXJyb3JQYWdlMDYuaHRtbDwvbG9jYXRpb24+CisgICAgPC9lcnJvci1wYWdlPgorCisKKyAgICA8IS0tID09PT09PT09PT0gU2VjdXJpdHkgQ29uc3RyYWludHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDxzZWN1cml0eS1jb25zdHJhaW50PgorICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+R2VuZXJhbCBQcm90ZWN0ZWQgQXJlYTwvd2ViLXJlc291cmNlLW5hbWU+CisgICAgICAgICAgICA8dXJsLXBhdHRlcm4+L3Byb3RlY3RlZC8qPC91cmwtcGF0dGVybj4KKyAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICAgICAgPGF1dGgtY29uc3RyYWludD4KKyAgICAgICAgICAgIDxyb2xlLW5hbWU+dG9tY2F0PC9yb2xlLW5hbWU+CisgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgorICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KKworICAgIDxzZWN1cml0eS1jb25zdHJhaW50PgorICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+QWxsIFVzZXJzIEFsbG93ZWQgQXJlYTwvd2ViLXJlc291cmNlLW5hbWU+CisgICAgICAgICAgICA8dXJsLXBhdHRlcm4+L2FsbG93ZWQvKjwvdXJsLXBhdHRlcm4+CisgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICAgIDxhdXRoLWNvbnN0cmFpbnQ+CisgICAgICAgICAgICA8cm9sZS1uYW1lPio8L3JvbGUtbmFtZT4KKyAgICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+CisgICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgorCisgICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT5ObyBVc2VycyBBbGxvd2VkIEFyZWE8L3dlYi1yZXNvdXJjZS1uYW1lPgorICAgICAgICAgICAgPHVybC1wYXR0ZXJuPi9kaXNhbGxvd2VkLyo8L3VybC1wYXR0ZXJuPgorICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgICAgICA8YXV0aC1jb25zdHJhaW50PgorICAgICAgICA8L2F1dGgtY29uc3RyYWludD4KKyAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT5SZWFsbHkgTm8gVXNlcnMgQWxsb3dlZCBBcmVhPC93ZWItcmVzb3VyY2UtbmFtZT4KKyAgICAgICAgICAgIDx1cmwtcGF0dGVybj4vZGlzYWxsb3dlZC9wcml2YXRlLyo8L3VybC1wYXR0ZXJuPgorICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgICAgICA8YXV0aC1jb25zdHJhaW50PgorICAgICAgICA8L2F1dGgtY29uc3RyYWludD4KKyAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT5SZWFsbHkgTm8gVXNlcnMgQWxsb3dlZCBBcmVhPC93ZWItcmVzb3VyY2UtbmFtZT4KKyAgICAgICAgICAgIDx1cmwtcGF0dGVybj4vZGlzYWxsb3dlZC9wcml2YXRlLyo8L3VybC1wYXR0ZXJuPgorICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgICAgICA8YXV0aC1jb25zdHJhaW50PgorICAgICAgICAgICAgPHJvbGUtbmFtZT4qPC9yb2xlLW5hbWU+CisgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgorICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KKworICAgIDxzZWN1cml0eS1jb25zdHJhaW50PgorICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+QWxsIFVzZXJzIEFsbG93ZWQgQXJlYTwvd2ViLXJlc291cmNlLW5hbWU+CisgICAgICAgICAgICA8dXJsLXBhdHRlcm4+L2FsbG93ZWQvcHVibGljLyo8L3VybC1wYXR0ZXJuPgorICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgICAgICA8YXV0aC1jb25zdHJhaW50PgorICAgICAgICAgICAgPHJvbGUtbmFtZT4qPC9yb2xlLW5hbWU+CisgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgorICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KKyAgICA8c2VjdXJpdHktY29uc3RyYWludD4KKyAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPkFsbCBVc2VycyBBbGxvd2VkIEFyZWE8L3dlYi1yZXNvdXJjZS1uYW1lPgorICAgICAgICAgICAgPHVybC1wYXR0ZXJuPi9hbGxvd2VkL3B1YmxpYy8qPC91cmwtcGF0dGVybj4KKyAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT5BbGwgVXNlcnMgQWxsb3dlZCBBcmVhPC93ZWItcmVzb3VyY2UtbmFtZT4KKyAgICAgICAgICAgIDx1cmwtcGF0dGVybj4vYWxsb3dlZC9wcml2YXRlLyo8L3VybC1wYXR0ZXJuPgorICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgICAgICA8YXV0aC1jb25zdHJhaW50PgorICAgICAgICAgICAgPHJvbGUtbmFtZT4qPC9yb2xlLW5hbWU+CisgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgorICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KKyAgICA8c2VjdXJpdHktY29uc3RyYWludD4KKyAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPkFsbCBVc2VycyBBbGxvd2VkIEFyZWE8L3dlYi1yZXNvdXJjZS1uYW1lPgorICAgICAgICAgICAgPHVybC1wYXR0ZXJuPi9hbGxvd2VkL3ByaXZhdGUvKjwvdXJsLXBhdHRlcm4+CisgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICAgIDxhdXRoLWNvbnN0cmFpbnQ+CisgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgorICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KKworICAgIDxsb2dpbi1jb25maWc+CisgICAgICAgIDxhdXRoLW1ldGhvZD5CQVNJQzwvYXV0aC1tZXRob2Q+CisgICAgICAgIDxyZWFsbS1uYW1lPkF1dGhlbnRpY2F0aW9uIFNlcnZsZXQ8L3JlYWxtLW5hbWU+CisgICAgPC9sb2dpbi1jb25maWc+CisKKyAgICA8c2VjdXJpdHktcm9sZT4KKyAgICAgICAgPGRlc2NyaXB0aW9uPlNlY3VyaXR5IHJvbGUgd2UgYXJlIHRlc3RpbmcgZm9yPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPHJvbGUtbmFtZT50b21jYXQ8L3JvbGUtbmFtZT4KKyAgICA8L3NlY3VyaXR5LXJvbGU+CisKKworICAgIDwhLS0gPT09PT09PT09PSBFbnZpcm9ubWVudCBFbnRyaWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPGVudi1lbnRyeT4KKyAgICAgICAgPGVudi1lbnRyeS1uYW1lPmJvb2xlYW5FbnRyeTwvZW52LWVudHJ5LW5hbWU+CisgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dHJ1ZTwvZW52LWVudHJ5LXZhbHVlPgorICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgorICAgIDwvZW52LWVudHJ5PgorCisgICAgPGVudi1lbnRyeT4KKyAgICAgICAgPGVudi1lbnRyeS1uYW1lPmJ5dGVFbnRyeTwvZW52LWVudHJ5LW5hbWU+CisgICAgICAgIDxlbnYtZW50cnktdmFsdWU+MTIzPC9lbnYtZW50cnktdmFsdWU+CisgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+CisgICAgPC9lbnYtZW50cnk+CisKKyAgICA8ZW52LWVudHJ5PgorICAgICAgICA8ZW52LWVudHJ5LW5hbWU+ZG91YmxlRW50cnk8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPjEyMy40NTwvZW52LWVudHJ5LXZhbHVlPgorICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+CisgICAgPC9lbnYtZW50cnk+CisKKyAgICA8ZW52LWVudHJ5PgorICAgICAgICA8ZW52LWVudHJ5LW5hbWU+ZmxvYXRFbnRyeTwvZW52LWVudHJ5LW5hbWU+CisgICAgICAgIDxlbnYtZW50cnktdmFsdWU+NTQuMzI8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+CisgICAgPC9lbnYtZW50cnk+CisKKyAgICA8ZW52LWVudHJ5PgorICAgICAgICA8ZW52LWVudHJ5LW5hbWU+aW50ZWdlckVudHJ5PC9lbnYtZW50cnktbmFtZT4KKyAgICAgICAgPGVudi1lbnRyeS12YWx1ZT4xMjM0NTwvZW52LWVudHJ5LXZhbHVlPgorICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgorICAgIDwvZW52LWVudHJ5PgorCisgICAgPGVudi1lbnRyeT4KKyAgICAgICAgPGVudi1lbnRyeS1uYW1lPmxvbmdFbnRyeTwvZW52LWVudHJ5LW5hbWU+CisgICAgICAgIDxlbnYtZW50cnktdmFsdWU+NTQzMjE8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KKyAgICA8L2Vudi1lbnRyeT4KKworICAgIDxlbnYtZW50cnk+CisgICAgICAgIDxlbnYtZW50cnktbmFtZT5zdHJpbmdFbnRyeTwvZW52LWVudHJ5LW5hbWU+CisgICAgICAgIDxlbnYtZW50cnktdmFsdWU+U3RyaW5nIFZhbHVlPC9lbnYtZW50cnktdmFsdWU+CisgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KKyAgICA8L2Vudi1lbnRyeT4KKworICAgIDxlbnYtZW50cnk+CisgICAgICAgIDxlbnYtZW50cnktbmFtZT5uZXN0ZWQvbmVzdGVkRW50cnk8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPk5lc3RlZCBWYWx1ZTwvZW52LWVudHJ5LXZhbHVlPgorICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+CisgICAgPC9lbnYtZW50cnk+CisKKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dyYXBwZWRGaWx0ZXJSZXNwb25zZTAyLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dyYXBwZWRGaWx0ZXJSZXNwb25zZTAyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWIzNjM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV3JhcHBlZEZpbHRlclJlc3BvbnNlMDIuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPkZpbHRlclJlc3BvbnNlMDIgUEFTU0VECmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwMy50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1ZDIyMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dyYXBwZWRGaWx0ZXJSZXNwb25zZTAzLnR4dApAQCAtMCwwICsxIEBACitGaWx0ZXJSZXNwb25zZTAzIFBBU1NFRApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvWGVyY2VzMDAuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvWGVyY2VzMDAuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OTQxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9YZXJjZXMwMC5qc3AKQEAgLTAsMCArMSw4IEBACis8IS0tIFRoaXMgRmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBqc3AyWE1MIGNvbnZlcnRlciB0b29sIC0tPiAKKzwhLS0gV3JpdHRlbiBCeSBSYW1lc2ggTWFuZGF2YS9TYW50b3NoIFNpbmdoIC0tPgorPGpzcDpyb290Cit4bWxuczpqc3A9Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiIHZlcnNpb249IjEuMiIKKz48anNwOmRpcmVjdGl2ZS5wYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIgorLz48anNwOnRleHQ+PCFbQ0RBVEFbWGVyY2VzMDAgUEFTU0VEXV0+PC9qc3A6dGV4dD4KKzwvanNwOnJvb3Q+CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1hlcmNlczAxLnhtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1hlcmNlczAxLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWJiZWUxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvWGVyY2VzMDEueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cGVyc29ubmVsPgorCisgIDxwZXJzb24gaWQ9IkJpZy5Cb3NzIj4KKyAgICA8bmFtZT48ZmFtaWx5PkJvc3M8L2ZhbWlseT4gPGdpdmVuPkJpZzwvZ2l2ZW4+PC9uYW1lPgorICAgIDxlbWFpbD5jaGllZkBmb28uY29tPC9lbWFpbD4KKyAgICA8bGluayBzdWJvcmRpbmF0ZXM9Im9uZS53b3JrZXIgdHdvLndvcmtlciB0aHJlZS53b3JrZXIgZm91ci53b3JrZXIgZml2ZS53b3JrZXIiLz4KKyAgPC9wZXJzb24+CisKKyAgPHBlcnNvbiBpZD0ib25lLndvcmtlciI+CisgICAgPG5hbWU+PGZhbWlseT5Xb3JrZXI8L2ZhbWlseT4gPGdpdmVuPk9uZTwvZ2l2ZW4+PC9uYW1lPgorICAgIDxlbWFpbD5vbmVAZm9vLmNvbTwvZW1haWw+CisgICAgPGxpbmsgbWFuYWdlcj0iQmlnLkJvc3MiLz4KKyAgPC9wZXJzb24+CisKKyAgPHBlcnNvbiBpZD0idHdvLndvcmtlciI+CisgICAgPG5hbWU+PGZhbWlseT5Xb3JrZXI8L2ZhbWlseT4gPGdpdmVuPlR3bzwvZ2l2ZW4+PC9uYW1lPgorICAgIDxlbWFpbD50d29AZm9vLmNvbTwvZW1haWw+CisgICAgPGxpbmsgbWFuYWdlcj0iQmlnLkJvc3MiLz4KKyAgPC9wZXJzb24+CisKKyAgPHBlcnNvbiBpZD0idGhyZWUud29ya2VyIj4KKyAgICA8bmFtZT48ZmFtaWx5PldvcmtlcjwvZmFtaWx5PiA8Z2l2ZW4+VGhyZWU8L2dpdmVuPjwvbmFtZT4KKyAgICA8ZW1haWw+dGhyZWVAZm9vLmNvbTwvZW1haWw+CisgICAgPGxpbmsgbWFuYWdlcj0iQmlnLkJvc3MiLz4KKyAgPC9wZXJzb24+CisKKyAgPHBlcnNvbiBpZD0iZm91ci53b3JrZXIiPgorICAgIDxuYW1lPjxmYW1pbHk+V29ya2VyPC9mYW1pbHk+IDxnaXZlbj5Gb3VyPC9naXZlbj48L25hbWU+CisgICAgPGVtYWlsPmZvdXJAZm9vLmNvbTwvZW1haWw+CisgICAgPGxpbmsgbWFuYWdlcj0iQmlnLkJvc3MiLz4KKyAgPC9wZXJzb24+CisKKyAgPHBlcnNvbiBpZD0iZml2ZS53b3JrZXIiPgorICAgIDxuYW1lPjxmYW1pbHk+V29ya2VyPC9mYW1pbHk+IDxnaXZlbj5GaXZlPC9naXZlbj48L25hbWU+CisgICAgPGVtYWlsPmZpdmVAZm9vLmNvbTwvZW1haWw+CisgICAgPGxpbmsgbWFuYWdlcj0iQmlnLkJvc3MiLz4KKyAgPC9wZXJzb24+CisKKzwvcGVyc29ubmVsPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvWGVyY2VzMDIuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvWGVyY2VzMDIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMTg5ODgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9YZXJjZXMwMi5qc3AKQEAgLTAsMCArMSBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iJT5YZXJjZXMwMiBQQVNTRUQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9FbmNvZGluZzAxLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9FbmNvZGluZzAxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTM3ZDhkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0VuY29kaW5nMDEudHh0CkBAIC0wLDAgKzEsNSBAQAorCisKKworPGgyPlRlc3QgQ2hhcmFjdGVyPC9oMj4KKzxoMj6LmyBVbmljb2RlID0gOWI1YTwvaHI+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vRW5jb2RpbmcwMi50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vRW5jb2RpbmcwMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjNzA3NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9FbmNvZGluZzAyLnR4dApAQCAtMCwwICsxLDkgQEAKKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+RW5jb2RpbmcwMi5qc3A8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorVGhpcyBpcyBsZWdhbCBpbiB0aGUgc3BlYzo8YnI+CitKb2Ugc2FpZCAlPiBmb28uCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vRW5jb2RpbmcwMy50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vRW5jb2RpbmcwMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM0NzYyOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9FbmNvZGluZzAzLnR4dApAQCAtMCwwICsxLDkgQEAKKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+RW5jb2RpbmcwMy5qc3A8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorVGhpcyBpcyBub3QgcmVjb2duaXplZCBhcyBhIGRlbGltaXRlciBlaXRoZXI6PGJyPgorSm9lIHNhaWQgJVw+IGJhci4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9Hb2xkZW4wMS50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vR29sZGVuMDEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MDczNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vR29sZGVuMDEudHh0CkBAIC0wLDAgKzEsMyBAQAorVGhpcyBpcyB0aGUKK2ZpcnN0IGdvbGRlbiBmaWxlCit0byBiZSB0ZXN0ZWQuCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vSW5jbHVkZTA2LnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9JbmNsdWRlMDYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhY2VmNzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vSW5jbHVkZTA2LnR4dApAQCAtMCwwICsxLDUgQEAKKz09PT09PT09PT0KK0luY2x1ZGUwNmEgb3V0cHV0Cis9PT09PT09PT09CitJbmNsdWRlMDZiLmpzcCBvdXRwdXQKKz09PT09PT09PT0KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9JbmNsdWRlMDcudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0luY2x1ZGUwNy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2ZDI0YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9JbmNsdWRlMDcudHh0CkBAIC0wLDAgKzEsNCBAQAorT3V0cHV0IGZyb20gSW5jbHVkZTA3CitPdXRwdXQgZnJvbSBJbmNsdWRlMDdiCitPdXRwdXQgZnJvbSBJbmNsdWRlMDdjCitPdXRwdXQgZnJvbSBJbmNsdWRlMDcKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9Kc3BEb2MwMS50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vSnNwRG9jMDEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhN2JiNjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vSnNwRG9jMDEudHh0CkBAIC0wLDAgKzEgQEAKKzxhPnRleHQ8Yi8+PC9hPjxhPnRleHQ8Yj48L2I+PC9hPjxjPjxkPnRleHQ8L2Q+PC9jPjxjPjxkPnRleHQ8L2Q+PC9jPjxlPjxmLz50ZXh0PGYvPjwvZT48ZT48Zj48L2Y+dGV4dDxmPjwvZj48L2U+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vSnNwRG9jMDIudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0pzcERvYzAyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWJjM2JkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0pzcERvYzAyLnR4dApAQCAtMCwwICsxLDkgQEAKKzxodG1sPjxoZWFkPjx0aXRsZT5FeGFtcGxlIEpTUCBpbiBYTUwgZm9ybWF0PC90aXRsZT48L2hlYWQ+PGJvZHk+CitUaGlzIGlzIHRoZSBvdXRwdXQgb2YgYSBzaW1wbGUgSlNQIHVzaW5nIFhNTCBmb3JtYXQuIAorPGJyLz48ZGl2PlVzZSBhIGpzcDpzY3JpcHRsZXQgdG8gbG9vcCBmcm9tIDEgdG8gMTA6IDwvZGl2PjEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwCisgIDxicj48YnI+Cis8ZGl2IGFsaWduPSJsZWZ0Ij4KKyAgVXNlIGEganNwOmV4cHJlc3Npb24gdG8gd3JpdGUgc29tZXRoaW5nOiAKKyAgZm9vPC9kaXY+CisgIDxwPlRoaXMgc2VudGVuY2UgaXMgZW5jbG9zZWQgaW4gYSBqc3A6dGV4dCBlbGVtZW50LjwvcD4KKzwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0pzcEluY2x1ZGUwMS50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vSnNwSW5jbHVkZTAxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2U3ZWIyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0pzcEluY2x1ZGUwMS50eHQKQEAgLTAsMCArMSw1IEBACitUaGlzIGlzIGJlZm9yZSB0aGUgaW5jbHVkZQorVGhpcyBpcyB0aGUgaW5jbHVkZQorCitUaGlzIGlzIGFmdGVyIHRoZSBpbmNsdWRlCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9Kc3BJbmNsdWRlMDFhLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9Kc3BJbmNsdWRlMDFhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGJiMjgyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0pzcEluY2x1ZGUwMWEudHh0CkBAIC0wLDAgKzEsNiBAQAorVGhpcyBpcyBiZWZvcmUgdGhlIGluY2x1ZGUKK0luY2x1ZGUwMGEgUEFTU0VEU2Vzc2lvbkxpc3RlbmVyMDE6IHNlc3Npb25DcmVhdGVkKCkKK1Nlc3Npb25MaXN0ZW5lcjAyOiBzZXNzaW9uQ3JlYXRlZCgpCisKK1RoaXMgaXMgYWZ0ZXIgdGhlIGluY2x1ZGUKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0pzcEluY2x1ZGUwMi50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vSnNwSW5jbHVkZTAyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2U3ZWIyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0pzcEluY2x1ZGUwMi50eHQKQEAgLTAsMCArMSw1IEBACitUaGlzIGlzIGJlZm9yZSB0aGUgaW5jbHVkZQorVGhpcyBpcyB0aGUgaW5jbHVkZQorCitUaGlzIGlzIGFmdGVyIHRoZSBpbmNsdWRlCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9Kc3BJbmNsdWRlMDJhLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9Kc3BJbmNsdWRlMDJhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGJiMjgyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0pzcEluY2x1ZGUwMmEudHh0CkBAIC0wLDAgKzEsNiBAQAorVGhpcyBpcyBiZWZvcmUgdGhlIGluY2x1ZGUKK0luY2x1ZGUwMGEgUEFTU0VEU2Vzc2lvbkxpc3RlbmVyMDE6IHNlc3Npb25DcmVhdGVkKCkKK1Nlc3Npb25MaXN0ZW5lcjAyOiBzZXNzaW9uQ3JlYXRlZCgpCisKK1RoaXMgaXMgYWZ0ZXIgdGhlIGluY2x1ZGUKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1Byb3BlcnR5MDEudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1Byb3BlcnR5MDEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNDQwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vUHJvcGVydHkwMS50eHQKQEAgLTAsMCArMSwxMCBAQAorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5Qcm9wZXJ0eTAxLmpzcCAtIFBvc2l0aXZlIFByb3BlcnR5RWRpdG9yIFRlc3Q8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorCisKK0RhdGUgcHJvcGVydHkgaXMgJzIwMDEtMDctMjUnLgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDEudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MGNiYWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZGl0aW9uYWwwMS50eHQKQEAgLTAsMCArMSw2IEBACitCZWZvcmUgaWYgYmxvY2suCisKKwordGVzdCA9IHZhbHVlMQorCitBZnRlciBpZiBibG9jay4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25kaXRpb25hbDAyLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25kaXRpb25hbDAyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTcwMWJiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDIudHh0CkBAIC0wLDAgKzEsNiBAQAorQmVmb3JlIGlmIGJsb2NrLgorCisKK3Rlc3QgPSB2YWx1ZTIKKworQWZ0ZXIgaWYgYmxvY2suCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZGl0aW9uYWwwMy50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZGl0aW9uYWwwMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxNDJjMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25kaXRpb25hbDAzLnR4dApAQCAtMCwwICsxLDYgQEAKK0JlZm9yZSBpZiBibG9jay4KKworCit0ZXN0ID0gInVucXVvdGVkIG11bHRpLXdvcmQgdmFsdWUiCisKK0FmdGVyIGlmIGJsb2NrLgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDQudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MzdjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZGl0aW9uYWwwNC50eHQKQEAgLTAsMCArMSw2IEBACisKKworCisKK3RydWUKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDUudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMzU2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZGl0aW9uYWwwNS50eHQKQEAgLTAsMCArMSw2IEBACisKKworCisKK2ZhbHNlCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25kaXRpb25hbDA2LnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25kaXRpb25hbDA2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjliOTNmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDYudHh0CkBAIC0wLDAgKzEsOCBAQAorCisKKworCisKK25vdCBvbmUKKworCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZGl0aW9uYWwwNy50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZGl0aW9uYWwwNy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczMzI4NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25kaXRpb25hbDA3LnR4dApAQCAtMCwwICsxLDggQEAKKworCisKKworCitub3QgdHdvCisKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDgudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYmVkODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZGl0aW9uYWwwOC50eHQKQEAgLTAsMCArMSw1IEBACisKKworCisKK3R3bwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmZpZzAxLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25maWcwMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJmM2M2MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25maWcwMS50eHQKQEAgLTAsMCArMSwyIEBACisKK2Vycm1zZzpTb3JyeSB0aGlzIGNvbW1hbmQgd29uJ3Qgd29yay4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25maWcwMy50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZmlnMDMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYjkyYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZmlnMDMudHh0CkBAIC0wLDAgKzEsNCBAQAorCiszNAorCisgICAxawpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUV4ZWNDR0kudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUV4ZWNDR0kudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYjVhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJRXhlY0NHSS50eHQKQEAgLTAsMCArMSw0MSBAQAorPGh0bWw+IAorICA8aGVhZD4gCisgPHRpdGxlPmV4ZWMgY29tbWFuZCAgdGVzdCBleGFtcGxlcyA8L3RpdGxlPiAKKyA8L2hlYWQ+IAorIDxib2R5PgorCisgVGhlc2UgYXJlIHRoZSBkYXlzIG9mIHRoZSB3ZWVrOjxwPk1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXkgU3VuZGF5PGJyPgorCisgPEZPTlQgU0laRT0rMj5JZiB5b3UgYWRkIG9uZSB0byB5b3VyIG51bWJlciwgdGhlIHJlc3VsdCBpcyA8Qj4xMDM8L0I+PFA+SWYgeW91IGFkZCA1IHRvIHRoYXQsIHRoZSByZXN1bHQgaXMgPEI+MTA4PC9CPjwvRk9OVD48YnI+CisKKyA8UD5PbiBXZWRuZXNkYXksIHdlIGhhdmUgdG8gbW9wPFA+T24gRnJpZGF5LCB3ZSBoYXZlIHRvIHdhc2ggd2luZG93czxQPk9uIE1vbmRheSwgd2UgaGF2ZSB0byB2YWN1dW08YnI+CisKKyBDb25ncmF0dWxhdGlvbnMhIFlvdXIgbWFycmllZCBuYW1lIHdvdWxkIGJlIGphbmUgc21pdGguPGJyPgorCisgVGhlc2UgYXJlIHRoZSBkYXlzIG9mIHRoZSB3ZWVrOjxQPk1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXkgU3VuZGF5PGJyPgorCisgPFA+U3RhcnRpbmcgY291bnRkb3duLi4uMTAuLi4gOS4uLiA4Li4uIDcuLi4gNi4uLiA1Li4uIDQuLi4gMy4uLiAyLi4uIDEuLi4gS0FCT09NITxicj4KKworIFlvdSBhdGUgc3BpbmFjaCwgc28geW91IGdldCBkZXNzZXJ0ITxicj4KKworIE5vIHNwaW5hY2gsIG5vIGRlc3NlcnQhPGJyPgorCisgPFA+WW91IGVudGVyZWQgMiB3aXRoIGFuIGV4cG9uZW50IG9mIDQ8UD4yIHJhaXNlZCB0byB0aGUgNCBwb3dlciBpcyAxNi48YnI+CisKKyA8UD5TdGFydGluZyBjb3VudGRvd24uLi4xMC4uLiA5Li4uIDguLi4gNy4uLiA2Li4uIDUuLi4gNC4uLiAzLi4uIDIuLi4gMS4uLiBLQUJPT00hPGJyPgorCisgVGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayBpcyBTdW5kYXk8UD5UaGUgdGhpcmQgZGF5IG9mIHRoZSB3ZWVrIGlzIFR1ZXNkYXk8YnI+CisKKyAJPFRpdGxlPiBIZWxsbyBXb3JsZCEgPC9UaXRsZT4KKwk8SDE+CUhlbGxvIFdvcmxkISA8L0gxPgorPGJyPgorCisgWW91IGF0ZSBzcGluYWNoLCBzbyB5b3UgZ2V0IGRlc3NlcnQhCis8YnI+CisKKyBZb3VyIG51bWJlciBpbmNyZW1lbnRlZCBieSAxIGlzIDg8QlI+WW91ciBudW1iZXIsIGluY3JlbWVudGVkIGFnYWluIGJ5IDEsIGlzIG5vdyA5LiBJZiB3ZSBzdG9yZSB0aGF0IG9wZXJhdGlvbiwgaXRzIHZhbHVlIGlzIGFsc28gOS48SFI+TGV0J3Mgc3RhcnQgb3Zlciwgd2l0aCB5b3VyIG9yaWdpbmFsIG51bWJlciA3PEJSPkFnYWluLCB5b3VyIG51bWJlciBpbmNyZW1lbnRlZCBieSAxIGlzIDg8QlI+Tm93IHdlIHN0b3JlIHRoZSB2YWx1ZSBvZiB5b3VyIG51bWJlciBpbiBhIHNlY29uZCB2YXJpYWJsZSwgd2hpY2ggaXMgbm93IGVxdWFsIHRvIDgsIGFuZCB0aGVuIHdlIGluY3JlbWVudCB5b3VyIG51bWJlciBhZ2Fpbi4gSXQncyBub3cgOS48YnI+CisKKyBUaGUgbnVtYmVycyB5b3UgZW50ZXJlZCB3ZXJlOjxMST4yODk8UD5UaGUgc3F1YXJlIHJvb3RzIG9mIHRob3NlIG51bWJlcnMgYXJlOiA8TEk+MTc8YnI+CisKKyA8L2JvZHk+IAorIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lGc2l6ZTAyLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lGc2l6ZTAyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTY0YTI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUZzaXplMDIudHh0CkBAIC0wLDAgKzEgQEAKKyAgIDFrCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJSW5jbHVkZTAxLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lJbmNsdWRlMDEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTM3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJSW5jbHVkZTAxLnR4dApAQCAtMCwwICsxIEBACisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lJbmNsdWRlMDIudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUluY2x1ZGUwMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjOWQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lJbmNsdWRlMDIudHh0CkBAIC0wLDAgKzEgQEAKK1RoaXMgaXMgQ29udGVudCBvZiAiaW5jbHVkZW1lLnR4dCIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lJbmNsdWRlMDMudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUluY2x1ZGUwMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwNTQyMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lJbmNsdWRlMDMudHh0CkBAIC0wLDAgKzEsNCBAQAorVGhpcyBpcyBDb250ZW50IG9mICJpbmNsdWRlbWUudHh0IgorVGhpcyBpcyBDb250ZW50IG9mICJpbmNsdWRlbWUudHh0IgorCitUaGlzIGlzIENvbnRlbnQgb2YgImluY2x1ZGVtZS50eHQiCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJVmFyU3ViMDEudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSVZhclN1YjAxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGRlYzY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSVZhclN1YjAxLnR4dApAQCAtMCwwICsxLDMgQEAKKworL1NTSVZhclN1YjAxLnNodG1sCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lWYXJTdWIwMi50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJVmFyU3ViMDIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMTdmMTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJVmFyU3ViMDIudHh0CkBAIC0wLDAgKzEsNCBAQAorCisKK3ZhbHVlIG9mIHRlc3QKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSVZhclN1YjAzLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lWYXJTdWIwMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1MDVlNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lWYXJTdWIwMy50eHQKQEAgLTAsMCArMSw1IEBACisKKworCit2YWx1ZSBvZiB0ZXN0IHZhbHVlIG9mIHRlc3QyCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lWYXJTdWIwNC50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJVmFyU3ViMDQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDc1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJVmFyU3ViMDQudHh0CkBAIC0wLDAgKzEsNSBAQAorCisKKwordmFsdWUgb2YgdGVzdHx2YWx1ZSBvZiB0ZXN0MgorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJVmFyU3ViMDUudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSVZhclN1YjA1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGZiM2ExCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSVZhclN1YjA1LnR4dApAQCAtMCwwICsxLDMgQEAKKworCit2YWx1ZSBvZiB0ZXN0XCR7dGVzdDJ9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU2Vzc2lvbjA1LnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TZXNzaW9uMDUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MjhmN2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU2Vzc2lvbjA1LnR4dApAQCAtMCwwICsxLDEwIEBACitTZXNzaW9uTGlzdGVuZXIwMTogc2Vzc2lvbkNyZWF0ZWQoKQorU2Vzc2lvbkxpc3RlbmVyMDI6IHNlc3Npb25DcmVhdGVkKCkKK1Nlc3Npb25MaXN0ZW5lcjAxOiBhdHRyaWJ1dGVBZGRlZChhdHRyaWJ1dGUxLHZhbHVlMSkKK1Nlc3Npb25MaXN0ZW5lcjAyOiBhdHRyaWJ1dGVBZGRlZChhdHRyaWJ1dGUxLHZhbHVlMSkKK1Nlc3Npb25MaXN0ZW5lcjAxOiBhdHRyaWJ1dGVSZXBsYWNlZChhdHRyaWJ1dGUxLHZhbHVlMSkKK1Nlc3Npb25MaXN0ZW5lcjAyOiBhdHRyaWJ1dGVSZXBsYWNlZChhdHRyaWJ1dGUxLHZhbHVlMSkKK1Nlc3Npb25MaXN0ZW5lcjAxOiBhdHRyaWJ1dGVSZW1vdmVkKGF0dHJpYnV0ZTEsdmFsdWUyKQorU2Vzc2lvbkxpc3RlbmVyMDI6IGF0dHJpYnV0ZVJlbW92ZWQoYXR0cmlidXRlMSx2YWx1ZTIpCitTZXNzaW9uTGlzdGVuZXIwMjogc2Vzc2lvbkRlc3Ryb3llZCgpCitTZXNzaW9uTGlzdGVuZXIwMTogc2Vzc2lvbkRlc3Ryb3llZCgpCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vV3JhcHBlZFNlc3Npb24wNS50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vV3JhcHBlZFNlc3Npb24wNS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRlOWQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9XcmFwcGVkU2Vzc2lvbjA1LnR4dApAQCAtMCwwICsxLDEzIEBACitUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFNlc3Npb24oYikKK1Nlc3Npb25MaXN0ZW5lcjAxOiBzZXNzaW9uQ3JlYXRlZCgpCitTZXNzaW9uTGlzdGVuZXIwMjogc2Vzc2lvbkNyZWF0ZWQoKQorU2Vzc2lvbkxpc3RlbmVyMDE6IGF0dHJpYnV0ZUFkZGVkKGF0dHJpYnV0ZTEsdmFsdWUxKQorU2Vzc2lvbkxpc3RlbmVyMDI6IGF0dHJpYnV0ZUFkZGVkKGF0dHJpYnV0ZTEsdmFsdWUxKQorU2Vzc2lvbkxpc3RlbmVyMDE6IGF0dHJpYnV0ZVJlcGxhY2VkKGF0dHJpYnV0ZTEsdmFsdWUxKQorU2Vzc2lvbkxpc3RlbmVyMDI6IGF0dHJpYnV0ZVJlcGxhY2VkKGF0dHJpYnV0ZTEsdmFsdWUxKQorU2Vzc2lvbkxpc3RlbmVyMDE6IGF0dHJpYnV0ZVJlbW92ZWQoYXR0cmlidXRlMSx2YWx1ZTIpCitTZXNzaW9uTGlzdGVuZXIwMjogYXR0cmlidXRlUmVtb3ZlZChhdHRyaWJ1dGUxLHZhbHVlMikKK1Nlc3Npb25MaXN0ZW5lcjAyOiBzZXNzaW9uRGVzdHJveWVkKCkKK1Nlc3Npb25MaXN0ZW5lcjAxOiBzZXNzaW9uRGVzdHJveWVkKCkKK1Rlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLnNldENvbnRlbnRUeXBlKCkKK1Rlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmdldFdyaXRlcigpCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vYXJyYXkudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2FycmF5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZThiNzhiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2FycmF5LnR4dApAQCAtMCwwICsxIEBACitUaGVzZSBhcmUgdGhlIGRheXMgb2YgdGhlIHdlZWs6PHA+TW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheSBTdW5kYXkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vYmluYXJ5LnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9iaW5hcnkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZjI3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vYmluYXJ5LnR4dApAQCAtMCwwICsxIEBACis8Rk9OVCBTSVpFPSsyPklmIHlvdSBhZGQgb25lIHRvIHlvdXIgbnVtYmVyLCB0aGUgcmVzdWx0IGlzIDxCPjEwMzwvQj48UD5JZiB5b3UgYWRkIDUgdG8gdGhhdCwgdGhlIHJlc3VsdCBpcyA8Qj4xMDg8L0I+PC9GT05UPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9jb25jYXQudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2NvbmNhdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzExZTdmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9jb25jYXQudHh0CkBAIC0wLDAgKzEgQEAKK0NvbmdyYXR1bGF0aW9ucyEgWW91ciBtYXJyaWVkIG5hbWUgd291bGQgYmUgamFuZSBzbWl0aC4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9kYXlzLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9kYXlzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2UwODdjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2RheXMudHh0CkBAIC0wLDAgKzEgQEAKK1RoZXNlIGFyZSB0aGUgZGF5cyBvZiB0aGUgd2Vlazo8UD5Nb25kYXkgVHVlc2RheSBXZWRuZXNkYXkgVGh1cnNkYXkgRnJpZGF5IFNhdHVyZGF5IFN1bmRheQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9kb3doaWxlLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9kb3doaWxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDc1ZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2Rvd2hpbGUudHh0CkBAIC0wLDAgKzEgQEAKKzxQPlN0YXJ0aW5nIGNvdW50ZG93bi4uLjEwLi4uIDkuLi4gOC4uLiA3Li4uIDYuLi4gNS4uLiA0Li4uIDMuLi4gMi4uLiAxLi4uIEtBQk9PTSEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vZWxzZS50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vZWxzZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxOWEwMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9lbHNlLnR4dApAQCAtMCwwICsxIEBACitZb3UgYXRlIHNwaW5hY2gsIHNvIHlvdSBnZXQgZGVzc2VydCEKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9lbHNpZi50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vZWxzaWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkY2IxMjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vZWxzaWYudHh0CkBAIC0wLDAgKzEgQEAKK05vIHNwaW5hY2gsIG5vIGRlc3NlcnQhCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vZXhwb25lbnRzLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9leHBvbmVudHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZjQ3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vZXhwb25lbnRzLnR4dApAQCAtMCwwICsxIEBACis8UD5Zb3UgZW50ZXJlZCAyIHdpdGggYW4gZXhwb25lbnQgb2YgNDxQPjIgcmFpc2VkIHRvIHRoZSA0IHBvd2VyIGlzIDE2LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9nZXRkYXkudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2dldGRheS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBhYjlhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9nZXRkYXkudHh0CkBAIC0wLDAgKzEgQEAKK1RoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgaXMgU3VuZGF5PFA+VGhlIHRoaXJkIGRheSBvZiB0aGUgd2VlayBpcyBUdWVzZGF5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2hlbGxvcGVybC50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vaGVsbG9wZXJsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTRiZmIxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2hlbGxvcGVybC50eHQKQEAgLTAsMCArMSwyIEBACisJPFRpdGxlPiBIZWxsbyBXb3JsZCEgPC9UaXRsZT4KKwk8SDE+CUhlbGxvIFdvcmxkISA8L0gxPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2luY3JlbWVudC50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vaW5jcmVtZW50LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWNlNjI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2luY3JlbWVudC50eHQKQEAgLTAsMCArMSBAQAorWW91ciBudW1iZXIgaW5jcmVtZW50ZWQgYnkgMSBpcyA4PEJSPllvdXIgbnVtYmVyLCBpbmNyZW1lbnRlZCBhZ2FpbiBieSAxLCBpcyBub3cgOS4gSWYgd2Ugc3RvcmUgdGhhdCBvcGVyYXRpb24sIGl0cyB2YWx1ZSBpcyBhbHNvIDkuPEhSPkxldCdzIHN0YXJ0IG92ZXIsIHdpdGggeW91ciBvcmlnaW5hbCBudW1iZXIgNzxCUj5BZ2FpbiwgeW91ciBudW1iZXIgaW5jcmVtZW50ZWQgYnkgMSBpcyA4PEJSPk5vdyB3ZSBzdG9yZSB0aGUgdmFsdWUgb2YgeW91ciBudW1iZXIgaW4gYSBzZWNvbmQgdmFyaWFibGUsIHdoaWNoIGlzIG5vdyBlcXVhbCB0byA4LCBhbmQgdGhlbiB3ZSBpbmNyZW1lbnQgeW91ciBudW1iZXIgYWdhaW4uIEl0J3Mgbm93IDkuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL21vZGlmeWFsbC50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vbW9kaWZ5YWxsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzU3NTU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL21vZGlmeWFsbC50eHQKQEAgLTAsMCArMSBAQAorVGhlIG51bWJlcnMgeW91IGVudGVyZWQgd2VyZTo8TEk+Mjg5PFA+VGhlIHNxdWFyZSByb290cyBvZiB0aG9zZSBudW1iZXJzIGFyZTogPExJPjE3ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL3ByZWZlcmVuY2UudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL3ByZWZlcmVuY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwY2RjMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vcHJlZmVyZW5jZS50eHQKQEAgLTAsMCArMSBAQAorZGl2IGlzIDExLCBwYXJlbnMgaXMgNSwgc3ViYWRkIGlzIDExIGFuZCBwYXJlbnNfc3ViYWRkIGlzIDEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9pbmNsdWRlbWUuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9pbmNsdWRlbWUuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyY2Q3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2luY2x1ZGVtZS5zaHRtbApAQCAtMCwwICsxIEBACitUaGlzIGlzIENvbnRlbnQgb2YgImluY2x1ZGVtZS5zaHRtbCIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2luY2x1ZGVtZS50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9pbmNsdWRlbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NzEyOTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9pbmNsdWRlbWUudHh0CkBAIC0wLDAgKzEgQEAKK1RoaXMgaXMgQ29udGVudCBvZiAiaW5jbHVkZW1lLnR4dCIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9pbmRleC5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2luZGV4LnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MmNiMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9pbmRleC5zaHRtbApAQCAtMCwwICsxLDEzOSBAQAorPGh0bWw+IAorIDxoZWFkPiAKKyA8dGl0bGU+Q29uZmlnIGNvbW1hbmQgZXhhbXBsZXMgPC90aXRsZT4KKyA8L2hlYWQ+IAorIDxib2R5IGJnY29sb3I9d2hpdGU+IAorCisKK1NldHRpbmcgZXJyb3Jtc2cgdXNpbmc6ICZsdDshLS0jY29uZmlnIGVycm1zZz0iLi4uIiAtLSZndDsgPGJyPgorPCEtLSNjb25maWcgZXJybXNnPSJlcnJvcm1zZzogU29ycnkgdGhpcyBjb21tYW5kIHdvbid0IHdvcmsuIiAtLT4gCisKK1RyeWluZyB0byBhY2Nlc3Mgbm9uLWV4aXN0ZW50ICJmb28uc2h0bWwiIHVzaW5nICAKKyZsdDshLS0jZnNpemUgZmlsZT0iZm9vLnNodG1sIiAtLSZndDsKKzxicj4KKworPCEtLSNmc2l6ZSBmaWxlPSJmb28uc2h0bWwiIC0tPgorPGJyPgorPGJyPgorCitVc2luZyAmbHQ7IS0tI2NvbmZpZyBzaXplZm10PSJieXRlcyIgLS0mZ3Q7Cis8YnI+CisgICAgICAgICAgICAgIFRoaXMgZmlsZSAoIGluZGV4LnNodG1sOjpzaXplLT4gMjY2NSkgaXMgCisgPCEtLSNjb25maWcgc2l6ZWZtdD0iYnl0ZXMiIC0tPiAKKyA8IS0tI2ZzaXplIGZpbGU9ImluZGV4LnNodG1sIiAtLT4KKyAgICAgICAgICAgICAgYnl0ZXMgaW4gc2l6ZS4gCisKKzxicj4KKzxicj4KKyAgU2V0dGluZyBzaXplZm10IHRvIGFiYnJldiB1c2luZyA6ICZsdDshLS0jY29uZmlnIHNpemVmbXQ9ImFiYnJldiIgLS0mZ3Q7Cis8YnI+CisKKworPCEtLSNjb25maWcgc2l6ZWZtdD0iYWJicmV2IiAtLT4KKworU2l6ZSBvZiBmaWxlICJpbmRleC5zaHRtbCAoIHNpemUtPjI2NjUpIiB1c2luZyBzaXplZm10PWFiYnJldiAtPgorPCEtLSNmc2l6ZSAgIGZpbGU9ImluZGV4LnNodG1sIiAtLT4KKworPGJyPiA8YnI+CitTaXplIG9mIGZpbGUgInNhdmVpbmRleC5zaHRtbChzaXplLT40NjQpIiB1c2luZyAgOiAmbHQ7IS0tI2ZzaXplIGZpbGU9InNhdmVpbmRleC5zaHRtbCIgLS0mZ3Q7ICAtPgorPCEtLSNmc2l6ZSAgIGZpbGU9InNhdmVpbmRleC5zaHRtbCIgLS0+Cis8YnI+PGJyPgorCitTaXplIG9mIGZpbGUgImNoZWNrMS5zaHRtbChzaXplLT4xMDAwKSIgdXNpbmcgIDogJmx0OyEtLSNmc2l6ZSBmaWxlPSJjaGVjazEuc2h0bWwiIC0tJmd0OyAgLT4KKzwhLS0jZnNpemUgICBmaWxlPSJjaGVjazEuc2h0bWwiIC0tPgorPGJyPjxicj4KKworU2l6ZSBvZiBmaWxlICJjaGVjazIuaHRtbChzaXplLT4xMDAxKSIgdXNpbmcgIDogJmx0OyEtLSNmc2l6ZSBmaWxlPSJjaGVjazIuaHRtbCIgLS0mZ3Q7ICAtPgorPCEtLSNmc2l6ZSAgIGZpbGU9ImNoZWNrMi5odG1sIiAtLT4KKzxicj48YnI+CisKK1NpemUgb2YgZmlsZSAiY2hlY2szLnNodG1sKHNpemUtPjE0OTkpIiB1c2luZyAgOiAmbHQ7IS0tI2ZzaXplIGZpbGU9ImNoZWNrMy5zaHRtbCIgLS0mZ3Q7ICAtPgorPCEtLSNmc2l6ZSAgIGZpbGU9ImNoZWNrMy5zaHRtbCIgLS0+Cis8YnI+PGJyPgorCitTaXplIG9mIGZpbGUgImNoZWNrNC5zaHRtbChzaXplLT4xNTAwKSIgdXNpbmcgIDogJmx0OyEtLSNmc2l6ZSBmaWxlPSJjaGVjazQuc2h0bWwiIC0tJmd0OyAgLT4KKzwhLS0jZnNpemUgICBmaWxlPSJjaGVjazQuc2h0bWwiIC0tPgorPGJyPjxicj4KKworU2l6ZSBvZiBmaWxlICJjaGVjazUuc2h0bWwoc2l6ZS0+MTUwMSkiIHVzaW5nICA6ICZsdDshLS0jZnNpemUgZmlsZT0iY2hlY2s1LnNodG1sIiAtLSZndDsgIC0+Cis8IS0tI2ZzaXplICAgZmlsZT0iY2hlY2s1LnNodG1sIiAtLT4KKzxicj48YnI+CisKK1NpemUgb2YgZmlsZSAiY2hlY2ttZSAoIHNpemUtPjE1MzUpIiB1c2luZyA6ICZsdDshLS0jZnNpemUgZmlsZSJjaGVja21lIiAtLSZndDsgLT4gCis8IS0tI2ZzaXplICAgZmlsZT0iY2hlY2ttZSIgLS0+Cis8YnI+PGJyPgorCitTaXplIG9mIGZpbGUgImNoZWNrNS5odG1sKHNpemUtPjE1MzYpIiB1c2luZyAgOiAmbHQ7IS0tI2ZzaXplIGZpbGU9ImNoZWNrNS5odG1sIiAtLSZndDsgIC0+Cis8IS0tI2ZzaXplICAgZmlsZT0iY2hlY2s1Lmh0bWwiIC0tPgorPGJyPjxicj4KKworU2l6ZSBvZiBmaWxlICJjaGVjazU1Lmh0bWwoc2l6ZS0+MTUzNykiIHVzaW5nICA6ICZsdDshLS0jZnNpemUgZmlsZT0iY2hlY2s1NS5odG1sIiAtLSZndDsgIC0+Cis8IS0tI2ZzaXplICAgZmlsZT0iY2hlY2s1NS5odG1sIiAtLT4KKzxicj48YnI+CisKK1NpemUgb2YgZmlsZSAiY2hlY2s1NTUuaHRtbChzaXplLT4xNTM4KSIgdXNpbmcgIDogJmx0OyEtLSNmc2l6ZSBmaWxlPSJjaGVjazU1NS5odG1sIiAtLSZndDsgIC0+Cis8IS0tI2ZzaXplICAgZmlsZT0iY2hlY2s1NTUuaHRtbCIgLS0+Cis8YnI+PGJyPgorCitTaXplIG9mIGZpbGUgImNoZWNrNTU1NS5odG1sKHNpemUtPjE1MzkpIiB1c2luZyAgOiAmbHQ7IS0tI2ZzaXplIGZpbGU9ImNoZWNrNTU1NS5odG1sIiAtLSZndDsgIC0+Cis8IS0tI2ZzaXplICAgZmlsZT0iY2hlY2s1NTU1Lmh0bWwiIC0tPgorPGJyPjxicj4KKworU2l6ZSBvZiBmaWxlICJjaGVjazYuc2h0bWwoc2l6ZS0+MTk4OCkiIHVzaW5nICA6ICZsdDshLS0jZnNpemUgZmlsZT0iY2hlY2s2LnNodG1sIiAtLSZndDsgIC0+Cis8IS0tI2ZzaXplICAgZmlsZT0iY2hlY2s2LnNodG1sIiAtLT4KKzxicj48YnI+CisKK1NpemUgb2YgZmlsZSAiY2hlY2s3LnNodG1sKHNpemUtPjE5OTkpIiB1c2luZyAgOiAmbHQ7IS0tI2ZzaXplIGZpbGU9ImNoZWNrNy5zaHRtbCIgLS0mZ3Q7ICAtPgorPCEtLSNmc2l6ZSAgIGZpbGU9ImNoZWNrNy5zaHRtbCIgLS0+Cis8YnI+PGJyPgorIDxwPiAKKworCisKKworIDxGT05UIFNJWkU9KzIgQ29sb3I9Ymx1ZT4gdGltZWZtdCBUZXN0cyA6IDwvRk9OVD4KKworPGJyPiA8YnI+CisgIFVzaW5nICZsdDshLS0jY29uZmlnIHRpbWVmbXQ9IiVBIiAtLSZndDsgCisgICAgICAgICAgJmx0OyEtLSNlY2hvIHZhcj0iREFURV9MT0NBTCIgLS0mZ3Q7Cis8YnI+CisgIERheSAtPiAgPCEtLSNjb25maWcgdGltZWZtdD0iJUEiIC0tPgorICAgICAgICAgICAgICA8IS0tI2VjaG8gdmFyPSJEQVRFX0xPQ0FMIiAtLT4sIAorPGJyPiA8YnI+CisgIFVzaW5nICZsdDshLS0jY29uZmlnIHRpbWVmbXQ9IiVkIiAtLSZndDs8YnI+CisgICAgICAgICAgJmx0OyEtLSNlY2hvIHZhcj0iREFURV9MT0NBTCIgLS0mZ3Q7IAorICA8YnI+CisgIERheSBvZiBNb250aCAtPiA8IS0tI2NvbmZpZyB0aW1lZm10PSIlZCIgLS0+CisgICAgICAgICAgICAgIDwhLS0jZWNobyB2YXI9IkRBVEVfTE9DQUwiIC0tPiAKKworIDxicj4gPGJyPgorICBVc2luZyAmbHQ7IS0tI2NvbmZpZyB0aW1lZm10PSIlQiIgLS0mZ3Q7PGJyPgorICAgICAgICAgICZsdDshLS0jZWNobyB2YXI9IkRBVEVfTE9DQUwiIC0tJmd0OyAKKyAgPGJyPgorICBNb250aChmdWxsKSAtPiA8IS0tI2NvbmZpZyB0aW1lZm10PSIlQiIgLS0+IAorCQk8IS0tI2VjaG8gdmFyPSJEQVRFX0xPQ0FMIiAtLT4gCisKKyAgPGJyPiA8YnI+CisgIFVzaW5nICZsdDshLS0jY29uZmlnIHRpbWVmbXQ9IiViIiAtLSZndDs8YnI+CisgICAgICAgICAgJmx0OyEtLSNlY2hvIHZhcj0iREFURV9MT0NBTCIgLS0mZ3Q7IAorICA8YnI+CisgIE1vbnRoKGFiYnJldmlhdGVkKSAtPiA8IS0tI2NvbmZpZyB0aW1lZm10PSIlYiIgLS0+IAorCQkJPCEtLSNlY2hvIHZhcj0iREFURV9MT0NBTCIgLS0+IAorCisgIDxicj4gPGJyPgorICBVc2luZyAmbHQ7IS0tI2NvbmZpZyB0aW1lZm10PSIlWSIgLS0mZ3Q7PGJyPgorICAgICAgICAgICZsdDshLS0jZWNobyB2YXI9IkRBVEVfTE9DQUwiIC0tJmd0OyAKKyAgPGJyPgorICAgWWVhciAtPiAgPCEtLSNjb25maWcgdGltZWZtdD0iJVkiCisgICAgICAgICAgICAgIC0tPiA8IS0tI2VjaG8gdmFyPSJEQVRFX0xPQ0FMIiAtLT4uIAorCisgIDxicj4gPGJyPgorICBVc2luZyAmbHQ7IS0tI2NvbmZpZyB0aW1lZm10PSIlVyIgLS0mZ3Q7PGJyPgorICAgICAgICAgICZsdDshLS0jZWNobyB2YXI9IkRBVEVfTE9DQUwiIC0tJmd0OyAKKworICA8YnI+CisgIFdlZWsgbnVtYmVyIG9mIHllYXIgYXMgYSBkZWNpbWFsICBudW1iZXI6IDwhLS0jY29uZmlnIHRpbWVmbXQ9IiVXIiAtLT4gCisJCQkJCTwhLS0jZWNobyB2YXI9IkRBVEVfTE9DQUwiIC0tPi4gCisKKzwvYm9keT4gCis8L2h0bWw+IApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvc3NpZGlyL2luY2x1ZGVtZS50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9zc2lkaXIvaW5jbHVkZW1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTcxMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvc3NpZGlyL2luY2x1ZGVtZS50eHQKQEAgLTAsMCArMSBAQAorVGhpcyBpcyBDb250ZW50IG9mICJpbmNsdWRlbWUudHh0IgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzLy5jdnNpZ25vcmUgYi9jb250YWluZXIvd2ViYXBwcy8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMGI3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy8uY3ZzaWdub3JlCkBAIC0wLDAgKzEsMiBAQAorYnVpbGQKK2Rpc3QKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvV0VCLUlORi93ZWIueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvUk9PVC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxZjkyMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKKyAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKKyAgICB2ZXJzaW9uPSIyLjQiPgorCisgIDxkaXNwbGF5LW5hbWU+V2VsY29tZSB0byBUb21jYXQ8L2Rpc3BsYXktbmFtZT4KKyAgPGRlc2NyaXB0aW9uPgorICAgICBXZWxjb21lIHRvIFRvbWNhdAorICA8L2Rlc2NyaXB0aW9uPgorCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9ST09UL2FkbWluL2luZGV4Lmh0bWwgYi9jb250YWluZXIvd2ViYXBwcy9ST09UL2FkbWluL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA5NGI2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvYWRtaW4vaW5kZXguaHRtbApAQCAtMCwwICsxLDE0IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL3N0cmljdC5kdGQiPgorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICAgPHRpdGxlPkFkbWluaXN0cmF0aW9uPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKK1RvbWNhdCdzIGFkbWluaXN0cmF0aW9uIHdlYiBhcHBsaWNhdGlvbiBpcyBubyBsb25nZXIgaW5zdGFsbGVkIGJ5IGRlZmF1bHQuIERvd25sb2FkIGFuZCBpbnN0YWxsIAordGhlICJhZG1pbiIgcGFja2FnZSB0byB1c2UgaXQuCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvYXNmLWxvZ28td2lkZS5naWYgYi9jb250YWluZXIvd2ViYXBwcy9ST09UL2FzZi1sb2dvLXdpZGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNDAzMjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9ST09UL2FzZi1sb2dvLXdpZGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvYnVpbGQueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvUk9PVC9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyNDM4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvYnVpbGQueG1sCkBAIC0wLDAgKzEsNzYgQEAKKzxwcm9qZWN0IG5hbWU9IlJPT1QiIGRlZmF1bHQ9ImJ1aWxkLW1haW4iIGJhc2VkaXI9Ii4iPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSBQcm9wZXJ0eSBWYWx1ZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8IS0tIFNlZSAiYnVpbGQucHJvcGVydGllcy5zYW1wbGUiIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGZvciBhbGwgICAgIC0tPgorICA8IS0tIHByb3BlcnR5IHZhbHVlcyB5b3UgbXVzdCBjdXN0b21pemUgZm9yIHN1Y2Nlc3NmdWwgYnVpbGRpbmchISEgICAgICAgIC0tPgorICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iLi4vYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iLi4vLi4vYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9L2J1aWxkLnByb3BlcnRpZXMiLz4KKworICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiICB2YWx1ZT0ibW9kZXJuIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWJhcHBzLmJ1aWxkIiAgIHZhbHVlPSIuLi9idWlsZCIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViYXBwcy5kaXN0IiAgICB2YWx1ZT0iLi4vZGlzdCIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViYXBwLm5hbWUiICAgICB2YWx1ZT0iUk9PVCIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDcmVhdGUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ29weSBTdGF0aWMgRmlsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtc3RhdGljIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlIj4KKyAgICA8Y29weSB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJidWlsZC4qIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT0gQlVJTEQ6IENvbXBpbGUgU2VydmVyIENvbXBvbmVudHMgPT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtbWFpbiIgZGVwZW5kcz0iYnVpbGQtc3RhdGljIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBSZWJ1aWxkIEV2ZXJ5dGhpbmcgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iYnVpbGQtY2xlYW4sYnVpbGQtbWFpbiIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiBhbmQgYnVpbGQgUk9PVCB3ZWJhcHAiLz4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENsZWFuIERpcmVjdG9yeSA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDcmVhdGUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0LXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5kaXN0fSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpc3RyaWJ1dGlvbiBGaWxlcyA9PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0iYnVpbGQtbWFpbixkaXN0LXByZXBhcmUiCisgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIFJPT1Qgd2ViYXBwIGJpbmFyeSBkaXN0cmlidXRpb24iPgorICAgICAgPGphciAgIGphcmZpbGU9IiR7d2ViYXBwcy5kaXN0fS8ke3dlYmFwcC5uYW1lfS53YXIiCisgICAgICAgICAgICAgYmFzZWRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSIgaW5jbHVkZXM9IioqIi8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0LWNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHt3ZWJhcHBzLmRpc3R9LyR7d2ViYXBwLm5hbWV9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IENvbnZlbmllbnQgU3lub255bXMgPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iYnVpbGQtY2xlYW4sZGlzdC1jbGVhbiIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiBidWlsZCBhbmQgZGlzdCBkaXJlY3RvcmllcyIvPgorCisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvZmF2aWNvbi5pY28gYi9jb250YWluZXIvd2ViYXBwcy9ST09UL2Zhdmljb24uaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNWJkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9ST09UL2Zhdmljb24uaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvaW5kZXguanNwIGIvY29udGFpbmVyL3dlYmFwcHMvUk9PVC9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3YjYzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvaW5kZXguanNwCkBAIC0wLDAgKzEsMjE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPCVAIHBhZ2Ugc2Vzc2lvbj0iZmFsc2UiICU+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+CisgICAgPGhlYWQ+CisgICAgPHRpdGxlPjwlPSBhcHBsaWNhdGlvbi5nZXRTZXJ2ZXJJbmZvKCkgJT48L3RpdGxlPgorICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgLyo8IVtDREFUQVsqLworICAgICAgYm9keSB7CisgICAgICAgICAgY29sb3I6ICMwMDAwMDA7CisgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKKwkgIGZvbnQtZmFtaWx5OiBBcmlhbCwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKKyAgICAgICAgICBtYXJnaW46IDEwcHggMHB4OworICAgICAgfQorCisgICAgaW1nIHsKKyAgICAgICBib3JkZXI6IG5vbmU7CisgICAgfQorICAgIAorICAgIGE6bGluaywgYTp2aXNpdGVkIHsKKyAgICAgICAgY29sb3I6IGJsdWUKKyAgICB9CisKKyAgICB0aCB7CisgICAgICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOworICAgICAgICBmb250LXNpemU6IDExMCU7CisgICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICAgICAgYmFja2dyb3VuZDogI0QyQTQxQzsKKyAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICB9CisKKyAgICB0ZCB7CisgICAgICAgIGNvbG9yOiAjMDAwMDAwOworCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOworICAgIH0KKyAgICAKKyAgICB0ZC5tZW51IHsKKyAgICAgICAgYmFja2dyb3VuZDogI0ZGREM3NTsKKyAgICB9CisKKyAgICAuY2VudGVyIHsKKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIH0KKworICAgIC5jb2RlIHsKKyAgICAgICAgY29sb3I6ICMwMDAwMDA7CisgICAgICAgIGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vc3BhY2U7CisgICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDIuNWVtOworICAgIH0KKyAgICAKKyAgICAgI2Jhbm5lciB7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CisgICAgIH0KKworICAgICBwI2NvbmdyYXRzIHsKKyAgICAgICAgIG1hcmdpbi10b3A6IDA7CisgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICAgfQorCisgICAgIHAjZm9vdGVyIHsKKyAgICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OworICAgICAgICAgZm9udC1zaXplOiA4MCU7CisgICAgIH0KKyAgICAgLypdXT4qLworICAgPC9zdHlsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzwhLS0gSGVhZGVyIC0tPgorPHRhYmxlIGlkPSJiYW5uZXIiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQgYWxpZ249ImxlZnQiIHN0eWxlPSJ3aWR0aDoxMzBweCI+CisgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy8iPgorCSAgPGltZyBzcmM9InRvbWNhdC5naWYiIGhlaWdodD0iOTIiIHdpZHRoPSIxMzAiIGFsdD0iVGhlIE1pZ2h0eSBUb21jYXQgLSBNRU9XISIvPgorCTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48Yj48JT0gYXBwbGljYXRpb24uZ2V0U2VydmVySW5mbygpICU+PC9iPjwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+CisJICA8aW1nIHNyYz0iYXNmLWxvZ28td2lkZS5naWYiIGhlaWdodD0iNTEiIHdpZHRoPSI1MzciIGFsdD0iVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIi8+CisJPC9hPgorICAgICAgIDwvdGQ+CisgICAgIDwvdHI+Cis8L3RhYmxlPgorCis8dGFibGU+CisgICAgPHRyPgorCisgICAgICAgIDwhLS0gVGFibGUgb2YgQ29udGVudHMgLS0+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KKyAgICAgICAgICAgICAgICA8dHI+CisJCSAgPHRoPkFkbWluaXN0cmF0aW9uPC90aD4KKyAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDx0cj4KKwkJICA8dGQgY2xhc3M9Im1lbnUiPgorCQkgICAgPGEgaHJlZj0ibWFuYWdlci9zdGF0dXMiPlN0YXR1czwvYT48YnIvPgorICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJhZG1pbiI+VG9tY2F0Jm5ic3A7QWRtaW5pc3RyYXRpb248L2E+PGJyLz4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ibWFuYWdlci9odG1sIj5Ub21jYXQmbmJzcDtNYW5hZ2VyPC9hPjxici8+CisgICAgICAgICAgICAgICAgICAgICZuYnNwOworICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPC90YWJsZT4KKworCSAgICA8YnIgLz4KKyAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgorICAgICAgICAgICAgICAgIDx0cj4KKwkJICA8dGg+RG9jdW1lbnRhdGlvbjwvdGg+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgorICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJSRUxFQVNFLU5PVEVTLnR4dCI+UmVsZWFzZSZuYnNwO05vdGVzPC9hPjxici8+CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9InRvbWNhdC1kb2NzL2NoYW5nZWxvZy5odG1sIj5DaGFuZ2UmbmJzcDtMb2c8L2E+PGJyLz4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0idG9tY2F0LWRvY3MiPlRvbWNhdCZuYnNwO0RvY3VtZW50YXRpb248L2E+PGJyLz4gICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKKyAgICAgICAgICAgICAgICAgICAgJm5ic3A7CisJCSAgICA8L3RkPgorICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8L3RhYmxlPgorCSAgICAKKyAgICAgICAgICAgIDxici8+CisgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICA8dGg+VG9tY2F0IE9ubGluZTwvdGg+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgorICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdG9tY2F0LmFwYWNoZS5vcmcvIj5Ib21lJm5ic3A7UGFnZTwvYT48YnIvPgorCQkgICAgPGEgaHJlZj0iaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnL2ZhcS8iPkZBUTwvYT48YnIvPgorICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdG9tY2F0LmFwYWNoZS5vcmcvYnVncmVwb3J0Lmh0bWwiPkJ1ZyZuYnNwO0RhdGFiYXNlPC9hPjxici8+CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9idWdsaXN0LmNnaT9idWdfc3RhdHVzPVVOQ09ORklSTUVEJmFtcDtidWdfc3RhdHVzPU5FVyZhbXA7YnVnX3N0YXR1cz1BU1NJR05FRCZhbXA7YnVnX3N0YXR1cz1SRU9QRU5FRCZhbXA7YnVnX3N0YXR1cz1SRVNPTFZFRCZhbXA7cmVzb2x1dGlvbj1MQVRFUiZhbXA7cmVzb2x1dGlvbj1SRU1JTkQmYW1wO3Jlc29sdXRpb249LS0tJmFtcDtidWdpZHR5cGU9aW5jbHVkZSZhbXA7cHJvZHVjdD1Ub21jYXQrNSZhbXA7Y21kdHlwZT1kb2l0JmFtcDtvcmRlcj1JbXBvcnRhbmNlIj5PcGVuIEJ1Z3M8L2E+PGJyLz4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC90b21jYXQtdXNlcnMvIj5Vc2VycyZuYnNwO01haWxpbmcmbmJzcDtMaXN0PC9hPjxici8+CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvdG9tY2F0LWRldi8iPkRldmVsb3BlcnMmbmJzcDtNYWlsaW5nJm5ic3A7TGlzdDwvYT48YnIvPgorICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJpcmM6Ly9pcmMuZnJlZW5vZGUubmV0LyN0b21jYXQiPklSQzwvYT48YnIvPgorCQkgICAgJm5ic3A7CisgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8L3RhYmxlPgorCSAgICAKKyAgICAgICAgICAgIDxici8+CisgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICA8dGg+RXhhbXBsZXM8L3RoPgorICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJtZW51Ij4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ianNwLWV4YW1wbGVzLyI+SlNQJm5ic3A7RXhhbXBsZXM8L2E+PGJyLz4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ic2VydmxldHMtZXhhbXBsZXMvIj5TZXJ2bGV0Jm5ic3A7RXhhbXBsZXM8L2E+PGJyLz4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0id2ViZGF2LyI+V2ViREFWJm5ic3A7Y2FwYWJpbGl0aWVzPC9hPjxici8+CisgICAgIAkJICAgICZuYnNwOworICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPC90YWJsZT4KKwkgICAgCisgICAgICAgICAgICA8YnIvPgorICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CisgICAgICAgICAgICAgICAgPHRyPgorCQkgIDx0aD5NaXNjZWxsYW5lb3VzPC90aD4KKyAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvanNwIj5TdW4ncyZuYnNwO0phdmEmbmJzcDtTZXJ2ZXImbmJzcDtQYWdlcyZuYnNwO1NpdGU8L2E+PGJyLz4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0Ij5TdW4ncyZuYnNwO1NlcnZsZXQmbmJzcDtTaXRlPC9hPjxici8+CisgICAgCQkgICAgJm5ic3A7CisgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L3RkPgorCisgICAgICAgIDx0ZCBzdHlsZT0id2lkdGg6MjBweCI+Jm5ic3A7PC90ZD4KKwkKKyAgICAgICAgPCEtLSBCb2R5IC0tPgorICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICA8cCBpZD0iY29uZ3JhdHMiPklmIHlvdSdyZSBzZWVpbmcgdGhpcyBwYWdlIHZpYSBhIHdlYiBicm93c2VyLCBpdCBtZWFucyB5b3UndmUgc2V0dXAgVG9tY2F0IHN1Y2Nlc3NmdWxseS4gQ29uZ3JhdHVsYXRpb25zITwvcD4KKyAKKyAgICAgICAgICA8cD5BcyB5b3UgbWF5IGhhdmUgZ3Vlc3NlZCBieSBub3csIHRoaXMgaXMgdGhlIGRlZmF1bHQgVG9tY2F0IGhvbWUgcGFnZS4gSXQgY2FuIGJlIGZvdW5kIG9uIHRoZSBsb2NhbCBmaWxlc3lzdGVtIGF0OjwvcD4KKyAgICAgICAgICA8cCBjbGFzcz0iY29kZSI+JENBVEFMSU5BX0hPTUUvd2ViYXBwcy9ST09UL2luZGV4LmpzcDwvcD4KKwkgIAorICAgICAgICAgIDxwPndoZXJlICIkQ0FUQUxJTkFfSE9NRSIgaXMgdGhlIHJvb3Qgb2YgdGhlIFRvbWNhdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiBJZiB5b3UncmUgc2VlaW5nIHRoaXMgcGFnZSwgYW5kIHlvdSBkb24ndCB0aGluayB5b3Ugc2hvdWxkIGJlLCB0aGVuIGVpdGhlciB5b3UncmUgZWl0aGVyIGEgdXNlciB3aG8gaGFzIGFycml2ZWQgYXQgbmV3IGluc3RhbGxhdGlvbiBvZiBUb21jYXQsIG9yIHlvdSdyZSBhbiBhZG1pbmlzdHJhdG9yIHdobyBoYXNuJ3QgZ290IGhpcy9oZXIgc2V0dXAgcXVpdGUgcmlnaHQuIFByb3ZpZGluZyB0aGUgbGF0dGVyIGlzIHRoZSBjYXNlLCBwbGVhc2UgcmVmZXIgdG8gdGhlIDxhIGhyZWY9InRvbWNhdC1kb2NzIj5Ub21jYXQgRG9jdW1lbnRhdGlvbjwvYT4gZm9yIG1vcmUgZGV0YWlsZWQgc2V0dXAgYW5kIGFkbWluaXN0cmF0aW9uIGluZm9ybWF0aW9uIHRoYW4gaXMgZm91bmQgaW4gdGhlIElOU1RBTEwgZmlsZS48L3A+CisKKyAgICAgICAgICAgIDxwPjxiPk5PVEU6PC9iPiBUaGlzIHBhZ2UgaXMgcHJlY29tcGlsZWQuIElmIHlvdSBjaGFuZ2UgaXQsIHRoaXMgcGFnZSB3aWxsIG5vdCBjaGFuZ2Ugc2luY2UKKyAgICAgICAgICAgICAgICAgIGl0IHdhcyBjb21waWxlZCBpbnRvIGEgc2VydmxldCBhdCBidWlsZCB0aW1lLgorICAgICAgICAgICAgICAgICAgKFNlZSA8dHQ+JENBVEFMSU5BX0hPTUUvd2ViYXBwcy9ST09UL1dFQi1JTkYvd2ViLnhtbDwvdHQ+IGFzIHRvIGhvdyBpdCB3YXMgbWFwcGVkLikKKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgPHA+PGI+Tk9URTogRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHVzaW5nIHRoZSBhZG1pbmlzdHJhdGlvbiB3ZWJhcHAKKyAgICAgICAgICAgIGlzIHJlc3RyaWN0ZWQgdG8gdXNlcnMgd2l0aCByb2xlICJhZG1pbiIuIFRoZSBtYW5hZ2VyIHdlYmFwcAorICAgICAgICAgICAgaXMgcmVzdHJpY3RlZCB0byB1c2VycyB3aXRoIHJvbGUgIm1hbmFnZXIiLjwvYj4KKyAgICAgICAgICAgIFVzZXJzIGFyZSBkZWZpbmVkIGluIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvdG9tY2F0LXVzZXJzLnhtbDwvY29kZT4uPC9wPgorCisgICAgICAgICAgICA8cD5JbmNsdWRlZCB3aXRoIHRoaXMgcmVsZWFzZSBhcmUgYSBob3N0IG9mIHNhbXBsZSBTZXJ2bGV0cyBhbmQgSlNQcyAod2l0aCBhc3NvY2lhdGVkIHNvdXJjZSBjb2RlKSwgZXh0ZW5zaXZlIGRvY3VtZW50YXRpb24gKGluY2x1ZGluZyB0aGUgU2VydmxldCAyLjQgYW5kIEpTUCAyLjAgQVBJIEphdmFEb2MpLCBhbmQgYW4gaW50cm9kdWN0b3J5IGd1aWRlIHRvIGRldmVsb3Bpbmcgd2ViIGFwcGxpY2F0aW9ucy48L3A+CisKKyAgICAgICAgICAgIDxwPlRvbWNhdCBtYWlsaW5nIGxpc3RzIGFyZSBhdmFpbGFibGUgYXQgdGhlIFRvbWNhdCBwcm9qZWN0IHdlYiBzaXRlOjwvcD4KKworICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICA8bGk+PGI+PGEgaHJlZj0ibWFpbHRvOnVzZXJzQHRvbWNhdC5hcGFjaGUub3JnIj51c2Vyc0B0b21jYXQuYXBhY2hlLm9yZzwvYT48L2I+IGZvciBnZW5lcmFsIHF1ZXN0aW9ucyByZWxhdGVkIHRvIGNvbmZpZ3VyaW5nIGFuZCB1c2luZyBUb21jYXQ8L2xpPgorICAgICAgICAgICAgICAgPGxpPjxiPjxhIGhyZWY9Im1haWx0bzpkZXZAdG9tY2F0LmFwYWNoZS5vcmciPmRldkB0b21jYXQuYXBhY2hlLm9yZzwvYT48L2I+IGZvciBkZXZlbG9wZXJzIHdvcmtpbmcgb24gVG9tY2F0PC9saT4KKyAgICAgICAgICAgPC91bD4KKworICAgICAgICAgICAgPHA+VGhhbmtzIGZvciB1c2luZyBUb21jYXQhPC9wPgorCisgICAgICAgICAgICA8cCBpZD0iZm9vdGVyIj48aW1nIHNyYz0idG9tY2F0LXBvd2VyLmdpZiIgd2lkdGg9Ijc3IiBoZWlnaHQ9IjgwIiBhbHQ9IlBvd2VyZWQgYnkgVG9tY2F0Ii8+PGJyLz4KKwkgICAgJm5ic3A7CisKKwkgICAgQ29weXJpZ2h0ICZjb3B5OyAxOTk5LTIwMDUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248YnIvPgorICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICAgICAgICAgICAgPC9wPgorICAgICAgICA8L3RkPgorCisgICAgPC90cj4KKzwvdGFibGU+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvdG9tY2F0LXBvd2VyLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvdG9tY2F0LXBvd2VyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWE3NDA0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvUk9PVC90b21jYXQtcG93ZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvdG9tY2F0LmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvdG9tY2F0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTc1NjczCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvUk9PVC90b21jYXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9BY3Rpb25UYWcuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9BY3Rpb25UYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDU5ZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FjdGlvblRhZy5qYXZhCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuQm9keVRhZ1N1cHBvcnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZzsKKworCisvKioKKyAqIDxwPk5lc3RlZCB0YWcgdGhhdCByZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgImluc3RhbnQgYWN0aW9uIi4gIFRoaXMgdGFnCisgKiBpcyB2YWxpZCA8c3Ryb25nPm9ubHk8L3N0cm9uZz4gd2hlbiBuZXN0ZWQgd2l0aGluIGFuIEFjdG9pbnNUYWcgdGFnLgorICogVGhpcyB0YWcgaGFzIHRoZSBmb2xsb3dpbmcgdXNlci1zZXR0YWJsZSBhdHRyaWJ1dGVzOjwvcD4KKyAqIDx1bD4KKyAqIDxsaT48c3Ryb25nPnNlbGVjdGVkPC9zdHJvbmc+IC0gU2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uCisgKiAgICAgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gdGhlIGNvbnRyb2wgaXMgaW5pdGlhbGx5IGRpc3BsYXllZC48L2xpPgorICogPGxpPjxzdHJvbmc+dXJsPC9zdHJvbmc+IC0gVVJMIHRvIHdoaWNoIGNvbnRyb2wgc2hvdWxkIGJlIHRyYW5zZmVycmVkCisgKiAgICAgKGluIHRoZSBjdXJyZW50IGZyYW1lIG9yIHdpbmRvdykgaWYgdGhpcyBhY3Rpb24gaXMgc2VsZWN0ZWQuPC9saT4KKyAqIDwvdWw+CisgKgorICogPHA+SW4gYWRkaXRpb24sIHRoZSBib2R5IGNvbnRlbnQgb2YgdGhpcyB0YWcgaXMgdXNlZCBhcyB0aGUgdXNlci12aXNpYmxlCisgKiBsYWJlbCBmb3IgdGhlIGFjdGlvbiwgc28gdGhhdCBpdCBtYXkgYmUgY29udmVuaWVudGx5IGxvY2FsaXplZC48L3A+CisgKgorICogPHN0cm9uZz5GSVhNRTwvc3Ryb25nPiAtIEludGVybmF0aW9uYWxpemUgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlcyEKKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEFjdGlvblRhZyBleHRlbmRzIEJvZHlUYWdTdXBwb3J0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBsYWJlbCB0aGF0IHdpbGwgYmUgcmVuZGVyZWQgZm9yIHRoaXMgYWN0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbGFiZWwgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHRoaXMgYWN0aW9uIGJlIHNlbGVjdGVkIHdoZW4gdGhlIGNvbnRyb2wgaXMgaW5pdGlhbGx5IGRpc3BsYXllZD8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzZWxlY3RlZCA9IGZhbHNlOworCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U2VsZWN0ZWQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zZWxlY3RlZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBzZWxlY3RlZCkgeworICAgICAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hvdWxkIHRoaXMgYWN0aW9uIHNlbGVjdGlvbiBiZSBkaXNhYmxlZD8gCisgICAgICogZS5nLiBBY3Rpb24gc2VwYXJhdG9ycyBzaG91bGQgYmUgZGlzYWJsZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZGlzYWJsZWQgPSBmYWxzZTsKKworICAgIHB1YmxpYyBib29sZWFuIGdldERpc2FibGVkKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGlzYWJsZWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpc2FibGVkKGJvb2xlYW4gZGlzYWJsZWQpIHsKKyAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBVUkwgdG8gd2hpY2ggY29udHJvbCBpcyB0cmFuc2ZlcnJlZCBpZiB0aGlzIGFjdGlvbiBpcyBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHVybCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnVybCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB1cmwpIHsKKyAgICAgICAgdGhpcy51cmwgPSB1cmw7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3RhcnQgb2YgdGhpcyB0YWcuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEpzcEV4Y2VwdGlvbiBpZiBhIEpTUCBleGNlcHRpb24gaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIGludCBkb1N0YXJ0VGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgaG9sZGVyIGZvciBvdXIgbGFiZWwgdGV4dAorICAgICAgICB0aGlzLmxhYmVsID0gbnVsbDsKKworICAgICAgICAvLyBEbyBubyBmdXJ0aGVyIHByb2Nlc3NpbmcgZm9yIG5vdworICAgICAgICByZXR1cm4gKEVWQUxfQk9EWV9CVUZGRVJFRCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGJvZHkgdGV4dCBvZiB0aGlzIHRhZyAoaWYgYW55KS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSnNwRXhjZXB0aW9uIGlmIGEgSlNQIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRvQWZ0ZXJCb2R5KCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIGxhYmVsID0gYm9keUNvbnRlbnQuZ2V0U3RyaW5nKCk7CisgICAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7CisgICAgICAgICAgICBsYWJlbCA9IGxhYmVsLnRyaW0oKTsKKyAgICAgICAgICAgIGlmIChsYWJlbC5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoU0tJUF9CT0RZKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoaXMgYWN0aW9uIHdpdGggb3VyIHN1cnJvdW5kaW5nIEFjdGlvbnNUYWcgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEpzcEV4Y2VwdGlvbiBpZiBhIHByb2Nlc3NpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGludCBkb0VuZFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworCisgICAgICAgIC8vIEZpbmQgb3VyIHBhcmVudCBBY3Rpb25zVGFnIGluc3RhbmNlCisgICAgICAgIFRhZyBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKKyAgICAgICAgd2hpbGUgKChwYXJlbnQgIT0gbnVsbCkgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpb25zVGFnKSkgeworICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOworICAgICAgICB9CisgICAgICAgIGlmICgocGFyZW50ID09IG51bGwpIHx8ICEocGFyZW50IGluc3RhbmNlb2YgQWN0aW9uc1RhZykpCisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCJNdXN0IGJlIG5lc3RlZCBpbiBhbiBBY3Rpb25zVGFnIGlzbnRhbmNlIik7CisgICAgICAgIEFjdGlvbnNUYWcgYWN0aW9ucyA9IChBY3Rpb25zVGFnKSBwYXJlbnQ7CisKKyAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5CisgICAgICAgIC8vIHRoaXMgYWN0aW9uCisgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0KKyAgICAgICAgICAgIChIdHRwU2VydmxldFJlcXVlc3QpIHBhZ2VDb250ZXh0LmdldFJlcXVlc3QoKTsKKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9CisgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZSkgcGFnZUNvbnRleHQuZ2V0UmVzcG9uc2UoKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOworICAgICAgICBpZiAoKHVybCAhPSBudWxsKSAmJiAodXJsLnN0YXJ0c1dpdGgoIi8iKSkpIHsKKyAgICAgICAgICAgIHBhdGggPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyB1cmw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXRoID0gdXJsOworICAgICAgICB9CisgICAgICAgIGFjdGlvbnMuYWRkQWN0aW9uKGxhYmVsLCBzZWxlY3RlZCwgZGlzYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVuY29kZVVSTChwYXRoKSk7CisKKyAgICAgICAgcmV0dXJuIChFVkFMX1BBR0UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIGFsbCBzdGF0ZSBpbmZvcm1hdGlvbiBzZXQgYnkgdGhpcyB0YWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKworICAgICAgICB0aGlzLmxhYmVsID0gbnVsbDsKKyAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGZhbHNlOworICAgICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7CisgICAgICAgIHRoaXMudXJsID0gbnVsbDsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQWN0aW9uc1RhZy5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FjdGlvbnNUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjY0YTdmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FjdGlvbnNUYWcuamF2YQpAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BXcml0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkJvZHlUYWdTdXBwb3J0OworCisKKy8qKgorICogPHA+SlNQIGN1c3RvbSB0YWcgdGhhdCByZW5kZXJzIGFuICJpbnN0YW50IGFjdGlvbnMiIGNvbnRyb2wuICBUbyB0aGUgdXNlciwKKyAqIGl0IGFwcGVhcnMgYXMgYW4gSFRNTCAmbHQ7c2VsZWN0Jmd0OyBlbGVtZW50IChpLmUuIGEgY29tYm8gYm94KSwgd2l0aAorICogdGhlIGJlaGF2aW9yIG9mIHNlbGVjdGluZyBhIG5ldyBwYWdlIGZvciB0aGUgY3VycmVudCBmcmFtZSBvciB3aW5kb3cgd2hlbgorICogYSBkaWZmZXJlbnQgb3B0aW9uIGlzIHNlbGVjdGVkLCB3aXRob3V0IHJlcXVpcmluZyBhIHN1Ym1pdCBhY3Rpb24uCisgKiBUaGlzIHRhZyBoYXMgdGhlIGZvbGxvd2luZyB1c2VyLXNldHRhYmxlIGF0dHJpYnV0ZXM6PC9wPgorICogPHVsPgorICogPGxpPjxzdHJvbmc+c2l6ZTwvc3Ryb25nPiAtIChJbnRlZ2VyKSBudW1iZXIgb2Ygcm93cyB0aGF0IHdpbGwgYmUgdmlzaWJsZQorICogICAgIHRvIHRoZSB1c2VyLiAgSWYgbm90IHNwZWNpZmllZCwgb25lIHJvdyB3aWxsIGJlIHZpc2libGUuPC9saT4KKyAqIDxsaT48c3Ryb25nPnN0eWxlPC9zdHJvbmc+IC0gVGhlIENTUyBzdHlsZSBjbGFzcyB0byBiZSBhcHBsaWVkIHRvIHRoZQorICogICAgIGVudGlyZSByZW5kZXJlZCBvdXRwdXQgb2YgdGhlIGluc3RhbnQgYWN0aW9ucyBjb250cm9sLCBpZiBhbnkuPC9saT4KKyAqIDwvdWw+CisgKgorICogPHN0cm9uZz5GSVhNRTwvc3Ryb25nPiAtIEludGVybmF0aW9uYWxpemUgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlcyEKKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEFjdGlvbnNUYWcgZXh0ZW5kcyBCb2R5VGFnU3VwcG9ydCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hbmlmZXN0IENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgbmFtZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgd2UgaGF2ZSBnZW5lcmF0ZWQgdGhlIEphdmFTY3JpcHQKKyAgICAgKiBmdW5jdGlvbiBhbHJlYWR5IG9uIHRoZSBjdXJyZW50IHBhZ2UuICBUaGUgdmFsdWUgc3RvcmVkIGZvciB0aGlzCisgICAgICogYXR0cmlidXRlIGlzIGFyYml0cmFyeSAtIG9ubHkgaXRzIGV4aXN0ZW5jZSBpcyByZWxldmFudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVU5DVElPTl9UQUcgPQorICAgICAgICAib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQWN0aW9uc1RhZy5GVU5DVElPTl9UQUciOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBsYWJlbHMgZm9yIHRoZSBBY3Rpb25zIGRpc3BsYXllZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBsYWJlbHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgInNlbGVjdGVkIiBmbGFncyBmb3IgQWN0aW9ucyBkaXNwbGF5ZWQgYnkgdGhpcyBjb250cm9sLgorICAgICAqLworICAgIHByb3RlY3RlZCBBcnJheUxpc3Qgc2VsZWN0ZWRzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiAiZGlzYWJsZWQiIGZsYWdzIGZvciBBY3Rpb25zIGRpc3BsYXllZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBkaXNhYmxlZHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIFVSTHMgZm9yIHRoZSBBY3Rpb25zIGRpc3BsYXllZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgc2l6ZSA9IDE7CisKKyAgICBwdWJsaWMgaW50IGdldFNpemUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGludCBzaXplKSB7CisgICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ1NTIHN0eWxlIGNsYXNzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGVudGlyZSByZW5kZXJlZCBvdXRwdXQKKyAgICAgKiBvZiB0aGlzICJpbnN0YW50IGFjdGlvbnMiIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN0eWxlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3R5bGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zdHlsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3R5bGUoU3RyaW5nIHN0eWxlKSB7CisgICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBIVE1MIExhYmVsIHRhZyB0ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbGFiZWwgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxhYmVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICBwdWJsaWMgaW50IGRvU3RhcnRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKworICAgICAgICB0aGlzLmxhYmVscy5jbGVhcigpOworICAgICAgICB0aGlzLnNlbGVjdGVkcy5jbGVhcigpOworICAgICAgICB0aGlzLnVybHMuY2xlYXIoKTsKKworICAgICAgICByZXR1cm4gKEVWQUxfQk9EWV9CVUZGRVJFRCk7CisgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJlbmRlciB0aGlzIGluc3RhbnQgYWN0aW9ucyBjb250cm9sLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBKc3BFeGNlcHRpb24gaWYgYSBwcm9jZXNzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBpbnQgZG9FbmRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKworICAgICAgICBKc3BXcml0ZXIgb3V0ID0gcGFnZUNvbnRleHQuZ2V0T3V0KCk7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gUmVuZGVyIChvbmNlIG9ubHkpIHRoZSBKYXZhU2NyaXB0IGZ1bmN0aW9uIHdlIG5lZWQKKyAgICAgICAgICAgIGlmIChwYWdlQ29udGV4dC5nZXRBdHRyaWJ1dGUoRlVOQ1RJT05fVEFHKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPHNjcmlwdCBsYW5ndWFnZT1cIkphdmFTY3JpcHRcIj4iKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPCEtLSIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJmdW5jdGlvbiBJQV9qdW1wTWVudSh0YXJnLHNlbE9iaikgeyIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgIGRlc3QgPSBzZWxPYmoub3B0aW9uc1tzZWxPYmouc2VsZWN0ZWRJbmRleF0udmFsdWU7Iik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgaWYgKGRlc3QubGVuZ3RoID4gMCkgeyIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgICAgZXZhbCh0YXJnK1wiLmxvY2F0aW9uPSdcIitkZXN0K1wiJ1wiKTsiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICB9Iik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLy8tLT4iKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPC9zY3JpcHQ+Iik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICBwYWdlQ29udGV4dC5zZXRBdHRyaWJ1dGUoRlVOQ1RJT05fVEFHLCBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZW5kZXIgTEFCRUwgZWxlbWVudCBmb3Igc2VjdGlvbiA1MDggYWNjZXNzaWJpbGl0eQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludCgiPGxhYmVsIGZvcj1cImxhYmVsSWRcIj4iKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQobGFiZWwpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCI8L2xhYmVsPiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmVuZGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBlbGVtZW50CisgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgb3V0LnByaW50KCI8c2VsZWN0Iik7CisgICAgICAgICAgICBpZiAoc2l6ZSA+IDEpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiBzaXplPVwiIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KHNpemUpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiXCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgY2xhc3M9XCIiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoc3R5bGUpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiXCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgaWQ9XCIiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoImxhYmVsSWQiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIlwiIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG91dC5wcmludCgiIG9uY2hhbmdlPVwiSUFfanVtcE1lbnUoJ3NlbGYnLHRoaXMpXCIiKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI+Iik7CisKKyAgICAgICAgICAgIC8vIFJlbmRlciBlYWNoIGRlZmluZWQgYWN0aW9uCisgICAgICAgICAgICBpbnQgbiA9IGxhYmVscy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IChTdHJpbmcpIGxhYmVscy5nZXQoaSk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCA9ICgoQm9vbGVhbikgc2VsZWN0ZWRzLmdldChpKSkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNhYmxlZCA9ICgoQm9vbGVhbikgZGlzYWJsZWRzLmdldChpKSkuYm9vbGVhblZhbHVlKCk7ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSAoU3RyaW5nKSB1cmxzLmdldChpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIjxvcHRpb24iKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQpCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiIHNlbGVjdGVkPVwic2VsZWN0ZWRcIiIpOworICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlZCkKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgZGlzYWJsZWQ9XCJ0cnVlXCIiKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgdmFsdWU9XCIiKTsKKyAgICAgICAgICAgICAgICBpZiAodXJsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCh1cmwpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiXCIiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIj4iKTsKKyAgICAgICAgICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KGxhYmVsKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPC9vcHRpb24+Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlbmRlciB0aGUgZW5kIG9mIHRoaXMgZWxlbWVudAorICAgICAgICAgICAgb3V0LnByaW50bG4oIjwvc2VsZWN0PiIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChFVkFMX1BBR0UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIGFsbCBzdGF0ZSBpbmZvcm1hdGlvbiBzZXQgYnkgdGhpcyB0YWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKworICAgICAgICB0aGlzLmxhYmVscy5jbGVhcigpOworICAgICAgICB0aGlzLnNlbGVjdGVkcy5jbGVhcigpOworICAgICAgICB0aGlzLnVybHMuY2xlYXIoKTsKKworICAgICAgICB0aGlzLnNpemUgPSAxOworICAgICAgICB0aGlzLnN0eWxlID0gbnVsbDsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBBY3Rpb24gdG8gdGhlIHNldCB0aGF0IHdpbGwgYmUgcmVuZGVyZWQgYnkgdGhpcyBjb250cm9sLgorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVsIExvY2FsaXplZCBsYWJlbCB2aXNpYmxlIHRvIHRoZSB1c2VyCisgICAgICogQHBhcmFtIHNlbGVjdGVkIEluaXRpYWwgc2VsZWN0ZWQgc3RhdGUgb2YgdGhpcyBvcHRpb24KKyAgICAgKiBAcGFyYW0gZGlzYWJsZWQgQWJpbGl0eSB0byBiZSBzZWxlY3RlZCBzdGF0ZSBvZiB0aGlzIG9wdGlvbgorICAgICAqIEBwYXJhbSB1cmwgVVJMIHRvIHdoaWNoIGNvbnRyb2wgc2hvdWxkIGJlIHRyYW5zZmVycmVkIGlmIHNlbGVjdGVkCisgICAgICovCisgICAgdm9pZCBhZGRBY3Rpb24oU3RyaW5nIGxhYmVsLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGRpc2FibGVkLCBTdHJpbmcgdXJsKSB7CisKKyAgICAgICAgbGFiZWxzLmFkZChsYWJlbCk7CisgICAgICAgIHNlbGVjdGVkcy5hZGQobmV3IEJvb2xlYW4oc2VsZWN0ZWQpKTsKKyAgICAgICAgZGlzYWJsZWRzLmFkZChuZXcgQm9vbGVhbihkaXNhYmxlZCkpOworICAgICAgICB1cmxzLmFkZCh1cmwpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQXBwbGljYXRpb25Mb2NhbGVzLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQXBwbGljYXRpb25Mb2NhbGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2YzI2NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9BcHBsaWNhdGlvbkxvY2FsZXMuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworCisvKioKKyAqIENsYXNzIHRvIGhvbGQgdGhlIExvY2FsZXMgc3VwcG9ydGVkIGJ5IHRoaXMgcGFja2FnZS4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgTHVieQorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBcHBsaWNhdGlvbkxvY2FsZXMgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgc2V0IG9mIExvY2FsZXMgc3VwcG9ydGVkIGJ5IHRoaXMgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmxldCBBY3Rpb25TZXJ2bGV0IHdlIGFyZSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25Mb2NhbGVzKEFjdGlvblNlcnZsZXQgc2VydmxldCkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIExvY2FsZSBsaXN0W10gPSBMb2NhbGUuZ2V0QXZhaWxhYmxlTG9jYWxlcygpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IChNZXNzYWdlUmVzb3VyY2VzKQorICAgICAgICAgICAgICAgIHNlcnZsZXQuZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGUoR2xvYmFscy5NRVNTQUdFU19LRVkpOworICAgICAgICBpZiAocmVzb3VyY2VzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFN0cmluZyBjb25maWcgPSByZXNvdXJjZXMuZ2V0Q29uZmlnKCk7CisgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0KKyAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGNvbmZpZywgbGlzdFtpXSk7CisgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAobGlzdFtpXS5lcXVhbHMoYnVuZGxlLmdldExvY2FsZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbGVMYWJlbHMuYWRkKGxpc3RbaV0uZ2V0RGlzcGxheU5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsZVZhbHVlcy5hZGQobGlzdFtpXS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkTG9jYWxlcy5hZGQobGlzdFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgICAgIHNlcnZsZXQubG9nKCJNaXNzaW5nIGxvY2FsZSAiICsgbGlzdFtpXSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIExvY2FsZSBsYWJlbHMgc3VwcG9ydGVkIGJ5IHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBsb2NhbGVMYWJlbHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgTG9jYWxlIHZhbHVlcyBzdXBwb3J0ZWQgYnkgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IGxvY2FsZVZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBzdXBwb3J0ZWQgTG9jYWxlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IHN1cHBvcnRlZExvY2FsZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBMb2NhbGUgbGFiZWxzIHN1cHBvcnRlZCBieSB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldExvY2FsZUxhYmVscygpIHsKKworICAgICAgICByZXR1cm4gKGxvY2FsZUxhYmVscyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIExvY2FsZSB2YWx1ZXMgc3VwcG9ydGVkIGJ5IHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0TG9jYWxlVmFsdWVzKCkgeworCisgICAgICAgIHJldHVybiAobG9jYWxlVmFsdWVzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgTG9jYWxlcyBzdXBwb3J0ZWQgYnkgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRTdXBwb3J0ZWRMb2NhbGVzKCkgeworCisgICAgICAgIHJldHVybiAoc3VwcG9ydGVkTG9jYWxlcyk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FwcGxpY2F0aW9uUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQXBwbGljYXRpb25SZXNvdXJjZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTY2ODg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FwcGxpY2F0aW9uUmVzb3VyY2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0NTIgQEAKK2FwcGxpY2F0aW9uLnRpdGxlPVRvbWNhdCBTZXJ2ZXIgQWRtaW5pc3RyYXRpb24KK2Vycm9ycy5oZWFkZXI9PGgyPjxmb250IGNvbG9yPSJyZWQiPlZhbGlkYXRpb24gRXJyb3JzPC9mb250PjwvaDI+WW91IG11c3QgY29ycmVjdCB0aGUgZm9sbG93aW5nIGVycm9ycyBiZWZvcmUgcHJvY2VlZGluZzo8dWw+CitlcnJvcnMuZm9vdGVyPTwvdWw+PGhyPgorZXJyb3IubG9naW49PGxpPkludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQ8L2xpPgorcHJvbXB0LnVzZXJuYW1lPVVzZXIgTmFtZQorcHJvbXB0LnBhc3N3b3JkPVBhc3N3b3JkCitidXR0b24ubG9naW49TG9naW4KK2J1dHRvbi5yZXNldD1SZXNldAorYnV0dG9uLnNhdmU9U2F2ZQorYnV0dG9uLmNoYW5nZT1DaGFuZ2UKK2J1dHRvbi5jYW5jZWw9UmVzZXQKK2J1dHRvbi5jb21taXQ9Q29tbWl0IENoYW5nZXMKK2J1dHRvbi5sb2dvdXQ9TG9nIE91dAorbG9naW4uZW50ZXI9RW50ZXIgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgdG8gc3RhcnQgYSBuZXcgc2Vzc2lvbgorbG9naW4uY2hhbmdlTGFuZ3VhZ2U9Q2hhbmdlIHRoZSBsYW5ndWFnZQorZXJyb3IubG9naW49SW52YWxpZCB1c2VybmFtZSBvciBwYXNzd29yZAorZXJyb3IudHJ5YWdhaW49VG8gdHJ5IGFnYWluLCBjbGljaworZXJyb3IuaGVyZT1oZXJlCitwcm9tcHQuc29tZVRleHQ9U29tZSBUZXh0Citwcm9tcHQubW9yZVRleHQ9TW9yZSBUZXh0CitzYW1wbGUuc29tZVRleHQucmVxdWlyZWQ9PGxpPiJTb21lIFRleHQiIGNhbm5vdCBiZSBlbXB0eTwvbGk+CitzYW1wbGUubW9yZVRleHQucmVxdWlyZWQ9PGxpPiJNb3JlIFRleHQiIGNhbm5vdCBiZSBlbXB0eTwvbGk+CitzYXZlLnN1Y2Nlc3M9U2F2ZSBzdWNlc3NmdWwhCitzYXZlLmZhaWw9U2F2ZSBmYWlsZWQhCitzZXJ2ZXIucG9ydG51bWJlcj1Qb3J0IE51bWJlcgorc2VydmVyLmRlYnVnbGV2ZWw9RGVidWcgTGV2ZWwKK3NlcnZlci5zaHV0ZG93bj1TaHV0ZG93bgorc2VydmVyLnByb3BlcnRpZXM9U2VydmVyIFByb3BlcnRpZXMKK3dhcm5pbmcuaGVhZGVyPTxjZW50ZXI+PGg0Pjxmb250IGNvbG9yPSJyZWQiPldhcm5pbmchPC9mb250PjwvaDQ+PC9jZW50ZXI+IDx1bD4KK3NlcnZlci5wb3J0Lndhcm5pbmc9PGxpPlBvcnQgbnVtYmVyIGxlc3MgdGhhbiAxMDI0IHJlcXVpcmVzIHNwZWNpYWwgc29mdHdhcmUgY2FwYWJpbGl0aWVzLgorZXJyb3IucG9ydE51bWJlci5yZXF1aXJlZD08bGk+UG9ydE51bWJlciBjYW5ub3QgYmUgZW1wdHk8L2xpPgorZXJyb3IucG9ydE51bWJlci5mb3JtYXQ9PGxpPlBvcnROdW1iZXIgbm90IGEgdmFsaWQgaW50ZWdlciE8L2xpPgorZXJyb3IucG9ydE51bWJlci5yYW5nZT08bGk+UG9ydE51bWJlciBzZWVtcyBvdXQgb2YgcmFuZ2UuIFZhbGlkIHJhbmdlIGlzIDEtNjU1MzUuIDwvbGk+CitlcnJvci5zaHV0ZG93blRleHQubGVuZ3RoPTxsaT5TaHV0ZG93biBUZXh0IG11c3QgYmUgYXRsZWFzdCA2IGNoYXJhY3RlcnM8L2xpPgorZXJyb3IuZW5naW5lTmFtZS5yZXF1aXJlZD08bGk+RW5naW5lIG5hbWUgaXMgcmVxdWlyZWQ8L2xpPgorZXJyb3IuYWNjZXB0Q291bnRUZXh0LnJlcXVpcmVkPTxsaT5BY2NlcHQgY291bnQgcmVxdWlyZWQ8L2xpPgorZXJyb3IuYWNjZXB0Q291bnRUZXh0LmZvcm1hdD08bGk+QWNjZXB0IGNvdW50IG5vdCBhIHZhbGlkIGludGVnZXIhPC9saT4KK2Vycm9yLmFjY2VwdENvdW50VGV4dC5yYW5nZT08bGk+QWNjZXB0IGNvdW50IHNlZW1zIG91dCBvZiByYW5nZS4gVmFsaWQgcmFuZ2UgaXMgMC0xMjguIDwvbGk+CitlcnJvci5jb25uVGltZU91dFRleHQucmVxdWlyZWQ9PGxpPkNvbm5lY3Rpb24gdGltZSBvdXQgcmVxdWlyZWQ8L2xpPgorZXJyb3IuY29ublRpbWVPdXRUZXh0LmZvcm1hdD08bGk+Q29ubmVjdGlvbiB0aW1lIG91dCBub3QgYSB2YWxpZCBpbnRlZ2VyITwvbGk+CitlcnJvci5jb25uVGltZU91dFRleHQucmFuZ2U9PGxpPkNvbm5lY3Rpb24gdGltZSBvdXQgc2VlbXMgb3V0IG9mIHJhbmdlLiBWYWxpZCByYW5nZSBpcyAwLTYwMDAwLiA8L2xpPgorZXJyb3IuYnVmZmVyU2l6ZVRleHQucmVxdWlyZWQ9PGxpPkJ1ZmZlciBTaXplIHJlcXVpcmVkPC9saT4KK2Vycm9yLmJ1ZmZlclNpemVUZXh0LmZvcm1hdD08bGk+QnVmZmVyIFNpemUgbm90IGEgdmFsaWQgaW50ZWdlciE8L2xpPgorZXJyb3IuYnVmZmVyU2l6ZVRleHQucmFuZ2U9PGxpPkJ1ZmZlciBTaXplIHNlZW1zIG91dCBvZiByYW5nZS4gVmFsaWQgcmFuZ2UgaXMgMS04MTkyLiA8L2xpPgorZXJyb3IuYWRkcmVzcy5pbnZhbGlkPTxsaT5JUCBBZGRyZXNzIGludmFsaWQ8L2xpPgorZXJyb3IucmVkaXJlY3RQb3J0VGV4dC5yZXF1aXJlZD08bGk+UmVkaXJlY3QgUG9ydCBOdW1iZXIgY2Fubm90IGJlIGVtcHR5PC9saT4KK2Vycm9yLnJlZGlyZWN0UG9ydFRleHQuZm9ybWF0PTxsaT5SZWRpcmVjdCBQb3J0IE51bWJlciBub3QgYSB2YWxpZCBpbnRlZ2VyITwvbGk+CitlcnJvci5yZWRpcmVjdFBvcnRUZXh0LnJhbmdlPTxsaT5SZWRpcmVjdCBQb3J0IE51bWJlciBzZWVtcyBvdXQgb2YgcmFuZ2UuIFZhbGlkIHJhbmdlIGlzIDEtNjU1MzUuIDwvbGk+CitlcnJvci5taW5Qcm9jZXNzb3JzVGV4dC5yZXF1aXJlZD08bGk+TWluaW11bSBQcm9jZXNzb3JzIGNhbm5vdCBiZSBlbXB0eTwvbGk+CitlcnJvci5taW5Qcm9jZXNzb3JzVGV4dC5mb3JtYXQ9PGxpPk1pbmltdW0gUHJvY2Vzc29ycyBub3QgYSB2YWxpZCBpbnRlZ2VyITwvbGk+CitlcnJvci5taW5Qcm9jZXNzb3JzVGV4dC5yYW5nZT08bGk+TWluaW11bSBQcm9jZXNzb3JzIHNlZW1zIG91dCBvZiByYW5nZS4gVmFsaWQgcmFuZ2UgaXMgMS01MTIuIDwvbGk+CitlcnJvci5tYXhQcm9jZXNzb3JzVGV4dC5yZXF1aXJlZD08bGk+TWF4aW11bSBQcm9jZXNzb3JzIGNhbm5vdCBiZSBlbXB0eTwvbGk+CitlcnJvci5tYXhQcm9jZXNzb3JzVGV4dC5mb3JtYXQ9PGxpPk1heGltdW0gUHJvY2Vzc29ycyBub3QgYSB2YWxpZCBpbnRlZ2VyITwvbGk+CitlcnJvci5tYXhQcm9jZXNzb3JzVGV4dC5yYW5nZT08bGk+TWF4aW11bSBQcm9jZXNzb3JzIHNlZW1zIG91dCBvZiByYW5nZS4gVmFsaWQgcmFuZ2UgaXMgMS01MTIuIEFsc28sIG1heGltdW0gPj0gbWluaW11bS4gPC9saT4KK2Vycm9yLnByb3h5TmFtZS5pbnZhbGlkPTxsaT5Qcm94eSBuYW1lIGlzIGludmFsaWQ8L2xpPgorZXJyb3IucHJveHlQb3J0VGV4dC5yZXF1aXJlZD08bGk+UHJveHkgUG9ydCBOdW1iZXIgY2Fubm90IGJlIGVtcHR5PC9saT4KK2Vycm9yLnByb3h5UG9ydFRleHQuZm9ybWF0PTxsaT5Qcm94eSBQb3J0IE51bWJlciBub3QgYSB2YWxpZCBpbnRlZ2VyITwvbGk+CitlcnJvci5wcm94eVBvcnRUZXh0LnJhbmdlPTxsaT5Qcm94eSBQb3J0IE51bWJlciBzZWVtcyBvdXQgb2YgcmFuZ2UuIFZhbGlkIHJhbmdlIGlzIDEtNjU1MzUuIDwvbGk+CitlcnJvci5ob3N0TmFtZS5iYWQ9SW52YWxpZCBob3N0IG5hbWUgezB9CitlcnJvci5ob3N0TmFtZS5yZXF1aXJlZD08bGk+SG9zdG5hbWUgaXMgcmVxdWlyZWQ8L2xpPgorZXJyb3IuaG9zdE5hbWUuZXhpc3RzPTxsaT5Ib3N0bmFtZSBhbHJlYWR5IGV4aXN0czwvbGk+CitlcnJvci5hcHBCYXNlLnJlcXVpcmVkPTxsaT5BcHBsaWNhdGlvbiBCYXNlIGlzIHJlcXVpcmVkPC9saT4KK3NlcnZpY2UubmFtZT1OYW1lCitzZXJ2aWNlLmVuZ2luZS5wcm9wcz1FbmdpbmUgUHJvcGVydGllcworc2VydmljZS5kZWZhdWx0aG9zdG5hbWU9RGVmYXVsdCBIb3N0bmFtZQorc2VydmljZS5wcm9wZXJ0aWVzPVNlcnZpY2UgUHJvcGVydGllcworc2VydmljZS5wcm9wZXJ0eT1Qcm9wZXJ0eQorc2VydmljZS52YWx1ZT1WYWx1ZQorc2VydmljZS5jcmVhdGUubmV3PUNyZWF0ZSBOZXcgU2VydmljZQorYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucz1BdmFpbGFibGUgQWN0aW9ucworYWN0aW9ucy5zZXJ2aWNlcy5jcmVhdGU9Q3JlYXRlIE5ldyBTZXJ2aWNlCithY3Rpb25zLnNlcnZpY2VzLmRlbGV0ZT1EZWxldGUgVGhpcyBTZXJ2aWNlCithY3Rpb25zLnNlcnZpY2VzLmRlbGV0ZXM9RGVsZXRlIEV4aXN0aW5nIFNlcnZpY2VzCithY3Rpb25zLnNlcnZpY2VzLmVkaXQ9RWRpdCBFeGlzdGluZyBTZXJ2aWNlCithY3Rpb25zLmFjY2Vzc2xvZ2dlci5jcmVhdGU9Q3JlYXRlIE5ldyBBY2Nlc3MgTG9nZ2VyCithY3Rpb25zLmFjY2Vzc2xvZ2dlci5kZWxldGU9RGVsZXRlIEFjY2VzcyBMb2dnZXIKK2FjdGlvbnMuY29ubmVjdG9ycy5jcmVhdGU9Q3JlYXRlIE5ldyBDb25uZWN0b3IKK2FjdGlvbnMuY29ubmVjdG9ycy5kZWxldGU9RGVsZXRlIFRoaXMgQ29ubmVjdG9yCithY3Rpb25zLmNvbm5lY3RvcnMuZGVsZXRlcz1EZWxldGUgRXhpc3RpbmcgQ29ubmVjdG9ycworYWN0aW9ucy5jb25uZWN0b3JzLmVkaXQ9RWRpdCBFeGlzdGluZyBDb25uZWN0b3IKK2FjdGlvbnMuY29udGV4dHMuY3JlYXRlPUNyZWF0ZSBOZXcgQ29udGV4dAorYWN0aW9ucy5jb250ZXh0cy5kZWxldGU9RGVsZXRlIFRoaXMgQ29udGV4dAorYWN0aW9ucy5jb250ZXh0cy5kZWxldGVzPURlbGV0ZSBFeGlzdGluZyBDb250ZXh0cworYWN0aW9ucy5jb250ZXh0cy5lZGl0PUVkaXQgRXhpc3RpbmcgQ29udGV4dAorYWN0aW9ucy5kZWZhdWx0Y29udGV4dHMuY3JlYXRlPUNyZWF0ZSBOZXcgRGVmYXVsdENvbnRleHQKK2FjdGlvbnMuZGVmYXVsdGNvbnRleHRzLmRlbGV0ZT1EZWxldGUgVGhpcyBEZWZhdWx0Q29udGV4dAorYWN0aW9ucy5kZWZhdWx0Y29udGV4dHMuZGVsZXRlcz1EZWxldGUgRXhpc3RpbmcgRGVmYXVsdENvbnRleHQKK2FjdGlvbnMuZGVmYXVsdGNvbnRleHRzLmVkaXQ9RWRpdCBFeGlzdGluZyBEZWZhdWx0Q29udGV4dAorYWN0aW9ucy5ncm91cC5jcmVhdGU9Q3JlYXRlIE5ldyBHcm91cAorYWN0aW9ucy5ncm91cC5kZWxldGU9RGVsZXRlIEV4aXN0aW5nIEdyb3VwCithY3Rpb25zLmhvc3RzLmNyZWF0ZT1DcmVhdGUgTmV3IEhvc3QKK2FjdGlvbnMuaG9zdHMuZGVsZXRlPURlbGV0ZSBUaGlzIEhvc3QKK2FjdGlvbnMuaG9zdHMuZGVsZXRlcz1EZWxldGUgRXhpc3RpbmcgSG9zdHMKK2FjdGlvbnMuaG9zdHMuZWRpdD1FZGl0IEV4aXN0aW5nIEhvc3QKK2FjdGlvbnMubG9nZ2Vycy5jcmVhdGU9Q3JlYXRlIE5ldyBMb2dnZXIKK2FjdGlvbnMubG9nZ2Vycy5kZWxldGU9RGVsZXRlIFRoaXMgTG9nZ2VyCithY3Rpb25zLmxvZ2dlcnMuZGVsZXRlcz1EZWxldGUgRXhpc3RpbmcgTG9nZ2VycworYWN0aW9ucy5sb2dnZXJzLmVkaXQ9RWRpdCBFeGlzdGluZyBMb2dnZXIKK2FjdGlvbnMucmVhbG1zLmNyZWF0ZT1DcmVhdGUgTmV3IFVzZXIgUmVhbG0KK2FjdGlvbnMucmVhbG1zLmRlbGV0ZT1EZWxldGUgVGhpcyBVc2VyIFJlYWxtCithY3Rpb25zLnJlYWxtcy5kZWxldGVzPURlbGV0ZSBVc2VyIFJlYWxtcworYWN0aW9ucy5yZWFsbXMuZWRpdD1FZGl0IEV4aXN0aW5nIFJlYWxtCithY3Rpb25zLnJlcXVlc3RmaWx0ZXIuY3JlYXRlPUNyZWF0ZSBOZXcgUmVxdWVzdCBGaWx0ZXIKK2FjdGlvbnMucmVxdWVzdGZpbHRlci5kZWxldGU9RGVsZXRlIFJlcXVlc3QgRmlsdGVycworYWN0aW9ucy51c2VyLmNyZWF0ZT1DcmVhdGUgTmV3IFVzZXIKK2FjdGlvbnMudXNlci5kZWxldGU9RGVsZXRlIEV4aXN0aW5nIFVzZXIKK2FjdGlvbnMudmFsdmVzLmNyZWF0ZT1DcmVhdGUgTmV3IFZhbHZlCithY3Rpb25zLnZhbHZlcy5lZGl0PUVkaXQgVmFsdmUKK2FjdGlvbnMudmFsdmVzLmRlbGV0ZT1EZWxldGUgVGhpcyBWYWx2ZQorYWN0aW9ucy52YWx2ZXMuZGVsZXRlcz1EZWxldGUgRXhpc3RpbmcgVmFsdmVzCithY3Rpb25zLmFsaWFzLmNyZWF0ZT1DcmVhdGUgTmV3IEFsaWFzZXMKK2FjdGlvbnMuYWxpYXMuZGVsZXRlPURlbGV0ZSBBbGlhc2VzCituZXcuYWxpYXM9TmV3IEFsaWFzCitjb25uZWN0b3IudHlwZT1UeXBlCitjb25uZWN0b3Iuc2NoZW1lPVNjaGVtZQorY29ubmVjdG9yLmFjY2VwdC5jb3VudD1BY2NlcHQgQ291bnQKK2Nvbm5lY3Rvci5jb21wcmVzc2lvbj1Db21wcmVzc2lvbgorY29ubmVjdG9yLmNvbm5lY3Rpb24ubGluZ2VyPUNvbm5lY3Rpb24gTGluZ2VyCitjb25uZWN0b3IuY29ubmVjdGlvbi50aW1lb3V0PUNvbm5lY3Rpb24gVGltZW91dAorY29ubmVjdG9yLmNvbm5lY3Rpb24udXBsb2FkVGltZW91dD1Db25uZWN0aW9uIFVwbG9hZCBUaW1lb3V0Citjb25uZWN0b3IuZGVmYXVsdC5idWZmZXI9RGVmYXVsdCBCdWZmZXIgU2l6ZQorY29ubmVjdG9yLmNvbm5lY3Rpb24uZGlzYWJsZVVwbG9hZFRpbWVvdXQ9RGlzYWJsZSBVcGxvYWQgVGltZW91dAorY29ubmVjdG9yLmVuYWJsZS5kbnM9RW5hYmxlIEROUyBMb29rdXBzCitjb25uZWN0b3IudXJpZW5jb2Rpbmc9VVJJIEVuY29kaW5nCitjb25uZWN0b3IudXNlQm9keUVuY29kaW5nRm9yVVJJPVVzZSBCb2R5IEVuY29kaW5nIEZvciBVUkkgUXVlcnkgUGFyYW1ldGVycworY29ubmVjdG9yLmFsbG93VHJhY2U9QWxsb3cgVFJBQ0UgTWV0aG9kCitjb25uZWN0b3IuYWRkcmVzcy5pcD1JUCBBZGRyZXNzCitjb25uZWN0b3IucmVkaXJlY3QucG9ydG51bWJlcj1SZWRpcmVjdCBQb3J0IE51bWJlcgorY29ubmVjdG9yLm1pbj1NaW5pbXVtCitjb25uZWN0b3IubWlsbGlzZWNvbmRzPW1pbGxpc2Vjb25kcworY29ubmVjdG9yLm1heD1NYXhpbXVtCitjb25uZWN0b3IubWF4a2VlcGFsaXZlPU1heCBLZWVwQWxpdmUgUmVxdWVzdHMKK2Nvbm5lY3Rvci5tYXhzcGFyZT1NYXggU3BhcmUgVGhyZWFkcworY29ubmVjdG9yLm1heHRocmVhZHM9TWF4IFRocmVhZHMKK2Nvbm5lY3Rvci5taW5zcGFyZT1NaW4gU3BhcmUgVGhyZWFkcworY29ubmVjdG9yLnRocmVhZHByaW9yaXR5PVByb2Nlc3NvciBUaHJlYWQgUHJpb3JpdHkKK2Nvbm5lY3Rvci5wcm94eS5uYW1lPVByb3h5IE5hbWUKK2Nvbm5lY3Rvci5wcm94eS5wb3J0bnVtYmVyPVByb3h5IFBvcnQgTnVtYmVyCitjb25uZWN0b3IuYWxnb3JpdGhtPUFsZ29yaXRobQorY29ubmVjdG9yLmNpcGhlcnM9Q2lwaGVycworY29ubmVjdG9yLmNsaWVudC5hdXRoPUNsaWVudCBBdXRoZW50aWNhdGlvbgorY29ubmVjdG9yLmtleXN0b3JlLmZpbGVuYW1lPUtleXN0b3JlIEZpbGVuYW1lCitjb25uZWN0b3Iua2V5c3RvcmUucGFzc3dvcmQ9S2V5c3RvcmUgUGFzc3dvcmQKK2Nvbm5lY3Rvci5rZXlzdG9yZS50eXBlPUtleXN0b3JlIFR5cGUKK2Nvbm5lY3Rvci50cnVzdHN0b3JlLmZpbGVuYW1lPVRydXN0IFN0b3JlIEZpbGVuYW1lCitjb25uZWN0b3IudHJ1c3RzdG9yZS5wYXNzd29yZD1UcnVzdCBTdG9yZSBQYXNzd29yZAorY29ubmVjdG9yLnRydXN0c3RvcmUudHlwZT1UcnVzdCBTdG9yZSBUeXBlCitjb25uZWN0b3Iuc3NsUHJvdG9jb2w9U1NMIFByb3RvY29sCitjb25uZWN0b3Iua2V5UGFzcy53YXJuaW5nPTxsaT5QbGVhc2UgdXNlIGtleXRvb2wgdG8gZ2VuZXJhdGUgY2VydGlmaWNhdGUuPC9saT4KK2Nvbm5lY3Rvci5zZWN1cmU9U2VjdXJlCitjb25uZWN0b3IudGNwTm9EZWxheT1UQ1AgTm8gRGVsYXkgCitjb25uZWN0b3IueHBvd2VyZWRieT1YIFBvd2VyZWQgQnkgCitob3N0LnByb3BlcnRpZXM9SG9zdCBQcm9wZXJ0aWVzCitob3N0Lm5hbWU9TmFtZQoraG9zdC5iYXNlPUFwcGxpY2F0aW9uIEJhc2UKK2hvc3QuYXV0b0RlcGxveT1BdXRvIERlcGxveQoraG9zdC5kZXBsb3lYTUw9RGVwbG95IFhNTAoraG9zdC5kZXBsb3lPblN0YXJ0dXA9RGVwbG95IE9uIFN0YXJ0dXAKK2hvc3Qud2Fycz1VbnBhY2sgV0FScworaG9zdC5hbGlhc2VzPUFsaWFzZXMKK2hvc3QuYWxpYXMubmFtZT1BbGlhcyBOYW1lCitob3N0LnhtbE5hbWVzcGFjZUF3YXJlPVhNTCBOYW1lc3BhY2UgQXdhcmUKK2hvc3QueG1sVmFsaWRhdGlvbj1YTUwgVmFsaWRhdGlvbgorZXJyb3IuYWxpYXNOYW1lLmV4aXN0cz08bGk+QWxpYXMgYWxyZWFkeSBleGlzdHM8L2xpPgorZXJyb3IuYWxpYXNOYW1lLnJlcXVpcmVkPTxsaT5BbGlhcyBuYW1lIGlzIHJlcXVpcmVkPC9saT4KK2NvbnRleHQucHJvcGVydGllcz1Db250ZXh0IFByb3BlcnRpZXMKK2NvbnRleHQuY29va2llcz1Db29raWVzCitjb250ZXh0LmNyb3NzLmNvbnRleHQ9Q3Jvc3MgQ29udGV4dAorY29udGV4dC5kb2NCYXNlPURvY3VtZW50IEJhc2UKK2NvbnRleHQub3ZlcnJpZGU9T3ZlcnJpZGUKK2NvbnRleHQucHJpdmlsZWdlZD1Qcml2aWxlZ2VkCitjb250ZXh0LnBhdGg9UGF0aAorY29udGV4dC5yZWxvYWRhYmxlPVJlbG9hZGFibGUKK2NvbnRleHQuc3dhbGxvd091dHB1dD1Td2FsbG93IE91dHB1dAorY29udGV4dC51c2VuYW1pbmc9VXNlIE5hbWluZworY29udGV4dC53b3JrZGlyPVdvcmtpbmcgRGlyZWN0b3J5Citjb250ZXh0LmxvYWRlci5wcm9wZXJ0aWVzPUxvYWRlciBQcm9wZXJ0aWVzCitjb250ZXh0LnNlc3Npb25tZ3IucHJvcGVydGllcz1TZXNzaW9uIE1hbmFnZXIgUHJvcGVydGllcworY29udGV4dC5jaGVja0ludGVydmFsPUNoZWNrIGludGVydmFsCitjb250ZXh0LnNlc3Npb25JZD1TZXNzaW9uIElEIEluaXRpYWxpemVyCitjb250ZXh0Lm1heC5zZXNzaW9ucz1NYXhpbXVtIEFjdGl2ZSBTZXNzaW9ucworY29udGV4dC5hbnRpUmVzb3VyY2VMb2NraW5nPVByZXZlbnQgTG9ja2luZyBSZXNvdXJjZXMKK2NvbnRleHQuYW50aUphckxvY2tpbmc9UHJldmVudCBKYXIgTG9ja2luZworZGVmYXVsdGNvbnRleHQucHJvcGVydGllcz1EZWZhdWx0Q29udGV4dCBQcm9wZXJ0aWVzCitlcnJvci5jb250ZXh0LmRpcmVjdG9yeT1Eb2N1bWVudCBiYXNlIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIHJlYWRhYmxlIGRpcmVjdG9yeQorZXJyb3IuZG9jQmFzZS5yZXF1aXJlZD08bGk+RG9jdW1lbnQgYmFzZSBjYW5ub3QgYmUgbnVsbDwvbGk+CitlcnJvci5wYXRoLnJlcXVpcmVkPTxsaT5QYXRoIGNhbm5vdCBiZSBudWxsPC9saT4KK2Vycm9yLndvcmtEaXIucmVxdWlyZWQ9PGxpPldvcmtpbmcgZGlyZWN0b3J5IGNhbm5vdCBiZSBudWxsPC9saT4KK2Vycm9yLmxkckNoZWNrSW50ZXJ2YWwucmVxdWlyZWQ9PGxpPkxvYWRlciBjaGVjayBpbnRlcnZhbCBjYW5ub3QgYmUgZW1wdHk8L2xpPgorZXJyb3IubGRyQ2hlY2tJbnRlcnZhbC5mb3JtYXQ9PGxpPkxvYWRlciBjaGVjayBpbnRlcnZhbCBub3QgYSB2YWxpZCBpbnRlZ2VyITwvbGk+CitlcnJvci5sZHJDaGVja0ludGVydmFsLnJhbmdlPTxsaT5Mb2FkZXIgY2hlY2sgaW50ZXJ2YWwgc2VlbXMgb3V0IG9mIHJhbmdlLiBWYWxpZCByYW5nZSBpcyAxLTEwMDAuIDwvbGk+CitlcnJvci5tZ3JDaGVja0ludGVydmFsLnJlcXVpcmVkPTxsaT5NYW5hZ2VyIGNoZWNrIGludGVydmFsIGNhbm5vdCBiZSBlbXB0eTwvbGk+CitlcnJvci5tZ3JDaGVja0ludGVydmFsLmZvcm1hdD08bGk+TWFuYWdlciBjaGVjayBpbnRlcnZhbCBub3QgYSB2YWxpZCBpbnRlZ2VyITwvbGk+CitlcnJvci5tZ3JDaGVja0ludGVydmFsLnJhbmdlPTxsaT5NYW5hZ2VyIGNoZWNrIGludGVydmFsIHNlZW1zIG91dCBvZiByYW5nZS4gVmFsaWQgcmFuZ2UgaXMgMS0xMDAwLiA8L2xpPgorZXJyb3IubWdyU2Vzc2lvbklESW5pdC5yZXF1aXJlZD08bGk+U2Vzc2lvbiBNYW5hZ2VyIEluaXRpYWxpemF0aW9uIElEIGNhbm5vdCBiZSBlbXB0eTwvbGk+CitlcnJvci5tZ3JNYXhTZXNzaW9ucy5yZXF1aXJlZD08bGk+TWF4aW11bSBzZXNzaW9ucyBjYW5ub3QgYmUgZW1wdHk8L2xpPgorZXJyb3IubWdyTWF4U2Vzc2lvbnMuZm9ybWF0PTxsaT5NYXhpbXVtIHNlc3Npb25zIG5vdCBhIHZhbGlkIGludGVnZXIhPC9saT4KK2Vycm9yLm1nck1heFNlc3Npb25zLnJhbmdlPTxsaT5NYXhpbXVtIHNlc3Npb25zIHNlZW1zIG91dCBvZiByYW5nZS4gVmFsaWQgcmFuZ2UgaXMgLTEgdG8gMTAwLiA8L2xpPgorbGlzdC5ub25lPShOb25lKQorbG9nZ2VyLmRpcmVjdG9yeT1EaXJlY3RvcnkKK2xvZ2dlci5wcmVmaXg9UHJlZml4Citsb2dnZXIuc3VmZml4PVN1ZmZpeAorbG9nZ2VyLnRpbWVzdGFtcD1UaW1lc3RhbXAKK2xvZ2dlci5maWxlbG9nZ2VyLnByb3BlcnRpZXM9RmlsZWxvZ2dlciBzcGVjaWZpYyBQcm9wZXJ0aWVzCitsb2dnZXIudmVyYm9zaXR5bGV2ZWw9VmVyYm9zaXR5IExldmVsCitlcnJvci5sb2dnZXJOYW1lLmJhZD1JbnZhbGlkIGxvZ2dlciBuYW1lIHswfQorZXJyb3IubG9nZ2VyTmFtZS5leGlzdHM9PGxpPkEgTG9nZ2VyIGFscmVhZHkgZXhpc3RzLjwvbGk+CitlcnJvci5kaXJlY3RvcnkucmVxdWlyZWQ9PGxpPkRpcmVjdG9yeSBjYW5ub3QgYmUgZW1wdHkuPC9saT4KK2Vycm9yLnByZWZpeC5yZXF1aXJlZD08bGk+UHJlZml4IGNhbm5vdCBiZSBlbXB0eS48L2xpPgorZXJyb3Iuc3VmZml4LnJlcXVpcmVkPTxsaT5TdWZmaXggY2Fubm90IGJlIGVtcHR5LjwvbGk+CitlcnJvci52YWx2ZU5hbWUuYmFkPUludmFsaWQgdmFsdmUgbmFtZSB7MH0KK2Vycm9yLnZhdmx2ZU5hbWUuZXhpc3RzPTxsaT5WYWx2ZSBhbHJlYWR5IGV4aXN0czwvbGk+CitlcnJvci5zaW5nbGVTaWduT24uZXhpc3RzPTxsaT5TaW5nbGVTaWduT24gVmFsdmUgYWxyZWFkeSBleGlzdHM8L2xpPgordXNlci5mdWxsTmFtZT1GdWxsIE5hbWUKK3VzZXIuZ3JvdXBzPU1lbWJlciBpbiBHcm91cHMKK3VzZXIubmV3VXNlcj1DcmVhdGUgTmV3IFVzZXIgUHJvcGVydGllcwordXNlci5vbGRVc2VyPUVkaXQgRXhpc3RpbmcgVXNlciBQcm9wZXJ0aWVzCit1c2VyLnBhc3N3b3JkPVBhc3N3b3JkCit1c2VyLnByb3BlcnRpZXM9VXNlciBQcm9wZXJ0aWVzCit1c2VyLnJvbGVzPVNlY3VyaXR5IFJvbGVzCit1c2VyLnVzZXJuYW1lPVVzZXJuYW1lCitlcnJvci5wYXNzd29yZC5yZXF1aXJlZD08bGk+UGFzc3dvcmQgaXMgcmVxdWlyZWQ8L2xpPgorZXJyb3IudXNlcm5hbWUucmVxdWlyZWQ9PGxpPlVzZXJuYW1lIGlzIHJlcXVpcmVkPC9saT4KK2Vycm9yLmdldC5hdHRyaWJ1dGVzPUVycm9yIHJldHJpZXZpbmcgaW5mb3JtYXRpb24gcHJvcGVydGllcy4KK2Vycm9yLnNldC5hdHRyaWJ1dGVzPUVycm9yIHNldHRpbmcgaW5mb3JtYXRpb24gcHJvcGVydGllcy4KK2FjdGlvbnMuZGVsZXRlPURlbGV0ZQorZXJyb3IuZGVmYXVsdEhvc3QucmVxdWlyZWQ9PGxpPkRlZmF1bHQgSG9zdG5hbWUgcmVxdWlyZWQ8L2xpPgorZXJyb3IuZW5naW5lTmFtZS5iYWQ9SW52YWxpZCBlbmdpbmUgbmFtZSB7MH0KK2Vycm9yLmVuZ2luZU5hbWUuZXhpc3RzPTxsaT5FbmdpbmUgTmFtZSBhbHJlYWR5IGV4aXN0czwvbGk+CitlcnJvci5zZXJ2aWNlTmFtZS5iYWQ9SW52YWxpZCBzZXJ2aWNlIG5hbWUgezB9CitlcnJvci5zZXJ2aWNlTmFtZS5yZXF1aXJlZD08bGk+U2VydmljZSBOYW1lIHJlcXVpcmVkPC9saT4KK2Vycm9yLnNlcnZpY2VOYW1lLmV4aXN0cz08bGk+U2VydmljZSBOYW1lIGFscmVhZHkgZXhpc3RzPC9saT4KK2Vycm9yLmpkYmNyZWFsbT1FcnJvciBvY2N1cmVkIGR1cmluZyBzZXR0aW5nIEpEQkNSZWFsbS4KK2Vycm9yLmpuZGlyZWFsbT1FcnJvciBvY2N1cmVkIGR1cmluZyBzZXR0aW5nIEpORElSZWFsbS4KK2Vycm9yLnVzZXJkYnJlYWxtPUVycm9yIG9jY3VyZWQgZHVyaW5nIHNldHRpbmcgVXNlcmRhdGFiYXNlUmVhbG0uCitlcnJvci5kYXRhc291cmNlcmVhbG09RXJyb3Igb2NjdXJlZCBkdXJpbmcgc2V0dGluZyBEYXRhU291cmNlUmVhbG0uCitlcnJvci5yZWFsbU5hbWUuYmFkPUludmFsaWQgcmVhbG0gbmFtZSB7MH0KK2Vycm9yLnJlYWxtTmFtZS5yZXF1aXJlZD08bGk+UmVhbG0gTmFtZSByZXF1aXJlZC48L2xpPgorZXJyb3IucmVhbG1OYW1lLmV4aXN0cz08bGk+QSByZWFsbSBhbHJlYWR5IGV4aXN0cy48L2xpPgorZXJyb3IuY29udGV4dE5hbWUuYmFkPUludmFsaWQgY29udGV4dCBuYW1lIHswfQorZXJyb3IuY29udGV4dE5hbWUuZXhpc3RzPTxsaT5Db250ZXh0IGFscmVhZHkgZXhpc3RzLjwvbGk+CitlcnJvci5kZWZhdWx0Y29udGV4dE5hbWUuZXhpc3RzPTxsaT5EZWZhdWx0Q29udGV4dCBhbHJlYWR5IGV4aXN0cy48L2xpPgorZXJyb3IucGF0aC5wcmVmaXg9PGxpPlBhdGggbXVzdCBiZWdpbiB3aXRoIGEgJy8nLjwvbGk+CitlcnJvci5sb2FkZXJOYW1lLmJhZD1JbnZhbGlkIGxvYWRlciBuYW1lIHswfQorZXJyb3IubWFuYWdlck5hbWUuYmFkPUludmFsaWQgbWFuYWdlciBuYW1lIHswfQorZXJyb3IuY29ubmVjdG9yTmFtZS5iYWQ9SW52YWxpZCBjb25uZWN0b3IgbmFtZSB7MH0KK2Vycm9yLmNvbm5lY3Rvck5hbWUuZXhpc3RzPTxsaT5Db25uZWN0b3IgYWxyZWFkeSBleGlzdHM8L2xpPgorZXJyb3IucGF0dGVybi5yZXF1aXJlZD08bGk+UGF0dGVybiBpcyByZXF1aXJlZDwvbGk+CitlcnJvci52YWx2ZU5hbWUuYmFkPUludmFsaWQgdmFsdmUgbmFtZSB7MH0KK2Vycm9yLnZhbHZlTmFtZS5leGlzdHM9PGxpPlZhbHZlIGFscmVhZHkgZXhpc3RzPC9saT4KK3JlYWxtLmRyaXZlcj1EYXRhYmFzZSBEcml2ZXIKK3JlYWxtLnBhc3N3ZD1EYXRhYmFzZSBQYXNzd29yZAorcmVhbG0udXJsPURhdGFiYXNlIFVSTAorcmVhbG0udXNlck5hbWU9RGF0YWJhc2UgVXNlciBOYW1lCityZWFsbS5kaWdlc3Q9RGlnZXN0IEFsZ29yaXRobQorcmVhbG0ucGFzc3dvcmRDb2w9UGFzc3dvcmQgQ29sdW1uCityZWFsbS5yb2xlTmFtZUNvbD1Sb2xlIE5hbWUgQ29sdW1uCityZWFsbS51c2VyTmFtZUNvbD1Vc2VyIE5hbWUgQ29sdW1uCityZWFsbS51c2VyUm9sZVRhYmxlPVVzZXIgUm9sZSBUYWJsZQorcmVhbG0udXNlclRhYmxlPVVzZXIgVGFibGUKK3JlYWxtLnJlc291cmNlPVJlc291cmNlIE5hbWUKK3JlYWxtLnBhdGhOYW1lPVBhdGggTmFtZQorcmVhbG0uY29ubk5hbWU9Q29ubmVjdGlvbiBOYW1lCityZWFsbS5jb25uUGFzc3dvcmQ9Q29ubmVjdGlvbiBQYXNzd29yZAorcmVhbG0uY29ublVSTD1Db25uZWN0aW9uIFVSTAorcmVhbG0uY29ubkZhY3Rvcnk9Q29udGV4dCBGYWN0b3J5CityZWFsbS5yb2xlQmFzZT1Sb2xlIEJhc2UgRWxlbWVudAorcmVhbG0ucm9sZU5hbWU9Um9sZSBOYW1lCityZWFsbS51c2VyLnJvbGVOYW1lPVVzZXIgUm9sZSBOYW1lCityZWFsbS5wYXR0ZXJuPVJvbGUgU2VhcmNoIFBhdHRlcm4KK3JlYWxtLnJvbGUuc3VidHJlZT1TZWFyY2ggUm9sZSBTdWJ0cmVlCityZWFsbS51c2VyQmFzZT1Vc2VyIEJhc2UgRWxlbWVudAorcmVhbG0udXNlci5zdWJ0cmVlPVNlYXJjaCBVc2VyIFN1YnRyZWUKK3JlYWxtLnVzZXJQYXNzd29yZD1Vc2VyIFBhc3N3b3JkCityZWFsbS51c2VyUGF0dGVybj1Vc2VyIFBhdHRlcm4KK3JlYWxtLnVzZXJTZWFyY2g9VXNlciBTZWFyY2gKK3JlYWxtLmRhdGFTb3VyY2VOYW1lPURhdGFTb3VyY2UgTmFtZQorcmVhbG0ubG9jYWxEYXRhU291cmNlPUxvY2FsIERhdGFTb3VyY2UKK3JlYWxtLnVzZXJDcmVkQ29sPVVzZXIgQ3JlZGVudGlhbCBDb2x1bW4gCit2YWx2ZS5hY2Nlc3MucHJvcGVydGllcz1BY2Nlc3MgTG9nZ2VyIFByb3BlcnRpZXMKK3ZhbHZlLnJlcXVlc3QucHJvcGVydGllcz1SZXF1ZXN0IEZpbHRlciBQcm9wZXJ0aWVzCit2YWx2ZS5zaW5nbGUucHJvcGVydGllcz1TaW5nbGUgU2lnbk9uIFZhbHZlIFByb3BlcnRpZXMKK3ZhbHZlLnJlbW90ZWhvc3QucHJvcGVydGllcz1SZW1vdGUgSG9zdCBWYWx2ZSBQcm9wZXJ0aWVzCit2YWx2ZS5yZW1vdGVhZGRyZXNzLnByb3BlcnRpZXM9UmVtb3RlIEFkZHJlc3MgVmFsdmUgUHJvcGVydGllcwordmFsdmUucmVzb2x2ZUhvc3RzPVJlc29sdmUgSG9zdHMKK3ZhbHZlLnJvdGF0YWJsZT1Sb3RhdGFibGUKK3ZhbHZlLnBhdHRlcm49UGF0dGVybgordmFsdmUuYWxsb3dIb3N0cz1BbGxvdyB0aGVzZSBIb3N0cwordmFsdmUuZGVueUhvc3RzPURlbnkgdGhlc2UgSG9zdHMKK3ZhbHZlLmFsbG93SVBzPUFsbG93IElQIGFkZHJlc3NlcwordmFsdmUuZGVueUlQcz1EZW55IElQIGFkZHJlc3NlcworZXJyb3IuYWxsb3dIb3N0PTxsaT5BbGxvdyBpcyBpbnZhbGlkLiAgTmVlZCB0byBpbmNsdWRlIHRoZSBhZG1pbidzIEhvc3RuYW1lLjwvbGk+CitlcnJvci5kZW55SG9zdD08bGk+RGVueSBpcyBpbnZhbGlkLiAgTmVlZCB0byBleGNsdWRlIHRoZSBhZG1pbidzIEhvc3RuYW1lLjwvbGk+CitlcnJvci5hbGxvd0lQPTxsaT5BbGxvdyBpcyBpbnZhbGlkLiAgTmVlZCB0byBpbmNsdWRlIHRoZSBhZG1pbidzIElQIGFkZHJlc3MuPC9saT4KK2Vycm9yLmRlbnlJUD08bGk+RGVueSBpcyBpbnZhbGlkLiAgTmVlZCB0byBleGNsdWRlIHRoZSBhZG1pbidzIElQIGFkZHJlc3MuPC9saT4KK2Vycm9yLmFsbG93LmRlbnkucmVxdWlyZWQ9PGxpPkFsbG93IG9yIGRlbnkgaXMgcmVxdWlyZWQuPC9saT4KK2Vycm9yLnN5bnRheD08bGk+U3ludGF4IGVycm9yIGluIHJlcXVlc3QgZmlsdGVyIHBhdHRlcm4uPC9saT4KK2Vycm9yLnJlc291cmNlLnJlcXVpcmVkPTxsaT5SZXNvdXJjZSBOYW1lIGlzIHJlcXVpcmVkLjwvbGk+CitlcnJvci5yZXNvdXJjZS5qYXZhcHJlZml4PTxsaT5SZXNvdXJjZSBtdXN0IGhhdmUgImphdmE6IiBwcmVmaXguPC9saT4KK2Vycm9yLnBhdGhOYW1lLnJlcXVpcmVkPTxsaT5QYXRoIE5hbWUgaXMgcmVxdWlyZWQuPC9saT4KK2Vycm9yLmRyaXZlci5yZXF1aXJlZD08bGk+RGF0YWJhc2UgZHJpdmVyIGlzIHJlcXVpcmVkLjwvbGk+CitlcnJvci5yb2xlTmFtZUNvbC5yZXF1aXJlZD08bGk+Um9sZSBuYW1lIGNvbHVtbiBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IudXNlck5hbWVDb2wucmVxdWlyZWQ9PGxpPlVzZXIgbmFtZSBjb2x1bW4gaXMgcmVxdWlyZWQuPC9saT4KK2Vycm9yLnBhc3N3b3JkQ29sLnJlcXVpcmVkPTxsaT5QYXNzd29yZCBjb2x1bW4gaXMgcmVxdWlyZWQuPC9saT4KK2Vycm9yLnVzZXJUYWJsZS5yZXF1aXJlZD08bGk+VXNlciB0YWJsZSBpcyByZXF1aXJlZC48L2xpPgorZXJyb3Iucm9sZVRhYmxlLnJlcXVpcmVkPTxsaT5Vc2VyIHJvbGUgdGFibGUgaXMgcmVxdWlyZWQuPC9saT4KK2Vycm9yLmNvbm5lY3Rpb25QYXNzd29yZC5yZXF1aXJlZD08bGk+RGF0YWJhc2UgcGFzc3dvcmQgaXMgcmVxdWlyZWQuPC9saT4KK2Vycm9yLmNvbm5lY3Rpb25VUkwucmVxdWlyZWQ9PGxpPkRhdGFiYXNlIFVSTCBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IuY29ubmVjdGlvbk5hbWUucmVxdWlyZWQ9PGxpPkRhdGFiYXNlIHVzZXJuYW1lIGlzIHJlcXVpcmVkLjwvbGk+CitlcnJvci5yb2xlTmFtZS5yZXF1aXJlZD08bGk+Um9sZSBuYW1lIGlzIHJlcXVpcmVkLjwvbGk+CitlcnJvci51c2VyUm9sZU5hbWUucmVxdWlyZWQ9PGxpPlVzZXIgUm9sZSBuYW1lIGlzIHJlcXVpcmVkLjwvbGk+CitlcnJvci5kaWdlc3QucmVxdWlyZWQ9PGxpPkRpZ2VzdCBhbGdvcml0aG0gaXMgcmVxdWlyZWQuPC9saT4KK2Vycm9yLnJvbGVCYXNlLnJlcXVpcmVkPTxsaT5Sb2xlIGJhc2UgZWxlbWVudCBpcyByZXF1aXJlZC48L2xpPgorZXJyb3Iucm9sZVBhdHRlcm4ucmVxdWlyZWQ9PGxpPlJvbGUgc2VhcmNoIHBhdHRlcm4gaXMgcmVxdWlyZWQuPC9saT4KK2Vycm9yLnVzZXJCYXNlLnJlcXVpcmVkPTxsaT5Vc2VyIGJhc2UgZWxlbWVudCBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IudXNlclBhc3N3b3JkLnJlcXVpcmVkPTxsaT5Vc2VyIFBhc3N3b3JkIGlzIHJlcXVpcmVkLjwvbGk+CitlcnJvci51c2VyUGF0dGVybi5yZXF1aXJlZD08bGk+VXNlciBwYXR0ZXJuIGlzIHJlcXVpcmVkLjwvbGk+CitlcnJvci51c2VyU2VhcmNoLnJlcXVpcmVkPTxsaT5Vc2VyIHNlYXJjaCBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IudXNlclBhdHRlcm4udXNlclNlYXJjaC5kZWZpbmVkPTxsaT5FaXRoZXIgdXNlclBhdHRlcm4gb3IgdXNlclNlYXJjaCBtdXN0IGJlIHNwZWNpZmllZCBub3QgYm90aC48L2xpPgorZXJyb3IuY29udGV4dEZhY3RvcnkucmVxdWlyZWQ9PGxpPkNvbnRleHQgRmFjdG9yeSBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IuY29ublBhc3N3b3JkLnJlcXVpcmVkPTxsaT5Db25uZWN0aW9uIHBhc3N3b3JkIGlzIHJlcXVpcmVkLjwvbGk+CitlcnJvci5jb25uVVJMLnJlcXVpcmVkPTxsaT5Db25uZWN0aW9uIFVSTCBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IuY29ubk5hbWUucmVxdWlyZWQ9PGxpPkNvbm5lY3Rpb24gbmFtZSBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IuZGF0YVNvdXJjZU5hbWUucmVxdWlyZWQ9PGxpPkRhdGFTb3VyY2UgbmFtZSBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IudXNlckNyZWRDb2wucmVxdWlyZWQ9PGxpPlVzZXIgY3JlZGVudGlhbCBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IudXNlclJvbGVUYWJsZS5yZXF1aXJlZD08bGk+VXNlciByb2xlIHRhYmxlIGlzIHJlcXVpcmVkLjwvbGk+CisKKyMgLS0tLS0tLS0tLSBTZXJ2ZXIgTW9kdWxlIC0tLS0tLS0tLS0KK3NlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLnN1YnRyZWVOb2RlPVNlcnZpY2UKK3NlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLmNvbm5lY3Rvcj1Db25uZWN0b3IKK3NlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLmhvc3Q9SG9zdAorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuY29udGV4dD1Db250ZXh0IAorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIubG9nZ2VyRm9yPUxvZ2dlciBmb3IgezB9CitzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5yZWFsbUZvcj1SZWFsbSBmb3IgezB9IAorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIubG9nZ2VyPUxvZ2dlcgorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIucmVhbG09UmVhbG0KKworIyAtLS0tLS0tLS0tIFJlc291cmNlcyBNb2R1bGUgLS0tLS0tLS0tLQorcmVzb3VyY2VzLnRyZWVCdWlsZGVyLnN1YnRyZWVOb2RlPVJlc291cmNlcworcmVzb3VyY2VzLnRyZWVCdWlsZGVyLmRhdGFzb3VyY2VzPURhdGEgU291cmNlcworcmVzb3VyY2VzLnRyZWVCdWlsZGVyLm1haWxzZXNzaW9ucz1NYWlsIFNlc3Npb25zCityZXNvdXJjZXMudHJlZUJ1aWxkZXIucmVzb3VyY2VsaW5rcz1SZXNvdXJjZSBMaW5rcworcmVzb3VyY2VzLmVudi5lbnRyaWVzPUVudmlyb25tZW50IEVudHJpZXMKK3Jlc291cmNlcy5lbnYuZW50cnk9RW50cnkgTmFtZQorcmVzb3VyY2VzLmVudi5wcm9wcz1FbnZpcm9ubWVudCBFbnRyeSBQcm9wZXJ0aWVzCityZXNvdXJjZXMuZW52Lm92ZXJyaWRlPU92ZXJyaWRlIEFwcGxpY2F0aW9uIExldmVsIEVudHJpZXMKK3Jlc291cmNlcy5hY3Rpb25zLmVudi5jcmVhdGU9Q3JlYXRlIE5ldyBFbnYgRW50cnkKK3Jlc291cmNlcy5hY3Rpb25zLmVudi5lZGl0PUVkaXQgRW52aXJvbm1lbnQgRW50cnkKK3Jlc291cmNlcy5hY3Rpb25zLmVudi5kZWxldGU9RGVsZXRlIEVudmlyb25tZW50IEVudHJpZXMKK3Jlc291cmNlcy5hY3Rpb25zLmVudi5saXN0PUxpc3QgRXhpc3RpbmcgRW50cmllcworcmVzb3VyY2VzLmRhdGFzcmMuamRiYz1KREJDIERyaXZlcgorcmVzb3VyY2VzLmFjdGlvbnMuZGF0YXNyYz1EYXRhIFNvdXJjZXMKK3Jlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMuY3JlYXRlPUNyZWF0ZSBOZXcgRGF0YSBTb3VyY2UKK3Jlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMuZGVsZXRlPURlbGV0ZSBEYXRhIFNvdXJjZXMKK3Jlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMuZWRpdD1FZGl0IERhdGEgU291cmNlCityZXNvdXJjZXMuZGF0YXNyYy51cmw9RGF0YSBTb3VyY2UgVVJMCityZXNvdXJjZXMuZGF0YXNyYy5qZGJjY2xhc3M9SkRCQyBEcml2ZXIgQ2xhc3MKK3Jlc291cmNlcy5kYXRhc3JjLmNvbm5lY3Rpb25zPUNvbm5lY3Rpb25zCityZXNvdXJjZXMuZGF0YXNyYy5hY3RpdmU9TWF4LiBBY3RpdmUgQ29ubmVjdGlvbnMKK3Jlc291cmNlcy5kYXRhc3JjLmlkbGU9TWF4LiBJZGxlIENvbm5lY3Rpb25zCityZXNvdXJjZXMuZGF0YXNyYy53YWl0PU1heC4gV2FpdCBmb3IgQ29ubmVjdGlvbgorcmVzb3VyY2VzLmRhdGFzcmMudmFsaWRhdGlvbj1WYWxpZGF0aW9uIFF1ZXJ5CityZXNvdXJjZXMuZGF0YXNyYy5qbmRpPUpOREkgTmFtZQorcmVzb3VyY2VzLmFjdGlvbnMubWFpbHNlc3Npb249TWFpbCBTZXNzaW9ucworcmVzb3VyY2VzLmFjdGlvbnMubWFpbHNlc3Npb24uY3JlYXRlPUNyZWF0ZSBOZXcgTWFpbCBTZXNzaW9uCityZXNvdXJjZXMuYWN0aW9ucy5tYWlsc2Vzc2lvbi5kZWxldGU9RGVsZXRlIE1haWwgU2Vzc2lvbgorcmVzb3VyY2VzLmFjdGlvbnMubWFpbHNlc3Npb24uZWRpdD1FZGl0IE1haWwgU2Vzc2lvbgorcmVzb3VyY2VzLm1haWxzZXNzaW9uLm5hbWU9TmFtZQorcmVzb3VyY2VzLm1haWxzZXNzaW9uLm1haWxob3N0PW1haWwuc210cC5ob3N0CityZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrPVJlc291cmNlIExpbmtzCityZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrLmNyZWF0ZT1DcmVhdGUgTmV3IFJlc291cmNlIExpbmsKK3Jlc291cmNlcy5hY3Rpb25zLnJlc291cmNlbGsuZGVsZXRlPURlbGV0ZSBSZXNvdXJjZSBMaW5rCityZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrLmVkaXQ9RWRpdCBSZXNvdXJjZSBMaW5rCityZXNvdXJjZXMucmVzb3VyY2Vsay5uYW1lPU5hbWUKK3Jlc291cmNlcy5yZXNvdXJjZWxrLmdsb2JhbD1HbG9iYWwKK3Jlc291cmNlcy5yZXNvdXJjZWxrLnR5cGU9VHlwZQorcmVzb3VyY2VzLmVycm9yLm5hbWUucmVxdWlyZWQ9PGxpPk5hbWUgaXMgcmVxdWlyZWQuPC9saT4KK3Jlc291cmNlcy5lcnJvci5nbG9iYWwucmVxdWlyZWQ9PGxpPkdsb2JhbCBpcyByZXF1aXJlZC48L2xpPgorcmVzb3VyY2VzLmVycm9yLnR5cGUucmVxdWlyZWQ9PGxpPlR5cGUgaXMgcmVxdWlyZWQuPC9saT4KK3Jlc291cmNlcy5lcnJvci52YWx1ZS5yZXF1aXJlZD08bGk+VmFsdWUgaXMgcmVxdWlyZWQuPC9saT4KK3Jlc291cmNlcy5lcnJvci52YWx1ZS5taXNtYXRjaD08bGk+VHlwZSBhbmQgdmFsdWUgZG8gbm90IHNlZW0gdG8gbWF0Y2guPC9saT4KK3Jlc291cmNlcy5lcnJvci5lbnRyeVR5cGUuaW52YWxpZD08bGk+RW50cnkgVHlwZSBub3QgcmVjb2duaXplZC48L2xpPgorcmVzb3VyY2VzLmVycm9yLmVudHJ5VHlwZS5ub3RpbXBsPTxsaT5WYWxpZGF0aW9uIGZvciB0aGlzIHR5cGUgbm90IGltcGxlbWVudGVkIHlldC48L2xpPgorcmVzb3VyY2VzLmVycm9yLnVybC5yZXF1aXJlZD08bGk+RGF0YSBTb3VyY2UgVVJMIGlzIHJlcXVpcmVkLjwvbGk+CityZXNvdXJjZXMuZXJyb3IuZHJpdmVyQ2xhc3MucmVxdWlyZWQ9PGxpPkpEQkMgRHJpdmVyIENsYXNzIGlzIHJlcXVpcmVkLjwvbGk+CityZXNvdXJjZXMuZXJyb3IuYWN0aXZlLnJlcXVpcmVkPTxsaT5NYXggQWN0aXZlIENvbm5lY3Rpb25zIGlzIHJlcXVpcmVkLjwvbGk+CityZXNvdXJjZXMuZXJyb3IuaWRsZS5yZXF1aXJlZD08bGk+TWF4IElkbGUgQ29ubmVjdGlvbnMgaXMgcmVxdWlyZWQuPC9saT4KK3Jlc291cmNlcy5lcnJvci53YWl0LnJlcXVpcmVkPTxsaT5NYXggV2FpdCBmb3IgYSBDb25uZWN0aW9uIGlzIHJlcXVpcmVkLjwvbGk+CityZXNvdXJjZXMuZXJyb3IubWFpbGhvc3QucmVxdWlyZWQ9PGxpPm1haWwuc210cC5ob3N0IGlzIHJlcXVpcmVkLjwvbGk+CityZXNvdXJjZXMuaW50ZWdlci5lcnJvcj08bGk+SW52YWxpZCBpbnRlZ2VyIGVycm9yLjwvbGk+CityZXNvdXJjZXMuYWN0aW9ucy51c2VyZGIuY3JlYXRlPUNyZWF0ZSBOZXcgVXNlciBEYXRhYmFzZQorcmVzb3VyY2VzLmFjdGlvbnMudXNlcmRiLmVkaXQ9RWRpdCBVc2VyIERhdGFiYXNlCityZXNvdXJjZXMuYWN0aW9ucy51c2VyZGIuZGVsZXRlPURlbGV0ZSBVc2VyIERhdGFiYXNlcworcmVzb3VyY2VzLnVzZXJkYi5sb2NhdGlvbj1Mb2NhdGlvbgorcmVzb3VyY2VzLnVzZXJkYi5mYWN0b3J5PUZhY3RvcnkKK3Jlc291cmNlcy50cmVlQnVpbGRlci5kYXRhYmFzZXM9VXNlciBEYXRhYmFzZXMKK3Jlc291cmNlcy5lcnJvci5wYXRoLnJlcXVpcmVkPTxsaT5QYXRoIGlzIHJlcXVpcmVkPC9saT4KK3Jlc291cmNlcy5lcnJvci5qbmRpTmFtZS5yZXF1aXJlZD08bGk+Sk5ESSBOYW1lIGlzIHJlcXVpcmVkPC9saT4KK3Jlc291cmNlcy5pbnZhbGlkLm5hbWU9PGxpPkludmFsaWQgcmVzb3VyY2UgbmFtZSAtIE5hbWUgYWxyZWFkeSBleGlzdHMuPC9saT4KK3Jlc291cmNlcy5pbnZhbGlkLmVudj08bGk+SW52YWxpZCBlbnZpcm9ubWVudCBuYW1lIC0gTmFtZSBhbHJlYWR5IGV4aXN0cy48L2xpPgorCisjIC0tLS0tLS0tLS0gVXNlciBEYXRhYmFzZSBNb2R1bGUgLS0tLS0tLS0tLQordXNlcnMuYWN0aW9ucy5ncm91cC5jcmVhdGU9Q3JlYXRlIE5ldyBHcm91cAordXNlcnMuYWN0aW9ucy5ncm91cC5kZWxldGU9RGVsZXRlIEV4aXN0aW5nIEdyb3VwcwordXNlcnMuYWN0aW9ucy5ncm91cC5saXN0PUxpc3QgRXhpc3RpbmcgR3JvdXBzCit1c2Vycy5hY3Rpb25zLnJvbGUuY3JlYXRlPUNyZWF0ZSBOZXcgUm9sZQordXNlcnMuYWN0aW9ucy5yb2xlLmRlbGV0ZT1EZWxldGUgRXhpc3RpbmcgUm9sZXMKK3VzZXJzLmFjdGlvbnMucm9sZS5saXN0PUxpc3QgRXhpc3RpbmcgUm9sZXMKK3VzZXJzLmFjdGlvbnMudXNlci5jcmVhdGU9Q3JlYXRlIE5ldyBVc2VyCit1c2Vycy5hY3Rpb25zLnVzZXIuZGVsZXRlPURlbGV0ZSBFeGlzdGluZyBVc2VycwordXNlcnMuYWN0aW9ucy51c2VyLmxpc3Q9TGlzdCBFeGlzdGluZyBVc2VycwordXNlcnMuZGVsZXRlR3JvdXBzLnRpdGxlPURlbGV0ZSBFeGlzdGluZyBHcm91cHMKK3VzZXJzLmRlbGV0ZVJvbGVzLnRpdGxlPURlbGV0ZSBFeGlzdGluZyBSb2xlcwordXNlcnMuZGVsZXRlVXNlcnMudGl0bGU9RGVsZXRlIEV4aXN0aW5nIFVzZXJzCit1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0PUVycm9yIHJldHJpZXZpbmcgYXR0cmlidXRlIHswfQordXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldD1FcnJvciBtb2RpZnlpbmcgYXR0cmlidXRlIHswfQordXNlcnMuZXJyb3IuaW52b2tlPUVycm9yIGludm9raW5nIG9wZXJhdGlvbiB7MH0KK3VzZXJzLmVycm9yLmdyb3VwbmFtZS5yZXF1aXJlZD1Hcm91cCBOYW1lIGlzIHJlcXVpcmVkCit1c2Vycy5lcnJvci5wYXNzd29yZC5yZXF1aXJlZD1QYXNzd29yZCBpcyByZXF1aXJlZAordXNlcnMuZXJyb3IucXVvdGVzPURvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzIGFyZSBub3QgYWxsb3dlZCBpbiBmaWVsZCB2YWx1ZXMKK3VzZXJzLmVycm9yLnJvbGVuYW1lLnJlcXVpcmVkPVJvbGUgTmFtZSBpcyByZXF1aXJlZAordXNlcnMuZXJyb3Iuc2VsZWN0PUVycm9yIHNlbGVjdGluZyBtYW5hZ2VkIG9iamVjdHMKK3VzZXJzLmVycm9yLnRva2VuPVRyYW5zYWN0aW9uIHN1Ym1pdHRlZCBvdXQgb2Ygb3JkZXIKK3VzZXJzLmVycm9yLnVzZXJuYW1lLnJlcXVpcmVkPTxsaT5Vc2VyIE5hbWUgaXMgcmVxdWlyZWQ8L2xpPgordXNlcnMuZ3JvdXAubmV3R3JvdXA9Q3JlYXRlIE5ldyBHcm91cCBQcm9wZXJ0aWVzCit1c2Vycy5ncm91cC5vbGRHcm91cD1FZGl0IEV4aXN0aW5nIEdyb3VwIFByb3BlcnRpZXMKK3VzZXJzLmdyb3VwLnByb3BlcnRpZXM9R3JvdXAgUHJvcGVydGllcwordXNlcnMubGlzdC5kZXNjcmlwdGlvbj1EZXNjcmlwdGlvbgordXNlcnMubGlzdC5mdWxsTmFtZT1GdWxsIE5hbWUKK3VzZXJzLmxpc3QuZ3JvdXBuYW1lPUdyb3VwIE5hbWUKK3VzZXJzLmxpc3Qucm9sZW5hbWU9Um9sZSBOYW1lCit1c2Vycy5saXN0LnVzZXJuYW1lPVVzZXIgTmFtZQordXNlcnMubGlzdEdyb3Vwcy50aXRsZT1Hcm91cHMgTGlzdAordXNlcnMubGlzdFJvbGVzLnRpdGxlPVJvbGVzIExpc3QKK3VzZXJzLmxpc3RVc2Vycy50aXRsZT1Vc2VycyBMaXN0Cit1c2Vycy5wcm9tcHQuZGVzY3JpcHRpb249RGVzY3JpcHRpb246Cit1c2Vycy5wcm9tcHQuZnVsbE5hbWU9RnVsbCBOYW1lOgordXNlcnMucHJvbXB0Lmdyb3VwbmFtZT1Hcm91cCBOYW1lOgordXNlcnMucHJvbXB0LnBhc3N3b3JkPVBhc3N3b3JkOgordXNlcnMucHJvbXB0LnJvbGVuYW1lPVJvbGUgTmFtZToKK3VzZXJzLnByb21wdC51c2VybmFtZT1Vc2VyIE5hbWU6Cit1c2Vycy5yb2xlLm5ld1JvbGU9Q3JlYXRlIE5ldyBSb2xlIFByb3BlcnRpZXMKK3VzZXJzLnJvbGUub2xkUm9sZT1FZGl0IEV4aXN0aW5nIFJvbGUgUHJvcGVydGllcwordXNlcnMucm9sZS5wcm9wZXJ0aWVzPVJvbGUgUHJvcGVydGllcwordXNlcnMudHJlZUJ1aWxkZXIuZ3JvdXBzTm9kZT1Hcm91cHMKK3VzZXJzLnRyZWVCdWlsZGVyLnJvbGVzTm9kZT1Sb2xlcwordXNlcnMudHJlZUJ1aWxkZXIuc3VidHJlZU5vZGU9VXNlciBEZWZpbml0aW9uCit1c2Vycy50cmVlQnVpbGRlci51c2Vyc05vZGU9VXNlcnMKK3VzZXJzLnVzZXIubmV3VXNlcj1DcmVhdGUgTmV3IFVzZXIgUHJvcGVydGllcwordXNlcnMudXNlci5vbGRVc2VyPUVkaXQgRXhpc3RpbmcgVXNlciBQcm9wZXJ0aWVzCit1c2Vycy51c2VyLnByb3BlcnRpZXM9VXNlciBQcm9wZXJ0aWVzCisjIC0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FwcGxpY2F0aW9uUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQXBwbGljYXRpb25SZXNvdXJjZXNfZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjU1Nzk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FwcGxpY2F0aW9uUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0MzkgQEAKK2FwcGxpY2F0aW9uLnRpdGxlPUFkbWluaXN0cmFjafNuIGRlbCBTZXJ2aWRvciBUb21jYXQKK2Vycm9ycy5oZWFkZXI9PGgzPjxmb250IGNvbG9yPSJyZWQiPkVycm9yKGVzKSBkZSBWYWxpZGFjafNuPC9mb250PjwvaDM+RGViZSBjb3JyZWdpciBlbC9sb3Mgc2lndWllbnRlKHMpIGVycm9yKGVzKSBhbnRlcyBkZSBjb250aW51YXI6PHVsPgorZXJyb3JzLmZvb3Rlcj08L3VsPjxocj4KK2Vycm9yLmxvZ2luPTxsaT5Ob21icmUgZGUgdXN1YXJpbyBvIGNvbnRyYXNl8WEgaW524WxpZG9zPC9saT4KK3Byb21wdC51c2VybmFtZT1Ob21icmUgZGUgVXN1YXJpbworcHJvbXB0LnBhc3N3b3JkPUNvbnRyYXNl8WEKK2J1dHRvbi5sb2dpbj1Mb2dpbgorYnV0dG9uLnJlc2V0PUxpbXBpYXIKK2J1dHRvbi5zYXZlPUd1YXJkYXIKK2J1dHRvbi5jaGFuZ2U9Q2FtYmlhcgorYnV0dG9uLmNhbmNlbD1DYW5jZWxhcgorYnV0dG9uLmNvbW1pdD1BY29tZXRlciBDYW1iaW9zCitidXR0b24ubG9nb3V0PVNhbGlyCitsb2dpbi5lbnRlcj1JbnRyb2R1emNhIHVuIG5vbWJyZSBkZSB1c3VhcmlvIHkgdW5hIGNvbnRyYXNl8WEgcGFyYSBpbmljaWFyIHVuYSBudWV2YSBzZXNp824KK2xvZ2luLmNoYW5nZUxhbmd1YWdlPUNhbWJpbyBkZSBpZGlvbWEKK2Vycm9yLmxvZ2luPU5vbWJyZSBkZSB1c3VhcmlvIG8gY29udHJhc2XxYSBpbnbhbGlkb3MKK2Vycm9yLnRyeWFnYWluPVBhcmEgaW50ZW50YXIgZGUgbnVldm8sIGhhZ2EgY2xpY2sKK2Vycm9yLmhlcmU9YXF17QorcHJvbXB0LnNvbWVUZXh0PUFsZ/puIFRleHRvCitwcm9tcHQubW9yZVRleHQ9TeFzIFRleHRvCitzYW1wbGUuc29tZVRleHQucmVxdWlyZWQ9PGxpPiJBbGf6biBUZXh0byIgbm8gcHVlZGUgZXN0YXIgdmFj7W88L2xpPgorc2FtcGxlLm1vcmVUZXh0LnJlcXVpcmVkPTxsaT4iTeFzIFRleHRvIiBubyBwdWVkZSBlc3RhciB2YWPtbzwvbGk+CitzYXZlLnN1Y2Nlc3M9oUd1YXJkYXJkbyBjb24g6XhpdG8hCitzYXZlLmZhaWw9oUZhbGxvIGFsIGd1YXJkYXIhCitzZXJ2ZXIucG9ydG51bWJlcj1O+m1lcm8gZGUgUHVlcnRvCitzZXJ2ZXIuZGVidWdsZXZlbD1OaXZlbCBkZSBEZXB1cmFjafNuCitzZXJ2ZXIuc2h1dGRvd249QXBhZ2FyCitzZXJ2ZXIucHJvcGVydGllcz1Qcm9waWVkYWRlcyBkZWwgU2Vydmlkb3IKK3dhcm5pbmcuaGVhZGVyPTxjZW50ZXI+PGg0Pjxmb250IGNvbG9yPSJyZWQiPqFBdmlzbyE8L2ZvbnQ+PC9oND48L2NlbnRlcj4gPHVsPgorc2VydmVyLnBvcnQud2FybmluZz08bGk+RWwgbvptZXJvIGRlIHB1ZXJ0byBpbmZlcmlvciBhIDEwMjQgcmVxdWllcmUgY2FwYWNpZGFkZXMgZXNwZWNpYWxlcyBkZWwgc29mdHdhcmUuPC9saT4KK2Vycm9yLnBvcnROdW1iZXIucmVxdWlyZWQ9PGxpPkVsIG76bWVybyBkZWwgcHVlcnRvIG5vIHB1ZWRlIGVzdGFyIHZhY+1vLjwvbGk+CitlcnJvci5wb3J0TnVtYmVyLmZvcm1hdD08bGk+oUVsIG76bWVybyBkZWwgcHVlcnRvIG5vIGVzIHVuIGVudGVybyB24WxpZG8hIDwvbGk+CitlcnJvci5wb3J0TnVtYmVyLnJhbmdlPTxsaT5FbCBu+m1lcm8gZGVsIHB1ZXJ0byBlc3RhIGZ1ZXJhIGRlbCByYW5nby4gRWwgcmFuZ28gduFsaWRvIGVzIDEtNjU1MzUuPC9saT4KK2Vycm9yLnNodXRkb3duVGV4dC5sZW5ndGg9PGxpPqFMYSBsb25naXR1ZCBkZWwgVGV4dG8gcGFyYSBBcGFnYXIgZGViZSBzZXIgZGUgYWwgbWVub3MgNiBjYXJhY3RlcmVzITwvbGk+CitlcnJvci5lbmdpbmVOYW1lLnJlcXVpcmVkPTxsaT5TZSByZXF1aWVyZSBlbCBub21icmUgZGVsIE1vdG9yPC9saT4KK2Vycm9yLmFjY2VwdENvdW50VGV4dC5yZXF1aXJlZD08bGk+U2UgcmVxdWllcmUgY29udGFkb3IgZGUgQWNlcHRhY2nzbjwvbGk+CitlcnJvci5hY2NlcHRDb3VudFRleHQuZm9ybWF0PTxsaT6hRWwgY29udGFkb3IgZGUgQWNlcHRhY2nzbiBubyBlcyB1biBlbnRlcm8gduFpZG8hPC9saT4KK2Vycm9yLmFjY2VwdENvdW50VGV4dC5yYW5nZT08bGk+RWwgY29udGFkb3IgZGUgYWNlcHRhY2nzbiBwYXJlY2UgZXN0YXIgZnVlcmEgZGUgcmFuZ28uIEVsIHJhbmdvIHbhbGlkbyB2YSBkZSAwLTEyOC4gPC9saT4KK2Vycm9yLmNvbm5UaW1lT3V0VGV4dC5yZXF1aXJlZD08bGk+RWwgdGllbXBvIGRlIGVzcGVyYSBkZSBsYSBjb25leGnzbiBubyBwdWVkZSBlc3RhciB2YWPtby48L2xpPgorZXJyb3IuY29ublRpbWVPdXRUZXh0LmZvcm1hdD08bGk+oUVsIHRpZW1wbyBkZSBlc3BlcmEgZGUgbGEgY29uZXhp824gbm8gZXMgdW4gZW50ZXJvIHbhbGlkbyEgPC9saT4KK2Vycm9yLmNvbm5UaW1lT3V0VGV4dC5yYW5nZT08bGk+RWwgdGllbXBvIGRlIGVzcGVyYSBkZSBsYSBjb25leGnzbiBwYXJlY2UgZXN0YXIgZnVlcmEgZGUgcmFuZ28uIEVsIHJhbmdvIHbhbGlkbyB2YSBkZSAwLTYwMDAwLiA8L2xpPgorZXJyb3IuYnVmZmVyU2l6ZVRleHQucmVxdWlyZWQ9PGxpPlRhbWHxbyBkZWwgQvpmZXIgcmVxdWVyaWRvPC9saT4KK2Vycm9yLmJ1ZmZlclNpemVUZXh0LmZvcm1hdD08bGk+oUVsIFRhbWHxbyBkZWwgQvpmZXIgbm8gZXMgdW4gZW50ZXJvISA8L2xpPgorZXJyb3IuYnVmZmVyU2l6ZVRleHQucmFuZ2U9PGxpPlRhbWHxbyBkZWwgQvpmZXIgcGFyZWNlIGVzdGFyIGZ1ZXJhIGRlbCByYW5nby4gRWwgcmFuZ28gduFsaWRvIHZhIGRlIDEtODE5Mi4gPC9saT4KK2Vycm9yLmFkZHJlc3MuaW52YWxpZD08bGk+RGlyZWNjafNuIElQIGluduFsaWRhPC9saT4KK2Vycm9yLnJlZGlyZWN0UG9ydFRleHQucmVxdWlyZWQ9PGxpPk76bWVybyBkZWwgcHVlcnRvIGRlIHJlZGlyZWNjaW9uYW1pZW50byBubyBwdWVkZSBlc3RhciB2YWPtbyA8L2xpPgorZXJyb3IucmVkaXJlY3RQb3J0VGV4dC5mb3JtYXQ9PGxpPqFFbCBO+m1lcm8gZGVsIHB1ZXJ0byBkZSByZWRpcmVjY2lvbmFtaWVudG8gbm8gZXMgdW4gZW50ZXJvIHbhbGlkbyEgPC9saT4KK2Vycm9yLnJlZGlyZWN0UG9ydFRleHQucmFuZ2U9PGxpPk76bWVybyBkZWwgcHVlcnRvIGRlIHJlZGlyZWNjaW9uYW1pZW50byBwYXJlY2UgZXN0YXIgZnVlcmEgZGUgcmFuZ28uIEVsIHJhbmdvIHbhbGlkbyB2YSBkZSAxLTY1NTM1LjwvbGk+CitlcnJvci5taW5Qcm9jZXNzb3JzVGV4dC5yZXF1aXJlZD08bGk+RWwgbe1uaW1vIGRlIHByb2Nlc2Fkb3JlcyBubyBwdWVkZSBlc3RhciB2YWPtbzwvbGk+CitlcnJvci5taW5Qcm9jZXNzb3JzVGV4dC5mb3JtYXQ9PGxpPqFFbCBN7W5pbW8gZGUgcHJvY2VzYWRvcmVzIG5vIGVzIHVuIGVudGVybyB24WxpZG8hPC9saT4KK2Vycm9yLm1pblByb2Nlc3NvcnNUZXh0LnJhbmdlPTxsaT5FbCBt7W5pbW8gZGUgcHJvY2VzYWRvcmVzIHBhcmVjZSBlc3RhciBmdWVyYSBkZSByYW5nby4gRWwgcmFuZ28gduFsaWRvIHZhIGRlIDEtNTEyLjwvbGk+CitlcnJvci5tYXhQcm9jZXNzb3JzVGV4dC5yZXF1aXJlZD08bGk+RWwgbeF4aW1vIGRlIHByb2Nlc2Fkb3JlcyBubyBwdWVkZSBlc3RhciB2YWPtZG88L2xpPgorZXJyb3IubWF4UHJvY2Vzc29yc1RleHQuZm9ybWF0PTxsaT6hRWwgTeF4aW1vIGRlIHByb2Nlc2Fkb3JlcyBubyBlcyB1biBlbnRlcm8gduFsaWRvITwvbGk+CitlcnJvci5tYXhQcm9jZXNzb3JzVGV4dC5yYW5nZT08bGk+RWwgbeF4aW1vIGRlIHByb2Nlc2Fkb3JlcyBwYXJlY2UgZXN0YXIgZnVlcmEgZGUgcmFuZ28uIEVsIHJhbmdvIHbhbGlkbyB2YSBkZSAxLTUxMi4gVGFtYmnpbiwgbeF4aW1vID4gPSBt7W5pbW8uPC9saT4KK2Vycm9yLnByb3h5TmFtZS5pbnZhbGlkPTxsaT5FbCBub21icmUgZGVsIGFwb2RlcmFkbyAocHJveHkpIGVzIGluduFsaWRvPC9saT4KK2Vycm9yLnByb3h5UG9ydFRleHQucmVxdWlyZWQ9PGxpPkVsIG76bWVybyBkZWwgcHVlcnRvIGRlbCBhcG9kZXJhZG8gKHByb3h5KSBubyBwdWVkZSBlc3RhciB2YWPtbzwvbGk+CitlcnJvci5wcm94eVBvcnRUZXh0LmZvcm1hdD08bGk+oUVsIE76bWVybyBkZWwgcHVlcnRvIGRlbCBhcG9kZXJhZG8gKHByb3h5KSBubyBlcyB1biBlbnRlcm8gduFsaWRvITwvbGk+CitlcnJvci5wcm94eVBvcnRUZXh0LnJhbmdlPTxsaT5FbCBu+m1lcm8gZGVsIHB1ZXJ0byBkZWwgYXBvZGVyYWRvIChwcm94eSkgcGFyZWNlIGVzdGFyIGZ1ZXJhIGRlIHJhbmdvLiBFbCByYW5nbyB24WxpZG8gdmEgZGUgMS02NTUzNS48L2xpPgorZXJyb3IuaG9zdE5hbWUuYmFkPW5vbWJyZSBkZSBt4XF1aW5hIGluduFsaWRhIHswfQorZXJyb3IuaG9zdE5hbWUucmVxdWlyZWQ9PGxpPlNlIHJlcXVpZXJlIGVsIG5vbWJyZSBkZSBt4XF1aW5hPC9saT4KK2Vycm9yLmhvc3ROYW1lLmV4aXN0cz08bGk+WWEgZXhpc3RlIGVsIE5vbWJyZSBkZSBN4XF1aW5hPC9saT4KK2Vycm9yLmFwcEJhc2UucmVxdWlyZWQ9PGxpPlNlIHJlcXVpZXJlIGxhIEJhc2UgZGUgbGEgQXBsaWNhY2nzbjwvbGk+CitzZXJ2aWNlLm5hbWU9Tm9tYnJlCitzZXJ2aWNlLmVuZ2luZS5wcm9wcz1Qcm9waWVkYWRlcyBkZWwgTW90b3IKK3NlcnZpY2UuZGVmYXVsdGhvc3RuYW1lPU5vbWJyZSBkZSBN4XF1aW5hIHBvciBkZWZlY3RvCitzZXJ2aWNlLnByb3BlcnRpZXM9UHJvcGllZGFkZXMgZGVsIFNlcnZpY2lvCitzZXJ2aWNlLnByb3BlcnR5PVByb3BpZWRhZAorc2VydmljZS52YWx1ZT1WYWxvcgorc2VydmljZS5jcmVhdGUubmV3PUNyZWFyIE51ZXZvIFNlcnZpY2lvCithY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zPUFjY2lvbmVzIERpc3BvbmlibGVzCithY3Rpb25zLnNlcnZpY2VzLmNyZWF0ZT1DcmVhciBOdWV2byBTZXJ2aWNpbworYWN0aW9ucy5zZXJ2aWNlcy5kZWxldGU9RWxpbWluYXIgRXN0ZSBTZXJ2aWNpbworYWN0aW9ucy5zZXJ2aWNlcy5kZWxldGVzPUVsaW1pbmFyIFNlcnZpY2lvcyBFeGlzdGVudGVzCithY3Rpb25zLnNlcnZpY2VzLmVkaXQ9RWRpdGFyIFNlcnZpY2lvIEV4aXN0ZW50ZQorYWN0aW9ucy5hY2Nlc3Nsb2dnZXIuY3JlYXRlPUNyZWFyIE51ZXZvIChBY2Nlc3MgTG9nZ2VyKSBSZWdpc3RyYWRvciBkZSBBY2Nlc28KK2FjdGlvbnMuYWNjZXNzbG9nZ2VyLmRlbGV0ZT1FbGltaW5hciAoQWNjZXNzIExvZ2dlcikgUmVnaXN0cmFkb3IgZGUgQWNjZXNvCithY3Rpb25zLmNvbm5lY3RvcnMuY3JlYXRlPUNyZWFyIE51ZXZvIENvbmVjdG9yCithY3Rpb25zLmNvbm5lY3RvcnMuZGVsZXRlPUVsaW1pbmFyIGVzdGUgQ29uZWN0b3IKK2FjdGlvbnMuY29ubmVjdG9ycy5kZWxldGVzPUVsaW1pbmFyIENvbmVjdG9yZXMgRXhpc3RlbnRlcworYWN0aW9ucy5jb25uZWN0b3JzLmVkaXQ9RWRpdGFyIENvbmVjdG9yIEV4aXN0ZW50ZQorYWN0aW9ucy5jb250ZXh0cy5jcmVhdGU9Q3JlYXIgTnVldm8gQ29udGV4dG8KK2FjdGlvbnMuY29udGV4dHMuZGVsZXRlPUJvcnJhciBlc3RlIENvbnRleHRvCithY3Rpb25zLmNvbnRleHRzLmRlbGV0ZXM9Qm9ycmFyIENvbnRleHRvcyBFeGlzdGVudGVzCithY3Rpb25zLmNvbnRleHRzLmVkaXQ9RWRpdGFyIENvbnRleHRvIEV4aXN0ZW50ZQorYWN0aW9ucy5kZWZhdWx0Y29udGV4dHMuY3JlYXRlPUNyZWFyIERlZmF1bHRDb250ZXh0IE51ZXZvCithY3Rpb25zLmRlZmF1bHRjb250ZXh0cy5kZWxldGU9Qm9ycmFyIEVzdGUgRGVmYXVsdENvbnRleHQKK2FjdGlvbnMuZGVmYXVsdGNvbnRleHRzLmRlbGV0ZXM9Qm9ycmFyIERlZmF1bHRDb250ZXh0IEV4aXN0ZW50ZQorYWN0aW9ucy5kZWZhdWx0Y29udGV4dHMuZWRpdD1FZGl0YXIgRGVmYXVsdENvbnRleHQgRXhpc3RlbnRlIAorYWN0aW9ucy5ncm91cC5jcmVhdGU9Q3JlYXIgTnVldm8gR3J1cG8KK2FjdGlvbnMuZ3JvdXAuZGVsZXRlPUJvcnJhciBHcnVwbyBFeGlzdGVudGUKK2FjdGlvbnMuaG9zdHMuY3JlYXRlPUNyZWFyIE51ZXZhIE3hcXVpbmEKK2FjdGlvbnMuaG9zdHMuZGVsZXRlPUJvcnJhciBFc3RhIE3hcXVpbmEKK2FjdGlvbnMuaG9zdHMuZGVsZXRlcz1Cb3JyYXIgTeFxdWluYXMgRXhpc3RlbnRlcworYWN0aW9ucy5ob3N0cy5lZGl0PUVkaXRhciBN4XF1aW5hIEV4aXN0ZW50ZQorYWN0aW9ucy5sb2dnZXJzLmNyZWF0ZT1DcmVhciBOdWV2byAoTG9nZ2VyKSBSZWdpc3RyYWRvcgorYWN0aW9ucy5sb2dnZXJzLmRlbGV0ZT1Cb3JyYXIgRXN0ZSAoTG9nZ2VyKSBSZWdpc3RyYWRvcgorYWN0aW9ucy5sb2dnZXJzLmRlbGV0ZXM9Qm9ycmFyIChMb2dnZXJzKSBSZWdpc3RyYWRvcmVzIEV4aXN0ZW50ZXMKK2FjdGlvbnMubG9nZ2Vycy5lZGl0PUVkaXRhciAoTG9nZ2VyKSBSZWdpc3RyYWRvciBFeGlzdGVudGUKK2FjdGlvbnMucmVhbG1zLmNyZWF0ZT1DcmVhciBOdWV2byBSZWlubyAoUmVhbG0pIGRlIFVzdWFyaW8KK2FjdGlvbnMucmVhbG1zLmRlbGV0ZT1Cb3JyYXIgRXN0ZSBSZWlubyAoUmVhbG0pIGRlIFVzdWFyaW8KK2FjdGlvbnMucmVhbG1zLmRlbGV0ZXM9Qm9ycmFyIFJlaW5vcyAoUmVhbG1zKSBkZSBVc3VhcmlvCithY3Rpb25zLnJlYWxtcy5lZGl0PUVkaXRhciBSZWlubyAoUmVhbG0pIEV4aXN0ZW50ZQorYWN0aW9ucy5yZXF1ZXN0ZmlsdGVyLmNyZWF0ZT1DcmVhciBOdWV2byBGaWx0cm8gZGUgUGV0aWNp824KK2FjdGlvbnMucmVxdWVzdGZpbHRlci5kZWxldGU9Qm9ycmFyIEZpbHRyb3MgZGUgUGV0aWNp824KK2FjdGlvbnMudXNlci5jcmVhdGU9Q3JlYXIgTnVldm8gVXN1YXJpbworYWN0aW9ucy51c2VyLmRlbGV0ZT1FbGltaW5hciBVc3VhcmlvIEV4aXN0ZW50ZQorYWN0aW9ucy52YWx2ZXMuY3JlYXRlPUNyZWFyIE51ZXZhIFbhbHZ1bGEKK2FjdGlvbnMudmFsdmVzLmVkaXQ9RWRpdGFyIFbhbHZ1bGEKK2FjdGlvbnMudmFsdmVzLmRlbGV0ZT1Cb3JyYXIgRXN0YSBW4Wx2dWxhCithY3Rpb25zLnZhbHZlcy5kZWxldGVzPUJvcnJhciBW4XZ1bGFzIEV4aXN0ZW50ZXMKK2FjdGlvbnMuYWxpYXMuY3JlYXRlPUNyZWFyIE51ZXZvIEFsaWFzCithY3Rpb25zLmFsaWFzLmRlbGV0ZT1Cb3JyYXIgQWxpYXMKK25ldy5hbGlhcz1OdWV2byBBbGlhcworY29ubmVjdG9yLnR5cGU9VGlwbworY29ubmVjdG9yLnNjaGVtZT1Fc3F1ZW1hCitjb25uZWN0b3IuYWNjZXB0LmNvdW50PUNvbnRhZG9yIGRlIEFjZXB0YWNp824KK2Nvbm5lY3Rvci5jb21wcmVzc2lvbj1Db21wcmVzafNuCitjb25uZWN0b3IuY29ubmVjdGlvbi5saW5nZXI9RGVtb3JhIGRlIGxhIENvbmV4afNuCitjb25uZWN0b3IuY29ubmVjdGlvbi50aW1lb3V0PVRpZW1wbyBkZSBFc3BlcmEgZGUgbGEgQ29uZXhp824KK2Nvbm5lY3Rvci5jb25uZWN0aW9uLnVwbG9hZFRpbWVvdXQ9VGllbXBvIGRlIEVzcGVyYSBkZSBDb25leGnzbiBlbiBsYSBDYXJnYQorY29ubmVjdG9yLmRlZmF1bHQuYnVmZmVyPVRhbWHxbyBwb3IgZGVmZWN0byBkZWwgQvpmZXIKK2Nvbm5lY3Rvci5jb25uZWN0aW9uLmRpc2FibGVVcGxvYWRUaW1lb3V0PURlc2FjdGl2YXIgVGllbXBvIGRlIEVzcGVyYSBkZSBsYSBDYXJnYQorY29ubmVjdG9yLmVuYWJsZS5kbnM9UGVybWl0aXIgQvpzcXVlZGFzIGVuIGVsIEROUworY29ubmVjdG9yLnVyaWVuY29kaW5nPUNvZGlmaWNhY2nzbiBkZSBVUkkKK2Nvbm5lY3Rvci51c2VCb2R5RW5jb2RpbmdGb3JVUkk9VXNhciBDb2RpZmljYWNp824gZGUgQ3VlcnBvIChCb2R5KSBwYXJhIFBhcuFtZXRyb3MgZGUgQ29uc3VsdGEgZGUgVVJJCitjb25uZWN0b3IuYWxsb3dUcmFjZT1QZXJtaXRpciBN6XRvZG8gZGUgVFJBWkEKK2Nvbm5lY3Rvci5hZGRyZXNzLmlwPURpcmVjY2nzbiBJUAorY29ubmVjdG9yLnJlZGlyZWN0LnBvcnRudW1iZXI9TvptZXJvIGRlbCBwdWVydG8gZGUgcmVkaXJlY2Npb25hbWllbnRvCitjb25uZWN0b3IubWluPU3tbmltbworY29ubmVjdG9yLm1pbGxpc2Vjb25kcz1taWxpc2VndW5kb3MKK2Nvbm5lY3Rvci5tYXg9TeF4aW1vCitjb25uZWN0b3IubWF4a2VlcGFsaXZlPVBldGljaW9uZXMgTeF4aW1hcyBkZSBNYW5ldGVyIFZpdmEgKEtlZXBBbGl2ZSkKK2Nvbm5lY3Rvci5tYXhzcGFyZT1N4XguIEhpbG9zIGRlIFJlcHVlc3RvCitjb25uZWN0b3IubWF4dGhyZWFkcz1N4XguIEhpbG9zCitjb25uZWN0b3IubWluc3BhcmU9Te1uLiBIaWxvcyBkZSBSZXB1ZXN0bworY29ubmVjdG9yLnRocmVhZHByaW9yaXR5PVByb2Nlc3NvciBUaHJlYWQgUHJpb3JpdHkKK2Nvbm5lY3Rvci5wcm94eS5uYW1lPU5vbWJyZSBkZWwgQXBvZGVyYWRvIChQcm94eSkKK2Nvbm5lY3Rvci5wcm94eS5wb3J0bnVtYmVyPU76bWVybyBkZSBQdWVydG8gZGVsIEFwb2RlcmFkbyAoUHJveHkpCitjb25uZWN0b3IuYWxnb3JpdGhtPUFsZ29yaXRtbworY29ubmVjdG9yLmNpcGhlcnM9Q2lmcmFkb3MKK2Nvbm5lY3Rvci5jbGllbnQuYXV0aD1BdXRlbnRpY2FjafNuIGRlIENsaWVudGUKK2Nvbm5lY3Rvci5rZXlzdG9yZS5maWxlbmFtZT1Ob21icmUgZGUgQXJjaGl2byBkZSBBbG1hY+luIGRlIENsYXZlcworY29ubmVjdG9yLmtleXN0b3JlLnBhc3N3b3JkPUNvbnRyYXNl8WEgZGUgQWxtYWPpbiBkZSBDbGF2ZXMKK2Nvbm5lY3Rvci5rZXlzdG9yZS50eXBlPVRpcG8gZGUgQWxtYWPpbiBkZSBDbGF2ZXMKK2Nvbm5lY3Rvci5zc2xQcm90b2NvbD1Qcm90b2NvbG8gU1NMCitjb25uZWN0b3Iua2V5UGFzcy53YXJuaW5nPTxsaT5VdGlsaWNlIHBvciBmYXZvciBrZXl0b29sIHBhcmEgZ2VuZXJhciBlbCBjZXJ0aWZpY2Fkby48L2xpPgorY29ubmVjdG9yLnNlY3VyZT1TZWd1cm8KK2Nvbm5lY3Rvci50Y3BOb0RlbGF5PVRDUCBTaW4gUmV0YXJkbworY29ubmVjdG9yLnhwb3dlcmVkYnk9WCBQb3RlbmNpYWRvIE1lZGlhbnRlCitob3N0LnByb3BlcnRpZXM9UHJvcGllZGFkZXMgZGUgbGEgTeFxdWluYQoraG9zdC5uYW1lPU5vbWJyZQoraG9zdC5iYXNlPUJhc2UgRGUgbGEgQXBsaWNhY2nzbgoraG9zdC5hdXRvRGVwbG95PURlc3BsZWdhciBBdXRvbeF0aWNhbWVudGUKK2hvc3QuZGVwbG95WE1MPURlc3BsaWVndWUgWE1MIAoraG9zdC5kZXBsb3lPblN0YXJ0dXA9RGVzcGxpZWd1ZSBFbiBBcnJhbnF1ZSAKK2hvc3Qud2Fycz1EZXNlbXBhcXVldGFyIFdBUnMKK2hvc3QuYWxpYXNlcz1BbGlhc2VzCitob3N0LmFsaWFzLm5hbWU9Tm9tYnJlIGRlIEFsaWFzCitob3N0LnhtbE5hbWVzcGFjZUF3YXJlPUNvbm9jZWRvciBkZSBFc3BhY2lvIGRlIE5vbWJyZXMgWE1MCitob3N0LnhtbFZhbGlkYXRpb249VmFsaWRhY2nzbiBYTUwKK2Vycm9yLmFsaWFzTmFtZS5leGlzdHM9PGxpPkVsIEFsaWFzIHlhIGV4aXN0ZTwvbGk+CitlcnJvci5hbGlhc05hbWUucmVxdWlyZWQ9PGxpPlNlIHJlcXVpZXJlIGVsIG5vbWJyZSBkZSBBbGlhczwvbGk+Citjb250ZXh0LnByb3BlcnRpZXM9UHJvcGllZGFkZXMgZGVsIGNvbnRleHRvCitjb250ZXh0LmNvb2tpZXM9Q29va2llcworY29udGV4dC5jcm9zcy5jb250ZXh0PUNvbnRleHRvIENydXphZG8KK2NvbnRleHQuZG9jQmFzZT1CYXNlIERlbCBEb2N1bWVudG8KK2NvbnRleHQub3ZlcnJpZGU9UGFzYXIgcG9yIEFsdG8KK2NvbnRleHQucGF0aD1UcmF5ZWN0b3JpYQorY29udGV4dC5yZWxvYWRhYmxlPVJlY2FyZ2FibGUKK2NvbnRleHQuc3dhbGxvd091dHB1dD1TYWxpZGEgZGVsIFRyYWdvIChTd2FsbG93KQorY29udGV4dC51c2VuYW1pbmc9VXRpbGl6YXIgZWwgTm9tYnJhbWllbnRvIChOYW1pbmcpCitjb250ZXh0LndvcmtkaXI9RGlyZWN0b3JpbyBkZSBUcmFiYWpvCitjb250ZXh0LmxvYWRlci5wcm9wZXJ0aWVzPVByb3BpZWRhZGVzIGRlbCBjYXJnYWRvcgorY29udGV4dC5zZXNzaW9ubWdyLnByb3BlcnRpZXM9UHJvcGllZGFkZXMgZGVsIGdlc3RvciBkZSBTZXNp824KK2NvbnRleHQuY2hlY2tJbnRlcnZhbD1JbnRlcnZhbG8gZGUgQ2hlcXVlbworY29udGV4dC5zZXNzaW9uSWQ9SW5pY2lhbGl6YWRvciBkZSBsYSBJZGVudGlmaWNhY2nzbiBEZSBsYSBTZXNp824KK2NvbnRleHQubWF4LnNlc3Npb25zPU3heGltYXMgU2VzaW9uZXMgQWN0aXZhcworZGVmYXVsdGNvbnRleHQucHJvcGVydGllcz1Qcm9waWVkYWRlcyBkZSBEZWZhdWx0Q29udGV4dCAKK2Vycm9yLmNvbnRleHQuZGlyZWN0b3J5PUxhIGJhc2UgZGVsIGRvY3VtZW50byBuaSBleGlzdGUgbmkgZXMgdW4gZGlyZWN0b3JpbyBsZWdpYmxlIAorZXJyb3IuZG9jQmFzZS5yZXF1aXJlZD08bGk+TGEgYmFzZSBkZWwgZG9jdW1lbnRvIG5vIHB1ZWRlIHNlciBudWxhPC9saT4KK2Vycm9yLnBhdGgucmVxdWlyZWQ9PGxpPkxhIHRyYXllY3RvcmlhIG5vIHB1ZWRlIHNlciBudWxhPC9saT4KK2Vycm9yLndvcmtEaXIucmVxdWlyZWQ9PGxpPkVsIGRpcmVjdG9yaW8gZGUgdHJhYmFqbyBubyBwdWVkZSBzZXIgbnVsbzwvbGk+CitlcnJvci5sZHJDaGVja0ludGVydmFsLnJlcXVpcmVkPTxsaT5FbCBpbnRlcnZhbG8gZGUgY2hlcXVlbyBkZWwgY2FyZ2Fkb3Igbm8gcHVlZGUgZXN0YXIgdmFj7W88L2xpPgorZXJyb3IubGRyQ2hlY2tJbnRlcnZhbC5mb3JtYXQ9PGxpPqFFbCBJbnRlcnZhbG8gZGUgY2hlcXVlbyBkZWwgY2FyZ2Fkb3Igbm8gdW4gbvptZXJvIGVudGVybyB24WxpZG8hPC9saT4KK2Vycm9yLmxkckNoZWNrSW50ZXJ2YWwucmFuZ2U9PGxpPkVsIGludGVydmFsbyBkZSBjaGVxdWVvIGRlbCBjYXJnYWRvciBwYXJlY2UgZnVlcmEgZGUgcmFuZ28uIEVsIHJhbmdvIHbhbGlkbyB2YSBkZSAxLTEwMDAuPC9saT4KK2Vycm9yLm1nckNoZWNrSW50ZXJ2YWwucmVxdWlyZWQ9PGxpPkVsIGludGVydmFsbyBkZSBjaGVxdWVvIGRlbCBnZXN0b3Igbm8gcHVlZGUgZXN0YXIgdmFj7W88L2xpPgorZXJyb3IubWdyQ2hlY2tJbnRlcnZhbC5mb3JtYXQ9PGxpPqFFbCBJbnRlcnZhbG8gZGVsIGNoZXF1ZW8gZGVsIGdlc3RvciBubyBlcyB1biBu+m1lcm8gZW50ZXJvIHbhbGlkbyE8L2xpPgorZXJyb3IubWdyQ2hlY2tJbnRlcnZhbC5yYW5nZT08bGk+RWwgaW50ZXJ2YWxvIGRlIGNoZXF1ZW8gZGVsIGdlc3RvciBwYXJlY2UgZnVlcmEgZGUgcmFuZ28uIEVsIHJhbmdvIHZhbGlkbyB2YSBkZSAxLTEwMDAuPC9saT4KK2Vycm9yLm1nclNlc3Npb25JREluaXQucmVxdWlyZWQ9PGxpPkxhIGlkZW50aWZpY2FjafNuIGRlIGxhIGluaWNpYWxpemFjafNuIGRlbCBnZXN0b3IgZGUgbGEgc2VzafNuIG5vIHB1ZWRlIGVzdGFyIHZhY+1hPC9saT4KK2Vycm9yLm1nck1heFNlc3Npb25zLnJlcXVpcmVkPTxsaT5MYXMgc2VzaW9uZXMgbeF4aW1hcyBubyBwdWVkZW4gZXN0YXIgdmFj7WFzPC9saT4KK2Vycm9yLm1nck1heFNlc3Npb25zLmZvcm1hdD08bGk+oUxhcyBTZXNpb25lcyBt4XhpbWFzIG5vIHNvbiB1biBlbnRlcm8gduFsaWRvITwvbGk+CitlcnJvci5tZ3JNYXhTZXNzaW9ucy5yYW5nZT08bGk+TGFzIHNlc2lvbmVzIG3heGltYXMgcGFyZWNlbiBlc3RhciBmdWVyYSBkZSByYW5nby4gRWwgcmFuZ28gduFsaWRvIHZhIGRlIC0xIGEgMTAwLjwvbGk+CitsaXN0Lm5vbmU9KE5hZGEpCitsb2dnZXIuZGlyZWN0b3J5PURpcmVjdG9yaW8KK2xvZ2dlci5wcmVmaXg9UHJlZmlqbworbG9nZ2VyLnN1ZmZpeD1TdWZpam8KK2xvZ2dlci50aW1lc3RhbXA9U2VsbG8gdGVtcG9yYWwgKHRpbWVzdGFtcCkKK2xvZ2dlci5maWxlbG9nZ2VyLnByb3BlcnRpZXM9UHJvcGllZGFkZXMgZXNwZWPtZmljYXMgZGVsIFJlZ2lzdHJhZG9yIGRlIEFyY2hpdm8gKEZpbGVMb2dnZXIpCitsb2dnZXIudmVyYm9zaXR5bGV2ZWw9Tml2ZWwgZGUgRGV0YWxsZQorZXJyb3IubG9nZ2VyTmFtZS5iYWQ9Tm9tYnJlIGRlIHJlZ2lzdHJhZG9yIGluduFsaWRvIHswfQorZXJyb3IubG9nZ2VyTmFtZS5leGlzdHM9PGxpPkVsIHJlZ2lzdHJhZG9yIHlhIGV4aXN0ZS48L2xpPgorZXJyb3IuZGlyZWN0b3J5LnJlcXVpcmVkPTxsaT5FbCBEaXJlY3RvcmlvIG5vIHB1ZWRlIGVzdGFyIHZhY+1vLjwvbGk+CitlcnJvci5wcmVmaXgucmVxdWlyZWQ9PGxpPkVsIHByZWZpam8gbm8gcHVlZGUgZXN0YXIgdmFj7W8uPC9saT4KK2Vycm9yLnN1ZmZpeC5yZXF1aXJlZD08bGk+RWwgc3VmaWpvIG5vIHB1ZWRlIGVzdGFyIHZhY+1vLjwvbGk+CitlcnJvci52YWx2ZU5hbWUuYmFkPU5vbWJyZSBkZSB24Wx2dWxhIGluduFsaWRvIHswfQorZXJyb3IudmFsdmVOYW1lLmV4aXN0cz08bGk+WWEgZXhpc3RlIGxhIHbhbHZ1bGE8L2xpPgorZXJyb3Iuc2luZ2xlU2lnbk9uLmV4aXN0cz08bGk+WWEgZXhpc3RlIGxhIHbhbHZ1bGEgZGUgTG9naW4g2m5pY28gKFNpbmdsZVNpZ25Pbik8L2xpPgordXNlci5mdWxsTmFtZT1Ob21icmUgQ29tcGxldG8KK3VzZXIuZ3JvdXBzPU1pZW1icm8gZW4gbG9zIEdydXBvcwordXNlci5uZXdVc2VyPUNyZWFyIE51ZXZhcyBQcm9waWVkYWRlcyBkZSBVc3VhcmlvCit1c2VyLm9sZFVzZXI9RWRpdGFyIFByb3BpZWRhZGVzIHlhIGV4aXN0ZW50ZXMgZGUgVXN1YXJpbwordXNlci5wYXNzd29yZD1Db250cmFzZfFhCit1c2VyLnByb3BlcnRpZXM9UHJvcGllZGFkZXMgZGUgVXN1YXJpbwordXNlci5yb2xlcz1QYXBlbGVzIERlc2VtcGXxYWRvcyBkZSBTZWd1cmlkYWQKK3VzZXIudXNlcm5hbWU9Tm9tYnJlIGRlIFVzdWFyaW8KK2Vycm9yLnBhc3N3b3JkLnJlcXVpcmVkPTxsaT5TZSByZXF1aWVyZSBsYSBjb250cmFzZfFhPC9saT4KK2Vycm9yLnVzZXJuYW1lLnJlcXVpcmVkPTxsaT5TZSByZXF1aWVyZSBlbCBub21icmUgZGUgdXN1YXJpbzwvbGk+CitlcnJvci5nZXQuYXR0cmlidXRlcz1FcnJvciBleHRyYXllbmRvIHByb3BpZWRhZGVzIGRlIGluZm9ybWFjafNuLgorZXJyb3Iuc2V0LmF0dHJpYnV0ZXM9RXJyb3IgcG9uaWVuZG8gcHJvcGllZGFkZXMgZGUgaW5mb3JtYWNp824uCithY3Rpb25zLmRlbGV0ZT1Cb3JyYXIKK2Vycm9yLmRlZmF1bHRIb3N0LnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FybyBlbCBOb21icmUgZGUgTeFxdWluYSBwb3IgZGVmZWN0bzwvbGk+CitlcnJvci5lbmdpbmVOYW1lLmJhZD1Ob21icmUgZGUgbW90b3IgaW524WxpZG97MH0KK2Vycm9yLmVuZ2luZU5hbWUuZXhpc3RzPTxsaT5ZYSBleGlzdGUgZWwgTm9tYnJlIGRlIE1vdG9yPC9saT4KK2Vycm9yLnNlcnZpY2VOYW1lLmJhZD1Ob21icmUgZGUgc2VydmljaW8gaW524WxpZG8gezB9CitlcnJvci5zZXJ2aWNlTmFtZS5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIGVsIE5vbWJyZSBkZWwgU2VydmljaW88L2xpPgorZXJyb3Iuc2VydmljZU5hbWUuZXhpc3RzPTxsaT5ZYSBleGlzdGUgZWwgTm9tYnJlIGRlbCBTZXJ2aWNpbzwvbGk+CitlcnJvci5qZGJjcmVhbG09SGEgdGVuaWRvIGx1Z2FyIHVuIGVycm9yIGFsIHBvbmVyIHZhbG9yIGRlIEpEQkNSZWFsbS4KK2Vycm9yLmpuZGlyZWFsbT1IYSB0ZW5pZG8gbHVnYXIgdW4gZXJyb3IgYWwgcG9uZXIgdmFsb3IgZGUgSk5ESVJlYWxtLgorZXJyb3IudXNlcmRicmVhbG09SGEgdGVuaWRvIGx1Z2FyIHVuIGVycm9yIGFsIHBvbmVyIHZhbG9yIGRlIFVzZXJkYXRhYmFzZVJlYWxtLgorZXJyb3IucmVhbG1OYW1lLmJhZD1Ob21icmUgZGUgcmVpbm8gaW524WxpZG8gezB9CitlcnJvci5yZWFsbU5hbWUucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBlbCBub21icmUgZGUgUmVpbm8uPC9saT4KK2Vycm9yLnJlYWxtTmFtZS5leGlzdHM9PGxpPllhIGV4aXN0ZSB1biBSZWluby48L2xpPgorZXJyb3IuY29udGV4dE5hbWUuYmFkPU5vbWJyZSBkZSBjb250ZXh0byBpbnbhbGlkbyB7MH0KK2Vycm9yLmNvbnRleHROYW1lLmV4aXN0cz08bGk+WWEgZXhpc3RlIGVsIENvbnRleHRvLjwvbGk+CitlcnJvci5kZWZhdWx0Y29udGV4dE5hbWUuZXhpc3RzPTxsaT5ZYSBleGlzdGUgQ29udGV4dG8gcG9yIERlZmVjdG8gKERlZmF1bHRDb250ZXh0KS48L2xpPgorZXJyb3IucGF0aC5wcmVmaXg9PGxpPkxhIHRyYXllY3RvcmlhIGRlYmUgZGUgY29tZW56YXIgY29uICcvJy48L2xpPgorZXJyb3IubG9hZGVyTmFtZS5iYWQ9Tm9tYnJlIGRlIGNhcmdhZG9yIGluduFsaWRvIHswfQorZXJyb3IubWFuYWdlck5hbWUuYmFkPU5vbWJyZSBkZSBnZXN0b3IgaW524WxpZG8gezB9CitlcnJvci5jb25uZWN0b3JOYW1lLmJhZD1Ob21icmUgZGUgY29uZWN0b3IgaW524WxpZG8gezB9CitlcnJvci5jb25uZWN0b3JOYW1lLmV4aXN0cz08bGk+WWEgZXhpc3RlIGVsIENvbmVjdG9yPC9saT4KK2Vycm9yLnBhdHRlcm4ucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBlbCBQYXRy824gKFBhdHRlcm4pPC9saT4KK2Vycm9yLnZhbHZlTmFtZS5iYWQ9Tm9tYnJlIGRlIHbhbHZ1bGEgaW524WxpZG8gezB9CitlcnJvci52YWx2ZU5hbWUuZXhpc3RzPTxsaT5ZYSBleGlzdGUgbGEgVuFsdnVsYTwvbGk+CityZWFsbS5kcml2ZXI9TWFuZWphZG9yIChEcml2ZXIpIGRlIEJhc2UgZGUgRGF0b3MKK3JlYWxtLnBhc3N3ZD1Db250cmFzZfFhIGRlIGxhIEJhc2UgZGUgRGF0b3MKK3JlYWxtLnVybD1VUkwgZGUgbGEgQmFzZSBkZSBEYXRvcworcmVhbG0udXNlck5hbWU9Tm9tYnJlIGRlIFVzdWFyaW8gZGUgbGEgQmFzZSBkZSBEYXRvcworcmVhbG0uZGlnZXN0PUFsZ29yaXRtbyBSZXN1bWVuIChEaWdlc3QpCityZWFsbS5wYXNzd29yZENvbD1Db2x1bW5hIGRlIENvbnRyYXNl8WEKK3JlYWxtLnJvbGVOYW1lQ29sPUNvbHVtbmEgZGVsIE5vbWJyZSBkZWwgUGFwZWwgRGVzZW1wZfFhZG8gKFJvbGUpCityZWFsbS51c2VyTmFtZUNvbD1Db2x1bW5hIGRlbCBOb21icmUgZGVsIFVzdWFyaW8KK3JlYWxtLnVzZXJSb2xlVGFibGU9VGFibGEgZGVsIFBhcGVsIGRlc2VtcGXxYWRvIHBvciBlbCBVc3VhcmlvCityZWFsbS51c2VyVGFibGU9VGFibGEgZGUgVXN1YXJpbworcmVhbG0ucmVzb3VyY2U9Tm9tYnJlIGRlbCBSZWN1cnNvCityZWFsbS5wYXRoTmFtZT1Ob21icmUgZGUgbGEgVHJheWVjdG9yaWEKK3JlYWxtLmNvbm5OYW1lPU5vbWJyZSBkZSBsYSBDb25leGnzbgorcmVhbG0uY29ublBhc3N3b3JkPUNvbnRyYXNl8WEgZGUgbGEgQ29uZXhp824KK3JlYWxtLmNvbm5VUkw9VVJMIGRlIGxhIENvbmV4afNuCityZWFsbS5jb25uRmFjdG9yeT1G4WJyaWNhIGRlbCBDb250ZXh0bworcmVhbG0ucm9sZUJhc2U9RWxlbWVudG8gQmFzZSBkZWwgUGFwZWwgRGVzZW1wZfFhZG8KK3JlYWxtLnJvbGVOYW1lPU5vbWJyZSBkZWwgUGFwZWwgRGVzZW1wZfFhZG8KK3JlYWxtLnVzZXIucm9sZU5hbWU9Tm9tYnJlIGRlbCBQYXBlbCBEZXNlbXBl8WFkbworcmVhbG0ucGF0dGVybj1QYXRy824gZGUgbGEgQvpzcXVlZGEgZGVsIFBhcGVsIERlc2VtcGXxYWRvCityZWFsbS5yb2xlLnN1YnRyZWU9QnVzY2FyIFN1YuFyYm9sIGRlbCBQYXBlbCBEZXNlbXBl8WFkbworcmVhbG0udXNlckJhc2U9RWxlbWVudG8gQmFzZSBkZSBVc3VhcmlvCityZWFsbS51c2VyLnN1YnRyZWU9QnVzY2FyIFN1YuFyYm9sIGRlIFVzdWFyaW8KK3JlYWxtLnVzZXJQYXNzd29yZD1Db250cmFzZfFhIGRlbCBVc3VhcmlvCityZWFsbS51c2VyUGF0dGVybj1QYXRy824gZGUgVXN1YXJpbworcmVhbG0udXNlclNlYXJjaD1C+nNxdWVkYSBkZSBVc3VhcmlvCit2YWx2ZS5hY2Nlc3MucHJvcGVydGllcz1Qcm9waWVkYWRlcyBkZWwgUmVnaXN0cmFkb3IgZGUgQWNjZXNvCit2YWx2ZS5yZXF1ZXN0LnByb3BlcnRpZXM9UHJvcGllZGFkZXMgZGVsIEZpbHRybyBkZSBSZXF1ZXJpbWllbnRvCit2YWx2ZS5zaW5nbGUucHJvcGVydGllcz1Qcm9waWVkYWRlcyBkZSBsYSB24Wx2dWxhIGRlIFNpZ25PbiDabmljbwordmFsdmUucmVtb3RlaG9zdC5wcm9wZXJ0aWVzPVByb3BpZWRhZGVzIGRlIGxhIFbhbHZ1bGEgZGUgTeFxdWluYSBSZW1vdGEKK3ZhbHZlLnJlbW90ZWFkZHJlc3MucHJvcGVydGllcz1Qcm9waWVkYWRlcyBkZSBsYSBW4Wx2dWxhIGRlIERpcmVjY2nzbiBSZW1vdGEKK3ZhbHZlLnJlc29sdmVIb3N0cz1SZXNvbHZlciBN4XF1aW5hcwordmFsdmUucm90YXRhYmxlPVJvdGF0aXZvCit2YWx2ZS5wYXR0ZXJuPVBhdHLzbgordmFsdmUuYWxsb3dIb3N0cz1QZXJtaXRpciBhIGVzdGFzIE3hcXVpbmFzCit2YWx2ZS5kZW55SG9zdHM9RGVuZWdhciBhIGVzdGFzIE3hcXVpbmFzCit2YWx2ZS5hbGxvd0lQcz1QZXJtaXRpciBhIGRpcmVjY2lvbmVzIElQCit2YWx2ZS5kZW55SVBzPURlbmVnYXIgYSBkaXJlY2Npb25lcyBJUAorZXJyb3IuYWxsb3dIb3N0PTxsaT5QZXJtaXRpciBlcyBpbnbhbGlkby4gRXMgbmVjZXNhcmlvIGluY2x1aXIgZWwgbm9tYnJlIGRlIG3hcXVpbmEgZGVsIGFkbWluaXN0cmFkb3IuPC9saT4KK2Vycm9yLmRlbnlIb3N0PTxsaT5EZW5lZ2FyIGVzIGluduFsaWRvLiBFcyBuZWNlc2FyaW8gZXhjbHVpciBlbCBub21icmUgZGUgbeFxdWluYSBkZWwgYWRtaW5pc3RyYWRvci48L2xpPgorZXJyb3IuYWxsb3dJUD08bGk+UGVybWl0aXIgZXMgaW524WxpZG8uIEVzIG5lY2VzYXJpbyBpbmNsdWlyIGxhIGRpcmVjY2nzbiBJUCBkZWwgYWRtaW5pc3RyYWRvci48L2xpPgorZXJyb3IuZGVueUlQPTxsaT5EZW5lZ2FyIGVzIGluduFsaWRvLiBFcyBuZWNlc2FyaW8gZXhjbHVpciBsYSBkaXJlY2Np824gSVAgZGVsIGFkbWluaXN0cmFkb3IuPC9saT4KK2Vycm9yLmFsbG93LmRlbnkucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBwb25lciBQZXJtaXRpciBvIERlbmVnYXIuPC9saT4KK2Vycm9yLnN5bnRheD08bGk+RXJyb3IgZGUgc2ludOF4aXMgZW4gcGF0cvNuIGRlbCBmaWx0cm8gZGUgbGEgcGV0aWNp824uPC9saT4KK2Vycm9yLnJlc291cmNlLnJlcXVpcmVkPTxsaT5TZSByZXF1aWVyZSBlbCBOb21icmUgZGVsIFJlY3Vyc28uPC9saT4KK2Vycm9yLnJlc291cmNlLmphdmFwcmVmaXg9PGxpPkVsIHJlY3Vyc28gZGViZSBkZSB0ZW5lciBlbCBwcmVmaWpvICJqYXZhOiI8L2xpPgorZXJyb3IucGF0aE5hbWUucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBwb25lciBlbCBub21icmUgZGUgbGEgdHJheWVjdG9yaWEuPC9saT4KK2Vycm9yLmRyaXZlci5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIHBvbmVyIGVsIG1hbmVqYWRvciAoZHJpdmVyKSBkZSBsYSBiYXNlIGRlIGRhdG9zLjwvbGk+CitlcnJvci5yb2xlTmFtZUNvbC5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIHBvbmVyIGxhIGNvbHVtbmEgZGVsIG5vbWJyZSBkZSBQYXBlbCBEZXNlbXBl8WFkby48L2xpPgorZXJyb3IudXNlck5hbWVDb2wucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBwb25lciBsYSBjb2x1bW5hIGRlbCBub21icmUgZGUgVXN1YXJpby48L2xpPgorZXJyb3IucGFzc3dvcmRDb2wucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBwb25lciBsYSBjb2x1bW5hIGRlIGxhIENvbnRyYXNl8WEuPC9saT4KK2Vycm9yLnVzZXJUYWJsZS5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIHBvbmVyIGxhIFRhYmxhIGRlIFVzdWFyaW8uPC9saT4KK2Vycm9yLnJvbGVUYWJsZS5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIHBvbmVyIGxhIFRhYmxhIGRlbCBQYXBlbCBEZXNlbXBl8WFkbyBwb3IgZWwgVXN1YXJpby48L2xpPgorZXJyb3IuY29ubmVjdGlvblBhc3N3b3JkLnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FyaW8gcG9uZXIgbGEgY29udHJhc2XxYSBkZSBsYSBiYXNlIGRlIGRhdG9zLjwvbGk+CitlcnJvci5jb25uZWN0aW9uVVJMLnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FyaW8gcG9uZXIgbGEgVVJMIGRlIGxhIEJhc2UgZGUgRGF0b3MuPC9saT4KK2Vycm9yLmNvbm5lY3Rpb25OYW1lLnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FyaW8gcG9uZXIgZWwgbm9tYnJlIGRlIHVzdWFyaW8gZGUgbGEgQmFzZSBkZSBEYXRvcy48L2xpPgorZXJyb3Iucm9sZU5hbWUucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBwb25lciBlbCBub21icmUgZGVsIFBhcGVsIERlc2VtcGXxYWRvby48L2xpPgorZXJyb3IudXNlclJvbGVOYW1lLnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FyaW8gcG9uZXIgZWwgbm9tYnJlIGRlbCBQYXBlbCBEZXNlbXBl8WFkbyBwb3IgZWwgVXN1YXJpby48L2xpPgorZXJyb3IuZGlnZXN0LnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FyaW8gcG9uZXIgZWwgYWxnb3JpdG1vIGRlIHJlc3VtZW4gKGRpZ2VzdCkuPC9saT4KK2Vycm9yLnJvbGVCYXNlLnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FyaW8gcG9uZXIgZWwgZWxlbWVudG8gYmFzZSBkZWwgUGFwZWwgRGVzZW1wZfFhZG8uPC9saT4KK2Vycm9yLnJvbGVQYXR0ZXJuLnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FyaW8gcG9uZXIgZWwgcGF0cvNuIGRlIGL6c3F1ZWRhIGRlbCBQYXBlbCBEZXNlbXBl8WFkby48L2xpPgorZXJyb3IudXNlckJhc2UucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBwb25lciBlbCBlbGVtZW50byBiYXNlIGRlbCB1c3VhcmlvLjwvbGk+CitlcnJvci51c2VyUGFzc3dvcmQucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBwb25lciBsYSBDb250cmFzZfFhIGRlbCBVc3VhcmlvLjwvbGk+CitlcnJvci51c2VyUGF0dGVybi5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIHBvbmVyIGVsIHBhdHLzbiBkZWwgVXN1YXJpby48L2xpPgorZXJyb3IudXNlclNlYXJjaC5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIHBvbmVyIGxhIGL6c3F1ZWRhIGRlbCB1c3VhcmlvLjwvbGk+CitlcnJvci51c2VyUGF0dGVybi51c2VyU2VhcmNoLmRlZmluZWQ9PGxpPlNlIGRlYmUgZGUgZXNwZWNpZmljYXIgVXNlclBhdHRlcm4gbyB1c2VyU2VhcmNoLCBwZXJvIG5vIGFtYm9zLjwvbGk+CitlcnJvci5jb250ZXh0RmFjdG9yeS5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIHBvbmVyIGxhIEbhYnJpY2EgZGVsIENvbnRleHRvLjwvbGk+CitlcnJvci5jb25uUGFzc3dvcmQucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBwb25lciBsYSBDb250cmFzZfFhIGRlIGxhIENvbmV4afNuLjwvbGk+CitlcnJvci5jb25uVVJMLnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FyaW8gcG9uZXIgbGEgVVJMIGRlIGxhIENvbmV4afNuLjwvbGk+CitlcnJvci5jb25uTmFtZS5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIHBvbmVyIGVsIG5vbWJyZSBkZSBDb25leGnzbi48L2xpPgorCisjIC0tLS0tLS0tLS0gU2VydmVyIE1vZHVsZSAtLS0tLS0tLS0tCitzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5zdWJ0cmVlTm9kZT1TZXJ2aWNpbworc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuY29ubmVjdG9yPUNvbmVjdGFkb3IKK3NlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLmhvc3Q9SG9zdAorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuY29udGV4dD1Db250ZXh0IAorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIubG9nZ2VyRm9yPUxvZ2dlciBmb3IgezB9CitzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5yZWFsbUZvcj1SZWFsbSBmb3IgezB9IAorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIubG9nZ2VyPUxvZ2dlcgorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIucmVhbG09UmVhbG0KKworIyAtLS0tLS0tLS0tIFJlc291cmNlcyBNb2R1bGUgLS0tLS0tLS0tLQorcmVzb3VyY2VzLnRyZWVCdWlsZGVyLnN1YnRyZWVOb2RlPVJlY3Vyc29zCityZXNvdXJjZXMudHJlZUJ1aWxkZXIuZGF0YXNvdXJjZXM9RnVlbnRlcyBkZSBEYXRvcworcmVzb3VyY2VzLnRyZWVCdWlsZGVyLm1haWxzZXNzaW9ucz1TZXNpb25lcyBkZSBDb3JyZW8KK3Jlc291cmNlcy50cmVlQnVpbGRlci5yZXNvdXJjZWxpbmtzPUVubGFjZXMgZGUgUmVjdXJzbworcmVzb3VyY2VzLmVudi5lbnRyaWVzPUVudHJhZGFzIGRlIEVudG9ybm8KK3Jlc291cmNlcy5lbnYuZW50cnk9Tm9tYnJlIGRlIEVudHJhZGEKK3Jlc291cmNlcy5lbnYucHJvcHM9UHJvcGllZGFkZXMgZGUgbGEgRW50cmFkYSBkZSBFbnRvcm5vCityZXNvdXJjZXMuZW52Lm92ZXJyaWRlPVBhc2FyIHBvciBhbHRvIEVudHJhZGFzIGRlIE5pdmVsIGRlIEFwbGljYWNp824KK3Jlc291cmNlcy5hY3Rpb25zLmVudi5jcmVhdGU9Q3JlYXIgTnVldmEgRW50cmFkYSBkZSBFbnRvcm5vCityZXNvdXJjZXMuYWN0aW9ucy5lbnYuZWRpdD1FZGl0YXIgRW50cmFkYSBkZSBFbnRvcm5vCityZXNvdXJjZXMuYWN0aW9ucy5lbnYuZGVsZXRlPUJvcnJhciBFbnRyYWRhcyBkZSBFbnRvcm5vCityZXNvdXJjZXMuYWN0aW9ucy5lbnYubGlzdD1MaXN0YXIgRW50cmFkYXMgRXhpc3RlbnRlcworcmVzb3VyY2VzLmRhdGFzcmMuamRiYz1NYW5lamFkb3IgSkRCQworcmVzb3VyY2VzLmFjdGlvbnMuZGF0YXNyYz1GdWVudGVzIGRlIERhdG9zCityZXNvdXJjZXMuYWN0aW9ucy5kYXRhc3JjLmNyZWF0ZT1DcmVhciBOdWV2YSBGdWVudGUgZGUgRGF0b3MKK3Jlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMuZGVsZXRlPUJvcnJhciBGdW50ZXMgZGUgRGF0b3MKK3Jlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMuZWRpdD1FZGl0YXIgRnVlbnRlIGRlIERhdG9zCityZXNvdXJjZXMuZGF0YXNyYy51cmw9VVJMIGRlIEZ1ZW50ZSBkZSBEYXRvcworcmVzb3VyY2VzLmRhdGFzcmMuamRiY2NsYXNzPUNsYXNlIGRlIE1hbmVqYWRvciBKREJDCityZXNvdXJjZXMuZGF0YXNyYy5jb25uZWN0aW9ucz1Db25leGlvbmVzCityZXNvdXJjZXMuZGF0YXNyYy5hY3RpdmU9TeF4LiBDb25leGlvbmVzIEFjdGl2YXMKK3Jlc291cmNlcy5kYXRhc3JjLmlkbGU9TeF4LiBDb25leGlvbmVzIE9jaW9zYXMKK3Jlc291cmNlcy5kYXRhc3JjLndhaXQ9TeF4LiBFc3BlcmEgcG9yIGNvbmV4afNuCityZXNvdXJjZXMuZGF0YXNyYy52YWxpZGF0aW9uPUNvbnN1bHRhIGRlIFZhbGlkYWNp824KK3Jlc291cmNlcy5kYXRhc3JjLmpuZGk9Tm9tYnJlIEpOREkKK3Jlc291cmNlcy5hY3Rpb25zLm1haWxzZXNzaW9uPVNlc2lvbmVzIERlIENvcnJlbworcmVzb3VyY2VzLmFjdGlvbnMubWFpbHNlc3Npb24uY3JlYXRlPUNyZWFyIE51ZXZhIFNlc2nzbiBkZSBDb3JyZW8KK3Jlc291cmNlcy5hY3Rpb25zLm1haWxzZXNzaW9uLmRlbGV0ZT1Cb3JyYXIgU2VzafNuIGRlIENvcnJlbworcmVzb3VyY2VzLmFjdGlvbnMubWFpbHNlc3Npb24uZWRpdD1FZGl0YXIgU2VzafNuIGRlIENvcnJlbworcmVzb3VyY2VzLm1haWxzZXNzaW9uLm5hbWU9Tm9tYnJlCityZXNvdXJjZXMubWFpbHNlc3Npb24ubWFpbGhvc3Q9bWFpbC5zbXRwLmhvc3QKK3Jlc291cmNlcy5hY3Rpb25zLnJlc291cmNlbGs9RW5sYWNlcyBkZSBSZWN1cnNvCityZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrLmNyZWF0ZT1DcmVhciBOdWV2byBFbmxhY2UgZGUgUmVjdXJzbworcmVzb3VyY2VzLmFjdGlvbnMucmVzb3VyY2Vsay5kZWxldGU9Qm9ycmFyIEVubGFjZSBkZSBSZWN1cnNvCityZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrLmVkaXQ9RWR0aWFyIEVubGFjZSBkZSBSZWN1cnNvCityZXNvdXJjZXMucmVzb3VyY2Vsay5uYW1lPU5vbWJyZQorcmVzb3VyY2VzLnJlc291cmNlbGsuZ2xvYmFsPUdsb2JhbAorcmVzb3VyY2VzLnJlc291cmNlbGsudHlwZT1UaXBvCityZXNvdXJjZXMuZXJyb3IubmFtZS5yZXF1aXJlZD08bGk+Tm9tYnJlIHJlcXVlcmlkby48L2xpPgorcmVzb3VyY2VzLmVycm9yLmdsb2JhbC5yZXF1aXJlZD08bGk+R2xvYmFsIHJlcXVlcmlkby48L2xpPgorcmVzb3VyY2VzLmVycm9yLnR5cGUucmVxdWlyZWQ9PGxpPlRpcG8gcmVxdWVyaWRvLjwvbGk+CityZXNvdXJjZXMuZXJyb3IudmFsdWUucmVxdWlyZWQ9PGxpPlZhbG9yIHJlcXVlcmlkby48L2xpPgorcmVzb3VyY2VzLmVycm9yLnZhbHVlLm1pc21hdGNoPTxsaT5FbCB0aXBvIHkgZWwgdmFsb3Igbm8gcGFyZWNlbiBjb2luY2lkaXIuPC9saT4KK3Jlc291cmNlcy5lcnJvci5lbnRyeVR5cGUuaW52YWxpZD08bGk+RWwgdGlwbyBkZSBFbnRyYWRhIG5vIHNlIHJlY29ub2NlLjwvbGk+CityZXNvdXJjZXMuZXJyb3IuZW50cnlUeXBlLm5vdGltcGw9PGxpPkxhIFZhbGlkYWNp824gcGFyYSBlc3RlIHRpcG8gbm8gaGEgc2lkbyBpbXBsZW1lbnRhZGEgYfpuLjwvbGk+CityZXNvdXJjZXMuZXJyb3IudXJsLnJlcXVpcmVkPTxsaT5TZSByZXF1aWVyZSBsYSBVUkwgZGUgRnVlbnRlIGRlIERhdG9zLjwvbGk+CityZXNvdXJjZXMuZXJyb3IuZHJpdmVyQ2xhc3MucmVxdWlyZWQ9PGxpPlNlIHJlcXVpZXJlIGxhIENsYXNlIGRlbCBDb25kdWN0b3IgKGRyaXZlcikgZGUgSkRCQy48L2xpPgorcmVzb3VyY2VzLmVycm9yLmFjdGl2ZS5yZXF1aXJlZD08bGk+U2UgcmVxdWllcmVuIGxhcyBjb25leGlvbmVzIGFjdGl2YXMgbeF4aW1hcy48L2xpPgorcmVzb3VyY2VzLmVycm9yLmlkbGUucmVxdWlyZWQ9PGxpPlNlIHJlcXVpZXJlbiBsYXMgY29uZXhpb25lcyBvY2lvc2FzIG3heGltYXMuPC9saT4KK3Jlc291cmNlcy5lcnJvci53YWl0LnJlcXVpcmVkPTxsaT5MYSBlc3BlcmEgbeF4aW1hIHBvciB1bmEgY29uZXhp824gc2UgcmVxdWllcmUuPC9saT4KK3Jlc291cmNlcy5lcnJvci5tYWlsaG9zdC5yZXF1aXJlZD08bGk+bWFpbC5zbXRwLmhvc3Qgc2UgcmVxdWllcmUuPC9saT4KK3Jlc291cmNlcy5pbnRlZ2VyLmVycm9yPTxsaT5FcnJvciBkZSBu+m1lcm8gZW50ZXJvIGluduFsaWRvLjwvbGk+CityZXNvdXJjZXMuYWN0aW9ucy51c2VyZGIuY3JlYXRlPUNyZWFyIE51ZXZhIEJhc2UgZGUgRGF0b3MgZGUgVXN1YXJpbworcmVzb3VyY2VzLmFjdGlvbnMudXNlcmRiLmVkaXQ9RWRpdGFyIEJhc2UgZGUgRGF0b3MgZGUgVXN1YXJpbworcmVzb3VyY2VzLmFjdGlvbnMudXNlcmRiLmRlbGV0ZT1Cb3JyYXIgQmFzZXMgZGUgRGF0b3MgZGUgVXN1YXJpbworcmVzb3VyY2VzLnVzZXJkYi5sb2NhdGlvbj1Mb2NhbGl6YWNp824KK3Jlc291cmNlcy51c2VyZGIuZmFjdG9yeT1G4WJyaWNhCityZXNvdXJjZXMudHJlZUJ1aWxkZXIudXNlcmRicz1CYXNlcyBkZSBEYXRvcyBkZSBVc3VhcmlvCityZXNvdXJjZXMuZXJyb3IucGF0aC5yZXF1aXJlZD08bGk+U2UgcmVxdWllcmUgbGEgVHJheWVjdG9yaWE8L2xpPgorcmVzb3VyY2VzLmVycm9yLmpuZGlOYW1lLnJlcXVpcmVkPTxsaT5TZSByZXF1aWVyZSBlbCBOb21icmUgSk5ESTwvbGk+CityZXNvdXJjZXMuaW52YWxpZC5uYW1lPTxsaT5Ob21icmUgaW524WxpZG8gZGUgcmVjdXJzbyAtIGVsIG5vbWJyZSB5YSBleGlzdGUuPC9saT4KK3Jlc291cmNlcy5pbnZhbGlkLmVudj08bGk+Tm9tYnJlIGluduFsaWRvIGRlIGVudG9ybm8gLSBlbCBub21icmUgeWEgZXhpc3RlLjwvbGk+CisKKyMgLS0tLS0tLS0tLSBVc2VyIERhdGFiYXNlIE1vZHVsZSAtLS0tLS0tLS0tCit1c2Vycy5hY3Rpb25zLmdyb3VwLmNyZWF0ZT1DcmVhciBOdWV2byBHcnVwbwordXNlcnMuYWN0aW9ucy5ncm91cC5kZWxldGU9Qm9ycmFyIEdydXBvcyBFeGlzdGVudGVzCit1c2Vycy5hY3Rpb25zLmdyb3VwLmxpc3Q9TGlzdGFyIEdydXBvcyBFeGlzdGVudGVzCit1c2Vycy5hY3Rpb25zLnJvbGUuY3JlYXRlPUNyZWFyIE51ZXZvIFBhcGVsIGEgRGVzZW1wZfFhcgordXNlcnMuYWN0aW9ucy5yb2xlLmRlbGV0ZT1Cb3JyYXIgUGFwZWxlcyBhIERlc2VtcGXxYXIgeWEgRXhpc3RlbnRlcwordXNlcnMuYWN0aW9ucy5yb2xlLmxpc3Q9TGlzdGFyIFBhcGVsZXMgYSBEZXNlbXBl8WFyIHlhIEV4aXN0ZW50ZXMKK3VzZXJzLmFjdGlvbnMudXNlci5jcmVhdGU9Q3JlYXIgTnVldm8gVXN1YXJpbwordXNlcnMuYWN0aW9ucy51c2VyLmRlbGV0ZT1Cb3JyYXIgVXN1YXJpb3MgeWEgRXhpc3RlbnRlcwordXNlcnMuYWN0aW9ucy51c2VyLmxpc3Q9TGlzdGFyIFVzdWFyaW9zIHlhIEV4aXN0ZW50ZXMKK3VzZXJzLmRlbGV0ZUdyb3Vwcy50aXRsZT1Cb3JyYXIgR3J1cG9zIHlhIEV4aXN0ZW50ZXMKK3VzZXJzLmRlbGV0ZVJvbGVzLnRpdGxlPUJvcnJhciBQYXBlbGVzIGEgRGVzZW1wZfFhciB5YSBFeGlzdGVudGVzCit1c2Vycy5kZWxldGVVc2Vycy50aXRsZT1Cb3JyYXIgVXN1YXJpb3MgeWEgRXhpc3RlbnRlcwordXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldD1FcnJvciByZWN1cGVyYW5kbyBhdHJpYnV0byB7MH0KK3VzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQ9RXJyb3IgbW9kaWZpY2FuZG8gYXRyaWJ1dG8gezB9Cit1c2Vycy5lcnJvci5pbnZva2U9RXJyb3IgaW52b2NhbmRvIG9wZXJhY2nzbiB7MH0KK3VzZXJzLmVycm9yLmdyb3VwbmFtZS5yZXF1aXJlZD1TZSByZXF1aWVyZSBlbCBOb21icmUgZGUgR3J1cG8KK3VzZXJzLmVycm9yLnBhc3N3b3JkLnJlcXVpcmVkPUNvbnRyYXNl8WEgUmVxdWVyaWRhCit1c2Vycy5lcnJvci5xdW90ZXM9TGEgZG9ibGUgY29taWxsYSBubyBlc3RhIHBlcm1pdGlkYSBlbiBsb3MgdmFsb3JlcyBkZSBjYW1wbwordXNlcnMuZXJyb3Iucm9sZW5hbWUucmVxdWlyZWQ9U2UgcmVxdWllcmUgZWwgTm9tYnJlIGRlbCBQYXBlbCBhIERlc2VtcGXxYXIKK3VzZXJzLmVycm9yLnNlbGVjdD1FcnJvciBzZWxlY2Npb25hbmRvIG9iamV0b3MgZ2VzdGlvbmFkb3MKK3VzZXJzLmVycm9yLnRva2VuPVRyYW5zYWNjafNuIGVudmlhZGEgZnVlcmEgZGUgc2VydmljaW8KK3VzZXJzLmVycm9yLnVzZXJuYW1lLnJlcXVpcmVkPTxsaT5TZSByZXF1aWVyZSBlbCBub21icmUgZGVsIHVzdWFyaW88L2xpPgordXNlcnMuZ3JvdXAubmV3R3JvdXA9Q3JlYXIgUHJvcGllZGFkZXMgZGUgTnVldm8gR3J1cG8KK3VzZXJzLmdyb3VwLm9sZEdyb3VwPUVkaXRhciBQcm9waWVkYWRlcyBkZSBHcnVwbyB5YSBFeGlzdGVudGUKK3VzZXJzLmdyb3VwLnByb3BlcnRpZXM9UHJvcGllZGFkZXMgZGUgR3J1cG8KK3VzZXJzLmxpc3QuZGVzY3JpcHRpb249RGVzY3JpcGNp824KK3VzZXJzLmxpc3QuZnVsbE5hbWU9Tm9tYnJlIENvbXBsZXRvCit1c2Vycy5saXN0Lmdyb3VwbmFtZT1Ob21icmUgZGUgR3J1cG8KK3VzZXJzLmxpc3Qucm9sZW5hbWU9Tm9tYnJlIGRlIFBhcGVsIGEgRGVzZW1wZfFhcgordXNlcnMubGlzdC51c2VybmFtZT1Ob21icmUgZGUgVXN1YXJpbwordXNlcnMubGlzdEdyb3Vwcy50aXRsZT1MaXN0YSBkZSBHcnVwb3MKK3VzZXJzLmxpc3RSb2xlcy50aXRsZT1MaXN0YSBkZSBQYXBlbGVzIGEgRGVzZW1wZfFhcgordXNlcnMubGlzdFVzZXJzLnRpdGxlPUxpc3RhIGRlIFVzdWFyaW9zCit1c2Vycy5wcm9tcHQuZGVzY3JpcHRpb249RGVzY3JpcGNp8246Cit1c2Vycy5wcm9tcHQuZnVsbE5hbWU9Tm9tYnJlIENvbXBsZXRvOgordXNlcnMucHJvbXB0Lmdyb3VwbmFtZT1Ob21icmUgZGUgR3J1cG86Cit1c2Vycy5wcm9tcHQucGFzc3dvcmQ9Q29udHJhc2XxYToKK3VzZXJzLnByb21wdC5yb2xlbmFtZT1Ob21icmUgZGUgUGFwZWwgYSBEZXNlbXBl8WFyOgordXNlcnMucHJvbXB0LnVzZXJuYW1lPU5vbWJyZSBkZSBVc3VhcmlvOgordXNlcnMucm9sZS5uZXdSb2xlPUNyZWFyIE51ZXZhcyBQcm9waWVkYWRlcyBkZSBQYXBlbCBhIERlc2VtcGXxYXIKK3VzZXJzLnJvbGUub2xkUm9sZT1FZGl0YXIgUHJvcGllZGFkZXMgZGUgUGFwZWwgYSBEZXNlbXBl8WFyIEV4aXN0ZW50ZQordXNlcnMucm9sZS5wcm9wZXJ0aWVzPVByb3BpZWRhZGVzIGRlbCBQYXBlbCBhIERlc2VtcGXxYXIKK3VzZXJzLnRyZWVCdWlsZGVyLmdyb3Vwc05vZGU9R3J1cG9zCit1c2Vycy50cmVlQnVpbGRlci5yb2xlc05vZGU9UGFwZWxlcyBhIERlc2VtcGXxYXIKK3VzZXJzLnRyZWVCdWlsZGVyLnN1YnRyZWVOb2RlPURlZmluaWNp824gZGUgVXN1YXJpbwordXNlcnMudHJlZUJ1aWxkZXIudXNlcnNOb2RlPVVzdWFyaW9zCit1c2Vycy51c2VyLm5ld1VzZXI9Q3JlYXIgTnVldmFzIFByb3BpZWRhZGVzIGRlIFVzdWFyaW8KK3VzZXJzLnVzZXIub2xkVXNlcj1FZGl0YXIgUHJvcGllZGFkZXMgZGUgVXN1YXJpbyBFeGlzdGVudGUKK3VzZXJzLnVzZXIucHJvcGVydGllcz1Qcm9waWVkYWRlcyBkZSBVc3VhcmlvCisjIC0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FwcGxpY2F0aW9uUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQXBwbGljYXRpb25SZXNvdXJjZXNfamEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDI4OWM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FwcGxpY2F0aW9uUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0NDQgQEAKK2FwcGxpY2F0aW9uLnRpdGxlPVRvbWNhdFx1MzBiNVx1MzBmY1x1MzBkMFx1MzBmY1x1N2JhMVx1NzQwNlx1MzBiM1x1MzBmM1x1MzBiZFx1MzBmY1x1MzBlYgorZXJyb3JzLmhlYWRlcj08aDI+PGZvbnRjb2xvcj0icmVkIj5cdTRlMGRcdTZiNjNcdTMwNmFcdTMwYThcdTMwZTlcdTMwZmM8L2ZvbnQ+PC9oMj5cdTViOWZcdTg4NGNcdTMwNTlcdTMwOGJcdTUyNGRcdTMwNmJcdTMwMDFcdTRlMGJcdThhMThcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwOTJcdTRmZWVcdTZiNjNcdTMwNTdcdTMwNjZcdTRlMGJcdTMwNTVcdTMwNDQ6PHVsPgorZXJyb3JzLmZvb3Rlcj08L3VsPjxocj4KK2Vycm9yLmxvZ2luPTxsaT5cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGRcdTMwN2VcdTMwNWZcdTMwNmZcdTMwZDFcdTMwYjlcdTMwZWZcdTMwZmNcdTMwYzlcdTMwNGNcdTkwNTVcdTMwNDRcdTMwN2VcdTMwNTk8L2xpPgorcHJvbXB0LnVzZXJuYW1lPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZAorcHJvbXB0LnBhc3N3b3JkPVx1MzBkMVx1MzBiOVx1MzBlZlx1MzBmY1x1MzBjOQorYnV0dG9uLmxvZ2luPVx1MzBlZFx1MzBiMFx1MzBhNFx1MzBmMworYnV0dG9uLnJlc2V0PVx1MzBlYVx1MzBiYlx1MzBjM1x1MzBjOAorYnV0dG9uLnNhdmU9XHU0ZmRkXHU1YjU4CitidXR0b24uY2hhbmdlPVx1NTkwOVx1NjZmNAorYnV0dG9uLmNhbmNlbD1cdTMwZWFcdTMwYmJcdTMwYzNcdTMwYzgKK2J1dHRvbi5jb21taXQ9XHU1OTA5XHU2NmY0XHUzMDkyXHU1M2NkXHU2NjIwCitidXR0b24ubG9nb3V0PVx1MzBlZFx1MzBiMFx1MzBhMlx1MzBhNlx1MzBjOAorbG9naW4uZW50ZXI9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU5NThiXHU1OWNiXHUzMDU5XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDZiXHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkXHUzMDY4XHUzMGQxXHUzMGI5XHUzMGVmXHUzMGZjXHUzMGM5XHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0Citsb2dpbi5jaGFuZ2VMYW5ndWFnZT1cdThhMDBcdThhOWVcdTMwNmVcdTU5MDlcdTY2ZjQKK2Vycm9yLmxvZ2luPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZFx1MzA3ZVx1MzA1Zlx1MzA2Zlx1MzBkMVx1MzBiOVx1MzBlZlx1MzBmY1x1MzBjOVx1MzA0Y1x1OTA1NVx1MzA0NFx1MzA3ZVx1MzA1OQorZXJyb3IudHJ5YWdhaW49XHUzMDgyXHUzMDQ2XHU0ZTAwXHU1ZWE2XHU1YjlmXHU4ODRjXHUzMDU5XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDZiXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0CitlcnJvci5oZXJlPVx1MzA1M1x1MzA1MworcHJvbXB0LnNvbWVUZXh0PVNvbWUgVGV4dAorcHJvbXB0Lm1vcmVUZXh0PU1vcmUgVGV4dAorc2FtcGxlLnNvbWVUZXh0LnJlcXVpcmVkPTxsaT4iU29tZSBUZXh0Ilx1MzA2Zlx1N2E3YVx1MzA2Ylx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitzYW1wbGUubW9yZVRleHQucmVxdWlyZWQ9PGxpPiJNb3JlIFRleHQiXHUzMDZmXHU3YTdhXHUzMDZiXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK3NhdmUuc3VjY2Vzcz1cdTRmZGRcdTViNThcdTYyMTBcdTUyOWYhCitzYXZlLmZhaWw9XHU0ZmRkXHU1YjU4XHU1OTMxXHU2NTU3IQorc2VydmVyLnBvcnRudW1iZXI9XHUzMGRkXHUzMGZjXHUzMGM4XHU3NTZhXHU1M2Y3CitzZXJ2ZXIuZGVidWdsZXZlbD1cdTMwYzdcdTMwZDBcdTMwYzNcdTMwYjBcdTMwZWNcdTMwZDlcdTMwZWIKK3NlcnZlci5zaHV0ZG93bj1cdTMwYjdcdTMwZTNcdTMwYzNcdTMwYzhcdTMwYzBcdTMwYTZcdTMwZjMKK3NlcnZlci5wcm9wZXJ0aWVzPVx1MzBiNVx1MzBmY1x1MzBkMFx1MzBmY1x1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhMword2FybmluZy5oZWFkZXI9PGNlbnRlcj48aDQ+PGZvbnRjb2xvcj0icmVkIj5cdThiNjZcdTU0NGEhPC9mb250PjwvaDQ+PC9jZW50ZXI+PHVsPgorc2VydmVyLnBvcnQud2FybmluZz08bGk+MTAyNFx1NzU2YVx1NGVlNVx1NGUwYlx1MzA2ZVx1MzBkZFx1MzBmY1x1MzBjOFx1NzU2YVx1NTNmN1x1MzA2ZVx1NTIyOVx1NzUyOFx1MzA2Ylx1MzA2Zlx1MzAwMVx1NzI3OVx1NTIyNVx1MzA2YVx1MzBiZFx1MzBkNVx1MzBjOFx1MzBhNlx1MzBhN1x1MzBhMlx1NmEyOVx1OTY1MFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OVx1MzAwMgorZXJyb3IucG9ydE51bWJlci5yZXF1aXJlZD08bGk+XHUzMGRkXHUzMGZjXHUzMGM4XHU3NTZhXHU1M2Y3XHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLnBvcnROdW1iZXIuZm9ybWF0PTxsaT5cdTMwZGRcdTMwZmNcdTMwYzhcdTc1NmFcdTUzZjdcdTMwNGNcdTU5YTVcdTVmNTNcdTMwNmFcdTY1NzRcdTY1NzBcdTMwNjdcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgorZXJyb3IucG9ydE51bWJlci5yYW5nZT08bGk+XHUzMGRkXHUzMGZjXHUzMGM4XHU3NTZhXHU1M2Y3XHUzMDRjXHU3YmM0XHU1NmYyXHU1OTE2XHUzMDY3XHUzMDU5XHUzMDAyXHU3YmM0XHU1NmYyXHUzMDZmMS02NTUzNVx1MzA2N1x1MzA1OVx1MzAwMjwvbGk+CitlcnJvci5zaHV0ZG93blRleHQubGVuZ3RoPTxsaT5cdTMwYjdcdTMwZTNcdTMwYzNcdTMwYzhcdTMwYzBcdTMwYTZcdTMwZjNcdTMwNmVcdTMwZDFcdTMwYjlcdTMwZWZcdTMwZmNcdTMwYzlcdTMwNmY2XHU1YjU3XHU0ZWU1XHU0ZTBhXHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLmVuZ2luZU5hbWUucmVxdWlyZWQ9PGxpPlx1MzBhOFx1MzBmM1x1MzBiOFx1MzBmM1x1NTQwZFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5hY2NlcHRDb3VudFRleHQucmVxdWlyZWQ9PGxpPlx1NTQwY1x1NjY0Mlx1NjNhNVx1N2Q5YVx1NjU3MFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OTwvbGk+CitlcnJvci5hY2NlcHRDb3VudFRleHQuZm9ybWF0PTxsaT5cdTU0MGNcdTY2NDJcdTYzYTVcdTdkOWFcdTY1NzBcdTMwNGNcdTU5YTVcdTVmNTNcdTMwNmFcdTY1NzRcdTY1NzBcdTMwNjdcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgorZXJyb3IuYWNjZXB0Q291bnRUZXh0LnJhbmdlPTxsaT5cdTU0MGNcdTY2NDJcdTYzYTVcdTdkOWFcdTY1NzBcdTMwNGNcdTdiYzRcdTU2ZjJcdTU5MTZcdTMwNjdcdTMwNTkuIFx1N2JjNFx1NTZmMlx1MzA2ZjAtMTI4XHUzMDY3XHUzMDU5XHUzMDAyPC9saT4KK2Vycm9yLmNvbm5UaW1lT3V0VGV4dC5yZXF1aXJlZD08bGk+XHU2M2E1XHU3ZDlhXHUzMGJmXHUzMGE0XHUzMGUwXHUzMGEyXHUzMGE2XHUzMGM4XHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5PC9saT4KK2Vycm9yLmNvbm5UaW1lT3V0VGV4dC5mb3JtYXQ9PGxpPlx1NjNhNVx1N2Q5YVx1MzBiZlx1MzBhNFx1MzBlMFx1MzBhMlx1MzBhNlx1MzBjOFx1MzA0Y1x1NTlhNVx1NWY1M1x1MzA2YVx1NjU3NFx1NjU3MFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5jb25uVGltZU91dFRleHQucmFuZ2U9PGxpPlx1NjNhNVx1N2Q5YVx1MzBiZlx1MzBhNFx1MzBlMFx1MzBhMlx1MzBhNlx1MzBjOFx1MzA0Y1x1N2JjNFx1NTZmMlx1NTkxNlx1MzA2N1x1MzA1OVx1MzAwMlx1N2JjNFx1NTZmMlx1MzA2ZjAtNjAwMDBcdTMwNjdcdTMwNTlcdTMwMDI8L2xpPgorZXJyb3IuYnVmZmVyU2l6ZVRleHQucmVxdWlyZWQ9PGxpPlx1MzBkMFx1MzBjM1x1MzBkNVx1MzBhMVx1MzBiNVx1MzBhNFx1MzBiYVx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OTwvbGk+CitlcnJvci5idWZmZXJTaXplVGV4dC5mb3JtYXQ9PGxpPlx1MzBkMFx1MzBjM1x1MzBkNVx1MzBhMVx1MzBiNVx1MzBhNFx1MzBiYVx1MzA0Y1x1NTlhNVx1NWY1M1x1MzA2YVx1NjU3NFx1NjU3MFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5idWZmZXJTaXplVGV4dC5yYW5nZT08bGk+XHUzMGQwXHUzMGMzXHUzMGQ1XHUzMGExXHUzMGI1XHUzMGE0XHUzMGJhXHUzMDRjXHU3YmM0XHU1NmYyXHU1OTE2XHUzMDY3XHUzMDU5XHUzMDAyXHU3YmM0XHU1NmYyXHUzMDZmMS04MTkyXHUzMDY3XHUzMDU5XHUzMDAyPC9saT4KK2Vycm9yLmFkZHJlc3MuaW52YWxpZD08bGk+SVBcdTMwYTJcdTMwYzlcdTMwZWNcdTMwYjlcdTMwNGNcdTRlMGRcdTZiNjNcdTMwNjdcdTMwNTk8L2xpPgorZXJyb3IucmVkaXJlY3RQb3J0VGV4dC5yZXF1aXJlZD08bGk+XHUzMGVhXHUzMGMwXHUzMGE0XHUzMGVjXHUzMGFmXHUzMGM4XHUzMGRkXHUzMGZjXHUzMGM4XHU3NTZhXHU1M2Y3XHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLnJlZGlyZWN0UG9ydFRleHQuZm9ybWF0PTxsaT5cdTMwZWFcdTMwYzBcdTMwYTRcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZGRcdTMwZmNcdTMwYzhcdTc1NmFcdTUzZjdcdTMwNGNcdTU5YTVcdTVmNTNcdTMwNmFcdTY1NzRcdTY1NzBcdTMwNjdcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgorZXJyb3IucmVkaXJlY3RQb3J0VGV4dC5yYW5nZT08bGk+XHUzMGVhXHUzMGMwXHUzMGE0XHUzMGVjXHUzMGFmXHUzMGM4XHUzMGRkXHUzMGZjXHUzMGM4XHU3NTZhXHU1M2Y3XHUzMDRjXHU3YmM0XHU1NmYyXHU1OTE2XHUzMDY3XHUzMDU5XHUzMDAyXHU3YmM0XHU1NmYyXHUzMDZmMS02NTUzNVx1MzA2N1x1MzA1OVx1MzAwMjwvbGk+CitlcnJvci5taW5Qcm9jZXNzb3JzVGV4dC5yZXF1aXJlZD08bGk+XHU2NzAwXHU1YzBmXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU2NTcwXHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLm1pblByb2Nlc3NvcnNUZXh0LmZvcm1hdD08bGk+XHU2NzAwXHU1YzBmXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU2NTcwXHUzMDRjXHU1OWE1XHU1ZjUzXHUzMDZhXHU2NTc0XHU2NTcwXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLm1pblByb2Nlc3NvcnNUZXh0LnJhbmdlPTxsaT5cdTY3MDBcdTVjMGZcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTY1NzBcdTMwNGNcdTdiYzRcdTU2ZjJcdTU5MTZcdTMwNjdcdTMwNTlcdTMwMDJcdTdiYzRcdTU2ZjJcdTMwNmYxLTUxMlx1MzA2N1x1MzA1OVx1MzAwMjwvbGk+CitlcnJvci5tYXhQcm9jZXNzb3JzVGV4dC5yZXF1aXJlZD08bGk+XHU2NzAwXHU1OTI3XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU2NTcwXHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLm1heFByb2Nlc3NvcnNUZXh0LmZvcm1hdD08bGk+XHU2NzAwXHU1OTI3XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU2NTcwXHUzMDRjXHU1OWE1XHU1ZjUzXHUzMDZhXHU2NTc0XHU2NTcwXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLm1heFByb2Nlc3NvcnNUZXh0LnJhbmdlPTxsaT5cdTY3MDBcdTU5MjdcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTY1NzBcdTMwNGNcdTdiYzRcdTU2ZjJcdTU5MTZcdTMwNjdcdTMwNTlcdTMwMDJcdTdiYzRcdTU2ZjJcdTMwNmYxLTUxMlx1MzA2N1x1MzA1OS4gXHUzMDdlXHUzMDVmXHUzMDAxXHU2NzAwXHU1OTI3XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU2NTcwID49IFx1NjcwMFx1NWMwZlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1NjU3MFx1MzAwMVx1MzA2N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA2YVx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci5wcm94eU5hbWUuaW52YWxpZD08bGk+XHUzMGQ3XHUzMGVkXHUzMGFkXHUzMGI3XHU1NDBkXHUzMDRjXHU0ZTBkXHU2YjYzXHUzMDY3XHUzMDU5PC9saT4KK2Vycm9yLnByb3h5UG9ydFRleHQucmVxdWlyZWQ9PGxpPlx1MzBkN1x1MzBlZFx1MzBhZFx1MzBiN1x1MzBkZFx1MzBmY1x1MzBjOFx1NzU2YVx1NTNmN1x1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5wcm94eVBvcnRUZXh0LmZvcm1hdD08bGk+XHUzMGQ3XHUzMGVkXHUzMGFkXHUzMGI3XHUzMGRkXHUzMGZjXHUzMGM4XHU3NTZhXHU1M2Y3XHUzMDRjXHU1OWE1XHU1ZjUzXHUzMDZhXHU2NTc0XHU2NTcwXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLnByb3h5UG9ydFRleHQucmFuZ2U9PGxpPlx1MzBkN1x1MzBlZFx1MzBhZFx1MzBiN1x1MzBkZFx1MzBmY1x1MzBjOFx1NzU2YVx1NTNmN1x1MzA0Y1x1N2JjNFx1NTZmMlx1NTkxNlx1MzA2N1x1MzA1OVx1MzAwMlx1N2JjNFx1NTZmMlx1MzA2ZjEtNjU1MzVcdTMwNjdcdTMwNTlcdTMwMDI8L2xpPgorZXJyb3IuaG9zdE5hbWUuYmFkPVx1MzBkYlx1MzBiOVx1MzBjOFx1NTQwZCB7MH0gXHUzMDRjXHU0ZTBkXHU2YjYzXHUzMDY3XHUzMDU5CitlcnJvci5ob3N0TmFtZS5yZXF1aXJlZD08bGk+XHUzMGRiXHUzMGI5XHUzMGM4XHU1NDBkXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLmhvc3ROYW1lLmV4aXN0cz08bGk+XHU1NDBjXHU1NDBkXHUzMDZlXHUzMGRiXHUzMGI5XHUzMGM4XHU1NDBkXHUzMDRjXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5PC9saT4KK2Vycm9yLmFwcEJhc2UucmVxdWlyZWQ9PGxpPlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBkOVx1MzBmY1x1MzBiOVx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitzZXJ2aWNlLm5hbWU9XHU1NDBkXHU1MjRkCitzZXJ2aWNlLmVuZ2luZS5wcm9wcz1cdTMwYThcdTMwZjNcdTMwYjhcdTMwZjNcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK3NlcnZpY2UuZGVmYXVsdGhvc3RuYW1lPVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzBkYlx1MzBiOVx1MzBjOFx1NTQwZAorc2VydmljZS5wcm9wZXJ0aWVzPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhMworc2VydmljZS5wcm9wZXJ0eT1cdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK3NlcnZpY2UudmFsdWU9XHU1MDI0CitzZXJ2aWNlLmNyZWF0ZS5uZXc9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDZlXHU0ZjVjXHU2MjEwCithY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zPVx1NTIyOVx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2YVx1MzBhMlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmMworYWN0aW9ucy5zZXJ2aWNlcy5jcmVhdGU9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDZlXHU0ZjVjXHU2MjEwCithY3Rpb25zLnNlcnZpY2VzLmRlbGV0ZT1cdTczZmVcdTU3MjhcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwOTJcdTUyNGFcdTk2NjQKK2FjdGlvbnMuc2VydmljZXMuZGVsZXRlcz1cdTY1ZTJcdTViNThcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmVcdTUyNGFcdTk2NjQKK2FjdGlvbnMuc2VydmljZXMuZWRpdD1cdTY1ZTJcdTViNThcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmVcdTdkZThcdTk2YzYKK2FjdGlvbnMuYWNjZXNzbG9nZ2VyLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjlMb2dnZXJcdTMwNmVcdTRmNWNcdTYyMTAKK2FjdGlvbnMuYWNjZXNzbG9nZ2VyLmRlbGV0ZT1cdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjlMb2dnZXJcdTMwNmVcdTUyNGFcdTk2NjQKK2FjdGlvbnMuY29ubmVjdG9ycy5jcmVhdGU9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGIzXHUzMGNkXHUzMGFmXHUzMGJmXHUzMDZlXHU0ZjVjXHU2MjEwCithY3Rpb25zLmNvbm5lY3RvcnMuZGVsZXRlPVx1NzNmZVx1NTcyOFx1MzA2ZVx1MzBiM1x1MzBjZFx1MzBhZlx1MzBiZlx1MzA5Mlx1NTI0YVx1OTY2NAorYWN0aW9ucy5jb25uZWN0b3JzLmRlbGV0ZXM9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGIzXHUzMGNkXHUzMGFmXHUzMGJmXHUzMDZlXHU1MjRhXHU5NjY0CithY3Rpb25zLmNvbm5lY3RvcnMuZWRpdD1cdTY1ZTJcdTViNThcdTMwNmVcdTMwYjNcdTMwY2RcdTMwYWZcdTMwYmZcdTMwNmVcdTdkZThcdTk2YzYKK2FjdGlvbnMuY29udGV4dHMuY3JlYXRlPVx1NjViMFx1MzA1N1x1MzA0NFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2ZVx1NGY1Y1x1NjIxMAorYWN0aW9ucy5jb250ZXh0cy5kZWxldGU9XHU3M2ZlXHU1NzI4XHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDkyXHU1MjRhXHU5NjY0CithY3Rpb25zLmNvbnRleHRzLmRlbGV0ZXM9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU1MjRhXHU5NjY0CithY3Rpb25zLmNvbnRleHRzLmVkaXQ9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU3ZGU4XHU5NmM2CithY3Rpb25zLmRlZmF1bHRjb250ZXh0cy5jcmVhdGU9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU0ZjVjXHU2MjEwCithY3Rpb25zLmRlZmF1bHRjb250ZXh0cy5kZWxldGU9XHU3M2ZlXHU1NzI4XHUzMDZlXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDkyXHU1MjRhXHU5NjY0CithY3Rpb25zLmRlZmF1bHRjb250ZXh0cy5kZWxldGVzPVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2ZVx1NTI0YVx1OTY2NAorYWN0aW9ucy5kZWZhdWx0Y29udGV4dHMuZWRpdD1cdTY1ZTJcdTViNThcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNmVcdTdkZThcdTk2YzYKK2FjdGlvbnMuZ3JvdXAuY3JlYXRlPVx1NjViMFx1MzA1N1x1MzA0NFx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2ZVx1NGY1Y1x1NjIxMAorYWN0aW9ucy5ncm91cC5kZWxldGU9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZlXHU1MjRhXHU5NjY0CithY3Rpb25zLmhvc3RzLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZGJcdTMwYjlcdTMwYzhcdTMwNmVcdTRmNWNcdTYyMTAKK2FjdGlvbnMuaG9zdHMuZGVsZXRlPVx1NzNmZVx1NTcyOFx1MzA2ZVx1MzBkYlx1MzBiOVx1MzBjOFx1MzA5Mlx1NTI0YVx1OTY2NAorYWN0aW9ucy5ob3N0cy5kZWxldGVzPVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBkYlx1MzBiOVx1MzBjOFx1MzA2ZVx1NTI0YVx1OTY2NAorYWN0aW9ucy5ob3N0cy5lZGl0PVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBkYlx1MzBiOVx1MzBjOFx1MzA2ZVx1N2RlOFx1OTZjNgorYWN0aW9ucy5sb2dnZXJzLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRMb2dnZXJcdTMwNmVcdTRmNWNcdTYyMTAKK2FjdGlvbnMubG9nZ2Vycy5kZWxldGU9XHU3M2ZlXHU1NzI4XHUzMDZlTG9nZ2VyXHUzMDkyXHU1MjRhXHU5NjY0CithY3Rpb25zLmxvZ2dlcnMuZGVsZXRlcz1cdTY1ZTJcdTViNThcdTMwNmVMb2dnZXJzXHUzMDZlXHU1MjRhXHU5NjY0CithY3Rpb25zLmxvZ2dlcnMuZWRpdD1cdTY1ZTJcdTViNThcdTMwNmVMb2dnZXJcdTMwNmVcdTdkZThcdTk2YzYKK2FjdGlvbnMucmVhbG1zLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZTZcdTMwZmNcdTMwYjZcdTMwZWNcdTMwZWJcdTMwZTBcdTMwNmVcdTRmNWNcdTYyMTAKK2FjdGlvbnMucmVhbG1zLmRlbGV0ZT1cdTczZmVcdTU3MjhcdTMwNmVcdTMwZTZcdTMwZmNcdTMwYjZcdTMwZWNcdTMwZWJcdTMwZTBcdTMwNmVcdTUyNGFcdTk2NjQKK2FjdGlvbnMucmVhbG1zLmRlbGV0ZXM9XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGVjXHUzMGViXHUzMGUwXHUzMDZlXHU1MjRhXHU5NjY0CithY3Rpb25zLnJlYWxtcy5lZGl0PVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlY1x1MzBlYlx1MzBlMFx1MzA2ZVx1N2RlOFx1OTZjNgorYWN0aW9ucy5yZXF1ZXN0ZmlsdGVyLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwZDVcdTMwYTNcdTMwZWJcdTMwYmZcdTMwNmVcdTRmNWNcdTYyMTAKK2FjdGlvbnMucmVxdWVzdGZpbHRlci5kZWxldGU9XHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMGQ1XHUzMGEzXHUzMGViXHUzMGJmXHUzMDZlXHU1MjRhXHU5NjY0CithY3Rpb25zLnVzZXIuY3JlYXRlPVx1NjViMFx1MzA1N1x1MzA0NFx1MzBlNlx1MzBmY1x1MzBiNlx1MzA2ZVx1NGY1Y1x1NjIxMAorYWN0aW9ucy51c2VyLmRlbGV0ZT1cdTY1ZTJcdTViNThcdTMwNmVcdTMwZTZcdTMwZmNcdTMwYjZcdTMwNmVcdTUyNGFcdTk2NjQKK2FjdGlvbnMudmFsdmVzLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZDBcdTMwZWJcdTMwZDZcdTMwNmVcdTRmNWNcdTYyMTAKK2FjdGlvbnMudmFsdmVzLmVkaXQ9XHUzMGQwXHUzMGViXHUzMGQ2XHUzMDZlXHU3ZGU4XHU5NmM2CithY3Rpb25zLnZhbHZlcy5kZWxldGU9XHU3M2ZlXHU1NzI4XHUzMDZlXHUzMGQwXHUzMGViXHUzMGQ2XHUzMDkyXHU1MjRhXHU5NjY0CithY3Rpb25zLnZhbHZlcy5kZWxldGVzPVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBkMFx1MzBlYlx1MzBkNlx1MzA2ZVx1NTI0YVx1OTY2NAorYWN0aW9ucy5hbGlhcy5jcmVhdGU9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGE4XHUzMGE0XHUzMGVhXHUzMGEyXHUzMGI5XHUzMDZlXHU0ZjVjXHU2MjEwCithY3Rpb25zLmFsaWFzLmRlbGV0ZT1cdTMwYThcdTMwYTRcdTMwZWFcdTMwYTJcdTMwYjlcdTMwNmVcdTUyNGFcdTk2NjQKK25ldy5hbGlhcz1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwYThcdTMwYTRcdTMwZWFcdTMwYTJcdTMwYjkKK2Nvbm5lY3Rvci50eXBlPVx1N2EyZVx1OTg1ZQorY29ubmVjdG9yLnNjaGVtZT1cdTMwYjlcdTMwYWRcdTMwZmNcdTMwZTAKK2Nvbm5lY3Rvci5hY2NlcHQuY291bnQ9XHU1NDBjXHU2NjQyXHU2M2E1XHU3ZDlhXHU2NTcwCitjb25uZWN0b3IuY29tcHJlc3Npb249XHU1NzI3XHU3ZTJlCitjb25uZWN0b3IuY29ubmVjdGlvbi5saW5nZXI9XHU2M2E1XHU3ZDlhXHUzMDZlXHU2YjhiXHU1YjU4W2xpbmdlcl0KK2Nvbm5lY3Rvci5jb25uZWN0aW9uLnRpbWVvdXQ9XHU2M2E1XHU3ZDlhXHUzMGJmXHUzMGE0XHUzMGUwXHUzMGEyXHUzMGE2XHUzMGM4Citjb25uZWN0b3IuY29ubmVjdGlvbi51cGxvYWRUaW1lb3V0PVx1MzBhMlx1MzBjM1x1MzBkN1x1MzBlZFx1MzBmY1x1MzBjOVx1MzBiZlx1MzBhNFx1MzBlMFx1MzBhMlx1MzBhNlx1MzBjOAorY29ubmVjdG9yLmRlZmF1bHQuYnVmZmVyPVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzBkMFx1MzBjM1x1MzBkNVx1MzBhMVx1MzBiNVx1MzBhNFx1MzBiYQorY29ubmVjdG9yLmNvbm5lY3Rpb24uZGlzYWJsZVVwbG9hZFRpbWVvdXQ9XHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGVkXHUzMGZjXHUzMGM5XHUzMGJmXHUzMGE0XHUzMGUwXHUzMGEyXHUzMGE2XHUzMGM4XHUzMDZlXHU3MTIxXHU1MmI5XHU1MzE2Citjb25uZWN0b3IuZW5hYmxlLmRucz1ETlNcdTMwNmVcdTMwZWJcdTMwYzNcdTMwYWZcdTMwYTJcdTMwYzNcdTMwZDcKK2Nvbm5lY3Rvci51cmllbmNvZGluZz1VUkkgXHUzMGE4XHUzMGYzXHUzMGIzXHUzMGZjXHUzMGM3XHUzMGEzXHUzMGYzXHUzMGIwCitjb25uZWN0b3IudXNlQm9keUVuY29kaW5nRm9yVVJJPVVSSVx1MzBhZlx1MzBhOFx1MzBlYVx1MzBkMVx1MzBlOVx1MzBlMVx1MzBmY1x1MzBiZlx1MzA2Ylx1MzBkY1x1MzBjN1x1MzBhM1x1MzA2ZVx1MzBhOFx1MzBmM1x1MzBiM1x1MzBmY1x1MzBjN1x1MzBhM1x1MzBmM1x1MzBiMFx1MzA5Mlx1NGY3Zlx1NzUyOAorY29ubmVjdG9yLmFsbG93VHJhY2U9VFJBQ0VcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwOTJcdThhMzFcdTUzZWYKK2Nvbm5lY3Rvci5hZGRyZXNzLmlwPUlQXHUzMGEyXHUzMGM5XHUzMGVjXHUzMGI5Citjb25uZWN0b3IucmVkaXJlY3QucG9ydG51bWJlcj1cdTMwZWFcdTMwYzBcdTMwYTRcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZGRcdTMwZmNcdTMwYzhcdTc1NmFcdTUzZjcKK2Nvbm5lY3Rvci5taW49XHU2NzAwXHU1YzBmCitjb25uZWN0b3IubWlsbGlzZWNvbmRzPVx1MzBkZlx1MzBlYVx1NzlkMgorY29ubmVjdG9yLm1heD1cdTY3MDBcdTU5MjcKK2Nvbm5lY3Rvci5tYXhrZWVwYWxpdmU9XHUzMGFkXHUzMGZjXHUzMGQ3XHUzMGEyXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHU2NzAwXHU1OTI3XHU2NTcwCitjb25uZWN0b3IubWF4c3BhcmU9XHU0ZTg4XHU1MDk5XHUzMGI5XHUzMGVjXHUzMGMzXHUzMGM5XHU2NzAwXHU1OTI3XHU2NTcwCitjb25uZWN0b3IubWF4dGhyZWFkcz1cdTMwYjlcdTMwZWNcdTMwYzNcdTMwYzlcdTY3MDBcdTU5MjdcdTY1NzAKK2Nvbm5lY3Rvci5taW5zcGFyZT1cdTRlODhcdTUwOTlcdTMwYjlcdTMwZWNcdTMwYzNcdTMwYzlcdTY3MDBcdTVjMGZcdTY1NzAKK2Nvbm5lY3Rvci50aHJlYWRwcmlvcml0eT1Qcm9jZXNzb3IgVGhyZWFkIFByaW9yaXR5Citjb25uZWN0b3IucHJveHkubmFtZT1cdTMwZDdcdTMwZWRcdTMwYWRcdTMwYjdcdTU0MGQKK2Nvbm5lY3Rvci5wcm94eS5wb3J0bnVtYmVyPVx1MzBkN1x1MzBlZFx1MzBhZFx1MzBiN1x1MzBkZFx1MzBmY1x1MzBjOFx1NzU2YVx1NTNmNworY29ubmVjdG9yLmFsZ29yaXRobT1cdTMwYTJcdTMwZWJcdTMwYjRcdTMwZWFcdTMwYmFcdTMwZTAKK2Nvbm5lY3Rvci5jaXBoZXJzPVx1NjY5N1x1NTNmN1x1NTMxNlx1NjViOVx1NWYwZgorY29ubmVjdG9yLmNsaWVudC5hdXRoPVx1MzBhZlx1MzBlOVx1MzBhNFx1MzBhMlx1MzBmM1x1MzBjOFx1OGE4ZFx1OGEzYworY29ubmVjdG9yLmtleXN0b3JlLmZpbGVuYW1lPVx1MzBhZFx1MzBmY1x1MzBiOVx1MzBjOFx1MzBhMlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1NTQwZAorY29ubmVjdG9yLmtleXN0b3JlLnBhc3N3b3JkPVx1MzBhZFx1MzBmY1x1MzBiOVx1MzBjOFx1MzBhMlx1MzBkMVx1MzBiOVx1MzBlZlx1MzBmY1x1MzBjOQorY29ubmVjdG9yLmtleXN0b3JlLnR5cGU9XHUzMGFkXHUzMGZjXHUzMGI5XHUzMGM4XHUzMGEyXHUzMDZlXHU3YTJlXHU5ODVlCitjb25uZWN0b3Iuc3NsUHJvdG9jb2w9U1NMXHUzMGQ3XHUzMGVkXHUzMGM4XHUzMGIzXHUzMGViCitjb25uZWN0b3Iua2V5UGFzcy53YXJuaW5nPTxsaT5rZXl0b29sXHUzMDkyXHU0ZjdmXHUzMDYzXHUzMDY2XHU4YTNjXHU2NjBlXHU2NmY4XHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDU3XHUzMDY2XHU0ZTBiXHUzMDU1XHUzMDQ0XHUzMDAyPC9saT4KK2Nvbm5lY3Rvci5zZWN1cmU9U1NMXHU5MDFhXHU0ZmUxCitjb25uZWN0b3IudGNwTm9EZWxheT1UQ1BcdTkwNDVcdTVlZjZcdTcxMjFcdTMwNTcKK2Nvbm5lY3Rvci54cG93ZXJlZGJ5PVggUG93ZXJlZCBCeSBcdTMwZDhcdTMwYzNcdTMwYzAKK2hvc3QucHJvcGVydGllcz1cdTMwZGJcdTMwYjlcdTMwYzhcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK2hvc3QubmFtZT1cdTU0MGRcdTUyNGQKK2hvc3QuYmFzZT1cdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwZDlcdTMwZmNcdTMwYjkKK2hvc3QuYXV0b0RlcGxveT1cdTgxZWFcdTUyZDVcdTkxNGRcdTUwOTkKK2hvc3QuZGVwbG95WE1MPVx1OTE0ZFx1NTA5OVhNTAoraG9zdC5kZXBsb3lPblN0YXJ0dXA9XHU4ZDc3XHU1MmQ1XHU2NjQyXHUzMDZlXHU5MTRkXHU1MDk5Citob3N0LndhcnM9V0FSXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHU1YzU1XHU5NThiXHUzMDU5XHUzMDhiCitob3N0LmFsaWFzZXM9XHUzMGE4XHUzMGE0XHUzMGVhXHUzMGEyXHUzMGI5Citob3N0LmFsaWFzLm5hbWU9XHUzMGE4XHUzMGE0XHUzMGVhXHUzMGEyXHUzMGI5XHU1NDBkCitob3N0LnhtbE5hbWVzcGFjZUF3YXJlPVhNTFx1NTQwZFx1NTI0ZFx1N2E3YVx1OTU5M1x1NWJmZVx1NWZkYworaG9zdC54bWxWYWxpZGF0aW9uPVhNTFx1NjkxY1x1OGEzYworZXJyb3IuYWxpYXNOYW1lLmV4aXN0cz08bGk+XHU1NDBjXHU1NDBkXHUzMDZlXHUzMGE4XHUzMGE0XHUzMGVhXHUzMGEyXHUzMGI5XHUzMDRjXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5PC9saT4KK2Vycm9yLmFsaWFzTmFtZS5yZXF1aXJlZD08bGk+XHUzMGE4XHUzMGE0XHUzMGVhXHUzMGEyXHUzMGI5XHU1NDBkXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2NvbnRleHQucHJvcGVydGllcz1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK2NvbnRleHQuY29va2llcz1cdTMwYWZcdTMwYzNcdTMwYWRcdTMwZmMKK2NvbnRleHQuY3Jvc3MuY29udGV4dD1cdTMwYWZcdTMwZWRcdTMwYjlcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzgKK2NvbnRleHQuZG9jQmFzZT1cdTMwYzlcdTMwYWRcdTMwZTVcdTMwZTFcdTMwZjNcdTMwYzhcdTMwZDlcdTMwZmNcdTMwYjkKK2NvbnRleHQub3ZlcnJpZGU9XHU0ZTBhXHU2NmY4XHUzMDRkCitjb250ZXh0LnBhdGg9XHUzMGQxXHUzMGI5Citjb250ZXh0LnJlbG9hZGFibGU9XHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHU1M2VmXHU4MGZkCitjb250ZXh0LnN3YWxsb3dPdXRwdXQ9XHU2YTE5XHU2ZTk2XHU1MWZhXHU1MjliXHUzMGZiXHU2YTE5XHU2ZTk2XHUzMGE4XHUzMGU5XHUzMGZjXHU1MWZhXHU1MjliXHUzMDkyXHUzMGVkXHUzMGIwXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZiXHU1MWZhXHU1MjliCitjb250ZXh0LnVzZW5hbWluZz1cdTMwY2RcdTMwZmNcdTMwZTBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmVcdTUyMjlcdTc1MjgKK2NvbnRleHQud29ya2Rpcj1cdTMwZWZcdTMwZmNcdTMwYWRcdTMwZjNcdTMwYjBcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWEKK2NvbnRleHQubG9hZGVyLnByb3BlcnRpZXM9XHUzMGVkXHUzMGZjXHUzMGMwXHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzCitjb250ZXh0LnNlc3Npb25tZ3IucHJvcGVydGllcz1cdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwZGVcdTMwY2RcdTMwZmNcdTMwYjhcdTMwZTNcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK2NvbnRleHQuY2hlY2tJbnRlcnZhbD1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk1OTNcdTk2OTQKK2NvbnRleHQuc2Vzc2lvbklkPVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM0lEXHUzMGE0XHUzMGNiXHUzMGI3XHUzMGUzXHUzMGU5XHUzMGE0XHUzMGI2Citjb250ZXh0Lm1heC5zZXNzaW9ucz1cdTY3MDBcdTU5MjdcdTY3MDlcdTUyYjlcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTY1NzAKK2RlZmF1bHRjb250ZXh0LnByb3BlcnRpZXM9XHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzCitlcnJvci5jb250ZXh0LmRpcmVjdG9yeT1cdTMwYzlcdTMwYWRcdTMwZTVcdTMwZTFcdTMwZjNcdTMwYzhcdTMwZDlcdTMwZmNcdTMwYjlcdTMwNGNcdTViNThcdTU3MjhcdTMwNTdcdTMwNmFcdTMwNDRcdWZmMGNcdTUzYzhcdTMwNmZcdThhYWRcdTMwODFcdTMwNmFcdTMwNDRcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwNjdcdTMwNTkKK2Vycm9yLmRvY0Jhc2UucmVxdWlyZWQ9PGxpPlx1MzBjOVx1MzBhZFx1MzBlNVx1MzBlMVx1MzBmM1x1MzBjOFx1MzBkOVx1MzBmY1x1MzBiOVx1MzA2Zm51bGxcdTMwNmJcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgorZXJyb3IucGF0aC5yZXF1aXJlZD08bGk+XHUzMGQxXHUzMGI5XHUzMDZmbnVsbFx1MzA2Ylx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci53b3JrRGlyLnJlcXVpcmVkPTxsaT5cdTMwZWZcdTMwZmNcdTMwYWRcdTMwZjNcdTMwYjBcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwNmZudWxsXHUzMDZiXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLmxkckNoZWNrSW50ZXJ2YWwucmVxdWlyZWQ9PGxpPlx1MzBlZFx1MzBmY1x1MzBjMFx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1OTU5M1x1OTY5NFx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5sZHJDaGVja0ludGVydmFsLmZvcm1hdD08bGk+XHUzMGVkXHUzMGZjXHUzMGMwXHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHU5NTkzXHU5Njk0XHUzMDRjXHU1OWE1XHU1ZjUzXHUzMDZhXHU2NTc0XHU2NTcwXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLmxkckNoZWNrSW50ZXJ2YWwucmFuZ2U9PGxpPlx1MzBlZFx1MzBmY1x1MzBjMFx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1OTU5M1x1OTY5NFx1MzA0Y1x1N2JjNFx1NTZmMlx1NTkxNlx1MzA2N1x1MzA1OVx1MzAwMlx1N2JjNFx1NTZmMlx1MzA2ZjEtMTAwMFx1MzA2N1x1MzA1OVx1MzAwMjwvbGk+CitlcnJvci5tZ3JDaGVja0ludGVydmFsLnJlcXVpcmVkPTxsaT5cdTMwZGVcdTMwY2RcdTMwZmNcdTMwYjhcdTMwZTNcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk1OTNcdTk2OTRcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgorZXJyb3IubWdyQ2hlY2tJbnRlcnZhbC5mb3JtYXQ9PGxpPlx1MzBkZVx1MzBjZFx1MzBmY1x1MzBiOFx1MzBlM1x1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1OTU5M1x1OTY5NFx1MzA0Y1x1NTlhNVx1NWY1M1x1MzA2YVx1NjU3NFx1NjU3MFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5tZ3JDaGVja0ludGVydmFsLnJhbmdlPTxsaT5cdTMwZGVcdTMwY2RcdTMwZmNcdTMwYjhcdTMwZTNcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk1OTNcdTk2OTRcdTMwNGNcdTdiYzRcdTU2ZjJcdTU5MTZcdTMwNjdcdTMwNTlcdTMwMDJcdTdiYzRcdTU2ZjJcdTMwNmYxLTEwMDBcdTMwNjdcdTMwNTlcdTMwMDI8L2xpPgorZXJyb3IubWdyU2Vzc2lvbklESW5pdC5yZXF1aXJlZD08bGk+XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGRlXHUzMGNkXHUzMGZjXHUzMGI4XHUzMGUzXHU1MjFkXHU2NzFmXHU1MzE2SURcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgorZXJyb3IubWdyTWF4U2Vzc2lvbnMucmVxdWlyZWQ9PGxpPlx1NjcwMFx1NTkyN1x1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1NjU3MFx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5tZ3JNYXhTZXNzaW9ucy5mb3JtYXQ9PGxpPlx1NjcwMFx1NTkyN1x1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1NjU3MFx1MzA0Y1x1NTlhNVx1NWY1M1x1MzA2YVx1NjU3NFx1NjU3MFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5tZ3JNYXhTZXNzaW9ucy5yYW5nZT08bGk+XHU2NzAwXHU1OTI3XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHU2NTcwXHUzMDRjXHU3YmM0XHU1NmYyXHU1OTE2XHUzMDY3XHUzMDU5XHUzMDAyXHU3YmM0XHU1NmYyXHUzMDZmLTFcdTMwNGJcdTMwODkxMDBcdTMwNjdcdTMwNTlcdTMwMDI8L2xpPgorbGlzdC5ub25lPShOb25lKQorbG9nZ2VyLmRpcmVjdG9yeT1cdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWEKK2xvZ2dlci5wcmVmaXg9XHUzMGQ3XHUzMGVhXHUzMGQ1XHUzMGEzXHUzMGMzXHUzMGFmXHUzMGI5Citsb2dnZXIuc3VmZml4PVx1MzBiNVx1MzBkNVx1MzBhM1x1MzBjM1x1MzBhZlx1MzBiOQorbG9nZ2VyLnRpbWVzdGFtcD1cdTMwYmZcdTMwYTRcdTMwZTBcdTMwYjlcdTMwYmZcdTMwZjNcdTMwZDcKK2xvZ2dlci5maWxlbG9nZ2VyLnByb3BlcnRpZXM9RmlsZUxvZ2dlclx1NTZmYVx1NjcwOVx1MzA2ZVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhMworbG9nZ2VyLnZlcmJvc2l0eWxldmVsPVx1NTE5N1x1OTU3N1x1MzBlY1x1MzBkOVx1MzBlYgorZXJyb3IubG9nZ2VyTmFtZS5iYWQ9XHU0ZTBkXHU2YjYzXHUzMDZhTG9nZ2VyXHU1NDBkIHswfQorZXJyb3IubG9nZ2VyTmFtZS5leGlzdHM9PGxpPlx1NTQwY1x1NTQwZFx1MzA2ZUxvZ2dlclx1MzA0Y1x1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMjwvbGk+CitlcnJvci5kaXJlY3RvcnkucmVxdWlyZWQ9PGxpPlx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci5wcmVmaXgucmVxdWlyZWQ9PGxpPlx1MzBkN1x1MzBlYVx1MzBkNVx1MzBhM1x1MzBjM1x1MzBhZlx1MzBiOVx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci5zdWZmaXgucmVxdWlyZWQ9PGxpPlx1MzBiNVx1MzBkNVx1MzBhM1x1MzBjM1x1MzBhZlx1MzBiOVx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci52YWx2ZU5hbWUuYmFkPVx1NGUwZFx1NmI2M1x1MzA2YVx1MzBkMFx1MzBlYlx1MzBkNlx1NTQwZCB7MH0KK2Vycm9yLnZhdmx2ZU5hbWUuZXhpc3RzPTxsaT5cdTU0MGNcdTU0MGRcdTMwNmVcdTMwZDBcdTMwZWJcdTMwZDZcdTMwNGNcdTY1ZTJcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNTk8L2xpPgorZXJyb3Iuc2luZ2xlU2lnbk9uLmV4aXN0cz08bGk+U2luZ2xlU2lnbk9uXHUzMGQwXHUzMGViXHUzMGQ2XHUzMDRjXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5PC9saT4KK3VzZXIuZnVsbE5hbWU9XHUzMGQ1XHUzMGViXHUzMGNkXHUzMGZjXHUzMGUwCit1c2VyLmdyb3Vwcz1cdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTRlMmRcdTMwNmVcdTMwZTFcdTMwZjNcdTMwZDAKK3VzZXIubmV3VXNlcj1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZTZcdTMwZmNcdTMwYjZcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTRmNWNcdTYyMTAKK3VzZXIub2xkVXNlcj1cdTY1ZTJcdTViNThcdTMwNmVcdTMwZTZcdTMwZmNcdTMwYjZcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTdkZThcdTk2YzYKK3VzZXIucGFzc3dvcmQ9XHUzMGQxXHUzMGI5XHUzMGVmXHUzMGZjXHUzMGM5Cit1c2VyLnByb3BlcnRpZXM9XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzCit1c2VyLnJvbGVzPVx1MzBiYlx1MzBhZFx1MzBlNVx1MzBlYVx1MzBjNlx1MzBhM1x1MzBlZFx1MzBmY1x1MzBlYgordXNlci51c2VybmFtZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGQKK2Vycm9yLnBhc3N3b3JkLnJlcXVpcmVkPTxsaT5cdTMwZDFcdTMwYjlcdTMwZWZcdTMwZmNcdTMwYzlcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgorZXJyb3IudXNlcm5hbWUucmVxdWlyZWQ9PGxpPlx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5nZXQuYXR0cmlidXRlcz1cdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTU2ZGVcdTVmYTlcdTY2NDJcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIKK2Vycm9yLnNldC5hdHRyaWJ1dGVzPVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzA2ZVx1OGEyZFx1NWI5YVx1NjY0Mlx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMgorYWN0aW9ucy5kZWxldGU9XHU1MjRhXHU5NjY0CitlcnJvci5kZWZhdWx0SG9zdC5yZXF1aXJlZD08bGk+XHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGRiXHUzMGI5XHUzMGM4XHU1NDBkXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5PC9saT4KK2Vycm9yLmVuZ2luZU5hbWUuYmFkPVx1MzBhOFx1MzBmM1x1MzBiOFx1MzBmM1x1NTQwZCB7MH0gXHUzMDRjXHU0ZTBkXHU2YjYzXHUzMDY3XHUzMDU5CitlcnJvci5lbmdpbmVOYW1lLmV4aXN0cz08bGk+XHUzMGE4XHUzMGYzXHUzMGI4XHUzMGYzXHU1NDBkXHUzMDRjXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5PC9saT4KK2Vycm9yLnNlcnZpY2VOYW1lLmJhZD1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTU0MGQgezB9IFx1MzA0Y1x1NGUwZFx1NmI2M1x1MzA2N1x1MzA1OQorZXJyb3Iuc2VydmljZU5hbWUucmVxdWlyZWQ9PGxpPlx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1NTQwZFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OTwvbGk+CitlcnJvci5zZXJ2aWNlTmFtZS5leGlzdHM9PGxpPlx1NTQwY1x1NTQwZFx1MzA2ZVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1NTQwZFx1MzA0Y1x1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1OTwvbGk+CitlcnJvci5qZGJjcmVhbG09SkRCQ1JlYWxtXHUzMDZlXHU4YTJkXHU1YjlhXHU0ZTJkXHUzMDZiXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCitlcnJvci5qbmRpcmVhbG09Sk5ESVJlYWxtXHUzMDZlXHU4YTJkXHU1YjlhXHU0ZTJkXHUzMDZiXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCitlcnJvci51c2VyZGJyZWFsbT1Vc2VyZGF0YWJhc2VSZWFsbVx1MzA2ZVx1OGEyZFx1NWI5YVx1NGUyZFx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMgorZXJyb3IucmVhbG1OYW1lLmJhZD1cdTMwZWNcdTMwZWJcdTMwZTBcdTU0MGQgezB9IFx1MzA0Y1x1NGUwZFx1NmI2M1x1MzA2N1x1MzA1OQorZXJyb3IucmVhbG1OYW1lLnJlcXVpcmVkPTxsaT5cdTMwZWNcdTMwZWJcdTMwZTBcdTU0MGRcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTlcdTMwMDI8L2xpPgorZXJyb3IucmVhbG1OYW1lLmV4aXN0cz08bGk+XHU1NDBjXHU1NDBkXHUzMDZlXHUzMGVjXHUzMGViXHUzMGUwXHUzMDRjXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyPC9saT4KK2Vycm9yLmNvbnRleHROYW1lLmJhZD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTU0MGQgezB9IFx1MzA0Y1x1NGUwZFx1NmI2M1x1MzA2N1x1MzA1OQorZXJyb3IuY29udGV4dE5hbWUuZXhpc3RzPTxsaT5cdTU0MGNcdTU0MGRcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNGNcdTY1ZTJcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDI8L2xpPgorZXJyb3IuZGVmYXVsdGNvbnRleHROYW1lLmV4aXN0cz08bGk+XHU1NDBjXHU1NDBkXHUzMDZlXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDRjXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyPC9saT4KK2Vycm9yLnBhdGgucHJlZml4PTxsaT5cdTMwZDFcdTMwYjlcdTMwNmYnLydcdTMwNjdcdTU5Y2JcdTMwN2VcdTMwODlcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNmFcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3IubG9hZGVyTmFtZS5iYWQ9XHUzMGVkXHUzMGZjXHUzMGMwXHU1NDBkIHswfSBcdTMwNGNcdTRlMGRcdTZiNjNcdTMwNjdcdTMwNTkKK2Vycm9yLm1hbmFnZXJOYW1lLmJhZD1cdTMwZGVcdTMwY2RcdTMwZmNcdTMwYjhcdTMwZTNcdTU0MGQgezB9IFx1MzA0Y1x1NGUwZFx1NmI2M1x1MzA2N1x1MzA1OQorZXJyb3IuY29ubmVjdG9yTmFtZS5iYWQ9XHUzMGIzXHUzMGNkXHUzMGFmXHUzMGJmXHU1NDBkIHswfSBcdTMwNGNcdTRlMGRcdTZiNjNcdTMwNjdcdTMwNTkKK2Vycm9yLmNvbm5lY3Rvck5hbWUuZXhpc3RzPTxsaT5cdTU0MGNcdTU0MGRcdTMwNmVcdTMwYjNcdTMwY2RcdTMwYWZcdTMwYmZcdTMwNGNcdTY1ZTJcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNTk8L2xpPgorZXJyb3IucGF0dGVybi5yZXF1aXJlZD08bGk+XHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLnZhbHZlTmFtZS5iYWQ9XHU0ZTBkXHU2YjYzXHUzMDZhXHUzMGQwXHUzMGViXHUzMGQ2XHU1NDBkIHswfQorZXJyb3IudmFsdmVOYW1lLmV4aXN0cz08bGk+XHU1NDBjXHU1NDBkXHUzMDZlXHUzMGQwXHUzMGViXHUzMGQ2XHUzMDRjXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5PC9saT4KK3JlYWxtLmRyaXZlcj1cdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZDAKK3JlYWxtLnBhc3N3ZD1cdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTMwZDFcdTMwYjlcdTMwZWZcdTMwZmNcdTMwYzkKK3JlYWxtLnVybD1cdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlVUkwKK3JlYWxtLnVzZXJOYW1lPVx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZAorcmVhbG0uZGlnZXN0PVx1MzBjMFx1MzBhNFx1MzBiOFx1MzBhN1x1MzBiOVx1MzBjOFx1MzBhMlx1MzBlYlx1MzBiNFx1MzBlYVx1MzBiYVx1MzBlMAorcmVhbG0ucGFzc3dvcmRDb2w9XHUzMGQxXHUzMGI5XHUzMGVmXHUzMGZjXHUzMGM5XHUzMGFiXHUzMGU5XHUzMGUwCityZWFsbS5yb2xlTmFtZUNvbD1cdTMwZWRcdTMwZmNcdTMwZWJcdTU0MGRcdTMwYWJcdTMwZTlcdTMwZTAKK3JlYWxtLnVzZXJOYW1lQ29sPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZFx1MzBhYlx1MzBlOVx1MzBlMAorcmVhbG0udXNlclJvbGVUYWJsZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTMwZWRcdTMwZmNcdTMwZWJcdTMwYzZcdTMwZmNcdTMwZDZcdTMwZWIKK3JlYWxtLnVzZXJUYWJsZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTMwYzZcdTMwZmNcdTMwZDZcdTMwZWIKK3JlYWxtLnJlc291cmNlPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1NTQwZAorcmVhbG0ucGF0aE5hbWU9XHUzMGQxXHUzMGI5XHU1NDBkCityZWFsbS5jb25uTmFtZT1cdTYzYTVcdTdkOWFcdTU0MGQKK3JlYWxtLmNvbm5QYXNzd29yZD1cdTYzYTVcdTdkOWFcdTMwZDFcdTMwYjlcdTMwZWZcdTMwZmNcdTMwYzkKK3JlYWxtLmNvbm5VUkw9XHU2M2E1XHU3ZDlhVVJMCityZWFsbS5jb25uRmFjdG9yeT1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDVcdTMwYTFcdTMwYWZcdTMwYzhcdTMwZWEKK3JlYWxtLnJvbGVCYXNlPVx1MzBlZFx1MzBmY1x1MzBlYlx1NTdmYVx1NjcyY1x1ODk4MVx1N2QyMAorcmVhbG0ucm9sZU5hbWU9XHUzMGVkXHUzMGZjXHUzMGViXHU1NDBkCityZWFsbS51c2VyLnJvbGVOYW1lPVx1MzBlNlx1MzBmY1x1MzBiNlx1MzBlZFx1MzBmY1x1MzBlYlx1NTQwZAorcmVhbG0ucGF0dGVybj1cdTMwZWRcdTMwZmNcdTMwZWJcdTY5MWNcdTdkMjJcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjMKK3JlYWxtLnJvbGUuc3VidHJlZT1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwNmVcdTMwYjVcdTMwZDZcdTMwYzRcdTMwZWFcdTMwZmNcdTMwNmVcdTY5MWNcdTdkMjIKK3JlYWxtLnVzZXJCYXNlPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTdmYVx1NjcyY1x1ODk4MVx1N2QyMAorcmVhbG0udXNlci5zdWJ0cmVlPVx1MzBlNlx1MzBmY1x1MzBiNlx1MzA2ZVx1MzBiNVx1MzBkNlx1MzBjNFx1MzBlYVx1MzBmY1x1MzA2ZVx1NjkxY1x1N2QyMgorcmVhbG0udXNlclBhc3N3b3JkPVx1MzBlNlx1MzBmY1x1MzBiNlx1MzBkMVx1MzBiOVx1MzBlZlx1MzBmY1x1MzBjOQorcmVhbG0udXNlclBhdHRlcm49XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzCityZWFsbS51c2VyU2VhcmNoPVx1MzBlNlx1MzBmY1x1MzBiNlx1NjkxY1x1N2QyMgorcmVhbG0uZGF0YVNvdXJjZU5hbWU9XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGJkXHUzMGZjXHUzMGI5XHU1NDBkCityZWFsbS5sb2NhbERhdGFTb3VyY2U9XHUzMGVkXHUzMGZjXHUzMGFiXHUzMGViXHUzMGM3XHUzMGZjXHUzMGJmXHUzMGJkXHUzMGZjXHUzMGI5CityZWFsbS51c2VyQ3JlZENvbD09XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGFmXHUzMGVjXHUzMGM3XHUzMGYzXHUzMGI3XHUzMGUzXHUzMGViXHUzMGIzXHUzMGU5XHUzMGUwCit2YWx2ZS5hY2Nlc3MucHJvcGVydGllcz1cdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjlMb2dnZXJcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK3ZhbHZlLnJlcXVlc3QucHJvcGVydGllcz1cdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwZDVcdTMwYTNcdTMwZWJcdTMwYmZcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK3ZhbHZlLnNpbmdsZS5wcm9wZXJ0aWVzPVx1MzBiN1x1MzBmM1x1MzBiMFx1MzBlYlx1MzBiNVx1MzBhNFx1MzBmM1x1MzBhYVx1MzBmM1x1MzBkMFx1MzBlYlx1MzBkNlx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhMwordmFsdmUucmVtb3RlaG9zdC5wcm9wZXJ0aWVzPVx1MzBlYVx1MzBlMlx1MzBmY1x1MzBjOFx1MzBkYlx1MzBiOVx1MzBjOFx1MzBkMFx1MzBlYlx1MzBkNlx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhMwordmFsdmUucmVtb3RlYWRkcmVzcy5wcm9wZXJ0aWVzPVx1MzBlYVx1MzBlMlx1MzBmY1x1MzBjOFx1MzBhMlx1MzBjOVx1MzBlY1x1MzBiOVx1MzBkMFx1MzBlYlx1MzBkNlx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhMwordmFsdmUucmVzb2x2ZUhvc3RzPVx1MzBkYlx1MzBiOVx1MzBjOFx1NTQwZFx1MzA2ZVx1ODllM1x1NmM3YQordmFsdmUucm90YXRhYmxlPVx1MzBlZFx1MzBmY1x1MzBjNlx1MzBmY1x1MzBjOFx1NTNlZlx1ODBmZAordmFsdmUucGF0dGVybj1cdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjMKK3ZhbHZlLmFsbG93SG9zdHM9XHU4YTMxXHU1M2VmXHUzMDU5XHUzMDhiXHUzMGRiXHUzMGI5XHUzMGM4Cit2YWx2ZS5kZW55SG9zdHM9XHU2MmQyXHU1NDI2XHUzMDU5XHUzMDhiXHUzMGRiXHUzMGI5XHUzMGM4Cit2YWx2ZS5hbGxvd0lQcz1cdThhMzFcdTUzZWZcdTMwNTlcdTMwOGJJUFx1MzBhMlx1MzBjOVx1MzBlY1x1MzBiOQordmFsdmUuZGVueUlQcz1cdTYyZDJcdTU0MjZcdTMwNTlcdTMwOGJJUFx1MzBhMlx1MzBjOVx1MzBlY1x1MzBiOQorZXJyb3IuYWxsb3dIb3N0PTxsaT5hbGxvd1x1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OVx1MzAwMlx1N2JhMVx1NzQwNlx1ODAwNVx1MzA2ZVx1MzBkYlx1MzBiOVx1MzBjOFx1NTQwZFx1MzA5Mlx1NTQyYlx1MzA4MVx1MzA4Ylx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMjwvbGk+K2Vycm9yLmRlbnlIb3N0PTxsaT5kZW55XHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXHU3YmExXHU3NDA2XHU4MDA1XHUzMDZlXHUzMGRiXHUzMGI5XHUzMGM4XHU1NDBkXHUzMDkyXHU5NjY0XHUzMDRmXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyPC9saT4KK2Vycm9yLmFsbG93SVA9PGxpPmFsbG93XHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXHU3YmExXHU3NDA2XHU4MDA1XHUzMDZlSVBcdTMwYTJcdTMwYzlcdTMwZWNcdTMwYjlcdTMwOTJcdTU0MmJcdTMwODFcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDI8L2xpPgorZXJyb3IuZGVueUlQPTxsaT5kZW55XHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXHU3YmExXHU3NDA2XHU4MDA1XHUzMDZlSVBcdTMwYTJcdTMwYzlcdTMwZWNcdTMwYjlcdTMwOTJcdTk2NjRcdTMwNGZcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDI8L2xpPgorZXJyb3IuYWxsb3cuZGVueS5yZXF1aXJlZD08bGk+YWxsb3dcdTUzYzhcdTMwNmZkZW55XHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyPC9saT4KK2Vycm9yLnN5bnRheD08bGk+XHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMGQ1XHUzMGEzXHUzMGViXHUzMGJmXHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzXHUzMDZlXHU0ZTJkXHUzMDY3XHU2OWNiXHU2NTg3XHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5XHUzMDAyPC9saT4KK2Vycm9yLnJlc291cmNlLnJlcXVpcmVkPTxsaT5cdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTU0MGRcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3IucmVzb3VyY2UuamF2YXByZWZpeD08bGk+XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDZiXHUzMDZmImphdmE6Ilx1MzA2ZVx1MzBkN1x1MzBlYVx1MzBkNVx1MzBhM1x1MzBhZlx1MzBiOVx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OVx1MzAwMjwvbGk+CitlcnJvci5wYXRoTmFtZS5yZXF1aXJlZD08bGk+XHUzMGQxXHUzMGI5XHU1NDBkXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLmRyaXZlci5yZXF1aXJlZD08bGk+XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMGM5XHUzMGU5XHUzMGE0XHUzMGQwXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLnJvbGVOYW1lQ29sLnJlcXVpcmVkPTxsaT5cdTMwZWRcdTMwZmNcdTMwZWJcdTU0MGRcdTMwYWJcdTMwZTlcdTMwZTBcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3IudXNlck5hbWVDb2wucmVxdWlyZWQ9PGxpPlx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZFx1MzBhYlx1MzBlOVx1MzBlMFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci5wYXNzd29yZENvbC5yZXF1aXJlZD08bGk+XHUzMGQxXHUzMGI5XHUzMGVmXHUzMGZjXHUzMGM5XHUzMGFiXHUzMGU5XHUzMGUwXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLnVzZXJUYWJsZS5yZXF1aXJlZD08bGk+XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGM2XHUzMGZjXHUzMGQ2XHUzMGViXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLnJvbGVUYWJsZS5yZXF1aXJlZD08bGk+XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGVkXHUzMGZjXHUzMGViXHUzMGM2XHUzMGZjXHUzMGQ2XHUzMGViXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLmNvbm5lY3Rpb25QYXNzd29yZC5yZXF1aXJlZD08bGk+XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMGQxXHUzMGI5XHUzMGVmXHUzMGZjXHUzMGM5XHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLmNvbm5lY3Rpb25VUkwucmVxdWlyZWQ9PGxpPlx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOVVSTFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci5jb25uZWN0aW9uTmFtZS5yZXF1aXJlZD08bGk+XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLnJvbGVOYW1lLnJlcXVpcmVkPTxsaT5cdTMwZWRcdTMwZmNcdTMwZWJcdTU0MGRcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3IudXNlclJvbGVOYW1lLnJlcXVpcmVkPTxsaT5cdTMwZTZcdTMwZmNcdTMwYjZcdTMwZWRcdTMwZmNcdTMwZWJcdTU0MGRcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3IuZGlnZXN0LnJlcXVpcmVkPTxsaT5cdTMwYzBcdTMwYTRcdTMwYjhcdTMwYTdcdTMwYjlcdTMwYzhcdTMwYTJcdTMwZWJcdTMwYjRcdTMwZWFcdTMwYmFcdTMwZTBcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3Iucm9sZUJhc2UucmVxdWlyZWQ9PGxpPlx1MzBlZFx1MzBmY1x1MzBlYlx1NTdmYVx1NjcyY1x1ODk4MVx1N2QyMFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci5yb2xlUGF0dGVybi5yZXF1aXJlZD08bGk+XHUzMGVkXHUzMGZjXHUzMGViXHU2OTFjXHU3ZDIyXHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLnVzZXJCYXNlLnJlcXVpcmVkPTxsaT5cdTMwZTZcdTMwZmNcdTMwYjZcdTU3ZmFcdTY3MmNcdTg5ODFcdTdkMjBcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3IudXNlclBhc3N3b3JkLnJlcXVpcmVkPTxsaT5cdTMwZTZcdTMwZmNcdTMwYjZcdTMwZDFcdTMwYjlcdTMwZWZcdTMwZmNcdTMwYzlcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3IudXNlclBhdHRlcm4ucmVxdWlyZWQ9PGxpPlx1MzBlNlx1MzBmY1x1MzBiNlx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmM1x1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci51c2VyU2VhcmNoLnJlcXVpcmVkPTxsaT5cdTMwZTZcdTMwZmNcdTMwYjZcdTY5MWNcdTdkMjJcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3IudXNlclBhdHRlcm4udXNlclNlYXJjaC5kZWZpbmVkPTxsaT5cdTMwZTZcdTMwZmNcdTMwYjZcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjNcdTMwN2VcdTMwNWZcdTMwNmZcdTMwZTZcdTMwZmNcdTMwYjZcdTY5MWNcdTdkMjJcdTMwNmVcdTMwNDRcdTMwNWFcdTMwOGNcdTMwNGJcdTRlMDBcdTY1YjlcdTMwNmVcdTMwN2ZcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTkuIFx1NGUyMVx1NjViOVx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci5jb250ZXh0RmFjdG9yeS5yZXF1aXJlZD08bGk+XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGQ1XHUzMGExXHUzMGFmXHUzMGM4XHUzMGVhXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLmNvbm5QYXNzd29yZC5yZXF1aXJlZD08bGk+XHU2M2E1XHU3ZDlhXHUzMGQxXHUzMGI5XHUzMGVmXHUzMGZjXHUzMGM5XHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLmNvbm5VUkwucmVxdWlyZWQ9PGxpPlx1NjNhNVx1N2Q5YVVSTFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci5jb25uTmFtZS5yZXF1aXJlZD08bGk+XHU2M2E1XHU3ZDlhXHU1NDBkXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLmRhdGFTb3VyY2VOYW1lLnJlcXVpcmVkPTxsaT5cdTMwYzdcdTMwZmNcdTMwYmZcdTMwYmRcdTMwZmNcdTMwYjlcdTU0MGRcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTlcdTMwMDI8L2xpPgorZXJyb3IudXNlckNyZWRDb2wucmVxdWlyZWQ9PGxpPlx1MzBlNlx1MzBmY1x1MzBiNlx1MzBhZlx1MzBlY1x1MzBjN1x1MzBmM1x1MzBiN1x1MzBlM1x1MzBlYlx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OVx1MzAwMjwvbGk+CitlcnJvci51c2VyUm9sZVRhYmxlLnJlcXVpcmVkPTxsaT5cdTMwZTZcdTMwZmNcdTMwYjZcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwYzZcdTMwZmNcdTMwZDZcdTMwZWJcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTlcdTMwMDI8L2xpPgorCisjIC0tLS0tLS0tLS0gU2VydmVyIE1vZHVsZSAtLS0tLS0tLS0tCitzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5zdWJ0cmVlTm9kZT1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjkKK3NlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLmNvbm5lY3Rvcj1cdTMwYjNcdTMwY2RcdTMwYWZcdTMwYmYKK3NlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLmhvc3Q9XHUzMGRiXHUzMGI5XHUzMGM4CitzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5jb250ZXh0PVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOAorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIubG9nZ2VyRm9yPXswfVx1MzA2ZVx1MzBlZFx1MzBhY1x1MzBmYyAKK3NlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLnJlYWxtRm9yPXswfVx1MzA2ZVx1MzBlY1x1MzBlYlx1MzBlMAorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIubG9nZ2VyPVx1MzBlZFx1MzBhY1x1MzBmYyAKK3NlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLnJlYWxtPVx1MzBlY1x1MzBlYlx1MzBlMAorCisjIC0tLS0tLS0tLS0gUmVzb3VyY2VzIE1vZHVsZSAtLS0tLS0tLS0tCityZXNvdXJjZXMudHJlZUJ1aWxkZXIuc3VidHJlZU5vZGU9XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5CityZXNvdXJjZXMudHJlZUJ1aWxkZXIuZGF0YXNvdXJjZXM9XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGJkXHUzMGZjXHUzMGI5CityZXNvdXJjZXMudHJlZUJ1aWxkZXIubWFpbHNlc3Npb25zPVx1MzBlMVx1MzBmY1x1MzBlYlx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMworcmVzb3VyY2VzLnRyZWVCdWlsZGVyLnJlc291cmNlbGlua3M9XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMGVhXHUzMGYzXHUzMGFmCityZXNvdXJjZXMuZW52LmVudHJpZXM9XHU3NGIwXHU1ODgzXHUzMGE4XHUzMGYzXHUzMGM4XHUzMGVhCityZXNvdXJjZXMuZW52LmVudHJ5PVx1MzBhOFx1MzBmM1x1MzBjOFx1MzBlYVx1NTQwZAorcmVzb3VyY2VzLmVudi5wcm9wcz1cdTc0YjBcdTU4ODNcdTMwYThcdTMwZjNcdTMwYzhcdTMwZWFcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK3Jlc291cmNlcy5lbnYub3ZlcnJpZGU9XHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGVjXHUzMGQ5XHUzMGViXHUzMGE4XHUzMGYzXHUzMGM4XHUzMGVhXHUzMDkyXHU0ZTBhXHU2NmY4XHUzMDRkCityZXNvdXJjZXMuYWN0aW9ucy5lbnYuY3JlYXRlPVx1NjViMFx1MzA1N1x1MzA0NFx1NzRiMFx1NTg4M1x1MzBhOFx1MzBmM1x1MzBjOFx1MzBlYVx1MzA2ZVx1NGY1Y1x1NjIxMAorcmVzb3VyY2VzLmFjdGlvbnMuZW52LmVkaXQ9XHU3NGIwXHU1ODgzXHUzMGE4XHUzMGYzXHUzMGM4XHUzMGVhXHUzMDZlXHU3ZGU4XHU5NmM2CityZXNvdXJjZXMuYWN0aW9ucy5lbnYuZGVsZXRlPVx1NzRiMFx1NTg4M1x1MzBhOFx1MzBmM1x1MzBjOFx1MzBlYVx1MzA2ZVx1NTI0YVx1OTY2NAorcmVzb3VyY2VzLmFjdGlvbnMuZW52Lmxpc3Q9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGE4XHUzMGYzXHUzMGM4XHUzMGVhXHUzMDZlXHU0ZTAwXHU4OWE3CityZXNvdXJjZXMuZGF0YXNyYy5qZGJjPUpEQkNcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZDAKK3Jlc291cmNlcy5hY3Rpb25zLmRhdGFzcmM9XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGJkXHUzMGZjXHUzMGI5CityZXNvdXJjZXMuYWN0aW9ucy5kYXRhc3JjLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwYzdcdTMwZmNcdTMwYmZcdTMwYmRcdTMwZmNcdTMwYjlcdTMwNmVcdTRmNWNcdTYyMTAKK3Jlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMuZGVsZXRlPVx1MzBjN1x1MzBmY1x1MzBiZlx1MzBiZFx1MzBmY1x1MzBiOVx1MzA2ZVx1NTI0YVx1OTY2NAorcmVzb3VyY2VzLmFjdGlvbnMuZGF0YXNyYy5lZGl0PVx1MzBjN1x1MzBmY1x1MzBiZlx1MzBiZFx1MzBmY1x1MzBiOVx1MzA2ZVx1N2RlOFx1OTZjNgorcmVzb3VyY2VzLmRhdGFzcmMudXJsPVx1MzBjN1x1MzBmY1x1MzBiZlx1MzBiZFx1MzBmY1x1MzBiOVVSTAorcmVzb3VyY2VzLmRhdGFzcmMuamRiY2NsYXNzPUpEQkNcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZDBcdTMwYWZcdTMwZTlcdTMwYjkKK3Jlc291cmNlcy5kYXRhc3JjLmNvbm5lY3Rpb25zPVx1NjNhNVx1N2Q5YQorcmVzb3VyY2VzLmRhdGFzcmMuYWN0aXZlPVx1NjcwOVx1NTJiOVx1MzA2YVx1NjcwMFx1NTkyN1x1NjNhNVx1N2Q5YVx1NjU3MAorcmVzb3VyY2VzLmRhdGFzcmMuaWRsZT1cdTMwYTJcdTMwYTRcdTMwYzlcdTMwZWJcdTcyYjZcdTYxNGJcdTMwNmVcdTY3MDBcdTU5MjdcdTYzYTVcdTdkOWFcdTY1NzAKK3Jlc291cmNlcy5kYXRhc3JjLndhaXQ9XHU2NzAwXHU1OTI3XHU2M2E1XHU3ZDlhXHU1Zjg1XHUzMDYxXHU2NjQyXHU5NTkzCityZXNvdXJjZXMuZGF0YXNyYy52YWxpZGF0aW9uPVx1MzBhZlx1MzBhOFx1MzBlYVx1MzA2ZVx1NjkxY1x1OGEzYworcmVzb3VyY2VzLmRhdGFzcmMuam5kaT1KTkRJXHU1NDBkCityZXNvdXJjZXMuYWN0aW9ucy5tYWlsc2Vzc2lvbj1cdTMwZTFcdTMwZmNcdTMwZWJcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjMKK3Jlc291cmNlcy5hY3Rpb25zLm1haWxzZXNzaW9uLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZTFcdTMwZmNcdTMwZWJcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmVcdTRmNWNcdTYyMTAKK3Jlc291cmNlcy5hY3Rpb25zLm1haWxzZXNzaW9uLmRlbGV0ZT1cdTMwZTFcdTMwZmNcdTMwZWJcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmVcdTUyNGFcdTk2NjQKK3Jlc291cmNlcy5hY3Rpb25zLm1haWxzZXNzaW9uLmVkaXQ9XHUzMGUxXHUzMGZjXHUzMGViXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU3ZGU4XHU5NmM2CityZXNvdXJjZXMubWFpbHNlc3Npb24ubmFtZT1cdTU0MGRcdTUyNGQKK3Jlc291cmNlcy5tYWlsc2Vzc2lvbi5tYWlsaG9zdD1TTVRQXHUzMGRiXHUzMGI5XHUzMGM4XHU1NDBkCityZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzBlYVx1MzBmM1x1MzBhZgorcmVzb3VyY2VzLmFjdGlvbnMucmVzb3VyY2Vsay5jcmVhdGU9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMGVhXHUzMGYzXHUzMGFmXHUzMDZlXHU0ZjVjXHU2MjEwCityZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrLmRlbGV0ZT1cdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwZWFcdTMwZjNcdTMwYWZcdTMwNmVcdTUyNGFcdTk2NjQKK3Jlc291cmNlcy5hY3Rpb25zLnJlc291cmNlbGsuZWRpdD1cdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwZWFcdTMwZjNcdTMwYWZcdTMwNmVcdTdkZThcdTk2YzYKK3Jlc291cmNlcy5yZXNvdXJjZWxrLm5hbWU9XHU1NDBkXHU1MjRkCityZXNvdXJjZXMucmVzb3VyY2Vsay5nbG9iYWw9XHUzMGIwXHUzMGVkXHUzMGZjXHUzMGQwXHUzMGViCityZXNvdXJjZXMucmVzb3VyY2Vsay50eXBlPVx1NTc4YgorcmVzb3VyY2VzLmVycm9yLm5hbWUucmVxdWlyZWQ9PGxpPlx1NTQwZFx1NTI0ZFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CityZXNvdXJjZXMuZXJyb3IuZ2xvYmFsLnJlcXVpcmVkPTxsaT5cdTMwYjBcdTMwZWRcdTMwZmNcdTMwZDBcdTMwZWJcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorcmVzb3VyY2VzLmVycm9yLnR5cGUucmVxdWlyZWQ9PGxpPlx1NTc4Ylx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CityZXNvdXJjZXMuZXJyb3IudmFsdWUucmVxdWlyZWQ9PGxpPlx1NTAyNFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CityZXNvdXJjZXMuZXJyb3IudmFsdWUubWlzbWF0Y2g9PGxpPlx1NTc4Ylx1MzA2OFx1NTAyNFx1MzA0Y1x1OTA2OVx1NTQwOFx1MzA1N1x1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CityZXNvdXJjZXMuZXJyb3IuZW50cnlUeXBlLmludmFsaWQ9PGxpPlx1MzBhOFx1MzBmM1x1MzBjOFx1MzBlYVx1MzBiZlx1MzBhNFx1MzBkN1x1MzA5Mlx1OGE4ZFx1OGI1OFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CityZXNvdXJjZXMuZXJyb3IuZW50cnlUeXBlLm5vdGltcGw9PGxpPlx1MzA1M1x1MzA2ZVx1NTc4Ylx1MzA2Ylx1NWJmZVx1MzA1OVx1MzA4Ylx1NTlhNVx1NWY1M1x1NjAyN1x1MzBjMVx1MzBhN1x1MzBjM1x1MzBhYlx1MzA2Zlx1MzA3ZVx1MzA2MFx1NWI5Zlx1ODhjNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CityZXNvdXJjZXMuZXJyb3IudXJsLnJlcXVpcmVkPTxsaT5cdTMwYzdcdTMwZmNcdTMwYmZcdTMwYmRcdTMwZmNcdTMwYjlVUkxcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorcmVzb3VyY2VzLmVycm9yLmRyaXZlckNsYXNzLnJlcXVpcmVkPTxsaT5KREJDXHUzMGM5XHUzMGU5XHUzMGE0XHUzMGQwXHUzMGFmXHUzMGU5XHUzMGI5XHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK3Jlc291cmNlcy5lcnJvci5hY3RpdmUucmVxdWlyZWQ9PGxpPlx1NjcwOVx1NTJiOVx1MzA2YVx1NjcwMFx1NTkyN1x1NjNhNVx1N2Q5YVx1NjU3MFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CityZXNvdXJjZXMuZXJyb3IuaWRsZS5yZXF1aXJlZD08bGk+XHUzMGEyXHUzMGE0XHUzMGM5XHUzMGViXHU3MmI2XHU2MTRiXHUzMDZlXHU2NzAwXHU1OTI3XHU2M2E1XHU3ZDlhXHU2NTcwXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK3Jlc291cmNlcy5lcnJvci53YWl0LnJlcXVpcmVkPTxsaT5cdTY3MDBcdTU5MjdcdTYzYTVcdTdkOWFcdTVmODVcdTMwNjFcdTY2NDJcdTk1OTNcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorcmVzb3VyY2VzLmVycm9yLm1haWxob3N0LnJlcXVpcmVkPTxsaT5TTVRQXHUzMGRiXHUzMGI5XHUzMGM4XHU1NDBkXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK3Jlc291cmNlcy5pbnRlZ2VyLmVycm9yPTxsaT5cdTRlMGRcdTZiNjNcdTMwNmFcdTY1NzRcdTY1NzBcdTMwNjdcdTMwNTlcdTMwMDI8L2xpPgorcmVzb3VyY2VzLmFjdGlvbnMudXNlcmRiLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZTZcdTMwZmNcdTMwYjZcdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTMwNmVcdTRmNWNcdTYyMTAKK3Jlc291cmNlcy5hY3Rpb25zLnVzZXJkYi5lZGl0PVx1MzBlNlx1MzBmY1x1MzBiNlx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOVx1MzA2ZVx1N2RlOFx1OTZjNgorcmVzb3VyY2VzLmFjdGlvbnMudXNlcmRiLmRlbGV0ZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTMwNmVcdTUyNGFcdTk2NjQKK3Jlc291cmNlcy51c2VyZGIubG9jYXRpb249XHUzMGVkXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzCityZXNvdXJjZXMudXNlcmRiLmZhY3Rvcnk9XHUzMGQ1XHUzMGExXHUzMGFmXHUzMGM4XHUzMGVhCityZXNvdXJjZXMudHJlZUJ1aWxkZXIuZGF0YWJhc2VzPVx1MzBlNlx1MzBmY1x1MzBiNlx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOQorcmVzb3VyY2VzLmVycm9yLnBhdGgucmVxdWlyZWQ9PGxpPlx1MzBkMVx1MzBiOVx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CityZXNvdXJjZXMuZXJyb3Iuam5kaU5hbWUucmVxdWlyZWQ9PGxpPkpORElcdTU0MGRcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgorcmVzb3VyY2VzLmludmFsaWQubmFtZT08bGk+XHU3MTIxXHU1MmI5XHUzMDZhXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHU1NDBkIC0gXHU1NDBkXHU1MjRkXHUzMDZmXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyPC9saT4KK3Jlc291cmNlcy5pbnZhbGlkLmVudj08bGk+XHU3MTIxXHU1MmI5XHUzMDZhXHU3NGIwXHU1ODgzXHU1NDBkIC0gXHU1NDBkXHU1MjRkXHUzMDZmXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyPC9saT4KKworIyAtLS0tLS0tLS0tIFVzZXIgRGF0YWJhc2UgTW9kdWxlIC0tLS0tLS0tLS0KK3VzZXJzLmFjdGlvbnMuZ3JvdXAuY3JlYXRlPVx1NjViMFx1MzA1N1x1MzA0NFx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2ZVx1NGY1Y1x1NjIxMAordXNlcnMuYWN0aW9ucy5ncm91cC5kZWxldGU9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZlXHU1MjRhXHU5NjY0Cit1c2Vycy5hY3Rpb25zLmdyb3VwLmxpc3Q9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZlXHU0ZTAwXHU4OWE3Cit1c2Vycy5hY3Rpb25zLnJvbGUuY3JlYXRlPVx1NjViMFx1MzA1N1x1MzA0NFx1MzBlZFx1MzBmY1x1MzBlYlx1MzA2ZVx1NGY1Y1x1NjIxMAordXNlcnMuYWN0aW9ucy5yb2xlLmRlbGV0ZT1cdTY1ZTJcdTViNThcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwNmVcdTUyNGFcdTk2NjQKK3VzZXJzLmFjdGlvbnMucm9sZS5saXN0PVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzA2ZVx1NGUwMFx1ODlhNwordXNlcnMuYWN0aW9ucy51c2VyLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZTZcdTMwZmNcdTMwYjZcdTMwNmVcdTRmNWNcdTYyMTAKK3VzZXJzLmFjdGlvbnMudXNlci5kZWxldGU9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGU2XHUzMGZjXHUzMGI2XHUzMDZlXHU1MjRhXHU5NjY0Cit1c2Vycy5hY3Rpb25zLnVzZXIubGlzdD1cdTY1ZTJcdTViNThcdTMwNmVcdTMwZTZcdTMwZmNcdTMwYjZcdTMwNmVcdTRlMDBcdTg5YTcKK3VzZXJzLmRlbGV0ZUdyb3Vwcy50aXRsZT1cdTY1ZTJcdTViNThcdTMwNmVcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTMwNmVcdTUyNGFcdTk2NjQKK3VzZXJzLmRlbGV0ZVJvbGVzLnRpdGxlPVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzA2ZVx1NTI0YVx1OTY2NAordXNlcnMuZGVsZXRlVXNlcnMudGl0bGU9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGU2XHUzMGZjXHUzMGI2XHUzMDZlXHU1MjRhXHU5NjY0Cit1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0PVx1NWM1ZVx1NjAyN1x1MzA2ZVx1NTZkZVx1NWZhOVx1NjY0Mlx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZiB7MH0KK3VzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQ9XHU1YzVlXHU2MDI3XHUzMDZlXHU1OTA5XHU2NmY0XHU2NjQyXHUzMDZiXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmIHswfQordXNlcnMuZXJyb3IuaW52b2tlPVx1MzBhYVx1MzBkYVx1MzBlY1x1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZVx1OGQ3N1x1NTJkNVx1NjY0Mlx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZiB7MH0KK3VzZXJzLmVycm9yLmdyb3VwbmFtZS5yZXF1aXJlZD1cdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTU0MGRcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK3VzZXJzLmVycm9yLnBhc3N3b3JkLnJlcXVpcmVkPVx1MzBkMVx1MzBiOVx1MzBlZlx1MzBmY1x1MzBjOVx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MwordXNlcnMuZXJyb3IucXVvdGVzPVx1MzBjMFx1MzBkNlx1MzBlYlx1MzBhZlx1MzBhOVx1MzBmY1x1MzBjOFx1MzA2Zlx1MzAwMVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBlYlx1MzBjOVx1NTAyNFx1MzA2Ylx1NTIyOVx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MwordXNlcnMuZXJyb3Iucm9sZW5hbWUucmVxdWlyZWQ9XHUzMGVkXHUzMGZjXHUzMGViXHU1NDBkXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCit1c2Vycy5lcnJvci5zZWxlY3Q9XHU3YmExXHU3NDA2XHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDZlXHU5MDc4XHU2MjllXHU2NjQyXHUzMDZiXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCit1c2Vycy5lcnJvci50b2tlbj1cdTRlMGRcdTkwNjlcdTUyMDdcdTMwNmFcdTMwYzhcdTMwZTlcdTMwZjNcdTMwYjZcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNGNcdTc2N2FcdTg4NGNcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWYKK3VzZXJzLmVycm9yLnVzZXJuYW1lLnJlcXVpcmVkPTxsaT5cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGRcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgordXNlcnMuZ3JvdXAubmV3R3JvdXA9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMDZlXHU0ZjVjXHU2MjEwCit1c2Vycy5ncm91cC5vbGRHcm91cD1cdTY1ZTJcdTViNThcdTMwNmVcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTdkZThcdTk2YzYKK3VzZXJzLmdyb3VwLnByb3BlcnRpZXM9XHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzCit1c2Vycy5saXN0LmRlc2NyaXB0aW9uPVx1OGFhY1x1NjYwZQordXNlcnMubGlzdC5mdWxsTmFtZT1cdTMwZDVcdTMwZWJcdTMwY2RcdTMwZmNcdTMwZTAKK3VzZXJzLmxpc3QuZ3JvdXBuYW1lPVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1NTQwZAordXNlcnMubGlzdC5yb2xlbmFtZT1cdTMwZWRcdTMwZmNcdTMwZWJcdTU0MGQKK3VzZXJzLmxpc3QudXNlcm5hbWU9XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkCit1c2Vycy5saXN0R3JvdXBzLnRpdGxlPVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1NGUwMFx1ODlhNwordXNlcnMubGlzdFJvbGVzLnRpdGxlPVx1MzBlZFx1MzBmY1x1MzBlYlx1NGUwMFx1ODlhNwordXNlcnMubGlzdFVzZXJzLnRpdGxlPVx1MzBlNlx1MzBmY1x1MzBiNlx1NGUwMFx1ODlhNwordXNlcnMucHJvbXB0LmRlc2NyaXB0aW9uPVx1OGFhY1x1NjYwZToKK3VzZXJzLnByb21wdC5mdWxsTmFtZT1cdTMwZDVcdTMwZWJcdTMwY2RcdTMwZmNcdTMwZTA6Cit1c2Vycy5wcm9tcHQuZ3JvdXBuYW1lPVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1NTQwZDoKK3VzZXJzLnByb21wdC5wYXNzd29yZD1cdTMwZDFcdTMwYjlcdTMwZWZcdTMwZmNcdTMwYzk6Cit1c2Vycy5wcm9tcHQucm9sZW5hbWU9XHUzMGVkXHUzMGZjXHUzMGViXHU1NDBkOgordXNlcnMucHJvbXB0LnVzZXJuYW1lPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZDoKK3VzZXJzLnJvbGUubmV3Um9sZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZWRcdTMwZmNcdTMwZWJcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTRmNWNcdTYyMTAKK3VzZXJzLnJvbGUub2xkUm9sZT1cdTY1ZTJcdTViNThcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTdkZThcdTk2YzYKK3VzZXJzLnJvbGUucHJvcGVydGllcz1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK3VzZXJzLnRyZWVCdWlsZGVyLmdyb3Vwc05vZGU9XHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3Cit1c2Vycy50cmVlQnVpbGRlci5yb2xlc05vZGU9XHUzMGVkXHUzMGZjXHUzMGViCit1c2Vycy50cmVlQnVpbGRlci5zdWJ0cmVlTm9kZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTViOWFcdTdmYTkKK3VzZXJzLnRyZWVCdWlsZGVyLnVzZXJzTm9kZT1cdTMwZTZcdTMwZmNcdTMwYjYKK3VzZXJzLnVzZXIubmV3VXNlcj1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZTZcdTMwZmNcdTMwYjZcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTRmNWNcdTYyMTAKK3VzZXJzLnVzZXIub2xkVXNlcj1cdTY1ZTJcdTViNThcdTMwNmVcdTMwZTZcdTMwZmNcdTMwYjZcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTdkZThcdTk2YzYKK3VzZXJzLnVzZXIucHJvcGVydGllcz1cdTMwZTZcdTMwZmNcdTMwYjZcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKKyMgLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQXBwbGljYXRpb25TZXJ2bGV0LmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQXBwbGljYXRpb25TZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyYTM4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9BcHBsaWNhdGlvblNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiBTdWJjbGFzcyBvZiBBY3Rpb25TZXJ2bGV0IHRoYXQgYWRkcyBjYWNoaW5nIG9mIHRoZSBzdXBwb3J0ZWQgbG9jYWxlcyBpbiB0aGUKKyAqIEFwcGxpY2F0aW9uTG9jYWxlcyBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgTHVieQorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb25TZXJ2bGV0IGV4dGVuZHMgQWN0aW9uU2VydmxldCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hbmlmZXN0IENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXBwbGljYXRpb24gc2NvcGUga2V5IHVuZGVyIHdoaWNoIHdlIHN0b3JlIG91cgorICAgICAqIDxjb2RlPkFwcGxpY2F0aW9uTG9jYWxlczwvY29kZT4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxFU19LRVkgPSAiYXBwbGljYXRpb25Mb2NhbGVzIjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBtYW5hZ2VkIGJlYW5zIFJlZ2lzdHJ5IHVzZWQgdG8gbG9vayB1cCBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSk1YIE1CZWFuU2VydmVyIHdlIHdpbGwgdXNlIHRvIGxvb2sgdXAgbWFuYWdlbWVudCBiZWFucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTUJlYW5TZXJ2ZXIgc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBtYWtlIHRoZSBtYW5hZ2VkIGJlYW5zIFJlZ2lzdHJ5IGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiB0aGUgUmVnaXN0cnkgaXMgbm90IGF2YWlsYWJsZQorICAgICAqLworICAgIHB1YmxpYyBSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocmVnaXN0cnkgPT0gbnVsbCkKKyAgICAgICAgICAgIGluaXRSZWdpc3RyeSgpOworICAgICAgICByZXR1cm4gKHRoaXMucmVnaXN0cnkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gbWFrZSB0aGUgSk1YIE1CZWFuU2VydmVyIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiB0aGUgTUJlYW5TZXJ2ZXIgaXMgbm90IGF2YWlsYWJsZQorICAgICAqLworICAgIHB1YmxpYyBNQmVhblNlcnZlciBnZXRTZXJ2ZXIoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHNlcnZlciA9PSBudWxsKQorICAgICAgICAgICAgaW5pdFNlcnZlcigpOworICAgICAgICByZXR1cm4gKHRoaXMuc2VydmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYW4gaW5pdGlhbGl6YXRpb24gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuaW5pdCgpOworICAgICAgICBpbml0QXBwbGljYXRpb25Mb2NhbGVzKCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgQXBwbGljYXRpb25Mb2NhbGVzIG9iamVjdCwgYW5kIG1ha2UgaXQKKyAgICAgKiBhdmFpbGFibGUgYXMgYSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGluaXRBcHBsaWNhdGlvbkxvY2FsZXMoKSB7CisKKyAgICAgICAgQXBwbGljYXRpb25Mb2NhbGVzIGxvY2FsZXMgPSBuZXcgQXBwbGljYXRpb25Mb2NhbGVzKHRoaXMpOworICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZShMT0NBTEVTX0tFWSwgbG9jYWxlcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBleGlzdGVuY2Ugb2YgdGhlIFJlZ2lzdHJ5IHRoYXQgc2hvdWxkIGhhdmUgYmVlbgorICAgICAqIHByb3ZpZGVkIHRvIHVzIGJ5IGFuIGluc3RhbmNlIG9mCisgICAgICogPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbi5TZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcjwvY29kZT4KKyAgICAgKiBlbmFibGVkIGF0IHN0YXJ0dXAgdGltZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiB3ZSBjYW5ub3QgZmluZCB0aGUgUmVnaXN0cnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UmVnaXN0cnkoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVnaXN0cnkgPSBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKTsKKworICAgICAgICBpZiAocmVnaXN0cnkgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbmF2YWlsYWJsZUV4Y2VwdGlvbigiUmVnaXN0cnkgaXMgbm90IGF2YWlsYWJsZSIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgZXhpc3RlbmNlIG9mIHRoZSBNQmVhblNlcnZlciB0aGF0IHNob3VsZCBoYXZlIGJlZW4KKyAgICAgKiBwcm92aWRlZCB0byB1cyBieSBhbiBpbnN0YW5jZSBvZgorICAgICAqIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW4uU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXI8L2NvZGU+CisgICAgICogZW5hYmxlZCBhdCBzdGFydHVwIHRpbWUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgd2UgY2Fubm90IGZpbmQgdGhlIE1CZWFuU2VydmVyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdFNlcnZlcigpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBzZXJ2ZXIgPSBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS5nZXRNQmVhblNlcnZlcigpOworICAgICAgICAvLyhNQmVhblNlcnZlcikgZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGUKKyAgICAgICAgLy8gICAgKCJvcmcuYXBhY2hlLmNhdGFsaW5hLk1CZWFuU2VydmVyIik7CisgICAgICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbmF2YWlsYWJsZUV4Y2VwdGlvbigiTUJlYW5TZXJ2ZXIgaXMgbm90IGF2YWlsYWJsZSIpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9BdHRyaWJ1dGVUYWcuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9BdHRyaWJ1dGVUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmI0NzBjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0F0dHJpYnV0ZVRhZy5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BXcml0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuUGFnZUNvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ1N1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Qcm9wZXJ0eVV0aWxzOworCisKKworLyoqCisgKiBDdXN0b20gdGFnIHRoYXQgcmV0cmlldmVzIGEgSk1YIE1CZWFuIGF0dHJpYnV0ZSB2YWx1ZSwgYW5kIHdyaXRlcyBpdAorICogb3V0IHRvIHRoZSBjdXJyZW50IG91dHB1dCBzdHJlYW0uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBBdHRyaWJ1dGVUYWcgZXh0ZW5kcyBUYWdTdXBwb3J0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBhdHRyaWJ1dGUgbmFtZSBvbiB0aGUgSk1YIE1CZWFuIHRvIGJlIHJldHJpZXZlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmF0dHJpYnV0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGUpIHsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgYmVhbiBuYW1lIHRvIGJlIHJldHJpZXZlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5IG5hbWUgdG8gYmUgcmV0cmlldmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvcGVydHkgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnByb3BlcnR5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHNjb3BlIGluIHdoaWNoIHRoZSBiZWFuIHNob3VsZCBiZSBzZWFyY2hlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNjb3BlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zY29wZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7CisgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgdGhlIEpNWCBNQmVhbiBhdHRyaWJ1dGUgaWRlbnRpZmllZCBieSB0aGlzIHRhZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBKc3BFeGNlcHRpb24gaWYgYSBwcm9jZXNzaW5nIGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRvRW5kVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUmV0cmlldmUgdGhlIG9iamVjdCBuYW1lIGlkZW50aWZpZWQgYnkgb3VyIGF0dHJpYnV0ZXMKKyAgICAgICAgT2JqZWN0IGJlYW4gPSBudWxsOworICAgICAgICBpZiAoc2NvcGUgPT0gbnVsbCkgeworICAgICAgICAgICAgYmVhbiA9IHBhZ2VDb250ZXh0LmZpbmRBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgIH0gZWxzZSBpZiAoInBhZ2UiLmVxdWFsc0lnbm9yZUNhc2Uoc2NvcGUpKSB7CisgICAgICAgICAgICBiZWFuID0gcGFnZUNvbnRleHQuZ2V0QXR0cmlidXRlKG5hbWUsIFBhZ2VDb250ZXh0LlBBR0VfU0NPUEUpOworICAgICAgICB9IGVsc2UgaWYgKCJyZXF1ZXN0Ii5lcXVhbHNJZ25vcmVDYXNlKHNjb3BlKSkgeworICAgICAgICAgICAgYmVhbiA9IHBhZ2VDb250ZXh0LmdldEF0dHJpYnV0ZShuYW1lLCBQYWdlQ29udGV4dC5SRVFVRVNUX1NDT1BFKTsKKyAgICAgICAgfSBlbHNlIGlmICgic2Vzc2lvbiIuZXF1YWxzSWdub3JlQ2FzZShzY29wZSkpIHsKKyAgICAgICAgICAgIGJlYW4gPSBwYWdlQ29udGV4dC5nZXRBdHRyaWJ1dGUobmFtZSwgUGFnZUNvbnRleHQuU0VTU0lPTl9TQ09QRSk7CisgICAgICAgIH0gZWxzZSBpZiAoImFwcGxpY2F0aW9uIi5lcXVhbHNJZ25vcmVDYXNlKHNjb3BlKSkgeworICAgICAgICAgICAgYmVhbiA9IHBhZ2VDb250ZXh0LmdldEF0dHJpYnV0ZShuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWdlQ29udGV4dC5BUFBMSUNBVElPTl9TQ09QRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCJJbnZhbGlkIHNjb3BlIHZhbHVlICciICsgc2NvcGUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIGlmIChiZWFuID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oIk5vIGJlYW4gJyIgKyBuYW1lICsgIicgZm91bmQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiZWFuID0gUHJvcGVydHlVdGlscy5nZXRQcm9wZXJ0eShiZWFuLCBwcm9wZXJ0eSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKCJFeGNlcHRpb24gcmV0cmlldmluZyBwcm9wZXJ0eSAnIiArIHByb3BlcnR5ICsgIic6ICIgKyB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiZWFuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCJObyBwcm9wZXJ0eSAnIiArIHByb3BlcnR5ICsgIicgZm91bmQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnZlcnQgdG8gYW4gb2JqZWN0IG5hbWUgYXMgbmVjZXNzYXJ5CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGJlYW4gaW5zdGFuY2VvZiBPYmplY3ROYW1lKSB7CisgICAgICAgICAgICAgICAgb25hbWUgPSAoT2JqZWN0TmFtZSkgYmVhbjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYmVhbiBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoKFN0cmluZykgYmVhbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoYmVhbi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oIkV4Y2VwdGlvbiBjcmVhdGluZyBvYmplY3QgbmFtZSBmb3IgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuICsgIic6ICIgKyB0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gb3VyIE1CZWFuU2VydmVyCisgICAgICAgIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPQorICAgICAgICAgICAgKE1CZWFuU2VydmVyKSBwYWdlQ29udGV4dC5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICgib3JnLmFwYWNoZS5jYXRhbGluYS5NQmVhblNlcnZlciIsIFBhZ2VDb250ZXh0LkFQUExJQ0FUSU9OX1NDT1BFKTsKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oIk1CZWFuU2VydmVyIGlzIG5vdCBhdmFpbGFibGUiKTsKKworICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgTUJlYW4KKyAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbHVlID0gbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCJFeGNlcHRpb24gcmV0cmlldmluZyBhdHRyaWJ1dGUgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgKyAiJyBmcm9tIG1iZWFuICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25hbWUudG9TdHJpbmcoKSArICInIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW5kZXIgdGhpcyB2YWx1ZSB0byBvdXIgY3VycmVudCBvdXRwdXQgd3JpdGVyCisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBKc3BXcml0ZXIgb3V0ID0gcGFnZUNvbnRleHQuZ2V0T3V0KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG91dC5wcmludCh2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiSU9FeGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEV2YWx1YXRlIHRoZSByZW1haW5kZXIgb2YgdGhpcyBwYWdlCisgICAgICAgIHJldHVybiAoRVZBTF9QQUdFKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVsZWFzZSBhbGwgY3VycmVudCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworCisgICAgICAgIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIG5hbWUgPSBudWxsOworICAgICAgICBwcm9wZXJ0eSA9IG51bGw7CisgICAgICAgIHNjb3BlID0gbnVsbDsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQ29tbWl0Q2hhbmdlc0FjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0NvbW1pdENoYW5nZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDdhMWZiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0NvbW1pdENoYW5nZXNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW47CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5BY3Rpb248L3N0cm9uZz4gdGhhdCBzYXZlcyB0aGUgY3VycmVudCBzZXR0aW5ncworICogYW5kIHdyaXRlcyB0aGVtIG91dCB0byBzZXJ2ZXIueG1sCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIENvbW1pdENoYW5nZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKworICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgIE9iamVjdE5hbWUgc25hbWUgPSBudWxsOyAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgc25hbWUgPSBuZXcgT2JqZWN0TmFtZShUb21jYXRUcmVlQnVpbGRlci5ERUZBVUxUX0RPTUFJTiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5TRVJWRVJfVFlQRSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJDb3VsZCBub3QgZ2V0IFNlcnZlciBPYmplY3QiOworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZyhtZXNzYWdlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULCBtZXNzYWdlKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9ICJzdG9yZUNvbmZpZyI7CisgICAgICAgdHJ5IHsgICAgICAgICAgIAorICAgICAgICAgICAgbUJTZXJ2ZXIuaW52b2tlKHNuYW1lLCBvcGVyYXRpb24sIG51bGwsIG51bGwpOyAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAKKworICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKCJEZWJ1Z2dpbmcgLS0gY2hhbmdlcyBzYXZlZCB0byBjb25mL3NlcnZlci54bWwiKTsKKyAgICAgICAgLy8gRm9yd2FyZCBjb250cm9sIGJhY2sgdG8gdGhlIGJhbm5lcgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkJhbm5lciIpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vRGF0YVRhZy5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0RhdGFUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDlkZWRlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0RhdGFUYWcuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Cb2R5VGFnU3VwcG9ydDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnOworCisKKy8qKgorICogPHA+TmVzdGVkIHRhZyB0aGF0IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCAiZGF0YSIgZm9yIGEgcm93LiAgVGhpcyB0YWcKKyAqIGlzIHZhbGlkIDxzdHJvbmc+b25seTwvc3Ryb25nPiB3aGVuIG5lc3RlZCB3aXRoaW4gYSBSb3dUYWcgdGFnLgorICoKKyAqIDxwPkluIGFkZGl0aW9uLCB0aGUgYm9keSBjb250ZW50IG9mIHRoaXMgdGFnIGlzIHVzZWQgYXMgdGhlIHVzZXItdmlzaWJsZQorICogZGF0YSBmb3IgdGhlIGFjdGlvbiwgc28gdGhhdCBpdCBtYXkgYmUgY29udmVuaWVudGx5IGxvY2FsaXplZC48L3A+CisgKgorICogPHN0cm9uZz5GSVhNRTwvc3Ryb25nPiAtIEludGVybmF0aW9uYWxpemUgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlcyEKKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK3B1YmxpYyBjbGFzcyBEYXRhVGFnIGV4dGVuZHMgQm9keVRhZ1N1cHBvcnQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRhdGEgdGhhdCB3aWxsIGJlIHJlbmRlcmVkIGZvciB0aGlzIHRhYmxlIHJvdy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRhdGEgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3RhcnQgb2YgdGhpcyB0YWcuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEpzcEV4Y2VwdGlvbiBpZiBhIEpTUCBleGNlcHRpb24gaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIGludCBkb1N0YXJ0VGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgaG9sZGVyIGZvciBvdXIgZGF0YSB0ZXh0CisgICAgICAgIHRoaXMuZGF0YSA9IG51bGw7CisKKyAgICAgICAgLy8gRG8gbm8gZnVydGhlciBwcm9jZXNzaW5nIGZvciBub3cKKyAgICAgICAgcmV0dXJuIChFVkFMX0JPRFlfQlVGRkVSRUQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBib2R5IHRleHQgb2YgdGhpcyB0YWcgKGlmIGFueSkuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEpzcEV4Y2VwdGlvbiBpZiBhIEpTUCBleGNlcHRpb24gaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIGludCBkb0FmdGVyQm9keSgpIHRocm93cyBKc3BFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBkYXRhID0gYm9keUNvbnRlbnQuZ2V0U3RyaW5nKCk7CisgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhLnRyaW0oKTsKKyAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoU0tJUF9CT0RZKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoaXMgYWN0aW9uIHdpdGggb3VyIHN1cnJvdW5kaW5nIEFjdGlvbnNUYWcgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEpzcEV4Y2VwdGlvbiBpZiBhIHByb2Nlc3NpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGludCBkb0VuZFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworCisgICAgICAgIC8vIEZpbmQgb3VyIHBhcmVudCBBY3Rpb25zVGFnIGluc3RhbmNlCisgICAgICAgIFRhZyBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKKyAgICAgICAgaWYgKChwYXJlbnQgPT0gbnVsbCkgfHwgIShwYXJlbnQgaW5zdGFuY2VvZiBSb3dUYWcpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiTXVzdCBiZSBuZXN0ZWQgaW4gYSByb3dUYWcgaXNudGFuY2UiKTsKKyAgICAgICAgUm93VGFnIHJvdyA9IChSb3dUYWcpIHBhcmVudDsKKworICAgICAgICAvLyBSZWdpc3RlciB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkKKyAgICAgICAgLy8gdGhpcyBhY3Rpb24KKyAgICAgICAgcm93LnNldERhdGEoZGF0YSk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gKEVWQUxfUEFHRSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgYWxsIHN0YXRlIGluZm9ybWF0aW9uIHNldCBieSB0aGlzIHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworCisgICAgICAgIHRoaXMuZGF0YSA9IG51bGw7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9EdW1wUmVnaXN0cnlBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9EdW1wUmVnaXN0cnlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzJkZDExCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0R1bXBSZWdpc3RyeUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW47CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5NYW5hZ2VkQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogU2ltcGxlIGRlYnVnZ2luZyBhY3Rpb24gdGhhdCBkdW1wcyBhIGxpc3Qgb2YgdGhlIG1hbmFnZWQgYmVhbnMgdGhhdCBhcmUKKyAqIHZpc2libGUgaW4gb3VyIFJlZ2lzdHJ5LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgRHVtcFJlZ2lzdHJ5QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCBhdHRyaWJ1dGUgd2l0aCBvdXIgY29sbGVjdGlvbiBvZiBiZWFucworICAgICAgICBSZWdpc3RyeSByZWdpc3RyeSA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFJlZ2lzdHJ5KCk7CisgICAgICAgIFN0cmluZyBuYW1lc1tdID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFucygpOworICAgICAgICBBcnJheXMuc29ydChuYW1lcyk7CisgICAgICAgIE1hbmFnZWRCZWFuIGJlYW5zW10gPSBuZXcgTWFuYWdlZEJlYW5bbmFtZXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGJlYW5zW2ldID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG5hbWVzW2ldKTsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoImJlYW5zIiwgYmVhbnMpOworCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiRHVtcCBSZWdpc3RyeSBSZXN1bHRzIikpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9EdW1wU2VydmVyQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vRHVtcFNlcnZlckFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OWNiZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vRHVtcFNlcnZlckFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW47CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworCisvKioKKyAqIFNpbXBsZSBkZWJ1Z2dpbmcgYWN0aW9uIHRoYXQgZHVtcHMgYSBsaXN0IG9mIHRoZSBNQmVhbnMgdGhhdCBhcmUKKyAqIHZpc2libGUgaW4gb3VyIE1CZWFuU2VydmVyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgRHVtcFNlcnZlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSBhIHJlcXVlc3QgYXR0cmlidXRlIHdpdGggb3VyIGNvbGxlY3Rpb24gb2YgTUJlYW5zCisgICAgICAgIE1CZWFuU2VydmVyIHNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICBJdGVyYXRvciBuYW1lcyA9IHNlcnZlci5xdWVyeU5hbWVzKG51bGwsIG51bGwpLml0ZXJhdG9yKCk7CisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBsaXN0LmFkZChuYW1lcy5uZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIm5hbWVzIiwgbGlzdCk7CisKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgY29ycmVzcG9uZGluZyBkaXNwbGF5IHBhZ2UKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJEdW1wIFNlcnZlciBSZXN1bHRzIikpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9MYWJlbFRhZy5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0xhYmVsVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3MDM4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9MYWJlbFRhZy5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkJvZHlUYWdTdXBwb3J0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWc7CisKKworLyoqCisgKiA8cD5OZXN0ZWQgdGFnIHRoYXQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsICJsYWJlbHMiIGZvciBhIHJvdy4gIFRoaXMgdGFnCisgKiBpcyB2YWxpZCA8c3Ryb25nPm9ubHk8L3N0cm9uZz4gd2hlbiBuZXN0ZWQgd2l0aGluIGEgUm93VGFnIHRhZy4KKyAqCisgKiA8cD5JbiBhZGRpdGlvbiwgdGhlIGJvZHkgY29udGVudCBvZiB0aGlzIHRhZyBpcyB1c2VkIGFzIHRoZSB1c2VyLXZpc2libGUKKyAqIGxhYmVsIGZvciB0aGUgYWN0aW9uLCBzbyB0aGF0IGl0IG1heSBiZSBjb252ZW5pZW50bHkgbG9jYWxpemVkLjwvcD4KKyAqCisgKiA8c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gSW50ZXJuYXRpb25hbGl6ZSB0aGUgZXhjZXB0aW9uIG1lc3NhZ2VzIQorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKworcHVibGljIGNsYXNzIExhYmVsVGFnIGV4dGVuZHMgQm9keVRhZ1N1cHBvcnQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGxhYmVsIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBmb3IgdGhpcyBhY3Rpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBsYWJlbCA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzdGFydCBvZiB0aGlzIHRhZy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSnNwRXhjZXB0aW9uIGlmIGEgSlNQIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRvU3RhcnRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBob2xkZXIgZm9yIG91ciBsYWJlbCB0ZXh0CisgICAgICAgIHRoaXMubGFiZWwgPSBudWxsOworCisgICAgICAgIC8vIERvIG5vIGZ1cnRoZXIgcHJvY2Vzc2luZyBmb3Igbm93CisgICAgICAgIHJldHVybiAoRVZBTF9CT0RZX0JVRkZFUkVEKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgYm9keSB0ZXh0IG9mIHRoaXMgdGFnIChpZiBhbnkpLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBKc3BFeGNlcHRpb24gaWYgYSBKU1AgZXhjZXB0aW9uIGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZG9BZnRlckJvZHkoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbGFiZWwgPSBib2R5Q29udGVudC5nZXRTdHJpbmcoKTsKKyAgICAgICAgaWYgKGxhYmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxhYmVsID0gbGFiZWwudHJpbSgpOworICAgICAgICAgICAgaWYgKGxhYmVsLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChTS0lQX0JPRFkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhpcyBhY3Rpb24gd2l0aCBvdXIgc3Vycm91bmRpbmcgQWN0aW9uc1RhZyBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSnNwRXhjZXB0aW9uIGlmIGEgcHJvY2Vzc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRvRW5kVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRmluZCBvdXIgcGFyZW50IEFjdGlvbnNUYWcgaW5zdGFuY2UKKyAgICAgICAgVGFnIHBhcmVudCA9IGdldFBhcmVudCgpOworICAgICAgICBpZiAoKHBhcmVudCA9PSBudWxsKSB8fCAhKHBhcmVudCBpbnN0YW5jZW9mIFJvd1RhZykpCisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCJNdXN0IGJlIG5lc3RlZCBpbiBhIHJvd1RhZyBpc250YW5jZSIpOworICAgICAgICBSb3dUYWcgcm93ID0gKFJvd1RhZykgcGFyZW50OworCisgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGFjdGlvbiByZXByZXNlbnRlZCBieQorICAgICAgICAvLyB0aGlzIGFjdGlvbgorICAgICAgICByb3cuc2V0TGFiZWwobGFiZWwpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIChFVkFMX1BBR0UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIGFsbCBzdGF0ZSBpbmZvcm1hdGlvbiBzZXQgYnkgdGhpcyB0YWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKworICAgICAgICB0aGlzLmxhYmVsID0gbnVsbDsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0xhYmVsVmFsdWVCZWFuLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vTGFiZWxWYWx1ZUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmZmNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0xhYmVsVmFsdWVCZWFuLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisvKioKKyAqIFNpbXBsZSBKYXZhQmVhbiB0byByZXByZXNlbnQgbGFiZWwtdmFsdWUgcGFpcnMgZm9yIHVzZSBpbiBjb2xsZWN0aW9ucworICogdGhhdCBhcmUgdXRpbGl6ZWQgYnkgdGhlIDxjb2RlPiZsdDtmb3JtOm9wdGlvbnMmZ3Q7PC9jb2RlPiB0YWcuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBMYWJlbFZhbHVlQmVhbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgTGFiZWxWYWx1ZUJlYW4gd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCB0byB0aGUgc2VydmVyCisgICAgICovCisgICAgcHVibGljIExhYmVsVmFsdWVCZWFuKFN0cmluZyBsYWJlbCwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBsYWJlbCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBsYWJlbCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubGFiZWwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIHRvIHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJMYWJlbFZhbHVlQmVhblsiKTsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMubGFiZWwpOworICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9MaXN0cy5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0xpc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxNTUyYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9MaXN0cy5qYXZhCkBAIC0wLDAgKzEsNjI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKKworLyoqCisgKiBHZW5lcmFsIHB1cnBvc2UgdXRpbGl0eSBtZXRob2RzIHRvIGNyZWF0ZSBsaXN0cyBvZiBvYmplY3RzIHRoYXQgYXJlCisgKiBjb21tb25seSByZXF1aXJlZCBpbiBidWlsZGluZyB0aGUgdXNlciBpbnRlcmZhY2UuICBJbiBhbGwgY2FzZXMsIGlmIHRoZXJlCisgKiBhcmUgbm8gbWF0Y2hpbmcgZWxlbWVudHMsIGEgemVyby1sZW5ndGggbGlzdCAocmF0aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4pCisgKiBpcyByZXR1cm5lZC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgTGlzdHMgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogUHJvdGVjdGVkIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlzdHMoKSB7IH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFByZWNvbXB1dGVkIGxpc3Qgb2YgdmVyYm9zaXR5IGxldmVsIGxhYmVscyBhbmQgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIExpc3QgdmVyYm9zaXR5TGV2ZWxzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgdmVyYm9zaXR5TGV2ZWxzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4oIjAiLCAiMCIpKTsKKyAgICAgICAgdmVyYm9zaXR5TGV2ZWxzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4oIjEiLCAiMSIpKTsKKyAgICAgICAgdmVyYm9zaXR5TGV2ZWxzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4oIjIiLCAiMiIpKTsKKyAgICAgICAgdmVyYm9zaXR5TGV2ZWxzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4oIjMiLCAiMyIpKTsKKyAgICAgICAgdmVyYm9zaXR5TGV2ZWxzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4oIjQiLCAiNCIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVjb21wdXRlZCBsaXN0IG9mICh0cnVlLGZhbHNlKSBsYWJlbHMgYW5kIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0IGJvb2xlYW5WYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICAgICAgYm9vbGVhblZhbHVlcy5hZGQobmV3IExhYmVsVmFsdWVCZWFuKCJUcnVlIiwgInRydWUiKSk7CisgICAgICAgICAgICBib29sZWFuVmFsdWVzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4oIkZhbHNlIiwgImZhbHNlIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZWNvbXB1dGVkIGxpc3Qgb2YgY2xpZW50QXV0aCBsYWJsZXMgYW5kIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0IGNsaWVudEF1dGhWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICAgICAgY2xpZW50QXV0aFZhbHVlcy5hZGQobmV3IExhYmVsVmFsdWVCZWFuKCJUcnVlIiwidHJ1ZSIpKTsKKyAgICAgICAgICAgIGNsaWVudEF1dGhWYWx1ZXMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbigiRmFsc2UiLCJmYWxzZSIpKTsKKyAgICAgICAgICAgIGNsaWVudEF1dGhWYWx1ZXMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbigiV2FudCIsIndhbnQiKSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHtAbGluayBMYWJlbFZhbHVlQmVhbn1zIGZvciB0aGUgbGVnYWwKKyAgICAgKiBzZXR0aW5ncyBmb3IgPGNvZGU+dmVyYm9zaXR5PC9jb2RlPiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRWZXJib3NpdHlMZXZlbHMoKSB7CisKKyAgICAgICAgcmV0dXJuICh2ZXJib3NpdHlMZXZlbHMpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgPGNvZGU+TGlzdDwvY29kZT4gb2Yge0BsaW5rIExhYmVsVmFsdWVCZWFufXMgZm9yIHRoZSBsZWdhbAorICAgICAqIHNldHRpbmdzIGZvciA8Y29kZT5ib29sZWFuPC9jb2RlPiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRCb29sZWFuVmFsdWVzKCkgeworCisgICAgICAgIHJldHVybiAoYm9vbGVhblZhbHVlcyk7CisKKyAgICB9CisgICAgLyoqCisgICAgICogUmV0dXJuIGEgPGNvZGU+TGlzdDwvY29kZT4gb2Yge0BsaW5rIExhYmVsVmFsdWVCZWFufXMgZm9yIHRoZSBsZWdhbAorICAgICAqIHNldHRpbmdzIGZvciA8Y29kZT5jbGllbnRBdXRoPC9jb2RlPiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDbGllbnRBdXRoVmFsdWVzKCkgeworCisgICAgICAgIHJldHVybiAoY2xpZW50QXV0aFZhbHVlcyk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIDxjb2RlPkNvbm5lY3RvcjwvY29kZT4gb2JqZWN0IG5hbWUgc3RyaW5ncworICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIDxjb2RlPlNlcnZpY2U8L2NvZGU+IG9iamVjdCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG1ic2VydmVyIE1CZWFuU2VydmVyIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VydmljZSBPYmplY3QgbmFtZSBvZiB0aGUgc2VydmljZSBmb3Igd2hpY2ggdG8gc2VsZWN0IGNvbm5lY3RvcnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIHRocm93biB3aGlsZSByZXRyaWV2aW5nIHRoZSBsaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldENvbm5lY3RvcnMoTUJlYW5TZXJ2ZXIgbWJzZXJ2ZXIsIE9iamVjdE5hbWUgc2VydmljZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzZXJ2aWNlLmdldERvbWFpbigpKTsKKyAgICAgICAgc2IuYXBwZW5kKCI6dHlwZT1Db25uZWN0b3IsKiIpOworICAgICAgICBPYmplY3ROYW1lIHNlYXJjaCA9IG5ldyBPYmplY3ROYW1lKHNiLnRvU3RyaW5nKCkpOworICAgICAgICBBcnJheUxpc3QgY29ubmVjdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgSXRlcmF0b3IgbmFtZXMgPSBtYnNlcnZlci5xdWVyeU5hbWVzKHNlYXJjaCwgbnVsbCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgY29ubmVjdG9ycy5hZGQobmFtZXMubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoY29ubmVjdG9ycyk7CisgICAgICAgIHJldHVybiAoY29ubmVjdG9ycyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgPGNvZGU+Q29ubmVjdG9yPC9jb2RlPiBvYmplY3QgbmFtZSBzdHJpbmdzCisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgPGNvZGU+U2VydmljZTwvY29kZT4gb2JqZWN0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWJzZXJ2ZXIgTUJlYW5TZXJ2ZXIgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgbGlzdAorICAgICAqIEBwYXJhbSBzZXJ2aWNlIE9iamVjdCBuYW1lIG9mIHRoZSBzZXJ2aWNlIGZvciB3aGljaCB0byBzZWxlY3QgY29ubmVjdG9ycworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhyb3duIHdoaWxlIHJldHJpZXZpbmcgdGhlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q29ubmVjdG9ycyhNQmVhblNlcnZlciBtYnNlcnZlciwgU3RyaW5nIHNlcnZpY2UpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHJldHVybiAoZ2V0Q29ubmVjdG9ycyhtYnNlcnZlciwgbmV3IE9iamVjdE5hbWUoc2VydmljZSkpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbGlzdCBvZiA8Y29kZT5Db250ZXh0PC9jb2RlPiBvYmplY3QgbmFtZSBzdHJpbmdzCisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgPGNvZGU+SG9zdDwvY29kZT4gb2JqZWN0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWJzZXJ2ZXIgTUJlYW5TZXJ2ZXIgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgbGlzdAorICAgICAqIEBwYXJhbSBob3N0IE9iamVjdCBuYW1lIG9mIHRoZSBob3N0IGZvciB3aGljaCB0byBzZWxlY3QgY29udGV4dHMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIHRocm93biB3aGlsZSByZXRyaWV2aW5nIHRoZSBsaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldENvbnRleHRzKE1CZWFuU2VydmVyIG1ic2VydmVyLCBPYmplY3ROYW1lIGhvc3QpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoaG9zdC5nZXREb21haW4oKSk7CisgICAgICAgIHNiLmFwcGVuZCgiOmoyZWVUeXBlPVdlYk1vZHVsZSwqIik7CisgICAgICAgIE9iamVjdE5hbWUgc2VhcmNoID0gbmV3IE9iamVjdE5hbWUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIEFycmF5TGlzdCBjb250ZXh0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgSXRlcmF0b3IgbmFtZXMgPSBtYnNlcnZlci5xdWVyeU5hbWVzKHNlYXJjaCwgbnVsbCkuaXRlcmF0b3IoKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGhvc3RQcmVmaXggPSAiLy8iK2hvc3QuZ2V0S2V5UHJvcGVydHkoImhvc3QiKTsKKyAgICAgICAgU3RyaW5nIGhvc3RBdHRyID0gbnVsbDsKKyAgICAgICAgd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgbmFtZSA9IG5hbWVzLm5leHQoKS50b1N0cmluZygpOworICAgICAgICAgICAgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShuYW1lKTsKKyAgICAgICAgICAgIGhvc3RBdHRyID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgICAgIGlmIChob3N0QXR0ci5zdGFydHNXaXRoKGhvc3RQcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dHMuYWRkKG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoY29udGV4dHMpOworICAgICAgICByZXR1cm4gKGNvbnRleHRzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbGlzdCBvZiA8Y29kZT5EZWZhdWx0Q29udGV4dDwvY29kZT4gb2JqZWN0IG5hbWUgc3RyaW5ncworICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIDxjb2RlPkhvc3Q8L2NvZGU+IG9iamVjdCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG1ic2VydmVyIE1CZWFuU2VydmVyIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGxpc3QKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIE9iamVjdCBuYW1lIG9mIHRoZSBjb250YWluZXIgZm9yIHdoaWNoIHRvIHNlbGVjdCBkZWZhdWx0CisgICAgICogY29udGV4dHMKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyVHlwZSBUaGUgdHlwZSBvZiB0aGUgY29udGFpbmVyIGZvciB3aGljaCB0byBzZWxlY3QgCisgICAgICogZGVmYXVsdCBjb250ZXh0cworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhyb3duIHdoaWxlIHJldHJpZXZpbmcgdGhlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGVmYXVsdENvbnRleHRzKE1CZWFuU2VydmVyIG1ic2VydmVyLCBTdHJpbmcgCisgICAgICAgIGNvbnRhaW5lcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIChnZXREZWZhdWx0Q29udGV4dHMobWJzZXJ2ZXIsIG5ldyBPYmplY3ROYW1lKGNvbnRhaW5lcikpKTsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIDxjb2RlPkRlZmF1bHRDb250ZXh0PC9jb2RlPiBvYmplY3QgbmFtZSBzdHJpbmdzCisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgPGNvZGU+SG9zdDwvY29kZT4gb2JqZWN0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWJzZXJ2ZXIgTUJlYW5TZXJ2ZXIgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgbGlzdAorICAgICAqIEBwYXJhbSBjb250YWluZXIgT2JqZWN0IG5hbWUgb2YgdGhlIGNvbnRhaW5lciBmb3Igd2hpY2ggdG8gc2VsZWN0IGRlZmF1bHQKKyAgICAgKiBjb250ZXh0cworICAgICAqIEBwYXJhbSBjb250YWluZXJUeXBlIFRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIgZm9yIHdoaWNoIHRvIHNlbGVjdCAKKyAgICAgKiBkZWZhdWx0IGNvbnRleHRzCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aHJvd24gd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXREZWZhdWx0Q29udGV4dHMoTUJlYW5TZXJ2ZXIgbWJzZXJ2ZXIsIE9iamVjdE5hbWUgCisgICAgICAgIGNvbnRhaW5lcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRklYTUUKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihjb250YWluZXIuZ2V0RG9tYWluKCkpOworICAgICAgICBzYi5hcHBlbmQoIjp0eXBlPURlZmF1bHRDb250ZXh0Iik7CisgICAgICAgIFN0cmluZyB0eXBlID0gY29udGFpbmVyLmdldEtleVByb3BlcnR5KCJ0eXBlIik7CisgICAgICAgIFN0cmluZyBob3N0ID0gY29udGFpbmVyLmdldEtleVByb3BlcnR5KCJob3N0Iik7CisgICAgICAgIGlmICgiSG9zdCIuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICBob3N0ID0gY29udGFpbmVyLmdldEtleVByb3BlcnR5KCJob3N0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsaG9zdD0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChob3N0KTsKKyAgICAgICAgfQorICAgICAgICBPYmplY3ROYW1lIHNlYXJjaCA9IG5ldyBPYmplY3ROYW1lKHNiLnRvU3RyaW5nKCkpOworICAgICAgICBBcnJheUxpc3QgZGVmYXVsdENvbnRleHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciBuYW1lcyA9IG1ic2VydmVyLnF1ZXJ5TmFtZXMoc2VhcmNoLCBudWxsKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5hbWVzLm5leHQoKS50b1N0cmluZygpOworICAgICAgICAgICAgZGVmYXVsdENvbnRleHRzLmFkZChuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGRlZmF1bHRDb250ZXh0cyk7CisgICAgICAgIHJldHVybiAoZGVmYXVsdENvbnRleHRzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbGlzdCBvZiA8Y29kZT5Db250ZXh0PC9jb2RlPiBvYmplY3QgbmFtZSBzdHJpbmdzCisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgPGNvZGU+SG9zdDwvY29kZT4gb2JqZWN0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWJzZXJ2ZXIgTUJlYW5TZXJ2ZXIgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgbGlzdAorICAgICAqIEBwYXJhbSBob3N0IE9iamVjdCBuYW1lIG9mIHRoZSBob3N0IGZvciB3aGljaCB0byBzZWxlY3QgY29udGV4dHMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIHRocm93biB3aGlsZSByZXRyaWV2aW5nIHRoZSBsaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldENvbnRleHRzKE1CZWFuU2VydmVyIG1ic2VydmVyLCBTdHJpbmcgaG9zdCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIChnZXRDb250ZXh0cyhtYnNlcnZlciwgbmV3IE9iamVjdE5hbWUoaG9zdCkpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgPGNvZGU+SG9zdDwvY29kZT4gb2JqZWN0IG5hbWUgc3RyaW5ncworICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIDxjb2RlPlNlcnZpY2U8L2NvZGU+IG9iamVjdCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG1ic2VydmVyIE1CZWFuU2VydmVyIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VydmljZSBPYmplY3QgbmFtZSBvZiB0aGUgc2VydmljZSBmb3Igd2hpY2ggdG8gc2VsZWN0IGhvc3RzCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aHJvd24gd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRIb3N0cyhNQmVhblNlcnZlciBtYnNlcnZlciwgT2JqZWN0TmFtZSBzZXJ2aWNlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHNlcnZpY2UuZ2V0RG9tYWluKCkpOworICAgICAgICBzYi5hcHBlbmQoIjp0eXBlPUhvc3QsKiIpOworICAgICAgICBPYmplY3ROYW1lIHNlYXJjaCA9IG5ldyBPYmplY3ROYW1lKHNiLnRvU3RyaW5nKCkpOworICAgICAgICBBcnJheUxpc3QgaG9zdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEl0ZXJhdG9yIG5hbWVzID0gbWJzZXJ2ZXIucXVlcnlOYW1lcyhzZWFyY2gsIG51bGwpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGhvc3RzLmFkZChuYW1lcy5uZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChob3N0cyk7CisgICAgICAgIHJldHVybiAoaG9zdHMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIDxjb2RlPkhvc3Q8L2NvZGU+IG9iamVjdCBuYW1lIHN0cmluZ3MKKyAgICAgKiBmb3IgdGhlIHNwZWNpZmllZCA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBvYmplY3QgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYnNlcnZlciBNQmVhblNlcnZlciBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBsaXN0CisgICAgICogQHBhcmFtIHNlcnZpY2UgT2JqZWN0IG5hbWUgb2YgdGhlIHNlcnZpY2UgZm9yIHdoaWNoIHRvIHNlbGVjdCBob3N0cworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhyb3duIHdoaWxlIHJldHJpZXZpbmcgdGhlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0SG9zdHMoTUJlYW5TZXJ2ZXIgbWJzZXJ2ZXIsIFN0cmluZyBzZXJ2aWNlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gKGdldEhvc3RzKG1ic2VydmVyLCBuZXcgT2JqZWN0TmFtZShzZXJ2aWNlKSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIDxjb2RlPlJlYWxtPC9jb2RlPiBvYmplY3QgbmFtZSBzdHJpbmdzCisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIChzZXJ2aWNlLCBob3N0LCBvciBjb250ZXh0KSBvYmplY3QgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYnNlcnZlciBNQmVhblNlcnZlciBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBsaXN0CisgICAgICogQHBhcmFtIGNvbnRhaW5lciBPYmplY3QgbmFtZSBvZiB0aGUgY29udGFpbmVyIGZvciB3aGljaCB0byBzZWxlY3QKKyAgICAgKiAgICAgICAgICAgICAgICAgIHJlYWxtcworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhyb3duIHdoaWxlIHJldHJpZXZpbmcgdGhlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0UmVhbG1zKE1CZWFuU2VydmVyIG1ic2VydmVyLCBPYmplY3ROYW1lIGNvbnRhaW5lcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBzZWFyY2ggPSBnZXRTZWFyY2hPYmplY3QoY29udGFpbmVyLCAiUmVhbG0iKTsKKyAgICAgICAgQXJyYXlMaXN0IHJlYWxtcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgSXRlcmF0b3IgbmFtZXMgPSBtYnNlcnZlci5xdWVyeU5hbWVzKHNlYXJjaCwgbnVsbCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgcmVhbG1zLmFkZChuYW1lcy5uZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyZWFsbXMpOworICAgICAgICByZXR1cm4gKHJlYWxtcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgPGNvZGU+UmVhbG08L2NvZGU+IG9iamVjdCBuYW1lIHN0cmluZ3MKKyAgICAgKiBmb3IgdGhlIHNwZWNpZmllZCBjb250YWluZXIgKHNlcnZpY2UsIGhvc3QsIG9yIGNvbnRleHQpIG9iamVjdCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG1ic2VydmVyIE1CZWFuU2VydmVyIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGxpc3QKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIE9iamVjdCBuYW1lIG9mIHRoZSBjb250YWluZXIgZm9yIHdoaWNoIHRvIHNlbGVjdAorICAgICAqICAgICAgICAgICAgICAgICAgcmVhbG1zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aHJvd24gd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSZWFsbXMoTUJlYW5TZXJ2ZXIgbWJzZXJ2ZXIsIFN0cmluZyBjb250YWluZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHJldHVybiAoZ2V0UmVhbG1zKG1ic2VydmVyLCBuZXcgT2JqZWN0TmFtZShjb250YWluZXIpKSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIDxjb2RlPlZhbHZlPC9jb2RlPiBvYmplY3QgbmFtZSBzdHJpbmdzCisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIChzZXJ2aWNlLCBob3N0LCBvciBjb250ZXh0KSBvYmplY3QgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYnNlcnZlciBNQmVhblNlcnZlciBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBsaXN0CisgICAgICogQHBhcmFtIGNvbnRhaW5lciBPYmplY3QgbmFtZSBvZiB0aGUgY29udGFpbmVyIGZvciB3aGljaCB0byBzZWxlY3QKKyAgICAgKiAgICAgICAgICAgICAgICAgIFZhbHZlcworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhyb3duIHdoaWxlIHJldHJpZXZpbmcgdGhlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0VmFsdmVzKE1CZWFuU2VydmVyIG1ic2VydmVyLCBPYmplY3ROYW1lIGNvbnRhaW5lcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihjb250YWluZXIuZ2V0RG9tYWluKCkpOworICAgICAgICBzYi5hcHBlbmQoIjp0eXBlPVZhbHZlIik7CisgICAgICAgIFN0cmluZyB0eXBlID0gY29udGFpbmVyLmdldEtleVByb3BlcnR5KCJ0eXBlIik7CisgICAgICAgIFN0cmluZyBqMmVlVHlwZSA9IGNvbnRhaW5lci5nZXRLZXlQcm9wZXJ0eSgiajJlZVR5cGUiKTsKKyAgICAgICAgc2IuYXBwZW5kKFRvbWNhdFRyZWVCdWlsZGVyLldJTERDQVJEKTsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSAiIjsKKyAgICAgICAgU3RyaW5nIHBhdGggPSAiIjsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBjb250YWluZXIuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgaWYgKChuYW1lICE9IG51bGwpICYmIChuYW1lLmxlbmd0aCgpID4gMCkpIHsKKyAgICAgICAgICAgIC8vIHBhcmVudCBpcyBjb250ZXh0CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMik7CisgICAgICAgICAgICBpbnQgaSA9IG5hbWUuaW5kZXhPZigiLyIpOworICAgICAgICAgICAgaG9zdCA9IG5hbWUuc3Vic3RyaW5nKDAsaSk7CisgICAgICAgICAgICBwYXRoID0gbmFtZS5zdWJzdHJpbmcoaSk7CisgICAgICAgIH0gZWxzZSBpZiAoIkhvc3QiLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgLy8gcGFyZW50IGlzIGhvc3QKKyAgICAgICAgICAgIGhvc3QgPSBjb250YWluZXIuZ2V0S2V5UHJvcGVydHkoImhvc3QiKTsKKyAgICAgICAgfSAgICAKKyAgICAgICAgCisgICAgICAgIE9iamVjdE5hbWUgc2VhcmNoID0gbmV3IE9iamVjdE5hbWUoc2IudG9TdHJpbmcoKSk7ICAgICAgICAKKyAgICAgICAgQXJyYXlMaXN0IHZhbHZlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgSXRlcmF0b3IgbmFtZXMgPSBtYnNlcnZlci5xdWVyeU5hbWVzKHNlYXJjaCwgbnVsbCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgT2JqZWN0TmFtZSB2YWx2ZSA9IChPYmplY3ROYW1lKSBuYW1lcy5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgdnBhdGggPSB2YWx2ZS5nZXRLZXlQcm9wZXJ0eSgicGF0aCIpOyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHZob3N0ID0gdmFsdmUuZ2V0S2V5UHJvcGVydHkoImhvc3QiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHZhbHZlVHlwZSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgCisgICAgICAgICAgICAgICAgICAgIG1ic2VydmVyLmdldEF0dHJpYnV0ZSh2YWx2ZSwgImNsYXNzTmFtZSIpOworICAgICAgICAgICAgaW50IHBlcmlvZCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpOworICAgICAgICAgICAgaWYgKHBlcmlvZCA+PSAwKQorICAgICAgICAgICAgICAgIHZhbHZlVHlwZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcocGVyaW9kICsgMSk7CisKKyAgICAgICAgICAgLy8gUmV0dXJuIG9ubHkgdXNlci1jb25maWd1cmFibGUgdmFsdmVzLgorICAgICAgICAgICBpZiAoIkFjY2Vzc0xvZ1ZhbHZlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHZlVHlwZSkgfHwKKyAgICAgICAgICAgICAgICJSZW1vdGVBZGRyVmFsdmUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdmVUeXBlKSB8fAorICAgICAgICAgICAgICAgIlJlbW90ZUhvc3RWYWx2ZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx2ZVR5cGUpIHx8IAorICAgICAgICAgICAgICAgIlJlcXVlc3REdW1wZXJWYWx2ZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx2ZVR5cGUpIHx8CisgICAgICAgICAgICAgICAiU2luZ2xlU2lnbk9uIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHZlVHlwZSkpIHsKKyAgICAgICAgICAgIC8vIGlmIHNlcnZpY2UgaXMgdGhlIGNvbnRhaW5lciwgdGhlbiB0aGUgdmFsdmUgbmFtZQorICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBjb250YWluIHBhdGggb3IgaG9zdCAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICgiU2VydmljZSIuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgeworICAgICAgICAgICAgICAgIGlmICgodnBhdGggPT0gbnVsbCkgJiYgKHZob3N0ID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHZlcy5hZGQodmFsdmUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCJIb3N0Ii5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKCh2cGF0aCA9PSBudWxsKSAmJiAoaG9zdC5lcXVhbHNJZ25vcmVDYXNlKHZob3N0KSkpIHsgCisgICAgICAgICAgICAgICAgICAgIHZhbHZlcy5hZGQodmFsdmUudG9TdHJpbmcoKSk7ICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIldlYk1vZHVsZSIuZXF1YWxzSWdub3JlQ2FzZShqMmVlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHBhdGguZXF1YWxzSWdub3JlQ2FzZSh2cGF0aCkpICYmIChob3N0LmVxdWFsc0lnbm9yZUNhc2Uodmhvc3QpKSkgeworICAgICAgICAgICAgICAgICAgICB2YWx2ZXMuYWRkKHZhbHZlLnRvU3RyaW5nKCkpOyAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh2YWx2ZXMpOworICAgICAgICByZXR1cm4gKHZhbHZlcyk7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbGlzdCBvZiA8Y29kZT5WYWx2ZTwvY29kZT4gb2JqZWN0IG5hbWUgc3RyaW5ncworICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciAoc2VydmljZSwgaG9zdCwgb3IgY29udGV4dCkgb2JqZWN0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWJzZXJ2ZXIgTUJlYW5TZXJ2ZXIgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgbGlzdAorICAgICAqIEBwYXJhbSBjb250YWluZXIgT2JqZWN0IG5hbWUgb2YgdGhlIGNvbnRhaW5lciBmb3Igd2hpY2ggdG8gc2VsZWN0CisgICAgICogICAgICAgICAgICAgICAgICB2YWx2ZXMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIHRocm93biB3aGlsZSByZXRyaWV2aW5nIHRoZSBsaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFZhbHZlcyhNQmVhblNlcnZlciBtYnNlcnZlciwgU3RyaW5nIGNvbnRhaW5lcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIChnZXRWYWx2ZXMobWJzZXJ2ZXIsIG5ldyBPYmplY3ROYW1lKGNvbnRhaW5lcikpKTsKKworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIDxjb2RlPlNlcnZlcjwvY29kZT4gb2JqZWN0IG5hbWUgc3RyaW5ncy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYnNlcnZlciBNQmVhblNlcnZlciBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBsaXN0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aHJvd24gd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTZXJ2ZXJzKE1CZWFuU2VydmVyIG1ic2VydmVyLCBTdHJpbmcgZG9tYWluKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIHNlYXJjaCA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbisiOnR5cGU9U2VydmVyLCoiKTsKKyAgICAgICAgQXJyYXlMaXN0IHNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEl0ZXJhdG9yIG5hbWVzID0gbWJzZXJ2ZXIucXVlcnlOYW1lcyhzZWFyY2gsIG51bGwpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHNlcnZlcnMuYWRkKG5hbWVzLm5leHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNlcnZlcnMpOworICAgICAgICByZXR1cm4gKHNlcnZlcnMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIDxjb2RlPlNlcnZpY2U8L2NvZGU+IG9iamVjdCBuYW1lIHN0cmluZ3MKKyAgICAgKiBmb3IgdGhlIHNwZWNpZmllZCA8Y29kZT5TZXJ2ZXI8L2NvZGU+IG9iamVjdCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG1ic2VydmVyIE1CZWFuU2VydmVyIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VydmVyIE9iamVjdCBuYW1lIG9mIHRoZSBzZXJ2ZXIgZm9yIHdoaWNoIHRvIHNlbGVjdCBzZXJ2aWNlcworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhyb3duIHdoaWxlIHJldHJpZXZpbmcgdGhlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0U2VydmljZXMoTUJlYW5TZXJ2ZXIgbWJzZXJ2ZXIsIE9iamVjdE5hbWUgc2VydmVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvL1N0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc2VydmVyLmdldERvbWFpbigpKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiKjp0eXBlPVNlcnZpY2UsKiIpOworICAgICAgICAvL3NiLmFwcGVuZCgiOnR5cGU9U2VydmljZSwqIik7CisgICAgICAgIE9iamVjdE5hbWUgc2VhcmNoID0gbmV3IE9iamVjdE5hbWUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgSXRlcmF0b3IgbmFtZXMgPSBtYnNlcnZlci5xdWVyeU5hbWVzKHNlYXJjaCwgbnVsbCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgc2VydmljZXMuYWRkKG5hbWVzLm5leHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNlcnZpY2VzKTsKKyAgICAgICAgcmV0dXJuIChzZXJ2aWNlcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgPGNvZGU+U2VydmljZTwvY29kZT4gb2JqZWN0IG5hbWUgc3RyaW5ncworICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIDxjb2RlPlNlcnZlcjwvY29kZT4gb2JqZWN0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWJzZXJ2ZXIgTUJlYW5TZXJ2ZXIgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgbGlzdAorICAgICAqIEBwYXJhbSBzZXJ2ZXIgT2JqZWN0IG5hbWUgb2YgdGhlIHNlcnZlciBmb3Igd2hpY2ggdG8gc2VsZWN0IHNlcnZpY2VzCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aHJvd24gd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTZXJ2aWNlcyhNQmVhblNlcnZlciBtYnNlcnZlciwgU3RyaW5nIHNlcnZlcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIChnZXRTZXJ2aWNlcyhtYnNlcnZlciwgbmV3IE9iamVjdE5hbWUoc2VydmVyKSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlICA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBvYmplY3QgbmFtZSBzdHJpbmcKKyAgICAgKiB0aGF0IHRoZSBhZG1pbiBhcHAgYmVsb25ncyB0by4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYnNlcnZlciBNQmVhblNlcnZlciBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBsaXN0CisgICAgICogQHBhcmFtIHJlcXVlc3QgSHR0cCByZXF1ZXN0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aHJvd24gd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFkbWluQXBwU2VydmljZQorICAgICAgICAoTUJlYW5TZXJ2ZXIgbWJzZXJ2ZXIsIFN0cmluZyBkb21haW4sIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBHZXQgdGhlIGFkbWluIGFwcCdzIHNlcnZpY2UgbmFtZQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGRvbWFpbik7CisgICAgICAgIHNiLmFwcGVuZCgiOnR5cGU9U2VydmljZSwqIik7CisgICAgICAgIE9iamVjdE5hbWUgc2VhcmNoID0gbmV3IE9iamVjdE5hbWUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIEl0ZXJhdG9yIG5hbWVzID0gbWJzZXJ2ZXIucXVlcnlOYW1lcyhzZWFyY2gsIG51bGwpLml0ZXJhdG9yKCk7CisgICAgICAgIFN0cmluZyBzZXJ2aWNlID0gbnVsbDsKKyAgICAgICAgd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgc2VydmljZSA9ICgoT2JqZWN0TmFtZSluYW1lcy5uZXh0KCkpLmdldEtleVByb3BlcnR5KCJzZXJ2aWNlTmFtZSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzZXJ2aWNlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlICA8Y29kZT5Ib3N0PC9jb2RlPiBvYmplY3QgbmFtZSBzdHJpbmcKKyAgICAgKiB0aGF0IHRoZSBhZG1pbiBhcHAgYmVsb25ncyB0by4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYnNlcnZlciBNQmVhblNlcnZlciBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBsaXN0CisgICAgICogQHBhcmFtIHJlcXVlc3QgSHR0cCByZXF1ZXN0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aHJvd24gd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFkbWluQXBwSG9zdAorICAgICAgICAoTUJlYW5TZXJ2ZXIgbWJzZXJ2ZXIsIFN0cmluZyBkb21haW4sIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEdldCB0aGUgYWRtaW4gYXBwJ3MgaG9zdCBuYW1lCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoZG9tYWluKTsKKyAgICAgICAgc2IuYXBwZW5kKCI6ajJlZVR5cGU9V2ViTW9kdWxlLCoiKTsgCisgICAgICAgIE9iamVjdE5hbWUgc2VhcmNoID0gbmV3IE9iamVjdE5hbWUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIEl0ZXJhdG9yIG5hbWVzID0gbWJzZXJ2ZXIucXVlcnlOYW1lcyhzZWFyY2gsIG51bGwpLml0ZXJhdG9yKCk7CisgICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKTsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSBudWxsOworICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBudWxsOworICAgICAgICB3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7ICAgICAgIAorICAgICAgICAgICAgbmFtZSA9IG5hbWVzLm5leHQoKS50b1N0cmluZygpOworICAgICAgICAgICAgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShuYW1lKTsKKyAgICAgICAgICAgIGhvc3QgPSBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICAgICAgaG9zdCA9IGhvc3Quc3Vic3RyaW5nKDIpOworICAgICAgICAgICAgaW50IGkgPSBob3N0LmluZGV4T2YoIi8iKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0UGF0aC5lcXVhbHMoaG9zdC5zdWJzdHJpbmcoaSkpKSB7CisgICAgICAgICAgICAgICAgaG9zdCA9IGhvc3Quc3Vic3RyaW5nKDAsaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhvc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhvc3Q7CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gc2VhcmNoIG9iamVjdCBuYW1lIHRvIGJlIHVzZWQgdG8gcXVlcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIG9iamVjdCBuYW1lIHRvIHF1ZXJ5CisgICAgICogQHBhcmFtIHR5cGUgdHlwZSBvZiB0aGUgY29tcG9uZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgdGhyb3duIHdoaWxlIHJldHJpZXZpbmcgdGhlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdE5hbWUgZ2V0U2VhcmNoT2JqZWN0KE9iamVjdE5hbWUgY29udGFpbmVyLCBTdHJpbmcgdHlwZSkgIAorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGNvbnRhaW5lci5nZXREb21haW4oKSk7CisgICAgICAgIHNiLmFwcGVuZCgiOnR5cGU9Iit0eXBlKTsKKyAgICAgICAgU3RyaW5nIGNvbnRhaW5lclR5cGUgPSBjb250YWluZXIuZ2V0S2V5UHJvcGVydHkoInR5cGUiKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBjb250YWluZXIuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgaWYgKChuYW1lICE9IG51bGwpICYmIChuYW1lLmxlbmd0aCgpID4gMCkpIHsKKyAgICAgICAgICAgIC8vIHBhcmVudCBpcyBjb250ZXh0CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMik7CisgICAgICAgICAgICBpbnQgaSA9IG5hbWUuaW5kZXhPZigiLyIpOworICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBuYW1lLnN1YnN0cmluZygwLGkpOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBuYW1lLnN1YnN0cmluZyhpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLHBhdGg9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQocGF0aCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIixob3N0PSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGhvc3QpOworICAgICAgICB9IGVsc2UgaWYgKCJIb3N0Ii5lcXVhbHMoY29udGFpbmVyVHlwZSkpIHsKKyAgICAgICAgICAgIC8vIHBhcmVudCBpcyBob3N0CisgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IGNvbnRhaW5lci5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIsaG9zdD0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChob3N0KTsKKyAgICAgICAgfSAgICAKKyAgICAgICAgCisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0TmFtZShzYi50b1N0cmluZygpKTsKKyAgICAgICAgCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0xvZ091dEFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0xvZ091dEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYzc3YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vTG9nT3V0QWN0aW9uLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgbG9ncyBvdXQgb2YgdGhlIGN1cnJlbnQKKyAqIHNlc3Npb24gYW5kIHJldHVybnMgdG8gdGhlIG1haW4gbWVudSAod2hpY2ggd2lsbCB0cmlnZ2VyIHRoZSBsb2dpbiBmb3JtKS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIExvZ091dEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIEludmFsaWRhdGUgdGhlIGN1cnJlbnQgc2Vzc2lvbiBhbmQgY3JlYXRlIGEgbmV3IG9uZQorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIHNlc3Npb24uaW52YWxpZGF0ZSgpOworICAgICAgICBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKHRydWUpOworCisgICAgICAgIC8vIEZvcndhcmQgY29udHJvbCBiYWNrIHRvIHRoZSBtYWluIG1lbnUKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJNYWluIE1lbnUiKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1Jvd1RhZy5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1Jvd1RhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZWY2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vUm93VGFnLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW47CisKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuQm9keVRhZ1N1cHBvcnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZzsKKworCisvKioKKyAqIDxwPk5lc3RlZCB0YWcgdGhhdCByZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgImluc3RhbnQgdGFibGUiLiAgVGhpcyB0YWcKKyAqIGlzIHZhbGlkIDxzdHJvbmc+b25seTwvc3Ryb25nPiB3aGVuIG5lc3RlZCB3aXRoaW4gYW4gVGFibGVUYWcgdGFnLgorICogVGhpcyB0YWcgaGFzIHRoZSBmb2xsb3dpbmcgdXNlci1zZXR0YWJsZSBhdHRyaWJ1dGVzOjwvcD4KKyAqIDx1bD4KKyAqIDxsaT48c3Ryb25nPmhlYWRlcjwvc3Ryb25nPiAtIElzIHRoaXMgIGEgaGVhZGVyIHJvdz88L2xpPgorICogPGxpPjxzdHJvbmc+bGFiZWw8L3N0cm9uZz4gLSBsYWJlbCB0byBiZSBkaXNwbGF5ZWQuPC9saT4KKyAqIDxsaT48c3Ryb25nPmRhdGE8L3N0cm9uZz4gLSBkYXRhIG9mIHRoZSB0YWJsZSBkYXRhIGVsZW1lbnQuPC9saT4KKyAqIDxsaT48c3Ryb25nPmxhYmVsU3R5bGU8L3N0cm9uZz4gLSBTdHlsZSB0byBiZSBhcHBsaWVkIHRvIHRoZQorICogbGFiZWwgdGFibGUgZGF0YSBlbGVtZW50LjwvbGk+CisgKiA8bGk+PHN0cm9uZz5kYXRhU3R5bGU8L3N0cm9uZz4gLSBTdHlsZSB0byBiZSBhcHBsaWVkIHRvIHRoZSBkYXRhIHRhYmxlCisgKiBkYXRhIGVsZW1lbnQuPC9saT4KKyAqCisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSb3dUYWcgZXh0ZW5kcyBCb2R5VGFnU3VwcG9ydCB7CisgICAgCisgICAgLyoqCisgICAgICogSXMgdGhpcyB0aGUgaGVhZGVyIHJvdz8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoZWFkZXIgPSBmYWxzZTsKKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5oZWFkZXIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoYm9vbGVhbiBoZWFkZXIpIHsKKyAgICAgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7CisgICAgfSAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgbGFiZWwgdGhhdCB3aWxsIGJlIHJlbmRlcmVkIGZvciB0aGlzIHJvdydzIHRhYmxlIGRhdGEgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxhYmVsID0gbnVsbDsKKyAgIAorICAgIHB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgeworICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkYXRhIG9mIHRoZSB0YWJsZSBkYXRhIGVsZW1lbnQgb2YgdGhpcyByb3cuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBkYXRhID0gbnVsbDsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBkYXRhKSB7CisgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBzdHlsZSBvZiB0aGUgbGFiZWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBsYWJlbFN0eWxlID0gbnVsbDsKKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsU3R5bGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5sYWJlbFN0eWxlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0TGFiZWxTdHlsZShTdHJpbmcgbGFiZWxTdHlsZSkgeworICAgICAgICB0aGlzLmxhYmVsU3R5bGUgPSBsYWJlbFN0eWxlOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgc3R5bGUgb2YgdGhlIGRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBkYXRhU3R5bGUgPSBudWxsOworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0ZGF0YVN0eWxlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGF0YVN0eWxlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0ZGF0YVN0eWxlKFN0cmluZyBkYXRhU3R5bGUpIHsKKyAgICAgICAgdGhpcy5kYXRhU3R5bGUgPSBkYXRhU3R5bGU7CisgICAgfQorIAorICAgIC8qKgorICAgICAqIFRoZSBzdHlsZUlkIGZvciB0aGUgbGFiZWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzdHlsZUlkID0gbnVsbDsKKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0eWxlSWQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zdHlsZUlkKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0U3R5bGVJZChTdHJpbmcgc3R5bGVJZCkgeworICAgICAgICB0aGlzLnN0eWxlSWQgPSBzdHlsZUlkOworICAgIH0KKyAgICAKKyAgICAgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3RhcnQgb2YgdGhpcyB0YWcuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEpzcEV4Y2VwdGlvbiBpZiBhIEpTUCBleGNlcHRpb24gaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIGludCBkb1N0YXJ0VGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAgLy8gRG8gbm8gZnVydGhlciBwcm9jZXNzaW5nIGZvciBub3cKKyAgICAgICAgcmV0dXJuIChFVkFMX0JPRFlfQlVGRkVSRUQpOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgYm9keSB0ZXh0IG9mIHRoaXMgdGFnIChpZiBhbnkpLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBKc3BFeGNlcHRpb24gaWYgYSBKU1AgZXhjZXB0aW9uIGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZG9BZnRlckJvZHkoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKyAgICAgICAKKyAgICAgICAgcmV0dXJuIChTS0lQX0JPRFkpOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoaXMgYWN0aW9uIHdpdGggb3VyIHN1cnJvdW5kaW5nIEFjdGlvbnNUYWcgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEpzcEV4Y2VwdGlvbiBpZiBhIHByb2Nlc3NpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGludCBkb0VuZFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgLy8gRmluZCBvdXIgcGFyZW50IFRhYmxlVGFnIGluc3RhbmNlCisgICAgICAgIFRhZyBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKKyAgICAgICAgd2hpbGUgKChwYXJlbnQgIT0gbnVsbCkgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBUYWJsZVRhZykpIHsKKyAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oIk11c3QgYmUgbmVzdGVkIGluIGEgVGFibGVUYWcgaW5zdGFuY2UiKTsKKyAgICAgICAgfQorICAgICAgICBUYWJsZVRhZyB0YWJsZSA9IChUYWJsZVRhZykgcGFyZW50OworICAgICAgICAKKyAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgcm93IHJlcHJlc2VudGVkIGJ5CisgICAgICAgIC8vIHRoaXMgcm93CisgICAgICAgIHRhYmxlLmFkZFJvdyhoZWFkZXIsIGxhYmVsLCBkYXRhLCBsYWJlbFN0eWxlLCBkYXRhU3R5bGUsIHN0eWxlSWQpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIChFVkFMX1BBR0UpOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVsZWFzZSBhbGwgc3RhdGUgaW5mb3JtYXRpb24gc2V0IGJ5IHRoaXMgdGFnLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgIAorICAgICAgICAvL3N1cGVyLnJlbGVhc2UoKTsKKyAgICAgICAgCisgICAgICAgIHRoaXMuaGVhZGVyPSBmYWxzZTsKKyAgICAgICAgdGhpcy5sYWJlbCA9IG51bGw7CisgICAgICAgIHRoaXMuZGF0YSA9IG51bGw7CisgICAgICAgIHRoaXMubGFiZWxTdHlsZSA9IG51bGw7CisgICAgICAgIHRoaXMuZGF0YVN0eWxlID0gbnVsbDsKKyAgICAgICAgdGhpcy5zdHlsZUlkID0gbnVsbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1NldExvY2FsZUFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1NldExvY2FsZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmM2E1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vU2V0TG9jYWxlQWN0aW9uLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5BY3Rpb248L3N0cm9uZz4gdGhhdCBzZXRzIHRoZSBjdXJyZW50IExvY2FsZQorICogdG8gdGhlIG9uZSBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPmxvY2FsZTwvY29kZT4gcmVxdWVzdCBwYXJhbWV0ZXIuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXRMb2NhbGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBXaGF0IGxvY2FsZSBkb2VzIHRoZSB1c2VyIHdhbnQgdG8gc3dpdGNoIHRvPworICAgICAgICBTdHJpbmcgcmVxdWVzdGVkTG9jYWxlID0gKChTZXRMb2NhbGVGb3JtKSBmb3JtKS5nZXRMb2NhbGUoKTsKKworICAgICAgICAvLyBTd2l0Y2ggdG8gdGhlIHNwZWNpZmllZCBsb2NhbGUsIGlmIGl0IGV4aXN0cworICAgICAgICBpZiAocmVxdWVzdGVkTG9jYWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uTG9jYWxlcyBsb2NhbGVzID0gKEFwcGxpY2F0aW9uTG9jYWxlcykKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkuZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAoQXBwbGljYXRpb25TZXJ2bGV0LkxPQ0FMRVNfS0VZKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbG9jYWxlcy5nZXRTdXBwb3J0ZWRMb2NhbGVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIExvY2FsZSBjdXJyZW50TG9jYWxlID0gbnVsbDsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50TG9jYWxlID0gKExvY2FsZSkgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRMb2NhbGUuZXF1YWxzKGN1cnJlbnRMb2NhbGUudG9TdHJpbmcoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZShHbG9iYWxzLkxPQ0FMRV9LRVksIGN1cnJlbnRMb2NhbGUpOworICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZm9ybSBiZWFuIHNvIGl0IHdpbGwgZ2V0IHJlY3JlYXRlZCBuZXh0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUobWFwcGluZy5nZXRBdHRyaWJ1dGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvcndhcmQgY29udHJvbCBiYWNrIHRvIHRoZSBtYWluIG1lbnUKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJNYWluIE1lbnUiKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1NldExvY2FsZUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9TZXRMb2NhbGVGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1MzVjZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9TZXRMb2NhbGVGb3JtLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0V2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgc2V0IGxvY2FsZSBwYWdlLiAgVGhlIGFjdHVhbCB2YWx1ZSBpcyBjb3BpZWQgd2hlbiB0aGlzCisgKiBiZWFuIGlzIGFkZGVkIGFzIGEgc2Vzc2lvbiBhdHRyaWJ1dGUuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXRMb2NhbGVGb3JtCisgICAgZXh0ZW5kcyBBY3Rpb25Gb3JtCisgICAgaW1wbGVtZW50cyBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgbG9jYWxlIHdlIGFyZSBjdXJyZW50bHkgcnVubmluZy4KKyAgICAgKi8KKyAgICBTdHJpbmcgbG9jYWxlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubG9jYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoU3RyaW5nIGxvY2FsZSkgeworICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBXaGVuIHRoaXMgZm9ybSBiZWFuIGlzIGJvdW5kIGludG8gdGhlIHNlc3Npb24sIHBpY2sgdXAgdGhlIHVzZXIncworICAgICAqIGN1cnJlbnQgTG9jYWxlIG9iamVjdCBhbmQgc2V0IHRoZSBjdXJyZW50IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbHVlQm91bmQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpIHsKKworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gZXZlbnQuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgY3VycmVudCA9IChMb2NhbGUpIHNlc3Npb24uZ2V0QXR0cmlidXRlKEdsb2JhbHMuTE9DQUxFX0tFWSk7CisgICAgICAgIGlmIChjdXJyZW50ICE9IG51bGwpCisgICAgICAgICAgICBsb2NhbGUgPSBjdXJyZW50LnRvU3RyaW5nKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE5vIGFjdGlvbiBpcyByZXF1aXJlZCB3aGVuIHRoaXMgb2JqZWN0IGlzIHVuYm91bmQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmFsdWVVbmJvdW5kKEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgbG9jYWxlID0gbnVsbDsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vU2V0VXBUcmVlQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vU2V0VXBUcmVlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlYzVhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9TZXRVcFRyZWVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKKworLyoqCisgKiBUZXN0IDxjb2RlPkFjdGlvbjwvY29kZT4gc2V0cyB1cCAgdHJlZSBjb250cm9sIGRhdGEgc3RydWN0dXJlCisgKiBmb3IgdHJlZSB3aWRnZXQKKyAqCisgKiBAYXV0aG9yIEphem1pbiBKb25zb24KKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZXRVcFRyZWVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9NQUlOX0tFWSA9ICJkb21haW4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSVRfUExVR0lOX01BWCA9IDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSRUVCVUlMREVSX0tFWSA9ICJ0cmVlYnVpbGRlcnMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1ROT0RFTkFNRV9LRVkgPSAicm9vdG5vZGVuYW1lIjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBBcHBsaWNhdGlvblNlcnZsZXQgc2VydmxldCA9IChBcHBsaWNhdGlvblNlcnZsZXQpZ2V0U2VydmxldCgpOworCisgICAgICAgIC8vIEdldHRpbmcgaW5pdCBwYXJtcyBmcm9tIHdlYi54bWwKKworICAgICAgICAvLyBHZXQgdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQgYXMgcm9vdCBub2RlIHdoaWxlIHJlbmRlcmluZyB0aGUgdHJlZQorICAgICAgICBTdHJpbmcgcm9vdG5vZGVOYW1lID0gCisgICAgICAgICAgICAoU3RyaW5nKXNlcnZsZXQuZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoUk9PVE5PREVOQU1FX0tFWSk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgdHJlZUJ1aWxkZXJzU3RyICA9CisgICAgICAgICAgICAoU3RyaW5nKXNlcnZsZXQuZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoVFJFRUJVSUxERVJfS0VZKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBkb21haW4gID0KKyAgICAgICAgICAgIChTdHJpbmcpc2VydmxldC5nZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0SW5pdFBhcmFtZXRlcihET01BSU5fS0VZKTsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyBNYWtlIHRoZSByb290IG5vZGUgYW5kIHRyZWUgY29udHJvbAorICAgICAgICAKKyAgICAgICAgLy8gVGhlIHJvb3Qgbm9kZSBnZXRzIHJlbmRlcmVkIG9ubHkgaWYgaXRzIHZhbHVlIAorICAgICAgICAvLyBpcyBzZXQgYXMgYW4gaW5pdC1wYXJhbSBpbiB3ZWIueG1sCisgICAgICAgIAorICAgICAgICBUcmVlQ29udHJvbE5vZGUgcm9vdCA9CisgICAgICAgICAgICBuZXcgVHJlZUNvbnRyb2xOb2RlKCJST09ULU5PREUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCByb290bm9kZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRVcFRyZWUuZG8/c2VsZWN0PVJPT1QtTk9ERSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50IiwgdHJ1ZSwgZG9tYWluKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgVHJlZUNvbnRyb2wgY29udHJvbCA9IG5ldyBUcmVlQ29udHJvbChyb290KTsKKyAgICAgICAgCisgICAgICAgIGlmKHRyZWVCdWlsZGVyc1N0ciAhPSBudWxsKSB7CisgICAgICAgICAgICBDbGFzcyB0cmVlQnVpbGRlckltcGw7CisgICAgICAgICAgICBUcmVlQnVpbGRlciB0cmVlQnVpbGRlckJhc2U7CisKKyAgICAgICAgICAgIEFycmF5TGlzdCB0cmVlQnVpbGRlcnMgPSBuZXcgQXJyYXlMaXN0KElOSVRfUExVR0lOX01BWCk7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyZWVCdWlsZGVyc1N0ciwgIiwiKTsKKyAgICAgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICB0cmVlQnVpbGRlcnMuYWRkKHN0Lm5leHRUb2tlbigpLnRyaW0oKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHRyZWVCdWlsZGVycy5zaXplKCkgPT0gMCkKKyAgICAgICAgICAgICAgICB0cmVlQnVpbGRlcnMuYWRkKHRyZWVCdWlsZGVyc1N0ci50cmltKCkpOworCisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCB0cmVlQnVpbGRlcnMuc2l6ZSgpOyBpKyspIHsKKworICAgICAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICAgICAgdHJlZUJ1aWxkZXJJbXBsID0gQ2xhc3MuZm9yTmFtZSgoU3RyaW5nKXRyZWVCdWlsZGVycy5nZXQoaSkpOworICAgICAgICAgICAgICAgICAgICB0cmVlQnVpbGRlckJhc2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgKFRyZWVCdWlsZGVyKXRyZWVCdWlsZGVySW1wbC5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICB0cmVlQnVpbGRlckJhc2UuYnVpbGRUcmVlKGNvbnRyb2wsIHNlcnZsZXQsIHJlcXVlc3QpOworICAgICAgICAgICAgICAgIH1jYXRjaChUaHJvd2FibGUgdCl7CisgICAgICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoInRyZWVDb250cm9sVGVzdCIsIGNvbnRyb2wpOworCisgICAgICAgICBTdHJpbmcgIG5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic2VsZWN0Iik7CisgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLnNlbGVjdE5vZGUobmFtZSk7CisgICAgICAgICAgICAvLyBGb3J3YXJkIGJhY2sgdG8gdGhlIEJsYW5rIHBhZ2UKKyAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiQmxhbmsiKSk7CisgICAgICAgIH0KKworICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJUcmVlIENvbnRyb2wgVGVzdCIpKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UYWJsZVRhZy5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1RhYmxlVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5ZjllZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UYWJsZVRhZy5qYXZhCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcFdyaXRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuQm9keVRhZ1N1cHBvcnQ7CisKKworLyoqCisgKiA8cD5KU1AgY3VzdG9tIHRhZyB0aGF0IHJlbmRlcnMgYW4gImluc3RhbnQgdGFibGUiIGNvbnRyb2wuICBUbyB0aGUgdXNlciwKKyAqIGl0IGFwcGVhcnMgYXMgYW4gSFRNTCAmbHQ7dGFibGUmZ3Q7IGVsZW1lbnQKKyAqIFRoaXMgdGFnIGhhcyB0aGUgZm9sbG93aW5nIHVzZXItc2V0dGFibGUgYXR0cmlidXRlczo8L3A+CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5jb2x1bW5zPC9zdHJvbmc+IC0gKEludGVnZXIpIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0YWJsZS4KKyAqIElmIG5vdCBzcGVjaWZpZWQsIG9uZSB0d28gY29sdW1ucyB3aWxsIGJlIGNyZWF0ZWQuPC9saT4KKyAqIDxsaT48c3Ryb25nPnRhYmxlLWNsYXNzPC9zdHJvbmc+IC0gVGhlIENTUyBzdHlsZSBjbGFzcyB0byBiZSBhcHBsaWVkIHRvIHRoZQorICogICAgIGVudGlyZSByZW5kZXJlZCBvdXRwdXQgb2YgdGhlIGVudGlyZSB0YWJsZSwgaWYgYW55LjwvbGk+CisgKiA8bGk+PHN0cm9uZz5oZWFkZXItcm93LWNsYXNzPC9zdHJvbmc+IC0gVGhlIENTUyBzdHlsZSBjbGFzcyB0byBiZSBhcHBsaWVkIHRvIHRoZQorICogICAgIGVudGlyZSByZW5kZXJlZCBvdXRwdXQgb2YgdGhlIHRhYmxlIGhlYWRlci1yb3csIGlmIGFueS48L2xpPgorICoKKyAqIDwvdWw+CisgKgorICogPHN0cm9uZz5GSVhNRTwvc3Ryb25nPiAtIEludGVybmF0aW9uYWxpemUgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlcyEKKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVGFibGVUYWcgZXh0ZW5kcyBCb2R5VGFnU3VwcG9ydCB7CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFuaWZlc3QgQ29uc3RhbnRzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIG5hbWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHdlIGhhdmUgZ2VuZXJhdGVkIHRoZSBKYXZhU2NyaXB0CisgICAgICogZnVuY3Rpb24gYWxyZWFkeSBvbiB0aGUgY3VycmVudCBwYWdlLiAgVGhlIGRhdGEgc3RvcmVkIGZvciB0aGlzCisgICAgICogYXR0cmlidXRlIGlzIGFyYml0cmFyeSAtIG9ubHkgaXRzIGV4aXN0ZW5jZSBpcyByZWxldmFudC4KKyAgICAgKi8KKyAgICAvLyAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTkNUSU9OX1RBRyA9CisgICAgLy8gICAgICAgIm9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRhYmxlVGFnLkZVTkNUSU9OX1RBRyI7CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBsYWJlbHMgZm9yIHRoZSByb3dzIGRpc3BsYXllZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBsYWJlbHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBkYXRhcyBmb3IgdGhlIHJvd3MgZGlzcGxheWVkIGJ5IHRoaXMgY29udHJvbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IGRhdGFzID0gbmV3IEFycmF5TGlzdCgpOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbGFiZWxTdHlsZXMgZm9yIHRoZSByb3dzIGRpc3BsYXllZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBsYWJlbFN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGRhdGFTdHlsZXMgZm9yIHRoZSByb3dzIGRpc3BsYXllZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBkYXRhU3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgImhlYWRlcnMiIGZsYWdzIGZvciByb3dzIGRpc3BsYXllZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBoZWFkZXJzID0gbmV3IEFycmF5TGlzdCgpOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2Ygc3R5bGVJZHMgZm9yIHRoZSByb3dzIGRpc3BsYXllZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBzdHlsZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY29sdW1ucyA9IDI7CisgICAgCisgICAgcHVibGljIGludCBnZXRDb2x1bW5zKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuY29sdW1ucyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbnMoaW50IGNvbHVtbnMpIHsKKyAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1uczsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIENTUyBzdHlsZSBjbGFzcyB0byBiZSBhcHBsaWVkIHRvIHRoZSBlbnRpcmUgcmVuZGVyZWQgb3V0cHV0CisgICAgICogb2YgdGhpcyAiaW5zdGFudCB0YWJsZSIgb2JqZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdGFibGVTdHlsZSA9IG51bGw7CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRUYWJsZVN0eWxlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudGFibGVTdHlsZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFRhYmxlU3R5bGUoU3RyaW5nIHRhYmxlU3R5bGUpIHsKKyAgICAgICAgdGhpcy50YWJsZVN0eWxlID0gdGFibGVTdHlsZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIENTUyBTdHlsZSBmb3IgdGhlIGxpbmVzIGJldHdlZW4gdGFibGUgcm93cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxpbmVTdHlsZSA9IG51bGw7CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRMaW5lU3R5bGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5saW5lU3R5bGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRMaW5lU3R5bGUoU3RyaW5nIGxpbmVTdHlsZSkgeworICAgICAgICB0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIHB1YmxpYyBpbnQgZG9TdGFydFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworIAorICAgICAgICB0aGlzLmhlYWRlcnMuY2xlYXIoKTsKKyAgICAgICAgdGhpcy5sYWJlbHMuY2xlYXIoKTsKKyAgICAgICAgdGhpcy5kYXRhcy5jbGVhcigpOworICAgICAgICB0aGlzLmxhYmVsU3R5bGVzLmNsZWFyKCk7CisgICAgICAgIHRoaXMuZGF0YVN0eWxlcy5jbGVhcigpOworICAgICAgICB0aGlzLnN0eWxlSWRzLmNsZWFyKCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gKEVWQUxfQk9EWV9CVUZGRVJFRCk7CisgCisgICAgIH0gICAgCisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgdGhpcyBpbnN0YW50IGFjdGlvbnMgY29udHJvbC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSnNwRXhjZXB0aW9uIGlmIGEgcHJvY2Vzc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRvRW5kVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBKc3BXcml0ZXIgb3V0ID0gcGFnZUNvbnRleHQuZ2V0T3V0KCk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBSZW5kZXIgdGhlIGJlZ2lubmluZyBvZiB0aGlzIGVsZW1lbnQKKyAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICBvdXQucHJpbnQoIjx0YWJsZSAiKTsKKyAgICAgICAgICAgIGlmIChjb2x1bW5zID4gMikgeworICAgICAgICAgICAgICAgIG91dC5wcmludCgiIGNvbHVtbnM9XCIiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoY29sdW1ucyk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJcIiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRhYmxlU3R5bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludCgiIGNsYXNzPVwiIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KHRhYmxlU3R5bGUpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiXCIiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiBib3JkZXI9XCIxXCIgY2VsbHNwYWNpbmc9XCIwXCIgIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgY2VsbHBhZGRpbmc9XCIwXCIgd2lkdGg9XCIxMDAlXCIgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnRsbigiPiIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFJlbmRlciBlYWNoIGRlZmluZWQgcm93CisgICAgICAgICAgICBpbnQgbiA9IGxhYmVscy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IChTdHJpbmcpIGxhYmVscy5nZXQoaSk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBoZWFkZXIgPSAoKEJvb2xlYW4pIGhlYWRlcnMuZ2V0KGkpKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGF0YSA9IChTdHJpbmcpIGRhdGFzLmdldChpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxTdHlsZSA9IChTdHJpbmcpIGxhYmVsU3R5bGVzLmdldChpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGF0YVN0eWxlID0gKFN0cmluZykgZGF0YVN0eWxlcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0eWxlSWQgPSAoU3RyaW5nKSBzdHlsZUlkcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPHRyIGNsYXNzPVwiaGVhZGVyLXJvd1wiID4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgPHRoIHNjb3BlPVwiY29sXCIgd2lkdGg9XCIyNyVcIj4gIik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAgIDxkaXYgYWxpZ249XCJsZWZ0XCIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCggIiBjbGFzcz1cIiIgKyBsYWJlbFN0eWxlICsiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCI+Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUlkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiPGxhYmVsIGZvcj1cIiIgKyBzdHlsZUlkICsgIlwiPiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChsYWJlbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUlkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiPC9sYWJlbD4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICAgIDwvZGl2PiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICA8L3RoPiIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICA8dGggc2NvcGU9XCJjb2xcIiB3aWR0aD1cIjczJVwiPiAiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgICAgPGRpdiBhbGlnbj1cImxlZnRcIiIgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFTdHlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgY2xhc3M9XCIiICsgZGF0YVN0eWxlICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiPiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgICAgPC9kaXY+Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiICA8L3RoPiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPC90cj4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPHRyPiIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICA8dGQgc2NvcGU9XCJyb3dcIiB3aWR0aD1cIjI3JVwiPiAiKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgICAgPGRpdiBhbGlnbj1cImxlZnRcIiIpOworICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxTdHlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCAiIGNsYXNzPVwiIiArIGxhYmVsU3R5bGUgKyJcIiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIj4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCI8bGFiZWwgZm9yPVwiIiArIHN0eWxlSWQgKyAiXCI+Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KGxhYmVsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCI8L2xhYmVsPiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgICAgPC9kaXY+Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgIDwvdGQ+Iik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgIDx0ZCB3aWR0aD1cIjczJVwiPiAiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgICAgPGRpdiBhbGlnbj1cImxlZnRcIiIgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFTdHlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgY2xhc3M9XCIiICsgZGF0YVN0eWxlICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiPiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgICAgPC9kaXY+Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiICA8L3RkPiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPC90cj4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPHRyIGhlaWdodD1cIjFcIj4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgPHRkIGNsYXNzPVwiIisgbGluZVN0eWxlICsgIlwiIGNvbHNwYW49XCIyXCI+Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgICAgPGltZyBzcmM9XCJcIiBhbHQ9XCJcIiB3aWR0aD1cIjFcIiBoZWlnaHQ9XCIxXCIgYm9yZGVyPVwiMFwiPiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICA8L3RkPiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPC90cj4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFJlbmRlciB0aGUgZW5kIG9mIHRoaXMgZWxlbWVudAorICAgICAgICAgICAgb3V0LnByaW50bG4oIjwvdGFibGU+Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiAoRVZBTF9QQUdFKTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJlbGVhc2UgYWxsIHN0YXRlIGluZm9ybWF0aW9uIHNldCBieSB0aGlzIHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5oZWFkZXJzLmNsZWFyKCk7CisgICAgICAgIHRoaXMubGFiZWxzLmNsZWFyKCk7CisgICAgICAgIHRoaXMuZGF0YXMuY2xlYXIoKTsKKyAgICAgICAgdGhpcy5sYWJlbFN0eWxlcy5jbGVhcigpOworICAgICAgICB0aGlzLmRhdGFTdHlsZXMuY2xlYXIoKTsKKyAgICAgICAgdGhpcy5jb2x1bW5zID0gMjsKKyAgICAgICAgdGhpcy50YWJsZVN0eWxlID0gbnVsbDsKKyAgICAgICAgdGhpcy5saW5lU3R5bGUgPSBudWxsOworICAgICAgICB0aGlzLnN0eWxlSWRzLmNsZWFyKCk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgQWN0aW9uIHRvIHRoZSBzZXQgdGhhdCB3aWxsIGJlIHJlbmRlcmVkIGJ5IHRoaXMgY29udHJvbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYWJlbCBMb2NhbGl6ZWQgbGFiZWwgdmlzaWJsZSB0byB0aGUgdXNlcgorICAgICAqIEBwYXJhbSBzZWxlY3RlZCBJbml0aWFsIHNlbGVjdGVkIHN0YXRlIG9mIHRoaXMgb3B0aW9uCisgICAgICogQHBhcmFtIHVybCBVUkwgdG8gd2hpY2ggY29udHJvbCBzaG91bGQgYmUgdHJhbnNmZXJyZWQgaWYgc2VsZWN0ZWQKKyAgICAgKi8KKyAgICAKKyAgICB2b2lkIGFkZFJvdyhib29sZWFuIGhlYWRlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGF0YSwKKyAgICBTdHJpbmcgbGFiZWxTdHlsZSwgU3RyaW5nIGRhdGFTdHlsZSwgU3RyaW5nIHN0eWxlSWQpIHsKKyAgICAgICAgCisgICAgICAgIGhlYWRlcnMuYWRkKG5ldyBCb29sZWFuKGhlYWRlcikpOworICAgICAgICBsYWJlbHMuYWRkKGxhYmVsKTsKKyAgICAgICAgZGF0YXMuYWRkKGRhdGEpOworICAgICAgICBsYWJlbFN0eWxlcy5hZGQobGFiZWxTdHlsZSk7CisgICAgICAgIGRhdGFTdHlsZXMuYWRkKGRhdGFTdHlsZSk7CisgICAgICAgIHN0eWxlSWRzLmFkZChzdHlsZUlkKTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworICAgIAorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1RvbWNhdFRyZWVCdWlsZGVyLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vVG9tY2F0VHJlZUJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWNjZDcyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1RvbWNhdFRyZWVCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw0NjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworLyoqCisgKiA8cD4gSW1wbGVtZW50YXRpb24gb2YgVHJlZUJ1aWxkZXIgaW50ZXJmYWNlIGZvciBUb21jYXQgVHJlZSBDb250cm9sbGVyCisgKiAgICAgdG8gYnVpbGQgcGx1Z2luIGNvbXBvbmVudHMgaW50byB0aGUgdHJlZQorICoKKyAqIEBhdXRob3IgSmF6bWluIEpvbnNvbgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCisKK3B1YmxpYyBjbGFzcyBUb21jYXRUcmVlQnVpbGRlciBpbXBsZW1lbnRzIFRyZWVCdWlsZGVyeworICAgIAorICAgIC8vIFRoaXMgU0VSVkVSX0xBQkVMIG5lZWRzIHRvIGJlIGxvY2FsaXplZAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTRVJWRVJfTEFCRUwgPSAiVG9tY2F0IFNlcnZlciI7CisgICAgCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9ET01BSU4gPSAiQ2F0YWxpbmEiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZFUl9UWVBFID0gIjp0eXBlPVNlcnZlciI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkFDVE9SWV9UWVBFID0gCisgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RPTUFJTiArICI6dHlwZT1NQmVhbkZhY3RvcnkiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZJQ0VfVFlQRSA9ICI6dHlwZT1TZXJ2aWNlIjsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTkdJTkVfVFlQRSA9ICI6dHlwZT1FbmdpbmUiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTk5FQ1RPUl9UWVBFID0gIjp0eXBlPUNvbm5lY3RvciI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSE9TVF9UWVBFID0gIjp0eXBlPUhvc3QiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRFWFRfVFlQRSA9ICI6dHlwZT1Db250ZXh0IjsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBMT0FERVJfVFlQRSA9ICI6dHlwZT1Mb2FkZXIiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BTkFHRVJfVFlQRSA9ICI6dHlwZT1NYW5hZ2VyIjsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBMT0dHRVJfVFlQRSA9ICI6dHlwZT1Mb2dnZXIiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFQUxNX1RZUEUgPSAiOnR5cGU9UmVhbG0iOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTFZFX1RZUEUgPSAiOnR5cGU9VmFsdmUiOworCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV0lMRENBUkQgPSAiLCoiOworCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVJMX0VOQ09ESU5HPSJVVEYtOCI7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIHByaXZhdGUgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBudWxsOworICAgIHByaXZhdGUgTG9jYWxlIGxvY2FsZSA9IG51bGw7CisKKyAgICBwdWJsaWMgdm9pZCBidWlsZFRyZWUoVHJlZUNvbnRyb2wgdHJlZUNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uU2VydmxldCBzZXJ2bGV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgICAgICBsb2NhbGUgPSAoTG9jYWxlKSBzZXNzaW9uLmdldEF0dHJpYnV0ZShHbG9iYWxzLkxPQ0FMRV9LRVkpOworICAgICAgICAgICAgbUJTZXJ2ZXIgPSBzZXJ2bGV0LmdldFNlcnZlcigpOworICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHJvb3QgPSB0cmVlQ29udHJvbC5nZXRSb290KCk7CisgICAgICAgICAgICByZXNvdXJjZXMgPSAoTWVzc2FnZVJlc291cmNlcykKKyAgICAgICAgICAgICAgICBzZXJ2bGV0LmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlKEdsb2JhbHMuTUVTU0FHRVNfS0VZKTsKKyAgICAgICAgICAgIGdldFNlcnZlcnMocm9vdCk7CisgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIHQpeworICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdE5hbWUgZ2V0TUJlYW5GYWN0b3J5KCkgCisgICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gbmV3IE9iamVjdE5hbWUoRkFDVE9SWV9UWVBFKTsKKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgbm9kZXMgZm9yIGFsbCBkZWZpbmVkIHNlcnZlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdE5vZGUgUm9vdCBub2RlIGZvciB0aGUgdHJlZSBjb250cm9sIAorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgVGhlIE1lc3NhZ2VSZXNvdXJjZXMgZm9yIG91ciBsb2NhbGl6ZWQgbWVzc2FnZXMKKyAgICAgKiAgbWVzc2FnZXMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgYnVpbGRpbmcgdGhlIHRyZWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXRTZXJ2ZXJzKFRyZWVDb250cm9sTm9kZSByb290Tm9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgZG9tYWluID0gcm9vdE5vZGUuZ2V0RG9tYWluKCk7CisgICAgICAgIEl0ZXJhdG9yIHNlcnZlck5hbWVzID0KKyAgICAgICAgICAgIExpc3RzLmdldFNlcnZlcnMobUJTZXJ2ZXIsZG9tYWluKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoc2VydmVyTmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgc2VydmVyTmFtZSA9IChTdHJpbmcpIHNlcnZlck5hbWVzLm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyBub2RlTGFiZWwgPSBTRVJWRVJfTEFCRUw7CisgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgc2VydmVyTm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IFRyZWVDb250cm9sTm9kZShzZXJ2ZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlci5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVkaXRTZXJ2ZXIuZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoc2VydmVyTmFtZSxVUkxfRU5DT0RJTkcpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImbm9kZUxhYmVsPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUobm9kZUxhYmVsLFVSTF9FTkNPRElORyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBkb21haW4pOworICAgICAgICAgICAgcm9vdE5vZGUuYWRkQ2hpbGQoc2VydmVyTm9kZSk7CisgICAgICAgICAgICBnZXRTZXJ2aWNlcyhzZXJ2ZXJOb2RlLCBzZXJ2ZXJOYW1lKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgbm9kZXMgZm9yIGFsbCBkZWZpbmVkIHNlcnZpY2VzIGZvciB0aGUgc3BlY2lmaWVkIHNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2ZXJOb2RlIFNlcnZlciBub2RlIGZvciB0aGUgdHJlZSBjb250cm9sCisgICAgICogQHBhcmFtIHNlcnZlck5hbWUgT2JqZWN0IG5hbWUgb2YgdGhlIHBhcmVudCBzZXJ2ZXIKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSBNZXNzYWdlUmVzb3VyY2VzIGZvciBvdXIgbG9jYWxpemVkIG1lc3NhZ2VzCisgICAgICogIG1lc3NhZ2VzCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzIGJ1aWxkaW5nIHRoZSB0cmVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ2V0U2VydmljZXMoVHJlZUNvbnRyb2xOb2RlIHNlcnZlck5vZGUsIFN0cmluZyBzZXJ2ZXJOYW1lKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHNlcnZlck5vZGUuZ2V0RG9tYWluKCk7CisgICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VOYW1lcyA9CisgICAgICAgICAgICBMaXN0cy5nZXRTZXJ2aWNlcyhtQlNlcnZlciwgc2VydmVyTmFtZSkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKHNlcnZpY2VOYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IChTdHJpbmcpIHNlcnZpY2VOYW1lcy5uZXh0KCk7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZShzZXJ2aWNlTmFtZSk7CisgICAgICAgICAgICBTdHJpbmcgbm9kZUxhYmVsID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsIAorICAgICAgICAgICAgICAgICAgICAic2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuc3VidHJlZU5vZGUiKSArICIgKCIgKworICAgICAgICAgICAgICAgICAgICBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJzZXJ2aWNlTmFtZSIpICsgIikiOworICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHNlcnZpY2VOb2RlID0KKyAgICAgICAgICAgICAgICBuZXcgVHJlZUNvbnRyb2xOb2RlKHNlcnZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UuZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFZGl0U2VydmljZS5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShzZXJ2aWNlTmFtZSxVUkxfRU5DT0RJTkcpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImbm9kZUxhYmVsPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUobm9kZUxhYmVsLFVSTF9FTkNPRElORyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZG9tYWluKTsKKyAgICAgICAgICAgIHNlcnZlck5vZGUuYWRkQ2hpbGQoc2VydmljZU5vZGUpOworICAgICAgICAgICAgZ2V0Q29ubmVjdG9ycyhzZXJ2aWNlTm9kZSwgc2VydmljZU5hbWUpOworICAgICAgICAgICAgZ2V0SG9zdHMoc2VydmljZU5vZGUsIHNlcnZpY2VOYW1lKTsKKyAgICAgICAgICAgIGdldFJlYWxtcyhzZXJ2aWNlTm9kZSwgc2VydmljZU5hbWUpOworICAgICAgICAgICAgZ2V0VmFsdmVzKHNlcnZpY2VOb2RlLCBzZXJ2aWNlTmFtZSk7CisgICAgICAgIH0KKworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIEFwcGVuZCBub2RlcyBmb3IgYWxsIGRlZmluZWQgY29ubmVjdG9ycyBmb3IgdGhlIHNwZWNpZmllZCBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VOb2RlIFNlcnZpY2Ugbm9kZSBmb3IgdGhlIHRyZWUgY29udHJvbAorICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBPYmplY3QgbmFtZSBvZiB0aGUgcGFyZW50IHNlcnZpY2UKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgYnVpbGRpbmcgdGhlIHRyZWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXRDb25uZWN0b3JzKFRyZWVDb250cm9sTm9kZSBzZXJ2aWNlTm9kZSwgU3RyaW5nIHNlcnZpY2VOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBkb21haW4gPSBzZXJ2aWNlTm9kZS5nZXREb21haW4oKTsKKyAgICAgICAgSXRlcmF0b3IgY29ubmVjdG9yTmFtZXMgPQorICAgICAgICAgICAgTGlzdHMuZ2V0Q29ubmVjdG9ycyhtQlNlcnZlciwgc2VydmljZU5hbWUpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChjb25uZWN0b3JOYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBjb25uZWN0b3JOYW1lID0gKFN0cmluZykgY29ubmVjdG9yTmFtZXMubmV4dCgpOworICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUoY29ubmVjdG9yTmFtZSk7CisgICAgICAgICAgICBTdHJpbmcgbm9kZUxhYmVsID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsIAorICAgICAgICAgICAgICAgICAgICAic2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuY29ubmVjdG9yIikgKyAiICgiICsgIAorICAgICAgICAgICAgICAgICAgICBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJwb3J0IikgKyAiKSI7CisgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgY29ubmVjdG9yTm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IFRyZWVDb250cm9sTm9kZShjb25uZWN0b3JOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rvci5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVkaXRDb25uZWN0b3IuZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoY29ubmVjdG9yTmFtZSxVUkxfRU5DT0RJTkcpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImbm9kZUxhYmVsPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUobm9kZUxhYmVsLFVSTF9FTkNPRElORyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZG9tYWluKTsKKyAgICAgICAgICAgIHNlcnZpY2VOb2RlLmFkZENoaWxkKGNvbm5lY3Rvck5vZGUpOworICAgICAgICB9CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogQXBwZW5kIG5vZGVzIGZvciBhbGwgZGVmaW5lZCBob3N0cyBmb3IgdGhlIHNwZWNpZmllZCBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VOb2RlIFNlcnZpY2Ugbm9kZSBmb3IgdGhlIHRyZWUgY29udHJvbAorICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBPYmplY3QgbmFtZSBvZiB0aGUgcGFyZW50IHNlcnZpY2UKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSBNZXNzYWdlUmVzb3VyY2VzIGZvciBvdXIgbG9jYWxpemVkIG1lc3NhZ2VzCisgICAgICogIG1lc3NhZ2VzCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzIGJ1aWxkaW5nIHRoZSB0cmVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ2V0SG9zdHMoVHJlZUNvbnRyb2xOb2RlIHNlcnZpY2VOb2RlLCBTdHJpbmcgc2VydmljZU5hbWUpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBkb21haW4gPSBzZXJ2aWNlTm9kZS5nZXREb21haW4oKTsKKyAgICAgICAgSXRlcmF0b3IgaG9zdE5hbWVzID0KKyAgICAgICAgICAgIExpc3RzLmdldEhvc3RzKG1CU2VydmVyLCBzZXJ2aWNlTmFtZSkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGhvc3ROYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBob3N0TmFtZSA9IChTdHJpbmcpIGhvc3ROYW1lcy5uZXh0KCk7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZShob3N0TmFtZSk7CisgICAgICAgICAgICBTdHJpbmcgbm9kZUxhYmVsID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsIAorICAgICAgICAgICAgICAgICAgICAic2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuaG9zdCIpICsgIiAoIiArCisgICAgICAgICAgICAgICAgICAgIG9iamVjdE5hbWUuZ2V0S2V5UHJvcGVydHkoImhvc3QiKSArICIpIjsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBob3N0Tm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IFRyZWVDb250cm9sTm9kZShob3N0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3N0LmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWRpdEhvc3QuZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoaG9zdE5hbWUsVVJMX0VOQ09ESU5HKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJm5vZGVMYWJlbD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKG5vZGVMYWJlbCxVUkxfRU5DT0RJTkcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGRvbWFpbik7CisgICAgICAgICAgICBzZXJ2aWNlTm9kZS5hZGRDaGlsZChob3N0Tm9kZSk7CisgICAgICAgICAgICBnZXRDb250ZXh0cyhob3N0Tm9kZSwgaG9zdE5hbWUpOyAgICAgICAgICAgIAorICAgICAgICAgICAgZ2V0UmVhbG1zKGhvc3ROb2RlLCBob3N0TmFtZSk7CisgICAgICAgICAgICBnZXRWYWx2ZXMoaG9zdE5vZGUsIGhvc3ROYW1lKTsKKyAgICAgICAgfQorCisgICAgfSAgICAKKworICAgIAorICAgIC8qKgorICAgICAqIEFwcGVuZCBub2RlcyBmb3IgYWxsIGRlZmluZWQgY29udGV4dHMgZm9yIHRoZSBzcGVjaWZpZWQgaG9zdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBob3N0Tm9kZSBIb3N0IG5vZGUgZm9yIHRoZSB0cmVlIGNvbnRyb2wKKyAgICAgKiBAcGFyYW0gaG9zdE5hbWUgT2JqZWN0IG5hbWUgb2YgdGhlIHBhcmVudCBob3N0CisgICAgICogQHBhcmFtIHJlc291cmNlcyBUaGUgTWVzc2FnZVJlc291cmNlcyBmb3Igb3VyIGxvY2FsaXplZCBtZXNzYWdlcworICAgICAqICBtZXNzYWdlcworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyBidWlsZGluZyB0aGUgdHJlZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdldENvbnRleHRzKFRyZWVDb250cm9sTm9kZSBob3N0Tm9kZSwgU3RyaW5nIGhvc3ROYW1lKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgZG9tYWluID0gaG9zdE5vZGUuZ2V0RG9tYWluKCk7CisgICAgICAgIEl0ZXJhdG9yIGNvbnRleHROYW1lcyA9CisgICAgICAgICAgICBMaXN0cy5nZXRDb250ZXh0cyhtQlNlcnZlciwgaG9zdE5hbWUpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChjb250ZXh0TmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgY29udGV4dE5hbWUgPSAoU3RyaW5nKSBjb250ZXh0TmFtZXMubmV4dCgpOworICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUoY29udGV4dE5hbWUpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMik7CisgICAgICAgICAgICBpbnQgaSA9IG5hbWUuaW5kZXhPZigiLyIpOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBuYW1lLnN1YnN0cmluZyhpKTsKKyAgICAgICAgICAgIFN0cmluZyBub2RlTGFiZWwgPQorICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgCisgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5jb250ZXh0IikgKyAiICgiICsgcGF0aCArICIpIjsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBjb250ZXh0Tm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IFRyZWVDb250cm9sTm9kZShjb250ZXh0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZXh0LmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWRpdENvbnRleHQuZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoY29udGV4dE5hbWUsVVJMX0VOQ09ESU5HKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJm5vZGVMYWJlbD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKG5vZGVMYWJlbCxVUkxfRU5DT0RJTkcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGRvbWFpbik7CisgICAgICAgICAgICBob3N0Tm9kZS5hZGRDaGlsZChjb250ZXh0Tm9kZSk7CisgICAgICAgICAgICBnZXRSZXNvdXJjZXMoY29udGV4dE5vZGUsIGNvbnRleHROYW1lKTsKKyAgICAgICAgICAgIGdldFJlYWxtcyhjb250ZXh0Tm9kZSwgY29udGV4dE5hbWUpOworICAgICAgICAgICAgZ2V0VmFsdmVzKGNvbnRleHROb2RlLCBjb250ZXh0TmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQXBwZW5kIG5vZGVzIGZvciBhbnkgZGVmaW5lZCByZWFsbXMgZm9yIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lck5vZGUgQ29udGFpbmVyIG5vZGUgZm9yIHRoZSB0cmVlIGNvbnRyb2wKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyTmFtZSBPYmplY3QgbmFtZSBvZiB0aGUgcGFyZW50IGNvbnRhaW5lcgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyBidWlsZGluZyB0aGUgdHJlZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdldFJlYWxtcyhUcmVlQ29udHJvbE5vZGUgY29udGFpbmVyTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRhaW5lck5hbWUpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBkb21haW4gPSBjb250YWluZXJOb2RlLmdldERvbWFpbigpOworICAgICAgICBJdGVyYXRvciByZWFsbU5hbWVzID0KKyAgICAgICAgICAgIExpc3RzLmdldFJlYWxtcyhtQlNlcnZlciwgY29udGFpbmVyTmFtZSkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKHJlYWxtTmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVhbG1OYW1lID0gKFN0cmluZykgcmVhbG1OYW1lcy5uZXh0KCk7CisJICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKHJlYWxtTmFtZSk7CisgICAgICAgICAgICAvLyBDcmVhdGUgdHJlZSBub2RlcyBmb3Igbm9uIEpBQVNSZWFsbSBvbmx5CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CU2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLCAidmFsaWRhdGUiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbm9kZUxhYmVsID0gcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAKKyAgICAgICAgICAgICAgICAgICAgInNlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLnJlYWxtRm9yIiwgCisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lck5vZGUuZ2V0TGFiZWwoKSk7CisJICAgICAgICBUcmVlQ29udHJvbE5vZGUgcmVhbG1Ob2RlID0KKwkJICAgIG5ldyBUcmVlQ29udHJvbE5vZGUocmVhbG1OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWxtLmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWRpdFJlYWxtLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlYWxtTmFtZSxVUkxfRU5DT0RJTkcpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImbm9kZUxhYmVsPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUobm9kZUxhYmVsLFVSTF9FTkNPRElORyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZG9tYWluKTsKKyAgICAgICAgICAgICAgICBjb250YWluZXJOb2RlLmFkZENoaWxkKHJlYWxtTm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfSAgIAorICAgICAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgbm9kZXMgZm9yIGFueSBkZWZpbmUgcmVzb3VyY2VzIGZvciB0aGUgc3BlY2lmaWVkIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyTm9kZSBDb250YWluZXIgbm9kZSBmb3IgdGhlIHRyZWUgY29udHJvbAorICAgICAqIEBwYXJhbSBjb250YWluZXJOYW1lIE9iamVjdCBuYW1lIG9mIHRoZSBwYXJlbnQgY29udGFpbmVyCisgICAgICogQHBhcmFtIHJlc291cmNlcyBUaGUgTWVzc2FnZVJlc291cmNlcyBmb3Igb3VyIGxvY2FsaXplZCBtZXNzYWdlcworICAgICAqICBtZXNzYWdlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdldFJlc291cmNlcyhUcmVlQ29udHJvbE5vZGUgY29udGFpbmVyTm9kZSwgU3RyaW5nIGNvbnRhaW5lck5hbWUpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgZG9tYWluID0gY29udGFpbmVyTm9kZS5nZXREb21haW4oKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGNvbnRhaW5lck5hbWUpOworICAgICAgICBTdHJpbmcgdHlwZSA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJ0eXBlIik7CisgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHR5cGUgPSBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgiajJlZVR5cGUiKTsKKyAgICAgICAgICAgIGlmICh0eXBlLmVxdWFscygiV2ViTW9kdWxlIikpIHsKKyAgICAgICAgICAgICAgICB0eXBlID0gIkNvbnRleHQiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0eXBlID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHBhdGggPSAiIjsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSAiIjsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICBpZiAoKG5hbWUgIT0gbnVsbCkgJiYgKG5hbWUubGVuZ3RoKCkgPiAwKSkgeworICAgICAgICAgICAgLy8gY29udGV4dCByZXNvdXJjZQorICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIpOworICAgICAgICAgICAgaW50IGkgPSBuYW1lLmluZGV4T2YoIi8iKTsKKyAgICAgICAgICAgIGhvc3QgPSBuYW1lLnN1YnN0cmluZygwLGkpOworICAgICAgICAgICAgcGF0aCA9IG5hbWUuc3Vic3RyaW5nKGkpOworICAgICAgICB9ICAgICAKKyAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHN1YnRyZWUgPSBuZXcgVHJlZUNvbnRyb2xOb2RlCisgICAgICAgICAgICAoIkNvbnRleHQgUmVzb3VyY2UgQWRtaW5pc3RyYXRpb24gIiArIGNvbnRhaW5lck5hbWUsCisgICAgICAgICAgICAgImZvbGRlcl8xNl9wYWQuZ2lmIiwKKyAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMudHJlZUJ1aWxkZXIuc3VidHJlZU5vZGUiKSwKKyAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICB0cnVlLCBkb21haW4pOyAgICAgICAgCisgICAgICAgIGNvbnRhaW5lck5vZGUuYWRkQ2hpbGQoc3VidHJlZSk7CisgICAgICAgIFRyZWVDb250cm9sTm9kZSBkYXRhc291cmNlcyA9IG5ldyBUcmVlQ29udHJvbE5vZGUKKyAgICAgICAgICAgICgiQ29udGV4dCBEYXRhIFNvdXJjZXMgIiArIGNvbnRhaW5lck5hbWUsCisgICAgICAgICAgICAiRGF0YXNvdXJjZS5naWYiLAorICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLnRyZWVCdWlsZGVyLmRhdGFzb3VyY2VzIiksCisgICAgICAgICAgICAicmVzb3VyY2VzL2xpc3REYXRhU291cmNlcy5kbz9yZXNvdXJjZXR5cGU9IiArIAorICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHR5cGUsVVJMX0VOQ09ESU5HKSArICImcGF0aD0iICsKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoLFVSTF9FTkNPRElORykgKyAiJmhvc3Q9IiArIAorICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3QsVVJMX0VOQ09ESU5HKSArICImZG9tYWluPSIgKyAKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkb21haW4sVVJMX0VOQ09ESU5HKSArICImZm9yd2FyZD0iICsKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSgiRGF0YVNvdXJjZXMgTGlzdCBTZXR1cCIsVVJMX0VOQ09ESU5HKSwKKyAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgIGZhbHNlLCBkb21haW4pOworICAgICAgICBUcmVlQ29udHJvbE5vZGUgbWFpbHNlc3Npb25zID0gbmV3IFRyZWVDb250cm9sTm9kZQorICAgICAgICAgICAgKCJDb250ZXh0IE1haWwgU2Vzc2lvbnMgIiArIGNvbnRhaW5lck5hbWUsCisgICAgICAgICAgICAiTWFpbHNlc3Npb24uZ2lmIiwKKyAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInJlc291cmNlcy50cmVlQnVpbGRlci5tYWlsc2Vzc2lvbnMiKSwKKyAgICAgICAgICAgICJyZXNvdXJjZXMvbGlzdE1haWxTZXNzaW9ucy5kbz9yZXNvdXJjZXR5cGU9IiArIAorICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHR5cGUsVVJMX0VOQ09ESU5HKSArICImcGF0aD0iICsKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoLFVSTF9FTkNPRElORykgKyAiJmhvc3Q9IiArIAorICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3QsVVJMX0VOQ09ESU5HKSArICImZG9tYWluPSIgKyAKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkb21haW4sVVJMX0VOQ09ESU5HKSArICImZm9yd2FyZD0iICsKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSgiTWFpbFNlc3Npb25zIExpc3QgU2V0dXAiLFVSTF9FTkNPRElORyksCisgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICBmYWxzZSwgZG9tYWluKTsKKyAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHJlc291cmNlbGlua3MgPSBuZXcgVHJlZUNvbnRyb2xOb2RlCisgICAgICAgICAgICAoIlJlc291cmNlIExpbmtzICIgKyBjb250YWluZXJOYW1lLAorICAgICAgICAgICAgIlJlc291cmNlTGluay5naWYiLAorICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLnRyZWVCdWlsZGVyLnJlc291cmNlbGlua3MiKSwKKyAgICAgICAgICAgICJyZXNvdXJjZXMvbGlzdFJlc291cmNlTGlua3MuZG8/cmVzb3VyY2V0eXBlPSIgKyAKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0eXBlLFVSTF9FTkNPRElORykgKyAiJnBhdGg9IiArCisgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aCxVUkxfRU5DT0RJTkcpICsgIiZob3N0PSIgKyAKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0LFVSTF9FTkNPRElORykgKyAiJmRvbWFpbj0iICsgCisgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluLFVSTF9FTkNPRElORykgKyAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIlJlc291cmNlTGlua3MgTGlzdCBTZXR1cCIsVVJMX0VOQ09ESU5HKSwKKyAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgIGZhbHNlLCBkb21haW4pOworICAgICAgICBUcmVlQ29udHJvbE5vZGUgZW52cyA9IG5ldyBUcmVlQ29udHJvbE5vZGUKKyAgICAgICAgICAgICgiQ29udGV4dCBFbnZpcm9ubWVudCBFbnRyaWVzICIrIGNvbnRhaW5lck5hbWUsCisgICAgICAgICAgICAiRW52aXJvbm1lbnRFbnRyaWVzLmdpZiIsCisgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMuZW52LmVudHJpZXMiKSwKKyAgICAgICAgICAgICJyZXNvdXJjZXMvbGlzdEVudkVudHJpZXMuZG8/cmVzb3VyY2V0eXBlPSIgKyAKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0eXBlLFVSTF9FTkNPRElORykgKyAiJnBhdGg9IiArCisgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aCxVUkxfRU5DT0RJTkcpICsgIiZob3N0PSIgKyAKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0LFVSTF9FTkNPRElORykgKyAiJmRvbWFpbj0iICsgCisgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluLFVSTF9FTkNPRElORykgKyAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIkVudkVudHJpZXMgTGlzdCBTZXR1cCIsVVJMX0VOQ09ESU5HKSwKKyAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgIGZhbHNlLCBkb21haW4pOworICAgICAgICBzdWJ0cmVlLmFkZENoaWxkKGRhdGFzb3VyY2VzKTsKKyAgICAgICAgc3VidHJlZS5hZGRDaGlsZChtYWlsc2Vzc2lvbnMpOworICAgICAgICBzdWJ0cmVlLmFkZENoaWxkKHJlc291cmNlbGlua3MpOworICAgICAgICBzdWJ0cmVlLmFkZENoaWxkKGVudnMpOworICAgIH0KKyAgICAKKyAgICAKKyAgIC8qKgorICAgICAqIEFwcGVuZCBub2RlcyBmb3IgYW55IGRlZmluZWQgdmFsdmVzIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXJOb2RlIENvbnRhaW5lciBub2RlIGZvciB0aGUgdHJlZSBjb250cm9sCisgICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgT2JqZWN0IG5hbWUgb2YgdGhlIHBhcmVudCBjb250YWluZXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgYnVpbGRpbmcgdGhlIHRyZWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXRWYWx2ZXMoVHJlZUNvbnRyb2xOb2RlIGNvbnRhaW5lck5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250YWluZXJOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgZG9tYWluID0gY29udGFpbmVyTm9kZS5nZXREb21haW4oKTsKKyAgICAgICAgSXRlcmF0b3IgdmFsdmVOYW1lcyA9CisgICAgICAgICAgICAgICAgTGlzdHMuZ2V0VmFsdmVzKG1CU2VydmVyLCBjb250YWluZXJOYW1lKS5pdGVyYXRvcigpOyAgICAgICAgCisgICAgICAgIHdoaWxlICh2YWx2ZU5hbWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHZlTmFtZSA9IChTdHJpbmcpIHZhbHZlTmFtZXMubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIG5vZGVMYWJlbCA9ICJWYWx2ZSBmb3IgIiArIGNvbnRhaW5lck5vZGUuZ2V0TGFiZWwoKTsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSB2YWx2ZU5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBUcmVlQ29udHJvbE5vZGUodmFsdmVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHZlLmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWRpdFZhbHZlLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHZhbHZlTmFtZSxVUkxfRU5DT0RJTkcpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImbm9kZUxhYmVsPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUobm9kZUxhYmVsLFVSTF9FTkNPRElORykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZwYXJlbnQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShjb250YWluZXJOYW1lLFVSTF9FTkNPRElORyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZG9tYWluKTsKKyAgICAgICAgICAgIGNvbnRhaW5lck5vZGUuYWRkQ2hpbGQodmFsdmVOb2RlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UcmVlQnVpbGRlci5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1RyZWVCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmYmUyZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UcmVlQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluOworCisvKioKKyAqIDxwPiBJbnRlcmZhY2UgZm9yIEFkbWluIFRyZWUgQ29udHJvbGxlciB0byBidWlsZCBwbHVnaW4gY29tcG9uZW50cworICogaW50byB0aGUgdHJlZQorICoKKyAqIEBhdXRob3IgSmF6bWluIEpvbnNvbgorICogQHZlcnNpb24KKyAqLworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworcHVibGljIGludGVyZmFjZSBUcmVlQnVpbGRlciB7CisKKyAgICBwdWJsaWMgdm9pZCBidWlsZFRyZWUoVHJlZUNvbnRyb2wgdHJlZUNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uU2VydmxldCBzZXJ2bGV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCk7Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vVHJlZUNvbnRyb2wuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UcmVlQ29udHJvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNGM3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vVHJlZUNvbnRyb2wuamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKworLyoqCisgKiA8cD5UaGUgb3ZlcmFsbCBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSA8ZW0+dHJlZSBjb250cm9sPC9lbT4KKyAqIHRoYXQgY2FuIGJlIHJlbmRlcmVkIGJ5IHRoZSA8Y29kZT5UcmVlQ29udHJvbFRhZzwvY29kZT4gY3VzdG9tIHRhZy4KKyAqIEVhY2ggbm9kZSBvZiB0aGUgdHJlZSBpcyByZXByZXNlbnRlZCBieSBhbiBpbnN0YW5jZSBvZgorICogPGNvZGU+VHJlZUNvbnRyb2xOb2RlPC9jb2RlPi48L3A+CisgKgorICogQGF1dGhvciBKYXptaW4gSm9uc29uCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFRyZWVDb250cm9sIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSB3aXRoIG5vIHByZWRlZmluZWQgcm9vdCBub2RlLgorICAgICAqLworICAgIHB1YmxpYyBUcmVlQ29udHJvbCgpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICBzZXRSb290KG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3Qgbm9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb290IFRoZSBuZXcgcm9vdCBub2RlCisgICAgICovCisgICAgcHVibGljIFRyZWVDb250cm9sKFRyZWVDb250cm9sTm9kZSByb290KSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgc2V0Um9vdChyb290KTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBjb2xsZWN0aW9uIG9mIG5vZGVzIHRoYXQgcmVwcmVzZW50IHRoaXMgdHJlZSwga2V5ZWQgYnkgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCByZWdpc3RyeSA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBtb3N0IHJlY2VudGx5IHNlbGVjdGVkIG5vZGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFRyZWVDb250cm9sTm9kZSBzZWxlY3RlZCA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcm9vdCBub2RlIG9mIHRoZSBlbnRpcmUgdHJlZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVHJlZUNvbnRyb2xOb2RlIHJvb3QgPSBudWxsOworCisgICAgcHVibGljIFRyZWVDb250cm9sTm9kZSBnZXRSb290KCkgeworICAgICAgICByZXR1cm4gKHRoaXMucm9vdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0Um9vdChUcmVlQ29udHJvbE5vZGUgcm9vdCkgeworICAgICAgICBpZiAodGhpcy5yb290ICE9IG51bGwpCisgICAgICAgICAgICByZW1vdmVOb2RlKHRoaXMucm9vdCk7CisgICAgICAgIGlmIChyb290ICE9IG51bGwpCisgICAgICAgICAgICBhZGROb2RlKHJvb3QpOworICAgICAgICByb290LnNldExhc3QodHJ1ZSk7CisgICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBkaXNwbGF5YWJsZSAid2lkdGgiIG9mIHRoaXMgdHJlZSAodGhhdCBpcywgdGhlIG1heGltdW0KKyAgICAgKiBkZXB0aCBvZiB0aGUgdmlzaWJsZSBwYXJ0IG9mIHRoZSB0cmVlKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFdpZHRoKCkgeworCisgICAgICAgIGlmIChyb290ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKGdldFdpZHRoKHJvb3QpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEZpbmQgYW5kIHJldHVybiB0aGUgPGNvZGU+VHJlZUNvbnRyb2xOb2RlPC9jb2RlPiBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIG5vZGUgbmFtZSwgaWYgaXQgZXhpc3RzOyBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIDxjb2RlPlRyZWVDb250cm9sTm9kZTwvY29kZT4gdG8gYmUgcmV0dXJuZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgVHJlZUNvbnRyb2xOb2RlIGZpbmROb2RlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChyZWdpc3RyeSkgeworICAgICAgICAgICAgcmV0dXJuICgoVHJlZUNvbnRyb2xOb2RlKSByZWdpc3RyeS5nZXQobmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE1hcmsgdGhlIHNwZWNpZmllZCBub2RlIGFzIHRoZSBvbmUtYW5kLW9ubHkgY3VycmVudGx5IHNlbGVjdGVkIG9uZSwKKyAgICAgKiBkZXNlbGVjdGluZyBhbnkgcHJldmlvdXMgbm9kZSB0aGF0IHdhcyBzbyBtYXJrZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbm9kZSBOYW1lIG9mIHRoZSBub2RlIHRvIG1hcmsgYXMgc2VsZWN0ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogIGlmIHRoZXJlIHNob3VsZCBiZSBubyBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdE5vZGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAoc2VsZWN0ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VsZWN0ZWQuc2V0U2VsZWN0ZWQoZmFsc2UpOworICAgICAgICAgICAgc2VsZWN0ZWQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIHNlbGVjdGVkID0gZmluZE5vZGUobmFtZSk7CisgICAgICAgIGlmIChzZWxlY3RlZCAhPSBudWxsKQorICAgICAgICAgICAgc2VsZWN0ZWQuc2V0U2VsZWN0ZWQodHJ1ZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciB0aGUgc3BlY2lmaWVkIG5vZGUgaW4gb3VyIHJlZ2lzdHJ5IG9mIHRoZSBjb21wbGV0ZSB0cmVlLgorICAgICAqCisgICAgICogQHBhcmFtIG5vZGUgVGhlIDxjb2RlPlRyZWVDb250cm9sTm9kZTwvY29kZT4gdG8gYmUgcmVnaXN0ZXJlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG5hbWUgb2YgdGhpcyBub2RlCisgICAgICogIGlzIG5vdCB1bmlxdWUKKyAgICAgKi8KKyAgICB2b2lkIGFkZE5vZGUoVHJlZUNvbnRyb2xOb2RlIG5vZGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCisgICAgICAgIHN5bmNocm9uaXplZCAocmVnaXN0cnkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAocmVnaXN0cnkuY29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmFtZSAnIiArIG5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgaXMgbm90IHVuaXF1ZSIpOworICAgICAgICAgICAgbm9kZS5zZXRUcmVlKHRoaXMpOworICAgICAgICAgICAgcmVnaXN0cnkucHV0KG5hbWUsIG5vZGUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZSB0aGUgd2lkdGggb2YgdGhlIHN1YnRyZWUgYmVsb3cgdGhlIHNwZWNpZmllZCBub2RlLgorICAgICAqCisgICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgZm9yIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgd2lkdGgKKyAgICAgKi8KKyAgICBpbnQgZ2V0V2lkdGgoVHJlZUNvbnRyb2xOb2RlIG5vZGUpIHsKKworICAgICAgICBpbnQgd2lkdGggPSBub2RlLmdldFdpZHRoKCk7CisgICAgICAgIGlmICghbm9kZS5pc0V4cGFuZGVkKCkpCisgICAgICAgICAgICByZXR1cm4gKHdpZHRoKTsKKyAgICAgICAgVHJlZUNvbnRyb2xOb2RlIGNoaWxkcmVuW10gPSBub2RlLmZpbmRDaGlsZHJlbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgY3VycmVudCA9IGdldFdpZHRoKGNoaWxkcmVuW2ldKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50ID4gd2lkdGgpCisgICAgICAgICAgICAgICAgd2lkdGggPSBjdXJyZW50OworICAgICAgICB9CisgICAgICAgIHJldHVybiAod2lkdGgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBzcGVjaWZpZWQgbm9kZSwgYXMgd2VsbCBhcyBhbGwgY2hpbGQgbm9kZXMgb2YgdGhpcworICAgICAqIG5vZGUsIGZyb20gb3VyIHJlZ2lzdHJ5IG9mIHRoZSBjb21wbGV0ZSB0cmVlLiAgSWYgdGhpcyBub2RlIGlzIG5vdAorICAgICAqIHByZXNlbnQsIG5vIGFjdGlvbiBpcyB0YWtlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBub2RlIFRoZSA8Y29kZT5UcmVlQ29udHJvbE5vZGU8L2NvZGU+IHRvIGJlIGRlcmVnaXN0ZXJlZAorICAgICAqLworICAgIHZvaWQgcmVtb3ZlTm9kZShUcmVlQ29udHJvbE5vZGUgbm9kZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocmVnaXN0cnkpIHsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBjaGlsZHJlbltdID0gbm9kZS5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjaGlsZHJlbltpXSk7CisgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUuc2V0UGFyZW50KG51bGwpOworICAgICAgICAgICAgbm9kZS5zZXRUcmVlKG51bGwpOworICAgICAgICAgICAgaWYgKG5vZGUgPT0gdGhpcy5yb290KSB7CisgICAgICAgICAgICAgICAgdGhpcy5yb290ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LnJlbW92ZShub2RlLmdldE5hbWUoKSk7CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vVHJlZUNvbnRyb2xOb2RlLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vVHJlZUNvbnRyb2xOb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiMTQyZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UcmVlQ29udHJvbE5vZGUuamF2YQpAQCAtMCwwICsxLDM3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworCisvKioKKyAqIDxwPkFuIGluZGl2aWR1YWwgbm9kZSBvZiBhIHRyZWUgY29udHJvbCByZXByZXNlbnRlZCBieSBhbiBpbnN0YW5jZSBvZgorICogPGNvZGU+VHJlZUNvbnRyb2w8L2NvZGU+LCBhbmQgcmVuZGVyZWQgYnkgYW4gaW5zdGFuY2Ugb2YKKyAqIDxjb2RlPlRyZWVDb250cm9sVGFnPC9jb2RlPi48L3A+CisgKgorICogQGF1dGhvciBKYXptaW4gSm9uc29uCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFRyZWVDb250cm9sTm9kZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgVHJlZUNvbnRyb2xOb2RlIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgSW50ZXJuYWwgbmFtZSBvZiB0aGlzIG5vZGUgKG11c3QgYmUgdW5pcXVlIHdpdGhpbgorICAgICAqICB0aGUgZW50aXJlIHRyZWUpCisgICAgICogQHBhcmFtIGljb24gUGF0aG5hbWUgb2YgdGhlIGltYWdlIGZpbGUgZm9yIHRoZSBpY29uIHRvIGJlIGRpc3BsYXllZAorICAgICAqICB3aGVuIHRoaXMgbm9kZSBpcyB2aXNpYmxlLCByZWxhdGl2ZSB0byB0aGUgaW1hZ2UgZGlyZWN0b3J5CisgICAgICogIGZvciBvdXIgaW1hZ2VzCisgICAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGlmCisgICAgICogIHRoaXMgbm9kZSBpcyB2aXNpYmxlCisgICAgICogQHBhcmFtIGFjdGlvbiBUaGUgaHlwZXJsaW5rIHRvIGJlIHNlbGVjdGVkIGlmIHRoZSB1c2VyCisgICAgICogIHNlbGVjdHMgdGhpcyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG5vZGUncyBsYWJlbCBzaG91bGQKKyAgICAgKiAgbm90IGJlIGEgaHlwZXJsaW5rCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgd2luZG93IHRhcmdldCBpbiB3aGljaCB0aGUgPGNvZGU+YWN0aW9uPC9jb2RlPgorICAgICAqICBoeXBlcmxpbmsncyByZXN1bHRzIHdpbGwgYmUgZGlzcGxheWVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IKKyAgICAgKiAgdGhlIGN1cnJlbnQgd2luZG93CisgICAgICogQHBhcmFtIGV4cGFuZGVkIFNob3VsZCB0aGlzIG5vZGUgYmUgZXhwYW5kZWQ/CisgICAgICovCisgICAgcHVibGljIFRyZWVDb250cm9sTm9kZShTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpY29uLCBTdHJpbmcgbGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aW9uLCBTdHJpbmcgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHBhbmRlZCwgU3RyaW5nIGRvbWFpbikgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuaWNvbiA9IGljb247CisgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKKyAgICAgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247CisgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICB0aGlzLmV4cGFuZGVkID0gZXhwYW5kZWQ7CisgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBjaGlsZCA8Y29kZT5UcmVlQ29udHJvbE5vZGVzPC9jb2RlPiBmb3IgdGhpcyBub2RlLCBpbiB0aGUKKyAgICAgKiBvcmRlciB0aGF0IHRoZXkgc2hvdWxkIGJlIGRpc3BsYXllZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGh5cGVybGluayB0byB3aGljaCBjb250cm9sIHdpbGwgYmUgZGlyZWN0ZWQgaWYgdGhpcyBub2RlCisgICAgICogaXMgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBhY3Rpb24gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5hY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkb21haW4gb2YgdGhpcyBub2RlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZG9tYWluID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZG9tYWluKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIG5vZGUgY3VycmVudGx5IGV4cGFuZGVkPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGV4cGFuZGVkID0gZmFsc2U7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cGFuZGVkKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZXhwYW5kZWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4cGFuZGVkKGJvb2xlYW4gZXhwYW5kZWQpIHsKKyAgICAgICAgdGhpcy5leHBhbmRlZCA9IGV4cGFuZGVkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHBhdGhuYW1lIHRvIHRoZSBpY29uIGZpbGUgZGlzcGxheWVkIHdoZW4gdGhpcyBub2RlIGlzIHZpc2libGUsCisgICAgICogcmVsYXRpdmUgdG8gdGhlIGltYWdlIGRpcmVjdG9yeSBmb3Igb3VyIGltYWdlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGljb24gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRJY29uKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuaWNvbik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFiZWwgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCB3aGVuIHRoaXMgbm9kZSBpcyB2aXNpYmxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbGFiZWwgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxhYmVsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElzIHRoaXMgdGhlIGxhc3Qgbm9kZSBpbiB0aGUgc2V0IG9mIGNoaWxkcmVuIGZvciBvdXIgcGFyZW50IG5vZGU/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbGFzdCA9IGZhbHNlOworCisgICAgcHVibGljIGJvb2xlYW4gaXNMYXN0KCkgeworICAgICAgICByZXR1cm4gKHRoaXMubGFzdCk7CisgICAgfQorCisgICAgdm9pZCBzZXRMYXN0KGJvb2xlYW4gbGFzdCkgeworICAgICAgICB0aGlzLmxhc3QgPSBsYXN0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogSXMgdGhpcyBhICJsZWFmIiBub2RlIChpLmUuIG9uZSB3aXRoIG5vIGNoaWxkcmVuKT8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xlYWYoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoY2hpbGRyZW4pIHsKKyAgICAgICAgICAgIHJldHVybiAoY2hpbGRyZW4uc2l6ZSgpIDwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSB1bmlxdWUgKHdpdGhpbiB0aGUgZW50aXJlIHRyZWUpIG5hbWUgb2YgdGhpcyBub2RlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5uYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBwYXJlbnQgbm9kZSBvZiB0aGlzIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMKKyAgICAgKiBpcyB0aGUgcm9vdCBub2RlLgorICAgICAqLworICAgIHByb3RlY3RlZCBUcmVlQ29udHJvbE5vZGUgcGFyZW50ID0gbnVsbDsKKworICAgIHB1YmxpYyBUcmVlQ29udHJvbE5vZGUgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gKHRoaXMucGFyZW50KTsKKyAgICB9CisKKyAgICB2b2lkIHNldFBhcmVudChUcmVlQ29udHJvbE5vZGUgcGFyZW50KSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCisgICAgICAgICAgICB3aWR0aCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdpZHRoID0gcGFyZW50LmdldFdpZHRoKCkgKyAxOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSXMgdGhpcyBub2RlIGN1cnJlbnRseSBzZWxlY3RlZD8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzZWxlY3RlZCA9IGZhbHNlOworCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlbGVjdGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIHNlbGVjdGVkKSB7CisgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSB3aW5kb3cgdGFyZ2V0IGZvciB0aGUgaHlwZXJsaW5rIGlkZW50aWZpZWQgYnkgdGhlCisgICAgICogPGNvZGU+YWN0aW9uPC9jb2RlPiBwcm9wZXJ0eSwgaWYgdGhpcyBub2RlIGlzIHNlbGVjdGVkCisgICAgICogYnkgdGhlIHVzZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB0YXJnZXQgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy50YXJnZXQpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPlRyZWVDb250cm9sPC9jb2RlPiBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlCisgICAgICogZW50aXJlIHRyZWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFRyZWVDb250cm9sIHRyZWUgPSBudWxsOworCisgICAgcHVibGljIFRyZWVDb250cm9sIGdldFRyZWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy50cmVlKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFRyZWUoVHJlZUNvbnRyb2wgdHJlZSkgeworICAgICAgICB0aGlzLnRyZWUgPSB0cmVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGRpc3BsYXkgd2lkdGggbmVjZXNzYXJ5IHRvIGRpc3BsYXkgdGhpcyBpdGVtIChpZiBpdCBpcyB2aXNpYmxlKS4KKyAgICAgKiBJZiB0aGlzIGl0ZW0gaXMgbm90IHZpc2libGUsIHRoZSBjYWxjdWxhdGVkIHdpZHRoIHdpbGwgYmUgdGhhdCBvZiBvdXIKKyAgICAgKiBtb3N0IGltbWVkaWF0ZWx5IHZpc2libGUgcGFyZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgd2lkdGggPSAwOworCisgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLndpZHRoKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgY2hpbGQgbm9kZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkIFRoZSBuZXcgY2hpbGQgbm9kZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG5hbWUgb2YgdGhlIG5ldyBjaGlsZAorICAgICAqICBub2RlIGlzIG5vdCB1bmlxdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChUcmVlQ29udHJvbE5vZGUgY2hpbGQpCisgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCisgICAgICAgIHRyZWUuYWRkTm9kZShjaGlsZCk7CisgICAgICAgIGNoaWxkLnNldFBhcmVudCh0aGlzKTsKKyAgICAgICAgc3luY2hyb25pemVkIChjaGlsZHJlbikgeworICAgICAgICAgICAgaW50IG4gPSBjaGlsZHJlbi5zaXplKCk7CisgICAgICAgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgbm9kZSA9IChUcmVlQ29udHJvbE5vZGUpIGNoaWxkcmVuLmdldChuIC0gMSk7CisgICAgICAgICAgICAgICAgbm9kZS5zZXRMYXN0KGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoaWxkLnNldExhc3QodHJ1ZSk7CisgICAgICAgICAgICBjaGlsZHJlbi5hZGQoY2hpbGQpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBjaGlsZCBub2RlIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIGNoaWxkIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFplcm8tcmVsYXRpdmUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBuZXcgbm9kZQorICAgICAqICBzaG91bGQgYmUgaW5zZXJ0ZWQKKyAgICAgKiBAcGFyYW0gY2hpbGQgVGhlIG5ldyBjaGlsZCBub2RlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBvZiB0aGUgbmV3IGNoaWxkCisgICAgICogIG5vZGUgaXMgbm90IHVuaXF1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKGludCBvZmZzZXQsIFRyZWVDb250cm9sTm9kZSBjaGlsZCkKKyAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisKKyAgICAgICAgdHJlZS5hZGROb2RlKGNoaWxkKTsKKyAgICAgICAgY2hpbGQuc2V0UGFyZW50KHRoaXMpOworICAgICAgICBzeW5jaHJvbml6ZWQgKGNoaWxkcmVuKSB7CisgICAgICAgICAgICBjaGlsZHJlbi5hZGQob2Zmc2V0LCBjaGlsZCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgY2hpbGQgbm9kZXMgZm9yIHRoaXMgbm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVHJlZUNvbnRyb2xOb2RlW10gZmluZENoaWxkcmVuKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoY2hpbGRyZW4pIHsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSByZXN1bHRzW10gPSBuZXcgVHJlZUNvbnRyb2xOb2RlW2NoaWxkcmVuLnNpemUoKV07CisgICAgICAgICAgICByZXR1cm4gKChUcmVlQ29udHJvbE5vZGVbXSkgY2hpbGRyZW4udG9BcnJheShyZXN1bHRzKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoaXMgbm9kZSBmcm9tIHRoZSB0cmVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKworICAgICAgICBpZiAodHJlZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cmVlLnJlbW92ZU5vZGUodGhpcyk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBjaGlsZCBub2RlIChhbmQgYWxsIGNoaWxkcmVuIG9mIHRoYXQgY2hpbGQpIGF0IHRoZQorICAgICAqIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGUgY2hpbGQgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvZmZzZXQgWmVyby1yZWxhdGl2ZSBvZmZzZXQgYXQgd2hpY2ggdGhlIGV4aXN0aW5nCisgICAgICogIG5vZGUgc2hvdWxkIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChpbnQgb2Zmc2V0KSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChjaGlsZHJlbikgeworICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIGNoaWxkID0KKyAgICAgICAgICAgICAgICAoVHJlZUNvbnRyb2xOb2RlKSBjaGlsZHJlbi5nZXQob2Zmc2V0KTsKKyAgICAgICAgICAgIHRyZWUucmVtb3ZlTm9kZShjaGlsZCk7CisgICAgICAgICAgICBjaGlsZC5zZXRQYXJlbnQobnVsbCk7CisgICAgICAgICAgICBjaGlsZHJlbi5yZW1vdmUob2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgY2hpbGQgbm9kZS4gIEl0IGlzIGFzc3VtZWQgdGhhdCBhbGwgb2YgdGhlCisgICAgICogY2hpbGRyZW4gb2YgdGhpcyBjaGlsZCBub2RlIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGQgQ2hpbGQgbm9kZSB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgdm9pZCByZW1vdmVDaGlsZChUcmVlQ29udHJvbE5vZGUgY2hpbGQpIHsKKworICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAoY2hpbGRyZW4pIHsKKyAgICAgICAgICAgIGludCBuID0gY2hpbGRyZW4uc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT0gKFRyZWVDb250cm9sTm9kZSkgY2hpbGRyZW4uZ2V0KGkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UcmVlQ29udHJvbFRhZy5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1RyZWVDb250cm9sVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwMDc0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UcmVlQ29udHJvbFRhZy5qYXZhCkBAIC0wLDAgKzEsNTIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcFdyaXRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5QYWdlQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnU3VwcG9ydDsKKworCisvKioKKyAqIDxwPkpTUCBjdXN0b20gdGFnIHRoYXQgcmVuZGVycyBhIHRyZWUgY29udHJvbCByZXByZXNlbnRlZCBieSB0aGUKKyAqIDxjb2RlPlRyZWVDb250cm9sPC9jb2RlPiBhbmQgPGNvZGU+VHJlZUNvbnRyb2xOb2RlPC9jb2RlPiBjbGFzc2VzLgorICogVGhpcyB0YWcgaGFzIHRoZSBmb2xsb3dpbmcgdXNlci1zZXR0YWJsZSBhdHRyaWJ1dGVzOjwvcD4KKyAqIDx1bD4KKyAqIDxsaT48c3Ryb25nPmFjdGlvbjwvc3Ryb25nPiAtIEh5cGVybGluayB0byB3aGljaCBleHBhbmQvY29udHJhY3QgYWN0aW9ucworICogICAgIHNob3VsZCBiZSBzZW50LCB3aXRoIGEgc3RyaW5nICI8Y29kZT57bmFtZX08L2NvZGU+IG1hcmtpbmcgd2hlcmUKKyAqICAgICB0aGUgbm9kZSBuYW1lIG9mIHRoZSBhZmZlY3RlZCBub2RlIHNob3VsZCBiZSBpbmNsdWRlZC48L2xpPgorICogPGxpPjxzdHJvbmc+aW1hZ2VzPC9zdHJvbmc+IC0gTmFtZSBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGltYWdlcworICogICAgIGZvciBvdXIgaWNvbnMsIHJlbGF0aXZlIHRvIHRoZSBwYWdlIGluY2x1ZGluZyB0aGlzIHRhZy4gIElmIG5vdAorICogICAgIHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gImltYWdlcyIuPC9saT4KKyAqIDxsaT48c3Ryb25nPnNjb3BlPC9zdHJvbmc+IC0gQXR0cmlidXRlIHNjb3BlIGluIHdoaWNoIHRoZSA8Y29kZT50cmVlPC9jb2RlPgorICogICAgIGF0dHJpYnV0ZSBpcyB0byBiZSBmb3VuZCAocGFnZSwgcmVxdWVzdCwgc2Vzc2lvbiwgYXBwbGljYXRpb24pLiAgSWYKKyAqICAgICBub3Qgc3BlY2lmaWVkLCB0aGUgYXR0cmlidXRlIGlzIHNlYXJjaGVkIGZvciBpbiBhbGwgc2NvcGVzLjwvbGk+CisgKiA8bGk+PHN0cm9uZz5zdHlsZTwvc3Ryb25nPiAtIENTUyBzdHlsZSA8Y29kZT5jbGFzczwvY29kZT4gdG8gYmUgYXBwbGllZAorICogICAgIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGVudGlyZSByZW5kZXJlZCBvdXRwdXQgb2YgdGhlIHRyZWUgY29udHJvbC4KKyAqICAgICBJZiBub3Qgc3BlY2lmaWVkLCBubyBzdHlsZSBjbGFzcyBpcyBhcHBsaWVkLjwvbGk+CisgKiA8bGk+PHN0cm9uZz5zdHlsZVNlbGVjdGVkPC9zdHJvbmc+IC0gQ1NTIHN0eWxlIDxjb2RlPmNsYXNzPC9jb2RlPiB0byBiZQorICogICAgIGFwcGxpZWQgdG8gdGhlIHRleHQgb2YgYW55IGVsZW1lbnQgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuICBJZiBub3QKKyAqICAgICBzcGVjaWZpZWQsIG5vIGFkZGl0aW9uYWwgc3R5bGUgY2xhc3MgaXMgYXBwbGllZC48L2xpPgorICogPGxpPjxzdHJvbmc+c3R5bGVVbnNlbGVjdGVkPC9zdHJvbmc+IC0gQ1NTIHN0eWxlIDxjb2RlPmNsYXNzPC9jb2RlPiB0byBiZQorICogICAgIGFwcGxpZWQgdG8gdGhlIHRleHQgb2YgYW55IGVsZW1lbnQgdGhhdCBpcyBub3QgY3VycmVudGx5IHNlbGVjdGVkLgorICogICAgIElmIG5vdCBzcGVjaWZpZWQsIG5vIGFkZGl0aW9uYWwgc3R5bGUgY2xhc3MgaXMgYXBwbGllZC48L2xpPgorICogPGxpPjxzdHJvbmc+dHJlZTwvc3Ryb25nPiAtIEF0dHJpYnV0ZSBuYW1lIHVuZGVyIHdoaWNoIHRoZQorICogICAgIDxjb2RlPlRyZWVDb250cm9sPC9jb2RlPiBiZWFuIG9mIHRoZSB0cmVlIHdlIGFyZSByZW5kZXJpbmcKKyAqICAgICBpcyBzdG9yZWQsIGluIHRoZSBzY29wZSBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnNjb3BlPC9jb2RlPgorICogICAgIGF0dHJpYnV0ZS4gIFRoaXMgYXR0cmlidXRlIGlzIHJlcXVpcmVkLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIDxzdHJvbmc+RklYTUU8L3N0cm9uZz4gLSBJbnRlcm5hdGlvbmFsaXplIHRoZSBleGNlcHRpb24gbWVzc2FnZXMhCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBUcmVlQ29udHJvbFRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgeworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgbmFtZSBmb3IgaWNvbiBpbWFnZXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lNQUdFUyA9ICJpbWFnZXMiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZXMgb2YgdHJlZSBzdGF0ZSBpbWFnZXMgdGhhdCB3ZSBuZWVkLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfSEFORExFX0RPV05fTEFTVCA9ICAgICJoYW5kbGVkb3dubGFzdC5naWYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfSEFORExFX0RPV05fTUlERExFID0gICJoYW5kbGVkb3dubWlkZGxlLmdpZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9IQU5ETEVfUklHSFRfTEFTVCA9ICAgImhhbmRsZXJpZ2h0bGFzdC5naWYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfSEFORExFX1JJR0hUX01JRERMRSA9ICJoYW5kbGVyaWdodG1pZGRsZS5naWYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfTElORV9MQVNUID0gICAgICAgICAgICJsaW5lbGFzdG5vZGUuZ2lmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX0xJTkVfTUlERExFID0gICAgICAgICAibGluZW1pZGRsZW5vZGUuZ2lmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX0xJTkVfVkVSVElDQUwgPSAgICAgICAibGluZXZlcnRpY2FsLmdpZiI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgaHlwZXJsaW5rIHRvIGJlIHVzZWQgZm9yIHN1Ym1pdHRpbmcgcmVxdWVzdHMgdG8gZXhwYW5kIGFuZAorICAgICAqIGNvbnRyYWN0IHRyZWUgbm9kZXMuICBUaGUgcGxhY2Vob2xkZXIgIjxjb2RlPntuYW1lfTwvY29kZT4iIHdpbGwKKyAgICAgKiBiZSByZXBsYWNlZCBieSB0aGUgPGNvZGU+bmFtZTwvY29kZT4gcHJvcGVydHkgb2YgdGhlIGN1cnJlbnQKKyAgICAgKiB0cmVlIG5vZGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBhY3Rpb24gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5hY3Rpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uKSB7CisgICAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBpbWFnZXMgZm9yIG91ciBpY29ucywKKyAgICAgKiByZWxhdGl2ZSB0byB0aGUgcGFnZSBpbmNsdWRpbmcgdGhpcyB0YWcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBpbWFnZXMgPSBERUZBVUxUX0lNQUdFUzsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW1hZ2VzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuaW1hZ2VzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbWFnZXMoU3RyaW5nIGltYWdlcykgeworICAgICAgICB0aGlzLmltYWdlcyA9IGltYWdlczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBzY29wZSBpbiB3aGljaCB0byBzZWFyY2ggZm9yIHRoZSA8Y29kZT50cmVlPC9jb2RlPgorICAgICAqIGF0dHJpYnV0ZS4gIE11c3QgYmUgInBhZ2UiLCAicmVxdWVzdCIsICJzZXNzaW9uIiwgb3IgImFwcGxpY2F0aW9uIgorICAgICAqIChvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgYW4gYXNjZW5kaW5nLXZpc2liaWxpdHkgc2VhcmNoKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNjb3BlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zY29wZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7CisgICAgICAgIGlmICghInBhZ2UiLmVxdWFscyhzY29wZSkgJiYKKyAgICAgICAgICAgICEicmVxdWVzdCIuZXF1YWxzKHNjb3BlKSAmJgorICAgICAgICAgICAgISJzZXNzaW9uIi5lcXVhbHMoc2NvcGUpICYmCisgICAgICAgICAgICAhImFwcGxpY2F0aW9uIi5lcXVhbHMoc2NvcGUpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzY29wZSAnIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlICsgIiciKTsKKyAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIENTUyBzdHlsZSA8Y29kZT5jbGFzczwvY29kZT4gdG8gYmUgYXBwbGllZCB0byB0aGUgZW50aXJlIHRyZWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzdHlsZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0eWxlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuc3R5bGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlKFN0cmluZyBzdHlsZSkgeworICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ1NTIHN0eWxlIDxjb2RlPmNsYXNzPC9jb2RlPiB0byBiZSBhcHBsaWVkIHRvIHRoZSB0ZXh0CisgICAgICogb2Ygc2VsZWN0ZWQgbm9kZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzdHlsZVNlbGVjdGVkID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3R5bGVTZWxlY3RlZCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnN0eWxlU2VsZWN0ZWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlU2VsZWN0ZWQoU3RyaW5nIHN0eWxlU2VsZWN0ZWQpIHsKKyAgICAgICAgdGhpcy5zdHlsZVNlbGVjdGVkID0gc3R5bGVTZWxlY3RlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBDU1Mgc3R5bGUgPGNvZGU+Y2xhc3M8L2NvZGU+IHRvIGJlIGFwcGxpZWQgdG8gdGhlIHRleHQKKyAgICAgKiBvZiB1bnNlbGVjdGVkIG5vZGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc3R5bGVVbnNlbGVjdGVkID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3R5bGVVbnNlbGVjdGVkKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuc3R5bGVVbnNlbGVjdGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdHlsZVVuc2VsZWN0ZWQoU3RyaW5nIHN0eWxlVW5zZWxlY3RlZCkgeworICAgICAgICB0aGlzLnN0eWxlVW5zZWxlY3RlZCA9IHN0eWxlVW5zZWxlY3RlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgKGluIHRoZSBzcGVjaWZpZWQgc2NvcGUpIHVuZGVyIHdoaWNoIG91cgorICAgICAqIDxjb2RlPlRyZWVDb250cm9sPC9jb2RlPiBpbnN0YW5jZSBpcyBzdG9yZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB0cmVlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHJlZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnRyZWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRyZWUoU3RyaW5nIHRyZWUpIHsKKyAgICAgICAgdGhpcy50cmVlID0gdHJlZTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgdGhpcyB0cmVlIGNvbnRyb2wuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEpzcEV4Y2VwdGlvbiBpZiBhIHByb2Nlc3NpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGludCBkb0VuZFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworCisgICAgICAgIFRyZWVDb250cm9sIHRyZWVDb250cm9sID0gZ2V0VHJlZUNvbnRyb2woKTsKKyAgICAgICAgSnNwV3JpdGVyIG91dCA9IHBhZ2VDb250ZXh0LmdldE91dCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0LnByaW50CisgICAgICAgICAgICAgICAgKCI8dGFibGUgYm9yZGVyPVwiMFwiIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiMFwiIik7CisgICAgICAgICAgICBpZiAoc3R5bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludCgiIGNsYXNzPVwiIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KHN0eWxlKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIlwiIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnRsbigiPiIpOworICAgICAgICAgICAgaW50IGxldmVsID0gMDsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBub2RlID0gdHJlZUNvbnRyb2wuZ2V0Um9vdCgpOworICAgICAgICAgICAgcmVuZGVyKG91dCwgbm9kZSwgbGV2ZWwsIHRyZWVDb250cm9sLmdldFdpZHRoKCksIHRydWUpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjwvdGFibGU+Iik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKEVWQUxfUEFHRSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgYWxsIHN0YXRlIGluZm9ybWF0aW9uIHNldCBieSB0aGlzIHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworCisgICAgICAgIHRoaXMuYWN0aW9uID0gbnVsbDsKKyAgICAgICAgdGhpcy5pbWFnZXMgPSBERUZBVUxUX0lNQUdFUzsKKyAgICAgICAgdGhpcy5zY29wZSA9IG51bGw7CisgICAgICAgIHRoaXMuc3R5bGUgPSBudWxsOworICAgICAgICB0aGlzLnN0eWxlU2VsZWN0ZWQgPSBudWxsOworICAgICAgICB0aGlzLnN0eWxlVW5zZWxlY3RlZCA9IG51bGw7CisgICAgICAgIHRoaXMudHJlZSA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPlRyZWVDb250cm9sPC9jb2RlPiBpbnN0YW5jZSBmb3IgdGhlIHRyZWUgY29udHJvbCB0aGF0CisgICAgICogd2UgYXJlIHJlbmRlcmluZy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSnNwRXhjZXB0aW9uIGlmIG5vIFRyZWVDb250cm9sIGluc3RhbmNlIGNhbiBiZSBmb3VuZAorICAgICAqLworICAgIHByb3RlY3RlZCBUcmVlQ29udHJvbCBnZXRUcmVlQ29udHJvbCgpIHRocm93cyBKc3BFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdCB0cmVlQ29udHJvbCA9IG51bGw7CisgICAgICAgIGlmIChzY29wZSA9PSBudWxsKQorICAgICAgICAgICAgdHJlZUNvbnRyb2wgPSBwYWdlQ29udGV4dC5maW5kQXR0cmlidXRlKHRyZWUpOworICAgICAgICBlbHNlIGlmICgicGFnZSIuZXF1YWxzKHNjb3BlKSkKKyAgICAgICAgICAgIHRyZWVDb250cm9sID0KKyAgICAgICAgICAgICAgICBwYWdlQ29udGV4dC5nZXRBdHRyaWJ1dGUodHJlZSwgUGFnZUNvbnRleHQuUEFHRV9TQ09QRSk7CisgICAgICAgIGVsc2UgaWYgKCJyZXF1ZXN0Ii5lcXVhbHMoc2NvcGUpKQorICAgICAgICAgICAgdHJlZUNvbnRyb2wgPQorICAgICAgICAgICAgICAgIHBhZ2VDb250ZXh0LmdldEF0dHJpYnV0ZSh0cmVlLCBQYWdlQ29udGV4dC5SRVFVRVNUX1NDT1BFKTsKKyAgICAgICAgZWxzZSBpZiAoInNlc3Npb24iLmVxdWFscyhzY29wZSkpCisgICAgICAgICAgICB0cmVlQ29udHJvbCA9CisgICAgICAgICAgICAgICAgcGFnZUNvbnRleHQuZ2V0QXR0cmlidXRlKHRyZWUsIFBhZ2VDb250ZXh0LlNFU1NJT05fU0NPUEUpOworICAgICAgICBlbHNlIGlmICgiYXBwbGljYXRpb24iLmVxdWFscyhzY29wZSkpCisgICAgICAgICAgICB0cmVlQ29udHJvbCA9CisgICAgICAgICAgICAgICAgcGFnZUNvbnRleHQuZ2V0QXR0cmlidXRlKHRyZWUsIFBhZ2VDb250ZXh0LkFQUExJQ0FUSU9OX1NDT1BFKTsKKyAgICAgICAgaWYgKHRyZWVDb250cm9sID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCJDYW5ub3QgZmluZCB0cmVlIGNvbnRyb2wgYXR0cmlidXRlICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZSArICInIik7CisgICAgICAgIGVsc2UgaWYgKCEodHJlZUNvbnRyb2wgaW5zdGFuY2VvZiBUcmVlQ29udHJvbCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCJJbnZhbGlkIHRyZWUgY29udHJvbCBhdHRyaWJ1dGUgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlICsgIiciKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICgoVHJlZUNvbnRyb2wpIHRyZWVDb250cm9sKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVuZGVyIHRoZSBzcGVjaWZpZWQgbm9kZSwgYXMgY29udHJvbGxlZCBieSB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0IFRoZSA8Y29kZT5Kc3BXcml0ZXI8L2NvZGU+IHRvIHdoaWNoIHdlIGFyZSB3cml0aW5nCisgICAgICogQHBhcmFtIG5vZGUgVGhlIDxjb2RlPlRyZWVDb250cm9sTm9kZTwvY29kZT4gd2UgYXJlIGN1cnJlbnRseQorICAgICAqICByZW5kZXJpbmcKKyAgICAgKiBAcGFyYW0gbGV2ZWwgVGhlIGluZGVudGF0aW9uIGxldmVsIG9mIHRoaXMgbm9kZSBpbiB0aGUgdHJlZQorICAgICAqIEBwYXJhbSB3aWR0aCBUb3RhbCBkaXNwbGF5YWJsZSB3aWR0aCBvZiB0aGUgdHJlZQorICAgICAqIEBwYXJhbSBsYXN0IElzIHRoaXMgdGhlIGxhc3Qgbm9kZSBpbiBhIGxpc3Q/CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZW5kZXIoSnNwV3JpdGVyIG91dCwgVHJlZUNvbnRyb2xOb2RlIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwgaW50IHdpZHRoLCBib29sZWFuIGxhc3QpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9CisgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZSkgcGFnZUNvbnRleHQuZ2V0UmVzcG9uc2UoKTsKKyAgICAKKyAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXMgcm9vdCBub2RlIGFuZCB0aGUgbGFiZWwgdmFsdWUgaXMKKyAgICAgICAgLy8gbnVsbCwgdGhlbiBkbyBub3QgcmVuZGVyIHJvb3Qgbm9kZSBpbiB0aGUgdHJlZS4KKyAgICAgICAgCisgICAgICAgIGlmICgiUk9PVC1OT0RFIi5lcXVhbHNJZ25vcmVDYXNlKG5vZGUuZ2V0TmFtZSgpKSAmJgorICAgICAgICAobm9kZS5nZXRMYWJlbCgpID09IG51bGwpKSB7CisgICAgICAgICAgICAvLyBSZW5kZXIgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZQorICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIGNoaWxkcmVuW10gPSBub2RlLmZpbmRDaGlsZHJlbigpOworICAgICAgICAgICAgaW50IGxhc3RJbmRleCA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7CisgICAgICAgICAgICBpbnQgbmV3TGV2ZWwgPSBsZXZlbCArIDE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmVuZGVyKG91dCwgY2hpbGRyZW5baV0sIG5ld0xldmVsLCB3aWR0aCwgaSA9PSBsYXN0SW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBSZW5kZXIgdGhlIGJlZ2lubmluZyBvZiB0aGlzIG5vZGUKKyAgICAgICAgb3V0LnByaW50bG4oIiAgPHRyIHZhbGlnbj1cIm1pZGRsZVwiPiIpOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGluZGVudHMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZXZlbDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgbGV2ZWxzID0gbGV2ZWwgLSBpOworICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHBhcmVudCA9IG5vZGU7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBsZXZlbHM7IGorKykKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBpZiAocGFyZW50LmlzTGFzdCgpKQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAgIDx0ZD48L3RkPiIpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgICAgPHRkPjxpbWcgc3JjPVwiIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KGltYWdlcyk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIvIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KElNQUdFX0xJTkVfVkVSVElDQUwpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiXCIgYWx0PVwiXCIgYm9yZGVyPVwiMFwiPjwvdGQ+Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVuZGVyIHRoZSB0cmVlIHN0YXRlIGltYWdlIGZvciB0aGlzIG5vZGUKKworICAgICAgICAvLyBIQUNLIHRvIHRha2UgaW50byBhY2NvdW50IHNwZWNpYWwgY2hhcmFjdGVycyBsaWtlID0gYW5kICYKKyAgICAgICAgLy8gaW4gdGhlIG5vZGUgbmFtZSwgY291bGQgcmVtb3ZlIHRoaXMgY29kZSBpZiBlbmNvZGUgVVJMCisgICAgICAgIC8vIGFuZCBsYXRlciByZXF1ZXN0LmdldFBhcmFtZXRlcigpIGNvdWxkIGRlYWwgd2l0aCA9IGFuZCAmCisgICAgICAgIC8vIGNoYXJhY3RlciBpbiBwYXJhbWV0ZXIgdmFsdWVzLiAKKyAgICAgICAgU3RyaW5nIGVuY29kZWROb2RlTmFtZSA9IFVSTEVuY29kZXIuZW5jb2RlKG5vZGUuZ2V0TmFtZSgpLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisKKyAgICAgICAgU3RyaW5nIGFjdGlvbiA9IHJlcGxhY2UoZ2V0QWN0aW9uKCksICJ7bmFtZX0iLCBlbmNvZGVkTm9kZU5hbWUpOworCisgICAgICAgIAorICAgICAgICBTdHJpbmcgdXBkYXRlVHJlZUFjdGlvbiA9CisgICAgICAgICAgICByZXBsYWNlKGdldEFjdGlvbigpLCAidHJlZT17bmFtZX0iLCAic2VsZWN0PSIgKyBlbmNvZGVkTm9kZU5hbWUpOworICAgICAgICB1cGRhdGVUcmVlQWN0aW9uID0KKyAgICAgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgcGFnZUNvbnRleHQuZ2V0UmVzcG9uc2UoKSkuCisgICAgICAgICAgICBlbmNvZGVVUkwodXBkYXRlVHJlZUFjdGlvbik7CisKKyAgICAgICAgb3V0LnByaW50KCIgICAgPHRkPiIpOworICAgICAgICBpZiAoKGFjdGlvbiAhPSBudWxsKSAmJiAhbm9kZS5pc0xlYWYoKSkgeworICAgICAgICAgICAgb3V0LnByaW50KCI8YSBocmVmPVwiIik7CisgICAgICAgICAgICBvdXQucHJpbnQocmVzcG9uc2UuZW5jb2RlVVJMKGFjdGlvbikpOworICAgICAgICAgICAgb3V0LnByaW50KCJcIj4iKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnQoIjxpbWcgc3JjPVwiIik7CisgICAgICAgIG91dC5wcmludChpbWFnZXMpOworICAgICAgICBvdXQucHJpbnQoIi8iKTsKKyAgICAgICAgaWYgKG5vZGUuaXNMZWFmKCkpIHsKKyAgICAgICAgICAgIGlmIChub2RlLmlzTGFzdCgpKQorICAgICAgICAgICAgICAgIG91dC5wcmludChJTUFHRV9MSU5FX0xBU1QpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG91dC5wcmludChJTUFHRV9MSU5FX01JRERMRSk7CisgICAgICAgICAgICBvdXQucHJpbnQoIlwiIGFsdD1cIiIpOworICAgICAgICB9IGVsc2UgaWYgKG5vZGUuaXNFeHBhbmRlZCgpKSB7CisgICAgICAgICAgICBpZiAobm9kZS5pc0xhc3QoKSkKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoSU1BR0VfSEFORExFX0RPV05fTEFTVCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3V0LnByaW50KElNQUdFX0hBTkRMRV9ET1dOX01JRERMRSk7CisgICAgICAgICAgICBvdXQucHJpbnQoIlwiIGFsdD1cImNsb3NlIG5vZGUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChub2RlLmlzTGFzdCgpKQorICAgICAgICAgICAgICAgIG91dC5wcmludChJTUFHRV9IQU5ETEVfUklHSFRfTEFTVCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3V0LnByaW50KElNQUdFX0hBTkRMRV9SSUdIVF9NSURETEUpOworICAgICAgICAgICAgb3V0LnByaW50KCJcIiBhbHQ9XCJleHBhbmQgbm9kZSIpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludCgiXCIgYm9yZGVyPVwiMFwiPiIpOworICAgICAgICBpZiAoKGFjdGlvbiAhPSBudWxsKSAmJiAhbm9kZS5pc0xlYWYoKSkKKyAgICAgICAgICAgIG91dC5wcmludCgiPC9hPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPC90ZD4iKTsKKworICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGh5cGVybGluayBmb3IgdGhpcyBub2RlIChpZiBhbnkpCisgICAgICAgIFN0cmluZyBoeXBlcmxpbmsgPSBudWxsOworICAgICAgICBpZiAobm9kZS5nZXRBY3Rpb24oKSAhPSBudWxsKQorICAgICAgICAgICAgaHlwZXJsaW5rID0gKChIdHRwU2VydmxldFJlc3BvbnNlKSBwYWdlQ29udGV4dC5nZXRSZXNwb25zZSgpKS4KKyAgICAgICAgICAgICAgICBlbmNvZGVVUkwobm9kZS5nZXRBY3Rpb24oKSk7CisKKyAgICAgICAgLy8gUmVuZGVyIHRoZSBpY29uIGZvciB0aGlzIG5vZGUgKGlmIGFueSkKKyAgICAgICAgb3V0LnByaW50KCIgICAgPHRkIGNvbHNwYW49XCIiKTsKKyAgICAgICAgb3V0LnByaW50KHdpZHRoIC0gbGV2ZWwgKyAxKTsKKyAgICAgICAgb3V0LnByaW50KCJcIj4iKTsKKyAgICAgICAgaWYgKG5vZGUuZ2V0SWNvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChoeXBlcmxpbmsgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludCgiPGEgaHJlZj1cIiIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChoeXBlcmxpbmspOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiXCIiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0ID0gbm9kZS5nZXRUYXJnZXQoKTsKKyAgICAgICAgICAgICAgICBpZih0YXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiB0YXJnZXQ9XCIiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHRhcmdldCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiXCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gdG8gcmVmcmVzaCB0aGUgdHJlZSBpbiB0aGUgc2FtZSAnc2VsZicgZnJhbWUKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiBvbmNsaWNrPVwiIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJzZWxmLmxvY2F0aW9uLmhyZWY9JyIgKyB1cGRhdGVUcmVlQWN0aW9uICsgIiciKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIlwiIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCI+Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnQoIjxpbWcgc3JjPVwiIik7CisgICAgICAgICAgICBvdXQucHJpbnQoaW1hZ2VzKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiLyIpOworICAgICAgICAgICAgb3V0LnByaW50KG5vZGUuZ2V0SWNvbigpKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiXCIgYWx0PVwiIik7CisgICAgICAgICAgICBvdXQucHJpbnQoIlwiIGJvcmRlcj1cIjBcIj4iKTsKKyAgICAgICAgICAgIGlmIChoeXBlcmxpbmsgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIjwvYT4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbmRlciB0aGUgbGFiZWwgZm9yIHRoaXMgbm9kZSAoaWYgYW55KQorCisgICAgICAgIGlmIChub2RlLmdldExhYmVsKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGxhYmVsU3R5bGUgPSBudWxsOworICAgICAgICAgICAgaWYgKG5vZGUuaXNTZWxlY3RlZCgpICYmIChzdHlsZVNlbGVjdGVkICE9IG51bGwpKQorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGUgPSBzdHlsZVNlbGVjdGVkOworICAgICAgICAgICAgZWxzZSBpZiAoIW5vZGUuaXNTZWxlY3RlZCgpICYmIChzdHlsZVVuc2VsZWN0ZWQgIT0gbnVsbCkpCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZSA9IHN0eWxlVW5zZWxlY3RlZDsKKyAgICAgICAgICAgIGlmIChoeXBlcmxpbmsgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhlIGxlYWRpbmcgc3BhY2Ugc28gdGhhdCB0aGUgdGV4dCBoYXMgc29tZSBzcGFjZQorICAgICAgICAgICAgICAgIC8vIGJldHdlZW4gaXQgYW5kIGFueSBwcmVjZWRpbmcgaW1hZ2VzCisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgPGEgaHJlZj1cIiIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChoeXBlcmxpbmspOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiXCIiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0ID0gbm9kZS5nZXRUYXJnZXQoKTsKKyAgICAgICAgICAgICAgICBpZih0YXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiB0YXJnZXQ9XCIiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHRhcmdldCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiXCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxhYmVsU3R5bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiBjbGFzcz1cIiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQobGFiZWxTdHlsZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiXCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gdG8gcmVmcmVzaCB0aGUgdHJlZSBpbiB0aGUgc2FtZSAnc2VsZicgZnJhbWUKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiBvbmNsaWNrPVwiIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJzZWxmLmxvY2F0aW9uLmhyZWY9JyIgKyB1cGRhdGVUcmVlQWN0aW9uICsgIiciKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIlwiIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCI+Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxhYmVsU3R5bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludCgiPHNwYW4gY2xhc3M9XCIiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQobGFiZWxTdHlsZSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJcIj4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludChub2RlLmdldExhYmVsKCkpOworICAgICAgICAgICAgaWYgKGh5cGVybGluayAhPSBudWxsKQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiPC9hPiIpOworICAgICAgICAgICAgZWxzZSBpZiAobGFiZWxTdHlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiPC9zcGFuPiIpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludGxuKCI8L3RkPiIpOworCisgICAgICAgIC8vIFJlbmRlciB0aGUgZW5kIG9mIHRoaXMgbm9kZQorICAgICAgICBvdXQucHJpbnRsbigiICA8L3RyPiIpOworCisgICAgICAgIC8vIFJlbmRlciB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlCisgICAgICAgIGlmIChub2RlLmlzRXhwYW5kZWQoKSkgeworICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIGNoaWxkcmVuW10gPSBub2RlLmZpbmRDaGlsZHJlbigpOworICAgICAgICAgICAgaW50IGxhc3RJbmRleCA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7CisgICAgICAgICAgICBpbnQgbmV3TGV2ZWwgPSBsZXZlbCArIDE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmVuZGVyKG91dCwgY2hpbGRyZW5baV0sIG5ld0xldmVsLCB3aWR0aCwgaSA9PSBsYXN0SW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlcGxhY2UgYW55IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBwbGFjZWhvbGRlciBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogdGVtcGxhdGUgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCByZXBsYWNlbWVudCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSBQYXR0ZXJuIHN0cmluZyBwb3NzaWJseSBjb250YWluaW5nIHRoZSBwbGFjZWhvbGRlcgorICAgICAqIEBwYXJhbSBwbGFjZWhvbGRlciBQbGFjZWhvbGRlciBleHByZXNzaW9uIHRvIGJlIHJlcGxhY2VkCisgICAgICogQHBhcmFtIHZhbHVlIFJlcGxhY2VtZW50IHZhbHVlIGZvciB0aGUgcGxhY2Vob2xkZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHRlbXBsYXRlLCBTdHJpbmcgcGxhY2Vob2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSkgeworCisgICAgICAgIGlmICh0ZW1wbGF0ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgaWYgKChwbGFjZWhvbGRlciA9PSBudWxsKSB8fCAodmFsdWUgPT0gbnVsbCkpCisgICAgICAgICAgICByZXR1cm4gKHRlbXBsYXRlKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IHRlbXBsYXRlLmluZGV4T2YocGxhY2Vob2xkZXIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciB0ZW1wID0gbmV3IFN0cmluZ0J1ZmZlcih0ZW1wbGF0ZS5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKKyAgICAgICAgICAgIHRlbXAuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgICAgIHRlbXAuYXBwZW5kKHRlbXBsYXRlLnN1YnN0cmluZyhpbmRleCArIHBsYWNlaG9sZGVyLmxlbmd0aCgpKSk7CisgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXAudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHRlbXBsYXRlKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vVHJlZUNvbnRyb2xUZXN0QWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vVHJlZUNvbnRyb2xUZXN0QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkN2MxNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UcmVlQ29udHJvbFRlc3RBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworCisvKioKKyAqIFRlc3QgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IGhhbmRsZXMgZXZlbnRzIGZyb20gdGhlIHRyZWUgY29udHJvbCB0ZXN0CisgKiBwYWdlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVHJlZUNvbnRyb2xUZXN0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZ2V0U2VydmxldCgpLmxvZygiRW50ZXJlZCBUcmVlQ29udHJvbFRlc3RBY3Rpb246cGVyZm9ybSgpIik7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIFRyZWVDb250cm9sIGNvbnRyb2wgPQorICAgICAgICAgICAgKFRyZWVDb250cm9sKSBzZXNzaW9uLmdldEF0dHJpYnV0ZSgidHJlZUNvbnRyb2xUZXN0Iik7CisKKyAgICAgICAgLy8gSGFuZGxlIGEgdHJlZSBleHBhbmQvY29udHJhY3QgZXZlbnQKKyAgICAgICAgbmFtZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ0cmVlIik7CisKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZygiVHJlZSBleHBhbmQvY29udHJhY3Qgb24gIiArIG5hbWUpOworCisgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgbm9kZSA9IGNvbnRyb2wuZmluZE5vZGUobmFtZSk7CisKKyAgICAgICAgICAgIGlmIChub2RlICE9IG51bGwpeworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2coIkZvdW5kIE5vZGU6ICIgKyBuYW1lKTsKKyAgICAgICAgICAgICAgICBub2RlLnNldEV4cGFuZGVkKCFub2RlLmlzRXhwYW5kZWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZygidHJlZSBwYXJhbSBpcyBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBIYW5kbGUgYSBzZWxlY3QgaXRlbSBldmVudAorICAgICAgICBuYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpOworICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKCJTZWxlY3QgZXZlbnQgb24gIiArIG5hbWUpOworICAgICAgICAgICAgY29udHJvbC5zZWxlY3ROb2RlKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yd2FyZCBiYWNrIHRvIHRoZSB0ZXN0IHBhZ2UKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJUcmVlIENvbnRyb2wgVGVzdCIpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29ubmVjdG9yL0FkZENvbm5lY3RvckFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2Nvbm5lY3Rvci9BZGRDb25uZWN0b3JBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDAzNzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2Nvbm5lY3Rvci9BZGRDb25uZWN0b3JBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5BZGQgQ29ubmVjdG9yPC9lbT4gdHJhbnNhY3Rpb25zLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBBZGRDb25uZWN0b3JBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICAKKyAgICAgICAgLy8gdGhlIHNlcnZpY2UgTmFtZSBpcyBuZWVkZWQgdG8gcmV0cmlldmUgdGhlIGVuZ2luZSBtQmVhbiB0bworICAgICAgICAvLyB3aGljaCB0aGUgbmV3IGNvbm5lY3RvciBtQmVhbiB3aWxsIGJlIGFkZGVkLgorICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic2VsZWN0Iik7CisgICAgICAgIAorICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBDb25uZWN0b3JGb3JtIGNvbm5lY3RvckZtID0gbmV3IENvbm5lY3RvckZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoImNvbm5lY3RvckZvcm0iLCBjb25uZWN0b3JGbSk7CisgICAgICAgIGNvbm5lY3RvckZtLnNldEFkbWluQWN0aW9uKCJDcmVhdGUiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0T2JqZWN0TmFtZSgiIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldENvbm5lY3Rvck5hbWUoIiIpOworICAgICAgICBTdHJpbmcgdHlwZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ0eXBlIik7CisgICAgICAgIGlmICh0eXBlID09IG51bGwpCisgICAgICAgICAgICB0eXBlID0gIkhUVFAiOyAgICAvLyBkZWZhdWx0IHR5cGUgaXMgSFRUUAorICAgICAgICBjb25uZWN0b3JGbS5zZXRDb25uZWN0b3JUeXBlKHR5cGUpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlTmFtZSk7CisgICAgICAgIGlmICgiSFRUUFMiLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldFNjaGVtZSgiaHR0cHMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldFNjaGVtZSgiaHR0cCIpOyAgICAgICAKKyAgICAgICAgfQorICAgICAgICBjb25uZWN0b3JGbS5zZXRBY2NlcHRDb3VudFRleHQoIjEwIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldENvbXByZXNzaW9uKCJvZmYiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0Q29ubkxpbmdlclRleHQoIi0xIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldENvbm5UaW1lT3V0VGV4dCgiNjAwMDAiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0Q29ublVwbG9hZFRpbWVPdXRUZXh0KCIzMDAwMDAiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0QnVmZmVyU2l6ZVRleHQoIjIwNDgiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0RGlzYWJsZVVwbG9hZFRpbWVvdXQoImZhbHNlIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldEVuYWJsZUxvb2t1cHMoInRydWUiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0QWRkcmVzcygiIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldFBvcnRUZXh0KCIiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0UmVkaXJlY3RQb3J0VGV4dCgiLTEiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0TWluUHJvY2Vzc29yc1RleHQoIjUiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0TWF4UHJvY2Vzc29yc1RleHQoIjIwIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldE1heEtlZXBBbGl2ZVRleHQoIjEwMCIpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRNYXhTcGFyZSgiNTAiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0TWF4VGhyZWFkcygiMjAwIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldE1pblNwYXJlKCI0Iik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldFRocmVhZFByaW9yaXR5KFN0cmluZy52YWx1ZU9mKFRocmVhZC5OT1JNX1BSSU9SSVRZKSk7CisgICAgICAgIGNvbm5lY3RvckZtLnNldFNlY3VyZSgiZmFsc2UiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0VGNwTm9EZWxheSgidHJ1ZSIpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRYcG93ZXJlZEJ5KCJmYWxzZSIpOworCisgICAgICAgIC8vc3VwcG9ydGVkIG9ubHkgYnkgSFRUUFMKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0QWxnb3JpdGhtKCJTdW5YNTA5Iik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldENsaWVudEF1dGhlbnRpY2F0aW9uKCJmYWxzZSIpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRDaXBoZXJzKCIiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0S2V5U3RvcmVGaWxlTmFtZSgiIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldEtleVN0b3JlUGFzc3dvcmQoIiIpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRLZXlTdG9yZVR5cGUoIkpLUyIpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRUcnVzdFN0b3JlRmlsZU5hbWUoIiIpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRUcnVzdFN0b3JlUGFzc3dvcmQoIiIpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRUcnVzdFN0b3JlVHlwZSgiSktTIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldFNzbFByb3RvY29sKCJUTFMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIC8vIHN1cHBvcnRlZCBvbmx5IGJ5IENveW90ZSBjb25uZWN0b3JzCisgICAgICAgIGNvbm5lY3RvckZtLnNldFByb3h5TmFtZSgiIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldFByb3h5UG9ydFRleHQoIjAiKTsgICAgICAgIAorICAgICAgICAKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0Qm9vbGVhblZhbHMoTGlzdHMuZ2V0Qm9vbGVhblZhbHVlcygpKTsgICAgICAgICAgICAgICAgCisgICAgICAgIGNvbm5lY3RvckZtLnNldENsaWVudEF1dGhWYWxzKExpc3RzLmdldENsaWVudEF1dGhWYWx1ZXMoKSk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgc2NoZW1lVHlwZXNbXT0gbmV3IFN0cmluZ1szXTsKKyAgICAgICAgc2NoZW1lVHlwZXNbMF0gPSAiSFRUUCI7CisgICAgICAgIHNjaGVtZVR5cGVzWzFdID0gIkhUVFBTIjsgICAgICAgICAgICAgICAgCisgICAgICAgIHNjaGVtZVR5cGVzWzJdID0gIkFKUCI7CisgICAgICAgIAorICAgICAgICBBcnJheUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7ICAgIAorICAgICAgICAvLyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2VsZWN0IGxpc3Qgc2hvdWxkIGJlIHRoZSB0eXBlIHNlbGVjdGVkCisgICAgICAgIHR5cGVzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4odHlwZSwKKyAgICAgICAgICAgICAgICAiQWRkQ29ubmVjdG9yLmRvP3NlbGVjdD0iICsgCisgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoc2VydmljZU5hbWUsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKSAKKyAgICAgICAgICAgICAgICArICImdHlwZT0iICsgdHlwZSkpOyAgICAgICAgCisgICAgICAgICBmb3IgKGludCBpPTA7IGk8IHNjaGVtZVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIXR5cGUuZXF1YWxzSWdub3JlQ2FzZShzY2hlbWVUeXBlc1tpXSkpIHsKKyAgICAgICAgICAgICAgICB0eXBlcy5hZGQobmV3IExhYmVsVmFsdWVCZWFuKHNjaGVtZVR5cGVzW2ldLAorICAgICAgICAgICAgICAgICJBZGRDb25uZWN0b3IuZG8/c2VsZWN0PSIgKyAKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShzZXJ2aWNlTmFtZSxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpCisgICAgICAgICAgICAgICAgKyAiJnR5cGU9IiArIHNjaGVtZVR5cGVzW2ldKSk7ICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25uZWN0b3JGbS5zZXRDb25uZWN0b3JUeXBlVmFscyh0eXBlcyk7CisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBjb25uZWN0b3IgZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiQ29ubmVjdG9yIikpOworICAgICAgICAKKyAgICB9ICAgICAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb25uZWN0b3IvQ29ubmVjdG9yRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2Nvbm5lY3Rvci9Db25uZWN0b3JGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0Nzc2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb25uZWN0b3IvQ29ubmVjdG9yRm9ybS5qYXZhCkBAIC0wLDAgKzEsMTI3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBjb25uZWN0b3IgcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29ubmVjdG9yRm9ybSBleHRlbmRzIEFjdGlvbkZvcm0geworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworICAgIAorICAgICAvKioKKyAgICAgKiBUaGUgYWRtaW5pc3RyYXRpdmUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9ybS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhZG1pbkFjdGlvbiA9ICJFZGl0IjsKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZSBvZiB0aGUgQ29ubmVjdG9yIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgb2JqZWN0TmFtZSA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoaXMgY29ubmVjdG9yIGJlbG9uZ3MgdG8uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWUgPSBudWxsOworICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBzY2hlbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2NoZW1lID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgY29ubmVjdG9yIHR5cGUuIAorICAgICAqIFNwZWNpZmllcyBpZiBpdCBpcyBhIENveW90ZUNvbm5lY3RvciBvciBBSlAxM0Nvbm5lY3RvciBldGMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29ubmVjdG9yVHlwZSA9IG51bGw7ICAgIAorICAgIAorICAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIG5vZGUgbGFiZWwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbm9kZUxhYmVsID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGFjY2VwdCBDb3VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhY2NlcHRDb3VudFRleHQgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgYWxnb3JpdGhtLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFsZ29yaXRobSA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBjaXBoZXJzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNpcGhlcnMgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgQ29ubmVjdGlvbiBMaW5nZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29ubkxpbmdlclRleHQgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgQ29ubmVjdGlvbiBUaW1lIE91dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb25uVGltZU91dFRleHQgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgQ29ubmVjdGlvbiBVcGxvYWQgVGltZSBPdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29ublVwbG9hZFRpbWVPdXRUZXh0ID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGJ1ZmZlciBzaXplLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGJ1ZmZlclNpemVUZXh0ID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgZGlzYWJsZSB1cGxvYWQgdGltZW91dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkaXNhYmxlVXBsb2FkVGltZW91dCA9ICJmYWxzZSI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIGVuYWJsZSBMb29rdXBzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGVuYWJsZUxvb2t1cHMgPSAiZmFsc2UiOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiBjb21wcmVzc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb21wcmVzc2lvbiA9ICJvZmYiOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgYWRkcmVzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhZGRyZXNzID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIG1pblByb2Nlc3NvcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWluUHJvY2Vzc29yc1RleHQgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgbWF4IFByb2Nlc3NvcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWF4UHJvY2Vzc29yc1RleHQgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgbWF4S2VlcEFsaXZlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1heEtlZXBBbGl2ZVRleHQgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgbWF4U3BhcmUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWF4U3BhcmUgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgbWF4VGhyZWFkcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtYXhUaHJlYWRzID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIG1pblNwYXJlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1pblNwYXJlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgdGhyZWFkUHJpb3JpdHkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdGhyZWFkUHJpb3JpdHkgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgVVJJRW5jb2RpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXJpRW5jb2RpbmdUZXh0ID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgdXNlQm9keUVuY29kaW5nRm9yVVJJLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZUJvZHlFbmNvZGluZ0ZvclVSSSA9ICJmYWxzZSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgYWxsb3dUcmFjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhbGxvd1RyYWNlID0gImZhbHNlIjsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgcG9ydC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwb3J0VGV4dCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSByZWRpcmVjdCBwb3J0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlZGlyZWN0UG9ydFRleHQgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgcHJveHlOYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHByb3h5TmFtZSA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBwcm94eSBQb3J0IE51bWJlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcm94eVBvcnRUZXh0ID0gbnVsbDsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGNvbm5lY3Rvck5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29ubmVjdG9yTmFtZSA9IG51bGw7CisgICAgICAgIAorICAgIC8qKgorICAgICAqIFdoZXRoZXIgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGlzIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjbGllbnRBdXRoZW50aWNhdGlvbiA9ICJmYWxzZSI7CisgICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBrZXlTdG9yZSBGaWxlbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBrZXlTdG9yZUZpbGVOYW1lID0gbnVsbDsKKyAgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIGtleVN0b3JlIFBhc3N3b3JkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGtleVN0b3JlUGFzc3dvcmQgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBrZXlTdG9yZSBUeXBlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGtleVN0b3JlVHlwZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHJ1c3RTdG9yZSBGaWxlbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0cnVzdFN0b3JlRmlsZU5hbWUgPSBudWxsOworICAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdHJ1c3RTdG9yZSBQYXNzd29yZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0cnVzdFN0b3JlUGFzc3dvcmQgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0cnVzdFN0b3JlIFR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdHJ1c3RTdG9yZVR5cGUgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBTc2wgUHJvdG9jb2wuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc3NsUHJvdG9jb2w9IG51bGw7CisgICAgCisgICAgLyoKKyAgICAgKiBSZXByZXNlbnQgYm9vbGVhbiAodHJ1ZSwgZmFsc2UpIHZhbHVlcyBmb3IgZW5hYmxlTG9va3VwcyBldGMuCisgICAgICovICAgIAorICAgIHByaXZhdGUgTGlzdCBib29sZWFuVmFscyA9IG51bGw7CisKKyAgICAvKgorICAgICAqIFJlcHJlc2VudCBzdXBwb3J0ZWQgY29ubmVjdG9yIHR5cGVzLgorICAgICAqLyAgICAKKyAgICBwcml2YXRlIExpc3QgY29ubmVjdG9yVHlwZVZhbHMgPSBudWxsOworCisgICAgLyoqCisgICAgICogUmVwcmVzZW50IHN1cHBvcnRlZCBjbGllbnRBdXRoIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QgY2xpZW50QXV0aFZhbHMgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIHNlY3VyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzZWN1cmUgPSAiZmFsc2UiOworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiB0Y3BOb0RlbGF5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHRjcE5vRGVsYXkgPSAidHJ1ZSI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIHhwb3dlcmVkQnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgeHBvd2VyZWRCeSA9ICJmYWxzZSI7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisgICAgCisgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFkbWluaXN0cmF0aXZlIGFjdGlvbiByZXByZXNlbnRlZCBieSB0aGlzIGZvcm0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBZG1pbkFjdGlvbigpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5hZG1pbkFjdGlvbjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFkbWluQWN0aW9uKFN0cmluZyBhZG1pbkFjdGlvbikgeworCisgICAgICAgIHRoaXMuYWRtaW5BY3Rpb24gPSBhZG1pbkFjdGlvbjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIENvbm5lY3RvciB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5vYmplY3ROYW1lOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBDb25uZWN0b3IgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3ROYW1lKFN0cmluZyBvYmplY3ROYW1lKSB7CisKKyAgICAgICAgdGhpcy5vYmplY3ROYW1lID0gb2JqZWN0TmFtZTsKKworICAgIH0KKyAgICAKKyAgICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIHNlcnZpY2UgdGhpcyBjb25uZWN0b3IgYmVsb25ncyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VOYW1lOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBTZXJ2aWNlIHRoaXMgY29ubmVjdG9yIGJlbG9uZ3MgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7CisKKyAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOworCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU2NoZW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1lKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBTY2hlbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1lKFN0cmluZyBzY2hlbWUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuc2NoZW1lID0gc2NoZW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb25uZWN0b3IgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3RvclR5cGUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JUeXBlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDb25uZWN0b3IgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0b3JUeXBlKFN0cmluZyBjb25uZWN0b3JUeXBlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmNvbm5lY3RvclR5cGUgPSBjb25uZWN0b3JUeXBlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsYWJlbCBvZiB0aGUgbm9kZSB0aGF0IHdhcyBjbGlja2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUxhYmVsKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMubm9kZUxhYmVsOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBub2RlIGxhYmVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vZGVMYWJlbChTdHJpbmcgbm9kZUxhYmVsKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLm5vZGVMYWJlbCA9IG5vZGVMYWJlbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWNjZXB0Q291bnRUZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXB0Q291bnRUZXh0KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXB0Q291bnRUZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY2NlcHRDb3VudFRleHQuCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0QWNjZXB0Q291bnRUZXh0KFN0cmluZyBhY2NlcHRDb3VudFRleHQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuYWNjZXB0Q291bnRUZXh0ID0gYWNjZXB0Q291bnRUZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhbGdvcml0aG0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5hbGdvcml0aG07CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFsZ29yaXRobS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRBbGdvcml0aG0oU3RyaW5nIGFsZ29yaXRobSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5hbGdvcml0aG0gPSBhbGdvcml0aG07CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNpcGhlcnMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDaXBoZXJzKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuY2lwaGVyczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgY2lwaGVycy4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRDaXBoZXJzKFN0cmluZyBjaXBoZXJzKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmNpcGhlcnMgPSBjaXBoZXJzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25uTGluZ2VyVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5MaW5nZXJUZXh0KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuY29ubkxpbmdlclRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbm5MaW5nZXJUZXh0LgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENvbm5MaW5nZXJUZXh0KFN0cmluZyBjb25uTGluZ2VyVGV4dCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5jb25uTGluZ2VyVGV4dCA9IGNvbm5MaW5nZXJUZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25uVGltZU91dFRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uVGltZU91dFRleHQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5jb25uVGltZU91dFRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbm5UaW1lT3V0VGV4dC4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uVGltZU91dFRleHQoU3RyaW5nIGNvbm5UaW1lT3V0VGV4dCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5jb25uVGltZU91dFRleHQgPSBjb25uVGltZU91dFRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbm5VcGxvYWRUaW1lT3V0VGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5VcGxvYWRUaW1lT3V0VGV4dCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmNvbm5VcGxvYWRUaW1lT3V0VGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgY29ublVwbG9hZFRpbWVPdXRUZXh0LgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENvbm5VcGxvYWRUaW1lT3V0VGV4dChTdHJpbmcgY29ublVwbG9hZFRpbWVPdXRUZXh0KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmNvbm5VcGxvYWRUaW1lT3V0VGV4dCA9IGNvbm5VcGxvYWRUaW1lT3V0VGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYnVmZmVyU2l6ZVRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRCdWZmZXJTaXplVGV4dCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlclNpemVUZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBidWZmZXJTaXplVGV4dC4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRCdWZmZXJTaXplVGV4dChTdHJpbmcgYnVmZmVyU2l6ZVRleHQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuYnVmZmVyU2l6ZVRleHQgPSBidWZmZXJTaXplVGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWRkcmVzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFkZHJlc3MoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5hZGRyZXNzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhZGRyZXNzLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3MoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3h5IE5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm94eU5hbWUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5wcm94eU5hbWU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHByb3h5IE5hbWUuCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0UHJveHlOYW1lKFN0cmluZyBwcm94eU5hbWUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMucHJveHlOYW1lID0gcHJveHlOYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm94eSBQb3J0IE51bWJlclRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm94eVBvcnRUZXh0KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucHJveHlQb3J0VGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJveHkgUG9ydCBOdW1iZXJUZXh0LgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFByb3h5UG9ydFRleHQoU3RyaW5nIHByb3h5UG9ydFRleHQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMucHJveHlQb3J0VGV4dCA9IHByb3h5UG9ydFRleHQ7CisgICAgICAgIAorICAgIH0KKworICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0cnVlL2ZhbHNlIHZhbHVlIG9mIGNsaWVudCBhdXRoZW50aWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudEF1dGhlbnRpY2F0aW9uKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmNsaWVudEF1dGhlbnRpY2F0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciBjbGllbnQgYXV0aGVudGljYXRpb24gaXMgc3VwcG9ydGVkIG9yIG5vdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRBdXRoZW50aWNhdGlvbihTdHJpbmcgY2xpZW50QXV0aGVudGljYXRpb24pIHsKKworICAgICAgICB0aGlzLmNsaWVudEF1dGhlbnRpY2F0aW9uID0gY2xpZW50QXV0aGVudGljYXRpb247CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoaXMgY29ubmVjdG9yIGJlbG9uZ3MgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRLZXlTdG9yZUZpbGVOYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmtleVN0b3JlRmlsZU5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIFNlcnZpY2UgdGhpcyBjb25uZWN0b3IgYmVsb25ncyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlTdG9yZUZpbGVOYW1lKFN0cmluZyBrZXlTdG9yZUZpbGVOYW1lKSB7CisKKyAgICAgICAgdGhpcy5rZXlTdG9yZUZpbGVOYW1lID0ga2V5U3RvcmVGaWxlTmFtZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIHNlcnZpY2UgdGhpcyBjb25uZWN0b3IgYmVsb25ncyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEtleVN0b3JlUGFzc3dvcmQoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMua2V5U3RvcmVQYXNzd29yZDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvYmplY3QgbmFtZSBvZiB0aGUgU2VydmljZSB0aGlzIGNvbm5lY3RvciBiZWxvbmdzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtleVN0b3JlUGFzc3dvcmQoU3RyaW5nIGtleVN0b3JlUGFzc3dvcmQpIHsKKworICAgICAgICB0aGlzLmtleVN0b3JlUGFzc3dvcmQgPSBrZXlTdG9yZVBhc3N3b3JkOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBrZXlzdG9yZSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5U3RvcmVUeXBlKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmtleVN0b3JlVHlwZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBrZXlzdG9yZSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtleVN0b3JlVHlwZShTdHJpbmcga2V5U3RvcmVUeXBlKSB7CisKKyAgICAgICAgdGhpcy5rZXlTdG9yZVR5cGUgPSBrZXlTdG9yZVR5cGU7CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNzbFByb3RvY29sCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTc2xQcm90b2NvbCgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5zc2xQcm90b2NvbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzc2xQcm90b2NvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTc2xQcm90b2NvbChTdHJpbmcgc3NsUHJvdG9jb2wpIHsKKworICAgICAgICB0aGlzLnNzbFByb3RvY29sID0gc3NsUHJvdG9jb2w7CisKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBFbmFibGUgbG9va3VwIFRleHQuCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRFbmFibGVMb29rdXBzKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlTG9va3VwczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgRW5hYmxlIExvb2t1cCBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZUxvb2t1cHMoU3RyaW5nIGVuYWJsZUxvb2t1cHMpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuZW5hYmxlTG9va3VwcyA9IGVuYWJsZUxvb2t1cHM7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRpc2FibGVVcGxvYWRUaW1lb3V0LgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzYWJsZVVwbG9hZFRpbWVvdXQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlVXBsb2FkVGltZW91dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlzYWJsZVVwbG9hZFRpbWVvdXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzYWJsZVVwbG9hZFRpbWVvdXQoU3RyaW5nIGRpc2FibGVVcGxvYWRUaW1lb3V0KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWRUaW1lb3V0ID0gZGlzYWJsZVVwbG9hZFRpbWVvdXQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbXByZXNzaW9uIFRleHQuCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRDb21wcmVzc2lvbigpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmNvbXByZXNzaW9uOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDb21wcmVzc2lvbiBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzaW9uKFN0cmluZyBjb21wcmVzc2lvbikgeworICAgICAgICAKKyAgICAgICAgdGhpcy5jb21wcmVzc2lvbiA9IGNvbXByZXNzaW9uOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBib29sZWFuVmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRCb29sZWFuVmFscygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmJvb2xlYW5WYWxzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWJ1Z1ZhbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qm9vbGVhblZhbHMoTGlzdCBib29sZWFuVmFscykgeworICAgICAgICAKKyAgICAgICAgdGhpcy5ib29sZWFuVmFscyA9IGJvb2xlYW5WYWxzOworICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNsaWVudEF1dGggdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldENsaWVudEF1dGhWYWxzKCkgeworICAgICAgICByZXR1cm4gY2xpZW50QXV0aFZhbHM7CisgICAgfQorICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xpZW50QXV0aCB2YXVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRBdXRoVmFscyhMaXN0IGNsaWVudEF1dGhWYWxzKSB7CisgICAgICAgIHRoaXMuY2xpZW50QXV0aFZhbHMgPSBjbGllbnRBdXRoVmFsczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtaW4gUHJvY2Vzc29ycyBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWluUHJvY2Vzc29yc1RleHQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5taW5Qcm9jZXNzb3JzVGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgbWluUHJvY2Vzc29ycyBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1pblByb2Nlc3NvcnNUZXh0KFN0cmluZyBtaW5Qcm9jZXNzb3JzVGV4dCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5taW5Qcm9jZXNzb3JzVGV4dCA9IG1pblByb2Nlc3NvcnNUZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXggcHJvY2Vzc29ycyBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWF4UHJvY2Vzc29yc1RleHQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5tYXhQcm9jZXNzb3JzVGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgTWF4IFByb2Nlc3NvcnMgVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhQcm9jZXNzb3JzVGV4dChTdHJpbmcgbWF4UHJvY2Vzc29yc1RleHQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMubWF4UHJvY2Vzc29yc1RleHQgPSBtYXhQcm9jZXNzb3JzVGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWF4S2VlcEFsaXZlVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1heEtlZXBBbGl2ZVRleHQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5tYXhLZWVwQWxpdmVUZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYXhLZWVwQWxpdmVUZXh0LgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldE1heEtlZXBBbGl2ZVRleHQoU3RyaW5nIG1heEtlZXBBbGl2ZVRleHQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMubWF4S2VlcEFsaXZlVGV4dCA9IG1heEtlZXBBbGl2ZVRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1heFNwYXJlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWF4U3BhcmUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5tYXhTcGFyZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgbWF4U3BhcmUuCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0TWF4U3BhcmUoU3RyaW5nIG1heFNwYXJlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLm1heFNwYXJlID0gbWF4U3BhcmU7CisgICAgICAgIAorICAgIH0gCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXhUaHJlYWRzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWF4VGhyZWFkcygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLm1heFRocmVhZHM7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1heFRocmVhZHMuCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0TWF4VGhyZWFkcyhTdHJpbmcgbWF4VGhyZWFkcykgeworICAgICAgICAKKyAgICAgICAgdGhpcy5tYXhUaHJlYWRzID0gbWF4VGhyZWFkczsKKyAgICAgICAgCisgICAgfSAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1pblNwYXJlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWluU3BhcmUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5taW5TcGFyZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgbWluU3BhcmUuCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0TWluU3BhcmUoU3RyaW5nIG1pblNwYXJlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLm1pblNwYXJlID0gbWluU3BhcmU7CisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGhyZWFkUHJpb3JpdHkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUaHJlYWRQcmlvcml0eSgpIHsKKworICAgICAgcmV0dXJuIHRoaXMudGhyZWFkUHJpb3JpdHk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRocmVhZFByaW9yaXR5LgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFRocmVhZFByaW9yaXR5KFN0cmluZyB0aHJlYWRQcmlvcml0eSkgeworICAgICAgCisgICAgICB0aGlzLnRocmVhZFByaW9yaXR5ID0gdGhyZWFkUHJpb3JpdHk7CisgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHJ1c3Qgc3RvcmUgZmlsZW5hbWUgZm9yIHRoaXMgY29ubmVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHJ1c3RTdG9yZUZpbGVOYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnRydXN0U3RvcmVGaWxlTmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0cnVzdCBzdG9yZSBmaWxlbmFtZSBmb3IgdGhpcyBjb25uZWN0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJ1c3RTdG9yZUZpbGVOYW1lKFN0cmluZyB0cnVzdFN0b3JlRmlsZU5hbWUpIHsKKworICAgICAgICB0aGlzLnRydXN0U3RvcmVGaWxlTmFtZSA9IHRydXN0U3RvcmVGaWxlTmFtZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHJ1c3Qgc3RvcmUgcGFzc3dvcmQgZm9yIHRoaXMgY29ubmVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHJ1c3RTdG9yZVBhc3N3b3JkKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnRydXN0U3RvcmVQYXNzd29yZDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0cnVzdCBzdG9yZSBwYXNzd29yZCBmb3IgdGhpcyBjb25uZWN0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJ1c3RTdG9yZVBhc3N3b3JkKFN0cmluZyB0cnVzdFN0b3JlUGFzc3dvcmQpIHsKKworICAgICAgICB0aGlzLnRydXN0U3RvcmVQYXNzd29yZCA9IHRydXN0U3RvcmVQYXNzd29yZDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHJ1c3Qgc3RvcmUgdHlwZSBmb3IgdGhpcyBjb25uZWN0b3IuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUcnVzdFN0b3JlVHlwZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy50cnVzdFN0b3JlVHlwZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0cnVzdCBzdG9yZSB0eXBlIGZvciB0aGlzIGNvbm5lY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcnVzdFN0b3JlVHlwZShTdHJpbmcgdHJ1c3RTdG9yZVR5cGUpIHsKKworICAgICAgICB0aGlzLnRydXN0U3RvcmVUeXBlID0gdHJ1c3RTdG9yZVR5cGU7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFVSSUVuY29kaW5nIHRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVUklFbmNvZGluZ1RleHQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy51cmlFbmNvZGluZ1RleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFVSSUVuY29kaW5nIFRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VVJJRW5jb2RpbmdUZXh0KFN0cmluZyB1cmlFbmNvZGluZ1RleHQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMudXJpRW5jb2RpbmdUZXh0ID0gdXJpRW5jb2RpbmdUZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VCb2R5RW5jb2RpbmdGb3JVUkkgVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZUJvZHlFbmNvZGluZ0ZvclVSSVRleHQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy51c2VCb2R5RW5jb2RpbmdGb3JVUkk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVzZUJvZHlFbmNvZGluZ0ZvclVSSSBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZUJvZHlFbmNvZGluZ0ZvclVSSVRleHQoU3RyaW5nIHVzZUJvZHlFbmNvZGluZ0ZvclVSSSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy51c2VCb2R5RW5jb2RpbmdGb3JVUkkgPSB1c2VCb2R5RW5jb2RpbmdGb3JVUkk7CisgICAgICAgIAorICAgIH0gICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhbGxvd1RyYWNlIFRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBbGxvd1RyYWNlVGV4dCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmFsbG93VHJhY2U7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFsbG93VHJhY2UgVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd1RyYWNlVGV4dChTdHJpbmcgYWxsb3dUcmFjZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5hbGxvd1RyYWNlID0gYWxsb3dUcmFjZTsKKyAgICAgICAgCisgICAgfSAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBvcnQgdGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBvcnRUZXh0KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucG9ydFRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBvcnQgVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb3J0VGV4dChTdHJpbmcgcG9ydFRleHQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMucG9ydFRleHQgPSBwb3J0VGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcG9ydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlZGlyZWN0UG9ydFRleHQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5yZWRpcmVjdFBvcnRUZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBSZWRpcmVjdCBQb3J0IFRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVkaXJlY3RQb3J0VGV4dChTdHJpbmcgcmVkaXJlY3RQb3J0VGV4dCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5yZWRpcmVjdFBvcnRUZXh0ID0gcmVkaXJlY3RQb3J0VGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU2VydmljZSBOYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdG9yTmFtZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvck5hbWU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFNlcnZpY2UgTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0b3JOYW1lKFN0cmluZyBjb25uZWN0b3JOYW1lKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmNvbm5lY3Rvck5hbWUgPSBjb25uZWN0b3JOYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25uZWN0b3JUeXBlVmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRDb25uZWN0b3JUeXBlVmFscygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RvclR5cGVWYWxzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb25uZWN0b3JUeXBlVmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0b3JUeXBlVmFscyhMaXN0IGNvbm5lY3RvclR5cGVWYWxzKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmNvbm5lY3RvclR5cGVWYWxzID0gY29ubmVjdG9yVHlwZVZhbHM7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZWN1cmUgVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlY3VyZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnNlY3VyZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgc2VjdXJlIFRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VjdXJlKFN0cmluZyBzZWN1cmUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuc2VjdXJlID0gc2VjdXJlOworICAgICAgICAKKyAgICB9ICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGNwTm9EZWxheSBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGNwTm9EZWxheSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnRjcE5vRGVsYXk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRjcE5vRGVsYXkgVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUY3BOb0RlbGF5KFN0cmluZyB0Y3BOb0RlbGF5KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnRjcE5vRGVsYXkgPSB0Y3BOb0RlbGF5OworICAgICAgICAKKyAgICB9ICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB4cG93ZXJlZEJ5IFRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRYcG93ZXJlZEJ5KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMueHBvd2VyZWRCeTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgeHBvd2VyZWRCeSBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhwb3dlcmVkQnkoU3RyaW5nIHhwb3dlcmVkQnkpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMueHBvd2VyZWRCeSA9IHhwb3dlcmVkQnk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgIAorICAgICAgICB0aGlzLm9iamVjdE5hbWUgPSBudWxsOworICAgICAgICB0aGlzLmNvbm5lY3RvclR5cGUgPSBudWxsOworICAgICAgICB0aGlzLnBvcnRUZXh0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5hY2NlcHRDb3VudFRleHQgPSBudWxsOworICAgICAgICB0aGlzLmNvbm5MaW5nZXJUZXh0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5jb25uVGltZU91dFRleHQgPSBudWxsOworICAgICAgICB0aGlzLmNvbm5VcGxvYWRUaW1lT3V0VGV4dCA9IG51bGw7CisgICAgICAgIHRoaXMuYnVmZmVyU2l6ZVRleHQgPSBudWxsOworICAgICAgICB0aGlzLmFkZHJlc3MgPSBudWxsOworICAgICAgICB0aGlzLmVuYWJsZUxvb2t1cHMgPSAiZmFsc2UiOworICAgICAgICB0aGlzLmNvbXByZXNzaW9uID0gIm9mZiI7CisgICAgICAgIHRoaXMubWluUHJvY2Vzc29yc1RleHQgPSBudWxsOworICAgICAgICB0aGlzLm1heFByb2Nlc3NvcnNUZXh0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5tYXhLZWVwQWxpdmVUZXh0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5tYXhTcGFyZSA9IG51bGw7CisgICAgICAgIHRoaXMubWF4VGhyZWFkcyA9IG51bGw7CisgICAgICAgIHRoaXMubWluU3BhcmUgPSBudWxsOworICAgICAgICB0aGlzLnRocmVhZFByaW9yaXR5ID0gbnVsbDsKKyAgICAgICAgdGhpcy51cmlFbmNvZGluZ1RleHQgPSBudWxsOworICAgICAgICB0aGlzLnVzZUJvZHlFbmNvZGluZ0ZvclVSSSA9ICJmYWxzZSI7CisgICAgICAgIHRoaXMuYWxsb3dUcmFjZSA9ICJmYWxzZSI7CisgICAgICAgIHRoaXMucG9ydFRleHQgPSBudWxsOworICAgICAgICB0aGlzLnJlZGlyZWN0UG9ydFRleHQgPSBudWxsOworICAgICAgICB0aGlzLnByb3h5TmFtZSA9IG51bGw7CisgICAgICAgIHRoaXMucHJveHlQb3J0VGV4dCA9IG51bGw7CisgICAgICAgIHRoaXMua2V5U3RvcmVGaWxlTmFtZSA9IG51bGw7CisgICAgICAgIHRoaXMua2V5U3RvcmVQYXNzd29yZCA9IG51bGw7ICAgICAgICAKKyAgICAgICAgdGhpcy5jbGllbnRBdXRoZW50aWNhdGlvbiA9ICJmYWxzZSI7CisgICAgICAgIHRoaXMuc2VjdXJlID0gImZhbHNlIjsKKyAgICAgICAgdGhpcy50Y3BOb0RlbGF5ID0gImZhbHNlIjsKKyAgICAgICAgdGhpcy54cG93ZXJlZEJ5ID0gImZhbHNlIjsKKyAgICAgICAgdGhpcy50cnVzdFN0b3JlRmlsZU5hbWUgPSBudWxsOworICAgICAgICB0aGlzLnRydXN0U3RvcmVQYXNzd29yZCA9IG51bGw7CisgICAgICAgIHRoaXMudHJ1c3RTdG9yZVR5cGUgPSBudWxsOworICAgICAgICAKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBmcm9tIHRoaXMgSFRUUCByZXF1ZXN0LAorICAgICAqIGFuZCByZXR1cm4gYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW55CisgICAgICogdmFsaWRhdGlvbiBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gZm91bmQuICBJZiBubyBlcnJvcnMgYXJlIGZvdW5kLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB3aXRoIG5vCisgICAgICogcmVjb3JkZWQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIAorICAgIHByaXZhdGUgQWN0aW9uRXJyb3JzIGVycm9yczsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgIAorICAgICAgICBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgIAorICAgICAgICAvKiBUaGUgSVAgYWRkcmVzcyBjYW4gYWxzbyBiZSBudWxsIC0tIHdoaWNoIG1lYW5zIG9wZW4gdGhlCisgICAgICAgICBzZXJ2ZXIgc29ja2V0IG9uICphbGwqIElQIGFkZHJlc3NlcyBmb3IgdGhpcyBob3N0ICovCisgICAgICAgIGlmICgoYWRkcmVzcy5sZW5ndGgoKSA+IDApICYmICFhZGRyZXNzLmVxdWFsc0lnbm9yZUNhc2UoIiAiKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoYWRkcmVzcyk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImFkZHJlc3MiLCBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IuYWRkcmVzcy5pbnZhbGlkIikpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkcmVzcyA9ICIgIjsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIC8qIHBvcnRzICovCisgICAgICAgIG51bWJlckNoZWNrKCJwb3J0TnVtYmVyIiwgIHBvcnRUZXh0LCB0cnVlLCAxLCA2NTUzNSk7CisgICAgICAgIG51bWJlckNoZWNrKCJyZWRpcmVjdFBvcnRUZXh0IiwgIHJlZGlyZWN0UG9ydFRleHQsIHRydWUsIC0xLCA2NTUzNSk7CisgICAgICAgICAgICAKKyAgICAgICAgLy8gcHJveHkgICAgICAgICAgICAgICAgICAKKyAgICAgICAgaWYgKChwcm94eU5hbWUhPSBudWxsKSAmJiAocHJveHlOYW1lLmxlbmd0aCgpID4gMCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKHByb3h5TmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInByb3h5TmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IucHJveHlOYW1lLmludmFsaWQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAKKyAgICAgICAgCisgICAgICAgIC8vIHN1cHBvcnRlZCBvbmx5IGJ5IENveW90ZSBIVFRQIGFuZCBIVFRQUyBjb25uZWN0b3JzCisgICAgICAgIGlmICghKCJBSlAiLmVxdWFsc0lnbm9yZUNhc2UoY29ubmVjdG9yVHlwZSkpKSB7CisgICAgICAgICAgICBudW1iZXJDaGVjaygiYWNjZXB0Q291bnRUZXh0IiwgYWNjZXB0Q291bnRUZXh0LCB0cnVlLCAwLCAxMjgpOworICAgICAgICAgICAgLy9udW1iZXJDaGVjaygiY29ublRpbWVPdXRUZXh0IiwgY29ublRpbWVPdXRUZXh0LCB0cnVlLCAtMSwgNjAwMDApOworICAgICAgICAgICAgbnVtYmVyQ2hlY2soImJ1ZmZlclNpemVUZXh0IiwgYnVmZmVyU2l6ZVRleHQsIHRydWUsIDEsIDgxOTIpOworICAgICAgICAgICAgbnVtYmVyQ2hlY2soInByb3h5UG9ydFRleHQiLCAgcHJveHlQb3J0VGV4dCwgdHJ1ZSwgMCwgNjU1MzUpOyAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBlcnJvcnM7CisgICAgfQorICAgIAorICAgIC8qCisgICAgICogSGVscGVyIG1ldGhvZCB0byBjaGVjayB0aGF0IGl0IGlzIGEgcmVxdWlyZWQgbnVtYmVyIGFuZAorICAgICAqIGlzIGEgdmFsaWQgaW50ZWdlciB3aXRoaW4gdGhlIGdpdmVuIHJhbmdlLiAobWluLCBtYXgpLgorICAgICAqCisgICAgICogQHBhcmFtICBmaWVsZCAgVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm0gZm9yIHdoaWNoIHRoaXMgZXJyb3Igb2NjdXJlZC4KKyAgICAgKiBAcGFyYW0gIG51bVRleHQgIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlci4KKyAgICAgKiBAcGFyYW0gcmFuZ2VDaGVjayAgQm9vbGVhbiB2YWx1ZSBzZXQgdG8gdHJ1ZSBvZiByZWFuZ2UgY2hlY2sgc2hvdWxkIGJlCisgICAgICogcGVyZm9ybWVkLgorICAgICAqCisgICAgICogQHBhcmFtICBtaW4gIFRoZSBsb3dlciBsaW1pdCBvZiB0aGUgcmFuZ2UKKyAgICAgKiBAcGFyYW0gIG1heCAgVGhlIHVwcGVyIGxpbWl0IG9mIHRoZSByYW5nZQorICAgICAqCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgbnVtYmVyQ2hlY2soU3RyaW5nIGZpZWxkLCBTdHJpbmcgbnVtVGV4dCwgYm9vbGVhbiByYW5nZUNoZWNrLAorICAgIGludCBtaW4sIGludCBtYXgpIHsKKyAgICAgICAgCisgICAgICAgIC8qIENoZWNrIGZvciAnaXMgcmVxdWlyZWQnICovCisgICAgICAgIGlmICgobnVtVGV4dCA9PSBudWxsKSB8fCAobnVtVGV4dC5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKGZpZWxkLCBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IuIitmaWVsZCsiLnJlcXVpcmVkIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgCisgICAgICAgIC8qY2hlY2sgZm9yICdtdXN0IGJlIGEgbnVtYmVyJyBpbiB0aGUgJ3ZhbGlkIHJhbmdlJyovCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludCBudW0gPSBJbnRlZ2VyLnBhcnNlSW50KG51bVRleHQpOworICAgICAgICAgICAgICAgIC8vIHBlcmZvcm0gcmFuZ2UgY2hlY2sgb25seSBpZiByZXF1aXJlZAorICAgICAgICAgICAgICAgIGlmIChyYW5nZUNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgobnVtIDwgbWluKSB8fCAobnVtID4gbWF4ICkpCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci4iKyBmaWVsZCArIi5yYW5nZSIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoZmllbGQsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLiIrIGZpZWxkICsgIi5mb3JtYXQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29ubmVjdG9yL0Nvbm5lY3RvcnNGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29ubmVjdG9yL0Nvbm5lY3RvcnNGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxMmY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb25uZWN0b3IvQ29ubmVjdG9yc0Zvcm0uamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciBkZWxldGluZyBjb25uZWN0b3JzLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb25uZWN0b3JzRm9ybSBleHRlbmRzIEFjdGlvbkZvcm0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lcyBvZiB0aGUgY29ubmVjdG9ycyB0byBiZSBkZWxldGVkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbm5lY3RvcnNbXSA9IG5ldyBTdHJpbmdbMF07CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29ubmVjdG9ycygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmNvbm5lY3RvcnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3RvcnMoU3RyaW5nIGNvbm5lY3RvcnNbXSkgeworICAgICAgICB0aGlzLmNvbm5lY3RvcnMgPSBjb25uZWN0b3JzOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgdGhpcy5jb25uZWN0b3JzID0gbmV3IFN0cmluZ1swXTsKKworICAgIH0KKyAgICAgICAgCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb25uZWN0b3IvRGVsZXRlQ29ubmVjdG9yQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29ubmVjdG9yL0RlbGV0ZUNvbm5lY3RvckFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOTZkNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29ubmVjdG9yL0RlbGV0ZUNvbm5lY3RvckFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5EZWxldGUgQ29ubmVjdG9yczwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsZXRlQ29ubmVjdG9yQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsgICAgCisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisgICAgICAgIC8vIFNldCB1cCBhIGZvcm0gYmVhbiBjb250YWluaW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKKyAgICAgICAgLy8gb2JqZWN0cyB0byBiZSBkZWxldGVkCisgICAgICAgIENvbm5lY3RvcnNGb3JtIGNvbm5lY3RvcnNGb3JtID0gbmV3IENvbm5lY3RvcnNGb3JtKCk7CisgICAgICAgIFN0cmluZyBzZWxlY3QgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic2VsZWN0Iik7CisgICAgICAgIGlmIChzZWxlY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGNvbm5lY3RvcnNbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICBjb25uZWN0b3JzWzBdID0gc2VsZWN0OworICAgICAgICAgICAgY29ubmVjdG9yc0Zvcm0uc2V0Q29ubmVjdG9ycyhjb25uZWN0b3JzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gZ2V0IHRoZSBzZXJ2aWNlIE5hbWUgdGhpcyBzZWxlY3RlZCBob3N0IGJlbG9uZ3MgdG8KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZG9tYWluID0gKG5ldyBPYmplY3ROYW1lKHNlbGVjdCkpLmdldERvbWFpbigpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiRXJyb3IgZXh0cmFjdGluZyBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgY29ubmVjdG9yIHRvIGJlIGRlbGV0ZWQiLCBlKTsKKyAgICAgICAgICAgIH0gICAgICAgIAorICAgICAgICB9CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJjb25uZWN0b3JzRm9ybSIsIGNvbm5lY3RvcnNGb3JtKTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjY3VtdWxhdGUgYSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgY29ubmVjdG9ycworICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IGRvbWFpbiArIFRvbWNhdFRyZWVCdWlsZGVyLkNPTk5FQ1RPUl9UWVBFICsKKyAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5XSUxEQ0FSRDsgICAgICAgICAgCisgICAgICAgICAgICBJdGVyYXRvciBpdGVtcyA9CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIucXVlcnlOYW1lcyhuZXcgT2JqZWN0TmFtZShwYXR0ZXJuKSwgbnVsbCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVtcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgaXRlbSA9IGl0ZW1zLm5leHQoKTsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChpdGVtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5zZWxlY3QiKSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNlbGVjdCIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0gICAgICAKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoImNvbm5lY3RvcnNMaXN0IiwgbGlzdCk7CisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBsaXN0IGRpc3BsYXkgcGFnZQorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkNvbm5lY3RvcnMiKSk7ICAgICAgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29ubmVjdG9yL0RlbGV0ZUNvbm5lY3RvcnNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb25uZWN0b3IvRGVsZXRlQ29ubmVjdG9yc0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMmY4OGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29ubmVjdG9yL0RlbGV0ZUNvbm5lY3RvcnNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworCitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sTm9kZTsKKworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgY29tcGxldGVzIDxlbT5EZWxldGUgQ29ubmVjdG9yczwvZW0+CisgKiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlbGV0ZUNvbm5lY3RvcnNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvKioKKyAgICAgKiBTaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5yZW1vdmVDb25uZWN0b3I8L2NvZGU+IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZW1vdmVDb25uZWN0b3JUeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgICAvLyBPYmplY3QgbmFtZQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBEZWxldGUgdGhlIHNwZWNpZmllZCBDb25uZWN0b3JzCisgICAgICAgIFN0cmluZyBjb25uZWN0b3JzW10gID0gKChDb25uZWN0b3JzRm9ybSkgZm9ybSkuZ2V0Q29ubmVjdG9ycygpOworICAgICAgICBTdHJpbmcgdmFsdWVzW10gPSBuZXcgU3RyaW5nWzFdOworICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gInJlbW92ZUNvbm5lY3RvciI7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIExvb2sgdXAgb3VyIHRyZWUgY29udHJvbCBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgVHJlZUNvbnRyb2wgY29udHJvbCA9IChUcmVlQ29udHJvbCkKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEF0dHJpYnV0ZSgidHJlZUNvbnRyb2xUZXN0Iik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBMb29rIHVwIG91ciBNQmVhbkZhY3RvcnkgTUJlYW4KKyAgICAgICAgICAgIE9iamVjdE5hbWUgZm5hbWUgPSBudWxsOworICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIG5vZGUgPSBudWxsOworCisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBjb25uZWN0b3JzCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbm5lY3RvcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBjb25uZWN0b3JzW2ldOworICAgICAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zZWxlY3ROb2RlKG51bGwpOworICAgICAgICAgICAgICAgICAgICBub2RlID0gY29udHJvbC5maW5kTm9kZShjb25uZWN0b3JzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9vayB1cCBvdXIgTUJlYW5GYWN0b3J5IE1CZWFuCisgICAgICAgICAgICAgICAgICAgIGZuYW1lID0gVG9tY2F0VHJlZUJ1aWxkZXIuZ2V0TUJlYW5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIHJlbW92ZUNvbm5lY3RvclR5cGVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2coIk1pc3NpbmcgVHJlZUNvbnRyb2xOb2RlIGZvciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKCJNaXNzaW5nIFRyZWVDb250cm9sIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhpcyB0cmFuc2FjdGlvbgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb25uZWN0b3IvRWRpdENvbm5lY3RvckFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2Nvbm5lY3Rvci9FZGl0Q29ubmVjdG9yQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg5ZWY5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb25uZWN0b3IvRWRpdENvbm5lY3RvckFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5FZGl0IENvbm5lY3RvcjwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRWRpdENvbm5lY3RvckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBTZXQgdXAgdGhlIG9iamVjdCBuYW1lcyBvZiB0aGUgTUJlYW5zIHdlIGFyZSBtYW5pcHVsYXRpbmcKKyAgICAgICAgT2JqZWN0TmFtZSBjbmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbmFtZSA9IG5ldyBPYmplY3ROYW1lKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAiZXJyb3IuY29ubmVjdG9yTmFtZS5iYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKSk7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbGwgaW4gdGhlIGZvcm0gdmFsdWVzIGZvciBkaXNwbGF5IGFuZCBlZGl0aW5nCisgICAgICAgIENvbm5lY3RvckZvcm0gY29ubmVjdG9yRm0gPSBuZXcgQ29ubmVjdG9yRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgiY29ubmVjdG9yRm9ybSIsIGNvbm5lY3RvckZtKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0QWRtaW5BY3Rpb24oIkVkaXQiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0T2JqZWN0TmFtZShjbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5jb25uZWN0b3IiKSk7CisgICAgICAgIHNiLmFwcGVuZCgiICgiKTsKKyAgICAgICAgc2IuYXBwZW5kKGNuYW1lLmdldEtleVByb3BlcnR5KCJwb3J0IikpOworICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0Tm9kZUxhYmVsKHNiLnRvU3RyaW5nKCkpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRCb29sZWFuVmFscyhMaXN0cy5nZXRCb29sZWFuVmFsdWVzKCkpOyAgICAgICAgCisgICAgICAgIGNvbm5lY3RvckZtLnNldENsaWVudEF1dGhWYWxzKExpc3RzLmdldENsaWVudEF1dGhWYWx1ZXMoKSk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gQ29weSBzY2FsYXIgcHJvcGVydGllcworICAgICAgICAgICAgLy8gR2VuZXJhbCBwcm9wZXJ0aWVzCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAic2NoZW1lIjsKKyAgICAgICAgICAgIFN0cmluZyBzY2hlbWUgPSAoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSk7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRTY2hlbWUoc2NoZW1lKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInByb3RvY29sSGFuZGxlckNsYXNzTmFtZSI7CisgICAgICAgICAgICBTdHJpbmcgaGFuZGxlckNsYXNzTmFtZSA9IAorICAgICAgICAgICAgICAgIChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKTsKKyAgICAgICAgICAgIGludCBwZXJpb2QgPSBoYW5kbGVyQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgICAgICBTdHJpbmcgY29ublR5cGUgPSBoYW5kbGVyQ2xhc3NOYW1lLnN1YnN0cmluZyhwZXJpb2QgKyAxKTsKKyAgICAgICAgICAgIFN0cmluZyBjb25uZWN0b3JUeXBlID0gIkhUVFBTIjsKKyAgICAgICAgICAgIGlmICgiSmtDb3lvdGVIYW5kbGVyIi5lcXVhbHNJZ25vcmVDYXNlKGNvbm5UeXBlKSB8fAorICAgICAgICAgICAgICAgICAgICAiQWpwQXByUHJvdG9jb2wiLmVxdWFsc0lnbm9yZUNhc2UoY29ublR5cGUpKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdG9yVHlwZSA9ICJBSlAiOworICAgICAgICAgICAgfSBlbHNlIGlmICgoIkh0dHAxMVByb3RvY29sIi5lcXVhbHNJZ25vcmVDYXNlKGNvbm5UeXBlKSAgfHwKKyAgICAgICAgICAgICAgICAgICAgIkh0dHAxMUFwclByb3RvY29sIi5lcXVhbHNJZ25vcmVDYXNlKGNvbm5UeXBlKSkgJiYgCisgICAgICAgICAgICAgICAgICAgICgiaHR0cCIuZXF1YWxzSWdub3JlQ2FzZShzY2hlbWUpKSkgeworICAgICAgICAgICAgICAgIGNvbm5lY3RvclR5cGUgPSAiSFRUUCI7CisgICAgICAgICAgICB9ICAgICAgICAgICAgIAorICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0Q29ubmVjdG9yVHlwZShjb25uZWN0b3JUeXBlKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gImFjY2VwdENvdW50IjsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldEFjY2VwdENvdW50VGV4dAorICAgICAgICAgICAgICAgIChTdHJpbmcudmFsdWVPZihtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpKTsgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29tcHJlc3Npb24iOworICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0Q29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKTsgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29ubmVjdGlvbkxpbmdlciI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRDb25uTGluZ2VyVGV4dAorICAgICAgICAgICAgICAgIChTdHJpbmcudmFsdWVPZihtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjb25uZWN0aW9uVGltZW91dCI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRDb25uVGltZU91dFRleHQKKyAgICAgICAgICAgICAgICAoU3RyaW5nLnZhbHVlT2YobUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKSk7ICAgICAgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gImNvbm5lY3Rpb25VcGxvYWRUaW1lb3V0IjsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldENvbm5VcGxvYWRUaW1lT3V0VGV4dAorICAgICAgICAgICAgICAgIChTdHJpbmcudmFsdWVPZihtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpKTsgICAgICAgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gImRpc2FibGVVcGxvYWRUaW1lb3V0IjsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldERpc2FibGVVcGxvYWRUaW1lb3V0CisgICAgICAgICAgICAgICAgKFN0cmluZy52YWx1ZU9mKG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkpOyAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJidWZmZXJTaXplIjsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldEJ1ZmZlclNpemVUZXh0CisgICAgICAgICAgICAgICAgKFN0cmluZy52YWx1ZU9mKG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkpOyAgICAgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gImVuYWJsZUxvb2t1cHMiOworICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0RW5hYmxlTG9va3VwcworICAgICAgICAgICAgICAgIChTdHJpbmcudmFsdWVPZihtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJhZGRyZXNzIjsKKyAgICAgICAgICAgIE9iamVjdCBhZGRyZXNzT2JqZWN0ID0gbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpOworICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NTdHIgPSAiIjsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzT2JqZWN0IGluc3RhbmNlb2YgSW5ldEFkZHJlc3MpeworCSAgICAgICAgYWRkcmVzc1N0ciA9ICgoSW5ldEFkZHJlc3MpYWRkcmVzc09iamVjdCkuZ2V0SG9zdEFkZHJlc3MoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWRkcmVzc09iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgIGFkZHJlc3NTdHIgPSAoU3RyaW5nKSBhZGRyZXNzT2JqZWN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0QWRkcmVzcyhhZGRyZXNzU3RyKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtYXhLZWVwQWxpdmVSZXF1ZXN0cyI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRNYXhLZWVwQWxpdmVUZXh0CisgICAgICAgICAgICAgICAgKFN0cmluZy52YWx1ZU9mKG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkpOyAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtYXhTcGFyZVRocmVhZHMiOworICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0TWF4U3BhcmUKKyAgICAgICAgICAgICAgICAoU3RyaW5nLnZhbHVlT2YobUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKSk7ICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAibWF4VGhyZWFkcyI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRNYXhUaHJlYWRzCisgICAgICAgICAgICAgICAgKFN0cmluZy52YWx1ZU9mKG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkpOyAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtaW5TcGFyZVRocmVhZHMiOworICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0TWluU3BhcmUKKyAgICAgICAgICAgICAgICAoU3RyaW5nLnZhbHVlT2YobUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKSk7ICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ0aHJlYWRQcmlvcml0eSI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRUaHJlYWRQcmlvcml0eQorICAgICAgICAgICAgICAgIChTdHJpbmcudmFsdWVPZihtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJzZWN1cmUiOworICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0U2VjdXJlCisgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ0Y3BOb0RlbGF5IjsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldFRjcE5vRGVsYXkKKyAgICAgICAgICAgICAgICAoU3RyaW5nLnZhbHVlT2YobUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAieHBvd2VyZWRCeSI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRYcG93ZXJlZEJ5CisgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJVUklFbmNvZGluZyI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRVUklFbmNvZGluZ1RleHQKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VCb2R5RW5jb2RpbmdGb3JVUkkiOworICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0VXNlQm9keUVuY29kaW5nRm9yVVJJVGV4dAorICAgICAgICAgICAgICAgICgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiYWxsb3dUcmFjZSI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRBbGxvd1RyYWNlVGV4dAorICAgICAgICAgICAgICAgICgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgCisgICAgICAgICAgICAvLyBQb3J0cworICAgICAgICAgICAgYXR0cmlidXRlID0gInBvcnQiOworICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0UG9ydFRleHQKKyAgICAgICAgICAgICAgICAoKChJbnRlZ2VyKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOyAgICAgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gInJlZGlyZWN0UG9ydCI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRSZWRpcmVjdFBvcnRUZXh0CisgICAgICAgICAgICAgICAgKCgoSW50ZWdlcikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gU3VwcG9ydGVkIGJ5IEhUVFAgYW5kIEhUVFBTIG9ubHkKKyAgICAgICAgICAgIGlmICghKCJBSlAiLmVxdWFsc0lnbm9yZUNhc2UoY29ubmVjdG9yVHlwZSkpKSB7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gInByb3h5TmFtZSI7CisgICAgICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0UHJveHlOYW1lCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwcm94eVBvcnQiOworICAgICAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldFByb3h5UG9ydFRleHQKKyAgICAgICAgICAgICAgICAgICAgKCgoSW50ZWdlcikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCJIVFRQUyIuZXF1YWxzSWdub3JlQ2FzZShjb25uZWN0b3JUeXBlKSkgeworICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgcmVzdCBvZiB2YXJpYWJsZXMuIAorICAgICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSBzZXQgb25seSBmb3IgU1NMIGNvbm5lY3RvcnMuCisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gImFsZ29yaXRobSI7CisgICAgICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0QWxnb3JpdGhtCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjbGllbnRBdXRoIjsKKyAgICAgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRDbGllbnRBdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAoKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjaXBoZXJzIjsKKyAgICAgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRDaXBoZXJzCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpOyAgIAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJrZXlzdG9yZUZpbGUiOworICAgICAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldEtleVN0b3JlRmlsZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gImtleXN0b3JlUGFzcyI7CisgICAgICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0S2V5U3RvcmVQYXNzd29yZAorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKTsgICAgIAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJrZXlzdG9yZVR5cGUiOworICAgICAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldEtleVN0b3JlVHlwZQorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKTsgICAKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidHJ1c3RzdG9yZUZpbGUiOworICAgICAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldFRydXN0U3RvcmVGaWxlTmFtZQorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidHJ1c3RzdG9yZVBhc3MiOworICAgICAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldFRydXN0U3RvcmVQYXNzd29yZAorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKTsgICAgIAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ0cnVzdHN0b3JlVHlwZSI7CisgICAgICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0VHJ1c3RTdG9yZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSk7ICAgCisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gInNzbFByb3RvY29sIjsKKyAgICAgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRTc2xQcm90b2NvbAorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKTsgICAgICAgICAgCisgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGNvbm5lY3RvciBkaXNwbGF5IHBhZ2UKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJDb25uZWN0b3IiKSk7CisgICAgICAgIAorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29ubmVjdG9yL1NhdmVDb25uZWN0b3JBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb25uZWN0b3IvU2F2ZUNvbm5lY3RvckFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NThmNjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29ubmVjdG9yL1NhdmVDb25uZWN0b3JBY3Rpb24uamF2YQpAQCAtMCwwICsxLDQ2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2w7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2xOb2RlOworCisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkFkZCBDb25uZWN0b3I8L2VtPiBhbmQKKyAqIDxlbT5FZGl0IENvbm5lY3RvcjwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZUNvbm5lY3RvckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+Y3JlYXRlU3RhbmRhcmRDb25uZWN0b3I8L2NvZGU+IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVTdGFuZGFyZENvbm5lY3RvclR5cGVzW10gPQorICAgIHsgImphdmEubGFuZy5TdHJpbmciLCAgICAvLyBwYXJlbnQKKyAgICAgICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgLy8gYWRkcmVzcworICAgICAgImludCIgICAgICAgICAgICAgICAgICAvLyBwb3J0ICAgICAgCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9ICAgIAorICAgICAgICAKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3RlZCBhY3Rpb24KKyAgICAgICAgQ29ubmVjdG9yRm9ybSBjZm9ybSA9IChDb25uZWN0b3JGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgYWRtaW5BY3Rpb24gPSBjZm9ybS5nZXRBZG1pbkFjdGlvbigpOworICAgICAgICBTdHJpbmcgY09iamVjdE5hbWUgPSBjZm9ybS5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgIFN0cmluZyBjb25uZWN0b3JUeXBlID0gY2Zvcm0uZ2V0Q29ubmVjdG9yVHlwZSgpOworICAgICAgICBPYmplY3ROYW1lIGNvbmFtZSA9IG51bGw7CisKKyAgICAgICAgLy8gUGVyZm9ybSBhICJDcmVhdGUgQ29ubmVjdG9yIiB0cmFuc2FjdGlvbiAoaWYgcmVxdWVzdGVkKQorICAgICAgICBpZiAoIkNyZWF0ZSIuZXF1YWxzKGFkbWluQWN0aW9uKSkgeworCisgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZXNbXSA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gZ2V0IHNlcnZpY2UgbmFtZSB3aGljaCBpcyBzYW1lIGFzIGRvbWFpbgorICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGNmb3JtLmdldFNlcnZpY2VOYW1lKCk7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBzb25hbWUgPSBuZXcgT2JqZWN0TmFtZShzZXJ2aWNlTmFtZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHNvbmFtZS5nZXREb21haW4oKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGRvbWFpbik7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNlYXJjaFNCID0gbmV3IFN0cmluZ0J1ZmZlcigiKiIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChUb21jYXRUcmVlQnVpbGRlci5DT05ORUNUT1JfVFlQRSk7CisgICAgICAgICAgICAgICAgc2VhcmNoU0IuYXBwZW5kKFRvbWNhdFRyZWVCdWlsZGVyLkNPTk5FQ1RPUl9UWVBFKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIixwb3J0PSIgKyBjZm9ybS5nZXRQb3J0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICBzZWFyY2hTQi5hcHBlbmQoIixwb3J0PSIgKyBjZm9ybS5nZXRQb3J0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIHNlYXJjaCA9IG5ldyBPYmplY3ROYW1lKHNlYXJjaFNCLnRvU3RyaW5nKCkrIiwqIik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBjZm9ybS5nZXRBZGRyZXNzKCk7CisgICAgICAgICAgICAgICAgaWYgKChhZGRyZXNzIT1udWxsKSAmJiAoYWRkcmVzcy5sZW5ndGgoKT4wKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICghYWRkcmVzcy5lcXVhbHNJZ25vcmVDYXNlKCIgIikpKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLGFkZHJlc3M9IiArIGFkZHJlc3MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcmVxdWVzdGVkIGNvbm5lY3RvciBuYW1lIGFuZCBwb3J0IGlzIHVuaXF1ZQorICAgICAgICAgICAgICAgIGlmIChtQlNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpIHx8CisgICAgICAgICAgICAgICAgICAgICghbUJTZXJ2ZXIucXVlcnlOYW1lcyhzZWFyY2gsIG51bGwpLmlzRW1wdHkoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQWN0aW9uTWVzc2FnZXMgZXJyb3JzID0gbmV3IEFjdGlvbk1lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImNvbm5lY3Rvck5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5jb25uZWN0b3JOYW1lLmV4aXN0cyIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZUVycm9ycyhyZXF1ZXN0LCBlcnJvcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBY3Rpb25Gb3J3YXJkKG1hcHBpbmcuZ2V0SW5wdXQoKSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIExvb2sgdXAgb3VyIE1CZWFuRmFjdG9yeSBNQmVhbgorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgZm5hbWUgPSBUb21jYXRUcmVlQnVpbGRlci5nZXRNQmVhbkZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBDb25uZWN0b3Igb2JqZWN0CisgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IE9iamVjdFszXTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gc2VydmljZU5hbWU7ICAvL3NlcnZpY2UgcGFyZW50IG9iamVjdCBuYW1lCisgICAgICAgICAgICAgICAgdmFsdWVzWzFdID0gYWRkcmVzczsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMl0gPSBuZXcgSW50ZWdlcihjZm9ybS5nZXRQb3J0VGV4dCgpKTsKKworICAgICAgICAgICAgICAgIGlmICgiSFRUUCIuZXF1YWxzSWdub3JlQ2FzZShjb25uZWN0b3JUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gImNyZWF0ZUh0dHBDb25uZWN0b3IiOyAvLyBIVFRQCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiSFRUUFMiLmVxdWFsc0lnbm9yZUNhc2UoY29ubmVjdG9yVHlwZSkpIHsgCisgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAiY3JlYXRlSHR0cHNDb25uZWN0b3IiOyAgIC8vIEhUVFBTCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJjcmVhdGVBanBDb25uZWN0b3IiOyAgIC8vIEFKUChIVFRQKSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjT2JqZWN0TmFtZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCBjcmVhdGVTdGFuZGFyZENvbm5lY3RvclR5cGVzKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5ldyBDb25uZWN0b3IgdG8gb3VyIHRyZWUgY29udHJvbCBub2RlCisgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2wgY29udHJvbCA9IChUcmVlQ29udHJvbCkKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoInRyZWVDb250cm9sVGVzdCIpOworICAgICAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmVudE5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHBhcmVudE5vZGUgPSBjb250cm9sLmZpbmROb2RlKHBhcmVudE5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm9kZUxhYmVsID0gcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuY29ubmVjdG9yIikgKyAiICgiICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Zvcm0uZ2V0UG9ydFRleHQoKSArICIpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGVkTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoY09iamVjdE5hbWUsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBjaGlsZE5vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmVlQ29udHJvbE5vZGUoY09iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdG9yLmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWRpdENvbm5lY3Rvci5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGRvbWFpbik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRS0tdGhlIG5vZGUgc2hvdWxkIGJlIG5leHQgdG8gdGhlIHJlc3Qgb2YgCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgQ29ubmVjdG9yIG5vZGVzLi4KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuYWRkQ2hpbGQoY2hpbGROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIC0gZm9yY2UgYSByZWRpc3BsYXkKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBmaW5kIHBhcmVudCBub2RlICciICsgcGFyZW50TmFtZSArICInIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBmaW5kIFRyZWVDb250cm9sTm9kZSEiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYXR0cmlidXRlIHVwZGF0ZXMgYXMgcmVxdWVzdGVkCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBjb25hbWUgPSBuZXcgT2JqZWN0TmFtZShjT2JqZWN0TmFtZSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJhY2NlcHRDb3VudCI7CisgICAgICAgICAgICBpbnQgYWNjZXB0Q291bnQgPSA2MDAwMDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYWNjZXB0Q291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KGNmb3JtLmdldEFjY2VwdENvdW50VGV4dCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgYWNjZXB0Q291bnQgPSA2MDAwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiYWNjZXB0Q291bnQiLCBuZXcgSW50ZWdlcihhY2NlcHRDb3VudCkpKTsgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29tcHJlc3Npb24iOyAgCisgICAgICAgICAgICBTdHJpbmcgY29tcHJlc3Npb24gPSBjZm9ybS5nZXRDb21wcmVzc2lvbigpOworICAgICAgICAgICAgaWYgKChjb21wcmVzc2lvbiAhPSBudWxsKSAmJiAoY29tcHJlc3Npb24ubGVuZ3RoKCk+MCkpIHsgCisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiY29tcHJlc3Npb24iLCBjb21wcmVzc2lvbikpOworICAgICAgICAgICAgfSAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29ubmVjdGlvbkxpbmdlciI7CisgICAgICAgICAgICBpbnQgY29ubmVjdGlvbkxpbmdlciA9IC0xOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGluZ2VyID0gSW50ZWdlci5wYXJzZUludChjZm9ybS5nZXRDb25uTGluZ2VyVGV4dCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbkxpbmdlciA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImNvbm5lY3Rpb25MaW5nZXIiLCBuZXcgSW50ZWdlcihjb25uZWN0aW9uTGluZ2VyKSkpOyAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjb25uZWN0aW9uVGltZW91dCI7CisgICAgICAgICAgICBpbnQgY29ubmVjdGlvblRpbWVvdXQgPSAwOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dCA9IEludGVnZXIucGFyc2VJbnQoY2Zvcm0uZ2V0Q29ublRpbWVPdXRUZXh0KCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImNvbm5lY3Rpb25UaW1lb3V0IiwgbmV3IEludGVnZXIoY29ubmVjdGlvblRpbWVvdXQpKSk7ICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29ubmVjdGlvblVwbG9hZFRpbWVvdXQiOworICAgICAgICAgICAgaW50IGNvbm5lY3Rpb25VcGxvYWRUaW1lb3V0ID0gMDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvblVwbG9hZFRpbWVvdXQgPSBJbnRlZ2VyLnBhcnNlSW50KGNmb3JtLmdldENvbm5VcGxvYWRUaW1lT3V0VGV4dCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvblVwbG9hZFRpbWVvdXQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJjb25uZWN0aW9uVXBsb2FkVGltZW91dCIsIG5ldyBJbnRlZ2VyKGNvbm5lY3Rpb25VcGxvYWRUaW1lb3V0KSkpOyAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiYnVmZmVyU2l6ZSI7CisgICAgICAgICAgICBpbnQgYnVmZmVyU2l6ZSA9IDIwNDg7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUgPSBJbnRlZ2VyLnBhcnNlSW50KGNmb3JtLmdldEJ1ZmZlclNpemVUZXh0KCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJTaXplID0gMjA0ODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiYnVmZmVyU2l6ZSIsIG5ldyBJbnRlZ2VyKGJ1ZmZlclNpemUpKSk7ICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gImRpc2FibGVVcGxvYWRUaW1lb3V0IjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiZGlzYWJsZVVwbG9hZFRpbWVvdXQiLCBuZXcgQm9vbGVhbihjZm9ybS5nZXREaXNhYmxlVXBsb2FkVGltZW91dCgpKSkpOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gImVuYWJsZUxvb2t1cHMiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJlbmFibGVMb29rdXBzIiwgbmV3IEJvb2xlYW4oY2Zvcm0uZ2V0RW5hYmxlTG9va3VwcygpKSkpOyAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicmVkaXJlY3RQb3J0IjsKKyAgICAgICAgICAgIGludCByZWRpcmVjdFBvcnQgPSAwOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZWRpcmVjdFBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGNmb3JtLmdldFJlZGlyZWN0UG9ydFRleHQoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHJlZGlyZWN0UG9ydCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInJlZGlyZWN0UG9ydCIsIG5ldyBJbnRlZ2VyKHJlZGlyZWN0UG9ydCkpKTsgCisgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAibWF4S2VlcEFsaXZlUmVxdWVzdHMiOworICAgICAgICAgICAgaW50IG1heEtlZXBBbGl2ZVJlcXVlc3RzID0gMTAwOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYXhLZWVwQWxpdmVSZXF1ZXN0cyA9IEludGVnZXIucGFyc2VJbnQoY2Zvcm0uZ2V0TWF4S2VlcEFsaXZlVGV4dCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgbWF4S2VlcEFsaXZlUmVxdWVzdHMgPSAxMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoIm1heEtlZXBBbGl2ZVJlcXVlc3RzIiwgbmV3IEludGVnZXIobWF4S2VlcEFsaXZlUmVxdWVzdHMpKSk7IAorICAgICAgICAgICAgYXR0cmlidXRlID0gIm1heFNwYXJlVGhyZWFkcyI7CisgICAgICAgICAgICBpbnQgbWF4U3BhcmUgPSA1MDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWF4U3BhcmUgPSBJbnRlZ2VyLnBhcnNlSW50KGNmb3JtLmdldE1heFNwYXJlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBtYXhTcGFyZSA9IDUwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgKG5ldyBJbnRlZ2VyKG1heFNwYXJlKSkudG9TdHJpbmcoKSkpOyAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtYXhUaHJlYWRzIjsKKyAgICAgICAgICAgIGludCBtYXhUaHJlYWRzID0gMjAwOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYXhUaHJlYWRzID0gSW50ZWdlci5wYXJzZUludChjZm9ybS5nZXRNYXhUaHJlYWRzKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBtYXhUaHJlYWRzID0gMjAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgKG5ldyBJbnRlZ2VyKG1heFRocmVhZHMpKS50b1N0cmluZygpKSk7IAorCQkJCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAibWluU3BhcmVUaHJlYWRzIjsKKyAgICAgICAgICAgIGludCBtaW5TcGFyZSA9IDQ7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1pblNwYXJlID0gSW50ZWdlci5wYXJzZUludChjZm9ybS5nZXRNaW5TcGFyZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgbWluU3BhcmUgPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgKG5ldyBJbnRlZ2VyKG1pblNwYXJlKSkudG9TdHJpbmcoKSkpOyAKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInRocmVhZFByaW9yaXR5IjsKKyAgICAgICAgICAgIGludCB0aHJlYWRQcmlvcml0eSA9IFRocmVhZC5OT1JNX1BSSU9SSVRZOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aHJlYWRQcmlvcml0eSA9IEludGVnZXIucGFyc2VJbnQoY2Zvcm0uZ2V0VGhyZWFkUHJpb3JpdHkoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHRocmVhZFByaW9yaXR5ID0gVGhyZWFkLk5PUk1fUFJJT1JJVFk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCAobmV3IEludGVnZXIodGhyZWFkUHJpb3JpdHkpKSkpOworCQkJCSAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAic2VjdXJlIjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgic2VjdXJlIiwgbmV3IEJvb2xlYW4oY2Zvcm0uZ2V0U2VjdXJlKCkpKSk7ICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gInRjcE5vRGVsYXkiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJ0Y3BOb0RlbGF5IiwgbmV3IEJvb2xlYW4oY2Zvcm0uZ2V0VGNwTm9EZWxheSgpKSkpOyAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gInhwb3dlcmVkQnkiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJ4cG93ZXJlZEJ5IiwgbmV3IEJvb2xlYW4oY2Zvcm0uZ2V0WHBvd2VyZWRCeSgpKSkpOyAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiVVJJRW5jb2RpbmciOworICAgICAgICAgICAgU3RyaW5nIHVyaUVuYyA9IGNmb3JtLmdldFVSSUVuY29kaW5nVGV4dCgpOworICAgICAgICAgICAgaWYgKCh1cmlFbmMgIT0gbnVsbCkgJiYgKHVyaUVuYy5sZW5ndGgoKT09MCkpIHsKKyAgICAgICAgICAgICAgICB1cmlFbmMgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgdXJpRW5jKSk7ICAgICAgICAgICAgCisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VCb2R5RW5jb2RpbmdGb3JVUkkiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgbmV3IEJvb2xlYW4oY2Zvcm0uZ2V0VXNlQm9keUVuY29kaW5nRm9yVVJJVGV4dCgpKSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiYWxsb3dUcmFjZSI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCBuZXcgQm9vbGVhbihjZm9ybS5nZXRBbGxvd1RyYWNlVGV4dCgpKSkpOworCisgICAgICAgICAgICAvLyBwcm94eSBuYW1lIGFuZCBwb3J0IGRvIG5vdCBleGlzdCBmb3IgQUpQIGNvbm5lY3RvcgorICAgICAgICAgICAgaWYgKCEoIkFKUCIuZXF1YWxzSWdub3JlQ2FzZShjb25uZWN0b3JUeXBlKSkpIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicHJveHlOYW1lIjsgIAorICAgICAgICAgICAgICAgIFN0cmluZyBwcm94eU5hbWUgPSBjZm9ybS5nZXRQcm94eU5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoKHByb3h5TmFtZSAhPSBudWxsKSAmJiAocHJveHlOYW1lLmxlbmd0aCgpPjApKSB7IAorICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInByb3h5TmFtZSIsIHByb3h5TmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicHJveHlQb3J0IjsKKyAgICAgICAgICAgICAgICBpbnQgcHJveHlQb3J0ID0gMDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBwcm94eVBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGNmb3JtLmdldFByb3h5UG9ydFRleHQoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJveHlQb3J0ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInByb3h5UG9ydCIsIG5ldyBJbnRlZ2VyKHByb3h5UG9ydCkpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEhUVFBTIHNwZWNpZmljIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGlmKCJIVFRQUyIuZXF1YWxzSWdub3JlQ2FzZShjb25uZWN0b3JUeXBlKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBhbGdvcml0aG0gPSBjZm9ybS5nZXRBbGdvcml0aG0oKTsKKyAgICAgICAgICAgICAgICBpZiAoKGFsZ29yaXRobSAhPSBudWxsKSAmJiAoYWxnb3JpdGhtLmxlbmd0aCgpPjApKSAKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImFsZ29yaXRobSIsIGFsZ29yaXRobSkpOyAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImNsaWVudEF1dGgiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmb3JtLmdldENsaWVudEF1dGhlbnRpY2F0aW9uKCkpKTsgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2lwaGVycyA9IGNmb3JtLmdldENpcGhlcnMoKTsKKyAgICAgICAgICAgICAgICBpZiAoKGNpcGhlcnMgIT0gbnVsbCkgJiYgKGNpcGhlcnMubGVuZ3RoKCk+MCkpIAorICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiY2lwaGVycyIsIGNpcGhlcnMpKTsgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0cmluZyBrZXlGaWxlID0gY2Zvcm0uZ2V0S2V5U3RvcmVGaWxlTmFtZSgpOworICAgICAgICAgICAgICAgIGlmICgoa2V5RmlsZSAhPSBudWxsKSAmJiAoa2V5RmlsZS5sZW5ndGgoKT4wKSkgCisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJrZXlzdG9yZUZpbGUiLCBrZXlGaWxlKSk7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3RyaW5nIGtleVBhc3MgPSBjZm9ybS5nZXRLZXlTdG9yZVBhc3N3b3JkKCk7CisgICAgICAgICAgICAgICAgaWYgKChrZXlQYXNzICE9IG51bGwpICYmIChrZXlQYXNzLmxlbmd0aCgpPjApKSAKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImtleXN0b3JlUGFzcyIsIGtleVBhc3MpKTsgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJ3YXJuaW5nIiwgImNvbm5lY3Rvci5rZXlQYXNzLndhcm5pbmciKTsgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0cmluZyBrZXlUeXBlID0gY2Zvcm0uZ2V0S2V5U3RvcmVUeXBlKCk7CisgICAgICAgICAgICAgICAgaWYgKChrZXlUeXBlICE9IG51bGwpICYmIChrZXlUeXBlLmxlbmd0aCgpPjApKSAKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImtleXN0b3JlVHlwZSIsIGtleVR5cGUpKTsgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHJ1c3RGaWxlID0gY2Zvcm0uZ2V0VHJ1c3RTdG9yZUZpbGVOYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCh0cnVzdEZpbGUgIT0gbnVsbCkgJiYgKHRydXN0RmlsZS5sZW5ndGgoKT4wKSkgCisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJ0cnVzdHN0b3JlRmlsZSIsIHRydXN0RmlsZSkpOyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0cmluZyB0cnVzdFBhc3MgPSBjZm9ybS5nZXRUcnVzdFN0b3JlUGFzc3dvcmQoKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRydXN0UGFzcyAhPSBudWxsKSAmJiAodHJ1c3RQYXNzLmxlbmd0aCgpPjApKSAKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInRydXN0c3RvcmVQYXNzIiwgdHJ1c3RQYXNzKSk7ICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHJ1c3RUeXBlID0gY2Zvcm0uZ2V0VHJ1c3RTdG9yZVR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRydXN0VHlwZSAhPSBudWxsKSAmJiAodHJ1c3RUeXBlLmxlbmd0aCgpPjApKSAKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInRydXN0c3RvcmVUeXBlIiwgdHJ1c3RUeXBlKSk7ICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3RyaW5nIHNzbFByb3RvY29sID0gY2Zvcm0uZ2V0U3NsUHJvdG9jb2woKTsKKyAgICAgICAgICAgICAgICBpZiAoKHNzbFByb3RvY29sICE9IG51bGwpICYmIChzc2xQcm90b2NvbC5sZW5ndGgoKT4wKSkgCisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJzc2xQcm90b2NvbCIsIHNzbFByb3RvY29sKSk7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICB9CisgCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHN1Y2Nlc3MgcmVwb3J0aW5nIHBhZ2UKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUobWFwcGluZy5nZXRBdHRyaWJ1dGUoKSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2F2ZSBTdWNjZXNzZnVsIikpOworICAgICAgICAKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29udGV4dC9BZGRDb250ZXh0QWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29udGV4dC9BZGRDb250ZXh0QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3OTQxNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb250ZXh0L0FkZENvbnRleHRBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29udGV4dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5BZGQgQ29udGV4dDwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQWRkQ29udGV4dEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIAorICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBDb250ZXh0Rm9ybSBjb250ZXh0Rm0gPSBuZXcgQ29udGV4dEZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoImNvbnRleHRGb3JtIiwgY29udGV4dEZtKTsKKyAgICAgICAgY29udGV4dEZtLnNldEFkbWluQWN0aW9uKCJDcmVhdGUiKTsKKyAgICAgICAgY29udGV4dEZtLnNldE9iamVjdE5hbWUoIiIpOworICAgICAgICBTdHJpbmcgcGFyZW50ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhcmVudCIpOworICAgICAgICBjb250ZXh0Rm0uc2V0UGFyZW50T2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICBpbnQgaSA9IHBhcmVudC5pbmRleE9mKCI6Iik7CisgICAgICAgIFN0cmluZyBkb21haW4gPSBwYXJlbnQuc3Vic3RyaW5nKDAsIGkpOworICAgICAgICBpbnQgcG9zaXRpb24gPSBwYXJlbnQuaW5kZXhPZigiLCIpOworICAgICAgICBTdHJpbmcgbG9hZGVyID0gZG9tYWluICsgVG9tY2F0VHJlZUJ1aWxkZXIuTE9BREVSX1RZUEUgKyAKKyAgICAgICAgICAgICAgICBwYXJlbnQuc3Vic3RyaW5nKHBvc2l0aW9uLCBwYXJlbnQubGVuZ3RoKCkpOworICAgICAgICBTdHJpbmcgbWFuYWdlciA9IGRvbWFpbiArIFRvbWNhdFRyZWVCdWlsZGVyLk1BTkFHRVJfVFlQRSArIAorICAgICAgICAgICAgICAgIHBhcmVudC5zdWJzdHJpbmcocG9zaXRpb24sIHBhcmVudC5sZW5ndGgoKSk7CisgICAgICAgIGNvbnRleHRGbS5zZXRMb2FkZXJPYmplY3ROYW1lKGxvYWRlcik7CisgICAgICAgIGNvbnRleHRGbS5zZXRNYW5hZ2VyT2JqZWN0TmFtZShtYW5hZ2VyKTsgCisgICAgICAgIGNvbnRleHRGbS5zZXROb2RlTGFiZWwoIiIpOworICAgICAgICBjb250ZXh0Rm0uc2V0Q29va2llcygiIik7CisgICAgICAgIGNvbnRleHRGbS5zZXRDcm9zc0NvbnRleHQoImZhbHNlIik7CisgICAgICAgIGNvbnRleHRGbS5zZXREb2NCYXNlKCIiKTsKKyAgICAgICAgY29udGV4dEZtLnNldE92ZXJyaWRlKCJmYWxzZSIpOworICAgICAgICBjb250ZXh0Rm0uc2V0UHJpdmlsZWdlZCgiZmFsc2UiKTsKKyAgICAgICAgY29udGV4dEZtLnNldFBhdGgoIiIpOworICAgICAgICBjb250ZXh0Rm0uc2V0UmVsb2FkYWJsZSgiZmFsc2UiKTsKKyAgICAgICAgY29udGV4dEZtLnNldFN3YWxsb3dPdXRwdXQoImZhbHNlIik7CisgICAgICAgIGNvbnRleHRGbS5zZXRVc2VOYW1pbmcoInRydWUiKTsKKyAgICAgICAgY29udGV4dEZtLnNldFdvcmtEaXIoIiIpOyAgICAgICAgCisgICAgICAgIGNvbnRleHRGbS5zZXRQYXRoKCIiKTsKKyAgICAgICAgLy9sb2FkZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgLy9jb250ZXh0Rm0uc2V0TGRyQ2hlY2tJbnRlcnZhbCgiMTUiKTsKKyAgICAgICAgY29udGV4dEZtLnNldExkclJlbG9hZGFibGUoImZhbHNlIik7CisgICAgICAgIC8vbWFuYWdlciBpbml0aWFsaXphdGlvbgorICAgICAgICAvL2NvbnRleHRGbS5zZXRNZ3JDaGVja0ludGVydmFsKCI2MCIpOworICAgICAgICBjb250ZXh0Rm0uc2V0TWdyTWF4U2Vzc2lvbnMoIi0xIik7CisgICAgICAgIGNvbnRleHRGbS5zZXRNZ3JTZXNzaW9uSURJbml0KCIiKTsKKyAgICAgICAgCisgICAgICAgIGNvbnRleHRGbS5zZXRCb29sZWFuVmFscyhMaXN0cy5nZXRCb29sZWFuVmFsdWVzKCkpOyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBjb250ZXh0IGRpc3BsYXkgcGFnZQorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkNvbnRleHQiKSk7CisgICAgICAgIAorICAgIH0gICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29udGV4dC9Db250ZXh0Rm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2NvbnRleHQvQ29udGV4dEZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDYyYTYxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2NvbnRleHQvQ29udGV4dEZvcm0uamF2YQpAQCAtMCwwICsxLDc3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb250ZXh0OworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgY29udGV4dCBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb250ZXh0Rm9ybSBleHRlbmRzIEFjdGlvbkZvcm0geworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworICAgIAorICAgLyoqCisgICAgICogVGhlIGFkbWluaXN0cmF0aXZlIGFjdGlvbiByZXByZXNlbnRlZCBieSB0aGlzIGZvcm0uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWRtaW5BY3Rpb24gPSAiRWRpdCI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWUgb2YgdGhlIENvbnRleHQgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBvYmplY3ROYW1lID0gbnVsbDsKKyAgIAorICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZSBvZiB0aGUgcGFyZW50IG9mIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXJlbnRPYmplY3ROYW1lID0gbnVsbDsKKyAgIAorICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lIG9mIHRoZSBsb2FkZXIgb2YgdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGxvYWRlck9iamVjdE5hbWUgPSBudWxsOworICAgCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lIG9mIHRoZSBtYW5hZ2VyIG9mIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtYW5hZ2VyT2JqZWN0TmFtZSA9IG51bGw7CisgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIG5vZGUgbGFiZWwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbm9kZUxhYmVsID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgY29va2llcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb29raWVzID0gImZhbHNlIjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgY3Jvc3MgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjcm9zc0NvbnRleHQgPSAiZmFsc2UiOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgZG9jdW1lbnQgQmFzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkb2NCYXNlID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3Igb3ZlcnJpZGUgYm9vbGVhbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBvdmVycmlkZSA9ICJmYWxzZSI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHByaXZpbGVnZWQgYm9vbGVhbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcml2aWxlZ2VkID0gImZhbHNlIjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGNvbnRleHQgcGF0aCBmb3IgdGhpcyBjb250ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhdGggPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciByZWxvYWRhYmxlIGJvb2xlYW4uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVsb2FkYWJsZSA9ICJmYWxzZSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3Igc3dhbGxvd091dHB1dCBib29sZWFuLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHN3YWxsb3dPdXRwdXQgPSAiZmFsc2UiOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHVzZSBuYW1pbmcgYm9vbGVhbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2VOYW1pbmcgPSAiZmFsc2UiOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoaXMgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB3b3JrRGlyID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGxvYWRlciBjaGVjayBpbnRlcnZhbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsZHJDaGVja0ludGVydmFsID0gIjE1IjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGJvb2xlYW4gdmFsdWUgb2YgbG9hZGVyIHJlbG9hZGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbGRyUmVsb2FkYWJsZSA9ICJmYWxzZSI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBzZXNzaW9uIG1hbmFnZXIgY2hlY2sgaW50ZXJ2YWwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWdyQ2hlY2tJbnRlcnZhbCA9ICI2MCI7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBzZXNzaW9uIG1nciBzZXNzaW9uIElEIGluaXRpYWxpemVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1nclNlc3Npb25JREluaXQgPSAiIjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHNlc3Npb24gbWdyIG1heCBhY3RpdmUgc2Vzc2lvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWdyTWF4U2Vzc2lvbnMgPSAiMCI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBhbnRpIHJlc291cmNlIGxvY2tpbmcgZmxhZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhbnRpUmVzb3VyY2VMb2NraW5nID0gImZhbHNlIjsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgYW50aSBqYXIgbG9ja2luZyBmbGFnLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFudGlKYXJMb2NraW5nID0gImZhbHNlIjsKKworICAgIC8qCisgICAgICogUmVwcmVzZW50IGJvb2xlYW4gKHRydWUsIGZhbHNlKSB2YWx1ZXMgZm9yIGNvb2tpZXMgZXRjLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdCBib29sZWFuVmFscyA9IG51bGw7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisgICAgIAorICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWRtaW5BY3Rpb24oKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRtaW5BY3Rpb247CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWRtaW5pc3RyYXRpdmUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9ybS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZG1pbkFjdGlvbihTdHJpbmcgYWRtaW5BY3Rpb24pIHsKKworICAgICAgICB0aGlzLmFkbWluQWN0aW9uID0gYWRtaW5BY3Rpb247CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBDb250ZXh0IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPYmplY3ROYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLm9iamVjdE5hbWU7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBDb250ZXh0IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0TmFtZShTdHJpbmcgb2JqZWN0TmFtZSkgeworCisgICAgICAgIHRoaXMub2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7CisKKyAgICB9ICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGFyZW50IG9iamVjdCBuYW1lIG9mIHRoZSBDb250ZXh0IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnRPYmplY3ROYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnBhcmVudE9iamVjdE5hbWU7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhcmVudCBvYmplY3QgbmFtZSBvZiB0aGUgQ29udGV4dCB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudE9iamVjdE5hbWUoU3RyaW5nIHBhcmVudE9iamVjdE5hbWUpIHsKKworICAgICAgICB0aGlzLnBhcmVudE9iamVjdE5hbWUgPSBwYXJlbnRPYmplY3ROYW1lOworCisgICAgfQorICAgIAorICAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2FkZXIgb2JqZWN0IG5hbWUgb2YgdGhlIENvbnRleHQgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExvYWRlck9iamVjdE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyT2JqZWN0TmFtZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9hZGVyIG9iamVjdCBuYW1lIG9mIHRoZSBDb250ZXh0IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9hZGVyT2JqZWN0TmFtZShTdHJpbmcgbG9hZGVyT2JqZWN0TmFtZSkgeworCisgICAgICAgIHRoaXMubG9hZGVyT2JqZWN0TmFtZSA9IGxvYWRlck9iamVjdE5hbWU7CisKKyAgICB9CisgICAgCisgICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1hbmFnZXIgb2JqZWN0IG5hbWUgb2YgdGhlIENvbnRleHQgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1hbmFnZXJPYmplY3ROYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXJPYmplY3ROYW1lOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYW5hZ2VyIG9iamVjdCBuYW1lIG9mIHRoZSBDb250ZXh0IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlck9iamVjdE5hbWUoU3RyaW5nIG1hbmFnZXJPYmplY3ROYW1lKSB7CisKKyAgICAgICAgdGhpcy5tYW5hZ2VyT2JqZWN0TmFtZSA9IG1hbmFnZXJPYmplY3ROYW1lOworCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGFiZWwgb2YgdGhlIG5vZGUgdGhhdCB3YXMgY2xpY2tlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVMYWJlbCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLm5vZGVMYWJlbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgbm9kZSBsYWJlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb2RlTGFiZWwoU3RyaW5nIG5vZGVMYWJlbCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5ub2RlTGFiZWwgPSBub2RlTGFiZWw7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJvb2xlYW5WYWxzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldEJvb2xlYW5WYWxzKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuYm9vbGVhblZhbHM7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlYnVnVmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuVmFscyhMaXN0IGJvb2xlYW5WYWxzKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmJvb2xlYW5WYWxzID0gYm9vbGVhblZhbHM7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENvb2tpZXMuCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRDb29raWVzKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuY29va2llczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29va2llcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb29raWVzKFN0cmluZyBjb29raWVzKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmNvb2tpZXMgPSBjb29raWVzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDcm9zcyBDb250ZXh0LgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3Jvc3NDb250ZXh0KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuY3Jvc3NDb250ZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDcm9zcyBDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENyb3NzQ29udGV4dChTdHJpbmcgY3Jvc3NDb250ZXh0KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmNyb3NzQ29udGV4dCA9IGNyb3NzQ29udGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgRG9jdW1lbnQgQmFzZSBUZXh0LgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jQmFzZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmRvY0Jhc2U7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRvY3VtZW50IEJhc2UgdGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREb2NCYXNlKFN0cmluZyBkb2NCYXNlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmRvY0Jhc2UgPSBkb2NCYXNlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBPdmVycmlkZSBib29sZWFuIHZhbHVlLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3ZlcnJpZGUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5vdmVycmlkZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgb3ZlcnJpZGUgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3ZlcnJpZGUoU3RyaW5nIG92ZXJyaWRlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLm92ZXJyaWRlID0gb3ZlcnJpZGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByaXZpbGVnZWQgYm9vbGVhbiB2YWx1ZS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByaXZpbGVnZWQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5wcml2aWxlZ2VkOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcml2aWxlZ2VkIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaXZpbGVnZWQoU3RyaW5nIHByaXZpbGVnZWQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMucHJpdmlsZWdlZCA9IHByaXZpbGVnZWQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbnRleHQgcGF0aC4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5wYXRoOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb250ZXh0IHBhdGggdGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZWxvYWRhYmxlIGJvb2xlYW4gdmFsdWUuCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRSZWxvYWRhYmxlKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkYWJsZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVsb2FkYWJsZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWxvYWRhYmxlKFN0cmluZyByZWxvYWRhYmxlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnJlbG9hZGFibGUgPSByZWxvYWRhYmxlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzd2FsbG93T3V0cHV0IGJvb2xlYW4gdmFsdWUuCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN3YWxsb3dPdXRwdXQoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuc3dhbGxvd091dHB1dDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3dhbGxvd091dHB1dCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTd2FsbG93T3V0cHV0KFN0cmluZyBzd2FsbG93T3V0cHV0KSB7CisKKyAgICAgICAgdGhpcy5zd2FsbG93T3V0cHV0ID0gc3dhbGxvd091dHB1dDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlIG5hbWluZyBib29sZWFuIHZhbHVlLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlTmFtaW5nKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMudXNlTmFtaW5nOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VOYW1pbmcgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlTmFtaW5nKFN0cmluZyB1c2VOYW1pbmcpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMudXNlTmFtaW5nID0gdXNlTmFtaW5nOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBXb3JraW5nIERpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFdvcmtEaXIoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy53b3JrRGlyOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXb3JrRGlyKFN0cmluZyB3b3JrRGlyKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLndvcmtEaXIgPSB3b3JrRGlyOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2FkZXIgY2hlY2sgaW50ZXJ2YWwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMZHJDaGVja0ludGVydmFsKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMubGRyQ2hlY2tJbnRlcnZhbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9hZGVyIENoZWNrIEludGVydmFsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExkckNoZWNrSW50ZXJ2YWwoU3RyaW5nIGxkckNoZWNrSW50ZXJ2YWwpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMubGRyQ2hlY2tJbnRlcnZhbCA9IGxkckNoZWNrSW50ZXJ2YWw7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvYWRlciByZWxvYWRhYmxlIGJvb2xlYW4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMZHJSZWxvYWRhYmxlKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMubGRyUmVsb2FkYWJsZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9hZGVyIHJlbG9hZGFibGUgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGRyUmVsb2FkYWJsZShTdHJpbmcgbGRyUmVsb2FkYWJsZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5sZHJSZWxvYWRhYmxlID0gbGRyUmVsb2FkYWJsZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2Vzc2lvbiBtYW5hZ2VyIGNoZWNrIGludGVydmFsLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWdyQ2hlY2tJbnRlcnZhbCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLm1nckNoZWNrSW50ZXJ2YWw7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlc3Npb24gbWFuYWdlciBDaGVjayBJbnRlcnZhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZ3JDaGVja0ludGVydmFsKFN0cmluZyBtZ3JDaGVja0ludGVydmFsKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLm1nckNoZWNrSW50ZXJ2YWwgPSBtZ3JDaGVja0ludGVydmFsOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXNzaW9uIElEIGluaXRpYWxpemVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWdyU2Vzc2lvbklESW5pdCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLm1nclNlc3Npb25JREluaXQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1nciBTZXNzaW9uIElEIEluaXRpemlhbGl6ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWdyU2Vzc2lvbklESW5pdChTdHJpbmcgbWdyU2Vzc2lvbklESW5pdCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5tZ3JTZXNzaW9uSURJbml0ID0gbWdyU2Vzc2lvbklESW5pdDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU2Vzc2lvbiBtZ3IgbWF4aW11bSBhY3RpdmUgc2Vzc2lvbnMuCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRNZ3JNYXhTZXNzaW9ucygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLm1nck1heFNlc3Npb25zOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBTZXNzaW9uIG1nciBtYXhpbXVtIGFjdGl2ZSBzZXNzaW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZ3JNYXhTZXNzaW9ucyhTdHJpbmcgbWdyTWF4U2Vzc2lvbnMpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMubWdyTWF4U2Vzc2lvbnMgPSBtZ3JNYXhTZXNzaW9uczsKKyAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhbnRpIHJlc291Y2UgbG9ja2luZyBmbGFnCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBbnRpUmVzb3VyY2VMb2NraW5nKCkgeworICAgICAgICByZXR1cm4gYW50aVJlc291cmNlTG9ja2luZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFudGkgcmVzb3VyY2UgbG9ja2luZyBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW50aVJlc291cmNlTG9ja2luZyhTdHJpbmcgYXJsKSB7CisJYW50aVJlc291cmNlTG9ja2luZyA9IGFybDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYW50aSBqYXIgbG9ja2luZyBmbGFnCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBbnRpSmFyTG9ja2luZygpIHsKKyAgICAgICAgcmV0dXJuIGFudGlKYXJMb2NraW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYW50aSBqYXIgbG9ja2luZyBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW50aUphckxvY2tpbmcoU3RyaW5nIGFqbCkgeworICAgICAgICBhbnRpSmFyTG9ja2luZyA9IGFqbDsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5vYmplY3ROYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy5wYXJlbnRPYmplY3ROYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy5sb2FkZXJPYmplY3ROYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy5tYW5hZ2VyT2JqZWN0TmFtZSA9IG51bGw7CisgICAgICAgIAorICAgICAgICAvLyBjb250ZXh0IHByb3BlcnRpZXMKKyAgICAgICAgdGhpcy5jb29raWVzID0gImZhbHNlIjsKKyAgICAgICAgdGhpcy5jcm9zc0NvbnRleHQgPSAiZmFsc2UiOworICAgICAgICB0aGlzLmRvY0Jhc2UgPSBudWxsOworICAgICAgICB0aGlzLm92ZXJyaWRlPSAiZmFsc2UiOworICAgICAgICB0aGlzLnBhdGggPSBudWxsOworICAgICAgICB0aGlzLnJlbG9hZGFibGUgPSAiZmFsc2UiOworICAgICAgICB0aGlzLnN3YWxsb3dPdXRwdXQgPSAiZmFsc2UiOworICAgICAgICB0aGlzLmFudGlSZXNvdXJjZUxvY2tpbmcgPSAiZmFsc2UiOworICAgICAgICB0aGlzLmFudGlKYXJMb2NraW5nID0gImZhbHNlIjsKKworICAgICAgICAvLyBsb2FkZXIgcHJvcGVydGllcworICAgICAgICB0aGlzLmxkckNoZWNrSW50ZXJ2YWwgPSAiMTUiOworICAgICAgICB0aGlzLmxkclJlbG9hZGFibGUgPSAidHJ1ZSI7CisgICAgICAgIAorICAgICAgICAvLyBzZXNzaW9uIG1hbmFnZXIgcHJvcGVydGllcworICAgICAgICB0aGlzLm1nckNoZWNrSW50ZXJ2YWwgPSAiNjAiOworICAgICAgICB0aGlzLm1nclNlc3Npb25JREluaXQgPSAiMCI7CisgICAgICAgIHRoaXMubWdyTWF4U2Vzc2lvbnMgPSAiLTEiOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgdGhpcyBvYmplY3QgYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJDb250ZXh0Rm9ybVthZG1pbkFjdGlvbj0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGFkbWluQWN0aW9uKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsZG9jQmFzZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGRvY0Jhc2UpOworICAgICAgICBzYi5hcHBlbmQoIixwYXRoPSIpOworICAgICAgICBzYi5hcHBlbmQocGF0aCk7CisgICAgICAgIHNiLmFwcGVuZCgiLGNvb2tpZXM9Iik7CisgICAgICAgIHNiLmFwcGVuZChjb29raWVzKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsY3Jvc3NDb250ZXh0PSIpOworICAgICAgICBzYi5hcHBlbmQoY3Jvc3NDb250ZXh0KTsKKyAgICAgICAgc2IuYXBwZW5kKCIsb3ZlcnJpZGU9Iik7CisgICAgICAgIHNiLmFwcGVuZChvdmVycmlkZSk7CisgICAgICAgIHNiLmFwcGVuZCgiLHJlbG9hZGFibGU9Iik7CisgICAgICAgIHNiLmFwcGVuZChyZWxvYWRhYmxlKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsc3dhbGxvd091dHB1dD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHN3YWxsb3dPdXRwdXQpOworCisgICAgICAgIC8vIGxvYWRlciBwcm9wZXJ0aWVzCisgICAgICAgIHNiLmFwcGVuZCgiLGxkckNoZWNrSW50ZXJ2YWw9Iik7CisgICAgICAgIHNiLmFwcGVuZChsZHJDaGVja0ludGVydmFsKTsgICAgICAgIAorICAgICAgICBzYi5hcHBlbmQoIixsZHJSZWxvYWRhYmxlPSIpOworICAgICAgICBzYi5hcHBlbmQobGRyUmVsb2FkYWJsZSk7CisgICAgICAgIC8vIG1hbmFnZXIgcHJvcGVydGllcworICAgICAgICBzYi5hcHBlbmQoIixtZ3JDaGVja0ludGVydmFsPSIpOworICAgICAgICBzYi5hcHBlbmQobWdyQ2hlY2tJbnRlcnZhbCk7CisgICAgICAgIHNiLmFwcGVuZCgiLG1nclNlc3Npb25JREluaXQ9Iik7CisgICAgICAgIHNiLmFwcGVuZChtZ3JTZXNzaW9uSURJbml0KTsKKyAgICAgICAgc2IuYXBwZW5kKCIsbWdyTWF4U2Vzc2lvbnM9Iik7CisgICAgICAgIHNiLmFwcGVuZChtZ3JNYXhTZXNzaW9ucyk7CisgICAgICAgIC8vIG9iamVjdCBuYW1lcworICAgICAgICBzYi5hcHBlbmQoIicsb2JqZWN0TmFtZT0nIik7CisgICAgICAgIHNiLmFwcGVuZChvYmplY3ROYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHBhcmVudE9iamVjdE5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChwYXJlbnRPYmplY3ROYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLGxvYWRlck9iamVjdE5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChsb2FkZXJPYmplY3ROYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLG1hbmFnZXJPYmplY3ROYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQobWFuYWdlck9iamVjdE5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICAKKyAgICBwcml2YXRlIEFjdGlvbkVycm9ycyBlcnJvcnM7CisgICAgCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgCisgICAgICAgIC8vIGZyb250IGVuZCB2YWxpZGF0aW9uIHdoZW4gc2F2ZSBpcyBjbGlja2VkLgorICAgICAgICAgICAgCisgICAgICAgIC8vIGRvY0Jhc2UgY2Fubm90IGJlIG51bGwKKyAgICAgICAgaWYgKChkb2NCYXNlID09IG51bGwpIHx8IChkb2NCYXNlLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoImRvY0Jhc2UiLCBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IuZG9jQmFzZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gaWYgcGF0aCBpcyBlbXB0eSwgaXQncyByb290IGNvbnRleHQKKyAgICAgICAgLy8gdmFsaWRhdGUgY29udGV4dCBzdGFydGluZyB3aXRoICIvIiBvbmx5IGF0IHRoZSB0aW1lIG9mIGNvbnRleHQgY3JlYXRpb24uCisgICAgICAgIGlmICgiQ3JlYXRlIi5lcXVhbHNJZ25vcmVDYXNlKGFkbWluQWN0aW9uKSAmJiAhcGF0aC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoInBhdGgiLCBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IucGF0aC5wcmVmaXgiKSk7ICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gbG9hZGVyIHByb3BlcnRpZXMKKyAgICAgICAgLy8gRklYTUUtLSB2ZXJpZnkgaWYgdGhlc2UgcmFuZ2VzIGFyZSBvay4KKyAgICAgICAgbnVtYmVyQ2hlY2soImxkckNoZWNrSW50ZXJ2YWwiLCBsZHJDaGVja0ludGVydmFsICAsIHRydWUsIDAsIDEwMDAwKTsKKyAgICAgICAgCisgICAgICAgIC8vIHNlc3Npb24gbWFuYWdlciBwcm9wZXJ0aWVzICAgICAgICAgICAgCisgICAgICAgIG51bWJlckNoZWNrKCJtZ3JDaGVja0ludGVydmFsIiwgIG1nckNoZWNrSW50ZXJ2YWwsIHRydWUsIDAsIDEwMDAwKTsKKyAgICAgICAgbnVtYmVyQ2hlY2soIm1nck1heFNlc3Npb25zIiwgIG1nck1heFNlc3Npb25zLCBmYWxzZSwgLTEsIDEwMCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gZXJyb3JzOworICAgIH0KKyAgICAKKyAgICAvKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgdGhhdCBpdCBpcyBhIHJlcXVpcmVkIG51bWJlciBhbmQKKyAgICAgKiBpcyBhIHZhbGlkIGludGVnZXIgd2l0aGluIHRoZSBnaXZlbiByYW5nZS4gKG1pbiwgbWF4KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgZmllbGQgIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtIGZvciB3aGljaCB0aGlzIGVycm9yIG9jY3VyZWQuCisgICAgICogQHBhcmFtICBudW1UZXh0ICBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBudW1iZXIuCisgICAgICogQHBhcmFtIHJhbmdlQ2hlY2sgIEJvb2xlYW4gdmFsdWUgc2V0IHRvIHRydWUgb2YgcmVhbmdlIGNoZWNrIHNob3VsZCBiZSBwZXJmb3JtZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIG1pbiAgVGhlIGxvd2VyIGxpbWl0IG9mIHRoZSByYW5nZQorICAgICAqIEBwYXJhbSAgbWF4ICBUaGUgdXBwZXIgbGltaXQgb2YgdGhlIHJhbmdlCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgbnVtYmVyQ2hlY2soU3RyaW5nIGZpZWxkLCBTdHJpbmcgbnVtVGV4dCwgYm9vbGVhbiByYW5nZUNoZWNrLAorICAgIGludCBtaW4sIGludCBtYXgpIHsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIGZvciAnaXMgcmVxdWlyZWQnCisgICAgICAgIGlmICgobnVtVGV4dCA9PSBudWxsKSB8fCAobnVtVGV4dC5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKGZpZWxkLCBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IuIitmaWVsZCsiLnJlcXVpcmVkIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBjaGVjayBmb3IgJ211c3QgYmUgYSBudW1iZXInIGluIHRoZSAndmFsaWQgcmFuZ2UnCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludCBudW0gPSBJbnRlZ2VyLnBhcnNlSW50KG51bVRleHQpOworICAgICAgICAgICAgICAgIC8vIHBlcmZvcm0gcmFuZ2UgY2hlY2sgb25seSBpZiByZXF1aXJlZAorICAgICAgICAgICAgICAgIGlmIChyYW5nZUNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgobnVtIDwgbWluKSB8fCAobnVtID4gbWF4ICkpCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci4iKyBmaWVsZCArIi5yYW5nZSIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoZmllbGQsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLiIrIGZpZWxkICsgIi5mb3JtYXQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29udGV4dC9Db250ZXh0c0Zvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb250ZXh0L0NvbnRleHRzRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOWY0MDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29udGV4dC9Db250ZXh0c0Zvcm0uamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb250ZXh0OworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciBkZWxldGluZyBjb250ZXh0cy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dHNGb3JtIGV4dGVuZHMgQWN0aW9uRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWVzIG9mIHRoZSBjb250ZXh0cyB0byBiZSBkZWxldGVkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRleHRzW10gPSBuZXcgU3RyaW5nWzBdOworCisgICAgcHVibGljIFN0cmluZ1tdIGdldENvbnRleHRzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuY29udGV4dHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRzKFN0cmluZyBjb250ZXh0c1tdKSB7CisgICAgICAgIHRoaXMuY29udGV4dHMgPSBjb250ZXh0czsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHRoaXMuY29udGV4dHMgPSBuZXcgU3RyaW5nWzBdOworCisgICAgfQorICAgICAgICAKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2NvbnRleHQvRGVsZXRlQ29udGV4dEFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2NvbnRleHQvRGVsZXRlQ29udGV4dEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjRhMjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29udGV4dC9EZWxldGVDb250ZXh0QWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29udGV4dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IHNldHMgdXAgPGVtPkRlbGV0ZSBDb250ZXh0czwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsZXRlQ29udGV4dEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBvYmplY3QgbmFtZSB0aGF0IGZvcm1zIHRoZSBiYXNpcyBvZiB0aGUgc2VhcmNoIHBhdHRlcm4KKyAgICAgICAgLy8gdG8gZ2V0IGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBjb250ZXh0cworICAgICAgICBTdHJpbmcgcGF0dGVybk9iamVjdCA9IG51bGw7CisgICAgICAgIAorICAgICAgICAvLyBTZXQgdXAgYSBmb3JtIGJlYW4gY29udGFpbmluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkCisgICAgICAgIC8vIG9iamVjdHMgdG8gYmUgZGVsZXRlZAorICAgICAgICBDb250ZXh0c0Zvcm0gY29udGV4dHNGb3JtID0gbmV3IENvbnRleHRzRm9ybSgpOworICAgICAgICBTdHJpbmcgc2VsZWN0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpOworICAgICAgICBpZiAoc2VsZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBjb250ZXh0c1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIGNvbnRleHRzWzBdID0gc2VsZWN0OworICAgICAgICAgICAgY29udGV4dHNGb3JtLnNldENvbnRleHRzKGNvbnRleHRzKTsKKyAgICAgICAgICAgIHBhdHRlcm5PYmplY3QgPSBzZWxlY3Q7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiY29udGV4dHNGb3JtIiwgY29udGV4dHNGb3JtKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gZ2V0IHRoZSBwYXJlbnQgaG9zdCBvYmplY3QgbmFtZQorICAgICAgICBTdHJpbmcgcGFyZW50ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhcmVudCIpOworICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBwYXR0ZXJuT2JqZWN0ID0gcGFyZW50OworICAgICAgICB9IAorICAgICAgICAKKyAgICAgICAgLy8gQWNjdW11bGF0ZSBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBjb250ZXh0cworICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgcG9uYW1lID0gbmV3IE9iamVjdE5hbWUocGF0dGVybk9iamVjdCk7CisgICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gcG9uYW1lLmdldERvbWFpbigpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihkb21haW4pOworICAgICAgICAgICAgc2IuYXBwZW5kKCI6ajJlZVR5cGU9V2ViTW9kdWxlLCoiKTsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgc2VhcmNoID0gbmV3IE9iamVjdE5hbWUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAvLyBnZXQgYWxsIGF2YWlsYWJsZSBjb250ZXh0cyBvbmx5IGZvciB0aGlzIGhvc3QKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZW1zID0KKyAgICAgICAgICAgICAgICBtQlNlcnZlci5xdWVyeU5hbWVzKHNlYXJjaCwgbnVsbCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIFN0cmluZyBpdGVtID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBob3N0ID0gcG9uYW1lLmdldEtleVByb3BlcnR5KCJob3N0Iik7CisgICAgICAgICAgICBpZiAoaG9zdD09bnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcG9uYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgICAgICAgICAgaWYgKChuYW1lICE9IG51bGwpICYmIChuYW1lLmxlbmd0aCgpID4gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIpOworICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IG5hbWUuaW5kZXhPZigiLyIpOworICAgICAgICAgICAgICAgICAgICBob3N0ID0gbmFtZS5zdWJzdHJpbmcoMCxpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgaG9zdFByZWZpeCA9ICIvLyIraG9zdDsKKyAgICAgICAgICAgIFN0cmluZyBob3N0QXR0ciA9IG51bGw7CisgICAgICAgICAgICB3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW1zLm5leHQoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShpdGVtKTsKKyAgICAgICAgICAgICAgICBob3N0QXR0ciA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgICAgICAgICAgaWYgKGhvc3RBdHRyLnN0YXJ0c1dpdGgoaG9zdFByZWZpeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoaXRlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5zZWxlY3QiKSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNlbGVjdCIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoImNvbnRleHRzTGlzdCIsIGxpc3QpOworICAgICAgICAKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgbGlzdCBkaXNwbGF5IHBhZ2UKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJDb250ZXh0cyIpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2NvbnRleHQvRGVsZXRlQ29udGV4dHNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb250ZXh0L0RlbGV0ZUNvbnRleHRzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxZmJhZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb250ZXh0L0RlbGV0ZUNvbnRleHRzQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29udGV4dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2w7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2xOb2RlOworCisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkRlbGV0ZSBDb250ZXh0czwvZW0+CisgKiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlbGV0ZUNvbnRleHRzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+cmVtb3ZlQ29udGV4dDwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlbW92ZUNvbnRleHRUeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgICAvLyBPYmplY3QgbmFtZQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRGVsZXRlIHRoZSBzcGVjaWZpZWQgQ29udGV4dHMKKyAgICAgICAgU3RyaW5nIGNvbnRleHRzW10gID0gKChDb250ZXh0c0Zvcm0pIGZvcm0pLmdldENvbnRleHRzKCk7CisgICAgICAgIFN0cmluZyB2YWx1ZXNbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSAicmVtb3ZlQ29udGV4dCI7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gTG9vayB1cCBvdXIgdHJlZSBjb250cm9sIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBUcmVlQ29udHJvbCBjb250cm9sID0gKFRyZWVDb250cm9sKQorICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ0cmVlQ29udHJvbFRlc3QiKTsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgY29udGV4dHMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBjb250ZXh0c1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc2VsZWN0Tm9kZShudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIG5vZGUgPSBjb250cm9sLmZpbmROb2RlKGNvbnRleHRzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBmbmFtZSA9IFRvbWNhdFRyZWVCdWlsZGVyLmdldE1CZWFuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCByZW1vdmVDb250ZXh0VHlwZXMpOworICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZygiTWlzc2luZyBUcmVlQ29udHJvbE5vZGUgZm9yICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0c1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKCJNaXNzaW5nIFRyZWVDb250cm9sIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoaXMgdHJhbnNhY3Rpb24KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFN1Y2Nlc3NmdWwiKSk7CisKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29udGV4dC9FZGl0Q29udGV4dEFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2NvbnRleHQvRWRpdENvbnRleHRBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGU2NjdjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2NvbnRleHQvRWRpdENvbnRleHRBY3Rpb24uamF2YQpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29udGV4dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MaXN0czsKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IHNldHMgdXAgPGVtPkVkaXQgQ29udGV4dDwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRWRpdENvbnRleHRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgIAorCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBvYmplY3QgbmFtZXMgb2YgdGhlIE1CZWFucyB3ZSBhcmUgbWFuaXB1bGF0aW5nCisgICAgICAgIC8vIENvbnRleHQgbUJlYW4KKyAgICAgICAgT2JqZWN0TmFtZSBjbmFtZSA9IG51bGw7CisgICAgICAgIC8vIExvYWRlciBtQmVhbgorICAgICAgICBPYmplY3ROYW1lIGxuYW1lID0gbnVsbDsKKyAgICAgICAgLy8gTWFuYWdlciBtQmVhbiAKKyAgICAgICAgT2JqZWN0TmFtZSBtbmFtZSA9IG51bGw7CisgICAgICAgIAorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY25hbWUgPSBuZXcgT2JqZWN0TmFtZShyZXF1ZXN0LmdldFBhcmFtZXRlcigic2VsZWN0IikpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgImVycm9yLmNvbnRleHROYW1lLmJhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpKTsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cobWVzc2FnZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBuYW1lID0gY25hbWUuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIpOworICAgICAgICBpbnQgaSA9IG5hbWUuaW5kZXhPZigiLyIpOworICAgICAgICBTdHJpbmcgaG9zdCA9IG5hbWUuc3Vic3RyaW5nKDAsaSk7CisgICAgICAgIFN0cmluZyBwYXRoID0gbmFtZS5zdWJzdHJpbmcoaSk7CisgICAgICAgIC8vIEdldCB0aGUgY29ycmVzcG9uZGluZyBsb2FkZXIKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihjbmFtZS5nZXREb21haW4oKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjp0eXBlPUxvYWRlciIpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIscGF0aD0iK3BhdGgpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIsaG9zdD0iK2hvc3QpOworICAgICAgICAgICAgbG5hbWUgPSBuZXcgT2JqZWN0TmFtZShzYi50b1N0cmluZygpKTsKKyAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAiZXJyb3IubWFuYWdlck5hbWUuYmFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZyhtZXNzYWdlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULCBtZXNzYWdlKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXNzaW9uIG1hbmFnZXIgcHJvcGVydGllcworICAgICAgICAvLyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgU2Vzc2lvbiBNYW5hZ2VyIG1CZWFuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoY25hbWUuZ2V0RG9tYWluKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI6dHlwZT1NYW5hZ2VyIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoIixwYXRoPSIrcGF0aCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIixob3N0PSIraG9zdCk7CisgICAgICAgICAgICBtbmFtZSA9IG5ldyBPYmplY3ROYW1lKHNiLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKCJlcnJvci5tYW5hZ2VyTmFtZS5iYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbGwgaW4gdGhlIGZvcm0gdmFsdWVzIGZvciBkaXNwbGF5IGFuZCBlZGl0aW5nCisgICAgICAgIENvbnRleHRGb3JtIGNvbnRleHRGbSA9IG5ldyBDb250ZXh0Rm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgiY29udGV4dEZvcm0iLCBjb250ZXh0Rm0pOworICAgICAgICBjb250ZXh0Rm0uc2V0QWRtaW5BY3Rpb24oIkVkaXQiKTsKKyAgICAgICAgY29udGV4dEZtLnNldE9iamVjdE5hbWUoY25hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIGNvbnRleHRGbS5zZXRMb2FkZXJPYmplY3ROYW1lKGxuYW1lLnRvU3RyaW5nKCkpOworICAgICAgICBjb250ZXh0Rm0uc2V0TWFuYWdlck9iamVjdE5hbWUobW5hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBzYi5hcHBlbmQocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAic2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuY29udGV4dCIpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIgKCIpOworICAgICAgICBzYi5hcHBlbmQocGF0aCk7CisgICAgICAgIHNiLmFwcGVuZCgiKSIpOworICAgICAgICBjb250ZXh0Rm0uc2V0Tm9kZUxhYmVsKHNiLnRvU3RyaW5nKCkpOworICAgICAgICBjb250ZXh0Rm0uc2V0Qm9vbGVhblZhbHMoTGlzdHMuZ2V0Qm9vbGVhblZhbHVlcygpKTsKKyAgICAgICAKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIENvcHkgc2NhbGFyIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwYXRoIjsKKyAgICAgICAgICAgIGNvbnRleHRGbS5zZXRQYXRoCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29va2llcyI7CisgICAgICAgICAgICBjb250ZXh0Rm0uc2V0Q29va2llcworICAgICAgICAgICAgICAgICgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY3Jvc3NDb250ZXh0IjsKKyAgICAgICAgICAgIGNvbnRleHRGbS5zZXRDcm9zc0NvbnRleHQKKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImRvY0Jhc2UiOworICAgICAgICAgICAgY29udGV4dEZtLnNldERvY0Jhc2UKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ3b3JrRGlyIjsKKyAgICAgICAgICAgIGNvbnRleHRGbS5zZXRXb3JrRGlyCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlTmFtaW5nIjsKKyAgICAgICAgICAgIGNvbnRleHRGbS5zZXRVc2VOYW1pbmcKKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInJlbG9hZGFibGUiOworICAgICAgICAgICAgY29udGV4dEZtLnNldFJlbG9hZGFibGUKKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInN3YWxsb3dPdXRwdXQiOworICAgICAgICAgICAgY29udGV4dEZtLnNldFN3YWxsb3dPdXRwdXQKKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gIm92ZXJyaWRlIjsKKyAgICAgICAgICAgIGNvbnRleHRGbS5zZXRPdmVycmlkZQorICAgICAgICAgICAgICAgICgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicHJpdmlsZWdlZCI7CisgICAgICAgICAgICBjb250ZXh0Rm0uc2V0UHJpdmlsZWdlZAorICAgICAgICAgICAgICAgICgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisKKwkgICAgYXR0cmlidXRlID0gImFudGlKQVJMb2NraW5nIjsKKwkgICAgY29udGV4dEZtLnNldEFudGlKYXJMb2NraW5nCisJCSgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisJICAgIGF0dHJpYnV0ZSA9ICJhbnRpUmVzb3VyY2VMb2NraW5nIjsKKwkgICAgY29udGV4dEZtLnNldEFudGlSZXNvdXJjZUxvY2tpbmcKKwkJKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIC8vIGxvYWRlciBwcm9wZXJ0aWVzCisgICAgICAgICAgICAvL2F0dHJpYnV0ZSA9ICJjaGVja0ludGVydmFsIjsKKyAgICAgICAgICAgIC8vY29udGV4dEZtLnNldExkckNoZWNrSW50ZXJ2YWwKKyAgICAgICAgICAgIC8vICAgICgoKEludGVnZXIpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShsbmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicmVsb2FkYWJsZSI7CisgICAgICAgICAgICBjb250ZXh0Rm0uc2V0TGRyUmVsb2FkYWJsZQorICAgICAgICAgICAgICAgICgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZShsbmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIC8vIG1hbmFnZXIgcHJvcGVydGllcworICAgICAgICAgICAgYXR0cmlidXRlID0gImVudHJvcHkiOworICAgICAgICAgICAgY29udGV4dEZtLnNldE1nclNlc3Npb25JREluaXQKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKG1uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtYXhBY3RpdmVTZXNzaW9ucyI7CisgICAgICAgICAgICBjb250ZXh0Rm0uc2V0TWdyTWF4U2Vzc2lvbnMKKyAgICAgICAgICAgICAgICAoKChJbnRlZ2VyKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUobW5hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgLy9hdHRyaWJ1dGUgPSAiY2hlY2tJbnRlcnZhbCI7CisgICAgICAgICAgICAvL2NvbnRleHRGbS5zZXRNZ3JDaGVja0ludGVydmFsCisgICAgICAgICAgICAvLyAgICAoKChJbnRlZ2VyKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUobW5hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgY29udGV4dCBkaXNwbGF5IHBhZ2UKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJDb250ZXh0IikpOworICAgICAgICAKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2NvbnRleHQvU2F2ZUNvbnRleHRBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb250ZXh0L1NhdmVDb250ZXh0QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhODc0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb250ZXh0L1NhdmVDb250ZXh0QWN0aW9uLmphdmEKQEAgLTAsMCArMSw1MTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbnRleHQ7CisKKworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sTm9kZTsKKworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgY29tcGxldGVzIDxlbT5BZGQgQ29udGV4dDwvZW0+IGFuZAorICogPGVtPkVkaXQgQ29udGV4dDwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZUNvbnRleHRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFNpZ25hdHVyZSBmb3IgdGhlIDxjb2RlPmNyZWF0ZVN0YW5kYXJkQ29udGV4dDwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVN0YW5kYXJkQ29udGV4dFR5cGVzW10gPQorICAgIHsgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gcGFyZW50CisgICAgICAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBwYXRoCisgICAgICAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBkb2NCYXNlCisgICAgfTsKKworICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+Y3JlYXRlU3RhbmRhcmRMb2FkZXI8L2NvZGU+IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVTdGFuZGFyZExvYWRlclR5cGVzW10gPQorICAgIHsgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gcGFyZW50CisgICAgfTsKKworICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+Y3JlYXRlU3RhbmRhcmRNYW5hZ2VyPC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlU3RhbmRhcmRNYW5hZ2VyVHlwZXNbXSA9CisgICAgeyAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBwYXJlbnQKKyAgICB9OworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+cmVtb3ZlQ29udGV4dDwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlbW92ZUNvbnRleHRUeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgICAvLyBPYmplY3QgbmFtZQorICAgIH07CisgICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSByZXF1ZXN0ZWQgYWN0aW9uCisgICAgICAgIENvbnRleHRGb3JtIGNmb3JtID0gKENvbnRleHRGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgYWRtaW5BY3Rpb24gPSBjZm9ybS5nZXRBZG1pbkFjdGlvbigpOworICAgICAgICBTdHJpbmcgY09iamVjdE5hbWUgPSBjZm9ybS5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgIFN0cmluZyBsT2JqZWN0TmFtZSA9IGNmb3JtLmdldExvYWRlck9iamVjdE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIG1PYmplY3ROYW1lID0gY2Zvcm0uZ2V0TWFuYWdlck9iamVjdE5hbWUoKTsKKyAgICAgICAgaWYgKChjZm9ybS5nZXRQYXRoKCkgPT0gbnVsbCkgfHwgKGNmb3JtLmdldFBhdGgoKS5sZW5ndGgoKTwxKSkgeworICAgICAgICAgICAgY2Zvcm0uc2V0UGF0aCgiLyIpOworICAgICAgICB9CisgICAgICAgCisgICAgICAgIC8vIFBlcmZvcm0gYSAiQ3JlYXRlIENvbnRleHQiIHRyYW5zYWN0aW9uIChpZiByZXF1ZXN0ZWQpCisgICAgICAgIGlmICgiQ3JlYXRlIi5lcXVhbHMoYWRtaW5BY3Rpb24pKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSBudWxsOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlc1tdID0gbnVsbDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdHJ5IHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBwYXJlbnQgaG9zdCBuYW1lCisgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmVudE5hbWUgPSBjZm9ybS5nZXRQYXJlbnRPYmplY3ROYW1lKCk7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBob25hbWUgPSBuZXcgT2JqZWN0TmFtZShwYXJlbnROYW1lKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcmVxdWVzdGVkIGNvbnRleHQgbmFtZSBpcyB1bmlxdWUKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0TmFtZShob25hbWUuZ2V0RG9tYWluKCkgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ajJlZVR5cGU9V2ViTW9kdWxlLG5hbWU9Ly8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZm9ybS5nZXRQYXRoKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgc2V0IEoyRUVBcHBsaWNhdGlvbiBhbmQgSjJFRVNlcnZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixKMkVFQXBwbGljYXRpb249bm9uZSxKMkVFU2VydmVyPW5vbmUiKTsgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKG1CU2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQWN0aW9uTWVzc2FnZXMgZXJyb3JzID0gbmV3IEFjdGlvbk1lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImNvbnRleHROYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IuY29udGV4dE5hbWUuZXhpc3RzIikpOworICAgICAgICAgICAgICAgICAgICBzYXZlRXJyb3JzKHJlcXVlc3QsIGVycm9ycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEFjdGlvbkZvcndhcmQobWFwcGluZy5nZXRJbnB1dCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIExvb2sgdXAgb3VyIE1CZWFuRmFjdG9yeSBNQmVhbgorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgZm5hbWUgPSAKKyAgICAgICAgICAgICAgICAgICAgVG9tY2F0VHJlZUJ1aWxkZXIuZ2V0TUJlYW5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU3RhbmRhcmRDb250ZXh0IG9iamVjdAorICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBPYmplY3RbM107CisgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gcGFyZW50TmFtZTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMV0gPSBjZm9ybS5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgdmFsdWVzWzJdID0gY2Zvcm0uZ2V0RG9jQmFzZSgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJjcmVhdGVTdGFuZGFyZENvbnRleHQiOworICAgICAgICAgICAgICAgIGNPYmplY3ROYW1lID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuaW52b2tlKGZuYW1lLCBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIGNyZWF0ZVN0YW5kYXJkQ29udGV4dFR5cGVzKTsKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTG9hZGVyIG9iamVjdAorICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICAgICAgLy8gcGFyZW50IG9mIGxvYWRlciBpcyB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0CisgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gY09iamVjdE5hbWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAiY3JlYXRlV2ViYXBwTG9hZGVyIjsKKyAgICAgICAgICAgICAgICBsT2JqZWN0TmFtZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCBjcmVhdGVTdGFuZGFyZExvYWRlclR5cGVzKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFN0YW5kYXJkTWFuYWdlciBvYmplY3QKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgICAgIC8vIHBhcmVudCBvZiBtYW5hZ2VyIGlzIHRoZSBuZXdseSBjcmVhdGVkIENvbnRleHQKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBjT2JqZWN0TmFtZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJjcmVhdGVTdGFuZGFyZE1hbmFnZXIiOworICAgICAgICAgICAgICAgIG1PYmplY3ROYW1lID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuaW52b2tlKGZuYW1lLCBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIGNyZWF0ZVN0YW5kYXJkTWFuYWdlclR5cGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKG1PYmplY3ROYW1lPT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJyZW1vdmVMb2FkZXIiOworICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBsT2JqZWN0TmFtZTsKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuaW52b2tlKGZuYW1lLCBvcGVyYXRpb24sIHZhbHVlcywgCisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDb250ZXh0VHlwZXMpOworICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAicmVtb3ZlQ29udGV4dCI7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IGNPYmplY3ROYW1lOworICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwgdmFsdWVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNvbnRleHRUeXBlcyk7CisgICAgICAgICAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLnVucmVnaXN0ZXJDb21wb25lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdE5hbWUoY09iamVjdE5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIndhcm5pbmciLCAiZXJyb3IuY29udGV4dC5kaXJlY3RvcnkiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFVuc3VjY2Vzc2Z1bCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBuZXcgQ29udGV4dCB0byBvdXIgdHJlZSBjb250cm9sIG5vZGUKKyAgICAgICAgICAgICAgICBhZGRUb1RyZWVDb250cm9sTm9kZShvbmFtZSwgY09iamVjdE5hbWUsIHBhcmVudE5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLCBzZXNzaW9uLCBsb2NhbGUpOyAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbikpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhdHRyaWJ1dGUgdXBkYXRlcyBhcyByZXF1ZXN0ZWQKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgY29uYW1lID0gbmV3IE9iamVjdE5hbWUoY09iamVjdE5hbWUpOworICAgICAgICAgICAgT2JqZWN0TmFtZSBsb25hbWUgPSBuZXcgT2JqZWN0TmFtZShsT2JqZWN0TmFtZSk7CisgICAgICAgICAgICBPYmplY3ROYW1lIG1vbmFtZSA9IG5ldyBPYmplY3ROYW1lKG1PYmplY3ROYW1lKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInBhdGgiOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAiIjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGF0aCA9IGNmb3JtLmdldFBhdGgoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgcGF0aCA9ICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJwYXRoIiwgcGF0aCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAid29ya0RpciI7CisgICAgICAgICAgICBTdHJpbmcgd29ya0RpciA9ICIiOworICAgICAgICAgICAgd29ya0RpciA9IGNmb3JtLmdldFdvcmtEaXIoKTsKKyAgICAgICAgICAgIGlmICgod29ya0RpciE9bnVsbCkgJiYgKHdvcmtEaXIubGVuZ3RoKCk+PTEpKSB7CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJ3b3JrRGlyIiwgd29ya0RpcikpOworICAgICAgICAgICAgfQorIAorICAgICAgICAgICAgYXR0cmlidXRlID0gImNvb2tpZXMiOworICAgICAgICAgICAgU3RyaW5nIGNvb2tpZXMgPSAiZmFsc2UiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb29raWVzID0gY2Zvcm0uZ2V0Q29va2llcygpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBjb29raWVzID0gImZhbHNlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiY29va2llcyIsIG5ldyBCb29sZWFuKGNvb2tpZXMpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjcm9zc0NvbnRleHQiOworICAgICAgICAgICAgU3RyaW5nIGNyb3NzQ29udGV4dCA9ICJmYWxzZSI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNyb3NzQ29udGV4dCA9IGNmb3JtLmdldENyb3NzQ29udGV4dCgpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBjcm9zc0NvbnRleHQgPSAiZmFsc2UiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJjcm9zc0NvbnRleHQiLCBuZXcgQm9vbGVhbihjcm9zc0NvbnRleHQpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJvdmVycmlkZSI7CisgICAgICAgICAgICBTdHJpbmcgb3ZlcnJpZGUgPSAiZmFsc2UiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvdmVycmlkZSA9IGNmb3JtLmdldE92ZXJyaWRlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIG92ZXJyaWRlID0gImZhbHNlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgib3ZlcnJpZGUiLCBuZXcgQm9vbGVhbihvdmVycmlkZSkpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInByaXZpbGVnZWQiOworICAgICAgICAgICAgU3RyaW5nIHByaXZpbGVnZWQgPSAiZmFsc2UiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcml2aWxlZ2VkID0gY2Zvcm0uZ2V0UHJpdmlsZWdlZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBwcml2aWxlZ2VkID0gImZhbHNlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgicHJpdmlsZWdlZCIsIG5ldyBCb29sZWFuKHByaXZpbGVnZWQpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJyZWxvYWRhYmxlIjsKKyAgICAgICAgICAgIFN0cmluZyByZWxvYWRhYmxlID0gImZhbHNlIjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVsb2FkYWJsZSA9IGNmb3JtLmdldFJlbG9hZGFibGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgcmVsb2FkYWJsZSA9ICJmYWxzZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInJlbG9hZGFibGUiLCBuZXcgQm9vbGVhbihyZWxvYWRhYmxlKSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAic3dhbGxvd091dHB1dCI7CisgICAgICAgICAgICBTdHJpbmcgc3dhbGxvd091dHB1dCA9ICJmYWxzZSI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN3YWxsb3dPdXRwdXQgPSBjZm9ybS5nZXRTd2FsbG93T3V0cHV0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHN3YWxsb3dPdXRwdXQgPSAiZmFsc2UiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJzd2FsbG93T3V0cHV0IiwgbmV3IEJvb2xlYW4oc3dhbGxvd091dHB1dCkpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZU5hbWluZyI7CisgICAgICAgICAgICBTdHJpbmcgdXNlTmFtaW5nID0gImZhbHNlIjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdXNlTmFtaW5nID0gY2Zvcm0uZ2V0VXNlTmFtaW5nKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHVzZU5hbWluZyA9ICJmYWxzZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInVzZU5hbWluZyIsIG5ldyBCb29sZWFuKHVzZU5hbWluZykpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gImFudGlKQVJMb2NraW5nIjsKKyAgICAgICAgICAgIFN0cmluZyBhbnRpSmFyTG9ja2luZyA9IGNmb3JtLmdldEFudGlKYXJMb2NraW5nKCk7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImFudGlKQVJMb2NraW5nIiwgbmV3IEJvb2xlYW4oYW50aUphckxvY2tpbmcpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJhbnRpUmVzb3VyY2VMb2NraW5nIjsKKyAgICAgICAgICAgIFN0cmluZyBhbnRpUmVzb3VyY2VMb2NraW5nID0gY2Zvcm0uZ2V0QW50aVJlc291cmNlTG9ja2luZygpOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJhbnRpUmVzb3VyY2VMb2NraW5nIiwgbmV3IEJvb2xlYW4oYW50aVJlc291cmNlTG9ja2luZykpKTsKKworCSAgICAKKyAgICAgICAgICAgIC8vIExvYWRlciBwcm9wZXJ0aWVzICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicmVsb2FkYWJsZSI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlbG9hZGFibGUgPSBjZm9ybS5nZXRMZHJSZWxvYWRhYmxlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHJlbG9hZGFibGUgPSAiZmFsc2UiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGxvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJyZWxvYWRhYmxlIiwgbmV3IEJvb2xlYW4ocmVsb2FkYWJsZSkpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9hdHRyaWJ1dGUgPSAiY2hlY2tJbnRlcnZhbCI7CisgICAgICAgICAgICAvL2ludCBjaGVja0ludGVydmFsID0gMTU7CisgICAgICAgICAgICAvL3RyeSB7CisgICAgICAgICAgICAvLyAgICBjaGVja0ludGVydmFsID0gSW50ZWdlci5wYXJzZUludChjZm9ybS5nZXRMZHJDaGVja0ludGVydmFsKCkpOworICAgICAgICAgICAgLy99IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgLy8gICAgY2hlY2tJbnRlcnZhbCA9IDE1OworICAgICAgICAgICAgLy99CisgICAgICAgICAgICAvL21CU2VydmVyLnNldEF0dHJpYnV0ZShsb25hbWUsCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJjaGVja0ludGVydmFsIiwgbmV3IEludGVnZXIoY2hlY2tJbnRlcnZhbCkpKTsKKworICAgICAgICAgICAgLy8gTWFuYWdlciBwcm9wZXJ0aWVzICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZW50cm9weSI7CisgICAgICAgICAgICBTdHJpbmcgZW50cm9weSA9IGNmb3JtLmdldE1nclNlc3Npb25JREluaXQoKTsKKyAgICAgICAgICAgIGlmICgoZW50cm9weSE9bnVsbCkgJiYgKGVudHJvcHkubGVuZ3RoKCk+PTEpKSB7CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKG1vbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJlbnRyb3B5IixlbnRyb3B5KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vYXR0cmlidXRlID0gImNoZWNrSW50ZXJ2YWwiOworICAgICAgICAgICAgLy90cnkgeworICAgICAgICAgICAgLy8gICAgY2hlY2tJbnRlcnZhbCA9IEludGVnZXIucGFyc2VJbnQoY2Zvcm0uZ2V0TWdyQ2hlY2tJbnRlcnZhbCgpKTsKKyAgICAgICAgICAgIC8vfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIC8vICAgIGNoZWNrSW50ZXJ2YWwgPSA2MDsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgLy9tQlNlcnZlci5zZXRBdHRyaWJ1dGUobW9uYW1lLAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiY2hlY2tJbnRlcnZhbCIsIG5ldyBJbnRlZ2VyKGNoZWNrSW50ZXJ2YWwpKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtYXhBY3RpdmVTZXNzaW9ucyI7CisgICAgICAgICAgICBpbnQgbWF4QWN0aXZlU2Vzc2lvbnMgPSAtMTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWF4QWN0aXZlU2Vzc2lvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KGNmb3JtLmdldE1nck1heFNlc3Npb25zKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBtYXhBY3RpdmVTZXNzaW9ucyA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKG1vbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJtYXhBY3RpdmVTZXNzaW9ucyIsIG5ldyBJbnRlZ2VyKG1heEFjdGl2ZVNlc3Npb25zKSkpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzdWNjZXNzIHJlcG9ydGluZyBwYWdlCisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG1hcHBpbmcuZ2V0QXR0cmlidXRlKCkpOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEFwcGVuZCBub2RlcyBmb3IgYW55IGRlZmluZSByZXNvdXJjZXMgZm9yIHRoZSBzcGVjaWZpZWQgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXJOb2RlIENvbnRhaW5lciBub2RlIGZvciB0aGUgdHJlZSBjb250cm9sCisgICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgT2JqZWN0IG5hbWUgb2YgdGhlIHBhcmVudCBjb250YWluZXIKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSBNZXNzYWdlUmVzb3VyY2VzIGZvciBvdXIgbG9jYWxpemVkIG1lc3NhZ2VzCisgICAgICogIG1lc3NhZ2VzCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVG9UcmVlQ29udHJvbE5vZGUoT2JqZWN0TmFtZSBvbmFtZSwgU3RyaW5nIGNvbnRhaW5lck5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmVudE5hbWUsIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24sIExvY2FsZSBsb2NhbGUpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTdHJpbmcgZG9tYWluID0gb25hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgIFRyZWVDb250cm9sIGNvbnRyb2wgPSAoVHJlZUNvbnRyb2wpIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ0cmVlQ29udHJvbFRlc3QiKTsKKyAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHBhcmVudE5vZGUgPSBjb250cm9sLmZpbmROb2RlKHBhcmVudE5hbWUpOworICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gIkNvbnRleHQiOworICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gIiI7CisgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSAiIjsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgICAgICAgICAgaWYgKChuYW1lICE9IG51bGwpICYmIChuYW1lLmxlbmd0aCgpID4gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIpOworICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IG5hbWUuaW5kZXhPZigiLyIpOworICAgICAgICAgICAgICAgICAgICBob3N0ID0gbmFtZS5zdWJzdHJpbmcoMCxpKTsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG5hbWUuc3Vic3RyaW5nKGkpOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIG5vZGVMYWJlbCA9IAorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5jb250ZXh0IikgKyAKKyAgICAgICAgICAgICAgICAgICAgIiAoIiArIHBhdGggKyAiKSI7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kZWROYW1lID0gVVJMRW5jb2Rlci5lbmNvZGUob25hbWUudG9TdHJpbmcoKSxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpOworICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBjaGlsZE5vZGUgPSAKKyAgICAgICAgICAgICAgICAgICAgbmV3IFRyZWVDb250cm9sTm9kZShvbmFtZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZXh0LmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFZGl0Q29udGV4dC5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGRvbWFpbik7CisgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5hZGRDaGlsZChjaGlsZE5vZGUpOworICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSAtIGZvcmNlIGEgcmVkaXNwbGF5CisgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHN1YnRyZWUgPSBuZXcgVHJlZUNvbnRyb2xOb2RlCisgICAgICAgICAgICAgICAgICAgICgiQ29udGV4dCBSZXNvdXJjZSBBZG1pbmlzdHJhdGlvbiAiICsgY29udGFpbmVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgImZvbGRlcl8xNl9wYWQuZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLnRyZWVCdWlsZGVyLnN1YnRyZWVOb2RlIiksCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZG9tYWluKTsgICAgICAgIAorICAgICAgICAgICAgICAgIGNoaWxkTm9kZS5hZGRDaGlsZChzdWJ0cmVlKTsKKyAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgZGF0YXNvdXJjZXMgPSBuZXcgVHJlZUNvbnRyb2xOb2RlCisgICAgICAgICAgICAgICAgICAgICgiQ29udGV4dCBEYXRhIFNvdXJjZXMgIiArIGNvbnRhaW5lck5hbWUsCisgICAgICAgICAgICAgICAgICAgICJEYXRhc291cmNlLmdpZiIsCisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInJlc291cmNlcy50cmVlQnVpbGRlci5kYXRhc291cmNlcyIpLAorICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VzL2xpc3REYXRhU291cmNlcy5kbz9yZXNvdXJjZXR5cGU9IiArIAorICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0eXBlLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORykgKyAiJnBhdGg9IiArCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGgsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKSArICImaG9zdD0iICsgCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3QsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKSArICImZm9yd2FyZD0iICsKKyAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIkRhdGFTb3VyY2VzIExpc3QgU2V0dXAiLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyksCisgICAgICAgICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGRvbWFpbik7CisgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIG1haWxzZXNzaW9ucyA9IG5ldyBUcmVlQ29udHJvbE5vZGUKKyAgICAgICAgICAgICAgICAgICAgKCJDb250ZXh0IE1haWwgU2Vzc2lvbnMgIiArIGNvbnRhaW5lck5hbWUsCisgICAgICAgICAgICAgICAgICAgICJNYWlsc2Vzc2lvbi5naWYiLAorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMudHJlZUJ1aWxkZXIubWFpbHNlc3Npb25zIiksCisgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZXMvbGlzdE1haWxTZXNzaW9ucy5kbz9yZXNvdXJjZXR5cGU9IiArIAorICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0eXBlLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORykgKyAiJnBhdGg9IiArCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGgsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKSArICImaG9zdD0iICsgCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3QsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKSArICImZm9yd2FyZD0iICsKKyAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIk1haWxTZXNzaW9ucyBMaXN0IFNldHVwIixUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpLAorICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBkb21haW4pOworICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSByZXNvdXJjZWxpbmtzID0gbmV3IFRyZWVDb250cm9sTm9kZQorICAgICAgICAgICAgICAgICAgICAoIlJlc291cmNlIExpbmtzICIgKyBjb250YWluZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2VMaW5rLmdpZiIsCisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInJlc291cmNlcy50cmVlQnVpbGRlci5yZXNvdXJjZWxpbmtzIiksCisgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZXMvbGlzdFJlc291cmNlTGlua3MuZG8/cmVzb3VyY2V0eXBlPSIgKyAKKyAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodHlwZSxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpICsgIiZwYXRoPSIgKworICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORykgKyAiJmhvc3Q9IiArIAorICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0LFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORykgKyAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKCJSZXNvdXJjZUxpbmtzIExpc3QgU2V0dXAiLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyksCisgICAgICAgICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGRvbWFpbik7CisgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIGVudnMgPSBuZXcgVHJlZUNvbnRyb2xOb2RlCisgICAgICAgICAgICAgICAgICAgICgiQ29udGV4dCBFbnZpcm9ubWVudCBFbnRyaWVzICIrIGNvbnRhaW5lck5hbWUsCisgICAgICAgICAgICAgICAgICAgICJFbnZpcm9ubWVudEVudHJpZXMuZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlICwicmVzb3VyY2VzLmVudi5lbnRyaWVzIiksCisgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZXMvbGlzdEVudkVudHJpZXMuZG8/cmVzb3VyY2V0eXBlPSIgKyAKKyAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodHlwZSxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpICsgIiZwYXRoPSIgKworICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORykgKyAiJmhvc3Q9IiArIAorICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0LFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORykgKyAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKCJFbnZFbnRyaWVzIExpc3QgU2V0dXAiLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyksCisgICAgICAgICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGRvbWFpbik7CisgICAgICAgICAgICAgICAgc3VidHJlZS5hZGRDaGlsZChkYXRhc291cmNlcyk7CisgICAgICAgICAgICAgICAgc3VidHJlZS5hZGRDaGlsZChtYWlsc2Vzc2lvbnMpOworICAgICAgICAgICAgICAgIHN1YnRyZWUuYWRkQ2hpbGQocmVzb3VyY2VsaW5rcyk7CisgICAgICAgICAgICAgICAgc3VidHJlZS5hZGRDaGlsZChlbnZzKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgZmluZCBwYXJlbnQgbm9kZSAnIiArIHBhcmVudE5hbWUgKyAiJyIpOworICAgICAgICAgICAgfSAKKyAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZygiQ2Fubm90IGZpbmQgVHJlZUNvbnRyb2xOb2RlISIpOworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfSAgICAKKyAgICAgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vZmlsdGVycy9TZXRDaGFyYWN0ZXJFbmNvZGluZ0ZpbHRlci5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2ZpbHRlcnMvU2V0Q2hhcmFjdGVyRW5jb2RpbmdGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzQwYzhiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2ZpbHRlcnMvU2V0Q2hhcmFjdGVyRW5jb2RpbmdGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5maWx0ZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CisKKworLyoqCisgKiA8cD5FeGFtcGxlIGZpbHRlciB0aGF0IHNldHMgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSB1c2VkIGluIHBhcnNpbmcgdGhlCisgKiBpbmNvbWluZyByZXF1ZXN0LCBlaXRoZXIgdW5jb25kaXRpb25hbGx5IG9yIG9ubHkgaWYgdGhlIGNsaWVudCBkaWQgbm90CisgKiBzcGVjaWZ5IGEgY2hhcmFjdGVyIGVuY29kaW5nLiAgQ29uZmlndXJhdGlvbiBvZiB0aGlzIGZpbHRlciBpcyBiYXNlZCBvbgorICogdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzOjwvcD4KKyAqIDx1bD4KKyAqIDxsaT48c3Ryb25nPmVuY29kaW5nPC9zdHJvbmc+IC0gVGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSBjb25maWd1cmVkCisgKiAgICAgZm9yIHRoaXMgcmVxdWVzdCwgZWl0aGVyIGNvbmRpdGlvbmFsbHkgb3IgdW5jb25kaXRpb25hbGx5IGJhc2VkIG9uCisgKiAgICAgdGhlIDxjb2RlPmlnbm9yZTwvY29kZT4gaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyLiAgVGhpcyBwYXJhbWV0ZXIKKyAqICAgICBpcyByZXF1aXJlZCwgc28gdGhlcmUgaXMgbm8gZGVmYXVsdC48L2xpPgorICogPGxpPjxzdHJvbmc+aWdub3JlPC9zdHJvbmc+IC0gSWYgc2V0IHRvICJ0cnVlIiwgYW55IGNoYXJhY3RlciBlbmNvZGluZworICogICAgIHNwZWNpZmllZCBieSB0aGUgY2xpZW50IGlzIGlnbm9yZWQsIGFuZCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlCisgKiAgICAgPGNvZGU+c2VsZWN0RW5jb2RpbmcoKTwvY29kZT4gbWV0aG9kIGlzIHNldC4gIElmIHNldCB0byAiZmFsc2UsCisgKiAgICAgPGNvZGU+c2VsZWN0RW5jb2RpbmcoKTwvY29kZT4gaXMgY2FsbGVkIDxzdHJvbmc+b25seTwvc3Ryb25nPiBpZiB0aGUKKyAqICAgICBjbGllbnQgaGFzIG5vdCBhbHJlYWR5IHNwZWNpZmllZCBhbiBlbmNvZGluZy4gIEJ5IGRlZmF1bHQsIHRoaXMKKyAqICAgICBwYXJhbWV0ZXIgaXMgc2V0IHRvICJ0cnVlIi48L2xpPgorICogPC91bD4KKyAqCisgKiA8cD5BbHRob3VnaCB0aGlzIGZpbHRlciBjYW4gYmUgdXNlZCB1bmNoYW5nZWQsIGl0IGlzIGFsc28gZWFzeSB0bworICogc3ViY2xhc3MgaXQgYW5kIG1ha2UgdGhlIDxjb2RlPnNlbGVjdEVuY29kaW5nKCk8L2NvZGU+IG1ldGhvZCBtb3JlCisgKiBpbnRlbGxpZ2VudCBhYm91dCB3aGF0IGVuY29kaW5nIHRvIGNob29zZSwgYmFzZWQgb24gY2hhcmFjdGVyaXN0aWNzIG9mCisgKiB0aGUgaW5jb21pbmcgcmVxdWVzdCAoc3VjaCBhcyB0aGUgdmFsdWVzIG9mIHRoZSA8Y29kZT5BY2NlcHQtTGFuZ3VhZ2U8L2NvZGU+CisgKiBhbmQgPGNvZGU+VXNlci1BZ2VudDwvY29kZT4gaGVhZGVycywgb3IgYSB2YWx1ZSBzdGFzaGVkIGluIHRoZSBjdXJyZW50CisgKiB1c2VyJ3Mgc2Vzc2lvbi48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZXRDaGFyYWN0ZXJFbmNvZGluZ0ZpbHRlciBpbXBsZW1lbnRzIEZpbHRlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gc2V0IGZvciByZXF1ZXN0cyB0aGF0IHBhc3MgdGhyb3VnaAorICAgICAqIHRoaXMgZmlsdGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZW5jb2RpbmcgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdlIGFyZSBhc3NvY2lhdGVkIHdpdGguICBJZiB0aGlzIHZhbHVlCisgICAgICogaXMgbnVsbCwgdGhpcyBmaWx0ZXIgaW5zdGFuY2UgaXMgbm90IGN1cnJlbnRseSBjb25maWd1cmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIGEgY2hhcmFjdGVyIGVuY29kaW5nIHNwZWNpZmllZCBieSB0aGUgY2xpZW50IGJlIGlnbm9yZWQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlID0gdHJ1ZTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFRha2UgdGhpcyBmaWx0ZXIgb3V0IG9mIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKworICAgICAgICB0aGlzLmVuY29kaW5nID0gbnVsbDsKKyAgICAgICAgdGhpcy5maWx0ZXJDb25maWcgPSBudWxsOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgYW5kIHNldCAoaWYgc3BlY2lmaWVkKSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIGJlIHVzZWQgdG8KKyAgICAgKiBpbnRlcnByZXQgcmVxdWVzdCBwYXJhbWV0ZXJzIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3VsdCBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKiBAcGFyYW0gY2hhaW4gVGhlIGZpbHRlciBjaGFpbiB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyQ2hhaW4gY2hhaW4pCisJdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDb25kaXRpb25hbGx5IHNlbGVjdCBhbmQgc2V0IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgdXNlZAorICAgICAgICBpZiAoaWdub3JlIHx8IChyZXF1ZXN0LmdldENoYXJhY3RlckVuY29kaW5nKCkgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZyA9IHNlbGVjdEVuY29kaW5nKHJlcXVlc3QpOworICAgICAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRDaGFyYWN0ZXJFbmNvZGluZyhlbmNvZGluZyk7CisgICAgICAgIH0KKworCS8vIFBhc3MgY29udHJvbCBvbiB0byB0aGUgbmV4dCBmaWx0ZXIKKyAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQbGFjZSB0aGlzIGZpbHRlciBpbnRvIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyQ29uZmlnIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworCXRoaXMuZmlsdGVyQ29uZmlnID0gZmlsdGVyQ29uZmlnOworICAgICAgICB0aGlzLmVuY29kaW5nID0gZmlsdGVyQ29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImVuY29kaW5nIik7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGZpbHRlckNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJpZ25vcmUiKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICB0aGlzLmlnbm9yZSA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkKKyAgICAgICAgICAgIHRoaXMuaWdub3JlID0gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgieWVzIikpCisgICAgICAgICAgICB0aGlzLmlnbm9yZSA9IHRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMuaWdub3JlID0gZmFsc2U7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgYW4gYXBwcm9wcmlhdGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIGJlIHVzZWQsIGJhc2VkIG9uIHRoZQorICAgICAqIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgY3VycmVudCByZXF1ZXN0IGFuZC9vciBmaWx0ZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgKiBwYXJhbWV0ZXJzLiAgSWYgbm8gY2hhcmFjdGVyIGVuY29kaW5nIHNob3VsZCBiZSBzZXQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHVuY29uZGl0aW9uYWxseSByZXR1cm5zIHRoZSB2YWx1ZSBjb25maWd1cmVkCisgICAgICogYnkgdGhlIDxzdHJvbmc+ZW5jb2Rpbmc8L3N0cm9uZz4gaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIGZvciB0aGlzCisgICAgICogZmlsdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc2VsZWN0RW5jb2RpbmcoU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5lbmNvZGluZyk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvQWRkQWxpYXNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0FkZEFsaWFzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliZDZlOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0FkZEFsaWFzQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5BZGQgQWxpYXM8L2VtPiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEFkZEFsaWFzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorCisgICAgICAgIC8vIHRoZSBob3N0IE5hbWUgaXMgbmVlZGVkIHRvIHJldHJpZXZlIHRoZSBleGlzdGluZyBhbGlhc2VzCisgICAgICAgIC8vIGFuZCBhZGQgbmV3IGFsaWFzZXMgdG8KKyAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImhvc3ROYW1lIik7CisgICAgICAgIC8vIEZpbGwgaW4gdGhlIGZvcm0gdmFsdWVzIGZvciBkaXNwbGF5IGFuZCBlZGl0aW5nCisgICAgICAgIEFsaWFzRm9ybSBhbGlhc0ZtID0gbmV3IEFsaWFzRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgiYWxpYXNGb3JtIiwgYWxpYXNGbSk7CisgICAgICAgIAorICAgICAgICAvLyByZXRyaWV2ZSBhbGwgYWxpYXNlcworICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgaG5hbWUgPSBuZXcgT2JqZWN0TmFtZShob3N0TmFtZSk7CisKKyAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJmaW5kQWxpYXNlcyI7CisgICAgICAgICAgICBTdHJpbmcgYWxpYXNlc1tdID0gCisgICAgICAgICAgICAgICAgKFN0cmluZ1tdKSBtQlNlcnZlci5pbnZva2UoaG5hbWUsIG9wZXJhdGlvbiwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFsaWFzRm0uc2V0QWxpYXNWYWxzKG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChhbGlhc2VzKSkpOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYWxpYXNGbS5zZXRBbGlhc05hbWUoIiIpOworICAgICAgICBhbGlhc0ZtLnNldEhvc3ROYW1lKGhvc3ROYW1lKTsKKworICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBob3N0IGRpc3BsYXkgcGFnZQorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkFsaWFzIikpOworICAgICAgICAKKyAgICB9CisgICAgICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvQWRkSG9zdEFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvQWRkSG9zdEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YjMwYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9BZGRIb3N0QWN0aW9uLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uaG9zdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5BZGQgSG9zdDwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQWRkSG9zdEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKworICAgICAgICAvLyB0aGUgc2VydmljZSBOYW1lIGlzIG5lZWRlZCB0byByZXRyaWV2ZSB0aGUgZW5naW5lIG1CZWFuIHRvCisgICAgICAgIC8vIHdoaWNoIHRoZSBuZXcgaG9zdCBtQmVhbiB3aWxsIGJlIGFkZGVkLgorICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic2VsZWN0Iik7CisKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgZm9ybSB2YWx1ZXMgZm9yIGRpc3BsYXkgYW5kIGVkaXRpbmcKKyAgICAgICAgSG9zdEZvcm0gaG9zdEZtID0gbmV3IEhvc3RGb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJob3N0Rm9ybSIsIGhvc3RGbSk7CisgICAgICAgIGhvc3RGbS5zZXRBZG1pbkFjdGlvbigiQ3JlYXRlIik7CisgICAgICAgIGhvc3RGbS5zZXRPYmplY3ROYW1lKCIiKTsKKyAgICAgICAgaG9zdEZtLnNldEhvc3ROYW1lKCIiKTsKKyAgICAgICAgaG9zdEZtLnNldFNlcnZpY2VOYW1lKHNlcnZpY2VOYW1lKTsKKyAgICAgICAgaG9zdEZtLnNldEFwcEJhc2UoIiIpOworICAgICAgICBob3N0Rm0uc2V0QXV0b0RlcGxveSgidHJ1ZSIpOworICAgICAgICBob3N0Rm0uc2V0RGVwbG95WE1MKCJ0cnVlIik7CisgICAgICAgIGhvc3RGbS5zZXREZXBsb3lPblN0YXJ0dXAoInRydWUiKTsKKyAgICAgICAgaG9zdEZtLnNldFVucGFja1dBUnMoInRydWUiKTsgICAKKyAgICAgICAgaG9zdEZtLnNldFhtbE5hbWVzcGFjZUF3YXJlKCJmYWxzZSIpOworICAgICAgICBob3N0Rm0uc2V0WG1sVmFsaWRhdGlvbigiZmFsc2UiKTsKKyAgICAgICAgaG9zdEZtLnNldEJvb2xlYW5WYWxzKExpc3RzLmdldEJvb2xlYW5WYWx1ZXMoKSk7CisKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgaG9zdCBkaXNwbGF5IHBhZ2UKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJIb3N0IikpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0FsaWFzRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvQWxpYXNGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViMTRhMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0FsaWFzRm9ybS5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBhbGlhcyBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBbGlhc0Zvcm0gZXh0ZW5kcyBBY3Rpb25Gb3JtIHsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgaG9zdE5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdE5hbWUgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBhbGlhc05hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWxpYXNOYW1lID0gbnVsbDsKKworICAgIC8qCisgICAgICogUmVwcmVzZW50IGFsaWFzZXMgYXMgYSBMaXN0LgorICAgICAqLyAgICAKKyAgICBwcml2YXRlIExpc3QgYWxpYXNWYWxzID0gbnVsbDsKKyAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaG9zdCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdE5hbWUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5ob3N0TmFtZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgaG9zdCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvc3ROYW1lKFN0cmluZyBob3N0TmFtZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5ob3N0TmFtZSA9IGhvc3ROYW1lOworICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFsaWFzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBbGlhc05hbWUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5hbGlhc05hbWU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFsaWFzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxpYXNOYW1lKFN0cmluZyBhbGlhc05hbWUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuYWxpYXNOYW1lID0gYWxpYXNOYW1lOworICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExpc3Qgb2YgYWxpYXMgVmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRBbGlhc1ZhbHMoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5hbGlhc1ZhbHM7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFsaWFzIFZhbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxpYXNWYWxzKExpc3QgYWxpYXNWYWxzKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmFsaWFzVmFscyA9IGFsaWFzVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmFsaWFzTmFtZSA9IG51bGw7CisgICAgICAgIHRoaXMuaG9zdE5hbWUgPSBudWxsOworCisgICAgfQorICAgIAorICAgICAvKioKKyAgICAgKiBSZW5kZXIgdGhpcyBvYmplY3QgYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJBbGlhc0Zvcm1baG9zdE5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChob3N0TmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IGZyb20gdGhpcyBIVFRQIHJlcXVlc3QsCisgICAgICogYW5kIHJldHVybiBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbnkKKyAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBmb3VuZC4gIElmIG5vIGVycm9ycyBhcmUgZm91bmQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHdpdGggbm8KKyAgICAgKiByZWNvcmRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgIAorICAgICAgICAvLyBmcm9udCBlbmQgdmFsaWRhdGlvbiB3aGVuIHNhdmUgaXMgY2xpY2tlZC4KKyAgICAgICAgLy8gYWxpYXNOYW1lIGNhbm5vdCBiZSBudWxsCisgICAgICAgIGlmICgoYWxpYXNOYW1lPT0gbnVsbCkgfHwgKGFsaWFzTmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJhbGlhc05hbWUiLAorICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IuYWxpYXNOYW1lLnJlcXVpcmVkIikpOworICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIGVycm9yczsgICAgICAgCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvQWxpYXNlc0Zvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0FsaWFzZXNGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0NzZlYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0FsaWFzZXNGb3JtLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uaG9zdDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIGRlbGV0aW5nIGFsaWFzZXMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEFsaWFzZXNGb3JtIGV4dGVuZHMgQWN0aW9uRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWVzIG9mIHRoZSBhbGlhc2VzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWxpYXNlc1tdID0gbmV3IFN0cmluZ1swXTsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBbGlhc2VzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuYWxpYXNlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWxpYXNlcyhTdHJpbmcgYWxpYXNlc1tdKSB7CisgICAgICAgIHRoaXMuYWxpYXNlcyA9IGFsaWFzZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBob3N0TmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBob3N0TmFtZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGhvc3QgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3ROYW1lKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuaG9zdE5hbWU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGhvc3QgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3N0TmFtZShTdHJpbmcgaG9zdE5hbWUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuaG9zdE5hbWUgPSBob3N0TmFtZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHRoaXMuYWxpYXNlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIHRoaXMuaG9zdE5hbWUgPSBudWxsOyAgICAgICAgCisgICAgfQorICAgICAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0RlbGV0ZUFsaWFzQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9EZWxldGVBbGlhc0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYTM5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9EZWxldGVBbGlhc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworCitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgc2V0cyB1cCA8ZW0+RGVsZXRlIEFsaWFzZXM8L2VtPiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlbGV0ZUFsaWFzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKworICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFNldCB1cCBhIGZvcm0gYmVhbiBjb250YWluaW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKKyAgICAgICAgLy8gb2JqZWN0cyB0byBiZSBkZWxldGVkCisgICAgICAgIEFsaWFzZXNGb3JtIGFsaWFzZXNGbSA9IG5ldyBBbGlhc2VzRm9ybSgpOworICAgICAgICBBcnJheUxpc3QgYWxpYXNlc0xpc3QgPSBudWxsOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImhvc3ROYW1lIik7CisgICAgICAgIGFsaWFzZXNGbS5zZXRIb3N0TmFtZShob3N0TmFtZSk7CisgICAgICAgIAorICAgICAgICAvLyByZXRyaWV2ZSBhbGwgYWxpYXNlcworICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgaG5hbWUgPSBuZXcgT2JqZWN0TmFtZShob3N0TmFtZSk7CisKKyAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJmaW5kQWxpYXNlcyI7CisgICAgICAgICAgICBTdHJpbmcgYWxpYXNlc1tdID0gCisgICAgICAgICAgICAgICAgKFN0cmluZ1tdKSBtQlNlcnZlci5pbnZva2UoaG5hbWUsIG9wZXJhdGlvbiwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBhbGlhc2VzRm0uc2V0QWxpYXNlcyhhbGlhc2VzKTsKKyAgICAgICAgICAgIGFsaWFzZXNMaXN0ID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGFsaWFzZXMpKTsKKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChhbGlhc2VzTGlzdCk7ICAgICAgICAKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoImFsaWFzZXNGb3JtIiwgYWxpYXNlc0ZtKTsgICAgICAgIAorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiYWxpYXNlc0xpc3QiLCBhbGlhc2VzTGlzdCk7CisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBsaXN0IGRpc3BsYXkgcGFnZQorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkFsaWFzZXMiKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0RlbGV0ZUFsaWFzRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvRGVsZXRlQWxpYXNGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI2MWM5YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0RlbGV0ZUFsaWFzRm9ybS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSAiRGVsZXRlIEFsaWFzIiBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBEZWxldGVBbGlhc0Zvcm0gZXh0ZW5kcyBBY3Rpb25Gb3JtIHsKKyAgICAKKyAgLy8gTm8gZXh0ZW5zaW9ucyBuZWVkZWQKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0RlbGV0ZUFsaWFzZXNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0RlbGV0ZUFsaWFzZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjVhMzdiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvRGVsZXRlQWxpYXNlc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkRlbGV0ZSBBbGlhc2VzPC9lbT4KKyAqIHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsZXRlQWxpYXNlc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8qKgorICAgICAqIFNpZ25hdHVyZSBmb3IgdGhlIDxjb2RlPnJlbW92ZUFsaWFzPC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlQWxpYXNUeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgICAvLyBPYmplY3QgbmFtZQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEFsaWFzZXNGb3JtIGFsaWFzZXNGbSA9IChBbGlhc2VzRm9ybSkgZm9ybTsKKyAgICAgICAgLy8gdGhlIGhvc3QgTmFtZSBpcyBuZWVkZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBhbGlhc2VzIGZyb20KKyAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gYWxpYXNlc0ZtLmdldEhvc3ROYW1lKCk7CisgICAgICAgIAorICAgICAgICAvLyBEZWxldGUgdGhlIHNwZWNpZmllZCBBbGlhc2VzCisgICAgICAgIFN0cmluZyBhbGlhc2VzW10gID0gYWxpYXNlc0ZtLmdldEFsaWFzZXMoKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9ICJyZW1vdmVBbGlhcyI7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgT2JqZWN0TmFtZSBobmFtZSA9IG5ldyBPYmplY3ROYW1lKGhvc3ROYW1lKTsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaG9zdHMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxpYXNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IGFsaWFzZXNbaV07ICAgICAgICAgCisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuaW52b2tlKGhuYW1lLCBvcGVyYXRpb24sIHZhbHVlcywgcmVtb3ZlQWxpYXNUeXBlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGlzIHRyYW5zYWN0aW9uCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2F2ZSBTdWNjZXNzZnVsIikpOworCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvRGVsZXRlSG9zdEFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvRGVsZXRlSG9zdEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5Yjc1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9EZWxldGVIb3N0QWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uaG9zdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MaXN0czsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IHNldHMgdXAgPGVtPkRlbGV0ZSBIb3N0czwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsZXRlSG9zdEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBTZXQgdXAgYSBmb3JtIGJlYW4gY29udGFpbmluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkCisgICAgICAgIC8vIG9iamVjdHMgdG8gYmUgZGVsZXRlZAorICAgICAgICBIb3N0c0Zvcm0gaG9zdHNGb3JtID0gbmV3IEhvc3RzRm9ybSgpOworICAgICAgICBTdHJpbmcgc2VsZWN0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpOworICAgICAgICBTdHJpbmcgZG9tYWluID0gbnVsbDsKKyAgICAgICAgaWYgKHNlbGVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgaG9zdHNbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICBob3N0c1swXSA9IHNlbGVjdDsKKyAgICAgICAgICAgIGhvc3RzRm9ybS5zZXRIb3N0cyhob3N0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZG9tYWluID0gKG5ldyBPYmplY3ROYW1lKHNlbGVjdCkpLmdldERvbWFpbigpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiRXJyb3IgZXh0cmFjdGluZyBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgaG9zdCB0byBiZSBkZWxldGVkIiwgZSk7CisgICAgICAgICAgICB9ICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgYWRtaW5Ib3N0ID0gbnVsbDsKKyAgICAgICAgLy8gR2V0IHRoZSBob3N0IG5hbWUgdGhlIGFkbWluIGFwcCBydW5zIG9uCisgICAgICAgIC8vIHRoaXMgaG9zdCBjYW5ub3QgYmUgZGVsZXRlZCBmcm9tIHRoZSBhZG1pbiB0b29sCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhZG1pbkhvc3QgPSBMaXN0cy5nZXRBZG1pbkFwcEhvc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIsICJkb21haW4iICxyZXF1ZXN0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJlcnJvci5ob3N0TmFtZS5iYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkbWluSG9zdCk7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiYWRtaW5BcHBIb3N0IiwgYWRtaW5Ib3N0KTsgICAgICAgCisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJob3N0c0Zvcm0iLCBob3N0c0Zvcm0pOworICAgICAgICAKKyAgICAgICAgLy8gQWNjdW11bGF0ZSBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBob3N0cworICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gZG9tYWluICsgVG9tY2F0VHJlZUJ1aWxkZXIuSE9TVF9UWVBFICsKKyAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5XSUxEQ0FSRDsgICAgICAgICAKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZW1zID0KKyAgICAgICAgICAgICAgICBtQlNlcnZlci5xdWVyeU5hbWVzKG5ldyBPYmplY3ROYW1lKHBhdHRlcm4pLCBudWxsKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZW1zLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0ZW1zLm5leHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2VsZWN0IikpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5zZWxlY3QiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCk7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJob3N0c0xpc3QiLCBsaXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGxpc3QgZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiSG9zdHMiKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0RlbGV0ZUhvc3RzQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9EZWxldGVIb3N0c0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYjVlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9EZWxldGVIb3N0c0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworCitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sTm9kZTsKKworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgY29tcGxldGVzIDxlbT5EZWxldGUgSG9zdHM8L2VtPgorICogdHJhbnNhY3Rpb25zLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBEZWxldGVIb3N0c0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8qKgorICAgICAqIFNpZ25hdHVyZSBmb3IgdGhlIDxjb2RlPnJlbW92ZUhvc3Q8L2NvZGU+IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZW1vdmVIb3N0VHlwZXNbXSA9CisgICAgeyAiamF2YS5sYW5nLlN0cmluZyIsICAgICAgLy8gT2JqZWN0IG5hbWUKKyAgICB9OworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgIAorICAgICAgICAvLyBEZWxldGUgdGhlIHNwZWNpZmllZCBIb3N0cworICAgICAgICBTdHJpbmcgaG9zdHNbXSAgPSAoKEhvc3RzRm9ybSkgZm9ybSkuZ2V0SG9zdHMoKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9ICJyZW1vdmVIb3N0IjsKKyAgICAgICAgCisgICAgICAgIGdldFNlcnZsZXQoKS5sb2coImVudGVyIERlbGV0ZUhvc3RzICIgKyBob3N0cyk7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gTG9vayB1cCBvdXIgdHJlZSBjb250cm9sIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBUcmVlQ29udHJvbCBjb250cm9sID0gKFRyZWVDb250cm9sKQorICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ0cmVlQ29udHJvbFRlc3QiKTsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaG9zdHMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaG9zdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBob3N0c1tpXTsKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKCJyZW1vdmUgaG9zdCAiICsgaG9zdHNbaV0pOworICAgICAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zZWxlY3ROb2RlKG51bGwpOworICAgICAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgbm9kZSA9IGNvbnRyb2wuZmluZE5vZGUoaG9zdHNbaV0pOworICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIGZuYW1lID0gVG9tY2F0VHJlZUJ1aWxkZXIuZ2V0TUJlYW5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIHJlbW92ZUhvc3RUeXBlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKCJNaXNzaW5nIFRyZWVDb250cm9sTm9kZSBmb3IgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2coIk1pc3NpbmcgVHJlZUNvbnRyb2wgYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhpcyB0cmFuc2FjdGlvbgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0VkaXRIb3N0QWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9FZGl0SG9zdEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Njg2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9FZGl0SG9zdEFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MaXN0czsKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IHNldHMgdXAgPGVtPkVkaXQgSG9zdDwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRWRpdEhvc3RBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB1cCB0aGUgb2JqZWN0IG5hbWVzIG9mIHRoZSBNQmVhbnMgd2UgYXJlIG1hbmlwdWxhdGluZworICAgICAgICBPYmplY3ROYW1lIGhuYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGhuYW1lID0gbmV3IE9iamVjdE5hbWUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJlcnJvci5ob3N0TmFtZS5iYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKSk7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIGFkbWluSG9zdCA9IG51bGw7CisgICAgICAgIFN0cmluZyBkb21haW4gPSBobmFtZS5nZXREb21haW4oKTsKKyAgICAgICAgLy8gR2V0IHRoZSBob3N0IG5hbWUgdGhlIGFkbWluIGFwcCBydW5zIG9uCisgICAgICAgIC8vIHRoaXMgaG9zdCBjYW5ub3QgYmUgZGVsZXRlZCBmcm9tIHRoZSBhZG1pbiB0b29sCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhZG1pbkhvc3QgPSBMaXN0cy5nZXRBZG1pbkFwcEhvc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIsIGRvbWFpbiAscmVxdWVzdCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAiZXJyb3IuaG9zdE5hbWUuYmFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG1pbkhvc3QpOworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZyhtZXNzYWdlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULCBtZXNzYWdlKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoImFkbWluQXBwSG9zdCIsIGFkbWluSG9zdCk7CisKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgZm9ybSB2YWx1ZXMgZm9yIGRpc3BsYXkgYW5kIGVkaXRpbmcKKyAgICAgICAgSG9zdEZvcm0gaG9zdEZtID0gbmV3IEhvc3RGb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJob3N0Rm9ybSIsIGhvc3RGbSk7CisgICAgICAgIGhvc3RGbS5zZXRBZG1pbkFjdGlvbigiRWRpdCIpOworICAgICAgICBob3N0Rm0uc2V0T2JqZWN0TmFtZShobmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5ob3N0IikpOworICAgICAgICBzYi5hcHBlbmQoIiAoIik7CisgICAgICAgIHNiLmFwcGVuZChobmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIpIik7CisgICAgICAgIGhvc3RGbS5zZXROb2RlTGFiZWwoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIGhvc3RGbS5zZXRCb29sZWFuVmFscyhMaXN0cy5nZXRCb29sZWFuVmFsdWVzKCkpOworCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBDb3B5IHNjYWxhciBwcm9wZXJ0aWVzCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAibmFtZSI7CisgICAgICAgICAgICBob3N0Rm0uc2V0SG9zdE5hbWUKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGhuYW1lLCBhdHRyaWJ1dGUpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gImFwcEJhc2UiOworICAgICAgICAgICAgaG9zdEZtLnNldEFwcEJhc2UKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGhuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJhdXRvRGVwbG95IjsKKyAgICAgICAgICAgIGhvc3RGbS5zZXRBdXRvRGVwbG95CisgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGhuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkZXBsb3lYTUwiOworICAgICAgICAgICAgaG9zdEZtLnNldERlcGxveVhNTAorICAgICAgICAgICAgICAgICgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZShobmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZGVwbG95T25TdGFydHVwIjsKKyAgICAgICAgICAgIGhvc3RGbS5zZXREZXBsb3lPblN0YXJ0dXAKKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoaG5hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1bnBhY2tXQVJzIjsKKyAgICAgICAgICAgIGhvc3RGbS5zZXRVbnBhY2tXQVJzCisgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGhuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ4bWxOYW1lc3BhY2VBd2FyZSI7CisgICAgICAgICAgICBob3N0Rm0uc2V0WG1sTmFtZXNwYWNlQXdhcmUKKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoaG5hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInhtbFZhbGlkYXRpb24iOworICAgICAgICAgICAgaG9zdEZtLnNldFhtbFZhbGlkYXRpb24KKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoaG5hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJldHJpZXZlIGFsbCBhbGlhc2VzCisgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3BlcmF0aW9uID0gImZpbmRBbGlhc2VzIjsKKyAgICAgICAgICAgIFN0cmluZyBhbGlhc2VzW10gPQorICAgICAgICAgICAgICAgIChTdHJpbmdbXSkgbUJTZXJ2ZXIuaW52b2tlKGhuYW1lLCBvcGVyYXRpb24sIG51bGwsIG51bGwpOworCisgICAgICAgICAgICBob3N0Rm0uc2V0QWxpYXNWYWxzKG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChhbGlhc2VzKSkpOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGhvc3QgZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiSG9zdCIpKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0hvc3RGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9Ib3N0Rm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxM2U4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9Ib3N0Rm9ybS5qYXZhCkBAIC0wLDAgKzEsNDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBob3N0IHBhZ2UuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEhvc3RGb3JtIGV4dGVuZHMgQWN0aW9uRm9ybSB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFkbWluQWN0aW9uID0gIkVkaXQiOworCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lIG9mIHRoaXMgSG9zdCBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBvYmplY3ROYW1lID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgbm9kZSBsYWJlbC4gVGhpcyBpcyBvZiB0aGUgZm9ybSAnSG9zdChuYW1lKScKKyAgICAgKiBhbmQgaXMgcGlja2VkIHVwIGZyb20gdGhlIG5vZGUgb2YgdGhlIHRyZWUgdGhhdCBpcyBjbGlja2VkIG9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5vZGVMYWJlbCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGhvc3ROYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGhvc3ROYW1lID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZSBvZiB0aGUgc2VydmljZSB0aGlzIGhvc3QgYmVsb25ncyB0by4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IGZvciB0aGUgYXBwQmFzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhcHBCYXNlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEJvb2xlYW4gZm9yIGF1dG9EZXBsb3kuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0b0RlcGxveSA9ICJ0cnVlIjsKKworICAgIC8qKgorICAgICAqIEJvb2xlYW4gZm9yIGRlcGxveVhNTC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZXBsb3lYTUwgPSAidHJ1ZSI7CisKKyAgICAvKioKKyAgICAgKiBCb29sZWFuIGZvciBkZXBsb3lPblN0YXJ0dXAuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVwbG95T25TdGFydHVwID0gInRydWUiOworICAgIAorICAgIC8qKgorICAgICAqIEJvb2xlYW4gZm9yIHVucGFjayBXQVJzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVucGFja1dBUnMgPSAiZmFsc2UiOworCisgICAgLyoKKyAgICAgKiBSZXByZXNlbnQgYm9vbGVhbiAodHJ1ZSwgZmFsc2UpIHZhbHVlcyBmb3IgdW5wYWNrV0FScyBldGMuCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0IGJvb2xlYW5WYWxzID0gbnVsbDsKKworICAgIC8qCisgICAgICogUmVwcmVzZW50IGFsaWFzZXMgYXMgYSBMaXN0LgorICAgICAqLworICAgIHByaXZhdGUgTGlzdCBhbGlhc1ZhbHMgPSBudWxsOworCisgICAgLyoqCisgICAgICogQm9vbGVhbiBmb3IgeG1sTmFtZXNwYWNlQXdhcmUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgeG1sTmFtZXNwYWNlQXdhcmUgPSAiZmFsc2UiOworCisgICAgLyoqCisgICAgICogQm9vbGVhbiBmb3IgeG1sVmFsaWRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB4bWxWYWxpZGF0aW9uID0gImZhbHNlIjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWRtaW5BY3Rpb24oKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRtaW5BY3Rpb247CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWRtaW5pc3RyYXRpdmUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9ybS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZG1pbkFjdGlvbihTdHJpbmcgYWRtaW5BY3Rpb24pIHsKKworICAgICAgICB0aGlzLmFkbWluQWN0aW9uID0gYWRtaW5BY3Rpb247CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBIb3N0IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPYmplY3ROYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLm9iamVjdE5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIEhvc3QgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3ROYW1lKFN0cmluZyBvYmplY3ROYW1lKSB7CisKKyAgICAgICAgdGhpcy5vYmplY3ROYW1lID0gb2JqZWN0TmFtZTsKKworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIHNlcnZpY2UgdGhpcyBob3N0IGJlbG9uZ3MgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvYmplY3QgbmFtZSBvZiB0aGUgU2VydmljZSB0aGlzIGhvc3QgYmVsb25ncyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKKworICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxhYmVsIG9mIHRoZSBub2RlIHRoYXQgd2FzIGNsaWNrZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROb2RlTGFiZWwoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMubm9kZUxhYmVsOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBub2RlIGxhYmVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vZGVMYWJlbChTdHJpbmcgbm9kZUxhYmVsKSB7CisKKyAgICAgICAgdGhpcy5ub2RlTGFiZWwgPSBub2RlTGFiZWw7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGhvc3QgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3ROYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmhvc3ROYW1lOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBob3N0IG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SG9zdE5hbWUoU3RyaW5nIGhvc3ROYW1lKSB7CisKKyAgICAgICAgdGhpcy5ob3N0TmFtZSA9IGhvc3ROYW1lOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhcHBCYXNlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwQmFzZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5hcHBCYXNlOworCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXV0b0RlcGxveS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dG9EZXBsb3koKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5hdXRvRGVwbG95OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhdXRvRGVwbG95LgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEF1dG9EZXBsb3koU3RyaW5nIGF1dG9EZXBsb3kpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuYXV0b0RlcGxveSA9IGF1dG9EZXBsb3k7CisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVwbG95WE1MLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVwbG95WE1MKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuZGVwbG95WE1MOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXBsb3lYTUwuCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RGVwbG95WE1MKFN0cmluZyBkZXBsb3lYTUwpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuZGVwbG95WE1MID0gZGVwbG95WE1MOworICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlcGxveU9uU3RhcnR1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlcGxveU9uU3RhcnR1cCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmRlcGxveU9uU3RhcnR1cDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVwbG95T25TdGFydHVwLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldERlcGxveU9uU3RhcnR1cChTdHJpbmcgZGVwbG95T25TdGFydHVwKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmRlcGxveU9uU3RhcnR1cCA9IGRlcGxveU9uU3RhcnR1cDsKKyAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhcHBCYXNlLgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0QXBwQmFzZShTdHJpbmcgYXBwQmFzZSkgeworCisgICAgICAgIHRoaXMuYXBwQmFzZSA9IGFwcEJhc2U7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHVucGFja1dBUnMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVbnBhY2tXQVJzKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnVucGFja1dBUnM7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVucGFja1dBUnMuCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRVbnBhY2tXQVJzKFN0cmluZyB1bnBhY2tXQVJzKSB7CisKKyAgICAgICAgdGhpcy51bnBhY2tXQVJzID0gdW5wYWNrV0FSczsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYm9vbGVhblZhbHMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0Qm9vbGVhblZhbHMoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuYm9vbGVhblZhbHM7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJvb2xlYW5WYWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW5WYWxzKExpc3QgYm9vbGVhblZhbHMpIHsKKworICAgICAgICB0aGlzLmJvb2xlYW5WYWxzID0gYm9vbGVhblZhbHM7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExpc3Qgb2YgYWxpYXMgVmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRBbGlhc1ZhbHMoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuYWxpYXNWYWxzOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhbGlhcyBWYWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFsaWFzVmFscyhMaXN0IGFsaWFzVmFscykgeworCisgICAgICAgIHRoaXMuYWxpYXNWYWxzID0gYWxpYXNWYWxzOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB4bWxOYW1lc3BhY2VBd2FyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFhtbE5hbWVzcGFjZUF3YXJlKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnhtbE5hbWVzcGFjZUF3YXJlOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB4bWxOYW1lc3BhY2VBd2FyZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldFhtbE5hbWVzcGFjZUF3YXJlKFN0cmluZyB4bWxOYW1lc3BhY2VBd2FyZSkgeworCisgICAgICAgIHRoaXMueG1sTmFtZXNwYWNlQXdhcmUgPSB4bWxOYW1lc3BhY2VBd2FyZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgeG1sVmFsaWRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFhtbFZhbGlkYXRpb24oKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMueG1sVmFsaWRhdGlvbjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgeG1sVmFsaWRhdGlvbi4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldFhtbFZhbGlkYXRpb24oU3RyaW5nIHhtbFZhbGlkYXRpb24pIHsKKworICAgICAgICB0aGlzLnhtbFZhbGlkYXRpb24gPSB4bWxWYWxpZGF0aW9uOworCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHRoaXMub2JqZWN0TmFtZSA9IG51bGw7ICAgICAgICAKKyAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IG51bGw7CisgICAgICAgIHRoaXMuaG9zdE5hbWUgPSBudWxsOworICAgICAgICB0aGlzLmFwcEJhc2UgPSBudWxsOworICAgICAgICB0aGlzLmF1dG9EZXBsb3kgPSAidHJ1ZSI7CisgICAgICAgIHRoaXMuZGVwbG95WE1MID0gInRydWUiOworICAgICAgICB0aGlzLmRlcGxveU9uU3RhcnR1cCA9ICJ0cnVlIjsKKyAgICAgICAgdGhpcy51bnBhY2tXQVJzID0gInRydWUiOworCisgICAgfQorCisgICAgIC8qKgorICAgICAqIFJlbmRlciB0aGlzIG9iamVjdCBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkhvc3RGb3JtW2FkbWluQWN0aW9uPSIpOworICAgICAgICBzYi5hcHBlbmQoYWRtaW5BY3Rpb24pOworICAgICAgICBzYi5hcHBlbmQoIixhcHBCYXNlPSIpOworICAgICAgICBzYi5hcHBlbmQoYXBwQmFzZSk7CisgICAgICAgIHNiLmFwcGVuZCgiLGF1dG9EZXBsb3k9Iik7CisgICAgICAgIHNiLmFwcGVuZChhdXRvRGVwbG95KTsKKyAgICAgICAgc2IuYXBwZW5kKCIsZGVwbG95WE1MPSIpOworICAgICAgICBzYi5hcHBlbmQoZGVwbG95WE1MKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsZGVwbG95T25TdGFydHVwPSIpOworICAgICAgICBzYi5hcHBlbmQoZGVwbG95T25TdGFydHVwKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsdW5wYWNrV0FScz0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHVucGFja1dBUnMpOworICAgICAgICBzYi5hcHBlbmQoIicsb2JqZWN0TmFtZT0nIik7CisgICAgICAgIHNiLmFwcGVuZChvYmplY3ROYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLGhvc3ROYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQoaG9zdE5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIicsc2VydmljZU5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChzZXJ2aWNlTmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IGZyb20gdGhpcyBIVFRQIHJlcXVlc3QsCisgICAgICogYW5kIHJldHVybiBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbnkKKyAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBmb3VuZC4gIElmIG5vIGVycm9ycyBhcmUgZm91bmQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHdpdGggbm8KKyAgICAgKiByZWNvcmRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisKKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisKKyAgICAgICAgLy8gZnJvbnQgZW5kIHZhbGlkYXRpb24gd2hlbiBzYXZlIGlzIGNsaWNrZWQuCisgICAgICAgIC8vIGhvc3ROYW1lIGNhbm5vdCBiZSBudWxsCisgICAgICAgIGlmICgoaG9zdE5hbWU9PSBudWxsKSB8fCAoaG9zdE5hbWUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgiaG9zdE5hbWUiLCBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IuaG9zdE5hbWUucmVxdWlyZWQiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhcHBCYXNlIGNhbm5vdCBiZSBudWxsCisgICAgICAgIGlmICgoYXBwQmFzZSA9PSBudWxsKSB8fCAoYXBwQmFzZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJhcHBCYXNlIiwgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLmFwcEJhc2UucmVxdWlyZWQiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZXJyb3JzOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9Ib3N0c0Zvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0hvc3RzRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Yzk2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9Ib3N0c0Zvcm0uamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0OworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciBkZWxldGluZyBob3N0cy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSG9zdHNGb3JtIGV4dGVuZHMgQWN0aW9uRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWVzIG9mIHRoZSBob3N0cyB0byBiZSBkZWxldGVkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGhvc3RzW10gPSBuZXcgU3RyaW5nWzBdOworCisgICAgcHVibGljIFN0cmluZ1tdIGdldEhvc3RzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuaG9zdHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhvc3RzKFN0cmluZyBob3N0c1tdKSB7CisgICAgICAgIHRoaXMuaG9zdHMgPSBob3N0czsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHRoaXMuaG9zdHMgPSBuZXcgU3RyaW5nWzBdOworCisgICAgfQorICAgICAgICAKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvU2F2ZUFsaWFzQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9TYXZlQWxpYXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGM4ZjgzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvU2F2ZUFsaWFzQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkFkZCBBbGlhczwvZW0+IGFuZAorICogPGVtPkVkaXQgQWxpYXM8L2VtPiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVBbGlhc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+Y3JlYXRlU3RhbmRhcmRBbGlhczwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVN0YW5kYXJkQWxpYXNUeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIGhvc3QKKyAgICB9OworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3RlZCBhY3Rpb24KKyAgICAgICAgQWxpYXNGb3JtIGFmb3JtID0gKEFsaWFzRm9ybSkgZm9ybTsKKworICAgICAgICAvLyBQZXJmb3JtIGEgIkNyZWF0ZSBBbGlhcyIgdHJhbnNhY3Rpb24gKGlmIHJlcXVlc3RlZCkKKyAgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9ICJhZGRBbGlhcyI7CisgICAgICAgIAorICAgICAgICAvL2FsaWFzIHRvIGJlIGFkZGVkCisgICAgICAgIE9iamVjdCB2YWx1ZXNbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgIHZhbHVlc1swXSA9IGFmb3JtLmdldEFsaWFzTmFtZSgpOworCisgICAgICAgIFN0cmluZyBob3N0TmFtZSA9IGFmb3JtLmdldEhvc3ROYW1lKCk7CisKKyAgICAgICAgLy8gdmFsaWRhdGUgaWYgdGhpcyBhbGlhcyBhbHJlYWR5IGV4aXN0cy4KKyAgICAgICAgTGlzdCBhbGlhc1ZhbHMgPSBhZm9ybS5nZXRBbGlhc1ZhbHMoKTsKKyAgICAgICAgaWYgKGFsaWFzVmFscy5jb250YWlucyh2YWx1ZXNbMF0pKSB7CisgICAgICAgICAgICBBY3Rpb25NZXNzYWdlcyBlcnJvcnMgPSBuZXcgQWN0aW9uTWVzc2FnZXMoKTsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoImFsaWFzTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5hbGlhc05hbWUuZXhpc3RzIikpOworICAgICAgICAgICAgc2F2ZUVycm9ycyhyZXF1ZXN0LCBlcnJvcnMpOworICAgICAgICAgICAgcmV0dXJuIChuZXcgQWN0aW9uRm9yd2FyZChtYXBwaW5nLmdldElucHV0KCkpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgT2JqZWN0TmFtZSBobmFtZSA9IG5ldyBPYmplY3ROYW1lKGhvc3ROYW1lKTsKKyAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShobmFtZSwgb3BlcmF0aW9uLCB2YWx1ZXMsIGNyZWF0ZVN0YW5kYXJkQWxpYXNUeXBlcyk7CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgc3VjY2VzcyByZXBvcnRpbmcgcGFnZQorICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShtYXBwaW5nLmdldEF0dHJpYnV0ZSgpKTsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFN1Y2Nlc3NmdWwiKSk7CisgICAgICAgIAorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L1NhdmVIb3N0QWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9TYXZlSG9zdEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NWM5YTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9TYXZlSG9zdEFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0OworCisKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbE5vZGU7CisKKworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgY29tcGxldGVzIDxlbT5BZGQgSG9zdDwvZW0+IGFuZAorICogPGVtPkVkaXQgSG9zdDwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZUhvc3RBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFNpZ25hdHVyZSBmb3IgdGhlIDxjb2RlPmNyZWF0ZVN0YW5kYXJkSG9zdDwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVN0YW5kYXJkSG9zdFR5cGVzW10gPQorICAgIHsgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gcGFyZW50CisgICAgICAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBuYW1lCisgICAgICAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBhcHBCYXNlCisgICAgICAiYm9vbGVhbiIsICAgICAgICAgICAgICAvLyBhdXRvRGVwbG95CisgICAgICAiYm9vbGVhbiIsICAgICAgICAgICAgICAvLyBkZXBsb3lPblN0YXJ0dXAKKyAgICAgICJib29sZWFuIiwgICAgICAgICAgICAgIC8vIGRlcGxveVhNTAorICAgICAgImJvb2xlYW4iLCAgICAgICAgICAgICAgLy8gdW5wYWNrV0FScworICAgICAgImJvb2xlYW4iLCAgICAgICAgICAgICAgLy8geG1sTmFtZXNwYWNlQXdhcmUKKyAgICAgICJib29sZWFuIiwgICAgICAgICAgICAgIC8vIHhtbFZhbGlkYXRpb24KKyAgICB9OworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3RlZCBhY3Rpb24KKyAgICAgICAgSG9zdEZvcm0gaGZvcm0gPSAoSG9zdEZvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBhZG1pbkFjdGlvbiA9IGhmb3JtLmdldEFkbWluQWN0aW9uKCk7CisgICAgICAgIFN0cmluZyBoT2JqZWN0TmFtZSA9IGhmb3JtLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgT2JqZWN0TmFtZSBob25hbWUgPSBudWxsOworCisgICAgICAgIC8vIFBlcmZvcm0gYSAiQ3JlYXRlIEhvc3QiIHRyYW5zYWN0aW9uIChpZiByZXF1ZXN0ZWQpCisgICAgICAgIGlmICgiQ3JlYXRlIi5lcXVhbHMoYWRtaW5BY3Rpb24pKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSBudWxsOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlc1tdID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBoZm9ybS5nZXRTZXJ2aWNlTmFtZSgpOworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgc29uYW1lID0gbmV3IE9iamVjdE5hbWUoc2VydmljZU5hbWUpOworICAgICAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSBzb25hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHJlcXVlc3RlZCBob3N0IG5hbWUgaXMgdW5pcXVlCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKGRvbWFpbiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5IT1NUX1RZUEUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLGhvc3Q9IiArIGhmb3JtLmdldEhvc3ROYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChtQlNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFjdGlvbk1lc3NhZ2VzIGVycm9ycyA9IG5ldyBBY3Rpb25NZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJob3N0TmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLmhvc3ROYW1lLmV4aXN0cyIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZUVycm9ycyhyZXF1ZXN0LCBlcnJvcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBY3Rpb25Gb3J3YXJkKG1hcHBpbmcuZ2V0SW5wdXQoKSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIExvb2sgdXAgb3VyIE1CZWFuRmFjdG9yeSBNQmVhbgorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgZm5hbWUgPSBUb21jYXRUcmVlQnVpbGRlci5nZXRNQmVhbkZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBTdGFuZGFyZEhvc3Qgb2JqZWN0CisgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IE9iamVjdFs5XTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBkb21haW4gKyBUb21jYXRUcmVlQnVpbGRlci5FTkdJTkVfVFlQRTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMV0gPSBoZm9ybS5nZXRIb3N0TmFtZSgpOworICAgICAgICAgICAgICAgIHZhbHVlc1syXSA9IGhmb3JtLmdldEFwcEJhc2UoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbM10gPSBuZXcgQm9vbGVhbihoZm9ybS5nZXRBdXRvRGVwbG95KCkpOworICAgICAgICAgICAgICAgIHZhbHVlc1s0XSA9IG5ldyBCb29sZWFuKGhmb3JtLmdldERlcGxveU9uU3RhcnR1cCgpKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbNV0gPSBuZXcgQm9vbGVhbihoZm9ybS5nZXREZXBsb3lYTUwoKSk7CisgICAgICAgICAgICAgICAgdmFsdWVzWzZdID0gbmV3IEJvb2xlYW4oaGZvcm0uZ2V0VW5wYWNrV0FScygpKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbN10gPSBuZXcgQm9vbGVhbihoZm9ybS5nZXRYbWxOYW1lc3BhY2VBd2FyZSgpKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbOF0gPSBuZXcgQm9vbGVhbihoZm9ybS5nZXRYbWxWYWxpZGF0aW9uKCkpOworCisKKyAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAiY3JlYXRlU3RhbmRhcmRIb3N0IjsKKyAgICAgICAgICAgICAgICBoT2JqZWN0TmFtZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCBjcmVhdGVTdGFuZGFyZEhvc3RUeXBlcyk7CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5ldyBIb3N0IHRvIG91ciB0cmVlIGNvbnRyb2wgbm9kZQorICAgICAgICAgICAgICAgIFRyZWVDb250cm9sIGNvbnRyb2wgPSAoVHJlZUNvbnRyb2wpCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ0cmVlQ29udHJvbFRlc3QiKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJlbnROYW1lID0gc2VydmljZU5hbWU7CisgICAgICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBwYXJlbnROb2RlID0gY29udHJvbC5maW5kTm9kZShwYXJlbnROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5vZGVMYWJlbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAic2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuaG9zdCIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICgiICsgaGZvcm0uZ2V0SG9zdE5hbWUoKSArICIpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGVkTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoaE9iamVjdE5hbWUsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBjaGlsZE5vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmVlQ29udHJvbE5vZGUoaE9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9zdC5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVkaXRIb3N0LmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZG9tYWluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuYWRkQ2hpbGQoY2hpbGROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIC0gZm9yY2UgYSByZWRpc3BsYXkKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBmaW5kIHBhcmVudCBub2RlICciICsgcGFyZW50TmFtZSArICInIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBmaW5kIFRyZWVDb250cm9sTm9kZSEiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiksIGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGF0dHJpYnV0ZSB1cGRhdGVzIGFzIHJlcXVlc3RlZAorICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgaG9uYW1lID0gbmV3IE9iamVjdE5hbWUoaE9iamVjdE5hbWUpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiYXBwQmFzZSI7CisgICAgICAgICAgICBTdHJpbmcgYXBwQmFzZSA9ICIiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhcHBCYXNlID0gaGZvcm0uZ2V0QXBwQmFzZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBhcHBCYXNlID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoaG9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImFwcEJhc2UiLCBhcHBCYXNlKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJhdXRvRGVwbG95IjsKKyAgICAgICAgICAgIFN0cmluZyBhdXRvRGVwbG95ID0gInRydWUiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhdXRvRGVwbG95ID0gaGZvcm0uZ2V0QXV0b0RlcGxveSgpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBhdXRvRGVwbG95ID0gInRydWUiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGhvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJhdXRvRGVwbG95IiwgbmV3IEJvb2xlYW4oYXV0b0RlcGxveSkpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gImRlcGxveVhNTCI7CisgICAgICAgICAgICBTdHJpbmcgZGVwbG95WE1MID0gInRydWUiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkZXBsb3lYTUwgPSBoZm9ybS5nZXREZXBsb3lYTUwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgZGVwbG95WE1MID0gInRydWUiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGhvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJkZXBsb3lYTUwiLCBuZXcgQm9vbGVhbihkZXBsb3lYTUwpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkZXBsb3lPblN0YXJ0dXAiOworICAgICAgICAgICAgU3RyaW5nIGRlcGxveU9uU3RhcnR1cCA9ICJ0cnVlIjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZGVwbG95T25TdGFydHVwID0gaGZvcm0uZ2V0RGVwbG95T25TdGFydHVwKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGRlcGxveU9uU3RhcnR1cCA9ICJ0cnVlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShob25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiZGVwbG95T25TdGFydHVwIiwgbmV3IEJvb2xlYW4oZGVwbG95T25TdGFydHVwKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gInVucGFja1dBUnMiOworICAgICAgICAgICAgU3RyaW5nIHVucGFja1dBUnMgPSAiZmFsc2UiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB1bnBhY2tXQVJzID0gaGZvcm0uZ2V0VW5wYWNrV0FScygpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB1bnBhY2tXQVJzID0gImZhbHNlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShob25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgidW5wYWNrV0FScyIsIG5ldyBCb29sZWFuKHVucGFja1dBUnMpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ4bWxOYW1lc3BhY2VBd2FyZSI7CisgICAgICAgICAgICBTdHJpbmcgeG1sTmFtZXNwYWNlQXdhcmUgPSAiZmFsc2UiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB4bWxOYW1lc3BhY2VBd2FyZSA9IGhmb3JtLmdldFhtbE5hbWVzcGFjZUF3YXJlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHhtbE5hbWVzcGFjZUF3YXJlID0gImZhbHNlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShob25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgieG1sTmFtZXNwYWNlQXdhcmUiLCBuZXcgQm9vbGVhbih4bWxOYW1lc3BhY2VBd2FyZSkpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInhtbFZhbGlkYXRpb24iOworICAgICAgICAgICAgU3RyaW5nIHhtbFZhbGlkYXRpb24gPSAiZmFsc2UiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB4bWxWYWxpZGF0aW9uID0gaGZvcm0uZ2V0WG1sVmFsaWRhdGlvbigpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB4bWxWYWxpZGF0aW9uID0gImZhbHNlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShob25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgieG1sVmFsaWRhdGlvbiIsIG5ldyBCb29sZWFuKHhtbFZhbGlkYXRpb24pKSk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzdWNjZXNzIHJlcG9ydGluZyBwYWdlCisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG1hcHBpbmcuZ2V0QXR0cmlidXRlKCkpOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL0FkZFJlYWxtQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vQWRkUmVhbG1BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmIwZWIzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL0FkZFJlYWxtQWN0aW9uLmphdmEKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5BZGQgUmVhbG08L2VtPiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEFkZFJlYWxtQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworICAgIC8vIHRoZSBsaXN0IGZvciB0eXBlcyBvZiByZWFsbXMKKyAgICBwcml2YXRlIEFycmF5TGlzdCB0eXBlcyA9IG51bGw7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgZm9ybSB2YWx1ZXMgZm9yIGRpc3BsYXkgYW5kIGVkaXRpbmcKKyAgICAgICAgU3RyaW5nIHJlYWxtVHlwZXNbXSA9IG5ldyBTdHJpbmdbNV07CisgICAgICAgIHJlYWxtVHlwZXNbMF0gPSAiVXNlckRhdGFiYXNlUmVhbG0iOworICAgICAgICByZWFsbVR5cGVzWzFdID0gIkpORElSZWFsbSI7CisgICAgICAgIHJlYWxtVHlwZXNbMl0gPSAiTWVtb3J5UmVhbG0iOworICAgICAgICByZWFsbVR5cGVzWzNdID0gIkpEQkNSZWFsbSI7CisgICAgICAgIHJlYWxtVHlwZXNbNF0gPSAiRGF0YVNvdXJjZVJlYWxtIjsKKworICAgICAgICBTdHJpbmcgcGFyZW50ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhcmVudCIpOworICAgICAgICBTdHJpbmcgdHlwZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ0eXBlIik7CisgICAgICAgIGlmICh0eXBlID09IG51bGwpCisgICAgICAgICAgICB0eXBlID0gIlVzZXJEYXRhYmFzZVJlYWxtIjsgICAgLy8gZGVmYXVsdCB0eXBlIGlzIFVzZXJEYXRhYmFzZVJlYWxtCisgICAgICAgIAorICAgICAgICB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgLy8gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNlbGVjdCBsaXN0IHNob3VsZCBiZSB0aGUgdHlwZSBzZWxlY3RlZAorICAgICAgICB0eXBlcy5hZGQobmV3IExhYmVsVmFsdWVCZWFuKHR5cGUsCisgICAgICAgICAgICAgICAgIkFkZFJlYWxtLmRvP3BhcmVudD0iICsgCisgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGFyZW50LFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORykKKyAgICAgICAgICAgICAgICArICImdHlwZT0iICsgdHlwZSkpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8IHJlYWxtVHlwZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghdHlwZS5lcXVhbHNJZ25vcmVDYXNlKHJlYWxtVHlwZXNbaV0pKSB7CisgICAgICAgICAgICAgICAgdHlwZXMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbihyZWFsbVR5cGVzW2ldLAorICAgICAgICAgICAgICAgICJBZGRSZWFsbS5kbz9wYXJlbnQ9IiArIAorICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhcmVudCxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpCisgICAgICAgICAgICAgICAgKyAiJnR5cGU9IiArIHJlYWxtVHlwZXNbaV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgiVXNlckRhdGFiYXNlUmVhbG0iLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKKyAgICAgICAgICAgIGNyZWF0ZVVzZXJEYXRhYmFzZVJlYWxtKHNlc3Npb24sIHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAoIkpORElSZWFsbSIuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgeworICAgICAgICAgICAgY3JlYXRlSk5ESVJlYWxtKHNlc3Npb24sIHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAoIk1lbW9yeVJlYWxtIi5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7CisgICAgICAgICAgICBjcmVhdGVNZW1vcnlSZWFsbShzZXNzaW9uLCBwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKCJKREJDUmVhbG0iLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpeworICAgICAgICAgICAgY3JlYXRlSkRCQ1JlYWxtKHNlc3Npb24sIHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAoIkRhdGFTb3VyY2VSZWFsbSIuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgeworICAgICAgICAgICAgY3JlYXRlRGF0YVNvdXJjZVJlYWxtKHNlc3Npb24sIHBhcmVudCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgcmVhbG0gZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCh0eXBlKSk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVXNlckRhdGFiYXNlUmVhbG0oSHR0cFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHBhcmVudCkgeworCisgICAgICAgIFVzZXJEYXRhYmFzZVJlYWxtRm9ybSByZWFsbUZtID0gbmV3IFVzZXJEYXRhYmFzZVJlYWxtRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgidXNlckRhdGFiYXNlUmVhbG1Gb3JtIiwgcmVhbG1GbSk7CisgICAgICAgIHJlYWxtRm0uc2V0QWRtaW5BY3Rpb24oIkNyZWF0ZSIpOworICAgICAgICByZWFsbUZtLnNldE9iamVjdE5hbWUoIiIpOworICAgICAgICByZWFsbUZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIHJlYWxtVHlwZSA9ICJVc2VyRGF0YWJhc2VSZWFsbSI7CisgICAgICAgIHJlYWxtRm0uc2V0Tm9kZUxhYmVsKCJSZWFsbSAoIiArIHJlYWxtVHlwZSArICIpIik7CisgICAgICAgIHJlYWxtRm0uc2V0UmVhbG1UeXBlKHJlYWxtVHlwZSk7CisgICAgICAgIHJlYWxtRm0uc2V0UmVzb3VyY2UoIiIpOworICAgICAgICByZWFsbUZtLnNldFJlYWxtVHlwZVZhbHModHlwZXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVKTkRJUmVhbG0oSHR0cFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHBhcmVudCkgeworCisgICAgICAgIEpORElSZWFsbUZvcm0gcmVhbG1GbSA9IG5ldyBKTkRJUmVhbG1Gb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJqbmRpUmVhbG1Gb3JtIiwgcmVhbG1GbSk7CisgICAgICAgIHJlYWxtRm0uc2V0QWRtaW5BY3Rpb24oIkNyZWF0ZSIpOworICAgICAgICByZWFsbUZtLnNldE9iamVjdE5hbWUoIiIpOworICAgICAgICByZWFsbUZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIHJlYWxtVHlwZSA9ICJKTkRJUmVhbG0iOworICAgICAgICByZWFsbUZtLnNldE5vZGVMYWJlbCgiUmVhbG0gKCIgKyByZWFsbVR5cGUgKyAiKSIpOworICAgICAgICByZWFsbUZtLnNldFJlYWxtVHlwZShyZWFsbVR5cGUpOworICAgICAgICByZWFsbUZtLnNldERpZ2VzdCgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0Um9sZUJhc2UoIiIpOworICAgICAgICByZWFsbUZtLnNldFVzZXJTdWJ0cmVlKCJmYWxzZSIpOworICAgICAgICByZWFsbUZtLnNldFJvbGVTdWJ0cmVlKCJmYWxzZSIpOworICAgICAgICByZWFsbUZtLnNldFJvbGVQYXR0ZXJuKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRVc2VyUm9sZU5hbWUoIiIpOworICAgICAgICByZWFsbUZtLnNldFJvbGVOYW1lKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRSb2xlQmFzZSgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0Q29udGV4dEZhY3RvcnkoIiIpOworICAgICAgICByZWFsbUZtLnNldFVzZXJQYXR0ZXJuKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRVc2VyU2VhcmNoKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRVc2VyUGFzc3dvcmQoIiIpOworICAgICAgICByZWFsbUZtLnNldENvbm5lY3Rpb25OYW1lKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRDb25uZWN0aW9uUGFzc3dvcmQoIiIpOworICAgICAgICByZWFsbUZtLnNldENvbm5lY3Rpb25VUkwoIiIpOworICAgICAgICByZWFsbUZtLnNldFNlYXJjaFZhbHMoTGlzdHMuZ2V0Qm9vbGVhblZhbHVlcygpKTsKKyAgICAgICAgcmVhbG1GbS5zZXRSZWFsbVR5cGVWYWxzKHR5cGVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlTWVtb3J5UmVhbG0oSHR0cFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHBhcmVudCkgeworCisgICAgICAgIE1lbW9yeVJlYWxtRm9ybSByZWFsbUZtID0gbmV3IE1lbW9yeVJlYWxtRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgibWVtb3J5UmVhbG1Gb3JtIiwgcmVhbG1GbSk7CisgICAgICAgIHJlYWxtRm0uc2V0QWRtaW5BY3Rpb24oIkNyZWF0ZSIpOworICAgICAgICByZWFsbUZtLnNldE9iamVjdE5hbWUoIiIpOworICAgICAgICByZWFsbUZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIHJlYWxtVHlwZSA9ICJNZW1vcnlSZWFsbSI7CisgICAgICAgIHJlYWxtRm0uc2V0Tm9kZUxhYmVsKCJSZWFsbSAoIiArIHJlYWxtVHlwZSArICIpIik7CisgICAgICAgIHJlYWxtRm0uc2V0UmVhbG1UeXBlKHJlYWxtVHlwZSk7CisgICAgICAgIHJlYWxtRm0uc2V0UGF0aE5hbWUoIiIpOworICAgICAgICByZWFsbUZtLnNldFJlYWxtVHlwZVZhbHModHlwZXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVKREJDUmVhbG0oSHR0cFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHBhcmVudCkgeworCisgICAgICAgIEpEQkNSZWFsbUZvcm0gcmVhbG1GbSA9IG5ldyBKREJDUmVhbG1Gb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJqZGJjUmVhbG1Gb3JtIiwgcmVhbG1GbSk7CisgICAgICAgIHJlYWxtRm0uc2V0QWRtaW5BY3Rpb24oIkNyZWF0ZSIpOworICAgICAgICByZWFsbUZtLnNldE9iamVjdE5hbWUoIiIpOworICAgICAgICByZWFsbUZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIHJlYWxtVHlwZSA9ICJKREJDUmVhbG0iOworICAgICAgICByZWFsbUZtLnNldE5vZGVMYWJlbCgiUmVhbG0gKCIgKyByZWFsbVR5cGUgKyAiKSIpOworICAgICAgICByZWFsbUZtLnNldFJlYWxtVHlwZShyZWFsbVR5cGUpOworICAgICAgICByZWFsbUZtLnNldERpZ2VzdCgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0RHJpdmVyKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRSb2xlTmFtZUNvbCgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0UGFzc3dvcmRDb2woIiIpOworICAgICAgICByZWFsbUZtLnNldFVzZXJUYWJsZSgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0Um9sZVRhYmxlKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRDb25uZWN0aW9uTmFtZSgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0Q29ubmVjdGlvblBhc3N3b3JkKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRDb25uZWN0aW9uVVJMKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRSZWFsbVR5cGVWYWxzKHR5cGVzKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURhdGFTb3VyY2VSZWFsbShIdHRwU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgcGFyZW50KSB7CisKKyAgICAgICAgRGF0YVNvdXJjZVJlYWxtRm9ybSByZWFsbUZtID0gbmV3IERhdGFTb3VyY2VSZWFsbUZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoImRhdGFTb3VyY2VSZWFsbUZvcm0iLCByZWFsbUZtKTsKKyAgICAgICAgcmVhbG1GbS5zZXRBZG1pbkFjdGlvbigiQ3JlYXRlIik7CisgICAgICAgIHJlYWxtRm0uc2V0T2JqZWN0TmFtZSgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0UGFyZW50T2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICBTdHJpbmcgcmVhbG1UeXBlID0gIkRhdGFTb3VyY2VSZWFsbSI7CisgICAgICAgIHJlYWxtRm0uc2V0Tm9kZUxhYmVsKCJSZWFsbSAoIiArIHJlYWxtVHlwZSArICIpIik7CisgICAgICAgIHJlYWxtRm0uc2V0UmVhbG1UeXBlKHJlYWxtVHlwZSk7CisgICAgICAgIHJlYWxtRm0uc2V0RGF0YVNvdXJjZU5hbWUoIiIpOworICAgICAgICByZWFsbUZtLnNldERpZ2VzdCgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0TG9jYWxEYXRhU291cmNlKCJmYWxzZSIpOworICAgICAgICByZWFsbUZtLnNldFJvbGVOYW1lQ29sKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRVc2VyQ3JlZENvbCgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0VXNlck5hbWVDb2woIiIpOworICAgICAgICByZWFsbUZtLnNldFVzZXJSb2xlVGFibGUoIiIpOworICAgICAgICByZWFsbUZtLnNldFVzZXJUYWJsZSgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0UmVhbG1UeXBlVmFscyh0eXBlcyk7CisgICAgICAgIHJlYWxtRm0uc2V0Qm9vbGVhblZhbHMoTGlzdHMuZ2V0Qm9vbGVhblZhbHVlcygpKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL0RhdGFTb3VyY2VSZWFsbUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9EYXRhU291cmNlUmVhbG1Gb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ1ZWU4NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9EYXRhU291cmNlUmVhbG1Gb3JtLmphdmEKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgZGF0YXNvdXJjZSByZWFsbSBwYWdlLgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgRGF0YVNvdXJjZVJlYWxtRm9ybSBleHRlbmRzIFJlYWxtRm9ybSB7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBKTkRJIG5hbWVkIEpEQkMgRGF0YVNvdXJjZSBmb3IgeW91ciBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkYXRhU291cmNlTmFtZSA9IG51bGw7CisgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGRpZ2VzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkaWdlc3QgPSBudWxsOworICAgIAorICAgIC8qKiAKKyAgICAgKiBUaGUgdGV4dCBmb3IgaWYgdGhlIERhdGFTb3VyY2UgaXMgbG9jYWwgdG8gdGhlIHdlYmFwcC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsb2NhbERhdGFTb3VyY2UgPSAiZmFsc2UiOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgcm9sZU5hbWVDb2wuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcm9sZU5hbWVDb2wgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgdXNlckNyZWRDb2wuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlckNyZWRDb2wgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgdXNlck5hbWVDb2wuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlck5hbWVDb2wgPSBudWxsOworICAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHVzZXJSb2xlVGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlclJvbGVUYWJsZSA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSB1c2VyIHRhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJUYWJsZSA9IG51bGw7CisgICAgICAgIAorICAgIC8qCisgICAgICogUmVwcmVzZW50IGJvb2xlYW4gKHRydWUsIGZhbHNlKSB2YWx1ZXMgZm9yIHVucGFja1dBUnMgZXRjLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdCBib29sZWFuVmFscyA9IG51bGw7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkYXRhU291cmNlTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFTb3VyY2VOYW1lKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZU5hbWU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRhdGFTb3VyY2VOYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERhdGFTb3VyY2VOYW1lKFN0cmluZyBkYXRhU291cmNlTmFtZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5kYXRhU291cmNlTmFtZSA9IGRhdGFTb3VyY2VOYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaWdlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaWdlc3QoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5kaWdlc3Q7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpZ2VzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaWdlc3QoU3RyaW5nIGRpZ2VzdCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5kaWdlc3QgPSBkaWdlc3Q7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2FsRGF0YVNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsRGF0YVNvdXJjZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmxvY2FsRGF0YVNvdXJjZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9jYWxEYXRhU291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsRGF0YVNvdXJjZShTdHJpbmcgbG9jYWxEYXRhU291cmNlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmxvY2FsRGF0YVNvdXJjZSA9IGxvY2FsRGF0YVNvdXJjZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcm9sZU5hbWVDb2wuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSb2xlTmFtZUNvbCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnJvbGVOYW1lQ29sOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSByb2xlTmFtZUNvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xlTmFtZUNvbChTdHJpbmcgcm9sZU5hbWVDb2wpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMucm9sZU5hbWVDb2wgPSByb2xlTmFtZUNvbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlckNyZWRDb2wuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyQ3JlZENvbCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnVzZXJDcmVkQ29sOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VyQ3JlZENvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyQ3JlZENvbChTdHJpbmcgdXNlckNyZWRDb2wpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMudXNlckNyZWRDb2wgPSB1c2VyQ3JlZENvbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlck5hbWVDb2wuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZUNvbCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnVzZXJOYW1lQ29sOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VyTmFtZUNvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyTmFtZUNvbChTdHJpbmcgdXNlck5hbWVDb2wpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMudXNlck5hbWVDb2wgPSB1c2VyTmFtZUNvbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlciByb2xlIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlclJvbGVUYWJsZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnVzZXJSb2xlVGFibGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVzZXIgcm9sZSB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyUm9sZVRhYmxlKFN0cmluZyB1c2VyUm9sZVRhYmxlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnVzZXJSb2xlVGFibGUgPSB1c2VyUm9sZVRhYmxlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VyIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlclRhYmxlKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMudXNlclRhYmxlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VyIFRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJUYWJsZShTdHJpbmcgdXNlclRhYmxlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnVzZXJUYWJsZSA9IHVzZXJUYWJsZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYm9vbGVhblZhbHMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0Qm9vbGVhblZhbHMoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuYm9vbGVhblZhbHM7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJvb2xlYW5WYWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW5WYWxzKExpc3QgYm9vbGVhblZhbHMpIHsKKworICAgICAgICB0aGlzLmJvb2xlYW5WYWxzID0gYm9vbGVhblZhbHM7CisKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOyAgIAorICAgICAgICB0aGlzLmRhdGFTb3VyY2VOYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy5kaWdlc3QgPSBudWxsOworICAgICAgICB0aGlzLmxvY2FsRGF0YVNvdXJjZSA9ICJmYWxzZSI7CisgICAgICAgIAorICAgICAgICB0aGlzLnJvbGVOYW1lQ29sID0gbnVsbDsKKyAgICAgICAgdGhpcy51c2VyQ3JlZENvbCA9IG51bGw7CisgICAgICAgIHRoaXMudXNlck5hbWVDb2wgPSBudWxsOworICAgICAgICB0aGlzLnVzZXJUYWJsZSA9IG51bGw7CisgICAgICAgIHRoaXMudXNlclJvbGVUYWJsZSA9IG51bGw7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgdGhpcyBvYmplY3QgYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJEYXRhU291cmNlUmVhbG1Gb3JtW2FkbWluQWN0aW9uPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0QWRtaW5BY3Rpb24oKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLGRhdGFTb3VyY2VOYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQoZGF0YVNvdXJjZU5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIixkaWdlc3Q9Iik7CisgICAgICAgIHNiLmFwcGVuZChkaWdlc3QpOworICAgICAgICBzYi5hcHBlbmQoIicsbG9jYWxEYXRhU291cmNlPSciKTsKKyAgICAgICAgc2IuYXBwZW5kKGxvY2FsRGF0YVNvdXJjZSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyxyb2xlTmFtZUNvbD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHJvbGVOYW1lQ29sKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHVzZXJDcmVkQ29sPSIpOworICAgICAgICBzYi5hcHBlbmQodXNlckNyZWRDb2wpOworICAgICAgICBzYi5hcHBlbmQoIicsdXNlck5hbWVDb2w9Iik7CisgICAgICAgIHNiLmFwcGVuZCh1c2VyTmFtZUNvbCk7CisgICAgICAgIHNiLmFwcGVuZCgiJyx1c2VyUm9sZVRhYmxlPSIpOworICAgICAgICBzYi5hcHBlbmQodXNlclJvbGVUYWJsZSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyx1c2VyVGFibGU9JyIpOworICAgICAgICBzYi5hcHBlbmQodXNlclRhYmxlKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLG9iamVjdE5hbWU9JyIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHJlYWxtVHlwZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldFJlYWxtVHlwZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IGZyb20gdGhpcyBIVFRQIHJlcXVlc3QsCisgICAgICogYW5kIHJldHVybiBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbnkKKyAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBmb3VuZC4gIElmIG5vIGVycm9ycyBhcmUgZm91bmQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHdpdGggbm8KKyAgICAgKiByZWNvcmRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgIAorICAgICAgICAvLyBmcm9udCBlbmQgdmFsaWRhdGlvbiB3aGVuIHNhdmUgaXMgY2xpY2tlZC4gICAgICAgIAorICAgICAgICBpZiAoKGRhdGFTb3VyY2VOYW1lID09IG51bGwpIHx8IChkYXRhU291cmNlTmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJkYXRhU291cmNlTmFtZSIsCisgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IuZGF0YVNvdXJjZU5hbWUucmVxdWlyZWQiKSk7CisgICAgICAgIH0KKyAgICAgCisgICAgICAgIGlmICgocm9sZU5hbWVDb2wgPT0gbnVsbCkgfHwgKHJvbGVOYW1lQ29sLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoInJvbGVOYW1lQ29sIiwKKyAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5yb2xlTmFtZUNvbC5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgodXNlckNyZWRDb2wgPT0gbnVsbCkgfHwgKHVzZXJDcmVkQ29sLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoInVzZXJDcmVkQ29sIiwKKyAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci51c2VyQ3JlZENvbC5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICBpZiAoKHVzZXJOYW1lQ29sID09IG51bGwpIHx8ICh1c2VyTmFtZUNvbC5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJ1c2VyTmFtZUNvbCIsCisgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IudXNlck5hbWVDb2wucmVxdWlyZWQiKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICgodXNlclJvbGVUYWJsZSA9PSBudWxsKSB8fCAodXNlclJvbGVUYWJsZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJ1c2VyUm9sZVRhYmxlIiwKKyAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci51c2VyUm9sZVRhYmxlLnJlcXVpcmVkIikpOworICAgICAgICB9CisgICAgCisgICAgICAgIGlmICgodXNlclRhYmxlID09IG51bGwpIHx8ICh1c2VyVGFibGUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgidXNlclRhYmxlIiwKKyAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci51c2VyVGFibGUucmVxdWlyZWQiKSk7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgCisgICAgICAgIHJldHVybiBlcnJvcnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL0RlbGV0ZVJlYWxtQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vRGVsZXRlUmVhbG1BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTk0OTM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL0RlbGV0ZVJlYWxtQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG07CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmUuVmFsdmVVdGlsOworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgc2V0cyB1cCA8ZW0+RGVsZXRlIFJlYWxtczwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsZXRlUmVhbG1BY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBudWxsOworICAgICAgICAvLyBTZXQgdXAgYSBmb3JtIGJlYW4gY29udGFpbmluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkCisgICAgICAgIC8vIG9iamVjdHMgdG8gYmUgZGVsZXRlZAorICAgICAgICBSZWFsbXNGb3JtIHJlYWxtc0Zvcm0gPSBuZXcgUmVhbG1zRm9ybSgpOworICAgICAgICBTdHJpbmcgc2VsZWN0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpOworICAgICAgICBpZiAoc2VsZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFsbXNbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICByZWFsbXNbMF0gPSBzZWxlY3Q7CisgICAgICAgICAgICByZWFsbXNGb3JtLnNldFJlYWxtcyhyZWFsbXMpOworICAgICAgICAgICAgcGF0dGVybiA9IHNlbGVjdDsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgicmVhbG1zRm9ybSIsIHJlYWxtc0Zvcm0pOworICAgICAgICAKKyAgICAgICAgLy8gQWNjdW11bGF0ZSBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSByZWFsbXMKKyAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIFN0cmluZyBwYXJlbnQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGFyZW50Iik7CisgICAgICAgIAorICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGF0dGVybiA9IFZhbHZlVXRpbC5nZXRPYmplY3ROYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQsVG9tY2F0VHJlZUJ1aWxkZXIuUkVBTE1fVFlQRSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2VsZWN0IikpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5zZWxlY3QiKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZW1zID0KKyAgICAgICAgICAgIG1CU2VydmVyLnF1ZXJ5TmFtZXMobmV3IE9iamVjdE5hbWUocGF0dGVybiksIG51bGwpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoaXRlbXMubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNlbGVjdCIpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2VsZWN0IikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoInJlYWxtc0xpc3QiLCBsaXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGxpc3QgZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiUmVhbG1zIikpOworICAgICAgICAKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9EZWxldGVSZWFsbXNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9EZWxldGVSZWFsbXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGI0ZDMwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL0RlbGV0ZVJlYWxtc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbE5vZGU7CisKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IGNvbXBsZXRlcyA8ZW0+RGVsZXRlIFJlYWxtczwvZW0+CisgKiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlbGV0ZVJlYWxtc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8qKgorICAgICAqIFNpZ25hdHVyZSBmb3IgdGhlIDxjb2RlPnJlbW92ZVJlYWxtPC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlUmVhbG1UeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgICAvLyBPYmplY3QgbmFtZQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIERlbGV0ZSB0aGUgc3BlY2lmaWVkIFJlYWxtcworICAgICAgICBTdHJpbmcgcmVhbG1zW10gID0gKChSZWFsbXNGb3JtKSBmb3JtKS5nZXRSZWFsbXMoKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9ICJyZW1vdmVSZWFsbSI7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIExvb2sgdXAgb3VyIHRyZWUgY29udHJvbCBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgVHJlZUNvbnRyb2wgY29udHJvbCA9IChUcmVlQ29udHJvbCkKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEF0dHJpYnV0ZSgidHJlZUNvbnRyb2xUZXN0Iik7CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHJlYWxtcworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWFsbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSByZWFsbXNbaV07CisgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNlbGVjdE5vZGUobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBub2RlID0gY29udHJvbC5maW5kTm9kZShyZWFsbXNbaV0pOworICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIGZuYW1lID0gCisgICAgICAgICAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5nZXRNQmVhbkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuaW52b2tlKGZuYW1lLCBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgcmVtb3ZlUmVhbG1UeXBlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKCJNaXNzaW5nIFRyZWVDb250cm9sTm9kZSBmb3IgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxtc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKCJNaXNzaW5nIFRyZWVDb250cm9sIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhpcyB0cmFuc2FjdGlvbgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9FZGl0UmVhbG1BY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9FZGl0UmVhbG1BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzE4MTc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL0VkaXRSZWFsbUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MaXN0czsKKworLyoqCisgKiBBIGdlbmVyaWMgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IHNldHMgdXAgPGVtPkVkaXQKKyAqIFJlYWxtIDwvZW0+IHRyYW5zYWN0aW9ucywgYmFzZWQgb24gdGhlIHR5cGUgb2YgUmVhbG0uCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEVkaXRSZWFsbUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBvYmplY3QgbmFtZXMgb2YgdGhlIE1CZWFucyB3ZSBhcmUgbWFuaXB1bGF0aW5nCisgICAgICAgIE9iamVjdE5hbWUgcm5hbWUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcm5hbWUgPSBuZXcgT2JqZWN0TmFtZShyZXF1ZXN0LmdldFBhcmFtZXRlcigic2VsZWN0IikpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgImVycm9yLnJlYWxtTmFtZS5iYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKSk7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgU3RyaW5nIHJlYWxtVHlwZSA9IG51bGw7CisgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisKKyAgICAgICAvLyBGaW5kIHdoYXQgdHlwZSBvZiBSZWFsbSB0aGlzIGlzCisgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjbGFzc05hbWUiOworICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpOworICAgICAgICAgICAgaW50IHBlcmlvZCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpOworICAgICAgICAgICAgaWYgKHBlcmlvZCA+PSAwKQorICAgICAgICAgICAgICAgIHJlYWxtVHlwZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcocGVyaW9kICsgMSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBhcHByb3ByaWF0ZSByZWFsbSBkaXNwbGF5IHBhZ2UKKworICAgICAgICBpZiAoIlVzZXJEYXRhYmFzZVJlYWxtIi5lcXVhbHNJZ25vcmVDYXNlKHJlYWxtVHlwZSkpIHsKKyAgICAgICAgICAgICAgIHNldFVwVXNlckRhdGFiYXNlUmVhbG0ocm5hbWUsIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfSBlbHNlIGlmICgiTWVtb3J5UmVhbG0iLmVxdWFsc0lnbm9yZUNhc2UocmVhbG1UeXBlKSkgeworICAgICAgICAgICAgICAgc2V0VXBNZW1vcnlSZWFsbShybmFtZSwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9IGVsc2UgaWYgKCJKREJDUmVhbG0iLmVxdWFsc0lnbm9yZUNhc2UocmVhbG1UeXBlKSkgeworICAgICAgICAgICAgICAgc2V0VXBKREJDUmVhbG0ocm5hbWUsIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfSBlbHNlIGlmICgiSk5ESVJlYWxtIi5lcXVhbHNJZ25vcmVDYXNlKHJlYWxtVHlwZSkpIHsKKyAgICAgICAgICAgICAgIHNldFVwSk5ESVJlYWxtKHJuYW1lLCByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIkRhdGFTb3VyY2VSZWFsbSIuZXF1YWxzSWdub3JlQ2FzZShyZWFsbVR5cGUpKSB7CisgICAgICAgICAgICAgICAgc2V0VXBEYXRhU291cmNlUmVhbG0ocm5hbWUsIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZChyZWFsbVR5cGUpKTsKKworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRVcFVzZXJEYXRhYmFzZVJlYWxtKE9iamVjdE5hbWUgcm5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgZm9ybSB2YWx1ZXMgZm9yIGRpc3BsYXkgYW5kIGVkaXRpbmcKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgVXNlckRhdGFiYXNlUmVhbG1Gb3JtIHJlYWxtRm0gPSBuZXcgVXNlckRhdGFiYXNlUmVhbG1Gb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJ1c2VyRGF0YWJhc2VSZWFsbUZvcm0iLCByZWFsbUZtKTsKKyAgICAgICAgcmVhbG1GbS5zZXRBZG1pbkFjdGlvbigiRWRpdCIpOworICAgICAgICByZWFsbUZtLnNldE9iamVjdE5hbWUocm5hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIFN0cmluZyByZWFsbVR5cGUgPSAiVXNlckRhdGFiYXNlUmVhbG0iOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSBybmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICBTdHJpbmcgY29udGV4dCA9IHJuYW1lLmdldEtleVByb3BlcnR5KCJwYXRoIik7CisgICAgICAgIGlmIChob3N0IT1udWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIkhvc3QgKCIgKyBob3N0ICsgIikgPiAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29udGV4dCE9bnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCJDb250ZXh0ICgiICsgY29udGV4dCArICIpID4gIik7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInNlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLnJlYWxtIikpOworICAgICAgICByZWFsbUZtLnNldE5vZGVMYWJlbChzYi50b1N0cmluZygpKTsKKyAgICAgICAgcmVhbG1GbS5zZXRSZWFsbVR5cGUocmVhbG1UeXBlKTsKKyAgICAgICAgcmVhbG1GbS5zZXRBbGxvd0RlbGV0aW9uKGFsbG93RGVsZXRpb24ocm5hbWUscmVxdWVzdCkpOworCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBDb3B5IHNjYWxhciBwcm9wZXJ0aWVzCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicmVzb3VyY2VOYW1lIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0UmVzb3VyY2UKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRVcE1lbW9yeVJlYWxtKE9iamVjdE5hbWUgcm5hbWUsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgZm9ybSB2YWx1ZXMgZm9yIGRpc3BsYXkgYW5kIGVkaXRpbmcKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVtb3J5UmVhbG1Gb3JtIHJlYWxtRm0gPSBuZXcgTWVtb3J5UmVhbG1Gb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJtZW1vcnlSZWFsbUZvcm0iLCByZWFsbUZtKTsKKyAgICAgICAgcmVhbG1GbS5zZXRBZG1pbkFjdGlvbigiRWRpdCIpOworICAgICAgICByZWFsbUZtLnNldE9iamVjdE5hbWUocm5hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIFN0cmluZyByZWFsbVR5cGUgPSAiTWVtb3J5UmVhbG0iOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5yZWFsbSIpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIgKCIpOworICAgICAgICBzYi5hcHBlbmQocmVhbG1UeXBlKTsKKyAgICAgICAgc2IuYXBwZW5kKCIpIik7CisgICAgICAgIHJlYWxtRm0uc2V0Tm9kZUxhYmVsKHNiLnRvU3RyaW5nKCkpOworICAgICAgICByZWFsbUZtLnNldFJlYWxtVHlwZShyZWFsbVR5cGUpOworICAgICAgICByZWFsbUZtLnNldEFsbG93RGVsZXRpb24oYWxsb3dEZWxldGlvbihybmFtZSxyZXF1ZXN0KSk7CisKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIENvcHkgc2NhbGFyIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwYXRobmFtZSI7CisgICAgICAgICAgICByZWFsbUZtLnNldFBhdGhOYW1lCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBKREJDUmVhbG0oT2JqZWN0TmFtZSBybmFtZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBKREJDUmVhbG1Gb3JtIHJlYWxtRm0gPSBuZXcgSkRCQ1JlYWxtRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgiamRiY1JlYWxtRm9ybSIsIHJlYWxtRm0pOworICAgICAgICByZWFsbUZtLnNldEFkbWluQWN0aW9uKCJFZGl0Iik7CisgICAgICAgIHJlYWxtRm0uc2V0T2JqZWN0TmFtZShybmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgU3RyaW5nIHJlYWxtVHlwZSA9ICJKREJDUmVhbG0iOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5yZWFsbSIpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIgKCIpOworICAgICAgICBzYi5hcHBlbmQocmVhbG1UeXBlKTsKKyAgICAgICAgc2IuYXBwZW5kKCIpIik7CisgICAgICAgIHJlYWxtRm0uc2V0Tm9kZUxhYmVsKHNiLnRvU3RyaW5nKCkpOworICAgICAgICByZWFsbUZtLnNldFJlYWxtVHlwZShyZWFsbVR5cGUpOworICAgICAgICByZWFsbUZtLnNldEFsbG93RGVsZXRpb24oYWxsb3dEZWxldGlvbihybmFtZSxyZXF1ZXN0KSk7CisKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIENvcHkgc2NhbGFyIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkaWdlc3QiOworICAgICAgICAgICAgcmVhbG1GbS5zZXREaWdlc3QKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkcml2ZXJOYW1lIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0RHJpdmVyCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicm9sZU5hbWVDb2wiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRSb2xlTmFtZUNvbAorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJOYW1lQ29sIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0VXNlck5hbWVDb2wKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyQ3JlZENvbCI7CisgICAgICAgICAgICByZWFsbUZtLnNldFBhc3N3b3JkQ29sCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlclRhYmxlIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0VXNlclRhYmxlCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlclJvbGVUYWJsZSI7CisgICAgICAgICAgICByZWFsbUZtLnNldFJvbGVUYWJsZQorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImNvbm5lY3Rpb25OYW1lIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0Q29ubmVjdGlvbk5hbWUKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjb25uZWN0aW9uUGFzc3dvcmQiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRDb25uZWN0aW9uUGFzc3dvcmQKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjb25uZWN0aW9uVVJMIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0Q29ubmVjdGlvblVSTAorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFVwSk5ESVJlYWxtKE9iamVjdE5hbWUgcm5hbWUsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgZm9ybSB2YWx1ZXMgZm9yIGRpc3BsYXkgYW5kIGVkaXRpbmcKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgSk5ESVJlYWxtRm9ybSByZWFsbUZtID0gbmV3IEpORElSZWFsbUZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoImpuZGlSZWFsbUZvcm0iLCByZWFsbUZtKTsKKyAgICAgICAgcmVhbG1GbS5zZXRBZG1pbkFjdGlvbigiRWRpdCIpOworICAgICAgICByZWFsbUZtLnNldE9iamVjdE5hbWUocm5hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIFN0cmluZyByZWFsbVR5cGUgPSAiSk5ESVJlYWxtIjsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBzYi5hcHBlbmQocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAic2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIucmVhbG0iKSk7CisgICAgICAgIHNiLmFwcGVuZCgiICgiKTsKKyAgICAgICAgc2IuYXBwZW5kKHJlYWxtVHlwZSk7CisgICAgICAgIHNiLmFwcGVuZCgiKSIpOworICAgICAgICByZWFsbUZtLnNldE5vZGVMYWJlbChzYi50b1N0cmluZygpKTsKKyAgICAgICAgcmVhbG1GbS5zZXRSZWFsbVR5cGUocmVhbG1UeXBlKTsKKyAgICAgICAgcmVhbG1GbS5zZXRTZWFyY2hWYWxzKExpc3RzLmdldEJvb2xlYW5WYWx1ZXMoKSk7CisgICAgICAgIHJlYWxtRm0uc2V0QWxsb3dEZWxldGlvbihhbGxvd0RlbGV0aW9uKHJuYW1lLHJlcXVlc3QpKTsKKworICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gQ29weSBzY2FsYXIgcHJvcGVydGllcworICAgICAgICAgICAgYXR0cmlidXRlID0gImRpZ2VzdCI7CisgICAgICAgICAgICByZWFsbUZtLnNldERpZ2VzdAorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJTdWJ0cmVlIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0VXNlclN1YnRyZWUKKyAgICAgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJyb2xlU3VidHJlZSI7CisgICAgICAgICAgICByZWFsbUZtLnNldFJvbGVTdWJ0cmVlCisgICAgICAgICAgICAgICAgICAgICgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlclJvbGVOYW1lIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0VXNlclJvbGVOYW1lCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicm9sZU5hbWUiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRSb2xlTmFtZQorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInJvbGVCYXNlIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0Um9sZUJhc2UKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJyb2xlU2VhcmNoIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0Um9sZVBhdHRlcm4KKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjb250ZXh0RmFjdG9yeSI7CisgICAgICAgICAgICByZWFsbUZtLnNldENvbnRleHRGYWN0b3J5CisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlclBhc3N3b3JkIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0VXNlclBhc3N3b3JkCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlclBhdHRlcm4iOworICAgICAgICAgICAgcmVhbG1GbS5zZXRVc2VyUGF0dGVybgorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJTZWFyY2giOworICAgICAgICAgICAgcmVhbG1GbS5zZXRVc2VyU2VhcmNoCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29ubmVjdGlvbk5hbWUiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRDb25uZWN0aW9uTmFtZQorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImNvbm5lY3Rpb25QYXNzd29yZCI7CisgICAgICAgICAgICByZWFsbUZtLnNldENvbm5lY3Rpb25QYXNzd29yZAorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImNvbm5lY3Rpb25VUkwiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRDb25uZWN0aW9uVVJMCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBEYXRhU291cmNlUmVhbG0oT2JqZWN0TmFtZSBybmFtZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBEYXRhU291cmNlUmVhbG1Gb3JtIHJlYWxtRm0gPSBuZXcgRGF0YVNvdXJjZVJlYWxtRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgiZGF0YVNvdXJjZVJlYWxtRm9ybSIsIHJlYWxtRm0pOworICAgICAgICByZWFsbUZtLnNldEFkbWluQWN0aW9uKCJFZGl0Iik7CisgICAgICAgIHJlYWxtRm0uc2V0T2JqZWN0TmFtZShybmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgU3RyaW5nIHJlYWxtVHlwZSA9ICJEYXRhU291cmNlUmVhbG0iOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5yZWFsbSIpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIgKCIpOworICAgICAgICBzYi5hcHBlbmQocmVhbG1UeXBlKTsKKyAgICAgICAgc2IuYXBwZW5kKCIpIik7CisgICAgICAgIHJlYWxtRm0uc2V0Tm9kZUxhYmVsKHNiLnRvU3RyaW5nKCkpOworICAgICAgICByZWFsbUZtLnNldFJlYWxtVHlwZShyZWFsbVR5cGUpOworICAgICAgICByZWFsbUZtLnNldEFsbG93RGVsZXRpb24oYWxsb3dEZWxldGlvbihybmFtZSxyZXF1ZXN0KSk7CisgICAgICAgIHJlYWxtRm0uc2V0Qm9vbGVhblZhbHMoTGlzdHMuZ2V0Qm9vbGVhblZhbHVlcygpKTsKKworICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gQ29weSBzY2FsYXIgcHJvcGVydGllcworICAgICAgICAgICAgYXR0cmlidXRlID0gImRhdGFTb3VyY2VOYW1lIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0RGF0YVNvdXJjZU5hbWUKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkaWdlc3QiOworICAgICAgICAgICAgcmVhbG1GbS5zZXREaWdlc3QKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJsb2NhbERhdGFTb3VyY2UiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRMb2NhbERhdGFTb3VyY2UKKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInJvbGVOYW1lQ29sIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0Um9sZU5hbWVDb2wKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyQ3JlZENvbCI7CisgICAgICAgICAgICByZWFsbUZtLnNldFVzZXJDcmVkQ29sCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlck5hbWVDb2wiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRVc2VyTmFtZUNvbAorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJSb2xlVGFibGUiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRVc2VyUm9sZVRhYmxlCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlclRhYmxlIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0VXNlclRhYmxlCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmICJkZWxldGUgdGhpcyByZWFsbSIgb3BlcmF0aW9uIHNob3VsZCBiZSBlbmFibGVkLgorICAgICAqIHRoaXMgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkIGluIGNhc2UgdGhlIHJlYWxtIGlzIHVuZGVyIHNlcnZpY2UsCisgICAgICogaG9zdCBvciBjb250ZXh0IHRoYXQgdGhlIGFkbWluIGFwcCBydW5zIG9uLgorICAgICAqIHJldHVybiAidHJ1ZSIgaWYgZGVsZXRpb24gaXMgYWxsb3dlZC4KKyAgICAgKi8KKworICAgIHByaXZhdGUgU3RyaW5nIGFsbG93RGVsZXRpb24oT2JqZWN0TmFtZSBybmFtZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICBib29sZWFuIHJldFZhbCA9IHRydWU7CisgICAgIHRyeXsKKyAgICAgICAgLy8gYWRtaW4gYXBwJ3MgdmFsdWVzCisgICAgICAgIFN0cmluZyBhZG1pbkhvc3QgPSByZXF1ZXN0LmdldFNlcnZlck5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGFkbWluQ29udGV4dCA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKTsKKworICAgICAgICAvL1N0cmluZyB0aGlzU2VydmljZSA9IHJuYW1lLmdldEtleVByb3BlcnR5KCJzZXJ2aWNlIik7CisgICAgICAgIFN0cmluZyB0aGlzSG9zdCA9IHJuYW1lLmdldEtleVByb3BlcnR5KCJob3N0Iik7CisgICAgICAgIFN0cmluZyB0aGlzQ29udGV4dCA9IHJuYW1lLmdldEtleVByb3BlcnR5KCJwYXRoIik7CisKKyAgICAgICAgLy8gcmVhbG0gaXMgdW5kZXIgY29udGV4dAorICAgICAgICBpZiAodGhpc0NvbnRleHQhPW51bGwpIHsKKyAgICAgICAgICAgIHJldFZhbCA9ICEodGhpc0NvbnRleHQuZXF1YWxzSWdub3JlQ2FzZShhZG1pbkNvbnRleHQpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzSG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyByZWFsbSBpcyB1bmRlciBob3N0CisgICAgICAgICAgICByZXRWYWwgPSAhKHRoaXNIb3N0LmVxdWFsc0lnbm9yZUNhc2UoYWRtaW5Ib3N0KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBYWFggRklYTUUKKyAgICAgICAgICAgIC8vIHJlYWxtIGlzIHVuZGVyIHNlcnZpY2UKKyAgICAgICAgICAgIHJldHVybiAiZmFsc2UiOworICAgICAgICAgICAgLy9yZXRWYWwgPSAhKHRoaXNTZXJ2aWNlLmVxdWFsc0lnbm9yZUNhc2UoYWRtaW5TZXJ2aWNlKSk7CisgICAgICAgIH0KKworICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKCJFcnJvciBnZXR0aW5nIGFkbWluIHNlcnZpY2UsIGhvc3Qgb3IgY29udGV4dCIsIGUpOworICAgICB9CisgICAgICAgIHJldHVybiBuZXcgQm9vbGVhbihyZXRWYWwpLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL0pEQkNSZWFsbUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9KREJDUmVhbG1Gb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlMDRhMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9KREJDUmVhbG1Gb3JtLmphdmEKQEAgLTAsMCArMSwzOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlOworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGpkYmMgcmVhbG0gcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgSkRCQ1JlYWxtRm9ybSBleHRlbmRzIFJlYWxtRm9ybSB7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBkaWdlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGlnZXN0ID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHJvbGVOYW1lQ29sLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJvbGVOYW1lQ29sID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgdXNlck5hbWVDb2wuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlck5hbWVDb2wgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBwYXNzd29yZENvbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZENvbCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBkcml2ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZHJpdmVyID0gbnVsbDsKKyAgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSByb2xlIHRhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJvbGVUYWJsZSA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSB1c2VyIHRhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJUYWJsZSA9IG51bGw7CisgICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgY29ubmVjdGlvbiB1c2VyIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29ubmVjdGlvbk5hbWUgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgY29ubmVjdGlvbiBQYXNzd29yZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb25uZWN0aW9uUGFzc3dvcmQgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgY29ubmVjdGlvbiBVUkwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29ubmVjdGlvblVSTCA9IG51bGw7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaWdlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaWdlc3QoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5kaWdlc3Q7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpZ2VzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaWdlc3QoU3RyaW5nIGRpZ2VzdCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5kaWdlc3QgPSBkaWdlc3Q7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJvbGVOYW1lQ29sLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZU5hbWVDb2woKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5yb2xlTmFtZUNvbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgcm9sZU5hbWVDb2wuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um9sZU5hbWVDb2woU3RyaW5nIHJvbGVOYW1lQ29sKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnJvbGVOYW1lQ29sID0gcm9sZU5hbWVDb2w7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHVzZXJOYW1lQ29sLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlck5hbWVDb2woKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy51c2VyTmFtZUNvbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlck5hbWVDb2wuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlck5hbWVDb2woU3RyaW5nIHVzZXJOYW1lQ29sKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnVzZXJOYW1lQ29sID0gdXNlck5hbWVDb2w7CisgICAgICAgIAorICAgIH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRyaXZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERyaXZlcigpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmRyaXZlcjsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgZHJpdmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERyaXZlcihTdHJpbmcgZHJpdmVyKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmRyaXZlciA9IGRyaXZlcjsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcm9sZSB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGVUYWJsZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnJvbGVUYWJsZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgcm9sZVRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVUYWJsZShTdHJpbmcgcm9sZVRhYmxlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnJvbGVUYWJsZSA9IHJvbGVUYWJsZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlciB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJUYWJsZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnVzZXJUYWJsZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlciBUYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyVGFibGUoU3RyaW5nIHVzZXJUYWJsZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy51c2VyVGFibGUgPSB1c2VyVGFibGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhc3N3b3JkQ29sLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmRDb2woKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5wYXNzd29yZENvbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFzc3dvcmRDb2wuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRDb2woU3RyaW5nIHBhc3N3b3JkQ29sKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnBhc3N3b3JkQ29sID0gcGFzc3dvcmRDb2w7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbm5lY3Rpb24gbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25OYW1lKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbk5hbWU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbm5lY3Rpb25OYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25OYW1lKFN0cmluZyBjb25uZWN0aW9uTmFtZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uTmFtZSA9IGNvbm5lY3Rpb25OYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25uZWN0aW9uIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvblBhc3N3b3JkKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblBhc3N3b3JkOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb25uZWN0aW9uIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25QYXNzd29yZChTdHJpbmcgY29ubmVjdGlvblBhc3N3b3JkKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmNvbm5lY3Rpb25QYXNzd29yZCA9IGNvbm5lY3Rpb25QYXNzd29yZDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29ubmVjdGlvbiBVUkwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uVVJMKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblVSTDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgY29ubmVjdGlvblVSTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uVVJMKFN0cmluZyBjb25uZWN0aW9uVVJMKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmNvbm5lY3Rpb25VUkwgPSBjb25uZWN0aW9uVVJMOworICAgICAgICAKKyAgICB9ICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIAorICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsgICAKKyAgICAgICAgdGhpcy5kaWdlc3QgPSBudWxsOworICAgICAgICB0aGlzLmRyaXZlciA9IG51bGw7CisgICAgICAgIAorICAgICAgICB0aGlzLnJvbGVOYW1lQ29sID0gbnVsbDsKKyAgICAgICAgdGhpcy51c2VyTmFtZUNvbCA9IG51bGw7CisgICAgICAgIHRoaXMucGFzc3dvcmRDb2wgPSBudWxsOworICAgICAgICB0aGlzLnVzZXJUYWJsZSA9IG51bGw7CisgICAgICAgIHRoaXMucm9sZVRhYmxlID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHRoaXMuY29ubmVjdGlvbk5hbWUgPSBudWxsOworICAgICAgICB0aGlzLmNvbm5lY3Rpb25QYXNzd29yZCA9IG51bGw7CisgICAgICAgIHRoaXMuY29ubmVjdGlvblVSTCA9IG51bGw7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgdGhpcyBvYmplY3QgYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJVc2VyRGF0YWJhc2VSZWFsbUZvcm1bYWRtaW5BY3Rpb249Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRBZG1pbkFjdGlvbigpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsZGlnZXN0PSIpOworICAgICAgICBzYi5hcHBlbmQoZGlnZXN0KTsKKyAgICAgICAgc2IuYXBwZW5kKCInLGRyaXZlcj0nIik7CisgICAgICAgIHNiLmFwcGVuZChkcml2ZXIpOworICAgICAgICBzYi5hcHBlbmQoIicscm9sZU5hbWVDb2w9Iik7CisgICAgICAgIHNiLmFwcGVuZChyb2xlTmFtZUNvbCk7CisgICAgICAgIHNiLmFwcGVuZCgiJyx1c2VyTmFtZUNvbD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHVzZXJOYW1lQ29sKTsKKyAgICAgICAgc2IuYXBwZW5kKCIscGFzc3dvcmRDb2w9Iik7CisgICAgICAgIHNiLmFwcGVuZChwYXNzd29yZENvbCk7CisgICAgICAgIHNiLmFwcGVuZCgiJyx1c2VyVGFibGU9JyIpOworICAgICAgICBzYi5hcHBlbmQodXNlclRhYmxlKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHJvbGVUYWJsZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHJvbGVUYWJsZSk7CisgICAgICAgIHNiLmFwcGVuZCgiLGNvbm5lY3Rpb25OYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQoY29ubmVjdGlvbk5hbWUpOyAgICAgICAgCisgICAgICAgIHNiLmFwcGVuZCgiJyxjb25uZWN0aW9uUGFzc3dvcmQ9Iik7CisgICAgICAgIHNiLmFwcGVuZChjb25uZWN0aW9uUGFzc3dvcmQpOworICAgICAgICBzYi5hcHBlbmQoIixjb25uZWN0aW9uVVJMPSIpOworICAgICAgICBzYi5hcHBlbmQoY29ubmVjdGlvblVSTCk7CisgICAgICAgIHNiLmFwcGVuZCgiJyxvYmplY3ROYW1lPSciKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldE9iamVjdE5hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyxyZWFsbVR5cGU9Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRSZWFsbVR5cGUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBmcm9tIHRoaXMgSFRUUCByZXF1ZXN0LAorICAgICAqIGFuZCByZXR1cm4gYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW55CisgICAgICogdmFsaWRhdGlvbiBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gZm91bmQuICBJZiBubyBlcnJvcnMgYXJlIGZvdW5kLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB3aXRoIG5vCisgICAgICogcmVjb3JkZWQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIAorICAgIHB1YmxpYyBBY3Rpb25FcnJvcnMgdmFsaWRhdGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIAorICAgICAgICBBY3Rpb25FcnJvcnMgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworICAgICAgICAKKyAgICAgICAgLy8gZnJvbnQgZW5kIHZhbGlkYXRpb24gd2hlbiBzYXZlIGlzIGNsaWNrZWQuICAgICAgICAKKyAgICAgICAgaWYgKChkcml2ZXIgPT0gbnVsbCkgfHwgKGRyaXZlci5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJkcml2ZXIiLAorICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLmRyaXZlci5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorICAgICAKKyAgICAgICAgaWYgKChyb2xlTmFtZUNvbCA9PSBudWxsKSB8fCAocm9sZU5hbWVDb2wubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgicm9sZU5hbWVDb2wiLAorICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLnJvbGVOYW1lQ29sLnJlcXVpcmVkIikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh1c2VyTmFtZUNvbCA9PSBudWxsKSB8fCAodXNlck5hbWVDb2wubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgidXNlck5hbWVDb2wiLAorICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLnVzZXJOYW1lQ29sLnJlcXVpcmVkIikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwYXNzd29yZENvbCA9PSBudWxsKSB8fCAocGFzc3dvcmRDb2wubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgicGFzc3dvcmRDb2wiLAorICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLnBhc3N3b3JkQ29sLnJlcXVpcmVkIikpOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKCh1c2VyVGFibGUgPT0gbnVsbCkgfHwgKHVzZXJUYWJsZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJ1c2VyVGFibGUiLAorICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLnVzZXJUYWJsZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIGlmICgocm9sZVRhYmxlID09IG51bGwpIHx8IChyb2xlVGFibGUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgicm9sZVRhYmxlIiwKKyAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5yb2xlVGFibGUucmVxdWlyZWQiKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICgoY29ubmVjdGlvbk5hbWUgPT0gbnVsbCkgfHwgKGNvbm5lY3Rpb25OYW1lLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoImNvbm5lY3Rpb25OYW1lIiwKKyAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5jb25uZWN0aW9uTmFtZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKChjb25uZWN0aW9uUGFzc3dvcmQgPT0gbnVsbCkgfHwgKGNvbm5lY3Rpb25QYXNzd29yZC5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJjb25uZWN0aW9uUGFzc3dvcmQiLAorICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLmNvbm5lY3Rpb25QYXNzd29yZC5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKChjb25uZWN0aW9uVVJMID09IG51bGwpIHx8IChjb25uZWN0aW9uVVJMLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoImNvbm5lY3Rpb25VUkwiLAorICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLmNvbm5lY3Rpb25VUkwucmVxdWlyZWQiKSk7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgCisgICAgICAgIHJldHVybiBlcnJvcnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL0pORElSZWFsbUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9KTkRJUmVhbG1Gb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwODNhNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9KTkRJUmVhbG1Gb3JtLmphdmEKQEAgLTAsMCArMSw1OTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgSk5ESSByZWFsbSBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBKTkRJUmVhbG1Gb3JtIGV4dGVuZHMgUmVhbG1Gb3JtIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBjb25uZWN0aW9uIHVzZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb25uZWN0aW9uTmFtZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGNvbm5lY3Rpb24gUGFzc3dvcmQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29ubmVjdGlvblBhc3N3b3JkID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgY29ubmVjdGlvbiBVUkwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29ubmVjdGlvblVSTCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGNvbnRleHQgRmFjdG9yeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb250ZXh0RmFjdG9yeSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGRpZ2VzdCBhbGdvcml0aG0uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGlnZXN0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgcm9sZSBCYXNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJvbGVCYXNlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgcm9sZSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJvbGVOYW1lID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgcm9sZSBQYXR0ZXJuLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJvbGVQYXR0ZXJuID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNob3VsZCB3ZSBzZWFyY2ggdGhlIGVudGlyZSBzdWJ0cmVlIGZvciBtYXRjaGluZyByb2xlcz8KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByb2xlU3VidHJlZSA9ICJmYWxzZSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHVzZXIgQmFzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2VyQmFzZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHVzZXIgUGFzc3dvcmQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlclBhc3N3b3JkID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgdXNlciBQYXR0ZXJuLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJQYXR0ZXJuID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgdXNlciByb2xlIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlclJvbGVOYW1lID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgdXNlciBTZWFyY2guCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlclNlYXJjaCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgd2Ugc2VhcmNoIHRoZSBlbnRpcmUgc3VidHJlZSBmb3IgbWF0Y2hpbmcgdXNlcnM/CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlclN1YnRyZWUgPSAiZmFsc2UiOworCisgICAgLyoqCisgICAgICogU2V0IG9mIHZhbGlkIHZhbHVlcyBmb3Igc2VhcmNoIHN1YnRyZWVzKHRydWUvZmFsc2UpLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdCBzZWFyY2hWYWxzID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlYXJjaCBWYWxzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldFNlYXJjaFZhbHMoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoVmFsczsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2VhcmNoIFZhbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VhcmNoVmFscyhMaXN0IHNlYXJjaFZhbHMpIHsKKworICAgICAgICB0aGlzLnNlYXJjaFZhbHMgPSBzZWFyY2hWYWxzOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByb2xlU3VidHJlZSBib29sZWFuIFRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSb2xlU3VidHJlZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5yb2xlU3VidHJlZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcm9sZVN1YnRyZWUgVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xlU3VidHJlZShTdHJpbmcgcm9sZVN1YnRyZWUpIHsKKworICAgICAgICB0aGlzLnJvbGVTdWJ0cmVlID0gcm9sZVN1YnRyZWU7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHVzZXJTdWJ0cmVlIGJvb2xlYW4gVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJTdWJ0cmVlKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnVzZXJTdWJ0cmVlOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VyU3VidHJlZSBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJTdWJ0cmVlKFN0cmluZyB1c2VyU3VidHJlZSkgeworCisgICAgICAgIHRoaXMudXNlclN1YnRyZWUgPSB1c2VyU3VidHJlZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlnZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlnZXN0KCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmRpZ2VzdDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlnZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpZ2VzdChTdHJpbmcgZGlnZXN0KSB7CisKKyAgICAgICAgdGhpcy5kaWdlc3QgPSBkaWdlc3Q7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJvbGVCYXNlIC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGVCYXNlKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnJvbGVCYXNlIDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcm9sZUJhc2UgLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVCYXNlKFN0cmluZyByb2xlQmFzZSApIHsKKworICAgICAgICB0aGlzLnJvbGVCYXNlICA9IHJvbGVCYXNlIDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcm9sZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZU5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMucm9sZU5hbWUgOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSByb2xlIG5hbWUgQXR0cmlidXRlIC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgcm9sZU5hbWUpIHsKKworICAgICAgICB0aGlzLnJvbGVOYW1lICA9IHJvbGVOYW1lIDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlckJhc2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyQmFzZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy51c2VyQmFzZSA7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVzZXJCYXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJCYXNlKFN0cmluZyB1c2VyQmFzZSApIHsKKworICAgICAgICB0aGlzLnVzZXJCYXNlICA9IHVzZXJCYXNlIDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlciByb2xlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyUm9sZU5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMudXNlclJvbGVOYW1lIDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlciByb2xlIG5hbWUgQXR0cmlidXRlIC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyUm9sZU5hbWUoU3RyaW5nIHVzZXJSb2xlTmFtZSkgeworCisgICAgICAgIHRoaXMudXNlclJvbGVOYW1lICA9IHVzZXJSb2xlTmFtZSA7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJvbGUgUGF0dGVybgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZVBhdHRlcm4oKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMucm9sZVBhdHRlcm4gOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSByb2xlIFBhdHRlcm4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um9sZVBhdHRlcm4oU3RyaW5nIHJvbGVQYXR0ZXJuICkgeworCisgICAgICAgIHRoaXMucm9sZVBhdHRlcm4gID0gcm9sZVBhdHRlcm4gOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VyIFBhc3N3b3JkIC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJQYXNzd29yZCgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy51c2VyUGFzc3dvcmQgOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VyIFBhc3N3b3JkIC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyUGFzc3dvcmQoU3RyaW5nIHVzZXJQYXNzd29yZCApIHsKKworICAgICAgICB0aGlzLnVzZXJQYXNzd29yZCAgPSB1c2VyUGFzc3dvcmQgOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHVzZXIgUGF0dGVybiAuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyUGF0dGVybigpIHsKKworICAgICAgICByZXR1cm4gdGhpcy51c2VyUGF0dGVybiAgOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VyIHVzZXIgUGF0dGVybiAgLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJQYXR0ZXJuKFN0cmluZyB1c2VyUGF0dGVybikgeworCisgICAgICAgIHRoaXMudXNlclBhdHRlcm4gICA9IHVzZXJQYXR0ZXJuICA7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHVzZXIgU2VhcmNoLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlclNlYXJjaCgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy51c2VyU2VhcmNoOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VyIHVzZXIgU2VhcmNoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJTZWFyY2goU3RyaW5nIHVzZXJTZWFyY2gpIHsKKworICAgICAgICB0aGlzLnVzZXJTZWFyY2ggID0gdXNlclNlYXJjaDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29ubmVjdGlvbiBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbk5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbk5hbWU7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbm5lY3Rpb25OYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25OYW1lKFN0cmluZyBjb25uZWN0aW9uTmFtZSkgeworCisgICAgICAgIHRoaXMuY29ubmVjdGlvbk5hbWUgPSBjb25uZWN0aW9uTmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25uZWN0aW9uIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvblBhc3N3b3JkKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25QYXNzd29yZDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29ubmVjdGlvbiBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUGFzc3dvcmQoU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCkgeworCisgICAgICAgIHRoaXMuY29ubmVjdGlvblBhc3N3b3JkID0gY29ubmVjdGlvblBhc3N3b3JkOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbm5lY3Rpb24gVVJMLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvblVSTCgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uVVJMOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb25uZWN0aW9uVVJMLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25VUkwoU3RyaW5nIGNvbm5lY3Rpb25VUkwpIHsKKworICAgICAgICB0aGlzLmNvbm5lY3Rpb25VUkwgPSBjb25uZWN0aW9uVVJMOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb250ZXh0IEZhY3RvcnkgLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dEZhY3RvcnkoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dEZhY3RvcnkgOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb250ZXh0IEZhY3RvcnkgLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRGYWN0b3J5KFN0cmluZyBjb250ZXh0RmFjdG9yeSApIHsKKworICAgICAgICB0aGlzLmNvbnRleHRGYWN0b3J5ICA9IGNvbnRleHRGYWN0b3J5IDsKKworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsKKyAgICAgICAgdGhpcy5yb2xlU3VidHJlZT0iZmFsc2UiOworICAgICAgICB0aGlzLnVzZXJTdWJ0cmVlPSJmYWxzZSI7CisKKyAgICAgICAgdGhpcy5kaWdlc3QgPSBudWxsOworICAgICAgICB0aGlzLnJvbGVOYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy51c2VyUm9sZU5hbWUgPSBudWxsOworCisgICAgICAgIHRoaXMuY29ubmVjdGlvbk5hbWUgPSBudWxsOworICAgICAgICB0aGlzLmNvbm5lY3Rpb25QYXNzd29yZCA9IG51bGw7CisgICAgICAgIHRoaXMuY29ubmVjdGlvblVSTCA9IG51bGw7CisKKyAgICAgICAgdGhpcy5yb2xlUGF0dGVybiA9IG51bGw7CisgICAgICAgIHRoaXMucm9sZUJhc2UgPSBudWxsOworICAgICAgICB0aGlzLnVzZXJCYXNlID0gbnVsbDsKKyAgICAgICAgdGhpcy51c2VyUGFzc3dvcmQgPSBudWxsOworICAgICAgICB0aGlzLnVzZXJQYXR0ZXJuID0gbnVsbDsKKyAgICAgICAgdGhpcy51c2VyU2VhcmNoID0gbnVsbDsKKyAgICAgICAgdGhpcy5jb250ZXh0RmFjdG9yeSA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVuZGVyIHRoaXMgb2JqZWN0IGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVXNlckRhdGFiYXNlUmVhbG1Gb3JtW2FkbWluQWN0aW9uPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0QWRtaW5BY3Rpb24oKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLHVzZXJTdWJ0cmVlPSIpOworICAgICAgICBzYi5hcHBlbmQodXNlclN1YnRyZWUpOworICAgICAgICBzYi5hcHBlbmQoIixyb2xlU3VidHJlZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHJvbGVTdWJ0cmVlKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsZGlnZXN0PSIpOworICAgICAgICBzYi5hcHBlbmQoZGlnZXN0KTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHVzZXJSb2xlTmFtZT0nIik7CisgICAgICAgIHNiLmFwcGVuZCh1c2VyUm9sZU5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIicscm9sZU5hbWU9JyIpOworICAgICAgICBzYi5hcHBlbmQocm9sZU5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIicsY29ubmVjdGlvbk5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChjb25uZWN0aW9uTmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiLGNvbm5lY3Rpb25QYXNzd29yZD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGNvbm5lY3Rpb25QYXNzd29yZCk7CisgICAgICAgIHNiLmFwcGVuZCgiJyxjb25uZWN0aW9uVVJMPSciKTsKKyAgICAgICAgc2IuYXBwZW5kKGNvbm5lY3Rpb25VUkwpOworICAgICAgICBzYi5hcHBlbmQoIicscm9sZVBhdHRlcm49Iik7CisgICAgICAgIHNiLmFwcGVuZChyb2xlUGF0dGVybik7CisgICAgICAgIHNiLmFwcGVuZCgiLHJvbGVCYXNlPSIpOworICAgICAgICBzYi5hcHBlbmQocm9sZUJhc2UpOworICAgICAgICBzYi5hcHBlbmQoIicsdXNlclBhc3N3b3JkPSciKTsKKyAgICAgICAgc2IuYXBwZW5kKHVzZXJQYXNzd29yZCk7CisgICAgICAgIHNiLmFwcGVuZCgiLHVzZXJCYXNlPSIpOworICAgICAgICBzYi5hcHBlbmQodXNlckJhc2UpOworICAgICAgICBzYi5hcHBlbmQoIicsdXNlclBhdHRlcm49Iik7CisgICAgICAgIHNiLmFwcGVuZCh1c2VyUGF0dGVybik7CisgICAgICAgIHNiLmFwcGVuZCgiJyx1c2VyU2VhcmNoPSIpOworICAgICAgICBzYi5hcHBlbmQodXNlclNlYXJjaCk7CisgICAgICAgIHNiLmFwcGVuZCgiLGNvbnRleHRGYWN0b3J5PSIpOworICAgICAgICBzYi5hcHBlbmQoY29udGV4dEZhY3RvcnkpOworICAgICAgICBzYi5hcHBlbmQoIicsb2JqZWN0TmFtZT0nIik7CisgICAgICAgIHNiLmFwcGVuZChnZXRPYmplY3ROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIicscmVhbG1UeXBlPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0UmVhbG1UeXBlKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBmcm9tIHRoaXMgSFRUUCByZXF1ZXN0LAorICAgICAqIGFuZCByZXR1cm4gYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW55CisgICAgICogdmFsaWRhdGlvbiBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gZm91bmQuICBJZiBubyBlcnJvcnMgYXJlIGZvdW5kLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB3aXRoIG5vCisgICAgICogcmVjb3JkZWQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBBY3Rpb25FcnJvcnMgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworCisgICAgICAgIC8vIGZyb250IGVuZCB2YWxpZGF0aW9uIHdoZW4gc2F2ZSBpcyBjbGlja2VkLgorICAgICAgICAvLyB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgcmVxdWlyZWQuCisKKyAgICAgICAgaWYgKChjb25uZWN0aW9uVVJMID09IG51bGwpIHx8IChjb25uZWN0aW9uVVJMLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoImNvbm5lY3Rpb25VUkwiLAorICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLmNvbm5VUkwucmVxdWlyZWQiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBFaXRoZXIgdXNlclBhdHRlcm4gb3IgdXNlclNlYXJjaCBzaG91bGQgYmUgc3BlY2lmaWVkIG5vdCBib3RoCisgICAgICAgIGJvb2xlYW4gaXNVc2VyUGF0dGVyblNwZWNpZmllZCA9IGZhbHNlOworICAgICAgICBib29sZWFuIGlzVXNlclNlYXJjaFNwZWNpZmllZCA9IGZhbHNlOworICAgICAgICBpZiAoKHVzZXJQYXR0ZXJuICE9IG51bGwpICYmICh1c2VyUGF0dGVybi5sZW5ndGgoKSA+IDApKSB7CisgICAgICAgICAgICBpc1VzZXJQYXR0ZXJuU3BlY2lmaWVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgodXNlclNlYXJjaCAhPSBudWxsKSAmJiAodXNlclNlYXJjaC5sZW5ndGgoKSA+IDApKSB7CisgICAgICAgICAgICBpc1VzZXJTZWFyY2hTcGVjaWZpZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzVXNlclBhdHRlcm5TcGVjaWZpZWQgJiYgaXNVc2VyU2VhcmNoU3BlY2lmaWVkKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJ1c2VyUGF0dGVybiIgLAorICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLnVzZXJQYXR0ZXJuLnVzZXJTZWFyY2guZGVmaW5lZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qaWYgKChkaWdlc3QgPT0gbnVsbCkgfHwgKGRpZ2VzdC5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJkaWdlc3QiLAorICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLmRpZ2VzdC5yZXF1aXJlZCIpKTsKKyAgICAgICAgfSAqLworCisgICAgICAgIC8qaWYgKChyb2xlTmFtZSA9PSBudWxsKSB8fCAocm9sZU5hbWUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgicm9sZU5hbWUiLAorICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLnJvbGVOYW1lLnJlcXVpcmVkIikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh1c2VyUm9sZU5hbWUgPT0gbnVsbCkgfHwgKHVzZXJSb2xlTmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJ1c2VyUm9sZU5hbWUiLAorICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLnVzZXJSb2xlTmFtZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocm9sZVBhdHRlcm4gPT0gbnVsbCkgfHwgKHJvbGVQYXR0ZXJuLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoInJvbGVQYXR0ZXJuIiwKKyAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5yb2xlUGF0dGVybi5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocm9sZUJhc2UgPT0gbnVsbCkgfHwgKHJvbGVCYXNlLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoInJvbGVCYXNlIiwKKyAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5yb2xlQmFzZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgodXNlckJhc2UgPT0gbnVsbCkgfHwgKHVzZXJCYXNlLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoInVzZXJCYXNlIiwKKyAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci51c2VyQmFzZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgodXNlclBhc3N3b3JkID09IG51bGwpIHx8ICh1c2VyUGFzc3dvcmQubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgidXNlclBhc3N3b3JkIiwKKyAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci51c2VyUGFzc3dvcmQucmVxdWlyZWQiKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHVzZXJQYXR0ZXJuID09IG51bGwpIHx8ICh1c2VyUGF0dGVybi5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJ1c2VyUGF0dGVybiIsCisgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IudXNlclBhdHRlcm4ucmVxdWlyZWQiKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHVzZXJTZWFyY2ggPT0gbnVsbCkgfHwgKHVzZXJTZWFyY2gubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgidXNlclNlYXJjaCIsCisgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IudXNlclNlYXJjaC5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoY29ubmVjdGlvbk5hbWUgPT0gbnVsbCkgfHwgKGNvbm5lY3Rpb25OYW1lLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoImNvbm5lY3Rpb25OYW1lIiwKKyAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5jb25uTmFtZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoY29ubmVjdGlvblBhc3N3b3JkID09IG51bGwpIHx8IChjb25uZWN0aW9uUGFzc3dvcmQubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgiY29ubmVjdGlvblBhc3N3b3JkIiwKKyAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5jb25uUGFzc3dvcmQucmVxdWlyZWQiKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGNvbnRleHRGYWN0b3J5ID09IG51bGwpIHx8IChjb250ZXh0RmFjdG9yeS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJjb250ZXh0RmFjdG9yeSIsCisgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IuY29udGV4dEZhY3RvcnkucmVxdWlyZWQiKSk7CisgICAgICAgIH0gKi8KKworICAgICAgICByZXR1cm4gZXJyb3JzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9NZW1vcnlSZWFsbUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9NZW1vcnlSZWFsbUZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmIyMDdiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL01lbW9yeVJlYWxtRm9ybS5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZTsKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBtZW1vcnkgcmVhbG0gcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgTWVtb3J5UmVhbG1Gb3JtIGV4dGVuZHMgUmVhbG1Gb3JtIHsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBwYXRoIE5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aE5hbWUgPSBudWxsOworICAgICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgICAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdGggTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhOYW1lKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucGF0aE5hbWU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoTmFtZShTdHJpbmcgcGF0aE5hbWUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMucGF0aE5hbWUgPSBwYXRoTmFtZTsKKyAgICAgICAgCisgICAgfQorICAgICAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOworICAgICAgICB0aGlzLnBhdGhOYW1lID0gbnVsbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgLyoqCisgICAgICogUmVuZGVyIHRoaXMgb2JqZWN0IGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVXNlckRhdGFiYXNlUmVhbG1Gb3JtW2FkbWluQWN0aW9uPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0QWRtaW5BY3Rpb24oKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLHBhdGhuYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQocGF0aE5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIicsb2JqZWN0TmFtZT0nIik7CisgICAgICAgIHNiLmFwcGVuZChnZXRPYmplY3ROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIicscmVhbG1UeXBlPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0UmVhbG1UeXBlKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBmcm9tIHRoaXMgSFRUUCByZXF1ZXN0LAorICAgICAqIGFuZCByZXR1cm4gYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW55CisgICAgICogdmFsaWRhdGlvbiBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gZm91bmQuICBJZiBubyBlcnJvcnMgYXJlIGZvdW5kLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB3aXRoIG5vCisgICAgICogcmVjb3JkZWQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIAorICAgIHB1YmxpYyBBY3Rpb25FcnJvcnMgdmFsaWRhdGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIAorICAgICAgICBBY3Rpb25FcnJvcnMgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworCisgICAgICAgIC8vIGZyb250IGVuZCB2YWxpZGF0aW9uIHdoZW4gc2F2ZSBpcyBjbGlja2VkLgorICAgICAgICBpZiAoKHBhdGhOYW1lID09IG51bGwpIHx8IChwYXRoTmFtZS5sZW5ndGgoKTwxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgicGF0aE5hbWUiLAorICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLnBhdGhOYW1lLnJlcXVpcmVkIikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vUmVhbG1Gb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vUmVhbG1Gb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ2OTRlYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9SZWFsbUZvcm0uamF2YQpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG07CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGdlbmVyaWMgcmVhbG0gcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVhbG1Gb3JtIGV4dGVuZHMgQWN0aW9uRm9ybSB7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgCisgICAvKioKKyAgICAgKiBUaGUgYWRtaW5pc3RyYXRpdmUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9ybS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhZG1pbkFjdGlvbiA9ICJFZGl0IjsKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZSBvZiB0aGUgcmVhbG0gdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBvYmplY3ROYW1lID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHJlYWxtIHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVhbG1UeXBlID0gbnVsbDsKKyAgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBub2RlIGxhYmVsLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5vZGVMYWJlbCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lIG9mIHRoZSBwYXJlbnQgb2YgdGhpcyByZWFsbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXJlbnRPYmplY3ROYW1lID0gbnVsbDsKKyAgICAgICAgCisgICAgLyoqCisgICAgICogU2V0IG9mIHZhbGlkIHZhbHVlcyBmb3IgcmVhbG1zLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdCByZWFsbVR5cGVWYWxzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB3aGV0aGVyICJkZWxldGUgdGhpcyByZWFsbSIgb3BlcmF0aW9uIGlzIGFsbG93ZWQKKyAgICAgKiBvbiB0aGUgcmVhbG0gb3Igbm90LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFsbG93RGVsZXRpb24gPSBudWxsOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWRtaW5pc3RyYXRpdmUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9ybS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFkbWluQWN0aW9uKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmFkbWluQWN0aW9uOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFkbWluQWN0aW9uKFN0cmluZyBhZG1pbkFjdGlvbikgeworCisgICAgICAgIHRoaXMuYWRtaW5BY3Rpb24gPSBhZG1pbkFjdGlvbjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgT2JqZWN0IE5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPYmplY3ROYW1lKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0TmFtZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgT2JqZWN0IE5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0TmFtZShTdHJpbmcgb2JqZWN0TmFtZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5vYmplY3ROYW1lID0gb2JqZWN0TmFtZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVhbG0gdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxtVHlwZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnJlYWxtVHlwZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVhbG0gdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWFsbVR5cGUoU3RyaW5nIHJlYWxtVHlwZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5yZWFsbVR5cGUgPSByZWFsbVR5cGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxhYmVsIG9mIHRoZSBub2RlIHRoYXQgd2FzIGNsaWNrZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROb2RlTGFiZWwoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5ub2RlTGFiZWw7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5vZGUgbGFiZWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9kZUxhYmVsKFN0cmluZyBub2RlTGFiZWwpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMubm9kZUxhYmVsID0gbm9kZUxhYmVsOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXJlbnQgb2JqZWN0IG5hbWUgb2YgdGhlIHJlYWxtIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnRPYmplY3ROYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnBhcmVudE9iamVjdE5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFyZW50IG9iamVjdCBuYW1lIG9mIHRoZSByZWFsbSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudE9iamVjdE5hbWUoU3RyaW5nIHBhcmVudE9iamVjdE5hbWUpIHsKKworICAgICAgICB0aGlzLnBhcmVudE9iamVjdE5hbWUgPSBwYXJlbnRPYmplY3ROYW1lOworCisgICAgfQorICAgIAorICAgICAgICAKKyAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVhbG1UeXBlVmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRSZWFsbVR5cGVWYWxzKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucmVhbG1UeXBlVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVhbG1UeXBlVmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWFsbVR5cGVWYWxzKExpc3QgcmVhbG1UeXBlVmFscykgeworICAgICAgICAKKyAgICAgICAgdGhpcy5yZWFsbVR5cGVWYWxzID0gcmVhbG1UeXBlVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWxsb3cgZGVsZXRpb24gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBbGxvd0RlbGV0aW9uKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuYWxsb3dEZWxldGlvbjsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgYWxsb3cgRGVsZXRpb24gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxsb3dEZWxldGlvbihTdHJpbmcgYWxsb3dEZWxldGlvbikgeworICAgICAgICAKKyAgICAgICAgdGhpcy5hbGxvd0RlbGV0aW9uID0gYWxsb3dEZWxldGlvbjsKKyAgICAgICAgCisgICAgfQorICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIG9iamVjdE5hbWUgPSBudWxsOworICAgICAgICBhZG1pbkFjdGlvbiA9ICJFZGl0IjsKKyAgICAgICAgCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vUmVhbG1zRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1JlYWxtc0Zvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDNhYzVmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1JlYWxtc0Zvcm0uamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbTsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgZGVsZXRpbmcgcmVhbG1zLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZWFsbXNGb3JtIGV4dGVuZHMgQWN0aW9uRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWVzIG9mIHRoZSByZWFsbXMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZWFsbXNbXSA9IG5ldyBTdHJpbmdbMF07CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVhbG1zKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucmVhbG1zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWFsbXMoU3RyaW5nIHJlYWxtc1tdKSB7CisgICAgICAgIHRoaXMucmVhbG1zID0gcmVhbG1zOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgdGhpcy5yZWFsbXMgPSBuZXcgU3RyaW5nWzBdOworCisgICAgfQorICAgICAgICAKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1NhdmVEYXRhU291cmNlUmVhbG1BY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9TYXZlRGF0YVNvdXJjZVJlYWxtQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyZGRiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9TYXZlRGF0YVNvdXJjZVJlYWxtQWN0aW9uLmphdmEKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtOworCisKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbE5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmUuVmFsdmVVdGlsOworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgY29tcGxldGVzIDxlbT5BZGQgUmVhbG08L2VtPiBhbmQKKyAqIDxlbT5FZGl0IFJlYWxtPC9lbT4gdHJhbnNhY3Rpb25zIGZvciBEYXRhU291cmNlIHJlYWxtLgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZURhdGFTb3VyY2VSZWFsbUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+Y3JlYXRlRGF0YVNvdXJjZVJlYWxtPC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlRGF0YVNvdXJjZVJlYWxtVHlwZXNbXSA9CisgICAgeyAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBwYXJlbnQKKyAgICAgICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIGRhdGFTb3VyY2VOYW1lCisgICAgICAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyByb2xlTmFtZUNvbAorICAgICAgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gdXNlckNyZWRDb2wKKyAgICAgICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIHVzZXJOYW1lQ29sCisgICAgICAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyB1c2VyUm9sZVRhYmxlCisgICAgICAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyB1c2VyVGFibGUKKyAgICB9OworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBJZGVudGlmeSB0aGUgcmVxdWVzdGVkIGFjdGlvbgorICAgICAgICBEYXRhU291cmNlUmVhbG1Gb3JtIHJmb3JtID0gKERhdGFTb3VyY2VSZWFsbUZvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBhZG1pbkFjdGlvbiA9IHJmb3JtLmdldEFkbWluQWN0aW9uKCk7CisgICAgICAgIFN0cmluZyByT2JqZWN0TmFtZSA9IHJmb3JtLmdldE9iamVjdE5hbWUoKTsKKworICAgICAgICAvLyBQZXJmb3JtIGEgIkNyZWF0ZSBEYXRhU291cmNlIFJlYWxtIiB0cmFuc2FjdGlvbiAoaWYgcmVxdWVzdGVkKQorICAgICAgICBpZiAoIkNyZWF0ZSIuZXF1YWxzKGFkbWluQWN0aW9uKSkgeworCisgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZXNbXSA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyZW50ID0gcmZvcm0uZ2V0UGFyZW50T2JqZWN0TmFtZSgpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTdHJpbmcgb2JqZWN0TmFtZSA9IFZhbHZlVXRpbC5nZXRPYmplY3ROYW1lKHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvbWNhdFRyZWVCdWlsZGVyLlJFQUxNX1RZUEUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgcG5hbWUgPSBuZXcgT2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIocG5hbWUuZ2V0RG9tYWluKCkpOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gRm9yIHNlcnZpY2UsIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBFbmdpbmUgbUJlYW4gIAorICAgICAgICAgICAgICAgIC8vIFBhcmVudCBpbiB0aGlzIGNhc2UgbmVlZHMgdG8gYmUgdGhlIGNvbnRhaW5lciBtQmVhbiBmb3IgdGhlIHNlcnZpY2UgCisgICAgICAgICAgICAgICAgdHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoIlNlcnZpY2UiLmVxdWFsc0lnbm9yZUNhc2UocG5hbWUuZ2V0S2V5UHJvcGVydHkoInR5cGUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiOnR5cGU9RW5naW5lIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzYi50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAiZXJyb3IuZW5naW5lTmFtZS5iYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZyhtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSByZXF1ZXN0ZWQgdXNlciBkYXRhYmFzZSBuYW1lIGlzIHVuaXF1ZQorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAobUJTZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBBY3Rpb25NZXNzYWdlcyBlcnJvcnMgPSBuZXcgQWN0aW9uTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgicmVhbG1OYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IucmVhbG1OYW1lLmV4aXN0cyIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZUVycm9ycyhyZXF1ZXN0LCBlcnJvcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBY3Rpb25Gb3J3YXJkKG1hcHBpbmcuZ2V0SW5wdXQoKSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSBvbmFtZS5nZXREb21haW4oKTsKKyAgICAgICAgICAgICAgICAvLyBMb29rIHVwIG91ciBNQmVhbkZhY3RvcnkgTUJlYW4KKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIGZuYW1lID0gCisgICAgICAgICAgICAgICAgICAgIFRvbWNhdFRyZWVCdWlsZGVyLmdldE1CZWFuRmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IERhdGFTb3VyY2VSZWFsbSBvYmplY3QKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nWzddOworICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IHBhcmVudDsKKwkJdmFsdWVzWzFdID0gcmZvcm0uZ2V0RGF0YVNvdXJjZU5hbWUoKTsKKwkJdmFsdWVzWzJdID0gcmZvcm0uZ2V0Um9sZU5hbWVDb2woKTsKKwkJdmFsdWVzWzNdID0gcmZvcm0uZ2V0VXNlckNyZWRDb2woKTsKKwkJdmFsdWVzWzRdID0gcmZvcm0uZ2V0VXNlck5hbWVDb2woKTsKKwkJdmFsdWVzWzVdID0gcmZvcm0uZ2V0VXNlclJvbGVUYWJsZSgpOworICAgICAgICAgICAgICAgIHZhbHVlc1s2XSA9IHJmb3JtLmdldFVzZXJUYWJsZSgpOworICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJjcmVhdGVEYXRhU291cmNlUmVhbG0iOworICAgICAgICAgICAgICAgIHJPYmplY3ROYW1lID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuaW52b2tlKGZuYW1lLCBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIGNyZWF0ZURhdGFTb3VyY2VSZWFsbVR5cGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChyT2JqZWN0TmFtZT09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgid2FybmluZyIsICJlcnJvci5kYXRhc291cmNlcmVhbG0iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFVuc3VjY2Vzc2Z1bCIpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5ldyBSZWFsbSB0byBvdXIgdHJlZSBjb250cm9sIG5vZGUKKyAgICAgICAgICAgICAgICBUcmVlQ29udHJvbCBjb250cm9sID0gKFRyZWVDb250cm9sKQorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEF0dHJpYnV0ZSgidHJlZUNvbnRyb2xUZXN0Iik7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgcGFyZW50Tm9kZSA9IGNvbnRyb2wuZmluZE5vZGUocmZvcm0uZ2V0UGFyZW50T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5vZGVMYWJlbCA9IHJmb3JtLmdldE5vZGVMYWJlbCgpOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kZWROYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyT2JqZWN0TmFtZSxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpOworICAgICAgICAgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIGNoaWxkTm9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRyZWVDb250cm9sTm9kZShyT2JqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWFsbS5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVkaXRSZWFsbS5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGRvbWFpbik7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmFkZENoaWxkKGNoaWxkTm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSAtIGZvcmNlIGEgcmVkaXNwbGF5CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgZmluZCBwYXJlbnQgbm9kZSAnIiArIHBhcmVudCArICInIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBmaW5kIFRyZWVDb250cm9sTm9kZSEiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYXR0cmlidXRlIHVwZGF0ZXMgYXMgcmVxdWVzdGVkCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBPYmplY3ROYW1lIHJvbmFtZSA9IG5ldyBPYmplY3ROYW1lKHJPYmplY3ROYW1lKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gImRhdGFTb3VyY2VOYW1lIjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHJmb3JtLmdldERhdGFTb3VyY2VOYW1lKCkpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gImRpZ2VzdCI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImRpZ2VzdCIsICByZm9ybS5nZXREaWdlc3QoKSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicm9sZU5hbWVDb2wiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJyb2xlTmFtZUNvbCIsICByZm9ybS5nZXRSb2xlTmFtZUNvbCgpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyQ3JlZENvbCI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInVzZXJDcmVkQ29sIiwgIHJmb3JtLmdldFVzZXJDcmVkQ29sKCkpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJOYW1lQ29sIjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgidXNlck5hbWVDb2wiLCAgcmZvcm0uZ2V0VXNlck5hbWVDb2woKSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlclJvbGVUYWJsZSI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInVzZXJSb2xlVGFibGUiLCAgcmZvcm0uZ2V0VXNlclJvbGVUYWJsZSgpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyVGFibGUiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJ1c2VyVGFibGUiLCAgcmZvcm0uZ2V0VXNlclRhYmxlKCkpKTsKKyAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgc3VjY2VzcyByZXBvcnRpbmcgcGFnZQorICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShtYXBwaW5nLmdldEF0dHJpYnV0ZSgpKTsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFN1Y2Nlc3NmdWwiKSk7CisgICAgICAgIAorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9TYXZlSkRCQ1JlYWxtQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vU2F2ZUpEQkNSZWFsbUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTA5M2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vU2F2ZUpEQkNSZWFsbUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbTsKKworCitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbE5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmUuVmFsdmVVdGlsOworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgY29tcGxldGVzIDxlbT5BZGQgUmVhbG08L2VtPiBhbmQKKyAqIDxlbT5FZGl0IFJlYWxtPC9lbT4gdHJhbnNhY3Rpb25zIGZvciBKREJDIHJlYWxtLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYXZlSkRCQ1JlYWxtQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBTaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5jcmVhdGVTdGFuZGFyZFJlYWxtPC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlU3RhbmRhcmRSZWFsbVR5cGVzW10gPQorICAgIHsgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gcGFyZW50CisgICAgICAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBkcml2ZXJOYW1lCisgICAgICAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBjb25uZWN0aW9uTmFtZQorICAgICAgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gY29ubmVjdGlvblBhc3N3b3JkCisgICAgICAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBjb25uZWN0aW9uVVJMCisgICAgfTsKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3RlZCBhY3Rpb24KKyAgICAgICAgSkRCQ1JlYWxtRm9ybSByZm9ybSA9IChKREJDUmVhbG1Gb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgYWRtaW5BY3Rpb24gPSByZm9ybS5nZXRBZG1pbkFjdGlvbigpOworICAgICAgICBTdHJpbmcgck9iamVjdE5hbWUgPSByZm9ybS5nZXRPYmplY3ROYW1lKCk7CisKKyAgICAgICAgLy8gUGVyZm9ybSBhICJDcmVhdGUgSkRCQyBSZWFsbSIgdHJhbnNhY3Rpb24gKGlmIHJlcXVlc3RlZCkKKyAgICAgICAgaWYgKCJDcmVhdGUiLmVxdWFscyhhZG1pbkFjdGlvbikpIHsKKworICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWVzW10gPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmVudCA9IHJmb3JtLmdldFBhcmVudE9iamVjdE5hbWUoKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSBWYWx2ZVV0aWwuZ2V0T2JqZWN0TmFtZShwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5SRUFMTV9UWVBFKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHBuYW1lLmdldERvbWFpbigpKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIEZvciBzZXJ2aWNlLCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRW5naW5lIG1CZWFuICAKKyAgICAgICAgICAgICAgICAvLyBQYXJlbnQgaW4gdGhpcyBjYXNlIG5lZWRzIHRvIGJlIHRoZSBjb250YWluZXIgbUJlYW4gZm9yIHRoZSBzZXJ2aWNlIAorICAgICAgICAgICAgICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJTZXJ2aWNlIi5lcXVhbHNJZ25vcmVDYXNlKHBuYW1lLmdldEtleVByb3BlcnR5KCJ0eXBlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjp0eXBlPUVuZ2luZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgImVycm9yLmVuZ2luZU5hbWUuYmFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcmVxdWVzdGVkIHVzZXIgZGF0YWJhc2UgbmFtZSBpcyB1bmlxdWUKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdE5hbWUob2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKG1CU2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQWN0aW9uTWVzc2FnZXMgZXJyb3JzID0gbmV3IEFjdGlvbk1lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInJlYWxtTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLnJlYWxtTmFtZS5leGlzdHMiKSk7CisgICAgICAgICAgICAgICAgICAgIHNhdmVFcnJvcnMocmVxdWVzdCwgZXJyb3JzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgQWN0aW9uRm9yd2FyZChtYXBwaW5nLmdldElucHV0KCkpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gb25hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgICAgICAgICAgLy8gTG9vayB1cCBvdXIgTUJlYW5GYWN0b3J5IE1CZWFuCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBmbmFtZSA9IAorICAgICAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5nZXRNQmVhbkZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBTdGFuZGFyZFJlYWxtIG9iamVjdAorICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbNV07CisgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gcGFyZW50OworCQl2YWx1ZXNbMV0gPSByZm9ybS5nZXREcml2ZXIoKTsKKwkJdmFsdWVzWzJdID0gcmZvcm0uZ2V0Q29ubmVjdGlvbk5hbWUoKTsKKwkJdmFsdWVzWzNdID0gcmZvcm0uZ2V0Q29ubmVjdGlvblBhc3N3b3JkKCk7CisJCXZhbHVlc1s0XSA9IHJmb3JtLmdldENvbm5lY3Rpb25VUkwoKTsKKyAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAiY3JlYXRlSkRCQ1JlYWxtIjsKKyAgICAgICAgICAgICAgICByT2JqZWN0TmFtZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCBjcmVhdGVTdGFuZGFyZFJlYWxtVHlwZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHJPYmplY3ROYW1lPT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJ3YXJuaW5nIiwgImVycm9yLmpkYmNyZWFsbSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgVW5zdWNjZXNzZnVsIikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbmV3IFJlYWxtIHRvIG91ciB0cmVlIGNvbnRyb2wgbm9kZQorICAgICAgICAgICAgICAgIFRyZWVDb250cm9sIGNvbnRyb2wgPSAoVHJlZUNvbnRyb2wpCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ0cmVlQ29udHJvbFRlc3QiKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBwYXJlbnROb2RlID0gY29udHJvbC5maW5kTm9kZShyZm9ybS5nZXRQYXJlbnRPYmplY3ROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm9kZUxhYmVsID0gcmZvcm0uZ2V0Tm9kZUxhYmVsKCk7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RlZE5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJPYmplY3ROYW1lLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisgICAgICAgICAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgY2hpbGROb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHJlZUNvbnRyb2xOb2RlKHJPYmplY3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWxtLmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWRpdFJlYWxtLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZG9tYWluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuYWRkQ2hpbGQoY2hpbGROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIC0gZm9yY2UgYSByZWRpc3BsYXkKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBmaW5kIHBhcmVudCBub2RlICciICsgcGFyZW50ICsgIiciKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgVHJlZUNvbnRyb2xOb2RlISIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbikpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhdHRyaWJ1dGUgdXBkYXRlcyBhcyByZXF1ZXN0ZWQKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSByb25hbWUgPSBuZXcgT2JqZWN0TmFtZShyT2JqZWN0TmFtZSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkaWdlc3QiOworICAgICAgICAgICAgdmFsdWUgPSByZm9ybS5nZXREaWdlc3QoKTsKKyAgICAgICAgICAgIHNldEF0dHJpYnV0ZUlmUHJlc2VudChtQlNlcnZlciwgcm9uYW1lLCBhdHRyaWJ1dGUsIHZhbHVlKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gImRyaXZlck5hbWUiOworICAgICAgICAgICAgdmFsdWUgPSByZm9ybS5nZXREcml2ZXIoKTsKKyAgICAgICAgICAgIHNldEF0dHJpYnV0ZUlmUHJlc2VudChtQlNlcnZlciwgcm9uYW1lLCBhdHRyaWJ1dGUsIHZhbHVlKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInJvbGVOYW1lQ29sIjsKKyAgICAgICAgICAgIHZhbHVlID0gcmZvcm0uZ2V0Um9sZU5hbWVDb2woKTsKKyAgICAgICAgICAgIHNldEF0dHJpYnV0ZUlmUHJlc2VudChtQlNlcnZlciwgcm9uYW1lLCBhdHRyaWJ1dGUsIHZhbHVlKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJOYW1lQ29sIjsKKyAgICAgICAgICAgIHZhbHVlID0gcmZvcm0uZ2V0VXNlck5hbWVDb2woKTsKKyAgICAgICAgICAgIHNldEF0dHJpYnV0ZUlmUHJlc2VudChtQlNlcnZlciwgcm9uYW1lLCBhdHRyaWJ1dGUsIHZhbHVlKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJDcmVkQ29sIjsKKyAgICAgICAgICAgIHZhbHVlID0gcmZvcm0uZ2V0UGFzc3dvcmRDb2woKTsKKyAgICAgICAgICAgIHNldEF0dHJpYnV0ZUlmUHJlc2VudChtQlNlcnZlciwgcm9uYW1lLCBhdHRyaWJ1dGUsIHZhbHVlKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJUYWJsZSI7CisgICAgICAgICAgICB2YWx1ZSA9IHJmb3JtLmdldFVzZXJUYWJsZSgpOworICAgICAgICAgICAgc2V0QXR0cmlidXRlSWZQcmVzZW50KG1CU2VydmVyLCByb25hbWUsIGF0dHJpYnV0ZSwgdmFsdWUpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlclJvbGVUYWJsZSI7CisgICAgICAgICAgICB2YWx1ZSA9IHJmb3JtLmdldFJvbGVUYWJsZSgpOworICAgICAgICAgICAgc2V0QXR0cmlidXRlSWZQcmVzZW50KG1CU2VydmVyLCByb25hbWUsIGF0dHJpYnV0ZSwgdmFsdWUpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29ubmVjdGlvbk5hbWUiOworICAgICAgICAgICAgdmFsdWUgPSByZm9ybS5nZXRDb25uZWN0aW9uTmFtZSgpOworICAgICAgICAgICAgc2V0QXR0cmlidXRlSWZQcmVzZW50KG1CU2VydmVyLCByb25hbWUsIGF0dHJpYnV0ZSwgdmFsdWUpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29ubmVjdGlvblVSTCI7CisgICAgICAgICAgICB2YWx1ZSA9IHJmb3JtLmdldENvbm5lY3Rpb25VUkwoKTsKKyAgICAgICAgICAgIHNldEF0dHJpYnV0ZUlmUHJlc2VudChtQlNlcnZlciwgcm9uYW1lLCBhdHRyaWJ1dGUsIHZhbHVlKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gImNvbm5lY3Rpb25QYXNzd29yZCI7CisgICAgICAgICAgICB2YWx1ZSA9IHJmb3JtLmdldENvbm5lY3Rpb25QYXNzd29yZCgpOworICAgICAgICAgICAgc2V0QXR0cmlidXRlSWZQcmVzZW50KG1CU2VydmVyLCByb25hbWUsIGF0dHJpYnV0ZSwgdmFsdWUpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzdWNjZXNzIHJlcG9ydGluZyBwYWdlCisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG1hcHBpbmcuZ2V0QXR0cmlidXRlKCkpOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKyAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZ2l2ZW4gYXR0cmlidXRlIHRvIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqIGluIHRoZSBnaXZlbiBzZXJ2ZXIncyBvYmplY3QgbmFtZSwgaWYgdGhlIHZhbHVlCisgICAgICogaXMgbm90IG51bGwgb3IgZW1wdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlU2VydmVyIFRoZSBzZXJ2ZXIKKyAgICAgKiBAcGFyYW0gcm9uYW1lIFRoZSBvYmplY3QgbmFtZQorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWUKKyAgICAgKiBAdGhyb3dzIEpNRXhjZXB0aW9uIElmIGEgSk1YIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEF0dHJpYnV0ZUlmUHJlc2VudChNQmVhblNlcnZlciBtQlNlcnZlciwgT2JqZWN0TmFtZSByb25hbWUsIFN0cmluZyBhdHRyaWJ1dGUsIFN0cmluZyB2YWx1ZSkKKyAgICAgICAgdGhyb3dzIEpNRXhjZXB0aW9uIHsKKworICAgICAgICBpZigobUJTZXJ2ZXIgPT0gbnVsbCkgfHwgKHJvbmFtZSA9PSBudWxsKSB8fCAoYXR0cmlidXRlID09IG51bGwpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNQmVhblNlcnZlciwgT2JqZWN0TmFtZSwgYXR0cmlidXRlIHJlcXVpcmVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYoKHZhbHVlICE9IG51bGwpICYmICh2YWx1ZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgeworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgIHZhbHVlKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vU2F2ZUpORElSZWFsbUFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1NhdmVKTkRJUmVhbG1BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWMzMmQwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1NhdmVKTkRJUmVhbG1BY3Rpb24uamF2YQpAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG07CisKKworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZS5WYWx2ZVV0aWw7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkFkZCBSZWFsbTwvZW0+IGFuZAorICogPGVtPkVkaXQgUmVhbG08L2VtPiB0cmFuc2FjdGlvbnMgZm9yIEpOREkgcmVhbG0uCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZUpORElSZWFsbUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+Y3JlYXRlU3RhbmRhcmRSZWFsbTwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVN0YW5kYXJkUmVhbG1UeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIHBhcmVudAorICAgICAgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gY29ubmVjdGlvbiBVUkwKKyAgICAgICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIGNvbm5lY3Rpb24gbmFtZQorICAgICAgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gY29ubmVjdGlvbiBwYXNzd29yZAorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSByZXF1ZXN0ZWQgYWN0aW9uCisgICAgICAgIEpORElSZWFsbUZvcm0gcmZvcm0gPSAoSk5ESVJlYWxtRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIGFkbWluQWN0aW9uID0gcmZvcm0uZ2V0QWRtaW5BY3Rpb24oKTsKKyAgICAgICAgU3RyaW5nIHJPYmplY3ROYW1lID0gcmZvcm0uZ2V0T2JqZWN0TmFtZSgpOworCisgICAgICAgIC8vIFBlcmZvcm0gYSAiQ3JlYXRlIEpOREkgUmVhbG0iIHRyYW5zYWN0aW9uIChpZiByZXF1ZXN0ZWQpCisgICAgICAgIGlmICgiQ3JlYXRlIi5lcXVhbHMoYWRtaW5BY3Rpb24pKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIFN0cmluZyBwYXJlbnQgPSByZm9ybS5nZXRQYXJlbnRPYmplY3ROYW1lKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSBWYWx2ZVV0aWwuZ2V0T2JqZWN0TmFtZShwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5SRUFMTV9UWVBFKTsKKworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgcG5hbWUgPSBuZXcgT2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIocG5hbWUuZ2V0RG9tYWluKCkpOworCisgICAgICAgICAgICAgICAgLy8gRm9yIHNlcnZpY2UsIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBFbmdpbmUgbUJlYW4KKyAgICAgICAgICAgICAgICAvLyBQYXJlbnQgaW4gdGhpcyBjYXNlIG5lZWRzIHRvIGJlIHRoZSBjb250YWluZXIgbUJlYW4gZm9yIHRoZSBzZXJ2aWNlCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJTZXJ2aWNlIi5lcXVhbHNJZ25vcmVDYXNlKHBuYW1lLmdldEtleVByb3BlcnR5KCJ0eXBlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjp0eXBlPUVuZ2luZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKCJlcnJvci5lbmdpbmVOYW1lLmJhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHJlcXVlc3RlZCB1c2VyIGRhdGFiYXNlIG5hbWUgaXMgdW5pcXVlCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChtQlNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFjdGlvbk1lc3NhZ2VzIGVycm9ycyA9IG5ldyBBY3Rpb25NZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJyZWFsbU5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5yZWFsbU5hbWUuZXhpc3RzIikpOworICAgICAgICAgICAgICAgICAgICBzYXZlRXJyb3JzKHJlcXVlc3QsIGVycm9ycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEFjdGlvbkZvcndhcmQobWFwcGluZy5nZXRJbnB1dCgpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG9uYW1lLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgIC8vIExvb2sgdXAgb3VyIE1CZWFuRmFjdG9yeSBNQmVhbgorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgZm5hbWUgPSAKKyAgICAgICAgICAgICAgICAgICAgVG9tY2F0VHJlZUJ1aWxkZXIuZ2V0TUJlYW5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU3RhbmRhcmRSZWFsbSBvYmplY3QKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nWzRdOworICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IHBhcmVudDsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMV0gPSByZm9ybS5nZXRDb25uZWN0aW9uVVJMKCk7CisgICAgICAgICAgICAgICAgdmFsdWVzWzJdID0gcmZvcm0uZ2V0Q29ubmVjdGlvbk5hbWUoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbM10gPSByZm9ybS5nZXRDb25uZWN0aW9uUGFzc3dvcmQoKTsKKyAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAiY3JlYXRlSk5ESVJlYWxtIjsKKyAgICAgICAgICAgICAgICByT2JqZWN0TmFtZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCBjcmVhdGVTdGFuZGFyZFJlYWxtVHlwZXMpOworCisgICAgICAgICAgICAgICAgaWYgKHJPYmplY3ROYW1lPT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJ3YXJuaW5nIiwgImVycm9yLmpuZGlyZWFsbSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgVW5zdWNjZXNzZnVsIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5ldyBSZWFsbSB0byBvdXIgdHJlZSBjb250cm9sIG5vZGUKKyAgICAgICAgICAgICAgICBUcmVlQ29udHJvbCBjb250cm9sID0gKFRyZWVDb250cm9sKQorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEF0dHJpYnV0ZSgidHJlZUNvbnRyb2xUZXN0Iik7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgcGFyZW50Tm9kZSA9IGNvbnRyb2wuZmluZE5vZGUocmZvcm0uZ2V0UGFyZW50T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5vZGVMYWJlbCA9IHJmb3JtLmdldE5vZGVMYWJlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kZWROYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyT2JqZWN0TmFtZSxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpOworICAgICAgICAgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIGNoaWxkTm9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRyZWVDb250cm9sTm9kZShyT2JqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWFsbS5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVkaXRSZWFsbS5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGRvbWFpbik7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmFkZENoaWxkKGNoaWxkTm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSAtIGZvcmNlIGEgcmVkaXNwbGF5CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgZmluZCBwYXJlbnQgbm9kZSAnIiArIHBhcmVudCArICInIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBmaW5kIFRyZWVDb250cm9sTm9kZSEiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYXR0cmlidXRlIHVwZGF0ZXMgYXMgcmVxdWVzdGVkCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBPYmplY3ROYW1lIHJvbmFtZSA9IG5ldyBPYmplY3ROYW1lKHJPYmplY3ROYW1lKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gImNvbm5lY3Rpb25OYW1lIjsKKyAgICAgICAgICAgIFN0cmluZyBjb25uZWN0aW9uTmFtZSA9IHJmb3JtLmdldENvbm5lY3Rpb25OYW1lKCk7CisgICAgICAgICAgICBpZiAoKGNvbm5lY3Rpb25OYW1lICE9IG51bGwpICYmIChjb25uZWN0aW9uTmFtZS5sZW5ndGgoKT4wKSkgeworICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJjb25uZWN0aW9uTmFtZSIsICBjb25uZWN0aW9uTmFtZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29ubmVjdGlvblBhc3N3b3JkIjsKKyAgICAgICAgICAgIFN0cmluZyBjb25uZWN0aW9uUGFzc3dvcmQgPSByZm9ybS5nZXRDb25uZWN0aW9uUGFzc3dvcmQoKTsKKyAgICAgICAgICAgIGlmICgoY29ubmVjdGlvblBhc3N3b3JkICE9IG51bGwpICYmIChjb25uZWN0aW9uUGFzc3dvcmQubGVuZ3RoKCk+MCkpIHsKKyAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiY29ubmVjdGlvblBhc3N3b3JkIiwgIGNvbm5lY3Rpb25QYXNzd29yZCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29ubmVjdGlvblVSTCI7CisgICAgICAgICAgICBTdHJpbmcgY29ubmVjdGlvblVSTCA9IHJmb3JtLmdldENvbm5lY3Rpb25VUkwoKTsKKyAgICAgICAgICAgIGlmICgoY29ubmVjdGlvblVSTCAhPSBudWxsKSAmJiAoY29ubmVjdGlvblVSTC5sZW5ndGgoKT4wKSkgeworICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJjb25uZWN0aW9uVVJMIiwgIGNvbm5lY3Rpb25VUkwpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXR0cmlidXRlID0gImNvbnRleHRGYWN0b3J5IjsKKyAgICAgICAgICAgIFN0cmluZyBjb250ZXh0RmFjdG9yeSA9IHJmb3JtLmdldENvbnRleHRGYWN0b3J5KCk7CisgICAgICAgICAgICBpZiAoKGNvbnRleHRGYWN0b3J5ICE9IG51bGwpICYmIChjb250ZXh0RmFjdG9yeS5sZW5ndGgoKT4wKSkgeworICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJjb250ZXh0RmFjdG9yeSIsICBjb250ZXh0RmFjdG9yeSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZGlnZXN0IjsKKyAgICAgICAgICAgIFN0cmluZyBkaWdlc3QgPSByZm9ybS5nZXREaWdlc3QoKTsKKyAgICAgICAgICAgIGlmICgoZGlnZXN0ICE9IG51bGwpICYmIChkaWdlc3QubGVuZ3RoKCk+MCkpIHsKKyAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImRpZ2VzdCIsIGRpZ2VzdCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicm9sZUJhc2UiOworICAgICAgICAgICAgU3RyaW5nIHJvbGVCYXNlID0gcmZvcm0uZ2V0Um9sZUJhc2UoKTsKKyAgICAgICAgICAgIGlmICgocm9sZUJhc2UgIT0gbnVsbCkgJiYgKHJvbGVCYXNlLmxlbmd0aCgpPjApKSB7CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInJvbGVCYXNlIiwgIHJvbGVCYXNlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJyb2xlTmFtZSI7CisgICAgICAgICAgICBTdHJpbmcgcm9sZU5hbWUgPSByZm9ybS5nZXRSb2xlTmFtZSgpOworICAgICAgICAgICAgaWYgKChyb2xlTmFtZSAhPSBudWxsKSAmJiAocm9sZU5hbWUubGVuZ3RoKCk+MCkpIHsKKyAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgicm9sZU5hbWUiLCAgcm9sZU5hbWUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXR0cmlidXRlID0gInJvbGVTZWFyY2giOworICAgICAgICAgICAgU3RyaW5nIHJvbGVQYXR0ZXJuID0gcmZvcm0uZ2V0Um9sZVBhdHRlcm4oKTsKKyAgICAgICAgICAgIGlmICgocm9sZVBhdHRlcm4gIT0gbnVsbCkgJiYgKHJvbGVQYXR0ZXJuLmxlbmd0aCgpPjApKSB7CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInJvbGVTZWFyY2giLCAgcm9sZVBhdHRlcm4pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXR0cmlidXRlID0gInJvbGVTdWJ0cmVlIjsKKyAgICAgICAgICAgIFN0cmluZyByb2xlU3VidHJlZSA9IHJmb3JtLmdldFJvbGVTdWJ0cmVlKCk7CisgICAgICAgICAgICBpZiAoKHJvbGVTdWJ0cmVlICE9IG51bGwpICYmIChyb2xlU3VidHJlZS5sZW5ndGgoKT4wKSkgeworICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInJvbGVTdWJ0cmVlIiwgIG5ldyBCb29sZWFuKHJvbGVTdWJ0cmVlKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlckJhc2UiOworICAgICAgICAgICAgU3RyaW5nIHVzZXJCYXNlID0gcmZvcm0uZ2V0VXNlckJhc2UoKTsKKyAgICAgICAgICAgIGlmICgodXNlckJhc2UgIT0gbnVsbCkgJiYgKHVzZXJCYXNlLmxlbmd0aCgpPjApKSB7CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInVzZXJCYXNlIiwgIHVzZXJCYXNlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyUGFzc3dvcmQiOworICAgICAgICAgICAgU3RyaW5nIHVzZXJQYXNzd29yZCA9IHJmb3JtLmdldFVzZXJQYXNzd29yZCgpOworICAgICAgICAgICAgaWYgKCh1c2VyUGFzc3dvcmQgIT0gbnVsbCkgJiYgKHVzZXJQYXNzd29yZC5sZW5ndGgoKT4wKSkgeworICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJ1c2VyUGFzc3dvcmQiLCAgdXNlclBhc3N3b3JkKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyUGF0dGVybiI7CisgICAgICAgICAgICBTdHJpbmcgdXNlclBhdHRlcm4gPSByZm9ybS5nZXRVc2VyUGF0dGVybigpOworICAgICAgICAgICAgaWYgKCh1c2VyUGF0dGVybiAhPSBudWxsKSAmJiAodXNlclBhdHRlcm4ubGVuZ3RoKCk+MCkpIHsKKyAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgidXNlclBhdHRlcm4iLCAgdXNlclBhdHRlcm4pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJSb2xlTmFtZSI7CisgICAgICAgICAgICBTdHJpbmcgdXNlclJvbGVOYW1lID0gcmZvcm0uZ2V0VXNlclJvbGVOYW1lKCk7CisgICAgICAgICAgICBpZiAoKHVzZXJSb2xlTmFtZSAhPSBudWxsKSAmJiAodXNlclJvbGVOYW1lLmxlbmd0aCgpPjApKSB7CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInVzZXJSb2xlTmFtZSIsICB1c2VyUm9sZU5hbWUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJTZWFyY2giOworICAgICAgICAgICAgU3RyaW5nIHVzZXJTZWFyY2ggPSByZm9ybS5nZXRVc2VyU2VhcmNoKCk7CisgICAgICAgICAgICBpZiAoKHVzZXJTZWFyY2ggIT0gbnVsbCkgJiYgKHVzZXJTZWFyY2gubGVuZ3RoKCk+MCkpIHsKKyAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgidXNlclNlYXJjaCIsICB1c2VyU2VhcmNoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyU3VidHJlZSI7CisgICAgICAgICAgICBTdHJpbmcgdXNlclN1YnRyZWUgPSByZm9ybS5nZXRVc2VyU3VidHJlZSgpOworICAgICAgICAgICAgaWYgKCh1c2VyU3VidHJlZSAhPSBudWxsKSAmJiAodXNlclN1YnRyZWUubGVuZ3RoKCk+MCkpIHsKKyAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJ1c2VyU3VidHJlZSIsICBuZXcgQm9vbGVhbih1c2VyU3VidHJlZSkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHN1Y2Nlc3MgcmVwb3J0aW5nIHBhZ2UKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUobWFwcGluZy5nZXRBdHRyaWJ1dGUoKSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2F2ZSBTdWNjZXNzZnVsIikpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vU2F2ZU1lbW9yeVJlYWxtQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vU2F2ZU1lbW9yeVJlYWxtQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllOGQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9TYXZlTWVtb3J5UmVhbG1BY3Rpb24uamF2YQpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG07CisKKworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZS5WYWx2ZVV0aWw7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkFkZCBSZWFsbTwvZW0+IGFuZAorICogPGVtPkVkaXQgUmVhbG08L2VtPiB0cmFuc2FjdGlvbnMgZm9yIE1lbW9yeSByZWFsbS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZU1lbW9yeVJlYWxtQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBTaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5jcmVhdGVTdGFuZGFyZFJlYWxtPC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlU3RhbmRhcmRSZWFsbVR5cGVzW10gPQorICAgIHsgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gcGFyZW50CisgICAgfTsKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3RlZCBhY3Rpb24KKyAgICAgICAgTWVtb3J5UmVhbG1Gb3JtIHJmb3JtID0gKE1lbW9yeVJlYWxtRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIGFkbWluQWN0aW9uID0gcmZvcm0uZ2V0QWRtaW5BY3Rpb24oKTsKKyAgICAgICAgU3RyaW5nIHJPYmplY3ROYW1lID0gcmZvcm0uZ2V0T2JqZWN0TmFtZSgpOworCisgICAgICAgIC8vIFBlcmZvcm0gYSAiQ3JlYXRlIE1lbW9yeSBSZWFsbSIgdHJhbnNhY3Rpb24gKGlmIHJlcXVlc3RlZCkKKyAgICAgICAgaWYgKCJDcmVhdGUiLmVxdWFscyhhZG1pbkFjdGlvbikpIHsKKworICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWVzW10gPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmVudCA9IHJmb3JtLmdldFBhcmVudE9iamVjdE5hbWUoKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSBWYWx2ZVV0aWwuZ2V0T2JqZWN0TmFtZShwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5SRUFMTV9UWVBFKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHBuYW1lLmdldERvbWFpbigpKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIEZvciBzZXJ2aWNlLCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRW5naW5lIG1CZWFuICAKKyAgICAgICAgICAgICAgICAvLyBQYXJlbnQgaW4gdGhpcyBjYXNlIG5lZWRzIHRvIGJlIHRoZSBjb250YWluZXIgbUJlYW4gZm9yIHRoZSBzZXJ2aWNlIAorICAgICAgICAgICAgICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJTZXJ2aWNlIi5lcXVhbHNJZ25vcmVDYXNlKHBuYW1lLmdldEtleVByb3BlcnR5KCJ0eXBlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjp0eXBlPUVuZ2luZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgImVycm9yLmVuZ2luZU5hbWUuYmFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcmVxdWVzdGVkIHVzZXIgZGF0YWJhc2UgbmFtZSBpcyB1bmlxdWUKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdE5hbWUob2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKG1CU2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQWN0aW9uTWVzc2FnZXMgZXJyb3JzID0gbmV3IEFjdGlvbk1lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInJlYWxtTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLnJlYWxtTmFtZS5leGlzdHMiKSk7CisgICAgICAgICAgICAgICAgICAgIHNhdmVFcnJvcnMocmVxdWVzdCwgZXJyb3JzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgQWN0aW9uRm9yd2FyZChtYXBwaW5nLmdldElucHV0KCkpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gb25hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgICAgICAgICAgLy8gTG9vayB1cCBvdXIgTUJlYW5GYWN0b3J5IE1CZWFuCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBmbmFtZSA9IFRvbWNhdFRyZWVCdWlsZGVyLmdldE1CZWFuRmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFN0YW5kYXJkUmVhbG0gb2JqZWN0CisgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBwYXJlbnQ7CisgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gImNyZWF0ZU1lbW9yeVJlYWxtIjsKKyAgICAgICAgICAgICAgICByT2JqZWN0TmFtZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCBjcmVhdGVTdGFuZGFyZFJlYWxtVHlwZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBuZXcgUmVhbG0gdG8gb3VyIHRyZWUgY29udHJvbCBub2RlCisgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2wgY29udHJvbCA9IChUcmVlQ29udHJvbCkKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoInRyZWVDb250cm9sVGVzdCIpOworICAgICAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHBhcmVudE5vZGUgPSBjb250cm9sLmZpbmROb2RlKHJmb3JtLmdldFBhcmVudE9iamVjdE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBub2RlTGFiZWwgPSByZm9ybS5nZXROb2RlTGFiZWwoKTsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGVkTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUock9iamVjdE5hbWUsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBjaGlsZE5vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmVlQ29udHJvbE5vZGUock9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVhbG0uZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFZGl0UmVhbG0uZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBkb21haW4pOworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5hZGRDaGlsZChjaGlsZE5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgLSBmb3JjZSBhIHJlZGlzcGxheQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgcGFyZW50IG5vZGUgJyIgKyBwYXJlbnQgKyAiJyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgZmluZCBUcmVlQ29udHJvbE5vZGUhIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiksIGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGF0dHJpYnV0ZSB1cGRhdGVzIGFzIHJlcXVlc3RlZAorICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSByb25hbWUgPSBuZXcgT2JqZWN0TmFtZShyT2JqZWN0TmFtZSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwYXRobmFtZSI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInBhdGhuYW1lIiwgIHJmb3JtLmdldFBhdGhOYW1lKCkpKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgc3VjY2VzcyByZXBvcnRpbmcgcGFnZQorICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShtYXBwaW5nLmdldEF0dHJpYnV0ZSgpKTsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFN1Y2Nlc3NmdWwiKSk7CisgICAgICAgIAorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9TYXZlVXNlckRhdGFiYXNlUmVhbG1BY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9TYXZlVXNlckRhdGFiYXNlUmVhbG1BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjJkY2IyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1NhdmVVc2VyRGF0YWJhc2VSZWFsbUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbTsKKworCitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2w7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2xOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLlZhbHZlVXRpbDsKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IGNvbXBsZXRlcyA8ZW0+QWRkIFJlYWxtPC9lbT4gYW5kCisgKiA8ZW0+RWRpdCBSZWFsbTwvZW0+IHRyYW5zYWN0aW9ucyBmb3IgVXNlckRhdGFiYXNlIHJlYWxtLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYXZlVXNlckRhdGFiYXNlUmVhbG1BY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFNpZ25hdHVyZSBmb3IgdGhlIDxjb2RlPmNyZWF0ZVVzZXJEYXRhYmFzZVJlYWxtPC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlVXNlckRhdGFiYXNlUmVhbG1UeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIHBhcmVudAorICAgICAgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gbmFtZQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSByZXF1ZXN0ZWQgYWN0aW9uCisgICAgICAgIFVzZXJEYXRhYmFzZVJlYWxtRm9ybSByZm9ybSA9IChVc2VyRGF0YWJhc2VSZWFsbUZvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBhZG1pbkFjdGlvbiA9IHJmb3JtLmdldEFkbWluQWN0aW9uKCk7CisgICAgICAgIFN0cmluZyByT2JqZWN0TmFtZSA9IHJmb3JtLmdldE9iamVjdE5hbWUoKTsKKworICAgICAgICAvLyBQZXJmb3JtIGEgIkNyZWF0ZSBVc2VyRGF0YWJhc2UgUmVhbG0iIHRyYW5zYWN0aW9uIChpZiByZXF1ZXN0ZWQpCisgICAgICAgIGlmICgiQ3JlYXRlIi5lcXVhbHMoYWRtaW5BY3Rpb24pKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIFN0cmluZyBwYXJlbnQgPSByZm9ybS5nZXRQYXJlbnRPYmplY3ROYW1lKCk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gVmFsdmVVdGlsLmdldE9iamVjdE5hbWUocGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9tY2F0VHJlZUJ1aWxkZXIuUkVBTE1fVFlQRSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBwbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihwbmFtZS5nZXREb21haW4oKSk7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBGb3Igc2VydmljZSwgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEVuZ2luZSBtQmVhbiAgCisgICAgICAgICAgICAgICAgLy8gUGFyZW50IGluIHRoaXMgY2FzZSBuZWVkcyB0byBiZSB0aGUgY29udGFpbmVyIG1CZWFuIGZvciB0aGUgc2VydmljZSAKKyAgICAgICAgICAgICAgICB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICgiU2VydmljZSIuZXF1YWxzSWdub3JlQ2FzZShwbmFtZS5nZXRLZXlQcm9wZXJ0eSgidHlwZSIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI6dHlwZT1FbmdpbmUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHNiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJlcnJvci5lbmdpbmVOYW1lLmJhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHJlcXVlc3RlZCB1c2VyIGRhdGFiYXNlIG5hbWUgaXMgdW5pcXVlCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChtQlNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFjdGlvbk1lc3NhZ2VzIGVycm9ycyA9IG5ldyBBY3Rpb25NZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJyZWFsbU5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5yZWFsbU5hbWUuZXhpc3RzIikpOworICAgICAgICAgICAgICAgICAgICBzYXZlRXJyb3JzKHJlcXVlc3QsIGVycm9ycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEFjdGlvbkZvcndhcmQobWFwcGluZy5nZXRJbnB1dCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSBvbmFtZS5nZXREb21haW4oKTsKKyAgICAgICAgICAgICAgICAvLyBMb29rIHVwIG91ciBNQmVhbkZhY3RvcnkgTUJlYW4KKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIGZuYW1lID0gVG9tY2F0VHJlZUJ1aWxkZXIuZ2V0TUJlYW5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU3RhbmRhcmRSZWFsbSBvYmplY3QKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nWzJdOworICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IHBhcmVudDsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMV0gPSByZm9ybS5nZXRSZXNvdXJjZSgpOworICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJjcmVhdGVVc2VyRGF0YWJhc2VSZWFsbSI7CisgICAgICAgICAgICAgICAgck9iamVjdE5hbWUgPSAoU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgY3JlYXRlVXNlckRhdGFiYXNlUmVhbG1UeXBlcyk7CisgICAgICAgICAgICAgICAgaWYgKHJPYmplY3ROYW1lPT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJ3YXJuaW5nIiwgImVycm9yLnVzZXJkYnJlYWxtIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2F2ZSBVbnN1Y2Nlc3NmdWwiKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBuZXcgUmVhbG0gdG8gb3VyIHRyZWUgY29udHJvbCBub2RlCisgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2wgY29udHJvbCA9IChUcmVlQ29udHJvbCkKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoInRyZWVDb250cm9sVGVzdCIpOworICAgICAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHBhcmVudE5vZGUgPSBjb250cm9sLmZpbmROb2RlKHJmb3JtLmdldFBhcmVudE9iamVjdE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBub2RlTGFiZWwgPSByZm9ybS5nZXROb2RlTGFiZWwoKTsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGVkTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUock9iamVjdE5hbWUsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBjaGlsZE5vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmVlQ29udHJvbE5vZGUock9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVhbG0uZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFZGl0UmVhbG0uZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBkb21haW4pOworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5hZGRDaGlsZChjaGlsZE5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgLSBmb3JjZSBhIHJlZGlzcGxheQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgcGFyZW50IG5vZGUgJyIgKyBwYXJlbnQgKyAiJyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgZmluZCBUcmVlQ29udHJvbE5vZGUhIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiksIGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGF0dHJpYnV0ZSB1cGRhdGVzIGFzIHJlcXVlc3RlZAorICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSByb25hbWUgPSBuZXcgT2JqZWN0TmFtZShyT2JqZWN0TmFtZSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJyZXNvdXJjZU5hbWUiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJyZXNvdXJjZU5hbWUiLCAgcmZvcm0uZ2V0UmVzb3VyY2UoKSkpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzdWNjZXNzIHJlcG9ydGluZyBwYWdlCisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG1hcHBpbmcuZ2V0QXR0cmlidXRlKCkpOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKyAgICAgICAgCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1VzZXJEYXRhYmFzZVJlYWxtRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1VzZXJEYXRhYmFzZVJlYWxtRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNGFlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vVXNlckRhdGFiYXNlUmVhbG1Gb3JtLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlOworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIFVzZXIgRGF0YWJhc2UgcmVhbG0gcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgVXNlckRhdGFiYXNlUmVhbG1Gb3JtIGV4dGVuZHMgUmVhbG1Gb3JtIHsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgcmVzb3VyY2UgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZSA9IG51bGw7CisgICAgICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UgTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2U7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlc291cmNlIE5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2UoU3RyaW5nIHJlc291cmNlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisgICAgICAgIAorICAgIH0KKyAgICAgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOworICAgICAgICB0aGlzLnJlc291cmNlID0gbnVsbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgLyoqCisgICAgICogUmVuZGVyIHRoaXMgb2JqZWN0IGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVXNlckRhdGFiYXNlUmVhbG1Gb3JtW2FkbWluQWN0aW9uPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0QWRtaW5BY3Rpb24oKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLHJlc291cmNlPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0UmVzb3VyY2UoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyxvYmplY3ROYW1lPSciKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldE9iamVjdE5hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyxyZWFsbVR5cGU9Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRSZWFsbVR5cGUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IGZyb20gdGhpcyBIVFRQIHJlcXVlc3QsCisgICAgICogYW5kIHJldHVybiBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbnkKKyAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBmb3VuZC4gIElmIG5vIGVycm9ycyBhcmUgZm91bmQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHdpdGggbm8KKyAgICAgKiByZWNvcmRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgIAorICAgICAgICAvLyBmcm9udCBlbmQgdmFsaWRhdGlvbiB3aGVuIHNhdmUgaXMgY2xpY2tlZC4KKyAgICAgICAgaWYgKChyZXNvdXJjZSA9PSBudWxsKSB8fCAocmVzb3VyY2UubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgicmVzb3VyY2UiLAorICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLnJlc291cmNlLnJlcXVpcmVkIikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0Jhc2VGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0Jhc2VGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYyMmM3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvQmFzZUZvcm0uamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBmb3JtIGJlYW5zIGZvciB0aGUgcmVzb3VyY2UgYWRtaW5pc3RyYXRpb24uCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIEJhc2VGb3JtIGV4dGVuZHMgQWN0aW9uRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIFRoZSBub2RlIGxhYmVsIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdXNlciBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbm9kZUxhYmVsID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUxhYmVsKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubm9kZUxhYmVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROb2RlTGFiZWwoU3RyaW5nIG5vZGVMYWJlbCkgeworICAgICAgICB0aGlzLm5vZGVMYWJlbCA9IG5vZGVMYWJlbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhbiBvYmplY3QgbmFtZSBvZiB0aGlzIG9iamVjdC4gIEEgbnVsbCBvciB6ZXJvLWxlbmd0aAorICAgICAqIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoaXMgaXMgYSBuZXcgb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG9iamVjdE5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRPYmplY3ROYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMub2JqZWN0TmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0TmFtZShTdHJpbmcgb2JqZWN0TmFtZSkgeworICAgICAgICBpZiAoKG9iamVjdE5hbWUgIT0gbnVsbCkgJiYgKG9iamVjdE5hbWUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgdGhpcy5vYmplY3ROYW1lID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMub2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBub2RlTGFiZWwgPSBudWxsOworICAgICAgICBvYmplY3ROYW1lID0gbnVsbDsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0RhdGFTb3VyY2VGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0RhdGFTb3VyY2VGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0MTJmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRGF0YVNvdXJjZUZvcm0uamF2YQpAQCAtMCwwICsxLDM2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlOworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGluZGl2aWR1YWwgZGF0YSBzb3VyY2UgcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgRGF0YVNvdXJjZUZvcm0gZXh0ZW5kcyBCYXNlRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHVybCBvZiB0aGUgZGF0YSBzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXJsID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudXJsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIHVybCkgeworICAgICAgICB0aGlzLnVybCA9IHVybDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgSk5ESSBuYW1lIG9mIHRoZSBkYXRhIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBqbmRpTmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEpuZGlOYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuam5kaU5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEpuZGlOYW1lKFN0cmluZyBqbmRpTmFtZSkgeworICAgICAgICB0aGlzLmpuZGlOYW1lID0gam5kaU5hbWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBKREJDIGRyaXZlciBjbGFzcyBvZiB0aGUgZGF0YSBzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZHJpdmVyQ2xhc3MgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmRyaXZlckNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREcml2ZXJDbGFzcyhTdHJpbmcgZHJpdmVyQ2xhc3MpIHsKKyAgICAgICAgdGhpcy5kcml2ZXJDbGFzcyA9IGRyaXZlckNsYXNzOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB1c2VybmFtZSBvZiB0aGUgZGF0YWJzZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkYXRhIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2VybmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudXNlcm5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSkgeworICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHBhc3N3b3JkIG9mIHRoZSBkYXRhYmFzZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkYXRhIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucGFzc3dvcmQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogVGhlIG1heCBudW1iZXIgb2YgYWN0aXZlIHNlc3Npb25zIHRvIHRoZSBkYXRhIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhY3RpdmUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRBY3RpdmUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5hY3RpdmUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZShTdHJpbmcgYWN0aXZlKSB7CisgICAgICAgIHRoaXMuYWN0aXZlID0gYWN0aXZlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtYXggbnVtYmVyIG9mIGlkbGUgY29ubmVjdGlvbnMgdG8gdGhlIGRhdGEgc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGlkbGUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRJZGxlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuaWRsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWRsZShTdHJpbmcgaWRsZSkgeworICAgICAgICB0aGlzLmlkbGUgPSBpZGxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIHdhaXQgZm9yIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YSBzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgd2FpdCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFdhaXQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy53YWl0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXYWl0KFN0cmluZyB3YWl0KSB7CisgICAgICAgIHRoaXMud2FpdCA9IHdhaXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHJlc291cmNlIHR5cGUgb2YgdGhpcyBkYXRhIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZXR5cGUgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgZGF0YSBzb3VyY2UgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNldHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2V0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgZGF0YSBzb3VyY2UgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXR5cGUoU3RyaW5nIHJlc291cmNldHlwZSkgeworICAgICAgICB0aGlzLnJlc291cmNldHlwZSA9IHJlc291cmNldHlwZTsKKyAgICB9CisgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIHBhdGggb2YgdGhpcyBkYXRhIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXRoID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdGggb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGF0aCBvZiB0aGUgZGF0YSBzb3VyY2UgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBob3N0IG9mIHRoaXMgZGF0YSBzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBob3N0IG9mIHRoZSBkYXRhIHNvdXJjZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGhvc3Qgb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkgeworICAgICAgICB0aGlzLmhvc3QgPSBob3N0OworICAgIH0gICAgCisgICAgCisgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIGRvbWFpbiBvZiB0aGlzIGRhdGEgc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkb21haW4gb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREb21haW4oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRvbWFpbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRvbWFpbiBvZiB0aGUgZGF0YSBzb3VyY2UgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREb21haW4oU3RyaW5nIGRvbWFpbikgeworICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHZhbGlkYXRpb24gcXVlcnkgdG8gdGhlIGRhdGEgc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5ID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnkoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5xdWVyeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UXVlcnkoU3RyaW5nIHF1ZXJ5KSB7CisgICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgdGhlIHJlc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHR5cGUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudHlwZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsKKyAgICAgICAgdXJsID0gbnVsbDsgICAgICAgIAorICAgICAgICBqbmRpTmFtZSA9IG51bGw7CisgICAgICAgIGRyaXZlckNsYXNzID0gbnVsbDsKKyAgICAgICAgdXNlcm5hbWUgPSBudWxsOworICAgICAgICBwYXNzd29yZCA9IG51bGw7CisgICAgICAgIHR5cGUgPSBudWxsOworICAgIAorICAgICAgICBhY3RpdmUgPSBudWxsOworICAgICAgICBpZGxlID0gbnVsbDsKKyAgICAgICAgd2FpdCA9IG51bGw7CisgICAgICAgIHF1ZXJ5ID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICAKKyAgICBwcml2YXRlIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBudWxsOworICAgIAorICAgIHB1YmxpYyBBY3Rpb25FcnJvcnMgdmFsaWRhdGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworCisgICAgICAgIC8vIHVybCBpcyBhIHJlcXVpcmVkIGZpZWxkCisgICAgICAgIGlmICgodXJsID09IG51bGwpIHx8ICh1cmwubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgidXJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoInJlc291cmNlcy5lcnJvci51cmwucmVxdWlyZWQiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBqbmRpTmFtZSBpcyBhIHJlcXVpcmVkIGZpZWxkCisgICAgICAgIGlmICgoIGpuZGlOYW1lID09IG51bGwpIHx8IChqbmRpTmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJqbmRpTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJyZXNvdXJjZXMuZXJyb3Iuam5kaU5hbWUucmVxdWlyZWQiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkcml2ZXJDbGFzcyBpcyBhIHJlcXVpcmVkIGZpZWxkCisgICAgICAgIGlmICgoZHJpdmVyQ2xhc3MgPT0gbnVsbCkgfHwgKGRyaXZlckNsYXNzLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoImRyaXZlckNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoInJlc291cmNlcy5lcnJvci5kcml2ZXJDbGFzcy5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRklYIE1FIC0tIG5lZWQgdG8gZG8gYSByYW5nZSBjaGVjaworICAgICAgICBudW1iZXJDaGVjaygiYWN0aXZlIiwgYWN0aXZlICwgZmFsc2UsIDAsIDEwMDAwKTsKKyAgICAgICAgbnVtYmVyQ2hlY2soImlkbGUiLCBpZGxlICwgZmFsc2UsIDAsIDEwMDAwKTsKKyAgICAgICAgbnVtYmVyQ2hlY2soIndhaXQiLCB3YWl0ICwgZmFsc2UsIDAsIDEwMDAwKTsKKworICAgICAgICAvLyBRdW90ZXMgbm90IGFsbG93ZWQgaW4gdXNlcm5hbWUKKyAgICAgICAgaWYgKCh1c2VybmFtZSAhPSBudWxsKSAmJiAodXNlcm5hbWUuaW5kZXhPZignIicpID49IDApKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJ1c2VybmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJ1c2Vycy5lcnJvci5xdW90ZXMiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBRdW90ZXMgbm90IGFsbG93ZWQgaW4gcGFzc3dvcmQKKyAgICAgICAgaWYgKChwYXNzd29yZCAhPSBudWxsKSAmJiAocGFzc3dvcmQuaW5kZXhPZignIicpID4gMCkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoInBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoInVzZXJzLmVycm9yLnF1b3RlcyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoZXJyb3JzKTsKKyAgICB9CisgCisgICAgLyoKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIHRoYXQgaXQgaXMgYSByZXF1aXJlZCBudW1iZXIgYW5kCisgICAgICogaXMgYSB2YWxpZCBpbnRlZ2VyIHdpdGhpbiB0aGUgZ2l2ZW4gcmFuZ2UuIChtaW4sIG1heCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGZpZWxkICBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybSBmb3Igd2hpY2ggdGhpcyBlcnJvciBvY2N1cmVkLgorICAgICAqIEBwYXJhbSAgbnVtVGV4dCAgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbnVtYmVyLgorICAgICAqIEBwYXJhbSByYW5nZUNoZWNrICBCb29sZWFuIHZhbHVlIHNldCB0byB0cnVlIG9mIHJlYW5nZSBjaGVjayBzaG91bGQgYmUgcGVyZm9ybWVkLgorICAgICAqCisgICAgICogQHBhcmFtICBtaW4gIFRoZSBsb3dlciBsaW1pdCBvZiB0aGUgcmFuZ2UKKyAgICAgKiBAcGFyYW0gIG1heCAgVGhlIHVwcGVyIGxpbWl0IG9mIHRoZSByYW5nZQorICAgICAqCisgICAgICovCisgICAgCisgICAgcHJpdmF0ZSB2b2lkIG51bWJlckNoZWNrKFN0cmluZyBmaWVsZCwgU3RyaW5nIG51bVRleHQsIGJvb2xlYW4gcmFuZ2VDaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbiwgaW50IG1heCkgeworICAgICAgICAKKyAgICAgICAgLy8gQ2hlY2sgZm9yICdpcyByZXF1aXJlZCcKKyAgICAgICAgaWYgKChudW1UZXh0ID09IG51bGwpIHx8IChudW1UZXh0Lmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoZmllbGQsIG5ldyBBY3Rpb25NZXNzYWdlKCJyZXNvdXJjZXMuZXJyb3IuIitmaWVsZCsiLnJlcXVpcmVkIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBjaGVjayBmb3IgJ211c3QgYmUgYSBudW1iZXInIGluIHRoZSAndmFsaWQgcmFuZ2UnCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludCBudW0gPSBJbnRlZ2VyLnBhcnNlSW50KG51bVRleHQpOworICAgICAgICAgICAgICAgIC8vIHBlcmZvcm0gcmFuZ2UgY2hlY2sgb25seSBpZiByZXF1aXJlZAorICAgICAgICAgICAgICAgIGlmIChyYW5nZUNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgobnVtIDwgbWluKSB8fCAobnVtID4gbWF4ICkpCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJyZXNvdXJjZXMuZXJyb3IuIisgZmllbGQgKyIucmFuZ2UiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKGZpZWxkLAorICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJyZXNvdXJjZXMuaW50ZWdlci5lcnJvciIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRGF0YVNvdXJjZXNGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0RhdGFTb3VyY2VzRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOGM3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0RhdGFTb3VyY2VzRm9ybS5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgZGVsZXRlIGRhdGEgc291cmNlcyBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBEYXRhU291cmNlc0Zvcm0gZXh0ZW5kcyBCYXNlRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lcyBvZiB0aGUgc3BlY2lmaWVkIGVudmlyb25tZW50IGVudHJpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGF0YVNvdXJjZXNbXSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RGF0YVNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kYXRhU291cmNlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGF0YVNvdXJjZXMoU3RyaW5nIGRhdGFTb3VyY2VzW10pIHsKKyAgICAgICAgdGhpcy5kYXRhU291cmNlcyA9IGRhdGFTb3VyY2VzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSByZXNvdXJjZSB0eXBlIG9mIHRoaXMgZGF0YSBzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2V0eXBlID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIHR5cGUgb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZXR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNldHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlc291cmNlIHR5cGUgb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2V0eXBlKFN0cmluZyByZXNvdXJjZXR5cGUpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZXR5cGUgPSByZXNvdXJjZXR5cGU7CisgICAgfQorICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBwYXRoIG9mIHRoaXMgZGF0YSBzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXRoIG9mIHRoZSBkYXRhIHNvdXJjZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgIH0KKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgaG9zdCBvZiB0aGlzIGRhdGEgc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGhvc3QgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaG9zdCBvZiB0aGUgZGF0YSBzb3VyY2UgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBob3N0IG9mIHRoZSBkYXRhIHNvdXJjZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKKyAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICB9ICAgIAorICAgIAorICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkb21haW4gb2YgdGhpcyBkYXRhIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkb21haW4gPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZG9tYWluIG9mIHRoZSBkYXRhIHNvdXJjZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kb21haW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkb21haW4gb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9tYWluKFN0cmluZyBkb21haW4pIHsKKyAgICAgICAgdGhpcy5kb21haW4gPSBkb21haW47CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7CisgICAgICAgIHRoaXMuZGF0YVNvdXJjZXMgPSBudWxsOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRGVsZXRlRGF0YVNvdXJjZXNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRGVsZXRlRGF0YVNvdXJjZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDY1YWIwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9EZWxldGVEYXRhU291cmNlc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IGRlbGV0ZXMgdGhlCisgKiBzcGVjaWZpZWQgc2V0IG9mIGRhdGFTb3VyY2UgZW50cmllcy48L3A+CisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIERlbGV0ZURhdGFTb3VyY2VzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtc2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gSGFzIHRoaXMgdHJhbnNhY3Rpb24gYmVlbiBjYW5jZWxsZWQ/CisgICAgICAgIGlmIChpc0NhbmNlbGxlZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJMaXN0IERhdGFTb3VyY2VzIFNldHVwIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHRva2VuCisgICAgICAgIGlmICghaXNUb2tlblZhbGlkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IudG9rZW4iKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbnkgZXh0cmEgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkCisgICAgICAgIERhdGFTb3VyY2VzRm9ybSBkYXRhU291cmNlc0Zvcm0gPSAoRGF0YVNvdXJjZXNGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgZGF0YVNvdXJjZXNbXSA9IGRhdGFTb3VyY2VzRm9ybS5nZXREYXRhU291cmNlcygpOworICAgICAgICBpZiAoZGF0YVNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YVNvdXJjZXMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSAiRGVsZXRlIEVudkVudHJ5IiB0cmFuc2FjdGlvbnMgYXMgcmVxdWlyZWQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHJlc291cmNldHlwZSA9IGRhdGFTb3VyY2VzRm9ybS5nZXRSZXNvdXJjZXR5cGUoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZGF0YVNvdXJjZXNGb3JtLmdldFBhdGgoKTsKKyAgICAgICAgICAgIFN0cmluZyBob3N0ID0gZGF0YVNvdXJjZXNGb3JtLmdldEhvc3QoKTsKKyAgICAgICAgICAgIC8vU3RyaW5nIGRvbWFpbiA9IGRhdGFTb3VyY2VzRm9ybS5nZXREb21haW4oKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgT2JqZWN0TmFtZSBkbmFtZSA9IG51bGw7CisKKyAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmVbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICBzaWduYXR1cmVbMF0gPSAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgICAgICBPYmplY3QgcGFyYW1zW10gPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhU291cmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShkYXRhU291cmNlc1tpXSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG9uYW1lLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgIGRuYW1lID0gUmVzb3VyY2VVdGlscy5nZXROYW1pbmdSZXNvdXJjZU9iamVjdE5hbWUoZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNldHlwZSwgcGF0aCwgaG9zdCk7CisgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZShkbmFtZSwgInJlbW92ZVJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW92ZVJlc291cmNlIiksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlUmVzb3VyY2UiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZWVkIHRvIHRoZSBsaXN0IGVudkVudHJ5cyBzY3JlZW4KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJEYXRhU291cmNlcyBMaXN0IFNldHVwIikpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0RlbGV0ZUVudkVudHJpZXNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRGVsZXRlRW52RW50cmllc0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZmI5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0RlbGV0ZUVudkVudHJpZXNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IGRlbGV0ZXMgdGhlCisgKiBzcGVjaWZpZWQgc2V0IG9mIGVudiBlbnRyaWVzLjwvcD4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgRGVsZXRlRW52RW50cmllc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gSGFzIHRoaXMgdHJhbnNhY3Rpb24gYmVlbiBjYW5jZWxsZWQ/CisgICAgICAgIGlmIChpc0NhbmNlbGxlZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJMaXN0IEVudkVudHJpZXMgU2V0dXAiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGUgdHJhbnNhY3Rpb24gdG9rZW4KKyAgICAgICAgaWYgKCFpc1Rva2VuVmFsaWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci50b2tlbiIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGFueSBleHRyYSB2YWxpZGF0aW9uIHRoYXQgaXMgcmVxdWlyZWQKKyAgICAgICAgRW52RW50cmllc0Zvcm0gZW52RW50cmllc0Zvcm0gPSAoRW52RW50cmllc0Zvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBlbnZFbnRyaWVzW10gPSBlbnZFbnRyaWVzRm9ybS5nZXRFbnZFbnRyaWVzKCk7CisgICAgICAgIFN0cmluZyByZXNvdXJjZXR5cGUgPSBlbnZFbnRyaWVzRm9ybS5nZXRSZXNvdXJjZXR5cGUoKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBlbnZFbnRyaWVzRm9ybS5nZXRQYXRoKCk7CisgICAgICAgIFN0cmluZyBob3N0ID0gZW52RW50cmllc0Zvcm0uZ2V0SG9zdCgpOworICAgICAgICAKKyAgICAgICAgaWYgKGVudkVudHJpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgZW52RW50cmllcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtICJEZWxldGUgRW52RW50cnkiIHRyYW5zYWN0aW9ucyBhcyByZXF1aXJlZAorICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0TmFtZSBkbmFtZSA9IG51bGw7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmVbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICBzaWduYXR1cmVbMF0gPSAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgICAgICBPYmplY3QgcGFyYW1zW10gPSBuZXcgU3RyaW5nWzFdOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudkVudHJpZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoZW52RW50cmllc1tpXSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG9uYW1lLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgIGRuYW1lID0gUmVzb3VyY2VVdGlscy5nZXROYW1pbmdSZXNvdXJjZU9iamVjdE5hbWUoZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNldHlwZSwgcGF0aCwgaG9zdCk7CisgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZShkbmFtZSwgInJlbW92ZUVudmlyb25tZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRW52aXJvbm1lbnQiKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVFbnZpcm9ubWVudCIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2NlZWQgdG8gdGhlIGxpc3QgZW52RW50cnlzIHNjcmVlbgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkVudkVudHJpZXMgTGlzdCBTZXR1cCIpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9EZWxldGVNYWlsU2Vzc2lvbnNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRGVsZXRlTWFpbFNlc3Npb25zQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMwZDg5NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRGVsZXRlTWFpbFNlc3Npb25zQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgZGVsZXRlcyB0aGUKKyAqIHNwZWNpZmllZCBzZXQgb2YgbWFpbFNlc3Npb24gZW50cmllcy48L3A+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBEZWxldGVNYWlsU2Vzc2lvbnNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKworICAgICAgICAvLyBIYXMgdGhpcyB0cmFuc2FjdGlvbiBiZWVuIGNhbmNlbGxlZD8KKyAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkxpc3QgTWFpbFNlc3Npb25zIFNldHVwIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHRva2VuCisgICAgICAgIGlmICghaXNUb2tlblZhbGlkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IudG9rZW4iKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbnkgZXh0cmEgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkCisgICAgICAgIE1haWxTZXNzaW9uc0Zvcm0gbWFpbFNlc3Npb25zRm9ybSA9IChNYWlsU2Vzc2lvbnNGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgbWFpbFNlc3Npb25zW10gPSBtYWlsU2Vzc2lvbnNGb3JtLmdldE1haWxTZXNzaW9ucygpOworICAgICAgICBpZiAobWFpbFNlc3Npb25zID09IG51bGwpIHsKKyAgICAgICAgICAgIG1haWxTZXNzaW9ucyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtICJEZWxldGUgRW52RW50cnkiIHRyYW5zYWN0aW9ucyBhcyByZXF1aXJlZAorICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2V0eXBlID0gbWFpbFNlc3Npb25zRm9ybS5nZXRSZXNvdXJjZXR5cGUoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbWFpbFNlc3Npb25zRm9ybS5nZXRQYXRoKCk7CisgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IG1haWxTZXNzaW9uc0Zvcm0uZ2V0SG9zdCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBPYmplY3ROYW1lIGRuYW1lID0gbnVsbDsKKworICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZVtdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIHNpZ25hdHVyZVswXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICAgICAgICAgIE9iamVjdCBwYXJhbXNbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1haWxTZXNzaW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShtYWlsU2Vzc2lvbnNbaV0pOworICAgICAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSBvbmFtZS5nZXREb21haW4oKTsKKyAgICAgICAgICAgICAgICBkbmFtZSA9IFJlc291cmNlVXRpbHMuZ2V0TmFtaW5nUmVzb3VyY2VPYmplY3ROYW1lKGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXR5cGUsIHBhdGgsIGhvc3QpOworICAgICAgICAgICAgICAgIHBhcmFtc1swXSA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZG5hbWUsICJyZW1vdmVSZXNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBzaWduYXR1cmUpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVSZXNvdXJjZSIpLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW92ZVJlc291cmNlIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VlZCB0byB0aGUgbGlzdCBlbnZFbnRyeXMgc2NyZWVuCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiTWFpbFNlc3Npb25zIExpc3QgU2V0dXAiKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRGVsZXRlUmVzb3VyY2VMaW5rc0FjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9EZWxldGVSZXNvdXJjZUxpbmtzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkYjFjNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRGVsZXRlUmVzb3VyY2VMaW5rc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IGRlbGV0ZXMgdGhlCisgKiBzcGVjaWZpZWQgc2V0IG9mIHJlc291cmNlIGxpbmtzIGVudHJpZXMuPC9wPgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgRGVsZXRlUmVzb3VyY2VMaW5rc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIEhhcyB0aGlzIHRyYW5zYWN0aW9uIGJlZW4gY2FuY2VsbGVkPworICAgICAgICBpZiAoaXNDYW5jZWxsZWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiTGlzdCBSZXNvdXJjZSBMaW5rcyBTZXR1cCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoZSB0cmFuc2FjdGlvbiB0b2tlbgorICAgICAgICBpZiAoIWlzVG9rZW5WYWxpZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnRva2VuIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYW55IGV4dHJhIHZhbGlkYXRpb24gdGhhdCBpcyByZXF1aXJlZAorICAgICAgICBSZXNvdXJjZUxpbmtzRm9ybSByZXNvdXJjZUxpbmtzRm9ybSA9IChSZXNvdXJjZUxpbmtzRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIHJlc291cmNlTGlua3NbXSA9IHJlc291cmNlTGlua3NGb3JtLmdldFJlc291cmNlTGlua3MoKTsKKyAgICAgICAgaWYgKHJlc291cmNlTGlua3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2VMaW5rcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtICJEZWxldGUgUmVzb3VyY2UgTGluayIgdHJhbnNhY3Rpb25zIGFzIHJlcXVpcmVkCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZXR5cGUgPSByZXNvdXJjZUxpbmtzRm9ybS5nZXRSZXNvdXJjZXR5cGUoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gcmVzb3VyY2VMaW5rc0Zvcm0uZ2V0UGF0aCgpOworICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSByZXNvdXJjZUxpbmtzRm9ybS5nZXRIb3N0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE9iamVjdE5hbWUgZG5hbWUgPSBudWxsOworCisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZUxpbmtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKHJlc291cmNlTGlua3NbaV0pOworICAgICAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSBvbmFtZS5nZXREb21haW4oKTsgIAorICAgICAgICAgICAgICAgIGRuYW1lID0gUmVzb3VyY2VVdGlscy5nZXROYW1pbmdSZXNvdXJjZU9iamVjdE5hbWUoZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNldHlwZSwgcGF0aCwgaG9zdCk7CisgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZShkbmFtZSwgInJlbW92ZVJlc291cmNlTGluayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBzaWduYXR1cmUpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW92ZVJlc291cmNlIiksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlUmVzb3VyY2UiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZWVkIHRvIHRoZSBsaXN0IGVudkVudHJ5cyBzY3JlZW4KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJSZXNvdXJjZUxpbmtzIExpc3QgU2V0dXAiKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRGVsZXRlVXNlckRhdGFiYXNlc0FjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9EZWxldGVVc2VyRGF0YWJhc2VzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1NTQzNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRGVsZXRlVXNlckRhdGFiYXNlc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgZGVsZXRlcyB0aGUKKyAqIHNwZWNpZmllZCBzZXQgb2YgdXNlciBkYXRhYmFzZXMuPC9wPgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBEZWxldGVVc2VyRGF0YWJhc2VzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtc2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gSGFzIHRoaXMgdHJhbnNhY3Rpb24gYmVlbiBjYW5jZWxsZWQ/CisgICAgICAgIGlmIChpc0NhbmNlbGxlZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJMaXN0IFVzZXJEYXRhYmFzZXMgU2V0dXAiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGUgdHJhbnNhY3Rpb24gdG9rZW4KKyAgICAgICAgaWYgKCFpc1Rva2VuVmFsaWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci50b2tlbiIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGFueSBleHRyYSB2YWxpZGF0aW9uIHRoYXQgaXMgcmVxdWlyZWQKKyAgICAgICAgVXNlckRhdGFiYXNlc0Zvcm0gdXNlckRhdGFiYXNlc0Zvcm0gPSAoVXNlckRhdGFiYXNlc0Zvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyB1c2VyRGF0YWJhc2VzW10gPSB1c2VyRGF0YWJhc2VzRm9ybS5nZXRVc2VyRGF0YWJhc2VzKCk7CisgICAgICAgIGlmICh1c2VyRGF0YWJhc2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHVzZXJEYXRhYmFzZXMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSAiRGVsZXRlIFVzZXIgRGF0YWJhc2UiIHRyYW5zYWN0aW9ucyBhcyByZXF1aXJlZAorICAgICAgICB0cnkgeworCisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdID0gbmV3IFN0cmluZ1sxXTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1c2VyRGF0YWJhc2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKHVzZXJEYXRhYmFzZXNbaV0pOworICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgTUJlYW4gTmFtZSBmb3IgdGhlIG5hbWluZyBzb3VyY2UKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIGRuYW1lID0gbmV3IE9iamVjdE5hbWUob25hbWUuZ2V0RG9tYWluKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5OQU1JTkdSRVNPVVJDRVNfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5HTE9CQUxfVFlQRSk7CisgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZShkbmFtZSwgInJlbW92ZVJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlUmVzb3VyY2UiKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVSZXNvdXJjZSIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2NlZWQgdG8gdGhlIGxpc3QgZW52RW50cnlzIHNjcmVlbgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlVzZXJEYXRhYmFzZXMgTGlzdCBTZXR1cCIpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9FbnZFbnRyaWVzRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9FbnZFbnRyaWVzRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMzYyMTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0VudkVudHJpZXNGb3JtLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGRlbGV0ZSBlbnYgZW50cmllcyBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBFbnZFbnRyaWVzRm9ybSBleHRlbmRzIEJhc2VGb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWVzIG9mIHRoZSBzcGVjaWZpZWQgZW52aXJvbm1lbnQgZW50cmllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlbnZFbnRyaWVzW10gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZ1tdIGdldEVudkVudHJpZXMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5lbnZFbnRyaWVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFbnZFbnRyaWVzKFN0cmluZyBlbnZFbnRyaWVzW10pIHsKKyAgICAgICAgdGhpcy5lbnZFbnRyaWVzID0gZW52RW50cmllczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHJlc291cmNlIHR5cGUgb2YgdGhpcyBlbnZpcm9ubWVudCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZXR5cGUgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNldHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2V0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXR5cGUoU3RyaW5nIHJlc291cmNldHlwZSkgeworICAgICAgICB0aGlzLnJlc291cmNldHlwZSA9IHJlc291cmNldHlwZTsKKyAgICB9CisgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIHBhdGggb2YgdGhpcyBlbnZpcm9ubWVudCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXRoID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdGggb2YgdGhlIGVudmlyb25tZW50IGVudHJ5IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGF0aCBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBob3N0IG9mIHRoaXMgZW52aXJvbm1lbnQgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBob3N0IG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGhvc3Qgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkgeworICAgICAgICB0aGlzLmhvc3QgPSBob3N0OworICAgIH0gICAgCisgICAgCisgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIGRvbWFpbiBvZiB0aGlzIGVudmlyb25tZW50IGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkb21haW4gb2YgdGhlIGVudmlyb25tZW50IGVudHJ5IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREb21haW4oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRvbWFpbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRvbWFpbiBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREb21haW4oU3RyaW5nIGRvbWFpbikgeworICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7CisgICAgICAgIHRoaXMuZW52RW50cmllcyA9IG51bGw7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9FbnZFbnRyeUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRW52RW50cnlGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIzNzhhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRW52RW50cnlGb3JtLmphdmEKQEAgLTAsMCArMSwzNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBpbmRpdmlkdWFsIGVudmlyb25tZW50IGVudHJ5IHBhZ2UuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEVudkVudHJ5Rm9ybSBleHRlbmRzIEJhc2VGb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYXNzb2NpYXRlZCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlbnRyeVR5cGUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRFbnRyeVR5cGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5lbnRyeVR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVudHJ5VHlwZShTdHJpbmcgZW50cnlUeXBlKSB7CisgICAgICAgIHRoaXMuZW50cnlUeXBlID0gZW50cnlUeXBlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIHRoZSBhc3NvY2lhdGVkIGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy52YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGFzc29jaWF0ZWQgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiBvdmVycmlkZSBhcHBsIGxldmVsIGVudHJpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG92ZXJyaWRlID0gdHJ1ZTsKKworICAgIHB1YmxpYyBib29sZWFuIGdldE92ZXJyaWRlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMub3ZlcnJpZGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE92ZXJyaWRlKGJvb2xlYW4gb3ZlcnJpZGUpIHsKKyAgICAgICAgdGhpcy5vdmVycmlkZSA9IG92ZXJyaWRlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzb3VyY2UgdHlwZSBvZiB0aGlzIGVudmlyb25tZW50IGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlc291cmNldHlwZSA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXNvdXJjZSB0eXBlIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2V0eXBlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXNvdXJjZSB0eXBlIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNldHlwZShTdHJpbmcgcmVzb3VyY2V0eXBlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2V0eXBlID0gcmVzb3VyY2V0eXBlOworICAgIH0KKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aCBvZiB0aGlzIGVudmlyb25tZW50IGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhdGggPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGF0aCBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXRoIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICB9CisgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIGhvc3Qgb2YgdGhpcyBlbnZpcm9ubWVudCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBob3N0ID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGhvc3Qgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkgeworICAgICAgICByZXR1cm4gdGhpcy5ob3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaG9zdCBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgfSAgICAKKyAgICAKKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZG9tYWluIG9mIHRoaXMgZW52aXJvbm1lbnQgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZG9tYWluID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRvbWFpbiBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZG9tYWluOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZG9tYWluIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7CisgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmVjb21wdXRlZCBsaXN0IG9mIGVudHJ5IHR5cGUgbGFiZWxzIGFuZCB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCB0eXBlVmFscyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIHR5cGVWYWxzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4oImphdmEubGFuZy5Cb29sZWFuIiwgImphdmEubGFuZy5Cb29sZWFuIikpOworICAgICAgICB0eXBlVmFscy5hZGQobmV3IExhYmVsVmFsdWVCZWFuKCJqYXZhLmxhbmcuQnl0ZSIsICJqYXZhLmxhbmcuQnl0ZSIpKTsKKyAgICAgICAgdHlwZVZhbHMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbigiamF2YS5sYW5nLkNoYXJhY3RlciIsICJqYXZhLmxhbmcuQ2hhcmFjdGVyIikpOworICAgICAgICB0eXBlVmFscy5hZGQobmV3IExhYmVsVmFsdWVCZWFuKCJqYXZhLmxhbmcuRG91YmxlIiwgImphdmEubGFuZy5Eb3VibGUiKSk7CisgICAgICAgIHR5cGVWYWxzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4oImphdmEubGFuZy5GbG9hdCIsICJqYXZhLmxhbmcuRmxvYXQiKSk7CisgICAgICAgIHR5cGVWYWxzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4oImphdmEubGFuZy5JbnRlZ2VyIiwgImphdmEubGFuZy5JbnRlZ2VyIikpOyAgICAKKyAgICAgICAgdHlwZVZhbHMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbigiamF2YS5sYW5nLkxvbmciLCAiamF2YS5sYW5nLkxvbmciKSk7CisgICAgICAgIHR5cGVWYWxzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4oImphdmEubGFuZy5TaG9ydCIsICJqYXZhLmxhbmcuU2hvcnQiKSk7ICAgICAgICAKKyAgICAgICAgdHlwZVZhbHMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbigiamF2YS5sYW5nLlN0cmluZyIsICJqYXZhLmxhbmcuU3RyaW5nIikpOyAgICAgICAgICAgCisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZVZhbHMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0VHlwZVZhbHMoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdHlwZVZhbHM7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHR5cGVWYWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGVWYWxzKExpc3QgdGhlVHlwZVZhbHMpIHsKKyAgICAgICAgCisgICAgICAgIHR5cGVWYWxzID0gdGhlVHlwZVZhbHM7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7CisgICAgICAgIG5hbWUgPSBudWxsOworICAgICAgICBlbnRyeVR5cGUgPSBudWxsOworICAgICAgICB2YWx1ZSA9IG51bGw7CisgICAgICAgIGRlc2NyaXB0aW9uID0gbnVsbDsKKyAgICAgICAgb3ZlcnJpZGUgPSBmYWxzZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBmcm9tIHRoaXMgSFRUUCByZXF1ZXN0LAorICAgICAqIGFuZCByZXR1cm4gYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW55CisgICAgICogdmFsaWRhdGlvbiBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gZm91bmQuICBJZiBubyBlcnJvcnMgYXJlIGZvdW5kLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB3aXRoIG5vCisgICAgICogcmVjb3JkZWQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIAorICAgIHByaXZhdGUgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG51bGw7CisgICAgCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisKKyAgICAgICAgLy8gbmFtZSBpcyBhIHJlcXVpcmVkIGZpZWxkCisgICAgICAgIGlmICgobmFtZSA9PSBudWxsKSB8fCAobmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoInJlc291cmNlcy5lcnJvci5uYW1lLnJlcXVpcmVkIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmFsdWUgaXMgYSByZXF1aXJlZCBmaWVsZAorICAgICAgICBpZiAoKHZhbHVlID09IG51bGwpIHx8ICh2YWx1ZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJ2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJyZXNvdXJjZXMuZXJyb3IudmFsdWUucmVxdWlyZWQiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBRdW90ZXMgbm90IGFsbG93ZWQgaW4gbmFtZQorICAgICAgICBpZiAoKG5hbWUgIT0gbnVsbCkgJiYgKG5hbWUuaW5kZXhPZignIicpID49IDApKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoInVzZXJzLmVycm9yLnF1b3RlcyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFF1b3RlcyBub3QgYWxsb3dlZCBpbiB2YWx1ZQorICAgICAgICBpZiAoKHZhbHVlICE9IG51bGwpICYmICh2YWx1ZS5pbmRleE9mKCciJykgPiAwKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgidmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgidXNlcnMuZXJyb3IucXVvdGVzIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUXVvdGVzIG5vdCBhbGxvd2VkIGluIGRlc2NyaXB0aW9uCisgICAgICAgIGlmICgoZGVzY3JpcHRpb24gIT0gbnVsbCkgJiYgKGRlc2NyaXB0aW9uLmluZGV4T2YoJyInKSA+IDApKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJ1c2Vycy5lcnJvci5xdW90ZXMiKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIGlmIGNlaGNrZWQsIG92ZXJyaWRlIHdpbGwgYmUgc2VudCBhcyBhIHJlcXVlc3QgcGFyYW1ldGVyCisgICAgICAgIG92ZXJyaWRlID0gKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJvdmVycmlkZSIpICE9IG51bGwpOworICAgICAgICAKKyAgICAgICAgaWYgKHZhbGlkYXRlVHlwZShlbnRyeVR5cGUsIHZhbHVlKSkgeworICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgidmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgicmVzb3VyY2VzLmVycm9yLnZhbHVlLm1pc21hdGNoIikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChlcnJvcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVudHJ5IHR5cGUgbXVzdCBtYXRjaCB0eXBlIG9mIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVR5cGUoU3RyaW5nIGVudHJ5VHlwZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIENsYXNzIGNscyA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gbWlzbWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNscyA9IENsYXNzLmZvck5hbWUoZW50cnlUeXBlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNscykpIHsKKyAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBVSSByZXR1cm5zCisgICAgICAgICAgICAgICAgLy8gYSBzdHJpbmcgZXZlbiBpZiBpdCBpcyBhIGNoYXJhY3RlciAoc2luZ2xlIGxlbmd0aCBzdHJpbmcpLgorICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIG1pc21hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKEJvb2xlYW4uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbHMpKSB7CisgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBpcyBuZWVkZWQgYmVjYXVzZSBCb29sZWFuCisgICAgICAgICAgICAgICAgLy8gc3RyaW5nIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW55dGhpbmcgb3RoZXIgdGhhbgorICAgICAgICAgICAgICAgIC8vIHRydWUgdG8gYmUgZmFsc2UKKyAgICAgICAgICAgICAgICBpZiAoISgidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSkgfHwKKyAgICAgICAgICAgICAgICAiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKSkgeworICAgICAgICAgICAgICAgICAgICBtaXNtYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbHMpKSB7CisgICAgICAgICAgICAgICAgLy8gYWxsIG51bWJlcnMgdGhyb3cgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZXkgYXJlCisgICAgICAgICAgICAgICAgLy8gY29uc3RydWN0ZWQgd2l0aCBhbiBpbmNvcnJlY3QgbnVtYmVyIHN0cmluZworICAgICAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgZ2VuZXJhbCBzdHJpbmcgY29uc3RydWN0b3IgdG8gZG8gdGhpcyBqb2IKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIHBhcmFtZXRlclR5cGVzID0ge1N0cmluZy5jbGFzc307CisgICAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGN0ID0gY2xzLmdldENvbnN0cnVjdG9yKHBhcmFtZXRlclR5cGVzKTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFyZ2xpc3QxW10gPSB7dmFsdWV9OworICAgICAgICAgICAgICAgICAgICBjdC5uZXdJbnN0YW5jZShhcmdsaXN0MSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoU3RyaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xzKSkgeworICAgICAgICAgICAgICAgIC8vIGFsbCBzdHJpbmdzIGFyZSBhbGxvd2VkCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHZhbGlkYXRpb24gZm9yIG90aGVyIHR5cGVzIG5vdCBpbXBsZW1lbnRlZCB5ZXQKKyAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImVudHJ5VHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJyZXNvdXJjZXMuZXJyb3IuZW50cnlUeXBlLm5vdGltcGwiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworICAgICAgICAgICAgLy8gZW50cnkgdHlwZSBoYXMgYW4gaW52YWxpZCBlbnRyeQorICAgICAgICAgICBlcnJvcnMuYWRkKCJlbnRyeVR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgicmVzb3VyY2VzLmVycm9yLmVudHJ5VHlwZS5pbnZhbGlkIikpOworICAgICAgICAgfSAgICAgICAgCisgICAgICAgIHJldHVybiBtaXNtYXRjaDsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0xpc3REYXRhU291cmNlc0FjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9MaXN0RGF0YVNvdXJjZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzYwMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9MaXN0RGF0YVNvdXJjZXNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworCisvKioKKyAqIDxwPlJldHJpZXZlIHRoZSBzZXQgb2YgTUJlYW4gbmFtZXMgZm9yIGFsbCBjdXJyZW50bHkgZGVmaW5lZCBkYXRhIHNvdXJjZXMsCisgKiBhbmQgZXhwb3NlIHRoZW0gaW4gYSByZXF1ZXN0IGF0dHJpYnV0ZSBuYW1lZCAiZGF0YVNvdXJjZXNGb3JtIi4gIFRoaXMgYWN0aW9uCisgKiByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHJlcXVlc3QgcGFyYW1ldGVycyB0byBiZSBzZXQ6PC9wPgorICogPHVsPgorICogPGxpPjxzdHJvbmc+Zm9yd2FyZDwvc3Ryb25nPiAtIEdsb2JhbCBmb3J3YXJkIHRvIHdoaWNoIHdlIHNob3VsZAorICogICAgIGdvIGFmdGVyIHN0YXNoaW5nIHRoZSBkYXRhU291cmNlcyBsaXN0LjwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIExpc3REYXRhU291cmNlc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyByZXNvdXJjZXR5cGUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicmVzb3VyY2V0eXBlIik7CisgICAgICAgIFN0cmluZyBwYXRoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhdGgiKTsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiaG9zdCIpOworICAgICAgICBTdHJpbmcgZG9tYWluID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRvbWFpbiIpOworICAgICAgICAKKyAgICAgICAgaWYgKHJlc291cmNldHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZXR5cGUgPSBVUkxEZWNvZGVyLmRlY29kZShyZXNvdXJjZXR5cGUsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXRoID0gVVJMRGVjb2Rlci5kZWNvZGUocGF0aCxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpOworICAgICAgICB9CisgICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGhvc3QgPSBVUkxEZWNvZGVyLmRlY29kZShob3N0LFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvbWFpbiAhPSBudWxsKSB7CisgICAgICAgICAgICBkb21haW4gPSBVUkxEZWNvZGVyLmRlY29kZShkb21haW4sVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQ3JlYXRlIGEgZm9ybSBiZWFuIGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBNQmVhbiBOYW1lcworICAgICAgICBEYXRhU291cmNlc0Zvcm0gZGF0YVNvdXJjZXNGb3JtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgZGF0YVNvdXJjZXNGb3JtID0gCisgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5nZXREYXRhU291cmNlc0Zvcm0obXNlcnZlciwgcmVzb3VyY2V0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIGhvc3QsIGRvbWFpbik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsICJyZXNvdXJjZXMiKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgIChsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgInJlc291cmNlcyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXNoIHRoZSByZXN1bHRzIGluIHJlcXVlc3Qgc2NvcGUKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoImRhdGFTb3VyY2VzRm9ybSIsIGRhdGFTb3VyY2VzRm9ybSk7CisgICAgICAgIHNhdmVUb2tlbihyZXF1ZXN0KTsKKyAgICAgICAgU3RyaW5nIGZvcndhcmQgPQorICAgICAgICAgICAgVVJMRGVjb2Rlci5kZWNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImZvcndhcmQiKSxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKGZvcndhcmQpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvTGlzdEVudkVudHJpZXNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvTGlzdEVudkVudHJpZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzk4ZDVlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9MaXN0RW52RW50cmllc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CisKKy8qKgorICogPHA+UmV0cmlldmUgdGhlIHNldCBvZiBNQmVhbiBuYW1lcyBmb3IgYWxsIGN1cnJlbnRseSBkZWZpbmVkIGVudmlyb25tZW50IGVudHJpZXMsCisgKiBhbmQgZXhwb3NlIHRoZW0gaW4gYSByZXF1ZXN0IGF0dHJpYnV0ZSBuYW1lZCAiZW52ZW50cmllc0Zvcm0iLiAgVGhpcyBhY3Rpb24KKyAqIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIGJlIHNldDo8L3A+CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5mb3J3YXJkPC9zdHJvbmc+IC0gR2xvYmFsIGZvcndhcmQgdG8gd2hpY2ggd2Ugc2hvdWxkCisgKiAgICAgZ28gYWZ0ZXIgc3Rhc2hpbmcgdGhlIGVudiBlbnRyaWVzIGxpc3QuPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIExpc3RFbnZFbnRyaWVzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyByZXNvdXJjZXR5cGUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicmVzb3VyY2V0eXBlIik7CisgICAgICAgIFN0cmluZyBwYXRoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhdGgiKTsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiaG9zdCIpOworICAgICAgICBTdHJpbmcgZG9tYWluID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRvbWFpbiIpOworICAgICAgICAKKyAgICAgICAgaWYgKHJlc291cmNldHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZXR5cGUgPSBVUkxEZWNvZGVyLmRlY29kZShyZXNvdXJjZXR5cGUsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXRoID0gVVJMRGVjb2Rlci5kZWNvZGUocGF0aCxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpOworICAgICAgICB9CisgICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGhvc3QgPSBVUkxEZWNvZGVyLmRlY29kZShob3N0LFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvbWFpbiAhPSBudWxsKSB7CisgICAgICAgICAgICBkb21haW4gPSBVUkxEZWNvZGVyLmRlY29kZShkb21haW4sVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKTsKKyAgICAgICAgfQorICAgICAgICAvLyBDcmVhdGUgYSBmb3JtIGJlYW4gY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIE1CZWFuIE5hbWVzCisgICAgICAgIEVudkVudHJpZXNGb3JtIGVudkVudHJpZXNGb3JtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgZW52RW50cmllc0Zvcm0gPSAKKyAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5nZXRFbnZFbnRyaWVzRm9ybShtc2VydmVyLCByZXNvdXJjZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgaG9zdCwgZG9tYWluKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cocmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgImVudmlyb25tZW50cyIpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCAiZW52aXJvbm1lbnRzIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3Rhc2ggdGhlIHJlc3VsdHMgaW4gcmVxdWVzdCBzY29wZQorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiZW52RW50cmllc0Zvcm0iLCBlbnZFbnRyaWVzRm9ybSk7CisgICAgICAgIHNhdmVUb2tlbihyZXF1ZXN0KTsKKyAgICAgICAgU3RyaW5nIGZvcndhcmQgPQorICAgICAgICAgICAgVVJMRGVjb2Rlci5kZWNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImZvcndhcmQiKSxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKGZvcndhcmQpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvTGlzdE1haWxTZXNzaW9uc0FjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9MaXN0TWFpbFNlc3Npb25zQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlNzgwMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvTGlzdE1haWxTZXNzaW9uc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CisKKy8qKgorICogPHA+UmV0cmlldmUgdGhlIHNldCBvZiBNQmVhbiBuYW1lcyBmb3IgYWxsIGN1cnJlbnRseSBkZWZpbmVkIG1haWwgc2Vzc2lvbnMsCisgKiBhbmQgZXhwb3NlIHRoZW0gaW4gYSByZXF1ZXN0IGF0dHJpYnV0ZSBuYW1lZCAibWFpbFNlc3Npb25zRm9ybSIuICBUaGlzIGFjdGlvbgorICogcmVxdWlyZXMgdGhlIGZvbGxvd2luZyByZXF1ZXN0IHBhcmFtZXRlcnMgdG8gYmUgc2V0OjwvcD4KKyAqIDx1bD4KKyAqIDxsaT48c3Ryb25nPmZvcndhcmQ8L3N0cm9uZz4gLSBHbG9iYWwgZm9yd2FyZCB0byB3aGljaCB3ZSBzaG91bGQKKyAqICAgICBnbyBhZnRlciBzdGFzaGluZyB0aGUgbWFpbFNlc3Npb25zIGxpc3QuPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBjbGFzcyBMaXN0TWFpbFNlc3Npb25zQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHJlc291cmNldHlwZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJyZXNvdXJjZXR5cGUiKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBTdHJpbmcgaG9zdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJob3N0Iik7CisgICAgICAgIFN0cmluZyBkb21haW4gPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiZG9tYWluIik7CisgICAgICAgIAorICAgICAgICBpZiAocmVzb3VyY2V0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc291cmNldHlwZSA9IFVSTERlY29kZXIuZGVjb2RlKHJlc291cmNldHlwZSxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhdGggPSBVUkxEZWNvZGVyLmRlY29kZShwYXRoLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgaG9zdCA9IFVSTERlY29kZXIuZGVjb2RlKGhvc3QsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZG9tYWluICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRvbWFpbiA9IFVSTERlY29kZXIuZGVjb2RlKGRvbWFpbixUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBDcmVhdGUgYSBmb3JtIGJlYW4gY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIE1CZWFuIE5hbWVzCisgICAgICAgIE1haWxTZXNzaW9uc0Zvcm0gbWFpbFNlc3Npb25zRm9ybSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIG1haWxTZXNzaW9uc0Zvcm0gPSAKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLmdldE1haWxTZXNzaW9uc0Zvcm0obXNlcnZlciwgcmVzb3VyY2V0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIGhvc3QsIGRvbWFpbik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsICJyZXNvdXJjZXMiKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgIChsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgInJlc291cmNlcyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXNoIHRoZSByZXN1bHRzIGluIHJlcXVlc3Qgc2NvcGUKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIm1haWxTZXNzaW9uc0Zvcm0iLCBtYWlsU2Vzc2lvbnNGb3JtKTsKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICBTdHJpbmcgZm9yd2FyZCA9CisgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZm9yd2FyZCIpLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoZm9yd2FyZCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9MaXN0UmVzb3VyY2VMaW5rc0FjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9MaXN0UmVzb3VyY2VMaW5rc0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMDA4OGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0xpc3RSZXNvdXJjZUxpbmtzQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKKworLyoqCisgKiA8cD5SZXRyaWV2ZSB0aGUgc2V0IG9mIE1CZWFuIG5hbWVzIGZvciBhbGwgY3VycmVudGx5IGRlZmluZWQgcmVzb3VyY2UgbGlua3MsCisgKiBhbmQgZXhwb3NlIHRoZW0gaW4gYSByZXF1ZXN0IGF0dHJpYnV0ZSBuYW1lZCAicmVzb3VyY2VMaW5rc0Zvcm0iLiAgVGhpcyBhY3Rpb24KKyAqIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIGJlIHNldDo8L3A+CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5mb3J3YXJkPC9zdHJvbmc+IC0gR2xvYmFsIGZvcndhcmQgdG8gd2hpY2ggd2Ugc2hvdWxkCisgKiAgICAgZ28gYWZ0ZXIgc3Rhc2hpbmcgdGhlIHJlc291cmNlTGlua3MgbGlzdC48L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIExpc3RSZXNvdXJjZUxpbmtzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHJlc291cmNldHlwZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJyZXNvdXJjZXR5cGUiKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBTdHJpbmcgaG9zdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJob3N0Iik7CisgICAgICAgIFN0cmluZyBkb21haW4gPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiZG9tYWluIik7CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKHJlc291cmNldHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZXR5cGUgPSBVUkxEZWNvZGVyLmRlY29kZShyZXNvdXJjZXR5cGUsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXRoID0gVVJMRGVjb2Rlci5kZWNvZGUocGF0aCxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpOworICAgICAgICB9CisgICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGhvc3QgPSBVUkxEZWNvZGVyLmRlY29kZShob3N0LFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvbWFpbiAhPSBudWxsKSB7CisgICAgICAgICAgICBkb21haW4gPSBVUkxEZWNvZGVyLmRlY29kZShkb21haW4sVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQ3JlYXRlIGEgZm9ybSBiZWFuIGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBNQmVhbiBOYW1lcworICAgICAgICBSZXNvdXJjZUxpbmtzRm9ybSByZXNvdXJjZUxpbmtzRm9ybSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIHJlc291cmNlTGlua3NGb3JtID0gCisgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5nZXRSZXNvdXJjZUxpbmtzRm9ybShtc2VydmVyLCByZXNvdXJjZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgaG9zdCwgZG9tYWluKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cocmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgInJlc291cmNlcyIpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCAicmVzb3VyY2VzIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3Rhc2ggdGhlIHJlc3VsdHMgaW4gcmVxdWVzdCBzY29wZQorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgicmVzb3VyY2VMaW5rc0Zvcm0iLCByZXNvdXJjZUxpbmtzRm9ybSk7CisgICAgICAgIHNhdmVUb2tlbihyZXF1ZXN0KTsKKyAgICAgICAgU3RyaW5nIGZvcndhcmQgPQorICAgICAgICAgICAgVVJMRGVjb2Rlci5kZWNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImZvcndhcmQiKSxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKGZvcndhcmQpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvTGlzdFVzZXJEYXRhYmFzZXNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvTGlzdFVzZXJEYXRhYmFzZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjllOWVhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9MaXN0VXNlckRhdGFiYXNlc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CisKKy8qKgorICogPHA+UmV0cmlldmUgdGhlIHNldCBvZiBNQmVhbiBuYW1lcyBmb3IgYWxsIGN1cnJlbnRseSBkZWZpbmVkIGVudmlyb25tZW50IGVudHJpZXMsCisgKiBhbmQgZXhwb3NlIHRoZW0gaW4gYSByZXF1ZXN0IGF0dHJpYnV0ZSBuYW1lZCAiZW52ZW50cmllc0Zvcm0iLiAgVGhpcyBhY3Rpb24KKyAqIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIGJlIHNldDo8L3A+CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5mb3J3YXJkPC9zdHJvbmc+IC0gR2xvYmFsIGZvcndhcmQgdG8gd2hpY2ggd2Ugc2hvdWxkCisgKiAgICAgZ28gYWZ0ZXIgc3Rhc2hpbmcgdGhlIGVudiBlbnRyaWVzIGxpc3QuPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIExpc3RVc2VyRGF0YWJhc2VzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKworICAgICAgICBTdHJpbmcgZG9tYWluID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRvbWFpbiIpOworICAgICAgICBpZiAoZG9tYWluICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRvbWFpbiA9IFVSTERlY29kZXIuZGVjb2RlKGRvbWFpbixUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpOworICAgICAgICB9CisgICAgICAgIC8vIENyZWF0ZSBhIGZvcm0gYmVhbiBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQgTUJlYW4gTmFtZXMKKyAgICAgICAgVXNlckRhdGFiYXNlc0Zvcm0gdXNlckRhdGFiYXNlc0Zvcm0gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgICB1c2VyRGF0YWJhc2VzRm9ybSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5nZXRVc2VyRGF0YWJhc2VzRm9ybShtc2VydmVyLCBkb21haW4pOworICAgICAgICAgICAgICB1c2VyRGF0YWJhc2VzRm9ybS5zZXREb21haW4oZG9tYWluKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cocmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgInJlc291cmNlcyIpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCAicmVzb3VyY2VzIikpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBTdGFzaCB0aGUgcmVzdWx0cyBpbiByZXF1ZXN0IHNjb3BlCisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJ1c2VyRGF0YWJhc2VzRm9ybSIsIHVzZXJEYXRhYmFzZXNGb3JtKTsKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICBTdHJpbmcgZm9yd2FyZCA9CisgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZm9yd2FyZCIpLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZChmb3J3YXJkKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL01haWxTZXNzaW9uRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9NYWlsU2Vzc2lvbkZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzAwOWNjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9NYWlsU2Vzc2lvbkZvcm0uamF2YQpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlOworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGluZGl2aWR1YWwgbWFpbCBzZXNzaW9uIHBhZ2UuCisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBNYWlsU2Vzc2lvbkZvcm0gZXh0ZW5kcyBCYXNlRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBtYWlsIHNlc3Npb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5uYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBtYWlsLnNtdHAuaG9zdCBvZiB0aGUgbWFpbCBzZXNzaW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1haWxob3N0ID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpbGhvc3QoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5tYWlsaG9zdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWFpbGhvc3QoU3RyaW5nIG1haWxob3N0KSB7CisgICAgICAgIHRoaXMubWFpbGhvc3QgPSBtYWlsaG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzb3VyY2UgdHlwZSBvZiB0aGlzIG1haWwgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZXR5cGUgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgbWFpbCBzZXNzaW9uIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZXR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNldHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlc291cmNlIHR5cGUgb2YgdGhlIG1haWwgc2Vzc2lvbiB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNldHlwZShTdHJpbmcgcmVzb3VyY2V0eXBlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2V0eXBlID0gcmVzb3VyY2V0eXBlOworICAgIH0KKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aCBvZiB0aGlzIG1haWwgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXRoID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdGggb2YgdGhlIG1haWwgc2Vzc2lvbiB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggb2YgdGhlIG1haWwgc2Vzc2lvbiB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICB9CisgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIGhvc3Qgb2YgdGhpcyBtYWlsIHNlc3Npb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBob3N0IG9mIHRoZSBtYWlsIHNlc3Npb24gdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBob3N0IG9mIHRoZSBtYWlsIHNlc3Npb24gdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgfSAgICAKKyAgICAKKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZG9tYWluIG9mIHRoaXMgbWFpbCBzZXNzaW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkb21haW4gb2YgdGhlIG1haWwgc2Vzc2lvbiB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kb21haW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkb21haW4gb2YgdGhlIG1haWwgc2Vzc2lvbiB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7CisgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy50eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOworICAgICAgICBtYWlsaG9zdCA9IG51bGw7ICAgCisgICAgICAgIHR5cGUgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBmcm9tIHRoaXMgSFRUUCByZXF1ZXN0LAorICAgICAqIGFuZCByZXR1cm4gYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW55CisgICAgICogdmFsaWRhdGlvbiBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gZm91bmQuICBJZiBubyBlcnJvcnMgYXJlIGZvdW5kLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB3aXRoIG5vCisgICAgICogcmVjb3JkZWQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIAorICAgIHByaXZhdGUgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG51bGw7CisgICAgCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisKKyAgICAgICAgLy8gbWFpbFNtdHBIb3N0IGlzIGEgcmVxdWlyZWQgZmllbGQKKyAgICAgICAgaWYgKChtYWlsaG9zdCA9PSBudWxsKSB8fCAobWFpbGhvc3QubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgibWFpbGhvc3QiLAorICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoInJlc291cmNlcy5lcnJvci5tYWlsaG9zdC5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIChlcnJvcnMpOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvTWFpbFNlc3Npb25zRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9NYWlsU2Vzc2lvbnNGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiOWY2NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvTWFpbFNlc3Npb25zRm9ybS5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgZGVsZXRlIG1haWwgc2Vzc2lvbnMgcGFnZS4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIE1haWxTZXNzaW9uc0Zvcm0gZXh0ZW5kcyBCYXNlRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lcyBvZiB0aGUgc3BlY2lmaWVkIGVudmlyb25tZW50IGVudHJpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWFpbFNlc3Npb25zW10gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZ1tdIGdldE1haWxTZXNzaW9ucygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm1haWxTZXNzaW9ucyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWFpbFNlc3Npb25zKFN0cmluZyBtYWlsU2Vzc2lvbnNbXSkgeworICAgICAgICB0aGlzLm1haWxTZXNzaW9ucyA9IG1haWxTZXNzaW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzb3VyY2UgdHlwZSBvZiB0aGlzIG1haWwgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZXR5cGUgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgbWFpbCBzZXNzaW9uIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZXR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNldHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlc291cmNlIHR5cGUgb2YgdGhlIG1haWwgc2Vzc2lvbiB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNldHlwZShTdHJpbmcgcmVzb3VyY2V0eXBlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2V0eXBlID0gcmVzb3VyY2V0eXBlOworICAgIH0KKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aCBvZiB0aGlzIG1haWwgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXRoID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdGggb2YgdGhlIG1haWwgc2Vzc2lvbiB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggb2YgdGhlIG1haWwgc2Vzc2lvbiB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICB9CisgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIGhvc3Qgb2YgdGhpcyBtYWlsIHNlc3Npb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBob3N0IG9mIHRoZSBtYWlsIHNlc3Npb24gdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBob3N0IG9mIHRoZSBtYWlsIHNlc3Npb24gdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgfSAgICAKKyAgICAKKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZG9tYWluIG9mIHRoaXMgbWFpbCBzZXNzaW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkb21haW4gb2YgdGhlIG1haWwgc2Vzc2lvbiB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kb21haW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkb21haW4gb2YgdGhlIG1haWwgc2Vzc2lvbiB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7CisgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOworICAgICAgICB0aGlzLm1haWxTZXNzaW9ucyA9IG51bGw7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9SZXNvdXJjZUxpbmtGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1Jlc291cmNlTGlua0Zvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmVhYWZkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9SZXNvdXJjZUxpbmtGb3JtLmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZTsKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBpbmRpdmlkdWFsIHJlc291cmNlIGxpbmsgcGFnZS4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFJlc291cmNlTGlua0Zvcm0gZXh0ZW5kcyBCYXNlRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGxpbmsuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5uYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGdsb2JhbCBuYW1lIG9mIHRoZSByZXNvdXJjZSBsaW5rLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdsb2JhbCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEdsb2JhbCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmdsb2JhbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R2xvYmFsKFN0cmluZyBnbG9iYWwpIHsKKyAgICAgICAgdGhpcy5nbG9iYWwgPSBnbG9iYWw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSByZXNvdXJjZSB0eXBlIG9mIHRoaXMgcmVzb3VyY2UgbGluay4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZXR5cGUgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgcmVzb3VyY2UgbGluayB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2V0eXBlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXNvdXJjZSB0eXBlIG9mIHRoZSByZXNvdXJjZSBsaW5rIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2V0eXBlKFN0cmluZyByZXNvdXJjZXR5cGUpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZXR5cGUgPSByZXNvdXJjZXR5cGU7CisgICAgfQorICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBwYXRoIG9mIHRoaXMgcmVzb3VyY2UgbGluay4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXRoID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdGggb2YgdGhlIHJlc291cmNlIGxpbmsgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBsaW5rIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgIH0KKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgaG9zdCBvZiB0aGlzIHJlc291cmNlIGxpbmsuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBob3N0IG9mIHRoZSByZXNvdXJjZSBsaW5rIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkgeworICAgICAgICByZXR1cm4gdGhpcy5ob3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaG9zdCBvZiB0aGUgcmVzb3VyY2UgbGluayB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKKyAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICB9ICAgIAorICAgIAorICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkb21haW4gb2YgdGhpcyByZXNvdXJjZSBsaW5rLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkb21haW4gb2YgdGhlIHJlc291cmNlIGxpbmsgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZG9tYWluOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZG9tYWluIG9mIHRoZSByZXNvdXJjZSBsaW5rIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9tYWluKFN0cmluZyBkb21haW4pIHsKKyAgICAgICAgdGhpcy5kb21haW4gPSBkb21haW47CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZSBsaW5rIGxpbmsuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy50eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOworICAgICAgICBuYW1lID0gbnVsbDsKKyAgICAgICAgZ2xvYmFsID0gbnVsbDsKKyAgICAgICAgdHlwZSA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IGZyb20gdGhpcyBIVFRQIHJlcXVlc3QsCisgICAgICogYW5kIHJldHVybiBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbnkKKyAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBmb3VuZC4gIElmIG5vIGVycm9ycyBhcmUgZm91bmQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHdpdGggbm8KKyAgICAgKiByZWNvcmRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgCisgICAgcHJpdmF0ZSBBY3Rpb25FcnJvcnMgZXJyb3JzID0gbnVsbDsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisKKyAgICAgICAgLy8gbmFtZSBpcyBhIHJlcXVpcmVkIGZpZWxkCisgICAgICAgIGlmICgobmFtZSA9PSBudWxsKSB8fCAobmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoInJlc291cmNlcy5lcnJvci5uYW1lLnJlcXVpcmVkIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2xvYmFsIGlzIGEgcmVxdWlyZWQgZmllbGQKKyAgICAgICAgaWYgKCggZ2xvYmFsID09IG51bGwpIHx8IChnbG9iYWwubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgiZ2xvYmFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoInJlc291cmNlcy5lcnJvci5nbG9iYWwucmVxdWlyZWQiKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIHR5cGUgaXMgYSByZXF1aXJlZCBmaWVsZAorICAgICAgICBpZiAoKHR5cGUgPT0gbnVsbCkgfHwgKHR5cGUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgidHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJyZXNvdXJjZXMuZXJyb3IudHlwZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoZXJyb3JzKTsKKworICAgIH0KKyAKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvUmVzb3VyY2VMaW5rc0Zvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvUmVzb3VyY2VMaW5rc0Zvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODhkZTYxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9SZXNvdXJjZUxpbmtzRm9ybS5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgZGVsZXRlIHJlc291cmNlIGxpbmtzIHBhZ2UuCisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZUxpbmtzRm9ybSBleHRlbmRzIEJhc2VGb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWVzIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgbGlua3MuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VMaW5rc1tdID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRSZXNvdXJjZUxpbmtzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucmVzb3VyY2VMaW5rcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VMaW5rcyhTdHJpbmcgcmVzb3VyY2VMaW5rc1tdKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2VMaW5rcyA9IHJlc291cmNlTGlua3M7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSByZXNvdXJjZSB0eXBlIG9mIHRoaXMgcmVzb3VyY2UgbGluay4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZXR5cGUgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgcmVzb3VyY2UgbGluayB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2V0eXBlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXNvdXJjZSB0eXBlIG9mIHRoZSByZXNvdXJjZSBsaW5rIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2V0eXBlKFN0cmluZyByZXNvdXJjZXR5cGUpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZXR5cGUgPSByZXNvdXJjZXR5cGU7CisgICAgfQorICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBwYXRoIG9mIHRoaXMgcmVzb3VyY2UgbGluay4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXRoID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdGggb2YgdGhlIHJlc291cmNlIGxpbmsgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBsaW5rIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgIH0KKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgaG9zdCBvZiB0aGlzIHJlc291cmNlIGxpbmsuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBob3N0IG9mIHRoZSByZXNvdXJjZSBsaW5rIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkgeworICAgICAgICByZXR1cm4gdGhpcy5ob3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaG9zdCBvZiB0aGUgcmVzb3VyY2UgbGluayB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKKyAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICB9ICAgIAorICAgIAorICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkb21haW4gb2YgdGhpcyByZXNvdXJjZSBsaW5rLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkb21haW4gb2YgdGhlIHJlc291cmNlIGxpbmsgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZG9tYWluOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZG9tYWluIG9mIHRoZSByZXNvdXJjZSBsaW5rIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9tYWluKFN0cmluZyBkb21haW4pIHsKKyAgICAgICAgdGhpcy5kb21haW4gPSBkb21haW47CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7CisgICAgICAgIHRoaXMucmVzb3VyY2VMaW5rcyA9IG51bGw7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9SZXNvdXJjZVV0aWxzLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1Jlc291cmNlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWU4M2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9SZXNvdXJjZVV0aWxzLmphdmEKQEAgLTAsMCArMSw0MTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworCisKKy8qKgorICogPHA+U2hhcmVkIHV0aWxpdHkgbWV0aG9kcyBmb3IgdGhlIHJlc291cmNlIGFkbWluaXN0cmF0aW9uIG1vZHVsZS48L3A+CisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VVdGlscyB7CisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTlZJUk9OTUVOVF9UWVBFID0gIjp0eXBlPUVudmlyb25tZW50IjsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9UWVBFID0gIjp0eXBlPVJlc291cmNlIjsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRVNPVVJDRUxJTktfVFlQRSA9ICI6dHlwZT1SZXNvdXJjZUxpbmsiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUlOR1JFU09VUkNFU19UWVBFID0gIjp0eXBlPU5hbWluZ1Jlc291cmNlcyI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgR0xPQkFMX1RZUEUgPSAiLHJlc291cmNldHlwZT1HbG9iYWwiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRFWFRfVFlQRSA9ICIscmVzb3VyY2V0eXBlPUNvbnRleHQiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZJQ0VfREVGQVVMVENPTlRFWFRfVFlQRSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixyZXNvdXJjZXR5cGU9U2VydmljZURlZmF1bHRDb250ZXh0IjsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBIT1NUX0RFRkFVTFRDT05URVhUX1RZUEUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIscmVzb3VyY2V0eXBlPUhvc3REZWZhdWx0Q29udGV4dCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgCisgICAgLy8gcmVzb3VyY2UgY2xhc3MgbmFtZXMKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VSREJfQ0xBU1MgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2UiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERBVEFTT1VSQ0VfQ0xBU1MgPSAiamF2YXguc3FsLkRhdGFTb3VyY2UiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BSUxTRVNTSU9OX0NMQVNTID0gImphdmF4Lm1haWwuU2Vzc2lvbiI7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3ROYW1lIGdldE5hbWluZ1Jlc291cmNlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgU3RyaW5nIHJlc291cmNldHlwZSwgU3RyaW5nIHBhdGgsIFN0cmluZyBob3N0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbnVsbDsKKyAgICAgICAgaWYgKChyZXNvdXJjZXR5cGU9PW51bGwpIHx8IChkb21haW49PW51bGwpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIE1CZWFuIE5hbWUgZm9yIHRoZSBuYW1pbmcgc291cmNlCisgICAgICAgIGlmIChyZXNvdXJjZXR5cGUuZXF1YWxzKCJHbG9iYWwiKSkgeworICAgICAgICAgICAgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyBOQU1JTkdSRVNPVVJDRVNfVFlQRSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9UWVBFKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZXR5cGUuZXF1YWxzKCJDb250ZXh0IikpIHsKKyAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgTkFNSU5HUkVTT1VSQ0VTX1RZUEUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixwYXRoPSIgKyBwYXRoICsgIixob3N0PSIgKyBob3N0KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZXR5cGUuZXF1YWxzKCJEZWZhdWx0Q29udGV4dCIpKSB7CisgICAgICAgICAgICBpZiAoaG9zdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArIE5BTUlOR1JFU09VUkNFU19UWVBFICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIT1NUX0RFRkFVTFRDT05URVhUX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLGhvc3Q9IiArIGhvc3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArIE5BTUlOR1JFU09VUkNFU19UWVBFICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJWSUNFX0RFRkFVTFRDT05URVhUX1RZUEUpOyAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gb25hbWU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW5kIHJldHVybiBhIFJlc291cmNlc0Zvcm0gaWRlbnRpZnlpbmcgYWxsIGN1cnJlbnRseSBkZWZpbmVkCisgICAgICogcmVzb3VyY2VzIGluIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNlcnZlciBNQmVhblNlcnZlciB0byBiZSBjb25zdWx0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRW52RW50cmllc0Zvcm0gZ2V0RW52RW50cmllc0Zvcm0oTUJlYW5TZXJ2ZXIgbXNlcnZlciwgCisgICAgICAgIFN0cmluZyByZXNvdXJjZXR5cGUsIFN0cmluZyBwYXRoLCBTdHJpbmcgaG9zdCwgU3RyaW5nIGRvbWFpbikgCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE9iamVjdE5hbWUgZW5hbWUgPSBudWxsOworICAgICAgICBpZiAocmVzb3VyY2V0eXBlIT1udWxsKSB7CisgICAgICAgICAgICBpZiAocmVzb3VyY2V0eXBlLmVxdWFscygiR2xvYmFsIikpIHsKKyAgICAgICAgICAgICAgICBlbmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyBFTlZJUk9OTUVOVF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX1RZUEUgKyAiLCoiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2V0eXBlLmVxdWFscygiQ29udGV4dCIpKSB7CisgICAgICAgICAgICAgICAgZW5hbWUgPSBuZXcgT2JqZWN0TmFtZSAoIGRvbWFpbiArIEVOVklST05NRU5UX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUX1RZUEUgKyAiLHBhdGg9IiArIHBhdGggKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLGhvc3Q9IiArIGhvc3QgKyAiLCoiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2V0eXBlLmVxdWFscygiRGVmYXVsdENvbnRleHQiKSkgeworICAgICAgICAgICAgICAgIGlmIChob3N0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBlbmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyBFTlZJUk9OTUVOVF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICBIT1NUX0RFRkFVTFRDT05URVhUX1RZUEUgKyAiLGhvc3Q9IiArIGhvc3QgKyAiLCoiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlbmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyBFTlZJUk9OTUVOVF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICBTRVJWSUNFX0RFRkFVTFRDT05URVhUX1RZUEUgKyAiLCoiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gKG1zZXJ2ZXIucXVlcnlNQmVhbnMoZW5hbWUsIG51bGwpLml0ZXJhdG9yKCkpOworICAgICAgICAKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7ICAgICAgICAKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgT2JqZWN0SW5zdGFuY2UgaW5zdGFuY2UgPSAoT2JqZWN0SW5zdGFuY2UpIGl0ZXJhdG9yLm5leHQoKTsgCisgICAgICAgICAgICByZXN1bHRzLmFkZChpbnN0YW5jZS5nZXRPYmplY3ROYW1lKCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHMpOyAgICAgICAgCisgICAgICAgIAorICAgICAgICBFbnZFbnRyaWVzRm9ybSBlbnZFbnRyaWVzRm9ybSA9IG5ldyBFbnZFbnRyaWVzRm9ybSgpOworICAgICAgICBlbnZFbnRyaWVzRm9ybS5zZXRFbnZFbnRyaWVzKChTdHJpbmdbXSkgCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pKTsKKyAgICAgICAgCisgICAgICAgIGlmIChyZXNvdXJjZXR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgZW52RW50cmllc0Zvcm0uc2V0UmVzb3VyY2V0eXBlKHJlc291cmNldHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbnZFbnRyaWVzRm9ybS5zZXRSZXNvdXJjZXR5cGUoIiIpOworICAgICAgICB9CisgICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBlbnZFbnRyaWVzRm9ybS5zZXRQYXRoKHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW52RW50cmllc0Zvcm0uc2V0UGF0aCgiIik7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICBlbnZFbnRyaWVzRm9ybS5zZXRIb3N0KGhvc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW52RW50cmllc0Zvcm0uc2V0SG9zdCgiIik7CisgICAgICAgIH0gICAgICAgICAgCisgICAgICAgIGlmIChkb21haW4gIT0gbnVsbCkgeworICAgICAgICAgICAgZW52RW50cmllc0Zvcm0uc2V0RG9tYWluKGRvbWFpbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbnZFbnRyaWVzRm9ybS5zZXREb21haW4oIiIpOworICAgICAgICB9ICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgcmV0dXJuIChlbnZFbnRyaWVzRm9ybSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW5kIHJldHVybiBhIERhdGFTb3VyY2VzRm9ybSBpZGVudGlmeWluZyBhbGwgY3VycmVudGx5IGRlZmluZWQKKyAgICAgKiBkYXRhc291cmNlcyBpbiB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZXJ2ZXIgTUJlYW5TZXJ2ZXIgdG8gYmUgY29uc3VsdGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERhdGFTb3VyY2VzRm9ybSBnZXREYXRhU291cmNlc0Zvcm0oTUJlYW5TZXJ2ZXIgbXNlcnZlciwgCisgICAgICAgIFN0cmluZyByZXNvdXJjZXR5cGUsIFN0cmluZyBwYXRoLCBTdHJpbmcgaG9zdCwgU3RyaW5nIGRvbWFpbikgCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBPYmplY3ROYW1lIHJuYW1lID0gbnVsbDsKKyAgICAgICAgaWYgKHJlc291cmNldHlwZSE9bnVsbCkgeworICAgICAgICAgICAgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkdsb2JhbCIpKSB7CisgICAgICAgICAgICAgICAgcm5hbWUgPSBuZXcgT2JqZWN0TmFtZSggZG9tYWluICsgUkVTT1VSQ0VfVFlQRSArIEdMT0JBTF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixjbGFzcz0iICsgREFUQVNPVVJDRV9DTEFTUyArICIsKiIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZXR5cGUuZXF1YWxzKCJDb250ZXh0IikpIHsKKyAgICAgICAgICAgICAgICBybmFtZSA9IG5ldyBPYmplY3ROYW1lICggZG9tYWluICsgUkVTT1VSQ0VfVFlQRSArIENPTlRFWFRfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAiLHBhdGg9IiArIHBhdGggKyAiLGhvc3Q9IiArIGhvc3QgKyAiLGNsYXNzPSIgKyAKKyAgICAgICAgICAgICAgICAgICAgREFUQVNPVVJDRV9DTEFTUyArICIsKiIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZXR5cGUuZXF1YWxzKCJEZWZhdWx0Q29udGV4dCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGhvc3QubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJuYW1lID0gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArIFJFU09VUkNFX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfREVGQVVMVENPTlRFWFRfVFlQRSArICIsaG9zdD0iICsgaG9zdCArIAorICAgICAgICAgICAgICAgICAgICAgICAgIixjbGFzcz0iICsgREFUQVNPVVJDRV9DTEFTUyArICIsKiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJuYW1lID0gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArIFJFU09VUkNFX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFUlZJQ0VfREVGQVVMVENPTlRFWFRfVFlQRSArICAKKyAgICAgICAgICAgICAgICAgICAgICAgICIsY2xhc3M9IiArIERBVEFTT1VSQ0VfQ0xBU1MgKyAiLCoiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSAobXNlcnZlci5xdWVyeU1CZWFucyhybmFtZSwgbnVsbCkuaXRlcmF0b3IoKSk7CisgICAgICAgIAorICAgICAgICBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAgIAorICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE9iamVjdEluc3RhbmNlIGluc3RhbmNlID0gKE9iamVjdEluc3RhbmNlKSBpdGVyYXRvci5uZXh0KCk7IAorICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGluc3RhbmNlLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gb25seSBhZGQgcmVzb3VyY2UgbWJlYW4gaWYgZGVmaW5pdGlvbiBleGlzdHMKKyAgICAgICAgICAgICAgICBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgImRyaXZlckNsYXNzTmFtZSIpOworICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBtc2VydmVyLnNldEF0dHJpYnV0ZShvbmFtZSwgCisgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImRyaXZlckNsYXNzTmFtZSIsICIiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHMpOyAgICAgICAgCisgICAgICAgIERhdGFTb3VyY2VzRm9ybSBkYXRhU291cmNlc0Zvcm0gPSBuZXcgRGF0YVNvdXJjZXNGb3JtKCk7CisgICAgICAgIGRhdGFTb3VyY2VzRm9ybS5zZXREYXRhU291cmNlcygoU3RyaW5nW10pIAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7ICAgICAgICAKKyAgICAgICAgCisgICAgICAgIGlmIChyZXNvdXJjZXR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YVNvdXJjZXNGb3JtLnNldFJlc291cmNldHlwZShyZXNvdXJjZXR5cGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YVNvdXJjZXNGb3JtLnNldFJlc291cmNldHlwZSgiIik7CisgICAgICAgIH0KKyAgICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRhdGFTb3VyY2VzRm9ybS5zZXRQYXRoKHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YVNvdXJjZXNGb3JtLnNldFBhdGgoIiIpOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YVNvdXJjZXNGb3JtLnNldEhvc3QoaG9zdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhU291cmNlc0Zvcm0uc2V0SG9zdCgiIik7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBpZiAoZG9tYWluICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRhdGFTb3VyY2VzRm9ybS5zZXREb21haW4oZG9tYWluKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGFTb3VyY2VzRm9ybS5zZXREb21haW4oIiIpOworICAgICAgICB9ICAgICAgICAgIAorICAgICAgICByZXR1cm4gKGRhdGFTb3VyY2VzRm9ybSk7CisKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuZCByZXR1cm4gYSBNYWlsU2Vzc2lvbnNGb3JtIGlkZW50aWZ5aW5nIGFsbCBjdXJyZW50bHkgZGVmaW5lZAorICAgICAqIG1haWxzZXNzaW9ucyBpbiB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZXJ2ZXIgTUJlYW5TZXJ2ZXIgdG8gYmUgY29uc3VsdGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1haWxTZXNzaW9uc0Zvcm0gZ2V0TWFpbFNlc3Npb25zRm9ybShNQmVhblNlcnZlciBtc2VydmVyLCAKKyAgICAgICAgU3RyaW5nIHJlc291cmNldHlwZSwgU3RyaW5nIHBhdGgsIFN0cmluZyBob3N0LCBTdHJpbmcgZG9tYWluKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE9iamVjdE5hbWUgcm5hbWUgPSBudWxsOworICAgICAgICBpZiAocmVzb3VyY2V0eXBlIT1udWxsKSB7CisgICAgICAgICAgICBpZiAocmVzb3VyY2V0eXBlLmVxdWFscygiR2xvYmFsIikpIHsKKyAgICAgICAgICAgICAgICBybmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyBSRVNPVVJDRV9UWVBFICsgR0xPQkFMX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLGNsYXNzPSIgKyBNQUlMU0VTU0lPTl9DTEFTUyArICIsKiIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZXR5cGUuZXF1YWxzKCJDb250ZXh0IikpIHsKKyAgICAgICAgICAgICAgICBybmFtZSA9IG5ldyBPYmplY3ROYW1lIChkb21haW4gKyBSRVNPVVJDRV9UWVBFICsgQ09OVEVYVF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICIscGF0aD0iICsgcGF0aCArICIsaG9zdD0iICsgaG9zdCArICIsY2xhc3M9IiArIAorICAgICAgICAgICAgICAgICAgICBNQUlMU0VTU0lPTl9DTEFTUyArICIsKiIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZXR5cGUuZXF1YWxzKCJEZWZhdWx0Q29udGV4dCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGhvc3QubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgUkVTT1VSQ0VfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9ERUZBVUxUQ09OVEVYVF9UWVBFICsgIixob3N0PSIgKyBob3N0ICsgCisgICAgICAgICAgICAgICAgICAgICAgICAiLGNsYXNzPSIgKyBNQUlMU0VTU0lPTl9DTEFTUyArICIsKiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgUkVTT1VSQ0VfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgU0VSVklDRV9ERUZBVUxUQ09OVEVYVF9UWVBFICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIsY2xhc3M9IiArIE1BSUxTRVNTSU9OX0NMQVNTICsgIiwqIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgCisgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gKG1zZXJ2ZXIucXVlcnlNQmVhbnMocm5hbWUsIG51bGwpLml0ZXJhdG9yKCkpOworICAgICAgICAKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7ICAgICAgICAKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgCisgICAgICAgICAgICBPYmplY3RJbnN0YW5jZSBpbnN0YW5jZSA9IChPYmplY3RJbnN0YW5jZSkgaXRlcmF0b3IubmV4dCgpOyAKKyAgICAgICAgICAgIHJlc3VsdHMuYWRkKGluc3RhbmNlLmdldE9iamVjdE5hbWUoKS50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQocmVzdWx0cyk7ICAgICAgICAKKyAgICAgICAgTWFpbFNlc3Npb25zRm9ybSBtYWlsU2Vzc2lvbnNGb3JtID0gbmV3IE1haWxTZXNzaW9uc0Zvcm0oKTsKKyAgICAgICAgbWFpbFNlc3Npb25zRm9ybS5zZXRNYWlsU2Vzc2lvbnMoKFN0cmluZ1tdKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdHMuc2l6ZSgpXSkpOyAgICAgICAgCisgICAgICAgIAorICAgICAgICBpZiAocmVzb3VyY2V0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1haWxTZXNzaW9uc0Zvcm0uc2V0UmVzb3VyY2V0eXBlKHJlc291cmNldHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYWlsU2Vzc2lvbnNGb3JtLnNldFJlc291cmNldHlwZSgiIik7CisgICAgICAgIH0KKyAgICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1haWxTZXNzaW9uc0Zvcm0uc2V0UGF0aChwYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1haWxTZXNzaW9uc0Zvcm0uc2V0UGF0aCgiIik7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtYWlsU2Vzc2lvbnNGb3JtLnNldEhvc3QoaG9zdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYWlsU2Vzc2lvbnNGb3JtLnNldEhvc3QoIiIpOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgaWYgKGRvbWFpbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtYWlsU2Vzc2lvbnNGb3JtLnNldERvbWFpbihkb21haW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWFpbFNlc3Npb25zRm9ybS5zZXREb21haW4oIiIpOworICAgICAgICB9ICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgcmV0dXJuIChtYWlsU2Vzc2lvbnNGb3JtKTsKKworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW5kIHJldHVybiBhIFJlc291cmNlTGlua3NGb3JtIGlkZW50aWZ5aW5nIGFsbCBjdXJyZW50bHkgZGVmaW5lZAorICAgICAqIHJlc291cmNlbGlua3MgaW4gdGhlIHNwZWNpZmllZCByZXNvdXJjZSBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2VydmVyIE1CZWFuU2VydmVyIHRvIGJlIGNvbnN1bHRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUxpbmtzRm9ybSBnZXRSZXNvdXJjZUxpbmtzRm9ybShNQmVhblNlcnZlciBtc2VydmVyLCAKKyAgICAgICAgU3RyaW5nIHJlc291cmNldHlwZSwgU3RyaW5nIHBhdGgsIFN0cmluZyBob3N0LCBTdHJpbmcgZG9tYWluKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBybmFtZSA9IG51bGw7CisgICAgICAgIGlmIChyZXNvdXJjZXR5cGUhPW51bGwpIHsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZXR5cGUuZXF1YWxzKCJHbG9iYWwiKSkgeworICAgICAgICAgICAgICAgIHJuYW1lID0gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArIFJFU09VUkNFTElOS19UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX1RZUEUgKyAiLCoiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2V0eXBlLmVxdWFscygiQ29udGV4dCIpKSB7CisgICAgICAgICAgICAgICAgcm5hbWUgPSBuZXcgT2JqZWN0TmFtZSAoIGRvbWFpbiArIFJFU09VUkNFTElOS19UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVF9UWVBFICsgIixwYXRoPSIgKyBwYXRoICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixob3N0PSIgKyBob3N0ICsgIiwqIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkRlZmF1bHRDb250ZXh0IikpIHsKKyAgICAgICAgICAgICAgICBpZiAoaG9zdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcm5hbWUgPSBuZXcgT2JqZWN0TmFtZSggZG9tYWluICsgUkVTT1VSQ0VMSU5LX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9ERUZBVUxUQ09OVEVYVF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsaG9zdD0iICsgaG9zdCArICIsKiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJuYW1lID0gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArIFJFU09VUkNFTElOS19UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFUlZJQ0VfREVGQVVMVENPTlRFWFRfVFlQRSArICIsKiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgIAorICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IChtc2VydmVyLnF1ZXJ5TUJlYW5zKHJuYW1lLCBudWxsKS5pdGVyYXRvcigpKTsKKyAgICAgICAgCisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgCisgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIE9iamVjdEluc3RhbmNlIGluc3RhbmNlID0gKE9iamVjdEluc3RhbmNlKSBpdGVyYXRvci5uZXh0KCk7IAorICAgICAgICAgICAgcmVzdWx0cy5hZGQoaW5zdGFuY2UuZ2V0T2JqZWN0TmFtZSgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyZXN1bHRzKTsgICAgICAgIAorICAgICAgICBSZXNvdXJjZUxpbmtzRm9ybSByZXNvdXJjZUxpbmtzRm9ybSA9IG5ldyBSZXNvdXJjZUxpbmtzRm9ybSgpOworICAgICAgICByZXNvdXJjZUxpbmtzRm9ybS5zZXRSZXNvdXJjZUxpbmtzKChTdHJpbmdbXSkgCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pKTsgICAgICAgIAorICAgICAgICAKKyAgICAgICAgaWYgKHJlc291cmNldHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZUxpbmtzRm9ybS5zZXRSZXNvdXJjZXR5cGUocmVzb3VyY2V0eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc291cmNlTGlua3NGb3JtLnNldFJlc291cmNldHlwZSgiIik7CisgICAgICAgIH0KKyAgICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc291cmNlTGlua3NGb3JtLnNldFBhdGgocGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNvdXJjZUxpbmtzRm9ybS5zZXRQYXRoKCIiKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc291cmNlTGlua3NGb3JtLnNldEhvc3QoaG9zdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNvdXJjZUxpbmtzRm9ybS5zZXRIb3N0KCIiKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIGlmIChkb21haW4gIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2VMaW5rc0Zvcm0uc2V0RG9tYWluKGRvbWFpbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNvdXJjZUxpbmtzRm9ybS5zZXREb21haW4oIiIpOworICAgICAgICB9ICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgcmV0dXJuIChyZXNvdXJjZUxpbmtzRm9ybSk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW5kIHJldHVybiBhIFVzZXJEYXRhYmFzZUZvcm0gaWRlbnRpZnlpbmcgYWxsIGN1cnJlbnRseSBkZWZpbmVkCisgICAgICogdXNlciBkYXRhYmFzZXMgaW4gdGhlIHNwZWNpZmllZCByZXNvdXJjZSBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2VydmVyIE1CZWFuU2VydmVyIHRvIGJlIGNvbnN1bHRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBVc2VyRGF0YWJhc2VzRm9ybSBnZXRVc2VyRGF0YWJhc2VzRm9ybShNQmVhblNlcnZlciBtc2VydmVyLFN0cmluZyBkb21haW4pCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgCisgICAgICAgIE9iamVjdE5hbWUgcm5hbWUgPSBuZXcgT2JqZWN0TmFtZSggZG9tYWluICsgUkVTT1VSQ0VfVFlQRSArIEdMT0JBTF9UWVBFICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLGNsYXNzPSIgKyBVU0VSREJfQ0xBU1MgKyAiLCoiKTsKKyAgICAgICAgCisgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gKG1zZXJ2ZXIucXVlcnlNQmVhbnMocm5hbWUsIG51bGwpLml0ZXJhdG9yKCkpOworICAgICAgICAKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7ICAgICAgICAKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgT2JqZWN0SW5zdGFuY2UgaW5zdGFuY2UgPSAoT2JqZWN0SW5zdGFuY2UpIGl0ZXJhdG9yLm5leHQoKTsgCisgICAgICAgICAgICByZXN1bHRzLmFkZChpbnN0YW5jZS5nZXRPYmplY3ROYW1lKCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHMpOworCisgICAgICAgIFVzZXJEYXRhYmFzZXNGb3JtIHVzZXJEYXRhYmFzZXNGb3JtID0gbmV3IFVzZXJEYXRhYmFzZXNGb3JtKCk7CisgICAgICAgIHVzZXJEYXRhYmFzZXNGb3JtLnNldFVzZXJEYXRhYmFzZXMoKFN0cmluZ1tdKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdHMuc2l6ZSgpXSkpOyAgCisgICAgICAgIHJldHVybiAodXNlckRhdGFiYXNlc0Zvcm0pOworCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9SZXNvdXJjZXNUcmVlQnVpbGRlci5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9SZXNvdXJjZXNUcmVlQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZTA2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1Jlc291cmNlc1RyZWVCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5UcmVlQnVpbGRlcjwvY29kZT4gdGhhdCBhZGRzIHRoZSBub2RlcyByZXF1aXJlZAorICogZm9yIGFkbWluaXN0ZXJpbmcgdGhlIHJlc291cmNlcyAoZGF0YSBzb3VyY2VzKS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXNUcmVlQnVpbGRlciBpbXBsZW1lbnRzIFRyZWVCdWlsZGVyIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRyZWVCdWlsZGVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIHRoZSByZXF1aXJlZCBub2RlcyB0byB0aGUgc3BlY2lmaWVkIDxjb2RlPnRyZWVDb250cm9sPC9jb2RlPgorICAgICAqIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHRyZWVDb250cm9sIFRoZSA8Y29kZT5UcmVlQ29udHJvbDwvY29kZT4gdG8gd2hpY2ggd2Ugc2hvdWxkCisgICAgICogIGFkZCBvdXIgbm9kZXMKKyAgICAgKiBAcGFyYW0gc2VydmxldCBUaGUgY29udHJvbGxlciBzZXJ2bGV0IGZvciB0aGUgYWRtaW4gYXBwbGljYXRpb24KKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgYnVpbGRUcmVlKFRyZWVDb250cm9sIHRyZWVDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvblNlcnZsZXQgc2VydmxldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IChNZXNzYWdlUmVzb3VyY2VzKQorICAgICAgICAgICAgc2VydmxldC5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldEF0dHJpYnV0ZShHbG9iYWxzLk1FU1NBR0VTX0tFWSk7CisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IChMb2NhbGUpIHNlc3Npb24uZ2V0QXR0cmlidXRlKEdsb2JhbHMuTE9DQUxFX0tFWSk7CisgICAgICAgIGFkZFN1YnRyZWUodHJlZUNvbnRyb2wuZ2V0Um9vdCgpLCByZXNvdXJjZXMsIGxvY2FsZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIHN1YnRyZWUgb2Ygbm9kZXMgcmVxdWlyZWQgZm9yIHVzZXIgYWRtaW5pc3RyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdCBUaGUgcm9vdCBub2RlIG9mIG91ciB0cmVlIGNvbnRyb2wKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSBNZXNzYWdlUmVzb3VyY2VzIGZvciBvdXIgbG9jYWxpemVkIG1lc3NhZ2VzCisgICAgICogIG1lc3NhZ2VzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkU3VidHJlZShUcmVlQ29udHJvbE5vZGUgcm9vdCwgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gcm9vdC5nZXREb21haW4oKTsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBzdWJ0cmVlID0gbmV3IFRyZWVDb250cm9sTm9kZQorICAgICAgICAgICAgICAgICgiR2xvYmFsIFJlc291cmNlIEFkbWluaXN0cmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgImZvbGRlcl8xNl9wYWQuZ2lmIiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLnRyZWVCdWlsZGVyLnN1YnRyZWVOb2RlIiksCisgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICAgICAgdHJ1ZSwgZG9tYWluKTsgICAgICAgIAorICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIGRhdGFzb3VyY2VzID0gbmV3IFRyZWVDb250cm9sTm9kZQorICAgICAgICAgICAgICAgICgiR2xvYmFsbHkgQWRtaW5pc3RlciBEYXRhIFNvdXJjZXMiLAorICAgICAgICAgICAgICAgICAiRGF0YXNvdXJjZS5naWYiLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMudHJlZUJ1aWxkZXIuZGF0YXNvdXJjZXMiKSwKKyAgICAgICAgICAgICAgICAgInJlc291cmNlcy9saXN0RGF0YVNvdXJjZXMuZG8/cmVzb3VyY2V0eXBlPUdsb2JhbCZkb21haW49IiArCisgICAgICAgICAgICAgICAgIGRvbWFpbiArICImZm9yd2FyZD0iICsgCisgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKCJEYXRhU291cmNlcyBMaXN0IFNldHVwIixUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpLAorICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgIGZhbHNlLCBkb21haW4pOworICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIG1haWxzZXNzaW9ucyA9IG5ldyBUcmVlQ29udHJvbE5vZGUKKyAgICAgICAgICAgICAgICAoIkdsb2JhbGx5IEFkbWluaXN0ZXIgTWFpbCBTZXNzaW9ucyAiLAorICAgICAgICAgICAgICAgICAiTWFpbHNlc3Npb24uZ2lmIiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLnRyZWVCdWlsZGVyLm1haWxzZXNzaW9ucyIpLAorICAgICAgICAgICAgICAgICAicmVzb3VyY2VzL2xpc3RNYWlsU2Vzc2lvbnMuZG8/cmVzb3VyY2V0eXBlPUdsb2JhbCZkb21haW49IiArCisgICAgICAgICAgICAgICAgIGRvbWFpbiArICImZm9yd2FyZD0iICsgCisgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKCJNYWlsU2Vzc2lvbnMgTGlzdCBTZXR1cCIsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKSwKKyAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICBmYWxzZSwgZG9tYWluKTsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSB1c2VyZGJzID0gbmV3IFRyZWVDb250cm9sTm9kZQorICAgICAgICAgICAgICAgICgiR2xvYmFsbHkgQWRtaW5pc3RlciBVc2VyRGF0YWJhc2UgRW50cmllcyIsCisgICAgICAgICAgICAgICAgICJSZWFsbS5naWYiLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMudHJlZUJ1aWxkZXIuZGF0YWJhc2VzIiksCisgICAgICAgICAgICAgICAgICJyZXNvdXJjZXMvbGlzdFVzZXJEYXRhYmFzZXMuZG8/ZG9tYWluPSIgKyBkb21haW4gKyAKKyAgICAgICAgICAgICAgICAgIiZmb3J3YXJkPSIgKyAKKyAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIlVzZXJEYXRhYmFzZXMgTGlzdCBTZXR1cCIsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKSwKKyAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICBmYWxzZSwgZG9tYWluKTsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBlbnZzID0gbmV3IFRyZWVDb250cm9sTm9kZQorICAgICAgICAgICAgICAgICgiR2xvYmFsbHkgQWRtaW5pc3RlciBFbnZpcm9ubWVudCBFbnRyaWVzIiwKKyAgICAgICAgICAgICAgICAgIkVudmlyb25tZW50RW50cmllcy5naWYiLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMuZW52LmVudHJpZXMiKSwKKyAgICAgICAgICAgICAgICAgInJlc291cmNlcy9saXN0RW52RW50cmllcy5kbz9yZXNvdXJjZXR5cGU9R2xvYmFsJmRvbWFpbj0iICsKKyAgICAgICAgICAgICAgICAgZG9tYWluKyImZm9yd2FyZD0iKworICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSgiRW52RW50cmllcyBMaXN0IFNldHVwIixUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpLAorICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgIGZhbHNlLCBkb21haW4pOworICAgICAgICAgICAgcm9vdC5hZGRDaGlsZChzdWJ0cmVlKTsKKyAgICAgICAgICAgIHN1YnRyZWUuYWRkQ2hpbGQoZGF0YXNvdXJjZXMpOworICAgICAgICAgICAgc3VidHJlZS5hZGRDaGlsZChtYWlsc2Vzc2lvbnMpOworICAgICAgICAgICAgc3VidHJlZS5hZGRDaGlsZChlbnZzKTsKKyAgICAgICAgICAgIHN1YnRyZWUuYWRkQ2hpbGQodXNlcmRicyk7CisgICAgICAgIH0gY2F0Y2goVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gY2FuJ3QgaGFwcGVuCisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvU2F2ZURhdGFTb3VyY2VBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvU2F2ZURhdGFTb3VyY2VBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjEzYzlkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TYXZlRGF0YVNvdXJjZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1lc3NhZ2VzOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgc2F2ZXMgYSBuZXcgb3IKKyAqIHVwZGF0ZWQgZGF0YSBzb3VyY2UgZW50cnkuPC9wPgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYXZlRGF0YVNvdXJjZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtc2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gSGFzIHRoaXMgdHJhbnNhY3Rpb24gYmVlbiBjYW5jZWxsZWQ/CisgICAgICAgIGlmIChpc0NhbmNlbGxlZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJMaXN0IERhdGFTb3VyY2VzIFNldHVwIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHRva2VuCisgICAgICAgIGlmICghaXNUb2tlblZhbGlkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IudG9rZW4iKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbnkgZXh0cmEgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkCisgICAgICAgIERhdGFTb3VyY2VGb3JtIGRhdGFTb3VyY2VGb3JtID0gKERhdGFTb3VyY2VGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgb2JqZWN0TmFtZSA9IGRhdGFTb3VyY2VGb3JtLmdldE9iamVjdE5hbWUoKTsKKworICAgICAgICAvLyBQZXJmb3JtIGFuICJBZGQgRGF0YVNvdXJjZSIgdHJhbnNhY3Rpb24KKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworCisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzJdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgc2lnbmF0dXJlWzFdID0gImphdmEubGFuZy5TdHJpbmciOworCisgICAgICAgICAgICBPYmplY3QgcGFyYW1zW10gPSBuZXcgT2JqZWN0WzJdOworICAgICAgICAgICAgcGFyYW1zWzBdID0gZGF0YVNvdXJjZUZvcm0uZ2V0Sm5kaU5hbWUoKTsKKyAgICAgICAgICAgIHBhcmFtc1sxXSA9IFJlc291cmNlVXRpbHMuREFUQVNPVVJDRV9DTEFTUzsKKyAgICAgICAgICAgIFN0cmluZyBlbmNvZGVkSm5kaU5hbWUgPSBVUkxFbmNvZGVyLmVuY29kZShwYXJhbXNbMF0udG9TdHJpbmcoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVURi04Iik7CisKKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZXR5cGUgPSBkYXRhU291cmNlRm9ybS5nZXRSZXNvdXJjZXR5cGUoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZGF0YVNvdXJjZUZvcm0uZ2V0UGF0aCgpOworICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBkYXRhU291cmNlRm9ybS5nZXRIb3N0KCk7CisgICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gZGF0YVNvdXJjZUZvcm0uZ2V0RG9tYWluKCk7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBudWxsOworICAgICAgICAgICAgT2JqZWN0TmFtZSBlbmNvZGVkT05hbWUgPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkdsb2JhbCIpKSB7CisgICAgICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArIFJlc291cmNlVXRpbHMuUkVTT1VSQ0VfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLkdMT0JBTF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsY2xhc3M9IiArIHBhcmFtc1sxXSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLG5hbWU9IiArIHBhcmFtc1swXSk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRPTmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5SRVNPVVJDRV9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuR0xPQkFMX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixjbGFzcz0iICsgcGFyYW1zWzFdICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsbmFtZT0iICsgZW5jb2RlZEpuZGlOYW1lKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkNvbnRleHQiKSkgeworICAgICAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyBSZXNvdXJjZVV0aWxzLlJFU09VUkNFX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5DT05URVhUX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixwYXRoPSIgKyBwYXRoICsgIixob3N0PSIgKyBob3N0ICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsY2xhc3M9IiArIHBhcmFtc1sxXSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLG5hbWU9IiArIHBhcmFtc1swXSk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRPTmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5SRVNPVVJDRV9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuQ09OVEVYVF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIscGF0aD0iICsgcGF0aCArICIsaG9zdD0iICsgaG9zdCArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLGNsYXNzPSIgKyBwYXJhbXNbMV0gKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixuYW1lPSIgKyBlbmNvZGVkSm5kaU5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpIHx8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKGVuY29kZWRPTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQWN0aW9uTWVzc2FnZXMgZXJyb3JzID0gbmV3IEFjdGlvbk1lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImpuZGlOYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgicmVzb3VyY2VzLmludmFsaWQubmFtZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZUVycm9ycyhyZXF1ZXN0LCBlcnJvcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBY3Rpb25Gb3J3YXJkKG1hcHBpbmcuZ2V0SW5wdXQoKSkpOworICAgICAgICAgICAgICAgIH0gICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG9uYW1lID0gUmVzb3VyY2VVdGlscy5nZXROYW1pbmdSZXNvdXJjZU9iamVjdE5hbWUoZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNldHlwZSwgcGF0aCwgaG9zdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG5ldyBvYmplY3QgYW5kIGFzc29jaWF0ZWQgTUJlYW4KKyAgICAgICAgICAgICAgICBvYmplY3ROYW1lID0gKFN0cmluZykgbXNlcnZlci5pbnZva2Uob25hbWUsICJhZGRSZXNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgc2lnbmF0dXJlKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkUmVzb3VyY2UiKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkUmVzb3VyY2UiKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbiAiVXBkYXRlIFVzZXIgZGF0YWJhc2UiIHRyYW5zYWN0aW9uCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUob2JqZWN0TmFtZSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1cmwiOworICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCBkYXRhU291cmNlRm9ybS5nZXRVcmwoKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImRyaXZlckNsYXNzTmFtZSI7CisgICAgICAgICAgICBtc2VydmVyLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIChvbmFtZSwKKyAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGRhdGFTb3VyY2VGb3JtLmdldERyaXZlckNsYXNzKCkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VybmFtZSI7CisgICAgICAgICAgICBtc2VydmVyLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIChvbmFtZSwKKyAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGRhdGFTb3VyY2VGb3JtLmdldFVzZXJuYW1lKCkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwYXNzd29yZCI7CisgICAgICAgICAgICBtc2VydmVyLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIChvbmFtZSwKKyAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGRhdGFTb3VyY2VGb3JtLmdldFBhc3N3b3JkKCkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtYXhBY3RpdmUiOworICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCBkYXRhU291cmNlRm9ybS5nZXRBY3RpdmUoKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gIm1heElkbGUiOworICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCBkYXRhU291cmNlRm9ybS5nZXRJZGxlKCkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtYXhXYWl0IjsKKyAgICAgICAgICAgIG1zZXJ2ZXIuc2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgKG9uYW1lLAorICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgZGF0YVNvdXJjZUZvcm0uZ2V0V2FpdCgpKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidmFsaWRhdGlvblF1ZXJ5IjsKKyAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uUXVlcnkgPSBkYXRhU291cmNlRm9ybS5nZXRRdWVyeSgpOworICAgICAgICAgICAgaWYgKCh2YWxpZGF0aW9uUXVlcnkgIT0gbnVsbCkgJiYgKHZhbGlkYXRpb25RdWVyeS5sZW5ndGgoKT4wKSkgeworICAgICAgICAgICAgICAgIG1zZXJ2ZXIuc2V0QXR0cmlidXRlKG9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsaWRhdGlvblF1ZXJ5KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5zZXQuYXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2NlZWQgdG8gdGhlIGxpc3QgZW50cmllcyBzY3JlZW4KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJEYXRhU291cmNlcyBMaXN0IFNldHVwIikpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvU2F2ZUVudkVudHJ5QWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NhdmVFbnZFbnRyeUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNjcxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NhdmVFbnZFbnRyeUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlczsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNhdmVzIGEgbmV3IG9yCisgKiB1cGRhdGVkIEVudiBFbnRyeS48L3A+CisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVFbnZFbnRyeUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKworICAgICAgICAvLyBIYXMgdGhpcyB0cmFuc2FjdGlvbiBiZWVuIGNhbmNlbGxlZD8KKyAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkxpc3QgRW52RW50cmllcyBTZXR1cCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoZSB0cmFuc2FjdGlvbiB0b2tlbgorICAgICAgICBpZiAoIWlzVG9rZW5WYWxpZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnRva2VuIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYW55IGV4dHJhIHZhbGlkYXRpb24gdGhhdCBpcyByZXF1aXJlZAorICAgICAgICBFbnZFbnRyeUZvcm0gZW52RW50cnlGb3JtID0gKEVudkVudHJ5Rm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSBlbnZFbnRyeUZvcm0uZ2V0T2JqZWN0TmFtZSgpOworCisgICAgICAgIC8vIFBlcmZvcm0gYW4gIkFkZCBFbnRyeSIgdHJhbnNhY3Rpb24KKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworCisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzNdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgc2lnbmF0dXJlWzFdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgc2lnbmF0dXJlWzJdID0gImphdmEubGFuZy5TdHJpbmciOworCisgICAgICAgICAgICBPYmplY3QgcGFyYW1zW10gPSBuZXcgT2JqZWN0WzNdOworICAgICAgICAgICAgcGFyYW1zWzBdID0gZW52RW50cnlGb3JtLmdldE5hbWUoKTsKKyAgICAgICAgICAgIHBhcmFtc1sxXSA9IGVudkVudHJ5Rm9ybS5nZXRFbnRyeVR5cGUoKTsKKyAgICAgICAgICAgIHBhcmFtc1syXSA9IGVudkVudHJ5Rm9ybS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2V0eXBlID0gZW52RW50cnlGb3JtLmdldFJlc291cmNldHlwZSgpOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBlbnZFbnRyeUZvcm0uZ2V0UGF0aCgpOworICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBlbnZFbnRyeUZvcm0uZ2V0SG9zdCgpOworICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IGVudkVudHJ5Rm9ybS5nZXREb21haW4oKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2V0eXBlLmVxdWFscygiR2xvYmFsIikpIHsKKyAgICAgICAgICAgICAgICAgICAgb25hbWUgPSBuZXcgT2JqZWN0TmFtZSggZG9tYWluICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuRU5WSVJPTk1FTlRfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLkdMT0JBTF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsbmFtZT0iICsgcGFyYW1zWzBdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkNvbnRleHQiKSkgeworICAgICAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5FTlZJUk9OTUVOVF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuQ09OVEVYVF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIscGF0aD0iICsgcGF0aCArICIsaG9zdD0iICsgaG9zdCArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLG5hbWU9IiArIHBhcmFtc1swXSk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQWN0aW9uTWVzc2FnZXMgZXJyb3JzID0gbmV3IEFjdGlvbk1lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJyZXNvdXJjZXMuaW52YWxpZC5lbnYiKSk7CisgICAgICAgICAgICAgICAgICAgIHNhdmVFcnJvcnMocmVxdWVzdCwgZXJyb3JzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgQWN0aW9uRm9yd2FyZChtYXBwaW5nLmdldElucHV0KCkpKTsKKyAgICAgICAgICAgICAgICB9ICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBvbmFtZSA9IFJlc291cmNlVXRpbHMuZ2V0TmFtaW5nUmVzb3VyY2VPYmplY3ROYW1lKGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXR5cGUsIHBhdGgsIGhvc3QpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IG9iamVjdCBhbmQgYXNzb2NpYXRlZCBNQmVhbgorICAgICAgICAgICAgICAgIG9iamVjdE5hbWUgPSAoU3RyaW5nKSBtc2VydmVyLmludm9rZShvbmFtZSwgImFkZEVudmlyb25tZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBzaWduYXR1cmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRFbnZpcm9ubWVudCIpLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRFbnZpcm9ubWVudCIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGFuICJVcGRhdGUgRW52aXJvbm1lbnQgRW50cnkiIHRyYW5zYWN0aW9uCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgYW4gb2JqZWN0IG5hbWUgZm9yIHRoaXMgb2JqZWN0CisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUob2JqZWN0TmFtZSk7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc3BlY2lmaWVkIGVudiBlbnRyeQorICAgICAgICAgICAgYXR0cmlidXRlID0gIm92ZXJyaWRlIjsKKyAgICAgICAgICAgIG1zZXJ2ZXIuc2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgKG9uYW1lLAorICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgbmV3IEJvb2xlYW4oZW52RW50cnlGb3JtLmdldE92ZXJyaWRlKCkpKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZGVzY3JpcHRpb24iOworICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCBlbnZFbnRyeUZvcm0uZ2V0RGVzY3JpcHRpb24oKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInR5cGUiOworICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCBlbnZFbnRyeUZvcm0uZ2V0RW50cnlUeXBlKCkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ2YWx1ZSI7CisgICAgICAgICAgICBtc2VydmVyLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIChvbmFtZSwKKyAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGVudkVudHJ5Rm9ybS5nZXRWYWx1ZSgpKSk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5zZXQuYXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gUHJvY2VlZCB0byB0aGUgbGlzdCBlbnRyaWVzIHNjcmVlbgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkVudkVudHJpZXMgTGlzdCBTZXR1cCIpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NhdmVNYWlsU2Vzc2lvbkFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TYXZlTWFpbFNlc3Npb25BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjU4MjFiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TYXZlTWFpbFNlc3Npb25BY3Rpb24uamF2YQpAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZXM7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5BY3Rpb248L3N0cm9uZz4gdGhhdCBzYXZlcyBhIG5ldyBvcgorICogdXBkYXRlZCBtYWlsIHNlc3Npb24gZW50cnkuPC9wPgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZU1haWxTZXNzaW9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKworICAgICAgICAvLyBIYXMgdGhpcyB0cmFuc2FjdGlvbiBiZWVuIGNhbmNlbGxlZD8KKyAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkxpc3QgTWFpbFNlc3Npb25zIFNldHVwIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHRva2VuCisgICAgICAgIGlmICghaXNUb2tlblZhbGlkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IudG9rZW4iKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbnkgZXh0cmEgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkCisgICAgICAgIE1haWxTZXNzaW9uRm9ybSBtYWlsU2Vzc2lvbkZvcm0gPSAoTWFpbFNlc3Npb25Gb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgb2JqZWN0TmFtZSA9IG1haWxTZXNzaW9uRm9ybS5nZXRPYmplY3ROYW1lKCk7CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbiAiQWRkIE1haWxTZXNzaW9uIiB0cmFuc2FjdGlvbgorICAgICAgICBpZiAob2JqZWN0TmFtZSA9PSBudWxsKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmVbXSA9IG5ldyBTdHJpbmdbMl07CisgICAgICAgICAgICBzaWduYXR1cmVbMF0gPSAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgICAgICBzaWduYXR1cmVbMV0gPSAiamF2YS5sYW5nLlN0cmluZyI7CisKKyAgICAgICAgICAgIE9iamVjdCBwYXJhbXNbXSA9IG5ldyBPYmplY3RbMl07CisgICAgICAgICAgICBwYXJhbXNbMF0gPSBtYWlsU2Vzc2lvbkZvcm0uZ2V0TmFtZSgpOworICAgICAgICAgICAgcGFyYW1zWzFdID0gUmVzb3VyY2VVdGlscy5NQUlMU0VTU0lPTl9DTEFTUzsgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2V0eXBlID0gbWFpbFNlc3Npb25Gb3JtLmdldFJlc291cmNldHlwZSgpOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBtYWlsU2Vzc2lvbkZvcm0uZ2V0UGF0aCgpOworICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBtYWlsU2Vzc2lvbkZvcm0uZ2V0SG9zdCgpOworICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1haWxTZXNzaW9uRm9ybS5nZXREb21haW4oKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2V0eXBlLmVxdWFscygiR2xvYmFsIikpIHsKKyAgICAgICAgICAgICAgICAgICAgb25hbWUgPSBuZXcgT2JqZWN0TmFtZSggZG9tYWluICsgUmVzb3VyY2VVdGlscy5SRVNPVVJDRV9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuR0xPQkFMX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixjbGFzcz0iICsgcGFyYW1zWzFdICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsbmFtZT0iICsgcGFyYW1zWzBdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkNvbnRleHQiKSkgeworICAgICAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyBSZXNvdXJjZVV0aWxzLlJFU09VUkNFX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5DT05URVhUX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixwYXRoPSIgKyBwYXRoICsgIixob3N0PSIgKyBob3N0ICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsY2xhc3M9IiArIHBhcmFtc1sxXSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLG5hbWU9IiArIHBhcmFtc1swXSk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQWN0aW9uTWVzc2FnZXMgZXJyb3JzID0gbmV3IEFjdGlvbk1lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJyZXNvdXJjZXMuaW52YWxpZC5uYW1lIikpOworICAgICAgICAgICAgICAgICAgICBzYXZlRXJyb3JzKHJlcXVlc3QsIGVycm9ycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEFjdGlvbkZvcndhcmQobWFwcGluZy5nZXRJbnB1dCgpKSk7CisgICAgICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG9uYW1lID0gUmVzb3VyY2VVdGlscy5nZXROYW1pbmdSZXNvdXJjZU9iamVjdE5hbWUoZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNldHlwZSwgcGF0aCwgaG9zdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBuZXcgb2JqZWN0IGFuZCBhc3NvY2lhdGVkIE1CZWFuCisgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSA9IChTdHJpbmcpIG1zZXJ2ZXIuaW52b2tlKG9uYW1lLCAiYWRkUmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRSZXNvdXJjZSIpLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRSZXNvdXJjZSIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFBlcmZvcm0gYW4gIlVwZGF0ZSBVc2VyIGRhdGFiYXNlIiB0cmFuc2FjdGlvbgorICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAibWFpbC5zbXRwLmhvc3QiOworICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCBtYWlsU2Vzc2lvbkZvcm0uZ2V0TWFpbGhvc3QoKSkpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2V0LmF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5zZXQuYXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFByb2NlZWQgdG8gdGhlIGxpc3QgZW50cmllcyBzY3JlZW4KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJNYWlsU2Vzc2lvbnMgTGlzdCBTZXR1cCIpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NhdmVSZXNvdXJjZUxpbmtBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvU2F2ZVJlc291cmNlTGlua0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNmFmMmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NhdmVSZXNvdXJjZUxpbmtBY3Rpb24uamF2YQpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZXM7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5BY3Rpb248L3N0cm9uZz4gdGhhdCBzYXZlcyBhIG5ldyBvcgorICogdXBkYXRlZCByZXNvdXJjZSBsaW5rIGVudHJ5LjwvcD4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVSZXNvdXJjZUxpbmtBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIEhhcyB0aGlzIHRyYW5zYWN0aW9uIGJlZW4gY2FuY2VsbGVkPworICAgICAgICBpZiAoaXNDYW5jZWxsZWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiTGlzdCBSZXNvdXJjZUxpbmtzIFNldHVwIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHRva2VuCisgICAgICAgIGlmICghaXNUb2tlblZhbGlkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IudG9rZW4iKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbnkgZXh0cmEgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkCisgICAgICAgIFJlc291cmNlTGlua0Zvcm0gcmVzb3VyY2VMaW5rRm9ybSA9IChSZXNvdXJjZUxpbmtGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgb2JqZWN0TmFtZSA9IHJlc291cmNlTGlua0Zvcm0uZ2V0T2JqZWN0TmFtZSgpOworICAgICAKKyAgICAgICAgLy8gUGVyZm9ybSBhbiAiQWRkIFJlc291cmNlTGluayIgdHJhbnNhY3Rpb24KKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworCisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzJdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgc2lnbmF0dXJlWzFdID0gImphdmEubGFuZy5TdHJpbmciOworCisgICAgICAgICAgICBPYmplY3QgcGFyYW1zW10gPSBuZXcgT2JqZWN0WzJdOworICAgICAgICAgICAgcGFyYW1zWzBdID0gcmVzb3VyY2VMaW5rRm9ybS5nZXROYW1lKCk7CisgICAgICAgICAgICBwYXJhbXNbMV0gPSByZXNvdXJjZUxpbmtGb3JtLmdldFR5cGUoKTsgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHJlc291cmNldHlwZSA9IHJlc291cmNlTGlua0Zvcm0uZ2V0UmVzb3VyY2V0eXBlKCk7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHJlc291cmNlTGlua0Zvcm0uZ2V0UGF0aCgpOworICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSByZXNvdXJjZUxpbmtGb3JtLmdldEhvc3QoKTsKKyAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSByZXNvdXJjZUxpbmtGb3JtLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkdsb2JhbCIpKSB7CisgICAgICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLlJFU09VUkNFTElOS19UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuR0xPQkFMX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixuYW1lPSIgKyBwYXJhbXNbMF0pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2V0eXBlLmVxdWFscygiQ29udGV4dCIpKSB7CisgICAgICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLlJFU09VUkNFTElOS19UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuQ09OVEVYVF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIscGF0aD0iICsgcGF0aCArICIsaG9zdD0iICsgaG9zdCArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLG5hbWU9IiArIHBhcmFtc1swXSk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQWN0aW9uTWVzc2FnZXMgZXJyb3JzID0gbmV3IEFjdGlvbk1lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJyZXNvdXJjZXMuaW52YWxpZC5uYW1lIikpOworICAgICAgICAgICAgICAgICAgICBzYXZlRXJyb3JzKHJlcXVlc3QsIGVycm9ycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEFjdGlvbkZvcndhcmQobWFwcGluZy5nZXRJbnB1dCgpKSk7CisgICAgICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG9uYW1lID0gUmVzb3VyY2VVdGlscy5nZXROYW1pbmdSZXNvdXJjZU9iamVjdE5hbWUoZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNldHlwZSwgcGF0aCwgaG9zdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBuZXcgb2JqZWN0IGFuZCBhc3NvY2lhdGVkIE1CZWFuCisgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSA9IChTdHJpbmcpIG1zZXJ2ZXIuaW52b2tlKG9uYW1lLCAiYWRkUmVzb3VyY2VMaW5rIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBzaWduYXR1cmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkUmVzb3VyY2VMaW5rIiksIGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFJlc291cmNlTGluayIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFBlcmZvcm0gYW4gIlVwZGF0ZSBVc2VyIGRhdGFiYXNlIiB0cmFuc2FjdGlvbgorICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZ2xvYmFsIjsKKyAgICAgICAgICAgIG1zZXJ2ZXIuc2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgKG9uYW1lLAorICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgcmVzb3VyY2VMaW5rRm9ybS5nZXRHbG9iYWwoKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInR5cGUiOworICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCByZXNvdXJjZUxpbmtGb3JtLmdldFR5cGUoKSkpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2V0LmF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5zZXQuYXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFByb2NlZWQgdG8gdGhlIGxpc3QgZW50cmllcyBzY3JlZW4KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJSZXNvdXJjZUxpbmtzIExpc3QgU2V0dXAiKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TYXZlVXNlckRhdGFiYXNlQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NhdmVVc2VyRGF0YWJhc2VBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTVkMmFhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TYXZlVXNlckRhdGFiYXNlQWN0aW9uLmphdmEKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1lc3NhZ2VzOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgc2F2ZXMgYSBuZXcgb3IKKyAqIHVwZGF0ZWQgVXNlciBkYXRhYmFzZSBlbnRyeS48L3A+CisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVVc2VyRGF0YWJhc2VBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworICAgIC8qCisgICAgICogT25seSBvbmUgaW1wbGVtZW50YXRpb24gb2YgZmFjdG9yeSBhbGxvd2VkIHRvIHN0YXJ0IHdpdGguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVVNFUkRCX0ZBQ1RPUlkgPSAib3JnLmFwYWNoZS5jYXRhbGluYS51c2Vycy5NZW1vcnlVc2VyRGF0YWJhc2VGYWN0b3J5IjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIEhhcyB0aGlzIHRyYW5zYWN0aW9uIGJlZW4gY2FuY2VsbGVkPworICAgICAgICBpZiAoaXNDYW5jZWxsZWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiTGlzdCBVc2VyRGF0YWJhc2VzIFNldHVwIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHRva2VuCisgICAgICAgIGlmICghaXNUb2tlblZhbGlkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IudG9rZW4iKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbnkgZXh0cmEgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkCisgICAgICAgIFVzZXJEYXRhYmFzZUZvcm0gdXNlckRhdGFiYXNlRm9ybSA9IChVc2VyRGF0YWJhc2VGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgb2JqZWN0TmFtZSA9IHVzZXJEYXRhYmFzZUZvcm0uZ2V0T2JqZWN0TmFtZSgpOworCisgICAgICAgIC8vIFBlcmZvcm0gYW4gIkFkZCBVc2VyRGF0YWJhc2UiIHRyYW5zYWN0aW9uCisgICAgICAgIGlmIChvYmplY3ROYW1lID09IG51bGwpIHsKKworICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZVtdID0gbmV3IFN0cmluZ1syXTsKKyAgICAgICAgICAgIHNpZ25hdHVyZVswXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICAgICAgICAgIHNpZ25hdHVyZVsxXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKworICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdID0gbmV3IE9iamVjdFsyXTsKKyAgICAgICAgICAgIHBhcmFtc1swXSA9IHVzZXJEYXRhYmFzZUZvcm0uZ2V0TmFtZSgpOworICAgICAgICAgICAgcGFyYW1zWzFdID0gUmVzb3VyY2VVdGlscy5VU0VSREJfQ0xBU1M7ICAgICAKKyAgICAgICAgICAgCisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gdXNlckRhdGFiYXNlRm9ybS5nZXREb21haW4oKTsKKyAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLlJFU09VUkNFX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLkdMT0JBTF9UWVBFICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLGNsYXNzPSIgKyBSZXNvdXJjZVV0aWxzLlVTRVJEQl9DTEFTUyArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsbmFtZT0iICsgcGFyYW1zWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFjdGlvbk1lc3NhZ2VzIGVycm9ycyA9IG5ldyBBY3Rpb25NZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgicmVzb3VyY2VzLmludmFsaWQubmFtZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZUVycm9ycyhyZXF1ZXN0LCBlcnJvcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBY3Rpb25Gb3J3YXJkKG1hcHBpbmcuZ2V0SW5wdXQoKSkpOworICAgICAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIE1CZWFuIE5hbWUgZm9yIHRoZSBuYW1pbmcgc291cmNlCisgICAgICAgICAgICAgICAgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLk5BTUlOR1JFU09VUkNFU19UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5HTE9CQUxfVFlQRSk7CisgCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBuZXcgb2JqZWN0IGFuZCBhc3NvY2lhdGVkIE1CZWFuCisgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSA9IChTdHJpbmcpIG1zZXJ2ZXIuaW52b2tlKG9uYW1lLCAiYWRkUmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRSZXNvdXJjZSIpLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRSZXNvdXJjZSIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFBlcmZvcm0gYW4gIlVwZGF0ZSBVc2VyIGRhdGFiYXNlIiB0cmFuc2FjdGlvbgorICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicGF0aG5hbWUiOworICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCB1c2VyRGF0YWJhc2VGb3JtLmdldFBhdGgoKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImZhY3RvcnkiOworICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCB1c2VyRGF0YWJhc2VGb3JtLmdldEZhY3RvcnkoKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImRlc2NyaXB0aW9uIjsKKyAgICAgICAgICAgIG1zZXJ2ZXIuc2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgKG9uYW1lLAorICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgdXNlckRhdGFiYXNlRm9ybS5nZXREZXNjcmlwdGlvbigpKSk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5zZXQuYXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gUHJvY2VlZCB0byB0aGUgbGlzdCBlbnRyaWVzIHNjcmVlbgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlVzZXJEYXRhYmFzZXMgTGlzdCBTZXR1cCIpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NldFVwRGF0YVNvdXJjZUFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TZXRVcERhdGFTb3VyY2VBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTU2MWU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TZXRVcERhdGFTb3VyY2VBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5BY3Rpb248L3N0cm9uZz4gdGhhdCBzZXRzIHVwIGFuZCBzdGFzaGVzCisgKiBhIDxjb2RlPkRhdGFTb3VyY2VGb3JtPC9jb2RlPiBiZWFuIGluIHJlcXVlc3Qgc2NvcGUuICBUaGUgZm9ybSBiZWFuIHdpbGwgaGF2ZQorICogYSBudWxsIDxjb2RlPm9iamVjdE5hbWU8L2NvZGU+IHByb3BlcnR5IGlmIHRoaXMgZm9ybSByZXByZXNlbnRzIGEgRGF0YVNvdXJjZQorICogYmVpbmcgYWRkZWQsIG9yIGEgbm9uLW51bGwgdmFsdWUgZm9yIGFuIGV4aXN0aW5nIERhdGFTb3VyY2UuPC9wPgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXRVcERhdGFTb3VyY2VBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtc2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBmb3JtIGJlYW4gYmFzZWQgb24gdGhlIGNyZWF0aW5nIG9yIGVkaXRpbmcgc3RhdGUKKyAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigib2JqZWN0TmFtZSIpOworICAgICAgICBTdHJpbmcgcmVzb3VyY2V0eXBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInJlc291cmNldHlwZSIpOworICAgICAgICBTdHJpbmcgcGF0aCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXRoIik7CisgICAgICAgIFN0cmluZyBob3N0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImhvc3QiKTsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkb21haW4iKTsKKworICAgICAgICBEYXRhU291cmNlRm9ybSBkYXRhU291cmNlRm9ybSA9IG5ldyBEYXRhU291cmNlRm9ybSgpOworICAgICAgICBkYXRhU291cmNlRm9ybS5zZXRSZXNvdXJjZXR5cGUocmVzb3VyY2V0eXBlKTsKKyAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0UGF0aChwYXRoKTsKKyAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0SG9zdChob3N0KTsKKyAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0RG9tYWluKGRvbWFpbik7CisgICAgICAgIGRhdGFTb3VyY2VGb3JtLnNldFR5cGUoUmVzb3VyY2VVdGlscy5EQVRBU09VUkNFX0NMQVNTKTsKKworICAgICAgICBpZiAob2JqZWN0TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBkYXRhU291cmNlRm9ybS5zZXROb2RlTGFiZWwKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLmFjdGlvbnMuZGF0YXNyYy5jcmVhdGUiKSk7CisgICAgICAgICAgICBkYXRhU291cmNlRm9ybS5zZXRPYmplY3ROYW1lKG51bGwpOworICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0QWN0aXZlKCI0Iik7CisgICAgICAgICAgICBkYXRhU291cmNlRm9ybS5zZXRJZGxlKCIyIik7CisgICAgICAgICAgICBkYXRhU291cmNlRm9ybS5zZXRXYWl0KCI1MDAwIik7CisgICAgICAgICAgICBkYXRhU291cmNlRm9ybS5zZXRUeXBlKFJlc291cmNlVXRpbHMuREFUQVNPVVJDRV9DTEFTUyk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGFTb3VyY2VGb3JtLnNldE5vZGVMYWJlbAorICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMuYWN0aW9ucy5kYXRhc3JjLmVkaXQiKSk7CisgICAgICAgICAgICBkYXRhU291cmNlRm9ybS5zZXRPYmplY3ROYW1lKG9iamVjdE5hbWUpOworCisgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJuYW1lIjsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0Sm5kaU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1cmwiOworICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlRm9ybS5zZXRVcmwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkcml2ZXJDbGFzc05hbWUiOworICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlRm9ybS5zZXREcml2ZXJDbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJuYW1lIjsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0VXNlcm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwYXNzd29yZCI7CisgICAgICAgICAgICAgICAgICAgIGRhdGFTb3VyY2VGb3JtLnNldFBhc3N3b3JkCisgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidmFsaWRhdGlvblF1ZXJ5IjsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0UXVlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGx5IGVtcHR5IGlmIGF0dHJpYnV0ZSBpcyBub3Qgc2V0IHlldAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAibWF4QWN0aXZlIjsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0QWN0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgbWF4QWN0aXZlIG5vdCBkZWZpbmVkLCBkaXNwbGF5IGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0QWN0aXZlKCI0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtYXhJZGxlIjsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0SWRsZQorICAgICAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIG1heElkbGUgbm90IGRlZmluZWQsIGRpc3BsYXkgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlRm9ybS5zZXRJZGxlKCIyIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtYXhXYWl0IjsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0V2FpdAorICAgICAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIG1heFdhaXQgbm90IGRlZmluZWQsIGRpc3BsYXkgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlRm9ybS5zZXRXYWl0KCI1MDAwIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXNoIHRoZSBmb3JtIGJlYW4gYW5kIGZvcndhcmQgdG8gdGhlIGRpc3BsYXkgcGFnZQorICAgICAgICBzYXZlVG9rZW4ocmVxdWVzdCk7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJkYXRhU291cmNlRm9ybSIsIGRhdGFTb3VyY2VGb3JtKTsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJEYXRhU291cmNlIikpOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TZXRVcEVudkVudHJ5QWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NldFVwRW52RW50cnlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2RjYWEwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TZXRVcEVudkVudHJ5QWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNldHMgdXAgYW5kIHN0YXNoZXMKKyAqIGEgPGNvZGU+RW52RW50cnlGb3JtPC9jb2RlPiBiZWFuIGluIHJlcXVlc3Qgc2NvcGUuICBUaGUgZm9ybSBiZWFuIHdpbGwgaGF2ZQorICogYSBudWxsIDxjb2RlPm9iamVjdE5hbWU8L2NvZGU+IHByb3BlcnR5IGlmIHRoaXMgZm9ybSByZXByZXNlbnRzIGEgRW52RW50cnkKKyAqIGJlaW5nIGFkZGVkLCBvciBhIG5vbi1udWxsIHZhbHVlIGZvciBhbiBleGlzdGluZyBFbnZFbnRyeS48L3A+CisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNldFVwRW52RW50cnlBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtc2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBmb3JtIGJlYW4gYmFzZWQgb24gdGhlIGNyZWF0aW5nIG9yIGVkaXRpbmcgc3RhdGUKKyAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigib2JqZWN0TmFtZSIpOworICAgICAgICBTdHJpbmcgcmVzb3VyY2V0eXBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInJlc291cmNldHlwZSIpOworICAgICAgICBTdHJpbmcgcGF0aCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXRoIik7CisgICAgICAgIFN0cmluZyBob3N0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImhvc3QiKTsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkb21haW4iKTsKKyAgICAgICAgCisgICAgICAgIEVudkVudHJ5Rm9ybSBlbnZFbnRyeUZvcm0gPSBuZXcgRW52RW50cnlGb3JtKCk7ICAgICAgICAgICAKKyAgICAgICAgZW52RW50cnlGb3JtLnNldFJlc291cmNldHlwZShyZXNvdXJjZXR5cGUpOworICAgICAgICBlbnZFbnRyeUZvcm0uc2V0UGF0aChwYXRoKTsKKyAgICAgICAgZW52RW50cnlGb3JtLnNldEhvc3QoaG9zdCk7CisgICAgICAgIGVudkVudHJ5Rm9ybS5zZXREb21haW4oZG9tYWluKTsKKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgZW52RW50cnlGb3JtLnNldE5vZGVMYWJlbAorICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMuYWN0aW9ucy5lbnYuY3JlYXRlIikpOworICAgICAgICAgICAgZW52RW50cnlGb3JtLnNldE9iamVjdE5hbWUobnVsbCk7IAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW52RW50cnlGb3JtLnNldE5vZGVMYWJlbAorICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMuYWN0aW9ucy5lbnYuZWRpdCIpKTsKKyAgICAgICAgICAgIGVudkVudHJ5Rm9ybS5zZXRPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJuYW1lIjsKKyAgICAgICAgICAgICAgICBlbnZFbnRyeUZvcm0uc2V0TmFtZQorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ0eXBlIjsKKyAgICAgICAgICAgICAgICBlbnZFbnRyeUZvcm0uc2V0RW50cnlUeXBlCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gInZhbHVlIjsKKyAgICAgICAgICAgICAgICBlbnZFbnRyeUZvcm0uc2V0VmFsdWUKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAib3ZlcnJpZGUiOworICAgICAgICAgICAgICAgIGVudkVudHJ5Rm9ybS5zZXRPdmVycmlkZSgKKyAgICAgICAgICAgICAgICAgICAgKChCb29sZWFuKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSkuYm9vbGVhblZhbHVlKCkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkZXNjcmlwdGlvbiI7CisgICAgICAgICAgICAgICAgZW52RW50cnlGb3JtLnNldERlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfSAKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIC8vIFN0YXNoIHRoZSBmb3JtIGJlYW4gYW5kIGZvcndhcmQgdG8gdGhlIGRpc3BsYXkgcGFnZQorICAgICAgICBzYXZlVG9rZW4ocmVxdWVzdCk7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJlbnZFbnRyeUZvcm0iLCBlbnZFbnRyeUZvcm0pOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkVudkVudHJ5IikpOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TZXRVcE1haWxTZXNzaW9uQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NldFVwTWFpbFNlc3Npb25BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTg2OTExCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TZXRVcE1haWxTZXNzaW9uQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNldHMgdXAgYW5kIHN0YXNoZXMKKyAqIGEgPGNvZGU+TWFpbFNlc3Npb25Gb3JtPC9jb2RlPiBiZWFuIGluIHJlcXVlc3Qgc2NvcGUuICBUaGUgZm9ybSBiZWFuIHdpbGwgaGF2ZQorICogYSBudWxsIDxjb2RlPm9iamVjdE5hbWU8L2NvZGU+IHByb3BlcnR5IGlmIHRoaXMgZm9ybSByZXByZXNlbnRzIGEgTWFpbFNlc3Npb24KKyAqIGJlaW5nIGFkZGVkLCBvciBhIG5vbi1udWxsIHZhbHVlIGZvciBhbiBleGlzdGluZyBNYWlsU2Vzc2lvbi48L3A+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXRVcE1haWxTZXNzaW9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIFNldCB1cCB0aGUgZm9ybSBiZWFuIGJhc2VkIG9uIHRoZSBjcmVhdGluZyBvciBlZGl0aW5nIHN0YXRlCisgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm9iamVjdE5hbWUiKTsKKyAgICAgICAgU3RyaW5nIHJlc291cmNldHlwZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJyZXNvdXJjZXR5cGUiKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBTdHJpbmcgaG9zdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJob3N0Iik7CisgICAgICAgIFN0cmluZyBkb21haW4gPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiZG9tYWluIik7CisgICAgICAgIAorICAgICAgICBNYWlsU2Vzc2lvbkZvcm0gbWFpbFNlc3Npb25Gb3JtID0gbmV3IE1haWxTZXNzaW9uRm9ybSgpOyAgICAgICAKKyAgICAgICAgbWFpbFNlc3Npb25Gb3JtLnNldFJlc291cmNldHlwZShyZXNvdXJjZXR5cGUpOworICAgICAgICBtYWlsU2Vzc2lvbkZvcm0uc2V0UGF0aChwYXRoKTsKKyAgICAgICAgbWFpbFNlc3Npb25Gb3JtLnNldEhvc3QoaG9zdCk7CisgICAgICAgIG1haWxTZXNzaW9uRm9ybS5zZXREb21haW4oZG9tYWluKTsKKyAgICAgICAgbWFpbFNlc3Npb25Gb3JtLnNldFR5cGUoUmVzb3VyY2VVdGlscy5NQUlMU0VTU0lPTl9DTEFTUyk7CisKKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgbWFpbFNlc3Npb25Gb3JtLnNldE5vZGVMYWJlbAorICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMuYWN0aW9ucy5tYWlsc2Vzc2lvbi5jcmVhdGUiKSk7CisgICAgICAgICAgICBtYWlsU2Vzc2lvbkZvcm0uc2V0T2JqZWN0TmFtZShudWxsKTsKKyAgICAgICAgICAgIG1haWxTZXNzaW9uRm9ybS5zZXRUeXBlKFJlc291cmNlVXRpbHMuTUFJTFNFU1NJT05fQ0xBU1MpOworICAgICAgICAgICAgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYWlsU2Vzc2lvbkZvcm0uc2V0Tm9kZUxhYmVsCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInJlc291cmNlcy5hY3Rpb25zLm1haWxzZXNzaW9uLmVkaXQiKSk7CisgICAgICAgICAgICBtYWlsU2Vzc2lvbkZvcm0uc2V0T2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAibmFtZSI7CisgICAgICAgICAgICAgICAgbWFpbFNlc3Npb25Gb3JtLnNldE5hbWUKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAibWFpbC5zbXRwLmhvc3QiOworICAgICAgICAgICAgICAgIG1haWxTZXNzaW9uRm9ybS5zZXRNYWlsaG9zdAorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICB9IAorICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgLy8gU3Rhc2ggdGhlIGZvcm0gYmVhbiBhbmQgZm9yd2FyZCB0byB0aGUgZGlzcGxheSBwYWdlCisgICAgICAgIHNhdmVUb2tlbihyZXF1ZXN0KTsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIm1haWxTZXNzaW9uRm9ybSIsIG1haWxTZXNzaW9uRm9ybSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiTWFpbFNlc3Npb24iKSk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NldFVwUmVzb3VyY2VMaW5rQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NldFVwUmVzb3VyY2VMaW5rQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyN2Q3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvU2V0VXBSZXNvdXJjZUxpbmtBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgc2V0cyB1cCBhbmQgc3Rhc2hlcworICogYSA8Y29kZT5SZXNvdXJjZUxpbmtGb3JtPC9jb2RlPiBiZWFuIGluIHJlcXVlc3Qgc2NvcGUuICBUaGUgZm9ybSBiZWFuIHdpbGwgaGF2ZQorICogYSBudWxsIDxjb2RlPm9iamVjdE5hbWU8L2NvZGU+IHByb3BlcnR5IGlmIHRoaXMgZm9ybSByZXByZXNlbnRzIGEgUmVzb3VyY2VMaW5rCisgKiBiZWluZyBhZGRlZCwgb3IgYSBub24tbnVsbCB2YWx1ZSBmb3IgYW4gZXhpc3RpbmcgUmVzb3VyY2VMaW5rLjwvcD4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNldFVwUmVzb3VyY2VMaW5rQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBmb3JtIGJlYW4gYmFzZWQgb24gdGhlIGNyZWF0aW5nIG9yIGVkaXRpbmcgc3RhdGUKKyAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigib2JqZWN0TmFtZSIpOworICAgICAgICBTdHJpbmcgcmVzb3VyY2V0eXBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInJlc291cmNldHlwZSIpOworICAgICAgICBTdHJpbmcgcGF0aCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXRoIik7CisgICAgICAgIFN0cmluZyBob3N0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImhvc3QiKTsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkb21haW4iKTsKKyAgICAgICAgCisgICAgICAgIFJlc291cmNlTGlua0Zvcm0gcmVzb3VyY2VMaW5rRm9ybSA9IG5ldyBSZXNvdXJjZUxpbmtGb3JtKCk7ICAgICAgIAorICAgICAgICByZXNvdXJjZUxpbmtGb3JtLnNldFJlc291cmNldHlwZShyZXNvdXJjZXR5cGUpOworICAgICAgICByZXNvdXJjZUxpbmtGb3JtLnNldFBhdGgocGF0aCk7CisgICAgICAgIHJlc291cmNlTGlua0Zvcm0uc2V0SG9zdChob3N0KTsKKyAgICAgICAgcmVzb3VyY2VMaW5rRm9ybS5zZXREb21haW4oZG9tYWluKTsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAob2JqZWN0TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZUxpbmtGb3JtLnNldE5vZGVMYWJlbAorICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrLmNyZWF0ZSIpKTsKKyAgICAgICAgICAgIHJlc291cmNlTGlua0Zvcm0uc2V0T2JqZWN0TmFtZShudWxsKTsKKyAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzb3VyY2VMaW5rRm9ybS5zZXROb2RlTGFiZWwKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLmFjdGlvbnMucmVzb3VyY2Vsay5lZGl0IikpOworICAgICAgICAgICAgcmVzb3VyY2VMaW5rRm9ybS5zZXRPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJuYW1lIjsKKyAgICAgICAgICAgICAgICByZXNvdXJjZUxpbmtGb3JtLnNldE5hbWUKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZ2xvYmFsIjsKKyAgICAgICAgICAgICAgICByZXNvdXJjZUxpbmtGb3JtLnNldEdsb2JhbAorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ0eXBlIjsKKyAgICAgICAgICAgICAgICByZXNvdXJjZUxpbmtGb3JtLnNldFR5cGUKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICB9IAorICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgLy8gU3Rhc2ggdGhlIGZvcm0gYmVhbiBhbmQgZm9yd2FyZCB0byB0aGUgZGlzcGxheSBwYWdlCisgICAgICAgIHNhdmVUb2tlbihyZXF1ZXN0KTsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoInJlc291cmNlTGlua0Zvcm0iLCByZXNvdXJjZUxpbmtGb3JtKTsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJSZXNvdXJjZUxpbmsiKSk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NldFVwVXNlckRhdGFiYXNlQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NldFVwVXNlckRhdGFiYXNlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwMTQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvU2V0VXBVc2VyRGF0YWJhc2VBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgc2V0cyB1cCBhbmQgc3Rhc2hlcworICogYSA8Y29kZT5Vc2VyRGF0YWJhc2VGb3JtPC9jb2RlPiBiZWFuIGluIHJlcXVlc3Qgc2NvcGUuICBUaGUgZm9ybSBiZWFuIHdpbGwgaGF2ZQorICogYSBudWxsIDxjb2RlPm9iamVjdE5hbWU8L2NvZGU+IHByb3BlcnR5IGlmIHRoaXMgZm9ybSByZXByZXNlbnRzIGEgVXNlckRhdGFiYXNlCisgKiBiZWluZyBhZGRlZCwgb3IgYSBub24tbnVsbCB2YWx1ZSBmb3IgYW4gZXhpc3RpbmcgVXNlckRhdGFiYXNlLjwvcD4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2V0VXBVc2VyRGF0YWJhc2VBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtc2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBmb3JtIGJlYW4gYmFzZWQgb24gdGhlIGNyZWF0aW5nIG9yIGVkaXRpbmcgc3RhdGUKKyAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigib2JqZWN0TmFtZSIpOworICAgICAgICBTdHJpbmcgZG9tYWluID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRvbWFpbiIpOworICAgICAgICAKKyAgICAgICAgVXNlckRhdGFiYXNlRm9ybSB1c2VyRGF0YWJhc2VGb3JtID0gbmV3IFVzZXJEYXRhYmFzZUZvcm0oKTsKKyAgICAgICAgdXNlckRhdGFiYXNlRm9ybS5zZXRGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNhdmVVc2VyRGF0YWJhc2VBY3Rpb24uVVNFUkRCX0ZBQ1RPUlkpOworICAgICAgICB1c2VyRGF0YWJhc2VGb3JtLnNldFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmVzb3VyY2VVdGlscy5VU0VSREJfQ0xBU1MpOyAgCisgICAgICAgIHVzZXJEYXRhYmFzZUZvcm0uc2V0RG9tYWluKGRvbWFpbik7ICAgICAgICAgICAgICAgCisKKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdXNlckRhdGFiYXNlRm9ybS5zZXROb2RlTGFiZWwKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLmFjdGlvbnMudXNlcmRiLmNyZWF0ZSIpKTsKKyAgICAgICAgICAgIHVzZXJEYXRhYmFzZUZvcm0uc2V0T2JqZWN0TmFtZShudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVzZXJEYXRhYmFzZUZvcm0uc2V0Tm9kZUxhYmVsCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInJlc291cmNlcy5hY3Rpb25zLnVzZXJkYi5lZGl0IikpOworICAgICAgICAgICAgdXNlckRhdGFiYXNlRm9ybS5zZXRPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJuYW1lIjsKKyAgICAgICAgICAgICAgICB1c2VyRGF0YWJhc2VGb3JtLnNldE5hbWUKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicGF0aG5hbWUiOworICAgICAgICAgICAgICAgIHVzZXJEYXRhYmFzZUZvcm0uc2V0UGF0aAorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkZXNjcmlwdGlvbiI7CisgICAgICAgICAgICAgICAgdXNlckRhdGFiYXNlRm9ybS5zZXREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAvLyBTdGFzaCB0aGUgZm9ybSBiZWFuIGFuZCBmb3J3YXJkIHRvIHRoZSBkaXNwbGF5IHBhZ2UKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgidXNlckRhdGFiYXNlRm9ybSIsIHVzZXJEYXRhYmFzZUZvcm0pOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlVzZXJEYXRhYmFzZSIpKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvVXNlckRhdGFiYXNlRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9Vc2VyRGF0YWJhc2VGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwYzM1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvVXNlckRhdGFiYXNlRm9ybS5qYXZhCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1lc3NhZ2U7CisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgaW5kaXZpZHVhbCB1c2VyIGRhdGFiYXNlIHBhZ2UuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFVzZXJEYXRhYmFzZUZvcm0gZXh0ZW5kcyBCYXNlRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIFRoZSBkb21haW4gb2YgdGhpcyBkYXRhIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkb21haW4gPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZG9tYWluIG9mIHRoZSBkYXRhIHNvdXJjZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kb21haW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkb21haW4gb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9tYWluKFN0cmluZyBkb21haW4pIHsKKyAgICAgICAgdGhpcy5kb21haW4gPSBkb21haW47CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5uYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHBhdGggb2YgdGhlIGFzc29jaWF0ZWQgdXNlciBkYXRhYmFzZSBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXRoID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhdGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy50eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZhY3RvcnkgdGhhdCBpbXBsZW1lbnRzIHRoZSB1c2VyIGRhdGFiYXNlIGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGZhY3RvcnkgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZmFjdG9yeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmFjdG9yeShTdHJpbmcgZmFjdG9yeSkgeworICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYXNzb2NpYXRlZCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGVzY3JpcHRpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgfQorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsKKyAgICAgICAgbmFtZSA9IG51bGw7CisgICAgICAgIHR5cGUgPSBudWxsOworICAgICAgICBwYXRoID0gbnVsbDsKKyAgICAgICAgZmFjdG9yeSA9IG51bGw7CisgICAgICAgIGRlc2NyaXB0aW9uID0gbnVsbDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBmcm9tIHRoaXMgSFRUUCByZXF1ZXN0LAorICAgICAqIGFuZCByZXR1cm4gYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW55CisgICAgICogdmFsaWRhdGlvbiBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gZm91bmQuICBJZiBubyBlcnJvcnMgYXJlIGZvdW5kLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB3aXRoIG5vCisgICAgICogcmVjb3JkZWQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIAorICAgIHByaXZhdGUgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG51bGw7CisgICAgCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisKKyAgICAgICAgLy8gbmFtZSBpcyBhIHJlcXVpcmVkIGZpZWxkCisgICAgICAgIGlmICgobmFtZSA9PSBudWxsKSB8fCAobmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoInJlc291cmNlcy5lcnJvci5uYW1lLnJlcXVpcmVkIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcGF0aCBpcyBhIHJlcXVpcmVkIGZpZWxkCisgICAgICAgIGlmICgocGF0aCA9PSBudWxsKSB8fCAocGF0aC5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJwYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoInJlc291cmNlcy5lcnJvci5wYXRoLnJlcXVpcmVkIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUXVvdGVzIG5vdCBhbGxvd2VkIGluIG5hbWUKKyAgICAgICAgaWYgKChuYW1lICE9IG51bGwpICYmIChuYW1lLmluZGV4T2YoJyInKSA+PSAwKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJ1c2Vycy5lcnJvci5xdW90ZXMiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBRdW90ZXMgbm90IGFsbG93ZWQgaW4gcGF0aAorICAgICAgICBpZiAoKHBhdGggIT0gbnVsbCkgJiYgKHBhdGguaW5kZXhPZignIicpID4gMCkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoInBhdGgiLAorICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgidXNlcnMuZXJyb3IucXVvdGVzIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUXVvdGVzIG5vdCBhbGxvd2VkIGluIGRlc2NyaXB0aW9uCisgICAgICAgIGlmICgoZGVzY3JpcHRpb24gIT0gbnVsbCkgJiYgKGRlc2NyaXB0aW9uLmluZGV4T2YoJyInKSA+IDApKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJ1c2Vycy5lcnJvci5xdW90ZXMiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKGVycm9ycyk7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9Vc2VyRGF0YWJhc2VzRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9Vc2VyRGF0YWJhc2VzRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNDBmNjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1VzZXJEYXRhYmFzZXNGb3JtLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgZGVsZXRlIGVudiBlbnRyaWVzIHBhZ2UuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFVzZXJEYXRhYmFzZXNGb3JtIGV4dGVuZHMgQmFzZUZvcm0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZXMgb2YgdGhlIHNwZWNpZmllZCB1c2VyIGRhdGFiYXNlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2VyRGF0YWJhc2VzW10gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZ1tdIGdldFVzZXJEYXRhYmFzZXMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy51c2VyRGF0YWJhc2VzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyRGF0YWJhc2VzKFN0cmluZyB1c2VyRGF0YWJhc2VzW10pIHsKKyAgICAgICAgdGhpcy51c2VyRGF0YWJhc2VzID0gdXNlckRhdGFiYXNlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZG9tYWluIG9mIHRoaXMgdXNlcmRhdGFiYXNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkb21haW4gb2YgdGhlIHVzZXJkYXRhYmFzZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kb21haW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkb21haW4gb2YgdGhlIHVzZXJkYXRhYmFzZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7CisgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOworICAgIH0KKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsKKyAgICAgICAgdGhpcy51c2VyRGF0YWJhc2VzID0gbnVsbDsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmVyL0VkaXRTZXJ2ZXJBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9zZXJ2ZXIvRWRpdFNlcnZlckFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiODFkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmVyL0VkaXRTZXJ2ZXJBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisvKioKKyAqIFRlc3QgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IGhhbmRsZXMgZXZlbnRzIGZyb20gdGhlIHRyZWUgY29udHJvbCB0ZXN0CisgKiBwYWdlLgorICoKKyAqIEBhdXRob3IgSmF6bWluIEpvbnNvbgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEVkaXRTZXJ2ZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgIAorCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGxhYmVsIG9mIHRoZSBub2RlIHRoYXQgd2FzIGNsaWNrZWQgb24uCisgICAgICAgIFN0cmluZyBub2RlTGFiZWwgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigibm9kZUxhYmVsIik7ICAKKyAgICAgICAgU3RyaW5nIHNlbGVjdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKTsgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU2VydmVyRm9ybSBzZXJ2ZXJGbSA9IG5ldyBTZXJ2ZXJGb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJzZXJ2ZXJGb3JtIiwgc2VydmVyRm0pOworICAgICAgICBzZXJ2ZXJGbS5zZXROb2RlTGFiZWwobm9kZUxhYmVsKTsgICAgICAgIAorICAgICAgICBzZXJ2ZXJGbS5zZXRPYmplY3ROYW1lKHNlbGVjdCk7CisgICAgICAgIAorICAgICAgICBPYmplY3ROYW1lIHNuYW1lID0gbnVsbDsgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzbmFtZSA9IG5ldyBPYmplY3ROYW1lKHNlbGVjdCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAiZXJyb3Iuc2VydmljZU5hbWUuYmFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFBhcmFtZXRlcigic2VsZWN0IikpOworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZyhtZXNzYWdlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULCBtZXNzYWdlKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIENvcHkgc2NhbGFyIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwb3J0IjsKKyAgICAgICAgICAgIHNlcnZlckZtLnNldFBvcnROdW1iZXJUZXh0CisgICAgICAgICAgICAgICAgKCgoSW50ZWdlcikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHNuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJzaHV0ZG93biI7CisgICAgICAgICAgICBzZXJ2ZXJGbS5zZXRTaHV0ZG93blRleHQKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHNuYW1lLCBhdHRyaWJ1dGUpKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy9mb3J3YXJkIHRvIHRoZSBzZXJ2ZXIganNwLgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNlcnZlciIpKTsgICAgICAgIAorICAgIH0KKyAgICAgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmVyL1NhdmVTZXJ2ZXJBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9zZXJ2ZXIvU2F2ZVNlcnZlckFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNWJmYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmVyL1NhdmVTZXJ2ZXJBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1lc3NhZ2VzOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNhdmVzIHNlcnZlciBwcm9wZXJ0aWVzLgorICoKKyAqIEBhdXRob3IgSmF6bWluIEpvbnNvbgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVTZXJ2ZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQWN0aW9uTWVzc2FnZXMgZXJyb3JzID0gbmV3IEFjdGlvbk1lc3NhZ2VzKCk7CisgICAgICAgIAorICAgICAgICAvLyBSZXBvcnQgYW55IGVycm9ycyB3ZSBoYXZlIGRpc2NvdmVyZWQgYmFjayB0byB0aGUgb3JpZ2luYWwgZm9ybQorICAgICAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHNhdmVFcnJvcnMocmVxdWVzdCwgZXJyb3JzKTsKKyAgICAgICAgICAgIHJldHVybiAobmV3IEFjdGlvbkZvcndhcmQobWFwcGluZy5nZXRJbnB1dCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFNlcnZlckZvcm0gc2Zvcm0gPSAoU2VydmVyRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIHNPYmplY3ROYW1lID0gc2Zvcm0uZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBTZXJ2ZXIgTUJlYW4KKyAgICAgICAgT2JqZWN0TmFtZSBzb25hbWUgPSBudWxsOworICAgICAgICB0cnkgeyAgICAgICAgICAgIAorICAgICAgICAgICAgc29uYW1lID0gbmV3IE9iamVjdE5hbWUoc09iamVjdE5hbWUpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgU2VydmVyIE1CZWFuIHJlZmVyZW5jZSAiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKworICAgICAgICAvLyBQZXJmb3JtIGF0dHJpYnV0ZSB1cGRhdGVzIGFzIHJlcXVlc3RlZAorICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5eyAgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwb3J0IjsKKyAgICAgICAgICAgIGludCBwb3J0ID0gMDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcG9ydCA9IEludGVnZXIucGFyc2VJbnQoc2Zvcm0uZ2V0UG9ydE51bWJlclRleHQoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHBvcnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJwb3J0IiwgbmV3IEludGVnZXIocG9ydCkpKTsgICAKKyAgICAgICAgICAgIC8vIHNldCBwb3J0IHdhcm5pbmcgYXMgcG9ydCA8IDEwMjQgcmVxdWlyZXMKKyAgICAgICAgICAgIC8vIHNwZWNpYWwgc29mdHdhcmUgY2FwYWJpbGl0aWVzCisgICAgICAgICAgICBpZiAocG9ydCA8IDEwMjQpIHsgICAgCisgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIndhcm5pbmciLCAic2VydmVyLnBvcnQud2FybmluZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAic2h1dGRvd24iOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJzaHV0ZG93biIsIHNmb3JtLmdldFNodXRkb3duVGV4dCgpKSk7CisgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzdWNjZXNzIHJlcG9ydGluZyBwYWdlCisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG1hcHBpbmcuZ2V0QXR0cmlidXRlKCkpOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsgICAgICAgIAorICAgIH0gIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZlci9TZXJ2ZXJGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmVyL1NlcnZlckZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTdjMjQxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZlci9TZXJ2ZXJGb3JtLmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnNlcnZlcjsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlOworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIHNlcnZlciBmb3JtIHBhZ2UuICAKKyAqIEBhdXRob3IgUGF0cmljayBMdWJ5CisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2VydmVyRm9ybSBleHRlbmRzIEFjdGlvbkZvcm0geworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgbm9kZSBsYWJlbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBub2RlTGFiZWwgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgcG9ydCBudW1iZXIuCisgICAgICovICAgIAorICAgIHByaXZhdGUgU3RyaW5nIHBvcnROdW1iZXJUZXh0ID0gIjgwODAiOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgc2h1dGRvd24gdGV4dC4KKyAgICAgKi8gICAgCisgICAgcHJpdmF0ZSBTdHJpbmcgc2h1dGRvd25UZXh0ID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWUgb2YgdGhlIENvbm5lY3RvciB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG9iamVjdE5hbWUgPSBudWxsOworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGFiZWwgb2YgdGhlIG5vZGUgdGhhdCB3YXMgY2xpY2tlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVMYWJlbCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLm5vZGVMYWJlbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgbm9kZSBsYWJlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb2RlTGFiZWwoU3RyaW5nIG5vZGVMYWJlbCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5ub2RlTGFiZWwgPSBub2RlTGFiZWw7CisgICAgICAgIAorICAgIH0gICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwb3J0TnVtYmVyVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBvcnROdW1iZXJUZXh0KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucG9ydE51bWJlclRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBvcnROdW1iZXJUZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBvcnROdW1iZXJUZXh0KFN0cmluZyBwb3J0TnVtYmVyVGV4dCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5wb3J0TnVtYmVyVGV4dCA9IHBvcnROdW1iZXJUZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBTaHV0ZG93biBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2h1dGRvd25UZXh0KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuc2h1dGRvd25UZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBTaHV0IGRvd24gIFRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2h1dGRvd25UZXh0KFN0cmluZyBzaHV0ZG93blRleHQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuc2h1dGRvd25UZXh0ID0gc2h1dGRvd25UZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvYmplY3QgbmFtZSBvZiB0aGUgQ29ubmVjdG9yIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPYmplY3ROYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLm9iamVjdE5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIENvbm5lY3RvciB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdE5hbWUoU3RyaW5nIG9iamVjdE5hbWUpIHsKKworICAgICAgICB0aGlzLm9iamVjdE5hbWUgPSBvYmplY3ROYW1lOworCisgICAgfQorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnBvcnROdW1iZXJUZXh0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5zaHV0ZG93blRleHQgPSBudWxsOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IGZyb20gdGhpcyBIVFRQIHJlcXVlc3QsCisgICAgICogYW5kIHJldHVybiBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbnkKKyAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBmb3VuZC4gIElmIG5vIGVycm9ycyBhcmUgZm91bmQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHdpdGggbm8KKyAgICAgKiByZWNvcmRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgIAorICAgICAgICAvLyBjaGVjayBmb3IgcG9ydE51bWJlciAtLSBtdXN0IG5vdCBiZSBibGFuaywgbXVzdCBiZSBpbgorICAgICAgICAvLyB0aGUgcmFuZ2UgMSB0byA2NTUzNS4KKyAgICAgICAgCisgICAgICAgIGlmICgocG9ydE51bWJlclRleHQgPT0gbnVsbCkgfHwgKHBvcnROdW1iZXJUZXh0Lmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoInBvcnROdW1iZXJUZXh0IiwKKyAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5wb3J0TnVtYmVyLnJlcXVpcmVkIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnQgcG9ydCA9IEludGVnZXIucGFyc2VJbnQocG9ydE51bWJlclRleHQpOworICAgICAgICAgICAgICAgIGlmICgocG9ydCA8PSAwKSB8fCAocG9ydCA+NjU1MzUgKSkKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgicG9ydE51bWJlclRleHQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5wb3J0TnVtYmVyLnJhbmdlIikpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJwb3J0TnVtYmVyVGV4dCIsIAorICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IucG9ydE51bWJlci5mb3JtYXQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLy8gc2h1dGRvd24gdGV4dCBjYW4gYmUgYW55IG5vbi1lbXB0eSBzdHJpbmcgb2YgYXRsZWFzdCA2IGNoYXJhY3RlcnMuCisgICAgICAgIAorICAgICAgICBpZiAoKHNodXRkb3duVGV4dCA9PSBudWxsKSB8fCAoc2h1dGRvd25UZXh0Lmxlbmd0aCgpIDwgNykpCisgICAgICAgICAgICBlcnJvcnMuYWRkKCJzaHV0ZG93blRleHQiLAorICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLnNodXRkb3duVGV4dC5sZW5ndGgiKSk7CisgICAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICAgICAgCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvQWRkU2VydmljZUFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvQWRkU2VydmljZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMTAyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmljZS9BZGRTZXJ2aWNlQWN0aW9uLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uc2VydmljZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MYWJlbFZhbHVlQmVhbjsKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IHNldHMgdXAgPGVtPkFkZCBTZXJ2aWNlPC9lbT4gdHJhbnNhY3Rpb25zLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBBZGRTZXJ2aWNlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgc2VydmVyTmFtZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKTsKKyAgICAgICAgCisgICAgICAgIC8vIEZpbGwgaW4gdGhlIGZvcm0gdmFsdWVzIGZvciBkaXNwbGF5IGFuZCBlZGl0aW5nCisgICAgICAgIFNlcnZpY2VGb3JtIHNlcnZpY2VGbSA9IG5ldyBTZXJ2aWNlRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgic2VydmljZUZvcm0iLCBzZXJ2aWNlRm0pOworICAgICAgICBzZXJ2aWNlRm0uc2V0QWRtaW5BY3Rpb24oIkNyZWF0ZSIpOworICAgICAgICBzZXJ2aWNlRm0uc2V0T2JqZWN0TmFtZSgiIik7CisgICAgICAgIHNlcnZpY2VGbS5zZXRFbmdpbmVPYmplY3ROYW1lKCIiKTsKKyAgICAgICAgc2VydmljZUZtLnNldFNlcnZpY2VOYW1lKCIiKTsKKyAgICAgICAgc2VydmljZUZtLnNldEVuZ2luZU5hbWUoIiIpOworICAgICAgICBzZXJ2aWNlRm0uc2V0RGVmYXVsdEhvc3QoImxvY2FsaG9zdCIpOyAgICAgICAgCisgICAgICAgIHNlcnZpY2VGbS5zZXRBZG1pblNlcnZpY2VOYW1lKCIiKTsKKyAgICAgICAgc2VydmljZUZtLnNldFNlcnZlck9iamVjdE5hbWUoc2VydmVyTmFtZSk7CisgICAgICAgIEFycmF5TGlzdCBob3N0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgaG9zdHMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbgorICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgImxpc3Qubm9uZSIpLCAiIikpOworICAgICAgICBzZXJ2aWNlRm0uc2V0SG9zdE5hbWVWYWxzKGhvc3RzKTsKKyAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHNlcnZpY2UgZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2VydmljZSIpKTsKKyAgICAgICAgCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9zZXJ2aWNlL0RlbGV0ZVNlcnZpY2VBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9zZXJ2aWNlL0RlbGV0ZVNlcnZpY2VBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGQ1ODI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvRGVsZXRlU2VydmljZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnNlcnZpY2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5EZWxldGUgU2VydmljZXM8L2VtPiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlbGV0ZVNlcnZpY2VBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgIAorCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIHNlbGVjdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKTsKKyAgICAgICAgU3RyaW5nIGFkbWluU2VydmljZSA9IG51bGw7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgZG9tYWluID0gbnVsbDsKKyAgICAgICAgLy8gR2V0IHRoZSBzZXJ2aWNlIG5hbWUgdGhlIGFkbWluIGFwcCBydW5zIG9uCisgICAgICAgIC8vIHRoaXMgc2VydmljZSBjYW5ub3QgYmUgZGVsZXRlZCBmcm9tIHRoZSBhZG1pbiB0b29sCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKHNlbGVjdCk7CisgICAgICAgICAgICBkb21haW4gPSBvbmFtZS5nZXREb21haW4oKTsKKyAgICAgICAgICAgIGFkbWluU2VydmljZSA9IExpc3RzLmdldEFkbWluQXBwU2VydmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQlNlcnZlciwgZG9tYWluICxyZXF1ZXN0KTsKKyAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAiZXJyb3Iuc2VydmljZU5hbWUuYmFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkbWluU2VydmljZSk7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiYWRtaW5BcHBTZXJ2aWNlIiwgYWRtaW5TZXJ2aWNlKTsKKyAKKyAgICAgICAgLy8gU2V0IHVwIGEgZm9ybSBiZWFuIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAorICAgICAgICAvLyBvYmplY3RzIHRvIGJlIGRlbGV0ZWQKKyAgICAgICAgU2VydmljZXNGb3JtIHNlcnZpY2VzRm9ybSA9IG5ldyBTZXJ2aWNlc0Zvcm0oKTsKKyAgICAgICAgaWYgKHNlbGVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgc2VydmljZXNbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICBzZXJ2aWNlc1swXSA9IHNlbGVjdDsKKyAgICAgICAgICAgIHNlcnZpY2VzRm9ybS5zZXRTZXJ2aWNlcyhzZXJ2aWNlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoInNlcnZpY2VzRm9ybSIsIHNlcnZpY2VzRm9ybSk7CisKKyAgICAgICAgLy8gQWNjdW11bGF0ZSBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBzZXJ2aWNlcworICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gIioiICsgVG9tY2F0VHJlZUJ1aWxkZXIuU0VSVklDRV9UWVBFICsKKyAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5XSUxEQ0FSRDsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZW1zID0KKyAgICAgICAgICAgICAgICBtQlNlcnZlci5xdWVyeU5hbWVzKG5ldyBPYmplY3ROYW1lKHBhdHRlcm4pLCBudWxsKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZW1zLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0ZW1zLm5leHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2VsZWN0IikpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5zZWxlY3QiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCk7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJzZXJ2aWNlc0xpc3QiLCBsaXN0KTsgICAgCisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBsaXN0IGRpc3BsYXkgcGFnZQorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNlcnZpY2VzIikpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmljZS9EZWxldGVTZXJ2aWNlc0FjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvRGVsZXRlU2VydmljZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWZjMTczCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvRGVsZXRlU2VydmljZXNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5zZXJ2aWNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbE5vZGU7CisKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IGNvbXBsZXRlcyA8ZW0+RGVsZXRlIFNlcnZpY2VzPC9lbT4KKyAqIHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsZXRlU2VydmljZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvKioKKyAgICAgKiBTaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5yZW1vdmVTZXJ2aWNlPC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlU2VydmljZVR5cGVzW10gPQorICAgIHsgImphdmEubGFuZy5TdHJpbmciLCAgICAgIC8vIE9iamVjdCBuYW1lCisgICAgfTsKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBEZWxldGUgdGhlIHNwZWNpZmllZCBTZXJ2aWNlcworICAgICAgICBTdHJpbmcgc2VydmljZXNbXSAgPSAoKFNlcnZpY2VzRm9ybSkgZm9ybSkuZ2V0U2VydmljZXMoKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9ICJyZW1vdmVTZXJ2aWNlIjsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gTG9vayB1cCBvdXIgdHJlZSBjb250cm9sIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBUcmVlQ29udHJvbCBjb250cm9sID0gKFRyZWVDb250cm9sKQorICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ0cmVlQ29udHJvbFRlc3QiKTsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgc2VydmljZXMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBzZXJ2aWNlc1tpXTsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIGZuYW1lID0gCisgICAgICAgICAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5nZXRNQmVhbkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCByZW1vdmVTZXJ2aWNlVHlwZXMpOworICAgICAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zZWxlY3ROb2RlKG51bGwpOworICAgICAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgbm9kZSA9IGNvbnRyb2wuZmluZE5vZGUoc2VydmljZXNbaV0pOworICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZygiTWlzc2luZyBUcmVlQ29udHJvbE5vZGUgZm9yICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKCJNaXNzaW5nIFRyZWVDb250cm9sIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhpcyB0cmFuc2FjdGlvbgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9zZXJ2aWNlL0VkaXRTZXJ2aWNlQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmljZS9FZGl0U2VydmljZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNTQ0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmljZS9FZGl0U2VydmljZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5zZXJ2aWNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxhYmVsVmFsdWVCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxpc3RzOworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgc2V0cyB1cCA8ZW0+RWRpdCBTZXJ2aWNlPC9lbT4gdHJhbnNhY3Rpb25zLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBFZGl0U2VydmljZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBTZXQgdXAgdGhlIG9iamVjdCBuYW1lcyBvZiB0aGUgTUJlYW5zIHdlIGFyZSBtYW5pcHVsYXRpbmcKKyAgICAgICAgT2JqZWN0TmFtZSBzbmFtZSA9IG51bGw7CisgICAgICAgIE9iamVjdE5hbWUgZW5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc25hbWUgPSBuZXcgT2JqZWN0TmFtZShyZXF1ZXN0LmdldFBhcmFtZXRlcigic2VsZWN0IikpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgImVycm9yLnNlcnZpY2VOYW1lLmJhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpKTsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cobWVzc2FnZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc25hbWUuZ2V0RG9tYWluKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI6dHlwZT1FbmdpbmUiKTsKKyAgICAgICAgICAgIGVuYW1lID0gbmV3IE9iamVjdE5hbWUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAiZXJyb3IuZW5naW5lTmFtZS5iYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZyhtZXNzYWdlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULCBtZXNzYWdlKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgYWRtaW5TZXJ2aWNlID0gbnVsbDsKKyAgICAgICAgLy8gR2V0IHRoZSBzZXJ2aWNlIG5hbWUgdGhlIGFkbWluIGFwcCBydW5zIG9uCisgICAgICAgIC8vIHRoaXMgc2VydmljZSBjYW5ub3QgYmUgZGVsZXRlZCBmcm9tIHRoZSBhZG1pbiB0b29sCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhZG1pblNlcnZpY2UgPSBMaXN0cy5nZXRBZG1pbkFwcFNlcnZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIsIHNuYW1lLmdldERvbWFpbigpLHJlcXVlc3QpOworICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJlcnJvci5zZXJ2aWNlTmFtZS5iYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtaW5TZXJ2aWNlKTsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cobWVzc2FnZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgCisgICAgICAgIC8vIEZpbGwgaW4gdGhlIGZvcm0gdmFsdWVzIGZvciBkaXNwbGF5IGFuZCBlZGl0aW5nCisgICAgICAgIFNlcnZpY2VGb3JtIHNlcnZpY2VGbSA9IG5ldyBTZXJ2aWNlRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgic2VydmljZUZvcm0iLCBzZXJ2aWNlRm0pOworICAgICAgICBzZXJ2aWNlRm0uc2V0QWRtaW5BY3Rpb24oIkVkaXQiKTsKKyAgICAgICAgc2VydmljZUZtLnNldE9iamVjdE5hbWUoc25hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIHNlcnZpY2VGbS5zZXRFbmdpbmVPYmplY3ROYW1lKGVuYW1lLnRvU3RyaW5nKCkpOworICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInNlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLnN1YnRyZWVOb2RlIikpOworICAgICAgICBzYi5hcHBlbmQoIiAoIik7CisgICAgICAgIHNiLmFwcGVuZChzbmFtZS5nZXRLZXlQcm9wZXJ0eSgic2VydmljZU5hbWUiKSk7CisgICAgICAgIHNiLmFwcGVuZCgiKSIpOworICAgICAgICBzZXJ2aWNlRm0uc2V0Tm9kZUxhYmVsKHNiLnRvU3RyaW5nKCkpOworICAgICAgICBzZXJ2aWNlRm0uc2V0QWRtaW5TZXJ2aWNlTmFtZShhZG1pblNlcnZpY2UpOworICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gQ29weSBzY2FsYXIgcHJvcGVydGllcworICAgICAgICAgICAgYXR0cmlidXRlID0gIm5hbWUiOworICAgICAgICAgICAgc2VydmljZUZtLnNldFNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShzbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAibmFtZSI7CisgICAgICAgICAgICBzZXJ2aWNlRm0uc2V0RW5naW5lTmFtZQorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoZW5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImRlZmF1bHRIb3N0IjsKKyAgICAgICAgICAgIHNlcnZpY2VGbS5zZXREZWZhdWx0SG9zdAorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoZW5hbWUsIGF0dHJpYnV0ZSkpOworCisgICAgICAgICAgICAvLyBCdWlsZCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgaG9zdHMKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJob3N0cyI7CisgICAgICAgICAgICBBcnJheUxpc3QgaG9zdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBob3N0cy5hZGQobmV3IExhYmVsVmFsdWVCZWFuCisgICAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgImxpc3Qubm9uZSIpLCAiIikpOworICAgICAgICAgICAgSXRlcmF0b3IgaXRlbXMgPSBMaXN0cy5nZXRIb3N0cyhtQlNlcnZlciwgc25hbWUpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBobmFtZSA9IG5ldyBPYmplY3ROYW1lKChTdHJpbmcpIGl0ZW1zLm5leHQoKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBobmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICAgICAgICAgIGlmIChuYW1lIT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGhvc3RzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4obmFtZSwgbmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlcnZpY2VGbS5zZXRIb3N0TmFtZVZhbHMoaG9zdHMpOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgc2VydmljZSBkaXNwbGF5IHBhZ2UKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTZXJ2aWNlIikpOworICAgICAgICAKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvU2F2ZVNlcnZpY2VBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9zZXJ2aWNlL1NhdmVTZXJ2aWNlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyNWQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9zZXJ2aWNlL1NhdmVTZXJ2aWNlQWN0aW9uLmphdmEKQEAgLTAsMCArMSwzMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnNlcnZpY2U7CisKKworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZS5WYWx2ZVV0aWw7CisKKworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgY29tcGxldGVzIDxlbT5BZGQgU2VydmljZTwvZW0+IGFuZAorICogPGVtPkVkaXQgU2VydmljZTwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYXZlU2VydmljZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBTaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5jcmVhdGVTdGFuZGFyZEVuZ2luZVNlcnZpY2U8L2NvZGU+IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVTdGFuZGFyZEVuZ2luZVNlcnZpY2VUeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIHBhcmVudAorICAgICAgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gZW5naW5lTmFtZQorICAgICAgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gZGVmYXVsdEhvc3QKKyAgICAgICJqYXZhLmxhbmcuU3RyaW5nIiAgICAgIC8vIHNlcnZpY2VOYW1lCisgICAgfTsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBJZGVudGlmeSB0aGUgcmVxdWVzdGVkIGFjdGlvbgorICAgICAgICBTZXJ2aWNlRm9ybSBzZm9ybSA9IChTZXJ2aWNlRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIGFkbWluQWN0aW9uID0gc2Zvcm0uZ2V0QWRtaW5BY3Rpb24oKTsKKyAgICAgICAgU3RyaW5nIHNPYmplY3ROYW1lID0gc2Zvcm0uZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICBTdHJpbmcgZU9iamVjdE5hbWUgPSBzZm9ybS5nZXRFbmdpbmVPYmplY3ROYW1lKCk7CisgICAgICAgIE9iamVjdE5hbWUgZW9uYW1lID0gbnVsbDsKKyAgICAgICAgT2JqZWN0TmFtZSBzb25hbWUgPSBudWxsOworICAgICAgICAvLyBQZXJmb3JtIGEgIkNyZWF0ZSBTZXJ2aWNlIiB0cmFuc2FjdGlvbiAoaWYgcmVxdWVzdGVkKQorICAgICAgICBpZiAoIkNyZWF0ZSIuZXF1YWxzKGFkbWluQWN0aW9uKSkgeworCisgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZXNbXSA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gZW5naW5lIG5hbWUgaXMgZG9tYWluCisgICAgICAgICAgICAgICAgU3RyaW5nIGVuZ2luZU5hbWUgPSBzZm9ybS5nZXRFbmdpbmVOYW1lKCk7CisgICAgICAgICAgICAgICAgLy9TdHJpbmcgZG9tYWluID0gKG5ldyBPYmplY3ROYW1lKHNlcnZlck9iamVjdE5hbWUpKS5nZXREb21haW4oKTsKKyAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcmVxdWVzdGVkIHNlcnZpY2UgbmFtZSBpcyB1bmlxdWUKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdE5hbWUoIioiICsgVG9tY2F0VHJlZUJ1aWxkZXIuU0VSVklDRV9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsc2VydmljZU5hbWU9IitzZm9ybS5nZXRTZXJ2aWNlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBJdGVyYXRvciBuYW1lcyA9IG1CU2VydmVyLnF1ZXJ5TmFtZXMob25hbWUsIG51bGwpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgeyAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1CU2VydmVyLmlzUmVnaXN0ZXJlZCgoT2JqZWN0TmFtZSluYW1lcy5uZXh0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25NZXNzYWdlcyBlcnJvcnMgPSBuZXcgQWN0aW9uTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInNlcnZpY2VOYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3Iuc2VydmljZU5hbWUuZXhpc3RzIikpOworICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUVycm9ycyhyZXF1ZXN0LCBlcnJvcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgQWN0aW9uRm9yd2FyZChtYXBwaW5nLmdldElucHV0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGVuZ2luZU5hbWUgKyBUb21jYXRUcmVlQnVpbGRlci5FTkdJTkVfVFlQRSk7CisgICAgICAgICAgICAgICAgaWYgKG1CU2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQWN0aW9uTWVzc2FnZXMgZXJyb3JzID0gbmV3IEFjdGlvbk1lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInNlcnZpY2VOYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IuZW5naW5lTmFtZS5leGlzdHMiKSk7CisgICAgICAgICAgICAgICAgICAgIHNhdmVFcnJvcnMocmVxdWVzdCwgZXJyb3JzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgQWN0aW9uRm9yd2FyZChtYXBwaW5nLmdldElucHV0KCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gTG9vayB1cCBvdXIgTUJlYW5GYWN0b3J5IE1CZWFuCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBmbmFtZSA9IFRvbWNhdFRyZWVCdWlsZGVyLmdldE1CZWFuRmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFN0YW5kYXJkU2VydmljZSBhbmQgU3RhbmRhcmRFbmdpbmUgb2JqZWN0CisgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1s0XTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBUb21jYXRUcmVlQnVpbGRlci5TRVJWRVJfVFlQRTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMV0gPSBlbmdpbmVOYW1lOworICAgICAgICAgICAgICAgIHZhbHVlc1syXSA9IHNmb3JtLmdldERlZmF1bHRIb3N0KCk7CisgICAgICAgICAgICAgICAgdmFsdWVzWzNdID0gc2Zvcm0uZ2V0U2VydmljZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAiY3JlYXRlU3RhbmRhcmRFbmdpbmVTZXJ2aWNlIjsKKyAgICAgICAgICAgICAgICBWZWN0b3Igb25hbWVzID0gKFZlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuaW52b2tlKGZuYW1lLCBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIGNyZWF0ZVN0YW5kYXJkRW5naW5lU2VydmljZVR5cGVzKTsKKyAgICAgICAgICAgICAgICBlb25hbWUgPSAoT2JqZWN0TmFtZSlvbmFtZXMuZ2V0KDApOworICAgICAgICAgICAgICAgIHNvbmFtZSA9IChPYmplY3ROYW1lKW9uYW1lcy5nZXQoMSk7CisgICAgICAgICAgICAgICAgc09iamVjdE5hbWUgPSBzb25hbWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBlT2JqZWN0TmFtZSA9IGVvbmFtZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0cmluZyByZWFsbU9OYW1lID0gVmFsdmVVdGlsLmdldE9iamVjdE5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT2JqZWN0TmFtZSwgVG9tY2F0VHJlZUJ1aWxkZXIuUkVBTE1fVFlQRSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIHJvbmFtZSA9IG5ldyBPYmplY3ROYW1lKHJlYWxtT05hbWUpOworICAgICAgICAgICAgICAgIGlmIChtQlNlcnZlci5pc1JlZ2lzdGVyZWQocm9uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci51bnJlZ2lzdGVyTUJlYW4ocm9uYW1lKTsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBVc2VyRGF0YWJhc2VSZWFsbSBvYmplY3QKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nWzJdOworICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IGVPYmplY3ROYW1lOworICAgICAgICAgICAgICAgIHZhbHVlc1sxXSA9ICJVc2VyRGF0YWJhc2UiOworICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJjcmVhdGVVc2VyRGF0YWJhc2VSZWFsbSI7CisgICAgICAgICAgICAgICAgLy9yZWFsbU9OYW1lID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICAvLyAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCBjcmVhdGVVc2VyRGF0YWJhc2VSZWFsbVR5cGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vRW51bWVyYXRpb24gZW51bSA9IG9uYW1lcy5lbGVtZW50cygpOworICAgICAgICAgICAgICAgIC8vd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyAgICBnZXRTZXJ2bGV0KCkubG9nKCJzYXZlIHNlcnZpY2UgIitlbnVtLm5leHRFbGVtZW50KCkpOworICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgIHNPYmplY3ROYW1lID0gc29uYW1lLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgZU9iamVjdE5hbWUgPSBlb25hbWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU3RhbmRhcmRTZXJ2aWNlIG9iamVjdAorICAgICAgICAgICAgICAgIC8vdmFsdWVzID0gbmV3IFN0cmluZ1szXTsKKyAgICAgICAgICAgICAgICAvL3ZhbHVlc1swXSA9IFRvbWNhdFRyZWVCdWlsZGVyLlNFUlZFUl9UWVBFOworICAgICAgICAgICAgICAgIC8vdmFsdWVzWzFdID0gc2Zvcm0uZ2V0U2VydmljZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAvL3ZhbHVlc1syXSA9IGVuZ2luZU5hbWU7CisgICAgICAgICAgICAgICAgLy9vcGVyYXRpb24gPSAiY3JlYXRlU3RhbmRhcmRTZXJ2aWNlIjsKKyAgICAgICAgICAgICAgICAvL3NPYmplY3ROYW1lID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICAvLyAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCBjcmVhdGVTdGFuZGFyZFNlcnZpY2VUeXBlcyk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU3RhbmRhcmRFbmdpbmUgb2JqZWN0CisgICAgICAgICAgICAgICAgLy92YWx1ZXMgPSBuZXcgU3RyaW5nWzNdOworICAgICAgICAgICAgICAgIC8vdmFsdWVzWzBdID0gc09iamVjdE5hbWU7CisgICAgICAgICAgICAgICAgLy92YWx1ZXNbMV0gPSBzZm9ybS5nZXRFbmdpbmVOYW1lKCk7CisgICAgICAgICAgICAgICAgLy92YWx1ZXNbMl0gPSBzZm9ybS5nZXREZWZhdWx0SG9zdCgpOworICAgICAgICAgICAgICAgIC8vaWYgKCIiLmVxdWFscyh2YWx1ZXNbMl0pKSB7CisgICAgICAgICAgICAgICAgLy8gICAgdmFsdWVzWzJdID0gbnVsbDsKKyAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICAvL29wZXJhdGlvbiA9ICJjcmVhdGVTdGFuZGFyZEVuZ2luZSI7CisgICAgICAgICAgICAgICAgLy9lT2JqZWN0TmFtZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgLy8gICAgbUJTZXJ2ZXIuaW52b2tlKGZuYW1lLCBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIHZhbHVlcywgY3JlYXRlU3RhbmRhcmRFbmdpbmVUeXBlcyk7CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5ldyBTZXJ2aWNlIHRvIG91ciB0cmVlIGNvbnRyb2wgbm9kZQorICAgICAgICAgICAgICAgIFRyZWVDb250cm9sIGNvbnRyb2wgPSAoVHJlZUNvbnRyb2wpCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ0cmVlQ29udHJvbFRlc3QiKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJlbnROYW1lID0gVG9tY2F0VHJlZUJ1aWxkZXIuREVGQVVMVF9ET01BSU4gKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9tY2F0VHJlZUJ1aWxkZXIuU0VSVkVSX1RZUEU7CisgICAgICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBwYXJlbnROb2RlID0gY29udHJvbC5maW5kTm9kZShwYXJlbnROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5vZGVMYWJlbCA9IHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLnN1YnRyZWVOb2RlIikgKyIgKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbmFtZS5nZXRLZXlQcm9wZXJ0eSgic2VydmljZU5hbWUiKSArICIpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGVkTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoc09iamVjdE5hbWUsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBjaGlsZE5vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmVlQ29udHJvbE5vZGUoc09iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmljZS5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVkaXRTZXJ2aWNlLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZW5naW5lTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmFkZENoaWxkKGNoaWxkTm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdHJlZSB0byBkaXNwbGF5IHRoZSBuZXdseSBhZGRlZCByZWFsbQorICAgICAgICAgICAgICAgICAgICAgICAgLy9JdGVyYXRvciByZWFsbU5hbWVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIExpc3RzLmdldFJlYWxtcyhtQlNlcnZlciwgc09iamVjdE5hbWUpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3doaWxlIChyZWFsbU5hbWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgU3RyaW5nIHJlYWxtTmFtZSA9IChTdHJpbmcpIHJlYWxtTmFtZXMubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUocmVhbG1OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG5vZGVMYWJlbCA9ICJSZWFsbSBmb3Igc2VydmljZSAoIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBzZm9ybS5nZXRTZXJ2aWNlTmFtZSgpICsgIikiOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgVHJlZUNvbnRyb2xOb2RlIHJlYWxtTm9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgbmV3IFRyZWVDb250cm9sTm9kZShyZWFsbU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVhbG0uZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFZGl0UmVhbG0uZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVhbG1OYW1lKSArCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJm5vZGVMYWJlbD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKG5vZGVMYWJlbCksCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZW5naW5lTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBjaGlsZE5vZGUuYWRkQ2hpbGQocmVhbG1Ob2RlKTsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vfSAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgLSBmb3JjZSBhIHJlZGlzcGxheQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgcGFyZW50IG5vZGUgJyIgKyBwYXJlbnROYW1lICsgIiciKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgVHJlZUNvbnRyb2xOb2RlISIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbikpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhdHRyaWJ1dGUgdXBkYXRlcyBhcyByZXF1ZXN0ZWQKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgIAorICAgICAgICAgICAgZW9uYW1lID0gbmV3IE9iamVjdE5hbWUoZU9iamVjdE5hbWUpOworICAgICAgICAgICAgc29uYW1lID0gbmV3IE9iamVjdE5hbWUoc09iamVjdE5hbWUpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZGVmYXVsdEhvc3QiOworICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRIb3N0ID0gc2Zvcm0uZ2V0RGVmYXVsdEhvc3QoKTsKKyAgICAgICAgICAgIGlmICgiIi5lcXVhbHMoZGVmYXVsdEhvc3QpKSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdEhvc3QgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGVvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJkZWZhdWx0SG9zdCIsIGRlZmF1bHRIb3N0KSk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHN1Y2Nlc3MgcmVwb3J0aW5nIHBhZ2UKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUobWFwcGluZy5nZXRBdHRyaWJ1dGUoKSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2F2ZSBTdWNjZXNzZnVsIikpOworICAgICAgICAKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmljZS9TZXJ2aWNlRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvU2VydmljZUZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDkzNWU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvU2VydmljZUZvcm0uamF2YQpAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5zZXJ2aWNlOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgc2VydmljZSBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXJ2aWNlRm9ybSBleHRlbmRzIEFjdGlvbkZvcm0geworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworICAgIAorCisgICAgLyoqCisgICAgICogVGhlIGFkbWluaXN0cmF0aXZlIGFjdGlvbiByZXByZXNlbnRlZCBieSB0aGlzIGZvcm0uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWRtaW5BY3Rpb24gPSAiRWRpdCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZSBvZiB0aGUgRW5naW5lIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5naW5lT2JqZWN0TmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZSBvZiB0aGUgU2VydmljZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG9iamVjdE5hbWUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHNlcnZpY2VOYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lID0gbnVsbDsgICAgCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHNlcnZlck9iamVjdE5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyT2JqZWN0TmFtZSA9IG51bGw7IAorICAgIAorICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBub2RlIGxhYmVsLgorICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbm9kZUxhYmVsID0gbnVsbDsgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBlbmdpbmUgTmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlbmdpbmVOYW1lID0gbnVsbDsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSB0aGUgYWRtaW4gYXBwIHJ1bnMgb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWRtaW5TZXJ2aWNlTmFtZSA9IG51bGw7ICAgIAorCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBkZWZhdWx0SG9zdCBOYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRIb3N0ID0gbnVsbDsKKyAgICAKKyAgICBwcml2YXRlIExpc3QgaG9zdE5hbWVWYWxzID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFkbWluaXN0cmF0aXZlIGFjdGlvbiByZXByZXNlbnRlZCBieSB0aGlzIGZvcm0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBZG1pbkFjdGlvbigpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5hZG1pbkFjdGlvbjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFkbWluQWN0aW9uKFN0cmluZyBhZG1pbkFjdGlvbikgeworCisgICAgICAgIHRoaXMuYWRtaW5BY3Rpb24gPSBhZG1pbkFjdGlvbjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvYmplY3QgbmFtZSBvZiB0aGUgRW5naW5lIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFbmdpbmVPYmplY3ROYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmVuZ2luZU9iamVjdE5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIEVuZ2luZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuZ2luZU9iamVjdE5hbWUoU3RyaW5nIGVuZ2luZU9iamVjdE5hbWUpIHsKKworICAgICAgICB0aGlzLmVuZ2luZU9iamVjdE5hbWUgPSBlbmdpbmVPYmplY3ROYW1lOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBTZXJ2aWNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPYmplY3ROYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLm9iamVjdE5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIFNlcnZpY2UgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3ROYW1lKFN0cmluZyBvYmplY3ROYW1lKSB7CisKKyAgICAgICAgdGhpcy5vYmplY3ROYW1lID0gb2JqZWN0TmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsYWJlbCBvZiB0aGUgbm9kZSB0aGF0IHdhcyBjbGlja2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUxhYmVsKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMubm9kZUxhYmVsOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBub2RlIGxhYmVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vZGVMYWJlbChTdHJpbmcgbm9kZUxhYmVsKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLm5vZGVMYWJlbCA9IG5vZGVMYWJlbDsKKyAgICAgICAgCisgICAgfQorICAgICAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGhvc3QgbmFtZSB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0SG9zdE5hbWVWYWxzKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuaG9zdE5hbWVWYWxzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBob3N0TmFtZSB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SG9zdE5hbWVWYWxzKExpc3QgaG9zdE5hbWVWYWxzKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmhvc3ROYW1lVmFscyA9IGhvc3ROYW1lVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgZW5naW5lTmFtZS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRFbmdpbmVOYW1lKFN0cmluZyBlbmdpbmVOYW1lKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmVuZ2luZU5hbWUgPSBlbmdpbmVOYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlbmdpbmVOYW1lLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5naW5lTmFtZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmVuZ2luZU5hbWU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNlcnZlciBPYmplY3ROYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyT2JqZWN0TmFtZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnNlcnZlck9iamVjdE5hbWU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFNlcnZlciBOYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlck9iamVjdE5hbWUoU3RyaW5nIHNlcnZlck9iamVjdE5hbWUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuc2VydmVyT2JqZWN0TmFtZSA9IHNlcnZlck9iamVjdE5hbWU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNlcnZpY2UgTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZU5hbWU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFNlcnZpY2UgTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoZSBhZG1pbiBhcHAgcnVucyBvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFkbWluU2VydmljZU5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlTmFtZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgc2VydmljZSB0aGUgYWRtaW4gYXBwIHJ1bnMgb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWRtaW5TZXJ2aWNlTmFtZShTdHJpbmcgYWRtaW5TZXJ2aWNlTmFtZSkgeworCisgICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlTmFtZSA9IGFkbWluU2VydmljZU5hbWU7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgSG9zdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRIb3N0KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEhvc3Q7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlZmF1bHQgSG9zdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0SG9zdChTdHJpbmcgZGVmYXVsdEhvc3QpIHsKKworICAgICAgICB0aGlzLmRlZmF1bHRIb3N0ID0gZGVmYXVsdEhvc3Q7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmVuZ2luZU9iamVjdE5hbWUgPSBudWxsOworICAgICAgICB0aGlzLm9iamVjdE5hbWUgPSBudWxsOworICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy5lbmdpbmVOYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy5hZG1pblNlcnZpY2VOYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy5kZWZhdWx0SG9zdCA9IG51bGw7CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogUmVuZGVyIHRoaXMgb2JqZWN0IGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiU2VydmljZUZvcm1bYWRtaW5BY3Rpb249Iik7CisgICAgICAgIHNiLmFwcGVuZChhZG1pbkFjdGlvbik7CisgICAgICAgIHNiLmFwcGVuZCgiLGRlZmF1bHRIb3N0PSIpOworICAgICAgICBzYi5hcHBlbmQoZGVmYXVsdEhvc3QpOworICAgICAgICBzYi5hcHBlbmQoIixlbmdpbmVOYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQoZW5naW5lTmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiLGVuZ2luZU9iamVjdE5hbWU9JyIpOworICAgICAgICBzYi5hcHBlbmQoZW5naW5lT2JqZWN0TmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyxvYmplY3ROYW1lPSciKTsKKyAgICAgICAgc2IuYXBwZW5kKG9iamVjdE5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIicsc2VydmljZU5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChzZXJ2aWNlTmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyxzZXJ2ZXJPYmplY3ROYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQoc2VydmVyT2JqZWN0TmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyxhZG1pblNlcnZpY2VOYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQoYWRtaW5TZXJ2aWNlTmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKworICAgICAgICBpZiAoKHNlcnZpY2VOYW1lID09IG51bGwpIHx8IChzZXJ2aWNlTmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJzZXJ2aWNlTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5zZXJ2aWNlTmFtZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKChlbmdpbmVOYW1lID09IG51bGwpIHx8IChlbmdpbmVOYW1lLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoImVuZ2luZU5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IuZW5naW5lTmFtZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlcnJvcnM7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvU2VydmljZXNGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmljZS9TZXJ2aWNlc0Zvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2JhMTJiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvU2VydmljZXNGb3JtLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uc2VydmljZTsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgZGVsZXRpbmcgc2VydmljZXMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFNlcnZpY2VzRm9ybSBleHRlbmRzIEFjdGlvbkZvcm0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lcyBvZiB0aGUgc2VydmljZXMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlc1tdID0gbmV3IFN0cmluZ1swXTsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTZXJ2aWNlcygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlcnZpY2VzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlcyhTdHJpbmcgc2VydmljZXNbXSkgeworICAgICAgICB0aGlzLnNlcnZpY2VzID0gc2VydmljZXM7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICB0aGlzLnNlcnZpY2VzID0gbmV3IFN0cmluZ1swXTsKKworICAgIH0KKyAgICAgICAgCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9CYXNlRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0Jhc2VGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2ZWQyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9CYXNlRm9ybS5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBmb3JtIGJlYW5zIGZvciB0aGUgdXNlciBhZG1pbmlzdHJhdGlvbgorICogb3B0aW9ucy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIEJhc2VGb3JtIGV4dGVuZHMgQWN0aW9uRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuIE5hbWUgb2YgVXNlckRhdGFiYXNlIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGF0YWJhc2VOYW1lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VOYW1lKCkgeworICAgICAgICBpZiAoKHRoaXMuZGF0YWJhc2VOYW1lID09IG51bGwpICYmICh0aGlzLm9iamVjdE5hbWUgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKHRoaXMub2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgdGhpcy5kYXRhYmFzZU5hbWUgPSBvbmFtZS5nZXREb21haW4oKSArICI6IiArCisgICAgICAgICAgICAgICAgICAidHlwZT1Vc2VyRGF0YWJhc2UsZGF0YWJhc2U9IiArCisgICAgICAgICAgICAgICAgICBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgiZGF0YWJhc2UiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgdGhpcy5kYXRhYmFzZU5hbWUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAodGhpcy5kYXRhYmFzZU5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERhdGFiYXNlTmFtZShTdHJpbmcgZGF0YWJhc2VOYW1lKSB7CisgICAgICAgIGlmICgoZGF0YWJhc2VOYW1lICE9IG51bGwpICYmIChkYXRhYmFzZU5hbWUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgdGhpcy5kYXRhYmFzZU5hbWUgPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5kYXRhYmFzZU5hbWUgPSBkYXRhYmFzZU5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBub2RlIGxhYmVsIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdXNlciBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbm9kZUxhYmVsID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUxhYmVsKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubm9kZUxhYmVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROb2RlTGFiZWwoU3RyaW5nIG5vZGVMYWJlbCkgeworICAgICAgICB0aGlzLm5vZGVMYWJlbCA9IG5vZGVMYWJlbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhbiBvYmplY3QgbmFtZSBvZiB0aGlzIG9iamVjdC4gIEEgbnVsbCBvciB6ZXJvLWxlbmd0aAorICAgICAqIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoaXMgaXMgYSBuZXcgb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG9iamVjdE5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRPYmplY3ROYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMub2JqZWN0TmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0TmFtZShTdHJpbmcgb2JqZWN0TmFtZSkgeworICAgICAgICBpZiAoKG9iamVjdE5hbWUgIT0gbnVsbCkgJiYgKG9iamVjdE5hbWUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgdGhpcy5vYmplY3ROYW1lID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMub2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBkYXRhYmFzZU5hbWUgPSBudWxsOworICAgICAgICBub2RlTGFiZWwgPSBudWxsOworICAgICAgICBvYmplY3ROYW1lID0gbnVsbDsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvRGVsZXRlR3JvdXBzQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvRGVsZXRlR3JvdXBzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwYzEwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9EZWxldGVHcm91cHNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgZGVsZXRlcyB0aGUKKyAqIHNwZWNpZmllZCBzZXQgb2YgZ3JvdXBzLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIERlbGV0ZUdyb3Vwc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIEhhcyB0aGlzIHRyYW5zYWN0aW9uIGJlZW4gY2FuY2VsbGVkPworICAgICAgICBpZiAoaXNDYW5jZWxsZWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiTGlzdCBHcm91cHMgU2V0dXAiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGUgdHJhbnNhY3Rpb24gdG9rZW4KKyAgICAgICAgaWYgKCFpc1Rva2VuVmFsaWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci50b2tlbiIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGFueSBleHRyYSB2YWxpZGF0aW9uIHRoYXQgaXMgcmVxdWlyZWQKKyAgICAgICAgR3JvdXBzRm9ybSBncm91cHNGb3JtID0gKEdyb3Vwc0Zvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBkYXRhYmFzZU5hbWUgPSBncm91cHNGb3JtLmdldERhdGFiYXNlTmFtZSgpOworICAgICAgICBTdHJpbmcgZ3JvdXBzW10gPSBncm91cHNGb3JtLmdldEdyb3VwcygpOworICAgICAgICBpZiAoZ3JvdXBzID09IG51bGwpIHsKKyAgICAgICAgICAgIGdyb3VwcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtICJEZWxldGUgR3JvdXAiIHRyYW5zYWN0aW9ucyBhcyByZXF1aXJlZAorICAgICAgICB0cnkgeworCisgICAgICAgICAgICBPYmplY3ROYW1lIGRuYW1lID0gbmV3IE9iamVjdE5hbWUoZGF0YWJhc2VOYW1lKTsKKyAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmVbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICBzaWduYXR1cmVbMF0gPSAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgICAgICBPYmplY3QgcGFyYW1zW10gPSBuZXcgU3RyaW5nWzFdOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShncm91cHNbaV0pOworICAgICAgICAgICAgICAgIHBhcmFtc1swXSA9IE9iamVjdE5hbWUudW5xdW90ZShvbmFtZS5nZXRLZXlQcm9wZXJ0eSgiZ3JvdXBuYW1lIikpOworICAgICAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKGRuYW1lLCAicmVtb3ZlR3JvdXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgc2lnbmF0dXJlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVHcm91cCIpLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW92ZUdyb3VwIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gU2F2ZSB0aGUgdXBkYXRlZCBkYXRhYmFzZSBpbmZvcm1hdGlvbgorICAgICAgICB0cnkgeworCisgICAgICAgICAgICBPYmplY3ROYW1lIGRuYW1lID0gbmV3IE9iamVjdE5hbWUoZGF0YWJhc2VOYW1lKTsKKyAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKGRuYW1lLCAic2F2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0WzBdLCBuZXcgU3RyaW5nWzBdKTsKKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXZlIiksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2F2ZSIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2NlZWQgdG8gdGhlIGxpc3QgZ3JvdXBzIHNjcmVlbgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkdyb3VwcyBMaXN0IFNldHVwIikpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9EZWxldGVSb2xlc0FjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0RlbGV0ZVJvbGVzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlYzc1ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9EZWxldGVSb2xlc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5BY3Rpb248L3N0cm9uZz4gdGhhdCBkZWxldGVzIHRoZQorICogc3BlY2lmaWVkIHNldCBvZiByb2xlcy48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBEZWxldGVSb2xlc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIEhhcyB0aGlzIHRyYW5zYWN0aW9uIGJlZW4gY2FuY2VsbGVkPworICAgICAgICBpZiAoaXNDYW5jZWxsZWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiTGlzdCBSb2xlcyBTZXR1cCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoZSB0cmFuc2FjdGlvbiB0b2tlbgorICAgICAgICBpZiAoIWlzVG9rZW5WYWxpZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnRva2VuIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYW55IGV4dHJhIHZhbGlkYXRpb24gdGhhdCBpcyByZXF1aXJlZAorICAgICAgICBSb2xlc0Zvcm0gcm9sZXNGb3JtID0gKFJvbGVzRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSA9IHJvbGVzRm9ybS5nZXREYXRhYmFzZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHJvbGVzW10gPSByb2xlc0Zvcm0uZ2V0Um9sZXMoKTsKKyAgICAgICAgaWYgKHJvbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJvbGVzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gIkRlbGV0ZSBSb2xlIiB0cmFuc2FjdGlvbnMgYXMgcmVxdWlyZWQKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSBkbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRhdGFiYXNlTmFtZSk7CisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdID0gbmV3IFN0cmluZ1sxXTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb2xlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShyb2xlc1tpXSk7CisgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoInJvbGVuYW1lIik7CisgICAgICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZG5hbWUsICJyZW1vdmVSb2xlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlUm9sZSIpLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW92ZVJvbGUiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBTYXZlIHRoZSB1cGRhdGVkIGRhdGFiYXNlIGluZm9ybWF0aW9uCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgZG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkYXRhYmFzZU5hbWUpOworICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZG5hbWUsICJzYXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbMF0sIG5ldyBTdHJpbmdbMF0pOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhdmUiKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXZlIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VlZCB0byB0aGUgbGlzdCByb2xlcyBzY3JlZW4KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJSb2xlcyBMaXN0IFNldHVwIikpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9EZWxldGVVc2Vyc0FjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0RlbGV0ZVVzZXJzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3ZTVjZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9EZWxldGVVc2Vyc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5BY3Rpb248L3N0cm9uZz4gdGhhdCBkZWxldGVzIHRoZQorICogc3BlY2lmaWVkIHNldCBvZiB1c2Vycy48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBEZWxldGVVc2Vyc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIEhhcyB0aGlzIHRyYW5zYWN0aW9uIGJlZW4gY2FuY2VsbGVkPworICAgICAgICBpZiAoaXNDYW5jZWxsZWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiTGlzdCBVc2VycyBTZXR1cCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoZSB0cmFuc2FjdGlvbiB0b2tlbgorICAgICAgICBpZiAoIWlzVG9rZW5WYWxpZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnRva2VuIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYW55IGV4dHJhIHZhbGlkYXRpb24gdGhhdCBpcyByZXF1aXJlZAorICAgICAgICBVc2Vyc0Zvcm0gdXNlcnNGb3JtID0gKFVzZXJzRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSA9IHVzZXJzRm9ybS5nZXREYXRhYmFzZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHVzZXJzW10gPSB1c2Vyc0Zvcm0uZ2V0VXNlcnMoKTsKKyAgICAgICAgaWYgKHVzZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHVzZXJzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gIkRlbGV0ZSBVc2VyIiB0cmFuc2FjdGlvbnMgYXMgcmVxdWlyZWQKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSBkbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRhdGFiYXNlTmFtZSk7CisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdID0gbmV3IFN0cmluZ1sxXTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1c2Vycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZSh1c2Vyc1tpXSk7CisgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gT2JqZWN0TmFtZS51bnF1b3RlKG9uYW1lLmdldEtleVByb3BlcnR5KCJ1c2VybmFtZSIpKTsKKyAgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZShkbmFtZSwgInJlbW92ZVVzZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgc2lnbmF0dXJlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVVc2VyIiksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlVXNlciIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgZGF0YWJhc2UgaW5mb3JtYXRpb24KKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSBkbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRhdGFiYXNlTmFtZSk7CisgICAgICAgICAgICBtc2VydmVyLmludm9rZShkbmFtZSwgInNhdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFswXSwgbmV3IFN0cmluZ1swXSk7CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2F2ZSIpLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhdmUiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZWVkIHRvIHRoZSBsaXN0IHVzZXJzIHNjcmVlbgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlVzZXJzIExpc3QgU2V0dXAiKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0dyb3VwRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0dyb3VwRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNjU4YzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvR3JvdXBGb3JtLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgaW5kaXZpZHVhbCBncm91cCBwYWdlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgR3JvdXBGb3JtIGV4dGVuZHMgQmFzZUZvcm0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGdyb3VwLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBncm91cG5hbWUgb2YgdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBncm91cG5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRHcm91cG5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5ncm91cG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwbmFtZShTdHJpbmcgZ3JvdXBuYW1lKSB7CisgICAgICAgIHRoaXMuZ3JvdXBuYW1lID0gZ3JvdXBuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuIE5hbWVzIG9mIHRoZSByb2xlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByb2xlc1tdID0gbmV3IFN0cmluZ1swXTsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRSb2xlcygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnJvbGVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xlcyhTdHJpbmcgcm9sZXNbXSkgeworICAgICAgICBpZiAocm9sZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcm9sZXMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisgICAgICAgIHRoaXMucm9sZXMgPSByb2xlczsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOworICAgICAgICBkZXNjcmlwdGlvbiA9IG51bGw7CisgICAgICAgIGdyb3VwbmFtZSA9IG51bGw7CisgICAgICAgIHJvbGVzID0gbmV3IFN0cmluZ1swXTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IGZyb20gdGhpcyBIVFRQIHJlcXVlc3QsCisgICAgICogYW5kIHJldHVybiBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbnkKKyAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBmb3VuZC4gIElmIG5vIGVycm9ycyBhcmUgZm91bmQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHdpdGggbm8KKyAgICAgKiByZWNvcmRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICAvLyBTZXQgdXAgYmVhbnMgY29udGFpbmluZyBhbGwgcG9zc2libGUgZ3JvdXBzIGFuZCByb2xlcworICAgICAgICAgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSA9CisgICAgICAgICAgICAgICAgVVJMRGVjb2Rlci5kZWNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGFiYXNlTmFtZSIpLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgicm9sZXNGb3JtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJVdGlscy5nZXRSb2xlc0Zvcm0obXNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VOYW1lKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nIHNpbmNlIHRoZSBmb3JtIHJldHVybnMgdmFsaWRhdGlvbiBlcnJvcgorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBBY3Rpb25FcnJvcnMgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworCisgICAgICAgIC8vIGdyb3VwbmFtZSBpcyBhIHJlcXVpcmVkIGZpZWxkCisgICAgICAgIGlmICgoZ3JvdXBuYW1lID09IG51bGwpIHx8IChncm91cG5hbWUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgiZ3JvdXBuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoInVzZXJzLmVycm9yLmdyb3VwbmFtZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFF1b3RlcyBub3QgYWxsb3dlZCBpbiBncm91cG5hbWUKKyAgICAgICAgaWYgKChncm91cG5hbWUgIT0gbnVsbCkgJiYgKGdyb3VwbmFtZS5pbmRleE9mKCciJykgPj0gMCkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoImdyb3VwbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJ1c2Vycy5lcnJvci5xdW90ZXMiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBRdW90ZXMgbm90IGFsbG93ZWQgaW4gZGVzY3JpcHRpb24KKyAgICAgICAgaWYgKChkZXNjcmlwdGlvbiAhPSBudWxsKSAmJiAoZGVzY3JpcHRpb24uaW5kZXhPZignIicpID4gMCkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoInVzZXJzLmVycm9yLnF1b3RlcyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoZXJyb3JzKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvR3JvdXBzRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0dyb3Vwc0Zvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2QyMjdkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0dyb3Vwc0Zvcm0uamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGRlbGV0ZSBncm91cHMgcGFnZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEdyb3Vwc0Zvcm0gZXh0ZW5kcyBCYXNlRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lcyBvZiB0aGUgc3BlY2lmaWVkIGdyb3Vwcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBncm91cHNbXSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0R3JvdXBzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZ3JvdXBzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHcm91cHMoU3RyaW5nIGdyb3Vwc1tdKSB7CisgICAgICAgIHRoaXMuZ3JvdXBzID0gZ3JvdXBzOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7CisgICAgICAgIHRoaXMuZ3JvdXBzID0gbnVsbDsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvTGlzdEdyb3Vwc0FjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0xpc3RHcm91cHNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2FkZTRjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0xpc3RHcm91cHNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CisKKy8qKgorICogPHA+UmV0cmlldmUgdGhlIHNldCBvZiBNQmVhbiBuYW1lcyBmb3IgYWxsIGN1cnJlbnRseSBkZWZpbmVkIGdyb3VwcywKKyAqIGFuZCBleHBvc2UgdGhlbSBpbiBhIHJlcXVlc3QgYXR0cmlidXRlIG5hbWVkICJncm91cHNGb3JtIi4gIFRoaXMgYWN0aW9uCisgKiByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHJlcXVlc3QgcGFyYW1ldGVycyB0byBiZSBzZXQ6PC9wPgorICogPHVsPgorICogPGxpPjxzdHJvbmc+ZGF0YWJhc2VOYW1lPC9zdHJvbmc+IC0gT2JqZWN0IG5hbWUgb2YgdGhlIFVzZXJEYXRhYmFzZQorICogICAgIE1CZWFuIGZyb20gd2hpY2ggd2Ugc2hvdWxkIHJldHJpZXZlIHRoZSBncm91cHMgbGlzdC48L2xpPgorICogPGxpPjxzdHJvbmc+Zm9yd2FyZDwvc3Ryb25nPiAtIEdsb2JhbCBmb3J3YXJkIHRvIHdoaWNoIHdlIHNob3VsZAorICogICAgIGdvIGFmdGVyIHN0YXNoaW5nIHRoZSBncm91cHMgbGlzdC48L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIExpc3RHcm91cHNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIENyZWF0ZSBhIGZvcm0gYmVhbiBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQgTUJlYW4gTmFtZXMKKyAgICAgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSA9CisgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZGF0YWJhc2VOYW1lIiksVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKTsKKyAgICAgICAgR3JvdXBzRm9ybSBncm91cHNGb3JtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdyb3Vwc0Zvcm0gPSBVc2VyVXRpbHMuZ2V0R3JvdXBzRm9ybShtc2VydmVyLCBkYXRhYmFzZU5hbWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZyhyZXNvdXJjZXMuZ2V0TWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCAiZ3JvdXBzIiksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZQorICAgICAgICAgICAgICAgICAobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsICJncm91cHMiKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXNoIHRoZSByZXN1bHRzIGluIHJlcXVlc3Qgc2NvcGUKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoImdyb3Vwc0Zvcm0iLCBncm91cHNGb3JtKTsKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICBTdHJpbmcgZm9yd2FyZCA9CisgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZm9yd2FyZCIpLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZChmb3J3YXJkKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9MaXN0Um9sZXNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9MaXN0Um9sZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjAyMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0xpc3RSb2xlc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKKworLyoqCisgKiA8cD5SZXRyaWV2ZSB0aGUgc2V0IG9mIE1CZWFuIG5hbWVzIGZvciBhbGwgY3VycmVudGx5IGRlZmluZWQgcm9sZXMsCisgKiBhbmQgZXhwb3NlIHRoZW0gaW4gYSByZXF1ZXN0IGF0dHJpYnV0ZSBuYW1lZCAicm9sZXNGb3JtIi4gIFRoaXMgYWN0aW9uCisgKiByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHJlcXVlc3QgcGFyYW1ldGVycyB0byBiZSBzZXQ6PC9wPgorICogPHVsPgorICogPGxpPjxzdHJvbmc+ZGF0YWJhc2VOYW1lPC9zdHJvbmc+IC0gT2JqZWN0IG5hbWUgb2YgdGhlIFVzZXJEYXRhYmFzZQorICogICAgIE1CZWFuIGZyb20gd2hpY2ggd2Ugc2hvdWxkIHJldHJpZXZlIHRoZSByb2xlcyBsaXN0LjwvbGk+CisgKiA8bGk+PHN0cm9uZz5mb3J3YXJkPC9zdHJvbmc+IC0gR2xvYmFsIGZvcndhcmQgdG8gd2hpY2ggd2Ugc2hvdWxkCisgKiAgICAgZ28gYWZ0ZXIgc3Rhc2hpbmcgdGhlIHJvbGVzIGxpc3QuPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBjbGFzcyBMaXN0Um9sZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisKKyAgICAgICAgLy8gQ3JlYXRlIGEgZm9ybSBiZWFuIGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBNQmVhbiBOYW1lcworICAgICAgICBTdHJpbmcgZGF0YWJhc2VOYW1lID0KKyAgICAgICAgICAgIFVSTERlY29kZXIuZGVjb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpOworICAgICAgICBSb2xlc0Zvcm0gcm9sZXNGb3JtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJvbGVzRm9ybSA9IFVzZXJVdGlscy5nZXRSb2xlc0Zvcm0obXNlcnZlciwgZGF0YWJhc2VOYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cocmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgInJvbGVzIiksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZQorICAgICAgICAgICAgICAgICAobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsICJyb2xlcyIpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3Rhc2ggdGhlIHJlc3VsdHMgaW4gcmVxdWVzdCBzY29wZQorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgicm9sZXNGb3JtIiwgcm9sZXNGb3JtKTsKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICBTdHJpbmcgZm9yd2FyZCA9CisgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZm9yd2FyZCIpLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZChmb3J3YXJkKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9MaXN0VXNlcnNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9MaXN0VXNlcnNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTVmYTk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0xpc3RVc2Vyc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKKworLyoqCisgKiA8cD5SZXRyaWV2ZSB0aGUgc2V0IG9mIE1CZWFuIG5hbWVzIGZvciBhbGwgY3VycmVudGx5IGRlZmluZWQgdXNlcnMsCisgKiBhbmQgZXhwb3NlIHRoZW0gaW4gYSByZXF1ZXN0IGF0dHJpYnV0ZSBuYW1lZCAidXNlcnNGb3JtIi4gIFRoaXMgYWN0aW9uCisgKiByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHJlcXVlc3QgcGFyYW1ldGVycyB0byBiZSBzZXQ6PC9wPgorICogPHVsPgorICogPGxpPjxzdHJvbmc+ZGF0YWJhc2VOYW1lPC9zdHJvbmc+IC0gT2JqZWN0IG5hbWUgb2YgdGhlIFVzZXJEYXRhYmFzZQorICogICAgIE1CZWFuIGZyb20gd2hpY2ggd2Ugc2hvdWxkIHJldHJpZXZlIHRoZSB1c2VycyBsaXN0LjwvbGk+CisgKiA8bGk+PHN0cm9uZz5mb3J3YXJkPC9zdHJvbmc+IC0gR2xvYmFsIGZvcndhcmQgdG8gd2hpY2ggd2Ugc2hvdWxkCisgKiAgICAgZ28gYWZ0ZXIgc3Rhc2hpbmcgdGhlIHVzZXJzIGxpc3QuPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBjbGFzcyBMaXN0VXNlcnNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisKKyAgICAgICAgLy8gQ3JlYXRlIGEgZm9ybSBiZWFuIGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBNQmVhbiBOYW1lcworICAgICAgICBTdHJpbmcgZGF0YWJhc2VOYW1lID0KKyAgICAgICAgICAgIFVSTERlY29kZXIuZGVjb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpOworICAgICAgICBVc2Vyc0Zvcm0gdXNlcnNGb3JtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVzZXJzRm9ybSA9IFVzZXJVdGlscy5nZXRVc2Vyc0Zvcm0obXNlcnZlciwgZGF0YWJhc2VOYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cocmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgInVzZXJzIiksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZQorICAgICAgICAgICAgICAgICAobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsICJ1c2VycyIpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3Rhc2ggdGhlIHJlc3VsdHMgaW4gcmVxdWVzdCBzY29wZQorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgidXNlcnNGb3JtIiwgdXNlcnNGb3JtKTsKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICBTdHJpbmcgZm9yd2FyZCA9CisgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZm9yd2FyZCIpLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZChmb3J3YXJkKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Sb2xlRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1JvbGVGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4NzUyMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Sb2xlRm9ybS5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NZXNzYWdlOworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgaW5kaXZpZHVhbCByb2xlIHBhZ2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSb2xlRm9ybSBleHRlbmRzIEJhc2VGb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhpcyByb2xlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSByb2xlbmFtZSBvZiB0aGlzIHJvbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcm9sZW5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRSb2xlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnJvbGVuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xlbmFtZShTdHJpbmcgcm9sZW5hbWUpIHsKKyAgICAgICAgdGhpcy5yb2xlbmFtZSA9IHJvbGVuYW1lOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7CisgICAgICAgIGRlc2NyaXB0aW9uID0gbnVsbDsKKyAgICAgICAgcm9sZW5hbWUgPSBudWxsOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisKKyAgICAgICAgLy8gcm9sZW5hbWUgaXMgYSByZXF1aXJlZCBmaWVsZAorICAgICAgICBpZiAoKHJvbGVuYW1lID09IG51bGwpIHx8IChyb2xlbmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJyb2xlbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJ1c2Vycy5lcnJvci5yb2xlbmFtZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFF1b3RlcyBub3QgYWxsb3dlZCBpbiByb2xlbmFtZQorICAgICAgICBpZiAoKHJvbGVuYW1lICE9IG51bGwpICYmIChyb2xlbmFtZS5pbmRleE9mKCciJykgPj0gMCkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoInJvbGVuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoInVzZXJzLmVycm9yLnF1b3RlcyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFF1b3RlcyBub3QgYWxsb3dlZCBpbiBkZXNjcmlwdGlvbgorICAgICAgICBpZiAoKGRlc2NyaXB0aW9uICE9IG51bGwpICYmIChkZXNjcmlwdGlvbi5pbmRleE9mKCciJykgPiAwKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgiZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgidXNlcnMuZXJyb3IucXVvdGVzIikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChlcnJvcnMpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Sb2xlc0Zvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Sb2xlc0Zvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDBjOWIzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1JvbGVzRm9ybS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgZGVsZXRlIHJvbGVzIHBhZ2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSb2xlc0Zvcm0gZXh0ZW5kcyBCYXNlRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lcyBvZiB0aGUgc3BlY2lmaWVkIHJvbGVzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJvbGVzW10gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJvbGVzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucm9sZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVzKFN0cmluZyByb2xlc1tdKSB7CisgICAgICAgIHRoaXMucm9sZXMgPSByb2xlczsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOworICAgICAgICB0aGlzLnJvbGVzID0gbnVsbDsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvU2F2ZUdyb3VwQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvU2F2ZUdyb3VwQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNjMmM1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9TYXZlR3JvdXBBY3Rpb24uamF2YQpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgc2F2ZXMgYSBuZXcgb3IKKyAqIHVwZGF0ZWQgR3JvdXAgYmFjayB0byB0aGUgdW5kZXJseWluZyBkYXRhYmFzZS48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYXZlR3JvdXBBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKworICAgICAgICAvLyBIYXMgdGhpcyB0cmFuc2FjdGlvbiBiZWVuIGNhbmNlbGxlZD8KKyAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkxpc3QgUm9sZXMgU2V0dXAiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGUgdHJhbnNhY3Rpb24gdG9rZW4KKyAgICAgICAgaWYgKCFpc1Rva2VuVmFsaWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci50b2tlbiIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGFueSBleHRyYSB2YWxpZGF0aW9uIHRoYXQgaXMgcmVxdWlyZWQKKyAgICAgICAgR3JvdXBGb3JtIGdyb3VwRm9ybSA9IChHcm91cEZvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBkYXRhYmFzZU5hbWUgPQorICAgICAgICAgICAgVVJMRGVjb2Rlci5kZWNvZGUoZ3JvdXBGb3JtLmdldERhdGFiYXNlTmFtZSgpLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gZ3JvdXBGb3JtLmdldE9iamVjdE5hbWUoKTsKKworICAgICAgICAvLyBQZXJmb3JtIGFuICJBZGQgR3JvdXAiIHRyYW5zYWN0aW9uCisgICAgICAgIGlmIChvYmplY3ROYW1lID09IG51bGwpIHsKKworICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZVtdID0gbmV3IFN0cmluZ1syXTsKKyAgICAgICAgICAgIHNpZ25hdHVyZVswXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICAgICAgICAgIHNpZ25hdHVyZVsxXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKworICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdID0gbmV3IE9iamVjdFsyXTsKKyAgICAgICAgICAgIHBhcmFtc1swXSA9IGdyb3VwRm9ybS5nZXRHcm91cG5hbWUoKTsKKyAgICAgICAgICAgIHBhcmFtc1sxXSA9IGdyb3VwRm9ybS5nZXREZXNjcmlwdGlvbigpOworCisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgTUJlYW4gTmFtZSBmb3Igb3VyIFVzZXJEYXRhYmFzZQorICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoZGF0YWJhc2VOYW1lKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IG9iamVjdCBhbmQgYXNzb2NpYXRlZCBNQmVhbgorICAgICAgICAgICAgICAgIG9iamVjdE5hbWUgPSAoU3RyaW5nKSBtc2VydmVyLmludm9rZShvbmFtZSwgImNyZWF0ZUdyb3VwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBzaWduYXR1cmUpOworCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcmVhdGVHcm91cCIpLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcmVhdGVHcm91cCIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGFuICJVcGRhdGUgR3JvdXAiIHRyYW5zYWN0aW9uCisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0IGFuIG9iamVjdCBuYW1lIGZvciB0aGlzIG9iamVjdAorICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUob2JqZWN0TmFtZSk7CisKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNwZWNpZmllZCByb2xlCisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gImRlc2NyaXB0aW9uIjsKKyAgICAgICAgICAgICAgICBtc2VydmVyLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgZ3JvdXBGb3JtLmdldERlc2NyaXB0aW9uKCkpKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworCisgICAgICAgIC8vIFJlc2V0IHRoZSByb2xlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBncm91cAorICAgICAgICB0cnkgeworCisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUob2JqZWN0TmFtZSk7CisgICAgICAgICAgICBtc2VydmVyLmludm9rZShvbmFtZSwgInJlbW92ZVJvbGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbMF0sIG5ldyBTdHJpbmdbMF0pOworICAgICAgICAgICAgU3RyaW5nIHJvbGVzW10gPSBncm91cEZvcm0uZ2V0Um9sZXMoKTsKKyAgICAgICAgICAgIGlmIChyb2xlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcm9sZXMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGFkZHNpZ1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIGFkZHNpZ1swXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICAgICAgICAgIE9iamVjdCBhZGRwYXJbXSA9IG5ldyBPYmplY3RbMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYWRkcGFyWzBdID0KKyAgICAgICAgICAgICAgICAgICAgKG5ldyBPYmplY3ROYW1lKHJvbGVzW2ldKSkuZ2V0S2V5UHJvcGVydHkoInJvbGVuYW1lIik7CisgICAgICAgICAgICAgICAgbXNlcnZlci5pbnZva2Uob25hbWUsICJhZGRSb2xlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRwYXIsIGFkZHNpZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkUm9sZSIpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFJvbGUiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBTYXZlIHRoZSB1cGRhdGVkIGRhdGFiYXNlIGluZm9ybWF0aW9uCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgZG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkYXRhYmFzZU5hbWUpOworICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZG5hbWUsICJzYXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbMF0sIG5ldyBTdHJpbmdbMF0pOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhdmUiKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXZlIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VlZCB0byB0aGUgbGlzdCByb2xlcyBzY3JlZW4KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJHcm91cHMgTGlzdCBTZXR1cCIpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvU2F2ZVJvbGVBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9TYXZlUm9sZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ODM3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvU2F2ZVJvbGVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgc2F2ZXMgYSBuZXcgb3IKKyAqIHVwZGF0ZWQgUm9sZSBiYWNrIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVSb2xlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtc2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gSGFzIHRoaXMgdHJhbnNhY3Rpb24gYmVlbiBjYW5jZWxsZWQ/CisgICAgICAgIGlmIChpc0NhbmNlbGxlZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJMaXN0IFJvbGVzIFNldHVwIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHRva2VuCisgICAgICAgIGlmICghaXNUb2tlblZhbGlkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IudG9rZW4iKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbnkgZXh0cmEgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkCisgICAgICAgIFJvbGVGb3JtIHJvbGVGb3JtID0gKFJvbGVGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgZGF0YWJhc2VOYW1lID0KKyAgICAgICAgICAgIFVSTERlY29kZXIuZGVjb2RlKHJvbGVGb3JtLmdldERhdGFiYXNlTmFtZSgpLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gcm9sZUZvcm0uZ2V0T2JqZWN0TmFtZSgpOworCisgICAgICAgIC8vIFBlcmZvcm0gYW4gIkFkZCBSb2xlIiB0cmFuc2FjdGlvbgorICAgICAgICBpZiAob2JqZWN0TmFtZSA9PSBudWxsKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmVbXSA9IG5ldyBTdHJpbmdbMl07CisgICAgICAgICAgICBzaWduYXR1cmVbMF0gPSAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgICAgICBzaWduYXR1cmVbMV0gPSAiamF2YS5sYW5nLlN0cmluZyI7CisKKyAgICAgICAgICAgIE9iamVjdCBwYXJhbXNbXSA9IG5ldyBPYmplY3RbMl07CisgICAgICAgICAgICBwYXJhbXNbMF0gPSByb2xlRm9ybS5nZXRSb2xlbmFtZSgpOworICAgICAgICAgICAgcGFyYW1zWzFdID0gcm9sZUZvcm0uZ2V0RGVzY3JpcHRpb24oKTsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIE1CZWFuIE5hbWUgZm9yIG91ciBVc2VyRGF0YWJhc2UKKyAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRhdGFiYXNlTmFtZSk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG5ldyBvYmplY3QgYW5kIGFzc29jaWF0ZWQgTUJlYW4KKyAgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZShvbmFtZSwgImNyZWF0ZVJvbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgc2lnbmF0dXJlKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JlYXRlUm9sZSIpLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcmVhdGVSb2xlIikpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYW4gIlVwZGF0ZSBSb2xlIiB0cmFuc2FjdGlvbgorICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCBhbiBvYmplY3QgbmFtZSBmb3IgdGhpcyBvYmplY3QKKyAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworCisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzcGVjaWZpZWQgcm9sZQorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkZXNjcmlwdGlvbiI7CisgICAgICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgKG9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHJvbGVGb3JtLmdldERlc2NyaXB0aW9uKCkpKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBTYXZlIHRoZSB1cGRhdGVkIGRhdGFiYXNlIGluZm9ybWF0aW9uCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgZG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkYXRhYmFzZU5hbWUpOworICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZG5hbWUsICJzYXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbMF0sIG5ldyBTdHJpbmdbMF0pOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhdmUiKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXZlIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VlZCB0byB0aGUgbGlzdCByb2xlcyBzY3JlZW4KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJSb2xlcyBMaXN0IFNldHVwIikpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9TYXZlVXNlckFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1NhdmVVc2VyQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjZjcxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9TYXZlVXNlckFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNhdmVzIGEgbmV3IG9yCisgKiB1cGRhdGVkIFVzZXIgYmFjayB0byB0aGUgdW5kZXJseWluZyBkYXRhYmFzZS48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYXZlVXNlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIEhhcyB0aGlzIHRyYW5zYWN0aW9uIGJlZW4gY2FuY2VsbGVkPworICAgICAgICBpZiAoaXNDYW5jZWxsZWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiTGlzdCBVc2VycyBTZXR1cCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoZSB0cmFuc2FjdGlvbiB0b2tlbgorICAgICAgICBpZiAoIWlzVG9rZW5WYWxpZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnRva2VuIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYW55IGV4dHJhIHZhbGlkYXRpb24gdGhhdCBpcyByZXF1aXJlZAorICAgICAgICBVc2VyRm9ybSB1c2VyRm9ybSA9IChVc2VyRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSA9CisgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZSh1c2VyRm9ybS5nZXREYXRhYmFzZU5hbWUoKSxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpOworICAgICAgICBTdHJpbmcgb2JqZWN0TmFtZSA9IHVzZXJGb3JtLmdldE9iamVjdE5hbWUoKTsKKworICAgICAgICAvLyBQZXJmb3JtIGFuICJBZGQgVXNlciIgdHJhbnNhY3Rpb24KKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworCisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzNdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgc2lnbmF0dXJlWzFdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgc2lnbmF0dXJlWzJdID0gImphdmEubGFuZy5TdHJpbmciOworCisgICAgICAgICAgICBPYmplY3QgcGFyYW1zW10gPSBuZXcgT2JqZWN0WzNdOworICAgICAgICAgICAgcGFyYW1zWzBdID0gdXNlckZvcm0uZ2V0VXNlcm5hbWUoKTsKKyAgICAgICAgICAgIHBhcmFtc1sxXSA9IHVzZXJGb3JtLmdldFBhc3N3b3JkKCk7CisgICAgICAgICAgICBwYXJhbXNbMl0gPSB1c2VyRm9ybS5nZXRGdWxsTmFtZSgpOworCisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgTUJlYW4gTmFtZSBmb3Igb3VyIFVzZXJEYXRhYmFzZQorICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoZGF0YWJhc2VOYW1lKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IG9iamVjdCBhbmQgYXNzb2NpYXRlZCBNQmVhbgorICAgICAgICAgICAgICAgIG9iamVjdE5hbWUgPSAoU3RyaW5nKSBtc2VydmVyLmludm9rZShvbmFtZSwgImNyZWF0ZVVzZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHNpZ25hdHVyZSk7CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyZWF0ZVVzZXIiKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JlYXRlVXNlciIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGFuICJVcGRhdGUgVXNlciIgdHJhbnNhY3Rpb24KKyAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgYW4gb2JqZWN0IG5hbWUgZm9yIHRoaXMgb2JqZWN0CisgICAgICAgICAgICAgICAgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc3BlY2lmaWVkIHVzZXIKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZnVsbE5hbWUiOworICAgICAgICAgICAgICAgIG1zZXJ2ZXIuc2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgIChvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCB1c2VyRm9ybS5nZXRGdWxsTmFtZSgpKSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gInBhc3N3b3JkIjsKKyAgICAgICAgICAgICAgICBtc2VydmVyLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgdXNlckZvcm0uZ2V0UGFzc3dvcmQoKSkpOworCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2V0LmF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2V0LmF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc2V0IHRoZSBncm91cHMgdGhpcyB1c2VyIGlzIGEgbWVtYmVyIG9mCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKyAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKG9uYW1lLCAicmVtb3ZlR3JvdXBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbMF0sIG5ldyBTdHJpbmdbMF0pOworICAgICAgICAgICAgU3RyaW5nIGdyb3Vwc1tdID0gdXNlckZvcm0uZ2V0R3JvdXBzKCk7CisgICAgICAgICAgICBpZiAoZ3JvdXBzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBncm91cHMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGFkZHNpZ1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIGFkZHNpZ1swXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICAgICAgICAgIE9iamVjdCBhZGRwYXJbXSA9IG5ldyBPYmplY3RbMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGFkZHBhclswXSA9IE9iamVjdE5hbWUudW5xdW90ZSgKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBPYmplY3ROYW1lKGdyb3Vwc1tpXSkpLmdldEtleVByb3BlcnR5KCJncm91cG5hbWUiKSk7CisgICAgICAgICAgICAgICAgbXNlcnZlci5pbnZva2Uob25hbWUsICJhZGRHcm91cCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcGFyLCBhZGRzaWcpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZEdyb3VwIiksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkR3JvdXAiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNldCB0aGUgcm9sZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdXNlcgorICAgICAgICB0cnkgeworCisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUob2JqZWN0TmFtZSk7CisgICAgICAgICAgICBtc2VydmVyLmludm9rZShvbmFtZSwgInJlbW92ZVJvbGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbMF0sIG5ldyBTdHJpbmdbMF0pOworICAgICAgICAgICAgU3RyaW5nIHJvbGVzW10gPSB1c2VyRm9ybS5nZXRSb2xlcygpOworICAgICAgICAgICAgaWYgKHJvbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByb2xlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgYWRkc2lnW10gPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgYWRkc2lnWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgT2JqZWN0IGFkZHBhcltdID0gbmV3IE9iamVjdFsxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZGRwYXJbMF0gPQorICAgICAgICAgICAgICAgICAgICAobmV3IE9iamVjdE5hbWUocm9sZXNbaV0pKS5nZXRLZXlQcm9wZXJ0eSgicm9sZW5hbWUiKTsKKyAgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZShvbmFtZSwgImFkZFJvbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHBhciwgYWRkc2lnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRSb2xlIiksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkUm9sZSIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgZGF0YWJhc2UgaW5mb3JtYXRpb24KKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSBkbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRhdGFiYXNlTmFtZSk7CisgICAgICAgICAgICBtc2VydmVyLmludm9rZShkbmFtZSwgInNhdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFswXSwgbmV3IFN0cmluZ1swXSk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2F2ZSIpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhdmUiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZWVkIHRvIHRoZSBsaXN0IHJvbGVzIHNjcmVlbgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlVzZXJzIExpc3QgU2V0dXAiKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1NldFVwR3JvdXBBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9TZXRVcEdyb3VwQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5NmFkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9TZXRVcEdyb3VwQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgc2V0cyB1cCBhbmQgc3Rhc2hlcworICogYSA8Y29kZT5Hcm91cEZvcm08L2NvZGU+IGJlYW4gaW4gcmVxdWVzdCBzY29wZS4gIFRoZSBmb3JtIGJlYW4gd2lsbCBoYXZlCisgKiBhIG51bGwgPGNvZGU+b2JqZWN0TmFtZTwvY29kZT4gcHJvcGVydHkgaWYgdGhpcyBmb3JtIHJlcHJlc2VudHMgYSBncm91cAorICogYmVpbmcgYWRkZWQsIG9yIGEgbm9uLW51bGwgdmFsdWUgZm9yIGFuIGV4aXN0aW5nIGdyb3VwLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNldFVwR3JvdXBBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKworICAgICAgICAvLyBTZXQgdXAgYSBiZWFuIGNvbnRhaW5pbmcgYWxsIHBvc3NpYmxlIHJvbGVzCisgICAgICAgIFN0cmluZyBkYXRhYmFzZU5hbWUgPQorICAgICAgICAgICAgVVJMRGVjb2Rlci5kZWNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGFiYXNlTmFtZSIpLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgicm9sZXNGb3JtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJVdGlscy5nZXRSb2xlc0Zvcm0obXNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VOYW1lKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm9sZXMiKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgIChsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgInJvbGVzIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB1cCB0aGUgZm9ybSBiZWFuIGJhc2VkIG9uIHRoZSBjcmVhdGluZyBvciBlZGl0aW5nIHN0YXRlCisgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm9iamVjdE5hbWUiKTsKKyAgICAgICAgR3JvdXBGb3JtIGdyb3VwRm9ybSA9IG5ldyBHcm91cEZvcm0oKTsKKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgZ3JvdXBGb3JtLnNldE5vZGVMYWJlbAorICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5ncm91cC5uZXdHcm91cCIpKTsKKyAgICAgICAgICAgIGdyb3VwRm9ybS5zZXRPYmplY3ROYW1lKG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ3JvdXBGb3JtLnNldE5vZGVMYWJlbAorICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5ncm91cC5vbGRHcm91cCIpKTsKKyAgICAgICAgICAgIGdyb3VwRm9ybS5zZXRPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZ3JvdXBuYW1lIjsKKyAgICAgICAgICAgICAgICBncm91cEZvcm0uc2V0R3JvdXBuYW1lCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gImRlc2NyaXB0aW9uIjsKKyAgICAgICAgICAgICAgICBncm91cEZvcm0uc2V0RGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicm9sZXMiOworICAgICAgICAgICAgICAgIGdyb3VwRm9ybS5zZXRSb2xlcworICAgICAgICAgICAgICAgICAgICAoKFN0cmluZ1tdKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdyb3VwRm9ybS5zZXREYXRhYmFzZU5hbWUoZGF0YWJhc2VOYW1lKTsKKworICAgICAgICAvLyBTdGFzaCB0aGUgZm9ybSBiZWFuIGFuZCBmb3J3YXJkIHRvIHRoZSBkaXNwbGF5IHBhZ2UKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiZ3JvdXBGb3JtIiwgZ3JvdXBGb3JtKTsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJHcm91cCIpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1NldFVwUm9sZUFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1NldFVwUm9sZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YjljMTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvU2V0VXBSb2xlQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNldHMgdXAgYW5kIHN0YXNoZXMKKyAqIGEgPGNvZGU+Um9sZUZvcm08L2NvZGU+IGJlYW4gaW4gcmVxdWVzdCBzY29wZS4gIFRoZSBmb3JtIGJlYW4gd2lsbCBoYXZlCisgKiBhIG51bGwgPGNvZGU+b2JqZWN0TmFtZTwvY29kZT4gcHJvcGVydHkgaWYgdGhpcyBmb3JtIHJlcHJlc2VudHMgYSByb2xlCisgKiBiZWluZyBhZGRlZCwgb3IgYSBub24tbnVsbCB2YWx1ZSBmb3IgYW4gZXhpc3Rpbmcgcm9sZS48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXRVcFJvbGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSA9CisgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZGF0YWJhc2VOYW1lIiksVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKTsKKworICAgICAgICAvLyBTZXQgdXAgdGhlIGZvcm0gYmVhbiBiYXNlZCBvbiB0aGUgY3JlYXRpbmcgb3IgZWRpdGluZyBzdGF0ZQorICAgICAgICBTdHJpbmcgb2JqZWN0TmFtZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJvYmplY3ROYW1lIik7CisgICAgICAgIFJvbGVGb3JtIHJvbGVGb3JtID0gbmV3IFJvbGVGb3JtKCk7CisgICAgICAgIGlmIChvYmplY3ROYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHJvbGVGb3JtLnNldE5vZGVMYWJlbAorICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5yb2xlLm5ld1JvbGUiKSk7CisgICAgICAgICAgICByb2xlRm9ybS5zZXRPYmplY3ROYW1lKG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcm9sZUZvcm0uc2V0Tm9kZUxhYmVsCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLnJvbGUub2xkUm9sZSIpKTsKKyAgICAgICAgICAgIHJvbGVGb3JtLnNldE9iamVjdE5hbWUob2JqZWN0TmFtZSk7CisgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJyb2xlbmFtZSI7CisgICAgICAgICAgICAgICAgcm9sZUZvcm0uc2V0Um9sZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZGVzY3JpcHRpb24iOworICAgICAgICAgICAgICAgIHJvbGVGb3JtLnNldERlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJvbGVGb3JtLnNldERhdGFiYXNlTmFtZShkYXRhYmFzZU5hbWUpOworCisgICAgICAgIC8vIFN0YXNoIHRoZSBmb3JtIGJlYW4gYW5kIGZvcndhcmQgdG8gdGhlIGRpc3BsYXkgcGFnZQorICAgICAgICBzYXZlVG9rZW4ocmVxdWVzdCk7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJyb2xlRm9ybSIsIHJvbGVGb3JtKTsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJSb2xlIikpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvU2V0VXBVc2VyQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvU2V0VXBVc2VyQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0YmFmMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9TZXRVcFVzZXJBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgc2V0cyB1cCBhbmQgc3Rhc2hlcworICogYSA8Y29kZT5Vc2VyRm9ybTwvY29kZT4gYmVhbiBpbiByZXF1ZXN0IHNjb3BlLiAgVGhlIGZvcm0gYmVhbiB3aWxsIGhhdmUKKyAqIGEgbnVsbCA8Y29kZT5vYmplY3ROYW1lPC9jb2RlPiBwcm9wZXJ0eSBpZiB0aGlzIGZvcm0gcmVwcmVzZW50cyBhIHVzZXIKKyAqIGJlaW5nIGFkZGVkLCBvciBhIG5vbi1udWxsIHZhbHVlIGZvciBhbiBleGlzdGluZyB1c2VyLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNldFVwVXNlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIFNldCB1cCBiZWFucyBjb250YWluaW5nIGFsbCBwb3NzaWJsZSBncm91cHMgYW5kIHJvbGVzCisgICAgICAgIFN0cmluZyBkYXRhYmFzZU5hbWUgPQorICAgICAgICAgICAgVVJMRGVjb2Rlci5kZWNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGFiYXNlTmFtZSIpLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiZ3JvdXBzRm9ybSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyVXRpbHMuZ2V0R3JvdXBzRm9ybShtc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VOYW1lKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JvdXBzIiksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZQorICAgICAgICAgICAgICAgICAobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsICJncm91cHMiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgicm9sZXNGb3JtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJVdGlscy5nZXRSb2xlc0Zvcm0obXNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VOYW1lKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm9sZXMiKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgIChsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgInJvbGVzIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB1cCB0aGUgZm9ybSBiZWFuIGJhc2VkIG9uIHRoZSBjcmVhdGluZyBvciBlZGl0aW5nIHN0YXRlCisgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm9iamVjdE5hbWUiKTsKKyAgICAgICAgVXNlckZvcm0gdXNlckZvcm0gPSBuZXcgVXNlckZvcm0oKTsKKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdXNlckZvcm0uc2V0Tm9kZUxhYmVsCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLnVzZXIubmV3VXNlciIpKTsKKyAgICAgICAgICAgIHVzZXJGb3JtLnNldE9iamVjdE5hbWUobnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1c2VyRm9ybS5zZXROb2RlTGFiZWwKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMudXNlci5vbGRVc2VyIikpOworICAgICAgICAgICAgdXNlckZvcm0uc2V0T2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKyAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUob2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJuYW1lIjsKKyAgICAgICAgICAgICAgICB1c2VyRm9ybS5zZXRVc2VybmFtZQorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwYXNzd29yZCI7CisgICAgICAgICAgICAgICAgdXNlckZvcm0uc2V0UGFzc3dvcmQKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZnVsbE5hbWUiOworICAgICAgICAgICAgICAgIHVzZXJGb3JtLnNldEZ1bGxOYW1lCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gImdyb3VwcyI7CisgICAgICAgICAgICAgICAgdXNlckZvcm0uc2V0R3JvdXBzCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nW10pIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicm9sZXMiOworICAgICAgICAgICAgICAgIHVzZXJGb3JtLnNldFJvbGVzCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nW10pIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdXNlckZvcm0uc2V0RGF0YWJhc2VOYW1lKGRhdGFiYXNlTmFtZSk7CisKKyAgICAgICAgLy8gU3Rhc2ggdGhlIGZvcm0gYmVhbiBhbmQgZm9yd2FyZCB0byB0aGUgZGlzcGxheSBwYWdlCisgICAgICAgIHNhdmVUb2tlbihyZXF1ZXN0KTsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoInVzZXJGb3JtIiwgdXNlckZvcm0pOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlVzZXIiKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Vc2VyRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1VzZXJGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRlOTRkZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Vc2VyRm9ybS5qYXZhCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgaW5kaXZpZHVhbCB1c2VyIHBhZ2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBVc2VyRm9ybSBleHRlbmRzIEJhc2VGb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGZ1bGxOYW1lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5mdWxsTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RnVsbE5hbWUoU3RyaW5nIGZ1bGxOYW1lKSB7CisgICAgICAgIHRoaXMuZnVsbE5hbWUgPSBmdWxsTmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhbiBOYW1lcyBvZiB0aGUgZ3JvdXBzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ3JvdXBzW10gPSBuZXcgU3RyaW5nWzBdOworCisgICAgcHVibGljIFN0cmluZ1tdIGdldEdyb3VwcygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmdyb3Vwcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXBzKFN0cmluZyBncm91cHNbXSkgeworICAgICAgICBpZiAoZ3JvdXBzID09IG51bGwpIHsKKyAgICAgICAgICAgIGdyb3VwcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5ncm91cHMgPSBncm91cHM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFzc3dvcmQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucGFzc3dvcmQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW4gTmFtZXMgb2YgdGhlIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcm9sZXNbXSA9IG5ldyBTdHJpbmdbMF07CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Um9sZXMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5yb2xlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Um9sZXMoU3RyaW5nIHJvbGVzW10pIHsKKyAgICAgICAgaWYgKHJvbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJvbGVzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnJvbGVzID0gcm9sZXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlcm5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2VybmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudXNlcm5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSkgeworICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7CisgICAgICAgIGZ1bGxOYW1lID0gbnVsbDsKKyAgICAgICAgZ3JvdXBzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgcGFzc3dvcmQgPSBudWxsOworICAgICAgICByb2xlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIHVzZXJuYW1lID0gbnVsbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IGZyb20gdGhpcyBIVFRQIHJlcXVlc3QsCisgICAgICogYW5kIHJldHVybiBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbnkKKyAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBmb3VuZC4gIElmIG5vIGVycm9ycyBhcmUgZm91bmQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHdpdGggbm8KKyAgICAgKiByZWNvcmRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICAvLyBTZXQgdXAgYmVhbnMgY29udGFpbmluZyBhbGwgcG9zc2libGUgZ3JvdXBzIGFuZCByb2xlcworICAgICAgICAgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSA9CisgICAgICAgICAgICAgICAgVVJMRGVjb2Rlci5kZWNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGFiYXNlTmFtZSIpLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiZ3JvdXBzRm9ybSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyVXRpbHMuZ2V0R3JvdXBzRm9ybShtc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VOYW1lKSk7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgicm9sZXNGb3JtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJVdGlscy5nZXRSb2xlc0Zvcm0obXNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VOYW1lKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nIHNpbmNlIHRoZSBmb3JtIHJldHVybnMgdmFsaWRhdGlvbiBlcnJvcgorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBBY3Rpb25FcnJvcnMgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworCisgICAgICAgIC8vIHVzZXJuYW1lIGlzIGEgcmVxdWlyZWQgZmllbGQKKyAgICAgICAgaWYgKCh1c2VybmFtZSA9PSBudWxsKSB8fCAodXNlcm5hbWUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgidXNlcm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgidXNlcnMuZXJyb3IudXNlcm5hbWUucmVxdWlyZWQiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1YXNzd29yZCBpcyBhIHJlcXVpcmVkIGZpZWxkCisgICAgICAgIGlmICgocGFzc3dvcmQgPT0gbnVsbCkgfHwgKHVzZXJuYW1lLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoInBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoInVzZXJzLmVycm9yLnBhc3N3b3JkLnJlcXVpcmVkIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUXVvdGVzIG5vdCBhbGxvd2VkIGluIHVzZXJuYW1lCisgICAgICAgIGlmICgodXNlcm5hbWUgIT0gbnVsbCkgJiYgKHVzZXJuYW1lLmluZGV4T2YoJyInKSA+PSAwKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgidXNlcm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgidXNlcnMuZXJyb3IucXVvdGVzIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUXVvdGVzIG5vdCBhbGxvd2VkIGluIHBhc3N3b3JkCisgICAgICAgIGlmICgocGFzc3dvcmQgIT0gbnVsbCkgJiYgKHBhc3N3b3JkLmluZGV4T2YoJyInKSA+IDApKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJ1c2Vycy5lcnJvci5xdW90ZXMiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBRdW90ZXMgbm90IGFsbG93ZWQgaW4gZnVsbE5hbWUKKyAgICAgICAgaWYgKChmdWxsTmFtZSAhPSBudWxsKSAmJiAoZnVsbE5hbWUuaW5kZXhPZignIicpID4gMCkpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoImZ1bGxOYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoInVzZXJzLmVycm9yLnF1b3RlcyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoZXJyb3JzKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvVXNlclV0aWxzLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvVXNlclV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwOTUzNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Vc2VyVXRpbHMuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworCisvKioKKyAqIDxwPlNoYXJlZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHRoZSB1c2VyIGRhdGFiYXNlIGFkbWluaXN0cmF0aW9uIG1vZHVsZS48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBjbGFzcyBVc2VyVXRpbHMgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuZCByZXR1cm4gYSBHcm91cHNGb3JtIGlkZW50aWZ5aW5nIGFsbCBjdXJyZW50bHkgZGVmaW5lZAorICAgICAqIGdyb3VwcyBpbiB0aGUgc3BlY2lmaWVkIHVzZXIgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNlcnZlciBNQmVhblNlcnZlciB0byBiZSBjb25zdWx0ZWQKKyAgICAgKiBAcGFyYW0gZGF0YWJhc2VOYW1lIE1CZWFuIE5hbWUgb2YgdGhlIHVzZXIgZGF0YWJhc2UgdG8gYmUgY29uc3VsdGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEdyb3Vwc0Zvcm0gZ2V0R3JvdXBzRm9ybShNQmVhblNlcnZlciBtc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkYXRhYmFzZU5hbWUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgZG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkYXRhYmFzZU5hbWUpOworICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID0KKyAgICAgICAgICAgIChTdHJpbmdbXSkgbXNlcnZlci5nZXRBdHRyaWJ1dGUoZG5hbWUsICJncm91cHMiKTsKKyAgICAgICAgaWYgKHJlc3VsdHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0cyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKyAgICAgICAgQXJyYXlzLnNvcnQocmVzdWx0cyk7CisKKyAgICAgICAgR3JvdXBzRm9ybSBncm91cHNGb3JtID0gbmV3IEdyb3Vwc0Zvcm0oKTsKKyAgICAgICAgZ3JvdXBzRm9ybS5zZXREYXRhYmFzZU5hbWUoZGF0YWJhc2VOYW1lKTsKKyAgICAgICAgZ3JvdXBzRm9ybS5zZXRHcm91cHMocmVzdWx0cyk7CisgICAgICAgIHJldHVybiAoZ3JvdXBzRm9ybSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbmQgcmV0dXJuIGEgUm9sZXNGb3JtIGlkZW50aWZ5aW5nIGFsbCBjdXJyZW50bHkgZGVmaW5lZAorICAgICAqIHJvbGVzIGluIHRoZSBzcGVjaWZpZWQgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2VydmVyIE1CZWFuU2VydmVyIHRvIGJlIGNvbnN1bHRlZAorICAgICAqIEBwYXJhbSBkYXRhYmFzZU5hbWUgTUJlYW4gTmFtZSBvZiB0aGUgdXNlciBkYXRhYmFzZSB0byBiZSBjb25zdWx0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUm9sZXNGb3JtIGdldFJvbGVzRm9ybShNQmVhblNlcnZlciBtc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkYXRhYmFzZU5hbWUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgZG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkYXRhYmFzZU5hbWUpOworICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID0KKyAgICAgICAgICAgIChTdHJpbmdbXSkgbXNlcnZlci5nZXRBdHRyaWJ1dGUoZG5hbWUsICJyb2xlcyIpOworICAgICAgICBpZiAocmVzdWx0cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHRzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgICAgICBBcnJheXMuc29ydChyZXN1bHRzKTsKKworICAgICAgICBSb2xlc0Zvcm0gcm9sZXNGb3JtID0gbmV3IFJvbGVzRm9ybSgpOworICAgICAgICByb2xlc0Zvcm0uc2V0RGF0YWJhc2VOYW1lKGRhdGFiYXNlTmFtZSk7CisgICAgICAgIHJvbGVzRm9ybS5zZXRSb2xlcyhyZXN1bHRzKTsKKyAgICAgICAgcmV0dXJuIChyb2xlc0Zvcm0pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW5kIHJldHVybiBhIFVzZXJzRm9ybSBpZGVudGlmeWluZyBhbGwgY3VycmVudGx5IGRlZmluZWQKKyAgICAgKiB1c2VycyBpbiB0aGUgc3BlY2lmaWVkIHVzZXIgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNlcnZlciBNQmVhblNlcnZlciB0byBiZSBjb25zdWx0ZWQKKyAgICAgKiBAcGFyYW0gZGF0YWJhc2VOYW1lIE1CZWFuIE5hbWUgb2YgdGhlIHVzZXIgZGF0YWJhc2UgdG8gYmUgY29uc3VsdGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFVzZXJzRm9ybSBnZXRVc2Vyc0Zvcm0oTUJlYW5TZXJ2ZXIgbXNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGF0YWJhc2VOYW1lKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIGRuYW1lID0gbmV3IE9iamVjdE5hbWUoZGF0YWJhc2VOYW1lKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9CisgICAgICAgICAgICAoU3RyaW5nW10pIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKGRuYW1lLCAidXNlcnMiKTsKKyAgICAgICAgaWYgKHJlc3VsdHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0cyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKyAgICAgICAgQXJyYXlzLnNvcnQocmVzdWx0cyk7CisKKyAgICAgICAgVXNlcnNGb3JtIHVzZXJzRm9ybSA9IG5ldyBVc2Vyc0Zvcm0oKTsKKyAgICAgICAgdXNlcnNGb3JtLnNldERhdGFiYXNlTmFtZShkYXRhYmFzZU5hbWUpOworICAgICAgICB1c2Vyc0Zvcm0uc2V0VXNlcnMocmVzdWx0cyk7CisgICAgICAgIHJldHVybiAodXNlcnNGb3JtKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvVXNlcnNGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvVXNlcnNGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwN2VmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Vc2Vyc0Zvcm0uamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGRlbGV0ZSB1c2VycyBwYWdlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgVXNlcnNGb3JtIGV4dGVuZHMgQmFzZUZvcm0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZXMgb2YgdGhlIHNwZWNpZmllZCB1c2Vycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2Vyc1tdID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRVc2VycygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnVzZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VycyhTdHJpbmcgdXNlcnNbXSkgeworICAgICAgICB0aGlzLnVzZXJzID0gdXNlcnM7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsKKyAgICAgICAgdGhpcy51c2VycyA9IG51bGw7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1VzZXJzVHJlZUJ1aWxkZXIuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Vc2Vyc1RyZWVCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0YTJlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Vc2Vyc1RyZWVCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCisKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbE5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgPGNvZGU+VHJlZUJ1aWxkZXI8L2NvZGU+IHRoYXQgYWRkcyB0aGUgbm9kZXMgcmVxdWlyZWQKKyAqIGZvciBhZG1pbmlzdGVyaW5nIHRoZSB1c2VyIGRhdGFiYXNlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgY2xhc3MgVXNlcnNUcmVlQnVpbGRlciBpbXBsZW1lbnRzIFRyZWVCdWlsZGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVHJlZUJ1aWxkZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIHJlcXVpcmVkIG5vZGVzIHRvIHRoZSBzcGVjaWZpZWQgPGNvZGU+dHJlZUNvbnRyb2w8L2NvZGU+CisgICAgICogaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJlZUNvbnRyb2wgVGhlIDxjb2RlPlRyZWVDb250cm9sPC9jb2RlPiB0byB3aGljaCB3ZSBzaG91bGQKKyAgICAgKiAgYWRkIG91ciBub2RlcworICAgICAqIEBwYXJhbSBzZXJ2bGV0IFRoZSBjb250cm9sbGVyIHNlcnZsZXQgZm9yIHRoZSBhZG1pbiBhcHBsaWNhdGlvbgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBidWlsZFRyZWUoVHJlZUNvbnRyb2wgdHJlZUNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uU2VydmxldCBzZXJ2bGV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gKE1lc3NhZ2VSZXNvdXJjZXMpCisgICAgICAgICAgICBzZXJ2bGV0LmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlKEdsb2JhbHMuTUVTU0FHRVNfS0VZKTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gKExvY2FsZSkgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoR2xvYmFscy5MT0NBTEVfS0VZKTsKKyAgICAgICAgYWRkU3VidHJlZSh0cmVlQ29udHJvbC5nZXRSb290KCksIHJlc291cmNlcywgbG9jYWxlKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgc3VidHJlZSBvZiBub2RlcyByZXF1aXJlZCBmb3IgdXNlciBhZG1pbmlzdHJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb290IFRoZSByb290IG5vZGUgb2Ygb3VyIHRyZWUgY29udHJvbAorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgVGhlIE1lc3NhZ2VSZXNvdXJjZXMgZm9yIG91ciBsb2NhbGl6ZWQgbWVzc2FnZXMKKyAgICAgKiAgbWVzc2FnZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTdWJ0cmVlKFRyZWVDb250cm9sTm9kZSByb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMsIExvY2FsZSBsb2NhbGUpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSA9IFVSTEVuY29kZXIuZW5jb2RlCisgICAgICAgICAgICAgICAgKCJVc2Vyczp0eXBlPVVzZXJEYXRhYmFzZSxkYXRhYmFzZT1Vc2VyRGF0YWJhc2UiLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyk7CisKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBzdWJ0cmVlID0gbmV3IFRyZWVDb250cm9sTm9kZQorICAgICAgICAgICAgICAgICgiR2xvYmFsIFVzZXIgYW5kIEdyb3VwIEFkbWluaXN0cmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgImZvbGRlcl8xNl9wYWQuZ2lmIiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMudHJlZUJ1aWxkZXIuc3VidHJlZU5vZGUiKSwKKyAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICB0cnVlLCAiVXNlcnMiKTsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBncm91cHMgPSBuZXcgVHJlZUNvbnRyb2xOb2RlCisgICAgICAgICAgICAgICAgKCJHbG9iYWwgQWRtaW5pc3RlciBHcm91cHMiLAorICAgICAgICAgICAgICAgICAiR3JvdXBzLmdpZiIsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLnRyZWVCdWlsZGVyLmdyb3Vwc05vZGUiKSwKKyAgICAgICAgICAgICAgICAgInVzZXJzL2xpc3RHcm91cHMuZG8/ZGF0YWJhc2VOYW1lPSIgKworICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkYXRhYmFzZU5hbWUsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKSArCisgICAgICAgICAgICAgICAgICImZm9yd2FyZD0iICsKKyAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIkdyb3VwcyBMaXN0IFNldHVwIixUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpLAorICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgIGZhbHNlLCAiVXNlcnMiKTsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSByb2xlcyA9IG5ldyBUcmVlQ29udHJvbE5vZGUKKyAgICAgICAgICAgICAgICAoIkdsb2JhbCBBZG1pbmlzdGVyIFJvbGVzIiwKKyAgICAgICAgICAgICAgICAgIlJvbGVzLmdpZiIsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLnRyZWVCdWlsZGVyLnJvbGVzTm9kZSIpLAorICAgICAgICAgICAgICAgICAidXNlcnMvbGlzdFJvbGVzLmRvP2RhdGFiYXNlTmFtZT0iICsKKyAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZGF0YWJhc2VOYW1lLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORykgKworICAgICAgICAgICAgICAgICAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKCJSb2xlcyBMaXN0IFNldHVwIixUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpLAorICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgIGZhbHNlLCAiVXNlcnMiKTsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSB1c2VycyA9IG5ldyBUcmVlQ29udHJvbE5vZGUKKyAgICAgICAgICAgICAgICAoIkdsb2JhbCBBZG1pbmlzdGVyIFVzZXJzIiwKKyAgICAgICAgICAgICAgICAgIlVzZXJzLmdpZiIsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLnRyZWVCdWlsZGVyLnVzZXJzTm9kZSIpLAorICAgICAgICAgICAgICAgICAidXNlcnMvbGlzdFVzZXJzLmRvP2RhdGFiYXNlTmFtZT0iICsKKyAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZGF0YWJhc2VOYW1lLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORykgKworICAgICAgICAgICAgICAgICAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKCJVc2VycyBMaXN0IFNldHVwIixUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpLAorICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgIGZhbHNlLCAiVXNlcnMiKTsKKworICAgICAgICAgICAgcm9vdC5hZGRDaGlsZChzdWJ0cmVlKTsKKyAgICAgICAgICAgIHN1YnRyZWUuYWRkQ2hpbGQodXNlcnMpOworICAgICAgICAgICAgc3VidHJlZS5hZGRDaGlsZChncm91cHMpOworICAgICAgICAgICAgc3VidHJlZS5hZGRDaGlsZChyb2xlcyk7CisgICAgICAgIH0gY2F0Y2goVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWV4KSB7CisgICAgICAgICAgICAvLyBjYW4ndCBoYXBwZW4KKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9BY2Nlc3NMb2dWYWx2ZUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9BY2Nlc3NMb2dWYWx2ZUZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTgzMzVhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL0FjY2Vzc0xvZ1ZhbHZlRm9ybS5qYXZhCkBAIC0wLDAgKzEsMzM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGFjY2Vzc2xvZyB2YWx2ZSBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBY2Nlc3NMb2dWYWx2ZUZvcm0gZXh0ZW5kcyBWYWx2ZUZvcm0geworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgZGVidWcgbGV2ZWwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVidWdMdmwgPSAiMCI7CisgIAorICAgIC8qKgorICAgICAqIFNldCBvZiB2YWxpZCB2YWx1ZXMgZm9yIGRlYnVnIGxldmVsLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdCBkZWJ1Z0x2bFZhbHMgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgZGlyZWN0b3J5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRpcmVjdG9yeSA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBwYXR0ZXJuLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm4gPSBudWxsOworICAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHByZWZpeC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcmVmaXggPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgc3VmZml4LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHN1ZmZpeCA9IG51bGw7CisgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGNvbm5lY3Rpb24gVVJMLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVIb3N0cyA9ICJmYWxzZSI7CisgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHJvdGF0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByb3RhdGFibGUgPSAidHJ1ZSI7ICAgIAorICAgICAgIAorICAgIC8qKgorICAgICAqIFNldCBvZiBib29sZWFuIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QgYm9vbGVhblZhbHMgPSBudWxsOworIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWJ1Z1ZhbHMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0RGVidWdMdmxWYWxzKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuZGVidWdMdmxWYWxzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWJ1Z1ZhbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVidWdMdmxWYWxzKExpc3QgZGVidWdMdmxWYWxzKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmRlYnVnTHZsVmFscyA9IGRlYnVnTHZsVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYm9vbGVhblZhbHMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0Qm9vbGVhblZhbHMoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5ib29sZWFuVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgYm9vbGVhblZhbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qm9vbGVhblZhbHMoTGlzdCBib29sZWFuVmFscykgeworICAgICAgICAKKyAgICAgICAgdGhpcy5ib29sZWFuVmFscyA9IGJvb2xlYW5WYWxzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBEZWJ1ZyBMZXZlbCBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVidWdMdmwoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5kZWJ1Z0x2bDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgRGVidWcgTGV2ZWwgVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Z0x2bChTdHJpbmcgZGVidWdMdmwpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuZGVidWdMdmwgPSBkZWJ1Z0x2bDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0b3J5OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnkpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXR0ZXJuLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybigpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnBhdHRlcm47CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdHRlcm4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgcGF0dGVybikgeworICAgICAgICAKKyAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJlZml4LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucHJlZml4OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcmVmaXguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdWZmaXguCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdWZmaXgoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5zdWZmaXg7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN1ZmZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdWZmaXgoU3RyaW5nIHN1ZmZpeCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5zdWZmaXggPSBzdWZmaXg7CisgICAgICAgIAorICAgIH0KKyAgICAgICAgICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzb2x2ZSBob3N0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc29sdmVIb3N0cygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVIb3N0czsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVzb2x2ZUhvc3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmVIb3N0cyhTdHJpbmcgcmVzb2x2ZUhvc3RzKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnJlc29sdmVIb3N0cyA9IHJlc29sdmVIb3N0czsKKyAgICAgICAgCisgICAgfSAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByb3RhdGFibGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSb3RhdGFibGUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5yb3RhdGFibGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJvdGF0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3RhdGFibGUoU3RyaW5nIHJvdGF0YWJsZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5yb3RhdGFibGUgPSByb3RhdGFibGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgIAorICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsKKyAgICAgICAgdGhpcy5kZWJ1Z0x2bCA9ICIwIjsKKyAgICAgICAgCisgICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gbnVsbDsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBudWxsOworICAgICAgICB0aGlzLnN1ZmZpeCA9IG51bGw7CisgICAgICAgIHRoaXMucGF0dGVybiA9IG51bGw7ICAgICAgICAKKyAgICAgICAgdGhpcy5yZXNvbHZlSG9zdHMgPSAiZmFsc2UiOworICAgICAgICB0aGlzLnJvdGF0YWJsZSA9ICJ0cnVlIjsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlbmRlciB0aGlzIG9iamVjdCBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkFjY2Vzc0xvZ1ZhbHZlRm9ybVthZG1pbkFjdGlvbj0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldEFkbWluQWN0aW9uKCkpOworICAgICAgICBzYi5hcHBlbmQoIicsdmFsdmVUeXBlPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0VmFsdmVUeXBlKCkpOworICAgICAgICBzYi5hcHBlbmQoIixkZWJ1Z0x2bD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGRlYnVnTHZsKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsZGlyZWN0b3J5PSIpOworICAgICAgICBzYi5hcHBlbmQoZGlyZWN0b3J5KTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHByZWZpeD0nIik7CisgICAgICAgIHNiLmFwcGVuZChwcmVmaXgpOworICAgICAgICBzYi5hcHBlbmQoIicscGF0dGVybj0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHBhdHRlcm4pOworICAgICAgICBzYi5hcHBlbmQoIixyZXNvbHZlSG9zdHM9Iik7CisgICAgICAgIHNiLmFwcGVuZChyZXNvbHZlSG9zdHMpOworICAgICAgICBzYi5hcHBlbmQoIixyb3RhdGFibGU9Iik7CisgICAgICAgIHNiLmFwcGVuZChyb3RhdGFibGUpOworICAgICAgICBzYi5hcHBlbmQoIicsb2JqZWN0TmFtZT0nIik7CisgICAgICAgIHNiLmFwcGVuZChnZXRPYmplY3ROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgCisgICAgICAgIC8vIGlmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHQgaXMgYWNjZXNzX2xvZy4KKyAgICAgICAgLy8gdG8gc3BlY2lmeSBubyBwcmVmaXgsIHNwZWNpZnkgYSAwIGxlbmd0aCBzdHJpbmcuLi4KKyAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSl7CisgICAgICAgICAgICBwcmVmaXggPSAiYWNjZXNzX2xvZy4iOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgLy8gZGVmYXVsdCBpcyBhIDAgbGVuZ3RoIHN0cmluZworICAgICAgICBpZiAoKHN1ZmZpeCA9PSBudWxsKSB8fCAoc3VmZml4Lmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIHN1ZmZpeCA9ICIiOworICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gSWYgbm8gZGlyZWN0b3J5IGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0CisgICAgICAgIC8vIHZhbHVlIGlzICJsb2dzIi4KKyAgICAgICAgaWYgKChkaXJlY3RvcnkgPT0gbnVsbCkgfHwgKGRpcmVjdG9yeS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBkaXJlY3RvcnkgPSAibG9ncyI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBhdHRlcm4gPT0gbnVsbCkgfHwgKHBhdHRlcm4ubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgicGF0dGVybiIsCisgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IucGF0dGVybi5yZXF1aXJlZCIpKTsKKyAgICAgICAgfSAgICAgICAgIAorCisgICAgICAgIHJldHVybiBlcnJvcnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL0FkZFZhbHZlQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvQWRkVmFsdmVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTg2OTdlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL0FkZFZhbHZlQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5BZGQgVmFsdmU8L2VtPiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEFkZFZhbHZlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAgICAgCisgICAgLy8gdGhlIGxpc3QgZm9yIHR5cGVzIG9mIHZhbHZlcworICAgIHByaXZhdGUgQXJyYXlMaXN0IHR5cGVzID0gbnVsbDsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIAorICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHZhbHZlVHlwZXNbXSA9IG5ldyBTdHJpbmdbNV07CisgICAgICAgIHZhbHZlVHlwZXNbMF0gPSAiQWNjZXNzTG9nVmFsdmUiOworICAgICAgICB2YWx2ZVR5cGVzWzFdID0gIlJlbW90ZUFkZHJWYWx2ZSI7CisgICAgICAgIHZhbHZlVHlwZXNbMl0gPSAiUmVtb3RlSG9zdFZhbHZlIjsKKyAgICAgICAgdmFsdmVUeXBlc1szXSA9ICJSZXF1ZXN0RHVtcGVyVmFsdmUiOyAgICAgICAKKyAgICAgICAgdmFsdmVUeXBlc1s0XSA9ICJTaW5nbGVTaWduT24iOworICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFN0cmluZyBwYXJlbnQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGFyZW50Iik7CisgICAgICAgIFN0cmluZyB0eXBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInR5cGUiKTsgICAgICAgIAorICAgICAgICBpZiAodHlwZSA9PSBudWxsKSAKKyAgICAgICAgICAgIHR5cGUgPSAiQWNjZXNzTG9nVmFsdmUiOyAgICAvLyBkZWZhdWx0IHR5cGUgaXMgQWNjZXNzTG9nCisgICAgICAgIAorICAgICAgICB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsgICAgCisgICAgICAgIC8vIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzZWxlY3QgbGlzdCBzaG91bGQgYmUgdGhlIHR5cGUgc2VsZWN0ZWQKKyAgICAgICAgdHlwZXMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbih0eXBlLAorICAgICAgICAgICAgICAgICJBZGRWYWx2ZS5kbz9wYXJlbnQ9IiArIAorICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhcmVudCxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpIAorICAgICAgICAgICAgICAgICsgIiZ0eXBlPSIgKyB0eXBlKSk7ICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPCB2YWx2ZVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIXR5cGUuZXF1YWxzSWdub3JlQ2FzZSh2YWx2ZVR5cGVzW2ldKSkgeworICAgICAgICAgICAgICAgIHR5cGVzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4odmFsdmVUeXBlc1tpXSwKKyAgICAgICAgICAgICAgICAiQWRkVmFsdmUuZG8/cGFyZW50PSIgKyAKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXJlbnQsVG9tY2F0VHJlZUJ1aWxkZXIuVVJMX0VOQ09ESU5HKSAKKyAgICAgICAgICAgICAgICArICImdHlwZT0iICsgdmFsdmVUeXBlc1tpXSkpOyAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAKKyAgICAgICAgaWYgKCJBY2Nlc3NMb2dWYWx2ZSIuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgeworICAgICAgICAgICAgY3JlYXRlQWNjZXNzTG9nZ2VyKHNlc3Npb24sIHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAoIlJlbW90ZUFkZHJWYWx2ZSIuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgeworICAgICAgICAgICAgY3JlYXRlUmVtb3RlQWRkclZhbHZlKHNlc3Npb24sIHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAoIlJlbW90ZUhvc3RWYWx2ZSIuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgeworICAgICAgICAgICAgY3JlYXRlUmVtb3RlSG9zdFZhbHZlKHNlc3Npb24sIHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAoIlJlcXVlc3REdW1wZXJWYWx2ZSIuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgeworICAgICAgICAgICAgY3JlYXRlUmVxdWVzdER1bXBlclZhbHZlKHNlc3Npb24sIHBhcmVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvL1NpbmdsZVNpZ25PbgorICAgICAgICAgICAgY3JlYXRlU2luZ2xlU2lnbk9uVmFsdmUoc2Vzc2lvbiwgcGFyZW50KTsKKyAgICAgICAgfQorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSB2YWx2ZSBkaXNwbGF5IHBhZ2UKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKHR5cGUpKTsKKyAgICAgICAgCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFjY2Vzc0xvZ2dlcihIdHRwU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgcGFyZW50KSB7CisKKyAgICAgICAgQWNjZXNzTG9nVmFsdmVGb3JtIHZhbHZlRm0gPSBuZXcgQWNjZXNzTG9nVmFsdmVGb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJhY2Nlc3NMb2dWYWx2ZUZvcm0iLCB2YWx2ZUZtKTsKKyAgICAgICAgdmFsdmVGbS5zZXRBZG1pbkFjdGlvbigiQ3JlYXRlIik7CisgICAgICAgIHZhbHZlRm0uc2V0T2JqZWN0TmFtZSgiIik7CisgICAgICAgIHZhbHZlRm0uc2V0UGFyZW50T2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICBTdHJpbmcgdmFsdmVUeXBlID0gIkFjY2Vzc0xvZ1ZhbHZlIjsKKyAgICAgICAgdmFsdmVGbS5zZXROb2RlTGFiZWwoIlZhbHZlICgiICsgdmFsdmVUeXBlICsgIikiKTsKKyAgICAgICAgdmFsdmVGbS5zZXRWYWx2ZVR5cGUodmFsdmVUeXBlKTsKKyAgICAgICAgdmFsdmVGbS5zZXRQYXR0ZXJuKCIiKTsKKyAgICAgICAgdmFsdmVGbS5zZXREaXJlY3RvcnkoImxvZ3MiKTsKKyAgICAgICAgdmFsdmVGbS5zZXRQcmVmaXgoImFjY2Vzc19sb2cuIik7CisgICAgICAgIHZhbHZlRm0uc2V0U3VmZml4KCIiKTsKKyAgICAgICAgdmFsdmVGbS5zZXRSZXNvbHZlSG9zdHMoImZhbHNlIik7CisgICAgICAgIHZhbHZlRm0uc2V0Um90YXRhYmxlKCJ0cnVlIik7CisgICAgICAgIHZhbHZlRm0uc2V0Qm9vbGVhblZhbHMoTGlzdHMuZ2V0Qm9vbGVhblZhbHVlcygpKTsKKyAgICAgICAgdmFsdmVGbS5zZXRWYWx2ZVR5cGVWYWxzKHR5cGVzKTsgICAgICAgIAorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSZW1vdGVBZGRyVmFsdmUoSHR0cFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHBhcmVudCkgeworCisgICAgICAgIFJlbW90ZUFkZHJWYWx2ZUZvcm0gdmFsdmVGbSA9IG5ldyBSZW1vdGVBZGRyVmFsdmVGb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJyZW1vdGVBZGRyVmFsdmVGb3JtIiwgdmFsdmVGbSk7CisgICAgICAgIHZhbHZlRm0uc2V0QWRtaW5BY3Rpb24oIkNyZWF0ZSIpOworICAgICAgICB2YWx2ZUZtLnNldE9iamVjdE5hbWUoIiIpOworICAgICAgICB2YWx2ZUZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIHZhbHZlVHlwZSA9ICJSZW1vdGVBZGRyVmFsdmUiOworICAgICAgICB2YWx2ZUZtLnNldE5vZGVMYWJlbCgiVmFsdmUgKCIgKyB2YWx2ZVR5cGUgKyAiKSIpOworICAgICAgICB2YWx2ZUZtLnNldFZhbHZlVHlwZSh2YWx2ZVR5cGUpOworICAgICAgICB2YWx2ZUZtLnNldEFsbG93KCIiKTsKKyAgICAgICAgdmFsdmVGbS5zZXREZW55KCIiKTsKKyAgICAgICAgdmFsdmVGbS5zZXRWYWx2ZVR5cGVWYWxzKHR5cGVzKTsgICAgICAgIAorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSZW1vdGVIb3N0VmFsdmUoSHR0cFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHBhcmVudCkgeworCisgICAgICAgIFJlbW90ZUhvc3RWYWx2ZUZvcm0gdmFsdmVGbSA9IG5ldyBSZW1vdGVIb3N0VmFsdmVGb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJyZW1vdGVIb3N0VmFsdmVGb3JtIiwgdmFsdmVGbSk7CisgICAgICAgIHZhbHZlRm0uc2V0QWRtaW5BY3Rpb24oIkNyZWF0ZSIpOworICAgICAgICB2YWx2ZUZtLnNldE9iamVjdE5hbWUoIiIpOworICAgICAgICB2YWx2ZUZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIHZhbHZlVHlwZSA9ICJSZW1vdGVIb3N0VmFsdmUiOworICAgICAgICB2YWx2ZUZtLnNldE5vZGVMYWJlbCgiVmFsdmUgKCIgKyB2YWx2ZVR5cGUgKyAiKSIpOworICAgICAgICB2YWx2ZUZtLnNldFZhbHZlVHlwZSh2YWx2ZVR5cGUpOworICAgICAgICB2YWx2ZUZtLnNldEFsbG93KCIiKTsKKyAgICAgICAgdmFsdmVGbS5zZXREZW55KCIiKTsKKyAgICAgICAgdmFsdmVGbS5zZXRWYWx2ZVR5cGVWYWxzKHR5cGVzKTsgICAgICAgIAorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSZXF1ZXN0RHVtcGVyVmFsdmUoSHR0cFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHBhcmVudCkgeworCisgICAgICAgIFJlcXVlc3REdW1wZXJWYWx2ZUZvcm0gdmFsdmVGbSA9IG5ldyBSZXF1ZXN0RHVtcGVyVmFsdmVGb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJyZXF1ZXN0RHVtcGVyVmFsdmVGb3JtIiwgdmFsdmVGbSk7CisgICAgICAgIHZhbHZlRm0uc2V0QWRtaW5BY3Rpb24oIkNyZWF0ZSIpOworICAgICAgICB2YWx2ZUZtLnNldE9iamVjdE5hbWUoIiIpOworICAgICAgICB2YWx2ZUZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIHZhbHZlVHlwZSA9ICJSZXF1ZXN0RHVtcGVyVmFsdmUiOworICAgICAgICB2YWx2ZUZtLnNldE5vZGVMYWJlbCgiVmFsdmUgKCIgKyB2YWx2ZVR5cGUgKyAiKSIpOworICAgICAgICB2YWx2ZUZtLnNldFZhbHZlVHlwZSh2YWx2ZVR5cGUpOworICAgICAgICB2YWx2ZUZtLnNldFZhbHZlVHlwZVZhbHModHlwZXMpOyAgICAgICAgCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNpbmdsZVNpZ25PblZhbHZlKEh0dHBTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBwYXJlbnQpIHsKKworICAgICAgICBTaW5nbGVTaWduT25WYWx2ZUZvcm0gdmFsdmVGbSA9IG5ldyBTaW5nbGVTaWduT25WYWx2ZUZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoInNpbmdsZVNpZ25PblZhbHZlRm9ybSIsIHZhbHZlRm0pOworICAgICAgICB2YWx2ZUZtLnNldEFkbWluQWN0aW9uKCJDcmVhdGUiKTsKKyAgICAgICAgdmFsdmVGbS5zZXRPYmplY3ROYW1lKCIiKTsKKyAgICAgICAgdmFsdmVGbS5zZXRQYXJlbnRPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgIFN0cmluZyB2YWx2ZVR5cGUgPSAiU2luZ2xlU2lnbk9uIjsKKyAgICAgICAgdmFsdmVGbS5zZXROb2RlTGFiZWwoIlZhbHZlICgiICsgdmFsdmVUeXBlICsgIikiKTsKKyAgICAgICAgdmFsdmVGbS5zZXRWYWx2ZVR5cGUodmFsdmVUeXBlKTsKKyAgICAgICAgdmFsdmVGbS5zZXRWYWx2ZVR5cGVWYWxzKHR5cGVzKTsgICAgICAgIAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL0RlbGV0ZVZhbHZlQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvRGVsZXRlVmFsdmVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWM0MzIxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL0RlbGV0ZVZhbHZlQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MaXN0czsKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IHNldHMgdXAgPGVtPkRlbGV0ZSBWYWx2ZXM8L2VtPiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlbGV0ZVZhbHZlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFNldCB1cCBhIGZvcm0gYmVhbiBjb250YWluaW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKKyAgICAgICAgLy8gb2JqZWN0cyB0byBiZSBkZWxldGVkCisgICAgICAgIFZhbHZlc0Zvcm0gdmFsdmVzRm9ybSA9IG5ldyBWYWx2ZXNGb3JtKCk7CisgICAgICAgIFN0cmluZyBzZWxlY3QgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic2VsZWN0Iik7CisgICAgICAgIGlmIChzZWxlY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHZlc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIHZhbHZlc1swXSA9IHNlbGVjdDsKKyAgICAgICAgICAgIHZhbHZlc0Zvcm0uc2V0VmFsdmVzKHZhbHZlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoInZhbHZlc0Zvcm0iLCB2YWx2ZXNGb3JtKTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjY3VtdWxhdGUgYSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgdmFsdmVzCisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBTdHJpbmcgcGFyZW50ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhcmVudCIpOworICAgICAgICB2YWx2ZXNGb3JtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVtcyA9IChMaXN0cy5nZXRWYWx2ZXMobUJTZXJ2ZXIsIHBhcmVudCkpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoaXRlbXMubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNlbGVjdCIpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2VsZWN0IikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoInZhbHZlc0xpc3QiLCBsaXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGxpc3QgZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiVmFsdmVzIikpOworICAgICAgICAKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9EZWxldGVWYWx2ZXNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9EZWxldGVWYWx2ZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTFlMjVmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL0RlbGV0ZVZhbHZlc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbE5vZGU7CisKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IGNvbXBsZXRlcyA8ZW0+RGVsZXRlIFZhbHZlczwvZW0+CisgKiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlbGV0ZVZhbHZlc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8qKgorICAgICAqIFNpZ25hdHVyZSBmb3IgdGhlIDxjb2RlPnJlbW92ZVZhbHZlPC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlVmFsdmVUeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgICAvLyBPYmplY3QgbmFtZQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRGVsZXRlIHRoZSBzcGVjaWZpZWQgVmFsdmVzCisgICAgICAgIFN0cmluZyB2YWx2ZXNbXSAgPSAoKFZhbHZlc0Zvcm0pIGZvcm0pLmdldFZhbHZlcygpOworICAgICAgICBTdHJpbmcgdmFsdWVzW10gPSBuZXcgU3RyaW5nWzFdOworICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gInJlbW92ZVZhbHZlIjsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gTG9vayB1cCBvdXIgdHJlZSBjb250cm9sIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBUcmVlQ29udHJvbCBjb250cm9sID0gKFRyZWVDb250cm9sKQorICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ0cmVlQ29udHJvbFRlc3QiKTsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdmFsdmVzCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHZlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IHZhbHZlc1tpXTsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIGZuYW1lID0gVG9tY2F0VHJlZUJ1aWxkZXIuZ2V0TUJlYW5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuaW52b2tlKGZuYW1lLCBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgcmVtb3ZlVmFsdmVUeXBlcyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNlbGVjdE5vZGUobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBub2RlID0gY29udHJvbC5maW5kTm9kZSh2YWx2ZXNbaV0pOworICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZygiTWlzc2luZyBUcmVlQ29udHJvbE5vZGUgZm9yICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx2ZXNbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZygiTWlzc2luZyBUcmVlQ29udHJvbCBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoaXMgdHJhbnNhY3Rpb24KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFN1Y2Nlc3NmdWwiKSk7CisKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvRWRpdFZhbHZlQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvRWRpdFZhbHZlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM3MDA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9FZGl0VmFsdmVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CisKKy8qKgorICogQSBnZW5lcmljIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5FZGl0IAorICogVmFsdmUgPC9lbT4gdHJhbnNhY3Rpb25zLCBiYXNlZCBvbiB0aGUgdHlwZSBvZiBWYWx2ZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRWRpdFZhbHZlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBTZXQgdXAgdGhlIG9iamVjdCBuYW1lcyBvZiB0aGUgTUJlYW5zIHdlIGFyZSBtYW5pcHVsYXRpbmcKKyAgICAgICAgT2JqZWN0TmFtZSB2bmFtZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2bmFtZSA9IG5ldyBPYmplY3ROYW1lKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAiZXJyb3IudmFsdmVOYW1lLmJhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpKTsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cobWVzc2FnZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgIFN0cmluZyB2YWx2ZVR5cGUgPSBudWxsOworICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgIAorICAgICAgIC8vIEZpbmQgd2hhdCB0eXBlIG9mIFZhbHZlIHRoaXMgaXMKKyAgICAgICB0cnkgeyAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjbGFzc05hbWUiOworICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIAorICAgICAgICAgICAgICAgIG1CU2VydmVyLmdldEF0dHJpYnV0ZSh2bmFtZSwgYXR0cmlidXRlKTsKKyAgICAgICAgICAgIGludCBwZXJpb2QgPSBjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKTsKKyAgICAgICAgICAgIGlmIChwZXJpb2QgPj0gMCkKKyAgICAgICAgICAgICAgICB2YWx2ZVR5cGUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKHBlcmlvZCArIDEpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOyAKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHZlIGRpc3BsYXkgcGFnZSAgICAgICAgCisgICAgICAgIGlmICgiQWNjZXNzTG9nVmFsdmUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdmVUeXBlKSkgeworICAgICAgICAgICAgICAgc2V0VXBBY2Nlc3NMb2dWYWx2ZSh2bmFtZSwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9IGVsc2UgaWYgKCJSZW1vdGVBZGRyVmFsdmUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdmVUeXBlKSkgeworICAgICAgICAgICAgICAgc2V0VXBSZW1vdGVBZGRyVmFsdmUodm5hbWUsIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfSBlbHNlIGlmICgiUmVtb3RlSG9zdFZhbHZlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHZlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBzZXRVcFJlbW90ZUhvc3RWYWx2ZSh2bmFtZSwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9IGVsc2UgaWYgKCJSZXF1ZXN0RHVtcGVyVmFsdmUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdmVUeXBlKSkgeworICAgICAgICAgICAgICAgc2V0VXBSZXF1ZXN0RHVtcGVyVmFsdmUodm5hbWUsIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfSBlbHNlIGlmICgiU2luZ2xlU2lnbk9uIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHZlVHlwZSkpIHsKKyAgICAgICAgICAgICAgIHNldFVwU2luZ2xlU2lnbk9uVmFsdmUodm5hbWUsIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgICAgIAorICAgICAgICAKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKHZhbHZlVHlwZSkpOworICAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRVcEFjY2Vzc0xvZ1ZhbHZlKE9iamVjdE5hbWUgdm5hbWUsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIAorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEZpbGwgaW4gdGhlIGZvcm0gdmFsdWVzIGZvciBkaXNwbGF5IGFuZCBlZGl0aW5nCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIFN0cmluZyBwYXJlbnQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGFyZW50Iik7CisgICAgICAgIEFjY2Vzc0xvZ1ZhbHZlRm9ybSB2YWx2ZUZtID0gbmV3IEFjY2Vzc0xvZ1ZhbHZlRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgiYWNjZXNzTG9nVmFsdmVGb3JtIiwgdmFsdmVGbSk7CisgICAgICAgIHZhbHZlRm0uc2V0QWRtaW5BY3Rpb24oIkVkaXQiKTsKKyAgICAgICAgdmFsdmVGbS5zZXRPYmplY3ROYW1lKHZuYW1lLnRvU3RyaW5nKCkpOyAKKyAgICAgICAgdmFsdmVGbS5zZXRQYXJlbnRPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgIFN0cmluZyB2YWx2ZVR5cGUgPSAiQWNjZXNzTG9nVmFsdmUiOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSB2bmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICBTdHJpbmcgY29udGV4dCA9IHZuYW1lLmdldEtleVByb3BlcnR5KCJwYXRoIik7ICAgICAgICAKKyAgICAgICAgaWYgKGhvc3QhPW51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiSG9zdCAoIiArIGhvc3QgKyAiKSA+ICIpOworICAgICAgICB9CisgICAgICAgIGlmIChjb250ZXh0IT1udWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIkNvbnRleHQgKCIgKyBjb250ZXh0ICsgIikgPiAiKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIlZhbHZlIik7CisgICAgICAgIHZhbHZlRm0uc2V0Tm9kZUxhYmVsKHNiLnRvU3RyaW5nKCkpOworICAgICAgICB2YWx2ZUZtLnNldFZhbHZlVHlwZSh2YWx2ZVR5cGUpOworICAgICAgICB2YWx2ZUZtLnNldEJvb2xlYW5WYWxzKExpc3RzLmdldEJvb2xlYW5WYWx1ZXMoKSk7CisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBDb3B5IHNjYWxhciBwcm9wZXJ0aWVzCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZGlyZWN0b3J5IjsKKyAgICAgICAgICAgIHZhbHZlRm0uc2V0RGlyZWN0b3J5CisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZSh2bmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicGF0dGVybiI7CisgICAgICAgICAgICB2YWx2ZUZtLnNldFBhdHRlcm4KKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHZuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwcmVmaXgiOworICAgICAgICAgICAgdmFsdmVGbS5zZXRQcmVmaXgKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHZuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJzdWZmaXgiOworICAgICAgICAgICAgdmFsdmVGbS5zZXRTdWZmaXgKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHZuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJyZXNvbHZlSG9zdHMiOworICAgICAgICAgICAgdmFsdmVGbS5zZXRSZXNvbHZlSG9zdHMKKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUodm5hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInJvdGF0YWJsZSI7CisgICAgICAgICAgICB2YWx2ZUZtLnNldFJvdGF0YWJsZQorICAgICAgICAgICAgICAgICgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZSh2bmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgIH0gICAgIAorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRVcFJlcXVlc3REdW1wZXJWYWx2ZShPYmplY3ROYW1lIHZuYW1lLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSAKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIFN0cmluZyBwYXJlbnQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGFyZW50Iik7CisgICAgICAgIFJlcXVlc3REdW1wZXJWYWx2ZUZvcm0gdmFsdmVGbSA9IG5ldyBSZXF1ZXN0RHVtcGVyVmFsdmVGb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJyZXF1ZXN0RHVtcGVyVmFsdmVGb3JtIiwgdmFsdmVGbSk7CisgICAgICAgIHZhbHZlRm0uc2V0QWRtaW5BY3Rpb24oIkVkaXQiKTsKKyAgICAgICAgdmFsdmVGbS5zZXRPYmplY3ROYW1lKHZuYW1lLnRvU3RyaW5nKCkpOyAKKyAgICAgICAgdmFsdmVGbS5zZXRQYXJlbnRPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgIFN0cmluZyB2YWx2ZVR5cGUgPSAiUmVxdWVzdER1bXBlclZhbHZlIjsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVmFsdmUgKCIpOworICAgICAgICBzYi5hcHBlbmQodmFsdmVUeXBlKTsKKyAgICAgICAgc2IuYXBwZW5kKCIpIik7CisgICAgICAgIHZhbHZlRm0uc2V0Tm9kZUxhYmVsKHNiLnRvU3RyaW5nKCkpOworICAgICAgICB2YWx2ZUZtLnNldFZhbHZlVHlwZSh2YWx2ZVR5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRVcFNpbmdsZVNpZ25PblZhbHZlKE9iamVjdE5hbWUgdm5hbWUsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIAorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEZpbGwgaW4gdGhlIGZvcm0gdmFsdWVzIGZvciBkaXNwbGF5IGFuZCBlZGl0aW5nCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgU3RyaW5nIHBhcmVudCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXJlbnQiKTsKKyAgICAgICAgU2luZ2xlU2lnbk9uVmFsdmVGb3JtIHZhbHZlRm0gPSBuZXcgU2luZ2xlU2lnbk9uVmFsdmVGb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJzaW5nbGVTaWduT25WYWx2ZUZvcm0iLCB2YWx2ZUZtKTsKKyAgICAgICAgdmFsdmVGbS5zZXRBZG1pbkFjdGlvbigiRWRpdCIpOworICAgICAgICB2YWx2ZUZtLnNldE9iamVjdE5hbWUodm5hbWUudG9TdHJpbmcoKSk7IAorICAgICAgICB2YWx2ZUZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIHZhbHZlVHlwZSA9ICJTaW5nbGVTaWduT24iOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJWYWx2ZSAoIik7CisgICAgICAgIHNiLmFwcGVuZCh2YWx2ZVR5cGUpOworICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgdmFsdmVGbS5zZXROb2RlTGFiZWwoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIHZhbHZlRm0uc2V0VmFsdmVUeXBlKHZhbHZlVHlwZSk7CisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBSZW1vdGVBZGRyVmFsdmUoT2JqZWN0TmFtZSB2bmFtZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgZm9ybSB2YWx1ZXMgZm9yIGRpc3BsYXkgYW5kIGVkaXRpbmcKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgU3RyaW5nIHBhcmVudCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXJlbnQiKTsKKyAgICAgICAgUmVtb3RlQWRkclZhbHZlRm9ybSB2YWx2ZUZtID0gbmV3IFJlbW90ZUFkZHJWYWx2ZUZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoInJlbW90ZUFkZHJWYWx2ZUZvcm0iLCB2YWx2ZUZtKTsKKyAgICAgICAgdmFsdmVGbS5zZXRBZG1pbkFjdGlvbigiRWRpdCIpOworICAgICAgICB2YWx2ZUZtLnNldE9iamVjdE5hbWUodm5hbWUudG9TdHJpbmcoKSk7IAorICAgICAgICB2YWx2ZUZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIHZhbHZlVHlwZSA9ICJSZW1vdGVBZGRyVmFsdmUiOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJWYWx2ZSAoIik7CisgICAgICAgIHNiLmFwcGVuZCh2YWx2ZVR5cGUpOworICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgdmFsdmVGbS5zZXROb2RlTGFiZWwoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIHZhbHZlRm0uc2V0VmFsdmVUeXBlKHZhbHZlVHlwZSk7CisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBDb3B5IHNjYWxhciBwcm9wZXJ0aWVzCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiYWxsb3ciOworICAgICAgICAgICAgdmFsdmVGbS5zZXRBbGxvdworICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUodm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImRlbnkiOworICAgICAgICAgICAgdmFsdmVGbS5zZXREZW55CisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZSh2bmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgIH0gICAgIAorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRVcFJlbW90ZUhvc3RWYWx2ZShPYmplY3ROYW1lIHZuYW1lLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSAKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBTdHJpbmcgcGFyZW50ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhcmVudCIpOworICAgICAgICBSZW1vdGVIb3N0VmFsdmVGb3JtIHZhbHZlRm0gPSBuZXcgUmVtb3RlSG9zdFZhbHZlRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgicmVtb3RlSG9zdFZhbHZlRm9ybSIsIHZhbHZlRm0pOworICAgICAgICB2YWx2ZUZtLnNldEFkbWluQWN0aW9uKCJFZGl0Iik7CisgICAgICAgIHZhbHZlRm0uc2V0T2JqZWN0TmFtZSh2bmFtZS50b1N0cmluZygpKTsgCisgICAgICAgIHZhbHZlRm0uc2V0UGFyZW50T2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICBTdHJpbmcgdmFsdmVUeXBlID0gIlJlbW90ZUhvc3RWYWx2ZSI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlZhbHZlICgiKTsKKyAgICAgICAgc2IuYXBwZW5kKHZhbHZlVHlwZSk7CisgICAgICAgIHNiLmFwcGVuZCgiKSIpOworICAgICAgICB2YWx2ZUZtLnNldE5vZGVMYWJlbChzYi50b1N0cmluZygpKTsKKyAgICAgICAgdmFsdmVGbS5zZXRWYWx2ZVR5cGUodmFsdmVUeXBlKTsKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIENvcHkgc2NhbGFyIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJhbGxvdyI7CisgICAgICAgICAgICB2YWx2ZUZtLnNldEFsbG93CisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZSh2bmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZGVueSI7CisgICAgICAgICAgICB2YWx2ZUZtLnNldERlbnkKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHZuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgfSAgICAgCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1JlbW90ZUFkZHJWYWx2ZUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9SZW1vdGVBZGRyVmFsdmVGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4ZGFhNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9SZW1vdGVBZGRyVmFsdmVGb3JtLmphdmEKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlOworCitpbXBvcnQgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZTsKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSByZW1vdGUgYWRkciB2YWx2ZSBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSZW1vdGVBZGRyVmFsdmVGb3JtIGV4dGVuZHMgVmFsdmVGb3JtIHsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGFsbG93IElQIGFkZHJlc3Nlcy4KKyAgICAgKiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJucworICAgICAqIHRoYXQgdGhlIHJlbW90ZSBjbGllbnQncyBJUCBhZGRyZXNzIGlzIGNvbXBhcmVkIHRvLiAKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhbGxvdyA9ICIiOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBkZW55IElQIGFkZHJlc3Nlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZW55ID0gIiI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiA8Y29kZT5hbGxvdzwvY29kZT4gcmVndWxhciBleHByZXNzaW9ucyB3ZSB3aWxsIGV2YWx1YXRlLgorICAgICAqLworICAgIHByaXZhdGUgUGF0dGVybiBhbGxvd3NbXSA9IG5ldyBQYXR0ZXJuWzBdOworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiA8Y29kZT5kZW55PC9jb2RlPiByZWd1bGFyIGV4cHJlc3Npb25zIHdlIHdpbGwgZXZhbHVhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBQYXR0ZXJuIGRlbmllc1tdID0gbmV3IFBhdHRlcm5bMF07CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhbGxvdyBob3N0cyBJUCBhZGRkcmVzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxsb3coKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5hbGxvdzsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgYWxsb3cgaG9zdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxsb3coU3RyaW5nIGFsbG93KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmFsbG93ID0gYWxsb3c7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlbnkgaG9zdHMgSVAgYWRkZHJlc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlbnkoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5kZW55OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZW55IGhvc3RzIElQIGFkZHJlc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZW55KFN0cmluZyBkZW55KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmRlbnkgPSBkZW55OworICAgICAgICAKKyAgICB9ICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7CisgICAgICAgIHRoaXMuYWxsb3cgPSBudWxsOworICAgICAgICB0aGlzLmRlbnkgPSBudWxsOworICAgICAgICB0aGlzLmFsbG93cyA9IG51bGw7CisgICAgICAgIHRoaXMuZGVuaWVzID0gbnVsbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlbmRlciB0aGlzIG9iamVjdCBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlJlbW90ZUFkZHJWYWx2ZUZvcm1bYWRtaW5BY3Rpb249Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRBZG1pbkFjdGlvbigpKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHZhbHZlVHlwZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldFZhbHZlVHlwZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsYWxsb3c9Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRBbGxvdygpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsZGVueT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldERlbnkoKSk7ICAgICAgICAKKyAgICAgICAgc2IuYXBwZW5kKCInLG9iamVjdE5hbWU9JyIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IGZyb20gdGhpcyBIVFRQIHJlcXVlc3QsCisgICAgICogYW5kIHJldHVybiBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbnkKKyAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBmb3VuZC4gIElmIG5vIGVycm9ycyBhcmUgZm91bmQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHdpdGggbm8KKyAgICAgKiByZWNvcmRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgIAorICAgICAgICAvLyBmcm9udCBlbmQgdmFsaWRhdGlvbiB3aGVuIHNhdmUgaXMgY2xpY2tlZC4gICAgICAgIAorICAgICAgICAvLyB2YWxpZGF0ZSBhbGxvdy9kZW55IHBhdHRlcm5zCisgICAgICAgIGlmICgoYWxsb3cgPT0gbnVsbCkgfHwgKGFsbG93Lmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIGlmICgoZGVueSA9PSBudWxsKSB8fCAoZGVueS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiYWxsb3ciLAorICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5hbGxvdy5kZW55LnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFsbG93cyA9IFZhbHZlVXRpbC5wcmVjYWxjdWxhdGUoYWxsb3cpOyAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgiYWxsb3ciLCBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3Iuc3ludGF4IikpOworICAgICAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgIHRyeSB7ICAgCisgICAgICAgICAgICBkZW5pZXMgPSBWYWx2ZVV0aWwucHJlY2FsY3VsYXRlKGRlbnkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgiYWxsb3ciLCBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3Iuc3ludGF4IikpOworICAgICAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIGlwID0gcmVxdWVzdC5nZXRSZW1vdGVBZGRyKCk7CisgICAgICAgIAorICAgICAgICBpZiAoaXAgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZW5pZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChkZW5pZXNbaV0ubWF0Y2hlcihpcCkubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFsbG93cy5sZW5ndGggPCAxKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImRlbnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLmRlbnlJUCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhbGxvd3MubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGxvd3Nbal0ubWF0Y2hlcihpcCkubWF0Y2hlcygpKSB7IAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiZGVueSIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IuZGVueUlQIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYm9vbGVhbiBhbGxvd01hdGNoID0gdHJ1ZTsKKyAgICAgICAgaWYgKGFsbG93cy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBhbGxvd01hdGNoID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxvd3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhbGxvd3NbaV0ubWF0Y2hlcihpcCkubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgYWxsb3dNYXRjaCA9IHRydWU7ICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgIAorICAgICAgICBpZiAoIWFsbG93TWF0Y2gpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoImFsbG93IiwgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLmFsbG93SVAiKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBlcnJvcnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1JlbW90ZUhvc3RWYWx2ZUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9SZW1vdGVIb3N0VmFsdmVGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxMTgxMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9SZW1vdGVIb3N0VmFsdmVGb3JtLmphdmEKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlOworCitpbXBvcnQgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZTsKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSByZW1vdGUgaG9zdCB2YWx2ZSBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSZW1vdGVIb3N0VmFsdmVGb3JtIGV4dGVuZHMgVmFsdmVGb3JtIHsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBhbGxvdyBob3N0cyBJUCBhZGRyZXNzZXMuCisgICAgICogQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybnMKKyAgICAgKiB0aGF0IHRoZSByZW1vdGUgY2xpZW50J3MgSVAgYWRkcmVzcyBpcyBjb21wYXJlZCB0by4gCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWxsb3cgPSAiIjsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgZGVueSBob3N0cyBJUCBhZGRyZXNzZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVueSA9ICIiOworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiA8Y29kZT5hbGxvdzwvY29kZT4gcmVndWxhciBleHByZXNzaW9ucyB3ZSB3aWxsIGV2YWx1YXRlLgorICAgICAqLworICAgIHByaXZhdGUgUGF0dGVybiBhbGxvd3NbXSA9IG5ldyBQYXR0ZXJuWzBdOworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiA8Y29kZT5kZW55PC9jb2RlPiByZWd1bGFyIGV4cHJlc3Npb25zIHdlIHdpbGwgZXZhbHVhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBQYXR0ZXJuIGRlbmllc1tdID0gbmV3IFBhdHRlcm5bMF07CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFsbG93IGhvc3RzIElQIGFkZGRyZXNzZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBbGxvdygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmFsbG93OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhbGxvdyBob3N0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGxvdyhTdHJpbmcgYWxsb3cpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuYWxsb3cgPSBhbGxvdzsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVueSBob3N0cyBJUCBhZGRkcmVzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVueSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmRlbnk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlbnkgaG9zdHMgSVAgYWRkcmVzc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlbnkoU3RyaW5nIGRlbnkpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuZGVueSA9IGRlbnk7CisgICAgICAgIAorICAgIH0gICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsKKyAgICAgICAgdGhpcy5hbGxvdyA9IG51bGw7CisgICAgICAgIHRoaXMuZGVueSA9IG51bGw7CisgICAgICAgIHRoaXMuYWxsb3dzID0gbnVsbDsKKyAgICAgICAgdGhpcy5kZW5pZXMgPSBudWxsOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVuZGVyIHRoaXMgb2JqZWN0IGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiUmVtb3RlSG9zdFZhbHZlRm9ybVthZG1pbkFjdGlvbj0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldEFkbWluQWN0aW9uKCkpOworICAgICAgICBzYi5hcHBlbmQoIicsdmFsdmVUeXBlPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0VmFsdmVUeXBlKCkpOworICAgICAgICBzYi5hcHBlbmQoIixhbGxvdz0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGFsbG93KTsKKyAgICAgICAgc2IuYXBwZW5kKCIsZGVueT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGRlbnkpOyAgICAgICAgCisgICAgICAgIHNiLmFwcGVuZCgiJyxvYmplY3ROYW1lPSciKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldE9iamVjdE5hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBmcm9tIHRoaXMgSFRUUCByZXF1ZXN0LAorICAgICAqIGFuZCByZXR1cm4gYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW55CisgICAgICogdmFsaWRhdGlvbiBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gZm91bmQuICBJZiBubyBlcnJvcnMgYXJlIGZvdW5kLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB3aXRoIG5vCisgICAgICogcmVjb3JkZWQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIAorICAgIHB1YmxpYyBBY3Rpb25FcnJvcnMgdmFsaWRhdGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIAorICAgICAgICBBY3Rpb25FcnJvcnMgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworICAgICAgICAKKyAgICAgICAgLy8gZnJvbnQgZW5kIHZhbGlkYXRpb24gd2hlbiBzYXZlIGlzIGNsaWNrZWQuICAgICAgICAKKyAgICAgICAgLy8gdmFsaWRhdGUgYWxsb3cvZGVueSBJUHMKKyAgICAgICAgaWYgKChhbGxvdyA9PSBudWxsKSB8fCAoYWxsb3cubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgaWYgKChkZW55ID09IG51bGwpIHx8IChkZW55Lmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJhbGxvdyIsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLmFsbG93LmRlbnkucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFsbG93cyA9IFZhbHZlVXRpbC5wcmVjYWxjdWxhdGUoYWxsb3cpOyAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgiYWxsb3ciLCBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3Iuc3ludGF4IikpOworICAgICAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgIHRyeSB7ICAgCisgICAgICAgICAgICBkZW5pZXMgPSBWYWx2ZVV0aWwucHJlY2FsY3VsYXRlKGRlbnkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgiYWxsb3ciLCBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3Iuc3ludGF4IikpOworICAgICAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgICAKKyAgICAgICAgU3RyaW5nIGhvc3QgPSByZXF1ZXN0LmdldFJlbW90ZUhvc3QoKTsKKyAgICAgICAgLy8gY2hlY2sgZm9yIElQIGFkZHJlc3MgYWxzbyBpbiBjYXNlIEROUyBpcyBub3QgY29uZmlndXJlZCAKKyAgICAgICAgLy8gdG8gZ2l2ZSBhIGhvc3QgbmFtZSBmb3IgdGhlIGNsaWVudCBtYWNoaW5lCisgICAgICAgIFN0cmluZyBpcCA9IHJlcXVlc3QuZ2V0UmVtb3RlQWRkcigpOworICAgIAorICAgICAgICBpZiAoaG9zdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3JzOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbmllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGRlbmllc1tpXS5tYXRjaGVyKGhvc3QpLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgIGlmIChhbGxvd3MubGVuZ3RoIDwgMSkgeworICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJkZW55IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5kZW55SG9zdCIpKTsKKyAgICAgICAgICAgICAgICB9ICAgIAorICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYWxsb3dzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYWxsb3dzW2pdLm1hdGNoZXIoaG9zdCkubWF0Y2hlcygpKSB7IAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiZGVueSIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IuZGVueUhvc3QiKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlbmllc1tpXS5tYXRjaGVyKGlwKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYWxsb3dzLmxlbmd0aCA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiZGVueSIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uTWVzc2FnZSgiZXJyb3IuZGVueUhvc3QiKSk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYWxsb3dzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYWxsb3dzW2pdLm1hdGNoZXIoaXApLm1hdGNoZXMoKSkgeyAKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImRlbnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLmRlbnlIb3N0IikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBib29sZWFuIGFsbG93TWF0Y2ggPSB0cnVlOworICAgICAgICAKKyAgICAgICAgaWYgKChhbGxvd3MgIT0gbnVsbCkgJiYgKGFsbG93cy5sZW5ndGggPiAwKSkgeworICAgICAgICAgICAgYWxsb3dNYXRjaCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbG93cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGFsbG93c1tpXS5tYXRjaGVyKGhvc3QpLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgIGFsbG93TWF0Y2ggPSB0cnVlOyAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFhbGxvd01hdGNoKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJhbGxvdyIsIG5ldyBBY3Rpb25NZXNzYWdlKCJlcnJvci5hbGxvd0hvc3QiKSk7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvUmVxdWVzdER1bXBlclZhbHZlRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1JlcXVlc3REdW1wZXJWYWx2ZUZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmU1Y2U4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1JlcXVlc3REdW1wZXJWYWx2ZUZvcm0uamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBSZXF1ZXN0IER1bXBlciB2YWx2ZSBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXF1ZXN0RHVtcGVyVmFsdmVGb3JtIGV4dGVuZHMgVmFsdmVGb3JtIHsKKyAgICAgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKyAgICAKKyAgICAgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJlbmRlciB0aGlzIG9iamVjdCBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlJlcXVlc3REdW1wZXJWYWx2ZUZvcm1bYWRtaW5BY3Rpb249Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRBZG1pbkFjdGlvbigpKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHZhbHZlVHlwZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldFZhbHZlVHlwZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLG9iamVjdE5hbWU9JyIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IGZyb20gdGhpcyBIVFRQIHJlcXVlc3QsCisgICAgICogYW5kIHJldHVybiBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbnkKKyAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBmb3VuZC4gIElmIG5vIGVycm9ycyBhcmUgZm91bmQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHdpdGggbm8KKyAgICAgKiByZWNvcmRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgc3VibWl0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInN1Ym1pdCIpOworICAgICAgICAKKyAgICAgICAgLy8gZnJvbnQgZW5kIHZhbGlkYXRpb24gd2hlbiBzYXZlIGlzIGNsaWNrZWQuICAgICAgICAKKyAgICAgICAgIGlmIChzdWJtaXQgIT0gbnVsbCkgeworICAgICAgICAgLy8gbm8gdmFsaWRhdGlvbiBuZWVkZWQKKyAgICAgICAgfQorICAgICAgICAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvU2F2ZUFjY2Vzc0xvZ1ZhbHZlQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvU2F2ZUFjY2Vzc0xvZ1ZhbHZlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjZDkzZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9TYXZlQWNjZXNzTG9nVmFsdmVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IGNvbXBsZXRlcyA8ZW0+QWRkIFZhbHZlPC9lbT4gYW5kCisgKiA8ZW0+RWRpdCBWYWx2ZTwvZW0+IHRyYW5zYWN0aW9ucyBmb3IgQWNjZXNzTG9nIHZhbHZlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYXZlQWNjZXNzTG9nVmFsdmVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBleGVjdXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBJZGVudGlmeSB0aGUgcmVxdWVzdGVkIGFjdGlvbgorICAgICAgICBBY2Nlc3NMb2dWYWx2ZUZvcm0gdmZvcm0gPSAoQWNjZXNzTG9nVmFsdmVGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgYWRtaW5BY3Rpb24gPSB2Zm9ybS5nZXRBZG1pbkFjdGlvbigpOworICAgICAgICBTdHJpbmcgdk9iamVjdE5hbWUgPSB2Zm9ybS5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgIFN0cmluZyBwYXJlbnQgPSB2Zm9ybS5nZXRQYXJlbnRPYmplY3ROYW1lKCk7CisgICAgICAgIFN0cmluZyB2YWx2ZVR5cGUgPSB2Zm9ybS5nZXRWYWx2ZVR5cGUoKTsKKyAgICAgICAgCisgICAgICAgIC8vIFBlcmZvcm0gYSAiQ3JlYXRlIFZhbHZlIiB0cmFuc2FjdGlvbiAoaWYgcmVxdWVzdGVkKQorICAgICAgICBpZiAoIkNyZWF0ZSIuZXF1YWxzKGFkbWluQWN0aW9uKSkgeworICAgICAgICAKKyAgICAgICAgICAgIHZPYmplY3ROYW1lID0gVmFsdmVVdGlsLmNyZWF0ZVZhbHZlKHBhcmVudCwgdmFsdmVUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UsIHJlcXVlc3QsIG1hcHBpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpOworICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYXR0cmlidXRlIHVwZGF0ZXMgYXMgcmVxdWVzdGVkCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAKKyAgICAgICAgICAgIE9iamVjdE5hbWUgdm9uYW1lID0gbmV3IE9iamVjdE5hbWUodk9iamVjdE5hbWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZGlyZWN0b3J5IjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZSh2b25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiZGlyZWN0b3J5IiwgdmZvcm0uZ2V0RGlyZWN0b3J5KCkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwYXR0ZXJuIjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZSh2b25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJwYXR0ZXJuIiwgdmZvcm0uZ2V0UGF0dGVybigpKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicHJlZml4IjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZSh2b25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJwcmVmaXgiLCB2Zm9ybS5nZXRQcmVmaXgoKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInN1ZmZpeCI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUodm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgic3VmZml4IiwgdmZvcm0uZ2V0U3VmZml4KCkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJyZXNvbHZlSG9zdHMiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHZvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInJlc29sdmVIb3N0cyIsIG5ldyBCb29sZWFuKHZmb3JtLmdldFJlc29sdmVIb3N0cygpKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInJvdGF0YWJsZSI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUodm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgicm90YXRhYmxlIiwgbmV3IEJvb2xlYW4odmZvcm0uZ2V0Um90YXRhYmxlKCkpKSk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgc3VjY2VzcyByZXBvcnRpbmcgcGFnZQorICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShtYXBwaW5nLmdldEF0dHJpYnV0ZSgpKTsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFN1Y2Nlc3NmdWwiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1NhdmVSZW1vdGVBZGRyVmFsdmVBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9TYXZlUmVtb3RlQWRkclZhbHZlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4NzkzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9TYXZlUmVtb3RlQWRkclZhbHZlQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkFkZCBWYWx2ZTwvZW0+IGFuZAorICogPGVtPkVkaXQgVmFsdmU8L2VtPiB0cmFuc2FjdGlvbnMgZm9yIFJlbW90ZSBBZGRyIHZhbHZlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYXZlUmVtb3RlQWRkclZhbHZlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgZXhlY3V0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3RlZCBhY3Rpb24KKyAgICAgICAgUmVtb3RlQWRkclZhbHZlRm9ybSB2Zm9ybSA9IChSZW1vdGVBZGRyVmFsdmVGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgYWRtaW5BY3Rpb24gPSB2Zm9ybS5nZXRBZG1pbkFjdGlvbigpOworICAgICAgICBTdHJpbmcgdk9iamVjdE5hbWUgPSB2Zm9ybS5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgIFN0cmluZyBwYXJlbnQgPSB2Zm9ybS5nZXRQYXJlbnRPYmplY3ROYW1lKCk7CisgICAgICAgIFN0cmluZyB2YWx2ZVR5cGUgPSB2Zm9ybS5nZXRWYWx2ZVR5cGUoKTsKKyAgICAgICAgICAgICAgIAorICAgICAgICAvLyBQZXJmb3JtIGEgIkNyZWF0ZSBWYWx2ZSIgdHJhbnNhY3Rpb24gKGlmIHJlcXVlc3RlZCkKKyAgICAgICAgaWYgKCJDcmVhdGUiLmVxdWFscyhhZG1pbkFjdGlvbikpIHsKKworICAgICAgICAgICAgdk9iamVjdE5hbWUgPSBWYWx2ZVV0aWwuY3JlYXRlVmFsdmUocGFyZW50LCB2YWx2ZVR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSwgcmVxdWVzdCwgbWFwcGluZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSk7CisgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhdHRyaWJ1dGUgdXBkYXRlcyBhcyByZXF1ZXN0ZWQKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgIAorICAgICAgICAgICAgT2JqZWN0TmFtZSB2b25hbWUgPSBuZXcgT2JqZWN0TmFtZSh2T2JqZWN0TmFtZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJhbGxvdyI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUodm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImFsbG93IiwgdmZvcm0uZ2V0QWxsb3coKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImRlbnkiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHZvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiZGVueSIsIHZmb3JtLmdldERlbnkoKSkpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHN1Y2Nlc3MgcmVwb3J0aW5nIHBhZ2UKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUobWFwcGluZy5nZXRBdHRyaWJ1dGUoKSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2F2ZSBTdWNjZXNzZnVsIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9TYXZlUmVtb3RlSG9zdFZhbHZlQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvU2F2ZVJlbW90ZUhvc3RWYWx2ZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NTlmMDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvU2F2ZVJlbW90ZUhvc3RWYWx2ZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZTsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgY29tcGxldGVzIDxlbT5BZGQgVmFsdmU8L2VtPiBhbmQKKyAqIDxlbT5FZGl0IFZhbHZlPC9lbT4gdHJhbnNhY3Rpb25zIGZvciBSZW1vdGUgSG9zdCB2YWx2ZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZVJlbW90ZUhvc3RWYWx2ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSByZXF1ZXN0ZWQgYWN0aW9uCisgICAgICAgIFJlbW90ZUhvc3RWYWx2ZUZvcm0gdmZvcm0gPSAoUmVtb3RlSG9zdFZhbHZlRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIGFkbWluQWN0aW9uID0gdmZvcm0uZ2V0QWRtaW5BY3Rpb24oKTsKKyAgICAgICAgU3RyaW5nIHZPYmplY3ROYW1lID0gdmZvcm0uZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICBTdHJpbmcgcGFyZW50ID0gdmZvcm0uZ2V0UGFyZW50T2JqZWN0TmFtZSgpOworICAgICAgICBTdHJpbmcgdmFsdmVUeXBlID0gdmZvcm0uZ2V0VmFsdmVUeXBlKCk7CisgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gUGVyZm9ybSBhICJDcmVhdGUgVmFsdmUiIHRyYW5zYWN0aW9uIChpZiByZXF1ZXN0ZWQpCisgICAgICAgIGlmICgiQ3JlYXRlIi5lcXVhbHMoYWRtaW5BY3Rpb24pKSB7CisKKyAgICAgICAgICAgIHZPYmplY3ROYW1lID0gVmFsdmVVdGlsLmNyZWF0ZVZhbHZlKHBhcmVudCwgdmFsdmVUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UsIHJlcXVlc3QsIG1hcHBpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpOworICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYXR0cmlidXRlIHVwZGF0ZXMgYXMgcmVxdWVzdGVkCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAKKyAgICAgICAgICAgIE9iamVjdE5hbWUgdm9uYW1lID0gbmV3IE9iamVjdE5hbWUodk9iamVjdE5hbWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiYWxsb3ciOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHZvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJhbGxvdyIsIHZmb3JtLmdldEFsbG93KCkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkZW55IjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZSh2b25hbWUsCisgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImRlbnkiLCB2Zm9ybS5nZXREZW55KCkpKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzdWNjZXNzIHJlcG9ydGluZyBwYWdlCisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG1hcHBpbmcuZ2V0QXR0cmlidXRlKCkpOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvU2F2ZVJlcXVlc3REdW1wZXJWYWx2ZUFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1NhdmVSZXF1ZXN0RHVtcGVyVmFsdmVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjliZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1NhdmVSZXF1ZXN0RHVtcGVyVmFsdmVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgY29tcGxldGVzIDxlbT5BZGQgVmFsdmU8L2VtPiBhbmQKKyAqIDxlbT5FZGl0IFZhbHZlPC9lbT4gdHJhbnNhY3Rpb25zIGZvciBSZXF1ZXN0IER1bXBlciB2YWx2ZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZVJlcXVlc3REdW1wZXJWYWx2ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIAorICAgICAgICAvLyBJZGVudGlmeSB0aGUgcmVxdWVzdGVkIGFjdGlvbgorICAgICAgICBSZXF1ZXN0RHVtcGVyVmFsdmVGb3JtIHZmb3JtID0gKFJlcXVlc3REdW1wZXJWYWx2ZUZvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBhZG1pbkFjdGlvbiA9IHZmb3JtLmdldEFkbWluQWN0aW9uKCk7CisgICAgICAgIFN0cmluZyBwYXJlbnQgPSB2Zm9ybS5nZXRQYXJlbnRPYmplY3ROYW1lKCk7CisgICAgICAgIFN0cmluZyB2YWx2ZVR5cGUgPSB2Zm9ybS5nZXRWYWx2ZVR5cGUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAvLyBQZXJmb3JtIGEgIkNyZWF0ZSBWYWx2ZSIgdHJhbnNhY3Rpb24gKGlmIHJlcXVlc3RlZCkKKyAgICAgICAgaWYgKCJDcmVhdGUiLmVxdWFscyhhZG1pbkFjdGlvbikpIHsKKyAgICAgICAgCisgICAgICAgICAgICBWYWx2ZVV0aWwuY3JlYXRlVmFsdmUocGFyZW50LCB2YWx2ZVR5cGUsIHJlc3BvbnNlLCByZXF1ZXN0LCBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpOworICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHN1Y2Nlc3MgcmVwb3J0aW5nIHBhZ2UKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUobWFwcGluZy5nZXRBdHRyaWJ1dGUoKSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2F2ZSBTdWNjZXNzZnVsIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9TYXZlU2luZ2xlU2lnbk9uVmFsdmVBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9TYXZlU2luZ2xlU2lnbk9uVmFsdmVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTc2ZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1NhdmVTaW5nbGVTaWduT25WYWx2ZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZTsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IGNvbXBsZXRlcyA8ZW0+QWRkIFZhbHZlPC9lbT4gYW5kCisgKiA8ZW0+RWRpdCBWYWx2ZTwvZW0+IHRyYW5zYWN0aW9ucyBmb3IgU2luZ2xlIFNpZ24gT24gdmFsdmUuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVTaW5nbGVTaWduT25WYWx2ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIGV4ZWN1dGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSByZXF1ZXN0ZWQgYWN0aW9uCisgICAgICAgIFNpbmdsZVNpZ25PblZhbHZlRm9ybSB2Zm9ybSA9IChTaW5nbGVTaWduT25WYWx2ZUZvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBhZG1pbkFjdGlvbiA9IHZmb3JtLmdldEFkbWluQWN0aW9uKCk7CisgICAgICAgIFN0cmluZyBwYXJlbnQgPSB2Zm9ybS5nZXRQYXJlbnRPYmplY3ROYW1lKCk7CisgICAgICAgIFN0cmluZyB2YWx2ZVR5cGUgPSB2Zm9ybS5nZXRWYWx2ZVR5cGUoKTsKKyAgICAgICAgICAgICAgIAorICAgICAgICAvLyBQZXJmb3JtIGEgIkNyZWF0ZSBWYWx2ZSIgdHJhbnNhY3Rpb24gKGlmIHJlcXVlc3RlZCkKKyAgICAgICAgaWYgKCJDcmVhdGUiLmVxdWFscyhhZG1pbkFjdGlvbikpIHsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBvbmx5IG9uZSBzaW5nbGUgc2lnbiBvbiB2YWx2ZSBleGlzdHMKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsgCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdE5hbWUocG5hbWUuZ2V0RG9tYWluKCkgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6dHlwZT1WYWx2ZSxuYW1lPVNpbmdsZVNpZ25PbiIpOyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChtQlNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFjdGlvbk1lc3NhZ2VzIGVycm9ycyA9IG5ldyBBY3Rpb25NZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJzaW5nbGVTaWduT25WYWx2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1lc3NhZ2UoImVycm9yLnNpbmdsZVNpZ25Pbi5leGlzdHMiKSk7CisgICAgICAgICAgICAgICAgICAgIHNhdmVFcnJvcnMocmVxdWVzdCwgZXJyb3JzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgQWN0aW9uRm9yd2FyZChtYXBwaW5nLmdldElucHV0KCkpKTsKKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtaW5BY3Rpb24pLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkbWluQWN0aW9uKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBWYWx2ZVV0aWwuY3JlYXRlVmFsdmUocGFyZW50LCB2YWx2ZVR5cGUsIHJlc3BvbnNlLCByZXF1ZXN0LCBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpOworICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgc3VjY2VzcyByZXBvcnRpbmcgcGFnZQorICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShtYXBwaW5nLmdldEF0dHJpYnV0ZSgpKTsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFN1Y2Nlc3NmdWwiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1NpbmdsZVNpZ25PblZhbHZlRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1NpbmdsZVNpZ25PblZhbHZlRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MTFkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvU2luZ2xlU2lnbk9uVmFsdmVGb3JtLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmU7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgc2luZ2xlIHNpZ24gb24gdmFsdmUgcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2luZ2xlU2lnbk9uVmFsdmVGb3JtIGV4dGVuZHMgVmFsdmVGb3JtIHsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVuZGVyIHRoaXMgb2JqZWN0IGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiU2luZ2xlU2lnbk9uVmFsdmVGb3JtW2FkbWluQWN0aW9uPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0QWRtaW5BY3Rpb24oKSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyx2YWx2ZVR5cGU9Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRWYWx2ZVR5cGUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyxvYmplY3ROYW1lPSciKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldE9iamVjdE5hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBmcm9tIHRoaXMgSFRUUCByZXF1ZXN0LAorICAgICAqIGFuZCByZXR1cm4gYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW55CisgICAgICogdmFsaWRhdGlvbiBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gZm91bmQuICBJZiBubyBlcnJvcnMgYXJlIGZvdW5kLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB3aXRoIG5vCisgICAgICogcmVjb3JkZWQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIAorICAgIHB1YmxpYyBBY3Rpb25FcnJvcnMgdmFsaWRhdGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIAorICAgICAgICBBY3Rpb25FcnJvcnMgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHN1Ym1pdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzdWJtaXQiKTsKKyAgICAgICAgCisgICAgICAgIC8vIGZyb250IGVuZCB2YWxpZGF0aW9uIHdoZW4gc2F2ZSBpcyBjbGlja2VkLiAgICAgICAgCisgICAgICAgICBpZiAoc3VibWl0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAvLyBubyB2YWxpZGF0aW9uIG5lZWRlZAorICAgICAgICAgfQorICAgICAgICAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvVmFsdmVGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvVmFsdmVGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RjMjU4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9WYWx2ZUZvcm0uamF2YQpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmU7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGdlbmVyaWMgdmFsdmUgcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVmFsdmVGb3JtIGV4dGVuZHMgQWN0aW9uRm9ybSB7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgCisgICAvKioKKyAgICAgKiBUaGUgYWRtaW5pc3RyYXRpdmUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9ybS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhZG1pbkFjdGlvbiA9ICJFZGl0IjsKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZSBvZiB0aGUgdmFsdmUgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBvYmplY3ROYW1lID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgdmFsdmUgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB2YWx2ZVR5cGUgPSBudWxsOworICAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIG5vZGUgbGFiZWwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbm9kZUxhYmVsID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWUgb2YgdGhlIHBhcmVudCBvZiB0aGlzIHZhbHZlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhcmVudE9iamVjdE5hbWUgPSBudWxsOworCisgICAgLyoqCisgICAgICogU2V0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdmFsdmVzLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdCB2YWx2ZVR5cGVWYWxzID0gbnVsbDsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWRtaW5pc3RyYXRpdmUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9ybS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFkbWluQWN0aW9uKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmFkbWluQWN0aW9uOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFkbWluQWN0aW9uKFN0cmluZyBhZG1pbkFjdGlvbikgeworCisgICAgICAgIHRoaXMuYWRtaW5BY3Rpb24gPSBhZG1pbkFjdGlvbjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgT2JqZWN0IE5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPYmplY3ROYW1lKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0TmFtZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgT2JqZWN0IE5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0TmFtZShTdHJpbmcgb2JqZWN0TmFtZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5vYmplY3ROYW1lID0gb2JqZWN0TmFtZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdmUgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHZlVHlwZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnZhbHZlVHlwZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdmUgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx2ZVR5cGUoU3RyaW5nIHZhbHZlVHlwZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy52YWx2ZVR5cGUgPSB2YWx2ZVR5cGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxhYmVsIG9mIHRoZSBub2RlIHRoYXQgd2FzIGNsaWNrZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROb2RlTGFiZWwoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5ub2RlTGFiZWw7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5vZGUgbGFiZWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9kZUxhYmVsKFN0cmluZyBub2RlTGFiZWwpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMubm9kZUxhYmVsID0gbm9kZUxhYmVsOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXJlbnQgb2JqZWN0IG5hbWUgb2YgdGhlIHZhbHZlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnRPYmplY3ROYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnBhcmVudE9iamVjdE5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFyZW50IG9iamVjdCBuYW1lIG9mIHRoZSB2YWx2ZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudE9iamVjdE5hbWUoU3RyaW5nIHBhcmVudE9iamVjdE5hbWUpIHsKKworICAgICAgICB0aGlzLnBhcmVudE9iamVjdE5hbWUgPSBwYXJlbnRPYmplY3ROYW1lOworCisgICAgfQorICAgIAorICAgICAgICAKKyAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdmVUeXBlVmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRWYWx2ZVR5cGVWYWxzKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMudmFsdmVUeXBlVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdmVUeXBlVmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx2ZVR5cGVWYWxzKExpc3QgdmFsdmVUeXBlVmFscykgeworICAgICAgICAKKyAgICAgICAgdGhpcy52YWx2ZVR5cGVWYWxzID0gdmFsdmVUeXBlVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIAorICAgICAgICBvYmplY3ROYW1lID0gbnVsbDsKKyAgICAgICAgCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvVmFsdmVVdGlsLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvVmFsdmVVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxZjQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9WYWx2ZVV0aWwuamF2YQpAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmU7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2w7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2xOb2RlOworCisvKioKKyAqIEEgdXRpbGl0eSBjbGFzcyB0aGF0IGNvbnRhaW5zIG1ldGhvZHMgY29tbW9uIGFjcm9zcyB2YWx2ZXMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFZhbHZlVXRpbCB7CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+Y3JlYXRlU3RhbmRhcmRWYWx2ZTwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVTdGFuZGFyZFZhbHZlVHlwZXNbXSA9CisgICAgeyAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBwYXJlbnQKKyAgICB9OworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVZhbHZlKFN0cmluZyBwYXJlbnQsIFN0cmluZyB2YWx2ZVR5cGUsCisgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBBcHBsaWNhdGlvblNlcnZsZXQgc2VydmxldCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSAoTWVzc2FnZVJlc291cmNlcykKKyAgICAgICAgICAgIHNlcnZsZXQuZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGUoR2xvYmFscy5NRVNTQUdFU19LRVkpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIAorICAgICAgICBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSAoTG9jYWxlKSBzZXNzaW9uLmdldEF0dHJpYnV0ZShHbG9iYWxzLkxPQ0FMRV9LRVkpOworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gc2VydmxldC5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHZPYmplY3ROYW1lID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgcGFyZW50Tm9kZU5hbWUgPSBwYXJlbnQ7CisgICAgICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIocG5hbWUuZ2V0RG9tYWluKCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBGb3Igc2VydmljZSwgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEVuZ2luZSBtQmVhbgorICAgICAgICAgICAgLy8gUGFyZW50IGluIHRoaXMgY2FzZSBuZWVkcyB0byBiZSB0aGUgY29udGFpbmVyIG1CZWFuIGZvciB0aGUgc2VydmljZQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoIlNlcnZpY2UiLmVxdWFsc0lnbm9yZUNhc2UocG5hbWUuZ2V0S2V5UHJvcGVydHkoInR5cGUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI6dHlwZT1FbmdpbmUiKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gcmVzb3VyY2VzLmdldE1lc3NhZ2UoImVycm9yLmVuZ2luZU5hbWUuYmFkIiwKKyAgICAgICAgICAgICAgICBzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBzZXJ2bGV0LmxvZyhtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0gICAgCisgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcmVxdWVzdGVkIHZhbHZlIG5hbWUgaXMgdW5pcXVlCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFRCRCAtLSBkbyB3ZSBuZWVkIHRoaXMgY2hlY2s/CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICBuZXcgT2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKyAgICAgICAgICAgIGlmIChtQlNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJ2YWx2ZU5hbWUiLAorICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLnZhbHZlTmFtZS5leGlzdHMiKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJlcnJvci52YWx2ZU5hbWUuZXhpc3RzIiwgc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1lc3NhZ2UpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBY3Rpb25Gb3J3YXJkKG1hcHBpbmcuZ2V0SW5wdXQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHBuYW1lLmdldERvbWFpbigpOworICAgICAgICAgICAgLy8gTG9vayB1cCBvdXIgTUJlYW5GYWN0b3J5IE1CZWFuCisgICAgICAgICAgICBPYmplY3ROYW1lIGZuYW1lID0gVG9tY2F0VHJlZUJ1aWxkZXIuZ2V0TUJlYW5GYWN0b3J5KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBTdGFuZGFyZFZhbHZlIG9iamVjdAorICAgICAgICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhbHVlc1swXSA9IHBhcmVudDsgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBvcGVyYXRpb24gPSAiY3JlYXRlIiArIHZhbHZlVHlwZTsKKyAgICAgICAgICAgIGlmICgiQWNjZXNzTG9nVmFsdmUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdmVUeXBlKSkKKyAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAiY3JlYXRlQWNjZXNzTG9nZ2VyVmFsdmUiOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdk9iamVjdE5hbWUgPSAoU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuaW52b2tlKGZuYW1lLCBvcGVyYXRpb24sIHZhbHVlcywgY3JlYXRlU3RhbmRhcmRWYWx2ZVR5cGVzKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQWRkIHRoZSBuZXcgVmFsdmUgdG8gb3VyIHRyZWUgY29udHJvbCBub2RlCisgICAgICAgICAgICBUcmVlQ29udHJvbCBjb250cm9sID0gKFRyZWVDb250cm9sKQorICAgICAgICAgICAgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoInRyZWVDb250cm9sVGVzdCIpOworICAgICAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBwYXJlbnROb2RlID0gY29udHJvbC5maW5kTm9kZShwYXJlbnROb2RlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm9kZUxhYmVsID0KKyAgICAgICAgICAgICAgICAgICAgIlZhbHZlIGZvciAiICsgcGFyZW50Tm9kZS5nZXRMYWJlbCgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RlZE5hbWUgPQorICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh2T2JqZWN0TmFtZSxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpOworICAgICAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgY2hpbGROb2RlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFRyZWVDb250cm9sTm9kZSh2T2JqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIlZhbHZlLmdpZiIsCisgICAgICAgICAgICAgICAgICAgIG5vZGVMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgIkVkaXRWYWx2ZS5kbz9zZWxlY3Q9IiArIGVuY29kZWROYW1lICsKKyAgICAgICAgICAgICAgICAgICAgIiZub2RlTGFiZWw9IiArIFVSTEVuY29kZXIuZW5jb2RlKG5vZGVMYWJlbCxUb21jYXRUcmVlQnVpbGRlci5VUkxfRU5DT0RJTkcpICsKKyAgICAgICAgICAgICAgICAgICAgIiZwYXJlbnQ9IiArIFVSTEVuY29kZXIuZW5jb2RlKHBhcmVudE5vZGVOYW1lLFRvbWNhdFRyZWVCdWlsZGVyLlVSTF9FTkNPRElORyksCisgICAgICAgICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZG9tYWluKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5hZGRDaGlsZChjaGlsZE5vZGUpOworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSAtIGZvcmNlIGEgcmVkaXNwbGF5CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmxldC5sb2cKKyAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgZmluZCBwYXJlbnQgbm9kZSAnIiArIHBhcmVudE5vZGVOYW1lICsgIiciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlcnZsZXQubG9nCisgICAgICAgICAgICAgICAgKCJDYW5ub3QgZmluZCBUcmVlQ29udHJvbE5vZGUhIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2VydmxldC5sb2cKKyAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgb3BlcmF0aW9uKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgc3VjY2VzcyByZXBvcnRpbmcgcGFnZQorICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShtYXBwaW5nLmdldEF0dHJpYnV0ZSgpKTsKKyAgICAgICAgcmV0dXJuIHZPYmplY3ROYW1lOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcnJheSBvZiByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0cyBpbml0aWFsaXplZCBmcm9tIHRoZQorICAgICAqIHNwZWNpZmllZCBhcmd1bWVudCwgd2hpY2ggbXVzdCBiZSA8Y29kZT5udWxsPC9jb2RlPiBvciBhIGNvbW1hLWRlbGltaXRlZAorICAgICAqIGxpc3Qgb2YgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3QgVGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBvbmUgb2YgdGhlIHBhdHRlcm5zIGhhcworICAgICAqICBpbnZhbGlkIHN5bnRheAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGF0dGVybltdIHByZWNhbGN1bGF0ZShTdHJpbmcgbGlzdCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobGlzdCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChuZXcgUGF0dGVyblswXSk7CisgICAgICAgIGxpc3QgPSBsaXN0LnRyaW0oKTsKKyAgICAgICAgaWYgKGxpc3QubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgcmV0dXJuIChuZXcgUGF0dGVyblswXSk7CisgICAgICAgIGxpc3QgKz0gIiwiOworCisgICAgICAgIEFycmF5TGlzdCByZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHdoaWxlIChsaXN0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgaW50IGNvbW1hID0gbGlzdC5pbmRleE9mKCcsJyk7CisgICAgICAgICAgICBpZiAoY29tbWEgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBsaXN0LnN1YnN0cmluZygwLCBjb21tYSkudHJpbSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZUxpc3QuYWRkKFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuKSk7CisgICAgICAgICAgICB9IGNhdGNoIChQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiU3ludGF4IGVycm9yIGluIHJlcXVlc3QgZmlsdGVyIHBhdHRlcm4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3QgPSBsaXN0LnN1YnN0cmluZyhjb21tYSArIDEpOworICAgICAgICB9CisKKyAgICAgICAgUGF0dGVybiByZUFycmF5W10gPSBuZXcgUGF0dGVybltyZUxpc3Quc2l6ZSgpXTsKKyAgICAgICAgcmV0dXJuICgoUGF0dGVybltdKSByZUxpc3QudG9BcnJheShyZUFycmF5KSk7CisKKyAgICB9ICAgIAorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T2JqZWN0TmFtZShTdHJpbmcgcGFyZW50LCBTdHJpbmcgTUJlYW5UeXBlKQorICAgIHRocm93cyBFeGNlcHRpb257CisgICAgICAgIAorICAgICAgICAvLyBGb3JtIHRoZSBwYXR0ZXJuIHRoYXQgZ2V0cyB0aGUgbG9nZ2VyIGZvciB0aGlzIHBhcnRpY3VsYXIKKyAgICAgICAgLy8gc2VydmljZSwgaG9zdCBvciBjb250ZXh0LgorICAgICAgICBPYmplY3ROYW1lIHBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgIFN0cmluZyBkb21haW4gPSBwb25hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoZG9tYWluK01CZWFuVHlwZSk7CisgICAgICAgIFN0cmluZyB0eXBlID0gcG9uYW1lLmdldEtleVByb3BlcnR5KCJ0eXBlIik7CisgICAgICAgIFN0cmluZyBqMmVlVHlwZSA9IHBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgiajJlZVR5cGUiKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSAiIjsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSAiIjsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBwb25hbWUuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgaWYgKChuYW1lICE9IG51bGwpICYmIChuYW1lLmxlbmd0aCgpID4gMCkpIHsKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygyKTsKKyAgICAgICAgICAgIGludCBpID0gbmFtZS5pbmRleE9mKCIvIik7CisgICAgICAgICAgICBob3N0ID0gbmFtZS5zdWJzdHJpbmcoMCxpKTsKKyAgICAgICAgICAgIHBhdGggPSBuYW1lLnN1YnN0cmluZyhpKTsgCisgICAgICAgIH0KKyAgICAgICAgaWYgKCJXZWJNb2R1bGUiLmVxdWFsc0lnbm9yZUNhc2UoajJlZVR5cGUpKSB7IC8vIGNvbnRhaW5lciBpcyBjb250ZXh0ICAgICAgICAgICAgCisgICAgICAgICAgICBzYi5hcHBlbmQoIixwYXRoPSIrcGF0aCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIixob3N0PSIraG9zdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCJIb3N0Ii5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7ICAgIC8vIGNvbnRhaW5lciBpcyBob3N0CisgICAgICAgICAgICBzYi5hcHBlbmQoIixob3N0PSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIlNlcnZpY2UiLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsgIC8vIGNvbnRhaW5lciBpcyBzZXJ2aWNlCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7ICAKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9WYWx2ZXNGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvVmFsdmVzRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNzU1YzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvVmFsdmVzRm9ybS5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciBkZWxldGluZyB2YWx2ZXMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFZhbHZlc0Zvcm0gZXh0ZW5kcyBBY3Rpb25Gb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZXMgb2YgdGhlIHZhbHZlcyB0byBiZSBkZWxldGVkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHZhbHZlc1tdID0gbmV3IFN0cmluZ1swXTsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx2ZXMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy52YWx2ZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHZlcyhTdHJpbmcgdmFsdmVzW10pIHsKKyAgICAgICAgdGhpcy52YWx2ZXMgPSB2YWx2ZXM7CisgICAgfQorCisgICAgIC8qIAorICAgICAgKiBUaGUgcGFyZW50IG9iamVjdCBuYW1lIG9mIHRoZSB2YWx2ZSB0byBiZSBkZWxldGVkLiAKKyAgICAgICovCisgICAKKyAgICBwcml2YXRlIFN0cmluZyBwYXJlbnRPYmplY3ROYW1lID0gbnVsbDsKKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudE9iamVjdE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wYXJlbnRPYmplY3ROYW1lKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50T2JqZWN0TmFtZShTdHJpbmcgcGFyZW50T2JqZWN0TmFtZSkgeworICAgICAgICB0aGlzLnBhcmVudE9iamVjdE5hbWUgPSBwYXJlbnRPYmplY3ROYW1lOworICAgIH0KKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICB0aGlzLnZhbHZlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIHRoaXMucGFyZW50T2JqZWN0TmFtZSA9IG51bGw7CisgICAgfQorICAgICAgICAKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jb250cm9scy50bGQgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NvbnRyb2xzLnRsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjdkZmFmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jb250cm9scy50bGQKQEAgLTAsMCArMSw0MTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgdGFnbGliCisgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIgorICAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiPgorCis8dGFnbGliPgorCisgIDx0bGliLXZlcnNpb24+MS4wPC90bGliLXZlcnNpb24+CisgIDxqc3AtdmVyc2lvbj4xLjI8L2pzcC12ZXJzaW9uPgorICA8c2hvcnQtbmFtZT5jb250cm9sczwvc2hvcnQtbmFtZT4KKyAgPGRlc2NyaXB0aW9uPgorICAgIEpTUCB0YWcgbGlicmFyeSBjb250YWluaW5nIGN1c3RvbSBHVUkgY29udHJvbHMgdXNlZCBpbiB0aGUKKyAgICBUb21jYXQgQWRtaW5pc3RyYXRpdmUgQXBwbGljYXRpb24uCisgIDwvZGVzY3JpcHRpb24+CisKKyAgPCEtLSA9PT09PT09PT09IEluc3RhbnQgVGFibGUgVGFnID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHRhZz4KKworICAgIDxuYW1lPnRhYmxlPC9uYW1lPgorICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVGFibGVUYWc8L3RhZy1jbGFzcz4KKyAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgIFJlbmRlciBhICJ0YWJsZSIgb2JqZWN0LCB3aGljaCBpcyByZW5kZXJlZCBhcyBhbiBIVE1MCisgICAgICAidGFibGUiIGVsZW1lbnQuIAorICAgICAgCisgICAgICBOT1RFOiAgVGhlIG9ubHkgdmFsaWQgbmVzdGVkIGNvbnRlbnQgZm9yIHRoaXMgdGFnIGlzCisgICAgICAicm93IiB0YWdzIGZyb20gdGhpcyBsaWJyYXJ5LiAgQW55dGhpbmcgZWxzZSB3aWxsIGNhdXNlCisgICAgICB0aGUgcmVuZGVyZWQgSFRNTCB0byBiZSBpbnZhbGlkLgorCisgICAgICBOT1RFOiAgVG8gYmUgdXNhYmxlLCB0aGlzIHRhZyBtdXN0IGJlIG5lc3RlZCBpbnNpZGUgYW4KKyAgICAgIEhUTUwgJmx0O2Zvcm0mZ3Q7IGVsZW1lbnQuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5jb2x1bW5zPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgKEludGVnZXIpIG51bWJlciBvZiBjb2x1bW5zIHRoYXQgdGhlIHRhYmxlIGNvbnRhaW5zLiAgSWYKKyAgICAgICAgbm90IHNwZWNpZmllZCwgb25seSB0d28gY29sdW1ucyB3aWxsIGJlIHZpc2libGUuCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZT4KKyAgICAgIDxuYW1lPnRhYmxlU3R5bGU8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGUgQ1NTIHN0eWxlIGNsYXNzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGVudGlyZSByZW5kZXJlZCBvdXRwdXQKKyAgICAgICAgb2YgdGhlIGluc3RhbnQgdGFibGUuICBJZiBub3Qgc3BlY2lmaWVkLCBubyBvdmVyYWxsCisgICAgICAgIHN0eWxlIGNsYXNzIGlzIGFwcGxpZWQuCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDwvYXR0cmlidXRlPgorIAorICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5saW5lU3R5bGU8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGUgQ1NTIHN0eWxlIGZvciB0aGUgbGluZXMgYmV0d2VlbiByb3dzLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICA8L3RhZz4KKworICAgIDx0YWc+CisKKyAgICA8bmFtZT5yb3c8L25hbWU+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Sb3dUYWc8L3RhZy1jbGFzcz4KKyAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgIERlZmluZSBhIHNpbmdsZSAiaW5zdGFudCB0YWJsZSByb3ciIG9wdGlvbiBmb3IgdGhlIHN1cnJvdW5kaW5nICJ0YWJsZSIKKyAgICAgIHRhZy4gIEl0IGlzIG5vdCB2YWxpZCB0byB1c2UgdGhpcyB0YWcgKmV4Y2VwdCogd2hlbiBuZXN0ZWQgaW5zaWRlIGFuCisgICAgICAidGFibGUiIHRhZy4KKworICAgICAgTk9URTogVGhpcyB0YWcgY2FuIG5lc3Qgb25seSAibGFiZWwiIGFuZCAiZGF0YSIgdGFncy4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGF0dHJpYnV0ZT4KKyAgICAgIDxuYW1lPmhlYWRlcjwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIChCb29sZWFuKSB2YXJpYWJsZSBzZXQgdG8gInRydWUiIG9yICJ5ZXMiIGlmIHRoaXMgcm93IGlzCisgICAgICAgIHRoZSBoZWFkZXIgcm93LgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDwvYXR0cmlidXRlPgorICAgIAorICAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+bGFiZWxTdHlsZTwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFRoZSBzdHlsZSBmb3IgdGhlIGxhYmVsIHRhYmxlIGRhdGEgZWxlbWVudC4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9hdHRyaWJ1dGU+CisgICAgCisgICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5kYXRhU3R5bGU8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGUgc3R5bGUgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgdGFibGUgZGF0YSBlbGVtZW50LgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4gICAgCisgICAgCisgICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5zdHlsZUlkPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgVGhlIHN0eWxlSWQgZm9yIHRoZSBsYWJlbCB0YWJsZSBkYXRhIGVsZW1lbnQuCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDwvYXR0cmlidXRlPgorICAgICAgICAKKyAgPC90YWc+CisKKyA8dGFnPgorCisgICAgPG5hbWU+bGFiZWw8L25hbWU+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MYWJlbFRhZzwvdGFnLWNsYXNzPgorICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+CisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgUmVuZGVyIGEgImxhYmVsIiBvYmplY3QsIHdoaWNoIGlzIHJlbmRlcmVkIGFzIGEgbGFiZWwgaW4gdGhlIHJvdyBvZgorICAgICAgYW4gSFRNTCAidGFibGUiIGVsZW1lbnQuIAorCisgICAgICBOT1RFOiAgVG8gYmUgdXNhYmxlLCB0aGlzIHRhZyBtdXN0IGJlIG5lc3RlZCBpbnNpZGUgYSAicm93IiB0YWcuCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgPC90YWc+CisKKyA8dGFnPgorCisgICAgPG5hbWU+ZGF0YTwvbmFtZT4KKyAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkRhdGFUYWc8L3RhZy1jbGFzcz4KKyAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgIFJlbmRlciBhICJkYXRhIiBvYmplY3QsIHdoaWNoIGlzIHJlbmRlcmVkIGFzIGEgbGFiZWwgaW4gdGhlIHJvdyBvZgorICAgICAgYW4gSFRNTCAidGFibGUiIGVsZW1lbnQuIAorCisgICAgICBOT1RFOiAgVG8gYmUgdXNhYmxlLCB0aGlzIHRhZyBtdXN0IGJlIG5lc3RlZCBpbnNpZGUgYSAicm93IiB0YWcuCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgPC90YWc+CisKKyAgPCEtLSA9PT09PT09PT09IEluc3RhbnQgQWN0aW9ucyBUYWcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgPHRhZz4KKworICAgIDxuYW1lPmFjdGlvbnM8L25hbWU+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BY3Rpb25zVGFnPC90YWctY2xhc3M+CisgICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBSZW5kZXIgYW4gImluc3RhbnQgYWN0aW9ucyIgb2JqZWN0LCB3aGljaCBpcyByZW5kZXJlZCBhcyBhbiBIVE1MCisgICAgICAic2VsZWN0IiBlbGVtZW50LCB3aGVyZSB0aGUgc2VsZWN0aW9uIG9mIGEgcGFydGljdWxhciBlbGVtZW50IGZyb20KKyAgICAgIHRoZSBsaXN0IGltbWVkaWF0ZWx5IGNhdXNlcyBhIEphdmFTY3JpcHQgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQKKyAgICAgICh3aXRoIHRoZSBhdmFpbGFibGUgZWxlbWVudHMgc3BlY2lmaWVkIGJ5ICJhY3Rpb24iIHRhZyBpbnN0YW5jZXMKKyAgICAgIG5lc3RlZCB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlICJhY3Rpb25zIiB0YWcpLgorCisgICAgICBOT1RFOiAgVGhlIG9ubHkgdmFsaWQgbmVzdGVkIGNvbnRlbnQgZm9yIHRoaXMgdGFnIGlzCisgICAgICAiYWN0aW9uIiB0YWdzIGZyb20gdGhpcyBsaWJyYXJ5LiAgQW55dGhpbmcgZWxzZSB3aWxsIGNhdXNlCisgICAgICB0aGUgcmVuZGVyZWQgSFRNTCB0byBiZSBpbnZhbGlkLgorCisgICAgICBOT1RFOiAgVG8gYmUgdXNhYmxlLCB0aGlzIHRhZyBtdXN0IGJlIG5lc3RlZCBpbnNpZGUgYW4KKyAgICAgIEhUTUwgJmx0O2Zvcm0mZ3Q7IGVsZW1lbnQuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5zaXplPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgKEludGVnZXIpIG51bWJlciBvZiByb3dzIHRoYXQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSB1c2VyLiAgSWYKKyAgICAgICAgbm90IHNwZWNpZmllZCwgb25seSBvbmUgcm93IHdpbGwgYmUgdmlzaWJsZS4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+c3R5bGU8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGUgQ1NTIHN0eWxlIGNsYXNzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGVudGlyZSByZW5kZXJlZCBvdXRwdXQKKyAgICAgICAgb2YgdGhlIGluc3RhbnQgYWN0aW9ucyBjb250cm9sLiAgSWYgbm90IHNwZWNpZmllZCwgbm8gb3ZlcmFsbAorICAgICAgICBzdHlsZSBjbGFzcyBpcyBhcHBsaWVkLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5sYWJlbDwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEhUTUwgTGFiZWwgdGFnIGdlbmVyYXRpb24uCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDwvYXR0cmlidXRlPgorICAgIAorICA8L3RhZz4KKworICA8dGFnPgorCisgICAgPG5hbWU+YWN0aW9uPC9uYW1lPgorICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQWN0aW9uVGFnPC90YWctY2xhc3M+CisgICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBEZWZpbmUgYSBzaW5nbGUgImluc3RhbnQgYWN0aW9uIiBvcHRpb24gZm9yIHRoZSBzdXJyb3VuZGluZyAiYWN0aW9ucyIKKyAgICAgIHRhZy4gIEl0IGlzIG5vdCB2YWxpZCB0byB1c2UgdGhpcyB0YWcgKmV4Y2VwdCogd2hlbiBuZXN0ZWQgaW5zaWRlIGFuCisgICAgICAiYWN0aW9ucyIgdGFnLgorCisgICAgICBOT1RFOiAgVGhlIGJvZHkgY29udGVudCBvZiB0aGlzIHRhZyAod2hpY2ggc2hvdWxkIGJlIHN1aXRhYmx5CisgICAgICBsb2NhbGl6ZWQsIGlmIHJlcXVpcmVkIGJ5IHlvdXIgYXBwbGljYXRpb24pIGlzIHVzZWQgYXMgdGhlCisgICAgICB1c2VyLXZpc2libGUgbGFiZWwgZm9yIHRoaXMgYWN0aW9uLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+c2VsZWN0ZWQ8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAoQm9vbGVhbikgdmFyaWFibGUgc2V0IHRvICJ0cnVlIiBvciAieWVzIiBpZiB0aGlzIGFjdGlvbiBzaG91bGQKKyAgICAgICAgYWxyZWFkeSBiZSBzZWxlY3RlZCB3aGVuIHRoZSAiaW5zdGFudCBhY3Rpb25zIiBlbGVtZW50IGlzCisgICAgICAgIGluaXRpYWxseSBkaXNwbGF5ZWQuCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZT4KKyAgICAgIDxuYW1lPmRpc2FibGVkPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgKEJvb2xlYW4pIHZhcmlhYmxlIHNldCB0byAidHJ1ZSIgb3IgInllcyIgaWYgdGhlIHNlbGVjdGlvbgorICAgICAgICBmb3IgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkLiAgICAgICAgCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZT4KKyAgICAgIDxuYW1lPnVybDwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFRoZSBVUkwgdG8gd2hpY2ggdGhlIGN1cnJlbnQgZnJhbWUgb3Igd2luZG93IHdpbGwgYmUgdHJhbnNmZXJyZWQKKyAgICAgICAgaWYgdGhlICJvbmNoYW5nZSIgZXZlbnQgaGFuZGxlciBvZiB0aGlzICJpbnN0YW50IGFjdGlvbnMiIGVsZW1lbnQKKyAgICAgICAgaXMgdHJpZ2dlcmVkLCBhbmQgdGhpcyBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGFjdGlvbi4gIElmIG5vCisgICAgICAgIFVSTCBpcyBzcGVjaWZpZWQsIG5vIGFjdGlvbiB3aWxsIGJlIHRha2VuICh1c2VmdWwgZm9yICIoTm9uZSkiCisgICAgICAgIG9wdGlvbnMgYW5kIGRpdmlkZXJzKS4KKworICAgICAgICBJZiB0aGlzIFVSTCBzdGFydHMgd2l0aCBhIHNsYXNoLCBpdCB3aWxsIGJlIGFzc3VtZWQgdG8gYmUKKyAgICAgICAgY29udGV4dC1yZWxhdGl2ZSwgYW5kIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY29udGV4dCBwYXRoCisgICAgICAgIG9mIHRoaXMgcmVxdWVzdC4gIE90aGVyd2lzZSwgaXQgd2lsbCBiZSB1c2VkIHVubW9kaWZpZWQuCisKKyAgICAgICAgTk9URTogIFRoaXMgVVJMIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggVVJMIHJld3JpdGluZyBzbyB0aGF0IGl0CisgICAgICAgIHdpbGwgbWFpbnRhaW4gc2Vzc2lvbiBpZGVudGl0eSBldmVuIGluIGVudmlyb25tZW50cyB3ZXJlIGNvb2tpZXMKKyAgICAgICAgYXJlIG5vdCBiZWluZyB1c2VkLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICA8L3RhZz4KKworCisgIDwhLS0gPT09PT09PT09PSBUcmVlIENvbnRyb2wgVGFnID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHRhZz4KKworICAgIDxuYW1lPnRyZWU8L25hbWU+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbFRhZzwvdGFnLWNsYXNzPgorICAgIDxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBSZW5kZXIgYSAidHJlZSIgY29udHJvbCwgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBkYXRhIG9iamVjdAorICAgICAgb2YgdHlwZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbCwgd2hpY2ggaXMgaWRlbnRpZmllZAorICAgICAgYnkgdGhlIG5hbWUgc3BlY2lmaWVkIGluIHRoZSAidHJlZSIgYXR0cmlidXRlLCBpbiB0aGUgSlNQIHNjb3BlCisgICAgICBzcGVjaWZpZWQgYnkgdGhlICJzY29wZSIgYXR0cmlidXRlLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+YWN0aW9uPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSHlwZXJsaW5rIHRvIHdoaWNoIGV4cGFuZC9jb250cmFjdCBhY3Rpb25zIHNob3VsZCBiZSBzZW50LAorICAgICAgICB3aXRoIGEgc3RyaW5nICIke25vZGV9IiBtYXJraW5nIHdoZXJlIHRoZSBub2RlIG5hbWUgb2YgdGhlCisgICAgICAgIGFmZmVjdGVkIG5vZGUgc2hvdWxkIGJlIGluY2x1ZGVkICh3aGljaCB3aWxsIHVzdWFsbHkgYmUgYXMKKyAgICAgICAgdGhlIHZhbHVlIG9mIGEgcmVxdWVzdCBwYXJhbWV0ZXIpLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5pbWFnZXM8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBOYW1lIG9mIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGltYWdlcyBmb3Igb3VyIGljb25zLAorICAgICAgICByZWxhdGl2ZSB0byB0aGUgcGFnZSBpbmNsdWRpbmcgdGhpcyB0YWcuICBJZiBub3Qgc3BlY2lmaWVkLAorICAgICAgICBkZWZhdWx0cyB0byAiaW1hZ2VzIi4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+c2NvcGU8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGUgSlNQIHNjb3BlIHdpdGhpbiB3aGljaCB0aGUgInRyZWUiIGF0dHJpYnV0ZSBpcyB0byBiZSBmb3VuZAorICAgICAgICAocGFnZSwgcmVxdWVzdCwgc2Vzc2lvbiwgb3IgYXBwbGljYXRpb24pLiAgSWYgbm90IHNwZWNpZmllZCwgdGhlCisgICAgICAgICJ0cmVlIiBhdHRyaWJ1dGUgd2lsbCBiZSBzZWFyY2hlZCBmb3IgaW4gYW55IHNjb3BlLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5zdHlsZTwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFRoZSBDU1Mgc3R5bGUgY2xhc3MgdG8gYmUgYXBwbGllZCB0byB0aGUgZW50aXJlIHJlbmRlcmVkIG91dHB1dAorICAgICAgICBvZiB0aGUgdHJlZSBjb250cm9sLiAgSWYgbm90IHNwZWNpZmllZCwgbm8gb3ZlcmFsbCBzdHlsZSBjbGFzcworICAgICAgICBpcyBhcHBsaWVkLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5zdHlsZVNlbGVjdGVkPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgVGhlIENTUyBzdHlsZSBjbGFzcyB0byBiZSBhcHBsaWVkIHRvIHRoZSB0ZXh0IG9mIGFueSBub2RlIHRoYXQKKyAgICAgICAgaXMgY3VycmVudGx5IHNlbGVjdGVkLiAgSWYgbm90IHNwZWNpZmllZCwgbm8gc3R5bGUgY2xhc3Mgd2lsbCBiZQorICAgICAgICBhcHBsaWVkIHRvIHRoZSB0ZXh0IG9mIHRoZSBzZWxlY3RlZCBub2RlLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5zdHlsZVVuc2VsZWN0ZWQ8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGUgQ1NTIHN0eWxlIGNsYXNzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHRleHQgb2YgYW55IG5vZGUgdGhhdAorICAgICAgICBpcyAqbm90KiBjdXJyZW50bHkgc2VsZWN0ZWQuICBJZiBub3Qgc3BlY2lmaWVkLCBubyBzdHlsZSBjbGFzcyB3aWxsCisgICAgICAgICBiZSBhcHBsaWVkIHRvIHRoZSB0ZXh0IG9mIG5vbi1zZWxlY3RlZCBub2Rlcy4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+dHJlZTwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSAoaW4gdGhlIHNjb3BlIHNwZWNpZmllZCBieSB0aGUgInNjb3BlIgorICAgICAgICBhdHRyaWJ1dGUsIGlmIGFueSkgdW5kZXIgd2hpY2ggYW4gb2JqZWN0IG9mIHR5cGUKKyAgICAgICAgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2wgaXMgc3RvcmVkLiAgVGhpcyBvYmplY3QKKyAgICAgICAgcmVwcmVzZW50cyB0aGUgZW50aXJlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRyZWUsIGluY2x1ZGluZworICAgICAgICBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBoaWVyYXJjaGljYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgICAgICAgIG5vZGVzLCBwbHVzIHRoZSBjdXJyZW50IGV4cGFuZGVkLyBvciBjb250cmFjdGVkIHN0YXRlIG9mCisgICAgICAgIG5vbi1sZWFmIG5vZGVzLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICA8L3RhZz4KKworICA8IS0tID09PT09PT09PT0gSk1YIEF0dHJpYnV0ZSBEaXNwbGF5IFRhZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0YWc+CisKKyAgICA8bmFtZT5hdHRyaWJ1dGU8L25hbWU+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BdHRyaWJ1dGVUYWc8L3RhZy1jbGFzcz4KKyAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+CisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgTG9vayB1cCBhbiBhdHRyaWJ1dGUgb24gYSBKTVggTUJlYW4sIHNwZWNpZmllZCBieSBhbiBvYmplY3QgbmFtZQorICAgICAgc3BlY2lmaWVkIGJ5IHRoZSAibmFtZSIgKGFuZCBvcHRpb25hbCAicHJvcGVydHkiIGFuZCAic2NvcGUiKQorICAgICAgYXR0cmlidXRlcywgYW5kIHJlbmRlciBpdCB0byB0aGUgY3VycmVudCBKU1Agd3JpdGVyLiAgVGhlIG9iamVjdCBuYW1lCisgICAgICBpZGVudGlmaWVkIGJ5IHRoZXNlIGF0dHJpYnV0ZXMgY2FuIGJlIGVpdGhlciBhIGphdmEubGFuZy5TdHJpbmcgdmVyc2lvbgorICAgICAgb2YgdGhlIG5hbWUsIG9yIGEgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lIGluc3RhbmNlLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+YXR0cmlidXRlPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIEpNWCBNQmVhbiB3aG9zZSB2YWx1ZSBpcyB0byBiZQorICAgICAgICByZXRyaWV2ZWQgYW5kIHdyaXR0ZW4gdG8gdGhlIGN1cnJlbnQgSlNQIHdyaXRlci4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+bmFtZTwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KKyAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgTmFtZSBvZiBhIGJlYW4sIG9wdGlvbmFsbHkgaW4gc29tZSBzY29wZSBpZGVudGlmaWVkIGJ5IHRoZSAic2NvcGUiCisgICAgICAgIGF0dHJpYnV0ZS4gIElmIHRoZSAicHJvcGVydHkiIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGlzIGJlYW4KKyAgICAgICAgbXVzdCBieSBhIFN0cmluZyBvciBhbiBPYmplY3ROYW1lLiAgT3RoZXJ3aXNlLCB0aGlzIGJlYW4gbXVzdCBoYXZlCisgICAgICAgIGEgcHJvcGVydHkgZ2V0dGVyIGZvciB0aGUgcHJvcGVydHkgbmFtZWQgYnkgInByb3BlcnR5Iiwgd2hpY2ggd2lsbAorICAgICAgICByZXR1cm4gdGhlIFN0cmluZyBvciBPYmplY3ROYW1lLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5wcm9wZXJ0eTwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIE5hbWUgb2YgYSBiZWFuIHByb3BlcnR5LCBvbiB0aGUgYmVhbiBpZGVudGlmaWVkIGJ5IHRoZSAibmFtZSIKKyAgICAgICAgKGFuZCBvcHRpb25hbCAic2NvcGUiKSBhdHRyaWJ1dGVzLCB0aGF0IGlzIGVpdGhlciBhIFN0cmluZyBvciBhbgorICAgICAgICBPYmplY3ROYW1lIG9mIHRoZSBKTVggTUJlYW4gd2hvc2UgYXR0cmlidXRlIGlzIHRvIGJlIHJldHJpZXZlZC4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+c2NvcGU8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBOYW1lIG9mIHRoZSBzY29wZSAoInBhZ2UiLCAicmVxdWVzdCIsICJzZXNzaW9uIiwgb3IgImFwcGxpY2F0aW9uIikKKyAgICAgICAgaW4gd2hpY2ggdGhlIGJlYW4gaWRlbnRpZmllZCBieSB0aGUgIm5hbWUiIGF0dHJpYnV0ZSBpcyB0byBiZSBmb3VuZC4KKyAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgYWxsIHNjb3BlcyB3aWxsIGJlIHNlYXJjaGVkIGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgPC90YWc+CisKKzwvdGFnbGliPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9zdHJ1dHMtY29uZmlnLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvc3RydXRzLWNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkNDU1NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvc3RydXRzLWNvbmZpZy54bWwKQEAgLTAsMCArMSw5NzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CisKKzwhRE9DVFlQRSBzdHJ1dHMtY29uZmlnIFBVQkxJQworICAgICAgICAgICItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vRFREIFN0cnV0cyBDb25maWd1cmF0aW9uIDEuMi8vRU4iCisgICAgICAgICAgImh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy9kdGRzL3N0cnV0cy1jb25maWdfMV8yLmR0ZCI+CisKKworPHN0cnV0cy1jb25maWc+CisKKworICA8IS0tID09PT09PT09PT0gRGF0YSBTb3VyY2UgQ29uZmlndXJhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisKKyAgPCEtLSA9PT09PT09PT09IEZvcm0gQmVhbiBEZWZpbml0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8Zm9ybS1iZWFucz4KKworICAgIDwhLS0gU2V0IExvY2FsZSBmb3JtIGJlYW4gLS0+CisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9InNldExvY2FsZUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlNldExvY2FsZUZvcm0iLz4KKworICAgIDwhLS0gPT09PT09PT09PT09PSBTZXJ2ZXIgTW9kdWxlID09PT09PT09PT09PT0gLS0+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0ic2VydmVyRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uc2VydmVyLlNlcnZlckZvcm0iLz4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgPCEtLSA9PT09PT09PT09PT09IFNlcnZpY2UgTW9kdWxlID09PT09PT09PT09PT0gLS0+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0ic2VydmljZUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnNlcnZpY2UuU2VydmljZUZvcm0iLz4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9InNlcnZpY2VzRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uc2VydmljZS5TZXJ2aWNlc0Zvcm0iLz4KKworICAgIDwhLS0gPT09PT09PT09PT09PSBIb3N0IE1vZHVsZSA9PT09PT09PT09PT09IC0tPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9Imhvc3RGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0Lkhvc3RGb3JtIi8+CisgICAgICAgICAgICAgICAgICAgIAorICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJob3N0c0Zvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3QuSG9zdHNGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0iYWxpYXNGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0LkFsaWFzRm9ybSIvPgorICAgICAgICAgICAgICAgICAgICAKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0iYWxpYXNlc0Zvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3QuQWxpYXNlc0Zvcm0iLz4KKworICAgIDwhLS0gPT09PT09PT09PT09PSBSZWFsbSBNb2R1bGUgPT09PT09PT09PT09PSAtLT4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJkYXRhU291cmNlUmVhbG1Gb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbS5EYXRhU291cmNlUmVhbG1Gb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0iamRiY1JlYWxtRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG0uSkRCQ1JlYWxtRm9ybSIvPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9ImpuZGlSZWFsbUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtLkpORElSZWFsbUZvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJtZW1vcnlSZWFsbUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtLk1lbW9yeVJlYWxtRm9ybSIvPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9InVzZXJEYXRhYmFzZVJlYWxtRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG0uVXNlckRhdGFiYXNlUmVhbG1Gb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0icmVhbG1zRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG0uUmVhbG1zRm9ybSIvPgorCisgICAgPCEtLSA9PT09PT09PT09PT09IENvbnRleHQgTW9kdWxlID09PT09PT09PT09PT0gLS0+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0iY29udGV4dEZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbnRleHQuQ29udGV4dEZvcm0iLz4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9ImNvbnRleHRzRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29udGV4dC5Db250ZXh0c0Zvcm0iLz4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgPCEtLSA9PT09PT09PT09PT09IERlZmF1bHRDb250ZXh0IE1vZHVsZSA9PT09PT09PT09PT09IC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIDwhLS0gPT09PT09PT09PT09PSBDb25uZWN0b3IgTW9kdWxlID09PT09PT09PT09PT0gLS0+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0iY29ubmVjdG9yRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29ubmVjdG9yLkNvbm5lY3RvckZvcm0iLz4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9ImNvbm5lY3RvcnNGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb25uZWN0b3IuQ29ubmVjdG9yc0Zvcm0iLz4KKworICAgIDwhLS0gPT09PT09PT09PT09PSBWYWx2ZSBNb2R1bGUgPT09PT09PT09PT09PSAtLT4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJhY2Nlc3NMb2dWYWx2ZUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLkFjY2Vzc0xvZ1ZhbHZlRm9ybSIvPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9InJlbW90ZUFkZHJWYWx2ZUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLlJlbW90ZUFkZHJWYWx2ZUZvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJyZW1vdGVIb3N0VmFsdmVGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZS5SZW1vdGVIb3N0VmFsdmVGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0icmVxdWVzdER1bXBlclZhbHZlRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmUuUmVxdWVzdER1bXBlclZhbHZlRm9ybSIvPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9InNpbmdsZVNpZ25PblZhbHZlRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmUuU2luZ2xlU2lnbk9uVmFsdmVGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0idmFsdmVzRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmUuVmFsdmVzRm9ybSIvPgorCisgICAgPCEtLSA9PT09PT09PT09IFJlc291cmNlcyBNb2R1bGUgPT09PT09PT09PSAtLT4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJlbnZFbnRyeUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlcy5FbnZFbnRyeUZvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJlbnZFbnRyaWVzRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLkVudkVudHJpZXNGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0idXNlckRhdGFiYXNlRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlVzZXJEYXRhYmFzZUZvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJ1c2VyRGF0YWJhc2VzRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlVzZXJEYXRhYmFzZXNGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0iZGF0YVNvdXJjZUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlcy5EYXRhU291cmNlRm9ybSIvPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9ImRhdGFTb3VyY2VzRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLkRhdGFTb3VyY2VzRm9ybSIvPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9Im1haWxTZXNzaW9uRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLk1haWxTZXNzaW9uRm9ybSIvPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlcy5NYWlsU2Vzc2lvbnNGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0icmVzb3VyY2VMaW5rRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlJlc291cmNlTGlua0Zvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlJlc291cmNlTGlua3NGb3JtIi8+CisKKyAgICA8IS0tID09PT09PT09PT0gVXNlciBEYXRhYmFzZSBNb2R1bGUgPT09PT09PT09PSAtLT4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJkYXRhYmFzZUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzLkJhc2VGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0iZ3JvdXBGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5Hcm91cEZvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJncm91cHNGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5Hcm91cHNGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0icm9sZUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzLlJvbGVGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0icm9sZXNGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5Sb2xlc0Zvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJ1c2VyRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnMuVXNlckZvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJ1c2Vyc0Zvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzLlVzZXJzRm9ybSIvPgorCisgICAgPCEtLSA9PT09PT09PT09ID09PT09PT09PT09PT09PT09PT09ID09PT09PT09PT0gLS0+CisKKworICA8L2Zvcm0tYmVhbnM+CisKKworICA8IS0tID09PT09PT09PT0gR2xvYmFsIEZvcndhcmQgRGVmaW5pdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDxnbG9iYWwtZm9yd2FyZHM+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iRHVtcCBSZWdpc3RyeSBSZXN1bHRzIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvZHVtcFJlZ2lzdHJ5LmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJEdW1wIFNlcnZlciBSZXN1bHRzIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvZHVtcFNlcnZlci5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iTWFpbiBNZW51IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvaW5kZXguanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlRyZWUgQ29udHJvbCBUZXN0IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvdHJlZS1jb250cm9sLXRlc3QuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorICAgICAgICAgICAgICAgICAgCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlNhdmUgU3VjY2Vzc2Z1bCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3NhdmVkLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJTYXZlIFVuc3VjY2Vzc2Z1bCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3NhdmVmYWlsLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKyAgICAgICAgICAgICAgICAKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iQmxhbmsiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9ibGFuay5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iVXNlciIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3VzZXIuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPCEtLSA9PT09PT09PT09PT0gU2VydmVyIE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJTZXJ2ZXIiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9zZXJ2ZXIvc2VydmVyLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKyAgICAKKyAgICA8IS0tID09PT09PT09PT09PSBTZXJ2aWNlIE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJTZXJ2aWNlIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvc2VydmljZS9zZXJ2aWNlLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJTZXJ2aWNlcyIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3NlcnZpY2Uvc2VydmljZXMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPCEtLSA9PT09PT09PT09PT0gSG9zdCBNb2R1bGUgPT09PT09PT09PT09PT0gLS0+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iSG9zdCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL2hvc3QvaG9zdC5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iSG9zdHMiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9ob3N0L2hvc3RzLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJBbGlhcyIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL2hvc3QvYWxpYXMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IkFsaWFzZXMiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9ob3N0L2FsaWFzZXMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisKKyAgICA8IS0tID09PT09PT09PT09PSBDb250ZXh0IE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJDb250ZXh0IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvY29udGV4dC9jb250ZXh0LmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJDb250ZXh0cyIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL2NvbnRleHQvY29udGV4dHMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPCEtLSA9PT09PT09PT09PT0gRGVmYXVsdENvbnRleHQgTW9kdWxlID09PT09PT09PT09PT09IC0tPgorCisgICAgPCEtLSA9PT09PT09PT09PT0gQ29ubmVjdG9yIE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJDb25uZWN0b3IiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9jb25uZWN0b3IvY29ubmVjdG9yLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJDb25uZWN0b3JzIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvY29ubmVjdG9yL2Nvbm5lY3RvcnMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPCEtLSA9PT09PT09PT09PT0gUmVhbG0gTW9kdWxlID09PT09PT09PT09PT09IC0tPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IkRhdGFTb3VyY2VSZWFsbSIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3JlYWxtL2RhdGFTb3VyY2VSZWFsbS5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iSkRCQ1JlYWxtIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvcmVhbG0vamRiY1JlYWxtLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKyAgICAgICAgICAgICAgICAKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iSk5ESVJlYWxtIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvcmVhbG0vam5kaVJlYWxtLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKyAgICAgICAgICAgICAgICAKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iTWVtb3J5UmVhbG0iCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZWFsbS9tZW1vcnlSZWFsbS5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iVXNlckRhdGFiYXNlUmVhbG0iCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZWFsbS91c2VyRGF0YWJhc2VSZWFsbS5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iUmVhbG1zIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvcmVhbG0vcmVhbG1zLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDwhLS0gPT09PT09PT09PT09IENvbnRleHQgTW9kdWxlID09PT09PT09PT09PT09IC0tPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IkNvbnRleHQiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9jb250ZXh0L2NvbnRleHQuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IkNvbnRleHRzIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvY29udGV4dC9jb250ZXh0cy5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8IS0tID09PT09PT09PT09PSBWYWx2ZSBNb2R1bGUgPT09PT09PT09PT09PT0gLS0+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iQWNjZXNzTG9nVmFsdmUiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii92YWx2ZS9hY2Nlc3NMb2dWYWx2ZS5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisgICAgICAgICAgICAgICAgCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlJlbW90ZUFkZHJWYWx2ZSIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3ZhbHZlL3JlbW90ZUFkZHJWYWx2ZS5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisgICAgICAgICAgICAgICAgCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlJlbW90ZUhvc3RWYWx2ZSIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3ZhbHZlL3JlbW90ZUhvc3RWYWx2ZS5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iUmVxdWVzdER1bXBlclZhbHZlIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvdmFsdmUvcmVxdWVzdER1bXBlclZhbHZlLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJTaW5nbGVTaWduT24iCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii92YWx2ZS9zaW5nbGVTaWduT25WYWx2ZS5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iVmFsdmVzIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvdmFsdmUvdmFsdmVzLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDwhLS0gPT09PT09PT09PSBSZXNvdXJjZXMgTW9kdWxlID09PT09PT09PT0gLS0+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iRW52RW50cnkiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZXNvdXJjZXMvZW52RW50cnkuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IkVudkVudHJpZXMgRGVsZXRlIExpc3QiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZXNvdXJjZXMvZGVsZXRlRW52RW50cmllcy5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iRW52RW50cmllcyBMaXN0IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvcmVzb3VyY2VzL2xpc3RFbnZFbnRyaWVzLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJFbnZFbnRyaWVzIExpc3QgU2V0dXAiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZXNvdXJjZXMvbGlzdEVudkVudHJpZXMuZG8/Zm9yd2FyZD1FbnZFbnRyaWVzK0xpc3QiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iVXNlckRhdGFiYXNlIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvcmVzb3VyY2VzL3VzZXJEYXRhYmFzZS5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iVXNlckRhdGFiYXNlcyBEZWxldGUgTGlzdCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3Jlc291cmNlcy9kZWxldGVVc2VyRGF0YWJhc2VzLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJVc2VyRGF0YWJhc2VzIExpc3QiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZXNvdXJjZXMvbGlzdFVzZXJEYXRhYmFzZXMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlVzZXJEYXRhYmFzZXMgTGlzdCBTZXR1cCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3Jlc291cmNlcy9saXN0VXNlckRhdGFiYXNlcy5kbz9mb3J3YXJkPVVzZXJEYXRhYmFzZXMrTGlzdCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKyAgICAgICAgICAgICAgICAKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iRGF0YVNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3Jlc291cmNlcy9kYXRhU291cmNlLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJEYXRhU291cmNlcyBEZWxldGUgTGlzdCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3Jlc291cmNlcy9kZWxldGVEYXRhU291cmNlcy5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iRGF0YVNvdXJjZXMgTGlzdCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3Jlc291cmNlcy9saXN0RGF0YVNvdXJjZXMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IkRhdGFTb3VyY2VzIExpc3QgU2V0dXAiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZXNvdXJjZXMvbGlzdERhdGFTb3VyY2VzLmRvP2ZvcndhcmQ9RGF0YVNvdXJjZXMrTGlzdCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJNYWlsU2Vzc2lvbiIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3Jlc291cmNlcy9tYWlsU2Vzc2lvbi5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iTWFpbFNlc3Npb25zIERlbGV0ZSBMaXN0IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvcmVzb3VyY2VzL2RlbGV0ZU1haWxTZXNzaW9ucy5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iTWFpbFNlc3Npb25zIExpc3QiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZXNvdXJjZXMvbGlzdE1haWxTZXNzaW9ucy5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iTWFpbFNlc3Npb25zIExpc3QgU2V0dXAiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZXNvdXJjZXMvbGlzdE1haWxTZXNzaW9ucy5kbz9mb3J3YXJkPU1haWxTZXNzaW9ucytMaXN0IgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlJlc291cmNlTGluayIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3Jlc291cmNlcy9yZXNvdXJjZUxpbmsuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlJlc291cmNlTGlua3MgRGVsZXRlIExpc3QiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZXNvdXJjZXMvZGVsZXRlUmVzb3VyY2VMaW5rcy5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iUmVzb3VyY2VMaW5rcyBMaXN0IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvcmVzb3VyY2VzL2xpc3RSZXNvdXJjZUxpbmtzLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJSZXNvdXJjZUxpbmtzIExpc3QgU2V0dXAiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZXNvdXJjZXMvbGlzdFJlc291cmNlTGlua3MuZG8/Zm9yd2FyZD1SZXNvdXJjZUxpbmtzK0xpc3QiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICA8IS0tID09PT09PT09PT0gVXNlciBEYXRhYmFzZSBNb2R1bGUgPT09PT09PT09PSAtLT4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJHcm91cCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3VzZXJzL2dyb3VwLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJHcm91cHMgRGVsZXRlIExpc3QiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii91c2Vycy9kZWxldGVHcm91cHMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9Ikdyb3VwcyBMaXN0IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvdXNlcnMvbGlzdEdyb3Vwcy5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iR3JvdXBzIExpc3QgU2V0dXAiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii91c2Vycy9saXN0R3JvdXBzLmRvP2ZvcndhcmQ9R3JvdXBzK0xpc3QiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iUm9sZSIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3VzZXJzL3JvbGUuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlJvbGVzIERlbGV0ZSBMaXN0IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvdXNlcnMvZGVsZXRlUm9sZXMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlJvbGVzIExpc3QiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii91c2Vycy9saXN0Um9sZXMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlJvbGVzIExpc3QgU2V0dXAiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii91c2Vycy9saXN0Um9sZXMuZG8/Zm9yd2FyZD1Sb2xlcytMaXN0IgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlVzZXIiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii91c2Vycy91c2VyLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJVc2VycyBEZWxldGUgTGlzdCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3VzZXJzL2RlbGV0ZVVzZXJzLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJVc2VycyBMaXN0IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvdXNlcnMvbGlzdFVzZXJzLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJVc2VycyBMaXN0IFNldHVwIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvdXNlcnMvbGlzdFVzZXJzLmRvP2ZvcndhcmQ9VXNlcnMrTGlzdCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDwhLS0gPT09PT09PT09PSA9PT09PT09PT09PT09PT09PT09PSA9PT09PT09PT09IC0tPgorCisKKyAgPC9nbG9iYWwtZm9yd2FyZHM+CisKKworICA8IS0tID09PT09PT09PT0gQWN0aW9uIE1hcHBpbmcgRGVmaW5pdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDxhY3Rpb24tbWFwcGluZ3M+CisKKyAgICA8IS0tIER1bXAgcmVnaXN0cnkgaW5mb3JtYXRpb24gKGRlYnVnZ2luZykgLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvZHVtcFJlZ2lzdHJ5IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uRHVtcFJlZ2lzdHJ5QWN0aW9uIi8+CisKKyAgICA8IS0tIER1bXAgTUJlYW4gc2VydmVyIGluZm9ybWF0aW9uIChkZWJ1Z2dpbmcpIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL2R1bXBTZXJ2ZXIiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5EdW1wU2VydmVyQWN0aW9uIi8+CisKKyAgICA8IS0tIFNldCB1cCBUcmVlIGRhdGFzdHJ1Y3R1cmUgLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvc2V0VXBUcmVlIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uU2V0VXBUcmVlQWN0aW9uIj4KKyAgICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJTZXRVcFRyZWUiCisgICAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3RyZWUtY29udHJvbC10ZXN0LmpzcCIKKyAgICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJ0cnVlIi8+CisgICAgPC9hY3Rpb24+CisKKyAgICA8IS0tIExvZyBvdXQgb2YgdGhlIGFwcGxpY2F0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL2xvZ091dCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxvZ091dEFjdGlvbiI+CisgICAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iTWFpbiBNZW51IgorICAgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9pbmRleC5qc3AiCisgICAgICAgICAgICAgICAgICByZWRpcmVjdD0idHJ1ZSIvPgorICAgIDwvYWN0aW9uPgorCisgICAgPCEtLSBTYXZlIGN1cnJlbnQgc2V0dGluZ3MgdG8gc2VydmVyLnhtbCAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9jb21taXRDaGFuZ2VzIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQ29tbWl0Q2hhbmdlc0FjdGlvbiI+CisgICAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iQmFubmVyIgorICAgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9iYW5uZXIuanNwIgorICAgICAgICAgICAgICAgICAgcmVkaXJlY3Q9InRydWUiLz4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gUHJvY2VzcyBhIHNldC1sb2NhbGUgYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL3NldExvY2FsZSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlNldExvY2FsZUFjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9InNldExvY2FsZUZvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJzZXNzaW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gVHJlZSBjb250cm9sIHRlc3QgYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL3RyZWVDb250cm9sVGVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sVGVzdEFjdGlvbiIvPgorCisgICA8IS0tID09PT09PT09PT09PT0gU2VydmVyIE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gU2V0IHVwIEVkaXQgU2VydmVyIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0VkaXRTZXJ2ZXIiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5zZXJ2ZXIuRWRpdFNlcnZlckFjdGlvbiI+CisgICAgPC9hY3Rpb24+CisKKyAgICA8IS0tIFBlcmZvcm0gU2F2ZSBTZXJ2ZXIgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvU2F2ZVNlcnZlciIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnNlcnZlci5TYXZlU2VydmVyQWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0ic2VydmVyRm9ybSIKKyAgICAgICAgICAgICAgaW5wdXQ9Ii9zZXJ2ZXIvc2VydmVyLmpzcCIKKyAgICAgICAgICAgICAgIHNjb3BlPSJzZXNzaW9uIi8+CisKKyAgICA8IS0tID09PT09PT09PT09PT0gU2VydmljZSBNb2R1bGUgPT09PT09PT09PT09PT0gLS0+CisKKyAgICA8IS0tIFNldCB1cCBBZGQgU2VydmljZSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9BZGRTZXJ2aWNlIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uc2VydmljZS5BZGRTZXJ2aWNlQWN0aW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gU2V0IHVwIERlbGV0ZSBTZXJ2aWNlcyB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9EZWxldGVTZXJ2aWNlIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uc2VydmljZS5EZWxldGVTZXJ2aWNlQWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0ic2VydmljZXNGb3JtIgorICAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiLz4KKworICAgIDwhLS0gUGVyZm9ybSBEZWxldGUgU2VydmljZXMgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRGVsZXRlU2VydmljZXMiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5zZXJ2aWNlLkRlbGV0ZVNlcnZpY2VzQWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0ic2VydmljZXNGb3JtIgorICAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiLz4KKworICAgIDwhLS0gU2V0IHVwIEVkaXQgU2VydmljZSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9FZGl0U2VydmljZSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnNlcnZpY2UuRWRpdFNlcnZpY2VBY3Rpb24iPgorICAgIDwvYWN0aW9uPgorCisgICAgPCEtLSBQZXJmb3JtIFNhdmUgU2VydmljZSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9TYXZlU2VydmljZSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnNlcnZpY2UuU2F2ZVNlcnZpY2VBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJzZXJ2aWNlRm9ybSIKKyAgICAgICAgICAgICAgaW5wdXQ9Ii9zZXJ2aWNlL3NlcnZpY2UuanNwIgorICAgICAgICAgICAgICAgc2NvcGU9InNlc3Npb24iLz4KKworICAgIDwhLS0gPT09PT09PT09PT09PSBIb3N0IE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gU2V0IHVwIEFkZCBIb3N0IHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0FkZEhvc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0LkFkZEhvc3RBY3Rpb24iPgorICAgIDwvYWN0aW9uPgorCisgICAgPCEtLSBTZXQgdXAgRGVsZXRlIEhvc3RzIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0RlbGV0ZUhvc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0LkRlbGV0ZUhvc3RBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJob3N0c0Zvcm0iCisgICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIvPgorCisgICAgPCEtLSBQZXJmb3JtIERlbGV0ZSBIb3N0cyB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9EZWxldGVIb3N0cyIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3QuRGVsZXRlSG9zdHNBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJob3N0c0Zvcm0iCisgICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIvPgorCisgICAgPCEtLSBTZXQgdXAgRWRpdCBIb3N0IHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0VkaXRIb3N0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uaG9zdC5FZGl0SG9zdEFjdGlvbiI+CisgICAgPC9hY3Rpb24+CisKKyAgICA8IS0tIFBlcmZvcm0gU2F2ZSBIb3N0IHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL1NhdmVIb3N0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uaG9zdC5TYXZlSG9zdEFjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9Imhvc3RGb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL2hvc3QvaG9zdC5qc3AiCisgICAgICAgICAgICAgICBzY29wZT0ic2Vzc2lvbiIvPgorICAgICAgICAgICAgICAgCisgICAgPCEtLSBTZXQgdXAgQWRkIEFsaWFzIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0FkZEFsaWFzIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uaG9zdC5BZGRBbGlhc0FjdGlvbiI+CisgICAgPC9hY3Rpb24+CisKKyAgICA8IS0tIFBlcmZvcm0gRGVsZXRlIEFsaWFzZXMgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRGVsZXRlQWxpYXMiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0LkRlbGV0ZUFsaWFzQWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0iYWxpYXNlc0Zvcm0iCisgICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIvPgorICAgICAgICAgICAgICAgCisgICAgPCEtLSBQZXJmb3JtIERlbGV0ZSBBbGlhc2VzIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0RlbGV0ZUFsaWFzZXMiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0LkRlbGV0ZUFsaWFzZXNBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJhbGlhc2VzRm9ybSIKKyAgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0Ii8+CisgICAgICAgICAgICAgICAKKyAgICA8IS0tIFBlcmZvcm0gU2F2ZSBIb3N0IHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL1NhdmVBbGlhcyIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3QuU2F2ZUFsaWFzQWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0iYWxpYXNGb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL2hvc3QvYWxpYXMuanNwIgorICAgICAgICAgICAgICAgc2NvcGU9InNlc3Npb24iLz4KKworICAgIDwhLS0gPT09PT09PT09PT09PSBSZWFsbSBNb2R1bGUgPT09PT09PT09PT09PT0gLS0+CisKKyAgICA8IS0tIFNldCB1cCBBZGQgUmVhbG0gdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvQWRkUmVhbG0iCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbS5BZGRSZWFsbUFjdGlvbiI+CisgICAgPC9hY3Rpb24+CisKKyAgICA8IS0tIFNldCB1cCBBZGQgUmVhbG0gdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVhbG0vQWRkUmVhbG0iCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbS5BZGRSZWFsbUFjdGlvbiI+CisgICAgPC9hY3Rpb24+CisKKyAgICA8IS0tIFNldCB1cCBEZWxldGUgUmVhbG1zIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0RlbGV0ZVJlYWxtIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG0uRGVsZXRlUmVhbG1BY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJyZWFsbXNGb3JtIgorICAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiLz4KKworICAgIDwhLS0gUGVyZm9ybSBEZWxldGUgUmVhbG1zIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0RlbGV0ZVJlYWxtcyIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtLkRlbGV0ZVJlYWxtc0FjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9InJlYWxtc0Zvcm0iCisgICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIvPgorCisgICAgPCEtLSBTZXQgdXAgRWRpdCBSZWFsbSB0cmFuc2FjdGlvbiAoZ2VuZXJpYykgLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRWRpdFJlYWxtIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG0uRWRpdFJlYWxtQWN0aW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gUGVyZm9ybSBTYXZlIFVzZXJEYXRhYmFzZSBSZWFsbSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9TYXZlVXNlckRhdGFiYXNlUmVhbG0iCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbS5TYXZlVXNlckRhdGFiYXNlUmVhbG1BY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJ1c2VyRGF0YWJhc2VSZWFsbUZvcm0iCisgICAgICAgICAgICAgIGlucHV0PSIvcmVhbG0vdXNlckRhdGFiYXNlUmVhbG0uanNwIgorICAgICAgICAgICAgICAgc2NvcGU9InNlc3Npb24iLz4KKworICAgPCEtLSBQZXJmb3JtIFNhdmUgRGF0YVNvdXJjZSBSZWFsbSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9TYXZlRGF0YVNvdXJjZVJlYWxtIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG0uU2F2ZURhdGFTb3VyY2VSZWFsbUFjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9ImRhdGFTb3VyY2VSZWFsbUZvcm0iCisgICAgICAgICAgICAgIGlucHV0PSIvcmVhbG0vZGF0YVNvdXJjZVJlYWxtLmpzcCIKKyAgICAgICAgICAgICAgIHNjb3BlPSJzZXNzaW9uIi8+CisKKyAgIDwhLS0gUGVyZm9ybSBTYXZlIEpEQkMgUmVhbG0gdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvU2F2ZUpEQkNSZWFsbSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtLlNhdmVKREJDUmVhbG1BY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJqZGJjUmVhbG1Gb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL3JlYWxtL2pkYmNSZWFsbS5qc3AiCisgICAgICAgICAgICAgICBzY29wZT0ic2Vzc2lvbiIvPgorCisgICAgPCEtLSBQZXJmb3JtIFNhdmUgSk5ESSBSZWFsbSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9TYXZlSk5ESVJlYWxtIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG0uU2F2ZUpORElSZWFsbUFjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9ImpuZGlSZWFsbUZvcm0iCisgICAgICAgICAgICAgIGlucHV0PSIvcmVhbG0vam5kaVJlYWxtLmpzcCIKKyAgICAgICAgICAgICAgIHNjb3BlPSJzZXNzaW9uIi8+CisKKyAgICA8IS0tIFBlcmZvcm0gU2F2ZSBNZW1vcnkgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvU2F2ZU1lbW9yeVJlYWxtIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG0uU2F2ZU1lbW9yeVJlYWxtQWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0ibWVtb3J5UmVhbG1Gb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL3JlYWxtL21lbW9yeVJlYWxtLmpzcCIKKyAgICAgICAgICAgICAgIHNjb3BlPSJzZXNzaW9uIi8+CisgICAgICAgICAgICAgICAKKyAgIDwhLS0gPT09PT09PT09PT09PSBDb250ZXh0IE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gU2V0IHVwIEFkZCBDb250ZXh0IHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0FkZENvbnRleHQiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb250ZXh0LkFkZENvbnRleHRBY3Rpb24iPgorICAgIDwvYWN0aW9uPgorCisgICAgPCEtLSBTZXQgdXAgRGVsZXRlIENvbnRleHRzIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0RlbGV0ZUNvbnRleHQiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb250ZXh0LkRlbGV0ZUNvbnRleHRBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJjb250ZXh0c0Zvcm0iCisgICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIvPgorCisgICAgPCEtLSBQZXJmb3JtIERlbGV0ZSBDb250ZXh0cyB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9EZWxldGVDb250ZXh0cyIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbnRleHQuRGVsZXRlQ29udGV4dHNBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJjb250ZXh0c0Zvcm0iCisgICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIvPgorCisgICAgPCEtLSBTZXQgdXAgRWRpdCBDb250ZXh0IHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0VkaXRDb250ZXh0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29udGV4dC5FZGl0Q29udGV4dEFjdGlvbiI+CisgICAgPC9hY3Rpb24+CisKKyAgICA8IS0tIFBlcmZvcm0gU2F2ZSBDb250ZXh0IHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL1NhdmVDb250ZXh0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29udGV4dC5TYXZlQ29udGV4dEFjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9ImNvbnRleHRGb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL2NvbnRleHQvY29udGV4dC5qc3AiCisgICAgICAgICAgICAgICBzY29wZT0ic2Vzc2lvbiIvPgorICAgICAgICAgICAgICAgCisgICA8IS0tID09PT09PT09PT09PT0gRGVmYXVsdENvbnRleHQgTW9kdWxlID09PT09PT09PT09PT09IC0tPgorCisgICA8IS0tID09PT09PT09PT09PT0gQ29ubmVjdG9yIE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gU2V0IHVwIEFkZCBDb25uZWN0b3IgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvQWRkQ29ubmVjdG9yIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29ubmVjdG9yLkFkZENvbm5lY3RvckFjdGlvbiI+CisgICAgPC9hY3Rpb24+CisKKyAgICA8IS0tIFNldCB1cCBBZGQgQ29ubmVjdG9yIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL2Nvbm5lY3Rvci9BZGRDb25uZWN0b3IiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb25uZWN0b3IuQWRkQ29ubmVjdG9yQWN0aW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gU2V0IHVwIERlbGV0ZSBDb25uZWN0b3JzIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0RlbGV0ZUNvbm5lY3RvciIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbm5lY3Rvci5EZWxldGVDb25uZWN0b3JBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJjb25uZWN0b3JzRm9ybSIKKyAgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0Ii8+CisKKyAgICA8IS0tIFBlcmZvcm0gRGVsZXRlIENvbm5lY3RvcnMgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRGVsZXRlQ29ubmVjdG9ycyIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbm5lY3Rvci5EZWxldGVDb25uZWN0b3JzQWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0iY29ubmVjdG9yc0Zvcm0iCisgICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIvPgorCisgICAgPCEtLSBTZXQgdXAgRWRpdCBDb25uZWN0b3IgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRWRpdENvbm5lY3RvciIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbm5lY3Rvci5FZGl0Q29ubmVjdG9yQWN0aW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gUGVyZm9ybSBTYXZlIENvbm5lY3RvciB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9TYXZlQ29ubmVjdG9yIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29ubmVjdG9yLlNhdmVDb25uZWN0b3JBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJjb25uZWN0b3JGb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL2Nvbm5lY3Rvci9jb25uZWN0b3IuanNwIgorICAgICAgICAgICAgICAgc2NvcGU9InNlc3Npb24iLz4KKyAgICAgICAgICAgICAgIAorICAgPCEtLSA9PT09PT09PT09PT09IFZhbHZlIE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gU2V0IHVwIEFkZCBWYWx2ZSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9BZGRWYWx2ZSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLkFkZFZhbHZlQWN0aW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gU2V0IHVwIEFkZCBWYWx2ZSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii92YWx2ZS9BZGRWYWx2ZSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLkFkZFZhbHZlQWN0aW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gU2V0IHVwIERlbGV0ZSBWYWx2ZXMgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRGVsZXRlVmFsdmUiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZS5EZWxldGVWYWx2ZUFjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9InZhbHZlc0Zvcm0iCisgICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIvPgorCisgICAgPCEtLSBQZXJmb3JtIERlbGV0ZSBWYWx2ZXMgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRGVsZXRlVmFsdmVzIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmUuRGVsZXRlVmFsdmVzQWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0idmFsdmVzRm9ybSIKKyAgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0Ii8+CisKKyAgICA8IS0tIFNldCB1cCBFZGl0IFZhbHZlIHRyYW5zYWN0aW9uIChnZW5lcmljKSAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9FZGl0VmFsdmUiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZS5FZGl0VmFsdmVBY3Rpb24iPgorICAgIDwvYWN0aW9uPgorICAgIAorICAgIDwhLS0gUGVyZm9ybSBTYXZlIEFjY2Vzc0xvZyBWYWx2ZSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9TYXZlQWNjZXNzTG9nVmFsdmUiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZS5TYXZlQWNjZXNzTG9nVmFsdmVBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJhY2Nlc3NMb2dWYWx2ZUZvcm0iCisgICAgICAgICAgICAgIGlucHV0PSIvdmFsdmUvYWNjZXNzTG9nVmFsdmUuanNwIgorICAgICAgICAgICAgICAgc2NvcGU9InNlc3Npb24iLz4KKworICAgPCEtLSBQZXJmb3JtIFNhdmUgUmVtb3RlIEFkZHIgVmFsdmUgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvU2F2ZVJlbW90ZUFkZHJWYWx2ZSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLlNhdmVSZW1vdGVBZGRyVmFsdmVBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJyZW1vdGVBZGRyVmFsdmVGb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL3ZhbHZlL3JlbW90ZUFkZHJWYWx2ZS5qc3AiCisgICAgICAgICAgICAgICBzY29wZT0ic2Vzc2lvbiIvPgorCisgICAgPCEtLSBQZXJmb3JtIFNhdmUgUmVtb3RlIEhvc3QgVmFsdmUgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvU2F2ZVJlbW90ZUhvc3RWYWx2ZSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLlNhdmVSZW1vdGVIb3N0VmFsdmVBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJyZW1vdGVIb3N0VmFsdmVGb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL3ZhbHZlL3JlbW90ZUhvc3RWYWx2ZS5qc3AiCisgICAgICAgICAgICAgICBzY29wZT0ic2Vzc2lvbiIvPgorCisgICAgPCEtLSBQZXJmb3JtIFNhdmUgUmVxdWVzdCBEdW1wZXIgVmFsdmUgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvU2F2ZVJlcXVlc3REdW1wZXJWYWx2ZSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLlNhdmVSZXF1ZXN0RHVtcGVyVmFsdmVBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJyZXF1ZXN0RHVtcGVyVmFsdmVGb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL3ZhbHZlL3JlcXVlc3REdW1wZXJWYWx2ZS5qc3AiCisgICAgICAgICAgICAgICBzY29wZT0ic2Vzc2lvbiIvPgorCisgICA8IS0tIFBlcmZvcm0gU2F2ZSBTaW5nbGUgU2lnbiBPbiBWYWx2ZSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9TYXZlU2luZ2xlU2lnbk9uIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmUuU2F2ZVNpbmdsZVNpZ25PblZhbHZlQWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0ic2luZ2xlU2lnbk9uVmFsdmVGb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL3ZhbHZlL3NpbmdsZVNpZ25PblZhbHZlLmpzcCIKKyAgICAgICAgICAgICAgIHNjb3BlPSJzZXNzaW9uIi8+CisgICAgICAgICAgICAgICAKKyAgIDwhLS0gPT09PT09PT09PSBSZXNvdXJjZXMgTW9kdWxlID09PT09PT09PT0gLS0+CisKKyAgIDxhY3Rpb24gICAgcGF0aD0iL3Jlc291cmNlcy9kZWxldGVFbnZFbnRyaWVzIgorICAgICAgICAgICAgICAgbmFtZT0iZW52RW50cmllc0Zvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLkRlbGV0ZUVudkVudHJpZXNBY3Rpb24iLz4KKworICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL2RlbGV0ZVVzZXJEYXRhYmFzZXMiCisgICAgICAgICAgICAgICBuYW1lPSJ1c2VyRGF0YWJhc2VzRm9ybSIKKyAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXMuRGVsZXRlVXNlckRhdGFiYXNlc0FjdGlvbiIvPgorICAgICAgCisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL2RlbGV0ZURhdGFTb3VyY2VzIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZXNGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlcy5EZWxldGVEYXRhU291cmNlc0FjdGlvbiIvPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL2RlbGV0ZU1haWxTZXNzaW9ucyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLkRlbGV0ZU1haWxTZXNzaW9uc0FjdGlvbiIvPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL2RlbGV0ZVJlc291cmNlTGlua3MiCisgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIKKyAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXMuRGVsZXRlUmVzb3VyY2VMaW5rc0FjdGlvbiIvPgorICAgICAgICAgICAgICAgCisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL2xpc3RFbnZFbnRyaWVzIgorICAgICAgICAgICAgICAgbmFtZT0iZW52RW50cmllc0Zvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLkxpc3RFbnZFbnRyaWVzQWN0aW9uIi8+CisgICAgICAgICAgICAgICAKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9yZXNvdXJjZXMvbGlzdFVzZXJEYXRhYmFzZXMiCisgICAgICAgICAgICAgICBuYW1lPSJ1c2VyRGF0YWJhc2VzRm9ybSIKKyAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXMuTGlzdFVzZXJEYXRhYmFzZXNBY3Rpb24iLz4KKworICAgIDxhY3Rpb24gICAgcGF0aD0iL3Jlc291cmNlcy9saXN0RGF0YVNvdXJjZXMiCisgICAgICAgICAgICAgICBuYW1lPSJkYXRhU291cmNlc0Zvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLkxpc3REYXRhU291cmNlc0FjdGlvbiIvPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL2xpc3RNYWlsU2Vzc2lvbnMiCisgICAgICAgICAgICAgICBuYW1lPSJtYWlsU2Vzc2lvbnNGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlcy5MaXN0TWFpbFNlc3Npb25zQWN0aW9uIi8+CisKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9yZXNvdXJjZXMvbGlzdFJlc291cmNlTGlua3MiCisgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIKKyAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXMuTGlzdFJlc291cmNlTGlua3NBY3Rpb24iLz4KKworICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL3NhdmVFbnZFbnRyeSIKKyAgICAgICAgICAgICAgaW5wdXQ9Ii9yZXNvdXJjZXMvZW52RW50cnkuanNwIgorICAgICAgICAgICAgICAgbmFtZT0iZW52RW50cnlGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlcy5TYXZlRW52RW50cnlBY3Rpb24iLz4KKyAgICAgICAgICAgICAgIAorICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL3NhdmVVc2VyRGF0YWJhc2UiCisgICAgICAgICAgICAgIGlucHV0PSIvcmVzb3VyY2VzL3VzZXJEYXRhYmFzZS5qc3AiCisgICAgICAgICAgICAgICBuYW1lPSJ1c2VyRGF0YWJhc2VGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlcy5TYXZlVXNlckRhdGFiYXNlQWN0aW9uIi8+CisKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9yZXNvdXJjZXMvc2F2ZURhdGFTb3VyY2UiCisgICAgICAgICAgICAgIGlucHV0PSIvcmVzb3VyY2VzL2RhdGFTb3VyY2UuanNwIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZUZvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlNhdmVEYXRhU291cmNlQWN0aW9uIi8+CisKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9yZXNvdXJjZXMvc2F2ZU1haWxTZXNzaW9uIgorICAgICAgICAgICAgICBpbnB1dD0iL3Jlc291cmNlcy9tYWlsU2Vzc2lvbi5qc3AiCisgICAgICAgICAgICAgICBuYW1lPSJtYWlsU2Vzc2lvbkZvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlNhdmVNYWlsU2Vzc2lvbkFjdGlvbiIvPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL3NhdmVSZXNvdXJjZUxpbmsiCisgICAgICAgICAgICAgIGlucHV0PSIvcmVzb3VyY2VzL3Jlc291cmNlTGluay5qc3AiCisgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZUxpbmtGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlcy5TYXZlUmVzb3VyY2VMaW5rQWN0aW9uIi8+CisKKyAgIDxhY3Rpb24gICAgcGF0aD0iL3Jlc291cmNlcy9zZXRVcEVudkVudHJ5IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlNldFVwRW52RW50cnlBY3Rpb24iLz4KKworICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL3NldFVwVXNlckRhdGFiYXNlIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlNldFVwVXNlckRhdGFiYXNlQWN0aW9uIi8+CisKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9yZXNvdXJjZXMvc2V0VXBEYXRhU291cmNlIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlNldFVwRGF0YVNvdXJjZUFjdGlvbiIvPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL3NldFVwTWFpbFNlc3Npb24iCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXMuU2V0VXBNYWlsU2Vzc2lvbkFjdGlvbiIvPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL3NldFVwUmVzb3VyY2VMaW5rIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlNldFVwUmVzb3VyY2VMaW5rQWN0aW9uIi8+CisgICAgICAgICAgIAorICAgIDwhLS0gPT09PT09PT09PSBVc2VyIERhdGFiYXNlIE1vZHVsZSA9PT09PT09PT09IC0tPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvdXNlcnMvZGVsZXRlR3JvdXBzIgorICAgICAgICAgICAgICAgbmFtZT0iZ3JvdXBzRm9ybSIKKyAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5EZWxldGVHcm91cHNBY3Rpb24iLz4KKworICAgIDxhY3Rpb24gICAgcGF0aD0iL3VzZXJzL2RlbGV0ZVJvbGVzIgorICAgICAgICAgICAgICAgbmFtZT0icm9sZXNGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5EZWxldGVSb2xlc0FjdGlvbiIvPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvdXNlcnMvZGVsZXRlVXNlcnMiCisgICAgICAgICAgICAgICBuYW1lPSJ1c2Vyc0Zvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnMuRGVsZXRlVXNlcnNBY3Rpb24iLz4KKworICAgIDxhY3Rpb24gICAgcGF0aD0iL3VzZXJzL2xpc3RHcm91cHMiCisgICAgICAgICAgICAgICBuYW1lPSJncm91cHNGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzLkxpc3RHcm91cHNBY3Rpb24iLz4KKworICAgIDxhY3Rpb24gICAgcGF0aD0iL3VzZXJzL2xpc3RSb2xlcyIKKyAgICAgICAgICAgICAgIG5hbWU9InJvbGVzRm9ybSIKKyAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5MaXN0Um9sZXNBY3Rpb24iLz4KKworICAgIDxhY3Rpb24gICAgcGF0aD0iL3VzZXJzL2xpc3RVc2VycyIKKyAgICAgICAgICAgICAgIG5hbWU9InVzZXJzRm9ybSIKKyAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5MaXN0VXNlcnNBY3Rpb24iLz4KKworICAgIDxhY3Rpb24gICAgcGF0aD0iL3VzZXJzL3NhdmVHcm91cCIKKyAgICAgICAgICAgICAgaW5wdXQ9Ii91c2Vycy9ncm91cC5qc3AiCisgICAgICAgICAgICAgICBuYW1lPSJncm91cEZvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnMuU2F2ZUdyb3VwQWN0aW9uIi8+CisKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii91c2Vycy9zYXZlUm9sZSIKKyAgICAgICAgICAgICAgaW5wdXQ9Ii91c2Vycy9yb2xlLmpzcCIKKyAgICAgICAgICAgICAgIG5hbWU9InJvbGVGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzLlNhdmVSb2xlQWN0aW9uIi8+CisKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii91c2Vycy9zYXZlVXNlciIKKyAgICAgICAgICAgICAgaW5wdXQ9Ii91c2Vycy91c2VyLmpzcCIKKyAgICAgICAgICAgICAgIG5hbWU9InVzZXJGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzLlNhdmVVc2VyQWN0aW9uIi8+CisKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii91c2Vycy9zZXRVcEdyb3VwIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnMuU2V0VXBHcm91cEFjdGlvbiIvPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvdXNlcnMvc2V0VXBSb2xlIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnMuU2V0VXBSb2xlQWN0aW9uIi8+CisKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii91c2Vycy9zZXRVcFVzZXIiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5TZXRVcFVzZXJBY3Rpb24iLz4KKworICAgIDwhLS0gPT09PT09PT09PSA9PT09PT09PT09PT09PT09PT09PSA9PT09PT09PT09IC0tPgorCisKKyAgPC9hY3Rpb24tbWFwcGluZ3M+ICAKKworICA8Y29udHJvbGxlciBsb2NhbGU9InRydWUiIG5vY2FjaGU9InRydWUiIC8+CisgCisgIDxtZXNzYWdlLXJlc291cmNlcyBwYXJhbWV0ZXI9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uUmVzb3VyY2VzIiAvPgorCis8L3N0cnV0cy1jb25maWc+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL3dlYi54bWwgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiMGIxMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDEzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCisgICAgdmVyc2lvbj0iMi40Ij4KKworICA8ZGlzcGxheS1uYW1lPlRvbWNhdCBBZG1pbmlzdHJhdGlvbiBBcHBsaWNhdGlvbjwvZGlzcGxheS1uYW1lPgorICA8ZGVzY3JpcHRpb24+CisgICAgVG9tY2F0IEhUTUwgYmFzZWQgYWRtaW5pc3RyYXRpb24gd2ViIGFwcGxpY2F0aW9uLgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDwhLS0gRXhhbXBsZSBmaWx0ZXIgdG8gc2V0IGNoYXJhY3RlciBlbmNvZGluZyBvbiBlYWNoIHJlcXVlc3QuCisgICAgICAgVW5jb21tZW50IHRoaXMgZmlsdGVyIGRlZmluaXRpb24gYW5kIHRoZSBtYXBwaW5nIHRvIHVzZQorICAgICAgIHRoZSBmaWx0ZXIgdG8gZGVjb2RlIHBvc3QgYW5kIGdldCBwYXJhbWV0ZXJzIC0tPgorCisgIDxmaWx0ZXI+CisgICAgPGZpbHRlci1uYW1lPlNldCBDaGFyYWN0ZXIgRW5jb2Rpbmc8L2ZpbHRlci1uYW1lPgorICAgIDxmaWx0ZXItY2xhc3M+b3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uZmlsdGVycy5TZXRDaGFyYWN0ZXJFbmNvZGluZ0ZpbHRlcjwvZmlsdGVyLWNsYXNzPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+ZW5jb2Rpbmc8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+VVRGODwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICA8L2ZpbHRlcj4KKworICA8IS0tIEV4YW1wbGUgZmlsdGVyIG1hcHBpbmcgdG8gYXBwbHkgdGhlICJTZXQgQ2hhcmFjdGVyIEVuY29kaW5nIiBmaWx0ZXIKKyAgICAgICB0byAqYWxsKiByZXF1ZXN0cyBwcm9jZXNzZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24gLS0+CisKKyAgPGZpbHRlci1tYXBwaW5nPgorICAgIDxmaWx0ZXItbmFtZT5TZXQgQ2hhcmFjdGVyIEVuY29kaW5nPC9maWx0ZXItbmFtZT4KKyAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICA8L2ZpbHRlci1tYXBwaW5nPgorCisgIDwhLS0gQWN0aW9uIFNlcnZsZXQgQ29uZmlndXJhdGlvbiAtLT4KKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5hY3Rpb248L3NlcnZsZXQtbmFtZT4KKyAgICA8c2VydmxldC1jbGFzcz4KKyAgICAgIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldAorICAgIDwvc2VydmxldC1jbGFzcz4KKzwhLS0gRGVwcmVjYXRlZAorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+YXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+CisgICAgICAgIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uUmVzb3VyY2VzCisgICAgICA8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKy0tPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+Y29uZmlnPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL3N0cnV0cy1jb25maWcueG1sPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+Cis8IS0tIERlcHJlY2F0ZWQgICAKKyAgICA8aW5pdC1wYXJhbT4KKyAgICAgIDxwYXJhbS1uYW1lPmRlYnVnPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPjA8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKy0tPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+ZGV0YWlsPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPjA8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKzwhLS0gRGVwcmVjYXRlZAorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+bG9jYWxlPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKy0tPgorPCEtLSBEZXByZWNhdGVkCisgICAgPGluaXQtcGFyYW0+CisgICAgICA8cGFyYW0tbmFtZT5ub2NhY2hlPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKy0tPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+dmFsaWRhdGU8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8IS0tIExhYmVsIHRvIGJlIGRpc3BsYXllZCBmb3Igcm9vdG5vZGUuIElmIGFic2VudCwgcm9vdG5vZGUgaXMgbm90IHJlbmRlcmVkIC0tPgorICAgIDwhLS0KKyAgICA8aW5pdC1wYXJhbT4KKyAgICAgIDxwYXJhbS1uYW1lPnJvb3Rub2RlbmFtZTwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT5Ub21jYXQgUm9vdDwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICAgIC0tPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+dHJlZWJ1aWxkZXJzPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPgorICAgICAgICBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlciwKKyAgICAgICAgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlJlc291cmNlc1RyZWVCdWlsZGVyLAorICAgICAgICBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5Vc2Vyc1RyZWVCdWlsZGVyCisgICAgPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgICAgPGluaXQtcGFyYW0+CisgICAgICA8cGFyYW0tbmFtZT5kb21haW48L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+Q2F0YWxpbmE8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKyAgPC9zZXJ2bGV0PgorCisgIDwhLS0gQWN0aW9uIFNlcnZsZXQgTWFwcGluZyAtLT4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPmFjdGlvbjwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4qLmRvPC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgPCEtLSBTZWN1cml0eSBpcyBhY3RpdmUgb24gZW50aXJlIGRpcmVjdG9yeSAtLT4KKyAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgPGRpc3BsYXktbmFtZT5Ub21jYXQgU2VydmVyIENvbmZpZ3VyYXRpb24gU2VjdXJpdHkgQ29uc3RyYWludDwvZGlzcGxheS1uYW1lPgorICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT5Qcm90ZWN0ZWQgQXJlYTwvd2ViLXJlc291cmNlLW5hbWU+CisgICAgICA8IS0tIERlZmluZSB0aGUgY29udGV4dC1yZWxhdGl2ZSBVUkwocykgdG8gYmUgcHJvdGVjdGVkIC0tPgorICAgICAgPHVybC1wYXR0ZXJuPiouanNwPC91cmwtcGF0dGVybj4KKyAgICAgIDx1cmwtcGF0dGVybj4qLmRvPC91cmwtcGF0dGVybj4KKyAgICAgIDx1cmwtcGF0dGVybj4qLmh0bWw8L3VybC1wYXR0ZXJuPgorICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgPGF1dGgtY29uc3RyYWludD4KKyAgICAgIDwhLS0gQW55b25lIHdpdGggb25lIG9mIHRoZSBsaXN0ZWQgcm9sZXMgbWF5IGFjY2VzcyB0aGlzIGFyZWEgLS0+CisgICAgICA8cm9sZS1uYW1lPmFkbWluPC9yb2xlLW5hbWU+CisgICAgPC9hdXRoLWNvbnN0cmFpbnQ+CisgIDwvc2VjdXJpdHktY29uc3RyYWludD4KKworICA8IS0tIExvZ2luIGNvbmZpZ3VyYXRpb24gdXNlcyBmb3JtLWJhc2VkIGF1dGhlbnRpY2F0aW9uIC0tPgorICA8bG9naW4tY29uZmlnPgorICAgIDxhdXRoLW1ldGhvZD5GT1JNPC9hdXRoLW1ldGhvZD4KKyAgICA8cmVhbG0tbmFtZT5Ub21jYXQgU2VydmVyIENvbmZpZ3VyYXRpb24gRm9ybS1CYXNlZCBBdXRoZW50aWNhdGlvbiBBcmVhPC9yZWFsbS1uYW1lPgorICAgIDxmb3JtLWxvZ2luLWNvbmZpZz4KKyAgICAgIDxmb3JtLWxvZ2luLXBhZ2U+L2xvZ2luLmpzcDwvZm9ybS1sb2dpbi1wYWdlPgorICAgICAgPGZvcm0tZXJyb3ItcGFnZT4vZXJyb3IuanNwPC9mb3JtLWVycm9yLXBhZ2U+CisgICAgPC9mb3JtLWxvZ2luLWNvbmZpZz4KKyAgPC9sb2dpbi1jb25maWc+CisKKyAgPCEtLSBTZWN1cml0eSByb2xlcyByZWZlcmVuY2VkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uIC0tPgorICA8c2VjdXJpdHktcm9sZT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBUaGUgcm9sZSB0aGF0IGlzIHJlcXVpcmVkIHRvIGxvZyBpbiB0byB0aGUgQWRtaW5pc3RyYXRpb24gQXBwbGljYXRpb24KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDxyb2xlLW5hbWU+YWRtaW48L3JvbGUtbmFtZT4KKyAgPC9zZWN1cml0eS1yb2xlPgorCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9hZG1pbi5jc3MgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9hZG1pbi5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiNzQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2FkbWluLmNzcwpAQCAtMCwwICsxLDk1IEBACisubWFzdGhlYWQtdGl0bGUtdGV4dCB7CisgIGNvbG9yOiAjRkZGRkZGOworICBtYXJnaW46IDNweCA1cHggNXB4IDNweDsKKyAgZm9udC1zaXplOiBsYXJnZTsKKyAgZm9udC1mYW1pbHk6ICBBcmlhbCwgVmVyZGFuYSxIZWx2ZXRpY2EsIFNhbnMtU2VyaWY7Cit9CisKKy5wYWdlLXRpdGxlLXRleHQgeworICBjb2xvcjogI0ZGRkZGRjsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIG1hcmdpbjogM3B4IDVweCA1cHggM3B4OworICBmb250LXNpemU6IG5vcm1hbDsKKyAgZm9udC1mYW1pbHk6IEFyaWFsLCBWZXJkYW5hLCBIZWx2ZXRpY2EsIFNhbnMtU2VyaWY7Cit9CisKKy50YWJsZS10aXRsZS10ZXh0IHsKKyAgY29sb3I6ICMwMDAwMDA7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBtYXJnaW46IDNweCA1cHggNXB4IDRweDsKKyAgZm9udC1mYW1pbHk6IEFyaWFsLCBWZXJkYW5hLCBIZWx2ZXRpY2EsIFNhbnMtU2VyaWY7Cit9CisKKy50YWJsZS1oZWFkZXItdGV4dCB7CisgIGNvbG9yOiAjRkZGRkZGOworICBmb250LXdlaWdodDogbm9ybWFsOworICBtYXJnaW46IDNweCA1cHggMXB4IDE1cHg7CisgIGZvbnQtZmFtaWx5OiAgQXJpYWwsIFZlcmRhbmEsSGVsdmV0aWNhLCBTYW5zLVNlcmlmOworfQorCisudGFibGUtbGFiZWwtdGV4dCB7CisgIGNvbG9yOiAjMDAwMDAwOworICBtYXJnaW46IDNweCA1cHggM3B4IDE1cHg7CisgIGZvbnQtZmFtaWx5OiBBcmlhbCwgVmVyZGFuYSwgSGVsdmV0aWNhLCBTYW5zLVNlcmlmOworfQorCisudGFibGUtbm9ybWFsLXRleHQgeworICBjb2xvcjogIzAwMDAwMDsKKyAgbWFyZ2luOiAzcHggNXB4IDNweCAxNXB4OworICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKK30KKworLmJhY2stdGFibGUgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OUNDOworICBtYXJnaW46IDBweCA1cHggM3B4IDVweDsKKyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtU2VyaWY7Cit9CisKKy5mcm9udC10YWJsZSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7CisgIGZvbnQtZmFtaWx5OiBBcmlhbCwgVmVyZGFuYSwgSGVsdmV0aWNhLCBTYW5zLVNlcmlmOworfQorCisucGFnZS10aXRsZS1yb3cgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzE3MUE1OworICB0ZXh0LWFsaWduOiByaWdodDsKKyAgZm9udC1mYW1pbHk6IEFyaWFsLCBWZXJkYW5hLCBIZWx2ZXRpY2EsIFNhbnMtU2VyaWY7Cit9CisKKy5oZWFkZXItcm93IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzk5OTlDQzsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworICBmb250LWZhbWlseTogQXJpYWwsIFZlcmRhbmEsIEhlbHZldGljYSwgU2Fucy1TZXJpZjsKK30KKworLnNvcnQtcm93IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI0NFQ0VGRjsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworICBmb250LWZhbWlseTogQXJpYWwsIFZlcmRhbmEsIEhlbHZldGljYSwgU2Fucy1TZXJpZjsKK30KKworLmxpbmUtcm93IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKKyAgZm9udC1mYW1pbHk6IEFyaWFsLCBWZXJkYW5hLCBIZWx2ZXRpY2EsIFNhbnMtU2VyaWY7Cit9CisKKy5idXR0b24geworICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0ZGOworICBmb250LWZhbWlseTogQXJpYWwsIFZlcmRhbmEsIEhlbHZldGljYSwgU2Fucy1TZXJpZjsKK30KKworYS5idXR0b24tbGluay10ZXh0OnZpc2l0ZWQsIGEuYnV0dG9uLWxpbmstdGV4dDpsaW5rLCBhLmJ1dHRvbi1saW5rLXRleHQ6YWN0aXZlIHsKKyAgY29sb3I6ICMwMDAwMDA7CisgIGJhY2tncm91bmQtY29sb3I6ICNDQ0NDRkY7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBmb250LWZhbWlseTogQXJpYWwsIFZlcmRhbmEsIEdlbmV2YSwgSGVsdmV0aWNhLCBTYW5zLVNlcmlmOworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKK2EuYnV0dG9uLWxpbmstdGV4dDpob3ZlciB7CisgIGNvbG9yOiAjMDAwMDAwOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0ZGOworICBmb250LXdlaWdodDogYm9sZDsKKyAgZm9udC1mYW1pbHk6IEFyaWFsLCBWZXJkYW5hLCBHZW5ldmEsIEhlbHZldGljYSwgU2Fucy1TZXJpZjsKKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9hZG1pbi54bWwgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9hZG1pbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3MTFlZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2FkbWluLnhtbApAQCAtMCwwICsxLDIwIEBACis8IS0tCisKKyAgICBDb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIFRvbWNhdCBBZG1pbmlzdHJhdGlvbiBXZWIgQXBwCisKKyAgICAkSWQkCisKKy0tPgorCisKKzxDb250ZXh0IGRvY0Jhc2U9IiR7Y2F0YWxpbmEuaG9tZX0vc2VydmVyL3dlYmFwcHMvYWRtaW4iIHByaXZpbGVnZWQ9InRydWUiCisgICAgICAgICBhbnRpUmVzb3VyY2VMb2NraW5nPSJmYWxzZSIgYW50aUpBUkxvY2tpbmc9ImZhbHNlIj4KKworICA8IS0tIFVuY29tbWVudCB0aGlzIFZhbHZlIHRvIGxpbWl0IGFjY2VzcyB0byB0aGUgQWRtaW4gYXBwIHRvIGxvY2FsaG9zdAorICAgZm9yIG9idmlvdXMgc2VjdXJpdHkgcmVhc29ucy4gQWxsb3cgbWF5IGJlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YKKyAgIGhvc3RzIChvciBldmVuIHJlZ3VsYXIgZXhwcmVzc2lvbnMpLgorICA8VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZW1vdGVBZGRyVmFsdmUiCisgICAgYWxsb3c9IjEyNy4wLjAuMSIvPgorICAtLT4KKworPC9Db250ZXh0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vYmFubmVyLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2Jhbm5lci5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNmOWQ5MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2Jhbm5lci5qc3AKQEAgLTAsMCArMSw3OCBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKworPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwhLS0gU3RhbmRhcmQgQ29udGVudCAtLT4KKworPCVAIGluY2x1ZGUgZmlsZT0iaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorCis8Ym9keSBsZWZ0bWFyZ2luPSIwIiB0b3BtYXJnaW49IjAiIG1hcmdpbndpZHRoPSIwIiBtYXJnaW5oZWlnaHQ9IjAiIGJnY29sb3I9IjcxNzFBNSIgYmFja2dyb3VuZD0iaW1hZ2VzL0JsdWVUaWxlLmdpZiI+CisKKzx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0cj4KKyAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJtaWRkbGUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJtYXN0aGVhZC10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+PGltZyBzcmM9ImltYWdlcy9Ub21jYXRCYW5uZXIuanBnIiBhbHQ9IlRvbWNhdCBXZWIgU2VydmVyIEFkbWluaXN0cmF0aW9uIFRvb2wiIGhlaWdodD0iMTIwIj48L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8Zm9ybSBtZXRob2Q9J3Bvc3QnIGFjdGlvbj0nPCU9cmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpJT4vY29tbWl0Q2hhbmdlcy5kbycgdGFyZ2V0PSdfc2VsZic+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiB2YWxpZ249Im1pZGRsZSI+CisgICAgICAgIDxodG1sOnN1Ym1pdCBvbmNsaWNrPSJpZihjb25maXJtKCdBcmUgeW91IHN1cmU/ICBDb21taXR0aW5nIGNoYW5nZXMgd2lsbCByZXN0YXJ0IG1vZGlmaWVkIHdlYiBhcHBsaWNhdGlvbnMuJykpIHsgcmV0dXJuIHRydWU7IH0gZWxzZSB7IHJldHVybiBmYWxzZTsgfSI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImJ1dHRvbi5jb21taXQiLz4KKyAgICAgICAgPC9odG1sOnN1Ym1pdD4KKyAgICAgIDwvdGQ+CisgICAgICA8L2Zvcm0+CisgICAgICA8dGQgd2lkdGg9IjElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiIGFsaWduPSJsZWZ0Ij4mbmJzcCA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPGZvcm0gbWV0aG9kPSdwb3N0JyBhY3Rpb249JzwlPXJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSU+L2xvZ091dC5kbycgdGFyZ2V0PSdfdG9wJz4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIHZhbGlnbj0ibWlkZGxlIj4KKyAgICAgICAgPGh0bWw6c3VibWl0PgorICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJidXR0b24ubG9nb3V0Ii8+CisgICAgICAgIDwvaHRtbDpzdWJtaXQ+CisgICAgICA8L3RkPgorICAgICAgPHRkIHdpZHRoPSIxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0IiBhbGlnbj0ibGVmdCI+Jm5ic3AgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvZm9ybT4KKyAgPC90cj4KKzwvdGFibGU+CisKKzwhLS0gU2VsZWN0IGxhbmd1YWdlIC0tPgorPCEtLQorCis8aDI+PGJlYW46bWVzc2FnZSBrZXk9ImxvZ2luLmNoYW5nZUxhbmd1YWdlIi8+PC9oMj4KKworPGh0bWw6Zm9ybSBhY3Rpb249Ii9zZXRMb2NhbGUiIG1ldGhvZD0iUE9TVCIgdGFyZ2V0PSJfc2VsZiI+CisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSI1Ij4KKyAgICA8dHI+CisgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJsb2NhbGUiPgorICAgICAgICAgIDxodG1sOm9wdGlvbnMgbmFtZT0iYXBwbGljYXRpb25Mb2NhbGVzIgorICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ibG9jYWxlVmFsdWVzIgorICAgICAgICAgICAgICAgICAgIGxhYmVsTmFtZT0iYXBwbGljYXRpb25Mb2NhbGVzIgorICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibG9jYWxlTGFiZWxzIi8+CisgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgPGh0bWw6c3VibWl0PgorICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJidXR0b24uY2hhbmdlIi8+CisgICAgICAgIDwvaHRtbDpzdWJtaXQ+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+Cis8L2h0bWw6Zm9ybT4KKy0tPgorCis8L2JvZHk+CisKKzwhLS0gU3RhbmRhcmQgRm9vdGVyIC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSJmb290ZXIuanNwIiAlPgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2JsYW5rLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2JsYW5rLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmMzMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vYmxhbmsuanNwCkBAIC0wLDAgKzEsMjQgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+CisKKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8IS0tIFN0YW5kYXJkIENvbnRlbnQgLS0+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImhlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKworPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9ImltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPC9ib2R5PgorCis8IS0tIFN0YW5kYXJkIEZvb3RlciAtLT4KKworPCVAIGluY2x1ZGUgZmlsZT0iZm9vdGVyLmpzcCIgJT4KKworPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9idWlsZC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVjZmYwMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2J1aWxkLnhtbApAQCAtMCwwICsxLDI0MSBAQAorPHByb2plY3QgbmFtZT0iYWRtaW4iIGRlZmF1bHQ9ImJ1aWxkLW1haW4iIGJhc2VkaXI9Ii4iPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSBQcm9wZXJ0eSBWYWx1ZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8IS0tIFNlZSAiYnVpbGQucHJvcGVydGllcy5zYW1wbGUiIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGZvciBhbGwgICAgIC0tPgorICA8IS0tIHByb3BlcnR5IHZhbHVlcyB5b3UgbXVzdCBjdXN0b21pemUgZm9yIHN1Y2Nlc3NmdWwgYnVpbGRpbmchISEgICAgICAgIC0tPgorICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iLi4vYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iLi4vLi4vYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9L2J1aWxkLnByb3BlcnRpZXMiLz4KKworICA8IS0tIEJ1aWxkIERlZmF1bHRzIC0tPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiICB2YWx1ZT0ibW9kZXJuIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWJhcHBzLmJ1aWxkIiAgIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uL2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWJhcHBzLmRpc3QiICAgIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uL2Rpc3QiLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcC5uYW1lIiAgICAgdmFsdWU9ImFkbWluIi8+CisKKyAgPCEtLSBEZXBlbmRlbnQgSkFScyBhbmQgZmlsZXMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2bGV0LWFwaS5qYXIiIHZhbHVlPSIke2FwaS5ob21lfS9qc3IxNTQvZGlzdC9saWIvc2VydmxldC1hcGkuamFyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqc3AtYXBpLmphciIgICAgIHZhbHVlPSIke2FwaS5ob21lfS9qc3IxNTIvZGlzdC9saWIvanNwLWFwaS5qYXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9InN0cnV0cy1jb3JlLmphciIgdmFsdWU9IiR7c3RydXRzLmphcn0iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzdHJ1dHMtdGFnbGliLmphciIgdmFsdWU9IiR7c3RydXRzLmphcn0iIC8+CisKKyAgPCEtLSBDb25zdHJ1Y3QgQWRtaW4gY2xhc3NwYXRoIC0tPgorICA8cGF0aCBpZD0iYWRtaW4uY2xhc3NwYXRoIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1tb2RlbGVyLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7am14Lmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7c2VydmxldC1hcGkuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqc3AtYXBpLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7c3RydXRzLWNvcmUuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWJlYW51dGlscy5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtY29sbGVjdGlvbnMuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWRpZ2VzdGVyLmphcn0iLz4KKyAgPC9wYXRoPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBTZXQgY29tcGlsZSBmbGFncyA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJmbGFncyI+CisKKyAgICA8IS0tIEpESyBmbGFncyAtLT4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsuMS4yLnByZXNlbnQiIGNsYXNzbmFtZT0iamF2YS51dGlsLkhhc2hNYXAiIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrLjEuMy5wcmVzZW50IgorICAgICBjbGFzc25hbWU9ImphdmEubGFuZy5yZWZsZWN0LlByb3h5IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Impkay4xLjQucHJlc2VudCIgY2xhc3NuYW1lPSJqYXZhLm5pby5CdWZmZXIiIC8+CisKKyAgICA8IS0tIEFudCBmbGFncyAtLT4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJzdHlsZS5hdmFpbGFibGUiCisgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuVHJhWExpYWlzb24iIC8+CisKKyAgICA8IS0tIENsYXNzIGF2YWlsYWJpbGl0eSBmbGFncyAtLT4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqYXhwLnByZXNlbnQiPgorICAgICAgPGFuZD4KKyAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9ImphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciIKKyAgICAgICAgIGNsYXNzcGF0aD0iJHt4ZXJjZXMuamFyfSIgLz4KKyAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9Im9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyIgorICAgICAgICAgY2xhc3NwYXRoPSIke3hlcmNlcy5qYXJ9IiAvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iam14LnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0iamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlciIKKyAgICAgY2xhc3NwYXRoPSIke2pteC5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Im1vZGVsZXIucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeSIKKyAgICAgY2xhc3NwYXRoPSIke2NvbW1vbnMtbW9kZWxlci5qYXJ9OiR7am14Lmphcn0iLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJzZXJ2bGV0LnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0iamF2YXguc2VydmxldC5TZXJ2bGV0IgorICAgICBjbGFzc3BhdGg9IiR7c2VydmxldC1hcGkuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqc3AucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJqYXZheC5zZXJ2bGV0LmpzcC5Kc3BQYWdlIgorICAgICBjbGFzc3BhdGg9IiR7anNwLWFwaS5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InN0cnV0cy5wcmVzZW50IgorICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtIgorICAgICBjbGFzc3BhdGg9IiR7c3RydXRzLWNvcmUuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJiZWFudXRpbHMucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLlByb3BlcnR5VXRpbHMiCisgICAgIGNsYXNzcGF0aD0iJHtjb21tb25zLWJlYW51dGlscy5qYXJ9IiAvPgorCisKKyAgICA8IS0tIEpBUiBmaWxlcyBhdmFpbGFiaWxpdHkgZmxhZ3MgLS0+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iam14Lmphci5wcmVzZW50IiAgIGZpbGU9IiR7am14Lmphcn0iIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ibW9kZWxlci5qYXIucHJlc2VudCIgZmlsZT0iJHtjb21tb25zLW1vZGVsZXIuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJzZXJ2bGV0LWFwaS5qYXIucHJlc2VudCIgZmlsZT0iJHtzZXJ2bGV0LWFwaS5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpzcC1hcGkuamFyLnByZXNlbnQiIGZpbGU9IiR7anNwLWFwaS5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InN0cnV0cy5qYXIucHJlc2VudCIgIGZpbGU9IiR7c3RydXRzLWNvcmUuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJiZWFudXRpbHMuamFyLnByZXNlbnQiIGZpbGU9IiR7Y29tbW9ucy1iZWFudXRpbHMuamFyfSIgLz4KKworICAgIDwhLS0gQ29uZGl0aW9uYWwgY29tcGlsYXRpb24gZmxhZ3MgKGRldGVybWluZWQgZnJvbSB0aGUgZmxhZ3MgYWJvdmUpIC0tPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbXBpbGUuYWRtaW4iPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxhbmQ+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke3N0cnV0cy5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7am14LnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHttb2RlbGVyLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgICA8L2FuZD4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8IS0tIENvbmRpdGlvbmFsIGNvcHkgZmxhZ3MgKGRldGVybWluZWQgZnJvbSB0aGUgZmxhZ3MgYWJvdmUpIC0tPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvcHkuc3RydXRzLmphciI+CisgICAgICA8b3I+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtmdWxsLmRpc3R9IiBhcmcyPSJvbiIgLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke3N0cnV0cy5qYXIucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBTZXQgY29tcGlsZSBmbGFncyA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJmbGFncy5kaXNwbGF5IiBkZXBlbmRzPSJmbGFncyIgdW5sZXNzPSJmbGFncy5oaWRlIj4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBCdWlsZCBlbnZpcm9ubWVudCBmb3IgVG9tY2F0IFNlcnZlciBDb25maWd1cmF0aW9uIEFwcGxpY2F0aW9uIC0tLSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9IklmICR7cHJvcGVydHlfbmFtZX0gaXMgZGlzcGxheWVkLCB0aGVuIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0KSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBCdWlsZCBvcHRpb25zIC0tLSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJmdWxsLmRpc3Q9JHtmdWxsLmRpc3R9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImJ1aWxkLnN5c2NsYXNzcGF0aD0ke2J1aWxkLnN5c2NsYXNzcGF0aH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5kZWJ1Zz0ke2NvbXBpbGUuZGVidWd9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUuZGVwcmVjYXRpb249JHtjb21waWxlLmRlcHJlY2F0aW9ufSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlLm9wdGltaXplPSR7Y29tcGlsZS5vcHRpbWl6ZX0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gQW50IEZsYWdzIC0tLSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSImbHQ7c3R5bGUmZ3Q7IHRhc2sgYXZhaWxhYmxlIChyZXF1aXJlZCk9JHtzdHlsZS5hdmFpbGFibGV9IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIEpESyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iamRrLjEuMi5wcmVzZW50PSR7amRrLjEuMi5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqZGsuMS4zLnByZXNlbnQ9JHtqZGsuMS4zLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Impkay4xLjQucHJlc2VudD0ke2pkay4xLjQucHJlc2VudH0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gUmVxdWlyZWQgTGlicmFyaWVzIC0tLSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqYXhwLnByZXNlbnQ9JHtqYXhwLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImpteC5wcmVzZW50PSR7am14LnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Im1vZGVsZXIucHJlc2VudD0ke21vZGVsZXIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ic2VydmxldC5wcmVzZW50PSR7c2VydmxldC5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqc3AucHJlc2VudD0ke2pzcC5wcmVzZW50fSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBSZXF1aXJlZCBKQVJzIC0tLSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqbXguamFyLnByZXNlbnQ9JHtqbXguamFyLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Im1vZGVsZXIuamFyLnByZXNlbnQ9JHttb2RlbGVyLmphci5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJzZXJ2bGV0LWFwaS5qYXIucHJlc2VudD0ke3NlcnZsZXQtYXBpLmphci5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqc3AtYXBpLmphci5wcmVzZW50PSR7anNwLWFwaS5qYXIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ic3RydXRzLmphci5wcmVzZW50PSR7c3RydXRzLmphci5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJiZWFudXRpbHMuamFyLnByZXNlbnQ9JHtiZWFudXRpbHMuamFyLnByZXNlbnR9IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIE9wdGlvbmFsIEpBUnMgLS0tIiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIENvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGZsYWdzIC0tLSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlLmFkbWluPSR7Y29tcGlsZS5hZG1pbn0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gRGlzdHJpYnV0aW9uIGZsYWdzIC0tLSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb3B5LnN0cnV0cy5qYXI9JHtjb3B5LnN0cnV0cy5qYXJ9IiAvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENvcHkgSkFScyA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJjb3B5LXN0cnV0cy5qYXIiIGlmPSJzdHJ1dHMucHJlc2VudCI+CisgICAgPGNvcHkgdG9kaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vV0VCLUlORi9saWIiIGZpbGU9IiR7c3RydXRzLWNvcmUuamFyfSIvPgorICAgIDxjb3B5IHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYvbGliIiBmaWxlPSIke3N0cnV0cy10YWdsaWIuamFyfSIgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5idWlsZH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9XRUItSU5GIi8+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9XRUItSU5GL2NsYXNzZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYvbGliIi8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09IEJVSUxEOiBDb3B5IFN0YXRpYyBGaWxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1zdGF0aWMiIGRlcGVuZHM9ImZsYWdzLGZsYWdzLmRpc3BsYXksYnVpbGQtcHJlcGFyZSxjb3B5LXN0cnV0cy5qYXIiPgorICAgIDxjb3B5IHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYvbGliIiBmaWxlPSIke2NvbW1vbnMtYmVhbnV0aWxzLmphcn0iLz4KKyAgICA8Y29weSB0b2ZpbGU9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vV0VCLUlORi9saWIvY29tbW9ucy1jb2xsZWN0aW9ucy5qYXIiIAorICAgIAlmaWxlPSIke2NvbW1vbnMtY29sbGVjdGlvbnMuamFyfSIvPgorICAgIDxjb3B5IHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYvbGliIiBmaWxlPSIke2NvbW1vbnMtZGlnZXN0ZXIuamFyfSIvPgorICAgIDxjb3B5IHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImJ1aWxkLioiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT0gQlVJTEQ6IENvbXBpbGUgU2VydmVyIENvbXBvbmVudHMgPT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtbWFpbiIgZGVwZW5kcz0iYnVpbGQtc3RhdGljIiBpZj0iY29tcGlsZS5hZG1pbiI+CisgIAorICAgIDxqYXZhYyAgIHNyY2Rpcj0iV0VCLUlORi9jbGFzc2VzIgorICAgICAgICAgICAgIGRlc3RkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vV0VCLUlORi9jbGFzc2VzIgorICAgICAgICAgICAgIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IiBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKyAgICAgICAgICAgICBvcHRpbWl6ZT0iJHtjb21waWxlLm9wdGltaXplfSIKKyAgICAgICAgICAgICBleGNsdWRlcz0iKiovQ1ZTLyoqIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImFkbWluLmNsYXNzcGF0aCIgLz4KKyAgICA8L2phdmFjPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBCVUlMRDogUmVidWlsZCBFdmVyeXRoaW5nID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGJ1aWxkLW1haW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYW5kIGJ1aWxkIGFkbWluIHdlYmFwcCIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7d2ViYXBwcy5idWlsZH0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QtcHJlcGFyZSI+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmRpc3R9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDcmVhdGUgRGlzdHJpYnV0aW9uIEZpbGVzID09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJidWlsZC1tYWluLGRpc3QtcHJlcGFyZSIKKyAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYWRtaW4gd2ViYXBwIGJpbmFyeSBkaXN0cmlidXRpb24iPgorICAgICAgPGphciAgIGphcmZpbGU9IiR7d2ViYXBwcy5kaXN0fS8ke3dlYmFwcC5uYW1lfS53YXIiCisgICAgICAgICAgICAgYmFzZWRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSIgaW5jbHVkZXM9IioqIi8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0LWNsZWFuIj4KKyAgICA8ZGVsdHJlZSBkaXI9IiR7ZGlzdC5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IENvbnZlbmllbnQgU3lub255bXMgPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iYnVpbGQtY2xlYW4sZGlzdC1jbGVhbiIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiBidWlsZCBhbmQgZGlzdCBkaXJlY3RvcmllcyIvPgorCisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2J1dHRvbnMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vYnV0dG9ucy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwZjVlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2J1dHRvbnMuanNwCkBAIC0wLDAgKzEsMTYgQEAKKyAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4mbmJzcDs8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIGNvbHNwYW49IjIiIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8aHRtbDpzdWJtaXQgc3R5bGVDbGFzcz0iYnV0dG9uIj4KKyAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImJ1dHRvbi5zYXZlIi8+IAorICAgICAgICA8L2h0bWw6c3VibWl0PiAgICAgICAgICAKKyAgICAgICAgJm5ic3A7CisgICAgICAgIDxodG1sOnJlc2V0IHN0eWxlQ2xhc3M9ImJ1dHRvbiI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYnV0dG9uLmNhbmNlbCIvPiAKKyAgICAgICAgPC9odG1sOnJlc2V0PiAKKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vY29ubmVjdG9yL2Nvbm5lY3Rvci5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9jb25uZWN0b3IvY29ubmVjdG9yLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDYwYjkzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vY29ubmVjdG9yL2Nvbm5lY3Rvci5qc3AKQEAgLTAsMCArMSw0NzAgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+CisKKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL1NhdmVDb25uZWN0b3IiPgorCisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImNvbm5lY3Rvck5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJjb25uZWN0b3JUeXBlIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ic2VydmljZU5hbWUiLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmNvbm5lY3RvcnMuY3JlYXRlIi8+CisgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJDb25uZWN0b3IgQWN0aW9ucyI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4gLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxsb2dpYzpub3RFcXVhbCBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJwb3J0VGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0nPCU9IEludGVnZXIudG9TdHJpbmcocmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCkpICU+Jz4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9EZWxldGVDb25uZWN0b3IuZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmNvbm5lY3RvcnMuZGVsZXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPkdlbmVyYWw8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+Jm5ic3A7PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImNvbm5lY3RvclR5cGUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IudHlwZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImNvbm5lY3RvclR5cGUiIG9uY2hhbmdlPSJJQV9qdW1wTWVudSgnc2VsZicsdGhpcykiIHN0eWxlSWQ9ImNvbm5lY3RvclR5cGUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJjb25uZWN0b3JUeXBlVmFscyIgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImNvbm5lY3RvclR5cGVWYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImNvbm5lY3RvclR5cGVWYWxzIiBwcm9wZXJ0eT0idmFsdWUiIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iY29ubmVjdG9yVHlwZSIgc2NvcGU9InNlc3Npb24iLz4KKyAgICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgIDwlLS0gZG8gbm90IHNob3cgc2NoZW1lIHdoaWxlIGNyZWF0aW5nIGEgbmV3IGNvbm5lY3RvciAtLSU+CisgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5zY2hlbWUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0ic2NoZW1lIiBzY29wZT0ic2Vzc2lvbiIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgICAgPC9sb2dpYzpub3RFcXVhbD4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImVuYWJsZUROUyI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5lbmFibGUuZG5zIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImVuYWJsZUxvb2t1cHMiIHN0eWxlSWQ9ImVuYWJsZUROUyI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idXJpZW5jb2RpbmciPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IudXJpZW5jb2RpbmciLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iVVJJRW5jb2RpbmdUZXh0IiBzaXplPSIzMCIgc3R5bGVJZD0idXJpZW5jb2RpbmciLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ1c2Vib2R5ZW5jb2RpbmciPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IudXNlQm9keUVuY29kaW5nRm9yVVJJIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InVzZUJvZHlFbmNvZGluZ0ZvclVSSVRleHQiIHN0eWxlSWQ9InVzZWJvZHllbmNvZGluZyI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iYWxsb3dUcmFjZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5hbGxvd1RyYWNlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImFsbG93VHJhY2VUZXh0IiBzdHlsZUlkPSJhbGxvd1RyYWNlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJib29sZWFuVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJib29sZWFuVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPCUtLSBJbnB1dCBvbmx5IGFsbG93ZWQgb24gY3JlYXRlIHRyYW5zYWN0aW9uIC0tJT4KKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJhZGRyZXNzIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLmFkZHJlc3MuaXAiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iYWRkcmVzcyIgc2l6ZT0iMjAiIHN0eWxlSWQ9ImFkZHJlc3MiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgICAgICZuYnNwOzxiZWFuOndyaXRlIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJhZGRyZXNzIi8+CisgICAgICAgICAgICAgICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFkZHJlc3MiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InNlY3VyZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5zZWN1cmUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0ic2VjdXJlIiBzdHlsZUlkPSJzZWN1cmUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJib29sZWFuVmFscyIgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8JS0tY29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPlByb2Nlc3NvcnM8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+Jm5ic3A7PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9Im1pblByb2Nlc3NvciI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5taW4iLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ibWluUHJvY2Vzc29yc1RleHQiIHNpemU9IjUiIHN0eWxlSWQ9Im1pblByb2Nlc3NvciIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImNvbm5lY3Rvck1heCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5tYXgiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ibWF4UHJvY2Vzc29yc1RleHQiIHNpemU9IjUiIHN0eWxlSWQ9ImNvbm5lY3Rvck1heCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdy0tJT4KKworPCUtLSBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIHN1cHBvcnRlZCBvbmx5IGZvciBDb3lvdGUgSFRUUC9TIDEuMSBDb25uZWN0b3JzIC0tJT4KKworICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImNvbm5lY3RvclR5cGUiIHNjb3BlPSJzZXNzaW9uIgorICAgICAgICAgICAgICAgICAgdmFsdWU9IkFKUCI+CisgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJhY2NlcHRDb3VudCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5hY2NlcHQuY291bnQiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJhY2NlcHRDb3VudFRleHQiIHNpemU9IjUiIG1heGxlbmd0aD0iNSIgc3R5bGVJZD0iYWNjZXB0Q291bnQiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJjb21wcmVzc2lvbiI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5jb21wcmVzc2lvbiIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJjb21wcmVzc2lvbiIgc2l6ZT0iMTAiIHN0eWxlSWQ9ImNvbXByZXNzaW9uIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJsaW5nZXIiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IuY29ubmVjdGlvbi5saW5nZXIiLz48YnI+CisgICAgICAgICAgICAgICAgKDxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IubWlsbGlzZWNvbmRzIi8+KSA6PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iY29ubkxpbmdlclRleHQiIHNpemU9IjEwIiBzdHlsZUlkPSJsaW5nZXIiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InRpbWVvdXQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IuY29ubmVjdGlvbi50aW1lb3V0Ii8+PGJyPgorICAgICAgICAgICAgICAgICg8YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLm1pbGxpc2Vjb25kcyIvPikgOjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImNvbm5UaW1lT3V0VGV4dCIgc2l6ZT0iMTAiIHN0eWxlSWQ9InRpbWVvdXQiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InVwbG9hZCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5jb25uZWN0aW9uLnVwbG9hZFRpbWVvdXQiLz48YnI+CisgICAgICAgICAgICAgICAgKDxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IubWlsbGlzZWNvbmRzIi8+KSA6PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iY29ublVwbG9hZFRpbWVPdXRUZXh0IiBzaXplPSIxMCIgc3R5bGVJZD0idXBsb2FkIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iYnVmZmVyc2l6ZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5kZWZhdWx0LmJ1ZmZlciIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJidWZmZXJTaXplVGV4dCIgc2l6ZT0iNSIgc3R5bGVJZD0iYnVmZmVyc2l6ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImRpc2FibGVVcGxvYWQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IuY29ubmVjdGlvbi5kaXNhYmxlVXBsb2FkVGltZW91dCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJkaXNhYmxlVXBsb2FkVGltZW91dCIgc3R5bGVJZD0iZGlzYWJsZVVwbG9hZCI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0ibWF4a2VlcGFsaXZlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLm1heGtlZXBhbGl2ZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9Im1heEtlZXBBbGl2ZVRleHQiIHNpemU9IjUiIG1heGxlbmd0aD0iNSIgc3R5bGVJZD0ibWF4a2VlcGFsaXZlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0ibWF4c3BhcmUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IubWF4c3BhcmUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJtYXhTcGFyZSIgc2l6ZT0iNSIgbWF4bGVuZ3RoPSI1IiBzdHlsZUlkPSJtYXhzcGFyZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKwkKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJtYXh0aHJlYWRzIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLm1heHRocmVhZHMiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJtYXhUaHJlYWRzIiBzaXplPSI1IiBtYXhsZW5ndGg9IjUiIHN0eWxlSWQ9Im1heHRocmVhZHMiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJtaW5zcGFyZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5taW5zcGFyZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9Im1pblNwYXJlIiBzaXplPSI1IiBtYXhsZW5ndGg9IjUiIHN0eWxlSWQ9Im1pbnNwYXJlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idGhyZWFkcHJpb3JpdHkiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IudGhyZWFkcHJpb3JpdHkiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ0aHJlYWRQcmlvcml0eSIgc2l6ZT0iNSIgbWF4bGVuZ3RoPSI1IiBzdHlsZUlkPSJ0aHJlYWRwcmlvcml0eSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InRjcE5vRGVsYXkiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IudGNwTm9EZWxheSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJ0Y3BOb0RlbGF5IiBzdHlsZUlkPSJ0Y3BOb0RlbGF5Ij4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJib29sZWFuVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJib29sZWFuVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ4cG93ZXJlZGJ5Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnhwb3dlcmVkYnkiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0ieHBvd2VyZWRCeSIgc3R5bGVJZD0ieHBvd2VyZWRieSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorCisgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIiBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+UG9ydHM8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+Jm5ic3A7PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8JS0tIElucHV0IG9ubHkgYWxsb3dlZCBvbiBjcmVhdGUgdHJhbnNhY3Rpb24gLS0lPgorICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InBvcnRudW1iZXIiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2ZXIucG9ydG51bWJlciIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJwb3J0VGV4dCIgc2l6ZT0iNSIgc3R5bGVJZD0icG9ydG51bWVyIi8+CisgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0icG9ydFRleHQiLz4KKyAgICAgICAgICAgICAgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icG9ydFRleHQiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InJlZGlyZWN0cG9ydCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5yZWRpcmVjdC5wb3J0bnVtYmVyIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InJlZGlyZWN0UG9ydFRleHQiIHNpemU9IjUiIHN0eWxlSWQ9InJlZGlyZWN0cG9ydCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPlByb3h5PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPiZuYnNwOzwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJwcm94eU5hbWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IucHJveHkubmFtZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJwcm94eU5hbWUiIHNpemU9IjMwIiBzdHlsZUlkPSJwcm94eU5hbWUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJwb3J0TnVtYmVyIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnByb3h5LnBvcnRudW1iZXIiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InByb3h5UG9ydFRleHQiIHNpemU9IjUiIHN0eWxlSWQ9InBvcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKzwlLS0gVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBzdXBwb3J0ZWQgb25seSBvbiBIVFRQUyBDb25uZWN0b3IgLS0lPgorICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9InNjaGVtZSIgc2NvcGU9InNlc3Npb24iCisgICAgICAgICAgICAgICAgICB2YWx1ZT0iaHR0cHMiPgorICAgICAgICA8YnI+CisgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIiBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+RmFjdG9yeSBQcm9wZXJ0aWVzOjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4mbmJzcDs8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iYWxnb3JpdGhtIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLmFsZ29yaXRobSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJhbGdvcml0aG0iIHNpemU9IjEwIiBzdHlsZUlkPSJhbGdvcml0aG0iLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJjaXBoZXJzIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLmNpcGhlcnMiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iY2lwaGVycyIgc2l6ZT0iMTAiIHN0eWxlSWQ9ImNpcGhlcnMiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJjbGllbnRhdXRoIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLmNsaWVudC5hdXRoIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImNsaWVudEF1dGhlbnRpY2F0aW9uIiBzdHlsZUlkPSJjbGllbnRhdXRoIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iY2xpZW50QXV0aFZhbHMiIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJjbGllbnRBdXRoVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJjbGllbnRBdXRoVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPCUtLSBJbnB1dCBhbGxvd2VkIG9ubHkgb24gY3JlYXRlIC0tJT4KKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJrZXlzdG9yZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5rZXlzdG9yZS5maWxlbmFtZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJrZXlTdG9yZUZpbGVOYW1lIiBzaXplPSIzMCIgc3R5bGVJZD0ia2V5c3RvcmUiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJrZXlTdG9yZUZpbGVOYW1lIi8+CisgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPCUtLSBpbnB1dCBwYXNzd29yZCBhbGxvd2VkIG9ubHkgd2hpbGUgY3JlYXRpbmcgY29ubmVjdG9yIC0tJT4KKyAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icGFzc3dvcmQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3Iua2V5c3RvcmUucGFzc3dvcmQiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnBhc3N3b3JkIHByb3BlcnR5PSJrZXlTdG9yZVBhc3N3b3JkIiBzaXplPSIzMCIgc3R5bGVJZD0icGFzc3dvcmQiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisgICAgICAgIDwvbG9naWM6ZXF1YWw+CisKKyAgICAgICAgPCUtLSBJbnB1dCBhbGxvd2VkIG9ubHkgb24gY3JlYXRlIC0tJT4KKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJrZXl0eXBlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLmtleXN0b3JlLnR5cGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ia2V5U3RvcmVUeXBlIiBzaXplPSIzMCIgc3R5bGVJZD0ia2V5dHlwZSIvPgorICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImtleVN0b3JlVHlwZSIvPgorICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDwlLS0gSW5wdXQgYWxsb3dlZCBvbmx5IG9uIGNyZWF0ZSAtLSU+CisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idHJ1c3RzdG9yZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci50cnVzdHN0b3JlLmZpbGVuYW1lIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InRydXN0U3RvcmVGaWxlTmFtZSIgc2l6ZT0iMzAiIHN0eWxlSWQ9InRydXN0c3RvcmUiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJ0cnVzdFN0b3JlRmlsZU5hbWUiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8JS0tIGlucHV0IHBhc3N3b3JkIGFsbG93ZWQgb25seSB3aGlsZSBjcmVhdGluZyBjb25uZWN0b3IgLS0lPgorICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ0cnVzdHBhc3N3b3JkIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnRydXN0c3RvcmUucGFzc3dvcmQiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnBhc3N3b3JkIHByb3BlcnR5PSJ0cnVzdFN0b3JlUGFzc3dvcmQiIHNpemU9IjMwIiBzdHlsZUlkPSJ0cnVzdHBhc3N3b3JkIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorICAgICAgICA8L2xvZ2ljOmVxdWFsPgorCisgICAgICAgIDwlLS0gSW5wdXQgYWxsb3dlZCBvbmx5IG9uIGNyZWF0ZSAtLSU+CisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idHJ1c3R0eXBlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnRydXN0c3RvcmUudHlwZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ0cnVzdFN0b3JlVHlwZSIgc2l6ZT0iMzAiIHN0eWxlSWQ9InRydXN0dHlwZSIvPgorICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9InRydXN0U3RvcmVUeXBlIi8+CisgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJzc2xQcm90b2NvbCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5zc2xQcm90b2NvbCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJzc2xQcm90b2NvbCIgc2l6ZT0iMTAiIHN0eWxlSWQ9InNzbFByb3RvY29sIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgPC9sb2dpYzplcXVhbD4KKyAgIDwvY29udHJvbHM6dGFibGU+CisKKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKyAgICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorICA8L2h0bWw6Zm9ybT4KKzxwPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vY29ubmVjdG9yL2Nvbm5lY3RvcnMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vY29ubmVjdG9yL2Nvbm5lY3RvcnMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NzAyYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9jb25uZWN0b3IvY29ubmVjdG9ycy5qc3AKQEAgLTAsMCArMSw5OSBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ii9EZWxldGVDb25uZWN0b3JzIj4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuY29ubmVjdG9ycy5kZWxldGUiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IkNvbm5lY3RvciBBY3Rpb25zIj4KKyAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLQorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbnM+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorCisgIDwlLS0gQ29ubmVjdG9ycyBMaXN0IC0tJT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIgorICAgICAgICAgd2lkdGg9IjEwMCUiPgorICAgIDx0cj48dGQ+CisKKyAgICAgIDx0YWJsZSBjbGFzcz0iZnJvbnQtdGFibGUiIGJvcmRlcj0iMSIKKyAgICAgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKworICAgICAgICA8dHIgY2xhc3M9ImhlYWRlci1yb3ciPgorICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuZGVsZXRlIi8+CisgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJob3N0Lm5hbWUiLz4KKyAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICA8L3RyPgorCisgICAgICAgIDxsb2dpYzppdGVyYXRlIG5hbWU9ImNvbm5lY3RvcnNMaXN0IiBpZD0iY29ubmVjdG9yIj4KKyAgICAgICAgICA8dHIgY2xhc3M9ImxpbmUtcm93Ij4KKyAgICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPiZuYnNwOworICAgICAgICAgICAgPCUtLSB0aGUgY29ubmVjdG9yIHRoZSBhZG1pbiBhcHAgaXMgcnVubmluZyBvbiBjYW5ub3QgYmUgZGVsZXRlZAorICAgICAgICAgICAgICAgICB0aHJvdWdoIHRoZSB0b29sIC0tJT4KKyAgICAgICAgICAgICAgPGxvZ2ljOm1hdGNoICBuYW1lPSJjb25uZWN0b3IiIHZhbHVlPSc8JT0gSW50ZWdlci50b1N0cmluZyhyZXF1ZXN0LmdldFNlcnZlclBvcnQoKSkgJT4nPgorICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSdyZWQnPio8L2ZvbnQ+CisgICAgICAgICAgICAgIDwvbG9naWM6bWF0Y2g+CisgICAgICAgICAgICA8bG9naWM6bm90TWF0Y2ggbmFtZT0iY29ubmVjdG9yIiB2YWx1ZT0nPCU9IEludGVnZXIudG9TdHJpbmcocmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCkpICU+Jz4KKyAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY29ubmVjdG9ycyI+PC9sYWJlbD4KKyAgICAgICAgICAgICAgPGh0bWw6bXVsdGlib3ggcHJvcGVydHk9ImNvbm5lY3RvcnMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSI8JT0gY29ubmVjdG9yLnRvU3RyaW5nKCkgJT4iIHN0eWxlSWQ9ImNvbm5lY3RvcnMiLz4KKyAgICAgICAgICAgIDwvbG9naWM6bm90TWF0Y2g+CisgICAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgICAgIDxodG1sOmxpbmsgcGFnZT0nPCU9ICIvRWRpdENvbm5lY3Rvci5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5uZXQuVVJMRW5jb2Rlci5lbmNvZGUoY29ubmVjdG9yLnRvU3RyaW5nKCksIlVURi04IikgJT4nPgorICAgICAgICAgICAgICAgIENvbm5lY3RvciAoPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJjb25uZWN0b3IiIGF0dHJpYnV0ZT0icG9ydCIvPikKKyAgICAgICAgICAgICAgPC9odG1sOmxpbms+CisgICAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvbG9naWM6aXRlcmF0ZT4KKworICAgICAgPC90YWJsZT4KKworICAgIDwvdGQ+PC90cj4KKyAgPC90YWJsZT4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisKKyAgPGJyPgorPC9odG1sOmZvcm0+CisKKzxwPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vY29udGV4dC9jb250ZXh0LmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2NvbnRleHQvY29udGV4dC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkZmQ3MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2NvbnRleHQvY29udGV4dC5qc3AKQEAgLTAsMCArMSwzMzkgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9TYXZlQ29udGV4dCI+CisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXJlbnRPYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ibG9hZGVyT2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im1hbmFnZXJPYmplY3ROYW1lIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImNvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuY29udGV4dHMuY3JlYXRlIi8+CisgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJDb250ZXh0IEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+IC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIGRpc2FibGVkPSJ0cnVlIj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9ImNvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgPCUtLSBjYW5ub3QgZGVsZXRlIG9yIGFkZCB0aGUgcmVhbG0gb2YgdGhlIGNvbnRleHQgb2YgdGhlIGFkbWluIGFwcCAtLSU+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJwYXRoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSc8JT0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICU+Jz4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9BZGRSZWFsbS5kbz9wYXJlbnQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUsIlVURi04IikgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnJlYWxtcy5jcmVhdGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVJlYWxtLmRvP3BhcmVudD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMucmVhbG1zLmRlbGV0ZXMiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPC9sb2dpYzpub3RFcXVhbD4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvQWRkVmFsdmUuZG8/cGFyZW50PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnZhbHZlcy5jcmVhdGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVZhbHZlLmRvP3BhcmVudD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy52YWx2ZXMuZGVsZXRlcyIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8JS0tIGNhbm5vdCBkZWxldGUgdGhlIGNvbnRleHQgb2YgdGhlIGFkbWluIGFwcCAgZnJvbSB0aGUgdG9vbCAtLSU+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJwYXRoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSc8JT0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICU+Jz4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvRGVsZXRlQ29udGV4dC5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUsIlVURi04IikgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmNvbnRleHRzLmRlbGV0ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgICAgICAgPC9sb2dpYzpub3RFcXVhbD4KKyAgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKworIDwlLS0gQ29udGV4dCBQcm9wZXJ0aWVzIHRhYmxlIC0tJT4KKworIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4gPHRkPiAgPGRpdiBjbGFzcz0idGFibGUtdGl0bGUtdGV4dCI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5wcm9wZXJ0aWVzIi8+CisgICAgPC9kaXY+IDwvdGQ+IDwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnByb3BlcnR5Ii8+PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImNvb2tpZXMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb250ZXh0LmNvb2tpZXMiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0iY29va2llcyIgc3R5bGVJZD0iY29va2llcyI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImNyb3NzQ29udGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQuY3Jvc3MuY29udGV4dCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJjcm9zc0NvbnRleHQiIHN0eWxlSWQ9ImNyb3NzQ29udGV4dCI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworPCUtLSBpbnB1dCBvbmx5IGFsbG93ZWQgb24gY3JlYXRlIHRyYW5zYWN0aW9uIC0tJT4KKyAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImRvY2Jhc2UiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb250ZXh0LmRvY0Jhc2UiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJkb2NCYXNlIiBzaXplPSIzMCIgc3R5bGVJZD0iZG9jYmFzZSIvPgorICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJkb2NCYXNlIi8+CisgICAgICAgICAgICAgICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImRvY0Jhc2UiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0ib3ZlcnJpZGUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb250ZXh0Lm92ZXJyaWRlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9Im92ZXJyaWRlIiBzdHlsZUlkPSJvdmVycmlkZSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJwcml2aWxlZ2VkIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5wcml2aWxlZ2VkIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InByaXZpbGVnZWQiIHN0eWxlSWQ9InByaXZpbGVnZWQiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJib29sZWFuVmFscyIgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJib29sZWFuVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJib29sZWFuVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKzwlLS0gaW5wdXQgb25seSBhbGxvd2VkIG9uIGNyZWF0ZSB0cmFuc2FjdGlvbiAtLSU+CisgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJwYXRoIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5wYXRoIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJwYXRoIiBzaXplPSIzMCIgc3R5bGVJZD0icGF0aCIvPgorICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImNvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9ImNvbnRleHRGb3JtIiBwcm9wZXJ0eT0icGF0aCIvPgorICAgICAgICAgICAgICAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXRoIi8+CisgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icmVsb2FkYWJsZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQucmVsb2FkYWJsZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJyZWxvYWRhYmxlIiBzdHlsZUlkPSJyZWxvYWRhYmxlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9ImNvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InN3YWxsb3dPdXRwdXQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb250ZXh0LnN3YWxsb3dPdXRwdXQiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0ic3dhbGxvd091dHB1dCIgc3R5bGVJZD0ic3dhbGxvd091dHB1dCI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ1c2VybmFtaW5nIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC51c2VuYW1pbmciLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0idXNlTmFtaW5nIiBzdHlsZUlkPSJ1c2VybmFtaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9ImNvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImFudGlKYXJMb2NraW5nIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5hbnRpSmFyTG9ja2luZyIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJhbnRpSmFyTG9ja2luZyIgc3R5bGVJZD0iYW50aUphckxvY2tpbmciPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJib29sZWFuVmFscyIgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJib29sZWFuVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJib29sZWFuVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iYW50aVJlc291cmNlTG9ja2luZyI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQuYW50aVJlc291cmNlTG9ja2luZyIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJhbnRpUmVzb3VyY2VMb2NraW5nIiBzdHlsZUlkPSJhbnRpUmVzb3VyY2VMb2NraW5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9ImNvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCis8JS0tIGlucHV0IG9ubHkgYWxsb3dlZCBvbiBjcmVhdGUgdHJhbnNhY3Rpb24gPgorICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0id29ya2RpciI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQud29ya2RpciIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImNvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0id29ya0RpciIgc2l6ZT0iMzAiIHN0eWxlSWQ9IndvcmtkaXIiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9IndvcmtEaXIiLz4KKyAgICAgICAgICAgICAgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0id29ya0RpciIvPgorICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93LS0lPgorICAgPC9jb250cm9sczp0YWJsZT4KKyAgICA8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGJyPgorCis8JS0tIExvYWRlciBQcm9wZXJ0aWVzIHRhYmxlIC0tJT4KKworIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4gPHRkPiAgPGRpdiBjbGFzcz0idGFibGUtdGl0bGUtdGV4dCI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5sb2FkZXIucHJvcGVydGllcyIvPgorICAgIDwvZGl2PiA8L3RkPiA8L3RyPgorICA8L3RhYmxlPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQ+CisgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIgorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPjwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPCUtLWNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJjaGVja0ludGVydmFsIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5jaGVja0ludGVydmFsIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJsZHJDaGVja0ludGVydmFsIiBzaXplPSI1IiBzdHlsZUlkPSJjaGVja0ludGVydmFsIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93LS0lPgorCisgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InJlbG9hZGFibGUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb250ZXh0LnJlbG9hZGFibGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0ibGRyUmVsb2FkYWJsZSIgc3R5bGVJZD0icmVsb2FkYWJsZSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgIDwvY29udHJvbHM6dGFibGU+CisgICAgPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxCUj4KKzwlLS0gU2Vzc2lvbiBNYW5hZ2VyIFByb3BlcnRpZXMgdGFibGUgLS0lPgorIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4gPHRkPiAgPGRpdiBjbGFzcz0idGFibGUtdGl0bGUtdGV4dCI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5zZXNzaW9ubWdyLnByb3BlcnRpZXMiLz4KKyAgICA8L2Rpdj4gPC90ZD4gPC90cj4KKyAgPC90YWJsZT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorICAgICAgIDxjb250cm9sczp0YWJsZSB0YWJsZVN0eWxlPSJmcm9udC10YWJsZSIgbGluZVN0eWxlPSJsaW5lLXJvdyI+CisgICAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgICBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydHkiLz48L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UudmFsdWUiLz48L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDwlLS1jb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iY2hlY2tJbnRlcnZhbCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQuY2hlY2tJbnRlcnZhbCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ibWdyQ2hlY2tJbnRlcnZhbCIgc2l6ZT0iNSIgc3R5bGVJZD0iY2hlY2tJbnRlcnZhbCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdy0tJT4KKworICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0ic2Vzc2lvbklkIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5zZXNzaW9uSWQiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dGFyZWEgcHJvcGVydHk9Im1nclNlc3Npb25JREluaXQiIGNvbHM9IjMwIiByb3dzPSIyIiBzdHlsZUlkPSJzZXNzaW9uSWQiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9Im1heFNlc3Npb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5tYXguc2Vzc2lvbnMiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ibWdyTWF4U2Vzc2lvbnMiIHNpemU9IjUiIHN0eWxlSWQ9Im1heFNlc3Npb25zIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorICAgPC9jb250cm9sczp0YWJsZT4KKyAgICA8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorCisgIDxicj4KKyAgPC9odG1sOmZvcm0+Cis8cD4mbmJzcDs8L3A+Cis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2NvbnRleHQvY29udGV4dHMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vY29udGV4dC9jb250ZXh0cy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFlNWIwNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2NvbnRleHQvY29udGV4dHMuanNwCkBAIC0wLDAgKzEsOTcgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIvRGVsZXRlQ29udGV4dHMiPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5jb250ZXh0cy5kZWxldGUiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IkNvbnRleHQgQWN0aW9ucyI+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKworICA8JS0tIENvbnRleHRzIExpc3QgLS0lPgorICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIgorICAgICAgICAgd2lkdGg9IjEwMCUiPgorICAgIDx0cj48dGQ+CisKKyAgICAgIDx0YWJsZSBjbGFzcz0iZnJvbnQtdGFibGUiIGJvcmRlcj0iMSIKKyAgICAgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKworICAgICAgICA8dHIgY2xhc3M9ImhlYWRlci1yb3ciPgorICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuZGVsZXRlIi8+CisgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJob3N0Lm5hbWUiLz4KKyAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICA8L3RyPgorICAgIAorICAgICAgICA8bG9naWM6aXRlcmF0ZSBuYW1lPSJjb250ZXh0c0xpc3QiIGlkPSJjb250ZXh0Ij4KKyAgICAgICAgICA8dHIgY2xhc3M9ImxpbmUtcm93Ij4KKyAgICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPiZuYnNwOworICAgICAgICAgICAgICA8JS0tIGFkbWluIGNvbnRleHQgY2Fubm90IGJlIGRlbGV0ZWQgZnJvbSB0aGUgdG9vbCAtLSU+CisgICAgICAgICAgICAgIDxsb2dpYzptYXRjaCBuYW1lPSJjb250ZXh0IiB2YWx1ZT0nPCU9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSsiLCIgJT4nPgorICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSdyZWQnPio8L2ZvbnQ+CisgICAgICAgICAgICAgIDwvbG9naWM6bWF0Y2g+CisgICAgICAgICAgICAgIDxsb2dpYzpub3RNYXRjaCBuYW1lPSJjb250ZXh0IiB2YWx1ZT0nPCU9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSsiLCIgJT4nPgorICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjb250ZXh0cyI+PC9sYWJlbD4KKyAgICAgICAgICAgICAgPGh0bWw6bXVsdGlib3ggcHJvcGVydHk9ImNvbnRleHRzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iPCU9IGNvbnRleHQudG9TdHJpbmcoKSAlPiIgc3R5bGVJZD0iY29udGV4dHMiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpub3RNYXRjaD4KKyAgICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4mbmJzcDsKKyAgICAgICAgICAgICAgPGh0bWw6bGluayBwYWdlPSc8JT0gIi9FZGl0Q29udGV4dC5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5uZXQuVVJMRW5jb2Rlci5lbmNvZGUoY29udGV4dC50b1N0cmluZygpLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8Y29udHJvbHM6YXR0cmlidXRlIG5hbWU9ImNvbnRleHQiIGF0dHJpYnV0ZT0icGF0aCIvPgorICAgICAgICAgICAgICA8L2h0bWw6bGluaz4KKyAgICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC9sb2dpYzppdGVyYXRlPgorCisgICAgICA8L3RhYmxlPgorCisgICAgPC90ZD48L3RyPgorICA8L3RhYmxlPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKworICA8YnI+Cis8L2h0bWw6Zm9ybT4KKworPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9kdW1wUmVnaXN0cnkuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vZHVtcFJlZ2lzdHJ5LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjgyN2UzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vZHVtcFJlZ2lzdHJ5LmpzcApAQCAtMCwwICsxLDQ4IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorCis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCEtLSBTdGFuZGFyZCBDb250ZW50IC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSJoZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+CisKKzxib2R5IGJnY29sb3I9IndoaXRlIj4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgorCisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgY29sc3Bhbj0iMyI+CisgICAgICBSZWdpc3RlcmVkIE1hbmFnZWQgQmVhbnMKKyAgICA8L3RoPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciI+TmFtZTwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiPkdyb3VwPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciI+RGVzY3JpcHRpb248L3RoPgorICA8L3RyPgorCisgIDxsb2dpYzppdGVyYXRlIGlkPSJiZWFuIiBuYW1lPSJiZWFucyI+CisgICAgPHRyPgorICAgICAgPHRkPjxiZWFuOndyaXRlIG5hbWU9ImJlYW4iIHByb3BlcnR5PSJuYW1lIi8+PC90ZD4KKyAgICAgIDx0ZD48YmVhbjp3cml0ZSBuYW1lPSJiZWFuIiBwcm9wZXJ0eT0iZ3JvdXAiLz48L3RkPgorICAgICAgPHRkPjxiZWFuOndyaXRlIG5hbWU9ImJlYW4iIHByb3BlcnR5PSJkZXNjcmlwdGlvbiIvPjwvdGQ+CisgICAgPC90cj4KKyAgPC9sb2dpYzppdGVyYXRlPgorCis8L3RhYmxlPgorCis8L2JvZHk+CisKKzwhLS0gU3RhbmRhcmQgRm9vdGVyIC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSJmb290ZXIuanNwIiAlPgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2R1bXBTZXJ2ZXIuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vZHVtcFNlcnZlci5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxY2MzMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2R1bXBTZXJ2ZXIuanNwCkBAIC0wLDAgKzEsNDQgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+CisKKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8IS0tIFN0YW5kYXJkIENvbnRlbnQgLS0+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImhlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKworPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSI+CisKKyAgPHRyPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBjb2xzcGFuPSIxIj4KKyAgICAgIFJlZ2lzdGVyZWQgTUJlYW4gTmFtZXMKKyAgICA8L3RoPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciI+TmFtZTwvdGg+CisgIDwvdHI+CisKKyAgPGxvZ2ljOml0ZXJhdGUgaWQ9Im5hbWUiIG5hbWU9Im5hbWVzIj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGJlYW46d3JpdGUgbmFtZT0ibmFtZSIvPjwvdGQ+CisgICAgPC90cj4KKyAgPC9sb2dpYzppdGVyYXRlPgorCis8L3RhYmxlPgorCis8L2JvZHk+CisKKzwhLS0gU3RhbmRhcmQgRm9vdGVyIC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSJmb290ZXIuanNwIiAlPgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2Vycm9yLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2Vycm9yLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGU3ZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vZXJyb3IuanNwCkBAIC0wLDAgKzEsMzcgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+CisKKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8IS0tIFN0YW5kYXJkIENvbnRlbnQgLS0+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImhlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKworPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9ImltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPGNlbnRlcj4KKworPGgyPgorICA8YmVhbjptZXNzYWdlIGtleT0iZXJyb3IubG9naW4iLz4KKyAgPGJyPgorICA8YmVhbjptZXNzYWdlIGtleT0iZXJyb3IudHJ5YWdhaW4iLz4KKyAgPGh0bWw6bGluayBwYWdlPSIvIj4KKyAgICA8YmVhbjptZXNzYWdlIGtleT0iZXJyb3IuaGVyZSIvPgorICA8L2h0bWw6bGluaz4KKzwvaDI+CisKKzwvY2VudGVyPgorCis8L2JvZHk+CisKKzwhLS0gU3RhbmRhcmQgRm9vdGVyIC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSJmb290ZXIuanNwIiAlPgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2Zvb3Rlci5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9mb290ZXIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9mb290ZXIuanNwCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9mcmFtZXNldC5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9mcmFtZXNldC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0MTVmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ZyYW1lc2V0LmpzcApAQCAtMCwwICsxLDMxIEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorCis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+CisKKzwlIC8vIEZvcmNlIHRoZSBpbml0aWFsaXphdGlvbiBvZiAiYWN0aW9uIiBzZXJ2bGV0CisgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldE5hbWVkRGlzcGF0Y2hlcigiYWN0aW9uIikuaW5jbHVkZShyZXF1ZXN0LHJlc3BvbnNlKTsKKyU+IAorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwhLS0gU3RhbmRhcmQgQ29udGVudCAtLT4KKworPCVAIGluY2x1ZGUgZmlsZT0iaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGZyYW1lc2V0IHJvd3M9IjExNyw2ODUqIiBjb2xzPSIqIiBmcmFtZWJvcmRlcj0iTk8iIGJvcmRlcj0iMyIgZnJhbWVzcGFjaW5nPSIzIj4KKyAgPGZyYW1lIG5hbWU9ImJhbm5lciIgc3JjPSc8JT0gcmVzcG9uc2UuZW5jb2RlVVJMKCJiYW5uZXIuanNwIikgJT4nIHNjcm9sbGluZz0ibm8iIHRpdGxlPSJjb21taXQgYW5kIGxvZ291dCBiYW5uZXIiPgorICA8ZnJhbWVzZXQgY29scz0iMzAwLCoiIGZyYW1lYm9yZGVyPSJZRVMiIGJvcmRlcj0iMiI+CisgICAgPGZyYW1lIG5hbWU9InRyZWUiIHNyYz0nPCU9IHJlc3BvbnNlLmVuY29kZVVSTCgic2V0VXBUcmVlLmRvIikgJT4nIHNjcm9sbGluZz0iYXV0byIgdGl0bGU9ImFwcGxpY2F0aW9uIG5hdmlnYXRpb24gdHJlZSI+CisgICAgPGZyYW1lIG5hbWU9ImNvbnRlbnQiIHNyYz0nPCU9IHJlc3BvbnNlLmVuY29kZVVSTCgiYmxhbmsuanNwIikgJT4nIHNjcm9sbGluZz0iYXV0byIgdGl0bGU9ImNvbnRlbnQgZWRpdGluZyI+CisgIDwvZnJhbWVzZXQ+Cis8L2ZyYW1lc2V0PgorCis8IS0tIFN0YW5kYXJkIEZvb3RlciAtLT4KKworPCVAIGluY2x1ZGUgZmlsZT0iZm9vdGVyLmpzcCIgJT4KKworPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9oZWFkZXIuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaGVhZGVyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDUxMzU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaGVhZGVyLmpzcApAQCAtMCwwICsxLDExIEBACis8IS0tCisgIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAgcmVzZXJ2ZWQuCistLT4KKworPGhlYWQ+CisgIDx0aXRsZT48YmVhbjptZXNzYWdlIGtleT0iYXBwbGljYXRpb24udGl0bGUiLz48L3RpdGxlPgorICA8aHRtbDpiYXNlLz4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0idHJlZS1jb250cm9sLXRlc3QuY3NzIj4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iYWRtaW4uY3NzIj4KKzwvaGVhZD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2hvc3QvYWxpYXMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaG9zdC9hbGlhcy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhlNzQxZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2hvc3QvYWxpYXMuanNwCkBAIC0wLDAgKzEsMTA0IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIvU2F2ZUFsaWFzIj4KKworICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Imhvc3ROYW1lIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGNsYXNzPSJwYWdlLXRpdGxlLXJvdyI+CisgICAgICA8dGQgYWxpZ249ImxlZnQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hbGlhcy5jcmVhdGUiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzxicj4KKworIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4gPHRkPiA8ZGl2IGNsYXNzPSJ0YWJsZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9Im5ldy5hbGlhcyIvPgorICAgIDwvZGl2PiA8L3RkPiA8L3RyPgorICA8L3RhYmxlPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQ+CisgICAgICAgIDxjb250cm9sczp0YWJsZSB0YWJsZVN0eWxlPSJmcm9udC10YWJsZSIgbGluZVN0eWxlPSJsaW5lLXJvdyI+CisgICAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgICBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydHkiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImFsaWFzTmFtZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9Imhvc3QuYWxpYXMubmFtZSIvPjoKKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iYWxpYXNOYW1lIiBzaXplPSIyNCIgbWF4bGVuZ3RoPSIxMjgiIHN0eWxlSWQ9ImFsaWFzTmFtZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgICAgIDwvY29udHJvbHM6dGFibGU+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisKKzxicj4KKworPCUtLSBBbGlhc2VzIExpc3QgLS0lPgorIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4gPHRkPgorICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJob3N0LmFsaWFzZXMiLz4KKyAgICAgICAgPC9kaXY+CisgICAgPC90ZD4gPC90cj4KKyAgPC90YWJsZT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPiA8dGQ+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iZnJvbnQtdGFibGUiIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgPHRyIGNsYXNzPSJoZWFkZXItcm93Ij4KKyAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjclIj4KKyAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiIGFsaWduPSJsZWZ0Ij48YmVhbjptZXNzYWdlIGtleT0iaG9zdC5hbGlhcy5uYW1lIi8+IDwvZGl2PgorICAgICAgICAgICAgPC90ZD4gPC90cj4KKworICAgICAgICAgICAgPGxvZ2ljOml0ZXJhdGUgaWQ9ImFsaWFzVmFsIiBuYW1lPSJhbGlhc0Zvcm0iIHByb3BlcnR5PSJhbGlhc1ZhbHMiPgorICAgICAgICAgICAgPHRyPiA8dGQgd2lkdGg9IjI3JSIgdmFsaWduPSJ0b3AiIGNvbHNwYW49Mj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+IDwlPSBhbGlhc1ZhbCAlPiA8L2Rpdj4KKyAgICAgICAgICAgIDwvdGQ+IDwvdHI+CisgICAgICAgICAgICA8L2xvZ2ljOml0ZXJhdGU+CisgICAgICAgICA8L3RhYmxlPgorCisgICAgPC90ZD4gPC90cj4KKyAgPC90YWJsZT4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKworPC9odG1sOmZvcm0+Cis8L2JvZHk+CisKKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaG9zdC9hbGlhc2VzLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2hvc3QvYWxpYXNlcy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0NWQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2hvc3QvYWxpYXNlcy5qc3AKQEAgLTAsMCArMSw4MyBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9EZWxldGVBbGlhc2VzIj4KKworICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Imhvc3ROYW1lIi8+CisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hbGlhcy5kZWxldGUiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IkFsaWFzIEFjdGlvbnMiPgorICAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4gLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKworICA8JS0tIEFsaWFzZXMgTGlzdCAtLSU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJmcm9udC10YWJsZSIgYm9yZGVyPSIxIgorICAgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgPHRyIGNsYXNzPSJoZWFkZXItcm93Ij4KKyAgICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5kZWxldGUiLz4KKyAgICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9Imhvc3QuYWxpYXMubmFtZSIvPgorICAgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgICA8L3RyPgorCisgICAgICAgIDxsb2dpYzppdGVyYXRlIG5hbWU9ImFsaWFzZXNMaXN0IiBpZD0iYWxpYXMiPgorICAgICAgICAgIDx0ciBjbGFzcz0ibGluZS1yb3ciPgorICAgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgICA8bGFiZWwgZm9yPSJhbGlhc2VzIj48L2xhYmVsPgorICAgICAgICAgICAgICA8aHRtbDptdWx0aWJveCBwcm9wZXJ0eT0iYWxpYXNlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IjwlPSBhbGlhcy50b1N0cmluZygpICU+IiBzdHlsZUlkPSJhbGlhc2VzIi8+CisgICAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgICAgICAgPCU9IGFsaWFzLnRvU3RyaW5nKCkgJT4KKyAgICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC9sb2dpYzppdGVyYXRlPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKworICA8YnI+Cis8L2h0bWw6Zm9ybT4KKworPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9ob3N0L2hvc3QuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaG9zdC9ob3N0LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTkzMDRhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaG9zdC9ob3N0LmpzcApAQCAtMCwwICsxLDI3NyBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL1NhdmVIb3N0Ij4KKworICA8YmVhbjpkZWZpbmUgaWQ9Imhvc3ROYW1lIiBuYW1lPSJob3N0Rm9ybSIgcHJvcGVydHk9Imhvc3ROYW1lIi8+CisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJob3N0Rm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJzZXJ2aWNlTmFtZSIvPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBjbGFzcz0icGFnZS10aXRsZS1yb3ciPgorICAgICAgPHRkIGFsaWduPSJsZWZ0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJob3N0Rm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmhvc3RzLmNyZWF0ZSIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9Imhvc3RGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9Imhvc3RGb3JtIiBwcm9wZXJ0eT0ibm9kZUxhYmVsIi8+CisgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iSG9zdCBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPiAtLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIGRpc2FibGVkPSJ0cnVlIj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxsb2dpYzpub3RFcXVhbCBuYW1lPSJob3N0Rm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9BZGRBbGlhcy5kbz9ob3N0TmFtZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYWxpYXMuY3JlYXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9EZWxldGVBbGlhcy5kbz9ob3N0TmFtZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYWxpYXMuZGVsZXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0FkZENvbnRleHQuZG8/cGFyZW50PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5jb250ZXh0cy5jcmVhdGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZUNvbnRleHQuZG8/cGFyZW50PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5jb250ZXh0cy5kZWxldGVzIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPCEtLUZJWE1FIGFkZC9yZW1vdmUgZGVmYXVsdGNvbnRleHQtLT4KKzwlLS0KKyAgICAgICAgICAgIDwhLS1jb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9BZGREZWZhdWx0Q29udGV4dC5kbz9wYXJlbnQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUsIlVURi04IikgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmRlZmF1bHRjb250ZXh0cy5jcmVhdGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uLS0+CisgICAgICAgICAgICA8IS0tY29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvRGVsZXRlRGVmYXVsdENvbnRleHQuZG8/cGFyZW50PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5kZWZhdWx0Y29udGV4dHMuZGVsZXRlcyIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24tLT4gICAgICAgICAgICAgICAgICAgICAgICAKKy0tJT4KKyAgICAgICAgICAgIDxsb2dpYzpub3RFcXVhbCBuYW1lPSJob3N0TmFtZSIgdmFsdWU9JzwlPSAoU3RyaW5nKXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJhZG1pbkFwcEhvc3QiKSAlPic+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIGRpc2FibGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9BZGRSZWFsbS5kbz9wYXJlbnQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUsIlVURi04IikgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnJlYWxtcy5jcmVhdGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVJlYWxtLmRvP3BhcmVudD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMucmVhbG1zLmRlbGV0ZXMiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPC9sb2dpYzpub3RFcXVhbD4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPgorICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0FkZFZhbHZlLmRvP3BhcmVudD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMudmFsdmVzLmNyZWF0ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvRGVsZXRlVmFsdmUuZG8/cGFyZW50PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy52YWx2ZXMuZGVsZXRlcyIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0iaG9zdE5hbWUiIHZhbHVlPSc8JT0gcmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCkgJT4nPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBkaXNhYmxlZD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvRGVsZXRlSG9zdC5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUsIlVURi04IikgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmhvc3RzLmRlbGV0ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbnM+CisgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKworIDwlLS0gSG9zdCBQcm9wZXJ0aWVzIC0tJT4KKyA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+IDx0ZD4gPGRpdiBjbGFzcz0idGFibGUtdGl0bGUtdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJob3N0LnByb3BlcnRpZXMiLz4KKyAgICA8L2Rpdj4gPC90ZD4gPC90cj4KKyAgPC90YWJsZT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorICAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnByb3BlcnR5Ii8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UudmFsdWUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJuYW1lIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iaG9zdC5uYW1lIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgPCUtLSBpbnB1dCBvbmx5IGFsbG93ZWQgb24gY3JlYXRlIHRyYW5zYWN0aW9uIC0tJT4KKyAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iaG9zdEZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9Imhvc3ROYW1lIiBzaXplPSI1MCIgbWF4bGVuZ3RoPSI1MCIgc3R5bGVJZD0ibmFtZSIvPgorICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9Imhvc3RGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iaG9zdEZvcm0iIHByb3BlcnR5PSJob3N0TmFtZSIvPgorICAgICAgICAgICAgICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Imhvc3ROYW1lIi8+CisgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImJhc2UiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJob3N0LmJhc2UiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJob3N0Rm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iYXBwQmFzZSIgc2l6ZT0iMjQiIHN0eWxlSWQ9ImJhc2UiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJob3N0Rm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9Imhvc3RGb3JtIiBwcm9wZXJ0eT0iYXBwQmFzZSIvPgorICAgICAgICAgICAgICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFwcEJhc2UiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgICAgICAgCisgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJhdXRvZGVwbG95Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iaG9zdC5hdXRvRGVwbG95Ii8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0iYXV0b0RlcGxveSIgc3R5bGVJZD0iYXV0b2RlcGxveSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJob3N0Rm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgICAgICAgCisgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJkZXBsb3lPblN0YXJ0dXAiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJob3N0LmRlcGxveU9uU3RhcnR1cCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImRlcGxveU9uU3RhcnR1cCIgc3R5bGVJZD0iZGVwbG95T25TdGFydHVwIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9Imhvc3RGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJkZXBsb3l4bWwiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJob3N0LmRlcGxveVhNTCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImRlcGxveVhNTCIgc3R5bGVJZD0iZGVwbG95eG1sIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9Imhvc3RGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorICAgICAgICAKKyAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9IndhcnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJob3N0LndhcnMiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJ1bnBhY2tXQVJzIiBzdHlsZUlkPSJ3YXJzIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9Imhvc3RGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ4bWxuYW1lc3BhY2UiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJob3N0LnhtbE5hbWVzcGFjZUF3YXJlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0ieG1sTmFtZXNwYWNlQXdhcmUiIHN0eWxlSWQ9InhtbG5hbWVzcGFjZSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJob3N0Rm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0ieG1sdmFsaWRhdGlvbiI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9Imhvc3QueG1sVmFsaWRhdGlvbiIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InhtbFZhbGlkYXRpb24iIHN0eWxlSWQ9InhtbHZhbGlkYXRpb24iPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJib29sZWFuVmFscyIgbmFtZT0iaG9zdEZvcm0iIHByb3BlcnR5PSJib29sZWFuVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJib29sZWFuVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisgICAgICA8L2NvbnRyb2xzOnRhYmxlPgorCisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzxicj4KKzxicj4KKworPCUtLSBBbGlhc2VzIExpc3QgLS0lPgorIDxsb2dpYzpub3RFcXVhbCBuYW1lPSJob3N0Rm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+IDx0ZD4KKyAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtdGl0bGUtdGV4dCI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iaG9zdC5hbGlhc2VzIi8+CisgICAgICAgIDwvZGl2PgorICAgIDwvdGQ+IDwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4gPHRkPgorICAgICAgICA8dGFibGUgY2xhc3M9ImZyb250LXRhYmxlIiBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgICAgICAgIDx0ciBjbGFzcz0iaGVhZGVyLXJvdyI+CisgICAgICAgICAgICA8dGQgd2lkdGg9IjI3JSI+CisgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0IiBhbGlnbj0ibGVmdCI+PGJlYW46bWVzc2FnZSBrZXk9Imhvc3QuYWxpYXMubmFtZSIvPiA8L2Rpdj4KKyAgICAgICAgICAgIDwvdGQ+IDwvdHI+CisKKyAgICAgICAgICAgIDxsb2dpYzppdGVyYXRlIGlkPSJhbGlhc1ZhbCIgbmFtZT0iaG9zdEZvcm0iIHByb3BlcnR5PSJhbGlhc1ZhbHMiPgorICAgICAgICAgICAgPHRyPiA8dGQgd2lkdGg9IjI3JSIgdmFsaWduPSJ0b3AiIGNvbHNwYW49Mj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+IDwlPSBhbGlhc1ZhbCAlPiA8L2Rpdj4KKyAgICAgICAgICAgIDwvdGQ+IDwvdHI+CisgICAgICAgICAgICA8L2xvZ2ljOml0ZXJhdGU+CisgICAgICAgICA8L3RhYmxlPgorCisgICAgPC90ZD4gPC90cj4KKyAgPC90YWJsZT4KKyA8L2xvZ2ljOm5vdEVxdWFsPgorCisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorCis8L2h0bWw6Zm9ybT4KKzwvYm9keT4KKworPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9ob3N0L2hvc3RzLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2hvc3QvaG9zdHMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZjQwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9ob3N0L2hvc3RzLmpzcApAQCAtMCwwICsxLDkzIEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL0RlbGV0ZUhvc3RzIj4KKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmhvc3RzLmRlbGV0ZSIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iSG9zdCBBY3Rpb25zIj4KKyAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+IC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyAgPCUtLSBIb3N0cyBMaXN0IC0tJT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorICAgICAgICA8dGFibGUgY2xhc3M9ImZyb250LXRhYmxlIiBib3JkZXI9IjEiCisgICAgICAgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICA8dHIgY2xhc3M9ImhlYWRlci1yb3ciPgorICAgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmRlbGV0ZSIvPgorICAgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iaG9zdC5uYW1lIi8+CisgICAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgPGxvZ2ljOml0ZXJhdGUgbmFtZT0iaG9zdHNMaXN0IiBpZD0iaG9zdCI+CisgICAgICAgICAgPHRyIGNsYXNzPSJsaW5lLXJvdyI+CisgICAgICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4mbmJzcDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgIDxsb2dpYzptYXRjaCBuYW1lPSJob3N0IgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9JzwlPSAoU3RyaW5nKXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJhZG1pbkFwcEhvc3QiKSAlPic+CisgICAgICAgICAgICAgPGZvbnQgY29sb3I9J3JlZCc+KjwvZm9udD4KKyAgICAgICAgICAgICA8L2xvZ2ljOm1hdGNoPgorICAgICAgICAgICAgIDxsb2dpYzpub3RNYXRjaCBuYW1lPSJob3N0IgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9JzwlPSAoU3RyaW5nKXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJhZG1pbkFwcEhvc3QiKSAlPic+CisgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Imhvc3RzIj48L2xhYmVsPiAgICAgICAgICAKKyAgICAgICAgICAgICAgPGh0bWw6bXVsdGlib3ggcHJvcGVydHk9Imhvc3RzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iPCU9IGhvc3QudG9TdHJpbmcoKSAlPiIgc3R5bGVJZD0iaG9zdHMiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpub3RNYXRjaD4KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgICAgIDxodG1sOmxpbmsgcGFnZT0nPCU9ICIvRWRpdEhvc3QuZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubmV0LlVSTEVuY29kZXIuZW5jb2RlKGhvc3QudG9TdHJpbmcoKSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJob3N0IiBhdHRyaWJ1dGU9Im5hbWUiLz4KKyAgICAgICAgICAgICAgPC9odG1sOmxpbms+CisgICAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvbG9naWM6aXRlcmF0ZT4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisKKyAgPGJyPgorPC9odG1sOmZvcm0+CisKKzxwPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0JsdWVUaWxlLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9CbHVlVGlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjZGZjMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9CbHVlVGlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0Nvbm5lY3Rvci5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvQ29ubmVjdG9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGIzMWNjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0Nvbm5lY3Rvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0NvbnRleHQuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0NvbnRleHQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMjM1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvQ29udGV4dC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0RhdGFzb3VyY2UuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0RhdGFzb3VyY2UuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZDY3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvRGF0YXNvdXJjZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0RlZmF1bHRDb250ZXh0LmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9EZWZhdWx0Q29udGV4dC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlNjBmZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9EZWZhdWx0Q29udGV4dC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0Vudmlyb25tZW50RW50cmllcy5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvRW52aXJvbm1lbnRFbnRyaWVzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWM0YjBkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0Vudmlyb25tZW50RW50cmllcy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0dyb3Vwcy5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvR3JvdXBzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmE0ODllCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0dyb3Vwcy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0hvc3QuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0hvc3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMjczMDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvSG9zdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0xvZ2dlci5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvTG9nZ2VyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTE1ZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0xvZ2dlci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0xvZ2luLmpwZyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9Mb2dpbi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiZGFiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9Mb2dpbi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0xvZ2luQmFja2dyb3VuZFRpbGUuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0xvZ2luQmFja2dyb3VuZFRpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZjkxZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvTG9naW5CYWNrZ3JvdW5kVGlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL01haWxzZXNzaW9uLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9NYWlsc2Vzc2lvbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4YTFiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9NYWlsc2Vzc2lvbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDI0ODMzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1JlYWxtLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9SZWFsbS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2ODRkNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9SZWFsbS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1Jlc291cmNlTGluay5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvUmVzb3VyY2VMaW5rLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQ2M2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1Jlc291cmNlTGluay5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1JvbGVzLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9Sb2xlcy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5MDk2OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9Sb2xlcy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1NlcnZlci5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvU2VydmVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmUyZjJmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1NlcnZlci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1NlcnZpY2UuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1NlcnZpY2UuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1N2NkM2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvU2VydmljZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1RodW1icy5kYiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9UaHVtYnMuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4ZDI3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9UaHVtYnMuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1RvbWNhdEJhbm5lci5qcGcgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvVG9tY2F0QmFubmVyLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzFjZTFiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1RvbWNhdEJhbm5lci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1VzZXJzLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9Vc2Vycy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkYWZjZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9Vc2Vycy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1ZhbHZlLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9WYWx2ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyYTY4YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9WYWx2ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2ZvbGRlcl8xNl9wYWQuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2ZvbGRlcl8xNl9wYWQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NzAyYTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvZm9sZGVyXzE2X3BhZC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2hhbmRsZWRvd25sYXN0LmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9oYW5kbGVkb3dubGFzdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhZGI2OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9oYW5kbGVkb3dubGFzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2hhbmRsZWRvd25taWRkbGUuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2hhbmRsZWRvd25taWRkbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViM2NmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvaGFuZGxlZG93bm1pZGRsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2hhbmRsZXJpZ2h0bGFzdC5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvaGFuZGxlcmlnaHRsYXN0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWQwYTkyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2hhbmRsZXJpZ2h0bGFzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2hhbmRsZXJpZ2h0bWlkZGxlLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9oYW5kbGVyaWdodG1pZGRsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlZmYyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9oYW5kbGVyaWdodG1pZGRsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2xpbmVsYXN0bm9kZS5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvbGluZWxhc3Rub2RlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGZmMmYwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2xpbmVsYXN0bm9kZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2xpbmVtaWRkbGVub2RlLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9saW5lbWlkZGxlbm9kZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5ZjI5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9saW5lbWlkZGxlbm9kZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2xpbmV2ZXJ0aWNhbC5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvbGluZXZlcnRpY2FsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGVjMTViCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2xpbmV2ZXJ0aWNhbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW5kZXguanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW5kZXguanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMzdhNWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbmRleC5qc3AKQEAgLTAsMCArMSBAQAorPCUgcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KHJlc3BvbnNlLmVuY29kZVJlZGlyZWN0VVJMKCJmcmFtZXNldC5qc3AiKSk7ICU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vbG9naW4uanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vbG9naW4uanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNDhhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9sb2dpbi5qc3AKQEAgLTAsMCArMSwxMDYgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+CisKKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKworPCUgLy8gRm9yY2UgdGhlIGluaXRpYWxpemF0aW9uIG9mICJhY3Rpb24iIHNlcnZsZXQKKyAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0TmFtZWREaXNwYXRjaGVyKCJhY3Rpb24iKS5pbmNsdWRlKHJlcXVlc3QscmVzcG9uc2UpOworJT4gCisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCEtLSBNYWtlIHN1cmUgd2luZG93IGlzIG5vdCBpbiBhIGZyYW1lIC0tPgorCis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorCisgIDwhLS0KKyAgICBpZiAod2luZG93LnNlbGYgIT0gd2luZG93LnRvcCkgeworICAgICAgd2luZG93Lm9wZW4oIi4iLCAiX3RvcCIpOworICAgIH0KKyAgLy8gLS0+CisKKzwvc2NyaXB0PgorCis8IS0tIFN0YW5kYXJkIENvbnRlbnQgLS0+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImhlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKworPGJvZHkgYmFja2dyb3VuZD0iaW1hZ2VzL0xvZ2luQmFja2dyb3VuZFRpbGUuZ2lmIj4KKworPGNlbnRlcj4KKworPCEtLSBMb2dpbiAtLT4KKworPGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249JzwlPSByZXNwb25zZS5lbmNvZGVVUkwoImpfc2VjdXJpdHlfY2hlY2siKSAlPicKKyBuYW1lPSJsb2dpbkZvcm0iPgorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iNSIgYmFja2dyb3VuZD0iaW1hZ2VzL0xvZ2luQmFja2dyb3VuZFRpbGUuZ2lmIj4KKworICAgIDx0cj4KKyAgICA8IS0tIGJhbm5lciAtLT4KKyAgICAgPHRkIGhlaWdodD0iMTgzIj4KKyAgICAgICAgPGRpdiBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iaW1hZ2VzL0xvZ2luLmpwZyIgYWx0PSJUb21jYXQgV2ViIFNlcnZlciBBZG1pbmlzdHJhdGlvbiBUb29sIiB3aWR0aD0iNDkwIiBoZWlnaHQ9IjIyOCI+PC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisKKyAgICA8IS0tIHVzZXJuYW1lIHBhc3N3b3JkIHByb21wdHMgZmllbGRzIGxheW91dCAtLT4KKyAgICA8dHI+CisgICAgPHRkIGJhY2tncm91bmQ9ImltYWdlcy9Mb2dpbkJhY2tncm91bmRUaWxlLmdpZiI+CisgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjUiPgorICAgICA8dHI+CisgICAgICA8dGggYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNGRkZGRkYiPjxsYWJlbCBmb3I9InVzZXJuYW1lIj48YmVhbjptZXNzYWdlIGtleT0icHJvbXB0LnVzZXJuYW1lIi8+PC9sYWJlbD48L2ZvbnQ+CisgICAgICA8L3RoPgorICAgICAgPHRkIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImpfdXNlcm5hbWUiIHNpemU9IjE2IiBpZD0idXNlcm5hbWUiLz4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8cD4KKyAgICA8dHI+CisgICAgICA8dGggYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNGRkZGRkYiPjxsYWJlbCBmb3I9InBhc3N3b3JkIj48YmVhbjptZXNzYWdlIGtleT0icHJvbXB0LnBhc3N3b3JkIi8+PC9sYWJlbD48L2ZvbnQ+CisgICAgICA8L3RoPgorICAgICAgPHRkIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgPGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJqX3Bhc3N3b3JkIiBzaXplPSIxNiIgaWQ9InBhc3N3b3JkIi8+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICA8dGQgd2lkdGg9IjUwJSIgdmFsaWduPSJ0b3AiPiA8ZGl2IGFsaWduPSJyaWdodCI+PC9kaXY+IDwvdGQ+CisgICAgICA8dGQgd2lkdGg9IjU1JSIgdmFsaWduPSJ0b3AiPiZuYnNwOzwvdGQ+CisgICAgIDwvdHI+CisKKyAgICA8IS0tIGxvZ2luIHJlc2V0IGJ1dHRvbnMgbGF5b3V0IC0tPgorICAgIDx0cj4KKyAgICAgICA8dGQgd2lkdGg9IjUwJSIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgPGRpdiBhbGlnbj0icmlnaHQiPgorICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9JzxiZWFuOm1lc3NhZ2Uga2V5PSJidXR0b24ubG9naW4iLz4nPiZuYnNwOyZuYnNwOworICAgICAgICAgICAgPC9kaXY+CisgICAgICAgPC90ZD4KKyAgICAgICA8dGQgd2lkdGg9IjU1JSIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICZuYnNwOyZuYnNwOzxpbnB1dCB0eXBlPSJyZXNldCIgdmFsdWU9JzxiZWFuOm1lc3NhZ2Uga2V5PSJidXR0b24ucmVzZXQiLz4nPgorICAgICAgIDwvdGQ+CisgICAgIDwvdHI+CisgIDwvdGFibGU+CisgIDxwPiAmbmJzcDsKKyAgPC90ZD4KKyAgPC90cj4KKyA8L3RhYmxlPgorPC9mb3JtPgorCis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICA8IS0tCisgICAgZG9jdW1lbnQuZm9ybXNbImxvZ2luRm9ybSJdLmVsZW1lbnRzWyJqX3VzZXJuYW1lIl0uZm9jdXMoKQorICAvLyAtLT4KKzwvc2NyaXB0PgorCis8L2JvZHk+CisKKzwhLS0gU3RhbmRhcmQgRm9vdGVyIC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSJmb290ZXIuanNwIiAlPgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3JlYWxtL2RhdGFTb3VyY2VSZWFsbS5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZWFsbS9kYXRhU291cmNlUmVhbG0uanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0M2Q5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZWFsbS9kYXRhU291cmNlUmVhbG0uanNwCkBAIC0wLDAgKzEsMTU1IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIvU2F2ZURhdGFTb3VyY2VSZWFsbSI+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJ0aGlzT2JqZWN0TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImRhdGFTb3VyY2VSZWFsbUZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXJlbnRPYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFsbG93RGVsZXRpb24iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJkYXRhU291cmNlUmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMucmVhbG1zLmNyZWF0ZSIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImRhdGFTb3VyY2VSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iZGF0YVNvdXJjZVJlYWxtRm9ybSIgcHJvcGVydHk9Im5vZGVMYWJlbCIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IlJlYWxtIEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+IC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0iZGF0YVNvdXJjZVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxsb2dpYzpub3RFcXVhbCBuYW1lPSJkYXRhU291cmNlUmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWxsb3dEZWxldGlvbiIgdmFsdWU9ImZhbHNlIj4KKyAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvRGVsZXRlUmVhbG0uZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5yZWFsbXMuZGVsZXRlIi8+CisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICAgPC9sb2dpYzpub3RFcXVhbD4KKyAgICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnByb3BlcnR5Ii8+PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ0eXBlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnR5cGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iZGF0YVNvdXJjZVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJyZWFsbVR5cGUiIG9uY2hhbmdlPSJJQV9qdW1wTWVudSgnc2VsZicsdGhpcykiIHN0eWxlSWQ9InR5cGUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJyZWFsbVR5cGVWYWxzIiBuYW1lPSJkYXRhU291cmNlUmVhbG1Gb3JtIiBwcm9wZXJ0eT0icmVhbG1UeXBlVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJyZWFsbVR5cGVWYWxzIiBwcm9wZXJ0eT0idmFsdWUiIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iZGF0YVNvdXJjZVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJkYXRhU291cmNlUmVhbG1Gb3JtIiBwcm9wZXJ0eT0icmVhbG1UeXBlIiBzY29wZT0ic2Vzc2lvbiIvPgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iZHJpdmVyIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0uZGF0YVNvdXJjZU5hbWUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJkYXRhU291cmNlTmFtZSIgc2l6ZT0iMzAiIHN0eWxlSWQ9ImRhdGFTb3VyY2VOYW1lIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iZGlnZXN0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0uZGlnZXN0Ii8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJkaWdlc3QiIHNpemU9IjMwIiBzdHlsZUlkPSJkaWdlc3QiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisgICAgICAgIAorICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0ibG9jYWxEYXRhU291cmNlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0ubG9jYWxEYXRhU291cmNlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0ibG9jYWxEYXRhU291cmNlIiBzdHlsZUlkPSJsb2NhbERhdGFTb3VyY2UiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJib29sZWFuVmFscyIgbmFtZT0iZGF0YVNvdXJjZVJlYWxtRm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InJvbGVOYW1lQ29sIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0ucm9sZU5hbWVDb2wiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InJvbGVOYW1lQ29sIiBzaXplPSIzMCIgc3R5bGVJZD0icm9sZU5hbWVDb2wiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ1c2VyQ3JlZENvbCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnVzZXJDcmVkQ29sIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ1c2VyQ3JlZENvbCIgc2l6ZT0iMzAiIHN0eWxlSWQ9InVzZXJDcmVkQ29sIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idXNlck5hbWVDb2wiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS51c2VyTmFtZUNvbCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0idXNlck5hbWVDb2wiIHNpemU9IjMwIiBzdHlsZUlkPSJ1c2VyTmFtZUNvbCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InVzZXJSb2xlVGFibGUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS51c2VyUm9sZVRhYmxlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ1c2VyUm9sZVRhYmxlIiBzaXplPSIzMCIgc3R5bGVJZD0idXNlclJvbGVUYWJsZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InVzZXJUYWJsZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnVzZXJUYWJsZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0idXNlclRhYmxlIiBzaXplPSIzMCIgc3R5bGVJZD0idXNlclRhYmxlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8L2NvbnRyb2xzOnRhYmxlPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisgIDwvaHRtbDpmb3JtPgorPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZWFsbS9qZGJjUmVhbG0uanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVhbG0vamRiY1JlYWxtLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTIwZmUxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVhbG0vamRiY1JlYWxtLmpzcApAQCAtMCwwICsxLDE2NSBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL1NhdmVKREJDUmVhbG0iPgorCisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJqZGJjUmVhbG1Gb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFkbWluQWN0aW9uIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGFyZW50T2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJhbGxvd0RlbGV0aW9uIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iamRiY1JlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnJlYWxtcy5jcmVhdGUiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJqZGJjUmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9ImpkYmNSZWFsbUZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJSZWFsbSBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPiAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9ImpkYmNSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0iamRiY1JlYWxtRm9ybSIgcHJvcGVydHk9ImFsbG93RGVsZXRpb24iIHZhbHVlPSJmYWxzZSI+CisgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVJlYWxtLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMucmVhbG1zLmRlbGV0ZSIvPgorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgICAgICAgPC9sb2dpYzpub3RFcXVhbD4KKyAgICAgICA8L2NvbnRyb2xzOmFjdGlvbnM+CisgICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKyAgICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQ+CisgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIgorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPjwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idHlwZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci50eXBlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImpkYmNSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0icmVhbG1UeXBlIiBvbmNoYW5nZT0iSUFfanVtcE1lbnUoJ3NlbGYnLHRoaXMpIiBzdHlsZUlkPSJ0eXBlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0icmVhbG1UeXBlVmFscyIgbmFtZT0iamRiY1JlYWxtRm9ybSIgcHJvcGVydHk9InJlYWxtVHlwZVZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0icmVhbG1UeXBlVmFscyIgcHJvcGVydHk9InZhbHVlIiBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImpkYmNSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iamRiY1JlYWxtRm9ybSIgcHJvcGVydHk9InJlYWxtVHlwZSIgc2NvcGU9InNlc3Npb24iLz4KKyAgICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImRyaXZlciI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLmRyaXZlciIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImRyaXZlciIgc2l6ZT0iMzAiIHN0eWxlSWQ9ImRyaXZlciIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InBhc3N3ZCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnBhc3N3ZCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iY29ubmVjdGlvblBhc3N3b3JkIiBzaXplPSIzMCIgc3R5bGVJZD0icGFzc3dkIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idXJsIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0udXJsIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJjb25uZWN0aW9uVVJMIiBzaXplPSIzMCIgc3R5bGVJZD0idXJsIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idXNlcm5hbWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS51c2VyTmFtZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iY29ubmVjdGlvbk5hbWUiIHNpemU9IjMwIiBzdHlsZUlkPSJ1c2VybmFtZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImRpZ2VzdCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLmRpZ2VzdCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iZGlnZXN0IiBzaXplPSIzMCIgc3R5bGVJZD0iZGlnZXN0Ii8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icGFzc3dvcmRDb2wiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS5wYXNzd29yZENvbCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0icGFzc3dvcmRDb2wiIHNpemU9IjMwIiBzdHlsZUlkPSJwYXNzd29yZENvbCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InJvbGVOYW1lQ29sIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0ucm9sZU5hbWVDb2wiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InJvbGVOYW1lQ29sIiBzaXplPSIzMCIgc3R5bGVJZD0icm9sZU5hbWVDb2wiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ1c2VyTmFtZUNvbCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnVzZXJOYW1lQ29sIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ1c2VyTmFtZUNvbCIgc2l6ZT0iMzAiIHN0eWxlSWQ9InVzZXJOYW1lQ29sIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idXNlclJvbGVUYWJsZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnVzZXJSb2xlVGFibGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InJvbGVUYWJsZSIgc2l6ZT0iMzAiIHN0eWxlSWQ9InVzZXJSb2xlVGFibGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ1c2VyVGFibGUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS51c2VyVGFibGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InVzZXJUYWJsZSIgc2l6ZT0iMzAiIHN0eWxlSWQ9InVzZXJUYWJsZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPC9jb250cm9sczp0YWJsZT4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKyAgICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorICA8L2h0bWw6Zm9ybT4KKzxwPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVhbG0vam5kaVJlYWxtLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3JlYWxtL2puZGlSZWFsbS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhMThiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3JlYWxtL2puZGlSZWFsbS5qc3AKQEAgLTAsMCArMSwyMDggQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9TYXZlSk5ESVJlYWxtIj4KKyAgPGJlYW46ZGVmaW5lIGlkPSJ0aGlzT2JqZWN0TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImpuZGlSZWFsbUZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGFyZW50T2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFsbG93RGVsZXRpb24iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJqbmRpUmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMucmVhbG1zLmNyZWF0ZSIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImpuZGlSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iam5kaVJlYWxtRm9ybSIgcHJvcGVydHk9Im5vZGVMYWJlbCIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IlJlYWxtIEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+IC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0iam5kaVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0iam5kaVJlYWxtRm9ybSIgcHJvcGVydHk9ImFsbG93RGVsZXRpb24iIHZhbHVlPSJmYWxzZSI+CisgICAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVJlYWxtLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMucmVhbG1zLmRlbGV0ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorICAgICAgIDxjb250cm9sczp0YWJsZSB0YWJsZVN0eWxlPSJmcm9udC10YWJsZSIgbGluZVN0eWxlPSJsaW5lLXJvdyI+CisgICAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgICBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydHkiLz48L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UudmFsdWUiLz48L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InR5cGUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IudHlwZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJqbmRpUmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InJlYWxtVHlwZSIgb25jaGFuZ2U9IklBX2p1bXBNZW51KCdzZWxmJyx0aGlzKSIgc3R5bGVJZD0idHlwZSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9InJlYWxtVHlwZVZhbHMiIG5hbWU9ImpuZGlSZWFsbUZvcm0iIHByb3BlcnR5PSJyZWFsbVR5cGVWYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249InJlYWxtVHlwZVZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJqbmRpUmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9ImpuZGlSZWFsbUZvcm0iIHByb3BlcnR5PSJyZWFsbVR5cGUiIHNjb3BlPSJzZXNzaW9uIi8+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJjb25uTmFtZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLmNvbm5OYW1lIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iY29ubmVjdGlvbk5hbWUiIHNpemU9IjMwIiBzdHlsZUlkPSJjb25uTmFtZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImNvbm5QYXNzd29yZCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLmNvbm5QYXNzd29yZCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iY29ubmVjdGlvblBhc3N3b3JkIiBzaXplPSIzMCIgc3R5bGVJZD0iY29ublBhc3N3b3JkIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iY29ublVSTCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLmNvbm5VUkwiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImNvbm5lY3Rpb25VUkwiIHNpemU9IjMwIiBzdHlsZUlkPSJjb25uVVJMIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iY29ubkZhY3RvcnkiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS5jb25uRmFjdG9yeSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iY29udGV4dEZhY3RvcnkiIHNpemU9IjMwIiBzdHlsZUlkPSJjb25uRmFjdG9yeSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iZGlnZXN0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0uZGlnZXN0Ii8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJkaWdlc3QiIHNpemU9IjMwIiBzdHlsZUlkPSJkaWdlc3QiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJyb2xlQmFzZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnJvbGVCYXNlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJyb2xlQmFzZSIgc2l6ZT0iMzAiIHN0eWxlSWQ9InJvbGVCYXNlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icm9sZU5hbWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS5yb2xlTmFtZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0icm9sZU5hbWUiIHNpemU9IjMwIiBzdHlsZUlkPSJyb2xlTmFtZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InBhdHRlcm4iPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS5wYXR0ZXJuIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJyb2xlUGF0dGVybiIgc2l6ZT0iMzAiIHN0eWxlSWQ9InBhdHRlcm4iLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJyb2xlc3VidHJlZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnJvbGUuc3VidHJlZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJyb2xlU3VidHJlZSIgc3R5bGVJZD0icm9sZXN1YnRyZWUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJzZWFyY2hWYWxzIiBuYW1lPSJqbmRpUmVhbG1Gb3JtIiBwcm9wZXJ0eT0ic2VhcmNoVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJzZWFyY2hWYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ1c2VyQmFzZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnVzZXJCYXNlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ1c2VyQmFzZSIgc2l6ZT0iMzAiIHN0eWxlSWQ9InVzZXJCYXNlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icm9sZU5hbWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS51c2VyLnJvbGVOYW1lIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ1c2VyUm9sZU5hbWUiIHNpemU9IjMwIiBzdHlsZUlkPSJyb2xlTmFtZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InVzZXJzdWJ0cmVlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0udXNlci5zdWJ0cmVlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InVzZXJTdWJ0cmVlIiBzdHlsZUlkPSJ1c2Vyc3VidHJlZSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9InNlYXJjaFZhbHMiIG5hbWU9ImpuZGlSZWFsbUZvcm0iIHByb3BlcnR5PSJzZWFyY2hWYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249InNlYXJjaFZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InVzZXJQYXNzd29yZCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnVzZXJQYXNzd29yZCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0idXNlclBhc3N3b3JkIiBzaXplPSIzMCIgc3R5bGVJZD0idXNlclBhc3N3b3JkIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idXNlclBhdHRlcm4iPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS51c2VyUGF0dGVybiIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0idXNlclBhdHRlcm4iIHNpemU9IjMwIiBzdHlsZUlkPSJ1c2VyUGF0dGVybiIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idXNlclNlYXJjaCI+CisgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0udXNlclNlYXJjaCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InVzZXJTZWFyY2giIHNpemU9IjMwIiBzdHlsZUlkPSJ1c2VyU2VhcmNoIi8+CisgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPC9jb250cm9sczp0YWJsZT4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisgIDwvaHRtbDpmb3JtPgorPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZWFsbS9tZW1vcnlSZWFsbS5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZWFsbS9tZW1vcnlSZWFsbS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiZjM0MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3JlYWxtL21lbW9yeVJlYWxtLmpzcApAQCAtMCwwICsxLDEwMyBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IkdFVCIgYWN0aW9uPSIvU2F2ZU1lbW9yeVJlYWxtIj4KKworICA8YmVhbjpkZWZpbmUgaWQ9InRoaXNPYmplY3ROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0ibWVtb3J5UmVhbG1Gb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhcmVudE9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJhbGxvd0RlbGV0aW9uIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9Im1lbW9yeVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnJlYWxtcy5jcmVhdGUiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJtZW1vcnlSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0ibWVtb3J5UmVhbG1Gb3JtIiBwcm9wZXJ0eT0ibm9kZUxhYmVsIi8+CisgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IkxhYmVsIEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+IC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0ibWVtb3J5UmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgICAgIDxsb2dpYzpub3RFcXVhbCBuYW1lPSJtZW1vcnlSZWFsbUZvcm0iIHByb3BlcnR5PSJhbGxvd0RlbGV0aW9uIiB2YWx1ZT0iZmFsc2UiPgorICAgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9EZWxldGVSZWFsbS5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUsIlVURi04IikgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnJlYWxtcy5kZWxldGUiLz4KKyAgICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgICBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydHkiLz48L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UudmFsdWUiLz48L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InR5cGUiPgorICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci50eXBlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9Im1lbW9yeVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJyZWFsbVR5cGUiIG9uY2hhbmdlPSJJQV9qdW1wTWVudSgnc2VsZicsdGhpcykiIHN0eWxlSWQ9InR5cGUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJyZWFsbVR5cGVWYWxzIiBuYW1lPSJtZW1vcnlSZWFsbUZvcm0iIHByb3BlcnR5PSJyZWFsbVR5cGVWYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249InJlYWxtVHlwZVZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJtZW1vcnlSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0ibWVtb3J5UmVhbG1Gb3JtIiBwcm9wZXJ0eT0icmVhbG1UeXBlIiBzY29wZT0ic2Vzc2lvbiIvPgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icGF0aE5hbWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS5wYXRoTmFtZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0icGF0aE5hbWUiIHNpemU9IjI1IiBzdHlsZUlkPSJwYXRoTmFtZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPC9jb250cm9sczp0YWJsZT4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisgIDwvaHRtbDpmb3JtPgorPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZWFsbS9yZWFsbXMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVhbG0vcmVhbG1zLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjQ5MTNhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVhbG0vcmVhbG1zLmpzcApAQCAtMCwwICsxLDkyIEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iL0RlbGV0ZVJlYWxtcyI+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnJlYWxtcy5kZWxldGUiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IlJlYWxtIEFjdGlvbnMiPgorICAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIGRpc2FibGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbnM+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorCisgIDwlLS0gUmVhbG1zIExpc3QgLS0lPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiCisgICAgICAgICB3aWR0aD0iMTAwJSI+CisgICAgPHRyPjx0ZD4KKworICAgICAgPHRhYmxlIGNsYXNzPSJmcm9udC10YWJsZSIgYm9yZGVyPSIxIgorICAgICAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorCisgICAgICAgIDx0ciBjbGFzcz0iaGVhZGVyLXJvdyI+CisgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5kZWxldGUiLz4KKyAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9Imhvc3QubmFtZSIvPgorICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgICAgPGxvZ2ljOml0ZXJhdGUgbmFtZT0icmVhbG1zTGlzdCIgaWQ9InJlYWxtIj4KKyAgICAgICAgICA8dHIgY2xhc3M9ImxpbmUtcm93Ij4KKyAgICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPiZuYnNwOworICAgICAgICAgICAgPGxhYmVsIGZvcj0icmVhbG1zIj48L2xhYmVsPgorICAgICAgICAgICAgICA8aHRtbDptdWx0aWJveCBwcm9wZXJ0eT0icmVhbG1zIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iPCU9IHJlYWxtLnRvU3RyaW5nKCkgJT4iIHN0eWxlSWQ9InJlYWxtcyIvPgorICAgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPiZuYnNwOworICAgICAgICAgICAgICA8aHRtbDpsaW5rIHBhZ2U9JzwlPSAiL0VkaXRSZWFsbS5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5uZXQuVVJMRW5jb2Rlci5lbmNvZGUocmVhbG0udG9TdHJpbmcoKSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJyZWFsbSIgYXR0cmlidXRlPSJjbGFzc05hbWUiLz4KKyAgICAgICAgICAgICAgPC9odG1sOmxpbms+CisgICAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvbG9naWM6aXRlcmF0ZT4KKworICAgICAgPC90YWJsZT4KKworICAgIDwvdGQ+PC90cj4KKyAgPC90YWJsZT4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisKKyAgPGJyPgorPC9odG1sOmZvcm0+CisKKzxwPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVhbG0vdXNlckRhdGFiYXNlUmVhbG0uanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVhbG0vdXNlckRhdGFiYXNlUmVhbG0uanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwODY5ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZWFsbS91c2VyRGF0YWJhc2VSZWFsbS5qc3AKQEAgLTAsMCArMSwxMDkgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9TYXZlVXNlckRhdGFiYXNlUmVhbG0iPgorCisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJ1c2VyRGF0YWJhc2VSZWFsbUZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGFyZW50T2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFkbWluQWN0aW9uIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFsbG93RGVsZXRpb24iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0idXNlckRhdGFiYXNlUmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMucmVhbG1zLmNyZWF0ZSIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9InVzZXJEYXRhYmFzZVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJ1c2VyRGF0YWJhc2VSZWFsbUZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iUmVhbG0gQWN0aW9ucyI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4gLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxsb2dpYzpub3RFcXVhbCBuYW1lPSJ1c2VyRGF0YWJhc2VSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9InVzZXJEYXRhYmFzZVJlYWxtRm9ybSIgcHJvcGVydHk9ImFsbG93RGVsZXRpb24iIHZhbHVlPSJmYWxzZSI+CisgICAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVJlYWxtLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMucmVhbG1zLmRlbGV0ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorICAgICAgIDxjb250cm9sczp0YWJsZSB0YWJsZVN0eWxlPSJmcm9udC10YWJsZSIgbGluZVN0eWxlPSJsaW5lLXJvdyI+CisgICAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgICBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydHkiLz48L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UudmFsdWUiLz48L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InR5cGUiPgorICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci50eXBlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9InVzZXJEYXRhYmFzZVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJyZWFsbVR5cGUiIG9uY2hhbmdlPSJJQV9qdW1wTWVudSgnc2VsZicsdGhpcykiIHN0eWxlSWQ9InR5cGUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJyZWFsbVR5cGVWYWxzIiBuYW1lPSJ1c2VyRGF0YWJhc2VSZWFsbUZvcm0iIHByb3BlcnR5PSJyZWFsbVR5cGVWYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249InJlYWxtVHlwZVZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJ1c2VyRGF0YWJhc2VSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0idXNlckRhdGFiYXNlUmVhbG1Gb3JtIiBwcm9wZXJ0eT0icmVhbG1UeXBlIiBzY29wZT0ic2Vzc2lvbiIvPgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icmVzb3VyY2UiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS5yZXNvdXJjZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9InVzZXJEYXRhYmFzZVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0icmVzb3VyY2UiIHNpemU9IjI1IiBtYXhsZW5ndGg9IjI1IiBzdHlsZUlkPSJyZXNvdXJjZSIvPgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9InVzZXJEYXRhYmFzZVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICAgICAgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icmVzb3VyY2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0idXNlckRhdGFiYXNlUmVhbG1Gb3JtIiBwcm9wZXJ0eT0icmVzb3VyY2UiIHNjb3BlPSJzZXNzaW9uIi8+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgIDwvY29udHJvbHM6dGFibGU+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorICA8L2h0bWw6Zm9ybT4KKzxwPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2RhdGFTb3VyY2UuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2RhdGFTb3VyY2UuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2N2U1MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZGF0YVNvdXJjZS5qc3AKQEAgLTAsMCArMSwyMTIgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+CisKKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL3Jlc291cmNlcy9zYXZlRGF0YVNvdXJjZSI+CisKKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJyZXNvdXJjZXR5cGVJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZUZvcm0iIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9InBhdGhJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZUZvcm0iIHByb3BlcnR5PSJwYXRoIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGF0aCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iaG9zdEluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJkYXRhU291cmNlRm9ybSIgcHJvcGVydHk9Imhvc3QiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJob3N0Ii8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJkb21haW5JbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZUZvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgY2xhc3M9InBhZ2UtdGl0bGUtcm93Ij4KKyAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9ImRhdGFTb3VyY2VGb3JtIiBwcm9wZXJ0eT0ibm9kZUxhYmVsIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iRGF0YSBTb3VyY2UgQWN0aW9ucyI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorCisgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9yZXNvdXJjZXMvc2V0VXBEYXRhU291cmNlLmRvP3Jlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvLCJVVEYtOCIpICsgIiZwYXRoPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aEluZm8sIlVURi04IikgKyAiJmhvc3Q9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0SW5mbywiVVRGLTgiKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbywiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMuY3JlYXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9yZXNvdXJjZXMvbGlzdERhdGFTb3VyY2VzLmRvP3Jlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvLCJVVEYtOCIpICsgIiZwYXRoPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aEluZm8sIlVURi04IikgKyAiJmhvc3Q9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0SW5mbywiVVRGLTgiKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbywiVVRGLTgiKSArICImZm9yd2FyZD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSgiRGF0YVNvdXJjZXMgRGVsZXRlIExpc3QiLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmFjdGlvbnMuZGF0YXNyYy5kZWxldGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKzxicj4KKworICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+PHRkPjxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLnRyZWVCdWlsZGVyLmRhdGFzb3VyY2VzIi8+CisgICAgPC9kaXY+PC90ZD48L3RyPgorICA8L3RhYmxlPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQ+CisKKyAgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKyAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgICBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydHkiLz48L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UudmFsdWUiLz48L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iam5kaSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuZGF0YXNyYy5qbmRpIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJkYXRhU291cmNlRm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiPgorICAgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9ImRhdGFTb3VyY2VGb3JtIiBwcm9wZXJ0eT0iam5kaU5hbWUiLz4KKyAgICAgICAgICAgICAgICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImpuZGlOYW1lIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6cHJlc2VudD4KKyAgICAgICAgICAgICAgPGxvZ2ljOm5vdFByZXNlbnQgbmFtZT0iZGF0YVNvdXJjZUZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIj4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJqbmRpTmFtZSIgc2l6ZT0iMzUiIG1heGxlbmd0aD0iNTYiIHN0eWxlSWQ9ImpuZGkiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpub3RQcmVzZW50PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InVybCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuZGF0YXNyYy51cmwiLz46CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dGFyZWEgcHJvcGVydHk9InVybCIgY29scz0iMzUiIHJvd3M9IjIiIHN0eWxlSWQ9InVybCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImpkYmNjbGFzcyI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuZGF0YXNyYy5qZGJjY2xhc3MiLz46CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImRyaXZlckNsYXNzIiBzaXplPSI0NSIgbWF4bGVuZ3RoPSIyNTYiIHN0eWxlSWQ9ImpkYmNjbGFzcyIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InVzZXJuYW1lIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLnByb21wdC51c2VybmFtZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ1c2VybmFtZSIgc2l6ZT0iMTUiIG1heGxlbmd0aD0iMjUiIHN0eWxlSWQ9InVzZXJuYW1lIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icGFzc3dvcmQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMucHJvbXB0LnBhc3N3b3JkIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnBhc3N3b3JkIHByb3BlcnR5PSJwYXNzd29yZCIgc2l6ZT0iMTUiIG1heGxlbmd0aD0iMjUiIHN0eWxlSWQ9InBhc3N3b3JkIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iYWN0aXZlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5kYXRhc3JjLmFjdGl2ZSIvPjoKKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iYWN0aXZlIiBzaXplPSI1IiBtYXhsZW5ndGg9IjUiIHN0eWxlSWQ9ImFjdGl2ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImlkbGUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmRhdGFzcmMuaWRsZSIvPjoKKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iaWRsZSIgc2l6ZT0iNSIgbWF4bGVuZ3RoPSI1IiBzdHlsZUlkPSJpZGxlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0id2FpdCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuZGF0YXNyYy53YWl0Ii8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ3YWl0IiBzaXplPSI1IiBtYXhsZW5ndGg9IjUiIHN0eWxlSWQ9IndhaXQiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ2YWxpZGF0aW9uIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5kYXRhc3JjLnZhbGlkYXRpb24iLz46CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnRleHRhcmVhIHByb3BlcnR5PSJxdWVyeSIgY29scz0iMzUiIHJvd3M9IjMiIHN0eWxlSWQ9InZhbGlkYXRpb24iLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8L2NvbnRyb2xzOnRhYmxlPgorCisgICAgICA8L3RkPgorCisgICAgPC90cj4KKworICA8L3RhYmxlPgorCisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorCis8L2h0bWw6Zm9ybT4KKworPCEtLSBTdGFuZGFyZCBGb290ZXIgLS0+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2Zvb3Rlci5qc3AiICU+CisKKzwvYm9keT4KKworPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZGF0YVNvdXJjZXMuanNwZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9kYXRhU291cmNlcy5qc3BmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZGI2MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZGF0YVNvdXJjZXMuanNwZgpAQCAtMCwwICsxLDUzIEBACis8JS0tIERhdGFTb3VyY2VzIExpc3QgLS0lPgorCis8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIgorICAgICAgIHdpZHRoPSIxMDAlIj48dHI+PHRkPiAKKworICA8dGFibGUgY2xhc3M9ImZyb250LXRhYmxlIiBib3JkZXI9IjEiCisgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHIgY2xhc3M9ImhlYWRlci1yb3ciPgorICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iY2hlY2tib3hlcyI+CisgICAgICAgIDx0ZCB3aWR0aD0iNSUiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgJm5ic3A7CisgICAgICAgIDwvdGQ+CisgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICA8dGggc2NvcGU9ImNvbCIgd2lkdGg9IjIwJSI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5kYXRhc3JjLmpuZGkiLz4KKyAgICAgIDwvZGl2PjwvdGg+CisgICAgICA8dGggc2NvcGU9ImNvbCI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5kYXRhc3JjLmpkYmNjbGFzcyIvPgorICAgICAgPC9kaXY+PC90aD4KKyAgICA8L3RyPgorCisgICAgPGxvZ2ljOml0ZXJhdGUgbmFtZT0iZGF0YVNvdXJjZXNGb3JtIiBwcm9wZXJ0eT0iZGF0YVNvdXJjZXMiCisgICAgICAgICAgICAgICAgICAgICBpZD0iZGF0YVNvdXJjZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8dHIgY2xhc3M9ImxpbmUtcm93Ij4KKyAgICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iY2hlY2tib3hlcyI+CisgICAgICAgICAgPHRkIHNjb3BlPSJyb3ciPjxkaXYgYWxpZ249ImNlbnRlciIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4KKyAgICAgICAgICAgIDxsYWJlbCBmb3I9ImRhdGFTb3VyY2VzIj48L2xhYmVsPgorCisgICAgICAgICAgICA8IS0tIGRhdGFTb3VyY2UgbWF5IGNvbnRhaW4gaW50ZXJuYWwgZG91YmxlIHF1b3Rlcywgc28gc2luZ2xlIHF1b3RlIHZhbHVlIC0tPgorICAgICAgICAgICAgPCEtLSBTZWUgQnVnemlsbGEgMzY2NzM6IGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzY2NzMgLS0+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImRhdGFTb3VyY2VzIiBzdHlsZUlkPSJkYXRhU291cmNlcyIKKyAgICAgICAgICAgICAgICAgIHZhbHVlPSc8JT0gZGF0YVNvdXJjZSAlPicgLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPgorICAgICAgICAgIDxodG1sOmxpbmsgcGFnZT0nPCU9ICIvcmVzb3VyY2VzL3NldFVwRGF0YVNvdXJjZS5kbz9vYmplY3ROYW1lPSIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkYXRhU291cmNlLCJVVEYtOCIpICsgIiZyZXNvdXJjZXR5cGU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVzb3VyY2V0eXBlSW5mbywiVVRGLTgiKSArICImcGF0aD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGhJbmZvLCJVVEYtOCIpICsgIiZob3N0PSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoaG9zdEluZm8sIlVURi04IikgKyAiJmRvbWFpbj0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8sIlVURi04IikgICU+Jz4KKyAgICAgICAgICAgIDxjb250cm9sczphdHRyaWJ1dGUgbmFtZT0iZGF0YVNvdXJjZSIgYXR0cmlidXRlPSJuYW1lIi8+CisgICAgICAgICAgPC9odG1sOmxpbms+CisgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPiZuYnNwOworICAgICAgICAgIDxjb250cm9sczphdHRyaWJ1dGUgbmFtZT0iZGF0YVNvdXJjZSIgYXR0cmlidXRlPSJkcml2ZXJDbGFzc05hbWUiLz4KKyAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC9sb2dpYzppdGVyYXRlPgorCisgIDwvdGFibGU+CisKKzwvdGQ+PC90cj48L3RhYmxlPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2RlbGV0ZURhdGFTb3VyY2VzLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9kZWxldGVEYXRhU291cmNlcy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5N2FkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9kZWxldGVEYXRhU291cmNlcy5qc3AKQEAgLTAsMCArMSw4NiBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBhY3Rpb249Ii9yZXNvdXJjZXMvbGlzdERhdGFTb3VyY2VzIj4KKworICA8YmVhbjpkZWZpbmUgaWQ9InJlc291cmNldHlwZUluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJkYXRhU291cmNlc0Zvcm0iIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9InBhdGhJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZXNGb3JtIiBwcm9wZXJ0eT0icGF0aCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhdGgiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9Imhvc3RJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZXNGb3JtIiBwcm9wZXJ0eT0iaG9zdCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Imhvc3QiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9ImRvbWFpbkluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJkYXRhU291cmNlc0Zvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMuZGVsZXRlIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCB3aWR0aD0iMTklIj4KKyAgICAgICAgPGRpdiBhbGlnbj0icmlnaHQiPgorICAgICAgICAgIDwlQCBpbmNsdWRlIGZpbGU9Imxpc3REYXRhU291cmNlcy5qc3BmIiAlPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworPC9odG1sOmZvcm0+CisKKzxicj4KKworPGJlYW46ZGVmaW5lIGlkPSJjaGVja2JveGVzIiBzY29wZT0icGFnZSIgdmFsdWU9InRydWUiLz4KKworPGh0bWw6Zm9ybSBhY3Rpb249Ii9yZXNvdXJjZXMvZGVsZXRlRGF0YVNvdXJjZXMiPgorCisgIDxiZWFuOmRlZmluZSBpZD0icmVzb3VyY2V0eXBlSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImRhdGFTb3VyY2VzRm9ybSIgcHJvcGVydHk9InJlc291cmNldHlwZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InJlc291cmNldHlwZSIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0icGF0aEluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJkYXRhU291cmNlc0Zvcm0iIHByb3BlcnR5PSJwYXRoIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGF0aCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iaG9zdEluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJkYXRhU291cmNlc0Zvcm0iIHByb3BlcnR5PSJob3N0Ii8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImRhdGFTb3VyY2VzRm9ybSIgcHJvcGVydHk9ImRvbWFpbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImRvbWFpbiIvPgorCisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisgIDwlQCBpbmNsdWRlIGZpbGU9ImRhdGFTb3VyY2VzLmpzcGYiICU+CisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorPC9odG1sOmZvcm0+Cis8YnI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2Zvb3Rlci5qc3AiICU+CisKKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2RlbGV0ZUVudkVudHJpZXMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2RlbGV0ZUVudkVudHJpZXMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YjY5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZGVsZXRlRW52RW50cmllcy5qc3AKQEAgLTAsMCArMSw4NiBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBhY3Rpb249Ii9yZXNvdXJjZXMvbGlzdEVudkVudHJpZXMiPgorCisgIDxiZWFuOmRlZmluZSBpZD0icmVzb3VyY2V0eXBlSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJpZXNGb3JtIiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJwYXRoSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJpZXNGb3JtIiBwcm9wZXJ0eT0icGF0aCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhdGgiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9Imhvc3RJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZW52RW50cmllc0Zvcm0iIHByb3BlcnR5PSJob3N0Ii8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJpZXNGb3JtIiBwcm9wZXJ0eT0iZG9tYWluIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZG9tYWluIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuYWN0aW9ucy5lbnYuZGVsZXRlIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCB3aWR0aD0iMTklIj4KKyAgICAgICAgPGRpdiBhbGlnbj0icmlnaHQiPgorICAgICAgICAgIDwlQCBpbmNsdWRlIGZpbGU9Imxpc3RFbnZFbnRyaWVzLmpzcGYiICU+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8L2h0bWw6Zm9ybT4KKworPGJyPgorCis8YmVhbjpkZWZpbmUgaWQ9ImNoZWNrYm94ZXMiIHNjb3BlPSJwYWdlIiB2YWx1ZT0idHJ1ZSIvPgorCis8aHRtbDpmb3JtIGFjdGlvbj0iL3Jlc291cmNlcy9kZWxldGVFbnZFbnRyaWVzIj4KKworICA8YmVhbjpkZWZpbmUgaWQ9InJlc291cmNldHlwZUluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJlbnZFbnRyaWVzRm9ybSIgcHJvcGVydHk9InJlc291cmNldHlwZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InJlc291cmNldHlwZSIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0icGF0aEluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJlbnZFbnRyaWVzRm9ybSIgcHJvcGVydHk9InBhdGgiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXRoIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJob3N0SW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJpZXNGb3JtIiBwcm9wZXJ0eT0iaG9zdCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Imhvc3QiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9ImRvbWFpbkluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJlbnZFbnRyaWVzRm9ybSIgcHJvcGVydHk9ImRvbWFpbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImRvbWFpbiIvPgorCisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisgIDwlQCBpbmNsdWRlIGZpbGU9ImVudkVudHJpZXMuanNwZiIgJT4KKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+Cis8L2h0bWw6Zm9ybT4KKzxicj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvZm9vdGVyLmpzcCIgJT4KKworPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZGVsZXRlTWFpbFNlc3Npb25zLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9kZWxldGVNYWlsU2Vzc2lvbnMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiY2FiMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZGVsZXRlTWFpbFNlc3Npb25zLmpzcApAQCAtMCwwICsxLDg2IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIGFjdGlvbj0iL3Jlc291cmNlcy9saXN0TWFpbFNlc3Npb25zIj4KKworICA8YmVhbjpkZWZpbmUgaWQ9InJlc291cmNldHlwZUluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJtYWlsU2Vzc2lvbnNGb3JtIiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJwYXRoSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iIHByb3BlcnR5PSJwYXRoIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGF0aCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iaG9zdEluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJtYWlsU2Vzc2lvbnNGb3JtIiBwcm9wZXJ0eT0iaG9zdCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Imhvc3QiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9ImRvbWFpbkluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJtYWlsU2Vzc2lvbnNGb3JtIiBwcm9wZXJ0eT0iZG9tYWluIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZG9tYWluIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuYWN0aW9ucy5tYWlsc2Vzc2lvbi5kZWxldGUiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIHdpZHRoPSIxOSUiPgorICAgICAgICA8ZGl2IGFsaWduPSJyaWdodCI+CisgICAgICAgICAgPCVAIGluY2x1ZGUgZmlsZT0ibGlzdE1haWxTZXNzaW9ucy5qc3BmIiAlPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworPC9odG1sOmZvcm0+CisKKzxicj4KKworPGJlYW46ZGVmaW5lIGlkPSJjaGVja2JveGVzIiBzY29wZT0icGFnZSIgdmFsdWU9InRydWUiLz4KKworPGh0bWw6Zm9ybSBhY3Rpb249Ii9yZXNvdXJjZXMvZGVsZXRlTWFpbFNlc3Npb25zIj4KKworICA8YmVhbjpkZWZpbmUgaWQ9InJlc291cmNldHlwZUluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJtYWlsU2Vzc2lvbnNGb3JtIiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJwYXRoSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iIHByb3BlcnR5PSJwYXRoIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGF0aCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iaG9zdEluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJtYWlsU2Vzc2lvbnNGb3JtIiBwcm9wZXJ0eT0iaG9zdCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Imhvc3QiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9ImRvbWFpbkluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJtYWlsU2Vzc2lvbnNGb3JtIiBwcm9wZXJ0eT0iZG9tYWluIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZG9tYWluIi8+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKyAgPCVAIGluY2x1ZGUgZmlsZT0ibWFpbFNlc3Npb25zLmpzcGYiICU+CisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorPC9odG1sOmZvcm0+Cis8YnI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2Zvb3Rlci5qc3AiICU+CisKKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2RlbGV0ZVJlc291cmNlTGlua3MuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2RlbGV0ZVJlc291cmNlTGlua3MuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjcyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZGVsZXRlUmVzb3VyY2VMaW5rcy5qc3AKQEAgLTAsMCArMSw4NCBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBhY3Rpb249Ii9yZXNvdXJjZXMvbGlzdFJlc291cmNlTGlua3MiPgorCisgIDxiZWFuOmRlZmluZSBpZD0icmVzb3VyY2V0eXBlSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlTGlua3NGb3JtIiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJwYXRoSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlTGlua3NGb3JtIiBwcm9wZXJ0eT0icGF0aCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhdGgiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9Imhvc3RJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0icmVzb3VyY2VMaW5rc0Zvcm0iIHByb3BlcnR5PSJob3N0Ii8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlTGlua3NGb3JtIiBwcm9wZXJ0eT0iZG9tYWluIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZG9tYWluIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrLmRlbGV0ZSIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgd2lkdGg9IjE5JSI+CisgICAgICAgIDxkaXYgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICA8JUAgaW5jbHVkZSBmaWxlPSJsaXN0UmVzb3VyY2VMaW5rcy5qc3BmIiAlPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworPC9odG1sOmZvcm0+CisKKzxicj4KKzxiZWFuOmRlZmluZSBpZD0iY2hlY2tib3hlcyIgc2NvcGU9InBhZ2UiIHZhbHVlPSJ0cnVlIi8+Cis8aHRtbDpmb3JtIGFjdGlvbj0iL3Jlc291cmNlcy9kZWxldGVSZXNvdXJjZUxpbmtzIj4KKworICA8YmVhbjpkZWZpbmUgaWQ9InJlc291cmNldHlwZUluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIgcHJvcGVydHk9InJlc291cmNldHlwZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InJlc291cmNldHlwZSIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0icGF0aEluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIgcHJvcGVydHk9InBhdGgiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXRoIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJob3N0SW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlTGlua3NGb3JtIiBwcm9wZXJ0eT0iaG9zdCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Imhvc3QiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9ImRvbWFpbkluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIgcHJvcGVydHk9ImRvbWFpbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImRvbWFpbiIvPgorCisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisgIDwlQCBpbmNsdWRlIGZpbGU9InJlc291cmNlTGlua3MuanNwZiIgJT4KKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+Cis8L2h0bWw6Zm9ybT4KKzxicj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvZm9vdGVyLmpzcCIgJT4KKworPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZGVsZXRlVXNlckRhdGFiYXNlcy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZGVsZXRlVXNlckRhdGFiYXNlcy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzM2I3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9kZWxldGVVc2VyRGF0YWJhc2VzLmpzcApAQCAtMCwwICsxLDYyIEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIGFjdGlvbj0iL3Jlc291cmNlcy9saXN0VXNlckRhdGFiYXNlcyI+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJkb21haW5JbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0idXNlckRhdGFiYXNlc0Zvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLnVzZXJkYi5kZWxldGUiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIHdpZHRoPSIxOSUiPgorICAgICAgICA8ZGl2IGFsaWduPSJyaWdodCI+CisgICAgICAgICAgPCVAIGluY2x1ZGUgZmlsZT0ibGlzdFVzZXJEYXRhYmFzZXMuanNwZiIgJT4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzwvaHRtbDpmb3JtPgorCis8YnI+CisKKzxiZWFuOmRlZmluZSBpZD0iY2hlY2tib3hlcyIgc2NvcGU9InBhZ2UiIHZhbHVlPSJ0cnVlIi8+CisKKzxodG1sOmZvcm0gYWN0aW9uPSIvcmVzb3VyY2VzL2RlbGV0ZVVzZXJEYXRhYmFzZXMiPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InVzZXJEYXRhYmFzZXNGb3JtIiBwcm9wZXJ0eT0iZG9tYWluIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZG9tYWluIi8+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKyAgPCVAIGluY2x1ZGUgZmlsZT0idXNlckRhdGFiYXNlcy5qc3BmIiAlPgorICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKzwvaHRtbDpmb3JtPgorPGJyPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9mb290ZXIuanNwIiAlPgorCis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9lbnZFbnRyaWVzLmpzcGYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZW52RW50cmllcy5qc3BmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MzAwOGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZW52RW50cmllcy5qc3BmCkBAIC0wLDAgKzEsNTYgQEAKKzwlLS0gRW52IEVudHJpZXMgTGlzdCAtLSU+CisKKzx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiCisgICAgICAgd2lkdGg9IjEwMCUiPjx0cj48dGQ+IAorCisgIDx0YWJsZSBjbGFzcz0iZnJvbnQtdGFibGUiIGJvcmRlcj0iMSIKKyAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0ciBjbGFzcz0iaGVhZGVyLXJvdyI+CisgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJjaGVja2JveGVzIj4KKyAgICAgICAgPHRkIHdpZHRoPSI1JSI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAmbmJzcDsKKyAgICAgICAgPC90ZD4KKyAgICAgIDwvbG9naWM6cHJlc2VudD4KKyAgICAgIDx0aCBzY29wZT0iY29sIiB3aWR0aD0iMjAlIj48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmVudi5lbnRyeSIvPgorICAgICAgPC9kaXY+PC90aD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPgorICAgICAgPC9kaXY+PC90aD4KKyAgICAgIDx0aCBzY29wPSJjb2wiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5saXN0LmRlc2NyaXB0aW9uIi8+CisgICAgICA8L2Rpdj48L3RoPgorICAgIDwvdHI+CisKKyAgICA8bG9naWM6aXRlcmF0ZSBuYW1lPSJlbnZFbnRyaWVzRm9ybSIgcHJvcGVydHk9ImVudkVudHJpZXMiCisgICAgICAgICAgICAgICAgICAgICBpZD0iZW52RW50cnkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHRyIGNsYXNzPSJsaW5lLXJvdyI+CisgICAgICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9ImNoZWNrYm94ZXMiPgorICAgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJjZW50ZXIiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+CisgICAgICAgICAgICA8bGFiZWwgZm9yPSJlbnZFbnRyaWVzIj48L2xhYmVsPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJlbnZFbnRyaWVzIgorICAgICAgICAgICAgICAgICAgdmFsdWU9IjwlPSBlbnZFbnRyeSAlPiIgc3R5bGVJZD0iZW52RW50cmllcyI+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4KKyAgICAgICAgICA8aHRtbDpsaW5rIHBhZ2U9JzwlPSAiL3Jlc291cmNlcy9zZXRVcEVudkVudHJ5LmRvP29iamVjdE5hbWU9IiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGVudkVudHJ5LCJVVEYtOCIpICsgIiZyZXNvdXJjZXR5cGU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVzb3VyY2V0eXBlSW5mbywiVVRGLTgiKSArICImcGF0aD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGhJbmZvLCJVVEYtOCIpICsgIiZob3N0PSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoaG9zdEluZm8sIlVURi04IikgKyAiJmRvbWFpbj0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8sIlVURi04IikgJT4nPgorICAgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJlbnZFbnRyeSIgYXR0cmlidXRlPSJuYW1lIi8+CisgICAgICAgICAgPC9odG1sOmxpbms+CisgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPiZuYnNwOworICAgICAgICAgIDxjb250cm9sczphdHRyaWJ1dGUgbmFtZT0iZW52RW50cnkiIGF0dHJpYnV0ZT0idmFsdWUiLz4KKyAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJlbnZFbnRyeSIgYXR0cmlidXRlPSJkZXNjcmlwdGlvbiIvPgorICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgPC90cj4KKyAgICA8L2xvZ2ljOml0ZXJhdGU+CisKKyAgPC90YWJsZT4KKworPC90ZD48L3RyPjwvdGFibGU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZW52RW50cnkuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2VudkVudHJ5LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTE4NWMyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2VudkVudHJ5LmpzcApAQCAtMCwwICsxLDE3NiBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKworPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIvcmVzb3VyY2VzL3NhdmVFbnZFbnRyeSI+CisKKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJyZXNvdXJjZXR5cGVJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZW52RW50cnlGb3JtIiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJwYXRoSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJ5Rm9ybSIgcHJvcGVydHk9InBhdGgiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXRoIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJob3N0SW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJ5Rm9ybSIgcHJvcGVydHk9Imhvc3QiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJob3N0Ii8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJkb21haW5JbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZW52RW50cnlGb3JtIiBwcm9wZXJ0eT0iZG9tYWluIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZG9tYWluIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGNsYXNzPSJwYWdlLXRpdGxlLXJvdyI+CisgICAgICA8dGQgYWxpZ249ImxlZnQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJlbnZFbnRyeUZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJFbnZpcm9ubWVudCBFbnRyeSBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisKKyAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3Jlc291cmNlcy9zZXRVcEVudkVudHJ5LmRvP3Jlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvLCJVVEYtOCIpICsgIiZwYXRoPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aEluZm8sIlVURi04IikgKyAiJmhvc3Q9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0SW5mbywiVVRGLTgiKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbywiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLmVudi5jcmVhdGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3Jlc291cmNlcy9saXN0RW52RW50cmllcy5kbz9yZXNvdXJjZXR5cGU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVzb3VyY2V0eXBlSW5mbywiVVRGLTgiKSArICImcGF0aD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGhJbmZvLCJVVEYtOCIpICsgIiZob3N0PSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoaG9zdEluZm8sIlVURi04IikgKyAiJmRvbWFpbj0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8sIlVURi04IikgKyAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIkVudkVudHJpZXMgRGVsZXRlIExpc3QiLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmFjdGlvbnMuZW52LmRlbGV0ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbnM+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorPGJyPgorCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj48dGQ+PGRpdiBjbGFzcz0idGFibGUtdGl0bGUtdGV4dCI+CisgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmVudi5wcm9wcyIvPgorICAgIDwvZGl2PjwvdGQ+PC90cj4KKyAgPC90YWJsZT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorCisgICAgICAgIDxjb250cm9sczp0YWJsZSB0YWJsZVN0eWxlPSJmcm9udC10YWJsZSIgbGluZVN0eWxlPSJsaW5lLXJvdyI+CisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnByb3BlcnR5Ii8+PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+PC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9Im5hbWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5uYW1lIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJlbnZFbnRyeUZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIj4KKyAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJlbnZFbnRyeUZvcm0iIHByb3BlcnR5PSJuYW1lIi8+CisgICAgICAgICAgICAgICAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJuYW1lIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6cHJlc2VudD4KKyAgICAgICAgICAgICAgPGxvZ2ljOm5vdFByZXNlbnQgbmFtZT0iZW52RW50cnlGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSI+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ibmFtZSIgc2l6ZT0iMjQiIHN0eWxlSWQ9Im5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpub3RQcmVzZW50PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InR5cGUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnR5cGUiLz46CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0iZW50cnlUeXBlIiBzdHlsZUlkPSJ0eXBlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0idHlwZVZhbHMiIG5hbWU9ImVudkVudHJ5Rm9ybSIgcHJvcGVydHk9InR5cGVWYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249InR5cGVWYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ2YWx1ZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0YXJlYSBwcm9wZXJ0eT0idmFsdWUiIGNvbHM9IjMwIiByb3dzPSIzIiBzdHlsZUlkPSJ2YWx1ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9Im92ZXJyaWRlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5lbnYub3ZlcnJpZGUiLz46CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOmNoZWNrYm94IHByb3BlcnR5PSJvdmVycmlkZSIgdmFsdWU9Im92ZXJyaWRlIiBzdHlsZUlkPSJvdmVycmlkZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImRlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLnByb21wdC5kZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJkZXNjcmlwdGlvbiIgc2l6ZT0iMzAiIHN0eWxlSWQ9ImRlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPC9jb250cm9sczp0YWJsZT4KKworICAgICAgPC90ZD4KKworICAgIDwvdHI+CisKKyAgPC90YWJsZT4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKworPC9odG1sOmZvcm0+CisKKzwhLS0gU3RhbmRhcmQgRm9vdGVyIC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9mb290ZXIuanNwIiAlPgorCis8L2JvZHk+CisKKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3REYXRhU291cmNlcy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbGlzdERhdGFTb3VyY2VzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTZmNGZkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3REYXRhU291cmNlcy5qc3AKQEAgLTAsMCArMSw2MCBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBhY3Rpb249Ii9yZXNvdXJjZXMvbGlzdERhdGFTb3VyY2VzIj4KKworICA8YmVhbjpkZWZpbmUgaWQ9InJlc291cmNldHlwZUluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJkYXRhU291cmNlc0Zvcm0iIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9InBhdGhJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZXNGb3JtIiBwcm9wZXJ0eT0icGF0aCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhdGgiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9Imhvc3RJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZXNGb3JtIiBwcm9wZXJ0eT0iaG9zdCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Imhvc3QiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9ImRvbWFpbkluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJkYXRhU291cmNlc0Zvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIHdpZHRoPSIxOSUiPgorICAgICAgICA8ZGl2IGFsaWduPSJyaWdodCI+CisgICAgICAgICAgPCVAIGluY2x1ZGUgZmlsZT0ibGlzdERhdGFTb3VyY2VzLmpzcGYiICU+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8YnI+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImRhdGFTb3VyY2VzLmpzcGYiICU+CisKKzxicj4KKzwvaHRtbDpmb3JtPgorCis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0RGF0YVNvdXJjZXMuanNwZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0RGF0YVNvdXJjZXMuanNwZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2RjZTJlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3REYXRhU291cmNlcy5qc3BmCkBAIC0wLDAgKzEsMzIgQEAKKzx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKzxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+Cis8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iRGF0YSBTb3VyY2UgQWN0aW9ucyI+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+CisgICAgLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLQorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICA8Y29udHJvbHM6YWN0aW9uIGRpc2FibGVkPSJ0cnVlIj4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgPC9jb250cm9sczphY3Rpb24+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3Jlc291cmNlcy9zZXRVcERhdGFTb3VyY2UuZG8/cmVzb3VyY2V0eXBlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlc291cmNldHlwZUluZm8sIlVURi04IikgKyAiJnBhdGg9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoSW5mbywiVVRGLTgiKSArICImaG9zdD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3RJbmZvLCJVVEYtOCIpICsgIiZkb21haW49IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkb21haW5JbmZvLCJVVEYtOCIpJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuYWN0aW9ucy5kYXRhc3JjLmNyZWF0ZSIvPgorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL2xpc3REYXRhU291cmNlcy5kbz9yZXNvdXJjZXR5cGU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVzb3VyY2V0eXBlSW5mbywiVVRGLTgiKSArICImcGF0aD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGhJbmZvLCJVVEYtOCIpICsgIiZob3N0PSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoaG9zdEluZm8sIlVURi04IikgKyAiJmRvbWFpbj0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8sIlVURi04IikgKyAiJmZvcndhcmQ9IiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKCJEYXRhU291cmNlcyBEZWxldGUgTGlzdCIsIlVURi04IikgJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuYWN0aW9ucy5kYXRhc3JjLmRlbGV0ZSIvPgorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworPC9jb250cm9sczphY3Rpb25zPgorPC9kaXY+Cis8L3RkPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3RFbnZFbnRyaWVzLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0RW52RW50cmllcy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1ZTI1YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0RW52RW50cmllcy5qc3AKQEAgLTAsMCArMSw2MCBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBhY3Rpb249Ii9yZXNvdXJjZXMvbGlzdEVudkVudHJpZXMiPgorCisgIDxiZWFuOmRlZmluZSBpZD0icmVzb3VyY2V0eXBlSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJpZXNGb3JtIiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJwYXRoSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJpZXNGb3JtIiBwcm9wZXJ0eT0icGF0aCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhdGgiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9Imhvc3RJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZW52RW50cmllc0Zvcm0iIHByb3BlcnR5PSJob3N0Ii8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJpZXNGb3JtIiBwcm9wZXJ0eT0iZG9tYWluIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZG9tYWluIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuZW52LmVudHJpZXMiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIHdpZHRoPSIxOSUiPgorICAgICAgICA8ZGl2IGFsaWduPSJyaWdodCI+CisgICAgICAgICAgPCVAIGluY2x1ZGUgZmlsZT0ibGlzdEVudkVudHJpZXMuanNwZiIgJT4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzxicj4KKworPCVAIGluY2x1ZGUgZmlsZT0iZW52RW50cmllcy5qc3BmIiAlPgorCis8YnI+Cis8L2h0bWw6Zm9ybT4KKworPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbGlzdEVudkVudHJpZXMuanNwZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0RW52RW50cmllcy5qc3BmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTAwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbGlzdEVudkVudHJpZXMuanNwZgpAQCAtMCwwICsxLDMyIEBACis8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+Cis8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IkVudmlyb25tZW50IEVudHJ5IEFjdGlvbnMiPgorCisgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgPC9jb250cm9sczphY3Rpb24+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiBkaXNhYmxlZD0idHJ1ZSI+CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9yZXNvdXJjZXMvc2V0VXBFbnZFbnRyeS5kbz9yZXNvdXJjZXR5cGU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVzb3VyY2V0eXBlSW5mbywiVVRGLTgiKSArICImcGF0aD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGhJbmZvLCJVVEYtOCIpICsgIiZob3N0PSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoaG9zdEluZm8sIlVURi04IikgKyAiJmRvbWFpbj0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8sIlVURi04IikgJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuYWN0aW9ucy5lbnYuY3JlYXRlIi8+CisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9yZXNvdXJjZXMvbGlzdEVudkVudHJpZXMuZG8/cmVzb3VyY2V0eXBlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlc291cmNldHlwZUluZm8sIlVURi04IikgKyAiJnBhdGg9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoSW5mbywiVVRGLTgiKSArICImaG9zdD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3RJbmZvLCJVVEYtOCIpICsgIiZkb21haW49IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkb21haW5JbmZvLCJVVEYtOCIpICsgIiZmb3J3YXJkPSIrIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKCJFbnZFbnRyaWVzIERlbGV0ZSBMaXN0IiwiVVRGLTgiKSAlPic+CisgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLmVudi5kZWxldGUiLz4KKyAgPC9jb250cm9sczphY3Rpb24+CisKKzwvY29udHJvbHM6YWN0aW9ucz4KKzwvZGl2PgorPC90ZD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0TWFpbFNlc3Npb25zLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0TWFpbFNlc3Npb25zLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWU0YTExCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3RNYWlsU2Vzc2lvbnMuanNwCkBAIC0wLDAgKzEsNjAgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gYWN0aW9uPSIvcmVzb3VyY2VzL2xpc3RNYWlsU2Vzc2lvbnMiPgorCisgIDxiZWFuOmRlZmluZSBpZD0icmVzb3VyY2V0eXBlSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9InBhdGhJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0ibWFpbFNlc3Npb25zRm9ybSIgcHJvcGVydHk9InBhdGgiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXRoIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJob3N0SW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iIHByb3BlcnR5PSJob3N0Ii8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLm1haWxzZXNzaW9uIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCB3aWR0aD0iMTklIj4KKyAgICAgICAgPGRpdiBhbGlnbj0icmlnaHQiPgorICAgICAgICAgIDwlQCBpbmNsdWRlIGZpbGU9Imxpc3RNYWlsU2Vzc2lvbnMuanNwZiIgJT4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzxicj4KKworPCVAIGluY2x1ZGUgZmlsZT0ibWFpbFNlc3Npb25zLmpzcGYiICU+CisKKzxicj4KKzwvaHRtbDpmb3JtPgorCis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0TWFpbFNlc3Npb25zLmpzcGYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbGlzdE1haWxTZXNzaW9ucy5qc3BmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NDI3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbGlzdE1haWxTZXNzaW9ucy5qc3BmCkBAIC0wLDAgKzEsMzIgQEAKKzx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKzxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+Cis8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iTWFpbCBTZXNzaW9uIEFjdGlvbnMiPgorCisgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgPC9jb250cm9sczphY3Rpb24+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiBkaXNhYmxlZD0idHJ1ZSI+CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9yZXNvdXJjZXMvc2V0VXBNYWlsU2Vzc2lvbi5kbz9yZXNvdXJjZXR5cGU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVzb3VyY2V0eXBlSW5mbywiVVRGLTgiKSArICImcGF0aD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGhJbmZvLCJVVEYtOCIpICsgIiZob3N0PSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoaG9zdEluZm8sIlVURi04IikgKyAiJmRvbWFpbj0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8sIlVURi04IikgJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuYWN0aW9ucy5tYWlsc2Vzc2lvbi5jcmVhdGUiLz4KKyAgPC9jb250cm9sczphY3Rpb24+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3Jlc291cmNlcy9saXN0TWFpbFNlc3Npb25zLmRvP3Jlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvLCJVVEYtOCIpICsgIiZwYXRoPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aEluZm8sIlVURi04IikgKyAiJmhvc3Q9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0SW5mbywiVVRGLTgiKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbywiVVRGLTgiKSArICImZm9yd2FyZD0iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIk1haWxTZXNzaW9ucyBEZWxldGUgTGlzdCIsIlVURi04IikgJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuYWN0aW9ucy5tYWlsc2Vzc2lvbi5kZWxldGUiLz4KKyAgPC9jb250cm9sczphY3Rpb24+CisKKzwvY29udHJvbHM6YWN0aW9ucz4KKzwvZGl2PgorPC90ZD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0UmVzb3VyY2VMaW5rcy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbGlzdFJlc291cmNlTGlua3MuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZDk5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbGlzdFJlc291cmNlTGlua3MuanNwCkBAIC0wLDAgKzEsNjAgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gYWN0aW9uPSIvcmVzb3VyY2VzL2xpc3RSZXNvdXJjZUxpbmtzIj4KKworICA8YmVhbjpkZWZpbmUgaWQ9InJlc291cmNldHlwZUluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIgcHJvcGVydHk9InJlc291cmNldHlwZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InJlc291cmNldHlwZSIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0icGF0aEluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIgcHJvcGVydHk9InBhdGgiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXRoIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJob3N0SW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlTGlua3NGb3JtIiBwcm9wZXJ0eT0iaG9zdCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Imhvc3QiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9ImRvbWFpbkluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIgcHJvcGVydHk9ImRvbWFpbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImRvbWFpbiIvPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmFjdGlvbnMucmVzb3VyY2VsayIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgd2lkdGg9IjE5JSI+CisgICAgICAgIDxkaXYgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICA8JUAgaW5jbHVkZSBmaWxlPSJsaXN0UmVzb3VyY2VMaW5rcy5qc3BmIiAlPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworPGJyPgorCis8JUAgaW5jbHVkZSBmaWxlPSJyZXNvdXJjZUxpbmtzLmpzcGYiICU+CisKKzxicj4KKzwvaHRtbDpmb3JtPgorCis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0UmVzb3VyY2VMaW5rcy5qc3BmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3RSZXNvdXJjZUxpbmtzLmpzcGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzMDM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0UmVzb3VyY2VMaW5rcy5qc3BmCkBAIC0wLDAgKzEsMzIgQEAKKzx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKzxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+Cis8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iUmVzb3VyY2UgTGluayBBY3Rpb25zIj4KKworICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4KKyAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL3NldFVwUmVzb3VyY2VMaW5rLmRvP3Jlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvLCJVVEYtOCIpICsgIiZwYXRoPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aEluZm8sIlVURi04IikgKyAiJmhvc3Q9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0SW5mbywiVVRGLTgiKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbywiVVRGLTgiKSAlPic+CisgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLnJlc291cmNlbGsuY3JlYXRlIi8+CisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9yZXNvdXJjZXMvbGlzdFJlc291cmNlTGlua3MuZG8/cmVzb3VyY2V0eXBlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlc291cmNldHlwZUluZm8sIlVURi04IikgKyAiJnBhdGg9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoSW5mbywiVVRGLTgiKSArICImaG9zdD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3RJbmZvLCJVVEYtOCIpICsgIiZkb21haW49IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkb21haW5JbmZvLCJVVEYtOCIpICsiJmZvcndhcmQ9IiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKCJSZXNvdXJjZUxpbmtzIERlbGV0ZSBMaXN0IiwiVVRGLTgiKSAlPic+CisgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLnJlc291cmNlbGsuZGVsZXRlIi8+CisgIDwvY29udHJvbHM6YWN0aW9uPgorCis8L2NvbnRyb2xzOmFjdGlvbnM+Cis8L2Rpdj4KKzwvdGQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbGlzdFVzZXJEYXRhYmFzZXMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3RVc2VyRGF0YWJhc2VzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmQ4MDhhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3RVc2VyRGF0YWJhc2VzLmpzcApAQCAtMCwwICsxLDQ5IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIGFjdGlvbj0iL3Jlc291cmNlcy9saXN0VXNlckRhdGFiYXNlcyI+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJkb21haW5JbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0idXNlckRhdGFiYXNlc0Zvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy50cmVlQnVpbGRlci5kYXRhYmFzZXMiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIHdpZHRoPSIxOSUiPgorICAgICAgICA8ZGl2IGFsaWduPSJyaWdodCI+CisgICAgICAgICAgPCVAIGluY2x1ZGUgZmlsZT0ibGlzdFVzZXJEYXRhYmFzZXMuanNwZiIgJT4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzxicj4KKworPCVAIGluY2x1ZGUgZmlsZT0idXNlckRhdGFiYXNlcy5qc3BmIiAlPgorCis8L2h0bWw6Zm9ybT4KKworPGJyPgorCis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0VXNlckRhdGFiYXNlcy5qc3BmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3RVc2VyRGF0YWJhc2VzLmpzcGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5NmQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0VXNlckRhdGFiYXNlcy5qc3BmCkBAIC0wLDAgKzEsMjYgQEAKKzx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKzxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+Cis8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iVXNlciBEYXRhYmFzZSBBY3Rpb25zIj4KKworICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4KKyAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL3NldFVwVXNlckRhdGFiYXNlLmRvP2RvbWFpbj0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8sIlVURi04IikgJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuYWN0aW9ucy51c2VyZGIuY3JlYXRlIi8+CisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9yZXNvdXJjZXMvbGlzdFVzZXJEYXRhYmFzZXMuZG8/ZG9tYWluPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbywiVVRGLTgiKSArICImZm9yd2FyZD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKCJVc2VyRGF0YWJhc2VzIERlbGV0ZSBMaXN0IiwiVVRGLTgiKSAlPic+CisgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLnVzZXJkYi5kZWxldGUiLz4KKyAgPC9jb250cm9sczphY3Rpb24+CisKKzwvY29udHJvbHM6YWN0aW9ucz4KKzwvZGl2PgorPC90ZD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9tYWlsU2Vzc2lvbi5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbWFpbFNlc3Npb24uanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZmY3NWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbWFpbFNlc3Npb24uanNwCkBAIC0wLDAgKzEsMTQyIEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorCis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9yZXNvdXJjZXMvc2F2ZU1haWxTZXNzaW9uIj4KKworICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9InJlc291cmNldHlwZUluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJtYWlsU2Vzc2lvbkZvcm0iIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9InBhdGhJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0ibWFpbFNlc3Npb25Gb3JtIiBwcm9wZXJ0eT0icGF0aCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhdGgiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9Imhvc3RJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0ibWFpbFNlc3Npb25Gb3JtIiBwcm9wZXJ0eT0iaG9zdCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Imhvc3QiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9ImRvbWFpbkluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJtYWlsU2Vzc2lvbkZvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgY2xhc3M9InBhZ2UtdGl0bGUtcm93Ij4KKyAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9Im1haWxTZXNzaW9uRm9ybSIgcHJvcGVydHk9Im5vZGVMYWJlbCIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9Ik1haWwgU2Vzc2lvbiBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisKKyAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3Jlc291cmNlcy9zZXRVcE1haWxTZXNzaW9uLmRvP3Jlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvLCJVVEYtOCIpICsgIiZwYXRoPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aEluZm8sIlVURi04IikgKyAiJmhvc3Q9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0SW5mbywiVVRGLTgiKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbywiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLm1haWxzZXNzaW9uLmNyZWF0ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL2xpc3RNYWlsU2Vzc2lvbnMuZG8/cmVzb3VyY2V0eXBlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlc291cmNldHlwZUluZm8sIlVURi04IikgKyAiJnBhdGg9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoSW5mbywiVVRGLTgiKSArICImaG9zdD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3RJbmZvLCJVVEYtOCIpICsgIiZkb21haW49IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkb21haW5JbmZvLCJVVEYtOCIpICsgIiZmb3J3YXJkPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKCJNYWlsU2Vzc2lvbnMgRGVsZXRlIExpc3QiLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmFjdGlvbnMubWFpbHNlc3Npb24uZGVsZXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+Cis8YnI+CisKKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPjx0ZD48ZGl2IGNsYXNzPSJ0YWJsZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy50cmVlQnVpbGRlci5tYWlsc2Vzc2lvbnMiLz4KKyAgICA8L2Rpdj48L3RkPjwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKworICAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIgorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPjwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJuYW1lIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5tYWlsc2Vzc2lvbi5uYW1lIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJtYWlsU2Vzc2lvbkZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIj4KKyAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJtYWlsU2Vzc2lvbkZvcm0iIHByb3BlcnR5PSJuYW1lIi8+CisgICAgICAgICAgICAgICAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJuYW1lIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6cHJlc2VudD4KKyAgICAgICAgICAgICAgPGxvZ2ljOm5vdFByZXNlbnQgbmFtZT0ibWFpbFNlc3Npb25Gb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSI+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ibmFtZSIgc2l6ZT0iMzUiIG1heGxlbmd0aD0iNTYiIHN0eWxlSWQ9Im5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpub3RQcmVzZW50PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9Im1haWxob3N0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5tYWlsc2Vzc2lvbi5tYWlsaG9zdCIvPjoKKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0YXJlYSBwcm9wZXJ0eT0ibWFpbGhvc3QiIGNvbHM9IjM1IiByb3dzPSIyIiBzdHlsZUlkPSJtYWlsaG9zdCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDwvY29udHJvbHM6dGFibGU+CisKKyAgICAgIDwvdGQ+CisKKyAgICA8L3RyPgorCisgIDwvdGFibGU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisKKzwvaHRtbDpmb3JtPgorCis8IS0tIFN0YW5kYXJkIEZvb3RlciAtLT4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvZm9vdGVyLmpzcCIgJT4KKworPC9ib2R5PgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9tYWlsU2Vzc2lvbnMuanNwZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9tYWlsU2Vzc2lvbnMuanNwZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTFkZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL21haWxTZXNzaW9ucy5qc3BmCkBAIC0wLDAgKzEsNTIgQEAKKzwlLS0gTWFpbFNlc3Npb25zIExpc3QgLS0lPgorCis8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIgorICAgICAgIHdpZHRoPSIxMDAlIj48dHI+PHRkPiAKKworICA8dGFibGUgY2xhc3M9ImZyb250LXRhYmxlIiBib3JkZXI9IjEiCisgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHIgY2xhc3M9ImhlYWRlci1yb3ciPgorICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iY2hlY2tib3hlcyI+CisgICAgICAgIDx0ZCB3aWR0aD0iNSUiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgJm5ic3A7CisgICAgICAgIDwvdGQ+CisgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICA8dGggc2NvcGU9ImNvbCIgd2lkdGg9IjIwJSI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5tYWlsc2Vzc2lvbi5uYW1lIi8+CisgICAgICA8L2Rpdj48L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMubWFpbHNlc3Npb24ubWFpbGhvc3QiLz4KKyAgICAgIDwvZGl2PjwvdGg+CisgICAgPC90cj4KKworICAgIDxsb2dpYzppdGVyYXRlIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iIHByb3BlcnR5PSJtYWlsU2Vzc2lvbnMiCisgICAgICAgICAgICAgICAgICAgICBpZD0ibWFpbFNlc3Npb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHRyIGNsYXNzPSJsaW5lLXJvdyI+CisgICAgICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9ImNoZWNrYm94ZXMiPgorICAgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJjZW50ZXIiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+CisgICAgICAgICAgICA8bGFiZWwgZm9yPSJtYWlsU2Vzc2lvbnMiPjwvbGFiZWw+CisgICAgICAgICAgICA8IS0tIG1haWxTZXNzaW9uIGhhcyBkb3VibGUgcXVvdGVzIGludGVybmFsbHksIHVzZSBzaW5nbGUgcXVvdGVzIGZvciB2YWx1ZSAtLT4KKyAgICAgICAgICAgIDwhLS0gU2VlIEJ1Z3ppbGxhIDM1OTgyOiBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM1OTgyIC0tPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJtYWlsU2Vzc2lvbnMiIHN0eWxlSWQ9Im1haWxTZXNzaW9uIgorICAgICAgICAgICAgICAgICAgdmFsdWU9JzwlPSBtYWlsU2Vzc2lvbiAlPicgLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPgorICAgICAgICAgIDxodG1sOmxpbmsgcGFnZT0nPCU9ICIvcmVzb3VyY2VzL3NldFVwTWFpbFNlc3Npb24uZG8/b2JqZWN0TmFtZT0iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUobWFpbFNlc3Npb24sIlVURi04IikgKyAiJnJlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvLCJVVEYtOCIpICsgIiZwYXRoPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aEluZm8sIlVURi04IikgKyAiJmhvc3Q9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0SW5mbywiVVRGLTgiKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbywiVVRGLTgiKSAlPic+CisgICAgICAgICAgICA8Y29udHJvbHM6YXR0cmlidXRlIG5hbWU9Im1haWxTZXNzaW9uIiBhdHRyaWJ1dGU9Im5hbWUiLz4KKyAgICAgICAgICA8L2h0bWw6bGluaz4KKyAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgPHRkIHNjb3BlPSJyb3ciPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJtYWlsU2Vzc2lvbiIgYXR0cmlidXRlPSJtYWlsLnNtdHAuaG9zdCIvPgorICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgPC90cj4KKyAgICA8L2xvZ2ljOml0ZXJhdGU+CisKKyAgPC90YWJsZT4KKworPC90ZD48L3RyPjwvdGFibGU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvcmVzb3VyY2VMaW5rLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9yZXNvdXJjZUxpbmsuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOTI5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvcmVzb3VyY2VMaW5rLmpzcApAQCAtMCwwICsxLDE1MyBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKworPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIvcmVzb3VyY2VzL3NhdmVSZXNvdXJjZUxpbmsiPgorCisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0icmVzb3VyY2V0eXBlSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlTGlua0Zvcm0iIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9InBhdGhJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0icmVzb3VyY2VMaW5rRm9ybSIgcHJvcGVydHk9InBhdGgiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXRoIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJob3N0SW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlTGlua0Zvcm0iIHByb3BlcnR5PSJob3N0Ii8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlTGlua0Zvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBjbGFzcz0icGFnZS10aXRsZS1yb3ciPgorICAgICAgPHRkIGFsaWduPSJsZWZ0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0icmVzb3VyY2VMaW5rRm9ybSIgcHJvcGVydHk9Im5vZGVMYWJlbCIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IlJlc291cmNlIExpbmsgQWN0aW9ucyI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorCisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL3NldFVwUmVzb3VyY2VMaW5rLmRvP3Jlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvLCJVVEYtOCIpICsgIiZwYXRoPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aEluZm8sIlVURi04IikgKyAiJmhvc3Q9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0SW5mbywiVVRGLTgiKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbywiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLnJlc291cmNlbGsuY3JlYXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9yZXNvdXJjZXMvbGlzdFJlc291cmNlTGlua3MuZG8/cmVzb3VyY2V0eXBlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlc291cmNldHlwZUluZm8sIlVURi04IikgKyAiJnBhdGg9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoSW5mbywiVVRGLTgiKSArICImaG9zdD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3RJbmZvLCJVVEYtOCIpICsgIiZkb21haW49IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkb21haW5JbmZvLCJVVEYtOCIpICsgIiZmb3J3YXJkPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKCJSZXNvdXJjZUxpbmtzIERlbGV0ZSBMaXN0IiwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLnJlc291cmNlbGsuZGVsZXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+Cis8YnI+CisKKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPjx0ZD48ZGl2IGNsYXNzPSJ0YWJsZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy50cmVlQnVpbGRlci5yZXNvdXJjZWxpbmtzIi8+CisgICAgPC9kaXY+PC90ZD48L3RyPgorICA8L3RhYmxlPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQ+CisKKyAgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKyAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgICBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydHkiLz48L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UudmFsdWUiLz48L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0ibmFtZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMucmVzb3VyY2Vsay5uYW1lIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJyZXNvdXJjZUxpbmtGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSI+CisgICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0icmVzb3VyY2VMaW5rRm9ybSIgcHJvcGVydHk9Im5hbWUiLz4KKyAgICAgICAgICAgICAgICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgICAgICAgICA8bG9naWM6bm90UHJlc2VudCBuYW1lPSJyZXNvdXJjZUxpbmtGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSI+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ibmFtZSIgc2l6ZT0iMzUiIG1heGxlbmd0aD0iNTYiIHN0eWxlSWQ9Im5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpub3RQcmVzZW50PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9Imdsb2JhbCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMucmVzb3VyY2Vsay5nbG9iYWwiLz46CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iZ2xvYmFsIiBzaXplPSIzNSIgbWF4bGVuZ3RoPSI1NiIgc3R5bGVJZD0iZ2xvYmFsIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idHlwZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMucmVzb3VyY2Vsay50eXBlIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ0eXBlIiBzaXplPSI0NSIgbWF4bGVuZ3RoPSIyNTYiIHN0eWxlSWQ9InR5cGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgIDwvY29udHJvbHM6dGFibGU+CisKKyAgICAgIDwvdGQ+CisKKyAgICA8L3RyPgorCisgIDwvdGFibGU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisKKzwvaHRtbDpmb3JtPgorCis8IS0tIFN0YW5kYXJkIEZvb3RlciAtLT4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvZm9vdGVyLmpzcCIgJT4KKworPC9ib2R5PgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9yZXNvdXJjZUxpbmtzLmpzcGYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvcmVzb3VyY2VMaW5rcy5qc3BmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYWFhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvcmVzb3VyY2VMaW5rcy5qc3BmCkBAIC0wLDAgKzEsNDggQEAKKzwlLS0gUmVzb3VyY2VMaW5rcyBMaXN0IC0tJT4KKworPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIKKyAgICAgICB3aWR0aD0iMTAwJSI+PHRyPjx0ZD4gCisKKyAgPHRhYmxlIGNsYXNzPSJmcm9udC10YWJsZSIgYm9yZGVyPSIxIgorICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyIGNsYXNzPSJoZWFkZXItcm93Ij4KKyAgICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9ImNoZWNrYm94ZXMiPgorICAgICAgICA8dGQgd2lkdGg9IjUlIj48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICZuYnNwOworICAgICAgICA8L3RkPgorICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgPHRoIHNjb3BlPSJjb2wiIHdpZHRoPSIyMCUiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMucmVzb3VyY2Vsay5uYW1lIi8+CisgICAgICA8L2Rpdj48L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMucmVzb3VyY2Vsay5nbG9iYWwiLz4KKyAgICAgIDwvZGl2PjwvdGg+CisgICAgPC90cj4KKyAgICA8bG9naWM6aXRlcmF0ZSBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIgcHJvcGVydHk9InJlc291cmNlTGlua3MiCisgICAgICAgICAgICAgICAgICAgICBpZD0icmVzb3VyY2VMaW5rIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDx0ciBjbGFzcz0ibGluZS1yb3ciPgorICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJjaGVja2JveGVzIj4KKyAgICAgICAgICA8dGQgc2NvcGU9InJvdyI+PGRpdiBhbGlnbj0iY2VudGVyIiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPgorICAgICAgICAgICAgPGxhYmVsIGZvcj0icmVzb3VyY2VMaW5rcyI+PC9sYWJlbD4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVzb3VyY2VMaW5rcyIKKyAgICAgICAgICAgICAgICAgIHZhbHVlPSI8JT0gcmVzb3VyY2VMaW5rICU+IiBzdHlsZUlkPSJyZXNvdXJjZUxpbmtzIj4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPgorICAgICAgICAgIDxodG1sOmxpbmsgcGFnZT0nPCU9ICIvcmVzb3VyY2VzL3NldFVwUmVzb3VyY2VMaW5rLmRvP29iamVjdE5hbWU9IiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlc291cmNlTGluaywiVVRGLTgiKSArICImcmVzb3VyY2V0eXBlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlc291cmNldHlwZUluZm8sIlVURi04IikgKyAiJnBhdGg9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoSW5mbywiVVRGLTgiKSArICImaG9zdD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3RJbmZvLCJVVEYtOCIpICsgIiZkb21haW49IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkb21haW5JbmZvLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgIDxjb250cm9sczphdHRyaWJ1dGUgbmFtZT0icmVzb3VyY2VMaW5rIiBhdHRyaWJ1dGU9Im5hbWUiLz4KKyAgICAgICAgICA8L2h0bWw6bGluaz4KKyAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgPHRkIHNjb3BlPSJyb3ciPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJyZXNvdXJjZUxpbmsiIGF0dHJpYnV0ZT0iZ2xvYmFsIi8+CisgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvbG9naWM6aXRlcmF0ZT4KKyAgPC90YWJsZT4KKworPC90ZD48L3RyPjwvdGFibGU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvdXNlckRhdGFiYXNlLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy91c2VyRGF0YWJhc2UuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZTg1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvdXNlckRhdGFiYXNlLmpzcApAQCAtMCwwICsxLDE0NSBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKworPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIvcmVzb3VyY2VzL3NhdmVVc2VyRGF0YWJhc2UiPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InVzZXJEYXRhYmFzZUZvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0idHlwZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImZhY3RvcnkiLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgY2xhc3M9InBhZ2UtdGl0bGUtcm93Ij4KKyAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InVzZXJEYXRhYmFzZUZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJVc2VyIERhdGFiYXNlIEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+CisgICAgICAgICAgICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3Jlc291cmNlcy9zZXRVcFVzZXJEYXRhYmFzZS5kbz9kb21haW49IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkb21haW5JbmZvLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmFjdGlvbnMudXNlcmRiLmNyZWF0ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL2xpc3RVc2VyRGF0YWJhc2VzLmRvP2RvbWFpbj0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8sIlVURi04IikgKyAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSgiVXNlckRhdGFiYXNlcyBEZWxldGUgTGlzdCIsIlVURi04IikgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuYWN0aW9ucy51c2VyZGIuZGVsZXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+Cis8YnI+CisKKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPjx0ZD48ZGl2IGNsYXNzPSJ0YWJsZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy50cmVlQnVpbGRlci5kYXRhYmFzZXMiLz4KKyAgICA8L2Rpdj48L3RkPjwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKworICAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIgorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPjwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJuYW1lIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UubmFtZSIvPjoKKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0idXNlckRhdGFiYXNlRm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiPgorICAgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InVzZXJEYXRhYmFzZUZvcm0iIHByb3BlcnR5PSJuYW1lIi8+CisgICAgICAgICAgICAgICAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJuYW1lIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6cHJlc2VudD4KKyAgICAgICAgICAgICAgPGxvZ2ljOm5vdFByZXNlbnQgbmFtZT0idXNlckRhdGFiYXNlRm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9Im5hbWUiIHNpemU9IjI0IiBtYXhsZW5ndGg9IjMyIiBzdHlsZUlkPSJuYW1lIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6bm90UHJlc2VudD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJsb2NhdGlvbiI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMudXNlcmRiLmxvY2F0aW9uIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJwYXRoIiBzaXplPSIzMiIgbWF4bGVuZ3RoPSI2NCIgc3R5bGVJZD0ibG9jYXRpb24iLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJmYWN0b3J5Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy51c2VyZGIuZmFjdG9yeSIvPjoKKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0idXNlckRhdGFiYXNlRm9ybSIgcHJvcGVydHk9ImZhY3RvcnkiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJkZXNjcmlwdGlvbiI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5wcm9tcHQuZGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGh0bWw6dGV4dGFyZWEgcHJvcGVydHk9ImRlc2NyaXB0aW9uIiBjb2xzPSIzMiIgcm93cz0iMyIgc3R5bGVJZD0iZGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8L2NvbnRyb2xzOnRhYmxlPgorCisgICAgICA8L3RkPgorCisgICAgPC90cj4KKworICA8L3RhYmxlPgorCisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorCis8L2h0bWw6Zm9ybT4KKworPCEtLSBTdGFuZGFyZCBGb290ZXIgLS0+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2Zvb3Rlci5qc3AiICU+CisKKzwvYm9keT4KKworPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvdXNlckRhdGFiYXNlcy5qc3BmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL3VzZXJEYXRhYmFzZXMuanNwZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTBlNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL3VzZXJEYXRhYmFzZXMuanNwZgpAQCAtMCwwICsxLDY1IEBACis8JS0tIEVudiBFbnRyaWVzIExpc3QgLS0lPgorCis8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIgorICAgICAgIHdpZHRoPSIxMDAlIj48dHI+PHRkPiAKKworICA8dGFibGUgY2xhc3M9ImZyb250LXRhYmxlIiBib3JkZXI9IjEiCisgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHIgY2xhc3M9ImhlYWRlci1yb3ciPgorICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iY2hlY2tib3hlcyI+CisgICAgICAgIDx0ZCB3aWR0aD0iNSUiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgJm5ic3A7CisgICAgICAgIDwvdGQ+CisgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICA8dGggc2NvcGU9ImNvbCIgd2lkdGg9IjIwJSI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UubmFtZSIvPgorICAgICAgPC9kaXY+PC90aD4KKyAgICAgIDwlLS0KKyAgICAgIDx0aCBzY29wZT0iY29sIj48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLnVzZXJkYi5sb2NhdGlvbiIvPgorICAgICAgPC9kaXY+PC90aD4KKyAgICAgIC0tJT4KKyAgICAgIDx0aCBzY29wZT0iY29sIj48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMubGlzdC5kZXNjcmlwdGlvbiIvPgorICAgICAgPC9kaXY+PC90aD4KKyAgICA8L3RyPgorICAgIDxsb2dpYzppdGVyYXRlIG5hbWU9InVzZXJEYXRhYmFzZXNGb3JtIiBwcm9wZXJ0eT0idXNlckRhdGFiYXNlcyIKKyAgICAgICAgICAgICAgICAgICAgIGlkPSJ1c2VyRGF0YWJhc2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHRyIGNsYXNzPSJsaW5lLXJvdyI+CisgICAgICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9ImNoZWNrYm94ZXMiPgorICAgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJjZW50ZXIiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+CisgICAgICAgICAgICAgPGxvZ2ljOm1hdGNoIG5hbWU9InVzZXJEYXRhYmFzZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJuYW1lPVVzZXJEYXRhYmFzZSI+CisgICAgICAgICAgICAgPGZvbnQgY29sb3I9J3JlZCc+KjwvZm9udD4KKyAgICAgICAgICAgICA8L2xvZ2ljOm1hdGNoPgorICAgICAgICAgICAgIDxsb2dpYzpub3RNYXRjaCBuYW1lPSJ1c2VyRGF0YWJhc2UiCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ibmFtZT1Vc2VyRGF0YWJhc2UiPgorICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJ1c2VyRGF0YWJhc2VzIj48L2xhYmVsPiAgICAgICAKKyAgICAgICAgICAgICAgPGh0bWw6bXVsdGlib3ggcHJvcGVydHk9InVzZXJEYXRhYmFzZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJ1c2VyRGF0YWJhc2UiIHN0eWxlSWQ9InVzZXJEYXRhYmFzZXMiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpub3RNYXRjaD4gICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgIDwhLS1pbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0idXNlckRhdGFiYXNlcyIKKyAgICAgICAgICAgICAgICAgIHZhbHVlPSI8JT0gdXNlckRhdGFiYXNlICU+IiBzdHlsZUlkPSJ1c2VyRGF0YWJhc2VzIi0tPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvbG9naWM6cHJlc2VudD4KKyAgICAgICAgPHRkIHNjb3BlPSJyb3ciPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+CisgICAgICAgICAgPGh0bWw6bGluayBwYWdlPSc8JT0gIi9yZXNvdXJjZXMvc2V0VXBVc2VyRGF0YWJhc2UuZG8/b2JqZWN0TmFtZT0iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodXNlckRhdGFiYXNlLCJVVEYtOCIpICsgIiZkb21haW49IiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8sIlVURi04IikgJT4nPgorICAgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJ1c2VyRGF0YWJhc2UiIGF0dHJpYnV0ZT0ibmFtZSIvPgorICAgICAgICAgIDwvaHRtbDpsaW5rPgorICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICA8JS0tIEZJWCBNRSAtLSBjb21tZW50cmVkIG91dCBmb3Igbm93IGFzIHRoZSBwYWdlIHdhcyBsb29raW5nIHRvbyBjcm93ZGVkLgorICAgICAgICA8dGQgc2NvcGU9InJvdyI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4KKyAgICAgICAgICA8Y29udHJvbHM6YXR0cmlidXRlIG5hbWU9InVzZXJEYXRhYmFzZSIgYXR0cmlidXRlPSJwYXRobmFtZSIvPgorICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAtLSU+CisgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPgorICAgICAgICAgIDxjb250cm9sczphdHRyaWJ1dGUgbmFtZT0idXNlckRhdGFiYXNlIiBhdHRyaWJ1dGU9ImRlc2NyaXB0aW9uIi8+CisgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvbG9naWM6aXRlcmF0ZT4KKyAgPC90YWJsZT4KKworPC90ZD48L3RyPjwvdGFibGU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9zYXZlZC5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9zYXZlZC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE5MWU2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3NhdmVkLmpzcApAQCAtMCwwICsxLDM2IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorCis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworICA8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCisgICAgPCUtLSBDYXVzZSBvdXIgdHJlZSBjb250cm9sIHRvIHJlZnJlc2ggaXRzZWxmIC0tJT4KKyAgICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KKyAgICAgIDwhLS0KKyAgICAgICAgcGFyZW50LnRyZWUubG9jYXRpb249J3RyZWVDb250cm9sVGVzdC5kbyc7CisgICAgICAtLT4KKyAgICA8L3NjcmlwdD4KKworICAgIDwlQCBpbmNsdWRlIGZpbGU9ImhlYWRlci5qc3AiICU+CisKKyAgICA8JS0tIGRpc3BsYXkgd2FybmluZ3MgaWYgYW55IC0tJT4KKyAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJ3YXJuaW5nIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ3YXJuaW5nLmhlYWRlciIvPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9JzwlPSAoU3RyaW5nKSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgid2FybmluZyIpICU+Jy8+CisgICAgICAgICAgICA8YnI+CisgICAgPC9sb2dpYzpwcmVzZW50PgorCisgICAgPGNlbnRlcj48aDI+CisgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2F2ZS5zdWNjZXNzIi8+CisgICAgPC9oMj48L2NlbnRlcj4KKworICAgIDwlQCBpbmNsdWRlIGZpbGU9ImZvb3Rlci5qc3AiICU+CisKKyAgPC9ib2R5PgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3NhdmVmYWlsLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3NhdmVmYWlsLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTBkMjdhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vc2F2ZWZhaWwuanNwCkBAIC0wLDAgKzEsMzggQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+CisKKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCisgIDxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSJpbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKyAgICA8JS0tIENhdXNlIG91ciB0cmVlIGNvbnRyb2wgdG8gcmVmcmVzaCBpdHNlbGYgLS0lPgorICAgIDxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgorICAgICAgPCEtLQorICAgICAgICBwYXJlbnQudHJlZS5sb2NhdGlvbj0ndHJlZUNvbnRyb2xUZXN0LmRvJzsKKyAgICAgIC0tPgorICAgIDwvc2NyaXB0PgorCisgICAgPCVAIGluY2x1ZGUgZmlsZT0iaGVhZGVyLmpzcCIgJT4KKyAgICA8Y2VudGVyPjxoMj4KKyAgICA8JS0tIGRpc3BsYXkgd2FybmluZ3MgaWYgYW55IC0tJT4KKyAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJ3YXJuaW5nIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ3YXJuaW5nLmhlYWRlciIvPgorICAgIDwvaDI+PC9jZW50ZXI+CisgICAgPGgzPjxjZW50ZXI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0nPCU9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJ3YXJuaW5nIikgJT4nLz4KKyAgICAgICAgICAgIDxicj4KKyAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgPC9oMz48L2NlbnRlcj4KKyAgICA8Y2VudGVyPjxoMj4KKyAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJzYXZlLmZhaWwiLz4KKyAgICA8L2gyPjwvY2VudGVyPgorCisgICAgPCVAIGluY2x1ZGUgZmlsZT0iZm9vdGVyLmpzcCIgJT4KKworICA8L2JvZHk+CisKKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vc2VydmVyL3NlcnZlci5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9zZXJ2ZXIvc2VydmVyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmI2YmFiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vc2VydmVyL3NlcnZlci5qc3AKQEAgLTAsMCArMSwxMDcgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+CisKKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL1NhdmVTZXJ2ZXIiIGZvY3VzPSJwb3J0TnVtYmVyVGV4dCI+CisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJzZXJ2ZXJGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgY2xhc3M9InBhZ2UtdGl0bGUtcm93Ij4KKyAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJzZXJ2ZXJGb3JtIiBwcm9wZXJ0eT0ibm9kZUxhYmVsIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IlNlcnZlciBBY3Rpb25zIj4KKyAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4KKyAgICAgICAgICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0FkZFNlcnZpY2UuZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5zZXJ2aWNlcy5jcmVhdGUiLz4KKyAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvRGVsZXRlU2VydmljZS5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnNlcnZpY2VzLmRlbGV0ZXMiLz4KKyAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyA8YnI+CisKKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPjx0ZD48ZGl2IGNsYXNzPSJ0YWJsZS10aXRsZS10ZXh0Ij4KKyAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2ZXIucHJvcGVydGllcyIvPgorICAgIDwvZGl2PjwvdGQ+PC90cj4KKyAgPC90YWJsZT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorICAgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKyAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icG9ydE51bWJlciI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZlci5wb3J0bnVtYmVyIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0icG9ydE51bWJlclRleHQiIHNpemU9IjI0IiBtYXhsZW5ndGg9IjI0IiBzdHlsZUlkPSJwb3J0TnVtYmVyIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJzaHV0ZG93biI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZlci5zaHV0ZG93biIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJzaHV0ZG93blRleHQiIHNpemU9IjI0IiBtYXhsZW5ndGg9IjI0IiBzdHlsZUlkPSJzaHV0ZG93biIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgICAgIDwvY29udHJvbHM6dGFibGU+CisKKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKworPC9odG1sOmZvcm0+CisKKzwhLS0gU3RhbmRhcmQgRm9vdGVyIC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi9mb290ZXIuanNwIiAlPgorCis8L2JvZHk+CisKKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vc2VydmljZS9zZXJ2aWNlLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3NlcnZpY2Uvc2VydmljZS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmYWQwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3NlcnZpY2Uvc2VydmljZS5qc3AKQEAgLTAsMCArMSwyMzMgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+CisKKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL1NhdmVTZXJ2aWNlIj4KKworICA8YmVhbjpkZWZpbmUgaWQ9InNlcnZpY2VOYW1lIiBuYW1lPSJzZXJ2aWNlRm9ybSIgcHJvcGVydHk9InNlcnZpY2VOYW1lIi8+CisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJzZXJ2aWNlRm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGJlYW46ZGVmaW5lIGlkPSJ0aGlzU2VydmljZU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJzZXJ2aWNlRm9ybSIgcHJvcGVydHk9InNlcnZpY2VOYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iYWRtaW5TZXJ2aWNlTmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJlbmdpbmVPYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iLz4KKyAgPGJlYW46ZGVmaW5lIGlkPSJhZG1pblNlcnZpY2VOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0ic2VydmljZUZvcm0iIHByb3BlcnR5PSJhZG1pblNlcnZpY2VOYW1lIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGNsYXNzPSJwYWdlLXRpdGxlLXJvdyI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJzZXJ2aWNlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnNlcnZpY2VzLmNyZWF0ZSIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9InNlcnZpY2VGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InNlcnZpY2VGb3JtIiBwcm9wZXJ0eT0ibm9kZUxhYmVsIi8+CisgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJTZXJ2aWNlIEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+CisgICAgICAgICAgICAgIC0tLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIGRpc2FibGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0ic2VydmljZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9BZGRDb25uZWN0b3IuZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5jb25uZWN0b3JzLmNyZWF0ZSIvPgorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZUNvbm5lY3Rvci5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUsIlVURi04IiklPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuY29ubmVjdG9ycy5kZWxldGVzIi8+CisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPgorICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9BZGRIb3N0LmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuaG9zdHMuY3JlYXRlIi8+CisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvRGVsZXRlSG9zdC5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUsIlVURi04IikgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmhvc3RzLmRlbGV0ZXMiLz4KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPgorICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgICA8JS0tIGNhbm5vdCBkZWxldGUgb3IgYWRkIGEgUmVhbG0gZm9yIHRoZSBzZXJ2aWNlIHRoZSBhZG1pbiBhcHAgcnVucyBvbiAtLSU+CisgICAgICAgICAgICAgIDxsb2dpYzpub3RFcXVhbCBuYW1lPSJzZXJ2aWNlTmFtZSIgdmFsdWU9JzwlPSBhZG1pblNlcnZpY2VOYW1lICU+Jz4KKyAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBkaXNhYmxlZD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgPCUtLQorICAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvQWRkUmVhbG0uZG8/cGFyZW50PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5yZWFsbXMuY3JlYXRlIi8+CisgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVJlYWxtLmRvP3BhcmVudD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMucmVhbG1zLmRlbGV0ZXMiLz4KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIC0tJT4KKyAgICAgICAgICAgICAgPC9sb2dpYzpub3RFcXVhbD4KKyAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBkaXNhYmxlZD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0FkZFZhbHZlLmRvP3BhcmVudD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMudmFsdmVzLmNyZWF0ZSIvPgorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVZhbHZlLmRvP3BhcmVudD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMudmFsdmVzLmRlbGV0ZXMiLz4KKyAgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICAgPCUtLSBjYW5ub3QgZGVsZXRlIHRoZSBzZXJ2aWNlIHRoZSBhZG1pbiBhcHAgcnVucyBvbiAtLSU+CisgICAgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0ic2VydmljZU5hbWUiIHZhbHVlPSc8JT0gYWRtaW5TZXJ2aWNlTmFtZSAlPic+CisgICAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIGRpc2FibGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9EZWxldGVTZXJ2aWNlLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuc2VydmljZXMuZGVsZXRlIi8+CisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgICAgICAgPC9sb2dpYzpub3RFcXVhbD4KKyAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbnM+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorCisgIDwlLS0gU2VydmljZSBQcm9wZXJ0aWVzIC0tJT4KKworICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+PHRkPjxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydGllcyIvPgorICAgIDwvZGl2PjwvdGQ+PC90cj4KKyAgPC90YWJsZT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIKKyAgICAgICAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKyAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJmYWxzZSIKKyAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0ic2VydmljZU5hbWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5uYW1lIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0ic2VydmljZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ic2VydmljZU5hbWUiIHNpemU9IjUwIiBtYXhsZW5ndGg9IjUwIiBzdHlsZUlkPSJzZXJ2aWNlTmFtZSIvPgorICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0ic2VydmljZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgICAgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ic2VydmljZU5hbWUiLz4KKyAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJzZXJ2aWNlRm9ybSIgcHJvcGVydHk9InNlcnZpY2VOYW1lIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisgICAgICAgIDwvY29udHJvbHM6dGFibGU+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPGJyPgorCisgIDwlLS0gRW5naW5lIFByb3BlcnRpZXMgLS0lPgorCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj48dGQ+PGRpdiBjbGFzcz0idGFibGUtdGl0bGUtdGV4dCI+CisgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5lbmdpbmUucHJvcHMiLz4KKyAgICA8L2Rpdj48L3RkPjwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiCisgICAgICAgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQ+CisgICAgICAgIDxjb250cm9sczp0YWJsZSB0YWJsZVN0eWxlPSJmcm9udC10YWJsZSIgbGluZVN0eWxlPSJsaW5lLXJvdyI+CisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydHkiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UudmFsdWUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0iZmFsc2UiCisgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImVuZ2luZU5hbWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5uYW1lIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0ic2VydmljZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iZW5naW5lTmFtZSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iNTAiIHN0eWxlSWQ9ImVuZ2luZU5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9InNlcnZpY2VGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgICAgICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImVuZ2luZU5hbWUiLz4KKyAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJzZXJ2aWNlRm9ybSIgcHJvcGVydHk9ImVuZ2luZU5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0iZmFsc2UiCisgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9Imhvc3ROYW1lVmFscyI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLmRlZmF1bHRob3N0bmFtZSIvPjoKKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJob3N0TmFtZVZhbHMiIG5hbWU9InNlcnZpY2VGb3JtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Imhvc3ROYW1lVmFscyIvPgorICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImRlZmF1bHRIb3N0IiBzdHlsZUlkPSJob3N0TmFtZVZhbHMiPgorICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iaG9zdE5hbWVWYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorICAgICAgICA8L2NvbnRyb2xzOnRhYmxlPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgIDxicj4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKworPC9odG1sOmZvcm0+Cis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3NlcnZpY2Uvc2VydmljZXMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vc2VydmljZS9zZXJ2aWNlcy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzMjEwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3NlcnZpY2Uvc2VydmljZXMuanNwCkBAIC0wLDAgKzEsMTA1IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iL0RlbGV0ZVNlcnZpY2VzIj4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuc2VydmljZXMuZGVsZXRlIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4gICAgICAgIAorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IlNlcnZpY2UgQWN0aW9ucyI+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKworICA8JS0tIFNlcnZpY2VzIExpc3QgLS0lPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiCisgICAgICAgICB3aWR0aD0iMTAwJSI+CisgICAgPHRyPjx0ZD4KKworICAgICAgPHRhYmxlIGNsYXNzPSJmcm9udC10YWJsZSIgYm9yZGVyPSIxIgorICAgICAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorCisgICAgICAgIDx0ciBjbGFzcz0iaGVhZGVyLXJvdyI+CisgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5kZWxldGUiLz4KKyAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9Imhvc3QubmFtZSIvPgorICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgICAgPGxvZ2ljOml0ZXJhdGUgbmFtZT0ic2VydmljZXNMaXN0IiBpZD0ic2VydmljZSI+CisgICAgICAgICAgPHRyIGNsYXNzPSJsaW5lLXJvdyI+CisgICAgICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4mbmJzcDsKKyAgICAgICAgICAgICA8bG9naWM6bWF0Y2ggbmFtZT0ic2VydmljZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSc8JT0gKFN0cmluZylyZXF1ZXN0LmdldEF0dHJpYnV0ZSgiYWRtaW5BcHBTZXJ2aWNlIikgJT4nPgorICAgICAgICAgICAgIDxmb250IGNvbG9yPSdyZWQnPio8L2ZvbnQ+CisgICAgICAgICAgICAgPC9sb2dpYzptYXRjaD4KKyAgICAgICAgICAgICA8bG9naWM6bm90TWF0Y2ggbmFtZT0ic2VydmljZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSc8JT0gKFN0cmluZylyZXF1ZXN0LmdldEF0dHJpYnV0ZSgiYWRtaW5BcHBTZXJ2aWNlIikgJT4nPgorICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzZXJ2aWNlcyI+PC9sYWJlbD4gICAgICAgICAgCisgICAgICAgICAgICAgIDxodG1sOm11bHRpYm94IHByb3BlcnR5PSJzZXJ2aWNlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IjwlPSBzZXJ2aWNlLnRvU3RyaW5nKCkgJT4iIHN0eWxlSWQ9InNlcnZpY2VzIiBzdHlsZUlkPSJzZXJ2aWNlcyIvPgorICAgICAgICAgICAgICA8L2xvZ2ljOm5vdE1hdGNoPgorICAgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPiZuYnNwOworICAgICAgICAgICAgICA8aHRtbDpsaW5rIHBhZ2U9JzwlPSAiL0VkaXRTZXJ2aWNlLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLm5ldC5VUkxFbmNvZGVyLmVuY29kZShzZXJ2aWNlLnRvU3RyaW5nKCksIlVURi04IikgJT4nPgorICAgICAgICAgICAgICAgIDxjb250cm9sczphdHRyaWJ1dGUgbmFtZT0ic2VydmljZSIgYXR0cmlidXRlPSJuYW1lIi8+CisgICAgICAgICAgICAgIDwvaHRtbDpsaW5rPgorICAgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L2xvZ2ljOml0ZXJhdGU+CisKKyAgICAgIDwvdGFibGU+CisKKyAgICA8L3RkPjwvdHI+CisgIDwvdGFibGU+CisKKzxicj4KKzxmb250IGNvbG9yPSdyZWQnPiAqIDwvZm9udD4KK0Nhbm5vdCBkZWxldGUgdGhlIHNlcnZpY2UgdGhlIGFkbWluIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgb24uCisKKzxicj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisKKyAgPGJyPgorPC9odG1sOmZvcm0+CisKKzxwPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdHJlZS1jb250cm9sLXRlc3QuY3NzIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdHJlZS1jb250cm9sLXRlc3QuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNTQ2NmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi90cmVlLWNvbnRyb2wtdGVzdC5jc3MKQEAgLTAsMCArMSwxOSBAQAorLnRyZWUtY29udHJvbCB7CisgIGZvbnQtZmFtaWx5OiBhcmlhbCwgdmVyZGFuYSwgZ2VuZXZhLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisgIGZvbnQtc2l6ZTogODAlOworICBsaW5lLWhlaWdodDogMS4wOworfQorCisudHJlZS1jb250cm9sLXNlbGVjdGVkIHsKKyAgY29sb3I6IGJsYWNrOworICBmb250LXdlaWdodDogYm9sZDsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisudHJlZS1jb250cm9sLXVuc2VsZWN0ZWQgeworICBjb2xvcjogYmxhY2s7CisgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi90cmVlLWNvbnRyb2wtdGVzdC5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi90cmVlLWNvbnRyb2wtdGVzdC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4N2NhNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3RyZWUtY29udHJvbC10ZXN0LmpzcApAQCAtMCwwICsxLDM0IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorCis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwhLS0gU3RhbmRhcmQgQ29udGVudCAtLT4KKworPCVAIGluY2x1ZGUgZmlsZT0iaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorCis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+CisKKzwhLS0gVHJlZSBDb21wb25lbnQgLS0+CisKKyAgPGNvbnRyb2xzOnRyZWUgdHJlZT0idHJlZUNvbnRyb2xUZXN0IgorICAgICAgICAgICAgICAgYWN0aW9uPSJ0cmVlQ29udHJvbFRlc3QuZG8/dHJlZT17bmFtZX0iCisgICAgICAgICAgICAgICAgc3R5bGU9InRyZWUtY29udHJvbCIKKyAgICAgICAgc3R5bGVTZWxlY3RlZD0idHJlZS1jb250cm9sLXNlbGVjdGVkIgorICAgICAgc3R5bGVVbnNlbGVjdGVkPSJ0cmVlLWNvbnRyb2wtdW5zZWxlY3RlZCIKKyAgLz4KKworPC9ib2R5PgorCis8IS0tIFN0YW5kYXJkIEZvb3RlciAtLT4KKworPCVAIGluY2x1ZGUgZmlsZT0iZm9vdGVyLmpzcCIgJT4KKworPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9kZWxldGVHcm91cHMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvZGVsZXRlR3JvdXBzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzNlZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvZGVsZXRlR3JvdXBzLmpzcApAQCAtMCwwICsxLDUyIEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImhlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIGFjdGlvbj0iL3VzZXJzL2xpc3RHcm91cHMiPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMuZGVsZXRlR3JvdXBzLnRpdGxlIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCB3aWR0aD0iMTklIj4KKyAgICAgICAgPGRpdiBhbGlnbj0icmlnaHQiPgorICAgICAgICAgIDwlQCBpbmNsdWRlIGZpbGU9Imxpc3RHcm91cHMuanNwZiIgJT4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzwvaHRtbDpmb3JtPgorCis8YnI+Cis8YmVhbjpkZWZpbmUgaWQ9ImNoZWNrYm94ZXMiIHNjb3BlPSJwYWdlIiB2YWx1ZT0idHJ1ZSIvPgorPGh0bWw6Zm9ybSBhY3Rpb249Ii91c2Vycy9kZWxldGVHcm91cHMiPgorICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImRhdGFiYXNlTmFtZSIvPgorICA8JUAgaW5jbHVkZSBmaWxlPSJncm91cHMuanNwZiIgJT4KKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+Cis8L2h0bWw6Zm9ybT4KKzxicj4KKworPCVAIGluY2x1ZGUgZmlsZT0iZm9vdGVyLmpzcCIgJT4KKworPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9kZWxldGVSb2xlcy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9kZWxldGVSb2xlcy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcwZGEwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2RlbGV0ZVJvbGVzLmpzcApAQCAtMCwwICsxLDUyIEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImhlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIGFjdGlvbj0iL3VzZXJzL2xpc3RSb2xlcyI+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5kZWxldGVSb2xlcy50aXRsZSIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgd2lkdGg9IjE5JSI+CisgICAgICAgIDxkaXYgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICA8JUAgaW5jbHVkZSBmaWxlPSJsaXN0Um9sZXMuanNwZiIgJT4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzwvaHRtbDpmb3JtPgorCis8YnI+Cis8YmVhbjpkZWZpbmUgaWQ9ImNoZWNrYm94ZXMiIHNjb3BlPSJwYWdlIiB2YWx1ZT0idHJ1ZSIvPgorPGh0bWw6Zm9ybSBhY3Rpb249Ii91c2Vycy9kZWxldGVSb2xlcyI+CisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZGF0YWJhc2VOYW1lIi8+CisgIDwlQCBpbmNsdWRlIGZpbGU9InJvbGVzLmpzcGYiICU+CisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorPC9odG1sOmZvcm0+Cis8YnI+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImZvb3Rlci5qc3AiICU+CisKKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvZGVsZXRlVXNlcnMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvZGVsZXRlVXNlcnMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMTEwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9kZWxldGVVc2Vycy5qc3AKQEAgLTAsMCArMSw1MiBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSJoZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBhY3Rpb249Ii91c2Vycy9saXN0VXNlcnMiPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMuZGVsZXRlVXNlcnMudGl0bGUiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIHdpZHRoPSIxOSUiPgorICAgICAgICA8ZGl2IGFsaWduPSJyaWdodCI+CisgICAgICAgICAgPCVAIGluY2x1ZGUgZmlsZT0ibGlzdFVzZXJzLmpzcGYiICU+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8L2h0bWw6Zm9ybT4KKworPGJyPgorPGJlYW46ZGVmaW5lIGlkPSJjaGVja2JveGVzIiBzY29wZT0icGFnZSIgdmFsdWU9InRydWUiLz4KKzxodG1sOmZvcm0gYWN0aW9uPSIvdXNlcnMvZGVsZXRlVXNlcnMiPgorICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImRhdGFiYXNlTmFtZSIvPgorICA8JUAgaW5jbHVkZSBmaWxlPSJ1c2Vycy5qc3BmIiAlPgorICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKzwvaHRtbDpmb3JtPgorPGJyPgorCis8JUAgaW5jbHVkZSBmaWxlPSJmb290ZXIuanNwIiAlPgorCis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2Zvb3Rlci5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9mb290ZXIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9mb290ZXIuanNwCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9ncm91cC5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9ncm91cC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU0YTU4OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2dyb3VwLmpzcApAQCAtMCwwICsxLDEyNCBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKworPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImhlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIvdXNlcnMvc2F2ZUdyb3VwIj4gPCEtLWZvY3VzPSJncm91cG5hbWUiLS0+CisKKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkYXRhYmFzZU5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGNsYXNzPSJwYWdlLXRpdGxlLXJvdyI+CisgICAgICA8dGQgYWxpZ249ImxlZnQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJncm91cEZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJHcm91cCBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8IS0tIHdpbGwgYWRkIHRoZSB1cmxzIGxhdGVyIG9uY2UgdGhvc2Ugc2NyZWVucyBnZXQgaW1wbGVtZW50ZWQgLS0+Cis8JS0tCisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0iIj4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmFjdGlvbnMuZ3JvdXAuY3JlYXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSIiPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMuYWN0aW9ucy5ncm91cC5kZWxldGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorLS0lPgorICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+Cis8YnI+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIKKyAgICAgICAgIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQ+CisKKyAgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIgorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmdyb3VwLnByb3BlcnRpZXMiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgJm5ic3A7CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iZ3JvdXBuYW1lIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLnByb21wdC5ncm91cG5hbWUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iZ3JvdXBGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSI+CisgICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iZ3JvdXBGb3JtIiBwcm9wZXJ0eT0iZ3JvdXBuYW1lIi8+CisgICAgICAgICAgICAgICAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJncm91cG5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgICAgICAgICA8bG9naWM6bm90UHJlc2VudCBuYW1lPSJncm91cEZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIj4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJncm91cG5hbWUiIHNpemU9IjI0IiBtYXhsZW5ndGg9IjMyIiBzdHlsZUlkPSJncm91cG5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpub3RQcmVzZW50PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImRlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLnByb21wdC5kZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJkZXNjcmlwdGlvbiIgc2l6ZT0iMjQiIG1heGxlbmd0aD0iMTI4IiBzdHlsZUlkPSJkZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDwvY29udHJvbHM6dGFibGU+CisKKyAgICAgIDwvdGQ+CisKKyAgICA8L3RyPgorCisgIDwvdGFibGU+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJjaGVja2JveGVzIiBzY29wZT0icGFnZSIgdmFsdWU9InRydWUiLz4KKyAgPGJyPgorICA8JUAgaW5jbHVkZSBmaWxlPSJyb2xlcy5qc3BmIiAlPgorCisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorCis8L2h0bWw6Zm9ybT4KKworPCEtLSBTdGFuZGFyZCBGb290ZXIgLS0+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImZvb3Rlci5qc3AiICU+CisKKzwvYm9keT4KKworPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9ncm91cHMuanNwZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2dyb3Vwcy5qc3BmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMmNkNGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9ncm91cHMuanNwZgpAQCAtMCwwICsxLDU0IEBACis8JS0tIEdyb3VwcyBMaXN0IC0tJT4KKworPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIKKyAgICAgICB3aWR0aD0iMTAwJSI+PHRyPjx0ZD4gCisKKyAgPHRhYmxlIGNsYXNzPSJmcm9udC10YWJsZSIgYm9yZGVyPSIxIgorICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyIGNsYXNzPSJoZWFkZXItcm93Ij4KKyAgICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9ImNoZWNrYm94ZXMiPgorICAgICAgICA8dGggc2NvcGU9ImNvbCIgd2lkdGg9IjUlIj48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICZuYnNwOworICAgICAgICA8L3RoPgorICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgPHRoIHNjb3BlPSJjb2wiIHdpZHRoPSIyMCUiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5saXN0Lmdyb3VwbmFtZSIvPgorICAgICAgPC9kaXY+PC90aD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMubGlzdC5kZXNjcmlwdGlvbiIvPgorICAgICAgPC9kaXY+PC90aD4KKyAgICA8L3RyPgorICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9Imdyb3Vwc0Zvcm0iPgorICAgIDxsb2dpYzppdGVyYXRlIG5hbWU9Imdyb3Vwc0Zvcm0iIHByb3BlcnR5PSJncm91cHMiCisgICAgICAgICAgICAgICAgICAgICBpZD0iZ3JvdXAiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHRyIGNsYXNzPSJsaW5lLXJvdyI+CisgICAgICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9ImNoZWNrYm94ZXMiPgorICAgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJjZW50ZXIiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+CisgICAgICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJ1c2VyRm9ybSI+CisgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZ3JvdXBzIj48L2xhYmVsPgorICAgICAgICAgICAgICA8aHRtbDptdWx0aWJveCBwcm9wZXJ0eT0iZ3JvdXBzIiB2YWx1ZT0nPCU9IGdyb3VwICU+JyBzdHlsZUlkPSJncm91cHMiLz4KKyAgICAgICAgICAgIDwvbG9naWM6cHJlc2VudD4KKyAgICAgICAgICAgIDxsb2dpYzpub3RQcmVzZW50IG5hbWU9InVzZXJGb3JtIj4KKyAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZ3JvdXBzIj48L2xhYmVsPgorICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Imdyb3VwcyIKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9JzwlPSBncm91cCAlPicgc3R5bGVJZD0iZ3JvdXBzIj4KKyAgICAgICAgICAgIDwvbG9naWM6bm90UHJlc2VudD4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPiZuYnNwOworICAgICAgICAgIDxodG1sOmxpbmsgcGFnZT0nPCU9ICIvdXNlcnMvc2V0VXBHcm91cC5kbz9vYmplY3ROYW1lPSIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShncm91cCwiVVRGLTgiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZkYXRhYmFzZU5hbWU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGFiYXNlTmFtZSIpLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgIDxjb250cm9sczphdHRyaWJ1dGUgbmFtZT0iZ3JvdXAiIGF0dHJpYnV0ZT0iZ3JvdXBuYW1lIi8+CisgICAgICAgICAgPC9odG1sOmxpbms+CisgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPiZuYnNwOworICAgICAgICAgIDxjb250cm9sczphdHRyaWJ1dGUgbmFtZT0iZ3JvdXAiIGF0dHJpYnV0ZT0iZGVzY3JpcHRpb24iLz4KKyAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC9sb2dpYzppdGVyYXRlPgorICAgIDwvbG9naWM6cHJlc2VudD4KKyAgPC90YWJsZT4KKworPC90ZD48L3RyPjwvdGFibGU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9oZWFkZXIuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvaGVhZGVyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzU5OGQxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvaGVhZGVyLmpzcApAQCAtMCwwICsxLDExIEBACis8IS0tCisgIENvcHlyaWdodCAoYykgMTk5OS0yMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAgcmVzZXJ2ZWQuCistLT4KKworPGhlYWQ+CisgIDx0aXRsZT48YmVhbjptZXNzYWdlIGtleT0iYXBwbGljYXRpb24udGl0bGUiLz48L3RpdGxlPgorICA8aHRtbDpiYXNlLz4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vdHJlZS1jb250cm9sLXRlc3QuY3NzIj4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vYWRtaW4uY3NzIj4KKzwvaGVhZD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2xpc3RHcm91cHMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvbGlzdEdyb3Vwcy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1M2MzZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2xpc3RHcm91cHMuanNwCkBAIC0wLDAgKzEsNDMgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gYWN0aW9uPSIvdXNlcnMvbGlzdEdyb3VwcyI+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5saXN0R3JvdXBzLnRpdGxlIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCB3aWR0aD0iMTklIj4KKyAgICAgICAgPGRpdiBhbGlnbj0icmlnaHQiPgorICAgICAgICAgIDwlQCBpbmNsdWRlIGZpbGU9Imxpc3RHcm91cHMuanNwZiIgJT4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzwvaHRtbDpmb3JtPgorCis8YnI+Cis8JUAgaW5jbHVkZSBmaWxlPSJncm91cHMuanNwZiIgJT4KKzxicj4KKworPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9saXN0R3JvdXBzLmpzcGYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9saXN0R3JvdXBzLmpzcGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjMDI1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2xpc3RHcm91cHMuanNwZgpAQCAtMCwwICsxLDMyIEBACis8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+Cis8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9Ikdyb3VwIEFjdGlvbnMiPgorCisgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgPC9jb250cm9sczphY3Rpb24+CisKKyAgPGNvbnRyb2xzOmFjdGlvbj4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgPC9jb250cm9sczphY3Rpb24+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3VzZXJzL3NldFVwR3JvdXAuZG8/ZGF0YWJhc2VOYW1lPSIgKworICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSwiVVRGLTgiKSAlPic+CisgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmFjdGlvbnMuZ3JvdXAuY3JlYXRlIi8+CisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi91c2Vycy9saXN0R3JvdXBzLmRvP2RhdGFiYXNlTmFtZT0iICsKKyAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZGF0YWJhc2VOYW1lIiksIlVURi04IikgKworICAgICAgICImZm9yd2FyZD0iICsgVVJMRW5jb2Rlci5lbmNvZGUoIkdyb3VwcyBEZWxldGUgTGlzdCIsIlVURi04IikgJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5hY3Rpb25zLmdyb3VwLmRlbGV0ZSIvPgorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvdXNlcnMvbGlzdEdyb3Vwcy5kbz9kYXRhYmFzZU5hbWU9IiArCisgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGFiYXNlTmFtZSIpLCJVVEYtOCIpICsKKyAgICAgICAiJmZvcndhcmQ9IiArIFVSTEVuY29kZXIuZW5jb2RlKCJHcm91cHMgTGlzdCIsIlVURi04IikgJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5hY3Rpb25zLmdyb3VwLmxpc3QiLz4KKyAgPC9jb250cm9sczphY3Rpb24+CisKKzwvY29udHJvbHM6YWN0aW9ucz4KKzwvZGl2PgorPC90ZD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2xpc3RSb2xlcy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9saXN0Um9sZXMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNjBiZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9saXN0Um9sZXMuanNwCkBAIC0wLDAgKzEsNDMgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gYWN0aW9uPSIvdXNlcnMvbGlzdFJvbGVzIj4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmxpc3RSb2xlcy50aXRsZSIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgd2lkdGg9IjE5JSI+CisgICAgICAgIDxkaXYgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICA8JUAgaW5jbHVkZSBmaWxlPSJsaXN0Um9sZXMuanNwZiIgJT4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzwvaHRtbDpmb3JtPgorCis8YnI+Cis8JUAgaW5jbHVkZSBmaWxlPSJyb2xlcy5qc3BmIiAlPgorPGJyPgorCis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2xpc3RSb2xlcy5qc3BmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvbGlzdFJvbGVzLmpzcGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzMmFkYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2xpc3RSb2xlcy5qc3BmCkBAIC0wLDAgKzEsMzIgQEAKKzx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKzxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+Cis8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iUm9sZSBBY3Rpb25zIj4KKworICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4KKyAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24+CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi91c2Vycy9zZXRVcFJvbGUuZG8/ZGF0YWJhc2VOYW1lPSIgKworICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSwiVVRGLTgiKSAlPic+CisgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmFjdGlvbnMucm9sZS5jcmVhdGUiLz4KKyAgPC9jb250cm9sczphY3Rpb24+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3VzZXJzL2xpc3RSb2xlcy5kbz9kYXRhYmFzZU5hbWU9IiArCisgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGFiYXNlTmFtZSIpLCJVVEYtOCIpICsKKyAgICAgICAiJmZvcndhcmQ9IiArIFVSTEVuY29kZXIuZW5jb2RlKCJSb2xlcyBEZWxldGUgTGlzdCIsIlVURi04IikgJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5hY3Rpb25zLnJvbGUuZGVsZXRlIi8+CisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi91c2Vycy9saXN0Um9sZXMuZG8/ZGF0YWJhc2VOYW1lPSIgKworICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSwiVVRGLTgiKSArCisgICAgICAgIiZmb3J3YXJkPSIgKyBVUkxFbmNvZGVyLmVuY29kZSgiUm9sZXMgTGlzdCIsIlVURi04IikgJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5hY3Rpb25zLnJvbGUubGlzdCIvPgorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworPC9jb250cm9sczphY3Rpb25zPgorPC9kaXY+Cis8L3RkPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvbGlzdFVzZXJzLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2xpc3RVc2Vycy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4ZjBkNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2xpc3RVc2Vycy5qc3AKQEAgLTAsMCArMSw0MyBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSJoZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBhY3Rpb249Ii91c2Vycy9saXN0VXNlcnMiPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMubGlzdFVzZXJzLnRpdGxlIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCB3aWR0aD0iMTklIj4KKyAgICAgICAgPGRpdiBhbGlnbj0icmlnaHQiPgorICAgICAgICAgIDwlQCBpbmNsdWRlIGZpbGU9Imxpc3RVc2Vycy5qc3BmIiAlPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworPC9odG1sOmZvcm0+CisKKzxicj4KKzwlQCBpbmNsdWRlIGZpbGU9InVzZXJzLmpzcGYiICU+Cis8YnI+CisKKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvbGlzdFVzZXJzLmpzcGYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9saXN0VXNlcnMuanNwZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTk4Yzc5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvbGlzdFVzZXJzLmpzcGYKQEAgLTAsMCArMSwzMiBAQAorPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKzxjb250cm9sczphY3Rpb25zIGxhYmVsPSJVc2VyIEFjdGlvbnMiPgorCisgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgPC9jb250cm9sczphY3Rpb24+CisKKyAgPGNvbnRyb2xzOmFjdGlvbj4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgPC9jb250cm9sczphY3Rpb24+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3VzZXJzL3NldFVwVXNlci5kbz9kYXRhYmFzZU5hbWU9IiArCisgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGFiYXNlTmFtZSIpLCJVVEYtOCIpICU+Jz4KKyAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMuYWN0aW9ucy51c2VyLmNyZWF0ZSIvPgorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvdXNlcnMvbGlzdFVzZXJzLmRvP2RhdGFiYXNlTmFtZT0iICsKKyAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZGF0YWJhc2VOYW1lIiksIlVURi04IikgKworICAgICAgICImZm9yd2FyZD0iICsgVVJMRW5jb2Rlci5lbmNvZGUoIlVzZXJzIERlbGV0ZSBMaXN0IiwiVVRGLTgiKSAlPic+CisgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmFjdGlvbnMudXNlci5kZWxldGUiLz4KKyAgPC9jb250cm9sczphY3Rpb24+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3VzZXJzL2xpc3RVc2Vycy5kbz9kYXRhYmFzZU5hbWU9IiArCisgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGFiYXNlTmFtZSIpLCJVVEYtOCIpICsKKyAgICAgICAiJmZvcndhcmQ9IiArIFVSTEVuY29kZXIuZW5jb2RlKCJVc2VycyBMaXN0IiwiVVRGLTgiKSAlPic+CisgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmFjdGlvbnMudXNlci5saXN0Ii8+CisgIDwvY29udHJvbHM6YWN0aW9uPgorCis8L2NvbnRyb2xzOmFjdGlvbnM+Cis8L2Rpdj4KKzwvdGQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9yb2xlLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL3JvbGUuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMGRiMTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9yb2xlLmpzcApAQCAtMCwwICsxLDEyMCBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKworPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWJlYW4iIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1odG1sIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImhlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIvdXNlcnMvc2F2ZVJvbGUiPiA8IS0tZm9jdXM9InJvbGVuYW1lIi0tPgorCisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZGF0YWJhc2VOYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBjbGFzcz0icGFnZS10aXRsZS1yb3ciPgorICAgICAgPHRkIGFsaWduPSJsZWZ0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0icm9sZUZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJSb2xlIEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+CisgICAgICAgICAgICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDwhLS0gd2lsbCBhZGQgdGhlIHVybHMgbGF0ZXIgb25jZSB0aG9zZSBzY3JlZW5zIGdldCBpbXBsZW1lbnRlZCAtLT4KKzwlLS0KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSIiPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMuYWN0aW9ucy5yb2xlLmNyZWF0ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0iIj4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmFjdGlvbnMucm9sZS5kZWxldGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorLS0lPgorICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+Cis8YnI+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIKKyAgICAgICAgIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQ+CisKKyAgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIgorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLnJvbGUucHJvcGVydGllcyIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAmbmJzcDsKKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJyb2xlbmFtZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5wcm9tcHQucm9sZW5hbWUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0icm9sZUZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIj4KKyAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJyb2xlRm9ybSIgcHJvcGVydHk9InJvbGVuYW1lIi8+CisgICAgICAgICAgICAgICAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJyb2xlbmFtZSIvPgorICAgICAgICAgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICAgICAgICAgIDxsb2dpYzpub3RQcmVzZW50IG5hbWU9InJvbGVGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSI+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0icm9sZW5hbWUiIHNpemU9IjI0IiBtYXhsZW5ndGg9IjMyIiBzdHlsZUlkPSJyb2xlbmFtZSIvPgorICAgICAgICAgICAgICA8L2xvZ2ljOm5vdFByZXNlbnQ+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iZGVzY3JpcHRpb24iPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMucHJvbXB0LmRlc2NyaXB0aW9uIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJkZXNjcmlwdGlvbiIgc2l6ZT0iMjQiIG1heGxlbmd0aD0iMTI4IiBzdHlsZUlkPSJkZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDwvY29udHJvbHM6dGFibGU+CisKKyAgICAgIDwvdGQ+CisKKyAgICA8L3RyPgorCisgIDwvdGFibGU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisKKzwvaHRtbDpmb3JtPgorCis8IS0tIFN0YW5kYXJkIEZvb3RlciAtLT4KKworPCVAIGluY2x1ZGUgZmlsZT0iZm9vdGVyLmpzcCIgJT4KKworPC9ib2R5PgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL3JvbGVzLmpzcGYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9yb2xlcy5qc3BmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNWViODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9yb2xlcy5qc3BmCkBAIC0wLDAgKzEsNjAgQEAKKzwlLS0gUm9sZXMgTGlzdCAtLSU+CisKKzx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiCisgICAgICAgd2lkdGg9IjEwMCUiPjx0cj48dGQ+IAorCisgIDx0YWJsZSBjbGFzcz0iZnJvbnQtdGFibGUiIGJvcmRlcj0iMSIKKyAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0ciBjbGFzcz0iaGVhZGVyLXJvdyI+CisgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJjaGVja2JveGVzIj4KKyAgICAgICAgPHRkIHdpZHRoPSI1JSI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAmbmJzcDsKKyAgICAgICAgPC90ZD4KKyAgICAgIDwvbG9naWM6cHJlc2VudD4KKyAgICAgIDx0aCBzY29wZT0iY29sIiB3aWR0aD0iMjAlIj48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMubGlzdC5yb2xlbmFtZSIvPgorICAgICAgPC9kaXY+PC90aD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMubGlzdC5kZXNjcmlwdGlvbiIvPgorICAgICAgPC9kaXY+PC90aD4KKyAgICA8L3RyPgorICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9InJvbGVzRm9ybSI+CisgICAgPGxvZ2ljOml0ZXJhdGUgbmFtZT0icm9sZXNGb3JtIiBwcm9wZXJ0eT0icm9sZXMiCisgICAgICAgICAgICAgICAgICAgICBpZD0icm9sZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8dHIgY2xhc3M9ImxpbmUtcm93Ij4KKyAgICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iY2hlY2tib3hlcyI+CisgICAgICAgICAgPHRkIHNjb3BlPSJyb3ciPjxkaXYgYWxpZ249ImNlbnRlciIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4KKyAgICAgICAgICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9Imdyb3VwRm9ybSI+CisgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InJvbGVzIj48L2xhYmVsPgorICAgICAgICAgICAgICA8aHRtbDptdWx0aWJveCBwcm9wZXJ0eT0icm9sZXMiIHZhbHVlPSI8JT0gcm9sZSAlPiIgc3R5bGVJZD0icm9sZXMiLz4KKyAgICAgICAgICAgIDwvbG9naWM6cHJlc2VudD4KKyAgICAgICAgICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9InVzZXJGb3JtIj4KKyAgICAgICAgICAgICAgPGxhYmVsIGZvcj0icm9sZXMiPjwvbGFiZWw+CisgICAgICAgICAgICAgIDxodG1sOm11bHRpYm94IHByb3BlcnR5PSJyb2xlcyIgdmFsdWU9IjwlPSByb2xlICU+IiBzdHlsZUlkPSJyb2xlcyIvPgorICAgICAgICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgICAgICAgPGxvZ2ljOm5vdFByZXNlbnQgbmFtZT0iZ3JvdXBGb3JtIj4KKyAgICAgICAgICAgICAgPGxvZ2ljOm5vdFByZXNlbnQgbmFtZT0idXNlckZvcm0iPgorICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InJvbGVzIj48L2xhYmVsPgorICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icm9sZXMiCisgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IjwlPSByb2xlICU+IiBzdHlsZUlkPSJyb2xlcyI+CisgICAgICAgICAgICAgIDwvbG9naWM6bm90UHJlc2VudD4KKyAgICAgICAgICAgIDwvbG9naWM6bm90UHJlc2VudD4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPiZuYnNwOworICAgICAgICAgIDxodG1sOmxpbmsgcGFnZT0nPCU9ICIvdXNlcnMvc2V0VXBSb2xlLmRvP29iamVjdE5hbWU9IiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJvbGUsIlVURi04IikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImZGF0YWJhc2VOYW1lPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICA8Y29udHJvbHM6YXR0cmlidXRlIG5hbWU9InJvbGUiIGF0dHJpYnV0ZT0icm9sZW5hbWUiLz4KKyAgICAgICAgICA8L2h0bWw6bGluaz4KKyAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgPHRkIHNjb3BlPSJyb3ciPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJyb2xlIiBhdHRyaWJ1dGU9ImRlc2NyaXB0aW9uIi8+CisgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvbG9naWM6aXRlcmF0ZT4KKyAgICA8L2xvZ2ljOnByZXNlbnQ+CisgIDwvdGFibGU+CisKKzwvdGQ+PC90cj48L3RhYmxlPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvdXNlci5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy91c2VyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTFmN2NlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvdXNlci5qc3AKQEAgLTAsMCArMSwxMzcgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+CisKKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWxvZ2ljIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSJoZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL3VzZXJzL3NhdmVVc2VyIj4gPCEtLWZvY3VzPSJ1c2VybmFtZSItLT4KKworICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImRhdGFiYXNlTmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgY2xhc3M9InBhZ2UtdGl0bGUtcm93Ij4KKyAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InVzZXJGb3JtIiBwcm9wZXJ0eT0ibm9kZUxhYmVsIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iVXNlciBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvdXNlcnMvc2V0VXBVc2VyLmRvP2RhdGFiYXNlTmFtZT0iICsKKyAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmFjdGlvbnMudXNlci5jcmVhdGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorCisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvdXNlcnMvbGlzdFVzZXJzLmRvP2RhdGFiYXNlTmFtZT0iICsKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZGF0YWJhc2VOYW1lIiksIlVURi04IikgKworICAgICAgICAgICAgICAgICImZm9yd2FyZD0iICsgVVJMRW5jb2Rlci5lbmNvZGUoIlVzZXJzIERlbGV0ZSBMaXN0IiwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmFjdGlvbnMudXNlci5kZWxldGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKzxicj4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIgorICAgICAgICAgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKworICAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMudXNlci5wcm9wZXJ0aWVzIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICZuYnNwOworICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InVzZXJuYW1lIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLnByb21wdC51c2VybmFtZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJ1c2VyRm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiPgorICAgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InVzZXJGb3JtIiBwcm9wZXJ0eT0idXNlcm5hbWUiLz4KKyAgICAgICAgICAgICAgICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InVzZXJuYW1lIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6cHJlc2VudD4KKyAgICAgICAgICAgICAgPGxvZ2ljOm5vdFByZXNlbnQgbmFtZT0idXNlckZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIj4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ1c2VybmFtZSIgc2l6ZT0iMjQiIHN0eWxlSWQ9InVzZXJuYW1lIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6bm90UHJlc2VudD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJwYXNzd29yZCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5wcm9tcHQucGFzc3dvcmQiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGh0bWw6cGFzc3dvcmQgcHJvcGVydHk9InBhc3N3b3JkIiBzaXplPSIyNCIgc3R5bGVJZD0icGFzc3dvcmQiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJmdWxsbmFtZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5wcm9tcHQuZnVsbE5hbWUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iZnVsbE5hbWUiIHNpemU9IjI0IiBtYXhsZW5ndGg9IjY0IiBzdHlsZUlkPSJmdWxsbmFtZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDwvY29udHJvbHM6dGFibGU+CisKKyAgICAgIDwvdGQ+CisKKyAgICA8L3RyPgorCisgIDwvdGFibGU+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJjaGVja2JveGVzIiBzY29wZT0icGFnZSIgdmFsdWU9InRydWUiLz4KKyAgPGJyPgorICA8JUAgaW5jbHVkZSBmaWxlPSJncm91cHMuanNwZiIgJT4KKyAgPGJyPgorICA8JUAgaW5jbHVkZSBmaWxlPSJyb2xlcy5qc3BmIiAlPgorCisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorCis8L2h0bWw6Zm9ybT4KKworPCEtLSBTdGFuZGFyZCBGb290ZXIgLS0+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImZvb3Rlci5qc3AiICU+CisKKzwvYm9keT4KKworPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy91c2Vycy5qc3BmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvdXNlcnMuanNwZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzU1ZWJiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvdXNlcnMuanNwZgpAQCAtMCwwICsxLDQ2IEBACis8JS0tIFVzZXJzIExpc3QgLS0lPgorCis8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIgorICAgICAgIHdpZHRoPSIxMDAlIj48dHI+PHRkPiAKKworICA8dGFibGUgY2xhc3M9ImZyb250LXRhYmxlIiBib3JkZXI9IjEiCisgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHIgY2xhc3M9ImhlYWRlci1yb3ciPgorICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iY2hlY2tib3hlcyI+CisgICAgICAgIDx0ZCB3aWR0aD0iNSUiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgJm5ic3A7CisgICAgICAgIDwvdGQ+CisgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICA8dGggc2NvcGU9ImNvbCIgd2lkdGg9IjIwJSI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmxpc3QudXNlcm5hbWUiLz4KKyAgICAgIDwvZGl2PjwvdGg+CisgICAgICA8dGggc2NvcGU9ImNvbCI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmxpc3QuZnVsbE5hbWUiLz4KKyAgICAgIDwvZGl2PjwvdGg+CisgICAgPC90cj4KKyAgICA8bG9naWM6aXRlcmF0ZSBuYW1lPSJ1c2Vyc0Zvcm0iIHByb3BlcnR5PSJ1c2VycyIKKyAgICAgICAgICAgICAgICAgICAgIGlkPSJ1c2VyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDx0ciBjbGFzcz0ibGluZS1yb3ciPgorICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJjaGVja2JveGVzIj4KKyAgICAgICAgICA8dGQgc2NvcGU9InJvdyI+PGRpdiBhbGlnbj0iY2VudGVyIiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPgorICAgICAgICAgICAgPGxhYmVsIGZvcj0idXNlcnMiPjwvbGFiZWw+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InVzZXJzIgorICAgICAgICAgICAgICAgICAgdmFsdWU9JzwlPSB1c2VyICU+JyBzdHlsZUlkPSJ1c2VycyI+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgICA8dGQgc2NvcGU9InJvdyI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4mbmJzcDsKKyAgICAgICAgICA8aHRtbDpsaW5rIHBhZ2U9JzwlPSAiL3VzZXJzL3NldFVwVXNlci5kbz9vYmplY3ROYW1lPSIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh1c2VyLCJVVEYtOCIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJmRhdGFiYXNlTmFtZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZGF0YWJhc2VOYW1lIiksIlVURi04IikgJT4nPgorICAgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJ1c2VyIiBhdHRyaWJ1dGU9InVzZXJuYW1lIi8+CisgICAgICAgICAgPC9odG1sOmxpbms+CisgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPiZuYnNwOworICAgICAgICAgIDxjb250cm9sczphdHRyaWJ1dGUgbmFtZT0idXNlciIgYXR0cmlidXRlPSJmdWxsTmFtZSIvPgorICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgPC90cj4KKyAgICA8L2xvZ2ljOml0ZXJhdGU+CisgIDwvdGFibGU+CisKKzwvdGQ+PC90cj48L3RhYmxlPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdmFsdmUvYWNjZXNzTG9nVmFsdmUuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdmFsdmUvYWNjZXNzTG9nVmFsdmUuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZWQ5MjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi92YWx2ZS9hY2Nlc3NMb2dWYWx2ZS5qc3AKQEAgLTAsMCArMSwxNTMgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtbG9naWMiIHByZWZpeD0ibG9naWMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9TYXZlQWNjZXNzTG9nVmFsdmUiPgorCisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJhY2Nlc3NMb2dWYWx2ZUZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxiZWFuOmRlZmluZSBpZD0idGhpc1BhcmVudE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJhY2Nlc3NMb2dWYWx2ZUZvcm0iIHByb3BlcnR5PSJwYXJlbnRPYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXJlbnRPYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InZhbHZlVHlwZSIvPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImFjY2Vzc0xvZ1ZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnZhbHZlcy5jcmVhdGUiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJhY2Nlc3NMb2dWYWx2ZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iYWNjZXNzTG9nVmFsdmVGb3JtIiBwcm9wZXJ0eT0ibm9kZUxhYmVsIi8+CisgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iVmFsdmUgQWN0aW9ucyI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4gLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxsb2dpYzpub3RFcXVhbCBuYW1lPSJhY2Nlc3NMb2dWYWx2ZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVZhbHZlLmRvPyIgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3Q9IiArIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lLCJVVEYtOCIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImcGFyZW50PSIrIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNQYXJlbnROYW1lLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy52YWx2ZXMuZGVsZXRlIi8+CisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKworIDwlLS0gQWNjZXNzIExvZyBQcm9wZXJ0aWVzIC0tJT4KKyA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+IDx0ZD4gPGRpdiBjbGFzcz0idGFibGUtdGl0bGUtdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ2YWx2ZS5hY2Nlc3MucHJvcGVydGllcyIvPgorICAgIDwvZGl2PiA8L3RkPiA8L3RyPgorICA8L3RhYmxlPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQ+CisgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIgorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPjwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idHlwZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci50eXBlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImFjY2Vzc0xvZ1ZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJ2YWx2ZVR5cGUiIG9uY2hhbmdlPSJJQV9qdW1wTWVudSgnc2VsZicsdGhpcykiIHN0eWxlSWQ9InR5cGUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJ2YWx2ZVR5cGVWYWxzIiBuYW1lPSJhY2Nlc3NMb2dWYWx2ZUZvcm0iIHByb3BlcnR5PSJ2YWx2ZVR5cGVWYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249InZhbHZlVHlwZVZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJhY2Nlc3NMb2dWYWx2ZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iYWNjZXNzTG9nVmFsdmVGb3JtIiBwcm9wZXJ0eT0idmFsdmVUeXBlIiBzY29wZT0ic2Vzc2lvbiIvPgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iZGlyZWN0b3J5Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0ibG9nZ2VyLmRpcmVjdG9yeSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImRpcmVjdG9yeSIgc2l6ZT0iMzAiIHN0eWxlSWQ9ImRpcmVjdG9yeSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InBhdHRlcm4iPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJ2YWx2ZS5wYXR0ZXJuIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0YXJlYSBwcm9wZXJ0eT0icGF0dGVybiIgY29scz0iMzAiIHJvd3M9IjIiIHN0eWxlSWQ9InBhdHRlcm4iLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJwcmVmaXgiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJsb2dnZXIucHJlZml4Ii8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJwcmVmaXgiIHNpemU9IjMwIiBzdHlsZUlkPSJwcmVmaXgiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJyZXNvbHZlSG9zdHMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJ2YWx2ZS5yZXNvbHZlSG9zdHMiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0icmVzb2x2ZUhvc3RzIiBzdHlsZUlkPSJyZXNvbHZlSG9zdHMiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJib29sZWFuVmFscyIgbmFtZT0iYWNjZXNzTG9nVmFsdmVGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icm90YXRhYmxlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0idmFsdmUucm90YXRhYmxlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InJvdGF0YWJsZSIgc3R5bGVJZD0icm90YXRhYmxlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9ImFjY2Vzc0xvZ1ZhbHZlRm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgICAgICAgCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0ic3VmZml4Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0ibG9nZ2VyLnN1ZmZpeCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ic3VmZml4IiBzaXplPSIzMCIgc3R5bGVJZD0ic3VmZml4Ii8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8L2NvbnRyb2xzOnRhYmxlPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisgIDwvaHRtbDpmb3JtPgorPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi92YWx2ZS9yZW1vdGVBZGRyVmFsdmUuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdmFsdmUvcmVtb3RlQWRkclZhbHZlLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmFlNWQzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdmFsdmUvcmVtb3RlQWRkclZhbHZlLmpzcApAQCAtMCwwICsxLDExNyBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL1NhdmVSZW1vdGVBZGRyVmFsdmUiPgorCisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJyZW1vdGVBZGRyVmFsdmVGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8YmVhbjpkZWZpbmUgaWQ9InRoaXNQYXJlbnROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0icmVtb3RlQWRkclZhbHZlRm9ybSIgcHJvcGVydHk9InBhcmVudE9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhcmVudE9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0idmFsdmVUeXBlIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0icmVtb3RlQWRkclZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnZhbHZlcy5jcmVhdGUiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJyZW1vdGVBZGRyVmFsdmVGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InJlbW90ZUFkZHJWYWx2ZUZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJWYWx2ZSBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPiAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9InJlbW90ZUFkZHJWYWx2ZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVZhbHZlLmRvPyIgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3Q9IiArIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lLCJVVEYtOCIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImcGFyZW50PSIrIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNQYXJlbnROYW1lLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy52YWx2ZXMuZGVsZXRlIi8+CisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKworIDwlLS0gUmVtb3RlIEFkZHIgVmFsdmUgUHJvcGVydGllcyAtLSU+CisgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPiA8dGQ+IDxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idmFsdmUucmVtb3RlYWRkcmVzcy5wcm9wZXJ0aWVzIi8+CisgICAgPC9kaXY+IDwvdGQ+IDwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnByb3BlcnR5Ii8+PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ0eXBlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnR5cGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0icmVtb3RlQWRkclZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJ2YWx2ZVR5cGUiIG9uY2hhbmdlPSJJQV9qdW1wTWVudSgnc2VsZicsdGhpcykiIHN0eWxlSWQ9InR5cGUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJ2YWx2ZVR5cGVWYWxzIiBuYW1lPSJyZW1vdGVBZGRyVmFsdmVGb3JtIiBwcm9wZXJ0eT0idmFsdmVUeXBlVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJ2YWx2ZVR5cGVWYWxzIiBwcm9wZXJ0eT0idmFsdWUiIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0icmVtb3RlQWRkclZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJyZW1vdGVBZGRyVmFsdmVGb3JtIiBwcm9wZXJ0eT0idmFsdmVUeXBlIiBzY29wZT0ic2Vzc2lvbiIvPgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iYWxsb3dJUHMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJ2YWx2ZS5hbGxvd0lQcyIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dGFyZWEgcHJvcGVydHk9ImFsbG93IiBjb2xzPSIzMCIgcm93cz0iMyIgc3R5bGVJZD0iYWxsb3dJUHMiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJkZW55SVBzIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0idmFsdmUuZGVueUlQcyIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dGFyZWEgcHJvcGVydHk9ImRlbnkiIGNvbHM9IjMwIiByb3dzPSIzIiBzdHlsZUlkPSJkZW55SVBzIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8L2NvbnRyb2xzOnRhYmxlPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisgIDwvaHRtbDpmb3JtPgorPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi92YWx2ZS9yZW1vdGVIb3N0VmFsdmUuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdmFsdmUvcmVtb3RlSG9zdFZhbHZlLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWI4YmZmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdmFsdmUvcmVtb3RlSG9zdFZhbHZlLmpzcApAQCAtMCwwICsxLDExNyBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL1NhdmVSZW1vdGVIb3N0VmFsdmUiPgorCisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJyZW1vdGVIb3N0VmFsdmVGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8YmVhbjpkZWZpbmUgaWQ9InRoaXNQYXJlbnROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0icmVtb3RlSG9zdFZhbHZlRm9ybSIgcHJvcGVydHk9InBhcmVudE9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhcmVudE9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0idmFsdmVUeXBlIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0icmVtb3RlSG9zdFZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnZhbHZlcy5jcmVhdGUiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJyZW1vdGVIb3N0VmFsdmVGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InJlbW90ZUhvc3RWYWx2ZUZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJWYWx2ZSBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPiAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9InJlbW90ZUhvc3RWYWx2ZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVZhbHZlLmRvPyIgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3Q9IiArIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lLCJVVEYtOCIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImcGFyZW50PSIrIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNQYXJlbnROYW1lLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy52YWx2ZXMuZGVsZXRlIi8+CisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyA8JS0tIFJlbW90ZUhvc3QgVmFsdmUgUHJvcGVydGllcyAtLSU+CisgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPiA8dGQ+IDxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idmFsdmUucmVtb3RlaG9zdC5wcm9wZXJ0aWVzIi8+CisgICAgPC9kaXY+IDwvdGQ+IDwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnByb3BlcnR5Ii8+PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ0eXBlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnR5cGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0icmVtb3RlSG9zdFZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJ2YWx2ZVR5cGUiIG9uY2hhbmdlPSJJQV9qdW1wTWVudSgnc2VsZicsdGhpcykiIHN0eWxlSWQ9InR5cGUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJ2YWx2ZVR5cGVWYWxzIiBuYW1lPSJyZW1vdGVIb3N0VmFsdmVGb3JtIiBwcm9wZXJ0eT0idmFsdmVUeXBlVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJ2YWx2ZVR5cGVWYWxzIiBwcm9wZXJ0eT0idmFsdWUiIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0icmVtb3RlSG9zdFZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJyZW1vdGVIb3N0VmFsdmVGb3JtIiBwcm9wZXJ0eT0idmFsdmVUeXBlIiBzY29wZT0ic2Vzc2lvbiIvPgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iYWxsb3dIb3N0cyI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InZhbHZlLmFsbG93SG9zdHMiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHRhcmVhIHByb3BlcnR5PSJhbGxvdyIgY29scz0iMzAiIHJvd3M9IjMiIHN0eWxlSWQ9ImFsbG93SG9zdHMiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJkZW55SG9zdHMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJ2YWx2ZS5kZW55SG9zdHMiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHRhcmVhIHByb3BlcnR5PSJkZW55IiBjb2xzPSIzMCIgcm93cz0iMyIgc3R5bGVJZD0iZGVueUhvc3RzIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8L2NvbnRyb2xzOnRhYmxlPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisgIDwvaHRtbDpmb3JtPgorPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi92YWx2ZS9yZXF1ZXN0RHVtcGVyVmFsdmUuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdmFsdmUvcmVxdWVzdER1bXBlclZhbHZlLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTY1MDMyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdmFsdmUvcmVxdWVzdER1bXBlclZhbHZlLmpzcApAQCAtMCwwICsxLDEwNCBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL1NhdmVSZXF1ZXN0RHVtcGVyVmFsdmUiPgorCisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJyZXF1ZXN0RHVtcGVyVmFsdmVGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8YmVhbjpkZWZpbmUgaWQ9InRoaXNQYXJlbnROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0icmVxdWVzdER1bXBlclZhbHZlRm9ybSIgcHJvcGVydHk9InBhcmVudE9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhcmVudE9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0idmFsdmVUeXBlIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0icmVxdWVzdER1bXBlclZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnZhbHZlcy5jcmVhdGUiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJyZXF1ZXN0RHVtcGVyVmFsdmVGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InJlcXVlc3REdW1wZXJWYWx2ZUZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJWYWx2ZSBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPiAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9InJlcXVlc3REdW1wZXJWYWx2ZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVZhbHZlLmRvPyIgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3Q9IiArIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lLCJVVEYtOCIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImcGFyZW50PSIrIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNQYXJlbnROYW1lLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy52YWx2ZXMuZGVsZXRlIi8+CisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKworIDwlLS0gUmVxdWVzdCBEdW1wZXIgVmFsdmUgUHJvcGVydGllcyAtLSU+CisgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPiA8dGQ+IDxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idmFsdmUucmVxdWVzdC5wcm9wZXJ0aWVzIi8+CisgICAgPC9kaXY+IDwvdGQ+IDwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnByb3BlcnR5Ii8+PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ0eXBlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnR5cGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0icmVxdWVzdER1bXBlclZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJ2YWx2ZVR5cGUiIG9uY2hhbmdlPSJJQV9qdW1wTWVudSgnc2VsZicsdGhpcykiIHN0eWxlSWQ9InR5cGUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJ2YWx2ZVR5cGVWYWxzIiBuYW1lPSJyZXF1ZXN0RHVtcGVyVmFsdmVGb3JtIiBwcm9wZXJ0eT0idmFsdmVUeXBlVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJ2YWx2ZVR5cGVWYWxzIiBwcm9wZXJ0eT0idmFsdWUiIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0icmVxdWVzdER1bXBlclZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJyZXF1ZXN0RHVtcGVyVmFsdmVGb3JtIiBwcm9wZXJ0eT0idmFsdmVUeXBlIiBzY29wZT0ic2Vzc2lvbiIvPgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8L2NvbnRyb2xzOnRhYmxlPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisgIDwvaHRtbDpmb3JtPgorPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi92YWx2ZS9zaW5nbGVTaWduT25WYWx2ZS5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi92YWx2ZS9zaW5nbGVTaWduT25WYWx2ZS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwNGRjNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3ZhbHZlL3NpbmdsZVNpZ25PblZhbHZlLmpzcApAQCAtMCwwICsxLDEwMyBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1iZWFuIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtaHRtbCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL1NhdmVTaW5nbGVTaWduT24iPgorCisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJzaW5nbGVTaWduT25WYWx2ZUZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxiZWFuOmRlZmluZSBpZD0idGhpc1BhcmVudE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJzaW5nbGVTaWduT25WYWx2ZUZvcm0iIHByb3BlcnR5PSJwYXJlbnRPYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXJlbnRPYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InZhbHZlVHlwZSIvPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9InNpbmdsZVNpZ25PblZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnZhbHZlcy5jcmVhdGUiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJzaW5nbGVTaWduT25WYWx2ZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0ic2luZ2xlU2lnbk9uVmFsdmVGb3JtIiBwcm9wZXJ0eT0ibm9kZUxhYmVsIi8+CisgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iVmFsdmUgQWN0aW9ucyI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4gLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxsb2dpYzpub3RFcXVhbCBuYW1lPSJzaW5nbGVTaWduT25WYWx2ZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVZhbHZlLmRvPyIgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3Q9IiArIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lLCJVVEYtOCIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImcGFyZW50PSIrIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNQYXJlbnROYW1lLCJVVEYtOCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy52YWx2ZXMuZGVsZXRlIi8+CisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyA8JS0tIFNpbmdsZSBTaWduIE9uIFZhbHZlIFByb3BlcnRpZXMgLS0lPgorIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4gPHRkPiA8ZGl2IGNsYXNzPSJ0YWJsZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InZhbHZlLnNpbmdsZS5wcm9wZXJ0aWVzIi8+CisgICAgPC9kaXY+IDwvdGQ+IDwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnByb3BlcnR5Ii8+PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ0eXBlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnR5cGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0ic2luZ2xlU2lnbk9uVmFsdmVGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InZhbHZlVHlwZSIgb25jaGFuZ2U9IklBX2p1bXBNZW51KCdzZWxmJyx0aGlzKSIgc3R5bGVJZD0idHlwZSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9InZhbHZlVHlwZVZhbHMiIG5hbWU9InNpbmdsZVNpZ25PblZhbHZlRm9ybSIgcHJvcGVydHk9InZhbHZlVHlwZVZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0idmFsdmVUeXBlVmFscyIgcHJvcGVydHk9InZhbHVlIiBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9InNpbmdsZVNpZ25PblZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJzaW5nbGVTaWduT25WYWx2ZUZvcm0iIHByb3BlcnR5PSJ2YWx2ZVR5cGUiIHNjb3BlPSJzZXNzaW9uIi8+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgIDwvY29udHJvbHM6dGFibGU+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKyAgPC9odG1sOmZvcm0+Cis8cD4mbmJzcDs8L3A+Cis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3ZhbHZlL3ZhbHZlcy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi92YWx2ZS92YWx2ZXMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTgzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi92YWx2ZS92YWx2ZXMuanNwCkBAIC0wLDAgKzEsOTcgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL3RhZ3MtYmVhbiIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy90YWdzLWh0bWwiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvdGFncy1sb2dpYyIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ii9EZWxldGVWYWx2ZXMiPgorCisgIDxiZWFuOmRlZmluZSBpZD0idGhpc1BhcmVudE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJ2YWx2ZXNGb3JtIiBwcm9wZXJ0eT0icGFyZW50T2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhcmVudE9iamVjdE5hbWUiLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMudmFsdmVzLmRlbGV0ZSIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iVmFsdmUgQWN0aW9ucyI+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPgorICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyAgPCUtLSBWYWx2ZXMgTGlzdCAtLSU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIKKyAgICAgICAgIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+PHRkPgorCisgICAgICA8dGFibGUgY2xhc3M9ImZyb250LXRhYmxlIiBib3JkZXI9IjEiCisgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisKKyAgICAgICAgPHRyIGNsYXNzPSJoZWFkZXItcm93Ij4KKyAgICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmRlbGV0ZSIvPgorICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iaG9zdC5uYW1lIi8+CisgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgPC90cj4KKworICAgICAgICA8bG9naWM6aXRlcmF0ZSBuYW1lPSJ2YWx2ZXNMaXN0IiBpZD0idmFsdmUiPgorICAgICAgICAgIDx0ciBjbGFzcz0ibGluZS1yb3ciPgorICAgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgICA8bGFiZWwgZm9yPSJ2YWx2ZXMiPjwvbGFiZWw+CisgICAgICAgICAgICAgIDxodG1sOm11bHRpYm94IHByb3BlcnR5PSJ2YWx2ZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSI8JT0gdmFsdmUudG9TdHJpbmcoKSAlPiIgc3R5bGVJZD0idmFsdmVzIi8+CisgICAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgICAgIDxodG1sOmxpbmsgcGFnZT0nPCU9ICIvRWRpdFZhbHZlLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLm5ldC5VUkxFbmNvZGVyLmVuY29kZSh2YWx2ZS50b1N0cmluZygpLCJVVEYtOCIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJnBhcmVudD0iKyBVUkxFbmNvZGVyLmVuY29kZSh0aGlzUGFyZW50TmFtZSwiVVRGLTgiKSAlPic+CisgICAgICAgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx2ZSIgYXR0cmlidXRlPSJjbGFzc05hbWUiLz4KKyAgICAgICAgICAgICAgPC9odG1sOmxpbms+CisgICAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvbG9naWM6aXRlcmF0ZT4KKworICAgICAgPC90YWJsZT4KKworICAgIDwvdGQ+PC90cj4KKyAgPC90YWJsZT4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisKKyAgPGJyPgorPC9odG1sOmZvcm0+CisKKzxwPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvTUVUQS1JTkYvY29udGV4dC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9NRVRBLUlORi9jb250ZXh0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2NmNzU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvTUVUQS1JTkYvY29udGV4dC54bWwKQEAgLTAsMCArMSwxMiBAQAorPCEtLQorCisgICAgQ29udGV4dCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBUb21jYXQgQmFsYW5jZXIgV2ViIEFwcAorICAgIFRoaXMgaXMgb25seSBuZWVkZWQgdG8ga2VlcCB0aGUgZGlzdHJpYnV0aW9uIHNtYWxsIGFuZCBhdm9pZCBkdXBsaWNhdGluZworICAgIGNvbW1vbnMgbGlicmFyaWVzCisKKyAgICAkSWQkCisKKy0tPgorCisKKzxDb250ZXh0IHByaXZpbGVnZWQ9InRydWUiIGFudGlSZXNvdXJjZUxvY2tpbmc9ImZhbHNlIiBhbnRpSkFSTG9ja2luZz0iZmFsc2UiIC8+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvQmFsYW5jZXJGaWx0ZXIuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9CYWxhbmNlckZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNjdjNjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvQmFsYW5jZXJGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKworLyoqCisgKiBUaGUgYmFsYW5jZXIgZmlsdGVyIHJlZGlyZWN0cyBpbmNvbWluZyByZXF1ZXN0cworICogYmFzZWQgb24gd2hhdCBydWxlcyB0aGV5IG1hdGNoLiAgVGhlIHJ1bGVzCisgKiBhcmUgY29uZmlndXJhYmxlIHZpYSBhbiBYTUwgZG9jdW1lbnQgd2hvc2UgVVJMCisgKiBpcyBzcGVjaWZpZWQgYXMgYW4gaW5pdC1wYXJhbSB0byB0aGlzIGZpbHRlci4KKyAqCisgKiBAYXV0aG9yIFlvYXYgU2hhcGlyYQorICovCitwdWJsaWMgY2xhc3MgQmFsYW5jZXJGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworICAgIC8qKgorICAgICAqIFRoZSBydWxlcyB0aGlzIGZpbHRlciBjb25zdWx0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJ1bGVDaGFpbiBydWxlQ2hhaW47CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBjb250ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgY29udGV4dDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJ1bGUgY2hhaW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBydWxlIGNoYWluCisgICAgICovCisgICAgcHJvdGVjdGVkIFJ1bGVDaGFpbiBnZXRSdWxlQ2hhaW4oKSB7CisgICAgICAgIHJldHVybiBydWxlQ2hhaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGlzIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJDb25maWcgVGhlIGZpbHRlciBjb25maWcKKyAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbnRleHQgPSBmaWx0ZXJDb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKKworICAgICAgICBTdHJpbmcgY29uZmlnVXJsUGFyYW0gPSBmaWx0ZXJDb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiY29uZmlnVXJsIik7CisKKyAgICAgICAgaWYgKGNvbmZpZ1VybFBhcmFtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJjb25maWdVcmwgaXMgcmVxdWlyZWQuIik7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBjb250ZXh0LmdldFJlc291cmNlQXNTdHJlYW0oY29uZmlnVXJsUGFyYW0pOworICAgICAgICAgICAgUnVsZXNQYXJzZXIgcGFyc2VyID0gbmV3IFJ1bGVzUGFyc2VyKGlucHV0KTsKKyAgICAgICAgICAgIHJ1bGVDaGFpbiA9IHBhcnNlci5nZXRSZXN1bHQoKTsKKyAgICAgICAgICAgIGNvbnRleHQubG9nKAorICAgICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogaW5pdCgpOiBydWxlQ2hhaW46ICIgKyBydWxlQ2hhaW4pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgdGhlIGluY29taW5nIHJlcXVlc3QuCisgICAgICogQ29uc3VsdHMgdGhlIHJ1bGUgY2hhaW4gdG8gc2VlIGlmCisgICAgICogYW55IHJ1bGVzIG1hdGNoIHRoaXMgcmVxdWVzdCwgYW5kIGlmCisgICAgICogc28gcmVkaXJlY3RzLiAgT3RoZXJ3aXNlIHNpbXBseQorICAgICAqIGxldCByZXF1ZXN0IHRocm91Z2guCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdAorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UKKyAgICAgKiBAcGFyYW0gY2hhaW4gVGhlIGZpbHRlciBjaGFpbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKAorICAgICAgICBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIEZpbHRlckNoYWluIGNoYWluKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBpZiAocmVzcG9uc2UuaXNDb21taXR0ZWQoKSkgeworICAgICAgICAgICAgY29udGV4dC5sb2coCisgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICArICI6IGRvRmlsdGVyKCk6IG5vdCBpbnNwZWN0aW5nIGNvbW1pdHRlZCByZXNwb25zZS4iKTsKKyAgICAgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfSBlbHNlIGlmICghKHJlcXVlc3QgaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlcXVlc3QpKSB7CisgICAgICAgICAgICBjb250ZXh0LmxvZygKKyAgICAgICAgICAgICAgICBnZXRDbGFzcygpLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICsgIjogZG9GaWx0ZXIoKTogbm90IGluc3BlY3Rpbmcgbm9uLUh0dHAgcmVxdWVzdC4iKTsKKyAgICAgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCBocmVxID0gKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxdWVzdDsKKyAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgaHJlcyA9IChIdHRwU2VydmxldFJlc3BvbnNlKSByZXNwb25zZTsKKworICAgICAgICAgICAgVVJMIHJlZGlyZWN0VXJsID0gZ2V0UnVsZUNoYWluKCkuZXZhbHVhdGUoaHJlcSk7CisKKyAgICAgICAgICAgIGlmIChyZWRpcmVjdFVybCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kZWQgPQorICAgICAgICAgICAgICAgICAgICBocmVzLmVuY29kZVJlZGlyZWN0VVJMKHJlZGlyZWN0VXJsLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAgICAgY29udGV4dC5sb2coCisgICAgICAgICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIjogZG9GaWx0ZXIoKTogcmVkaXJlY3RpbmcgcmVxdWVzdCBmb3IgIgorICAgICAgICAgICAgICAgICAgICArIGhyZXEuZ2V0UmVxdWVzdFVSTCgpLnRvU3RyaW5nKCkgKyAiIHRvICIgKyBlbmNvZGVkKTsKKworICAgICAgICAgICAgICAgIGhyZXMuc2VuZFJlZGlyZWN0KGVuY29kZWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXN0cm95IHRoaXMgZmlsdGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIGNvbnRleHQgPSBudWxsOworICAgICAgICBydWxlQ2hhaW4gPSBudWxsOworICAgIH0KK30KKworCisvLyBFbmQgb2YgZmlsZTogQmFsYW5jZUZpbHRlci5qYXZhCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvUnVsZS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL1J1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGM5Y2NmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL1J1bGUuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisKKy8qKgorICogVGhlIFJ1bGUgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5CisgKiBsb2FkIGJhbGFuY2luZyBydWxlcy4KKyAqCisgKiBAYXV0aG9yIFlvYXYgU2hhcGlyYQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJ1bGUgeworICAgIC8qKgorICAgICAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gcmVxdWVzdAorICAgICAqIG1hdGNoZXMgdGhlIHJ1bGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdAorICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIG1hdGNoZXMsIHdpbGwgYmUgcmVkaXJlY3RlZC4KKyAgICAgKi8KKyAgICBib29sZWFuIG1hdGNoZXMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmVkaXJlY3QgVVJMIGZvcgorICAgICAqIHJlcXVlc3RzIHRoYXQgbWF0Y2ggdGhpcyBydWxlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcmVkaXJlY3QgVVJMCisgICAgICovCisgICAgU3RyaW5nIGdldFJlZGlyZWN0VXJsKCk7Cit9CisKKworLy8gRW5kIG9mIGZpbGU6IFJ1bGUuamF2YQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL1J1bGVDaGFpbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL1J1bGVDaGFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmN2MzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvUnVsZUNoYWluLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlcjsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworCisvKioKKyAqIEEgUnVsZUNoYWluIGlzIGEgbGlzdCBvZiBydWxlcworICogY29uc2lkZXJlZCBpbiBvcmRlci4gIFRoZSBmaXJzdAorICogcnVsZSB0byBzdWNjZWVkIHN0b3BzIHRoZSBldmFsdWF0aW9uCisgKiBvZiBydWxlcy4KKyAqCisgKiBAYXV0aG9yIFlvYXYgU2hhcGlyYQorICovCitwdWJsaWMgY2xhc3MgUnVsZUNoYWluIHsKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiBydWxlcyB0byBldmFsdWF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QgcnVsZXM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUnVsZUNoYWluKCkgeworICAgICAgICBydWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHJ1bGVzCisgICAgICogdG8gZXZhbHVhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIExpc3QKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlzdCBnZXRSdWxlcygpIHsKKyAgICAgICAgcmV0dXJuIHJ1bGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlcgorICAgICAqIHRoZSBsaXN0IG9mIHJ1bGVzIHRvIGV2YWx1YXRlLgorICAgICAqCisgICAgICogQHJldHVybiBJdGVyYXRvcgorICAgICAqLworICAgIHByb3RlY3RlZCBJdGVyYXRvciBnZXRSdWxlSXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBnZXRSdWxlcygpLml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHJ1bGUgdG8gZXZhbHVhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlUnVsZSBUaGUgcnVsZSB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSdWxlKFJ1bGUgdGhlUnVsZSkgeworICAgICAgICBpZiAodGhlUnVsZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcnVsZSBjYW5ub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldFJ1bGVzKCkuYWRkKHRoZVJ1bGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXZhbHVhdGVzIHRoZSBnaXZlbiByZXF1ZXN0IHRvIHNlZSBpZgorICAgICAqIGFueSBvZiB0aGUgcnVsZXMgbWF0Y2hlcy4gIFJldHVybnMgdGhlCisgICAgICogcmVkaXJlY3QgVVJMIGZvciB0aGUgZmlyc3QgbWF0Y2hpbmcKKyAgICAgKiBydWxlLiAgUmV0dXJucyBudWxsIGlmIG5vIHJ1bGVzIG1hdGNoCisgICAgICogdGhlIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdAorICAgICAqIEByZXR1cm4gVVJMIFRoZSBmaXJzdCBtYXRjaGluZyBydWxlIFVSTAorICAgICAqIEBzZWUgUnVsZSNtYXRjaGVzKEh0dHBTZXJ2bGV0UmVxdWVzdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMIGV2YWx1YXRlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBnZXRSdWxlSXRlcmF0b3IoKTsKKworICAgICAgICBSdWxlIGN1cnJlbnRSdWxlID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBjdXJyZW50TWF0Y2hlcyA9IGZhbHNlOworCisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgY3VycmVudFJ1bGUgPSAoUnVsZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBjdXJyZW50TWF0Y2hlcyA9IGN1cnJlbnRSdWxlLm1hdGNoZXMocmVxdWVzdCk7CisKKyAgICAgICAgICAgIGlmIChjdXJyZW50TWF0Y2hlcykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKGN1cnJlbnRSdWxlLmdldFJlZGlyZWN0VXJsKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiWyIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiOiAiKTsKKworICAgICAgICBJdGVyYXRvciBpdGVyID0gZ2V0UnVsZUl0ZXJhdG9yKCk7CisgICAgICAgIFJ1bGUgY3VycmVudFJ1bGUgPSBudWxsOworCisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgY3VycmVudFJ1bGUgPSAoUnVsZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGN1cnJlbnRSdWxlKTsKKworICAgICAgICAgICAgaWYgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIl0iKTsKKworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorfQorCisKKy8vIEVuZCBvZiBmaWxlOiBSdWxlQ2hhaW4uamF2YQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL1J1bGVzUGFyc2VyLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvUnVsZXNQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODMxMDVhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL1J1bGVzUGFyc2VyLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKworLyoqCisgKiBUaGUgcnVsZXMgcGFyc2VyIHVzZXMgRGlnZXN0ZXIKKyAqIHRvIHBhcnNlIHRoZSBydWxlcyBkZWZpbml0aW9uCisgKiBmaWxlIGFuZCByZXR1cm4gYSBSdWxlQ2hhaW4gb2JqZWN0LgorICoKKyAqIEBhdXRob3IgWW9hdiBTaGFwaXJhCisgKi8KK3B1YmxpYyBjbGFzcyBSdWxlc1BhcnNlciB7CisgICAgLyoqCisgICAgICogVGhlIHJlc3VsdGluZyBydWxlIGNoYWluLgorICAgICAqLworICAgIHByaXZhdGUgUnVsZUNoYWluIHJlc3VsdDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0IFRvIHJlYWQgdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgUnVsZXNQYXJzZXIoSW5wdXRTdHJlYW0gaW5wdXQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERpZ2VzdGVyIGRpZ2VzdGVyID0gY3JlYXRlRGlnZXN0ZXIoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IChSdWxlQ2hhaW4pIGRpZ2VzdGVyLnBhcnNlKGlucHV0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGFyc2VkIHJ1bGUgY2hhaW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHRpbmcgUnVsZUNoYWluCisgICAgICovCisgICAgcHVibGljIFJ1bGVDaGFpbiBnZXRSZXN1bHQoKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgZGlnZXN0ZXIgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERpZ2VzdGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIERpZ2VzdGVyIGNyZWF0ZURpZ2VzdGVyKCkgeworICAgICAgICBEaWdlc3RlciBkaWdlc3RlciA9IG5ldyBEaWdlc3RlcigpOworICAgICAgICBkaWdlc3Rlci5zZXRVc2VDb250ZXh0Q2xhc3NMb2FkZXIodHJ1ZSk7CisKKyAgICAgICAgU3RyaW5nIHJ1bGVzID0gInJ1bGVzIjsKKyAgICAgICAgU3RyaW5nIHJ1bGUgPSAiL3J1bGUiOworCisgICAgICAgIC8vIENvbnN0cnVjdCBydWxlIGNoYWluCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShydWxlcywgUnVsZUNoYWluLmNsYXNzKTsKKworICAgICAgICAvLyBDb25zdHJ1Y3QgcnVsZQorICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocnVsZXMgKyBydWxlLCBudWxsLCAiY2xhc3NOYW1lIik7CisKKyAgICAgICAgLy8gU2V0IHJ1bGUgcHJvcGVydGllcworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHJ1bGVzICsgcnVsZSk7CisKKyAgICAgICAgLy8gQWRkIHJ1bGUgdG8gY2hhaW4KKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChydWxlcyArIHJ1bGUsICJhZGRSdWxlIiwgIm9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLlJ1bGUiKTsKKworICAgICAgICByZXR1cm4gZGlnZXN0ZXI7CisgICAgfQorfQorCisKKy8vIEVuZCBvZiBjbGFzczogUnVsZXNQYXJzZXIuamF2YQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL292ZXJ2aWV3Lmh0bWwgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvb3ZlcnZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjk4NTJmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL292ZXJ2aWV3Lmh0bWwKQEAgLTAsMCArMSw1MCBAQAorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5CYWxhbmNlciBXZWJhcHAgT3ZlcnZpZXc8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CitUaGUgYmFsYW5jZXIgd2ViYXBwIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgcnVsZXMtYmFzZWQKK2xvYWQgYmFsYW5jZXIuICBBIG51bWJlciBvZiBydWxlcyBhcmUgcHJvdmlkZWQgYW5kIHRoZQorYXBwbGljYXRpb24gaXMgd3JpdHRlbiBmb3IgZWFzeSBleHRlbnNpYmlsaXR5LiAgCisKKzxwPgorQSBzZXJ2bGV0IGZpbHRlciBpcyBhbHNvIHByb3ZpZGVkIGFsb25nIHdpdGggYSBzYW1wbGUgd2ViLnhtbCB0aGF0CittYXBzIHRoYXQgZmlsdGVyIHRvIGFsbCByZXF1ZXN0cy4gIFRoaXMgaXMgb25seSBvbmUgd2F5Cit0byB1c2UgdGhlIGxvYWQgYmFsYW5jZXIuICBUaGUgdXNlciBtYXkgY29uZmlndXJlIG11bHRpcGxlCitmaWx0ZXJzIGVhY2ggd2l0aCBhIGRpZmZlcmVudCBydWxlIGNoYWluIG1hcHBlZCB0byAKKyhwb3NzaWJseSBtdWx0aXBsZSkgZGlmZmVyZW50IHVybC1wYXR0ZXJucyBvciBzZXJ2bGV0cy4gIEl0CitpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBydWxlIGNoYWlucyB3aXRoaW4gYSBzZXJ2bGV0LgorPC9wPgorCis8cD4KK1BsZWFzZSBub3RlIHRoYXQgYWx0aG91Z2ggdGhpcyBhcHBsaWNhdGlvbiBpcyBiZWluZyBkaXN0cmlidXRlZAord2l0aCBUb21jYXQsIGl0IGlzIGNvbXBsaWFudCB3aXRoIHRoZSBTZXJ2bGV0IFNwZWNpZmljYXRpb24gdjIuMworYW5kIGlzIHRoZXJlZm9yZSBwb3J0YWJsZSBhY3Jvc3Mgc2VydmxldCBjb250YWluZXJzIHRoYXQgc3VwcG9ydAordGhpcyBzcGVjaWZpY2F0aW9uLgorPC9wPgorCis8cD4KK1RoZSBiYWxhbmNlciB3ZWJhcHBzIHVzZXMgdGhlIAorPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2RpZ2VzdGVyIj5EaWdlc3RlcjwvYT4gCit0b29sIGZyb20gSmFrYXJ0YSBDb21tb25zLiAgRGlnZXN0ZXIgYW5kIGl0cyBkZXBlbmRlbmNpZXMgYXJlCitpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KKzwvcD4KKworPHA+CitUaGUgYmFsYW5jZXIgd2ViYXBwIHVzZXMgCis8YSBocmVmPSJodHRwOi8vamFsb3B5LnNmLm5ldCI+SmFsb3B5PC9hPiAKK2ZvciBzb3VyY2UtY29kZSBmb3JtYXR0aW5nIGFuZCAKKzxhIGhyZWY9Imh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldCI+Q2hlY2tTdHlsZTwvYT4gCitmb3Igc291cmNlLWNvZGUgY2hlY2tpbmcuCis8YnIvPgorVGhlIDxhIGhyZWY9Ii4uL2NoZWNrU3R5bGUvY2hlY2tTdHlsZVJlcG9ydC5odG1sIj4KK0NoZWNrU3R5bGUgUmVwb3J0PC9hPiBpcyBhdmFpbGFibGUuCis8L3A+CisKKzxwPgorQW55IHN1Z2dlc3Rpb25zLCBjb21tZW50cywgZXRjLCBhcmUgd2VsY29tZTogcGxlYXNlCitwb3N0IHRoZW0gdG8gdGhlIHRvbWNhdC11c2VyIG1haWxpbmcgbGlzdC4gIEVuam95IDspCis8L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcGFja2FnZS5odG1sIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDY2OGUzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI2IEBACis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPm9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyIFBhY2thZ2UgT3ZlcnZpZXc8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CitUaGlzIHBhY2thZ2UgY29udGFpbnMgYWxsIGNsYXNzZXMgdXNlZCBieSB0aGUgYmFsYW5jZXIKK3dlYmFwcCBvdGhlciB0aGFuIGFjdHVhbCBydWxlIGltcGxlbWVudGF0aW9ucy4KKzxwPgorVGhlIHtAbGluayBvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlci5CYWxhbmNlckZpbHRlciBGaWx0ZXJ9IGlzIGhvdyB0aGUgd2ViYXBwCitpcyB0eXBpY2FsbHkgdXNlZDogc2VlIHRoZSB3ZWIueG1sIGZpbGUgaW4gdGhpcyBkaXN0cmlidXRpb24KK2ZvciBhbiBleGFtcGxlLgorPC9wPgorCis8cD4KK0Ege0BsaW5rIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLlJ1bGVDaGFpbn0gaXMgc2ltcGx5IGEgbGlzdCBvZiBydWxlcyB0byBiZQorZXZhbHVhdGVkIGluIG9yZGVyLgorPC9wPgorCis8cD4KK1RoZSB7QGxpbmsgb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIuUnVsZXNQYXJzZXJ9IHVzZXMgCis8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvZGlnZXN0ZXIiPkRpZ2VzdGVyPC9hPiAKK3RvIHBhcnNlIHRoZSBydWxlcyBjb25maWd1cmF0aW9uIGZpbGUuCis8L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvQWNjZXB0RXZlcnl0aGluZ1J1bGUuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9BY2NlcHRFdmVyeXRoaW5nUnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYzM5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvQWNjZXB0RXZlcnl0aGluZ1J1bGUuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIucnVsZXM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisKKy8qKgorICogVGhpcyBydWxlIG1hdGNoZXMgZXZlcnkgcmVxdWVzdAorICogcGFzc2VkIHRvIGl0LCBtYWtpbmcgaXQgc3VpdGFibGUKKyAqIGZvciB1c2UgYXMgYSBjYXRjaC1hbGwgb3IgbGFzdAorICogcnVsZSBpbiBhIGNoYWluLgorICoKKyAqIEBhdXRob3IgWW9hdiBTaGFwaXJhCisgKi8KK3B1YmxpYyBjbGFzcyBBY2NlcHRFdmVyeXRoaW5nUnVsZSBleHRlbmRzIEJhc2VSdWxlIHsKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLlJ1bGUjbWF0Y2hlcyhIdHRwU2VydmxldFJlcXVlc3QpCisgICAgICoKKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyBtYXRjaGVzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCisKKy8vIEVuZCBvZiBmaWxlOiBBY2NlcHRFdmVyeXRoaW5nUnVsZS5qYXZhCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvQmFzZVJ1bGUuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9CYXNlUnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNDQ4NGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvQmFzZVJ1bGUuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLnJ1bGVzOworCitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIuUnVsZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKworLyoqCisgKiBUaGUgQmFzZVJ1bGUgaXMgYW4gZW1wdHkgcnVsZQorICogaW1wbGVtZW50YXRpb24gd2hpY2ggY2FuIGJlCisgKiBzdWJjbGFzc2VkIGZvciBleHRlbnNpb24uCisgKgorICogQGF1dGhvciBZb2F2IFNoYXBpcmEKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VSdWxlIGltcGxlbWVudHMgUnVsZSB7CisgICAgLyoqCisgICAgICogVGhlIHJ1bGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgLyoqCisgICAgICogVGhlIFVSTCB3aGVyZSBtYXRjaGluZworICAgICAqIHJlcXVlc3RlZCB3aWxsIGJlIHJlZGlyZWN0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVkaXJlY3RVcmw7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBydWxlIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlTmFtZSBUaGUgcnVsZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHRoZU5hbWUpIHsKKyAgICAgICAgaWYgKHRoZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIG5hbWUgY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuYW1lID0gdGhlTmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJ1bGUgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIFJ1bGUjZ2V0UmVkaXJlY3RVcmwKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlZGlyZWN0VXJsKCkgeworICAgICAgICByZXR1cm4gcmVkaXJlY3RVcmw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcmVkaXJlY3QgVVJMLgorICAgICAqCisgICAgICogQHBhcmFtIHRoZVJlZGlyZWN0VXJsIFdoZXJlIG1hdGNoaW5nIHJlcXVlc3RzIHdpbGwgYmUgcmVkaXJlY3RlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZGlyZWN0VXJsKFN0cmluZyB0aGVSZWRpcmVjdFVybCkgeworICAgICAgICBpZiAodGhlUmVkaXJlY3RVcmwgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVkaXJlY3RVcmwgbWF5IG5vdCBiZSBudWxsLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVkaXJlY3RVcmwgPSB0aGVSZWRpcmVjdFVybDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgUnVsZSNtYXRjaGVzKEh0dHBTZXJ2bGV0UmVxdWVzdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBtYXRjaGVzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiWyIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiOiAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJSZWRpcmVjdCBVUkw6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldFJlZGlyZWN0VXJsKCkpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIl0iKTsKKworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorfQorCisKKy8vIEVuZCBvZiBmaWxlOiBCYXNlUnVsZS5qYXZhCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvQ2hhcmFjdGVyRW5jb2RpbmdSdWxlLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvQ2hhcmFjdGVyRW5jb2RpbmdSdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkYjMyNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9DaGFyYWN0ZXJFbmNvZGluZ1J1bGUuamF2YQpAQCAtMCwwICsxLDc1IEBACitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLnJ1bGVzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworCisvKioKKyAqIFRoaXMgcnVsZSByZWRpcmVjdHMgcmVxdWVzdHMgaWYgdGhleQorICogYXJlIGZvciBhIHNwZWNpZmljIGNoYXJhY3RlciBlbmNvZGluZy4KKyAqCisgKiBAYXV0aG9yIFlvYXYgU2hhcGlyYQorICovCitwdWJsaWMgY2xhc3MgQ2hhcmFjdGVyRW5jb2RpbmdSdWxlIGV4dGVuZHMgQmFzZVJ1bGUgeworICAgIC8qKgorICAgICAqIFRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2Rpbmc7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlRW5jb2RpbmcgVGhlIGVuY29kaW5nIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIHRoZUVuY29kaW5nKSB7CisgICAgICAgIGlmICh0aGVFbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZW5jb2RpbmcgY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbmNvZGluZyA9IHRoZUVuY29kaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVzaXJlZCBlbmNvZGluZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFbmNvZGluZygpIHsKKyAgICAgICAgcmV0dXJuIGVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIuUnVsZSNtYXRjaGVzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgU3RyaW5nIGFjdHVhbEVuY29kaW5nID0gcmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpOworCisgICAgICAgIHJldHVybiAoZ2V0RW5jb2RpbmcoKS5jb21wYXJlVG8oYWN0dWFsRW5jb2RpbmcpID09IDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiWyIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiOiAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJUYXJnZXQgZW5jb2Rpbmc6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldEVuY29kaW5nKCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIgLyAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJSZWRpcmVjdCBVUkw6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldFJlZGlyZWN0VXJsKCkpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIl0iKTsKKworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorfQorCisKKy8vIEVuZCBvZiBmaWxlOiBDaGFyYWN0ZXJFbmNvZGluZ1J1bGUuamF2YQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL1JlbW90ZUFkZHJlc3NSdWxlLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvUmVtb3RlQWRkcmVzc1J1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDdiNjBmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL1JlbW90ZUFkZHJlc3NSdWxlLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLnJ1bGVzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworCisvKioKKyAqIFRoZSByZW1vdGUgYWNjZXNzIHJ1bGUKKyAqIHJlZGlyZWN0cyBpZiB0aGUgcmVxdWVzdCBjYW1lCisgKiBmcm9tIHNwZWNpZmllZCByZW1vdGUgYWRkcmVzcy4KKyAqCisgKiBAYXV0aG9yIFlvYXYgU2hhcGlyYQorICovCitwdWJsaWMgY2xhc3MgUmVtb3RlQWRkcmVzc1J1bGUgZXh0ZW5kcyBCYXNlUnVsZSB7CisgICAgLyoqCisgICAgICogVGhlIHRhcmdldCByZW1vdGUgYWRkcmVzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZW1vdGVBZGRyZXNzOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGFyZ2V0IHJlbW90ZSBhZGRyZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHRoZUFkZHJlc3MgVGhlIGFkZHJlc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGVBZGRyZXNzKFN0cmluZyB0aGVBZGRyZXNzKSB7CisgICAgICAgIGlmICh0aGVBZGRyZXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBhZGRyZXNzIGNhbm5vdCBiZSBudWxsLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVtb3RlQWRkcmVzcyA9IHRoZUFkZHJlc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgcmVtb3RlIGFkZHJlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVtb3RlQWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIHJlbW90ZUFkZHJlc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlci5SdWxlI21hdGNoZXMoSHR0cFNlcnZsZXRSZXF1ZXN0KQorICAgICAqCisgICAgICogTG9va3MgZm9yIHRoZSByZXF1ZXN0J3MgcmVtb3RlIGFkZHJlc3MuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBTdHJpbmcgcmVxdWVzdEFkZHIgPSByZXF1ZXN0LmdldFJlbW90ZUFkZHIoKTsKKworICAgICAgICByZXR1cm4gKHJlcXVlc3RBZGRyLmNvbXBhcmVUbyhnZXRSZW1vdGVBZGRyZXNzKCkpID09IDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiWyIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiOiAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJUYXJnZXQgcmVtb3RlIGFkZHJlc3M6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldFJlbW90ZUFkZHJlc3MoKSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAvICIpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlJlZGlyZWN0IFVSTDogIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0UmVkaXJlY3RVcmwoKSk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiXSIpOworCisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9Cit9CisKKworLy8gRW5kIG9mIGZpbGU6IFJlbW90ZUFkZHJlc3NSdWxlLmphdmEKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9SZXF1ZXN0QXR0cmlidXRlUnVsZS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL1JlcXVlc3RBdHRyaWJ1dGVSdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjMTEwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9SZXF1ZXN0QXR0cmlidXRlUnVsZS5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIucnVsZXM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisKKy8qKgorICogVGhpcyBydWxlIGFjY2VwdHMgb3IgcmVqZWN0cyByZXF1ZXN0cworICogYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgYXR0cmlidXRlCisgKiBpbiB0aGUgcmVxdWVzdC4KKyAqCisgKiBAYXV0aG9yIFlvYXYgU2hhcGlyYQorICovCitwdWJsaWMgY2xhc3MgUmVxdWVzdEF0dHJpYnV0ZVJ1bGUgZXh0ZW5kcyBCYXNlUnVsZSB7CisgICAgLyoqCisgICAgICogVGhlIHRhcmdldCBhdHRyaWJ1dGUgbmFtZSAoYXR0cmlidXRlCisgICAgICogbXVzdCBiZSBwcmVzZW50IGZvciBtYXRjaCB0byBzdWNjZWVkKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGVOYW1lOworCisgICAgLyoqCisgICAgICogVGhlIHRhcmdldCBhdHRyaWJ1dGUgdmFsdWUuICBUaGlzCisgICAgICogaXMgb3B0aW9uYWw6IG51bGwgbWVhbnMgYW55IGF0dHJpYnV0ZQorICAgICAqIHZhbHVlIGlzIE9LIGZvciBhIG1hdGNoLiAgQSBub24tbnVsbAorICAgICAqIHZhbHVlIHdpbGwgYmUgbWF0Y2hlcyBleGFjdGx5LgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGF0dHJpYnV0ZVZhbHVlOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGFyZ2V0IGF0dHJpYnV0ZSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHRoZUF0dHJpYnV0ZU5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlTmFtZShTdHJpbmcgdGhlQXR0cmlidXRlTmFtZSkgeworICAgICAgICBpZiAodGhlQXR0cmlidXRlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVOYW1lIGNhbm5vdCBiZSBudWxsLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXR0cmlidXRlTmFtZSA9IHRoZUF0dHJpYnV0ZU5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgYXR0cmlidXRlIG5hbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBUaGUgdGFyZ2V0IGF0dHJpYnV0ZSBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYXR0cmlidXRlIHZhbHVlLCB3aGljaCBtYXkgYmUgbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aGVBdHRyaWJ1dGVWYWx1ZSBUaGUgYXR0cmlidXRlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVmFsdWUoT2JqZWN0IHRoZUF0dHJpYnV0ZVZhbHVlKSB7CisgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gdGhlQXR0cmlidXRlVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGFyZ2V0IGF0dHJpYnV0ZSB2YWx1ZSwKKyAgICAgKiB3aGljaCBtYXkgYmUgbnVsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT2JqZWN0IFRoZSB0YXJnZXQgYXR0cmlidXRlIHZhbHVlCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRBdHRyaWJ1dGVWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIuUnVsZSNtYXRjaGVzKEh0dHBTZXJ2bGV0UmVxdWVzdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIE9iamVjdCBhY3R1YWxBdHRyaWJ1dGVWYWx1ZSA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKGdldEF0dHJpYnV0ZU5hbWUoKSk7CisKKyAgICAgICAgaWYgKGFjdHVhbEF0dHJpYnV0ZVZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAoZ2V0QXR0cmlidXRlVmFsdWUoKSA9PSBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoYWN0dWFsQXR0cmlidXRlVmFsdWUuZXF1YWxzKGdldEF0dHJpYnV0ZVZhbHVlKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiWyIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiOiAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJUYXJnZXQgYXR0cmlidXRlIG5hbWU6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldEF0dHJpYnV0ZU5hbWUoKSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAvICIpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlRhcmdldCBhdHRyaWJ1dGUgdmFsdWU6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldEF0dHJpYnV0ZVZhbHVlKCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIgLyAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJSZWRpcmVjdCBVUkw6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldFJlZGlyZWN0VXJsKCkpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIl0iKTsKKworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorfQorCisKKy8vIEVuZCBvZiBmaWxlOiBSZXF1ZXN0QXR0cmlidXRlUnVsZS5qYXZhCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvUmVxdWVzdEhlYWRlclJ1bGUuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9SZXF1ZXN0SGVhZGVyUnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzA1MjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvUmVxdWVzdEhlYWRlclJ1bGUuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLnJ1bGVzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworCisvKioKKyAqIFRoaXMgcnVsZSBjaGVja3MgZm9yIHRoZSBwcmVzZW5jZQorICogb2YgYSBzcGVjaWZpYyByZXF1ZXN0IGhlYWRlciwgb3B0aW9uYWxseQorICogd2l0aCBhIHNwZWNpZmljIHZhbHVlLiAgVGhlIHZhbHVlIG1heQorICogYmUgbnVsbC4KKyAqCisgKiBAYXV0aG9yIFlvYXYgU2hhcGlyYQorICovCitwdWJsaWMgY2xhc3MgUmVxdWVzdEhlYWRlclJ1bGUgZXh0ZW5kcyBCYXNlUnVsZSB7CisgICAgLyoqCisgICAgICogVGhlIGhlYWRlciBuYW1lLCBjYW5ub3QgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBoZWFkZXJOYW1lOworCisgICAgLyoqCisgICAgICogVGhlIGhlYWRlciB2YWx1ZS4gIFRoaXMgbWF5IGJlCisgICAgICogbnVsbCB0byBpbmRpY2F0ZSBhbnkgdmFsdWUgaXMgT0suCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaGVhZGVyVmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBoZWFkZXIgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aGVOYW1lIFRoZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGVhZGVyTmFtZShTdHJpbmcgdGhlTmFtZSkgeworICAgICAgICBpZiAodGhlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJUaGUgaGVhZGVyIG5hbWUgY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoZWFkZXJOYW1lID0gdGhlTmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGhlYWRlciBuYW1lIHRvIG1hdGNoLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgaGVhZGVyIG5hbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRlck5hbWUoKSB7CisgICAgICAgIHJldHVybiBoZWFkZXJOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGhlYWRlciB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aGVWYWx1ZSBUaGUgaGVhZGVyIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGVhZGVyVmFsdWUoU3RyaW5nIHRoZVZhbHVlKSB7CisgICAgICAgIGhlYWRlclZhbHVlID0gdGhlVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVzaXJlZCBoZWFkZXIgdmFsdWUsCisgICAgICogd2hpY2ggbWF5IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGVyVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBoZWFkZXJWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLlJ1bGUjbWF0Y2hlcyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIFN0cmluZyBhY3R1YWxIZWFkZXJWYWx1ZSA9IHJlcXVlc3QuZ2V0SGVhZGVyKGdldEhlYWRlck5hbWUoKSk7CisKKyAgICAgICAgaWYgKGFjdHVhbEhlYWRlclZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAoZ2V0SGVhZGVyVmFsdWUoKSA9PSBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoYWN0dWFsSGVhZGVyVmFsdWUuY29tcGFyZVRvKGdldEhlYWRlclZhbHVlKCkpID09IDApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJbIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCI6ICIpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIkhlYWRlciBuYW1lOiAiKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRIZWFkZXJOYW1lKCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIgLyAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJIZWFkZXIgdmFsdWU6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldEhlYWRlclZhbHVlKCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIgLyAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJSZWRpcmVjdCBVUkw6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldFJlZGlyZWN0VXJsKCkpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIl0iKTsKKworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorfQorCisKKy8vIEVuZCBvZiBmaWxlOiBSZXF1ZXN0SGVhZGVyUnVsZS5qYXZhCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvUmVxdWVzdFBhcmFtZXRlclJ1bGUuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9SZXF1ZXN0UGFyYW1ldGVyUnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTcwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvUmVxdWVzdFBhcmFtZXRlclJ1bGUuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLnJ1bGVzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworCisvKioKKyAqIFRoaXMgcnVsZSBhY2NlcHRzIG9yIHJlamVjdHMgcmVxdWVzdHMKKyAqIGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIHBhcmFtZXRlcgorICogaW4gdGhlIHJlcXVlc3QuCisgKgorICogQGF1dGhvciBZb2F2IFNoYXBpcmEKKyAqLworcHVibGljIGNsYXNzIFJlcXVlc3RQYXJhbWV0ZXJSdWxlIGV4dGVuZHMgQmFzZVJ1bGUgeworICAgIC8qKgorICAgICAqIFRoZSB0YXJnZXQgcGFyYW1ldGVyIG5hbWUgKHBhcmFtZXRlcgorICAgICAqIG11c3QgYmUgcHJlc2VudCBmb3IgbWF0Y2ggdG8gc3VjY2VlZCkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFyYW1OYW1lOworCisgICAgLyoqCisgICAgICogVGhlIHRhcmdldCBwYXJhbWV0ZXIgdmFsdWUuICBUaGlzCisgICAgICogaXMgb3B0aW9uYWw6IG51bGwgbWVhbnMgYW55IHBhcmFtZXRlcgorICAgICAqIHZhbHVlIGlzIE9LIGZvciBhIG1hdGNoLiAgQSBub24tbnVsbAorICAgICAqIHZhbHVlIHdpbGwgYmUgbWF0Y2hlcyBleGFjdGx5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtVmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0YXJnZXQgcGFyYW1ldGVyIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlUGFyYW1OYW1lIFRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtTmFtZShTdHJpbmcgdGhlUGFyYW1OYW1lKSB7CisgICAgICAgIGlmICh0aGVQYXJhbU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyYW1OYW1lIGNhbm5vdCBiZSBudWxsLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyYW1OYW1lID0gdGhlUGFyYW1OYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHBhcmFtZXRlciBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgVGhlIHRhcmdldCBwYXJhbWV0ZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcmFtTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwYXJhbWV0ZXIgdmFsdWUsIHdoaWNoIG1heSBiZSBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHRoZVBhcmFtVmFsdWUgVGhlIHBhcmFtZXRlciB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtVmFsdWUoU3RyaW5nIHRoZVBhcmFtVmFsdWUpIHsKKyAgICAgICAgcGFyYW1WYWx1ZSA9IHRoZVBhcmFtVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHBhcmFtZXRlciB2YWx1ZSwKKyAgICAgKiB3aGljaCBtYXkgYmUgbnVsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIFRoZSB0YXJnZXQgcGFyYW1ldGVyIHZhbHVlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJhbVZhbHVlKCkgeworICAgICAgICByZXR1cm4gcGFyYW1WYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLlJ1bGUjbWF0Y2hlcyhIdHRwU2VydmxldFJlcXVlc3QpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBTdHJpbmcgYWN0dWFsUGFyYW1WYWx1ZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKGdldFBhcmFtTmFtZSgpKTsKKworICAgICAgICBpZiAoYWN0dWFsUGFyYW1WYWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKGdldFBhcmFtVmFsdWUoKSA9PSBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoYWN0dWFsUGFyYW1WYWx1ZS5jb21wYXJlVG8oZ2V0UGFyYW1WYWx1ZSgpKSA9PSAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiWyIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiOiAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJUYXJnZXQgcGFyYW0gbmFtZTogIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0UGFyYW1OYW1lKCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIgLyAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJUYXJnZXQgcGFyYW0gdmFsdWU6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldFBhcmFtVmFsdWUoKSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAvICIpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlJlZGlyZWN0IFVSTDogIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0UmVkaXJlY3RVcmwoKSk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiXSIpOworCisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9Cit9CisKKworLy8gRW5kIG9mIGZpbGU6IFJlcXVlc3RQYXJhbWV0ZXJSdWxlLmphdmEKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9TZXNzaW9uQXR0cmlidXRlUnVsZS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL1Nlc3Npb25BdHRyaWJ1dGVSdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExNzdlYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9TZXNzaW9uQXR0cmlidXRlUnVsZS5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIucnVsZXM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKKworCisvKioKKyAqIFRoaXMgcnVsZSBhY2NlcHRzIG9yIHJlamVjdHMgcmVxdWVzdHMKKyAqIGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIGF0dHJpYnV0ZQorICogaW4gdGhlIHJlcXVlc3QuCisgKgorICogQGF1dGhvciBZb2F2IFNoYXBpcmEKKyAqLworcHVibGljIGNsYXNzIFNlc3Npb25BdHRyaWJ1dGVSdWxlIGV4dGVuZHMgQmFzZVJ1bGUgeworICAgIC8qKgorICAgICAqIFRoZSB0YXJnZXQgYXR0cmlidXRlIG5hbWUgKGF0dHJpYnV0ZQorICAgICAqIG11c3QgYmUgcHJlc2VudCBmb3IgbWF0Y2ggdG8gc3VjY2VlZCkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlTmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSB0YXJnZXQgYXR0cmlidXRlIHZhbHVlLiAgVGhpcworICAgICAqIGlzIG9wdGlvbmFsOiBudWxsIG1lYW5zIGFueSBhdHRyaWJ1dGUKKyAgICAgKiB2YWx1ZSBpcyBPSyBmb3IgYSBtYXRjaC4gIEEgbm9uLW51bGwKKyAgICAgKiB2YWx1ZSB3aWxsIGJlIG1hdGNoZXMgZXhhY3RseS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBhdHRyaWJ1dGVWYWx1ZTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRhcmdldCBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aGVBdHRyaWJ1dGVOYW1lIFRoZSBhdHRyaWJ1dGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5hbWUoU3RyaW5nIHRoZUF0dHJpYnV0ZU5hbWUpIHsKKyAgICAgICAgaWYgKHRoZUF0dHJpYnV0ZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiYXR0cmlidXRlTmFtZSBjYW5ub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSB0aGVBdHRyaWJ1dGVOYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGFyZ2V0IGF0dHJpYnV0ZSBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgVGhlIHRhcmdldCBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSwgd2hpY2ggbWF5IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlQXR0cmlidXRlVmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVZhbHVlKE9iamVjdCB0aGVBdHRyaWJ1dGVWYWx1ZSkgeworICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHRoZUF0dHJpYnV0ZVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRhcmdldCBhdHRyaWJ1dGUgdmFsdWUsCisgICAgICogd2hpY2ggbWF5IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9iamVjdCBUaGUgdGFyZ2V0IGF0dHJpYnV0ZSB2YWx1ZQorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0QXR0cmlidXRlVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLlJ1bGUjbWF0Y2hlcyhIdHRwU2VydmxldFJlcXVlc3QpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIE9iamVjdCBhY3R1YWxBdHRyaWJ1dGVWYWx1ZSA9IHNlc3Npb24uZ2V0QXR0cmlidXRlKGdldEF0dHJpYnV0ZU5hbWUoKSk7CisKKyAgICAgICAgaWYgKGFjdHVhbEF0dHJpYnV0ZVZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAoZ2V0QXR0cmlidXRlVmFsdWUoKSA9PSBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoYWN0dWFsQXR0cmlidXRlVmFsdWUuZXF1YWxzKGdldEF0dHJpYnV0ZVZhbHVlKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiWyIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiOiAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJUYXJnZXQgYXR0cmlidXRlIG5hbWU6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldEF0dHJpYnV0ZU5hbWUoKSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAvICIpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlRhcmdldCBhdHRyaWJ1dGUgdmFsdWU6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldEF0dHJpYnV0ZVZhbHVlKCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIgLyAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJSZWRpcmVjdCBVUkw6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldFJlZGlyZWN0VXJsKCkpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIl0iKTsKKworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorfQorCisKKy8vIEVuZCBvZiBmaWxlOiBTZXNzaW9uQXR0cmlidXRlUnVsZS5qYXZhCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvVVJMU3RyaW5nTWF0Y2hSdWxlLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvVVJMU3RyaW5nTWF0Y2hSdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE0MzA0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9VUkxTdHJpbmdNYXRjaFJ1bGUuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIucnVsZXM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisKKy8qKgorICogVGhpcyBydWxlIGxvb2tzIGZvciBhIHNwZWNpZmljIHN0cmluZworICogaW4gdGhlIFVSTCBmb3IgYSBwb3NpdGl2ZSBtYXRjaC4KKyAqCisgKiBAYXV0aG9yIFlvYXYgU2hhcGlyYQorICovCitwdWJsaWMgY2xhc3MgVVJMU3RyaW5nTWF0Y2hSdWxlIGV4dGVuZHMgQmFzZVJ1bGUgeworICAgIC8qKgorICAgICAqIFRoZSB0YXJnZXQgc3RyaW5nIHRoYXQgbXVzdCBiZSBwcmVzZW50CisgICAgICogaW4gdGhlIFVSTCwgbWF5IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldFN0cmluZzsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRhcmdldCBzdHJpbmcgdGhhdCBtdXN0CisgICAgICogYmUgcHJlc2VudCBpbiB0aGUgVVJMLgorICAgICAqCisgICAgICogQHBhcmFtIHRoZVRhcmdldFN0cmluZyBUaGUgdGFyZ2V0IHN0cmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldFN0cmluZyhTdHJpbmcgdGhlVGFyZ2V0U3RyaW5nKSB7CisgICAgICAgIGlmICh0aGVUYXJnZXRTdHJpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiVGhlIHRhcmdldCBzdHJpbmcgY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0YXJnZXRTdHJpbmcgPSB0aGVUYXJnZXRTdHJpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgc3RyaW5nIHRoYXQgbXVzdAorICAgICAqIGJlIHByZXNlbnQgaW4gdGhlIFVSTC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHRhcmdldCBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldFN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRhcmdldFN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLlJ1bGUjbWF0Y2hlcyhIdHRwU2VydmxldFJlcXVlc3QpCisgICAgICoKKyAgICAgKiBMb29rcyBmb3IgdGhlIHRhcmdldCBzdHJpbmcgaW4gdGhlIHJlcXVlc3QgVVJMLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgU3RyaW5nIHJlcXVlc3RVcmwgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkwoKS50b1N0cmluZygpOworICAgICAgICBpbnQgaW5kZXggPSByZXF1ZXN0VXJsLmluZGV4T2YoZ2V0VGFyZ2V0U3RyaW5nKCkpOworCisgICAgICAgIHJldHVybiAoaW5kZXggPiAtMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJbIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCI6ICIpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlRhcmdldCBzdHJpbmc6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldFRhcmdldFN0cmluZygpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiIC8gIik7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiUmVkaXJlY3QgVVJMOiAiKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRSZWRpcmVjdFVybCgpKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJdIik7CisKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KK30KKworCisvLyBFbmQgb2YgZmlsZTogVVJMU3RyaW5nTWF0Y2hSdWxlLmphdmEKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9Vc2VyUm9sZVJ1bGUuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9Vc2VyUm9sZVJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2Q2OTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL1VzZXJSb2xlUnVsZS5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlci5ydWxlczsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKworLyoqCisgKiBUaGlzIHJ1bGUgcmVkaXJlY3RzIHRoZSByZXF1ZXN0IGJhc2VkCisgKiBvbiB0aGUgdXNlcidzIHJvbGUuCisgKgorICogQGF1dGhvciBZb2F2IFNoYXBpcmEKKyAqLworcHVibGljIGNsYXNzIFVzZXJSb2xlUnVsZSBleHRlbmRzIEJhc2VSdWxlIHsKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzaXJlZCByb2xlIGZvciB0aGUgdXNlci4KKyAgICAgKiBJZiB0aGUgdXNlciBpcyBpbiB0aGlzIHJvbGUsIHRoZQorICAgICAqIG1hdGNoIHdpbGwgc3VjY2VlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByb2xlOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVzaXJlZCByb2xlLgorICAgICAqCisgICAgICogQHBhcmFtIHRoZVJvbGUgVGhlIGRlc2lyZSByb2xlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um9sZShTdHJpbmcgdGhlUm9sZSkgeworICAgICAgICBpZiAodGhlUm9sZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcm9sZSBjYW5ub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJvbGUgPSB0aGVSb2xlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHJvbGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBkZXNpcmVkIHJvbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJvbGUoKSB7CisgICAgICAgIHJldHVybiByb2xlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIuUnVsZSNtYXRjaGVzKEh0dHBTZXJ2bGV0UmVxdWVzdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmlzVXNlckluUm9sZShnZXRSb2xlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiWyIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiOiAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJUYXJnZXQgcm9sZTogIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0Um9sZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiIC8gIik7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiUmVkaXJlY3QgVVJMOiAiKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRSZWRpcmVjdFVybCgpKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJdIik7CisKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KK30KKworCisvLyBFbmQgb2YgZmlsZTogVXNlclJvbGVSdWxlLmphdmEKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9wYWNrYWdlLmh0bWwgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5N2M3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMTEgQEAKKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+b3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIucnVsZXMgUGFja2FnZSBPdmVydmlldzwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KK1RoaXMgcGFja2FnZSBjb250YWlucyBhbGwgdGhlIHtAbGluayBvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlci5SdWxlfSAKK2ltcGxlbWVudGF0aW9ucyB0aGF0IGFyZSBkaXN0cmlidXRlZCB3aXRoIHRoZSBiYWxhbmNlciB3ZWJhcHAuICBBbGwgCit0aGVzZSBydWxlcyBleHRlbmQge0BsaW5rIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLnJ1bGVzLkJhc2VSdWxlfSAKK2J1dCB1c2VycyBhcmUgZnJlZSB0byBpbXBsZW1lbnQgdGhlIFJ1bGUgaW50ZXJmYWNlIGFzIG5lZWRlZC4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY29uZmlnL3J1bGVzLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY29uZmlnL3J1bGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDk3NjVlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jb25maWcvcnVsZXMueG1sCkBAIC0wLDAgKzEsMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cnVsZXM+CisgIDwhLS0gSWYgdGhlIFVSTCBjb250YWlucyBOZXdzIChjYXNlLXNlbnNpdGl2ZSksIGdvIHRvIENOTi5jb20gLS0+CisgIDxydWxlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIucnVsZXMuVVJMU3RyaW5nTWF0Y2hSdWxlIgorICAgIHRhcmdldFN0cmluZz0iTmV3cyIKKyAgICByZWRpcmVjdFVybD0iaHR0cDovL3d3dy5jbm4uY29tIiAvPgorCisgIDwhLS0gSWYgdGhlIHJlcXVlc3QgY29udGFpbnMgYSBwYXJhbWV0ZXIgbmFtZWQgcGFyYW1OYW1lIHdob3NlIHZhbHVlCisgICAgICAgaXMgcGFyYW1WYWx1ZSwgZ28gdG8gWWFob28uY29tLiAtLT4KKyAgPHJ1bGUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlci5ydWxlcy5SZXF1ZXN0UGFyYW1ldGVyUnVsZSIKKyAgICBwYXJhbU5hbWU9InBhcmFtTmFtZSIKKyAgICBwYXJhbVZhbHVlPSJwYXJhbVZhbHVlIgorICAgIHJlZGlyZWN0VXJsPSJodHRwOi8vd3d3LnlhaG9vLmNvbSIgLz4KKworICA8IS0tIFJlZGlyZWN0IGFsbCByZXF1ZXN0cyB0byBqYWthcnRhLmFwYWNoZS5vcmcuIC0tPgorICA8cnVsZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLnJ1bGVzLkFjY2VwdEV2ZXJ5dGhpbmdSdWxlIgorICAgIHJlZGlyZWN0VXJsPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnIiAvPgorPC9ydWxlcz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvd2ViLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDhjMGI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgorICAgIHZlcnNpb249IjIuNCI+CisKKyAgPGRpc3BsYXktbmFtZT5Ub21jYXQgU2ltcGxlIExvYWQgQmFsYW5jZXIgRXhhbXBsZSBBcHA8L2Rpc3BsYXktbmFtZT4KKyAgPGRlc2NyaXB0aW9uPgorICAgIFRvbWNhdCBTaW1wbGUgTG9hZCBCYWxhbmNlciBFeGFtcGxlIEFwcAorICA8L2Rlc2NyaXB0aW9uPgorCisgIDwhLS0gQmFsYW5jZXJGaWx0ZXIgZGVmaW5pdGlvbiAtLT4KKyAgPGZpbHRlcj4KKyAgICA8ZmlsdGVyLW5hbWU+QmFsYW5jZXJGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgIDxmaWx0ZXItY2xhc3M+b3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIuQmFsYW5jZXJGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICA8aW5pdC1wYXJhbT4KKyAgICAgIDxwYXJhbS1uYW1lPmNvbmZpZ1VybDwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9jb25maWcvcnVsZXMueG1sPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgIDwvZmlsdGVyPgorCisgIDwhLS0gQmFsYW5jZXJGaWx0ZXIgbWFwcGluZyAtLT4KKyAgPGZpbHRlci1tYXBwaW5nPgorICAgIDxmaWx0ZXItbmFtZT5CYWxhbmNlckZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgPC9maWx0ZXItbWFwcGluZz4KKzwvd2ViLWFwcD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9idWlsZC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjNDVjOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL2J1aWxkLnhtbApAQCAtMCwwICsxLDExNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzwhLS0gCitUaGlzIGlzIHRoZSBidWlsZCBzY3JpcHQgZm9yIHRoZSBiYWxhbmNlciB3ZWJhcHAuCitAYXV0aG9yIFlvYXYgU2hhcGlyYQorLS0+CisKKzxwcm9qZWN0IG5hbWU9ImJhbGFuY2VyIiBkZWZhdWx0PSJidWlsZC1tYWluIiBiYXNlZGlyPSIuIj4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgUHJvcGVydHkgVmFsdWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPCEtLSBTZWUgImJ1aWxkLnByb3BlcnRpZXMuc2FtcGxlIiBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBmb3IgYWxsICAgICAtLT4KKyAgPCEtLSBwcm9wZXJ0eSB2YWx1ZXMgeW91IG11c3QgY3VzdG9taXplIGZvciBzdWNjZXNzZnVsIGJ1aWxkaW5nISEhICAgICAgICAtLT4KKyAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uL2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uLy4uL2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dXNlci5ob21lfS9idWlsZC5wcm9wZXJ0aWVzIi8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiAgdmFsdWU9Im1vZGVybiIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViYXBwcy5idWlsZCIgICB2YWx1ZT0iLi4vYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcHMuZGlzdCIgICAgdmFsdWU9Ii4uL2Rpc3QiLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcC5uYW1lIiAgICAgdmFsdWU9ImJhbGFuY2VyIi8+CisKKyAgPCEtLSBEZXBlbmRlbnQgSkFScyBhbmQgZmlsZXMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2bGV0LWFwaS5qYXIiIHZhbHVlPSIke2FwaS5ob21lfS9qc3IxNTQvZGlzdC9saWIvc2VydmxldC1hcGkuamFyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqc3AtYXBpLmphciIgICAgIHZhbHVlPSIke2FwaS5ob21lfS9qc3IxNTIvZGlzdC9saWIvanNwLWFwaS5qYXIiLz4KKworICA8IS0tIENvbXBpbGF0aW9uIGNsYXNzcGF0aCAtLT4KKyAgPHBhdGggaWQ9ImJhbGFuY2VyLmNsYXNzcGF0aCI+CisgICAgPCEtLSBSZXF1aXJlZCBieSBEaWdlc3RlciAtLT4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2F0YWxpbmEuZGVwbG95fS9jbGFzc2VzIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3NlcnZsZXQtYXBpLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sb2dnaW5nLWFwaS5qYXJ9IiAvPgorICA8L3BhdGg+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5idWlsZH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9pbWFnZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYiLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYvY2xhc3NlcyIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ29weSBTdGF0aWMgRmlsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtc3RhdGljIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlIj4KKyAgICA8Y29weSB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJidWlsZC4qIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT0gQlVJTEQ6IENvbXBpbGUgU2VydmVyIENvbXBvbmVudHMgPT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtbWFpbiIgZGVwZW5kcz0iYnVpbGQtc3RhdGljIj4KKworICAgIDxqYXZhYyAgIHNyY2Rpcj0iV0VCLUlORi9jbGFzc2VzIiAKKyAgICAgICAgICAgICBkZXN0ZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYvY2xhc3NlcyIKKyAgICAgICAgICAgICBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIgZGVwcmVjYXRpb249IiR7Y29tcGlsZS5kZXByZWNhdGlvbn0iCisgICAgICAgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iCisgICAgICAgICAgICAgZXhjbHVkZXM9IioqL0NWUy8qKiI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJiYWxhbmNlci5jbGFzc3BhdGgiIC8+CisgICAgPC9qYXZhYz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IFJlYnVpbGQgRXZlcnl0aGluZyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJidWlsZC1jbGVhbixidWlsZC1tYWluIgorICAgZGVzY3JpcHRpb249IkNsZWFuIGFuZCBidWlsZCBiYWxhbmNlciB3ZWJhcHAiLz4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENsZWFuIERpcmVjdG9yeSA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDcmVhdGUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0LXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5kaXN0fSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpc3RyaWJ1dGlvbiBGaWxlcyA9PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0iYnVpbGQtbWFpbixkaXN0LXByZXBhcmUiCisgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGJhbGFuY2VyIHdlYmFwcCBiaW5hcnkgZGlzdHJpYnV0aW9uIj4KKyAgICAgIDxqYXIgICBqYXJmaWxlPSIke3dlYmFwcHMuZGlzdH0vJHt3ZWJhcHAubmFtZX0ud2FyIgorICAgICAgICAgICAgIGJhc2VkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0iIGluY2x1ZGVzPSIqKiIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1jbGVhbiI+CisgICAgPGRlbHRyZWUgZGlyPSIke2Rpc3QuZGlyfS8ke3dlYmFwcC5uYW1lfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBDb252ZW5pZW50IFN5bm9ueW1zID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGRpc3QtY2xlYW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYnVpbGQgYW5kIGRpc3QgZGlyZWN0b3JpZXMiLz4KKworCisKKworPC9wcm9qZWN0PgorPCEtLSBFbmQgYnVpbGQueG1sIC0tPgorCisKKworCisKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYnVpbGQueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMzYzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9idWlsZC54bWwKQEAgLTAsMCArMSwxMzkgQEAKKzxwcm9qZWN0IG5hbWU9IldlYmFwcHMiIGRlZmF1bHQ9ImRpc3QiIGJhc2VkaXI9Ii4iPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSBQcm9wZXJ0eSBWYWx1ZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8IS0tIFNlZSAiYnVpbGQucHJvcGVydGllcy5zYW1wbGUiIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGZvciBhbGwgICAgIC0tPgorICA8IS0tIHByb3BlcnR5IHZhbHVlcyB5b3UgbXVzdCBjdXN0b21pemUgZm9yIHN1Y2Nlc3NmdWwgYnVpbGRpbmchISEgICAgICAgIC0tPgorICA8IS0tcHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iLi4vYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9L2J1aWxkLnByb3BlcnRpZXMiLy0tPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlciIgIHZhbHVlPSJtb2Rlcm4iLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcHMuYnVpbGQiICAgdmFsdWU9IiR7YmFzZWRpcn0vYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcHMuZGVwbG95IiAgdmFsdWU9IiR7YmFzZWRpcn0vLi4vYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcHMuZGlzdCIgICAgdmFsdWU9IiR7YmFzZWRpcn0vZGlzdCIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDcmVhdGUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1wcmVwYXJlIj4KKworICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UiIHByb3BlcnR5PSJqdW5pdC5wcmVzZW50IiAvPgorCisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfSIvPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5kaXN0fSIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDb21waWxlIFN1YnByb2plY3RzID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBBZGQgYSBuZXcgdGFyZ2V0IGZvciBlYWNoIHdlYmFwcCBzdWJwcm9qZWN0IC0tPgorCisgIDx0YXJnZXQgbmFtZT0iUk9PVCI+CisgICAgPGFudCBkaXI9IiR7YmFzZWRpcn0vUk9PVCIgdGFyZ2V0PSJkaXN0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iYWRtaW4iPgorICAgIDxhbnQgZGlyPSIke2Jhc2VkaXJ9L2FkbWluIiB0YXJnZXQ9ImRpc3QiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtYW5hZ2VyIj4KKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS9tYW5hZ2VyIiB0YXJnZXQ9ImRpc3QiLz4KKyAgPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9Imhvc3QtbWFuYWdlciI+CisJICAgIDxhbnQgZGlyPSIke2Jhc2VkaXJ9L2hvc3QtbWFuYWdlciIgdGFyZ2V0PSJkaXN0Ii8+CisJICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRvY3MiPgorICAgIDxhbnQgZGlyPSIke2Jhc2VkaXJ9L2RvY3MiIHRhcmdldD0iZGlzdCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImJhbGFuY2VyIj4KKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS9iYWxhbmNlciIgdGFyZ2V0PSJkaXN0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0id2ViZGF2Ij4KKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS93ZWJkYXYiIHRhcmdldD0iZGlzdCIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT0gQlVJTEQ6IENvbXBpbGUgU2VydmVyIENvbXBvbmVudHMgPT09PT09PT09PT09PT09PT0gLS0+CisgIDwhLS0gVXBkYXRlIHRoZSBkZXBlbmRzIGxpc3QgZm9yIGVhY2ggc3VicHJvamVjdCAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0iYnVpbGQtcHJlcGFyZSxST09ULGFkbWluLG1hbmFnZXIsaG9zdC1tYW5hZ2VyLGRvY3MsYmFsYW5jZXIsd2ViZGF2IiAvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7d2ViYXBwcy5idWlsZH0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBSZWJ1aWxkIEV2ZXJ5dGhpbmcgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iYnVpbGQtY2xlYW4sZGlzdCIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PSBERVBMT1k6IERlcGxveSBXZWJhcHBzIFByb2plY3RzID09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkZXBsb3kiIGRlcGVuZHM9ImRpc3QiCisgICBkZXNjcmlwdGlvbj0iQnVpbGQgYW5kIGRlcGxveSBXZWJhcHBzIGNvbXBvbmVudCI+CisKKyAgICA8IS0tIEdlbmVyYWwgUHVycG9zZSBBcHBsaWNhdGlvbnMgLS0+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmRlcGxveX0vd2ViYXBwcyIvPgorICAgIDxjb3B5IHRvZGlyPSIke3dlYmFwcHMuZGVwbG95fS93ZWJhcHBzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfSIgZXhjbHVkZXM9ImFkbWluLyoqLG1hbmFnZXIvKioiLz4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIEFkbWluaXN0cmF0aXZlIEFwcGxpY2F0aW9ucyAtLT4KKyAgICA8bWtkaXIgICAgIGRpcj0iJHt3ZWJhcHBzLmRlcGxveX0vc2VydmVyL3dlYmFwcHMiLz4KKworICAgIDxjb3B5ICAgIHRvZGlyPSIke3dlYmFwcHMuZGVwbG95fS93ZWJhcHBzIgorICAgICAgICAgICAgICBmaWxlPSIke3dlYmFwcHMuYnVpbGR9L2FkbWluL2FkbWluLnhtbCIvPgorICAgIDxta2RpciAgICAgZGlyPSIke3dlYmFwcHMuZGVwbG95fS9zZXJ2ZXIvd2ViYXBwcy9hZG1pbiIvPgorICAgIDxjb3B5ICAgIHRvZGlyPSIke3dlYmFwcHMuZGVwbG95fS9zZXJ2ZXIvd2ViYXBwcy9hZG1pbiI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7d2ViYXBwcy5idWlsZH0vYWRtaW4iIGV4Y2x1ZGVzPSJhZG1pbi54bWwiLz4KKyAgICA8L2NvcHk+CisKKyAgICA8Y29weSAgICB0b2Rpcj0iJHt3ZWJhcHBzLmRlcGxveX0vd2ViYXBwcyIKKyAgICAgICAgICAgICAgZmlsZT0iJHt3ZWJhcHBzLmJ1aWxkfS9tYW5hZ2VyL21hbmFnZXIueG1sIi8+CisgICAgPG1rZGlyICAgICBkaXI9IiR7d2ViYXBwcy5kZXBsb3l9L3NlcnZlci93ZWJhcHBzL21hbmFnZXIiLz4KKyAgICA8Y29weSAgICB0b2Rpcj0iJHt3ZWJhcHBzLmRlcGxveX0vc2VydmVyL3dlYmFwcHMvbWFuYWdlciI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7d2ViYXBwcy5idWlsZH0vbWFuYWdlciIgZXhjbHVkZXM9Im1hbmFnZXIueG1sIi8+CisgICAgPC9jb3B5PgorCisgICAgPGNvcHkgICAgdG9kaXI9IiR7d2ViYXBwcy5kZXBsb3l9L3dlYmFwcHMiCisgICAgICAgICAgICAgIGZpbGU9IiR7d2ViYXBwcy5idWlsZH0vaG9zdC1tYW5hZ2VyL2hvc3QtbWFuYWdlci54bWwiLz4KKyAgICA8bWtkaXIgICAgIGRpcj0iJHt3ZWJhcHBzLmRlcGxveX0vc2VydmVyL3dlYmFwcHMvaG9zdC1tYW5hZ2VyIi8+CisgICAgPGNvcHkgICAgdG9kaXI9IiR7d2ViYXBwcy5kZXBsb3l9L3NlcnZlci93ZWJhcHBzL2hvc3QtbWFuYWdlciI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7d2ViYXBwcy5idWlsZH0vaG9zdC1tYW5hZ2VyIiBleGNsdWRlcz0iaG9zdC1tYW5hZ2VyLnhtbCIvPgorICAgIDwvY29weT4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpc3RyaWJ1dGlvbiBGaWxlcyA9PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0iYnVpbGQiLz4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7d2ViYXBwcy5kaXN0fSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBDb252ZW5pZW50IFN5bm9ueW1zID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGRpc3QtY2xlYW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYnVpbGQgYW5kIGRpc3QgZGlyZWN0b3JpZXMiLz4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IFRFU1Q6IENvbXBpbGUgVW5pdCBUZXN0cyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtdGVzdHMiIGRlcGVuZHM9ImRpc3QiIGlmPSJqdW5pdC5wcmVzZW50Ij4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBURVNUOiBFeGVjdXRlIFVuaXQgVGVzdHMgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3QiIGlmPSJqdW5pdC5wcmVzZW50IgorICAgZGVzY3JpcHRpb249IlJ1biBhbGwgdW5pdCB0ZXN0IGNhc2VzIj4KKyAgPC90YXJnZXQ+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9NRVRBLUlORi9jb250ZXh0LnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvTUVUQS1JTkYvY29udGV4dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRjYmM0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvTUVUQS1JTkYvY29udGV4dC54bWwKQEAgLTAsMCArMSwxMiBAQAorPCEtLQorCisgICAgQ29udGV4dCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBUb21jYXQgQmFsYW5jZXIgV2ViIEFwcAorICAgIFRoaXMgaXMgb25seSBuZWVkZWQgdG8ga2VlcCB0aGUgZGlzdHJpYnV0aW9uIHNtYWxsIGFuZCBhdm9pZCBkdXBsaWNhdGluZworICAgIGNvbW1vbnMgbGlicmFyaWVzCisKKyAgICAkSWQkCisKKy0tPgorCisKKzxDb250ZXh0IGFudGlSZXNvdXJjZUxvY2tpbmc9ImZhbHNlIiAvPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9XRUItSU5GL3dlYi54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2M1MzdkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwxMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCisgICAgdmVyc2lvbj0iMi40Ij4KKworICA8ZGlzcGxheS1uYW1lPlRvbWNhdCBEb2N1bWVudGF0aW9uPC9kaXNwbGF5LW5hbWU+CisgIDxkZXNjcmlwdGlvbj4KKyAgICAgVG9tY2F0IERvY3VtZW50YXRpb24uCisgIDwvZGVzY3JpcHRpb24+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9idWlsZC54bWwudHh0IGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvYnVpbGQueG1sLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjM1YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvYnVpbGQueG1sLnR4dApAQCAtMCwwICsxLDUwMyBAQAorPCEtLQorICAgICBHZW5lcmFsIHB1cnBvc2UgYnVpbGQgc2NyaXB0IGZvciB3ZWIgYXBwbGljYXRpb25zIGFuZCB3ZWIgc2VydmljZXMsCisgICAgIGluY2x1ZGluZyBlbmhhbmNlZCBzdXBwb3J0IGZvciBkZXBsb3lpbmcgZGlyZWN0bHkgdG8gYSBUb21jYXQgNQorICAgICBiYXNlZCBzZXJ2ZXIuCisKKyAgICAgVGhpcyBidWlsZCBzY3JpcHQgYXNzdW1lcyB0aGF0IHRoZSBzb3VyY2UgY29kZSBvZiB5b3VyIHdlYiBhcHBsaWNhdGlvbgorICAgICBpcyBvcmdhbml6ZWQgaW50byB0aGUgZm9sbG93aW5nIHN1YmRpcmVjdG9yaWVzIHVuZGVybmVhdGggdGhlIHNvdXJjZQorICAgICBjb2RlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHlvdSBleGVjdXRlIHRoZSBidWlsZCBzY3JpcHQ6CisKKyAgICAgICAgZG9jcyAgICAgICAgICAgICAgICAgU3RhdGljIGRvY3VtZW50YXRpb24gZmlsZXMgdG8gYmUgY29waWVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSAiZG9jcyIgc3ViZGlyZWN0b3J5IG9mIHlvdXIgZGlzdHJpYnV0aW9uLgorCisgICAgICAgIHNyYyAgICAgICAgICAgICAgICAgIEphdmEgc291cmNlIGNvZGUgKGFuZCBhc3NvY2lhdGVkIHJlc291cmNlIGZpbGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjb21waWxlZCB0byB0aGUgIldFQi1JTkYvY2xhc3NlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZGlyZWN0b3J5IG9mIHlvdXIgd2ViIGFwcGxpY2FpdG9uLgorCisgICAgICAgIHdlYiAgICAgICAgICAgICAgICAgIFN0YXRpYyBIVE1MLCBKU1AsIGFuZCBvdGhlciBjb250ZW50IChzdWNoIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGZpbGVzKSwgaW5jbHVkaW5nIHRoZSBXRUItSU5GIHN1YmRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgaXRzIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250ZW50cy4KKworICAgICAkSWQkCistLT4KKworCis8IS0tIEEgInByb2plY3QiIGRlc2NyaWJlcyBhIHNldCBvZiB0YXJnZXRzIHRoYXQgbWF5IGJlIHJlcXVlc3RlZAorICAgICB3aGVuIEFudCBpcyBleGVjdXRlZC4gIFRoZSAiZGVmYXVsdCIgYXR0cmlidXRlIGRlZmluZXMgdGhlCisgICAgIHRhcmdldCB3aGljaCBpcyBleGVjdXRlZCBpZiBubyBzcGVjaWZpYyB0YXJnZXQgaXMgcmVxdWVzdGVkLAorICAgICBhbmQgdGhlICJiYXNlZGlyIiBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQorICAgICBmcm9tIHdoaWNoIEFudCBleGVjdXRlcyB0aGUgcmVxdWVzdGVkIHRhc2suICBUaGlzIGlzIG5vcm1hbGx5CisgICAgIHNldCB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJNeSBQcm9qZWN0IiBkZWZhdWx0PSJjb21waWxlIiBiYXNlZGlyPSIuIj4KKworCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09IFByb3BlcnR5IERlZmluaXRpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworCis8IS0tCisKKyAgRWFjaCBvZiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIHVzZWQgaW4gdGhlIGJ1aWxkIHNjcmlwdC4KKyAgVmFsdWVzIGZvciB0aGVzZSBwcm9wZXJ0aWVzIGFyZSBzZXQgYnkgdGhlIGZpcnN0IHBsYWNlIHRoZXkgYXJlCisgIGRlZmluZWQsIGZyb20gdGhlIGZvbGxvd2luZyBsaXN0OgorCisgICogRGVmaW5pdGlvbnMgb24gdGhlICJhbnQiIGNvbW1hbmQgbGluZSAoYW50IC1EZm9vPWJhciBjb21waWxlKS4KKworICAqIERlZmluaXRpb25zIGZyb20gYSAiYnVpbGQucHJvcGVydGllcyIgZmlsZSBpbiB0aGUgdG9wIGxldmVsCisgICAgc291cmNlIGRpcmVjdG9yeSBvZiB0aGlzIGFwcGxpY2F0aW9uLgorCisgICogRGVmaW5pdGlvbnMgZnJvbSBhICJidWlsZC5wcm9wZXJ0aWVzIiBmaWxlIGluIHRoZSBkZXZlbG9wZXIncworICAgIGhvbWUgZGlyZWN0b3J5LgorCisgICogRGVmYXVsdCBkZWZpbml0aW9ucyBpbiB0aGlzIGJ1aWxkLnhtbCBmaWxlLgorCisgIFlvdSB3aWxsIG5vdGUgYmVsb3cgdGhhdCBwcm9wZXJ0eSB2YWx1ZXMgY2FuIGJlIGNvbXBvc2VkIGJhc2VkIG9uIHRoZQorICBjb250ZW50cyBvZiBwcmV2aW91c2x5IGRlZmluZWQgcHJvcGVydGllcy4gIFRoaXMgaXMgYSBwb3dlcmZ1bCB0ZWNobmlxdWUKKyAgdGhhdCBoZWxwcyB5b3UgbWluaW1pemUgdGhlIG51bWJlciBvZiBjaGFuZ2VzIHJlcXVpcmVkIHdoZW4geW91ciBkZXZlbG9wbWVudAorICBlbnZpcm9ubWVudCBpcyBtb2RpZmllZC4gIE5vdGUgdGhhdCBwcm9wZXJ0eSBjb21wb3NpdGlvbiBpcyBhbGxvd2VkIHdpdGhpbgorICAiYnVpbGQucHJvcGVydGllcyIgZmlsZXMgYXMgd2VsbCBhcyBpbiB0aGUgImJ1aWxkLnhtbCIgc2NyaXB0LgorCistLT4KKworICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9L2J1aWxkLnByb3BlcnRpZXMiLz4KKworCis8IS0tID09PT09PT09PT09PT09PT09PT09IEZpbGUgYW5kIERpcmVjdG9yeSBOYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKworPCEtLQorCisgIFRoZXNlIHByb3BlcnRpZXMgZ2VuZXJhbGx5IGRlZmluZSBmaWxlIGFuZCBkaXJlY3RvcnkgbmFtZXMgKG9yIHBhdGhzKSB0aGF0CisgIGFmZmVjdCB3aGVyZSB0aGUgYnVpbGQgcHJvY2VzcyBzdG9yZXMgaXRzIG91dHB1dHMuCisKKyAgYXBwLm5hbWUgICAgICAgICAgICAgQmFzZSBuYW1lIG9mIHRoaXMgYXBwbGljYXRpb24sIHVzZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0IGZpbGVuYW1lcyBhbmQgZGlyZWN0b3JpZXMuCisgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvICJteWFwcCIuCisKKyAgYXBwLnBhdGggICAgICAgICAgICAgQ29udGV4dCBwYXRoIHRvIHdoaWNoIHRoaXMgYXBwbGljYXRpb24gc2hvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveWVkIChkZWZhdWx0cyB0byAiLyIgcGx1cyB0aGUgdmFsdWUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICJhcHAubmFtZSIgcHJvcGVydHkpLgorCisgIGFwcC52ZXJzaW9uICAgICAgICAgIFZlcnNpb24gbnVtYmVyIG9mIHRoaXMgaXRlcmF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbi4KKworICBidWlsZC5ob21lICAgICAgICAgICBUaGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlICJwcmVwYXJlIiBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgImNvbXBpbGUiIHRhcmdldHMgd2lsbCBnZW5lcmF0ZSB0aGVpciBvdXRwdXQuCisgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvICJidWlsZCIuCisKKyAgY2F0YWxpbmEuaG9tZSAgICAgICAgVGhlIGRpcmVjdG9yeSBpbiB3aGljaCB5b3UgaGF2ZSBpbnN0YWxsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIFRvbWNhdCA1LiAgVGhpcyB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgYnkgdGhlICJkZXBsb3kiIHRhcmdldC4KKworICBkaXN0LmhvbWUgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYmFzZSBkaXJlY3RvcnkgaW4gd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uIGZpbGVzIGFyZSBjcmVhdGVkLgorICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byAiZGlzdCIuCisKKyAgbWFuYWdlci5wYXNzd29yZCAgICAgVGhlIGxvZ2luIHBhc3N3b3JkIG9mIGEgdXNlciB0aGF0IGlzIGFzc2lnbmVkIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAibWFuYWdlciIgcm9sZSAoc28gdGhhdCBoZSBvciBzaGUgY2FuIGV4ZWN1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMgdmlhIHRoZSAiL21hbmFnZXIiIHdlYiBhcHBsaWNhdGlvbikKKworICBtYW5hZ2VyLnVybCAgICAgICAgICBUaGUgVVJMIG9mIHRoZSAiL21hbmFnZXIiIHdlYiBhcHBsaWNhdGlvbiBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgVG9tY2F0IGluc3RhbGxhdGlvbiB0byB3aGljaCB3ZSB3aWxsIGRlcGxveSB3ZWIKKyAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25zIGFuZCB3ZWIgc2VydmljZXMuCisKKyAgbWFuYWdlci51c2VybmFtZSAgICAgVGhlIGxvZ2luIHVzZXJuYW1lIG9mIGEgdXNlciB0aGF0IGlzIGFzc2lnbmVkIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAibWFuYWdlciIgcm9sZSAoc28gdGhhdCBoZSBvciBzaGUgY2FuIGV4ZWN1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMgdmlhIHRoZSAiL21hbmFnZXIiIHdlYiBhcHBsaWNhdGlvbikKKworLS0+CisKKyAgPHByb3BlcnR5IG5hbWU9ImFwcC5uYW1lIiAgICAgIHZhbHVlPSJteWFwcCIvPgorICA8cHJvcGVydHkgbmFtZT0iYXBwLnBhdGgiICAgICAgdmFsdWU9Ii8ke2FwcC5uYW1lfSIvPgorICA8cHJvcGVydHkgbmFtZT0iYXBwLnZlcnNpb24iICAgdmFsdWU9IjAuMS1kZXYiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmhvbWUiICAgIHZhbHVlPSIke2Jhc2VkaXJ9L2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5ob21lIiB2YWx1ZT0iLi4vLi4vLi4vLi4iLz4gPCEtLSBVUERBVEUgVEhJUyEgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmhvbWUiICAgICB2YWx1ZT0iJHtiYXNlZGlyfS9kaXN0Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkb2NzLmhvbWUiICAgICB2YWx1ZT0iJHtiYXNlZGlyfS9kb2NzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJtYW5hZ2VyLnVybCIgICB2YWx1ZT0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9InNyYy5ob21lIiAgICAgIHZhbHVlPSIke2Jhc2VkaXJ9L3NyYyIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViLmhvbWUiICAgICAgdmFsdWU9IiR7YmFzZWRpcn0vd2ViIi8+CisKKworPCEtLSA9PT09PT09PT09PT09PT09PT0gQ3VzdG9tIEFudCBUYXNrIERlZmluaXRpb25zID09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisKKzwhLS0KKworICBUaGVzZSBwcm9wZXJ0aWVzIGRlZmluZSBjdXN0b20gdGFza3MgZm9yIHRoZSBBbnQgYnVpbGQgdG9vbCB0aGF0IGludGVyYWN0CisgIHdpdGggdGhlICIvbWFuYWdlciIgd2ViIGFwcGxpY2F0aW9uIGluc3RhbGxlZCB3aXRoIFRvbWNhdCA1LiAgQmVmb3JlIHRoZXkKKyAgY2FuIGJlIHN1Y2Nlc3NmdWxseSB1dGlsaXplZCwgeW91IG11c3QgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzOgorCisgIC0gQ29weSB0aGUgZmlsZSAic2VydmVyL2xpYi9jYXRhbGluYS1hbnQuamFyIiBmcm9tIHlvdXIgVG9tY2F0IDUKKyAgICBpbnN0YWxsYXRpb24gaW50byB0aGUgImxpYiIgZGlyZWN0b3J5IG9mIHlvdXIgQW50IGluc3RhbGxhdGlvbi4KKworICAtIENyZWF0ZSBhICJidWlsZC5wcm9wZXJ0aWVzIiBmaWxlIGluIHlvdXIgYXBwbGljYXRpb24ncyB0b3AtbGV2ZWwKKyAgICBzb3VyY2UgZGlyZWN0b3J5IChvciB5b3VyIHVzZXIgbG9naW4gaG9tZSBkaXJlY3RvcnkpIHRoYXQgZGVmaW5lcworICAgIGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgdGhlICJtYW5hZ2VyLnBhc3N3b3JkIiwgIm1hbmFnZXIudXJsIiwgYW5kCisgICAgIm1hbmFnZXIudXNlcm5hbWUiIHByb3BlcnRpZXMgZGVzY3JpYmVkIGFib3ZlLgorCisgIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBNYW5hZ2VyIHdlYiBhcHBsaWNhdGlvbiwgYW5kIHRoZSBmdW5jdGlvbmFsaXR5CisgIG9mIHRoZXNlIHRhc2tzLCBzZWUgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC90b21jYXQtZG9jcy9tYW5hZ2VyLWhvd3RvLmh0bWw+LgorCistLT4KKworICA8dGFza2RlZiBuYW1lPSJkZXBsb3kiICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5EZXBsb3lUYXNrIi8+CisgIDx0YXNrZGVmIG5hbWU9Imxpc3QiICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50Lkxpc3RUYXNrIi8+CisgIDx0YXNrZGVmIG5hbWU9InJlbG9hZCIgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LlJlbG9hZFRhc2siLz4KKyAgPHRhc2tkZWYgbmFtZT0idW5kZXBsb3kiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuVW5kZXBsb3lUYXNrIi8+CisKKworPCEtLSAgPT09PT09PT09PT09PT09PT09PT0gQ29tcGlsYXRpb24gQ29udHJvbCBPcHRpb25zID09PT09PT09PT09PT09PT09PT09IC0tPgorCis8IS0tCisKKyAgVGhlc2UgcHJvcGVydGllcyBjb250cm9sIG9wdGlvbiBzZXR0aW5ncyBvbiB0aGUgSmF2YWMgY29tcGlsZXIgd2hlbiBpdAorICBpcyBpbnZva2VkIHVzaW5nIHRoZSA8amF2YWM+IHRhc2suCisKKyAgY29tcGlsZS5kZWJ1ZyAgICAgICAgU2hvdWxkIGNvbXBpbGF0aW9uIGluY2x1ZGUgdGhlIGRlYnVnIG9wdGlvbj8KKworICBjb21waWxlLmRlcHJlY2F0aW9uICBTaG91bGQgY29tcGlsYXRpb24gaW5jbHVkZSB0aGUgZGVwcmVjYXRpb24gb3B0aW9uPworCisgIGNvbXBpbGUub3B0aW1pemUgICAgIFNob3VsZCBjb21waWxhdGlvbiBpbmNsdWRlIHRoZSBvcHRpbWl6ZSBvcHRpb24/CisKKy0tPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLmRlYnVnIiAgICAgICB2YWx1ZT0idHJ1ZSIvPgorICA8cHJvcGVydHkgbmFtZT0iY29tcGlsZS5kZXByZWNhdGlvbiIgdmFsdWU9ImZhbHNlIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLm9wdGltaXplIiAgICB2YWx1ZT0idHJ1ZSIvPgorCisKKworPCEtLSA9PT09PT09PT09PT09PT09PT09PSBFeHRlcm5hbCBEZXBlbmRlbmNpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisKKzwhLS0KKworICBVc2UgcHJvcGVydHkgdmFsdWVzIHRvIGRlZmluZSB0aGUgbG9jYXRpb25zIG9mIGV4dGVybmFsIEpBUiBmaWxlcyBvbiB3aGljaAorICB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgZGVwZW5kLiAgSW4gZ2VuZXJhbCwgdGhlc2UgdmFsdWVzIHdpbGwgYmUgdXNlZCBmb3IKKyAgdHdvIHB1cnBvc2VzOgorICAqIEluY2x1c2lvbiBvbiB0aGUgY2xhc3NwYXRoIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBKYXZhYyBjb21waWxlcgorICAqIEJlaW5nIGNvcGllZCBpbnRvIHRoZSAiL1dFQi1JTkYvbGliIiBkaXJlY3RvcnkgZHVyaW5nIGV4ZWN1dGlvbgorICAgIG9mIHRoZSAiZGVwbG95IiB0YXJnZXQuCisKKyAgQmVjYXVzZSB3ZSB3aWxsIGF1dG9tYXRpY2FsbHkgaW5jbHVkZSBhbGwgb2YgdGhlIEphdmEgY2xhc3NlcyB0aGF0IFRvbWNhdCA1CisgIGV4cG9zZXMgdG8gd2ViIGFwcGxpY2F0aW9ucywgd2Ugd2lsbCBub3QgbmVlZCB0byBleHBsaWNpdGx5IGxpc3QgYW55IG9mIHRob3NlCisgIGRlcGVuZGVuY2llcy4gIFlvdSBvbmx5IG5lZWQgdG8gd29ycnkgYWJvdXQgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGZvciBKQVIKKyAgZmlsZXMgdGhhdCB5b3UgYXJlIGdvaW5nIHRvIGluY2x1ZGUgaW5zaWRlIHlvdXIgIi9XRUItSU5GL2xpYiIgZGlyZWN0b3J5LgorCistLT4KKworPCEtLSBEdW1teSBleHRlcm5hbCBkZXBlbmRlbmN5IC0tPgorPCEtLQorICA8cHJvcGVydHkgbmFtZT0iZm9vLmphciIKKyAgICAgICAgICAgdmFsdWU9Ii9wYXRoL3RvL2Zvby5qYXIiLz4KKy0tPgorCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT0gQ29tcGlsYXRpb24gQ2xhc3NwYXRoID09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPCEtLQorCisgIFJhdGhlciB0aGFuIHJlbHlpbmcgb24gdGhlIENMQVNTUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgQW50IGluY2x1ZGVzCisgIGZlYXR1cmVzIHRoYXQgbWFrZXMgaXQgZWFzeSB0byBkeW5hbWljYWxseSBjb25zdHJ1Y3QgdGhlIGNsYXNzcGF0aCB5b3UKKyAgbmVlZCBmb3IgZWFjaCBjb21waWxhdGlvbi4gIFRoZSBleGFtcGxlIGJlbG93IGNvbnN0cnVjdHMgdGhlIGNvbXBpbGUKKyAgY2xhc3NwYXRoIHRvIGluY2x1ZGUgdGhlIHNlcnZsZXQuamFyIGZpbGUsIGFzIHdlbGwgYXMgdGhlIG90aGVyIGNvbXBvbmVudHMKKyAgdGhhdCBUb21jYXQgbWFrZXMgYXZhaWxhYmxlIHRvIHdlYiBhcHBsaWNhdGlvbnMgYXV0b21hdGljYWxseSwgcGx1cyBhbnl0aGluZworICB0aGF0IHlvdSBleHBsaWNpdGx5IGFkZGVkLgorCistLT4KKworICA8cGF0aCBpZD0iY29tcGlsZS5jbGFzc3BhdGgiPgorCisgICAgPCEtLSBJbmNsdWRlIGFsbCBKQVIgZmlsZXMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIC9XRUItSU5GL2xpYiAtLT4KKyAgICA8IS0tICoqKiBDVVNUT01JWkUgSEVSRSBBUyBSRVFVSVJFRCBCWSBZT1VSIEFQUExJQ0FUSU9OICoqKiAtLT4KKzwhLS0KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Zm9vLmphcn0iLz4KKy0tPgorCisgICAgPCEtLSBJbmNsdWRlIGFsbCBlbGVtZW50cyB0aGF0IFRvbWNhdCBleHBvc2VzIHRvIGFwcGxpY2F0aW9ucyAtLT4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2NsYXNzZXMiLz4KKyAgICA8ZmlsZXNldCBkaXI9IiR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2VuZG9yc2VkIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+CisgICAgPC9maWxlc2V0PgorICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5ob21lfS9jb21tb24vbGliIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+CisgICAgPC9maWxlc2V0PgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjYXRhbGluYS5ob21lfS9zaGFyZWQvY2xhc3NlcyIvPgorICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5ob21lfS9zaGFyZWQvbGliIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+CisgICAgPC9maWxlc2V0PgorCisgIDwvcGF0aD4KKworCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT0gQWxsIFRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPCEtLQorCisgIFRoZSAiYWxsIiB0YXJnZXQgaXMgYSBzaG9ydGN1dCBmb3IgcnVubmluZyB0aGUgImNsZWFuIiB0YXJnZXQgZm9sbG93ZWQKKyAgYnkgdGhlICJjb21waWxlIiB0YXJnZXQsIHRvIGZvcmNlIGEgY29tcGxldGUgcmVjb21waWxlLgorCistLT4KKworICA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iY2xlYW4sY29tcGlsZSIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiBidWlsZCBhbmQgZGlzdCBkaXJlY3RvcmllcywgdGhlbiBjb21waWxlIi8+CisKKworCis8IS0tID09PT09PT09PT09PT09PT09PT09IENsZWFuIFRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzwhLS0KKworICBUaGUgImNsZWFuIiB0YXJnZXQgZGVsZXRlcyBhbnkgcHJldmlvdXMgImJ1aWxkIiBhbmQgImRpc3QiIGRpcmVjdG9yeSwKKyAgc28gdGhhdCB5b3UgY2FuIGJlIGVuc3VyZWQgdGhlIGFwcGxpY2F0aW9uIGNhbiBiZSBidWlsdCBmcm9tIHNjcmF0Y2guCisKKy0tPgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iCisgICBkZXNjcmlwdGlvbj0iRGVsZXRlIG9sZCBidWlsZCBhbmQgZGlzdCBkaXJlY3RvcmllcyI+CisgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuaG9tZX0iLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0LmhvbWV9Ii8+CisgIDwvdGFyZ2V0PgorCisKKworPCEtLSA9PT09PT09PT09PT09PT09PT09PSBDb21waWxlIFRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8IS0tCisKKyAgVGhlICJjb21waWxlIiB0YXJnZXQgdHJhbnNmb3JtcyBzb3VyY2UgZmlsZXMgKGZyb20geW91ciAic3JjIiBkaXJlY3RvcnkpCisgIGludG8gb2JqZWN0IGZpbGVzIGluIHRoZSBhcHByb3ByaWF0ZSBsb2NhdGlvbiBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorICBUaGlzIGV4YW1wbGUgYXNzdW1lcyB0aGF0IHlvdSB3aWxsIGJlIGluY2x1ZGluZyB5b3VyIGNsYXNzZXMgaW4gYW4KKyAgdW5wYWNrZWQgZGlyZWN0b3J5IGhpZXJhcmNoeSB1bmRlciAiL1dFQi1JTkYvY2xhc3NlcyIuCisKKy0tPgorCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0icHJlcGFyZSIKKyAgIGRlc2NyaXB0aW9uPSJDb21waWxlIEphdmEgc291cmNlcyI+CisKKyAgICA8IS0tIENvbXBpbGUgSmF2YSBjbGFzc2VzIGFzIG5lY2Vzc2FyeSAtLT4KKyAgICA8bWtkaXIgICAgZGlyPSIke2J1aWxkLmhvbWV9L1dFQi1JTkYvY2xhc3NlcyIvPgorICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLmhvbWV9IgorICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuaG9tZX0vV0VCLUlORi9jbGFzc2VzIgorICAgICAgICAgICAgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iCisgICAgICBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKyAgICAgICAgIG9wdGltaXplPSIke2NvbXBpbGUub3B0aW1pemV9Ij4KKyAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY29tcGlsZS5jbGFzc3BhdGgiLz4KKyAgICA8L2phdmFjPgorCisgICAgPCEtLSBDb3B5IGFwcGxpY2F0aW9uIHJlc291cmNlcyAtLT4KKyAgICA8Y29weSAgdG9kaXI9IiR7YnVpbGQuaG9tZX0vV0VCLUlORi9jbGFzc2VzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuaG9tZX0iIGV4Y2x1ZGVzPSIqKi8qLmphdmEiLz4KKyAgICA8L2NvcHk+CisKKyAgPC90YXJnZXQ+CisKKworCis8IS0tID09PT09PT09PT09PT09PT09PT09IERpc3QgVGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKworPCEtLQorCisgIFRoZSAiZGlzdCIgdGFyZ2V0IGNyZWF0ZXMgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIHlvdXIgYXBwbGljYXRpb24KKyAgaW4gYSBkaXJlY3Rvcnkgc3RydWN0dXJlIHJlYWR5IHRvIGJlIGFyY2hpdmVkIGluIGEgdGFyLmd6IG9yIHppcCBmaWxlLgorICBOb3RlIHRoYXQgdGhpcyB0YXJnZXQgZGVwZW5kcyBvbiB0d28gb3RoZXJzOgorCisgICogImNvbXBpbGUiIHNvIHRoYXQgdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24gKGluY2x1ZGluZyBleHRlcm5hbAorICAgIGRlcGVuZGVuY2llcykgd2lsbCBoYXZlIGJlZW4gYXNzZW1ibGVkCisKKyAgKiAiamF2YWRvYyIgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gSmF2YWRvY3Mgd2lsbCBoYXZlIGJlZW4gY3JlYXRlZAorCistLT4KKworICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImNvbXBpbGUsamF2YWRvYyIKKyAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiI+CisKKyAgICA8IS0tIENvcHkgZG9jdW1lbnRhdGlvbiBzdWJkaXJlY3RvcmllcyAtLT4KKyAgICA8bWtkaXIgICBkaXI9IiR7ZGlzdC5ob21lfS9kb2NzIi8+CisgICAgPGNvcHkgICAgdG9kaXI9IiR7ZGlzdC5ob21lfS9kb2NzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtkb2NzLmhvbWV9Ii8+CisgICAgPC9jb3B5PgorCisgICAgPCEtLSBDcmVhdGUgYXBwbGljYXRpb24gSkFSIGZpbGUgLS0+CisgICAgPGphciBqYXJmaWxlPSIke2Rpc3QuaG9tZX0vJHthcHAubmFtZX0tJHthcHAudmVyc2lvbn0ud2FyIgorICAgICAgICAgYmFzZWRpcj0iJHtidWlsZC5ob21lfSIvPgorCisgICAgPCEtLSBDb3B5IGFkZGl0aW9uYWwgZmlsZXMgdG8gJHtkaXN0LmhvbWV9IGFzIG5lY2Vzc2FyeSAtLT4KKworICA8L3RhcmdldD4KKworCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT0gSW5zdGFsbCBUYXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPCEtLQorCisgIFRoZSAiaW5zdGFsbCIgdGFyZ2V0IHRlbGxzIHRoZSBzcGVjaWZpZWQgVG9tY2F0IDUgaW5zdGFsbGF0aW9uIHRvIGR5bmFtaWNhbGx5CisgIGluc3RhbGwgdGhpcyB3ZWIgYXBwbGljYXRpb24gYW5kIG1ha2UgaXQgYXZhaWxhYmxlIGZvciBleGVjdXRpb24uICBJdCBkb2VzCisgICpub3QqIGNhdXNlIHRoZSBleGlzdGVuY2Ugb2YgdGhpcyB3ZWIgYXBwbGljYXRpb24gdG8gYmUgcmVtZW1iZXJlZCBhY3Jvc3MKKyAgVG9tY2F0IHJlc3RhcnRzOyBpZiB5b3UgcmVzdGFydCB0aGUgc2VydmVyLCB5b3Ugd2lsbCBuZWVkIHRvIHJlLWluc3RhbGwgYWxsCisgIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorCisgIElmIHlvdSBoYXZlIGFscmVhZHkgaW5zdGFsbGVkIHRoaXMgYXBwbGljYXRpb24sIGFuZCBzaW1wbHkgd2FudCBUb21jYXQgdG8KKyAgcmVjb2duaXplIHRoYXQgeW91IGhhdmUgdXBkYXRlZCBKYXZhIGNsYXNzZXMgKG9yIHRoZSB3ZWIueG1sIGZpbGUpLCB1c2UgdGhlCisgICJyZWxvYWQiIHRhcmdldCBpbnN0ZWFkLgorCisgIE5PVEU6ICBUaGlzIHRhcmdldCB3aWxsIG9ubHkgc3VjY2VlZCBpZiBpdCBpcyBydW4gZnJvbSB0aGUgc2FtZSBzZXJ2ZXIgdGhhdAorICBUb21jYXQgaXMgcnVubmluZyBvbi4KKworICBOT1RFOiAgVGhpcyBpcyB0aGUgbG9naWNhbCBvcHBvc2l0ZSBvZiB0aGUgInJlbW92ZSIgdGFyZ2V0LgorCistLT4KKworICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwiIGRlcGVuZHM9ImNvbXBpbGUiCisgICBkZXNjcmlwdGlvbj0iSW5zdGFsbCBhcHBsaWNhdGlvbiB0byBzZXJ2bGV0IGNvbnRhaW5lciI+CisKKyAgICA8ZGVwbG95IHVybD0iJHttYW5hZ2VyLnVybH0iCisgICAgICAgdXNlcm5hbWU9IiR7bWFuYWdlci51c2VybmFtZX0iCisgICAgICAgcGFzc3dvcmQ9IiR7bWFuYWdlci5wYXNzd29yZH0iCisgICAgICAgICAgIHBhdGg9IiR7YXBwLnBhdGh9IgorICAgICAgIGxvY2FsV2FyPSJmaWxlOi8vJHtidWlsZC5ob21lfSIvPgorCisgIDwvdGFyZ2V0PgorCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT0gSmF2YWRvYyBUYXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPCEtLQorCisgIFRoZSAiamF2YWRvYyIgdGFyZ2V0IGNyZWF0ZXMgSmF2YWRvYyBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEphdmEKKyAgY2xhc3NlcyBpbmNsdWRlZCBpbiB5b3VyIGFwcGxpY2F0aW9uLiAgTm9ybWFsbHksIHRoaXMgaXMgb25seSByZXF1aXJlZAorICB3aGVuIHByZXBhcmluZyBhIGRpc3RyaWJ1dGlvbiByZWxlYXNlLCBidXQgaXMgYXZhaWxhYmxlIGFzIGEgc2VwYXJhdGUKKyAgdGFyZ2V0IGluIGNhc2UgdGhlIGRldmVsb3BlciB3YW50cyB0byBjcmVhdGUgSmF2YWRvY3MgaW5kZXBlbmRlbnRseS4KKworLS0+CisKKyAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIiBkZXBlbmRzPSJjb21waWxlIgorICAgZGVzY3JpcHRpb249IkNyZWF0ZSBKYXZhZG9jIEFQSSBkb2N1bWVudGF0aW9uIj4KKworICAgIDxta2RpciAgICAgICAgICBkaXI9IiR7ZGlzdC5ob21lfS9kb2NzL2FwaSIvPgorICAgIDxqYXZhZG9jIHNvdXJjZXBhdGg9IiR7c3JjLmhvbWV9IgorICAgICAgICAgICAgICAgIGRlc3RkaXI9IiR7ZGlzdC5ob21lfS9kb2NzL2FwaSIKKyAgICAgICAgICAgcGFja2FnZW5hbWVzPSIqIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIi8+CisgICAgPC9qYXZhZG9jPgorCisgIDwvdGFyZ2V0PgorCisKKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IExpc3QgVGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8IS0tCisKKyAgVGhlICJsaXN0IiB0YXJnZXQgYXNrcyB0aGUgc3BlY2lmaWVkIFRvbWNhdCA1IGluc3RhbGxhdGlvbiB0byBsaXN0IHRoZQorICBjdXJyZW50bHkgcnVubmluZyB3ZWIgYXBwbGljYXRpb25zLCBlaXRoZXIgbG9hZGVkIGF0IHN0YXJ0dXAgdGltZSBvcgorICBpbnN0YWxsZWQgZHluYW1pY2FsbHkuICBJdCBpcyB1c2VmdWwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZQorICBhcHBsaWNhdGlvbiB5b3UgYXJlIGN1cnJlbnRseSBkZXZlbG9waW5nIGhhcyBiZWVuIGluc3RhbGxlZC4KKworLS0+CisKKyAgPHRhcmdldCBuYW1lPSJsaXN0IgorICAgZGVzY3JpcHRpb249Ikxpc3QgaW5zdGFsbGVkIGFwcGxpY2F0aW9ucyBvbiBzZXJ2bGV0IGNvbnRhaW5lciI+CisKKyAgICA8bGlzdCAgICB1cmw9IiR7bWFuYWdlci51cmx9IgorICAgICAgICB1c2VybmFtZT0iJHttYW5hZ2VyLnVzZXJuYW1lfSIKKyAgICAgICAgcGFzc3dvcmQ9IiR7bWFuYWdlci5wYXNzd29yZH0iLz4KKworICA8L3RhcmdldD4KKworCis8IS0tID09PT09PT09PT09PT09PT09PT09IFByZXBhcmUgVGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzwhLS0KKworICBUaGUgInByZXBhcmUiIHRhcmdldCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgImJ1aWxkIiBkZXN0aW5hdGlvbiBkaXJlY3RvcnksCisgIGFuZCBjb3B5IHRoZSBzdGF0aWMgY29udGVudHMgb2YgeW91ciB3ZWIgYXBwbGljYXRpb24gdG8gaXQuICBJZiB5b3UgbmVlZAorICB0byBjb3B5IHN0YXRpYyBmaWxlcyBmcm9tIGV4dGVybmFsIGRlcGVuZGVuY2llcywgeW91IGNhbiBjdXN0b21pemUgdGhlCisgIGNvbnRlbnRzIG9mIHRoaXMgdGFzay4KKworICBOb3JtYWxseSwgdGhpcyB0YXNrIGlzIGV4ZWN1dGVkIGluZGlyZWN0bHkgd2hlbiBuZWVkZWQuCisKKy0tPgorCisgIDx0YXJnZXQgbmFtZT0icHJlcGFyZSI+CisKKyAgICA8IS0tIENyZWF0ZSBidWlsZCBkaXJlY3RvcmllcyBhcyBuZWVkZWQgLS0+CisgICAgPG1rZGlyICBkaXI9IiR7YnVpbGQuaG9tZX0iLz4KKyAgICA8bWtkaXIgIGRpcj0iJHtidWlsZC5ob21lfS9XRUItSU5GIi8+CisgICAgPG1rZGlyICBkaXI9IiR7YnVpbGQuaG9tZX0vV0VCLUlORi9jbGFzc2VzIi8+CisKKworICAgIDwhLS0gQ29weSBzdGF0aWMgY29udGVudCBvZiB0aGlzIHdlYiBhcHBsaWNhdGlvbiAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5ob21lfSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7d2ViLmhvbWV9Ii8+CisgICAgPC9jb3B5PgorCisgICAgPCEtLSBDb3B5IGV4dGVybmFsIGRlcGVuZGVuY2llcyBhcyByZXF1aXJlZCAtLT4KKyAgICA8IS0tICoqKiBDVVNUT01JWkUgSEVSRSBBUyBSRVFVSVJFRCBCWSBZT1VSIEFQUExJQ0FUSU9OICoqKiAtLT4KKyAgICA8bWtkaXIgIGRpcj0iJHtidWlsZC5ob21lfS9XRUItSU5GL2xpYiIvPgorPCEtLQorICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmhvbWV9L1dFQi1JTkYvbGliIiBmaWxlPSIke2Zvby5qYXJ9Ii8+CistLT4KKworICAgIDwhLS0gQ29weSBzdGF0aWMgZmlsZXMgZnJvbSBleHRlcm5hbCBkZXBlbmRlbmNpZXMgYXMgbmVlZGVkIC0tPgorICAgIDwhLS0gKioqIENVU1RPTUlaRSBIRVJFIEFTIFJFUVVJUkVEIEJZIFlPVVIgQVBQTElDQVRJT04gKioqIC0tPgorCisgIDwvdGFyZ2V0PgorCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT0gUmVsb2FkIFRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPCEtLQorCisgIFRoZSAicmVsb2FkIiBzaWduYWxzIHRoZSBzcGVjaWZpZWQgYXBwbGljYXRpb24gVG9tY2F0IDUgdG8gc2h1dCBpdHNlbGYgZG93bgorICBhbmQgcmVsb2FkLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQgaXMgbm90CisgIHJlbG9hZGFibGUgYW5kIHlvdSBoYXZlIHVwZGF0ZWQgY2xhc3NlcyBvciBwcm9wZXJ0eSBmaWxlcyBpbiB0aGUKKyAgL1dFQi1JTkYvY2xhc3NlcyBkaXJlY3Rvcnkgb3Igd2hlbiB5b3UgaGF2ZSBhZGRlZCBvciB1cGRhdGVkIGphciBmaWxlcyBpbiB0aGUKKyAgL1dFQi1JTkYvbGliIGRpcmVjdG9yeS4KKworICBOT1RFOiBUaGUgL1dFQi1JTkYvd2ViLnhtbCB3ZWIgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiBmaWxlIGlzIG5vdCByZXJlYWQKKyAgb24gYSByZWxvYWQuIElmIHlvdSBoYXZlIG1hZGUgY2hhbmdlcyB0byB5b3VyIHdlYi54bWwgZmlsZSB5b3UgbXVzdCBzdG9wCisgIHRoZW4gc3RhcnQgdGhlIHdlYiBhcHBsaWNhdGlvbi4gCisKKy0tPgorCisgIDx0YXJnZXQgbmFtZT0icmVsb2FkIiBkZXBlbmRzPSJjb21waWxlIgorICAgZGVzY3JpcHRpb249IlJlbG9hZCBhcHBsaWNhdGlvbiBvbiBzZXJ2bGV0IGNvbnRhaW5lciI+CisKKyAgICA8cmVsb2FkIHVybD0iJHttYW5hZ2VyLnVybH0iCisgICAgICAgdXNlcm5hbWU9IiR7bWFuYWdlci51c2VybmFtZX0iCisgICAgICAgcGFzc3dvcmQ9IiR7bWFuYWdlci5wYXNzd29yZH0iCisgICAgICAgICAgIHBhdGg9IiR7YXBwLnBhdGh9Ii8+CisKKyAgPC90YXJnZXQ+CisKKworPCEtLSA9PT09PT09PT09PT09PT09PT09PSBSZW1vdmUgVGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8IS0tCisKKyAgVGhlICJyZW1vdmUiIHRhcmdldCB0ZWxscyB0aGUgc3BlY2lmaWVkIFRvbWNhdCA1IGluc3RhbGxhdGlvbiB0byBkeW5hbWljYWxseQorICByZW1vdmUgdGhpcyB3ZWIgYXBwbGljYXRpb24gZnJvbSBzZXJ2aWNlLgorCisgIE5PVEU6ICBUaGlzIGlzIHRoZSBsb2dpY2FsIG9wcG9zaXRlIG9mIHRoZSAiaW5zdGFsbCIgdGFyZ2V0LgorCistLT4KKworICA8dGFyZ2V0IG5hbWU9InJlbW92ZSIKKyAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgYXBwbGljYXRpb24gb24gc2VydmxldCBjb250YWluZXIiPgorCisgICAgPHVuZGVwbG95IHVybD0iJHttYW5hZ2VyLnVybH0iCisgICAgICAgICB1c2VybmFtZT0iJHttYW5hZ2VyLnVzZXJuYW1lfSIKKyAgICAgICAgIHBhc3N3b3JkPSIke21hbmFnZXIucGFzc3dvcmR9IgorICAgICAgICAgICAgIHBhdGg9IiR7YXBwLnBhdGh9Ii8+CisKKyAgPC90YXJnZXQ+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvZGVwbG95bWVudC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9kZXBsb3ltZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmMyNjI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvZGVwbG95bWVudC54bWwKQEAgLTAsMCArMSwyNTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJkZXBsb3ltZW50Lmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8dGl0bGU+RGVwbG95bWVudDwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iQmFja2dyb3VuZCI+CisKKzxwPkJlZm9yZSBkZXNjcmliaW5nIGhvdyB0byBvcmdhbml6ZSB5b3VyIHNvdXJjZSBjb2RlIGRpcmVjdG9yaWVzLAoraXQgaXMgdXNlZnVsIHRvIGV4YW1pbmUgdGhlIHJ1bnRpbWUgb3JnYW5pemF0aW9uIG9mIGEgd2ViIGFwcGxpY2F0aW9uLgorUHJpb3IgdG8gdGhlIFNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24sIHZlcnNpb24gMi4yLCB0aGVyZSB3YXMgbGl0dGxlCitjb25zaXN0ZW5jeSBiZXR3ZWVuIHNlcnZlciBwbGF0Zm9ybXMuICBIb3dldmVyLCBzZXJ2ZXJzIHRoYXQgY29uZm9ybQordG8gdGhlIDIuMiAob3IgbGF0ZXIpIHNwZWNpZmljYXRpb24gYXJlIHJlcXVpcmVkIHRvIGFjY2VwdCBhCis8ZW0+V2ViIEFwcGxpY2F0aW9uIEFyY2hpdmU8L2VtPiBpbiBhIHN0YW5kYXJkIGZvcm1hdCwgd2hpY2ggaXMgZGlzY3Vzc2VkCitmdXJ0aGVyIGJlbG93LjwvcD4KKworPHA+QSB3ZWIgYXBwbGljYXRpb24gaXMgZGVmaW5lZCBhcyBhIGhpZXJhcmNoeSBvZiBkaXJlY3RvcmllcyBhbmQgZmlsZXMKK2luIGEgc3RhbmRhcmQgbGF5b3V0LiAgU3VjaCBhIGhpZXJhcmNoeSBjYW4gYmUgYWNjZXNzZWQgaW4gaXRzICJ1bnBhY2tlZCIKK2Zvcm0sIHdoZXJlIGVhY2ggZGlyZWN0b3J5IGFuZCBmaWxlIGV4aXN0cyBpbiB0aGUgZmlsZXN5c3RlbSBzZXBhcmF0ZWx5LAorb3IgaW4gYSAicGFja2VkIiBmb3JtIGtub3duIGFzIGEgV2ViIEFSY2hpdmUsIG9yIFdBUiBmaWxlLiAgVGhlIGZvcm1lciBmb3JtYXQKK2lzIG1vcmUgdXNlZnVsIGR1cmluZyBkZXZlbG9wbWVudCwgd2hpbGUgdGhlIGxhdHRlciBpcyB1c2VkIHdoZW4geW91CitkaXN0cmlidXRlIHlvdXIgYXBwbGljYXRpb24gdG8gYmUgaW5zdGFsbGVkLjwvcD4KKworPHA+VGhlIHRvcC1sZXZlbCBkaXJlY3Rvcnkgb2YgeW91ciB3ZWIgYXBwbGljYXRpb24gaGllcmFyY2h5IGlzIGFsc28gdGhlCis8ZW0+ZG9jdW1lbnQgcm9vdDwvZW0+IG9mIHlvdXIgYXBwbGljYXRpb24uICBIZXJlLCB5b3Ugd2lsbCBwbGFjZSB0aGUgSFRNTAorZmlsZXMgYW5kIEpTUCBwYWdlcyB0aGF0IGNvbXByaXNlIHlvdXIgYXBwbGljYXRpb24ncyB1c2VyIGludGVyZmFjZS4gIFdoZW4gdGhlCitzeXN0ZW0gYWRtaW5pc3RyYXRvciBkZXBsb3lzIHlvdXIgYXBwbGljYXRpb24gaW50byBhIHBhcnRpY3VsYXIgc2VydmVyLCBoZQorb3Igc2hlIGFzc2lnbnMgYSA8ZW0+Y29udGV4dCBwYXRoPC9lbT4gdG8geW91ciBhcHBsaWNhdGlvbiAoYSBsYXRlciBzZWN0aW9uCitvZiB0aGlzIG1hbnVhbCBkZXNjcmliZXMgZGVwbG95bWVudCBvbiBUb21jYXQpLiAgVGh1cywgaWYgdGhlCitzeXN0ZW0gYWRtaW5pc3RyYXRvciBhc3NpZ25zIHlvdXIgYXBwbGljYXRpb24gdG8gdGhlIGNvbnRleHQgcGF0aAorPGNvZGU+L2NhdGFsb2c8L2NvZGU+LCB0aGVuIGEgcmVxdWVzdCBVUkkgcmVmZXJyaW5nIHRvCis8Y29kZT4vY2F0YWxvZy9pbmRleC5odG1sPC9jb2RlPiB3aWxsIHJldHJpZXZlIHRoZSA8Y29kZT5pbmRleC5odG1sPC9jb2RlPgorZmlsZSBmcm9tIHlvdXIgZG9jdW1lbnQgcm9vdC48L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBEaXJlY3RvcnkgTGF5b3V0Ij4KKworPHA+VG8gZmFjaWxpdGF0ZSBjcmVhdGlvbiBvZiBhIFdlYiBBcHBsaWNhdGlvbiBBcmNoaXZlIGZpbGUgaW4gdGhlIHJlcXVpcmVkCitmb3JtYXQsIGl0IGlzIGNvbnZlbmllbnQgdG8gYXJyYW5nZSB0aGUgImV4ZWN1dGFibGUiIGZpbGVzIG9mIHlvdXIgd2ViCithcHBsaWNhdGlvbiAodGhhdCBpcywgdGhlIGZpbGVzIHRoYXQgVG9tY2F0IGFjdHVhbGx5IHVzZXMgd2hlbiBleGVjdXRpbmcKK3lvdXIgYXBwKSBpbiB0aGUgc2FtZSBvcmdhbml6YXRpb24gYXMgcmVxdWlyZWQgYnkgdGhlIFdBUiBmb3JtYXQgaXRzZWxmLgorVG8gZG8gdGhpcywgeW91IHdpbGwgZW5kIHVwIHdpdGggdGhlIGZvbGxvd2luZyBjb250ZW50cyBpbiB5b3VyCithcHBsaWNhdGlvbidzICJkb2N1bWVudCByb290IiBkaXJlY3Rvcnk6PC9wPgorPHVsPgorPGxpPjxzdHJvbmc+Ki5odG1sLCAqLmpzcCwgZXRjLjwvc3Ryb25nPiAtIFRoZSBIVE1MIGFuZCBKU1AgcGFnZXMsIGFsb25nCisgICAgd2l0aCBvdGhlciBmaWxlcyB0aGF0IG11c3QgYmUgdmlzaWJsZSB0byB0aGUgY2xpZW50IGJyb3dzZXIgKHN1Y2ggYXMKKyAgICBKYXZhU2NyaXB0LCBzdHlsZXNoZWV0IGZpbGVzLCBhbmQgaW1hZ2VzKSBmb3IgeW91ciBhcHBsaWNhdGlvbi4KKyAgICBJbiBsYXJnZXIgYXBwbGljYXRpb25zIHlvdSBtYXkgY2hvb3NlIHRvIGRpdmlkZSB0aGVzZSBmaWxlcyBpbnRvCisgICAgYSBzdWJkaXJlY3RvcnkgaGllcmFyY2h5LCBidXQgZm9yIHNtYWxsZXIgYXBwcywgaXQgaXMgZ2VuZXJhbGx5CisgICAgbXVjaCBzaW1wbGVyIHRvIG1haW50YWluIG9ubHkgYSBzaW5nbGUgZGlyZWN0b3J5IGZvciB0aGVzZSBmaWxlcy4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT48c3Ryb25nPi9XRUItSU5GL3dlYi54bWw8L3N0cm9uZz4gLSBUaGUgPGVtPldlYiBBcHBsaWNhdGlvbiBEZXBsb3ltZW50CisgICAgRGVzY3JpcHRvcjwvZW0+IGZvciB5b3VyIGFwcGxpY2F0aW9uLiAgVGhpcyBpcyBhbiBYTUwgZmlsZSBkZXNjcmliaW5nCisgICAgdGhlIHNlcnZsZXRzIGFuZCBvdGhlciBjb21wb25lbnRzIHRoYXQgbWFrZSB1cCB5b3VyIGFwcGxpY2F0aW9uLAorICAgIGFsb25nIHdpdGggYW55IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgYW5kIGNvbnRhaW5lci1tYW5hZ2VkCisgICAgc2VjdXJpdHkgY29uc3RyYWludHMgdGhhdCB5b3Ugd2FudCB0aGUgc2VydmVyIHRvIGVuZm9yY2UgZm9yIHlvdS4KKyAgICBUaGlzIGZpbGUgaXMgZGlzY3Vzc2VkIGluIG1vcmUgZGV0YWlsIGluIHRoZSBmb2xsb3dpbmcgc3Vic2VjdGlvbi4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT48c3Ryb25nPi9XRUItSU5GL2NsYXNzZXMvPC9zdHJvbmc+IC0gVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYW55IEphdmEKKyAgICBjbGFzcyBmaWxlcyAoYW5kIGFzc29jaWF0ZWQgcmVzb3VyY2VzKSByZXF1aXJlZCBmb3IgeW91ciBhcHBsaWNhdGlvbiwKKyAgICBpbmNsdWRpbmcgYm90aCBzZXJ2bGV0IGFuZCBub24tc2VydmxldCBjbGFzc2VzLCB0aGF0IGFyZSBub3QgY29tYmluZWQKKyAgICBpbnRvIEpBUiBmaWxlcy4gIElmIHlvdXIgY2xhc3NlcyBhcmUgb3JnYW5pemVkIGludG8gSmF2YSBwYWNrYWdlcywKKyAgICB5b3UgbXVzdCByZWZsZWN0IHRoaXMgaW4gdGhlIGRpcmVjdG9yeSBoaWVyYXJjaHkgdW5kZXIKKyAgICA8Y29kZT4vV0VCLUlORi9jbGFzc2VzLzwvY29kZT4uICBGb3IgZXhhbXBsZSwgYSBKYXZhIGNsYXNzIG5hbWVkCisgICAgPGNvZGU+Y29tLm15Y29tcGFueS5teXBhY2thZ2UuTXlTZXJ2bGV0PC9jb2RlPgorICAgIHdvdWxkIG5lZWQgdG8gYmUgc3RvcmVkIGluIGEgZmlsZSBuYW1lZAorICAgIDxjb2RlPi9XRUItSU5GL2NsYXNzZXMvY29tL215Y29tcGFueS9teXBhY2thZ2UvTXlTZXJ2bGV0LmNsYXNzPC9jb2RlPi4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT48c3Ryb25nPi9XRUItSU5GL2xpYi88L3N0cm9uZz4gLSBUaGlzIGRpcmVjdG9yeSBjb250YWlucyBKQVIgZmlsZXMgdGhhdAorICAgIGNvbnRhaW4gSmF2YSBjbGFzcyBmaWxlcyAoYW5kIGFzc29jaWF0ZWQgcmVzb3VyY2VzKSByZXF1aXJlZCBmb3IgeW91cgorICAgIGFwcGxpY2F0aW9uLCBzdWNoIGFzIHRoaXJkIHBhcnR5IGNsYXNzIGxpYnJhcmllcyBvciBKREJDIGRyaXZlcnMuPC9saT4KKzwvdWw+CisKKzxwPldoZW4geW91IGluc3RhbGwgYW4gYXBwbGljYXRpb24gaW50byBUb21jYXQgKG9yIGFueSBvdGhlcgorMi4yLzIuMy1jb21wYXRpYmxlIHNlcnZlciksIHRoZSBjbGFzc2VzIGluIHRoZSA8Y29kZT5XRUItSU5GL2NsYXNzZXMvPC9jb2RlPgorZGlyZWN0b3J5LCBhcyB3ZWxsIGFzIGFsbCBjbGFzc2VzIGluIEpBUiBmaWxlcyBmb3VuZCBpbiB0aGUKKzxjb2RlPldFQi1JTkYvbGliLzwvY29kZT4gZGlyZWN0b3J5LCBhcmUgbWFkZSB2aXNpYmxlIHRvIG90aGVyIGNsYXNzZXMKK3dpdGhpbiB5b3VyIHBhcnRpY3VsYXIgd2ViIGFwcGxpY2F0aW9uLiAgVGh1cywgaWYKK3lvdSBpbmNsdWRlIGFsbCBvZiB0aGUgcmVxdWlyZWQgbGlicmFyeSBjbGFzc2VzIGluIG9uZSBvZiB0aGVzZSBwbGFjZXMgKGJlCitzdXJlIHRvIGNoZWNrIGxpY2Vuc2VzIGZvciByZWRpc3RyaWJ1dGlvbiByaWdodHMgZm9yIGFueSB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMKK3lvdSB1dGlsaXplKSwgeW91IHdpbGwgc2ltcGxpZnkgdGhlIGluc3RhbGxhdGlvbiBvZiB5b3VyIHdlYiBhcHBsaWNhdGlvbiAtLQorbm8gYWRqdXN0bWVudCB0byB0aGUgc3lzdGVtIGNsYXNzIHBhdGggKG9yIGluc3RhbGxhdGlvbiBvZiBnbG9iYWwgbGlicmFyeQorZmlsZXMgaW4geW91ciBzZXJ2ZXIpIHdpbGwgYmUgbmVjZXNzYXJ5LjwvcD4KKworPHA+TXVjaCBvZiB0aGlzIGluZm9ybWF0aW9uIHdhcyBleHRyYWN0ZWQgZnJvbSBDaGFwdGVyIDkgb2YgdGhlIFNlcnZsZXQKK0FQSSBTcGVjaWZpY2F0aW9uLCB2ZXJzaW9uIDIuMywgd2hpY2ggeW91IHNob3VsZCBjb25zdWx0IGZvciBtb3JlIGRldGFpbHMuPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iU2hhcmVkIExpYnJhcnkgRmlsZXMiPgorCis8cD5MaWtlIG1vc3Qgc2VydmxldCBjb250YWluZXJzLCBUb21jYXQgNSBhbHNvIHN1cHBvcnRzIG1lY2hhbmlzbXMgdG8gaW5zdGFsbAorbGlicmFyeSBKQVIgZmlsZXMgKG9yIHVucGFja2VkIGNsYXNzZXMpIG9uY2UsIGFuZCBtYWtlIHRoZW0gdmlzaWJsZSB0byBhbGwKK2luc3RhbGxlZCB3ZWIgYXBwbGljYXRpb25zICh3aXRob3V0IGhhdmluZyB0byBiZSBpbmNsdWRlZCBpbnNpZGUgdGhlIHdlYgorYXBwbGljYXRpb24gaXRzZWxmLiAgVGhlIGRldGFpbHMgb2YgaG93IFRvbWNhdCBsb2NhdGVzIGFuZCBzaGFyZXMgc3VjaAorY2xhc3NlcyBhcmUgZGVzY3JpYmVkIGluIHRoZQorPGEgaHJlZj0iLi4vY2xhc3MtbG9hZGVyLWhvd3RvLmh0bWwiPkNsYXNzIExvYWRlciBIT1ctVE88L2E+IGRvY3VtZW50YXRpb24uCitGb3IgdGhlIHB1cnBvc2VzIG9mIG91ciBkaXNjdXNzaW9uLCB0aGVyZSBhcmUgdHdvIGxvY2F0aW9ucyB0aGF0IGFyZSBjb21tb25seQordXNlZCB3aXRoaW4gYSBUb21jYXQgNSBpbnN0YWxsYXRpb24gZm9yIHNoYXJlZCBjb2RlOjwvcD4KKzx1bD4KKzxsaT48c3Ryb25nPiRDQVRBTElOQV9IT01FL2NvbW1vbi9saWI8L3N0cm9uZz4gLSBKQVIgZmlsZXMgcGxhY2VkIGhlcmUgYXJlCisgICAgdmlzaWJsZSBib3RoIHRvIHdlYiBhcHBsaWNhdGlvbnMgYW5kIGludGVybmFsIFRvbWNhdCBjb2RlLiAgVGhpcyBpcyBhCisgICAgZ29vZCBwbGFjZSB0byBwdXQgSkRCQyBkcml2ZXJzIHRoYXQgYXJlIHJlcXVpcmVkIGZvciBib3RoIHlvdXIgYXBwbGljYXRpb24KKyAgICBhbmQgaW50ZXJuYWwgVG9tY2F0IHVzZSAoc3VjaCBhcyBmb3IgYSBKREJDUmVhbG0pLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPjxzdHJvbmc+JENBVEFMSU5BX0JBU0Uvc2hhcmVkL2xpYjwvc3Ryb25nPiAtIEpBUiBmaWxlcyBwbGFjZWQgaGVyZSBhcmUKKyAgICB2aXNpYmxlIHRvIGFsbCB3ZWIgYXBwbGljYXRpb25zLCBidXQgbm90IHRvIGludGVybmFsIFRvbWNhdCBjb2RlLiAgVGhpcworICAgIGlzIHRoZSByaWdodCBwbGFjZSBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aGF0IGFyZSBzcGVjaWZpYyB0byB5b3VyCisgICAgYXBwbGljYXRpb24uPGJyLz48YnIvPjwvbGk+Cis8L3VsPgorCis8cD5PdXQgb2YgdGhlIGJveCwgYSBzdGFuZGFyZCBUb21jYXQgNSBpbnN0YWxsYXRpb24gaW5jbHVkZXMgYSB2YXJpZXR5CitvZiBwcmUtaW5zdGFsbGVkIHNoYXJlZCBsaWJyYXJ5IGZpbGVzLCBpbmNsdWRpbmc6PC9wPgorPHVsPgorPGxpPlRoZSA8ZW0+U2VydmxldCAyLjQ8L2VtPiBhbmQgPGVtPkpTUCAyLjA8L2VtPiBBUElzIHRoYXQgYXJlIGZ1bmRhbWVudGFsCisgICAgdG8gd3JpdGluZyBzZXJ2bGV0cyBhbmQgSmF2YVNlcnZlciBQYWdlcy48YnIvPjxici8+PC9saT4KKzxsaT5BbiA8ZW0+WE1MIFBhcnNlcjwvZW0+IGNvbXBsaWFudCB3aXRoIHRoZSBKQVhQICh2ZXJzaW9uIDEuMikgQVBJcywgc28KKyAgICB5b3VyIGFwcGxpY2F0aW9uIGNhbiBwZXJmb3JtIERPTS1iYXNlZCBvciBTQVgtYmFzZWQgcHJvY2Vzc2luZyBvZgorICAgIFhNTCBkb2N1bWVudHMuPGJyLz48YnIvPjwvbGk+Cis8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iV2ViIEFwcGxpY2F0aW9uIERlcGxveW1lbnQgRGVzY3JpcHRvciI+CisKKyAgICA8YmxvY2txdW90ZT48ZW0+CisgICAgPHA+VGhlIGRlc2NyaXB0aW9uIGJlbG93IHVzZXMgdGhlIHZhcmlhYmxlIG5hbWUgJENBVEFMSU5BX0hPTUUKKyAgICB0byByZWZlciB0byB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IGhhdmUgaW5zdGFsbGVkIFRvbWNhdCA1LAorICAgIGFuZCBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgYWdhaW5zdCB3aGljaCBtb3N0IHJlbGF0aXZlIHBhdGhzIGFyZQorICAgIHJlc29sdmVkLiAgSG93ZXZlciwgaWYgeW91IGhhdmUgY29uZmlndXJlZCBUb21jYXQgNSBmb3IgbXVsdGlwbGUKKyAgICBpbnN0YW5jZXMgYnkgc2V0dGluZyBhIENBVEFMSU5BX0JBU0UgZGlyZWN0b3J5LCB5b3Ugc2hvdWxkIHVzZQorICAgICRDQVRBTElOQV9CQVNFIGluc3RlYWQgb2YgJENBVEFMSU5BX0hPTUUgZm9yIGVhY2ggb2YgdGhlc2UKKyAgICByZWZlcmVuY2VzLjwvcD4KKyAgICA8L2VtPjwvYmxvY2txdW90ZT4KKworPHA+QXMgbWVudGlvbmVkIGFib3ZlLCB0aGUgPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4gZmlsZSBjb250YWlucyB0aGUKK1dlYiBBcHBsaWNhdGlvbiBEZXBsb3ltZW50IERlc2NyaXB0b3IgZm9yIHlvdXIgYXBwbGljYXRpb24uICBBcyB0aGUgZmlsZW5hbWUKK2V4dGVuc2lvbiBpbXBsaWVzLCB0aGlzIGZpbGUgaXMgYW4gWE1MIGRvY3VtZW50LCBhbmQgZGVmaW5lcyBldmVyeXRoaW5nIGFib3V0Cit5b3VyIGFwcGxpY2F0aW9uIHRoYXQgYSBzZXJ2ZXIgbmVlZHMgdG8ga25vdyAoZXhjZXB0IHRoZSA8ZW0+Y29udGV4dCBwYXRoPC9lbT4sCit3aGljaCBpcyBhc3NpZ25lZCBieSB0aGUgc3lzdGVtIGFkbWluaXN0cmF0b3Igd2hlbiB0aGUgYXBwbGljYXRpb24gaXMKK2RlcGxveWVkKS48L3A+CisKKzxwPlRoZSBjb21wbGV0ZSBzeW50YXggYW5kIHNlbWFudGljcyBmb3IgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBkZWZpbmVkCitpbiBDaGFwdGVyIDEzIG9mIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLCB2ZXJzaW9uIDIuMy4gIE92ZXIgdGltZSwgaXQKK2lzIGV4cGVjdGVkIHRoYXQgZGV2ZWxvcG1lbnQgdG9vbHMgd2lsbCBiZSBwcm92aWRlZCB0aGF0IGNyZWF0ZSBhbmQgZWRpdCB0aGUKK2RlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgeW91LiAgSW4gdGhlIG1lYW50aW1lLCB0byBwcm92aWRlIGEgc3RhcnRpbmcgcG9pbnQsCithIDxhIGhyZWY9IndlYi54bWwudHh0IiB0YXJnZXQ9Il9uZXciPmJhc2ljIHdlYi54bWwgZmlsZTwvYT4KK2lzIHByb3ZpZGVkLiAgVGhpcyBmaWxlIGluY2x1ZGVzIGNvbW1lbnRzIHRoYXQgZGVzY3JpYmUgdGhlIHB1cnBvc2Ugb2YgZWFjaAoraW5jbHVkZWQgZWxlbWVudC48L3A+CisKKzxwPjxzdHJvbmc+Tk9URTwvc3Ryb25nPiAtIFRoZSBTZXJ2bGV0IFNwZWNpZmljYXRpb24gaW5jbHVkZXMgYSBEb2N1bWVudAorVHlwZSBEZXNjcmlwdG9yIChEVEQpIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kCitUb21jYXQgNSBlbmZvcmNlcyB0aGUgcnVsZXMgZGVmaW5lZCBoZXJlIHdoZW4gcHJvY2Vzc2luZyB5b3VyIGFwcGxpY2F0aW9uJ3MKKzxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+IGZpbGUuICBJbiBwYXJ0aWN1bGFyLCB5b3UgPHN0cm9uZz5tdXN0PC9zdHJvbmc+CitlbnRlciB5b3VyIGRlc2NyaXB0b3IgZWxlbWVudHMgKHN1Y2ggYXMgPGNvZGU+Jmx0O2ZpbHRlciZndDs8L2NvZGU+LAorPGNvZGU+Jmx0O3NlcnZsZXQmZ3Q7PC9jb2RlPiwgYW5kIDxjb2RlPiZsdDtzZXJ2bGV0LW1hcHBpbmcmZ3Q7PC9jb2RlPiBpbgordGhlIG9yZGVyIGRlZmluZWQgYnkgdGhlIERURCAoc2VlIFNlY3Rpb24gMTMuMykuPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iVG9tY2F0IENvbnRleHQgRGVzY3JpcHRvciI+CisKKyAgICA8YmxvY2txdW90ZT48ZW0+CisgICAgPHA+VGhlIGRlc2NyaXB0aW9uIGJlbG93IHVzZXMgdGhlIHZhcmlhYmxlIG5hbWUgJENBVEFMSU5BX0hPTUUKKyAgICB0byByZWZlciB0byB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IGhhdmUgaW5zdGFsbGVkIFRvbWNhdCA1LAorICAgIGFuZCBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgYWdhaW5zdCB3aGljaCBtb3N0IHJlbGF0aXZlIHBhdGhzIGFyZQorICAgIHJlc29sdmVkLiAgSG93ZXZlciwgaWYgeW91IGhhdmUgY29uZmlndXJlZCBUb21jYXQgNSBmb3IgbXVsdGlwbGUKKyAgICBpbnN0YW5jZXMgYnkgc2V0dGluZyBhIENBVEFMSU5BX0JBU0UgZGlyZWN0b3J5LCB5b3Ugc2hvdWxkIHVzZQorICAgICRDQVRBTElOQV9CQVNFIGluc3RlYWQgb2YgJENBVEFMSU5BX0hPTUUgZm9yIGVhY2ggb2YgdGhlc2UKKyAgICByZWZlcmVuY2VzLjwvcD4KKyAgICA8L2VtPjwvYmxvY2txdW90ZT4KKworPHA+QSAvTUVUQS1JTkYvY29udGV4dC54bWwgZmlsZSBjYW4gYmUgdXNlZCB0byBkZWZpbmUgVG9tY2F0IHNwZWNpZmljCitjb25maWd1cmF0aW9uIG9wdGlvbnMsIHN1Y2ggYXMgbG9nZ2VycywgZGF0YSBzb3VyY2VzLCBzZXNzaW9uIG1hbmFnZXIKK2NvbmZpZ3VyYXRpb24gYW5kIG1vcmUuIFRoaXMgWE1MIGZpbGUgbXVzdCBjb250YWluIG9uZSBDb250ZXh0IGVsZW1lbnQsIHdoaWNoCit3aWxsIGJlIGNvbnNpZGVyZWQgYXMgaWYgaXQgd2FzIHRoZSBjaGlsZCBvZiB0aGUgSG9zdCBlbGVtZW50IGNvcnJlc3BvbmRpbmcKK3RvIHRoZSBIb3N0IHRvIHdoaWNoIHRoZSAgVGhlIFRvbWNhdCBjb25maWd1cmF0aW9uIGRvY3VtZW50YXRpb24gY29udGFpbnMKK2luZm9ybWF0aW9uIG9uIHRoZSBDb250ZXh0IGVsZW1lbnQuPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRGVwbG95bWVudCBXaXRoIFRvbWNhdCA1Ij4KKworPHA+SW4gb3JkZXIgdG8gYmUgZXhlY3V0ZWQsIGEgd2ViIGFwcGxpY2F0aW9uIG11c3QgYmUgZGVwbG95ZWQgb24KK2Egc2VydmxldCBjb250YWluZXIuICBUaGlzIGlzIHRydWUgZXZlbiBkdXJpbmcgZGV2ZWxvcG1lbnQuCitXZSB3aWxsIGRlc2NyaWJlIHVzaW5nIFRvbWNhdCA1IHRvIHByb3ZpZGUgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4KK0Egd2ViIGFwcGxpY2F0aW9uIGNhbiBiZSBkZXBsb3llZCBpbiBUb21jYXQgYnkgb25lIG9mIHRoZSBmb2xsb3dpbmcKK2FwcHJvYWNoZXM6PC9wPgorPHVsPgorPGxpPjxlbT5Db3B5IHVucGFja2VkIGRpcmVjdG9yeSBoaWVyYXJjaHkgaW50byBhIHN1YmRpcmVjdG9yeSBpbiBkaXJlY3RvcnkKKyAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS93ZWJhcHBzLzwvY29kZT48L2VtPi4gIFRvbWNhdCB3aWxsIGFzc2lnbiBhCisgICAgY29udGV4dCBwYXRoIHRvIHlvdXIgYXBwbGljYXRpb24gYmFzZWQgb24gdGhlIHN1YmRpcmVjdG9yeSBuYW1lIHlvdQorICAgIGNob29zZS4gIFdlIHdpbGwgdXNlIHRoaXMgdGVjaG5pcXVlIGluIHRoZSA8Y29kZT5idWlsZC54bWw8L2NvZGU+CisgICAgZmlsZSB0aGF0IHdlIGNvbnN0cnVjdCwgYmVjYXVzZSBpdCBpcyB0aGUgcXVpY2tlc3QgYW5kIGVhc2llc3QgYXBwcm9hY2gKKyAgICBkdXJpbmcgZGV2ZWxvcG1lbnQuICBCZSBzdXJlIHRvIHJlc3RhcnQgVG9tY2F0IGFmdGVyIGluc3RhbGxpbmcgb3IKKyAgICB1cGRhdGluZyB5b3VyIGFwcGxpY2F0aW9uLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPjxlbT5Db3B5IHRoZSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSBmaWxlIGludG8gZGlyZWN0b3J5CisgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvd2ViYXBwcy88L2NvZGU+PC9lbT4uICBXaGVuIFRvbWNhdCBpcyBzdGFydGVkLCBpdCB3aWxsCisgICAgYXV0b21hdGljYWxseSBleHBhbmQgdGhlIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIGZpbGUgaW50byBpdHMgdW5wYWNrZWQKKyAgICBmb3JtLCBhbmQgZXhlY3V0ZSB0aGUgYXBwbGljYXRpb24gdGhhdCB3YXkuICBUaGlzIGFwcHJvYWNoIHdvdWxkIHR5cGljYWxseQorICAgIGJlIHVzZWQgdG8gaW5zdGFsbCBhbiBhZGRpdGlvbmFsIGFwcGxpY2F0aW9uLCBwcm92aWRlZCBieSBhIHRoaXJkIHBhcnR5CisgICAgdmVuZG9yIG9yIGJ5IHlvdXIgaW50ZXJuYWwgZGV2ZWxvcG1lbnQgc3RhZmYsIGludG8gYW4gZXhpc3RpbmcKKyAgICBUb21jYXQgaW5zdGFsbGF0aW9uLiAgPHN0cm9uZz5OT1RFPC9zdHJvbmc+IC0gSWYgeW91IHVzZSB0aGlzIGFwcHJvYWNoLAorICAgIGFuZCB3aXNoIHRvIHVwZGF0ZSB5b3VyIGFwcGxpY2F0aW9uIGxhdGVyLCB5b3UgbXVzdCBib3RoIHJlcGxhY2UgdGhlCisgICAgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgZmlsZSA8c3Ryb25nPkFORDwvc3Ryb25nPiBkZWxldGUgdGhlIGV4cGFuZGVkCisgICAgZGlyZWN0b3J5IHRoYXQgVG9tY2F0IGNyZWF0ZWQsIGFuZCB0aGVuIHJlc3RhcnQgVG9tY2F0LCBpbiBvcmRlciB0byByZWZsZWN0CisgICAgeW91ciBjaGFuZ2VzLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPjxlbT5Vc2UgdGhlIFRvbWNhdCA1ICJNYW5hZ2VyIiB3ZWIgYXBwbGljYXRpb24gdG8gZGVwbG95IGFuZCB1bmRlcGxveQorICAgIHdlYiBhcHBsaWNhdGlvbnM8L2VtPi4gIFRvbWNhdCA1IGluY2x1ZGVzIGEgd2ViIGFwcGxpY2F0aW9uLCBkZXBsb3llZAorICAgIGJ5IGRlZmF1bHQgb24gY29udGV4dCBwYXRoIDxjb2RlPi9tYW5hZ2VyPC9jb2RlPiwgdGhhdCBhbGxvd3MgeW91IHRvCisgICAgZGVwbG95IGFuZCB1bmRlcGxveSBhcHBsaWNhdGlvbnMgb24gYSBydW5uaW5nIFRvbWNhdCBzZXJ2ZXIgd2l0aG91dAorICAgIHJlc3RhcnRpbmcgaXQuICBTZWUgdGhlIGFkbWluaXN0cmF0b3IgZG9jdW1lbnRhdGlvbiAoVE9ETzogaHlwZXJsaW5rKQorICAgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSBNYW5hZ2VyIHdlYiBhcHBsaWNhdGlvbi48YnIvPjxici8+PC9saT4KKzxsaT48ZW0+VXNlICJNYW5hZ2VyIiBBbnQgVGFza3MgSW4gWW91ciBCdWlsZCBTY3JpcHQ8L2VtPi4gIFRvbWNhdCA1CisgICAgaW5jbHVkZXMgYSBzZXQgb2YgY3VzdG9tIHRhc2sgZGVmaW5pdGlvbnMgZm9yIHRoZSA8Y29kZT5BbnQ8L2NvZGU+CisgICAgYnVpbGQgdG9vbCB0aGF0IGFsbG93IHlvdSB0byBhdXRvbWF0ZSB0aGUgZXhlY3V0aW9uIG9mIGNvbW1hbmRzIHRvIHRoZQorICAgICJNYW5hZ2VyIiB3ZWIgYXBwbGljYXRpb24uICBUaGVzZSB0YXNrcyBhcmUgdXNlZCBpbiB0aGUgVG9tY2F0IGRlcGxveWVyLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPjxlbT5Vc2UgdGhlIFRvbWNhdCBEZXBsb3llcjwvZW0+LiAgVG9tY2F0IDUgaW5jbHVkZXMgYSBwYWNrYWdlZCB0b29sCisgICAgYnVuZGxpbmcgdGhlIEFudCB0YXNrcywgYW5kIGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgcHJlY29tcGlsZSBKU1BzCisgICAgd2hpY2ggYXJlIHBhcnQgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBiZWZvcmUgZGVwbG95bWVudCB0byB0aGUgc2VydmVyLgorICAgIDxici8+PGJyLz48L2xpPgorPC91bD4KKworPHA+RGVwbG95aW5nIHlvdXIgYXBwIG9uIG90aGVyIHNlcnZsZXQgY29udGFpbmVycyB3aWxsIGJlIHNwZWNpZmljIHRvIGVhY2gKK2NvbnRhaW5lciwgYnV0IGFsbCBjb250YWluZXJzIGNvbXBhdGlibGUgd2l0aCB0aGUgU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbgorKHZlcnNpb24gMi4yIG9yIGxhdGVyKSBhcmUgcmVxdWlyZWQgdG8gYWNjZXB0IGEgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgZmlsZS4KK05vdGUgdGhhdCBvdGhlciBjb250YWluZXJzIGFyZSA8c3Ryb25nPk5PVDwvc3Ryb25nPiByZXF1aXJlZCB0byBhY2NlcHQgYW4KK3VucGFja2VkIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgKGFzIFRvbWNhdCBkb2VzKSwgb3IgdG8gcHJvdmlkZSBtZWNoYW5pc21zIGZvcgorc2hhcmVkIGxpYnJhcnkgZmlsZXMsIGJ1dCB0aGVzZSBmZWF0dXJlcyBhcmUgY29tbW9ubHkgYXZhaWxhYmxlLjwvcD4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9pbmRleC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5YzVlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L2luZGV4LnhtbApAQCAtMCwwICsxLDYzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iaW5kZXguaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgUi4gTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgIDx0aXRsZT5UYWJsZSBvZiBDb250ZW50czwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iUHJlZmFjZSI+CisKKzxwPlRoaXMgbWFudWFsIGluY2x1ZGVzIGNvbnRyaWJ1dGlvbnMgZnJvbSBtYW55IG1lbWJlcnMgb2YgdGhlIFRvbWNhdCBQcm9qZWN0CitkZXZlbG9wZXIgY29tbXVuaXR5LiAgVGhlIGZvbGxvd2luZyBhdXRob3JzIGhhdmUgcHJvdmlkZWQgc2lnbmlmaWNhbnQgY29udGVudDoKKzwvcD4KKzx1bD4KKzxsaT5DcmFpZyBSLiBNY0NsYW5haGFuCisgICAgKDxhIGhyZWY9Im1haWx0bzpjcmFpZ21jY0BhcGFjaGUub3JnIj5jcmFpZ21jY0BhcGFjaGUub3JnPC9hPik8L2xpPgorPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlRhYmxlIG9mIENvbnRlbnRzIj4KKworPHA+VGhlIGluZm9ybWF0aW9uIHByZXNlbnRlZCBpcyBkaXZpZGVkIGludG8gdGhlIGZvbGxvd2luZyBzZWN0aW9uczo8L3A+Cis8dWw+Cis8bGk+PGEgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiPjxzdHJvbmc+SW50cm9kdWN0aW9uPC9zdHJvbmc+PC9hPiAtCisgICAgQnJpZWZseSBkZXNjcmliZXMgdGhlIGluZm9ybWF0aW9uIGNvdmVyZWQgaGVyZSwgd2l0aAorICAgIGxpbmtzIGFuZCByZWZlcmVuY2VzIHRvIG90aGVyIHNvdXJjZXMgb2YgaW5mb3JtYXRpb24uPC9saT4KKzxsaT48YSBocmVmPSJpbnN0YWxsYXRpb24uaHRtbCI+PHN0cm9uZz5JbnN0YWxsYXRpb248L3N0cm9uZz48L2E+IC0KKyAgICBDb3ZlcnMgYWNxdWlyaW5nIGFuZCBpbnN0YWxsaW5nIHRoZSByZXF1aXJlZCBzb2Z0d2FyZQorICAgIGNvbXBvbmVudHMgdG8gdXNlIFRvbWNhdCBmb3Igd2ViIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50LjwvbGk+Cis8bGk+PGEgaHJlZj0iZGVwbG95bWVudC5odG1sIj48c3Ryb25nPkRlcGxveW1lbnQgT3JnYW5pemF0aW9uPC9zdHJvbmc+PC9hPiAtCisgICAgRGlzY3Vzc2VzIHRoZSBzdGFuZGFyZCBkaXJlY3RvcnkgbGF5b3V0IGZvciBhIHdlYiBhcHBsaWNhdGlvbgorICAgIChkZWZpbmVkIGluIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uKSwgdGhlIFdlYiBBcHBsaWNhdGlvbgorICAgIERlcGxveW1lbnQgRGVzY3JpcHRvciwgYW5kIG9wdGlvbnMgZm9yIGludGVncmF0aW9uIHdpdGggVG9tY2F0CisgICAgaW4geW91ciBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC48L2xpPgorPGxpPjxhIGhyZWY9InNvdXJjZS5odG1sIj48c3Ryb25nPlNvdXJjZSBPcmdhbml6YXRpb248L3N0cm9uZz48L2E+IC0KKyAgICBEZXNjcmliZXMgYSB1c2VmdWwgYXBwcm9hY2ggdG8gb3JnYW5pemluZyB0aGUgc291cmNlIGNvZGUKKyAgICBkaXJlY3RvcmllcyBmb3IgeW91ciBwcm9qZWN0LCBhbmQgaW50cm9kdWNlcyB0aGUKKyAgICA8Y29kZT5idWlsZC54bWw8L2NvZGU+IHVzZWQgYnkgQW50IHRvIG1hbmFnZSBjb21waWxhdGlvbi48L2xpPgorPGxpPjxhIGhyZWY9InByb2Nlc3Nlcy5odG1sIj48c3Ryb25nPkRldmVsb3BtZW50IFByb2Nlc3Nlczwvc3Ryb25nPjwvYT4gLQorICAgIFByb3ZpZGVzIGJyaWVmIGRlc2NyaXB0aW9ucyBvZiB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3NlcworICAgIHV0aWxpemluZyB0aGUgcmVjb21tZW5kZWQgZGVwbG95bWVudCBhbmQgc291cmNlIG9yZ2FuaXphdGlvbnMuPC9saT4KKzxsaT48YSBocmVmPSJzYW1wbGUvIiB0YXJnZXQ9Il9uZXciPjxzdHJvbmc+RXhhbXBsZSBBcHBsaWNhdGlvbjwvc3Ryb25nPjwvYT4gLQorICAgIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGEgdmVyeSBzaW1wbGUsIGJ1dCBmdW5jdGlvbmFsbHkgY29tcGxldGUsCisgICAgIkhlbGxvLCBXb3JsZCIgYXBwbGljYXRpb24gYnVpbHQgYWNjb3JkaW5nIHRvIHRoZSBwcmluY2lwbGVzCisgICAgZGVzY3JpYmVkIGluIHRoaXMgbWFudWFsLiAgWW91IGNhbiB1c2UgdGhpcyBhcHBsaWNhdGlvbiB0bworICAgIHByYWN0aWNlIHVzaW5nIHRoZSBkZXNjcmliZWQgdGVjaG5pcXVlcy48L2xpPgorPC91bD4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9pbnN0YWxsYXRpb24ueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvaW5zdGFsbGF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTkxNTkwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvaW5zdGFsbGF0aW9uLnhtbApAQCAtMCwwICsxLDg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iaW5zdGFsbGF0aW9uLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSJ5b2F2c0BhcGFjaGUub3JnIj5Zb2F2IFNoYXBpcmE8L2F1dGhvcj4KKyAgICA8dGl0bGU+SW5zdGFsbGF0aW9uPC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnN0YWxsYXRpb24iPgorCis8cD5JbiBvcmRlciB0byB1c2UgVG9tY2F0IDUgZm9yIGRldmVsb3Bpbmcgd2ViIGFwcGxpY2F0aW9ucywgeW91IG11c3QgZmlyc3QKK2luc3RhbGwgaXQgKGFuZCB0aGUgc29mdHdhcmUgaXQgZGVwZW5kcyBvbikuICBUaGUgcmVxdWlyZWQgc3RlcHMgYXJlIG91dGxpbmVkCitpbiB0aGUgZm9sbG93aW5nIHN1YnNlY3Rpb25zLjwvcD4KKworPHN1YnNlY3Rpb24gbmFtZT0iSkRLIj4KKworPHA+VG9tY2F0IDUuNSB3YXMgZGVzaWduZWQgdG8gcnVuIG9uIEoyU0UgNS4wLCBidXQgaXQgY2FuIHJ1biBvbiBKREsgMS40CithcyB3ZWxsLCB1c2luZyB0aGUgY29tcGF0YWJpbGl0eSBwYWNrYWdlIGFzIGRldGFpbGVkIGluIHRoZSBUb21jYXQgCitpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgorPC9wPgorCis8cD5Db21wYXRpYmxlIEpES3MgZm9yIG1hbnkgcGxhdGZvcm1zIChvciBsaW5rcyB0byB3aGVyZSB0aGV5IGNhbiBiZSBmb3VuZCkKK2FyZSBhdmFpbGFibGUgYXQKKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8iPmh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS88L2E+LjwvcD4KKworPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJUb21jYXQiPgorCis8cD5CaW5hcnkgZG93bmxvYWRzIG9mIHRoZSA8c3Ryb25nPlRvbWNhdDwvc3Ryb25nPiBzZXJ2ZXIgYXJlIGF2YWlsYWJsZSBmcm9tCis8YSBocmVmPSJodHRwOi8vdG9tY2F0LmFwYWNoZS5vcmcvZG93bmxvYWQtNTUuY2dpIj5odHRwOi8vdG9tY2F0LmFwYWNoZS5vcmcvZG93bmxvYWQtNTUuY2dpPC9hPi4KK1RoaXMgbWFudWFsIGFzc3VtZXMgeW91IGFyZSB1c2luZyB0aGUgbW9zdCByZWNlbnQgcmVsZWFzZQorb2YgVG9tY2F0IDUuICBEZXRhaWxlZCBpbnN0cnVjdGlvbnMgZm9yIGRvd25sb2FkaW5nIGFuZCBpbnN0YWxsaW5nCitUb21jYXQgNSBhcmUgYXZhaWxhYmxlIDxhIGhyZWY9Ii4uL3NldHVwLmh0bWwiPmhlcmU8L2E+LjwvcD4KKworPHA+SW4gdGhlIHJlbWFpbmRlciBvZiB0aGlzIG1hbnVhbCwgZXhhbXBsZSBzaGVsbCBzY3JpcHRzIGFzc3VtZSB0aGF0IHlvdSBoYXZlCitzZXQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgPGNvZGU+Q0FUQUxJTkFfSE9NRTwvY29kZT4gdGhhdCBjb250YWlucyB0aGUKK3BhdGhuYW1lIHRvIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggVG9tY2F0IDUgaGFzIGJlZW4gaW5zdGFsbGVkLjwvcD4KKworPC9zdWJzZWN0aW9uPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9IkFudCI+CisKKzxwPkJpbmFyeSBkb3dubG9hZHMgb2YgdGhlIDxzdHJvbmc+QW50PC9zdHJvbmc+IGJ1aWxkIHRvb2wgYXJlIGF2YWlsYWJsZSBmcm9tCis8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYmluZG93bmxvYWQuY2dpIj5odHRwOi8vYW50LmFwYWNoZS5vcmcvYmluZG93bmxvYWQuY2dpPC9hPi4KK1RoaXMgbWFudWFsIGFzc3VtZXMgeW91IGFyZSB1c2luZyBBbnQgMS40IG9yIGxhdGVyLiAgVGhlIGluc3RydWN0aW9ucyBzaG91bGQKK2Fsc28gYmUgY29tcGF0aWJsZSB3aXRoIGxhdGVyIHZlcnNpb25zLCBidXQgdGhpcyBoYXMgbm90IGJlZW4gdGVzdGVkLjwvcD4KKworPHA+RG93bmxvYWQgYW5kIGluc3RhbGwgQW50IGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBkaXJlY3RvcnkgbWVudGlvbmVkIGFib3ZlLgorVGhlbiwgYWRkIHRoZSA8Y29kZT5iaW48L2NvZGU+IGRpcmVjdG9yeSBvZiB0aGUgQW50IGRpc3RyaWJ1dGlvbiB0byB5b3VyCis8Y29kZT5QQVRIPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgZm9sbG93aW5nIHRoZSBzdGFuZGFyZCBwcmFjdGljZXMgZm9yCit5b3VyIG9wZXJhdGluZyBzeXN0ZW0gcGxhdGZvcm0uICBPbmNlIHlvdSBoYXZlIGRvbmUgdGhpcywgeW91IHdpbGwgYmUgYWJsZSB0bworZXhlY3V0ZSB0aGUgPGNvZGU+YW50PC9jb2RlPiBzaGVsbCBjb21tYW5kIGRpcmVjdGx5LjwvcD4KKworPC9zdWJzZWN0aW9uPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9IkNWUyI+CisKKzxwPkJlc2lkZXMgdGhlIHJlcXVpcmVkIHRvb2xzIGRlc2NyaWJlZCBhYm92ZSwgeW91IGFyZSBzdHJvbmdseSBlbmNvdXJhZ2VkCit0byBkb3dubG9hZCBhbmQgaW5zdGFsbCBhIDxlbT5zb3VyY2UgY29kZSBjb250cm9sPC9lbT4gc3lzdGVtLCBzdWNoIGFzIHRoZQorPHN0cm9uZz5Db25jdXJyZW50IFZlcnNpb24gU3lzdGVtPC9zdHJvbmc+IChDVlMpLCB0byBtYWludGFpbiBoaXN0b3JpY2FsCit2ZXJzaW9ucyBvZiB0aGUgc291cmNlIGZpbGVzIHRoYXQgbWFrZSB1cCB5b3VyIHdlYiBhcHBsaWNhdGlvbi4gIEJlc2lkZXMKK3RoZSBzZXJ2ZXIsIHlvdSB3aWxsIGFsc28gbmVlZCBhcHByb3ByaWF0ZSBjbGllbnQKK3Rvb2xzIHRvIGNoZWNrIG91dCBzb3VyY2UgY29kZSBmaWxlcywgYW5kIGNoZWNrIGluIG1vZGlmaWVkIHZlcnNpb25zLjwvcD4KKworPHA+RGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIGZvciBpbnN0YWxsaW5nIGFuZCB1c2luZyBzb3VyY2UgY29kZSBjb250cm9sCithcHBsaWNhdGlvbnMgaXMgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIG1hbnVhbC4gIEhvd2V2ZXIsIENWUyBzZXJ2ZXIgYW5kCitjbGllbnQgdG9vbHMgZm9yIG1hbnkgcGxhdGZvcm1zIChhbG9uZyB3aXRoIGRvY3VtZW50YXRpb24pIGNhbiBiZSBkb3dubG9hZGVkCitmcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cuY3ZzaG9tZS5vcmciPmh0dHA6Ly93d3cuY3ZzaG9tZS5vcmc8L2E+LjwvcD4KKworPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvaW50cm9kdWN0aW9uLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L2ludHJvZHVjdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiODJiNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L2ludHJvZHVjdGlvbi54bWwKQEAgLTAsMCArMSw4NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImludHJvZHVjdGlvbi5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPkludHJvZHVjdGlvbjwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgorCis8cD5Db25ncmF0dWxhdGlvbnMhICBZb3UndmUgZGVjaWRlZCB0byAob3IgYmVlbiB0b2xkIHRvKSBsZWFybiBob3cgdG8KK2J1aWxkIHdlYiBhcHBsaWNhdGlvbnMgdXNpbmcgc2VydmxldHMgYW5kIEpTUCBwYWdlcywgYW5kIHBpY2tlZCB0aGUKK1RvbWNhdCBzZXJ2ZXIgdG8gdXNlIGZvciB5b3VyIGxlYXJuaW5nIGFuZCBkZXZlbG9wbWVudC4gIEJ1dCBub3cgd2hhdAorZG8geW91IGRvPzwvcD4KKworPHA+VGhpcyBtYW51YWwgaXMgYSBwcmltZXIgY292ZXJpbmcgdGhlIGJhc2ljIHN0ZXBzIG9mIHVzaW5nIFRvbWNhdCB0bworc2V0IHVwIGEgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIG9yZ2FuaXplIHlvdXIgc291cmNlIGNvZGUsIGFuZCB0aGVuCitidWlsZCBhbmQgdGVzdCB5b3VyIGFwcGxpY2F0aW9uLiAgSXQgZG9lcyBub3QgZGlzY3VzcyBhcmNoaXRlY3R1cmVzIG9yCityZWNvbW1lbmRlZCBjb2RpbmcgcHJhY3RpY2VzIGZvciB3ZWIgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQsCitvciBwcm92aWRlIGluIGRlcHRoIGluc3RydWN0aW9ucyBvbiBvcGVyYXRpbmcgdGhlIGRldmVsb3BtZW50Cit0b29scyB0aGF0IGFyZSBkaXNjdXNzZWQuICBSZWZlcmVuY2VzIHRvIHNvdXJjZXMgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorYXJlIGluY2x1ZGVkIGluIHRoZSBmb2xsb3dpbmcgc3Vic2VjdGlvbnMuPC9wPgorCis8cD5UaGUgZGlzY3Vzc2lvbiBpbiB0aGlzIG1hbnVhbCBpcyBhaW1lZCBhdCBkZXZlbG9wZXJzIHdobyB3aWxsIGJlIHVzaW5nCithIHRleHQgZWRpdG9yIGFsb25nIHdpdGggY29tbWFuZCBsaW5lIHRvb2xzIHRvIGRldmVsb3AgYW5kIGRlYnVnIHRoZWlyCithcHBsaWNhdGlvbnMuICBBcyBzdWNoLCB0aGUgcmVjb21tZW5kYXRpb25zIGFyZSBmYWlybHkgZ2VuZXJpYyAtLSBidXQgeW91CitzaG91bGQgZWFzaWx5IGJlIGFibGUgdG8gYXBwbHkgdGhlbSBpbiBlaXRoZXIgYSBXaW5kb3dzLWJhc2VkIG9yIFVuaXgtYmFzZWQKK2RldmVsb3BtZW50IGVudmlyb25tZW50LiAgSWYgeW91IGFyZSB1dGlsaXppbmcgYW4gSW50ZXJhY3RpdmUgRGV2ZWxvcG1lbnQKK0Vudmlyb25tZW50IChJREUpIHRvb2wsIHlvdSB3aWxsIG5lZWQgdG8gYWRhcHQgdGhlIGFkdmljZSBnaXZlbiBoZXJlIHRvCit0aGUgZGV0YWlscyBvZiB5b3VyIHBhcnRpY3VsYXIgZW52aXJvbm1lbnQuPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iTGlua3MiPgorCis8cD5UaGUgZm9sbG93aW5nIGxpbmtzIHByb3ZpZGUgYWNjZXNzIHRvIHNlbGVjdGVkIHNvdXJjZXMgb2Ygb25saW5lCitpbmZvcm1hdGlvbiwgZG9jdW1lbnRhdGlvbiwgYW5kIHNvZnR3YXJlIHRoYXQgaXMgdXNlZnVsIGluIGRldmVsb3BpbmcKK3dlYiBhcHBsaWNhdGlvbnMgd2l0aCBUb21jYXQuPC9wPgorPHVsPgorPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvanNwL2Rvd25sb2FkLmh0bWwiPmh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvanNwL2Rvd25sb2FkLmh0bWw8L2E+IC0KKyAgICA8aT5KYXZhU2VydmVyIFBhZ2VzIChKU1ApIFNwZWNmaWNhdGlvbiwgVmVyc2lvbiAyLjA8L2k+LiAgRGVzY3JpYmVzCisgICAgdGhlIHByb2dyYW1taW5nIGVudmlyb25tZW50IHByb3ZpZGVkIGJ5IHN0YW5kYXJkIGltcGxlbWVudGF0aW9ucworICAgIG9mIHRoZSBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kuICBJbiBjb25qdW5jdGlvbiB3aXRoCisgICAgdGhlIFNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24gKHNlZSBiZWxvdyksIHRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzCisgICAgd2hhdCBhIHBvcnRhYmxlIEFQSSBwYWdlIGlzIGFsbG93ZWQgdG8gY29udGFpbi4gIFNwZWNpZmljCisgICAgaW5mb3JtYXRpb24gb24gc2NyaXB0aW5nIChDaGFwdGVyIDYpLCB0YWcgZXh0ZW5zaW9ucyAoQ2hhcHRlciA3KSwKKyAgICBhbmQgcGFja2FnaW5nIEpTUCBwYWdlcyAoQXBwZW5kaXggQSkgaXMgdXNlZnVsLiAgVGhlIEphdmFkb2MKKyAgICBBUEkgRG9jdW1lbnRhdGlvbiBpcyBpbmNsdWRlZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiwgYW5kIHdpdGggdGhlCisgICAgVG9tY2F0IGRvd25sb2FkLjxici8+PGJyLz48L2xpPgorPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldC9kb3dubG9hZC5odG1sIj5odHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL3NlcnZsZXQvZG93bmxvYWQuaHRtbDwvYT4gLQorICAgIDxpPlNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24sIFZlcnNpb24gMi40PC9pPi4gIERlc2NyaWJlcyB0aGUKKyAgICBwcm9ncmFtbWluZyBlbnZpcm9ubWVudCB0aGF0IG11c3QgYmUgcHJvdmlkZWQgYnkgYWxsIHNlcnZsZXQKKyAgICBjb250YWluZXJzIGNvbmZvcm1pbmcgdG8gdGhpcyBzcGVjaWZpY2F0aW9uLiAgSW4gcGFydGljdWxhciwgeW91CisgICAgd2lsbCBuZWVkIHRoaXMgZG9jdW1lbnQgdG8gdW5kZXJzdGFuZCB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgZGlyZWN0b3J5IHN0cnVjdHVyZSBhbmQgZGVwbG95bWVudCBmaWxlIChDaGFwdGVyIDkpLCBtZXRob2RzIG9mCisgICAgbWFwcGluZyByZXF1ZXN0IFVSSXMgdG8gc2VydmxldHMgKENoYXB0ZXIgMTEpLCBjb250YWluZXIgbWFuYWdlZAorICAgIHNlY3VyaXR5IChDaGFwdGVyIDEyKSwgYW5kIHRoZSBzeW50YXggb2YgdGhlIDxjb2RlPndlYi54bWw8L2NvZGU+CisgICAgV2ViIEFwcGxpY2F0aW9uIERlcGxveW1lbnQgRGVzY3JpcHRvciAoQ2hhcHRlciAxMykuICBUaGUgSmF2YWRvYworICAgIEFQSSBEb2N1bWVudGF0aW9uIGlzIGluY2x1ZGVkIGluIHRoZSBzcGVjaWZpY2F0aW9uLCBhbmQgd2l0aCB0aGUKKyAgICBUb21jYXQgZG93bmxvYWQuPGJyLz48YnIvPjwvbGk+Cis8bGk+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2JsdWVwcmludHMvIj5odHRwOi8vamF2YS5zdW4uY29tL2oyZWUvYmx1ZXByaW50cy88L2E+IC0KKyAgICA8aT5TdW4gQmx1ZVByaW50cyAodG0pIERlc2lnbiBHdWlkZWxpbmVzIGZvciBKMkVFPC9pPi4gIENvbXByZWhlbnNpdmUKKyAgICBhZHZpY2UgYW5kIGV4YW1wbGVzIG9uIGFwcGxpY2F0aW9uIGRlc2lnbiBmb3IgdGhlIEphdmEyIEVudGVycHJpc2UKKyAgICBFZGl0aW9uIChKMkVFKSBwbGF0Zm9ybSwgd2hpY2ggaW5jbHVkZXMgc2VydmxldHMgYW5kIEpTUCBwYWdlcy4gIFRoZQorICAgIGNoYXB0ZXJzIG9uIHNlcnZsZXQgYW5kIEpTUCBkZXNpZ24gYXJlIHVzZWZ1bCBldmVuIHdoZW4geW91ciBhcHBsaWNhdGlvbgorICAgIGRvZXMgbm90IHJlcXVpcmUgb3RoZXIgSjJFRSBwbGF0Zm9ybSBjb21wb25lbnRzLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPjxiPlRPRE88L2I+IC0tIEFkZCBtb3JlIGVudHJpZXMgaGVyZSE8L2xpPgorPC91bD4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9wcm9jZXNzZXMueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvcHJvY2Vzc2VzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjk1MjdiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvcHJvY2Vzc2VzLnhtbApAQCAtMCwwICsxLDI5OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9InByb2Nlc3Nlcy5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPkRldmVsb3BtZW50IFByb2Nlc3NlczwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIj4KKworPHA+QWx0aG91Z2ggYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgY2FuIHRha2UgbWFueSBmb3JtcywgdGhpcyBtYW51YWwgcHJvcG9zZXMKK2EgZmFpcmx5IGdlbmVyaWMgcHJvY2VzcyBmb3IgY3JlYXRpbmcgd2ViIGFwcGxpY2F0aW9ucyB1c2luZyBUb21jYXQuICBUaGUKK2ZvbGxvd2luZyBzZWN0aW9ucyBoaWdobGlnaHQgdGhlIGNvbW1hbmRzIGFuZCB0YXNrcyB0aGF0IHlvdSwgYXMgdGhlIGRldmVsb3Blcgorb2YgdGhlIGNvZGUsIHdpbGwgcGVyZm9ybS4gIFRoZSBzYW1lIGJhc2ljIGFwcHJvYWNoIHdvcmtzIHdoZW4geW91IGhhdmUKK211bHRpcGxlIHByb2dyYW1tZXJzIGludm9sdmVkLCBhcyBsb25nIGFzIHlvdSBoYXZlIGFuIGFwcHJvcHJpYXRlIHNvdXJjZSBjb2RlCitjb250cm9sIHN5c3RlbSBhbmQgaW50ZXJuYWwgdGVhbSBydWxlcyBhYm91dCB3aG8gaXMgd29ya2luZyBvbiB3aGF0IHBhcnRzCitvZiB0aGUgYXBwbGljYXRpb24gYXQgYW55IGdpdmVuIHRpbWUuPC9wPgorCis8cD5UaGUgdGFzayBkZXNjcmlwdGlvbnMgYmVsb3cgYXNzdW1lIHRoYXQgeW91IHdpbGwgYmUgdXNpbmcgQ1ZTIGZvciBzb3VyY2UKK2NvZGUgY29udHJvbCwgYW5kIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBjb25maWd1cmVkIGFjY2VzcyB0byB0aGUgYXBwcm9wcmlhdGUKK0NWUyByZXBvc2l0b3J5LiAgSW5zdHJ1Y3Rpb25zIGZvciBkb2luZyB0aGlzIGFyZSBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMKK21hbnVhbC4gIElmIHlvdSBhcmUgdXNpbmcgYSBkaWZmZXJlbnQgc291cmNlIGNvZGUgY29udHJvbCBlbnZpcm9ubWVudCwgeW91Cit3aWxsIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgY29ycmVzcG9uZGluZyBjb21tYW5kcyBmb3IgeW91ciBzeXN0ZW0uPC9wPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9Ik9uZS1UaW1lIFNldHVwIG9mIEFudCBhbmQgVG9tY2F0IGZvciBEZXZlbG9wbWVudCI+CisKKzxwPkluIG9yZGVyIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBzcGVjaWFsIEFudCB0YXNrcyB0aGF0IGludGVyYWN0IHdpdGggdGhlCis8ZW0+TWFuYWdlcjwvZW0+IHdlYiBhcHBsaWNhdGlvbiwgeW91IG5lZWQgdG8gcGVyZm9ybSB0aGUgZm9sbG93aW5nIHRhc2tzCitvbmNlIChubyBtYXR0ZXIgaG93IG1hbnkgd2ViIGFwcGxpY2F0aW9ucyB5b3UgcGxhbiB0byBkZXZlbG9wKS48L3A+Cis8dWw+Cis8bGk+PGVtPkNvbmZpZ3VyZSB0aGUgQW50IGN1c3RvbSB0YXNrczwvZW0+LiAgVGhlIGltcGxlbWVudGF0aW9uIGNvZGUgZm9yIHRoZQorICAgIEFudCBjdXN0b20gdGFza3MgaXMgaW4gYSBKQVIgZmlsZSBuYW1lZAorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL3NlcnZlci9saWIvY2F0YWxpbmEtYW50LmphcjwvY29kZT4sIHdoaWNoIG11c3QgYmUKKyAgICBjb3BpZWQgaW4gdG8gdGhlIDxjb2RlPmxpYjwvY29kZT4gZGlyZWN0b3J5IG9mIHlvdXIgQW50IGluc3RhbGxhdGlvbi4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT48ZW0+RGVmaW5lIG9uZSBvciBtb3JlIFRvbWNhdCB1c2VyczwvZW0+LiAgVGhlIDxlbT5NYW5hZ2VyPC9lbT4gd2ViCisgICAgYXBwbGljYXRpb24gcnVucyB1bmRlciBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgdGhhdCByZXF1aXJlcyBhIHVzZXIgdG8gYmUKKyAgICBsb2dnZWQgaW4sIGFuZCBoYXZlIHRoZSBzZWN1cml0eSByb2xlIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGFzc2lnbmVkIHRvCisgICAgaGltIG9yIGhlci4gIEhvdyBzdWNoIHVzZXJzIGFyZSBkZWZpbmVkIGRlcGVuZHMgb24gd2hpY2ggUmVhbG0geW91IGhhdmUKKyAgICBjb25maWd1cmVkIGluIFRvbWNhdCdzIDxjb2RlPmNvbmYvc2VydmVyLnhtbDwvY29kZT4gZmlsZSAtLSBzZWUgdGhlCisgICAgPGEgaHJlZj0iLi4vcmVhbG0taG93dG8uaHRtbCI+UmVhbG0gQ29uZmlndXJhdGlvbiBIT1ctVE88L2E+IGZvciBtb3JlCisgICAgaW5mb3JtYXRpb24uICBZb3UgbWF5IGRlZmluZSBhbnkgbnVtYmVyIG9mIHVzZXJzICh3aXRoIGFueSB1c2VybmFtZQorICAgIGFuZCBwYXNzd29yZCB0aGF0IHlvdSBsaWtlKSB3aXRoIHRoZSA8Y29kZT5tYW5hZ2VyPC9jb2RlPiByb2xlLgorICAgIDxici8+PGJyLz48L2xpPgorPC91bD4KKworPC9zdWJzZWN0aW9uPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9IkNyZWF0ZSBQcm9qZWN0IFNvdXJjZSBDb2RlIERpcmVjdG9yeSI+CisKKzxwPlRoZSBmaXJzdCBzdGVwIGlzIHRvIGNyZWF0ZSBhIG5ldyBwcm9qZWN0IHNvdXJjZSBkaXJlY3RvcnksIGFuZCBjdXN0b21pemUKK3RoZSA8Y29kZT5idWlsZC54bWw8L2NvZGU+IGFuZCA8Y29kZT5idWlsZC5wcm9wZXJ0aWVzPC9jb2RlPiBmaWxlcyB5b3Ugd2lsbAorYmUgdXNpbmcuICBUaGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBpcyBkZXNjcmliZWQgaW4gPGEgaHJlZj0ic291cmNlLmh0bWwiPnRoZQorcHJldmlvdXMgc2VjdGlvbjwvYT4sIG9yIHlvdSBjYW4gdXNlIHRoZQorPGEgaHJlZj0ic2FtcGxlLyI+c2FtcGxlIGFwcGxpY2F0aW9uPC9hPiBhcyBhIHN0YXJ0aW5nIHBvaW50LjwvcD4KKworPHA+Q3JlYXRlIHlvdXIgcHJvamVjdCBzb3VyY2UgZGlyZWN0b3J5LCBhbmQgZGVmaW5lIGl0IHdpdGhpbiB5b3VyIENWUworcmVwb3NpdG9yeS4gIFRoaXMgbWlnaHQgYmUgZG9uZSBieSBhIHNlcmllcyBvZiBjb21tYW5kcyBsaWtlIHRoaXMsIHdoZXJlCis8Y29kZT57cHJvamVjdH08L2NvZGU+IGlzIHRoZSBuYW1lIHVuZGVyIHdoaWNoIHlvdXIgcHJvamVjdCBzaG91bGQgYmUKK3N0b3JlZCBpbiB0aGUgQ1ZTIHJlcG9zaXRvcnksIGFuZCB7dXNlcm5hbWV9IGlzIHlvdXIgbG9naW4gdXNlcm5hbWU6PC9wPgorPHNvdXJjZT4KK2NkIHtteSBob21lIGRpcmVjdG9yeX0KK21rZGlyIG15YXBwCSZsdDstLSBBc3N1bWVkICJwcm9qZWN0IHNvdXJjZSBkaXJlY3RvcnkiCitjZCBteWFwcAorbWtkaXIgZG9jcworbWtkaXIgc3JjCitta2RpciB3ZWIKK21rZGlyIHdlYi9XRUItSU5GCitjdnMgaW1wb3J0IC1tICJJbml0aWFsIFByb2plY3QgQ3JlYXRpb24iIHtwcm9qZWN0fSBcCisJe3VzZXJuYW1lfSBzdGFydAorPC9zb3VyY2U+CisKKzxwPk5vdywgdG8gdmVyaWZ5IHRoYXQgaXQgd2FzIGNyZWF0ZWQgY29ycmVjdGx5IGluIENWUywgd2Ugd2lsbCBwZXJmb3JtIGEKK2NoZWNrb3V0IG9mIHRoZSBuZXcgcHJvamVjdDo8L3A+Cis8c291cmNlPgorY2QgLi4KK212IG15YXBwIG15YXBwLmJ1CitjdnMgY2hlY2tvdXQge3Byb2plY3R9Cis8L3NvdXJjZT4KKworPHA+TmV4dCwgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYW5kIGNoZWNrIGluIGFuIGluaXRpYWwgdmVyc2lvbiBvZiB0aGUKKzxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gc2NyaXB0IHRvIGJlIHVzZWQgZm9yIGRldmVsb3BtZW50LiAgRm9yIGdldHRpbmcKK3N0YXJ0ZWQgcXVpY2tseSBhbmQgZWFzaWx5LCBiYXNlIHlvdXIgPGNvZGU+YnVpbGQueG1sPC9jb2RlPiBvbiB0aGUKKzxhIGhyZWY9ImJ1aWxkLnhtbC50eHQiPmJhc2ljIGJ1aWxkLnhtbCBmaWxlPC9hPiwgaW5jbHVkZWQgd2l0aCB0aGlzIG1hbnVhbCwKK29yIGNvZGUgaXQgZnJvbSBzY3JhdGNoLjwvcD4KKzxzb3VyY2U+CitjZCB7bXkgaG9tZSBkaXJlY3Rvcnl9CitjZCBteWFwcAorZW1hY3MgYnVpbGQueG1sCQkmbHQ7LS0gaWYgeW91IHdhbnQgYSByZWFsIGVkaXRvciA6LSkKK2N2cyBhZGQgYnVpbGQueG1sCitjdnMgY29tbWl0Cis8L3NvdXJjZT4KKworPHA+VW50aWwgeW91IHBlcmZvcm0gdGhlIENWUyBjb21taXQsIHlvdXIgY2hhbmdlcyBhcmUgbG9jYWwgdG8geW91ciBvd24KK2RldmVsb3BtZW50IGRpcmVjdG9yeS4gIENvbW1pdHRpbmcgbWFrZXMgdGhvc2UgY2hhbmdlcyB2aXNpYmxlIHRvIG90aGVyCitkZXZlbG9wZXJzIG9uIHlvdXIgdGVhbSB0aGF0IGFyZSBzaGFyaW5nIHRoZSBzYW1lIENWUyByZXBvc2l0b3J5LjwvcD4KKworPHA+VGhlIG5leHQgc3RlcCBpcyB0byBjdXN0b21pemUgdGhlIEFudCA8ZW0+cHJvcGVydGllczwvZW0+IHRoYXQgYXJlCituYW1lZCBpbiB0aGUgPGNvZGU+YnVpbGQueG1sPC9jb2RlPiBzY3JpcHQuICBUaGlzIGlzIGRvbmUgYnkgY3JlYXRpbmcgYQorZmlsZSBuYW1lZCA8Y29kZT5idWlsZC5wcm9wZXJ0aWVzPC9jb2RlPiBpbiB5b3VyIHByb2plY3QncyB0b3AtbGV2ZWwKK2RpcmVjdG9yeS4gIFRoZSBzdXBwb3J0ZWQgcHJvcGVydGllcyBhcmUgbGlzdGVkIGluIHRoZSBjb21tZW50cyBpbnNpZGUKK3RoZSBzYW1wbGUgPGNvZGU+YnVpbGQueG1sPC9jb2RlPiBzY3JpcHQuICBBdCBhIG1pbmltdW0sIHlvdSB3aWxsIGdlbmVyYWxseQorbmVlZCB0byBkZWZpbmUgdGhlIDxjb2RlPmNhdGFsaW5hLmhvbWU8L2NvZGU+IHByb3BlcnR5IGRlZmluaW5nIHdoZXJlCitUb21jYXQgNSBpcyBpbnN0YWxsZWQsIGFuZCB0aGUgbWFuYWdlciBhcHBsaWNhdGlvbiB1c2VybmFtZSBhbmQgcGFzc3dvcmQuCitZb3UgbWlnaHQgZW5kIHVwIHdpdGggc29tZXRoaW5nIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorIyBDb250ZXh0IHBhdGggdG8gaW5zdGFsbCB0aGlzIGFwcGxpY2F0aW9uIG9uCithcHAucGF0aD0vaGVsbG8KKworIyBUb21jYXQgNSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5CitjYXRhbGluYS5ob21lPS91c3IvbG9jYWwvYXBhY2hlLXRvbWNhdC01LjUKKworIyBNYW5hZ2VyIHdlYmFwcCB1c2VybmFtZSBhbmQgcGFzc3dvcmQKK21hbmFnZXIudXNlcm5hbWU9bXl1c2VybmFtZQorbWFuYWdlci5wYXNzd29yZD1teXBhc3N3b3JkCis8L3NvdXJjZT4KKworPHA+SW4gZ2VuZXJhbCwgeW91IHdpbGwgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gd2FudCB0byBjaGVjayB0aGUKKzxjb2RlPmJ1aWxkLnByb3BlcnRpZXM8L2NvZGU+IGZpbGUgaW4gdG8gdGhlIENWUyByZXBvc2l0b3J5LCBiZWNhdXNlIGl0CitpcyB1bmlxdWUgdG8gZWFjaCBkZXZlbG9wZXIncyBlbnZpcm9ubWVudC48L3A+CisKKzxwPk5vdywgY3JlYXRlIHRoZSBpbml0aWFsIHZlcnNpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CitkZXNjcmlwdG9yLiAgWW91IGNhbiBiYXNlIDxjb2RlPndlYi54bWw8L2NvZGU+IG9uIHRoZQorPGEgaHJlZj0id2ViLnhtbC50eHQiPmJhc2ljIHdlYi54bWwgZmlsZTwvYT4sIG9yIGNvZGUgaXQgZnJvbSBzY3JhdGNoLjwvcD4KKzxzb3VyY2U+CitjZCB7bXkgaG9tZSBkaXJlY3Rvcnl9CitjZCBteWFwcC93ZWIvV0VCLUlORgorZW1hY3Mgd2ViLnhtbAorY3ZzIGFkZCB3ZWIueG1sCitjdnMgY29tbWl0Cis8L3NvdXJjZT4KKworTm90ZSB0aGF0IHRoaXMgaXMgb25seSBhbiBleGFtcGxlIHdlYi54bWwgZmlsZS4gIFRoZSBmdWxsIGRlZmluaXRpb24KK29mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSBpcyBpbiB0aGUKKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldCI+U2VydmxldCBTcGVjaWZpY2F0aW9uLjwvYT4KKworPC9zdWJzZWN0aW9uPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9IkVkaXQgU291cmNlIENvZGUgYW5kIFBhZ2VzIj4KKworPHA+VGhlIGVkaXQvYnVpbGQvdGVzdCB0YXNrcyB3aWxsIGdlbmVyYWxseSBiZSB5b3VyIG1vc3QgY29tbW9uIGFjdGl2aXRpZXMKK2R1cmluZyBkZXZlbG9wbWVudCBhbmQgbWFpbnRlbmFuY2UuICBUaGUgZm9sbG93aW5nIGdlbmVyYWwgcHJpbmNpcGxlcyBhcHBseS4KK0FzIGRlc2NyaWJlZCBpbiA8YSBocmVmPSJzb3VyY2UuaHRtbCI+U291cmNlIE9yZ2FuaXphdGlvbjwvYT4sIG5ld2x5IGNyZWF0ZWQKK3NvdXJjZSBmaWxlcyBzaG91bGQgYmUgbG9jYXRlZCBpbiB0aGUgYXBwcm9wcmlhdGUgc3ViZGlyZWN0b3J5LCB1bmRlciB5b3VyCitwcm9qZWN0IHNvdXJjZSBkaXJlY3RvcnkuPC9wPgorCis8cD5XaGVuZXZlciB5b3Ugd2lzaCB0byByZWZyZXNoIHlvdXIgZGV2ZWxvcG1lbnQgZGlyZWN0b3J5IHRvIHJlZmxlY3QgdGhlCit3b3JrIHBlcmZvcm1lZCBieSBvdGhlciBkZXZlbG9wZXJzLCB5b3Ugd2lsbCBhc2sgQ1ZTIHRvIGRvIGl0IGZvciB5b3U6PC9wPgorPHNvdXJjZT4KK2NkIHtteSBob21lIGRpcmVjdG9yeX0KK2NkIG15YXBwCitjdnMgdXBkYXRlIC1kUAorPC9zb3VyY2U+CisKKzxwPlRvIGNyZWF0ZSBhIG5ldyBmaWxlLCBnbyB0byB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5LCBjcmVhdGUgdGhlIGZpbGUsCithbmQgcmVnaXN0ZXIgaXQgd2l0aCBDVlMuICBXaGVuIHlvdSBhcmUgc2F0aXNmaWVkIHdpdGggaXQncyBjb250ZW50cyAoYWZ0ZXIKK2J1aWxkaW5nIGFuZCB0ZXN0aW5nIGlzIHN1Y2Nlc3NmdWwpLCBjb21taXQgdGhlIG5ldyBmaWxlIHRvIHRoZSByZXBvc2l0b3J5LgorRm9yIGV4YW1wbGUsIHRvIGNyZWF0ZSBhIG5ldyBKU1AgcGFnZTo8L3A+Cis8c291cmNlPgorY2Qge215IGhvbWUgZGlyZWN0b3J5fQorY2QgbXlhcHAvd2ViCQkmbHQ7LS0gVWx0aW1hdGUgZGVzdGluYXRpb24gaXMgZG9jdW1lbnQgcm9vdAorZW1hY3MgbXlwYWdlLmpzcAorY3ZzIGFkZCBteXBhZ2UuanNwCisuLi4gYnVpbGQgYW5kIHRlc3QgdGhlIGFwcGxpY2F0aW9uIC4uLgorY3ZzIGNvbW1pdAorPC9zb3VyY2U+CisKKzxwPkphdmEgc291cmNlIGNvZGUgdGhhdCBpcyBkZWZpbmVkIGluIHBhY2thZ2VzIG11c3QgYmUgb3JnYW5pemVkIGluIGEKK2RpcmVjdG9yeSBoaWVyYXJjaHkgKHVuZGVyIHRoZSA8c3Ryb25nPnNyYy88L3N0cm9uZz4gc3ViZGlyZWN0b3J5KSB0aGF0CittYXRjaGVzIHRoZSBwYWNrYWdlIG5hbWVzLiAgRm9yIGV4YW1wbGUsIGEgSmF2YSBjbGFzcyBuYW1lZAorPGNvZGU+Y29tLm15Y29tcGFueS5teXBhY2thZ2UuTXlDbGFzcy5qYXZhPC9jb2RlPiBzaG91bGQgYmUgc3RvcmVkIGluIGZpbGUKKzxjb2RlPnNyYy9jb20vbXljb21wYW55L215cGFja2FnZS9NeUNsYXNzLmphdmE8L2NvZGU+LgorV2hlbmV2ZXIgeW91IGNyZWF0ZSBhIG5ldyBzdWJkaXJlY3RvcnksIGRvbid0IGZvcmdldCB0bworcmVnaXN0ZXIgaXQgd2l0aCBDVlMuPC9wPgorCis8cD5UbyBlZGl0IGFuIGV4aXN0aW5nIHNvdXJjZSBmaWxlLCB5b3Ugd2lsbCBnZW5lcmFsbHkganVzdCBzdGFydCBlZGl0aW5nCithbmQgdGVzdGluZywgdGhlbiBjb21taXQgdGhlIGNoYW5nZWQgZmlsZSB3aGVuIGV2ZXJ5dGhpbmcgd29ya3MuICBBbHRob3VnaAorQ1ZTIGNhbiBiZSBjb25maWd1cmVkIHRvIHJlcXVpcmVkIHlvdSB0byAiY2hlY2sgb3V0IiBvciAibG9jayIgYSBmaWxlIHlvdQorYXJlIGdvaW5nIHRvIGJlIG1vZGlmeWluZywgdGhpcyBpcyBnZW5lcmFsbHkgbm90IHVzZWQuPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKworPHN1YnNlY3Rpb24gbmFtZT0iQnVpbGQgdGhlIFdlYiBBcHBsaWNhdGlvbiI+CisKKzxwPldoZW4geW91IGFyZSByZWFkeSB0byBjb21waWxlIHRoZSBhcHBsaWNhdGlvbiwgaXNzdWUgdGhlIGZvbGxvd2luZworY29tbWFuZHMgKGdlbmVyYWxseSwgeW91IHdpbGwgd2FudCBhIHNoZWxsIHdpbmRvdyBvcGVuIHRoYXQgaXMgc2V0IHRvCit0aGUgcHJvamVjdCBzb3VyY2UgZGlyZWN0b3J5LCBzbyB0aGF0IG9ubHkgdGhlIGxhc3QgY29tbWFuZCBpcyBuZWVkZWQpOjwvcD4KKzxzb3VyY2U+CitjZCB7bXkgaG9tZSBkaXJlY3Rvcnl9CitjZCBteWFwcAkJJmx0Oy0tIE5vcm1hbGx5IGxlYXZlIGEgd2luZG93IG9wZW4gaGVyZQorYW50Cis8L3NvdXJjZT4KKworPHA+VGhlIEFudCB0b29sIHdpbGwgYmUgZXhlY3V0ZSB0aGUgZGVmYXVsdCAiY29tcGlsZSIgdGFyZ2V0IGluIHlvdXIKKzxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gZmlsZSwgd2hpY2ggd2lsbCBjb21waWxlIGFueSBuZXcgb3IgdXBkYXRlZCBKYXZhCitjb2RlLiAgSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB5b3UgY29tcGlsZSBhZnRlciBhICJidWlsZCBjbGVhbiIsCitpdCB3aWxsIGNhdXNlIGV2ZXJ5dGhpbmcgdG8gYmUgcmVjb21waWxlZC48L3A+CisKKzxwPlRvIGZvcmNlIHRoZSByZWNvbXBpbGF0aW9uIG9mIHlvdXIgZW50aXJlIGFwcGxpY2F0aW9uLCBkbyB0aGlzIGluc3RlYWQ6PC9wPgorPHNvdXJjZT4KK2NkIHtteSBob21lIGRpcmVjdG9yeX0KK2NkIG15YXBwCithbnQgYWxsCis8L3NvdXJjZT4KKworPHA+VGhpcyBpcyBhIHZlcnkgZ29vZCBoYWJpdCBpbW1lZGlhdGVseSBiZWZvcmUgY2hlY2tpbmcgaW4gY2hhbmdlcywgdG8KK21ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIG5vdCBpbnRyb2R1Y2VkIGFueSBzdWJ0bGUgcHJvYmxlbXMgdGhhdCBKYXZhYydzCitjb25kaXRpb25hbCBjaGVja2luZyBkaWQgbm90IGNhdGNoLjwvcD4KKworPC9zdWJzZWN0aW9uPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9IlRlc3QgWW91ciBXZWIgQXBwbGljYXRpb24iPgorCis8cD5UbyB0ZXN0IHlvdXIgYXBwbGljYXRpb24sIHlvdSB3aWxsIHdhbnQgdG8gaW5zdGFsbCBpdCB1bmRlciBUb21jYXQuICBUaGUKK3F1aWNrZXN0IHdheSB0byBkbyB0aGF0IGlzIHRvIHVzZSB0aGUgY3VzdG9tIEFudCB0YXNrcyB0aGF0IGFyZSBpbmNsdWRlZCBpbgordGhlIHNhbXBsZSA8Y29kZT5idWlsZC54bWw8L2NvZGU+IHNjcmlwdC4gIFVzaW5nIHRoZXNlIGNvbW1hbmRzIG1pZ2h0IGZvbGxvdworYSBwYXR0ZXJuIGxpa2UgdGhpczo8L3A+Cis8dWw+Cis8bGk+PGVtPlN0YXJ0IFRvbWNhdCA1IGlmIG5lZWRlZDwvZW0+LiAgSWYgVG9tY2F0IDUgaXMgbm90IGFscmVhZHkgcnVubmluZywKKyAgICB5b3Ugd2lsbCBuZWVkIHRvIHN0YXJ0IGl0IGluIHRoZSB1c3VhbCB3YXkuCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+PGVtPkNvbXBpbGUgeW91ciBhcHBsaWNhdGlvbjwvZW0+LiAgVXNlIHRoZSA8Y29kZT5hbnQgY29tcGlsZTwvY29kZT4KKyAgICBjb21tYW5kIChvciBqdXN0IDxjb2RlPmFudDwvY29kZT4sIHNpbmNlIHRoaXMgaXMgdGhlIGRlZmF1bHQpLiAgTWFrZQorICAgIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gY29tcGlsYXRpb24gZXJyb3JzLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPjxlbT5JbnN0YWxsIHRoZSBhcHBsaWNhdGlvbjwvZW0+LiAgVXNlIHRoZSA8Y29kZT5hbnQgaW5zdGFsbDwvY29kZT4KKyAgICBjb21tYW5kLiAgVGhpcyB0ZWxscyBUb21jYXQgdG8gaW1tZWRpYXRlbHkgc3RhcnQgcnVubmluZyB5b3VyIGFwcCBvbgorICAgIHRoZSBjb250ZXh0IHBhdGggZGVmaW5lZCBpbiB0aGUgPGNvZGU+YXBwLnBhdGg8L2NvZGU+IGJ1aWxkIHByb3BlcnR5LgorICAgIFRvbWNhdCBkb2VzIDxzdHJvbmc+Tk9UPC9zdHJvbmc+IGhhdmUgdG8gYmUgcmVzdGFydGVkIGZvciB0aGlzIHRvCisgICAgdGFrZSBlZmZlY3QuPGJyLz48YnIvPjwvbGk+Cis8bGk+PGVtPlRlc3QgdGhlIGFwcGxpY2F0aW9uPC9lbT4uICBVc2luZyB5b3VyIGJyb3dzZXIgb3Igb3RoZXIgdGVzdGluZworICAgIHRvb2xzLCB0ZXN0IHRoZSBmdW5jdGlvbmFsaXR5IG9mIHlvdXIgYXBwbGljYXRpb24uCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+PGVtPk1vZGlmeSBhbmQgcmVidWlsZCBhcyBuZWVkZWQ8L2VtPi4gIEFzIHlvdSBkaXNjb3ZlciB0aGF0IGNoYW5nZXMKKyAgICBhcmUgcmVxdWlyZWQsIG1ha2UgdGhvc2UgY2hhbmdlcyBpbiB0aGUgb3JpZ2luYWwgPHN0cm9uZz5zb3VyY2U8L3N0cm9uZz4KKyAgICBmaWxlcywgbm90IGluIHRoZSBvdXRwdXQgYnVpbGQgZGlyZWN0b3J5LCBhbmQgcmUtaXNzdWUgdGhlCisgICAgPGNvZGU+YW50IGNvbXBpbGU8L2NvZGU+IGNvbW1hbmQuICBUaGlzIGVuc3VyZXMgdGhhdCB5b3VyIGNoYW5nZXMgd2lsbAorICAgIGJlIGF2YWlsYWJsZSB0byBiZSBzYXZlZCAodmlhIDxjb2RlPmN2cyBjb21taXQ8L2NvZGU+KSBsYXRlciBvbiAtLQorICAgIHRoZSBvdXRwdXQgYnVpbGQgZGlyZWN0b3J5IGlzIGRlbGV0ZWQgYW5kIHJlY3JlYXRlZCBhcyBuZWNlc3NhcnkuCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+PGVtPlJlbG9hZCB0aGUgYXBwbGljYXRpb248L2VtPi4gIFRvbWNhdCB3aWxsIHJlY29nbml6ZSBjaGFuZ2VzIGluCisgICAgSlNQIHBhZ2VzIGF1dG9tYXRpY2FsbHksIGJ1dCBpdCB3aWxsIGNvbnRpbnVlIHRvIHVzZSB0aGUgb2xkIHZlcnNpb25zCisgICAgb2YgYW55IHNlcnZsZXQgb3IgSmF2YUJlYW4gY2xhc3NlcyB1bnRpbCB0aGUgYXBwbGljYXRpb24gaXMgcmVsb2FkZWQuCisgICAgWW91IGNhbiB0cmlnZ2VyIHRoaXMgYnkgZXhlY3V0aW5nIHRoZSA8Y29kZT5hbnQgcmVsb2FkPC9jb2RlPiBjb21tYW5kLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPjxlbT5SZW1vdmUgdGhlIGFwcGxpY2F0aW9uIHdoZW4geW91IHJlIGRvbmU8L2VtPi4gIFdoZW4geW91IGFyZSB0aHJvdWdoCisgICAgd29ya2luZyBvbiB0aGlzIGFwcGxpY2F0aW9uLCB5b3UgY2FuIHJlbW92ZSBpdCBmcm9tIGxpdmUgZXhlY3V0aW9uIGJ5CisgICAgcnVubmluZyB0aGUgPGNvZGU+YW50IHJlbW92ZTwvY29kZT4gY29tbWFuZC48L2xpPgorPC91bD4KKworPHA+RG8gbm90IGZvcmdldCB0byBjb21taXQgeW91ciBjaGFuZ2VzIHRvIHRoZSBzb3VyY2UgY29kZSByZXBvc2l0b3J5IHdoZW4KK3lvdSBoYXZlIGNvbXBsZXRlZCB5b3VyIHRlc3RpbmchPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKworPHN1YnNlY3Rpb24gbmFtZT0iQ3JlYXRpbmcgYSBSZWxlYXNlIj4KKworPHA+V2hlbiB5b3UgYXJlIHRocm91Z2ggYWRkaW5nIG5ldyBmdW5jdGlvbmFsaXR5LCBhbmQgeW91J3ZlIHRlc3RlZCBldmVyeXRoaW5nCisoeW91IERPIHRlc3QsIGRvbid0IHlvdSA6LSksIGl0IGlzIHRpbWUgdG8gY3JlYXRlIHRoZSBkaXN0cmlidXRhYmxlIHZlcnNpb24KK29mIHlvdXIgd2ViIGFwcGxpY2F0aW9uIHRoYXQgY2FuIGJlIGRlcGxveWVkIG9uIHRoZSBwcm9kdWN0aW9uIHNlcnZlci4gIFRoZQorZm9sbG93aW5nIGdlbmVyYWwgc3RlcHMgYXJlIHJlcXVpcmVkOjwvcD4KKzx1bD4KKzxsaT5Jc3N1ZSB0aGUgY29tbWFuZCA8Y29kZT5hbnQgYWxsPC9jb2RlPiBmcm9tIHRoZSBwcm9qZWN0IHNvdXJjZQorICAgIGRpcmVjdG9yeSwgdG8gcmVidWlsZCBldmVyeXRoaW5nIGZyb20gc2NyYXRjaCBvbmUgbGFzdCB0aW1lLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPlVzZSB0aGUgPGNvZGU+Y3ZzIHRhZzwvY29kZT4gY29tbWFuZCB0byBjcmVhdGUgYW4gaWRlbnRpZmllciBmb3IKKyAgICBhbGwgb2YgdGhlIHNvdXJjZSBmaWxlcyB1dGlsaXplZCB0byBjcmVhdGUgdGhpcyByZWxlYXNlLiAgVGhpcyBhbGxvd3MKKyAgICB5b3UgdG8gcmVsaWFibHkgcmVjb25zdHJ1Y3QgYSByZWxlYXNlIChmcm9tIHNvdXJjZXMpIGF0IGEgbGF0ZXIKKyAgICB0aW1lLjwvbGk+Cis8bGk+SXNzdWUgdGhlIGNvbW1hbmQgPGNvZGU+YW50IGRpc3Q8L2NvZGU+IHRvIGNyZWF0ZSBhIGRpc3RyaWJ1dGFibGUKKyAgICB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSAoV0FSKSBmaWxlLCBhcyB3ZWxsIGFzIGEgSkFSIGZpbGUgY29udGFpbmluZworICAgIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPlBhY2thZ2UgdGhlIGNvbnRlbnRzIG9mIHRoZSA8Y29kZT5kaXN0PC9jb2RlPiBkaXJlY3RvcnkgdXNpbmcgdGhlCisgICAgPHN0cm9uZz50YXI8L3N0cm9uZz4gb3IgPHN0cm9uZz56aXA8L3N0cm9uZz4gdXRpbGl0eSwgYWNjb3JkaW5nIHRvCisgICAgdGhlIHN0YW5kYXJkIHJlbGVhc2UgcHJvY2VkdXJlcyB1c2VkIGJ5IHlvdXIgb3JnYW5pemF0aW9uLjwvbGk+Cis8L3VsPgorCis8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCis8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvcHJvamVjdC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9wcm9qZWN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGRlYWNlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvcHJvamVjdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPHByb2plY3QgbmFtZT0iQXBwbGljYXRpb24gRGV2ZWxvcGVyJ3MgR3VpZGUiCisgICAgICAgIGhyZWY9Imh0dHA6Ly9hcGFjaGUuYXBhY2hlLm9yZy8iPgorCisgICAgPHRpdGxlPkFwcGxpY2F0aW9uIERldmVsb3BlcidzIEd1aWRlPC90aXRsZT4KKworICAgIDxsb2dvIGhyZWY9Ii9pbWFnZXMvdG9tY2F0LmdpZiI+CisgICAgICBUaGUgVG9tY2F0IFNlcnZsZXQvSlNQIENvbnRhaW5lcgorICAgIDwvbG9nbz4KKworICAgIAorICAgIDxib2R5PgorCisgICAgPG1lbnUgbmFtZT0iTGlua3MiPgorICAgICAgICA8aXRlbSBuYW1lPSJEb2NzIEhvbWUiICAgICAgICAgICAgIGhyZWY9Ii4uL2luZGV4Lmh0bWwiLz4KKyAgICA8L21lbnU+CisKKyAgICA8bWVudSBuYW1lPSJDb250ZW50cyI+CisgICAgICAgIDxpdGVtIG5hbWU9IkNvbnRlbnRzIiAgICAgICAgICAgICAgaHJlZj0iaW5kZXguaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJJbnRyb2R1Y3Rpb24iICAgICAgICAgIGhyZWY9ImludHJvZHVjdGlvbi5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9Ikluc3RhbGxhdGlvbiIgICAgICAgICAgaHJlZj0iaW5zdGFsbGF0aW9uLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iRGVwbG95bWVudCIgICAgICAgICAgICBocmVmPSJkZXBsb3ltZW50Lmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iU291cmNlIENvZGUiICAgICAgICAgICBocmVmPSJzb3VyY2UuaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJQcm9jZXNzZXMiICAgICAgICAgICAgIGhyZWY9InByb2Nlc3Nlcy5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IkV4YW1wbGUgQXBwIiAgICAgICAgICAgaHJlZj0ic2FtcGxlLyIvPgorICAgIDwvbWVudT4KKworICAgIDwvYm9keT4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L3NhbXBsZS9kb2NzL1JFQURNRS50eHQgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvZG9jcy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MWM5ODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvZG9jcy9SRUFETUUudHh0CkBAIC0wLDAgKzEsMiBAQAorVGhpcyBpcyBhIGR1bW15IFJFQURNRSBmaWxlIGZvciB0aGUgc2FtcGxlCit3ZWIgYXBwbGljYXRpb24uCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvaW5kZXguaHRtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L3NhbXBsZS9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MmM5NzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvaW5kZXguaHRtbApAQCAtMCwwICsxLDMwIEBACis8aHRtbD4KKzxoZWFkPgorPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJCZW4gU291dGhlciIgLz4KKzx0aXRsZT5TYW1wbGUgQXBwbGljYXRpb248L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDI+U2FtcGxlIEFwcGxpY2F0aW9uPC9oMj4KKyAgICAgIDxwPiAKKyAgICAgICAgVGhlIGV4YW1wbGUgYXBwIGhhcyBiZWVuIHBhY2thZ2VkIGFzIGEgd2FyIGZpbGUgYW5kIGNhbiBiZSBkb3dubG9hZGVkIAorICAgICAgICA8YSBocmVmPSJzYW1wbGUud2FyIj5oZXJlPC9hPiAoTm90ZTogbWFrZSBzdXJlIHlvdXIgYnJvd3NlciBkb2Vzbid0IAorICAgICAgICBjaGFuZ2UgZmlsZSBleHRlbnNpb24gb3IgYXBwZW5kIGEgbmV3IG9uZSkuCisgICAgICA8L3A+CisgICAgICA8cD4gCisgICAgICAgIFRoZSBlYXNpZXN0IHdheSB0byBydW4gdGhpcyBhcHBsaWNhdGlvbiBpcyBzaW1wbHkgdG8gbW92ZSB0aGUgd2FyIGZpbGUgCisgICAgICAgIHRvIHlvdXIgPGI+Q0FUQUxJTkFfSE9NRS93ZWJhcHBzPC9iPiBkaXJlY3RvcnkuIFRvbWNhdCB3aWxsIGF1dG9tYXRpY2FsbHkgCisgICAgICAgIGV4cGFuZCBhbmQgZGVwbG95IHRoZSBhcHBsaWNhdGlvbiBmb3IgeW91LiBZb3UgY2FuIHZpZXcgaXQgd2l0aCB0aGUgCisgICAgICAgIGZvbGxvd2luZyBVUkwgKGFzc3VtaW5nIHRoYXQgeW91J3JlIHJ1bm5pbmcgdG9tY2F0IG9uIHBvcnQgODA4MCAKKyAgICAgICAgYXMgaXMgdGhlIGRlZmF1bHQpOgorICAgICAgICA8YnIgLz4KKyAgICAgICAgPGEgaHJlZj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL3NhbXBsZSI+aHR0cDovL2xvY2FsaG9zdDo4MDgwL3NhbXBsZTwvYT4KKyAgICAgIDwvcD4KKyAgICAgIDxwPgorICAgICAgICBJZiB5b3UganVzdCB3YW50IHRvIGJyb3dzZSB0aGUgY29kZSB5b3UgY2FuIHVucGFjayB0aGUgd2FyIGZpbGUgCisgICAgICAgIHdpdGggdGhlIDxiPmphcjwvYj4gY29tbWFuZC4KKyAgICAgICAgPHNvdXJjZT4KKyAgICAgICAgICBqYXIgLXh2ZiBzYW1wbGUud2FyCisgICAgICAgIDwvc291cmNlPgorICAgICAgPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L3NhbXBsZS9zYW1wbGUud2FyIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc2FtcGxlL3NhbXBsZS53YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzZjZjMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L3NhbXBsZS9zYW1wbGUud2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L3NhbXBsZS9zcmMvbXlwYWNrYWdlL0hlbGxvLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvc3JjL215cGFja2FnZS9IZWxsby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYzkzODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvc3JjL215cGFja2FnZS9IZWxsby5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG15cGFja2FnZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisKKy8qKgorICogU2ltcGxlIHNlcnZsZXQgdG8gdmFsaWRhdGUgdGhhdCB0aGUgSGVsbG8sIFdvcmxkIGV4YW1wbGUgY2FuCisgKiBleGVjdXRlIHNlcnZsZXRzLiAgSW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsCisgKiB0aGlzIHNlcnZsZXQgbXVzdCBiZSBtYXBwZWQgdG8gY29ycmVzcG9uZCB0byB0aGUgbGluayBpbiB0aGUKKyAqICJpbmRleC5odG1sIiBmaWxlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbiA8Q3JhaWcuTWNDbGFuYWhhbkBlbmcuc3VuLmNvbT4KKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgSGVsbG8gZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIC8qKgorICAgICAqIFJlc3BvbmQgdG8gYSBHRVQgcmVxdWVzdCBmb3IgdGhlIGNvbnRlbnQgcHJvZHVjZWQgYnkKKyAgICAgKiB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBwcm9kdWNpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKwlyZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKwl3cml0ZXIucHJpbnRsbigiPGh0bWw+Iik7CisJd3JpdGVyLnByaW50bG4oIjxoZWFkPiIpOworCXdyaXRlci5wcmludGxuKCI8dGl0bGU+U2FtcGxlIEFwcGxpY2F0aW9uIFNlcnZsZXQgUGFnZTwvdGl0bGU+Iik7CisJd3JpdGVyLnByaW50bG4oIjwvaGVhZD4iKTsKKwl3cml0ZXIucHJpbnRsbigiPGJvZHkgYmdjb2xvcj13aGl0ZT4iKTsKKworCXdyaXRlci5wcmludGxuKCI8dGFibGUgYm9yZGVyPVwiMFwiPiIpOworCXdyaXRlci5wcmludGxuKCI8dHI+Iik7CisJd3JpdGVyLnByaW50bG4oIjx0ZD4iKTsKKwl3cml0ZXIucHJpbnRsbigiPGltZyBzcmM9XCJpbWFnZXMvdG9tY2F0LmdpZlwiPiIpOworCXdyaXRlci5wcmludGxuKCI8L3RkPiIpOworCXdyaXRlci5wcmludGxuKCI8dGQ+Iik7CisJd3JpdGVyLnByaW50bG4oIjxoMT5TYW1wbGUgQXBwbGljYXRpb24gU2VydmxldDwvaDE+Iik7CisJd3JpdGVyLnByaW50bG4oIlRoaXMgaXMgdGhlIG91dHB1dCBvZiBhIHNlcnZsZXQgdGhhdCBpcyBwYXJ0IG9mIik7CisJd3JpdGVyLnByaW50bG4oInRoZSBIZWxsbywgV29ybGQgYXBwbGljYXRpb24uIik7CisJd3JpdGVyLnByaW50bG4oIjwvdGQ+Iik7CisJd3JpdGVyLnByaW50bG4oIjwvdHI+Iik7CisJd3JpdGVyLnByaW50bG4oIjwvdGFibGU+Iik7CisKKwl3cml0ZXIucHJpbnRsbigiPC9ib2R5PiIpOworCXdyaXRlci5wcmludGxuKCI8L2h0bWw+Iik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc2FtcGxlL3dlYi9XRUItSU5GL3dlYi54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvd2ViL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWUyOTc0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc2FtcGxlL3dlYi9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCisgICAgdmVyc2lvbj0iMi40Ij4KKworICAgIDxkaXNwbGF5LW5hbWU+SGVsbG8sIFdvcmxkIEFwcGxpY2F0aW9uPC9kaXNwbGF5LW5hbWU+CisgICAgPGRlc2NyaXB0aW9uPgorCVRoaXMgaXMgYSBzaW1wbGUgd2ViIGFwcGxpY2F0aW9uIHdpdGggYSBzb3VyY2UgY29kZSBvcmdhbml6YXRpb24KKwliYXNlZCBvbiB0aGUgcmVjb21tZW5kYXRpb25zIG9mIHRoZSBBcHBsaWNhdGlvbiBEZXZlbG9wZXIncyBHdWlkZS4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SGVsbG9TZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm15cGFja2FnZS5IZWxsbzwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkhlbGxvU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2hlbGxvPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc2FtcGxlL3dlYi9oZWxsby5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvd2ViL2hlbGxvLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTk2MDg4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc2FtcGxlL3dlYi9oZWxsby5qc3AKQEAgLTAsMCArMSwyMyBAQAorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5TYW1wbGUgQXBwbGljYXRpb24gSlNQIFBhZ2U8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgYmdjb2xvcj13aGl0ZT4KKworPHRhYmxlIGJvcmRlcj0iMCI+Cis8dHI+Cis8dGQgYWxpZ249Y2VudGVyPgorPGltZyBzcmM9ImltYWdlcy90b21jYXQuZ2lmIj4KKzwvdGQ+Cis8dGQ+Cis8aDE+U2FtcGxlIEFwcGxpY2F0aW9uIEpTUCBQYWdlPC9oMT4KK1RoaXMgaXMgdGhlIG91dHB1dCBvZiBhIEpTUCBwYWdlIHRoYXQgaXMgcGFydCBvZiB0aGUgSGVsbG8sIFdvcmxkCithcHBsaWNhdGlvbi4KKzwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworPCU9IG5ldyBTdHJpbmcoIkhlbGxvISIpICU+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L3NhbXBsZS93ZWIvaW1hZ2VzL3RvbWNhdC5naWYgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvd2ViL2ltYWdlcy90b21jYXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjdkODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvd2ViL2ltYWdlcy90b21jYXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L3NhbXBsZS93ZWIvaW5kZXguaHRtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L3NhbXBsZS93ZWIvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWI3YTcwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc2FtcGxlL3dlYi9pbmRleC5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+U2FtcGxlICJIZWxsbywgV29ybGQiIEFwcGxpY2F0aW9uPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9d2hpdGU+CisKKzx0YWJsZSBib3JkZXI9IjAiPgorPHRyPgorPHRkPgorPGltZyBzcmM9ImltYWdlcy90b21jYXQuZ2lmIj4KKzwvdGQ+Cis8dGQ+Cis8aDE+U2FtcGxlICJIZWxsbywgV29ybGQiIEFwcGxpY2F0aW9uPC9oMT4KKzxwPlRoaXMgaXMgdGhlIGhvbWUgcGFnZSBmb3IgYSBzYW1wbGUgYXBwbGljYXRpb24gdXNlZCB0byBpbGx1c3RyYXRlIHRoZQorc291cmNlIGRpcmVjdG9yeSBvcmdhbml6YXRpb24gb2YgYSB3ZWIgYXBwbGljYXRpb24gdXRpbGl6aW5nIHRoZSBwcmluY2lwbGVzCitvdXRsaW5lZCBpbiB0aGUgQXBwbGljYXRpb24gRGV2ZWxvcGVyJ3MgR3VpZGUuCis8L3RkPgorPC90cj4KKzwvdGFibGU+CisKKzxwPlRvIHByb3ZlIHRoYXQgdGhleSB3b3JrLCB5b3UgY2FuIGV4ZWN1dGUgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgbGlua3M6Cis8dWw+Cis8bGk+VG8gYSA8YSBocmVmPSJoZWxsby5qc3AiPkpTUCBwYWdlPC9hPi4KKzxsaT5UbyBhIDxhIGhyZWY9ImhlbGxvIj5zZXJ2bGV0PC9hPi4KKzwvdWw+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L3NvdXJjZS54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zb3VyY2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZTU3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zb3VyY2UueG1sCkBAIC0wLDAgKzEsMzA2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0ic291cmNlLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8dGl0bGU+U291cmNlIE9yZ2FuaXphdGlvbjwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iRGlyZWN0b3J5IFN0cnVjdHVyZSI+CisKKyAgICA8YmxvY2txdW90ZT48ZW0+CisgICAgPHA+VGhlIGRlc2NyaXB0aW9uIGJlbG93IHVzZXMgdGhlIHZhcmlhYmxlIG5hbWUgJENBVEFMSU5BX0hPTUUKKyAgICB0byByZWZlciB0byB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IGhhdmUgaW5zdGFsbGVkIFRvbWNhdCA1LAorICAgIGFuZCBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgYWdhaW5zdCB3aGljaCBtb3N0IHJlbGF0aXZlIHBhdGhzIGFyZQorICAgIHJlc29sdmVkLiAgSG93ZXZlciwgaWYgeW91IGhhdmUgY29uZmlndXJlZCBUb21jYXQgNSBmb3IgbXVsdGlwbGUKKyAgICBpbnN0YW5jZXMgYnkgc2V0dGluZyBhIENBVEFMSU5BX0JBU0UgZGlyZWN0b3J5LCB5b3Ugc2hvdWxkIHVzZQorICAgICRDQVRBTElOQV9CQVNFIGluc3RlYWQgb2YgJENBVEFMSU5BX0hPTUUgZm9yIGVhY2ggb2YgdGhlc2UKKyAgICByZWZlcmVuY2VzLjwvcD4KKyAgICA8L2VtPjwvYmxvY2txdW90ZT4KKworPHA+QSBrZXkgcmVjb21tZW5kYXRpb24gb2YgdGhpcyBtYW51YWwgaXMgdG8gc2VwYXJhdGUgdGhlIGRpcmVjdG9yeQoraGllcmFyY2h5IGNvbnRhaW5pbmcgeW91ciBzb3VyY2UgY29kZSAoZGVzY3JpYmVkIGluIHRoaXMgc2VjdGlvbikgZnJvbQordGhlIGRpcmVjdG9yeSBoaWVyYXJjaHkgY29udGFpbmluZyB5b3VyIGRlcGxveWFibGUgYXBwbGljYXRpb24KKyhkZXNjcmliZWQgaW4gdGhlIHByZWNlZGluZyBzZWN0aW9uKS4gIE1haW50YWluaW5nIHRoaXMgc2VwYXJhdGlvbiBoYXMKK3RoZSBmb2xsb3dpbmcgYWR2YW50YWdlczo8L3A+Cis8dWw+Cis8bGk+VGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgZGlyZWN0b3JpZXMgY2FuIGJlIG1vcmUgZWFzaWx5IGFkbWluaXN0ZXJlZCwKKyAgICBtb3ZlZCwgYW5kIGJhY2tlZCB1cCBpZiB0aGUgImV4ZWN1dGFibGUiIHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0aW9uCisgICAgaXMgbm90IGludGVybWl4ZWQuCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+U291cmNlIGNvZGUgY29udHJvbCBpcyBlYXNpZXIgdG8gbWFuYWdlIG9uIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbgorICAgIG9ubHkgc291cmNlIGZpbGVzLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPlRoZSBmaWxlcyB0aGF0IG1ha2UgdXAgYW4gaW5zdGFsbGFibGUgZGlzdHJpYnV0aW9uIG9mIHlvdXIKKyAgICBhcHBsaWNhdGlvbiBhcmUgbXVjaCBlYXNpZXIgdG8gc2VsZWN0IHdoZW4gdGhlIGRlcGxveW1lbnQKKyAgICBoaWVyYXJjaHkgaXMgc2VwYXJhdGUuPC9saT4KKzwvdWw+CisKKzxwPkFzIHdlIHdpbGwgc2VlLCB0aGUgPGNvZGU+YW50PC9jb2RlPiBkZXZlbG9wbWVudCB0b29sIG1ha2VzIHRoZSBjcmVhdGlvbgorYW5kIHByb2Nlc3Npbmcgb2Ygc3VjaCBkaXJlY3RvcnkgaGllcmFyY2hpZXMgbmVhcmx5IHBhaW5sZXNzLjwvcD4KKworPHA+VGhlIGFjdHVhbCBkaXJlY3RvcnkgYW5kIGZpbGUgaGllcmFyY2h5IHVzZWQgdG8gY29udGFpbiB0aGUgc291cmNlIGNvZGUKK29mIGFuIGFwcGxpY2F0aW9uIGNhbiBiZSBwcmV0dHkgbXVjaCBhbnl0aGluZyB5b3UgbGlrZS4gIEhvd2V2ZXIsIHRoZQorZm9sbG93aW5nIG9yZ2FuaXphdGlvbiBoYXMgcHJvdmVuIHRvIGJlIHF1aXRlIGdlbmVyYWxseSBhcHBsaWNhYmxlLCBhbmQgaXMKK2V4cGVjdGVkIGJ5IHRoZSBleGFtcGxlIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gY29uZmlndXJhdGlvbiBmaWxlIHRoYXQKK2lzIGRpc2N1c3NlZCBiZWxvdy4gIEFsbCBvZiB0aGVzZSBjb21wb25lbnRzIGV4aXN0IHVuZGVyIGEgdG9wIGxldmVsCis8ZW0+cHJvamVjdCBzb3VyY2UgZGlyZWN0b3J5PC9lbT4gZm9yIHlvdXIgYXBwbGljYXRpb246PC9wPgorPHVsPgorPGxpPjxzdHJvbmc+ZG9jcy88L3N0cm9uZz4gLSBEb2N1bWVudGF0aW9uIGZvciB5b3VyIGFwcGxpY2F0aW9uLCBpbiB3aGF0ZXZlcgorICAgIGZvcm1hdCB5b3VyIGRldmVsb3BtZW50IHRlYW0gaXMgdXNpbmcuPGJyLz48YnIvPjwvbGk+Cis8bGk+PHN0cm9uZz5zcmMvPC9zdHJvbmc+IC0gSmF2YSBzb3VyY2UgZmlsZXMgdGhhdCBnZW5lcmF0ZSB0aGUgc2VydmxldHMsCisgICAgYmVhbnMsIGFuZCBvdGhlciBKYXZhIGNsYXNzZXMgdGhhdCBhcmUgdW5pcXVlIHRvIHlvdXIgYXBwbGljYXRpb24uCisgICAgSWYgeW91ciBzb3VyY2UgY29kZSBpcyBvcmdhbml6ZWQgaW4gcGFja2FnZXMgKDxzdHJvbmc+aGlnaGx5PC9zdHJvbmc+CisgICAgcmVjb21tZW5kZWQpLCB0aGUgcGFja2FnZSBoaWVyYXJjaHkgc2hvdWxkIGJlIHJlZmxlY3RlZCBhcyBhIGRpcmVjdG9yeQorICAgIHN0cnVjdHVyZSB1bmRlcm5lYXRoIHRoaXMgZGlyZWN0b3J5Ljxici8+PGJyLz48L2xpPgorPGxpPjxzdHJvbmc+d2ViLzwvc3Ryb25nPiAtIFRoZSBzdGF0aWMgY29udGVudCBvZiB5b3VyIHdlYiBzaXRlIChIVE1MIHBhZ2VzLAorICAgIEpTUCBwYWdlcywgSmF2YVNjcmlwdCBmaWxlcywgQ1NTIHN0eWxlc2hlZXQgZmlsZXMsIGFuZCBpbWFnZXMpIHRoYXQgd2lsbAorICAgIGJlIGFjY2Vzc2libGUgdG8gYXBwbGljYXRpb24gY2xpZW50cy4gIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgdGhlCisgICAgPGVtPmRvY3VtZW50IHJvb3Q8L2VtPiBvZiB5b3VyIHdlYiBhcHBsaWNhdGlvbiwgYW5kIGFueSBzdWJkaXJlY3RvcnkKKyAgICBzdHJ1Y3R1cmUgZm91bmQgaGVyZSB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgcmVxdWVzdCBVUklzIHJlcXVpcmVkIHRvCisgICAgYWNjZXNzIHRob3NlIGZpbGVzLjxici8+PGJyLz48L2xpPgorPGxpPjxzdHJvbmc+d2ViL1dFQi1JTkYvPC9zdHJvbmc+IC0gVGhlIHNwZWNpYWwgY29uZmlndXJhdGlvbiBmaWxlcyByZXF1aXJlZAorICAgIGZvciB5b3VyIGFwcGxpY2F0aW9uLCBpbmNsdWRpbmcgdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAgICAoPGNvZGU+d2ViLnhtbDwvY29kZT4sIGRlZmluZWQgaW4gdGhlIAorICAgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldCI+U2VydmxldCBTcGVjaWZpY2F0aW9uPC9hPiksIAorICAgIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3JzIGZvciBjdXN0b20gdGFnIGxpYnJhcmllcworICAgIHlvdSBoYXZlIGNyZWF0ZWQsIGFuZCBvdGhlciByZXNvdXJjZSBmaWxlcyB5b3Ugd2lzaCB0byBpbmNsdWRlIHdpdGhpbgorICAgIHlvdXIgd2ViIGFwcGxpY2F0aW9uLiAgRXZlbiB0aG91Z2ggdGhpcyBkaXJlY3RvcnkgYXBwZWFycyB0byBiZSBhCisgICAgc3ViZGlyZWN0b3J5IG9mIHlvdXIgPGVtPmRvY3VtZW50IHJvb3Q8L2VtPiwgdGhlIFNlcnZsZXQgU3BlY2lmaWNhdGlvbgorICAgIHByb2hpYml0cyBzZXJ2aW5nIHRoZSBjb250ZW50cyBvZiB0aGlzIGRpcmVjdG9yeSAob3IgYW55IGZpbGUgaXQgY29udGFpbnMpCisgICAgZGlyZWN0bHkgdG8gYSBjbGllbnQgcmVxdWVzdC4gIFRoZXJlZm9yZSwgdGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gc3RvcmUKKyAgICBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHRoYXQgaXMgc2Vuc2l0aXZlIChzdWNoIGFzIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICB1c2VybmFtZXMgYW5kIHBhc3N3b3JkcyksIGJ1dCBpcyByZXF1aXJlZCBmb3IgeW91ciBhcHBsaWNhdGlvbiB0bworICAgIG9wZXJhdGUgc3VjY2Vzc2Z1bGx5LjwvbGk+Cis8L3VsPgorCis8cD5EdXJpbmcgdGhlIGRldmVsb3BtZW50IHByb2Nlc3MsIHR3byBhZGRpdGlvbmFsIGRpcmVjdG9yaWVzIHdpbGwgYmUKK2NyZWF0ZWQgb24gYSB0ZW1wb3JhcnkgYmFzaXM6PC9wPgorPHVsPgorPGxpPjxzdHJvbmc+YnVpbGQvPC9zdHJvbmc+IC0gV2hlbiB5b3UgZXhlY3V0ZSBhIGRlZmF1bHQgYnVpbGQKKyAgICAoPGNvZGU+YW50PC9jb2RlPiksIHRoaXMgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhbiBleGFjdCBpbWFnZQorICAgIG9mIHRoZSBmaWxlcyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgVG9tY2F0IDUgYWxsb3dzIHlvdSB0byBkZXBsb3kgYW4gYXBwbGljYXRpb24gaW4gYW4gdW5wYWNrZWQKKyAgICBkaXJlY3RvcnkgbGlrZSB0aGlzLCBlaXRoZXIgYnkgY29weWluZyBpdCB0byB0aGUKKyAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS93ZWJhcHBzPC9jb2RlPiBkaXJlY3RvcnksIG9yIGJ5IDxlbT5pbnN0YWxsaW5nPC9lbT4KKyAgICBpdCB2aWEgdGhlICJNYW5hZ2VyIiB3ZWIgYXBwbGljYXRpb24uICBUaGUgbGF0dGVyIGFwcHJvYWNoIGlzIHZlcnkKKyAgICB1c2VmdWwgZHVyaW5nIGRldmVsb3BtZW50LCBhbmQgd2lsbCBiZSBpbGx1c3RyYXRlZCBiZWxvdy4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT48c3Ryb25nPmRpc3QvPC9zdHJvbmc+IC0gV2hlbiB5b3UgZXhlY3V0ZSB0aGUgPGNvZGU+YW50IGRpc3Q8L2NvZGU+CisgICAgdGFyZ2V0LCB0aGlzIGRpcmVjdG9yeSB3aWxsIGJlIGNyZWF0ZWQuICBJdCB3aWxsIGNyZWF0ZSBhbiBleGFjdCBpbWFnZQorICAgIG9mIHRoZSBiaW5hcnkgZGlzdHJpYnV0aW9uIGZvciB5b3VyIHdlYiBhcHBsaWNhdGlvbiwgaW5jbHVkaW5nIGFuIGxpY2Vuc2UKKyAgICBpbmZvcm1hdGlvbiwgZG9jdW1lbnRhdGlvbiwgYW5kIFJFQURNRSBmaWxlcyB0aGF0IHlvdSBoYXZlIHByZXBhcmVkLjwvbGk+Cis8L3VsPgorCis8cD5Ob3RlIHRoYXQgdGhlc2UgdHdvIGRpcmVjdG9yaWVzIHNob3VsZCA8c3Ryb25nPk5PVDwvc3Ryb25nPiBiZSBhcmNoaXZlZCBpbgoreW91ciBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbSwgYmVjYXVzZSB0aGV5IGFyZSBkZWxldGVkIGFuZCByZWNyZWF0ZWQgKGZyb20KK3NjcmF0Y2gpIGFzIG5lZWRlZCBkdXJpbmcgZGV2ZWxvcG1lbnQuICBGb3IgdGhhdCByZWFzb24sIHlvdSBzaG91bGQgbm90IGVkaXQKK2FueSBzb3VyY2UgZmlsZXMgaW4gdGhlc2UgZGlyZWN0b3JpZXMgaWYgeW91IHdhbnQgdG8gbWFpbnRhaW4gYSBwZXJtYW5lbnQKK3JlY29yZCBvZiB0aGUgY2hhbmdlcywgYmVjYXVzZSB0aGUgY2hhbmdlcyB3aWxsIGJlIGxvc3QgdGhlIG5leHQgdGltZSB0aGF0IGEKK2J1aWxkIGlzIHBlcmZvcm1lZC48L3A+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRXh0ZXJuYWwgRGVwZW5kZW5jaWVzIj4KKworICA8cD5XaGF0IGRvIHlvdSBkbyBpZiB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVzIEpBUiBmaWxlcyAob3Igb3RoZXIKKyAgcmVzb3VyY2VzKSBmcm9tIGV4dGVybmFsIHByb2plY3RzIG9yIHBhY2thZ2VzPyAgQSBjb21tb24gZXhhbXBsZSBpcyB0aGF0CisgIHlvdSBuZWVkIHRvIGluY2x1ZGUgYSBKREJDIGRyaXZlciBpbiB5b3VyIHdlYiBhcHBsaWNhdGlvbiwgaW4gb3JkZXIgdG8KKyAgb3BlcmF0ZS48L3A+CisKKyAgPHA+RGlmZmVyZW50IGRldmVsb3BlcnMgdGFrZSBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0byB0aGlzIHByb2JsZW0uCisgIFNvbWUgd2lsbCBlbmNvdXJhZ2UgY2hlY2tpbmcgYSBjb3B5IG9mIHRoZSBKQVIgZmlsZXMgeW91IGRlcGVuZCBvbiBpbnRvCisgIHRoZSBzb3VyY2UgY29kZSBjb250cm9sIGFyY2hpdmVzIGZvciBldmVyeSBhcHBsaWNhdGlvbiB0aGF0IHJlcXVpcmVzIHRob3NlCisgIEpBUiBmaWxlcy4gIEhvd2V2ZXIsIHRoaXMgY2FuIGNhdXNlIHNpZ25pZmljYW50IG1hbmFnZW1lbnQgaXNzdWVzIHdoZW4geW91CisgIHVzZSB0aGUgc2FtZSBKQVIgaW4gbWFueSBhcHBsaWNhdGlvbnMgLSBwYXJ0aWN1bGFyIHdoZW4gZmFjZWQgd2l0aCBhIG5lZWQKKyAgdG8gdXBncmFkZSB0byBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHRoYXQgSkFSIGZpbGUuPC9wPgorCisgIDxwPlRoZXJlZm9yZSwgdGhpcyBtYW51YWwgcmVjb21tZW5kcyB0aGF0IHlvdSA8c3Ryb25nPk5PVDwvc3Ryb25nPiBzdG9yZQorICBhIGNvcHkgb2YgdGhlIHBhY2thZ2VzIHlvdSBkZXBlbmQgb24gaW5zaWRlIHRoZSBzb3VyY2UgY29udHJvbCBhcmNoaXZlcworICBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIEluc3RlYWQsIHRoZSBleHRlcm5hbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlCisgIGludGVncmF0ZWQgYXMgcGFydCBvZiB0aGUgcHJvY2VzcyBvZiA8c3Ryb25nPmJ1aWxkaW5nPC9zdHJvbmc+IHlvdXIKKyAgYXBwbGljYXRpb24uICBJbiB0aGF0IHdheSwgeW91IGNhbiBhbHdheXMgcGljayB1cCB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbgorICBvZiB0aGUgSkFSIGZpbGVzIGZyb20gd2hlcmV2ZXIgeW91ciBkZXZlbG9wbWVudCBzeXN0ZW0gYWRtaW5pc3RyYXRvciBoYXMKKyAgaW5zdGFsbGVkIHRoZW0sIHdpdGhvdXQgaGF2aW5nIHRvIHdvcnJ5IGFib3V0IHVwZGF0aW5nIHlvdXIgYXBwbGljYXRpb24KKyAgZXZlcnkgdGltZSB0aGUgdmVyc2lvbiBvZiB0aGUgZGVwZW5kZW50IEpBUiBmaWxlIGlzIGNoYW5nZWQuPC9wPgorCisgIDxwPkluIHRoZSBleGFtcGxlIEFudCA8Y29kZT5idWlsZC54bWw8L2NvZGU+IGZpbGUsIHdlIHdpbGwgZGVtb25zdHJhdGUKKyAgaG93IHRvIGRlZmluZSA8ZW0+YnVpbGQgcHJvcGVydGllczwvZW0+IHRoYXQgbGV0IHlvdSBjb25maWd1cmUgdGhlIGxvY2F0aW9ucworICBvZiB0aGUgZmlsZXMgdG8gYmUgY29waWVkLCB3aXRob3V0IGhhdmluZyB0byBtb2RpZnkgPGNvZGU+YnVpbGQueG1sPC9jb2RlPgorICB3aGVuIHRoZXNlIGZpbGVzIGNoYW5nZS4gIFRoZSBidWlsZCBwcm9wZXJ0aWVzIHVzZWQgYnkgYSBwYXJ0aWN1bGFyCisgIGRldmVsb3BlciBjYW4gYmUgY3VzdG9taXplZCBvbiBhIHBlci1hcHBsaWNhdGlvbiBiYXNpcywgb3IgZGVmYXVsdGVkIHRvCisgICJzdGFuZGFyZCIgYnVpbGQgcHJvcGVydGllcyBzdG9yZWQgaW4gdGhlIGRldmVsb3BlcidzIGhvbWUgZGlyZWN0b3J5LjwvcD4KKworICA8cD5JbiBtYW55IGNhc2VzLCB5b3VyIGRldmVsb3BtZW50IHN5c3RlbSBhZG1pbmlzdHJhdG9yIHdpbGwgaGF2ZSBhbHJlYWR5CisgIGluc3RhbGxlZCB0aGUgcmVxdWlyZWQgSkFSIGZpbGVzIGludG8gVG9tY2F0IDUncyA8Y29kZT5jb21tb24vbGliPC9jb2RlPgorICBvciA8Y29kZT5zaGFyZWQvbGliPC9jb2RlPiBkaXJlY3Rvcmllcy4gIElmIHRoaXMgaGFzIGJlZW4gZG9uZSwgeW91IG5lZWQKKyAgdG8gdGFrZSBubyBhY3Rpb25zIGF0IGFsbCAtIHRoZSBleGFtcGxlIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gZmlsZQorICBhdXRvbWF0aWNhbGx5IGNvbnN0cnVjdHMgYSBjb21waWxlIGNsYXNzcGF0aCB0aGF0IGluY2x1ZGVzIHRoZXNlIGZpbGVzLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJTb3VyY2UgQ29kZSBDb250cm9sIj4KKworPHA+QXMgbWVudGlvbmVkIGVhcmxpZXIsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBwbGFjZSBhbGwgb2YgdGhlCitzb3VyY2UgZmlsZXMgdGhhdCBjb21wcmlzZSB5b3VyIGFwcGxpY2F0aW9uIHVuZGVyIHRoZSBtYW5hZ2VtZW50IG9mIGEKK3NvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtIGxpa2UgdGhlIENvbmN1cnJlbnQgVmVyc2lvbiBTeXN0ZW0gKENWUykuICBJZiB5b3UKK2VsZWN0IHRvIGRvIHRoaXMsIGV2ZXJ5IGRpcmVjdG9yeSBhbmQgZmlsZSBpbiB0aGUgc291cmNlIGhpZXJhcmNoeSBzaG91bGQgYmUKK3JlZ2lzdGVyZWQgYW5kIHNhdmVkIC0tIGJ1dCBub25lIG9mIHRoZSBnZW5lcmF0ZWQgZmlsZXMuICBJZiB5b3UgcmVnaXN0ZXIKK2JpbmFyeSBmb3JtYXQgZmlsZXMgKHN1Y2ggYXMgaW1hZ2VzIG9yIEpBUiBsaWJyYXJpZXMpLCBiZSBzdXJlIHRvIGluZGljYXRlCit0aGlzIHRvIHlvdXIgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW0uPC9wPgorCis8cD5XZSByZWNvbW1lbmRlZCAoaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24pIHRoYXQgeW91IHNob3VsZCBub3Qgc3RvcmUgdGhlCitjb250ZW50cyBvZiB0aGUgPGNvZGU+YnVpbGQvPC9jb2RlPiBhbmQgPGNvZGU+ZGlzdC88L2NvZGU+IGRpcmVjdG9yaWVzCitjcmVhdGVkIGJ5IHlvdXIgZGV2ZWxvcG1lbnQgcHJvY2VzcyBpbiB0aGUgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW0uICBBbgorZWFzeSB3YXkgdG8gdGVsbCBDVlMgdG8gaWdub3JlIHRoZXNlIGRpcmVjdG9yaWVzIGlzIHRvIGNyZWF0ZSBhIGZpbGUgbmFtZWQKKzxjb2RlPi5jdnNpZ25vcmU8L2NvZGU+IChub3RlIHRoZSBsZWFkaW5nIHBlcmlvZCkgaW4geW91ciB0b3AtbGV2ZWwgc291cmNlCitkaXJlY3RvcnksIHdpdGggdGhlIGZvbGxvd2luZyBjb250ZW50czo8L3A+Cis8c291cmNlPgorYnVpbGQKK2Rpc3QKK2J1aWxkLnByb3BlcnRpZXMKKzwvc291cmNlPgorCis8cD5UaGUgcmVhc29uIGZvciBtZW50aW9uaW5nIDxjb2RlPmJ1aWxkLnByb3BlcnRpZXM8L2NvZGU+IGhlcmUgd2lsbCBiZQorZXhwbGFpbmVkIGluIHRoZSA8YSBocmVmPSJwcm9jZXNzZXMuaHRtbCI+UHJvY2Vzc2VzPC9hPiBzZWN0aW9uLjwvcD4KKworPHA+RGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIGZvciB5b3VyIHNvdXJjZSBjb2RlIGNvbnRyb2wgZW52aXJvbm1lbnQgYXJlIGJleW9uZAordGhlIHNjb3BlIG9mIHRoaXMgbWFudWFsLiAgSG93ZXZlciwgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgZm9sbG93ZWQgd2hlbgordXNpbmcgYSBjb21tYW5kLWxpbmUgQ1ZTIGNsaWVudDo8L3A+Cis8dWw+Cis8bGk+VG8gcmVmcmVzaCB0aGUgc3RhdGUgb2YgeW91ciBzb3VyY2UgY29kZSB0byB0aGF0IHN0b3JlZCBpbiB0aGUKKyAgICB0aGUgc291cmNlIHJlcG9zaXRvcnksIGdvIHRvIHlvdXIgcHJvamVjdCBzb3VyY2UgZGlyZWN0b3J5LCBhbmQKKyAgICBleGVjdXRlIDxjb2RlPmN2cyB1cGRhdGUgLWRQPC9jb2RlPi4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT5XaGVuIHlvdSBjcmVhdGUgYSBuZXcgc3ViZGlyZWN0b3J5IGluIHRoZSBzb3VyY2UgY29kZSBoaWVyYXJjaHksIHJlZ2lzdGVyCisgICAgaXQgaW4gQ1ZTIHdpdGggYSBjb21tYW5kIGxpa2UgPGNvZGU+Y3ZzIGFkZCB7c3ViZGlybmFtZX08L2NvZGU+LgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPldoZW4geW91IGZpcnN0IGNyZWF0ZSBhIG5ldyBzb3VyY2UgY29kZSBmaWxlLCBuYXZpZ2F0ZSB0byB0aGUgZGlyZWN0b3J5CisgICAgdGhhdCBjb250YWlucyBpdCwgYW5kIHJlZ2lzdGVyIHRoZSBuZXcgZmlsZSB3aXRoIGEgY29tbWFuZCBsaWtlCisgICAgPGNvZGU+Y3ZzIGFkZCB7ZmlsZW5hbWV9PC9jb2RlPi4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT5JZiB5b3Ugbm8gbG9uZ2VyIG5lZWQgYSBwYXJ0aWN1bGFyIHNvdXJjZSBjb2RlIGZpbGUsIG5hdmlnYXRlIHRvIHRoZQorICAgIGNvbnRhaW5pbmcgZGlyZWN0b3J5IGFuZCByZW1vdmUgdGhlIGZpbGUuICBUaGVuLCBkZXJlZ2lzdGVyIGl0IGluIENWUworICAgIHdpdGggYSBjb21tYW5kIGxpa2UgPGNvZGU+Y3ZzIHJlbW92ZSB7ZmlsZW5hbWV9PC9jb2RlPi4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT5XaGlsZSB5b3UgYXJlIGNyZWF0aW5nLCBtb2RpZnlpbmcsIGFuZCBkZWxldGluZyBzb3VyY2UgZmlsZXMsIGNoYW5nZXMKKyAgICBhcmUgbm90IHlldCByZWZsZWN0ZWQgaW4gdGhlIHNlcnZlciByZXBvc2l0b3J5LiAgVG8gc2F2ZSB5b3VyIGNoYW5nZXMgaW4KKyAgICB0aGVpciBjdXJyZW50IHN0YXRlLCBnbyB0byB0aGUgcHJvamVjdCBzb3VyY2UgZGlyZWN0b3J5CisgICAgYW5kIGV4ZWN1dGUgPGNvZGU+Y3ZzIGNvbW1pdDwvY29kZT4uICBZb3Ugd2lsbCBiZSBhc2tlZCB0byB3cml0ZSBhIGJyaWVmCisgICAgZGVzY3JpcHRpb24gb2YgdGhlIGNoYW5nZXMgeW91IGhhdmUganVzdCBjb21wbGV0ZWQsIHdoaWNoIHdpbGwgYmUgc3RvcmVkCisgICAgd2l0aCB0aGUgbmV3IHZlcnNpb24gb2YgYW55IHVwZGF0ZWQgc291cmNlIGZpbGUuPC9saT4KKzwvdWw+CisKKzxwPkNWUywgbGlrZSBvdGhlciBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsIGhhcyBtYW55IGFkZGl0aW9uYWwgZmVhdHVyZXMKKyhzdWNoIGFzIHRoZSBhYmlsaXR5IHRvIHRhZyB0aGUgZmlsZXMgdGhhdCBtYWRlIHVwIGEgcGFydGljdWxhciByZWxlYXNlLCBhbmQKK3N1cHBvcnQgZm9yIG11bHRpcGxlIGRldmVsb3BtZW50IGJyYW5jaGVzIHRoYXQgY2FuIGxhdGVyIGJlIG1lcmdlZCkuICBTZWUgdGhlCitsaW5rcyBhbmQgcmVmZXJlbmNlcyBpbiB0aGUgPGEgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiPkludHJvZHVjdGlvbjwvYT4gZm9yCittb3JlIGluZm9ybWF0aW9uLjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkJVSUxELlhNTCBDb25maWd1cmF0aW9uIEZpbGUiPgorCis8cD5XZSB3aWxsIGJlIHVzaW5nIHRoZSA8c3Ryb25nPmFudDwvc3Ryb25nPiB0b29sIHRvIG1hbmFnZSB0aGUgY29tcGlsYXRpb24gb2YKK291ciBKYXZhIHNvdXJjZSBjb2RlIGZpbGVzLCBhbmQgY3JlYXRpb24gb2YgdGhlIGRlcGxveW1lbnQgaGllcmFyY2h5LiAgQW50CitvcGVyYXRlcyB1bmRlciB0aGUgY29udHJvbCBvZiBhIGJ1aWxkIGZpbGUsIG5vcm1hbGx5IGNhbGxlZAorPGNvZGU+YnVpbGQueG1sPC9jb2RlPiwgdGhhdCBkZWZpbmVzIHRoZSBwcm9jZXNzaW5nIHN0ZXBzIHJlcXVpcmVkLiAgVGhpcworZmlsZSBpcyBzdG9yZWQgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3Rvcnkgb2YgeW91ciBzb3VyY2UgY29kZSBoaWVyYXJjaHksIGFuZAorc2hvdWxkIGJlIGNoZWNrZWQgaW4gdG8geW91ciBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbS48L3A+CisKKzxwPkxpa2UgYSBNYWtlZmlsZSwgdGhlIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gZmlsZSBwcm92aWRlcyBzZXZlcmFsCisidGFyZ2V0cyIgdGhhdCBzdXBwb3J0IG9wdGlvbmFsIGRldmVsb3BtZW50IGFjdGl2aXRpZXMgKHN1Y2ggYXMgY3JlYXRpbmcKK3RoZSBhc3NvY2lhdGVkIEphdmFkb2MgZG9jdW1lbnRhdGlvbiwgZXJhc2luZyB0aGUgZGVwbG95bWVudCBob21lIGRpcmVjdG9yeQorc28geW91IGNhbiBidWlsZCB5b3VyIHByb2plY3QgZnJvbSBzY3JhdGNoLCBvciBjcmVhdGluZyB0aGUgd2ViIGFwcGxpY2F0aW9uCithcmNoaXZlIGZpbGUgc28geW91IGNhbiBkaXN0cmlidXRlIHlvdXIgYXBwbGljYXRpb24uICBBIHdlbGwtY29uc3RydWN0ZWQKKzxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gZmlsZSB3aWxsIGNvbnRhaW4gaW50ZXJuYWwgZG9jdW1lbnRhdGlvbiBkZXNjcmliaW5nCit0aGUgdGFyZ2V0cyB0aGF0IGFyZSBkZXNpZ25lZCBmb3IgdXNlIGJ5IHRoZSBkZXZlbG9wZXIsIHZlcnN1cyB0aG9zZSB0YXJnZXRzCit1c2VkIGludGVybmFsbHkuICBUbyBhc2sgQW50IHRvIGRpc3BsYXkgdGhlIHByb2plY3QgZG9jdW1lbnRhdGlvbiwgY2hhbmdlIHRvCit0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gZmxpZSBhbmQgdHlwZTo8L3A+Cis8c291cmNlPgorYW50IC1wcm9qZWN0aGVscAorPC9zb3VyY2U+CisKKzxwPlRvIGdpdmUgeW91IGEgaGVhZCBzdGFydCwgYSA8YSBocmVmPSJidWlsZC54bWwudHh0Ij5iYXNpYyBidWlsZC54bWwgZmlsZTwvYT4KK2lzIHByb3ZpZGVkIHRoYXQgeW91IGNhbiBjdXN0b21pemUgYW5kIGluc3RhbGwgaW4gdGhlIHByb2plY3Qgc291cmNlIGRpcmVjdG9yeQorZm9yIHlvdXIgYXBwbGljYXRpb24uICBUaGlzIGZpbGUgaW5jbHVkZXMgY29tbWVudHMgdGhhdCBkZXNjcmliZSB0aGUgdmFyaW91cwordGFyZ2V0cyB0aGF0IGNhbiBiZSBleGVjdXRlZC4gIEJyaWVmbHksIHRoZSBmb2xsb3dpbmcgdGFyZ2V0cyBhcmUgZ2VuZXJhbGx5Citwcm92aWRlZDo8L3A+Cis8dWw+Cis8bGk+PHN0cm9uZz5jbGVhbjwvc3Ryb25nPiAtIFRoaXMgdGFyZ2V0IGRlbGV0ZXMgYW55IGV4aXN0aW5nCisgICAgPGNvZGU+YnVpbGQ8L2NvZGU+IGFuZCA8Y29kZT5kaXN0PC9jb2RlPiBkaXJlY3Rvcmllcywgc28gdGhhdCB0aGV5CisgICAgY2FuIGJlIHJlY29uc3RydWN0ZWQgZnJvbSBzY3JhdGNoLiAgVGhpcyBhbGxvd3MgeW91IHRvIGd1YXJhbnRlZSB0aGF0CisgICAgeW91IGhhdmUgbm90IG1hZGUgc291cmNlIGNvZGUgbW9kaWZpY2F0aW9ucyB0aGF0IHdpbGwgcmVzdWx0IGluCisgICAgcHJvYmxlbXMgYXQgcnVudGltZSBkdWUgdG8gbm90IHJlY29tcGlsaW5nIGFsbCBhZmZlY3RlZCBjbGFzc2VzLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPjxzdHJvbmc+Y29tcGlsZTwvc3Ryb25nPiAtIFRoaXMgdGFyZ2V0IGlzIHVzZWQgdG8gY29tcGlsZSBhbnkgc291cmNlIGNvZGUKKyAgICB0aGF0IGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSBjb21waWxhdGlvbiB0b29rIHBsYWNlLiAgVGhlCisgICAgcmVzdWx0aW5nIGNsYXNzIGZpbGVzIGFyZSBjcmVhdGVkIGluIHRoZSA8Y29kZT5XRUItSU5GL2NsYXNzZXM8L2NvZGU+CisgICAgc3ViZGlyZWN0b3J5IG9mIHlvdXIgPGNvZGU+YnVpbGQ8L2NvZGU+IGRpcmVjdG9yeSwgZXhhY3RseSB3aGVyZSB0aGUKKyAgICBzdHJ1Y3R1cmUgb2YgYSB3ZWIgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhlbSB0byBiZS4gIEJlY2F1c2UKKyAgICB0aGlzIGNvbW1hbmQgaXMgZXhlY3V0ZWQgc28gb2Z0ZW4gZHVyaW5nIGRldmVsb3BtZW50LCBpdCBpcyBub3JtYWxseQorICAgIG1hZGUgdGhlICJkZWZhdWx0IiB0YXJnZXQgc28gdGhhdCBhIHNpbXBsZSA8Y29kZT5hbnQ8L2NvZGU+IGNvbW1hbmQgd2lsbAorICAgIGV4ZWN1dGUgaXQuCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+PHN0cm9uZz5hbGw8L3N0cm9uZz4gLSBUaGlzIHRhcmdldCBpcyBhIHNob3J0IGN1dCBmb3IgcnVubmluZyB0aGUKKyAgICA8Y29kZT5jbGVhbjwvY29kZT4gdGFyZ2V0LCBmb2xsb3dlZCBieSB0aGUgPGNvZGU+Y29tcGlsZTwvY29kZT4gdGFyZ2V0LgorICAgIFRodXMsIGl0IGd1YXJhbnRlZXMgdGhhdCB5b3Ugd2lsbCByZWNvbXBpbGUgdGhlIGVudGlyZSBhcHBsaWNhdGlvbiwgdG8KKyAgICBlbnN1cmUgdGhhdCB5b3UgaGF2ZSBub3QgdW5rbm93aW5nbHkgaW50cm9kdWNlZCBhbnkgaW5jb21wYXRpYmxlIGNoYW5nZXMuCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+PHN0cm9uZz5qYXZhZG9jPC9zdHJvbmc+IC0gVGhpcyB0YXJnZXQgY3JlYXRlcyBKYXZhZG9jIEFQSSBkb2N1bWVudGF0aW9uCisgICAgZm9yIHRoZSBKYXZhIGNsYXNzZXMgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uICBUaGUgZXhhbXBsZQorICAgIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gZmlsZSBhc3N1bWVzIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIEFQSQorICAgIGRvY3VtZW50YXRpb24gd2l0aCB5b3VyIGFwcCBkaXN0cmlidXRpb24sIHNvIGl0IGdlbmVyYXRlcyB0aGUgZG9jcworICAgIGluIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSA8Y29kZT5kaXN0PC9jb2RlPiBkaXJlY3RvcnkuICBCZWNhdXNlIHlvdSBub3JtYWxseQorICAgIGRvIG5vdCBuZWVkIHRvIGdlbmVyYXRlIHRoZSBKYXZhZG9jcyBvbiBldmVyeSBjb21waWxhdGlvbiwgdGhpcyB0YXJnZXQgaXMKKyAgICB1c3VhbGx5IGEgZGVwZW5kZW5jeSBvZiB0aGUgPGNvZGU+ZGlzdDwvY29kZT4gdGFyZ2V0LCBidXQgbm90IG9mIHRoZQorICAgIDxjb2RlPmNvbXBpbGU8L2NvZGU+IHRhcmdldC4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT48c3Ryb25nPmRpc3Q8L3N0cm9uZz4gLSBUaGlzIHRhcmdldCBjcmVhdGVzIGEgZGlzdHJpYnV0aW9uIGRpcmVjdG9yeSBmb3IKKyAgICB5b3VyIGFwcGxpY2F0aW9uLCBpbmNsdWRpbmcgYW55IHJlcXVpcmVkIGRvY3VtZW50YXRpb24sIHRoZSBKYXZhZG9jcyBmb3IKKyAgICB5b3VyIEphdmEgY2xhc3NlcywgYW5kIGEgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgKFdBUikgZmlsZSB0aGF0IHdpbGwgYmUKKyAgICBkZWxpdmVyZWQgdG8gc3lzdGVtIGFkbWluaXN0cmF0b3JzIHdobyB3aXNoIHRvIGluc3RhbGwgeW91ciBhcHBsaWNhdGlvbi4KKyAgICBCZWNhdXNlIHRoaXMgdGFyZ2V0IGFsc28gZGVwZW5kcyBvbiB0aGUgPGNvZGU+ZGVwbG95PC9jb2RlPiB0YXJnZXQsIHRoZQorICAgIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIHdpbGwgaGF2ZSBhbHNvIHBpY2tlZCB1cCBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzCisgICAgdGhhdCB3ZXJlIGluY2x1ZGVkIGF0IGRlcGxveW1lbnQgdGltZS48L2xpPgorPC91bD4KKworPHA+Rm9yIGludGVyYWN0aXZlIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nIG9mIHlvdXIgd2ViIGFwcGxpY2F0aW9uIHVzaW5nCitUb21jYXQgNSwgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHRhcmdldHMgYXJlIGRlZmluZWQ6PC9wPgorPHVsPgorPGxpPjxzdHJvbmc+aW5zdGFsbDwvc3Ryb25nPiAtIFRlbGwgdGhlIGN1cnJlbnRseSBydW5uaW5nIFRvbWNhdCA1IHRvIG1ha2UKKyAgICB0aGUgYXBwbGljYXRpb24geW91IGFyZSBkZXZlbG9waW5nIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSBmb3IgZXhlY3V0aW9uCisgICAgYW5kIHRlc3RpbmcuICBUaGlzIGFjdGlvbiBkb2VzIG5vdCByZXF1aXJlIFRvbWNhdCA1IHRvIGJlIHJlc3RhcnRlZCwgYnV0CisgICAgaXQgaXMgYWxzbyBub3QgcmVtZW1iZXJlZCBhZnRlciBUb21jYXQgaXMgcmVzdGFydGVkIHRoZSBuZXh0IHRpbWUuCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+PHN0cm9uZz5yZWxvYWQ8L3N0cm9uZz4gLSBPbmNlIHRoZSBhcHBsaWNhdGlvbiBpcyBpbnN0YWxsZWQsIHlvdSBjYW4KKyAgICBjb250aW51ZSB0byBtYWtlIGNoYW5nZXMgYW5kIHJlY29tcGlsZSB1c2luZyB0aGUgPGNvZGU+Y29tcGlsZTwvY29kZT4KKyAgICB0YXJnZXQuICBUb21jYXQgNSB3aWxsIGF1dG9tYXRpY2FsbHkgcmVjb2duaXplIGNoYW5nZXMgbWFkZSB0byBKU1AgcGFnZXMsCisgICAgYnV0IG5vdCB0byBzZXJ2bGV0IG9yIEphdmFCZWFuIGNsYXNzZXMgLSB0aGlzIGNvbW1hbmQgd2lsbCB0ZWxsIFRvbWNhdAorICAgIHRvIHJlc3RhcnQgdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgYXBwbGljYXRpb24gc28gdGhhdCBzdWNoIGNoYW5nZXMgYXJlCisgICAgcmVjb2duaXplZC4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT48c3Ryb25nPnJlbW92ZTwvc3Ryb25nPiAtIFdoZW4geW91IGhhdmUgY29tcGxldGVkIHlvdXIgZGV2ZWxvcG1lbnQgYW5kCisgICAgdGVzdGluZyBhY3Rpdml0aWVzLCB5b3UgY2FuIG9wdGlvbmFsbHkgdGVsbCBUb21jYXQgNSB0byByZW1vdmUgdGhpcworICAgIGFwcGxpY2F0aW9uIGZyb20gc2VydmljZS4KKyAgICA8L2xpPgorPC91bD4KKworPHA+VXNpbmcgdGhlIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nIHRhcmdldHMgcmVxdWlyZXMgc29tZSBhZGRpdGlvbmFsCitvbmUtdGltZSBzZXR1cCB0aGF0IGlzIGRlc2NyaWJlZCBvbiB0aGUgbmV4dCBwYWdlLjwvcD4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi93ZWIueG1sLnR4dCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L3dlYi54bWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NWJmYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi93ZWIueG1sLnR4dApAQCAtMCwwICsxLDE1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorCis8IURPQ1RZUEUgd2ViLWFwcCAKKyAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIgCisgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+CisKKzx3ZWItYXBwPgorCisKKyAgICA8IS0tIEdlbmVyYWwgZGVzY3JpcHRpb24gb2YgeW91ciB3ZWIgYXBwbGljYXRpb24gLS0+CisKKyAgICA8ZGlzcGxheS1uYW1lPk15IFdlYiBBcHBsaWNhdGlvbjwvZGlzcGxheS1uYW1lPgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgIFRoaXMgaXMgdmVyc2lvbiBYLlggb2YgYW4gYXBwbGljYXRpb24gdG8gcGVyZm9ybQorICAgICAgYSB3aWxkIGFuZCB3b25kZXJmdWwgdGFzaywgYmFzZWQgb24gc2VydmxldHMgYW5kCisgICAgICBKU1AgcGFnZXMuICBJdCB3YXMgd3JpdHRlbiBieSBEYXZlIERldmVsb3BlcgorICAgICAgKGRhdmVAbXljb21wYW55LmNvbSksIHdobyBzaG91bGQgYmUgY29udGFjdGVkIGZvcgorICAgICAgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisKKyAgICA8IS0tIENvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyB0aGF0IGRlZmluZSBzaGFyZWQKKyAgICAgICAgIFN0cmluZyBjb25zdGFudHMgdXNlZCB3aXRoaW4geW91ciBhcHBsaWNhdGlvbiwgd2hpY2gKKyAgICAgICAgIGNhbiBiZSBjdXN0b21pemVkIGJ5IHRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRvciB3aG8gaXMKKyAgICAgICAgIGluc3RhbGxpbmcgeW91ciBhcHBsaWNhdGlvbi4gIFRoZSB2YWx1ZXMgYWN0dWFsbHkKKyAgICAgICAgIGFzc2lnbmVkIHRvIHRoZXNlIHBhcmFtZXRlcnMgY2FuIGJlIHJldHJpZXZlZCBpbiBhCisgICAgICAgICBzZXJ2bGV0IG9yIEpTUCBwYWdlIGJ5IGNhbGxpbmc6CisKKyAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPQorICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyKCJuYW1lIik7CisKKyAgICAgICAgIHdoZXJlICJuYW1lIiBtYXRjaGVzIHRoZSA8cGFyYW0tbmFtZT4gZWxlbWVudCBvZgorICAgICAgICAgb25lIG9mIHRoZXNlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisKKyAgICAgICAgIFlvdSBjYW4gZGVmaW5lIGFueSBudW1iZXIgb2YgY29udGV4dCBpbml0aWFsaXphdGlvbgorICAgICAgICAgcGFyYW1ldGVycywgaW5jbHVkaW5nIHplcm8uCisgICAgLS0+CisKKyAgICA8Y29udGV4dC1wYXJhbT4KKyAgICAgIDxwYXJhbS1uYW1lPndlYm1hc3RlcjwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT5teWFkZHJlc3NAbXljb21wYW55LmNvbTwvcGFyYW0tdmFsdWU+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFRoZSBFTUFJTCBhZGRyZXNzIG9mIHRoZSBhZG1pbmlzdHJhdG9yIHRvIHdob20gcXVlc3Rpb25zCisgICAgICAgIGFuZCBjb21tZW50cyBhYm91dCB0aGlzIGFwcGxpY2F0aW9uIHNob3VsZCBiZSBhZGRyZXNzZWQuCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDwvY29udGV4dC1wYXJhbT4KKworCisgICAgPCEtLSBTZXJ2bGV0IGRlZmluaXRpb25zIGZvciB0aGUgc2VydmxldHMgdGhhdCBtYWtlIHVwCisgICAgICAgICB5b3VyIHdlYiBhcHBsaWNhdGlvbiwgaW5jbHVkaW5nIGluaXRpYWxpemF0aW9uCisgICAgICAgICBwYXJhbWV0ZXJzLiAgV2l0aCBUb21jYXQsIHlvdSBjYW4gYWxzbyBzZW5kIHJlcXVlc3RzCisgICAgICAgICB0byBzZXJ2bGV0cyBub3QgbGlzdGVkIGhlcmUgd2l0aCBhIHJlcXVlc3QgbGlrZSB0aGlzOgorCisgICAgICAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC97Y29udGV4dC1wYXRofS9zZXJ2bGV0L3tjbGFzc25hbWV9CisKKyAgICAgICAgIGJ1dCB0aGlzIHVzYWdlIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHBvcnRhYmxlLiAgSXQgYWxzbworICAgICAgICAgbWFrZXMgcmVsYXRpdmUgcmVmZXJlbmNlcyB0byBpbWFnZXMgYW5kIG90aGVyIHJlc291cmNlcworICAgICAgICAgcmVxdWlyZWQgYnkgeW91ciBzZXJ2bGV0IG1vcmUgY29tcGxpY2F0ZWQsIHNvIGRlZmluaW5nCisgICAgICAgICBhbGwgb2YgeW91ciBzZXJ2bGV0cyAoYW5kIGRlZmluaW5nIGEgbWFwcGluZyB0byB0aGVtIHdpdGgKKyAgICAgICAgIGEgc2VydmxldC1tYXBwaW5nIGVsZW1lbnQpIGlzIHJlY29tbWVuZGVkLgorCisgICAgICAgICBTZXJ2bGV0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgY2FuIGJlIHJldHJpZXZlZCBpbiBhCisgICAgICAgICBzZXJ2bGV0IG9yIEpTUCBwYWdlIGJ5IGNhbGxpbmc6CisKKyAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPQorICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoIm5hbWUiKTsKKworICAgICAgICAgd2hlcmUgIm5hbWUiIG1hdGNoZXMgdGhlIDxwYXJhbS1uYW1lPiBlbGVtZW50IG9mCisgICAgICAgICBvbmUgb2YgdGhlc2UgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KKworICAgICAgICAgWW91IGNhbiBkZWZpbmUgYW55IG51bWJlciBvZiBzZXJ2bGV0cywgaW5jbHVkaW5nIHplcm8uCisgICAgLS0+CisKKyAgICA8c2VydmxldD4KKyAgICAgIDxzZXJ2bGV0LW5hbWU+Y29udHJvbGxlcjwvc2VydmxldC1uYW1lPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGlzIHNlcnZsZXQgcGxheXMgdGhlICJjb250cm9sbGVyIiByb2xlIGluIHRoZSBNVkMgYXJjaGl0ZWN0dXJlCisgICAgICAgIHVzZWQgaW4gdGhpcyBhcHBsaWNhdGlvbi4gIEl0IGlzIGdlbmVyYWxseSBtYXBwZWQgdG8gdGhlICIuZG8iCisgICAgICAgIGZpbGVuYW1lIGV4dGVuc2lvbiB3aXRoIGEgc2VydmxldC1tYXBwaW5nIGVsZW1lbnQsIGFuZCBhbGwgZm9ybQorICAgICAgICBzdWJtaXRzIGluIHRoZSBhcHAgd2lsbCBiZSBzdWJtaXR0ZWQgdG8gYSByZXF1ZXN0IFVSSSBsaWtlCisgICAgICAgICJzYXZlQ3VzdG9tZXIuZG8iLCB3aGljaCB3aWxsIHRoZXJlZm9yZSBiZSBtYXBwZWQgdG8gdGhpcyBzZXJ2bGV0LgorCisgICAgICAgIFRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgbmFtZXNzIGZvciB0aGlzIHNlcnZsZXQgYXJlIHRoZQorICAgICAgICAic2VydmxldCBwYXRoIiB0aGF0IHdpbGwgYmUgcmVjZWl2ZWQgYnkgdGhpcyBzZXJ2bGV0IChhZnRlciB0aGUKKyAgICAgICAgZmlsZW5hbWUgZXh0ZW5zaW9uIGlzIHJlbW92ZWQpLiAgVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgdGhlCisgICAgICAgIG5hbWUgb2YgdGhlIGFjdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBwcm9jZXNzIHRoaXMgcmVxdWVzdC4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8c2VydmxldC1jbGFzcz5jb20ubXljb21wYW55Lm15cGFja2FnZS5Db250cm9sbGVyU2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICA8cGFyYW0tbmFtZT5saXN0T3JkZXJzPC9wYXJhbS1uYW1lPgorICAgICAgICA8cGFyYW0tdmFsdWU+Y29tLm15Y29tcGFueS5teWFjdGlvbnMuTGlzdE9yZGVyc0FjdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICA8L2luaXQtcGFyYW0+CisgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgPHBhcmFtLW5hbWU+c2F2ZUN1c3RvbWVyPC9wYXJhbS1uYW1lPgorICAgICAgICA8cGFyYW0tdmFsdWU+Y29tLm15Y29tcGFueS5teWFjdGlvbnMuU2F2ZUN1c3RvbWVyQWN0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgIDwhLS0gTG9hZCB0aGlzIHNlcnZsZXQgYXQgc2VydmVyIHN0YXJ0dXAgdGltZSAtLT4KKyAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+NTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgPHNlcnZsZXQtbmFtZT5ncmFwaDwvc2VydmxldC1uYW1lPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGlzIHNlcnZsZXQgcHJvZHVjZXMgR0lGIGltYWdlcyB0aGF0IGFyZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQKKyAgICAgICAgZ3JhcGhzLCBiYXNlZCBvbiB0aGUgaW5wdXQgcGFyYW1ldGVycyBpbmNsdWRlZCBvbiB0aGUgcmVxdWVzdC4KKyAgICAgICAgSXQgaXMgZ2VuZXJhbGx5IG1hcHBlZCB0byBhIHNwZWNpZmljIHJlcXVlc3QgVVJJIGxpa2UgIi9ncmFwaCIuCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDwvc2VydmxldD4KKworCisgICAgPCEtLSBEZWZpbmUgbWFwcGluZ3MgdGhhdCBhcmUgdXNlZCBieSB0aGUgc2VydmxldCBjb250YWluZXIgdG8KKyAgICAgICAgIHRyYW5zbGF0ZSBhIHBhcnRpY3VsYXIgcmVxdWVzdCBVUkkgKGNvbnRleHQtcmVsYXRpdmUpIHRvIGEKKyAgICAgICAgIHBhcnRpY3VsYXIgc2VydmxldC4gIFRoZSBleGFtcGxlcyBiZWxvdyBjb3JyZXNwb25kIHRvIHRoZQorICAgICAgICAgc2VydmxldCBkZXNjcmlwdGlvbnMgYWJvdmUuICBUaHVzLCBhIHJlcXVlc3QgVVJJIGxpa2U6CisKKyAgICAgICAgICAgaHR0cDovL2xvY2FsaG9zdDo4MDgwL3tjb250ZXh0cGF0aH0vZ3JhcGgKKworICAgICAgICAgd2lsbCBiZSBtYXBwZWQgdG8gdGhlICJncmFwaCIgc2VydmxldCwgd2hpbGUgYSByZXF1ZXN0IGxpa2U6CisKKyAgICAgICAgICAgaHR0cDovL2xvY2FsaG9zdDo4MDgwL3tjb250ZXh0cGF0aH0vc2F2ZUN1c3RvbWVyLmRvCisKKyAgICAgICAgIHdpbGwgYmUgbWFwcGVkIHRvIHRoZSAiY29udHJvbGxlciIgc2VydmxldC4KKworICAgICAgICAgWW91IG1heSBkZWZpbmUgYW55IG51bWJlciBvZiBzZXJ2bGV0IG1hcHBpbmdzLCBpbmNsdWRpbmcgemVyby4KKyAgICAgICAgIEl0IGlzIGFsc28gbGVnYWwgdG8gZGVmaW5lIG1vcmUgdGhhbiBvbmUgbWFwcGluZyBmb3IgdGhlIHNhbWUKKyAgICAgICAgIHNlcnZsZXQsIGlmIHlvdSB3aXNoIHRvLgorICAgIC0tPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgIDxzZXJ2bGV0LW5hbWU+Y29udHJvbGxlcjwvc2VydmxldC1uYW1lPgorICAgICAgPHVybC1wYXR0ZXJuPiouZG88L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgIDxzZXJ2bGV0LW5hbWU+Z3JhcGg8L3NlcnZsZXQtbmFtZT4KKyAgICAgIDx1cmwtcGF0dGVybj4vZ3JhcGg8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisKKyAgICA8IS0tIERlZmluZSB0aGUgZGVmYXVsdCBzZXNzaW9uIHRpbWVvdXQgZm9yIHlvdXIgYXBwbGljYXRpb24sCisgICAgICAgICBpbiBtaW51dGVzLiAgRnJvbSBhIHNlcnZsZXQgb3IgSlNQIHBhZ2UsIHlvdSBjYW4gbW9kaWZ5CisgICAgICAgICB0aGUgdGltZW91dCBmb3IgYSBwYXJ0aWN1bGFyIHNlc3Npb24gZHluYW1pY2FsbHkgYnkgdXNpbmcKKyAgICAgICAgIEh0dHBTZXNzaW9uLmdldE1heEluYWN0aXZlSW50ZXJ2YWwoKS4gLS0+CisKKyAgICA8c2Vzc2lvbi1jb25maWc+CisgICAgICA8c2Vzc2lvbi10aW1lb3V0PjMwPC9zZXNzaW9uLXRpbWVvdXQ+ICAgIDwhLS0gMzAgbWludXRlcyAtLT4KKyAgICA8L3Nlc3Npb24tY29uZmlnPgorCisKKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXByLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXByLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjExODg3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHIueG1sCkBAIC0wLDAgKzEsMzMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iYXByLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHRpdGxlPkFwYWNoZSBQb3J0YWJsZSBSdW50aW1lIGFuZCBUb21jYXQ8L3RpdGxlPgorICAgIDxhdXRob3I+UmVteSBNYXVjaGVyYXQ8L2F1dGhvcj4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworICA8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgIDxwPgorICAgICAgVG9tY2F0IGNhbiB1c2UgdGhlIDxhIGhyZWY9Imh0dHA6Ly9hcHIuYXBhY2hlLm9yZy8iPkFwYWNoZSBQb3J0YWJsZSBSdW50aW1lPC9hPiB0byAKKyAgICAgIHByb3ZpZGUgc3VwZXJpb3Igc2NhbGFiaWxpdHksIHBlcmZvcm1hbmNlLCBhbmQgYmV0dGVyIGludGVncmF0aW9uIHdpdGggbmF0aXZlIHNlcnZlciAKKyAgICAgIHRlY2hub2xvZ2llcy4gVGhlIEFwYWNoZSBQb3J0YWJsZSBSdW50aW1lIGlzIGEgaGlnaGx5IHBvcnRhYmxlIGxpYnJhcnkgdGhhdCBpcyBhdCAKKyAgICAgIHRoZSBoZWFydCBvZiBBcGFjaGUgSFRUUCBTZXJ2ZXIgMi54LiBBUFIgaGFzIG1hbnkgdXNlcywgaW5jbHVkaW5nIGFjY2VzcyB0byBhZHZhbmNlZCBJTworICAgICAgZnVuY3Rpb25hbGl0eSAoc3VjaCBhcyBzZW5kZmlsZSwgZXBvbGwgYW5kIE9wZW5TU0wpLCBPUyBsZXZlbCBmdW5jdGlvbmFsaXR5IChyYW5kb20gbnVtYmVyCisgICAgICBnZW5lcmF0aW9uLCBzeXN0ZW0gc3RhdHVzLCBldGMpLCBhbmQgbmF0aXZlIHByb2Nlc3MgaGFuZGxpbmcgKHNoYXJlZCBtZW1vcnksIE5UCisgICAgICBwaXBlcyBhbmQgVW5peCBzb2NrZXRzKS4KKyAgPC9wPgorICAKKyAgPHA+CisgICAgICBUaGVzZSBmZWF0dXJlcyBhbGxvd3MgbWFraW5nIFRvbWNhdCBhIGdlbmVyYWwgcHVycG9zZSB3ZWJzZXJ2ZXIsIHdpbGwgZW5hYmxlIG11Y2ggYmV0dGVyIAorICAgICAgaW50ZWdyYXRpb24gd2l0aCBvdGhlciBuYXRpdmUgd2ViIHRlY2hub2xvZ2llcywgYW5kIG92ZXJhbGwgbWFrZSBKYXZhIG11Y2ggbW9yZSB2aWFibGUgYXMKKyAgICAgIGEgZnVsbCBmbGVkZ2VkIHdlYnNlcnZlciBwbGF0Zm9ybSByYXRoZXIgdGhhbiBzaW1wbHkgYSBiYWNrZW5kIGZvY3VzZWQgdGVjaG5vbG9neS4KKyAgPC9wPgorCisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSJJbnN0YWxsYXRpb24iPgorCisgICAgPHA+CisgICAgICBBUFIgc3VwcG9ydCByZXF1aXJlcyB0aHJlZSBtYWluIG5hdGl2ZSBjb21wb25lbnRzIHRvIGJlIGluc3RhbGxlZDoKKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPkFQUiBsaWJyYXJ5PC9saT4KKyAgICAgICAgPGxpPkpOSSB3cmFwcGVycyBmb3IgQVBSIHVzZWQgYnkgVG9tY2F0IChsaWJ0Y25hdGl2ZSk8L2xpPgorICAgICAgICA8bGk+T3BlblNTTCBsaWJyYXJpZXM8L2xpPgorICAgICAgPC91bD4KKyAgICA8L3A+CisKKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJXaW5kb3dzIj4KKyAgICAKKyAgICA8cD4KKyAgICAgIFdpbmRvd3MgYmluYXJpZXMgYXJlIHByb3ZpZGVkIGZvciB0Y25hdGl2ZS0xLCB3aGljaCBpcyBhIHN0YXRpY2FsbHkgY29tcGlsZWQgLmRsbCB3aGljaCBpbmNsdWRlcworICAgICAgT3BlblNTTCBhbmQgQVBSLiBJdCBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIDxhIGhyZWY9Imh0dHA6Ly90b21jYXQuaGVhbmV0LmllL25hdGl2ZS8iPmhlcmU8L2E+CisgICAgICBhcyAzMmJpdCBvciBBTUQgeDg2LTY0IGJpbmFyaWVzLgorICAgICAgSW4gc2VjdXJpdHkgY29uc2Npb3VzIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2Ugc2VwYXJhdGUgc2hhcmVkIGRsbHMKKyAgICAgIGZvciBPcGVuU1NMLCBBUFIsIGFuZCBsaWJ0Y25hdGl2ZS0xLCBhbmQgdXBkYXRlIHRoZW0gYXMgbmVlZGVkIGFjY29yZGluZyB0byBzZWN1cml0eSBidWxsZXRpbnMuCisgICAgICBXaW5kb3dzIE9wZW5TU0wgYmluYXJpZXMgYXJlIGxpbmtlZCBmcm9tIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5zc2wub3JnIj5PZmZpY2lhbCBPcGVuU1NMIAorICAgICAgd2Vic2l0ZTwvYT4gKHNlZSByZWxhdGVkL2JpbmFyaWVzKS4KKyAgICA8L3A+CisgICAgCisgICAgPC9zdWJzZWN0aW9uPgorICAgIAorICAgIDxzdWJzZWN0aW9uIG5hbWU9IkxpbnV4Ij4KKyAgICAKKyAgICA8cD4KKyAgICAgIE1vc3QgTGludXggZGlzdHJpYnV0aW9ucyB3aWxsIHNoaXAgcGFja2FnZXMgZm9yIEFQUiBhbmQgT3BlblNTTC4gVGhlIEpOSSB3cmFwcGVyIChsaWJ0Y25hdGl2ZSkgd2lsbCAKKyAgICAgIHRoZW4gaGF2ZSB0byBiZSBjb21waWxlZC4gSXQgZGVwZW5kcyBvbiBBUFIsIE9wZW5TU0wsIGFuZCB0aGUgSmF2YSBoZWFkZXJzLgorICAgIDwvcD4KKyAgICAKKyAgICA8cD4KKyAgICAgIFJlcXVpcmVtZW50czoKKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPkFQUiAxLjIrIGRldmVsb3BtZW50IGhlYWRlcnMgKGxpYmFwcjEtZGV2IHBhY2thZ2UpPC9saT4KKyAgICAgICAgPGxpPk9wZW5TU0wgMC45LjcrIGRldmVsb3BtZW50IGhlYWRlcnMgKGxpYnNzbC1kZXYgcGFja2FnZSk8L2xpPgorICAgICAgICA8bGk+Sk5JIGhlYWRlcnMgZnJvbSBKYXZhIGNvbXBhdGlibGUgSkRLIDEuNCs8L2xpPgorICAgICAgICA8bGk+R05VIGRldmVsb3BtZW50IGVudmlyb25tZW50IChnY2MsIG1ha2UpPC9saT4KKyAgICAgIDwvdWw+CisgICAgPC9wPgorICAgIAorICAgIDxwPgorICAgICAgVGhlIHdyYXBwZXIgbGlicmFyeSBzb3VyY2VzIGFyZSBsb2NhdGVkIGluIHRoZSBUb21jYXQgYmluYXJ5IGJ1bmRsZSwgaW4gdGhlIAorICAgICAgPGNvZGU+YmluL3RvbWNhdC1uYXRpdmUudGFyLmd6PC9jb2RlPiBhcmNoaXZlLgorICAgICAgT25jZSB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgaW5zdGFsbGVkIGFuZCB0aGUgc291cmNlIGFyY2hpdmUgaXMgZXh0cmFjdGVkLCB0aGUgd3JhcHBlciBsaWJyYXJ5IAorICAgICAgY2FuIGJlIGNvbXBpbGVkIHVzaW5nIChmcm9tIHRoZSBmb2xkZXIgY29udGFpbmluZyB0aGUgY29uZmlndXJlIHNjcmlwdCk6CisgICAgICA8c291cmNlPi4vY29uZmlndXJlICZhbXA7JmFtcDsgbWFrZSAmYW1wOyZhbXA7IG1ha2UgaW5zdGFsbDwvc291cmNlPgorICAgIDwvcD4KKyAgICAKKyAgICA8L3N1YnNlY3Rpb24+CisJCisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSJBUFIgQ29tcG9uZW50cyI+CisKKyAgPHA+CisgICAgT25jZSB0aGUgbGlicmFyaWVzIGFyZSBwcm9wZXJseSBpbnN0YWxsZWQgYW5kIGF2YWlsYWJsZSB0byBKYXZhIChpZiBsb2FkaW5nIGZhaWxzLCB0aGUgbGlicmFyeSBwYXRoCisgICAgd2lsbCBiZSBkaXNwbGF5ZWQpLCB0aGUgVG9tY2F0IGNvbm5lY3RvcnMgd2lsbCBhdXRvbWF0aWNhbGx5IHVzZSBBUFIuIENvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbm5lY3RvcnMKKyAgICBpcyBzaW1pbGFyIHRvIHRoZSByZWd1bGFyIGNvbm5lY3RvcnMsIGJ1dCBoYXZlIGEgZmV3IGV4dHJhIGF0dHJpYnV0ZXMgd2hpY2ggYXJlIHVzZWQgdG8gY29uZmlndXJlCisgICAgQVBSIGNvbXBvbmVudHMuIE5vdGUgdGhhdCB0aGUgZGVmYXVsdHMgc2hvdWxkIGJlIHdlbGwgdHVuZWQgZm9yIG1vc3QgdXNlIGNhc2VzLCBhbmQgYWRkaXRpb25hbAorICAgIHR3ZWFraW5nIHNob3VsZG4ndCBiZSByZXF1aXJlZC4KKyAgPC9wPgorCisgIDxwPgorICAgIFdoZW4gQVBSIGlzIGVuYWJsZWQsIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGFsc28gZW5hYmxlZCBpbiBUb21jYXQ6CisgICAgPHVsPgorICAgICAgPGxpPlNlY3VyZSBzZXNzaW9uIElEIGdlbmVyYXRpb24gYnkgZGVmYXVsdCBvbiBhbGwgcGxhdGZvcm1zIChwbGF0Zm9ybXMgb3RoZXIgdGhhbiBMaW51eCByZXF1aXJlZAorICAgICAgICAgIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiB1c2luZyBhIGNvbmZpZ3VyZWQgZW50cm9weSk8L2xpPgorICAgICAgPGxpPk9TIGxldmVsIHN0YXRpc3RpY3Mgb24gbWVtb3J5IHVzYWdlIGFuZCBDUFUgdXNhZ2UgYnkgdGhlIFRvbWNhdCBwcm9jZXNzIGFyZSBkaXNwbGF5ZWQgYnkKKyAgICAgICAgICB0aGUgc3RhdHVzIHNlcnZsZXQ8L2xpPgorICAgIDwvdWw+CisgIDwvcD4KKworICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iQVBSIENvbm5lY3RvcnMgQ29uZmlndXJhdGlvbiI+CisKKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJIVFRQIj4KKyAgICAKKyAgICA8cD4KKyAgICAgIFdoZW4gQVBSIGlzIGVuYWJsZWQsIHRoZSBIVFRQIGNvbm5lY3RvciB3aWxsIHVzZSBzZW5kZmlsZSBmb3IgaGFkbGluZyBsYXJnZSBzdGF0aWMgZmlsZXMgKGFsbCBzdWNoCisgICAgICBmaWxlcyB3aWxsIGJlIHNlbnQgYW5zeWNocm9ub3VzbHkgdXNpbmcgaGlnaCBwZXJmb3JtYW5jZSBrZXJuZWwgbGV2ZWwgY2FsbHMpLCBhbmQgd2lsbCB1c2UgCisgICAgICBhIHNvY2tldCBwb2xsZXIgZm9yIGtlZXBhbGl2ZSwgaW5jcmVhc2luZyBzY2FsYWJpbGl0eSBvZiB0aGUgc2VydmVyLgorICAgIDwvcD4KKworICAgIDxwPgorICAgICAgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQgaW4gdGhlIEhUVFAgQVBSIGNvbm5lY3RvciBpbiBhZGRpdGlvbiB0byB0aGUgb25lcyBzdXBwb3J0ZWQKKyAgICAgIGluIHRoZSByZWd1bGFyIEhUVFAgY29ubmVjdG9yOgorICAgIDwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlyc3RSZWFkVGltZW91dCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBmaXJzdCByZWFkIG9mIGEgcmVxdWVzdCB3aWxsIGJlIG1hZGUgdXNpbmcgdGhlIHNwZWNpZmllZCB0aW1lb3V0LiBJZiBubyBkYXRhIGlzIGF2YWlsYWJsZQorICAgICAgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0aW1lLCB0aGUgc29ja2V0IHdpbGwgYmUgcGxhY2VkIGluIHRoZSBwb2xsZXIuIFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcworICAgICAgaW4gbXMuIFNldHRpbmcgdGhpcyB2YWx1ZSB0byAwIG9yIC0xIHdpbGwKKyAgICAgIGluY3JlYXNlIHNjYWxhYmlsaXR5IGJ5IGFsd2F5cyB1c2luZyBhIHBvbGxlciB0byBoYW5kbGUga2VlcGFsaXZlLCBidXQgd2lsbCBoYXZlIGEgbWlub3IgaW1wYWN0IAorICAgICAgb24gbGF0ZW5jeSAoc2VlIHRoZSByZWxhdGVkIHBvbGxUaW1lIGF0dHJpYnV0ZSkuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgd2l0aCAwLCB0aGUgZmlyc3QgcmVhZCBvZgorICAgICAgYSByZXF1ZXN0IHdpbGwgYmUgbWFkZSB1c2luZyBhIHNob3J0IHRpbWVvdXQsIHdoaWxlIHdpdGggLTEsIHRoZSBmaXJzdCByZWFkIHdpbGwgYmUgbWFkZSB1c2luZyB0aGUKKyAgICAgIHJlZ3VsYXIgc29ja2V0IHRpbWVvdXQgdGhhdCBpcyBjb25maWd1cmVkIG9uIHRoZSBjb25uZWN0b3IuIFNldHRpbmcgdGhpcyB0byAtMiB3aWxsIGNhdXNlCisgICAgICB0aGUgY29ubmVjdG9yIHRvIG5vdCB1c2UgdGhlIHBvbGxlciBmb3Iga2VlcGFsaXZlIGluIG1vc3Qgc2l0dWF0aW9ucywgZW11bGF0aW5nIHRoZSBiZWhhdmlvciBvZgorICAgICAgdGhlIGphdmEuaW8gSFRUUCBjb25uZWN0b3IuCisgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAtMS4gTm90ZTogb24gV2luZG93cywgdGhlIGFjdHVhbCB2YWx1ZSBvZiBmaXJzdFJlYWRUaW1lb3V0IHdpbGwKKyAgICAgIGJlIDUwMCArIHRoZSBzcGVjaWZpZWQgdmFsdWUsIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgc3RyaWN0bHkgcG9zaXRpdmUuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2xsVGltZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPkR1cmF0aW9uIG9mIGEgcG9sbCBjYWxsLiBMb3dlcmluZyB0aGlzIHZhbHVlIHdpbGwgc2xpZ2h0bHkgZGVjcmVhc2UgbGF0ZW5jeSBvZiBjb25uZWN0aW9ucyAKKyAgICAgIGJlaW5nIGtlcHQgYWxpdmUgaW4gc29tZSBjYXNlcywgYnV0IHdpbGwgdXNlIG1vcmUgQ1BVIGFzIG1vcmUgcG9sbCBjYWxscyBhcmUgYmVpbmcgbWFkZS4gVGhlCisgICAgICBkZWZhdWx0IHZhbHVlIGlzIDIwMDAgKDVtcykuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2xsZXJTaXplIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+QW1vdW50IG9mIHNvY2tldHMgdGhhdCB0aGUgcG9sbGVyIHJlc3BvbnNpYmxlIGZvciBwb2xsaW5nIGtlcHQgYWxpdmUgY29ubmVjdGlvbnMgY2FuIGhvbGQgYXQgYQorICAgICAgZ2l2ZW4gdGltZS4gRXh0cmEgY29ubmVjdGlvbnMgd2lsbCBiZSBjbG9zZWQgcmlnaHQgYXdheS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgODE5MiwgY29ycmVzcG9uZGluZyB0bworICAgICAgODE5MiBrZWVwYWxpdmUgY29ubmVjdGlvbnMuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VTZW5kZmlsZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlVzZSBrZXJuZWwgbGV2ZWwgc2VuZGZpbGUgZm9yIGNlcnRhaW4gc3RhdGljIGZpbGVzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VuZGZpbGVTaXplIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+QW1vdW50IG9mIHNvY2tldHMgdGhhdCB0aGUgcG9sbGVyIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIHN0YXRpYyBmaWxlcyBhc3luY2hyb25vdXNseSBjYW4gaG9sZCAKKyAgICAgIGF0IGEgZ2l2ZW4gdGltZS4gRXh0cmEgY29ubmVjdGlvbnMgd2lsbCBiZSBjbG9zZWQgcmlnaHQgYXdheSB3aXRob3V0IGFueSBkYXRhIGJlaW5nIHNlbnQgCisgICAgICAocmVzdWx0aW5nIGluIGEgemVybyBsZW5ndGggZmlsZSBvbiB0aGUgY2xpZW50IHNpZGUpLiBOb3RlIHRoYXQgaW4gbW9zdCBjYXNlcywgc2VuZGZpbGUgaXMgYSBjYWxsCisgICAgICB0aGF0IHdpbGwgcmV0dXJuIHJpZ2h0IGF3YXkgKGJlaW5nIHRha2VuIGNhcmUgb2YgInN5bmNob25vdXNseSIgYnkgdGhlIGtlcm5lbCksIGFuZCB0aGUgc2VuZGZpbGUKKyAgICAgIHBvbGxlciB3aWxsIG5vdCBiZSB1c2VkLCBzbyB0aGUgYW1vdW50IG9mIHN0YXRpYyBmaWxlcyB3aGljaCBjYW4gYmUgc2VudCBjb25jdXJyZW50bHkgaXMgbXVjaCBsYXJnZXIKKyAgICAgIHRoYW4gdGhlIHNwZWNpZmllZCBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEwMjQuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPC9hdHRyaWJ1dGVzPgorICAgIAorICAgIDwvc3Vic2VjdGlvbj4KKwkKKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJIVFRQUyI+CisgICAgCisgICAgPHA+CisgICAgICBXaGVuIEFQUiBpcyBlbmFibGVkLCB0aGUgSFRUUFMgY29ubmVjdG9yIHdpbGwgdXNlIGEgc29ja2V0IHBvbGxlciBmb3Iga2VlcGFsaXZlLCBpbmNyZWFzaW5nIAorICAgICAgc2NhbGFiaWxpdHkgb2YgdGhlIHNlcnZlci4gSXQgYWxzbyB1c2VzIE9wZW5TU0wsIHdoaWNoIG1heSBiZSBtb3JlIG9wdGltaXplZCB0aGFuIEpTU0UgZGVwZW5kaW5nCisgICAgICBvbiB0aGUgcHJvY2Vzc29yIGJlaW5nIHVzZWQsIGFuZCBjYW4gYmUgY29tcGxlbWVudGVkIHdpdGggbWFueSBjb21tZXJjaWFsIGFjY2VsZXJhdG9yIGNvbXBvbmVudHMuCisgICAgICBVbmxpa2UgdGhlIEhUVFAgY29ubmVjdG9yLCB0aGUgSFRUUFMgY29ubmVjdG9yIGNhbm5vdCB1c2Ugc2VuZGZpbGUgdG8gb3B0aW1pemUgc3RhdGljIGZpbGUKKyAgICAgIHByb2Nlc3NpbmcuCisgICAgPC9wPgorCisgICAgPHA+CisgICAgICBUaGUgSFRUUFMgQVBSIGNvbm5lY3RvciBoYXMgdGhlIHNhbWUgYmFzaWMgYXR0cmlidXRlcyB0aGFuIHRoZSBIVFRQIEFQUiBjb25uZWN0b3IsIGJ1dCBhZGRzIAorICAgICAgT3BlblNTTCBzcGVjaWZpYyBvbmVzLiBGb3IgdGhlIGZ1bGwgZGV0YWlscyBvbiB1c2luZyBPcGVuU1NMLCBwbGVhc2UgcmVmZXIgdG8gT3BlblNTTCBkb2N1bWVudGF0aW9ucworICAgICAgYW5kIHRoZSBtYW55IGJvb2tzIGF2YWlsYWJsZSBmb3IgaXQgKHNlZSB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuc3NsLm9yZyI+T2ZmaWNpYWwgT3BlblNTTCAKKyAgICAgIHdlYnNpdGU8L2E+KS4gVGhlIFNTTCBzcGVjaWZpYyBhdHRyaWJ1dGVzIGZvciB0aGUgY29ubmVjdG9yIGFyZToKKyAgICA8L3A+CisgICAgCisgICAgPGF0dHJpYnV0ZXM+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9IlNTTEVuZ2luZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICA8cD4KKyAgICAgIE5hbWUgb2YgdGhlIFNTTEVuZ2luZSB0byB1c2UuIG9mZjogRG8gbm90IHVzZSBTU0wsIG9uOiBVc2UgU1NMIGJ1dCBubyBzcGVjaWZpYyBFTkdJTkUuCisgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBvZmYuCisgICAgPC9wPgorICAgIDwvYXR0cmlidXRlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iU1NMUHJvdG9jb2wiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgPHA+CisgICAgICBQcm90b2NvbCB3aGljaCBtYXkgYmUgdXNlZCBmb3IgY29tbXVuaWNhdGluZyB3aXRoIGNsaWVudHMuIFRoZSBkZWZhdWx0IGlzICJhbGwiLCB3aXRoCisgICAgICBvdGhlciBhY2NlcHRhYmxlIHZhbHVlcyBiZWluZyAiU1NMdjIiLCAiU1NMdjMiLCAiVExTdjEiLCBhbmQgIlNTTHYyK1NTTHYzIi4KKyAgICA8L3A+CisgICAgPC9hdHRyaWJ1dGU+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJTU0xDaXBoZXJTdWl0ZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICA8cD4KKyAgICAgIENpcGhlcnMgd2hpY2ggbWF5IGJlIHVzZWQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBjbGllbnRzLiBUaGUgZGVmYXVsdCBpcyAiQUxMIiwgd2l0aAorICAgICAgb3RoZXIgYWNjZXB0YWJsZSB2YWx1ZXMgYmVpbmcgYSBsaXN0IG9mIGNpcGhlcnMsIHdpdGggIjoiIHVzZWQgYXMgdGhlIGRlbGltaXRlcgorICAgICAgKHNlZSBPcGVuU1NMIGRvY3VtZW50YXRpb24gZm9yIHRoZSBsaXN0IG9mIGNpcGhlcnMgc3VwcG9ydGVkKS4KKyAgICA8L3A+CisgICAgPC9hdHRyaWJ1dGU+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJTU0xDZXJ0aWZpY2F0ZUZpbGUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICA8cD4KKyAgICAgIE5hbWUgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgc2VydmVyIGNlcnRpZmljYXRlLiBUaGUgZm9ybWF0IGlzIFBFTS1lbmNvZGVkLgorICAgIDwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9IlNTTENlcnRpZmljYXRlS2V5RmlsZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICA8cD4KKyAgICAgIE5hbWUgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgc2VydmVyIHByaXZhdGUga2V5LiBUaGUgZm9ybWF0IGlzIFBFTS1lbmNvZGVkLgorICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIHZhbHVlIG9mICJTU0xDZXJ0aWZpY2F0ZUZpbGUiIGFuZCBpbiB0aGlzIGNhc2UgYm90aCBjZXJ0aWZpY2F0ZQorICAgICAgYW5kIHByaXZhdGUga2V5IGhhdmUgdG8gYmUgaW4gdGhpcyBmaWxlIChOT1QgUkVDT01NRU5ERUQpLgorICAgIDwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9IlNTTFBhc3N3b3JkIiByZXF1aXJlZD0iZmFsc2UiPgorICAgIDxwPgorICAgICAgUGFzcyBwaHJhc2UgZm9yIHRoZSBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXkuIElmICJTU0xQYXNzd29yZCIgaXMgbm90IHByb3ZpZGVkLCB0aGUgY2FsbGJhY2sgZm9uY3Rpb24KKyAgICAgIHNob3VsZCBwcm9tcHQgZm9yIHRoZSBwYXNzIHBocmFzZS4KKyAgICA8L3A+CisgICAgPC9hdHRyaWJ1dGU+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJTU0xWZXJpZnlDbGllbnQiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgPHA+CisgICAgICBBc2sgY2xpZW50IGZvciBjZXJ0aWZpY2F0ZS4gVGhlIGRlZmF1bHQgaXMgIm5vbmUiLCBtZWFuaW5nIHRoZSBjbGllbnQgd2lsbCBub3QgaGF2ZSB0aGUgb3Bwb3J0dW5pdHkKKyAgICAgIHRvIHN1Ym1pdCBhIGNlcnRpZmljYXRlLiBPdGhlciBhY2NlcHRhYmxlIHZhbHVlcyBpbmNsdWRlICJvcHRpb25hbCIsICJyZXF1aXJlIiBhbmQgIm9wdGlvbmFsTm9DQSIuCisgICAgPC9wPgorICAgIDwvYXR0cmlidXRlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iU1NMVmVyaWZ5RGVwdGgiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgPHA+CisgICAgICBNYXhpbXVtIHZlcmlmaWNhdGlvbiBkZXB0aCBmb3IgY2xpZW50IGNlcnRpZmljYXRlcy4gVGhlIGRlZmF1bHQgaXMgIjEwIi4KKyAgICA8L3A+CisgICAgPC9hdHRyaWJ1dGU+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJTU0xDQUNlcnRpZmljYXRlRmlsZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICA8cD4KKyAgICAgIFNlZSA8YSBocmVmPSJodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLzIuMi9tb2QvbW9kX3NzbC5odG1sI3NzbGNhY2VydGlmaWNhdGVmaWxlIj50aGUgbW9kX3NzbCBkb2N1bWVudGF0aW9uPC9hPi4KKyAgICA8L3A+CisgICAgPC9hdHRyaWJ1dGU+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJTU0xDQUNlcnRpZmljYXRlUGF0aCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICA8cD4KKyAgICAgIFNlZSA8YSBocmVmPSJodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLzIuMi9tb2QvbW9kX3NzbC5odG1sI3NzbGNhY2VydGlmaWNhdGVwYXRoIj50aGUgbW9kX3NzbCBkb2N1bWVudGF0aW9uPC9hPi4KKyAgICA8L3A+CisgICAgPC9hdHRyaWJ1dGU+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJTU0xDZXJ0aWZpY2F0ZUNoYWluRmlsZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICA8cD4KKyAgICAgIFNlZSA8YSBocmVmPSJodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLzIuMi9tb2QvbW9kX3NzbC5odG1sI3NzbGNlcnRpZmljYXRlY2hhaW5maWxlIj50aGUgbW9kX3NzbCBkb2N1bWVudGF0aW9uPC9hPi4KKyAgICA8L3A+CisgICAgPC9hdHRyaWJ1dGU+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJTU0xDQVJldm9jYXRpb25GaWxlIiByZXF1aXJlZD0iZmFsc2UiPgorICAgIDxwPgorICAgICAgU2VlIDxhIGhyZWY9Imh0dHA6Ly9odHRwZC5hcGFjaGUub3JnL2RvY3MvMi4yL21vZC9tb2Rfc3NsLmh0bWwjc3NsY2FyZXZvY2F0aW9uZmlsZSI+dGhlIG1vZF9zc2wgZG9jdW1lbnRhdGlvbjwvYT4uCisgICAgPC9wPgorICAgIDwvYXR0cmlidXRlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iU1NMQ0FSZXZvY2F0aW9uUGF0aCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICA8cD4KKyAgICAgIFNlZSA8YSBocmVmPSJodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLzIuMi9tb2QvbW9kX3NzbC5odG1sI3NzbGNhcmV2b2NhdGlvbnBhdGgiPnRoZSBtb2Rfc3NsIGRvY3VtZW50YXRpb248L2E+LgorICAgIDwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKyAgICAKKyAgICA8cD4KKyAgICBBbiBleGFtcGxlIFNTTCBDb25uZWN0b3IgZGVjbGFyYXRpb24gY2FuIGJlOgorICAgIDxzb3VyY2U+CisgICAgJmx0O0Nvbm5lY3RvciBwb3J0PSI0NDMiIG1heEh0dHBIZWFkZXJTaXplPSI4MTkyIgorICAgICAgICAgICAgICAgbWF4VGhyZWFkcz0iMTUwIiBtaW5TcGFyZVRocmVhZHM9IjI1IiBtYXhTcGFyZVRocmVhZHM9Ijc1IgorICAgICAgICAgICAgICAgZW5hYmxlTG9va3Vwcz0iZmFsc2UiIGRpc2FibGVVcGxvYWRUaW1lb3V0PSJ0cnVlIgorICAgICAgICAgICAgICAgYWNjZXB0Q291bnQ9IjEwMCIgc2NoZW1lPSJodHRwcyIgc2VjdXJlPSJ0cnVlIgorICAgICAgICAgICAgICAgU1NMRW5naW5lPSJvbiIgCisgICAgICAgICAgICAgICBTU0xDZXJ0aWZpY2F0ZUZpbGU9IiR7Y2F0YWxpbmEuYmFzZX0vY29uZi9sb2NhbGhvc3QuY3J0IgorICAgICAgICAgICAgICAgU1NMQ2VydGlmaWNhdGVLZXlGaWxlPSIke2NhdGFsaW5hLmJhc2V9L2NvbmYvbG9jYWxob3N0LmtleSIgLyZndDs8L3NvdXJjZT4KKyAgICA8L3A+CisgICAgCisgICAgPC9zdWJzZWN0aW9uPgorCQorICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFKUCI+CisgICAgCisgICAgPHA+CisgICAgICBXaGVuIEFQUiBpcyBlbmFibGVkLCB0aGUgQUpQIGNvbm5lY3RvciB3aWxsIHVzZSBhIHNvY2tldCBwb2xsZXIgZm9yIGtlZXBhbGl2ZSwgaW5jcmVhc2luZyAKKyAgICAgIHNjYWxhYmlsaXR5IG9mIHRoZSBzZXJ2ZXIuIEFzIEFKUCBpcyBkZXNpZ25lZCBhcm91bmQgYSBwb29sIG9mIHBlcnNpc3RlbnQgKG9yIGFsbW9zdAorICAgICAgcGVyc2lzdGVudCkgY29ubmVjdGlvbnMsIHRoaXMgd2lsbCByZWR1Y2Ugc2lnbmlmaWNhbnRseSB0aGUgYW1vdW50IG9mIHByb2Nlc3NpbmcgdGhyZWFkcyAKKyAgICAgIG5lZWRlZCBieSBUb21jYXQuIFVubGlrZSB0aGUgSFRUUCBjb25uZWN0b3IsIHRoZSBBSlAgY29ubmVjdG9yIGNhbm5vdCB1c2Ugc2VuZGZpbGUgdG8gb3B0aW1pemUKKyAgICAgIHN0YXRpYyBmaWxlIHByb2Nlc3NpbmcuCisgICAgPC9wPgorCisgICAgPHA+CisgICAgICBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHN1cHBvcnRlZCBpbiB0aGUgQUpQIEFQUiBjb25uZWN0b3IgaW4gYWRkaXRpb24gdG8gdGhlIG9uZXMgc3VwcG9ydGVkCisgICAgICBpbiB0aGUgcmVndWxhciBBSlAgY29ubmVjdG9yOgorICAgIDwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlyc3RSZWFkVGltZW91dCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBmaXJzdCByZWFkIG9mIGEgcmVxdWVzdCB3aWxsIGJlIG1hZGUgdXNpbmcgdGhlIHNwZWNpZmllZCB0aW1lb3V0LiBJZiBubyBkYXRhIGlzIGF2YWlsYWJsZQorICAgICAgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0aW1lLCB0aGUgc29ja2V0IHdpbGwgYmUgcGxhY2VkIGluIHRoZSBwb2xsZXIuIFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcworICAgICAgaW4gbXMuIFNldHRpbmcgdGhpcyB2YWx1ZSB0byAwIG9yIC0xIHdpbGwKKyAgICAgIGluY3JlYXNlIHNjYWxhYmlsaXR5IGJ5IGFsd2F5cyB1c2luZyBhIHBvbGxlciB0byBoYW5kbGUga2VlcGFsaXZlLCBidXQgd2lsbCBoYXZlIGEgbWlub3IgaW1wYWN0IAorICAgICAgb24gbGF0ZW5jeSAoc2VlIHRoZSByZWxhdGVkIHBvbGxUaW1lIGF0dHJpYnV0ZSkuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgd2l0aCAwLCB0aGUgZmlyc3QgcmVhZCBvZgorICAgICAgYSByZXF1ZXN0IHdpbGwgYmUgbWFkZSB1c2luZyBhIHNob3J0IHRpbWVvdXQsIHdoaWxlIHdpdGggLTEsIHRoZSBmaXJzdCByZWFkIHdpbGwgYmUgbWFkZSB1c2luZyB0aGUKKyAgICAgIHJlZ3VsYXIgc29ja2V0IHRpbWVvdXQgdGhhdCBpcyBjb25maWd1cmVkIG9uIHRoZSBjb25uZWN0b3IuIFNldHRpbmcgdGhpcyB0byAtMiB3aWxsIGNhdXNlCisgICAgICB0aGUgY29ubmVjdG9yIHRvIG5vdCB1c2UgdGhlIHBvbGxlciBmb3Iga2VlcGFsaXZlIGluIG1vc3Qgc2l0dWF0aW9ucywgZW11bGF0aW5nIHRoZSBiZWhhdmlvciBvZgorICAgICAgdGhlIGphdmEuaW8gSFRUUCBjb25uZWN0b3IuCisgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAtMS4gTm90ZTogb24gV2luZG93cywgdGhlIGFjdHVhbCB2YWx1ZSBvZiBmaXJzdFJlYWRUaW1lb3V0IHdpbGwKKyAgICAgIGJlIDUwMCArIHRoZSBzcGVjaWZpZWQgdmFsdWUsIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgc3RyaWN0bHkgcG9zaXRpdmUuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2xsVGltZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPkR1cmF0aW9uIG9mIGEgcG9sbCBjYWxsLiBMb3dlcmluZyB0aGlzIHZhbHVlIHdpbGwgc2xpZ2h0bHkgZGVjcmVhc2UgbGF0ZW5jeSBvZiBjb25uZWN0aW9ucyAKKyAgICAgIGJlaW5nIGtlcHQgYWxpdmUgaW4gc29tZSBjYXNlcywgYnV0IHdpbGwgdXNlIG1vcmUgQ1BVIGFzIG1vcmUgcG9sbCBjYWxscyBhcmUgYmVpbmcgbWFkZS4gVGhlCisgICAgICBkZWZhdWx0IHZhbHVlIGlzIDIwMDAgKDVtcykuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2xsZXJTaXplIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+QW1vdW50IG9mIHNvY2tldHMgdGhhdCB0aGUgcG9sbGVyIHJlc3BvbnNpYmxlIGZvciBwb2xsaW5nIGtlcHQgYWxpdmUgY29ubmVjdGlvbnMgY2FuIGhvbGQgYXQgYQorICAgICAgZ2l2ZW4gdGltZS4gRXh0cmEgY29ubmVjdGlvbnMgd2lsbCBiZSBjbG9zZWQgcmlnaHQgYXdheS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgODE5MiwgY29ycmVzcG9uZGluZyB0bworICAgICAgODE5MiBrZWVwYWxpdmUgY29ubmVjdGlvbnMuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPC9hdHRyaWJ1dGVzPgorICAgIAorICAgIDwvc3Vic2VjdGlvbj4KKwkKKyAgPC9zZWN0aW9uPgorCis8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvaW5kZXgueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvaW5kZXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMjBhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9pbmRleC54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImluZGV4Lmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9InlvYXZzQGFwYWNoZS5vcmciPllvYXYgU2hhcGlyYTwvYXV0aG9yPgorICAgIDx0aXRsZT5UYWJsZSBvZiBDb250ZW50czwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iUHJlZmFjZSI+CisKKzxwPlRoaXMgc2VjdGlvbiBvZiB0aGUgVG9tY2F0IGRvY3VtZW50YXRpb24gYXR0ZW1wdHMgdG8gZXhwbGFpbgordGhlIGFyY2hpdGVjdHVyZSBhbmQgZGVzaWduIG9mIHRoZSBUb21jYXQgc2VydmVyLiAgSXQgaW5jbHVkZXMgc2lnbmlmaWNhbnQKK2NvbnRyaWJ1dGlvbnMgZnJvbSBzZXZlcmFsIHRvbWNhdCBkZXZlbG9wZXJzOgorPC9wPgorPHVsPgorPGxpPllvYXYgU2hhcGlyYQorICAgICg8YSBocmVmPSJtYWlsdG86eW9hdnNAYXBhY2hlLm9yZyI+eW9hdnNAYXBhY2hlLm9yZzwvYT4pPC9saT4KKzxsaT5KZWFuZnJhbmNvaXMgQXJjYW5kCisgICAgKDxhIGhyZWY9Im1haWx0bzpqZmFyY2FuZEBhcGFjaGUub3JnIj5qZmFyY2FuZEBhcGFjaGUub3JnPC9hPik8L2xpPgorPGxpPkZpbGlwIEhhbmlrCisgICAgKDxhIGhyZWY9Im1haWx0bzpmaGFuaWtAYXBhY2hlLm9yZyI+ZmhhbmlrQGFwYWNoZS5vcmc8L2E+KTwvbGk+Cis8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iVGFibGUgb2YgQ29udGVudHMiPgorCis8cD5UaGUgaW5mb3JtYXRpb24gcHJlc2VudGVkIGlzIGRpdmlkZWQgaW50byB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOjwvcD4KKzx1bD4KKzxsaT48YSBocmVmPSJvdmVydmlldy5odG1sIj48c3Ryb25nPk92ZXJ2aWV3PC9zdHJvbmc+PC9hPiAtCisgICAgQW4gb3ZlcnZpZXcgb2YgdGhlIFRvbWNhdCBzZXJ2ZXIgYXJjaGl0ZWN0dXJlIHdpdGgga2V5IHRlcm1zCisgICAgYW5kIGNvbmNlcHRzLjwvbGk+Cis8bGk+PGEgaHJlZj0ic3RhcnR1cC5odG1sIj48c3Ryb25nPlNlcnZlciBTdGFydHVwPC9zdHJvbmc+PC9hPiAtCisgICAgQSBkZXRhaWxlZCBkZXNjcmlwdGlvbiwgd2l0aCBzZXF1ZW5jZSBkaWFncmFtcywgb2YgaG93IHRoZSBUb21jYXQKKyAgICBzZXJ2ZXIgc3RhcnRzIHVwLjwvbGk+Cis8bGk+PGEgaHJlZj0icmVxdWVzdFByb2Nlc3MuaHRtbCI+PHN0cm9uZz5SZXF1ZXN0IFByb2Nlc3MgRmxvdzwvc3Ryb25nPjwvYT4gLQorICAgIEEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgaG93IFRvbWNhdCBoYW5kbGVzIGEgcmVxdWVzdC48L2xpPgorPC91bD4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9vdmVydmlldy54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9vdmVydmlldy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliMTRiYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL292ZXJ2aWV3LnhtbApAQCAtMCwwICsxLDEyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9Im92ZXJ2aWV3Lmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9InlvYXZzQGFwYWNoZS5vcmciPllvYXYgU2hhcGlyYTwvYXV0aG9yPgorICAgIDx0aXRsZT5BcmNoaXRlY3R1cmUgT3ZlcnZpZXc8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KKzxwPgorVGhpcyBwYWdlIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIHRoZSBUb21jYXQgc2VydmVyIGFyY2hpdGVjdHVyZS4KKzwvcD4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVGVybXMiPgorCis8c3Vic2VjdGlvbiBuYW1lPSJTZXJ2ZXIiPgorPHA+CitJbiB0aGUgVG9tY2F0IHdvcmxkLCBhCis8YSBocmVmPSIuLi9jb25maWcvc2VydmVyLmh0bWwiPlNlcnZlcjwvYT4gcmVwcmVzZW50cyB0aGUgd2hvbGUgY29udGFpbmVyLgorVG9tY2F0IHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgCis8YSBocmVmPSIuLi9jYXRhbGluYS9kb2NzL2FwaS9vcmcvYXBhY2hlL2NhdGFsaW5hL1NlcnZlci5odG1sIj5TZXJ2ZXIgaW50ZXJmYWNlLjwvYT4sCithbmQgdGhpcyBpcyByYXJlbHkgY3VzdG9taXplZCBieSB1c2Vycy4KKzwvcD4KKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iU2VydmljZSI+Cis8cD4KK0EgPGEgaHJlZj0iLi4vY29uZmlnL3NlcnZpY2UuaHRtbCI+U2VydmljZTwvYT4gaXMgYW4gaW50ZXJtZWRpYXRlIGNvbXBvbmVudAord2hpY2ggbGl2ZXMgaW5zaWRlIGEgU2VydmVyIGFuZCB0aWVzIG9uZSBvciBtb3JlIENvbm5lY3RvcnMgdG8gZXhhY3RseSBvbmUKK0VuZ2luZS4gIFRoZSBTZXJ2aWNlIGVsZW1lbnQgaXMgcmFyZWx5IGN1c3RvbWl6ZWQgYnkgdXNlcnMsIGFzIHRoZSBkZWZhdWx0CitpbXBsZW1lbnRhdGlvbiBpcyBzaW1wbGUgYW5kIHN1ZmZpY2llbnQ6Cis8YSBocmVmPSIuLi9jYXRhbGluYS9kb2NzL2FwaS9vcmcvYXBhY2hlL2NhdGFsaW5hL1NlcnZpY2UuaHRtbCI+U2VydmljZSBpbnRlcmZhY2U8L2E+LgorPC9wPgorPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJFbmdpbmUiPgorPHA+CitBbgorPGEgaHJlZj0iLi4vY29uZmlnL2VuZ2luZS5odG1sIj5FbmdpbmU8L2E+IHJlcHJlc2VudHMgcmVxdWVzdCBwcm9jZXNzaW5nCitwaXBlbGluZSBmb3IgYSBzcGVjaWZpYyBTZXJ2aWNlLiAgQXMgYSBTZXJ2aWNlIG1heSBoYXZlIG11bHRpcGxlIENvbm5lY3RvcnMsCit0aGUgRW5naW5lIHJlY2VpdmVkIGFuZCBwcm9jZXNzZXMgYWxsIHJlcXVlc3RzIGZyb20gdGhlc2UgY29ubmVjdG9ycywgaGFuZGluZwordGhlIHJlc3BvbnNlIGJhY2sgdG8gdGhlIGFwcHJvcHJpYXRlIGNvbm5lY3RvciBmb3IgdHJhbnNtaXNzaW9uIHRvIHRoZSBjbGllbnQuCitUaGUgPGEgaHJlZj0iLi4vY2F0YWxpbmEvZG9jcy9hcGkvb3JnL2FwYWNoZS9jYXRhbGluYS9FbmdpbmUuaHRtbCI+RW5naW5lIGludGVyZmFjZTwvYT4KK21heSBiZSBpbXBsZW1lbnRlZCB0byBzdXBwbHkgY3VzdG9tIEVuZ2luZXMsIHRob3VnaCB0aGlzIGlzIHVuY29tbW9uLgorPC9wPgorPHA+CitOb3RlIHRoYXQgdGhlIEVuZ2luZSBtYXkgYmUgdXNlZCBmb3IgVG9tY2F0IHNlcnZlciBjbHVzdGVyaW5nIHZpYSB0aGUKK2p2bVJvdXRlIHBhcmFtZXRlci4gIFJlYWQgdGhlIENsdXN0ZXJpbmcgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKzwvcD4KKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iSG9zdCI+Cis8cD4KK0EgPGEgaHJlZj0iLi4vY29uZmlnL2hvc3QuaHRtbCI+SG9zdDwvYT4gaXMgYW4gYXNzb2NpYXRpb24gb2YgYSBuZXR3b3JrIG5hbWUsCitlLmcuIHd3dy55b3VyY29tcGFueS5jb20sIHRvIHRoZSBUb21jYXQgc2VydmVyLiAgQW4gRW5naW5lIG1heSBjb250YWluCittdWx0aXBsZSBob3N0cywgYW5kIHRoZSBIb3N0IGVsZW1lbnQgYWxzbyBzdXBwb3J0cyBuZXR3b3JrIGFsaWFzZXMgc3VjaCBhcworeW91cmNvbXBhbnkuY29tIGFuZCBhYmMueW91cmNvbXBhbnkuY29tLiAgVXNlcnMgcmFyZWx5IGNyZWF0ZSBjdXN0b20KKzxhIGhyZWY9Ii4uL2NhdGFsaW5hL2RvY3MvYXBpL29yZy9hcGFjaGUvY2F0YWxpbmEvSG9zdC5odG1sIj5Ib3N0czwvYT4KK2JlY2F1c2UgdGhlIAorPGEgaHJlZj0iLi4vY2F0YWxpbmEvZG9jcy9hcGkvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkSG9zdC5odG1sIj5TdGFuZGFyZEhvc3QKK2ltcGxlbWVudGF0aW9uPC9hPiBwcm92aWRlcyBzaWduaWZpY2FudCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkuCis8L3A+Cis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IkNvbm5lY3RvciI+Cis8cD4KK0EgQ29ubmVjdG9yIGhhbmRsZXMgY29tbXVuaWNhdGlvbnMgd2l0aCB0aGUgY2xpZW50LiAgVGhlcmUgYXJlIG11bHRpcGxlCitjb25uZWN0b3JzIGF2YWlsYWJsZSB3aXRoIFRvbWNhdCwgYWxsIG9mIHdoaWNoIGltcGxlbWVudCB0aGUgCis8YSBocmVmPSIuLi9jYXRhbGluYS9kb2NzL2FwaS9vcmcvYXBhY2hlL2NhdGFsaW5hL0Nvbm5lY3Rvci5odG1sIj5Db25uZWN0b3IKK2ludGVyZmFjZS48L2E+ICBUaGVzZSBpbmNsdWRlIHRoZQorPGEgaHJlZj0iLi4vY29uZmlnL2NveW90ZS5odG1sIj5Db3lvdGUgY29ubmVjdG9yPC9hPiB3aGljaCBpcyB1c2VkIGZvcgorbW9zdCBIVFRQIHRyYWZmaWMsIGVzcGVjaWFsbHkgd2hlbiBydW5uaW5nIFRvbWNhdCBhcyBhIHN0YW5kYWxvbmUgc2VydmVyLCAKK2FuZCB0aGUgPGEgaHJlZj0iLi4vY29uZmlnL2prMi5odG1sIj5KSzIgY29ubmVjdG9yPC9hPiB3aGljaCBpbXBsZW1lbnRzCit0aGUgQUpQIHByb2NvdG9sIHVzZWQgd2hlbiBjb25uZWN0aW5nIFRvbWNhdCB0byBhbiBBcGFjaGUgSFRUUEQgc2VydmVyLgorQ3JlYXRpbmcgYSBjdXN0b21pemVkIGNvbm5lY3RvciBpcyBhIHNpZ25pZmljYW50IGVmZm9ydC4KKzwvcD4KKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iQ29udGV4dCI+Cis8cD4KK0EKKzxhIGhyZWY9Ii4uL2NvbmZpZy9jb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+CityZXByZXNlbnRzIGEgd2ViIGFwcGxpY2F0aW9uLiAgQSBIb3N0IG1heSBjb250YWluIG11bHRpcGxlCitjb250ZXh0cywgZWFjaCB3aXRoIGEgdW5pcXVlIHBhdGguICBUaGUKKzxhIGhyZWY9Ii4uL2NhdGFsaW5hL2RvY3MvYXBpL29yZy9hcGFjaGUvY2F0YWxpbmEvQ29udGV4dC5odG1sIj5Db250ZXh0CitpbnRlcmZhY2U8L2E+IG1heSBiZSBpbXBsZW1lbnRlZCB0byBjcmVhdGUgY3VzdG9tIENvbnRleHRzLCBidXQKK3RoaXMgaXMgcmFyZWx5IHRoZSBjYXNlIGJlY2F1c2UgdGhlCis8YSBocmVmPSIuLi9jYXRhbGluYS9kb2NzL2FwaS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRDb250ZXh0Lmh0bWwiPgorU3RhbmRhcmRDb250ZXh0PC9hPiBwcm92aWRlcyBzaWduaWZpY2FudCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkuCis8L3A+Cis8L3N1YnNlY3Rpb24+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkNvbW1lbnRzIj4KKzxwPgorVG9tY2F0IGlzIGRlc2lnbmVkIHRvIGJlIGEgZmFzdCBhbmQgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZQorU2VydmxldCBTcGVjaWZpY2F0aW9uLiAgVG9tY2F0IGNhbWUgYWJvdXQgYXMgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbgorb2YgdGhpcyBzcGVjaWZpY2F0aW9uLCBhbmQgaGFzIHJlbWFpbmVkIHJpZ29yb3VzIGluIGFkaGVyaW5nIHRvIHRoZQorc3BlY2lmaWNhdGlvbi4gIEF0IHRoZSBzYW1lIHRpbWUsIHNpZ25pZmljYW50IGF0dGVudGlvbiBoYXMgYmVlbiBwYWlkCit0byBUb21jYXQncyBwZXJmb3JtYW5jZSBhbmQgaXQgaXMgbm93IG9uIHBhciB3aXRoIG90aGVyIHNlcnZsZXQgY29udGFpbmVycywKK2luY2x1ZGluZyBjb21tZXJjaWFsIG9uZXMuCis8L3A+Cis8cD4KK0luIHJlY2VudCByZWxlYXNlcyBvZiBUb21jYXQsIG1vc3RseSBzdGFydGluZyB3aXRoIFRvbWNhdCA1LAord2UgaGF2ZSBiZWd1biBlZmZvdHMgdG8gbWFrZSBtb3JlIGFzcGVjdHMgb2YgVG9tY2F0IG1hbmFnYWJsZSB2aWEKK0pNWC4gIEluIGFkZGl0aW9uLCB0aGUgTWFuYWdlciBhbmQgQWRtaW4gd2ViYXBwcyBoYXZlIGJlZW4gZ3JlYXRseQorZW5oYW5jZWQgYW5kIGltcHJvdmVkLiAgTWFuYWdhYmlsaXR5IGlzIGEgcHJpbWFyeSBhcmVhIG9mIGNvbmNlcm4KK2ZvciB1cyBhcyB0aGUgcHJvZHVjdCBtYXR1cmVzIGFuZCB0aGUgc3BlY2lmaWNhdGlvbiBiZWNvbWVzIG1vcmUKK3N0YWJsZS4KKzwvcD4KKzwvc2VjdGlvbj4KKworPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL3Byb2plY3QueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvcHJvamVjdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkMjViMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL3Byb2plY3QueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzxwcm9qZWN0IG5hbWU9IlRvbWNhdCBBcmNoaXRlY3R1cmUiCisgICAgICAgIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0LyI+CisKKyAgICA8dGl0bGU+VG9tY2F0IEFyY2hpdGVjdHVyZTwvdGl0bGU+CisKKyAgICA8bG9nbyBocmVmPSIvaW1hZ2VzL3RvbWNhdC5naWYiPgorICAgICAgVGhlIFRvbWNhdCBTZXJ2bGV0L0pTUCBDb250YWluZXIKKyAgICA8L2xvZ28+CisKKyAgICAKKyAgICA8Ym9keT4KKworICAgIDxtZW51IG5hbWU9IkxpbmtzIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iRG9jcyBIb21lIiAgICAgICAgICAgICBocmVmPSIuLi9pbmRleC5odG1sIiAvPgorICAgIDwvbWVudT4KKworICAgIDxtZW51IG5hbWU9IkNvbnRlbnRzIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iQ29udGVudHMiICAgICAgICAgICAgICBocmVmPSJpbmRleC5odG1sIiAvPgorICAgICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgICAgICAgIGhyZWY9Im92ZXJ2aWV3Lmh0bWwiIC8+CisgICAgICAgIDxpdGVtIG5hbWU9IlNlcnZlciBTdGFydHVwIiAgICAgICAgaHJlZj0ic3RhcnR1cC5odG1sIiAvPgorICAgICAgICA8aXRlbSBuYW1lPSJSZXF1ZXN0IFByb2Nlc3MiICAgICAgIGhyZWY9InJlcXVlc3RQcm9jZXNzLmh0bWwiIC8+CisgICAgPC9tZW51PgorCisgICAgPC9ib2R5PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvcmVxdWVzdFByb2Nlc3MueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvcmVxdWVzdFByb2Nlc3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzU5YmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9yZXF1ZXN0UHJvY2Vzcy54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9InJlcXVlc3RQcm9jZXNzLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9InlvYXZzQGFwYWNoZS5vcmciPllvYXYgU2hhcGlyYTwvYXV0aG9yPgorICAgIDx0aXRsZT5SZXF1ZXN0IFByb2Nlc3MgRmxvdzwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iUmVxdWVzdCBQcm9jZXNzIEZsb3ciPgorCis8cD4KK1RoaXMgcGFnZSBkZXNjcmliZXMgdGhlIHByb2Nlc3MgdXNlZCBieSBUb21jYXQgdG8gaGFuZGxlCithbiBpbmNvbWluZyByZXF1ZXN0LiAgVGhpcyBwcm9jZXNzIGlzIGxhcmdlbHkgZGVmaW5lZCBieQordGhlIFNlcnZsZXQgU3BlY2lmaWNhdGlvbiwgd2hpY2ggb3V0bGluZXMgdGhlIG9yZGVyCitvZiBldmVudHMgdGhhdCBtdXN0IHRha2UgcGxhY2UuCis8L3A+CisKKzxzdWJzZWN0aW9uIG5hbWU9ImRlc2NyaXB0aW9uIj4KKzxwPgorVE9ETworPC9wPgorPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJkaWFncmFtIj4KKzxwPgorQSBVTUwgc2VxdWVuY2UgZGlhZ3JhbSBvZiB0aGUgcmVxdWVzdCBwcm9jZXNzIGlzIGF2YWlsYWJsZQorPGEgaHJlZj0icmVxdWVzdFByb2Nlc3MvcmVxdWVzdFByb2Nlc3MucGRmIj5oZXJlLjwvYT4KKzwvcD4KKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iY29tbWVudHMiPgorPHA+CitUaGUgU2VydmxldCBTcGVjaWZpY2F0aW9uIHByb3ZpZGVzIG1hbnkgb3Bwb3J0dW5pdGllcyBmb3IKK2xpc3RlbmluZyBpbiAodXNpbmcgTGlzdGVuZXJzKSBvciBtb2RpeWluZyAodXNpbmcgRmlsdGVycykKK3RoZSByZXF1ZXN0IGhhbmRsaW5nIHByb2Nlc3MgZXZlbiBiZWZvcmUgdGhlIHJlcXVlc3QgYXJyaXZlcworYXQgdGhlIHNlcnZsZXQgdGhhdCB3aWxsIGhhbmRsZSBpdC4KKzwvcD4KKworPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL3JlcXVlc3RQcm9jZXNzL3JlcXVlc3RQcm9jZXNzLnBkZiBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL3JlcXVlc3RQcm9jZXNzL3JlcXVlc3RQcm9jZXNzLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTE3MWRlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvcmVxdWVzdFByb2Nlc3MvcmVxdWVzdFByb2Nlc3MucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL3JlcXVlc3RQcm9jZXNzL3Jvc2VNb2RlbC5tZGwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9yZXF1ZXN0UHJvY2Vzcy9yb3NlTW9kZWwubWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OWMyZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9yZXF1ZXN0UHJvY2Vzcy9yb3NlTW9kZWwubWRsCkBAIC0wLDAgKzEsMTI5MjEgQEAKKworKG9iamVjdCBQZXRhbAorICAgIHZlcnNpb24gICAgCTQ1CisgICAgX3dyaXR0ZW4gICAJIlJvc2UgNy42LjAxMDkuMjMxNCIKKyAgICBjaGFyU2V0ICAgIAkwKQorCisob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3IgorICAgIGlzX3VuaXQgICAgCVRSVUUKKyAgICBpc19sb2FkZWQgIAlUUlVFCisgICAgcXVpZCAgICAgICAJIjNERkRGNkNFMDMzNyIKKyAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzCisJcmlnaHRNYXJnaW4gCTAuMjUwMDAwCisJbGVmdE1hcmdpbiAJMC4yNTAwMDAKKwl0b3BNYXJnaW4gIAkwLjI1MDAwMAorCWJvdHRvbU1hcmdpbiAJMC41MDAwMDAKKwlwYWdlT3ZlcmxhcCAJMC4yNTAwMDAKKwljbGlwSWNvbkxhYmVscyAJVFJVRQorCWF1dG9SZXNpemUgCVRSVUUKKwlzbmFwVG9HcmlkIAlUUlVFCisJZ3JpZFggICAgICAJMTYKKwlncmlkWSAgICAgIAkxNgorCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQKKwkgICAgc2l6ZSAgICAgICAJMTAKKwkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCSAgICBib2xkICAgICAgIAlGQUxTRQorCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCSAgICBjb2xvciAgICAgIAkwCisJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJc2hvd01lc3NhZ2VOdW0gCTEKKwlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQorCW5vdGF0aW9uICAgCSJVbmlmaWVkIikKKyAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyIKKwlxdWlkICAgICAgIAkiM0RGREY2Q0UwMzY5IgorCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJZ2xvYmFsICAgICAJVFJVRQorCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQorCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAorCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIgorCQlxdWlkICAgICAgIAkiM0RGREY2RDIwMUZFIgorCQl0aXRsZSAgICAgIAkiTWFpbiIKKwkJem9vbSAgICAgICAJMTAwCisJCW1heF9oZWlnaHQgCTI4MzUwCisJCW1heF93aWR0aCAgCTIxNjAwCisJCW9yaWdpbl94ICAgCTAKKwkJb3JpZ2luX3kgICAJMAorCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKKyAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciCisJcXVpZCAgICAgICAJIjNERkRGNkNFMDMzOCIKKwlleHBvcnRDb250cm9sIAkiUHVibGljIgorCWdsb2JhbCAgICAgCVRSVUUKKwlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciCisJcXVpZHUgICAgICAJIjNERkRGNkNFMDM2QSIKKwlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAorCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJvcmcuYXBhY2hlLmNhdGFsaW5hIgorCQlxdWlkICAgICAgIAkiM0U0MkRFOEQwMDgyIgorCQl2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QKKwkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCXF1aWQgICAgICAgCSIzRTQyREVGNjAxRUIiCisJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLnRvbWNhdC51dGlsIgorCQkJcXVpZHUgICAgICAJIjNFNDJERURGMDFGMiIpCisJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQlxdWlkICAgICAgIAkiM0U0MkRGNzAwMDYwIgorCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jb3lvdGUiCisJCQlxdWlkdSAgICAgIAkiM0U0MkRFOUYwMTMyIikKKwkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCXF1aWQgICAgICAgCSIzRTQzRDE2NTAzOUMiCisJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLm5hbWluZyIKKwkJCXF1aWR1ICAgICAgCSIzRTQzRDE1ODAzMzkiKSkKKwkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKKwkJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImFudCIKKwkJCXF1aWQgICAgICAgCSIzRTQyREZCQjAzN0YiCisJCQl2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNDRkY3MDIwRiIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjp1dGlsIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAyNjAxODQiKSkKKwkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKKwkJCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkpCisJCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJhdXRoZW50aWNhdG9yIgorCQkJcXVpZCAgICAgICAJIjNFNDJERkM3MDJCNCIKKwkJCXZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdAorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0QwM0MwMzk1IgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmRlcGxveSIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRGREMwMzQwIikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEMDNGMDFDMiIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjp1dGlsIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAyNjAxODQiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0QwNDMwMjRBIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnZhbHZlcyIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMkQwMzVCIikpCisJCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKQorCQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiY29ubmVjdG9yIgorCQkJcXVpZCAgICAgICAJIjNFNDJERkNGMDM2QSIKKwkJCXZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdAorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0QwN0UwMTdEIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnNlc3Npb24iCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDBDMDI2RCIpKQorCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwkJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQorCQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KSkKKwkJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImNvcmUiCisJCQlxdWlkICAgICAgIAkiM0U0MkRGRDYwM0JBIgorCQkJdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0CisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDE5RTAxQTkiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6ZGVwbG95IgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZEQzAzNDAiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0QxQTEwMTg1IgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnV0aWwiCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDI2MDE4NCIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDFDRTAwN0MiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6Y29ubmVjdG9yIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZDRjAzNkEiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0QxRDgwMEQwIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnNlY3VyaXR5IgorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAwMTAwRDciKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0QyNUMwMzFGIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6Om1iZWFuIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZGMTAxODgiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0QyNjAwMjhFIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnN0YXJ0dXAiCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDFFMDBFQyIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDI2QTAxNUMiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6c2Vzc2lvbiIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMEMwMjZEIikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEMjgzMDI3MSIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjp2YWx2ZXMiCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDJEMDM1QiIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDJDODAyNDgiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6bmV0IgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZGNzAyMjciKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0QyRDYwMDJCIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmxvYWRlciIKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0QyRDAwMkQ2IikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEM0QzMDBGNyIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLm5hbWluZyIKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0QxNTgwMzM5IikpCisJCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKQorCQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiZGVwbG95IgorCQkJcXVpZCAgICAgICAJIjNFNDJERkRDMDM0MCIKKwkJCXZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdAorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0QzMjAwMUI4IgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnV0aWwiCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDI2MDE4NCIpKQorCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwkJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQorCQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KSkKKwkJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImxhdW5jaGVyIgorCQkJcXVpZCAgICAgICAJIjNFNDJERkUyMDMzRiIKKwkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKKwkJCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkpCisJCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJsb2dnZXIiCisJCQlxdWlkICAgICAgIAkiM0U0MkRGRUMwMjg1IgorCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwkJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQorCQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KSkKKwkJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIm1iZWFuIgorCQkJcXVpZCAgICAgICAJIjNFNDJERkYxMDE4OCIKKwkJCXZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdAorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q0OTEwMUE1IgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmRlcGxveSIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRGREMwMzQwIikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNENEM2MDI3RCIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpjb3JlIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZENjAzQkEiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q0RkIwMDhGIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnNlc3Npb24iCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDBDMDI2RCIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDUwMDAwQkUiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6dmFsdmVzIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAyRDAzNUIiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q1MDgwMjc4IgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnJlYWxtIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZGQTAwQUUiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q1NUEwMjU4IgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmxvZ2dlciIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRGRUMwMjg1IikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNENTYwMDBEMCIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjphdXRoZW50aWNhdG9yIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZDNzAyQjQiKSkKKwkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKKwkJCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkpCisJCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJuZXQiCisJCQlxdWlkICAgICAgIAkiM0U0MkRGRjcwMjI3IgorCQkJdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0CisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDYzOTAzNzEiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6dXRpbCIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMjYwMTg0IikpCisJCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKQorCQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAicmVhbG0iCisJCQlxdWlkICAgICAgIAkiM0U0MkRGRkEwMEFFIgorCQkJdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0CisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDY5RjAxMzMiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6Y29yZSIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRGRDYwM0JBIikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNENkExMDM1MyIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjp1dGlsIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAyNjAxODQiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q3MEUwMEUyIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUubmFtaW5nIgorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDE1ODAzMzkiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q3MjMwMkQ3IgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmRlcGxveSIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRGREMwMzQwIikpCisJCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKQorCQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAic2VjdXJpdHkiCisJCQlxdWlkICAgICAgIAkiM0U0MkUwMDEwMEQ3IgorCQkJdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0CisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDc0RDAwN0YiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6c3RhcnR1cCIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMUUwMEVDIikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNENzZCMDM3MSIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjp1dGlsIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAyNjAxODQiKSkKKwkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKKwkJCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkpCisJCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJzZXJ2bGV0cyIKKwkJCXF1aWQgICAgICAgCSIzRTQyRTAwNTAyREIiCisJCQl2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEODI3MDJFNSIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLnRvbWNhdC51dGlsIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREVERjAxRjIiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q4MkEwMkNDIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnV0aWwiCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDI2MDE4NCIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDgyRDAyNDQiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5uYW1pbmciCisJCQkJcXVpZHUgICAgICAJIjNFNDNEMTU4MDMzOSIpKQorCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwkJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQorCQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KSkKKwkJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInNlc3Npb24iCisJCQlxdWlkICAgICAgIAkiM0U0MkUwMEMwMjZEIgorCQkJdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0CisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDg3NzAzNDQiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6dXRpbCIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMjYwMTg0IikpCisJCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKQorCQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAic3NpIgorCQkJcXVpZCAgICAgICAJIjNFNDJFMDEwMDJDMyIKKwkJCXZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdAorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q4RjkwMkI1IgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnV0aWwiCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDI2MDE4NCIpKQorCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwkJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQorCQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KSkKKwkJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInN0YXJ0dXAiCisJCQlxdWlkICAgICAgIAkiM0U0MkUwMUUwMEVDIgorCQkJdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0CisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDkxNTAyNTEiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6bG9nZ2VyIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZFQzAyODUiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q5MTkwMThGIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnNlY3VyaXR5IgorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAwMTAwRDciKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q5NDYwMDBEIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmNvcmUiCisJCQkJcXVpZHUgICAgICAJIjNFNDJERkQ2MDNCQSIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDk1RTAxMkEiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6bG9hZGVyIgorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDJEMDAyRDYiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q5OTYwMzE1IgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnV0aWwiCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDI2MDE4NCIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDk5OTAyQkYiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6dmFsdmVzIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAyRDAzNUIiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q5OUMwMTQ3IgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmRlcGxveSIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRGREMwMzQwIikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEOURBMDExNCIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpuZXQiCisJCQkJcXVpZHUgICAgICAJIjNFNDJERkY3MDIyNyIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDlGNDAyRjIiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6cmVhbG0iCisJCQkJcXVpZHUgICAgICAJIjNFNDJERkZBMDBBRSIpKQorCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwkJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQorCQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KSkKKwkJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInVzZXIiCisJCQlxdWlkICAgICAgIAkiM0U0MkUwMjIwMTc0IgorCQkJdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0CisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzREIyNDAyMjciCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6dXRpbCIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMjYwMTg0IikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEQjMxMDA5RiIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLm5hbWluZyIKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0QxNTgwMzM5IikpCisJCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKQorCQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAidXRpbCIKKwkJCXF1aWQgICAgICAgCSIzRTQyRTAyNjAxODQiCisJCQl2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEQjg1MDE3QyIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpjb3JlIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZENjAzQkEiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0RCODgwMTZDIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUubmFtaW5nIgorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDE1ODAzMzkiKSkKKwkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKKwkJCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkpCisJCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ2YWx2ZXMiCisJCQlxdWlkICAgICAgIAkiM0U0MkUwMkQwMzVCIgorCQkJdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0CisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzREMyQjAyNTciCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6dXRpbCIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMjYwMTg0IikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNERDNFMDI3MSIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpkZXBsb3kiCisJCQkJcXVpZHUgICAgICAJIjNFNDJERkRDMDM0MCIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzREQ0MTAyQ0YiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6Y29ubmVjdG9yIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZDRjAzNkEiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0REREUwMEI4IgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmNvcmUiCisJCQkJcXVpZHUgICAgICAJIjNFNDJERkQ2MDNCQSIpKQorCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwkJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQorCQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KSkKKwkJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImxvYWRlciIKKwkJCXF1aWQgICAgICAgCSIzRTQzRDJEMDAyRDYiCisJCQl2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEM0NGMDBGMiIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLm5hbWluZyIKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0QxNTgwMzM5IikpCisJCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKSkKKwkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0CisJCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiIKKwkJCXF1aWQgICAgICAgCSIzRTQyREZCNjAxMEIiCisJCQl0aXRsZSAgICAgIAkiTWFpbiIKKwkJCXpvb20gICAgICAgCTEwMAorCQkJbWF4X2hlaWdodCAJMjgzNTAKKwkJCW1heF93aWR0aCAgCTIxNjAwCisJCQlvcmlnaW5feCAgIAkwCisJCQlvcmlnaW5feSAgIAkwCisJCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAorCQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmFudCIgQDEKKwkJCQlsb2NhdGlvbiAgIAkoMjIwOCwgMTUwNCkKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUAxCisJCQkJICAgIGxvY2F0aW9uICAgCSgyMDY0LCAxNDIwKQorCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCSAgICBubGluZXMgICAgIAkyCisJCQkJICAgIG1heF93aWR0aCAgCTI4OAorCQkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkJICAgIGxhYmVsICAgICAgCSJhbnQiKQorCQkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZCQjAzN0YiCisJCQkJd2lkdGggICAgICAJMzAwCisJCQkJaGVpZ2h0ICAgICAJMTgwKQorCQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmF1dGhlbnRpY2F0b3IiIEAyCisJCQkJbG9jYXRpb24gICAJKDE5MiwgMjAwMCkKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUAyCisJCQkJICAgIGxvY2F0aW9uICAgCSg0OCwgMTkxNikKKwkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQkgICAgbmxpbmVzICAgICAJMgorCQkJCSAgICBtYXhfd2lkdGggIAkyODgKKwkJCQkgICAganVzdGlmeSAgICAJMAorCQkJCSAgICBsYWJlbCAgICAgIAkiYXV0aGVudGljYXRvciIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJERkM3MDJCNCIKKwkJCQl3aWR0aCAgICAgIAkzMDAKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6Y29ubmVjdG9yIiBAMworCQkJCWxvY2F0aW9uICAgCSg0NjQsIDEzMjgpCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCQkgICAgY29sb3IgICAgICAJMAorCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkJICAgIFBhcmVudF9WaWV3IAlAMworCQkJCSAgICBsb2NhdGlvbiAgIAkoMzIwLCAxMjQ0KQorCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCSAgICBubGluZXMgICAgIAkyCisJCQkJICAgIG1heF93aWR0aCAgCTI4OAorCQkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkJICAgIGxhYmVsICAgICAgCSJjb25uZWN0b3IiKQorCQkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZDRjAzNkEiCisJCQkJd2lkdGggICAgICAJMzAwCisJCQkJaGVpZ2h0ICAgICAJMTgwKQorCQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmNvcmUiIEA0CisJCQkJbG9jYXRpb24gICAJKDIyMjQsIDgwMCkKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUA0CisJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCA3MTYpCisJCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCQkgICAgbWF4X3dpZHRoICAJMjg4CisJCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCQkgICAgbGFiZWwgICAgICAJImNvcmUiKQorCQkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZENjAzQkEiCisJCQkJd2lkdGggICAgICAJMzAwCisJCQkJaGVpZ2h0ICAgICAJMTgwKQorCQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmRlcGxveSIgQDUKKwkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxNjApCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCQkgICAgY29sb3IgICAgICAJMAorCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkJICAgIFBhcmVudF9WaWV3IAlANQorCQkJCSAgICBsb2NhdGlvbiAgIAkoOTYsIDc2KQorCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCSAgICBubGluZXMgICAgIAkyCisJCQkJICAgIG1heF93aWR0aCAgCTI4OAorCQkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkJICAgIGxhYmVsICAgICAgCSJkZXBsb3kiKQorCQkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZEQzAzNDAiCisJCQkJd2lkdGggICAgICAJMzAwCisJCQkJaGVpZ2h0ICAgICAJMTgwKQorCQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmxhdW5jaGVyIiBANgorCQkJCWxvY2F0aW9uICAgCSgxNzc2LCAyNDgwKQorCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCSAgICBzaXplICAgICAgIAkxMAorCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJCSAgICBQYXJlbnRfVmlldyAJQDYKKwkJCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDIzOTYpCisJCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCQkgICAgbWF4X3dpZHRoICAJMjg4CisJCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCQkgICAgbGFiZWwgICAgICAJImxhdW5jaGVyIikKKwkJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRGRTIwMzNGIgorCQkJCXdpZHRoICAgICAgCTMwMAorCQkJCWhlaWdodCAgICAgCTE4MCkKKwkJCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpsb2dnZXIiIEA3CisJCQkJbG9jYXRpb24gICAJKDc1MiwgMTI4KQorCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCSAgICBzaXplICAgICAgIAkxMAorCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJCSAgICBQYXJlbnRfVmlldyAJQDcKKwkJCQkgICAgbG9jYXRpb24gICAJKDYwOCwgNDQpCisJCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCQkgICAgbWF4X3dpZHRoICAJMjg4CisJCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCQkgICAgbGFiZWwgICAgICAJImxvZ2dlciIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJERkVDMDI4NSIKKwkJCQl3aWR0aCAgICAgIAkzMDAKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6bWJlYW4iIEA4CisJCQkJbG9jYXRpb24gICAJKDIyMDgsIDEyMTYpCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCQkgICAgY29sb3IgICAgICAJMAorCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkJICAgIFBhcmVudF9WaWV3IAlAOAorCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA2NCwgMTEzMikKKwkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQkgICAgbmxpbmVzICAgICAJMgorCQkJCSAgICBtYXhfd2lkdGggIAkyODgKKwkJCQkgICAganVzdGlmeSAgICAJMAorCQkJCSAgICBsYWJlbCAgICAgIAkibWJlYW4iKQorCQkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZGMTAxODgiCisJCQkJd2lkdGggICAgICAJMzAwCisJCQkJaGVpZ2h0ICAgICAJMTgwKQorCQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6Om5ldCIgQDkKKwkJCQlsb2NhdGlvbiAgIAkoMTA1NiwgMjQ5NikKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUA5CisJCQkJICAgIGxvY2F0aW9uICAgCSg5MTIsIDI0MTIpCisJCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCQkgICAgbWF4X3dpZHRoICAJMjg4CisJCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCQkgICAgbGFiZWwgICAgICAJIm5ldCIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJERkY3MDIyNyIKKwkJCQl3aWR0aCAgICAgIAkzMDAKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6cmVhbG0iIEAxMAorCQkJCWxvY2F0aW9uICAgCSgxMjQ4LCAxMTIpCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCQkgICAgY29sb3IgICAgICAJMAorCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAKKwkJCQkgICAgbG9jYXRpb24gICAJKDExMDQsIDI4KQorCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCSAgICBubGluZXMgICAgIAkyCisJCQkJICAgIG1heF93aWR0aCAgCTI4OAorCQkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkJICAgIGxhYmVsICAgICAgCSJyZWFsbSIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJERkZBMDBBRSIKKwkJCQl3aWR0aCAgICAgIAkzMDAKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6c2VjdXJpdHkiIEAxMQorCQkJCWxvY2F0aW9uICAgCSgzMDQsIDI0OTYpCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCQkgICAgY29sb3IgICAgICAJMAorCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEKKwkJCQkgICAgbG9jYXRpb24gICAJKDE2MCwgMjQxMikKKwkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQkgICAgbmxpbmVzICAgICAJMgorCQkJCSAgICBtYXhfd2lkdGggIAkyODgKKwkJCQkgICAganVzdGlmeSAgICAJMAorCQkJCSAgICBsYWJlbCAgICAgIAkic2VjdXJpdHkiKQorCQkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAwMTAwRDciCisJCQkJd2lkdGggICAgICAJMzAwCisJCQkJaGVpZ2h0ICAgICAJMTgwKQorCQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnNlcnZsZXRzIiBAMTIKKwkJCQlsb2NhdGlvbiAgIAkoMjA5NiwgMTg4OCkKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMgorCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1MiwgMTgwNCkKKwkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQkgICAgbmxpbmVzICAgICAJMgorCQkJCSAgICBtYXhfd2lkdGggIAkyODgKKwkJCQkgICAganVzdGlmeSAgICAJMAorCQkJCSAgICBsYWJlbCAgICAgIAkic2VydmxldHMiKQorCQkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAwNTAyREIiCisJCQkJd2lkdGggICAgICAJMzAwCisJCQkJaGVpZ2h0ICAgICAJMTgwKQorCQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnNlc3Npb24iIEAxMworCQkJCWxvY2F0aW9uICAgCSg0MzIsIDE2OTYpCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCQkgICAgY29sb3IgICAgICAJMAorCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMKKwkJCQkgICAgbG9jYXRpb24gICAJKDI4OCwgMTYxMikKKwkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQkgICAgbmxpbmVzICAgICAJMgorCQkJCSAgICBtYXhfd2lkdGggIAkyODgKKwkJCQkgICAganVzdGlmeSAgICAJMAorCQkJCSAgICBsYWJlbCAgICAgIAkic2Vzc2lvbiIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDBDMDI2RCIKKwkJCQl3aWR0aCAgICAgIAkzMDAKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6c3NpIiBAMTQKKwkJCQlsb2NhdGlvbiAgIAkoNjcyLCAyNDgwKQorCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCSAgICBzaXplICAgICAgIAkxMAorCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0CisJCQkJICAgIGxvY2F0aW9uICAgCSg1MjgsIDIzOTMpCisJCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCQkgICAgbWF4X3dpZHRoICAJMjg4CisJCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCQkgICAgbGFiZWwgICAgICAJInNzaSIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDEwMDJDMyIKKwkJCQl3aWR0aCAgICAgIAkzMDEKKwkJCQloZWlnaHQgICAgIAkxODcpCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6c3RhcnR1cCIgQDE1CisJCQkJbG9jYXRpb24gICAJKDEwODgsIDgzMikKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNQorCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCA3NDgpCisJCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCQkgICAgbWF4X3dpZHRoICAJMjg4CisJCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCQkgICAgbGFiZWwgICAgICAJInN0YXJ0dXAiKQorCQkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAxRTAwRUMiCisJCQkJd2lkdGggICAgICAJMzAwCisJCQkJaGVpZ2h0ICAgICAJMTgwKQorCQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnVzZXIiIEAxNgorCQkJCWxvY2F0aW9uICAgCSgxNDI0LCAyNDk2KQorCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCSAgICBzaXplICAgICAgIAkxMAorCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2CisJCQkJICAgIGxvY2F0aW9uICAgCSgxMjgwLCAyNDEyKQorCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCSAgICBubGluZXMgICAgIAkyCisJCQkJICAgIG1heF93aWR0aCAgCTI4OAorCQkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkJICAgIGxhYmVsICAgICAgCSJ1c2VyIikKKwkJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMjIwMTc0IgorCQkJCXdpZHRoICAgICAgCTMwMAorCQkJCWhlaWdodCAgICAgCTE4MCkKKwkJCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjp1dGlsIiBAMTcKKwkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMTg3MikKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNworCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2OCwgMTc4OCkKKwkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQkgICAgbmxpbmVzICAgICAJMgorCQkJCSAgICBtYXhfd2lkdGggIAkyODgKKwkJCQkgICAganVzdGlmeSAgICAJMAorCQkJCSAgICBsYWJlbCAgICAgIAkidXRpbCIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDI2MDE4NCIKKwkJCQl3aWR0aCAgICAgIAkzMDAKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6dmFsdmVzIiBAMTgKKwkJCQlsb2NhdGlvbiAgIAkoMzA0LCA3MDQpCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCQkgICAgY29sb3IgICAgICAJMAorCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkJICAgIFBhcmVudF9WaWV3IAlAMTgKKwkJCQkgICAgbG9jYXRpb24gICAJKDE2MCwgNjIwKQorCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCSAgICBubGluZXMgICAgIAkyCisJCQkJICAgIG1heF93aWR0aCAgCTI4OAorCQkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkJICAgIGxhYmVsICAgICAgCSJ2YWx2ZXMiKQorCQkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAyRDAzNUIiCisJCQkJd2lkdGggICAgICAJMzAwCisJCQkJaGVpZ2h0ICAgICAJMTgwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAMTkKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzQ0ZGNzAyMEYiCisJCQkJY2xpZW50ICAgICAJQDEKKwkJCQlzdXBwbGllciAgIAlAMTcKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAMjAKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDA3RTAxN0QiCisJCQkJY2xpZW50ICAgICAJQDMKKwkJCQlzdXBwbGllciAgIAlAMTMKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmxvYWRlciIgQDIxCisJCQkJbG9jYXRpb24gICAJKDIyNDAsIDQxNikKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMQorCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA5NiwgMzMyKQorCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCSAgICBubGluZXMgICAgIAkyCisJCQkJICAgIG1heF93aWR0aCAgCTI4OAorCQkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkJICAgIGxhYmVsICAgICAgCSJsb2FkZXIiKQorCQkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDJEMDAyRDYiCisJCQkJd2lkdGggICAgICAJMzAwCisJCQkJaGVpZ2h0ICAgICAJMTgwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAMjIKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDMyMDAxQjgiCisJCQkJY2xpZW50ICAgICAJQDUKKwkJCQlzdXBwbGllciAgIAlAMTcKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUubmFtaW5nIiBAMjMKKwkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgOTYpCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCQkgICAgY29sb3IgICAgICAJMAorCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkJICAgIFBhcmVudF9WaWV3IAlAMjMKKwkJCQkgICAgbG9jYXRpb24gICAJKDE2OTksIDEyKQorCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCSAgICBubGluZXMgICAgIAkyCisJCQkJICAgIG1heF93aWR0aCAgCTM0NgorCQkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkJICAgIGxhYmVsICAgICAgCSJvcmcuYXBhY2hlLm5hbWluZyIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEMTU4MDMzOSIKKwkJCQl3aWR0aCAgICAgIAkzNTgKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAyNAorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEM0NGMDBGMiIKKwkJCQljbGllbnQgICAgIAlAMjEKKwkJCQlzdXBwbGllciAgIAlAMjMKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAMjUKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDYzOTAzNzEiCisJCQkJY2xpZW50ICAgICAJQDkKKwkJCQlzdXBwbGllciAgIAlAMTcKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAMjYKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDY5RjAxMzMiCisJCQkJY2xpZW50ICAgICAJQDEwCisJCQkJc3VwcGxpZXIgICAJQDQKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAMjcKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDZBMTAzNTMiCisJCQkJY2xpZW50ICAgICAJQDEwCisJCQkJc3VwcGxpZXIgICAJQDE3CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDI4CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q3MEUwMEUyIgorCQkJCWNsaWVudCAgICAgCUAxMAorCQkJCXN1cHBsaWVyICAgCUAyMworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAyOQorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNENzIzMDJENyIKKwkJCQljbGllbnQgICAgIAlAMTAKKwkJCQlzdXBwbGllciAgIAlANQorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAzMAorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNENjlGMDEzMyIKKwkJCQljbGllbnQgICAgIAlAMTAKKwkJCQlzdXBwbGllciAgIAlANAorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAzMQorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNENzREMDA3RiIKKwkJCQljbGllbnQgICAgIAlAMTEKKwkJCQlzdXBwbGllciAgIAlAMTUKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAMzIKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDc2QjAzNzEiCisJCQkJY2xpZW50ICAgICAJQDExCisJCQkJc3VwcGxpZXIgICAJQDE3CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLnRvbWNhdC51dGlsIiBAMzMKKwkJCQlsb2NhdGlvbiAgIAkoMjA5NiwgMjIyNCkKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMworCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkyMywgMjE0MCkKKwkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQkgICAgbmxpbmVzICAgICAJMgorCQkJCSAgICBtYXhfd2lkdGggIAkzNDYKKwkJCQkgICAganVzdGlmeSAgICAJMAorCQkJCSAgICBsYWJlbCAgICAgIAkib3JnLmFwYWNoZS50b21jYXQudXRpbCIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJERURGMDFGMiIKKwkJCQl3aWR0aCAgICAgIAkzNTgKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAzNAorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEODc3MDM0NCIKKwkJCQljbGllbnQgICAgIAlAMTMKKwkJCQlzdXBwbGllciAgIAlAMTcKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAMzUKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDhGOTAyQjUiCisJCQkJY2xpZW50ICAgICAJQDE0CisJCQkJc3VwcGxpZXIgICAJQDE3CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDM2CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0RCMjQwMjI3IgorCQkJCWNsaWVudCAgICAgCUAxNgorCQkJCXN1cHBsaWVyICAgCUAxNworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAzNworCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEQjMxMDA5RiIKKwkJCQljbGllbnQgICAgIAlAMTYKKwkJCQlzdXBwbGllciAgIAlAMjMKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAMzgKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzREI4NTAxN0MiCisJCQkJY2xpZW50ICAgICAJQDE3CisJCQkJc3VwcGxpZXIgICAJQDQKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAMzkKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzREI4ODAxNkMiCisJCQkJY2xpZW50ICAgICAJQDE3CisJCQkJc3VwcGxpZXIgICAJQDIzCisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDQwCisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q4MjcwMkU1IgorCQkJCWNsaWVudCAgICAgCUAxMgorCQkJCXN1cHBsaWVyICAgCUAzMworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA0MQorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEODJBMDJDQyIKKwkJCQljbGllbnQgICAgIAlAMTIKKwkJCQlzdXBwbGllciAgIAlAMTcKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANDIKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDgyRDAyNDQiCisJCQkJY2xpZW50ICAgICAJQDEyCisJCQkJc3VwcGxpZXIgICAJQDIzCisJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCisJCQkJICAgICgyMDYwLCAxNzQzKQorCQkJCSAgICAoMTc0NiwgNDQ3KQorCQkJCSAgICAoMTgzOCwgMTg2KSkKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANDMKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDkxOTAxOEYiCisJCQkJY2xpZW50ICAgICAJQDE1CisJCQkJc3VwcGxpZXIgICAJQDExCisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDQ0CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q5NDYwMDBEIgorCQkJCWNsaWVudCAgICAgCUAxNQorCQkJCXN1cHBsaWVyICAgCUA0CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDQ1CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q5NUUwMTJBIgorCQkJCWNsaWVudCAgICAgCUAxNQorCQkJCXN1cHBsaWVyICAgCUAyMQorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA0NgorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEOTVFMDEyQSIKKwkJCQljbGllbnQgICAgIAlAMTUKKwkJCQlzdXBwbGllciAgIAlAMjEKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANDcKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDk5NjAzMTUiCisJCQkJY2xpZW50ICAgICAJQDE1CisJCQkJc3VwcGxpZXIgICAJQDE3CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDQ4CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q5OTkwMkJGIgorCQkJCWNsaWVudCAgICAgCUAxNQorCQkJCXN1cHBsaWVyICAgCUAxOAorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA0OQorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEOTlDMDE0NyIKKwkJCQljbGllbnQgICAgIAlAMTUKKwkJCQlzdXBwbGllciAgIAlANQorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA1MAorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEOTQ2MDAwRCIKKwkJCQljbGllbnQgICAgIAlAMTUKKwkJCQlzdXBwbGllciAgIAlANAorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA1MQorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEOTE1MDI1MSIKKwkJCQljbGllbnQgICAgIAlAMTUKKwkJCQlzdXBwbGllciAgIAlANworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA1MgorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEOURBMDExNCIKKwkJCQljbGllbnQgICAgIAlAMTUKKwkJCQlzdXBwbGllciAgIAlAOQorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA1MworCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEOUY0MDJGMiIKKwkJCQljbGllbnQgICAgIAlAMTUKKwkJCQlzdXBwbGllciAgIAlAMTAKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANTQKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDk5NjAzMTUiCisJCQkJY2xpZW50ICAgICAJQDE1CisJCQkJc3VwcGxpZXIgICAJQDE3CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDU1CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q5NDYwMDBEIgorCQkJCWNsaWVudCAgICAgCUAxNQorCQkJCXN1cHBsaWVyICAgCUA0CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDU2CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q5OUMwMTQ3IgorCQkJCWNsaWVudCAgICAgCUAxNQorCQkJCXN1cHBsaWVyICAgCUA1CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDU3CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q0OTEwMUE1IgorCQkJCWNsaWVudCAgICAgCUA4CisJCQkJc3VwcGxpZXIgICAJQDUKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANTgKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDRDNjAyN0QiCisJCQkJY2xpZW50ICAgICAJQDgKKwkJCQlzdXBwbGllciAgIAlANAorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA1OQorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNENEZCMDA4RiIKKwkJCQljbGllbnQgICAgIAlAOAorCQkJCXN1cHBsaWVyICAgCUAxMworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA2MAorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNENTAwMDBCRSIKKwkJCQljbGllbnQgICAgIAlAOAorCQkJCXN1cHBsaWVyICAgCUAxOAorCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cworCQkJCSAgICAoMjA1NywgMTIxNikKKwkJCQkgICAgKDEyNzgsIDEyMTYpCisJCQkJICAgICg0NTQsIDc4MykpCisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDYxCisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q1MDgwMjc4IgorCQkJCWNsaWVudCAgICAgCUA4CisJCQkJc3VwcGxpZXIgICAJQDEwCisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDYyCisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q1NUEwMjU4IgorCQkJCWNsaWVudCAgICAgCUA4CisJCQkJc3VwcGxpZXIgICAJQDcKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANjMKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDU2MDAwRDAiCisJCQkJY2xpZW50ICAgICAJQDgKKwkJCQlzdXBwbGllciAgIAlAMgorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA2NAorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEMTlFMDFBOSIKKwkJCQljbGllbnQgICAgIAlANAorCQkJCXN1cHBsaWVyICAgCUA1CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDY1CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0QxQTEwMTg1IgorCQkJCWNsaWVudCAgICAgCUA0CisJCQkJc3VwcGxpZXIgICAJQDE3CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDY2CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0QxQ0UwMDdDIgorCQkJCWNsaWVudCAgICAgCUA0CisJCQkJc3VwcGxpZXIgICAJQDMKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANjcKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDFEODAwRDAiCisJCQkJY2xpZW50ICAgICAJQDQKKwkJCQlzdXBwbGllciAgIAlAMTEKKwkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKKwkJCQkgICAgKDIwODEsIDg5MCkKKwkJCQkgICAgKDk1OSwgMTYxNikKKwkJCQkgICAgKDQwOSwgMjM1MSkpCisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDY4CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0QyNUMwMzFGIgorCQkJCWNsaWVudCAgICAgCUA0CisJCQkJc3VwcGxpZXIgICAJQDgKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANjkKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDI2MDAyOEUiCisJCQkJY2xpZW50ICAgICAJQDQKKwkJCQlzdXBwbGllciAgIAlAMTUKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANzAKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDI2QTAxNUMiCisJCQkJY2xpZW50ICAgICAJQDQKKwkJCQlzdXBwbGllciAgIAlAMTMKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANzEKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDI4MzAyNzEiCisJCQkJY2xpZW50ICAgICAJQDQKKwkJCQlzdXBwbGllciAgIAlAMTgKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANzIKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDJDODAyNDgiCisJCQkJY2xpZW50ICAgICAJQDQKKwkJCQlzdXBwbGllciAgIAlAOQorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA3MworCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEMkQ2MDAyQiIKKwkJCQljbGllbnQgICAgIAlANAorCQkJCXN1cHBsaWVyICAgCUAyMQorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA3NAorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEM0QzMDBGNyIKKwkJCQljbGllbnQgICAgIAlANAorCQkJCXN1cHBsaWVyICAgCUAyMworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA3NQorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEMDNDMDM5NSIKKwkJCQljbGllbnQgICAgIAlAMgorCQkJCXN1cHBsaWVyICAgCUA1CisJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCisJCQkJICAgICgxNzEsIDE4NTUpCisJCQkJICAgICgxNiwgNzY2KQorCQkJCSAgICAoMjA1LCAyNTApKQorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA3NgorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEMDNGMDFDMiIKKwkJCQljbGllbnQgICAgIAlAMgorCQkJCXN1cHBsaWVyICAgCUAxNworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA3NworCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEMDQzMDI0QSIKKwkJCQljbGllbnQgICAgIAlAMgorCQkJCXN1cHBsaWVyICAgCUAxOAorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA3OAorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEQzJCMDI1NyIKKwkJCQljbGllbnQgICAgIAlAMTgKKwkJCQlzdXBwbGllciAgIAlAMTcKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANzkKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzREQzRTAyNzEiCisJCQkJY2xpZW50ICAgICAJQDE4CisJCQkJc3VwcGxpZXIgICAJQDUKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAODAKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzREQ0MTAyQ0YiCisJCQkJY2xpZW50ICAgICAJQDE4CisJCQkJc3VwcGxpZXIgICAJQDMKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAODEKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRERERTAwQjgiCisJCQkJY2xpZW50ICAgICAJQDE4CisJCQkJc3VwcGxpZXIgICAJQDQKKwkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKKwkJCQkgICAgKDQ1NCwgNjU0KQorCQkJCSAgICAoMTI5MywgMzgxKQorCQkJCSAgICAoMjA3MywgNzMxKSkKKwkJCQlsaW5lX3N0eWxlIAkwKSkpKSkKKwkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAib3JnLmFwYWNoZS5jb3lvdGUiCisJCXF1aWQgICAgICAgCSIzRTQyREU5RjAxMzIiCisJCXZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdAorCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJcXVpZCAgICAgICAJIjNFNDJERUZDMDBCMyIKKwkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUudG9tY2F0LnV0aWwiCisJCQlxdWlkdSAgICAgIAkiM0U0MkRFREYwMUYyIikpCisJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQorCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKQorCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJvcmcuYXBhY2hlLnRvbWNhdC51dGlsIgorCQlxdWlkICAgICAgIAkiM0U0MkRFREYwMUYyIgorCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKKwkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KSkKKwkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAib3JnLmFwYWNoZS5qYXNwZXIiCisJCXF1aWQgICAgICAgCSIzRTQyREVGRjAyNzAiCisJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQorCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKQorCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJvcmcuYXBhY2hlLm5hbWluZyIKKwkJcXVpZCAgICAgICAJIjNFNDNEMTU4MDMzOSIKKwkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkpCisJICAgIChvYmplY3QgTWVjaGFuaXNtIEA4MgorCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAorCQkgICAgKG9iamVjdCBPYmplY3QgIkJvb3RzdHJhcCIKKwkJCXF1aWQgICAgICAgCSIzREZERjhGRDAzNDUiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGREY5MjEwMDA4IgorCQkJCXN1cHBsaWVyICAgCSJCb290c3RyYXAiCisJCQkJcXVpZHUgICAgICAJIjNERkRGOEZEMDM0NSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImluaXRDbGFzc0xvYWRlcnMoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkRGOTIxMDAwOSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxIgorCQkJCQlvcmRpbmFsICAgIAkwCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkRGOTFBMDEwQyIKKwkJCQlzdXBwbGllciAgIAkiQ2F0YWxpbmEiCisJCQkJcXVpZHUgICAgICAJIjNERkRGOTBBMDMzMCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIm5ld0luc3RhbmNlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZERjkxQTAxMEQiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMiIKKwkJCQkJb3JkaW5hbCAgICAJMQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJzZXRQYXJlbnRDbGFzc0xvYWRlcigpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGREY5NzkwMEMyIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMiCisJCQkJCW9yZGluYWwgICAgCTIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAibG9hZCgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGREZBMzQwMkYyIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjQiCisJCQkJCW9yZGluYWwgICAgCTMKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiRGlnZXN0ZXIiCisJCQlxdWlkICAgICAgIAkiM0RGREZBRjIwMUExIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkRGQjg0MDBBNiIKKwkJCQlzdXBwbGllciAgIAkiU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkRGQjRCMDIxNyIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIm5ld0luc3RhbmNlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZERkI4NDAwQTciCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiOS4xIgorCQkJCQlvcmRpbmFsICAgIAk5CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkRGQjkyMDE0NyIKKwkJCQlzdXBwbGllciAgIAkiR2xvYmFsUmVzb3VyY2VzTGlmZWN5Y2xlTGlzdGVuZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkRGQjdBMDJBQiIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIm5ld0luc3RhbmNlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZERkI5MjAxNDgiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiOS4yIgorCQkJCQlvcmRpbmFsICAgIAkxMAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciIKKwkJCXF1aWQgICAgICAgCSIzREZERkI0QjAyMTciCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiR2xvYmFsUmVzb3VyY2VzTGlmZWN5Y2xlTGlzdGVuZXIiCisJCQlxdWlkICAgICAgIAkiM0RGREZCN0EwMkFCIgorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlNlY3VyaXR5Q29uZmlnIgorCQkJcXVpZCAgICAgICAJIjNERkRGQkQ4MDJCQSIKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJDYXRhbGluYSIKKwkJCXF1aWQgICAgICAgCSIzREZERjkwQTAzMzAiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGREZBODAwMUQ5IgorCQkJCXN1cHBsaWVyICAgCSJDYXRhbGluYSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGREY5MEEwMzMwIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW5pdERpcnMoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkRGQTgwMDFEQSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI1IgorCQkJCQlvcmRpbmFsICAgIAk0CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImluaXROYW1pbmcoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkRGQThCMDM0NyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI2IgorCQkJCQlvcmRpbmFsICAgIAk1CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImluaXRpYWxpemUoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkRGQUFEMDFBQyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI3IgorCQkJCQlvcmRpbmFsICAgIAk2CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkRGQUY4MDBDMyIKKwkJCQlzdXBwbGllciAgIAkiRGlnZXN0ZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkRGQUYyMDFBMSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImNyZWF0ZURpZ2VzdGVyKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZERkFGODAwQzQiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiOCIKKwkJCQkJb3JkaW5hbCAgICAJNworCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJwYXJzZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGREZCMDEwMEIyIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjkiCisJCQkJCW9yZGluYWwgICAgCTgKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGREZCRUEwMEMxIgorCQkJCXN1cHBsaWVyICAgCSJTZWN1cml0eUNvbmZpZyIKKwkJCQlxdWlkdSAgICAgIAkiM0RGREZCRDgwMkJBIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAibmV3SW5zdGFuY2UoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkRGQkVBMDBDMiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxMCIKKwkJCQkJb3JkaW5hbCAgICAJMTEKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic2V0UGFja2FnZURlZmluaXRpb24oKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkRGQkY0MDFGMiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxMSIKKwkJCQkJb3JkaW5hbCAgICAJMTIKKwkJCQkJT3BlcmF0aW9uICAJInNldFBhY2thZ2VEZWZpbml0aW9uIgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJzZXRQYWNrYWdlQWNjZXNzKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZERkMxMjAzQzIiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMTIiCisJCQkJCW9yZGluYWwgICAgCTEzCisJCQkJCU9wZXJhdGlvbiAgCSJzZXRQYWNrYWdlQWNjZXNzIgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkpKQorCSAgICAob2JqZWN0IE1lY2hhbmlzbSBAODMKKwkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKKwkJICAgIChvYmplY3QgT2JqZWN0ICJDYXRhbGluYSIKKwkJCXF1aWQgICAgICAgCSIzREZERkM4RjAxNUYiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGREZEMUYwMDc1IgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZFNlcnZlciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGREZDQ0IwMDZCIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW5pdGlhbGl6ZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGREZEMUYwMDc2IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEiCisJCQkJCW9yZGluYWwgICAgCTAKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRTZXJ2ZXIiCisJCQlxdWlkICAgICAgIAkiM0RGREZDQ0IwMDZCIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkRGRDNEMDFDMyIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRTZXJ2aWNlIgorCQkJCXF1aWR1ICAgICAgCSIzREZERkQzNzAwMjAiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbml0aWFsaXplKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZERkQzRDAxQzQiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMiIKKwkJCQkJb3JkaW5hbCAgICAJMQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZFNlcnZpY2UiCisJCQlxdWlkICAgICAgIAkiM0RGREZEMzcwMDIwIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkRGRTk5MDMwNCIKKwkJCQlzdXBwbGllciAgIAkiQ295b3RlQ29ubmVjdG9yIgorCQkJCXF1aWR1ICAgICAgCSIzREZERkU4MTAzMTMiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbml0aWFsaXplKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZERkU5OTAzMDUiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMi4xIgorCQkJCQlvcmRpbmFsICAgIAkyCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIkNveW90ZUNvbm5lY3RvciIKKwkJCXF1aWQgICAgICAgCSIzREZERkU4MTAzMTMiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTAxM0QwMjE2IgorCQkJCXN1cHBsaWVyICAgCSJDb3lvdGVBZGFwdGVyIgorCQkJCXF1aWR1ICAgICAgCSIzREZERkZBMDAyMjYiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJuZXcoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwMTNEMDIxNyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIyLjEuMSIKKwkJCQkJb3JkaW5hbCAgICAJMworCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMDE4MzAzMkYiCisJCQkJc3VwcGxpZXIgICAJIkh0dHAxMVByb3RvY29sIgorCQkJCXF1aWR1ICAgICAgCSIzREZFMDE2NjAxQTYiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJuZXcoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwMTgzMDMzMCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIyLjEuMiIKKwkJCQkJb3JkaW5hbCAgICAJNAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbml0KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDE4ODAzMkMiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMi4xLjMiCisJCQkJCW9yZGluYWwgICAgCTUKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTAxQkMwMzhCIgorCQkJCXN1cHBsaWVyICAgCSJKa0NveW90ZUFkYXB0ZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkUwMUFEMDFBOCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIm5ldygpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTAxQkMwMzhDIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjIuMS40IgorCQkJCQlvcmRpbmFsICAgIAk2CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImluaXQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwMUMzMDE2NCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIyLjEuNSIKKwkJCQkJb3JkaW5hbCAgICAJNworCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJDb3lvdGVBZGFwdGVyIgorCQkJcXVpZCAgICAgICAJIjNERkRGRkEwMDIyNiIKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJIdHRwMTFQcm90b2NvbCIKKwkJCXF1aWQgICAgICAgCSIzREZFMDE2NjAxQTYiCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiSmtDb3lvdGVBZGFwdGVyIgorCQkJcXVpZCAgICAgICAJIjNERkUwMUFEMDFBOCIKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkpKQorCSAgICAob2JqZWN0IE1lY2hhbmlzbSBAODQKKwkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKKwkJICAgIChvYmplY3QgT2JqZWN0ICJCb290c3RyYXAiCisJCQlxdWlkICAgICAgIAkiM0RGRTAyNzcwMEY1IgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwMjgzMDM3MyIKKwkJCQlzdXBwbGllciAgIAkiQ2F0YWxpbmEiCisJCQkJcXVpZHUgICAgICAJIjNERkUwMjdEMDA2NyIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInN0YXJ0KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDI4MzAzNzQiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMSIKKwkJCQkJb3JkaW5hbCAgICAJMAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJDYXRhbGluYSIKKwkJCXF1aWQgICAgICAgCSIzREZFMDI3RDAwNjciCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTAyQkEwMTg3IgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZFNlcnZlciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTAyQjMwMDE1IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic3RhcnQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwMkJBMDE4OCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxLjEiCisJCQkJCW9yZGluYWwgICAgCTEKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRTZXJ2ZXIiCisJCQlxdWlkICAgICAgIAkiM0RGRTAyQjMwMDE1IgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwMkQzMDA2QiIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRTZXJ2ZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkUwMkIzMDAxNSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RBUlRfRVZFTlQpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTAyRDMwMDZDIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMS4xIgorCQkJCQlvcmRpbmFsICAgIAkyCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDJERjAyREYiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMS4xLjIiCisJCQkJCW9yZGluYWwgICAgCTMKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTAzMEMwMkIyIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZFNlcnZpY2UiCisJCQkJcXVpZHUgICAgICAJIjNERkUwMzA0MDBFMyIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInN0YXJ0KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDMwQzAyQjMiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMS4xLjMiCisJCQkJCW9yZGluYWwgICAgCTQKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRTZXJ2aWNlIgorCQkJcXVpZCAgICAgICAJIjNERkUwMzA0MDBFMyIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMDMxRDAwMjEiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkU2VydmljZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTAzMDQwMEUzIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9TVEFSVF9FVkVOVCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDMxRDAwMjIiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMS4xLjMuMSIKKwkJCQkJb3JkaW5hbCAgICAJNQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJmaXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTAzMzAwMTlCIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMS4zLjIiCisJCQkJCW9yZGluYWwgICAgCTYKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTAzNzAwMTg5IgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZEVuZ2luZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTAzNDcwMEMyIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic3RhcnQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwMzcwMDE4QSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxLjEuMy4zIgorCQkJCQlvcmRpbmFsICAgIAk3CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkRW5naW5lIgorCQkJcXVpZCAgICAgICAJIjNERkUwMzQ3MDBDMiIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMDM3NTAwNTAiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkRW5naW5lIgorCQkJCXF1aWR1ICAgICAgCSIzREZFMDM0NzAwQzIiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJmaXJlTGlmZWN5Y2xlRXZlbnQoQkVGT1JFX1NUQVJUX0VWRU5UKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwMzc1MDA1MSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIyIgorCQkJCQlvcmRpbmFsICAgIAk4CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImFkZERlZmF1bHRNYXBwZXIoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwMzg5MDAxQyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzIgorCQkJCQlvcmRpbmFsICAgIAk5CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImxvZ2dlci5zdGFydCgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTAzOTgwMjgxIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjQiCisJCQkJCW9yZGluYWwgICAgCTEwCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInJlYWxtLnN0YXJ0KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDNBODAxMDciCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiNSIKKwkJCQkJb3JkaW5hbCAgICAJMTEKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiZmluZE1hcHBlcnMoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwM0JEMDAwRCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI2IgorCQkJCQlvcmRpbmFsICAgIAkxMgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJmaW5kQ2hpbGRyZW4oKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwM0UwMDBBNCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI3IgorCQkJCQlvcmRpbmFsICAgIAkxMworCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMDNGQjAyNzkiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkSG9zdCIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTAzRjIwMzVEIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic3RhcnQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwM0ZCMDI3QSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI4IgorCQkJCQlvcmRpbmFsICAgIAkxNAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZEhvc3QiCisJCQlxdWlkICAgICAgIAkiM0RGRTAzRjIwMzVEIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwNDNCMDJBRCIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRIb3N0IgorCQkJCXF1aWR1ICAgICAgCSIzREZFMDNGMjAzNUQiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJmaXJlTGlmZWN5Y2xlRXZlbnQoQkVGT1JFX1NUQVJUX0VWRU5UKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwNDNCMDJBRSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI4LjEiCisJCQkJCW9yZGluYWwgICAgCTE1CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImFkZERlZmF1bHRNYXBwZXIoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwNDVDMDIxRiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI4LjIiCisJCQkJCW9yZGluYWwgICAgCTE2CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImxvZ2dlci5zdGFydCgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA0OUIwMDBDIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjguMyIKKwkJCQkJb3JkaW5hbCAgICAJMTcKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiZmluZE1hcHBlcigpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA0QTMwM0JCIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjguNCIKKwkJCQkJb3JkaW5hbCAgICAJMTgKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiZmluZENoaWxkcmVuKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDRBOTAzNDIiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiOC41IgorCQkJCQlvcmRpbmFsICAgIAkxOQorCQkJCQlPcGVyYXRpb24gIAkiZmluZENoaWxkcmVuIgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMDQ4RTAwQjgiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkUGlwZWxpbmUiCisJCQkJcXVpZHUgICAgICAJIjNERkUwNDdEMDA2RCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInN0YXJ0KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDQ4RTAwQjkiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiOC42IgorCQkJCQlvcmRpbmFsICAgIAkyMAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZFBpcGVsaW5lIgorCQkJcXVpZCAgICAgICAJIjNERkUwNDdEMDA2RCIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMDU3ODAxMzciCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkUGlwZWxpbmUiCisJCQkJcXVpZHUgICAgICAJIjNERkUwNDdEMDA2RCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RBUlRfRVZFTlQpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA1NzgwMTM4IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjguNi4xIgorCQkJCQlvcmRpbmFsICAgIAkyMQorCQkJCQlPcGVyYXRpb24gIAkiZmlyZUxpZmVjeWNsZUV2ZW50KEFGVEVSX1NUQVJUX0VWRU5UKSIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5UKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwNUE4MDM5OCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI4LjYuMiIKKwkJCQkJb3JkaW5hbCAgICAJMjIKKwkJCQkJT3BlcmF0aW9uICAJImZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RBUlRfRVZFTlQpIgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJmaXJlTGlmZWN5Y2xlRXZlbnQoQUZURVJfRVZFTlQpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA1QkEwMTk2IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjguNi4zIgorCQkJCQlvcmRpbmFsICAgIAkyMworCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkpKQorCSAgICAob2JqZWN0IE1lY2hhbmlzbSBAODUKKwkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZEhvc3QiCisJCQlxdWlkICAgICAgIAkiM0RGRTA1MzgwMTdCIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwNjZDMDM0MCIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRIb3N0IgorCQkJCXF1aWR1ICAgICAgCSIzREZFMDUzODAxN0IiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJmaXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA2NkMwMzQxIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEiCisJCQkJCW9yZGluYWwgICAgCTAKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTA2RDIwMjkzIgorCQkJCXN1cHBsaWVyICAgCSJIb3N0Q29uZmlnIgorCQkJCXF1aWR1ICAgICAgCSIzREZFMDZBNjAxMzEiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbnRlcmVzdGVkW2ldLmxpZmVjeWNsZUV2ZW50KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDZEMjAyOTQiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMiIKKwkJCQkJb3JkaW5hbCAgICAJMQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbnN0YWxsKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDc4QjAzQkIiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIlRvQ2xpZW50RnJvbVN1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMi42IgorCQkJCQlvcmRpbmFsICAgIAk3CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImluc3RhbGwoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUxMzJEMDMwOSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiVG9DbGllbnRGcm9tU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI1IgorCQkJCQlvcmRpbmFsICAgIAkxMworCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMDdCMTAwQkQiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkSG9zdERlcGxveWVyIgorCQkJCXF1aWR1ICAgICAgCSIzREZFMDc5QTAwNTUiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbnN0YWxsKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDdCMTAwQkUiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMyIKKwkJCQkJb3JkaW5hbCAgICAJOAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbnN0YWxsKCkgLy8gc2FtZSBhcyBhYm92ZSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUxMzNBMDM2QyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI2IgorCQkJCQlvcmRpbmFsICAgIAkxNworCQkJCQlPcGVyYXRpb24gIAkiaW5zdGFsbCgpIgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJIb3N0Q29uZmlnIgorCQkJcXVpZCAgICAgICAJIjNERkUwNkE2MDEzMSIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMDZFOTAyOEMiCisJCQkJc3VwcGxpZXIgICAJIkhvc3RDb25maWciCisJCQkJcXVpZHUgICAgICAJIjNERkUwNkE2MDEzMSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInNldERlcGxveVhNTCgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA2RTkwMjhEIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjIuMSIKKwkJCQkJb3JkaW5hbCAgICAJMgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJzZXRMaXZlRGVwbG95KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDZGMzAwRkYiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMi4yIgorCQkJCQlvcmRpbmFsICAgIAkzCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInNldFVucGFja3NXYXIoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwNkZCMDBEOSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIyLjMiCisJCQkJCW9yZGluYWwgICAgCTQKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic2V0WE1MVmFsaWRhdGlvbigpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA3MEMwMDE1IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjIuNCIKKwkJCQkJb3JkaW5hbCAgICAJNQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJkZXBsb3lEZXNjcmlwdG9ycygpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA3M0IwMDMxIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjIuNSIKKwkJCQkJb3JkaW5hbCAgICAJNgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJkZXBsb3lBcHBzKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMTMxRjAzMjciCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiNCIKKwkJCQkJb3JkaW5hbCAgICAJMTIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRIb3N0RGVwbG95ZXIiCisJCQlxdWlkICAgICAgIAkiM0RGRTA3OUEwMDU1IgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwN0QyMDBFQyIKKwkJCQlzdXBwbGllciAgIAkiRGlnZXN0ZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkUwN0M5MDM0QyIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImNyZWF0ZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA3RDIwMEVEIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMSIKKwkJCQkJb3JkaW5hbCAgICAJOQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJwYXJzZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA3RDYwM0Q3IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuNiIKKwkJCQkJb3JkaW5hbCAgICAJMTYKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiYWRkKENvbnRleHRSdWxlU2V0KSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwOEZBMDAzRCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjMiCisJCQkJCW9yZGluYWwgICAgCTExCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwODdEMDFFMiIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRIb3N0RGVwbG95ZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkUwNzlBMDA1NSIpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwOERBMDI5QSIKKwkJCQlzdXBwbGllciAgIAkiQ29udGV4dFJ1bGVTZXQiCisJCQkJcXVpZHUgICAgICAJIjNERkUwODM0MDE2RiIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIm5ldygpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA4REEwMjlCIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMiIKKwkJCQkJb3JkaW5hbCAgICAJMTAKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiYWRkKE5hbWluZ1J1bGVTZXQoKSkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDkwNzAxNUYiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy41IgorCQkJCQlvcmRpbmFsICAgIAkxNQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMDhFMDAwOTAiCisJCQkJc3VwcGxpZXIgICAJIk5hbWluZ1J1bGVTZXQiCisJCQkJcXVpZHUgICAgICAJIjNERkUwOEQwMDE3MyIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIm5ldygpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA4RTAwMDkxIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuNCIKKwkJCQkJb3JkaW5hbCAgICAJMTQKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiRGlnZXN0ZXIiCisJCQlxdWlkICAgICAgIAkiM0RGRTA3QzkwMzRDIgorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIkNvbnRleHRSdWxlU2V0IgorCQkJcXVpZCAgICAgICAJIjNERkUwODM0MDE2RiIKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJOYW1pbmdSdWxlU2V0IgorCQkJcXVpZCAgICAgICAJIjNERkUwOEQwMDE3MyIKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkpKQorCSAgICAob2JqZWN0IE1lY2hhbmlzbSBAODYKKwkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKKwkJICAgIChvYmplY3QgT2JqZWN0ICJEaWdlc3RlciIKKwkJCXF1aWQgICAgICAgCSIzREZFMDk1QTAzNzEiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTBFNzgwMURBIgorCQkJCXN1cHBsaWVyICAgCSJEaWdlc3RlciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTA5NUEwMzcxIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAicGFyc2UiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMEU3ODAxREIiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMSIKKwkJCQkJb3JkaW5hbCAgICAJMAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJzdGFydEVsZW1lbnQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwRjJGMDNEMiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIyIgorCQkJCQlvcmRpbmFsICAgIAkxCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwRjQwMDIxMyIKKwkJCQlzdXBwbGllciAgIAkiUnVsZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTBFNzQwMEQwIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiYmVnaW4oKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwRjQwMDIxNCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzIgorCQkJCQlvcmRpbmFsICAgIAkyCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlJ1bGUiCisJCQlxdWlkICAgICAgIAkiM0RGRTBFNzQwMEQwIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwRkQzMDI2NSIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRDb250ZXh0IgorCQkJCXF1aWR1ICAgICAgCSIzREZFMEZDNTAyQTEiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJuZXdJbnN0YW5jZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTBGRDMwMjY2IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMSIKKwkJCQkJb3JkaW5hbCAgICAJMworCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMTAyMDAyRTgiCisJCQkJc3VwcGxpZXIgICAJIlNldFByb3BlcnRpZXNSdWxlIgorCQkJCXF1aWR1ICAgICAgCSIzREZFMTAwMzAzQTQiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJiZWdpbigpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTEwMjAwMkU5IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMiIKKwkJCQkJb3JkaW5hbCAgICAJNgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMTI3RjAwMjQiCisJCQkJc3VwcGxpZXIgICAJIlJ1bGUiCisJCQkJcXVpZHUgICAgICAJIjNERkUwRTc0MDBEMCIpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUxMjg1MDFDNyIKKwkJCQlzdXBwbGllciAgIAkiU2V0TmV4dFJ1bGUiCisJCQkJcXVpZHUgICAgICAJIjNERkUxMjY5MDI2NyIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImVuZCgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTEyODUwMUM4IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMyIKKwkJCQkJb3JkaW5hbCAgICAJOAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZENvbnRleHQiCisJCQlxdWlkICAgICAgIAkiM0RGRTBGQzUwMkExIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUxMTRBMDE5MiIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRQaXBlbGluZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTExMkYwMDNGIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic2V0QmFzaWMoU3RhbmRhcmRDb250ZXh0VmFsdmUpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTExNEEwMTkzIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMS4yIgorCQkJCQlvcmRpbmFsICAgIAk1CisJCQkJCU9wZXJhdGlvbiAgCSJzZXRCYXNpYyIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTExNUUwMDFFIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZENvbnRleHRWYWx2ZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTExMEQwMzc1IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAibmV3KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMTE1RTAwMUYiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4xLjEiCisJCQkJCW9yZGluYWwgICAgCTQKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU2V0UHJvcGVydGllc1J1bGUiCisJCQlxdWlkICAgICAgIAkiM0RGRTEwMDMwM0E0IgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUxMUQ1MDM5MCIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRDb250ZXh0IgorCQkJCXF1aWR1ICAgICAgCSIzREZFMEZDNTAyQTEiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICIvL1VzaW5nIEJlYW5VdGlsLCBzZXQgdGhlIG9iamVjdCBwcm9wZXJ0aWVzIChmcm9tIGV4OiBhZG1pbi54bWwpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTExRDUwMzkxIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMi4xIgorCQkJCQlvcmRpbmFsICAgIAk3CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkQ29udGV4dFZhbHZlIgorCQkJcXVpZCAgICAgICAJIjNERkUxMTBEMDM3NSIKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZFBpcGVsaW5lIgorCQkJcXVpZCAgICAgICAJIjNERkUxMTJGMDAzRiIKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTZXROZXh0UnVsZSIKKwkJCXF1aWQgICAgICAgCSIzREZFMTI2OTAyNjciCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpKSkKKwkgICAgKG9iamVjdCBNZWNoYW5pc20gQDg3CisJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0CisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRDb250ZXh0IgorCQkJcXVpZCAgICAgICAJIjNERkUxOTZEMDBEOSIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMjAwNjAzQkQiCisJCQkJc3VwcGxpZXIgICAJIldlYmFwcExvYWRlciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTFGRkEwMzQ3IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAibmV3IgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTIwMDYwM0JFIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMS4xLjEiCisJCQkJCW9yZGluYWwgICAgCTUKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTIwMEMwMjk5IgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZENvbnRleHQiCisJCQkJcXVpZHUgICAgICAJIjNERkUxOTZEMDBEOSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInNldExvYWRlciIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUyMDBDMDI5QSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjEuMS4yIgorCQkJCQlvcmRpbmFsICAgIAk2CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInNldE1hbmFnZXIiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMjAzMjAwMUMiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4xLjEuNCIKKwkJCQkJb3JkaW5hbCAgICAJOAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJmaXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTIwNUIwMUEyIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMS4xLjUiCisJCQkJCW9yZGluYWwgICAgCTkKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTIwMkMwMjRGIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZE1hbmFnZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkUyMDFGMDEwNSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIm5ldyIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUyMDJDMDI1MCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjEuMS4zIgorCQkJCQlvcmRpbmFsICAgIAk3CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInN0YXJ0KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMjBCNjAwRTUiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4xLjEuNyIKKwkJCQkJb3JkaW5hbCAgICAJMTIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTIwOTYwMDAyIgorCQkJCXN1cHBsaWVyICAgCSJDb250ZXh0Q29uZmlnIgorCQkJCXF1aWR1ICAgICAgCSIzREZFMjA4NzAyOEMiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICIgLy8gTm90aWZ5IGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTIwOTYwMDAzIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMS4xLjYiCisJCQkJCW9yZGluYWwgICAgCTEwCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkSG9zdERlcGxveWVyIgorCQkJcXVpZCAgICAgICAJIjNERkUxRDhBMDJEQyIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMUZBRjAwMTQiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkSG9zdCIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTFERjIwMTQxIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiYWRkQ2hpbGQiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMUZCNjAyNzciCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4xIgorCQkJCQlvcmRpbmFsICAgIAkzCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkSG9zdCIKKwkJCXF1aWQgICAgICAgCSIzREZFMURGMjAxNDEiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTFGQzQwMjI3IgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZENvbnRleHQiCisJCQkJcXVpZHUgICAgICAJIjNERkUxOTZEMDBEOSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInN0YXJ0KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMUZDNDAyMjgiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4xLjEiCisJCQkJCW9yZGluYWwgICAgCTQKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiV2ViYXBwTG9hZGVyIgorCQkJcXVpZCAgICAgICAJIjNERkUxRkZBMDM0NyIKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZE1hbmFnZXIiCisJCQlxdWlkICAgICAgIAkiM0RGRTIwMUYwMTA1IgorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIkNvbnRleHRDb25maWciCisJCQlxdWlkICAgICAgIAkiM0RGRTIwODcwMjhDIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUyMENGMDE4QiIKKwkJCQlzdXBwbGllciAgIAkiQ29udGV4dENvbmZpZyIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTIwODcwMjhDIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic3RhcnQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUyMENGMDE4QyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjEuMS42LjEiCisJCQkJCW9yZGluYWwgICAgCTExCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImRlZmF1bHRDb25maWcoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUyMEUzMDNFMiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjEuMS42LjIiCisJCQkJCW9yZGluYWwgICAgCTEzCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImFwcGxpY2F0aW9uQ29uZmlnKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMjExRDAxQTEiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4xLjEuNi4zIgorCQkJCQlvcmRpbmFsICAgIAkxNAorCQkJCQlPcGVyYXRpb24gIAkiYXBwbGljYXRpb25Db25maWciCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUyMUI2MDI4NyIKKwkJCQlzdXBwbGllciAgIAkiRGlnZXN0ZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkUxMzk2MDM2NCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImNyZWF0ZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTIxQjYwMjg4IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMS4xLjYuMy4xIgorCQkJCQlvcmRpbmFsICAgIAkxNQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJjcmVhdGVXYXJwcGVyKCkgLy8gSW52b2tlZCBieSBhIFdlYldyYXBwZXJSdWxlIChub3QgRGlyZWN0bHkgYnkgdGhlIERpZ2VzdGVyKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUyMjhCMDNCQSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiVG9DbGllbnRGcm9tU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjEuMS42LjMuMS4yIgorCQkJCQlvcmRpbmFsICAgIAkxNworCQkJCQlPcGVyYXRpb24gIAkiY3JlYXRlV2FycHBlcigpIC8vIEludm9rZWQgYnkgYSBSdWxlIChub3QgRGlyZWN0bHkgYnkgdGhlIERpZ2VzdGVyKSIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTIyNTYwMDYxIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZFdyYXBwZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkUyMjBDMDEyMiIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIm5ldyIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUyMjlBMDAwNCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjEuMS42LjMuMS4yLjEiCisJCQkJCW9yZGluYWwgICAgCTE4CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImFkZEluc3RhbmNlTGlzdGVuZXIoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUyMkE3MDBDMSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjEuMS42LjMuMiIKKwkJCQkJb3JkaW5hbCAgICAJMTkKKwkJCQkJT3BlcmF0aW9uICAJImFkZEluc3RhbmNlTGlzdGVuZXIiCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImFkZExpZmVjeWNsZUxpc3RlbmVyKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMjJDNzAxQ0MiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4xLjEuNi4zLjMiCisJCQkJCW9yZGluYWwgICAgCTIwCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImFkZENvbnRhaW5lckxpc3RlbmVyKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMjJFODAzNjQiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4xLjEuNi4zLjQiCisJCQkJCW9yZGluYWwgICAgCTIxCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJVFJVRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiRGlnZXN0ZXIiCisJCQlxdWlkICAgICAgIAkiM0RGRTEzOTYwMzY0IgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUxOUFFMDA2NCIKKwkJCQlzdXBwbGllciAgIAkiRGlnZXN0ZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkUxMzk2MDM2NCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInBhcnNlIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTE5QUUwMDY1IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEiCisJCQkJCW9yZGluYWwgICAgCTAKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic3RhcnRFbGVtZW50KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMTlCMTAyRTkiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMiIKKwkJCQkJb3JkaW5hbCAgICAJMQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICIvLyBQcm9jZXNzIHdlYi54bWwgKiB0bGQueG1sIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTIxQkUwMjFCIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMS4xLjYuMy4xLjEiCisJCQkJCW9yZGluYWwgICAgCTE2CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUxREZCMDAyMSIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRIb3N0RGVwbG95ZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkUxRDhBMDJEQyIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImFkZENoaWxkIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTFERkIwMDIyIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMiCisJCQkJCW9yZGluYWwgICAgCTIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTIyMTkwMjI1IgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZFdyYXBwZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkUyMjBDMDEyMiIpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkV3JhcHBlciIKKwkJCXF1aWQgICAgICAgCSIzREZFMjIwQzAxMjIiCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpKSkKKwkgICAgKG9iamVjdCBNZWNoYW5pc20gQDg4CisJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0CisJCSAgICAob2JqZWN0IE9iamVjdCAiVGhyZWFkUG9vbCIKKwkJCXF1aWQgICAgICAgCSIzREZFNDAyQjAyQzUiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQwRTcwMUFEIgorCQkJCXN1cHBsaWVyICAgCSJUY3BXb3JrZXJUaHJlYWQiCisJCQkJcXVpZHUgICAgICAJIjNERkU0MDMyMDBGOCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInJ1bkl0KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDBFNzAxQUUiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMSIKKwkJCQkJb3JkaW5hbCAgICAJMAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJUY3BXb3JrZXJUaHJlYWQiCisJCQlxdWlkICAgICAgIAkiM0RGRTQwMzIwMEY4IgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0MEZDMDEwRCIKKwkJCQlzdXBwbGllciAgIAkiSHR0cDExUHJvdG9jb2wiCisJCQkJcXVpZHUgICAgICAJIjNERkU0MDc1MDE3NyIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInByb2Nlc3NDb25uZWN0aW9uIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQwRkMwMTBFIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMSIKKwkJCQkJb3JkaW5hbCAgICAJMQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJIdHRwMTFQcm90b2NvbCIKKwkJCXF1aWQgICAgICAgCSIzREZFNDA3NTAxNzciCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQxMTEwMjlFIgorCQkJCXN1cHBsaWVyICAgCSJIdHRwMTFQcm90b2NvbCIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQwNzUwMTc3IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAicHJvY2VzcygpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQxMTEwMjlGIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMS4xIgorCQkJCQlvcmRpbmFsICAgIAkyCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInBhcnNlSGVhZGVycygpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQxNUMwMTUxIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjIiCisJCQkJCW9yZGluYWwgICAgCTMKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAicHJlcGFyZVJlcXVlc3QoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0MUE2MDE2MSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzIgorCQkJCQlvcmRpbmFsICAgIAk0CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0MUQ2MDEwNiIKKwkJCQlzdXBwbGllciAgIAkiQ295b3RlQWRhcHRlciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQxMDYwMERGIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic2VydmljZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQxRDYwMTA3IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjQiCisJCQkJCW9yZGluYWwgICAgCTUKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiQ295b3RlQWRhcHRlciIKKwkJCXF1aWQgICAgICAgCSIzREZFNDEwNjAwREYiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQyMkMwMUYwIgorCQkJCXN1cHBsaWVyICAgCSJDb3lvdGVBZGFwdGVyIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDEwNjAwREYiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJwb3N0UGFyc2VSZXF1ZXN0KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDIyQzAxRjEiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiNSIKKwkJCQkJb3JkaW5hbCAgICAJNgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDI4MDAyMzciCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkRW5naW5lIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDI0QjAzNDkiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbnZva2UoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0MjgwMDIzOCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI2IgorCQkJCQlvcmRpbmFsICAgIAk3CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkRW5naW5lIgorCQkJcXVpZCAgICAgICAJIjNERkU0MjRCMDM0OSIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDI5QTAwMkMiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkUGlwZWxpbmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0MjkwMDA0NSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludm9rZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQyOUEwMDJEIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjYuMSIKKwkJCQkJb3JkaW5hbCAgICAJOAorCQkJCQlPcGVyYXRpb24gIAkiaW52b2tlIgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZFBpcGVsaW5lIgorCQkJcXVpZCAgICAgICAJIjNERkU0MjkwMDA0NSIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDJDRTAyMkYiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkVmFsdmVDb250ZXh0IgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDJDMDAyQjEiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbnZva2UoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0MkNFMDIzMCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI2LjEuMSIKKwkJCQkJb3JkaW5hbCAgICAJOQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZFZhbHZlQ29udGV4dCIKKwkJCXF1aWQgICAgICAgCSIzREZFNDJDMDAyQjEiCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpKSkKKwkgICAgKG9iamVjdCBNZWNoYW5pc20gQDg5CisJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0CisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRDb250ZXh0VmFsdmUiCisJCQlxdWlkICAgICAgIAkiM0RGRTQzMDcwMDFFIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0MzRDMDE5QSIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRFbmdpbmVWYWx2ZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQzMjgwMUYzIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW52b2tlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDM0QzAxOUIiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMSIKKwkJCQkJb3JkaW5hbCAgICAJMAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDNDMjAzQTMiCisJCQkJc3VwcGxpZXIgICAJIkVycm9yUmVwb3J0VmFsdmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0MzhDMDI4RCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludm9rZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQzQzIwM0E0IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMiCisJCQkJCW9yZGluYWwgICAgCTQKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW52b2tlTmV4dCgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQ2MzMwMjkzIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJUb0NsaWVudEZyb21TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMiIKKwkJCQkJb3JkaW5hbCAgICAJNgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDZFNzAwMjUiCisJCQkJc3VwcGxpZXIgICAJIkVycm9yRGlzcGF0Y2hlclZhbHZlIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDUxRjAxRUMiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbnZva2UoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0NkU3MDAyNiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI0IgorCQkJCQlvcmRpbmFsICAgIAk3CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludm9rZU5leHQiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDc1RDAzQTAiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIlRvQ2xpZW50RnJvbVN1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiNC4xIgorCQkJCQlvcmRpbmFsICAgIAk4CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0NzY1MDNDOSIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRIb3N0VmFsdmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0NzMxMDEzMCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludm9rZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQ3NjUwM0NBIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjUiCisJCQkJCW9yZGluYWwgICAgCTkKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRFbmdpbmVWYWx2ZSIKKwkJCXF1aWQgICAgICAgCSIzREZFNDMyODAxRjMiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQzNkMwMDlDIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZEhvc3QiCisJCQkJcXVpZHUgICAgICAJIjNERkU0MzY1MDNCRCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIm1hcCgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQzNkMwMDlEIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMSIKKwkJCQkJb3JkaW5hbCAgICAJMQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbnZva2UoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0MzgzMDA2MyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxLjIiCisJCQkJCW9yZGluYWwgICAgCTIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQzN0YwMTQzIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZEVuZ2luZVZhbHZlIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDMyODAxRjMiKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZEhvc3QiCisJCQlxdWlkICAgICAgIAkiM0RGRTQzNjUwM0JEIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0M0I5MDNCRSIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRDb250ZXh0VmFsdmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0MzA3MDAxRSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludm9rZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQzQjkwM0JGIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjIiCisJCQkJCW9yZGluYWwgICAgCTMKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiRXJyb3JSZXBvcnRWYWx2ZSIKKwkJCXF1aWQgICAgICAgCSIzREZFNDM4QzAyOEQiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQ0MjUwMUIwIgorCQkJCXN1cHBsaWVyICAgCSJFcnJvclJlcG9ydFZhbHZlIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDM4QzAyOEQiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJyZXBvcnQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0NDI1MDFCMSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjEiCisJCQkJCW9yZGluYWwgICAgCTUKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQ1MkEwMEY3IgorCQkJCXN1cHBsaWVyICAgCSJFcnJvckRpc3BhdGNoZXJWYWx2ZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQ1MUYwMUVDIikpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiRXJyb3JEaXNwYXRjaGVyVmFsdmUiCisJCQlxdWlkICAgICAgIAkiM0RGRTQ1MUYwMUVDIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0NzUwMDE0OCIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRIb3N0VmFsdmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0NzMxMDEzMCIpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0NzU4MDMzNSIKKwkJCQlzdXBwbGllciAgIAkiRXJyb3JEaXNwYXRjaGVyVmFsdmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0NTFGMDFFQyIpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkSG9zdFZhbHZlIgorCQkJcXVpZCAgICAgICAJIjNERkU0NzMxMDEzMCIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDdDRDAxNjYiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkSG9zdFZhbHZlIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDczMTAxMzAiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJtYXAoKSAvL0NvbnRleHQiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDdDRDAxNjciCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiNS4xIgorCQkJCQlvcmRpbmFsICAgIAkxMAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDdENTAwQjMiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkQ29udGV4dCIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQ3QzEwMEYxIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW52b2tlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDdENTAwQjQiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiNS4yIgorCQkJCQlvcmRpbmFsICAgIAkxMQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZENvbnRleHQiCisJCQlxdWlkICAgICAgIAkiM0RGRTQ3QzEwMEYxIgorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKSkpCisJICAgIChvYmplY3QgTWVjaGFuaXNtIEA5MAorCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkQ29udGV4dCIKKwkJCXF1aWQgICAgICAgCSIzREZFNDhCMDAxRDEiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQ4QkUwMjY3IgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZFBpcGVsaW5lIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDhCODAwODgiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbnZva2UoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0OEJFMDI2OCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxIgorCQkJCQlvcmRpbmFsICAgIAkwCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkUGlwZWxpbmUiCisJCQlxdWlkICAgICAgIAkiM0RGRTQ4QjgwMDg4IgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0OEVBMDAzOSIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRWYWx2ZUNvbnRleHQiCisJCQkJcXVpZHUgICAgICAJIjNERkU0OEQwMDBEQyIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludm9rZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQ4RUEwMDNBIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMSIKKwkJCQkJb3JkaW5hbCAgICAJMQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbnZva2UoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0OTc2MDE1RCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxLjIiCisJCQkJCW9yZGluYWwgICAgCTYKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRWYWx2ZUNvbnRleHQiCisJCQlxdWlkICAgICAgIAkiM0RGRTQ4RDAwMERDIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0OTExMDJENSIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRDb250ZXh0VmFsdmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0OTAzMDNBNyIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludm9rZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQ5MTEwMkQ2IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMS4xIgorCQkJCQlvcmRpbmFsICAgIAkyCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0OTkzMDIzQiIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRXcmFwcGVyVmFsdmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0OTg5MDA1NiIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludm9rZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQ5OTMwMjNDIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMi4xIgorCQkJCQlvcmRpbmFsICAgIAk3CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkQ29udGV4dFZhbHZlIgorCQkJcXVpZCAgICAgICAJIjNERkU0OTAzMDNBNyIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDkyRjAzM0MiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkQ29udGV4dFZhbHZlIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDkwMzAzQTciCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJtYXAgLy9yZXR1cm4gV3JhcHBlciIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0OTJGMDMzRCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxLjEuMS4xIgorCQkJCQlvcmRpbmFsICAgIAkzCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0OTRBMDE1MCIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRXcmFwcGVyIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDkzNzAzNTEiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbnZva2UoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0OTRBMDE1MSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxLjEuMS4yIgorCQkJCQlvcmRpbmFsICAgIAk0CisJCQkJCU9wZXJhdGlvbiAgCSJpbnZva2UiCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkV3JhcHBlciIKKwkJCXF1aWQgICAgICAgCSIzREZFNDkzNzAzNTEiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQ5NUYwMjg3IgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZFBpcGVsaW5lIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDhCODAwODgiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbnZva2UoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0OTVGMDI4OCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxLjEuMS4yLjEiCisJCQkJCW9yZGluYWwgICAgCTUKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRXcmFwcGVyVmFsdmUiCisJCQlxdWlkICAgICAgIAkiM0RGRTQ5ODkwMDU2IgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0OURCMDE4QSIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRXcmFwcGVyVmFsdmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0OTg5MDA1NiIpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0OUVDMDA0RSIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRXcmFwcGVyIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDkzNzAzNTEiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJhbGxvY2F0ZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQ5RUMwMDRGIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMi4xLjEiCisJCQkJCW9yZGluYWwgICAgCTgKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAicmV0dXJuIHNlcnZsZXQiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNEEyMDAwNjciCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlJldHVybiIKKwkJCQkJZGlyICAgICAgICAJIlRvQ2xpZW50RnJvbVN1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMS4yLjEuMS4xIgorCQkJCQlvcmRpbmFsICAgIAk5CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0QTI5MDI3RCIKKwkJCQlzdXBwbGllciAgIAkiQXBwbGljYXRpb25GaWx0ZXJDaGFpbiIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTRBMTUwMEIyIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiY3JlYXRlRmlsdGVyQ2hhaW4oKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0QTI5MDI3RSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxLjIuMS4xLjEuMSIKKwkJCQkJb3JkaW5hbCAgICAJMTAKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiZG9GaWx0ZXIoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0QTQ5MDI4MyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxLjIuMS4yIgorCQkJCQlvcmRpbmFsICAgIAkxMQorCQkJCQlPcGVyYXRpb24gIAkiZG9GaWx0ZXIiCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInJldHVybiIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0Q0I0MDI1QiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiUmV0dXJuIgorCQkJCQlkaXIgICAgICAgIAkiVG9DbGllbnRGcm9tU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxLjIuMS4yLjMiCisJCQkJCW9yZGluYWwgICAgCTE0CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIkFwcGxpY2F0aW9uRmlsdGVyQ2hhaW4iCisJCQlxdWlkICAgICAgIAkiM0RGRTRBMTUwMEIyIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0QzI3MDFDMiIKKwkJCQlzdXBwbGllciAgIAkiQXBwbGljYXRpb25GaWx0ZXJDaGFpbiIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTRBMTUwMEIyIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW50ZXJuYWxEb0ZpbHRlcigpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTRDMjcwMUMzIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMi4xLjIuMSIKKwkJCQkJb3JkaW5hbCAgICAJMTIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTRDQTUwMkJFIgorCQkJCXN1cHBsaWVyICAgCSIkVU5OQU1FRCQwIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNEJBRTAwNTYiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJzZXJ2aWNlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNENBNTAyQkYiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMS4yLjEuMi4yIgorCQkJCQlvcmRpbmFsICAgIAkxMworCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICIkVU5OQU1FRCQwIgorCQkJcXVpZCAgICAgICAJIjNERkU0QkFFMDA1NiIKKwkJCXN0ZXJlb3R5cGUgCSJTZXJ2bGV0IgorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJVFJVRQorCQkJbXVsdGkgICAgICAJRkFMU0UpKSkpCisJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0CisJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIgorCQlxdWlkICAgICAgIAkiM0RGREY2RDIwMjFCIgorCQl0aXRsZSAgICAgIAkiTWFpbiIKKwkJem9vbSAgICAgICAJMTAwCisJCW1heF9oZWlnaHQgCTI4MzUwCisJCW1heF93aWR0aCAgCTIxNjAwCisJCW9yaWdpbl94ICAgCTAKKwkJb3JpZ2luX3kgICAJMAorCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpCisJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJoaWdoIGxldmVsIHBhY2thZ2luZyIKKwkJcXVpZCAgICAgICAJIjNFNDJERTc1MDA0QiIKKwkJdGl0bGUgICAgICAJImhpZ2ggbGV2ZWwgcGFja2FnaW5nIgorCQl6b29tICAgICAgIAkxMDAKKwkJbWF4X2hlaWdodCAJMjgzNTAKKwkJbWF4X3dpZHRoICAJMjE2MDAKKwkJb3JpZ2luX3ggICAJMAorCQlvcmlnaW5feSAgIAkwCisJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0CisJCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hIiBAOTEKKwkJCWxvY2F0aW9uICAgCSgxMDI0LCA3NTIpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDkxCisJCQkgICAgbG9jYXRpb24gICAJKDc4MCwgNjY4KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTQ4OAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkib3JnLmFwYWNoZS5jYXRhbGluYSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0U0MkRFOEQwMDgyIgorCQkJd2lkdGggICAgICAJNTAwCisJCQloZWlnaHQgICAgIAkxODEpCisJCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNveW90ZSIgQDkyCisJCQlsb2NhdGlvbiAgIAkoNTEyLCAxMTg0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA5MgorCQkJICAgIGxvY2F0aW9uICAgCSgyMzcsIDEwOTApCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJNTUwCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJvcmcuYXBhY2hlLmNveW90ZSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0U0MkRFOUYwMTMyIgorCQkJd2lkdGggICAgICAJNTYzCisJCQloZWlnaHQgICAgIAkyMDApCisJCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLnRvbWNhdC51dGlsIiBAOTMKKwkJCWxvY2F0aW9uICAgCSgxOTIwLCAxMTA0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA5MworCQkJICAgIGxvY2F0aW9uICAgCSgxNjcwLCAxMDIwKQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTUwMAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkib3JnLmFwYWNoZS50b21jYXQudXRpbCIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0U0MkRFREYwMUYyIgorCQkJd2lkdGggICAgICAJNTEyCisJCQloZWlnaHQgICAgIAkxODEpCisJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDk0CisJCQlzdGVyZW90eXBlIAlUUlVFCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlxdWlkdSAgICAgIAkiM0U0MkRFRjYwMUVCIgorCQkJY2xpZW50ICAgICAJQDkxCisJCQlzdXBwbGllciAgIAlAOTMKKwkJCWxpbmVfc3R5bGUgCTApCisJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDk1CisJCQlzdGVyZW90eXBlIAlUUlVFCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlxdWlkdSAgICAgIAkiM0U0MkRFRkMwMEIzIgorCQkJY2xpZW50ICAgICAJQDkyCisJCQlzdXBwbGllciAgIAlAOTMKKwkJCWxpbmVfc3R5bGUgCTApCisJCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmphc3BlciIgQDk2CisJCQlsb2NhdGlvbiAgIAkoMTcyOCwgNjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA5NgorCQkJICAgIGxvY2F0aW9uICAgCSgxNDM3LCA1NDApCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJNTgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJvcmcuYXBhY2hlLmphc3BlciIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0U0MkRFRkYwMjcwIgorCQkJd2lkdGggICAgICAJNTk0CisJCQloZWlnaHQgICAgIAkxODEpCisJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDk3CisJCQlzdGVyZW90eXBlIAlUUlVFCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlxdWlkdSAgICAgIAkiM0U0MkRGNzAwMDYwIgorCQkJY2xpZW50ICAgICAJQDkxCisJCQlzdXBwbGllciAgIAlAOTIKKwkJCWxpbmVfc3R5bGUgCTApCisJCSAgICAob2JqZWN0IE5vdGVWaWV3IEA5OAorCQkJbG9jYXRpb24gICAJKDEyMDAsIDIwOCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAOTgKKwkJCSAgICBsb2NhdGlvbiAgIAkoODQ3LCAxNDMpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJNjcxCisJCQkgICAgbGFiZWwgICAgICAJIkhpZ2ggTGV2ZWwgcGFja2FnZSBkZXBlbmRlbmNpZXMiKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXdpZHRoICAgICAgCTczMQorCQkJaGVpZ2h0ICAgICAJMTQzKQorCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5uYW1pbmciIEA5OQorCQkJbG9jYXRpb24gICAJKDM1MiwgMzA0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA5OQorCQkJICAgIGxvY2F0aW9uICAgCSg4MywgMjIwKQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTUzOAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkib3JnLmFwYWNoZS5uYW1pbmciKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNFNDNEMTU4MDMzOSIKKwkJCXdpZHRoICAgICAgCTU1MAorCQkJaGVpZ2h0ICAgICAJMTgxKQorCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAxMDAKKwkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCXF1aWR1ICAgICAgCSIzRTQzRDE2NTAzOUMiCisJCQljbGllbnQgICAgIAlAOTEKKwkJCXN1cHBsaWVyICAgCUA5OQorCQkJbGluZV9zdHlsZSAJMCkpKQorCSAgICAob2JqZWN0IEludGVyYWN0aW9uRGlhZ3JhbSAiMS4gY2F0YWxpbmFfbG9hZCIKKwkJbWVjaGFuaXNtX3JlZiAJQDgyCisJCXF1aWQgICAgICAgCSIzREZERjhFRTAyNjciCisJCXRpdGxlICAgICAgCSIxLiBjYXRhbGluYV9sb2FkIgorCQl6b29tICAgICAgIAkxMDAKKwkJbWF4X2hlaWdodCAJMjgzNTAKKwkJbWF4X3dpZHRoICAJMjE2MDAKKwkJb3JpZ2luX3ggICAJMAorCQlvcmlnaW5feSAgIAk1MTkKKwkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJCb290c3RyYXAiIEAxMDEKKwkJCWxvY2F0aW9uICAgCSgyMjQsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjI0LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiQm9vdHN0cmFwIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZERjhGRDAzNDUiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTE5NzIKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDEwMgorCQkJICAgIGxvY2F0aW9uICAgCSgyMjQsIDM2OCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTAxCisJCQkgICAgaGVpZ2h0ICAgICAJMTczOAorCQkJICAgIHlfY29vcmQgICAgCTE2NzgKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTAzCisJCQkgICAgbG9jYXRpb24gICAJKDIyNCwgMzY4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxMDEKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJEaWdlc3RlciIgQDEwNAorCQkJbG9jYXRpb24gICAJKDg5NiwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDEwNAorCQkJICAgIGxvY2F0aW9uICAgCSg4OTYsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJEaWdlc3RlciIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGREZBRjIwMUExIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxOTcyCisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxMDUKKwkJCSAgICBsb2NhdGlvbiAgIAkoODk2LCAxMjMyKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxMDQKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTA2CisJCQkgICAgbG9jYXRpb24gICAJKDg5NiwgMTMxMikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTA0CisJCQkgICAgaGVpZ2h0ICAgICAJMjY0CisJCQkgICAgeV9jb29yZCAgICAJMjA0CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIiBAMTA3CisJCQlsb2NhdGlvbiAgIAkoMTIzMiwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDEwNworCQkJICAgIGxvY2F0aW9uICAgCSgxMjMyLCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkRGQjRCMDIxNyIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMTk3MgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTA4CisJCQkgICAgbG9jYXRpb24gICAJKDEyMzIsIDEzMjgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDEwNworCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJHbG9iYWxSZXNvdXJjZXNMaWZlY3ljbGVMaXN0ZW5lciIgQDEwOQorCQkJbG9jYXRpb24gICAJKDE1NjgsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTU2OCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkzMjIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIkdsb2JhbFJlc291cmNlc0xpZmVjeWNsZUxpc3RlbmVyIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZERkI3QTAyQUIiCisJCQl3aWR0aCAgICAgIAkzNDAKKwkJCWhlaWdodCAgICAgCTE5NzIKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDExMAorCQkJICAgIGxvY2F0aW9uICAgCSgxNTY4LCAxNDU2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxMDkKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU2VjdXJpdHlDb25maWciIEAxMTEKKwkJCWxvY2F0aW9uICAgCSgxOTIwLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTExCisJCQkgICAgbG9jYXRpb24gICAJKDE5MjAsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTZWN1cml0eUNvbmZpZyIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGREZCRDgwMkJBIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxOTcyCisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxMTIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTkyMCwgMTYwMCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTExCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDExMworCQkJICAgIGxvY2F0aW9uICAgCSgxOTIwLCAxNjgwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxMTEKKwkJCSAgICBoZWlnaHQgICAgIAkxNDYKKwkJCSAgICB5X2Nvb3JkICAgIAk4NgorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxMTQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTkyMCwgMTc2MCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTExCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMTE1CisJCQlsb2NhdGlvbiAgIAkoMTYsIDM2OCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYKKwkJCSAgICBQYXJlbnRfVmlldyAJQDExNQorCQkJICAgIGxvY2F0aW9uICAgCSgzMTUsIDMyNCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZERjkyMTAwMDkiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkzNDAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImluaXRDbGFzc0xvYWRlcnMoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTAxCisJCQlzdXBwbGllciAgIAlAMTAxCisJCQlGb2N1c19TcmMgIAlAMTAyCisJCQlGb2N1c19FbnRyeSAJQDEwMworCQkJb3JpZ2luICAgICAJKDI0MCwgMzY4KQorCQkJdGVybWludXMgICAJKDM5MCwgMzY4KQorCQkJb3JkaW5hbCAgICAJMCkKKwkJICAgIChvYmplY3QgTm90ZVZpZXcgQDExNworCQkJbG9jYXRpb24gICAJKDExNTIsIDEwNzIpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDExNworCQkJICAgIGxvY2F0aW9uICAgCSgxMDE0LCAxMDEyKQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI0MAorCQkJICAgIGxhYmVsICAgICAgCSJwYXJzZSBzZXJ2ZXIueG1sIikKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTEzMikKKwkJICAgIChvYmplY3QgTm90ZVZpZXcgQDExOAorCQkJbG9jYXRpb24gICAJKDEzNzYsIDgwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTIzOCwgMjApCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjQwCisJCQkgICAgbGFiZWwgICAgICAJIk1CZWFucyIpCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxMzIpCisJCSAgICAob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDExOQorCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDExOAorCQkJc3VwcGxpZXIgICAJQDEwNworCQkJbGluZV9zdHlsZSAJMCkKKwkJICAgIChvYmplY3QgQXR0YWNoVmlldyAiIiBAMTIwCisJCQlzdGVyZW90eXBlIAlUUlVFCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTA5CisJCQlzdXBwbGllciAgIAlAMTE4CisJCQlsaW5lX3N0eWxlIAkwKQorCQkgICAgKG9iamVjdCBOb3RlVmlldyBAMTIxCisJCQlsb2NhdGlvbiAgIAkoMjE2MCwgMjE3NikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxCisJCQkgICAgbG9jYXRpb24gICAJKDE5NDcsIDIxMTMpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMzkwCisJCQkgICAgbGFiZWwgICAgICAJIiMxQ2F0YWxpbmEubG9hZCgpIikKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQl3aWR0aCAgICAgIAk0NTAKKwkJCWhlaWdodCAgICAgCTEzOCkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJDYXRhbGluYSIgQDEyMgorCQkJbG9jYXRpb24gICAJKDU2MCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDEyMgorCQkJICAgIGxvY2F0aW9uICAgCSg1NjAsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJDYXRhbGluYSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGREY5MEEwMzMwIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxOTcyCisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxMjMKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTYwLCA0NjQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDEyMgorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxMjQKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTYwLCA2MDgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDEyMgorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxMjUKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTYwLCA3MjApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDEyMgorCQkJICAgIGhlaWdodCAgICAgCTEzMjYKKwkJCSAgICB5X2Nvb3JkICAgIAkxMjY2CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDEyNgorCQkJICAgIGxvY2F0aW9uICAgCSg1NjAsIDg5NikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTIyCisJCQkgICAgaGVpZ2h0ICAgICAJMTk0CisJCQkgICAgeV9jb29yZCAgICAJMTM0CisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTI3CisJCQkgICAgbG9jYXRpb24gICAJKDU2MCwgODk2KQorCQkJICAgIEludGVyT2JqVmlldyAJQDEyMgorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDEyOAorCQkJICAgIGxvY2F0aW9uICAgCSg1NjAsIDEwMjQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDEyMgorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDEyOQorCQkJICAgIGxvY2F0aW9uICAgCSg1NjAsIDEwMjQpCisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTIyCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTMwCisJCQkgICAgbG9jYXRpb24gICAJKDU2MCwgMTE1MikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTIyCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTMxCisJCQkgICAgbG9jYXRpb24gICAJKDU2MCwgMTE1MikKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxMjIKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAxMzIKKwkJCWxvY2F0aW9uICAgCSgxNiwgODk2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMworCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyCisJCQkgICAgbG9jYXRpb24gICAJKDY1MSwgODUyKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkRGQTgwMDFEQSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE2MAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW5pdERpcnMoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTIyCisJCQlzdXBwbGllciAgIAlAMTIyCisJCQlGb2N1c19TcmMgIAlAMTI3CisJCQlGb2N1c19FbnRyeSAJQDEyNgorCQkJb3JpZ2luICAgICAJKDU3NiwgODk2KQorCQkJdGVybWludXMgICAJKDcyNiwgODk2KQorCQkJb3JkaW5hbCAgICAJNCkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAxMzQKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTAyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUKKwkJCSAgICBQYXJlbnRfVmlldyAJQDEzNAorCQkJICAgIGxvY2F0aW9uICAgCSg3MDEsIDk4MSkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZERkE4QjAzNDciCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkyMjgKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImluaXROYW1pbmcoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjg0MDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ0CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTIyCisJCQlzdXBwbGllciAgIAlAMTIyCisJCQlGb2N1c19TcmMgIAlAMTI5CisJCQlGb2N1c19FbnRyeSAJQDEyOAorCQkJb3JpZ2luICAgICAJKDU3NiwgMTAyNCkKKwkJCXRlcm1pbnVzICAgCSg3MjYsIDEwMjQpCisJCQlvcmRpbmFsICAgIAk1KQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDEzNgorCQkJbG9jYXRpb24gICAJKDE2LCAxMTUyKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNworCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2CisJCQkgICAgbG9jYXRpb24gICAJKDY4NiwgMTEwOSkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZERkFBRDAxQUMiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxODAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImluaXRpYWxpemUoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjczMzMzMworCQkJICAgIGhlaWdodCAgICAgCTQ0CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTIyCisJCQlzdXBwbGllciAgIAlAMTIyCisJCQlGb2N1c19TcmMgIAlAMTMxCisJCQlGb2N1c19FbnRyeSAJQDEzMAorCQkJb3JpZ2luICAgICAJKDU3NiwgMTE1MikKKwkJCXRlcm1pbnVzICAgCSg3MjYsIDExNTIpCisJCQlvcmRpbmFsICAgIAk2KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAxMzgKKwkJCWxvY2F0aW9uICAgCSgxNiwgNDY0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOQorCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4CisJCQkgICAgbG9jYXRpb24gICAJKDM4OSwgNDM3KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkRGOTFBMDEwRCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTI2NQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkibmV3SW5zdGFuY2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjQ5NTA4MgorCQkJICAgIGhlaWdodCAgICAgCTI4CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTAxCisJCQlzdXBwbGllciAgIAlAMTIyCisJCQlGb2N1c19TcmMgIAlAMTAyCisJCQlGb2N1c19FbnRyeSAJQDEyMworCQkJb3JpZ2luICAgICAJKDIzOSwgNDY0KQorCQkJdGVybWludXMgICAJKDU0NCwgNDY0KQorCQkJb3JkaW5hbCAgICAJMSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMTQwCisJCQlsb2NhdGlvbiAgIAkoMTYsIDYwOCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDEKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE0MAorCQkJICAgIGxvY2F0aW9uICAgCSg0NTYsIDU2NSkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZERjk3OTAwQzIiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk0NDUKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInNldFBhcmVudENsYXNzTG9hZGVyKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC43MTE0NzUKKwkJCSAgICBoZWlnaHQgICAgIAk0NAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDEwMQorCQkJc3VwcGxpZXIgICAJQDEyMgorCQkJRm9jdXNfU3JjICAJQDEwMgorCQkJRm9jdXNfRW50cnkgCUAxMjQKKwkJCW9yaWdpbiAgICAgCSgyMzksIDYwOCkKKwkJCXRlcm1pbnVzICAgCSg1NDQsIDYwOCkKKwkJCW9yZGluYWwgICAgCTIpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDE0MgorCQkJbG9jYXRpb24gICAJKDE2LCA3MjApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzCisJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMzkxLCA2NzYpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGREZBMzQwMkYyIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTA4CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJsb2FkKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDEwMQorCQkJc3VwcGxpZXIgICAJQDEyMgorCQkJRm9jdXNfU3JjICAJQDEwMgorCQkJRm9jdXNfRW50cnkgCUAxMjUKKwkJCW9yaWdpbiAgICAgCSgyMzksIDcyMCkKKwkJCXRlcm1pbnVzICAgCSg1NDQsIDcyMCkKKwkJCW9yZGluYWwgICAgCTMpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDE0NAorCQkJbG9jYXRpb24gICAJKDE2LCAxMjMyKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NQorCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0CisJCQkgICAgbG9jYXRpb24gICAJKDcyNywgMTE4OCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZERkFGODAwQzQiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkzMDIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImNyZWF0ZURpZ2VzdGVyKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDEyMgorCQkJc3VwcGxpZXIgICAJQDEwNAorCQkJRm9jdXNfU3JjICAJQDEyNQorCQkJRm9jdXNfRW50cnkgCUAxMDUKKwkJCW9yaWdpbiAgICAgCSg1NzUsIDEyMzIpCisJCQl0ZXJtaW51cyAgIAkoODgwLCAxMjMyKQorCQkJb3JkaW5hbCAgICAJNykKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMTQ2CisJCQlsb2NhdGlvbiAgIAkoMTYsIDEzMTIpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ3CisJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDYKKwkJCSAgICBsb2NhdGlvbiAgIAkoNzI3LCAxMjY4KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkRGQjAxMDBCMiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTEzNgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkicGFyc2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTIyCisJCQlzdXBwbGllciAgIAlAMTA0CisJCQlGb2N1c19TcmMgIAlAMTI1CisJCQlGb2N1c19FbnRyeSAJQDEwNgorCQkJb3JpZ2luICAgICAJKDU3NSwgMTMxMikKKwkJCXRlcm1pbnVzICAgCSg4ODAsIDEzMTIpCisJCQlvcmRpbmFsICAgIAk4KQorCQkgICAgKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAxNDgKKwkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxNDcKKwkJCXN1cHBsaWVyICAgCUAxMTcKKwkJCWxpbmVfc3R5bGUgCTApCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDE0OQorCQkJbG9jYXRpb24gICAJKDE2LCAxMzI4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ5CisJCQkgICAgbG9jYXRpb24gICAJKDEwNjMsIDEyODQpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGREZCODQwMEE3IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjY1CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJuZXdJbnN0YW5jZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxMDQKKwkJCXN1cHBsaWVyICAgCUAxMDcKKwkJCUZvY3VzX1NyYyAgCUAxMDYKKwkJCUZvY3VzX0VudHJ5IAlAMTA4CisJCQlvcmlnaW4gICAgIAkoOTExLCAxMzI4KQorCQkJdGVybWludXMgICAJKDEyMTYsIDEzMjgpCisJCQlvcmRpbmFsICAgIAk5KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAxNTEKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTQ1NikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTIKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE1MQorCQkJICAgIGxvY2F0aW9uICAgCSgxMjMxLCAxNDEyKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkRGQjkyMDE0OCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTI2NQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkibmV3SW5zdGFuY2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTA0CisJCQlzdXBwbGllciAgIAlAMTA5CisJCQlGb2N1c19TcmMgIAlAMTA2CisJCQlGb2N1c19FbnRyeSAJQDExMAorCQkJb3JpZ2luICAgICAJKDkxMSwgMTQ1NikKKwkJCXRlcm1pbnVzICAgCSgxNTUyLCAxNDU2KQorCQkJb3JkaW5hbCAgICAJMTApCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDE1MworCQkJbG9jYXRpb24gICAJKDE2LCAxNjAwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1NAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTUzCisJCQkgICAgbG9jYXRpb24gICAJKDEyMzksIDE1NTYpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGREZCRUEwMEMyIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjY1CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJuZXdJbnN0YW5jZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxMjIKKwkJCXN1cHBsaWVyICAgCUAxMTEKKwkJCUZvY3VzX1NyYyAgCUAxMjUKKwkJCUZvY3VzX0VudHJ5IAlAMTEyCisJCQlvcmlnaW4gICAgIAkoNTc1LCAxNjAwKQorCQkJdGVybWludXMgICAJKDE5MDQsIDE2MDApCisJCQlvcmRpbmFsICAgIAkxMSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMTU1CisJCQlsb2NhdGlvbiAgIAkoMTYsIDE2ODApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU2CisJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTUKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTIzOSwgMTYzNikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZERkJGNDAxRjIiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk0MjUKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInNldFBhY2thZ2VEZWZpbml0aW9uKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDEyMgorCQkJc3VwcGxpZXIgICAJQDExMQorCQkJRm9jdXNfU3JjICAJQDEyNQorCQkJRm9jdXNfRW50cnkgCUAxMTMKKwkJCW9yaWdpbiAgICAgCSg1NzUsIDE2ODApCisJCQl0ZXJtaW51cyAgIAkoMTkwNCwgMTY4MCkKKwkJCW9yZGluYWwgICAgCTEyKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAxNTcKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTc2MCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTgKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE1NworCQkJICAgIGxvY2F0aW9uICAgCSgxMjM5LCAxNzE2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkRGQzEyMDNDMiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTM4NgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic2V0UGFja2FnZUFjY2VzcygpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxMjIKKwkJCXN1cHBsaWVyICAgCUAxMTEKKwkJCUZvY3VzX1NyYyAgCUAxMjUKKwkJCUZvY3VzX0VudHJ5IAlAMTE0CisJCQlvcmlnaW4gICAgIAkoNTc1LCAxNzYwKQorCQkJdGVybWludXMgICAJKDE5MDQsIDE3NjApCisJCQlvcmRpbmFsICAgIAkxMykpKQorCSAgICAob2JqZWN0IEludGVyYWN0aW9uRGlhZ3JhbSAiMi4gY2F0YWxpbmFfaW5pdGxpYXplIgorCQltZWNoYW5pc21fcmVmIAlAODMKKwkJcXVpZCAgICAgICAJIjNERkRGQzQ0MDAyQSIKKwkJdGl0bGUgICAgICAJIjIuIGNhdGFsaW5hX2luaXRsaWF6ZSIKKwkJem9vbSAgICAgICAJMTAwCisJCW1heF9oZWlnaHQgCTI4MzUwCisJCW1heF93aWR0aCAgCTIxNjAwCisJCW9yaWdpbl94ICAgCTAKKwkJb3JpZ2luX3kgICAJODcKKwkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJDYXRhbGluYSIgQDE1OQorCQkJbG9jYXRpb24gICAJKDE3NiwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE1OQorCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJDYXRhbGluYSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGREZDOEYwMTVGIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxMTgwCisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxNjAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCA0MDApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDE1OQorCQkJICAgIGhlaWdodCAgICAgCTkxNAorCQkJICAgIHlfY29vcmQgICAgCTg1NAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZFNlcnZlciIgQDE2MQorCQkJbG9jYXRpb24gICAJKDQ5NiwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE2MQorCQkJICAgIGxvY2F0aW9uICAgCSg0OTYsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZFNlcnZlciIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGREZDQ0IwMDZCIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxMTgwCisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxNjIKKwkJCSAgICBsb2NhdGlvbiAgIAkoNDk2LCA0MDApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDE2MQorCQkJICAgIGhlaWdodCAgICAgCTg1NAorCQkJICAgIHlfY29vcmQgICAgCTc5NAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxNjMKKwkJCSAgICBsb2NhdGlvbiAgIAkoNDk2LCA0ODApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDE2MQorCQkJICAgIGhlaWdodCAgICAgCTc2OAorCQkJICAgIHlfY29vcmQgICAgCTcwOAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkU2VydmljZSIgQDE2NAorCQkJbG9jYXRpb24gICAJKDgzMiwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE2NAorCQkJICAgIGxvY2F0aW9uICAgCSg4MzIsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZFNlcnZpY2UiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkRGRDM3MDAyMCIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMTE4MAorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTY1CisJCQkgICAgbG9jYXRpb24gICAJKDgzMiwgNDgwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxNjQKKwkJCSAgICBoZWlnaHQgICAgIAk3MDgKKwkJCSAgICB5X2Nvb3JkICAgIAk2NDgKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiQ295b3RlQ29ubmVjdG9yIiBAMTY2CisJCQlsb2NhdGlvbiAgIAkoMTE2OCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE2NgorCQkJICAgIGxvY2F0aW9uICAgCSgxMTY4LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiQ295b3RlQ29ubmVjdG9yIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZERkU4MTAzMTMiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTExODAKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDE2NworCQkJICAgIGxvY2F0aW9uICAgCSgxMTY4LCA1MjgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDE2NgorCQkJICAgIGhlaWdodCAgICAgCTYwMAorCQkJICAgIHlfY29vcmQgICAgCTU0MAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJDb3lvdGVBZGFwdGVyIiBAMTY4CisJCQlsb2NhdGlvbiAgIAkoMTUwNCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE2OAorCQkJICAgIGxvY2F0aW9uICAgCSgxNTA0LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiQ295b3RlQWRhcHRlciIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGREZGQTAwMjI2IgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxMTgwCisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxNjkKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTUwNCwgNTc2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxNjgKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiSHR0cDExUHJvdG9jb2wiIEAxNzAKKwkJCWxvY2F0aW9uICAgCSgxODA4LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTcwCisJCQkgICAgbG9jYXRpb24gICAJKDE4MDgsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJIdHRwMTFQcm90b2NvbCIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTAxNjYwMUE2IgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxMTgwCisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxNzEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTgwOCwgNzA0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxNzAKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTcyCisJCQkgICAgbG9jYXRpb24gICAJKDE4MDgsIDgzMikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTcwCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIkprQ295b3RlQWRhcHRlciIgQDE3MworCQkJbG9jYXRpb24gICAJKDIxNDQsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjE0NCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIkprQ295b3RlQWRhcHRlciIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTAxQUQwMUE4IgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxMTgwCisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxNzQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjE0NCwgOTI4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxNzMKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTc1CisJCQkgICAgbG9jYXRpb24gICAJKDIxNDQsIDEwMDgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDE3MworCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMTc2CisJCQlsb2NhdGlvbiAgIAkoMTYsIDQwMCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzcKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE3NgorCQkJICAgIGxvY2F0aW9uICAgCSgzMzUsIDM1NikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZERkQxRjAwNzYiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxODAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImluaXRpYWxpemUoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTU5CisJCQlzdXBwbGllciAgIAlAMTYxCisJCQlGb2N1c19TcmMgIAlAMTYwCisJCQlGb2N1c19FbnRyeSAJQDE2MgorCQkJb3JpZ2luICAgICAJKDE5MSwgNDAwKQorCQkJdGVybWludXMgICAJKDQ4MCwgNDAwKQorCQkJb3JkaW5hbCAgICAJMCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMTc4CisJCQlsb2NhdGlvbiAgIAkoMTYsIDQ4MCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzkKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE3OAorCQkJICAgIGxvY2F0aW9uICAgCSg2NjMsIDQzNikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZERkQzRDAxQzQiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxODAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImluaXRpYWxpemUoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTYxCisJCQlzdXBwbGllciAgIAlAMTY0CisJCQlGb2N1c19TcmMgIAlAMTYzCisJCQlGb2N1c19FbnRyeSAJQDE2NQorCQkJb3JpZ2luICAgICAJKDUxMSwgNDgwKQorCQkJdGVybWludXMgICAJKDgxNiwgNDgwKQorCQkJb3JkaW5hbCAgICAJMSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMTgwCisJCQlsb2NhdGlvbiAgIAkoMTYsIDUyOCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODEKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE4MAorCQkJICAgIGxvY2F0aW9uICAgCSg5OTksIDQ4NCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZERkU5OTAzMDUiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxODAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImluaXRpYWxpemUoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTY0CisJCQlzdXBwbGllciAgIAlAMTY2CisJCQlGb2N1c19TcmMgIAlAMTY1CisJCQlGb2N1c19FbnRyeSAJQDE2NworCQkJb3JpZ2luICAgICAJKDg0NywgNTI4KQorCQkJdGVybWludXMgICAJKDExNTIsIDUyOCkKKwkJCW9yZGluYWwgICAgCTIpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDE4MgorCQkJbG9jYXRpb24gICAJKDE2LCA1NzYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgzCisJCQkgICAgUGFyZW50X1ZpZXcgCUAxODIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTMzNSwgNTMyKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwMTNEMDIxNyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTEwNgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkibmV3KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDE2NgorCQkJc3VwcGxpZXIgICAJQDE2OAorCQkJRm9jdXNfU3JjICAJQDE2NworCQkJRm9jdXNfRW50cnkgCUAxNjkKKwkJCW9yaWdpbiAgICAgCSgxMTgzLCA1NzYpCisJCQl0ZXJtaW51cyAgIAkoMTQ4OCwgNTc2KQorCQkJb3JkaW5hbCAgICAJMykKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMTg0CisJCQlsb2NhdGlvbiAgIAkoMTUwNCwgNzA0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4NQorCQkJICAgIFBhcmVudF9WaWV3IAlAMTg0CisJCQkgICAgbG9jYXRpb24gICAJKDE0ODcsIDY2MCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDE4MzAzMzAiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMDYKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIm5ldygpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxNjYKKwkJCXN1cHBsaWVyICAgCUAxNzAKKwkJCUZvY3VzX1NyYyAgCUAxNjcKKwkJCUZvY3VzX0VudHJ5IAlAMTcxCisJCQlvcmlnaW4gICAgIAkoMTE4MywgNzA0KQorCQkJdGVybWludXMgICAJKDE3OTIsIDcwNCkKKwkJCW9yZGluYWwgICAgCTQpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDE4NgorCQkJbG9jYXRpb24gICAJKDE1MDQsIDgzMikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODcKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE4NgorCQkJICAgIGxvY2F0aW9uICAgCSgxNDg3LCA3ODgpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTAxODgwMzJDIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJODAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImluaXQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTY2CisJCQlzdXBwbGllciAgIAlAMTcwCisJCQlGb2N1c19TcmMgIAlAMTY3CisJCQlGb2N1c19FbnRyeSAJQDE3MgorCQkJb3JpZ2luICAgICAJKDExODMsIDgzMikKKwkJCXRlcm1pbnVzICAgCSgxNzkyLCA4MzIpCisJCQlvcmRpbmFsICAgIAk1KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAxODgKKwkJCWxvY2F0aW9uICAgCSgxNiwgOTI4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4OQorCQkJICAgIFBhcmVudF9WaWV3IAlAMTg4CisJCQkgICAgbG9jYXRpb24gICAJKDE2NTUsIDg4NCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDFCQzAzOEMiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMDYKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIm5ldygpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxNjYKKwkJCXN1cHBsaWVyICAgCUAxNzMKKwkJCUZvY3VzX1NyYyAgCUAxNjcKKwkJCUZvY3VzX0VudHJ5IAlAMTc0CisJCQlvcmlnaW4gICAgIAkoMTE4MywgOTI4KQorCQkJdGVybWludXMgICAJKDIxMjgsIDkyOCkKKwkJCW9yZGluYWwgICAgCTYpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDE5MAorCQkJbG9jYXRpb24gICAJKDE2LCAxMDA4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5MQorCQkJICAgIFBhcmVudF9WaWV3IAlAMTkwCisJCQkgICAgbG9jYXRpb24gICAJKDE2NTUsIDk2NCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDFDMzAxNjQiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk4MAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW5pdCgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxNjYKKwkJCXN1cHBsaWVyICAgCUAxNzMKKwkJCUZvY3VzX1NyYyAgCUAxNjcKKwkJCUZvY3VzX0VudHJ5IAlAMTc1CisJCQlvcmlnaW4gICAgIAkoMTE4MywgMTAwOCkKKwkJCXRlcm1pbnVzICAgCSgyMTI4LCAxMDA4KQorCQkJb3JkaW5hbCAgICAJNykKKwkJICAgIChvYmplY3QgTm90ZVZpZXcgQDE5MgorCQkJbG9jYXRpb24gICAJKDIxNDQsIDIwMTYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE5MgorCQkJICAgIGxvY2F0aW9uICAgCSgxOTQ3LCAxOTU3KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTM1OQorCQkJICAgIGxhYmVsICAgICAgCSIjMiBDYXRhbGluYS5pbml0aWFsaXplKCkiKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXdpZHRoICAgICAgCTQxOQorCQkJaGVpZ2h0ICAgICAJMTMxKSkpCisJICAgIChvYmplY3QgSW50ZXJhY3Rpb25EaWFncmFtICIzLiBjYXRhbGluYV9zdGFydCIKKwkJbWVjaGFuaXNtX3JlZiAJQDg0CisJCXF1aWQgICAgICAgCSIzREZFMDI2RDAyRDEiCisJCXRpdGxlICAgICAgCSIzLiBjYXRhbGluYV9zdGFydCIKKwkJem9vbSAgICAgICAJMTAwCisJCW1heF9oZWlnaHQgCTI4MzUwCisJCW1heF93aWR0aCAgCTIxNjAwCisJCW9yaWdpbl94ICAgCTAKKwkJb3JpZ2luX3kgICAJMjQ4MQorCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIkJvb3RzdHJhcCIgQDE5MworCQkJbG9jYXRpb24gICAJKDE5MiwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE5MworCQkJICAgIGxvY2F0aW9uICAgCSgxOTIsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJCb290c3RyYXAiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUwMjc3MDBGNSIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMjkxMgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTk0CisJCQkgICAgbG9jYXRpb24gICAJKDE5MiwgMzg0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxOTMKKwkJCSAgICBoZWlnaHQgICAgIAkyNjYyCisJCQkgICAgeV9jb29yZCAgICAJMjYwMgorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJDYXRhbGluYSIgQDE5NQorCQkJbG9jYXRpb24gICAJKDQ4MCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE5NQorCQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJDYXRhbGluYSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTAyN0QwMDY3IgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkyOTEyCisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxOTYKKwkJCSAgICBsb2NhdGlvbiAgIAkoNDgwLCAzODQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDE5NQorCQkJICAgIGhlaWdodCAgICAgCTI2MDIKKwkJCSAgICB5X2Nvb3JkICAgIAkyNTQyCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkU2VydmVyIiBAMTk3CisJCQlsb2NhdGlvbiAgIAkoNzg0LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTk3CisJCQkgICAgbG9jYXRpb24gICAJKDc4NCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkU2VydmVyIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFMDJCMzAwMTUiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTI5MTIKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDE5OAorCQkJICAgIGxvY2F0aW9uICAgCSg3ODQsIDQxNikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTk3CisJCQkgICAgaGVpZ2h0ICAgICAJMjUxMAorCQkJICAgIHlfY29vcmQgICAgCTI0NTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTk5CisJCQkgICAgbG9jYXRpb24gICAJKDc4NCwgNDgwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxOTcKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyMDAKKwkJCSAgICBsb2NhdGlvbiAgIAkoNzg0LCA1OTIpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDE5NworCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkU2VydmljZSIgQDIwMQorCQkJbG9jYXRpb24gICAJKDEwODgsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkU2VydmljZSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTAzMDQwMEUzIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkyOTEyCisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyMDIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgNzA0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyMDEKKwkJCSAgICBoZWlnaHQgICAgIAkyMTYyCisJCQkgICAgeV9jb29yZCAgICAJMjEwMgorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyMDMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgNzUyKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyMDEKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyMDQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgODY0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyMDEKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZEVuZ2luZSIgQDIwNQorCQkJbG9jYXRpb24gICAJKDE0MjQsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDUKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTQyNCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkzMzIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkRW5naW5lIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFMDM0NzAwQzIiCisJCQl3aWR0aCAgICAgIAkzNTAKKwkJCWhlaWdodCAgICAgCTI5MTIKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIwNgorCQkJICAgIGxvY2F0aW9uICAgCSgxNDI0LCA5NzYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDIwNQorCQkJICAgIGhlaWdodCAgICAgCTE4MzAKKwkJCSAgICB5X2Nvb3JkICAgIAkxNzcwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIwNworCQkJICAgIGxvY2F0aW9uICAgCSgxNDI0LCAxMDU2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyMDUKKwkJCSAgICBoZWlnaHQgICAgIAkxNzQ0CisJCQkgICAgeV9jb29yZCAgICAJMTY4NAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIwOAorCQkJICAgIGxvY2F0aW9uICAgCSgxNDI0LCAxMDU2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyMDUKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyMDkKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTQyNCwgMTE2OCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjA1CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjEwCisJCQkgICAgbG9jYXRpb24gICAJKDE0MjQsIDEyOTYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDIwNQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIxMQorCQkJICAgIGxvY2F0aW9uICAgCSgxNDI0LCAxNDA4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyMDUKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyMTIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTQyNCwgMTUzNikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjA1CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjEzCisJCQkgICAgbG9jYXRpb24gICAJKDE0MjQsIDE2NDgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDIwNQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkSG9zdCIgQDIxNAorCQkJbG9jYXRpb24gICAJKDE3NjAsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc2MCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkSG9zdCIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTAzRjIwMzVEIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkyOTEyCisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyMTUKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc2MCwgMTc2MCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjE0CisJCQkgICAgaGVpZ2h0ICAgICAJOTgwCisJCQkgICAgeV9jb29yZCAgICAJOTIwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIxNgorCQkJICAgIGxvY2F0aW9uICAgCSgxNzYwLCAxODA4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyMTQKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyMTcKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc2MCwgMTkyMCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjE0CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjE4CisJCQkgICAgbG9jYXRpb24gICAJKDE3NjAsIDIwMzIpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDIxNAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIxOQorCQkJICAgIGxvY2F0aW9uICAgCSgxNzYwLCAyMTQ0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyMTQKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyMjAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc2MCwgMjI1NikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjE0CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRQaXBlbGluZSIgQDIyMQorCQkJbG9jYXRpb24gICAJKDIwODAsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkzMjYKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkUGlwZWxpbmUiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUwNDdEMDA2RCIKKwkJCXdpZHRoICAgICAgCTM0NAorCQkJaGVpZ2h0ICAgICAJMjkxMgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjIyCisJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDIzNjgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDIyMQorCQkJICAgIGhlaWdodCAgICAgCTMxMgorCQkJICAgIHlfY29vcmQgICAgCTI1MgorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyMjMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgMjQxNikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjIxCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjI0CisJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDI0ODApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDIyMQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIyNQorCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCAyNTYwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyMjEKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMjI2CisJCQlsb2NhdGlvbiAgIAkoMTYsIDM4NCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjcKKwkJCSAgICBQYXJlbnRfVmlldyAJQDIyNgorCQkJICAgIGxvY2F0aW9uICAgCSgzMzUsIDM0MCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDI4MzAzNzQiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMTAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInN0YXJ0KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDE5MworCQkJc3VwcGxpZXIgICAJQDE5NQorCQkJRm9jdXNfU3JjICAJQDE5NAorCQkJRm9jdXNfRW50cnkgCUAxOTYKKwkJCW9yaWdpbiAgICAgCSgyMDcsIDM4NCkKKwkJCXRlcm1pbnVzICAgCSg0NjQsIDM4NCkKKwkJCW9yZGluYWwgICAgCTApCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDIyOAorCQkJbG9jYXRpb24gICAJKDE2LCA0MTYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjI5CisJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjgKKwkJCSAgICBsb2NhdGlvbiAgIAkoNjMxLCAzNzIpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTAyQkEwMTg4IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTEwCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJzdGFydCgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxOTUKKwkJCXN1cHBsaWVyICAgCUAxOTcKKwkJCUZvY3VzX1NyYyAgCUAxOTYKKwkJCUZvY3VzX0VudHJ5IAlAMTk4CisJCQlvcmlnaW4gICAgIAkoNDk1LCA0MTYpCisJCQl0ZXJtaW51cyAgIAkoNzY4LCA0MTYpCisJCQlvcmRpbmFsICAgIAkxKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDIzMAorCQkJbG9jYXRpb24gICAJKDE2LCA0ODApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMxCisJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTI0NCwgNDM3KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwMkQzMDA2QyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTg1NAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9TVEFSVF9FVkVOVCkiCisJCQkgICAgcGN0RGlzdCAgICAJMi45NjAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDE5NworCQkJc3VwcGxpZXIgICAJQDE5NworCQkJRm9jdXNfU3JjICAJQDE5OAorCQkJRm9jdXNfRW50cnkgCUAxOTkKKwkJCW9yaWdpbiAgICAgCSg4MDAsIDQ4MCkKKwkJCXRlcm1pbnVzICAgCSg5NTAsIDQ4MCkKKwkJCW9yZGluYWwgICAgCTIpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMjMyCisJCQlsb2NhdGlvbiAgIAkoMTYsIDU5MikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzMKKwkJCSAgICBQYXJlbnRfVmlldyAJQDIzMgorCQkJICAgIGxvY2F0aW9uICAgCSgxMTQ2LCA1NDkpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTAyREYwMkRGIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJNjU4CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJmaXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQpIgorCQkJICAgIHBjdERpc3QgICAgCTIuMzEzMzMzCisJCQkgICAgaGVpZ2h0ICAgICAJNDQKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxOTcKKwkJCXN1cHBsaWVyICAgCUAxOTcKKwkJCUZvY3VzX1NyYyAgCUAxOTgKKwkJCUZvY3VzX0VudHJ5IAlAMjAwCisJCQlvcmlnaW4gICAgIAkoODAwLCA1OTIpCisJCQl0ZXJtaW51cyAgIAkoOTUwLCA1OTIpCisJCQlvcmRpbmFsICAgIAkzKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAyMzQKKwkJCWxvY2F0aW9uICAgCSgxNiwgNzA0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzNQorCQkJICAgIFBhcmVudF9WaWV3IAlAMjM0CisJCQkgICAgbG9jYXRpb24gICAJKDkzNSwgNjYwKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwMzBDMDJCMyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTExMAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic3RhcnQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTk3CisJCQlzdXBwbGllciAgIAlAMjAxCisJCQlGb2N1c19TcmMgIAlAMTk4CisJCQlGb2N1c19FbnRyeSAJQDIwMgorCQkJb3JpZ2luICAgICAJKDc5OSwgNzA0KQorCQkJdGVybWludXMgICAJKDEwNzIsIDcwNCkKKwkJCW9yZGluYWwgICAgCTQpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMjM2CisJCQlsb2NhdGlvbiAgIAkoMTYsIDc1MikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzcKKwkJCSAgICBQYXJlbnRfVmlldyAJQDIzNgorCQkJICAgIGxvY2F0aW9uICAgCSgxNTMxLCA3MDgpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTAzMUQwMDIyIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJODU0CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJmaXJlTGlmZWN5Y2xlRXZlbnQoQkVGT1JFX1NUQVJUX0VWRU5UKSIKKwkJCSAgICBwY3REaXN0ICAgIAkyLjg1MzMzMworCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjAxCisJCQlzdXBwbGllciAgIAlAMjAxCisJCQlGb2N1c19TcmMgIAlAMjAyCisJCQlGb2N1c19FbnRyeSAJQDIwMworCQkJb3JpZ2luICAgICAJKDExMDQsIDc1MikKKwkJCXRlcm1pbnVzICAgCSgxMjU0LCA3NTIpCisJCQlvcmRpbmFsICAgIAk1KQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDIzOAorCQkJbG9jYXRpb24gICAJKDE2LCA4NjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM5CisJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0OSwgODIxKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwMzMwMDE5QiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTY1OAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5UKSIKKwkJCSAgICBwY3REaXN0ICAgIAkyLjMwNjY2NworCQkJICAgIGhlaWdodCAgICAgCTQ0CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjAxCisJCQlzdXBwbGllciAgIAlAMjAxCisJCQlGb2N1c19TcmMgIAlAMjAyCisJCQlGb2N1c19FbnRyeSAJQDIwNAorCQkJb3JpZ2luICAgICAJKDExMDQsIDg2NCkKKwkJCXRlcm1pbnVzICAgCSgxMjU0LCA4NjQpCisJCQlvcmRpbmFsICAgIAk2KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAyNDAKKwkJCWxvY2F0aW9uICAgCSgxNiwgOTc2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0MQorCQkJICAgIFBhcmVudF9WaWV3IAlAMjQwCisJCQkgICAgbG9jYXRpb24gICAJKDEyNTUsIDkzMikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDM3MDAxOEEiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMTAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInN0YXJ0KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDIwMQorCQkJc3VwcGxpZXIgICAJQDIwNQorCQkJRm9jdXNfU3JjICAJQDIwMgorCQkJRm9jdXNfRW50cnkgCUAyMDYKKwkJCW9yaWdpbiAgICAgCSgxMTAzLCA5NzYpCisJCQl0ZXJtaW51cyAgIAkoMTQwOCwgOTc2KQorCQkJb3JkaW5hbCAgICAJNykKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAyNDIKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTA1NikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDMKKwkJCSAgICBQYXJlbnRfVmlldyAJQDI0MgorCQkJICAgIGxvY2F0aW9uICAgCSgxODY1LCAxMDE0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwMzc1MDA1MSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTg1NAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9TVEFSVF9FVkVOVCkiCisJCQkgICAgcGN0RGlzdCAgICAJMi44NDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0MworCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDIwNQorCQkJc3VwcGxpZXIgICAJQDIwNQorCQkJRm9jdXNfU3JjICAJQDIwNworCQkJRm9jdXNfRW50cnkgCUAyMDgKKwkJCW9yaWdpbiAgICAgCSgxNDQwLCAxMDU2KQorCQkJdGVybWludXMgICAJKDE1OTAsIDEwNTYpCisJCQlvcmRpbmFsICAgIAk4KQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDI0NAorCQkJbG9jYXRpb24gICAJKDE2LCAxMTY4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0NQorCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ0CisJCQkgICAgbG9jYXRpb24gICAJKDE2MzksIDExNDEpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTAzODkwMDFDIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMzczCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJhZGREZWZhdWx0TWFwcGVyKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMS4zMjY2NjcKKwkJCSAgICBoZWlnaHQgICAgIAkyOAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDIwNQorCQkJc3VwcGxpZXIgICAJQDIwNQorCQkJRm9jdXNfU3JjICAJQDIwNworCQkJRm9jdXNfRW50cnkgCUAyMDkKKwkJCW9yaWdpbiAgICAgCSgxNDQwLCAxMTY4KQorCQkJdGVybWludXMgICAJKDE1OTAsIDExNjgpCisJCQlvcmRpbmFsICAgIAk5KQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDI0NgorCQkJbG9jYXRpb24gICAJKDE2LCAxMjk2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0NworCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ2CisJCQkgICAgbG9jYXRpb24gICAJKDE1OTIsIDEyNjgpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTAzOTgwMjgxIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjM4CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJsb2dnZXIuc3RhcnQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkxLjAyMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTI5CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjA1CisJCQlzdXBwbGllciAgIAlAMjA1CisJCQlGb2N1c19TcmMgIAlAMjA3CisJCQlGb2N1c19FbnRyeSAJQDIxMAorCQkJb3JpZ2luICAgICAJKDE0NDAsIDEyOTYpCisJCQl0ZXJtaW51cyAgIAkoMTU5MCwgMTI5NikKKwkJCW9yZGluYWwgICAgCTEwKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDI0OAorCQkJbG9jYXRpb24gICAJKDE2LCAxNDA4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0OQorCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ4CisJCQkgICAgbG9jYXRpb24gICAJKDE1OTMsIDEzODApCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTAzQTgwMTA3IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjI2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJyZWFsbS5zdGFydCgpIgorCQkJICAgIHBjdERpc3QgICAgCTEuMDI2NjY3CisJCQkgICAgaGVpZ2h0ICAgICAJMjkKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyMDUKKwkJCXN1cHBsaWVyICAgCUAyMDUKKwkJCUZvY3VzX1NyYyAgCUAyMDcKKwkJCUZvY3VzX0VudHJ5IAlAMjExCisJCQlvcmlnaW4gICAgIAkoMTQ0MCwgMTQwOCkKKwkJCXRlcm1pbnVzICAgCSgxNTkwLCAxNDA4KQorCQkJb3JkaW5hbCAgICAJMTEpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMjUwCisJCQlsb2NhdGlvbiAgIAkoMTYsIDE1MzYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjUxCisJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTYwOCwgMTUwOCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDNCRDAwMEQiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkyNTkKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImZpbmRNYXBwZXJzKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMS4xMjAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAkyOQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDIwNQorCQkJc3VwcGxpZXIgICAJQDIwNQorCQkJRm9jdXNfU3JjICAJQDIwNworCQkJRm9jdXNfRW50cnkgCUAyMTIKKwkJCW9yaWdpbiAgICAgCSgxNDQwLCAxNTM2KQorCQkJdGVybWludXMgICAJKDE1OTAsIDE1MzYpCisJCQlvcmRpbmFsICAgIAkxMikKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAyNTIKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTY0OCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTMKKwkJCSAgICBQYXJlbnRfVmlldyAJQDI1MgorCQkJICAgIGxvY2F0aW9uICAgCSgxNTE1LCAxNjA0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwM0UwMDBBNCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTI1MQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiZmluZENoaWxkcmVuKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDIwNQorCQkJc3VwcGxpZXIgICAJQDIwNQorCQkJRm9jdXNfU3JjICAJQDIwNworCQkJRm9jdXNfRW50cnkgCUAyMTMKKwkJCW9yaWdpbiAgICAgCSgxNDQwLCAxNjQ4KQorCQkJdGVybWludXMgICAJKDE1OTAsIDE2NDgpCisJCQlvcmRpbmFsICAgIAkxMykKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMjU0CisJCQlsb2NhdGlvbiAgIAkoMTY2NCwgMTc2MCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTUKKwkJCSAgICBQYXJlbnRfVmlldyAJQDI1NAorCQkJICAgIGxvY2F0aW9uICAgCSgxNTkxLCAxNzE2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwM0ZCMDI3QSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTExMAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic3RhcnQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjA1CisJCQlzdXBwbGllciAgIAlAMjE0CisJCQlGb2N1c19TcmMgIAlAMjA3CisJCQlGb2N1c19FbnRyeSAJQDIxNQorCQkJb3JpZ2luICAgICAJKDE0MzksIDE3NjApCisJCQl0ZXJtaW51cyAgIAkoMTc0NCwgMTc2MCkKKwkJCW9yZGluYWwgICAgCTE0KQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDI1NgorCQkJbG9jYXRpb24gICAJKDE2LCAxODA4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1NworCQkJICAgIFBhcmVudF9WaWV3IAlAMjU2CisJCQkgICAgbG9jYXRpb24gICAJKDE2MDYsIDE3ODQpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA0M0IwMkFFIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJODU0CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJmaXJlTGlmZWN5Y2xlRXZlbnQoQkVGT1JFX1NUQVJUX0VWRU5UKSIKKwkJCSAgICBwY3REaXN0ICAgIAktMS4xMzMzMzMKKwkJCSAgICBoZWlnaHQgICAgIAkyNAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDIxNAorCQkJc3VwcGxpZXIgICAJQDIxNAorCQkJRm9jdXNfU3JjICAJQDIxNQorCQkJRm9jdXNfRW50cnkgCUAyMTYKKwkJCW9yaWdpbiAgICAgCSgxNzc2LCAxODA4KQorCQkJdGVybWludXMgICAJKDE5MjYsIDE4MDgpCisJCQlvcmRpbmFsICAgIAkxNSkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAyNTgKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTkyMCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTkKKwkJCSAgICBQYXJlbnRfVmlldyAJQDI1OAorCQkJICAgIGxvY2F0aW9uICAgCSgxOTYzLCAxODc3KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwNDVDMDIxRiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTM3MworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiYWRkRGVmYXVsdE1hcHBlcigpIgorCQkJICAgIHBjdERpc3QgICAgCTEuMjUzMzMzCisJCQkgICAgaGVpZ2h0ICAgICAJNDQKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyMTQKKwkJCXN1cHBsaWVyICAgCUAyMTQKKwkJCUZvY3VzX1NyYyAgCUAyMTUKKwkJCUZvY3VzX0VudHJ5IAlAMjE3CisJCQlvcmlnaW4gICAgIAkoMTc3NiwgMTkyMCkKKwkJCXRlcm1pbnVzICAgCSgxOTI2LCAxOTIwKQorCQkJb3JkaW5hbCAgICAJMTYpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDI2MAorCQkJbG9jYXRpb24gICAJKDIwMDAsIDIzNjgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYxCisJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTkxOSwgMjMyNCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDQ4RTAwQjkiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMTAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInN0YXJ0KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDIxNAorCQkJc3VwcGxpZXIgICAJQDIyMQorCQkJRm9jdXNfU3JjICAJQDIxNQorCQkJRm9jdXNfRW50cnkgCUAyMjIKKwkJCW9yaWdpbiAgICAgCSgxNzc1LCAyMzY4KQorCQkJdGVybWludXMgICAJKDIwNjQsIDIzNjgpCisJCQlvcmRpbmFsICAgIAkyMCkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAyNjIKKwkJCWxvY2F0aW9uICAgCSgxNiwgMjAzMikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjMKKwkJCSAgICBQYXJlbnRfVmlldyAJQDI2MgorCQkJICAgIGxvY2F0aW9uICAgCSgxOTE2LCAyMDA0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwNDlCMDAwQyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTIzOAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkibG9nZ2VyLnN0YXJ0KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC45MzMzMzMKKwkJCSAgICBoZWlnaHQgICAgIAkyOQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDIxNAorCQkJc3VwcGxpZXIgICAJQDIxNAorCQkJRm9jdXNfU3JjICAJQDIxNQorCQkJRm9jdXNfRW50cnkgCUAyMTgKKwkJCW9yaWdpbiAgICAgCSgxNzc2LCAyMDMyKQorCQkJdGVybWludXMgICAJKDE5MjYsIDIwMzIpCisJCQlvcmRpbmFsICAgIAkxNykKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAyNjQKKwkJCWxvY2F0aW9uICAgCSgxNiwgMjE0NCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjUKKwkJCSAgICBQYXJlbnRfVmlldyAJQDI2NAorCQkJICAgIGxvY2F0aW9uICAgCSgxOTE2LCAyMTE3KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwNEEzMDNCQiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTIzOAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiZmluZE1hcHBlcigpIgorCQkJICAgIHBjdERpc3QgICAgCTAuOTMzMzMzCisJCQkgICAgaGVpZ2h0ICAgICAJMjgKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyMTQKKwkJCXN1cHBsaWVyICAgCUAyMTQKKwkJCUZvY3VzX1NyYyAgCUAyMTUKKwkJCUZvY3VzX0VudHJ5IAlAMjE5CisJCQlvcmlnaW4gICAgIAkoMTc3NiwgMjE0NCkKKwkJCXRlcm1pbnVzICAgCSgxOTI2LCAyMTQ0KQorCQkJb3JkaW5hbCAgICAJMTgpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMjY2CisJCQlsb2NhdGlvbiAgIAkoMTYsIDIyNTYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjY3CisJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjYKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNiwgMjIyOCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDRBOTAzNDIiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkyNTEKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImZpbmRDaGlsZHJlbigpIgorCQkJICAgIHBjdERpc3QgICAgCTAuOTMzMzMzCisJCQkgICAgaGVpZ2h0ICAgICAJMjkKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyMTQKKwkJCXN1cHBsaWVyICAgCUAyMTQKKwkJCUZvY3VzX1NyYyAgCUAyMTUKKwkJCUZvY3VzX0VudHJ5IAlAMjIwCisJCQlvcmlnaW4gICAgIAkoMTc3NiwgMjI1NikKKwkJCXRlcm1pbnVzICAgCSgxOTI2LCAyMjU2KQorCQkJb3JkaW5hbCAgICAJMTkpCisJCSAgICAob2JqZWN0IE5vdGVWaWV3IEAyNjgKKwkJCWxvY2F0aW9uICAgCSgyMTI4LCAxNDg4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNSwgMTQyMikKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkzOTAKKwkJCSAgICBsYWJlbCAgICAgIAkiIzEgQ2F0YWxpbmEuc3RhcnQoKSIpCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJd2lkdGggICAgICAJNDUwCisJCQloZWlnaHQgICAgIAkxNDQpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMjY5CisJCQlsb2NhdGlvbiAgIAkoMTYsIDI0MTYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjcwCisJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjkKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NCwgMjQ5OCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDU3ODAxMzgiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk4NTQKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RBUlRfRVZFTlQpIgorCQkJICAgIHBjdERpc3QgICAgCS0zLjAyMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjIxCisJCQlzdXBwbGllciAgIAlAMjIxCisJCQlGb2N1c19TcmMgIAlAMjIyCisJCQlGb2N1c19FbnRyeSAJQDIyMworCQkJb3JpZ2luICAgICAJKDIwOTYsIDI0MTYpCisJCQl0ZXJtaW51cyAgIAkoMjI0NiwgMjQxNikKKwkJCW9yZGluYWwgICAgCTIxKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDI3MQorCQkJbG9jYXRpb24gICAJKDE2LCAyNDgwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MgorCQkJICAgIFBhcmVudF9WaWV3IAlAMjcxCisJCQkgICAgbG9jYXRpb24gICAJKDE3MDUsIDI1ODIpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA1QTgwMzk4IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJNjU4CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJmaXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQpIgorCQkJICAgIHBjdERpc3QgICAgCS0yLjYxMzMzMworCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjIxCisJCQlzdXBwbGllciAgIAlAMjIxCisJCQlGb2N1c19TcmMgIAlAMjIyCisJCQlGb2N1c19FbnRyeSAJQDIyNAorCQkJb3JpZ2luICAgICAJKDIwOTYsIDI0ODApCisJCQl0ZXJtaW51cyAgIAkoMjI0NiwgMjQ4MCkKKwkJCW9yZGluYWwgICAgCTIyKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDI3MworCQkJbG9jYXRpb24gICAJKDE2LCAyNTYwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3NAorCQkJICAgIFBhcmVudF9WaWV3IAlAMjczCisJCQkgICAgbG9jYXRpb24gICAJKDE3MzcsIDI0MjMpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA1QkEwMTk2IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJNjU4CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJmaXJlTGlmZWN5Y2xlRXZlbnQoQUZURVJfRVZFTlQpIgorCQkJICAgIHBjdERpc3QgICAgCS0yLjM5MzMzMworCQkJICAgIGhlaWdodCAgICAgCTEzOAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDIyMQorCQkJc3VwcGxpZXIgICAJQDIyMQorCQkJRm9jdXNfU3JjICAJQDIyMgorCQkJRm9jdXNfRW50cnkgCUAyMjUKKwkJCW9yaWdpbiAgICAgCSgyMDk2LCAyNTYwKQorCQkJdGVybWludXMgICAJKDIyNDYsIDI1NjApCisJCQlvcmRpbmFsICAgIAkyMykKKwkJICAgIChvYmplY3QgTm90ZVZpZXcgQDI3NQorCQkJbG9jYXRpb24gICAJKDk2MCwgMTY4MCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMjc1CisJCQkgICAgbG9jYXRpb24gICAJKDYzNSwgMTU3MSkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIG5saW5lcyAgICAgCTQKKwkJCSAgICBtYXhfd2lkdGggIAk2MTUKKwkJCSAgICBsYWJlbCAgICAgIAkiQWxsIFN0YW5kYXJkWCB3aWxsIGZpcmUgdGhlc2UgZXZlbnRzLiIpCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJd2lkdGggICAgICAJNjc1CisJCQloZWlnaHQgICAgIAkyMzEpCisJCSAgICAob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDI3NgorCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDI3NQorCQkJc3VwcGxpZXIgICAJQDI3MgorCQkJbGluZV9zdHlsZSAJMCkKKwkJICAgIChvYmplY3QgQXR0YWNoVmlldyAiIiBAMjc3CisJCQlzdGVyZW90eXBlIAlUUlVFCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjc1CisJCQlzdXBwbGllciAgIAlAMjcwCisJCQlsaW5lX3N0eWxlIAkwKQorCQkgICAgKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAyNzgKKwkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyNzUKKwkJCXN1cHBsaWVyICAgCUAyNzQKKwkJCWxpbmVfc3R5bGUgCTApKSkKKwkgICAgKG9iamVjdCBJbnRlcmFjdGlvbkRpYWdyYW0gIjQuIGNhdGFsaW5hX3N0YXJ0XzIiCisJCW1lY2hhbmlzbV9yZWYgCUA4NQorCQlxdWlkICAgICAgIAkiM0RGRTA1MDkwMEJGIgorCQl0aXRsZSAgICAgIAkiNC4gY2F0YWxpbmFfc3RhcnRfMiIKKwkJem9vbSAgICAgICAJMTAwCisJCW1heF9oZWlnaHQgCTI4MzUwCisJCW1heF93aWR0aCAgCTIxNjAwCisJCW9yaWdpbl94ICAgCTAKKwkJb3JpZ2luX3kgICAJMTA4NworCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkSG9zdCIgQDI3OQorCQkJbG9jYXRpb24gICAJKDIwOCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDI3OQorCQkJICAgIGxvY2F0aW9uICAgCSgyMDgsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZEhvc3QiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUwNTM4MDE3QiIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMjExNAorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjgwCisJCQkgICAgbG9jYXRpb24gICAJKDIwOCwgMzg0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyNzkKKwkJCSAgICBoZWlnaHQgICAgIAkxODY0CisJCQkgICAgeV9jb29yZCAgICAJMTgwNAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyODEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjA4LCAzODQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDI3OQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDI4MgorCQkJICAgIGxvY2F0aW9uICAgCSgyMDgsIDEwODgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDI3OQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDI4MworCQkJICAgIGxvY2F0aW9uICAgCSgyMDgsIDE2MTYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDI3OQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIkhvc3RDb25maWciIEAyODQKKwkJCWxvY2F0aW9uICAgCSg1NDQsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAyODQKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTQ0LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiSG9zdENvbmZpZyIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTA2QTYwMTMxIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkyMTE0CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyODUKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTQ0LCA1MTIpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDI4NAorCQkJICAgIGhlaWdodCAgICAgCTY5NgorCQkJICAgIHlfY29vcmQgICAgCTYzNgorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyODYKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTQ0LCA1NzYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDI4NAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDI4NworCQkJICAgIGxvY2F0aW9uICAgCSg1NDQsIDY4OCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjg0CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjg4CisJCQkgICAgbG9jYXRpb24gICAJKDU0NCwgNzg0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyODQKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyODkKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTQ0LCA4OTYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDI4NAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDI5MAorCQkJICAgIGxvY2F0aW9uICAgCSg1NDQsIDEwMDgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDI4NAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDI5MQorCQkJICAgIGxvY2F0aW9uICAgCSg1NDQsIDE1MzYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDI4NAorCQkJICAgIGhlaWdodCAgICAgCTIwMAorCQkJICAgIHlfY29vcmQgICAgCTE0MAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyOTIKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTQ0LCAxNTM2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyODQKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZEhvc3REZXBsb3llciIgQDI5MworCQkJbG9jYXRpb24gICAJKDk0NCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDI5MworCQkJICAgIGxvY2F0aW9uICAgCSg5NDQsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJNDI2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZEhvc3REZXBsb3llciIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTA3OUEwMDU1IgorCQkJd2lkdGggICAgICAJNDQ0CisJCQloZWlnaHQgICAgIAkyMTE0CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyOTQKKwkJCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCAxMjgwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyOTMKKwkJCSAgICBoZWlnaHQgICAgIAk4MjQKKwkJCSAgICB5X2Nvb3JkICAgIAk3NjQKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjk1CisJCQkgICAgbG9jYXRpb24gICAJKDk0NCwgMjEyOCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjkzCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIkRpZ2VzdGVyIiBAMjk2CisJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDI5NgorCQkJICAgIGxvY2F0aW9uICAgCSgxMzI4LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiRGlnZXN0ZXIiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUwN0M5MDM0QyIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMjExNAorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjk3CisJCQkgICAgbG9jYXRpb24gICAJKDEzMjgsIDEyODApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDI5NgorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyOTgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTMyOCwgMTQ4OCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjk2CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDI5OQorCQkJICAgIGxvY2F0aW9uICAgCSgxMzI4LCAxOTg0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyOTYKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiQ29udGV4dFJ1bGVTZXQiIEAzMDAKKwkJCWxvY2F0aW9uICAgCSgxNjQ4LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzAwCisJCQkgICAgbG9jYXRpb24gICAJKDE2NDgsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJDb250ZXh0UnVsZVNldCIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTA4MzQwMTZGIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkyMTE0CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzMDEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTY0OCwgMTQwOCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzAwCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDMwMgorCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ4LCAxODg4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzMDAKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiTmFtaW5nUnVsZVNldCIgQDMwMworCQkJbG9jYXRpb24gICAJKDE5NjgsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTk2OCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIk5hbWluZ1J1bGVTZXQiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUwOEQwMDE3MyIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMjExNAorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzA0CisJCQkgICAgbG9jYXRpb24gICAJKDE5NjgsIDE3OTIpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDMwMworCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAzMDUKKwkJCWxvY2F0aW9uICAgCSgwLCAzODQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzA2CisJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDUKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTU1LCAzNDIpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA2NkMwMzQxIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJNjUxCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJmaXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQpIgorCQkJICAgIHBjdERpc3QgICAgCTIuMjA2NjY3CisJCQkgICAgaGVpZ2h0ICAgICAJNDMKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyNzkKKwkJCXN1cHBsaWVyICAgCUAyNzkKKwkJCUZvY3VzX1NyYyAgCUAyODAKKwkJCUZvY3VzX0VudHJ5IAlAMjgxCisJCQlvcmlnaW4gICAgIAkoMjI0LCAzODQpCisJCQl0ZXJtaW51cyAgIAkoMzc0LCAzODQpCisJCQlvcmRpbmFsICAgIAkwKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAzMDcKKwkJCWxvY2F0aW9uICAgCSgzODQsIDUxMikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDgKKwkJCSAgICBQYXJlbnRfVmlldyAJQDMwNworCQkJICAgIGxvY2F0aW9uICAgCSg0ODYsIDQ2OCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDZEMjAyOTQiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk1MDcKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImludGVyZXN0ZWRbaV0ubGlmZWN5Y2xlRXZlbnQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjg2NTU3NAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjc5CisJCQlzdXBwbGllciAgIAlAMjg0CisJCQlGb2N1c19TcmMgIAlAMjgwCisJCQlGb2N1c19FbnRyeSAJQDI4NQorCQkJb3JpZ2luICAgICAJKDIyMywgNTEyKQorCQkJdGVybWludXMgICAJKDUyOCwgNTEyKQorCQkJb3JkaW5hbCAgICAJMSkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAzMDkKKwkJCWxvY2F0aW9uICAgCSgxNiwgNTc2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxMAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzA5CisJCQkgICAgbG9jYXRpb24gICAJKDcxMywgNTM3KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwNkU5MDI4RCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTI5NworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic2V0RGVwbG95WE1MKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMS4wMjY2NjcKKwkJCSAgICBoZWlnaHQgICAgIAk0MAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDI4NAorCQkJc3VwcGxpZXIgICAJQDI4NAorCQkJRm9jdXNfU3JjICAJQDI4NQorCQkJRm9jdXNfRW50cnkgCUAyODYKKwkJCW9yaWdpbiAgICAgCSg1NjAsIDU3NikKKwkJCXRlcm1pbnVzICAgCSg3MTAsIDU3NikKKwkJCW9yZGluYWwgICAgCTIpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMzExCisJCQlsb2NhdGlvbiAgIAkoMTYsIDY4OCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTIKKwkJCSAgICBQYXJlbnRfVmlldyAJQDMxMQorCQkJICAgIGxvY2F0aW9uICAgCSg3MTQsIDY0NSkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDZGMzAwRkYiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkyODgKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInNldExpdmVEZXBsb3koKSIKKwkJCSAgICBwY3REaXN0ICAgIAkxLjAzMzMzMworCQkJICAgIGhlaWdodCAgICAgCTQ0CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjg0CisJCQlzdXBwbGllciAgIAlAMjg0CisJCQlGb2N1c19TcmMgIAlAMjg1CisJCQlGb2N1c19FbnRyeSAJQDI4NworCQkJb3JpZ2luICAgICAJKDU2MCwgNjg4KQorCQkJdGVybWludXMgICAJKDcxMCwgNjg4KQorCQkJb3JkaW5hbCAgICAJMykKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAzMTMKKwkJCWxvY2F0aW9uICAgCSgxNiwgNzg0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxNAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzEzCisJCQkgICAgbG9jYXRpb24gICAJKDczMiwgNzU2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwNkZCMDBEOSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTMyNgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic2V0VW5wYWNrc1dhcigpIgorCQkJICAgIHBjdERpc3QgICAgCTEuMTUzMzMzCisJCQkgICAgaGVpZ2h0ICAgICAJMjkKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyODQKKwkJCXN1cHBsaWVyICAgCUAyODQKKwkJCUZvY3VzX1NyYyAgCUAyODUKKwkJCUZvY3VzX0VudHJ5IAlAMjg4CisJCQlvcmlnaW4gICAgIAkoNTYwLCA3ODQpCisJCQl0ZXJtaW51cyAgIAkoNzEwLCA3ODQpCisJCQlvcmRpbmFsICAgIAk0KQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDMxNQorCQkJbG9jYXRpb24gICAJKDE2LCA4OTYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE2CisJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTUKKwkJCSAgICBsb2NhdGlvbiAgIAkoNzQ3LCA4NjgpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA3MEMwMDE1IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMzUwCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJzZXRYTUxWYWxpZGF0aW9uKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMS4yNDY2NjcKKwkJCSAgICBoZWlnaHQgICAgIAkyOQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDI4NAorCQkJc3VwcGxpZXIgICAJQDI4NAorCQkJRm9jdXNfU3JjICAJQDI4NQorCQkJRm9jdXNfRW50cnkgCUAyODkKKwkJCW9yaWdpbiAgICAgCSg1NjAsIDg5NikKKwkJCXRlcm1pbnVzICAgCSg3MTAsIDg5NikKKwkJCW9yZGluYWwgICAgCTUpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMzE3CisJCQlsb2NhdGlvbiAgIAkoMTYsIDEwMDgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE4CisJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTcKKwkJCSAgICBsb2NhdGlvbiAgIAkoNzYyLCA5ODApCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA3M0IwMDMxIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMzU5CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJkZXBsb3lEZXNjcmlwdG9ycygpIgorCQkJICAgIHBjdERpc3QgICAgCTEuMzQ2NjY3CisJCQkgICAgaGVpZ2h0ICAgICAJMjkKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyODQKKwkJCXN1cHBsaWVyICAgCUAyODQKKwkJCUZvY3VzX1NyYyAgCUAyODUKKwkJCUZvY3VzX0VudHJ5IAlAMjkwCisJCQlvcmlnaW4gICAgIAkoNTYwLCAxMDA4KQorCQkJdGVybWludXMgICAJKDcxMCwgMTAwOCkKKwkJCW9yZGluYWwgICAgCTYpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDMxOQorCQkJbG9jYXRpb24gICAJKDE2LCAxMDg4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzE5CisJCQkgICAgbG9jYXRpb24gICAJKDM3NiwgMTA0NCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDc4QjAzQkIiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMzYKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImluc3RhbGwoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTEpCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjg0CisJCQlzdXBwbGllciAgIAlAMjc5CisJCQlGb2N1c19TcmMgIAlAMjg1CisJCQlGb2N1c19FbnRyeSAJQDI4MgorCQkJb3JpZ2luICAgICAJKDUyOCwgMTA4OCkKKwkJCXRlcm1pbnVzICAgCSgyMjQsIDEwODgpCisJCQlvcmRpbmFsICAgIAk3KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAzMjEKKwkJCWxvY2F0aW9uICAgCSg1NzYsIDEyODApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIyCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjEKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTc1LCAxMjM2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwN0IxMDBCRSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTEzNgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW5zdGFsbCgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyNzkKKwkJCXN1cHBsaWVyICAgCUAyOTMKKwkJCUZvY3VzX1NyYyAgCUAyODAKKwkJCUZvY3VzX0VudHJ5IAlAMjk0CisJCQlvcmlnaW4gICAgIAkoMjIzLCAxMjgwKQorCQkJdGVybWludXMgICAJKDkyOCwgMTI4MCkKKwkJCW9yZGluYWwgICAgCTgpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDMyMworCQkJbG9jYXRpb24gICAJKDExNTIsIDEyODApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzI0CisJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNSwgMTIzNikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDdEMjAwRUQiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxNDQKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImNyZWF0ZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyOTMKKwkJCXN1cHBsaWVyICAgCUAyOTYKKwkJCUZvY3VzX1NyYyAgCUAyOTQKKwkJCUZvY3VzX0VudHJ5IAlAMjk3CisJCQlvcmlnaW4gICAgIAkoOTU5LCAxMjgwKQorCQkJdGVybWludXMgICAJKDEzMTIsIDEyODApCisJCQlvcmRpbmFsICAgIAk5KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAzMjUKKwkJCWxvY2F0aW9uICAgCSgxMTM2LCAxOTg0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyNgorCQkJICAgIFBhcmVudF9WaWV3IAlAMzI1CisJCQkgICAgbG9jYXRpb24gICAJKDExMzUsIDE5NDApCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA3RDYwM0Q3IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTM2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJwYXJzZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyOTMKKwkJCXN1cHBsaWVyICAgCUAyOTYKKwkJCUZvY3VzX1NyYyAgCUAyOTQKKwkJCUZvY3VzX0VudHJ5IAlAMjk5CisJCQlvcmlnaW4gICAgIAkoOTU5LCAxOTg0KQorCQkJdGVybWludXMgICAJKDEzMTIsIDE5ODQpCisJCQlvcmRpbmFsICAgIAkxNikKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMzI3CisJCQlsb2NhdGlvbiAgIAkoMTI5NiwgMTQwOCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjgKKwkJCSAgICBQYXJlbnRfVmlldyAJQDMyNworCQkJICAgIGxvY2F0aW9uICAgCSgxMjk1LCAxMzY0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwOERBMDI5QiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTEwNgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkibmV3KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDI5MworCQkJc3VwcGxpZXIgICAJQDMwMAorCQkJRm9jdXNfU3JjICAJQDI5NAorCQkJRm9jdXNfRW50cnkgCUAzMDEKKwkJCW9yaWdpbiAgICAgCSg5NTksIDE0MDgpCisJCQl0ZXJtaW51cyAgIAkoMTYzMiwgMTQwOCkKKwkJCW9yZGluYWwgICAgCTEwKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAzMjkKKwkJCWxvY2F0aW9uICAgCSgxNDU2LCAxNzkyKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzI5CisJCQkgICAgbG9jYXRpb24gICAJKDE0NTUsIDE3NDgpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA4RTAwMDkxIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTA2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJuZXcoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjkzCisJCQlzdXBwbGllciAgIAlAMzAzCisJCQlGb2N1c19TcmMgIAlAMjk0CisJCQlGb2N1c19FbnRyeSAJQDMwNAorCQkJb3JpZ2luICAgICAJKDk1OSwgMTc5MikKKwkJCXRlcm1pbnVzICAgCSgxOTUyLCAxNzkyKQorCQkJb3JkaW5hbCAgICAJMTQpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDMzMQorCQkJbG9jYXRpb24gICAJKDE2LCAxNDg4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMgorCQkJICAgIFBhcmVudF9WaWV3IAlAMzMxCisJCQkgICAgbG9jYXRpb24gICAJKDExODIsIDE0NDUpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA4RkEwMDNEIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMzg3CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJhZGQoQ29udGV4dFJ1bGVTZXQpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNjMxNzI4CisJCQkgICAgaGVpZ2h0ICAgICAJNDQKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyOTMKKwkJCXN1cHBsaWVyICAgCUAyOTYKKwkJCUZvY3VzX1NyYyAgCUAyOTQKKwkJCUZvY3VzX0VudHJ5IAlAMjk4CisJCQlvcmlnaW4gICAgIAkoOTU5LCAxNDg4KQorCQkJdGVybWludXMgICAJKDEzMTIsIDE0ODgpCisJCQlvcmRpbmFsICAgIAkxMSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMzMzCisJCQlsb2NhdGlvbiAgIAkoMTI5NiwgMTg4OCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzQKKwkJCSAgICBQYXJlbnRfVmlldyAJQDMzMworCQkJICAgIGxvY2F0aW9uICAgCSgxMjk1LCAxODQ0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwOTA3MDE1RiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTQxNgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiYWRkKE5hbWluZ1J1bGVTZXQoKSkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDI5MworCQkJc3VwcGxpZXIgICAJQDMwMAorCQkJRm9jdXNfU3JjICAJQDI5NAorCQkJRm9jdXNfRW50cnkgCUAzMDIKKwkJCW9yaWdpbiAgICAgCSg5NTksIDE4ODgpCisJCQl0ZXJtaW51cyAgIAkoMTYzMiwgMTg4OCkKKwkJCW9yZGluYWwgICAgCTE1KQorCQkgICAgKG9iamVjdCBOb3RlVmlldyBAMzM1CisJCQlsb2NhdGlvbiAgIAkoMjA5NiwgMjM4NCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzM1CisJCQkgICAgbG9jYXRpb24gICAJKDE4OTMsIDIzMTUpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMzcxCisJCQkgICAgbGFiZWwgICAgICAJIiMyIENhdGFsaW5hLnN0YXJ0KCkiKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXdpZHRoICAgICAgCTQzMQorCQkJaGVpZ2h0ICAgICAJMTUwKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDMzNgorCQkJbG9jYXRpb24gICAJKDE2LCAxNTM2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzNworCQkJICAgIFBhcmVudF9WaWV3IAlAMzM2CisJCQkgICAgbG9jYXRpb24gICAJKDY5NywgMTQ5MykKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMTMxRjAzMjciCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkyNDQKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImRlcGxveUFwcHMoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjkxMzMzMworCQkJICAgIGhlaWdodCAgICAgCTQzCisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjg0CisJCQlzdXBwbGllciAgIAlAMjg0CisJCQlGb2N1c19TcmMgIAlAMjkxCisJCQlGb2N1c19FbnRyeSAJQDI5MgorCQkJb3JpZ2luICAgICAJKDU2MCwgMTUzNikKKwkJCXRlcm1pbnVzICAgCSg3MTAsIDE1MzYpCisJCQlvcmRpbmFsICAgIAkxMikKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMzM4CisJCQlsb2NhdGlvbiAgIAkoMTYsIDE2MTYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzM5CisJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMzc2LCAxNTcyKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUxMzJEMDMwOSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTEzNgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW5zdGFsbCgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMSkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyODQKKwkJCXN1cHBsaWVyICAgCUAyNzkKKwkJCUZvY3VzX1NyYyAgCUAyOTEKKwkJCUZvY3VzX0VudHJ5IAlAMjgzCisJCQlvcmlnaW4gICAgIAkoNTI4LCAxNjE2KQorCQkJdGVybWludXMgICAJKDIyNCwgMTYxNikKKwkJCW9yZGluYWwgICAgCTEzKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAzNDAKKwkJCWxvY2F0aW9uICAgCSg1NzYsIDIxMjgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQxCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDAKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTc1LCAyMDg0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUxMzNBMDM2QyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTQ2MworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW5zdGFsbCgpIC8vIHNhbWUgYXMgYWJvdmUiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDI3OQorCQkJc3VwcGxpZXIgICAJQDI5MworCQkJRm9jdXNfU3JjICAJQDI4MAorCQkJRm9jdXNfRW50cnkgCUAyOTUKKwkJCW9yaWdpbiAgICAgCSgyMjMsIDIxMjgpCisJCQl0ZXJtaW51cyAgIAkoOTI4LCAyMTI4KQorCQkJb3JkaW5hbCAgICAJMTcpKSkKKwkgICAgKG9iamVjdCBJbnRlcmFjdGlvbkRpYWdyYW0gIjUuIGNhdGFsaW5hX3N0YXJ0XzMiCisJCW1lY2hhbmlzbV9yZWYgCUA4NgorCQlxdWlkICAgICAgIAkiM0RGRTA5NEEwMzQ2IgorCQl0aXRsZSAgICAgIAkiNS4gY2F0YWxpbmFfc3RhcnRfMyIKKwkJem9vbSAgICAgICAJMTAwCisJCW1heF9oZWlnaHQgCTI4MzUwCisJCW1heF93aWR0aCAgCTIxNjAwCisJCW9yaWdpbl94ICAgCTAKKwkJb3JpZ2luX3kgICAJMAorCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIkRpZ2VzdGVyIiBAMzQyCisJCQlsb2NhdGlvbiAgIAkoMTc2LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzQyCisJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIkRpZ2VzdGVyIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFMDk1QTAzNzEiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTEyMTQKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDM0MworCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDM1MikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzQyCisJCQkgICAgaGVpZ2h0ICAgICAJOTk2CisJCQkgICAgeV9jb29yZCAgICAJOTM2CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDM0NAorCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDM1MikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzQyCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzQ1CisJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgNDQ4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzNDIKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJSdWxlIiBAMzQ2CisJCQlsb2NhdGlvbiAgIAkoNDgwLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ2CisJCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlJ1bGUiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUwRTc0MDBEMCIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMTIxNAorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzQ3CisJCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgNTYwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzNDYKKwkJCSAgICBoZWlnaHQgICAgIAk3MjgKKwkJCSAgICB5X2Nvb3JkICAgIAk2NjgKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRDb250ZXh0IiBAMzQ4CisJCQlsb2NhdGlvbiAgIAkoODE2LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ4CisJCQkgICAgbG9jYXRpb24gICAJKDgxNiwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkzMzIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkQ29udGV4dCIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTBGQzUwMkExIgorCQkJd2lkdGggICAgICAJMzUwCisJCQloZWlnaHQgICAgIAkxMjE0CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzNDkKKwkJCSAgICBsb2NhdGlvbiAgIAkoODE2LCA1OTIpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM0OAorCQkJICAgIGhlaWdodCAgICAgCTI2NAorCQkJICAgIHlfY29vcmQgICAgCTIwNAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzNTAKKwkJCSAgICBsb2NhdGlvbiAgIAkoODE2LCAxMDA4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzNDgKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRQaXBlbGluZSIgQDM1MQorCQkJbG9jYXRpb24gICAJKDExODQsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTE4NCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkzNjMKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkUGlwZWxpbmUiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUxMTJGMDAzRiIKKwkJCXdpZHRoICAgICAgCTM4MQorCQkJaGVpZ2h0ICAgICAJMTIxNAorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzUyCisJCQkgICAgbG9jYXRpb24gICAJKDExODQsIDczNikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzUxCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkQ29udGV4dFZhbHZlIiBAMzUzCisJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM1MworCQkJICAgIGxvY2F0aW9uICAgCSgxNTUyLCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTMwMAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRDb250ZXh0VmFsdmUiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUxMTBEMDM3NSIKKwkJCXdpZHRoICAgICAgCTMxOAorCQkJaGVpZ2h0ICAgICAJMTIxNAorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzU0CisJCQkgICAgbG9jYXRpb24gICAJKDE1NTIsIDYyNCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzUzCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlNldFByb3BlcnRpZXNSdWxlIiBAMzU1CisJCQlsb2NhdGlvbiAgIAkoMTkyMCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM1NQorCQkJICAgIGxvY2F0aW9uICAgCSgxOTIwLCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTM2MworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU2V0UHJvcGVydGllc1J1bGUiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUxMDAzMDNBNCIKKwkJCXdpZHRoICAgICAgCTM4MQorCQkJaGVpZ2h0ICAgICAJMTIxNAorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzU2CisJCQkgICAgbG9jYXRpb24gICAJKDE5MjAsIDkyOCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzU1CisJCQkgICAgaGVpZ2h0ICAgICAJMjAwCisJCQkgICAgeV9jb29yZCAgICAJMTQwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlNldE5leHRSdWxlIiBAMzU3CisJCQlsb2NhdGlvbiAgIAkoMjI3MiwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM1NworCQkJICAgIGxvY2F0aW9uICAgCSgyMjcyLCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU2V0TmV4dFJ1bGUiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUxMjY5MDI2NyIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMTIxNAorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzU4CisJCQkgICAgbG9jYXRpb24gICAJKDIyNzIsIDExNjgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM1NworCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAzNTkKKwkJCWxvY2F0aW9uICAgCSgwLCAzNTIpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYwCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTkKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjY3LCAzMDgpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTBFNzgwMURCIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTA4CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJwYXJzZSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzQyCisJCQlzdXBwbGllciAgIAlAMzQyCisJCQlGb2N1c19TcmMgIAlAMzQzCisJCQlGb2N1c19FbnRyeSAJQDM0NAorCQkJb3JpZ2luICAgICAJKDE5MiwgMzUyKQorCQkJdGVybWludXMgICAJKDM0MiwgMzUyKQorCQkJb3JkaW5hbCAgICAJMCkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAzNjEKKwkJCWxvY2F0aW9uICAgCSgxNiwgNDQ4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2MgorCQkJICAgIFBhcmVudF9WaWV3IAlAMzYxCisJCQkgICAgbG9jYXRpb24gICAJKDM0NSwgNDIwKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwRjJGMDNEMiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTI2NworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic3RhcnRFbGVtZW50KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMS4wMjAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAkyOAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM0MgorCQkJc3VwcGxpZXIgICAJQDM0MgorCQkJRm9jdXNfU3JjICAJQDM0MworCQkJRm9jdXNfRW50cnkgCUAzNDUKKwkJCW9yaWdpbiAgICAgCSgxOTIsIDQ0OCkKKwkJCXRlcm1pbnVzICAgCSgzNDIsIDQ0OCkKKwkJCW9yZGluYWwgICAgCTEpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDM2MworCQkJbG9jYXRpb24gICAJKDMzNiwgNTYwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2NAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzYzCisJCQkgICAgbG9jYXRpb24gICAJKDMyNywgNTE2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwRjQwMDIxNCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTEzMgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiYmVnaW4oKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzQyCisJCQlzdXBwbGllciAgIAlAMzQ2CisJCQlGb2N1c19TcmMgIAlAMzQzCisJCQlGb2N1c19FbnRyeSAJQDM0NworCQkJb3JpZ2luICAgICAJKDE5MSwgNTYwKQorCQkJdGVybWludXMgICAJKDQ2NCwgNTYwKQorCQkJb3JkaW5hbCAgICAJMikKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMzY1CisJCQlsb2NhdGlvbiAgIAkoMTYsIDU5MikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjYKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM2NQorCQkJICAgIGxvY2F0aW9uICAgCSg2NDcsIDU0OCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMEZEMzAyNjYiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkyNjUKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIm5ld0luc3RhbmNlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM0NgorCQkJc3VwcGxpZXIgICAJQDM0OAorCQkJRm9jdXNfU3JjICAJQDM0NworCQkJRm9jdXNfRW50cnkgCUAzNDkKKwkJCW9yaWdpbiAgICAgCSg0OTUsIDU5MikKKwkJCXRlcm1pbnVzICAgCSg4MDAsIDU5MikKKwkJCW9yZGluYWwgICAgCTMpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDM2NworCQkJbG9jYXRpb24gICAJKDg2NCwgOTI4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2OAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzY3CisJCQkgICAgbG9jYXRpb24gICAJKDExOTksIDg4NCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMTAyMDAyRTkiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMzIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImJlZ2luKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM0NgorCQkJc3VwcGxpZXIgICAJQDM1NQorCQkJRm9jdXNfU3JjICAJQDM0NworCQkJRm9jdXNfRW50cnkgCUAzNTYKKwkJCW9yaWdpbiAgICAgCSg0OTUsIDkyOCkKKwkJCXRlcm1pbnVzICAgCSgxOTA0LCA5MjgpCisJCQlvcmRpbmFsICAgIAk2KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAzNjkKKwkJCWxvY2F0aW9uICAgCSgxMDA4LCA3MzYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcwCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjkKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTEzOSwgNjkzKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUxMTRBMDE5MyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTYxMAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic2V0QmFzaWMoU3RhbmRhcmRDb250ZXh0VmFsdmUpIgorCQkJICAgIHBjdERpc3QgICAgCTAuOTE1MDE0CisJCQkgICAgaGVpZ2h0ICAgICAJNDQKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzNDgKKwkJCXN1cHBsaWVyICAgCUAzNTEKKwkJCUZvY3VzX1NyYyAgCUAzNDkKKwkJCUZvY3VzX0VudHJ5IAlAMzUyCisJCQlvcmlnaW4gICAgIAkoODMxLCA3MzYpCisJCQl0ZXJtaW51cyAgIAkoMTE2OCwgNzM2KQorCQkJb3JkaW5hbCAgICAJNSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMzcxCisJCQlsb2NhdGlvbiAgIAkoMTYsIDYyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzIKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM3MQorCQkJICAgIGxvY2F0aW9uICAgCSgxMTgzLCA1ODApCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTExNUUwMDFGIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTA2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJuZXcoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzQ4CisJCQlzdXBwbGllciAgIAlAMzUzCisJCQlGb2N1c19TcmMgIAlAMzQ5CisJCQlGb2N1c19FbnRyeSAJQDM1NAorCQkJb3JpZ2luICAgICAJKDgzMSwgNjI0KQorCQkJdGVybWludXMgICAJKDE1MzYsIDYyNCkKKwkJCW9yZGluYWwgICAgCTQpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDM3MworCQkJbG9jYXRpb24gICAJKDE0NDAsIDEwMDgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzc0CisJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTM2OCwgOTY0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUxMUQ1MDM5MSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTExOTAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIi8vVXNpbmcgQmVhblV0aWwsIHNldCB0aGUgb2JqZWN0IHByb3BlcnRpZXMgKGZyb20gZXg6IGFkbWluLnhtbCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkxKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM1NQorCQkJc3VwcGxpZXIgICAJQDM0OAorCQkJRm9jdXNfU3JjICAJQDM1NgorCQkJRm9jdXNfRW50cnkgCUAzNTAKKwkJCW9yaWdpbiAgICAgCSgxOTA0LCAxMDA4KQorCQkJdGVybWludXMgICAJKDgzMiwgMTAwOCkKKwkJCW9yZGluYWwgICAgCTcpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDM3NQorCQkJbG9jYXRpb24gICAJKDEzOTIsIDExNjgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzc2CisJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzUKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTM3NSwgMTEyNCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMTI4NTAxQzgiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk5OQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiZW5kKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM0NgorCQkJc3VwcGxpZXIgICAJQDM1NworCQkJRm9jdXNfU3JjICAJQDM0NworCQkJRm9jdXNfRW50cnkgCUAzNTgKKwkJCW9yaWdpbiAgICAgCSg0OTUsIDExNjgpCisJCQl0ZXJtaW51cyAgIAkoMjI1NiwgMTE2OCkKKwkJCW9yZGluYWwgICAgCTgpCisJCSAgICAob2JqZWN0IE5vdGVWaWV3IEAzNzcKKwkJCWxvY2F0aW9uICAgCSgxMjE2LCA4MCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzc3CisJCQkgICAgbG9jYXRpb24gICAJKDkwMCwgMTUpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJNTk2CisJCQkgICAgbGFiZWwgICAgICAJIkhvc3RDb25maWcuZGVwbG95RGVzY3JpcHRvcigpIikKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQl3aWR0aCAgICAgIAk2NTYKKwkJCWhlaWdodCAgICAgCTE0MykKKwkJICAgIChvYmplY3QgTm90ZVZpZXcgQDM3OAorCQkJbG9jYXRpb24gICAJKDIxMjgsIDE4ODgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM3OAorCQkJICAgIGxvY2F0aW9uICAgCSgxOTQ3LCAxODIyKQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTMyNworCQkJICAgIGxhYmVsICAgICAgCSIjMyBDYXRhbGluYS5zdGFydCgpIikKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQl3aWR0aCAgICAgIAkzODcKKwkJCWhlaWdodCAgICAgCTE0NCkpKQorCSAgICAob2JqZWN0IEludGVyYWN0aW9uRGlhZ3JhbSAiNi4gY2F0YWxpbmFfc3RhcnRfNCIKKwkJbWVjaGFuaXNtX3JlZiAJQDg3CisJCXF1aWQgICAgICAgCSIzREZFMTM4OTAwMDgiCisJCXRpdGxlICAgICAgCSI2LiBjYXRhbGluYV9zdGFydF80IgorCQl6b29tICAgICAgIAkxMDAKKwkJbWF4X2hlaWdodCAJMjgzNTAKKwkJbWF4X3dpZHRoICAJMjE2MDAKKwkJb3JpZ2luX3ggICAJMAorCQlvcmlnaW5feSAgIAkxODE4CisJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0CisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiRGlnZXN0ZXIiIEAzNzkKKwkJCWxvY2F0aW9uICAgCSgxNzYsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzkKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiRGlnZXN0ZXIiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUxMzk2MDM2NCIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMjQ0NgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzgwCisJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMzM2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzNzkKKwkJCSAgICBoZWlnaHQgICAgIAkxMjI4CisJCQkgICAgeV9jb29yZCAgICAJMTE2OAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzODEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCAzMzYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM3OQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDM4MgorCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDQ4MCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzc5CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzgzCisJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMTYxNikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzc5CisJCQkgICAgaGVpZ2h0ICAgICAJNTgwCisJCQkgICAgeV9jb29yZCAgICAJNTIwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDM4NAorCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDE3MjgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM3OQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkSG9zdERlcGxveWVyIiBAMzg1CisJCQlsb2NhdGlvbiAgIAkoNDgwLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzg1CisJCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkzMDEKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkSG9zdERlcGxveWVyIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFMUQ4QTAyREMiCisJCQl3aWR0aCAgICAgIAkzMTkKKwkJCWhlaWdodCAgICAgCTI0NDYKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDM4NgorCQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDU3NikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzg1CisJCQkgICAgaGVpZ2h0ICAgICAJOTI4CisJCQkgICAgeV9jb29yZCAgICAJODY4CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkSG9zdCIgQDM4NworCQkJbG9jYXRpb24gICAJKDgwMCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM4NworCQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZEhvc3QiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUxREYyMDE0MSIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMjQ0NgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzg4CisJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgNTkyKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzODcKKwkJCSAgICBoZWlnaHQgICAgIAk4NTIKKwkJCSAgICB5X2Nvb3JkICAgIAk3OTIKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRDb250ZXh0IiBAMzg5CisJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM4OQorCQkJICAgIGxvY2F0aW9uICAgCSgxMTIwLCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI5NQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRDb250ZXh0IikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFMTk2RDAwRDkiCisJCQl3aWR0aCAgICAgIAkzMTMKKwkJCWhlaWdodCAgICAgCTI0NDYKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDM5MAorCQkJICAgIGxvY2F0aW9uICAgCSgxMTIwLCA2MjQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM4OQorCQkJICAgIGhlaWdodCAgICAgCTc2MAorCQkJICAgIHlfY29vcmQgICAgCTcwMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzOTEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTEyMCwgODAwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzODkKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzOTIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTEyMCwgOTc2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzODkKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzOTMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTEyMCwgMTA3MikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzg5CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiV2ViYXBwTG9hZGVyIiBAMzk0CisJCQlsb2NhdGlvbiAgIAkoMTQ0MCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM5NAorCQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI5NQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiV2ViYXBwTG9hZGVyIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFMUZGQTAzNDciCisJCQl3aWR0aCAgICAgIAkzMTMKKwkJCWhlaWdodCAgICAgCTI0NDYKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDM5NQorCQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCA2NDApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM5NAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZE1hbmFnZXIiIEAzOTYKKwkJCWxvY2F0aW9uICAgCSgxNzYwLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzk2CisJCQkgICAgbG9jYXRpb24gICAJKDE3NjAsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMzAxCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZE1hbmFnZXIiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUyMDFGMDEwNSIKKwkJCXdpZHRoICAgICAgCTMxOQorCQkJaGVpZ2h0ICAgICAJMjQ0NgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzk3CisJCQkgICAgbG9jYXRpb24gICAJKDE3NjAsIDgzMikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzk2CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDM5OAorCQkJICAgIGxvY2F0aW9uICAgCSgxNzYwLCAxMjY0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzOTYKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiQ29udGV4dENvbmZpZyIgQDM5OQorCQkJbG9jYXRpb24gICAJKDE5NTIsIDM1MikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTkKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTk1MiwgMzUyKQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIkNvbnRleHRDb25maWciKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUyMDg3MDI4QyIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMjMxOAorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDAwCisJCQkgICAgbG9jYXRpb24gICAJKDE5NTIsIDQxMikKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzOTkKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDAxCisJCQkgICAgbG9jYXRpb24gICAJKDE5NTIsIDExMzYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM5OQorCQkJICAgIGhlaWdodCAgICAgCTE0NDQKKwkJCSAgICB5X2Nvb3JkICAgIAkxMzg0CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDQwMgorCQkJICAgIGxvY2F0aW9uICAgCSgxOTUyLCAxMjY0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzOTkKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0MDMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTk1MiwgMTQ1NikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzk5CisJCQkgICAgaGVpZ2h0ICAgICAJMTA3MAorCQkJICAgIHlfY29vcmQgICAgCTEwMTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0MDQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTk1MiwgMTU2OCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzk5CisJCQkgICAgaGVpZ2h0ICAgICAJOTUyCisJCQkgICAgeV9jb29yZCAgICAJODkyCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDA1CisJCQkgICAgbG9jYXRpb24gICAJKDE5NTIsIDE5ODQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM5OQorCQkJICAgIGhlaWdodCAgICAgCTE1MgorCQkJICAgIHlfY29vcmQgICAgCTkyCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBANDA2CisJCQlsb2NhdGlvbiAgIAkoMTYsIDMzNikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MDcKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQwNgorCQkJICAgIGxvY2F0aW9uICAgCSgyNjcsIDI5MikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMTlBRTAwNjUiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMDgKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInBhcnNlIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzNzkKKwkJCXN1cHBsaWVyICAgCUAzNzkKKwkJCUZvY3VzX1NyYyAgCUAzODAKKwkJCUZvY3VzX0VudHJ5IAlAMzgxCisJCQlvcmlnaW4gICAgIAkoMTkyLCAzMzYpCisJCQl0ZXJtaW51cyAgIAkoMzQyLCAzMzYpCisJCQlvcmRpbmFsICAgIAkwKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDQwOAorCQkJbG9jYXRpb24gICAJKDE2LCA0ODApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDA5CisJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMzI4LCA0MzcpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTE5QjEwMkU5IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjY3CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJzdGFydEVsZW1lbnQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjkwNjY2NworCQkJICAgIGhlaWdodCAgICAgCTQ0CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzc5CisJCQlzdXBwbGllciAgIAlAMzc5CisJCQlGb2N1c19TcmMgIAlAMzgwCisJCQlGb2N1c19FbnRyeSAJQDM4MgorCQkJb3JpZ2luICAgICAJKDE5MiwgNDgwKQorCQkJdGVybWludXMgICAJKDM0MiwgNDgwKQorCQkJb3JkaW5hbCAgICAJMSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANDEwCisJCQlsb2NhdGlvbiAgIAkoMTYsIDU3NikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MTEKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQxMAorCQkJICAgIGxvY2F0aW9uICAgCSgzMjcsIDU1MikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMURGQjAwMjIiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxNjUKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImFkZENoaWxkIgorCQkJICAgIHBjdERpc3QgICAgCTAuNDk4NjQ1CisJCQkgICAgaGVpZ2h0ICAgICAJMjUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzNzkKKwkJCXN1cHBsaWVyICAgCUAzODUKKwkJCUZvY3VzX1NyYyAgCUAzODAKKwkJCUZvY3VzX0VudHJ5IAlAMzg2CisJCQlvcmlnaW4gICAgIAkoMTkxLCA1NzYpCisJCQl0ZXJtaW51cyAgIAkoNDY0LCA1NzYpCisJCQlvcmRpbmFsICAgIAkyKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA0MTIKKwkJCWxvY2F0aW9uICAgCSgxNiwgNTkyKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQxMworCQkJICAgIFBhcmVudF9WaWV3IAlANDEyCisJCQkgICAgbG9jYXRpb24gICAJKDYzOSwgNTQ4KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUxRkI2MDI3NyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE2NQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiYWRkQ2hpbGQiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM4NQorCQkJc3VwcGxpZXIgICAJQDM4NworCQkJRm9jdXNfU3JjICAJQDM4NgorCQkJRm9jdXNfRW50cnkgCUAzODgKKwkJCW9yaWdpbiAgICAgCSg0OTUsIDU5MikKKwkJCXRlcm1pbnVzICAgCSg3ODQsIDU5MikKKwkJCW9yZGluYWwgICAgCTMpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDQxNAorCQkJbG9jYXRpb24gICAJKDE2LCA2MjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDE1CisJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTQKKwkJCSAgICBsb2NhdGlvbiAgIAkoOTU5LCA1ODApCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTFGQzQwMjI4IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTEwCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJzdGFydCgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzODcKKwkJCXN1cHBsaWVyICAgCUAzODkKKwkJCUZvY3VzX1NyYyAgCUAzODgKKwkJCUZvY3VzX0VudHJ5IAlAMzkwCisJCQlvcmlnaW4gICAgIAkoODE1LCA2MjQpCisJCQl0ZXJtaW51cyAgIAkoMTEwNCwgNjI0KQorCQkJb3JkaW5hbCAgICAJNCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANDE2CisJCQlsb2NhdGlvbiAgIAkoMTYsIDY0MCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MTcKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQxNgorCQkJICAgIGxvY2F0aW9uICAgCSgxMjc5LCA1OTYpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTIwMDYwM0JFIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIm5ldyIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzg5CisJCQlzdXBwbGllciAgIAlAMzk0CisJCQlGb2N1c19TcmMgIAlAMzkwCisJCQlGb2N1c19FbnRyeSAJQDM5NQorCQkJb3JpZ2luICAgICAJKDExMzUsIDY0MCkKKwkJCXRlcm1pbnVzICAgCSgxNDI0LCA2NDApCisJCQlvcmRpbmFsICAgIAk1KQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDQxOAorCQkJbG9jYXRpb24gICAJKDE2LCA4MDApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDE5CisJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTIyNCwgNzU2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUyMDBDMDI5QSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE4NgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic2V0TG9hZGVyIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTkzMzMzCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzODkKKwkJCXN1cHBsaWVyICAgCUAzODkKKwkJCUZvY3VzX1NyYyAgCUAzOTAKKwkJCUZvY3VzX0VudHJ5IAlAMzkxCisJCQlvcmlnaW4gICAgIAkoMTEzNiwgODAwKQorCQkJdGVybWludXMgICAJKDEyODYsIDgwMCkKKwkJCW9yZGluYWwgICAgCTYpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDQyMAorCQkJbG9jYXRpb24gICAJKDE2LCA4MzIpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDIxCisJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgNzg4KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUyMDJDMDI1MCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJuZXciCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM4OQorCQkJc3VwcGxpZXIgICAJQDM5NgorCQkJRm9jdXNfU3JjICAJQDM5MAorCQkJRm9jdXNfRW50cnkgCUAzOTcKKwkJCW9yaWdpbiAgICAgCSgxMTM1LCA4MzIpCisJCQl0ZXJtaW51cyAgIAkoMTc0NCwgODMyKQorCQkJb3JkaW5hbCAgICAJNykKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEA0MjIKKwkJCWxvY2F0aW9uICAgCSgxNiwgOTc2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQyMworCQkJICAgIFBhcmVudF9WaWV3IAlANDIyCisJCQkgICAgbG9jYXRpb24gICAJKDEyNjAsIDkzMykKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMjAzMjAwMUMiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkyMjEKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInNldE1hbmFnZXIiCisJCQkgICAgcGN0RGlzdCAgICAJMC44MzMzMzMKKwkJCSAgICBoZWlnaHQgICAgIAk0NAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM4OQorCQkJc3VwcGxpZXIgICAJQDM4OQorCQkJRm9jdXNfU3JjICAJQDM5MAorCQkJRm9jdXNfRW50cnkgCUAzOTIKKwkJCW9yaWdpbiAgICAgCSgxMTM2LCA5NzYpCisJCQl0ZXJtaW51cyAgIAkoMTI4NiwgOTc2KQorCQkJb3JkaW5hbCAgICAJOCkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEA0MjQKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTA3MikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MjUKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQyNAorCQkJICAgIGxvY2F0aW9uICAgCSgxNDgxLCAxMDQzKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUyMDVCMDFBMiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTY1OAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5UKSIKKwkJCSAgICBwY3REaXN0ICAgIAkyLjMwNjY2NworCQkJICAgIGhlaWdodCAgICAgCTMwCisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzg5CisJCQlzdXBwbGllciAgIAlAMzg5CisJCQlGb2N1c19TcmMgIAlAMzkwCisJCQlGb2N1c19FbnRyeSAJQDM5MworCQkJb3JpZ2luICAgICAJKDExMzYsIDEwNzIpCisJCQl0ZXJtaW51cyAgIAkoMTI4NiwgMTA3MikKKwkJCW9yZGluYWwgICAgCTkpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDQyNgorCQkJbG9jYXRpb24gICAJKDE2LCAxMTM2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQyNworCQkJICAgIFBhcmVudF9WaWV3IAlANDI2CisJCQkgICAgbG9jYXRpb24gICAJKDE1MzUsIDEwOTIpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTIwOTYwMDAzIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJNzQ1CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSIgLy8gTm90aWZ5IGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzODkKKwkJCXN1cHBsaWVyICAgCUAzOTkKKwkJCUZvY3VzX1NyYyAgCUAzOTAKKwkJCUZvY3VzX0VudHJ5IAlANDAxCisJCQlvcmlnaW4gICAgIAkoMTEzNSwgMTEzNikKKwkJCXRlcm1pbnVzICAgCSgxOTM2LCAxMTM2KQorCQkJb3JkaW5hbCAgICAJMTApCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBANDI4CisJCQlsb2NhdGlvbiAgIAkoMTYsIDEyNjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDI5CisJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjA0MywgMTIyMCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMjBDRjAxOEMiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMTAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInN0YXJ0KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM5OQorCQkJc3VwcGxpZXIgICAJQDM5OQorCQkJRm9jdXNfU3JjICAJQDQwMQorCQkJRm9jdXNfRW50cnkgCUA0MDIKKwkJCW9yaWdpbiAgICAgCSgxOTY4LCAxMjY0KQorCQkJdGVybWludXMgICAJKDIxMTgsIDEyNjQpCisJCQlvcmRpbmFsICAgIAkxMSkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEA0MzAKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTQ1NikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MzEKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQzMAorCQkJICAgIGxvY2F0aW9uICAgCSgyMDI3LCAxNDEzKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUyMEUzMDNFMiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTI3NQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiZGVmYXVsdENvbmZpZygpIgorCQkJICAgIHBjdERpc3QgICAgCTAuMzkzMzMzCisJCQkgICAgaGVpZ2h0ICAgICAJNDQKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzOTkKKwkJCXN1cHBsaWVyICAgCUAzOTkKKwkJCUZvY3VzX1NyYyAgCUA0MDEKKwkJCUZvY3VzX0VudHJ5IAlANDAzCisJCQlvcmlnaW4gICAgIAkoMTk2OCwgMTQ1NikKKwkJCXRlcm1pbnVzICAgCSgyMTE4LCAxNDU2KQorCQkJb3JkaW5hbCAgICAJMTMpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBANDMyCisJCQlsb2NhdGlvbiAgIAkoMTYsIDE1NjgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDMzCisJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjA0MywgMTUyNCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMjExRDAxQTEiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkzNDkKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImFwcGxpY2F0aW9uQ29uZmlnKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM5OQorCQkJc3VwcGxpZXIgICAJQDM5OQorCQkJRm9jdXNfU3JjICAJQDQwMQorCQkJRm9jdXNfRW50cnkgCUA0MDQKKwkJCW9yaWdpbiAgICAgCSgxOTY4LCAxNTY4KQorCQkJdGVybWludXMgICAJKDIxMTgsIDE1NjgpCisJCQlvcmRpbmFsICAgIAkxNCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANDM0CisJCQlsb2NhdGlvbiAgIAkoMTY2NCwgMTI2NCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MzUKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQzNAorCQkJICAgIGxvY2F0aW9uICAgCSgxNDM5LCAxMjIwKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUyMEI2MDBFNSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTExMAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic3RhcnQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzg5CisJCQlzdXBwbGllciAgIAlAMzk2CisJCQlGb2N1c19TcmMgIAlAMzkwCisJCQlGb2N1c19FbnRyeSAJQDM5OAorCQkJb3JpZ2luICAgICAJKDExMzUsIDEyNjQpCisJCQl0ZXJtaW51cyAgIAkoMTc0NCwgMTI2NCkKKwkJCW9yZGluYWwgICAgCTEyKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA0MzYKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTYxNikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MzcKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQzNgorCQkJICAgIGxvY2F0aW9uICAgCSgxMDY0LCAxNTcyKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUyMUI2MDI4OCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE0NQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiY3JlYXRlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkxKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM5OQorCQkJc3VwcGxpZXIgICAJQDM3OQorCQkJRm9jdXNfU3JjICAJQDQwNAorCQkJRm9jdXNfRW50cnkgCUAzODMKKwkJCW9yaWdpbiAgICAgCSgxOTM2LCAxNjE2KQorCQkJdGVybWludXMgICAJKDE5MiwgMTYxNikKKwkJCW9yZGluYWwgICAgCTE1KQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDQzOAorCQkJbG9jYXRpb24gICAJKDE2LCAxNzI4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQzOQorCQkJICAgIFBhcmVudF9WaWV3IAlANDM4CisJCQkgICAgbG9jYXRpb24gICAJKDQ1NywgMTcwMSkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMjFCRTAyMUIiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk1MzAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIi8vIFByb2Nlc3Mgd2ViLnhtbCAqIHRsZC54bWwiCisJCQkgICAgcGN0RGlzdCAgICAJMS43NzMzMzMKKwkJCSAgICBoZWlnaHQgICAgIAkyOAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM3OQorCQkJc3VwcGxpZXIgICAJQDM3OQorCQkJRm9jdXNfU3JjICAJQDM4MworCQkJRm9jdXNfRW50cnkgCUAzODQKKwkJCW9yaWdpbiAgICAgCSgxOTIsIDE3MjgpCisJCQl0ZXJtaW51cyAgIAkoMzQyLCAxNzI4KQorCQkJb3JkaW5hbCAgICAJMTYpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRXcmFwcGVyIiBANDQwCisJCQlsb2NhdGlvbiAgIAkoMjIwOCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQ0MAorCQkJICAgIGxvY2F0aW9uICAgCSgyMjA4LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRXcmFwcGVyIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFMjIwQzAxMjIiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTI0NDYKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDQ0MQorCQkJICAgIGxvY2F0aW9uICAgCSgyMjA4LCAyMDE2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA0NDAKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDQyCisJCQkgICAgbG9jYXRpb24gICAJKDIyMDgsIDIxNzYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDQ0MAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0NDMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjIwOCwgMjI4OCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANDQwCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDQ0NAorCQkJICAgIGxvY2F0aW9uICAgCSgyMjA4LCAyNDAwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA0NDAKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDQ0NQorCQkJbG9jYXRpb24gICAJKDE2LCAxOTg0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ0NgorCQkJICAgIFBhcmVudF9WaWV3IAlANDQ1CisJCQkgICAgbG9jYXRpb24gICAJKDEwNjMsIDE5NDApCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTIyOEIwM0JBIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTQ3OAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiY3JlYXRlV2FycHBlcigpIC8vIEludm9rZWQgYnkgYSBXZWJXcmFwcGVyUnVsZSAobm90IERpcmVjdGx5IGJ5IHRoZSBEaWdlc3RlcikiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM3OQorCQkJc3VwcGxpZXIgICAJQDM5OQorCQkJRm9jdXNfU3JjICAJQDM4MworCQkJRm9jdXNfRW50cnkgCUA0MDUKKwkJCW9yaWdpbiAgICAgCSgxOTEsIDE5ODQpCisJCQl0ZXJtaW51cyAgIAkoMTkzNiwgMTk4NCkKKwkJCW9yZGluYWwgICAgCTE3KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA0NDcKKwkJCWxvY2F0aW9uICAgCSgxNiwgMjAxNikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NDgKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQ0NworCQkJICAgIGxvY2F0aW9uICAgCSgyMDc5LCAxOTcyKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUyMjlBMDAwNCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJuZXciCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM5OQorCQkJc3VwcGxpZXIgICAJQDQ0MAorCQkJRm9jdXNfU3JjICAJQDQwNQorCQkJRm9jdXNfRW50cnkgCUA0NDEKKwkJCW9yaWdpbiAgICAgCSgxOTY3LCAyMDE2KQorCQkJdGVybWludXMgICAJKDIxOTIsIDIwMTYpCisJCQlvcmRpbmFsICAgIAkxOCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANDQ5CisJCQlsb2NhdGlvbiAgIAkoMTYsIDIxNzYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUwCisJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDkKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjExNiwgMjEzNCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMjJBNzAwQzEiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk0MDUKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImFkZEluc3RhbmNlTGlzdGVuZXIoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjY2MjI5NQorCQkJICAgIGhlaWdodCAgICAgCTQzCisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzk5CisJCQlzdXBwbGllciAgIAlANDQwCisJCQlGb2N1c19TcmMgIAlANDA0CisJCQlGb2N1c19FbnRyeSAJQDQ0MgorCQkJb3JpZ2luICAgICAJKDE5NjcsIDIxNzYpCisJCQl0ZXJtaW51cyAgIAkoMjE5MiwgMjE3NikKKwkJCW9yZGluYWwgICAgCTE5KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA0NTEKKwkJCWxvY2F0aW9uICAgCSgyNDk2LCAyMjg4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1MgorCQkJICAgIFBhcmVudF9WaWV3IAlANDUxCisJCQkgICAgbG9jYXRpb24gICAJKDIxMTYsIDIyNDUpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTIyQzcwMUNDIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJNDEwCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJhZGRMaWZlY3ljbGVMaXN0ZW5lcigpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNjYyMjk1CisJCQkgICAgaGVpZ2h0ICAgICAJNDQKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzOTkKKwkJCXN1cHBsaWVyICAgCUA0NDAKKwkJCUZvY3VzX1NyYyAgCUA0MDQKKwkJCUZvY3VzX0VudHJ5IAlANDQzCisJCQlvcmlnaW4gICAgIAkoMTk2NywgMjI4OCkKKwkJCXRlcm1pbnVzICAgCSgyMTkyLCAyMjg4KQorCQkJb3JkaW5hbCAgICAJMjApCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDQ1MworCQkJbG9jYXRpb24gICAJKDE2LCAyNDAwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1NAorCQkJICAgIFBhcmVudF9WaWV3IAlANDUzCisJCQkgICAgbG9jYXRpb24gICAJKDIxMjQsIDIzNTcpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTIyRTgwMzY0IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJNDI4CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJhZGRDb250YWluZXJMaXN0ZW5lcigpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNzAxNjM5CisJCQkgICAgaGVpZ2h0ICAgICAJNDQKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzOTkKKwkJCXN1cHBsaWVyICAgCUA0NDAKKwkJCUZvY3VzX1NyYyAgCUA0MDQKKwkJCUZvY3VzX0VudHJ5IAlANDQ0CisJCQlvcmlnaW4gICAgIAkoMTk2NywgMjQwMCkKKwkJCXRlcm1pbnVzICAgCSgyMTkyLCAyNDAwKQorCQkJb3JkaW5hbCAgICAJMjEpCisJCSAgICAob2JqZWN0IE5vdGVWaWV3IEA0NTUKKwkJCWxvY2F0aW9uICAgCSgxMjE2LCA4MCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlANDU1CisJCQkgICAgbG9jYXRpb24gICAJKDgyNSwgMTQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJNzQ2CisJCQkgICAgbGFiZWwgICAgICAJIkRlcGxveSBBcHAuIikKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQl3aWR0aCAgICAgIAk4MDYKKwkJCWhlaWdodCAgICAgCTE0NCkKKwkJICAgIChvYmplY3QgTm90ZVZpZXcgQDQ1NgorCQkJbG9jYXRpb24gICAJKDIxNDQsIDI3MDQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQ1NgorCQkJICAgIGxvY2F0aW9uICAgCSgxOTUzLCAyNjQxKQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTM0NworCQkJICAgIGxhYmVsICAgICAgCSIjNCBDYXRhbGluYS5zdGFydCgpIikKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQl3aWR0aCAgICAgIAk0MDcKKwkJCWhlaWdodCAgICAgCTEzOCkpKQorCSAgICAob2JqZWN0IEludGVyYWN0aW9uRGlhZ3JhbSAiMS4gY2F0YWxpbmFfcmVxdWVzdCIKKwkJbWVjaGFuaXNtX3JlZiAJQDg4CisJCXF1aWQgICAgICAgCSIzREZFM0I1MDAxQzMiCisJCXRpdGxlICAgICAgCSIxLiBjYXRhbGluYV9yZXF1ZXN0IgorCQl6b29tICAgICAgIAkxMDAKKwkJbWF4X2hlaWdodCAJMjgzNTAKKwkJbWF4X3dpZHRoICAJMjE2MDAKKwkJb3JpZ2luX3ggICAJMAorCQlvcmlnaW5feSAgIAkwCisJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0CisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiVGhyZWFkUG9vbCIgQDQ1NworCQkJbG9jYXRpb24gICAJKDE3NiwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQ1NworCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJUaHJlYWRQb29sIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFNDAyQjAyQzUiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTEyNzYKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDQ1OAorCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDM4NCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANDU3CisJCQkgICAgaGVpZ2h0ICAgICAJMzA0CisJCQkgICAgeV9jb29yZCAgICAJMjQ0CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlRjcFdvcmtlclRocmVhZCIgQDQ1OQorCQkJbG9jYXRpb24gICAJKDUxMiwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQ1OQorCQkJICAgIGxvY2F0aW9uICAgCSg1MTIsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMzMyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJUY3BXb3JrZXJUaHJlYWQiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkU0MDMyMDBGOCIKKwkJCXdpZHRoICAgICAgCTM1MAorCQkJaGVpZ2h0ICAgICAJMTI3NgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDYwCisJCQkgICAgbG9jYXRpb24gICAJKDUxMiwgMzg0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA0NTkKKwkJCSAgICBoZWlnaHQgICAgIAkyNDQKKwkJCSAgICB5X2Nvb3JkICAgIAkxODQKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiSHR0cDExUHJvdG9jb2wiIEA0NjEKKwkJCWxvY2F0aW9uICAgCSg4NDgsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjEKKwkJCSAgICBsb2NhdGlvbiAgIAkoODQ4LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiSHR0cDExUHJvdG9jb2wiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkU0MDc1MDE3NyIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMTI3NgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDYyCisJCQkgICAgbG9jYXRpb24gICAJKDg0OCwgNDAwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA0NjEKKwkJCSAgICBoZWlnaHQgICAgIAkxNjgKKwkJCSAgICB5X2Nvb3JkICAgIAkxMDgKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDYzCisJCQkgICAgbG9jYXRpb24gICAJKDg0OCwgNDQ4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA0NjEKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0NjQKKwkJCSAgICBsb2NhdGlvbiAgIAkoODQ4LCA1OTIpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDQ2MQorCQkJICAgIGhlaWdodCAgICAgCTEyMAorCQkJICAgIHlfY29vcmQgICAgCTYwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDQ2NQorCQkJICAgIGxvY2F0aW9uICAgCSg4NDgsIDU5MikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANDYxCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDY2CisJCQkgICAgbG9jYXRpb24gICAJKDg0OCwgNzM2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA0NjEKKwkJCSAgICBoZWlnaHQgICAgIAk2NzQKKwkJCSAgICB5X2Nvb3JkICAgIAk2MTQKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDY3CisJCQkgICAgbG9jYXRpb24gICAJKDg0OCwgNzM2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA0NjEKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJDb3lvdGVBZGFwdGVyIiBANDY4CisJCQlsb2NhdGlvbiAgIAkoMTE2OCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQ2OAorCQkJICAgIGxvY2F0aW9uICAgCSgxMTY4LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiQ295b3RlQWRhcHRlciIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTQxMDYwMERGIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxMjc2CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0NjkKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTE2OCwgODQ4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA0NjgKKwkJCSAgICBoZWlnaHQgICAgIAk1MDIKKwkJCSAgICB5X2Nvb3JkICAgIAk0NDIKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDcwCisJCQkgICAgbG9jYXRpb24gICAJKDExNjgsIDk0NCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANDY4CisJCQkgICAgaGVpZ2h0ICAgICAJMzUyCisJCQkgICAgeV9jb29yZCAgICAJMjkyCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDcxCisJCQkgICAgbG9jYXRpb24gICAJKDExNjgsIDk0NCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANDY4CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRFbmdpbmUiIEA0NzIKKwkJCWxvY2F0aW9uICAgCSgxNTIwLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlANDcyCisJCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMzYzCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZEVuZ2luZSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTQyNEIwMzQ5IgorCQkJd2lkdGggICAgICAJMzgxCisJCQloZWlnaHQgICAgIAkxMjc2CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0NzMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgMTAwOCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANDcyCisJCQkgICAgaGVpZ2h0ICAgICAJMjI4CisJCQkgICAgeV9jb29yZCAgICAJMTY4CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkUGlwZWxpbmUiIEA0NzQKKwkJCWxvY2F0aW9uICAgCSgxODcyLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlANDc0CisJCQkgICAgbG9jYXRpb24gICAJKDE4NzIsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZFBpcGVsaW5lIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFNDI5MDAwNDUiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTEyNzYKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDQ3NQorCQkJICAgIGxvY2F0aW9uICAgCSgxODcyLCAxMDQwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA0NzQKKwkJCSAgICBoZWlnaHQgICAgIAkxMzYKKwkJCSAgICB5X2Nvb3JkICAgIAk3NgorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZFZhbHZlQ29udGV4dCIgQDQ3NgorCQkJbG9jYXRpb24gICAJKDIxOTIsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzYKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjE5MiwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkVmFsdmVDb250ZXh0IikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFNDJDMDAyQjEiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTEyNzYKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDQ3NworCQkJICAgIGxvY2F0aW9uICAgCSgyMTkyLCAxMDU2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA0NzYKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDQ3OAorCQkJbG9jYXRpb24gICAJKDE2LCAzODQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDc5CisJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMzQzLCAzNDApCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQwRTcwMUFFIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTEyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJydW5JdCgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA0NTcKKwkJCXN1cHBsaWVyICAgCUA0NTkKKwkJCUZvY3VzX1NyYyAgCUA0NTgKKwkJCUZvY3VzX0VudHJ5IAlANDYwCisJCQlvcmlnaW4gICAgIAkoMTkxLCAzODQpCisJCQl0ZXJtaW51cyAgIAkoNDk2LCAzODQpCisJCQlvcmRpbmFsICAgIAkwKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA0ODAKKwkJCWxvY2F0aW9uICAgCSgxNiwgNDAwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4MQorCQkJICAgIFBhcmVudF9WaWV3IAlANDgwCisJCQkgICAgbG9jYXRpb24gICAJKDY3OSwgMzU2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0MEZDMDEwRSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTM1OQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkicHJvY2Vzc0Nvbm5lY3Rpb24iCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDQ1OQorCQkJc3VwcGxpZXIgICAJQDQ2MQorCQkJRm9jdXNfU3JjICAJQDQ2MAorCQkJRm9jdXNfRW50cnkgCUA0NjIKKwkJCW9yaWdpbiAgICAgCSg1MjcsIDQwMCkKKwkJCXRlcm1pbnVzICAgCSg4MzIsIDQwMCkKKwkJCW9yZGluYWwgICAgCTEpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBANDgyCisJCQlsb2NhdGlvbiAgIAkoMTYsIDQ0OCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODMKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQ4MgorCQkJICAgIGxvY2F0aW9uICAgCSg5NjksIDQwNSkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNDExMTAyOUYiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxNzUKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInByb2Nlc3MoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjY2NworCQkJICAgIGhlaWdodCAgICAgCTQ0CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANDYxCisJCQlzdXBwbGllciAgIAlANDYxCisJCQlGb2N1c19TcmMgIAlANDYyCisJCQlGb2N1c19FbnRyeSAJQDQ2MworCQkJb3JpZ2luICAgICAJKDg2NCwgNDQ4KQorCQkJdGVybWludXMgICAJKDEwMTQsIDQ0OCkKKwkJCW9yZGluYWwgICAgCTIpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBANDg0CisJCQlsb2NhdGlvbiAgIAkoMTYsIDU5MikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODUKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQ4NAorCQkJICAgIGxvY2F0aW9uICAgCSgxMDQ4LCA1NDkpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQxNUMwMTUxIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjkxCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJwYXJzZUhlYWRlcnMoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkxLjIyNjY2NworCQkJICAgIGhlaWdodCAgICAgCTQ0CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANDYxCisJCQlzdXBwbGllciAgIAlANDYxCisJCQlGb2N1c19TcmMgIAlANDY0CisJCQlGb2N1c19FbnRyeSAJQDQ2NQorCQkJb3JpZ2luICAgICAJKDg2NCwgNTkyKQorCQkJdGVybWludXMgICAJKDEwMTQsIDU5MikKKwkJCW9yZGluYWwgICAgCTMpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBANDg2CisJCQlsb2NhdGlvbiAgIAkoMTYsIDczNikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODcKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQ4NgorCQkJICAgIGxvY2F0aW9uICAgCSgxMDUyLCA2OTIpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQxQTYwMTYxIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMzI4CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJwcmVwYXJlUmVxdWVzdCgpIgorCQkJICAgIHBjdERpc3QgICAgCTEuMjUzMzMzCisJCQkgICAgaGVpZ2h0ICAgICAJNDQKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA0NjEKKwkJCXN1cHBsaWVyICAgCUA0NjEKKwkJCUZvY3VzX1NyYyAgCUA0NjYKKwkJCUZvY3VzX0VudHJ5IAlANDY3CisJCQlvcmlnaW4gICAgIAkoODY0LCA3MzYpCisJCQl0ZXJtaW51cyAgIAkoMTAxNCwgNzM2KQorCQkJb3JkaW5hbCAgICAJNCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANDg4CisJCQlsb2NhdGlvbiAgIAkoOTkyLCA4NDgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDg5CisJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNywgODA0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0MUQ2MDEwNyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE2MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic2VydmljZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA0NjEKKwkJCXN1cHBsaWVyICAgCUA0NjgKKwkJCUZvY3VzX1NyYyAgCUA0NjYKKwkJCUZvY3VzX0VudHJ5IAlANDY5CisJCQlvcmlnaW4gICAgIAkoODYzLCA4NDgpCisJCQl0ZXJtaW51cyAgIAkoMTE1MiwgODQ4KQorCQkJb3JkaW5hbCAgICAJNSkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEA0OTAKKwkJCWxvY2F0aW9uICAgCSgxNiwgOTQ0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5MQorCQkJICAgIFBhcmVudF9WaWV3IAlANDkwCisJCQkgICAgbG9jYXRpb24gICAJKDEzNzIsIDkxNikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNDIyQzAxRjEiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkzNzMKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInBvc3RQYXJzZVJlcXVlc3QoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkxLjI1MzMzMworCQkJICAgIGhlaWdodCAgICAgCTI4CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANDY4CisJCQlzdXBwbGllciAgIAlANDY4CisJCQlGb2N1c19TcmMgIAlANDcwCisJCQlGb2N1c19FbnRyeSAJQDQ3MQorCQkJb3JpZ2luICAgICAJKDExODQsIDk0NCkKKwkJCXRlcm1pbnVzICAgCSgxMzM0LCA5NDQpCisJCQlvcmRpbmFsICAgIAk2KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA0OTIKKwkJCWxvY2F0aW9uICAgCSgxMzQ0LCAxMDA4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5MworCQkJICAgIFBhcmVudF9WaWV3IAlANDkyCisJCQkgICAgbG9jYXRpb24gICAJKDEzNDMsIDk2NCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNDI4MDAyMzgiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxNDkKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImludm9rZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA0NjgKKwkJCXN1cHBsaWVyICAgCUA0NzIKKwkJCUZvY3VzX1NyYyAgCUA0NzAKKwkJCUZvY3VzX0VudHJ5IAlANDczCisJCQlvcmlnaW4gICAgIAkoMTE4MywgMTAwOCkKKwkJCXRlcm1pbnVzICAgCSgxNTA0LCAxMDA4KQorCQkJb3JkaW5hbCAgICAJNykKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANDk0CisJCQlsb2NhdGlvbiAgIAkoMTYsIDEwNDApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDk1CisJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NSwgOTk2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0MjlBMDAyRCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE0OQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW52b2tlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDQ3MgorCQkJc3VwcGxpZXIgICAJQDQ3NAorCQkJRm9jdXNfU3JjICAJQDQ3MworCQkJRm9jdXNfRW50cnkgCUA0NzUKKwkJCW9yaWdpbiAgICAgCSgxNTM1LCAxMDQwKQorCQkJdGVybWludXMgICAJKDE4NTYsIDEwNDApCisJCQlvcmRpbmFsICAgIAk4KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA0OTYKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTA1NikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTcKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQ5NgorCQkJICAgIGxvY2F0aW9uICAgCSgyMDMxLCAxMDEyKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0MkNFMDIzMCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE0OQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW52b2tlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDQ3NAorCQkJc3VwcGxpZXIgICAJQDQ3NgorCQkJRm9jdXNfU3JjICAJQDQ3NQorCQkJRm9jdXNfRW50cnkgCUA0NzcKKwkJCW9yaWdpbiAgICAgCSgxODg3LCAxMDU2KQorCQkJdGVybWludXMgICAJKDIxNzYsIDEwNTYpCisJCQlvcmRpbmFsICAgIAk5KQorCQkgICAgKG9iamVjdCBOb3RlVmlldyBANDk4CisJCQlsb2NhdGlvbiAgIAkoMjAwMCwgMjAxNikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlANDk4CisJCQkgICAgbG9jYXRpb24gICAJKDE4NjIsIDE5NTYpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjQwCisJCQkgICAgbGFiZWwgICAgICAJIlNlZSBuZXh0IGRpYWdyYW0iKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMTMyKQorCQkgICAgKG9iamVjdCBBdHRhY2hWaWV3ICIiIEA0OTkKKwkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA0OTgKKwkJCXN1cHBsaWVyICAgCUA0NzYKKwkJCWxpbmVfc3R5bGUgCTApKSkKKwkgICAgKG9iamVjdCBJbnRlcmFjdGlvbkRpYWdyYW0gIjIuIGNhdGFsaW5hX3JlcXVlc3RfMiIKKwkJbWVjaGFuaXNtX3JlZiAJQDg5CisJCXF1aWQgICAgICAgCSIzREZFNDJGNzAyNEMiCisJCXRpdGxlICAgICAgCSIyLiBjYXRhbGluYV9yZXF1ZXN0XzIiCisJCXpvb20gICAgICAgCTEwMAorCQltYXhfaGVpZ2h0IAkyODM1MAorCQltYXhfd2lkdGggIAkyMTYwMAorCQlvcmlnaW5feCAgIAkwCisJCW9yaWdpbl95ICAgCTAKKwkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZENvbnRleHRWYWx2ZSIgQDUwMAorCQkJbG9jYXRpb24gICAJKDIyNCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDUwMAorCQkJICAgIGxvY2F0aW9uICAgCSgyMjQsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJNDAxCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZENvbnRleHRWYWx2ZSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTQzMDcwMDFFIgorCQkJd2lkdGggICAgICAJNDE5CisJCQloZWlnaHQgICAgIAkxNjc4CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1MDEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjI0LCAzODQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDUwMAorCQkJICAgIGhlaWdodCAgICAgCTM4NgorCQkJICAgIHlfY29vcmQgICAgCTMyNgorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1MDIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjI0LCA3MDQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDUwMAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDUwMworCQkJICAgIGxvY2F0aW9uICAgCSgyMjQsIDg5NikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTAwCisJCQkgICAgaGVpZ2h0ICAgICAJOTE2CisJCQkgICAgeV9jb29yZCAgICAJODU2CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDUwNAorCQkJICAgIGxvY2F0aW9uICAgCSgyMjQsIDEwMjQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDUwMAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDUwNQorCQkJICAgIGxvY2F0aW9uICAgCSgyMjQsIDEyODApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDUwMAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkRW5naW5lVmFsdmUiIEA1MDYKKwkJCWxvY2F0aW9uICAgCSg1OTIsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDYKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTkyLCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRFbmdpbmVWYWx2ZSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTQzMjgwMUYzIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxNjc4CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1MDcKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTkyLCAzODQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDUwNgorCQkJICAgIGhlaWdodCAgICAgCTI2NAorCQkJICAgIHlfY29vcmQgICAgCTIwNAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZEhvc3QiIEA1MDgKKwkJCWxvY2F0aW9uICAgCSg5MTIsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDgKKwkJCSAgICBsb2NhdGlvbiAgIAkoOTEyLCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRIb3N0IikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFNDM2NTAzQkQiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTE2NzgKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDUwOQorCQkJICAgIGxvY2F0aW9uICAgCSg5MTIsIDQxNikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTA4CisJCQkgICAgaGVpZ2h0ICAgICAJNDMxCisJCQkgICAgeV9jb29yZCAgICAJMzcxCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDUxMAorCQkJICAgIGxvY2F0aW9uICAgCSg5MTIsIDUyOCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTA4CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTExCisJCQkgICAgbG9jYXRpb24gICAJKDkxMiwgNzA0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1MDgKKwkJCSAgICBoZWlnaHQgICAgIAkxMjAKKwkJCSAgICB5X2Nvb3JkICAgIAk2MAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIkVycm9yUmVwb3J0VmFsdmUiIEA1MTIKKwkJCWxvY2F0aW9uICAgCSgxMjY0LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlANTEyCisJCQkgICAgbG9jYXRpb24gICAJKDEyNjQsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjk0CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJFcnJvclJlcG9ydFZhbHZlIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFNDM4QzAyOEQiCisJCQl3aWR0aCAgICAgIAkzMTIKKwkJCWhlaWdodCAgICAgCTE2NzgKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDUxMworCQkJICAgIGxvY2F0aW9uICAgCSgxMjY0LCA4OTYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDUxMgorCQkJICAgIGhlaWdodCAgICAgCTI0OAorCQkJICAgIHlfY29vcmQgICAgCTE4OAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1MTQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTI2NCwgOTQ0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1MTIKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJFcnJvckRpc3BhdGNoZXJWYWx2ZSIgQDUxNQorCQkJbG9jYXRpb24gICAJKDE1ODQsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTUKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTU4NCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyOTUKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIkVycm9yRGlzcGF0Y2hlclZhbHZlIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFNDUxRjAxRUMiCisJCQl3aWR0aCAgICAgIAkzMTMKKwkJCWhlaWdodCAgICAgCTE2NzgKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDUxNgorCQkJICAgIGxvY2F0aW9uICAgCSgxNTg0LCAxMTY4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1MTUKKwkJCSAgICBoZWlnaHQgICAgIAkyMzIKKwkJCSAgICB5X2Nvb3JkICAgIAkxNzIKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRIb3N0VmFsdmUiIEA1MTcKKwkJCWxvY2F0aW9uICAgCSgxOTA0LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlANTE3CisJCQkgICAgbG9jYXRpb24gICAJKDE5MDQsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjk1CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZEhvc3RWYWx2ZSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTQ3MzEwMTMwIgorCQkJd2lkdGggICAgICAJMzEzCisJCQloZWlnaHQgICAgIAkxNjc4CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1MTgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTkwNCwgMTQ3MikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTE3CisJCQkgICAgaGVpZ2h0ICAgICAJMjgwCisJCQkgICAgeV9jb29yZCAgICAJMjIwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDUxOQorCQkJICAgIGxvY2F0aW9uICAgCSgxOTA0LCAxNTM2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1MTcKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZENvbnRleHQiIEA1MjAKKwkJCWxvY2F0aW9uICAgCSgyMjI0LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlANTIwCisJCQkgICAgbG9jYXRpb24gICAJKDIyMjQsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZENvbnRleHQiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkU0N0MxMDBGMSIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMTY3OAorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTIxCisJCQkgICAgbG9jYXRpb24gICAJKDIyMjQsIDE2MzIpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDUyMAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTIyCisJCQlsb2NhdGlvbiAgIAkoMTYsIDM4NCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjMKKwkJCSAgICBQYXJlbnRfVmlldyAJQDUyMgorCQkJICAgIGxvY2F0aW9uICAgCSg0MDcsIDM0MCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNDM0QzAxOUIiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxNDYKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImludm9rZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA1MDAKKwkJCXN1cHBsaWVyICAgCUA1MDYKKwkJCUZvY3VzX1NyYyAgCUA1MDEKKwkJCUZvY3VzX0VudHJ5IAlANTA3CisJCQlvcmlnaW4gICAgIAkoMjM5LCAzODQpCisJCQl0ZXJtaW51cyAgIAkoNTc2LCAzODQpCisJCQlvcmRpbmFsICAgIAkwKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA1MjQKKwkJCWxvY2F0aW9uICAgCSgxNiwgNDE2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyNQorCQkJICAgIFBhcmVudF9WaWV3IAlANTI0CisJCQkgICAgbG9jYXRpb24gICAJKDc1MSwgMzcyKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0MzZDMDA5RCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTEwNworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkibWFwKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDUwNgorCQkJc3VwcGxpZXIgICAJQDUwOAorCQkJRm9jdXNfU3JjICAJQDUwNworCQkJRm9jdXNfRW50cnkgCUA1MDkKKwkJCW9yaWdpbiAgICAgCSg2MDcsIDQxNikKKwkJCXRlcm1pbnVzICAgCSg4OTYsIDQxNikKKwkJCW9yZGluYWwgICAgCTEpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDUyNgorCQkJbG9jYXRpb24gICAJKDgwMCwgNTI4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyNworCQkJICAgIFBhcmVudF9WaWV3IAlANTI2CisJCQkgICAgbG9jYXRpb24gICAJKDc1MSwgNDg0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0MzgzMDA2MyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE0NgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW52b2tlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDUwNgorCQkJc3VwcGxpZXIgICAJQDUwOAorCQkJRm9jdXNfU3JjICAJQDUwNworCQkJRm9jdXNfRW50cnkgCUA1MTAKKwkJCW9yaWdpbiAgICAgCSg2MDcsIDUyOCkKKwkJCXRlcm1pbnVzICAgCSg4OTYsIDUyOCkKKwkJCW9yZGluYWwgICAgCTIpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDUyOAorCQkJbG9jYXRpb24gICAJKDYwOCwgNzA0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyOQorCQkJICAgIFBhcmVudF9WaWV3IAlANTI4CisJCQkgICAgbG9jYXRpb24gICAJKDU2OCwgNjYwKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0M0I5MDNCRiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE0NgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW52b2tlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkxKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDUwOAorCQkJc3VwcGxpZXIgICAJQDUwMAorCQkJRm9jdXNfU3JjICAJQDUxMQorCQkJRm9jdXNfRW50cnkgCUA1MDIKKwkJCW9yaWdpbiAgICAgCSg4OTYsIDcwNCkKKwkJCXRlcm1pbnVzICAgCSgyNDAsIDcwNCkKKwkJCW9yZGluYWwgICAgCTMpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDUzMAorCQkJbG9jYXRpb24gICAJKDc1MiwgODk2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzMQorCQkJICAgIFBhcmVudF9WaWV3IAlANTMwCisJCQkgICAgbG9jYXRpb24gICAJKDc0MywgODUyKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0M0MyMDNBNCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE0NgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW52b2tlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDUwMAorCQkJc3VwcGxpZXIgICAJQDUxMgorCQkJRm9jdXNfU3JjICAJQDUwMworCQkJRm9jdXNfRW50cnkgCUA1MTMKKwkJCW9yaWdpbiAgICAgCSgyMzksIDg5NikKKwkJCXRlcm1pbnVzICAgCSgxMjQ4LCA4OTYpCisJCQlvcmRpbmFsICAgIAk0KQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDUzMgorCQkJbG9jYXRpb24gICAJKDE2LCA5NDQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMzCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTM1NSwgOTAwKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0NDI1MDFCMSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTEzNQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkicmVwb3J0KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDUxMgorCQkJc3VwcGxpZXIgICAJQDUxMgorCQkJRm9jdXNfU3JjICAJQDUxMworCQkJRm9jdXNfRW50cnkgCUA1MTQKKwkJCW9yaWdpbiAgICAgCSgxMjgwLCA5NDQpCisJCQl0ZXJtaW51cyAgIAkoMTQzMCwgOTQ0KQorCQkJb3JkaW5hbCAgICAJNSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTM0CisJCQlsb2NhdGlvbiAgIAkoMTYsIDEwMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTM1CisJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzQKKwkJCSAgICBsb2NhdGlvbiAgIAkoNzQ0LCA5ODApCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQ2MzMwMjkzIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjMwCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnZva2VOZXh0KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkxKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDUxMgorCQkJc3VwcGxpZXIgICAJQDUwMAorCQkJRm9jdXNfU3JjICAJQDUxMworCQkJRm9jdXNfRW50cnkgCUA1MDQKKwkJCW9yaWdpbiAgICAgCSgxMjQ4LCAxMDI0KQorCQkJdGVybWludXMgICAJKDI0MCwgMTAyNCkKKwkJCW9yZGluYWwgICAgCTYpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDUzNgorCQkJbG9jYXRpb24gICAJKDk0NCwgMTE2OCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzcKKwkJCSAgICBQYXJlbnRfVmlldyAJQDUzNgorCQkJICAgIGxvY2F0aW9uICAgCSg5MDMsIDExMjQpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQ2RTcwMDI2IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTQ2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnZva2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTAwCisJCQlzdXBwbGllciAgIAlANTE1CisJCQlGb2N1c19TcmMgIAlANTAzCisJCQlGb2N1c19FbnRyeSAJQDUxNgorCQkJb3JpZ2luICAgICAJKDIzOSwgMTE2OCkKKwkJCXRlcm1pbnVzICAgCSgxNTY4LCAxMTY4KQorCQkJb3JkaW5hbCAgICAJNykKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTM4CisJCQlsb2NhdGlvbiAgIAkoMTYsIDEyODApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTM5CisJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzgKKwkJCSAgICBsb2NhdGlvbiAgIAkoOTA0LCAxMjM2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0NzVEMDNBMCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTIwNgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW52b2tlTmV4dCIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTEpCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTE1CisJCQlzdXBwbGllciAgIAlANTAwCisJCQlGb2N1c19TcmMgIAlANTE2CisJCQlGb2N1c19FbnRyeSAJQDUwNQorCQkJb3JpZ2luICAgICAJKDE1NjgsIDEyODApCisJCQl0ZXJtaW51cyAgIAkoMjQwLCAxMjgwKQorCQkJb3JkaW5hbCAgICAJOCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTQwCisJCQlsb2NhdGlvbiAgIAkoMTE4NCwgMTQ3MikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDEKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU0MAorCQkJICAgIGxvY2F0aW9uICAgCSgxMDYzLCAxNDI4KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0NzY1MDNDQSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE0NgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW52b2tlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDUwMAorCQkJc3VwcGxpZXIgICAJQDUxNworCQkJRm9jdXNfU3JjICAJQDUwMworCQkJRm9jdXNfRW50cnkgCUA1MTgKKwkJCW9yaWdpbiAgICAgCSgyMzksIDE0NzIpCisJCQl0ZXJtaW51cyAgIAkoMTg4OCwgMTQ3MikKKwkJCW9yZGluYWwgICAgCTkpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBANTQyCisJCQlsb2NhdGlvbiAgIAkoMTYsIDE1MzYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQzCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTk5NSwgMTQ5MikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNDdDRDAxNjciCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkyOTUKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIm1hcCgpIC8vQ29udGV4dCIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTE3CisJCQlzdXBwbGllciAgIAlANTE3CisJCQlGb2N1c19TcmMgIAlANTE4CisJCQlGb2N1c19FbnRyeSAJQDUxOQorCQkJb3JpZ2luICAgICAJKDE5MjAsIDE1MzYpCisJCQl0ZXJtaW51cyAgIAkoMjA3MCwgMTUzNikKKwkJCW9yZGluYWwgICAgCTEwKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA1NDQKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTYzMikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDUKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU0NAorCQkJICAgIGxvY2F0aW9uICAgCSgyMDYzLCAxNTg4KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0N0Q1MDBCNCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE0NgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW52b2tlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDUxNworCQkJc3VwcGxpZXIgICAJQDUyMAorCQkJRm9jdXNfU3JjICAJQDUxOAorCQkJRm9jdXNfRW50cnkgCUA1MjEKKwkJCW9yaWdpbiAgICAgCSgxOTE5LCAxNjMyKQorCQkJdGVybWludXMgICAJKDIyMDgsIDE2MzIpCisJCQlvcmRpbmFsICAgIAkxMSkpKQorCSAgICAob2JqZWN0IEludGVyYWN0aW9uRGlhZ3JhbSAiMy4gY2F0YWxpbmFfcmVxdWVzdF8zIgorCQltZWNoYW5pc21fcmVmIAlAOTAKKwkJcXVpZCAgICAgICAJIjNERkU0OEEyMDJBRCIKKwkJdGl0bGUgICAgICAJIjMuIGNhdGFsaW5hX3JlcXVlc3RfMyIKKwkJem9vbSAgICAgICAJMTAwCisJCW1heF9oZWlnaHQgCTI4MzUwCisJCW1heF93aWR0aCAgCTIxNjAwCisJCW9yaWdpbl94ICAgCTYxMgorCQlvcmlnaW5feSAgIAk5MzgKKwkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZENvbnRleHQiIEA1NDYKKwkJCWxvY2F0aW9uICAgCSgxNjAsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDYKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTYwLCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRDb250ZXh0IikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFNDhCMDAxRDEiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTIyMjYKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDU0NworCQkJICAgIGxvY2F0aW9uICAgCSgxNjAsIDQwMCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTQ2CisJCQkgICAgaGVpZ2h0ICAgICAJMTk2MAorCQkJICAgIHlfY29vcmQgICAgCTE5MDAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRQaXBlbGluZSIgQDU0OAorCQkJbG9jYXRpb24gICAJKDQ4MCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU0OAorCQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZFBpcGVsaW5lIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFNDhCODAwODgiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTIyMjYKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDU0OQorCQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDQwMCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTQ4CisJCQkgICAgaGVpZ2h0ICAgICAJMTkwMAorCQkJICAgIHlfY29vcmQgICAgCTE4NDAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTUwCisJCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgMTA4OCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTQ4CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRWYWx2ZUNvbnRleHQiIEA1NTEKKwkJCWxvY2F0aW9uICAgCSg4MDAsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTEKKwkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRWYWx2ZUNvbnRleHQiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkU0OEQwMDBEQyIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMjIyNgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTUyCisJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgNzM2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1NTEKKwkJCSAgICBoZWlnaHQgICAgIAkxNTEwCisJCQkgICAgeV9jb29yZCAgICAJMTQ1MAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1NTMKKwkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAxMTY4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1NTEKKwkJCSAgICBoZWlnaHQgICAgIAkxMDcyCisJCQkgICAgeV9jb29yZCAgICAJMTAxMgorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkQ29udGV4dFZhbHZlIiBANTU0CisJCQlsb2NhdGlvbiAgIAkoMTEwNCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU1NAorCQkJICAgIGxvY2F0aW9uICAgCSgxMTA0LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRDb250ZXh0VmFsdmUiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkU0OTAzMDNBNyIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMjIyNgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTU1CisJCQkgICAgbG9jYXRpb24gICAJKDExMDQsIDgwMCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTU0CisJCQkgICAgaGVpZ2h0ICAgICAJNDY4CisJCQkgICAgeV9jb29yZCAgICAJNDA4CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDU1NgorCQkJICAgIGxvY2F0aW9uICAgCSgxMTA0LCA4NDgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDU1NAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkV3JhcHBlciIgQDU1NworCQkJbG9jYXRpb24gICAJKDE0MjQsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTcKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTQyNCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODgKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkV3JhcHBlciIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTQ5MzcwMzUxIgorCQkJd2lkdGggICAgICAJMzA2CisJCQloZWlnaHQgICAgIAkyMjI2CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1NTgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTQyNCwgOTQ0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1NTcKKwkJCSAgICBoZWlnaHQgICAgIAkyNjQKKwkJCSAgICB5X2Nvb3JkICAgIAkyMDQKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTU5CisJCQkgICAgbG9jYXRpb24gICAJKDE0MjQsIDE1MjApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDU1NworCQkJICAgIGhlaWdodCAgICAgCTM0MAorCQkJICAgIHlfY29vcmQgICAgCTI4MAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZFdyYXBwZXJWYWx2ZSIgQDU2MAorCQkJbG9jYXRpb24gICAJKDE3NDQsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc0NCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkV3JhcHBlclZhbHZlIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFNDk4OTAwNTYiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTIyMjYKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDU2MQorCQkJICAgIGxvY2F0aW9uICAgCSgxNzQ0LCAxNDQwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1NjAKKwkJCSAgICBoZWlnaHQgICAgIAk3NDAKKwkJCSAgICB5X2Nvb3JkICAgIAk2ODAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTYyCisJCQkgICAgbG9jYXRpb24gICAJKDE3NDQsIDE2MTYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDU2MAorCQkJICAgIGhlaWdodCAgICAgCTE4NAorCQkJICAgIHlfY29vcmQgICAgCTEyNAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1NjMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc0NCwgMjAwMCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTYwCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiQXBwbGljYXRpb25GaWx0ZXJDaGFpbiIgQDU2NAorCQkJbG9jYXRpb24gICAJKDIwNjQsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjA2NCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIkFwcGxpY2F0aW9uRmlsdGVyQ2hhaW4iKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkU0QTE1MDBCMiIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMjIyNgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTY1CisJCQkgICAgbG9jYXRpb24gICAJKDIwNjQsIDE2ODApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDU2NAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1NjYKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjA2NCwgMTgwOCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTY0CisJCQkgICAgaGVpZ2h0ICAgICAJMzEyCisJCQkgICAgeV9jb29yZCAgICAJMjUyCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDU2NworCQkJICAgIGxvY2F0aW9uICAgCSgyMDY0LCAxODcyKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1NjQKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTY4CisJCQlsb2NhdGlvbiAgIAkoMzM2LCA0MDApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTY5CisJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMzE5LCAzNTYpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQ4QkUwMjY4IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTQ3CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnZva2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTQ2CisJCQlzdXBwbGllciAgIAlANTQ4CisJCQlGb2N1c19TcmMgIAlANTQ3CisJCQlGb2N1c19FbnRyeSAJQDU0OQorCQkJb3JpZ2luICAgICAJKDE3NSwgNDAwKQorCQkJdGVybWludXMgICAJKDQ2NCwgNDAwKQorCQkJb3JkaW5hbCAgICAJMCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTcwCisJCQlsb2NhdGlvbiAgIAkoMTYsIDczNikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NzEKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU3MAorCQkJICAgIGxvY2F0aW9uICAgCSg2MzksIDY5MikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNDhFQTAwM0EiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxNDcKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImludm9rZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA1NDgKKwkJCXN1cHBsaWVyICAgCUA1NTEKKwkJCUZvY3VzX1NyYyAgCUA1NDkKKwkJCUZvY3VzX0VudHJ5IAlANTUyCisJCQlvcmlnaW4gICAgIAkoNDk1LCA3MzYpCisJCQl0ZXJtaW51cyAgIAkoNzg0LCA3MzYpCisJCQlvcmRpbmFsICAgIAkxKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA1NzIKKwkJCWxvY2F0aW9uICAgCSgxNiwgODAwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3MworCQkJICAgIFBhcmVudF9WaWV3IAlANTcyCisJCQkgICAgbG9jYXRpb24gICAJKDk1MSwgNzU2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0OTExMDJENiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE0NworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW52b2tlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDU1MQorCQkJc3VwcGxpZXIgICAJQDU1NAorCQkJRm9jdXNfU3JjICAJQDU1MgorCQkJRm9jdXNfRW50cnkgCUA1NTUKKwkJCW9yaWdpbiAgICAgCSg4MTUsIDgwMCkKKwkJCXRlcm1pbnVzICAgCSgxMDg4LCA4MDApCisJCQlvcmRpbmFsICAgIAkyKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDU3NAorCQkJbG9jYXRpb24gICAJKDE2LCA4NDgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTc1CisJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTMyMiwgODIxKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0OTJGMDMzRCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTQzNworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkibWFwIC8vcmV0dXJuIFdyYXBwZXIiCisJCQkgICAgcGN0RGlzdCAgICAJMS4zNDY2NjcKKwkJCSAgICBoZWlnaHQgICAgIAkyOAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDU1NAorCQkJc3VwcGxpZXIgICAJQDU1NAorCQkJRm9jdXNfU3JjICAJQDU1NQorCQkJRm9jdXNfRW50cnkgCUA1NTYKKwkJCW9yaWdpbiAgICAgCSgxMTIwLCA4NDgpCisJCQl0ZXJtaW51cyAgIAkoMTI3MCwgODQ4KQorCQkJb3JkaW5hbCAgICAJMykKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTc2CisJCQlsb2NhdGlvbiAgIAkoMTI2NCwgOTQ0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3NworCQkJICAgIFBhcmVudF9WaWV3IAlANTc2CisJCQkgICAgbG9jYXRpb24gICAJKDEyNjIsIDkwMSkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNDk0QTAxNTEiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxNDcKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImludm9rZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNDk4MjcwCisJCQkgICAgaGVpZ2h0ICAgICAJNDQKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA1NTQKKwkJCXN1cHBsaWVyICAgCUA1NTcKKwkJCUZvY3VzX1NyYyAgCUA1NTUKKwkJCUZvY3VzX0VudHJ5IAlANTU4CisJCQlvcmlnaW4gICAgIAkoMTExOSwgOTQ0KQorCQkJdGVybWludXMgICAJKDE0MDgsIDk0NCkKKwkJCW9yZGluYWwgICAgCTQpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDU3OAorCQkJbG9jYXRpb24gICAJKDk2MCwgMTA4OCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NzkKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU3OAorCQkJICAgIGxvY2F0aW9uICAgCSg5NTIsIDEwNDQpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQ5NUYwMjg4IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTQ3CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnZva2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTEpCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTU3CisJCQlzdXBwbGllciAgIAlANTQ4CisJCQlGb2N1c19TcmMgIAlANTU4CisJCQlGb2N1c19FbnRyeSAJQDU1MAorCQkJb3JpZ2luICAgICAJKDE0MDgsIDEwODgpCisJCQl0ZXJtaW51cyAgIAkoNDk2LCAxMDg4KQorCQkJb3JkaW5hbCAgICAJNSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTgwCisJCQlsb2NhdGlvbiAgIAkoMTYsIDExNjgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTgxCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODAKKwkJCSAgICBsb2NhdGlvbiAgIAkoNjM5LCAxMTI0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0OTc2MDE1RCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE0NworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW52b2tlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDU0OAorCQkJc3VwcGxpZXIgICAJQDU1MQorCQkJRm9jdXNfU3JjICAJQDU0OQorCQkJRm9jdXNfRW50cnkgCUA1NTMKKwkJCW9yaWdpbiAgICAgCSg0OTUsIDExNjgpCisJCQl0ZXJtaW51cyAgIAkoNzg0LCAxMTY4KQorCQkJb3JkaW5hbCAgICAJNikKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTgyCisJCQlsb2NhdGlvbiAgIAkoMTI5NiwgMTQ0MCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODMKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU4MgorCQkJICAgIGxvY2F0aW9uICAgCSgxMjcxLCAxMzk2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0OTkzMDIzQyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE0NworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW52b2tlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDU1MQorCQkJc3VwcGxpZXIgICAJQDU2MAorCQkJRm9jdXNfU3JjICAJQDU1MworCQkJRm9jdXNfRW50cnkgCUA1NjEKKwkJCW9yaWdpbiAgICAgCSg4MTUsIDE0NDApCisJCQl0ZXJtaW51cyAgIAkoMTcyOCwgMTQ0MCkKKwkJCW9yZGluYWwgICAgCTcpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDU4NAorCQkJbG9jYXRpb24gICAJKDE2MTYsIDE1MjApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTg1CisJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTU4NCwgMTQ3NikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNDlFQzAwNEYiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxNzUKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImFsbG9jYXRlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkxKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDU2MAorCQkJc3VwcGxpZXIgICAJQDU1NworCQkJRm9jdXNfU3JjICAJQDU2MQorCQkJRm9jdXNfRW50cnkgCUA1NTkKKwkJCW9yaWdpbiAgICAgCSgxNzI4LCAxNTIwKQorCQkJdGVybWludXMgICAJKDE0NDAsIDE1MjApCisJCQlvcmRpbmFsICAgIAk4KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA1ODYKKwkJCWxvY2F0aW9uICAgCSgxNjE2LCAxNjE2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4NworCQkJICAgIFBhcmVudF9WaWV3IAlANTg2CisJCQkgICAgbG9jYXRpb24gICAJKDE1ODMsIDE1NzIpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTRBMjAwMDY3IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjQyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJyZXR1cm4gc2VydmxldCIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTU3CisJCQlzdXBwbGllciAgIAlANTYwCisJCQlGb2N1c19TcmMgIAlANTU5CisJCQlGb2N1c19FbnRyeSAJQDU2MgorCQkJb3JpZ2luICAgICAJKDE0MzksIDE2MTYpCisJCQl0ZXJtaW51cyAgIAkoMTcyOCwgMTYxNikKKwkJCW9yZGluYWwgICAgCTkpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDU4OAorCQkJbG9jYXRpb24gICAJKDE5MzYsIDE2ODApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTg5CisJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTkzNywgMTYzNikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNEEyOTAyN0UiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkzNDMKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImNyZWF0ZUZpbHRlckNoYWluKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC42MTkzNzcKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDU2MAorCQkJc3VwcGxpZXIgICAJQDU2NAorCQkJRm9jdXNfU3JjICAJQDU2MgorCQkJRm9jdXNfRW50cnkgCUA1NjUKKwkJCW9yaWdpbiAgICAgCSgxNzU5LCAxNjgwKQorCQkJdGVybWludXMgICAJKDIwNDgsIDE2ODApCisJCQlvcmRpbmFsICAgIAkxMCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTkwCisJCQlsb2NhdGlvbiAgIAkoMTYsIDE4MDgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTkxCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTkwMiwgMTc2NCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNEE0OTAyODMiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxNzAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImRvRmlsdGVyKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC40OTgyNzAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDU2MAorCQkJc3VwcGxpZXIgICAJQDU2NAorCQkJRm9jdXNfU3JjICAJQDU2MQorCQkJRm9jdXNfRW50cnkgCUA1NjYKKwkJCW9yaWdpbiAgICAgCSgxNzU5LCAxODA4KQorCQkJdGVybWludXMgICAJKDIwNDgsIDE4MDgpCisJCQlvcmRpbmFsICAgIAkxMSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICIkVU5OQU1FRCQwIiBANTkyCisJCQlsb2NhdGlvbiAgIAkoMjI0MCwgMzY4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU5MgorCQkJICAgIGxvY2F0aW9uICAgCSgyMjQwLCAzNjgpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiIikKKwkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjI0MCwgMzY4KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yICAgICAJMTAKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTIyMgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiPDxTZXJ2bGV0Pj4iKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkU0QkFFMDA1NiIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMjA4MgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTkzCisJCQkgICAgbG9jYXRpb24gICAJKDIyNDAsIDQyOCkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1OTIKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTk0CisJCQkgICAgbG9jYXRpb24gICAJKDIyNDAsIDE5ODQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDU5MgorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEA1OTUKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTg3MikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTYKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU5NQorCQkJICAgIGxvY2F0aW9uICAgCSgyMTU1LCAxODI4KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0QzI3MDFDMyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTMwOAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW50ZXJuYWxEb0ZpbHRlcigpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA1NjQKKwkJCXN1cHBsaWVyICAgCUA1NjQKKwkJCUZvY3VzX1NyYyAgCUA1NjYKKwkJCUZvY3VzX0VudHJ5IAlANTY3CisJCQlvcmlnaW4gICAgIAkoMjA4MCwgMTg3MikKKwkJCXRlcm1pbnVzICAgCSgyMjMwLCAxODcyKQorCQkJb3JkaW5hbCAgICAJMTIpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDU5NworCQkJbG9jYXRpb24gICAJKDIxNDQsIDE5ODQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTk4CisJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTcKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjE1MSwgMTk0MCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNENBNTAyQkYiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxNjIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInNlcnZpY2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTY0CisJCQlzdXBwbGllciAgIAlANTkyCisJCQlGb2N1c19TcmMgIAlANTY2CisJCQlGb2N1c19FbnRyeSAJQDU5NAorCQkJb3JpZ2luICAgICAJKDIwNzksIDE5ODQpCisJCQl0ZXJtaW51cyAgIAkoMjIyNCwgMTk4NCkKKwkJCW9yZGluYWwgICAgCTEzKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA1OTkKKwkJCWxvY2F0aW9uICAgCSgxNiwgMjAwMCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MDAKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU5OQorCQkJICAgIGxvY2F0aW9uICAgCSgxOTA0LCAxOTU2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0Q0I0MDI1QiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTExMworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkicmV0dXJuIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMSkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA1NjQKKwkJCXN1cHBsaWVyICAgCUA1NjAKKwkJCUZvY3VzX1NyYyAgCUA1NjYKKwkJCUZvY3VzX0VudHJ5IAlANTYzCisJCQlvcmlnaW4gICAgIAkoMjA0OCwgMjAwMCkKKwkJCXRlcm1pbnVzICAgCSgxNzYwLCAyMDAwKQorCQkJb3JkaW5hbCAgICAJMTQpKSkpKQorICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciCisJcXVpZCAgICAgICAJIjNERkRGNkNFMDM2QSIKKwlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAorCSAgICAob2JqZWN0IE1vZHVsZV9EaWFncmFtICJNYWluIgorCQlxdWlkICAgICAgIAkiM0RGREY2RDIwMUZEIgorCQl0aXRsZSAgICAgIAkiTWFpbiIKKwkJem9vbSAgICAgICAJMTAwCisJCW1heF9oZWlnaHQgCTI4MzUwCisJCW1heF93aWR0aCAgCTIxNjAwCisJCW9yaWdpbl94ICAgCTAKKwkJb3JpZ2luX3kgICAJMAorCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKKyAgICBwcm9jZXNzX3N0cnVjdHVyZSAJKG9iamVjdCBQcm9jZXNzZXMKKwlxdWlkICAgICAgIAkiM0RGREY2Q0UwMzczIgorCVByb2NzTkRldnMgCShsaXN0CisJICAgIChvYmplY3QgUHJvY2Vzc19EaWFncmFtICJEZXBsb3ltZW50IFZpZXciCisJCXF1aWQgICAgICAgCSIzREZERjZDRTAzODciCisJCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciCisJCXpvb20gICAgICAgCTEwMAorCQltYXhfaGVpZ2h0IAkyODM1MAorCQltYXhfd2lkdGggIAkyMTYwMAorCQlvcmlnaW5feCAgIAkwCisJCW9yaWdpbl95ICAgCTAKKwkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCisgICAgcHJvcGVydGllcyAJKG9iamVjdCBQcm9wZXJ0aWVzCisJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKKwkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCisJICAgIChvYmplY3QgQXR0cmlidXRlCisJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0CisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJwcm9qZWN0IgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJUYWJsZUNvdW50ZXIiCisJCQl2YWx1ZSAgICAgIAkwKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiVmlld0NvdW50ZXIiCisJCQl2YWx1ZSAgICAgIAkwKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRG9tYWluQ291bnRlciIKKwkJCXZhbHVlICAgICAgCTApCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJTUFBhY2thZ2VDb3VudGVyIgorCQkJdmFsdWUgICAgICAJMCkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlRyaWdnZXJDb3VudGVyIgorCQkJdmFsdWUgICAgICAJMCkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkluZGV4Q291bnRlciIKKwkJCXZhbHVlICAgICAgCTApCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50Q291bnRlciIKKwkJCXZhbHVlICAgICAgCTApCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZUNvdW50ZXIiCisJCQl2YWx1ZSAgICAgIAkwKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvdW50ZXIiCisJCQl2YWx1ZSAgICAgIAkwKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRm9yZWlnbktleUNvdW50ZXIiCisJCQl2YWx1ZSAgICAgIAkwKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSm9pbkNvdW50ZXIiCisJCQl2YWx1ZSAgICAgIAkwKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiVGFibGVTcGFjZUNvdW50ZXIiCisJCQl2YWx1ZSAgICAgIAkwKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiY09OVEFJTkVSQ291bnRlciIKKwkJCXZhbHVlICAgICAgCTApCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJUYWJsZVByZWZpeCIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiVmlld1ByZWZpeCIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRG9tYWluUHJlZml4IgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUHJlZml4IgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJbmRleFByZWZpeCIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiQ29uc3RyYWludFByZWZpeCIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVQcmVmaXgiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlQcmVmaXgiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VQcmVmaXgiCisJCQl2YWx1ZSAgICAgIAkiIikpKQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJImRtSXRlbSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRE1OYW1lIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJc0RhdGFiYXNlIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJUYXJnZXREYXRhYmFzZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiTG9jYXRpb24iCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzVGFibGVTcGFjZSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVR5cGUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzRGVhdWx0IgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJCdWZmZXJQb29sIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJFeHRlbnRTaXplIgorCQkJdmFsdWUgICAgICAJMSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlByZWZldGNoU2l6ZSIKKwkJCXZhbHVlICAgICAgCTEpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJQYWdlU2l6ZSIKKwkJCXZhbHVlICAgICAgCTQpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJNYW5hZ2VkQnkiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckxpc3QiCisJCQl2YWx1ZSAgICAgIAkiIikpKQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJImRtSXRlbSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRE1OYW1lIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJkbVNjaGVtYSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiZG1Eb21haW5QYWNrYWdlIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNEb21haW5QYWNrYWdlIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJc1Jvb3RTY2hlbWEiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzUm9vdERvbWFpblBhY2thZ2UiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzU2NoZW1hUGFja2FnZSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRGF0YWJhc2VJRCIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiREJNUyIKKwkJCXZhbHVlICAgICAgCSIiKSkpCisJICAgIChvYmplY3QgQXR0cmlidXRlCisJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiZG1JdGVtIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJETU5hbWUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzVGFibGUiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzVmlldyIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNEb21haW4iCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzU1BQYWNrYWdlIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJTeW5vbnltbnMiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VJRCIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiU291cmNlSWQiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkNvcnJlbGF0aW9uTmFtZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiU2VsZWN0Q2xhdXNlIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZWFibGUiCisJCQl2YWx1ZSAgICAgIAlUUlVFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiQ2hlY2tPcHRpb24iCisJCQl2YWx1ZSAgICAgIAkiTm9uZSIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJc1NuYXBTaG90IgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJc0Rpc3RpbmN0IgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJQZXJzaXN0VG9TZXJ2ZXIiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzUGFja2FnZSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKSkpCisJICAgIChvYmplY3QgQXR0cmlidXRlCisJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJImRtSXRlbSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRE1OYW1lIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJPcmRpbmFsIgorCQkJdmFsdWUgICAgICAJMCkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzSWRlbnRpdHkiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKKwkJCXZhbHVlICAgICAgCTApCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJTY2FsZSIKKwkJCXZhbHVlICAgICAgCTApCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIgorCQkJdmFsdWUgICAgICAJIk5hdGl2ZSIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJPSUQiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJImRtSXRlbSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRE1OYW1lIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJc1JlbGF0aW9uc2hpcCIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiU291cmNlSWQiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlJJTWV0aG9kIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlTmFtZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZU5hbWUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3QiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3ROYW1lIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHlOYW1lIgorCQkJdmFsdWUgICAgICAJIiIpKSkKKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJImRtSXRlbSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRE1OYW1lIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50TmFtZSIKKwkJCXZhbHVlICAgICAgCSIiKSkpCisJICAgIChvYmplY3QgQXR0cmlidXRlCisJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJImRtSXRlbSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRE1OYW1lIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJc0NvbnN0cmFpbnQiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRUeXBlIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJc0luZGV4IgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJc1RyaWdnZXIiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzU3RvcmVkUHJvY2VkdXJlIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJc0NsdXN0ZXIiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2UiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkZpbGxGYWN0b3IiCisJCQl2YWx1ZSAgICAgIAkwKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiS2V5TGlzdCIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiQ2hlY2tQcmVkaWNhdGUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJEZWZlcmFsTW9kZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSW5pdGlhbENoZWNrVGltZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzSW5zZXJ0RXZlbnQiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzVXBkYXRlRXZlbnQiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzRGVsZXRlRXZlbnQiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlJlZk9sZFRhYmxlIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJSZWZOZXdUYWJsZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiUmVmT2xkUm93IgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJSZWZOZXdSb3ciCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzUm93IgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJXaGVuQ2xhdXNlIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJMYW5ndWFnZSIKKwkJCXZhbHVlICAgICAgCSJTUUwiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiUHJvY1R5cGUiCisJCQl2YWx1ZSAgICAgIAkiUHJvY2VkdXJlIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzRGV0ZXJtaW5pc3RpYyIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiUGFyYW1ldGVyU3R5bGUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlJldHVybmVkTnVsbCIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRXh0ZXJuYWxOYW1lIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJMZW5ndGgiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlNjYWxlIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiCisJCQl2YWx1ZSAgICAgIAkiIikpKQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW1ldGVyIgorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0CisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNJblBhcmFtZXRlciIKKwkJCXZhbHVlICAgICAgCVRSVUUpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJc091dFBhcmFtZXRlciIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiT3JkaW5hbCIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiTGVuZ3RoIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJTY2FsZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25JRCIKKwkJCXZhbHVlICAgICAgCSIiKSkpCisJICAgIChvYmplY3QgQXR0cmlidXRlCisJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgorCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciBDb21tdW5pY2F0b3IiCisJCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgorCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJdG9vbCAgICAgICAJIkRlcGxveSIKKwkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCisJCXZhbHVlICAgICAgCUZBTFNFKQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQl0b29sICAgICAgIAkiUm9zZSBNb2RlbCBJbnRlZ3JhdG9yIgorCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKKwkJdmFsdWUgICAgICAJRkFMU0UpCisJICAgIChvYmplY3QgQXR0cmlidXRlCisJCXRvb2wgICAgICAgCSJSb3NlIFdlYiBQdWJsaXNoZXIiCisJCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgorCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJdG9vbCAgICAgICAJIldlYiBNb2RlbGVyIgorCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKKwkJdmFsdWUgICAgICAJRkFMU0UpKQorCXF1aWQgICAgICAgCSIzREZERjZDRTAzNzQiKSkKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL3N0YXJ0dXAueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvc3RhcnR1cC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlhNzc0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL3N0YXJ0dXAueG1sCkBAIC0wLDAgKzEsNTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJzdGFydHVwLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9InlvYXZzQGFwYWNoZS5vcmciPllvYXYgU2hhcGlyYTwvYXV0aG9yPgorICAgIDx0aXRsZT5TdGFydHVwPC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJTZXJ2ZXIgU3RhcnR1cCI+CisKKzxwPgorVGhpcyBwYWdlIGRlc2NyaWJlcyBob3cgdGhlIFRvbWNhdCBzZXJ2ZXIgc3RhcnRzIHVwLiAgVGhlcmUgYXJlIHNldmVyYWwKK2RpZmZlcmVudCB3YXlzIHRvIHN0YXJ0IHRvbWNhdCwgaW5jbHVkaW5nOgorPHVsPgorICA8bGk+RnJvbSB0aGUgY29tbWFuZCBsaW5lLjwvbGk+CisgIDxsaT5Gcm9tIGEgSmF2YSBwcm9ncmFtIGFzIGFuIGVtYmVkZGVkIHNlcnZlci48L2xpPgorICA8bGk+QXV0b21hdGljYWxseSBhcyBhIFdpbmRvd3Mgc2VydmljZS48L2xpPgorPC91bD4KKzwvcD4KKworPHN1YnNlY3Rpb24gbmFtZT0iZGVzY3JpcHRpb24iPgorPHA+CitBIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIHN0YXJ0dXAgcHJvY2VkdXJlIGlzIGF2YWlsYWJsZQorPGEgaHJlZj0ic3RhcnR1cC9zZXJ2ZXJTdGFydHVwLnR4dCI+aGVyZS48L2E+Cis8L3A+Cis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9ImRpYWdyYW0iPgorPHA+CitBIFVNTCBzZXF1ZW5jZSBkaWFncmFtIG9mIHRoZSBzdGFydHVwIHByb2NlZHVyZSBpcyBhdmFpbGFibGUKKzxhIGhyZWY9InN0YXJ0dXAvc2VydmVyU3RhcnR1cC5wZGYiPmhlcmUuPC9hPgorPC9wPgorPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJjb21tZW50cyI+Cis8cD4KK1RoZSBzdGFydHVwIHByb2Nlc3MgY2FuIGJlIGN1c3RvbWl6ZWQgaW4gbWFueSB3YXlzLCBib3RoCitieSBtb2RpZnlpbmcgVG9tY2F0IGNvZGUgYW5kIGJ5IGltcGxlbWVudGluZyB5b3VyIG93bgorTGlmZWN5Y2xlTGlzdGVuZXJzIHdoaWNoIGFyZSB0aGVuIHJlZ2lzdGVyZWQgaW4gdGhlIHNlcnZlci54bWwKK2NvbmZpZ3VyYXRpb24gZmlsZS4KKzwvcD4KKworPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL3N0YXJ0dXAvc2VydmVyU3RhcnR1cC5wZGYgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9zdGFydHVwL3NlcnZlclN0YXJ0dXAucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YWE1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9zdGFydHVwL3NlcnZlclN0YXJ0dXAucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL3N0YXJ0dXAvc2VydmVyU3RhcnR1cC50eHQgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9zdGFydHVwL3NlcnZlclN0YXJ0dXAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMjBiMGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9zdGFydHVwL3NlcnZlclN0YXJ0dXAudHh0CkBAIC0wLDAgKzEsMTM2IEBACitUb21jYXQgNSBTdGFydHVwIFNlcXVlbmNlCisKK1NlcXVlbmNlIDEuIFN0YXJ0IGZyb20gQ29tbWFuZCBMaW5lCitDbGFzczogb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkJvb3RzdHJhcAorV2hhdCBpdCBkb2VzOgorCWEpIFNldCB1cCBjbGFzc2xvYWRlcnMgCisJCWNvbW1vbkxvYWRlciAoY29tbW9uKS0+IFN5c3RlbSBMb2FkZXIKKwkJc2hhcmVkTG9hZGVyIChzaGFyZWQpLT4gY29tbW9uTG9hZGVyIC0+IFN5c3RlbSBMb2FkZXIKKwkJY2F0YWxpbmFMb2FkZXIoc2VydmVyKSAtPiBjb21tb25Mb2FkZXIgLT4gU3lzdGVtIExvYWRlcgorCWIpIExvYWQgc3RhcnR1cCBjbGFzcyAocmVmbGVjdGlvbikKKwkJb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNhdGFsaW5hCisJCXNldFBhcmVudENsYXNzbG9hZGVyIC0+IHNoYXJlZExvYWRlcgorCQlUaHJlYWQuY29udGV4dENsYXNzbG9hZGVyIC0+IGNhdGFsaW5hTG9hZGVyCisJYykgQm9vdHN0cmFwLmRhZW1vbi5pbml0KCkgY29tcGxldGUKKwkKK1NlcXVlbmNlIDIuIFByb2Nlc3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50IChzdGFydCwgc3RhcnRkLCBzdG9wLCBzdG9wZCkKK0NsYXNzOiBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwIChhc3N1bWUgY29tbWFuZC0+c3RhcnQpCitXaGF0IGl0IGRvZXM6IAorCWEpIENhdGFsaW5hLnNldEF3YWl0KHRydWUpOworCWIpIENhdGFsaW5hLmxvYWQoKQorCQliMSkgaW5pdERpcnMoKSAtPiBzZXQgcHJvcGVydGllcyBsaWtlIAorCQkgICAgICAgICAgICAgICAgICBjYXRhbGluYS5ob21lCisJCSAgICAgICAgICAgICAgICAgIGNhdGFsaW5hLmJhc2UgPT0gY2F0YWxpbmEuaG9tZSAobW9zdCBjYXNlcykKKwkJYjIpIGluaXROYW1pbmcKKwkJCXNldFByb3BlcnR5KGphdmF4Lm5hbWluZy5Db250ZXh0LklOSVRJQUxfQ09OVEVYVF9GQUNUT1JZLAorCQkJCSAgICBvcmcuYXBhY2hlLm5hbWluZy5qYXZhLmphdmFVUkxDb250ZXh0RmFjdG9yeSAtPmRlZmF1bHQpCisJCWIzKSBjcmVhdGVTdGFydERpZ2VzdGVyKCkgCisJCQlDb25maWd1cmVzIGEgZGlnZXN0ZXIgZm9yIHRoZSBtYWluIHNlcnZlci54bWwgZWxlbWVudHMgbGlrZQorCQkJb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyIChjYW4gY2hhbmdlIG9mIGNvdXJzZSA6KQorCQkJb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzCisJCQkJU3RvcmVzIG5hbWluZyByZXNvdXJjZXMgaW4gdGhlIEoyRUUgSk5ESSB0cmVlCisJCQlvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyCisJCQkJaW1wbGVtZW50cyBldmVudHMgZm9yIHN0YXJ0L3N0b3Agb2YgbWFqb3IgY29tcG9uZW50cworCQkJb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmljZQorCQkJCVRoZSBzaW5nbGUgZW50cnkgZm9yIGEgc2V0IG9mIGNvbm5lY3RvcnMsCisJCQkJc28gdGhhdCBhIGNvbnRhaW5lciBjYW4gbGlzdGVuIHRvIG11bHRpcGxlIGNvbm5lY3RvcnMKKwkJCQlpZSwgc2luZ2xlIGVudHJ5CisJCQlvcmcuYXBhY2hlLmNveW90ZS50b21jYXQ1LkNveW90ZUNvbm5lY3RvcgorCQkJCUNvbm5lY3RvcnMgdG8gbGlzdGVuIGZvciBpbmNvbWluZyByZXF1ZXN0cyBvbmx5CisJCQlJdCBhbHNvIGFkZHMgdGhlIGZvbGxvd2luZyBydWxlc2V0cyB0byB0aGUgZGlnZXN0ZXIKKwkJCQlOYW1pbmdSdWxlU2V0CisJCQkJRW5naW5lUnVsZVNldAorCQkJCUhvc3RSdWxlU2V0CisJCQkJQ29udGV4dFJ1bGVTZXQKKwkJYjQpIExvYWQgdGhlIHNlcnZlci54bWwgYW5kIHBhcnNlIGl0IHVzaW5nIHRoZSBkaWdlc3RlcgorCQkgICAgUGFyc2luZyB0aGUgc2VydmVyLnhtbCB1c2luZyB0aGUgZGlnZXN0ZXIgaXMgYW4gYXV0b21hdGljCisJCSAgICBYTUwtb2JqZWN0IG1hcHBpbmcgdG9vbCwgdGhhdCB3aWxsIGNyZWF0ZSB0aGUgb2JqZWN0cyBkZWZpbmVkIGluIHNlcnZlci54bWwKKwkJICAgIFN0YXJ0dXAgb2YgdGhlIGFjdHVhbCBjb250YWluZXIgaGFzIG5vdCBzdGFydGVkIHlldC4KKwkJYjUpIEFzc2lnbnMgU3lzdGVtLm91dCBhbmQgU3lzdGVtLmVyciB0byB0aGUgU3lzdGVtTG9nSGFuZGxlciBjbGFzcworCQliNikgQ2FsbHMgaW50aWFsaXplIG9uIGFsbCBjb21wb25lbnRzLCB0aGlzIG1ha2VzIGVhY2ggb2JqZWN0IHJlZ2lzdGVyIGl0c2VsZiB3aXRoIHRoZSAKKwkJICAgIEpNWCBhZ2VudC4KKwkJICAgIER1cmluZyB0aGUgcHJvY2VzcyBjYWxsIHRoZSBDb25uZWN0b3JzIGFsc28gaW5pdGlhbGl6ZSB0aGUgYWRhcHRlcnMuCisJCSAgICBUaGUgYWRhcHRlcnMgYXJlIHRoZSBjb21wb25lbnRzIHRoYXQgZG8gdGhlIHJlcXVlc3QgcHJlLXByb2Nlc3NpbmcuCisJCSAgICBUeXBpY2FsIGFkYXB0ZXJzIGFyZSBIVFRQMS4xIChkZWZhdWx0IGlmIG5vIHByb3RvY29sIGlzIHNwZWNpZmllZCwKKwkJICAgIG9yZy5hcGFjaGUuY295b3RlLmh0dHAxMS5IdHRwMTFQcm90b2NvbCkKKwkJICAgIEFKUDEuMyBmb3IgbW9kX2prIGV0Yy4KKworCWMpIENhdGFsaW5hLnN0YXJ0KCkKKwkJYzEpIFN0YXJ0cyB0aGUgTmFtaW5nQ29udGV4dCBhbmQgYmluZHMgYWxsIEpOREkgcmVmZXJlbmNlcyBpbnRvIGl0CisJCWMyKSBTdGFydHMgdGhlIHNlcnZpY2VzIHVuZGVyIDxTZXJ2ZXI+IHdoaWNoIGFyZToKKwkJCVN0YW5kYXJkU2VydmljZSAtPiBzdGFydHMgRW5naW5lIChDb250YWluZXJCYXNlIC0+TG9nZ2VyLExvYWRlcixSZWFsbSxDbHVzdGVyIGV0YykKKwkJYzMpIFN0YW5kYXJkSG9zdCAoc3RhcnRlZCBieSB0aGUgc2VydmljZSkKKwkJCQlDb25maWd1cmVzIGEgRXJyb3JSZXBvcnRWYWx2ZW0gdG8gZG8gcHJvcGVyIEhUTUwgb3V0cHV0IGZvciBkaWZmZXJlbnQgSFRUUCAKKwkJCQllcnJvcnMgY29kZXMKKwkJCQlTdGFydHMgdGhlIFZhbHZlcyBpbiB0aGUgcGlwZWxpbmUgKGF0IGxlYXN0IHRoZSBFcnJvclJlcG9ydFZhbHZlKQorCQkJCUNvbmZpZ3VyZXMgdGhlIFN0YW5kYXJkSG9zdFZhbHZlLCAKKwkJCQkJdGhpcyB2YWx2ZXMgdGllcyB0aGUgV2ViYXBwIENsYXNzIGxvYWRlciB0byB0aGUgdGhyZWFkIGNvbnRleHQKKwkJCQkJaXQgYWxzbyBmaW5kcyB0aGUgc2Vzc2lvbiBmb3IgdGhlIHJlcXVlc3QKKwkJCQkJYW5kIGludm9rZXMgdGhlIGNvbnRleHQgcGlwZWxpbmUKKwkJCQlTdGFydHMgdGhlIEhvc3RDb25maWcgY29tcG9uZW50CisJCQkJCVRoaXMgY29tcG9uZW50IGRlcGxveXMgYWxsIHRoZSB3ZWJhcHBzCisJCQkJCQkod2ViYXBwcyAmIGNvbmYvQ2F0YWxpbmEvbG9jYWxob3N0LyoueG1sKQorCQkJCQlXZWJhcHBzIGFyZSBpbnN0YWxsZWQgdXNpbmcgdGhlIGRlcGxveWVyIChTdGFuZGFyZEhvc3REZXBsb3llcikKKwkJCQkJVGhlIGRlcGxveWVyIHdpbGwgY3JlYXRlIGEgRGlnZXN0ZXIgZm9yIHlvdXIgY29udGV4dCwgdGhpcyBkaWdlc3RlcgorCQkJCQl3aWxsIHRoZW4gaW52b2tlIENvbnRleHRDb25maWcuc3RhcnQoKQorCQkJCQkJVGhlIENvbnRleHRDb25maWcuc3RhcnQoKSB3aWxsIHByb2Nlc3MgdGhlIGRlZmF1bHQgd2ViLnhtbCAoY29uZi93ZWIueG1sKQorCQkJCQkJYW5kIHRoZW4gcHJvY2VzcyB0aGUgYXBwbGljYXRpb25zIHdlYi54bWwgKFdFQi1JTkYvd2ViLnhtbCkKKwkJCQkJCQorCQljNCkgRHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGUgY29udGFpbmVyIChTdGFuZGFyZEVuZ2luZSkgdGhlcmUgaXMgYSBiYWNrZ3JvdW5kIHRocmVhZCB0aGF0IAorCQkgICAga2VlcHMgY2hlY2tpbmcgaWYgdGhlIGNvbnRleHQgaGFzIGNoYW5nZWQuIElmIGEgY29udGV4dCBjaGFuZ2VzICh0aW1lc3RhbXAgb2Ygd2FyIGZpbGUsIAorCQkgICAgY29udGV4dCB4bWwgZmlsZSwgd2ViLnhtbCkgdGhlbiBhIHJlbG9hZCBpcyBpc3N1ZWQgKHN0b3AvcmVtb3ZlL2RlcGxveS9zdGFydCkKKwkJICAgIAorCWQpIFRvbWNhdCByZWNlaXZlcyBhIHJlcXVlc3Qgb24gYW4gSFRUUCBwb3J0CisJICAgIGQxKSBUaGUgcmVxdWVzdCBpcyByZWNlaXZlZCBieSBhIHNlcGFyYXRlIHRocmVhZCB3aGljaCBpcyB3YWl0aW5nIGluIHRoZSBQb29sVGNwRW5kUG9pbnQgCisJICAgICAgICAgY2xhc3MuIEl0IGlzIHdhaXRpbmcgZm9yIGEgcmVxdWVzdCBpbiBhIHJlZ3VsYXIgU2VydmVyU29ja2V0LmFjY2VwdCgpIG1ldGhvZC4KKwkgICAgICAgICBXaGVuIGEgcmVxdWVzdCBpcyByZWNlaXZlZCwgdGhpcyB0aHJlYWQgd2FrZXMgdXAuCisJICAgIGQyKSBUaGUgUG9vbFRjcEVuZFBvaW50IGFzc2lnbnMgdGhlIGEgVGNwQ29ubmVjdGlvbiB0byBoYW5kbGUgdGhlIHJlcXVlc3QuIAorCSAgICAgICAgSXQgYWxzbyBzdXBwbGllcyBhIEpNWCBvYmplY3QgbmFtZSB0byB0aGUgY2F0YWxpbmEgY29udGFpbmVyIChub3QgdXNlZCBJIGJlbGlldmUpCisJICAgIGQzKSBUaGUgcHJvY2Vzc29yIHRvIGhhbmRsZSB0aGUgcmVxdWVzdCBpbiB0aGlzIGNhc2UgaXMgQ295b3RlIEh0dHAxMVByb2Nlc3NvciwgCisJICAgICAgICBhbmQgdGhlIHByb2Nlc3MgbWV0aG9kIGlzIGludm9rZWQuCisJICAgICAgICBUaGlzIHNhbWUgcHJvY2Vzc29yIGlzIGFsc28gY29udGludWluZyB0byBjaGVjayB0aGUgaW5wdXQgc3RyZWFtIG9mIHRoZSBzb2NrZXQKKwkgICAgICAgIHVudGlsIHRoZSBrZWVwIGFsaXZlIHBvaW50IGlzIHJlYWNoZWQgb3IgdGhlIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkLgorCSAgICBkNCkgVGhlIEhUVFAgcmVxdWVzdCBpcyBwYXJzZWQgdXNpbmcgYW4gaW50ZXJuYWwgYnVmZmVyIGNsYXNzIChDb3lvdGUgSHR0cDExIEludGVybmFsIEJ1ZmZlcikKKwkgICAgICAgIFRoZSBidWZmZXIgY2xhc3MgcGFyc2VzIHRoZSByZXF1ZXN0IGxpbmUsIHRoZSBoZWFkZXJzLCBldGMgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gYSAKKwkgICAgICAgIENveW90ZSByZXF1ZXN0IChub3QgYW4gSFRUUCByZXF1ZXN0KSBUaGlzIHJlcXVlc3QgY29udGFpbnMgYWxsIHRoZSBIVFRQIGluZm8sIHN1Y2gKKwkgICAgICAgIGFzIHNlcnZlcm5hbWUsIHBvcnQsIHNjaGVtZSwgZXRjLgorCSAgICBkNSkgVGhlIHByb2Nlc3NvciBjb250YWlucyBhIHJlZmVyZW5jZSB0byBhbiBBZGFwdGVyLCBpbiB0aGlzIGNhc2UgaXQgaXMgdGhlIAorCSAgICAgICAgQ295b3RlIFRvbWNhdCA1IEFkYXB0ZXIuIE9uY2UgdGhlIHJlcXVlc3QgaGFzIGJlZW4gcGFyc2VkLCB0aGUgSHR0cDExIHByb2Nlc3NvcgorCSAgICAgICAgaW52b2tlcyBzZXJ2aWNlKCkgb24gdGhlIGFkYXB0ZXIuIEluIHRoZSBzZXJ2aWNlIG1ldGhvZCwgdGhlIFJlcXVlc3QgY29udGFpbnMgYSAKKwkgICAgICAgIENveW90ZVJlcXVlc3QgYW5kIENveW90ZVJlc3BvbnMgKG51bGwgZm9yIHRoZSBmaXJzdCB0aW1lKQorCSAgICAgICAgVGhlIENveW90ZVJlcXVlc3QoUmVzcG9uc2UpIGltcGxlbWVudHMgSHR0cFJlcXVlc3QoUmVzcG9uc2UpIGFuZCBIdHRwU2VydmxldFJlcXVlc3QoUmVzcG9uc2UpCisJICAgICAgICBUaGUgYWRhcHRlciBwYXJzZXMgYW5kIGFzc29jaWF0ZXMgZXZlcnl0aGluZyB3aXRoIHRoZSByZXF1ZXN0LCBjb29raWVzLCB0aGUgY29udGV4dCB0aHJvdWdoIGEgCisJICAgICAgICBNYXBwZXIsIGV0YworCSAgICBkNikgV2hlbiB0aGUgcGFyc2luZyBpcyBmaW5pc2hlZCwgdGhlIENveW90ZUFkYXB0ZXIgaW52b2tlcyBpdHMgY29udGFpbmVyIChTdGFuZGFyZEVuZ2luZSkKKwkgICAgICAgIGFuZCBpbnZva2VzIHRoZSBpbnZva2UocmVxdWVzdCxyZXNwb25zZSkgbWV0aG9kLgorCSAgICAgICAgVGhpcyBpbml0aWF0ZXMgdGhlIEhUVFAgcmVxdWVzdCBpbnRvIHRoZSBDYXRhbGluYSBjb250YWluZXIgc3RhcnRpbmcgYXQgdGhlIGVuZ2luZSBsZXZlbAorCSAgICBkNykgVGhlIFN0YW5kYXJkRW5naW5lLmludm9rZSgpIHNpbXBseSBpbnZva2VzIHRoZSBjb250YWluZXIgcGlwZWxpbmUuaW52b2tlKCkKKwkgICAgZDgpIEJ5IGRlZmF1bHQgdGhlIGVuZ2luZSBvbmx5IGhhcyBvbmUgdmFsdmUgdGhlIFN0YW5kYXJkRW5naW5lVmFsdmUsIHRoaXMgdmFsdmUgc2ltcGx5CisJICAgICAgICBpbnZva2VzIHRoZSBpbnZva2UoKSBtZXRob2Qgb24gdGhlIEhvc3QgcGlwZWxpbmUgKFN0YW5kYXJkSG9zdC5nZXRQaXBlTGluZSgpKQorCSAgICBkOSkgdGhlIFN0YW5kYXJkSG9zdCBoYXMgdHdvIHZhbHZlcyBieSBkZWZhdWx0LCB0aGUgU3RhbmRhcmRIb3N0VmFsdmUgYW5kIHRoZSBFcnJvclJlcG9ydFZhbHZlCisJICAgIGQxMCkgVGhlIHN0YW5kYXJkIGhvc3QgdmFsdmUgYXNzb2NpYXRlcyB0aGUgY29ycmVjdCBjbGFzcyBsb2FkZXIgd2l0aCB0aGUgY3VycmVudCB0aHJlYWQKKwkgICAgICAgICBJdCBhbHNvIHJldHJpdmVzIHRoZSBNYW5hZ2VyIGFuZCB0aGUgc2Vzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3QgKGlmIHRoZXJlIGlzIG9uZSkKKwkgICAgICAgICBJZiB0aGVyZSBpcyBhIHNlc3Npb24gYWNjZXNzKCkgaXMgY2FsbGVkIHRvIGtlZXAgdGhlIHNlc3Npb24gYWxpdmUKKwkgICAgZDExKSBBZnRlciB0aGF0IHRoZSBTdGFuZGFyZEhvc3RWYWx2ZSBpbnZva2VzIHRoZSBwaXBlbGluZSBvbiB0aGUgY29udGV4dCBhc3NvY2lhdGVkCisJICAgICAgICAgd2l0aCB0aGUgcmVxdWVzdC4KKwkgICAgZDEyKSBUaGUgZmlyc3QgdmFsdmUgdGhhdCBnZXRzIGludm9rZWQgYnkgdGhlIENvbnRleHQgcGlwZWxpbmUgaXMgdGhlIEZvcm1BdXRoZW50aWNhdG9yCisJICAgICAgICAgdmFsdmUuIFRoZW4gdGhlIFN0YW5kYXJkQ29udGV4dFZhbHZlIGdldHMgaW52b2tlLgorCSAgICAgICAgIFRoZSBTdGFuZGFyZENvbnRleHRWYWx2ZSBpbnZva2VzIGFueSBjb250ZXh0IGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQuCisJICAgICAgICAgTmV4dCBpdCBpbnZva2VzIHRoZSBwaXBlbGluZSBvbiB0aGUgV3JhcHBlciBjb21wb25lbnQgKFN0YW5kYXJkV3JhcHBlclZhbHZlKQorCSAgICBkMTMpIER1cmluZyB0aGUgaW52b2thdGlvbiBvZiB0aGUgU3RhbmRhcmRXcmFwcGVyVmFsdmUsIHRoZSBKU1Agd3JhcHBlciAoSmFzcGVyKSBnZXRzIGludm9rZWQKKwkgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gdGhlIGFjdHVhbCBjb21waWxhdGlvbiBvZiB0aGUgSlNQLgorCSAgICAgICAgIEFuZCB0aGVuIGludm9rZXMgdGhlIGFjdHVhbCBzZXJ2bGV0LgorCWUpIEludm9rYXRpb24gb2YgdGhlIHNlcnZsZXQgY2xhc3MKKwkgICAgICAgICAKKwkgICAgICAgICAKKwkgICAgICAgICAKKwkgICAgCisJICAgICAgICAKKwkgICAgICAgIAorCSAgICAgICAgCisJICAgIAorCQkJCisJCQkKKwkJCisJCQorCQkJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9iYWxhbmNlci1ob3d0by54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2JhbGFuY2VyLWhvd3RvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44OGQzM2E5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9iYWxhbmNlci1ob3d0by54bWwKQEAgLTAsMCArMSwxNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJiYWxhbmNlci1ob3d0by5odG1sIj4KKworICAgICZwcm9qZWN0OyAKKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8YXV0aG9yIGVtYWlsPSJ5b2F2c0BhcGFjaGUub3JnIj5Zb2F2IFNoYXBpcmE8L2F1dGhvcj4KKyAgICAgICAgPGF1dGhvcj5SZW15IE1hdWNoZXJhdDwvYXV0aG9yPgorICAgICAgICA8YXV0aG9yPkFuZHkgT2xpdmVyPC9hdXRob3I+CisgICAgICAgIDx0aXRsZT5Mb2FkIEJhbGFuY2VyIEhPVy1UTzwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworPHNlY3Rpb24gbmFtZT0iVGFibGUgb2YgQ29udGVudHMiPgorPHA+Cis8YSBocmVmPSIjVXNpbmcgdGhlIEpLIDEuMi54IG5hdGl2ZSBjb25uZWN0b3IiPgorVXNpbmcgdGhlIEpLIG5hdGl2ZSBjb25uZWN0b3I8L2E+PGJyIC8+Cis8YSBocmVmPSIjVXNpbmcgQXBhY2hlIEhUVFAgU2VydmVyIDIueCB3aXRoIG1vZF9wcm94eSI+CitVc2luZyBBcGFjaGUgSFRUUCBTZXJ2ZXIgMi54IGFuZCBtb2RfcHJveHk8L2E+PGJyIC8+Cis8YSBocmVmPSIjVXNpbmcgdGhlIGJhbGFuY2VyIHdlYmFwcCI+VXNpbmcgdGhlIGJhbGFuY2VyIHdlYmFwcDwvYT48YnIgLz4KKzwvcD4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVXNpbmcgdGhlIEpLIDEuMi54IG5hdGl2ZSBjb25uZWN0b3IiPgorCitQbGVhc2UgcmVmZXIgdG8gdGhlIEpLIDEuMi54IGRvY3VtZW50YXRpb24uCisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVXNpbmcgQXBhY2hlIEhUVFAgU2VydmVyIDIueCB3aXRoIG1vZF9wcm94eSI+CisKK1BsZWFzZSByZWZlciB0byB0aGUgbW9kX3Byb3h5IGRvY3VtZW50YXRpb24gZm9yIEFwYWNoZSBIVFRQIFNlcnZlciAyLjIuIFRoaXMgc3VwcG9ydHMgZWl0aGVyCitIVFRQIG9yIEFKUCBsb2FkIGJhbGFuY2luZy4gVGhpcyBuZXcgdmVyc2lvbiBvZiBtb2RfcHJveHkgaXMgYWxzbyB1c2VhYmxlIHdpdGgKK0FwYWNoZSBIVFRQIFNlcnZlciAyLjAsIGJ1dCBtb2RfcHJveHkgd2lsbCBoYXZlIHRvIGJlIGNvbXBpbGVkIHNlcGFyYXRlbHkgdXNpbmcgdGhlIGNvZGUKK2Zyb20gQXBhY2hlIEhUVFAgU2VydmVyIDIuMi4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJVc2luZyB0aGUgYmFsYW5jZXIgd2ViYXBwIj4KKworPHN1YnNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgorCis8cD4KK1RvbWNhdCA1LjAuMTUgYW5kIGxhdGVyIHNoaXBzIHdpdGggYSB3ZWJhcHAgbmFtZWQgYmFsYW5jZXIuICBUaGlzIGlzCithIHNpbXBsZSBpbXBsZW1lbnRpb24gb2YgYSBydWxlcy1iYXNlZCBsb2FkIGJhbGFuY2VyLiAgSXQgd2FzIG5vdCBkZXNpZ25lZAorYXMgYSByZXBsYWNlbWVudCBmb3Igb3RoZXIgbG9hZC1iYWxhbmNpbmcgbWVjaGFuaXNtcyB1c2VkIGZvciBoaWdoIHRyYWZmaWMKK2Vudmlyb25tZW50cy4gIFJhdGhlciwgaXQgaXMgYSBzaW1wbGUsIHB1cmUgSmF2YSwgZWFzaWx5IGV4dGVuc2libGUsIGFuZCBmYXN0Cit3YXkgdG8gZGlyZWN0IHRyYWZmaWMgYW1vbmcgbXVsdGlwbGUgc2VydmVycy4KKzwvcD4KKzxwPgorQWx0aG91Z2ggYmFsYW5jZXIgc2hpcHMgd2l0aCBUb21jYXQsIGl0IGlzIG5vdCBUb21jYXQtc3BlY2lmaWMgYW5kIHJ1bnMKK29uIG90aGVyIGNvbnRhaW5lcnMgd2l0aG91dCBhbnkgbW9kaWZpY2F0aW9uLiAgVGhlIGJhbGFuY2VyIHdlYmFwcCAKK3JlcXVpcmVzIGEgU2VydmxldCBTcGVjaWZpY2F0aW9uIDIuMyBvciBsYXRlciBjb250YWluZXIgaWYgeW91IHdpc2ggCit0byB1c2UgYSBmaWx0ZXIgdG8gcmVkaXJlY3QgdHJhZmZpYy4gIElmIHlvdSB3aXNoIHRvIHJlZGlyZWN0IHRyYWZmaWMKK3VzaW5nIGEgc2VydmxldCwgeW91IG1heSB1c2UgYW55IHNlcnZsZXQgY29udGFpbmVyLgorPC9wPgorPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJTYW1wbGUgQ29uZmlndXJhdGlvbiI+Cis8cD4KK1RoZSBkZWZhdWx0IGJhbGFuY2VyIGluc3RhbGxhdGlvbiB1c2VzIGEgc2luZ2xlIGZpbHRlciwgQmFsYW5jZXJGaWx0ZXIsCittYXBwZWQgdG8gYWxsIHJlcXVlc3RzICh1cmwtcGF0dGVybiAvKikuICBUaGUgZmlsdGVyIHJlYWRzIGl0cyBydWxlcworZnJvbSB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGluIHRoZSBiYWxhbmNlciBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyh3ZWIueG1sIGZpbGUpLiAgVGhlIGRlZmF1bHQgcnVsZXMgYXJlOgorPHVsPgorICA8bGk+UmVkaXJlY3QgcmVxdWVzdHMgd2l0aCBOZXdzIGluIHRoZSBVUkwgdG8gd3d3LmNubi5jb208L2xpPgorICA8bGk+UmVkaXJlY3QgcmVxdWVzdHMgd2l0aCBhIHBhcmFtZXRlciBuYW1lZCBwYXJhbU5hbWUgd2hvc2UKK3ZhbHVlIGlzIHBhcmFtVmFsdWUgdG8gd3d3LnlhaG9vLmNvbS48L2xpPgorICA8bGk+UmVkaXJlY3QgYWxsIG90aGVyIHJlcXVlc3RzIHRvIGpha2FydGEuYXBhY2hlLm9yZy48L2xpPgorPC91bD4KKworVGhlcmVmb3JlLCB3aGVuIHlvdSBpbnN0YWxsIHRvbWNhdCwgc3RhcnQgaXQsIGFuZCBwb2ludCB5b3VyCiticm93c2VyIHRvIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYWxhbmNlciwgeW91IHdpbGwgYmUgcmVkaXJlY3RlZAordG8gaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy4gIElmIHlvdSBwb2ludCB5b3VyIGJyb3dzZXIgdG8KK2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYWxhbmNlci9OZXdzIHlvdSB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8KK2h0dHA6Ly93d3cuY25uLmNvbS4gIFRoZSByZXF1ZXN0IGZvciAKK2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYWxhbmNlci9CbGFoQmxhaD9wYXJhbU5hbWU9cGFyYW1WYWx1ZSB3aWxsCitiZSByZWRpcmVjdGVkIHRvIGh0dHA6Ly93d3cueWFob28uY29tLgorPC9wPgorPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJCYWxhbmNlciBSdWxlcyI+Cis8cD4KK0EgPGk+UnVsZTwvaT4gaW4gdGhlIGJhbGFuY2VyIHN5c3RlbSBpcyBhIGNvbWJpbmF0aW9uIG9mCithIHJlcXVlc3QgbWF0Y2hpbmcgY3JpdGVyaW9uIGFuZCBhIHJlZGlyZWN0aW9uIFVSTCBmb3IKK21hdGNoaW5nIHJlcXVlc3RzLiAgUnVsZXMgaW1wbGVtZW50IHRoZQorb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIuUnVsZSBpbnRlcmZhY2UuCis8L3A+CisKKzxwPgorVGhlIGJhbGFuY2VyIGRpc3RyaWJ1dGlvbiBjb250YWlucyBhIG51bWJlciBvZiB1c2VmdWwKK3J1bGVzLiAgVGhlIGZyYW1ld29yayBpcyBhbHNvIGRlc2lnbmVkIGZvciBlYXN5IGV4dGVuc2liaWxpdHkKK3NvIHRoYXQgeW91IGNhbiB3cml0ZSB5b3VyIG93biBydWxlcyBxdWlja2x5LiAgUnVsZXMKK3Nob3VsZCBiZSBKYXZhQmVhbnMgKHB1YmxpYyBuby1hcmdzIGNvbnN0cnVjdG9yLCBwdWJsaWMKK3NldHRlciBtZXRob2Qgc2V0WFhYIGZvciBwcm9wZXJ0eSB4eHgpLCBhcyB0aGV5IGFyZQoraW5zdGFudGlhdGVkIGJ5IEpha2FydGEgQ29tbW9ucyBEaWdlc3Rlci4gIEZlZWwgZnJlZQordG8gaW5xdWlyZSBvbiB0aGUgdG9tY2F0LXVzZXIgbWFpbGluZyBsaXN0IHJlZ2FyZGluZwordGhlIGF2YWlsYWJpbGl0eSBvZiBydWxlcyBvciB0aGUgaW5jbHVzaW9uIG9mIHlvdXIgcnVsZXMKK2luIHRoZSBkaXN0cmlidXRpb24uCis8L3A+CisKKzxwPgorUnVsZXMgYXJlIGFzc2VtYmxlZCBpbnRvIFJ1bGVDaGFpbnMuICBFYWNoIEJhbGFuY2VyRmlsdGVyCisob3IgU2VydmxldC9KU1ApIHJlZmVycyB0byBvbmUgUnVsZUNoYWluIHdoZW4gbWFraW5nIGl0cworcmVkaXJlY3Rpb24gZGVjaXNpb25zLiAgTm90ZSB0aGF0IHlvdSBhcmUgbm90IHJlc3RyaWN0ZWQKK3RvIGhhdmluZyBvbmUgZmlsdGVyIG1hcHBlZCB0byAvKiBhcyBkb25lIGluIHRoZSBzYW1wbGUKK2NvbmZpZ3VyYXRpb24uICBZb3UgY2FuIGNvbmZpZ3VyZSBhcyBtYW55IGZpbHRlcnMgYXMKK2Rlc2lyZWQsIHVzaW5nIHRoZSBmdWxsIGZpbHRlciBtYXBwaW5nIHBvc3NpYmlsaXRpZXMgZGVmaW5lZAoraW4gdGhlIFNlcnZsZXQgU3BlY2lmaWNhdGlvbi4gIEVhY2ggZmlsdGVyIHdpbGwgaGF2ZQoraXRzIG93biBSdWxlQ2hhaW4uCis8L3A+Cis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IkhvdyBpdCBXb3JrcyI+Cis8cD4KKzxvbD4KKyAgPGxpPllvdSB3cml0ZSBhIHJ1bGVzIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250YWluaW5nIHZhcmlvdXMKK3J1bGVzIGFuZCByZWRpcmVjdGlvbiBsb2NhdGlvbnMuPC9saT4KKyAgPGxpPllvdSBkZWZpbmUgdGhlIGJhbGFuY2VyIGZpbHRlciBpbiB5b3VyIHdlYi54bWwsIG1hcHBpbmcKK2l0IGFzIGRlc2lyZWQgKC8qIGlzIGEgY29tbW9uIHVzZS1jYXNlKSBhbmQgY29uZmlndXJpbmcgaXQKK3dpdGggeW91ciBydWxlcyBjb25maWd1cmF0aW9uIGZpbGUuPC9saT4KKyAgPGxpPlRoZSBzZXJ2ZXIgaXMgc3RhcnRlZCwgaW5pdGlhbGl6aW5nIHRoZSBmaWx0ZXIuPC9saT4KKyAgPGxpPkEgcmVxdWVzdCBjb21lcyBpbnRvIHRoZSBzZXJ2ZXIuICBUaGUgZmlsdGVyIGNvbnN1bHRzCitpdHMgcnVsZSBjaGFpbiB0byBkZXRlcm1pbmUgd2hlcmUgdG8gcmVkaXJlY3QgdGhlIHJlcXVlc3QuICBSdWxlcworYXJlIGNvbnN1bHRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZGVmaW5lZCBpbiB0aGUgcnVsZXMKK2NvbmZpZ3VyYXRpb24gZmlsZS4gIFRoZSBmaXJzdCBtYXRjaGluZyBydWxlIHdpbGwgc3RvcCB0aGUKK2V2YWx1YXRpb24gYW5kIGNhdXNlIHRoZSByZXF1ZXN0IHRvIGJlIHJlZGlyZWN0ZWQuPC9saT4KKzwvb2w+Cis8L3A+CisKKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iQ29tbWVudHMiPgorPHA+CitQbGVhc2UgZGlyZWN0IHF1ZXN0aW9ucywgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBldGMuIHRvIHRoZQordG9tY2F0LXVzZXIgbWFpbGluZyBsaXN0LiAgVGhhbmsgeW91LgorPC9wPgorPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYnVpbGQueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhZTUzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYnVpbGQueG1sCkBAIC0wLDAgKzEsMjQwIEBACis8cHJvamVjdCBuYW1lPSJ0b21jYXQtZG9jcyIgZGVmYXVsdD0iYnVpbGQtbWFpbiIgYmFzZWRpcj0iLiI+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBJbml0aWFsaXplIFByb3BlcnR5IFZhbHVlcyA9PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDwhLS0gU2VlICJidWlsZC5wcm9wZXJ0aWVzLnNhbXBsZSIgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgZm9yIGFsbCAgICAgLS0+CisgIDwhLS0gcHJvcGVydHkgdmFsdWVzIHlvdSBtdXN0IGN1c3RvbWl6ZSBmb3Igc3VjY2Vzc2Z1bCBidWlsZGluZyEhISAgICAgICAgLS0+CisgIDxwcm9wZXJ0eSBmaWxlPSJidWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIuLi9idWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIuLi8uLi9idWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3VzZXIuaG9tZX0vYnVpbGQucHJvcGVydGllcyIvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlciIgIHZhbHVlPSJtb2Rlcm4iLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcHMuYnVpbGQiICAgdmFsdWU9Ii4uL2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWJhcHBzLmRpc3QiICAgIHZhbHVlPSIuLi9kaXN0Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWJhcHAubmFtZSIgICAgIHZhbHVlPSJ0b21jYXQtZG9jcyIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDcmVhdGUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ29weSBTdGF0aWMgRmlsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtc3RhdGljIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlIj4KKworICAgIDwhLS0gVG9wIExldmVsIFN0YXRpYyBGaWxlcyAtLT4KKyAgICA8Y29weSAgICB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iQlVJTERJTkcudHh0Ii8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IlJFQURNRS50eHQiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iUlVOTklORy50eHQiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisgICAgPGNvcHkgICAgdG9kaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iKiovKi5odG1sIi8+CisgICAgPC9jb3B5PgorCisgICAgPCEtLSBXRUItSU5GIFN0YXRpYyBGaWxlcyAtLT4KKyAgICA8Y29weSAgICB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9XRUItSU5GIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iV0VCLUlORiIvPgorICAgIDwvY29weT4KKworICAgIDwhLS0gQXBwbGljYXRpb24gRGV2ZWxvcGVyJ3MgR3VpZGUgRXhhbXBsZXMgLS0+CisgICAgPGNvcHkgICAgdG9kaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vYXBwZGV2Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iYXBwZGV2IiBpbmNsdWRlcz0iKi50eHQiLz4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIFRoaXMgY29weSBpbmNsdWRlcyBhIGJpbmFyeSBmaWxlIChzYW1wbGUud2FyKSBzbyBpdCBzaG91bGQgbm90IGhhdmUgYSBmaWx0ZXIgdG9rZW4gLS0+CisgICAgPCEtLSBTZWUgQnVnemlsbGEgMzYzMTg6IGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzYzMTggLS0+CisgICAgPGNvcHkgICAgdG9kaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vYXBwZGV2L3NhbXBsZSI+CisgICAgICA8ZmlsZXNldCBkaXI9ImFwcGRldi9zYW1wbGUiLz4KKyAgICA8L2NvcHk+CisKKyAgICA8Y29weSAgIHRvZmlsZT0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9hcHBkZXYvc2FtcGxlL2J1aWxkLnhtbCIKKyAgICAgICAgICAgICAgZmlsZT0iYXBwZGV2L2J1aWxkLnhtbC50eHQiLz4KKworICAgIDwhLS0gQ2F0YWxpbmEgRnVuY3Rpb25hbCBTcGVjaWZpY2F0aW9ucyAtLT4KKyAgICA8bWtkaXIgICAgIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9jYXRhbGluYS9mdW5jc3BlY3MiLz4KKworICAgIDwhLS0gQXJjaGl0ZWN0dXJlIC0tPgorICAgIDxjb3B5ICAgIHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2FyY2hpdGVjdHVyZSI+CisgICAgICA8ZmlsZXNldCBkaXI9ImFyY2hpdGVjdHVyZSIgZXhjbHVkZXM9IioueG1sIi8+CisgICAgPC9jb3B5PgorCisgICAgPCEtLSBJbWFnZXMgU3ViZGlyZWN0b3J5IC0tPgorICAgIDxta2RpciAgICAgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2ltYWdlcyIvPgorICAgIDxjb3B5ICAgIHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2ltYWdlcyI+CisgICAgICA8ZmlsZXNldCBkaXI9ImltYWdlcyIvPgorICAgIDwvY29weT4KKworICAgIDxta2RpciAgICAgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L3ByaW50ZXIiLz4KKyAgICA8IS0tIFRvcCBMZXZlbCBTdGF0aWMgRmlsZXMgLS0+CisgICAgPGNvcHkgICAgdG9kaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vcHJpbnRlciI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iQlVJTERJTkcudHh0Ii8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IlJFQURNRS50eHQiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iUlVOTklORy50eHQiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisgICAgPHN0eWxlIGJhc2VkaXI9Ii4iCisgICAgICAgICAgIGRlc3RkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vcHJpbnRlciIKKyAgICAgICAgIGV4dGVuc2lvbj0iLmh0bWwiCisgICAgICAgICAgICAgc3R5bGU9InRvbWNhdC1kb2NzLnhzbCIKKyAgICAgICAgICBleGNsdWRlcz0iYnVpbGQueG1sIHByb2plY3QueG1sIgorICAgICAgICAgIGluY2x1ZGVzPSIqLnhtbCI+CisgICAgICA8cGFyYW0gbmFtZT0icmVsYXRpdmUtcGF0aCIgZXhwcmVzc2lvbj0iLi8uLiIvPgorICAgICAgPHBhcmFtIG5hbWU9InByb2plY3QtbWVudSIgZXhwcmVzc2lvbj0ibm9tZW51Ii8+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gV0VCLUlORiBTdWJkaXJlY3RvcnkgLS0+CisgICAgPG1rZGlyICAgICBkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vV0VCLUlORiIvPgorICAgIDxjb3B5ICAgIHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYiPgorICAgICAgPGZpbGVzZXQgZGlyPSJXRUItSU5GIi8+CisgICAgPC9jb3B5PgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PSBCVUlMRDogWE1MLUhUTUwgR2VuZXJhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1tYWluIiBkZXBlbmRzPSJidWlsZC1zdGF0aWMiPgorCisgICAgPCEtLSBUb3AgTGV2ZWwgRGlyZWN0b3J5IC0tPgorICAgIDxzdHlsZSBiYXNlZGlyPSIuIgorICAgICAgICAgICBkZXN0ZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9IgorICAgICAgICAgZXh0ZW5zaW9uPSIuaHRtbCIKKyAgICAgICAgICAgICBzdHlsZT0idG9tY2F0LWRvY3MueHNsIgorICAgICAgICAgIGV4Y2x1ZGVzPSJidWlsZC54bWwgcHJvamVjdC54bWwiCisgICAgICAgICAgaW5jbHVkZXM9IioueG1sIj4KKyAgICAgIDxwYXJhbSBuYW1lPSJyZWxhdGl2ZS1wYXRoIiBleHByZXNzaW9uPSIuIi8+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gQXBwbGljYXRpb24gRGV2ZWxvcGVyJ3MgR3VpZGUgLS0+CisgICAgPHN0eWxlIGJhc2VkaXI9ImFwcGRldiIKKyAgICAgICAgICAgZGVzdGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9hcHBkZXYiCisgICAgICAgICBleHRlbnNpb249Ii5odG1sIgorICAgICAgICAgICAgIHN0eWxlPSJ0b21jYXQtZG9jcy54c2wiCisgICAgICAgICAgZXhjbHVkZXM9InByb2plY3QueG1sIgorICAgICAgICAgIGluY2x1ZGVzPSIqLnhtbCI+CisgICAgICA8cGFyYW0gbmFtZT0icmVsYXRpdmUtcGF0aCIgZXhwcmVzc2lvbj0iLi4iLz4KKyAgICA8L3N0eWxlPgorICAgIDxta2RpciAgICAgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2FwcGRldi9wcmludGVyIi8+CisgICAgPCEtLSBBcHBsaWNhdGlvbiBEZXZlbG9wZXIncyBHdWlkZSBFeGFtcGxlcyAtLT4KKyAgICA8Y29weSAgICB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9hcHBkZXYvcHJpbnRlciI+CisgICAgICA8ZmlsZXNldCBkaXI9ImFwcGRldiIgaW5jbHVkZXM9IioudHh0Ii8+CisgICAgPC9jb3B5PgorICAgIDxzdHlsZSBiYXNlZGlyPSJhcHBkZXYiCisgICAgICAgICAgIGRlc3RkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vYXBwZGV2L3ByaW50ZXIiCisgICAgICAgICBleHRlbnNpb249Ii5odG1sIgorICAgICAgICAgICAgIHN0eWxlPSJ0b21jYXQtZG9jcy54c2wiCisgICAgICAgICAgZXhjbHVkZXM9InByb2plY3QueG1sIgorICAgICAgICAgIGluY2x1ZGVzPSIqLnhtbCI+CisgICAgICA8cGFyYW0gbmFtZT0icmVsYXRpdmUtcGF0aCIgZXhwcmVzc2lvbj0iLi4vLi4iLz4KKyAgICAgIDxwYXJhbSBuYW1lPSJwcm9qZWN0LW1lbnUiIGV4cHJlc3Npb249Im5vbWVudSIvPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIENhdGFsaW5hIEZ1bmN0aW9uYWwgU3BlY2lmaWNhdGlvbnMgLS0+CisgICAgPG1rZGlyICAgICBkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vY2F0YWxpbmEiLz4KKyAgICA8bWtkaXIgICAgIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9jYXRhbGluYS9mdW5jc3BlY3MiLz4KKyAgICA8c3R5bGUgYmFzZWRpcj0iZnVuY3NwZWNzIgorICAgICAgICAgICBkZXN0ZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2NhdGFsaW5hL2Z1bmNzcGVjcyIKKyAgICAgICAgIGV4dGVuc2lvbj0iLmh0bWwiCisgICAgICAgICAgICAgc3R5bGU9InRvbWNhdC1kb2NzLnhzbCIKKyAgICAgICAgICBleGNsdWRlcz0icHJvamVjdC54bWwiCisgICAgICAgICAgaW5jbHVkZXM9IioueG1sIj4KKyAgICAgIDxwYXJhbSBuYW1lPSJyZWxhdGl2ZS1wYXRoIiBleHByZXNzaW9uPSIuLi8uLiIvPgorICAgIDwvc3R5bGU+CisgICAgPG1rZGlyICAgICBkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vY2F0YWxpbmEvZnVuY3NwZWNzL3ByaW50ZXIiLz4KKyAgICA8c3R5bGUgYmFzZWRpcj0iZnVuY3NwZWNzIgorICAgICAgICAgICBkZXN0ZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2NhdGFsaW5hL2Z1bmNzcGVjcy9wcmludGVyIgorICAgICAgICAgZXh0ZW5zaW9uPSIuaHRtbCIKKyAgICAgICAgICAgICBzdHlsZT0idG9tY2F0LWRvY3MueHNsIgorICAgICAgICAgIGV4Y2x1ZGVzPSJwcm9qZWN0LnhtbCIKKyAgICAgICAgICBpbmNsdWRlcz0iKi54bWwiPgorICAgICAgPHBhcmFtIG5hbWU9InJlbGF0aXZlLXBhdGgiIGV4cHJlc3Npb249Ii4uLy4uLy4uIi8+CisgICAgICA8cGFyYW0gbmFtZT0icHJvamVjdC1tZW51IiBleHByZXNzaW9uPSJub21lbnUiLz4KKyAgICA8L3N0eWxlPgorCisgICAgPCEtLSBTZXJ2ZXIgQ29uZmlndXJhdGlvbiBSZWZlcmVuY2UgLS0+CisgICAgPHN0eWxlIGJhc2VkaXI9ImNvbmZpZyIKKyAgICAgICAgICAgZGVzdGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9jb25maWciCisgICAgICAgICBleHRlbnNpb249Ii5odG1sIgorICAgICAgICAgICAgIHN0eWxlPSJ0b21jYXQtZG9jcy54c2wiCisgICAgICAgICAgZXhjbHVkZXM9InByb2plY3QueG1sIgorICAgICAgICAgIGluY2x1ZGVzPSIqLnhtbCI+CisgICAgICA8cGFyYW0gbmFtZT0icmVsYXRpdmUtcGF0aCIgZXhwcmVzc2lvbj0iLi4iLz4KKyAgICA8L3N0eWxlPgorICAgIDxta2RpciAgICAgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2NvbmZpZy9wcmludGVyIi8+CisgICAgPHN0eWxlIGJhc2VkaXI9ImNvbmZpZyIKKyAgICAgICAgICAgZGVzdGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9jb25maWcvcHJpbnRlciIKKyAgICAgICAgIGV4dGVuc2lvbj0iLmh0bWwiCisgICAgICAgICAgICAgc3R5bGU9InRvbWNhdC1kb2NzLnhzbCIKKyAgICAgICAgICBleGNsdWRlcz0icHJvamVjdC54bWwiCisgICAgICAgICAgaW5jbHVkZXM9IioueG1sIj4KKyAgICAgIDxwYXJhbSBuYW1lPSJyZWxhdGl2ZS1wYXRoIiBleHByZXNzaW9uPSIuLi8uLiIvPgorICAgICAgPHBhcmFtIG5hbWU9InByb2plY3QtbWVudSIgZXhwcmVzc2lvbj0ibm9tZW51Ii8+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gU2VydmVyIEFyY2hpdGVjdHVyZSAtLT4KKyAgICA8c3R5bGUgYmFzZWRpcj0iYXJjaGl0ZWN0dXJlIgorICAgICAgICAgICBkZXN0ZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2FyY2hpdGVjdHVyZSIKKyAgICAgICAgIGV4dGVuc2lvbj0iLmh0bWwiCisgICAgICAgICAgICAgc3R5bGU9InRvbWNhdC1kb2NzLnhzbCIKKyAgICAgICAgICBleGNsdWRlcz0icHJvamVjdC54bWwiCisgICAgICAgICAgaW5jbHVkZXM9IioueG1sIj4KKyAgICAgIDxwYXJhbSBuYW1lPSJyZWxhdGl2ZS1wYXRoIiBleHByZXNzaW9uPSIuLiIvPgorICAgIDwvc3R5bGU+CisgICAgPG1rZGlyICAgICBkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vYXJjaGl0ZWN0dXJlL3ByaW50ZXIiLz4KKyAgICA8c3R5bGUgYmFzZWRpcj0iYXJjaGl0ZWN0dXJlIgorICAgICAgICAgICBkZXN0ZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2FyY2hpdGVjdHVyZS9wcmludGVyIgorICAgICAgICAgZXh0ZW5zaW9uPSIuaHRtbCIKKyAgICAgICAgICAgICBzdHlsZT0idG9tY2F0LWRvY3MueHNsIgorICAgICAgICAgIGV4Y2x1ZGVzPSJwcm9qZWN0LnhtbCIKKyAgICAgICAgICBpbmNsdWRlcz0iKi54bWwiPgorICAgICAgPHBhcmFtIG5hbWU9InJlbGF0aXZlLXBhdGgiIGV4cHJlc3Npb249Ii4uLy4uIi8+CisgICAgICA8cGFyYW0gbmFtZT0icHJvamVjdC1tZW51IiBleHByZXNzaW9uPSJub21lbnUiLz4KKyAgICA8L3N0eWxlPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBCVUlMRDogUmVidWlsZCBFdmVyeXRoaW5nID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGJ1aWxkLW1haW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYW5kIGJ1aWxkIGRvY3VtZW50YXRpb24gd2ViYXBwIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuZGlzdH0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXN0cmlidXRpb24gRmlsZXMgPT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImJ1aWxkLW1haW4sZGlzdC1wcmVwYXJlIgorICAgZGVzY3JpcHRpb249IkNyZWF0ZSBkb2N1bWVudGF0aW9uIHdlYmFwcCBiaW5hcnkgZGlzdHJpYnV0aW9uIj4KKyAgICAgIDxqYXIgICBqYXJmaWxlPSIke3dlYmFwcHMuZGlzdH0vJHt3ZWJhcHAubmFtZX0ud2FyIgorICAgICAgICAgICAgIGJhc2VkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0iIGluY2x1ZGVzPSIqKiIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7d2ViYXBwcy5kaXN0fS8ke3dlYmFwcC5uYW1lfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBDb252ZW5pZW50IFN5bm9ueW1zID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGRpc3QtY2xlYW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYnVpbGQgYW5kIGRpc3QgZGlyZWN0b3JpZXMiLz4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2J1aWxkaW5nLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYnVpbGRpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYzI1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2J1aWxkaW5nLnhtbApAQCAtMCwwICsxLDI0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudD4KKworICAgICZwcm9qZWN0OworCisgICAgPHByb3BlcnRpZXM+CisgICAgICA8YXV0aG9yPlJlbXkgTWF1Y2hlcmF0PC9hdXRob3I+CisgICAgICA8dGl0bGU+QnVpbGRpbmcgVG9tY2F0PC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCis8c2VjdGlvbiBuYW1lPSJSRUFETUUiPgorPHA+CitUaGlzIGRvY3VtZW50IGR1cGxpY2F0ZXMgc29tZSBvZiB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgQlVJTERJTkcudHh0IGZpbGUKK2luY2x1ZGVkIGluIGV2ZXJ5IFRvbWNhdCBkaXN0cmlidXRpb24uICBZb3UgbWF5IHdhbnQgdG8gY29uc3VsdCBib3RoLgorPC9wPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCis8cD4KK0J1aWxkaW5nIFRvbWNhdCBmcm9tIFNWTiBpcyB2ZXJ5IGVhc3ksIGFuZCBpcyB0aGUgZmlyc3Qgc3RlcCB0byBjb250cmlidXRpbmcgdG8KK1RvbWNhdC4gVGhlIGZvbGxvd2luZyBpcyBhIHN0ZXAgYnkgc3RlcCBUT0RPIGxpc3QuCis8L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iRG93bmxvYWQgYW5kIGluc3RhbGwgYSBKYXZhIERldmVsb3BtZW50IEtpdCAxLjQueCBvciBsYXRlciI+CisKKzxwPgorVGhlIGRlZmF1bHQgZGlzdHJpYnV0aW9uIG9mIFRvbWNhdCA1LjUueCByZXF1aXJlcyBhIDUuMCBvciBsYXRlciBKREsuIFRvbWNhdAorY2FuIGJlIGJ1aWx0IHVzaW5nIGEgMS40LnggSkRLIGJ1dCB5b3Ugd2lsbCBuZWVkIHRvIGNvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZQorY29tcGF0IGRpcmVjdG9yeSAoY3JlYXRlZCBieSB0aGUgYnVpbGQgcHJvY2VzcykgdG8geW91ciBidWlsZCBkaXJlY3RvcnkgYmVmb3JlCitUb21jYXQgd2lsbCBzdGFydC4KKzwvcD4KKworPHA+CitUaGUgU3VuIEpESyBjYW4gYmUgZG93bmxvYWRlZCA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvIj5oZXJlPC9hPi4KKzwvcD4KKworPHA+Cis8Yj5JTVBPUlRBTlQ8L2I+OiBTZXQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgSkFWQV9IT01FIHRvIHRoZSBwYXRobmFtZSBvZiB0aGUgCitkaXJlY3RvcnkgaW50byB3aGljaCB5b3UgaW5zdGFsbGVkIHRoZSBKREsgcmVsZWFzZS4KKzwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJJbnN0YWxsIEFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXIiPgorCis8cD4KK0Rvd25sb2FkIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBBbnQgMS42LjIgb3IgbGF0ZXIgZnJvbSAKKzxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9iaW5kb3dubG9hZC5jZ2kiPmhlcmU8L2E+LgorPC9wPgorCis8cD4KK1VucGFjayB0aGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiBpbnRvIGEgY29udmVuaWVudCBsb2NhdGlvbiBzbyB0aGF0IHRoZQorQW50IHJlbGVhc2UgcmVzaWRlcyBpbiBpdHMgb3duIGRpcmVjdG9yeSAoY29udmVudGlvbmFsbHkgbmFtZWQKKyJhcGFjaGUtYW50LTEuNi54IikuICBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSByZW1haW5kZXIgb2YgdGhpcyBkb2N1bWVudCwKK3RoZSBzeW1ib2xpYyBuYW1lICIke2FudC5ob21lfSIgaXMgdXNlZCB0byByZWZlciB0byB0aGUgZnVsbCBwYXRobmFtZSBvZgorIHRoZSByZWxlYXNlIGRpcmVjdG9yeS4KKzwvcD4KKworPHA+CitDcmVhdGUgYW4gQU5UX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcG9pbnQgdGhlIGRpcmVjdG9yeSAke2FudC5ob21lfSwgCithbmQgbW9kaWZ5IHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGluY2x1ZGUgZGlyZWN0b3J5CisiJHthbnQuaG9tZX0vYmluIiBpbiBpdHMgbGlzdC4gIFRoaXMgbWFrZXMgdGhlICJhbnQiIGNvbW1hbmQgbGluZSBzY3JpcHQKK2F2YWlsYWJsZSwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGFjdHVhbGx5IHBlcmZvcm0gdGhlIGJ1aWxkLgorPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkJ1aWxkaW5nIFRvbWNhdCI+CisKKzxwPgorRG93bmxvYWQgdGhlIG1haW4gYnVpbGQueG1sIHNjcmlwdCBmcm9tIDxhIGhyZWY9ImJ1aWxkLnhtbCI+aGVyZTwvYT4uCis8L3A+CisKKzxwPgorQ3JlYXRlIGEgbmV3IGRpcmVjdG9yeSwgYW5kIGNvcHkgdGhlIG5ld2x5IGRvd25sb2FkIGJ1aWxkLnhtbCB0byBpdC4gVGhpcworICBkaXJlY3Rvcnkgd2lsbCBiZSByZWZlcnJlZCB0byBhcyB0aGUgJHt0b21jYXQuc291cmNlfSBkaXJlY3RvcnkgaW4gdGhlIHJlc3QKKyAgb2YgdGhpcyBkb2N1bWVudC4KKzwvcD4KKworPHA+CitHbyB0byB0aGF0IGRpcmVjdG9yeSwgYW5kIGRvOgorPGNvZGU+PGJyLz4KKyAgICBjZCAke3RvbWNhdC5zb3VyY2V9PGJyLz4KKyAgICBhbnQ8YnIvPgorPC9jb2RlPgorPC9wPgorCis8cD4KK05PVEU6IFVzZXJzIGFjY2Vzc2luZyB0aGUgSW50ZXJuZXQgdGhyb3VnaCBhIHByb3h5IG11c3QgdXNlIGEgcHJvcGVydGllcworICBmaWxlIHRvIGluZGljYXRlIHRvIEFudCB0aGUgcHJveHkgY29uZmlndXJhdGlvbi4gUmVhZCBiZWxvdy4KKzwvcD4KKworPHA+CitXQVJOSU5HOiBSdW5uaW5nIHRoaXMgY29tbWFuZCB3aWxsIGNoZWNrb3V0IHRoZSBUb21jYXQgNSBzb3VyY2VzIGZyb20gU1ZOLCBhcworICB3ZWxsIGFzIGRvd25sb2FkIGJpbmFyaWVzIHRvIHRoZSA8Y29kZT4vdXNyL3NoYXJlL2phdmE8L2NvZGU+IGRpcmVjdG9yeS4gCisgIE1ha2Ugc3VyZSB0aGlzIGlzIGFwcHJvcHJpYXRlIHRvIGRvIHNvIG9uIHlvdXIgY29tcHV0ZXIuIE9uIFdpbmRvd3MsIAorICB0aGlzIHVzdWFsbHkgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkM6XHVzclxzaGFyZVxqYXZhPC9jb2RlPiBkaXJlY3RvcnksIAorICB1bmxlc3MgQ3lnd2luIGlzIHVzZWQuIFJlYWQgYmVsb3cgdG8gY3VzdG9taXplIHRoZSBkaXJlY3RvcnkgdXNlZCAKKyAgdG8gZG93bmxvYWQgdGhlIGJpbmFyaWVzLgorPC9wPgorCis8cD4KK1RoZSBidWlsZCBjYW4gYmUgY29udHJvbGxlZCBieSBjcmVhdGluZyBhICR7dG9tY2F0LnNvdXJjZX0vYnVpbGQucHJvcGVydGllcworICBmaWxlLCBhbmQgYWRkaW5nIHRoZSBmb2xsb3dpbmcgY29udGVudCB0byBpdDoKKzxjb2RlPjxici8+CisgICAgIyAtLS0tLSBQcm94eSBzZXR1cCAtLS0tLTxici8+CisgICAgIyBVbmNvbW1lbnQgaWYgdXNpbmcgYSBwcm94eSBzZXJ2ZXIuPGJyLz4KKyAgICAjcHJveHkuaG9zdD1wcm94eS5kb21haW48YnIvPgorICAgICNwcm94eS5wb3J0PTgwODA8YnIvPgorICAgICNwcm94eS51c2U9b248YnIvPgorPGJyLz4KKyAgICAjIC0tLS0tIERlZmF1bHQgQmFzZSBQYXRoIGZvciBEZXBlbmRlbnQgUGFja2FnZXMgLS0tLS08YnIvPgorICAgICMgUmVwbGFjZSB0aGlzIHBhdGggd2l0aCB0aGUgZGlyZWN0b3J5IHBhdGggd2hlcmU8YnIvPgorICAgICMgZGVwZW5kZW5jaWVzIGJpbmFyaWVzIHNob3VsZCBiZSBkb3dubG9hZGVkLjxici8+CisgICAgYmFzZS5wYXRoPS91c3Ivc2hhcmUvamF2YTxici8+Cis8L2NvZGU+Cis8L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVXBkYXRpbmcgYW5kIHJlYnVpbGRpbmcgVG9tY2F0IHNvdXJjZXMiPgorCis8cD4KK0l0IGlzIHJlY29tbWVuZGVkIHRvIHJlZ3VsYXJseSB1cGRhdGUgdGhlIGRvd25sb2FkZWQgVG9tY2F0IDUgc291cmNlcy4gCitUbyBkbyB0aGlzLCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKzxjb2RlPjxici8+CisgICAgY2QgJHt0b21jYXQuc291cmNlfTxici8+CisgICAgYW50IGNoZWNrb3V0PGJyLz4KKzwvY29kZT4KKzwvcD4KKworPHA+CitGb3IgYSBxdWljayByZWJ1aWxkIG9mIG9ubHkgbW9kaWZpZWQgY29kZSB5b3UgY2FuIHVzZToKKzxjb2RlPjxici8+CisgICAgY2QgJHt0b21jYXQuc291cmNlfTxici8+CisgICAgYW50IGJ1aWxkPGJyLz4KKzwvY29kZT4KKworPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkJ1aWxkaW5nIHdpdGggRWNsaXBzZSI+CisKKzxwPgorPGI+SW1wb3J0YW50OjwvYj4KK1RoaXMgaXMgbm90IGEgc3VwcG9ydGVkIG1lYW5zIG9mIGJ1aWxkaW5nIFRvbWNhdDsgdGhpcyBpbmZvcm1hdGlvbiBpcworcHJvdmlkZWQgd2l0aG91dCB3YXJyYW50eSA6LSkuCitUaGUgb25seSBzdXBwb3J0ZWQgbWVhbnMgb2YgYnVpbGRpbmcgVG9tY2F0IGlzIHdpdGggdGhlICJhbnQgYnVpbGQiCitkZXNjcmliZWQgYWJvdmUuCitIb3dldmVyLCBzb21lIGRldmVsb3BlcnMgbGlrZSB0byB3b3JrIG9uIEphdmEgY29kZSB3aXRoIGEgSmF2YSBJREUsCithbmQgdGhlIGZvbGxvd2luZyBzdGVwcyBoYXZlIGJlZW4gdXNlZCBieSBzb21lIGRldmVsb3BlcnMuCis8L3A+CisKKzxwPgorTm90ZSB0aGF0IHlvdSA8Yj5tdXN0PC9iPiBjb21wbGV0ZSBhbGwgdGhlIGFib3ZlIHN0ZXBzIHRvIGZldGNoCit0aGUgcmVwb3NpdG9yaWVzIGFuZCBidWlsZCBzb21lIEpBUiBmaWxlcyB0aGUgZmlyc3QgdGltZS4KK0FmdGVyIHlvdSBoYXZlIGNvbXBsZXRlZCB0aGUgYWJvdmUgc3RlcHMsIHlvdSBjYW4gc2V0IHVwIGEKK3NlcmllcyBvZiBFY2xpcHNlIDQgcHJvamVjdHMuCis8Yj5Ob3RlPC9iPiB0aGF0IHRoaXMgd2lsbCBub3QgbGV0IHlvdSBidWlsZCBldmVyeXRoaW5nIHVuZGVyIEVjbGlwc2U7Cit0aGUgYnVpbGQgcHJvY2VzcyByZXF1aXJlcyB1c2Ugb2YgQW50IGZvciB0aGUgbWFueSBzdGFnZXMgdGhhdCBhcmVuJ3QKK3NpbXBsZSBKYXZhIGNvbXBpbGF0aW9ucy4KK0hvd2V2ZXIsIGl0IHdpbGwgYWxsb3cgeW91IHRvIHZpZXcgYW5kIGVkaXQgdGhlIEphdmEgY29kZSwKK2dldCB3YXJuaW5ncywgcmVmb3JtYXQgY29kZSwgcGVyZm9ybSByZWZhY3RvcmluZ3MsIHJ1biBUb21jYXQKK3VuZGVyIHRoZSBJREUsIGFuZCBzbyBvbi4KKzwvcD4KKworPHA+WW91IHdpbGwgd2FudCB0byBzZXQgdXAgeW91ciBFY2xpcHNlIHByb2plY3QgZm9yIGJ1aWxkaW5nIFRvbWNhdCBzdWNoIHRoYXQKKyR7dG9tY2F0U291cmNlfSBpcyB0aGUgV29ya3NwYWNlIGZvbGRlci4KKzwvcD4KKworPHA+CitVc2UgV2luZG93cy0mZ3Q7UHJlZmVyZW5jZXMgYW5kIHRoZW4gSmF2YS0mZ3Q7QnVpbGQgUGF0aC0mZ3Q7Q2xhc3NwYXRoCitWYXJpYWJsZXMgdG8gYWRkIHR3byBuZXcgQ2xhc3NwYXRoIHZhcmlhYmxlczoKKzwvcD4KKworPHA+Cis8dGFibGUgYm9yZGVyPSIxIj4KKyA8dHI+PHRkPlRPTUNBVF9MSUJTX0JBU0U8L3RkPjx0ZD50aGUgYmFzZSBwYXRoIHdoZXJlIHRoZSBiaW5hcnkgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBkb3dubG9hZGVkPC90ZD48L3RyPgorIDx0cj48dGQ+QU5UX0hPTUU8L3RkPjx0ZD50aGUgYmFzZSBwYXRoIG9mIEFudCAxLjYuMiBvciBsYXRlcjwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3A+CisKKzxwPgorVXNlIEZpbGUtJmd0O05ldyBQcm9qZWN0IHRvIGNyZWF0ZSBhIG5ldyBKYXZhIHByb2plY3QgCitmb3IgZWFjaCBvZiB0aGUgYmluYXJpZXMgcmVwb3NpdG9yeSAoZS5nLiwgL3Vzci9zaGFyZS9qYXZhKSwgCitjb250YWluZXIsIGNvbm5lY3RvcnMsIGphc3Blciwgc2VydmxldGFwaS4gCitJZiB5b3UgZGlkbid0IGFscmVhZHkgc2V0IHVwIHRoZSBFY2xpcHNlIHByb2plY3Qgc3VjaCB0aGF0ICR7dG9tY2F0LnNvdXJjZX0gCitpcyB0aGUgV29ya3NwYWNlIGZvbGRlciwgZG8gc28gbm93OiAKK3RlbGwgRWNsaXBzZSB0aGUgZXh0ZXJuYWwgbG9jYXRpb24gdXNpbmcgJnF1b3Q7SW1wb3J0L0V4cG9ydC4uLiZxdW90OywKK0dlbmVyYWwtJmd0O0V4aXN0aW5nIFByb2plY3QgaW50byBXb3Jrc3BhY2UuCis8L3A+CisKKzxwPgorRWNsaXBzZSAucHJvamVjdCBhbmQgLmNsYXNzcGF0aCBmaWxlcyBhcmUgcHJvdmlkZWQgaW4gZWFjaCBvZiB0aGVzZQorZGlyZWN0b3JpZXMgc28gRWNsaXBzZSBzaG91bGQgZmluZCBhbGwgc291cmNlIHRyZWVzIGFuZCBqYXJzLCBhbmQKK2hvcGVmdWxseSBjb21waWxlIHdpdGhvdXQgcHJvYmxlbXMuIDxiPk5vdGU8L2I+IHRoYXQgdGhlc2UKK2ZpbGVzIGFzc3VtZSB5b3UgYXJlIHVzaW5nIEVjbGlwc2Ugd2l0aCBhIDUuMCBvciBsYXRlciBKREs7IGFsc28sIHRoZQorY29ubmVjdG9ycyBtb2R1bGUgbXVzdCBiZSBidWlsdCB3aXRoIGEgY29tcGlsZXIgY29tcGxpYW5jZSBsZXZlbCBvZiA1LjAuCis8L3A+CisKKzxwPgorVG8gcnVuIFRvbWNhdCB3aXRob3V0IGEgc3BlY2lhbCBJREUgcGx1Zy1pbiwgeW91IGNhbiBzaW1wbHkgdXNlIFJ1bi0mZ3Q7UnVuLi4uCitlbnRlciAib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNhdGFsaW5hIiBhcyB0aGUgbWFpbiBjbGFzcywKKyJzdGFydCIgYXMgcHJvZ3JhbSBhcmd1bWVudHMsIGFuZAorIi1EY2F0YWxpbmEuaG9tZT0uLi4iICh3aXRoIHRoZSBuYW1lIG9mIHlvdXIgYnVpbGQgZGlyZWN0b3J5KSAKK2FzIFZNIGFyZ3VtZW50cy4KKzwvcD4KKworPHA+CitOb3RlIGFsc28gdGhhdCBkdWUgdG8gdGhlIHdheSB0aGUgVG9tY2F0IHNvdXJjZSBpcyBhc3NlbWJsZWQKK2Zyb20gc2V2ZXJhbCBTVk4gcHJvamVjdHMsIHlvdSBtYXkgbm90IGJlIGFibGUgdG8gdXNlIHRoZSBFY2xpcHNlCitTVk4gY2xpZW50IHRvIHVwZGF0ZSAobm9yIHRvIGNvbW1pdCwgaWYgeW91IGFyZSBhIGNvbW1pdHRlcikuCitVc2UgdGhlIGV4dGVybmFsIFNWTiBjbGllbnQgb2YgeW91ciBjaG9pY2UsIHRoZW4gdXNlIHRoZQorRWNsaXBzZSBQYWNrYWdlRXhwbG9yZXIgb3IgTmF2aWdhdG9yICJSZWZyZXNoIiBjb250ZXh0IG1lbnUgaXRlbQordG8gdGVsbCBFY2xpcHNlIHRoYXQgeW91J3ZlIHVwZGF0ZWQgdGhlIGZpbGVzLgorPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkJ1aWxkaW5nIHdpdGggb3RoZXIgSURFcyI+Cis8cD4KK1RoZSBzYW1lIGNhdmVhdHMgYXBwbHkgYXMgZm9yIEVjbGlwc2UsIGFib3ZlLgorPC9wPgorCis8cD4KK1RoZSBzYW1lIGdlbmVyYWwgaWRlYSBzaG91bGQgd29yayBpbiBtb3N0IElERXM7IGl0IGhhcyBiZWVuIHJlcG9ydGVkCit0byB3b3JrIGluIElkZWEsIGZvciBleGFtcGxlLgorPC9wPgorCis8L3NlY3Rpb24+CisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NhdGFsaW5hL2RvY3MvYXBpL2luZGV4Lmh0bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NhdGFsaW5hL2RvY3MvYXBpL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlOGY5YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY2F0YWxpbmEvZG9jcy9hcGkvaW5kZXguaHRtbApAQCAtMCwwICsxLDE3IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL3N0cmljdC5kdGQiPgorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICAgPHRpdGxlPkFkbWluaXN0cmF0aW9uPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKK1RvbWNhdCdzIGludGVybmFsIGphdmFkb2MgaXMgbm8gbG9uZ2VyIGluc3RhbGxlZCBieSBkZWZhdWx0LiBEb3dubG9hZCBhbmQgaW5zdGFsbCAKK3RoZSAiZnVsbGRvY3MiIHBhY2thZ2UgdG8gZ2V0IGl0LgorCitZb3UgY2FuIGFsc28gYWNjZXNzIHRoZSBqYXZhZG9jIG9ubGluZSBpbiB0aGUgVG9tY2F0IAorPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvdG9tY2F0LTUuNS1kb2MvIj5kb2N1bWVudGF0aW9uIGJ1bmRsZTwvYT4uCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY2dpLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY2dpLWhvd3RvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzcyMGIzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jZ2ktaG93dG8ueG1sCkBAIC0wLDAgKzEsNzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJjZ2ktaG93dG8uaHRtbCI+CisKKyAgICAmcHJvamVjdDsKKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8YXV0aG9yIGVtYWlsPSJnbGVubkBhcGFjaGUub3JnIj5HbGVubiBMLiBOaWVsc2VuPC9hdXRob3I+CisgICAgICAgIDx0aXRsZT5DR0kgSG93IFRvPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCis8cD5UaGUgQ0dJIChDb21tb24gR2F0ZXdheSBJbnRlcmZhY2UpIGRlZmluZXMgYSB3YXkgZm9yIGEgd2ViIHNlcnZlciB0bworaW50ZXJhY3Qgd2l0aCBleHRlcm5hbCBjb250ZW50LWdlbmVyYXRpbmcgcHJvZ3JhbXMsIHdoaWNoIGFyZSBvZnRlbgorcmVmZXJyZWQgdG8gYXMgQ0dJIHByb2dyYW1zIG9yIENHSSBzY3JpcHRzLgorPC9wPgorCis8cD5XaXRoaW4gVG9tY2F0LCBDR0kgc3VwcG9ydCBjYW4gYmUgYWRkZWQgd2hlbiB5b3UgYXJlIHVzaW5nIFRvbWNhdCBhcyB5b3VyCitIVFRQIHNlcnZlciBhbmQgcmVxdWlyZSBDR0kgc3VwcG9ydC4gIFR5cGljYWxseSB0aGlzIGlzIGRvbmUKK2R1cmluZyBkZXZlbG9wbWVudCB3aGVuIHlvdSBkb24ndCB3YW50IHRvIHJ1biBhIHdlYiBzZXJ2ZXIgbGlrZSAKK0FwYWNoZSBodHRwZC4KK1RvbWNhdCdzIENHSSBzdXBwb3J0IGlzIGxhcmdlbHkgY29tcGF0aWJsZSB3aXRoIEFwYWNoZSBodHRwZCdzLCAKK2J1dCB0aGVyZSBhcmUgc29tZSBsaW1pdGF0aW9ucyAoZS5nLiwgb25seSBvbmUgY2dpLWJpbiBkaXJlY3RvcnkpLgorPC9wPgorCis8cD5DR0kgc3VwcG9ydCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgc2VydmxldCBjbGFzcworPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5zZXJ2bGV0cy5DR0lTZXJ2bGV0PC9jb2RlPi4gIFRyYWRpdGlvbmFsbHksCit0aGlzIHNlcnZsZXQgaXMgbWFwcGVkIHRvIHRoZSBVUkwgcGF0dGVybiAiL2NnaS1iaW4vKiIuPC9wPgorCis8cD5CeSBkZWZhdWx0IENHSSBzdXBwb3J0IGlzIGRpc2FibGVkIGluIFRvbWNhdC48L3A+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9Ikluc3RhbGxhdGlvbiI+CisKKzxwPjxzdHJvbmc+Q0FVVElPTjwvc3Ryb25nPiAtIENHSSBzY3JpcHRzIGFyZSB1c2VkIHRvIGV4ZWN1dGUgcHJvZ3JhbXMKK2V4dGVybmFsIHRvIHRoZSBUb21jYXQgSlZNLiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBKYXZhIFNlY3VyaXR5TWFuYWdlciB0aGlzCit3aWxsIGJ5cGFzcyB5b3VyIHNlY3VyaXR5IHBvbGljeSBjb25maWd1cmF0aW9uIGluIDxjb2RlPmNhdGFsaW5hLnBvbGljeS48L2NvZGU+PC9wPgorCis8cD5SZW5hbWUgPGNvZGU+JENBVEFMSU5BX0JBU0Uvc2VydmVyL2xpYi9zZXJ2bGV0cy1jZ2kucmVuYW1ldG9qYXI8L2NvZGU+Cit0byA8Y29kZT4kQ0FUQUxJTkFfQkFTRS9zZXJ2ZXIvbGliL3NlcnZsZXRzLWNnaS5qYXI8L2NvZGU+LjwvcD4KKworPHA+UmVtb3ZlIHRoZSBYTUwgY29tbWVudHMgZnJvbSBhcm91bmQgdGhlIENHSSBzZXJ2bGV0IGFuZCBzZXJ2bGV0LW1hcHBpbmcKK2NvbmZpZ3VyYXRpb24gaW4gPGNvZGU+JENBVEFMSU5BX0JBU0UvY29uZi93ZWIueG1sPC9jb2RlPi48L3A+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkNvbmZpZ3VyYXRpb24iPgorCis8cD5UaGVyZSBhcmUgc2V2ZXJhbCBzZXJ2bGV0IGluaXQgcGFyYW1ldGVycyB3aGljaCBjYW4gYmUgdXNlZCB0bworY29uZmlndXJlIHRoZSBiZWhhdmlvdXIgb2YgdGhlIENHSSBzZXJ2bGV0LgorPHVsPgorPGxpPjxzdHJvbmc+Y2dpUGF0aFByZWZpeDwvc3Ryb25nPiAtIFRoZSBDR0kgc2VhcmNoIHBhdGggd2lsbCBzdGFydCBhdAordGhlIHdlYiBhcHBsaWNhdGlvbiByb290IGRpcmVjdG9yeSArIEZpbGUuc2VwYXJhdG9yICsgdGhpcyBwcmVmaXguCitUaGUgZGVmYXVsdCBjZ2lQYXRoUHJlZml4IGlzIDxjb2RlPldFQi1JTkYvY2dpPC9jb2RlPjwvbGk+Cis8bGk+PHN0cm9uZz5kZWJ1Zzwvc3Ryb25nPiAtIERlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgZm9yIG1lc3NhZ2VzIGxvZ2dlZAorYnkgdGhpcyBzZXJ2bGV0LiBEZWZhdWx0IDAuPC9saT4KKzxsaT48c3Ryb25nPmV4ZWN1dGFibGU8L3N0cm9uZz4gLSBUaGUgb2YgdGhlIGV4ZWN1dGFibGUgdG8gYmUgdXNlZCB0bworcnVuIHRoZSBzY3JpcHQuIERlZmF1bHQgaXMgPGNvZGU+cGVybDwvY29kZT4uPC9saT4KKzxsaT48c3Ryb25nPnBhcmFtZXRlckVuY29kaW5nPC9zdHJvbmc+IC0gTmFtZSBvZiB0aGUgcGFyYW1ldGVyIGVuY29kaW5nCit0byBiZSB1c2VkIHdpdGggdGhlIEdDSSBzZXJ2bGV0LiBEZWZhdWx0IGlzCis8Y29kZT5TeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciLCJVVEYtOCIpPC9jb2RlPi48L2xpPgorPGxpPjxzdHJvbmc+cGFzc1NoZWxsRW52aXJvbm1lbnQ8L3N0cm9uZz4gLSBTaG91bGQgdGhlIHNoZWxsIGVudmlyb25tZW50Cit2YXJpYWJsZXMgKGlmIGFueSkgYmUgcGFzc2VkIHRvIHRoZSBDR0kgc2NyaXB0PyBEZWZhdWx0IGlzCis8Y29kZT5mYWxzZTwvY29kZT4uPC9saT4KKzwvdWw+Cis8L3A+CisKKzwvc2VjdGlvbj4KKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jaGFuZ2Vsb2cueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jaGFuZ2Vsb2cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NjVjMzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NoYW5nZWxvZy54bWwKQEAgLTAsMCArMSwzNjMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImNoYW5nZWxvZy5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hdXRob3I+CisgICAgPGF1dGhvciBlbWFpbD0ieW9hdnNAYXBhY2hlLm9yZyI+WW9hdiBTaGFwaXJhPC9hdXRob3I+CisgICAgPGF1dGhvciBlbWFpbD0iZmhhbmlrQGFwYWNoZS5vcmciPkZpbGlwIEhhbmlrPC9hdXRob3I+CisgICAgPHRpdGxlPkNoYW5nZWxvZzwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+Cis8c2VjdGlvbiBuYW1lPSJUb21jYXQgNS41LjI0IChmaGFuaWspIj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iR2VuZXJhbCI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFVwZGF0ZSB0byBDb21tb25zIERCQ1Agc3JjIDEuMi4yIChwZXJvKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBVcGRhdGUgdG8gQ29tbW9ucyBQb29sIHNyYyAxLjMgKHBlcm8pCisgICAgICA8L3VwZGF0ZT4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICA8c3Vic2VjdGlvbiBuYW1lPSJDYXRhbGluYSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzM3NzQ8L2J1Zz4gUmV0cnkgSk5ESSBhdXRoZW50aWN0aW9uIG9uIFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbgorICAgICAgICBhcyBhdCBsZWFzdCBvbmUgcHJvdmlkZXIgdGhyb3dzIHRoaXMgYWZ0ZXIgYW4gaWRsZSBjb25uZWN0aW9uIGhhcyBiZWVuCisgICAgICAgIGNsb3NlZC4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQwNTkzPC9idWc+IENsZWFudXAgdGhhdCBMaXN0ZW5lciBzdG9wIGFmdGVyIE1hbmFnZXIgc3RvcCAKKyAgICAgICAgYXQgU3RhbmRhcmRDb250ZXh0LnN0b3AoKS4gUGF0Y2ggYnkgU3V6dWtpIFl1aWNoaXJvIChwZXJvKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQxNzQ3PC9idWc+IENvcnJlY3QgZXhhbXBsZSBhbnQgc2NyaXB0IGZvciBkZXBsb3kgdGFzay4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQxNzUyPC9idWc+IENvcnJlY3QgZXJyb3IgbWVzc2FnZSBvbiBleGNlcHRpb24gaW4gTWVtb3J5UmVhbG0uCisgICAgICAgIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zOTg3NTwvYnVnPiBNaW5vciBjbGVhbnVwIGluIFJlYWxtQmFzZS5pbml0LCBhcyByZXF1ZXN0ZWQgYnkgVGFrYXlvc2hpIEtpbXVyYS4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQxNDc3PC9idWc+IEFkZCBjb21tb25zLWVsLmphciB0byBiaW4vY2F0YWxpbmEtdGFza3MueG1sLCByZXF1aXJlZCBmb3IgamFzcGVyMiB0YXNrcworICAgICAgICAgIHVzaW5nIEVMLiBQYXRjaCBieSBEYW5pZWwgU2FudG9zLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDAxNTA8L2J1Zz4gRW5zdXJlIHVzZXIgYW5kIHJvbGwgY2xhc3NuYW1lcyBhcmUgdmFsaWRhdGVkIG9uIHN0YXJ0dXAuICBQYXRjaCBieQorICAgICAgICAgIFRvbS4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQyMDM5PC9idWc+IExvZyBhIHN0YWNrIHRyYWNlIGlmIGEgc2VydmxldCB0aHJvd3MgYW4KKyAgICAgICAgIFVuYXZhaWxhYmxlRXhjZXB0aW9uLiBQYXRjaCBwcm92aWRlZCBieSBLYXdhc2ltYSBLYXp1aC4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQxOTkwPC9idWc+IEFkZCBzb21lIGFkZGl0aW9uYWwgbWltZS10eXBlIG1hcHBpbmdzLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDE2NTU8L2J1Zz4gRml4IG1lc3NhZ2UgdHJhbnNsYXRpb25zLiBKYXBhbmVzZSB0cmFuc2xhdGlvbnMKKyAgICAgICAgcHJvdmlkZWQgYnkgU3V6dWtpIFl1aWNoaXJvLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDE5Mzk8L2J1Zz4gQWRkIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRvIGRpc2FibGUgbnVsbGluZyBvZiBzdGF0aWMKKyAgICAgICAgYW5kIGZpbmFsIGZpZWxkcyBvZiBsb2FkZWQgY2xhc3NlcyB3aGVuIHN0b3BwaW5nIGEgd2ViIGFwcGxpY2F0aW9uCisgICAgICAgIGNsYXNzbG9hZGVyLiBTZXR0aW5nIHRoZSBzeXN0ZW0gcHJvcGVydHkKKyAgICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIuV2ViYXBwQ2xhc3NMb2FkZXIuRU5BQkxFX0NMRUFSX1JFRkVSRU5DRVMgdG8KKyAgICAgICAgZmFsc2Ugd2lsbCBzdG9wIHRoZXNlIGZpZWxkcyBiZWluZyBzZXQgdG8gbnVsbCBvbiBjb250ZXh0IHN0b3AuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IGEgbG9nZ2luZyByZWxhdGVkIG1lbW9yeSBsZWFrIGluIE1hbmFnZXJCYXNlIGFuZAorICAgICAgICBBcHBsaWNhdGlvbkRpc3BhdGNoZXIuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgIDxidWc+NDIzNTQ8L2J1Zz46IEVuc3VyZSBKQVJzIGluIHdlYmFwcHMgYXJlIHNjYW5uZWQgZm9yIFRMRHMgd2hlbiB0aGUKKyAgICAgICAgIFRvbWNhdCBpbnN0YWxsYXRpb24gcGF0aCBjb250YWlucyBzcGFjZXMuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgIDxidWc+NDIzNjE8L2J1Zz46IEhhbmRsZSBtdWx0aS1wYXJ0IGZvcm1zIHdoZW4gc2F2aW5nIHJlcXVlc3RzIGR1cmluZworICAgICAgICAgRk9STSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzLiBQYXRjaCBwcm92aWRlZCBieSBQZXRlciBSdW5nZS4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICAgPGJ1Zz40MjQwMTwvYnVnPjogVXBkYXRlIFJVTk5JTkcudHh0IHdpdGggYmV0dGVyIEpSRS9KREsgaW5mb3JtYXRpb24uCisgICAgICAgICAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgICA8YnVnPjQyNDk3PC9idWc+OiBFbnN1cmUgRVRhZyBoZWFkZXIgaXMgcHJlc2VudCBpbiBhIDMwNCByZXNwb25zZS4KKyAgICAgICAgIFBhdGNoIHByb3ZpZGVkIGJ5IExlbiBQb3BwLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgICBBbGxvdyBmb3IgYSBmb3J3YXJkL2luY2x1ZGUgdG8gY2FsbCBnZXRBdHRyaWJ1dGVOYW1lcyBvbiB0aGUgUmVxdWVzdCBpbiBhIHNhbmRib3guIChiaWxsYmFya2VyKQorICAgICAgPC9maXg+CisgICAgICA8YWRkPgorICAgICAgICBBbmQgZ2V0U2Vzc2lvbigpIG9wZXJhdGlvbiB0byBTdGFuZGFyZE1hbmFnZXIgYW5kIERlbHRhTWFuYWdlciBKTVggSW50ZXJmYWNlIChwZXJvKQorICAgICAgPC9hZGQ+ICAgICAKKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICA8c3Vic2VjdGlvbiBuYW1lPSJXZWJhcHBzIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgVXBkYXRlIGhvc3QgY29uZmlndXJhdGlvbiBkb2N1bWVudCBmb3IgbmV3IGJlaGF2aW91ciBmb3IgZGlyZWN0b3JpZXMKKyAgICAgICAgaW4gYXBwQmFzZS4gKG1hcmt0KQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICA8YnVnPjM5ODgzPC9idWc+ICBBZGQgbm90ZSB0byBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZG9jdW1lbnQgYWJvdXQgdXNpbmcKKyAgICAgICAgICBhbnRpUmVzb3VyY2VMb2NraW5nIG9uIGEgd2ViYXBwIG91dHNpZGUgdGhlIEhvc3QncyBhcHBCYXNlIGRpcmVjdG9yeS4gKHlvYXZzKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICA8YnVnPjM5NTQwPC9idWc+IEFkZCBsaW5rIHRvIGh0dHBkIDIuMiBtb2RfcHJveHlfYWpwIGRvY3MgaW4gQUpQIGNvbm5lY3RvciBkb2MuICh5b2F2cykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MTI4OTwvYnVnPjogQ3JlYXRlIGNvbmZpZ0Jhc2UsIHNpbmNlIGl0IGlzIG5vIGxvbmdlciBjcmVhdGVkIGVsc2V3aGVyZS4KKyAgICAgICAgU3VibWl0dGVkIGJ5IFNoaXZhIEt1bWFyIEggUi4gKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDIxMDM8L2J1Zz46IFVzZSBjb3JyZWN0IG5hbWVzIGZvciB0cnVzdHN0b3JlRmlsZSwgdHJ1c3RzdG9yZVR5cGUgYW5kIAorICAgICAgICB0cnVzdHN0b3JlUGFzcyB3aGVuIHNhdmluZyBzZXJ2ZXIueG1sIGluIEFkbWluIHdlYmFwcC4gUGF0Y2ggcHJvdmlkZWQgYnkKKyAgICAgICAgTWF0aGV1cyBCYXN0b3MuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MjAyNTwvYnVnPjogVXBkYXRlIHZhbHZlIGRvY3VtZW50YXRpb24gdG8gcmVmZXIgdG8gY29ycmVjdCByZWd1bGFyCisgICAgICAgIGV4cHJlc3Npb24gaW1wbGVtZW50YXRpb24uIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MTk1NjwvYnVnPjogRG9uJ3Qgc2tpcCB0aGUgY29ubmVjdG9yIGFkZHJlc3MgYXR0cmlidXRlIHdoZW4KKyAgICAgICAgcGVyc2lzdGluZyBzZXJ2ZXIueG1sIGNoYW5nZXMgdmlhIHRoZSBhZG1pbiB3ZWJhcHAuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkNveW90ZSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDA5NjA8L2J1Zz4gSW5jb25zaXN0ZW50IGV4Y2VwdGlvbiB0eXBlIHRocm93biBvbiBzb2NrZXQgdGltZW91dCBpbgorICAgICAgICAgIEludGVybmFsQXBySW5wdXRCdWZmZXIuICBQYXRjaCBieSBDaHJpc3RvcGhlIFBpZXJyZXQuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGFkZD4KKyAgICAgICAgPGJ1Zz40MTY3NTwvYnVnPiBBZGQgYSBjb3VwbGUgb2YgREVCVUctbGV2ZWwgbG9nZ2luZyBzdGF0ZW1lbnRzIHRvIEh0dHAxMVByb2Nlc3NvcnMKKyAgICAgICAgICB3aGVuIHNlbmRpbmcgZXJyb3IgcmVzcG9uc2VzLiAgUGF0Y2ggYnkgUmFsZiBIYXVzZXIuICh5b2F2cykKKyAgICAgIDwvYWRkPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MjExOTwvYnVnPiBGaXggcmV0dXJuIHZhbHVlIGZvciByZXF1ZXN0LmdldENoYXJhY3RlckVuY29kaW5nKCkgd2hlbgorICAgICAgICBDb250ZW50LVR5cGUgaGVhZGVycyBjb250YWluIHBhcmFtZXRlcnMgb3RoZXIgdGhhbiBjaGFyc2V0LiBQYXRjaCBieQorICAgICAgICBMZWlnaCBMIEtsb3R6IEpyLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzYxNTU8L2J1Zz4gQWx3YXlzIHJlc2V0IHRoZSBNQiB3aGVuIGRvaW5nIGdldEJ5dGVzIGluIHRoZSBKSyBDb25uZWN0b3IgKGJpbGxiYXJrZXIpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEltcHJvdmUgbGFyZ2UtZmlsZSBzdXBwb3J0IGluIHRoZSBBSlAgQ29ubmVjdG9ycyAoYmlsbGJhcmtlcikKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkNsdXN0ZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICBSZWNlaXZlciBjYW4gYWxzbyB1c2UgdGNwTGlzdGVuQWRkcmVzcyB3aXRoIGEgaG9zdG5hbWUuIChyanVuZywgcGVybykKKyAgICAgIDwvZml4PiAgICAgCisgICAgICA8Zml4PgorICAgICAgICBEZWx0YVJlcXVlc3Qgc3luY2hyb25pemVkIGdldFNpemUoKSBhbmQgc2hvdyBsb2cgbWVzc2FnZSBhcyAKKyAgICAgICAgcmVhZEV4dGVybmFsKCkgZmFpbHVyZS4gKHJqdW5nLCBwZXJvKQorICAgICAgPC9maXg+CisgICAgICA8YWRkPgorICAgICAgICBBZGQgRGVsdGFNYW5hZ2VyIGV4cGlyZVRvbGVyYW5jZSBhdHRyaWJ1dGUgdG8gcXVpY2tlciBhdXRvIGV4cGlyZSBsb25nIGJhY2t1cCBzZXNzaW9ucy4gKHJqdW5nLCBwZXJvKQorICAgICAgPC9hZGQ+CisgICAgICA8YWRkPgorICAgICAgICBBZGQgRGVsdGFNYW5hZ2VyIHVwZGF0ZUFjdGl2ZUludGVydmFsbCBhdHRyaWJ1dGUgdG8gc2VuZCBldmVyeSA2MCBzZWMgYSBzZXNzaW9uIGFjY2VzcyBtZXNzYWdlLiAocmp1bmcsIHBlcm8pCisgICAgICA8L2FkZD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzk4NjY8L2J1Zz4gRHVwbGljYXRlIG5hbWVzIGFwcGVuZGVkIHRvIGNsdXN0ZXIgbWFuYWdlciBuYW1lLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPiAgIAorICA8c3Vic2VjdGlvbiBuYW1lPSJKYXNwZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM5NDI1PC9idWc+IEFkZCBhZGRpdGlvbmFsIHN5c3RlbSBwcm9wZXJ0eSBwZXJtaXNzaW9uIHRvCisgICAgICAgIGNhdGFsaW5hLnBvbGljeSBmb3IgcHJlLWNvbXBpbGVkIEpTUHMuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MTIyNzwvYnVnPiBBZGQgYSBiaXQgb2YgREVCVUctbGV2ZWwgbG9nZ2luZyB0byBKc3BDIHNvIHVzZXJzIGtub3cKKyAgICAgICAgICB3aGljaCBmaWxlIGlzIGJlaW5nIGNvbXBpbGVkLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDE4Njk8L2J1Zz4gVGFnRGF0YS5nZXRBdHRyaWJ1dGUoKSBzaG91bGQgcmV0dXJuCisgICAgICAgIFRhZ0RhdGEuUkVRVUVTVF9USU1FX1ZBTFVFIHdoZW4gdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyBhbiBFTCBleHByZXNzaW9uLgorICAgICAgICAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDIwNzE8L2J1Zz4gRml4IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBvbiBtdWx0aXBsZSByZXF1ZXN0cyB0bworICAgICAgICBhbiB1bmF2YWlsYWJsZSBKU1AuIFBhdGNoIHByb3ZpZGVkIGJ5IEthd2FzaW1hIEthenVoLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEFmdGVyIGEgSlNQIHRocm93cyBhbiBVbmF2YWlsYWJsZUV4Y2VwdGlvbiBhbGxvdyBpdCB0byBiZSBhY2Nlc3NlZCBvbmNlCisgICAgICAgIHRoZSB1bmF2YWlsYWJsZSBwZXJpb2QgaGFzIGV4cGlyZWQuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MjA3MjwvYnVnPiBEb24ndCBjYWxsIGRlc3Ryb3koKSBpZiB0aGUgYXNzb2NpYXRlZCBpbml0KCkgZmFpbHMuCisgICAgICAgIFBhdGNoIHByb3ZpZGVkIGJ5IEthd2FzaW1hIEthenVoLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBhIGxvZ2dpbmcgcmVsYXRlZCBtZW1vcnkgbGVhayBpbiBQYWdlQ29udGV4dEltcGwuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MjQzODwvYnVnPiBEdXBsaWNhdGUgdGVtcG9yYXJ5IHZhcmlhYmxlcyB3ZXJlIGNyZWF0ZWQgd2hlbgorICAgICAgICBqc3A6YXR0cmlidXRlIHdhcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggY3VzdG9tIHRhZ3MuIFBhdGNoIHByb3ZpZGVkCisgICAgICAgIGJ5IEJyaWFuIExlbnouIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlRvbWNhdCA1LjUuMjMgKGZoYW5paykiPgorICA8c3Vic2VjdGlvbiBuYW1lPSJDYXRhbGluYSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDE2MDg8L2J1Zz4gTWFrZSBsb2cgbGV2ZWxzIGNvbnNpc3RlbnQgd2hlbiBTZXJ2bGV0LnNlcnZpY2UoKQorICAgICAgICB0aHJvd3MgYW4gZXhjZXB0aW9uLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDE2NjY8L2J1Zz4gQ29ycmVjdCBoYW5kbGluZyBvZiBib3VuZGFyeSBjb25kaXRpb25zIGZvcgorICAgICAgICBJZi1Vbm1vZGlmaWVkLVNpbmNlIGFuZCBJZi1Nb2RpZmllZC1TaW5jZSBoZWFkZXJzLiBQYXRjaCBwcm92aWRlZCBieQorICAgICAgICBTdXp1a2kgWXVpY2hpcm8uIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MTY3NDwvYnVnPiBGaXggZXJyb3IgbWVzc2FnZXMgd2hlbiBwYXJzaW5nIGNvbnRleHQueG1sIHRoYXQKKyAgICAgICAgaW5jb3JyZWN0bHkgcmVmZXJyZWQgdG8gd2ViLnhtbC4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQxNzM5PC9idWc+IENvcnJlY3QgaGFuZGxpbmcgb2Ygc2VydmxldHMgd2l0aCBhIGxvYWQtb24tc3RhcnR1cAorICAgICAgICB2YWx1ZSBvZiB6ZXJvLiBUaGVzZSBhcmUgbm93IHRoZSBmaXJzdCBzZXJ2bGV0cyB0byBiZSBzdGFydGVkLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICA8c3Vic2VjdGlvbiBuYW1lPSJDb3lvdGUiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICBSZXF1ZXN0cyB3aXRoIG11bHRpcGxlIGNvbnRlbnQtbGVuZ3RoIGhlYWRlcnMgYXJlIG5vdyByZWplY3RlZC4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVG9tY2F0IDUuNS4yMiAoZmhhbmlrKSI+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkdlbmVyYWwiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICBGaXggcmVncmVzc2lvbiBpbiBidWlsZCB0aGF0IHByZXZlbnRlZCBjb25uZWN0b3JzIGZyb20gYnVpbGRpbmcuCisgICAgICAgIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlRvbWNhdCA1LjUuMjEgKGZoYW5paykiPgorICA8c3Vic2VjdGlvbiBuYW1lPSJDYXRhbGluYSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDE0MDE8L2J1Zz46IFN0YW5kYXJkU2VydmljZS5nZXRDb25uZWN0b3JOYW1lcygpIHJldHVybiBhcnJheSBvZiAKKyAgICAgICAgQ29ubmVjdG9yIEpNWCBvYmplY3RuYW1lcy4gKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mjk3Mjc8L2J1Zz46IElmIGVudi1lbnRyeSB2YWx1ZXMgaW4gd2ViLnhtbCBhcmUgY2hhbmdlZCB0aGVuCisgICAgICAgIGVuc3VyZSBuZXcgdmFsdWVzIGFyZSBhcHBsaWVkIHdoZW4gY29udGV4dCBpcyByZWxvYWRlZC4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM0OTU2PC9idWc+OiBFbnN1cmUgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugb2JqZWN0cyBwYXNzZWQgdG8gYQorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciBtZWV0IHRoZSByZXF1aXJlbWVudHMgb2YgU1JWLjguMiBhbmQKKyAgICAgICAgU1JWLjE0LjIuNS4xLiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuIFRoZSBKYXZhIG9wdGlvbiAKKyAgICAgICAgPGNvZGU+LURvcmcuYXBhY2hlLmNhdGFsaW5hLlNUUklDVF9TRVJWTEVUX0NPTVBMSUFOQ0U9dHJ1ZTwvY29kZT4KKyAgICAgICAgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIHRoaXMgdGVzdC4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM2Mjc0PC9idWc+OiBXaGVuIGluY2x1ZGluZyBzdGF0aWMgY29udGVudCB3aXRoIHRoZQorICAgICAgICBEZWZhdWx0U2VydmxldCBhbHNvIHRyZWF0IGNvbnRlbnQgdHlwZXMgZW5kaW5nIGluIHhtbCBhcyB0ZXh0LgorICAgICAgICAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzY5NzY8L2J1Zz46IERvbid0IHVzZSBDQVRBTElOQV9PUFRTIHdoZW4gc3RvcHBpbmcgVG9tY2F0LiBUaGlzCisgICAgICAgIGFsbG93cyBvcHRpb25zIGZvciBzdGFydGluZyBhbmQgc3RvcHBpbmcgdG8gYmUgc2V0IG9uIEpBVkFfT1BUUyBhbmQKKyAgICAgICAgb3B0aW9ucyBmb3Igc3RhcnRpbmcgb25seSB0byBiZSBzZXQgb24gQ0FUQUxJTkFfT1BUUy4gV2l0aG91dCB0aGlzCisgICAgICAgIGZpeCwgc29tZSBzdGFydHVwIG9wdGlvbnMgKGVnIHRoZSBwb3J0IGZvciByZW1vdGUgSk1YKSB3b3VsZCBjYXVzZQorICAgICAgICBzdG9wIHRvIGZhaWwuIEJhc2VkIG9uIGEgZml4IHN1Z2dlc3RlZCBieSBNaWNoYWVsIFZvcmJ1cmdlci4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM3MDcwPC9idWc+OiBVcGRhdGUgbWJlYW4gbmFtZSBkb2N1bWVudGF0aW9uIHRvIGluY2x1ZGUgdGhlCisgICAgICAgIFN0YW5kYXJkV3JhcHBlci4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM3MzU2PC9idWc+OiBFbnN1cmUgc2Vzc2lvbnMgdGltZSBvdXQgY29ycmVjdGx5LiBUaGlzIGhhcyBiZWVuCisgICAgICAgIGZpeGVkIGJ5IHJlbW92aW5nIHRoZSBhY2Nlc3NDb3VudCBmZWF0dXJlIGJ5IGRlZmF1bHQuIFRoaXMgZmVhdHVyZQorICAgICAgICBwcmV2ZW50cyB0aGUgc2Vzc2lvbiBmcm9tIHRpbWluZyBvdXQgd2hpbHN0IHJlcXVlc3RzIHRoYXQgbGFzdAorICAgICAgICBsb25nZXIgdGhhbiB0aGUgc2Vzc2lvbiB0aW1lIG91dCBhcmUgYmVpbmcgcHJvY2Vzc2VkLiBUaGlzIGZlYXR1cmUKKyAgICAgICAgaXMgZW5hYmxlZCBieSBzZXR0aW5nIHRoZSBKYXZhIG9wdGlvbiAKKyAgICAgICAgPGNvZGU+LURvcmcuYXBhY2hlLmNhdGFsaW5hLlNUUklDVF9TRVJWTEVUX0NPTVBMSUFOQ0U9dHJ1ZTwvY29kZT4KKyAgICAgICAgVGhlIGZlYXR1cmUgaXMgbm93IGltcGxlbWVudGVkIHdpdGggc3luY2hyb25pemF0aW9uIHdoaWNoIGFkZHJlc3NlcworICAgICAgICB0aGUgdGhyZWFkIHNhZmV0eSBpc3N1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hbCBidWcgcmVwb3J0LgorICAgICAgICAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzc0Mzk8L2J1Zz46IFVwZGF0ZSBkb2N1bWVudGF0aW9uIGZvciBFbmdpbmUgY29tcG9uZW50IHRvIGFkZAorICAgICAgICB0aGUgcmVxdWlyZW1lbnQgdGhhdCB0aGUgbmFtZSBtdXN0IGJlIHVuaXF1ZS4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM3NDU4PC9idWc+OiBBZGQgc3luY3MgdG8gdGhlIFdlYmFwcENsYXNzbG9hZGVyIHRvIGFkZHJlc3MKKyAgICAgICAgcmFyZSBpc3N1ZXMgd2hlbiBtdWx0aXBsZSB0aHJlYWRzIGF0dGVtcHQgdG8gbG9hZCB0aGUgc2FtZSBjbGFzcworICAgICAgICBjb25jdXJyZW50bHkuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNzUwOTwvYnVnPjogRG8gbm90IHJlbW92ZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiB2YWx1ZXMKKyAgICAgICAgZGVmaW5lZCBpbiBsb2dnaW5nLnByb3BlcnRpZXMgZmlsZXMuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zODE5ODwvYnVnPjogQWRkIHJlZmVyZW5jZSB0byBDb250ZXh0IGRvY3VtZW50YXRpb24gZnJvbSBIb3N0CisgICAgICAgIGRvY3VtZW50YXRpb24gdGhhdCBleHBsYWlucyBob3cgQ29udGV4dCBuYW1lIGlzIG9idGFpbmVkIGZyb20gdGhlCisgICAgICAgIENvbnRleHQgZmlsZW5hbWUuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zOTA4ODwvYnVnPjogUHJldmVudCBpbmZpbnRlIGxvb3BzIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93bgorICAgICAgICB0aGF0IHJldHVybnMgaXRzZWxmIGZvciBnZXRSb290Q2F1c2UoKS4gQmFzZWQgb24gYSBwYXRjaCBieSBXb3V0ZXIKKyAgICAgICAgWmVsbGUuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zOTQzNjwvYnVnPjogQ29ycmVjdCBNSU1FIHR5cGUgZm9yIFNWRy4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM5NjI3PC9idWc+OiBKVUxJIG5vIGxvbmdlciBpZ25vcmVzIGEgIi5sZXZlbD1YWFgiIGRpcmVjdGl2ZQorICAgICAgICBpbiBsb2dnaW5nLnByb3BlcnRpZXMuIFBhdGNoIHByb3ZpZGVkIGJ5IFJvZ2VyIEtlYXlzIGFuZCBSaWNoYXJkCisgICAgICAgIEZlYXJuLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzk3MjQ8L2J1Zz46IFJlbW92aW5nIHRoZSBsYXN0IHZhbHZlIGZyb20gYSBwaXBlbGluZSBkaWQgbm90CisgICAgICAgIHJldHVybiB0aGUgcGlwZWxpbmUgdG8gdGhlIG9yaWdpbmFsIHN0YXRlLiBQYXRjaCBwcm92aWRlZCBieQorICAgICAgICBEYXZpZCBHYWdvbi4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQwMzY3PC9idWc+OiBVcGRhdGUgSksgYXV0byBjb25maWd1cmF0aW9uIGRvY3VtZW50YXRpb24gdG8gY2xhcmlmeQorICAgICAgICB0aGF0IHdvcmtlcnMucHJvcGVydGllcyBtdXN0IGFsc28gZXhpc3QuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MDUyNDwvYnVnPjogSHR0cFNlcnZsZXRSZXF1ZXN0LmdldEF1dGhUeXBlKCkgbm93IHJldHVybnMKKyAgICAgICAgQ0xJRU5UX0NFUlQgcmF0aGVyIHRoYW4gQ0xJRU5ULUNFUlQgZm9yIGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uCisgICAgICAgIGFzIHBlciB0aGUgc3BlYy4gTm90ZSB0aGF0IHdlYi54bWwgY29udGludWVzIHRvIHVzZSBDTElFTlQtQ0VSVCB0bworICAgICAgICBzcGVjaWZ5IHRoZSBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbiBzaG91bGQgYmUgdXNlZC4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQwNTI2PC9idWc+OiBBZGQgc3VwcG9ydCBmb3IgSlBEQV9PUFRTIHRvIGNhdGFsaW5hLmJhdCBhbmQgYWRkIGEKKyAgICAgICAgSlBEQV9TVVNQRU5EIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGJvdGggc3RhcnR1cCBzY3JpcHRzLiBQYXRjaAorICAgICAgICBwcm92aWRlZCBieSBLdXJ0IFJveS4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQwNTI4PC9idWc+OiBBZGQgbWlzc2luZyBtZXNzYWdlIGxvY2FsaXNhdGlvbnMgYXMgcHJvdmlkZWQgYnkKKyAgICAgICAgQmVuIENsaWZmb3JkLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDA1ODU8L2J1Zz46IEZpeCBwYXJhbWV0ZXJpc2VkIGNvbnN0cnVjdG9yIGZvciBvLmEuanVsaS5GaWxlSGFuZGxlcgorICAgICAgICBzbyBwYXJhbWV0ZXJzIGhhdmUgYW4gZWZmZWN0LiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDA2MjU8L2J1Zz46IFN0b3AgQ0dJU2VydmxldCBzd2FsbG93aW5nIHRoZSByb290IGNhdXNlIG9mIGFuCisgICAgICAgIGV4Y2VwdGlvbi4gUGF0Y2ggcHJvdmlkZWQgYnkgVGFrYXlvc2hpIEtpbXVyYS4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQwNzIzPC9idWc+OiBDb3JyZWN0IHRhYmxlIGNyZWF0aW9uIGV4YW1wbGUgaW4gSmF2YURvYyBmb3IKKyAgICAgICAgSkRCQ0FjY2Vzc0xvZ1ZhbHZlLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDA4MDI8L2J1Zz46IEFkZCBqc3AtYXBpLmphciB0byBmaWxlc2V0IGluIGNhdGFsaW5hLXRhc2tzLnhtbCBhcyBwcm92aWRlZCBieQorICAgICAgICBEYW5pZWwgU2FudG9zLiAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MDgxNzwvYnVnPjogQ29ycmVjdCBwcm9ibGVtIHdoZXJlIENHSSBzY3JpcHRzIGluIHRoZSByb290IG9mIHRoZQorICAgICAgICBST09UIGNvbnRleHQgdGhyZXcgYSA8Y29kZT5TdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgICAgKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBTZXQgdGhlIDxjb2RlPlNDUklQVF9GSUxFTkFNRTwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgcmVxdWlyZWQKKyAgICAgICAgYnkgUEhQIHdoZW4gdXNpbmcgdGhlIENHSVNlcnZsZXQgdG8gZXhlY3V0ZSBQSFAuIChtYXJrdCkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MDgyMzwvYnVnPjogVXBkYXRlIGNvbnRleHQgZG9jIHRvIGNsYXJpZnkgdXNlIG9mIFJPT1QueG1sLAorICAgICAgICBtdWx0aS1sZXZlbCBjb250ZXh0IHBhdGhzIGFuZCB0byBmdXJ0aGVyIGRpc2NvdXJhZ2UgdXNlIG9mIHNlcnZlci54bWwKKyAgICAgICAgKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQwODQ0PC9idWc+OiBBZGQgYWRkaXRpb25hbCBzeW5jcyB0byBKREJDUmVhbG0gdG8gcmVzb2x2ZSBOUEUgd2hlbgorICAgICAgICB0d28gdXNlcnMgdHJ5IHRvIGF1dGhlbnRpY2F0ZSB1c2luZyBESUdFU1QgYXV0aGVudGljYXRpb24gYXQgdGhlIHNhbWUKKyAgICAgICAgdGltZS4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQwODYwPC9idWc+OiBMb2cgZXhjZXB0aW9ucyBhbmQgb3RoZXIgcHJvYmxlbXMgZHVyaW5nIHBhcmFtZXRlcgorICAgICAgICBwcm9jZXNzaW5nLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDA5MDE8L2J1Zz46IEVuY29kZSBkaXJlY3RvcnkgbGlzdGluZyBvdXRwdXQuIEJhc2VkIG9uIGEgcGF0Y2gKKyAgICAgICAgcHJvdmlkZWQgYnkgQ2hyaXMgSGFsc3RlYWQuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MDkyOTwvYnVnPjogQ29ycmVjdCBKYXZhRG9jIGZvciBTdGFuZGFyZENhbHNzTG9hZGVyLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDEwMDg8L2J1Zz46IEFsbG93IFBPU1QgdG8gYmUgdXNlZCBmb3IgaW5kZXhlZCBxdWVyaWVzIHdpdGggQ0dJCisgICAgICAgIFNlcnZsZXQuIFBhdGNoIHByb3ZpZGVkIGJ5IENocmlzIEhhbHN0ZWFkLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDEwMjA8L2J1Zz46IEltcHJvdmUgZXJyb3IgbWVzc2FnZSB3aGVuIGN1c3RvbSBlcnJvciByZXBvcnQgVmFsdmUKKyAgICAgICAgZmFpbHMgdG8gbG9hZC4gQWxzbyByZW1vdmUgcmVxdWlyZW1lbnQgdGhhdCBjdXN0b20gZXJyb3IgcmVwb3J0IFZhbHZlcworICAgICAgICBleHRlbmQgVmFsdmVCYXNlLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDEyMTc8L2J1Zz46IFNldCBzZWN1cmUgYXR0cmlidXRlIG9uIFNTTyBjb29raWUgd2hlbiBjb29raWUgaXMKKyAgICAgICAgY3JlYXRlZCBkdXJpbmcgYSBzZWN1cmUgcmVxdWVzdC4gUGF0Y2ggcHJvdmlkZWQgYnkgQ2hyaXMgSGFsc3RlYWQuCisgICAgICAgIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgRW5zdXJlIEFjY2VwdC1MYW5ndWFnZSBoZWFkZXJzIGNvbmZvcm0gdG8gUkZDIDI2MTYuIElnbm9yZSB0aGVtIGlmCisgICAgICAgIHRoZXkgZG8gbm90LiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIE1ha2UgcHJvdmlkZWQgaW5zdGFuY2VzIG9mIFJlcXVlc3REaXNwYXRjaGVyIHRocmVhZCBzYWZlLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBmb3JtYXR0aW5nIG9mIENHSSB2YXJpYWJsZSBTQ1JJUFRfTkFNRS4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM0NjQzPC9idWc+OiBJbXByb3ZlZCBkb2N1bWVudGF0aW9uIGZvciBwZXItdXNlciAvIHBlci1zZXNzaW9uIGNsaWVudEF1dGgKKyAgICAgICAgdXNhZ2UgaW4gU1NMIEF1dGhlbnRpY2F0b3IuICBEb2NzIHByb3ZpZGVkIGJ5IGphY2sgYW5kIFJhbGYgSGF1c2VyLiAgKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQwNjY4PC9idWc+OiBVcGRhdGUgcmVsZWFzZSBub3RlcyBhbmQgcmVhZG1lIGZpbGVzIHNwZWNpZmljIHRvIHY1LjUuMjAgdG8gCisgICAgICAgIG5vdGlmeSB1c2VycyBvZiBtaXNzaW5nIE1haWxTZXNzaW9uRmFjdG9yeSBpbiBkaXN0cmlidXRpb24sIHN1Z2dlc3Qgd29ya2Fyb3VuZHMsCisgICAgICAgIGFuZCBsaW5rIHRvIHJlbGV2YW50IEJ1Z3ppbGxhIGlzc3VlLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzc5Nzc8L2J1Zz46IGFkYXB0IEJVSUxESU5HLnR4dCBhbmQgbmV0IGJ1aWxkLnhtbCBmb3IgU1ZOLiAgUGF0Y2ggYnkKKyAgICAgICAgQ2hyaXN0b3BoZXIgU2FobndhbGR0LiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIDxidWc+MzkwNTU8L2J1Zz46IExpbmsgdG8gc2FtcGxlIHdvcmthcm91bmQgY29kZSBmb3IgdXNpbmcgSlNSMTYwIEpNWCBtb25pdG9yaW5nCisgICAgICAgIHdpdGggYSBsb2NhbCBmaXJld2FsbC4gIFRoYW5rcyB0byBHZW9yZ2UgTGluZGhvbG0gZm9yIHRoZSBwYXRjaC4gKHlvYXZzKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICA8YnVnPjM5NDc2PC9idWc+OiBhZGQgeG1sIGRlY2xhcmF0aW9uIHRvIG1vc3QgYnVpbGQueG1sIGZpbGVzLCBhcyBzdWdnZXN0ZWQgYnkKKyAgICAgICAgR3JlZ29yeSBTLiBIb2VybmVyIFNyLiAoeW9hdnMpCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDAzMjY8L2J1Zz46IHN0b3AgdXNpbmcgRmlsZSNkZWxldGVPbkV4aXQgaW4gRGVmYXVsdFNlcnZsZXQgdG8gYXZvaWQKKyAgICAgICAgSlZNIG1lbW9yeSBsZWFrLCBhcyBzdWdnZXN0ZWQgYnkgcXVhcnR6LiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDAxOTI8L2J1Zz46IHVwZGF0ZSBzZXR1cC5odG1sIG5vdGVzIHJlZ2FyZGluZyBXaW5kb3dzIHRyYXkgaWNvbi4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQwMTc3PC9idWc+OiBhZGQgbW9yZSB3YXJuaW5ncyB0byBkb2N1bWVudGF0aW9uIGFib3V0IFJlcXVlc3REdW1wZXJWYWx2ZQorICAgICAgICBjaGFyYWN0ZXIgZW5jb2RpbmcuICAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzkyNTU8L2J1Zz46IE5QRSBpbiBBdXRoZW50aWNhdG9yQmFzZSB3aGVuIGxvZ2dpbmcgbGV2ZWwgaXMgc2V0IHRvIERFQlVHCisgICAgICAgIGFuZCBubyBwcmluaWNwYWwgZm91bmQuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MTQzNzwvYnVnPjogTWFrZSBsb2cgbWVzc2FnZXMgYW5kIGxvZ2xldmVsIGNvbnNpc3RlbnQgZHVyaW5nIENvbnRleHQKKyAgICAgICAgc3RhcnQuIFBhdGNoIHByb3ZpZGVkIGJ5IFN1enVraSBZdWljaGlyby4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4gCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNveW90ZSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzgzMzI8L2J1Zz46IEFkZCBiYWNrbG9nIGF0dHJpYnV0ZSB0byBDaGFubmVsU29ja2V0IGFzIHByb3ZpZGVkIGJ5CisgICAgICAgICBUYWtheW9zaGkgS2ltdXJhLiAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgQmFja3BvcnQgcGFja2V0U2l6ZSBmZWF0dXJlIGZyb20gVG9tY2F0IDYuMC54IGF0IHN0YW5kYXJkIGNveW90ZSBBSlAgSmsgaGFuZGxlci4gKHBlcm8pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDA3NzE8L2J1Zz46IEZpeCBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgICBTYXZlZFJlcXVlc3RJbnB1dEZpbHRlci5kb1JlYWQoKSBzbyBQT1NUIGRhdGEgbWF5IGJlIHJlYWQgdXNpbmcgYQorICAgICAgICBWYWx2ZSBvciBGaWx0ZXIuIFBhdGNoIHByb3ZpZGVkIGJ5IE1pY2hhZWwgRHVmZWwuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MTAxNzwvYnVnPjogUmVzdG9yZSBiZWhhdmlvdXIgb2YgTWVzc2FnZUJ5dGVzLnNldFN0cmluZyhudWxsKS4KKyAgICAgICAgKHJlbW0vbWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDEwNTc8L2J1Zz46IE1vZGlmeSBTdHJpbmdDYWNoZSB0byBhZGQgYSBjb25maWd1cmFibGUgdXBwZXIgYm91bmQKKyAgICAgICAgdG8gdGhlIGxlbmd0aCBvZiBjYWNoZWQgc3RyaW5ncy4gKHJlbW0vbWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzg3NzQ8L2J1Zz46IENoZWNrIGphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZCBzeXN0ZW0gcHJvcGVydHkgYXMgYSBzZWNvbmRhcnkKKyAgICAgICAgc291cmNlIGZvciBrZXlzdG9yZSBwYXNzd29yZCBpbiBKU1NFU29ja2V0RmFjdG9yeSwgYXMgc3VnZ2VzdGVkIGJ5IFRlZCBYLiBUb3RoLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzk0MDI8L2J1Zz46IE1vZGlmeSBleGlzdGluZyBWYXJ5IEhUVFAgaGVhZGVyLCByYXRoZXIgdGhhbiBvdmVyd3JpdGUgaXQsIGlmIGl0CisgICAgICAgIGV4aXN0cyB3aGVuIHVzaW5nIEdaaXAgY29tcHJlc3Npb24uICBQYXRjaCBieSBNYXR0aGV3IENvb2tlLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDAyNDE8L2J1Zz46IENhdGNoIEV4Y2VwdGlvbnMgaW5zdGVhZCBvZiBUaHJvd2FibGVzIGluIERlZmF1bHQgYW5kIFNTSSBzZXJ2bGV0cy4KKyAgICAgICAgQWxzbyBpbXByb3ZlIHJlbGV2YW50IGxvZ2dpbmcgd2hpbGUgd2UncmUgYXQgaXQuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MDEzMzwvYnVnPjogQmV0dGVyIGVycm9yIG1lc3NhZ2Ugd2hlbiBjb250ZXh0IG5hbWUgaXMgbm90IGF2YWlsYWJsZSBvbiBzdGFydHVwLAorICAgICAgICBhcyBzdWdnZXN0ZWQgYnkgQW5kcmVhcyBQbGVzbmVyIEphY29ic2VuLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPiAKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSmFzcGVyIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zOTk3NTwvYnVnPjogZG9uJ3QgaGF2ZSBzdGF0aWMgTG9nIHJlZmVyZW5jZXMgdG8gcHJldmVudAorICAgICAgICBjbGFzc2xvYWRlciBsZWFrcy4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQwMTA0PC9idWc+OiBXaGVuIGRpc3BsYXlpbmcgSlNQIHNvdXJjZSBhZnRlciBhbiBleGNlcHRpb24sIGhhbmRsZQorICAgICAgICBpbmNsdWRlZCBmaWxlcy4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQwNzk3PC9idWc+OiBUaGlzIHdhcyBhIHJlZ3Jlc3Npb24gYXMgYSByZXN1bHQgb2YgdGhlIGZpeCBmb3IKKyAgICAgICAgPGJ1Zz4zMzQwNzwvYnVnPi4gVExEIHZhbGlkYXRpb24gd2FzIGZhaWxpbmcgYXMgYSByZXN1bHQgb2YgdGhlIHVzZQorICAgICAgICBvZiB0aGUgZXNjYXBlIGNoYXJhY3RlciAoMHgxYikgYXMgYSB0ZW1wb3JhcnkgcmVwbGFjZW1lbnQgZm9yIFwkLgorICAgICAgICBBbiBhbHRlcm5hdGl2ZSBjaGFyYWN0ZXIgKDB4ZTAwMCkgZnJvbSB0aGUgdW5pY29kZSBwcml2YXRlIHVzZSByYW5nZQorICAgICAgICBpcyBub3cgdXNlZC4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQxMDU3PC9idWc+OiBNYWtlIGpzcDpwbHVnaW4gb3V0cHV0IFhIVE1MIGNvbXBsaWFudC4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQxMzI3PC9idWc+OiBTaG93IGZ1bGwgVVJJIGZvciBhIDQwNC4gUGF0Y2ggcHJvdmlkZWQgYnkgVmlqYXkuCisgICAgICAgIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MTI2NTwvYnVnPjogQWxsb3cgSnNwU2VydmxldCBjaGVja0ludGVydmFsIGluaXQgcGFyYW1ldGVyIHRvIGJlCisgICAgICAgIGV4cGxpY2l0bHkgc2V0IHRvIHRoZSBzdGF0ZWQgZGVmYXVsdCB2YWx1ZSBvZiB6ZXJvIGJ5IHJlbW92aW5nIHRoZQorICAgICAgICBjb2RlIHRoYXQgcmVzZXRzIGl0IHRvIDMwMCBpZiBleHBsaWNpdGx5IHNwZWNpZmllZCBhcyB6ZXJvLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIERpc3BsYXkgdGhlIEpTUCBzb3VyY2Ugd2hlbiBhIGNvbXBpbGF0aW9uIGVycm9yIG9jY3VycyBhbmQgZGlzcGxheQorICAgICAgICB0aGUgY29ycmVjdCBsaW5lIG51bWJlciByYXRoZXIgdGhhbiBzdGFydCBvZiBhIHNjcmlwdGxldCBibG9jay4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4gCisgIDxzdWJzZWN0aW9uIG5hbWU9IldlYmFwcHMiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM0OTUyPC9idWc+OiBDbGFyaWZ5IHRoYXQgdGhlIFdpbmRvd3MgSW5zdGFsbGVyIGFsd2F5cyBpbnN0YWxscworICAgICAgICBhIFdpbmRvd3Mgc2VydmljZS4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM1OTY4PC9idWc+OiBNYWtlIGVudmlyb25tZW50IGVudHJ5IHByb3BlcnRpZXMgaW5wdXQgYSB0ZXh0IGFyZWEuCisgICAgICAgIFBhdGNoIHByb3ZpZGVkIGJ5IFRyaXN0YW4gTWFybHkuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNzU4ODwvYnVnPjogRml4IGNyZWF0aW9uIG9mIEpOREkgUmVhbG0gaW4gYWRtaW4gYXBwbGljYXRpb24uIFBhdGNoCisgICAgICAgIHByb3ZpZGVkIGJ5IFRlcnJ5IFpob3UuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zODA0ODwvYnVnPjogRml4IG1lbW9yeSBsZWFrIGFzc29hY2lhdGVkIHdpdGggdXNlIG9mIGV4cHJlc3Npb24KKyAgICAgICAgbGFuZ3VhZ2UgaW4gSlNQcy4gUGF0Y2ggcHJvdmlkZWQgYnkgVGFyYXMgVGllbGtlcy4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM5NTcyPC9idWc+OiBJbXByb3ZlbWVudHMgdG8gQ29tcHJlc3Npb25GaWx0ZXIgZXhhbXBsZSBwcm92aWRlZCBieQorICAgICAgICBFcmljIEhlZHN0cvZtLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIDxidWc+NDA1MDc8L2J1Zz46IFVwZGF0ZSBob3N0LW1hbmFnZXIgYW5kIHNlcnZsZXQtZXhhbXBsZXMgd2ViLWFwcHMgdG8KKyAgICAgICAgdXNlIHRoZSBzZXJ2bGV0IDIuNCB4c2QuIFBhdGNoIHByb3ZpZGVkIGJ5IENocmlzIEhhbHN0ZWFkLiAobWFya3QpCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDA1ODE8L2J1Zz46IEFkZCBpbmZvcm1hdGlvbiBvbiB0aGUgdXNlIG9mIGEgc3ltYmxvaWMgbGluayBhcyB0aGUKKyAgICAgICAgZG9jQmFzZSBmb3IgYSBDb250ZXh0IHRvIHRoZSBDb250ZXh0IGRvY3VtZW50YXRpb24uIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MDYzMzwvYnVnPjogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGhlIERlZmF1bHRDb250ZXh0IGZyb20gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24uIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MDY3NzwvYnVnPjogVXBkYXRlIFNTTCBkb2N1bWVudGF0aW9uIHRvIGluZGljYXRlIHRoYXQgUEtDUzExCisgICAgICAgIGtleXN0b3JlcyBtYXkgYmUgdXNlZC4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQwNzE0PC9idWc+OiBBZG1pbiB3ZWJhcHAgbm8gbG9uZ2VyIHJlcXVpcmVzIGEgdXNlcm5hbWUgZm9yIGEKKyAgICAgICAgRGF0YVNvdXJjZSBzaW5jZSBpdCBpcyBub3QgcmVxdWlyZWQgaW4gYWxsIGNhc2VzLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDA3MjA8L2J1Zz46IEZpeCBleGNlcHRpb24gaW4gYWRtaW4gd2ViYXBwIHdoZW4gYWRkaW5nIGEgZ3JvdXAgdG8KKyAgICAgICAgYSB1c2VyLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDA4NzQ8L2J1Zz46IENvcnJlY3QgbG9nNGogY29uZmlndXJhdGlvbiBpbiBkb2N1bWVudGF0aW9uIHdlYmFwcC4KKyAgICAgICAgUGF0Y2ggcHJvdmlkZWQgYnkgRnJhbmNrIEJvcmVsLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDA5OTk8L2J1Zz46IEFkZCB0cnVzdCBzdG9yZSBjb25maWd1cmF0aW9uIGZvciBTU0wgY29ubmVjdG9ycyB0bworICAgICAgICB0aGUgYWRtaW4gd2ViYXBwLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDEwNTE8L2J1Zz46IEFkZCBpbmZvcm1hdGlvbiBvbiBrZXlzdG9yZSBhbGlhc2VzIGFuZCBjYXNlCisgICAgICAgIHNlbnNpdGl2aXR5IHRvIFNTTCBIT1ctVE8uIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MTE4MjwvYnVnPjogVXBkYXRlIHRoZSBKYXNwZXIgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGNsYXNzcGF0aAorICAgICAgICBhdHRyaWJ1dGUuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MTQ5MzwvYnVnPjogRml4IGhhbmRsaW5nIG9mIEFQUiBjb25uZWN0b3JzIGluIEFkbWluIHdlYmFwcC4KKyAgICAgICAgKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQxNTEyPC9idWc+OiBWZXJzaW9uIG51bWJlciB3YXMgbm90IGluc2VydGVkIGluIHJlbGVhc2Ugbm90ZXMuCisgICAgICAgIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz40MDI1NzwvYnVnPjogVXBkYXRlIE1hbmFnZXIgd2ViYXBwIGhvd3RvIG9uIHJlbW90ZSBkZXBsb3ltZW50IHRvIHJlZmxlY3QKKyAgICAgICAgbmVlZCBmb3IgZXhwbGljaXQgcGF0aCBpbiBvbmUgc3BlY2lmaWMgdXNlLWNhc2UuICBUaGFua3MgdG8gVmVua2F0ZXNoIEpheWFyYW1hbi4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICA8YnVnPjQwMTYwPC9idWc+OiBhZGQgcmVmZXJlbmNlIHRvIHRoZSBGaWx0ZXIgcHJvcG9zZWQgaW4gdGhpcyBCdWd6aWxsYSBpdGVtIHRvIHRoZSBXZWJkYXZTZXJ2bGV0LgorICAgICAgICBXaGlsZSBhdCBpdCwgZ2l2ZSB0aGUgV2ViZGF2U2VydmxldCBzb21lIGxvbmctb3ZlcmR1ZSBUTEMgYnkgY2xlYW5pbmcgdXAgc29tZSBvZiB0aGUgb2xkIGRhdGEKKyAgICAgICAgc3RydWN0dXJlcyBpbiBmYXZvciBvZiBtb2Rlcm4gKGJ1dCBzdGlsbCBKREsgMS40LWNvbXBsaWFudCkgaW50ZXJmYWNlcy4gKHlvYXZzKQorICAgICAgPC91cGRhdGU+CisgICAgICA8ZG9jcz4KKyAgICAgICAgQWRkIGEgdmlydHVhbCBob3N0aW5nIGhvdy10byBjb250cmlidXRlZCBieSBIYXNzYW4gU2Nocm9lZGVyLiAobWFya3QpCisgICAgICA8L2RvY3M+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4gCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNsdXN0ZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8YWRkPgorICAgICAgICBBZGQgY2x1c3RlcmVkIFNTTyBjb2RlIGFuZCBiYWNrcG9ydCBmZWF0dXJlIGZyb20gVG9tY2F0IDYuMC54LAorICAgICAgICBzdWJtaXR0ZWQgYnkgRmFiaWVuIENhcnJpb24gKHBlcm8pCisgICAgICA8L2FkZD4gICAgCisgICAgICA8YWRkPgorICAgICAgICBBZGQgYmV0dGVyIHJlY292ZXJ5IGF0IEZhc3RBc3luY1F1ZXVlU2VuZGVyLiBNYWRlIHRoZSBzdGFydGVneSBtb3JlIHJvYnVzdCBmb3IgdGVtcG9yYXJ5IGNvbm5lY3Rpb24gcHJvYmxlbXMgKHBlcm8pCisgICAgICA8L2FkZD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPiAgIAorPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlRvbWNhdCA1LjUuMjAgKGZoYW5paykiPgorICA8c3Vic2VjdGlvbiBuYW1lPSJDYXRhbGluYSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBsb2dpYyBlcnJvciBpbiBVc2VyRGF0YmFzZVJlYWxtLmdldHByaW5jaXBhbCgpIHRoYXQgY2F1c2VkIHVzZXIKKyAgICAgICAgcm9sZXMgYXNzaWduZWQgdmlhIGdyb3VwcyB0byBiZSBpZ25vcmVkLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDA1MTg8L2J1Zz46IFVzZSBjb3JyZWN0IG1lc3NhZ2Ugd2hlbiBhIFJ1bnRpbWVFeGNlcHRpb24gaXMKKyAgICAgICAgdGhyb3duIGZyb20gdGhlIHJlcXVlc3RJbml0aWFsaXplZCBvciByZXF1ZXN0RGVzdHJveWVkIG1ldGhvZCBvZgorICAgICAgICBhIGxpc3RlbmVyIHRoYXQgaW1wbGVtZW50cyBTZXJ2bGV0UmVxdWVzdExpc3RlbmVyLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPiAKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSmFzcGVyIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMTgwNDwvYnVnPjogVW5uZXN0ZWQgdGFncyB3aXRoaW4gYSB0YWcgZmlsZSBhcmUgbm93IGNvbmZpZ3VyZWQKKyAgICAgICAgd2l0aCB0aGUgVGFnIHJlcHJlc2VudGVkIGJ5IHRoZSBjb250YWluaW5nIHRhZyBmaWxlIGFzIHRoZWlyIHBhcmVudAorICAgICAgICB0YWcuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMzM1NjwvYnVnPjogVGFnIGF0dHJpYnV0ZXMgdGhhdCBjb250YWluZWQgJCBmb2xsb3dlZCBieSAxIG9yCisgICAgICAgIG1vcmUgbm9uLXNwZWNpYWwgY2hhcmFjdGVycyBhbmQgdGhlbiBhIHsgY2hhcmFjdGVyIGNhdXNlZCBhbgorICAgICAgICBleGNlcHRpb24uIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMzQwNzwvYnVnPjogVGhlIHN0cmluZyBcJCBpbiB0ZW1wbGF0ZSB0ZXh0IHdhcyByZWR1Y2VkIHRvICQKKyAgICAgICAgd2hlbiB0aGUgaXNFTElnbm9yZWQgcGFnZSBkaXJlY3RpdmUgd2FzIHNldCB0byB0cnVlLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzQ1MDk8L2J1Zz46IFRhZyBuYW1lcyBtYXkgbm93IHVzZSB0aGUgZnVsbCByYW5nZSBvZgorICAgICAgICBjaGFyYWN0ZXJzIHBlcm1pdHRlZCBieSB4c2Q6bm10b2tlbi4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4gICAKKyAgPHN1YnNlY3Rpb24gbmFtZT0iV2ViYXBwcyI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzQzOTk8L2J1Zz46IERpc2FibGUgdW5kZXBsb3kgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGhhdmUgbm90CisgICAgICAgIGJlZW4gZGVwbG95ZWQgc3VjaCBhcyB0aG9zZSBkZWZpbmVkIGluIHNlcnZlci54bWwgKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4gCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iVG9tY2F0IDUuNS4xOSAoZmhhbmlrKSI+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkdlbmVyYWwiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8dXBkYXRlPgorICAgICAgICAgQWRkIG11bHRpIGF0dHJpYnV0ZSBzZXR0aW5nIHRvIGpteDpzZXQgSk1YIHJlbW90ZSBhbnQgdGFzay4KKyAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERpZGllciBEb25zZXogKHBlcm8pCisgICAgICA8L3VwZGF0ZT4gICAgICAKKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICA8c3Vic2VjdGlvbiBuYW1lPSJDYXRhbGluYSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzA3NjI8L2J1Zz46IFJlLWZpeCB0aGlzIGJ1ZyB0aGF0IHdhcyByZS1pbnRyb2R1Y2VkIGJ5IHRoZSBmaXgKKyAgICAgICAgdG8gPGJ1Zz4zNzI2NDwvYnVnPi4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM3NTg4PC9idWc+OiBGaXggSk5ESSByZWFsbSBjcmVhdGlvbiB0aHJvdWdoIEpNWC4gUGF0Y2ggY29udHJpYnV0ZWQgYnkgVGVycnlaaG91ICAoZmhhbmlrKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM5NzA0PC9idWc+OiBUaGUgdXNlIG9mIGN1c3RvbSBjbGFzc2xvYWRlcnMgZmFpbGVkIHdoZW4gdGhlIGNvbnRleHQKKyAgICAgICAgd2FzIHNwZWNpZmllZCBpbiBzZXJ2ZXIueG1sLiBDb3JyZWN0aW9uIG9mIHRoZSBmYXVsdCB3aWxsIHJlcXVpcmUgc2V0dGluZworICAgICAgICB0aGUgbmV3IGxvYWRlciBhdHRyaWJ1dGUgdXNlU3lzdGVtQ2xhc3NMb2FkZXJBc1BhcmVudCB0byBmYWxzZS4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4gCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNveW90ZSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+NDA0MTg8L2J1Zz46IEFQUiBFbmRwb2ludCBzb2NrZXQgZXZhbHVhdGlvbiAocmVtbSkKKyAgICAgIDwvZml4PgorICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPiAKKyAgPHN1YnNlY3Rpb24gbmFtZT0iV2ViYXBwcyI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzEzMzk8L2J1Zz46IEFkbWluIGFwcCB0aHJldyBleGNlcHRpb25zIGlmIGEgbmFtZSBvdGhlciB0aGFuIENhdGFsaW5hCisgICAgICAgIHdhcyBjb25maWd1cmVkIGZvciB0aGUgRW5naW5lLiBQYXRjaCBiYXNlZCBvbiBhIHN1Z2dlc3Rpb24gZnJvbSBBbWlsYQorICAgICAgICBTdXJpYXJhY2hjaGkuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+IAorPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlRvbWNhdCA1LjUuMTggKHlvYXZzKSI+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkdlbmVyYWwiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8dXBkYXRlPgorICAgICAgICBDaGFuZ2UgTUQ1IHJlbGVhc2Ugc2lnbmF0dXJlIGZpbGVzIHRvIGhhdmUgbWQ1IChsb3dlcmNhc2UpIGV4dGVuc2lvbiBpbnN0ZWFkIG9mIE1ENSAodXBwZXJjYXNlKSwKKyAgICAgICAgYXMgc3VnZ2VzdGVkIGJ5IEhlbmsgUGVubmluZyBhbmQgc3BlY2lmaWVkIGluIHRoZQorICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2UtcHVibGlzaGluZy5odG1sIj5BU0YgcmVsZWFzZSBwdWJsaXNoaW5nIGd1aWRlbGluZXM8L2E+LiAoeW9hdnMpCisgICAgICA8L3VwZGF0ZT4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICA8c3Vic2VjdGlvbiBuYW1lPSJDYXRhbGluYSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCB0aGF0IE1hbmFnZXJCYXNlIGluY3JlbWVudCBleHBpcmVTZXNzaW9ucyBjb3VudGVyIGF0IGJhY2tncm91bmQgdGFzayB0d28gdGltZXMuIChwZXJvKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM5NDA2PC9idWc+OiBGaXggdGhhdCBTdGFuZGFyZFNlc3Npb24jZ2V0TGFzdEFjY2Vzc2VkVGltZSgpIHVzZXMgY29ycmVjdCBleGNlcHRpb24gbWVzc2FnZSwKKyAgICAgICAgc3VnZ2VzdGVkIGJ5IFRha2F5b3NoaSBLaW11cmEuIChwZXJvKQorICAgICAgPC9maXg+CisgICAgICA8YWRkPgorICAgICAgICA8YnVnPjM5NjYxPC9idWc+OiBBZGQgZG9jdW1lbnRhdGlvbiBvbiBKVUxJIEZpbGVIYW5kbGVyIHByb3BlcnRpZXMuICh5b2F2cykKKyAgICAgIDwvYWRkPgorICAgICAgPGFkZD4KKyAgICAgICAgPGJ1Zz4zOTY1NzwvYnVnPjogV2FybiAoYW5kIGRvbid0IGxvYWQgamFyKSBpZiBKU1AgQVBJIGlzIGluIHdlYmFwcCBjbGFzc2xvYWRlciByZXBvc2l0b3J5LCBhcyBzdWdnZXN0ZWQgYnkKKyAgICAgICAgICBEYXZpZCBTYW5jaGV6IENyZXNwaWxsby4gKHlvYXZzKQorICAgICAgPC9hZGQ+CisgICAgICA8YWRkPgorICAgICAgICA8YnVnPjM5Njc0PC9idWc+OiBTdXBwb3J0IEpSb2NraXQgSlZNIGluIHNlcnZpY2UuYmF0IHNjcmlwdCwgYXMgc3VnZ2VzdGVkIGJ5IGxpem9uZ2JvLiAoeW9hdnMpCisgICAgICA8L2FkZD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzk3MTE8L2J1Zz46IFVwZGF0ZSBMb2FkZXIgY29uZmlndXJhdGlvbiBkb2N1bWVudGF0aW9uLCBhcyBzdWdnZXN0ZWQgYnkgU3RlcGhhbmUgQmFpbGxpZXouICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zOTg2NTwvYnVnPjogQWRkIE9wZW4gT2ZmaWNlIG1pbWUgdHlwZXMgdG8gY29uZi93ZWIueG1sLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzg4MTQ8L2J1Zz46IEFsaWduIENHSSBoYW5kbGluZyBvZiBpbmRleGVkIHF1ZXJpZXMsIHBhcmFtZXRlcnMgYW5kCisgICAgICAgIFBPU1QgY29udGVudCB3aXRoIG90aGVyIENHSSBwcm92aWRlcnMuIFRoZSBjaGFuZ2VzOiBvbmx5IHByb3ZpZGUKKyAgICAgICAgcGFyYW1ldGVycyBvbiB0aGUgY29tbWFuZCBsaW5lIGZvciBpbmRleGVkIHF1ZXJpZXM7IGFsd2F5cyBwcm92aWRlIHRoZQorICAgICAgICBxdWVyeSBzdHJpbmcgdmlhIHRoZSBRVUVSWV9TVFJJTkcgZW52aXJvbm1lbnQgdmFyaWFibGU7IHByb3ZpZGUgUE9TVAorICAgICAgICBjb250ZW50IHVubW9kaWZpZWQgdG8gc3RkaW47IGFuZCBuZXZlciBjYWxsIGdldFBhcmFtZXRlcnMoKS4gKG1hcmt0KSAKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNDgwMTwvYnVnPjogUGFydGlhbCBmaXggdGhhdCBhZGRzIGhhbmRsaW5nIG9mIElPRXhjZXB0aW9ucyBkdXJpbmcKKyAgICAgICAgbG9uZyBydW5uaW5nIENHSSByZXF1ZXN0cy4gQmFzZWQgb24gYSBwYXRjaCBieSBDaHJpcyBEYXZleS4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM5Njg5PC9idWc+OiBBbGxvdyBzaW5nbGUgcXVvdGVzICgnKSBhbmQgYmFja3RpY2tzIChgKSBhcyB3ZWxsIGFzCisgICAgICAgIGRvdWJsZSBxdW90ZXMgKCIpIHRvIGJlIHVzZWQgdG8gZGVsaW1pdCBTU0kgYXR0cmlidXRlIHZhbHVlcy4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjQwMDUzPC9idWc+OiBDb3JyZWN0IGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZG9jdW1lbnRhdGlvbiBzbyBpdAorICAgICAgICBhZ3JlZXMgd2l0aCB0aGUgY2xhc3Nsb2FkZXIgZG9jdW1lbnRhdGlvbiByZWdhcmRpbmcgc2hhcmVkIGxpYiBhbmQKKyAgICAgICAgQ0FUQUxJTkFfQkFTRS4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM5NTkyPC9idWc+OiBTdG9wIEhFQUQgcmVxdWVzdHMgZm9yIHJlc291cmNlcyBoYW5kbGVkIGJ5IFNTSQorICAgICAgICBzZXJ2bGV0IG9yIGZpbHRlciBnZW5lcmF0aW5nIHN0YWNrIHRyYWNlcyBpbiB0aGUgbG9ncy4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBJbXByb3ZlIGhhbmRsaW5nIG9mIHRoZSAnOycgY2hhcmFjdGVyIGluIHRoZSBVUkwgc28gdGhhdCBpdCBpcyBub3cKKyAgICAgICAgYWxsb3dlZCBpZiBwcm9wZXJseSAleHggZW5jb2RlZC4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4gCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNveW90ZSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBBUFIgZW5kcG9pbnQgc28gdGhhdCB0aGUgYWNjZXB0b3IgdGhyZWFkIG5vdyBvbmx5IHByb2Nlc3NlcyBzb2NrZXQKKyAgICAgICAgYWNjZXB0cy4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4gCisgIDxzdWJzZWN0aW9uIG5hbWU9IldlYmFwcHMiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM5ODEzPC9idWc+OiBDb3JyZWN0IGhhbmRsaW5nIG9mIG5ldyBsaW5lIGNoYXJhY3RlcnMgaW4gSk1YCisgICAgICAgIGF0dHJpYnV0ZXMuIFBhdGNoIHByb3ZpZGVkIGJ5IFIgQnJhbWxleS4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM3NzgxPC9idWc+OiBNYWtlIHN1cmUgdGhhdCBTdG9yZUNvbmZpZyBzYXZlIGV4dGVybmFsIHJlZmVyZW5jZWQgd2FyIGZpbGVzIGF0IGNvbnRleHQueG1sIGNvcnJlY3QuIChwZXJvKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM5NzkxPC9idWc+OiBVc2UgY29ycmVjdCBkZWZhdWx0IGZvciB1c2VOYW1pbmcgd2l0aGluIGEgQ29udGV4dC4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBDb3JyZWN0bHkgZ2VuZXJhdGUgcmUtZGlyZWN0IGZvciBhZG1pbiBhcHAgaW5kZXguanNwIHRvIHByZXZlbnQgbG9naW4gcGFnZQorICAgICAgICBiZWluZyBkaXNwbGF5ZWQgdHdpY2Ugd2hlbiBjb29raWVzIGFyZSBkaXNhYmxlZC4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4gCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNsdXN0ZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM5NDczPC9idWc+OiBTZXNzaW9uIHRpbWVvdXQgbXVjaCBzaG9ydGVyIHRoYW4gc2V0dGluZworICAgICAgICAgYXQgd2ViLnhtbCBhdCBjbHVzdGVyIGVudmlyb25tZW50LCBzdWdnZXN0ZWQgYnkgSmluIEppYW5nLiAocGVybykKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+ICAgCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlRvbWNhdCA1LjUuMTcgKHlvYXZzKSI+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkdlbmVyYWwiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8dXBkYXRlPgorICAgICAgICBVcGRhdGUgdG8gWGVyY2VzIDIuOC4wIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBVcGRhdGUgdG8gdGNuYXRpdmUgMS4xLjMgKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICA8c3Vic2VjdGlvbiBuYW1lPSJDYXRhbGluYSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBTaW5nbGVTaWduT24gVmFsdmUgYW5kIGFkZCBTZXNzaW9uLmdldExhc3RBY2Nlc3NUaW1lSW50ZXJuYWwoKSB3aXRob3V0IHNlc3Npb24gaW52YWxpZGF0aW9uIHRlc3QuIChwZXJvKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM4ODE0PC9idWc+OiBDR0lTZXJ2bGV0IGNvcnJlY3RseSBoYW5kbGVzIFNoaWZ0X0pJUyBvdXRwdXQuIChtYXJrdCkgCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEFkZCBtaXNzaW5nIFJFUVVFU1RfVVJJIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIENHSSBlbnZpcm9ubWVudC4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjI3NjE3PC9idWc+OiBTeW5jIGV4aXN0aW5nIG1pbWUgdHlwZXMgd2l0aCBodHRwZC4gKGtlaXRoKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM4NzYxPC9idWc+OiBIYW5kbGUgcmVsYXRpdmUgc3ltbGlua3MgdG8gc2hlbGwgc2NyaXB0cyBhcyBzdWdnZXN0ZWQgYnkgQWRhbSBNdXJyYXkgKGtlaXRoKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM4Nzk1PC9idWc+OiBBc3NvY2lhdGUgbW9yZSBjbG9zZWx5IGJpbmQgd2l0aCBhIGZpbmFsbHkgdW5iaW5kIGluIFN0YW5kYXJkQ29udGV4dCBzdGFydCBhbmQKKyAgICAgICAgc3RvcCwgYmFzZWQgb24gYSBwYXRjaCBieSBEYXJyeWwgTWlsZXMgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEltcHJvdmUgdW5kZXBsb3ltZW50IHJvYnVzdG5lc3MgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEV4cGFuZCB0aGUgc2VtYXBob3JlIHZhbHZlIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM5MDIxPC9idWc+OiBBZGQgYmFjayBzdXBwb3J0IGZvciBhdXRoZW50aWNhdGlvbiBvbmx5LCBzdWJtaXR0ZWQgYnkgU2NvdHQgU3RhcmsgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIFJldmVydCBmaXggZm9yIDxidWc+MzgxMTM8L2J1Zz4sIHdoaWNoIGRvZXMgbm90IHNlZW0gYSBsZWdpdGltYXRlIHByb2JsZW0sIGFuZCBjYXVzZXMKKyAgICAgICAgcmVncmVzc2lvbnMgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIENvcnJlY3RseSByZXNldCBsaXN0ZW5lcnMgd2hlbiByZWxvYWRpbmcgYSB3ZWJhcHAgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzgxOTQ8L2J1Zz46IERvbid0IGZhaWwgc2lsZW50bHkgaWYgLWZvcmNlIGlzIHVzZWQgd2l0aG91dCBDQVRBTElOQV9QSUQsIHN1Ym1pdHRlZCBieSBNYXR0aGV3IEJ1Y2tldHQuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zODE1NDwvYnVnPjogQXZvaWQgTlBFIGluIEZpbGVEaXJDb250ZXh0IGFmdGVyIHdlYmFwcCB1bmRlcGxveSwgcmVwb3J0ZWQgYnkgSmFtaWUgTWFoZXIuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zODIxNzwvYnVnPjogQWRkZWQgY2F1dGlvbmFyeSBub3RlIGFib3V0IGtleXN0b3JlIHBhc3N3b3JkIHRvIFNTTCBIb3dUbywgYXMgc3VnZ2VzdGVkIGJ5IFJhbGYgSGF1c2VyLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzgyNjI8L2J1Zz46IENsZWFyZWQgYW1iaWd1aXR5IGluIGhvc3QgZG9jdW1lbnRhdGlvbiwgYXMgc3VnZ2VzdGVkIGJ5IEplZmZyZXkgQmVubmV0dC4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM4NDc2PC9idWc+OiBNb2RpZmllZCBjaGVjayBmb3IgbnVsbCBUTEQgc3RyZWFtLCBhcyBzdWdnZXN0ZWQgYnkgRmFicml6aW8gR2l1c3RpbmEuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zODA1MjwvYnVnPjogVXNlIDxpPnVzZXJOYW1lPC9pPiBhcyB1c2VyRmllbGQgZGVmYXVsdC4gVXNlciBpcyBhdCBtYW55IGRhdGFiYXNlcyBhIAorICAgICAgICByZXNlcnZlZCBrZXl3b3JkLCBhcyBzdWdnZXN0ZWQgYnkgcmlrLiAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IGhhbmRsaW5nIG9mIG5vbiBtYXRjaGluZyBpZi1yYW5nZSBoZWFkZXIgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzc4NDg8L2J1Zz46IE9ubHkgb3V0cHV0IGNhdGFsaW5hLnNoIGRpYWdub3N0aWMgbWVzc2FnZXMgaWYgd2UgaGF2ZSBhIFRUWSwgc3VibWl0dGVkIGJ5CisgICAgICAgICAgRGF2aWQgU2hhdy4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM4NTk2PC9idWc+OiBNaW5vciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gaW4gRGF0YVNvdXJjZVJlYWxtLCBzdWdnZXN0ZWQgYnkgU2FuZHkKKyAgICAgICAgICBNY0FydGh1ci4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ295b3RlIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgTWFrZSB0aGUgZGVmYXVsdCBjaXBoZXIgc3VpdGVzIGF2YWlsYWJsZSBmb3IgU1NMIHRoZSBzYW1lIGFzIHRoZSBzZXQgb2YgY2lwaGVyCisgICAgICAgIHN1aXRlcyBlbmFibGVkIGJ5IGRlZmF1bHQgcmF0aGVyIHRoYW4gdGhlIHNldCBvZiBhbGwgY2lwaGVyIHN1aXRlcy4gVGhpcyBwcmV2ZW50cworICAgICAgICBjaXBoZXJzIHN1aXRlcyB0aGF0IGRvIG5vdCBwcm92aWRlIGNvbmZpZGVudGlhbGl0eSBwcm90ZWN0aW9uIGFuZC9vciBzZXJ2ZXIKKyAgICAgICAgYXV0aGVudGljYXRpb24gYmVpbmcgdXNlZCBieSBkZWZhdWx0LiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIE1vdmUgQXByRW5kcG9pbnQuZ2V0V29ya2VyVGhyZWFkIGluc2lkZSB0aGUgdHJ5L2NhdGNoIGZvciB0aGUgbWFpbiBhY2NlcHQgbG9vcCwgdG8gZ3VhcmQKKyAgICAgICAgYWJvdXQgYW4gT09NICh3aGljaCB3b3VsZCBtb3N0IGxpa2VseSBkb29tIHRoZSBzZXJ2ZXIgYW55d2F5KSAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgQXMgZXhoaWJpdGVkIGluIHRoZSBBU0YncyBKSVJBIGluc3RhbGxhdGlvbiwgaXQgc2VlbXMgRUlOVFIgaXMgYSBzdGF0dXMgY29kZSB0aGF0IHNob3VsZAorICAgICAgICBiZSBpZ25vcmVkIGFzIGEgcmVzdWx0IHRvIGEgcG9sbCBjYWxsIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBOZXcgQVBSIGNvbm5lY3RvcnMgZGVmYXVsdHMgKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEFkZCBtdWx0aXBsZSB0aHJlYWRzIGZvciBBUFIgcG9sbGVycywgdG8gd29yayBhcm91bmQgV2luZG93cyBsaW1pdGF0aW9ucyAocGVyZm9ybWFuY2UgZGVncmFkZXMKKyAgICAgICAgdmVyeSByYXBpZGx5IGlmIHBvbGxlciBzaXplcyBvdmVyIDEwMjQgYXJlIGFsbG93ZWQgd2hlbiBjb21waWxpbmcgQVBSKSAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgTmV3IG1vZGVzIGZvciBmaXJzdFJlYWRUaW1lb3V0ICgtMSBiZWluZyB0aGUgbmV3IGRlZmF1bHQpIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBSZXBsYWNlIGphdmEudXRpbC5TdGFjayB1c2FnZSB3aXRoIGEgc2ltcGxlIGFycmF5IGluIHRoZSBBUFIgZW5kcG9pbnQgKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIHRjbmF0aXZlIGpuaWxpYi5jIG5vdyByZXBvcnQgY29ycmVjdCBjb21waWxlIGZsYWdzIGZvciBydW50aW1lIAorICAgICAgICBMaWJyYXJ5LmphdmEgY2hlY2tzIGxpa2Ugc2VuZGZpbGUgc3VwcG9ydCBkZWZhdWx0IHRydWUvZmFsc2UgKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICA8c3Vic2VjdGlvbiBuYW1lPSJKYXNwZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM4MDE1PC9idWc+OiBSZW1vdmUgbWlzbGVhZGluZyB3YXJuaW5ncyBsb2dnZWQgaW4gVGFnTGlicmFyeUluZm9JbXBsLCBhcyBzdWdnZXN0ZWQgYnkgQW5kcmV3IEhvdWdodG9uLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzgzNzY8L2J1Zz46IE1ha2Ugc3VyZSBib2R5IGNvbnRlbnQgc3RhY2sgaXMgYWx3YXlzIHByb3Blcmx5IGFsaWduZWQsIGFzIHN1Ym1pdHRlZCBieSBUb255IERlaWdoLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIENvbXBhdGliaWxpdHkgd2l0aCBKRFQgMy4yIChyZW1tKQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iV2ViYXBwcyI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzkyOTI8L2J1Zz46IFVwZGF0ZSBjYXRhbGluYS5wb2xpY3kgYXQgZGVtbyBiYWxhbmNlciBhcHAuIEZpeCBwcm92aWRlZCBieSBLZXJyeSBTYWluc2J1cnkgKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzY4NDc8L2J1Zz46IEZpeGVkIHRoZSBtYW5hZ2VyIGFwcCBjb3B5IGZ1bmN0aW9uIHRvIG5vdCBvdmVyd3JpdGUgZmlsZUEgd2l0aCBmaWxlQiB3aGVuIGZpbGVBPT1maWxlQi4KKyAgICAgICAgRml4IHByb3ZpZGVkIGJ5IEhhcm9vbiBSYWZpcXVlIChmaGFuaWspCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzg1MDg8L2J1Zz46IFNldmVyYWwgZW5oYW5jZW1lbnRzIHRvIEhvc3QgTWFuYWdlciBhcHBsaWNhdGlvbiwgaW5jbHVkaW5nIGNvbmZpZ3VyYWJsZQorICAgICAgICAgIG1hbmFnZXIgYXBwIHN1cHBvcnQgYW5kIGRpYWxvZyBib3ggZW5oYW5jZW1lbnRzLiAgVGhhbmtzIHRvIEdlb3JnZSBTZXh0b24gZm9yIHRoZSBwYXRjaC4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM3NzgxPC9idWc+OiBNYWtlIHN1cmUgY29udGV4dCBjb25maWcgZmlsZSBpcyB3cml0ZWFibGUsIHN1Z2dlc3RlZCBieSBHZW9yZ2UgU2V4dG9uLiAoeW9hdnMscGVybykKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkNsdXN0ZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICAgPHVwZGF0ZT4KKyAgICAgICAgQWRkIGF0IFBvb2xlZFNvY2tldFNlbmRlciB0aGUgam14IGF0dHJpYnV0ZXMgaW5Qb29sU2l6ZSBhbmQgaW5Vc2VQb29sU2l6ZS4gKHBlcm8pCisgICAgICAgPC91cGRhdGU+CisgICAgICAgPGZpeD4KKyAgICAgICAgIERlbHRhTWFuYWdlciBzZXQgc2Vzc2lvbiBjcmVhdGlvblRpbWUgYXQgYmFja3VwIG5vZGUuIChwZXJvKQorICAgICAgIDwvZml4PgorICAgICAgIDx1cGRhdGU+CisgICAgICAgIEFkZCBKdm1Sb3V0ZUJpbmRlclZhbHZlIGRvY3VtZW50YXRpb24gYXQgY2x1c3Rlci1ob3d0by54bWwuIChwZXJvKQorICAgICAgIDwvdXBkYXRlPgorICAgICAgIDxhZGQ+CisgICAgICAgIEp2bVJvdXRlQmluZGVyVmFsdmUgbm93IHN1cHBvcnRzIG5vdyBzZXNzaW9uaWQncyBmcm9tIHJlcXVlc3QgYW5kIGNvb2tpZXMuCisgICAgICAgIFRoYW5rcyB0byBCcmlhbiBTdGFuc2JlcnJ5IGZvciByZXBvcnRpbmcgaXQuIChwZXJvKQorICAgICAgIDwvYWRkPgorICAgICAgIDxmaXg+CisgICAgICAJPGJ1Zz4zODc3OTwvYnVnPiBGaXggd3Jvbmcgam14IG1lc3NhZ2UgYXJnIGF0IFNpbXBsZVRjcENsdXN0ZXIKKyAgICAgICAgICBhdCBvLmEuYy5jbHVzdGVyLnRjcC5tYmVhbnMtZGVzY3JpcHRvcnMueG1sLCBzdWJtaXR0ZWQgYnkgUGF3ZWwgVHVjaG9sc2tpIChwZXJvKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBGaXggdGhhdCBub3QgYWZ0ZXIgZXZlcnkgIktlZXAgQWxpdmUgU29ja2V0IGNsb3NlIiBhIGxvZyB3YXJuaW5nIGlzIGdlbmVyYXRlZCBhdCBUY3BSZXBsaWNhdGlvblRocmVhZCAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zOTE3ODwvYnVnPjogTm93IFJPT1Qud2FyIGRlcGxveW1lbnQgd2l0aCBGYXJtV2FyRGVwbG95ZXIgaXMgcG9zc2libGUgKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIFJlcGxpY2F0aW9uVmFsdmUgbm90IHNldCBwcmltYXJ5U2Vzc2lvbiBmbGFnIHdoZW4gYWxsIGJhY2t1cCBub2RlcyBnb25lIChwZXJvKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBBZGQgRGVsdGFTZXNzaW9uLmdldExhc3RBY2Nlc3NUaW1lSW50ZXJuYWwoKSB3aXRob3V0IHNlc3Npb24gaW52YWxpZGF0aW9uIHRlc3QuIChwZXJvKQorICAgICAgPC91cGRhdGU+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKyA8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlRvbWNhdCA1LjUuMTYgKHlvYXZzKSI+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkdlbmVyYWwiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8dXBkYXRlPgorICAgICAgICBVcGRhdGVkIC8gZW5oYW5jZWQgZG9jcyB0byByZW1vdmUgb2xkIEZJWE1FIHJlZmVyZW5jZXMuICh5b2F2cykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVxdWlyZWQgdGNuYXRpdmUgbGlicmFyeSB2ZXJzaW9uIHVwZ3JhZGVkIHRvIDEuMS4yIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBVcGRhdGUgdG8gRWNsaXBzZSBKRFQgMy4xLjIgKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICA8c3Vic2VjdGlvbiBuYW1lPSJDYXRhbGluYSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MjM5NTA8L2J1Zz46IENvbnRleHQubGlzdEJpbmRpbmdzKCkgc2hvdWxkIHJldHVybiBvYmplY3RzIG5vdAorICAgICAgICByZWZlcmVuY2VzLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzgxMjQ8L2J1Zz46IEFkZCBzdXBwb3J0IGZvciBXaW5kb3dzIDIweHggd2hlbiByZWFkaW5nIGVudmlyb25tZW50CisgICAgICAgIHZhcmlhYmxlcyBpbiBDR0lTZXJ2bGV0LiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MjkyMTQ8L2J1Zz46IHJlc3BvbnNlLmNvbnRhaW5zSGVhZGVyKCkgbm93IHJldHVybnMgdGhlIGNvcnJlY3QKKyAgICAgICAgdmFsdWUgZm9yIENvbnRlbnQtVHlwZSBhbmQgQ29udGVudC1MZW5ndGggaGVhZGVycy4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBBbGxvdyB1c2luZyBhIGN1c3RvbSBDb250ZXh0Q29uZmlnIHdoZW4gdXNpbmcgSk1YIGVtYmVkZGluZyBvZiBUb21jYXQsIGFzCisgICAgICAgIGlzIGRvbmUgYnkgdGhlIHJlZ3VsYXIgZGVwbG95ZXIuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8YWRkPgorICAgICAgICBBZGQgSk1YIHNlcnZlckluZm8gYXR0cmlidXRlIHRvIFNlcnZlciBNQmVhbiwgdGhhdCB3ZSBjYW4gaWRlbnRpZnkKKyAgICAgICAgdGhlIHRvbWNhdCByZWxlYXNlIHJlbW90ZWx5LiAocGVybykKKyAgICAgIDwvYWRkPgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IHRoZSBKTVggTUJlYW5GYWN0b3J5LmNyZWF0ZVN0YW5kYXJkSG9zdCBzaWduYXR1cmUgYXQgbWJlYW4tZGVzY3JpcHRvcnMueG1sIChwZXJvKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBGaXggc29tZSBjYXNlcyAoZm9yIGV4YW1wbGUgd2l0aCByZWFsbSB1c2FnZSkgd2hlcmUgdGhlIGNvbnRhaW5lciBsb2dnZXIgZm9yIGEgY29udGV4dAorICAgICAgICB3b3VsZCBiZSByZXRyaWV2ZWQgdXNpbmcgdGhlIHdyb25nIGNsYXNzbG9hZGVyIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBIdHRwU2Vzc2lvbi5nZXRJZCB3aWxsIG5vIGxvbmdlciB0aHJvdyBhbiBJU0Ugd2hlbiB0aGUgc2Vzc2lvbiBpcyBpbnZhbGlkIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICAgTW9yZSBkZXRhaWxlZCBlcnJvcnMgZm9yIG5hbWluZyBpc3N1ZXMgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxkb2NzPgorICAgICAgICBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFRyYW5zYWN0aW9uIGVsZW1lbnQgKHJlbW0pCisgICAgICA8L2RvY3M+CisgICAgICA8dXBkYXRlPgorICAgICAgICBBZGQgZ2V0Q29udGV4dFBhdGggdG8gdGhlIGludGVybmFsIHNlcnZsZXQgY29udGV4dCBpbXBsZW1lbnRhdGlvbiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgT25seSBudWxsIGluc3RhbmNlcyBsb2FkZWQgYnkgdGhlIHdlYmFwcCBDTCwgc3VibWl0dGVkIGJ5IE1hdHQgSmVuc2VuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBEZXBsb3kgZm9sZGVycyB3aGljaCBkb24ndCBoYXZlIGEgV0VCLUlORiwgYW5kIHJldHVybiBhbiBlcnJvciB3aGVuIGEgY29udGV4dAorICAgICAgICBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYSBDb250ZXh0IGVsZW1lbnQgKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzg2NTM8L2J1Zz46IEZpeCBwcm9wZXJ0eSBuYW1lIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBTbGlnaHRseSBtb2RpZnkgdGhlIHRpbWluZyBvZiB0aGUgbWFuYWdlciBzdGFydCwgc28gdGhhdCBpdCBpcyBub3Qgc3RhcnRlZCBieSBhCisgICAgICAgIGxpc3RlbmVyIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBSZWZyZXNoIGxvZ2dlcnMgdXNlZCBieSB0aGUgZGlnZXN0ZXIgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIFVzZSBzZW5kRXJyb3IgaW5zdGVhZCBvZiBzZXRTdGF0dXMgdG8gc2VuZCB0aGUgNDAxIGNvZGUuIChiaWxsYmFya2VyKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBEb24ndCBhcHBlbmQgdGhlIHBvcnQgZm9yIGFuIFNTTCByZWRpcmVjdCBpZiBpdCBpcyB0aGUgZGVmYXVsdCBwb3J0LiAoYmlsbGJhcmtlcikKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkNveW90ZSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIExvZyBlcnJvcnMgd2hlbiBzZXR0aW5nIHNvY2tldCBvcHRpb25zIHdpdGggZGVidWcgcHJpb3JpdHkgcmF0aGVyIHRoYW4gZXJyb3IuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM4MTAwPC9idWc+OiBNYWtlIGNlcnRhaW4gdGhhdCBhIHZhbGlkIEhvc3QgbmFtZSBpcyBzZXQsIG9yIG5vbmUgYXQgYWxsLiAoYmlsbGJhcmtlcikKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zODQ4NTwvYnVnPjogRml4IG1pbm9yIHJlZ3Jlc3Npb24gc2V0dGluZyBjb25uZWN0aW9uIHRpbWVvdXQgKGFzIHdlbGwgYXMgbGluZ2VyIGFuZAorICAgICAgICBubyBkZWxheSkgd2hlcmUgdGhlIGRlZmF1bHQgdmFsdWUgd2FzIGFsd2F5cyB1c2VkIHdoZW4gdXNpbmcgdGhlIHJlZ3VsYXIgCisgICAgICAgIEhUVFAgY29ubmVjdG9yIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBQYXNzIGFsb25nIG1vcmUgb2YgdGhlIFNTTCByZWxhdGVkIGZpZWxkcyB0byBPcGVuU1NMIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBDaGFyQ2h1bmsgbm93IGltcGxlbWVudHMgQ2hhclNlcXVlbmNlIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICBGaXggY29kaW5nIGVycm9yIHdoaWNoIGNvdWxkIGNhdXNlIGEgcmFyZSBjcmFzaCB3aGVuIGEgcG9sbGVyIGVycm9yIG9jY3VycmVkIGFuZCBzb2NrZXRzCisgICAgICAgIHdoZXJlIHBlbmRpbmcgYmVpbmcgYWRkZWQgdG8gdGhlIGtlZXBhbGl2ZSBwb2xsZXIgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBwb3RlbnRpYWwgc3luYyBpc3N1ZXMgd2hlbiByZXN0YXJ0aW5nIGEgcG9sbGVyIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBVcGRhdGUgQVBSIGVycm9yIHJlcG9ydHMsIGluY2x1ZGluZyB0aGUgZXJyb3IgY29kZXMgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzg3MjY8L2J1Zz46IFJlbW92ZSBkdXBsaWNhdGUgcmVxdWVzdCBncm91cCBmaWVsZCBjYXVzaW5nIGJsYW5rIHN0YXRpc3RpY3MgZm9yIHRoZQorICAgICAgICBIVFRQIGNvbm5lY3RvciAocmVtbSkgCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBpbnZhbGlkIGxlbmd0aCB1c2VkIGJ5IHNvbWUgQUpQIHBhY2tldHMgZm9yIHRoZSBBSlAgQVBSIGNvbm5lY3Rvciwgd2hpY2ggY291bGQgY2F1c2UgCisgICAgICAgIGNvcnJ1cHRpb24sIHN1Ym1pdHRlZCBieSBSdWRpZ2VyIFBsdW0gKGppbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zODM0NjwvYnVnPjogRml4IHByb2JsZW1zIHdpdGggcmVxdWVzdC5nZXRSZWFkZXIoKS5yZWFkTGluZSgpLiAKKyAgICAgICAgUGF0Y2ggYnkgUmFpbmVyIEp1bmcgKGJpbGxiYXJrZXIpCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIExvY2FsIGFkZHJlc3MgcmV1c2UgZm9yIEFQUiBFbmRwb2ludHMgKHZpYSBBUFJfU09fUkVVU0VBRERSKSBub3cgZW5hYmxlZCAoamltKQorICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIERvbid0IHdyaXRlIG91dCB0aGUgc2h1dGRvd24gc2VjcmV0IGZpbGUgaWYgc2h1dGRvd24gaXMgZGlzYWJsZWQgKHRoZSBkZWZhdWx0KSAoYmlsbGJhcmtlcikKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IE5QRSB3aGVuIG5vIHNpbmsgaXMgc3VwcGxpZWQuIChiaWxsYmFya2VyKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBBUFIgRW5kcG9pbnRzIG5vdyBJUHY2IGF3YXJlIChqaW0pCisgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgRG93bmdyYWRlICJSZXNwb25zZSBhbHJlYWR5IGNvbW1pdHRlZCIgbG9nZ2luZyBlbnRyeSB0byBERUJVRy4gKGJpbGxiYXJrZXIpCisgICAgIDwvdXBkYXRlPgorICAgICA8Zml4PgorICAgICAgIDxidWc+MzgxMTM8L2J1Zz46IFJldHVybiB0aGUgZW1wdHkgU3RyaW5nIGZvciBhbiBlbXB0eSBxdWVyeS1zdHJpbmcgaW5zdGVhZCBvZiBudWxsLiAoYmlsbGJhcmtlcikKKyAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iSmFzcGVyIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zODM4OTwvYnVnPjogU2V0IGNvcnJlY3QgSkRUIENvbXBpbGVyIG9wdGlvbiB0byBqYXZhIDEuNSBjb21wbGlhbmNlLiAKKyAgICAgICAgUGF0Y2ggZnJvbSBPbGl2aWVyIFRob21hbm4gYW5kIFBhdWwgSGFtZXIgKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEFkZCBzb21lIHVzZWZ1bCBoaW50cyB0byBqYXNwZXItaG93dG8uIChwZXJvKS4KKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zODc3NjwvYnVnPjogRml4IHNvdXJjZSBmaWxlIGF0dHJpYnV0ZSwgc3VibWl0dGVkIGJ5IE9saXZpZXIgVGhvbWFubiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkNsdXN0ZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICBVcGRhdGUgRGVsdGFNYW5hZ2VyIHNlc3Npb24gYWNjZXNzIHN0YXRzICAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgRGVsdGFTZXNzaW9uIGdldElkIHdpbGwgbm8gbG9uZ2VyIHRocm93IGFuIElTRSB3aGVuIHRoZSBzZXNzaW9uIGlzIGludmFsaWQgKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgICAgUmVzdXJyZWN0ZWQgdGhlICZxdW90O3N1c3BlY3QmcXVvdDsgcHJvcGVydHkgc28gdGhhdCB0aGUgbG9ncyBkb24ndCBmaWxsCisgICAgICAgICAgdXAgd2l0aCBlcnJvcnMgd2hlbiBtZW1iZXIgZGlzYXBwZWFycyBvciBhIGNvbm5lY3Rpb24gaXMgbG9zdC4gT25seSB1c2VmdWwgZm9yIHBvb2xlZCBtb2RlIChmaGFuaWspCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxhZGQ+CisgICAgICAgPGJ1Zz4zNTcxMDwvYnVnPjogQWRkIHNlc3Npb24gcmVwbGljYXRpb24gZm9yIGNyb3NzIGNvbnRleHQgc2Vzc2lvbiBjaGFuZ2VzLgorICAgICAgIFRoZSBwb3J0bGV0IGFwaSBuZWVkIHRoaXMgc3VwcG9ydCwgc2VlIHJlZmFjdG9yZWQgUmVwbGljYXRpb25WYWx2ZS4gKHBlcm8pCisgICAgICA8L2FkZD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFJlcGxpY2F0aW9uVmFsdmUgcmVzZXQgRGVsdGFTZXNzaW9uIHdoZW4gY2x1c3RlciBub2RlIGhhcyBubyBiYWNrdXAgbm9kZS4gKHBlcm8pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIERhdGFTZW5kZXIgY2xvc2UgY29ubmVjdGlvbiBhbmQgdGhyb3cgZXhjZXB0aW9uIGFsc28gZXZlbiBpZiB3YWl0Rm9yQWNrIGlzIGZhbHNlLiAgKHBlcm8pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIEFjdGl2ZSBjbHVzdGVyIGp1bml0IHRlc3QgYWdhaW4uIChwZXJvKQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iV2ViYXBwcyI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBzb21lIFhTUyBpc3N1ZXMgaW4gdGhlIEpTUCBleGFtcGxlcy4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBGaXggbG9nb3MgaW4gdGhlIG1hbmFnZXIgd2ViYXBwIChyZW1tKQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVG9tY2F0IDUuNS4xNSAoeW9hdnMpIj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iR2VuZXJhbCI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzIwODE8L2J1Zz46IFJlbW92ZSB0aGUgSkRLIHJlcXVpcmVtZW50IGZyb20gdGhlIFdpbjMyIHNjcmlwdHMuIChrZWl0aCkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkNhdGFsaW5hIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICA8YnVnPjM3ODUyPC9idWc+OiBGaXggcmVncmVzc2lvbiB3aGVyZSB0aGUgbWFnaWMgcm9sZSAnKicgd2FzIGRlbnlpbmcgYWxsIGFjY2Vzcy4gUGF0Y2ggYnkgeHJjYXQgKGJpbGxiYXJrZXIpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgPGJ1Zz4zNzkzNDwvYnVnPjogRG9uJ3QgYXNrIGZvciBhdXRoZW50aWNhdGlvbiBpZiBkZW55LWZyb20tYWxsIGlzIGluIGVmZmVjdC4gKGJpbGxiYXJrZXIpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MTU1NzA8L2J1Zz46IGF1dGgtY29uc3RyYWludCBvZiAqIHdhcyBpbnRlcnByZXR0ZWQgYXMgYWxsCisgICAgICAgIGF1dGhlbnRpY2F0ZWQgdXNlcnMgcmF0aGVyIHRoYW4gYXMgYWxsIHJvbGVzIGRlZmluZWQgaW4gd2ViLnhtbC4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgIFJlbW92ZSBsZWZ0b3ZlciBzdGF0aWMgbG9nZ2VyIHdoaWNoIHdhcyB1c2VkIHRvIGxvZyBhcHBsaWNhdGlvbiBsZXZlbCBtZXNzYWdlcyBpbgorICAgICAgIEFwcGxpY2F0aW9uQ29udGV4dEZhY2FkZSAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zODAxMjwvYnVnPjogV2hlcmUgYSBDR0kgc2NyaXB0IHNldHMgYSByZXNwb25zZSBjb2RlLCB1c2UgaXQuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNzg1NDwvYnVnPjogRXh0ZW5zaW9uLUxpc3QgY2hlY2tpbmcgd2FzIHRvbyBzdHJpY3QuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkNveW90ZSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgUmVwb3J0IGJpbmRpbmcgZXJyb3JzIGluIHRoZSBBUFIgZW5kcG9pbnQgYXMgc3RyaW5ncyByYXRoZXIgdGhhbiBwbGF0Zm9ybSBzcGVjaWZpYworICAgICAgIHN0YXR1cyBjb2RlcyAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICA8YnVnPjM3OTM0PC9idWc+OiBEb24ndCBhc2sgZm9yIGF1dGhlbnRpY2F0aW9uIGlmIGRlbnktZnJvbS1hbGwgaXMgaW4gZWZmZWN0LiAoYmlsbGJhcmtlcikKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD48YnVnPjM4MDQ3PC9idWc+OiBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIFNlcnZsZXQgYXR0ZW1wdHMgdG8gcmVhZAorICAgICAgICAgICAgICB0aGUgUmVxdWVzdCBib2R5IGZyb20gdGhlIEFKUC8xLjMgQ29ubmVjdG9yLCBpbiB0aGUgY2FzZSB0aGF0IG5vCisgICAgICAgICAgICAgIGJvZHkgd2FzIHNlbnQuIChiaWxsYmFya2VyKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PjxidWc+MzgwMzA8L2J1Zz46IFVuY29uZGl0aW9uYWxseSByZXR1cm4gRU9TIGZvciBhbiBhdHRlbXB0IHRvIHJlYWQgCisgICAgICAgICAgICAgIHRoZSBib2R5IG9mIGFueSByZXF1ZXN0IHRoYXQgZG9lc24ndCBzZW5kIENMIG9yIFRFLiAKKyAgICAgICAgICAgICAgKHJlbW0sIGJpbGxiYXJrZXIpLgorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iSmFzcGVyIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNTM1MTwvYnVnPjogRml4IHByb2JsZW0gdXNpbmcgYW4gaW5uZXIgY2xhc3MgZm9yIGEgJmx0O2pzcDp1c2VCZWFuIC8mZ3Q7LiAoa2lubWFuKS4KKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNzkyOTwvYnVnPjogRG9uJ3Qgc3RvcCBvbiB0aGUgZ2VuZXJpYyBhdHRyaWJ1dGUgbWV0aG9kcyBqdXN0IGJlY2F1c2UgdGhlIHNlc3Npb24gaXMgaW52YWxpZC4gUGF0Y2ggYnkgUGllcnJlIERlbGlzbGUuIChiaWxsYmFya2VyKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBBZGQgc3lzdGVtIHByb3BlcnRpZXMgb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Cb2R5Q29udGVudEltcGwuTElNSVRfQlVGRkVSIGFuZAorICAgICAgICBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcEZhY3RvcnlJbXBsLlVTRV9QT09MIHRvIGFsbG93IGNvbmZpZ3VyaW5nIEphc3BlcgorICAgICAgICBtZW1vcnkgdXNhZ2UgKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzc5MzM8L2J1Zz46IFJlc3RyaWN0ICZsdDtqc3A6Z2V0QXR0cmlidXRlIC8mZ3Q7IHRvIG9ubHkgbG9vayBpbiBQQUdFX1NDT1BFLiAoYmlsbGJhcmtlcikKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkNsdXN0ZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgIDxidWc+Mzc4MDg8L2J1Zz46IEZpeCBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW5zaWRlIFhCeXRlQnVmZmVyLiBSZXBvcnRlZCBieSBEaWV0bWFyIE11ZWxsZXIgKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIDxidWc+Mzc4OTY8L2J1Zz5EYXRhU2VuZGVyIHN0YXJ0cyBuZXcgU29ja2V0IGFmdGVyIElPRXhjZXB0aW9uLiAocGVybykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVkdWNlIG1lbW9yeSB1c2FnZSBhdCBtZW1iZXJzaGlwIHNlcnZpY2UuIChwZXJvKQorICAgICAgPC91cGRhdGU+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVG9tY2F0IDUuNS4xNCAoeW9hdnMpIj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iR2VuZXJhbCI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFVwZGF0ZSBvcHRpb25hbCBuYXRpdmUgQVBSIGNvbm5lY3RvciB2ZXJzaW9uIHRvIDEuMS4xLiAobXR1cmspCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFVwZGF0ZSBidWlsZC5wcm9wZXJ0aWVzLmRlZmF1bHQgdG8gZ2V0IG5hdGl2ZSBjb25uZWN0b3IgZnJvbSBuZXcgbG9jYXRpb24uICh5b2F2cykKKyAgICAgIDwvdXBkYXRlPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2F0YWxpbmEiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjEzMDQwPC9idWc+OiBGaXggZ2V0Q29udGV4dCgpIHdoZW4gdXNlZCB0byBvYnRhaW4gYSBjb250ZXh0IHRoYXQgaXMgYSBzdWItY29udGV4dAorICAgICAgICBvZiB0aGUgY3VycmVudCBjb250ZXh0LiBQb3J0ZWQgZnJvbSBUQzQuIChtYXJrdCkgCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9Ikphc3BlciI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzc3NDY8L2J1Zz46IFJlbW92ZSBleHRyYSBzcGFjZSBmcm9tIFN0cmluZ1Rva2VuaXplciBwYXR0ZXJuIGluIEpzcEMsIGFzIHN1Z2dlc3RlZCBieQorICAgICAgICBFcmljIEhlZHN0cm9tLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICA8c3Vic2VjdGlvbiBuYW1lPSJDb3lvdGUiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgIDxidWc+MzY4NjM8L2J1Zz46IFN0cmlwIHF1b3RlcyB3aGVuIHBhcnNpbmcgQ29va2llIHZhbHVlcywgZXZlbiBmb3IgdjAgQ29va2llcy4gKGJpbGxiYXJrZXIpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgPGJ1Zz4zNzgwMzwvYnVnPjogRG9uJ3QgY2xhaW0gdGhhdCB3ZSBoYXZlIGEgc3RyaW5nIHZhbHVlIGluIE1lc3NhZ2VCeXRlcyB1bnRpbCB3ZSBhY3R1YWxseSBkby4gCisgICAgICAgICAgIFBhdGNoIGJ5IERvdWcgUmFuZCAoYmlsbGJhcmtlcikKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlRvbWNhdCA1LjUuMTMgKHlvYXZzKSI+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkdlbmVyYWwiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM2NzExPC9idWc+OiBVbnVzZWQgbGluZSBvZiBjb2RlLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFJlbW92ZWQgdW51c2VkIFNBWFBhdGgsIEpheGVuIGRlcGVuZGVuY2llcy4gKHlvYXZzKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBVcGRhdGUgbG9nNGogZGVwZW5kZW5jeSB0byB2ZXJzaW9uIDEuMi4xMiwgU3RydXRzIHRvIDEuMi43LiAoeW9hdnMpCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFJlbW92ZWQgSkRCQyAyLjAgU3RkRXh0IGRlcGVuZGVuY3kgKG9ubHkgY2xhc3MgZnJvbSB0aGVyZSBpcyBqYXZheC5zcWwuWEFEYXRhU291cmNlLCB3aGljaCBpcworICAgICAgICBwcmVzZW50IGluIEpESyAxLjQgYW5kIGxhdGVyLiAoeW9hdnMpCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzcwMzk8L2J1Zz46IHR5cG8gb24gSksgUXVpY2sgY29uZmlndXJhdGlvbiBob3ctdG8uICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGFkZD4KKyAgICAgICAgPGJ1Zz4zNzAzNTwvYnVnPjogQWRkIGEgcGxhY2Vob2xkZXIgZmlsZSBpbiB0aGUgdGVtcCBkaXJlY3RvcnkgZm9yIFdpblppcCB0YXIuZ3ogaGFuZGxpbmcuICh5b2F2cykKKyAgICAgIDwvYWRkPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgVXBkYXRlIEpBRiBkZXBlbmRlbmN5IHRvIDEuMC4yLCBKVEEgdG8gMS4wLjFiIGFuZCBKYXZhTWFpbCB0byAxLjMuM18wMS4gKG1hcmt0KQorICAgICAgPC91cGRhdGU+CisgICAgICA8YWRkPgorICAgICAgICBBZGRlZCBFY2xpcHNlIC5wcm9qZWN0LCAuY2xhc3NwYXRoLCBhbmQgYXNzb2NpYXRlZCBmaWxlcyB0byBtYWtlIGJ1aWxkaW5nIFRvbWNhdCBmcm9tCisgICAgICAgIEVjbGlwc2Ugc2lnbmlmaWNhbnRseSBlYXNpZXIuIChtYXJrdCkKKyAgICAgIDwvYWRkPgorICAgICAgPGFkZD4gCisgICAgICAgIDxidWc+MzcyODQ8L2J1Zz46IEd1ZXNzIEpTRSA1LjAgbG9jYXRpb24gb24gTWFjIE9TIFgsIHBhdGNoIGJ5IFN0ZXBhbiBLb2x0c292LiAoeW9hdnMpCisgICAgICA8L2FkZD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+PC9idWc+OiBXcm9uZyBjbGFzcyBuYW1lIGluIGFudGxpYi54bWwgZm9yIEprU3RhdHVzVXBkYXRlVGFzay4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2F0YWxpbmEiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM2ODAyPC9idWc+OiBGaXggcHJvYmxlbSBvZiBkb3VibGUtaW5pdCB3aGVuIEpNWC1kZXBsb3lpbmcgYSAKKyAgICAgICAgQ29udGV4dCBpbnRvIGEgc3RhcnRlZCBIb3N0LiAoYmlsbGJhcmtlcikKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNjg0MDwvYnVnPjogUHJvdmlkZSBpbmZvcm1hdGlvbiBhcyB0byB3aGljaCB3ZWIueG1sIGlzIGJlaW5nIHByb2Nlc3NlZCBvbiBzdGFydHVwIHRvCisgICAgICAgIGhlbHAgZGVidWcgcGFyc2luZyBlcnJvcnMuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGFkZD4KKyAgICAgICAgPGJ1Zz4zNDcyNDwvYnVnPjogQWJpbGl0eSB0byBzZXQgZG9tYWluIGZvciBTaW5nbGUtU2lnbi1PbiBjb29raWUuICBQYXRjaCBieSBPbGl2ZXIKKyAgICAgICAgUm9zc211ZWxsZXIuICh5b2F2cykKKyAgICAgIDwvYWRkPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNzA0NDwvYnVnPjogUmVhbG1CYXNlLmhhc1Jlc291cmNlUGVybWlzc2lvbiBuZWVkcyB0byBhY2Nlc3MgdGhlIEdlbmVyaWNQcmluY2lwYWwgYXMKKyAgICAgICAgc2V0IGJ5IHRoZSByZWFsbSB1bmxlc3MgaGFzUm9sZSBpcyBvdmVycmlkZW4sIHdoaWNoIHdhcyBubyBsb25nZXIgYmVpbmcgZG9uZSBwcm9wZXJseSBmb3IKKyAgICAgICAgdGhlIEpBQVMgcmVhbG0gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzcyNjQ8L2J1Zz46IEpOREkgcmVzb3VyY2VzIHdlcmUgbm8gbG9uZ2VyIGF2YWlsYWJsZSB3aGVuIHN0b3BwaW5nIGxpc3RlbmVycywKKyAgICAgICAgc3VibWl0dGVkIGJ5IEJvZ2RhbiBDYWxtYWMgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzcxNTA8L2J1Zz46IFR1cm4gb2ZmIGRpcmVjdG9yeSBsaXN0aW5nIGJ5IGRlZmF1bHQgYW5kIGFkZCBhIHdhcm5pbmcKKyAgICAgICAgcmVnYXJkaW5nIGVuYWJsaW5nIGxpc3Rpbmcgb2YgZGlyZWN0b3JpZXMgd2l0aCBtYW55IGVudHJpZXMuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgQWRkIGNvbmZpZ3VyYWJpbGl0eSBmb3IgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIGNvbnRhaW5lciB3aWxsIHdhaXQgZm9yIHJlcXVlc3RzCisgICAgICAgIHRvIGNvbXBsZXRlIHdoZW4gdW5sb2FkaW5nIHNlcnZsZXRzLCB1c2luZyB0aGUgdW5sb2FkRGVsYXkgcHJvcGVydHkuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBBZGQgY29kZSB0byBzZXQgdG8gbnVsbCBmaWVsZHMgaW4gbG9hZGVkIGNsYXNzZXMgd2hlbiBzdG9wcGluZyBhIHdlYiBhcHBsaWNhdGlvbiwgYXMgYQorICAgICAgICBwb3NzaWJsZSB3b3JrYXJvdW5kIGZvciBzdXNwaWNpb3VzIGdhcmJhZ2UgY29sbGVjdGlvbiBiZWhhdmlvci4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFVwZGF0ZSBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzIGZvciBjbGFzc2xvYWRpbmcgZXJyb3JzIHdoaWNoIG1heSBvY2N1ciB3aGVuIHJlbW92aW5nCisgICAgICAgIGEgd2ViIGFwcGxpY2F0aW9uLCBhbmQgZm9yIHN0b3BwZWQgd2ViIGFwcGxpY2F0aW9ucy4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzczMTk8L2J1Zz46IEZpeCBjYXRhbGluYS5iYXQgcmVmZXJlbmNlIHRvIENBVEFMSU5BX0JBU0UgZm9yIGxvZ2dpbmcucHJvcGVydGllcy4gIFRoYW5rcworICAgICAgICB0byBQaWVycmUtWXZlcyBCZW56YWtlbi4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM2ODUyPC9idWc+OiBDdXN0b20gY2xhc3Nsb2FkZXJzIGRvbid0IGhvbm9yIENvbnRldCBwcml2aWxlZ2VkIGF0dHJpYnV0ZS4gIFRoYW5rcyB0bworICAgICAgICBNYXR0IEJyaW5rbGV5IGZvciB0aGUgYW5hbHlzaXMgYW5kIHBhdGNoLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+Rml4IGZvciBhIGNvdXBsZSBvZiAobW9zdGx5IHNpbGx5KSBlZGdlLWNhc2VzIGluIHRlc3RpbmcgYXV0aC4KKyAgICAgICAgICAgVGhhbmtzIHRvIE5hbSBULiBOZ3V5ZW4gZm9yIHRoZSByZXBvcnQuIChiaWxsYmFya2VyKSAKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNzA2MDwvYnVnPjogQWN0dWFsbHkgY29weSB0aGUgUmVxdWVzdCBoZWFkZXJzIHdoZW4gcmVwbGF5aW5nIGFmdGVyIEZvcm0gYXV0aC4gKGJpbGxiYXJrZXIpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzc1OTE8L2J1Zz46IFR5cG8gaW4gRW5naW5lIGNvbmZpZ3VyYXRpb24gcmVmZXJlbmNlLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzc2Njg8L2J1Zz46IEFkZGVkIG5vdGUgYWJvdXQgSlNQIHJlY29tcGlsYXRpb24gdG8gQ29udGV4dCBjb25maWd1cmF0aW9uIGRvY3VtZW50YXRpb24uICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNzEzMjwvYnVnPjogSGF2ZSBEaWdlc3RBdXRoZW50aWNhdG9yIEhhbmRsZSB1c2VyIG5hbWVzIHdpdGggY29tbWFzLiAgVGhhbmtzIHRvIAorICAgICAgICAgIFJvYmVydCBXaWxsZSBmb3IgdGhlIHBhdGNoLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzcyMTI8L2J1Zz46IEJldHRlciBlcnJvciByZXBvcnRpbmcgaW4gQ29ubmVjdG9yLmphdmEuICBUaGFua3MgdG8gUmFsZiBIYXVzZXIgZm9yCisgICAgICAgIHRoZSBwYXRjaC4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ295b3RlIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgR3JhY2VmdWxseSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgc29tZSBTb2NrZXQgb3B0aW9ucyBhcmUgZGlzYWJsZWQgYXQgCisgICAgICAgIHRoZSBPUyBsZXZlbCBmb3IgdGhlIEFKUC8xLjMgQ29ubmVjdG9yLiAoYmlsbGJhcmtlcikKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNjM2NjwvYnVnPjogVXNlIHJld3JpdHRlbiBkZXBsb3llci1ob3d0byBwYWdlIGJ5IEFsbGlzdGFpciBDcm9zc2xleS4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxhZGQ+CisgICAgICAgIDxidWc+MzY2MzA8L2J1Zz46IEFkZGVkIGV4dHJhIGxvZyBvdXRwdXQgZm9yIGNsYXNzIGluc3RhbnRpYXRpb24gZmFpbHVyZS4gKHlvYXZzKQorICAgICAgPC9hZGQ+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM3MTIxPC9idWc+OiBTZW5kZmlsZSBhbHdheXMgbmVlZHMgdG8gYmUgZ2l2ZW4gdGhlIGxlbmd0aCBvZiBkYXRhIHRvIHdyaXRlLAorICAgICAgICB3aGljaCBmaXhlcyByYW5nZWQgcmVxdWVzdHMuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBPcHRpbWl6ZWQgZGlyZWN0IGJ5dGUgYnVmZmVycyBhc3NvY2lhdGlvbiB3aXRoIHRoZSBzb2NrZXQgZm9yIEFQUiBjb25uZWN0b3JzLiAobXR1cmspCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBoaWRkZW4gTlBFcyB3aGVuIHVzaW5nIHRoZSBBUFIgY29ubmVjdG9ycyBhbmQgdGhlcmUncyBubyBob3N0IGhlYWRlci4gKHBlcm8sIHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEh0dHAxMVByb3RvY29sIG5vdyByZWdpc3RlciBSZXF1ZXN0UHJvY2Vzc29yIGF0IEpNWCBhbmQgc2hvdyBjdXJyZW50IHVzYWdlIGluc2lkZSBtYW5hZ2VyIGFwcC4gKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICAgIDxhZGQ+CisgICAgICAgIEprU3RhdHVzIEFudCB0YXNrcyBmb3IgbW9kX2prIDEuMi4xNS4gKHBlcm8pCisgICAgICA8L2FkZD4KKyAgICAgIDx1cGRhdGU+Q29ubmVjdGlvbiBUaW1lb3V0IGlzIG5vcm1hbCwgc28gcmVkdWNlIGxvZ2dpbmcgdG8gREVCVUcgKGJpbGxiYXJrZXIpIAorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICBGaXggY3Jhc2ggd2hpY2ggY291bGQgb2NjdXIgd2l0aCB0aGUgSFRUUCBBUFIgY29ubmVjdG9yIHdoZW4gYWNjZXNzaW5nIHJlcXVlc3QgSk1YIG9iamVjdHMKKyAgICAgICAgb3V0c2lkZSBvZiB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgc2FpZCByZXF1ZXN0IChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM3NjI3PC9idWc+OiBGaXggYnVmZmVyaW5nIGlzc3VlIGluIHRoZSBIVFRQIEFQUiBjb25uZWN0b3Igd2hlbiBhIGxhcmdlIGJ1ZmZlciBzaXplIHdhcworICAgICAgICB1c2VkIGZvciBzZXJ2bGV0cyAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNzY3MzwvYnVnPjogRml4IGltcGxlbWVudGF0aW9uIG9mIGdldExvY2FsUG9ydCBhbmQgZ2V0TG9jYWxBZGRyIGluIHRoZSBIVFRQIEFQUiBjb25uZWN0b3IKKyAgICAgICAgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICA8c3Vic2VjdGlvbiBuYW1lPSJKYXNwZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM1MjUyPC9idWc+OiBKYXNwZXIgUGFnZURhdGFJbXBsIG91dHB1dHMgbWFsZm9ybWVkIFhNTC4gIFBhdGNoIGJ5IFJhaHVsIEFrb2xrYXIuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGFkZD4KKyAgICAgICAgPGJ1Zz4zNzA2MjwvYnVnPjogSGVscGZ1bCBKU1AgZXhjZXB0aW9uIG1lc3NhZ2UgY29udGFpbmluZyBmaWxlLCBsaW5lIG51bWJlcnMuICBQYXRjaCBieQorICAgICAgICBUaW0gRmVubmVsbCBhdCBodHRwOi8vd3d3LnRmZW5uZS5jb20vamFzcGVyLy4gKHlvYXZzKQorICAgICAgPC9hZGQ+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM3NDA3PC9idWc+OiBGaWxlIGRlc2NyaXB0b3IgbGVhayBpbiBKc3BSZWFkZXIuICBUaGFua3MgdG8gRnJlZCBmb3IgdGhlIHBhdGNoLiAgSSBhbHNvCisgICAgICAgIGRpZCBzb21lIG1pbm9yIGNsZWFudXAgaW4gdGhlIGNsYXNzLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxhZGQ+CisgICAgICAgIDxidWc+Mzc2MTI8L2J1Zz46IEFkZCBmaWxlIGxvY2F0aW9uIHRvIEpTUCBWYWxpZGF0b3IgZXJyb3IgbWVzc2FnZS4gIFRoYW5rcyB0byBSZW5hdWQgQnJ1eWVyb24KKyAgICAgICAgZm9yIHRoZSBwYXRjaC4gKHlvYXZzKQorICAgICAgPC9hZGQ+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2x1c3RlciI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCB0aGF0IHNlc3Npb24gcmVwbGFjZSBtZXNzYWdlcyBhcmUgbG9nZ2VkIGFmdGVyIG5vZGUgcmVjb3ZlcnkgZ2V0IGFsbCBzZXNzaW9uIGZyb20gbWFzdGVyIG5vZGUuIChwZXJvKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM3ODk2PC9idWc+IEZpeCB0aGF0IHNlbmRNZXNzYWdlIHNpZ25hdHVyZSBhdCBhbGwgRGF0YVNlbmRlciBzdWJjbGFzc2VzIG11c3QgYmUgY2hhbmdlZC4KKyAgICAgICAgTm93IHBvb2xlZCBhbmQgYXN5bmMgbW9kZXMgd29ya2luZyBhcyBleHBlY3RlZC4gKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCB0aGF0IHNvY2tldCBhdCBvLmEuYy5jbHVzdGVyLnRjcC5GYXN0QXN5bmNTb2NrZXRTZW5kZXIgY2FuIGJlIGRpc2Nvbm5lY3QvY29ubmVjdC4gKHBlcm8pCisgICAgICA8L2ZpeD4gICAgCisgICAgICA8Zml4PgorICAgICAgICBGaXggY2x1c3RlciBtb2R1bGUgYnVpbGQueG1sIHNjcmlwdCBmb3IgbmV3IHN2biByZXBvc2l0b3J5IHN0cnVjdHVyZSAocGVybykKKyAgICAgIDwvZml4PiAgICAKKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBjbG9zZWQgc29ja2V0IGV4Y2VwdGlvbnMgYXQgbm9ybWFsIHNlcnZlciBzaHV0ZG93biwgcmVwb3J0ZWQgYnkgT2x2ZSBIYW5zZW4gKHBlcm8pCisgICAgICA8L2ZpeD4gICAgCisgICAgICA8Zml4PgorICAgICAgICBGaXggY2xvc2VkIHNvY2tldCBleGNlcHRpb25zIGluc2lkZSBhc3luYyBtZXNzYWdlIHRyYW5zZmVyIG1vZGVzIChwZXJvKQorICAgICAgPC9maXg+ICAgIAorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNDk4NDwvYnVnPjogSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQuZ2V0VmFsdWUoKSBnZXQgY29ycmVjdCB2YWx1ZSAocGVybykKKyAgICAgIDwvZml4PiAgICAKKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzU5MTY8L2J1Zz46IHNlbmQgc2Vzc2lvbkNyZWF0ZWQgdG8gU2Vzc2lvbkxpc3RlbmVyIGFmdGVyIGNsdXN0ZXIgbm9kZSByZWNvdmVyeSAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNjU0MTwvYnVnPjogVXNlZCBhbHNvIEhhc2h0YWJsZSBhdCBEZWx0YVNlc3Npb24gKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEJldHRlciBzdXBwb3J0IGNsdXN0ZXIgYXQgZW5naW5lIGxldmVsLiAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNjg2NjwvYnVnPjogQ29ycmVjdCBhdHRyaWJ1dGUgbmFtZSBpbiBjb25mL3NlcnZlci54bWwgZG9jdW1lbnRhdGlvbiBmb3IgQ2x1c3RlciBlbGVtZW50LiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzcyNjE8L2J1Zz46IEFsbG93IHhlcmNlcyB0byBrbm93IHdoZXJlIHRoZSB3ZWIueG1sIGZpbGUgaXMgc28gdGhhdCByZWxhdGl2ZSBlbnRpdGllcyBjYW4gYmUgcmVzb2x2ZWQuCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mzc1Mjk8L2J1Zz46IEZpeGVkIHJhY2UgY29uZGl0aW9uIGluIFJlcGxpY2F0aW9uTGlzdGVyI3N0b3BMaXN0ZW5pbmcuICBUaGFua3MgdG8gCisgICAgICAgIENocmlzIFdhbGtlciBmb3IgdGhlIHBhdGNoLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICA8c3Vic2VjdGlvbiBuYW1lPSJXZWJhcHBzIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD5SZW1vdmUgb2Jzb2xldGUgVGFnUGx1Z2luIGZpbGUgZnJvbSBKU1AgZXhhbXBsZXMgKGJpbGxiYXJrZXIpPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM2MDE5PC9idWc+OiBNYWRlIGNsZWFyIHRoZSBIb3N0LU1hbmFnZXIgSG93VG8gaXMgY29taW5nIHNvb24sIG5vdCByZWFkeSB5ZXQuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNjMzNjwvYnVnPjogQ2hlY2sgV0FSIGV4dGVuc2lvbiBpbiBib3RoIHVwcGVyIGFuZCBsb3dlciBjYXNlLCBhcyBzdWdnZXN0ZWQgYnkKKyAgICAgICAgQS4gR3Jhc29mZi4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM1OTgyPC9idWc+OiBDYW4ndCBkZWxldGUgbWFpbCBzZXNzaW9ucyBpbiBhZG1pbiB3ZWJhcHAuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNjY3MzwvYnVnPjogU2ltaWxhciB0byB0aGUgb25lIGFib3ZlLCBmb3IgZGF0YSBzb3VyY2VzLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJUb21jYXQgNS41LjEyICh5b2F2cykiPgorICA8c3Vic2VjdGlvbiBuYW1lPSJHZW5lcmFsIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgUmVtb3ZlIHVuZWVkZWQgZmlsZXMgaW4gY29uZi4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIENoYW5nZSBkaXN0cmlidXRpb24gZmlsZSBuYW1lcyBmcm9tIGpha2FydGEtKiB0byBhcGFjaGUtKi4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICAKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2F0YWxpbmEiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8YWRkPgorICAgICAgICBBZGQgSk1YIFJlbW90ZSBjcmVhdGUgYW5kIHVucmVnaXN0ZXIgYW50IHRhc2tzIChwZXJvKQorICAgICAgPC9hZGQ+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM2MzQzPC9idWc+OiBPbmx5IG5vcm1hbGl6ZSBvdXQgYmFja3NsYXNoIG9uIFdpbmRvd3MgcGxhdGZvcm1zLiAoYmlsbGJhcmtlcikKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgQWxsb3cgY29uZmlndXJpbmcgc3RhbmRhcmQgc3RyZWFtIHJlZGlyZWN0aW9uLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGFkZD4KKyAgICAgICAgPGJ1Zz4zNjA4ODwvYnVnPjogQWRkIFJVTk5JTkcudHh0IGFuZCBSRUxFQVNFLU5PVEVTLnR4dCB0byBmdWxsZG9jcyBkaXN0cm8uICh5b2F2cykKKyAgICAgIDwvYWRkPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNjUzNDwvYnVnPjogZml4IGVxdWFscyBmb3IgVVJMcyByZXR1cm5lZCBieSBTZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZSgpIChsdWVoZSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNjU1ODwvYnVnPjogQ2xlYXIgSW50cm9zcGVjdGlvblV0aWxzIGNhY2hlIHdoZW4gc3RvcHBpbmcgYSB3ZWJhcHAsIGFzIGl0IAorICAgICAgICBjb3VsZCBsZWFrIHRvIGtlZXBpbmcgYSByZWZlcmVuY2UgdG8gdGhlIGNsYXNzbG9hZGVyIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM2MTEzPC9idWc+OiBTZXNzaW9uIHBlcnNpc3RlbmNlIGZvciBvYmplY3RzIHdpdGggcHJpbWl0aXZlIHR5cGVzIGNvdWxkIGZhaWwgaW4KKyAgICAgICAgc29tZSByYXJlIGNhc2VzIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM2NTQxPC9idWc+OiBGdWxsIHN5bmNocm9uaXphdGlvbiBmb3Igc2Vzc2lvbiBvYmplY3RzIGF0dHJpYnV0ZXMgY29sbGVjdGlvbnMgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzU2MDk8L2J1Zz46IHNlcnZpY2UuYmF0IGVjaG8gY29tbWFuZCB3aGVuIHdyb25nIGFyZ3VtZW50cyBnaXZlbiBbcGF0Y2ggYnkgUm9iZXJ0CisgICAgICAgIExvbmdzb25dICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNDc0OTwvYnVnPjoganNlc3Npb25pZCBkcm9wcGVkIG9uIHRyYWlsaW5nIHNsYXNoICgvKSByZWRpcmVjdCAocmVtbSkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgIAorICAgPHN1YnNlY3Rpb24gbmFtZT0iQ295b3RlIj4KKyAgICAgPGNoYW5nZWxvZz4KKyAgICAgICA8dXBkYXRlPgorICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIHNlY3JldCBmb3IgQUpQIEFQUiAocmVtbSkKKyAgICAgICA8L3VwZGF0ZT4KKyAgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJKYXNwZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICBGaXggTlBFIHdpdGggYW4gZXJyb3IgbWVzc2FnZSB3aGVuIG5vIEphdmEgY29tcGlsZXIgaXMgYXZhaWxhYmxlIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBSZXN0cmljdCBTeXN0ZW0gZXJyIHN0cmVhbSBjYXB0dXJlIHRvIHRoZSBBbnQgY29tcGlsZXIsIGFzIHRoZSBFY2xpcHNlIGNvbXBpbGVyCisgICAgICAgIGRvZXMgbm90IG5lZWQgaXQgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEpTUCBjb21waWxhdGlvbiBzcGVlZCBpbXByb3ZlbWVudCB1c2luZyB0YWcgbGlicmFyeSBpbmZvcm1hdGlvbiBjYWNoaW5nLCAKKyAgICAgICAgc3VibWl0dGVkIGJ5IFhpbmdibyBHYW8gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxhZGQ+CisgICAgICAgIEluaXRpYWwgY29udHJpYnV0aW9uIG9mIEpTVEwgdGFnIHBsdWdpbnMgc3VwcG9ydGluZyB0aGUgY29yZSB0YWcgbGlicmFyeSBvZgorICAgICAgICBKU1RMLCBzdWJtaXR0ZWQgYnkgSmluZyBMaSAocmVtbSkKKyAgICAgIDwvYWRkPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgIAorICA8c3Vic2VjdGlvbiBuYW1lPSJDbHVzdGVyIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNjU0MTwvYnVnPjogU3luYyBhbGwgc2Vzc2lvbiBhdHRyaWJ1dGUgYWNjZXNzIChyZWFkIGFuZCB3cml0ZSkgYXQgRGVsdGFTZXNzaW9uIChwZXJvKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM2NTE4PC9idWc+OiBDbGFzc25hbWUgdHlwb3MgZm9yIHNlbmRlcnMsIHN1Ym1pdHRlZCBieSBDaHJpc3RvcGggQmFjaGh1YmVyLUhhbGxlciAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGFkZD4KKyAgICAgICAgPGJ1Zz4zNTYxMzwvYnVnPjogQWRkZWQgRkFRIHF1ZXN0aW9uIGFuZCBhbnN3ZXIgYWJvdXQgdGNwTGlzdGVuQWRkcmVzcz0iYXV0byIgYW5kIC9ldGMvaG9zdHMgKHlvYXZzKQorICAgICAgPC9hZGQ+CisgICAgICA8dXBkYXRlPgorICAgICAgICBNb3ZlZCBGQVEgc2VjdGlvbiBmb3IgQ2x1c3RlcmluZyBmcm9tIENsdXN0ZXJpbmcgSG93VG8gcGFnZSB0byBpdHMgb3duIEZBUSBwYWdlLiAoeW9hdnMpCisgICAgICA8L3VwZGF0ZT4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICAKKyAgPHN1YnNlY3Rpb24gbmFtZT0iV2ViYXBwcyI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxkb2NzPgorICAgICAgICA8YnVnPjM2MzE5PC9idWc+OiBGaXggYnJva2VuIGxpbmsgdG8gREJDUCBkb2NzLCBzdWJtaXR0ZWQgYnkgWGF2aWVyIFBvaW5zYXJkIChyZW1tKQorICAgICAgPC9kb2NzPgorICAgICAgPGRvY3M+CisgICAgICAgIEJyYW5kIG5ldyBkZXBsb3llciBzcGVjcywgc3VibWl0dGVkIGJ5IEFsbGlzdGFpciBDcm9zc2xleSAocmVtbSkKKyAgICAgIDwvZG9jcz4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorIDwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVG9tY2F0IDUuNS4xMSAoeW9hdnMpIj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iR2VuZXJhbCI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFVwZGF0ZSB0byBYZXJjZXMgMi43LjEgKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxhZGQ+CisgICAgICAgIEFkZCByZWFkeSB0byBidWlsZCBiaW4vdG9tY2F0LW5hdGl2ZS50YXIuZ3ogZm9yIHRoZSBBUFIgSk5JIHdyYXBwZXIgbGlicmFyeSAocmVtbSkKKyAgICAgIDwvYWRkPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNTkzMDwvYnVnPjogQmFkIGxvZ2dpbmcgY29uZmlnIHVzZWQgYnkgdGhlIFRvbWNhdCBXaW5kb3dzIHNlcnZpY2UgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxhZGQ+CisgICAgICAgIDxidWc+MzMyNjE8L2J1Zz46IFdpbmRvd3MgaW5zdGFsbGVyIG5vdyBjaGVja3MgdGhlIHVzZXIgdHlwZSBhbmQgd2FybnMgbm9uLWFkbWlucyBhcyBuZWVkZWQuICh5b2F2cykKKyAgICAgIDwvYWRkPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgVGhlIFdpbmRvd3MgaW5zdGFsbGVyIHdpbGwgbm93IG9wdGlvbmFsbHkgZG93bmxvYWQgYSAoMzJiaXQpIFdpbmRvd3MgLmRsbCBmb3IgVG9tY2F0IG5hdGl2ZQorICAgICAgICBmcm9tIEhFQW5ldCAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgRGVjbGFyYXRpb24gb2YganNwYyBBbnQgdGFzayB0byBmaXggdGhlIGRlcGxveWVyIHBhY2thZ2UgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICAKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2F0YWxpbmEiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8YWRkPgorICAgICAgICBBZGQgY29uY3VycmVuY3kgY29udHJvbCB2YWx2ZSAoby5hLmMudmFsdmVzLlNlbWFwaG9yZVZhbHZlKS4gQXMgdGhlIFRvbWNhdCBkaXN0cmlidXRpb24gCisgICAgICAgIGlzIG5vdCBidWlsdCBmb3IgSmF2YSA1LCB0aGUgdmFsdmUgd2lsbCBoYXZlIHRvIGJlIGNvbXBpbGVkIGZyb20gdGhlIHNvdXJjZXMgCisgICAgICAgIHVzaW5nIEphdmEgNSAocmVtbSkKKyAgICAgIDwvYWRkPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNTg4MDwvYnVnPjogSWdub3JlIEpTU0UxNVNvY2tldEZhY3Rvcnkgd2hlbiBnZW5lcmF0aW5nIEphdmFEb2MsIGFzIGl0IGJyZWFrcworICAgICAgICAgIHRoZSBKREsgMS40IEphdmFEb2MgdG9vbC4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM1ODY1PC9idWc+OiBzZXRjbGFzc3BhdGguc2ggY2Fubm90IGJlIGV4Y3V0aXZlIHVuZGVyIGN5Z3dpbi4gKGZ1bmttYW4pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzMyNjc8L2J1Zz46IFNldCB3b3JraW5nIHBhdGggaW4gc2VydmljZSBpbnN0YWxsZXIsIGFzIHN1Z2dlc3RlZCBieSBEb21pbmlrCisgICAgICAgICAgRHJ6ZXdpZWNraS4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICA8YnVnPjM0Nzk0PC9idWc+OiBVcGRhdGUgY29ubmVjdG9yIGRvY3VtZW50YXRpb24gdG8gaW5jbHVkZSBjbGllbnRBdXRoIGF0dHJpYnV0ZS4gKHlvYXZzKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM1ODk0PC9idWc+LCA8YnVnPjM2MjI4PC9idWc+OiBGaXggQ05GRSB3aGVuIHN0YXJ0aW5nIGluIGEgc2FuZGJveC4gKGJpbGxiYXJrZXIsIHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEFkZCB2ZXJzaW9uIGNoZWNrIGZvciBUb21jYXQgbmF0aXZlIHNvIHRoYXQgaW5jb21wYXRpYmxlIEFQSSBjaGFuZ2VzIGFyZSBkZXRlY3RlZCBlYXJseSAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNjAyMDwvYnVnPjogQWxsb3cgTWVtb3J5VXNlckRhdGFiYXNlIHRvIHdvcmsgYmV0dGVyIG9uIHdyaXRlIHByb3RlY3RlZCBtZWRpdW1zLAorICAgICAgICBzdWJtaXR0ZWQgYnkgUmFpbmVyIEp1bmcgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzU5Nzg8L2J1Zz46IEJhZCBoYW5kbGluZyBvZiBzaW5nbGUgcmFuZ2UgcmVxdWVzdHMgZ3JlYXRlciB0aGFuIDJHQiBpbiB0aGUgRGVmYXVsdFNlcnZsZXQKKyAgICAgICAgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzU5ODQ8L2J1Zz46IENsaWVudCBhYm9ydCBleGNlcHRpb25zIHdpbGwgbm93IHVzZSBnZXRDYXVzZSAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IGhhbmRsaW5nIG9mIG5vbi1maWxlIGJhc2VkIGluY2x1ZGVzIHdpdGggU1NJLCBzdWJtaXR0ZWQgYnkgRGF2aWQgQmVja2VyIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgIAorICAgPHN1YnNlY3Rpb24gbmFtZT0iQ295b3RlIj4KKyAgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBkZWZhdWx0IHBvcnRzIGZvciBodHRwIGFuZCBodHRwcyB3aGljaCBhcmUgc2V0IGluIHRoZSByZXF1ZXN0IHdoZW4gdGhlIHBhcnNlZAorICAgICAgICBob3N0bmFtZSBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBwb3J0LCBhbmQgd2hpY2ggd2VyZSBpbnZlcnRlZCAoaHR0cHMgd2FzIHNldCBhcyA4MCAKKyAgICAgICAgYW5kIGh0dHAgYXMgNDQzKS4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEFkZCBtaXNzaW5nIHRvbWNhdEF1dGhlbnRpY2F0aW9uIGF0dHJpYnV0ZSB0byB0aGUgQUpQIEFQUiBpbXBsZW1lbnRhdGlvbi4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIENoZWNrIGZpbGVuYW1lIHNlbmRmaWxlIGF0dHJpYnV0ZSBvbmx5IGlmIHNlbmRmaWxlIGlzIGVuYWJsZWQuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBGaXggb3V0cHV0IGJ1ZmZlcmluZyBmb3IgQVBSIEFKUCBpbXBsZW1lbnRhdGlvbi4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzU5NDE8L2J1Zz46IEZpeCBnZXRSZW1vdGVBZGRyIGZvciBBUFIgQUpQIGltcGxlbWVudGF0aW9uLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNTk0MjwvYnVnPjogRml4IE5QRSByZXRyaXZpbmcgY2lwaGVyIHN1aXRlIGF0dHJpYnV0ZSB3aGVuIG5vIGNlcnRpZmljYXRlIAorICAgICAgICB3YXMgc3VibWl0dGVkIChmb3IgZXhhbXBsZSB3aXRoIG5vIFNTTCkuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBJbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgY29kZSBjbGVhbnVwcyBmb3IgQVBSIEFKUCBpbXBsZW1lbnRhdGlvbi4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIFNlY3VyaXR5IGV4Y2VwdGlvbiBpbiBBUFIgQUpQIGltcGxlbWVudGF0aW9uIHdoZW4gcnVubmluZyB3aXRoIHRoZSBzZWN1cml0eQorICAgICAgICBtYW5hZ2VyIGVuYWJsZWQuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM2MTczPC9idWc+OiBBZGQgbWlzc2luZyBzeW5jIGluIEZhc3RIdHRwRGF0ZUZvcm1hdC5mb3JtYXREYXRlLCBzdWJtaXR0ZWQgCisgICAgICAgIGJ5IEFsZXhlaSBLcmFpbmlvdWsgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIERpc2FibGUgSFRUUCBjb21wcmVzc2lvbiB3aGVuIHNlbmRmaWxlIGlzIHVzZWQgZm9yIGEgcmVzb3VyY2UgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEFKUCBzZWNyZXQgYXR0cmlidXRlIHJlcG9ydCBvbmx5IGF0IHRyYWNlIGxldmVsLiAocGVybykKKyAgICAgIDwvZml4PgorICAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9Ikphc3BlciI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzYxMjc8L2J1Zz46IFZhbGlkYXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIFhlcmNlcyAyLjcuMSwgc3VibWl0dGVkIAorICAgICAgICBieSBGbG9yZW50IEJlbm9pdCAocmVtbSkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgIAorICA8c3Vic2VjdGlvbiBuYW1lPSJDbHVzdGVyIj4KKyAgICA8Y2hhbmdlbG9nPiAgICAgICAgCisgICAgICA8Zml4PgorICAgICAgICBGaXggTlBFIHdoZW4gY2x1c3RlciBzdG9wcyAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNjIxODwvYnVnPjogTWVtb3J5UmVhbG0gbm93IHN1cHBvcnQgYWxzbyBHZW5lcmljUHJpbmNpcGFsLCBidXQgCisgICAgICAgIEpBQVNSZWFsbSB3aXRoIGNsdXN0ZXIgcmVwbGljYXRpb24gc3RpbGwgaGFzIGEgcHJvYmxlbSwgZGV0ZWN0ZWQgYnkgRGlyayBEZWtvayAocGVybykKKyAgICAgIDwvZml4PiAgIAorICAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICAKKyAgPHN1YnNlY3Rpb24gbmFtZT0iV2ViYXBwcyI+CisgICAgPGNoYW5nZWxvZz4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorIDwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVG9tY2F0IDUuNS4xMCAoeW9hdnMpIj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iR2VuZXJhbCI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxhZGQ+CisgICAgICAgICBBZGQgSk1YIHJlbW90ZSBhbnQgdGFzayB0byBjb250cm9sIHRvbWNhdCBNQmVhbnNlcnZlciB2aWEgYW50IHNjcmlwdHMuCisgICAgICAgICBBbnQgbGliIGlzIGluY2x1ZGVkIGF0ICJzZXJ2ZXIvbGliL2NhdGFsaW5hLWFudC1qbXguamFyIiBhbmQgZG9jdW1lbnRhdGlvbgorICAgICAgICAgaXMgYWRkZWQgdG8gPGEgaHJlZj0ibW9uaXRvcmluZy5odG1sIj5Nb25pdG9yaW5nIGFuZCBNYW5hZ2luZyBUb21jYXQgSG93LVRvPC9hPiAocGVybykKKyAgICAgIDwvYWRkPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNDM2MTwvYnVnPjogSW50ZWdyYXRlIGJldHRlciBhbnRsaWIgYW5kIGltcG9ydCBzdXBwb3J0IGZvciAKKyAgICAgICAgY2F0YWxpbmEgbWFuYWdlciB0YXNrcyBbTW9kaWZpZWQgcGF0Y2ggZnJvbSBEYW5pZWwgU2FudG9zXSAgKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIFN0b3JlQ29uZmlnIHNhdmUgbm93IHRoZSBDb25uZWN0b3Iuc3NsUHJvdG9jb2wgYXR0cmlidXRlLiAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgQ2hhbmdlIGxvZyBkaXIgYXQgc2VydmljZS5iYXQgdG8gIiRDQVRBTElOQV9CQVNFL2xvZ3MiIGZvciBiZXR0ZXIgbXVsdGkgaW5zdGFuY2Ugc3VwcG9ydC4gKHBlcm8pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIDxidWc+MzQyMzc8L2J1Zz46IEFkZGVkIG5vdGUgYW5kIGxpbmtzIHRvIGNvbnRleHQgYW5kIGhvc3QgY29uZmlndXJhdGlvbgorICAgICAgICAgIHJlZmVyZW5jZXMgaW4gSk5ESSBEYXRhU291cmNlcyBIb3dUbyB0byBhaWQgdGhlIGNsdWVsZXNzLiAoeW9hdnMpCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIDxidWc+MzQyNDg8L2J1Zz46IFVwZGF0ZSBKYXZhTWFpbCBkb3dubG9hZCBpbnN0cnVjdGlvbnMgdG8gaW5jbHVkZSBKQUYuICh5b2F2cykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgVXBkYXRlIHRvIEpEVCBmcm9tIEVjbGlwc2UgMy4xLCB3aXRoIHN1cHBvcnQgZm9yIEphdmEgNSAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVmYWN0b3JpbmcsIHJlZGVzaWduIGFuZCBleHRlbmQgdGhlIGNsdXN0ZXIgbW9kdWxlCisgICAgICAgICAgLSBDbHVzdGVyIGNhbiBiZSBjb25maWd1cmVkIGFzIHN1YmVsZW1lbnQgZnJvbSBFbmdpbmUgYW5kIEhvc3QuCisgICAgICAgICAgLSBPcHRpbWl6ZWQgcGVyZm9ybWFuY2UgYW5kIHJlZHVjZSBtZW1vcnkgdXNhZ2UKKyAgICAgICAgICAtIEJldHRlciBKTVggc3VwcG9ydAorICAgICAgICAgIC0gYWRkIGEgbG90IG9mIEpNWCBzdGF0cyBhdHRyaWJ1dGUgZm9yIGJldHRlciBtb25pdG9yaW5nIAorICAgICAgICAgIC0gYWRkIGEgc2luZ2xlIGVsZW1lbnQgZGVmYXVsdCBjbHVzdGVyIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAtIG1vcmUgY29uZmlnIG9wdGlvbnMKKyAgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lcgorICAgICAgICAgICAgIENsdXN0ZXJMaXN0ZW5lcgorICAgICAgICAgICAgIG1vcmUgdGhhbiBvbmUgY2x1c3RlciB2YWx2ZXMKKyAgICAgICAgICAtIGJldHRlciBzdWJjbGFzcyBzdXBwb3J0CisgICAgICAgICAgLSBjaGFuZ2UgYSBsb3Qgb2YgZXhpc3RpbmcgY2x1c3RlciBBUEkncyAocGVybykKKyAgICAgICA8L3VwZGF0ZT4KKyAgICAgICA8YWRkPgorICAgICAgICAgQWRkIEFwYWNoZSBQb3J0YWJsZSBSdW50aW1lIEpOSSB3cmFwcGVyIGFuZCBoZWxwZXIgQVBJIChtdHVyaykKKyAgICAgICA8L2FkZD4KKyAgICAgICA8dXBkYXRlPgorICAgICAgICAgVXBkYXRlIEpVTEkgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0YWtpbmcgb3ZlciBqYXZhLnV0aWwubG9nZ2luZyBib290c3RyYXAgY29uZmlndXJhdGlvbiwKKyAgICAgICAgIGFuZCBtb3ZlIHRoZSBkZWZhdWx0IHByb3BlcnRpZXMgZmlsZSB0byAke2NhdGFsaW5hLmJhc2V9L2NvbmYvbG9nZ2luZy5wcm9wZXJ0aWVzIChyZW1tKQorICAgICAgIDwvdXBkYXRlPgorICAgICAgIDxmaXg+CisgICAgICAgICA8YnVnPjM0NzQ2PC9idWc+OiBVcGRhdGVkIGNhdGFsaW5hLnByb3BlcnRpZXMgaW5zdHJ1Y3Rpb25zIHBlciBCaWxsIEVkd2FyZHMnIHN1Z2dlc3Rpb24uICh5b2F2cykKKyAgICAgICA8L2ZpeD4KKyAgICAgICA8Zml4PgorICAgICAgICAgPGJ1Zz4zNTA5MDwvYnVnPjogTWlub3IgZG9jdW1lbnRhdGlvbiB0eXBvIGZpeC4gKHlvYXZzKQorICAgICAgIDwvZml4PgorICAgICAgIDxmaXg+CisgICAgICAgICA8YnVnPjM0OTMxPC9idWc+OiBSZXdyb3RlIFJPT1QvaW5kZXguanNwIHRvIGJlIFhIVE1MIHN0cmljdCBjb21wbGlhbnQsIHBlciBSaWNoYXJkCisgICAgICAgICAgIEJldG9uJ3MgcGF0Y2guICh5b2F2cykKKyAgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICAKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2F0YWxpbmEiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjIwMzgwPC9idWc+OiBBY2Nlc3MgbG9nIHRpbWVzdGFtcHMgbm93IHRha2UgYWNjb3VudCBvZiBEYXlsaWdodCBTYXZpbmcKKyAgICAgICAgVGltZSAoRFNUKS4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8YWRkPgorICAgICAgICA8YnVnPjM0MjIwPC9idWc+OiBQcm92aWRlIGJldHRlciBlcnJvciBtZXNzYWdlIHdoZW4gc2VydmVyLnhtbCBjYW4ndCBiZSBsb2NhdGVkLgorICAgICAgICAgIFtNb2RpZmllZCBwYXRjaCBmcm9tIFJhbGYgSGF1c2VyXSAoeW9hdnMpCisgICAgICA8L2FkZD4KKyAgICAgIDxhZGQ+CisgICAgICAgICAgQWRkIE1lc3NhZ2VMaXN0ZW5lciBhbmQgTGlmZWN5bGNlTGlzdGVuZXIgY2x1c3RlciBzYXZpbmcgdG8gc3RvcmVjb25maWcgbW9kdWxlCisgICAgICAgICAgKCZsdDtDbHVzdGVyIC4uLiAmZ3Q7Jmx0O0NsdXN0ZXJMaXN0ZW5lciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uLkp2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXIiICZndDspIChwZXJvKQorICAgICAgPC9hZGQ+ICAKKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzM3NDM8L2J1Zz46IEFkZCBhZGRpdGlvbmFsIHN5bmNocm9uaXphdGlvbiBpbiB3ZWJhcHAgY2xhc3Nsb2FkZXIgdG8gYXZvaWQKKyAgICAgICAgcG9zc2libGUgcmFjZSBjb25kaXRpb24gd2hlbiBkZWZpbmluZyBhIGNsYXNzIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMzNzExPC9idWc+OiBBZGQgZXZlbnRzIG9uIHBhc3NpdmF0ZSBhbmQgYWN0aXZhdGUgdG8gY2xlYW51cCBTU08sIGFuZCByZWN5Y2xlCisgICAgICAgIHNlc3Npb24gb2JqZWN0cyB3aGVuIHJlbW92aW5nIHRoZW0gZnJvbSBhIG1hbmFnZXIgKHNvIHRoYXQgYW55b25lIGtlZXBpbmcgcmVmZXJlbmNlcworICAgICAgICB0byBpdCB3b3VsZCBsZWFrIGEgbWluaW1hbCBhbW91bnQgb2YgbWVtb3J5KSAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmUtYWRkIHBhdGNoIGNhdXNpbmcgU2Vzc2lvbi5nZXRJZCB0byB0aHJvdyBhbiBJU0UsIGFuZCBtYWtlIGFsbCBpbnRlcm5hbCBjb21wb25lbnRzCisgICAgICAgIHVzZSBhIHNhZmUgZ2V0SWRJbnRlcm5hbCBtZXRob2QgKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFN0b3JlIHByaW5jaXBhbCB0byBiZSBleHBvc2VkIGZvciBSZXF1ZXN0LmdldFVzZXJQcmluY2lwYWwgaW5zaWRlIHRoZSBHZW5lcmljUHJpbmNpcGFsLAorICAgICAgICB0byByZW1vdmUgaGFja3MgZnJvbSB0aGUgSkFBUyByZWFsbSAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4xMDM4NTwvYnVnPjogU1NJIFNlcnZsZXQgbm93IGluY2x1ZGVzIGJldHRlciBzdXBwb3J0IGZvciBmaWxlcyB0aGF0IHVzZSBjaGFyYWN0ZXIKKyAgICAgICAgZW5jb2RpbmdzIG90aGVyIHRoYW4gdGhlIHBsYXRmb3JtIGRlZmF1bHQuKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBSZW1vdmUgQ29weVBhcmVudENsYXNzTG9hZGVyIHJ1bGUsIHdoaWNoIGRvZXNuJ3Qgc2VlbSB0byBiZSBkb2luZyBhbnl0aGluZyB1c2VmdWwKKyAgICAgICAgYW55bW9yZS4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxhZGQ+CisgICAgICAgIFByb3ZpZGUgYW4gU2VydmxldEZpbHRlciBpbXBsZW1lbnRhdGlvbiBvZiBTZXJ2ZXIgU2lkZSBJbmNsdWRlcyAoU1NJKS4gVGhpcyB3YXMKKyAgICAgICAgc3VibWl0dGVkIGJ5IERhdmlkIEJlY2tlciB1bmRlciA8YnVnPjMzMTA2PC9idWc+LiAobWFya3QpCisgICAgICA8L2FkZD4KKyAgICAgIDxhZGQ+CisgICAgICAgIEFkZCBzZW5kZmlsZSBzdXBwb3J0IHRvIGRlZmF1bHQgc2VydmxldCwgd2l0aCBhIHNlbmRmaWxlU2l6ZSBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZS4KKyAgICAgICAgKHJlbW0pCisgICAgICA8L2FkZD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIElmIEFQUiBhcyB3ZWxsIGFzIFRvbWNhdCdzIEpOSSB3cmFwcGVyIGZvciBBUFIgYXJlIHByZXNlbnQsIHVzZSBBUFJpemVkIHByb3RvY29sIGhhbmRsZXJzCisgICAgICAgIGluc3RlYWQgb2YgdGhlIHJlZ3VsYXIgb25lcyAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4yMjYxNzwvYnVnPjogV2hlbiB1c2VkIHdpdGggYW4gRUpCIGNvbnRhaW5lciBhbmQgYSByZWFsbSB0aGF0IHN1cHBvcnRzIHRoZSBjb25jZXB0CisgICAgICAgIG9mIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyIChKMkVFLjMuNC4zKSBCQVNJQyBhdXRoZW50aWNhdGlvbiB3YXMgYWx3YXlzIGF1dGhlbnRpY2F0aW5nCisgICAgICAgIHVzZXJzIGFzIHRoZSB1bmF1dGhlbnRpY2F0ZWQgdXNlciB3aXRob3V0IGdpdmluZyB0aGVtIGEgY2hhbmNlIHRvIHN1cHBseSBhIHVzZXJuYW1lIGFuZAorICAgICAgICBwYXNzd29yZC4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBQcmV2ZW50IGZhY2FkZSBvYmplY3RzIGNsb25pbmcgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEFkZCBtaXNzaW5nIENHSSB2YXJpYWJsZXMgdG8gU1NJIHNlcnZsZXQuIFBhdGNoIHN1Ym1pdHRlZCBieSBGcml0eiBTY2huZWlkZXIuIChtYXJrdCkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNDU3ODwvYnVnPjogVXBkYXRlZCBKTkRJUmVhbG0gY29tbWVudC4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM0MjczPC9idWc+OiBCZXR0ZXIgQm9vdHN0cmFwIHdhcm5pbmcgbWVzc2FnZS4gW1BhdGggZnJvbSBSYWxmIEhhdXNlcl0gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICA8YnVnPjM0Njc1PC9idWc+OiBVcGRhdGVkIFByb3h5LUhvd1RvIHBhZ2Ugd2l0aCBTZXJ2bGV0IEFQSSBjYWxscy4gKHlvYXZzKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM0NTQ2PC9idWc+OiBGaXggcHJvYmxlbSB3aGVyZSB0aGUgImZpcnN0IiBWYWx2ZSBjb3VsZG4ndCBiZSByZW1vdmVkIGZyb20gYSBQaXBlbGluZS4gKGJpbGxiYXJrZXIpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBOUEUgd2hlbiBQT1NUIHNpemUgZXhjZWVkcyBsaW1pdCBkZWZpbmVkIGJ5IG1heFBvc3RTaXplLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBGT1JNIGF1dGhlbnRpY2F0aW9uIHNvIFBPU1RlZCBwYXJhbWV0ZXJzIGFyZSBub3QgYXNzdW1lZCB0byBiZSBlbmNvZGVkIHdpdGggcGxhdGZvcm0KKyAgICAgICAgZGVmYXVsdCBlbmNvZGluZy4gQSBzaWRlIGVmZmVjdCBvZiB0aGlzIGZpeCBpcyB0aGF0IHRoZSBib2RpZXMgb2YgUE9TVCByZXF1ZXN0cyB0aGF0CisgICAgICAgIHJlcXVpcmUgRk9STSBhdXRoZW50aWNhdGlvbiBhcmUgbm93IGJ1ZmZlcmVkIGFuZCBtYWRlIGF2YWlsYWJsZSBhZnRlciBhIHN1Y2Vzc2Z1bCBsb2dpbi4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM0ODQwPC9idWc+OiBCZXR0ZXIgaGFuZGxpbmcgb2YgZXh0ZXJuYWwgV0FScyByZWRlcGxveW1lbnQsIGFuZCBpZ25vcmUgZG9jQmFzZSBzcGVjaWZpZWQKKyAgICAgICAgaW4gY29udGV4dCBmaWxlIGlmIHdpdGhpbiB0aGUgSG9zdCBhcHBCYXNlIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBGaXggaGFuZGxpbmcgb2Ygc3ltYm9saWMgbGlua3Mgd2hlbiB0aGUgRGVmYXVsdFNlcnZsZXQgaXMgZ2VuZXJhdGluZyBkaXJlY3RvcnkKKyAgICAgICAgbGlzdGluZ3MuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNTc2OTwvYnVnPjogQ29ycmVjdCBpbXBsZW1lbnRhdGlvbiBvZiBqYXZheC5uYW1pbmcuQ29udGV4dC5jb21wb3NlTmFtZSggTmFtZSwgTmFtZSkKKyAgICAgICAgaW4gbXVsdGlwbGUgcGxhY2VzLiBQYXRjaCBwcm92aWRlZCBieSBMYXVyZW50IFNpbW9uLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxhZGQ+CisgICAgICAgIDxidWc+MzQ4MDU8L2J1Zz46IEFkZCB3YXJuaW5nIGZvciBzdXNwaWNpb3VzIHNlY3VyaXR5IHBhdHRlcm5zLCBhcyBzdWdnZXN0ZWQgYnkgUmFsZiBIYXVzZXIuICh5b2F2cykKKyAgICAgIDwvYWRkPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNTgxOTwvYnVnPjogVXNlIGdldFdvcmtQYXRoIGZvciBkZWxldGluZyB3b3JrIGRpcmVjdG9yeSBvbiBjb250ZXh0IGRlc3Ryb3ksIGFzIHN1Z2dlc3RlZAorICAgICAgICAgIGJ5IFJvYiBTdGVlbGUuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgIAorICAgPHN1YnNlY3Rpb24gbmFtZT0iQ295b3RlIj4KKyAgICAgPGNoYW5nZWxvZz4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEFkZCBzdXBwb3J0IGZvciB1c2luZyAiU21hcnQgQ2FyZHMiIGFzIHRydXN0L2tleVN0b3JlLiAoYmlsbGJhcmtlcikKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgQWRkIHNvbWUgTWJlYW4gYXR0cmlidXRlcyBhbmQgb3BlcmF0aW9ucyB0byBDaGFubmVsU29ja2V0IChwZXJvKQorICAgICAgPC91cGRhdGU+ICAgIAorICAgICAgPGFkZD4KKyAgICAgICAgQXBhY2hlIFBvcnRhYmxlIFJ1bnRpbWUgYmFzZWQgSFRUUC8xLjEgcHJvdG9jb2wgaGFuZGxlciwgd2l0aCBTU0wgc3VwcG9ydCAocmVtbSkKKyAgICAgIDwvYWRkPgorICAgICAgPGFkZD4KKyAgICAgICAgQWRkIHN1cHBvcnQgZm9yIHNpbXBsZSBmaWxlLWJhc2VkIENSTHMgdW5kZXIgSkRLIDEuNSAoYmlsbGJhcmtlcikKKyAgICAgIDwvYWRkPgorICAgICAgPGFkZD4KKyAgICAgICAgQWRkIGV4cGVyaW1lbnRhbCBOSU8tU29ja2V0IGNoYW5uZWwgZm9yIHRoZSBBSlAvMS4zIENvbm5lY3RvciAoYmlsbGJhcmtlcikKKyAgICAgIDwvYWRkPgorICAgICAgPGFkZD4KKyAgICAgICAgPGJ1Zz4zNDY0ODwvYnVnPjogQWRkIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRvIGVuYWJsZSBJUC1iYXNlZCBWaXJ0dWFsIEhvc3RzLiAoYmlsbGJhcmtlcikKKyAgICAgIDwvYWRkPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVmYWN0b3IgdGhlIEFKUC8xLjMgQ29ubmVjdG9yIHRvIGJlIGFibGUgdG8gaGFuZGxlIG1vcmUgYWR2YW5jZWQgQWN0aW9ucy4gKGJpbGxiYXJrZXIpCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBjb25uZWN0b3IgaW5pdGlhbGlzYXRpb24gc28gc3NsUHJvdG9jb2wgaXMgbm90IHJlcXVpcmVkIGZvciBTU0wuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGFkZD4KKyAgICAgICAgQWRkIGJ1ZmZlclNpemUgb3B0aW9uIHRvIHRoZSBBSlAvMS4zIEphdmEgY29ubmVjdG9yIHRvIGNvbnRyb2wgb3V0cHV0IGJ1ZmZlcmluZy4gKGJpbGxiYXJrZXIpCisgICAgICA8L2FkZD4KKyAgICAgIDxhZGQ+CisgICAgICAgIEFwYWNoZSBQb3J0YWJsZSBSdW50aW1lIGJhc2VkIEFKUC8xLjMgcHJvdG9jb2wgaGFuZGxlciAocmVtbSkKKyAgICAgIDwvYWRkPgorICAgICAgPGZpeD4KKyAgICAgICAgRGVsYXkgcmVhZGluZyB0aGUgaW5pdGFsIHJlcXVlc3QgYm9keSBwYWNrZXQgYnkgZGVmYXVsdCBmb3IgdGhlIEFKUC8xLjMgSmF2YSBjb25uZWN0b3IuIChiaWxsYmFya2VyKQorICAgICAgPC9maXg+CisgICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSmFzcGVyIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4xODQ3NzwvYnVnPjogQWxsb3cgc3ltYm9saWMgbGlua3Mgd2hlbiBwcmVjb21waWxpbmcgSlNQcyAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxhZGQ+CisgICAgICAgIDxidWc+MzQyNzI8L2J1Zz46IEFsbG93IHNwZWNpZnlpbmcgdGhlIE9wdGlvbiBjbGFzcyB1c2VkIGJ5IHRoZSBKYXNwZXIgZW5naW5lLAorICAgICAgICBzdWJtaXR0ZWQgYnkgU2NvdHQgU3RhcmsgKHJlbW0pCisgICAgICA8L2FkZD4KKyAgICAgIDxhZGQ+CisgICAgICAgIFN1cHBvcnQgZm9yIEphdmEgNS4wIGluIEpTUHMgKHJlbW0pCisgICAgICA8L2FkZD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEphdmEgNSB3aWxsIGJlIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBmb3IgSlNQcyB3aGVuIHJ1bm5pbmcgb24gSmF2YSA1IChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICA8YnVnPjM0NjUyPC9idWc+OiBBZGQgdGhlIGFiaWxpdHkgdG8gZ2V0IFNNQVBzIHdoZW4gcHJlY29tcGlsaW5nLCBzdWJtaXR0ZWQgYnkKKyAgICAgICAgRGFyeWwgUm9iYmlucyAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNDQ2NTwvYnVnPjogSnNwYyBmYWlsdXJlIGlmIHRoZXJlIGlzIG5vIHdlYi54bWwgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzU2OTY8L2J1Zz46IE1ha2UgY2VydGFpbiB0aGF0IHJlbGVhc2UgaXMgY2FsbGVkIGZvciBjdXN0b20gdGFncyAKKyAgICAgICAgIHdoZW4gdGFnLXBvb2xpbmcgaXMgZGlzYWJsZWQuIChiaWxsYmFya2VyKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM1Mzg2PC9idWc+OiBNYWtlIHVzZUJlYW4gcmVzb3VyY2VzIHVzZSBjb25zaXN0ZW50IHNwZWxsaW5nLCBmcm9tIEt1cnQgSHV3aWcuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgPGJ1Zz4zMzUyMjwvYnVnPjogVXBkYXRlIGphc3Blci1ob3d0byB0byByZWZsZWN0IHVzZSBvZiBqYXZhYyBzd2l0Y2guICh5b2F2cykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGFkZD4KKyAgICAgICAgPGJ1Zz4zNTExNDwvYnVnPjogQWRkIGZhaWxPbkVycm9yIGZsYWcgdG8gSnNwQywgYnkgeml3ZXRoLiAoeW9hdnMpCisgICAgICA8L2FkZD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzU0MTA8L2J1Zz46IEZpeGVkIE5QRSBpbiBKc3BXcml0ZXJJbXBsLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxhZGQ+CisgICAgICAgIDxidWc+MzU1NzE8L2J1Zz46IEpzcEMgcmVzb2x2ZWQgdXJpUm9vdCByZWxhdGl2ZSB0byBBbnQgcHJvamVjdCBiYXNlZGlyLCBpZiBhbnksIGFzIHN1Z2dlc3RlZAorICAgICAgICAgIGJ5IEphc29uIFBldHRpc3MuICh5b2F2cykKKyAgICAgIDwvYWRkPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgIAorICA8c3Vic2VjdGlvbiBuYW1lPSJDbHVzdGVyIj4KKyAgICA8Y2hhbmdlbG9nPiAgICAgICAgCisgICAgICA8YWRkPgorICAgICAgICBBZGQgdGhhdCBjbHVzdGVyIGNhbiBjb25maWd1cmUgYXMgRW5naW5lIGFuZCBIb3N0IGVsZW1lbnQuIChwZXJvKQorICAgICAgPC9hZGQ+ICAgICAgCisgICAgICA8YWRkPgorICAgICAgICBBZGQgc2luZ2xlIGNsdXN0ZXIgZGVmYXVsdCBjb25maWd1cmF0aW9uIGVsZW1lbnQgLSBkaXNjdXNzZWQgYXQgSkFYIDIwMDUgY29uZmVyZW5jZSBDbHVzdGVyIFdvcmtzaG9wLiAocGVybykKKyAgICAgIDwvYWRkPiAgICAgIAorICAgICAgPGZpeD4KKyAgICAgICAgRml4IHJlc2VuZCBHRVRfQUxMX1NFU1NJT05TIHdoZW4gd2FpdCBBQ0sgZmFpbGVkIGF0IHJlY2VpdmVyIHNpZGUgKHBlcm8pCisgICAgICA8L2ZpeD4gIAorICAgICAgPGZpeD4KKyAgICAgICAgQ2x1c3RlclZhbHZlIG5vdyByZW1vdmUgZnJvbSBjb250YWluZXIgZWxlbWVudCB3aGVuIGNsdXN0ZXIgc3RvcHMgYW5kIGFkZGVkIHdpdGggbmV4dCBzdGFydCBhZ2Fpbi4gKHBlcm8pCisgICAgICA8L2ZpeD4gICAgIAorICAgICAgPGFkZD4KKyAgICAgICAgU2V0IHRpbWVzdGFtcCBvbmx5IGF0IGZpcnN0IHRpbWUgaW5zaWRlIFNlc3Npb25NZXNzYWdlSW1wbCAocGVybykKKyAgICAgIDwvYWRkPiAgICAKKyAgICAgIDxhZGQ+CisgICAgICAgU2V0IHRpbWVzdGFtcCBmcm9tIGZpbmRzZXNzaW9ucyBtZXRob2QgY2FsbCwgd2hlbiBoYW5kbGluZyBHRVRfQUxMX1NFU1NJT04KKyAgICAgICB0byBhbGwgU0VORF9TRVNTSU9OX0RBVEEgYW5kIFRSQU5TRkVSIGNvbXBsZXRlIG1lc3NhZ2VzLiAocGVybz4KKyAgICAgIDwvYWRkPgorICAgICAgPGFkZD4gCisgICAgICAgRHJvcCBhbGwgcmVjZWl2ZWQgbWVzc2FnZSBpbnNpZGUgR0VUX0FMTF9TRVNTSU9OIG1lc3NhZ2UgcXVldWUgYmVmb3JlIHN0YXRlIAorICAgICAgIHRyYW5zZmVyIG1lc3NhZ2UgdGltZXN0YW1wLiAocGVybykKKyAgICAgIDwvYWRkPiAgICAgIAorICAgICAgPGFkZD4KKyAgICAgICAgQ2x1c3RlciBwaW5nIG5vdyB0cmFuc2ZlciBjbHVzdGVyIGRvbWFpbiBpbmZvcm1hdGlvbiBhbmQgRGVsdGFNYW5hZ2VyIG9ubHkKKyAgICAgICAgc2VuZCBhbmQgcmVjZWl2ZSBtZXNzYWdlIGZyb20gc2FtZSBkb21haW4gbWVtYmVycyAocGVybykKKyAgICAgIDwvYWRkPiAgICAgIAorICAgICAgPGFkZD4KKyAgICAgICAgSk1YIFN1cHBvcnQgZm9yIE1jYXN0U2VydmljZSAoTWVtYmVyc2hpcCkgKHBlcm8pCisgICAgICA8L2FkZD4gICAgICAKKyAgICAgIDxhZGQ+CisgICAgICAgIFJlZGVzaWduIFNpbXBsZVRjcENsdXN0ZXIgbWVzc2FnZSByZWNlaXZpbmcgdG8gQ2x1c3RlclJlY2VpdmVyQmFzZSAocGVybykKKyAgICAgIDwvYWRkPiAgICAgIAorICAgICAgPGFkZD4KKyAgICAgICAgQ2x1c3RlciB0cmFuc2ZlciBhbGwgYXR0cmlidXRlcyB0byB0aGUgZ2VuZXJhdGUgc2Vzc2lvbiBtYW5hZ2VyIGF0IGFkZE1hbmFnZXIuIAorICAgICAgICBSZW1vdmUgc29tZSB1bnVzZWQgYXR0cmlidXRlcyBhdCBTaW1wbGVUY3BDbHVzdGVyIGFuZCBSZXBsaWNhdGlvblRyYW5zbWl0dGVyIChwZXJvKQorICAgICAgPC9hZGQ+ICAgIAorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVmYWN0b3IgRGVsdGFNYW5hZ2VyOgorICAgICAgICAgIC0gY3JlYXRlU2Vzc2lvbiBjYWxsIG5vdyBNYW5hZ2VyQmFzZSBzdXBlciBjbGFzcyBtZXRob2QKKyAgICAgICAgICAtIGV4dHJhY3Qgc29tZSBsb25nIG1ldGhvZHMKKyAgICAgICAgICAtIHNlbmQgR0VUX0FMTF9TRVNTSU9OIHdpdGggc2Vzc2lvbiBibG9ja3MKKyAgICAgICAgICAtIGRvbid0IHN5bmMgc2Vzc2lvbnMgbWFwIHdoZW4gc2VuZCBhbGwgc2Vzc2lvbnMgKHBlcm8pICAKKyAgICAgIDwvdXBkYXRlPiAgICAgICAgICAKKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEFkZCBkZXZlbG9wZXIgYWN0aW9ucyBhdCB0by1kby50eHQgKFByb3Bvc2FsIG9mIGNoYW5nZXMpIChwZXJvKSAgCisgICAgICA8L3VwZGF0ZT4gICAgICAgICAgCisgICAgICA8dXBkYXRlPgorICAgICAgICBTbWFsbCByZWZhY3RvcmluZ3MgYXQgRmFzdEFzeW5jU29ja2V0U2VuZGVyIChwZXJvKSAgCisgICAgICA8L3VwZGF0ZT4gICAgICAgICAgCisgICAgICA8dXBkYXRlPgorICAgICAgICBSZWRlc2lnbiBjbHVzdGVyIG1lc3NhZ2Ugc2VuZGluZyB0byBsZXNzZXIgY3B1IGFuZCBtZW1vcnkgdXNhZ2UuIAorICAgICAgICBTZXQgYXQgUmVwbGljYXRpb25UcmFuc21pdHRlciNjb21wcmVzcz1mYWxzZSBhcyBkZWZhdWx0LiBDaGFuZ2UgQVBJIGZyb20KKyAgICAgICAgQ2x1c3RlclNlbmRlciwgUmVwbGljYWl0b25UcmFuc21pdHRlciwgRGF0YVNlbmRlciwgU2ltcGxlVGNwQ2x1c3RlciAocGVybykgIAorICAgICAgPC91cGRhdGU+ICAgICAgICAgIAorICAgICAgPGFkZD4KKyAgICAgICAgRGVsdGFNYW5hZ2VyIGhhcyBub3cgSk1YIGV4cGlyZUFsbExvY2FsU2Vzc2lvbnMgYW5kIHByb2Nlc3NFeGlwcmUgb3BlcmF0aW9uIAorICAgICAgICBmb3IgYmV0dGVyIGNsdXN0ZXIgbm9kZSBzaHV0ZG93biBoYW5kbGluZyAodXNlZnVsbCBmb3IgdGVzdGluZyBvbmx5KSAocGVybykgICAKKyAgICAgIDwvYWRkPiAgCisgICAgICA8YWRkPgorICAgICAgICBEYXRhU2VuZGVyIGRvV2FpdEFja1N0YXRzIGZvciBiZXR0ZXIgdW5kZXJzdGFuZGluZyB3YWl0IGFjayBwcm9ibGVtcyAocGVybykgICAKKyAgICAgIDwvYWRkPiAgCisgICAgICA8dXBkYXRlPgorICAgICAgICBSZWZhY3RvciBEZWx0YU1hbmFnZXIgYW5kIGFkZCBjb3VudGVyIGZvciBjbHVzdGVyIG1lc3NhZ2Ugc2VuZC9yZWNlaXZlIG1lc3NhZ2UgKHBlcm8pICAKKyAgICAgIDwvdXBkYXRlPiAgICAgICAgICAKKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzQzODk8L2J1Zz46UG9ydGluZyBDbHVzdGVyaW5nIGZpeCBwYWNrIHRvIDUuNS4xMCBjb2RlIGJhc2UuCisgICAgICAgIFJlbW92ZSBzeW5jaG9uaXplZCBmcm9tIERhdGFTZW5kZXIucHVzaE1lc3NhZ2UoKS4gVmVyeSBvZmZlbiB0aGUgCisgICAgICAgIGNvbXBsZXRlIGNsdXN0ZXIgYmxvY2tpbmcgYWZ0ZXIgcmVwbGljYXRlZCBhIGJ1bGsgb2YgbmV3IHNlc3Npb24gbWVzc2FnZXMgdW5kZXIgaGVhdnkgbG9hZC4KKyAgICAgICAgQWxsIGNsdXN0ZXIgbm9kZSBzdGFuZGluZyBmb3IgYSBsb3Qgb2YgdGltZSBhbmQgbWFkZSBub3RoaW5nLiAKKyAgICAgICAgRml4IGl0IGZvciBwb29sZWQsIGFzeW5jaHJvbm91cyBhbmQgZmFzdGFzeW5jcXVldWUgcmVwbGljYXRpb24gbW9kZS4gVmVyeSBiYWQgdGhpbmcsIHNvcnJ5ISAocGVybykgIAorICAgICAgPC9maXg+CisgICAgICA8YWRkPgorICAgICAgICBBZGQgbm90aWZ5U2Vzc2lvbkxpc3RlbmVyc09uUmVwbGljYXRpb24gYXR0cmlidXRlIHRvIFNpbXBsZVRjcENsdXN0ZXIgdG8gc3RvcCBub3RpZnkgCisgICAgICAgIGV2ZW50IHRvIFNlc3Npb25MaXN0ZW5lciBhdCBiYWNrdXAgbm9kZXMgZnJvbSBjcmVhdGUgYW5kIGRlc3Ryb3kgcmVwbGljYXRlZCBzZXNzaW9uIChwZXJvKQorICAgICAgPC9hZGQ+CisgICAgICA8YWRkPgorICAgICAgICBBZGQgY29tcHJlc3MgYXR0cmlidXRlIHRvIENsdXN0ZXJTZW5kZXIgYW5kIENsdXN0ZXJSZWNlaXZlciBpbnRlcmZhY2UuIE5vdyBjb21wcmVzcyBjb25maWcKKyAgICAgICAgdHJhbnNmZXIgZnJvbSBzZW5kZXIgdG8gcmVjZWl2ZXIgYXQgU2ltcGxlVGNwQ2x1c3Rlci4gKHBlcm8pIAorICAgICAgPC9hZGQ+ICAgIAorICAgICAgPGFkZD4KKyAgICAgICAgQWRkIENsdXN0ZXJWYWx2ZSBpbnRlcmZhY2UgYW5kIGltcGxlbWVudCBpdCBhcyBSZXBsaWNhdGlvblZhbHZlIGFuZCBKdm1Sb3V0ZUJpbmRlclZhbHZlLiBOb3cgYm90aAorICAgICAgICBWYWx2ZXMgY2FuIGJlIGRpcmVjdGx5IGNvbmZpZ3VyZWQgYXQgc2VydmVyLnhtbCBIb3N0L0NsdXN0ZXIvVmFsdmUgc3ViZWxlbWVudHMuCisgICAgICAgIEFsc28gdGhpcyBjb25maWd1cmF0aW9uIGFyZSBjb3JyZWN0bHkgaGFuZGxlZCB3aXRoIHRoZSBTdG9yZUNvbmZpZyBtb2R1bGUuIChwZXJvKSAgCisgICAgICA8L2FkZD4gICAgCisgICAgICA8dXBkYXRlPgorICAgICAgICBEZWFjdGl2YXRlIERhdGFTZW5kZXIga2VlcEFsaXZlTWF4UmVxdWVzdENvdW50IGNoYW5nZSBkZWZhdWx0IHRvIC0xLiAKKyAgICAgICAgQ2x1c3RlciByZXBsaWNhdGlvbiBzb2NrZXRzIGFyZSBmYXN0IGFuZCB2ZXJ5IHN0YWJsZSEgKHBlcm8pICAKKyAgICAgIDwvdXBkYXRlPiAgICAgICAgICAKKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFNldHVwIEp2bVJvdXRlQmluZGVyVmFsdmUgYXMgaG9zdCB2YWx2ZSBpbnN0ZWFkIGNvbnRleHQgdmFsdmUuIFJlZmFjdG9yIHRoZSBBUEkgYSBsaXR0bGUgYml0LiAocGVybykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgRG9uJ3QgaW5jcmVtZW50IG9wZW4gc29ja2V0IGNvdW50ZXIgYmVmb3JlIHNvY2tldCBpcyByZWFsbHkgb3Blbi4gQWRkIHNvY2tldCBvcGVuIGZhaWx1cmVzIGNvdW50ZXIgKHBlcm8pIAorICAgICAgPC9maXg+ICAKKyAgICAgIDxhZGQ+CisgICAgICAgIEFkZCBNZXNzYWdlTGlzdGVuZXIgc3VwcG9ydCB0byBjbHVzdGVyIHNlcnZlci54bWwgZWxlbWVudCAoQ2x1c3Rlckxpc3RlbmVyKSB0byAKKyAgICAgICAgcmVnaXN0ZXIgeW91ciBvd24gY2x1c3RlciBtZXNzYWdlIHJlY2VpdmVyIChwZXJvKQorICAgICAgPC9hZGQ+ICAKKyAgICAgIDxhZGQ+CisgICAgICAgIEFkZCBMaWZlY3ljbGVMaXN0ZW5lciBzdXBwb3J0IHRvIGNsdXN0ZXIgc2VydmVyLnhtbCBlbGVtZW50IChMaXN0ZW5lcikKKyAgICAgICAgYW5kIG5vdGlmeSB0aG9zZSBsaXN0ZW5lciBmcm9tIHN0YXJ0L3N0b3AgY2x1c3RlciwKKyAgICAgICAgYWRkL3JlbW92ZSBzZXNzaW9uIG1hbmFnZXIsIHNlbmRpbmcgZmF1bHQgYW5kIHN0YXJ0L3N0b3AgbWVtYmVyICAocGVybykKKyAgICAgIDwvYWRkPiAgCisgICAgICA8YWRkPgorICAgICAgICBBZGQgYWN0aXZlIGJhY2tncm91bmRQcm9jZXNzIGtlZXBBbGl2ZSB0aW1lb3V0IGFuZCByZXF1ZXN0IGNvdW50IHNvY2tldCBjbG9zZSBjaGVjaworICAgICAgICBhdCBSZXBsaWNhdGlvblRyYW5zbWl0dGVyLiAgQ2hlY2sgZnJlcXVlbmN5IGNhbiBiZSBjaGFuZ2Ugd2l0aCBhdHRyaWJ1dGUgCisgICAgICAgIHByb2Nlc3NTZW5kZXJGcmVxdWVuY3kgKGRlZmF1bHQgMikuIChwZXJvKQorICAgICAgPC9hZGQ+CisgICAgICA8YWRkPgorICAgICAgICBSZW1vdmUgdXNlbGVzcyBKZGsxM1JlcGxpY2F0aW9uTGlzdGVuZXIsSmRrMTNPYmplY3RSZWFkZXIuIAorICAgICAgICBBZGQgU29ja2V0UmVwbGljYXRpb25MaXN0ZW5lciBhbmQgU29ja2V0T2JqZWN0UmVhZGVyIHRvIGhhdmUgbmF0aXYgc29ja2V0IENsdXN0ZXJSZWNlaXZlci4gCisgICAgICAgIEFsc28gZXh0cmFjdCBDbHVzdGVyUmVjZWl2ZXJCYXNlIHN1cGVyY2xhc3MgZm9yIFNvY2tldFJlcGxpY2F0aW9uTGlzdGVuZXIgYW5kIFJlcGxpY2F0aW9uTGlzdGVuZXIgKHBlcm8pIAorICAgICAgPC9hZGQ+CisgICAgICA8dXBkYXRlPgorICAgICAgICBBZGQgYW5kIHVwZGF0ZSBzb21lIEFQSSBhbmQgdGhlIDxhIGhyZWY9ImNsdXN0ZXItaG93dG8uaHRtbCI+Y2x1c3RlciBob3d0byBkb2N1bWVudGF0aW9uPC9hPiAocGVybykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVmYWN0b3IgUmVwbGljYXRpb25WYWx2ZSBmb3IgYmV0dGVyIHVuZGVyc3RhbmRpbmcgYW5kIHNtYWxsIG9wdGltaXphdGlvbiAocGVybykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGFkZD4KKyAgICAgICAgU3RhcnRpbmcgYSB1bml0IHRlc3Qgc3VpdGUgZm9yIGNsdXN0ZXIgbW9kdWxlIC0gdmVyeSBtdWNoIHRvZG8gKHBlcm8pCisgICAgICA8L2FkZD4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBhbnQgYnVpbGQueG1sIHRvIGRpcmVjdCBjb21waWxlIGF0IGNsdXN0ZXIgbW9kdWxlIGRpcmVjdG9yeSAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IHNvbWUgSTE4TiBtZXNzYWdlcywgYnV0IGEgbG90IG9mIHdvcmsgaXMgd2FpdGluZyBmb3IgZml4IChwZXJvKQorICAgICAgPC9maXg+CisgICAgICA8YWRkPgorICAgICAgICBBZGQgUmVwbGljYXRpb25WYWx2ZSBNYmVhbnMgc3RhdHMgYXR0cmlidXRlIGdldHRlciBhbmQgcmVzZXRTdGF0aXN0aWNzIG9wZXJhdGlvbiAocGVybykKKyAgICAgIDwvYWRkPgorICAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICAKKyAgPHN1YnNlY3Rpb24gbmFtZT0iV2ViYXBwcyI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzU3NTg8L2J1Zz46IEFkbWluIHdlYmFwcCBtaXNoYW5kbGluZyBkaWdlc3QgYXR0cmlidXRlIG9mIEpEQkNEYXRhU291cmNlUmVhbG0uICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGFkZD4KKyAgICAgICAgPGJ1Zz4zNDI1MDwvYnVnPjogQWRtaW4gd2ViYXBwIENvbW1pdCBDaGFuZ2VzIGJ1dHRvbiBub3cgYXNrcyBmb3IgY29uZmlybWF0aW9uLiAoeW9hdnMpCisgICAgICA8L2FkZD4KKyAgICAgIDxhZGQ+CisgICAgICAgIDxidWc+MzQ4MTg8L2J1Zz46IEFsdGVybmF0aW5nIHJvdyBmb3IgYXBwcyBpbiBIVE1MIG1hbmFnZXIsIGFzIHN1Z2dlc3RlZCBieSBKZWZmCisgICAgICAgICAgRG9tZXllci4gKHlvYXZzKQorICAgICAgPC9hZGQ+CisgICAgICA8YWRkPgorICAgICAgICA8YnVnPjM1Mzc5PC9idWc+OiBBZGRlZCBjb21tb25zLWxvZ2dpbmcgdG8gYnVpbGQgcGF0aCBvZiBtYW5hZ2VyIGFuZCBob3N0LW1hbmFnZXIgYXBwcywKKyAgICAgICAgICB0byBtYWtlIHRoZW0gYnVpbGQgd2l0aCBKaWtlcywgYXMgc3VnZ2VzdGVkIGJ5IEFhcm9uIElzb3R0b24uICh5b2F2cykKKyAgICAgIDwvYWRkPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJUb21jYXQgNS41LjkgKHlvYXZzKSI+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkdlbmVyYWwiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8YWRkPgorICAgICAgICBBZGQgSlVMSSwgYSBqYXZhLnV0aWwubG9nZ2luZyBpbXBsZW1lbnRhdGlvbiwgdXNlZCB0byBwcm92aWRlIHNhbmUgZGVmYXVsdHMgYW5kCisgICAgICAgIGNvbmZpZ3VyYWJpbGl0eSBlcXVpdmFsZW50IHRvIFRvbWNhdCA0LjAgZm9yIFRvbWNhdCA1LjUgbG9nZ2luZyAocmVtbSkKKyAgICAgIDwvYWRkPgorICAgICAgPGRvY3M+CisgICAgICAgIEFkZCBKVUxJIGRvY3VtZW50YXRpb24gdG8gdGhlIGxvZ2dpbmcgcGFnZSAocmVtbSkKKyAgICAgIDwvZG9jcz4KKyAgICAgIDxhZGQ+CisgICAgICAgIEFkZCBob3N0IG1hbmFnZXIgd2ViYXBwIChyZW1tKQorICAgICAgPC9hZGQ+CisgICAgICA8YWRkPgorICAgICAgICBBZGQgYW50IEprU3RhdHVzVXBkYXRlVGFzayBmb3IgcmVtb3RlIHN0YXR1cyB3b3JrZXIgaGFuZGxpbmcgKCA+PW1vZF9qayAxLjIuOSkgKHBlcm8pCisgICAgICA8L2FkZD4KKyAgICAgIDxhZGQ+CisgICAgICAgIDxidWc+MzM3Mzk8L2J1Zz46IEFkZCByZWZlcmVuY2UgdG8gUlVOTklORy50eHQgaW4gc2V0dXAuaHRtbC4gKHlvYXZzKQorICAgICAgPC9hZGQ+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMzNzE5PC9idWc+OiBVcGRhdGUgcmVmZXJlbmNlIHRvIEFudCBkb3dubG9hZCBwYWdlLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzM4ODM8L2J1Zz46IEJhZCBvcHRpb25zIGluIFNTTC1Ib3dUby4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBVcGRhdGUgdG8gTVg0SiAzLjAuMSAocGVybykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgPGJ1Zz4zNDEzOTwvYnVnPjogVXBkYXRlZCBSZWFsbS1Ib3dUbyB0byBzcGVjaWZ5IEpNWCwgQ29tbW9ucy1Mb2dnaW5nIGphcnMgZm9yIFJlYWxtQmFzZS4gKHlvYXZzKQorICAgICAgPC91cGRhdGU+CisgICAgICA8YWRkPgorICAgICAgICA8YnVnPjMzMzI1PC9idWc+OiBBZGRlZCB0b3AtbGV2ZWwgY2xlYW4gdGFyZ2V0IHRvIE5ldGJ1aWxkIGJ1aWxkLnhtbCBmaWxlLiAoeW9hdnMpCisgICAgICA8L2FkZD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIDxidWc+MzM3NTU8L2J1Zz46IENsYXJpZmllZCBQb3N0Z3Jlc3FsIEpOREkgZGF0YXNvdXJjZSBleGFtcGxlLiBbcGF0Y2ggc3VibWl0dGVkIGJ5CisgICAgICAgICAgVG9tIFdpdG1lcl0gKHlvYXZzKQorICAgICAgPC91cGRhdGU+CisgICAgPC9jaGFuZ2Vsb2c+CisgICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2F0YWxpbmEiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICBSZW1vdmUgc29tZSBpbnN0YW5jZXMgb2YgZXhwYW5kZWQgZm9sZGVyIHJlbW92YWwgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIERvbid0IGNhbGwgbWtkaXJzIGlmIHdlJ3JlIG5vdCBnb2luZyB0byBzYXZlIHRoZSBjb25maWd1cmF0aW9uIGluIFN0YW5kYXJkQ29udGV4dCAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IGNvbnRleHQgY2xhc3Nsb2FkZXIgYmluZGluZyBkdXJpbmcgbG9hZGVyIGluaXRpYWxpemF0aW9uIChpdCB3YXMgc2V0IHRvIG51bGwgYmVmb3JlKSAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgVGhlIHdlYmFwcCBsb2dnZXIgc2hvdWxkIG9ubHkgYmUgcmV0cmlldmVkIHdoZW4gdGhlIGNvbnRleHQgY2xhc3Nsb2FkZXIgaXMgc2V0IHRvIHRoZSAKKyAgICAgICAgd2ViYXBwJ3MgY2xhc3Nsb2FkZXIgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzQxNzA8L2J1Zz46IEFkZCBiYWNrIHJldHJ5IGxvZ2ljIGluIEpEQkMgcmVhbG0gaW4gY2FzZSBvZiBhIGNvbm5lY3Rpb24gZmFpbHVyZSAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4yMjA0MTwvYnVnPjogU3VwcG9ydCBkeW5hbWljIHByb3hpZXMgYXMgc2Vzc2lvbiBvYmplY3RzLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBsb2dnZXIgbmFtZXMgZm9yIHdyYXBwZXJzIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM0MDA2PC9idWc+OiBJZiBhbnRpUmVzb3VyY2VMb2NraW5nIHdhcyB1c2VkLCBIb3N0Q29uZmlnIGNvbnNpZGVyZWQgdGhlIHBhdGggYXMgZXh0ZXJuYWwsCisgICAgICAgIGFuZCB3ZWIgYXBwbGljYXRpb24gcmVzb3VyY2VzIHdlcmUgbm90IGNvcnJlY3RseSByZW1vdmVkIG9yIHRhY2tlZDsgYWxzbyBzaW1wbGlmeSB0aGUgY29kZSBhIGxvdAorICAgICAgICAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNDAxNjwvYnVnPjogU2F2ZSBhbmQgcmVzdG9yZSBkb2NCYXNlIHdoZW4gdXNpbmcgYW50aVJlc291cmNlTG9ja2luZywgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAorICAgICAgICB0aGUgYWRtaW4gd2ViYXBwIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8YWRkPgorICAgICAgICA8YnVnPjMzNjM2PC9idWc+OiBTZXQgbGFzdE1vZGlmaWVkIGF0dHJpYnV0ZSB3aGVuIGV4cGFuZGluZyBXQVIgZmlsZXMuICh5b2F2cykKKyAgICAgIDwvYWRkPgorICAgICAgPGFkZD4KKyAgICAgICAgPGJ1Zz4zMjkzODwvYnVnPjogQWxsb3cgU2FsdGVkIFNIQSAoU1NIQSkgcGFzc3dvcmRzIGluIEpORElSZWFsbS4gKHlvYXZzKQorICAgICAgPC9hZGQ+CisgICAgICA8YWRkPgorICAgICAgICA8YnVnPjMxMjg4PC9idWc+OiBBbGxvdyBTTVRQIGF1dGhlbnRpY2F0aW9uIGZvciBKTkRJIE1haWxTZXNzaW9uRmFjdG9yeS4gKHlvYXZzKQorICAgICAgPC9hZGQ+CisgICAgICA8dXBkYXRlPgorICAgICAgICBIYXJtb25pemUgcHJvY2Vzc2luZyBvZiB0aGUgY29udGV4dC54bWwgZGVmYXVsdHMgd2l0aCB0aGUgd2F5IHdlYi54bWwgaXMgcHJvY2Vzc2VkCisgICAgICAgIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICBJZ25vcmUgJzsnIGlmIGl0IGlzIGluIHRoZSBxdWVyeSBzdHJpbmcgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIHByaXZhdGUgdG8gcHJvdGVjdGVkIGZvciB0aGUgd2ViYXBwIGNsYXNzbG9hZGVyIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBJbXByb3ZlIGxvZ2dpbmcgb2YgZmlsdGVycyBhbmQgbGlzdGVuZXJzIHN0YXJ0dXAgZXJyb3JzIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMzNzc0PC9idWc+OiBSZXRyeSBvbmNlIGluIEpOREkgcmVhbG0gYXV0aGVudGljYXRlIGZhaWx1cmUgcmVnYXJkbGVzcyBvZiB0aGUgCisgICAgICAgIGV4Y2VwdGlvbiBtZXNzYWdlIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMzOTYxPC9idWc+OiBEb24ndCBlbmNvZGUgJ34nIGluIGNvbnRleHQgcGF0aHMgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzI4NjY8L2J1Zz46IFByb3BhZ2F0ZSBkaXN0cmlidXRhYmxlIHByb3BlcnR5IGZyb20gY29udGV4dCB0byBtYW5hZ2VyICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMjg2NzwvYnVnPjogUmVzZXQgZGlzdHJpYnV0YWJsZSBhdHRyaWJ1dGUgaW4gY29udGV4dCBmb3IgY2xlYW4gcmVsb2FkIGhhbmRsaW5nICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgICBGaXggc29tZSBSZWFsbUJhc2UvSk5ESVJlYWxtIGxvZy5pc1hYWEVuYWJsZWQgKHBlcm8pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgICAgPGJ1Zz4zNDE2MTwvYnVnPjogSGFybW9uaXplIFN0YW5kYXJkQ29udGV4dC5zdG9wIHdpdGggQ29udGFpbmVyQmFzZS5zdG9wIChyZW1tKQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgICA8L3N1YnNlY3Rpb24+CisgICAKKyAgIDxzdWJzZWN0aW9uIG5hbWU9IkNveW90ZSI+CisgICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMzOTcxPC9idWc+OiBTZXQgcmVtb3RlSG9zdCB0byBudWxsIHdoZW4gQXBhY2hlIGRvZXNuJ3Qgc2VuZCBvbmUuIChiaWxsYmFya2VyKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBGaXggY2FsY3VsYXRpb24gb2YgdGhyZWFkUmF0aW8gZm9yIHRoZSBtcyB0aHJlYWQgcG9vbCwgYW5kIGZpeCBzZXR0aW5nIHRoZSB1cGRhdGVkCisgICAgICAgIHRpbWVvdXQgdmFsdWUgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFVwZGF0ZSB0aGUgbXMgdGhyZWFkIHBvb2wgc28gdGhhdCB3ZSBhbGxvY2F0ZSBhIHdvcmtlciBiZWZvcmUgYWNjZXB0aW5nIGEgbmV3IHNvY2tldCwKKyAgICAgICAgYW5kIHdhaXQgYSBsaXR0bGUgaWYgdGhlIHBvb2wgaXMgZXhoYXVzdGVkOyB0aGlzIHNob3VsZCBtYWtlIGxvdyBtYXhUaHJlYWRzIHZhbHVlcyB3b3JrIGEgCisgICAgICAgIGxvdCBiZXR0ZXIgKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIDxidWc+MzM4NTc8L2J1Zz46IFVwZGF0ZSBpbmZvcm1hdGlvbiBvbiBhdXRvbWF0aWMgbW9kX2prIGNvbmZpZ3VyYXRpb24gaW4gQXBhY2hlLUhvd1RvICh5b2F2cykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IHN5bmMgYmxvY2sgcGxhY2VtZW50IGluIE1hcHBlci5hZGRDb250ZXh0IChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMyNzQxPC9idWc+OiBGaXggc3BlbGxpbmcgb2YgImNvbW1pdHRlZCIgW3BhdGNoIGZyb20gQmVuIFNvdXRoZXJdICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNDEzMzwvYnVnPjogTWFrZSBzZXRIZWFkZXIgY2xlYXIgbXVsdGktdmFsdWVkIGhlYWRlcnMgKGJpbGxiYXJrZXIpCisgICAgICA8L2ZpeD4KKyAgICAgPC9jaGFuZ2Vsb2c+CisgICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSmFzcGVyIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zNDAzNDwvYnVnPjogSmFzcGVyIGRvZXMgbm90IHJlc3BlY3QgZXh0ZXJuYWwgZW50aXRpZXMgKGJpbGxiYXJrZXIpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzM4MTA8L2J1Zz46IEluY29ycmVjdCByZWN5Y2xpbmcgb2YgQm9keUNvbnRlbnQgaWYgY2xvc2UgaXMgY2FsbGVkIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBQZXIgaW5zdGFuY2UgbG9nZ2VycyBpbiBKYXNwZXIgKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICAgCisgICA8c3Vic2VjdGlvbiBuYW1lPSJDbHVzdGVyIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IEp2bVJvdXRlQmluZGVyVmFsdmUgcHJpbWFyeSBmYWlsb3ZlciBhdHRyaWJ1dGUgdG8KKyAgICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uSnZtUm91dGVPcmlnbmFsU2Vzc2lvbklEIChwZXJvKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBDaGFuZ2UgYXR0cmlidXRlIG5hbWUgd2FpdEZvckFjayB0byBzZW5kQWNrIGF0IFJlcGxpY2F0aW9uTGlzdGVuZXIgKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICAgIDxhZGQ+CisgICAgICAgIEludGVncmF0ZSBuZXcgZmFzdGFzeW5jcXVldWUgY2x1c3RlciBzZW5kZXIgbW9kZS4KKyAgICAgICAgU3VwcG9ydCBxdWV1ZSBzaXplIGxpbWl0YXRpb24sCisgICAgICAgIGdldCBhbGwgcXVldWVkIG9iamVjdHMgYW5kIHNlbmQgaXQgdG8gdGhlIGJhY2t1cCBub2RlLAorICAgICAgICBubyBxdWV1ZSB0aHJlYWQgbG9jayBjb250ZW50aW9uIHVuZGVyIGhpZ2ggcmVwbGljYXRpb24gbG9hZCwKKyAgICAgICAgc3VibWl0dGVkIGJ5IFJhaW5lciBKdW5nIChwZXJvKQorICAgICAgPC9hZGQ+CisgICAgICA8YWRkPgorICAgICAgICBBZGQgY29tcHJlc3MgYXR0cmlidXRlIHRvIFNlbmRlciBhbmQgUmVjZWl2ZXIgdG8gdHJhbnNmZXIgZGF0YSB1bmNvbXByZXNzZWQuIAorICAgICAgICBBdCBoaWdoIGNsdXN0ZXIgbG9hZCB0aGlzIG9wdGlvbiBjb25zdW1lIGxlc3NlciBjcHUgYW5kIG1lbW9yeS4KKyAgICAgICAgSW1wbGVtZW50IHRoZSBjb21wcmVzcyBoYW5kbGluZyB0byBSZXBsaWNhdGlvblRyYW5zbWl0dGVyLCBSZXBsaWNhdGlvbkxpc3RlbmVyLCAKKyAgICAgICAgWEJ5dGVCdWZmZXIgYW5kIEpkazEzUmVwbGljYXRpb25MaXN0ZW5lciAocGVybykKKyAgICAgIDwvYWRkPgorICAgICAgPGFkZD4KKyAgICAgICAgQWRkIGRvUHJvY2Vzc2luZ1N0YXRzIHRvIHN5bmNocm9ub3VzLCBhc3luY2hyb25vdXMgYW5kIGZhc3RxdWV1ZWFzeW5jIHNlbmRlciBtb2RlcworICAgICAgICB0byBnZXQgbWluLCBhdmcsIG1heCBwcm9jZXNzaW5nIHRpbWVzIGFzIElEYXRhU2VuZGVyIEpNWCBNQmVhbnMgKHBlcm8pCisgICAgICA8L2FkZD4KKyAgICAgIDxmaXg+CisgICAgICAgIFRjcFRocmVhZFBvb2wgdXNlIGNvbnN0YW50IEFDSyBieXRlIGFycmF5IGluc3RlYWQgY3JlYXRlIAorICAgICAgICBuZXcgMyBieXRlIGJ1ZmZlciBmb3IgZXZlcnkgbWVzc2FnZSBhY2sgKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFJlZmFjdG9yIFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIgYW5kIFJlcGxpY2F0aW9uTGlzdGVuZXIgKHBlcm8pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIGFkZCBnZXRDYXRhbGluYUNsdXN0ZXIoKSB0byBDbHVzdGVyUmVjZWl2ZXIgYW5kIFNpbXBsZVRjcENsdXN0ZXIgKHBlcm8pCisgICAgICA8L3VwZGF0ZT4gICAgCisgICAgICA8dXBkYXRlPgorICAgICAgICBVcGRhdGUgdGhlIEFwaSBkb2N1bWVudGF0aW9uIChwZXJvKQorICAgICAgPC91cGRhdGU+CisgICAgPC9jaGFuZ2Vsb2c+CisgICA8L3N1YnNlY3Rpb24+CisgICA8c3Vic2VjdGlvbiBuYW1lPSJXZWJhcHBzIj4KKyAgICAgPGNoYW5nZWxvZz4KKyAgICAgICA8dXBkYXRlPgorICAgICAgICAgVXNlIHRoZSBzdGFuZGFyZCBzdHJ1dHMgdGFnbGliIFVSSXMgaW4gYWRtaW4gSlNQcy4gKGJpbGxiYXJrZXIpCisgICAgICAgPC91cGRhdGU+CisgICAgICA8YWRkPgorICAgICAgICBBZGQgbW9yZSBob3N0IHBhcmFtZXRlcnMgdG8gY3JlYXRlIG5ldyBob3N0IHdpdGggaG9zdC1tYW5hZ2VyIChwZXJvKQorICAgICAgPC9hZGQ+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjM0MDMzPC9idWc+OiBGaXggcXVvdGluZyByZWxhdGVkIGJ1Z3MgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzM3MTM8L2J1Zz46IEFkZCBTdHJ1dHMgaW5pdCBjb2RlIGluIGZyYW1lc2V0LmpzcCBhcyB3ZWxsIChyZW1tKQorICAgICAgPC9maXg+CisgICAgIDwvY2hhbmdlbG9nPgorICAgPC9zdWJzZWN0aW9uPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJUb21jYXQgNS41LjggKHlvYXZzKSI+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkdlbmVyYWwiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMzMjA0PC9idWc+OiBGaXhlZCBTU0wgSG93VG8gcGFnZS4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMzMzUxPC9idWc+OiBGaXggc2lsZW50IHVuaW5zdGFsbGF0aW9uLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMzQ4OTwvYnVnPjogTWlzc2luZyBzcGFjZSBpbiB1bmluc3RhbGxlciBtZXNzYWdlLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNhdGFsaW5hIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgVW5yZWdpc3RlciBob3N0IG1iZWFuIGFuZCBhbGwgY29udGV4dCBtYmVhbnMgYXQgcmVtb3ZlIGEgaG9zdCwgcy4gU3RhbmRhcmRIb3N0LmRlc3Ryb3koKSBhbmQgTUJlYW5GYWN0b3J5LmNyZWF0ZVN0YW5kYXJkSG9zdC9yZW1vdmVIb3N0KCwpIGRldGVjdGVkIGJ5IFRob3JzdGVuIEthbWFubiAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgbWFrZSBpdCBwb3NzaWJsZSB0byByZXN0YXJ0IGNvbm5lY3Rvciwgbm93IHNlcnZlcnNvY2tldCByZWNyZWF0ZWQgYWZ0ZXIgc3RvcCxzdGFydCAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgY2hhbmdlIG1iZWFuIG5hbWVzIGZyb20gTWFwcGVyIGFuZCBQcm90b2NvbEhhbmRsZXIgdG8gY29ubmVjdG9yIG5hbWluZyBzdHlsZSAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgQWRkIHNvbWUgbG9nLmlzWFhYRW5hYmxlZCAocGVybykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgRGVyZWdpc3RlciBNYXBwZXJMaXN0ZW5lciBhZnRlciByZW1vdmUgY29ubmVjdG9yIChwZXJvKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBSZW1vdmUgaG9zdCBvbmx5IGF0IG93biBkb21haW4gd2l0aCBzYW1lIG5hbWUgYXQgYWxsIHNlcnZpY2VzLCBkZXRlY3RlZCBieSBUaG9yc3RlbiBLYW1hbm4gKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzMxODc8L2J1Zz46IFJlbW92ZSBhbnkgbG9nZ2luZyBvZiB0aGUgcGFzc3dvcmQgaW4gdGhlIEpBQVMgcmVhbG0sCisgICAgICAgIHN1Ym1pdHRlZCBieSBBbmRyZXcgSmFxdWl0aCAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMzAzMzwvYnVnPjogRG9uJ3QgZG8gYW55dGhpbmcgdG8gdGhlIHJlc3BvbnNlIGluIHRoZSBFcnJvclJlcG9ydFZhbHZlCisgICAgICAgIGlmIGRhdGEgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBBZGQgY2hhcnNldCBzdXBwb3J0IGZvciB0aGUgVVJMcyB1c2VkIGJ5IHRoZSB0YXNrcywgdG8gcmVtb3ZlIGRlcHJlY2F0aW9uIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjI2MTM1PC9idWc+OiBXb3JrYXJvdW5kIGZvciBtZW1vcnkgbGVhayB3aGVuIHJlbG9hZGluZyBTdHJ1dHMKKyAgICAgICAgYmFzZWQgd2ViIGFwcGxpY2F0aW9ucyBieSBjbGVhcmluZyB0aGUgYmVhbiBpbnN0cm9zcGVjdG9yIGNhY2hlIG9mIHRoZSBKVk0gb24KKyAgICAgICAgY2xhc3Nsb2FkZXIgc3RvcCwgc3VibWl0dGVkIGJ5IFRvYmlhcyBMb2ZzdHJhbmQuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICAgRW5zdXJlIHRoYXQgaWYgQ0xBU1NQQVRIIGlzIGRlY2xhcmVkIG9uIHN0YXJ0dXAgLSBpdCBpcyBub3QgdXNlZC4gKGZ1bmttYW4pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgICBBZGQgYmFjayB1c2Ugb2YgZGVwbG95T25TdGFydHVwIGluIEhvc3RDb25maWcgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxkb2NzPgorICAgICAgICAgQW50IHRhc2tzIGRvY3MgcGF0Y2hlcywgc3VibWl0dGVkIGJ5IEdhYnJpZWxlIEdhcnVnbGllcmkuIChyZW1tKQorICAgICAgPC9kb2NzPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgIFVzZSBOSU8gZm9yIHRoZSByYXcgY29weWluZyBvcGVyYXRpb24sIGFzIGl0IGlzIGZhc3RlciAoYSBsaXR0bGUgdW5kZXIgMzAlKSwgCisgICAgICAgICBhbmQgZGVjcmVhc2VzIGEgbGl0dGxlIHRoZSBpbXBhY3Qgb2YgYW50aVJlc291cmNlTG9ja2luZy4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgICA8YnVnPjMzMzU3PC9idWc+OiBGaXggY29ubmVjdGlvbiBsZWFrcyB3aXRoIHRoZSBEYXRhU291cmNlUmVhbG0sIGFzIHdlbGwgCisgICAgICAgICBhcyBpbXByb3ZlIGVmZmljaWVuY3ksIHN1Ym1pdHRlZCBieSBEb21pbmlrIERyemV3aWVja2kuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICAgSW1wcm92ZSBhIGxpdHRsZSBsb2dnaW5nIG9mIHNlcnZsZXQgZXhjZXB0aW9ucywgd2hpY2ggc2hvdWxkIGFsbCBsb2cgdGhlIHJvb3QgY2F1c2UuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICAgQWRkIG5ldyBNYW5hZ2VyLmNyZWF0ZVNlc3Npb24oc2Vzc2lvbklkKSBtZXRob2QsIGFsbG93aW5nIHRoZSBjbGllbnQgdG8gInNwZWNpZnkiIHRoZSBzZXNzaW9uIGlkIHdoaWNoIHNob3VsZCBiZSB1c2VkIHVzaW5nIGEgY29va2llCisgICAgICAgICB3aGVuIHVzaW5nIGVtcHR5U2Vzc2lvblBhdGg9InRydWUiLiBUaGlzIGZpeGVzIHNlc3Npb24gdHJhY2tpbmcgaW4gdGhpcyBjYXNlLiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgIDxidWc+MzMzNjg8L2J1Zz46IEZpeCBtZW1vcnkgbGVhayBpbiBzd2FsbG93T3V0cHV0IGZlYXR1cmUgd2hpY2ggb2NjdXJyZWQgd2hlbiB0aGUgdGhyZWFkIHBvb2wgc2l6ZSBpcworICAgICAgICAgcmVkdWNlZCwgc3VibWl0dGVkIGJ5IFJhaW5lciBKdW5nLiAocmVtbSkKKyAgICAgIDwvZml4PgorCSAgPGZpeD4KKyAgICAgICAgICBTdG9yZUNvbmZpZzogY2FuJ3Qgc2F2ZSBjbHVzdGVyIE1lbWJlcnNoaXAgZWxlbWVudCAocGVybykKKyAgICAgICA8L2ZpeD4KKwkgIDxhZGQ+CisgICAgICAgICAgU3RvcmVDb25maWc6IHN1cHByZXNzIGRlZmF1bHQgamtIb21lIGF0dHJpYnV0ZSBhdCBjb25uZWN0b3IgIChwZXJvKQorICAgICAgPC9hZGQ+CisJICA8YWRkPgorICAgICAgICAgIFN0b3JlQ29uZmlnOiBTYXZlIG5ldyBkeW1hbmljIHByb3BlcnRpZXMgZnJvbSBSZXBsaWNhdGlvblRyYW5zbWl0dGVyICAocGVybykKKyAgICAgIDwvYWRkPgorICAgICAgPGZpeD4KKyAgICAgICAgIDxidWc+MzM0NjM8L2J1Zz46IFJlbW92ZSBhdHRyaWJ1dGVzIGFmdGVyIGNvbnRleHQgZGVzdHJveS4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgICA8YnVnPjMzNTcyPC9idWc+OiBjb250ZXh0LnhtbCBzaG91bGQgYmUgYSByZWRlcGxveSByZXNvdXJjZSwgYW5kIGFkZCBwcmlvcml0aXphdGlvbiBmb3IKKyAgICAgICAgIHJlZGVwbG95IHJlc291cmNlcy4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorICAKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ295b3RlIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgIFBvb2xUY3BFbmRwb2ludCByZWNyZWF0ZSBTZXJ2ZXJTb2NrZXQgYWZ0ZXIgc3RhcnQsc3RvcCxzdGFydCBjb25uZWN0b3IgKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEFkZCBzb21lIGxvZy5pc1hYWEVuYWJsZWQgKHBlcm8pCisgICAgICA8L3VwZGF0ZT4KKwkgIDxhZGQ+CisJICAgIEprTVg6IG1ha2UgbG9nNGogbWJlYW4gY29uZmlndXJhYmxlIHdpdGggYXR0cmlidXRlIGxvZzRqRW5hYmxlZCAocGVybykKKwkgIDwvYWRkPgorCSAgPGZpeD4KKwkgICAgV2hlbiBUb21jYXQgcnVucyBvbiBXaW5kb3dzIGFuZCBJRSBpcyB1cGxvYWRpbmcgZGF0YSB0byB0aGUgc2VydmVyLCB0aGUgZmlyc3QgcmVhZCAKKwkgICAgbXVzdCBiZSBhdCBsZWFzdCA4S0IsIG90aGVyd2lzZSB1cGxvYWQgc3BlZWQgaXMgZXh0cmVtZWx5IGxvdywgc3VibWl0dGVkIGJ5IE5vZWwgCisJICAgIFJvY2hlciAocmVtbSkKKwkgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgCisgIDxzdWJzZWN0aW9uIG5hbWU9Ikphc3BlciI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzMyMjM8L2J1Zz46IHBhZ2VDb250ZXh0LmZvcndhcmQgYW5kIGpzcDppbmNsdWRlIHJlc3VsdAorICAgICAgICBpbiBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIChsdWVoZSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMzM3MzwvYnVnPjogRml4IGhhbmRsaW5nIG9mIGNvbnRleHQgY2xhc3Nsb2FkZXIgaW4ganNwYyAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMzUzODwvYnVnPjogSWdub3JlIGV4YW1wbGUgYW5kIHRhZy1leHRlbnNpb24gZWxlbWVudHMgaW4gVGFnTGlicmFyeUluZm9JbXBsLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzM1Mzk8L2J1Zz46IEJldHRlciBlcnJvciBtZXNzYWdlIHdoZW4gYW4gdW5rbm93biBlbGVtZW50IGlzIGVuY291bnRlcmVkIGluIHRoZSB0YWcgZmlsZS4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMzMjE5PC9idWc+OiBNaW5vciBKc3BTZXJ2bGV0V3JhcHBlciBjb2RlIGNsZWFudXAuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisgIAorICA8c3Vic2VjdGlvbiBuYW1lPSJDbHVzdGVyIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgIDxmaXg+CisgICAgICAgICAgQWRkIGluc3RhbmNlIGJhc2VkIFJlcGxpY2F0aW9uVmFsdmUgc3RhdGlzdGljcyB0byBNYmVhbiBkZXNjcmlwdG9yIChwZXJvKQorICAgICAgIDwvZml4PgorICAgICAgIDxmaXg+CisgICAgICAgICAgQmV0dGVyIEkxOE4gc3VwcG9ydCB0byBjbHVzdGVyIHNlc3Npb24gYW5kIHRjcCBjbGFzc2VzIChwZXJvKQorICAgICAgIDwvZml4PgorICAgICAgIDxhZGQ+CisgICAgICAgICAgU3VwcG9ydCBvcHRpb25hbCBwcmltYXJ5SW5kaWNhdG9yIGF0IFJlcGxpY2F0aW9uVmFsdmUgdG8gbWFyayB0aGF0IAorICAgICAgICAgIHJlcXVlc3QgcHJvY2Vzc2luZyB0byBleGlzdGluZyBzZXNzaW9uIGlzIGF0IHByaW1hcnkgY2x1c3RlciBub2RlLiAKKyAgICAgICAgICBFYXN5IGZhaWxvdmVyIGRldGVjdGlvbiwgd2hlbiBtYXJrIGlzIG5vdCBhdCAKKyAgICAgICAgICBjb25maWd1cmFibGUgcHJpbWFyeUluZGljYXRvciBhdHRyaWJ1dGUsIHN1Ym1pdHRlZCBieSBSYWluZXIgSnVuZyAocGVybykKKyAgICAgICA8L2FkZD4KKyAgICAgICA8dXBkYXRlPgorICAgICAgICAgIFJlZmFjdG9yIGFsbCBpbXBsZW1lbnRhdGlvbiBmcm9tIGludGVyZmFjZSBJRGF0YVNlbmRlcnMgKHBlcm8pCisgICAgICAgPC91cGRhdGU+CisgICAgICA8YWRkPgorICAgICAgICAgIEFkZCBzb21lIHVzZWZ1bGwgYXR0cmlidXRlcyBhbmQgb3BlcmF0aW9ucyB0byB0aGUgYWxsIHNlbmRlciBNQmVhbnMuIChwZXJvKQorICAgICAgIDwvYWRkPgorICAgICAgPGFkZD4KKyAgICAgICAgICBBZGQga2VlcEFsaXZlIGFuZCB3YWl0Rm9yQWNrIGhhbmRsaW5nIHRvIEFzeW5jU29ja2V0U2VuZGVyIGFuZCBmYWN0b3Igb3V0IGEgRGF0YVNlbmRlciBiYXNlIGNsYXNzLihwZXJvKQorICAgICAgIDwvYWRkPgorICAgICAgIDxhZGQ+CisgICAgICAgICAgUmVwbGljYXRpb25UcmFuc21pdHRlcjogRW5hYmxlIGFuZCBEaXNhYmxlIGF1dG9yZWNvbm5lY3Qgc2VuZGVyIGFuZCB3YWl0Rm9yQWNrLiAocGVybykKKyAgICAgICA8L2FkZD4KKyAgICAgICA8YWRkPgorICAgICAgICAgIFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXI6IHRyYW5zZmVyIGFsbCBwcm9wZXJ0aWVzIHRvIHNvY2tldCBzZW5kZXIgZnJvbSBzZXJ2ZXIueG1sIGNvbmZpZ3VyYXRpb24uIChwZXJvKQorICAgICAgIDwvYWRkPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iV2ViYXBwcyI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBjcmVhdGUgYW5kIHJlbW92ZSBIb3N0IGZvciBBZG1pbiBhcHAuIChwZXJvKQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgICA8L3N1YnNlY3Rpb24+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlRvbWNhdCA1LjUuNyAocmVtbSkiPgorICA8c3Vic2VjdGlvbiBuYW1lPSJHZW5lcmFsIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGFkZD4KKyAgICAgICAgQWRkIGluc3RhbGxlciBmb3IgbW9kX2prIG9uIElJUy4gKG10dXJrKQorICAgICAgPC9hZGQ+CisgICAgICA8YWRkPgorICAgICAgICBOZXcgc3RvcmUgY29uZmlnIG1vZHVsZSBmb3IgYmV0dGVyIHNlcnZlci54bWwgc2F2aW5nIHN1cHBvcnQuPGJyLz4KKyAgICAgICAgQWRkICZsdDtMaXN0ZW5lciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RvcmVjb25maWcuU3RvcmVDb25maWdMaWZlY3ljbGVMaXN0ZW5lciIgLyZndDsgdG8geW91ciBzZXJ2ZXIueG1sIChwZXJvKQorICAgICAgPC9hZGQ+CisgICAgICA8dXBkYXRlPgorICAgICAgICA8YnVnPjMyMDgxPC9idWc+OiBSZW1vdmUgdGhlIEpESyByZXF1aXJlbWVudCBmcm9tIHRoZSBVbml4IHNjcmlwdHMsIHN1Ym1pdHRlZAorICAgICAgICBieSBCZW4gU291dGhlciAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMjk1MzwvYnVnPjogU0VSVkxFVEFQSTogWFNTIElzc3Vlcywgc3VibWl0dGVkIGJ5IE1hcmsgVGhvbWFzIChqZmFyY2FuZCkKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgVXBkYXRlIHRvIGNvbW1vbnMtZGlnZXN0ZXIgMS42LCBKRFQgMy4wLjEsIE1YNEogMi4xLjAsIFN0cnV0cyAxLjIuNiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2F0YWxpbmEiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8dXBkYXRlPgorICAgICAgICAgRmlyc3QgaW50ZWdyYXRpb24gYXQgU3RvcmVDb25maWcgdG8gU3RhbmRhcmRTZXJ2ZXIgKHBlcm8pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzI3MTQgPC9idWc+OiBEb24ndCBtYWtlIHRoZSBBY2Nlc3NMb2dWYWx2ZSBmaW5hbCAoZnVua21hbikKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMjY5NDwvYnVnPjogRml4IGJhZCBjb2RlIHRvIG1ha2UgZG9jQmFzZSBwYXRoIGFib3NsdXRlIGluIGFudGlMb2NraW5nCisgICAgICAgIG1ldGhvZC4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzI3MTM8L2J1Zz46IEZpeCByZXNvdXJjZS1lbnYtcmVmIGhhbmRsaW5nLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMTIwMTwvYnVnPjogSW1wcm92ZSBpMThuIHN1cHBvcnQgaW4gRGVmYXVsdFNlcnZsZXQuIFRoaXMgd2FzIGNhdXNpbmcKKyAgICAgICAgcHJvYmxlbXMgd2l0aCBKU1AgaW5jbHVkZSBhY3Rpb25zIGFuZCBzdGF0aWMgZmlsZXMuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgQWRkIHNvbWUgbG9nLmlzWFhYRW5hYmxlZCB0byBvLmEuYy5jb3JlLlN0YW5kYXJkSG9zdCBTdGFuZGFyZEVuZ2luZSwgU3RhbmRhcmRTZXJ2aWNlIChwZXJvKQorICAgICAgPC9maXg+CisgICAgICA8YWRkPgorICAgICAgICBGZWF0dXJlIGFkZGl0aW9uIHRvIGFkZCBSZWRpcmVjdG9yIGFuZCBmYWlsT25FcnJvciBzdXBwb3J0IGZvciBhbGwgQ2F0YWxpbmEgQW50IHRhc2tzLAorICAgICAgICBzdWJtaXR0ZWQgYnkgR2FicmllbGUgR2FydWdsaWVyaSAocmVtbSkKKyAgICAgIDwvYWRkPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMTE5ODwvYnVnPjogRml4IEZPUk0gYW5kIERJR0VTVCBhdXRoZW50aWNhdGlvbiBmb3Igbm9uLUFTQ0lJCisgICAgICAgIHVzZXJuYW1lcyBhbmQgcGFzc3dvcmRzLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIFJlaW1wbGVtZW50IGNoYXJzZXQgbWFwcGVyIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBBZGQgbG9nZ2luZyBvZiBleGNlcHRpb24gd2hpY2ggY291bGQgb2NjdXIgd2hlbiByZXRyaWV2aW5nIHRoZSBwYXNzd29yZCBpbiBKREJDUmVhbG0gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MjU4ODk8L2J1Zz46IERvbid0IGV4ZWN1dGUgcXVlcmllcyB0d2ljZSwgc3VibWl0dGVkIGJ5IFRvbSBBbmRlcnNvbiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMjgzMjwvYnVnPjogcmVxdWVzdC5nZXRTZXNzaW9uKGZhbHNlKSBmYWlscyB0byByZXR1cm4gbnVsbCAobHVlaGUpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MjgyMjI8L2J1Zz46IHJlcXVlc3QuZ2V0UmVxdWVzdFVSTCgpIGluIGZvcndhcmRlZCBqc3Avc2VydmxldCByZXR1cm5zCisgICAgICAgIG9yaWdpbmFsIHVybCByYXRoZXIgdGhhbiBuZXcgdXJsIGFzIHBlciBTUlY4LjQgKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMzMTU3PC9idWc+OiBGaXggaGFuZGxpbmcgb2YgdGhlIGJ1ZmZlciBsZW5ndGggZm9yIGJhc2ljIGF1dGhlbnRpY2F0aW9uIHBhcnNpbmcgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNveW90ZSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzI3MDg8L2J1Zz46IEJldHRlciBoYW5kbGluZyBvZiBiYWQgZW5jb2Rpbmcgd2l0aCB0aGUgc3RyaW5nIGNhY2hlLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMjc4MTwvYnVnPjogRml4IGJhZCBpbml0aWFsaXphdGlvbiBvZiB0aGUgInNjaGVtZSIgZmllbGQgb2YgdGhlIHJlcXVlc3QKKyAgICAgICAgb2JqZWN0LCB3aGljaCB3b3VsZCBjYXVzZSBnZXRTY2hlbWUgdG8gcmV0dXJuICJodHRwIiBmb3IgdGhlIGZpcnN0IHJlcXVlc3QuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBDb250ZW50IGxlbmd0aCBzaG91bGQgYmUgaWdub3JlZCBpZiB0aGVyZSBpcyBjaHVua2luZyAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgUmVtb3ZlIG1vc3QgZGVwcmVjYXRpb24gcHJvYmxlbXMgZm9yIHRoZSBBSlAgY29ubmVjdG9yIChyZW1tKQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJKYXNwZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMyNzQ2PC9idWc+OiBBdm9pZCBKQVIgbG9ja2luZyB3aGVuIGxvYWRpbmcgY2xhc3NlcyBhbmQgaW1wcm92ZSBsb2FkaW5nCisgICAgICAgIHBlcmZvcm1hbmNlIGJ5IHRha2luZyBhZHZhbnRhZ2Ugb2YgY2FjaGluZywgc3VibWl0dGVkIGJ5IERvbWluaWsgRHJ6ZXdpZWNraS4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNsdXN0ZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICAgPGZpeD4KKyAgICAgICAgICBjb3JyZWN0IEp2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXIgTUJlYW4gbmFtZSB0byAmbHQ7ZG9tYWluJmd0Ozp0eXBlPUxpc3RlbmVyLG5hbWU9SnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lcixob3N0PSZsdDtob3N0Jmd0OyAocGVybykKKyAgICAgICA8L2ZpeD4KKyAgICAgICA8YWRkPgorICAgICAgICAgIEpNWCBzdXBwb3J0IHRvIFNpbXBsZVRjcENsdXN0ZXIsIFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIgYW5kIGFsbCBzZW5kZXJzIChwZXJvKQorICAgICAgIDwvYWRkPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iV2ViYXBwcyI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCB0aGUgd2ViREFWIHNlcnZsZXQgc28gaXQgY2FuIGJlIHVzZWQgdmlhIGFueSBhcmJpdHJhcnkgbWFwcGluZworICAgICAgICAoZWcgL3dlYmRhdi8qKSB0byBlZGl0IHRoZSBjb250ZW50cyBvZiBhIHdlYiBhcHBsaWNhdGlvbi4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMyNzI5PC9idWc+OiBTdG9wIGlzIG9wdGlvbmFsIGFuZCBtYXkgZmFpbCwgc28gaXQgbmVlZHMgdG8gYmUgaW4gYSBzZXBhcmF0ZSB0cnkvY2F0Y2ggKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFJlbW92ZSB0aGUgcmVtb3ZlIG1ldGhvZCBvZiB0aGUgbWFuYWdlciBzZXJ2bGV0LCBhbmQgdXNlIHRoZSB1bmRlcGxveSBtZXRob2QgaW5zdGVhZCAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMjc3NzwvYnVnPjogRmFpbCBpZiBhcHBsaWNhdGlvbiBpc24ndCBjb25maWd1cmVkIHByb3Blcmx5LCBzdWJtaXR0ZWQgYnkgR2FicmllbGUgR2FydWdsaWVyaQorICAgICAgICAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMjc3MTwvYnVnPjogQ2Fubm90IHVuZGVwbG95L2RlcGxveSBtaXNjb25maWd1cmVkIGFwcCBhZnRlciB0b21jYXQgc3RhcnR1cCwKKyAgICAgICAgc3VibWl0dGVkIGJ5IEdhYnJpZWxlIEdhcnVnbGllcmkgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+Mjg4Njc8L2J1Zz46IENvcnJlY3QgbWFuYWdlciBkb2N1bWVudGF0aW9uIHRvIGRvY3VtZW50IGNvcnJlY3Qgd2F5IHRvCisgICAgICAgIHJlZmVyZW5jZSB0aGUgUk9PVCBjb250ZXh0LiBTdWJtaXR0ZWQgYnkgU3RlcGhhbmUgQmFpbGxpZXouIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMzA4NTwvYnVnPjogQWRkIHN1cHBvcnQgZm9yIHNldHRpbmcgcHJpdmlsZWdlZCBhdHRyaWJ1dGUgb2YgY29udGV4dAorICAgICAgICB0byBhZG1pbiB3ZWJhcHAuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMzExNzwvYnVnPjogRml4IE9wZW4gYnVncyBsaW5rIGJyb2tlbiBvbiBkZWZhdWx0IGhvbWVwYWdlLgorICAgICAgICBQYXRjaCBzdXBwbGllZCBieSBTYW5kZXIgVGVtbWUuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgSW1wcm92ZSBqYXZhZG9jIGdlbmVyYXRpb24gZm9yIENhdGFsaW5hLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlRvbWNhdCA1LjUuNiAoeW9hdnMpIj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iR2VuZXJhbCI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIDxidWc+MzI1MzI8L2J1Zz46IHVwZGF0ZWQgbG9nZ2luZyBkb2N1bWVudGF0aW9uLiAoeW9hdnMpCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIDxidWc+MzIzODI8L2J1Zz46IEluZGV4IHBhZ2UgYW5kIHBhY2thZWQgV0FSIGZvciBzYW1wbGUgd2ViYXBwLiAoeW9hdnMpCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzI2MDM8L2J1Zz46IFVwZGF0ZWQgaG9zdC54bWwgdG8gcmVmbGVjdCBhcHBCYXNlIHJlc29sdXRpb24uICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2F0YWxpbmEiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICBBZGQgY2hpbGQgdG8gdGhlIG1hcCBvZiB0aGUgcGFyZW50IGJlZm9yZSBzdGFydGluZyBpdC4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIERlY291cGxlIHVzYWdlIG9mIHRoZSBzY2hlbWUgYW5kIHNlY3VyZSBhdHRyaWJ1dGVzIGZyb20gZW5hYmxpbmcgU1NMLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMjUwMjwvYnVnPjogbWVtb3J5IGxlYWsgaW4gRGlnZXN0QXV0aGVudGljYXRvci4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjI4NzA5PC9idWc+OiBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0LmlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKSByZXR1cm5zIHRydWUgZm9yIGFuIGludmFsaWRhdGVkIHNlc3Npb24uIChsdWVoZSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMjEzNzwvYnVnPjogUG9zc2libGUgdGhyZWFkLXNhZmV0eSBpc3N1ZSBpbiBSZWFsbUJhc2UuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ295b3RlIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMjU4NTwvYnVnPjogQmV0dGVyIGhhbmRsaW5nIGZvciBjb250ZW50IGxlbmd0aCBncmVhdGVyIHRoYW4gSW50ZWdlci5NQVhfVkFMVUUgaW4gcmVzcG9uc2UuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgQWxsb3cgQXBhY2hlQ29uZmlnIGFuZCBmcmllbmRzIHRvIGxpdmUgdW5kZXIgYW4gRW5naW5lLiAoYmlsbGJhcmtlcikKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgU3luY3Jvbml6ZSBhY2Nlc3MgdG8gdGhlIEprIFJlcXVlc3QgcmVnaXN0cmF0aW9uIGNvdW50LiAoYmlsbGJhcmtlcikKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgU3BlZWQgdGhlIE1zZ0NvbnRleHQgb24gaXRzIHdheSB0byBHQy4gKGJpbGxiYXJrZXIpCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIEtlZXAgY29ycmVjdCB0aHJlYWQgY291bnRzIGluIFRocmVhZCBwb29sIHdoZW4gdGhyZWFkIGVuZHMgaW4gYW4gZXhjZXB0aW9uIChiaWxsYmFya2VyKQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJKYXNwZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8dXBkYXRlPgorICAgICAgICBVcGRhdGVkIEphc3Blci1Ib3dUbyBzZWN0aW9uIG9uIHVzaW5nIEppa2VzLCBjaGFuZ2VkIGNvbmYvd2ViLnhtbCBKU1BTZXJ2bGV0IHRvIHJlZmVyIHBlb3BsZSB0byBKYXNwZXItSG93VG8gc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRoZXNlIGluc3RydWN0aW9ucyBpbiB0d28gcGxhY2VzLiAoeW9hdnMpCisgICAgICA8L3VwZGF0ZT4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IldlYmFwcHMiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMyNTA1PC9idWc+OiBGaXggaGFuZGxpbmcgb2YgYW4gZW1wdHkgY29udGV4dCBwYXJhbWV0ZXIgKHdoaWNoIG9jY3VycmVkIGV2ZXJ5IHRpbWUgdGhlIEhUTUwKKyAgICAgICAgbWFuYWdlciB3YXMgdXNlZCB0byBkZXBsb3kgYSBsb2NhbCB3YXIgd2l0aG91dCBzcGVjaWZ5aW5nIGFsc28gYSBjb250ZXh0IGZpbGUpLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlRvbWNhdCA1LjUuNSAoeW9hdnMpIj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iR2VuZXJhbCI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIDxidWc+MzIyMzU8L2J1Zz46IFN5bmMgY29uZi93ZWIueG1sIE1JTUUgdHlwZXMgd2l0aCBBcGFjaGUgaHR0cGQuICh5b2F2cykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMTEzMjwvYnVnPjogQmV0dGVyIC14Ly1yIHN1cHBvcnQgZm9yIE9TLzQwMCBpbiBzdGFydHVwIHNjcmlwdHMuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgPGJ1Zz4yMjY3OTwvYnVnPjogQWRkZWQgbWlzYyBub3RlIG9uIGFjY2Vzc2luZyBzZXNzaW9uIElEIHRvIFNTTC1Ib3dUby4gKHlvYXZzKQorICAgICAgPC91cGRhdGU+CisgPCEtLSBCeXRlQnVmZmVyQWNjZXNzTG9nVmFsdmUuamF2YSBpcyBub3QgaW5zaWRlISEKKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEFkZCBhbiBhc3luY2hyb3Vub3VzIGFjY2VzcyBsb2cgdmFsdmUgYmFzZWQgb24gTklPIChqZmFyY2FuZCkKKyAgICAgIDwvdXBkYXRlPgorIC0tPgorICAgICAgIDx1cGRhdGU+CisgICAgICAgIDxidWc+MzIyNDk8L2J1Zz46IFVwZGF0ZWQgbG9nZ2luZyBkb2N1bWVudGF0aW9uLiAoeW9hdnMpCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIDxidWc+MzIyODI8L2J1Zz46IE1vZGlmeSBXaW5kb3dzIFVuaW5zdGFsbGVyIHRvIG9ubHkgcmVtb3ZlIHdlYmFwcHMvUk9PVCBhbmQgd2ViYXBwcyBpZiB1c2VyIGFza3MgdG8gcmVtb3ZlIGV2ZXJ5dGhpbmcuICh5b2F2cykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMjM3MTwvYnVnPjogb3V0ZGF0ZWQgaW50cm9kdWN0aW9uLnhtbCBwYWdlLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzIzNzM8L2J1Zz46IG91dGRhdGVkIGluc3RhbGxhdGlvbi54bWwgcGFnZS4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICA8YnVnPjMyNDU0PC9idWc+OiBhbWVuZGVkIEpOREkgZG9jdW1lbnRhdGlvbiBmb3IgSmF2YU1haWwvSmF2YUFjdGl2YXRpb25GcmFtZXdvcmsgdXNhZ2UuICh5b2F2cykKKyAgICAgIDwvdXBkYXRlPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2F0YWxpbmEiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMyMTMwPC9idWc+OiBBZGQgc2FmZXR5IGNoZWNrIHRvIEZpbGVTdG9yZSNrZXlzIG1ldGhvZC4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICA8YnVnPjMyMjc2PC9idWc+OiBBZGQgZGV2ZWxvcGVyIGluZm8gdG8gUmVhbG0gSG93LVRvLiAoeW9hdnMpCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzIwODI8L2J1Zz46IEFkZGVkIHByb3RlY3RlZCBnZXRQcmluY2lwYWxzIG1ldGhvZCB0byBNZW1vcnlSZWFsbSBmb3IgZWFzaWVyIGV4dGVuc2lvbi4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMyMDIzPC9idWc+OiBDR0lTZXJ2bGV0IGZhaWxzIHRvIGhhbmRsZSBwb3N0IG1lc3NhZ2Ugd2l0aCBtdWx0aXBhcnQvZm9ybSBkYXRhLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzIyNjk8L2J1Zz46IEpORElSZWFsbSBmYWlscyB3aXRoIEludmFsaWROYW1lRXhjZXB0aW9uIHRvIGF1dGhlbnRpY2F0ZSB1c2VycyBpZiBMREFQIGRpc3Rpbmd1aXNoZWQgbmFtZSAoRE4pIGNvbnRhaW5zIHNsYXNoIG9yIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXIocykuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICA8Zml4PgorICAgICAgICBNb3ZlIHByb2Nlc3NFeHBpcmVzRnJlcXVlbmN5IGNoZWNrIHRvIE1hbmFnZXJCYXNlIGFuZCByZWZsZWN0IGNoYW5nZSB0byBhbGwgc3ViY2xhc3NlcyAoU3RhbmRhcmRNYW5hZ2VyLCBQZXJzaWVudE1hbmFnZXJCYXNlLCBEZWx0YU1hbmFnZXIpLiAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgQWRkIERJR0VTVCBhdXRoZW50aWNhdGlvbiBzdXBwb3J0IHRvIHRoZSBKREJDIGFuZCBEYXRhU291cmNlIHJlYWxtcy4gU3VwcG9ydHMgYm90aCBkaWdlc3RlZCBhbmQgY2xlYXJ0ZXh0IHBhc3N3b3Jkcy4gKG1hcmt0KQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMyNDI5PC9idWc+OiBDR0lTZXJ2bGV0IGNhbGN1bGF0ZXMgbnVtYmVyIG9mIGxpbmVzIHJlY2VpdmVkIG9uIHN0ZGVyciBpbmNvcnJlY3RseS4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMyNDMxPC9idWc+OiBGaXggdHlwbyBpbiBjb2RlIHRoYXQgcGFzc2VzIGRhdGEgdG8gQ0dJIHNjcmlwdC4gKG1hcmt0KQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMyNDMwPC9idWc+OiBDbGFzcyBjYXN0IGV4Y2VwdGlvbiBpbiB0b1N0cmluZygpIG1ldGhvZCB3aXRoaW4gQ0dJIHNlcnZsZXQuIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgIEFkZCBzb21lIGxvZy5pc1hYWEVuYWJsZWQgY2hlY2tzIGF0IFN0YW5kYXJkQ29udGV4dCBhbmQgSG9zdENvbmZpZyAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgIFJlbW92ZSB0aGUgbGFzdCBEZWZhdWx0Q29udGV4dCBhcnRpZmFjdHMgKHBlcm8pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgICA8YnVnPjMyMDMxPC9idWc+OiB1c2luZyBjcmVhdGVDb25uZWN0b3Igd2l0aCAiaHR0cCIgcHJvdG9jb2wgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgICBBZGQgY29uZmlnRmlsZSBhdHRyaWJ1dGUgaW4gSk1YIGRlc2NyaXB0b3JzIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICAgRml4IGF1dG9kZXBsb3llciBoYW5kbGluZyBvZiBhIHdhciB3aGljaCBpbmNsdWRlcyBhIC9NRVRBLUlORi9jb250ZXh0LnhtbCwgc28gdGhhdCBpdCBpcworICAgICAgICAgY29ycmVjdGx5IHJlZ2lzdGVyZWQgYW5kIGNhbiBiZSByZWxvYWRlZCBjb3JyZWN0bHkgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgICA8YnVnPjMyMTM3PC9idWc+OiBVc2Ugb2YgTWVzc2FnZURpZ2VzdCBzaG91bGQgYmUgc3luY2VkIGluIERJR0VTVCAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgIEFkZCBpbmZvIGxvZyB3aGVuIHRoZSBhdXRvZGVwbG95ZXIgcmVsb2FkcyBhIGNvbnRleHQgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNveW90ZSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFNtYWxsIEhUVFAvMS4xIG9wdGltaXphdGlvbnM6IHJlcGxhY2UgdXNhZ2Ugb2YgU3RyaW5ncyB3aXRoIGNvbnN0YW50IGJ5dGUgYXJyYXlzLCBhbmQKKyAgICAgICAgc2ltcGxpZnkgdGhlIGNvZGUgY29udmVydGluZyBTdHJpbmdzIHRvIGJ5dGVzIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBHcmVhdGx5IHJlZHVjZSB0aGUgYW1vdW50IG9mIHJlY3ljbGUgbWV0aG9kIGNhbGxzIG9uIHRoZSBidWZmZXJzIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PkFkZCBudWxsIE9OYW1lIGNoZWNrIGZvciBSZXF1ZXN0IHVucmVnaXN0cmF0aW9uIGluIEprLCB0byByZW1vdmUKKyAgICAgICAgICAgZXhjZXB0aW9uIHVuZGVyIEpESyAxLjUuIChiaWxsYmFya2VyKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PjxidWc+MzIyOTI8L2J1Zz46IERvbid0IHNlbmQga2VlcC1hbGl2ZSBoZWFkZXIgd2hlbiB0aGUgcHJvdG9jb2wKKyAgICAgICAgICAgY2FuJ3QgYmUgcGFyc2VkLiAoYmlsbGJhcmtlcikKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSmFzcGVyIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgVXBkYXRlZCBKc3BDIHVzYWdlIG1lc3NhZ2VzIHRvIGluY2x1ZGUgcmVjZW50bHkgYWRkZWQgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMuICh5b2F2cykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMjMzMDwvYnVnPjogSnNwQyBjaGFuZ2VzIGNvbnRleHQgY2xhc3Nsb2FkZXIuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2x1c3RlciI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgICA8YWRkPgorICAgICAgICAgIEp2bVJvdXRlQmluZGVyVmFsdmUvSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lciB0byBiaW5kIGNsdXN0ZXIgc2Vzc2lvbiBhZnRlciBwcmltYXJ5IG5vZGUgZmFpbHVyZSBhdCBmaXJzdCBjYWxsaW5nIGJhY2t1cCBub2RlLgorICAgICAgICAgIFRoaXMgd2FzIGFuIG9wdGlvbiB0byBoYXZlIHNlc3Npb24gc3RpY2t5bmVzcyBhZnRlciBjbHVzdGVyIG5vZGUgY3Jhc2hlZC4gV29yayBvbmx5IHdpdGggSkVTU0lPTklEIGNvb2tpZXMuIChwZXJvKQorICAgICAgIDwvYWRkPgorICAgICAgIDxhZGQ+CisgICAgICAgICAgQmV0dGVyIGxvZyBzdXBwb3J0IHRvIERlbHRhTWFuYWdlciB0byBzZWUgZGV0YWlsIGluZm9ybWF0aW9uIGF0IGRlYnVnIGxldmVsLiAocGVybykKKyAgICAgICA8L2FkZD4KKyAgICAgICA8Zml4PgorICAgICAgICAgIEZpeCBGYXJtV2FyRGVwbG95ZXIgYmFzZWQgb24gbmV3IEhvc3RDb25maWcgZGVwbG95ZXIuIChwZXJvKQorICAgICAgIDwvZml4PgorICAgICAgIDxmaXg+CisgICAgICAgICAgRmFybVdhckRlcGxveWVyIGNvbnRyb2xsZWQgV2FyV2F0Y2hlciB3aXRoIGVuZ2luZSBiYWNrZ3JvdW5kUHJvY2VzcyBjYWxsLgorICAgICAgICAgIEFkZGVkIHByb2Nlc3NEZXBsb3lGcmVxdWVuY3kgYXR0cmlidXRlIHRvIERlcGxveWVyIHNlcnZlci54bWwgZWxlbWVudC4gKHBlcm8pCisgICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJXZWJhcHBzIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgPGJ1Zz4zMjAxOTwvYnVnPjogUmVtb3ZlIG1heGxlbmd0aD02NCByZXN0cmljdGlvbiBvbiBlbnYgZW50cnkgdmFsdWVzIGluIGFkbWluIHdlYmFwcC4gKHlvYXZzKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICBGaXggdmFyaW91cyBwcm9ibGVtcyBpbiByZWFsbSBkb2NzLCBzdWJtaXR0ZWQgYnkgUGhpbCBNb2Nlay4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEFkZCBsb2c0aiBkb2NzIHN1Ym1pdHRlZCBieSBBbGxpc3RhaXIgQ3Jvc3NsZXkuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PjxidWc+MzIzODE8L2J1Zz46IEZpeCBwcm9ibGVtIHdoZXJlIEVMIGV4cHJlc3Npb24gaXMgdXNlZCBhcyBhCisgICAgICAgIHBsYWNlIGhvbGRlciBpbiB0aGUgYWRtaW4gd2ViYXBwLgorICAgICAgICBTdWJtaXR0ZWQgYnkgQWxsaXN0YWlyIENyb3NzbGV5LiAoYmlsbGJhcmtlcikKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlRvbWNhdCA1LjUuNCAoeW9hdnMpIj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iR2VuZXJhbCI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIDxidWc+MzE2NzE8L2J1Zz46IFVwZGF0ZSB3ZWIueG1sIGZpbGVzIHRvIDIuNCBzY2hlbWEgd2hlcmUgYXBwbGljYWJsZS4gKHlvYXZzKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICA8YnVnPjMxOTEyPC9idWc+OiBBZGQgUE5HIGFuZCBDU1MgZmlsZSB0eXBlcyB0byByZXBsaWNhdGlvbiBmaWx0ZXIgZGVmYXVsdC4gKHlvYXZzKQorICAgICAgPC91cGRhdGU+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJDYXRhbGluYSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIEFkZCBwcm9jZXNzRXhwaXJlc0ZyZXF1ZW5jeSB0byBQZXJzaXN0ZW50TWFuYWdlckJhc2UgYW5kIG1hZGUgc29tZSBzbWFsbCBKREJDU3RvcmUgb3B0aW1pemF0aW9ucyAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgUmVnaXN0ZXIgSlNQIG1vbml0b3JpbmcgbWJlYW4gZm9yIGVhY2ggc2VydmxldCB0aGF0IGRlY2xhcmVzIGEganNwLWZpbGUgaW4gd2ViLnhtbC4gKGx1ZWhlKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMxNTc4PC9idWc+OiBVcGRhdGUgTWFuYWdlciBjb25maWd1cmF0aW9uIGRvY3VtZW50YXRpb24uICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMTI3MzwvYnVnPjogQWRkIHN1cHBvcnQgZm9yIGRlcmVmYWxpYXNlcyBpbiBKTkRJUmVhbG0uIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMTYyMzwvYnVnPjogQmV0dGVyIE9TNDAwIHN1cHBvcnQgaW4gc2V0Y2xhc3NwYXRoLnNoLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxhZGQ+CisgICAgICAgIEV4dGVuZCBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcgdG8gbW9zdCBjb250YWluZXIgY29tcG9uZW50cy4gKHJlbW0pCisgICAgICA8L2FkZD4KKyAgICAgIDxmaXg+CisgICAgICAgIFJlbW92ZSBhbGwgTVg0SiByZWxhdGVkIGNvZGUuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBVcGRhdGUgSkFSIGxpc3QgaW4gVGxkQ29uZmlnLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGFkZD4KKyAgICAgICAgUmVnaXN0ZXIgZGF0YXNvdXJjZXMgd2l0aCBKTVguIFdpdGggREJDUCwgdGhpcyBpcyBlbm91Z2ggdG8gcHJvdmlkZSBKTVggbWFuYWdlbWVudCBhbmQgbW9uaXRvcmluZy4KKyAgICAgICAgSXQgbWlnaHQgd29yayB3ZWxsIHdpdGggbWFueSBvdGhlciBkYXRhIHNvdXJjZXMgd2hpY2ggbWlnaHQgbm90IHJlZ2lzdGVyIHRoZW1zZWx2ZXMgaW4gSk1YCisgICAgICAgIGJ1dCBkbyBleHBvc2UgdGhlaXIgc3R1ZmYgaW4gYSBqYXZhIGJlYW4gZmFzaGlvbi4gKHJlbW0pCisgICAgICA8L2FkZD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEFkZCB0aGUgYWJpbGl0eSB0byBmb3JjZSBzZXNzaW9uIGNvb2tpZXMgdG8gYmUgc2V0IHRvIHRoZSByb290IHBhdGggIi8iLiBUaGlzIHNob3VsZCBub3QgYmUgdXNlZAorICAgICAgICBvbiBsYXJnZSBzZXJ2ZXJzLCBvdGhlcndpc2UgdG9ucyBvZiBjb29raWVzIG1heSBiZSBzZW50LiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgV29ya2Fyb3VuZCBmb3IgY2xpZW50IHNvY2tldCBleGNlcHRpb25zIG9jY3VycmluZyB3aGlsZSBydW5uaW5nIGEgQ0dJLCB3aGljaCBjb3VsZCBjYXVzZQorICAgICAgICB0aGUgZXh0ZXJuYWwgcHJvY2VzcyB0byBoYW5nLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgT3B0aW1pemUgc2Vzc2lvbiBjb29raWUgSURzIGNvbnZlcnNpb24gdG8gU3RyaW5nLCBzaW5jZSB0aGlzIGlzIGFuIHVuYXZvaWRhYmxlIGFuZCB1bmNhY2hlYWJsZQorICAgICAgICBvcGVyYXRpb24uIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICBBZGQgZXhwbGljaXQgZXJyb3IgbWVzc2FnZSBpZiB0ZW1wIGRpciBkb2VzIG5vdCBleGlzdCwgYW5kIHJlbW92ZSB1c2VsZXNzIGNhbGxzIHRvIGluaXREaXJzLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGFkZD4KKyAgICAgICAgQWRkIGFuIG9wdGltaXplZCBhY2Nlc3MgbG9nIHZhbHZlLCBzdXBwb3J0aW5nIGhhcmRjb2RlZCBzdXBwb3J0IGZvciB0aGUgY29tbW9uIGFuZCBjb21iaW5lZCBwYXR0ZXJucywKKyAgICAgICAgYW5kIGRvaW5nIGEgbWFqb3JpdHkgb2YgaXRzIHdyaXRlLXRvLWxvZ2ZpbGUgb3BlcmF0aW9ucyBhc3luY2hyb25vdXNseS4gKHJlbW0pCisgICAgICA8L2FkZD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFJlZ2lzdGVyIGFuIE1CZWFuIHRvIG1vbml0b3IgYW5kIG1hbmFnZSB0aGUgU3RyaW5nQ2FjaGUsIGFuZCBhbGxvdyBpbnZva2luZyB0aGUgcmVzZXQgb3BlcmF0aW9uLiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMTY3NzwvYnVnPjogTG9nIHdhcm5pbmcgaWYgd29yayBkaXIgZm9yIGNvbnRleHQgY2FuJ3QgYmUgZGV0ZXJtaW5lZC4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMxOTAzPC9idWc+OiBGaXggY29uZGl0aW9uIHdoaWNoIHNlZW1zIHRvIG5vdCBoYXZlIGJlZW4gcHJvcGVybHkgdXBkYXRlZCBhZnRlciBhZGRpbmcKKyAgICAgICAgZW50cnkuYmluYXJ5Q29udGVudCA9IG51bGwgYSBsaXR0bGUgYmVsb3csIHN1Ym1pdHRlZCBieSBKb2UgWmhvdS4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIFByZXZlbnQgc2lsZW50IE5QRXMgZHVyaW5nIFN0YW5kYXJkQ29udGV4dC5zdGFydCBkZWFsaW5nIHdpdGggSk1YIHJlZ2lzdHJhdGlvbiBvZiByZWFsbSwgc3VibWl0dGVkCisgICAgICAgIGJ5IEtlaXRoIFdhbm5hbWFrZXIuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMxNTkyPC9idWc+OiBTdXBwb3J0IG90aGVyIGVuY29kaW5ncyBmb3IgZGlnZXN0cy4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICA8YnVnPjMxNzM5PC9idWc+OiBNaW5vciByZWFsbS1ob3d0byBhbmQgQUpQIGNvbm5lY3RvciBkb2MgdXBkYXRlcy4gKHlvYXZzKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMxNzUzPC9idWc+OiBNaW5vciBpbmNvbnNpc3RlbmN5IGJldHdlZW4gSkRCQyBhbmQgRGF0YVNvdXJjZVJlYWxtI2F1dGhlbnRpY2F0ZS4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICA8YnVnPjMxNjgzPC9idWc+OiBNaW5vciBjbGFyaWZpY2F0aW9ucyB0byByZWFsbSBkb2N1bWVudGF0aW9uLiAoeW9hdnMpCisgICAgICA8L3VwZGF0ZT4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNveW90ZSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIEltcHJvdmUgaTE4biBpbiBUQ1AgZW5kcG9pbnQsIGFuZCBhZGQgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB3aGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgICAgaW4gc2V0U29ja2V0T3B0aW9ucy4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzE2NjM8L2J1Zz46IFVzZSBpbnRlcnZhbCBmaWVsZCBhcyB0aGUgZGVsYXkgZm9yIG1vbml0b3IgdGhyZWFkLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgUmVtb3ZlIGJhZCBzaHV0ZG93biBsb2dpYyBmb3IgbXMgcG9vbCBzdHJhdGVneS4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIFN5bmMgd2l0aCBDb29raWUsIGJ5IGFkZGluZyAnICcgYXMgYSBzcGVjaWFsIGNoYXIuIElmIGEgc3BlY2lhbCBjaGFyIGlzIHByZXNlbnQsCisgICAgICAgIHRoZSBzdHJpbmcgd2lsbCBiZSBxdW90ZWQuIElmIHRoZSBjbGllbnQgZG9lc24ndCBzdXBwb3J0IGl0LCB0aGUgU3RyaW5nIHdpbGwgbm8gYmUgcXVvdGVkIGFueXdheQorICAgICAgICBhbmQgbm8gSUFFIHdpbGwgYmUgdGhyb3duLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGFkZD4KKyAgICAgICAgQWRkIGFuIG9wdGlvbmFsIFN0cmluZyBjYWNoZSBmb3IgQnl0ZUNodW5rLnRvU3RyaW5nIGFuZCBDaGFyQ2h1bmsudG9TdHJpbmcuIFRoZSBjYWNoZSBpcworICAgICAgICB1bnN5bmNocm9uaXplZCBkdXJpbmcgbW9zdCBvZiBpdHMgb3BlcmF0aW9uLCBhbmQgaXMgc3RhdGljIGFmdGVyIGEgdHJhaW5pbmcgcGVyaW9kLiBBbiBvcGVyYXRpb24KKyAgICAgICAgaXMgcHJvdmlkZWQgdG8gYWxsb3cgcmVzZXR0aW5nIHRoZSBjYWNoZS4gKHJlbW0pCisgICAgICA8L2FkZD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFN0cmluZyBjYWNoaW5nIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3IgQnl0ZUNodW5rLiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMTA5MDwvYnVnPjogVXNlIGEgVVJMIGVuY29kZWQgcGF0aCB3aGVuIHNldHRpbmcgc2Vzc2lvbiBjb29raWVzLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgIDxhZGQ+CisgICAgICAgICAgQWRkIGdldEF0dHJpYnV0ZU5hbWUoKSB0byBQcm90b2NvbEhhbmRsZXIgdG8gZ2V0IGFsbCBhdHRyaWJ1dGVzIGF0IHJ1bnRpbWUgKHBlcm8pCisgICAgICAgPC9hZGQ+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJKYXNwZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8dXBkYXRlPgorICAgICAgICBFeHBvc2VkIGNvbXBpbGVyU291cmNlVk0gYW5kIGNvbXBpbGVyVGFyZ2V0Vk0gb3B0aW9ucyB0byBKc3BDLiAoeW9hdnMpCisgICAgICA8L3VwZGF0ZT4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNsdXN0ZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICAgPGZpeD4KKyAgICAgICAgICBEZWx0YU1hbmFnZXIgYW5kIFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlciBnZW5lcmF0ZSBkb3VibGUganZtUm91dGUgKHBlcm8pCisgICAgICAgPC9maXg+CisgICAgICAgPGFkZD4KKyAgICAgICAgICBBZGQgc29tZSBtaXNzaW5nIEdldHRlcnMgYW5kIGxvZy5pc1hYWEVuYWJsZWRzIChwZXJvKQorICAgICAgIDwvYWRkPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iV2ViYXBwcyI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzE3MDc8L2J1Zz46IEJyb2tlbiBKYXZhU2NyaXB0IGNvbmZpcm1hdGlvbiBpbiBIVE1MIG1hbmFnZXIuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgUmVtb3ZlIGhhcmQtY29kZWQgYWRtaW4gY29udGV4dCBwYXRoIGZyb20gYWRtaW4ncyBiYW5uZXIuanNwLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIE1ham9yIGNvbm5lY3RvciBkb2NzIHVwZGF0ZS4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzE3MzI8L2J1Zz46IEZpeCBKYXBhbmVzZSBsb2NhbGl6YXRpb24gb2YgTWFuYWdlcidzIGxpc3Qgb3V0cHV0LiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlRvbWNhdCA1LjUuMyAoeW9hdnMpIj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJHZW5lcmFsIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMDU2ODwvYnVnPjogSW5jb21wbGV0ZSBzZXR1cC5odG1sIGRvY3VtZW50YXRpb24gZm9yIGxhdW5jaGluZyBqc3ZjLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFJlcGFja2FnZSBuYW1pbmcgZmVhdHVyZXMuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICBGaXggZGVwbG95ZXIgcGFja2FnaW5nLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IGVtYmVkIHBhY2thZ2luZy4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNhdGFsaW5hIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IG1lbW9yeSBsZWFrIHdoZW4gU2VjdXJpdHkgTWFuYWdlciBpcyB0dXJuZWQgb24uIChqZmFyY2FuZCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgV2hlbiBjaGVja2luZyBzdGF0dXMgY29kZXMgZm9yIGVycm9yIGhhbmRsaW5nLCBvbmx5IGNoZWNrIGlmCisgICAgICAgIFJlc3BvbnNlLmlzRXJyb3IoKSBpcyB0cnVlLiBUaGlzIHdheSwgdXNlcnMgbWF5IHVzZSBzZXRTdGF0dXMoKSB0byBzZXQgdGhlaXIgb3duCisgICAgICAgIGVycm9yIHN0YXR1cyB3aXRob3V0IGhhdmluZyB0aGUgZXJyb3IgcGFnZSBpbnZva2VkLiAoaW4gd2hpY2ggY2FzZSwgdGhlIHVzZXIgc2hvdWxkJ3ZlCisgICAgICAgIHVzZSBzZW5kRXJyb3IoKSkgKGZ1bmttYW4pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFJlbW92ZSBEaWdlc3RlciBjb2RlIGZvciBYZXJjZXMgd29ya2Fyb3VuZC4gKGpmYXJjYW5kKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICBHaXZlIHByb3BlciBwZXJtaXNzaW9uIHRvIHRoZSBiYWxhbmNlciBhcHAgd2hlbiBydW5uaW5nIHVuZGVyIHRoZSBzZWN1cml0eSBtYW5hZ2VyLiAoamZhcmNhbmQpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzA4Njk8L2J1Zz46IE1ha2Ugc3VyZSBKQUFTIHJlYWxtIG5hbWUgaXMgbGVnYWwuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgICBtZDVIZWxwZXIsIG1kNUVuY29kZXIsIGFuZCBub3JtYWxpemUgYXJlIHVzZWQgYnkgV2ViZGF2U2VydmxldCwKKyAgICAgICAgICBub3QgRGVmYXVsdFNlcnZlbHQgc28gbW92ZSB0aGVtIGludG8gV2ViZGF2U2VydmxldC4KKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMTI3NzwvYnVnPjogQ2xhcmlmaWVkIGF1dG9tYXRpYyBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IHNlY3Rpb24gb2YgSG9zdCBjb25maWd1cmF0aW9uIHBhZ2UuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICA8Zml4PgorICAgICAgIDxidWc+Mjg2MzE8L2J1Zz46IEpBQVNSZWFsbSBlbmhhbmNlbWVudHMgdG8gc3VwcG9ydCBjdXN0b20gdXNlciBhbmQgcm9sZSBjbGFzc2VzICB1c2UgQ29tbW9ucy1Mb2dnaW5nLiAoeW9hdnMpCisgICAgIDwvZml4PgorICAgICA8Zml4PgorICAgICAgIDxidWc+MzEzNjQ8L2J1Zz46IE1pc3NpbmcgcmVzb3VyY2UgaW4gb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkxvY2FsU3RyaW5nLnByb3BlcnRpZXMuICh5b2F2cykKKyAgICAgPC9maXg+CisgICAgIDxmaXg+CisgICAgICAgPGJ1Zz4zMTM2MjwvYnVnPjogTWlzc2luZyAtWGRlYnVnIGluIGNhdGFsaW5hLmJhdCB3aGVuIGxhdW5jaGluZyB3aXRoIEpQREEgYW5kIFNlY3VyaXR5LiAoeW9hdnMpCisgICAgIDwvZml4PgorICAgICA8Zml4PgorICAgICAgIDxidWc+MzEzNTY8L2J1Zz46IER1cGxpY2F0ZXMgbm90IGNvdW50ZWQgaW4gc2Vzc2lvbiBnZW5lcmF0aW9uLiAoeW9hdnMpCisgICAgIDwvZml4PgorICAgICA8Zml4PgorICAgICAgIDxidWc+MzA5NDk8L2J1Zz46IE1ha2Ugc3VyZSBBcHBsaWNhdGlvbkRpc3BhdGNoZXIgdW53cmFwcyByZXF1ZXN0L3Jlc3BvbnNlIGV2ZW4gaWYgaW5jbHVkZSBlcnJvciBvY2N1cnMuICh5b2F2cykKKyAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBGaXhlZCBTdGFuZGFyZENvbnRleHQuZ2V0U3RhcnRUaW1lKCkgdG8gcmV0dXJuIGFjdHVhbCBzdGFydCB0aW1lL2RhdGUgaW5zdGVhZCBvZiB0aW1lIChzdGFydHVwVGltZSkgaXQgdG9vayB0byBzdGFydCBjb250ZXh0LiAobHVlaGUpCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIGdldFJlcXVlc3QvZ2V0UmVzcG9uc2Ugc2hvdWxkIHJldHVybiB0aGUgbW9zdCByZWxldmFudCBpbnRlcmZhY2UsIHRvIGF2b2lkIGNhc3RzLiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgQWRkIGNoZWNrIGZvciBkaXJlY3RvcnkgYmVmb3JlIGNvbnNpZGVyaW5nIHNvbWV0aGluZyBpcyBhIGNvbXByZXNzZWQgV0FSLiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGRvY3M+CisgICAgICAgIFVwZGF0ZSB0aGUgY29ubmVjdG9yIGRvY3VtZW50YXRpb24uIChyZW1tKQorICAgICAgPC9kb2NzPgorICAgICAgPGZpeD4KKyAgICAgICAgV2hlbiBwYXJzaW5nIGEgY29udGV4dCBmaWxlLCBpZ25vcmUgdGhlICJwYXRoIiBhdHRyaWJ1dGU6CisgICAgICAgIHRoZSBvbmx5IHBsYWNlIHdoZXJlIGl0IGlzIGFjY2VwdGFibGUgaXMgaW4gc2VydmVyLnhtbC4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIERpZ2VzdGVyIGhhbmRsaW5nIGZpeGVzOiBhbHdheXMgY2FsbCByZXNldCBpbiBhIGZpbmFsbHkgYmxvY2sgYWZ0ZXIgdXNpbmcgYSBkaWdlc3Rlci4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFJlbW92ZSBtYW55IGZpZWxkcyBmcm9tIENvbm5lY3RvciwgYW5kIHRpZSB0aGUgY3JlYXRpb24gb2YgdGhlIENvbm5lY3RvciB0byB0aGUKKyAgICAgICAgY3JlYXRpb24gb2YgdGhlIHByb3RvY29sIGhhbmRsZXIuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBSZW1vdmUgcGFja2FnZSB0cmlnZ2VycyBmcm9tIHRoZSBjbGFzc2xvYWRlciwgd2hpY2ggc2VlbSB1c2VsZXNzIHdoZW4gdXNpbmcgSmF2YSA1LiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgUmVhbG1zIHdpbGwgbm93IHVzZSBzZXQgYXR0cmlidXRlIHRvIHNldCB0aGVtc2VsdmVzIGluIHRoZWlyIGNvbnRhaW5lciB3aGVuIHVzaW5nIEpNWC4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBKTVggcmVsYXRlZCBvcGVyYXRpb25zIHdpdGggdGhlIENvbm5lY3Rvci4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBzYXZlLXRvLVhNTCBmb3IgbmFtaW5nIHJlc291cmNlcy4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIFJlbW92ZSBhdXRoZW50aWNhdG9yICJkZWJ1ZyIgYXR0cmlidXRlcyBmcm9tIHRoZSBkZXNjcmlwdG9ycy4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFJlZmFjdG9yIG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRYWFggdG8gdXNlIG5ldyBzdXBlciBjbGFzcyBSZXNvdXJjZUJhc2UuIChwZXJvKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICBFbmFibGUgQ29ubmVjdG9yLmZpbmRMaWZlY3ljbGVMaXN0ZW5lciB0aGF0IHdlIGNhbiBsaXN0ZW4gc3RhcnQvc3RvcCBDb25uZWN0b3IgZXZlbnRzIGFuZCBzYXZlIHRoZSBsaXN0ZW5lciB0byB4bWwuIChwZXJvKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBSZW1vdmUgV2F0Y2hkb2cgcmVmZXJlbmNlcywgYXMgaXQgaXMgbm8gbG9uZ2VyIHVzZWQuICh5b2F2cykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMTUxMTwvYnVnPjogRG9uJ3QgY2FsbCBzZXRlbnYuYmF0IGlmIG5vdCBmb3VuZCwgaW4gKnVzaW5nLWxhdW5jaGVyIHNjcmlwdHMuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMTU0OTwvYnVnPjogQWRkIG5hbWUgdG8gV2ViYXBwQ2xhc3NMb2FkZXIncyBzdG9wcGVkIG1lc3NhZ2UuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ295b3RlIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgQWxsb3cgY3VzdG9taXplZCBzZXJ2ZXIgaGVhZGVyIGZvciBTdGFuZGFsb25lLiAoZnVua21hbikKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgRGlnZXN0ZXIucmVzZXQgbm93IHJlbW92ZXMgdGhlIGVycm9yIGhhbmRsZXIsIHRoZSByb290IGFuZCBjYWxscyBjbGVhciwgdG8gcHJldmVudAorICAgICAgICBhbnkgbWVtb3J5IGxlYWsuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBSZW1vdmUgdXNlbGVzcyBzdHVmZiBpbiBkaWdlc3Rlci4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEluIEhUVFAsIGFkZCBhIHV0aWxpdHkgbWV0aG9kIHRvIGNvbnZlcnQgc3RyaW5ncyB0byBieXRlIGFycmF5cywgYW5kIG91dHB1dCB0aGUgc2VydmVyIGhlYWRlcgorICAgICAgICBkaXJlY3RseSBhcyBieXRlcy4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxhZGQ+CisgICAgICAgIEFkZCBhIG1hc3RlciBzbGF2ZSB0aHJlYWQgcG9vbCBiYXNlZCBvbiB0aGUgY29kZSBmcm9tIFRvbWNhdCA0LjAuIEl0IGlzIGxlc3MgZXhvdGljIHRoYW4gdGhlCisgICAgICAgIGRlZmF1bHQgb25lLCBhbmQgbWlnaHQgZmFyZSBiZXR0ZXIgb24gc29tZSBwaWNreSBzeXN0ZW1zLCBzdWNoIGFzIFJlZGhhdCA5LiBUaGUgdHdvIHRocmVhZHBvb2xzCisgICAgICAgIHdpbGwgbGlrZWx5IGJlIHJlbW92ZWQgb25jZSB3ZSB1c2UgdGhlIEphdmEgNSBBUEksIGFsdGhvdWdoIG1vcmUgaW52ZXN0aWdhdGlvbiBpcyBuZWVkZWQuIChyZW1tKQorICAgICAgPC9hZGQ+CisgICAgICA8Zml4PgorICAgICAgICBGaXggaXNzdWUgd2l0aCBnZXRQcm9wZXJ0eSBpbiBJbnRyb3NwZWN0aW9uVXRpbHMuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBSZW1vdmUgYXR0cmlidXRlIHRyYW5zbGF0aW9uIGZvciBTU0wgaW4gdGhlIEhUVFAgcHJvdG9jb2wgaGFuZGxlcjogaXQgd2lsbCBub3cgYmUgZG9uZSBpbiB0aGUKKyAgICAgICAgQ2F0YWxpbmEgQ29ubmVjdG9yIGNsYXNzLiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IGhhbmRsaW5nIG9mIHRoZSAidGltZW91dCIgYXR0cmlidXRlIG9mIHRoZSBIVFRQIHByb3RvY29sIGhhbmRsZXIuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJKYXNwZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMxMTcxPC9idWc+OiBXcmFwIHRvIGF2b2lkIENsYXNzQ2FzdEV4Y2VwdGlvbiBpbiBQYWdlQ29udGV4dEltcGwuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMTI1NzwvYnVnPjogQWRkZWQgc3BlY2lmaWNhdGlvbiBvZiBlbmRvcnNlZCBkaXJzIGlmIGZvcmtpbmcuICBOb3RlIHRoYXQgdGhpcyBpcyBmYWlybHkgdXNlbGVzcyBmb3Igbm93IGluIDUuNSBzaW5jZSBpdCB1c2VzIEpEVCBhbmQgbm90IGphdmFjIGJ5IGRlZmF1bHQuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGRvY3M+CisgICAgICAgIERvY3VtZW50IG5ldyBKYXNwZXIgZGVmYXVsdHMsIGFuZCB1cGRhdGUgdGhlIHByb2R1Y3Rpb24gY29uZmlndXJhdGlvbi4gKHJlbW0pCisgICAgICA8L2RvY3M+CisgICAgICA8Zml4PgorICAgICAgICBDb3BpZWQgWE1MIGVuY29kaW5nIGRldGVjdGlvbiBsb2dpYyBpbnRvIEpBU1BFUiwgc28gd2UncmUgbm8gbG9uZ2VyIGRlcGVuZGVudCBvbiBYZXJjZXMuIChsdWVoZSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IGNvc21ldGljIGlzc3VlIHdoZXJlIGV4dHJhIENSTEYgd291bGQgYmUgaW5zZXJ0ZWQgZHVyaW5nIGVhY2ggcHJlY29tcGlsYXRpb24gaW4gd2ViLnhtbC4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEFsbG93IGNvbmZpZ3VyaW5nIHRoZSBpbnRlcnZhbCBmb2xsb3dpbmcgYSBjb21waWxhdGlvbiBkdXJpbmcgd2hpY2ggYSBKU1Agd2lsbCBub3QgYmUgY2hlY2tlZAorICAgICAgICBmb3IgbW9kaWZpY2F0aW9ucy4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzE0NjU8L2J1Zz46IEVuc3VyZSB0aGF0IHRoZSBjb21waWxlciByZWFkcyB0aGUgLmphdmEgZmlsZSB1c2luZyB0aGUgc2FtZSBlbmNvZGluZyBhcyB0aGF0IHdpdGggd2hpY2ggaXQgd2FzIHdyaXR0ZW4uIChtYXJrdCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMTUxMDwvYnVnPjogTnVsbCBvdXQgcmVzcG9uc2UgaW4gSnNwV3JpdGVySW1wbCNyZWN5Y2xlIHRvIGFpZCBpbiBKQm9zcyBtZW1vcnkgbGVhay4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJDbHVzdGVyIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgQWRkZWQgZmxhZyB0byB0aGUgY2x1c3RlciAobm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbikgdG8gZW5hYmxlL2Rpc2FibGUgdGhlCisgICAgICAgIG5vdGlmaWNhdGlvbnMgb2YgYXR0cmlidXRlL2NvbnRleHQgbGlzdGVuZXJzIHVwb24gcmVwbGljYXRpb24gb2YgYSBzZXNzaW9uIGRlbHRhCisgICAgICAgIFdvcmtzIG9ubHkgd2l0aCB0aGUgRGVsdGFNYW5hZ2VyIChmaGFuaWspCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEFkZGVkIGZsYWcgdG8gdGhlIGNsdXN0ZXIgKENsdXN0ZXIvU2VuZGVyL2Fja1RpbWVvdXQpIHRvIHNldCB0aGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMKKyAgICAgICAgZm9yIGEgc3luY2hyb25vdXMgcmVxdWVzdCB0byBnbyB0aHJvdWdoLCBkZWZhdWx0cyB0byAxNTAwMG1zIChmaGFuaWspCisgICAgICA8L3VwZGF0ZT4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IldlYmFwcHMiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjI5NDg1PC9idWc+OiBJIGJyb2tlIHRoZSBIVE1MIG1hbmFnZXIgd2hlbiBhZGRpbmcgSmF2YVNjcmlwdCBjb25maXJtYXRpb24sIGZpeGVkIG5vdyA7KSAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzEwNTg8L2J1Zz46IEVuc3VyZSBTdGF0dXNUcmFuc2Zvcm1lciBlc2NhcGVzIHF1ZXJ5IHN0cmluZyBmb3IgWE1MLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEFkZGVkIGNvbnRleHRzJyBzdGFydCB0aW1lIChhdmFpbGFibGUgZnJvbSAnc3RhcnRUaW1lJyBNQmVhbiBhdHRyaWJ1dGUgb2YgU3RhbmRhcmRDb250ZXh0KSB0byBzdGF0dXMgcGFnZSAobHVlaGUpCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzEyNjQ8L2J1Zz46IHRoZSBkZXBsb3kgdGFzayBzaG91bGQgbm93IGJlaGF2ZSBjb3JyZWN0bHkuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBSZWZhY3RvciB0aGUgbWFuYWdlciBzZXJ2bGV0IHRvIG1ha2UgY2FsbHMgdG8gdGhlIGRlcGxveWVyIG1vcmUgcm9idXN0LiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgVXNlIHRoZSBtb3JlIHJvYnVzdCBTdHJpbmcudmFsdWVPZiBpbiB0aGUgZm9ybSBlZGl0IGFjdGlvbiBvZiB0aGUgY29ubmVjdG9yLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+Cis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iVG9tY2F0IDUuNS4yICh5b2F2cykiPgorICA8c3Vic2VjdGlvbiBuYW1lPSJHZW5lcmFsIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgVGhlIGluc3RhbGxlciB3aWxsIG5vdyB1c2UgdGhlIHN5c3RlbSdzIEpSRS4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNhdGFsaW5hIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IFVSTCBnZW5lcmF0aW9uIGZvciBjbGFzc2xvYWRlcnMgb24gV2luZG93cywgY2F1c2luZyBjb21tb24vY2xhc3NlcyBhbmQgc2hhcmVkL2NsYXNzZXMKKyAgICAgICAgdG8gYmUgdW51c2FibGUgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzExMTA8L2J1Zz46IEZpeCByZXNvdXJjZSBwYWNrYWdpbmcgYnVnIGZvciBzZXJ2bGV0cyAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IDUuNSByZWdyZXNzaW9uIHdoZXJlIGdvaW5nIHRocm91Z2ggdGhlIGF1dGhlbnRpY2F0b3Igd291bGQgY3JlYXRlIGEgc2Vzc2lvbiBlYWNoIHRpbWUuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBGaXggY2xhc3NuYW1lIG9mIHRoZSBjb25uZWN0b3IgaW4gRW1iZWRkZWQsIGFuZCByZW1vdmUgdGhlIHNvY2tldCBmYWN0b3J5LiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ295b3RlIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgUmVkbyBzZXJ2ZXIgaGVhZGVyIGhhbmRsaW5nIGFnYWluLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgQ2xlYW51cCBhIGxpdHRsZSBhY2Nlc3MgdG8gdGhlIGhlYWRlcnMgdXNpbmcgYSBsb2NhbCB2YXJpYWJsZSBhbmQKKyAgICAgICAgdXNlIHNldFZhbHVlIGZvciBTZXJ2ZXIgYW5kIERhdGUgaGVhZGVycy4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9Ikphc3BlciI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIFJlbW92ZSBtYXhUYWdOZXN0aW5nIGFuZCBjdXJUYWdOZXN0aW5nIHNpbmNlIHRoZXkgYXJlIHVudXNlZC4gKGZ1bmttYW4pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCB0YWcgZmlsZXMgaGFuZGxpbmcgd2l0aCBKRFQsIHdoaWNoIHdlcmUgdXN1c2FibGUsIGFuZCByZWZhY3RvciB0aGUgbGlmZWN5Y2xlIGhhbmRsaW5nIG9mCisgICAgICAgIHRoZSBwYWdlIGxvYWRlci4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNsdXN0ZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJXZWJhcHBzIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlRvbWNhdCA1LjUuMSAoeW9hdnMpIj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iR2VuZXJhbCI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFRvbWNhdCA1LjUgY2FuIGJlIGJ1aWx0IG9uIEpESyA1LjAuICh5b2F2cykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgV2luZG93cyBpbnN0YWxsZXIgcG9saXNoLiAobWxhZGVuLCByZW1tKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBSZW1vdmUgZGVwZW5kZW5jeSBvbiBKYWthcnRhIHJlZ2V4cC4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNhdGFsaW5hIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgQWxsb3cgb3ZlcnJpZGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGRlZmF1bHQgY29udGV4dCBmaWxlLCBzaW1pbGFyIHRvIHRoZSBkZWZhdWx0CisgICAgICAgIHdlYi54bWwuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBCYWNrcG9ydCBpZi1lbHNlIGxvZ2ljIGZvciBTU0kgc2VydmxldCBmcm9tIDQuMSAoZnVua21hbikKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgUmVtb3ZlIERlZmF1bHRDb250ZXh0IGVsZW1lbnRzIGZyb20gdGhlIGRpZ2VzdGVyIHJ1bGVzLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IFJlc291cmNlTGluayBoYW5kbGluZy4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIE1vZGlmeSB0aGUgYXV0byBkZXBsb3llciB0byBnZXQgYWxvbmcgd2l0aCBjb250ZXh0cyB3aGljaCBhcmUgc3RhdGljYWxseSBkZWZpbmVkIGluIHNlcnZlci54bWwuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBFeHRlcm5hbGl6ZSBjb25zdGFudCBzdHJpbmdzIGRlZmluaW5nIHRoZSBsb2NhdGlvbiBvZiBkZXBsb3ltZW50IHJlbGF0ZWQgcmVzb3VyY2VzLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMTA1MjwvYnVnPjogQmVhbkZhY3Rvcnkgc3dhbGxvd3Mgcm9vdCBjYXVzZSBvZiBleGNlcHRpb24uICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgQWxsb3cgdXNpbmcgZGVwbG95IEFudCB0YXNrIHdpdGgganVzdCBjb25maWcgYXR0cmlidXRlLCBzdWJtaXR0ZWQgYnkgTWljaGFlbCBTY2h1ZXJpZy4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxhZGQ+CisgICAgICAgIEFkZGVkIGxvbmdlc3QgdGltZSBhbiBleHBpcmVkIHNlc3Npb24gaGFkIGJlZW4gYWxpdmUgdG8gc2V0IG9mIG1vbml0b3JhYmxlIHNlc3Npb24gbWFuYWdlciBhdHRyaWJ1dGVzLiAobHVlaGUpCisgICAgICA8L2FkZD4KKyAgICAgIDxhZGQ+CisgICAgICAgIEFkZGVkIGF2ZXJhZ2UgdGltZSBhbiBleHBpcmVkIHNlc3Npb24gaGFkIGJlZW4gYWxpdmUgdG8gc2V0IG9mIG1vbml0b3JhYmxlIHNlc3Npb24gbWFuYWdlciBhdHRyaWJ1dGVzLiAobHVlaGUpCisgICAgICA8L2FkZD4KKyAgICAgIDxmaXg+CisgICAgICAgIENsZWFyIGEgcmVmZXJlbmNlIGluIHRoZSBkaWdlc3RlciB3aGVyZSBhIGNvbnRleHQgd291bGQgYmUgcmVmZXJlbmNlZCBmb3IgbW9yZSB0aW1lIHRoYW4gaXQKKyAgICAgICAgbmVlZGVkLCB1bnRpbCB0aGUgbmV4dCBjb250ZXh0IGRlcGxveW1lbnQgb3BlcmF0aW9uLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ295b3RlIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMTAxODwvYnVnPjogUmFjZSBjb25kaXRpb24gaW4gU3lzdGVtTG9nSGFuZGxlci4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJKYXNwZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICBVc2UgdGhlICJjb21waWxlciIgcGFyYW1ldGVyIHRvIGFsbG93IHNwZWNpZnlpbmcgdGhhdCBBbnQgc2hvdWxkIGJlIHVzZWQuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBJZ25vcmUgSkRUIGNvbXBpbGVyIHdhcm5pbmdzLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGFkZD4KKyAgICAgICAgQWRkZWQgY29tcGlsZXJUYXJnZXRWTSBvcHRpb24gc3VwcG9ydCwgIjEuNCIgZGVmYXVsdC4gKHlvYXZzKQorICAgICAgPC9hZGQ+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJDbHVzdGVyIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IGFkZGluZyB0aGUgY2x1c3RlcmluZyB2YWx2ZSwgc28gdGhhdCBzZXNzaW9uIHJlcGxpY2F0aW9uIGFjdHVhbGx5IG9jY3Vycy4gKGZoYW5paykKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iV2ViYXBwcyI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIE1ham9yIGRvY3VtZW50YXRpb24gdXBkYXRlIHdpdGggY3VycmVudCBUb21jYXQgNS41IGNoYW5nZXMuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBBZGRlZCBKYXZhU2NyaXB0IGNvbmZpcm1hdGlvbiBkaWFsb2cgdG8gImRhbmdlcm91cyIgTWFuYWdlciBzZXJ2bGVyIGxpbmtzLiAoeW9hdnMpCisgICAgICA8L3VwZGF0ZT4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJUb21jYXQgNS41LjAgKHlvYXZzKSI+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkdlbmVyYWwiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8dXBkYXRlPgorICAgICAgICBNYW55IHVwZGF0ZWQgYW5kIGZpeGVkIEphdmFEb2NzLiAoeW9hdnMpCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIERlc2lnbmVkIGFuZCB0ZXN0ZWQgVG9tY2F0IG9uIEoyU0UgNS4wIChha2EgSkRLIDEuNSkuIChldmVyeW9uZSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgQnVuZGxlZCBFY2xpcHNlIEpEVCAobmV3IGRlcGVuZGVuY3kpIHRvIGFsbG93IFRvbWNhdCB0byBydW4gb24gYSBKUkUgb25seSwgaS5lLiBubyBKREsgcmVxdWlyZWQuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBSZXBhY2thZ2UgY29tbW9ucy1kYmNwIGFuZCBpdHMgZGVwZW5kZW5jaWVzIGFzIGEgc2lnbGUgc21hbGxlciBXQVIsIHdpdGggcmVuYW1lZCBwYWNrYWdlcy4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFJlbW92ZWQgZGVwZW5kZW5jaWVzIG9uIGNvbW1vbnMtZGlnZXN0ZXIsIGNvbW1vbnMtYmVhbnV0aWxzLCBhbmQgY29tbW9ucy1jb2xsZWN0aW9ucy4KKyAgICAgICAgVGhlIHJlbGV2YW50IGRpZ2VzdGVyIGZ1bmN0aW9uYWxpdHkgaXMgbm93IG1lcmdlZCBpbiB0b21jYXQtdXRpbC4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNhdGFsaW5hIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVtb3ZlZCB1c2FnZSBvZiBvcmcuYXBhY2hlLmNhdGFsaW5hLkxvZ2dlciwgaW5jcmVhc2VkIHVzYWdlIG9mIGNvbW1vbnMtbG9nZ2luZyBldmVyeXdoZXJlLiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVmYWN0b3JlZCBjbGFzc2xvYWRlciBjb2RlIHRvIGJldHRlciBoYW5kbGUgSkFSIGFuZCBnZW5lcmFsIHJlc291cmNlIGxvY2tpbmcuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBXcml0dGVuIEpNWC1yZWxhdGVkIGNvZGUgdG8gcGxheSBuaWNlbHkgd2l0aCBKMlNFIDUuMCBidWlsdC1pbiBKTVggYWJpbGl0aWVzLiAocmVtbSwgY29zdGluKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBFeHRlbnNpdmVseSBwcm9maWxlZCBhbmQgb3B0aW1pemVkIHRoZSBzZXJ2ZXIgc3RhcnR1cCBwZXJmb3JtYW5jZSBhcyB3ZWxsIGFzIHRoZSByZXF1ZXN0IG1hcHBpbmcgYW5kIHByb2Nlc3NpbmcgcGlwZWxpbmUuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBUaGUgY29udGFpbmVyIHdpbGwgbm93IGFsd2F5cyBwcm9jZXNzIGEgL01FVEEtSU5GL2NvbnRleHQueG1sIHJlc291cmNlLCB1bmxlc3MgdGhlIHdlYmFwcCBoYXMgYSBzcGVjaWZpZWQgZXh0ZXJuYWwgY29udGV4dCBmaWxlLiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgTmV3IGRlZmF1bHQgY29uZmlndXJhdGlvbiBtZWNoYW5pc20gZm9yIHdlYiBhcHBsaWNhdGlvbnMsIHJlcGxhY2luZyBEZWZhdWx0Q29udGV4dC4gVGhpcyB1c2VzIGEKKyAgICAgICAgc2hhcmVkIGNvbnRleHQgZmlsZSBsb2NhdGVkIGluIGNvbmYvY29udGV4dC54bWwuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBSZXZhbXBlZCBkZXBsb3llciwgYWxsb3lpbmcgZnVsbCBob3RkZXBsb3kgKG5vdGU6IG9uIFdpbmRvd3MsIHRoaXMgcmVxdWlyZXMgdGhlIGFudGkgZmlsZSBsb2NraW5nCisgICAgICAgIGZlYXR1cmVzKS4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFJlbW92ZSB2ZXJib3NpdHkgZnJvbSB0aGUgSk5ESSByZXNvdXJjZXMgY29uZmlndXJhdGlvbiwgYnkgYWxsb3dpbmcgYXJiaXRyYXJ5IGF0dHJpYnV0ZXMgb24gdGhlIFJlc291cmNlIGVsZW1lbnQuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBTaW1wbGVyIFZhbHZlIGludGVyZmFjZSwgdG8gYWxsb3cgc21hbGxlciBzdGFjayB0cmFjZXMgYW5kIHJlZHVjaW5nIHRoZSBhbW91bnQgb2YgbWV0aG9kIGNhbGxzLiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ295b3RlIj4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9Ikphc3BlciI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEVjbGlwc2UgSkRUIGlzIG5vdyB0aGUgZGVmYXVsdCBKYXZhIGNvbXBpbGVyIGluIEphc3Blci4gU291cmNlIGRlcGVuZGVuY2llcyBhcmUgbm93IGxvYWRlZCBmcm9tCisgICAgICAgIHRoZSBjb250YWluZXIgY2xhc3Nsb2FkZXIsIGFuZCBjb21waWxhdGlvbiB0aW1lcyBhcmUgbXVjaCBmYXN0ZXIuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBKYXNwZXIgZGV2ZWxvcG1lbnQgbW9kZSBzaG91bGQgbm93IGhhdmUgYWNjZXB0YWJsZSBwZXJmb3JtYW5jZSBmb3IgaGVhdmlseSBhY2Nlc3NlZCBwYWdlcy4KKyAgICAgICAgUHJlY29tcGlsaW5nIEpTUHMgaXMgc3RpbGwgc2lnbmlmaWNhbnRseSBtb3JlIGVmZmljaWVudCwgaG93ZXZlci4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNsdXN0ZXIiPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iV2ViYXBwcyI+CisgICAgPGNoYW5nZWxvZz4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorPC9zZWN0aW9uPgorCis8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jbGFzcy1sb2FkZXItaG93dG8ueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jbGFzcy1sb2FkZXItaG93dG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYTI0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NsYXNzLWxvYWRlci1ob3d0by54bWwKQEAgLTAsMCArMSwyNzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJjbGFzcy1sb2FkZXItaG93dG8uaHRtbCI+CisKKyAgICAmcHJvamVjdDsKKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgICAgIDxhdXRob3IgZW1haWw9InlvYXZzQGFwYWNoZS5vcmciPllvYXYgU2hhcGlyYTwvYXV0aG9yPgorICAgICAgICA8dGl0bGU+Q2xhc3MgTG9hZGVyIEhPVy1UTzwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJRdWljayBTdGFydCI+CisKKzxwPlRoZSBmb2xsb3dpbmcgcnVsZXMgY292ZXIgYWJvdXQgOTUlIG9mIHRoZSBkZWNpc2lvbnMgdGhhdCBhcHBsaWNhdGlvbgorZGV2ZWxvcGVycyBhbmQgZGVwbG95ZXJzIG11c3QgbWFrZSBhYm91dCB3aGVyZSB0byBwbGFjZSBjbGFzcyBhbmQgcmVzb3VyY2UKK2ZpbGVzIHRvIG1ha2UgdGhlbSBhdmFpbGFibGUgdG8gd2ViIGFwcGxpY2F0aW9uczo8L3A+Cis8dWw+Cis8bGk+Rm9yIGNsYXNzZXMgYW5kIHJlc291cmNlcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgd2ViIGFwcGxpY2F0aW9uLAorICAgIHBsYWNlIHVucGFja2VkIGNsYXNzZXMgYW5kIHJlc291cmNlcyB1bmRlciA8Y29kZT4vV0VCLUlORi9jbGFzc2VzPC9jb2RlPgorICAgIG9mIHlvdXIgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUsIG9yIHBsYWNlIEpBUiBmaWxlcyBjb250YWluaW5nIHRob3NlCisgICAgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIHVuZGVyIDxjb2RlPi9XRUItSU5GL2xpYjwvY29kZT4gb2YgeW91ciB3ZWIKKyAgICBhcHBsaWNhdGlvbiBhcmNoaXZlLjwvbGk+Cis8bGk+Rm9yIGNsYXNzZXMgYW5kIHJlc291cmNlcyB0aGF0IG11c3QgYmUgc2hhcmVkIGFjcm9zcyBhbGwgd2ViIGFwcGxpY2F0aW9ucywKKyAgICBwbGFjZSB1bnBhY2tlZCBjbGFzc2VzIGFuZCByZXNvdXJjZXMgdW5kZXIKKyAgICA8Y29kZT4kQ0FUQUxJTkFfQkFTRS9zaGFyZWQvY2xhc3NlczwvY29kZT4sIG9yIHBsYWNlIEpBUiBmaWxlcworICAgIGNvbnRhaW5pbmcgdGhvc2UgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIHVuZGVyCisgICAgPGNvZGU+JENBVEFMSU5BX0JBU0Uvc2hhcmVkL2xpYjwvY29kZT4uPC9saT4KKzwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+CisKKzxwPkxpa2UgbWFueSBzZXJ2ZXIgYXBwbGljYXRpb25zLCBUb21jYXQgNSBpbnN0YWxscyBhIHZhcmlldHkgb2YgY2xhc3MgbG9hZGVycworKHRoYXQgaXMsIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgPGNvZGU+amF2YS5sYW5nLkNsYXNzTG9hZGVyPC9jb2RlPikgdG8gYWxsb3cKK2RpZmZlcmVudCBwb3J0aW9ucyBvZiB0aGUgY29udGFpbmVyLCBhbmQgdGhlIHdlYiBhcHBsaWNhdGlvbnMgcnVubmluZyBvbiB0aGUKK2NvbnRhaW5lciwgdG8gaGF2ZSBhY2Nlc3MgdG8gZGlmZmVyZW50IHJlcG9zaXRvcmllcyBvZiBhdmFpbGFibGUgY2xhc3NlcyBhbmQKK3Jlc291cmNlcy4gIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgZnVuY3Rpb25hbGl0eSBkZWZpbmVkIGluIHRoZQorU2VydmxldCBTcGVjaWZpY2F0aW9uLCB2ZXJzaW9uIDIuNCAtLSBpbiBwYXJ0aWN1bGFyLCBTZWN0aW9ucyA5LjQgYW5kIDkuNi48L3A+CisKKzxwPkluIGEgSjJTRSAyICh0aGF0IGlzLCBKMlNFIDEuMiBvciBsYXRlcikgZW52aXJvbm1lbnQsIGNsYXNzIGxvYWRlcnMgYXJlCithcnJhbmdlZCBpbiBhIHBhcmVudC1jaGlsZCB0cmVlLiAgTm9ybWFsbHksIHdoZW4gYSBjbGFzcyBsb2FkZXIgaXMgYXNrZWQgdG8KK2xvYWQgYSBwYXJ0aWN1bGFyIGNsYXNzIG9yIHJlc291cmNlLCBpdCBkZWxlZ2F0ZXMgdGhlIHJlcXVlc3QgdG8gYSBwYXJlbnQKK2NsYXNzIGxvYWRlciBmaXJzdCwgYW5kIHRoZW4gbG9va3MgaW4gaXRzIG93biByZXBvc2l0b3JpZXMgb25seSBpZiB0aGUgcGFyZW50CitjbGFzcyBsb2FkZXIocykgY2Fubm90IGZpbmQgdGhlIHJlcXVlc3RlZCBjbGFzcyBvciByZXNvdXJjZS4gIFRoZSBtb2RlbCBmb3IKK3dlYiBhcHBsaWNhdGlvbiBjbGFzcyBsb2FkZXJzIGRpZmZlcnMgc2xpZ2h0bHkgZnJvbSB0aGlzLCBhcyBkaXNjdXNzZWQgYmVsb3csCitidXQgdGhlIG1haW4gcHJpbmNpcGxlcyBhcmUgdGhlIHNhbWUuPC9wPgorCis8cD5XaGVuIFRvbWNhdCA1IGlzIHN0YXJ0ZWQsIGl0IGNyZWF0ZXMgYSBzZXQgb2YgY2xhc3MgbG9hZGVycyB0aGF0IGFyZQorb3JnYW5pemVkIGludG8gdGhlIGZvbGxvd2luZyBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcywgd2hlcmUgdGhlIHBhcmVudAorY2xhc3MgbG9hZGVyIGlzIGFib3ZlIHRoZSBjaGlsZCBjbGFzcyBsb2FkZXI6PC9wPgorCis8c291cmNlPgorICAgICAgQm9vdHN0cmFwCisgICAgICAgICAgfAorICAgICAgIFN5c3RlbQorICAgICAgICAgIHwKKyAgICAgICBDb21tb24KKyAgICAgIC8gICAgICBcCisgQ2F0YWxpbmEgICBTaGFyZWQKKyAgICAgICAgICAgICAvICAgXAorICAgICAgICBXZWJhcHAxICBXZWJhcHAyIC4uLiAKKzwvc291cmNlPgorCis8cD5UaGUgY2hhcmFjdGVyaXN0aWNzIG9mIGVhY2ggb2YgdGhlc2UgY2xhc3MgbG9hZGVycywgaW5jbHVkaW5nIHRoZSBzb3VyY2UKK29mIGNsYXNzZXMgYW5kIHJlc291cmNlcyB0aGF0IHRoZXkgbWFrZSB2aXNpYmxlLCBhcmUgZGlzY3Vzc2VkIGluIGRldGFpbCBpbgordGhlIGZvbGxvd2luZyBzZWN0aW9uLjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJDbGFzcyBMb2FkZXIgRGVmaW5pdGlvbnMiPgorCis8cD5BcyBpbmRpY2F0ZWQgaW4gdGhlIGRpYWdyYW0gYWJvdmUsIFRvbWNhdCA1IGNyZWF0ZXMgdGhlIGZvbGxvd2luZyBjbGFzcworbG9hZGVycyBhcyBpdCBpcyBpbml0aWFsaXplZDo8L3A+Cis8dWw+Cis8bGk+PHN0cm9uZz5Cb290c3RyYXA8L3N0cm9uZz4gLSBUaGlzIGNsYXNzIGxvYWRlciBjb250YWlucyB0aGUgYmFzaWMgcnVudGltZQorICAgIGNsYXNzZXMgcHJvdmlkZWQgYnkgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lLCBwbHVzIGFueSBjbGFzc2VzIGZyb20gSkFSCisgICAgZmlsZXMgcHJlc2VudCBpbiB0aGUgU3lzdGVtIEV4dGVuc2lvbnMgZGlyZWN0b3J5CisgICAgKDxjb2RlPiRKQVZBX0hPTUUvanJlL2xpYi9leHQ8L2NvZGU+KS4gIDxlbT5OT1RFPC9lbT4gLSBTb21lIEpWTXMgbWF5CisgICAgaW1wbGVtZW50IHRoaXMgYXMgbW9yZSB0aGFuIG9uZSBjbGFzcyBsb2FkZXIsIG9yIGl0IG1heSBub3QgYmUgdmlzaWJsZQorICAgIChhcyBhIGNsYXNzIGxvYWRlcikgYXQgYWxsLjwvbGk+Cis8bGk+PHN0cm9uZz5TeXN0ZW08L3N0cm9uZz4gLSBUaGlzIGNsYXNzIGxvYWRlciBpcyBub3JtYWxseSBpbml0aWFsaXplZCBmcm9tCisgICAgdGhlIGNvbnRlbnRzIG9mIHRoZSA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlLiAgQWxsIHN1Y2gKKyAgICBjbGFzc2VzIGFyZSB2aXNpYmxlIHRvIGJvdGggVG9tY2F0IGludGVybmFsIGNsYXNzZXMsIGFuZCB0byB3ZWIKKyAgICBhcHBsaWNhdGlvbnMuICBIb3dldmVyLCB0aGUgc3RhbmRhcmQgVG9tY2F0IDUgc3RhcnR1cCBzY3JpcHRzCisgICAgKDxjb2RlPiRDQVRBTElOQV9IT01FL2Jpbi9jYXRhbGluYS5zaDwvY29kZT4gb3IKKyAgICA8Y29kZT4lQ0FUQUxJTkFfSE9NRSVcYmluXGNhdGFsaW5hLmJhdDwvY29kZT4pIHRvdGFsbHkgaWdub3JlIHRoZSBjb250ZW50cworICAgIG9mIHRoZSA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlIGl0c2VsZiwgYW5kIGluc3RlYWQKKyAgICBidWlsZCB0aGUgU3lzdGVtIGNsYXNzIGxvYWRlciBmcm9tIHRoZSBmb2xsb3dpbmcgcmVwb3NpdG9yaWVzOgorICAgIDx1bD4KKyAgICA8bGk+PGVtPiRDQVRBTElOQV9IT01FL2Jpbi9ib290c3RyYXAuamFyPC9lbT4gLSBDb250YWlucyB0aGUgbWFpbigpIG1ldGhvZAorICAgICAgICB0aGF0IGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgVG9tY2F0IDUgc2VydmVyLCBhbmQgdGhlIGNsYXNzIGxvYWRlcgorICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIGl0IGRlcGVuZHMgb24uPC9saT4KKyAgICA8bGk+PGVtPiRKQVZBX0hPTUUvbGliL3Rvb2xzLmphcjwvZW0+IC0gQ29udGFpbnMgdGhlICJqYXZhYyIgY29tcGlsZXIgdXNlZAorICAgICAgICB0byBjb252ZXJ0IEpTUCBwYWdlcyBpbnRvIHNlcnZsZXQgY2xhc3Nlcy48L2xpPgorICAgIDxsaT48ZW0+JENBVEFMSU5BX0hPTUUvYmluL2NvbW1vbnMtbG9nZ2luZy1hcGkuamFyPC9lbT4gLSBKYWthcnRhIGNvbW1vbnMgCisgICAgICAgIGxvZ2dpbmcgQVBJLjwvbGk+CisgICAgPGxpPjxlbT4kQ0FUQUxJTkFfSE9NRS9iaW4vY29tbW9ucy1kYWVtb24uamFyPC9lbT4gLSBKYWthcnRhIGNvbW1vbnMgCisgICAgICAgIGRhZW1vbiBBUEkuPC9saT4KKyAgICA8bGk+PGVtPmpteC5qYXI8L2VtPiAtIFRoZSBKTVggMS4yIGltcGxlbWVudGF0aW9uLjwvbGk+CisgICAgPC91bD48L2xpPgorPGxpPjxzdHJvbmc+Q29tbW9uPC9zdHJvbmc+IC0gVGhpcyBjbGFzcyBsb2FkZXIgY29udGFpbnMgYWRkaXRpb25hbCBjbGFzc2VzCisgICAgdGhhdCBhcmUgbWFkZSB2aXNpYmxlIHRvIGJvdGggVG9tY2F0IGludGVybmFsIGNsYXNzZXMgYW5kIHRvIGFsbCB3ZWIKKyAgICBhcHBsaWNhdGlvbnMuICBOb3JtYWxseSwgYXBwbGljYXRpb24gY2xhc3NlcyBzaG91bGQgPHN0cm9uZz5OT1Q8L3N0cm9uZz4KKyAgICBiZSBwbGFjZWQgaGVyZS4gIEFsbCB1bnBhY2tlZCBjbGFzc2VzIGFuZCByZXNvdXJjZXMgaW4KKyAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb21tb24vY2xhc3NlczwvY29kZT4sIGFzIHdlbGwgYXMgY2xhc3NlcyBhbmQKKyAgICByZXNvdXJjZXMgaW4gSkFSIGZpbGVzIHVuZGVyIHRoZQorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbW1vbnMvZW5kb3JzZWQ8L2NvZGU+LAorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbW1vbnMvaTE4bjwvY29kZT4gYW5kCisgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29tbW9uL2xpYjwvY29kZT4gZGlyZWN0b3JpZXMsCisgICAgYXJlIG1hZGUgdmlzaWJsZSB0aHJvdWdoIHRoaXMKKyAgICBjbGFzcyBsb2FkZXIuICBCeSBkZWZhdWx0LCB0aGF0IGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6CisgICAgPHVsPgorICAgIDxsaT48ZW0+Y29tbW9ucy1lbC5qYXI8L2VtPiAtIEpha2FydGEgY29tbW9ucyBlbCwgaW1wbGVtZW50aW5nIHRoZSAKKyAgICAgICAgZXhwcmVzc2lvbiBsYW5ndWFnZSB1c2VkIGJ5IEphc3Blci48L2xpPgorICAgIDxsaT48ZW0+amFzcGVyLWNvbXBpbGVyLmphcjwvZW0+IC0gVGhlIEpTUCAyLjAgY29tcGlsZXIuPC9saT4KKyAgICA8bGk+PGVtPmphc3Blci1jb21waWxlci1qZHQuamFyPC9lbT4gLSBUaGUgRWNsaXBzZSBKRFQgSmF2YSBjb21waWxlci48L2xpPgorICAgIDxsaT48ZW0+amFzcGVyLXJ1bnRpbWUuamFyPC9lbT4gLSBUaGUgSlNQIDIuMCBydW50aW1lLjwvbGk+CisgICAgPGxpPjxlbT5qc3AtYXBpLmphcjwvZW0+IC0gVGhlIEpTUCAyLjAgQVBJLjwvbGk+CisgICAgPGxpPjxlbT5uYW1pbmctY29tbW9uLmphcjwvZW0+IC0gVGhlIEpOREkgaW1wbGVtZW50YXRpb24gdXNlZCBieSBUb21jYXQgNQorICAgICAgICB0byByZXByZXNlbnQgaW4tbWVtb3J5IG5hbWluZyBjb250ZXh0cy48L2xpPgorICAgIDxsaT48ZW0+bmFtaW5nLWZhY3RvcnkuamFyPC9lbT4gLSBUaGUgSk5ESSBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IFRvbWNhdCA1CisgICAgICAgIHRvIHJlc29sdmUgcmVmZXJlbmNlcyB0byBlbnRlcnByaXNlIHJlc291cmNlcyAoRUpCLCBjb25uZWN0aW9uIAorICAgICAgICBwb29scykuPC9saT4KKyAgICA8bGk+PGVtPm5hbWluZy1mYWN0b3J5LWRiY3AuamFyPC9lbT4gLSBKYWthcnRhIGNvbW1vbnMgREJDUCwgcHJvdmlkaW5nIGEKKyAgICAgICAgSkRCQyBjb25uZWN0aW9uIHBvb2wgdG8gd2ViIGFwcGxpY2F0aW9ucy4gVGhlIGNsYXNzZXMgaGF2ZSBiZWVuIG1vdmVkCisgICAgICAgIG91dCBvZiB0aGVpciBkZWZhdWx0IG9yZy5hcGFjaGUuY29tbW9ucyBwYWNrYWdlLjwvbGk+CisgICAgPGxpPjxlbT5uYW1pbmctamF2YS5qYXI8L2VtPiAtIEhhbmRsZXIgZm9yIHRoZSBqYXZhOiBuYW1lc3BhY2UuPC9saT4KKyAgICA8bGk+PGVtPm5hbWluZy1yZXNvdXJjZXMuamFyPC9lbT4gLSBUaGUgc3BlY2lhbGl6ZWQgSk5ESSBuYW1pbmcgY29udGV4dAorICAgICAgICBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIHJlcHJlc2VudCB0aGUgc3RhdGljIHJlc291cmNlcyBvZiBhIHdlYgorICAgICAgICBhcHBsaWNhdGlvbi4gVGhpcyBpcyBub3QgcmVsYXRlZCB0byB0aGUgc3VwcG9ydCBvZiB0aGUgSjJFRSBFTkMsIGFuZAorICAgICAgICBjYW5ub3QgYmUgcmVtb3ZlZC48L2xpPgorICAgIDxsaT48ZW0+c2VydmxldC1hcGkuamFyPC9lbT4gLSBUaGUgU2VydmxldCAyLjQgQVBJLjwvbGk+CisgICAgPGxpPjxlbT50b21jYXQtaTE4bi0qKi5qYXI8L2VtPiAtIE9wdGlvbmFsIEpBUnMgY29udGFpbmluZyByZXNvdXJjZSBidW5kbGVzCisgICAgICAgIGZvciBvdGhlciBsYW5ndWFnZXMuIEFzIGRlZmF1bHQgYnVuZGxlcyBhcmUgYWxzbyBpbmNsdWRlZCBpbiBlYWNoIAorICAgICAgICBpbmRpdmlkdWFsIEpBUiwgdGhleSBjYW4gYmUgc2FmZWx5IHJlbW92ZWQgaWYgbm8gaW50ZXJuYXRpb25hbGl6YXRpb24KKyAgICAgICAgb2YgbWVzc2FnZXMgaXMgbmVlZGVkLjwvbGk+CisgICAgPC91bD48L2xpPgorPGxpPjxzdHJvbmc+Q2F0YWxpbmE8L3N0cm9uZz4gLSBUaGlzIGNsYXNzIGxvYWRlciBpcyBpbml0aWFsaXplZCB0byBpbmNsdWRlCisgICAgYWxsIGNsYXNzZXMgYW5kIHJlc291cmNlcyByZXF1aXJlZCB0byBpbXBsZW1lbnQgVG9tY2F0IDUgaXRzZWxmLiAgVGhlc2UKKyAgICBjbGFzc2VzIGFuZCByZXNvdXJjZXMgYXJlIDxzdHJvbmc+VE9UQUxMWTwvc3Ryb25nPiBpbnZpc2libGUgdG8gd2ViCisgICAgYXBwbGljYXRpb25zLiAgQWxsIHVucGFja2VkIGNsYXNzZXMgYW5kIHJlc291cmNlcyBpbgorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL3NlcnZlci9jbGFzc2VzPC9jb2RlPiwgYXMgd2VsbCBhcyBjbGFzc2VzIGFuZAorICAgIHJlc291cmNlcyBpbiBKQVIgZmlsZXMgdW5kZXIKKyAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9zZXJ2ZXIvbGliPC9jb2RlPiwgYXJlIG1hZGUgdmlzaWJsZSB0aHJvdWdoCisgICAgdGhpcyBjbGFzcyBsb2FkZXIuICBCeSBkZWZhdWx0LCB0aGF0IGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6CisgICAgPHVsPgorICAgIDxsaT48ZW0+Y2F0YWxpbmEuamFyPC9lbT4gLSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ2F0YWxpbmEgc2VydmxldAorICAgICAgICBjb250YWluZXIgcG9ydGlvbiBvZiBUb21jYXQgNS48L2xpPgorICAgIDxsaT48ZW0+Y2F0YWxpbmEtYW50LmphcjwvZW0+IC0gU29tZSBBbnQgdGFza3Mgd2hpY2ggY2FuIGJlIHVzZWQgdG8KKyAgICAgICAgbWFuYWdlIFRvbWNhdCB1c2luZyB0aGUgbWFuYWdlciB3ZWIgYXBwbGljYXRpb24uPC9saT4KKyAgICA8bGk+PGVtPmNhdGFsaW5hLW9wdGlvbmFsLmphcjwvZW0+IC0gU29tZSBvcHRpb25hbCBjb21wb25lbnRzIG9mCisgICAgICAgIENhdGFsaW5hLjwvbGk+CisgICAgPGxpPjxlbT5jb21tb25zLW1vZGVsZXIuamFyPC9lbT4gLSBBIG1vZGVsIE1CZWFucyBpbXBsZW1lbnRhdGlvbiB1c2VkCisgICAgICAgIGJ5IFRvbWNhdCB0byBleHBvc2UgaXRzIGludGVybmFsIG9iamVjdHMgdGhyb3VnaCBKTVguPC9saT4KKyAgICA8bGk+PGVtPnNlcnZsZXRzLXh4eHh4LmphcjwvZW0+IC0gVGhlIGNsYXNzZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2gKKyAgICAgICAgaW50ZXJuYWwgc2VydmxldCB0aGF0IHByb3ZpZGVzIHBhcnQgb2YgVG9tY2F0J3MgZnVuY3Rpb25hbGl0eS4KKyAgICAgICAgVGhlc2UgYXJlIHNlcGFyYXRlZCBzbyB0aGF0IHRoZXkgY2FuIGJlIGNvbXBsZXRlbHkgcmVtb3ZlZCBpZiB0aGUKKyAgICAgICAgY29ycmVzcG9uZGluZyBzZXJ2aWNlIGlzIG5vdCByZXF1aXJlZCwgb3IgdGhleSBjYW4gYmUgc3ViamVjdCB0bworICAgICAgICBzcGVjaWFsaXplZCBzZWN1cml0eSBtYW5hZ2VyIHBlcm1pc3Npb25zLjwvbGk+CisgICAgPGxpPjxlbT50b21jYXQtY295b3RlLmphcjwvZW0+IC0gQ295b3RlIEFQSS48L2xpPgorICAgIDxsaT48ZW0+dG9tY2F0LWh0dHAuamFyPC9lbT4gLSBTdGFuZGFsb25lIEphdmEgSFRUUC8xLjEgCisgICAgICAgIGNvbm5lY3Rvci48L2xpPgorICAgIDxsaT48ZW0+dG9tY2F0LWFqcC5qYXI8L2VtPiAtIENsYXNzZXMgZm9yIHRoZSBKYXZhIHBvcnRpb24gb2YgdGhlCisgICAgICAgIDxjb2RlPkFKUDwvY29kZT4gd2ViIHNlcnZlciBjb25uZWN0b3IsIHdoaWNoIGFsbG93cyBUb21jYXQgdG8KKyAgICAgICAgcnVuIGJlaGluZCB3ZWIgc2VydmVycyBzdWNoIGFzIEFwYWNoZSBhbmQgaVBsYW5ldCBpQVMgYW5kIGlXUy48L2xpPgorICAgIDxsaT48ZW0+dG9tY2F0LXV0aWwuamFyPC9lbT4gLSBVdGlsaXR5IGNsYXNzZXMgcmVxdWlyZWQgYnkgc29tZQorICAgICAgICBUb21jYXQgY29ubmVjdG9ycy48L2xpPgorICAgIDwvdWw+PC9saT4KKzxsaT48c3Ryb25nPlNoYXJlZDwvc3Ryb25nPiAtIFRoaXMgY2xhc3MgbG9hZGVyIGlzIHRoZSBwbGFjZSB0byBwdXQgY2xhc3NlcworICAgIGFuZCByZXNvdXJjZXMgdGhhdCB5b3Ugd2lzaCB0byBzaGFyZSBhY3Jvc3MgPHN0cm9uZz5BTEw8L3N0cm9uZz4KKyAgICB3ZWIgYXBwbGljYXRpb25zICh1bmxlc3MgVG9tY2F0IGludGVybmFsIGNsYXNzZXMgYWxzbyBuZWVkIGFjY2VzcywKKyAgICBpbiB3aGljaCBjYXNlIHlvdSBzaG91bGQgcHV0IHRoZW0gaW4gdGhlIDxzdHJvbmc+Q29tbW9uPC9zdHJvbmc+CisgICAgY2xhc3MgbG9hZGVyIGluc3RlYWQpLiAgQWxsIHVucGFja2VkIGNsYXNzZXMgYW5kIHJlc291cmNlcyBpbgorICAgIDxjb2RlPiRDQVRBTElOQV9CQVNFL3NoYXJlZC9jbGFzc2VzPC9jb2RlPiwgYXMgd2VsbCBhcyBjbGFzc2VzIGFuZAorICAgIHJlc291cmNlcyBpbiBKQVIgZmlsZXMgdW5kZXIgPGNvZGU+JENBVEFMSU5BX0JBU0Uvc2hhcmVkL2xpYjwvY29kZT4sIGFyZQorICAgIG1hZGUgdmlzaWJsZSB0aHJvdWdoIHRoaXMgY2xhc3MgbG9hZGVyLiBJZiBtdWx0aXBsZSBUb21jYXQgaW5zdGFuY2VzIGFyZQorICAgIHJ1biBmcm9tIHRoZSBzYW1lIGJpbmFyeSB1c2luZyB0aGUgJENBVEFMSU5BX0JBU0UgZW52aXJvbm1lbnQgdmFyaWFibGUsCisgICAgdGhlbiB0aGlzIGNsYXNzbG9hZGVyIHJlcG9zaXRvcmllcyBhcmUgcmVsYXRpdmUgdG8gJENBVEFMSU5BX0JBU0UgcmF0aGVyCisgICAgdGhhbiAkQ0FUQUxJTkFfSE9NRS48L2xpPgorPGxpPjxzdHJvbmc+V2ViYXBwWDwvc3Ryb25nPiAtIEEgY2xhc3MgbG9hZGVyIGlzIGNyZWF0ZWQgZm9yIGVhY2ggd2ViCisgICAgYXBwbGljYXRpb24gdGhhdCBpcyBkZXBsb3llZCBpbiBhIHNpbmdsZSBUb21jYXQgNSBpbnN0YW5jZS4gIEFsbCB1bnBhY2tlZAorICAgIGNsYXNzZXMgYW5kIHJlc291cmNlcyBpbiB0aGUgPGNvZGU+L1dFQi1JTkYvY2xhc3NlczwvY29kZT4gZGlyZWN0b3J5IG9mCisgICAgeW91ciB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSwgcGx1cyBjbGFzc2VzIGFuZCByZXNvdXJjZXMgaW4gSkFSIGZpbGVzCisgICAgdW5kZXIgdGhlIDxjb2RlPi9XRUItSU5GL2xpYjwvY29kZT4gZGlyZWN0b3J5IG9mIHlvdXIgd2ViIGFwcGxpY2F0aW9uCisgICAgYXJjaGl2ZSwgYXJlIG1hZGUgdmlzaWJsZSB0byB0aGUgY29udGFpbmluZyB3ZWIgYXBwbGljYXRpb24sIGJ1dCB0bworICAgIG5vIG90aGVycy48L2xpPgorPC91bD4KKworPHA+QXMgbWVudGlvbmVkIGFib3ZlLCB0aGUgd2ViIGFwcGxpY2F0aW9uIGNsYXNzIGxvYWRlciBkaXZlcmdlcyBmcm9tIHRoZQorZGVmYXVsdCBKYXZhIDIgZGVsZWdhdGlvbiBtb2RlbCAoaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSByZWNvbW1lbmRhdGlvbnMgaW4gdGhlCitTZXJ2bGV0IFNwZWNpZmljYXRpb24sIHZlcnNpb24gMi4zLCBzZWN0aW9uIDkuNy4yIFdlYiBBcHBsaWNhdGlvbiBDbGFzc2xvYWRlcikuICAKK1doZW4gYSByZXF1ZXN0IHRvIGxvYWQgYQorY2xhc3MgZnJvbSB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MgPGVtPldlYmFwcFg8L2VtPiBjbGFzcyBsb2FkZXIgaXMgcHJvY2Vzc2VkLAordGhpcyBjbGFzcyBsb2FkZXIgd2lsbCBsb29rIGluIHRoZSBsb2NhbCByZXBvc2l0b3JpZXMgPHN0cm9uZz5maXJzdDwvc3Ryb25nPiwKK2luc3RlYWQgb2YgZGVsZWdhdGluZyBiZWZvcmUgbG9va2luZy4gIFRoZXJlIGFyZSBleGNlcHRpb25zLiBDbGFzc2VzIHdoaWNoIGFyZQorcGFydCBvZiB0aGUgSlJFIGJhc2UgY2xhc3NlcyBjYW5ub3QgYmUgb3ZlcnJpZGVuLiBGb3Igc29tZSBjbGFzc2VzIChzdWNoIGFzCit0aGUgWE1MIHBhcnNlciBjb21wb25lbnRzIGluIEoyU0UgMS40KyksIHRoZSBKMlNFIDEuNCBlbmRvcnNlZCBmZWF0dXJlIGNhbiBiZSAKK3VzZWQgIAorKHNlZSB0aGUgY29tbW9uIGNsYXNzbG9hZGVyIGRlZmluaXRpb24gYWJvdmUpLgorTGFzdCwgYW55IEpBUiBjb250YWluaW5nIHNlcnZsZXQgQVBJIGNsYXNzZXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSAKK2NsYXNzbG9hZGVyLgorQWxsIG90aGVyIGNsYXNzIGxvYWRlcnMgaW4gVG9tY2F0IDUgZm9sbG93IHRoZSB1c3VhbCBkZWxlZ2F0aW9uIHBhdHRlcm4uPC9wPgorCis8cD5UaGVyZWZvcmUsIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGEgd2ViIGFwcGxpY2F0aW9uLCBjbGFzcyBvciByZXNvdXJjZQorbG9hZGluZyBsb29rcyBpbiB0aGUgZm9sbG93aW5nIHJlcG9zaXRvcmllcywgaW4gdGhpcyBvcmRlcjo8L3A+Cis8dWw+Cis8bGk+Qm9vdHN0cmFwIGNsYXNzZXMgb2YgeW91ciBKVk08L2xpPgorPGxpPlN5c3RlbSBjbGFzcyBsb2FkZXIgY2xhc3NzZXMgKGRlc2NyaWJlZCBhYm92ZSk8L2xpPgorPGxpPjxlbT4vV0VCLUlORi9jbGFzc2VzPC9lbT4gb2YgeW91ciB3ZWIgYXBwbGljYXRpb248L2xpPgorPGxpPjxlbT4vV0VCLUlORi9saWIvKi5qYXI8L2VtPiBvZiB5b3VyIHdlYiBhcHBsaWNhdGlvbjwvbGk+Cis8bGk+PGVtPiRDQVRBTElOQV9IT01FL2NvbW1vbi9jbGFzc2VzPC9lbT48L2xpPgorPGxpPjxlbT4kQ0FUQUxJTkFfSE9NRS9jb21tb24vZW5kb3JzZWQvKi5qYXI8L2VtPjwvbGk+Cis8bGk+PGVtPiRDQVRBTElOQV9IT01FL2NvbW1vbi9pMThuLyouamFyPC9lbT48L2xpPgorPGxpPjxlbT4kQ0FUQUxJTkFfSE9NRS9jb21tb24vbGliLyouamFyPC9lbT48L2xpPgorPGxpPjxlbT4kQ0FUQUxJTkFfQkFTRS9zaGFyZWQvY2xhc3NlczwvZW0+PC9saT4KKzxsaT48ZW0+JENBVEFMSU5BX0JBU0Uvc2hhcmVkL2xpYi8qLmphcjwvZW0+PC9saT4KKzwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJYTUwgUGFyc2VycyBhbmQgSjJTRSAxLjQiPgorCis8cD5BbW9uZyBtYW55IG90aGVyIGNoYW5nZXMsIHRoZSBKMlNFIDEuNCByZWxlYXNlIHBhY2thZ2VzIHRoZSBKQVhQIEFQSXMsIGFuZAorYSB2ZXJzaW9uIG9mIFhlcmNlcywgaW5zaWRlIHRoZSBKUkUuICBUaGlzIGhhcyBpbXBhY3RzIG9uIGFwcGxpY2F0aW9ucyB0aGF0Cit3aXNoIHRvIHVzZSB0aGVpciBvd24gWE1MIHBhcnNlci48L3A+CisKKzxwPkluIHByZXZpb3VzIHZlcnNpb25zIG9mIFRvbWNhdCA1LCB5b3UgY291bGQgc2ltcGx5IHJlcGxhY2UgdGhlIFhNTCBwYXJzZXIKK2luIHRoZSA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb21tb24vbGliPC9jb2RlPiBkaXJlY3RvcnkgdG8gY2hhbmdlIHRoZSBwYXJzZXIKK3VzZWQgYnkgYWxsIHdlYiBhcHBsaWNhdGlvbnMuICBIb3dldmVyLCB0aGlzIHRlY2huaXF1ZSB3aWxsIG5vdCBiZSBlZmZlY3RpdmUKK3doZW4geW91IGFyZSBydW5uaW5nIG9uIEoyU0UgMS40LCBiZWNhdXNlIHRoZSB1c3VhbCBjbGFzcyBsb2FkZXIgZGVsZWdhdGlvbgorcHJvY2VzcyB3aWxsIGFsd2F5cyBjaG9vc2UgdGhlIGltcGxlbWVudGF0aW9uIGluc2lkZSB0aGUgSkRLIGluIHByZWZlcmVuY2UKK3RvIHRoaXMgb25lLjwvcD4KKworPHA+SkRLIDEuNCBzdXBwb3J0cyBhIG1lY2hhbmlzbSBjYWxsZWQgdGhlICJFbmRvcnNlZCBTdGFuZGFyZHMgT3ZlcnJpZGUKK01lY2hhbmlzbSIgdG8gYWxsb3cgcmVwbGFjZW1lbnQgb2YgQVBJcyBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIEpDUCAoaS5lLgorRE9NIGFuZCBTQVggZnJvbSBXM0MpLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0byB1cGRhdGUgdGhlIFhNTCBwYXJzZXIKK2ltcGxlbWVudGF0aW9uLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZToKKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQvZG9jcy9ndWlkZS9zdGFuZGFyZHMvaW5kZXguaHRtbCI+CitodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40L2RvY3MvZ3VpZGUvc3RhbmRhcmRzL2luZGV4Lmh0bWw8L2E+LjwvcD4KKworPHA+VG9tY2F0IHV0aWxpemVzIHRoaXMgbWVjaGFuaXNtIGJ5IGluY2x1ZGluZyB0aGUgc3lzdGVtIHByb3BlcnR5IHNldHRpbmcKKzxjb2RlPi1EamF2YS5lbmRvcnNlZC5kaXJzPSRDQVRBTElOQV9IT01FL2NvbW1vbi9lbmRvcnNlZDwvY29kZT4gaW4gdGhlCitjb21tYW5kIGxpbmUgdGhhdCBzdGFydHMgdGhlIGNvbnRhaW5lci4gIFRoZXJlZm9yZSwgeW91IGNhbiByZXBsYWNlIHRoZQorcGFyc2VyIHRoYXQgaXMgaW5zdGFsbGVkIGluIHRoaXMgZGlyZWN0b3J5LCBhbmQgaXQgd2lsbCBnZXQgdXNlZCBldmVuIG9uIGEKK0pESyAxLjQgc3lzdGVtLjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlJ1bm5pbmcgdW5kZXIgYSBzZWN1cml0eSBtYW5hZ2VyIj4KKworPHA+V2hlbiBydW5uaW5nIHVuZGVyIGEgc2VjdXJpdHkgbWFuYWdlciB0aGUgbG9jYXRpb25zIGZyb20gd2hpY2ggY2xhc3NlcworYXJlIHBlcm1pdHRlZCB0byBiZSBsb2FkZWQgd2lsbCBhbHNvIGRlcGVuZCBvbiB0aGUgY29udGVudHMgb2YgeW91ciBwb2xpY3kKK2ZpbGUuIFNlZSA8YSBocmVmPSJzZWN1cml0eS1tYW5hZ2VyLWhvd3RvLmh0bWwiPlNlY3VyaXR5IE1hbmFnZXIgSE9XLVRPPC9hPgorZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uPC9wPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jbHVzdGVyLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY2x1c3Rlci1ob3d0by54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjMTY1MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY2x1c3Rlci1ob3d0by54bWwKQEAgLTAsMCArMSwxMTYwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iY2x1c3Rlci1ob3d0by5odG1sIj4KKworICAgICZwcm9qZWN0OworCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxhdXRob3IgZW1haWw9ImZoYW5pa0BhcGFjaGUub3JnIj5GaWxpcCBIYW5pazwvYXV0aG9yPgorICAgICAgICA8YXV0aG9yIGVtYWlsPSJwZXJvQGFwYWNoZS5vcmciPlBldGVyIFJvc3NiYWNoPC9hdXRob3I+CisgICAgICAgIDx0aXRsZT5DbHVzdGVyaW5nL1Nlc3Npb24gUmVwbGljYXRpb24gSE9XLVRPPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IlF1aWNrIFN0YXJ0Ij4KKworPHA+VG8gcnVuIHNlc3Npb24gcmVwbGljYXRpb24gaW4geW91ciBUb21jYXQgNS41IGNvbnRhaW5lciwgdGhlIGZvbGxvd2luZyBzdGVwcworc2hvdWxkIGJlIGNvbXBsZXRlZDo8L3A+Cis8dWw+Cis8bGk+QWxsIHlvdXIgc2Vzc2lvbiBhdHRyaWJ1dGVzIG11c3QgaW1wbGVtZW50IDxjb2RlPmphdmEuaW8uU2VyaWFsaXphYmxlPC9jb2RlPjwvbGk+Cis8bGk+VW5jb21tZW50IHRoZSA8Y29kZT5DbHVzdGVyPC9jb2RlPiBlbGVtZW50IGluIHNlcnZlci54bWw8L2xpPgorPGxpPlVuY29tbWVudCB0aGUgPGNvZGU+VmFsdmUoUmVwbGljYXRpb25WYWx2ZSk8L2NvZGU+IGVsZW1lbnQgaW4gc2VydmVyLnhtbDwvbGk+Cis8bGk+SWYgeW91ciBUb21jYXQgaW5zdGFuY2VzIGFyZSBydW5uaW5nIG9uIHRoZSBzYW1lIG1hY2hpbmUsIG1ha2Ugc3VyZSB0aGUgPGNvZGU+dGNwTGlzdGVuUG9ydDwvY29kZT4KKyAgICBhdHRyaWJ1dGUgaXMgdW5pcXVlIGZvciBlYWNoIGluc3RhbmNlLjwvbGk+Cis8bGk+TWFrZSBzdXJlIHlvdXIgPGNvZGU+d2ViLnhtbDwvY29kZT4gaGFzIHRoZSA8Y29kZT4mbHQ7ZGlzdHJpYnV0YWJsZS8mZ3Q7PC9jb2RlPiBlbGVtZW50IAorICAgIG9yIHNldCBhdCB5b3VyIDxjb2RlPiZsdDtDb250ZXh0IGRpc3RyaWJ1dGFibGU9InRydWUiIC8mZ3Q7PC9jb2RlPjwvbGk+Cis8bGk+TWFrZSBzdXJlIHRoYXQganZtUm91dGUgYXR0cmlidXRlIGlzIHNldCBhdCB5b3VyIEVuZ2luZSA8Y29kZT4mbHQ7RW5naW5lIG5hbWU9IkNhdGFsaW5hIiBqdm1Sb3V0ZT0ibm9kZTAxIiAmZ3Q7PC9jb2RlPjwvbGk+Cis8bGk+TWFrZSBzdXJlIHRoYXQgYWxsIG5vZGVzIGhhdmUgdGhlIHNhbWUgdGltZSBhbmQgc3luYyB3aXRoIE5UUCBzZXJ2aWNlITwvbGk+Cis8bGk+TWFrZSBzdXJlIHRoYXQgeW91ciBsb2FkYmFsYW5jZXIgaXMgY29uZmlndXJlZCBmb3Igc3RpY2t5IHNlc3Npb24gbW9kZS48L2xpPgorPC91bD4KKzxwPkxvYWQgYmFsYW5jaW5nIGNhbiBiZSBhY2hpZXZlZCB0aHJvdWdoIG1hbnkgdGVjaG5pcXVlcywgYXMgc2VlbiBpbiB0aGUKKzxhIGhyZWY9ImJhbGFuY2VyLWhvd3RvLmh0bWwiPkxvYWQgQmFsYW5jaW5nPC9hPiBjaGFwdGVyLjwvcD4KKzxwPk5vdGU6IFJlbWVtYmVyIHRoYXQgeW91ciBzZXNzaW9uIHN0YXRlIGlzIHRyYWNrZWQgYnkgYSBjb29raWUsIHNvIHlvdXIgVVJMIG11c3QgbG9vayB0aGUgc2FtZSBmcm9tIHRoZSBvdXQKKyAgIHNpZGUgb3RoZXJ3aXNlLCBhIG5ldyBzZXNzaW9uIHdpbGwgYmUgY3JlYXRlZC48L3A+Cis8cD5Ob3RlOiBDbHVzdGVyaW5nIHN1cHBvcnQgY3VycmVudGx5IHJlcXVpcmVzIHRoZSBKREsgdmVyc2lvbiAxLjQgb3IgbGF0ZXIuPC9wPgorPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KKworPHA+VG8gZW5hYmxlIHNlc3Npb24gcmVwbGljYXRpb24gaW4gVG9tY2F0LCB0aHJlZSBkaWZmZXJlbnQgcGF0aHMgY2FuIGJlIGZvbGxvd2VkIHRvIGFjaGlldmUgdGhlIGV4YWN0IHNhbWUgdGhpbmc6PC9wPgorPG9sPgorICA8bGk+VXNpbmcgc2Vzc2lvbiBwZXJzaXN0ZW5jZSwgYW5kIHNhdmluZyB0aGUgc2Vzc2lvbiB0byBhIHNoYXJlZCBmaWxlIHN5c3RlbSAoUGVyc2lzdGVuY2VNYW5hZ2VyICsgRmlsZVN0b3JlKTwvbGk+CisgIDxsaT5Vc2luZyBzZXNzaW9uIHBlcnNpc3RlbmNlLCBhbmQgc2F2aW5nIHRoZSBzZXNzaW9uIHRvIGEgc2hhcmVkIGRhdGFiYXNlIChQZXJzaXN0ZW5jZU1hbmFnZXIgKyBKREJDU3RvcmUpPC9saT4KKyAgPGxpPlVzaW5nIGluLW1lbW9yeS1yZXBsaWNhdGlvbiwgdXNpbmcgdGhlIFNpbXBsZVRjcENsdXN0ZXIgdGhhdCBzaGlwcyB3aXRoIFRvbWNhdCA1IChzZXJ2ZXIvbGliL2NhdGFsaW5hLWNsdXN0ZXIuamFyKTwvbGk+Cis8L29sPgorCis8cD5JbiB0aGlzIHJlbGVhc2Ugb2Ygc2Vzc2lvbiByZXBsaWNhdGlvbiwgVG9tY2F0IHBlcmZvcm1zIGFuIGFsbC10by1hbGwgcmVwbGljYXRpb24gb2Ygc2Vzc2lvbiBzdGF0ZS4KKworICAgVGhpcyBpcyBhbiBhbGdvcml0aG0gdGhhdCBpcyBvbmx5IGVmZmljaWVudCB3aGVuIHRoZSBjbHVzdGVycyBhcmUgc21hbGwuIEZvciBsYXJnZSBjbHVzdGVycywgdGhlIG5leHQKKyAgIHJlbGVhc2Ugd2lsbCBzdXBwb3J0IGEgcHJpbWFyeS1zZWNvbmRhcnkgc2Vzc2lvbiByZXBsaWNhdGlvbiB3aGVyZSB0aGUgc2Vzc2lvbiB3aWxsIG9ubHkgYmUgc3RvcmVkIGF0IG9uZQorICAgb3IgbWF5YmUgdHdvIGJhY2t1cCBzZXJ2ZXJzLiAKKyAgIEN1cnJlbnRseSB5b3UgY2FuIHVzZSB0aGUgZG9tYWluIHdvcmtlciBhdHRyaWJ1dGUgKG1vZF9qayAmZ3Q7IDEuMi44KSB0byBidWlsZCBjbHVzdGVyIHBhcnRpdGlvbnMKKyAgIHdpdGggdGhlIHBvdGVudGlhbCBvZiB2ZXJ5IHNjYWxlYWJsZSBjbHVzdGVyIHNvbHV0aW9uLgorICAgSW4gb3JkZXIgdG8ga2VlcCB0aGUgbmV0d29yayB0cmFmZmljIGRvd24gaW4gYW4gYWxsLXRvLWFsbCBlbnZpcm9ubWVudCwgeW91IGNhbiBzcGxpdCB5b3VyIGNsdXN0ZXIKKyAgIGludG8gc21hbGxlciBncm91cHMuIFRoaXMgY2FuIGJlIGVhc2lseSBhY2hpZXZlZCBieSB1c2luZyBkaWZmZXJlbnQgbXVsdGljYXN0IGFkZHJlc3NlcyBmb3IgdGhlIGRpZmZlcmVudCBncm91cHMuCisgICBBIHZlcnkgc2ltcGxlIHNldHVwIHdvdWxkIGxvb2sgbGlrZSB0aGlzOgorICAgPC9wPgorCis8c291cmNlPgorICAgICAgICBETlMgUm91bmQgUm9iaW4KKyAgICAgICAgICAgICAgIHwKKyAgICAgICAgIExvYWQgQmFsYW5jZXIKKyAgICAgICAgICAvICAgICAgICAgICBcCisgICAgICBDbHVzdGVyMSAgICAgIENsdXN0ZXIyCisgICAgICAvICAgICBcICAgICAgICAvICAgICBcCisgIFRvbWNhdDEgVG9tY2F0MiAgVG9tY2F0MyBUb21jYXQ0Cis8L3NvdXJjZT4KKworPHA+V2hhdCBpcyBpbXBvcnRhbnQgdG8gbWVudGlvbiBoZXJlLCBpcyB0aGF0IHNlc3Npb24gcmVwbGljYXRpb24gaXMgb25seSB0aGUgYmVnaW5uaW5nIG9mIGNsdXN0ZXJpbmcuCisgICBBbm90aGVyIHBvcHVsYXIgY29uY2VwdCB1c2VkIHRvIGltcGxlbWVudCBjbHVzdGVycyBpcyBmYXJtaW5nLCBpZSwgeW91IGRlcGxveSB5b3VyIGFwcHMgb25seSB0byBvbmUKKyAgIHNlcnZlciwgYW5kIHRoZSBjbHVzdGVyIHdpbGwgZGlzdHJpYnV0ZSB0aGUgZGVwbG95bWVudHMgYWNyb3NzIHRoZSBlbnRpcmUgY2x1c3Rlci4KKyAgIFRoaXMgaXMgYWxsIGNhcGFiaWxpdGllcyB0aGF0IGNhbiBnbyBpbnRvIHdpdGggdGhlIEZhcm1XYXJEZXBsb3llciAocy4gY2x1c3RlciBleGFtcGxlIGF0IDxjb2RlPnNlcnZlci54bWw8L2NvZGU+KTwvcD4KKzxwPkluIHRoZSBuZXh0IHNlY3Rpb24gd2lsbCBnbyBkZWVwZXIgaW50byBob3cgc2Vzc2lvbiByZXBsaWNhdGlvbiB3b3JrcyBhbmQgaG93IHRvIGNvbmZpZ3VyZSBpdC48L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iSG93IGl0IFdvcmtzIj4KKzxwPlRvIG1ha2UgaXQgZWFzeSB0byB1bmRlcnN0YW5kIGhvdyBjbHVzdGVyaW5nIHdvcmtzLCBXZSBhcmUgZ29ubmEgdGFrZSB5b3UgdGhyb3VnaCBhIHNlcmllcyBvZiBzY2VuYXJpb3MuCisgICBJbiB0aGUgc2NlbmFyaW8gd2Ugb25seSBwbGFuIHRvIHVzZSB0d28gdG9tY2F0IGluc3RhbmNlcyA8Y29kZT5Ub21jYXRBPC9jb2RlPiBhbmQgPGNvZGU+VG9tY2F0QjwvY29kZT4uCisgICBXZSB3aWxsIGNvdmVyIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2Ugb2YgZXZlbnRzOjwvcD4KKworPG9sPgorPGxpPjxjb2RlPlRvbWNhdEE8L2NvZGU+IHN0YXJ0cyB1cDwvbGk+Cis8bGk+PGNvZGU+VG9tY2F0QjwvY29kZT4gc3RhcnRzIHVwIChXYWl0IHRoYXQgVG9tY2F0QSBzdGFydCBpcyBjb21wbGV0ZSk8L2xpPgorPGxpPjxjb2RlPlRvbWNhdEE8L2NvZGU+IHJlY2VpdmVzIGEgcmVxdWVzdCwgYSBzZXNzaW9uIDxjb2RlPlMxPC9jb2RlPiBpcyBjcmVhdGVkLjwvbGk+Cis8bGk+PGNvZGU+VG9tY2F0QTwvY29kZT4gY3Jhc2hlczwvbGk+Cis8bGk+PGNvZGU+VG9tY2F0QjwvY29kZT4gcmVjZWl2ZXMgYSByZXF1ZXN0IGZvciBzZXNzaW9uIDxjb2RlPlMxPC9jb2RlPjwvbGk+Cis8bGk+PGNvZGU+VG9tY2F0QTwvY29kZT4gc3RhcnRzIHVwPC9saT4KKzxsaT48Y29kZT5Ub21jYXRBPC9jb2RlPiByZWNlaXZlcyBhIHJlcXVlc3QsIGludmFsaWRhdGUgaXMgY2FsbGVkIG9uIHRoZSBzZXNzaW9uICg8Y29kZT5TMTwvY29kZT4pPC9saT4KKzxsaT48Y29kZT5Ub21jYXRCPC9jb2RlPiByZWNlaXZlcyBhIHJlcXVlc3QsIGZvciBhIG5ldyBzZXNzaW9uICg8Y29kZT5TMjwvY29kZT4pPC9saT4KKzxsaT48Y29kZT5Ub21jYXRBPC9jb2RlPiBUaGUgc2Vzc2lvbiA8Y29kZT5TMjwvY29kZT4gZXhwaXJlcyBkdWUgdG8gaW5hY3Rpdml0eS48L2xpPgorPC9vbD4KKworPHA+T2ssIG5vdyB0aGF0IHdlIGhhdmUgYSBnb29kIHNlcXVlbmNlLCB3ZSB3aWxsIHRha2UgeW91IHRocm91Z2ggZXhhY3RseSB3aGF0IGhhcHBlbnMgaW4gdGhlIHNlc3Npb24gcmVwbGljdGlvbiBjb2RlPC9wPgorCis8b2w+Cis8bGk+PGI+PGNvZGU+VG9tY2F0QTwvY29kZT4gc3RhcnRzIHVwPC9iPgorICAgIDxwPgorICAgICAgICBUb21jYXQgc3RhcnRzIHVwIHVzaW5nIHRoZSBzdGFuZGFyZCBzdGFydCB1cCBzZXF1ZW5jZS4gV2hlbiB0aGUgSG9zdCBvYmplY3QgaXMgY3JlYXRlZCwgYSBjbHVzdGVyIG9iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggaXQuCisgICAgICAgIFdoZW4gdGhlIGNvbnRleHRzIGFyZSBwYXJzZWQsIGlmIHRoZSBkaXN0cmlidXRhYmxlIGVsZW1lbnQgaXMgaW4gcGxhY2UgaW4gd2ViLnhtbAorICAgICAgICBUb21jYXQgYXNrcyB0aGUgQ2x1c3RlciBjbGFzcyAoaW4gdGhpcyBjYXNlIDxjb2RlPlNpbXBsZVRjcENsdXN0ZXI8L2NvZGU+KSB0byBjcmVhdGUgYSBtYW5hZ2VyCisgICAgICAgIGZvciB0aGUgcmVwbGljYXRlZCBjb250ZXh0LiBTbyB3aXRoIGNsdXN0ZXJpbmcgZW5hYmxlZCwgZGlzdHJpYnV0YWJsZSBzZXQgaW4gd2ViLnhtbAorICAgICAgICBUb21jYXQgd2lsbCBjcmVhdGUgYSA8Y29kZT5EZWx0YU1hbmFnZXI8L2NvZGU+IGZvciB0aGF0IGNvbnRleHQgaW5zdGVhZCBvZiBhIDxjb2RlPlN0YW5kYXJkTWFuYWdlcjwvY29kZT4uCisgICAgICAgIFRoZSBjbHVzdGVyIGNsYXNzIHdpbGwgc3RhcnQgdXAgYSBtZW1iZXJzaGlwIHNlcnZpY2UgKG11bHRpY2FzdCkgYW5kIGEgcmVwbGljYXRpb24gc2VydmljZSAodGNwIHVuaWNhc3QpLgorICAgICAgICBNb3JlIG9uIHRoZSBhcmNoaXRlY3R1cmUgZnVydGhlciBkb3duIGluIHRoaXMgZG9jdW1lbnQuCisgICAgPC9wPjxwPjwvcD4KKzwvbGk+Cis8bGk+PGI+PGNvZGU+VG9tY2F0QjwvY29kZT4gc3RhcnRzIHVwPC9iPgorICAgIDxwPgorICAgICAgICBXaGVuIFRvbWNhdEIgc3RhcnRzIHVwLCBpdCBmb2xsb3dzIHRoZSBzYW1lIHNlcXVlbmNlIGFzIFRvbWNhdEEgZGlkIHdpdGggb25lIGV4Y2VwdGlvbi4KKyAgICAgICAgVGhlIGNsdXN0ZXIgaXMgc3RhcnRlZCBhbmQgd2lsbCBlc3RhYmxpc2ggYSBtZW1iZXJzaGlwIChUb21jYXRBLFRvbWNhdEIpLgorICAgICAgICBUb21jYXRCIHdpbGwgbm93IHJlcXVlc3QgdGhlIHNlc3Npb24gc3RhdGUgZnJvbSBhIHNlcnZlciB0aGF0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBjbHVzdGVyLAorICAgICAgICBpbiB0aGlzIGNhc2UgVG9tY2F0QS4gVG9tY2F0QSByZXNwb25kcyB0byB0aGUgcmVxdWVzdCwgYW5kIGJlZm9yZSBUb21jYXRCIHN0YXJ0cyBsaXN0ZW5pbmcKKyAgICAgICAgZm9yIEhUVFAgcmVxdWVzdHMsIHRoZSBzdGF0ZSBoYXMgYmVlbiB0cmFuc2ZlcnJlZCBmcm9tIFRvbWNhdEEgdG8gVG9tY2F0Qi4KKyAgICAgICAgSW4gY2FzZSBUb21jYXRBIGRvZXNuJ3QgcmVzcG9uZCwgVG9tY2F0QiB3aWxsIHRpbWUgb3V0IGFmdGVyIDYwIHNlY29uZHMsIGFuZCBpc3N1ZSBhIGxvZworICAgICAgICBlbnRyeS4gVGhlIHNlc3Npb24gc3RhdGUgZ2V0cyB0cmFuc2ZlcnJlZCBmb3IgZWFjaCB3ZWIgYXBwbGljYXRpb24gdGhhdCBoYXMgZGlzdHJpYnV0YWJsZSBpbgorICAgICAgICBpdHMgd2ViLnhtbC4gTm90ZTogVG8gdXNlIHNlc3Npb24gcmVwbGljYXRpb24gZWZmaWNpZW50bHksIGFsbCB5b3VyIHRvbWNhdCBpbnN0YW5jZXMgc2hvdWxkIGJlCisgICAgICAgIGNvbmZpZ3VyZWQgdGhlIHNhbWUuCisgICAgPC9wPjxwPjwvcD4KKzwvbGk+Cis8bGk+PEI+PGNvZGU+VG9tY2F0QTwvY29kZT4gcmVjZWl2ZXMgYSByZXF1ZXN0LCBhIHNlc3Npb24gPGNvZGU+UzE8L2NvZGU+IGlzIGNyZWF0ZWQuPC9CPgorICAgIDxwPgorICAgICAgICBUaGUgcmVxdWVzdCBjb21pbmcgaW4gdG8gVG9tY2F0QSBpcyB0cmVhdGVkIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIHdpdGhvdXQgc2Vzc2lvbiByZXBsaWNhdGlvbi4KKyAgICAgICAgVGhlIGFjdGlvbiBoYXBwZW5zIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVkLCB0aGUgPGNvZGU+UmVwbGljYXRpb25WYWx2ZTwvY29kZT4gd2lsbCBpbnRlcmNlcHQKKyAgICAgICAgdGhlIHJlcXVlc3QgYmVmb3JlIHRoZSByZXNwb25zZSBpcyByZXR1cm5lZCB0byB0aGUgdXNlci4KKyAgICAgICAgQXQgdGhpcyBwb2ludCBpdCBmaW5kcyB0aGF0IHRoZSBzZXNzaW9uIGhhcyBiZWVuIG1vZGlmaWVkLCBhbmQgaXQgdXNlcyBUQ1AgdG8gcmVwbGljYXRhIHRoZQorICAgICAgICBzZXNzaW9uIHRvIFRvbWNhdEIuIE9uY2UgdGhlIHNlcmlhbGl6ZWQgZGF0YSBoYXMgYmVlbiBoYW5kZWQgb2ZmIHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtcyBUQ1AgbG9naWMsCisgICAgICAgIHRoZSByZXF1ZXN0IHJldHVybnMgdG8gdGhlIHVzZXIsIGJhY2sgdGhyb3VnaCB0aGUgdmFsdmUgcGlwZWxpbmUuCisgICAgICAgIEZvciBlYWNoIHJlcXVlc3QgdGhlIGVudGlyZSBzZXNzaW9uIGlzIHJlcGxpY2F0ZWQsIHRoaXMgYWxsb3dzIGNvZGUgdGhhdCBtb2RpZmllcyBhdHRyaWJ1dGVzCisgICAgICAgIGluIHRoZSBzZXNzaW9uIHdpdGhvdXQgY2FsbGluZyBzZXRBdHRyaWJ1dGUgb3IgcmVtb3ZlQXR0cmlidXRlIHRvIGJlIHJlcGxpY2F0ZWQuCisgICAgICAgIGEgdXNlRGlydHlGbGFnIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIG9wdGltaXplIHRoZSBudW1iZXIgb2YgdGltZXMKKyAgICAgICAgYSBzZXNzaW9uIGlzIHJlcGxpY2F0ZWQuCisgICAgPC9wPjxwPjwvcD4KKworPC9saT4KKzxsaT48Yj48Y29kZT5Ub21jYXRBPC9jb2RlPiBjcmFzaGVzPC9iPgorICAgIDxwPgorICAgICAgICBXaGVuIFRvbWNhdEEgY3Jhc2hlcywgVG9tY2F0QiByZWNlaXZlcyBhIG5vdGlmaWNhdGlvbiB0aGF0IFRvbWNhdEEgaGFzIGRyb3BwZWQgb3V0CisgICAgICAgIG9mIHRoZSBjbHVzdGVyLiBUb21jYXRCIHJlbW92ZXMgVG9tY2F0QSBmcm9tIGl0cyBtZW1iZXJzaGlwIGxpc3QsIGFuZCBUb21jYXRBIHdpbGwgbm8gbG9uZ2VyCisgICAgICAgIGJlIG5vdGlmaWVkIG9mIGFueSBjaGFuZ2VzIHRoYXQgb2NjdXJzIGluIFRvbWNhdEIuCisgICAgICAgIFRoZSBsb2FkIGJhbGFuY2VyIHdpbGwgcmVkaXJlY3QgdGhlIHJlcXVlc3RzIGZyb20gVG9tY2F0QSB0byBUb21jYXRCIGFuZCBhbGwgdGhlIHNlc3Npb25zCisgICAgICAgIGFyZSBjdXJyZW50LgorICAgIDwvcD48cD48L3A+Cis8L2xpPgorPGxpPjxiPjxjb2RlPlRvbWNhdEI8L2NvZGU+IHJlY2VpdmVzIGEgcmVxdWVzdCBmb3Igc2Vzc2lvbiA8Y29kZT5TMTwvY29kZT48L2I+CisgICAgPHA+Tm90aGluZyBleGNpdGluZywgVG9tY2F0QiB3aWxsIHByb2Nlc3MgdGhlIHJlcXVlc3QgYXMgYW55IG90aGVyIHJlcXVlc3QuCisgICAgPC9wPjxwPjwvcD4KKzwvbGk+Cis8bGk+PGI+PGNvZGU+VG9tY2F0QTwvY29kZT4gc3RhcnRzIHVwPC9iPgorICAgIDxwPlVwb24gc3RhcnQgdXAsIGJlZm9yZSBUb21jYXRBIHN0YXJ0cyB0YWtpbmcgbmV3IHJlcXVlc3QgYW5kIG1ha2luZyBpdHNlbGYKKyAgICBhdmFpbGFibGUgdG8gaXQgd2lsbCBmb2xsb3cgdGhlIHN0YXJ0IHVwIHNlcXVlbmNlIGRlc2NyaWJlZCBhYm92ZSAxKSAyKS4KKyAgICBJdCB3aWxsIGpvaW4gdGhlIGNsdXN0ZXIsIGNvbnRhY3QgVG9tY2F0QiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYWxsIHRoZSBzZXNzaW9ucy4KKyAgICBBbmQgb25jZSBpdCByZWNlaXZlcyB0aGUgc2Vzc2lvbiBzdGF0ZSwgaXQgZmluaXNoZXMgbG9hZGluZyBhbmQgb3BlbnMgaXRzIEhUVFAvbW9kX2prIHBvcnRzLgorICAgIFNvIG5vIHJlcXVlc3RzIHdpbGwgbWFrZSBpdCB0byBUb21jYXRBIHVudGlsIGl0IGhhcyByZWNlaXZlZCB0aGUgc2Vzc2lvbiBzdGF0ZSBmcm9tIFRvbWNhdEIuCisgICAgPC9wPjxwPjwvcD4KKzwvbGk+Cis8bGk+PGI+PGNvZGU+VG9tY2F0QTwvY29kZT4gcmVjZWl2ZXMgYSByZXF1ZXN0LCBpbnZhbGlkYXRlIGlzIGNhbGxlZCBvbiB0aGUgc2Vzc2lvbiAoPGNvZGU+UzE8L2NvZGU+KTwvYj4KKyAgICA8cD5UaGUgaW52YWxpZGF0ZSBpcyBjYWxsIGlzIGludGVyY2VwdGVkLCBhbmQgdGhlIHNlc3Npb24gaXMgcXVldWVkIHdpdGggaW52YWxpZGF0ZWQgc2Vzc2lvbnMuCisgICAgICAgIFdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGUsIGluc3RlYWQgb2Ygc2VuZGluZyBvdXQgdGhlIHNlc3Npb24gdGhhdCBoYXMgY2hhbmdlZCwgaXQgc2VuZHMgb3V0CisgICAgICAgIGFuICJleHBpcmUiIG1lc3NhZ2UgdG8gVG9tY2F0QiBhbmQgVG9tY2F0QiB3aWxsIGludmFsaWRhdGUgdGhlIHNlc3Npb24gYXMgd2VsbC4KKyAgICA8L3A+PHA+PC9wPgorCis8L2xpPgorPGxpPjxiPjxjb2RlPlRvbWNhdEI8L2NvZGU+IHJlY2VpdmVzIGEgcmVxdWVzdCwgZm9yIGEgbmV3IHNlc3Npb24gKDxjb2RlPlMyPC9jb2RlPik8L2I+CisgICAgPHA+U2FtZSBzY2VuYXJpbyBhcyBpbiBzdGVwIDMpCisgICAgPC9wPjxwPjwvcD4KKworCis8L2xpPgorPGxpPjxjb2RlPlRvbWNhdEE8L2NvZGU+IFRoZSBzZXNzaW9uIDxjb2RlPlMyPC9jb2RlPiBleHBpcmVzIGR1ZSB0byBpbmFjdGl2aXR5LgorICAgIDxwPlRoZSBpbnZhbGlkYXRlIGlzIGNhbGwgaXMgaW50ZXJjZXB0ZWQgdGhlIHNhbWUgd2FzIGFzIHdoZW4gYSBzZXNzaW9uIGlzIGludmFsaWRhdGVkIGJ5IHRoZSB1c2VyLAorICAgICAgIGFuZCB0aGUgc2Vzc2lvbiBpcyBxdWV1ZWQgd2l0aCBpbnZhbGlkYXRlZCBzZXNzaW9ucy4KKyAgICAgICBBdCB0aGlzIHBvaW50LCB0aGUgaW52YWxpZGV0IHNlc3Npb24gd2lsbCBub3QgYmUgcmVwbGljYXRlZCBhY3Jvc3MgdW50aWwKKyAgICAgICBhbm90aGVyIHJlcXVlc3QgY29tZXMgdGhyb3VnaCB0aGUgc3lzdGVtIGFuZCBjaGVja3MgdGhlIGludmFsaWQgcXVldWUuCisgICAgPC9wPjxwPjwvcD4KKzwvbGk+Cis8L29sPgorCis8cD5QaHV1dWhoISA6KTwvcD4KKworPHA+PGI+TWVtYmVyc2hpcDwvYj4KKyAgICBDbHVzdGVyaW5nIG1lbWJlcnNoaXAgaXMgZXN0YWJsaXNoZWQgdXNpbmcgdmVyeSBzaW1wbGUgbXVsdGljYXN0IHBpbmdzLgorICAgIEVhY2ggVG9tY2F0IGluc3RhbmNlIHdpbGwgcGVyaW9kaWNhbGx5IHNlbmQgb3V0IGEgbXVsdGljYXN0IHBpbmcsCisgICAgaW4gdGhlIHBpbmcgbWVzc2FnZSB0aGUgaW5zdGFuY2Ugd2lsbCBicm9hZCBjYXN0IGl0cyBJUCBhbmQgVENQIGxpc3RlbiBwb3J0CisgICAgZm9yIHJlcGxpY2F0aW9uLgorICAgIElmIGFuIGluc3RhbmNlIGhhcyBub3QgcmVjZWl2ZWQgc3VjaCBhIHBpbmcgd2l0aGluIGEgZ2l2ZW4gdGltZWZyYW1lLCB0aGUKKyAgICBtZW1iZXIgaXMgY29uc2lkZXJlZCBkZWFkLiBWZXJ5IHNpbXBsZSwgYW5kIHZlcnkgZWZmZWN0aXZlIQorICAgIE9mIGNvdXJzZSwgeW91IG5lZWQgdG8gZW5hYmxlIG11bHRpY2FzdGluZyBvbiB5b3VyIHN5c3RlbS4KKzwvcD4KKworPHA+PGI+VENQIFJlcGxpY2F0aW9uPC9iPgorICAgIE9uY2UgYSBtdWx0aWNhc3QgcGluZyBoYXMgYmVlbiByZWNlaXZlZCwgdGhlIG1lbWJlciBpcyBhZGRlZCB0byB0aGUgY2x1c3RlcgorICAgIFVwb24gdGhlIG5leHQgcmVwbGljYXRpb24gcmVxdWVzdCwgdGhlIHNlbmRpbmcgaW5zdGFuY2Ugd2lsbCB1c2UgdGhlIGhvc3QgYW5kCisgICAgcG9ydCBpbmZvIGFuZCBlc3RhYmxpc2ggYSBUQ1Agc29ja2V0LiBVc2luZyB0aGlzIHNvY2tldCBpdCBzZW5kcyBvdmVyIHRoZSBzZXJpYWxpemVkIGRhdGEuCisgICAgVGhlIHJlYXNvbiBJIGNob29zZSBUQ1Agc29ja2V0cyBpcyBiZWNhdXNlIGl0IGhhcyBidWlsdCBpbiBmbG93IGNvbnRyb2wgYW5kIGd1YXJhbnRlZWQgZGVsaXZlcnkuCisgICAgU28gSSBrbm93LCB3aGVuIEkgc2VuZCBzb21lIGRhdGEsIGl0IHdpbGwgbWFrZSBpdCB0aGVyZSA6KQorPC9wPgorCis8cD48Yj5EaXN0cmlidXRlZCBsb2NraW5nIGFuZCBwYWdlcyB1c2luZyBmcmFtZXM8L2I+CisgICAgVG9tY2F0IGRvZXMgbm90IGtlZXAgc2Vzc2lvbiBpbnN0YW5jZXMgaW4gc3luYyBhY3Jvc3MgdGhlIGNsdXN0ZXIuCisgICAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHN1Y2ggbG9naWMgd291bGQgYmUgdG8gbXVjaCBvdmVyaGVhZCBhbmQgY2F1c2UgYWxsCisgICAga2luZHMgb2YgcHJvYmxlbXMuIElmIHlvdXIgY2xpZW50IGFjY2Vzc2VzIHRoZSBzYW1lIHNlc3Npb24KKyAgICBzaW11bHRhbm91c2x5IHVzaW5nIG11bHRpcGxlIHJlcXVlc3RzLCB0aGVuIHRoZSBsYXN0IHJlcXVlc3QKKyAgICB3aWxsIG92ZXJyaWRlIHRoZSBvdGhlciBzZXNzaW9ucyBpbiB0aGUgY2x1c3Rlci4KKzwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJDbHVzdGVyIEFyY2hpdGVjdHVyZSI+CisKKzxwPjxiPkNvbXBvbmVudCBMZXZlbHM6PC9iPgorPHNvdXJjZT4KKyAgICAgICAgIFNlcnZlcgorICAgICAgICAgICB8CisgICAgICAgICBTZXJ2aWNlCisgICAgICAgICAgIHwKKyAgICAgICAgIEVuZ2luZQorICAgICAgICAgICB8ICBcIAorICAgICAgICAgICB8ICAtLS0gQ2x1c3RlciAtLSoKKyAgICAgICAgICAgfAorICAgICAgICAgSG9zdAorICAgICAgICAgICB8CisgICAgICAgICAtLS0tLS0KKyAgICAgICAgLyAgICAgIFwKKyAgICAgQ2x1c3RlciAgICBDb250ZXh0KDEtTikgICAgICAgICAgICAgICAgIAorICAgICAgICB8ICAgICAgICAgICAgIFwKKyAgICAgICAgfCAgICAgICAgICAgICAtLSBNYW5hZ2VyCisgICAgICAgIHwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB8ICAgICAgICAgICAgICAgICAgIC0tIERlbHRhTWFuYWdlcgorICAgICAgICB8CisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIHwgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgXAorICAgUmVjZWl2ZXIgICAgU2VuZGVyICAgTWVtYmVyc2hpcCAgXAorICAgICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFZhbHZlCisgICAgIC0tIFNvY2tldFJlcGxpY2F0aW9uTGlzdGVuZXIgICAgfCAgICAgIFwKKyAgICAgLS0gUmVwbGljYXRpb25MaXN0ZW5lciAgICAgICAgICB8ICAgICAgIC0tIFJlcGxpY2F0aW9uVmFsdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIC0tIEp2bVJvdXRlQmluZGVyVmFsdmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIExpZmVjeWNsZUxpc3RlbmVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBDbHVzdGVyTGlzdGVuZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIC0tIENsdXN0ZXJTZXNzaW9uTGlzdGVuZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIC0tIEp2bVJvdXRlU2Vzc2lvbklEQmluZGVyTGlzdGVuZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gRGVwbG95ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIEZhcm1XYXJEZXBsb3llcgorICAgICAgCisgICAgICAKKzwvc291cmNlPgorPHNvdXJjZT4KKyAgIFNlbmRlcgorICAgIFwKKyAgICAtLSBSZXBsaWNhdGlvblRyYW5zbWl0dGVyIAorICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAtLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgSURhdGFTZW5kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLSAoc3luYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgLS0gUG9vbGVkU29ja2V0U2VuZGVyICAgKHBvb2xlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIC0tIFNvY2tlclNlbmRlciAgICAgICAgIChzeW5jaHJvbm91cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLSAoYXN5bmMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIEFzeW5jU29ja2V0U2VuZGVyICAgICAoYXN5bmNocm9ub3VzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gRmFzdEFzeW5jU29ja2V0U2VuZGVyIChmYXN0YXN5bmNxdWV1ZSkgICAgICAgICAKKzwvc291cmNlPgorPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQ2x1c3RlciBDb25maWd1cmF0aW9uIj4KKzxwPlRoZSBjbHVzdGVyIGNvbmZpZ3VyYXRpb24gaXMgZGVzY3JpYmVkIGluIHRoZSBzYW1wbGUgc2VydmVyLnhtbCBmaWxlLgorV2hhdCBpcyB3b3J0aCB0byBtZW50aW9uIGlzIHRoYXQgdGhlIGF0dHJpYnV0ZXMgc3RhcnRpbmcgd2l0aCBtY2FzdFhYWAorYXJlIGZvciB0aGUgbWVtYmVyc2hpcCBtdWx0aWNhc3QgcGluZywgYW5kIHRoZSBhdHRyaWJ1dGVzIHN0YXJ0aW5nIHdpdGggdGNwWFhYCithcmUgZm9yIHRoZSBhY3R1YWwgVENQIHJlcGxpY2F0aW9uLgorPC9wPgorPHA+CisgICAgVGhlIG1lbWJlcnNoaXAgaXMgZXN0YWJsaXNoZWQgYnkgYWxsIHRoZSB0b21jYXQgaW5zdGFuY2VzIGFyZSBzZW5kaW5nIGJyb2FkY2FzdCBtZXNzYWdlcworICAgIG9uIHRoZSBzYW1lIG11bHRpY2FzdCBJUCBhbmQgcG9ydC4KKyAgICBUaGUgVENQIGxpc3RlbiBwb3J0LCBpcyB0aGUgcG9ydCB3aGVyZSB0aGUgc2Vzc2lvbiByZXBsaWNhdGlvbiBpcyByZWNlaXZlZCBmcm9tIG90aGVyIG1lbWJlcnMuCis8L3A+Cis8cD4KKyAgICBUaGUgcmVwbGljYXRpb24gdmFsdmUgaXMgdXNlZCB0byBmaW5kIG91dCB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgaW5pdGlhdGUgdGhlCisgICAgcmVwbGljYXRpb24uCis8L3A+Cis8cD4KKyAgICBPbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zIGlzIHRoZSBzeW5jaHJvbm91cyAocG9vbGVkIG9yIG5vdCBwb29sZWQpIHZlcnN1cyBhc3luY2hyb25vdXMgcmVwbGljYXRpb24KKyAgICBtb2RlLiBJbiBhIHN5bmNocm9ub3VzIHJlcGxpY2F0aW9uIG1vZGUgdGhlIHJlcXVlc3QgZG9lc24ndCByZXR1cm4gdW50aWwgdGhlIHJlcGxpY2F0ZWQgc2Vzc2lvbiBoYXMgYmVlbgorICAgIHNlbnQgb3ZlciB0aGUgd2lyZSBhbmQgcmVpbnN0YW50aWF0ZWQgb24gYWxsIHRoZSBvdGhlciBjbHVzdGVyIG5vZGVzLgorICAgIFRoZXJlIGFyZSB0d28gc2V0dGluZ3MgZm9yIHN5bmNocm9ub3VzIHJlcGxpY2F0aW9uLiBQb29sZWQgb3Igbm90IHBvb2xlZC4KKyAgICBOb3QgcG9vbGVkIChpZSByZXBsaWNhdGlvbk1vZGU9JnF1b3Q7ZmFzdGFzbnljcXVldWUmcXVvdDsgb3IgJnF1b3Q7c3luY2hyb25vdXMmcXVvdDspIG1lYW5zIHRoYXQgYWxsIHRoZSByZXBsaWNhdGlvbiByZXF1ZXN0IGFyZSBzZW50IG92ZXIgYSBzaW5nbGUKKyAgICBzb2NrZXQuCisgICAgVXNpbmcgc3luY2hyb25vdXMgbW9kZSBjYW4gcG90ZW50aWFsbHkgYmVjb21lcyBhIGJvdHRsZW5lY2sgd2hlbiBhIGxvdCBvZiBtZXNzYWdlcyBnZW5lcmF0ZWQsCisgICAgWW91IGNhbiBvdmVyY29tZSB0aGlzIGJvdHRsZW5lY2sgYnkgc2V0dGluZyByZXBsaWNhdGlvbk1vZGU9JnF1b3Q7cG9vbGVkJnF1b3Q7IGJ1dCB0aGVuIHlvdSB3b3JrZXIgdGhyZWFkcyBibG9ja3Mgd2l0aCByZXBsaWNhdGlvbiAuCisgICAgV2hhdCBpcyByZWNvbW1lbmRlZCBoZXJlIGlzIHRvIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0aGF0IGhhbmRsZQorICAgIGluY29taW5nIHJlcGxpY2F0aW9uIHJlcXVlc3QuIFRoaXMgaXMgdGhlIHRjcFRocmVhZENvdW50IHByb3BlcnR5IGluIHRoZSBjbHVzdGVyCisgICAgc2VjdGlvbiBvZiBzZXJ2ZXIueG1sLiBUaGUgcG9vbGVkIHNldHRpbmcgbWVhbnMgdGhhdCB3ZSBhcmUgdXNpbmcgbXVsdGlwbGUgc29ja2V0cywgaGVuY2UgaW5jcmVhc2VzIHRoZSBwZXJmb3JtYW5jZS4KKyAgICBBc3luY2hyb25vdXMgcmVwbGljYXRpb24sIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBoYXZlIHN0aWNreSBzZXNzaW9ucyB1bnRpbCBmYWlsIG92ZXIsIHRoZW4KKyAgICB5b3VyIHJlcGxpY2F0ZWQgZGF0YSBpcyBub3QgdGltZSBjcnVjaWFsLCBidXQgdGhlIHJlcXVlc3QgdGltZSBpcywgYXQgdGhpcyB0aW1lIGxlYXZlIHRoZSB0Y3BUaHJlYWRDb3VudCB0bworICAgIGJlIG51bWJlci1vZi1ub2Rlcy0xLgorICAgIER1cmluZyBhc3luYyByZXBsaWNhdGlvbiwgdGhlIHJlcXVlc3QgaXMgcmV0dXJuZWQgYmVmb3JlIHRoZSBkYXRhIGhhcyBiZWVuIHJlcGxpY2F0ZWQuIGFzeW5jIHJlcGxpY2F0aW9uIHlpZWxkcyBzaG9ydGVyCisgICAgcmVxdWVzdCB0aW1lcywgYW5kIHN5bmNocm9ub3VzIHJlcGxpY2F0aW9uIGd1YXJhbnRlZXMgdGhlIHNlc3Npb24gdG8gYmUgcmVwbGljYXRlZCBiZWZvcmUgdGhlIHJlcXVlc3QgcmV0dXJucy4KKzwvcD4KKzxwPgorICAgIFRoZSBwYXJhbWV0ZXIgJnF1b3Q7cmVwbGljYXRpb25Nb2RlJnF1b3Q7IGhhcyBmb3VyIGRpZmZlcmVudCBzZXR0aW5nczogJnF1b3Q7cG9vbGVkJnF1b3Q7LCAmcXVvdDtzeW5jaHJvbm91cyZxdW90OywgJnF1b3Q7YXN5bmNocm9ub3VzJnF1b3Q7IGFuZCAmcXVvdDtmYXN0YXN5bmNxdWV1ZSZxdW90OworPC9wPgorCis8c2VjdGlvbiBuYW1lPSJTaW1wbGUgQ2x1c3RlciBDb25maWd1cmF0aW9uIj4KKzxwPgorU2ltcGxlIG9uZSBsaW5lIGNvbmZpZ3VyYXRpb248YnIvPgorPHNvdXJjZT4KKyAgICZsdDtTZXJ2ZXIgICAgICAgICAgICAgICAgIHBvcnQ9IjgwMTEiIAorICAgICAgICAgICAgICAgICAgICAgICBzaHV0ZG93bj0iU0hVVERPV04iICZndDsKKyAgICAmbHQ7R2xvYmFsTmFtaW5nUmVzb3VyY2VzJmd0OworICAgICZsdDtSZXNvdXJjZSAgICAgICAgICAgICAgbmFtZT0iVXNlckRhdGFiYXNlIiBhdXRoPSJDb250YWluZXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZSIKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlVzZXIgZGF0YWJhc2UgdGhhdCBjYW4gYmUgdXBkYXRlZCBhbmQgc2F2ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5PSJvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLk1lbW9yeVVzZXJEYXRhYmFzZUZhY3RvcnkiCisgICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZT0iY29uZi90b21jYXQtdXNlcnMueG1sIiAvJmd0OworICAmbHQ7L0dsb2JhbE5hbWluZ1Jlc291cmNlcyZndDsKKyAgICAmbHQ7U2VydmljZSAgICAgICAgICAgICAgbmFtZT0iQ2F0YWxpbmEiJmd0OworICAgICAgICAmbHQ7Q29ubmVjdG9yICAgICAgICBwb3J0PSI5MDEyIiAKKyAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbD0iQUpQLzEuMyIKKyAgICAgICAgJmx0O0Nvbm5lY3RvciAgICAgICAgIHBvcnQ9IjkwMTMiCisgICAgICAgICAgICAgICAgICAgICBtYXhUaHJlYWRzPSIxMDAiCisgICAgICAgICAgICAgICAgbWluU3BhcmVUaHJlYWRzPSI0IgorICAgICAgICAgICAgICAgIG1heFNwYXJlVGhyZWFkcz0iNCIKKyAgICAgICAgLyZndDsKKyAgICAgICAgJmx0O0VuZ2luZSAgICAgICAgICAgIG5hbWU9IkNhdGFsaW5hIiAKKyAgICAgICAgICAgICAgICAgICBkZWZhdWx0SG9zdD0ibG9jYWxob3N0IiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGp2bVJvdXRlPSJub2RlMDEiJmd0OworICAgICAgICAmbHQ7UmVhbG0gICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5Vc2VyRGF0YWJhc2VSZWFsbSIKKyAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWU9IlVzZXJEYXRhYmFzZSIgLyZndDsKKyAgICAgICAgICAgICZsdDtIb3N0ICAgICAgICAgIG5hbWU9ImxvY2FsaG9zdCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcEJhc2U9IndlYmFwcHMiJmd0OworICAgICAgICAgICAgICZsdDtDbHVzdGVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5TaW1wbGVUY3BDbHVzdGVyIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L0hvc3QmZ3Q7CisgICAgICAgICZsdDsvRW5naW5lJmd0OworICAgICZsdDsvU2VydmljZSZndDsKKyZsdDsvU2VydmVyJmd0OworPC9zb3VyY2U+Cis8YnIvPgorVGhlIGRlZmF1bHQgbW9kZSBjb25maWd1cmF0aW9uIHNldHVwIGEgPGVtPmZhc3Rhc3luY3F1ZXVlPC9lbT4gbW9kZSBjbHVzdGVyIGNvbmZpZ3VyYXRpb24gd2l0aCBmb2xsb3dpbmcKK3BhcmFtZXRlcnM6Cis8dWw+CisgICAgPGxpPk9wZW4gTWVtYmVyc2hpcCByZWNlaXZlciBhdCA8ZW0+MjI4LjAuMC40PC9lbT4gYW5kIHNlbmQgdG8gbXVsdGljYXN0IHVkcCBwb3J0IDxlbT44MDEyPC9lbT48L2xpPgorICAgIDxsaT5TZW5kIG1lbWJlcnNoaXAgZXZlcnkgMSBzZWMgYW5kIGRyb3AgbWVtYmVyIGFmdGVyIDMwc2VjLjwvbGk+CisgICAgPGxpPk9wZW4gbWVzc2FnZSByZWNlaXZlciBhdCBkZWZhdWx0IGlwIGludGVyZmFjZSBhdCBmaXJzdCBmcmVlIHBvcnQgYmV0d2VlbiA8ZW0+ODAxNTwvZW0+IGFuZCA8ZW0+ODAxOTwvZW0+LjwvbGk+CisgICAgPGxpPlJlY2VpdmVyIG1lc3NhZ2Ugd2l0aCA8ZW0+U29ja2V0UmVwbGljYXRpb25MaXN0ZW5lcjwvZW0+IDwvbGk+CisgICAgPGxpPkNvbmZpZ3VyZSBhIDxlbT5SZXBsaWNhdGlvblRyYW5zbWl0dGVyPC9lbT4gd2l0aCA8ZW0+ZmFzdGFzeW5jcXVldWU8L2VtPiBzZW5kZXIgbW9kZS48L2xpPgorICAgIDxsaT5BZGQgPGVtPkNsdXN0ZXJTZXNzaW9uTGlzdGVuZXI8L2VtPiBhbmQgPGVtPlJlcGxpY2F0aW9uVmFsdmU8L2VtPi48L2xpPgorPC91bD4gCis8L3A+Cis8cD4KKzxiPk5PVEU8L2I+OiBVc2UgdGhpcyBjb25maWd1cmF0aW9uIHdoZW4geW91IG5lZWQgdmVyeSBxdWljayBhIHRlc3QgY2x1c3RlciB3aXRoCithdCB5b3VyIGRldmVsb3BlciBtYWNoaW5lLiBZb3UgY2FuIGNoYW5nZSB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZyb20gY2x1c3RlciBzdWIgZWxlbWVudHMuCitVc2UgZm9sbG93aW5nIGNsdXN0ZXIgYXR0cmlidXRlIHByZWZpeGVzIDxlbT5zZW5kZXIuPC9lbT4sCis8Yj5yZWNlaXZlci48L2I+LCA8Yj5zZXJ2aWNlLjwvYj4sIDxiPm1hbmFnZXIuPC9iPiwgPGI+dmFsdmUuPC9iPiBhbmQgPGI+bGlzdGVuZXIuPC9iPi4KKzxici8+PGI+RXhhbXBsZTwvYj4gY29uZmlndXJlIGNsdXN0ZXIgYXQgd2luZG93cyBsYXB0b3Agd2l0aCBuZXR3b3JrIGNvbm5lY3Rpb24gYW5kCitjaGFuZ2UgcmVjZWl2ZXIgcG9ydCByYW5nZTxici8+Cis8c291cmNlPgorJmx0O0NsdXN0ZXIgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5TaW1wbGVUY3BDbHVzdGVyIgorICAgICAgICAgIHNlcnZpY2UubWNhc3RCaW5kQWRkcmVzcz0iMTI3LjAuMC4xIiAKKyAgICAgICAgICAgIHJlY2VpdmVyLnRjcExpc3RlblBvcnQ9IjkwNzAiIAorICAgICAgICAgcmVjZWl2ZXIudGNwTGlzdGVuTWF4UG9ydD0iOTA3NSIgLyZndDsKKzwvc291cmNlPiAgICAKKzxici8+ICAgICAgIAorPGI+V0FSTklORzwvYj46IFdoZW4geW91IGFkZCB5b3Ugc3ViIGVsZW1lbnRzLCB0aGVyZSBvdmVyd3JpdGUgdGhlIGRlZmF1bHRzIGNvbXBsZXRlLgorPGJyLz48Yj5FeGFtcGxlPC9iPiBjb25maWd1cmUgY2x1c3RlciB3aXRoIGNsdXN0ZXIgZmFpbG92ZXIganNlc3Npb25pZCBzdXBwb3J0LiBJbiB0aGlzCitjYXNlIHlvdSBuZWVkIGFsc28gdGhlIGRlZmF1bHRtb2RlIENsdXN0ZXIgbGlzdGVuZXIgPGVtPkNsdXN0ZXJTZXNzaW9uTGlzdGVuZXI8L2VtPiBhbmQgPGVtPlJlcGxpY2F0aW9uVmFsdmU8L2VtPi48YnIvPgorPHNvdXJjZT4KKyZsdDtDbHVzdGVyICAgICAgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuU2ltcGxlVGNwQ2x1c3RlciIKKyAgICAgICAgICBzZXJ2aWNlLm1jYXN0QmluZEFkZHJlc3M9IjEyNy4wLjAuMSIgCisgICAgICAgICAgICByZWNlaXZlci50Y3BMaXN0ZW5Qb3J0PSI5MDcwIiAKKyAgICAgICAgIHJlY2VpdmVyLnRjcExpc3Rlbk1heFBvcnQ9IjkwNzUiICZndDsKKyAgICAgICAmbHQ7Q2x1c3Rlckxpc3RlbmVyICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uLkNsdXN0ZXJTZXNzaW9uTGlzdGVuZXIiIC8mZ3Q7CisgICAgICAgJmx0O0NsdXN0ZXJMaXN0ZW5lciAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5Kdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyIiAvJmd0OworICAgICAgICZsdDtWYWx2ZSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblZhbHZlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcj0iLipcLmdpZjsuKlwuanM7LipcLmNzczsuKlwucG5nOy4qXC5qcGVnOy4qXC5qcGc7LipcLmh0bTsuKlwuaHRtbDsuKlwudHh0OyIKKyAgICAgICAgICAgICAgICAgIHByaW1hcnlJbmRpY2F0b3I9InRydWUiIC8mZ3Q7CisJICAgJmx0O1ZhbHZlICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5Kdm1Sb3V0ZUJpbmRlclZhbHZlIgorCSAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkPSJ0cnVlIiAgLyZndDsKKyZsdDsvQ2x1c3RlciZndDsKKzwvc291cmNlPiAKKzwvcD4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iU2ltcGxlIEVuZ2luZSBDbHVzdGVyIENvbmZpZ3VyYXRpb24gZm9yIGFsbCBob3N0cyI+Cis8cD4KK1NpbXBsZSBvbmUgbGluZSBlbmdpbmUgY29uZmlndXJhdGlvbjxici8+Cis8c291cmNlPgorICAgJmx0O1NlcnZlciAgICAgICAgICAgICAgICAgcG9ydD0iODAxMSIgCisgICAgICAgICAgICAgICAgICAgICAgIHNodXRkb3duPSJTSFVURE9XTiIgJmd0OworICAgICZsdDtHbG9iYWxOYW1pbmdSZXNvdXJjZXMmZ3Q7CisgICAgJmx0O1Jlc291cmNlICAgICAgICAgICAgICBuYW1lPSJVc2VyRGF0YWJhc2UiIGF1dGg9IkNvbnRhaW5lciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlIgorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVXNlciBkYXRhYmFzZSB0aGF0IGNhbiBiZSB1cGRhdGVkIGFuZCBzYXZlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcnk9Im9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnMuTWVtb3J5VXNlckRhdGFiYXNlRmFjdG9yeSIKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lPSJjb25mL3RvbWNhdC11c2Vycy54bWwiIC8mZ3Q7CisgICZsdDsvR2xvYmFsTmFtaW5nUmVzb3VyY2VzJmd0OworICAgICZsdDtTZXJ2aWNlICAgICAgICAgICAgICBuYW1lPSJDYXRhbGluYSImZ3Q7CisgICAgICAgICZsdDtDb25uZWN0b3IgICAgICAgIHBvcnQ9IjkwMTIiIAorICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sPSJBSlAvMS4zIgorICAgICAgICAmbHQ7Q29ubmVjdG9yICAgICAgICAgcG9ydD0iOTAxMyIKKyAgICAgICAgICAgICAgICAgICAgIG1heFRocmVhZHM9IjEwMCIKKyAgICAgICAgICAgICAgICBtaW5TcGFyZVRocmVhZHM9IjQiCisgICAgICAgICAgICAgICAgbWF4U3BhcmVUaHJlYWRzPSI0IgorICAgICAgICAvJmd0OworICAgICAgICAmbHQ7RW5naW5lICAgICAgICAgICAgbmFtZT0iQ2F0YWxpbmEiIAorICAgICAgICAgICAgICAgICAgIGRlZmF1bHRIb3N0PSJsb2NhbGhvc3QiIAorICAgICAgICAgICAgICAgICAgICAgICAganZtUm91dGU9Im5vZGUwMSImZ3Q7CisgICAgICAgICZsdDtSZWFsbSAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLlVzZXJEYXRhYmFzZVJlYWxtIgorICAgICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZT0iVXNlckRhdGFiYXNlIiAvJmd0OworICAgICAgICAmbHQ7Q2x1c3RlciAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5TaW1wbGVUY3BDbHVzdGVyIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7SG9zdCAgICAgICAgICBuYW1lPSJsb2NhbGhvc3QiCisgICAgICAgICAgICAgICAgICAgICAgICBhcHBCYXNlPSJ3ZWJhcHBzIi8mZ3Q7CisgICAgICAgICZsdDsvRW5naW5lJmd0OworICAgICZsdDsvU2VydmljZSZndDsKKyZsdDsvU2VydmVyJmd0OworPC9zb3VyY2U+Cis8YnIvPgorU2VlIGRlZmF1bHQgbW9kZSBjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uIGFzIHNpbXBsZSBob3N0IGNsdXN0ZXIgZXhhbXBsZSBiZWZvcmUuCis8L3A+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkNvbXBsZXggQ2x1c3RlciBDb25maWd1cmF0aW9uIj4KKzxwPgorPGJyLz48Yj5FeGFtcGxlPC9iPiBDb25maWd1cmUgY2x1c3RlciB3aXRoIGNvbXBsZXRlIHN1YiBlbGVtZW50cy4gQWN0aXZhdGUgdGhpcyBub2RlCithcyBtYXN0ZXIgZmFybSBkZWxvcHllci4gTWVzc2FnZSByZWNlaXZlciBpcyBOSU8gYmFzZWQgPGVtPlJlcGxpY2F0aW9uTGlzdGVuZXI8L2VtPiB3aXRoIHNpeCBwYXJhbGxlbAord29ya2VyIHRocmVhZHMuCis8YnIvPgorPHNvdXJjZT4KKyAgICAgICAmbHQ7U2VydmVyICAgICAgICAgICAgICAgICBwb3J0PSI4MDExIiAKKyAgICAgICAgICAgICAgICAgICAgICAgc2h1dGRvd249IlNIVVRET1dOIiAmZ3Q7CisgICAgJmx0O0dsb2JhbE5hbWluZ1Jlc291cmNlcyZndDsKKyAgICAmbHQ7UmVzb3VyY2UgICAgICAgICAgICAgIG5hbWU9IlVzZXJEYXRhYmFzZSIgYXV0aD0iQ29udGFpbmVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2UiCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJVc2VyIGRhdGFiYXNlIHRoYXQgY2FuIGJlIHVwZGF0ZWQgYW5kIHNhdmVkIgorICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeT0ib3JnLmFwYWNoZS5jYXRhbGluYS51c2Vycy5NZW1vcnlVc2VyRGF0YWJhc2VGYWN0b3J5IgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWU9ImNvbmYvdG9tY2F0LXVzZXJzLnhtbCIgLyZndDsKKyAgJmx0Oy9HbG9iYWxOYW1pbmdSZXNvdXJjZXMmZ3Q7CisgICAgJmx0O1NlcnZpY2UgICAgICAgICAgICAgIG5hbWU9IkNhdGFsaW5hIiZndDsKKyAgICAgICAgJmx0O0Nvbm5lY3RvciAgICAgICAgcG9ydD0iOTAxMiIgCisgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2w9IkFKUC8xLjMiCisgICAgICAgICZsdDtDb25uZWN0b3IgICAgICAgICBwb3J0PSI5MDEzIgorICAgICAgICAgICAgICAgICAgICAgbWF4VGhyZWFkcz0iMTAwIgorICAgICAgICAgICAgICAgIG1pblNwYXJlVGhyZWFkcz0iNCIKKyAgICAgICAgICAgICAgICBtYXhTcGFyZVRocmVhZHM9IjQiCisgICAgICAgIC8mZ3Q7CisgICAgICAgICZsdDtFbmdpbmUgICAgICAgICAgICBuYW1lPSJDYXRhbGluYSIgCisgICAgICAgICAgICAgICAgICAgZGVmYXVsdEhvc3Q9ImxvY2FsaG9zdCIgCisgICAgICAgICAgICAgICAgICAgICAgICBqdm1Sb3V0ZT0ibm9kZTAxIiZndDsKKyAgICAgICAgJmx0O1JlYWxtICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uVXNlckRhdGFiYXNlUmVhbG0iCisgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VOYW1lPSJVc2VyRGF0YWJhc2UiIC8mZ3Q7CisgICAgICAgICAgICAmbHQ7SG9zdCAgICAgICAgICBuYW1lPSJsb2NhbGhvc3QiCisgICAgICAgICAgICAgICAgICAgICAgICBhcHBCYXNlPSJ3ZWJhcHBzIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Q2x1c3RlciAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5TaW1wbGVUY3BDbHVzdGVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9DbHVzdGVyTG9nPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJMb2dOYW1lPSJjbHVzdGVybG9nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5EZWx0YU1hbmFnZXIiCisgICAgICAgICAgICAgICAgICAgbWFuYWdlci5leHBpcmVTZXNzaW9uc09uU2h1dGRvd249ImZhbHNlIgorICAgICAgICAgICAgICAgbWFuYWdlci5ub3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uPSJmYWxzZSIKKyAgICAgICAgbWFuYWdlci5ub3RpZnlTZXNzaW9uTGlzdGVuZXJzT25SZXBsaWNhdGlvbj0iZmFsc2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5zZW5kQWxsU2Vzc2lvbnM9ImZhbHNlIgorICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5zZW5kQWxsU2Vzc2lvbnNTaXplPSI1MDAiCisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuc2VuZEFsbFNlc3Npb25zV2FpdFRpbWU9IjIwIiZndDsKKyAgICAgICAgICAgICAgICAgICZsdDtNZW1iZXJzaGlwIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIubWNhc3QuTWNhc3RTZXJ2aWNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWNhc3RBZGRyPSIyMjguMC4wLjQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jYXN0QmluZEFkZHJlc3M9IjEyNy4wLjAuMSIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtY2FzdENsdXN0ZXJEb21haW49ImQxMCIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtY2FzdFBvcnQ9IjQ1NTY0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jYXN0RnJlcXVlbmN5PSIxMDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtY2FzdERyb3BUaW1lPSIzMDAwMCIvJmd0OworICAgICAgICAgICAgICAgICAgJmx0O1JlY2VpdmVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvbkxpc3RlbmVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwTGlzdGVuQWRkcmVzcz0iYXV0byIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcExpc3RlblBvcnQ9IjkwMTUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwU2VsZWN0b3JUaW1lb3V0PSIxMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcFRocmVhZENvdW50PSI2IgorICAgICAgICAgICAgICAgICAgJmx0O1NlbmRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblRyYW5zbWl0dGVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxpY2F0aW9uTW9kZT0iZmFzdGFzeW5jcXVldWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXJUaW1lb3V0PSI1MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyQ291bnRlcj0iNiIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvVHJhbnNtaXR0ZXJQcm9jZXNzaW5nU3RhdHM9InRydWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvUHJvY2Vzc2luZ1N0YXRzPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb1dhaXRBY2tTdGF0cz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlVGltZVdhaXQ9InRydWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVEb1N0YXRzPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUNoZWNrTG9jaz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFja1RpbWVvdXQ9IjE1MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEZvckFjaz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBBbGl2ZVRpbWVvdXQ9IjgwMDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudD0iLTEiLyZndDsKKyAgICAgICAgICAgICAgICAgICZsdDtWYWx2ZSAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25WYWx2ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI9Ii4qXC5naWY7LipcLmpzOy4qXC5jc3M7LipcLnBuZzsuKlwuanBlZzsuKlwuanBnOy4qXC5odG07LipcLmh0bWw7LipcLnR4dDsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5SW5kaWNhdG9yPSJ0cnVlIiAvJmd0OworICAgICAgICAgICAgICAgICAgJmx0O1ZhbHZlICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uLkp2bVJvdXRlQmluZGVyVmFsdmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkPSJ0cnVlIiAvJmd0OwkKKyAgICAgICAgICAgICAgICAgICZsdDtDbHVzdGVyTGlzdGVuZXIgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uLkNsdXN0ZXJTZXNzaW9uTGlzdGVuZXIiIC8mZ3Q7CisgICAgICAgICAgICAgICAgICAmbHQ7Q2x1c3Rlckxpc3RlbmVyICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5Kdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyIiAvJmd0OworICAgICAgICAgICAgICAgICAgJmx0O0RlcGxveWVyICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmRlcGxveS5GYXJtV2FyRGVwbG95ZXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBEaXI9IiR7Y2F0YWxpbmEuYmFzZX0vd2FyLXRlbXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3lEaXI9IiR7Y2F0YWxpbmEuYmFzZX0vd2FyLWRlcGxveS8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hEaXI9IiR7Y2F0YWxpbmEuYmFzZX0vd2FyLWxpc3Rlbi8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaEVuYWJsZWQ9InRydWUiLyZndDsKKyAgICAgICAgICAgICAgICAgICZsdDsvQ2x1c3RlciZndDsKKyAgICAgICAgICAgICZsdDsvSG9zdCZndDsKKyAgICAgICAgJmx0Oy9FbmdpbmUmZ3Q7CisgICAgJmx0Oy9TZXJ2aWNlJmd0OworJmx0Oy9TZXJ2ZXImZ3Q7Cis8L3NvdXJjZT4KKzwvcD4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iQ2x1c3RlciBDb25maWd1cmF0aW9uIGZvciBSZXBsaWNhdGlvblRyYW5zbWl0dGVyIj4KKzxwPgorTGlzdCBvZiBBdHRyaWJ1dGVzPGJyLz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1Ij4KKworICA8dHI+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+RGVmYXVsdCB2YWx1ZTwvdGg+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5yZXBsaWNhdGlvbk1vZGU8L3RkPgorICAgIDx0ZD5yZXBsaWNhdGlvbiBtb2RlICg8ZW0+c3luY2hyb25vdXM8L2VtPiwgPGVtPnBvb2xlZDwvZW0+LCA8ZW0+YXN5bmNocm9ub3VzPC9lbT4gb3IgPGVtPmZhc3Rhc3luY3F1ZXVlPC9lbT4pCisgICAgPC90ZD4KKyAgICA8dGQ+PGNvZGU+cG9vbGVkPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5wcm9jZXNzU2VuZGVyRnJlcXVlbmN5PC90ZD4KKyAgICA8dGQ+Q29udHJvbCB0aGUgc2VuZGVyIGtlZXBhbGl2ZSBzdGF0dXMgYW5kIGRyb3Agc2VuZGVyIHNvY2tldCBjb25uZWN0aW9uIGFmdGVyIHRpbWVvdXQgaXMgcmVhY2hlZC4KKyAgICBDaGVjayBldmVyeSBwcm9jZXNzU2VuZGVyRnJlcXVlbmN5IHZhbHVlIGVuZ2luZSBiYWNrZ3JvdW5kIHRpY2tzLgorICAgIDwvdGQ+CisgICAgPHRkPjxjb2RlPjI8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmNvbXByZXNzPC90ZD4KKyAgICA8dGQ+Y29tcHJlc3MgYnl0ZXMgYmVmb3JlIHNlbmRpbmcgKGNvbnN1bWUgbWVtb3J5LCBidXQgcmVkdWNlIG5ldHdvcmsgdHJhZmZpYyAtIEdaSVApPC90ZD4KKyAgICA8dGQ+PGNvZGU+ZmFsc2U8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmFja1RpbWVvdXQ8L3RkPgorICAgIDx0ZD5hY2tub3dsZWRnZSB0aW1lb3V0IGFuZCBvbmx5IHVzZWZ1bGwgaXQgd2FpdEZvckFjayBpcyB0cnVlPC90ZD4KKyAgICA8dGQ+PGNvZGU+MTUwMDAgbXNlYzwvY29kZT48L3RkPgorICA8L3RyPgorICAKKyAgPHRyPgorICAgIDx0ZD53YWl0Rm9yQWNrPC90ZD4KKyAgICA8dGQ+V2FpdCBmb3IgYWNrIGFmdGVyIGRhdGEgc2VuZDwvdGQ+CisgICAgPHRkPjxjb2RlPmZhbHNlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5hdXRvQ29ubmVjdDwvdGQ+CisgICAgPHRkPmlzIHNlbmRlciBkaXNhYmxlZCwgZm9yayBhIG5ldyBzb2NrZXQ8L3RkPgorICAgIDx0ZD48Y29kZT5mYWxzZTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+ZG9UcmFuc21pdHRlclByb2Nlc3NpbmdTdGF0czwvdGQ+CisgICAgPHRkPmNyZWF0ZSBwcm9jZXNzaW5nIHRpbWUgc3RhdHM8L3RkPgorICAgIDx0ZD48Y29kZT5mYWxzZTwvY29kZT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzwvcD4KKzxwPgorRXhhbXBsZSB0byBnZXQgc3RhdGlzdGljIGluZm9ybWF0aW9uLCB3YWl0IGZvciBhY2sgYXQgZXZlcnkgbWVzc2FnZSBzZW5kIGFuZCB0cmFuc2ZlciBhdCBjb21wcmVzc2VkIG1vZGU8YnIvPgorPHNvdXJjZT4KKyAgICAmbHQ7U2VuZGVyCisgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25UcmFuc21pdHRlciIKKyAgICAgIHJlcGxpY2F0aW9uTW9kZT0iZmFzdGFzeW5jcXVldWUiCisgICAgICBjb21wcmVzcz0idHJ1ZSIKKyAgICAgIGRvVHJhbnNtaXR0ZXJQcm9jZXNzaW5nU3RhdHM9InRydWUiCisgICAgICBhY2tUaW1lb3V0PSIxNTAwMCIKKyAgICAgIHdhaXRGb3JBY2s9InRydWUiCisgICAgICBhdXRvQ29ubmVjdD0iZmFsc2UiLyZndDsKKzwvc291cmNlPgorPC9wPiAgCis8L3NlY3Rpb24+CisgICAgIAorPHNlY3Rpb24gbmFtZT0iQ2x1c3RlciBDb25maWd1cmF0aW9uIGZvciBSZXBsaWNhdGlvblRyYW5zbWl0dGVyIChmYXN0YXluY3F1ZXVlIC0gbW9kZSkiPgorPHA+CitMaXN0IG9mIEF0dHJpYnV0ZXM8YnIvPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgorCisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5EZWZhdWx0IHZhbHVlPC90aD4KKyAgPC90cj4KKyAgCisgIDx0cj4KKyAgICA8dGQ+a2VlcEFsaXZlVGltZW91dDwvdGQ+CisgICAgPHRkPmFjdGl2ZSBzb2NrZXQga2VlcCBhbGl2ZSB0aW1lb3V0PC90ZD4KKyAgICA8dGQ+PGNvZGU+NjAwMDAgbXNlYzwvY29kZT48L3RkPgorICA8L3RyPiAgCisKKyAgPHRyPgorICAgIDx0ZD5rZWVwQWxpdmVNYXhSZXF1ZXN0Q291bnQ8L3RkPgorICAgIDx0ZD5tYXggcmVxdWVzdCBvdmVyIHRoaXMgc29ja2V0PC90ZD4KKyAgICA8dGQ+PGNvZGU+LTE8L2NvZGU+PC90ZD4KKyAgPC90cj4gIAorCisgIDx0cj4KKyAgICA8dGQ+ZG9Qcm9jZXNzaW5nU3RhdHM8L3RkPgorICAgIDx0ZD5jcmVhdGUgUHJvY2Vzc2luZyB0aW1lIHN0YXRzPC90ZD4KKyAgICA8dGQ+PGNvZGU+ZmFsc2U8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmRvV2FpdEFja1N0YXRzPC90ZD4KKyAgICA8dGQ+Y3JlYXRlIHdhaXRBY2sgdGltZSBzdGF0czwvdGQ+CisgICAgPHRkPjxjb2RlPmZhbHNlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5yZXNlbmQ8L3RkPgorICAgIDx0ZD5yZXNlbmQgbWVzc2FnZSBhZnRlciBmYWlsdXJlLCBjYW4gb3ZlcndyaXRlIGF0IG1lc3NhZ2U8L3RkPgorICAgIDx0ZD48Y29kZT5mYWxzZTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+cmVjb3ZlclRpbWVvdXQ8L3RkPgorICAgIDx0ZD5yZWNvdmVyIFRpbWVvdXQgYWZ0ZXIgcHVzaCBtZXNzYWdlIGZhaWx1cmUgPC90ZD4KKyAgICA8dGQ+PGNvZGU+NTAwMCBtc2VjPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5yZWNvdmVyQ291bnRlcjwvdGQ+CisgICAgPHRkPm51bWJlciBvZiByZWNvdmVyIHRyaWVzPC90ZD4KKyAgICA8dGQ+PGNvZGU+MDwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+cXVldWVEb1N0YXRzPC90ZD4KKyAgICA8dGQ+YWN0aXZhdGVkIHF1ZXVlIHN0YXRzPC90ZD4KKyAgICA8dGQ+PGNvZGU+ZmFsc2U8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPnF1ZXVlQ2hlY2tMb2NrPC90ZD4KKyAgICA8dGQ+Y2hlY2sgdG8gbG9zdCBsb2NrczwvdGQ+CisgICAgPHRkPjxjb2RlPmZhbHNlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cXVldWVBZGRXYWl0VGltZW91dDwvdGQ+CisgICAgPHRkPnF1ZXVlIGFkZCB3YWl0IHRpbWUgKHRvbWNhdCBjb25uZWN0b3IgdGhyZWFkIHdhaXRzKTwvdGQ+CisgICAgPHRkPjxjb2RlPjEwMDAwIG1zZWM8L2NvZGU+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5xdWV1ZVJlbW92ZVdhaXRUaW1lb3V0PC90ZD4KKyAgICA8dGQ+cXVldWUgcmVtb3ZlIHdhaXQgdGltZSAocXVldWUgdGhyZWFkIHdhaXRzKTwvdGQ+CisgICAgPHRkPjxjb2RlPjMwMDAwIG1zZWM8L2NvZGU+PC90ZD4KKyAgPC90cj4KKyAgCisgIDx0cj4KKyAgICA8dGQ+bWF4UXVldWVMZW5ndGg8L3RkPgorICAgIDx0ZD5tYXggcXVldWUgbGVuZ3RoIChkZWZhdWx0IHdpdGhvdXQgbGltaXQpPC90ZD4KKyAgICA8dGQ+PGNvZGU+LTE8L2NvZGU+PC90ZD4KKyAgPC90cj4KKyAgCisgIDx0cj4KKyAgICA8dGQ+dGhyZWFkUHJpb3JpdHk8L3RkPgorICAgIDx0ZD5jaGFuZ2UgcXVldWUgdGhyZWFkIHByaW9yaXR5ICgxLTEwIDsgNSBpcyBub3JtYWwpPC90ZD4KKyAgICA8dGQ+PGNvZGU+NTwvY29kZT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKyAgCis8L3A+Cis8cD4KK0V4YW1wbGUgdG8gZ2V0IGEgbG90IG9mIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiwgd2FpdCBmb3IgQUNLIGFuZAorcmVjb3ZlciBhZnRlciBjb25uZWN0aW9uIGZhaWx1cmUuIFdhaXQgNSBzZWNzIHdpdGggYXR0cmlidXRlIDxpPnJlY292ZXJUaW1lb3V0PC9pPiwgbWFrZSA2IHRyYWlscword2l0aCBhdHRyaWJ1dGUgPGk+cmVjb3ZlckNvdW50ZXI8L2k+IGFuZCB1c2UgMzAgc2VjcyAoPGk+bWNhc3REcm9wVGltZT0iMzAwMDAiPC9pPikgdGltZW91dAorYXQgU2VydmljZSBlbGVtZW50IDxici8+Cis8c291cmNlPgorICAgICZsdDtTZW5kZXIKKyAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblRyYW5zbWl0dGVyIgorICAgICAgcmVwbGljYXRpb25Nb2RlPSJmYXN0YXN5bmNxdWV1ZSIKKyAgICAgIHJlY292ZXJUaW1lb3V0PSI1MDAwIgorICAgICAgcmVjb3ZlckNvdW50ZXI9IjYiICAgICAgCisgICAgICBkb1RyYW5zbWl0dGVyUHJvY2Vzc2luZ1N0YXRzPSJ0cnVlIgorICAgICAgZG9Qcm9jZXNzaW5nU3RhdHM9InRydWUiCisgICAgICBxdWV1ZVRpbWVXYWl0PSJ0cnVlIgorICAgICAgcXVldWVEb1N0YXRzPSJ0cnVlIgorICAgICAgcXVldWVDaGVja0xvY2s9InRydWUiCisgICAgICB3YWl0Rm9yQWNrPSJ0cnVlIgorICAgICAgYXV0b0Nvbm5lY3Q9ImZhbHNlIgorICAgICAga2VlcEFsaXZlVGltZW91dD0iMzIwMDAwIgorICAgICAga2VlcEFsaXZlTWF4UmVxdWVzdENvdW50PSItMSIvJmd0OworPC9zb3VyY2U+Cis8L3A+ICAKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iQ2x1c3RlciBDb25maWd1cmF0aW9uIGZvciBSZXBsaWNhdGlvblRyYW5zbWl0dGVyICggYXN5bmNocm9ub3VzIC0gbW9kZSkiPgorPHA+CitMaXN0IG9mIEF0dHJpYnV0ZXM8YnIvPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgorCisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5EZWZhdWx0IHZhbHVlPC90aD4KKyAgPC90cj4KKyAgCisgIDx0cj4KKyAgICA8dGQ+a2VlcEFsaXZlVGltZW91dDwvdGQ+CisgICAgPHRkPmFjdGl2ZSBzb2NrZXQga2VlcCBhbGl2ZSB0aW1lb3V0PC90ZD4KKyAgICA8dGQ+PGNvZGU+NjAwMDAgbXNlYzwvY29kZT48L3RkPgorICA8L3RyPiAgCisKKyAgPHRyPgorICAgIDx0ZD5rZWVwQWxpdmVNYXhSZXF1ZXN0Q291bnQ8L3RkPgorICAgIDx0ZD5tYXggcmVxdWVzdCBvdmVyIHRoaXMgc29ja2V0PC90ZD4KKyAgICA8dGQ+PGNvZGU+LTE8L2NvZGU+PC90ZD4KKyAgPC90cj4gIAorCisgIDx0cj4KKyAgICA8dGQ+ZG9Qcm9jZXNzaW5nU3RhdHM8L3RkPgorICAgIDx0ZD5jcmVhdGUgUHJvY2Vzc2luZyB0aW1lIHN0YXRzPC90ZD4KKyAgICA8dGQ+PGNvZGU+ZmFsc2U8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmRvV2FpdEFja1N0YXRzPC90ZD4KKyAgICA8dGQ+Y3JlYXRlIHdhaXRBY2sgdGltZSBzdGF0czwvdGQ+CisgICAgPHRkPjxjb2RlPmZhbHNlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIAorICA8dHI+CisgICAgPHRkPnJlc2VuZDwvdGQ+CisgICAgPHRkPnJlc2VuZCBtZXNzYWdlIGFmdGVyIGZhaWx1cmUsIGNhbiBvdmVyd3JpdGUgYXQgbWVzc2FnZTwvdGQ+CisgICAgPHRkPjxjb2RlPmZhbHNlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKzwvdGFibGU+Cis8L3A+Cis8cD4KK0V4YW1wbGUgdG8gZ2V0IGEgcHJvY2Vzc2luZyBzdGF0aXN0aWMgaW5mb3JtYXRpb24sIHJlc2VuZCBhZnRlciBmYWlsdXJlIGFuZCB3YWl0IGZvciBBQ0s8YnIvPgorPHNvdXJjZT4KKyAgICAmbHQ7U2VuZGVyCisgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25UcmFuc21pdHRlciIKKyAgICAgIHJlcGxpY2F0aW9uTW9kZT0iYXN5bmNocm9ub3VzIgorICAgICAgZG9Qcm9jZXNzaW5nU3RhdHM9InRydWUiCisgICAgICBkb1dhaXRBY2tTdGF0cz0idHJ1ZSIKKyAgICAgIHdhaXRGb3JBY2s9InRydWUiCisgICAgICBhY2tUaW1lb3V0PSIzMDAwMCIKKyAgICAgIHJlc2VuZD0idHJ1ZSIKKyAgICAgIGtlZXBBbGl2ZVRpbWVvdXQ9IjMyMDAwMCIKKyAgICAgIGtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudD0iLTEiLyZndDsKKzwvc291cmNlPgorPC9wPiAgCis8L3NlY3Rpb24+CisgICAgCis8c2VjdGlvbiBuYW1lPSJDbHVzdGVyIENvbmZpZ3VyYXRpb24gZm9yIFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIgKCBzeW5jaHJvbm91cyAtIG1vZGUpIj4KKzxwPgorTGlzdCBvZiBBdHRyaWJ1dGVzPGJyLz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1Ij4KKworICA8dHI+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+RGVmYXVsdCB2YWx1ZTwvdGg+CisgIDwvdHI+CisgIAorICA8dHI+CisgICAgPHRkPmtlZXBBbGl2ZVRpbWVvdXQ8L3RkPgorICAgIDx0ZD5hY3RpdmUgc29ja2V0IGtlZXAgYWxpdmUgdGltZW91dDwvdGQ+CisgICAgPHRkPjxjb2RlPjYwMDAwIG1zZWM8L2NvZGU+PC90ZD4KKyAgPC90cj4gIAorCisgIDx0cj4KKyAgICA8dGQ+a2VlcEFsaXZlTWF4UmVxdWVzdENvdW50PC90ZD4KKyAgICA8dGQ+bWF4IHJlcXVlc3Qgb3ZlciB0aGlzIHNvY2tldDwvdGQ+CisgICAgPHRkPjxjb2RlPi0xPC9jb2RlPjwvdGQ+CisgIDwvdHI+ICAKKworICA8dHI+CisgICAgPHRkPmRvUHJvY2Vzc2luZ1N0YXRzPC90ZD4KKyAgICA8dGQ+Y3JlYXRlIFByb2Nlc3NpbmcgdGltZSBzdGF0czwvdGQ+CisgICAgPHRkPjxjb2RlPmZhbHNlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5kb1dhaXRBY2tTdGF0czwvdGQ+CisgICAgPHRkPmNyZWF0ZSB3YWl0QWNrIHRpbWUgc3RhdHM8L3RkPgorICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5yZXNlbmQ8L3RkPgorICAgIDx0ZD5yZXNlbmQgbWVzc2FnZSBhZnRlciBmYWlsdXJlLCBjYW4gb3ZlcndyaXRlIGF0IG1lc3NhZ2U8L3RkPgorICAgIDx0ZD48Y29kZT5mYWxzZTwvY29kZT48L3RkPgorICA8L3RyPgorCis8L3RhYmxlPgorICAKKzwvcD4KKzxwPgorRXhhbXBsZSB0byBnZXQgYSBubyBwcm9jZXNzaW5nIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiwgbm8gd2FpdCBmb3IgQUNLLCBhZnRlciAxMDAwMCByZXF1ZXN0IHJlbmV3IHNvY2tldCBhbmQgYXV0b2Nvbm5lY3QgYmVmb3JlIGZpcnN0IHJlcXVlc3QgaXMgc2VuZC48YnIvPgorPHNvdXJjZT4KKyAgICAmbHQ7U2VuZGVyCisgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuUmVwbGljYXRpb25UcmFuc21pdHRlciIKKyAgICAgIHJlcGxpY2F0aW9uTW9kZT0ic3luY2hyb25vdXMiCisgICAgICBhdXRvQ29ubmVjdD0idHJ1ZSIKKyAgICAgIGtlZXBBbGl2ZVRpbWVvdXQ9Ii0xIgorICAgICAga2VlcEFsaXZlTWF4UmVxdWVzdENvdW50PSIxMDAwMDAiLyZndDsKKzwvc291cmNlPgorPC9wPiAgCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkNsdXN0ZXIgQ29uZmlndXJhdGlvbiBmb3IgUmVwbGljYXRpb25UcmFuc21pdHRlciAoIHBvb2xlZCAtIG1vZGUpIj4KKzxwPgorTGlzdCBvZiBBdHRyaWJ1dGVzPGJyLz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1Ij4KKworICA8dHI+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+RGVmYXVsdCB2YWx1ZTwvdGg+CisgIDwvdHI+CisgIAorICA8dHI+CisgICAgPHRkPmtlZXBBbGl2ZVRpbWVvdXQ8L3RkPgorICAgIDx0ZD5hY3RpdmUgc29ja2V0IGtlZXAgYWxpdmUgdGltZW91dDwvdGQ+CisgICAgPHRkPjxjb2RlPjYwMDAwIG1zZWM8L2NvZGU+PC90ZD4KKyAgPC90cj4gIAorCisgIDx0cj4KKyAgICA8dGQ+a2VlcEFsaXZlTWF4UmVxdWVzdENvdW50PC90ZD4KKyAgICA8dGQ+bWF4IHJlcXVlc3Qgb3ZlciB0aGlzIHNvY2tldDwvdGQ+CisgICAgPHRkPjxjb2RlPi0xPC9jb2RlPjwvdGQ+CisgIDwvdHI+ICAKKworICA8dHI+CisgICAgPHRkPm1heFBvb2xTb2NrZXRMaW1pdDwvdGQ+CisgICAgPHRkPm1heCBwb29sZWQgc29ja2V0cyAoU2VuZGVyIFNvY2tldHMpPC90ZD4KKyAgICA8dGQ+PGNvZGU+MjU8L2NvZGU+PC90ZD4KKyAgPC90cj4KKyAgCisgIDx0cj4KKyAgICA8dGQ+cmVzZW5kPC90ZD4KKyAgICA8dGQ+cmVzZW5kIG1lc3NhZ2UgYWZ0ZXIgZmFpbHVyZSwgY2FuIG92ZXJ3cml0ZSBhdCBtZXNzYWdlPC90ZD4KKyAgICA8dGQ+PGNvZGU+ZmFsc2U8L2NvZGU+PC90ZD4KKyAgPC90cj4KKyAgCis8L3RhYmxlPgorICAKKzwvcD4KKzxwPgorRXhhbXBsZSB0byBnZXQgYSBubyBwcm9jZXNzaW5nIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiwgd2FpdCBmb3IgQUNLLCBhZnRlciAxMDAwMCByZXF1ZXN0IHJlbmV3IHNvY2tldCwgb25seSAxMCBTb2NrZXJTZW5kZXIgYXZhaWxhYmxlIGFuZCBhdXRvY29ubmVjdCBiZWZvcmUgZmlyc3QgcmVxdWVzdCBpcyBzZW5kLjxici8+Cis8c291cmNlPgorICAgICZsdDtTZW5kZXIKKyAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblRyYW5zbWl0dGVyIgorICAgICAgcmVwbGljYXRpb25Nb2RlPSJwb29sZWQiCisgICAgICBhdXRvQ29ubmVjdD0idHJ1ZSIKKyAgICAgIG1heFBvb2xTb2NrZXRMaW1pdD0iMTAiCisgICAgICBrZWVwQWxpdmVUaW1lb3V0PSItMSIKKyAgICAgIGtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudD0iMTAwMDAiCisgICAgICB3YWl0Rm9yQWNrPSJ0cnVlIiAvJmd0OworPC9zb3VyY2U+Cis8L3A+ICAKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iQ2x1c3RlciBDb25maWd1cmF0aW9uIGZvciBSZXBsaWNhdGlvblRyYW5zbWl0dGVyICggRGVsdGFNYW5hZ2VyIEF0dHJpYnV0ZSkiPgorPHA+CitMaXN0IG9mIEF0dHJpYnV0ZXM8YnIvPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgorCisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5EZWZhdWx0IHZhbHVlPC90aD4KKyAgPC90cj4KKyAgCisgIDx0cj4KKyAgICA8dGQ+ZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duPC90ZD4KKyAgICA8dGQ+V2hlbiBzZXJ2ZXIgc3RvcHBlZCwgZXhwaXJlIGFsbCBzZXNzaW9ucyBhbHNvIGF0IGJhY2t1cCBub2RlcyAob25seSBmb3IgdGVzdGluZyk8L3RkPgorICAgIDx0ZD48Y29kZT5mYWxzZTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+bWF4QWN0aXZlU2Vzc2lvbnM8L3RkPgorICAgIDx0ZD5OdW1iZXIgb2YgYWN0aXZlIHNlc3Npb25zLiAoRGVmYXVsdCBpcyBubyBsaW1pdCk8L3RkPgorICAgIDx0ZD48Y29kZT4tMTwvY29kZT48L3RkPgorICA8L3RyPiAgCisKKyAgPHRyPgorICAgIDx0ZD5ub3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uPC90ZD4KKyAgICA8dGQ+Tm90aWZ5IGFwcGxpY2F0aW9uIHNlc3Npb24gbGlzdGVuZXIgdG8gc2Vzc2lvbiBjcmVhdGlvbiAKKyAgICBhbmQgZXhwaXJpbmcgZXZlbnRzIGF0IGJhY2t1cCBub2RlczwvdGQ+CisgICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPm5vdGlmeVNlc3Npb25MaXN0ZW5lcnNPblJlcGxpY2F0aW9uPC90ZD4KKyAgICA8dGQ+Tm90aWZ5IGFwcGxpY2F0aW9uIHNlc3Npb24gbGlzdGVuZXIgdG8gYXR0cmlidXRlIGNoYW5nZXMgYXQgYmFja3VwIG5vZGVzPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+c3RhdGVUcmFuc2ZlclRpbWVvdXQ8L3RkPgorICAgIDx0ZD5UaW1lb3V0IHRoYXQgc2Vzc2lvbiBzdGF0ZSB0cmFuc2ZlciBpcyBjb21wbGV0ZS4gSXMgYXR0cmlidXRlIDxjb2RlPnN0YXRlVHJhbnNmZXJUaW1lb3V0ID09IC0xPC9jb2RlPiAKKyAgICAgICAgdGhlbiBhcHBsaWNhdGlvbiB3YWl0IHRoYXQgb3RoZXIgbm9kZSBzZW5kIHRoZSBjb21wbGV0ZSBzZXNzaW9uIHN0YXRlPC90ZD4KKyAgICA8dGQ+PGNvZGU+NjAgc2VjPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIAorICA8dHI+CisgICAgPHRkPnNlbmRBbGxTZXNzaW9uczwvdGQ+CisgICAgPHRkPkZsYWcgdG8gc2VuZCBzZXNzaW9ucyBhcyBzcGxpdGVkIGJsb2NrczwvdGQ+CisgICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPnNlbmRBbGxTZXNzaW9uc1NpemU8L3RkPgorICAgIDx0ZD5OdW1iZXIgb2Ygc2VyaWFsaXplIHNlc3Npb25zIGluc2lkZSBhIHNlbmQgYmxvY2sgc2Vzc2lvbiBtZXNzYWdlLiBPbmx5IHVzZWZ1bCB3aGVuIDxjb2RlPnNlbmRBbGxTZXNzaW9ucz09ZmFsc2U8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+MTAwMDwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+c2VuZEFsbFNlc3Npb25zV2FpdFRpbWU8L3RkPgorICAgIDx0ZD53YWl0IHRpbWUgYmV0d2VlbiB0d28gc2Vzc2lvbiBzZW5kIGJsb2Nrcy48L3RkPgorICAgIDx0ZD48Y29kZT4yMDAwIG1zZWM8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPnNlbmRDbHVzdGVyRG9tYWluT25seTwvdGQ+CisgICAgPHRkPlNlbmQgYWxsIHNlc3Npb24gbWVzc2FnZXMgb25seSB0byBtZW1iZXIgaW5zaWRlIHNhbWUgY2x1c3RlciBkb21haW4gCisgICAgICAgICh2YWx1ZSBvZCBNZW1iZXJzaGlwIGF0dHJpYnV0ZSBtY2FzdENsdXN0ZXJEb21haW4pLiBBbHNvIGRvbid0IGhhbmRsZQorICAgICAgICBzZXNzaW9uIG1lc3NhZ2VzIGZyb20gb3RoZXIgZG9tYWlucy48L3RkPgorICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+CisgIDwvdHI+ICAKKworICA8dHI+CisgICAgPHRkPnN0YXRlVGltZXN0YW1wRHJvcDwvdGQ+CisgICAgPHRkPkRlbHRhTWFuYWdlciBxdWV1ZWQgU2Vzc2lvbnMgbWVzc2FnZXMgd2hlbiBzZW5kIEdFVF9BTExfU0VTU0lPTiB0byBvdGhlciBub2RlLgorICAgIHdpdGggc3RhdGVUaW1lc3RhbXBEcm9wIGFsbCBtZXNzYWdlcyBiZWZvcmUgc3RhdGUgdHJhbnNmZXIgbWVzc2FnZSBjcmVhdGlvbiBkYXRlIChmaW5kIHNlc3Npb24pIGFyZSBkcm9wcGVkLgorICAgIE9ubHkgb3RoZXIgR0VUX0FMTF9TRVNTSU9OIGV2ZW50cyBhcmUgaGFuZGxlIHdpdGggZGF0ZSBiZWZvcmUgc3RhdGUgdHJhbnNmZXIgbWVzc2FnZS48L3RkPgorICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+CisgIDwvdHI+ICAKKyAgCisgIDx0cj4KKyAgICA8dGQ+dXBkYXRlQWN0aXZlSW50ZXJ2YWw8L3RkPgorICAgIDx0ZD5TZW5kIHNlc3Npb24gYWNjZXNzIG1lc3NhZ2UgZXZlcnkgdXBkYXRlQWN0aXZlSW50ZXJ2YWwgc2VjLjwvdGQ+CisgICAgPHRkPjxjb2RlPjYwPC9jb2RlPjwvdGQ+CisgIDwvdHI+ICAKKyAgCisgIDx0cj4KKyAgICA8dGQ+ZXhwaXJlVG9sZXJhbmNlPC90ZD4KKyAgICA8dGQ+QXV0b2V4cGlyZSBiYWNrdXAgc2Vzc2lvbiBhZnRlciBNYXhJbmFjdGl2ZSArIGV4cGlyZVRvbGVyYW5jZSBzZWMuPC90ZD4KKyAgICA8dGQ+PGNvZGU+MzAwPC9jb2RlPjwvdGQ+CisgIDwvdHI+IAorICAKKzwvdGFibGU+CisgIAorPC9wPgorPHA+CitFeGFtcGxlIHNlbmQgYWxsIHNlc3Npb25zIGF0IHNlcGFyYXRlIGJsb2Nrcy4gU2VyaWFsaXplIGFuZCBzZW5kIDEwMCBzZXNzaW9uIGluc2lkZSBvbmUgYmxvY2suCitXYWl0IG1heGltYWxlIHR3byBtaW51dGVzIGJlZm9yZSB0aGUgY29tcGxldGUgYmFja3VwIHNlc3Npb25zIGFyZSBsb2FkZWQgaW5zaWRlIHRvbWNhdCBib290IHByb2Nlc3MuCitCZXR3ZWVuIHNlbmQgYmxvY2tzIHdhaXQgNSBzZWNzIHRvIHRyYW5zZmVycyB0aGUgc2Vzc2lvbiBibG9jayB0byBvdGhlciBub2RlLiBUaGlzIHNhdmUgbWVtb3J5Cit3aGVuIHlvdSB1c2UgdGhlIGFzeW5jIG1vZGVzIHdpdGggcXVldWVzLjxici8+Cis8c291cmNlPgorICAgICZsdDtDbHVzdGVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS50Y3AuU2ltcGxlVGNwQ2x1c3RlciIKKyAgICAgIG1hbmFnZXJDbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uLkRlbHRhTWFuYWdlciIKKyAgICAgIG1hbmFnZXIuc3RhdGVUcmFuc2ZlclRpbWVvdXQ9IjEyMCIKKyAgICAgIG1hbmFnZXIuc2VuZEFsbFNlc3Npb25zPSJmYWxzZSIKKyAgICAgIG1hbmFnZXIuc2VuZEFsbFNlc3Npb25zU2l6ZT0iMTAwIgorICAgICAgbWFuYWdlci5zZW5kQWxsU2Vzc2lvbnNXYWl0VGltZT0iNTAwMCIKKyAgICAgICIvJmd0OworPC9zb3VyY2U+Cis8L3A+Cis8cD4KKzxiPk5vdGU6PC9iPjxici8+CitBcyA8ZW0+Q2x1c3Rlci5kZWZhdWx0TW9kZT10cnVlPC9lbT4geW91IGNhbiBjb25maWd1cmUgdGhlIG1hbmFnZXIgYXR0cmlidXRlcyB3aXRoIHByZWZpeCA8ZW0+bWFuYWdlci48L2VtPi4gCis8YnIvPgorPGI+Tm90ZTo8L2I+PGJyLz4KK1dpdGggPGVtPkNsdXN0ZXIuc2V0UHJvcGVydHkoJmx0O1N0cmluZyZndDssJmx0O1N0cmluZyZndDspPC9lbT4geW91IGNhbiBtb2RpZnkgCithdHRyaWJ1dGVzIGZvciBhbGwgcmVnaXN0ZXIgbWFuYWdlcnMuIFRoZSBtZXRob2QgZXhpc3RzIGFzIE1CZWFucyBvcGVyYXRpb24uCis8L3A+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkJpbmQgc2Vzc2lvbiBhZnRlciBjcmFzaCB0byBmYWlsb3ZlciBub2RlIj4KKzxwPgorQXMgeW91IGNvbmZpZ3VyZSBtb3JlIHRoZW4gdHdvIG5vZGVzIGF0IHNhbWUgY2x1c3RlciBmb3IgYmFja3VwLCBtb3N0IGxvYWRiYWxhbmNlcgorc2VuZCBkb24ndCBhbGwgeW91ciByZXF1ZXN0cyBhZnRlciBmYWlsb3ZlciB0byB0aGUgc2FtZSBub2RlLgorPC9wPgorPHA+IAorVGhlIEp2bVJvdXRlQmluZGVyVmFsdmUgaGFuZGxlIHRvbWNhdCBqdm1Sb3V0ZSB0YWtlb3ZlciB1c2luZyBtb2RfamsgbW9kdWxlIGFmdGVyIG5vZGUKK2ZhaWx1cmUuIEFmdGVyIGEgbm9kZSBjcmFzaGVkIHRoZSBuZXh0IHJlcXVlc3QgZ29pbmcgdG8gb3RoZXIgY2x1c3RlciBub2RlLiBUaGUgSnZtUm91dGVCaW5kZXJWYWx2ZSAKK25vdyBkZXRlY3QgdGhlIHRha2VvdmVyIGFuZCByZXdyaXRlIHRoZSBqc2Vzc2lvbmlkCitpbmZvcm1hdGlvbiB0byB0aGUgYmFja3VwIGNsdXN0ZXIgbm9kZS4gQWZ0ZXIgdGhlIG5leHQgcmVzcG9uc2UgYWxsIGNsaWVudAorcmVxdWVzdCBnb2VzIGRpcmVjdCB0byB0aGUgYmFja3VwIG5vZGUuIFRoZSBjaGFuZ2Ugc2Vzc2lvbmlkIHNlbmQgYWxzbyB0byBhbGwKK290aGVyIGNsdXN0ZXIgbm9kZXMuIFdlbGwsIG5vdyB0aGUgc2Vzc2lvbiBzdGlja3luZXNzIHdvcmsgZGlyZWN0bHkgdG8gdGhlCitiYWNrdXAgbm9kZSwgYnV0IHRyYWZmaWMgZG9uJ3QgZ28gYmFjayB0b28gcmVzdGFydGVkIGNsdXN0ZXIgbm9kZXMhPGJyLz4KK0FzIGpzZXNzaW9uaWQgd2FzIGNyZWF0ZWQgYnkgY29va2llLCB0aGUgY2hhbmdlIEpTRVNTSU9OSUQgY29va2llIHJlc2VuZCB3aXRoIG5leHQgcmVzcG9uc2UuCis8L3A+Cis8cD4KK1lvdSBtdXN0IGFkZCBKdm1Sb3V0ZUJpbmRlclZhbHZlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjbHVzdGVyIG1lc3NhZ2UgbGlzdGVuZXIgSnZtUm91dGVTZXNzaW9uSURCaW5kZXJMaXN0ZW5lci4KK0FzIHlvdSBhZGQgdGhlIG5ldyBsaXN0ZW5lciB5b3UgbXVzdCBhbHNvIGFkZCB0aGUgZGVmYXVsdCBDbHVzdGVyU2Vzc2lvbkxpc3RlbmVyIHRoYXQgcmVjZWl2ZXIgdGhlIG5vcm1hbCBjbHVzdGVyIG1lc3NhZ2VzLgorCis8c291cmNlPgorJmx0O0NsdXN0ZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnRjcC5TaW1wbGVUY3BDbHVzdGVyIiAmZ3Q7CisuLi4KKyAgICAgJmx0O1ZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uSnZtUm91dGVCaW5kZXJWYWx2ZSIKKyAgICAgICAgICAgICAgIGVuYWJsZWQ9InRydWUiIHNlc3Npb25JZEF0dHJpYnV0ZT0idGFrZW92ZXJTZXNzaW9uaWQiLyZndDsJCisgICAgICZsdDtDbHVzdGVyTGlzdGVuZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5Kdm1Sb3V0ZVNlc3Npb25JREJpbmRlckxpc3RlbmVyIiAvJmd0OworICAgICAmbHQ7Q2x1c3Rlckxpc3RlbmVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uQ2x1c3RlclNlc3Npb25MaXN0ZW5lciIgLyZndDsKKy4uLgorJmx0O0NsdXN0ZXImZ3Q7Cis8L3NvdXJjZT4KKzwvcD4KKzxwPgorPGI+SGludDo8L2I+PGJyLz4KK1dpdGggYXR0cmlidXRlIDxpPnNlc3Npb25JZEF0dHJpYnV0ZTwvaT4geW91IGNhbiBjaGFuZ2UgdGhlIHJlcXVlc3QgYXR0cmlidXRlIG5hbWUgdGhhdCBpbmNsdWRlZCB0aGUgb2xkIHNlc3Npb24gaWQuCitEZWZhdWx0IGF0dHJpYnVpdGUgbmFtZSBpcyA8aT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5Kdm1Sb3V0ZU9yaWduYWxTZXNzaW9uSUQ8L2k+LgorPC9wPgorPHA+Cis8Yj5Ucmljazo8L2I+PGJyLz4KK1lvdSBjYW4gZW5hYmxlIHRoaXMgbW9kX2prIHR1cm5vdmVyIG1vZGUgdmlhIEpNWCBiZWZvcmUgeW91IGRyb3AgYSBub2RlIHRvIGFsbCBiYWNrdXAgbm9kZXMhCitTZXQgZW5hYmxlIHRydWUgb24gYWxsIEp2bVJvdXRlQmluZGVyVmFsdmUgYmFja3VwcywgZGlzYWJsZSB3b3JrZXIgYXQgbW9kX2prIAorYW5kIHRoZW4gZHJvcCBub2RlIGFuZCByZXN0YXJ0IGl0ISBUaGVuIGVuYWJsZSBtb2RfamsgV29ya2VyIGFuZCBkaXNhYmxlIEp2bVJvdXRlQmluZGVyVmFsdmVzIGFnYWluLiAKK1RoaXMgdXNlIGNhc2UgbWVhbnMgdGhhdCBvbmx5IHJlcXVlc3RlZCBzZXNzaW9uIGFyZSBtaWdyYXRlZC4KKzwvcD4KKworPC9zZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iTW9uaXRvcmluZyB5b3VyIENsdXN0ZXIgd2l0aCBKTVgiPgorPHA+TW9uaXRvcmluZyBpcyBhIHZlcnkgaW1wb3J0YW50IHF1ZXN0aW9uIHdoZW4geW91IHVzZSBhIGNsdXN0ZXIuIFNvbWUgb2YgdGhlIGNsdXN0ZXIgb2JqZWN0cyBhcmUgSk1YIE1CZWFucyA8L3A+Cis8cD5BZGQgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgdG8geW91ciBzdGFydHVwIHNjcmlwdCB3aXRoIEphdmEgNToKKzxzb3VyY2U+CitzZXQgQ0FUQUxJTkFfT1BUUz1cCistRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUgXAorLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnBvcnQ9JW15LmpteC5wb3J0JSBcCistRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsPWZhbHNlIFwKKy1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5hdXRoZW50aWNhdGU9ZmFsc2UKKzwvc291cmNlPgorPC9wPgorPHA+QWN0aXZhdGUgSk1YIHdpdGggSkRLIDEuNDoKKzxvbD4KKzxsaT5JbnN0YWxsIHRoZSBjb21wYXQgcGFja2FnZTwvbGk+Cis8bGk+SW5zdGFsbCB0aGUgbXg0ai10b29scy5qYXIgYXQgY29tbW9uL2xpYiAodXNlIHRoZSBzYW1lIG14NGogdmVyc2lvbiBhcyB5b3VyIHRvbWNhdCByZWxlYXNlKTwvbGk+Cis8bGk+Q29uZmlndXJlIGEgTVg0SiBKTVggSFRUUCBBZGFwdG9yIGF0IHlvdXIgQUpQIENvbm5lY3RvcjxwPjwvcD4KKzxzb3VyY2U+CismbHQ7Q29ubmVjdG9yIHBvcnQ9IiR7QUpQLlBPUlR9IiAKKyAgIGhhbmRsZXIubGlzdD0ibXgiCisgICBteC5lbmFibGVkPSJ0cnVlIiAKKyAgIG14Lmh0dHBIb3N0PSIke0pNWC5IT1NUfSIgCisgICBteC5odHRwUG9ydD0iJHtKTVguUE9SVH0iIAorICAgcHJvdG9jb2w9IkFKUC8xLjMiIC8mZ3Q7Cis8L3NvdXJjZT4KKzwvbGk+Cis8bGk+U3RhcnQgeW91ciB0b21jYXQgYW5kIGxvb2sgd2l0aCB5b3VyIGJyb3dzZXIgdG8gaHR0cDovLyR7Sk1YLkhPU1R9OiR7Sk1YLlBPUlR9PC9saT4KKzxsaT5XaXRoIHRoZSBjb25uZWN0b3IgcGFyYW1ldGVyIDxjb2RlPm14LmF1dGhNb2RlPSJiYXNpYyIgbXguYXV0aFVzZXI9InRvbWNhdCIgbXguYXV0aFBhc3N3b3JkPSJzdHJhbmdlIjwvY29kZT4geW91IGNhbiBjb250cm9sIHRoZSBhY2Nlc3MhPC9saT4KKzwvb2w+Cis8L3A+Cis8cD4KK0xpc3Qgb2YgQ2x1c3RlciBNYmVhbnM8YnIvPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgorCisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+TmFtZTwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+TUJlYW4gT2JqZWN0TmFtZSAtIEVuZ2luZTwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPk1CZWFuIE9iamVjdE5hbWUgLSBIb3N0PC90aD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPkNsdXN0ZXI8L3RkPgorICAgIDx0ZD5UaGUgY29tcGxldGUgY2x1c3RlciBlbGVtZW50PC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT1DbHVzdGVyPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9Q2x1c3Rlcixob3N0PSR7SE9TVH08L2NvZGU+PC90ZD4KKyAgPC90cj4KKyAKKyAgPHRyPgorICAgIDx0ZD5DbHVzdGVyU2VuZGVyPC90ZD4KKyAgICA8dGQ+Q29uZmlndXJhdGlvbiBhbmQgc3RhdHMgb2YgdGhlIHNlbmRlciBpbmZyYXN0cnVjdHVyZTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9Q2x1c3RlclNlbmRlcjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPUNsdXN0ZXJTZW5kZXIsaG9zdD0ke0hPU1R9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgCisgIDx0cj4KKyAgICA8dGQ+Q2x1c3RlclJlY2VpdmVyPC90ZD4KKyAgICA8dGQ+Q29uZmlndXJhdGlvbiBhbmQgc3RhdHMgb2YgdGhlIHJlY2V2aWVyIGluZnJhc3RydWN0dXJlPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT1DbHVzdGVyUmVjZWl2ZXI8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT1DbHVzdGVyUmVjZWl2ZXIsaG9zdD0ke0hPU1R9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5DbHVzdGVyTWVtYmVyc2hpcDwvdGQ+CisgICAgPHRkPkNvbmZpZ3VyYXRpb24gYW5kIHN0YXRzIG9mIHRoZSBtZW1iZXJzaGlwIGluZnJhc3RydWN0dXJlPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT1DbHVzdGVyTWVtYmVyc2hpcDwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPUNsdXN0ZXJNZW1iZXJzaGlwLGhvc3Q9JHtIT1NUfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+SURhdGFTZW5kZXI8L3RkPgorICAgIDx0ZD5Gb3IgZXZlcnkgY2x1c3RlciBtZW1iZXIgaXQgZXhpc3QgYSBzZW5kZXIgbWJlYW5zLiAKKyAgICBJdCBleGlzdHMgc3BlemlhbGwgTUJlYW5zIHRvIGFsbCByZXBsaWNhdGlvbiBtb2RlczwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9SURhdGFTZW5kZXIsCisgICAgICAgIHNlbmRlckFkZHJlc3M9JHtNRU1CRVIuU0VOREVSLklQfSwKKyAgICAgICAgc2VuZGVyUG9ydD0ke01FTUJFUi5TRU5ERVIuUE9SVH08L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT1JRGF0YVNlbmRlcixob3N0PSR7SE9TVH0sCisgICAgICAgIHNlbmRlckFkZHJlc3M9JHtNRU1CRVIuU0VOREVSLklQfSwKKyAgICAgICAgc2VuZGVyUG9ydD0ke01FTUJFUi5TRU5ERVIuUE9SVH08L2NvZGU+PC90ZD4KKyAgPC90cj4KKyAKKyAgPHRyPgorICAgIDx0ZD5EZWx0YU1hbmFnZXI8L3RkPgorICAgIDx0ZD5UaGlzIG1hbmFnZXIgY29udHJvbCB0aGUgc2Vzc2lvbnMgYW5kIGhhbmRsZSBzZXNzaW9uIHJlcGxpY2F0aW9uIDwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9TWFuYWdlcixwYXRoPSR7QVBQLkNPTlRFWFQuUEFUSH0sIGhvc3Q9JHtIT1NUfTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPU1hbmFnZXIscGF0aD0ke0FQUC5DT05URVhULlBBVEh9LCBob3N0PSR7SE9TVH08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlJlcGxpY2F0aW9uVmFsdmU8L3RkPgorICAgIDx0ZD5UaGlzIHZhbHZlIGNvbnRyb2wgdGhlIHJlcGxpY2F0aW9uIHRvIHRoZSBiYWNrdXAgbm9kZXM8L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPVZhbHZlLG5hbWU9UmVwbGljYXRpb25WYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPVZhbHZlLG5hbWU9UmVwbGljYXRpb25WYWx2ZSxob3N0PSR7SE9TVH08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPkp2bVJvdXRlQmluZGVyVmFsdmU8L3RkPgorICAgIDx0ZD5UaGlzIGlzIGEgY2x1c3RlciBmYWxsYmFjayB2YWx2ZSB0byBjaGFuZ2UgdGhlIFNlc3Npb24gSUQgdG8gdGhlIGN1cnJlbnQgdG9tY2F0IGp2bXJvdXRlLjwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9VmFsdmUsbmFtZT1Kdm1Sb3V0ZUJpbmRlclZhbHZlLAorICAgICAgICAgICAgICBwYXRoPSR7QVBQLkNPTlRFWFQuUEFUSH08L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT1WYWx2ZSxuYW1lPUp2bVJvdXRlQmluZGVyVmFsdmUsaG9zdD0ke0hPU1R9LAorICAgICAgICAgICAgICBwYXRoPSR7QVBQLkNPTlRFWFQuUEFUSH08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKzwvcD4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iRkFRIj4KKzxwPlBsZWFzZSBzZWUgPGEgaHJlZj0iaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnL2ZhcS9jbHVzdGVyLmh0bWwiPnRoZSBjbHVzdGVyaW5nIHNlY3Rpb24gb2YgdGhlIEZBUTwvYT4uPC9wPgorPC9zZWN0aW9uPgorCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9hanAueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvYWpwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjkwZDI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvYWpwLnhtbApAQCAtMCwwICsxLDI5OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImFqcC5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hdXRob3I+CisgICAgPGF1dGhvcj5Zb2F2IFNoYXBpcmE8L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSJhcmphcXVpdGhAbWluZHNwcmluZy5jb20iPkFuZHJldyBSLiBKYXF1aXRoPC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBBSlAgQ29ubmVjdG9yPC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgIDxwPlRoZSA8c3Ryb25nPkFKUCBDb25uZWN0b3I8L3N0cm9uZz4gZWxlbWVudCByZXByZXNlbnRzIGEKKyAgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gY29tcG9uZW50IHRoYXQgY29tbXVuaWNhdGVzIHdpdGggYSB3ZWIKKyAgY29ubmVjdG9yIHZpYSB0aGUgPGNvZGU+QUpQPC9jb2RlPiBwcm90b2NvbC4gIFRoaXMgaXMgdXNlZCBmb3IgY2FzZXMKKyAgd2hlcmUgeW91IHdpc2ggdG8gaW52aXNpYmx5IGludGVncmF0ZSBUb21jYXQgNSBpbnRvIGFuIGV4aXN0aW5nIChvciBuZXcpCisgIEFwYWNoZSBpbnN0YWxsYXRpb24sIGFuZCB5b3Ugd2FudCBBcGFjaGUgdG8gaGFuZGxlIHRoZSBzdGF0aWMgY29udGVudAorICBjb250YWluZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiwgYW5kL29yIHV0aWxpemUgQXBhY2hlJ3MgU1NMCisgIHByb2Nlc3NpbmcuPC9wPgorCisgIDxwPlRoaXMgY29ubmVjdG9yIHN1cHBvcnRzIGxvYWQgYmFsYW5jaW5nIHdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCisgIHRoZSA8Y29kZT5qdm1Sb3V0ZTwvY29kZT4gYXR0cmlidXRlIG9mIHRoZSAKKyAgPGEgaHJlZj0iZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4uPC9wPgorCis8cD5UaGUgbmF0aXZlIGNvbm5lY3RvcnMgc3VwcG9ydGVkIHdpdGggdGhpcyBUb21jYXQgcmVsZWFzZSBhcmU6Cis8dWw+CisgIDxsaT5KSyAxLjIueCB3aXRoIGFueSBvZiB0aGUgc3VwcG9ydGVkIHNlcnZlcnM8L2xpPgorICA8bGk+bW9kX3Byb3h5IG9uIEFwYWNoZSBodHRwZCAyLnggKGluY2x1ZGVkIGJ5IGRlZmF1bHQgaW4gQXBhY2hlIEhUVFAgU2VydmVyIDIuMiksIAorICAgICAgd2l0aCBBSlAgZW5hYmxlZDogc2VlCisgICAgICA8YSBocmVmPSJodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLzIuMi9tb2QvbW9kX3Byb3h5X2FqcC5odG1sIj50aGUgaHR0cGQgZG9jczwvYT4KKyAgICAgIGZvciBkZXRhaWxzLjwvbGk+Cis8L3VsPgorPC9wPgorCis8cD48Yj5PdGhlciBuYXRpdmUgY29ubmVjdG9ycyBzdXBwb3J0aW5nIEFKUCBtYXkgd29yaywgYnV0IGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLjwvYj48L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJBdHRyaWJ1dGVzIj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJDb21tb24gQXR0cmlidXRlcyI+CisKKyAgPHA+QWxsIGltcGxlbWVudGF0aW9ucyBvZiA8c3Ryb25nPkNvbm5lY3Rvcjwvc3Ryb25nPgorICBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisKKyAgPGF0dHJpYnV0ZXM+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImFsbG93VHJhY2UiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5BIGJvb2xlYW4gdmFsdWUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIFRSQUNFCisgICAgICBIVFRQIG1ldGhvZC4gSWYgbm90IHNwZWNpZmllZCwgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIGZhbHNlLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW1wdHlTZXNzaW9uUGF0aCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPklmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgYWxsIHBhdGhzIGZvciBzZXNzaW9uIGNvb2tpZXMgd2lsbCBiZSBzZXQKKyAgICAgIHRvIDxjb2RlPi88L2NvZGU+LiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIHBvcnRsZXQgc3BlY2lmaWNhdGlvbiBpbXBsZW1lbnRhdGlvbnMsCisgICAgICBidXQgd2lsbCBncmVhdGx5IGFmZmVjdCBwZXJmb3JtYW5jZSBpZiBtYW55IGFwcGxpY2F0aW9ucyBhcmUgYWNjZXNzZWQgb24gYSBnaXZlbgorICAgICAgc2VydmVyIGJ5IHRoZSBjbGllbnQuCisgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5hYmxlTG9va3VwcyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3Ugd2FudCBjYWxscyB0bworICAgICAgPGNvZGU+cmVxdWVzdC5nZXRSZW1vdGVIb3N0KCk8L2NvZGU+IHRvIHBlcmZvcm0gRE5TIGxvb2t1cHMgaW4KKyAgICAgIG9yZGVyIHRvIHJldHVybiB0aGUgYWN0dWFsIGhvc3QgbmFtZSBvZiB0aGUgcmVtb3RlIGNsaWVudC4gIFNldAorICAgICAgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHNraXAgdGhlIEROUyBsb29rdXAgYW5kIHJldHVybiB0aGUgSVAKKyAgICAgIGFkZHJlc3MgaW4gU3RyaW5nIGZvcm0gaW5zdGVhZCAodGhlcmVieSBpbXByb3ZpbmcgcGVyZm9ybWFuY2UpLgorICAgICAgQnkgZGVmYXVsdCwgRE5TIGxvb2t1cHMgYXJlIGVuYWJsZWQuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhQb3N0U2l6ZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBtYXhpbXVtIHNpemUgaW4gYnl0ZXMgb2YgdGhlIFBPU1Qgd2hpY2ggd2lsbCBiZSBoYW5kbGVkIGJ5CisgICAgICB0aGUgY29udGFpbmVyIEZPUk0gVVJMIHBhcmFtZXRlciBwYXJzaW5nLiBUaGUgZmVhdHVyZSBjYW4gYmUgZGlzYWJsZWQgYnkKKyAgICAgIHNldHRpbmcgdGhpcyBhdHRyaWJ1dGUgdG8gYSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMC4KKyAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byAyMDk3MTUyICgyIG1lZ2FieXRlcykuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhTYXZlUG9zdFNpemUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgbWF4aW11bSBzaXplIGluIGJ5dGVzIG9mIHRoZSBQT1NUIHdoaWNoIHdpbGwgYmUgc2F2ZWQvYnVmZmVyZWQgYnkKKyAgICAgIHRoZSBjb250YWluZXIgZHVyaW5nIEZPUk0gb3IgQ0xJRU5ULUNFUlQgYXV0aGVudGljYXRpb24uIEZvciBib3RoIHR5cGVzCisgICAgICBvZiBhdXRoZW50aWNhdGlvbiwgdGhlIFBPU1Qgd2lsbCBiZSBzYXZlZC9idWZmZXJlZCBiZWZvcmUgdGhlIHVzZXIgaXMKKyAgICAgIGF1dGhlbnRpY2F0ZWQuIEZvciBDTElFTlQtQ0VSVCBhdXRoZW50aWNhdGlvbiwgdGhlIFBPU1QgaXMgYnVmZmVyZWQgZm9yCisgICAgICB0aGUgZHVyYXRpb24gb2YgdGhlIFNTTCBoYW5kc2hha2UgYW5kIHRoZSBidWZmZXIgZW1wdGllZCB3aGVuIHRoZSByZXF1ZXN0CisgICAgICBpcyBwcm9jZXNzZWQuIEZvciBGT1JNIGF1dGhlbnRpY2F0aW9uIHRoZSBQT1NUIGlzIHNhdmVkIHdoaWxzdCB0aGUgdXNlcgorICAgICAgaXMgcmUtZGlyZWN0ZWQgdG8gdGhlIGxvZ2luIGZvcm0gYW5kIGlzIHJldGFpbmVkIHVudGlsIHRoZSB1c2VyCisgICAgICBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlcyBvciB0aGUgc2Vzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGV4cGlyZXMuIFRoZSBsaW1pdCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGlzCisgICAgICBhdHRyaWJ1dGUgdG8gLTEuIFNldHRpbmcgdGhlIGF0dHJpYnV0ZSB0byB6ZXJvIHdpbGwgZGlzYWJsZSB0aGUgc2F2aW5nIG9mCisgICAgICBQT1NUIGRhdGEgZHVyaW5nIGF1dGhlbnRpY2F0aW9uLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQKKyAgICAgIHRvIDQwOTYgKDQga2lsb2J5dGVzKS48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InByb3RvY29sIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhpcyBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSA8Y29kZT5BSlAvMS4zPC9jb2RlPiB0byB1c2UgdGhlIEFKUAorICAgICAgaGFuZGxlci48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InByb3h5TmFtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPklmIHRoaXMgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gaXMgYmVpbmcgdXNlZCBpbiBhIHByb3h5CisgICAgICBjb25maWd1cmF0aW9uLCBjb25maWd1cmUgdGhpcyBhdHRyaWJ1dGUgdG8gc3BlY2lmeSB0aGUgc2VydmVyIG5hbWUKKyAgICAgIHRvIGJlIHJldHVybmVkIGZvciBjYWxscyB0byA8Y29kZT5yZXF1ZXN0LmdldFNlcnZlck5hbWUoKTwvY29kZT4uCisgICAgICBTZWUgPGEgaHJlZj0iI1Byb3h5IFN1cHBvcnQiPlByb3h5IFN1cHBvcnQ8L2E+IGZvciBtb3JlCisgICAgICBpbmZvcm1hdGlvbi48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InByb3h5UG9ydCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPklmIHRoaXMgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gaXMgYmVpbmcgdXNlZCBpbiBhIHByb3h5CisgICAgICBjb25maWd1cmF0aW9uLCBjb25maWd1cmUgdGhpcyBhdHRyaWJ1dGUgdG8gc3BlY2lmeSB0aGUgc2VydmVyIHBvcnQKKyAgICAgIHRvIGJlIHJldHVybmVkIGZvciBjYWxscyB0byA8Y29kZT5yZXF1ZXN0LmdldFNlcnZlclBvcnQoKTwvY29kZT4uCisgICAgICBTZWUgPGEgaHJlZj0iI1Byb3h5IFN1cHBvcnQiPlByb3h5IFN1cHBvcnQ8L2E+IGZvciBtb3JlCisgICAgICBpbmZvcm1hdGlvbi48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InJlZGlyZWN0UG9ydCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPklmIHRoaXMgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gaXMgc3VwcG9ydGluZyBub24tU1NMCisgICAgICByZXF1ZXN0cywgYW5kIGEgcmVxdWVzdCBpcyByZWNlaXZlZCBmb3Igd2hpY2ggYSBtYXRjaGluZworICAgICAgPGNvZGU+Jmx0O3NlY3VyaXR5LWNvbnN0cmFpbnQmZ3Q7PC9jb2RlPiByZXF1aXJlcyBTU0wgdHJhbnNwb3J0LAorICAgICAgQ2F0YWxpbmEgd2lsbCBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0IHRoZSByZXF1ZXN0IHRvIHRoZSBwb3J0CisgICAgICBudW1iZXIgc3BlY2lmaWVkIGhlcmUuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXF1ZXN0LnJlZ2lzdGVyUmVxdWVzdHMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGlzIGF0dHJpYnV0ZSBjb250cm9scyByZXF1ZXN0IHJlZ2lzdHJhdGlvbiBmb3IgSk1YIG1vbml0b3JpbmcKKyAgICAgIG9mIHRoZSBDb25uZWN0b3IuICBJdCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQsIGJ1dCBtYXkgYmUgdHVybmVkCisgICAgICBpdCBvZmYgdG8gc2F2ZSBhIGJpdCBvZiBtZW1vcnkuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzY2hlbWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5TZXQgdGhpcyBhdHRyaWJ1dGUgdG8gdGhlIG5hbWUgb2YgdGhlIHByb3RvY29sIHlvdSB3aXNoIHRvIGhhdmUKKyAgICAgIHJldHVybmVkIGJ5IGNhbGxzIHRvIDxjb2RlPnJlcXVlc3QuZ2V0U2NoZW1lKCk8L2NvZGU+LiAgRm9yCisgICAgICBleGFtcGxlLCB5b3Ugd291bGQgc2V0IHRoaXMgYXR0cmlidXRlIHRvICI8Y29kZT5odHRwczwvY29kZT4iCisgICAgICBmb3IgYW4gU1NMIENvbm5lY3Rvci4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzICI8Y29kZT5odHRwPC9jb2RlPiIuCisgICAgICBTZWUgPGEgaHJlZj0iI1NTTCBTdXBwb3J0Ij5TU0wgU3VwcG9ydDwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZWN1cmUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5TZXQgdGhpcyBhdHRyaWJ1dGUgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdpc2ggdG8gaGF2ZQorICAgICAgY2FsbHMgdG8gPGNvZGU+cmVxdWVzdC5pc1NlY3VyZSgpPC9jb2RlPiB0byByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KKyAgICAgIGZvciByZXF1ZXN0cyByZWNlaXZlZCBieSB0aGlzIENvbm5lY3RvciAoeW91IHdvdWxkIHdhbnQgdGhpcyBvbiBhbgorICAgICAgU1NMIENvbm5lY3RvcikuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4uPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJVUklFbmNvZGluZyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoaXMgc3BlY2lmaWVzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdXNlZCB0byBkZWNvZGUgdGhlIFVSSSBieXRlcywKKyAgICAgIGFmdGVyICV4eCBkZWNvZGluZyB0aGUgVVJMLiBJZiBub3Qgc3BlY2lmaWVkLCBJU08tODg1OS0xIHdpbGwgYmUgdXNlZC4KKyAgICAgIDwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlQm9keUVuY29kaW5nRm9yVVJJIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhpcyBzcGVjaWZpZXMgaWYgdGhlIGVuY29kaW5nIHNwZWNpZmllZCBpbiBjb250ZW50VHlwZSBzaG91bGQgYmUgdXNlZAorICAgICAgZm9yIFVSSSBxdWVyeSBwYXJhbWV0ZXJzLCBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBVUklFbmNvZGluZy4gVGhpcworICAgICAgc2V0dGluZyBpcyBwcmVzZW50IGZvciBjb21wYXRpYmlsaXR5IHdpdGggVG9tY2F0IDQuMS54LCB3aGVyZSB0aGUKKyAgICAgIGVuY29kaW5nIHNwZWNpZmllZCBpbiB0aGUgY29udGVudFR5cGUsIG9yIGV4cGxpY2l0ZWx5IHNldCB1c2luZworICAgICAgUmVxdWVzdC5zZXRDaGFyYWN0ZXJFbmNvZGluZyBtZXRob2Qgd2FzIGFsc28gdXNlZCBmb3IgdGhlIHBhcmFtZXRlcnMgZnJvbQorICAgICAgdGhlIFVSTC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAgPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VJUFZIb3N0cyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlNldCB0aGlzIGF0dHJpYnV0ZSB0byA8Y29kZT50cnVlPC9jb2RlPiB0byBjYXVzZSBUb21jYXQgdG8gdXNlCisgICAgICB0aGUgU2VydmVyTmFtZSBwYXNzZWQgYnkgdGhlIG5hdGl2ZSB3ZWIgc2VydmVyIHRvIGRldGVybWluZSB0aGUgSG9zdAorICAgICAgdG8gc2VuZCB0aGUgcmVxdWVzdCB0by4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPi48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9Inhwb3dlcmVkQnkiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5TZXQgdGhpcyBhdHRyaWJ1dGUgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gY2F1c2UgVG9tY2F0IHRvIGFkdmVydGlzZQorICAgICAgc3VwcG9ydCBmb3IgdGhlIFNyZXZsZXQgc3BlY2lmaWNhdGlvbiB1c2luZyB0aGUgaGVhZGVyIHJlY29tbWVuZGVkIGluIHRoZQorICAgICAgc3BlY2lmaWNhdGlvbi4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPi48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBJbXBsZW1lbnRhdGlvbiI+CisKKyAgPHA+VG8gdXNlIEFKUCwgeW91CisgIG11c3Qgc3BlY2lmeSB0aGUgcHJvdG9jb2wgYXR0cmlidXRlIChzZWUgYWJvdmUpLjwvcD4KKworICA8cD48c3Ryb25nPlRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhlIEFKUCAxLjMgcHJvdG9jb2wuPC9zdHJvbmc+PC9wPgorCisgIDxwPkl0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIChpbiBhZGRpdGlvbiB0byB0aGUKKyAgY29tbW9uIGF0dHJpYnV0ZXMgbGlzdGVkIGFib3ZlKTo8L3A+CisKKyAgPGF0dHJpYnV0ZXM+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImFkZHJlc3MiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5Gb3Igc2VydmVycyB3aXRoIG1vcmUgdGhhbiBvbmUgSVAgYWRkcmVzcywgdGhpcyBhdHRyaWJ1dGUKKyAgICAgIHNwZWNpZmllcyB3aGljaCBhZGRyZXNzIHdpbGwgYmUgdXNlZCBmb3IgbGlzdGVuaW5nIG9uIHRoZSBzcGVjaWZpZWQKKyAgICAgIHBvcnQuICBCeSBkZWZhdWx0LCB0aGlzIHBvcnQgd2lsbCBiZSB1c2VkIG9uIGFsbCBJUCBhZGRyZXNzZXMKKyAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmVyLiBBIHZhbHVlIG9mIDxjb2RlPjEyNy4wLjAuMTwvY29kZT4KKyAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBDb25uZWN0b3Igd2lsbCBvbmx5IGxpc3RlbiBvbiB0aGUgbG9vcGJhY2sKKyAgICAgIGludGVyZmFjZS48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImJhY2tsb2ciIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgbWF4aW11bSBxdWV1ZSBsZW5ndGggZm9yIGluY29taW5nIGNvbm5lY3Rpb24gcmVxdWVzdHMgd2hlbgorICAgICAgYWxsIHBvc3NpYmxlIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWRzIGFyZSBpbiB1c2UuICBBbnkgcmVxdWVzdHMKKyAgICAgIHJlY2VpdmVkIHdoZW4gdGhlIHF1ZXVlIGlzIGZ1bGwgd2lsbCBiZSByZWZ1c2VkLiAgVGhlIGRlZmF1bHQKKyAgICAgIHZhbHVlIGlzIDEwMC48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImJ1ZmZlclNpemUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlciB0byB1c2UuICBJZiBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybywKKyAgICAgICAgIHRoZW4gb3V0cHV0IGJ1ZmZlcmluZyBpcyBkaXNhYmxlZC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIC0xCisgICAgICAgICAoaS5lLiBidWZmZXJpbmcgZGlzYWJsZWQpPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb25uZWN0aW9uVGltZW91dCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoaXMgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gd2lsbCB3YWl0LAorICAgICAgYWZ0ZXIgYWNjZXB0aW5nIGEgY29ubmVjdGlvbiwgZm9yIHRoZSByZXF1ZXN0IFVSSSBsaW5lIHRvIGJlCisgICAgICBwcmVzZW50ZWQuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBpbmZpbml0ZSAoaS5lLiBubyB0aW1lb3V0KS48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9Im1pblByb2Nlc3NvcnMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8c3Ryb25nPmRlcHJlY2F0ZWQ8L3N0cm9uZz4KKyAgICAgIDxwPlRoZSBtaW5pbXVtIG51bWJlciBvZiBwcm9jZXNzb3JzIHRvIHN0YXJ0IGF0IGluaXRpYWxpemF0aW9uIHRpbWUuCisgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzIGF0dHRyaWJ1dGUgaXMgc2V0IHRvIDUuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhQcm9jZXNzb3JzIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHN0cm9uZz5kZXByZWNhdGVkPC9zdHJvbmc+CisgICAgICA8cD5UaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvY2Vzc29ycyBhbGxvd2VkLiBUaGlzIHNob3VsZCBiZQorICAgICAgc2V0IHRvIGEgdmFsdWUgdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG1heGltdW0gbnVtYmVyCisgICAgICBvZiBjb25jdXJyZW50IGNvbm5lY3Rpb25zIHRoZSByZW1vdGUgd2ViIHNlcnZlciBjYW4gb3BlbiB0byBUb21jYXQgCisgICAgICBzaW11bHRhbmVvdXNseS4gRm9yIGV4YW1wbGUsIGlmIHRoZSB3ZWIgc2VydmVyIGlzIEFwYWNoZSAxLnggb3IgMi54CisgICAgICBUb21jYXQncyA8Y29kZT5tYXhQcm9jZXNzb3JzPC9jb2RlPiBzaG91bGQgYmUgc2V0IHRvIHRoZSAKKyAgICAgIHZhbHVlIG9mIEFwYWNoZSdzIDxjb2RlPm1heENsaWVudHM8L2NvZGU+IGRpcmVjdGl2ZS48L3A+CisgICAgICA8cD5BIDxjb2RlPm1heFByb2Nlc3NvcnM8L2NvZGU+IHZhbHVlIG9mIHplcm8gKDApIHNpZ25pZmllcyB0aGF0IAorICAgICAgdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIGlzIHVubGltaXRlZC4gSWYgbm90IHNwZWNpZmllZCwgdGhpcworICAgICAgYXR0dHJpYnV0ZSBkZWZhdWx0cyB0byAyMC48L3A+CisgICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhTcGFyZVRocmVhZHMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgbWF4aW11bSBudW1iZXIgb2YgdW51c2VkIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWRzIHRoYXQKKyAgICAgIHdpbGwgYmUgYWxsb3dlZCB0byBleGlzdCB1bnRpbCB0aGUgdGhyZWFkIHBvb2wgc3RhcnRzIHN0b3BwaW5nIHRoZQorICAgICAgdW5uZWNlc3NhcnkgdGhyZWFkcy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUwLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4VGhyZWFkcyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0IHByb2Nlc3NpbmcgdGhyZWFkcyB0byBiZSBjcmVhdGVkCisgICAgICBieSB0aGlzIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+LCB3aGljaCB0aGVyZWZvcmUgZGV0ZXJtaW5lcyB0aGUKKyAgICAgIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyByZXF1ZXN0cyB0aGF0IGNhbiBiZSBoYW5kbGVkLiAgSWYKKyAgICAgIG5vdCBzcGVjaWZpZWQsIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byAyMDAuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtaW5TcGFyZVRocmVhZHMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgbnVtYmVyIG9mIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWRzIHRoYXQgd2lsbCBiZSBjcmVhdGVkCisgICAgICB3aGVuIHRoaXMgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gaXMgZmlyc3Qgc3RhcnRlZC4gIFRoZSBjb25uZWN0b3IKKyAgICAgIHdpbGwgYWxzbyBtYWtlIHN1cmUgaXQgaGFzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGlkbGUgcHJvY2Vzc2luZworICAgICAgdGhyZWFkcyBhdmFpbGFibGUuIFRoaXMgYXR0cmlidXRlIHNob3VsZCBiZSBzZXQgdG8gYSB2YWx1ZSBzbWFsbGVyCisgICAgICB0aGFuIHRoYXQgc2V0IGZvciA8Y29kZT5tYXhUaHJlYWRzPC9jb2RlPi4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3J0IiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICA8cD5UaGUgVENQIHBvcnQgbnVtYmVyIG9uIHdoaWNoIHRoaXMgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4KKyAgICAgIHdpbGwgY3JlYXRlIGEgc2VydmVyIHNvY2tldCBhbmQgYXdhaXQgaW5jb21pbmcgY29ubmVjdGlvbnMuICBZb3VyCisgICAgICBvcGVyYXRpbmcgc3lzdGVtIHdpbGwgYWxsb3cgb25seSBvbmUgc2VydmVyIGFwcGxpY2F0aW9uIHRvIGxpc3RlbgorICAgICAgdG8gYSBwYXJ0aWN1bGFyIHBvcnQgbnVtYmVyIG9uIGEgcGFydGljdWxhciBJUCBhZGRyZXNzLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0idGNwTm9EZWxheSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPklmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIFRDUF9OT19ERUxBWSBvcHRpb24gd2lsbCBiZQorICAgICAgc2V0IG9uIHRoZSBzZXJ2ZXIgc29ja2V0LCB3aGljaCBpbXByb3ZlcyBwZXJmb3JtYW5jZSB1bmRlciBtb3N0CisgICAgICBjaXJjdW1zdGFuY2VzLiAgVGhpcyBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gYnkgZGVmYXVsdC48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InRvbWNhdEF1dGhlbnRpY2F0aW9uIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+SWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgYXV0aGV0aWNhdGlvbiB3aWxsIGJlIGRvbmUgaW4gVG9tY2F0LiAKKyAgICAgIE90aGVyd2lzZSwgdGhlIGF1dGhlbnRpY2F0ZWQgcHJpbmNpcGFsIHdpbGwgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBuYXRpdmUKKyAgICAgIHdlYmFzZXJ2ZXIgYW5kIHVzZWQgZm9yIGF1dGhvcml6YXRpb24gaW4gVG9tY2F0LiAgCisgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT50cnVlPC9jb2RlPi48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ik5lc3RlZCBDb21wb25lbnRzIj4KKworICA8cD5Ob25lIGF0IHRoaXMgdGltZS48L3A+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9jb250ZXh0LnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL2NvbnRleHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNTliODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9jb250ZXh0LnhtbApAQCAtMCwwICsxLDc5NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImNvbnRleHQuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgUi4gTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgIDx0aXRsZT5UaGUgQ29udGV4dCBDb250YWluZXI8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKyAgPHA+VGhlIDxzdHJvbmc+Q29udGV4dDwvc3Ryb25nPiBlbGVtZW50IHJlcHJlc2VudHMgYSA8ZW0+d2ViCisgIGFwcGxpY2F0aW9uPC9lbT4sIHdoaWNoIGlzIHJ1biB3aXRoaW4gYSBwYXJ0aWN1bGFyIHZpcnR1YWwgaG9zdC4KKyAgRWFjaCB3ZWIgYXBwbGljYXRpb24gaXMgYmFzZWQgb24gYSA8ZW0+V2ViIEFwcGxpY2F0aW9uIEFyY2hpdmU8L2VtPgorICAoV0FSKSBmaWxlLCBvciBhIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGNvcnJlc3BvbmRpbmcKKyAgdW5wYWNrZWQgY29udGVudHMsIGFzIGRlc2NyaWJlZCBpbiB0aGUgU2VydmxldCBTcGVjaWZpY2F0aW9uICh2ZXJzaW9uCisgIDIuMiBvciBsYXRlcikuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZXMsCisgIHlvdSBjYW4gZG93bmxvYWQgdGhlCisgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldC9kb3dubG9hZC5odG1sIj5TZXJ2bGV0CisgIFNwZWNpZmljYXRpb248L2E+LCBhbmQgcmV2aWV3IHRoZSBUb21jYXQKKyAgPGEgaHJlZj0iLi4vYXBwZGV2L2luZGV4Lmh0bWwiPkFwcGxpY2F0aW9uIERldmVsb3BlcidzIEd1aWRlPC9hPi48L3A+CisKKyAgPHA+VGhlIHdlYiBhcHBsaWNhdGlvbiB1c2VkIHRvIHByb2Nlc3MgZWFjaCBIVFRQIHJlcXVlc3QgaXMgc2VsZWN0ZWQKKyAgYnkgQ2F0YWxpbmEgYmFzZWQgb24gbWF0Y2hpbmcgdGhlIGxvbmdlc3QgcG9zc2libGUgcHJlZml4IG9mIHRoZQorICBSZXF1ZXN0IFVSSSBhZ2FpbnN0IHRoZSA8ZW0+Y29udGV4dCBwYXRoPC9lbT4gb2YgZWFjaCBkZWZpbmVkIENvbnRleHQuCisgIE9uY2Ugc2VsZWN0ZWQsIHRoYXQgQ29udGV4dCB3aWxsIHNlbGVjdCBhbiBhcHByb3ByaWF0ZSBzZXJ2bGV0IHRvCisgIHByb2Nlc3MgdGhlIGluY29taW5nIHJlcXVlc3QsIGFjY29yZGluZyB0byB0aGUgc2VydmxldCBtYXBwaW5ncyBkZWZpbmVkCisgIGluIHRoZSA8ZW0+d2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcjwvZW0+IGZpbGUgKHdoaWNoIE1VU1QKKyAgYmUgbG9jYXRlZCBhdCA8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPiB3aXRoaW4gdGhlIHdlYiBhcHAncworICBkaXJlY3RvcnkgaGllcmFyY2h5KS48L3A+CisKKyAgPHA+WW91IG1heSBkZWZpbmUgYXMgbWFueSA8c3Ryb25nPkNvbnRleHQ8L3N0cm9uZz4gZWxlbWVudHMgYXMgeW91CisgIHdpc2guICBFYWNoIHN1Y2ggQ29udGV4dCBNVVNUIGhhdmUgYSB1bmlxdWUgY29udGV4dCBwYXRoLiBJbgorICBhZGRpdGlvbiwgYSBDb250ZXh0IG11c3QgYmUgcHJlc2VudCB3aXRoIGEgY29udGV4dCBwYXRoIGVxdWFsIHRvCisgIGEgemVyby1sZW5ndGggc3RyaW5nLiAgVGhpcyBDb250ZXh0IGJlY29tZXMgdGhlIDxlbT5kZWZhdWx0PC9lbT4KKyAgd2ViIGFwcGxpY2F0aW9uIGZvciB0aGlzIHZpcnR1YWwgaG9zdCwgYW5kIGlzIHVzZWQgdG8gcHJvY2VzcyBhbGwKKyAgcmVxdWVzdHMgdGhhdCBkbyBub3QgbWF0Y2ggYW55IG90aGVyIENvbnRleHQncyBjb250ZXh0IHBhdGguPC9wPgorCisgIDxwPjxiPkZvciBUb21jYXQgNSwgdW5saWtlIFRvbWNhdCA0LngsIGl0IGlzIE5PVCByZWNvbW1lbmRlZCB0byBwbGFjZQorICAmbHQ7Q29udGV4dCZndDsgZWxlbWVudHMgZGlyZWN0bHkgaW4gdGhlIHNlcnZlci54bWwgZmlsZS48L2I+IFRoaXMKKyAgaXMgYmVjYXVzZSBpdCBtYWtlcyBtb2RpZmluZyB0aGUgPHN0cm9uZz5Db250ZXh0PC9zdHJvbmc+IGNvbmZpZ3VyYXRpb24KKyAgbW9yZSBpbnZhc2l2ZSBzaW5jZSB0aGUgbWFpbiA8Y29kZT5jb25mL3NlcnZlci54bWw8L2NvZGU+IGZpbGUgY2Fubm90IGJlCisgIHJlbG9hZGVkIHdpdGhvdXQgcmVzdGFydGluZyBUb21jYXQuPC9wPgorCisgIDxwPjxzdHJvbmc+Q29udGV4dDwvc3Ryb25nPiBlbGVtZW50cyBtYXkgYmUgZXhwbGljaXRseSBkZWZpbmVkOgorICA8dWw+CisgIDxsaT5pbiB0aGUgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9jb250ZXh0LnhtbDwvY29kZT4gZmlsZTogCisgIHRoZSBDb250ZXh0IGVsZW1lbnQgaW5mb3JtYXRpb24gd2lsbCBiZSBsb2FkZWQgYnkgYWxsIHdlYmFwcHM8L2xpPgorICA8bGk+aW4gdGhlIAorICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL1tlbmdpbmVuYW1lXS9baG9zdG5hbWVdL2NvbnRleHQueG1sLmRlZmF1bHQ8L2NvZGU+CisgIGZpbGU6IHRoZSBDb250ZXh0IGVsZW1lbnQgaW5mb3JtYXRpb24gd2lsbCBiZSBsb2FkZWQgYnkgYWxsIHdlYmFwcHMgb2YgdGhhdAorICBob3N0PC9saT4KKyAgPGxpPmluIGluZGl2aWR1YWwgZmlsZXMgKHdpdGggYSAiLnhtbCIgZXh0ZW5zaW9uKSBpbiB0aGUgCisgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvW2VuZ2luZW5hbWVdL1tob3N0bmFtZV0vPC9jb2RlPiBkaXJlY3RvcnkuCisgIFRoZSBuYW1lIG9mIHRoZSBmaWxlIChsZXNzIHRoZSAueG1sKSBleHRlbnNpb24gd2lsbCBiZSB1c2VkIGFzIHRoZQorICBjb250ZXh0IHBhdGguIE11bHRpLWxldmVsIGNvbnRleHQgcGF0aHMgbWF5IGJlIGRlZmluZWQgdXNpbmcgIywgZS5nLgorICA8Y29kZT5jb250ZXh0I3BhdGgueG1sPC9jb2RlPi4gVGhlIGRlZmF1bHQgd2ViIGFwcGxpY2F0aW9uIG1heSBiZSBkZWZpbmVkCisgIGJ5IHVzaW5nIGEgZmlsZSBjYWxsZWQgPGNvZGU+Uk9PVC54bWw8L2NvZGU+LjwvbGk+CisgIDxsaT5pZiB0aGUgcHJldmlvdXMgZmlsZSB3YXMgbm90IGZvdW5kIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBpbiBhbiBpbmRpdmlkdWFsCisgIGZpbGUgYXQgPGNvZGU+L01FVEEtSU5GL2NvbnRleHQueG1sPC9jb2RlPiBpbnNpZGUgdGhlIGFwcGxpY2F0aW9uIGZpbGVzPC9saT4KKyAgPGxpPmluc2lkZSBhIDxhIGhyZWY9Imhvc3QuaHRtbCI+SG9zdDwvYT4gZWxlbWVudCBpbiB0aGUgbWFpbgorICA8Y29kZT5jb25mL3NlcnZlci54bWw8L2NvZGU+PC9saT4KKyAgPC91bD4KKyAgPC9wPgorCisgIDxwPkluIGFkZGl0aW9uIHRvIGV4cGxpY2l0bHkgc3BlY2lmaWVkIENvbnRleHQgZWxlbWVudHMsIHRoZXJlIGFyZQorICBzZXZlcmFsIHRlY2huaXF1ZXMgYnkgd2hpY2ggQ29udGV4dCBlbGVtZW50cyBjYW4gYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5CisgIGZvciB5b3UuICBTZWUgPGEgaHJlZj0iaG9zdC5odG1sI0F1dG9tYXRpYyBBcHBsaWNhdGlvbiBEZXBsb3ltZW50Ij4KKyAgQXV0b21hdGljIEFwcGxpY2F0aW9uIERlcGxveW1lbnQ8L2E+IGFuZAorICA8YSBocmVmPSJob3N0Lmh0bWwjVXNlciBXZWIgQXBwbGljYXRpb25zIj5Vc2VyIFdlYiBBcHBsaWNhdGlvbnM8L2E+CisgIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KKworICAgIDxibG9ja3F1b3RlPjxlbT4KKyAgICA8cD5UaGUgZGVzY3JpcHRpb24gYmVsb3cgdXNlcyB0aGUgdmFyaWFibGUgbmFtZSAkQ0FUQUxJTkFfSE9NRQorICAgIHRvIHJlZmVyIHRvIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB5b3UgaGF2ZSBpbnN0YWxsZWQgVG9tY2F0IDUsCisgICAgYW5kIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSBhZ2FpbnN0IHdoaWNoIG1vc3QgcmVsYXRpdmUgcGF0aHMgYXJlCisgICAgcmVzb2x2ZWQuICBIb3dldmVyLCBpZiB5b3UgaGF2ZSBjb25maWd1cmVkIFRvbWNhdCA1IGZvciBtdWx0aXBsZQorICAgIGluc3RhbmNlcyBieSBzZXR0aW5nIGEgQ0FUQUxJTkFfQkFTRSBkaXJlY3RvcnksIHlvdSBzaG91bGQgdXNlCisgICAgJENBVEFMSU5BX0JBU0UgaW5zdGVhZCBvZiAkQ0FUQUxJTkFfSE9NRSBmb3IgZWFjaCBvZiB0aGVzZQorICAgIHJlZmVyZW5jZXMuPC9wPgorICAgIDwvZW0+PC9ibG9ja3F1b3RlPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQXR0cmlidXRlcyI+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ29tbW9uIEF0dHJpYnV0ZXMiPgorCisgICAgPHA+QWxsIGltcGxlbWVudGF0aW9ucyBvZiA8c3Ryb25nPkNvbnRleHQ8L3N0cm9uZz4KKyAgICBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiYWNrZ3JvdW5kUHJvY2Vzc29yRGVsYXkiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGUgZGVsYXkgaW4gc2Vjb25kcyBiZXR3ZWVuIHRoZSAKKyAgICAgICAgaW52b2NhdGlvbiBvZiB0aGUgYmFja2dyb3VuZFByb2Nlc3MgbWV0aG9kIG9uIHRoaXMgY29udGV4dCBhbmQgCisgICAgICAgIGl0cyBjaGlsZCBjb250YWluZXJzLCBpbmNsdWRpbmcgYWxsIHdyYXBwZXJzLiAKKyAgICAgICAgQ2hpbGQgY29udGFpbmVycyB3aWxsIG5vdCBiZSBpbnZva2VkIGlmIHRoZWlyIGRlbGF5IHZhbHVlIGlzIG5vdCAKKyAgICAgICAgbmVnYXRpdmUgKHdoaWNoIHdvdWxkIG1lYW4gdGhleSBhcmUgdXNpbmcgdGhlaXIgb3duIHByb2Nlc3NpbmcgCisgICAgICAgIHRocmVhZCkuIFNldHRpbmcgdGhpcyB0byBhIHBvc2l0aXZlIHZhbHVlIHdpbGwgY2F1c2UgCisgICAgICAgIGEgdGhyZWFkIHRvIGJlIHNwYXduLiBBZnRlciB3YWl0aW5nIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUsIAorICAgICAgICB0aGUgdGhyZWFkIHdpbGwgaW52b2tlIHRoZSBiYWNrZ3JvdW5kUHJvY2VzcyBtZXRob2Qgb24gdGhpcyBob3N0IAorICAgICAgICBhbmQgYWxsIGl0cyBjaGlsZCBjb250YWluZXJzLiBBIGNvbnRleHQgd2lsbCB1c2UgYmFja2dyb3VuZCAKKyAgICAgICAgcHJvY2Vzc2luZyB0byBwZXJmb3JtIHNlc3Npb24gZXhwaXJhdGlvbiBhbmQgY2xhc3MgbW9uaXRvcmluZyBmb3IKKyAgICAgICAgcmVsb2FkaW5nLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUgaXMgCisgICAgICAgIC0xLCB3aGljaCBtZWFucyB0aGUgY29udGV4dCB3aWxsIHJlbHkgb24gdGhlIGJhY2tncm91bmQgcHJvY2Vzc2luZyAKKyAgICAgICAgdGhyZWFkIG9mIGl0cyBwYXJlbnQgaG9zdC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkphdmEgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdG8gdXNlLiAgVGhpcyBjbGFzcyBtdXN0CisgICAgICAgIGltcGxlbWVudCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0PC9jb2RlPiBpbnRlcmZhY2UuCisgICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBzdGFuZGFyZCB2YWx1ZSAoZGVmaW5lZCBiZWxvdykgd2lsbCBiZSB1c2VkLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvb2tpZXMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3Ugd2FudCBjb29raWVzIHRvIGJlIHVzZWQgZm9yCisgICAgICAgIHNlc3Npb24gaWRlbnRpZmllciBjb21tdW5pY2F0aW9uIGlmIHN1cHBvcnRlZCBieSB0aGUgY2xpZW50ICh0aGlzCisgICAgICAgIGlzIHRoZSBkZWZhdWx0KS4gIFNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4gaWYgeW91IHdhbnQgdG8gZGlzYWJsZQorICAgICAgICB0aGUgdXNlIG9mIGNvb2tpZXMgZm9yIHNlc3Npb24gaWRlbnRpZmllciBjb21tdW5pY2F0aW9uLCBhbmQgcmVseQorICAgICAgICBvbmx5IG9uIFVSTCByZXdyaXRpbmcgYnkgdGhlIGFwcGxpY2F0aW9uLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNyb3NzQ29udGV4dCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+U2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IGNhbGxzIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uCisgICAgICAgIHRvIDxjb2RlPlNlcnZsZXRDb250ZXh0LmdldENvbnRleHQoKTwvY29kZT4gdG8gc3VjY2Vzc2Z1bGx5IHJldHVybiBhCisgICAgICAgIHJlcXVlc3QgZGlzcGF0Y2hlciBmb3Igb3RoZXIgd2ViIGFwcGxpY2F0aW9ucyBydW5uaW5nIG9uIHRoaXMgdmlydHVhbAorICAgICAgICBob3N0LiAgU2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiAodGhlIGRlZmF1bHQpIGluIHNlY3VyaXR5CisgICAgICAgIGNvbnNjaW91cyBlbnZpcm9ubWVudHMsIHRvIG1ha2UgPGNvZGU+Z2V0Q29udGV4dCgpPC9jb2RlPiBhbHdheXMKKyAgICAgICAgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRvY0Jhc2UiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIDxlbT5Eb2N1bWVudCBCYXNlPC9lbT4gKGFsc28ga25vd24gYXMgdGhlIDxlbT5Db250ZXh0CisgICAgICAgIFJvb3Q8L2VtPikgZGlyZWN0b3J5IGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwgb3IgdGhlIHBhdGhuYW1lCisgICAgICAgIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSBmaWxlIChpZiB0aGlzIHdlYiBhcHBsaWNhdGlvbiBpcworICAgICAgICBiZWluZyBleGVjdXRlZCBkaXJlY3RseSBmcm9tIHRoZSBXQVIgZmlsZSkuICAgIFlvdSBtYXkgc3BlY2lmeQorICAgICAgICBhbiBhYnNvbHV0ZSBwYXRobmFtZSBmb3IgdGhpcyBkaXJlY3Rvcnkgb3IgV0FSIGZpbGUsIG9yIGEgcGF0aG5hbWUKKyAgICAgICAgdGhhdCBpcyByZWxhdGl2ZSB0byB0aGUgPGNvZGU+YXBwQmFzZTwvY29kZT4gZGlyZWN0b3J5IG9mIHRoZQorICAgICAgICBvd25pbmcgPGEgaHJlZj0iaG9zdC5odG1sIj5Ib3N0PC9hPi48L3A+CisgICAgICAgIDxwPklmIGEgc3ltYm9saWMgbGluayBpcyB1c2VkIGZvciBkb2NCYXNlIHRoZW4gY2hhbmdlcyB0byB0aGUKKyAgICAgICAgc3ltYm9saWMgbGluayB3aWxsIG9ubHkgYmUgZWZmZWN0aXZlIGFmdGVyIGEgVG9tY2F0IHJlc3RhcnQgb3IKKyAgICAgICAgYnkgdW5kZXBsb3lpbmcgYW5kIHJlZGVwbG95aW5nIHRoZSBjb25leHQuIEEgY29udGV4dCByZWxvYWQgaXMgbm90CisgICAgICAgIHN1ZmZpY2llbnQuPC9wPgorICAgICAgICA8cD5EbyBub3QgY2hvb3NlIGEgZG9jQmFzZSB0aGF0IHN0YXJ0cyB3aXRoIHlvdXIgSG9zdCdzIGFwcEJhc2Ugc3RyaW5nLgorICAgICAgICBUaGUgZGVmYXVsdCBhcHBCYXNlIGlzICJ3ZWJhcHBzIiBzbyBkbyBub3QgY2hvb3NlIGEgZG9jQmFzZSBsaWtlCisgICAgICAgICJ3ZWJhcHBzLWZvby4iICBEb2luZyBzbyB3aWxsIGxlYWQgdG8gZGVwbG95bWVudCBlcnJvcnM6IHNlZSAKKyAgICAgICAgPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zOTAxMyIgdGl0bGU9IkJ1Z3ppbGxhIDM5MDEzIj5CdWd6aWxsYTwvYT4KKyAgICAgICAgZm9yIGRldGFpbHMuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3ZlcnJpZGUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNldCB0byA8Y29kZT50cnVlPC9jb2RlPiB0byBoYXZlIGV4cGxpY2l0IHNldHRpbmdzIGluIHRoaXMKKyAgICAgICAgQ29udGV4dCBlbGVtZW50IG92ZXJyaWRlIGFueSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGluIHRoZQorICAgICAgICBkZWZhdWx0IHNldHRpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3duaW5nCisgICAgICAgIDxhIGhyZWY9Imhvc3QuaHRtbCI+SG9zdDwvYT4uICBUaGUgZGVmYXVsdCBpcyA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICAgIDwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InByaXZpbGVnZWQiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNldCB0byA8Y29kZT50cnVlPC9jb2RlPiB0byBhbGxvdyB0aGlzIGNvbnRleHQgdG8gdXNlIGNvbnRhaW5lcgorICAgICAgICBzZXJ2bGV0cywgbGlrZSB0aGUgbWFuYWdlciBzZXJ2bGV0LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdGgiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSA8ZW0+Y29udGV4dCBwYXRoPC9lbT4gb2YgdGhpcyB3ZWIgYXBwbGljYXRpb24sIHdoaWNoIGlzCisgICAgICAgIG1hdGNoZWQgYWdhaW5zdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcmVxdWVzdCBVUkkgdG8gc2VsZWN0IHRoZQorICAgICAgICBhcHByb3ByaWF0ZSB3ZWIgYXBwbGljYXRpb24gZm9yIHByb2Nlc3NpbmcuICBBbGwgb2YgdGhlIGNvbnRleHQgcGF0aHMKKyAgICAgICAgd2l0aGluIGEgcGFydGljdWxhciA8YSBocmVmPSJob3N0Lmh0bWwiPkhvc3Q8L2E+IG11c3QgYmUgdW5pcXVlLgorICAgICAgICBJZiB5b3Ugc3BlY2lmeSBhIGNvbnRleHQgcGF0aCBvZiBhbiBlbXB0eSBzdHJpbmcgKCIiKSwgeW91IGFyZQorICAgICAgICBkZWZpbmluZyB0aGUgPGVtPmRlZmF1bHQ8L2VtPiB3ZWIgYXBwbGljYXRpb24gZm9yIHRoaXMgSG9zdCwgd2hpY2gKKyAgICAgICAgd2lsbCBwcm9jZXNzIGFsbCByZXF1ZXN0cyBub3QgYXNzaWduZWQgdG8gb3RoZXIgQ29udGV4dHMuIFRoZSB2YWx1ZSBvZgorICAgICAgICB0aGlzIGZpZWxkIG11c3Qgbm90IGJlIHNldCBleGNlcHQgd2hlbiBzdGF0aWNhbGx5IGRlZmluaW5nIGEgQ29udGV4dCBpbgorICAgICAgICBzZXJ2ZXIueG1sLCBhcyBpdCB3aWxsIGJlIGluZmVycmVkIGZyb20gdGhlIGZpbGVuYW1lcyB1c2VkIGZvciBlaXRoZXIgdGhlIAorICAgICAgICAueG1sIGNvbnRleHQgZmlsZSBvciB0aGUgZG9jQmFzZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWxvYWRhYmxlIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5TZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdhbnQgQ2F0YWxpbmEgdG8gbW9uaXRvciBjbGFzc2VzIGluCisgICAgICAgIDxjb2RlPi9XRUItSU5GL2NsYXNzZXMvPC9jb2RlPiBhbmQgPGNvZGU+L1dFQi1JTkYvbGliPC9jb2RlPiBmb3IKKyAgICAgICAgY2hhbmdlcywgYW5kIGF1dG9tYXRpY2FsbHkgcmVsb2FkIHRoZSB3ZWIgYXBwbGljYXRpb24gaWYgYSBjaGFuZ2UKKyAgICAgICAgaXMgZGV0ZWN0ZWQuICBUaGlzIGZlYXR1cmUgaXMgdmVyeSB1c2VmdWwgZHVyaW5nIGFwcGxpY2F0aW9uCisgICAgICAgIGRldmVsb3BtZW50LCBidXQgaXQgcmVxdWlyZXMgc2lnbmlmaWNhbnQgcnVudGltZSBvdmVyaGVhZCBhbmQgaXMKKyAgICAgICAgbm90IHJlY29tbWVuZGVkIGZvciB1c2Ugb24gZGVwbG95ZWQgcHJvZHVjdGlvbiBhcHBsaWNhdGlvbnMuICBUaGF0J3MKKyAgICAgICAgd2h5IHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHRoaXMgYXR0cmlidXRlIGlzIDxpPmZhbHNlPC9pPi4gIFlvdQorICAgICAgICBjYW4gdXNlIHRoZSA8YSBocmVmPSIuLi9tYW5hZ2VyLWhvd3RvLmh0bWwiPk1hbmFnZXI8L2E+IHdlYgorICAgICAgICBhcHBsaWNhdGlvbiwgaG93ZXZlciwgdG8gdHJpZ2dlciByZWxvYWRzIG9mIGRlcGxveWVkIGFwcGxpY2F0aW9ucworICAgICAgICBvbiBkZW1hbmQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id3JhcHBlckNsYXNzIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5KYXZhIGNsYXNzIG5hbWUgb2YgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuV3JhcHBlcjwvY29kZT4KKyAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHNlcnZsZXRzIG1hbmFnZWQgYnkgdGhpcworICAgICAgICBDb250ZXh0LiAgSWYgbm90IHNwZWNpZmllZCwgYSBzdGFuZGFyZCBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgdXNlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBJbXBsZW1lbnRhdGlvbiI+CisKKyAgICA8cD5UaGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5Db250ZXh0PC9zdHJvbmc+IGlzCisgICAgPHN0cm9uZz5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0PC9zdHJvbmc+LgorICAgIEl0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIChpbiBhZGRpdGlvbiB0byB0aGUKKyAgICBjb21tb24gYXR0cmlidXRlcyBsaXN0ZWQgYWJvdmUpOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImFsbG93TGlua2luZyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SWYgdGhlIHZhbHVlIG9mIHRoaXMgZmxhZyBpcyA8Y29kZT50cnVlPC9jb2RlPiwgc3ltbGlua3Mgd2lsbCBiZQorICAgICAgICBhbGxvd2VkIGluc2lkZSB0aGUgd2ViIGFwcGxpY2F0aW9uLCBwb2ludGluZyB0byByZXNvdXJjZXMgb3V0c2lkZSB0aGUKKyAgICAgICAgd2ViIGFwcGxpY2F0aW9uIGJhc2UgcGF0aC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgb2YgdGhlIGZsYWcgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LjwvcD4KKyAgICAgICAgPHA+PGI+Tk9URTogVGhpcyBmbGFnIE1VU1QgTk9UIGJlIHNldCB0byB0cnVlIG9uIHRoZSBXaW5kb3dzIHBsYXRmb3JtCisgICAgICAgIChvciBhbnkgb3RoZXIgT1Mgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIGNhc2Ugc2Vuc2l0aXZlIGZpbGVzeXN0ZW0pLAorICAgICAgICBhcyBpdCB3aWxsIGRpc2FibGUgY2FzZSBzZW5zaXRpdml0eSBjaGVja3MsIGFsbG93aW5nIEpTUCBzb3VyY2UgY29kZQorICAgICAgICBkaXNjbG9zdXJlLCBhbW9uZyBvdGhlciBzZWN1cml0eSBwcm9ibGVtcy48L2I+PC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYW50aUpBUkxvY2tpbmciIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPklmIHRydWUsIHRoZSBUb21jYXQgY2xhc3Nsb2FkZXIgd2lsbCB0YWtlIGV4dHJhIG1lYXN1cmVzIHRvIGF2b2lkCisgICAgICAgIEpBUiBmaWxlIGxvY2tpbmcgd2hlbiByZXNvdXJjZXMgYXJlIGFjY2Vzc2VkIGluc2lkZSBKQVJzIHRocm91Z2ggVVJMcy4KKyAgICAgICAgVGhpcyB3aWxsIGltcGFjdCBzdGFydHVwIHRpbWUgb2YgYXBwbGljYXRpb25zLCBidXQgY291bGQgcHJvdmUgdG8gYmUgdXNlZnVsCisgICAgICAgIG9uIHBsYXRmb3JtcyBvciBjb25maWd1cmF0aW9ucyB3aGVyZSBmaWxlIGxvY2tpbmcgY2FuIG9jY3VyLgorICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYW50aVJlc291cmNlTG9ja2luZyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SWYgdHJ1ZSwgVG9tY2F0IHdpbGwgcHJldmVudCBhbnkgZmlsZSBsb2NraW5nLgorICAgICAgICBUaGlzIHdpbGwgc2lnbmlmaWNhbnRseSBpbXBhY3Qgc3RhcnR1cCB0aW1lIG9mIGFwcGxpY2F0aW9ucywgCisgICAgICAgIGJ1dCBhbGxvd3MgZnVsbCB3ZWJhcHAgaG90IGRlcGxveSBhbmQgdW5kZXBsb3kgb24gcGxhdGZvcm1zIAorICAgICAgICBvciBjb25maWd1cmF0aW9ucyB3aGVyZSBmaWxlIGxvY2tpbmcgY2FuIG9jY3VyLgorICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4uPC9wPgorICAgCisgICAgICAgIDxwPlBsZWFzZSBub3RlIHRoYXQgc2V0dGluZyB0aGlzIHRvIDxjb2RlPnRydWU8L2NvZGU+IGhhcyBzb21lIHNpZGUgZWZmZWN0cywKKyAgICAgICAgaW5jbHVkaW5nIHRoZSBkaXNhYmxpbmcgb2YgSlNQIHJlbG9hZGluZyBpbiBhIHJ1bm5pbmcgc2VydmVyOiBzZWUKKyAgICAgICAgPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNzY2OCI+QnVnemlsbGEgMzc2Njg8L2E+LgorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICBQbGVhc2Ugbm90ZSB0aGF0IHNldHRpbmcgdGhpcyBmbGFnIHRvIHRydWUgaW4gYXBwbGljYXRpb25zIHRoYXQgYXJlCisgICAgICAgIG91dHNpZGUgdGhlIGFwcEJhc2UgZm9yIHRoZSBIb3N0ICh0aGUgPGNvZGU+d2ViYXBwczwvY29kZT4gZGlyZWN0b3J5CisgICAgICAgIGJ5IGRlZmF1bHQpIHdpbGwgY2F1c2UgdGhlIGFwcGxpY2F0aW9uIHRvIGJlCisgICAgICAgIDxzdHJvbmc+ZGVsZXRlZDwvc3Ryb25nPiBvbiBUb21jYXQgc2h1dGRvd24uICBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0bworICAgICAgICBkbyB0aGlzLCBzbyB0aGluayB0d2ljZSBiZWZvcmUgc2V0dGluZyBhbnRpUmVzb3VyY2VMb2NraW5nPXRydWUgb24gYSB3ZWJhcHAKKyAgICAgICAgdGhhdCdzIG91dHNpZGUgdGhlIGFwcEJhc2UgZm9yIGl0cyBIb3N0LgorICAgICAgICA8L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYWNoZU1heFNpemUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPk1heGltdW0gc2l6ZSBvZiB0aGUgc3RhdGljIHJlc291cmNlIGNhY2hlIGluIGtpbG9ieXRlcy4gCisgICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPjEwMjQwPC9jb2RlPgorICAgICAgICAoMTAgbWVnYWJ5dGVzKS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYWNoZVRUTCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+QW1vdW50IG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gY2FjaGUgZW50cmllcyByZXZhbGlkYXRpb24uCisgICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPjUwMDA8L2NvZGU+IAorICAgICAgICAoNSBzZWNvbmRzKS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYWNoaW5nQWxsb3dlZCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SWYgdGhlIHZhbHVlIG9mIHRoaXMgZmxhZyBpcyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIGNhY2hlIGZvciBzdGF0aWMKKyAgICAgICAgcmVzb3VyY2VzIHdpbGwgYmUgdXNlZC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgb2YgdGhlIGZsYWcgaXMgPGNvZGU+dHJ1ZTwvY29kZT4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2FzZVNlbnNpdGl2ZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SWYgdGhlIHZhbHVlIG9mIHRoaXMgZmxhZyBpcyA8Y29kZT50cnVlPC9jb2RlPiwgYWxsIGNhc2Ugc2Vuc2l0aXZpdHkKKyAgICAgICAgY2hlY2tzIHdpbGwgYmUgZGlzYWJsZWQuIElmIG5vdCAKKyAgICAgICAgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZmxhZyBpcyA8Y29kZT50cnVlPC9jb2RlPi48L3A+CisgICAgICAgIDxwPjxiPk5PVEU6IFRoaXMgZmxhZyBNVVNUIE5PVCBiZSBzZXQgdG8gZmFsc2Ugb24gdGhlIFdpbmRvd3MgcGxhdGZvcm0KKyAgICAgICAgKG9yIGFueSBvdGhlciBPUyB3aGljaCBkb2VzIG5vdCBoYXZlIGEgY2FzZSBzZW5zaXRpdmUgZmlsZXN5c3RlbSksCisgICAgICAgIGFzIGl0IHdpbGwgZGlzYWJsZSBjYXNlIHNlbnNpdGl2aXR5IGNoZWNrcywgYWxsb3dpbmcgSlNQIHNvdXJjZSBjb2RlCisgICAgICAgIGRpc2Nsb3N1cmUsIGFtb25nIG90aGVyIHNlY3VyaXR5IHByb2JsZW1zLjwvYj48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9jZXNzVGxkcyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+V2hldGhlciB0aGUgY29udGV4dCBzaG91bGQgcHJvY2VzcyBUTERzIG9uIHN0YXJ0dXAuICBUaGUgZGVmYXVsdAorICAgICAgICBpcyB0cnVlLiAgVGhlIGZhbHNlIHNldHRpbmcgaXMgaW50ZW5kZWQgZm9yIHNwZWNpYWwgY2FzZXMKKyAgICAgICAgdGhhdCBrbm93IGluIGFkdmFuY2UgVExEcyBhcmUgbm90IHBhcnQgb2YgdGhlIHdlYmFwcC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzd2FsbG93T3V0cHV0IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5JZiB0aGUgdmFsdWUgb2YgdGhpcyBmbGFnIGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgYnl0ZXMgb3V0cHV0IHRvCisgICAgICAgIFN5c3RlbS5vdXQgYW5kIFN5c3RlbS5lcnIgYnkgdGhlIHdlYiBhcHBsaWNhdGlvbiB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8KKyAgICAgICAgdGhlIHdlYiBhcHBsaWNhdGlvbiBsb2dnZXIuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlCisgICAgICAgIG9mIHRoZSBmbGFnIGlzIDxjb2RlPmZhbHNlPC9jb2RlPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0bGROYW1lc3BhY2VBd2FyZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SWYgdGhlIHZhbHVlIG9mIHRoaXMgZmxhZyBpcyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIFRMRCBmaWxlcworICAgICAgICBYTUwgdmFsaWRhdGlvbiB3aWxsIGJlIG5hbWVzcGFjZS1hd2FyZS4gIElmIHlvdSB0dXJuIHRoaXMgZmxhZyBvbiwKKyAgICAgICAgeW91IHNob3VsZCBwcm9iYWJseSBhbHNvIHR1cm4gPGNvZGU+dGxkVmFsaWRhdGlvbjwvY29kZT4gb24uICBUaGUKKyAgICAgICAgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBmbGFnIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgYW5kIHNldHRpbmcgaXQKKyAgICAgICAgdG8gdHJ1ZSB3aWxsIGluY3VyIGEgcGVyZm9ybWFuY2UgcGVuYWx0eS4KKyAgICAgICAgPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGxkVmFsaWRhdGlvbiIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SWYgdGhlIHZhbHVlIG9mIHRoaXMgZmxhZyBpcyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIFRMRCBmaWxlcworICAgICAgICB3aWxsIGJlIFhNTCB2YWxpZGF0ZWQgb24gY29udGV4dCBzdGFydHVwLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yCisgICAgICAgIHRoaXMgZmxhZyBpcyA8Y29kZT5mYWxzZTwvY29kZT4sIGFuZCBzZXR0aW5nIGl0IHRvIHRydWUgd2lsbCBpbmN1cgorICAgICAgICBhIHBlcmZvcm1hbmNlIHBlbmFsdHkuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idW5sb2FkRGVsYXkiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkFtb3VudCBvZiBtcyB0aGF0IHRoZSBjb250YWluZXIgd2lsbCB3YWl0IGZvciBzZXJ2bGV0cyB0byB1bmxvYWQuCisgICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmbGFnIGlzIDxjb2RlPjIwMDA8L2NvZGU+IAorICAgICAgICBtcy48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1bnBhY2tXQVIiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPklmIHRydWUsIFRvbWNhdCB3aWxsIHVucGFjayBhbGwgY29tcHJlc3NlZCB3ZWIgYXBwbGljYXRpb25zIGJlZm9yZQorICAgICAgICBydW5uaW5nIHRoZW0uCisgICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPnRydWU8L2NvZGU+LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZU5hbWluZyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+U2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+ICh0aGUgZGVmYXVsdCkgdG8gaGF2ZSBDYXRhbGluYSBlbmFibGUgYQorICAgICAgICBKTkRJIDxjb2RlPkluaXRpYWxDb250ZXh0PC9jb2RlPiBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24gdGhhdCBpcworICAgICAgICBjb21wYXRpYmxlIHdpdGggSmF2YTIgRW50ZXJwcmlzZSBFZGl0aW9uIChKMkVFKSBwbGF0Zm9ybQorICAgICAgICBjb252ZW50aW9ucy48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3b3JrRGlyIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5QYXRobmFtZSB0byBhIHNjcmF0Y2ggZGlyZWN0b3J5IHRvIGJlIHByb3ZpZGVkIGJ5IHRoaXMgQ29udGV4dAorICAgICAgICBmb3IgdGVtcG9yYXJ5IHJlYWQtd3JpdGUgdXNlIGJ5IHNlcnZsZXRzIHdpdGhpbiB0aGUgYXNzb2NpYXRlZCB3ZWIKKyAgICAgICAgYXBwbGljYXRpb24uICBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIG1hZGUgdmlzaWJsZSB0byBzZXJ2bGV0cyBpbiB0aGUKKyAgICAgICAgd2ViIGFwcGxpY2F0aW9uIGJ5IGEgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSAob2YgdHlwZQorICAgICAgICA8Y29kZT5qYXZhLmlvLkZpbGU8L2NvZGU+KSBuYW1lZAorICAgICAgICA8Y29kZT5qYXZheC5zZXJ2bGV0LmNvbnRleHQudGVtcGRpcjwvY29kZT4gYXMgZGVzY3JpYmVkIGluIHRoZQorICAgICAgICBTZXJ2bGV0IFNwZWNpZmljYXRpb24uICBJZiBub3Qgc3BlY2lmaWVkLCBhIHN1aXRhYmxlIGRpcmVjdG9yeQorICAgICAgICB1bmRlcm5lYXRoIDxjb2RlPiRDQVRBTElOQV9IT01FL3dvcms8L2NvZGU+IHdpbGwgYmUgcHJvdmlkZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJOZXN0ZWQgQ29tcG9uZW50cyI+CisKKyAgPHA+WW91IGNhbiBuZXN0IGF0IG1vc3Qgb25lIGluc3RhbmNlIG9mIHRoZSBmb2xsb3dpbmcgdXRpbGl0eSBjb21wb25lbnRzCisgIGJ5IG5lc3RpbmcgYSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW5zaWRlIHlvdXIgPHN0cm9uZz5Db250ZXh0PC9zdHJvbmc+CisgIGVsZW1lbnQ6PC9wPgorICA8dWw+CisgIDxsaT48YSBocmVmPSJsb2FkZXIuaHRtbCI+PHN0cm9uZz5Mb2FkZXI8L3N0cm9uZz48L2E+IC0KKyAgICAgIENvbmZpZ3VyZSB0aGUgd2ViIGFwcGxpY2F0aW9uIGNsYXNzIGxvYWRlciB0aGF0IHdpbGwgYmUgdXNlZCB0byBsb2FkCisgICAgICBzZXJ2bGV0IGFuZCBiZWFuIGNsYXNzZXMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiAgTm9ybWFsbHksIHRoZQorICAgICAgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSBjbGFzcyBsb2FkZXIgd2lsbCBiZSBzdWZmaWNpZW50LjwvbGk+CisgIDxsaT48YSBocmVmPSJtYW5hZ2VyLmh0bWwiPjxzdHJvbmc+TWFuYWdlcjwvc3Ryb25nPjwvYT4gLQorICAgICAgQ29uZmlndXJlIHRoZSBzZXNzaW9uIG1hbmFnZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlLCBkZXN0cm95LAorICAgICAgYW5kIHBlcnNpc3QgSFRUUCBzZXNzaW9ucyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uICBOb3JtYWxseSwgdGhlCisgICAgICBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHNlc3Npb24gbWFuYWdlciB3aWxsIGJlIHN1ZmZpY2llbnQuPC9saT4KKyAgPGxpPjxhIGhyZWY9InJlYWxtLmh0bWwiPjxzdHJvbmc+UmVhbG08L3N0cm9uZz48L2E+IC0KKyAgICAgIENvbmZpZ3VyZSBhIHJlYWxtIHRoYXQgd2lsbCBhbGxvdyBpdHMKKyAgICAgIGRhdGFiYXNlIG9mIHVzZXJzLCBhbmQgdGhlaXIgYXNzb2NpYXRlZCByb2xlcywgdG8gYmUgdXRpbGl6ZWQgc29sZWx5CisgICAgICBmb3IgdGhpcyBwYXJ0aWN1bGFyIHdlYiBhcHBsaWNhdGlvbi4gIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMgd2ViCisgICAgICBhcHBsaWNhdGlvbiB3aWxsIHV0aWxpemUgdGhlIFJlYWxtIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3duaW5nCisgICAgICA8YSBocmVmPSJob3N0Lmh0bWwiPkhvc3Q8L2E+IG9yIDxhIGhyZWY9ImVuZ2luZS5odG1sIj5FbmdpbmU8L2E+LjwvbGk+CisgIDxsaT48YSBocmVmPSJyZXNvdXJjZXMuaHRtbCI+PHN0cm9uZz5SZXNvdXJjZXM8L3N0cm9uZz48L2E+IC0KKyAgICAgIENvbmZpZ3VyZSB0aGUgcmVzb3VyY2UgbWFuYWdlciB0aGF0IHdpbGwgYmUgdXNlZCB0byBhY2Nlc3MgdGhlIHN0YXRpYworICAgICAgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gIE5vcm1hbGx5LCB0aGUKKyAgICAgIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlciB3aWxsIGJlIHN1ZmZpY2llbnQuPC9saT4KKyAgPGxpPjxzdHJvbmc+V2F0Y2hlZFJlc291cmNlPC9zdHJvbmc+IC0gVGhlIGF1dG8gZGVwbG95ZXIgd2lsbCBtb25pdG9yIHRoZSAKKyAgICAgIHNwZWNpZmllZCBzdGF0aWMgcmVzb3VyY2Ugb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBmb3IgdXBkYXRlcywgYW5kIHdpbGwKKyAgICAgIHJlbG9hZCB0aGUgd2ViIGFwcGxpY2F0aW9uIGlmIGlzIGlzIHVwZGF0ZWQuIFRoZSBjb250ZW50IG9mIHRoaXMgZWxlbWVudAorICAgICAgbXVzdCBiZSBhIHN0cmluZy48L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iU3BlY2lhbCBGZWF0dXJlcyI+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJMb2dnaW5nIj4KKworICAgIDxwPkEgY29udGV4dCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIAorICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5Db250YWluZXJCYXNlLltlbmdpbmVuYW1lXS5baG9zdG5hbWVdLltwYXRoXTwvY29kZT4KKyAgICAgICBsb2cgY2F0ZWdvcnkuICBOb3RlIHRoYXQgdGhlIGJyYWNrZXRzIGFyZSBhY3R1YWxseSBwYXJ0IG9mIHRoZSBuYW1lLCBkb24ndCBvbWl0IHRoZW0uPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkFjY2VzcyBMb2dzIj4KKworICAgIDxwPldoZW4geW91IHJ1biBhIHdlYiBzZXJ2ZXIsIG9uZSBvZiB0aGUgb3V0cHV0IGZpbGVzIG5vcm1hbGx5IGdlbmVyYXRlZAorICAgIGlzIGFuIDxlbT5hY2Nlc3MgbG9nPC9lbT4sIHdoaWNoIGdlbmVyYXRlcyBvbmUgbGluZSBvZiBpbmZvcm1hdGlvbiBmb3IKKyAgICBlYWNoIHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHRoZSBzZXJ2ZXIsIGluIGEgc3RhbmRhcmQgZm9ybWF0LiAgQ2F0YWxpbmEKKyAgICBpbmNsdWRlcyBhbiBvcHRpb25hbCA8YSBocmVmPSJ2YWx2ZS5odG1sIj5WYWx2ZTwvYT4gaW1wbGVtZW50YXRpb24gdGhhdAorICAgIGNhbiBjcmVhdGUgYWNjZXNzIGxvZ3MgaW4gdGhlIHNhbWUgc3RhbmRhcmQgZm9ybWF0IGNyZWF0ZWQgYnkgd2ViIHNlcnZlcnMsCisgICAgb3IgaW4gYW55IG51bWJlciBvZiBjdXN0b20gZm9ybWF0cy48L3A+CisKKyAgICA8cD5Zb3UgY2FuIGFzayBDYXRhbGluYSB0byBjcmVhdGUgYW4gYWNjZXNzIGxvZyBmb3IgYWxsIHJlcXVlc3RzCisgICAgcHJvY2Vzc2VkIGJ5IGFuIDxhIGhyZWY9ImVuZ2luZS5odG1sIj5FbmdpbmU8L2E+LAorICAgIDxhIGhyZWY9Imhvc3QuaHRtbCI+SG9zdDwvYT4sIG9yIDxhIGhyZWY9ImNvbnRleHQuaHRtbCI+Q29udGV4dDwvYT4KKyAgICBieSBuZXN0aW5nIGEgPGEgaHJlZj0idmFsdmUuaHRtbCI+VmFsdmU8L2E+IGVsZW1lbnQgbGlrZSB0aGlzOjwvcD4KKworPHNvdXJjZT4KKyZsdDtDb250ZXh0IHBhdGg9Ii9leGFtcGxlcyIgLi4uJmd0OworICAuLi4KKyAgJmx0O1ZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuQWNjZXNzTG9nVmFsdmUiCisgICAgICAgICBwcmVmaXg9ImxvY2FsaG9zdF9hY2Nlc3NfbG9nLiIgc3VmZml4PSIudHh0IgorICAgICAgICAgcGF0dGVybj0iY29tbW9uIi8mZ3Q7CisgIC4uLgorJmx0Oy9Db250ZXh0Jmd0OworPC9zb3VyY2U+CisKKyAgICA8cD5TZWUgPGEgaHJlZj0idmFsdmUuaHRtbCNBY2Nlc3MgTG9nIFZhbHZlIj5BY2Nlc3MgTG9nIFZhbHZlPC9hPgorICAgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMgdGhhdCBhcmUKKyAgICBzdXBwb3J0ZWQuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkF1dG9tYXRpYyBDb250ZXh0IENvbmZpZ3VyYXRpb24iPgorCisgICAgPHA+SWYgeW91IHVzZSB0aGUgc3RhbmRhcmQgPHN0cm9uZz5Db250ZXh0PC9zdHJvbmc+IGltcGxlbWVudGF0aW9uLAorICAgIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBzdGVwcyBvY2N1ciBhdXRvbXRpY2FsbHkgd2hlbiBDYXRhbGluYQorICAgIGlzIHN0YXJ0ZWQsIG9yIHdoZW5ldmVyIHRoaXMgd2ViIGFwcGxpY2F0aW9uIGlzIHJlbG9hZGVkLiAgTm8gc3BlY2lhbAorICAgIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQgdG8gZW5hYmxlIHRoaXMgZmVhdHVyZS48L3A+CisgICAgCisgICAgPHVsPgorICAgIDxsaT5JZiB5b3UgaGF2ZSBub3QgZGVjbGFyZWQgeW91ciBvd24gPGEgaHJlZj0ibG9hZGVyLmh0bWwiPkxvYWRlcjwvYT4KKyAgICAgICBlbGVtZW50LCBhIHN0YW5kYXJkIHdlYiBhcHBsaWNhdGlvbiBjbGFzcyBsb2FkZXIgd2lsbCBiZSBjb25maWd1cmVkLgorICAgICAgIDwvbGk+CisgICAgPGxpPklmIHlvdSBoYXZlIG5vdCBkZWNsYXJlZCB5b3VyIG93biA8YSBocmVmPSJtYW5hZ2VyLmh0bWwiPk1hbmFnZXI8L2E+CisgICAgICAgIGVsZW1lbnQsIGEgc3RhbmRhcmQgc2Vzc2lvbiBtYW5hZ2VyIHdpbGwgYmUgY29uZmlndXJlZC48L2xpPgorICAgIDxsaT5JZiB5b3UgaGF2ZSBub3QgZGVjbGFyZWQgeW91ciBvd24gPGEgaHJlZj0icmVzb3VyY2VzLmh0bWwiPlJlc291cmNlczwvYT4KKyAgICAgICAgZWxlbWVudCwgYSBzdGFuZGFyZCByZXNvdXJjZXMgbWFuYWdlciB3aWxsIGJlIGNvbmZpZ3VyZWQuPC9saT4KKyAgICA8bGk+VGhlIHdlYiBhcHBsaWNhdGlvbiBwcm9wZXJ0aWVzIGxpc3RlZCBpbiA8Y29kZT5jb25mL3dlYi54bWw8L2NvZGU+CisgICAgICAgIHdpbGwgYmUgcHJvY2Vzc2VkIGFzIGRlZmF1bHRzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gIFRoaXMgaXMgdXNlZAorICAgICAgICB0byBlc3RhYmxpc2ggZGVmYXVsdCBtYXBwaW5ncyAoc3VjaCBhcyBtYXBwaW5nIHRoZSA8Y29kZT4qLmpzcDwvY29kZT4KKyAgICAgICAgZXh0ZW5zaW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIEpTUCBzZXJ2bGV0KSwgYW5kIG90aGVyIHN0YW5kYXJkCisgICAgICAgIGZlYXR1cmVzIHRoYXQgYXBwbHkgdG8gYWxsIHdlYiBhcHBsaWNhdGlvbnMuPC9saT4KKyAgICA8bGk+VGhlIHdlYiBhcHBsaWNhdGlvbiBwcm9wZXJ0aWVzIGxpc3RlZCBpbiB0aGUKKyAgICAgICAgPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4gcmVzb3VyY2UgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uCisgICAgICAgIHdpbGwgYmUgcHJvY2Vzc2VkIChpZiB0aGlzIHJlc291cmNlIGV4aXN0cykuPC9saT4KKyAgICA8bGk+SWYgeW91ciB3ZWIgYXBwbGljYXRpb24gaGFzIHNwZWNpZmllZCBzZWN1cml0eSBjb25zdHJhaW50cyB0aGF0IG1pZ2h0CisgICAgICAgIHJlcXVpcmUgdXNlciBhdXRoZW50aWNhdGlvbiwgYW4gYXBwcm9wcmlhdGUgQXV0aGVudGljYXRvciB0aGF0CisgICAgICAgIGltcGxlbWVudHMgdGhlIGxvZ2luIG1ldGhvZCB5b3UgaGF2ZSBzZWxlY3RlZCB3aWxsIGJlIGNvbmZpZ3VyZWQuPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbnRleHQgUGFyYW1ldGVycyI+CisKKyAgICA8cD5Zb3UgY2FuIGNvbmZpZ3VyZSBuYW1lZCB2YWx1ZXMgdGhhdCB3aWxsIGJlIG1hZGUgdmlzaWJsZSB0byB0aGUKKyAgICB3ZWIgYXBwbGljYXRpb24gYXMgc2VydmxldCBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgYnkgbmVzdGluZworICAgIDxjb2RlPiZsdDtQYXJhbWV0ZXImZ3Q7PC9jb2RlPiBlbGVtZW50cyBpbnNpZGUgdGhpcyBlbGVtZW50LiAgRm9yCisgICAgZXhhbXBsZSwgeW91IGNhbiBjcmVhdGUgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorJmx0O0NvbnRleHQgLi4uJmd0OworICAuLi4KKyAgJmx0O1BhcmFtZXRlciBuYW1lPSJjb21wYW55TmFtZSIgdmFsdWU9Ik15IENvbXBhbnksIEluY29ycG9yYXRlZCIKKyAgICAgICAgIG92ZXJyaWRlPSJmYWxzZSIvJmd0OworICAuLi4KKyZsdDsvQ29udGV4dCZndDsKKzwvc291cmNlPgorCisgICAgPHA+VGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBpbmNsdXNpb24gb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50IGluIHRoZQorICAgIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+KToKKyAgICA8L3A+Cis8c291cmNlPgorJmx0O2NvbnRleHQtcGFyYW0mZ3Q7CisgICZsdDtwYXJhbS1uYW1lJmd0O2NvbXBhbnlOYW1lJmx0Oy9wYXJhbS1uYW1lJmd0OworICAmbHQ7cGFyYW0tdmFsdWUmZ3Q7TXkgQ29tcGFueSwgSW5jb3Jwb3JhdGVkJmx0Oy9wYXJhbS12YWx1ZSZndDsKKyZsdDsvY29udGV4dC1wYXJhbSZndDsKKzwvc291cmNlPgorICAgIDxwPmJ1dCBkb2VzIDxlbT5ub3Q8L2VtPiByZXF1aXJlIG1vZGlmaWNhdGlvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCisgICAgdG8gY3VzdG9taXplIHRoaXMgdmFsdWUuPC9wPgorCisgICAgPHA+VGhlIHZhbGlkIGF0dHJpYnV0ZXMgZm9yIGEgPGNvZGU+Jmx0O1BhcmFtZXRlciZndDs8L2NvZGU+IGVsZW1lbnQKKyAgICBhcmUgYXMgZm9sbG93czo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+T3B0aW9uYWwsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMgY29udGV4dAorICAgICAgICBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgbmFtZSBvZiB0aGUgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgdG8gYmUgY3JlYXRlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdmVycmlkZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+U2V0IHRoaXMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHlvdSBkbyA8c3Ryb25nPm5vdDwvc3Ryb25nPiB3YW50CisgICAgICAgIGEgPGNvZGU+Jmx0O2NvbnRleHQtcGFyYW0mZ3Q7PC9jb2RlPiBmb3IgdGhlIHNhbWUgcGFyYW1ldGVyIG5hbWUsCisgICAgICAgIGZvdW5kIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yLCB0byBvdmVycmlkZSB0aGUKKyAgICAgICAgdmFsdWUgc3BlY2lmaWVkIGhlcmUuICBCeSBkZWZhdWx0LCBvdmVycmlkZXMgYXJlIGFsbG93ZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIHBhcmFtZXRlciB2YWx1ZSB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIHRvIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICB3aGVuIHJlcXVlc3RlZCBieSBjYWxsaW5nCisgICAgICAgIDxjb2RlPlNlcnZsZXRDb250ZXh0LmdldEluaXRQYXJhbWV0ZXIoKTwvY29kZT4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRW52aXJvbm1lbnQgRW50cmllcyI+CisKKyAgICA8cD5Zb3UgY2FuIGNvbmZpZ3VyZSBuYW1lZCB2YWx1ZXMgdGhhdCB3aWxsIGJlIG1hZGUgdmlzaWJsZSB0byB0aGUKKyAgICB3ZWIgYXBwbGljYXRpb24gYXMgZW52aXJvbm1lbnQgZW50cnkgcmVzb3VyY2VzLCBieSBuZXN0aW5nCisgICAgPGNvZGU+Jmx0O0Vudmlyb25tZW50Jmd0OzwvY29kZT4gZW50cmllcyBpbnNpZGUgdGhpcyBlbGVtZW50LiAgRm9yCisgICAgZXhhbXBsZSwgeW91IGNhbiBjcmVhdGUgYW4gZW52aXJvbm1lbnQgZW50cnkgbGlrZSB0aGlzOjwvcD4KKzxzb3VyY2U+CismbHQ7Q29udGV4dCAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7RW52aXJvbm1lbnQgbmFtZT0ibWF4RXhlbXB0aW9ucyIgdmFsdWU9IjEwIgorICAgICAgICAgdHlwZT0iamF2YS5sYW5nLkludGVnZXIiIG92ZXJyaWRlPSJmYWxzZSIvJmd0OworICAuLi4KKyZsdDsvQ29udGV4dCZndDsKKzwvc291cmNlPgorCisgICAgPHA+VGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBpbmNsdXNpb24gb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50IGluIHRoZQorICAgIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+KToKKyAgICA8L3A+Cis8c291cmNlPgorJmx0O2Vudi1lbnRyeSZndDsKKyAgJmx0O2Vudi1lbnRyeS1uYW1lJmd0O21heEV4ZW1wdGlvbnMmbHQ7L3BhcmFtLW5hbWUmZ3Q7CisgICZsdDtlbnYtZW50cnktdmFsdWUmZ3Q7MTAmbHQ7L2Vudi1lbnRyeS12YWx1ZSZndDsKKyAgJmx0O2Vudi1lbnRyeS10eXBlJmd0O2phdmEubGFuZy5JbnRlZ2VyJmx0Oy9lbnYtZW50cnktdHlwZSZndDsKKyZsdDsvZW52LWVudHJ5Jmd0OworPC9zb3VyY2U+CisgICAgPHA+YnV0IGRvZXMgPGVtPm5vdDwvZW0+IHJlcXVpcmUgbW9kaWZpY2F0aW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAgICB0byBjdXN0b21pemUgdGhpcyB2YWx1ZS48L3A+CisKKyAgICA8cD5UaGUgdmFsaWQgYXR0cmlidXRlcyBmb3IgYW4gPGNvZGU+Jmx0O0Vudmlyb25tZW50Jmd0OzwvY29kZT4gZWxlbWVudAorICAgIGFyZSBhcyBmb2xsb3dzOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5PcHRpb25hbCwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcyBlbnZpcm9ubWVudCBlbnRyeS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPlRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0byBiZSBjcmVhdGVkLCByZWxhdGl2ZSB0byB0aGUKKyAgICAgICAgPGNvZGU+amF2YTpjb21wL2VudjwvY29kZT4gY29udGV4dC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdmVycmlkZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+U2V0IHRoaXMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHlvdSBkbyA8c3Ryb25nPm5vdDwvc3Ryb25nPiB3YW50CisgICAgICAgIGFuIDxjb2RlPiZsdDtlbnYtZW50cnkmZ3Q7PC9jb2RlPiBmb3IgdGhlIHNhbWUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSwKKyAgICAgICAgZm91bmQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIHRvIG92ZXJyaWRlIHRoZQorICAgICAgICB2YWx1ZSBzcGVjaWZpZWQgaGVyZS4gIEJ5IGRlZmF1bHQsIG92ZXJyaWRlcyBhcmUgYWxsb3dlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPlRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIGV4cGVjdGVkIGJ5IHRoZSB3ZWIgYXBwbGljYXRpb24KKyAgICAgICAgZm9yIHRoaXMgZW52aXJvbm1lbnQgZW50cnkuICBNdXN0IGJlIG9uZSBvZiB0aGUgbGVnYWwgdmFsdWVzIGZvcgorICAgICAgICA8Y29kZT4mbHQ7ZW52LWVudHJ5LXR5cGUmZ3Q7PC9jb2RlPiBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKKyAgICAgICAgZGVzY3JpcHRvcjogIDxjb2RlPmphdmEubGFuZy5Cb29sZWFuPC9jb2RlPiwKKyAgICAgICAgPGNvZGU+amF2YS5sYW5nLkJ5dGU8L2NvZGU+LCA8Y29kZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9jb2RlPiwKKyAgICAgICAgPGNvZGU+amF2YS5sYW5nLkRvdWJsZTwvY29kZT4sIDxjb2RlPmphdmEubGFuZy5GbG9hdDwvY29kZT4sCisgICAgICAgIDxjb2RlPmphdmEubGFuZy5JbnRlZ2VyPC9jb2RlPiwgPGNvZGU+amF2YS5sYW5nLkxvbmc8L2NvZGU+LAorICAgICAgICA8Y29kZT5qYXZhLmxhbmcuU2hvcnQ8L2NvZGU+LCBvciA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgcGFyYW1ldGVyIHZhbHVlIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgdG8gdGhlIGFwcGxpY2F0aW9uCisgICAgICAgIHdoZW4gcmVxdWVzdGVkIGZyb20gdGhlIEpOREkgY29udGV4dC4gIFRoaXMgdmFsdWUgbXVzdCBiZSBjb252ZXJ0YWJsZQorICAgICAgICB0byB0aGUgSmF2YSB0eXBlIGRlZmluZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+IGF0dHJpYnV0ZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJMaWZlY3ljbGUgTGlzdGVuZXJzIj4KKworICAgIDxwPklmIHlvdSBoYXZlIGltcGxlbWVudGVkIGEgSmF2YSBvYmplY3QgdGhhdCBuZWVkcyB0byBrbm93IHdoZW4gdGhpcworICAgIDxzdHJvbmc+Q29udGV4dDwvc3Ryb25nPiBpcyBzdGFydGVkIG9yIHN0b3BwZWQsIHlvdSBjYW4gZGVjbGFyZSBpdCBieQorICAgIG5lc3RpbmcgYSA8c3Ryb25nPkxpc3RlbmVyPC9zdHJvbmc+IGVsZW1lbnQgaW5zaWRlIHRoaXMgZWxlbWVudC4gIFRoZQorICAgIGNsYXNzIG5hbWUgeW91IHNwZWNpZnkgbXVzdCBpbXBsZW1lbnQgdGhlCisgICAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjwvY29kZT4gaW50ZXJmYWNlLCBhbmQKKyAgICBpdCB3aWxsIGJlIG5vdGlmaWVkIGFib3V0IHRoZSBvY2N1cnJlbmNlIG9mIHRoZSBjb3Jlc3BvbmRpbmcKKyAgICBsaWZlY3ljbGUgZXZlbnRzLiAgQ29uZmlndXJhdGlvbiBvZiBzdWNoIGEgbGlzdGVuZXIgbG9va3MgbGlrZSB0aGlzOjwvcD4KKworPHNvdXJjZT4KKyZsdDtDb250ZXh0IHBhdGg9Ii9leGFtcGxlcyIgLi4uJmd0OworICAuLi4KKyAgJmx0O0xpc3RlbmVyIGNsYXNzTmFtZT0iY29tLm15Y29tcGFueS5teXBhY2thZ2UuTXlMaXN0ZW5lciIgLi4uICZndDsKKyAgLi4uCismbHQ7L0NvbnRleHQmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPk5vdGUgdGhhdCBhIExpc3RlbmVyIGNhbiBoYXZlIGFueSBudW1iZXIgb2YgYWRkaXRpb25hbCBwcm9wZXJ0aWVzCisgICAgdGhhdCBtYXkgYmUgY29uZmlndXJlZCBmcm9tIHRoaXMgZWxlbWVudC4gIEF0dHJpYnV0ZSBuYW1lcyBhcmUgbWF0Y2hlZAorICAgIHRvIGNvcnJlc3BvbmRpbmcgSmF2YUJlYW4gcHJvcGVydHkgbmFtZXMgdXNpbmcgdGhlIHN0YW5kYXJkIHByb3BlcnR5CisgICAgbWV0aG9kIG5hbWluZyBwYXR0ZXJucy48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iUmVxdWVzdCBGaWx0ZXJzIj4KKworICAgIDxwPllvdSBjYW4gYXNrIENhdGFsaW5hIHRvIGNoZWNrIHRoZSBJUCBhZGRyZXNzLCBvciBob3N0IG5hbWUsIG9uIGV2ZXJ5CisgICAgaW5jb21pbmcgcmVxdWVzdCBkaXJlY3RlZCB0byB0aGUgc3Vycm91bmRpbmcKKyAgICA8YSBocmVmPSJlbmdpbmUuaHRtbCI+RW5naW5lPC9hPiwgPGEgaHJlZj0iaG9zdC5odG1sIj5Ib3N0PC9hPiwgb3IKKyAgICA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+IGVsZW1lbnQuICBUaGUgcmVtb3RlIGFkZHJlc3Mgb3IgbmFtZQorICAgIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGEgY29uZmlndXJlZCBsaXN0IG9mICJhY2NlcHQiIGFuZC9vciAiZGVueSIKKyAgICBmaWx0ZXJzLCB3aGljaCBhcmUgZGVmaW5lZCB1c2luZyB0aGUgUmVndWxhciBFeHByZXNzaW9uIHN5bnRheCBzdXBwb3J0ZWQKKyAgICBieSB0aGUgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9yZWdleHAvIj5KYWthcnRhIFJlZ2V4cDwvYT4KKyAgICByZWd1bGFyIGV4cHJlc3Npb24gbGlicmFyeS4gIFJlcXVlc3RzIHRoYXQgY29tZSBmcm9tIGxvY2F0aW9ucyB0aGF0IGFyZQorICAgIG5vdCBhY2NlcHRlZCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gSFRUUCAiRm9yYmlkZGVuIiBlcnJvci4KKyAgICBFeGFtcGxlIGZpbHRlciBkZWNsYXJhdGlvbnM6PC9wPgorCis8c291cmNlPgorJmx0O0NvbnRleHQgcGF0aD0iL2V4YW1wbGVzIiAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZW1vdGVIb3N0VmFsdmUiCisgICAgICAgICBhbGxvdz0iKi5teWNvbXBhbnkuY29tLHd3dy55b3VyY29tcGFueS5jb20iLyZndDsKKyAgJmx0O1ZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVtb3RlQWRkclZhbHZlIgorICAgICAgICAgZGVueT0iMTkyLjE2OC4xLioiLyZndDsKKyAgLi4uCismbHQ7L0NvbnRleHQmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPlNlZSA8YSBocmVmPSJ2YWx2ZS5odG1sI1JlbW90ZSBBZGRyZXNzIEZpbHRlciI+UmVtb3RlIEFkZHJlc3MgRmlsdGVyPC9hPgorICAgIGFuZCA8YSBocmVmPSJ2YWx2ZS5odG1sI1JlbW90ZSBIb3N0IEZpbHRlciI+UmVtb3RlIEhvc3QgRmlsdGVyPC9hPiBmb3IKKyAgICBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBhcmUgc3VwcG9ydGVkLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJSZXNvdXJjZSBEZWZpbml0aW9ucyI+CisKKyAgICA8cD5Zb3UgY2FuIGRlY2xhcmUgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgcmVzb3VyY2UKKyAgICB0byBiZSByZXR1cm5lZCBmb3IgSk5ESSBsb29rdXBzIG9mIDxjb2RlPiZsdDtyZXNvdXJjZS1yZWYmZ3Q7PC9jb2RlPiBhbmQKKyAgICA8Y29kZT4mbHQ7cmVzb3VyY2UtZW52LXJlZiZndDs8L2NvZGU+IGVsZW1lbnRzIGluIHRoZSB3ZWIgYXBwbGljYXRpb24KKyAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBZb3UgPHN0cm9uZz5NVVNUPC9zdHJvbmc+IGFsc28gZGVmaW5lCisgICAgdGhlIG5lZWRlZCByZXNvdXJjZSBwYXJhbWV0ZXJzIGFzIGF0dHJpYnV0ZXMgb2YgdGhlIDxjb2RlPlJlc291cmNlPC9jb2RlPiAKKyAgICBlbGVtZW50LCB0byBjb25maWd1cmUgdGhlIG9iamVjdCBmYWN0b3J5IHRvIGJlIHVzZWQgKGlmIG5vdCBrbm93biB0byBUb21jYXQgCisgICAgYWxyZWFkeSksIGFuZCB0aGUgcHJvcGVydGllcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGF0IG9iamVjdCBmYWN0b3J5LjwvcD4KKworICAgIDxwPkZvciBleGFtcGxlLCB5b3UgY2FuIGNyZWF0ZSBhIHJlc291cmNlIGRlZmluaXRpb24gbGlrZSB0aGlzOjwvcD4KKzxzb3VyY2U+CismbHQ7Q29udGV4dCAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7UmVzb3VyY2UgbmFtZT0iamRiYy9FbXBsb3llZURCIiBhdXRoPSJDb250YWluZXIiCisgICAgICAgICAgICB0eXBlPSJqYXZheC5zcWwuRGF0YVNvdXJjZSIKKyAgICAgZGVzY3JpcHRpb249IkVtcGxveWVlcyBEYXRhYmFzZSBmb3IgSFIgQXBwbGljYXRpb25zIi8mZ3Q7CisgIC4uLgorJmx0Oy9Db250ZXh0Jmd0OworPC9zb3VyY2U+CisKKyAgICA8cD5UaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGluY2x1c2lvbiBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnQgaW4gdGhlCisgICAgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciAoPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4pOjwvcD4KKzxzb3VyY2U+CismbHQ7cmVzb3VyY2UtcmVmJmd0OworICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7RW1wbG95ZWVzIERhdGFiYXNlIGZvciBIUiBBcHBsaWNhdGlvbnMmbHQ7L2Rlc2NyaXB0aW9uJmd0OworICAmbHQ7cmVzLXJlZi1uYW1lJmd0O2pkYmMvRW1wbG95ZWVEQiZsdDsvcmVzLXJlZi1uYW1lJmd0OworICAmbHQ7cmVzLXJlZi10eXBlJmd0O2phdmF4LnNxbC5EYXRhU291cmNlJmx0Oy9yZXMtcmVmLXR5cGUmZ3Q7CisgICZsdDtyZXMtYXV0aCZndDtDb250YWluZXImbHQ7L3Jlcy1hdXRoJmd0OworJmx0Oy9yZXNvdXJjZS1yZWYmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPmJ1dCBkb2VzIDxlbT5ub3Q8L2VtPiByZXF1aXJlIG1vZGlmaWNhdGlvbiBvZiB0aGUgZGVwbG95bWVudAorICAgIGRlc2NyaXB0b3IgdG8gY3VzdG9taXplIHRoaXMgdmFsdWUuPC9wPgorCisgICAgPHA+VGhlIHZhbGlkIGF0dHJpYnV0ZXMgZm9yIGEgPGNvZGU+Jmx0O1Jlc291cmNlJmd0OzwvY29kZT4gZWxlbWVudAorICAgIGFyZSBhcyBmb2xsb3dzOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImF1dGgiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNwZWNpZnkgd2hldGhlciB0aGUgd2ViIEFwcGxpY2F0aW9uIGNvZGUgc2lnbnMgb24gdG8gdGhlCisgICAgICAgIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgbWFuYWdlciBwcm9ncmFtYXRpY2FsbHksIG9yIHdoZXRoZXIgdGhlCisgICAgICAgIENvbnRhaW5lciB3aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZQorICAgICAgICBhcHBsaWNhdGlvbi4gIFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBtdXN0IGJlCisgICAgICAgIDxjb2RlPkFwcGxpY2F0aW9uPC9jb2RlPiBvciA8Y29kZT5Db250YWluZXI8L2NvZGU+LiAgVGhpcworICAgICAgICBhdHRyaWJ1dGUgaXMgPHN0cm9uZz5yZXF1aXJlZDwvc3Ryb25nPiBpZiB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgICAgIHdpbGwgdXNlIGEgPGNvZGU+Jmx0O3Jlc291cmNlLXJlZiZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIHdlYgorICAgICAgICBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGJ1dCBpcyBvcHRpb25hbCBpZiB0aGUKKyAgICAgICAgYXBwbGljYXRpb24gdXNlcyBhIDxjb2RlPiZsdDtyZXNvdXJjZS1lbnYtcmVmJmd0OzwvY29kZT4gaW5zdGVhZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+T3B0aW9uYWwsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcmVzb3VyY2UuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gYmUgY3JlYXRlZCwgcmVsYXRpdmUgdG8gdGhlCisgICAgICAgIDxjb2RlPmphdmE6Y29tcC9lbnY8L2NvZGU+IGNvbnRleHQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2NvcGUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNwZWNpZnkgd2hldGhlciBjb25uZWN0aW9ucyBvYnRhaW5lZCB0aHJvdWdoIHRoaXMgcmVzb3VyY2UKKyAgICAgICAgbWFuYWdlciBjYW4gYmUgc2hhcmVkLiAgVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIG11c3QgYmUKKyAgICAgICAgPGNvZGU+U2hhcmVhYmxlPC9jb2RlPiBvciA8Y29kZT5VbnNoYXJlYWJsZTwvY29kZT4uICBCeSBkZWZhdWx0LAorICAgICAgICBjb25uZWN0aW9ucyBhcmUgYXNzdW1lZCB0byBiZSBzaGFyZWFibGUuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBleHBlY3RlZCBieSB0aGUgd2ViCisgICAgICAgIGFwcGxpY2F0aW9uIHdoZW4gaXQgcGVyZm9ybXMgYSBsb29rdXAgZm9yIHRoaXMgcmVzb3VyY2UuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJSZXNvdXJjZSBMaW5rcyI+CisKKyAgICAgPHA+VGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgbGluayB0byBhIGdsb2JhbCBKTkRJIHJlc291cmNlLiBEb2luZworICAgICBhIEpOREkgbG9va3VwIG9uIHRoZSBsaW5rIG5hbWUgd2lsbCB0aGVuIHJldHVybiB0aGUgbGlua2VkIGdsb2JhbCAKKyAgICAgcmVzb3VyY2UuPC9wPgorCisgICAgPHA+Rm9yIGV4YW1wbGUsIHlvdSBjYW4gY3JlYXRlIGEgcmVzb3VyY2UgbGluayBsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KKyZsdDtDb250ZXh0IC4uLiZndDsKKyAgLi4uCisgICZsdDtSZXNvdXJjZUxpbmsgbmFtZT0ibGlua1RvR2xvYmFsUmVzb3VyY2UiCisgICAgICAgICAgICBnbG9iYWw9InNpbXBsZVZhbHVlIgorICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLkludGVnZXIiCisgIC4uLgorJmx0Oy9Db250ZXh0Jmd0OworPC9zb3VyY2U+CisKKyAgICA8cD5UaGUgdmFsaWQgYXR0cmlidXRlcyBmb3IgYSA8Y29kZT4mbHQ7UmVzb3VyY2VMaW5rJmd0OzwvY29kZT4gZWxlbWVudAorICAgIGFyZSBhcyBmb2xsb3dzOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9Imdsb2JhbCIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgbmFtZSBvZiB0aGUgbGlua2VkIGdsb2JhbCByZXNvdXJjZSBpbiB0aGUgCisgICAgICAgIGdsb2JhbCBKTkRJIGNvbnRleHQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgbGluayB0byBiZSBjcmVhdGVkLCByZWxhdGl2ZSB0byB0aGUKKyAgICAgICAgPGNvZGU+amF2YTpjb21wL2VudjwvY29kZT4gY29udGV4dC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPlRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIGV4cGVjdGVkIGJ5IHRoZSB3ZWIKKyAgICAgICAgYXBwbGljYXRpb24gd2hlbiBpdCBwZXJmb3JtcyBhIGxvb2t1cCBmb3IgdGhpcyByZXNvdXJjZSBsaW5rLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJUcmFuc2FjdGlvbiI+CisKKyAgICA8cD5Zb3UgY2FuIGRlY2xhcmUgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgVXNlclRyYW5zYWN0aW9uCisgICAgdG8gYmUgcmV0dXJuZWQgZm9yIEpOREkgbG9va3VwIGZvciA8Y29kZT5qYXZhOmNvbXAvVXNlclRyYW5zYWN0aW9uPC9jb2RlPi4gCisgICAgWW91IDxzdHJvbmc+TVVTVDwvc3Ryb25nPiBkZWZpbmUgYW4gb2JqZWN0IGZhY3RvcnkgY2xhc3MgdG8gaW5zdGFudGlhdGUKKyAgICB0aGlzIG9iamVjdCBhcyB3ZWxsIGFzIHRoZSBuZWVkZWQgcmVzb3VyY2UgcGFyYW1ldGVycyBhcyBhdHRyaWJ1dGVzIG9mIHRoZSAKKyAgICA8Y29kZT5UcmFuc2FjdGlvbjwvY29kZT4gCisgICAgZWxlbWVudCwgYW5kIHRoZSBwcm9wZXJ0aWVzIHVzZWQgdG8gY29uZmlndXJlIHRoYXQgb2JqZWN0IGZhY3RvcnkuPC9wPgorCisgICAgPHA+VGhlIHZhbGlkIGF0dHJpYnV0ZXMgZm9yIHRoZSA8Y29kZT4mbHQ7VHJhbnNhY3Rpb24mZ3Q7PC9jb2RlPiBlbGVtZW50CisgICAgYXJlIGFzIGZvbGxvd3M6PC9wPgorCisgICAgPGF0dHJpYnV0ZXM+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjdG9yeSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgY2xhc3MgbmFtZSBmb3IgdGhlIEpOREkgb2JqZWN0IGZhY3RvcnkuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9lbmdpbmUueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvZW5naW5lLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjUxZGU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvZW5naW5lLnhtbApAQCAtMCwwICsxLDIzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImVuZ2luZS5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBFbmdpbmUgQ29udGFpbmVyPC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgIDxwPlRoZSA8c3Ryb25nPkVuZ2luZTwvc3Ryb25nPiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGVudGlyZSByZXF1ZXN0CisgIHByb2Nlc3NpbmcgbWFjaGluZXJ5IGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgQ2F0YWxpbmEKKyAgPGEgaHJlZj0ic2VydmljZS5odG1sIj5TZXJ2aWNlPC9hPi4gIEl0IHJlY2VpdmVzIGFuZCBwcm9jZXNzZXMKKyAgPGVtPmFsbDwvZW0+IHJlcXVlc3RzIGZyb20gb25lIG9yIG1vcmUgPHN0cm9uZz5Db25uZWN0b3JzPC9zdHJvbmc+LAorICBhbmQgcmV0dXJucyB0aGUgY29tcGxldGVkIHJlc3BvbnNlIHRvIHRoZSBDb25uZWN0b3IgZm9yIHVsdGltYXRlCisgIHRyYW5zbWlzc2lvbiBiYWNrIHRvIHRoZSBjbGllbnQuPC9wPgorCisgIDxwPkV4YWN0bHkgb25lIDxzdHJvbmc+RW5naW5lPC9zdHJvbmc+IGVsZW1lbnQgTVVTVCBiZSBuZXN0ZWQgaW5zaWRlCisgIGEgPGEgaHJlZj0ic2VydmljZS5odG1sIj5TZXJ2aWNlPC9hPiBlbGVtZW50LCBmb2xsb3dpbmcgYWxsIG9mIHRoZQorICBjb3JyZXNwb25kaW5nIENvbm5lY3RvciBlbGVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXJ2aWNlLjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbW1vbiBBdHRyaWJ1dGVzIj4KKworICAgIDxwPkFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgPHN0cm9uZz5FbmdpbmU8L3N0cm9uZz4KKyAgICBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiYWNrZ3JvdW5kUHJvY2Vzc29yRGVsYXkiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGUgZGVsYXkgaW4gc2Vjb25kcyBiZXR3ZWVuIHRoZSAKKyAgICAgICAgaW52b2NhdGlvbiBvZiB0aGUgYmFja2dyb3VuZFByb2Nlc3MgbWV0aG9kIG9uIHRoaXMgZW5naW5lIGFuZCAKKyAgICAgICAgaXRzIGNoaWxkIGNvbnRhaW5lcnMsIGluY2x1ZGluZyBhbGwgaG9zdHMgYW5kIGNvbnRleHRzLiAKKyAgICAgICAgQ2hpbGQgY29udGFpbmVycyB3aWxsIG5vdCBiZSBpbnZva2VkIGlmIHRoZWlyIGRlbGF5IHZhbHVlIGlzIG5vdCAKKyAgICAgICAgbmVnYXRpdmUgKHdoaWNoIHdvdWxkIG1lYW4gdGhleSBhcmUgdXNpbmcgdGhlaXIgb3duIHByb2Nlc3NpbmcgCisgICAgICAgIHRocmVhZCkuIFNldHRpbmcgdGhpcyB0byBhIHBvc2l0aXZlIHZhbHVlIHdpbGwgY2F1c2UgCisgICAgICAgIGEgdGhyZWFkIHRvIGJlIHNwYXduLiBBZnRlciB3YWl0aW5nIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUsIAorICAgICAgICB0aGUgdGhyZWFkIHdpbGwgaW52b2tlIHRoZSBiYWNrZ3JvdW5kUHJvY2VzcyBtZXRob2Qgb24gdGhpcyBlbmdpbmUgCisgICAgICAgIGFuZCBhbGwgaXRzIGNoaWxkIGNvbnRhaW5lcnMuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGZvcgorICAgICAgICB0aGlzIGF0dHJpYnV0ZSBpcyAxMCwgd2hpY2ggcmVwcmVzZW50IGEgMTAgc2Vjb25kcyBkZWxheS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkphdmEgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdG8gdXNlLiAgVGhpcyBjbGFzcyBtdXN0CisgICAgICAgIGltcGxlbWVudCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU8L2NvZGU+IGludGVyZmFjZS4KKyAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHN0YW5kYXJkIHZhbHVlIChkZWZpbmVkIGJlbG93KSB3aWxsIGJlIHVzZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdEhvc3QiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIGRlZmF1bHQgaG9zdCBuYW1lLCB3aGljaCBpZGVudGlmaWVzIHRoZQorICAgICAgICA8YSBocmVmPSJob3N0Lmh0bWwiPkhvc3Q8L2E+IHRoYXQgd2lsbCBwcm9jZXNzIHJlcXVlc3RzIGRpcmVjdGVkCisgICAgICAgIHRvIGhvc3QgbmFtZXMgb24gdGhpcyBzZXJ2ZXIsIGJ1dCB3aGljaCBhcmUgbm90IGNvbmZpZ3VyZWQgaW4KKyAgICAgICAgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUuICBUaGlzIG5hbWUgTVVTVCBtYXRjaCB0aGUgPGNvZGU+bmFtZTwvY29kZT4KKyAgICAgICAgYXR0cmlidXRlcyBvZiBvbmUgb2YgdGhlIDxhIGhyZWY9Imhvc3QuaHRtbCI+SG9zdDwvYT4gZWxlbWVudHMKKyAgICAgICAgbmVzdGVkIGltbWVkaWF0ZWx5IGluc2lkZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJqdm1Sb3V0ZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SWRlbnRpZmllciB3aGljaCBtdXN0IGJlIHVzZWQgaW4gbG9hZCBiYWxhbmNpbmcgc2NlbmFyaW9zIHRvIGVuYWJsZQorICAgICAgICBzZXNzaW9uIGFmZmluaXR5LiBUaGUgaWRlbnRpZmllciwgd2hpY2ggbXVzdCBiZSB1bmlxdWUgYWNyb3NzIGFsbAorICAgICAgICBUb21jYXQgNSBzZXJ2ZXJzIHdoaWNoIHBhcnRpY2lwYXRlIGluIHRoZSBjbHVzdGVyLCB3aWxsIGJlIGFwcGVuZGVkIHRvCisgICAgICAgIHRoZSBnZW5lcmF0ZWQgc2Vzc2lvbiBpZGVudGlmaWVyLCB0aGVyZWZvcmUgYWxsb3dpbmcgdGhlIGZyb250IGVuZAorICAgICAgICBwcm94eSB0byBhbHdheXMgZm9yd2FyZCBhIHBhcnRpY3VsYXIgc2Vzc2lvbiB0byB0aGUgc2FtZSBUb21jYXQgNQorICAgICAgICBpbnN0YW5jZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPkxvZ2ljYWwgbmFtZSBvZiB0aGlzIEVuZ2luZSwgdXNlZCBpbiBsb2cgYW5kIGVycm9yIG1lc3NhZ2VzLiA8ZW0+V2hlbgorICAgICAgICB1c2luZyBtdWxpcGxlIDxhIGhyZWY9InNlcnZpY2UuaHRtbCI+U2VydmljZTwvYT4gZWxlbWVudHMgaW4gdGhlIHNhbWUKKyAgICAgICAgPGEgaHJlZj0ic2VydmVyLmh0bWwiPlNlcnZlcjwvYT4sIGVhY2ggRW5naW5lIE1VU1QgYmUgYXNzaWduZWQgYSB1bmlxdWUKKyAgICAgICAgbmFtZS48L2VtPjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlN0YW5kYXJkIEltcGxlbWVudGF0aW9uIj4KKworICAgIDxwPlRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkVuZ2luZTwvc3Ryb25nPiBpcworICAgIDxzdHJvbmc+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lPC9zdHJvbmc+LgorICAgIEl0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIChpbiBhZGRpdGlvbiB0byB0aGUKKyAgICBjb21tb24gYXR0cmlidXRlcyBsaXN0ZWQgYWJvdmUpOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iTmVzdGVkIENvbXBvbmVudHMiPgorCisgIDxwPllvdSBjYW4gbmVzdCBvbmUgb3IgbW9yZSA8YSBocmVmPSJob3N0Lmh0bWwiPkhvc3Q8L2E+IGVsZW1lbnRzIGluc2lkZQorICB0aGlzIDxzdHJvbmc+RW5naW5lPC9zdHJvbmc+IGVsZW1lbnQsIGVhY2ggcmVwcmVzZW50aW5nIGEgZGlmZmVyZW50IHZpcnR1YWwKKyAgaG9zdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2ZXIuICBBdCBsZWFzdCBvbmUgPGEgaHJlZj0iaG9zdC5odG1sIj5Ib3N0PC9hPgorICBpcyByZXF1aXJlZCwgYW5kIG9uZSBvZiB0aGUgbmVzdGVkIDxhIGhyZWY9Imhvc3QuaHRtbCI+SG9zdHM8L2E+IE1VU1QKKyAgaGF2ZSBhIG5hbWUgdGhhdCBtYXRjaGVzIHRoZSBuYW1lIHNwZWNpZmllZCBmb3IgdGhlCisgIDxjb2RlPmRlZmF1bHRIb3N0PC9jb2RlPiBhdHRyaWJ1dGUsIGxpc3RlZCBhYm92ZS48L3A+CisKKyAgPHA+WW91IGNhbiBuZXN0IGF0IG1vc3Qgb25lIGluc3RhbmNlIG9mIHRoZSBmb2xsb3dpbmcgdXRpbGl0eSBjb21wb25lbnRzCisgIGJ5IG5lc3RpbmcgYSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW5zaWRlIHlvdXIgPHN0cm9uZz5FbmdpbmU8L3N0cm9uZz4KKyAgZWxlbWVudDo8L3A+CisgIDx1bD4KKyAgPGxpPjxhIGhyZWY9InJlYWxtLmh0bWwiPjxzdHJvbmc+UmVhbG08L3N0cm9uZz48L2E+IC0KKyAgICAgIENvbmZpZ3VyZSBhIHJlYWxtIHRoYXQgd2lsbCBhbGxvdyBpdHMKKyAgICAgIGRhdGFiYXNlIG9mIHVzZXJzLCBhbmQgdGhlaXIgYXNzb2NpYXRlZCByb2xlcywgdG8gYmUgc2hhcmVkIGFjcm9zcyBhbGwKKyAgICAgIDxhIGhyZWY9Imhvc3QuaHRtbCI+SG9zdHM8L2E+IGFuZCA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHRzPC9hPgorICAgICAgbmVzdGVkIGluc2lkZSB0aGlzIEVuZ2luZSwgdW5sZXNzIG92ZXJyaWRkZW4gYnkgYQorICAgICAgPGEgaHJlZj0icmVhbG0uaHRtbCI+UmVhbG08L2E+IGNvbmZpZ3VyYXRpb24gYXQgYSBsb3dlciBsZXZlbC48L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iU3BlY2lhbCBGZWF0dXJlcyI+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJMb2dnaW5nIj4KKworICAgIDxwPkFuIGVuZ2luZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIAorICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5Db250YWluZXJCYXNlLltlbmdpbmVuYW1lXTwvY29kZT4KKyAgICAgICBsb2cgY2F0ZWdvcnkuICBOb3RlIHRoYXQgdGhlIGJyYWNrZXRzIGFyZSBhY3R1YWxseSBwYXJ0IG9mIHRoZSBuYW1lLAorICAgICAgIGRvbid0IG9taXQgdGhlbS48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQWNjZXNzIExvZ3MiPgorCisgICAgPHA+V2hlbiB5b3UgcnVuIGEgd2ViIHNlcnZlciwgb25lIG9mIHRoZSBvdXRwdXQgZmlsZXMgbm9ybWFsbHkgZ2VuZXJhdGVkCisgICAgaXMgYW4gPGVtPmFjY2VzcyBsb2c8L2VtPiwgd2hpY2ggZ2VuZXJhdGVzIG9uZSBsaW5lIG9mIGluZm9ybWF0aW9uIGZvcgorICAgIGVhY2ggcmVxdWVzdCBwcm9jZXNzZWQgYnkgdGhlIHNlcnZlciwgaW4gYSBzdGFuZGFyZCBmb3JtYXQuICBDYXRhbGluYQorICAgIGluY2x1ZGVzIGFuIG9wdGlvbmFsIDxhIGhyZWY9InZhbHZlLmh0bWwiPlZhbHZlPC9hPiBpbXBsZW1lbnRhdGlvbiB0aGF0CisgICAgY2FuIGNyZWF0ZSBhY2Nlc3MgbG9ncyBpbiB0aGUgc2FtZSBzdGFuZGFyZCBmb3JtYXQgY3JlYXRlZCBieSB3ZWIgc2VydmVycywKKyAgICBvciBpbiBhbnkgbnVtYmVyIG9mIGN1c3RvbSBmb3JtYXRzLjwvcD4KKworICAgIDxwPllvdSBjYW4gYXNrIENhdGFsaW5hIHRvIGNyZWF0ZSBhbiBhY2Nlc3MgbG9nIGZvciBhbGwgcmVxdWVzdHMKKyAgICBwcm9jZXNzZWQgYnkgYW4gPGEgaHJlZj0iZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4sCisgICAgPGEgaHJlZj0iaG9zdC5odG1sIj5Ib3N0PC9hPiwgb3IgPGEgaHJlZj0iY29udGV4dC5odG1sIj5Db250ZXh0PC9hPgorICAgIGJ5IG5lc3RpbmcgYSA8YSBocmVmPSJ2YWx2ZS5odG1sIj5WYWx2ZTwvYT4gZWxlbWVudCBsaWtlIHRoaXM6PC9wPgorCis8c291cmNlPgorJmx0O0VuZ2luZSBuYW1lPSJTdGFuZGFsb25lIiAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5BY2Nlc3NMb2dWYWx2ZSIKKyAgICAgICAgIHByZWZpeD0iY2F0YWxpbmFfYWNjZXNzX2xvZy4iIHN1ZmZpeD0iLnR4dCIKKyAgICAgICAgIHBhdHRlcm49ImNvbW1vbiIvJmd0OworICAuLi4KKyZsdDsvRW5naW5lJmd0OworPC9zb3VyY2U+CisKKyAgICA8cD5TZWUgPGEgaHJlZj0idmFsdmUuaHRtbCNBY2Nlc3MgTG9nIFZhbHZlIj5BY2Nlc3MgTG9nIFZhbHZlPC9hPgorICAgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMgdGhhdCBhcmUKKyAgICBzdXBwb3J0ZWQuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkxpZmVjeWNsZSBMaXN0ZW5lcnMiPgorCisgICAgPHA+SWYgeW91IGhhdmUgaW1wbGVtZW50ZWQgYSBKYXZhIG9iamVjdCB0aGF0IG5lZWRzIHRvIGtub3cgd2hlbiB0aGlzCisgICAgPHN0cm9uZz5FbmdpbmU8L3N0cm9uZz4gaXMgc3RhcnRlZCBvciBzdG9wcGVkLCB5b3UgY2FuIGRlY2xhcmUgaXQgYnkKKyAgICBuZXN0aW5nIGEgPHN0cm9uZz5MaXN0ZW5lcjwvc3Ryb25nPiBlbGVtZW50IGluc2lkZSB0aGlzIGVsZW1lbnQuICBUaGUKKyAgICBjbGFzcyBuYW1lIHlvdSBzcGVjaWZ5IG11c3QgaW1wbGVtZW50IHRoZQorICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI8L2NvZGU+IGludGVyZmFjZSwgYW5kCisgICAgaXQgd2lsbCBiZSBub3RpZmllZCBhYm91dCB0aGUgb2NjdXJyZW5jZSBvZiB0aGUgY29yZXNwb25kaW5nCisgICAgbGlmZWN5Y2xlIGV2ZW50cy4gIENvbmZpZ3VyYXRpb24gb2Ygc3VjaCBhIGxpc3RlbmVyIGxvb2tzIGxpa2UgdGhpczo8L3A+CisKKzxzb3VyY2U+CismbHQ7RW5naW5lIG5hbWU9IlN0YW5kYWxvbmUiIC4uLiZndDsKKyAgLi4uCisgICZsdDtMaXN0ZW5lciBjbGFzc05hbWU9ImNvbS5teWNvbXBhbnkubXlwYWNrYWdlLk15TGlzdGVuZXIiIC4uLiAmZ3Q7CisgIC4uLgorJmx0Oy9FbmdpbmUmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPk5vdGUgdGhhdCBhIExpc3RlbmVyIGNhbiBoYXZlIGFueSBudW1iZXIgb2YgYWRkaXRpb25hbCBwcm9wZXJ0aWVzCisgICAgdGhhdCBtYXkgYmUgY29uZmlndXJlZCBmcm9tIHRoaXMgZWxlbWVudC4gIEF0dHJpYnV0ZSBuYW1lcyBhcmUgbWF0Y2hlZAorICAgIHRvIGNvcnJlc3BvbmRpbmcgSmF2YUJlYW4gcHJvcGVydHkgbmFtZXMgdXNpbmcgdGhlIHN0YW5kYXJkIHByb3BlcnR5CisgICAgbWV0aG9kIG5hbWluZyBwYXR0ZXJucy48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iUmVxdWVzdCBGaWx0ZXJzIj4KKworICAgIDxwPllvdSBjYW4gYXNrIENhdGFsaW5hIHRvIGNoZWNrIHRoZSBJUCBhZGRyZXNzLCBvciBob3N0IG5hbWUsIG9uIGV2ZXJ5CisgICAgaW5jb21pbmcgcmVxdWVzdCBkaXJlY3RlZCB0byB0aGUgc3Vycm91bmRpbmcKKyAgICA8YSBocmVmPSJlbmdpbmUuaHRtbCI+RW5naW5lPC9hPiwgPGEgaHJlZj0iaG9zdC5odG1sIj5Ib3N0PC9hPiwgb3IKKyAgICA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+IGVsZW1lbnQuICBUaGUgcmVtb3RlIGFkZHJlc3Mgb3IgbmFtZQorICAgIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGEgY29uZmlndXJlZCBsaXN0IG9mICJhY2NlcHQiIGFuZC9vciAiZGVueSIKKyAgICBmaWx0ZXJzLCB3aGljaCBhcmUgZGVmaW5lZCB1c2luZyB0aGUgUmVndWxhciBFeHByZXNzaW9uIHN5bnRheCBzdXBwb3J0ZWQKKyAgICBieSB0aGUgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9yZWdleHAvIj5KYWthcnRhIFJlZ2V4cDwvYT4KKyAgICByZWd1bGFyIGV4cHJlc3Npb24gbGlicmFyeS4gIFJlcXVlc3RzIHRoYXQgY29tZSBmcm9tIGxvY2F0aW9ucyB0aGF0IGFyZQorICAgIG5vdCBhY2NlcHRlZCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gSFRUUCAiRm9yYmlkZGVuIiBlcnJvci4KKyAgICBFeGFtcGxlIGZpbHRlciBkZWNsYXJhdGlvbnM6PC9wPgorCis8c291cmNlPgorJmx0O0VuZ2luZSBuYW1lPSJTdGFuZGFsb25lIiAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZW1vdGVIb3N0VmFsdmUiCisgICAgICAgICBhbGxvdz0iKi5teWNvbXBhbnkuY29tLHd3dy55b3VyY29tcGFueS5jb20iLyZndDsKKyAgJmx0O1ZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVtb3RlQWRkclZhbHZlIgorICAgICAgICAgZGVueT0iMTkyLjE2OC4xLioiLyZndDsKKyAgLi4uCismbHQ7L0VuZ2luZSZndDsKKzwvc291cmNlPgorCisgIDxwPlNlZSA8YSBocmVmPSJ2YWx2ZS5odG1sI1JlbW90ZSBBZGRyZXNzIEZpbHRlciI+UmVtb3RlIEFkZHJlc3MgRmlsdGVyPC9hPgorICBhbmQgPGEgaHJlZj0idmFsdmUuaHRtbCNSZW1vdGUgSG9zdCBGaWx0ZXIiPlJlbW90ZSBIb3N0IEZpbHRlcjwvYT4gZm9yCisgIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGFyZSBzdXBwb3J0ZWQuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9nbG9iYWxyZXNvdXJjZXMueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvZ2xvYmFscmVzb3VyY2VzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2FkNDBjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvZ2xvYmFscmVzb3VyY2VzLnhtbApAQCAtMCwwICsxLDI1NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9Imdsb2JhbHJlc291cmNlcy5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hdXRob3I+CisgICAgPGF1dGhvciBlbWFpbD0ieW9hdnNAYXBhY2hlLm9yZyI+WW9hdiBTaGFwaXJhPC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBHbG9iYWxOYW1pbmdSZXNvdXJjZXMgQ29tcG9uZW50PC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgIDxwPlRoZSA8c3Ryb25nPkdsb2JhbE5hbWluZ1Jlc291cmNlczwvc3Ryb25nPiBlbGVtZW50IGRlZmluZXMgdGhlIGdsb2JhbAorICBKTkRJIHJlc291cmNlcyBmb3IgdGhlIDxhIGhyZWY9InNlcnZlci5odG1sIj5TZXJ2ZXI8L2E+LjwvcD4KKworICA8cD5UaGVzZSByZXNvdXJjZXMgYXJlIGxpc3RlZCBpbiB0aGUgc2VydmVyJ3MgZ2xvYmFsIEpOREkgcmVzb3VyY2UgY29udGV4dC4KKyAgIFRoaXMgY29udGV4dCBpcyBkaXN0aW5jdCBmcm9tIHRoZSBwZXItd2ViLWFwcGxpY2F0aW9uIEpOREkgY29udGV4dHMgCisgIGRlc2NyaWJlZCBpbgorICB0aGUgPGEgaHJlZj0iLi4vam5kaS1yZXNvdXJjZXMtaG93dG8uaHRtbCI+Sk5ESSBSZXNvdXJjZXMgSE9XLVRPPC9hPi4KKyAgVGhlIHJlc291cmNlcyBkZWZpbmVkIGluIHRoaXMgZWxlbWVudCBhcmUgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gdmlzaWJsZSBpbgorICB0aGUgcGVyLXdlYi1hcHBsaWNhdGlvbiBjb250ZXh0cyB1bmxlc3MgeW91IGV4cGxpY2l0bHkgbGluayB0aGVtIHdpdGgKKyAgPGEgaHJlZj0iY29udGV4dC5odG1sI1Jlc291cmNlIExpbmtzIj4mbHQ7UmVzb3VyY2VMaW5rJmd0OzwvYT4gZWxlbWVudHMuCisgIDwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iTmVzdGVkIENvbXBvbmVudHMiPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iU3BlY2lhbCBGZWF0dXJlcyI+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJFbnZpcm9ubWVudCBFbnRyaWVzIj4KKworICA8cD5Zb3UgY2FuIGNvbmZpZ3VyZSBuYW1lZCB2YWx1ZXMgdGhhdCB3aWxsIGJlIG1hZGUgdmlzaWJsZSB0byBhbGwKKyAgICB3ZWIgYXBwbGljYXRpb25zIGFzIGVudmlyb25tZW50IGVudHJ5IHJlc291cmNlcyBieSBuZXN0aW5nCisgICAgPGNvZGU+Jmx0O0Vudmlyb25tZW50Jmd0OzwvY29kZT4gZW50cmllcyBpbnNpZGUgdGhpcyBlbGVtZW50LiBGb3IKKyAgICBleGFtcGxlLCB5b3UgY2FuIGNyZWF0ZSBhbiBlbnZpcm9ubWVudCBlbnRyeSBsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KKyZsdDtHbG9iYWxOYW1pbmdSZXNvdXJjZXMgLi4uJmd0OworICAuLi4KKyAgJmx0O0Vudmlyb25tZW50IG5hbWU9Im1heEV4ZW1wdGlvbnMiIHZhbHVlPSIxMCIKKyAgICAgICAgIHR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIiBvdmVycmlkZT0iZmFsc2UiLyZndDsKKyAgLi4uCismbHQ7L0dsb2JhbE5hbWluZ1Jlc291cmNlcyZndDsKKzwvc291cmNlPgorCisgICAgPHA+VGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBpbmNsdXNpb24gb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50IGluIHRoZQorICAgIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+KToKKyAgICA8L3A+Cis8c291cmNlPgorJmx0O2Vudi1lbnRyeSZndDsKKyAgJmx0O2Vudi1lbnRyeS1uYW1lJmd0O21heEV4ZW1wdGlvbnMmbHQ7L2Vudi1lbnRyeS1uYW1lJmd0OworICAmbHQ7ZW52LWVudHJ5LXZhbHVlJmd0OzEwJmx0Oy9lbnYtZW50cnktdmFsdWUmZ3Q7CisgICZsdDtlbnYtZW50cnktdHlwZSZndDtqYXZhLmxhbmcuSW50ZWdlciZsdDsvZW52LWVudHJ5LXR5cGUmZ3Q7CismbHQ7L2Vudi1lbnRyeSZndDsKKzwvc291cmNlPgorICAgIDxwPmJ1dCBkb2VzIDxlbT5ub3Q8L2VtPiByZXF1aXJlIG1vZGlmaWNhdGlvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCisgICAgdG8gY3VzdG9taXplIHRoaXMgdmFsdWUuPC9wPgorCisgICAgPHA+VGhlIHZhbGlkIGF0dHJpYnV0ZXMgZm9yIGFuIDxjb2RlPiZsdDtFbnZpcm9ubWVudCZndDs8L2NvZGU+IGVsZW1lbnQKKyAgICBhcmUgYXMgZm9sbG93czo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+T3B0aW9uYWwsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZW52aXJvbm1lbnQgZW50cnkuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdG8gYmUgY3JlYXRlZCwgcmVsYXRpdmUgdG8gdGhlCisgICAgICAgIDxjb2RlPmphdmE6Y29tcC9lbnY8L2NvZGU+IGNvbnRleHQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3ZlcnJpZGUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNldCB0aGlzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB5b3UgZG8gPHN0cm9uZz5ub3Q8L3N0cm9uZz4gd2FudAorICAgICAgICBhbiA8Y29kZT4mbHQ7ZW52LWVudHJ5Jmd0OzwvY29kZT4gZm9yIHRoZSBzYW1lIGVudmlyb25tZW50IGVudHJ5IG5hbWUsCisgICAgICAgIGZvdW5kIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yLCB0byBvdmVycmlkZSB0aGUKKyAgICAgICAgdmFsdWUgc3BlY2lmaWVkIGhlcmUuICBCeSBkZWZhdWx0LCBvdmVycmlkZXMgYXJlIGFsbG93ZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBleHBlY3RlZCBieSB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgICAgIGZvciB0aGlzIGVudmlyb25tZW50IGVudHJ5LiAgTXVzdCBiZSBvbmUgb2YgdGhlIGxlZ2FsIHZhbHVlcyBmb3IKKyAgICAgICAgPGNvZGU+Jmx0O2Vudi1lbnRyeS10eXBlJmd0OzwvY29kZT4gaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CisgICAgICAgIGRlc2NyaXB0b3I6ICA8Y29kZT5qYXZhLmxhbmcuQm9vbGVhbjwvY29kZT4sCisgICAgICAgIDxjb2RlPmphdmEubGFuZy5CeXRlPC9jb2RlPiwgPGNvZGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvY29kZT4sCisgICAgICAgIDxjb2RlPmphdmEubGFuZy5Eb3VibGU8L2NvZGU+LCA8Y29kZT5qYXZhLmxhbmcuRmxvYXQ8L2NvZGU+LAorICAgICAgICA8Y29kZT5qYXZhLmxhbmcuSW50ZWdlcjwvY29kZT4sIDxjb2RlPmphdmEubGFuZy5Mb25nPC9jb2RlPiwKKyAgICAgICAgPGNvZGU+amF2YS5sYW5nLlNob3J0PC9jb2RlPiwgb3IgPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIHBhcmFtZXRlciB2YWx1ZSB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIHRvIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICB3aGVuIHJlcXVlc3RlZCBmcm9tIHRoZSBKTkRJIGNvbnRleHQuICBUaGlzIHZhbHVlIG11c3QgYmUgY29udmVydGFibGUKKyAgICAgICAgdG8gdGhlIEphdmEgdHlwZSBkZWZpbmVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPiBhdHRyaWJ1dGUuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iUmVzb3VyY2UgRGVmaW5pdGlvbnMiPgorCisgICAgPHA+WW91IGNhbiBkZWNsYXJlIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcmVzb3VyY2VzCisgICAgdG8gYmUgcmV0dXJuZWQgZm9yIEpOREkgbG9va3VwcyBvZiA8Y29kZT4mbHQ7cmVzb3VyY2UtcmVmJmd0OzwvY29kZT4gYW5kCisgICAgPGNvZGU+Jmx0O3Jlc291cmNlLWVudi1yZWYmZ3Q7PC9jb2RlPiBlbGVtZW50cyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGJ5IGRlZmluaW5nIHRoZW0gaW4gdGhpcyBlbGVtZW50IGFuZCB0aGVuIGxpbmtpbmcgCisgICAgdGhlbSB3aXRoIDxhIGhyZWY9ImNvbnRleHQuaHRtbCNSZXNvdXJjZSBMaW5rcyI+Jmx0O1Jlc291cmNlTGluayZndDs8L2E+IAorICAgIGVsZW1lbnRzCisgICAgaW4gdGhlIDxjb2RlPjxzdHJvbmc+Jmx0O0NvbnRleHQmZ3Q7PC9zdHJvbmc+PC9jb2RlPiBlbGVtZW50LiAgCisKKyAgICBZb3UgPHN0cm9uZz5NVVNUPC9zdHJvbmc+IGFsc28gZGVmaW5lIGFueSBvdGhlciBuZWVkZWQgcGFyYW1ldGVycyB1c2luZworICAgIGF0dHJpYnV0ZXMgb24gdGhlIFJlc291cmNlIGVsZW1lbnQsIHRvIGNvbmZpZ3VyZQorICAgIHRoZSBvYmplY3QgZmFjdG9yeSB0byBiZSB1c2VkIChpZiBub3Qga25vd24gdG8gVG9tY2F0IGFscmVhZHkpLCBhbmQKKyAgICB0aGUgcHJvcGVydGllcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGF0IG9iamVjdCBmYWN0b3J5LjwvcD4KKworICAgIDxwPkZvciBleGFtcGxlLCB5b3UgY2FuIGNyZWF0ZSBhIHJlc291cmNlIGRlZmluaXRpb24gbGlrZSB0aGlzOjwvcD4KKzxzb3VyY2U+CismbHQ7R2xvYmFsTmFtaW5nUmVzb3VyY2VzIC4uLiZndDsKKyAgLi4uCisgICZsdDtSZXNvdXJjZSBuYW1lPSJqZGJjL0VtcGxveWVlREIiIGF1dGg9IkNvbnRhaW5lciIKKyAgICAgICAgICAgIHR5cGU9ImphdmF4LnNxbC5EYXRhU291cmNlIgorICAgICBkZXNjcmlwdGlvbj0iRW1wbG95ZWVzIERhdGFiYXNlIGZvciBIUiBBcHBsaWNhdGlvbnMiLyZndDsKKyAgLi4uCismbHQ7L0dsb2JhbE5hbWluZ1Jlc291cmNlcyZndDsKKzwvc291cmNlPgorCisgICAgPHA+VGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBpbmNsdXNpb24gb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50IGluIHRoZQorICAgIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+KTo8L3A+Cis8c291cmNlPgorJmx0O3Jlc291cmNlLXJlZiZndDsKKyAgJmx0O2Rlc2NyaXB0aW9uJmd0O0VtcGxveWVlcyBEYXRhYmFzZSBmb3IgSFIgQXBwbGljYXRpb25zJmx0Oy9kZXNjcmlwdGlvbiZndDsKKyAgJmx0O3Jlcy1yZWYtbmFtZSZndDtqZGJjL0VtcGxveWVlREImbHQ7L3Jlcy1yZWYtbmFtZSZndDsKKyAgJmx0O3Jlcy1yZWYtdHlwZSZndDtqYXZheC5zcWwuRGF0YVNvdXJjZSZsdDsvcmVzLXJlZi10eXBlJmd0OworICAmbHQ7cmVzLWF1dGgmZ3Q7Q29udGFpbmVyJmx0Oy9yZXMtYXV0aCZndDsKKyZsdDsvcmVzb3VyY2UtcmVmJmd0OworPC9zb3VyY2U+CisKKyAgICA8cD5idXQgZG9lcyA8ZW0+bm90PC9lbT4gcmVxdWlyZSBtb2RpZmljYXRpb24gb2YgdGhlIGRlcGxveW1lbnQKKyAgICBkZXNjcmlwdG9yIHRvIGN1c3RvbWl6ZSB0aGlzIHZhbHVlLjwvcD4KKworICAgIDxwPlRoZSB2YWxpZCBhdHRyaXV0ZXMgZm9yIGEgPGNvZGU+Jmx0O1Jlc291cmNlJmd0OzwvY29kZT4gZWxlbWVudAorICAgIGFyZSBhcyBmb2xsb3dzOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImF1dGgiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNwZWNpZnkgd2hldGhlciB0aGUgd2ViIEFwcGxpY2F0aW9uIGNvZGUgc2lnbnMgb24gdG8gdGhlCisgICAgICAgIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgbWFuYWdlciBwcm9ncmFtYXRpY2FsbHksIG9yIHdoZXRoZXIgdGhlCisgICAgICAgIENvbnRhaW5lciB3aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZQorICAgICAgICBhcHBsaWNhdGlvbi4gIFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBtdXN0IGJlCisgICAgICAgIDxjb2RlPkFwcGxpY2F0aW9uPC9jb2RlPiBvciA8Y29kZT5Db250YWluZXI8L2NvZGU+LiAgVGhpcworICAgICAgICBhdHRyaWJ1dGUgaXMgPHN0cm9uZz5yZXF1aXJlZDwvc3Ryb25nPiBpZiB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgICAgIHdpbGwgdXNlIGEgPGNvZGU+Jmx0O3Jlc291cmNlLXJlZiZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIHdlYgorICAgICAgICBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGJ1dCBpcyBvcHRpb25hbCBpZiB0aGUKKyAgICAgICAgYXBwbGljYXRpb24gdXNlcyBhIDxjb2RlPiZsdDtyZXNvdXJjZS1lbnYtcmVmJmd0OzwvY29kZT4gaW5zdGVhZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+T3B0aW9uYWwsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcmVzb3VyY2UuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gYmUgY3JlYXRlZCwgcmVsYXRpdmUgdG8gdGhlCisgICAgICAgIDxjb2RlPmphdmE6Y29tcC9lbnY8L2NvZGU+IGNvbnRleHQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2NvcGUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNwZWNpZnkgd2hldGhlciBjb25uZWN0aW9ucyBvYnRhaW5lZCB0aHJvdWdoIHRoaXMgcmVzb3VyY2UKKyAgICAgICAgbWFuYWdlciBjYW4gYmUgc2hhcmVkLiAgVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIG11c3QgYmUKKyAgICAgICAgPGNvZGU+U2hhcmVhYmxlPC9jb2RlPiBvciA8Y29kZT5VbnNoYXJlYWJsZTwvY29kZT4uICBCeSBkZWZhdWx0LAorICAgICAgICBjb25uZWN0aW9ucyBhcmUgYXNzdW1lZCB0byBiZSBzaGFyZWFibGUuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBleHBlY3RlZCBieSB0aGUgd2ViCisgICAgICAgIGFwcGxpY2F0aW9uIHdoZW4gaXQgcGVyZm9ybXMgYSBsb29rdXAgZm9yIHRoaXMgcmVzb3VyY2UuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKworICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iUmVzb3VyY2UgTGlua3MiPgorICAgIDxwPlVzZSA8YSBocmVmPSJjb250ZXh0Lmh0bWwjUmVzb3VyY2UgTGlua3MiPiZsdDtSZXNvdXJjZUxpbmsmZ3Q7PC9hPiAKKyAgICBlbGVtZW50cyB0byBsaW5rIHJlc291cmNlcyBmcm9tIHRoZSBnbG9iYWwgY29udGV4dCBpbnRvIAorICAgIHBlci13ZWItYXBwbGljYXRpb24gY29udGV4dHMuIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBtYWtpbmcgYSBjdXN0b20gCisgICAgZmFjdG9yeSBhdmFpbGFibGUgdG8gYSB3ZWIgYXBwbGljYXRpb25zLCBiYXNlZCBvbiB0aGUgZXhhbXBsZSAKKyAgICBkZWZpbml0aW9uIGluIHRoZSAKKyAgICA8YSBocmVmPSIuLi9qbmRpLXJlc291cmNlLWhvd3RvLmh0bWwjR2VuZXJpYyBKYXZhQmVhbiBSZXNvdXJjZXMiPgorICAgIEpOREkgUmVzb3VyY2UgSE9XLVRPPC9hPjoKKyAgICA8L3A+CisKKyAgICA8c291cmNlPgorICAgICAgPCFbQ0RBVEFbCisgICAgICAgIDxDb250ZXh0PgorICAgICAgICAgIDxSZXNvdXJjZUxpbmsgCisgICAgICAgICAgICBuYW1lPSJiZWFuL015QmVhbkZhY3RvcnkiCisgICAgICAgICAgICBnbG9iYWw9ImJlYW4vTXlCZWFuRmFjdG9yeSIKKyAgICAgICAgICAgIHR5cGU9ImNvbS5teWNvbXBhbnkuTXlCZWFuIgorICAgICAgICAgIC8+CisgICAgICAgIDwvQ29udGV4dD4KKyAgICAgIF1dPgorICAgIDwvc291cmNlPgorCisgICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iVHJhbnNhY3Rpb24iPgorCisgICAgPHA+WW91IGNhbiBkZWNsYXJlIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIFVzZXJUcmFuc2FjdGlvbgorICAgIHRvIGJlIHJldHVybmVkIGZvciBKTkRJIGxvb2t1cCBmb3IgPGNvZGU+amF2YTpjb21wL1VzZXJUcmFuc2FjdGlvbjwvY29kZT4uIAorICAgIFlvdSA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gZGVmaW5lIGFuIG9iamVjdCBmYWN0b3J5IGNsYXNzIHRvIGluc3RhbnRpYXRlCisgICAgdGhpcyBvYmplY3QgYXMgd2VsbCBhcyB0aGUgbmVlZGVkIHJlc291cmNlIHBhcmFtZXRlcnMgYXMgYXR0cmlidXRlcyBvZiB0aGUgCisgICAgPGNvZGU+VHJhbnNhY3Rpb248L2NvZGU+IAorICAgIGVsZW1lbnQsIGFuZCB0aGUgcHJvcGVydGllcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGF0IG9iamVjdCBmYWN0b3J5LjwvcD4KKworICAgIDxwPlRoZSB2YWxpZCBhdHRyaWJ1dGVzIGZvciB0aGUgPGNvZGU+Jmx0O1RyYW5zYWN0aW9uJmd0OzwvY29kZT4gZWxlbWVudAorICAgIGFyZSBhcyBmb2xsb3dzOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY3RvcnkiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBKTkRJIG9iamVjdCBmYWN0b3J5LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKworCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvaG9zdC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9ob3N0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDc4MDg4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvaG9zdC54bWwKQEAgLTAsMCArMSw1MzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJob3N0Lmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSJyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hdXRob3I+CisgICAgPGF1dGhvciBlbWFpbD0ieW9hdnNAYXBhY2hlLm9yZyI+WW9hdiBTaGFwaXJhPC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBIb3N0IENvbnRhaW5lcjwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICA8cD5UaGUgPHN0cm9uZz5Ib3N0PC9zdHJvbmc+IGVsZW1lbnQgcmVwcmVzZW50cyBhIDxlbT52aXJ0dWFsIGhvc3Q8L2VtPiwKKyAgd2hpY2ggaXMgYW4gYXNzb2NpYXRpb24gb2YgYSBuZXR3b3JrIG5hbWUgZm9yIGEgc2VydmVyIChzdWNoIGFzCisgICJ3d3cubXljb21wYW55LmNvbSIgd2l0aCB0aGUgcGFydGljdWxhciBzZXJ2ZXIgb24gd2hpY2ggQ2F0YWxpbmEgaXMKKyAgcnVubmluZy4gIEluIG9yZGVyIHRvIGJlIGVmZmVjdGl2ZSwgdGhpcyBuYW1lIG11c3QgYmUgcmVnaXN0ZXJlZCBpbiB0aGUKKyAgPGVtPkRvbWFpbiBOYW1lIFNlcnZpY2U8L2VtPiAoRE5TKSBzZXJ2ZXIgdGhhdCBtYW5hZ2VzIHRoZSBJbnRlcm5ldAorICBkb21haW4geW91IGJlbG9uZyB0byAtIGNvbnRhY3QgeW91ciBOZXR3b3JrIEFkbWluaXN0cmF0b3IgZm9yIG1vcmUKKyAgaW5mb3JtYXRpb24uPC9wPgorCisgIDxwPkluIG1hbnkgY2FzZXMsIFN5c3RlbSBBZG1pbmlzdHJhdG9ycyB3aXNoIHRvIGFzc29jaWF0ZSBtb3JlIHRoYW4KKyAgb25lIG5ldHdvcmsgbmFtZSAoc3VjaCBhcyA8Y29kZT53d3cubXljb21wYW55LmNvbTwvY29kZT4gYW5kCisgIDxjb2RlPmNvbXBhbnkuY29tPC9jb2RlPikgd2l0aCB0aGUgc2FtZSB2aXJ0dWFsIGhvc3QgYW5kIGFwcGxpY2F0aW9ucy4KKyAgVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIHVzaW5nIHRoZSA8YSBocmVmPSIjSG9zdCBOYW1lIEFsaWFzZXMiPkhvc3QKKyAgTmFtZSBBbGlhc2VzPC9hPiBmZWF0dXJlIGRpc2N1c3NlZCBiZWxvdy48L3A+CisKKyAgPHA+T25lIG9yIG1vcmUgPHN0cm9uZz5Ib3N0PC9zdHJvbmc+IGVsZW1lbnRzIGFyZSBuZXN0ZWQgaW5zaWRlIGFuCisgIDxhIGhyZWY9ImVuZ2luZS5odG1sIj5FbmdpbmU8L2E+IGVsZW1lbnQuICBJbnNpZGUgdGhlIEhvc3QgZWxlbWVudCwgeW91CisgIGNhbiBuZXN0IDxhIGhyZWY9ImNvbnRleHQuaHRtbCI+Q29udGV4dDwvYT4gZWxlbWVudHMgZm9yIHRoZSB3ZWIKKyAgYXBwbGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZpcnR1YWwgaG9zdC4gIEV4YWN0bHkgb25lIG9mIHRoZSBIb3N0cworICBhc3NvY2lhdGVkIHdpdGggZWFjaCBFbmdpbmUgTVVTVCBoYXZlIGEgbmFtZSBtYXRjaGluZyB0aGUKKyAgPGNvZGU+ZGVmYXVsdEhvc3Q8L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGF0IEVuZ2luZS48L3A+CisKKyAgICA8YmxvY2txdW90ZT48ZW0+CisgICAgPHA+VGhlIGRlc2NyaXB0aW9uIGJlbG93IHVzZXMgdGhlIHZhcmlhYmxlIG5hbWUgJENBVEFMSU5BX0hPTUUKKyAgICB0byByZWZlciB0byB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IGhhdmUgaW5zdGFsbGVkIFRvbWNhdCA1LAorICAgIGFuZCBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgYWdhaW5zdCB3aGljaCBtb3N0IHJlbGF0aXZlIHBhdGhzIGFyZQorICAgIHJlc29sdmVkLiAgSG93ZXZlciwgaWYgeW91IGhhdmUgY29uZmlndXJlZCBUb21jYXQgNSBmb3IgbXVsdGlwbGUKKyAgICBpbnN0YW5jZXMgYnkgc2V0dGluZyBhIENBVEFMSU5BX0JBU0UgZGlyZWN0b3J5LCB5b3Ugc2hvdWxkIHVzZQorICAgICRDQVRBTElOQV9CQVNFIGluc3RlYWQgb2YgJENBVEFMSU5BX0hPTUUgZm9yIGVhY2ggb2YgdGhlc2UKKyAgICByZWZlcmVuY2VzLjwvcD4KKyAgICA8L2VtPjwvYmxvY2txdW90ZT4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbW1vbiBBdHRyaWJ1dGVzIj4KKworICAgIDxwPkFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgPHN0cm9uZz5Ib3N0PC9zdHJvbmc+CisgICAgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorCisgICAgPGF0dHJpYnV0ZXM+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXBwQmFzZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgPGVtPkFwcGxpY2F0aW9uIEJhc2U8L2VtPiBkaXJlY3RvcnkgZm9yIHRoaXMgdmlydHVhbCBob3N0LgorICAgICAgICBUaGlzIGlzIHRoZSBwYXRobmFtZSBvZiBhIGRpcmVjdG9yeSB0aGF0IG1heSBjb250YWluIHdlYiBhcHBsaWNhdGlvbnMKKyAgICAgICAgdG8gYmUgZGVwbG95ZWQgb24gdGhpcyB2aXJ0dWFsIGhvc3QuICBZb3UgbWF5IHNwZWNpZnkgYW4KKyAgICAgICAgYWJzb2x1dGUgcGF0aG5hbWUgZm9yIHRoaXMgZGlyZWN0b3J5LCBvciBhIHBhdGhuYW1lIHRoYXQgaXMgcmVsYXRpdmUKKyAgICAgICAgdG8gdGhlIDxjb2RlPiRDQVRBTElOQV9CQVNFPC9jb2RlPiBkaXJlY3RvcnkuICBTZWUKKyAgICAgICAgPGEgaHJlZj0iI0F1dG9tYXRpYyBBcHBsaWNhdGlvbiBEZXBsb3ltZW50Ij5BdXRvbWF0aWMgQXBwbGljYXRpb24KKyAgICAgICAgRGVwbG95bWVudDwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gYXV0b21hdGljIHJlY29nbml0aW9uIGFuZAorICAgICAgICBkZXBsb3ltZW50IG9mIHdlYiBhcHBsaWNhdGlvbnMgdG8gYmUgZGVwbG95ZWQgYXV0b21hdGljYWxseS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhdXRvRGVwbG95IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGlzIGZsYWcgdmFsdWUgaW5kaWNhdGVzIGlmIG5ldyB3ZWIgYXBwbGljYXRpb25zLCBkcm9wcGVkIGluIHRvCisgICAgICAgIHRoZSA8Y29kZT5hcHBCYXNlPC9jb2RlPiBkaXJlY3Rvcnkgd2hpbGUgVG9tY2F0IGlzIHJ1bm5pbmcsIHNob3VsZAorICAgICAgICBiZSBhdXRvbWF0aWNhbGx5IGRlcGxveWVkLiAgVGhlIGZsYWcncyB2YWx1ZSBkZWZhdWx0cyB0byB0cnVlLiAgU2VlCisgICAgICAgIDxhIGhyZWY9IiNBdXRvbWF0aWMgQXBwbGljYXRpb24gRGVwbG95bWVudCI+QXV0b21hdGljIEFwcGxpY2F0aW9uCisgICAgICAgIERlcGxveW1lbnQ8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImJhY2tncm91bmRQcm9jZXNzb3JEZWxheSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhpcyB2YWx1ZSByZXByZXNlbnRzIHRoZSBkZWxheSBpbiBzZWNvbmRzIGJldHdlZW4gdGhlIAorICAgICAgICBpbnZvY2F0aW9uIG9mIHRoZSBiYWNrZ3JvdW5kUHJvY2VzcyBtZXRob2Qgb24gdGhpcyBob3N0IGFuZCAKKyAgICAgICAgaXRzIGNoaWxkIGNvbnRhaW5lcnMsIGluY2x1ZGluZyBhbGwgY29udGV4dHMuIAorICAgICAgICBDaGlsZCBjb250YWluZXJzIHdpbGwgbm90IGJlIGludm9rZWQgaWYgdGhlaXIgZGVsYXkgdmFsdWUgaXMgbm90IAorICAgICAgICBuZWdhdGl2ZSAod2hpY2ggd291bGQgbWVhbiB0aGV5IGFyZSB1c2luZyB0aGVpciBvd24gcHJvY2Vzc2luZyAKKyAgICAgICAgdGhyZWFkKS4gU2V0dGluZyB0aGlzIHRvIGEgcG9zaXRpdmUgdmFsdWUgd2lsbCBjYXVzZSAKKyAgICAgICAgYSB0aHJlYWQgdG8gYmUgc3Bhd24uIEFmdGVyIHdhaXRpbmcgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSwgCisgICAgICAgIHRoZSB0aHJlYWQgd2lsbCBpbnZva2UgdGhlIGJhY2tncm91bmRQcm9jZXNzIG1ldGhvZCBvbiB0aGlzIGhvc3QgCisgICAgICAgIGFuZCBhbGwgaXRzIGNoaWxkIGNvbnRhaW5lcnMuIEEgaG9zdCB3aWxsIHVzZSBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcgdG8KKyAgICAgICAgcGVyZm9ybSBsaXZlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IHJlbGF0ZWQgdGFza3MuIElmIG5vdCAKKyAgICAgICAgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUgaXMgLTEsIHdoaWNoIG1lYW5zIAorICAgICAgICB0aGUgaG9zdCB3aWxsIHJlbHkgb24gdGhlIGJhY2tncm91bmQgcHJvY2Vzc2luZyB0aHJlYWQgb2YgaXRzIHBhcmVudCAKKyAgICAgICAgZW5naW5lLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UuICBUaGlzIGNsYXNzIG11c3QKKyAgICAgICAgaW1wbGVtZW50IHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q8L2NvZGU+IGludGVyZmFjZS4KKyAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHN0YW5kYXJkIHZhbHVlIChkZWZpbmVkIGJlbG93KSB3aWxsIGJlIHVzZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVwbG95T25TdGFydHVwIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGlzIGZsYWcgdmFsdWUgaW5kaWNhdGVzIGlmIHdlYiBhcHBsaWNhdGlvbnMgZnJvbSB0aGlzIGhvc3Qgc2hvdWxkCisgICAgICAgIGJlIGF1dG9tYXRpY2FsbHkgZGVwbG95ZWQgYnkgdGhlIGhvc3QgY29uZmlndXJhdG9yLgorICAgICAgICBUaGUgZmxhZydzIHZhbHVlIGRlZmF1bHRzIHRvIHRydWUuICBTZWUKKyAgICAgICAgPGEgaHJlZj0iI0F1dG9tYXRpYyBBcHBsaWNhdGlvbiBEZXBsb3ltZW50Ij5BdXRvbWF0aWMgQXBwbGljYXRpb24KKyAgICAgICAgRGVwbG95bWVudDwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5OZXR3b3JrIG5hbWUgb2YgdGhpcyB2aXJ0dWFsIGhvc3QsIGFzIHJlZ2lzdGVyZWQgaW4geW91cgorICAgICAgICA8ZW0+RG9tYWluIE5hbWUgU2VydmljZTwvZW0+IHNlcnZlci4gIE9uZSBvZiB0aGUgSG9zdHMgbmVzdGVkIHdpdGhpbgorICAgICAgICBhbiA8YSBocmVmPSJlbmdpbmUuaHRtbCI+RW5naW5lPC9hPiBNVVNUIGhhdmUgYSBuYW1lIHRoYXQgbWF0Y2hlcyB0aGUKKyAgICAgICAgPGNvZGU+ZGVmYXVsdEhvc3Q8L2NvZGU+IHNldHRpbmcgZm9yIHRoYXQgRW5naW5lLiAgU2VlCisgICAgICAgIDxhIGhyZWY9IiNIb3N0IE5hbWUgQWxpYXNlcyI+SG9zdCBOYW1lIEFsaWFzZXM8L2E+IGZvciBpbmZvcm1hdGlvbgorICAgICAgICBvbiBob3cgdG8gYXNzaWduIG1vcmUgdGhhbiBvbmUgbmV0d29yayBuYW1lIHRvIHRoZSBzYW1lCisgICAgICAgIHZpcnR1YWwgaG9zdC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBJbXBsZW1lbnRhdGlvbiI+CisKKyAgICA8cD5UaGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5Ib3N0PC9zdHJvbmc+IGlzCisgICAgPHN0cm9uZz5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0PC9zdHJvbmc+LgorICAgIEl0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIChpbiBhZGRpdGlvbiB0byB0aGUKKyAgICBjb21tb24gYXR0cmlidXRlcyBsaXN0ZWQgYWJvdmUpOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlcGxveVhNTCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+U2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHBhcnNpbmcgdGhlIGNvbnRleHQueG1sCisgICAgICAgIGZpbGUgZW1iZWRkZWQgaW5zaWRlIHRoZSBhcHBsaWNhdGlvbiAobG9jYXRlZCBhdCA8Y29kZT4vTUVUQS1JTkYvY29udGV4dC54bWw8L2NvZGU+KS4gCisgICAgICAgIFNlY3VyaXR5IGNvbnNpb3VzIGVudmlyb25tZW50cyBzaG91bGQgc2V0IHRoaXMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHByZXZlbnQKKyAgICAgICAgYXBwbGljYXRpb25zIGZyb20gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgY29udGFpbmVyJ3MgY29uZmlndXJhdGlvbi4gVGhlIAorICAgICAgICBhZG1pbmlzdHJhdG9yIHdpbGwgdGhlbiBiZSByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGFuIGV4dGVybmFsIGNvbnRleHQgCisgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSwgYW5kIHB1dCBpdCBpbiAKKyAgICAgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9bZW5naW5lbmFtZV0vW2hvc3RuYW1lXS88L2NvZGU+LgorICAgICAgICBUaGUgZmxhZydzIHZhbHVlIGRlZmF1bHRzIHRvIDxjb2RlPnRydWU8L2NvZGU+LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImVycm9yUmVwb3J0VmFsdmVDbGFzcyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBlcnJvciByZXBvcnRpbmcgdmFsdmUgd2hpY2ggd2lsbCBiZSB1c2VkCisgICAgICAgIGJ5IHRoaXMgSG9zdC4gVGhlIHJlc3BvbnNhYmlsaXR5IG9mIHRoaXMgdmFsdmUgaXMgdG8gb3V0cHV0IGVycm9yCisgICAgICAgIHJlcG9ydHMuIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBhbGxvd3MgdG8gY3VzdG9taXplIHRoZSBsb29rIG9mIHRoZQorICAgICAgICBlcnJvciBwYWdlcyB3aGljaCB3aWxsIGJlIGdlbmVyYXRlZCBieSBUb21jYXQuIFRoaXMgY2xhc3MgbXVzdAorICAgICAgICBpbXBsZW1lbnQgdGhlCisgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU8L2NvZGU+IGludGVyZmFjZS4gSWYgbm9uZSBpcyBzcGVjaWZpZWQsCisgICAgICAgIHRoZSB2YWx1ZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5FcnJvclJlcG9ydFZhbHZlPC9jb2RlPgorICAgICAgICB3aWxsIGJlIHVzZWQgYnkgZGVmYXVsdC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1bnBhY2tXQVJzIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5TZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdhbnQgd2ViIGFwcGxpY2F0aW9ucyB0aGF0IGFyZQorICAgICAgICBwbGFjZWQgaW4gdGhlIDxjb2RlPmFwcEJhc2U8L2NvZGU+IGRpcmVjdG9yeSBhcyB3ZWIgYXBwbGljYXRpb24KKyAgICAgICAgYXJjaGl2ZSAoV0FSKSBmaWxlcyB0byBiZSB1bnBhY2tlZCBpbnRvIGEgY29ycmVzcG9uZGluZyBkaXNrIGRpcmVjdG9yeQorICAgICAgICBzdHJ1Y3R1cmUsIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBydW4gc3VjaCB3ZWIgYXBwbGljYXRpb25zIGRpcmVjdGx5CisgICAgICAgIGZyb20gYSBXQVIgZmlsZS4gIFNlZQorICAgICAgICA8YSBocmVmPSIjQXV0b21hdGljIEFwcGxpY2F0aW9uIERlcGxveW1lbnQiPkF1dG9tYXRpYyBBcHBsaWNhdGlvbgorICAgICAgICBEZXBsb3ltZW50PC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3b3JrRGlyIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5QYXRobmFtZSB0byBhIHNjcmF0Y2ggZGlyZWN0b3J5IHRvIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zIGZvcgorICAgICAgICB0aGlzIEhvc3QuIEVhY2ggYXBwbGljYXRpb24gd2lsbCBoYXZlIGl0cyBvd24gc3ViIGRpcmVjdG9yeSB3aXRoCisgICAgICAgIHRlbXBvcmFyeSByZWFkLXdyaXRlIHVzZS4gIENvbmZpZ3VyaW5nIGEgQ29udGV4dCB3b3JrRGlyIHdpbGwgb3ZlcnJpZGUKKyAgICAgICAgdXNlIG9mIHRoZSBIb3N0IHdvcmtEaXIgY29uZmlndXJhdGlvbi4gIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgbWFkZQorICAgICAgICB2aXNpYmxlIHRvIHNlcnZsZXRzIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gYnkgYSBzZXJ2bGV0IGNvbnRleHQKKyAgICAgICAgYXR0cmlidXRlIChvZiB0eXBlIDxjb2RlPmphdmEuaW8uRmlsZTwvY29kZT4pIG5hbWVkCisgICAgICAgIDxjb2RlPmphdmF4LnNlcnZsZXQuY29udGV4dC50ZW1wZGlyPC9jb2RlPiBhcyBkZXNjcmliZWQgaW4gdGhlCisgICAgICAgIFNlcnZsZXQgU3BlY2lmaWNhdGlvbi4gIElmIG5vdCBzcGVjaWZpZWQsIGEgc3VpdGFibGUgZGlyZWN0b3J5CisgICAgICAgIHVuZGVybmVhdGggPGNvZGU+JENBVEFMSU5BX0hPTUUvd29yazwvY29kZT4gd2lsbCBiZSBwcm92aWRlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ik5lc3RlZCBDb21wb25lbnRzIj4KKworICA8cD5Zb3UgY2FuIG5lc3Qgb25lIG9yIG1vcmUgPGEgaHJlZj0iY29udGV4dC5odG1sIj5Db250ZXh0PC9hPiBlbGVtZW50cworICBpbnNpZGUgdGhpcyA8c3Ryb25nPkhvc3Q8L3N0cm9uZz4gZWxlbWVudCwgZWFjaCByZXByZXNlbnRpbmcgYSBkaWZmZXJlbnQgd2ViCisgIGFwcGxpY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZpcnR1YWwgaG9zdC48L3A+CisKKyAgPHA+WW91IGNhbiBuZXN0IGF0IG1vc3Qgb25lIGluc3RhbmNlIG9mIHRoZSBmb2xsb3dpbmcgdXRpbGl0eSBjb21wb25lbnRzCisgIGJ5IG5lc3RpbmcgYSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW5zaWRlIHlvdXIgPHN0cm9uZz5Ib3N0PC9zdHJvbmc+CisgIGVsZW1lbnQ6PC9wPgorICA8dWw+CisgIDxsaT48YSBocmVmPSJyZWFsbS5odG1sIj48c3Ryb25nPlJlYWxtPC9zdHJvbmc+PC9hPiAtCisgICAgICBDb25maWd1cmUgYSByZWFsbSB0aGF0IHdpbGwgYWxsb3cgaXRzCisgICAgICBkYXRhYmFzZSBvZiB1c2VycywgYW5kIHRoZWlyIGFzc29jaWF0ZWQgcm9sZXMsIHRvIGJlIHNoYXJlZCBhY3Jvc3MgYWxsCisgICAgICA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHRzPC9hPiBuZXN0ZWQgaW5zaWRlIHRoaXMgSG9zdCAodW5sZXNzCisgICAgICBvdmVycmlkZGVuIGJ5IGEgPGEgaHJlZj0icmVhbG0uaHRtbCI+UmVhbG08L2E+IGNvbmZpZ3VyYXRpb24KKyAgICAgIGF0IGEgbG93ZXIgbGV2ZWwpLjwvbGk+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJTcGVjaWFsIEZlYXR1cmVzIj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkxvZ2dpbmciPgorCisgICAgPHA+QSBob3N0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgCisgICAgICAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkNvbnRhaW5lckJhc2UuW2VuZ2luZW5hbWVdLltob3N0bmFtZV08L2NvZGU+CisgICAgICAgbG9nIGNhdGVnb3J5LiAgTm90ZSB0aGF0IHRoZSBicmFja2V0cyBhcmUgYWN0dWFsbCBwYXJ0IG9mIHRoZSBuYW1lLAorICAgICAgIGRvbid0IG9taXQgdGhlbS48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQWNjZXNzIExvZ3MiPgorCisgICAgPHA+V2hlbiB5b3UgcnVuIGEgd2ViIHNlcnZlciwgb25lIG9mIHRoZSBvdXRwdXQgZmlsZXMgbm9ybWFsbHkgZ2VuZXJhdGVkCisgICAgaXMgYW4gPGVtPmFjY2VzcyBsb2c8L2VtPiwgd2hpY2ggZ2VuZXJhdGVzIG9uZSBsaW5lIG9mIGluZm9ybWF0aW9uIGZvcgorICAgIGVhY2ggcmVxdWVzdCBwcm9jZXNzZWQgYnkgdGhlIHNlcnZlciwgaW4gYSBzdGFuZGFyZCBmb3JtYXQuICBDYXRhbGluYQorICAgIGluY2x1ZGVzIGFuIG9wdGlvbmFsIDxhIGhyZWY9InZhbHZlLmh0bWwiPlZhbHZlPC9hPiBpbXBsZW1lbnRhdGlvbiB0aGF0CisgICAgY2FuIGNyZWF0ZSBhY2Nlc3MgbG9ncyBpbiB0aGUgc2FtZSBzdGFuZGFyZCBmb3JtYXQgY3JlYXRlZCBieSB3ZWIgc2VydmVycywKKyAgICBvciBpbiBhbnkgbnVtYmVyIG9mIGN1c3RvbSBmb3JtYXRzLjwvcD4KKworICAgIDxwPllvdSBjYW4gYXNrIENhdGFsaW5hIHRvIGNyZWF0ZSBhbiBhY2Nlc3MgbG9nIGZvciBhbGwgcmVxdWVzdHMKKyAgICBwcm9jZXNzZWQgYnkgYW4gPGEgaHJlZj0iZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4sCisgICAgPGEgaHJlZj0iaG9zdC5odG1sIj5Ib3N0PC9hPiwgb3IgPGEgaHJlZj0iY29udGV4dC5odG1sIj5Db250ZXh0PC9hPgorICAgIGJ5IG5lc3RpbmcgYSA8YSBocmVmPSJ2YWx2ZS5odG1sIj5WYWx2ZTwvYT4gZWxlbWVudCBsaWtlIHRoaXM6PC9wPgorCis8c291cmNlPgorJmx0O0hvc3QgbmFtZT0ibG9jYWxob3N0IiAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5BY2Nlc3NMb2dWYWx2ZSIKKyAgICAgICAgIHByZWZpeD0ibG9jYWxob3N0X2FjY2Vzc19sb2cuIiBzdWZmaXg9Ii50eHQiCisgICAgICAgICBwYXR0ZXJuPSJjb21tb24iLyZndDsKKyAgLi4uCismbHQ7L0hvc3QmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPlNlZSA8YSBocmVmPSJ2YWx2ZS5odG1sI0FjY2VzcyBMb2cgVmFsdmUiPkFjY2VzcyBMb2cgVmFsdmU8L2E+CisgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcyB0aGF0IGFyZQorICAgIHN1cHBvcnRlZC48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQXV0b21hdGljIEFwcGxpY2F0aW9uIERlcGxveW1lbnQiPgorCisgICAgPHA+SWYgeW91IGFyZSB1c2luZyB0aGUgc3RhbmRhcmQgPHN0cm9uZz5Ib3N0PC9zdHJvbmc+IGltcGxlbWVudGF0aW9uLAorICAgIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyB0YWtlIHBsYWNlIGF1dG9tYXRpY2FsbHkgd2hlbiBDYXRhbGluYSBpcyBmaXJzdAorICAgIHN0YXJ0ZWQsIGlmIHRoZSA8Y29kZT5kZXBsb3lPblN0YXJ0dXA8L2NvZGU+IHByb3BlcnR5IGlzIHNldCB0bworICAgIDxjb2RlPnRydWU8L2NvZGU+ICh3aGljaCBpcyB0aGUgZGVmYXVsdCB2YWx1ZSk6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+QW55IFhNTCBmaWxlIGluIHRoZSAKKyAgICAgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9bZW5naW5lX25hbWVdL1tob3N0X25hbWVdPC9jb2RlPiBkaXJlY3RvcnkgaXMKKyAgICAgICAgYXNzdW1lZCB0byBjb250YWluIGEKKyAgICAgICAgPGEgaHJlZj0iY29udGV4dC5odG1sIj5Db250ZXh0PC9hPiBlbGVtZW50IChhbmQgaXRzIGFzc29jaWF0ZWQKKyAgICAgICAgc3ViZWxlbWVudHMpIGZvciBhIHNpbmdsZSB3ZWIgYXBwbGljYXRpb24uICBUaGUgPGNvZGU+ZG9jQmFzZTwvY29kZT4KKyAgICAgICAgYXR0cmlidXRlIG9mIHRoaXMgPGNvZGU+Jmx0O0NvbnRleHQmZ3Q7PC9jb2RlPiBlbGVtZW50IHdpbGwgdHlwaWNhbGx5CisgICAgICAgIGJlIHRoZSBhYnNvbHV0ZSBwYXRobmFtZSB0byBhIHdlYiBhcHBsaWNhdGlvbiBkaXJlY3RvcnksIG9yIHRoZQorICAgICAgICBhYnNvbHV0ZSBwYXRobmFtZSBvZiBhIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIChXQVIpIGZpbGUgKHdoaWNoCisgICAgICAgIHdpbGwgbm90IGJlIGV4cGFuZGVkKS4gVGhlIHBhdGggYXR0cmlidXRlIHdpbGwgYmUgYXV0b21hdGljYWxseSBzZXQKKyAgICAgICAgYXMgZGVmaW5lZCBpbiB0aGUgPGEgaHJlZj0iY29udGV4dC5odG1sIj5Db250ZXh0PC9hPiBkb2N1bWVudGF0aW9uLjwvbGk+CisgICAgPGxpPkFueSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSBmaWxlIHdpdGhpbiB0aGUgYXBwbGljYXRpb24gYmFzZSAoYXBwQmFzZSkKKyAgICAgICAgZGlyZWN0b3J5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgZGlyZWN0b3J5IG9mIHRoZSBzYW1lIG5hbWUgKHdpdGhvdXQgdGhlICIud2FyIiBleHRlbnNpb24pIHdpbGwgYmUKKyAgICAgICAgYXV0b21hdGljYWxseSBleHBhbmRlZCwgdW5sZXNzIHRoZSA8Y29kZT51bnBhY2tXQVJzPC9jb2RlPiBwcm9wZXJ0eQorICAgICAgICBpcyBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LiAgSWYgeW91IHJlZGVwbG95IGFuIHVwZGF0ZWQgV0FSIGZpbGUsCisgICAgICAgIGJlIHN1cmUgdG8gZGVsZXRlIHRoZSBleHBhbmRlZCBkaXJlY3Rvcnkgd2hlbiByZXN0YXJ0aW5nIFRvbWNhdCwgc28KKyAgICAgICAgdGhhdCB0aGUgdXBkYXRlZCBXQVIgZmlsZSB3aWxsIGJlIHJlLWV4cGFuZGVkIChub3RlIHRoYXQgdGhlIGF1dG8KKyAgICAgICAgZGVwbG95ZXIsIGlmIGVuYWJsZWQsIHdpbGwgYXV0b21hdGljYWxseSBleHBhbmQgdGhlIHVwZGF0ZWQgV0FSIGZpbGUKKyAgICAgICAgb25jZSB0aGUgcHJldmlvdXNseSBleHBhbmRlZCBkaXJlY3RvcnkgaXMgcmVtb3ZlZCkuPC9saT4KKyAgICA8bGk+QW55IHN1YmRpcmVjdG9yeSB3aXRoaW4gdGhlIDxlbT5hcHBsaWNhdGlvbiBiYXNlIGRpcmVjdG9yeTwvZW0+CisgICAgICAgIHdpbGwgcmVjZWl2ZSBhbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPgorICAgICAgICBDb250ZXh0PC9hPiBlbGVtZW50LCBldmVuIGlmIHRoaXMgZGlyZWN0b3J5IGlzIG5vdCBtZW50aW9uZWQgaW4gdGhlCisgICAgICAgIDxjb2RlPmNvbmYvc2VydmVyLnhtbDwvY29kZT4gZmlsZS4KKyAgICAgICAgVGhpcyBnZW5lcmF0ZWQgQ29udGV4dCBlbnRyeSB3aWxsIGJlIGNvbmZpZ3VyZWQgYWNjb3JkaW5nIHRvIHRoZQorICAgICAgICBkZWZhdWx0cyBjb25maWd1cmVkIGZvciB0aGlzIEhvc3QgZWxlbWVudC4gIFRoZSBjb250ZXh0IHBhdGggZm9yIHRoaXMKKyAgICAgICAgZGVwbG95ZWQgQ29udGV4dCB3aWxsIGJlIGEgc2xhc2ggY2hhcmFjdGVyICgiLyIpIGZvbGxvd2VkIGJ5IHRoZQorICAgICAgICBkaXJlY3RvcnkgbmFtZSwgdW5sZXNzIHRoZSBkaXJlY3RvcnkgbmFtZSBpcyBST09ULCBpbiB3aGljaCBjYXNlCisgICAgICAgIHRoZSBjb250ZXh0IHBhdGggd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcgKCIiKS48L2xpPgorICAgIDwvdWw+CisKKyAgICA8cD5JbiBhZGRpdGlvbiB0byB0aGUgYXV0b21hdGljIGRlcGxveW1lbnQgdGhhdCBvY2N1cnMgYXQgc3RhcnR1cCB0aW1lLAorICAgIHlvdSBjYW4gYWxzbyByZXF1ZXN0IHRoYXQgbmV3IFhNTCBjb25maWd1cmF0aW9uIGZpbGVzLCBXQVIgZmlsZXMsIG9yCisgICAgc3ViZGlyZWN0b3JpZXMgdGhhdCBhcmUgZHJvcHBlZCBpbiB0byB0aGUgPGNvZGU+YXBwQmFzZTwvY29kZT4gKG9yIAorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvW2VuZ2luZV9uYW1lXS9baG9zdF9uYW1lXTwvY29kZT4gaW4gdGhlIGNhc2Ugb2YKKyAgICBhbiBYTUwgY29uZmlndXJhdGlvbiBmaWxlKSBkaXJlY3Rvcnkgd2hpbGUgVG9tY2F0IGlzIHJ1bm5pbmcgd2lsbCBiZQorICAgIGF1dG9tYXRpY2FsbHkgZGVwbG95ZWQsIGFjY29yZGluZyB0byB0aGUgcnVsZXMgZGVzY3JpYmVkIGFib3ZlLiBUaGUgCisgICAgYXV0byBkZXBsb3llciB3aWxsIGFsc28gdHJhY2sgd2ViIGFwcGxpY2F0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgorICAgIDx1bD4KKyAgICAgICAgPGxpPkFuIHVwZGF0ZSB0byB0aGUgV0VCLUlORi93ZWIueG1sIGZpbGUgd2lsbCB0cmlnZ2VyIGEgcmVsb2FkIG9mIHRoZQorICAgICAgICB3ZWIgYXBwbGljYXRpb248L2xpPgorICAgICAgICA8bGk+QW4gdXBkYXRlIHRvIGEgV0FSIHdoaWNoIGhhcyBiZWVuIGV4cGFuZGVkIHdpbGwgdHJpZ2dlciAKKyAgICAgICAgYW4gdW5kZXBsb3kgKDxzdHJvbmc+d2l0aCBhIHJlbW92YWwgb2YgdGhlIGV4cGFuZGVkIHdlYmFwcDwvc3Ryb25nPiksIAorICAgICAgICBmb2xsb3dlZCBieSBhIGRlcGxveW1lbnQ8L2xpPgorICAgICAgICA8bGk+QW4gdXBkYXRlIHRvIGEgWE1MIGNvbmZpZ3VyYXRpb24gZmlsZSB3aWxsIHRyaWdnZXIgYW4gdW5kZXBsb3kKKyAgICAgICAgKHdpdGhvdXQgdGhlIHJlbW92YWwgb2YgYW55IGV4cGFuZGVkIGRpcmVjdG9yeSksIGZvbGxvd2VkIGJ5IAorICAgICAgICBhIGRlcGxveW1lbnQgb2YgdGhlIGFzc29jaWF0ZWQgd2ViIGFwcGxpY2F0aW9uPC9saT4KKyAgICA8L3VsPgorICAgIDwvcD4KKworICAgIDxwPldoZW4gdXNpbmcgYXV0b21hdGljIGRlcGxveW1lbnQsIHRoZSA8Y29kZT5kb2NCYXNlPC9jb2RlPiBkZWZpbmVkIGJ5CisgICAgYW4gWE1MIDxhIGhyZWY9ImNvbnRleHQuaHRtbCI+Q29udGV4dDwvYT4gZmlsZSBzaG91bGQgYmUgb3V0c2lkZSBvZiB0aGUKKyAgICA8Y29kZT5hcHBCYXNlPC9jb2RlPiBkaXJlY3RvcnkuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlIGRpZmZpY3VsdGllcworICAgIG1heSBiZSBleHBlcmllbmNlZCBkZXBsb3lpbmcgdGhlIHdlYiBhcHBsaWNhdGlvbiBvciB0aGUgYXBwbGljYXRpb24gbWF5CisgICAgYmUgZGVwbG95ZWQgdHdpY2UuPC9wPgorCisgICAgPHA+RmluYWxseSwgbm90ZSB0aGF0IGlmIHlvdSBhcmUgZGVmaW5pbmcgY29udGV4dHMgZXhwbGljaXRseSwgeW91IHNob3VsZAorICAgIHByb2JhYmx5IHR1cm4gb2ZmIGF1dG9tYXRpYyBhcHBsaWNhdGlvbiBkZXBsb3ltZW50LiAgT3RoZXJ3aXNlLCB5b3VyIGNvbnRleHQKKyAgICB3aWxsIGJlIGRlcGxveWVkIHR3aWNlIGVhY2gsIGFuZCB0aGF0IG1heSBjYXVzZSBwcm9ibGVtcyBmb3IgeW91ciBhcHAuCisgICAgPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9Ikhvc3QgTmFtZSBBbGlhc2VzIj4KKworICAgIDxwPkluIG1hbnkgc2VydmVyIGVudmlyb25tZW50cywgTmV0d29yayBBZG1pbmlzdHJhdG9ycyBoYXZlIGNvbmZpZ3VyZWQKKyAgICBtb3JlIHRoYW4gb25lIG5ldHdvcmsgbmFtZSAoaW4gdGhlIDxlbT5Eb21haW4gTmFtZSBTZXJ2aWNlPC9lbT4gKEROUykKKyAgICBzZXJ2ZXIpLCB0aGF0IHJlc29sdmUgdG8gdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHNhbWUgc2VydmVyLiAgTm9ybWFsbHksCisgICAgZWFjaCBzdWNoIG5ldHdvcmsgbmFtZSB3b3VsZCBiZSBjb25maWd1cmVkIGFzIGEgc2VwYXJhdGUKKyAgICA8c3Ryb25nPkhvc3Q8L3N0cm9uZz4gZWxlbWVudCBpbiA8Y29kZT5jb25mL3NlcnZlci54bWw8L2NvZGU+LCBlYWNoCisgICAgd2l0aCBpdHMgb3duIHNldCBvZiB3ZWIgYXBwbGljYXRpb25zLjwvcD4KKworICAgIDxwPkhvd2V2ZXIsIGluIHNvbWUgY2lyY3Vtc3RhbmNlcywgaXQgaXMgZGVzaXJlYWJsZSB0aGF0IHR3byBvciBtb3JlCisgICAgbmV0d29yayBuYW1lcyBzaG91bGQgcmVzb2x2ZSB0byB0aGUgPHN0cm9uZz5zYW1lPC9zdHJvbmc+IHZpcnR1YWwgaG9zdCwKKyAgICBydW5uaW5nIHRoZSBzYW1lIHNldCBvZiBhcHBsaWNhdGlvbnMuICBBIGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcworICAgIHNjZW5hcmlvIGlzIGEgY29ycG9yYXRlIHdlYiBzaXRlLCB3aGVyZSBpdCBpcyBkZXNpcmVhYmxlIHRoYXQgdXNlcnMKKyAgICBiZSBhYmxlIHRvIHV0aWxpemUgZWl0aGVyIDxjb2RlPnd3dy5teWNvbXBhbnkuY29tPC9jb2RlPiBvcgorICAgIDxjb2RlPmNvbXBhbnkuY29tPC9jb2RlPiB0byBhY2Nlc3MgZXhhY3RseSB0aGUgc2FtZSBjb250ZW50IGFuZAorICAgIGFwcGxpY2F0aW9ucy48L3A+CisKKyAgICA8cD5UaGlzIGlzIGFjY29tcGxpc2hlZCBieSB1dGlsaXppbmcgb25lIG9yIG1vcmUgPHN0cm9uZz5BbGlhczwvc3Ryb25nPgorICAgIGVsZW1lbnRzIG5lc3RlZCBpbnNpZGUgeW91ciA8c3Ryb25nPkhvc3Q8L3N0cm9uZz4gZWxlbWVudC4gIEZvcgorICAgIGV4YW1wbGU6PC9wPgorPHNvdXJjZT4KKyZsdDtIb3N0IG5hbWU9Ind3dy5teWNvbXBhbnkuY29tIiAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7QWxpYXMmZ3Q7bXljb21wYW55LmNvbSZsdDsvQWxpYXMmZ3Q7CisgIC4uLgorJmx0Oy9Ib3N0Jmd0OworPC9zb3VyY2U+CisKKyAgICA8cD5JbiBvcmRlciBmb3IgdGhpcyBzdHJhdGVneSB0byBiZSBlZmZlY3RpdmUsIGFsbCBvZiB0aGUgbmV0d29yayBuYW1lcworICAgIGludm9sdmVkIG11c3QgYmUgcmVnaXN0ZXJlZCBpbiB5b3VyIEROUyBzZXJ2ZXIgdG8gcmVzb2x2ZSB0byB0aGUKKyAgICBzYW1lIGNvbXB1dGVyIHRoYXQgaXMgcnVubmluZyB0aGlzIGluc3RhbmNlIG9mIENhdGFsaW5hLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJMaWZlY3ljbGUgTGlzdGVuZXJzIj4KKworICAgIDxwPklmIHlvdSBoYXZlIGltcGxlbWVudGVkIGEgSmF2YSBvYmplY3QgdGhhdCBuZWVkcyB0byBrbm93IHdoZW4gdGhpcworICAgIDxzdHJvbmc+SG9zdDwvc3Ryb25nPiBpcyBzdGFydGVkIG9yIHN0b3BwZWQsIHlvdSBjYW4gZGVjbGFyZSBpdCBieQorICAgIG5lc3RpbmcgYSA8c3Ryb25nPkxpc3RlbmVyPC9zdHJvbmc+IGVsZW1lbnQgaW5zaWRlIHRoaXMgZWxlbWVudC4gIFRoZQorICAgIGNsYXNzIG5hbWUgeW91IHNwZWNpZnkgbXVzdCBpbXBsZW1lbnQgdGhlCisgICAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjwvY29kZT4gaW50ZXJmYWNlLCBhbmQKKyAgICBpdCB3aWxsIGJlIG5vdGlmaWVkIGFib3V0IHRoZSBvY2N1cnJlbmNlIG9mIHRoZSBjb3Jlc3BvbmRpbmcKKyAgICBsaWZlY3ljbGUgZXZlbnRzLiAgQ29uZmlndXJhdGlvbiBvZiBzdWNoIGEgbGlzdGVuZXIgbG9va3MgbGlrZSB0aGlzOjwvcD4KKworPHNvdXJjZT4KKyZsdDtIb3N0IG5hbWU9ImxvY2FsaG9zdCIgLi4uJmd0OworICAuLi4KKyAgJmx0O0xpc3RlbmVyIGNsYXNzTmFtZT0iY29tLm15Y29tcGFueS5teXBhY2thZ2UuTXlMaXN0ZW5lciIgLi4uICZndDsKKyAgLi4uCismbHQ7L0hvc3QmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPk5vdGUgdGhhdCBhIExpc3RlbmVyIGNhbiBoYXZlIGFueSBudW1iZXIgb2YgYWRkaXRpb25hbCBwcm9wZXJ0aWVzCisgICAgdGhhdCBtYXkgYmUgY29uZmlndXJlZCBmcm9tIHRoaXMgZWxlbWVudC4gIEF0dHJpYnV0ZSBuYW1lcyBhcmUgbWF0Y2hlZAorICAgIHRvIGNvcnJlc3BvbmRpbmcgSmF2YUJlYW4gcHJvcGVydHkgbmFtZXMgdXNpbmcgdGhlIHN0YW5kYXJkIHByb3BlcnR5CisgICAgbWV0aG9kIG5hbWluZyBwYXR0ZXJucy48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iUmVxdWVzdCBGaWx0ZXJzIj4KKworICAgIDxwPllvdSBjYW4gYXNrIENhdGFsaW5hIHRvIGNoZWNrIHRoZSBJUCBhZGRyZXNzLCBvciBob3N0IG5hbWUsIG9uIGV2ZXJ5CisgICAgaW5jb21pbmcgcmVxdWVzdCBkaXJlY3RlZCB0byB0aGUgc3Vycm91bmRpbmcKKyAgICA8YSBocmVmPSJlbmdpbmUuaHRtbCI+RW5naW5lPC9hPiwgPGEgaHJlZj0iaG9zdC5odG1sIj5Ib3N0PC9hPiwgb3IKKyAgICA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+IGVsZW1lbnQuICBUaGUgcmVtb3RlIGFkZHJlc3Mgb3IgbmFtZQorICAgIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGEgY29uZmlndXJlZCBsaXN0IG9mICJhY2NlcHQiIGFuZC9vciAiZGVueSIKKyAgICBmaWx0ZXJzLCB3aGljaCBhcmUgZGVmaW5lZCB1c2luZyB0aGUgUmVndWxhciBFeHByZXNzaW9uIHN5bnRheCBzdXBwb3J0ZWQKKyAgICBieSB0aGUgc3RhbmRhcmQgSmF2YSA8Y29kZT5qYXZhLnV0aWwucmVnZXg8L2NvZGU+IHJlZ3VsYXIgZXhwcmVzc2lvbiBsaWJyYXJ5LiAgUmVxdWVzdHMgCisgICAgdGhhdCBjb21lIGZyb20gbG9jYXRpb25zIHRoYXQgYXJlIG5vdCBhY2NlcHRlZCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gSFRUUCAiRm9yYmlkZGVuIiBlcnJvci4KKyAgICBFeGFtcGxlIGZpbHRlciBkZWNsYXJhdGlvbnM6PC9wPgorCis8c291cmNlPgorJmx0O0hvc3QgbmFtZT0ibG9jYWxob3N0IiAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZW1vdGVIb3N0VmFsdmUiCisgICAgICAgICBhbGxvdz0iKi5teWNvbXBhbnkuY29tLHd3dy55b3VyY29tcGFueS5jb20iLyZndDsKKyAgJmx0O1ZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVtb3RlQWRkclZhbHZlIgorICAgICAgICAgZGVueT0iMTkyLjE2OC4xLioiLyZndDsKKyAgLi4uCismbHQ7L0hvc3QmZ3Q7Cis8L3NvdXJjZT4KKworICA8cD5TZWUgPGEgaHJlZj0idmFsdmUuaHRtbCNSZW1vdGUgQWRkcmVzcyBGaWx0ZXIiPlJlbW90ZSBBZGRyZXNzIEZpbHRlcjwvYT4KKyAgYW5kIDxhIGhyZWY9InZhbHZlLmh0bWwjUmVtb3RlIEhvc3QgRmlsdGVyIj5SZW1vdGUgSG9zdCBGaWx0ZXI8L2E+IGZvcgorICBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBhcmUgc3VwcG9ydGVkLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJTaW5nbGUgU2lnbiBPbiI+CisKKyAgICA8cD5JbiBtYW55IGVudmlyb25tZW50cywgYnV0IHBhcnRpY3VsYXJseSBpbiBwb3J0YWwgZW52aXJvbm1lbnRzLCBpdAorICAgIGlzIGRlc2lyZWFibGUgdG8gaGF2ZSBhIHVzZXIgY2hhbGxlbmdlZCB0byBhdXRoZW50aWNhdGUgdGhlbXNlbHZlcyBvbmx5CisgICAgb25jZSBvdmVyIGEgc2V0IG9mIHdlYiBhcHBsaWNhdGlvbnMgZGVwbG95ZWQgb24gYSBwYXJ0aWN1bGFyIHZpcnR1YWwKKyAgICBob3N0LiAgVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IG5lc3RpbmcgYW4gZWxlbWVudCBsaWtlIHRoaXMgaW5zaWRlCisgICAgdGhlIEhvc3QgZWxlbWVudCBmb3IgdGhpcyB2aXJ0dWFsIGhvc3Q6PC9wPgorCis8c291cmNlPgorJmx0O0hvc3QgbmFtZT0ibG9jYWxob3N0IiAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuU2luZ2xlU2lnbk9uIiAvJmd0OworICAuLi4KKyZsdDsvSG9zdCZndDsKKzwvc291cmNlPgorCisgICAgPHA+VGhlIFNpbmdsZSBTaWduIE9uIGZhY2lsaXR5IG9wZXJhdGVzIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHJ1bGVzOgorICAgIDwvcD4KKyAgICA8dWw+CisgICAgPGxpPkFsbCB3ZWIgYXBwbGljYXRpb25zIGNvbmZpZ3VyZWQgZm9yIHRoaXMgdmlydHVhbCBob3N0IG11c3Qgc2hhcmUgdGhlCisgICAgICAgIHNhbWUgPGEgaHJlZj0icmVhbG0uaHRtbCI+UmVhbG08L2E+LiAgSW4gcHJhY3RpY2UsIHRoYXQgbWVhbnMgeW91IGNhbgorICAgICAgICBuZXN0IHRoZSBSZWFsbSBlbGVtZW50IGluc2lkZSB0aGlzIEhvc3QgZWxlbWVudCAob3IgdGhlIHN1cnJvdW5kaW5nCisgICAgICAgIDxhIGhyZWY9ImVuZ2luZS5odG1sIj5FbmdpbmU8L2E+IGVsZW1lbnQpLCBidXQgbm90IGluc2lkZSBhCisgICAgICAgIDxhIGhyZWY9ImNvbnRleHQuaHRtbCI+Q29udGV4dDwvYT4gZWxlbWVudCBmb3Igb25lIG9mIHRoZSBpbnZvbHZlZAorICAgICAgICB3ZWIgYXBwbGljYXRpb25zLjwvbGk+CisgICAgPGxpPkFzIGxvbmcgYXMgdGhlIHVzZXIgYWNjZXNzZXMgb25seSB1bnByb3RlY3RlZCByZXNvdXJjZXMgaW4gYW55IG9mIHRoZQorICAgICAgICB3ZWIgYXBwbGljYXRpb25zIG9uIHRoaXMgdmlydHVhbCBob3N0LCB0aGV5IHdpbGwgbm90IGJlIGNoYWxsZW5nZWQKKyAgICAgICAgdG8gYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMuPC9saT4KKyAgICA8bGk+QXMgc29vbiBhcyB0aGUgdXNlciBhY2Nlc3NlcyBhIHByb3RlY3RlZCByZXNvdXJjZSBpbgorICAgICAgICA8c3Ryb25nPmFueTwvc3Ryb25nPiB3ZWIgYXBwbGljYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmlydHVhbAorICAgICAgICBob3N0LCB0aGUgdXNlciB3aWxsIGJlIGNoYWxsZW5nZWQgdG8gYXV0aGVudGljYXRlIGhpbXNlbGYgb3IgaGVyc2VsZiwKKyAgICAgICAgdXNpbmcgdGhlIGxvZ2luIG1ldGhvZCBkZWZpbmVkIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uIGN1cnJlbnRseQorICAgICAgICBiZWluZyBhY2Nlc3NlZC48L2xpPgorICAgIDxsaT5PbmNlIGF1dGhlbnRpY2F0ZWQsIHRoZSByb2xlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB1c2VyIHdpbGwgYmUKKyAgICAgICAgdXRpbGl6ZWQgZm9yIGFjY2VzcyBjb250cm9sIGRlY2lzaW9ucyBhY3Jvc3MgPHN0cm9uZz5hbGw8L3N0cm9uZz4KKyAgICAgICAgb2YgdGhlIGFzc29jaWF0ZWQgd2ViIGFwcGxpY2F0aW9ucywgd2l0aG91dCBjaGFsbGVuZ2luZyB0aGUgdXNlcgorICAgICAgICB0byBhdXRoZW50aWNhdGUgdGhlbXNlbHZlcyB0byBlYWNoIGFwcGxpY2F0aW9uIGluZGl2aWR1YWxseS48L2xpPgorICAgIDxsaT5BcyBzb29uIGFzIHRoZSB1c2VyIGxvZ3Mgb3V0IG9mIG9uZSB3ZWIgYXBwbGljYXRpb24gKGZvciBleGFtcGxlLAorICAgICAgICBieSBpbnZhbGlkYXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgc2Vzc2lvbiBpZiBmb3JtCisgICAgICAgIGJhc2VkIGxvZ2luIGlzIHVzZWQpLCB0aGUgdXNlcidzIHNlc3Npb25zIGluIDxzdHJvbmc+YWxsPC9zdHJvbmc+CisgICAgICAgIHdlYiBhcHBsaWNhdGlvbnMgd2lsbCBiZSBpbnZhbGlkYXRlZC4gIEFueSBzdWJzZXF1ZW50IGF0dGVtcHQgdG8KKyAgICAgICAgYWNjZXNzIGEgcHJvdGVjdGVkIHJlc291cmNlIGluIGFueSBhcHBsaWNhdGlvbiB3aWxsIHJlcXVpcmUgdGhlCisgICAgICAgIHVzZXIgdG8gYXV0aGVudGljYXRlIGhpbXNlbGYgb3IgaGVyc2VsZiBhZ2Fpbi48L2xpPgorICAgIDxsaT5UaGUgU2luZ2xlIFNpZ24gT24gZmVhdHVyZSB1dGlsaXplcyBIVFRQIGNvb2tpZXMgdG8gdHJhbnNtaXQgYSB0b2tlbgorICAgICAgICB0aGF0IGFzc29jaWF0ZXMgZWFjaCByZXF1ZXN0IHdpdGggdGhlIHNhdmVkIHVzZXIgaWRlbnRpdHksIHNvIGl0IGNhbgorICAgICAgICBvbmx5IGJlIHV0aWxpemVkIGluIGNsaWVudCBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IGNvb2tpZXMuPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlVzZXIgV2ViIEFwcGxpY2F0aW9ucyI+CisKKyAgICA8cD5NYW55IHdlYiBzZXJ2ZXJzIGNhbiBhdXRvbWF0aWNhbGx5IG1hcCBhIHJlcXVlc3QgVVJJIHN0YXJ0aW5nIHdpdGgKKyAgICBhIHRpbGRlIGNoYXJhY3RlciAoIn4iKSBhbmQgYSB1c2VybmFtZSB0byBhIGRpcmVjdG9yeSAoY29tbW9ubHkgbmFtZWQKKyAgICA8Y29kZT5wdWJsaWNfaHRtbDwvY29kZT4pIGluIHRoYXQgdXNlcidzIGhvbWUgZGlyZWN0b3J5IG9uIHRoZSBzZXJ2ZXIuCisgICAgWW91IGNhbiBhY2NvbXBsaXNoIHRoZSBzYW1lIHRoaW5nIGluIENhdGFsaW5hIGJ5IHVzaW5nIGEgc3BlY2lhbAorICAgIDxzdHJvbmc+TGlzdGVuZXI8L3N0cm9uZz4gZWxlbWVudCBsaWtlIHRoaXMgKG9uIGEgVW5peCBzeXN0ZW0gdGhhdAorICAgIHVzZXMgdGhlIDxjb2RlPi9ldGMvcGFzc3dkPC9jb2RlPiBmaWxlIHRvIGlkZW50aWZ5IHZhbGlkIHVzZXJzKTo8L3A+CisKKzxzb3VyY2U+CismbHQ7SG9zdCBuYW1lPSJsb2NhbGhvc3QiIC4uLiZndDsKKyAgLi4uCisgICZsdDtMaXN0ZW5lciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Vc2VyQ29uZmlnIgorICAgICAgICAgICAgZGlyZWN0b3J5TmFtZT0icHVibGljX2h0bWwiCisgICAgICAgICAgICB1c2VyQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5QYXNzd2RVc2VyRGF0YWJhc2UiLyZndDsKKyAgLi4uCismbHQ7L0hvc3QmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPk9uIGEgc2VydmVyIHdoZXJlIDxjb2RlPi9ldGMvcGFzc3dkPC9jb2RlPiBpcyBub3QgaW4gdXNlLCB5b3UgY2FuCisgICAgcmVxdWVzdCBDYXRhbGluYSB0byBjb25zaWRlciBhbGwgZGlyZWN0b3JpZXMgZm91bmQgaW4gYSBzcGVjaWZpZWQgYmFzZQorICAgIGRpcmVjdG9yeSAoc3VjaCBhcyA8Y29kZT5jOlxIb21lczwvY29kZT4gaW4gdGhpcyBleGFtcGxlKSB0byBiZQorICAgIGNvbnNpZGVyZWQgInVzZXIgaG9tZSIgZGlyZWN0b3JpZXMgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRpcmVjdGl2ZTo8L3A+CisKKzxzb3VyY2U+CismbHQ7SG9zdCBuYW1lPSJsb2NhbGhvc3QiIC4uLiZndDsKKyAgLi4uCisgICZsdDtMaXN0ZW5lciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Vc2VyQ29uZmlnIgorICAgICAgICAgICAgZGlyZWN0b3J5TmFtZT0icHVibGljX2h0bWwiCisgICAgICAgICAgICBob21lQmFzZT0iYzpcSG9tZXMiCisgICAgICAgICAgICB1c2VyQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Ib21lc1VzZXJEYXRhYmFzZSIvJmd0OworICAuLi4KKyZsdDsvSG9zdCZndDsKKzwvc291cmNlPgorCisgICAgPHA+SWYgYSB1c2VyIGhvbWUgZGlyZWN0b3J5IGhhcyBiZWVuIHNldCB1cCBmb3IgYSB1c2VyIG5hbWVkCisgICAgPGNvZGU+Y3JhaWdtY2M8L2NvZGU+LCB0aGVuIGl0cyBjb250ZW50cyB3aWxsIGJlIHZpc2libGUgZnJvbSBhCisgICAgY2xpZW50IGJyb3dzZXIgYnkgbWFraW5nIGEgcmVxdWVzdCB0byBhIFVSTCBsaWtlOjwvcD4KKworPHNvdXJjZT4KK2h0dHA6Ly93d3cubXljb21wYW55LmNvbTo4MDgwL35jcmFpZ21jYworPC9zb3VyY2U+CisKKyAgICA8cD5TdWNjZXNzZnVsIHVzZSBvZiB0aGlzIGZlYXR1cmUgcmVxdWlyZXMgcmVjb2duaXRpb24gb2YgdGhlIGZvbGxvd2luZworICAgIGNvbnNpZGVyYXRpb25zOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkVhY2ggdXNlciB3ZWIgYXBwbGljYXRpb24gd2lsbCBiZSBkZXBsb3llZCB3aXRoIGNoYXJhY3RlcmlzdGljcworICAgICAgICBlc3RhYmxpc2hlZCBieSBhbnkgZGVmYXVsdHMgeW91IGhhdmUgY29uZmlndXJlZCBmb3IgdGhpcyBIb3N0LjwvbGk+CisgICAgPGxpPkl0IGlzIGxlZ2FsIHRvIGluY2x1ZGUgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZiB0aGlzIExpc3RlbmVyCisgICAgICAgIGVsZW1lbnQuICBUaGlzIHdvdWxkIG9ubHkgYmUgdXNlZnVsLCBob3dldmVyLCBpbiBjaXJjdW1zdGFuY2VzCisgICAgICAgIHdoZXJlIHlvdSB3YW50ZWQgdG8gY29uZmlndXJlIG1vcmUgdGhhbiBvbmUgImhvbWVCYXNlIiBkaXJlY3RvcnkuPC9saT4KKyAgICA8bGk+VGhlIG9wZXJhdGluZyBzeXN0ZW0gdXNlcm5hbWUgdW5kZXIgd2hpY2ggQ2F0YWxpbmEgaXMgZXhlY3V0ZWQKKyAgICAgICAgTVVTVCBoYXZlIHJlYWQgYWNjZXNzIHRvIGVhY2ggdXNlcidzIHdlYiBhcHBsaWNhdGlvbiBkaXJlY3RvcnksCisgICAgICAgIGFuZCBhbGwgb2YgaXRzIGNvbnRlbnRzLjwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKworCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvaHR0cC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9odHRwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTllZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvaHR0cC54bWwKQEAgLTAsMCArMSw0OTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJodHRwLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSJ5b2F2c0BhcGFjaGUub3JnIj5Zb2F2IFNoYXBpcmE8L2F1dGhvcj4KKyAgICA8dGl0bGU+VGhlIEhUVFAgQ29ubmVjdG9yPC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgIDxwPlRoZSA8c3Ryb25nPkhUVFAgQ29ubmVjdG9yPC9zdHJvbmc+IGVsZW1lbnQgcmVwcmVzZW50cyBhCisgIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+IGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIHRoZSBIVFRQLzEuMSBwcm90b2NvbC4KKyAgSXQgZW5hYmxlcyBDYXRhbGluYSB0byBmdW5jdGlvbiBhcyBhIHN0YW5kLWFsb25lIHdlYiBzZXJ2ZXIsIGluIGFkZGl0aW9uCisgIHRvIGl0cyBhYmlsaXR5IHRvIGV4ZWN1dGUgc2VydmxldHMgYW5kIEpTUCBwYWdlcy4gIEEgcGFydGljdWxhciBpbnN0YW5jZQorICBvZiB0aGlzIGNvbXBvbmVudCBsaXN0ZW5zIGZvciBjb25uZWN0aW9ucyBvbiBhIHNwZWNpZmljIFRDUCBwb3J0IG51bWJlcgorICBvbiB0aGUgc2VydmVyLiAgT25lIG9yIG1vcmUgc3VjaCA8c3Ryb25nPkNvbm5lY3RvcnM8L3N0cm9uZz4gY2FuIGJlCisgIGNvbmZpZ3VyZWQgYXMgcGFydCBvZiBhIHNpbmdsZSA8YSBocmVmPSJzZXJ2aWNlLmh0bWwiPlNlcnZpY2U8L2E+LCBlYWNoCisgIGZvcndhcmRpbmcgdG8gdGhlIGFzc29jaWF0ZWQgPGEgaHJlZj0iZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4gdG8gcGVyZm9ybQorICByZXF1ZXN0IHByb2Nlc3NpbmcgYW5kIGNyZWF0ZSB0aGUgcmVzcG9uc2UuPC9wPgorCisgIDxwPklmIHlvdSB3aXNoIHRvIGNvbmZpZ3VyZSB0aGUgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gdGhhdCBpcyB1c2VkCisgIGZvciBjb25uZWN0aW9ucyB0byB3ZWIgc2VydmVycyB1c2luZyB0aGUgQUpQIHByb3RvY29sIChzdWNoIGFzIHRoZQorICA8Y29kZT5tb2RfamsgMS4yLng8L2NvZGU+IGNvbm5lY3RvciBmb3IgQXBhY2hlIDEuMyksIHNlZQorICA8YSBocmVmPSJhanAuaHRtbCI+aGVyZTwvYT4gaW5zdGVhZC48L3A+CisKKyAgPHA+QXQgc2VydmVyIHN0YXJ0dXAgdGltZSwgdGhpcyA8c3Ryb25nPkNvbm5lY3Rvcjwvc3Ryb25nPiB3aWxsIGNyZWF0ZSBhCisgIG51bWJlciBvZiByZXF1ZXN0IHByb2Nlc3NpbmcgdGhyZWFkcyAoYmFzZWQgb24gdGhlIHZhbHVlIGNvbmZpZ3VyZWQgZm9yCisgIHRoZSA8Y29kZT5taW5TcGFyZVRocmVhZHM8L2NvZGU+IGF0dHJpYnV0ZSkuICBFYWNoIGluY29taW5nIHJlcXVlc3QgcmVxdWlyZXMKKyAgYSB0aHJlYWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGF0IHJlcXVlc3QuICBJZiBtb3JlIHNpbXVsdGFuZW91cyByZXF1ZXN0cworICBhcmUgcmVjZWl2ZWQgdGhhbiBjYW4gYmUgaGFuZGxlZCBieSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSByZXF1ZXN0CisgIHByb2Nlc3NpbmcgdGhyZWFkcywgYWRkaXRpb25hbCB0aHJlYWRzIHdpbGwgYmUgY3JlYXRlZCB1cCB0byB0aGUKKyAgY29uZmlndXJlZCBtYXhpbXVtICh0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPm1heFRocmVhZHM8L2NvZGU+IGF0dHJpYnV0ZSkuCisgIElmIHN0aWxsIG1vcmUgc2ltdWx0YW5lb3VzIHJlcXVlc3RzIGFyZSByZWNlaXZlZCwgdGhleSBhcmUgc3RhY2tlZCB1cAorICBpbnNpZGUgdGhlIHNlcnZlciBzb2NrZXQgY3JlYXRlZCBieSB0aGUgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4sIHVwIHRvCisgIHRoZSBjb25maWd1cmVkIG1heGltdW0gKHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+YWNjZXB0Q291bnQ8L2NvZGU+CisgIGF0dHJpYnV0ZS4gIEFueSBmdXJ0aGVyIHNpbXVsdGFuZW91cyByZXF1ZXN0cyB3aWxsIHJlY2VpdmUgImNvbm5lY3Rpb24KKyAgcmVmdXNlZCIgZXJyb3JzLCB1bnRpbCByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZSB0byBwcm9jZXNzIHRoZW0uPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQXR0cmlidXRlcyI+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ29tbW9uIEF0dHJpYnV0ZXMiPgorCisgIDxwPkFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4KKyAgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorCisgIDxhdHRyaWJ1dGVzPgorIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWxsb3dUcmFjZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPkEgYm9vbGVhbiB2YWx1ZSB3aGljaCBjYW4gYmUgdXNlZCB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgVFJBQ0UKKyAgICAgIEhUVFAgbWV0aG9kLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gZmFsc2UuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbXB0eVNlc3Npb25QYXRoIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+SWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCBhbGwgcGF0aHMgZm9yIHNlc3Npb24gY29va2llcyB3aWxsIGJlIHNldAorICAgICAgdG8gPGNvZGU+LzwvY29kZT4uIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgcG9ydGxldCBzcGVjaWZpY2F0aW9uIGltcGxlbWVudGF0aW9ucywKKyAgICAgIGJ1dCB3aWxsIGdyZWF0bHkgYWZmZWN0IHBlcmZvcm1hbmNlIGlmIG1hbnkgYXBwbGljYXRpb25zIGFyZSBhY2Nlc3NlZCBvbiBhIGdpdmVuCisgICAgICBzZXJ2ZXIgYnkgdGhlIGNsaWVudC4KKyAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4uPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmFibGVMb29rdXBzIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+U2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IGNhbGxzIHRvCisgICAgICA8Y29kZT5yZXF1ZXN0LmdldFJlbW90ZUhvc3QoKTwvY29kZT4gdG8gcGVyZm9ybSBETlMgbG9va3VwcyBpbgorICAgICAgb3JkZXIgdG8gcmV0dXJuIHRoZSBhY3R1YWwgaG9zdCBuYW1lIG9mIHRoZSByZW1vdGUgY2xpZW50LiAgU2V0CisgICAgICB0byA8Y29kZT5mYWxzZTwvY29kZT4gdG8gc2tpcCB0aGUgRE5TIGxvb2t1cCBhbmQgcmV0dXJuIHRoZSBJUAorICAgICAgYWRkcmVzcyBpbiBTdHJpbmcgZm9ybSBpbnN0ZWFkICh0aGVyZWJ5IGltcHJvdmluZyBwZXJmb3JtYW5jZSkuCisgICAgICBCeSBkZWZhdWx0LCBETlMgbG9va3VwcyBhcmUgZW5hYmxlZC48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9Im1heFBvc3RTaXplIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhlIG1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiB0aGUgUE9TVCB3aGljaCB3aWxsIGJlIGhhbmRsZWQgYnkKKyAgICAgIHRoZSBjb250YWluZXIgRk9STSBVUkwgcGFyYW1ldGVyIHBhcnNpbmcuIFRoZSBsaW1pdCBjYW4gYmUgZGlzYWJsZWQgYnkKKyAgICAgIHNldHRpbmcgdGhpcyBhdHRyaWJ1dGUgdG8gYSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMC4KKyAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byAyMDk3MTUyICgyIG1lZ2FieXRlcykuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhTYXZlUG9zdFNpemUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgbWF4aW11bSBzaXplIGluIGJ5dGVzIG9mIHRoZSBQT1NUIHdoaWNoIHdpbGwgYmUgc2F2ZWQvYnVmZmVyZWQgYnkKKyAgICAgIHRoZSBjb250YWluZXIgZHVyaW5nIEZPUk0gb3IgQ0xJRU5ULUNFUlQgYXV0aGVudGljYXRpb24uIEZvciBib3RoIHR5cGVzCisgICAgICBvZiBhdXRoZW50aWNhdGlvbiwgdGhlIFBPU1Qgd2lsbCBiZSBzYXZlZC9idWZmZXJlZCBiZWZvcmUgdGhlIHVzZXIgaXMKKyAgICAgIGF1dGhlbnRpY2F0ZWQuIEZvciBDTElFTlQtQ0VSVCBhdXRoZW50aWNhdGlvbiwgdGhlIFBPU1QgaXMgYnVmZmVyZWQgZm9yCisgICAgICB0aGUgZHVyYXRpb24gb2YKKyB0aGUgU1NMIGhhbmRzaGFrZSBhbmQgdGhlIGJ1ZmZlciBlbXB0aWVkIHdoZW4gdGhlIHJlcXVlc3QKKyAgICAgIGlzIHByb2Nlc3NlZC4gRm9yIEZPUk0gYXV0aGVudGljYXRpb24gdGhlIFBPU1QgaXMKKyBzYXZlZCB3aGlsc3QgdGhlIHVzZXIKKyAgICAgIGlzIHJlLWRpcmVjdGVkIHRvIHRoZSBsb2dpbiBmb3JtIGFuZCBpcyByZXRhaW5lZCB1bnRpbCB0aGUgdXNlcgorICAgICAgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZXMgb3IgdGhlIHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAgYXV0aGVudGljYXRpb24gcmVxdWVzdCBleHBpcmVzLiBUaGUgbGltaXQgY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgdGhpcworICAgICAgYXR0cmlidXRlIHRvIC0xLiBTZXR0aW5nIHRoZSBhdHRyaWJ1dGUgdG8KKyB6ZXJvIHdpbGwgZGlzYWJsZSB0aGUgc2F2aW5nIG9mCisgICAgICBQT1NUIGRhdGEgZHVyaW5nIGF1dGhlbnRpY2F0aW9uCisuIElmIG5vdAorIHNwZWNpZmllZCwgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0CisgICAgICB0bworIDQwOTYgKDQga2lsb2J5dGVzKS48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InByb3RvY29sIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhpcyBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSA8Y29kZT5IVFRQLzEuMTwvY29kZT4gdG8gdXNlIHRoZSBIVFRQCisgICAgICBoYW5kbGVyLCB3aGljaCBpcyB0aGUgZGVmYXVsdC48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InByb3h5TmFtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPklmIHRoaXMgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gaXMgYmVpbmcgdXNlZCBpbiBhIHByb3h5CisgICAgICBjb25maWd1cmF0aW9uLCBjb25maWd1cmUgdGhpcyBhdHRyaWJ1dGUgdG8gc3BlY2lmeSB0aGUgc2VydmVyIG5hbWUKKyAgICAgIHRvIGJlIHJldHVybmVkIGZvciBjYWxscyB0byA8Y29kZT5yZXF1ZXN0LmdldFNlcnZlck5hbWUoKTwvY29kZT4uCisgICAgICBTZWUgPGEgaHJlZj0iI1Byb3h5IFN1cHBvcnQiPlByb3h5IFN1cHBvcnQ8L2E+IGZvciBtb3JlCisgICAgICBpbmZvcm1hdGlvbi48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InByb3h5UG9ydCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPklmIHRoaXMgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gaXMgYmVpbmcgdXNlZCBpbiBhIHByb3h5CisgICAgICBjb25maWd1cmF0aW9uLCBjb25maWd1cmUgdGhpcyBhdHRyaWJ1dGUgdG8gc3BlY2lmeSB0aGUgc2VydmVyIHBvcnQKKyAgICAgIHRvIGJlIHJldHVybmVkIGZvciBjYWxscyB0byA8Y29kZT5yZXF1ZXN0LmdldFNlcnZlclBvcnQoKTwvY29kZT4uCisgICAgICBTZWUgPGEgaHJlZj0iI1Byb3h5IFN1cHBvcnQiPlByb3h5IFN1cHBvcnQ8L2E+IGZvciBtb3JlCisgICAgICBpbmZvcm1hdGlvbi48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InJlZGlyZWN0UG9ydCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPklmIHRoaXMgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gaXMgc3VwcG9ydGluZyBub24tU1NMCisgICAgICByZXF1ZXN0cywgYW5kIGEgcmVxdWVzdCBpcyByZWNlaXZlZCBmb3Igd2hpY2ggYSBtYXRjaGluZworICAgICAgPGNvZGU+Jmx0O3NlY3VyaXR5LWNvbnN0cmFpbnQmZ3Q7PC9jb2RlPiByZXF1aXJlcyBTU0wgdHJhbnNwb3J0LAorICAgICAgQ2F0YWxpbmEgd2lsbCBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0IHRoZSByZXF1ZXN0IHRvIHRoZSBwb3J0CisgICAgICBudW1iZXIgc3BlY2lmaWVkIGhlcmUuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzY2hlbWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5TZXQgdGhpcyBhdHRyaWJ1dGUgdG8gdGhlIG5hbWUgb2YgdGhlIHByb3RvY29sIHlvdSB3aXNoIHRvIGhhdmUKKyAgICAgIHJldHVybmVkIGJ5IGNhbGxzIHRvIDxjb2RlPnJlcXVlc3QuZ2V0U2NoZW1lKCk8L2NvZGU+LiAgRm9yCisgICAgICBleGFtcGxlLCB5b3Ugd291bGQgc2V0IHRoaXMgYXR0cmlidXRlIHRvICI8Y29kZT5odHRwczwvY29kZT4iCisgICAgICBmb3IgYW4gU1NMIENvbm5lY3Rvci4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzICI8Y29kZT5odHRwPC9jb2RlPiIuCisgICAgICBTZWUgPGEgaHJlZj0iI1NTTCBTdXBwb3J0Ij5TU0wgU3VwcG9ydDwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZWN1cmUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5TZXQgdGhpcyBhdHRyaWJ1dGUgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdpc2ggdG8gaGF2ZQorICAgICAgY2FsbHMgdG8gPGNvZGU+cmVxdWVzdC5pc1NlY3VyZSgpPC9jb2RlPiB0byByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KKyAgICAgIGZvciByZXF1ZXN0cyByZWNlaXZlZCBieSB0aGlzIENvbm5lY3RvciAoeW91IHdvdWxkIHdhbnQgdGhpcyBvbiBhbgorICAgICAgU1NMIENvbm5lY3RvcikuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4uPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJVUklFbmNvZGluZyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoaXMgc3BlY2lmaWVzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdXNlZCB0byBkZWNvZGUgdGhlIFVSSSBieXRlcywKKyAgICAgIGFmdGVyICV4eCBkZWNvZGluZyB0aGUgVVJMLiBJZiBub3Qgc3BlY2lmaWVkLCBJU08tODg1OS0xIHdpbGwgYmUgdXNlZC4KKyAgICAgIDwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlQm9keUVuY29kaW5nRm9yVVJJIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhpcyBzcGVjaWZpZXMgaWYgdGhlIGVuY29kaW5nIHNwZWNpZmllZCBpbiBjb250ZW50VHlwZSBzaG91bGQgYmUgdXNlZAorICAgICAgZm9yIFVSSSBxdWVyeSBwYXJhbWV0ZXJzLCBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBVUklFbmNvZGluZy4gVGhpcworICAgICAgc2V0dGluZyBpcyBwcmVzZW50IGZvciBjb21wYXRpYmlsaXR5IHdpdGggVG9tY2F0IDQuMS54LCB3aGVyZSB0aGUKKyAgICAgIGVuY29kaW5nIHNwZWNpZmllZCBpbiB0aGUgY29udGVudFR5cGUsIG9yIGV4cGxpY2l0ZWx5IHNldCB1c2luZworICAgICAgUmVxdWVzdC5zZXRDaGFyYWN0ZXJFbmNvZGluZyBtZXRob2Qgd2FzIGFsc28gdXNlZCBmb3IgdGhlIHBhcmFtZXRlcnMgZnJvbQorICAgICAgdGhlIFVSTC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAgPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VJUFZIb3N0cyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlNldCB0aGlzIGF0dHJpYnV0ZSB0byA8Y29kZT50cnVlPC9jb2RlPiB0byBjYXVzZSBUb21jYXQgdG8gdXNlCisgICAgICB0aGUgSVAgYWRkcmVzcyB0aGF0IHRoZSByZXF1ZXN0IHdhcyByZWNpZXZlZCBvbiB0byBkZXRlcm1pbmUgdGhlIEhvc3QKKyAgICAgIHRvIHNlbmQgdGhlIHJlcXVlc3QgdG8uICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4uPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ4cG93ZXJlZEJ5IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+U2V0IHRoaXMgYXR0cmlidXRlIHRvIDxjb2RlPnRydWU8L2NvZGU+IHRvIGNhdXNlIFRvbWNhdCB0byBhZHZlcnRpc2UKKyAgICAgIHN1cHBvcnQgZm9yIHRoZSBTZXJ2bGV0IHNwZWNpZmljYXRpb24gdXNpbmcgdGhlIGhlYWRlciByZWNvbW1lbmRlZCBpbiB0aGUKKyAgICAgIHNwZWNpZmljYXRpb24uICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4uPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisKKyAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBJbXBsZW1lbnRhdGlvbiI+CisKKyAgPHA+CisgIEhUVFAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgKGluIGFkZGl0aW9uIHRvIHRoZQorICBjb21tb24gYXR0cmlidXRlcyBsaXN0ZWQgYWJvdmUpOjwvcD4KKworICA8YXR0cmlidXRlcz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWNjZXB0Q291bnQiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgbWF4aW11bSBxdWV1ZSBsZW5ndGggZm9yIGluY29taW5nIGNvbm5lY3Rpb24gcmVxdWVzdHMgd2hlbgorICAgICAgYWxsIHBvc3NpYmxlIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWRzIGFyZSBpbiB1c2UuICBBbnkgcmVxdWVzdHMKKyAgICAgIHJlY2VpdmVkIHdoZW4gdGhlIHF1ZXVlIGlzIGZ1bGwgd2lsbCBiZSByZWZ1c2VkLiAgVGhlIGRlZmF1bHQKKyAgICAgIHZhbHVlIGlzIDEwMC48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImFkZHJlc3MiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5Gb3Igc2VydmVycyB3aXRoIG1vcmUgdGhhbiBvbmUgSVAgYWRkcmVzcywgdGhpcyBhdHRyaWJ1dGUKKyAgICAgIHNwZWNpZmllcyB3aGljaCBhZGRyZXNzIHdpbGwgYmUgdXNlZCBmb3IgbGlzdGVuaW5nIG9uIHRoZSBzcGVjaWZpZWQKKyAgICAgIHBvcnQuICBCeSBkZWZhdWx0LCB0aGlzIHBvcnQgd2lsbCBiZSB1c2VkIG9uIGFsbCBJUCBhZGRyZXNzZXMKKyAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmVyLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnVmZmVyU2l6ZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIGJ1ZmZlciB0byBiZSBwcm92aWRlZCBmb3IgaW5wdXQKKyAgICAgIHN0cmVhbXMgY3JlYXRlZCBieSB0aGlzIGNvbm5lY3Rvci4gIEJ5IGRlZmF1bHQsIGJ1ZmZlcnMgb2YKKyAgICAgIDIwNDggYnl0ZXMgd2lsbCBiZSBwcm92aWRlZC48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbXByZXNzYWJsZU1pbWVUeXBlIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhlIHZhbHVlIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgTUlNRSB0eXBlcyBmb3Igd2hpY2ggSFRUUAorICAgICAgY29tcHJlc3Npb24gbWF5IGJlIHVzZWQuCisgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT50ZXh0L2h0bWwsdGV4dC94bWwsdGV4dC9wbGFpbjwvY29kZT4uPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21wcmVzc2lvbiIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSA8c3Ryb25nPkNvbm5lY3Rvcjwvc3Ryb25nPiBtYXkgdXNlIEhUVFAvMS4xIEdaSVAgY29tcHJlc3Npb24gaW4KKyAgICAgIGFuIGF0dGVtcHQgdG8gc2F2ZSBzZXJ2ZXIgYmFuZHdpZHRoLiBUaGUgYWNjZXB0YWJsZSB2YWx1ZXMgZm9yIHRoZQorICAgICAgcGFyYW1ldGVyIGlzICJvZmYiIChkaXNhYmxlIGNvbXByZXNzaW9uKSwgIm9uIiAoYWxsb3cgY29tcHJlc3Npb24sIHdoaWNoCisgICAgICBjYXVzZXMgdGV4dCBkYXRhIHRvIGJlIGNvbXByZXNzZWQpLCAiZm9yY2UiIChmb3JjZXMgY29tcHJlc3Npb24gaW4gYWxsCisgICAgICBjYXNlcyksIG9yIGEgbnVtZXJpY2FsIGludGVnZXIgdmFsdWUgKHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gIm9uIiwgYnV0CisgICAgICBzcGVjaWZpZXMgdGhlIG1pbmltdW0gYW1vdW50IG9mIGRhdGEgYmVmb3JlIHRoZSBvdXRwdXQgaXMgY29tcHJlc3NlZCkuIElmCisgICAgICB0aGUgY29udGVudC1sZW5ndGggaXMgbm90IGtub3duIGFuZCBjb21wcmVzc2lvbiBpcyBzZXQgdG8gIm9uIiBvciBtb3JlCisgICAgICBhZ2dyZXNzaXZlLCB0aGUgb3V0cHV0IHdpbGwgYWxzbyBiZSBjb21wcmVzc2VkLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzCisgICAgICBhdHRyaWJ1dGUgaXMgc2V0IHRvICJvZmYiLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29ubmVjdGlvbkxpbmdlciIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGR1cmluZyB3aGljaCB0aGUgc29ja2V0cyB1c2VkIGJ5IHRoaXMKKyAgICAgIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+IHdpbGwgbGluZ2VyIHdoZW4gdGhleSBhcmUgY2xvc2VkLgorICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgLTEgKHNvY2tldCBsaW5nZXIgaXMgZGlzYWJsZWQpLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29ubmVjdGlvblRpbWVvdXQiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGlzIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+IHdpbGwgd2FpdCwKKyAgICAgIGFmdGVyIGFjY2VwdGluZyBhIGNvbm5lY3Rpb24sIGZvciB0aGUgcmVxdWVzdCBVUkkgbGluZSB0byBiZQorICAgICAgcHJlc2VudGVkLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgNjAwMDAgKGkuZS4gNjAgc2Vjb25kcykuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlVXBsb2FkVGltZW91dCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoaXMgZmxhZyBhbGxvd3MgdGhlIHNlcnZsZXQgY29udGFpbmVyIHRvIHVzZSBhIGRpZmZlcmVudCwgbG9uZ2VyCisgICAgICBjb25uZWN0aW9uIHRpbWVvdXQgd2hpbGUgYSBzZXJ2bGV0IGlzIGJlaW5nIGV4ZWN1dGVkLCB3aGljaCBpbiB0aGUgZW5kCisgICAgICBhbGxvd3MgZWl0aGVyIHRoZSBzZXJ2bGV0IGEgbG9uZ2VyIGFtb3VudCBvZiB0aW1lIHRvIGNvbXBsZXRlIGl0cworICAgICAgZXhlY3V0aW9uLCBvciBhIGxvbmdlciB0aW1lb3V0IGR1cmluZyBkYXRhIHVwbG9hZC4gSWYgbm90IHNwZWNpZmllZCwKKyAgICAgIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byAidHJ1ZSIuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhIdHRwSGVhZGVyU2l6ZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIEhUVFAgaGVhZGVyLCBzcGVjaWZpZWQKKyAgICAgIGluIGJ5dGVzLgorICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIDQwOTYgKDQgS0IpLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4S2VlcEFsaXZlUmVxdWVzdHMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgbWF4aW11bSBudW1iZXIgb2YgSFRUUCByZXF1ZXN0cyB3aGljaCBjYW4gYmUgcGlwZWxpbmVkIHVudGlsCisgICAgICB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQgYnkgdGhlIHNlcnZlci4gU2V0dGluZyB0aGlzIGF0dHJpYnV0ZSB0byAxIHdpbGwKKyAgICAgIGRpc2FibGUgSFRUUC8xLjAga2VlcC1hbGl2ZSwgYXMgd2VsbCBhcyBIVFRQLzEuMSBrZWVwLWFsaXZlIGFuZAorICAgICAgcGlwZWxpbmluZy4gU2V0dGluZyB0aGlzIHRvIC0xIHdpbGwgYWxsb3cgYW4gdW5saW1pdGVkIGFtb3VudCBvZgorICAgICAgcGlwZWxpbmVkIG9yIGtlZXAtYWxpdmUgSFRUUCByZXF1ZXN0cy4KKyAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byAxMDAuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhTcGFyZVRocmVhZHMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgbWF4aW11bSBudW1iZXIgb2YgdW51c2VkIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWRzIHRoYXQKKyAgICAgIHdpbGwgYmUgYWxsb3dlZCB0byBleGlzdCB1bnRpbCB0aGUgdGhyZWFkIHBvb2wgc3RhcnRzIHN0b3BwaW5nIHRoZQorICAgICAgdW5uZWNlc3NhcnkgdGhyZWFkcy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUwLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4VGhyZWFkcyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0IHByb2Nlc3NpbmcgdGhyZWFkcyB0byBiZSBjcmVhdGVkCisgICAgICBieSB0aGlzIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+LCB3aGljaCB0aGVyZWZvcmUgZGV0ZXJtaW5lcyB0aGUKKyAgICAgIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyByZXF1ZXN0cyB0aGF0IGNhbiBiZSBoYW5kbGVkLiAgSWYKKyAgICAgIG5vdCBzcGVjaWZpZWQsIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byAyMDAuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtaW5TcGFyZVRocmVhZHMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgbnVtYmVyIG9mIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWRzIHRoYXQgd2lsbCBiZSBjcmVhdGVkCisgICAgICB3aGVuIHRoaXMgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gaXMgZmlyc3Qgc3RhcnRlZC4gIFRoZSBjb25uZWN0b3IKKyAgICAgIHdpbGwgYWxzbyBtYWtlIHN1cmUgaXQgaGFzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGlkbGUgcHJvY2Vzc2luZworICAgICAgdGhyZWFkcyBhdmFpbGFibGUuIFRoaXMgYXR0cmlidXRlIHNob3VsZCBiZSBzZXQgdG8gYSB2YWx1ZSBzbWFsbGVyCisgICAgICB0aGFuIHRoYXQgc2V0IGZvciA8Y29kZT5tYXhUaHJlYWRzPC9jb2RlPi4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJub0NvbXByZXNzaW9uVXNlckFnZW50cyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSB2YWx1ZSBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgbWF0Y2hpbmcKKyAgICAgIHVzZXItYWdlbnRzIG9mIEhUVFAgY2xpZW50cyBmb3Igd2hpY2ggY29tcHJlc3Npb24gc2hvdWxkIG5vdCBiZSB1c2VkLAorICAgICAgYmVjYXVzZSB0aGVzZSBjbGllbnRzLCBhbHRob3VnaCB0aGV5IGRvIGFkdmVydGlzZSBzdXBwb3J0IGZvciB0aGUKKyAgICAgIGZlYXR1cmUsIGhhdmUgYSBicm9rZW4gaW1wbGVtZW50YXRpb24uCisgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBlbXB0eSBTdHJpbmcgKHJlZ2V4cCBtYXRjaGluZyBkaXNhYmxlZCkuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3J0IiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICA8cD5UaGUgVENQIHBvcnQgbnVtYmVyIG9uIHdoaWNoIHRoaXMgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4KKyAgICAgIHdpbGwgY3JlYXRlIGEgc2VydmVyIHNvY2tldCBhbmQgYXdhaXQgaW5jb21pbmcgY29ubmVjdGlvbnMuICBZb3VyCisgICAgICBvcGVyYXRpbmcgc3lzdGVtIHdpbGwgYWxsb3cgb25seSBvbmUgc2VydmVyIGFwcGxpY2F0aW9uIHRvIGxpc3RlbgorICAgICAgdG8gYSBwYXJ0aWN1bGFyIHBvcnQgbnVtYmVyIG9uIGEgcGFydGljdWxhciBJUCBhZGRyZXNzLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzdHJpY3RlZFVzZXJBZ2VudHMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgdmFsdWUgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiByZWd1bGFyIGV4cHJlc3Npb25zIG1hdGNoaW5nCisgICAgICB1c2VyLWFnZW50cyBvZiBIVFRQIGNsaWVudHMgZm9yIHdoaWNoIEhUVFAvMS4xIG9yIEhUVFAvMS4wIGtlZXAgYWxpdmUKKyAgICAgIHNob3VsZCBub3QgYmUgdXNlZCwgZXZlbiBpZiB0aGUgY2xpZW50cyBhZHZlcnRpc2Ugc3VwcG9ydCBmb3IgdGhlc2UKKyAgICAgIGZlYXR1cmVzLgorICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYW4gZW1wdHkgU3RyaW5nIChyZWdleHAgbWF0Y2hpbmcgZGlzYWJsZWQpLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmVyIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhlIFNlcnZlciBoZWFkZXIgZm9yIHRoZSBodHRwIHJlc3BvbnNlLgorICAgICAgICAgVW5sZXNzIHlvdXIgcGFyYW5vaWQsIHlvdSB3b24ndCBuZWVkIHRoaXMgZmVhdHVyZS4KKyAgICAgIDwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ic29ja2V0QnVmZmVyIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgYnVmZmVyIHRvIGJlIHByb3ZpZGVkIGZvciBzb2NrZXQKKyAgICAgIG91dHB1dCBidWZmZXJpbmcuIC0xIGNhbiBiZSBzcGVjaWZpZWQgdG8gZGlzYWJsZSB0aGUgdXNlIG9mIGEgYnVmZmVyLgorICAgICAgQnkgZGVmYXVsdCwgYSBidWZmZXJzIG9mIDkwMDAgYnl0ZXMgd2lsbCBiZSB1c2VkLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgdGhyZWFkIHBvb2xpbmcgc3RyYXRlZ3kgd2hpY2ggd2lsbCBiZSB1c2VkLiBUaGUgZGVmYXVsdCBzdHJhdGVneSBkb2VzIAorICAgICAgbm90IHVzZSBhIG1hc3RlciB0aHJlYWQsIGJ1dCBhIG1vcmUgY29udmVudGlvbmFsIHN0cmF0ZWd5IHVzaW5nIGEgCisgICAgICBtYXN0ZXIgbGlzdGVuZXIgdGhyZWFkIGNhbiBiZSB1c2VkIGJ5IHNldHRpbmcgIm1zIiBhcyB0aGlzIGF0dHJpYnV0ZSdzIHZhbHVlLiAKKyAgICAgIFRoZSBtYXN0ZXIgc3RyYXRlZ3kgd2lsbCB3b3JrIHNpZ25pZmljYW50bHkgYmV0dGVyIHVzaW5nIHRoZSB0aHJlYWRQcmlvcml0eSAKKyAgICAgIGF0dHJpYnV0ZSwgd2hpY2ggd2lsbCBhcHBseSBvbmx5IHRvIHRoZSB0aHJlYWQgd2hpY2ggbGlzdGVucyBvbiB0aGUgc2VydmVyIHNvY2tldC4KKyAgICAgIFRoaXMgaXMgc2V0IHRvIDxjb2RlPmxmPC9jb2RlPiBieSBkZWZhdWx0LgorICAgICAgPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0Y3BOb0RlbGF5IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+SWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgVENQX05PX0RFTEFZIG9wdGlvbiB3aWxsIGJlCisgICAgICBzZXQgb24gdGhlIHNlcnZlciBzb2NrZXQsIHdoaWNoIGltcHJvdmVzIHBlcmZvcm1hbmNlIHVuZGVyIG1vc3QKKyAgICAgIGNpcmN1bXN0YW5jZXMuICBUaGlzIGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBieSBkZWZhdWx0LjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0idGhyZWFkUHJpb3JpdHkiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgcHJpb3JpdHkgb2YgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWRzIHdpdGhpbiB0aGUgSlZNLgorICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+amF2YS5sYW5nLlRocmVhZCNOT1JNX1BSSU9SSVRZPC9jb2RlPi4KKyAgICAgIFNlZSB0aGUgSmF2YURvYyBmb3IgdGhlIGphdmEubGFuZy5UaHJlYWQgY2xhc3MgZm9yIG1vcmUgZGV0YWlscyBvbgorICAgICAgd2hhdCB0aGlzIHByaW9yaXR5IG1lYW5zLgorICAgICAgPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJOZXN0ZWQgQ29tcG9uZW50cyI+CisKKyAgPHA+Tm9uZSBhdCB0aGlzIHRpbWUuPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iU3BlY2lhbCBGZWF0dXJlcyI+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJIVFRQLzEuMSBhbmQgSFRUUC8xLjAgU3VwcG9ydCI+CisKKyAgPHA+VGhpcyA8c3Ryb25nPkNvbm5lY3Rvcjwvc3Ryb25nPiBzdXBwb3J0cyBhbGwgb2YgdGhlIHJlcXVpcmVkIGZlYXR1cmVzCisgIG9mIHRoZSBIVFRQLzEuMSBwcm90b2NvbCwgYXMgZGVzY3JpYmVkIGluIFJGQyAyNjE2LCBpbmNsdWRpbmcgcGVyc2lzdGVudAorICBjb25uZWN0aW9ucywgcGlwZWxpbmluZywgZXhwZWN0YXRpb25zIGFuZCBjaHVua2VkIGVuY29kaW5nLiAgSWYgdGhlIGNsaWVudAorICAodHlwaWNhbGx5IGEgYnJvd3Nlcikgc3VwcG9ydHMgb25seSBIVFRQLzEuMCwgdGhlCisgIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+IHdpbGwgZ3JhY2VmdWxseSBmYWxsIGJhY2sgdG8gc3VwcG9ydGluZyB0aGlzCisgIHByb3RvY29sIGFzIHdlbGwuICBObyBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQgdG8gZW5hYmxlIHRoaXMKKyAgc3VwcG9ydC4gVGhlIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+IGFsc28gc3VwcG9ydHMgSFRUUC8xLjAKKyAga2VlcC1hbGl2ZS48L3A+CisKKyAgPHA+UkZDIDI2MTYgcmVxdWlyZXMgdGhhdCBIVFRQIHNlcnZlcnMgYWx3YXlzIGJlZ2luIHRoZWlyIHJlc3BvbnNlcyB3aXRoCisgIHRoZSBoaWdoZXN0IEhUVFAgdmVyc2lvbiB0aGF0IHRoZXkgY2xhaW0gdG8gc3VwcG9ydC4gIFRoZXJlZm9yZSwgdGhpcworICA8c3Ryb25nPkNvbm5lY3Rvcjwvc3Ryb25nPiB3aWxsIGFsd2F5cyByZXR1cm4gPGNvZGU+SFRUUC8xLjE8L2NvZGU+IGF0CisgIHRoZSBiZWdpbm5pbmcgb2YgaXRzIHJlc3BvbnNlcy48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iUHJveHkgU3VwcG9ydCI+CisKKyAgPHA+VGhlIDxjb2RlPnByb3h5TmFtZTwvY29kZT4gYW5kIDxjb2RlPnByb3h5UG9ydDwvY29kZT4gYXR0cmlidXRlcyBjYW4KKyAgYmUgdXNlZCB3aGVuIFRvbWNhdCBpcyBydW4gYmVoaW5kIGEgcHJveHkgc2VydmVyLiAgVGhlc2UgYXR0cmlidXRlcworICBtb2RpZnkgdGhlIHZhbHVlcyByZXR1cm5lZCB0byB3ZWIgYXBwbGljYXRpb25zIHRoYXQgY2FsbCB0aGUKKyAgPGNvZGU+cmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCk8L2NvZGU+IGFuZCA8Y29kZT5yZXF1ZXN0LmdldFNlcnZlclBvcnQoKTwvY29kZT4KKyAgbWV0aG9kcywgd2hpY2ggYXJlIG9mdGVuIHVzZWQgdG8gY29uc3RydWN0IGFic29sdXRlIFVSTHMgZm9yIHJlZGlyZWN0cy4KKyAgV2l0aG91dCBjb25maWd1cmluZyB0aGVzZSBhdHRyaWJ1dGVzLCB0aGUgdmFsdWVzIHJldHVybmVkIHdvdWxkIHJlZmxlY3QKKyAgdGhlIHNlcnZlciBuYW1lIGFuZCBwb3J0IG9uIHdoaWNoIHRoZSBjb25uZWN0aW9uIGZyb20gdGhlIHByb3h5IHNlcnZlcgorICB3YXMgcmVjZWl2ZWQsIHJhdGhlciB0aGFuIHRoZSBzZXJ2ZXIgbmFtZSBhbmQgcG9ydCB0byB3aG9tIHRoZSBjbGllbnQKKyAgZGlyZWN0ZWQgdGhlIG9yaWdpbmFsIHJlcXVlc3QuPC9wPgorCisgIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlCisgIDxhIGhyZWY9Ii4uL3Byb3h5LWhvd3RvLmh0bWwiPlByb3h5IFN1cHBvcnQgSE9XLVRPPC9hPi48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iU1NMIFN1cHBvcnQiPgorCisgIDxwPllvdSBjYW4gZW5hYmxlIFNTTCBzdXBwb3J0IGZvciBhIHBhcnRpY3VsYXIgaW5zdGFuY2Ugb2YgdGhpcworICA8c3Ryb25nPkNvbm5lY3Rvcjwvc3Ryb25nPiBieSBzZXR0aW5nIHRoZSA8Y29kZT5zZWN1cmU8L2NvZGU+IGF0dHJpYnV0ZSB0bworICA8Y29kZT50cnVlPC9jb2RlPi4gIEluIGFkZGl0aW9uLCB5b3UgbWF5IG5lZWQgdG8gY29uZmlndXJlIHRoZSBmb2xsb3dpbmcKKyAgYXR0cmlidXRlczo8L3A+CisKKyAgPGF0dHJpYnV0ZXM+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImFsZ29yaXRobSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBjZXJ0aWZpY2F0ZSBlbmNvZGluZyBhbGdvcml0aG0gdG8gYmUgdXNlZC4gVGhpcyBkZWZhdWx0cyB0byB0aGUgU3VuCisgICAgICBpbXBsZW1lbnRhdGlvbiAoPGNvZGU+U3VuWDUwOTwvY29kZT4pLiBGb3IgSUJNIEpWTXMgeW91IHNob3VsZCB1c2UgdGhlCisgICAgICB2YWx1ZSA8Y29kZT5JYm1YNTA5PC9jb2RlPi4gRm9yIG90aGVyIHZlbmRvcnMsIGNvbnN1bHQgdGhlIEpWTQorICAgICAgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGNvcnJlY3QgdmFsdWUuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGllbnRBdXRoIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+U2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IHRoZSBTU0wgc3RhY2sgdG8gcmVxdWlyZSBhCisgICAgICB2YWxpZCBjZXJ0aWZpY2F0ZSBjaGFpbiBmcm9tIHRoZSBjbGllbnQgYmVmb3JlIGFjY2VwdGluZyBhIGNvbm5lY3Rpb24uCisgICAgICBTZXQgdG8gPGNvZGU+d2FudDwvY29kZT4gaWYgeW91IHdhbnQgdGhlIFNTTCBzdGFjayB0byByZXF1ZXN0IGEgY2xpZW50CisgICAgICBDZXJ0aWZpY2F0ZSwgYnV0IG5vdCBmYWlsIGlmIG9uZSBpc24ndCBwcmVzZW50ZWQuIEEgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICB2YWx1ZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQpIHdpbGwgbm90IHJlcXVpcmUgYSBjZXJ0aWZpY2F0ZSBjaGFpbgorICAgICAgdW5sZXNzIHRoZSBjbGllbnQgcmVxdWVzdHMgYSByZXNvdXJjZSBwcm90ZWN0ZWQgYnkgYSBzZWN1cml0eQorICAgICAgY29uc3RyYWludCB0aGF0IHVzZXMgPGNvZGU+Q0xJRU5ULUNFUlQ8L2NvZGU+IGF1dGhlbnRpY2F0aW9uLiBTZWUgdGhlCisgICAgICA8YSBocmVmPSIuLi9zc2wtaG93dG8uaHRtbCI+U1NMIEhvd1RvPC9hPiBmb3IgYW4gZXhhbXBsZS4gIFRoYXQgU1NMIEhvd1RvCisgICAgICBhbHNvIGNvbnRhaW5zIHRpcHMgb24gdXNpbmcgcGVyLXVzZXIgb3IgcGVyLXNlc3Npb24gY2VydGlmaWNhdGUtYmFzZWQgY2xpZW50QXV0aC48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImtleXN0b3JlRmlsZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBwYXRobmFtZSBvZiB0aGUga2V5c3RvcmUgZmlsZSB3aGVyZSB5b3UgaGF2ZSBzdG9yZWQgdGhlCisgICAgICBzZXJ2ZXIgY2VydGlmaWNhdGUgdG8gYmUgbG9hZGVkLiAgQnkgZGVmYXVsdCwgdGhlIHBhdGhuYW1lIGlzCisgICAgICB0aGUgZmlsZSAiPGNvZGU+LmtleXN0b3JlPC9jb2RlPiIgaW4gdGhlIG9wZXJhdGluZyBzeXN0ZW0gaG9tZQorICAgICAgZGlyZWN0b3J5IG9mIHRoZSB1c2VyIHRoYXQgaXMgcnVubmluZyBUb21jYXQuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZXlzdG9yZVBhc3MiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgcGFzc3dvcmQgdXNlZCB0byBhY2Nlc3MgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBmcm9tIHRoZQorICAgICAgc3BlY2lmaWVkIGtleXN0b3JlIGZpbGUuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiPGNvZGU+Y2hhbmdlaXQ8L2NvZGU+Ii4KKyAgICAgIDwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ia2V5c3RvcmVUeXBlIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhlIHR5cGUgb2Yga2V5c3RvcmUgZmlsZSB0byBiZSB1c2VkIGZvciB0aGUgc2VydmVyIGNlcnRpZmljYXRlLgorICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgIjxjb2RlPkpLUzwvY29kZT4iLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3NsUHJvdG9jb2wiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgdmVyc2lvbiBvZiB0aGUgU1NMIHByb3RvY29sIHRvIHVzZS4gIElmIG5vdCBzcGVjaWZpZWQsCisgICAgICB0aGUgZGVmYXVsdCBpcyAiPGNvZGU+VExTPC9jb2RlPiIuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaXBoZXJzIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+QSBjb21tYSBzZXBlcmF0ZWQgbGlzdCBvZiB0aGUgZW5jcnlwdGlvbiBjaXBoZXJzIHRoYXQgbWF5IGJlIHVzZWQuCisgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGVuIGFueSBhdmFpbGFibGUgY2lwaGVyIG1heSBiZSB1c2VkLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ia2V5QWxpYXMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgYWxpYXMgdXNlZCB0byBmb3IgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBpbiB0aGUga2V5c3RvcmUuIElmIG5vdAorICAgICAgc3BlY2lmaWVkIHRoZSBmaXJzdCBrZXkgcmVhZCBpbiB0aGUga2V5c3RvcmUgd2lsbCBiZSB1c2VkLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0idHJ1c3RzdG9yZUZpbGUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgVHJ1c3RTdG9yZSBmaWxlIHRvIHVzZSB0byB2YWxpZGF0ZSBjbGllbnQgY2VydGlmaWNhdGVzLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0idHJ1c3RzdG9yZVBhc3MiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgcGFzc3dvcmQgdG8gYWNjZXNzIHRoZSBUcnVzdFN0b3JlLiBUaGlzIGRlZmF1bHRzIHRvIHRoZSB2YWx1ZQorICAgICAgb2YgPGNvZGU+a2V5c3RvcmVQYXNzPC9jb2RlPi48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InRydXN0c3RvcmVUeXBlIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+QWRkIHRoaXMgZWxlbWVudCBpZiB5b3VyIGFyZSB1c2luZyBhIGRpZmZlcmVudCBmb3JtYXQgZm9yIHRoZQorICAgICAgVHJ1c3RTdG9yZSB0aGVuIHlvdSBhcmUgdXNpbmcgZm9yIHRoZSBLZXlTdG9yZS48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgPC9hdHRyaWJ1dGVzPgorCisgIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlCisgIDxhIGhyZWY9Ii4uL3NzbC1ob3d0by5odG1sIj5TU0wgQ29uZmlndXJhdGlvbiBIT1ctVE88L2E+LjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL2luZGV4LnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL2luZGV4LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTRkZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvaW5kZXgueG1sCkBAIC0wLDAgKzEsNzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJpbmRleC5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPk92ZXJ2aWV3PC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+CisKKzxwPlRoaXMgbWFudWFsIGNvbnRhaW5zIHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBhYm91dCBhbGwgb2YgdGhlIGNvbmZpZ3VyYXRpb24KK2RpcmVjdGl2ZXMgdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gYSA8Y29kZT5jb25mL3NlcnZlci54bWw8L2NvZGU+IGZpbGUgdG8KK2NvbmZpZ3VyZSB0aGUgYmVoYXZpb3Igb2YgdGhlIFRvbWNhdCA1IFNlcnZsZXQvSlNQIGNvbnRhaW5lci4gIEl0IGRvZXMgbm90CithdHRlbXB0IHRvIGRlc2NyaWJlIHdoaWNoIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyBzaG91bGQgYmUgdXNlZCB0byBwZXJmb3JtCitzcGVjaWZpYyB0YXNrcyAtIGZvciB0aGF0LCBzZWUgdGhlIHZhcmlvdXMgPGVtPkhPVy1UTzwvZW0+IGRvY3VtZW50cyBvbiB0aGUKK21haW4gaW5kZXggcGFnZS48L3A+CisKKzxwPlRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgZGVzY3JpcHRpb25zIGFyZSBvcmdhbml6ZWQgaW50byB0aGUgZm9sbG93aW5nCittYWpvciBjYXRlZ29yaWVzOjwvcD4KKzx1bD4KKzxsaT48c3Ryb25nPlRvcCBMZXZlbCBFbGVtZW50czwvc3Ryb25nPiAtIDxjb2RlPiZsdDtTZXJ2ZXImZ3Q7PC9jb2RlPiBpcyB0aGUKKyAgICByb290IGVsZW1lbnQgb2YgdGhlIGVudGlyZSBjb25maWd1cmF0aW9uIGZpbGUsIHdoaWxlCisgICAgPGNvZGU+Jmx0O1NlcnZpY2UmZ3Q7PC9jb2RlPiByZXByZXNlbnRzIGEgZ3JvdXAgb2YgQ29ubmVjdG9ycyB0aGF0IGlzCisgICAgYXNzb2NpYXRlZCB3aXRoIGFuIEVuZ2luZS48L2xpPgorPGxpPjxzdHJvbmc+Q29ubmVjdG9yczwvc3Ryb25nPiAtIFJlcHJlc2VudCB0aGUgaW50ZXJmYWNlIGJldHdlZW4gZXh0ZXJuYWwKKyAgICBjbGllbnRzIHNlbmRpbmcgcmVxdWVzdHMgdG8gKGFuZCByZWNlaXZpbmcgcmVzcG9uc2VzIGZyb20pIGEgcGFydGljdWxhcgorICAgIFNlcnZpY2UuPC9saT4KKzxsaT48c3Ryb25nPkNvbnRhaW5lcnM8L3N0cm9uZz4gLSBSZXByZXNlbnQgY29tcG9uZW50cyB3aG9zZSBmdW5jdGlvbiBpcyB0bworICAgIHByb2Nlc3MgaW5jb21pbmcgcmVxdWVzdHMsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2VzLgorICAgIEFuIEVuZ2luZSBoYW5kbGVzIGFsbCByZXF1ZXN0cyBmb3IgYSBTZXJ2aWNlLCBhIEhvc3QgaGFuZGxlcyBhbGwgcmVxdWVzdHMKKyAgICBmb3IgYSBwYXJ0aWN1bGFyIHZpcnR1YWwgaG9zdCwgYW5kIGEgQ29udGV4dCBoYW5kbGVzIGFsbCByZXF1ZXN0cyBmb3IgYQorICAgIHNwZWNpZmljIHdlYiBhcHBsaWNhdGlvbi48L2xpPgorPGxpPjxzdHJvbmc+TmVzdGVkIENvbXBvbmVudHM8L3N0cm9uZz4gLSBSZXByZXNlbnQgZWxlbWVudHMgdGhhdCBjYW4gYmUKKyAgICBuZXN0ZWQgaW5zaWRlIHRoZSBlbGVtZW50IGZvciBhIENvbnRhaW5lci4gIFNvbWUgZWxlbWVudHMgY2FuIGJlIG5lc3RlZAorICAgIGluc2lkZSBhbnkgQ29udGFpbmVyLCB3aGlsZSBvdGhlcnMgY2FuIG9ubHkgYmUgbmVzdGVkIGluc2lkZSBhCisgICAgQ29udGV4dC48L2xpPgorPC91bD4KKworPHA+Rm9yIGVhY2ggZWxlbWVudCwgdGhlIGNvcnJlc3BvbmRpbmcgZG9jdW1lbnRhdGlvbiBmb2xsb3dzIHRoaXMgZ2VuZXJhbAorb3V0bGluZTo8L3A+Cis8dWw+Cis8bGk+PHN0cm9uZz5JbnRyb2R1Y3Rpb248L3N0cm9uZz4gLSBPdmVyYWxsIGRlc2NyaXB0aW9uIG9mIHRoaXMgcGFydGljdWxhcgorICAgIGNvbXBvbmVudC4gIFRoZXJlIHdpbGwgYmUgYSBjb3JyZXNwb25kaW5nIEphdmEgPGVtPmludGVyZmFjZTwvZW0+IChpbgorICAgIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hPC9jb2RlPiBwYWNha2dlKSB0aGF0IGlzIGltcGxlbWVudGVkIGJ5IG9uZQorICAgIG9yIG1vcmUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb25zLjwvbGk+Cis8bGk+PHN0cm9uZz5BdHRyaWJ1dGVzPC9zdHJvbmc+IC0gVGhlIHNldCBvZiBhdHRyaWJ1dGVzIHRoYXQgYXJlIGxlZ2FsIGZvcgorICAgIHRoaXMgZWxlbWVudC4gIEdlbmVyYWxseSwgdGhpcyB3aWxsIGJlIHN1YmRpdmlkZWQgaW50byA8ZW0+Q29tbW9uPC9lbT4KKyAgICBhdHRyaWJ1dGVzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBhbGwgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBjb3JyZXNwb25kaW5nCisgICAgSmF2YSBpbnRlcmZhY2UsIGFuZCA8ZW0+U3RhbmRhcmQgSW1wbGVtZW50YXRpb248L2VtPiBhdHRyaWJ1dGVzIHRoYXQgYXJlCisgICAgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLgorICAgIFRoZSBuYW1lcyBvZiByZXF1aXJlZCBhdHRyaWJ1dGVzIGFyZSA8c3Ryb25nPmJvbGRlZDwvc3Ryb25nPi48L2xpPgorPGxpPjxzdHJvbmc+TmVzdGVkIENvbXBvbmVudHM8L3N0cm9uZz4gLSBFbnVtZXJhdGVzIHdoaWNoIG9mIHRoZSA8ZW0+TmVzdGVkCisgICAgQ29tcG9uZW50czwvZW0+IGNhbiBiZSBsZWdhbGx5IG5lc3RlZCB3aXRoaW4gdGhpcyBlbGVtZW50LjwvbGk+Cis8bGk+PHN0cm9uZz5TcGVjaWFsIEZlYXR1cmVzPC9zdHJvbmc+IC0gRGVzY3JpYmVzIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgbGFyZ2UKKyAgICB2YXJpZXR5IG9mIHNwZWNpYWwgZmVhdHVyZXMgKHNwZWNpZmljIHRvIGVhY2ggZWxlbWVudCB0eXBlKSB0aGF0IGFyZQorICAgIHN1cHBvcnRlZCBieSB0aGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UuPC9saT4KKzwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvbG9hZGVyLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL2xvYWRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc4MzViOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL2xvYWRlci54bWwKQEAgLTAsMCArMSwxNTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJsb2FkZXIuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgUi4gTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgIDxhdXRob3I+WW9hdiBTaGFwaXJhPC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBMb2FkZXIgQ29tcG9uZW50PC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgIDxwPlRoZSA8c3Ryb25nPkxvYWRlcjwvc3Ryb25nPiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIDxlbT53ZWIKKyAgYXBwbGljYXRpb24gY2xhc3MgbG9hZGVyPC9lbT4gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbG9hZCBKYXZhCisgIGNsYXNzZXMgYW5kIHJlc291cmNlcyBmb3IgeW91ciB3ZWIgYXBwbGljYXRpb24uICBTdWNoCisgIGEgY2xhc3MgbG9hZGVyIG11c3QgZm9sbG93IHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIFNlcnZsZXQKKyAgU3BlY2lmaWNhdGlvbiwgYW5kIGxvYWQgY2xhc3NlcyBmcm9tIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKyAgPHVsPgorICA8bGk+RnJvbSB0aGUgPGNvZGU+L1dFQi1JTkYvY2xhc3NlczwvY29kZT4gZGlyZWN0b3J5IGluc2lkZSB5b3VyCisgICAgICB3ZWIgYXBwbGljYXRpb24uPC9saT4KKyAgPGxpPkZyb20gSkFSIGZpbGVzIGluIHRoZSA8Y29kZT4vV0VCLUlORi9saWI8L2NvZGU+IGRpcmVjdG9yeQorICAgICAgaW5zaWRlIHlvdXIgd2ViIGFwcGxpY2F0aW9uLjwvbGk+CisgIDxsaT5Gcm9tIHJlc291cmNlcyBtYWRlIGF2YWlsYWJsZSBieSBDYXRhbGluYSB0byBhbGwgd2ViCisgICAgICBhcHBsaWNhdGlvbnMgZ2xvYmFsbHkuPC9saT4KKyAgPC91bD4KKworICA8cD5BIExvYWRlciBlbGVtZW50IE1BWSBiZSBuZXN0ZWQgaW5zaWRlIGEgPGEgaHJlZj0iY29udGV4dC5odG1sIj5Db250ZXh0PC9hPgorICBjb21wb25lbnQuICBJZiBpdCBpcyBub3QgaW5jbHVkZWQsIGEgZGVmYXVsdCBMb2FkZXIgY29uZmlndXJhdGlvbiB3aWxsIGJlCisgIGNyZWF0ZWQgYXV0b21hdGljYWxseSwgd2hpY2ggaXMgc3VmZmljaWVudCBmb3IgbW9zdCByZXF1aXJlbWVudHMuPC9wPgorCisgIDxwPkZvciBhIG1vcmUgaW4tZGVwdGggZGVzY3JpcHRpb24gb2YgdGhlIGNsYXNzIGxvYWRlciBoaWVyYXJjaHkKKyAgdGhhdCBpcyBpbXBsZW1lbnRlZCBieSBDYXRhbGluYSwgc2VlIDxhIGhyZWY9Ii4uL2NsYXNzLWxvYWRlci1ob3d0by5odG1sIj50aGUgQ2xhc3NMb2FkZXIgSG93VG88L2E+LjwvcD4KKworICAgIDxibG9ja3F1b3RlPjxlbT4KKyAgICA8cD5UaGUgZGVzY3JpcHRpb24gYmVsb3cgdXNlcyB0aGUgdmFyaWFibGUgbmFtZSAkQ0FUQUxJTkFfSE9NRQorICAgIHRvIHJlZmVyIHRvIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB5b3UgaGF2ZSBpbnN0YWxsZWQgVG9tY2F0IDUsCisgICAgYW5kIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSBhZ2FpbnN0IHdoaWNoIG1vc3QgcmVsYXRpdmUgcGF0aHMgYXJlCisgICAgcmVzb2x2ZWQuICBIb3dldmVyLCBpZiB5b3UgaGF2ZSBjb25maWd1cmVkIFRvbWNhdCA1IGZvciBtdWx0aXBsZQorICAgIGluc3RhbmNlcyBieSBzZXR0aW5nIGEgQ0FUQUxJTkFfQkFTRSBkaXJlY3RvcnksIHlvdSBzaG91bGQgdXNlCisgICAgJENBVEFMSU5BX0JBU0UgaW5zdGVhZCBvZiAkQ0FUQUxJTkFfSE9NRSBmb3IgZWFjaCBvZiB0aGVzZQorICAgIHJlZmVyZW5jZXMuPC9wPgorICAgIDwvZW0+PC9ibG9ja3F1b3RlPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQXR0cmlidXRlcyI+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ29tbW9uIEF0dHJpYnV0ZXMiPgorCisgICAgPHA+QWxsIGltcGxlbWVudGF0aW9ucyBvZiA8c3Ryb25nPkxvYWRlcjwvc3Ryb25nPgorICAgIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UuICBUaGlzIGNsYXNzIG11c3QKKyAgICAgICAgaW1wbGVtZW50IHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkxvYWRlcjwvY29kZT4gaW50ZXJmYWNlLgorICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgc3RhbmRhcmQgdmFsdWUgKGRlZmluZWQgYmVsb3cpIHdpbGwgYmUgdXNlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWxlZ2F0ZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+U2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IHRoZSBjbGFzcyBsb2FkZXIgdG8gZm9sbG93CisgICAgICAgIHRoZSBzdGFuZGFyZCBKYXZhMiBkZWxlZ2F0aW9uIG1vZGVsLCBhbmQgYXR0ZW1wdCB0byBsb2FkIGNsYXNzZXMgZnJvbQorICAgICAgICBwYXJlbnQgY2xhc3MgbG9hZGVycyA8c3Ryb25nPmJlZm9yZTwvc3Ryb25nPiBsb29raW5nIGluc2lkZSB0aGUgd2ViCisgICAgICAgIGFwcGxpY2F0aW9uLiAgU2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiAodGhlIGRlZmF1bHQpIHRvIGhhdmUgdGhlCisgICAgICAgIGNsYXNzIGxvYWRlciBsb29rIGluc2lkZSB0aGUgd2ViIGFwcGxpY2F0aW9uIGZpcnN0LCBiZWZvcmUgYXNraW5nCisgICAgICAgIHBhcmVudCBjbGFzcyBsb2FkZXJzIHRvIGZpbmQgcmVxdWVzdGVkIGNsYXNzZXMgb3IgcmVzb3VyY2VzLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InJlbG9hZGFibGUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3Ugd2FudCBDYXRhbGluYSB0byBtb25pdG9yIGNsYXNzZXMgaW4KKyAgICAgICAgPGNvZGU+L1dFQi1JTkYvY2xhc3Nlcy88L2NvZGU+IGFuZCA8Y29kZT4vV0VCLUlORi9saWI8L2NvZGU+IGZvcgorICAgICAgICBjaGFuZ2VzLCBhbmQgYXV0b21hdGljYWxseSByZWxvYWQgdGhlIHdlYiBhcHBsaWNhdGlvbiBpZiBhIGNoYW5nZQorICAgICAgICBpcyBkZXRlY3RlZC4gIFRoaXMgZmVhdHVyZSBpcyB2ZXJ5IHVzZWZ1bCBkdXJpbmcgYXBwbGljYXRpb24KKyAgICAgICAgZGV2ZWxvcG1lbnQsIGJ1dCBpdCByZXF1aXJlcyBzaWduaWZpY2FudCBydW50aW1lIG92ZXJoZWFkIGFuZCBpcworICAgICAgICBub3QgcmVjb21tZW5kZWQgZm9yIHVzZSBvbiBkZXBsb3llZCBwcm9kdWN0aW9uIGFwcGxpY2F0aW9ucy4gIFlvdQorICAgICAgICBjYW4gdXNlIHRoZSA8YSBocmVmPSIuLi9tYW5hZ2VyLWhvd3RvLmh0bWwiPk1hbmFnZXI8L2E+IHdlYgorICAgICAgICBhcHBsaWNhdGlvbiwgaG93ZXZlciwgdG8gdHJpZ2dlciByZWxvYWRzIG9mIGRlcGxveWVkIGFwcGxpY2F0aW9ucworICAgICAgICBvbiBkZW1hbmQuPC9wPgorCisgICAgICAgIDxwPjxzdHJvbmc+Tk9URTwvc3Ryb25nPiAtIFRoZSB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlCisgICAgICAgIGluaGVyaXRlZCBmcm9tIHRoZSA8Y29kZT5yZWxvYWRhYmxlPC9jb2RlPiBhdHRyaWJ1dGUgeW91IHNldCBvbgorICAgICAgICB0aGUgc3Vycm91bmRpbmcgPGEgaHJlZj0iY29udGV4dC5odG1sIj5Db250ZXh0PC9hPiBjb21wb25lbnQsCisgICAgICAgIGFuZCBhbnkgdmFsdWUgeW91IGV4cGxpY2l0bHkgc2V0IGhlcmUgd2lsbCBiZSByZXBsYWNlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBJbXBsZW1lbnRhdGlvbiI+CisKKyAgICA8cD5UaGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5Mb2FkZXI8L3N0cm9uZz4gaXMKKyAgICA8c3Ryb25nPm9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcExvYWRlcjwvc3Ryb25nPi4KKyAgICBJdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYXR0cmlidXRlcyAoaW4gYWRkaXRpb24gdG8gdGhlCisgICAgY29tbW9uIGF0dHJpYnV0ZXMgbGlzdGVkIGFib3ZlKTo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2FkZXJDbGFzcyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSA8Y29kZT5qYXZhLmxhbmcuQ2xhc3NMb2FkZXI8L2NvZGU+CisgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRvIHVzZS4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcENsYXNzTG9hZGVyPC9jb2RlPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VTeXN0ZW1DbGFzc0xvYWRlckFzUGFyZW50IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5JZiBubyBwYXJlbnQgY2xhc3Nsb2FkZXIgaXMgc3BlY2lmaWVkLCBzaG91bGQgdGhlIHN5c3RlbQorICAgICAgICBjbGFzc2xvYWRlciBiZSB1c2VkPyBUaGUgZGVmYXVsdCBvZiA8Y29kZT50cnVlPC9jb2RlPiBtYW50YWlucworICAgICAgICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHJlbGVhc2VzIGhvd2V2ZXIgbW9zdAorICAgICAgICB1c2VycyB3aWxsIHdhbnQgdG8gc2V0IHRoaXMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG9idGFpbgorICAgICAgICB0aGUgcGFyZW50IGNsYXNzbG9hZGVyIGZyb20gdGhlIGFzc29jaWF0ZWQgY29udGFpbmVyLjwvcD4KKyAgICAgICAgPHA+VGhpcyBhdHRyaWJ1dGUgd2lsbCBub3QgYmUgcHJlc2VudCBpbiBUb21jYXQgNiB3aGVyZSB0aGUKKyAgICAgICAgTG9hZGVyIEFQSSBoYXMgY2hhbmdlZCBhbmQgdGhlIHBhcmVudCBjbGFzcyBsb2FkZXIgaXMgYWx3YXlzCisgICAgICAgIG9idGFpbmVkIGZyb20gdGhlIGFzc29jaWF0ZWQgY29udGFpbmVyLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iTmVzdGVkIENvbXBvbmVudHMiPgorCisgIDxwPk5vIGNvbXBvbmVudHMgbWF5IGJlIG5lc3RlZCBpbnNpZGUgYSA8c3Ryb25nPkxvYWRlcjwvc3Ryb25nPiBlbGVtZW50LjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNwZWNpYWwgRmVhdHVyZXMiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkxvZ2dpbmciPgorCisgICAgPHA+QSBsb2FkZXIgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2cgY2F0ZWdvcnkgYmFzZWQgb24gaXRzIGNsYXNzbmFtZS48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9tYW5hZ2VyLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL21hbmFnZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlODUwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9tYW5hZ2VyLnhtbApAQCAtMCwwICsxLDQ1OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9Im1hbmFnZXIuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgUi4gTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgIDxhdXRob3IgZW1haWw9InlvYXZzQGFwYWNoZS5vcmciPllvYXYgU2hhcGlyYTwvYXV0aG9yPgorICAgIDx0aXRsZT5UaGUgTWFuYWdlciBDb21wb25lbnQ8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKyAgPHA+VGhlIDxzdHJvbmc+TWFuYWdlcjwvc3Ryb25nPiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIDxlbT5zZXNzaW9uCisgIG1hbmFnZXI8L2VtPiB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYW5kIG1haW50YWluIEhUVFAgc2Vzc2lvbnMKKyAgYXMgcmVxdWVzdGVkIGJ5IHRoZSBhc3NvY2lhdGVkIHdlYiBhcHBsaWNhdGlvbi48L3A+CisKKyAgPHA+QSBNYW5hZ2VyIGVsZW1lbnQgTUFZIGJlIG5lc3RlZCBpbnNpZGUgYQorICA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+IGNvbXBvbmVudC4gIElmIGl0IGlzIG5vdCBpbmNsdWRlZCwKKyAgYSBkZWZhdWx0IE1hbmFnZXIgY29uZmlndXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseSwgd2hpY2gKKyAgaXMgc3VmZmljaWVudCBmb3IgbW9zdCByZXF1aXJlbWVudHMuPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQXR0cmlidXRlcyI+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ29tbW9uIEF0dHJpYnV0ZXMiPgorCisgICAgPHA+QWxsIGltcGxlbWVudGF0aW9ucyBvZiA8c3Ryb25nPk1hbmFnZXI8L3N0cm9uZz4KKyAgICBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkphdmEgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdG8gdXNlLiAgVGhpcyBjbGFzcyBtdXN0CisgICAgICAgIGltcGxlbWVudCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyPC9jb2RlPiBpbnRlcmZhY2UuCisgICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBzdGFuZGFyZCB2YWx1ZSAoZGVmaW5lZCBiZWxvdykgd2lsbCBiZSB1c2VkLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRpc3RyaWJ1dGFibGUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNldCB0byA8Y29kZT50cnVlPC9jb2RlPiB0byBhc2sgdGhlIHNlc3Npb24gbWFuYWdlciB0byBlbmZvcmNlCisgICAgICAgIHRoZSByZXN0cmljdGlvbnMgZGVzY3JpYmVkIGluIHRoZSBTZXJ2bGV0IFNwZWNpZmljYXRpb24gb24KKyAgICAgICAgZGlzdHJpYnV0YWJsZSBhcHBsaWNhdGlvbnMgKHByaW1hcmlseSwgdGhpcyB3b3VsZCBtZWFuIHRoYXQgYWxsCisgICAgICAgIHNlc3Npb24gYXR0cmlidXRlcyBtdXN0IGltcGxlbWVudCA8Y29kZT5qYXZhLmlvLlNlcmlhbGl6YWJsZTwvY29kZT4pLgorICAgICAgICBTZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+ICh0aGUgZGVmYXVsdCkgdG8gbm90IGVuZm9yY2UgdGhlc2UKKyAgICAgICAgcmVzdHJpY3Rpb25zLjwvcD4KKworICAgICAgICA8cD48c3Ryb25nPk5PVEU8L3N0cm9uZz4gLSBUaGUgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHkgaXMgaW5oZXJpdGVkCisgICAgICAgIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgdGhlCisgICAgICAgIDxjb2RlPiZsdDtkaXN0cmlidXRhYmxlJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciAoPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4pLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlN0YW5kYXJkIEltcGxlbWVudGF0aW9uIj4KKworICAgIDxwPlRvbWNhdCBwcm92aWRlcyB0d28gc3RhbmRhcmQgaW1wbGVtZW50YXRpb25zIG9mIDxzdHJvbmc+TWFuYWdlcjwvc3Ryb25nPgorICAgIGZvciB1c2UgLSB0aGUgZGVmYXVsdCBvbmUgc3RvcmVzIGFjdGl2ZSBzZXNzaW9ucywgd2hpbGUgdGhlIG9wdGlvbmFsIG9uZQorICAgIHN0b3JlcyBhY3RpdmUgc2Vzc2lvbnMgdGhhdCBoYXZlIGJlZW4gc3dhcHBlZCBvdXQgKGluIGFkZGl0aW9uIHRvIHNhdmluZworICAgIHNlc3Npb25zIGFjcm9zcyBhIHJlc3RhcnQgb2YgVG9tY2F0KSBpbiBhIHN0b3JhZ2UgbG9jYXRpb24gdGhhdCBpcyBzZWxlY3RlZAorICAgIHZpYSB0aGUgdXNlIG9mIGFuIGFwcHJvcHJpYXRlIDxzdHJvbmc+U3RvcmU8L3N0cm9uZz4gbmVzdGVkIGVsZW1lbnQuPC9wPgorCisgICAgPGgzPlN0YW5kYXJkIE1hbmFnZXIgSW1wbGVtZW50YXRpb248L2gzPgorCisgICAgPHA+VGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+TWFuYWdlcjwvc3Ryb25nPiBpcworICAgIDxzdHJvbmc+b3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlN0YW5kYXJkTWFuYWdlcjwvc3Ryb25nPi4KKyAgICBJdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYXR0cmlidXRlcyAoaW4gYWRkaXRpb24gdG8gdGhlCisgICAgY29tbW9uIGF0dHJpYnV0ZXMgbGlzdGVkIGFib3ZlKTo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGdvcml0aG0iIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPk5hbWUgb2YgdGhlIDxlbT5NZXNzYWdlIERpZ2VzdDwvZW0+IGFsZ29yaXRobSB1c2VkIHRvIGNhbGN1bGF0ZQorICAgICAgICBzZXNzaW9uIGlkZW50aWZpZXJzIHByb2R1Y2VkIGJ5IHRoaXMgTWFuYWdlci4gIFRoaXMgdmFsdWUgbXVzdAorICAgICAgICBiZSBzdXBwb3J0ZWQgYnkgdGhlIDxjb2RlPmphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDwvY29kZT4gY2xhc3MuCisgICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzICJNRDUiLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImVudHJvcHkiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkEgU3RyaW5nIHZhbHVlIHRoYXQgaXMgdXRpbGl6ZWQgd2hlbiBzZWVkaW5nIHRoZSByYW5kb20gbnVtYmVyCisgICAgICAgIGdlbmVyYXRvciB1c2VkIHRvIGNyZWF0ZSBzZXNzaW9uIGlkZW50aWZpZXJzIGZvciB0aGlzIE1hbmFnZXIuCisgICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIGEgc2VtaS11c2VmdWwgdmFsdWUgaXMgY2FsY3VsYXRlZCwgYnV0IGEgbG9uZworICAgICAgICBTdHJpbmcgdmFsdWUgc2hvdWxkIGJlIHNwZWNpZmllZCBpbiBzZWN1cml0eS1jb25zY2lvdXMKKyAgICAgICAgZW52aXJvbm1lbnRzLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1heEFjdGl2ZVNlc3Npb25zIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIHNlc3Npb25zIHRoYXQgd2lsbCBiZSBjcmVhdGVkIGJ5CisgICAgICAgIHRoaXMgTWFuYWdlciwgb3IgLTEgKHRoZSBkZWZhdWx0KSBmb3Igbm8gbGltaXQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4SW5hY3RpdmVJbnRlcnZhbCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhlIGluaXRpYWwgbWF4aW11bSB0aW1lIGludGVydmFsLCBpbiBzZWNvbmRzLCAKKyAgICAgICAgYmV0d2VlbiBjbGllbnQgcmVxdWVzdHMgYmVmb3JlIGEgc2Vzc2lvbiBpcyBpbnZhbGlkYXRlZC4gQSBuZWdhdGl2ZSB2YWx1ZQorICAgICAgICB3aWxsIHJlc3VsdCBpbiBzZXNzaW9ucyBuZXZlciB0aW1pbmcgb3V0LiBJZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBwcm92aWRlZCwKKyAgICAgICAgYSBkZWZhdWx0IG9mIDYwIHNlY29uZHMgaXMgdXNlZC48L3A+CisgICAgICAgIAorICAgICAgICA8cD5UaGlzIGF0dHJpYnV0ZSBwcm92aWRlcyB0aGUgaW5pdGlhbCB2YWx1ZSB3aGVuZXZlciBhIAorICAgICAgICBuZXcgc2Vzc2lvbiBpcyBjcmVhdGVkLCBidXQgdGhlIGludGVydmFsIG1heSBiZSBkeW5hbWljYWxseSAKKyAgICAgICAgdmFyaWVkIGJ5IGEgc2VydmxldCB2aWEgdGhlIAorICAgICAgICA8Y29kZT5zZXRNYXhJbmFjdGl2ZUludGVydmFsPC9jb2RlPiBtZXRob2Qgb2YgdGhlIDxjb2RlPkh0dHBTZXNzaW9uPC9jb2RlPiBvYmplY3QuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGF0aG5hbWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkFic29sdXRlIG9yIHJlbGF0aXZlICh0byB0aGUgd29yayBkaXJlY3RvcnkgZm9yIHRoaXMgQ29udGV4dCkKKyAgICAgICAgcGF0aG5hbWUgb2YgdGhlIGZpbGUgaW4gd2hpY2ggc2Vzc2lvbiBzdGF0ZSB3aWxsIGJlIHByZXNlcnZlZAorICAgICAgICBhY3Jvc3MgYXBwbGljYXRpb24gcmVzdGFydHMsIGlmIHBvc3NpYmxlLiAgVGhlIGRlZmF1bHQgaXMKKyAgICAgICAgIlNFU1NJT05TLnNlciIuICBTZWUgPGEgaHJlZj0iI1Jlc3RhcnQgUGVyc2lzdGVuY2UiPlJlc3RhcnQKKyAgICAgICAgUGVyc2lzdGVuY2U8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLiBSZXN0YXJ0IHBlcnNpc3RlbmNlIG1heSBiZSAKKyAgICAgICAgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGlzIGF0dHJpYnV0ZSB0byBhbiBlbXB0eSBzdHJpbmcuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvY2Vzc0V4cGlyZXNGcmVxdWVuY3kiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkZyZXF1ZW5jeSBvZiB0aGUgc2Vzc2lvbiBleHBpcmF0aW9uLCBhbmQgcmVsYXRlZCBtYW5hZ2VyIG9wZXJhdGlvbnMuCisgICAgICAgIE1hbmFnZXIgb3BlcmF0aW9ucyB3aWxsIGJlIGRvbmUgb25jZSBmb3IgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YKKyAgICAgICAgYmFja2dyb25kUHJvY2VzcyBjYWxscyAoaWUsIHRoZSBsb3dlciB0aGUgYW1vdW50LCB0aGUgbW9yZSBvZnRlbiB0aGUKKyAgICAgICAgY2hlY2tzIHdpbGwgb2NjdXIpLiBUaGUgbWluaW11bSB2YWx1ZSBpcyAxLCBhbmQgdGhlIGRlZmF1bHQgdmFsdWUgaXMgNi4KKyAgICAgICAgPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmFuZG9tQ2xhc3MiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkphdmEgY2xhc3MgbmFtZSBvZiB0aGUgPGNvZGU+amF2YS51dGlsLlJhbmRvbTwvY29kZT4KKyAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdG8gdXNlLiAgSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMKKyAgICAgICAgPGNvZGU+amF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb208L2NvZGU+LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InNlc3Npb25JZExlbmd0aCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICA8cD5UaGUgbGVuZ3RoIG9mIHNlc3Npb24gaWRzIGNyZWF0ZWQgYnkgdGhpcyBNYW5hZ2VyLCBleGNsdWRpbmcgYW55CisgICAgICAgIEpWTSByb3V0ZSBpbmZvcm1hdGlvbiB1c2VkIGZvciBsb2FkIGJhbGFuY2luZy4gCisgICAgICAgIFRoZSBkZWZhdWx0IGlzIDE2LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGgzPlBlcnNpc3RlbnQgTWFuYWdlciBJbXBsZW1lbnRhdGlvbjwvaDM+CisKKyAgICA8cD48ZW0+PHN0cm9uZz5XQVJOSU5HIC0gVXNlIG9mIHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbgorICAgIGhhcyBub3QgYmVlbiB0aG9yb3VnaGx5IHRlc3RlZCwgYW5kIHNob3VsZCBiZSBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbCEKKyAgICA8L3N0cm9uZz48L2VtPjwvcD4KKworICAgIDxwPlRoZSBwZXJzaXN0ZW50IGltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+TWFuYWdlcjwvc3Ryb25nPiBpcworICAgIDxzdHJvbmc+b3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlBlcnNpc3RlbnRNYW5hZ2VyPC9zdHJvbmc+LiAgSW4KKyAgICBhZGRpdGlvbiB0byB0aGUgdXN1YWwgb3BlcmF0aW9ucyBvZiBjcmVhdGluZyBhbmQgZGVsZXRpbmcgc2Vzc2lvbnMsIGEKKyAgICA8Y29kZT5QZXJzaXN0ZW50TWFuYWdlcjwvY29kZT4gaGFzIHRoZSBjYXBhYmlsaXR5IHRvIHN3YXAgYWN0aXZlIChidXQKKyAgICBpZGxlKSBzZXNzaW9ucyBvdXQgdG8gYSBwZXJzaXN0ZW50IHN0b3JhZ2UgbWVjaGFuaXNtLCBhcyB3ZWxsIGFzIHRvIHNhdmUKKyAgICBhbGwgc2Vzc2lvbnMgYWNyb3NzIGEgbm9ybWFsIHJlc3RhcnQgb2YgVG9tY2F0LiAgVGhlIGFjdHVhbCBwZXJzaXN0ZW50CisgICAgc3RvcmFnZSBtZWNoYW5pc20gdXNlZCBpcyBzZWxlY3RlZCBieSB5b3VyIGNob2ljZSBvZiBhCisgICAgPHN0cm9uZz5TdG9yZTwvc3Ryb25nPiBlbGVtZW50IG5lc3RlZCBpbnNpZGUgdGhlIDxzdHJvbmc+TWFuYWdlcjwvc3Ryb25nPgorICAgIGVsZW1lbnQgLSB0aGlzIGlzIHJlcXVpcmVkIGZvciB1c2Ugb2YgPGNvZGU+UGVyc2lzdGVudE1hbmFnZXI8L2NvZGU+LjwvcD4KKworICAgIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gb2YgTWFuYWdlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgaW4KKyAgICBhZGRpdGlvbiB0byB0aGUgPGEgaHJlZj0iI0NvbW1vbiBBdHRyaWJ1dGVzIj5Db21tb24gQXR0cmlidXRlczwvYT4KKyAgICBkZXNjcmliZWQgZWFybGllci48L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGdvcml0aG0iIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPk5hbWUgb2YgdGhlIDxlbT5NZXNzYWdlIERpZ2VzdDwvZW0+IGFsZ29yaXRobSB1c2VkIHRvIGNhbGN1bGF0ZQorICAgICAgICBzZXNzaW9uIGlkZW50aWZpZXJzIHByb2R1Y2VkIGJ5IHRoaXMgTWFuYWdlci4gIFRoaXMgdmFsdWUgbXVzdAorICAgICAgICBiZSBzdXBwb3J0ZWQgYnkgdGhlIDxjb2RlPmphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDwvY29kZT4gY2xhc3MuCisgICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzICJNRDUiLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UuICBUaGlzIGNsYXNzIG11c3QKKyAgICAgICAgaW1wbGVtZW50IHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI8L2NvZGU+IGludGVyZmFjZS4KKyAgICAgICAgWW91IDxzdHJvbmc+bXVzdDwvc3Ryb25nPiBzcGVjaWZ5CisgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5QZXJzaXN0ZW50TWFuYWdlcjwvY29kZT4gdG8gdXNlCisgICAgICAgIHRoaXMgbWFuYWdlciBpbXBsZW1lbnRhdGlvbi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbnRyb3B5IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5BIFN0cmluZyB2YWx1ZSB0aGF0IGlzIHV0aWxpemVkIHdoZW4gc2VlZGluZyB0aGUgcmFuZG9tIG51bWJlcgorICAgICAgICBnZW5lcmF0b3IgdXNlZCB0byBjcmVhdGUgc2Vzc2lvbiBpZGVudGlmaWVycyBmb3IgdGhpcyBNYW5hZ2VyLgorICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCBhIHNlbWktdXNlZnVsIHZhbHVlIGlzIGNhbGN1bGF0ZWQsIGJ1dCBhIGxvbmcKKyAgICAgICAgU3RyaW5nIHZhbHVlIHNob3VsZCBiZSBzcGVjaWZpZWQgaW4gc2VjdXJpdHktY29uc2Npb3VzCisgICAgICAgIGVudmlyb25tZW50cy48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhBY3RpdmVTZXNzaW9ucyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyB0aGF0IHdpbGwgYmUgY3JlYXRlZCBieQorICAgICAgICB0aGlzIE1hbmFnZXIsIG9yIC0xICh0aGUgZGVmYXVsdCkgZm9yIG5vIGxpbWl0LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1heElkbGVCYWNrdXAiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSB0aW1lIGludGVydmFsIChpbiBzZWNvbmRzKSBzaW5jZSB0aGUgbGFzdCBhY2Nlc3MgdG8gYSBzZXNzaW9uCisgICAgICAgIGJlZm9yZSBpdCBpcyBlbGlnaWJsZSBmb3IgYmVpbmcgcGVyc2lzdGVkIHRvIHRoZSBzZXNzaW9uIHN0b3JlLCBvcgorICAgICAgICA8Y29kZT4tMTwvY29kZT4gdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuICBCeSBkZWZhdWx0LCB0aGlzIGZlYXR1cmUgaXMKKyAgICAgICAgZGlzYWJsZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4SWRsZVN3YXAiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSB0aW1lIGludGVydmFsIChpbiBzZWNvbmRzKSBzaW5jZSB0aGUgbGFzdCBhY2Nlc3MgdG8gYSBzZXNzaW9uCisgICAgICAgIGJlZm9yZSBpdCBzaG91bGQgYmUgcGVyc2lzdGVkIHRvIHRoZSBzZXNzaW9uIHN0b3JlLCBhbmQKKyAgICAgICAgcGFzc2l2YXRlZCBvdXQgb2YgdGhlIHNlcnZlcidzIG1lbW9yeSwgb3IgPGNvZGU+LTE8L2NvZGU+IHRvIGRpc2FibGUKKyAgICAgICAgdGhpcyBmZWF0dXJlLiAgSWYgdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQsIHRoZSB0aW1lIGludGVydmFsIHNwZWNpZmllZAorICAgICAgICBoZXJlIHNob3VsZCBiZSBlcXVhbCB0byBvciBsb25nZXIgdGhhbiB0aGUgdmFsdWUgc3BlY2lmaWVkIGZvcgorICAgICAgICA8Y29kZT5tYXhJZGxlQmFja3VwPC9jb2RlPi4gIEJ5IGRlZmF1bHQsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtaW5JZGxlU3dhcCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhlIHRpbWUgaW50ZXJ2YWwgKGluIHNlY29uZHMpIHNpbmNlIHRoZSBsYXN0IGFjY2VzcyB0byBhIHNlc3Npb24KKyAgICAgICAgYmVmb3JlIGl0IHdpbGwgYmUgZWxpZ2libGUgdG8gYmUgcGVyc2lzdGVkIHRvIHRoZSBzZXNzaW9uIHN0b3JlLCBhbmQKKyAgICAgICAgcGFzc2l2YXRlZCBvdXQgb2YgdGhlIHNlcnZlcidzIG1lbW9yeSwgb3IgPGNvZGU+LTE8L2NvZGU+IGZvciB0aGlzCisgICAgICAgIHN3YXBwaW5nIHRvIGJlIGF2YWlsYWJsZSBhdCBhbnkgdGltZS4gIElmIHNwZWNpZmllZCwgdGhpcyB2YWx1ZSBzaG91bGQKKyAgICAgICAgYmUgbGVzcyB0aGFuIHRoYXQgc3BlY2lmaWVkIGJ5IDxjb2RlPm1heElkbGVTd2FwPC9jb2RlPi4gIEJ5IGRlZmF1bHQsCisgICAgICAgIHRoaXMgdmFsdWUgaXMgc2V0IHRvIDxjb2RlPi0xPC9jb2RlPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhJbmFjdGl2ZUludGVydmFsIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGUgaW5pdGlhbCBtYXhpbXVtIHRpbWUgaW50ZXJ2YWwsIGluIHNlY29uZHMsIAorICAgICAgICBiZXR3ZWVuIGNsaWVudCByZXF1ZXN0cyBiZWZvcmUgYSBzZXNzaW9uIGlzIGludmFsaWRhdGVkLiBBIG5lZ2F0aXZlIHZhbHVlCisgICAgICAgIHdpbGwgcmVzdWx0IGluIHNlc3Npb25zIG5ldmVyIHRpbWluZyBvdXQuIElmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHByb3ZpZGVkLAorICAgICAgICBhIGRlZmF1bHQgb2YgNjAgc2Vjb25kcyBpcyB1c2VkLjwvcD4KKyAgICAgICAgCisgICAgICAgIDxwPlRoaXMgYXR0cmlidXRlIHByb3ZpZGVzIHRoZSBpbml0aWFsIHZhbHVlIHdoZW5ldmVyIGEgCisgICAgICAgIG5ldyBzZXNzaW9uIGlzIGNyZWF0ZWQsIGJ1dCB0aGUgaW50ZXJ2YWwgbWF5IGJlIGR5bmFtaWNhbGx5IAorICAgICAgICB2YXJpZWQgYnkgYSBzZXJ2bGV0IHZpYSB0aGUgCisgICAgICAgIDxjb2RlPnNldE1heEluYWN0aXZlSW50ZXJ2YWw8L2NvZGU+bWV0aG9kIG9mIHRoZSA8Y29kZT5IdHRwU2Vzc2lvbjwvY29kZT4gb2JqZWN0LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InJhbmRvbUNsYXNzIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5KYXZhIGNsYXNzIG5hbWUgb2YgdGhlIDxjb2RlPmphdmEudXRpbC5SYW5kb208L2NvZGU+CisgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRvIHVzZS4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgICAgIDxjb2RlPmphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tPC9jb2RlPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzYXZlT25SZXN0YXJ0IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5TaG91bGQgYWxsIHNlc3Npb25zIGJlIHBlcnNpc3RlZCBhbmQgcmVsb2FkZWQgd2hlbiBUb21jYXQgaXMgc2h1dAorICAgICAgICBkb3duIGFuZCByZXN0YXJ0ZWQgKG9yIHdoZW4gdGhpcyBhcHBsaWNhdGlvbiBpcyByZWxvYWRlZCk/ICBCeSBkZWZhdWx0LAorICAgICAgICB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2Vzc2lvbklkTGVuZ3RoIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGUgbGVuZ3RoIG9mIHNlc3Npb24gaWRzIGNyZWF0ZWQgYnkgdGhpcyBNYW5hZ2VyLCBleGNsdWRpbmcgYW55CisgICAgICAgIEpWTSByb3V0ZSBpbmZvcm1hdGlvbiB1c2VkIGZvciBsb2FkIGJhbGFuY2luZy4gCisgICAgICAgIFRoZSBkZWZhdWx0IGlzIDE2LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPHA+SW4gb3JkZXIgdG8gc3VjY2Vzc2Z1bGx5IHVzZSBhIFBlcnNpc3RlbnRNYW5hZ2VyLCB5b3UgbXVzdCBuZXN0IGluc2lkZQorICAgIGl0IGEgPHN0cm9uZz4mbHQ7U3RvcmUmZ3Q7PC9zdHJvbmc+IGVsZW1lbnQsIGFzIGRlc2NyaWJlZCBiZWxvdy48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJOZXN0ZWQgQ29tcG9uZW50cyI+CisKKyAgPGgzPlN0YW5kYXJkIE1hbmFnZXIgSW1wbGVtZW50YXRpb248L2gzPgorCisgIDxwPklmIHlvdSBhcmUgdXNpbmcgdGhlIDxlbT5TdGFuZGFyZCBNYW5hZ2VyIEltcGxlbWVudGF0aW9uPC9lbT4KKyAgYXMgZGVzY3JpYmVkIGFib3ZlLCBubyBlbGVtZW50cyBtYXkgYmUgbmVzdGVkIGluc2lkZSB5b3VyCisgIDxzdHJvbmc+Jmx0O01hbmFnZXImZ3Q7PC9zdHJvbmc+IGVsZW1lbnQuPC9wPgorCisgIDxoMz5QZXJzaXN0ZW50IE1hbmFnZXIgSW1wbGVtZW50YXRpb248L2gzPgorCisgIDxwPklmIHlvdSBhcmUgdXNpbmcgdGhlIDxlbT5QZXJzaXN0ZW50IE1hbmFnZXIgSW1wbGVtZW50YXRpb248L2VtPgorICBhcyBkZXNjcmliZWQgYWJvdmUsIHlvdSA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gbmVzdCBhCisgIDxzdHJvbmc+Jmx0O1N0b3JlJmd0Ozwvc3Ryb25nPiBlbGVtZW50IGluc2lkZSwgd2hpY2ggZGVmaW5lcyB0aGUKKyAgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBwZXJzaXN0ZW50IGRhdGEgc3RvcmFnZS4gIFR3byBpbXBsZW1lbnRhdGlvbnMKKyAgb2YgdGhlIDxjb2RlPiZsdDtTdG9yZSZndDs8L2NvZGU+IGVsZW1lbnQgYXJlIGN1cnJlbnRseSBhdmFpbGFibGUsCisgIHdpdGggZGlmZmVyZW50IGNoYXJhY3RlcmlzdGljcywgYXMgZGVzY3JpYmVkIGJlbG93bDwvcD4KKworICA8aDU+RmlsZSBCYXNlZCBTdG9yZTwvaDU+CisKKyAgPHA+VGhlIDxlbT5GaWxlIEJhc2VkIFN0b3JlPC9lbT4gaW1wbGVtZW50YXRpb24gc2F2ZXMgc3dhcHBlZCBvdXQKKyAgc2Vzc2lvbnMgaW4gaW5kaXZpZHVhbCBmaWxlcyAobmFtZWQgYmFzZWQgb24gdGhlIHNlc3Npb24gaWRlbnRpZmllcikKKyAgaW4gYSBjb25maWd1cmFibGUgZGlyZWN0b3J5LiAgVGhlcmVmb3JlLCB5b3UgYXJlIGxpa2VseSB0byBlbmNvdW50ZXIKKyAgc2NhbGFiaWxpdHkgcHJvYmxlbXMgYXMgdGhlIG51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMgaW5jcmVhc2VzLCBhbmQKKyAgdGhpcyBzaG91bGQgcHJpbWFyaWx5IGJlIGNvbnNpZGVyZWQgYSBtZWFucyB0byBlYXNpbHkgZXhwZXJpbWVudC48L3A+CisKKyAgPHA+VG8gY29uZmlndXJlIHRoaXMsIGFkZCBhIDxjb2RlPiZsdDtTdG9yZSZndDs8L2NvZGU+IG5lc3RlZCBpbnNpZGUKKyAgeW91ciA8Y29kZT4mbHQ7TWFuYWdlciZndDs8L2NvZGU+IGVsZW1lbnQgd2l0aCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisgIDwvcD4KKworICA8YXR0cmlidXRlcz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2hlY2tJbnRlcnZhbCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBpbnRlcnZhbCAoaW4gc2Vjb25kcykgYmV0d2VlbiBjaGVja3MgZm9yIGV4cGlyZWQgc2Vzc2lvbnMKKyAgICAgIGFtb25nIHRob3NlIHNlc3Npb25zIHRoYXQgYXJlIGN1cnJlbnRseSBzd2FwcGVkIG91dC4gIEJ5IGRlZmF1bHQsCisgICAgICB0aGlzIGludGVydmFsIGlzIHNldCB0byA2MCBzZWNvbmRzIChvbmUgbWludXRlKS48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UuICBUaGlzIGNsYXNzIG11c3QKKyAgICAgIGltcGxlbWVudCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5TdG9yZTwvY29kZT4gaW50ZXJmYWNlLiAgWW91CisgICAgICA8c3Ryb25nPm11c3Q8L3N0cm9uZz4gc3BlY2lmeQorICAgICAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLkZpbGVTdG9yZTwvY29kZT4KKyAgICAgIHRvIHVzZSB0aGlzIGltcGxlbWVudGF0aW9uLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyZWN0b3J5IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+QWJzb2x1dGUgb3IgcmVsYXRpdmUgKHRvIHRoZSB0ZW1wb3Jhcnkgd29yayBkaXJlY3RvcnkgZm9yIHRoaXMgd2ViCisgICAgICBhcHBsaWNhdGlvbikgcGF0aG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIGluZGl2aWR1YWwgc2Vzc2lvbgorICAgICAgZmlsZXMgYXJlIHdyaXR0ZW4uICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgdGVtcG9yYXJ5IHdvcmsgZGlyZWN0b3J5CisgICAgICBhc3NpZ25lZCBieSB0aGUgY29udGFpbmVyIGlzIHV0aWxpemVkLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICA8L2F0dHJpYnV0ZXM+CisKKworICA8aDU+SkRCQyBCYXNlZCBTdG9yZTwvaDU+CisKKyAgPHA+VGhlIDxlbT5KREJDIEJhc2VkIFN0b3JlPC9lbT4gaW1wbGVtZW50YXRpb24gc2F2ZXMgc3dhcHBlZCBvdXQKKyAgc2Vzc2lvbnMgaW4gaW5kaXZpZHVhbCByb3dzIG9mIGEgcHJlY29uZmlndXJlZCB0YWJsZSBpbiBhIGRhdGFiYXNlCisgIHRoYXQgaXMgYWNjZXNzZWQgdmlhIGEgSkRCQyBkcml2ZXIuICBXaXRoIGxhcmdlIG51bWJlcnMgb2Ygc3dhcHBlZCBvdXQKKyAgc2Vzc2lvbnMsIHRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBleGhpYml0IGltcHJvdmVkIHBlcmZvcm1hbmNlIG92ZXIKKyAgdGhlIEZpbGUgQmFzZWQgU3RvcmUgZGVzY3JpYmVkIGFib3ZlLjwvcD4KKworICA8cD5UbyBjb25maWd1cmUgdGhpcywgYWRkIGEgPGNvZGU+Jmx0O1N0b3JlJmd0OzwvY29kZT4gbmVzdGVkIGluc2lkZQorICB5b3VyIDxjb2RlPiZsdDtNYW5hZ2VyJmd0OzwvY29kZT4gZWxlbWVudCB3aXRoIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKyAgPC9wPgorCisgIDxhdHRyaWJ1dGVzPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGVja0ludGVydmFsIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhlIGludGVydmFsIChpbiBzZWNvbmRzKSBiZXR3ZWVuIGNoZWNrcyBmb3IgZXhwaXJlZCBzZXNzaW9ucworICAgICAgYW1vbmcgdGhvc2Ugc2Vzc2lvbnMgdGhhdCBhcmUgY3VycmVudGx5IHN3YXBwZWQgb3V0LiAgQnkgZGVmYXVsdCwKKyAgICAgIHRoaXMgaW50ZXJ2YWwgaXMgc2V0IHRvIDYwIHNlY29uZHMgKG9uZSBtaW51dGUpLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICA8cD5KYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIHRvIHVzZS4gIFRoaXMgY2xhc3MgbXVzdAorICAgICAgaW1wbGVtZW50IHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlN0b3JlPC9jb2RlPiBpbnRlcmZhY2UuICBZb3UKKyAgICAgIDxzdHJvbmc+bXVzdDwvc3Ryb25nPiBzcGVjaWZ5CisgICAgICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uSkRCQ1N0b3JlPC9jb2RlPgorICAgICAgdG8gdXNlIHRoaXMgaW1wbGVtZW50YXRpb24uPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb25uZWN0aW9uVVJMIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICA8cD5UaGUgY29ubmVjdGlvbiBVUkwgdGhhdCB3aWxsIGJlIGhhbmRlZCB0byB0aGUgY29uZmlndXJlZCBKREJDCisgICAgICBkcml2ZXIgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgY29udGFpbmluZyBvdXIKKyAgICAgIHNlc3Npb24gdGFibGUuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkcml2ZXJOYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICA8cD5KYXZhIGNsYXNzIG5hbWUgb2YgdGhlIEpEQkMgZHJpdmVyIHRvIGJlIHVzZWQuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXNzaW9uQXBwQ29sIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICA8cD5OYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4sIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIHNlc3Npb24KKyAgICAgIHRhYmxlLCB0aGF0IGNvbnRhaW5zIHRoZSBFbmdpbmUsIEhvc3QsIGFuZCBXZWIgQXBwbGljYXRpb24gQ29udGV4dAorICAgICAgbmFtZSBpbiB0aGUgZm9ybWF0IDxjb2RlPi9FbmdpbmUvSG9zdC9Db250ZXh0PC9jb2RlPi48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InNlc3Npb25EYXRhQ29sIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICA8cD5OYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4sIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICBzZXNzaW9uIHRhYmxlLCB0aGF0IGNvbnRhaW5zIHRoZSBzZXJpYWxpemVkIGZvcm0gb2YgYWxsIHNlc3Npb24KKyAgICAgIGF0dHJpYnV0ZXMgZm9yIGEgc3dhcHBlZCBvdXQgc2Vzc2lvbi4gIFRoZSBjb2x1bW4gdHlwZSBtdXN0IGFjY2VwdAorICAgICAgYSBiaW5hcnkgb2JqZWN0ICh0eXBpY2FsbHkgY2FsbGVkIGEgQkxPQikuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXNzaW9uSWRDb2wiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgIDxwPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiwgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgIHNlc3Npb24gdGFibGUsIHRoYXQgY29udGFpbnMgdGhlIHNlc3Npb24gaWRlbnRpZmllciBvZiB0aGUKKyAgICAgIHN3YXBwZWQgb3V0IHNlc3Npb24uICBUaGUgY29sdW1uIHR5cGUgbXVzdCBhY2NlcHQgY2hhcmFjdGVyCisgICAgICBzdHJpbmcgZGF0YSBvZiBhdCBsZWFzdCBhcyBtYW55IGNoYXJhY3RlcnMgYXMgYXJlIGNvbnRhaW5lZAorICAgICAgaW4gc2Vzc2lvbiBpZGVudGlmaWVycyBjcmVhdGVkIGJ5IFRvbWNhdCAodHlwaWNhbGx5IDMyKS48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InNlc3Npb25MYXN0QWNjZXNzZWRDb2wiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgIDxwPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiwgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgIHNlc3Npb24gdGFibGUsIHRoYXQgY29udGFpbnMgdGhlIDxjb2RlPmxhc3RBY2Nlc3NlZFRpbWU8L2NvZGU+CisgICAgICBwcm9wZXJ0eSBvZiB0aGlzIHNlc3Npb24uICBUaGUgY29sdW1uIHR5cGUgbXVzdCBhY2NlcHQgYQorICAgICAgSmF2YSA8Y29kZT5sb25nPC9jb2RlPiAoNjQgYml0cykuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXNzaW9uTWF4SW5hY3RpdmVDb2wiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgIDxwPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiwgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgIHNlc3Npb24gdGFibGUsIHRoYXQgY29udGFpbnMgdGhlIDxjb2RlPm1heEluYWN0aXZlSW50ZXJ2YWw8L2NvZGU+CisgICAgICBwcm9wZXJ0eSBvZiB0aGlzIHNlc3Npb24uICBUaGUgY29sdW1uIHR5cGUgbXVzdCBhY2NlcHQgYQorICAgICAgSmF2YSA8Y29kZT5pbnRlZ2VyPC9jb2RlPiAoMzIgYml0cykuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXNzaW9uVGFibGUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgIDxwPk5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlIHRvIGJlIHVzZWQgZm9yIHN0b3Jpbmcgc3dhcHBlZCBvdXQKKyAgICAgIHNlc3Npb25zLiAgVGhpcyB0YWJsZSBtdXN0IGNvbnRhaW4gKGF0IGxlYXN0KSB0aGUgZGF0YWJhc2UgY29sdW1ucworICAgICAgdGhhdCBhcmUgY29uZmlndXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcyBvZiB0aGlzIGVsZW1lbnQuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXNzaW9uVmFsaWRDb2wiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgIDxwPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiwgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgIHNlc3Npb24gdGFibGUsIHRoYXQgY29udGFpbnMgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzCisgICAgICBzd2FwcGVkIG91dCBzZXNzaW9uIGlzIHN0aWxsIHZhbGlkIG9yIG5vdC4gIFRoZSBjb2x1bW4gdHlwZQorICAgICAgbXVzdCBhY2NlcHQgYSBzaW5nbGUgY2hhcmFjdGVyLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICA8L2F0dHJpYnV0ZXM+CisKKyAgPHA+QmVmb3JlIGF0dGVtcHRpbmcgdG8gdXNlIHRoZSBKREJDIEJhc2VkIFN0b3JlIGZvciB0aGUgZmlyc3QgdGltZSwKKyAgeW91IG11c3QgY3JlYXRlIHRoZSB0YWJsZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBzdG9yZSBzd2FwcGVkIG91dCBzZXNzaW9ucy4KKyAgRGV0YWlsZWQgU1FMIGNvbW1hbmRzIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBkYXRhYmFzZSB5b3UgYXJlIHVzaW5nLCBidXQKKyAgYSBzY3JpcHQgbGlrZSB0aGlzIHdpbGwgZ2VuZXJhbGx5IGJlIHJlcXVpcmVkOjwvcD4KKworPHNvdXJjZT4KK2NyZWF0ZSB0YWJsZSB0b21jYXRfc2Vzc2lvbnMgKAorICBzZXNzaW9uX2lkICAgICB2YXJjaGFyKDEwMCkgbm90IG51bGwgcHJpbWFyeSBrZXksCisgIHZhbGlkX3Nlc3Npb24gIGNoYXIoMSkgbm90IG51bGwsCisgIG1heF9pbmFjdGl2ZSAgIGludCBub3QgbnVsbCwKKyAgbGFzdF9hY2Nlc3MgICAgYmlnaW50IG5vdCBudWxsLAorICBhcHBfbmFtZSAgICAgICB2YXJjaGFyKDI1NSksCisgIHNlc3Npb25fZGF0YSAgIG1lZGl1bWJsb2IsCisgIEtFWSBrYXBwX25hbWUoYXBwX25hbWUpCispOworPC9zb3VyY2U+CisKKyAgPHA+SW4gb3JkZXIgZm9yIHRoZSBKREJDIEJhc2VkIFN0b3JlIHRvIHN1Y2Nlc3NmdWxseSBjb25uZWN0IHRvIHlvdXIKKyAgZGF0YWJhc2UsIHRoZSBKREJDIGRyaXZlciB5b3UgY29uZmlndXJlIG11c3QgYmUgdmlzaWJsZSB0byBUb21jYXQncworICBpbnRlcm5hbCBjbGFzcyBsb2FkZXIuICBHZW5lcmFsbHksIHRoYXQgbWVhbnMgeW91IG11c3QgcGxhY2UgdGhlIEpBUgorICBmaWxlIGNvbnRhaW5pbmcgdGhpcyBkcml2ZXIgaW50byB0aGUgPGNvZGU+JENBVEFMSU5BX0hPTUUvc2VydmVyL2xpYjwvY29kZT4KKyAgZGlyZWN0b3J5IChpZiB5b3VyIGFwcGxpY2F0aW9ucyBkbyBub3QgYWxzbyBuZWVkIGl0KSBvciBpbnRvIHRoZQorICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb21tb24vbGliPC9jb2RlPiBkaXJlY3RvcnkgKGlmIHlvdSB3aXNoIHRvIHNoYXJlCisgIHRoaXMgZHJpdmVyIHdpdGggeW91ciB3ZWIgYXBwbGljYXRpb25zLjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNwZWNpYWwgRmVhdHVyZXMiPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iUmVzdGFydCBQZXJzaXN0ZW5jZSI+CisKKyAgICA8cD5XaGVudmVyIENhdGFsaW5hIGlzIHNodXQgZG93biBub3JtYWxseSBhbmQgcmVzdGFydGVkLCBvciB3aGVuIGFuCisgICAgYXBwbGljYXRpb24gcmVsb2FkIGlzIHRyaWdnZXJlZCwgdGhlIHN0YW5kYXJkIE1hbmFnZXIgaW1wbGVtZW50YXRpb24KKyAgICB3aWxsIGF0dGVtcHQgdG8gc2VyaWFsaXplIGFsbCBjdXJyZW50bHkgYWN0aXZlIHNlc3Npb25zIHRvIGEgZGlzaworICAgIGZpbGUgbG9jYXRlZCB2aWEgdGhlIDxjb2RlPnBhdGhuYW1lPC9jb2RlPiBhdHRyaWJ1dGUuICBBbGwgc3VjaCBzYXZlZAorICAgIHNlc3Npb25zIHdpbGwgdGhlbiBiZSBkZXNlcmlhbGl6ZWQgYW5kIGFjdGl2YXRlZCAoYXNzdW1pbmcgdGhleSBoYXZlCisgICAgbm90IGV4cGlyZWQgaW4gdGhlIG1lYW4gdGltZSkgd2hlbiB0aGUgYXBwbGljYXRpb24gcmVsb2FkIGlzIGNvbXBsZXRlZC48L3A+CisKKyAgICA8cD5JbiBvcmRlciB0byBzdWNjZXNzZnVsbHkgcmVzdG9yZSB0aGUgc3RhdGUgb2Ygc2Vzc2lvbiBhdHRyaWJ1dGVzLAorICAgIGFsbCBzdWNoIGF0dHJpYnV0ZXMgTVVTVCBpbXBsZW1lbnQgdGhlIDxjb2RlPmphdmEuaW8uU2VyaWFsaXphYmxlPC9jb2RlPgorICAgIGludGVyZmFjZS4gIFlvdSBNQVkgY2F1c2UgdGhlIE1hbmFnZXIgdG8gZW5mb3JjZSB0aGlzIHJlc3RyaWN0aW9uIGJ5CisgICAgaW5jbHVkaW5nIHRoZSA8Y29kZT4mbHQ7ZGlzdHJpYnV0YWJsZSZndDs8L2NvZGU+IGVsZW1lbnQgaW4geW91ciB3ZWIKKyAgICBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+KS48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9wcm9qZWN0LnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL3Byb2plY3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYzg4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9wcm9qZWN0LnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8cHJvamVjdCBuYW1lPSJBcGFjaGUgVG9tY2F0IENvbmZpZ3VyYXRpb24gUmVmZXJlbmNlIgorICAgICAgICBocmVmPSJodHRwOi8vdG9tY2F0LmFwYWNoZS5vcmcvIj4KKworICA8dGl0bGU+QXBhY2hlIFRvbWNhdCBDb25maWd1cmF0aW9uIFJlZmVyZW5jZTwvdGl0bGU+CisKKyAgPGxvZ28gaHJlZj0iL2ltYWdlcy90b21jYXQuZ2lmIj4KKyAgICBUaGUgQXBhY2hlIFRvbWNhdCBTZXJ2bGV0L0pTUCBDb250YWluZXIKKyAgPC9sb2dvPgorCisgICAgCisgIDxib2R5PgorCisgICAgPG1lbnUgbmFtZT0iTGlua3MiPgorICAgICAgICA8aXRlbSBuYW1lPSJEb2NzIEhvbWUiICAgICAgICAgICAgIGhyZWY9Ii4uL2luZGV4Lmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iQ29uZmlnIFJlZi4gSG9tZSIgICAgICBocmVmPSJpbmRleC5odG1sIi8+CisgICAgPC9tZW51PgorCisgICAgPG1lbnUgbmFtZT0iVG9wIExldmVsIEVsZW1lbnRzIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iU2VydmVyIiAgICAgICAgICAgICAgICBocmVmPSJzZXJ2ZXIuaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJTZXJ2aWNlIiAgICAgICAgICAgICAgIGhyZWY9InNlcnZpY2UuaHRtbCIvPgorICAgIDwvbWVudT4KKworICAgIDxtZW51IG5hbWU9IkNvbm5lY3RvcnMiPgorICAgICAgICA8aXRlbSBuYW1lPSJIVFRQIiAgICAgICAgICAgICAgICAgIGhyZWY9Imh0dHAuaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJBSlAiICAgICAgICAgICAgICAgICAgIGhyZWY9ImFqcC5odG1sIi8+CisgICAgPC9tZW51PgorCisgICAgPG1lbnUgbmFtZT0iQ29udGFpbmVycyI+CisgICAgICAgIDxpdGVtIG5hbWU9IkNvbnRleHQiICAgICAgICAgICAgICAgaHJlZj0iY29udGV4dC5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IkVuZ2luZSIgICAgICAgICAgICAgICAgaHJlZj0iZW5naW5lLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iSG9zdCIgICAgICAgICAgICAgICAgICBocmVmPSJob3N0Lmh0bWwiLz4KKyAgICA8L21lbnU+CisKKyAgICA8bWVudSBuYW1lPSJOZXN0ZWQgQ29tcG9uZW50cyI+CisgICAgICAgIDxpdGVtIG5hbWU9Ikdsb2JhbCBSZXNvdXJjZXMiICAgICAgaHJlZj0iZ2xvYmFscmVzb3VyY2VzLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iTG9hZGVyIiAgICAgICAgICAgICAgICBocmVmPSJsb2FkZXIuaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJNYW5hZ2VyIiAgICAgICAgICAgICAgIGhyZWY9Im1hbmFnZXIuaHRtbCIvPiAKKyAgICAgICAgPGl0ZW0gbmFtZT0iUmVhbG0iICAgICAgICAgICAgICAgICBocmVmPSJyZWFsbS5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IlJlc291cmNlcyIgICAgICAgICAgICAgaHJlZj0icmVzb3VyY2VzLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iVmFsdmUiICAgICAgICAgICAgICAgICBocmVmPSJ2YWx2ZS5odG1sIi8+CisgICAgPC9tZW51PgorCisgIDwvYm9keT4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvcmVhbG0ueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvcmVhbG0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MDYzMTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9yZWFsbS54bWwKQEAgLTAsMCArMSw1NzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJyZWFsbS5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBSZWFsbSBDb21wb25lbnQ8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKyAgPHA+QSA8c3Ryb25nPlJlYWxtPC9zdHJvbmc+IGVsZW1lbnQgcmVwcmVzZW50cyBhICJkYXRhYmFzZSIgb2YgdXNlcm5hbWVzLAorICBwYXNzd29yZHMsIGFuZCA8ZW0+cm9sZXM8L2VtPiAoc2ltaWxhciB0byBVbml4IDxlbT5ncm91cHM8L2VtPikgYXNzaWduZWQKKyAgdG8gdGhvc2UgdXNlcnMuICBEaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIFJlYWxtIGFsbG93IENhdGFsaW5hIHRvIGJlCisgIGludGVncmF0ZWQgaW50byBlbnZpcm9ubWVudHMgd2hlcmUgc3VjaCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBpcyBhbHJlYWR5CisgIGJlaW5nIGNyZWF0ZWQgYW5kIG1haW50YWluZWQsIGFuZCB0aGVuIHV0aWxpemUgdGhhdCBpbmZvcm1hdGlvbiB0byBpbXBsZW1lbnQKKyAgPGVtPkNvbnRhaW5lciBNYW5hZ2VkIFNlY3VyaXR5PC9lbT4gYXMgZGVzY3JpYmVkIGluIHRoZSBTZXJ2bGV0CisgIFNwZWNpZmljYXRpb24uPC9wPgorCisgIDxwPllvdSBtYXkgbmVzdCBhIFJlYWxtIGluc2lkZSBhbnkgQ2F0YWxpbmEgY29udGFpbmVyCisgIDxhIGhyZWY9ImVuZ2luZS5odG1sIj5FbmdpbmU8L2E+LCA8YSBocmVmPSJob3N0Lmh0bWwiPkhvc3Q8L2E+LCBvcgorICA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+KS4gIEluIGFkZGl0aW9uLCBSZWFsbXMgYXNzb2NpYXRlZCB3aXRoCisgIGFuIEVuZ2luZSBvciBhIEhvc3QgYXJlIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGJ5IGxvd2VyLWxldmVsCisgIGNvbnRhaW5lcnMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4uPC9wPgorCisgIDxwPkZvciBtb3JlIGluLWRlcHRoIGluZm9ybWF0aW9uIGFib3V0IGNvbnRhaW5lciBtYW5hZ2VkIHNlY3VyaXR5IGluIHdlYgorICBhcHBsaWNhdGlvbnMsIGFzIHdlbGwgYXMgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb25maWd1cmluZyBhbmQgdXNpbmcgdGhlIAorICBzdGFuZGFyZCByZWFsbSBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLCBwbGVhc2Ugc2VlIHRoZSAKKyAgPGEgaHJlZj0iLi4vcmVhbG0taG93dG8uaHRtbCI+Q29udGFpbmVyLU1hbmFnZWQgU2VjdXJpdHkgR3VpZGU8L2E+LgorICA8L3A+CisKKyAgICA8YmxvY2txdW90ZT48ZW0+CisgICAgPHA+VGhlIGRlc2NyaXB0aW9uIGJlbG93IHVzZXMgdGhlIHZhcmlhYmxlIG5hbWUgJENBVEFMSU5BX0hPTUUKKyAgICB0byByZWZlciB0byB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IGhhdmUgaW5zdGFsbGVkIFRvbWNhdCA1LAorICAgIGFuZCBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgYWdhaW5zdCB3aGljaCBtb3N0IHJlbGF0aXZlIHBhdGhzIGFyZQorICAgIHJlc29sdmVkLiAgSG93ZXZlciwgaWYgeW91IGhhdmUgY29uZmlndXJlZCBUb21jYXQgNSBmb3IgbXVsdGlwbGUKKyAgICBpbnN0YW5jZXMgYnkgc2V0dGluZyBhIENBVEFMSU5BX0JBU0UgZGlyZWN0b3J5LCB5b3Ugc2hvdWxkIHVzZQorICAgICRDQVRBTElOQV9CQVNFIGluc3RlYWQgb2YgJENBVEFMSU5BX0hPTUUgZm9yIGVhY2ggb2YgdGhlc2UKKyAgICByZWZlcmVuY2VzLjwvcD4KKyAgICA8L2VtPjwvYmxvY2txdW90ZT4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbW1vbiBBdHRyaWJ1dGVzIj4KKworICAgIDxwPkFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgPHN0cm9uZz5SZWFsbTwvc3Ryb25nPgorICAgIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5KYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIHRvIHVzZS4gIFRoaXMgY2xhc3MgbXVzdAorICAgICAgICBpbXBsZW1lbnQgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG08L2NvZGU+IGludGVyZmFjZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaWdlc3QiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBkaWdlc3QgYWxnb3JpdGhtIHVzZWQgdG8gc3RvcmUgcGFzc3dvcmRzIGluIG5vbi1wbGFpbnRleHQKKyAgICAgICAgZm9ybWF0cy4gVmFsaWQgdmFsdWVzIGFyZSB0aG9zZSBhY2NlcHRlZCBmb3IgdGhlIGFsZ29yaXRobSBuYW1lIGJ5IHRoZQorICAgICAgICA8Y29kZT5qYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q8L2NvZGU+IGNsYXNzLiAgU2VlCisgICAgICAgIDxhIGhyZWY9Ii4uL3JlYWxtLWhvd3RvLmh0bWwjRGlnZXN0ZWQgUGFzc3dvcmRzIj5EaWdlc3RlZCBQYXNzd29yZHM8L2E+CisgICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkLCBwYXNzd29yZHMgYXJlIHN0b3JlZCBpbiBjbGVhcgorICAgICAgICB0ZXh0LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRpZ2VzdEVuY29kaW5nIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGUgY2hhcnNldCBmb3IgZW5jb2RpbmcgZGlnZXN0cy4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBwbGF0Zm9ybQorICAgICAgICBkZWZhdWx0IHdpbGwgYmUgdXNlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBJbXBsZW1lbnRhdGlvbiI+CisKKyAgICA8cD5Vbmxpa2UgbW9zdCBDYXRhbGluYSBjb21wb25lbnRzLCB0aGVyZSBhcmUgc2V2ZXJhbCBzdGFuZGFyZAorICAgIDxzdHJvbmc+UmVhbG08L3N0cm9uZz4gaW1wbGVtZW50YXRpb25zIGF2YWlsYWJsZS4gIEFzIGEgcmVzdWx0LAorICAgIHRoZSA8Y29kZT5jbGFzc05hbWU8L2NvZGU+IGF0dHJpYnV0ZSBNVVNUIGJlIHVzZWQgdG8gc2VsZWN0IHRoZQorICAgIGltcGxlbWVudGF0aW9uIHlvdSB3aXNoIHRvIHVzZS48L3A+CisKKyAgICA8aDM+SkRCQyBEYXRhYmFzZSBSZWFsbSAob3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG0pPC9oMz4KKworICAgIDxwPlRoZSA8c3Ryb25nPkpEQkMgRGF0YWJhc2UgUmVhbG08L3N0cm9uZz4gY29ubmVjdHMgQ2F0YWxpbmEgdG8KKyAgICBhIHJlbGF0aW9uYWwgZGF0YWJhc2UsIGFjY2Vzc2VkIHRocm91Z2ggYW4gYXBwcm9wcmlhdGUgSkRCQyBkcml2ZXIsCisgICAgdG8gcGVyZm9ybSBsb29rdXBzIG9mIHVzZXJuYW1lcywgcGFzc3dvcmRzLCBhbmQgdGhlaXIgYXNzb2NpYXRlZAorICAgIHJvbGVzLiAgQmVjYXVzZSB0aGUgbG9va3VwIGlzIGRvbmUgZWFjaCB0aW1lIHRoYXQgaXQgaXMgcmVxdWlyZWQsCisgICAgY2hhbmdlcyB0byB0aGUgZGF0YWJhc2Ugd2lsbCBiZSBpbW1lZGlhdGVseSByZWZsZWN0ZWQgaW4gdGhlCisgICAgaW5mb3JtYXRpb24gdXNlZCB0byBhdXRoZW50aWNhdGUgbmV3IGxvZ2lucy48L3A+CisKKyAgICA8cD5BIHJpY2ggc2V0IG9mIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBsZXRzIHlvdSBjb25maWd1cmUgdGhlIHJlcXVpcmVkCisgICAgY29ubmVjdGlvbiB0byB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSwgYXMgd2VsbCBhcyB0aGUgdGFibGUgYW5kCisgICAgY29sdW1uIG5hbWVzIHVzZWQgdG8gcmV0cmlldmUgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbm5lY3Rpb25OYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPlRoZSBkYXRhYmFzZSB1c2VybmFtZSB0byB1c2Ugd2hlbiBlc3RhYmxpc2hpbmcgdGhlIEpEQkMKKyAgICAgICAgY29ubmVjdGlvbi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb25uZWN0aW9uUGFzc3dvcmQiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIGRhdGFiYXNlIHBhc3N3b3JkIHRvIHVzZSB3aGVuIGVzdGFibGlzaGluZyB0aGUgSkRCQworICAgICAgICBjb25uZWN0aW9uLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbm5lY3Rpb25VUkwiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIGNvbm5lY3Rpb24gVVJMIHRvIGJlIHBhc3NlZCB0byB0aGUgSkRCQyBkcml2ZXIgd2hlbgorICAgICAgICBlc3RhYmxpc2hpbmcgYSBkYXRhYmFzZSBjb25uZWN0aW9uLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRyaXZlck5hbWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+RnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgSkRCQyBkcml2ZXIgdG8gYmUgdXNlZCB0bworICAgICAgICBjb25uZWN0IHRvIHRoZSBhdXRoZW50aWNhdGlvbiBkYXRhYmFzZS4gQ29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKKyAgICAgICAgeW91ciBKREJDIGRyaXZlciBmb3IgdGhlIGFwcHJvcHJpYXRlIHZhbHVlLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InJvbGVOYW1lQ29sIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPk5hbWUgb2YgdGhlIGNvbHVtbiwgaW4gdGhlICJ1c2VyIHJvbGVzIiB0YWJsZSwgd2hpY2ggY29udGFpbnMKKyAgICAgICAgYSByb2xlIG5hbWUgYXNzaWduZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdXNlci48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyQ3JlZENvbCIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5OYW1lIG9mIHRoZSBjb2x1bW4sIGluIHRoZSAidXNlcnMiIHRhYmxlLCB3aGljaCBjb250YWlucyB0aGUgdXNlcidzCisgICAgICAgIGNyZWRlbnRpYWxzIChpLmUuIHBhc3N3b3JkKS4gIElmIGEgdmFsdWUgZm9yIHRoZSA8Y29kZT5kaWdlc3Q8L2NvZGU+CisgICAgICAgIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsIHRoaXMgY29tcG9uZW50IHdpbGwgYXNzdW1lIHRoYXQgdGhlIHBhc3N3b3JkcworICAgICAgICBoYXZlIGJlZW4gZW5jb2RlZCB3aXRoIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtLiAgT3RoZXJ3aXNlLCB0aGV5IHdpbGwgYmUKKyAgICAgICAgYXNzdW1lZCB0byBiZSBpbiBjbGVhciB0ZXh0LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJOYW1lQ29sIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPk5hbWUgb2YgdGhlIGNvbHVtbiwgaW4gdGhlICJ1c2VycyIgYW5kICJ1c2VyIHJvbGVzIiB0YWJsZSwKKyAgICAgICAgdGhhdCBjb250YWlucyB0aGUgdXNlcidzIHVzZXJuYW1lLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJSb2xlVGFibGUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRoYXQgY29udGFpbnMgb25lIHJvdyBmb3IgZWFjaCA8ZW0+cm9sZTwvZW0+CisgICAgICAgIGFzc2lnbmVkIHRvIGEgcGFydGljdWxhciA8ZW0+dXNlcm5hbWU8L2VtPi4gIFRoaXMgdGFibGUgbXVzdCBpbmNsdWRlIGF0CisgICAgICAgIGxlYXN0IHRoZSBjb2x1bW5zIG5hbWVkIGJ5IHRoZSA8Y29kZT51c2VyTmFtZUNvbDwvY29kZT4gYW5kCisgICAgICAgIDxjb2RlPnJvbGVOYW1lQ29sPC9jb2RlPiBhdHRyaWJ1dGVzLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJUYWJsZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgbmFtZSBvZiB0aGUgdGFibGUgdGhhdCBjb250YWlucyBvbmUgcm93IGZvciBlYWNoCisgICAgICAgIDxlbT51c2VybmFtZTwvZW0+IHRvIGJlIHJlY29nbml6ZWQgYnkgVG9tY2F0LiAgVGhpcyB0YWJsZSBtdXN0IGluY2x1ZGUKKyAgICAgICAgYXQgbGVhc3QgdGhlIGNvbHVtbnMgbmFtZWQgYnkgdGhlIDxjb2RlPnVzZXJOYW1lQ29sPC9jb2RlPiBhbmQKKyAgICAgICAgPGNvZGU+dXNlckNyZWRDb2w8L2NvZGU+IGF0dHJpYnV0ZXMuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8cD5TZWUgdGhlIDxhIGhyZWY9Ii4uL3JlYWxtLWhvd3RvLmh0bWwiPkNvbnRhaW5lci1NYW5hZ2VkIFNlY3VyaXR5IEd1aWRlPC9hPiBmb3IgbW9yZQorICAgIGluZm9ybWF0aW9uIG9uIHNldHRpbmcgdXAgY29udGFpbmVyIG1hbmFnZWQgc2VjdXJpdHkgdXNpbmcgdGhlCisgICAgSkRCQyBEYXRhYmFzZSBSZWFsbSBjb21wb25lbnQuPC9wPgorCisKKyAgICA8aDM+CisgICAgICBEYXRhU291cmNlIERhdGFiYXNlIFJlYWxtIChvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkRhdGFTb3VyY2VSZWFsbSkKKyAgICA8L2gzPgorCisgICAgPHA+VGhlIDxzdHJvbmc+RGF0YVNvdXJjZSBEYXRhYmFzZSBSZWFsbTwvc3Ryb25nPiBjb25uZWN0cyBDYXRhbGluYSB0bworICAgIGEgcmVsYXRpb25hbCBkYXRhYmFzZSwgYWNjZXNzZWQgdGhyb3VnaCBhIEpOREkgbmFtZWQgSkRCQyBEYXRhU291cmNlCisgICAgdG8gcGVyZm9ybSBsb29rdXBzIG9mIHVzZXJuYW1lcywgcGFzc3dvcmRzLCBhbmQgdGhlaXIgYXNzb2NpYXRlZAorICAgIHJvbGVzLiAgQmVjYXVzZSB0aGUgbG9va3VwIGlzIGRvbmUgZWFjaCB0aW1lIHRoYXQgaXQgaXMgcmVxdWlyZWQsCisgICAgY2hhbmdlcyB0byB0aGUgZGF0YWJhc2Ugd2lsbCBiZSBpbW1lZGlhdGVseSByZWZsZWN0ZWQgaW4gdGhlCisgICAgaW5mb3JtYXRpb24gdXNlZCB0byBhdXRoZW50aWNhdGUgbmV3IGxvZ2lucy48L3A+CisKKyAgICA8cD5UaGUgSkRCQyBSZWFsbSB1c2VzIGEgc2luZ2xlIGRiIGNvbm5lY3Rpb24uIFRoaXMgcmVxdWlyZXMgdGhhdAorICAgIHJlYWxtIGJhc2VkIGF1dGhlbnRpY2F0aW9uIGJlIHN5bmNocm9uaXplZCwgaS5lLiBvbmx5IG9uZSBhdXRoZW50aWNhdGlvbgorICAgIGNhbiBiZSBkb25lIGF0IGEgdGltZS4gVGhpcyBjb3VsZCBiZSBhIGJvdHRsZW5lY2sgZm9yIGFwcGxpY2F0aW9ucworICAgIHdpdGggaGlnaCB2b2x1bWVzIG9mIHJlYWxtIGJhc2VkIGF1dGhlbnRpY2F0aW9ucy48L3A+CisKKyAgICA8cD5UaGUgRGF0YVNvdXJjZSBEYXRhYmFzZSBSZWFsbSBzdXBwb3J0cyBzaW11bHRhbmVvdXMgcmVhbG0gYmFzZWQKKyAgICBhdXRoZW50aWNhdGlvbnMgYW5kIGFsbG93cyB0aGUgdW5kZXJseWluZyBKREJDIERhdGFTb3VyY2UgdG8KKyAgICBoYW5kbGUgb3B0aW1pemF0aW9ucyBsaWtlIGRhdGFiYXNlIGNvbm5lY3Rpb24gcG9vbGluZy48L3A+CisKKyAgICA8cD5BIHJpY2ggc2V0IG9mIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBsZXRzIHlvdSBjb25maWd1cmUgdGhlIG5hbWUKKyAgICBvZiB0aGUgSk5ESSBKREJDIERhdGFTb3VyY2UsIGFzIHdlbGwgYXMgdGhlIHRhYmxlIGFuZAorICAgIGNvbHVtbiBuYW1lcyB1c2VkIHRvIHJldHJpZXZlIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbjo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkYXRhU291cmNlTmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgSk5ESSBuYW1lZCBKREJDIERhdGFTb3VyY2UgZm9yIHlvdXIgZGF0YWJhc2UuIElmIHRoZSBEYXRhU291cmNlCisgICAgICAgIGlzIGxvY2FsIHRvIHRoZSBjb250ZXh0LCB0aGUgbmFtZSBpcyByZWxhdGl2ZSB0bworICAgICAgICA8Y29kZT5qYXZhOi9jb21wL2VudjwvY29kZT4sIGFuZCBvdGhlcndpc2UgdGhlIG5hbWUgc2hvdWxkIG1hdGNoIHRoZQorICAgICAgICBuYW1lIHVzZWQgdG8gZGVmaW5lIHRoZSBnbG9iYWwgRGF0YVNvdXJjZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2NhbERhdGFTb3VyY2UiIHJlcXVpcmVkPSJmYWxzZSI+CisgIAorICAgICAgPHA+V2hlbiB0aGUgcmVhbG0gaXMgbmVzdGVkIGluc2lkZSBhIENvbnRleHQgZWxlbWVudCwgdGhpcyBhbGxvd3MgdGhlIAorIAorICAgICAgIHJlYWxtIHRvIHVzZSBhIERhdGFTb3VyY2UgZGVmaW5lZCBmb3IgdGhlIENvbnRleHQgcmF0aGVyIHRoYW4gYSBnbG9iYWwKKworICAgICAgICBEYXRhU291cmNlLiAgSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+OiB1c2UgYSAKKworICAgICAgICBnbG9iYWwgRGF0YVNvdXJjZS48L3A+CisKKyAgICAgIDwvYXR0cmlidXRlPgorICAgIAorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyb2xlTmFtZUNvbCIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5OYW1lIG9mIHRoZSBjb2x1bW4sIGluIHRoZSAidXNlciByb2xlcyIgdGFibGUsIHdoaWNoIGNvbnRhaW5zCisgICAgICAgIGEgcm9sZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIHVzZXIuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlckNyZWRDb2wiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+TmFtZSBvZiB0aGUgY29sdW1uLCBpbiB0aGUgInVzZXJzIiB0YWJsZSwgd2hpY2ggY29udGFpbnMgdGhlIHVzZXIncworICAgICAgICBjcmVkZW50aWFscyAoaS5lLiBwYXNzd29yZCkuICBJZiBhIHZhbHVlIGZvciB0aGUgPGNvZGU+ZGlnZXN0PC9jb2RlPgorICAgICAgICBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGlzIGNvbXBvbmVudCB3aWxsIGFzc3VtZSB0aGF0IHRoZSBwYXNzd29yZHMKKyAgICAgICAgaGF2ZSBiZWVuIGVuY29kZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobS4gIE90aGVyd2lzZSwgdGhleSB3aWxsIGJlCisgICAgICAgIGFzc3VtZWQgdG8gYmUgaW4gY2xlYXIgdGV4dC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyTmFtZUNvbCIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5OYW1lIG9mIHRoZSBjb2x1bW4sIGluIHRoZSAidXNlcnMiIGFuZCAidXNlciByb2xlcyIgdGFibGUsCisgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIHVzZXIncyB1c2VybmFtZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyUm9sZVRhYmxlIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPlRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0aGF0IGNvbnRhaW5zIG9uZSByb3cgZm9yIGVhY2ggPGVtPnJvbGU8L2VtPgorICAgICAgICBhc3NpZ25lZCB0byBhIHBhcnRpY3VsYXIgPGVtPnVzZXJuYW1lPC9lbT4uICBUaGlzIHRhYmxlIG11c3QgaW5jbHVkZSBhdAorICAgICAgICBsZWFzdCB0aGUgY29sdW1ucyBuYW1lZCBieSB0aGUgPGNvZGU+dXNlck5hbWVDb2w8L2NvZGU+IGFuZAorICAgICAgICA8Y29kZT5yb2xlTmFtZUNvbDwvY29kZT4gYXR0cmlidXRlcy48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyVGFibGUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRoYXQgY29udGFpbnMgb25lIHJvdyBmb3IgZWFjaAorICAgICAgICA8ZW0+dXNlcm5hbWU8L2VtPiB0byBiZSByZWNvZ25pemVkIGJ5IFRvbWNhdC4gIFRoaXMgdGFibGUgbXVzdCBpbmNsdWRlCisgICAgICAgIGF0IGxlYXN0IHRoZSBjb2x1bW5zIG5hbWVkIGJ5IHRoZSA8Y29kZT51c2VyTmFtZUNvbDwvY29kZT4gYW5kCisgICAgICAgIDxjb2RlPnVzZXJDcmVkQ29sPC9jb2RlPiBhdHRyaWJ1dGVzLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPHA+U2VlIHRoZSA8YSBocmVmPSIuLi9yZWFsbS1ob3d0by5odG1sI0RhdGFTb3VyY2VSZWFsbSI+CisgICAgRGF0YVNvdXJjZSBSZWFsbSBIT1ctVE88L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHNldHRpbmcgdXAgY29udGFpbmVyCisgICAgbWFuYWdlZCBzZWN1cml0eSB1c2luZyB0aGUgRGF0YVNvdXJjZSBEYXRhYmFzZSBSZWFsbSBjb21wb25lbnQuPC9wPgorCisKKyAgICA8aDM+Sk5ESSBEaXJlY3RvcnkgUmVhbG0gKG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSk5ESVJlYWxtKTwvaDM+CisKKworICAgIDxwPlRoZSA8c3Ryb25nPkpOREkgRGlyZWN0b3J5IFJlYWxtPC9zdHJvbmc+IGNvbm5lY3RzIENhdGFsaW5hIHRvCisgICAgYW4gTERBUCBEaXJlY3RvcnksIGFjY2Vzc2VkIHRocm91Z2ggYW4gYXBwcm9wcmlhdGUgSk5ESSBkcml2ZXIsCisgICAgdGhhdCBzdG9yZXMgdXNlcm5hbWVzLCBwYXNzd29yZHMsIGFuZCB0aGVpciBhc3NvY2lhdGVkCisgICAgcm9sZXMuIENoYW5nZXMgdG8gdGhlIGRpcmVjdG9yeSBhcmUgaW1tZWRpYXRlbHkgcmVmbGVjdGVkIGluIHRoZQorICAgIGluZm9ybWF0aW9uIHVzZWQgdG8gYXV0aGVudGljYXRlIG5ldyBsb2dpbnMuPC9wPgorCisKKyAgICA8cD5UaGUgZGlyZWN0b3J5IHJlYWxtIHN1cHBvcnRzIGEgdmFyaWV0eSBvZiBhcHByb2FjaGVzIHRvIHVzaW5nCisgICAgTERBUCBmb3IgYXV0aGVudGljYXRpb246PC9wPgorCisgICAgPHVsPgorICAgIDxsaT5UaGUgcmVhbG0gY2FuIGVpdGhlciB1c2UgYSBwYXR0ZXJuIHRvIGRldGVybWluZSB0aGUKKyAgICBkaXN0aW5ndWlzaGVkIG5hbWUgKEROKSBvZiB0aGUgdXNlcidzIGRpcmVjdG9yeSBlbnRyeSwgb3Igc2VhcmNoCisgICAgdGhlIGRpcmVjdG9yeSB0byBsb2NhdGUgdGhhdCBlbnRyeS4KKyAgICA8L2xpPgorCisgICAgPGxpPlRoZSByZWFsbSBjYW4gYXV0aGVudGljYXRlIHRoZSB1c2VyIGVpdGhlciBieSBiaW5kaW5nIHRvIHRoZQorICAgIGRpcmVjdG9yeSB3aXRoIHRoZSBETiBvZiB0aGUgdXNlcidzIGVudHJ5IGFuZCB0aGUgcGFzc3dvcmQKKyAgICBwcmVzZW50ZWQgYnkgdGhlIHVzZXIsIG9yIGJ5IHJldHJpZXZpbmcgdGhlIHBhc3N3b3JkIGZyb20gdGhlCisgICAgdXNlcidzIGVudHJ5IGFuZCBwZXJmb3JtaW5nIGEgY29tcGFyaXNvbiBsb2NhbGx5LgorICAgIDwvbGk+CisKKyAgICA8bGk+Um9sZXMgbWF5IGJlIHJlcHJlc2VudGVkIGluIHRoZSBkaXJlY3RvcnkgYXMgZXhwbGljaXQgZW50cmllcworICAgIGZvdW5kIGJ5IGEgZGlyZWN0b3J5IHNlYXJjaCAoZS5nLiBncm91cCBlbnRyaWVzIG9mIHdoaWNoIHRoZSB1c2VyCisgICAgaXMgYSBtZW1iZXIpLCBhcyB0aGUgdmFsdWVzIG9mIGFuIGF0dHJpYnV0ZSBpbiB0aGUgdXNlcidzIGVudHJ5LAorICAgIG9yIGJvdGguCisgICAgPC9saT4KKyAgICA8L3VsPgorCisgICAgPHA+IEEgcmljaCBzZXQgb2YgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIGxldHMgeW91IGNvbmZpZ3VyZSB0aGUKKyAgICByZXF1aXJlZCBiZWhhdmlvdXIgYXMgd2VsbCBhcyB0aGUgY29ubmVjdGlvbiB0byB0aGUgdW5kZXJseWluZworICAgIGRpcmVjdG9yeSBhbmQgdGhlIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBuYW1lcyB1c2VkIHRvIHJldHJpZXZlCisgICAgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGlyZWN0b3J5OjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWx0ZXJuYXRlVVJMIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICAgPHA+SWYgYSBzb2NrZXQgY29ubmVjdGlvbiBjYW4gbm90IGJlIG1hZGUgdG8gdGhlIHByb3ZpZGVyIGF0CisgICAgICAgICB0aGUgPGNvZGU+Y29ubmVjdGlvblVSTDwvY29kZT4gYW4gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gdXNlIHRoZQorICAgICAgICAgPGNvZGU+YWx0ZXJuYXRlVVJMPC9jb2RlPi48L3A+CisgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICA8YXR0cmlidXRlIG5hbWU9ImF1dGhlbnRpY2F0aW9uIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICAgPHA+QSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbiB0byB1c2UuCisgICAgICAgICAibm9uZSIsICJzaW1wbGUiLCAic3Ryb25nIiBvciBhIHByb3ZpZGVyIHNwZWNpZmljIGRlZmluaXRpb24KKyAgICAgICAgIGNhbiBiZSB1c2VkLiBJZiBubyB2YWx1ZSBpcyBnaXZlbiB0aGUgcHJvdmlkZXJzIGRlZmF1bHQgaXMgdXNlZC48L3A+CisgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29ubmVjdGlvbk5hbWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBkaXJlY3RvcnkgdXNlcm5hbWUgdG8gdXNlIHdoZW4gZXN0YWJsaXNoaW5nIGEKKyAgICAgICAgY29ubmVjdGlvbiB0byB0aGUgZGlyZWN0b3J5IGZvciBMREFQIHNlYXJjaCBvcGVyYXRpb25zLiBJZiBub3QKKyAgICAgICAgc3BlY2lmaWVkIGFuIGFub255bW91cyBjb25uZWN0aW9uIGlzIG1hZGUsIHdoaWNoIGlzIG9mdGVuCisgICAgICAgIHN1ZmZpY2llbnQgdW5sZXNzIHlvdSBzcGVjaWZ5IHRoZSA8Y29kZT51c2VyUGFzc3dvcmQ8L2NvZGU+CisgICAgICAgIHByb3BlcnR5LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbm5lY3Rpb25QYXNzd29yZCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhlIGRpcmVjdG9yeSBwYXNzd29yZCB0byB1c2Ugd2hlbiBlc3RhYmxpc2hpbmcgYQorICAgICAgICBjb25uZWN0aW9uIHRvIHRoZSBkaXJlY3RvcnkgZm9yIExEQVAgc2VhcmNoIG9wZXJhdGlvbnMuIElmIG5vdAorICAgICAgICBzcGVjaWZpZWQgYW4gYW5vbnltb3VzIGNvbm5lY3Rpb24gaXMgbWFkZSwgd2hpY2ggaXMgb2Z0ZW4KKyAgICAgICAgc3VmZmljaWVudCB1bmxlc3MgeW91IHNwZWNpZnkgdGhlIDxjb2RlPnVzZXJQYXNzd29yZDwvY29kZT4KKyAgICAgICAgcHJvcGVydHkuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29ubmVjdGlvblVSTCIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgY29ubmVjdGlvbiBVUkwgdG8gYmUgcGFzc2VkIHRvIHRoZSBKTkRJIGRyaXZlciB3aGVuCisgICAgICAgIGVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb24gdG8gdGhlIGRpcmVjdG9yeS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZXh0RmFjdG9yeSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+RnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgZmFjdG9yeSBjbGFzcyB1c2VkCisgICAgICAgIHRvIGFjcXVpcmUgb3VyIEpOREkgPGNvZGU+SW5pdGlhbENvbnRleHQ8L2NvZGU+LiAgQnkgZGVmYXVsdCwKKyAgICAgICAgYXNzdW1lcyB0aGF0IHRoZSBzdGFuZGFyZCBKTkRJIExEQVAgcHJvdmlkZXIgd2lsbCBiZSB1dGlsaXplZAorICAgICAgICAoPGNvZGU+Y29tLnN1bi5qbmRpLmxkYXAuTGRhcEN0eEZhY3Rvcnk8L2NvZGU+KS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIAorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXJlZkFsaWFzZXMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkEgc3RyaW5nIHNwZWNpZnlpbmcgaG93IGFsaWFzZXMgYXJlIHRvIGJlIGRlcmVmZXJlbmNlZCBkdXJpbmcKKyAgICAgICAgc2VhcmNoIG9wZXJhdGlvbnMuIFRoZSBhbGxvd2VkIHZhbHVlcyBhcmUgImFsd2F5cyIsICJuZXZlciIsCisgICAgICAgICJmaW5kaW5nIiBhbmQgInNlYXJjaGluZyIuIElmIG5vdCBzcGVjaWZpZWQsICJhbHdheXMiIGlzIHVzZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvdG9jb2wiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgICA8cD5BIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZWN1cml0eSBwcm90b2NvbCB0byB1c2UuIElmIG5vdCBnaXZlbgorICAgICAgICAgdGhlIHByb3ZpZGVycyBkZWZhdWx0IGlzIHVzZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icm9sZUJhc2UiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBiYXNlIGRpcmVjdG9yeSBlbnRyeSBmb3IgcGVyZm9ybWluZyByb2xlIHNlYXJjaGVzLiBJZgorICAgICAgICBub3Qgc3BlY2lmaWVkIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBpbiB0aGUgZGlyZWN0b3J5IGNvbnRleHQKKyAgICAgICAgd2lsbCBiZSB1c2VkLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InJvbGVOYW1lIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgY29udGFpbnMgcm9sZSBuYW1lcyBpbiB0aGUKKyAgICAgICAgZGlyZWN0b3J5IGVudHJpZXMgZm91bmQgYnkgYSByb2xlIHNlYXJjaC4gSW4gYWRkaXRpb24geW91IGNhbgorICAgICAgICB1c2UgdGhlIDxjb2RlPnVzZXJSb2xlTmFtZTwvY29kZT4gcHJvcGVydHkgdG8gc3BlY2lmeSB0aGUgbmFtZQorICAgICAgICBvZiBhbiBhdHRyaWJ1dGUsIGluIHRoZSB1c2VyJ3MgZW50cnksIGNvbnRhaW5pbmcgYWRkaXRpb25hbAorICAgICAgICByb2xlIG5hbWVzLiAgSWYgPGNvZGU+cm9sZU5hbWU8L2NvZGU+IGlzIG5vdCBzcGVjaWZpZWQgYSByb2xlCisgICAgICAgIHNlYXJjaCBkb2VzIG5vdCB0YWtlIHBsYWNlLCBhbmQgcm9sZXMgYXJlIHRha2VuIG9ubHkgZnJvbSB0aGUKKyAgICAgICAgdXNlcidzIGVudHJ5LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InJvbGVTZWFyY2giIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBMREFQIGZpbHRlciBleHByZXNzaW9uIHVzZWQgZm9yIHBlcmZvcm1pbmcgcm9sZSBzZWFyY2hlcywKKyAgICAgICAgZm9sbG93aW5nIHRoZSBzeW50YXggc3VwcG9ydGVkIGJ5IHRoZQorICAgICAgICA8Y29kZT5qYXZhLnRleHQuTWVzc2FnZUZvcm1hdDwvY29kZT4gY2xhc3MuICBVc2UgPGNvZGU+ezB9PC9jb2RlPiB0bworICAgICAgICBzdWJzdGl0dXRlIHRoZSBkaXN0aW5ndWlzaGVkIG5hbWUgKEROKSBvZiB0aGUgdXNlciwgYW5kL29yCisgICAgICAgIDxjb2RlPnsxfTwvY29kZT4gdG8gc3Vic3RpdHV0ZSB0aGUgdXNlcm5hbWUuIElmIG5vdCBzcGVjaWZpZWQgYSByb2xlCisgICAgICAgIHNlYXJjaCBkb2VzIG5vdCB0YWtlIHBsYWNlIGFuZCByb2xlcyBhcmUgdGFrZW4gb25seSBmcm9tIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgaW4gdGhlIHVzZXIncyBlbnRyeSBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnVzZXJSb2xlTmFtZTwvY29kZT4KKyAgICAgICAgcHJvcGVydHkuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icm9sZVN1YnRyZWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3Ugd2FudCB0byBzZWFyY2ggdGhlIGVudGlyZQorICAgICAgICBzdWJ0cmVlIG9mIHRoZSBlbGVtZW50IHNwZWNpZmllZCBieSB0aGUgPGNvZGU+cm9sZUJhc2U8L2NvZGU+CisgICAgICAgIHByb3BlcnR5IGZvciByb2xlIGVudHJpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBUaGUKKyAgICAgICAgZGVmYXVsdCB2YWx1ZSBvZiA8Y29kZT5mYWxzZTwvY29kZT4gY2F1c2VzIG9ubHkgdGhlIHRvcCBsZXZlbAorICAgICAgICB0byBiZSBzZWFyY2hlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyQmFzZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhlIGJhc2UgZWxlbWVudCBmb3IgdXNlciBzZWFyY2hlcyBwZXJmb3JtZWQgdXNpbmcgdGhlCisgICAgICAgIDxjb2RlPnVzZXJTZWFyY2g8L2NvZGU+IGV4cHJlc3Npb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB0b3AgbGV2ZWwKKyAgICAgICAgZWxlbWVudCBpbiB0aGUgZGlyZWN0b3J5IGNvbnRleHQgd2lsbCBiZSB1c2VkLiBOb3QgdXNlZCBpZiB5b3UgYXJlIHVzaW5nCisgICAgICAgIHRoZSA8Y29kZT51c2VyUGF0dGVybjwvY29kZT4gZXhwcmVzc2lvbi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyUGFzc3dvcmQiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPk5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBpbiB0aGUgdXNlcidzIGVudHJ5IGNvbnRhaW5pbmcgdGhlIHVzZXIncworICAgICAgICBwYXNzd29yZC4gSWYgeW91IHNwZWNpZnkgdGhpcyB2YWx1ZSwgSk5ESVJlYWxtIHdpbGwgYmluZCB0byB0aGUKKyAgICAgICAgZGlyZWN0b3J5IHVzaW5nIHRoZSB2YWx1ZXMgc3BlY2lmaWVkIGJ5IDxjb2RlPmNvbm5lY3Rpb25OYW1lPC9jb2RlPiBhbmQKKyAgICAgICAgPGNvZGU+Y29ubmVjdGlvblBhc3N3b3JkPC9jb2RlPiBwcm9wZXJ0aWVzLCBhbmQgcmV0cmlldmUgdGhlCisgICAgICAgIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIGZvciBjb21wYXJpc29uIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlCisgICAgICAgIHVzZXIgYmVpbmcgYXV0aGVudGljYXRlZC4gSWYgdGhlIDxjb2RlPmRpZ2VzdDwvY29kZT4gYXR0cmlidXRlIGlzIHNldCwKKyAgICAgICAgdGhlIHNwZWNpZmllZCBkaWdlc3QgYWxnb3JpdGhtIGlzIGFwcGxpZWQgdG8gdGhlIHBhc3N3b3JkIG9mZmVyZWQgYnkgdGhlCisgICAgICAgIHVzZXIgYmVmb3JlIGNvbXBhcmluZyBpdCB3aXRoIHRoZSB2YWx1ZSByZXRyaWV2ZWQgZnJvbSB0aGUgZGlyZWN0b3J5LiBJZgorICAgICAgICB5b3UgZG8gPHN0cm9uZz5ub3Q8L3N0cm9uZz4gc3BlY2lmeSB0aGlzIHZhbHVlLCBKTkRJUmVhbG0gd2lsbCBhdHRlbXB0IGEKKyAgICAgICAgc2ltcGxlIGJpbmQgdG8gdGhlIGRpcmVjdG9yeSB1c2luZyB0aGUgRE4gb2YgdGhlIHVzZXIncyBlbnRyeSBhbmQgdGhlCisgICAgICAgIHBhc3N3b3JkIHByZXNlbnRlZCBieSB0aGUgdXNlciwgd2l0aCBhIHN1Y2Nlc3NmdWwgYmluZCBiZWluZyBpbnRlcnByZXRlZAorICAgICAgICBhcyBhbiBhdXRoZW50aWNhdGVkIHVzZXIuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlclBhdHRlcm4iIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlBhdHRlcm4gZm9yIHRoZSBkaXN0aW5ndWlzaGVkIG5hbWUgKEROKSBvZiB0aGUgdXNlcidzIGRpcmVjdG9yeQorICAgICAgICBlbnRyeSwgZm9sbG93aW5nIHRoZSBzeW50YXggc3VwcG9ydGVkIGJ5IHRoZQorICAgICAgICA8Y29kZT5qYXZhLnRleHQuTWVzc2FnZUZvcm1hdDwvY29kZT4gY2xhc3MuIHdpdGggPGNvZGU+ezB9PC9jb2RlPgorICAgICAgICBtYXJraW5nIHdoZXJlIHRoZSBhY3R1YWwgdXNlcm5hbWUgc2hvdWxkIGJlIGluc2VydGVkLiBZb3UgY2FuIHVzZSB0aGlzCisgICAgICAgIHByb3BlcnR5IGluc3RlYWQgb2YgPGNvZGU+dXNlclNlYXJjaDwvY29kZT4sIDxjb2RlPnVzZXJTdWJ0cmVlPC9jb2RlPgorICAgICAgICBhbmQgPGNvZGU+dXNlckJhc2U8L2NvZGU+IHdoZW4gdGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSBjb250YWlucworICAgICAgICB0aGUgdXNlcm5hbWUgYW5kIGlzIG90aGVyd2lzZSB0aGUgc2FtZSBmb3IgYWxsIHVzZXJzLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJSb2xlTmFtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIGluIHRoZSB1c2VyJ3MgZGlyZWN0b3J5IGVudHJ5CisgICAgICAgIGNvbnRhaW5pbmcgemVybyBvciBtb3JlIHZhbHVlcyBmb3IgdGhlIG5hbWVzIG9mIHJvbGVzIGFzc2lnbmVkCisgICAgICAgIHRvIHRoaXMgdXNlci4gIEluIGFkZGl0aW9uIHlvdSBjYW4gdXNlIHRoZQorICAgICAgICA8Y29kZT5yb2xlTmFtZTwvY29kZT4gcHJvcGVydHkgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiBhbgorICAgICAgICBhdHRyaWJ1dGUgdG8gYmUgcmV0cmlldmVkIGZyb20gaW5kaXZpZHVhbCByb2xlIGVudHJpZXMgZm91bmQKKyAgICAgICAgYnkgc2VhcmNoaW5nIHRoZSBkaXJlY3RvcnkuIElmIDxjb2RlPnVzZXJSb2xlTmFtZTwvY29kZT4gaXMKKyAgICAgICAgbm90IHNwZWNpZmllZCBhbGwgdGhlIHJvbGVzIGZvciBhIHVzZXIgZGVyaXZlIGZyb20gdGhlIHJvbGUKKyAgICAgICAgc2VhcmNoLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJTZWFyY2giIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBMREFQIGZpbHRlciBleHByZXNzaW9uIHRvIHVzZSB3aGVuIHNlYXJjaGluZyBmb3IgYQorICAgICAgICB1c2VyJ3MgZGlyZWN0b3J5IGVudHJ5LCB3aXRoIDxjb2RlPnswfTwvY29kZT4gbWFya2luZyB3aGVyZQorICAgICAgICB0aGUgYWN0dWFsIHVzZXJuYW1lIHNob3VsZCBiZSBpbnNlcnRlZC4gIFVzZSB0aGlzIHByb3BlcnR5CisgICAgICAgIChhbG9uZyB3aXRoIHRoZSA8Y29kZT51c2VyQmFzZTwvY29kZT4gYW5kCisgICAgICAgIDxjb2RlPnVzZXJTdWJ0cmVlPC9jb2RlPiBwcm9wZXJ0aWVzKSBpbnN0ZWFkIG9mCisgICAgICAgIDxjb2RlPnVzZXJQYXR0ZXJuPC9jb2RlPiB0byBzZWFyY2ggdGhlIGRpcmVjdG9yeSBmb3IgdGhlCisgICAgICAgIHVzZXIncyBlbnRyeS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyU3VidHJlZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+U2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IHRvIHNlYXJjaCB0aGUgZW50aXJlCisgICAgICAgIHN1YnRyZWUgb2YgdGhlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT51c2VyQmFzZTwvY29kZT4KKyAgICAgICAgcHJvcGVydHkgZm9yIHRoZSB1c2VyJ3MgZW50cnkuIFRoZSBkZWZhdWx0IHZhbHVlIG9mCisgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBjYXVzZXMgb25seSB0aGUgdG9wIGxldmVsIHRvIGJlIHNlYXJjaGVkLgorICAgICAgICBOb3QgdXNlZCBpZiB5b3UgYXJlIHVzaW5nIHRoZSA8Y29kZT51c2VyUGF0dGVybjwvY29kZT4KKyAgICAgICAgZXhwcmVzc2lvbi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxwPlNlZSB0aGUgPGEgaHJlZj0iLi4vcmVhbG0taG93dG8uaHRtbCI+Q29udGFpbmVyLU1hbmFnZWQgU2VjdXJpdHkgR3VpZGU8L2E+IGZvciBtb3JlCisgICAgaW5mb3JtYXRpb24gb24gc2V0dGluZyB1cCBjb250YWluZXIgbWFuYWdlZCBzZWN1cml0eSB1c2luZyB0aGUKKyAgICBKTkRJIERpcmVjdG9yeSBSZWFsbSBjb21wb25lbnQuPC9wPgorCisKKyAgICA8aDM+TWVtb3J5IEJhc2VkIFJlYWxtIChvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLk1lbW9yeVJlYWxtKTwvaDM+CisKKyAgICA8cD5UaGUgPHN0cm9uZz5NZW1vcnkgQmFzZWQgUmVhbG08L3N0cm9uZz4gaXMgYSBzaW1wbGUgUmVhbG0gaW1wbGVtZW50YXRpb24KKyAgICB0aGF0IHJlYWRzIHVzZXIgaW5mb3JtYXRpb24gZnJvbSBhbiBYTUwgZm9ybWF0LCBhbmQgcmVwcmVzZW50cyBpdCBhcyBhCisgICAgY29sbGVjdGlvbiBvZiBKYXZhIG9iamVjdHMgaW4gbWVtb3J5LiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBpbnRlbmRlZAorICAgIHNvbGVseSB0byBnZXQgdXAgYW5kIHJ1bm5pbmcgd2l0aCBjb250YWluZXIgbWFuYWdlZCBzZWN1cml0eSAtIGl0IGlzIE5PVAorICAgIGludGVuZGVkIGZvciBwcm9kdWN0aW9uIHVzZS4gIEFzIHN1Y2gsIHRoZXJlIGFyZSBubyBtZWNoYW5pc21zIGZvcgorICAgIHVwZGF0aW5nIHRoZSBpbi1tZW1vcnkgY29sbGVjdGlvbiBvZiB1c2VycyB3aGVuIHRoZSBjb250ZW50IG9mIHRoZQorICAgIHVuZGVybHlpbmcgZGF0YSBmaWxlIGlzIGNoYW5nZWQuPC9wPgorCisgICAgPHA+VGhlIE1lbW9yeSBCYXNlZCBSZWFsbSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nCisgICAgYWRkaXRpb25hbCBhdHRyaWJ1dGVzOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdGhuYW1lIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5BYnNvbHV0ZSBvciByZWxhdGl2ZSAodG8gJENBVEFMSU5BX0hPTUUpIHBhdGhuYW1lIHRvIHRoZSBYTUwgZmlsZQorICAgICAgICBjb250YWluaW5nIG91ciB1c2VyIGluZm9ybWF0aW9uLiAgU2VlIGJlbG93IGZvciBkZXRhaWxzIG9uIHRoZQorICAgICAgICBYTUwgZWxlbWVudCBmb3JtYXQgcmVxdWlyZWQuICBJZiBubyBwYXRobmFtZSBpcyBzcGVjaWZpZWQsIHRoZQorICAgICAgICBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPmNvbmYvdG9tY2F0LXVzZXJzLnhtbDwvY29kZT4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8cD5UaGUgWE1MIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIDxjb2RlPnBhdGhuYW1lPC9jb2RlPiBhdHRyaWJ1dGUgbXVzdAorICAgIGNvbmZvcm0gdG8gdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHM6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+VGhlIHJvb3QgKG91dGVyKSBlbGVtZW50IG11c3QgYmUgPGNvZGU+Jmx0O3RvbWNhdC11c2VycyZndDs8L2NvZGU+LgorICAgICAgICA8L2xpPgorICAgIDxsaT5FYWNoIGF1dGhvcml6ZWQgdXNlciBtdXN0IGJlIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIFhNTCBlbGVtZW50CisgICAgICAgIDxjb2RlPiZsdDt1c2VyJmd0OzwvY29kZT4sIG5lc3RlZCBpbnNpZGUgdGhlIHJvb3QgZWxlbWVudC48L2xpPgorICAgIDxsaT5FYWNoIDxjb2RlPiZsdDt1c2VyJmd0OzwvY29kZT4gZWxlbWVudCBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZworICAgICAgICBhdHRyaWJ1dGVzOgorICAgICAgICA8dWw+CisgICAgICAgIDxsaT48c3Ryb25nPm5hbWU8L3N0cm9uZz4gLSBVc2VybmFtZSBvZiB0aGlzIHVzZXIgKG11c3QgYmUgdW5pcXVlCisgICAgICAgICAgICB3aXRoaW4gdGhpcyBmaWxlKS48L2xpPgorICAgICAgICA8bGk+PHN0cm9uZz5wYXNzd29yZDwvc3Ryb25nPiAtIFBhc3N3b3JkIG9mIHRoaXMgdXNlciAoaW4KKyAgICAgICAgICAgIGNsZWFyIHRleHQpLjwvbGk+CisgICAgICAgIDxsaT48c3Ryb25nPnJvbGVzPC9zdHJvbmc+IC0gQ29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgdGhlIHJvbGUgbmFtZXMKKyAgICAgICAgICAgIGFzc2lnbmVkIHRvIHRoaXMgdXNlci48L2xpPgorICAgICAgICA8L3VsPjwvbGk+CisgICAgPC91bD4KKworICAgIDxwPlNlZSB0aGUgPGEgaHJlZj0iLi4vcmVhbG0taG93dG8uaHRtbCI+Q29udGFpbmVyLU1hbmFnZWQgU2VjdXJpdHkgR3VpZGU8L2E+IGZvciBtb3JlCisgICAgaW5mb3JtYXRpb24gb24gc2V0dGluZyB1cCBjb250YWluZXIgbWFuYWdlZCBzZWN1cml0eSB1c2luZyB0aGUKKyAgICBNZW1vcnkgQmFzZWQgUmVhbG0gY29tcG9uZW50LjwvcD4KKworCisgICAgPGgzPlVzZXIgRGF0YWJhc2UgUmVhbG0gKG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uVXNlckRhdGFiYXNlUmVhbG0pPC9oMz4KKworICAgIDxwPlRoZSA8c3Ryb25nPlVzZXIgRGF0YWJhc2UgUmVhbG08L3N0cm9uZz4gaXMgUmVhbG0gaW1wbGVtZW50YXRpb24KKyAgICB0aGF0IGlzIGJhc2VkIG9uIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5Vc2VyRGF0YWJhc2U8L2NvZGU+CisgICAgaW50ZXJmYWNlIHRoYXQgaXMgbWFkZSBhdmFpbGFibGUgdGhyb3VnaCB0aGUgZ2xvYmFsIEpOREkgcmVzb3VyY2VzCisgICAgY29uZmlndXJlZCBmb3IgdGhpcyBUb21jYXQgaW5zdGFuY2UuPC9wPgorCisgICAgPHA+VGhlIFVzZXIgRGF0YWJhc2UgUmVhbG0gaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhlIGZvbGxvd2luZworICAgIGFkZGl0aW9uYWwgYXR0cmlidXRlczo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXNvdXJjZU5hbWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIGdsb2JhbCBKTkRJIG5hbWUgb2YgdGhlIDxjb2RlPlVzZXJEYXRhYmFzZTwvY29kZT4gcmVzb3VyY2UKKyAgICAgICAgdXNlZCBieSB0aGlzIFJlYWxtLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPHA+U2VlIHRoZSA8YSBocmVmPSIuLi9yZWFsbS1ob3d0by5odG1sIj5Db250YWluZXItTWFuYWdlZCBTZWN1cml0eSBHdWlkZTwvYT4gZm9yIG1vcmUKKyAgICBpbmZvcm1hdGlvbiBvbiBzZXR0aW5nIHVwIGNvbnRhaW5lciBtYW5hZ2VkIHNlY3VyaXR5IHVzaW5nIHRoZQorICAgIFVzZXJEYXRhYmFzZSBSZWFsbSBjb21wb25lbnQuPC9wPgorCisgICAgPGgzPkpBQVMgUmVhbG0gKG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkFBU1JlYWxtKTwvaDM+CisKKyAgICA8cD5UaGUgSkFBUyBSZWFsbSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwKKyAgICBhdHRyaWJ1dGVzOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhcHBOYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPlRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBhcyBjb25maWd1cmVkIGluIHlvdXIgbG9naW4gY29uZmlndXJhdGlvbgorICAgICAgICBmaWxlICg8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9ndWlkZS9zZWN1cml0eS9qYWFzL3R1dG9yaWFscy9Mb2dpbkNvbmZpZ0ZpbGUuaHRtbCI+CisgICAgICAgIEpBQVMgTG9naW5Db25maWc8L2E+KS48L3A+CisgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJDbGFzc05hbWVzIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPkEgY29tbWEtc2VwZXJhdGVkIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIHRoZSBjbGFzc2VzIHRoYXQgeW91IGhhdmUgbWFkZSAKKyAgICAgICAgZm9yIHlvdXIgdXNlciA8Y29kZT5QcmluY2lwYWxzPC9jb2RlPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyb2xlQ2xhc3NOYW1lcyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+QSBjb21tYS1zZXBlcmF0ZWQgbGlzdCBvZiB0aGUgbmFtZXMgb2YgdGhlIGNsYXNzZXMgdGhhdCB5b3UgaGF2ZSBtYWRlIAorICAgICAgICBmb3IgeW91ciByb2xlIDxjb2RlPlByaW5jaXBhbHM8L2NvZGU+LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZUNvbnRleHRDbGFzc0xvYWRlciIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SW5zdHJ1Y3RzIEpBQVNSZWFsbSB0byB1c2UgdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyIGZvciBsb2FkaW5nIHRoZQorICAgICAgICB1c2VyLXNwZWNpZmllZCA8Y29kZT5Mb2dpbk1vZHVsZTwvY29kZT4gY2xhc3MgYW5kIGFzc29jaWF0ZWQKKyAgICAgICAgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiBjbGFzc2VzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT50cnVlPC9jb2RlPiwKKyAgICAgICAgd2hpY2ggaXMgYmFja3dhcmRzLWNvbXBhdGlibGUgd2l0aCB0aGUgd2F5IFRvbWNhdCA0IHdvcmtzLiBUbyBsb2FkCisgICAgICAgIGNsYXNzZXMgdXNpbmcgdGhlIGNvbnRhaW5lcidzIGNsYXNzbG9hZGVyLCBzcGVjaWZ5IDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgICAgPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8cD5TZWUgdGhlIDxhIGhyZWY9Ii4uL3JlYWxtLWhvd3RvLmh0bWwiPkNvbnRhaW5lci1NYW5hZ2VkIFNlY3VyaXR5CisgICAgR3VpZGU8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHNldHRpbmcgdXAgY29udGFpbmVyIG1hbmFnZWQgc2VjdXJpdHkKKyAgICB1c2luZyB0aGUgSkFTUyBSZWFsbSBjb21wb25lbnQuPC9wPgorICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ik5lc3RlZCBDb21wb25lbnRzIj4KKworICA8cD5ObyBjb21wb25lbnRzIG1heSBiZSBuZXN0ZWQgaW5zaWRlIGEgPHN0cm9uZz5SZWFsbTwvc3Ryb25nPiBlbGVtZW50LjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNwZWNpYWwgRmVhdHVyZXMiPgorCisgIDxwPlNlZSA8YSBocmVmPSJob3N0Lmh0bWwiPlNpbmdsZSBTaWduIE9uPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQKKyAgY29uZmlndXJpbmcgU2luZ2xlIFNpZ24gT24gc3VwcG9ydCBmb3IgYSB2aXJ0dWFsIGhvc3QuPC9wPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9yZXNvdXJjZXMueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvcmVzb3VyY2VzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTc0NWRlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvcmVzb3VyY2VzLnhtbApAQCAtMCwwICsxLDEwMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9InJlc291cmNlcy5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBSZXNvdXJjZXMgQ29tcG9uZW50PC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgIDxwPlRoZSA8c3Ryb25nPlJlc291cmNlczwvc3Ryb25nPiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIDxlbT53ZWIKKyAgYXBwbGljYXRpb24gc3RhdGljIHJlc291cmNlczwvZW0+LCBmcm9tIHdoaWNoIGNsYXNzZXMgd2lsbCBiZSBsb2FkZWQsIAorICBIVE1MLCBKU1AgYW5kIHRoZSBvdGhlciBzdGF0aWMgZmlsZXMgd2lsbCBiZSBzZXJ2ZWQuIFRoaXMgYWxsb3dzIHRoZSB3ZWJhcHAKKyAgdG8gcmVzaWRlIG9uIHZhcmlvdXMgbWVkaXVtcyBvdGhlciB0aGFuIHRoZSBmaWxlc3lzdGVtLCBsaWtlIGNvbXByZXNzZWQKKyAgaW4gYSBXQVIgZmlsZSwgaW4gYSBKREJDIGRhdGFiYXNlLCBvciBpbiBhIG1vcmUgYWR2YW5jZWQgdmVyc2lvbmluZworICByZXBvc2l0b3J5LjwvcD4KKworICA8cD5BIHVuaWZpZWQgY2FjaGluZyBlbmdpbmUgaXMgcHJvdmlkZWQgZm9yIGFsbCBhY2Nlc3NlcyB0byB0aGUgd2ViYXBwCisgIHJlc291cmNlcyBtYWRlIGJ5IHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBhbmQgd2ViIGFwcGxpY2F0aW9ucyB3aGljaCB1c2UgdGhlCisgIGNvbnRhaW5lciBwcm92aWRlZCBtZWNoYW5pc21zIHRvIGFjY2VzcyBzdWNoIHJlc291cmNlcywgc3VjaCBhcyBjbGFzcyBsYW9kZXIKKyAgYWNjZXNzLCBhY2Nlc3MgdGhyb3VnaCB0aGUgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+IGludGVyZmFjZSwgb3IgbmF0aXZlCisgIGFjY2VzcyB0aHJvdWdoIHRoZSA8Y29kZT5EaXJlY3RvcnlDb250ZXh0PC9jb2RlPiBpbnRlcmZhY2UuPC9wPgorCisgIDxwPjxzdHJvbmc+Tm90ZTogUnVubmluZyBhIHdlYmFwcCB3aXRoIG5vbi1maWxlc3lzdGVtIGJhc2VkIAorICBSZXNvdXJjZXMgaW1wbGVtZW50YXRpb25zIGlzIG9ubHkgcG9zc2libGUgd2hlbiB0aGUgd2ViYXBwIGRvZXMgbm90IAorICByZWx5IG9uIGRpcmVjdCBmaWxlc3lzdGVtIGFjY2VzcyB0byBpdHMgb3duIHJlc291cmNlcywgYW5kIHVzZXMgdGhlIG1ldGhvZHMKKyAgaW4gdGhlIFNlcnZsZXRDb250ZXh0IGludGVyZmFjZSB0byBhY2Nlc3MgdGhlbS48L3N0cm9uZz48L3A+CisKKyAgPHA+QSBSZXNvdXJjZXMgZWxlbWVudCBNQVkgYmUgbmVzdGVkIGluc2lkZSBhIAorICA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+IGNvbXBvbmVudC4gIElmIGl0IGlzIG5vdCBpbmNsdWRlZCwgCisgIGEgZGVmYXVsdCBmaWxlc3lzdGVtIGJhc2VkIFJlc291cmNlcyB3aWxsIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseSwgCisgIHdoaWNoIGlzIHN1ZmZpY2llbnQgZm9yIG1vc3QgcmVxdWlyZW1lbnRzLjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbW1vbiBBdHRyaWJ1dGVzIj4KKworICAgIDxwPkFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgPHN0cm9uZz5SZXNvdXJjZXM8L3N0cm9uZz4KKyAgICBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkphdmEgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdG8gdXNlLiAgVGhpcyBjbGFzcyBtdXN0CisgICAgICAgIGltcGxlbWVudCB0aGUgPGNvZGU+amF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0PC9jb2RlPiBpbnRlcmZhY2UuCisgICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIGZvciBvcHRpbWFsIGZ1bmN0aW9uYWxpdHkgYW5kIHBlcmZvcm1hbmNlLCAKKyAgICAgICAgYnV0IG5vdCBtYW5kYXRvcnksIHRoYXQgdGhlIGNsYXNzIGV4dGVuZCAKKyAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLkJhc2VEaXJDb250ZXh0PC9jb2RlPiwgYXMgd2VsbCBhcworICAgICAgICB1c2UgdGhlIHNwZWNpYWwgb2JqZWN0IHR5cGVzIHByb3ZpZGVkIGluIHRoZSAKKyAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzPC9jb2RlPiBmb3IgcmV0dXJuZWQgb2JqZWN0cy4KKyAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHN0YW5kYXJkIHZhbHVlIChkZWZpbmVkIGJlbG93KSB3aWxsIGJlIHVzZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iU3RhbmRhcmQgSW1wbGVtZW50YXRpb24iPgorCisgICAgPHA+VGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+UmVzb3VyY2VzPC9zdHJvbmc+IGlzCisgICAgPHN0cm9uZz5vcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuRmlsZURpckNvbnRleHQ8L3N0cm9uZz4sIGFuZCAKKyAgICBpcyBjb25maWd1cmVkIGJ5IGl0cyBwYXJlbnQgQ29udGV4dCBlbGVtZW50LjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ik5lc3RlZCBDb21wb25lbnRzIj4KKworICA8cD5ObyBjb21wb25lbnRzIG1heSBiZSBuZXN0ZWQgaW5zaWRlIGEgPHN0cm9uZz5SZXNvdXJjZXM8L3N0cm9uZz4gZWxlbWVudC48L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJTcGVjaWFsIEZlYXR1cmVzIj4KKworICA8cD5ObyBzcGVjaWFsIGZlYXR1cmVzIGFyZSBhc3NvY2lhdGVkIHdpdGggYSA8c3Ryb25nPlJlc291cmNlczwvc3Ryb25nPgorICBlbGVtZW50LjwvcD4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKworCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvc2VydmVyLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL3NlcnZlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIyYmRhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL3NlcnZlci54bWwKQEAgLTAsMCArMSw5NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9InNlcnZlci5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBTZXJ2ZXIgQ29tcG9uZW50PC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgIDxwPkEgPHN0cm9uZz5TZXJ2ZXI8L3N0cm9uZz4gZWxlbWVudCByZXByZXNlbnRzIHRoZSBlbnRpcmUgQ2F0YWxpbmEKKyAgc2VydmxldCBjb250YWluZXIuICBUaGVyZWZvcmUsIGl0IG11c3QgYmUgdGhlIHNpbmdsZSBvdXRlcm1vc3QgZWxlbWVudAorICBpbiB0aGUgPGNvZGU+Y29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBjb25maWd1cmF0aW9uIGZpbGUuICBJdHMgYXR0cmlidXRlcworICByZXByZXNlbnQgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgc2VydmxldCBjb250YWluZXIgYXMgYSB3aG9sZS48L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJBdHRyaWJ1dGVzIj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJDb21tb24gQXR0cmlidXRlcyI+CisKKyAgPHA+QWxsIGltcGxlbWVudGF0aW9ucyBvZiA8c3Ryb25nPlNlcnZlcjwvc3Ryb25nPgorICBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisKKyAgPGF0dHJpYnV0ZXM+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPkphdmEgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdG8gdXNlLiAgVGhpcyBjbGFzcyBtdXN0CisgICAgICBpbXBsZW1lbnQgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyPC9jb2RlPiBpbnRlcmZhY2UuCisgICAgICBJZiBubyBjbGFzcyBuYW1lIGlzIHNwZWNpZmllZCwgdGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIHdpbGwKKyAgICAgIGJlIHVzZWQuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3J0IiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICA8cD5UaGUgVENQL0lQIHBvcnQgbnVtYmVyIG9uIHdoaWNoIHRoaXMgc2VydmVyIHdhaXRzIGZvciBhIHNodXRkb3duCisgICAgICBjb21tYW5kLiAgVGhpcyBjb25uZWN0aW9uIG11c3QgYmUgaW5pdGlhdGVkIGZyb20gdGhlIHNhbWUgc2VydmVyCisgICAgICBjb21wdXRlciB0aGF0IGlzIHJ1bm5pbmcgdGhpcyBpbnN0YW5jZSBvZiBUb21jYXQuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzaHV0ZG93biIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgPHA+VGhlIGNvbW1hbmQgc3RyaW5nIHRoYXQgbXVzdCBiZSByZWNlaXZlZCB2aWEgYSBUQ1AvSVAgY29ubmVjdGlvbgorICAgICAgdG8gdGhlIHNwZWNpZmllZCBwb3J0IG51bWJlciwgaW4gb3JkZXIgdG8gc2h1dCBkb3duIFRvbWNhdC48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBJbXBsZW1lbnRhdGlvbiI+CisKKyAgPHA+VGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+U2VydmVyPC9zdHJvbmc+IGlzCisgIDxzdHJvbmc+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyPC9zdHJvbmc+LgorICBJdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYXR0cmlidXRlcyAoaW4gYWRkaXRpb24gdG8gdGhlCisgIGNvbW1vbiBhdHRyaWJ1dGVzIGxpc3RlZCBhYm92ZSk6PC9wPgorCisgIDxhdHRyaWJ1dGVzPgorICA8L2F0dHJpYnV0ZXM+CisKKyAgPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iTmVzdGVkIENvbXBvbmVudHMiPgorCisgIDxwPlRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBtYXkgYmUgbmVzdGVkIGluc2lkZSBhIDxzdHJvbmc+U2VydmVyPC9zdHJvbmc+CisgIGVsZW1lbnQ6PC9wPgorICA8dWw+CisgIDxsaT48YSBocmVmPSJzZXJ2aWNlLmh0bWwiPjxzdHJvbmc+U2VydmljZTwvc3Ryb25nPjwvYT4gLSAKKyAgICAgIE9uZSBvciBtb3JlIHNlcnZpY2UgZWxlbWVudC48L2xpPgorICA8bGk+PGEgaHJlZj0iZ2xvYmFscmVzb3VyY2VzLmh0bWwiPjxzdHJvbmc+R2xvYmFsTmFtaW5nUmVzb3VyY2VzPC9zdHJvbmc+PC9hPiAtIAorICAgICAgQ29uZmlndXJlIHRoZSBKTkRJIGdsb2JhbCByZXNvdXJjZXMgZm9yIHRoZSBzZXJ2ZXIuPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNwZWNpYWwgRmVhdHVyZXMiPgorCisgIDxwPlRoZXJlIGFyZSBubyBzcGVjaWFsIGZlYXR1cmVzIGFzc29jaWF0ZWQgd2l0aCBhIDxzdHJvbmc+U2VydmVyPC9zdHJvbmc+LgorICA8L3A+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9zZXJ2aWNlLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL3NlcnZpY2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYTk2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9zZXJ2aWNlLnhtbApAQCAtMCwwICsxLDkxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0ic2VydmljZS5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBTZXJ2aWNlIENvbXBvbmVudDwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICA8cD5BIDxzdHJvbmc+U2VydmljZTwvc3Ryb25nPiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGNvbWJpbmF0aW9uIG9mIG9uZSBvcgorICBtb3JlIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+IGNvbXBvbmVudHMgdGhhdCBzaGFyZSBhIHNpbmdsZQorICA8YSBocmVmPSJlbmdpbmUuaHRtbCI+RW5naW5lPC9hPiBjb21wb25lbnQgZm9yIHByb2Nlc3NpbmcgaW5jb21pbmcKKyAgcmVxdWVzdHMuICBPbmUgb3IgbW9yZSA8c3Ryb25nPlNlcnZpY2U8L3N0cm9uZz4gZWxlbWVudHMgbWF5IGJlIG5lc3RlZAorICBpbnNpZGUgYSA8YSBocmVmPSJzZXJ2ZXIuaHRtbCI+U2VydmVyPC9hPiBlbGVtZW50LjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbW1vbiBBdHRyaWJ1dGVzIj4KKworICA8cD5BbGwgaW1wbGVtZW50YXRpb25zIG9mIDxzdHJvbmc+U2VydmljZTwvc3Ryb25nPgorICBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisKKyAgPGF0dHJpYnV0ZXM+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPkphdmEgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdG8gdXNlLiAgVGhpcyBjbGFzcyBtdXN0CisgICAgICBpbXBsZW1lbnQgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmljZTwvY29kZT4gaW50ZXJmYWNlLgorICAgICAgSWYgbm8gY2xhc3MgbmFtZSBpcyBzcGVjaWZpZWQsIHRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiB3aWxsCisgICAgICBiZSB1c2VkLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgPHA+VGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIDxzdHJvbmc+U2VydmljZTwvc3Ryb25nPiwgd2hpY2ggd2lsbAorICAgICAgYmUgaW5jbHVkZWQgaW4gbG9nIG1lc3NhZ2VzIGlmIHlvdSB1dGlsaXplIHN0YW5kYXJkIENhdGFsaW5hCisgICAgICBjb21wb25lbnRzLiAgVGhlIG5hbWUgb2YgZWFjaCA8c3Ryb25nPlNlcnZpY2U8L3N0cm9uZz4gdGhhdCBpcworICAgICAgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciA8YSBocmVmPSJzZXJ2ZXIuaHRtbCI+U2VydmVyPC9hPgorICAgICAgbXVzdCBiZSB1bmlxdWUuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iU3RhbmRhcmQgSW1wbGVtZW50YXRpb24iPgorCisgIDxwPlRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPlNlcnZpY2U8L3N0cm9uZz4gaXMKKyAgPHN0cm9uZz5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2aWNlPC9zdHJvbmc+LgorICBJdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYXR0cmlidXRlcyAoaW4gYWRkaXRpb24gdG8gdGhlCisgIGNvbW1vbiBhdHRyaWJ1dGVzIGxpc3RlZCBhYm92ZSk6PC9wPgorCisgIDxhdHRyaWJ1dGVzPgorCisgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJOZXN0ZWQgQ29tcG9uZW50cyI+CisKKyAgPHA+VGhlIG9ubHkgY29tcG9uZW50cyB0aGF0IG1heSBiZSBuZXN0ZWQgaW5zaWRlIGEgPHN0cm9uZz5TZXJ2aWNlPC9zdHJvbmc+CisgIGVsZW1lbnQgYXJlIG9uZSBvciBtb3JlIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+IGVsZW1lbnRzLAorICBmb2xsb3dlZCBieSBleGFjdGx5IG9uZSA8YSBocmVmPSJlbmdpbmUuaHRtbCI+RW5naW5lPC9hPiBlbGVtZW50LjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNwZWNpYWwgRmVhdHVyZXMiPgorCisgIDxwPlRoZXJlIGFyZSBubyBzcGVjaWFsIGZlYXR1cmVzIGFzc29jaWF0ZWQgd2l0aCBhIDxzdHJvbmc+U2VydmljZTwvc3Ryb25nPi4KKyAgPC9wPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvdmFsdmUueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvdmFsdmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYzI5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy92YWx2ZS54bWwKQEAgLTAsMCArMSw0MzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJ2YWx2ZS5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBWYWx2ZSBDb21wb25lbnQ8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKyAgPHA+QSA8c3Ryb25nPlZhbHZlPC9zdHJvbmc+IGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbXBvbmVudCB0aGF0IHdpbGwgYmUKKyAgaW5zZXJ0ZWQgaW50byB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIHBpcGVsaW5lIGZvciB0aGUgYXNzb2NpYXRlZAorICBDYXRhbGluYSBjb250YWluZXIgKDxhIGhyZWY9ImVuZ2luZS5odG1sIj5FbmdpbmU8L2E+LAorICA8YSBocmVmPSJob3N0Lmh0bWwiPkhvc3Q8L2E+LCBvciA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+KS4KKyAgSW5kaXZpZHVhbCBWYWx2ZXMgaGF2ZSBkaXN0aW5jdCBwcm9jZXNzaW5nIGNhcGFiaWxpdGllcywgYW5kIGFyZQorICBkZXNjcmliZWQgaW5kaXZpZHVhbGx5IGJlbG93LjwvcD4KKworICAgIDxibG9ja3F1b3RlPjxlbT4KKyAgICA8cD5UaGUgZGVzY3JpcHRpb24gYmVsb3cgdXNlcyB0aGUgdmFyaWFibGUgbmFtZSAkQ0FUQUxJTkFfSE9NRQorICAgIHRvIHJlZmVyIHRvIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB5b3UgaGF2ZSBpbnN0YWxsZWQgVG9tY2F0IDUsCisgICAgYW5kIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSBhZ2FpbnN0IHdoaWNoIG1vc3QgcmVsYXRpdmUgcGF0aHMgYXJlCisgICAgcmVzb2x2ZWQuICBIb3dldmVyLCBpZiB5b3UgaGF2ZSBjb25maWd1cmVkIFRvbWNhdCA1IGZvciBtdWx0aXBsZQorICAgIGluc3RhbmNlcyBieSBzZXR0aW5nIGEgQ0FUQUxJTkFfQkFTRSBkaXJlY3RvcnksIHlvdSBzaG91bGQgdXNlCisgICAgJENBVEFMSU5BX0JBU0UgaW5zdGVhZCBvZiAkQ0FUQUxJTkFfSE9NRSBmb3IgZWFjaCBvZiB0aGVzZQorICAgIHJlZmVyZW5jZXMuPC9wPgorICAgIDwvZW0+PC9ibG9ja3F1b3RlPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQWNjZXNzIExvZyBWYWx2ZSI+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICAgIDxwPlRoZSA8c3Ryb25nPkFjY2VzcyBMb2cgVmFsdmU8L3N0cm9uZz4gY3JlYXRlcyBsb2cgZmlsZXMgaW4gdGhlIHNhbWUKKyAgICBmb3JtYXQgYXMgdGhvc2UgY3JlYXRlZCBieSBzdGFuZGFyZCB3ZWIgc2VydmVycy4gIFRoZXNlIGxvZ3MgY2FuIGxhdGVyCisgICAgYmUgYW5hbHl6ZWQgYnkgc3RhbmRhcmQgbG9nIGFuYWx5c2lzIHRvb2xzIHRvIHRyYWNrIHBhZ2UgaGl0IGNvdW50cywKKyAgICB1c2VyIHNlc3Npb24gYWN0aXZpdHksIGFuZCBzbyBvbi4gIFRoZSBmaWxlcyBwcm9kdWNlcyBieSB0aGlzIDxjb2RlPlZhbHZlPC9jb2RlPgorICAgIGFyZSByb2xsZWQgb3ZlciBuaWdodGx5IGF0IG1pZG5pZ2h0LiAgVGhpcyA8Y29kZT5WYWx2ZTwvY29kZT4KKyAgICBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIGFueSBDYXRhbGluYSBjb250YWluZXIgKDxjb2RlPkNvbnRleHQ8L2NvZGU+LAorICAgIDxjb2RlPkhvc3Q8L2NvZGU+LCBvciA8Y29kZT5FbmdpbmU8L2NvZGU+KSwgYW5kCisgICAgd2lsbCByZWNvcmQgQUxMIHJlcXVlc3RzIHByb2Nlc3NlZCBieSB0aGF0IGNvbnRhaW5lci48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgICAgPHA+VGhlIDxzdHJvbmc+QWNjZXNzIExvZyBWYWx2ZTwvc3Ryb25nPiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nCisgICAgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5KYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIHRvIHVzZS4gIFRoaXMgTVVTVCBiZSBzZXQgdG8KKyAgICAgICAgPHN0cm9uZz5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5BY2Nlc3NMb2dWYWx2ZTwvc3Ryb25nPiB0byB1c2UgdGhlCisgICAgICAgIGRlZmF1bHQgYWNjZXNzIGxvZyB2YWx2ZS4gVG8gdXNlIGEgbW9yZSBvcHRpbWl6ZWQgYWNjZXNzIGxvZyB2YWx2ZQorICAgICAgICBkZXNpZ25lZCBmb3IgcHJvZHVjdGlvbiB1c2UsIHlvdSBNVVNUIHNldCB0aGlzIGF0dHJpYnV0ZSB0byAKKyAgICAgICAgPHN0cm9uZz5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5GYXN0Q29tbW9uQWNjZXNzTG9nVmFsdmU8L3N0cm9uZz4uCisgICAgICAgIEluIHRoaXMgY2FzZSwgb25seSB0aGUgPGNvZGU+Y29tbW9uPC9jb2RlPiBhbmQgPGNvZGU+Y29tYmluZWQ8L2NvZGU+CisgICAgICAgIHBhdHRlcm5zIGFyZSBzdXBwb3J0ZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyZWN0b3J5IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5BYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRobmFtZSBvZiBhIGRpcmVjdG9yeSBpbiB3aGljaCBsb2cgZmlsZXMKKyAgICAgICAgY3JlYXRlZCBieSB0aGlzIHZhbHZlIHdpbGwgYmUgcGxhY2VkLiAgSWYgYSByZWxhdGl2ZSBwYXRoIGlzCisgICAgICAgIHNwZWNpZmllZCwgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gJENBVEFMSU5BX0hPTUUuICBJZgorICAgICAgICBubyBkaXJlY3RvcnkgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgImxvZ3MiCisgICAgICAgIChyZWxhdGl2ZSB0byAkQ0FUQUxJTkFfSE9NRSkuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGF0dGVybiIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+QSBmb3JtYXR0aW5nIGxheW91dCBpZGVudGlmeWluZyB0aGUgdmFyaW91cyBpbmZvcm1hdGlvbiBmaWVsZHMKKyAgICAgICAgZnJvbSB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgdG8gYmUgbG9nZ2VkLCBvciB0aGUgd29yZAorICAgICAgICA8Y29kZT5jb21tb248L2NvZGU+IG9yIDxjb2RlPmNvbWJpbmVkPC9jb2RlPiB0byBzZWxlY3QgYQorICAgICAgICBzdGFuZGFyZCBmb3JtYXQuICBTZWUgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29uZmlndXJpbmcKKyAgICAgICAgdGhpcyBhdHRyaWJ1dGUuIE5vdGUgdGhhdCB0aGUgb3B0aW1pemVkIGFjY2VzcyBkb2VzIG9ubHkgc3VwcG9ydAorICAgICAgICA8Y29kZT5jb21tb248L2NvZGU+IGFuZCA8Y29kZT5jb21iaW5lZDwvY29kZT4gYXMgdGhlIHZhbHVlIGZvciB0aGlzCisgICAgICAgIGF0dHJpYnV0ZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBwcmVmaXggYWRkZWQgdG8gdGhlIHN0YXJ0IG9mIGVhY2ggbG9nIGZpbGUncyBuYW1lLiAgSWYgbm90CisgICAgICAgIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgImFjY2Vzc19sb2cuIi4gIFRvIHNwZWNpZnkgbm8gcHJlZml4LAorICAgICAgICB1c2UgYSB6ZXJvLWxlbmd0aCBzdHJpbmcuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzb2x2ZUhvc3RzIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5TZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gY29udmVydCB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlCisgICAgICAgIGhvc3QgaW50byB0aGUgY29ycmVzcG9uZGluZyBob3N0IG5hbWUgdmlhIGEgRE5TIGxvb2t1cC4gIFNldCB0bworICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gdG8gc2tpcCB0aGlzIGxvb2t1cCwgYW5kIHJlcG9ydCB0aGUgcmVtb3RlIElQCisgICAgICAgIGFkZHJlc3MgaW5zdGVhZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdWZmaXgiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBzdWZmaXggYWRkZWQgdG8gdGhlIGVuZCBvZiBlYWNoIGxvZyBmaWxlJ3MgbmFtZS4gIElmIG5vdAorICAgICAgICBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzICIiLiAgVG8gc3BlY2lmeSBubyBzdWZmaXgsCisgICAgICAgIHVzZSBhIHplcm8tbGVuZ3RoIHN0cmluZy48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyb3RhdGFibGUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkRlYWZ1bHQgdHJ1ZS4gRmxhZyB0byBkZXRlcm1pbmUgaWYgbG9nIHJvdGF0aW9uIHNob3VsZCBvY2N1ci4KKyAgICAgICAgICAgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIHRoaXMgZmlsZSBpcyBuZXZlciByb3RhdGVkIGFuZAorICAgICAgICAgICA8dHQ+ZmlsZURhdGVGb3JtYXQ8L3R0PiBpcyBpZ25vcmVkLiBVc2Ugd2l0aCBjYXV0aW9uIQorICAgICAgICA8L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb25kaXRpb24iIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlR1cm5zIG9uIGNvbmRpdGlvbmFsIGxvZ2dpbmcuIElmIHNldCwgcmVxdWVzdHMgd2lsbCBiZQorICAgICAgICAgICBsb2dnZWQgb25seSBpZiA8dHQ+U2VydmxldFJlcXVlc3QuZ2V0QXR0cmlidXRlKCk8L3R0PiBpcworICAgICAgICAgICBudWxsLiBGb3IgZXhhbXBsZSwgaWYgdGhpcyB2YWx1ZSBpcyBzZXQgdG8KKyAgICAgICAgICAgPHR0Pmp1bms8L3R0PiwgdGhlbiBhIHBhcnRpY3VsYXIgcmVxdWVzdCB3aWxsIG9ubHkgYmUgbG9nZ2VkCisgICAgICAgICAgIGlmIDx0dD5TZXJ2bGV0UmVxdWVzdC5nZXRBdHRyaWJ1dGUoImp1bmsiKSA9PSBudWxsPC90dD4uCisgICAgICAgICAgIFRoZSB1c2Ugb2YgRmlsdGVycyBpcyBhbiBlYXN5IHdheSB0byBzZXQvdW5zZXQgdGhlIGF0dHJpYnV0ZQorICAgICAgICAgICBpbiB0aGUgU2VydmxldFJlcXVlc3Qgb24gbWFueSBkaWZmZXJlbnQgcmVxdWVzdHMuCisgICAgICAgIDwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVEYXRlRm9ybWF0IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5BbGxvd3MgYSBjdXN0b21pemVkIGRhdGUgZm9ybWF0IGluIHRoZSBhY2Nlc3MgbG9nIGZpbGUgbmFtZS4KKyAgICAgICAgICAgVGhlIGRhdGUgZm9ybWF0IGFsc28gZGVjaWRlcyBob3cgb2Z0ZW4gdGhlIGZpbGUgaXMgcm90YXRlZC4KKyAgICAgICAgICAgSWYgeW91IHdpc2ggdG8gcm90YXRlIGV2ZXJ5IGhvdXIsIHRoZW4gc2V0IHRoaXMgdmFsdWUKKyAgICAgICAgICAgdG86IDx0dD55eXl5LU1NLWRkLkhIPC90dD4KKyAgICAgICAgPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8cD5WYWx1ZXMgZm9yIHRoZSA8Y29kZT5wYXR0ZXJuPC9jb2RlPiBhdHRyaWJ1dGUgYXJlIG1hZGUgdXAgb2YgbGl0ZXJhbAorICAgIHRleHQgc3RyaW5ncywgY29tYmluZWQgd2l0aCBwYXR0ZXJuIGlkZW50aWZpZXJzIHByZWZpeGVkIGJ5IHRoZSAiJSIKKyAgICBjaGFyYWN0ZXIgdG8gY2F1c2UgcmVwbGFjZW1lbnQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgdmFsdWUgZnJvbQorICAgIHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIHJlc3BvbnNlLiAgVGhlIGZvbGxvd2luZyBwYXR0ZXJuIGNvZGVzIGFyZQorICAgIHN1cHBvcnRlZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT48Yj4lYTwvYj4gLSBSZW1vdGUgSVAgYWRkcmVzczwvbGk+CisgICAgPGxpPjxiPiVBPC9iPiAtIExvY2FsIElQIGFkZHJlc3M8L2xpPgorICAgIDxsaT48Yj4lYjwvYj4gLSBCeXRlcyBzZW50LCBleGNsdWRpbmcgSFRUUCBoZWFkZXJzLCBvciAnLScgaWYgemVybzwvbGk+CisgICAgPGxpPjxiPiVCPC9iPiAtIEJ5dGVzIHNlbnQsIGV4Y2x1ZGluZyBIVFRQIGhlYWRlcnM8L2xpPgorICAgIDxsaT48Yj4laDwvYj4gLSBSZW1vdGUgaG9zdCBuYW1lIChvciBJUCBhZGRyZXNzIGlmCisgICAgICAgIDxjb2RlPnJlc29sdmVIb3N0czwvY29kZT4gaXMgZmFsc2UpPC9saT4KKyAgICA8bGk+PGI+JUg8L2I+IC0gUmVxdWVzdCBwcm90b2NvbDwvbGk+CisgICAgPGxpPjxiPiVsPC9iPiAtIFJlbW90ZSBsb2dpY2FsIHVzZXJuYW1lIGZyb20gaWRlbnRkIChhbHdheXMgcmV0dXJucworICAgICAgICAnLScpPC9saT4KKyAgICA8bGk+PGI+JW08L2I+IC0gUmVxdWVzdCBtZXRob2QgKEdFVCwgUE9TVCwgZXRjLik8L2xpPgorICAgIDxsaT48Yj4lcDwvYj4gLSBMb2NhbCBwb3J0IG9uIHdoaWNoIHRoaXMgcmVxdWVzdCB3YXMgcmVjZWl2ZWQ8L2xpPgorICAgIDxsaT48Yj4lcTwvYj4gLSBRdWVyeSBzdHJpbmcgKHByZXBlbmRlZCB3aXRoIGEgJz8nIGlmIGl0IGV4aXN0cyk8L2xpPgorICAgIDxsaT48Yj4lcjwvYj4gLSBGaXJzdCBsaW5lIG9mIHRoZSByZXF1ZXN0IChtZXRob2QgYW5kIHJlcXVlc3QgVVJJKTwvbGk+CisgICAgPGxpPjxiPiVzPC9iPiAtIEhUVFAgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlPC9saT4KKyAgICA8bGk+PGI+JVM8L2I+IC0gVXNlciBzZXNzaW9uIElEPC9saT4KKyAgICA8bGk+PGI+JXQ8L2I+IC0gRGF0ZSBhbmQgdGltZSwgaW4gQ29tbW9uIExvZyBGb3JtYXQ8L2xpPgorICAgIDxsaT48Yj4ldTwvYj4gLSBSZW1vdGUgdXNlciB0aGF0IHdhcyBhdXRoZW50aWNhdGVkIChpZiBhbnkpLCBlbHNlICctJzwvbGk+CisgICAgPGxpPjxiPiVVPC9iPiAtIFJlcXVlc3RlZCBVUkwgcGF0aDwvbGk+CisgICAgPGxpPjxiPiV2PC9iPiAtIExvY2FsIHNlcnZlciBuYW1lPC9saT4KKyAgICA8bGk+PGI+JUQ8L2I+IC0gVGltZSB0YWtlbiB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LCBpbiBtaWxsaXM8L2xpPgorICAgIDxsaT48Yj4lVDwvYj4gLSBUaW1lIHRha2VuIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QsIGluIHNlY29uZHM8L2xpPgorICAgIDwvdWw+CisKKyAgICA8cD4KKyAgICBUaGVyZSBpcyBhbHNvIHN1cHBvcnQgdG8gd3JpdGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgY29va2llLCBpbmNvbWluZworICAgIGhlYWRlciwgdGhlIFNlc3Npb24gb3Igc29tZXRoaW5nIGVsc2UgaW4gdGhlIFNlcnZsZXRSZXF1ZXN0LgorICAgIEl0IGlzIG1vZGVsZWQgYWZ0ZXIgdGhlIGFwYWNoZSBzeW50YXg6CisgICAgPHVsPgorICAgIDxsaT48Yj48Y29kZT4le3h4eH1pPC9jb2RlPjwvYj4gZm9yIGluY29taW5nIGhlYWRlcnM8L2xpPgorICAgIDxsaT48Yj48Y29kZT4le3h4eH1jPC9jb2RlPjwvYj4gZm9yIGEgc3BlY2lmaWMgY29va2llPC9saT4KKyAgICA8bGk+PGI+PGNvZGU+JXt4eHh9cjwvY29kZT48L2I+IHh4eCBpcyBhbiBhdHRyaWJ1dGUgaW4gdGhlIFNlcnZsZXRSZXF1ZXN0PC9saT4KKyAgICA8bGk+PGI+PGNvZGU+JXt4eHh9czwvY29kZT48L2I+IHh4eCBpcyBhbiBhdHRyaWJ1dGUgaW4gdGhlIEh0dHBTZXNzaW9uPC9saT4KKyAgICA8L3VsPgorICAgIDwvcD4KKworCisgICAgPHA+VGhlIHNob3J0aGFuZCBwYXR0ZXJuIG5hbWUgPGNvZGU+Y29tbW9uPC9jb2RlPiAod2hpY2ggaXMgYWxzbyB0aGUKKyAgICBkZWZhdWx0KSBjb3JyZXNwb25kcyB0byA8c3Ryb25nPiclaCAlbCAldSAldCAiJXIiICVzICViJzwvc3Ryb25nPi48L3A+CisKKyAgICA8cD5UaGUgc2hvcnRoYW5kIHBhdHRlcm4gbmFtZSA8Y29kZT5jb21iaW5lZDwvY29kZT4gYXBwZW5kcyB0aGUKKyAgICB2YWx1ZXMgb2YgdGhlIDxjb2RlPlJlZmVyZXI8L2NvZGU+IGFuZCA8Y29kZT5Vc2VyLUFnZW50PC9jb2RlPiBoZWFkZXJzLAorICAgIGVhY2ggaW4gZG91YmxlIHF1b3RlcywgdG8gdGhlIDxjb2RlPmNvbW1vbjwvY29kZT4gcGF0dGVybgorICAgIGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgcGFyYWdyYXBoLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJSZW1vdGUgQWRkcmVzcyBGaWx0ZXIiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKyAgICA8cD5UaGUgPHN0cm9uZz5SZW1vdGUgQWRkcmVzcyBGaWx0ZXI8L3N0cm9uZz4gYWxsb3dzIHlvdSB0byBjb21wYXJlIHRoZQorICAgIElQIGFkZHJlc3Mgb2YgdGhlIGNsaWVudCB0aGF0IHN1Ym1pdHRlZCB0aGlzIHJlcXVlc3QgYWdhaW5zdCBvbmUgb3IgbW9yZQorICAgIDxlbT5yZWd1bGFyIGV4cHJlc3Npb25zPC9lbT4sIGFuZCBlaXRoZXIgYWxsb3cgdGhlIHJlcXVlc3QgdG8gY29udGludWUKKyAgICBvciByZWZ1c2UgdG8gcHJvY2VzcyB0aGUgcmVxdWVzdCBmcm9tIHRoaXMgY2xpZW50LiAgQSBSZW1vdGUgQWRkcmVzcworICAgIEZpbHRlciBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGFueSBDYXRhbGluYSBjb250YWluZXIKKyAgICAoPGEgaHJlZj0iZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4sIDxhIGhyZWY9Imhvc3QuaHRtbCI+SG9zdDwvYT4sIG9yCisgICAgPGEgaHJlZj0iY29udGV4dC5odG1sIj5Db250ZXh0PC9hPiksIGFuZCBtdXN0IGFjY2VwdCBhbnkgcmVxdWVzdAorICAgIHByZXNlbnRlZCB0byB0aGlzIGNvbnRhaW5lciBmb3IgcHJvY2Vzc2luZyBiZWZvcmUgaXQgd2lsbCBiZSBwYXNzZWQgb24uPC9wPgorCisgICAgPHA+VGhlIHN5bnRheCBmb3IgPGVtPnJlZ3VsYXIgZXhwcmVzc2lvbnM8L2VtPiBpcyBkaWZmZXJlbnQgdGhhbiB0aGF0IGZvcgorICAgICdzdGFuZGFyZCcgd2lsZGNhcmQgbWF0Y2hpbmcuIFRvbWNhdCB1c2VzIHRoZSA8Y29kZT5qYXZhLnV0aWwucmVnZXg8L2NvZGU+CisgICAgcGFja2FnZS4gUGxlYXNlIGNvbnN1bHQgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvZiB0aGUKKyAgICBleHByZXNzaW9ucyBzdXBwb3J0ZWQuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJBdHRyaWJ1dGVzIj4KKworICAgIDxwPlRoZSA8c3Ryb25nPlJlbW90ZSBBZGRyZXNzIEZpbHRlcjwvc3Ryb25nPiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nCisgICAgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5KYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIHRvIHVzZS4gIFRoaXMgTVVTVCBiZSBzZXQgdG8KKyAgICAgICAgPHN0cm9uZz5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZW1vdGVBZGRyVmFsdmU8L3N0cm9uZz4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWxsb3ciIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgPGVtPnJlZ3VsYXIgZXhwcmVzc2lvbjwvZW0+IHBhdHRlcm5zCisgICAgICAgIHRoYXQgdGhlIHJlbW90ZSBjbGllbnQncyBJUCBhZGRyZXNzIGlzIGNvbXBhcmVkIHRvLiAgSWYgdGhpcyBhdHRyaWJ1dGUKKyAgICAgICAgaXMgc3BlY2lmaWVkLCB0aGUgcmVtb3RlIGFkZHJlc3MgTVVTVCBtYXRjaCBmb3IgdGhpcyByZXF1ZXN0IHRvIGJlCisgICAgICAgIGFjY2VwdGVkLiAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgYWxsIHJlcXVlc3RzIHdpbGwgYmUKKyAgICAgICAgYWNjZXB0ZWQgVU5MRVNTIHRoZSByZW1vdGUgYWRkcmVzcyBtYXRjaGVzIGEgPGNvZGU+ZGVueTwvY29kZT4KKyAgICAgICAgcGF0dGVybi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZW55IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5BIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIDxlbT5yZWd1bGFyIGV4cHJlc3Npb248L2VtPiBwYXR0ZXJucworICAgICAgICB0aGF0IHRoZSByZW1vdGUgY2xpZW50J3MgSVAgYWRkcmVzcyBpcyBjb21wYXJlZCB0by4gIElmIHRoaXMgYXR0cmlidXRlCisgICAgICAgIGlzIHNwZWNpZmllZCwgdGhlIHJlbW90ZSBhZGRyZXNzIE1VU1QgTk9UIG1hdGNoIGZvciB0aGlzIHJlcXVlc3QgdG8gYmUKKyAgICAgICAgYWNjZXB0ZWQuICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCByZXF1ZXN0IGFjY2VwdGFuY2UgaXMKKyAgICAgICAgZ292ZXJuZWQgc29sZWx5IGJ5IHRoZSA8Y29kZT5hY2NlcHQ8L2NvZGU+IGF0dHJpYnV0ZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJSZW1vdGUgSG9zdCBGaWx0ZXIiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKyAgICA8cD5UaGUgPHN0cm9uZz5SZW1vdGUgSG9zdCBGaWx0ZXI8L3N0cm9uZz4gYWxsb3dzIHlvdSB0byBjb21wYXJlIHRoZQorICAgIGhvc3RuYW1lIG9mIHRoZSBjbGllbnQgdGhhdCBzdWJtaXR0ZWQgdGhpcyByZXF1ZXN0IGFnYWluc3Qgb25lIG9yIG1vcmUKKyAgICA8ZW0+cmVndWxhciBleHByZXNzaW9uczwvZW0+LCBhbmQgZWl0aGVyIGFsbG93IHRoZSByZXF1ZXN0IHRvIGNvbnRpbnVlCisgICAgb3IgcmVmdXNlIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QgZnJvbSB0aGlzIGNsaWVudC4gIEEgUmVtb3RlIEhvc3QKKyAgICBGaWx0ZXIgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhbnkgQ2F0YWxpbmEgY29udGFpbmVyCisgICAgKDxhIGhyZWY9ImVuZ2luZS5odG1sIj5FbmdpbmU8L2E+LCA8YSBocmVmPSJob3N0Lmh0bWwiPkhvc3Q8L2E+LCBvcgorICAgIDxhIGhyZWY9ImNvbnRleHQuaHRtbCI+Q29udGV4dDwvYT4pLCBhbmQgbXVzdCBhY2NlcHQgYW55IHJlcXVlc3QKKyAgICBwcmVzZW50ZWQgdG8gdGhpcyBjb250YWluZXIgZm9yIHByb2Nlc3NpbmcgYmVmb3JlIGl0IHdpbGwgYmUgcGFzc2VkIG9uLjwvcD4KKworICAgIDxwPlRoZSBzeW50YXggZm9yIDxlbT5yZWd1bGFyIGV4cHJlc3Npb25zPC9lbT4gaXMgZGlmZmVyZW50IHRoYW4gdGhhdCBmb3IKKyAgICAnc3RhbmRhcmQnIHdpbGRjYXJkIG1hdGNoaW5nLiBUb21jYXQgdXNlcyB0aGUgPGNvZGU+amF2YS51dGlsLnJlZ2V4PC9jb2RlPgorICAgIHBhY2thZ2UuIFBsZWFzZSBjb25zdWx0IHRoZSBKYXZhIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb2YgdGhlCisgICAgZXhwcmVzc2lvbnMgc3VwcG9ydGVkLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQXR0cmlidXRlcyI+CisKKyAgICA8cD5UaGUgPHN0cm9uZz5SZW1vdGUgSG9zdCBGaWx0ZXI8L3N0cm9uZz4gc3VwcG9ydHMgdGhlIGZvbGxvd2luZworICAgIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlczo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UuICBUaGlzIE1VU1QgYmUgc2V0IHRvCisgICAgICAgIDxzdHJvbmc+b3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVtb3RlSG9zdFZhbHZlPC9zdHJvbmc+LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImFsbG93IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5BIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIDxlbT5yZWd1bGFyIGV4cHJlc3Npb248L2VtPiBwYXR0ZXJucworICAgICAgICB0aGF0IHRoZSByZW1vdGUgY2xpZW50J3MgaG9zdG5hbWUgaXMgY29tcGFyZWQgdG8uICBJZiB0aGlzIGF0dHJpYnV0ZQorICAgICAgICBpcyBzcGVjaWZpZWQsIHRoZSByZW1vdGUgaG9zdG5hbWUgTVVTVCBtYXRjaCBmb3IgdGhpcyByZXF1ZXN0IHRvIGJlCisgICAgICAgIGFjY2VwdGVkLiAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgYWxsIHJlcXVlc3RzIHdpbGwgYmUKKyAgICAgICAgYWNjZXB0ZWQgVU5MRVNTIHRoZSByZW1vdGUgaG9zdG5hbWUgbWF0Y2hlcyBhIDxjb2RlPmRlbnk8L2NvZGU+CisgICAgICAgIHBhdHRlcm4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVueSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+QSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiA8ZW0+cmVndWxhciBleHByZXNzaW9uPC9lbT4gcGF0dGVybnMKKyAgICAgICAgdGhhdCB0aGUgcmVtb3RlIGNsaWVudCdzIGhvc3RuYW1lIGlzIGNvbXBhcmVkIHRvLiAgSWYgdGhpcyBhdHRyaWJ1dGUKKyAgICAgICAgaXMgc3BlY2lmaWVkLCB0aGUgcmVtb3RlIGhvc3RuYW1lIE1VU1QgTk9UIG1hdGNoIGZvciB0aGlzIHJlcXVlc3QgdG8gYmUKKyAgICAgICAgYWNjZXB0ZWQuICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCByZXF1ZXN0IGFjY2VwdGFuY2UgaXMKKyAgICAgICAgZ292ZXJuZWQgc29sZWx5IGJ5IHRoZSA8Y29kZT5hY2NlcHQ8L2NvZGU+IGF0dHJpYnV0ZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJSZXF1ZXN0IER1bXBlciBWYWx2ZSI+CisgIDxzdWJzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisgICAgPHA+VGhlIDxlbT5SZXF1ZXN0IER1bXBlciBWYWx2ZTwvZW0+IGlzIGEgdXNlZnVsIHRvb2wgaW4gZGVidWdnaW5nCisgICAgaW50ZXJhY3Rpb25zIHdpdGggYSBjbGllbnQgYXBwbGljYXRpb24gKG9yIGJyb3dzZXIpIHRoYXQgaXMgc2VuZGluZworICAgIEhUVFAgcmVxdWVzdHMgdG8geW91ciBUb21jYXQtYmFzZWQgc2VydmVyLiAgV2hlbiBjb25maWd1cmVkLCBpdCBjYXVzZXMKKyAgICBkZXRhaWxzIGFib3V0IGVhY2ggcmVxdWVzdCBwcm9jZXNzZWQgYnkgaXRzIGFzc29jaWF0ZWQgPGNvZGU+RW5naW5lPC9jb2RlPiwgCisgICAgPGNvZGU+SG9zdDwvY29kZT4sIG9yIDxjb2RlPkNvbnRleHQ8L2NvZGU+IHRvIGJlIGxvZ2dlZCBhY2NvcmRpbmcgdG8gCisgICAgdGhlIGxvZ2dpbmcgY29uZmlndXJhdGlvbiBmb3IgdGhhdCBjb250YWluZXIuPC9wPgorCisgICAgPHA+PHN0cm9uZz5XQVJOSU5HOiBVc2luZyB0aGlzIHZhbHZlIGhhcyBzaWRlLWVmZmVjdHMuPC9zdHJvbmc+ICBUaGUKKyAgICBvdXRwdXQgZnJvbSB0aGlzIHZhbHZlIGluY2x1ZGVzIGFueSBwYXJhbWV0ZXJzIGluY2x1ZGVkIHdpdGggdGhlIHJlcXVlc3QuCisgICAgVGhlIHBhcmFtZXRlcnMgd2lsbCBiZSBkZWNvZGVkIHVzaW5nIHRoZSBkZWZhdWx0IHBsYXRmb3JtIGVuY29kaW5nLiBBbnkKKyAgICBzdWJzZXF1ZW50IGNhbGxzIHRvIDxjb2RlPnJlcXVlc3Quc2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTwvY29kZT4gd2l0aGluCisgICAgdGhlIHdlYiBhcHBsaWNhdGlvbiB3aWxsIGhhdmUgbm8gZWZmZWN0LjwvcD4KKworICAgIDxwPk5vdGU6IHRoaXMgVmFsdmUgaXMgbm93IGRlcHJhY2F0ZWQgaW4gZmF2b3Igb2YgdGhlIFJlcXVlc3REdW1wZXJGaWx0ZXIsCisgICAgd2hpY2ggZG9lcyB0aGUgc2FtZSB0aGluZyBpbiBhIHBvcnRhYmxlIG1hbm5lci4gVGhpcyBGaWx0ZXIgaXMgaW5jbHVkZWQgaW4gCisgICAgdGhlIGV4YW1wbGVzIGFwcGxpY2F0aW9uOiBzZWUgCisgICAgJENBVEFMSU5BX0hPTUUvd2ViYXBwcy9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycyBmb3IgdGhlIHNvdXJjZS48L3A+CisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgICAgPHA+VGhlIDxzdHJvbmc+UmVxdWVzdCBEdW1wZXIgVmFsdmU8L3N0cm9uZz4gc3VwcG9ydHMgdGhlIGZvbGxvd2luZworICAgIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlczo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UuICBUaGlzIE1VU1QgYmUgc2V0IHRvCisgICAgICAgIDxzdHJvbmc+b3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVxdWVzdER1bXBlclZhbHZlPC9zdHJvbmc+LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iU2luZ2xlIFNpZ24gT24gVmFsdmUiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKyAgICA8cD5UaGUgPGVtPlNpbmdsZSBTaWduIE9uIFZhbGU8L2VtPiBpcyB1dGlsaXplZCB3aGVuIHlvdSB3aXNoIHRvIGdpdmUgdXNlcnMKKyAgICB0aGUgYWJpbGl0eSB0byBzaWduIG9uIHRvIGFueSBvbmUgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoCisgICAgeW91ciB2aXJ0dWFsIGhvc3QsIGFuZCB0aGVuIGhhdmUgdGhlaXIgaWRlbnRpdHkgcmVjb2duaXplZCBieSBhbGwgb3RoZXIKKyAgICB3ZWIgYXBwbGljYXRpb25zIG9uIHRoZSBzYW1lIHZpcnR1YWwgaG9zdC48L3A+CisKKyAgICA8cD5TZWUgdGhlIDxhIGhyZWY9Imhvc3QuaHRtbCNTaW5nbGUgU2lnbiBPbiI+U2luZ2xlIFNpZ24gT248L2E+IHNwZWNpYWwKKyAgICBmZWF0dXJlIG9uIHRoZSA8c3Ryb25nPkhvc3Q8L3N0cm9uZz4gZWxlbWVudCBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQXR0cmlidXRlcyI+CisKKyAgICA8cD5UaGUgPHN0cm9uZz5TaW5nbGUgU2lnbiBPbjwvc3Ryb25nPiBWYWx2ZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nCisgICAgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5KYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIHRvIHVzZS4gIFRoaXMgTVVTVCBiZSBzZXQgdG8KKyAgICAgICAgPHN0cm9uZz5vcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuU2luZ2xlU2lnbk9uPC9zdHJvbmc+LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InJlcXVpcmVSZWF1dGhlbnRpY2F0aW9uIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5EZWZhdWx0IGZhbHNlLiBGbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIGVhY2ggcmVxdWVzdCBuZWVkcyB0byBiZSAKKyAgICAgICAgcmVhdXRoZW50aWNhdGVkIHRvIHRoZSBzZWN1cml0eSA8c3Ryb25nPlJlYWxtPC9zdHJvbmc+LiBJZiAidHJ1ZSIsIHRoaXMKKyAgICAgICAgVmFsdmUgdXNlcyBjYWNoZWQgc2VjdXJpdHkgY3JlZGVudGlhbHMgKHVzZXJuYW1lIGFuZCBwYXNzd29yZCkgdG8KKyAgICAgICAgcmVhdXRoZW50aWNhdGUgdG8gdGhlIDxzdHJvbmc+UmVhbG08L3N0cm9uZz4gZWFjaCByZXF1ZXN0IGFzc29jaWF0ZWQgCisgICAgICAgIHdpdGggYW4gU1NPIHNlc3Npb24uICBJZiAiZmFsc2UiLCB0aGUgVmFsdmUgY2FuIGl0c2VsZiBhdXRoZW50aWNhdGUgCisgICAgICAgIHJlcXVlc3RzIGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIHZhbGlkIFNTTyBjb29raWUsIHdpdGhvdXQgCisgICAgICAgIHJlY2hlY2tpbmcgd2l0aCB0aGUgPHN0cm9uZz5SZWFsbTwvc3Ryb25nPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIAorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb29raWVEb21haW4iIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNldHMgdGhlIGhvc3QgZG9tYWluIHRvIGJlIHVzZWQgZm9yIHNzbyBjb29raWVzLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorIAorICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkZvcm0gQXV0aGVudGljYXRvciBWYWx2ZSI+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICAgIDxwPlRoZSA8c3Ryb25nPkZvcm0gQXV0aGVudGljYXRvciBWYWx2ZTwvc3Ryb25nPiBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvCisgICAgYW55IDxhIGhyZWY9ImNvbnRleHQuaHRtbCI+Q29udGV4dDwvYT4gdGhhdCBpcyBjb25maWd1cmVkIHRvIHVzZSBGT1JNCisgICAgYXV0aGVudGljYXRpb24uPC9wPgorCisgICAgPHA+SWYgYW55IG5vbi1kZWZhdWx0IHNldHRpbmdzIGFyZSByZXF1aXJlZCwgdGhlIHZhbHZlIG1heSBiZSBjb25maWd1cmVkCisgICAgd2l0aGluIDxhIGhyZWY9ImNvbnRleHQuaHRtbCI+Q29udGV4dDwvYT4gZWxlbWVudCB3aXRoIHRoZSByZXF1aXJlZAorICAgIHZhbHVlcy48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgICAgPHA+VGhlIDxzdHJvbmc+Rm9ybSBBdXRoZW50aWNhdG9yIFZhbHZlPC9zdHJvbmc+IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcKKyAgICBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXM6PC9wPgorCisgICAgPGF0dHJpYnV0ZXM+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPkphdmEgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdG8gdXNlLiAgVGhpcyBNVVNUIGJlIHNldCB0bworICAgICAgICA8c3Ryb25nPm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5Gb3JtQXV0aGVudGljYXRvcjwvc3Ryb25nPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGFyYWN0ZXJFbmNvZGluZyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+Q2hhcmFjdGVyIGVuY29kaW5nIHRvIHVzZSB0byByZWFkIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgcGFyYW1ldGVycworICAgICAgICBmcm9tIHRoZSByZXF1ZXN0LiBJZiBub3Qgc2V0LCB0aGUgZW5jb2Rpbmcgb2YgdGhlIHJlcXVlc3QgYm9keSB3aWxsIGJlCisgICAgICAgIHVzZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Nvbm5lY3RvcnMueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25uZWN0b3JzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjcxMDFiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25uZWN0b3JzLnhtbApAQCAtMCwwICsxLDYxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iY29ubmVjdG9ycy5odG1sIj4KKworICAgICZwcm9qZWN0OworCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxhdXRob3IgZW1haWw9InJlbW1AYXBhY2hlLm9yZyI+UmVteSBNYXVjaGVyYXQ8L2F1dGhvcj4KKyAgICAgICAgPHRpdGxlPkNvbm5lY3RvcnMgSG93IFRvPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCis8cD5DaG9vc2luZyBhIGNvbm5lY3RvciB0byB1c2Ugd2l0aCBUb21jYXQgY2FuIGJlIGRpZmZpY3VsdC4gVGhpcyBwYWdlIHdpbGwKK2xpc3QgdGhlIGNvbm5lY3RvcnMgd2hpY2ggYXJlIHN1cHBvcnRlZCB3aXRoIHRoaXMgVG9tY2F0IHJlbGVhc2UsIGFuZCB3aWxsCitob3BlZnVsbHkgaGVscCB5b3UgbWFrZSB0aGUgcmlnaHQgY2hvaWNlIGFjY29yZGluZyB0byB5b3VyIG5lZWRzLjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJIVFRQIj4KKworPHA+VGhlIEhUVFAgY29ubmVjdG9yIGlzIHNldHVwIGJ5IGRlZmF1bHQgd2l0aCBUb21jYXQsIGFuZCBpcyByZWFkeSB0byB1c2UuIFRoaXMKK2Nvbm5lY3RvciBmZWF0dXJlcyB0aGUgbG93ZXN0IGxhdGVuY3kgYW5kIGJlc3Qgb3ZlcmFsbCBwZXJmb3JtYW5jZS48L3A+CisKKzxwPkZvciBjbHVzdGVyaW5nLCBhIEhUVFAgbG9hZCBiYWxhbmNlciA8Yj53aXRoIHN1cHBvcnQgZm9yIHdlYiBzZXNzaW9ucyBzdGlja2luZXNzPC9iPgorbXVzdCBiZSBpbnN0YWxsZWQgdG8gZGlyZWN0IHRoZSB0cmFmZmljIHRvIHRoZSBUb21jYXQgc2VydmVycy4gVG9tY2F0IHN1cHBvcnRzIG1vZF9wcm94eQorKG9uIEFwYWNoZSBIVFRQIFNlcnZlciAyLngsIGFuZCBpbmNsdWRlZCBieSBkZWZhdWx0IGluIEFwYWNoZSBIVFRQIFNlcnZlciAyLjIpIGFzIHRoZSBsb2FkIGJhbGFuY2VyLiAKK0l0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZSBwZXJmb3JtYW5jZSBvZiBIVFRQIHByb3h5aW5nIGlzIHVzdWFsbHkgbG93ZXIgdGhhbiB0aGUgCitwZXJmb3JtYW5jZSBvZiBBSlAsIHNvIEFKUCBjbHVzdGVyaW5nIGlzIG9mdGVuIHByZWZlcmFibGUuPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkFKUCI+CisKKzxwPldoZW4gdXNpbmcgYSBzaW5nbGUgc2VydmVyLCB0aGUgcGVyZm9ybWFuY2Ugd2hlbiB1c2luZyBhIG5hdGl2ZSB3ZWJzZXJ2ZXIgaW4gCitmcm9udCBvZiB0aGUgVG9tY2F0IGluc3RhbmNlIGlzIG1vc3Qgb2YgdGhlIHRpbWUgc2lnbmlmaWNhbnRseSB3b3JzZSB0aGFuIGEKK3N0YW5kYWxvbmUgVG9tY2F0IHdpdGggaXRzIGRlZmF1bHQgSFRUUCBjb25uZWN0b3IsIGV2ZW4gaWYgYSBsYXJnZSBwYXJ0IG9mIHRoZSB3ZWIKK2FwcGxpY2F0aW9uIGlzIG1hZGUgb2Ygc3RhdGljIGZpbGVzLiBJZiBpbnRlZ3JhdGlvbiB3aXRoIHRoZSBuYXRpdmUgd2Vic2VydmVyIGlzIAorbmVlZGVkIGZvciBhbnkgcmVhc29uLCBhbiBBSlAgY29ubmVjdG9yIHdpbGwgcHJvdmlkZSBmYXN0ZXIgcGVyZm9ybWFuY2UgdGhhbiAKK3Byb3hpZWQgSFRUUC4gQUpQIGNsdXN0ZXJpbmcgaXMgdGhlIG1vc3QgZWZmaWNpZW50IGZyb20gdGhlIFRvbWNhdCBwZXJzcGVjdGl2ZS4gCitJdCBpcyBvdGhlcndpc2UgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gSFRUUCBjbHVzdGVyaW5nLjwvcD4KKworPHA+VGhlIG5hdGl2ZSBjb25uZWN0b3JzIHN1cHBvcnRlZCB3aXRoIHRoaXMgVG9tY2F0IHJlbGVhc2UgYXJlOgorPHVsPgorPGxpPkpLIDEuMi54IHdpdGggYW55IG9mIHRoZSBzdXBwb3J0ZWQgc2VydmVyczwvbGk+Cis8bGk+bW9kX3Byb3h5IG9uIEFwYWNoZSBIVFRQIFNlcnZlciAyLnggKGluY2x1ZGVkIGJ5IGRlZmF1bHQgaW4gQXBhY2hlIEhUVFAgU2VydmVyIDIuMiksIAord2l0aCBBSlAgZW5hYmxlZDwvbGk+Cis8L3VsPgorPC9wPgorCis8cD48Yj5PdGhlciBuYXRpdmUgY29ubmVjdG9ycyBzdXBwb3J0aW5nIEFKUCBtYXkgd29yaywgYnV0IGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLjwvYj48L3A+CisKKzwvc2VjdGlvbj4KKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9kZWZhdWx0LXNlcnZsZXQueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9kZWZhdWx0LXNlcnZsZXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg0ZmJkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2RlZmF1bHQtc2VydmxldC54bWwKQEAgLTAsMCArMSwyOTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJkZWZhdWx0LXNlcnZsZXQuaHRtbCI+CisKKyAgICAmcHJvamVjdDsKKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8YXV0aG9yIGVtYWlsPSJmdW5rbWFuQGFwYWNoZS5vcmciPlRpbSBGdW5rPC9hdXRob3I+CisgICAgICAgIDx0aXRsZT5EZWZhdWx0IFNlcnZsZXQgUmVmZXJlbmNlPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCitUaGlzIGRpc2N1c3NlcyBkaWZmZXJlbnQgd2F5cyB0byBtYW5pcHVsYXRlIHRoZSBkZWZhdWx0IHNlcnZsZXQuIFRvcGljcyBhcmUKKzx1bD4KKyAgPGxpPjxhIGhyZWY9IiN3aGF0Ij5XaGF0IGlzIHRoZSBEZWZhdWx0U2VydmxldD88L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiN3aGVyZSI+V2hlcmUgaXMgaXQgZGVjbGFyZWQ/PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjY2hhbmdlIj5XaGF0IGNhbiBJIGNoYW5nZT88L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNkaXIiPkhvdyBkbyBJIGN1c3RvbWl6ZSBkaXJlY3RvcnkgbGlzdGluZ3M/PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjc2VjdXJlIj5Ib3cgZG8gSSBzZWN1cmUgZGlyZWN0b3J5IGxpc3RpbmdzPzwvYT48L2xpPgorCis8L3VsPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IldoYXQgaXMgdGhlIERlZmF1bHRTZXJ2bGV0Ij4KKzxhIG5hbWU9IndoYXQiPjwvYT4KK1RoZSBkZWZhdWx0IHNlcnZsZXQgaXMgdGhlIHNlcnZsZXQgd2hpY2ggc2VydmVzIHN0YXRpYyByZXNvdXJjZXMgYXMgd2VsbAorYXMgc2VydmVzIHRoZSBkaXJlY3RvcnkgbGlzdGluZ3MgKGlmIGRpcmVjdG9yeSBsaXN0aW5ncyBhcmUgZW5hYmxlZCkuCisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iV2hlcmUgaXMgaXQgZGVjbGFyZWQ/Ij4KKzxhIG5hbWU9IndoZXJlIj48L2E+CitJdCBpcyBkZWNsYXJlZCBnbG9iYWxseSBpbiA8aT4kQ0FUQUxJTkFfSE9NRS9jb25mL3dlYi54bWw8L2k+LgorQnkgZGVmYXVsdCBoZXJlIGlzIGl0J3MgZGVjbGFyYXRpb246Cis8c291cmNlPgorICAgICZsdDtzZXJ2bGV0Jmd0OworICAgICAgICAmbHQ7c2VydmxldC1uYW1lJmd0O2RlZmF1bHQmbHQ7L3NlcnZsZXQtbmFtZSZndDsKKyAgICAgICAgJmx0O3NlcnZsZXQtY2xhc3MmZ3Q7CisgICAgICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5zZXJ2bGV0cy5EZWZhdWx0U2VydmxldAorICAgICAgICAmbHQ7L3NlcnZsZXQtY2xhc3MmZ3Q7CisgICAgICAgICZsdDtpbml0LXBhcmFtJmd0OworICAgICAgICAgICAgJmx0O3BhcmFtLW5hbWUmZ3Q7ZGVidWcmbHQ7L3BhcmFtLW5hbWUmZ3Q7CisgICAgICAgICAgICAmbHQ7cGFyYW0tdmFsdWUmZ3Q7MCZsdDsvcGFyYW0tdmFsdWUmZ3Q7CisgICAgICAgICZsdDsvaW5pdC1wYXJhbSZndDsKKyAgICAgICAgJmx0O2luaXQtcGFyYW0mZ3Q7CisgICAgICAgICAgICAmbHQ7cGFyYW0tbmFtZSZndDtsaXN0aW5ncyZsdDsvcGFyYW0tbmFtZSZndDsKKyAgICAgICAgICAgICZsdDtwYXJhbS12YWx1ZSZndDt0cnVlJmx0Oy9wYXJhbS12YWx1ZSZndDsKKyAgICAgICAgJmx0Oy9pbml0LXBhcmFtJmd0OworICAgICAgICAmbHQ7bG9hZC1vbi1zdGFydHVwJmd0OzEmbHQ7L2xvYWQtb24tc3RhcnR1cCZndDsKKyAgICAmbHQ7L3NlcnZsZXQmZ3Q7CisKKy4uLgorCisgICAgJmx0O3NlcnZsZXQtbWFwcGluZyZndDsKKyAgICAgICAgJmx0O3NlcnZsZXQtbmFtZSZndDtkZWZhdWx0Jmx0Oy9zZXJ2bGV0LW5hbWUmZ3Q7CisgICAgICAgICZsdDt1cmwtcGF0dGVybiZndDsvJmx0Oy91cmwtcGF0dGVybiZndDsKKyAgICAmbHQ7L3NlcnZsZXQtbWFwcGluZyZndDsKKworPC9zb3VyY2U+CisKK1NvIGJ5IGRlZmF1bHQsIHRoZSBkZWZhdWx0IHNlcnZsZXQgaXMgbG9hZGVkIGF0IHdlYmFwcCBzdGFydHVwIGFuZAorZGlyZWN0b3J5IGxpc3RpbmdzIGFyZSBlbmFibGVkIGFuZCBkZWJ1Z2dpbmcgaXMgdHVybmVkIG9mZi4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iV2hhdCBjYW4gSSBjaGFuZ2U/Ij4KKzxhIG5hbWU9ImNoYW5nZSI+PC9hPgorVGhlIERlZmF1bHRTZXJ2bGV0IGFsbG93cyB0aGUgZm9sbG93aW5nIGluaXRQYXJhbXRlcnM6CisKKzx0YWJsZSBib3JkZXI9IjEiPgorICA8dHI+CisgICAgPHRoIHZhbGlnbj0ndG9wJz5kZWJ1ZzwvdGg+CisgICAgPHRkIHZhbGlnbj0ndG9wJz4KKyAgICAgICAgRGVidWdnaW5nIGxldmVsLiBJdCBpcyBub3QgdmVyeSB1c2VmdWwgdW5sZXNzIHlvdSBhcmUgYSB0b21jYXQKKyAgICAgICAgZGV2ZWxvcGVyLiBBcworICAgICAgICBvZiB0aGlzIHdyaXRpbmcsIHVzZWZ1bCB2YWx1ZXMgYXJlIDAsIDEsIDExLCAxMDAwLgorICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGggdmFsaWduPSd0b3AnPmxpc3RpbmdzPC90aD4KKyAgICA8dGQgdmFsaWduPSd0b3AnPgorICAgICAgICBJZiBubyB3ZWxjb21lIGZpbGUgaXMgcHJlc2VudCwgY2FuIGEgZGlyZWN0b3J5IGxpc3RpbmcgYmUKKyAgICAgICAgc2hvd24/CisgICAgICAgIHZhbHVlIG1heSBiZSA8Yj50cnVlPC9iPiBvciA8Yj5mYWxzZTwvYj4KKyAgICAgICAgPGJyIC8+CisgICAgICAgIFdlbGNvbWUgZmlsZXMgYXJlIHBhcnQgb2YgdGhlIHNlcnZsZXQgYXBpLgorICAgICAgICA8YnIgLz4KKyAgICAgICAgPGI+V0FSTklORzo8L2I+IExpc3RpbmdzIG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgbWFueSBlbnRyaWVzIGFyZQorICAgICAgICBleHBlbnNpdmUuIE11bHRpcGxlIHJlcXVlc3RzIGZvciBsYXJnZSBkaXJlY3RvcnkgbGlzdGluZ3MgY2FuIGNvbnN1bWUKKyAgICAgICAgc2lnbmlmaWNhbnQgcHJvcG9ydGlvbnMgb2Ygc2VydmVyIHJlc291cmNlcy4KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRoIHZhbGlnbj0ndG9wJz5yZWFkbWVGaWxlPC90aD4KKyAgICA8dGQgdmFsaWduPSd0b3AnPgorICAgICAgICBJZiBhIGRpcmVjdG9yeSBsaXN0aW5nIGlzIHByZXNlbnRlZCwgYSByZWFkbWUgZmlsZSBtYXkgYWxzbworICAgICAgICBiZSBwcmVzZW50ZWQgd2l0aCB0aGUgbGlzdGluZy4gVGhpcyBmaWxlIGlzIGluc2VydGVkIGFzIGlzCisgICAgICAgIHNvIGl0IG1heSBjb250YWluIEhUTUwuIGRlZmF1bHQgdmFsdWUgaXMgbnVsbAorICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGggdmFsaWduPSd0b3AnPmdsb2JhbFhzbHRGaWxlPC90aD4KKyAgICA8dGQgdmFsaWduPSd0b3AnPgorICAgICAgICBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgeW91ciBkaXJlY3RvcnkgbGlzdGluZywgeW91CisgICAgICAgIGNhbiB1c2UgYW4gWFNMIHRyYW5zZm9ybWF0aW9uLiBUaGlzIHZhbHVlIGlzIGFuIGFic29sdXRlCisgICAgICAgIGZpbGUgbmFtZSB3aGljaCBiZSB1c2VkIGZvciBhbGwgZGlyZWNvdG9yeSBsaXN0aW5ncy4KKyAgICAgICAgVGhpcyBjYW4gYmUgZGlzYWJsZWQgYnkgcGVyIHdlYmFwcCBieSBhbHNvIGRlY2xhcmluZyB0aGUKKyAgICAgICAgZGVmYXVsdCBzZXJ2bGV0IGluIHlvdXIgbG9jYWwgd2ViYXBwJ3Mgd2ViLnhtbC4gVGhlIGZvcm1hdAorICAgICAgICBvZiB0aGUgeG1sIGlzIHNob3duIGJlbG93LgorICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGggdmFsaWduPSd0b3AnPmxvY2FsWHNsdEZpbGU8L3RoPgorICAgIDx0ZCB2YWxpZ249J3RvcCc+CisgICAgICAgIFlvdSBtYXkgYWxzbyBjdXN0b21pemUgeW91ciBkaXJlY3RvcnkgbGlzdGluZyBieSBkaXJlY3RvcnkgYnkKKyAgICAgICAgY29uZmlndXJpbmcgPGNvZGU+bG9jYWxYc2x0RmlsZTwvY29kZT4uIFRoaXMgc2hvdWxkIGJlIGEgcmVsYXRpdmUKKyAgICAgICAgZmlsZSBuYW1lIGluIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGxpc3Rpbmcgd2lsbCB0YWtlIHBsYWNlLgorICAgICAgICBUaGlzIG92ZXJyaWRlcyA8Y29kZT5nbG9iYWxYc2x0RmlsZTwvY29kZT4uIElmIHRoaXMgdmFsdWUKKyAgICAgICAgaXMgcHJlc2VudCBidXQgYSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGVuCisgICAgICAgIDxjb2RlPmdsb2JhbFhzbHRGaWxlPC9jb2RlPiB3aWxsIGJlIHVzZWQuIElmCisgICAgICAgIDxjb2RlPmdsb2JhbFhzbHRGaWxlPC9jb2RlPiBkb2VzIG5vdCBleGlzdCwgdGhlbiB0aGUgZGVmYXVsdAorICAgICAgICBkaXJlY3RvcnkgbGlzdGluZyB3aWxsIGJlIHNob3duLgorICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGggdmFsaWduPSd0b3AnPmlucHV0PC90aD4KKyAgICA8dGQgdmFsaWduPSd0b3AnPgorICAgICAgICBJbnB1dCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIHdoZW4gcmVhZGluZworICAgICAgICByZXNvdXJjZXMgdG8gYmUgc2VydmVkLiAgWzIwNDhdCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0aCB2YWxpZ249J3RvcCc+b3V0cHV0PC90aD4KKyAgICA8dGQgdmFsaWduPSd0b3AnPgorICAgICAgICBPdXRwdXQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSB3aGVuIHdyaXRpbmcKKyAgICAgICAgcmVzb3VyY2VzIHRvIGJlIHNlcnZlZC4gIFsyMDQ4XQorICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGggdmFsaWduPSd0b3AnPnJlYWRvbmx5PC90aD4KKyAgICA8dGQgdmFsaWduPSd0b3AnPgorICAgICAgICBJcyB0aGlzIGNvbnRleHQgInJlYWQgb25seSIsIHNvIEhUVFAgY29tbWFuZHMgbGlrZSBQVVQgYW5kCisgICAgICAgIERFTEVURSBhcmUgcmVqZWN0ZWQ/ICBbdHJ1ZV0KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRoIHZhbGlnbj0ndG9wJz5maWxlRW5jb2Rpbmc8L3RoPgorICAgIDx0ZCB2YWxpZ249J3RvcCc+CisgICAgICAgIEZpbGUgZW5jb2RpbmcgdG8gYmUgdXNlZCB3aGVuIHJlYWRpbmcgc3RhdGljIHJlc291cmNlcy4KKyAgICAgICAgW3BsYXRmb3JtIGRlZmF1bHRdCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0aCB2YWxpZ249J3RvcCc+c2VuZGZpbGVTaXplPC90aD4KKyAgICA8dGQgdmFsaWduPSd0b3AnPgorICAgICAgICBJZiB0aGUgY29ubmVjdG9yIHVzZWQgc3VwcG9ydHMgc2VuZGZpbGUsIHRoaXMgcmVwcmVzZW50cyB0aGUgbWluaW1hbCAKKyAgICAgICAgZmlsZSBzaXplIGluIEtCIGZvciB3aGljaCBzZW5kZmlsZSB3aWxsIGJlIHVzZWQuIFVzZSBhIG5lZ2F0aXZlIHZhbHVlIAorICAgICAgICB0byBhbHdheXMgZGlzYWJsZSBzZW5kZmlsZS4gWzQ4XQorICAgIDwvdGQ+CisgIDwvdHI+CisKKzwvdGFibGU+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkhvdyBkbyBJIGN1c3RvbWl6ZSBkaXJlY3RvcnkgbGlzdGluZ3M/Ij4KKzxhIG5hbWU9ImRpciI+PC9hPgorPHA+WW91IGNhbiBvdmVycmlkZSBEZWZhdWx0U2VydmxldCB3aXRoIHlvdSBvd24gaW1wbGVtZW50YXRpb24gYW5kIHVzZSB0aGF0CitpbiB5b3VyIHdlYi54bWwgZGVjbGFyYXRpb24uIElmIHlvdQorY2FuIHVuZGVydGFuZCB3aGF0IHdhcyBqdXN0IHNhaWQsIHdlIHdpbGwgYXNzdW1lIHlvIGNhbiByZWFkIHRoZSBjb2RlCit0byBEZWZhdWx0U2VydmxldCBzZXJ2bGV0IGFuZCBtYWtlIHRoZSBhcHByb3ByaWF0ZSBhZGp1c3RtZW50cy4gKElmIG5vdCwKK3RoZW4gdGhhdCBtZXRob2QgaXNuJ3QgZm9yIHlvdSkKKzwvcD4KKzxwPgorWW91IGNhbiB1c2UgZWl0aGVyICA8Y29kZT5sb2NhbFhzbHRGaWxlPC9jb2RlPiBvcgorPGNvZGU+Z2xvYmFsWHNsdEZpbGU8L2NvZGU+IGFuZCBEZWZhdWx0U2VydmxldCB3aWxsIGNyZWF0ZQorYW4geG1sIGRvY3VtZW50IGFuZCBydW4gaXQgdGhyb3VnaCBhbiB4c2wgdHJhbnNmb3JtYXRpb24gYmFzZWQKK29uIHRoZSB2YWx1ZXMgcHJvdmlkZWQgaW4gPGNvZGU+bG9jYWxYc2x0RmlsZTwvY29kZT4gYW5kCis8Y29kZT5nbG9iYWxYc2x0RmlsZTwvY29kZT4uIDxjb2RlPmxvY2FsWHNsdEZpbGU8L2NvZGU+IGlzIGZpcnN0CitjaGVja2VkLCBmb2xsb3dlZCBieSA8Y29kZT5nbG9iYWxYc2x0RmlsZTwvY29kZT4sIHRoZW4gZGVmYXVsdAorYmVoYXZpb3JzIHRha2VzIHBsYWNlLgorPC9wPgorCis8cD4KK0Zvcm1hdDoKKzxzb3VyY2U+CisgICAgJmx0O2xpc3RpbmcmZ3Q7CisgICAgICZsdDtlbnRyaWVzJmd0OworICAgICAgJmx0O2VudHJ5IHR5cGU9J2ZpbGV8ZGlyJyB1cmxQYXRoPSdhUGF0aCcgc2l6ZT0nIyMjJyBkYXRlPSdnbXQgZGF0ZScmZ3Q7CisgICAgICAgIGZpbGVOYW1lMQorICAgICAgJmx0Oy9lbnRyeSZndDsKKyAgICAgICZsdDtlbnRyeSB0eXBlPSdmaWxlfGRpcicgdXJsUGF0aD0nYVBhdGgnIHNpemU9JyMjIycgZGF0ZT0nZ210IGRhdGUnJmd0OworICAgICAgICBmaWxlTmFtZTIKKyAgICAgICZsdDsvZW50cnkmZ3Q7CisgICAgICAuLi4KKyAgICAgJmx0Oy9lbnRyaWVzJmd0OworICAgICAmbHQ7cmVhZG1lJmd0OyZsdDsvcmVhZG1lJmd0OworICAgICZsdDsvbGlzdGluZyZndDsKKzwvc291cmNlPgorPHVsPgorICA8bGk+c2l6ZSB3aWxsIGJlIG1pc3NpbmcgaWYgPGNvZGU+dHlwZT0nZGlyJzwvY29kZT48L2xpPgorICA8bGk+UmVhZG1lIGlzIGEgQ0RBVEEgZW50cnk8L2xpPgorPC91bD4KKzwvcD4KK1RoZSBmb2xsb3dpbmcgaXMgYSBzYW1wbGUgeHNsIGZpbGUgd2hpY2ggbWltaWNzIHRoZSBkZWZhdWx0IHRvbWNhdCBiZWhhdmlvcjoKKzxzb3VyY2U+CismbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKKworJmx0O3hzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorICB2ZXJzaW9uPSIxLjAiJmd0OworCisgICZsdDt4c2w6b3V0cHV0IG1ldGhvZD0ieGh0bWwiIGVuY29kaW5nPSJpc28tODg1OS0xIiBpbmRlbnQ9Im5vIi8mZ3Q7CisKKyAgJmx0O3hzbDp0ZW1wbGF0ZSBtYXRjaD0ibGlzdGluZyImZ3Q7CisgICAmbHQ7aHRtbCZndDsKKyAgICAmbHQ7aGVhZCZndDsKKyAgICAgICZsdDt0aXRsZSZndDsKKyAgICAgICAgU2FtcGxlIERpcmVjdG9yeSBMaXN0aW5nIEZvcgorICAgICAgICAmbHQ7eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGRpcmVjdG9yeSIvJmd0OworICAgICAgJmx0Oy90aXRsZSZndDsKKyAgICAgICZsdDtzdHlsZSZndDsKKyAgICAgICAgaDF7Y29sb3IgOiB3aGl0ZTtiYWNrZ3JvdW5kLWNvbG9yIDogIzAwODZiMjt9CisgICAgICAgIGgze2NvbG9yIDogd2hpdGU7YmFja2dyb3VuZC1jb2xvciA6ICMwMDg2YjI7fQorICAgICAgICBib2R5e2ZvbnQtZmFtaWx5IDogc2Fucy1zZXJpZixBcmlhbCxUYWhvbWE7CisgICAgICAgICAgICAgY29sb3IgOiBibGFjaztiYWNrZ3JvdW5kLWNvbG9yIDogd2hpdGU7fQorICAgICAgICBie2NvbG9yIDogd2hpdGU7YmFja2dyb3VuZC1jb2xvciA6ICMwMDg2YjI7fQorICAgICAgICBhe2NvbG9yIDogYmxhY2s7fSBIUntjb2xvciA6ICMwMDg2YjI7fQorICAgICAgJmx0Oy9zdHlsZSZndDsKKyAgICAmbHQ7L2hlYWQmZ3Q7CisgICAgJmx0O2JvZHkmZ3Q7CisgICAgICAmbHQ7aDEmZ3Q7U2FtcGxlIERpcmVjdG9yeSBMaXN0aW5nIEZvcgorICAgICAgICAgICAgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBkaXJlY3RvcnkiLyZndDsKKyAgICAgICZsdDsvaDEmZ3Q7CisgICAgICAmbHQ7aHIgc2l6ZT0iMSIgLyZndDsKKyAgICAgICZsdDt0YWJsZSBjZWxsc3BhY2luZz0iMCIKKyAgICAgICAgICAgICAgICAgIHdpZHRoPSIxMDAlIgorICAgICAgICAgICAgY2VsbHBhZGRpbmc9IjUiCisgICAgICAgICAgICAgICAgICBhbGlnbj0iY2VudGVyIiZndDsKKyAgICAgICAgJmx0O3RyJmd0OworICAgICAgICAgICZsdDt0aCBhbGlnbj0ibGVmdCImZ3Q7RmlsZW5hbWUmbHQ7L3RoJmd0OworICAgICAgICAgICZsdDt0aCBhbGlnbj0iY2VudGVyIiZndDtTaXplJmx0Oy90aCZndDsKKyAgICAgICAgICAmbHQ7dGggYWxpZ249InJpZ2h0IiZndDtMYXN0IE1vZGlmaWVkJmx0Oy90aCZndDsKKyAgICAgICAgJmx0Oy90ciZndDsKKyAgICAgICAgJmx0O3hzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJlbnRyaWVzIi8mZ3Q7CisgICAgICAgICZsdDsvdGFibGUmZ3Q7CisgICAgICAmbHQ7eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InJlYWRtZSIvJmd0OworICAgICAgJmx0O2hyIHNpemU9IjEiIC8mZ3Q7CisgICAgICAmbHQ7aDMmZ3Q7QXBhY2hlIFRvbWNhdC81LjAmbHQ7L2gzJmd0OworICAgICZsdDsvYm9keSZndDsKKyAgICZsdDsvaHRtbCZndDsKKyAgJmx0Oy94c2w6dGVtcGxhdGUmZ3Q7CisKKworICAmbHQ7eHNsOnRlbXBsYXRlIG1hdGNoPSJlbnRyaWVzIiZndDsKKyAgICAmbHQ7eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImVudHJ5Ii8mZ3Q7CisgICZsdDsveHNsOnRlbXBsYXRlJmd0OworCisgICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9InJlYWRtZSImZ3Q7CisgICAgJmx0O2hyIHNpemU9IjEiIC8mZ3Q7CisgICAgJmx0O3ByZSZndDsmbHQ7eHNsOmFwcGx5LXRlbXBsYXRlcy8mZ3Q7Jmx0Oy9wcmUmZ3Q7CisgICZsdDsveHNsOnRlbXBsYXRlJmd0OworCisgICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9ImVudHJ5IiZndDsKKyAgICAmbHQ7dHImZ3Q7CisgICAgICAmbHQ7dGQgYWxpZ249ImxlZnQiJmd0OworICAgICAgICAmbHQ7eHNsOnZhcmlhYmxlIG5hbWU9InVybFBhdGgiIHNlbGVjdD0iQHVybFBhdGgiLyZndDsKKyAgICAgICAgJmx0O2EgaHJlZj0ieyR1cmxQYXRofSImZ3Q7CisgICAgICAgICAgJmx0O3R0Jmd0OyZsdDt4c2w6YXBwbHktdGVtcGxhdGVzLyZndDsmbHQ7L3R0Jmd0OworICAgICAgICAmbHQ7L2EmZ3Q7CisgICAgICAmbHQ7L3RkJmd0OworICAgICAgJmx0O3RkIGFsaWduPSJyaWdodCImZ3Q7CisgICAgICAgICZsdDt0dCZndDsmbHQ7eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNpemUiLyZndDsmbHQ7L3R0Jmd0OworICAgICAgJmx0Oy90ZCZndDsKKyAgICAgICZsdDt0ZCBhbGlnbj0icmlnaHQiJmd0OworICAgICAgICAmbHQ7dHQmZ3Q7Jmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBkYXRlIi8mZ3Q7Jmx0Oy90dCZndDsKKyAgICAgICZsdDsvdGQmZ3Q7CisgICAgJmx0Oy90ciZndDsKKyAgJmx0Oy94c2w6dGVtcGxhdGUmZ3Q7CisKKyZsdDsveHNsOnN0eWxlc2hlZXQmZ3Q7Cis8L3NvdXJjZT4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJIb3cgZG8gSSBzZWN1cmUgZGlyZWN0b3J5IGxpc3RpbmdzPyI+Cis8YSBuYW1lPSJzZWN1cmUiPjwvYT4KK1VzZSB3ZWIueG1sIGluIGVhY2ggaW5kaXZpZHVhbCB3ZWJhcHAuIFNlZSB0aGUgc2VjdXJpdHkgc2VjdGlvbiBvZiB0aGUKK1NlcnZsZXQgc3BlY2lmaWNhdGlvbi4KKworPC9zZWN0aW9uPgorCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2RlcGxveWVyLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZGVwbG95ZXItaG93dG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZDEwMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2RlcGxveWVyLWhvd3RvLnhtbApAQCAtMCwwICsxLDMyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImRlcGxveWVyLWhvd3RvLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGF1dGhvcj5BbGxpc3RhaXIgQ3Jvc3NsZXk8L2F1dGhvcj4KKyAgICAgICAgPHRpdGxlPlRvbWNhdCBXZWIgQXBwbGljYXRpb24gRGVwbG95bWVudDwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworICAgIDxzZWN0aW9uIG5hbWU9IlRhYmxlIG9mIENvbnRlbnRzIj4KKyAgICA8dWw+CisgICAgICAgIDxsaT48YSBocmVmPSIjSW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L2E+PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNJbnN0YWxsYXRpb24iPkluc3RhbGxhdGlvbjwvYT48L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iI0Egd29yZCBvbiBDb250ZXh0cyI+QSB3b3JkIG9uIENvbnRleHRzPC9hPjwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSIjRGVwbG95bWVudCBvbiBUb21jYXQgc3RhcnR1cCI+RGVwbG95bWVudCBvbiBUb21jYXQgc3RhcnR1cDwvYT48L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iI0RlcGxveWluZyBvbiBhIHJ1bm5pbmcgVG9tY2F0IHNlcnZlciI+RGVwbG95aW5nIG9uIGEgcnVubmluZyBUb21jYXQgc2VydmVyPC9hPjwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSIjRGVwbG95aW5nIHVzaW5nIHRoZSBUb21jYXQgTWFuYWdlciI+RGVwbG95aW5nIHVzaW5nIHRoZSBUb21jYXQgTWFuYWdlcjwvYT48L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iI0RlcGxveWluZyB1c2luZyB0aGUgQ2xpZW50IERlcGxveWVyIFBhY2thZ2UiPkRlcGxveWluZyB1c2luZworICAgICAgICAgICAgdGhlIFRvbWNhdCBDbGllbnQgRGVwbG95ZXI8L2E+PC9saT4KKyAgICA8L3VsPgorICAgIAorICAgIDwvc2VjdGlvbj4KKyAgICAKKyAgICA8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIERlcGxveW1lbnQgaXMgdGhlIHRlcm0gdXNlZCBmb3IgdGhlIHByb2Nlc3Mgb2YgaW5zdGFsbGluZyBhIHdlYgorICAgICAgICAgICAgYXBwbGljYXRpb24gKGVpdGhlciBhIDNyZCBwYXJ0eSBXQVIgb3IgeW91ciBvd24gY3VzdG9tIHdlYiBhcHBsaWNhdGlvbikgCisgICAgICAgICAgICBpbnRvIHRoZSBUb21jYXQgc2VydmVyLiAKKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IG1heSBiZSBhY2NvbXBsaXNoZWQgaW4gYSBudW1iZXIgb2Ygd2F5cworICAgICAgICAgICAgd2l0aGluIHRoZSBUb21jYXQgc2VydmVyLgorICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgIDxsaT5TdGF0aWNhbGx5OyB0aGUgd2ViIGFwcGxpY2F0aW9uIGlzIHNldHVwIGJlZm9yZSBUb21jYXQgaXMgc3RhcnRlZDwvbGk+CisgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICBEeW5hbWljYWxseTsgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgVG9tY2F0IE1hbmFnZXIgd2ViIGFwcGxpY2F0aW9uIG9yIAorICAgICAgICAgICAgICAgICAgICBtYW5pcHVsYXRpbmcgYWxyZWFkeSBkZXBsb3llZCB3ZWIgYXBwbGljYXRpb25zCisgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBUaGUgVG9tY2F0IE1hbmFnZXIgaXMgYSB0b29sIHRoYXQgYWxsb3dzIFVSTC1iYXNlZCB3ZWIgYXBwbGljYXRpb24KKyAgICAgICAgICAgIGRlcGxveW1lbnQgZmVhdHVyZXMuIFRoZXJlIGlzIGFsc28gYSB0b29sIGNhbGxlZCB0aGUgQ2xpZW50IERlcGxveWVyLAorICAgICAgICAgICAgd2hpY2ggaXMgYSBjb21tYW5kIHNoZWxsIGJhc2VkIHNjcmlwdCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBUb21jYXQKKyAgICAgICAgICAgIE1hbmFnZXIgYnV0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBzdWNoIGFzIGNvbXBpbGluZyBhbmQKKyAgICAgICAgICAgIHZhbGlkYXRpbmcgd2ViIGFwcGxpY2F0aW9ucyBhcyB3ZWxsIGFzIHBhY2thZ2luZyB3ZWIgYXBwbGljYXRpb24gaW50bworICAgICAgICAgICAgd2ViIGFwcGxpY2F0aW9uIHJlc291cmNlIChXQVIpIGZpbGVzLgorICAgICAgICA8L3A+CisgICAgPC9zZWN0aW9uPgorICAgIAorICAgIDxzZWN0aW9uIG5hbWU9Ikluc3RhbGxhdGlvbiI+CisgICAgICAgIDxwPgorICAgICAgICAgICAgVGhlcmUgaXMgbm8gaW5zdGFsbGF0aW9uIHJlcXVpcmVkIGZvciBzdGF0aWMgZGVwbG95bWVudCBvZiB3ZWIKKyAgICAgICAgICAgIGFwcGxpY2F0aW9ucyBhcyB0aGlzIGlzIHByb3ZpZGVkIG91dCBvZiB0aGUgYm94IGJ5IFRvbWNhdC4gTm9yIGlzIGFueQorICAgICAgICAgICAgaW5zdGFsbGF0aW9uIHJlcXVpcmVkIGZvciBkZXBsb3ltZW50IGZ1bmN0aW9ucyB3aXRoIHRoZSBUb21jYXQgTWFuYWdlciwgCisgICAgICAgICAgICBhbHRob3VnaCBzb21lIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQgYXMgZGV0YWlsZWQgaW4gdGhlIAorICAgICAgICAgICAgVG9tY2F0IE1hbmFnZXIgbWFudWFsLiBBbiBpbnN0YWxsYXRpb24gaXMgaG93ZXZlciByZXF1aXJlZCBpZiB5b3Ugd2lzaAorICAgICAgICAgICAgdG8gdXNlIHRoZSBUb21jYXQgQ2xpZW50IERlcGxveWVyIChUQ0QpLiAKKyAgICAgICAgPC9wPiAgIAorICAgICAgICA8cD4KKyAgICAgICAgICAgIFRoZSBUQ0QgaXMgbm90IHBhY2thZ2VkIHdpdGggdGhlIFRvbWNhdCBjb3JlIAorICAgICAgICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgbXVzdCB0aGVyZWZvcmUgYmUgZG93bmxvYWRlZCBzZXBhcmF0ZWx5IGZyb20gCisgICAgICAgICAgICB0aGUgRG93bmxvYWRzIGFyZWEuIFRoZSBkb3dubG9hZCBpcyB1c3VhbGx5IGxhYmVsbGVkIAorICAgICAgICAgICAgPGk+amFrYXJ0YS10b21jYXQtNS41LngtZGVwbG95ZXI8L2k+LgorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgICAgVENEIGhhcyBwcmVyZXF1aXNpdGVzIG9mIEFwYWNoZSBBbnQgMS42LjIrIGFuZCBhIEphdmEgaW5zdGFsbGF0aW9uLgorICAgICAgICAgICAgWW91ciBlbnZpcm9ubWVudCBzaG91bGQgZGVmaW5lIGFuIEFOVF9IT01FIGVudmlyb25tZW50IHZhbHVlIHBvaW50aW5nIHRvCisgICAgICAgICAgICB0aGUgcm9vdCBvZiB5b3VyIEFudCBpbnN0YWxsYXRpb24sIGFuZCBhIEpBVkFfSE9NRSB2YWx1ZSBwb2ludGluZyB0bworICAgICAgICAgICAgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4gQWRkaXRpb25hbGx5LCB5b3Ugc2hvdWxkIGVuc3VyZSBBbnQncyBhbnQKKyAgICAgICAgICAgIGNvbW1hbmQsIGFuZCB0aGUgSmF2YSBqYXZhYyBjb21waWxlciBjb21tYW5kIHJ1biBmcm9tIHRoZSBjb21tYW5kIHNoZWxsCisgICAgICAgICAgICB0aGF0IHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBwcm92aWRlcy4KKyAgICAgICAgPC9wPgorICAgICAgICA8b2w+CisgICAgICAgICAgICA8bGk+RG93bmxvYWQgdGhlIFRDRCBkaXN0cmlidXRpb248L2xpPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIFRoZSBUQ0QgcGFja2FnZSBuZWVkIG5vdCBiZSBleHRyYWN0ZWQgaW50byBhbnkgZXhpc3RpbmcgVG9tY2F0CisgICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uLCBpdCBjYW4gYmUgZXh0cmFjdGVkIHRvIGFueSBsb2NhdGlvbi4KKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8bGk+UmVhZCBVc2luZyB0aGUgPGEgaHJlZj0iI0RlcGxveWluZyB1c2luZyB0aGUgQ2xpZW50IERlcGxveWVyIFBhY2thZ2UiPgorICAgICAgICAgICAgVG9tY2F0IENsaWVudCBEZXBsb3llcjwvYT48L2xpPgorICAgICAgICA8L29sPgorICAgIDwvc2VjdGlvbj4KKyAgICAgICAgCisgICAgPHNlY3Rpb24gbmFtZT0iQSB3b3JkIG9uIENvbnRleHRzIj4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBJbiB0YWxraW5nIGFib3V0IGRlcGxveW1lbnQgb2Ygd2ViIGFwcGxpY2F0aW9ucywgdGhlIGNvbmNlcHQgb2YgYQorICAgICAgICAgICAgPGk+Q29udGV4dDwvaT4gaXMgcmVxdWlyZWQgdG8gYmUgdW5kZXJzdG9vZC4gQSBDb250ZXh0IGlzIHdoYXQgVG9tY2F0IAorICAgICAgICAgICAgY2FsbHMgYSB3ZWIgYXBwbGljYXRpb24uCisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBJbiBvcmRlciB0byBjb25maWd1cmUgYSBDb250ZXh0IHdpdGhpbiBUb21jYXQgYSA8aT5Db250ZXh0IERlc2NyaXB0b3I8L2k+CisgICAgICAgICAgICBpcyByZXF1aXJlZC4gQSBDb250ZXh0IERlc2NyaXB0b3IgaXMgc2ltcGx5IGFuIFhNTCBmaWxlIHRoYXQgY29udGFpbnMKKyAgICAgICAgICAgIFRvbWNhdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gZm9yIGEgQ29udGV4dCwgZS5nIG5hbWluZyByZXNvdXJjZXMgb3IgCisgICAgICAgICAgICBzZXNzaW9uIG1hbmFnZXIgY29uZmlndXJhdGlvbi4gSW4gZWFybGllciB2ZXJzaW9ucyBvZgorICAgICAgICAgICAgVG9tY2F0IHRoZSBjb250ZW50IG9mIGEgQ29udGV4dCBEZXNjcmlwdG9yIGNvbmZpZ3VyYXRpb24gd2FzIG9mdGVuIHN0b3JlZCB3aXRoaW4KKyAgICAgICAgICAgIFRvbWNhdCdzIHByaW1hcnkgY29uZmlndXJhdGlvbiBmaWxlIDxpPnNlcnZlci54bWw8L2k+IGJ1dCB0aGlzIGlzIG5vdworICAgICAgICAgICAgZGlzY291cmFnZWQgKGFsdGhvdWdoIGl0IGN1cnJlbnRseSBzdGlsbCB3b3JrcykuCisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+ICAgICAgICAKKyAgICAgICAgICAgIENvbnRleHQgRGVzY3JpcHRvcnMgbm90IG9ubHkgaGVscCBUb21jYXQgdG8ga25vdyBob3cgdG8gY29uZmlndXJlIAorICAgICAgICAgICAgQ29udGV4dHMgYnV0IG90aGVyIHRvb2xzIHN1Y2ggYXMgdGhlIFRvbWNhdCBNYW5hZ2VyIGFuZCBUREMgb2Z0ZW4gdXNlIAorICAgICAgICAgICAgdGhlc2UgQ29udGV4dCBEZXNjcmlwdG9ycyB0byBwZXJmb3JtIHRoZWlyIHJvbGVzIHByb3Blcmx5LgorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgICAgVGhlIGxvY2F0aW9ucyBmb3IgQ29udGV4dCBEZXNjcmlwdG9ycyBhcmU7CisgICAgICAgICAgICA8b2w+CisgICAgICAgICAgICAgICAgPGxpPiRDQVRBTElOQV9IT01FL2NvbmYvW2VuZ2luZW5hbWVdL1tob3N0bmFtZV0vY29udGV4dC54bWw8L2xpPgorICAgICAgICAgICAgICAgIDxsaT4kQ0FUQUxJTkFfSE9NRS93ZWJhcHBzL1t3ZWJhcHBuYW1lXS9NRVRBLUlORi9jb250ZXh0LnhtbDwvbGk+CisgICAgICAgICAgICA8L29sPgorICAgICAgICAgICAgRmlsZXMgaW4gKDEpIGFyZSBuYW1lZCBbd2ViYXBwbmFtZV0ueG1sIGJ1dCBmaWxlcyBpbiAoMikgYXJlIG5hbWVkCisgICAgICAgICAgICBjb250ZXh0LnhtbC4gSWYgYSBDb250ZXh0IERlc2NyaXB0b3IgaXMgbm90IHByb3ZpZGVkIGZvciBhIENvbnRleHQsCisgICAgICAgICAgICBUb21jYXQgY29uZmlndXJlcyB0aGUgQ29udGV4dCB1c2luZyBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgPC9wPgorICAgIDwvc2VjdGlvbj4KKyAgICAKKyAgICA8c2VjdGlvbiBuYW1lPSJEZXBsb3ltZW50IG9uIFRvbWNhdCBzdGFydHVwIj4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBJZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHVzaW5nIHRoZSBUb21jYXQgTWFuYWdlciwgb3IgVENELCAKKyAgICAgICAgICAgIHRoZW4geW91J2xsIG5lZWQgdG8gZGVwbG95IHlvdXIgd2ViIGFwcGxpY2F0aW9ucyAKKyAgICAgICAgICAgIHN0YXRpY2FsbHkgdG8gVG9tY2F0LCBmb2xsb3dlZCBieSBhIFRvbWNhdCBzdGFydHVwLiBUaGUgbG9jYXRpb24geW91CisgICAgICAgICAgICBkZXBsb3kgd2ViIGFwcGxpY2F0aW9ucyB0byBmb3IgdGhpcyB0eXBlIG9mIGRlcGxveW1lbnQgaXMgY2FsbGVkIHRoZSAKKyAgICAgICAgICAgIDxjb2RlPmFwcEJhc2U8L2NvZGU+IHdoaWNoIGlzIHNwZWNpZmllZCBwZXIgSG9zdC4gWW91IGVpdGhlciBjb3B5IGEKKyAgICAgICAgICAgIHNvLWNhbGxlZCA8aT5leHBsb2RlZCB3ZWIgYXBwbGljYXRpb248L2k+LCBpLmUgbm9uLWNvbXByZXNzZWQsIHRvIHRoaXMKKyAgICAgICAgICAgIGxvY2F0aW9uLCBvciBhIGNvbXByZXNzZWQgd2ViIGFwcGxpY2F0aW9uIHJlc291cmNlIC5XQVIgZmlsZS4KKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFRoZSB3ZWIgYXBwbGljYXRpb25zIHByZXNlbnQgaW4gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSB0aGUgSG9zdCdzCisgICAgICAgICAgICAoZGVmYXVsdCBIb3N0IGlzICJsb2NhbGhvc3QiKSA8Y29kZT5hcHBCYXNlPC9jb2RlPiBhdHRyaWJ1dGUgKGRlZmF1bHQKKyAgICAgICAgICAgIGFwcEJhc2UgaXMgIiRDQVRBTElOQV9IT01FL3dlYmFwcHMiKSB3aWxsIGJlIGRlcGxveWVkIG9uIFRvbWNhdCBzdGFydHVwIAorICAgICAgICAgICAgb25seSBpZiB0aGUgSG9zdCdzIDxjb2RlPmRlcGxveU9uU3RhcnR1cDwvY29kZT4gYXR0cmlidXRlIGlzICJ0cnVlIi4KKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZGVwbG95bWVudCBzZXF1ZW5jZSB3aWxsIG9jY3VyIG9uIFRvbWNhdCBzdGFydHVwIGluIHRoYXQKKyAgICAgICAgICAgIGNhc2U6CisgICAgICAgIDwvcD4KKyAgICAgICAgPG9sPgorICAgICAgICAgICAgPGxpPkFueSBDb250ZXh0IERlc2NyaXB0b3JzIHdpbGwgYmUgZGVwbG95ZWQgZmlyc3QuPC9saT4KKyAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICBFeHBsb2RlZCB3ZWIgYXBwbGljYXRpb25zIG5vdCByZWZlcmVuY2VkIGJ5IGFueSBDb250ZXh0CisgICAgICAgICAgICAgICAgRGVzY3JpcHRvciB3aWxsIHRoZW4gYmUgZGVwbG95ZWQuIElmIHRoZXkgaGF2ZSBhbiBhc3NvY2lhdGVkIAorICAgICAgICAgICAgICAgIC5XQVIgZmlsZSBpbiB0aGUgYXBwQmFzZSBhbmQgaXQgaXMgbmV3ZXIgdGhhbiB0aGUgZXhwbG9kZWQgd2ViIGFwcGxpY2F0aW9uLCAKKyAgICAgICAgICAgICAgICB0aGUgZXhwbG9kZWQgZGlyZWN0b3J5IHdpbGwgYmUgcmVtb3ZlZCBhbmQgdGhlIHdlYmFwcCB3aWxsIGJlIAorICAgICAgICAgICAgICAgIHJlZGVwbG95ZWQgZnJvbSB0aGUgLldBUgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDxsaT4uV0FSIGZpbGVzIHdpbGwgYmUgZGVwbG95ZWQ8L2xpPgorICAgICAgICA8L29sPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIE5vdGUgYWdhaW4gdGhhdCBmb3IgZWFjaCBkZXBsb3llZCB3ZWIgYXBwbGljYXRpb24sIGEgCisgICAgICAgICAgICBDb250ZXh0IERlc2NyaXB0b3Igd2lsbCBiZSBjcmVhdGVkIDxpPnVubGVzcyBvbmUgZXhpc3RzIGFscmVhZHk8L2k+LgorICAgICAgICA8L3A+CisgICAgPC9zZWN0aW9uPgorICAgIAorICAgIDxzZWN0aW9uIG5hbWU9IkRlcGxveWluZyBvbiBhIHJ1bm5pbmcgVG9tY2F0IHNlcnZlciI+CisgICAgICAgIDxwPgorICAgICAgICAgICAgSXQgaXMgcG9zc2libGUgdG8gZGVwbG95IHdlYiBhcHBsaWNhdGlvbnMgdG8gYSBydW5uaW5nIFRvbWNhdCBzZXJ2ZXIuCisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBJZiB0aGUgSG9zdCA8Y29kZT5hdXRvRGVwbG95PC9jb2RlPiBhdHRyaWJ1dGUgaXMgInRydWUiLCB0aGUgSG9zdCB3aWxsIAorICAgICAgICAgICAgYXR0ZW1wdCB0byBkZXBsb3kgYW5kIHVwZGF0ZSB3ZWIgYXBwbGljYXRpb25zIGR5bmFtaWNhbGx5LCBhcyBuZWVkZWQsCisgICAgICAgICAgICBmb3IgZXhhbXBsZSBpZiBhIG5ldyAuV0FSIGlzIGRyb3BwZWQgaW50byB0aGUgPGNvZGU+YXBwQmFzZTwvY29kZT4uIAorICAgICAgICAgICAgRm9yIHRoaXMgdG8gd29yaywgdGhlIEhvc3QgbmVlZHMgdG8gaGF2ZSBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcgCisgICAgICAgICAgICBlbmFibGVkIHdoaWNoIGlzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCisgICAgICAgIDwvcD4KKyAgICAgICAgCisgICAgICAgIDxwPgorICAgICAgICAgICAgPGNvZGU+YXV0b0RlcGxveTwvY29kZT4gc2V0IHRvICJ0cnVlIiBhbmQgYSBydW5uaW5nIFRvbWNhdCBhbGxvd3MgZm9yOgorICAgICAgICA8L3A+CisgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT5EZXBsb3ltZW50IG9mIC5XQVIgZmlsZXMgY29waWVkIGludG8gdGhlIEhvc3QgPGNvZGU+YXBwQmFzZTwvY29kZT4uPC9saT4KKyAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICBEZXBsb3ltZW50IG9mIGV4cGxvZGVkIHdlYiBhcHBsaWNhdGlvbnMgd2hpY2ggYXJlCisgICAgICAgICAgICAgICAgY29waWVkIGludG8gdGhlIEhvc3QgPGNvZGU+YXBwQmFzZTwvY29kZT4uCisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIFJlLWRlcGxveW1lbnQgb2YgYSB3ZWIgYXBwbGljYXRpb24gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBkZXBsb3llZCBmcm9tCisgICAgICAgICAgICAgICAgYSAuV0FSIHdoZW4gdGhlIG5ldyAuV0FSIGlzIHByb3ZpZGVkLiBJbiB0aGlzIGNhc2UgdGhlIGV4cGxvZGVkIAorICAgICAgICAgICAgICAgIHdlYiBhcHBsaWNhdGlvbiBpcyByZW1vdmVkLCBhbmQgdGhlIC5XQVIgaXMgZXhwYW5kZWQgYWdhaW4uIAorICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgZXhwbG9zaW9uIHdpbGwgbm90IG9jY3VyIGlmIHRoZSBIb3N0IGlzIGNvbmZpZ3VyZWQgCisgICAgICAgICAgICAgICAgc28gdGhhdCAuV0FScyBhcmUgbm90IGV4cGxvZGVkIHdpdGggYSA8Y29kZT51bnBhY2tXQVJzPC9jb2RlPgorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBzZXQgdG8gImZhbHNlIiwgaW4gd2hpY2ggY2FzZSB0aGUgd2ViIGFwcGxpY2F0aW9uIAorICAgICAgICAgICAgICAgIHdpbGwgYmUgc2ltcGx5IHJlZGVwbG95ZWQgYXMgYSBjb21wcmVzc2VkIGFyY2hpdmUuCisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIFJlLWRlcGxveW1lbnQgb2YgYSB3ZWIgYXBwbGljYXRpb24gaWYgdGhlIC9XRUItSU5GL3dlYi54bWwgZmlsZSAob3IgYW55CisgICAgICAgICAgICAgICAgb3RoZXIgcmVzb3VyY2UgZGVmaW5lZCBhcyBhIFdhdGNoZWRSZXNvdXJjZSkgaXMgdXBkYXRlZC4KKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgUmUtZGVwbG95bWVudCBvZiBhIHdlYiBhcHBsaWNhdGlvbiBpZiB0aGUgQ29udGV4dCBEZXNjcmlwdG9yIGZpbGUgZnJvbSB3aGljaAorICAgICAgICAgICAgICAgIHRoZSB3ZWIgYXBwbGljYXRpb24gaGFzIGJlZW4gZGVwbG95ZWQgaXMgdXBkYXRlZC4KKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgUmUtZGVwbG95bWVudCBvZiBhIHdlYiBhcHBsaWNhdGlvbiBpZiBhIENvbnRleHQgRGVzY3JpcHRvciBmaWxlICh3aXRoIGEKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBDb250ZXh0IHBhdGggb2YgdGhlIHByZXZpb3VzbHkgZGVwbG95ZWQKKyAgICAgICAgICAgICAgICB3ZWIgYXBwbGljYXRpb24pIGlzIGFkZGVkIHRvIHRoZSAKKyAgICAgICAgICAgICAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL1tlbmdpbmVuYW1lXS9baG9zdG5hbWVdLzwvY29kZT4KKyAgICAgICAgICAgICAgICBkaXJlY3RvcnkuCisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIFVuZGVwbG95bWVudCBvZiBhIHdlYiBhcHBsaWNhdGlvbiBpZiBpdHMgZG9jdW1lbnQgYmFzZSAoZG9jQmFzZSkKKyAgICAgICAgICAgICAgICBpcyBkZWxldGVkLiBOb3RlIHRoYXQgb24gV2luZG93cywgdGhpcyBhc3N1bWVzIHRoYXQgYW50aS1sb2NraW5nIAorICAgICAgICAgICAgICAgIGZlYXR1cmVzIChzZWUgQ29udGV4dCBjb25maWd1cmF0aW9uKSBhcmUgZW5hYmxlZCwgb3RoZXJ3aXNlIGl0IGlzIG5vdCAKKyAgICAgICAgICAgICAgICBwb3NzaWJsZSB0byBkZWxldGUgdGhlIHJlc291cmNlcyBvZiBhIHJ1bm5pbmcgd2ViIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBOb3RlIHRoYXQgd2ViIGFwcGxpY2F0aW9uIHJlbG9hZGluZyBjYW4gYWxzbyBiZSBjb25maWd1cmVkIGluIHRoZSBsb2FkZXIsIGluIHdoaWNoCisgICAgICAgICAgICBjYXNlIGxvYWRlZCBjbGFzc2VzIHdpbGwgYmUgdHJhY2tlZCBmb3IgY2hhbmdlcy4KKyAgICAgICAgPC9wPgorICAgIDwvc2VjdGlvbj4KKyAgICAKKyAgICA8c2VjdGlvbiBuYW1lPSJEZXBsb3lpbmcgdXNpbmcgdGhlIFRvbWNhdCBNYW5hZ2VyIj4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBUaGUgVG9tY2F0IE1hbmFnZXIgaXMgY292ZXJlZCBpbiBpdHMgPGEgaHJlZj0ibWFuYWdlci1ob3d0by5odG1sIj5vd24gbWFudWFsIHBhZ2U8L2E+LiAKKyAgICAgICAgPC9wPgorICAgIDwvc2VjdGlvbj4KKyAgICAgICAgCisgICAgPHNlY3Rpb24gbmFtZT0iRGVwbG95aW5nIHVzaW5nIHRoZSBDbGllbnQgRGVwbG95ZXIgUGFja2FnZSI+CisgICAgICAgIDxwPgorICAgICAgICAgICAgRmluYWxseSwgZGVwbG95bWVudCBvZiB3ZWIgYXBwbGljYXRpb24gbWF5IGJlIGFjaGlldmVkIHVzaW5nIHRoZSAKKyAgICAgICAgICAgIFRvbWNhdCBDbGllbnQgRGVwbG95ZXIuIFRoaXMgaXMgYSBwYWNrYWdlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIAorICAgICAgICAgICAgdmFsaWRhdGUsIGNvbXBpbGUsIGNvbXByZXNzIHRvIC5XQVIsIGFuZCBkZXBsb3kgd2ViIGFwcGxpY2F0aW9ucyB0byAKKyAgICAgICAgICAgIHByb2R1Y3Rpb24gb3IgZGV2ZWxvcG1lbnQgVG9tY2F0IHNlcnZlcnMuIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoaXMgZmVhdHVyZSAKKyAgICAgICAgICAgIHVzZXMgdGhlIFRvbWNhdCBNYW5hZ2VyIGFuZCBhcyBzdWNoIHRoZSB0YXJnZXQgVG9tY2F0IHNlcnZlciBzaG91bGQgYmUKKyAgICAgICAgICAgIHJ1bm5pbmcuCisgICAgICAgIDwvcD4KKyAgICAKKyAgICAgICAgPHA+CisgICAgICAgICAgICBJdCBpcyBhc3N1bWVkIHRoZSB1c2VyIHdpbGwgYmUgZmFtaWxhciB3aXRoIEFwYWNoZSBBbnQgZm9yIHVzaW5nIHRoZSBUQ0QuCisgICAgICAgICAgICBBcGFjaGUgQW50IGlzIGEgc2NyaXB0ZWQgYnVpbGQgdG9vbC4gVGhlIFRDRCBjb21lcyBwcmUtcGFja2FnZWQgd2l0aCBhCisgICAgICAgICAgICBidWlsZCBzY3JpcHQgdG8gdXNlLiBPbmx5IGEgbW9kZXN0IHVuZGVyc3RhbmRpbmcgb2YgQXBhY2hlIEFudCBpcworICAgICAgICAgICAgcmVxdWlyZWQgKGluc3RhbGxhdGlvbiBhcyBsaXN0ZWQgZWFybGllciBpbiB0aGlzIHBhZ2UsIGFuZCBmYW1pbGlhcml0eQorICAgICAgICAgICAgd2l0aCB1c2luZyB0aGUgb3BlcmF0aW5nIHN5c3RlbSBjb21tYW5kIHNoZWxsIGFuZCBjb25maWd1cmluZworICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzKS4KKyAgICAgICAgPC9wPgorICAgICAgICAKKyAgICAgICAgPHA+CisgICAgICAgICAgICBUaGUgVENEIGluY2x1ZGVzIEFudCB0YXNrcywgdGhlIEphc3BlciBwYWdlIGNvbXBpbGVyIGZvciBKU1AgY29tcGlsYXRpb24gCisgICAgICAgICAgICBiZWZvcmUgZGVwbG95bWVudCwgYXMgd2VsbCBhcyBhIHRhc2sgd2hpY2gKKyAgICAgICAgICAgIHZhbGlkYXRlcyB0aGUgd2ViIGFwcGxpY2F0aW9uIENvbnRleHQgRGVzY3JpcHRvci4gVGhlIHZhbGlkYXRvciB0YXNrIChjbGFzcworICAgICAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuVmFsaWRhdG9yVGFzazwvY29kZT4pIGFsbG93cyBvbmx5IG9uZSBwYXJhbWV0ZXI6CisgICAgICAgICAgICB0aGUgYmFzZSBwYXRoIG9mIGFuIGV4cGxvZGVkIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgICAgPC9wPgorICAgIAorICAgICAgICA8cD4KKyAgICAgICAgICAgIFRoZSBUQ0QgdXNlcyBhbiBleHBsb2RlZCB3ZWIgYXBwbGljYXRpb24gYXMgaW5wdXQgKHNlZSB0aGUgbGlzdCBvZiB0aGUKKyAgICAgICAgICAgIHByb3BlcnRpZXMgdXNlZCBiZWxvdykuIEEgd2ViIGFwcGxpY2F0aW9uIHRoYXQgaXMgcHJvZ3JhbWF0aWNhbGx5IAorICAgICAgICAgICAgZGVwbG95ZWQgd2l0aCB0aGUgZGVwbG95ZXIgbWF5IGluY2x1ZGUgYSBDb250ZXh0IERlc2NpcHRvciBpbiAKKyAgICAgICAgICAgIDxjb2RlPi9NRVRBLUlORi9jb250ZXh0LnhtbDwvY29kZT4uCisgICAgICAgIDwvcD4KKyAgICAKKyAgICAgICAgPHA+CisgICAgICAgICAgICBUaGUgVENEIGluY2x1ZGVzIGEgcmVhZHktdG8tdXNlIEFudCBzY3JpcHQsIHdpdGggdGhlIGZvbGxvd2luZyB0YXJnZXRzOgorICAgICAgICA8L3A+CisgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICA8Y29kZT5jb21waWxlPC9jb2RlPiAoZGVmYXVsdCk6IENvbXBpbGUgYW5kIHZhbGlkYXRlIHRoZSB3ZWIgCisgICAgICAgICAgICAgICAgYXBwbGljYXRpb24uIFRoaXMgY2FuIGJlIHVzZWQgc3RhbmRhbG9uZSwgYW5kIGRvZXMgbm90IG5lZWQgYSBydW5uaW5nCisgICAgICAgICAgICAgICAgVG9tY2F0IHNlcnZlci4gVGhlIGNvbXBpbGVkIGFwcGxpY2F0aW9uIHdpbGwgb25seSBydW4gb24gdGhlIGFzc29jaWF0ZWQKKyAgICAgICAgICAgICAgICBUb21jYXQgNS41Lnggc2VydmVyIHJlbGVhc2UsIGFuZCBpcyBub3QgZ3VhcmFudGVlZCB0byB3b3JrIG9uIGFub3RoZXIKKyAgICAgICAgICAgICAgICBUb21jYXQgcmVsZWFzZSwgYXMgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IEphc3BlciBkZXBlbmRzIG9uIGl0cyBydW50aW1lCisgICAgICAgICAgICAgICAgY29tcG9uZW50LiBJdCBzaG91bGQgYWxzbyBiZSBub3RlZCB0aGF0IHRoaXMgdGFyZ2V0IHdpbGwgYWxzbyBjb21waWxlCisgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBhbnkgSmF2YSBzb3VyY2UgZmlsZSBsb2NhdGVkIGluIHRoZSAKKyAgICAgICAgICAgICAgICA8Y29kZT4vV0VCLUlORi9jbGFzc2VzPC9jb2RlPiBmb2xkZXIgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi48L2xpPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIDxjb2RlPmRlcGxveTwvY29kZT46IERlcGxveSBhIHdlYiBhcHBsaWNhdGlvbiAoY29tcGlsZWQgb3Igbm90KSB0byAKKyAgICAgICAgICAgICAgICBhIFRvbWNhdCBzZXJ2ZXIuCisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpPjxjb2RlPnVuZGVwbG95PC9jb2RlPjogVW5kZXBsb3kgYSB3ZWIgYXBwbGljYXRpb248L2xpPgorICAgICAgICAgICAgPGxpPjxjb2RlPnN0YXJ0PC9jb2RlPjogU3RhcnQgd2ViIGFwcGxpY2F0aW9uPC9saT4KKyAgICAgICAgICAgIDxsaT48Y29kZT5yZWxvYWQ8L2NvZGU+OiBSZWxvYWQgd2ViIGFwcGxpY2F0aW9uPC9saT4KKyAgICAgICAgICAgIDxsaT48Y29kZT5zdG9wPC9jb2RlPjogU3RvcCB3ZWIgYXBwbGljYXRpb248L2xpPgorICAgICAgICA8L3VsPgorICAgICAgICAKKyAgICAgICAgPHA+CisgICAgICAgICAgICBJbiBvcmRlciBmb3IgdGhlIGRlcGxveW1lbnQgdG8gYmUgY29uZmlndXJlZCwgY3JlYXRlIGEgZmlsZQorICAgICAgICAgICAgY2FsbGVkIDxjb2RlPmRlcGxveWVyLnByb3BlcnRpZXM8L2NvZGU+IGluIHRoZSBUQ0QgaW5zdGFsbGF0aW9uCisgICAgICAgICAgICBkaXJlY3Rvcnkgcm9vdC4gSW4gdGhpcyBmaWxlLCBhZGQgdGhlIGZvbGxvd2luZyBuYW1lPXZhbHVlIHBhaXJzIHBlcgorICAgICAgICAgICAgbGluZToKKyAgICAgICAgPC9wPgorICAgICAgICAKKyAgICAgICAgPHA+CisgICAgICAgICAgICBBZGRpdGlvbmFsbHksIHlvdSB3aWxsIG5lZWQgdG8gZW5zdXJlIHRoYXQgYSB1c2VyIGhhcyBiZWVuIAorICAgICAgICAgICAgc2V0dXAgZm9yIHRoZSB0YXJnZXQgVG9tY2F0IE1hbmFnZXIgKHdoaWNoIFRDRCB1c2VzKSBvdGhlcndpc2UgdGhlIFRDRAorICAgICAgICAgICAgd2lsbCBub3QgYXV0aGVudGljYXRlIHdpdGggdGhlIFRvbWNhdCBNYW5hZ2VyIGFuZCB0aGUgZGVwbG95bWVudCB3aWxsCisgICAgICAgICAgICBmYWlsLiBUbyBkbyB0aGlzLCBzZWUgdGhlIFRvbWNhdCBNYW5hZ2VyIHBhZ2UuICAgICAgICAKKyAgICAgICAgPC9wPgorICAgICAgICAKKyAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIDxjb2RlPmJ1aWxkPC9jb2RlPjogVGhlIGJ1aWxkIGZvbGRlciB1c2VkIHdpbGwgYmUsIGJ5IGRlZmF1bHQsIAorICAgICAgICAgICAgICAgIDxjb2RlPiR7YnVpbGR9L3dlYmFwcC8ke3BhdGh9PC9jb2RlPi4gQWZ0ZXIgdGhlIGVuZCBvZiB0aGUgZXhlY3V0aW9uCisgICAgICAgICAgICAgICAgb2YgdGhlIDxjb2RlPmNvbXBpbGU8L2NvZGU+IHRhcmdldCwgdGhlIHdlYiBhcHBsaWNhdGlvbiAuV0FSIHdpbGwgYmUKKyAgICAgICAgICAgICAgICBsb2NhdGVkIGF0IDxjb2RlPiR7YnVpbGR9L3dlYmFwcC8ke3BhdGh9LndhcjwvY29kZT4uCisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIDxjb2RlPndlYmFwcDwvY29kZT46IFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZXhwbG9kZWQgd2ViIGFwcGxpY2F0aW9uIAorICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgY29tcGlsZWQgYW5kIHZhbGlkYXRlZC4gQnkgZGVmYXVsdCwgdGhlIGZvbGRlciBpcworICAgICAgICAgICAgICAgIDxjb2RlPm15YXBwPC9jb2RlPi4KKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgPGNvZGU+cGF0aDwvY29kZT46IERlcGxveWVkIGNvbnRleHQgcGF0aCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLCAKKyAgICAgICAgICAgICAgICBieSBkZWZhdWx0IDxjb2RlPi9teWFwcDwvY29kZT4uCisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIDxjb2RlPnVybDwvY29kZT46IEFic29sdXRlIFVSTCB0byB0aGUgVG9tY2F0IE1hbmFnZXIgd2ViIGFwcGxpY2F0aW9uIG9mIGEgCisgICAgICAgICAgICAgICAgcnVubmluZyBUb21jYXQgc2VydmVyLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZGVwbG95IGFuZCB1bmRlcGxveSB0aGUKKyAgICAgICAgICAgICAgICB3ZWIgYXBwbGljYXRpb24uIEJ5IGRlZmF1bHQsIHRoZSBkZXBsb3llciB3aWxsIGF0dGVtcHQgdG8gYWNjZXNzIAorICAgICAgICAgICAgICAgIGEgVG9tY2F0IGluc3RhbmNlIHJ1bm5pbmcgb24gbG9jYWxob3N0LCBhdCAKKyAgICAgICAgICAgICAgICA8Y29kZT5odHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlcjwvY29kZT4uCisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIDxjb2RlPnVzZXJuYW1lPC9jb2RlPjogVG9tY2F0IE1hbmFnZXIgdXNlcm5hbWUgKHVzZXIgc2hvdWxkIGhhdmUgYSByb2xlIG9mCisgICAgICAgICAgICAgICAgbWFuYWdlcikKKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8bGk+PGNvZGU+cGFzc3dvcmQ8L2NvZGU+OiBUb21jYXQgTWFuYWdlciBwYXNzd29yZC48L2xpPgorICAgICAgICA8L3VsPgorICAgIDwvc2VjdGlvbj4KKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9kZXZlbG9wZXJzLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZGV2ZWxvcGVycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmOWJjMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZGV2ZWxvcGVycy54bWwKQEAgLTAsMCArMSw2MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImRldmVsb3BlcnMuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0icmVtbUBhcGFjaGUub3JnIj5SZW15IE1hdWNoZXJhdDwvYXV0aG9yPgorICAgIDxhdXRob3IgZW1haWw9InlvYXZzQGFwYWNoZS5vcmciPllvYXYgU2hhcGlyYTwvYXV0aG9yPgorICAgIDx0aXRsZT5Ub21jYXQgRGV2ZWxvcGVyczwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKyAgPHNlY3Rpb24gbmFtZT0iQWN0aXZlIERldmVsb3BlcnMiPgorCisgICAgPHA+CisgICAgICBUaGUgbGlzdCBpbmRpY2F0ZXMgdGhlIGRldmVsb3BlcnMnIG1haW4gYXJlYXMgb2YgaW50ZXJlc3QuIEZlZWwgZnJlZSB0bworICAgICAgYWRkIHRvIHRoZSBsaXN0IDopIFRoZSBkZXZlbG9wZXJzIGVtYWlsIGFkZHJlc3NlcyBhcmUgCisgICAgICA8Y29kZT5bbG9naW5dQGFwYWNoZS5vcmc8L2NvZGU+LiBQbGVhc2UgPHN0cm9uZz5kbyBub3Q8L3N0cm9uZz4gY29udGFjdCAKKyAgICAgIGRldmVsb3BlcnMgZGlyZWN0bHkgZm9yIGFueSBzdXBwb3J0IGlzc3VlcyAocGxlYXNlIHBvc3QgdG8gdGhlIAorICAgICAgdG9tY2F0LXVzZXJzIG1haWxpbmcgbGlzdCBpbnN0ZWFkLCBvciBvbmUgb2YgdGhlIG90aGVyIHN1cHBvcnQgCisgICAgICByZXNvdXJjZXM7IHNvbWUgb3JnYW5pemF0aW9ucyBhbmQgaW5kaXZpZHVhbCBjb25zdWx0YW50cyBhbHNvIG9mZmVyIAorICAgICAgZm9yIHBheSBUb21jYXQgc3VwcG9ydCwgYXMgbGlzdGVkIG9uIHRoZSAKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS92ZW5kb3JzLmh0bWwiPnZlbmRvcnMgcGFnZTwvYT4KKyAgICAgIG9uIHRoZSBKYWthcnRhIHdlYnNpdGUpLgorICAgIDwvcD4KKworICAgIDx1bD4KKyAgICAgIDxsaT5BbXkgUm9oIChhbXlyb2gpOiBDYXRhbGluYSwgQWRtaW4gd2ViYXBwPC9saT4KKyAgICAgIDxsaT5CaWxsIEJhcmtlciAoYmlsbGJhcmtlcik6IENvbm5lY3RvcnM8L2xpPgorICAgICAgPGxpPkNvc3RpbiBNYW5vbGFjaGUgKGNvc3Rpbik6IENhdGFsaW5hLCBDb25uZWN0b3JzPC9saT4KKyAgICAgIDxsaT5GaWxpcCBIYW5payAoZmhhbmlrKTogQ2x1c3RlcmluZywgUmVsZWFzZSBNYW5hZ2VyPC9saT4KKyAgICAgIDxsaT5HbGVubiBOaWVsc2VuIChnbGVubik6IENhdGFsaW5hLCBDb25uZWN0b3JzPC9saT4KKyAgICAgIDxsaT5IZW5yaSBHb21leiAoaGdvbWV6KTogQ29ubmVjdG9yczwvbGk+CisgICAgICA8bGk+SmFuIEx1ZWhlIChsdWVoZSk6IEphc3BlcjwvbGk+CisgICAgICA8bGk+SmVhbi1GcmFuY29pcyBBcmNhbmQgKGpmYXJjYW5kKTogQ2F0YWxpbmE8L2xpPgorICAgICAgPGxpPkplYW4tRnJlZGVyaWMgQ2xlcmUgKGpmY2xlcmUpOiBDb25uZWN0b3JzPC9saT4KKyAgICAgIDxsaT5KaW0gSmFnaWVsc2tpIChqaW0pOiBDb25uZWN0b3JzPC9saT4KKyAgICAgIDxsaT5LaW4tTWFuIENodW5nIChraW5tYW4pOiBKYXNwZXI8L2xpPgorICAgICAgPGxpPk1hcmsgVGhvbWFzIChtYXJrdCk6IENHSSwgU1NJLCBXZWJEQVYsIGJ1ZyBmaXhpbmc8L2xpPgorICAgICAgPGxpPk1sYWRlbiBUdXJrIChtdHVyayk6IENvbm5lY3RvcnM8L2xpPgorICAgICAgPGxpPlBldGVyIFJvc3NiYWNoIChwZXJvKTogQ2F0YWxpbmEsIENsdXN0ZXJpbmcsIEpNWDwvbGk+CisgICAgICA8bGk+UmFpbmVyIEp1bmcgKHJqdW5nKTogQ2F0YWxpbmEsIENsdXN0ZXJpbmcsIENvbm5lY3RvcnM8L2xpPgorICAgICAgPGxpPlJlbXkgTWF1Y2hlcmF0IChyZW1tKTogQ2F0YWxpbmEsIENvbm5lY3RvcnMsIERvY3M8L2xpPgorICAgICAgPGxpPlRpbSBGdW5rIChmdW5rbWFuKTogQ2F0YWxpbmEsIERvY3M8L2xpPgorICAgICAgPGxpPllvYXYgU2hhcGlyYSAoeW9hdnMpOiBEb2NzLCBKTVgsIENhdGFsaW5hLCBiYWxhbmNlcjwvbGk+CisgICAgPC91bD4KKworICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iUmV0aXJlZCBEZXZlbG9wZXJzIj4KKworCisKKyAgPC9zZWN0aW9uPgorCis8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtYWRtaW4tYXBwcy54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9mcy1hZG1pbi1hcHBzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzMzN2M5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtYWRtaW4tYXBwcy54bWwKQEAgLTAsMCArMSwyNzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJmcy1hZG1pbi1hcHBzLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8dGl0bGU+QWRtaW5pc3RyYXRpdmUgQXBwcyAtIE92ZXJhbGwgUmVxdWlyZW1lbnRzPC90aXRsZT4KKyAgICA8cmV2aXNpb24+JElkJDwvcmV2aXNpb24+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICAgIDxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyB0byBkZWZpbmUgaGlnaCBsZXZlbCByZXF1aXJlbWVudHMKKyAgICBmb3IgYWRtaW5pc3RyYXRpdmUgYXBwbGljYXRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gbWFuYWdlIHRoZSBvcGVyYXRpb24KKyAgICBvZiBhIHJ1bm5pbmcgVG9tY2F0IDUgY29udGFpbmVyLiAgQSB2YXJpZXR5IG9mIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+CisgICAgdG8gdGhlIHN1cHBvcnRlZCBhZG1pbmlzdHJhdGl2ZSBmdW5jdGlvbmFsaXR5IHNoYWxsIGJlIHN1cHBvcnRlZCwgdG8KKyAgICBtZWV0IHZhcnlpbmcgcmVxdWlyZW1lbnRzOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPjxlbT5BcyBBIFNjcmlwdGFibGUgV2ViIEFwcGxpY2F0aW9uPC9lbT4gLSBUaGUgZXhpc3RpbmcKKyAgICAgICAgPGNvZGU+TWFuYWdlcjwvY29kZT4gd2ViIGFwcGxpY2F0aW9uIHByb3ZpZGVzIGEgc2ltcGxlIEhUVFAtYmFzZWQKKyAgICAgICAgaW50ZXJmYWNlIGZvciBtYW5hZ2luZyBUb21jYXQgdGhyb3VnaCBjb21tYW5kcyB0aGF0IGFyZSBleHByZXNzZWQKKyAgICAgICAgZW50aXJlbHkgdGhyb3VnaCBhIHJlcXVlc3QgVVJJLiAgVGhpcyBpcyB1c2VmdWwgaW4gZW52aXJvbm1lbnRzCisgICAgICAgIHdoZXJlIHlvdSB3aXNoIHRvIHNjcmlwdCBhZG1pbmlzdHJhdGl2ZSBjb21tYW5kcyB3aXRoIHRvb2xzIHRoYXQKKyAgICAgICAgY2FuIGdlbmVyYXRlIEhUVFAgdHJhbnNhY3Rpb25zLjwvbGk+CisgICAgPGxpPjxlbT5BcyBBbiBIVE1MLUJhc2VkIFdlYiBBcHBsaWNhdGlvbjwvZW0+IC0gVXNlIGFuIEhUTUwgcHJlc2VudGF0aW9uCisgICAgICAgIHRvIHByb3ZpZGUgYSBHVUktbGlrZSB1c2VyIGludGVyZmFjZSBmb3IgaHVtYW5zIHRvIGludGVyYWN0IHdpdGggdGhlCisgICAgICAgIGFkbWluaXN0cmF0aXZlIGNhcGFiaWxpdGllcy48L2xpPgorICAgIDxsaT48ZW0+QXMgU09BUC1CYXNlZCBXZWIgU2VydmljZXM8L2VtPiAtIFRoZSBvcGVyYXRpb25hbCBjb21tYW5kcyB0bworICAgICAgICBhZG1pbmlzdGVyIFRvbWNhdCBhcmUgbWFkZSBhdmFpbGFibGUgYXMgd2ViIHNlcnZpY2VzIHRoYXQgdXRpbGl6ZQorICAgICAgICBTT0FQIG1lc3NhZ2UgZm9ybWF0cy48L2xpPgorICAgIDxsaT48ZW0+QXMgSmF2YSBNYW5hZ2VtZW50IEV4dGVuc2lvbnMgKEpNWCkgQ29tbWFuZHM8L2VtPiAtIFRoZSBvcGVyYXRpb25hbAorICAgICAgICBjb21tYW5kcyB0byBhZG1pbmlzdGVyIFRvbWNhdCBhcmUgbWFkZSBhdmFpbGFibGUgdGhyb3VnaCBKTVggQVBJcywKKyAgICAgICAgZm9yIGludGVncmF0aW9uIGludG8gbWFuYWdlbWVudCBjb25zb2xlcyB0aGF0IHV0aWxpemUgdGhlbS48L2xpPgorICAgIDxsaT48ZW0+T3RoZXIgUmVtb3RlIEFjY2VzcyBBUElzPC9lbT4gLSBPdGhlciByZW1vdGUgYWNjZXNzIEFQSXMsIHN1Y2gKKyAgICAgICAgYXMgSklOSSwgUk1JLCBhbmQgQ09SQkEgY2FuIGFsc28gYmUgdXRpbGl6ZWQgdG8gYWNjZXNzIGFkbWluaXN0cmF0aXZlCisgICAgICAgIGNhcGFiaWxpdGllcy48L2xpPgorICAgIDwvdWw+CisKKyAgICA8cD5VbmRlcmx5aW5nIGFsbCBvZiB0aGUgYWNjZXNzIG1ldGhvZHMgZGVzY3JpYmVkIGFib3ZlLCBpdCBpcyBhc3N1bWVkCisgICAgdGhhdCB0aGUgYWN0dWFsIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBlaXRoZXIgZGlyZWN0bHkgb24gdGhlCisgICAgY29ycmVzcG9uZGluZyBDYXRhbGluYSBjb21wb25lbnRzIChzdWNoIGFzIGNhbGxpbmcgdGhlCisgICAgPGNvZGU+RGVwbG95ZXIuZGVwbG95KCk8L2NvZGU+IG1ldGhvZCB0byBkZXBsb3kgYSBuZXcgd2ViIGFwcGxpY2F0aW9uKSwKKyAgICBvciB0aHJvdWdoIGEgImJ1c2luZXNzIGxvZ2ljIiBsYXllciB0aGF0IGNhbiBiZSBzaGFyZWQgYWNyb3NzIGFsbCBvZiB0aGUKKyAgICBhY2Nlc3MgbWV0aG9kcy4gIFRoaXMgYXBwcm9hY2ggbWluaW1pemVzIHRoZSBjb3N0IG9mIGFkZGluZyBuZXcKKyAgICBhZG1pbmlzdHJhdGl2ZSBjYXBhYmlsaXRpZXMgbGF0ZXIgLS0gaXQgaXMgb25seSBuZWNlc3NhcnkgdG8gYWRkIHRoZQorICAgIGNvcnJlc3BvbmRpbmcgYnVzaW5lc3MgbG9naWMgZnVuY3Rpb24sIGFuZCB0aGVuIHdyaXRlIGFkYXB0ZXJzIHRvIGl0IGZvcgorICAgIGFsbCBkZXNpcmVkIGFjY2VzcyBtZXRob2RzLjwvcD4KKworICAgIDxwPlRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGlzIGZ1bmN0aW9uYWwgc3BlY2lmaWNhdGlvbiBpcworICAgIDxzdHJvbmc+UFJPUE9TRUQ8L3N0cm9uZz4uICBJdCBoYXMgbm90IHlldCBiZWVuIGRpc2N1c3NlZCBhbmQKKyAgICBhZ3JlZWQgdG8gb24gdGhlIFRPTUNBVC1ERVYgbWFpbGluZyBsaXN0LjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJFeHRlcm5hbCBTcGVjaWZpY2F0aW9ucyI+CisKKyAgICA8cD5UaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbmFsaXR5IGRlcGVuZHMgb24gdGhlIGZvbGxvd2luZworICAgIGV4dGVybmFsIHNwZWNpZmljYXRpb25zOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrL2lkbC9pbmRleC5odG1sIj5KYXZhCisgICAgICAgIElETDwvYT4gKGZvciBDT1JCQSwgaW5jbHVkZWQgaW4gdGhlIEpESyk8L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL0phdmFNYW5hZ2VtZW50L2luZGV4Lmh0bWwiPgorICAgICAgICBKYXZhIE1hbmFnZW1lbnQgRXh0ZW5zaW9uczwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL3JtaS9pbmRleC5odG1sIj5SZW1vdGUKKyAgICAgICAgTWV0aG9kIEludm9jYXRpb248L2E+IChJbmNsdWRlZCBpbiB0aGUgSkRLKTwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJJbXBsZW1lbnRhdGlvbiBSZXF1aXJlbWVudHMiPgorCisgICAgPHA+VGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb25hbGl0eSBzaGFsbCBjb25mb3JtIHRvIHRoZQorICAgIGZvbGxvd2luZyByZXF1aXJlbWVudHM6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+VG8gdGhlIG1heGltdW0gZXh0ZW50IGZlYXNpYmxlLCBhbGwgYWRtaW5pc3RyYXRpdmUgZnVuY3Rpb25zLAorICAgICAgICBhbmQgdGhlIGFjY2VzcyBtZXRob2RzIHRoYXQgc3VwcG9ydCB0aGVtLCBzaGFsbCBydW4gcG9ydGFibHkKKyAgICAgICAgb24gYWxsIHBsYXRmb3JtcyB3aGVyZSBUb21jYXQgNSBpdHNlbGYgcnVucy48L2xpPgorICAgIDxsaT5JbiBhIGRlZmF1bHQgVG9tY2F0IGRpc3RyaWJ1dGlvbiwgYWxsIGFkbWluaXN0cmF0aXZlIGNhcGFiaWxpdGllcworICAgICAgICBzaGFsbCBiZSBkaXNhYmxlZC4gIEl0IHNoYWxsIGJlIG5lY2Vzc2FyeSBmb3IgYSBzeXN0ZW0KKyAgICAgICAgYWRtaW5pc3RyYXRvciB0byBzcGVjaWZpY2FsbHkgZW5hYmxlIHRoZSBkZXNpcmVkIGFjY2VzcyBtZXRob2RzCisgICAgICAgIChzdWNoIGFzIGJ5IGFkZGluZyBhIHVzZXJuYW1lL3Bhc3N3b3JkIHdpdGggYSBzcGVjaWZpYyByb2xlIHRvCisgICAgICAgIHRoZSBUb21jYXQgdXNlcidzIGRhdGFiYXNlLjwvbGk+CisgICAgPGxpPkFkbWluaXN0cmF0aXZlIGZ1bmN0aW9ucyBzaGFsbCBiZSByZWFsaXplZCBhcyBkaXJlY3QgY2FsbHMgdG8KKyAgICAgICAgY29ycmVzcG9uZGluZyBDYXRhbGluYSBBUElzLCBvciB0aHJvdWdoIGEgYnVzaW5lc3MgbG9naWMgbGF5ZXIKKyAgICAgICAgdGhhdCBpcyBpbmRlcGVuZGVudCBvZiB0aGUgYWNjZXNzIG1ldGhvZCB1c2VkIHRvIGluaXRpYXRlIGl0LjwvbGk+CisgICAgPGxpPlRoZSBjb21tb24gYnVzaW5lc3MgbG9naWMgY29tcG9uZW50cyBzaGFsbCBiZSBpbXBsZW1lbnRlZCBpbgorICAgICAgICBwYWNrYWdlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuYWRtaW48L2NvZGU+LjwvbGk+CisgICAgPGxpPlRoZSBjb21tb24gYnVzaW5lc3MgbG9naWMgY29tcG9uZW50cyBzaGFsbCBiZSBidWlsdCBhcyBwYXJ0IG9mIHRoZQorICAgICAgICBzdGFuZGFyZCBDYXRhbGluYSBidWlsZCBwcm9jZXNzLCBhbmQgbWFkZSB2aXNpYmxlIGluIHRoZQorICAgICAgICBDYXRhbGluYSBjbGFzcyBsb2FkZXIuPC9saT4KKyAgICA8bGk+VGhlIEphdmEgY29tcG9uZW50cyByZXF1aXJlZCBmb3IgZWFjaCBhY2Nlc3MgbWV0aG9kIHNoYWxsIGJlCisgICAgICAgIGltcGxlbWVudGVkIGluIHN1YnBhY2thZ2VzIG9mIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuYWRtaW48L2NvZGU+LgorICAgICAgICA8L2xpPgorICAgIDxsaT5UaGUgYnVpbGQgc2NyaXB0cyBzaG91bGQgdHJlYXQgZWFjaCBhY2Nlc3MgbWV0aG9kIGFzIG9wdGlvbmFsLAorICAgICAgICBzbyB0aGF0IGl0IHdpbGwgYmUgYnVpbHQgb25seSBpZiB0aGUgY29ycmVzcG9uZGluZyByZXF1aXJlZAorICAgICAgICBBUElzIGFyZSBwcmVzZW50IGF0IGJ1aWxkIHRpbWUuPC9saT4KKyAgICA8bGk+SXQgc2hhbGwgYmUgcG9zc2libGUgdG8gc2F2ZSB0aGUgY29uZmlndXJlZCBzdGF0ZSBvZiB0aGUgcnVubmluZworICAgICAgICBUb21jYXQgY29udGFpbmVyIHN1Y2ggdGhhdCB0aGlzIHN0YXRlIGNhbiBiZSByZXByb2R1Y2VkIHdoZW4gdGhlCisgICAgICAgIGNvbnRhaW5lciBpcyBzaHV0IGRvd24gYW5kIHJlc3RhcnRlZC48L2xpPgorICAgIDxsaT5BZG1pbnN0cmF0aXZlIGNvbW1hbmRzIHRvIHN0YXJ0IHVwIGFuZCBzaHV0IGRvd24gdGhlIG92ZXJhbGwKKyAgICAgICAgVG9tY2F0IGNvbnRhaW5lciBhcmUgPHN0cm9uZz5vdXQgb2Ygc2NvcGU8L3N0cm9uZz4gZm9yIHRoZQorICAgICAgICBwdXJwb3NlcyBvZiB0aGVzZSBhcHBsaWNhdGlvbnMuICBJdCBpcyBhc3N1bWVkIHRoYXQgb3RoZXIKKyAgICAgICAgKHVzdWFsbHkgcGxhdGZvcm0tc3BlY2lmaWMpIG1lY2hhbmlzbXMgd2lsbCBiZSB1c2VkIGZvciBjb250YWluZXIKKyAgICAgICAgc3RhcnR1cCBhbmQgc2h1dGRvd24uPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRGVwZW5kZW5jaWVzIj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkVudmlyb25tZW50YWwgRGVwZW5kZW5jaWVzIj4KKworICAgIDxwPlRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnRhbCBkZXBlbmRlbmNpZXMgbXVzdCBiZSBtZXQgaW4gb3JkZXIgZm9yCisgICAgYWRtaW5pc3RyYXRpdmUgYXBwbGljYXRpb25zIHRvIG9wZXJhdGUgY29ycmVjdGx5OjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkZvciBhY2Nlc3MgbWV0aG9kcyB0aGF0IHJlcXVpcmUgY3JlYXRpb24gb2Ygc2VydmVyIHNvY2tldHMsIHRoZQorICAgICAgICBhcHByb3ByaWF0ZSBwb3J0cyBtdXN0IGJlIGNvbmZpZ3VyZWQgYW5kIGF2YWlsYWJsZS48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ29udGFpbmVyIERlcGVuZGVuY2llcyI+CisKKyAgICA8cD5Db3JyZWN0IG9wZXJhdGlvbiBvZiBhZG1pbmlzdHJhdGl2ZSBhcHBsaWNhdGlvbnMgZGVwZW5kcyBvbiB0aGUKKyAgICAgICBmb2xsb3dpbmcgc3BlY2lmaWMgZmVhdHVyZXMgb2YgdGhlIHN1cnJvdW5kaW5nIGNvbnRhaW5lcjo8L3A+CisgICAgPHVsPgorICAgIDxsaT5UbyB0aGUgbWF4aW11bSBleHRlbnQgZmVhc2libGUsIENhdGFsaW5hIGNvbXBvbmVudHMgdGhhdCBvZmZlcgorICAgICAgICBkaXJlY3QgYWRtaW5pc3RyYXRpdmUgQVBJcyBhbmQgcHJvcGVydHkgc2V0dGVycyBzaGFsbCBzdXBwb3J0CisgICAgICAgICJsaXZlIiBjaGFuZ2VzIHRvIHRoZWlyIG9wZXJhdGlvbiwgd2l0aG91dCByZXF1aXJpbmcgYSBjb250YWluZXIKKyAgICAgICAgcmVzdGFydC48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRXh0ZXJuYWwgVGVjaG5vbG9naWVzIj4KKworICAgIDxwPlRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIGZvbGxvd2luZyB0ZWNobm9sb2dpZXMgY2FuIGJlIGFzc3VtZWQKKyAgICBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGFuZCBvcGVyYXRpb24gb2YgdGhlIHZhcmlvdXMgYWNjZXNzIG1ldGhvZHMKKyAgICBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgYWRtaW5pc3RyYXRpdmUgYnVzaW5lc3MgbG9naWM6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLyI+SmF2YSAyIFN0YW5kYXJkIEVkaXRpb248L2E+CisgICAgICAgIChWZXJzaW9uIDEuMiBvciBsYXRlcik8L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmpjcC5vcmcvanNyL2RldGFpbC8xNTQuanNwIj5TZXJ2bGV0IDIuNDwvYT4KKyAgICAgICAgKHN1cHBvcnRlZCBuYXRpdmVseSBieSBUb21jYXQgNSk8L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmpjcC5vcmcvanNyL2RldGFpbC8xNTIuanNwIj5KYXZhU2VydmVyIFBhZ2VzIDIuMDwvYT4KKyAgICAgICAgKHN1cHBvcnRlZCBuYXRpdmVseSBieSBUb21jYXQgNSk8L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhZ2xpYnMvZG9jL3N0YW5kYXJkLWRvYy9pbnRyby5odG1sIj5KYXZhU2VydmVyIFBhZ2VzIFN0YW5kYXJkIFRhZyBMaWJyYXJ5IDEuMCAoSmFrYXJ0YSBUYWdsaWJzLVN0YW5kYXJkIDEuMC4zKTwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3N0cnV0cy8iPlN0cnV0cyBGcmFtZXdvcms8L2E+CisgICAgICAgIChWZXJzaW9uIDEuMCkgLSBNVkMgRnJhbWV3b3JrIGZvciBXZWIgQXBwbGljYXRpb25zPC9saT4KKyAgICA8bGk+PHN0cm9uZz5UTyBCRSBERVRFUk1JTkVEPC9zdHJvbmc+IC0gQXBwbGljYXRpb24gZm9yIGhvc3RpbmcgU09BUAorICAgICAgICBiYXNlZCB3ZWIgc2VydmljZXM8L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJGdW5jdGlvbmFsaXR5Ij4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlByb3BlcnRpZXMgb2YgQWRtaW5pc3RlcmVkIE9iamVjdHMiPgorCisgIDxwPkZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIGZvciBhZG1pbmlzdHJhdGl2ZSBhcHBsaWNhdGlvbnMgYXJlIHNwZWNpZmllZAorICBpbiB0ZXJtcyBvZiA8ZW0+QWRtaW5pc3RlcmVkIE9iamVjdHM8L2VtPiwgd2hvc2UgZGVmaW5pdGlvbnMgYW5kIGRldGFpbGVkCisgIHByb3BlcnRpZXMgYXJlIGxpc3RlZCA8YSBocmVmPSJmcy1hZG1pbi1vYmplY3RzLmh0bWwiPmhlcmU8L2E+LiAgSW4gZ2VuZXJhbCwKKyAgQWRtaW5pc3RlcmVkIE9iamVjdHMgY29ycmVzcG9uZCB0byBjb21wb25lbnRzIGluIHRoZSBDYXRhbGluYSBhcmNoaXRlY3R1cmUsCisgIGJ1dCB0aGVzZSBvYmplY3RzIGFyZSBkZWZpbmVkIHNlcGFyYXRlbHkgaGVyZSBmb3IgdGhlIGZvbGxvd2luZyByZWFzb25zOjwvcD4KKyAgPHVsPgorICA8bGk+SXQgaXMgcG9zc2libGUgdGhhdCB0aGUgYWRtaW5pc3RyYXRpdmUgYXBwbGljYXRpb25zIGRvIG5vdCBleHBvc2UKKyAgICAgIGV2ZXJ5IHBvc3NpYmxlIGNvbmZpZ3VyYWJsZSBmYWNldCBvZiB0aGUgdW5kZXJseWluZyBjb21wb25lbnRzLjwvbGk+CisgIDxsaT5JbiBzb21lIGNhc2VzLCBhbiBBZG1pbmlzdGVyZWQgT2JqZWN0IChmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBhbgorICAgICAgYWRtaW5pc3RyYXRpdmUgb3BlcmF0aW9uKSBpcyByZWFsaXplZCBieSBtb3JlIHRoYW4gb25lIENhdGFsaW5hCisgICAgICBjb21wb25lbnQsIGF0IGEgZmluZXItZ3JhaW5lZCBsZXZlbCBvZiBkZXRhaWwuPC9saT4KKyAgPGxpPkl0IGlzIG5lY2Vzc2FyeSB0byByZXByZXNlbnQgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIGEKKyAgICAgIGNvbXBvbmVudCBzZXBhcmF0ZWx5IGZyb20gdGhlIGNvbXBvbmVudCBpdHNlbGYgKGZvciBpbnN0YW5jZSwgaW4KKyAgICAgIG9yZGVyIHRvIHN0b3JlIHRoYXQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlKS48L2xpPgorICA8bGk+SXQgaXMgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIChzdWNoIGFzCisgICAgICBhIERlZmF1bHQgQ29udGV4dCkgd2hlbiB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIGNvbXBvbmVudCBpbnN0YW5jZS4KKyAgICAgIDwvbGk+CisgIDxsaT5BZG1pbmlzdGVyZWQgT2JqZWN0cywgd2hlbiByZWFsaXplZCBhcyBKYXZhIGNsYXNzZXMsIHdpbGwgaW5jbHVkZQorICAgICAgbWV0aG9kcyBmb3IgYWRtaW5pc3RyYXRpdmUgb3BlcmF0aW9ucyB0aGF0IGhhdmUgbm8gY29ycmVzcG9uZGVuY2UKKyAgICAgIHRvIG9wZXJhdGlvbnMgcGVyZm9ybWVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGFjdHVhbCBjb21wb25lbnRzLjwvbGk+CisgIDwvdWw+CisKKyAgPHA+SXQgaXMgYXNzdW1lZCB0aGF0IHRoZSByZWFkZXIgaXMgZmFtaWxpYXIgd2l0aCB0aGUgb3ZlcmFsbCBjb21wb25lbnQKKyAgYXJjaGl0ZWN0dXJlIG9mIENhdGFsaW5hLiAgRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24sIHNlZSB0aGUgY29ycmVzcG9uZGluZworICBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbi4gIFRvIGRpc3Rpbmd1aXNoIG5hbWVzIHRoYXQgYXJlIHVzZWQgYXMgYm90aAorICA8ZW0+QWRtaW5pc3RlcmVkIE9iamVjdHM8L2VtPiBhbmQgPGNvZGU+Q29tcG9uZW50czwvY29kZT4sIGRpZmZlcmVudAorICBmb250IHByZXNlbnRhdGlvbnMgYXJlIHV0aWxpemVkLiAgRGVmYXVsdCB2YWx1ZXMgZm9yIG1hbnkgcHJvcGVydGllcworICBhcmUgbGlzdGVkIGluIFtzcXVhcmUgYnJhY2tldHNdLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJTdXBwb3J0ZWQgQWRtaW5pc3RyYXRpdmUgT3BlcmF0aW9ucyI+CisKKyAgPHA+VGhlIGFkbWluaXN0cmF0aXZlIG9wZXJhdGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlIGFyZSBkZXNjcmliZWQgaW4gdGVybXMKKyAgb2YgdGhlIGNvcnJlc3BvbmRpbmcgQWRtaW5pc3RlcmVkIE9iamVjdHMgKGFzIGRlZmluZWQgYWJvdmUpLCBpbiBhIG1hbm5lcgorICB0aGF0IGlzIGluZGVwZW5kZW50IG9mIHRoZSBhY2Nlc3MgbWV0aG9kIGJ5IHdoaWNoIHRoZXNlIG9wZXJhdGlvbnMgYXJlCisgIHJlcXVlc3RlZC4gIEluIGdlbmVyYWwsIHN1Y2ggb3BlcmF0aW9ucyBhcmUgcmVsZXZhbnQgb25seSBpbiB0aGUgY29udGV4dAorICBvZiBhIHBhcnRpY3VsYXIgQWRtaW5pc3RlcmVkIE9iamVjdCAoYW5kIHdpbGwgbW9zdCBsaWtlbHkgYmUgcmVhbGl6ZWQgYXMKKyAgbWV0aG9kIGNhbGxzIG9uIHRoZSBjb3JyZXNwb25kaW5nIEFkbWluaXN0ZXJlZCBPYmplY3QgY2xhc3NlcyksIHNvIHRoZXkKKyAgYXJlIG9yZ2FuaXplZCBiYXNlZCBvbiB0aGUgY3VycmVudGx5ICJmb2N1c2VkIiBhZG1pbmlzdGVyZWQgb2JqZWN0LgorICBUaGUgYXZhaWxhYmxlIFN1cHBvcnRlZCBPcGVyYXRpb25zIGFyZSBkb2N1bWVudGVkCisgIDxhIGhyZWY9ImZzLWFkbWluLW9wZXJzLmh0bWwiPmhlcmU8L2E+LjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJBY2Nlc3MgTWV0aG9kIFNwZWNpZmljIFJlcXVpcmVtZW50cyI+CisKKyAgPGg1PlNjcmlwdGFibGUgV2ViIEFwcGxpY2F0aW9uPC9oNT4KKworICA8cD5BbiBhcHByb3ByaWF0ZSBzdWJzZXQgb2YgdGhlIGFkbWluaXN0cmF0aXZlIG9wZXJhdGlvbnMgZGVzY3JpYmVkIGFib3ZlCisgIHNoYWxsIGJlIGltcGxlbWVudGVkIGFzIGNvbW1hbmRzIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBieSB0aGUgIk1hbmFnZXIiCisgIHdlYiBhcHBsaWNhdGlvbi4gIDxzdHJvbmc+RklYTUU8L3N0cm9uZz4gLSBFbnVtZXJhdGUgdGhlbS48L3A+CisKKyAgPHA+SW4gYWRkaXRpb24sIHRoaXMgd2ViIGFwcGxpY2F0aW9uIHNoYWxsIGNvbmZvcm0gdG8gdGhlIGZvbGxvd2luZworICByZXF1aXJlbWVudHM6PC9wPgorICA8dWw+CisgIDxsaT5BbGwgcmVxdWVzdCBVUklzIHNoYWxsIGJlIHByb3RlY3RlZCBieSBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgdGhhdAorICAgICAgcmVxdWlyZXMgc2VjdXJpdHkgcm9sZSA8Y29kZT5tYW5hZ2VyPC9jb2RlPiBmb3IgcHJvY2Vzc2luZy48L2xpPgorICA8bGk+VGhlIGRlZmF1bHQgdXNlciBkYXRhYmFzZSBzaGFsbCA8c3Ryb25nPm5vdDwvc3Ryb25nPiBjb250YWluIGFueQorICAgICAgdXNlciB0aGF0IGhhcyBiZWVuIGFzc2lnbmVkIHRoZSByb2xlIDxjb2RlPm1hbmFnZXI8L2NvZGU+LjwvbGk+CisgIDwvdWw+CisKKyAgPGg1PkhUTUwtQmFzZWQgV2ViIEFwcGxpY2F0aW9uPC9oNT4KKworICA8cD5UaGUgZW50aXJlIHN1aXRlIG9mIGFkbWluaXN0cmF0aXZlIG9wZXJhdGlvbnMgZGVzY3JpYmVkIGFib3ZlIHNoYWxsIGJlCisgIG1hZGUgYXZhaWxhYmxlIHRocm91Z2ggYSB3ZWIgYXBwbGljYXRpb24gZGVzaWduZWQgZm9yIGh1bWFuIGludGVyYWN0aW9uLgorICBJbiBhZGRpdGlvbiwgdGhpcyB3ZWIgYXBwbGljYXRpb24gc2hhbGwgY29uZm9ybSB0byB0aGUgZm9sbG93aW5nCisgIHJlcXVpcmVtZW50czo8L3A+CisgIDx1bD4KKyAgPGxpPk11c3QgYmUgaW1wbGVtZW50ZWQgdXNpbmcgc2VydmxldCwgSlNQLCBhbmQgTVZDIGZyYW1ld29yayB0ZWNobm9sb2dpZXMKKyAgICAgIGRlc2NyaWJlZCB1bmRlciAiRXh0ZXJuYWwgVGVjaG5vbG9naWVzIiwgYWJvdmUuPC9saT4KKyAgPGxpPlByb21wdHMgYW5kIGVycm9yIG1lc3NhZ2VzIG11c3QgYmUgaW50ZXJuYXRpb25hbGl6YWJsZSB0byBtdWx0aXBsZQorICAgICAgbGFuZ3VhZ2VzLjwvbGk+CisgIDxsaT5SZW5kZXJlZCBIVE1MIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIE5ldHNjYXBlIE5hdmlnYXRvciAodmVyc29uIDQuNworICAgICAgb3IgbGF0ZXIpIGFuZCBJbnRlcm5ldCBFeHBsb3JlciAodmVyc2lvbiA1LjAgb3IgbGF0ZXIpLjwvbGk+CisgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJUZXN0YWJsZSBBc3NlcnRpb25zIj4KKworICA8cD48c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gQ29tcGxldGUgdGhpcyBzZWN0aW9uLjwvcD4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL2ZzLWFkbWluLW9iamVjdHMueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtYWRtaW4tb2JqZWN0cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0YWQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL2ZzLWFkbWluLW9iamVjdHMueG1sCkBAIC0wLDAgKzEsNDgxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iZnMtYWRtaW4tb2JqZWN0cy5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPkFkbWluaXN0cmF0aXZlIEFwcHMgLSBBZG1pbmlzdGVyZWQgT2JqZWN0czwvdGl0bGU+CisgICAgPHJldmlzaW9uPiRJZCQ8L3JldmlzaW9uPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IkFkbWluaXN0ZXJlZCBPYmplY3RzIE92ZXJ2aWV3Ij4KKworPHA+VGhpcyBkb2N1bWVudCBkZWZpbmVzIHRoZSA8ZW0+QWRtaW5pc3RlcmVkIE9iamVjdHM8L2VtPiB0aGF0IHJlcHJlc2VudAordGhlIGludGVybmFsIGFyY2hpdGVjdHVyYWwgY29tcG9uZW50cyBvZiB0aGUgQ2F0YWxpbmEgc2VydmxldCBjb250YWluZXIuCitBc3NvY2lhdGVkIHdpdGggZWFjaCBpcyBhIHNldCBvZiA8YSBocmVmPSJmcy1hZG1pbi1vcGVycy5odG1sIj5TdXBwb3J0ZWQKK09wZXJhdGlvbnM8L2E+IHRoYXQgY2FuIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBhZG1pbmlzdHJhdGl2ZSBhcHBsaWNhdGlvbiBpcworImZvY3VzZWQiIG9uIGEgcGFydGljdWxhciBjb25maWd1cmFibGUgb2JqZWN0LjwvcD4KKworPHA+VGhlIGZvbGxvd2luZyBBZG1pbmlzdGVyZWQgT2JqZWN0cyBhcmUgZGVmaW5lZDo8L3A+Cis8dWw+Cis8bGk+PGEgaHJlZj0iI0FjY2VzcyBMb2dnZXIiPkFjY2VzcyBMb2dnZXI8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjQ29ubmVjdG9yIj5Db25uZWN0b3I8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjQ29udGV4dCI+Q29udGV4dDwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNEZWZhdWx0IENvbnRleHQiPkRlZmF1bHQgQ29udGV4dDwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNEZWZhdWx0IERlcGxveW1lbnQgRGVzY3JpcHRvciI+RGVmYXVsdCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjRW5naW5lIj5FbmdpbmU8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjRW52aXJvbm1lbnQgRW50cnkiPkVudmlyb25tZW50IEVudHJ5PC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI0hvc3QiPkhvc3Q8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjSkRCQyBSZXNvdXJjZSI+SkRCQyBSZXNvdXJjZTwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNMb2FkZXIiPkxvYWRlcjwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNNYW5hZ2VyIj5NYW5hZ2VyPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI1JlYWxtIj5SZWFsbTwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNSZXF1ZXN0IEZpbHRlciI+UmVxdWVzdCBGaWx0ZXI8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjU2VydmVyIj5TZXJ2ZXI8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjU2VydmljZSI+U2VydmljZTwvYT48L2xpPgorPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkFjY2VzcyBMb2dnZXIiPgorCisgIDxwPkFuIDxlbT5BY2Nlc3MgTG9nZ2VyPC9lbT4gaXMgYW4gb3B0aW9uYWwgPGNvZGU+VmFsdmU8L2NvZGU+IHRoYXQgY2FuCisgIGNyZWF0ZSByZXF1ZXN0IGFjY2VzcyBsb2dzIGluIHRoZSBzYW1lIGZvcm1hdHMgYXMgdGhvc2UgcHJvdmlkZWQgYnkKKyAgd2ViIHNlcnZlcnMuICBTdWNoIGFjY2VzcyBsb2dzIGFyZSB1c2VmdWwgaW5wdXQgdG8gaGl0IGNvdW50IGFuZCB1c2VyCisgIGFjY2VzcyB0cmFja2luZyBhbmFseXNpcyBwcm9ncmFtcy4gIEFuIEFjY2VzcyBMb2dnZXIgY2FuIGJlIGF0dGFjaGVkIHRvCisgIGFuIDxlbT5FbmdpbmU8L2VtPiwgYSA8ZW0+SG9zdDwvZW0+LCBhIDxlbT5Db250ZXh0PC9lbT4sIG9yIGEgPGVtPkRlZmF1bHQKKyAgQ29udGV4dDwvZW0+LjwvcD4KKworICA8cD5UaGUgc3RhbmRhcmQgY29tcG9uZW50IGltcGxlbWVudGluZyBhbiA8ZW0+QWNjZXNzIExvZ2dlcjwvZW0+IGlzCisgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkFjY2Vzc0xvZ1ZhbHZlPC9jb2RlPi4gIEl0IHN1cHBvcnRzIHRoZQorICBmb2xsb3dpbmcgY29uZmlndXJhYmxlIHByb3BlcnRpZXM6PC9wPgorICA8dWw+CisgIDxsaT48Y29kZT5kZWJ1ZzwvY29kZT4gLSBEZWJ1Z2dpbmcgZGV0YWlsIGxldmVsLiAgWzBdPC9saT4KKyAgPGxpPjxjb2RlPmRpcmVjdG9yeTwvY29kZT4gLSBBYnNvbHV0ZSBvciByZWxhdGl2ZSAodG8gJENBVEFMSU5BX0hPTUUpIHBhdGgKKyAgICAgIG9mIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCBhY2Nlc3MgbG9nIGZpbGVzIGFyZSBjcmVhdGVkLgorICAgICAgW2xvZ3NdLjwvbGk+CisgIDxsaT48Y29kZT5wYXR0ZXJuPC9jb2RlPiAtIFBhdHRlcm4gc3RyaW5nIGRlZmluaW5nIHRoZSBmaWVsZHMgdG8gYmUKKyAgICAgIGluY2x1ZGVkIGluIHRoZSBhY2Nlc3MgbG9nIG91dHB1dCwgb3IgImNvbW1vbiIgZm9yIHRoZSBzdGFuZGFyZAorICAgICAgYWNjZXNzIGxvZyBwYXR0ZXJuLiAgU2VlCisgICAgICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5BY2Nlc3NMb2dWYWx2ZTwvY29kZT4gZm9yIG1vcmUKKyAgICAgIGluZm9ybWF0aW9uLiAgW2NvbW1vbl08L2xpPgorICA8bGk+PGNvZGU+cHJlZml4PC9jb2RlPiAtIFByZWZpeCBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbG9nIGZpbGUKKyAgICAgIG5hbWUgY3JlYXRlZCBieSB0aGlzIGFjY2VzcyBsb2dnZXIuPC9saT4KKyAgPGxpPjxjb2RlPnJlc29sdmVIb3N0czwvY29kZT4gLSBTaG91bGQgSVAgYWRkcmVzc2VzIGJlIHJlc29sdmVkIHRvIGhvc3QKKyAgICAgIG5hbWVzIGluIHRoZSBsb2c/ICBbZmFsc2VdPC9saT4KKyAgPGxpPjxjb2RlPnN1ZmZpeDwvY29kZT4gLSBTdWZmaXggYWRkZWQgdG8gdGhlIGVuZCBvZiBlYWNoIGxvZyBmaWxlIG5hbWUKKyAgICAgIGNyZWF0ZWQgYnkgdGhpcyBhY2Nlc3MgbG9nZ2VyLjwvbGk+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJDb25uZWN0b3IiPgorCisgIDxwPkEgPGVtPkNvbm5lY3RvcjwvZW0+IGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhIGNvbW11bmljYXRpb25zIGVuZHBvaW50CisgIGJ5IHdoaWNoIHJlcXVlc3RzIGFyZSByZWNlaXZlZCBmcm9tIChhbmQgcmVzcG9uc2VzIHJldHVybmVkIHRvKSBhIFRvbWNhdAorICBjbGllbnQuICBUaGUgYWRtaW5pc3RyYXRpdmUgYXBwbGljYXRpb25zIHNoYWxsIHN1cHBvcnQgdGhvc2UgY29ubmVjdG9ycworICB0aGF0IGFyZSBjb21tb25seSB1dGlsaXplZCBpbiBUb21jYXQgaW5zdGFsbGF0aW9ucywgYXMgZGVzY3JpYmVkIGluIGRldGFpbAorICBiZWxvdy48L3A+CisKKyAgPHA+Rm9yIHN0YW5kYWxvbmUgdXNlLCB0aGUgc3RhbmRhcmQgY29ubmVjdG9yIHN1cHBvcnRpbmcgdGhlIEhUVFAvMS4xCisgIHByb3RvY29sIGlzIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9ycy5odHRwLkh0dHBDb25uZWN0b3I8L2NvZGU+LgorICBJdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzOjwvcD4KKyAgPHVsPgorICA8bGk+PGNvZGU+YWNjZXB0Q291bnQ8L2NvZGU+IC0gVGhlIG1heGltdW0gcXVldWUgbGVuZ3RoIG9mIGluY29taW5nCisgICAgICBjb25uZWN0aW9ucyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGFjY2VwdGVkLiAgWzEwXTwvbGk+CisgIDxsaT48Y29kZT5hZGRyZXNzPC9jb2RlPiAtIEZvciBzZXJ2ZXJzIHdpdGggbW9yZSB0aGFuIG9uZSBJUCBhZGRyZXNzLCB0aGUKKyAgICAgIGFkZHJlc3MgdXBvbiB3aGljaCB0aGlzIGNvbm5lY3RvciBzaG91bGQgbGlzdGVuLiAgW0FsbCBBZGRyZXNzZXNdPC9saT4KKyAgPGxpPjxjb2RlPmJ1ZmZlclNpemU8L2NvZGU+IC0gRGVmYXVsdCBpbnB1dCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIGZvcgorICAgICAgcmVxdWVzdHMgY3JlYXRlZCBieSB0aGlzIENvbm5lY3Rvci4gIFsyMDQ4XTwvbGk+CisgIDxsaT48Y29kZT5kZWJ1ZzwvY29kZT4gLSBEZWJ1Z2dpbmcgZGV0YWlsIGxldmVsLiAgWzBdPC9saT4KKyAgPGxpPjxjb2RlPmVuYWJsZUxvb2t1cHM8L2NvZGU+IC0gU2hvdWxkIHdlIHBlcmZvcm0gRE5TIGxvb2t1cHMgb24gcmVtb3RlCisgICAgICBJUCBhZGRyZXNzZXMgd2hlbiA8Y29kZT5yZXF1ZXN0LmdldFJlbW90ZUhvc3QoKTwvY29kZT4gaXMgY2FsbGVkPworICAgICAgW3RydWVdPC9saT4KKyAgPGxpPjxjb2RlPm1heFByb2Nlc3NvcnM8L2NvZGU+IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb2Nlc3NvciB0aHJlYWRzCisgICAgICBzdXBwb3J0ZWQgYnkgdGhpcyBjb25uZWN0b3IuICBbMjBdPC9saT4KKyAgPGxpPjxjb2RlPm1pblByb2Nlc3NvcnM8L2NvZGU+IC0gVGhlIG1pbmltdW0gbnVtYmVyIG9mIHByb2Nlc3NvciB0aHJlYWRzCisgICAgICB0byBiZSBjcmVhdGVkIGF0IGNvbnRhaW5lciBzdGFydHVwLiAgWzVdPC9saT4KKyAgPGxpPjxjb2RlPnBvcnQ8L2NvZGU+IC0gVENQL0lQIHBvcnQgbnVtYmVyIG9uIHdoaWNoIHRoaXMgQ29ubmVjdG9yIHNob3VsZAorICAgICAgbGlzdGVuIGZvciBpbmNvbWluZyByZXF1ZXN0cy4gWzgwODBdPC9saT4KKyAgPGxpPjxjb2RlPnByb3h5TmFtZTwvY29kZT4gLSBIb3N0IG5hbWUgdG8gYmUgcmV0dXJuZWQgd2hlbiBhbiBhcHBsaWNhdGlvbgorICAgICAgY2FsbHMgPGNvZGU+cmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCk8L2NvZGU+LiAgW1ZhbHVlIG9mIEhvc3Q6IGhlYWRlcl08L2xpPgorICA8bGk+PGNvZGU+cHJveHlQb3J0PC9jb2RlPiAtIFBvcnQgbnVtYmVyIHRvIGJlIHJldHVybmVkIHdoZW4gYW4gYXBwbGljYXRpb24KKyAgICAgIGNhbGxzIDxjb2RlPnJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpPC9jb2RlPi4gIFtTYW1lIGFzIDxjb2RlPnBvcnQ8L2NvZGU+XQorICAgICAgPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkNvbnRleHQiPgorCisgIDxwPkEgPGVtPkNvbnRleHQ8L2VtPiBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW4gaW5kaXZpZHVhbCB3ZWIgYXBwbGljYXRpb24sCisgIHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgPGVtPkhvc3Q8L2VtPi4gIE5vdGUgdGhhdCB0aGUKKyAgYWRtaW5pc3RyYWJsZSBwcm9wZXJ0aWVzIG9mIGEgPGVtPkNvbnRleHQ8L2VtPiBkbyA8c3Ryb25nPm5vdDwvc3Ryb25nPgorICBpbmNsdWRlIGFueSBzZXR0aW5ncyBmcm9tIGluc2lkZSB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICBmb3IgdGhhdCBhcHBsaWNhdGlvbi48L3A+CisKKyAgPHA+VGhlIHN0YW5kYXJkIGNvbXBvbmVudCBpbXBsZW1lbnRpbmcgYSA8ZW0+Q29udGV4dDwvZW0+IGlzCisgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ8L2NvZGU+LiAgSXQgc3VwcG9ydHMgdGhlCisgIGZvbGxvd2luZyBjb25maWd1cmFibGUgcHJvcGVydGllczo8L3A+CisgIDx1bD4KKyAgPGxpPjxjb2RlPmNvb2tpZXM8L2NvZGU+IC0gU2hvdWxkIGJlIHVzZSBjb29raWVzIGZvciBzZXNzaW9uIGlkZW50aWZpZXIKKyAgICAgIGNvbW11bmljYXRpb24/ICBbdHJ1ZV08L2xpPgorICA8bGk+PGNvZGU+Y3Jvc3NDb250ZXh0PC9jb2RlPiAtIFNob3VsZCBjYWxscyB0bworICAgICAgPGNvZGU+U2VydmxldENvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKTwvY29kZT4gcmV0dXJuIHRoZSBhY3R1YWwKKyAgICAgIGNvbnRleHQgcmVzcG9uc2libGUgZm9yIHRoZSBzcGVjaWZpZWQgcGF0aD8gIFtmYWxzZV08L2xpPgorICA8bGk+PGNvZGU+ZGVidWc8L2NvZGU+IC0gRGVidWdnaW5nIGRldGFpbCBsZXZlbC4gIFswXTwvbGk+CisgIDxsaT48Y29kZT5kb2NCYXNlPC9jb2RlPiAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSAodG8gdGhlCisgICAgICA8Y29kZT5hcHBCYXNlPC9jb2RlPiBvZiBvdXIgb3duaW5nIDxlbT5Ib3N0PC9lbT4pIHBhdGhuYW1lIG9mIGEKKyAgICAgIGRpcmVjdG9yeSBjb250YWluaW5nIGFuIHVucGFja2VkIHdlYiBhcHBsaWNhdGlvbiwgb3Igb2YgYSB3ZWIKKyAgICAgIGFwcGxpY2F0aW9uIGFyY2hpdmUgKFdBUikgZmlsZS48L2xpPgorICA8bGk+PGNvZGU+b3ZlcnJpZGU8L2NvZGU+IC0gU2hvdWxkIHNldHRpbmdzIGluIHRoaXMgPGVtPkNvbnRleHQ8L2VtPgorICAgICAgb3ZlcnJpZGUgY29ycmVzcG9uZGluZyBzZXR0aW5ncyBpbiB0aGUgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+PworICAgICAgW2ZhbHNlXTwvbGk+CisgIDxsaT48Y29kZT5wYXRoPC9jb2RlPiAtIENvbnRleHQgcGF0aCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIG9yIGFuIGVtcHR5CisgICAgICBzdHJpbmcgZm9yIHRoZSByb290IGFwcGxpY2F0aW9uIG9mIGEgPGVtPkhvc3Q8L2VtPi4gIFtJbmZlcnJlZCBmcm9tCisgICAgICBkaXJlY3Rvcnkgb3IgV0FSIGZpbGUgbmFtZV08L2xpPgorICA8bGk+PGNvZGU+cmVsb2FkYWJsZTwvY29kZT4gLSBTaG91bGQgVG9tY2F0IG1vbml0b3IgY2xhc3NlcyBpbiB0aGUKKyAgICAgIDxjb2RlPi9XRUItSU5GL2NsYXNzZXM8L2NvZGU+IGRpcmVjdG9yeSBmb3IgY2hhbmdlcywgYW5kIHJlbG9hZCB0aGUKKyAgICAgIGFwcGxpY2F0aW9uIGlmIHRoZXkgb2NjdXI/ICBbZmFsc2VdPC9saT4KKyAgPGxpPjxjb2RlPnVzZU5hbWluZzwvY29kZT4gLSBTaG91bGQgVG9tY2F0IHByb3ZpZGUgYSBKTkRJIG5hbWluZyBjb250ZXh0LAorICAgICAgY29udGFpbmluZyBwcmVjb25maWd1cmVkIGVudHJpZXMgYW5kIHJlc291cmNlcywgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICAgIHJlcXVpcmVtZW50cyBvZiB0aGUgSmF2YTIgRW50ZXJwcmlzZSBFZGl0aW9uIHNwZWNpZmljYXRpb24/ICBbdHJ1ZV08L2xpPgorICA8bGk+PGNvZGU+d29ya0RpcjwvY29kZT4gLSBBYnNvbHV0ZSBwYXRobmFtZSBvZiBhIHNjcmF0Y2ggZGlyZWN0b3J5IHRoYXQgaXMKKyAgICAgIHByb3ZpZGVkIHRvIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiAgW0F1dG9tYXRpY2FsbHkgYXNzaWduZWQgcmVsYXRpdmUgdG8KKyAgICAgICRDQVRBTElOQV9IT01FL3dvcmtdPC9saT4KKyAgPC91bD4KKworICA8cD5FYWNoIDxlbT5Db250ZXh0PC9lbT4gaXMgb3duZWQgYnkgYSBwYXJlbnQgPGVtPkhvc3Q8L2VtPiwgYW5kIGlzCisgIGFzc29jaWF0ZWQgd2l0aDo8L3A+CisgIDx1bD4KKyAgPGxpPkFuIG9wdGlvbmFsIDxlbT5BY2Nlc3MgTG9nZ2VyPC9lbT4gdGhhdCBsb2dzIGFsbCByZXF1ZXN0cyBwcm9jZXNzZWQKKyAgICAgIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uLjwvbGk+CisgIDxsaT5aZXJvIG9yIG1vcmUgPGVtPkVudmlyb25tZW50IEVudHJpZXM8L2VtPiByZXByZXNlbnRpbmcgZW52aXJvbm1lbnQKKyAgICAgIGVudHJpZXMgZm9yIHRoZSBKTkRJIG5hbWluZyBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCBhIHdlYgorICAgICAgYXBwbGljYXRpb24uPC9saT4KKyAgPGxpPlplcm8gb3IgbW9yZSA8ZW0+SkRCQyBSZXNvdXJjZXM8L2VtPiByZXByZXNlbnRpbmcgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgcG9vbHMgYXNzb2NpYXRlZCB3aXRoIGEgd2ViIGFwcGxpY2F0aW9uLjwvbGk+CisgIDxsaT5BIDxlbT5Mb2FkZXI8L2VtPiByZXByZXNlbnRpbmcgdGhlIHdlYiBhcHBsaWNhdGlvbiBjbGFzcyBsb2FkZXIgdXNlZAorICAgICAgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24uPC9saT4KKyAgPGxpPkEgPGVtPk1hbmFnZXI8L2VtPiByZXByZXNlbnRpbmcgdGhlIHNlc3Npb24gbWFuYWdlciB1c2VkIGJ5IHRoaXMKKyAgICAgIHdlYiBhcHBsaWNhdGlvbi48L2xpPgorICA8bGk+QW4gb3B0aW9uYWwgPGVtPlJlYWxtPC9lbT4gdXNlZCB0byBwcm92aWRlIGF1dGhlbnRpY2F0aW9uIGFuZCBhY2Nlc3MKKyAgICAgIGNvbnRyb2wgaW5mb3JtYXRpb24gZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLjwvbGk+CisgIDxsaT5aZXJvIG9yIG1vcmUgPGVtPlJlcXVlc3QgRmlsdGVyczwvZW0+IHVzZWQgdG8gbGltaXQgYWNjZXNzIHRvIHRoaXMKKyAgICAgIHdlYiBhcHBsaWNhdGlvbiBiYXNlZCBvbiByZW1vdGUgaG9zdCBuYW1lIG9yIElQIGFkZHJlc3MuPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkRlZmF1bHQgQ29udGV4dCI+CisKKyAgPHA+QSA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4gcmVwcmVzZW50cyBhIHN1YnNldCBvZiB0aGUgY29uZmlndXJhYmxlCisgIHByb3BlcnRpZXMgb2YgYSA8ZW0+Q29udGV4dDwvZW0+LCBhbmQgaXMgdXNlZCB0byBzZXQgZGVmYXVsdHMgZm9yIHRob3NlCisgIHByb3BlcnRpZXMgd2hlbiB3ZWIgYXBwbGljYXRpb25zIGFyZSBhdXRvbWF0aWNhbGx5IGRlcGxveWVkLiAgQSA8ZW0+RGVmYXVsdAorICBDb250ZXh0PC9lbT4gb2JqZWN0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYW4gPGVtPkVuZ2luZTwvZW0+IG9yIGEKKyAgPGVtPkhvc3Q8L2VtPi4gIFRoZSBmb2xsb3dpbmcgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgYXJlIHN1cHBvcnRlZDo8L3A+CisgIDx1bD4KKyAgPGxpPjxjb2RlPmNvb2tpZXM8L2NvZGU+IC0gU2hvdWxkIGJlIHVzZSBjb29raWVzIGZvciBzZXNzaW9uIGlkZW50aWZpZXIKKyAgICAgIGNvbW11bmljYXRpb24/ICBbdHJ1ZV08L2xpPgorICA8bGk+PGNvZGU+Y3Jvc3NDb250ZXh0PC9jb2RlPiAtIFNob3VsZCBjYWxscyB0bworICAgICAgPGNvZGU+U2VydmxldENvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKTwvY29kZT4gcmV0dXJuIHRoZSBhY3R1YWwKKyAgICAgIGNvbnRleHQgcmVzcG9uc2libGUgZm9yIHRoZSBzcGVjaWZpZWQgcGF0aD8gIFtmYWxzZV08L2xpPgorICA8bGk+PGNvZGU+cmVsb2FkYWJsZTwvY29kZT4gLSBTaG91bGQgVG9tY2F0IG1vbml0b3IgY2xhc3NlcyBpbiB0aGUKKyAgICAgIDxjb2RlPi9XRUItSU5GL2NsYXNzZXM8L2NvZGU+IGRpcmVjdG9yeSBmb3IgY2hhbmdlcywgYW5kIHJlbG9hZCB0aGUKKyAgICAgIGFwcGxpY2F0aW9uIGlmIHRoZXkgb2NjdXI/ICBbZmFsc2VdPC9saT4KKyAgPGxpPjxjb2RlPnVzZU5hbWluZzwvY29kZT4gLSBTaG91bGQgVG9tY2F0IHByb3ZpZGUgYSBKTkRJIG5hbWluZyBjb250ZXh0LAorICAgICAgY29udGFpbmluZyBwcmVjb25maWd1cmVkIGVudHJpZXMgYW5kIHJlc291cmNlcywgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICAgIHJlcXVpcmVtZW50cyBvZiB0aGUgSmF2YTIgRW50ZXJwcmlzZSBFZGl0aW9uIHNwZWNpZmljYXRpb24/ICBbdHJ1ZV08L2xpPgorICA8L3VsPgorCisgIDxwPkVhY2ggPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+IGlzIG93bmVkIGJ5IGEgcGFyZW50IDxlbT5FbmdpbmU8L2VtPiBvcgorICA8ZW0+SG9zdDwvZW0+LCBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoOjwvcD4KKyAgPHVsPgorICA8bGk+WmVybyBvciBtb3JlIDxlbT5FbnZpcm9ubWVudCBFbnRyaWVzPC9lbT4gcmVwcmVzZW50aW5nIGVudmlyb25tZW50CisgICAgICBlbnRyaWVzIGZvciB0aGUgSk5ESSBuYW1pbmcgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggYSB3ZWIKKyAgICAgIGFwcGxpY2F0aW9uLjwvbGk+CisgIDxsaT5aZXJvIG9yIG1vcmUgPGVtPkpEQkMgUmVzb3VyY2VzPC9lbT4gcmVwcmVzZW50aW5nIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgIHBvb2xzIGFzc29jaWF0ZWQgd2l0aCBhIHdlYiBhcHBsaWNhdGlvbi48L2xpPgorICA8bGk+QW4gb3B0aW9uYWwgPGVtPkxvYWRlcjwvZW0+IHJlcHJlc2VudGluZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICAgIHByb3BlcnRpZXMgZm9yIHRoZSBMb2FkZXIgY29tcG9uZW50IG9mIGRlcGxveWVkIHdlYiBhcHBsaWNhdGlvbnMuPC9saT4KKyAgPGxpPkFuIG9wdGlvbmFsIDxlbT5NYW5hZ2VyPC9lbT4gcmVwcmVzZW50aW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgICAgcHJvcGVydGllcyBmb3IgdGhlIE1hbmFnZXIgY29tcG9uZW50IGZvIGRlcGxveWVkIHdlYiBhcHBsaWNhdGlvbnMuPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkRlZmF1bHQgRGVwbG95bWVudCBEZXNjcmlwdG9yIj4KKworICA8cD5EZWZhdWx0IHdlYiBhcHBsaWNhdGlvbiBjaGFyYWN0ZXJpc3RpY3MgYXJlIGNvbmZpZ3VyZWQgaW4gYSBzcGVjaWFsCisgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBuYW1lZCA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3dlYi54bWw8L2NvZGU+LiAgVGhpcworICBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgY29uZmlndXJhYmxlIGNvbXBvbmVudHMgdGhhdCBtYXkgYmUgc3RvcmVkIHRoZXJlLjwvcD4KKworICA8cD48c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gQ29tcGxldGUgdGhlIGRlc2NyaXB0aW9uIG9mIGRlZmF1bHQgc2VydmxldHMsCisgIGRlZmF1bHQgbWFwcGluZ3MsIGRlZmF1bHQgTUlNRSB0eXBlcywgYW5kIHNvIG9uLjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkVuZ2luZSI+CisKKyAgPHA+QW4gPGVtPkVuZ2luZTwvZW0+IGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW50aXJlIENhdGFsaW5hCisgIHNlcnZsZXQgY29udGFpbmVyLCBhbmQgcHJvY2Vzc2VzIGFsbCByZXF1ZXN0cyBmb3IgYWxsIG9mIHRoZSBhc3NvY2lhdGVkCisgIHZpcnR1YWwgaG9zdHMgYW5kIHdlYiBhcHBsaWNhdGlvbnMuPC9wPgorCisgIDxwPlRoZSBzdGFuZGFyZCBjb21wb25lbnQgaW1wbGVtZW50aW5nIGFuIDxlbT5FbmdpbmU8L2VtPiBpcworICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRFbmdpbmU8L2NvZGU+LiAgSXQgc3VwcG9ydHMgdGhlCisgIGZvbGxvd2luZyBjb25maWd1cmFibGUgcHJvcGVydGllczo8L3A+CisgIDx1bD4KKyAgPGxpPjxjb2RlPmRlYnVnPC9jb2RlPiAtIERlYnVnZ2luZyBkZXRhaWwgbGV2ZWwuICBbMF08L2xpPgorICA8bGk+PGNvZGU+ZGVmYXVsdEhvc3Q8L2NvZGU+IC0gTmFtZSBvZiB0aGUgPGVtPkhvc3Q8L2VtPiB0byB3aGljaCByZXF1ZXN0cworICAgICAgd2lsbCBiZSBkaXJlY3RlZCBpZiB0aGUgcmVxdWVzdGVkIGhvc3QgaXMgdW5rbm93bi4gIFtsb2NhbGhvc3RdPC9saT4KKyAgPGxpPjxjb2RlPm5hbWU8L2NvZGU+IC0gTG9naWNhbCBuYW1lIG9mIHRoaXMgZW5naW5lLiBbVG9tY2F0IFN0YW5kLUFsb25lXQorICAgICAgPC9saT4KKyAgPC91bD4KKworICA8cD5FYWNoIDxlbT5FbmdpbmU8L2VtPiBpcyBvd25lZCBieSBhIHBhcmVudCA8ZW0+U2VydmljZTwvZW0+LCBhbmQgaXMKKyAgYXNzb2NpYXRlZCB3aXRoOjwvcD4KKyAgPHVsPgorICA8bGk+QW4gb3B0aW9uYWwgPGVtPkFjY2VzcyBMb2dnZXI8L2VtPiB0aGF0IGxvZ3MgYWxsIHJlcXVlc3RzIHByb2Nlc3NlZAorICAgICAgYnkgdGhlIGVudGlyZSBjb250YWluZXIuPC9saT4KKyAgPGxpPkEgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+LCByZXByZXNlbnRpbmcgZGVmYXVsdCBwcm9wZXJ0aWVzIG9mIGEKKyAgICAgIDxlbT5Db250ZXh0PC9lbT4gZm9yIGF1dG9tYXRpY2FsbHkgZGVwbG95ZWQgYXBwbGljYXRpb25zIGZvciBhbGwKKyAgICAgIGFzc29jaWF0ZWQgPGVtPkhvc3RzPC9lbT4gKHVubGVzcyBvdmVycmlkZGVuIGJ5IGEgc3Vib3JkaW5hdGUKKyAgICAgIGNvbXBvbmVudCkuPC9saT4KKyAgPGxpPk9uZSBvciBtb3JlIDxlbT5Ib3N0czwvZW0+IHJlcHJlc2VudGluZyBpbmRpdmlkdWFsIHZpcnR1YWwgaG9zdHMKKyAgICAgIHN1cHBvcnRlZCBieSB0aGlzIGNvbnRhaW5lci48L2xpPgorICA8bGk+QSA8ZW0+UmVhbG08L2VtPiB1c2VkIHRvIHByb3ZpZGUgYXV0aGVudGljYXRpb24gYW5kIGFjY2VzcyBjb250cm9sCisgICAgICBpbmZvcm1hdGlvbiBmb3IgYWxsIHZpcnR1YWwgaG9zdHMgYW5kIHdlYiBhcHBsaWNhdGlvbnMgKHVubGVzcworICAgICAgb3ZlcnJpZGRlbiBieSBhIHN1Ym9yZGluYXRlIGNvbXBvbmVudCkuPC9saT4KKyAgPGxpPlplcm8gb3IgbW9yZSA8ZW0+UmVxdWVzdCBGaWx0ZXJzPC9lbT4gdXNlZCB0byBsaW1pdCBhY2Nlc3MgdG8gdGhlCisgICAgICBlbnRpcmUgY29udGFpbmVyIGJhc2VkIG9uIHJlbW90ZSBob3N0IG5hbWUgb3IgSVAgYWRkcmVzcy48L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRW52aXJvbm1lbnQgRW50cnkiPgorCisgIDxwPkFuIDxlbT5FbnZpcm9ubWVudCBFbnRyeTwvZW0+IGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhCisgIDxjb2RlPiZsdDtlbnYtZW50cnkmZ3Q7PC9jb2RlPiBlbGVtZW50IGZyb20gYSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudAorICBkZXNjcmlwdG9yLiAgSXQgd2lsbCBjYXVzZSB0aGUgY3JlYXRpb24gb2YgYSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZQorICBKTkRJIG5hbWluZyBjb250ZXh0IHByb3ZpZGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIDxlbT5Db250ZXh0PC9lbT4uICBUaGUKKyAgZm9sbG93aW5nIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGFyZSBzdXBwb3J0ZWQ6PC9wPgorICA8dWw+CisgIDxsaT48Y29kZT5kZXNjcmlwdGlvbjwvY29kZT4gLSBEZXNjcmlwdGlvbiBvZiB0aGlzIGVudmlyb25tZW50IGVudHJ5LjwvbGk+CisgIDxsaT48Y29kZT5uYW1lPC9jb2RlPiAtIEVudmlyb25tZW50IGVudHJ5IG5hbWUgKHJlbGF0aXZlIHRvIHRoZQorICAgICAgPGNvZGU+amF2YTpjb21wL2VudjwvY29kZT4gY29udGV4dCk8L2xpPgorICA8bGk+PGNvZGU+dHlwZTwvY29kZT4gLSBFbnZpcm9ubWVudCBlbnRyeSB0eXBlIChtdXN0IGJlIG9uZSBvZiB0aGUgZnVsbHkKKyAgICAgIHF1YWxpZmllZCBKYXZhIGNsYXNzZXMgbGlzdGVkIGluIHRoZSBzZXJ2bGV0IHNwZWMpLjwvbGk+CisgIDxsaT48Y29kZT52YWx1ZTwvY29kZT4gLSBFbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSAobXVzdCBiZSBjb252ZXJ0aWJsZSBmcm9tCisgICAgICBTdHJpbmcgdG8gdGhlIHNwZWNpZmllZCA8Y29kZT50eXBlPC9jb2RlPi48L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iSG9zdCI+CisKKyAgPHA+QSA8ZW0+SG9zdDwvZW0+IGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbmRpdmlkdWFsIHZpcnR1YWwgaG9zdCwKKyAgd2hpY2ggaGFzIGEgdW5pcXVlIHNldCBvZiBhc3NvY2lhdGVkIHdlYiBhcHBsaWNhdGlvbnMuPC9wPgorCisgIDxwPlRoZSBzdGFuZGFyZCBjb21wb25lbnQgaW1wbGVtZW50aW5nIGEgPGVtPkhvc3Q8L2VtPiBpcworICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0PC9jb2RlPi4gIEl0IHN1cHBvcnRzIHRoZQorICBmb2xsb3dpbmcgY29uZmlndXJhYmxlIHByb3BlcnRpZXM6PC9wPgorICA8dWw+CisgIDxsaT48Y29kZT5hbGlhc2VzPC9jb2RlPiAtIFplcm8gb3IgbW9yZSBETlMgbmFtZXMgdGhhdCBhcmUgYWxzbyBhc3NvY2lhdGVkCisgICAgICB3aXRoIHRoaXMgaG9zdCAoZm9yIGV4YW1wbGUsIGEgcGFydGljdWxhciBob3N0IG1pZ2h0IGJlIG5hbWVkCisgICAgICA8Y29kZT53d3cubXljb21wYW55LmNvbTwvY29kZT4gd2l0aCBhbiBhbGlhcyA8Y29kZT5jb21wYW55LmNvbTwvY29kZT4pLgorICAgICAgPC9saT4KKyAgPGxpPjxjb2RlPmFwcEJhc2U8L2NvZGU+IC0gQWJzb2x1dGUgb3IgcmVsYXRpdmUgKHRvICRDQVRBTElOQV9IT01FKSBwYXRoCisgICAgICB0byBhIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHdlYiBhcHBsaWNhdGlvbnMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5CisgICAgICBkZXBsb3llZC48L2xpPgorICA8bGk+PGNvZGU+ZGVidWc8L2NvZGU+IC0gRGVidWdnaW5nIGRldGFpbCBsZXZlbC4gIFswXTwvbGk+CisgIDxsaT48Y29kZT5uYW1lPC9jb2RlPiAtIEROUyBOYW1lIG9mIHRoZSB2aXJ0dWFsIGhvc3QgcmVwcmVzZW50ZWQgYnkgdGhpcworICAgICAgb2JqZWN0LjwvbGk+CisgIDxsaT48Y29kZT51bnBhY2tXQVJzPC9jb2RlPiAtIFNob3VsZCB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSBmaWxlcworICAgICAgZGVwbG95ZWQgYnkgdGhpcyB2aXJ0dWFsIGhvc3QgYmUgdW5wYWNrZWQgZmlyc3Q/ICBbdHJ1ZV08L2xpPgorICA8L3VsPgorCisgIDxwPkVhY2ggPGVtPkhvc3Q8L2VtPiBpcyBvd25lZCBieSBhIHBhcmVudCA8ZW0+RW5naW5lPC9lbT4sIGFuZCBpcworICBhc3NvY2lhdGVkIHdpdGg6PC9wPgorICA8dWw+CisgIDxsaT5BbiBvcHRpb25hbCA8ZW0+QWNjZXNzIExvZ2dlcjwvZW0+IHRoYXQgbG9ncyBhbGwgcmVxdWVzdHMgcHJvY2Vzc2VkCisgICAgICBieSB0aGlzIHZpcnR1YWwgaG9zdC48L2xpPgorICA8bGk+T25lIG9yIG1vcmUgPGVtPkNvbnRleHRzPC9lbT4gcmVwcmVzZW50aW5nIHRoZSB3ZWIgYXBwbGljYXRpb25zCisgICAgICBvcGVyYXRpbmcgb24gdGhpcyA8ZW0+SG9zdDwvZW0+LjwvbGk+CisgIDxsaT5BIDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPiByZXByZXNlbnRpbmcgZGVmYXVsdCA8ZW0+Q29udGV4dDwvZW0+CisgICAgICBwcm9wZXJ0aWVzIGZvciB3ZWIgYXBwbGljYXRpb25zIHRoYXQgYXJlIGF1dG9tYXRpY2FsbHkgZGVwbG95ZWQKKyAgICAgIGJ5IHRoaXMgPGVtPkhvc3Q8L2VtPi48L2xpPgorICA8bGk+QSBvcHRpb25hbCA8ZW0+UmVhbG08L2VtPiB1c2VkIHRvIHByb3ZpZGUgYXV0aGVudGljYXRpb24gYW5kIGFjY2VzcworICAgICAgY29udHJvbCBpbmZvcm1hdGlvbiBmb3IgYWxsIHdlYiBhcHBsaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgIHZpcnR1YWwgaG9zdCAodW5sZXNzIG92ZXJyaWRkZW4gYnkgYSBzdWJvcmRpbmF0ZSBjb21wb25lbnQpLjwvbGk+CisgIDwvdWw+CisKKyAgPHA+PHN0cm9uZz5GSVhNRTwvc3Ryb25nPiAtIFNob3VsZCB3ZSBzdXBwb3J0IGNvbmZpZ3VyYXRpb24gb2YgdGhlCisgIFVzZXIgV2ViIEFwcGxpY2F0aW9ucyBmdW5jdGlvbmFsaXR5PzwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkpEQkMgUmVzb3VyY2UiPgorCisgIDxwPkEgPGVtPkpEQkMgUmVzb3VyY2VzPC9lbT4gcmVwcmVzZW50cyBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gcG9vbCAoaS5lLgorICBhbiBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvY29kZT4gdGhhdCB3aWxsIGJlCisgIGNvbmZpZ3VyZWQgYW5kIG1hZGUgYXZhaWxhYmxlIGluIHRoZSBKTkRJIG5hbWluZyBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aAorICBhIHdlYiBhcHBsaWNhdGlvbi48L3A+CisKKyAgPHA+PHN0cm9uZz5GSVhNRTwvc3Ryb25nPiAtIHByb3BlcnRpZXMgb2YgdGhpcyBhZG1pbmlzdGVyZWQgb2JqZWN0PC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iTG9hZGVyIj4KKworICA8cD5BIDxlbT5Mb2FkZXI8L2VtPiByZXByZXNlbnRzIGEgd2ViIGFwcGxpY2F0aW9uIGNsYXNzIGxvYWRlciB0aGF0IHdpbGwKKyAgYmUgdXRpbGl6ZWQgdG8gcHJvdmlkZSBjbGFzcyBsb2FkaW5nIHNlcnZpY2VzIGZvciBhIHBhcnRpY3VsYXIKKyAgPGVtPkNvbnRleHQ8L2VtPi48L3A+CisKKyAgPHA+VGhlIHN0YW5kYXJkIGNvbXBvbmVudCBpbXBsZW1lbnRpbmcgYSA8ZW0+TG9hZGVyPC9lbT4gaXMKKyAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIuU3RhbmRhcmRMb2FkZXI8L2NvZGU+LiAgSXQgc3VwcG9ydHMKKyAgdGhlIGZvbGxvd2luZyBjb25maWd1cmFibGUgcHJvcGVydGllczo8L3A+CisgIDx1bD4KKyAgPGxpPjxjb2RlPmNoZWNrSW50ZXJ2YWw8L2NvZGU+IC0gTnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiBjaGVja3MgZm9yCisgICAgICBtb2RpZmllZCBjbGFzc2VzLCBpZiBhdXRvbWF0aWMgcmVsb2FkaW5nIGlzIGVuYWJsZWQuICBbMTVdPC9saT4KKyAgPGxpPjxjb2RlPmRlYnVnPC9jb2RlPiAtIERlYnVnZ2luZyBkZXRhaWwgbGV2ZWwuICBbMF08L2xpPgorICA8bGk+PGNvZGU+cmVsb2FkYWJsZTwvY29kZT4gLSBTaG91bGQgdGhpcyBjbGFzcyBsb2FkZXIgY2hlY2sgZm9yIG1vZGlmaWVkCisgICAgICBjbGFzc2VzIGFuZCBpbml0aWF0ZSBhdXRvbWF0aWMgcmVsb2Fkcz8gIFtTZXQgYXV0b21hdGljYWxseSBmcm9tIHRoZQorICAgICAgPGNvZGU+cmVsb2FkYWJsZTwvY29kZT4gcHJvcGVydHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgPGVtPkNvbnRleHQ8L2VtPl0KKyAgICAgIDwvbGk+CisgIDwvdWw+CisKKyAgPHA+RWFjaCA8ZW0+TG9hZGVyPC9lbT4gaXMgb3duZWQgYnkgYSBwYXJlbnQgPGVtPkNvbnRleHQ8L2VtPi48L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJNYW5hZ2VyIj4KKworICA8cD5BIDxlbT5NYW5hZ2VyPC9lbT4gcmVwcmVzZW50cyBhIHNlc3Npb24gbWFuYWdlciB0aGF0IHdpbGwgYmUgYXNzb2NpYXRlZAorICB3aXRoIGEgcGFydGljdWxhciB3ZWIgYXBwbGljYXRpb24uICA8c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gQWRkIHN1cHBvcnQKKyAgZm9yIGFkdmFuY2VkIHNlc3Npb24gbWFuYWdlcnMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgU3RvcmVzLjwvcD4KKworICA8cD5UaGUgc3RhbmRhcmQgY29tcG9uZW50IGltcGxlbWVudGluZyBhIDxlbT5NYW5hZ2VyPC9lbT4gaXMKKyAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlN0YW5kYXJkTWFuYWdlcjwvY29kZT4uICBJdCBzdXBwb3J0cworICB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzOjwvcD4KKyAgPHVsPgorICA8bGk+PGNvZGU+Y2hlY2tJbnRlcnZhbDwvY29kZT4gLSBOdW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIGNoZWNrcyBmb3IKKyAgICAgIGV4cGlyZWQgc2Vzc2lvbnMuICBbNjBdPC9saT4KKyAgPGxpPjxjb2RlPmRlYnVnPC9jb2RlPiAtIERlYnVnZ2luZyBkZXRhaWwgbGV2ZWwuICBbMF08L2xpPgorICA8bGk+PGNvZGU+ZW50cm9weTwvY29kZT4gLSBTdHJpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHVzZWQgdG8gaW5jcmVhc2UKKyAgICAgIHRoZSBlbnRyb3B5IChpbml0aWFsIHJhbmRvbW5lc3MpIG9mIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB1c2VkIHRvCisgICAgICBjcmVhdGUgc2Vzc2lvbiBpZGVudGlmaWVycy4gIFtJbmZlcnJlZCBmcm9tIGVuZ2luZSwgaG9zdCwgYW5kIGNvbnRleHRdCisgICAgICA8L2xpPgorICA8bGk+PGNvZGU+bWF4QWN0aXZlU2Vzc2lvbnM8L2NvZGU+IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucworICAgICAgdGhhdCBhcmUgYWxsb3dlZCwgb3IgLTEgZm9yIG5vIGxpbWl0LiAgWy0xXTwvbGk+CisgIDwvdWw+CisKKyAgPHA+RWFjaCA8ZW0+TWFuYWdlcjwvZW0+IGlzIG93bmVkIGJ5IGEgcGFyZW50IDxlbT5Db250ZXh0PC9lbT4uPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iUmVhbG0iPgorCisgIDxwPkEgPGVtPlJlYWxtPC9lbT4gcmVwcmVzZW50cyBhICJkYXRhYmFzZSIgb2YgaW5mb3JtYXRpb24gYWJvdXQgYXV0aG9yaXplZAorICB1c2VycywgdGhlaXIgcGFzc3dvcmRzLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGVzIGFzc2lnbmVkIHRvIHRoZW0uICBUaGlzIHdpbGwKKyAgYmUgdXNlZCBieSB0aGUgY29udGFpbmVyIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBjb250YWluZXItbWFuYWdlZCBzZWN1cml0eQorICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNlcnZsZXQgU3BlY2lmaWNhdGlvbi4gIFNldmVyYWwgYWx0ZXJuYXRpdmUKKyAgaW1wbGVtZW50YXRpb25zIGFyZSBzdXBwb3J0ZWQuPC9wPgorCisgIDxwPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uTWVtb3J5UmVhbG08L2NvZGU+IGluaXRpYWxpemVzIGl0cyB1c2VyCisgIGluZm9ybWF0aW9uIGZyb20gYSBzaW1wbGUgWE1MIGZpbGUgYXQgc3RhcnR1cCB0aW1lLiAgSWYgY2hhbmdlcyBhcmUgbWFkZQorICB0byB0aGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlLCB0aGUgY29ycmVzcG9uZGluZyB3ZWIgYXBwbGljYXRpb25zIHVzaW5nCisgIGl0IG11c3QgYmUgcmVzdGFydGVkIGZvciB0aGUgY2hhbmdlcyB0byB0YWtlIGVmZmVjdC4gIEl0IHN1cHBvcnRzIHRoZQorICBmb2xsb3dpbmcgY29uZmlndXJhYmxlIHByb3BlcnRpZXM6PC9wPgorICA8dWw+CisgIDxsaT48Y29kZT5kZWJ1ZzwvY29kZT4gLSBEZWJ1Z2dpbmcgZGV0YWlsIGxldmVsLiAgWzBdPC9saT4KKyAgPGxpPjxjb2RlPnBhdGhuYW1lPC9jb2RlPiAtIEFic29sdXRlIG9yIHJlbGF0aXZlICh0byAkQ0FUQUxJTkFfSE9NRSkgcGF0aCB0bworICAgICAgdGhlIFhNTCBmaWxlIGNvbnRhaW5pbmcgb3VyIHVzZXIgaW5mb3JtYXRpb24uICBbY29uZi90b21jYXQtdXNlcnMueG1sXQorICAgICAgPC9saT4KKyAgPC91bD4KKworICA8cD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpEQkNSZWFsbTwvY29kZT4gdXNlcyBhIHJlbGF0aW9uYWwKKyAgZGF0YWJhc2UgKGFjY2Vzc2VkIHZpYSBKREJDIEFQSXMpIHRvIGNvbnRhaW4gdGhlIHVzZXIgaW5mb3JtYXRpb24uICBDaGFuZ2VzCisgIGluIHRoZSBjb250ZW50cyBvZiB0aGlzIGRhdGFiYXNlIHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5OyBob3dldmVyLCB0aGUgcm9sZXMKKyAgYXNzaWduZWQgdG8gYSBwYXJ0aWN1bGFyIHVzZXIgYXJlIGNhbGN1bGF0ZWQgb25seSB3aGVuIHRoZSB1c2VyIGluaXRpYWxseQorICBsb2dzIG9uIChhbmQgbm90IHBlciByZXF1ZXN0KS4gIFRoZSBmb2xsb3dpbmcgY29uZmlndXJhYmxlIHByb3BlcnRpZXMKKyAgYXJlIHN1cHBvcnRlZDo8L3A+CisgIDx1bD4KKyAgPGxpPjxjb2RlPmNvbm5lY3Rpb25OYW1lPC9jb2RlPiAtIERhdGFiYXNlIHVzZXJuYW1lIHRvIHVzZSB3aGVuIGVzdGFibGlzaGluZworICAgICAgYSBKREJDIGNvbm5lY3Rpb24uPC9saT4KKyAgPGxpPjxjb2RlPmNvbm5lY3Rpb25QYXNzd29yZDwvY29kZT4gLSBEYXRhYmFzZSBwYXNzd29yZCB0byB1c2Ugd2hlbgorICAgICAgZXN0YWJsaXNoaW5nIGEgSkRCQyBjb25uZWN0aW9uLjwvbGk+CisgIDxsaT48Y29kZT5jb25uZWN0aW9uVVJMPC9jb2RlPiAtIENvbm5lY3Rpb24gVVJMIHRvIHVzZSB3aGVuIGVzdGFibGlzaGluZworICAgICAgYSBKREJDIGNvbm5lY3Rpb24uPC9saT4KKyAgPGxpPjxjb2RlPmRlYnVnPC9jb2RlPiAtIERlYnVnZ2luZyBkZXRhaWwgbGV2ZWwuICBbMF08L2xpPgorICA8bGk+PGNvZGU+ZGlnZXN0PC9jb2RlPiAtIE5hbWUgb2YgdGhlIDxjb2RlPk1lc3NhZ2VEaWdlc3Q8L2NvZGU+IGFsZ29yaXRobQorICAgICAgdXNlZCB0byBlbmNvZGUgcGFzc3dvcmRzIGluIHRoZSBkYXRhYmFzZSwgb3IgYSB6ZXJvLWxlbmd0aCBzdHJpbmcgZm9yCisgICAgICBubyBlbmNvZGluZy4gIFtaZXJvLWxlbmd0aCBTdHJpbmddPC9saT4KKyAgPGxpPjxjb2RlPmRyaXZlck5hbWU8L2NvZGU+IC0gRnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgSkRCQworICAgICAgZHJpdmVyIHRvIGJlIHV0aWxpemVkLjwvbGk+CisgIDxsaT48Y29kZT5yb2xlTmFtZUNvbDwvY29kZT4gLSBOYW1lIG9mIHRoZSBjb2x1bW4sIGluIHRoZSBVc2VyIFJvbGVzIHRhYmxlLAorICAgICAgd2hpY2ggY29udGFpbnMgdGhlIHJvbGUgbmFtZS48L2xpPgorICA8bGk+PGNvZGU+dXNlckNyZWRDb2w8L2NvZGU+IC0gTmFtZSBvZiB0aGUgY29sdW1uLCBpbiB0aGUgVXNlcnMgdGFibGUsCisgICAgICB3aGljaCBjb250YWlucyB0aGUgcGFzc3dvcmQgKGVuY3J5cHRlZCBvciB1bmVuY3J5cHRlZCkuPC9saT4KKyAgPGxpPjxjb2RlPnVzZXJOYW1lQ29sPC9jb2RlPiAtIE5hbWUgb2YgdGhlIGNvbHVtbiwgaW4gYm90aCB0aGUgVXNlcnMgYW5kCisgICAgICBVc2VyIFJvbGVzIHRhYmxlcywgdGhhdCBjb250YWlucyB0aGUgdXNlcm5hbWUuPC9saT4KKyAgPGxpPjxjb2RlPnVzZXJSb2xlVGFibGU8L2NvZGU+IC0gTmFtZSBvZiB0aGUgVXNlciBSb2xlcyB0YWJsZSwgd2hpY2ggY29udGFpbnMKKyAgICAgIG9uZSByb3cgcGVyIHNlY3VyaXR5IHJvbGUgYXNzaWduZWQgdG8gYSBwYXJ0aWN1bGFyIHVzZXIuICBUaGlzIHRhYmxlIG11c3QKKyAgICAgIGNvbnRhaW4gdGhlIGNvbHVtbnMgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT51c2VyTmFtZUNvbDwvY29kZT4gYW5kCisgICAgICA8Y29kZT5yb2xlTmFtZUNvbDwvY29kZT4gcHJvcGVydGllcy48L2xpPgorICA8bGk+PGNvZGU+dXNlclRhYmxlPC9jb2RlPiAtIE5hbWUgb2YgdGhlIFVzZXJzIHRhYmxlLCB3aGljaCBjb250YWlucyBvbmUgcm93CisgICAgICBwZXIgYXV0aG9yaXplZCB1c2VyLiAgVGhpcyB0YWJsZSBtdXN0IGNvbnRhaW4gdGhlIGNvbHVtbnMgc3BlY2lmaWVkIGJ5CisgICAgICB0aGUgPGNvZGU+dXNlck5hbWVDb2w8L2NvZGU+IGFuZCA8Y29kZT51c2VyQ3JlZENvbDwvY29kZT4gcHJvcGVydGllcy4KKyAgICAgIDwvbGk+CisgIDwvdWw+CisKKyAgPHA+PHN0cm9uZz5GSVhNRTwvc3Ryb25nPiAtIFNob3VsZCB3ZSBwcm92aWRlIG1lY2hhbmlzbXMgdG8gZWRpdCB0aGUgY29udGVudHMKKyAgb2YgYSAidG9tY2F0LXVzZXJzLnhtbCIgZmlsZSB0aHJvdWdoIHRoZSBhZG1pbiBhcHBsaWNhdGlvbnM/PC9wPgorCisgIDxwPkVhY2ggPGVtPlJlYWxtPC9lbT4gaXMgb3duZWQgYnkgYSBwYXJlbnQgPGVtPkVuZ2luZTwvZW0+LCA8ZW0+SG9zdDwvZW0+LAorICBvciA8ZW0+Q29udGV4dDwvZW0+LjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlJlcXVlc3QgRmlsdGVyIj4KKworICA8cD48c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gY29tcGxldGUgdGhpcyBlbnRyeTwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNlcnZlciI+CisKKyAgPHA+PHN0cm9uZz5GSVhNRTwvc3Ryb25nPiAtIGNvbXBsZXRlIHRoaXMgZW50cnk8L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJTZXJ2aWNlIj4KKworICA8cD48c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gY29tcGxldGUgdGhpcyBlbnRyeTwvcD4KKworPC9zZWN0aW9uPgorCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9mcy1hZG1pbi1vcGVycy54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9mcy1hZG1pbi1vcGVycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU4YmMyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL2ZzLWFkbWluLW9wZXJzLnhtbApAQCAtMCwwICsxLDMyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImZzLWFkbWluLW9wZXJzLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8dGl0bGU+QWRtaW5pc3RyYXRpdmUgQXBwcyAtIFN1cHBvcnRlZCBPcGVyYXRpb25zPC90aXRsZT4KKyAgICA8cmV2aXNpb24+JElkJDwvcmV2aXNpb24+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iU3VwcG9ydGVkIE9wZXJhdGlvbnMgT3ZlcnZpZXciPgorCis8cD5UaGlzIGRvY3VtZW50IGRlZmluZXMgdGhlIDxlbT5TdXBwb3J0ZWQgT3BlcmF0aW9uczwvZW0+IHRoYXQgbWF5CitiZSBwZXJmb3JtZWQgYWdhaW5zdCB0aGUgPGEgaHJlZj0iZnMtYWRtaW4tb2JqZWN0cy5odG1sIj5BZG1pbmlzdGVyZWQKK09iamVjdHM8L2E+IHRoYXQgYXJlIHN1cHBvcnRlZCBieSBUb21jYXQgNSBhZG1pbmlzdHJhdGl2ZSBhcHBsaWNhdGlvbnMuCitOb3QgYWxsIG9wZXJhdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGJlIGF2YWlsYWJsZSB0aHJvdWdoIGV2ZXJ5IGFkbWluaXN0cmF0aXZlCithcHBsaWNhdGlvbiB0aGF0IGlzIGltcGxlbWVudGVkLiAgSG93ZXZlciwgaWYgYSBnaXZlbiBvcGVyYXRpb24gaXMgYXZhaWxhYmxlLAoraXQgc2hvdWxkIG9wZXJhdGUgY29uc2lzdGVudGx5IHdpdGggdGhlIGRlc2NyaXB0aW9ucyBmb3VuZCBoZXJlLjwvcD4KKworPHA+U3VwcG9ydGVkIE9wZXJhdGlvbnMgYXJlIGRlc2NyaWJlZCBmb3IgdGhlIGZvbGxvd2luZyBBZG1pbmlzdGVyZWQKK09iamVjdHM6PC9wPgorPHVsPgorPGxpPjxhIGhyZWY9IiNBY2Nlc3MgTG9nZ2VyIj5BY2Nlc3MgTG9nZ2VyPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI0Nvbm5lY3RvciI+Q29ubmVjdG9yPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI0NvbnRleHQiPkNvbnRleHQ8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjRGVmYXVsdCBDb250ZXh0Ij5EZWZhdWx0IENvbnRleHQ8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjRW5naW5lIj5FbmdpbmU8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjRW52aXJvbm1lbnQgRW50cnkiPkVudmlyb25tZW50IEVudHJ5PC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI0hvc3QiPkhvc3Q8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjSkRCQyBSZXNvdXJjZSI+SkRCQyBSZXNvdXJjZTwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNMb2FkZXIiPkxvYWRlcjwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNNYW5hZ2VyIj5NYW5hZ2VyPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI1JlYWxtIj5SZWFsbTwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNSZXF1ZXN0IEZpbHRlciI+UmVxdWVzdCBGaWx0ZXI8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjU2VydmVyIj5TZXJ2ZXI8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjU2VydmljZSI+U2VydmljZTwvYT48L2xpPgorPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkFjY2VzcyBMb2dnZXIiPgorCisgIDxwPkZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGEgcGFydGljdWxhciA8ZW0+QWNjZXNzIExvZ2dlcjwvZW0+LCBpdCBzaGFsbAorICBiZSBwb3NzaWJsZSB0byBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgYWRtaW5pc3RyYXRpdmUgb3BlcmF0aW9uczo8L3A+CisgIDx1bD4KKyAgPGxpPk5hdmlnYXRlIHRvIHRoZSBvd25pbmcgPGVtPkVuZ2luZTwvZW0+LCA8ZW0+SG9zdDwvZW0+LCBvcgorICAgICAgPGVtPkNvbnRleHQ8L2VtPi48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhpcyBvYmplY3QuPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkNvbm5lY3RvciI+CisKKyAgPHA+RnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgYSBwYXJ0aWN1bGFyIDxlbT5Db25uZWN0b3I8L2VtPiwgaXQgc2hhbGwgYmUKKyAgcG9zc2libGUgdG8gcGVyZm9ybSB0aGUgZm9sbG93aW5nIGFkbWluaXN0cmF0aXZlIG9wZXJhdGlvbnM6PC9wPgorICA8dWw+CisgIDxsaT5OYXZpZ2F0ZSB0byB0aGUgb3duaW5nIDxlbT5TZXJ2aWNlPC9lbT4uPC9saT4KKyAgPGxpPkVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoaXMgb2JqZWN0LjwvbGk+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJDb250ZXh0Ij4KKworICA8cD5Gcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIHBhcnRpY3VsYXIgPGVtPkNvbnRleHQ8L2VtPiwgaXQgc2hhbGwgYmUKKyAgcG9zc2libGUgdG8gcGVyZm9ybSB0aGUgZm9sbG93aW5nIGFkbWluaXN0cmF0aXZlIG9wZXJhdGlvbnM6PC9wPgorICA8dWw+CisgIDxsaT5OYXZpZ2F0ZSB0byB0aGUgb3duaW5nIDxlbT5Ib3N0PC9lbT4uPC9saT4KKyAgPGxpPkVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5DcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG5ldyA8ZW0+QWNjZXNzIExvZ2dlcjwvZW0+IGFzc29jaWF0ZWQKKyAgICAgIHdpdGggdGhpcyBvYmplY3QuPC9saT4KKyAgPGxpPkVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoZSBhc3NvY2lhdGVkIDxlbT5BY2Nlc3MKKyAgICAgIExvZ2dlcjwvZW0+LjwvbGk+CisgIDxsaT5SZW1vdmUgdGhlIGFzc29jaWF0ZWQgPGVtPkFjY2VzcyBMb2dnZXI8L2VtPi48L2xpPgorICA8bGk+Q3JlYXRlIGFuZCBjb25maWd1cmUgYSBuZXcgPGVtPkVudmlyb25tZW50IEVudHJ5PC9lbT4gYXNzb2NpYXRlZAorICAgICAgd2l0aCB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+U2VsZWN0IGFuZCBlZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiBhbiBhc3NvY2lhdGVkCisgICAgICA8ZW0+RW52aXJvbm1lbnQgRW50cnk8L2VtPi48L2xpPgorICA8bGk+UmVtb3ZlIGFuIGFzc29jaWF0ZWQgPGVtPkVudmlyb25tZW50IEVudHJ5PC9lbT4uPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5KREJDIFJlc291cmNlPC9lbT4gYXNzb2NpYXRlZAorICAgICAgd2l0aCB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+U2VsZWN0IGFuZCBlZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiBhbiBhc3NvY2lhdGVkCisgICAgICA8ZW0+SkRCQyBSZXNvdXJjZTwvZW0+LjwvbGk+CisgIDxsaT5SZW1vdmUgYW4gYXNzb2NpYXRlZCA8ZW0+SkRCQyBSZXNvdXJjZTwvZW0+LjwvbGk+CisgIDxsaT5DcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG5ldyA8ZW0+TG9hZGVyPC9lbT4gYXNzb2NpYXRlZCB3aXRoCisgICAgICB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhlIGFzc29jaWF0ZWQgPGVtPkxvYWRlcjwvZW0+LjwvbGk+CisgIDxsaT5SZW1vdmUgdGhlIGFzc29jaWF0ZWQgPGVtPkxvYWRlcjwvZW0+LjwvbGk+CisgIDxsaT5DcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG5ldyA8ZW0+TWFuYWdlcjwvZW0+IGFzc29jaWF0ZWQgd2l0aAorICAgICAgdGhpcyBvYmplY3QuPC9saT4KKyAgPGxpPkVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoZSBhc3NvY2lhdGVkIDxlbT5NYW5hZ2VyPC9lbT4uPC9saT4KKyAgPGxpPlJlbW92ZSB0aGUgYXNzb2NpYXRlZCA8ZW0+TWFuYWdlcjwvZW0+LjwvbGk+CisgIDxsaT5DcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG5ldyA8ZW0+UmVhbG08L2VtPiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGUgYXNzb2NpYXRlZCA8ZW0+UmVhbG08L2VtPi48L2xpPgorICA8bGk+UmVtb3ZlIHRoZSBhc3NvY2lhdGVkIDxlbT5SZWFsbTwvZW0+LjwvbGk+CisgIDxsaT5DcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG5ldyA8ZW0+UmVxdWVzdCBGaWx0ZXI8L2VtPiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5TZWxlY3QgYW5kIGVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuCisgICAgICBhc3NvY2lhdGVkIDxlbT5SZXF1ZXN0IEZpbHRlcjwvZW0+PC9saT4KKyAgPGxpPlJlbW92ZSBhbiBhc3NvY2lhdGVkIDxlbT5SZXF1ZXN0IEZpbHRlcjwvZW0+LjwvbGk+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJEZWZhdWx0IENvbnRleHQiPgorCisgIDxwPkZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGEgcGFydGljdWxhciA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4sIGl0IHNoYWxsCisgIGJlIHBvc3NpYmxlIHRvIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBhZG1pbmlzdHJhdGl2ZSBvcGVyYXRpb25zOjwvcD4KKyAgPHVsPgorICA8bGk+TmF2aWdhdGUgdG8gdGhlIG93bmluZyA8ZW0+RW5naW5lPC9lbT4gb3IgPGVtPkhvc3Q8L2VtPi48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhpcyBvYmplY3QuPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5FbnZpcm9ubWVudCBFbnRyeTwvZW0+IGFzc29jaWF0ZWQKKyAgICAgIHdpdGggdGhpcyBvYmplY3QuPC9saT4KKyAgPGxpPlNlbGVjdCBhbmQgZWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgYW4gYXNzb2NpYXRlZAorICAgICAgPGVtPkVudmlyb25tZW50IEVudHJ5PC9lbT4uPC9saT4KKyAgPGxpPlJlbW92ZSBhbiBhc3NvY2lhdGVkIDxlbT5FbnZpcm9ubWVudCBFbnRyeTwvZW0+LjwvbGk+CisgIDxsaT5DcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG5ldyA8ZW0+SkRCQyBSZXNvdXJjZTwvZW0+IGFzc29jaWF0ZWQKKyAgICAgIHdpdGggdGhpcyBvYmplY3QuPC9saT4KKyAgPGxpPlNlbGVjdCBhbmQgZWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgYW4gYXNzb2NpYXRlZAorICAgICAgPGVtPkpEQkMgUmVzb3VyY2U8L2VtPi48L2xpPgorICA8bGk+UmVtb3ZlIGFuIGFzc29jaWF0ZWQgPGVtPkpEQkMgUmVzb3VyY2U8L2VtPi48L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRW5naW5lIj4KKworICA8cD5Gcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIHBhcnRpY3VsYXIgPGVtPkVuZ2luZTwvZW0+LCBpdCBzaGFsbCBiZQorICBwb3NzaWJsZSB0byBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgYWRtaW5pc3RyYXRpdmUgb3BlcmF0aW9uczo8L3A+CisgIDx1bD4KKyAgPGxpPk5hdmlnYXRlIHRvIHRoZSBvd25pbmcgPGVtPlNlcnZpY2U8L2VtPi48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhpcyBvYmplY3QuPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5BY2Nlc3MgTG9nZ2VyPC9lbT4gYXNzb2NpYXRlZAorICAgICAgd2l0aCB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhlIGFzc29jaWF0ZWQgPGVtPkFjY2VzcworICAgICAgTG9nZ2VyPC9lbT4uPC9saT4KKyAgPGxpPlJlbW92ZSB0aGUgYXNzb2NpYXRlZCA8ZW0+QWNjZXNzIExvZ2dlcjwvZW0+LjwvbGk+CisgIDxsaT5DcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG5ldyA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4gYXNzb2NpYXRlZAorICAgICAgd2l0aCB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhlIGFzc29jaWF0ZWQgPGVtPkRlZmF1bHQKKyAgICAgIENvbnRleHQ8L2VtPi48L2xpPgorICA8bGk+UmVtb3ZlIHRoZSBhc3NvY2lhdGVkIDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPi48L2xpPgorICA8bGk+Q3JlYXRlIGFuZCBjb25maWd1cmUgYSBuZXcgPGVtPkhvc3Q8L2VtPiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5TZWxlY3QgYW5kIGVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuCisgICAgICBhc3NvY2lhdGVkIDxlbT5Ib3N0PC9lbT4uPC9saT4KKyAgPGxpPlJlbW92ZSBhbiBhc3NvY2lhdGVkIDxlbT5Ib3N0PC9lbT4uPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5SZWFsbTwvZW0+IGFzc29jaWF0ZWQgd2l0aAorICAgICAgdGhpcyBvYmplY3QuPC9saT4KKyAgPGxpPkVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoZSBhc3NvY2lhdGVkIDxlbT5SZWFsbTwvZW0+LjwvbGk+CisgIDxsaT5SZW1vdmUgdGhlIGFzc29jaWF0ZWQgPGVtPlJlYWxtPC9lbT4uPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5SZXF1ZXN0IEZpbHRlcjwvZW0+IGFzc29jaWF0ZWQgd2l0aAorICAgICAgdGhpcyBvYmplY3QuPC9saT4KKyAgPGxpPlNlbGVjdCBhbmQgZWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgYW4KKyAgICAgIGFzc29jaWF0ZWQgPGVtPlJlcXVlc3QgRmlsdGVyPC9lbT48L2xpPgorICA8bGk+UmVtb3ZlIGFuIGFzc29jaWF0ZWQgPGVtPlJlcXVlc3QgRmlsdGVyPC9lbT4uPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkVudmlyb25tZW50IEVudHJ5Ij4KKworICA8cD5Gcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIHBhcnRpY3VsYXIgPGVtPkVudmlyb25tZW50IEVudHJ5PC9lbT4sIGl0IHNoYWxsCisgIGJlIHBvc3NpYmxlIHRvIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBhZG1pbmlzdHJhdGl2ZSBvcGVyYXRpb25zOjwvcD4KKyAgPHVsPgorICA8bGk+TmF2aWdhdGUgdG8gdGhlIG93bmluZyA8ZW0+Q29udGV4dDwvZW0+IG9yIDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPi48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhpcyBvYmplY3QuPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ikhvc3QiPgorCisgIDxwPkZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGEgcGFydGljdWxhciA8ZW0+SG9zdDwvZW0+LCBpdCBzaGFsbCBiZQorICBwb3NzaWJsZSB0byBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgYWRtaW5pc3RyYXRpdmUgb3BlcmF0aW9uczo8L3A+CisgIDx1bD4KKyAgPGxpPk5hdmlnYXRlIHRvIHRoZSBvd25pbmcgPGVtPkVuZ2luZTwvZW0+LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+Q3JlYXRlIGFuZCBjb25maWd1cmUgYSBuZXcgPGVtPkFjY2VzcyBMb2dnZXI8L2VtPiBhc3NvY2lhdGVkCisgICAgICB3aXRoIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGUgYXNzb2NpYXRlZCA8ZW0+QWNjZXNzCisgICAgICBMb2dnZXI8L2VtPi48L2xpPgorICA8bGk+UmVtb3ZlIHRoZSBhc3NvY2lhdGVkIDxlbT5BY2Nlc3MgTG9nZ2VyPC9lbT4uPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5Db250ZXh0PC9lbT4gYXNzb2NpYXRlZCB3aXRoCisgICAgICB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+U2VsZWN0IGFuZCBlZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiBhbiBhc3NvY2lhdGVkCisgICAgICA8ZW0+Q29udGV4dDwvZW0+LjwvbGk+CisgIDxsaT5SZW1vdmUgYW4gYXNzb2NpYXRlZCA8ZW0+Q29udGV4dDwvZW0+LjwvbGk+CisgIDxsaT5DcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG5ldyA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4gYXNzb2NpYXRlZAorICAgICAgd2l0aCB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhlIGFzc29jaWF0ZWQgPGVtPkRlZmF1bHQKKyAgICAgIENvbnRleHQ8L2VtPi48L2xpPgorICA8bGk+UmVtb3ZlIHRoZSBhc3NvY2lhdGVkIDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPi48L2xpPgorICA8bGk+Q3JlYXRlIGFuZCBjb25maWd1cmUgYSBuZXcgPGVtPlJlYWxtPC9lbT4gYXNzb2NpYXRlZCB3aXRoCisgICAgICB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhlIGFzc29jaWF0ZWQgPGVtPlJlYWxtPC9lbT4uPC9saT4KKyAgPGxpPlJlbW92ZSB0aGUgYXNzb2NpYXRlZCA8ZW0+UmVhbG08L2VtPi48L2xpPgorICA8bGk+Q3JlYXRlIGFuZCBjb25maWd1cmUgYSBuZXcgPGVtPlJlcXVlc3QgRmlsdGVyPC9lbT4gYXNzb2NpYXRlZCB3aXRoCisgICAgICB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+U2VsZWN0IGFuZCBlZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiBhbgorICAgICAgYXNzb2NpYXRlZCA8ZW0+UmVxdWVzdCBGaWx0ZXI8L2VtPjwvbGk+CisgIDxsaT5SZW1vdmUgYW4gYXNzb2NpYXRlZCA8ZW0+UmVxdWVzdCBGaWx0ZXI8L2VtPi48L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iSkRCQyBSZXNvdXJjZSI+CisKKyAgPHA+RnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgYSBwYXJ0aWN1bGFyIDxlbT5KREJDIFJlc291cmNlPC9lbT4sIGl0IHNoYWxsCisgIGJlIHBvc3NpYmxlIHRvIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBhZG1pbmlzdHJhdGl2ZSBvcGVyYXRpb25zOjwvcD4KKyAgPHVsPgorICA8bGk+TmF2aWdhdGUgdG8gdGhlIG93bmluZyA8ZW0+Q29udGV4dDwvZW0+IG9yIDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPi48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhpcyBvYmplY3QuPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkxvYWRlciI+CisKKyAgPHA+RnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgYSBwYXJ0aWN1bGFyIDxlbT5Mb2FkZXI8L2VtPiwgaXQgc2hhbGwKKyAgYmUgcG9zc2libGUgdG8gcGVyZm9ybSB0aGUgZm9sbG93aW5nIGFkbWluaXN0cmF0aXZlIG9wZXJhdGlvbnM6PC9wPgorICA8dWw+CisgIDxsaT5OYXZpZ2F0ZSB0byB0aGUgb3duaW5nIDxlbT5Db250ZXh0PC9lbT4uPC9saT4KKyAgPGxpPkVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoaXMgb2JqZWN0LjwvbGk+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJNYW5hZ2VyIj4KKworICA8cD5Gcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIHBhcnRpY3VsYXIgPGVtPk1hbmFnZXI8L2VtPiwgaXQgc2hhbGwKKyAgYmUgcG9zc2libGUgdG8gcGVyZm9ybSB0aGUgZm9sbG93aW5nIGFkbWluaXN0cmF0aXZlIG9wZXJhdGlvbnM6PC9wPgorICA8dWw+CisgIDxsaT5OYXZpZ2F0ZSB0byB0aGUgb3duaW5nIDxlbT5Db250ZXh0PC9lbT4uPC9saT4KKyAgPGxpPkVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoaXMgb2JqZWN0LjwvbGk+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJSZWFsbSI+CisKKyAgPHA+RnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgYSBwYXJ0aWN1bGFyIDxlbT5SZWFsbTwvZW0+LCBpdCBzaGFsbAorICBiZSBwb3NzaWJsZSB0byBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgYWRtaW5pc3RyYXRpdmUgb3BlcmF0aW9uczo8L3A+CisgIDx1bD4KKyAgPGxpPk5hdmlnYXRlIHRvIHRoZSBvd25pbmcgPGVtPkVuZ2luZTwvZW0+LCA8ZW0+SG9zdDwvZW0+LCBvcgorICAgICAgPGVtPkNvbnRleHQ8L2VtPi48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhpcyBvYmplY3QuPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlJlcXVlc3QgRmlsdGVyIj4KKworICA8cD5Gcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIHBhcnRpY3VsYXIgPGVtPlJlcXVlc3QgRmlsdGVyPC9lbT4sIGl0IHNoYWxsCisgIGJlIHBvc3NpYmxlIHRvIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBhZG1pbmlzdHJhdGl2ZSBvcGVyYXRpb25zOjwvcD4KKyAgPHVsPgorICA8bGk+TmF2aWdhdGUgdG8gdGhlIG93bmluZyA8ZW0+RW5naW5lPC9lbT4sIDxlbT5Ib3N0PC9lbT4sIG9yCisgICAgICA8ZW0+Q29udGV4dDwvZW0+LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdC48L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iU2VydmVyIj4KKworICA8cD5Gcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgb3ZlcmFsbCA8ZW0+U2VydmVyPC9lbT4sIGl0IHNoYWxsIGJlCisgIHBvc3NpYmxlIHRvIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBhZG1pbmlzdHJhdGl2ZSBvcGVyYXRpb25zOjwvcD4KKyAgPHVsPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhpcyBvYmplY3QuPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5TZXJ2aWNlPC9lbT4gYXNzb2NpYXRlZCB3aXRoCisgICAgICB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+U2VsZWN0IGFuZCBlZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiBhbiBhc3NvY2lhdGVkCisgICAgICA8ZW0+U2VydmljZTwvZW0+LjwvbGk+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJTZXJ2aWNlIj4KKworICA8cD5Gcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIHBhcnRpY3VsYXIgPGVtPlNlcnZpY2U8L2VtPiwgaXQgc2hhbGwgYmUKKyAgcG9zc2libGUgdG8gcGVyZm9ybSB0aGUgZm9sbG93aW5nIGFkbWluaXN0cmF0aXZlIG9wZXJhdGlvbnM6PC9wPgorICA8dWw+CisgIDxsaT5OYXZpZ2F0ZSB0byB0aGUgb3duaW5nIDxlbT5TZXJ2ZXI8L2VtPi48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhpcyBvYmplY3QuPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5Db25uZWN0b3I8L2VtPiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5TZWxlY3QgYW5kIGVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuIGFzc29jaWF0ZWQKKyAgICAgIDxlbT5Db25uZWN0b3I8L2VtPi48L2xpPgorICA8bGk+UmVtb3ZlIGFuIGFzc29jaWF0ZWQgPGVtPkNvbm5lY3RvcjwvZW0+LjwvbGk+CisgIDxsaT5DcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG5ldyA8ZW0+RW5naW5lPC9lbT4gYXNzb2NpYXRlZCB3aXRoCisgICAgICB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhlIGFzc29jaWF0ZWQgPGVtPkVuZ2luZTwvZW0+LjwvbGk+CisgIDxsaT5SZW1vdmUgdGhlIGFzc29jaWF0ZWQgPGVtPkVuZ2luZTwvZW0+LjwvbGk+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9mcy1kZWZhdWx0LnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL2ZzLWRlZmF1bHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZDYxNjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9mcy1kZWZhdWx0LnhtbApAQCAtMCwwICsxLDI1MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImZzLWRlZmF1bHQuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgIDx0aXRsZT5EZWZhdWx0IFNlcnZsZXQ8L3RpdGxlPgorICAgIDxyZXZpc2lvbj4kSWQkPC9yZXZpc2lvbj4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgICAgPHA+VGhlIHB1cnBvc2Ugb2YgdGhlIDxzdHJvbmc+RGVmYXVsdCBTZXJ2bGV0PC9zdHJvbmc+IGlzIHRvIHNlcnZlCisgICAgc3RhdGljIHJlc291cmNlcyBvZiBhIHdlYiBhcHBsaWNhdGlvbiBpbiByZXNwb25zZSB0byBjbGllbnQgcmVxdWVzdHMuCisgICAgQXMgdGhlIG5hbWUgaW1wbGllcywgaXQgaXMgZ2VuZXJhbGx5IGNvbmZpZ3VyZWQgYXMgdGhlICJkZWZhdWx0IgorICAgIHNlcnZsZXQgZm9yIGEgd2ViIGFwcGxpY2F0aW9uLCBieSBiZWluZyBtYXBwZWQgdG8gYSBVUkwgcGF0dGVybiAiLyIuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkV4dGVybmFsIFNwZWNpZmljYXRpb25zIj4KKworICAgIDxwPlRoZSBmb2xsb3dpbmcgZXh0ZXJuYWwgc3BlY2lmaWNhdGlvbnMgaGF2ZSBwcm92aXNpb25zIHdoaWNoCisgICAgcGFydGlhbGx5IGRlZmluZSB0aGUgY29ycmVjdCBiZWhhdmlvciBvZiB0aGUgZGVmYXVsdCBzZXJ2bGV0OjwvcD4KKyAgICA8dWw+CisgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldC9kb3dubG9hZC5odG1sIj4KKyAgICAgICAgU2VydmxldCBTcGVjaWZpY2F0aW9uPC9hPiAoVmVyc2lvbiAyLjMgUEZEMik8L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmMyMDQ2LnR4dCI+TXVsdGlwdXJwb3NlCisgICAgICAgIEludGVybmV0IE1haWwgRXh0ZW5zaW9ucyAoTUlNRSkgUGFydCBUd286IE1lZGlhIFR5cGVzPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzI2MTYudHh0Ij5IeXBlcnRleHQKKyAgICAgICAgVHJhbnNmZXIgUHJvdG9jb2wgLS0gSFRUUC8xLjE8L2E+PC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkltcGxlbWVudGF0aW9uIFJlcXVpcmVtZW50cyI+CisKKyAgICA8cD5UaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbmFsaXR5IHNoYWxsIGNvbmZvcm0gdG8gdGhlCisgICAgZm9sbG93aW5nIHJlcXVpcmVtZW50czo8L3A+CisgICAgPHVsPgorICAgIDxsaT5NdXN0IGJlIGltcGxlbWVudGVkIGFzIGEgc2VydmxldC48L2xpPgorICAgIDxsaT5NdXN0IHN1cHBvcnQgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMgZm9yIGRlYnVnZ2luZyBkZXRhaWwgbGV2ZWwsCisgICAgICAgIGlucHV0IGJ1ZmZlciBzaXplLCBvdXRwdXQgYnVmZmVyIHNpemUsIHdoZXRoZXIgb3Igbm90IHRvIHByb2R1Y2UKKyAgICAgICAgZGlyZWN0b3J5IGxpc3RpbmdzIHdoZW4gbm8gd2VsY29tZSBmaWxlIGlzIHByZXNlbnQsIGFuZCB3aGV0aGVyIG9yIG5vdAorICAgICAgICBtb2RpZmljYXRpb25zIGFyZSBzdXBwb3J0ZWQgdmlhIERFTEVURSBhbmQgUFVULjwvbGk+CisgICAgPGxpPkxvZyBkZWJ1Z2dpbmcgYW5kIG9wZXJhdGlvbmFsIG1lc3NhZ2VzIChzdWl0YWJseSBpbnRlcm5hdGlvbmFsaXplZCkKKyAgICAgICAgdmlhIHRoZSA8Y29kZT5nZXRTZXJ2bGV0Q29udGV4dCgpLmxvZygpPC9jb2RlPiBtZXRob2QuPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRGVwZW5kZW5jaWVzIj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkVudmlyb25tZW50YWwgRGVwZW5kZW5jaWVzIj4KKworICAgIDxwPlRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnRhbCBkZXBlbmRlbmNpZXMgbXVzdCBiZSBtZXQgaW4gb3JkZXIgZm9yCisgICAgdGhlIGRlZmF1bHQgc2VydmxldCB0byBvcGVyYXRlIGNvcnJlY3RseTo8L3A+CisgICAgPHVsPgorICAgIDxsaT5UaGUgZGVmYXVsdCBzZXJ2bGV0IG11c3QgYmUgcmVnaXN0ZXJlZCBpbiB0aGUgYXBwbGljYXRpb24gZGVwbG95bWVudAorICAgICAgICBkZXNjcmlwdG9yIChvciB0aGUgZGVmYXVsdCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaW4gZmlsZQorICAgICAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3dlYi54bWw8L2NvZGU+KSB1c2luZyBhICJkZWZhdWx0IHNlcnZsZXQiCisgICAgICAgIHNlcnZsZXQgbWFwcGluZywgc2lnbmlmaWVkIGJ5IFVSTCBwYXR0ZXJuICIvIi48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ29udGFpbmVyIERlcGVuZGVuY2llcyI+CisKKyAgICA8cD5Db3JyZWN0IG9wZXJhdGlvbiBvZiB0aGUgZGVmYXVsdCBzZXJ2bGV0IGRlcGVuZHMgb24gdGhlIGZvbGxvd2luZworICAgIHNwZWNpZmljIGZlYXR1cmVzIG9mIHRoZSBzdXJyb3VuZGluZyBjb250YWluZXI6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+VGhlIGNvbnRhaW5lciBzaGFsbCBwcm92aWRlIGEgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB0aGF0CisgICAgICAgIGxpc3RzIHRoZSB3ZWxjb21lIGZpbGUgbmFtZXMgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCBmb3IgdGhpcworICAgICAgICB3ZWIgYXBwbGljYXRpb24uPC9saT4KKyAgICA8bGk+VGhlIGNvbnRhaW5lciBzaGFsbCBwcm92aWRlIGEgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB0aGF0CisgICAgICAgIGNvbnRhaW5zIGEgPGNvZGU+amF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0PC9jb2RlPgorICAgICAgICBpbXBsZW1lbnRhdGlvbiByZXByZXNlbnRpbmcgdGhlIHN0YXRpYyByZXNvdXJjZXMgb2YgdGhpcworICAgICAgICB3ZWIgYXBwbGljYXRpb24uPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRnVuY3Rpb25hbGl0eSI+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJJbml0aWFsaXphdGlvbiBGdW5jdGlvbmFsaXR5Ij4KKworICAgIDxwPlRoZSBmb2xsb3dpbmcgcHJvY2Vzc2luZyBtdXN0IGJlIHBlcmZvcm1lZCB3aGVuIHRoZSA8Y29kZT5pbml0KCk8L2NvZGU+CisgICAgbWV0aG9kIG9mIHRoZSBpbnZva2VyIHNlcnZsZXQgaXMgY2FsbGVkOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPlByb2Nlc3MgYW5kIHNhbml0eSBjaGVjayBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlBlci1SZXF1ZXN0IEZ1bmN0aW9uYWxpdHkiPgorCisKKyAgICA8cD5Gb3IgYWxsIEhUVFAgcmVxdWVzdCBtZXRob2RzLCB0aGUgcmVzb3VyY2UgcGF0aCBpcyBkZXRlcm1pbmVkIGZyb20KKyAgICB0aGUgcGF0aCBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byB0aGlzIHJlcXVlc3QsIGVpdGhlciBhcyByZXF1ZXN0IGF0dHJpYnV0ZQorICAgIDxjb2RlPmphdmF4LnNlcnZsZXQuaW5jbHVkZS5wYXRoX2luZm88L2NvZGU+IChmb3IgYSByZXF1ZXN0IGRpc3BhdGNoZXIKKyAgICBhY2Nlc3MgdG8gYSBzdGF0aWMgcmVzb3VyY2UpIG9yIGJ5IGNhbGxpbmcKKyAgICA8Y29kZT5yZXF1ZXN0LmdldFBhdGhJbmZvKCk8L2NvZGU+IGRpcmVjdGx5LjwvcD4KKworICAgIDxwPk9uIGVhY2ggSFRUUCBERUxFVEUgcmVxdWVzdCBwcm9jZXNzZWQgYnkgdGhpcyBzZXJ2bGV0LCB0aGUgZm9sbG93aW5nCisgICAgcHJvY2Vzc2luZyBzaGFsbCBiZSBwZXJmb3JtZWQ6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+SWYgbW9kaWZpY2F0aW9ucyB0byB0aGUgc3RhdGljIHJlc291cmNlcyBhcmUgbm90IGFsbG93ZWQgKHNldCBieSBhCisgICAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyKSwgcmV0dXJuIEhUVFAgc3RhdHVzIDQwMyAoZm9yYmlkZGVuKS48L2xpPgorICAgIDxsaT5JZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gZGVsZXRlIGEgcmVzb3VyY2UgZnJvbSA8Y29kZT4vTUVUQS1JTkY8L2NvZGU+CisgICAgICAgIG9yIDxjb2RlPi9XRUItSU5GPC9jb2RlPiwgcmV0dXJuIEhUVFAgc3RhdHVzIDQwMyAoZm9yYmlkZGVuKS48L2xpPgorICAgIDxsaT5JZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGRvZXMgbm90IGV4aXN0LCByZXR1cm4gSFRUUCBzdGF0dXMgNDA0CisgICAgICAgIChub3QgZm91bmQpPC9saT4KKyAgICA8bGk+VW5iaW5kIHRoZSByZXNvdXJjZSBmcm9tIHRoZSBkaXJlY3RvcnkgY29udGV4dCBjb250YWluaW5nIHRoZQorICAgICAgICBzdGF0aWMgcmVzb3VyY2VzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gIElmIHN1Y2Nlc3NmdWwsIHJldHVybgorICAgICAgICBIVFRQIHN0YXR1cyAyMDQgKG5vIGNvbnRlbnQpLiAgT3RoZXJ3aXNlLCByZXR1cm4gSFRUUCBzdGF0dXMgNDA1CisgICAgICAgIChtZXRob2Qgbm90IGFsbG93ZWQpLjwvbGk+CisgICAgPC91bD4KKworCisgICAgPHA+T24gZWFjaCBIVFRQIEdFVCByZXF1ZXN0IHByb2Nlc3NlZCBieSB0aGlzIHNlcnZsZXQsIHRoZSBmb2xsb3dpbmcKKyAgICBwcm9jZXNzaW5nIHNoYWxsIGJlIHBlcmZvcm1lZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT5JZiB0aGUgcmVxdWVzdCBpcyBmb3IgYSByZXNvdXJjZSB1bmRlciA8Y29kZT4vTUVUQS1JTkY8L2NvZGU+IG9yCisgICAgICAgIDxjb2RlPi9XRUItSU5GPC9jb2RlPiwgcmV0dXJuIEhUVFAgc3RhdHVzIDQwNCAobm90IGZvdW5kKS48L2xpPgorICAgIDxsaT5JZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGRvZXMgbm90IGV4aXN0LCByZXR1cm4gSFRUUCBzdGF0dXMgNDA0CisgICAgICAgIChub3QgZm91bmQpLjwvbGk+CisgICAgPGxpPklmIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgbm90IGEgZGlyZWN0b3J5LCBidXQgdGhlIHJlc291cmNlCisgICAgICAgIHBhdGggZW5kcyBpbiAiLyIgb3IgIlwiLCByZXR1cm4gSFRUUCBzdGF0dXMgNDA0IChub3QgZm91bmQpLjwvbGk+CisgICAgPGxpPklmIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgYSBkaXJlY3Rvcnk6CisgICAgICAgIDx1bD4KKyAgICAgICAgPGxpPklmIHRoZSByZXF1ZXN0IHBhdGggZG9lcyBub3QgZW5kIHdpdGggIi8iLCByZWRpcmVjdCB0byBhCisgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHBhdGggd2l0aCAiLyIgYXBwZW5kZWQgc28gdGhhdCByZWxhdGl2ZSByZWZlcmVuY2VzCisgICAgICAgICAgICBpbiB3ZWxjb21lIGZpbGVzIGFyZSByZXNvbHZlZCBjb3JyZWN0bHkuPC9saT4KKyAgICAgICAgPGxpPklmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHdlbGNvbWUgZmlsZXMgZXhpc3RzLCByZWRpcmVjdCB0byB0aGUKKyAgICAgICAgICAgIHBhdGggZm9yIHRoYXQgd2VsY29tZSBmaWxlIHNvIHRoYXQgaXQgd2lsbCBiZSBzZXJ2ZWQgZXhwbGljaXRseS4KKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgIDwvdWw+PC9saT4KKyAgICA8bGk+SWYgdGhlIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkIGNvbnRhaW5zIGFuIDxjb2RlPklmLVJhbmdlPC9jb2RlPgorICAgICAgICBoZWFkZXIsIHBlcmZvcm0gdGhlIHByb2Nlc3NpbmcgZGVzY3JpYmVkIGluIHRoZSBIVFRQLzEuMSBzcGVjaWZpY2F0aW9uCisgICAgICAgIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjbGllbnQncyBpbmZvcm1hdGlvbiBpcyB1cCB0byBkYXRlLjwvbGk+CisgICAgPGxpPkRldGVybWluZSB0aGUgY29udGVudCB0eXBlIG9mIHRoZSByZXNwb25zZSwgYnkgbG9va2luZyB1cCB0aGUKKyAgICAgICAgY29ycmVzcG9uZGluZyBNSU1FIHR5cGUgaW4gb3VyIHNlcnZsZXQgY29udGV4dC48L2xpPgorICAgIDxsaT5JZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGlzIGEgZGlyZWN0b3J5OgorICAgICAgICA8dWw+CisgICAgICAgIDxsaT5JZiBkaXJlY3RvcnkgbGlzdGluZ3MgYXJlIHN1cHByZXNzZWQsIHJldHVybiBIVFRQIHN0YXR1cyA0MDQKKyAgICAgICAgICAgIChub3QgZm91bmQpLjwvbGk+CisgICAgICAgIDxsaT5TZXQgdGhlIGNvbnRlbnQgdHlwZSB0byA8Y29kZT50ZXh0L2h0bWw8L2NvZGU+LjwvbGk+CisgICAgICAgIDwvdWw+PC9saT4KKyAgICA8bGk+RGV0ZXJtaW5lIHRoZSByYW5nZShzKSB0byBiZSByZXR1cm5lZCwgYmFzZWQgb24gdGhlIGV4aXN0ZW5jZSBvZgorICAgICAgICBhbnkgPGNvZGU+SWYtUmFuZ2U8L2NvZGU+IGFuZCA8Y29kZT5SYW5nZTwvY29kZT4gaGVhZGVycy48L2xpPgorICAgIDxsaT5JZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGlzIGEgZGlyZWN0b3J5LCBpbmNsdWRlIGFuIDxjb2RlPkVUYWc8L2NvZGU+CisgICAgICAgIGhlYWRlciBpbiB0aGUgcmVzcG9uc2UsIHdpdGggdGhlIHZhbHVlIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQKKyAgICAgICAgb2YgdGhlIGRpcmVjdG9yeS48L2xpPgorICAgIDxsaT5JbmNsdWRlIGEgPGNvZGU+TGFzdC1Nb2RpZmllZDwvY29kZT4gaGVhZGVyIGluIHRoZSByZXNwb25zZSBkb2N1bWVudGluZworICAgICAgICB0aGUgZGF0ZS90aW1lIHRoYXQgdGhlIHJlc291cmNlIHdhcyBsYXN0IG1vZGlmaWVkLjwvbGk+CisgICAgPGxpPlVubGVzcyB3ZSBhcmUgcHJvY2Vzc2luZyBhIEhFQUQgcmVxdWVzdCwgaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKyAgICAgICAgY29udGVudCAob3IgY29udGVudCByYW5nZXMpIGluIHRoZSByZXNwb25zZS48L2xpPgorICAgIDwvdWw+CisKKyAgICA8cD5PbiBlYWNoIEhUVFAgSEVBRCByZXF1ZXN0IHByb2Nlc3NlZCBieSB0aGlzIHNlcnZsZXQsIHRoZSBmb2xsb3dpbmcKKyAgICBwcm9jZXNzaW5nIHNoYWxsIGJlIHBlcmZvcm1lZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT5Qcm9jZXNzZWQgaWRlbnRpY2FsbHkgdG8gYW4gSFRUUCBHRVQgcmVxdWVzdCwgZXhjZXB0IHRoYXQgdGhlIGRhdGEKKyAgICAgICAgY29udGVudCBpcyBub3QgdHJhbnNtaXR0ZWQgYWZ0ZXIgdGhlIGhlYWRlcnMuPC9saT4KKyAgICA8L3VsPgorCisgICAgPHA+T24gZWFjaCBIVFRQIFBPU1QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgdGhpcyBzZXJ2bGV0LCB0aGUgZm9sbG93aW5nCisgICAgcHJvY2Vzc2luZyBzaGFsbCBiZSBwZXJmb3JtZWQ6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+UHJvY2Vzc2VkIGlkZW50aWNhbGx5IHRvIGFuIEhUVFAgR0VUIHJlcXVlc3QuPC9saT4KKyAgICA8L3VsPgorCisKKyAgICA8cD5PbiBlYWNoIEhUVFAgUFVUIHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHRoaXMgc2VydmxldCwgdGhlIGZvbGxvd2luZworICAgIHByb2Nlc3Npbmcgc2hhbGwgYmUgcGVyZm9tcmVkOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPklmIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHN0YXRpYyByZXNvdXJjZXMgYXJlIG5vdCBhbGxvd2VkIChzZXQgYnkgYQorICAgICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlciksIHJldHVybiBIVFRQIHN0YXR1cyA0MDMgKGZvcmJpZGRlbikuPC9saT4KKyAgICA8bGk+SWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGRlbGV0ZSBhIHJlc291cmNlIGZyb20gPGNvZGU+L01FVEEtSU5GPC9jb2RlPgorICAgICAgICBvciA8Y29kZT4vV0VCLUlORjwvY29kZT4sIHJldHVybiBIVFRQIHN0YXR1cyA0MDMgKGZvcmJpZGRlbikuPC9saT4KKyAgICA8bGk+Q3JlYXRlIGEgbmV3IHJlc291cmNlIGZyb20gdGhlIGJvZHkgb2YgdGhpcyByZXF1ZXN0LjwvbGk+CisgICAgPGxpPkJpbmQgb3IgcmViaW5kIHRoZSBzcGVjaWZpZWQgcGF0aCB0byB0aGUgbmV3IHJlc291cmNlIChkZXBlbmRpbmcgb24KKyAgICAgICAgd2hldGhlciBpdCBjdXJyZW50bHkgZXhpc3RzIG9yIG5vdCkuICBSZXR1cm4gSFRUUCBzdGF0dXMgYXMgZm9sbG93czoKKyAgICAgICAgPHVsPgorICAgICAgICA8bGk+SWYgYmluZGluZyB3YXMgdW5zdWNjZXNzZnVsLCByZXR1cm4gSFRUUCBzdGF0dXMgNDA5IChjb25mbGljdCkuCisgICAgICAgICAgICA8L2xpPgorICAgICAgICA8bGk+SWYgYmluZGluZyB3YXMgc3VjY2Vzc2Z1bCBhbmQgdGhlIHJlc291cmNlIGRpZCBub3QgcHJldmlvdXNseQorICAgICAgICAgICAgZXhpc3QsIHJldHVybiBIVFRQIHN0YXR1cyAyMDEgKGNyZWF0ZWQpLjwvbGk+CisgICAgICAgIDxsaT5JZiBiaW5kaW5nIHdhcyBzdWNjZXNzZnVsIGFuZCB0aGUgcmVzb3VyY2UgcHJldmlvdXNseSBleGlzdGVkLAorICAgICAgICAgICAgcmV0dXJuIEhUVFAgc3RhdHVzIDIwNCAobm8gY29udGVudCkuPC9saT4KKyAgICAgICAgPC91bD48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRmluYWxpemF0aW9uIEZ1bmN0aW9uYWxpdHkiPgorCisgICAgPHA+Tm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBpcyByZXF1aXJlZCB3aGVuIHRoZSA8Y29kZT5kZXN0cm95KCk8L2NvZGU+CisgICAgbWV0aG9kIGlzIGNhbGxlZDo8L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJUZXN0YWJsZSBBc3NlcnRpb25zIj4KKworICA8cD5JbiBhZGRpdGlvbiB0aGUgdGhlIGFzc2VydGlvbnMgaW1wbGllZCBieSB0aGUgZnVuY3Rpb25hbGl0eSByZXF1aXJlbWVudHMKKyAgbGlzdGVkIGFib3ZlLCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYXNzZXJ0aW9ucyBzaGFsbCBiZSB0ZXN0ZWQgdG8KKyAgdmFsaWRhdGUgdGhlIGJlaGF2aW9yIG9mIHRoZSBpbnZva2VyIHNlcnZsZXQ6PC9wPgorICA8dWw+CisgIDxsaT5SZXF1ZXN0cyBmb3IgcmVzb3VyY2VzIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSB3ZWIgYXBwbGljYXRpb24gbXVzdAorICAgICAgcmV0dXJuIEhUVFAgc3RhdHVzIDQwNCAobm90IGZvdW5kKS48L2xpPgorICA8bGk+VGhlIGRlZmF1bHQgc2VydmxldCBtdXN0IG9wZXJhdGUgaWRlbnRpY2FsbHkgZm9yIHdlYiBhcHBsaWNhdGlvbnMgdGhhdAorICAgICAgYXJlIHJ1biBvdXQgb2YgYSBXQVIgZmlsZSBkaXJlY3RseSwgb3IgZnJvbSBhbiB1bnBhY2tlZCBkaXJlY3RvcnkKKyAgICAgIHN0cnVjdHVyZS48L2xpPgorICA8bGk+SWYgdGhlIHdlYiBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIG91dCBvZiBhbiB1bnBhY2tlZCBkaXJlY3RvcnkKKyAgICAgIHN0cnVjdHVyZSwgdGhlIGRlZmF1bHQgc2VydmxldCBtdXN0IHJlY29nbml6ZSBjYXNlcyB3aGVyZSB0aGUgcmVzb3VyY2UKKyAgICAgIGhhcyBiZWVuIHVwZGF0ZWQgdGhyb3VnaCBleHRlcm5hbCBtZWFucy48L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtaW52b2tlci54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9mcy1pbnZva2VyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTI3NDA3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtaW52b2tlci54bWwKQEAgLTAsMCArMSwyNDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJmcy1pbnZva2VyLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8dGl0bGU+SW52b2tlciBTZXJ2bGV0PC90aXRsZT4KKyAgICA8cmV2aXNpb24+JElkJDwvcmV2aXNpb24+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICAgIDxwPlRoZSBwdXJwb3NlIG9mIHRoZSA8c3Ryb25nPkludm9rZXIgU2VydmxldDwvc3Ryb25nPiBpcyB0byBhbGxvdyBhCisgICAgd2ViIGFwcGxpY2F0aW9uIHRvIGR5bmFtaWNhbGx5IHJlZ2lzdGVyIG5ldyA8ZW0+c2VydmxldCBkZWZpbml0aW9uczwvZW0+CisgICAgdGhhdCBjb3JyZXNwb25kIHdpdGggYSA8Y29kZT4mbHQ7c2VydmxldCZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlCisgICAgPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4gZGVwbG95bWVudCBkZXNjcmlwdG9yLCBhbmQgZXhlY3V0ZQorICAgIHJlcXVlc3RzIHV0aWxpemluZyB0aGUgbmV3IHNlcnZsZXQgZGVmaW5pdGlvbnMuICBGcm9tIHRoZSBwZXJzcGVjdGl2ZQorICAgIG9mIHRoZSBuZXdseSByZWdpc3RlcmVkIHNlcnZsZXRzLCBhbGwgc2VydmxldCBsaWZlY3ljbGUgcmVxdWlyZW1lbnRzCisgICAgb2YgdGhlIFNlcnZsZXQgU3BlY2lmaWNhdGlvbiAoc3VjaCBhcyBjYWxsaW5nIDxjb2RlPmluaXQoKTwvY29kZT4gYW5kCisgICAgPGNvZGU+ZGVzdHJveSgpPC9jb2RlPiBhdCB0aGUgY29ycmVjdCB0aW1lcykgd2lsbCBiZSByZXNwZWN0ZWQuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkV4dGVybmFsIFNwZWNpZmljYXRpb25zIj4KKworICAgIDxwPkkgZG8gbm90IGtub3cgb2YgYW55IGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBiZWhhdmlvciBvZiBhbgorICAgIGludm9rZXIgc2VydmxldCB0aGF0IGlzIHB1YmxpY2x5IGF2YWlsYWJsZS4gIEFueW9uZSBrbm93IG9mIG9uZT88L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSW1wbGVtZW50YXRpb24gUmVxdWlyZW1lbnRzIj4KKworICAgIDxwPlRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uYWxpdHkgc2hhbGwgY29uZm9ybSB0byB0aGUKKyAgICBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkltcGxlbWVudGVkIGFzIGEgc2VydmxldC48L2xpPgorICAgIDxsaT5FeGlzdCBpbiB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5zZXJ2bGV0czwvY29kZT4gcGFja2FnZQorICAgICAgICBzbyB0aGF0IGl0IGNhbiBiZSBsb2FkZWQgYnkgdGhlIENhdGFsaW5hIGNsYXNzIGxvYWRlci48L2xpPgorICAgIDxsaT5JbXBsZW1lbnQgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyU2VydmxldDwvY29kZT4KKyAgICAgICAgaW50ZXJmYWNlLCBzbyB0aGF0IGl0IGdhaW5zIGtub3dsZWRnZSBvZiB0aGUgPGNvZGU+V3JhcHBlcjwvY29kZT4KKyAgICAgICAgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgaXRzZWxmIGFuZCwgdGhlcmVmb3JlLCBhY2Nlc3MgdG8gb3RoZXIKKyAgICAgICAgaW50ZXJuYWwgQ2F0YWxpbmEgY29tcG9uZW50cy48L2xpPgorICAgIDxsaT5TdXBwb3J0IGEgY29uZmlndXJhYmxlIGRlYnVnZ2luZyBkZXRhaWwgbGV2ZWwuPC9saT4KKyAgICA8bGk+TG9nIGRlYnVnZ2luZyBhbmQgb3BlcmF0aW9uYWwgbWVzc2FnZXMgKHN1aXRhYmx5IGludGVybmF0aW9uYWxpemVkKQorICAgICAgICB2aWEgdGhlIDxjb2RlPmdldFNlcnZsZXRDb250ZXh0KCkubG9nKCk8L2NvZGU+IG1ldGhvZC48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJEZXBlbmRlbmNpZXMiPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRW52aXJvbm1lbnRhbCBEZXBlbmRlbmNpZXMiPgorCisgICAgPHA+VGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudGFsIGRlcGVuZGVuY2llcyBtdXN0IGJlIG1ldCBpbiBvcmRlciBmb3IKKyAgICB0aGUgSW52b2tlciBzZXJ2bGV0IHRvIG9wZXJhdGUgY29ycmVjdGx5OjwvcD4KKyAgICA8dWw+CisgICAgPGxpPlRoZSBpbnZva2VyIHNlcnZsZXQgbXVzdCBiZSByZWdpc3RlcmVkIGluIHRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CisgICAgICAgIGRlc2NyaXB0b3IgKG9yIHRoZSBkZWZhdWx0IGRlcGxveW1lbnQgZGVzY3JpcHRvciBpbiBmaWxlCisgICAgICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvd2ViLnhtbDwvY29kZT4pIHVzaW5nIGEgInBhdGggbWFwcGVkIgorICAgICAgICBzZXJ2bGV0IG1hcHBpbmcuICBUaGUgaGlzdG9yaWNhbCBkZWZhdWx0IG1hcHBpbmcgaXMgdG8gVVJMIHBhdHRlcm4KKyAgICAgICAgIjxjb2RlPi9zZXJ2bGV0Lyo8L2NvZGU+IiwgYWx0aG91Z2ggdGhlIGludm9rZXIgc2VydmxldCBtdXN0IG9wZXJhdGUKKyAgICAgICAgY29ycmVjdGx5IHdpdGggYW4gYXJiaXRyYXJ5IG1hcHBpbmcuPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbnRhaW5lciBEZXBlbmRlbmNpZXMiPgorCisgICAgPHA+Q29ycmVjdCBvcGVyYXRpb24gb2YgdGhlIGludm9rZXIgc2VydmxldCBkZXBlbmRzIG9uIHRoZSBmb2xsb3dpbmcKKyAgICBzcGVjaWZpYyBmZWF0dXJlcyBvZiB0aGUgc3Vycm91bmRpbmcgY29udGFpbmVyOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkNvcnJlY3Qgc3VwcG9ydCBmb3IgdGhlIDxjb2RlPkNvbnRhaW5lclNlcnZsZXQ8L2NvZGU+IGludGVyZmFjZSwKKyAgICAgICAgaW5jbHVkaW5nIGNhbGxpbmcgPGNvZGU+c2V0V3JhcHBlcigpPC9jb2RlPiA8c3Ryb25nPmJlZm9yZTwvc3Ryb25nPgorICAgICAgICB0aGUgPGNvZGU+aW5pdCgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIGludm9rZXIgc2VydmxldCBpcyBjYWxsZWQuPC9saT4KKyAgICA8bGk+VGhlIHdlYiBhcHBsaWNhdGlvbiBjbGFzcyBsb2FkZXIgbXVzdCBiZSBzdG9yZWQgYXMgdGhlIGNvbnRleHQKKyAgICAgICAgY2xhc3MgbG9hZGVyIG9mIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgdGhyZWFkLjwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkZ1bmN0aW9uYWxpdHkiPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSW5pdGlhbGl6YXRpb24gRnVuY3Rpb25hbGl0eSI+CisKKyAgICA8cD5UaGUgZm9sbG93aW5nIHByb2Nlc3NpbmcgbXVzdCBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgPGNvZGU+aW5pdCgpPC9jb2RlPgorICAgIG1ldGhvZCBvZiB0aGUgaW52b2tlciBzZXJ2bGV0IGlzIGNhbGxlZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT5FbnN1cmUgdGhhdCB0aGUgY29udGFpbmVyIGhhcyBjYWxsZWQgPGNvZGU+c2V0V3JhcHBlcigpPC9jb2RlPi4gIElmCisgICAgICAgIG5vdCwgdGhyb3cgYSBwZXJtYW5lbnQgPGNvZGU+VW5hdmFpbGFibGVFeGNlcHRpb248L2NvZGU+LjwvbGk+CisgICAgPGxpPkxvb2sgdXAgYW5kIGNhY2hlIHRoZSA8Y29kZT5Db250ZXh0PC9jb2RlPiB0aGF0IGNvcnJlc3BvbmRzIHRvIG91cgorICAgICAgICA8Y29kZT5XcmFwcGVyPC9jb2RlPi4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudCB3aXRoIHdoaWNoIG5ldyBzZXJ2bGV0CisgICAgICAgIGRlZmluaXRpb25zIGFuZCBtYXBwaW5ncyB3aWxsIGJlIHJlZ2lzdGVyZWQuPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlBlci1SZXF1ZXN0IEZ1bmN0aW9uYWxpdHkiPgorCisgICAgPHA+T24gZWFjaCByZXF1ZXN0LCB0aGUgZm9sbG93aW5nIHByb2Nlc3Npbmcgc2hhbGwgYmUgcGVyZm9ybWVkOjwvcD4KKyAgICA8b2w+CisgICAgPGxpPkNhbGN1bGF0ZSB0aGUgPGNvZGU+e1NlcnZsZXRQYXRofTwvY29kZT4gZm9yIHRoaXMgcmVxdWVzdCwgZWl0aGVyIGZyb20KKyAgICAgICAgcmVxdWVzdCBhdHRyaWJ1dGUgPGNvZGU+amF2YXguc2VydmxldC5pbmNsdWRlLnNlcnZsZXRfcGF0aDwvY29kZT4gb3IKKyAgICAgICAgYnkgY2FsbGluZyA8Y29kZT5yZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCk8L2NvZGU+LjwvbGk+CisgICAgPGxpPkNhbGN1bGF0ZSB0aGUgPGNvZGU+e1BhdGhJbmZvfTwvY29kZT4gZm9yIHRoaXMgcmVxdWVzdCwgZWl0aGVyIGZyb20KKyAgICAgICAgcmVxdWVzdCBhdHRyaWJ1dGUgPGNvZGU+amF2YXguc2VydmxldC5pbmNsdWRlLnBhdGhfaW5mbzwvY29kZT4gb3IKKyAgICAgICAgYnkgY2FsbGluZyA8Y29kZT5yZXF1ZXN0LmdldFBhdGhJbmZvKCk8L2NvZGU+LiAgSWYgdGhlIGNhbGN1bGF0ZWQKKyAgICAgICAgPGNvZGU+e1BhdGhJbmZvfTwvY29kZT4gaXMgbnVsbCwgcmV0dXJuIEhUVFAgc3RhdHVzIDQwMAorICAgICAgICAoYmFkIHJlcXVlc3QpLjwvbGk+CisgICAgPGxpPlBhcnNlIHRoZSBjYWxjdWxhdGVkIDxjb2RlPntQYXRoSW5mb308L2NvZGU+IHZhbHVlIGFzIGZvbGxvd3M6CisgICAgICAgIDxvbD4KKyAgICAgICAgPGxpPklnbm9yZSB0aGUgbGVhZGluZyBzbGFzaCBjaGFyYWN0ZXIuPC9saT4KKyAgICAgICAgPGxpPkFjY3VtdWxhdGUgY2hhcmFjdGVycyB1cCB0byB0aGUgbmV4dCAnLycgKGlmIGFueSkgYXMgdGhlCisgICAgICAgICAgICA8Y29kZT57U2VydmxldFNlbGVjdG9yfTwvY29kZT4uPC9saT4KKyAgICAgICAgPGxpPklmIGEgJy8nIHdhcyBlbmNvdW50ZXJlZCwgYWNjdW11bGF0ZSBhbGwgY2hhcmFjdGVycyBmcm9tIHRoYXQKKyAgICAgICAgICAgIHNsYXNoIChpbmNsdXNpdmUpIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyBhcworICAgICAgICAgICAgPGNvZGU+e1BhdGhSZW1haW5kZXJ9PC9jb2RlPi4gIElmIG5vIHNsYXNoIHdhcyBlbmNvdW50ZXJlZCwKKyAgICAgICAgICAgIHNldCA8Y29kZT57UGF0aFJlbWFpbmRlcn08L2NvZGU+IHRvIGEgemVyby1sZW5ndGggc3RyaW5nLjwvbGk+CisgICAgICAgIDwvb2w+PC9saT4KKyAgICA8bGk+RGV0ZXJtaW5lIHdoZXRoZXIgPGNvZGU+e1NlcnZsZXRTZWxlY3Rvcn08L2NvZGU+IGlzIHRoZSBuYW1lIG9mIGFuCisgICAgICAgIGV4aXN0aW5nIHNlcnZsZXQgZGVmaW5pdGlvbiwgYW5kIHByb2Nlc3MgaXQgYXMgZm9sbG93czoKKyAgICAgICAgPG9sPgorICAgICAgICA8bGk+QXNrIG91ciBhc3NvY2lhdGVkIDxjb2RlPkNvbnRleHQ8L2NvZGU+IHRvIGZpbmQgYW5kIHJldHVybiBhCisgICAgICAgICAgICBjaGlsZCA8Y29kZT5XcmFwcGVyPC9jb2RlPiBuYW1lZCA8Y29kZT57U2VydmxldFNlbGVjdG9yfTwvY29kZT4uCisgICAgICAgICAgICA8L2xpPgorICAgICAgICA8bGk+SWYgdGhlcmUgaXMgbm8gc3VjaCBjaGlsZCwgc2tpcCB0byB0aGUgbmV4dCBtYWpvciBzdGVwLjwvbGk+CisgICAgICAgIDxsaT5SZWdpc3RlciBhIG5ldyBzZXJ2bGV0IG1hcHBpbmcgZm9yIHRoaXMgPGNvZGU+V3JhcHBlcjwvY29kZT4sCisgICAgICAgICAgICB1c2luZyBhIFVSTCBwYXR0ZXJuIGNhbGN1bGF0ZWQgYXMgZm9sbG93czoKKyAgICAgICAgICAgIDxjb2RlPntTZXJ2bGV0UGF0aH08L2NvZGU+ICsgIi8iICsgPGNvZGU+e1NlcnZsZXRTZWxlY3Rvcn08L2NvZGU+CisgICAgICAgICAgICArICIvKiI8L2xpPgorICAgICAgICA8bGk+Q3JlYXRlIGEgcmVxdWVzdCBkaXNwYXRjaGVyIHVzaW5nIGEgcGF0aCBjYWxjdWxhdGVkIGFzIGZvbGxvd3M6CisgICAgICAgICAgICA8Y29kZT57U2VydmxldFBhdGh9PC9jb2RlPiArICIvIiArIDxjb2RlPntTZXJ2bGV0U2VsZWN0b3J9PC9jb2RlPgorICAgICAgICAgICAgKyA8Y29kZT57UGF0aFJlbWFpbmRlcn08L2NvZGU+PC9saT4KKyAgICAgICAgPGxpPkZvcndhcmQgdGhpcyByZXF1ZXN0IHRvIHRoZSBjcmVhdGVkIHJlcXVlc3QgZGlzcGF0Y2hlciwgYW5kCisgICAgICAgICAgICBleGl0IGZyb20gdGhpcyByZXF1ZXN0LjwvbGk+CisgICAgICAgIDwvb2w+PC9saT4KKyAgICA8bGk+QXNzdW1lIHRoYXQgPGNvZGU+e1NlcnZsZXRTZWxlY3Rvcn08L2NvZGU+IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQKKyAgICAgICAgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIDxjb2RlPmphdmF4LnNlcnZsZXQuU2VydmxldDwvY29kZT4KKyAgICAgICAgYW5kIHByb2Nlc3MgaXQgYXMgZm9sbG93czoKKyAgICAgICAgPG9sPgorICAgICAgICA8bGk+U3ludGhlc2l6ZSBhIG5ldyA8Y29kZT57U2VydmxldE5hbWV9PC9jb2RlPiBmb3IgdGhlIHNlcnZsZXQKKyAgICAgICAgICAgIGRlZmluaXRpb24gdGhhdCB3aWxsIGJlIGNyZWF0ZWQuPC9saT4KKyAgICAgICAgPGxpPklmIHRoZXJlIGlzIGFscmVhZHkgYSBjaGlsZCA8Y29kZT5XcmFwcGVyPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgICAgIHRoaXMgbmFtZSwgcmV0dXJuIEhUVFAgc3RhdHVzIDUwMCAoaW50ZXJuYWwgc2VydmVyIGVycm9yKSwgYmVjYXVzZQorICAgICAgICAgICAgYSBtYXBwaW5nIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkIGZvciB0aGlzIHNlcnZsZXQuPC9saT4KKyAgICAgICAgPGxpPkF0dGVtcHQgdG8gbG9hZCBhIGNsYXNzIG5hbWVkIDxjb2RlPntTZXJ2bGV0U2VsZWN0b3J9PC9jb2RlPiBmcm9tCisgICAgICAgICAgICB0aGUgd2ViIGFwcGxpY2F0aW9uIGNsYXNzIGxvYWRlciAoaS5lLiB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIKKyAgICAgICAgICAgIGZvciBvdXIgY3VycmVudCB0aHJlYWQpLiAgSWYgdGhpcyBmYWlscywgcmV0dXJuIEhUVFAgc3RhdHVzIDQwNAorICAgICAgICAgICAgKG5vdCBmb3VuZCkuPC9saT4KKyAgICAgICAgPGxpPkluc3RhbnRpYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuICBJZiBhbiBlcnJvciBvY2N1cnMsCisgICAgICAgICAgICByZXR1cm4gSFRUUCBzdGF0dXMgNDA0IChub3QgZm91bmQpLjwvbGk+CisgICAgICAgIDxsaT5JZiB0aGlzIGNsYXNzIGRvZXMgbm90IGltcGxlbWVudCB0aGUKKyAgICAgICAgICAgIDxjb2RlPmphdmF4LnNlcnZsZXQuU2VydmxldDwvY29kZT4gaW50ZXJmYWNlLCByZXR1cm4gSFRUUCBzdGF0dXMKKyAgICAgICAgICAgIDQwNCAobm90IGZvdW5kKS48L2xpPgorICAgICAgICA8bGk+Q3JlYXRlIGFuZCByZWdpc3RlciBhIG5ldyA8Y29kZT5XcmFwcGVyPC9jb2RlPiBjaGlsZCB3aXRoIG91cgorICAgICAgICAgICAgPGNvZGU+Q29udGV4dDwvY29kZT4sIHVuZGVyIG5hbWUgPGNvZGU+e1NlcnZsZXROYW1lfTwvY29kZT4uPC9saT4KKyAgICAgICAgPGxpPlJlZ2lzdGVyIGEgbmV3IHNlcnZsZXQgbWFwcGluZyBmb3IgdGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPiwKKyAgICAgICAgICAgIHVzaW5nIGEgVVJMIHBhdHRlcm4gY2FsY3VsYXRlZCBhcyBmb2xsb3dzOgorICAgICAgICAgICAgPGNvZGU+e1NlcnZsZXRQYXRofTwvY29kZT4gKyAiLyIgKyA8Y29kZT57U2VydmxldFNlbGVjdG9yfTwvY29kZT4KKyAgICAgICAgICAgICsgIi8qIjwvbGk+CisgICAgICAgIDxsaT5DcmVhdGUgYSByZXF1ZXN0IGRpc3BhdGNoZXIgdXNpbmcgYSBwYXRoIGNhbGN1bGF0ZWQgYXMgZm9sbG93czoKKyAgICAgICAgICAgIDxjb2RlPntTZXJ2bGV0UGF0aH08L2NvZGU+ICsgIi8iICsgPGNvZGU+e1NlcnZsZXRTZWxlY3Rvcn08L2NvZGU+CisgICAgICAgICAgICArIDxjb2RlPntQYXRoUmVtYWluZGVyfTwvY29kZT48L2xpPgorICAgICAgICA8bGk+Rm9yd2FyZCB0aGlzIHJlcXVlc3QgdG8gdGhlIGNyZWF0ZWQgcmVxdWVzdCBkaXNwYXRjaGVyLCBhbmQKKyAgICAgICAgICAgIGV4aXQgZnJvbSB0aGlzIHJlcXVlc3QuPC9saT4KKyAgICAgICAgPC9vbD48L2xpPgorICAgIDwvb2w+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRmluYWxpemF0aW9uIEZ1bmN0aW9uYWxpdHkiPgorCisgICAgPHA+Tm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBpcyByZXF1aXJlZCB3aGVuIHRoZSA8Y29kZT5kZXN0cm95KCk8L2NvZGU+CisgICAgbWV0aG9kIGlzIGNhbGxlZDo8L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJUZXN0YWJsZSBBc3NlcnRpb25zIj4KKworICA8cD5JbiBhZGRpdGlvbiB0aGUgdGhlIGFzc2VydGlvbnMgaW1wbGllZCBieSB0aGUgZnVuY3Rpb25hbGl0eSByZXF1aXJlbWVudHMKKyAgbGlzdGVkIGFib3ZlLCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYXNzZXJ0aW9ucyBzaGFsbCBiZSB0ZXN0ZWQgdG8KKyAgdmFsaWRhdGUgdGhlIGJlaGF2aW9yIG9mIHRoZSBpbnZva2VyIHNlcnZsZXQ6PC9wPgorICA8dWw+CisgIDxsaT5JdCBpcyBwb3NzaWJsZSB0byBhY2Nlc3MgYW4gZXhpc3Rpbmcgc2VydmxldCBkZWZpbml0aW9uIGJ5IG5hbWUKKyAgICAgIHRocm91Z2ggdGhlIGludm9rZXIuICBUaGUgZXhpc3Rpbmcgc2VydmxldCBkZWZpbml0aW9uIGNhbiBpbmNsdWRlCisgICAgICBlaXRoZXIgYSA8Y29kZT4mbHQ7c2VydmxldC1jbGFzcyZndDs8L2NvZGU+IG9yCisgICAgICA8Y29kZT4mbHQ7anNwLWZpbGUmZ3Q7PC9jb2RlPiBzdWJlbGVtZW50LjwvbGk+CisgIDxsaT5XaGVuIGFuIGV4aXN0aW5nIHNlcnZsZXQgZGVmaW5pdGlvbiBpcyBhY2Nlc3NlZCBieSBuYW1lLCB0aGUgcmVxdWVzdAorICAgICAgd2lsbCBiZSB1bHRpbWF0ZWx5IHByb2Nlc3NlZCBieSB0aGUgc2FtZSBzZXJ2bGV0IGluc3RhbmNlIHRoYXQgd291bGQKKyAgICAgIGhhdmUgcHJvY2Vzc2VkIGl0IGhhZCBhIG1hcHBpbmcgdG8gdGhhdCBzZXJ2bGV0IGRlZmluaXRpb24gYmVlbiB1c2VkCisgICAgICBvbiB0aGUgcmVxdWVzdCBkaXJlY3RseS48L2xpPgorICA8bGk+SXQgaXMgcG9zc2libGUgdG8gYWNjZXNzIGFuIGFub255bW91cyBzZXJ2bGV0IGJ5IGNsYXNzIG5hbWUKKyAgICAgIHRocm91Z2ggdGhlIGludm9rZXIuPC9saT4KKyAgPGxpPldoZW4gYW4gYW5vbnltb3VzIHNlcnZsZXQgaXMgYWNjZXNzZWQsIHRoZSBzZXJ2bGV0IGluc3RhbmNlIGlzIHByb2Nlc3NlZAorICAgICAgYWNjb3JkaW5nIHRvIHRoZSBsaWZlY3ljbGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBTZXJ2bGV0IFNwZWNpZmljYXRpb24uCisgICAgICA8L2xpPgorICA8bGk+V2hlbiBhbiBhbm9ueW1vdXMgc2VydmxldCBpcyBhY2Nlc3NlZCwgdGhlIHNlcnZsZXQgaW5zdGFuY2UgcmVjZWl2ZXMKKyAgICAgIGEgPGNvZGU+U2VydmxldENvbmZpZzwvY29kZT4gaW5zdGFuY2Ugd2l0aCBubyBzZXJ2bGV0IGluaXRpYWxpemF0aW9uCisgICAgICBwYXJhbWV0ZXJzLjwvbGk+CisgIDxsaT5JdCBpcyBwb3NzaWJsZSB0byB1dGlsaXplIHRoZSBpbnZva2VyIHNlcnZsZXQgdmlhIGEgZGlyZWN0IHJlcXVlc3QuPC9saT4KKyAgPGxpPkl0IGlzIHBvc3NpYmxlIHRvIHV0aWxpemUgdGhlIGludm9rZXIgc2VydmxldCB2aWEgYSBjYWxsIHRvCisgICAgICA8Y29kZT5SZXF1ZXN0RGlzcGF0Y2hlci5mb3J3YXJkKCk8L2NvZGU+LCBvciB0aGUgY29ycmVzcG9uZGluZworICAgICAgPGNvZGU+Jmx0O2pzcDpmb3J3YXJkJmd0OzwvY29kZT4gdGFnIGluIGEgSlNQIHBhZ2UuPC9saT4KKyAgPGxpPkl0IGlzIHBvc3NpYmxlIHRvIHV0aWxpemUgdGhlIGludm9rZXIgc2VydmxldCB2aWEgYSBjYWxsIHRvCisgICAgICA8Y29kZT5SZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCk8L2NvZGU+LCBvciB0aGUgY29ycmVzcG9uZGluZworICAgICAgPGNvZGU+Jmx0O2pzcDppbmNsdWRlJmd0OzwvY29kZT4gdGFnIGluIGEgSlNQIHBhZ2UuPC9saT4KKyAgPGxpPkl0IGlzIHBvc3NpYmxlIHRvIHVzZSBhbnkgSFRUUCBtZXRob2QgKGluY2x1ZGluZyBHRVQgYW5kIFBPU1QpIHRoYXQKKyAgICAgIGlzIHN1cHBvcnRlZCBieSB0aGUgU2VydmxldCBjbGFzcyB0aGF0IGlzIHVsdGltYXRlbHkgZXhlY3V0ZWQuPC9saT4KKyAgPGxpPlRoZSBpbnZva2VyIHNlcnZsZXQgc2hvdWxkIG5ldmVyIGJlIGFza2VkIHRvIHByb2Nlc3MgYSBzZWNvbmQgb3IKKyAgICAgIHN1YnNlcXVlbnQgcmVxdWVzdCBmb3IgdGhlIHNhbWUgPGNvZGU+e1NlcnZsZXRTZWxlY3Rvcn08L2NvZGU+IChiZWNhdXNlCisgICAgICBpdCB3aWxsIGhhdmUgcmVnaXN0ZXJlZCBhbiBhcHByb3ByaWF0ZSBzZXJ2bGV0IG1hcHBpbmcuPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL2ZzLWpkYmMtcmVhbG0ueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtamRiYy1yZWFsbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhY2QzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL2ZzLWpkYmMtcmVhbG0ueG1sCkBAIC0wLDAgKzEsMjQ4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iZnMtamRiYy1yZWFsbS5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPkpEQkNSZWFsbTwvdGl0bGU+CisgICAgPHJldmlzaW9uPiRJZCQ8L3JldmlzaW9uPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKyAgICA8cD5UaGUgcHVycG9zZSBvZiB0aGUgPHN0cm9uZz5KREJDUmVhbG08L3N0cm9uZz4gaW1wbGVtZW50YXRpb24gaXMgdG8KKyAgICBwcm92aWRlIGEgbWVjaGFuaXNtIGJ5IHdoaWNoIFRvbWNhdCA1IGNhbiBhY3F1aXJlIGluZm9ybWF0aW9uIG5lZWRlZAorICAgIHRvIGF1dGhlbnRpY2F0ZSB3ZWIgYXBwbGljYXRpb24gdXNlcnMsIGFuZCBkZWZpbmUgdGhlaXIgc2VjdXJpdHkgcm9sZXMsCisgICAgZnJvbSBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgYWNjZXNzZWQgdmlhIEpEQkMgQVBJcy4gIEZvciBpbnRlZ3JhdGlvbgorICAgIHdpdGggQ2F0YWxpbmEsIHRoZSByZXN1bHRpbmcgY2xhc3MoZXMpIG11c3QgaW1wbGVtZW50IHRoZQorICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG08L2NvZGU+IGludGVyZmFjZS48L3A+CisKKyAgICA8cD5UaGlzIHNwZWNpZmljYXRpb24gcmVmbGVjdHMgYSBjb21iaW5hdGlvbiBvZiBmdW5jdGlvbmFsaXR5IHRoYXQgaXMKKyAgICBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkRCQ1JlYWxtPC9jb2RlPgorICAgIGNsYXNzLCBhcyB3ZWxsIGFzIHJlcXVpcmVtZW50cyBmb3IgZW5oYW5jZW1lbnRzIHRoYXQgaGF2ZSBiZWVuCisgICAgZGlzY3Vzc2VkLiAgV2hlcmUgYXBwcm9wcmlhdGUsIHJlcXVpcmVtZW50cyBzdGF0ZW1lbnRzIGFyZSBtYXJrZWQKKyAgICA8ZW0+W0N1cnJlbnRdPC9lbT4gYW5kIDxlbT5bUmVxdWVzdGVkXTwvZW0+IHRvIGRpc3Rpbmd1aXNoIHRoZW0uPC9wPgorCisgICAgPHA+VGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoaXMgZnVuY3Rpb25hbCBzcGVjaWZpY2F0aW9uIGlzCisgICAgPHN0cm9uZz5QUk9QT1NFRDwvc3Ryb25nPi4gIEl0IGhhcyBub3QgeWV0IGJlZW4gZGlzY3Vzc2VkIGFuZAorICAgIGFncmVlZCB0byBvbiB0aGUgVE9NQ0FULURFViBtYWlsaW5nIGxpc3QuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkV4dGVybmFsIFNwZWNpZmljYXRpb25zIj4KKworICAgIDxwPlRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uYWxpdHkgZGVwZW5kcyBvbiB0aGUgZm9sbG93aW5nCisgICAgZXh0ZXJuYWwgc3BlY2lmaWNhdGlvbnM6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGJjLyI+SmF2YSBEYXRhYmFzZQorICAgICAgICBDb25uZWN0aXZpdHk8L2E+ICh2ZXJzaW9uIDIuMCBvciBsYXRlcik8L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkYmMvIj5KYXZhIERhdGFiYXNlCisgICAgICAgIENvbm5lY3Rpdml0eSBPcHRpb25hbCBQYWNrYWdlPC9hPiAodmVyc2lvbiAyLjAgb3IgbGF0ZXIpPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkltcGxlbWVudGF0aW9uIFJlcXVpcmVtZW50cyI+CisKKyAgICA8cD5UaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbmFsaXR5IHNoYWxsIGNvbmZvcm0gdG8gdGhlCisgICAgZm9sbG93aW5nIHJlcXVpcmVtZW50czo8L3A+CisgICAgPHVsPgorICAgIDxsaT5CZSByZWFsaXplZCBpbiBvbmUgb3IgbW9yZSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLjwvbGk+CisgICAgPGxpPkltcGxlbWVudCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTwvY29kZT4gaW50ZXJmYWNlLgorICAgICAgICBbQ3VycmVudF08L2xpPgorICAgIDxsaT5JbXBsZW1lbnQgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlPC9jb2RlPgorICAgICAgICBpbnRlcmZhY2UuICBbQ3VycmVudF08L2xpPgorICAgIDxsaT5TdWJjbGFzcyB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5SZWFsbUJhc2U8L2NvZGU+CisgICAgICAgIGJhc2UgY2xhc3MuPC9saT4KKyAgICA8bGk+TGl2ZSBpbiB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbTwvY29kZT4gcGFja2FnZS4KKyAgICAgICAgW0N1cnJlbnRdPC9saT4KKyAgICA8bGk+U3VwcG9ydCBhIGNvbmZpZ3VyYWJsZSBkZWJ1Z2dpbmcgZGV0YWlsIGxldmVsLiBbQ3VycmVudF08L2xpPgorICAgIDxsaT5Mb2cgZGVidWdnaW5nIGFuZCBvcGVyYXRpb25hbCBtZXNzYWdlcyAoc3VpdGFibHkgaW50ZXJuYXRpb25hbGl6ZWQpCisgICAgICAgIHZpYSB0aGUgPGNvZGU+Z2V0Q29udGFpbmVyKCkubG9nKCk8L2NvZGU+IG1ldGhvZC4gW0N1cnJlbnRdPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRGVwZW5kZW5jaWVzIj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkVudmlyb25tZW50YWwgRGVwZW5kZW5jaWVzIj4KKworICAgIDxwPlRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnRhbCBkZXBlbmRlbmNpZXMgbXVzdCBiZSBtZXQgaW4gb3JkZXIgZm9yCisgICAgSkRCQ1JlYWxtIHRvIG9wZXJhdGUgY29ycmVjdGx5OjwvcD4KKyAgICA8dWw+CisgICAgPGxpPlRoZSBkZXNpcmUgdG8gdXRpbGl6ZSBKREJDUmVhbG0gbXVzdCBiZSByZWdpc3RlcmVkIGluCisgICAgICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4sIGluIGEKKyAgICAgICAgPGNvZGU+Jmx0O1JlYWxtJmd0OzwvY29kZT4gZWxlbWVudCB0aGF0IGlzIG5lc3RlZCBpbnNpZGUgYQorICAgICAgICBjb3JyZXNwb25kaW5nIDxjb2RlPiZsdDtFbmdpbmUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O0hvc3QmZ3Q7PC9jb2RlPiwKKyAgICAgICAgb3IgPGNvZGU+Jmx0O0NvbnRleHQmZ3Q7PC9jb2RlPiBlbGVtZW50LjwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJDb250YWluZXIgRGVwZW5kZW5jaWVzIj4KKworICAgIDxwPkNvcnJlY3Qgb3BlcmF0aW9uIG9mIEpEQkNSZWFsbSBkZXBlbmRzIG9uIHRoZSBmb2xsb3dpbmcKKyAgICBzcGVjaWZpYyBmZWF0dXJlcyBvZiB0aGUgc3Vycm91bmRpbmcgY29udGFpbmVyOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkludGVyYWN0aW9ucyB3aXRoIDxjb2RlPkpEQkNSZWFsbTwvY29kZT4gd2lsbCBiZSBpbml0aWF0ZWQgYnkKKyAgICAgICAgdGhlIGFwcHJvcHJpYXRlIDxjb2RlPkF1dGhlbnRpY2F0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uLCBiYXNlZAorICAgICAgICBvbiB0aGUgbG9naW4gbWV0aG9kIHRoYXQgaXMgc2VsZWN0ZWQuPC9saT4KKyAgICA8bGk+PGNvZGU+SkRCQ1JlYWxtPC9jb2RlPiBtdXN0IGhhdmUgdGhlIEpEQkMgc3RhbmRhcmQgQVBJIGNsYXNzZXMKKyAgICAgICAgYXZhaWxhYmxlIHRvIGl0LiAgRm9yIGEgSkRLIDEuMiBvciBsYXRlciBjb250YWluZXIsIHRoZXNlIEFQSXMKKyAgICAgICAgYXJlIGluY2x1ZGVkIGluIHRoZSBzdGFuZGFyZCBwbGF0Zm9ybS48L2xpPgorICAgIDxsaT5XaGVuIGNvbm5lY3Rpb24gcG9vbGluZyBpcyBpbXBsZW1lbnRlZCwgPGNvZGU+SkRCQ1JlYWxtPC9jb2RlPgorICAgICAgICBtdXN0IGhhdmUgdGhlIEpEQkMgT3B0aW9uYWwgUGFja2FnZSAodmVyc2lvbiAyLjAgb3IgbGF0ZXIpIEFQSXMKKyAgICAgICAgYXZhaWxhYmxlIHRvIGl0LiAgVGhpcyBsaWJyYXJ5IGlzIGF2YWlsYWJsZSBhcyBhIHNlcGFyYXRlCisgICAgICAgIGRvd25sb2FkIChhbmQgd2lsbCBiZSBpbmNsdWRlZCBpbiBUb21jYXQgYmluYXJ5IGRpc3RyaWJ1dGlvbnMpLjwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkZ1bmN0aW9uYWxpdHkiPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iT3ZlcnZpZXcgb2YgT3BlcmF0aW9uIj4KKworICAgIDxwPlRoZSBtYWluIHB1cnBvc2Ugb2YgPGNvZGU+SkRCQ1JlYWxtPC9jb2RlPiBpcyB0byBhbGxvdyBDYXRhbGluYSB0bworICAgIGF1dGhlbnRpY2F0ZSB1c2VycywgYW5kIGxvb2sgdXAgdGhlIGNvcnJlc3BvbmRpbmcgc2VjdXJpdHkgcm9sZXMsIGZyb20KKyAgICB0aGUgaW5mb3JtYXRpb24gZm91bmQgaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlIGFjY2Vzc2VkIHZpYSBKREJDIEFQSXMuCisgICAgRm9yIG1heGltdW0gZmxleGliaWxpdHksIHRoZSBkZXRhaWxzIG9mIGhvdyB0aGlzIGlzIGRvbmUgKGZvciBleGFtcGxlLAorICAgIHRoZSBuYW1lcyBvZiB0aGUgcmVxdWlyZWQgdGFibGVzIGFuZCBjb2x1bW5zKSBzaG91bGQgYmUgY29uZmlndXJhYmxlLjwvcD4KKworICAgIDxwPkVhY2ggdGltZSB0aGF0IENhdGFsaW5hIG5lZWRzIHRvIGF1dGhlbnRpY2F0ZSBhIHVzZXIsIGl0IHdpbGwgY2FsbAorICAgIHRoZSA8Y29kZT5hdXRoZW50aWNhdGUoKTwvY29kZT4gbWV0aG9kIG9mIHRoaXMgUmVhbG0gaW1wbGVtZW50YXRpb24sCisgICAgcGFzc2luZyB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHRoYXQgd2VyZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuICBJZgorICAgIHdlIGZpbmQgdGhlIHVzZXIgaW4gdGhlIGRhdGFiYXNlIChhbmQgbWF0Y2ggb24gdGhlIHBhc3N3b3JkKSwgd2UgYWNjdW11bGF0ZQorICAgIGFsbCBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgdGhhdCBhcmUgZGVmaW5lZCBmb3IgdGhpcyB1c2VyLCBhbmQgY3JlYXRlIGEKKyAgICBuZXcgPGNvZGU+R2VuZXJpY1ByaW5jaXBhbDwvY29kZT4gb2JqZWN0IHRvIGJlIHJldHVybmVkLiAgSWYgdGhlIHVzZXIKKyAgICBpcyBub3QgYXV0aGVudGljYXRlZCwgd2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGluc3RlYWQuICBUaGUKKyAgICA8Y29kZT5HZW5lcmljVXNlcjwvY29kZT4gb2JqZWN0IGNhY2hlcyB0aGUgc2V0IG9mIHNlY3VyaXR5IHJvbGVzIHRoYXQKKyAgICB3ZXJlIG93bmVkIGJ5IHRoaXMgdXNlciBhdCB0aGUgdGltZSBvZiBhdXRoZW50aWNhdGlvbiwgc28gdGhhdCBjYWxscyB0bworICAgIDxjb2RlPmlzVXNlckluUm9sZSgpPC9jb2RlPiBjYW4gYmUgYW5zd2VyZWQgd2l0aG91dCBnb2luZyBiYWNrIHRvIHRoZQorICAgIGRhdGFiYXNlIGV2ZXJ5IHRpbWUuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkRldGFpbGVkIEZ1bmN0aW9uYWwgUmVxdWlyZW1lbnRzIj4KKworCisgICAgPGgzPkNvbmZpZ3VyYWJsZSBQcm9wZXJ0aWVzPC9oMz4KKworICAgIDxwPlRoZSBpbXBsZW1lbnRhdGlvbiBzaGFsbCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcworICAgIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBKYXZhQmVhbnMgcHJvcGVydHkgc2V0dGVyczo8L3A+CisgICAgPHVsPgorICAgIDxsaT5Db25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZGVmaW5pbmcgdGhlIEpEQkMgZHJpdmVyIHRvIHVzZSwgdGhlCisgICAgICAgIGRhdGFiYXNlIGNvbm5lY3Rpb24gVVJMIHRvIGJlIGFjY2Vzc2VkLCBhbmQgdGhlIHVzZXJuYW1lL3Bhc3N3b3JkCisgICAgICAgIHRvIHVzZSBmb3IgbG9nZ2luZyBpbi4gW0N1cnJlbnRdPC9saT4KKyAgICA8bGk+Q29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGRlc2NyaWJpbmcgdGhlIGNvbm5lY3Rpb24gcG9vbCB0byBiZQorICAgICAgICBjcmVhdGVkIHRvIHN1cHBvcnQgc2ltdWx0YW5lb3VzIGF1dGhlbnRpY2F0aW9ucy4gW1JlcXVlc3RlZF08L2xpPgorICAgIDxsaT5OYW1lIG9mIHRoZSB0YWJsZXMgdG8gYmUgc2VhcmNoZWQgZm9yIHVzZXJzIGFuZCByb2xlcy4gW0N1cnJlbnRdPC9saT4KKyAgICA8bGk+TmFtZSBvZiB0aGUgY29sdW1ucyB0byBiZSB1c2VkIGZvciB1c2VybmFtZXMsIHBhc3N3b3JkcywgYW5kCisgICAgICAgIHJvbGUgbmFtZXMuICBbQ3VycmVudF08L2xpPgorICAgIDwvdWw+CisKKyAgICA8aDM+TGlmZWN5Y2xlIEZ1bmN0aW9uYWxpdHk8L2gzPgorCisgICAgPHA+VGhlIGZvbGxvd2luZyBwcm9jZXNzaW5nIG11c3QgYmUgcGVyZm9ybWVkIHdoZW4gdGhlIDxjb2RlPnN0YXJ0KCk8L2NvZGU+CisgICAgbWV0aG9kIGlzIGNhbGxlZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT5Fc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIHRoZSBjb25maWd1cmVkIGRhdGFiYXNlLCB1c2luZyB0aGUKKyAgICAgICAgY29uZmlndXJlZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQuICBbQ3VycmVudF08L2xpPgorICAgIDxsaT5Db25maWd1cmUgYW5kIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gcG9vbCBvZiBjb25uZWN0aW9ucyB0byB0aGUKKyAgICAgICAgZGF0YWJhc2UuICBbUmVxdWVzdGVkXTwvbGk+CisgICAgPC91bD4KKworICAgIDxwPlRoZSBmb2xsb3dpbmcgcHJvY2Vzc2luZyBtdXN0IGJlIHBlcmZvcm1lZCB3aGVuIHRoZSA8Y29kZT5zdG9wKCk8L2NvZGU+CisgICAgbWV0aG9kIGlzIGNhbGxlZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT5DbG9zZSBhbnkgb3BlbmVkIGNvbm5lY3Rpb25zIHRvIHRoZSBkYXRhYmFzZS48L2xpPgorICAgIDwvdWw+CisKKworICAgIDxoMz5NZXRob2QgYXV0aGVudGljYXRlKCkgRnVuY3Rpb25hbGl0eTwvaDM+CisKKyAgICA8cD5XaGVuIDxjb2RlPmF1dGhlbnRpY2F0ZSgpPC9jb2RlPiBpcyBjYWxsZWQsIHRoZSBmb2xsb3dpbmcgcHJvY2Vzc2luZworICAgIGlzIHJlcXVpcmVkOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkFjcXVpcmUgdGhlIG9uZSBhbmQgb25seSBjb25uZWN0aW9uIFtDdXJyZW50XSBvciBhY3F1aXJlIGEgY29ubmVjdGlvbgorICAgICAgICBmcm9tIHRoZSBjb25uZWN0aW9uIHBvb2wgW1JlcXVlc3RlZF0uPC9saT4KKyAgICA8bGk+U2VsZWN0IHRoZSBvbmUgYW5kIG9ubHkgcm93IGZyb20gdGhlIHVzZXIncyB0YWJsZSBmb3IgdGhpcyB1c2VyLAorICAgICAgICBhbmQgcmV0cmlldmUgdGhlIGNvcnJlc3BvbmRpbmcgcGFzc3dvcmQgY29sdW1uLiAgSWYgemVybyByb3dzIChvcgorICAgICAgICBtb3JlIHRoYW4gb25lIHJvdykgYXJlIGZvdW5kLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uPC9saT4KKyAgICA8bGk+QXV0aGVudGljYXRlIHRoZSB1c2VyIGJ5IGNvbXBhcmluZyB0aGUgKHBvc3NpYmx5IGVuY3J5cHRlZCkgcGFzc3dvcmQKKyAgICAgICAgdmFsdWUgdGhhdCB3YXMgcmVjZWl2ZWQgYWdhaW5zdCB0aGUgcGFzc3dvcmQgcHJlc2VudGVkIGJ5IHRoZSB1c2VyLgorICAgICAgICBJZiB0aGVyZSBpcyBubyBtYXRjaCwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LjwvbGk+CisgICAgPGxpPkFjcXVpcmUgYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgYXNzaWduZWQgdG8gdGhlCisgICAgICAgIGF1dGhlbnRpY2F0ZWQgdXNlciBieSBzZWxlY3RpbmcgZnJvbSB0aGUgcm9sZXMgdGFibGUuPC9saT4KKyAgICA8bGk+Q29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIGNsYXNzCisgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uR2VuZXJpY1ByaW5jaXBhbDwvY29kZT4sIHBhc3NpbmcgYXMKKyAgICAgICAgY29uc3RydWN0b3IgYXJndW1lbnRzOiAgdGhpcyByZWFsbSBpbnN0YW5jZSwgdGhlIGF1dGhlbnRpY2F0ZWQKKyAgICAgICAgdXNlcm5hbWUsIGFuZCBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHRoZSBzZWN1cml0eSByb2xlcyBhc3NvY2lhdGVkCisgICAgICAgIHdpdGggdGhpcyB1c2VyLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+V0FSTklORzwvc3Ryb25nPiAtIERvIG5vdCBhdHRlbXB0IHRvIGNhY2hlIGFuZCByZXVzZSBwcmV2aW91cworICAgICAgICA8Y29kZT5HZW5lcmljUHJpbmNpcGFsPC9jb2RlPiBvYmplY3RzIGZvciBhIHBhcnRpY3VsYXIgdXNlciwgYmVjYXVzZQorICAgICAgICB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGRpcmVjdG9yeSBzZXJ2ZXIgbWlnaHQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZQorICAgICAgICBsYXN0IHRpbWUgdGhpcyB1c2VyIHdhcyBhdXRoZW50aWNhdGVkLjwvbGk+CisgICAgPGxpPlJldHVybiB0aGUgbmV3bHkgY29uc3RydWN0ZWQgPGNvZGU+R2VuZXJpY1ByaW5jaXBhbDwvY29kZT4uPC9saT4KKyAgICA8L3VsPgorCisKKyAgICA8aDM+TWV0aG9kIGhhc1JvbGUoKSBGdW5jdGlvbmFsaXR5PC9oMz4KKworICAgIDxwPldoZW4gPGNvZGU+aGFzUm9sZSgpPC9jb2RlPiBpcyBjYWxsZWQsIHRoZSBmb2xsb3dpbmcgcHJvY2Vzc2luZworICAgIGlzIHJlcXVpcmVkOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPlRoZSA8Y29kZT5wcmluY2lwYWw8L2NvZGU+IHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IFNIT1VMRAorICAgICAgICBiZSBvbmUgdGhhdCB3ZSByZXR1cm5lZCAoaW5zdGFuY2VvZiBjbGFzcworICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkdlbmVyaWNQcmluY2lwYWw8L2NvZGU+LCB3aXRoIGEKKyAgICAgICAgPGNvZGU+cmVhbG08L2NvZGU+IHByb3BlcnR5IHRoYXQgaXMgZXF1YWwgdG8gb3VyIGluc3RhbmNlLjwvbGk+CisgICAgPGxpPklmIHRoZSBwYXNzZWQgPGNvZGU+cHJpbmNpcGFsPC9jb2RlPiBtZWV0cyB0aGVzZSBjcml0ZXJpYSwgY2hlY2sKKyAgICAgICAgdGhlIHNwZWNpZmllZCByb2xlIGFnYWluc3QgdGhlIGxpc3QgcmV0dXJuZWQgYnkKKyAgICAgICAgPGNvZGU+Z2V0Um9sZXMoKTwvY29kZT4sIGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlCisgICAgICAgIHNwZWNpZmllZCByb2xlIGlzIGluY2x1ZGVkOyBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4uPC9saT4KKyAgICA8bGk+SWYgdGhlIHBhc3NlZCA8Y29kZT5wcmluY2lwYWw8L2NvZGU+IGRvZXMgbm90IG1lZXQgdGhlc2UgY3JpdGVyaWEsCisgICAgICAgIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4uPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlRlc3RhYmxlIEFzc2VydGlvbnMiPgorCisgIDxwPkluIGFkZGl0aW9uIHRoZSB0aGUgYXNzZXJ0aW9ucyBpbXBsaWVkIGJ5IHRoZSBmdW5jdGlvbmFsaXR5IHJlcXVpcmVtZW50cworICBsaXN0ZWQgYWJvdmUsIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhc3NlcnRpb25zIHNoYWxsIGJlIHRlc3RlZCB0bworICB2YWxpZGF0ZSB0aGUgYmVoYXZpb3Igb2YgPGNvZGU+SkRCQ1JlYWxtPC9jb2RlPjo8L3A+CisgIDx1bD4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL2ZzLWpuZGktcmVhbG0ueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtam5kaS1yZWFsbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5ZmUwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL2ZzLWpuZGktcmVhbG0ueG1sCkBAIC0wLDAgKzEsNDAzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iZnMtam5kaS1yZWFsbS5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPkpORElSZWFsbTwvdGl0bGU+CisgICAgPHJldmlzaW9uPiRJZCQ8L3JldmlzaW9uPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKyAgICA8cD5UaGUgcHVycG9zZSBvZiB0aGUgPHN0cm9uZz5KTkRJUmVhbG08L3N0cm9uZz4gaW1wbGVtZW50YXRpb24gaXMgdG8KKyAgICBwcm92aWRlIGEgbWVjaGFuaXNtIGJ5IHdoaWNoIFRvbWNhdCA1IGNhbiBhY3F1aXJlIGluZm9ybWF0aW9uIG5lZWRlZAorICAgIHRvIGF1dGhlbnRpY2F0ZSB3ZWIgYXBwbGljYXRpb24gdXNlcnMsIGFuZCBkZWZpbmUgdGhlaXIgc2VjdXJpdHkgcm9sZXMsCisgICAgZnJvbSBhIGRpcmVjdG9yeSBzZXJ2ZXIgb3Igb3RoZXIgc2VydmljZSBhY2Nlc3NlZCB2aWEgSk5ESSBBUElzLiAgRm9yCisgICAgaW50ZWdyYXRpb24gd2l0aCBDYXRhbGluYSwgdGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUKKyAgICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtPC9jb2RlPiBpbnRlcmZhY2UuPC9wPgorCisgICAgPHA+VGhpcyBzcGVjaWZpY2F0aW9uIHJlZmxlY3RzIGEgY29tYmluYXRpb24gb2YgZnVuY3Rpb25hbGl0eSB0aGF0IGlzCisgICAgYWxyZWFkeSBwcmVzZW50IGluIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpORElSZWFsbTwvY29kZT4KKyAgICBjbGFzcywgYXMgd2VsbCBhcyByZXF1aXJlbWVudHMgZm9yIGVuaGFuY2VtZW50cyB0aGF0IGhhdmUgYmVlbgorICAgIGRpc2N1c3NlZC4gIFdoZXJlIGFwcHJvcHJpYXRlLCByZXF1aXJlbWVudHMgc3RhdGVtZW50cyBhcmUgbWFya2VkCisgICAgPGVtPltDdXJyZW50XTwvZW0+IGFuZCA8ZW0+W1JlcXVlc3RlZF08L2VtPiB0byBkaXN0aW5ndWlzaCB0aGVtLjwvcD4KKworICAgIDxwPlRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGlzIGZ1bmN0aW9uYWwgc3BlY2lmaWNhdGlvbiBpcworICAgIDxzdHJvbmc+UFJPUE9TRUQ8L3N0cm9uZz4uICBJdCBoYXMgbm90IHlldCBiZWVuIGRpc2N1c3NlZCBhbmQKKyAgICBhZ3JlZWQgdG8gb24gdGhlIFRPTUNBVC1ERVYgbWFpbGluZyBsaXN0LjwvcD4KKworICAgIDxwPlRoZSBjb2RlIGluIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgPGNvZGU+Sk5ESVJlYWxtPC9jb2RlPiwgYW5kIHRoZQorICAgIGlkZWFzIGV4cHJlc3NlZCBpbiB0aGlzIGZ1bmN0aW9uYWwgc3BlY2lmaWNhdGlvbiwgYXJlIHRoZSByZXN1bHRzIG9mCisgICAgY29udHJpYnV0aW9ucyBmcm9tIG1hbnkgaW5kaXZpZHVhbHMsIGluY2x1ZGluZyAoYWxwaGFiZXRpY2FsbHkpOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkhvbG1hbiwgSm9obiAmbHQ7ai5nLmhvbG1hbkBxbXcuYWMudWsmZ3Q7PC9saT4KKyAgICA8bGk+TG9ja2hhcnQsIEVsbGVuICZsdDtlbG9ja2hhcnRAaG9tZS5jb20mZ3Q7PC9saT4KKyAgICA8bGk+TWNDbGFuYWhhbiwgQ3JhaWcgJmx0O2NyYWlnbWNjQGFwYWNoZS5vcmcmZ3Q7PC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkV4dGVybmFsIFNwZWNpZmljYXRpb25zIj4KKworICAgIDxwPlRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uYWxpdHkgZGVwZW5kcyBvbiB0aGUgZm9sbG93aW5nCisgICAgZXh0ZXJuYWwgc3BlY2lmaWNhdGlvbnM6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qbmRpLyI+SmF2YSBOYW1pbmcgYW5kCisgICAgICAgIERpcmVjdG9yeSBJbnRlcmZhY2U8L2E+ICh2ZXJzaW9uIDEuMi4xIG9yIGxhdGVyKTwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJJbXBsZW1lbnRhdGlvbiBSZXF1aXJlbWVudHMiPgorCisgICAgPHA+VGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb25hbGl0eSBzaGFsbCBjb25mb3JtIHRvIHRoZQorICAgIGZvbGxvd2luZyByZXF1aXJlbWVudHM6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+QmUgcmVhbGl6ZWQgaW4gb25lIG9yIG1vcmUgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy48L2xpPgorICAgIDxsaT5JbXBsZW1lbnQgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG08L2NvZGU+IGludGVyZmFjZS4KKyAgICAgICAgW0N1cnJlbnRdPC9saT4KKyAgICA8bGk+SW1wbGVtZW50IHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTwvY29kZT4KKyAgICAgICAgaW50ZXJmYWNlLiAgW0N1cnJlbnRdPC9saT4KKyAgICA8bGk+U3ViY2xhc3MgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uUmVhbG1CYXNlPC9jb2RlPgorICAgICAgICBiYXNlIGNsYXNzLjwvbGk+CisgICAgPGxpPkxpdmUgaW4gdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG08L2NvZGU+IHBhY2thZ2UuCisgICAgICAgIFtDdXJyZW50XTwvbGk+CisgICAgPGxpPlN1cHBvcnQgYSBjb25maWd1cmFibGUgZGVidWdnaW5nIGRldGFpbCBsZXZlbC4gW0N1cnJlbnRdPC9saT4KKyAgICA8bGk+TG9nIGRlYnVnZ2luZyBhbmQgb3BlcmF0aW9uYWwgbWVzc2FnZXMgKHN1aXRhYmx5IGludGVybmF0aW9uYWxpemVkKQorICAgICAgICB2aWEgdGhlIDxjb2RlPmdldENvbnRhaW5lcigpLmxvZygpPC9jb2RlPiBtZXRob2QuIFtDdXJyZW50XTwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkRlcGVuZGVuY2llcyI+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJFbnZpcm9ubWVudGFsIERlcGVuZGVuY2llcyI+CisKKyAgICA8cD5UaGUgZm9sbG93aW5nIGVudmlyb25tZW50YWwgZGVwZW5kZW5jaWVzIG11c3QgYmUgbWV0IGluIG9yZGVyIGZvcgorICAgIEpORElSZWFsbSB0byBvcGVyYXRlIGNvcnJlY3RseTo8L3A+CisgICAgPHVsPgorICAgIDxsaT5UaGUgZGVzaXJlIHRvIHV0aWxpemUgSk5ESVJlYWxtIG11c3QgYmUgcmVnaXN0ZXJlZCBpbgorICAgICAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3NlcnZlci54bWw8L2NvZGU+LCBpbiBhCisgICAgICAgIDxjb2RlPiZsdDtSZWFsbSZndDs8L2NvZGU+IGVsZW1lbnQgdGhhdCBpcyBuZXN0ZWQgaW5zaWRlIGEKKyAgICAgICAgY29ycmVzcG9uZGluZyA8Y29kZT4mbHQ7RW5naW5lJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtIb3N0Jmd0OzwvY29kZT4sCisgICAgICAgIG9yIDxjb2RlPiZsdDtDb250ZXh0Jmd0OzwvY29kZT4gZWxlbWVudC48L2xpPgorICAgIDxsaT5JZiB0aGUgPGVtPkFkbWluaXN0cmF0b3IgTG9naW48L2VtPiBvcGVyYXRpb25hbCBtb2RlIGlzIHNlbGVjdGVkLAorICAgICAgICB0aGUgY29uZmlndXJlZCBhZG1pbmlzdHJhdG9yIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBtdXN0IGJlIGNvbmZpZ3VyZWQKKyAgICAgICAgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IHNlcnZlci48L2xpPgorICAgIDxsaT5JZiB0aGUgPGVtPlVzZXJuYW1lIExvZ2luPC9lbT4gb3BlcmF0aW9uYWwgbW9kZSBpcyBzZWxlY3RlZCwKKyAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IHNlcnZlciBtdXN0IGJlIGNvbmZpZ3VyZWQgdG8gYWNjZXB0CisgICAgICAgIGxvZ2lucyB3aXRoIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgdGhhdCB3aWxsIGJlIHBhc3NlZCB0bworICAgICAgICA8Y29kZT5KTkRJUmVhbG08L2NvZGU+IGJ5IHRoZSBhcHByb3ByaWF0ZSA8Y29kZT5BdXRoZW50aWNhdG9yPC9jb2RlPi4KKyAgICAgICAgPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbnRhaW5lciBEZXBlbmRlbmNpZXMiPgorCisgICAgPHA+Q29ycmVjdCBvcGVyYXRpb24gb2YgSk5ESVJlYWxtIGRlcGVuZHMgb24gdGhlIGZvbGxvd2luZworICAgIHNwZWNpZmljIGZlYXR1cmVzIG9mIHRoZSBzdXJyb3VuZGluZyBjb250YWluZXI6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+SW50ZXJhY3Rpb25zIHdpdGggPGNvZGU+Sk5ESVJlYWxtPC9jb2RlPiB3aWxsIGJlIGluaXRpYXRlZCBieQorICAgICAgICB0aGUgYXBwcm9wcmlhdGUgPGNvZGU+QXV0aGVudGljYXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24sIGJhc2VkCisgICAgICAgIG9uIHRoZSBsb2dpbiBtZXRob2QgdGhhdCBpcyBzZWxlY3RlZC48L2xpPgorICAgIDxsaT48Y29kZT5KTkRJUmVhbG08L2NvZGU+IG11c3QgaGF2ZSB0aGUgSk5ESSBBUEkgY2xhc3NlcyBhdmFpbGFibGUKKyAgICAgICAgdG8gaXQuICBGb3IgYSBKREsgMS4yIGNvbnRhaW5lciwgdGhhdCBtZWFucyA8Y29kZT5qbmRpLmphcjwvY29kZT4KKyAgICAgICAgYW5kIHRoZSBhcHByb3ByaWF0ZSBpbXBsZW1lbnRhdGlvbiAoc3VjaCBhcyA8Y29kZT5sZGFwLmphcjwvY29kZT4pCisgICAgICAgIG11c3QgYmUgcGxhY2VkIGluIHRoZSA8Y29kZT5zZXJ2ZXIvbGliPC9jb2RlPiBkaXJlY3RvcnkuPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRnVuY3Rpb25hbGl0eSI+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJPcGVyYXRpb25hbCBNb2RlcyI+CisKKyAgICA8cD5UaGUgY29tcGxldGVkIDxjb2RlPkpORElSZWFsbTwvY29kZT4gbXVzdCBzdXBwb3J0IHR3byBtYWpvciBvcGVyYXRpb25hbAorICAgIG1vZGVzIGluIG9yZGVyIHRvIHN1cHBvcnQgYWxsIG9mIHRoZSByZXF1aXJlZCB1c2UgY2FzZXMuICBGb3IgdGhlIHB1cnBvc2VzCisgICAgb2YgdGhpcyBkb2N1bWVudCwgdGhlIG1vZGVzIGFyZSBjYWxsZWQgPGVtPmFkbWluaXN0cmF0b3IgbG9naW48L2VtPiBhbmQKKyAgICA8ZW0+VXNlcm5hbWUgTG9naW48L2VtPi4gIFRoZXkgYXJlIGRlc2NyaWJlZCBmdXJ0aGVyIGluIHRoZSBmb2xsb3dpbmcKKyAgICBwYXJhZ3JhcGhzLjwvcD4KKworICAgIDxwPkZvciA8ZW0+QWRtaW5pc3RyYXRvciBMb2dpbjwvZW0+IG1vZGUsIDxjb2RlPkpORElSZWFsbTwvY29kZT4gd2lsbCBiZQorICAgIGNvbmZpZ3VyZWQgdG8gZXN0YWJsaXNoIG9uZSBvciBtb3JlIGNvbm5lY3Rpb25zICh1c2luZyBhIGNvbm5lY3Rpb24gcG9vbCkKKyAgICB0byBhbiBhcHByb3ByaWF0ZSBkaXJlY3Rvcnkgc2VydmVyLCB1c2luZyBKTkRJIEFQSXMsIHVuZGVyIGEgInN5c3RlbQorICAgIGFkbWluaXN0cmF0b3IiIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4gIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgYXBwcm9hY2gKKyAgICBub3JtYWxseSB1c2VkIHRvIGNvbmZpZ3VyZSA8Y29kZT5KREJDUmVhbG08L2NvZGU+IHRvIGFjY2VzcyBhdXRoZW50aWNhdGlvbgorICAgIGFuZCBhY2Nlc3MgY29udHJvbCBpbmZvcm1hdGlvbiBpbiBhIGRhdGFiYXNlLiAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZQorICAgIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHVzZXJuYW1lIGFuZCBwYXNzd29yZCB0aGF0IGFyZSBjb25maWd1cmVkIHByb3ZpZGUKKyAgICBzdWZmaWNpZW50IHByaXZpbGVnZXMgd2l0aGluIHRoZSBkaXJlY3Rvcnkgc2VydmVyIHRvIHJlYWQgKGJ1dCBub3QgbW9kaWZ5KQorICAgIHRoZSB1c2VybmFtZSwgcGFzc3dvcmQsIGFuZCBhc3NpZ25lZCByb2xlcyBmb3IgZWFjaCB2YWxpZCB1c2VyIG9mIHRoZQorICAgIHdlYiBhcHBsaWNhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyA8Y29kZT5SZWFsbTwvY29kZT4uICBUaGUgcGFzc3dvcmQKKyAgICBjYW4gYmUgc3RvcmVkIGluIGNsZWFydGV4dCwgb3IgaW4gb25lIG9mIHRoZSBkaWdlc3RlZCBtb2RlcyBzdXBwb3J0ZWQgYnkKKyAgICB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5SZWFsbUJhc2U8L2NvZGU+IGJhc2UgY2xhc3MuPC9wPgorCisgICAgPHA+Rm9yIDxlbT5Vc2VybmFtZSBMb2dpbjwvZW0+IG1vZGUsIDxjb2RlPkpORElSZWFsbTwvY29kZT4gZG9lcyBub3QKKyAgICBub3JtYWxseSByZW1haW4gY29ubmVjdGVkIHRvIHRoZSBkaXJlY3Rvcnkgc2VydmVyLiAgSW5zdGVhZCwgd2hlbmV2ZXIgYQorICAgIHVzZXIgaXMgdG8gYmUgYXV0aGVudGljYXRlZCwgYSBjb25uZWN0aW9uIHRvIHRoZSBkaXJlY3Rvcnkgc2VydmVyCisgICAgKHVzaW5nIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgcmVjZWl2ZWQgZnJvbSB0aGUgYXV0aGVudGljYXRvcikgaXMKKyAgICBhdHRlbXB0ZWQuICBJZiB0aGlzIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlIHVzZXIgaXMgYXNzdW1lZCB0byBiZQorICAgIHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkLiAgVGhpcyBjb25uZWN0aW9uIGlzIHRoZW4gdXRpbGl6ZWQgdG8gcmVhZAorICAgIHRoZSBjb3JyZXNwb25kaW5nIHNlY3VyaXR5IHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIsIGFuZCB0aGUKKyAgICBjb25uZWN0aW9uIGlzIHRoZW4gYnJva2VuLjwvcD4KKworICAgIDxwPjxzdHJvbmc+Tk9URTwvc3Ryb25nPiAtIDxlbT5Vc2VybmFtZSBMb2dpbjwvZW0+IG1vZGUgY2Fubm90IGJlIHVzZWQKKyAgICBpZiB5b3UgaGF2ZSBzZWxlY3RlZCBsb2dpbiBtZXRob2QgPGNvZGU+RElHRVNUPC9jb2RlPiBpbiB5b3VyIHdlYgorICAgIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciAoPGNvZGU+d2ViLnhtbDwvY29kZT4pIGZpbGUuICBUaGlzCisgICAgcmVzdHJpY3Rpb24gZXhpc3RzIGJlY2F1c2UgdGhlIGNsZWFydGV4dCBwYXNzd29yZCBpcyBuZXZlciBhdmFpbGFibGUKKyAgICB0byB0aGUgY29udGFpbmVyLCBzbyBpdCBpcyBub3QgcG9zc2libGUgdG8gYmluZCB0byB0aGUgZGlyZWN0b3J5IHNlcnZlcgorICAgIHVzaW5nIHRoZSB1c2VyJ3MgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLjwvcD4KKworICAgIDxwPkJlY2F1c2UgdGhlc2Ugb3BlcmF0aW9uYWwgbW9kZXMgd29yayBzbyBkaWZmZXJlbnRseSwgdGhlIGZ1bmN0aW9uYWxpdHkKKyAgICBmb3IgZWFjaCBtb2RlIHdpbGwgYmUgZGVzY3JpYmVkIHNlcGFyYXRlbHkuICBXaGV0aGVyIG9yIG5vdCBib3RoIG1vZGVzCisgICAgYXJlIGFjdHVhbGx5IHN1cHBvcnRlZCBieSBhIHNpbmdsZSBjbGFzcyAodmVyc3VzIGEgY2xhc3MgcGVyIG1vZGUpIGlzCisgICAgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIGxlZnQgdG8gdGhlIGRlc2lnbmVyLjwvcD4KKworICAgIDxwPjxzdHJvbmc+Tk9URTwvc3Ryb25nPiAtIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9ubHkgaW1wbGVtZW50cworICAgIHBhcnQgb2YgdGhlIDxlbT5BZG1pbmlzdHJhdG9yIExvb2t1cDwvZW0+IG1vZGUgcmVxdWlyZW1lbnRzLiAgSXQgZG9lcworICAgIG5vdCBzdXBwb3J0IHRoZSA8ZW0+VXNlcm5hbWUgTG9va3VwPC9lbT4gbW9kZSBhdCBhbGwsIGF0IHRoaXMgcG9pbnQuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkFkbWluaXN0cmF0b3IgTG9naW4gTW9kZSBGdW5jdGlvbmFsaXR5Ij4KKworCisgICAgPGgzPkNvbmZpZ3VyYWJsZSBQcm9wZXJ0aWVzPC9oMz4KKworICAgIDxwPlRoZSBpbXBsZW1lbnRhdGlvbiBzaGFsbCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcworICAgIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBKYXZhQmVhbnMgcHJvcGVydHkgc2V0dGVyczo8L3A+CisgICAgPHVsPgorICAgIDxsaT48Y29kZT5jb25uZWN0aW9uVVJMPC9jb2RlPiAtIFVSTCBvZiB0aGUgZGlyZWN0b3J5IHNlcnZlciB3ZSB3aWxsCisgICAgICAgIGJlIGNvbnRhY3RpbmcuPC9saT4KKyAgICA8bGk+PGNvZGU+Y29udGV4dEZhY3Rvcnk8L2NvZGU+IC0gRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIEpOREkKKyAgICAgICAgY29udGV4dCBmYWN0b3J5IHVzZWQgdG8gcmV0cmlldmUgb3VyIEluaXRpYWxDb250ZXh0LgorICAgICAgICBbY29tLnN1bi5qbmRpLmxkYXAuTGRhcEN0eEZhY3RvcnldPC9saT4KKyAgICA8bGk+QWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgcmVxdWlyZWQgdG8gZXN0YWJsaXNoIHRoZQorICAgICAgICBhcHByb3ByaWF0ZSBjb25uZWN0aW9uLiAgW1JlcXVlc3RlZF08L2xpPgorICAgIDxsaT5Db25uZWN0aW9uIHBvb2wgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLiAgW1JlcXVlc3RlZF08L2xpPgorICAgIDxsaT5Db25maWd1cmF0aW9uIHByb3BlcnRpZXMgZGVmaW5pbmcgaG93IGEgcGFydGljdWxhciB1c2VyIGlzCisgICAgICAgIGF1dGhlbnRpY2F0ZWQuICBUaGUgZm9sbG93aW5nIGNhcGFiaWxpdGllcyBzaG91bGQgYmUgc3VwcG9ydGVkOgorICAgICAgICA8dWw+CisgICAgICAgIDxsaT5TdWJzdGl0dXRlIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUgaW50byBhIHN0cmluZy4gIFtSZXF1ZXN0ZWRdPC9saT4KKyAgICAgICAgPGxpPlJldHJpZXZlIHRoZSBkaXN0aW5ndWlzaGVkIG5hbWUgKEROKSBvZiBhbiBhdXRob3JpemVkIHVzZXIgdmlhIGFuCisgICAgICAgICAgICBMREFQIHNlYXJjaCBzdHJpbmcgd2l0aCBhIHJlcGxhY2VtZW50IHBsYWNlaG9sZGVyIGZvciB0aGUKKyAgICAgICAgICAgIHVzZXJuYW1lLCBhbmQgY29tcGFyaXNvbiBvZiB0aGUgcGFzc3dvcmQgdG8gYSBjb25maWd1cmFibGUKKyAgICAgICAgICAgIGF0dHJpYnV0ZSByZXRyaWV2ZWQgZnJvbSB0aGUgc2VhcmNoIHJlc3VsdC4gIFtDdXJyZW50XTwvbGk+CisgICAgICAgIDwvdWw+PC9saT4KKyAgICA8bGk+Q29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGRlZmluaW5nIGhvdyB0aGUgcm9sZXMgYXNzb2NpYXRlZCB3aXRoIGEKKyAgICAgICAgcGFydGljdWxhciBhdXRoZW50aWNhdGVkIHVzZXIgY2FuIGJlIHJldHJpZXZlZC4gIFRoZSBmb2xsb3dpbmcKKyAgICAgICAgYXBwcm9hY2hlcyBzaG91bGQgYmUgc3VwcG9ydGVkOgorICAgICAgICA8dWw+CisgICAgICAgIDxsaT5SZXRyaWV2ZSBhIHNwZWNpZmllZCBhdHRyaWJ1dGUgKHBvc3NpYmx5IG11bHRpLXZhbHVlZCkKKyAgICAgICAgICAgIGZyb20gYW4gTERBUCBzZWFyY2ggZXhwcmVzc2lvbiwKKyAgICAgICAgICAgIHdpdGggYSByZXBsYWNlbWVudCBwbGFjZWhvbGRlciBmb3IgdGhlIEROIG9mIHRoZSB1c2VyLgorICAgICAgICAgICAgW0N1cnJlbnRdPC9saT4KKyAgICAgICAgPGxpPlJldHJpZXZlIGEgc2V0IG9mIHJvbGUgbmFtZXMgdGhhdCBhcmUgZGVmaW5lZCBpbXBsaWNpdGx5IChieQorICAgICAgICAgICAgc2VsZWN0aW5nIHByaW5jaXBhbHMgdGhhdCBtYXRjaCBhIHNlYXJjaCBwYXR0ZXJuKSByYXRoZXIgdGhhbgorICAgICAgICAgICAgZXhwbGljaXRseSAoYnkgZmluZGluZyBhIHBhcnRpY3VsYXIgYXR0cmlidXRlIHZhbHVlKS4KKyAgICAgICAgICAgIFtSZXF1ZXN0ZWRdPC9saT4KKyAgICAgICAgPC91bD48L2xpPgorICAgIDwvdWw+CisKKyAgICA8aDM+TGlmZWN5Y2xlIEZ1bmN0aW9uYWxpdHk8L2gzPgorCisgICAgPHA+VGhlIGZvbGxvd2luZyBwcm9jZXNzaW5nIG11c3QgYmUgcGVyZm9ybWVkIHdoZW4gdGhlIDxjb2RlPnN0YXJ0KCk8L2NvZGU+CisgICAgbWV0aG9kIGlzIGNhbGxlZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT5Fc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIHRoZSBjb25maWd1cmVkIGRpcmVjdG9yeSBzZXJ2ZXIsIHVzaW5nIHRoZQorICAgICAgICBjb25maWd1cmVkIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4gIFtDdXJyZW50XTwvbGk+CisgICAgPGxpPkNvbmZpZ3VyZSBhbmQgZXN0YWJsaXNoIGEgY29ubmVjdGlvbiBwb29sIG9mIGNvbm5lY3Rpb25zIHRvIHRoZQorICAgICAgICBkaXJlY3Rvcnkgc2VydmVyLiAgW1JlcXVlc3RlZF08L2xpPgorICAgIDwvdWw+CisKKyAgICA8cD5UaGUgZm9sbG93aW5nIHByb2Nlc3NpbmcgbXVzdCBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgPGNvZGU+c3RvcCgpPC9jb2RlPgorICAgIG1ldGhvZCBpcyBjYWxsZWQ6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+Q2xvc2UgYW55IG9wZW5lZCBjb25uZWN0aW9ucyB0byB0aGUgZGlyZWN0b3J5IHNlcnZlci48L2xpPgorICAgIDwvdWw+CisKKworICAgIDxoMz5NZXRob2QgYXV0aGVudGljYXRlKCkgRnVuY3Rpb25hbGl0eTwvaDM+CisKKyAgICA8cD5XaGVuIDxjb2RlPmF1dGhlbnRpY2F0ZSgpPC9jb2RlPiBpcyBjYWxsZWQsIHRoZSBmb2xsb3dpbmcgcHJvY2Vzc2luZworICAgIGlzIHJlcXVpcmVkOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkFjcXVpcmUgdGhlIG9uZSBhbmQgb25seSBjb25uZWN0aW9uIFtDdXJyZW50XSBvciBhY3F1aXJlIGEgY29ubmVjdGlvbgorICAgICAgICBmcm9tIHRoZSBjb25uZWN0aW9uIHBvb2wgW1JlcXVlc3RlZF0uPC9saT4KKyAgICA8bGk+QXV0aGVudGljYXRlIHRoZSB1c2VyIGJ5IHJldHJpZXZpbmcgdGhlIHVzZXIncyBEaXN0aW5ndWlzaGVkIE5hbWUsCisgICAgICAgIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLjwvbGk+CisgICAgPGxpPklmIHRoZSB1c2VyIHdhcyBub3QgYXV0aGVudGljYXRlZCwgcmVsZWFzZSB0aGUgYWxsb2NhdGVkIGNvbm5lY3Rpb24KKyAgICAgICAgYW5kIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi48L2xpPgorICAgIDxsaT5BY3F1aXJlIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGFzc2lnbmVkIHRvIHRoZQorICAgICAgICBhdXRoZW50aWNhdGVkIHVzZXIuPC9saT4KKyAgICA8bGk+Q29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIGNsYXNzCisgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uR2VuZXJpY1ByaW5jaXBhbDwvY29kZT4sIHBhc3NpbmcgYXMKKyAgICAgICAgY29uc3RydWN0b3IgYXJndW1lbnRzOiAgdGhpcyByZWFsbSBpbnN0YW5jZSwgdGhlIGF1dGhlbnRpY2F0ZWQKKyAgICAgICAgdXNlcm5hbWUsIGFuZCBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHRoZSBzZWN1cml0eSByb2xlcyBhc3NvY2lhdGVkCisgICAgICAgIHdpdGggdGhpcyB1c2VyLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+V0FSTklORzwvc3Ryb25nPiAtIERvIG5vdCBhdHRlbXB0IHRvIGNhY2hlIGFuZCByZXVzZSBwcmV2aW91cworICAgICAgICA8Y29kZT5HZW5lcmljUHJpbmNpcGFsPC9jb2RlPiBvYmplY3RzIGZvciBhIHBhcnRpY3VsYXIgdXNlciwgYmVjYXVzZQorICAgICAgICB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGRpcmVjdG9yeSBzZXJ2ZXIgbWlnaHQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZQorICAgICAgICBsYXN0IHRpbWUgdGhpcyB1c2VyIHdhcyBhdXRoZW50aWNhdGVkLjwvbGk+CisgICAgPGxpPlJldHVybiB0aGUgbmV3bHkgY29uc3RydWN0ZWQgPGNvZGU+R2VuZXJpY1ByaW5jaXBhbDwvY29kZT4uPC9saT4KKyAgICA8L3VsPgorCisKKyAgICA8aDM+TWV0aG9kIGhhc1JvbGUoKSBGdW5jdGlvbmFsaXR5PC9oMz4KKworICAgIDxwPldoZW4gPGNvZGU+aGFzUm9sZSgpPC9jb2RlPiBpcyBjYWxsZWQsIHRoZSBmb2xsb3dpbmcgcHJvY2Vzc2luZworICAgIGlzIHJlcXVpcmVkOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPlRoZSA8Y29kZT5wcmluY2lwYWw8L2NvZGU+IHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IFNIT1VMRAorICAgICAgICBiZSBvbmUgdGhhdCB3ZSByZXR1cm5lZCAoaW5zdGFuY2VvZiBjbGFzcworICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkdlbmVyaWNQcmluY2lwYWw8L2NvZGU+LCB3aXRoIGEKKyAgICAgICAgPGNvZGU+cmVhbG08L2NvZGU+IHByb3BlcnR5IHRoYXQgaXMgZXF1YWwgdG8gb3VyIGluc3RhbmNlLjwvbGk+CisgICAgPGxpPklmIHRoZSBwYXNzZWQgPGNvZGU+cHJpbmNpcGFsPC9jb2RlPiBtZWV0cyB0aGVzZSBjcml0ZXJpYSwgY2hlY2sKKyAgICAgICAgdGhlIHNwZWNpZmllZCByb2xlIGFnYWluc3QgdGhlIGxpc3QgcmV0dXJuZWQgYnkKKyAgICAgICAgPGNvZGU+Z2V0Um9sZXMoKTwvY29kZT4sIGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlCisgICAgICAgIHNwZWNpZmllZCByb2xlIGlzIGluY2x1ZGVkOyBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4uPC9saT4KKyAgICA8bGk+SWYgdGhlIHBhc3NlZCA8Y29kZT5wcmluY2lwYWw8L2NvZGU+IGRvZXMgbm90IG1lZXQgdGhlc2UgY3JpdGVyaWEsCisgICAgICAgIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4uPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlVzZXJuYW1lIExvZ2luIE1vZGUgRnVuY3Rpb25hbGl0eSI+CisKKyAgICA8aDM+Q29uZmlndXJhYmxlIFByb3BlcnRpZXM8L2gzPgorCisgICAgPHA+VGhlIGltcGxlbWVudGF0aW9uIHNoYWxsIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzCisgICAgdGhhdCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIEphdmFCZWFucyBwcm9wZXJ0eSBzZXR0ZXJzOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPjxjb2RlPmNvbm5lY3Rpb25VUkw8L2NvZGU+IC0gVVJMIG9mIHRoZSBkaXJlY3Rvcnkgc2VydmVyIHdlIHdpbGwKKyAgICAgICAgYmUgY29udGFjdGluZy48L2xpPgorICAgIDxsaT48Y29kZT5jb250ZXh0RmFjdG9yeTwvY29kZT4gLSBGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgSk5ESQorICAgICAgICBjb250ZXh0IGZhY3RvcnkgdXNlZCB0byByZXRyaWV2ZSBvdXIgSW5pdGlhbENvbnRleHQuCisgICAgICAgIFtjb20uc3VuLmpuZGkubGRhcC5MZGFwQ3R4RmFjdG9yeV08L2xpPgorICAgIDxsaT5BZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyByZXF1aXJlZCB0byBlc3RhYmxpc2ggdGhlCisgICAgICAgIGFwcHJvcHJpYXRlIGNvbm5lY3Rpb24uICBbUmVxdWVzdGVkXTwvbGk+CisgICAgPGxpPkNvbm5lY3Rpb24gcG9vbCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuICBbUmVxdWVzdGVkXTwvbGk+CisgICAgPGxpPkNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBkZWZpbmluZyBpZiBhbmQgaG93IGEgdXNlciBtaWdodCBiZSBsb29rZWQKKyAgICAgICAgdXAgYmVmb3JlIGJpbmRpbmcgdG8gdGhlIGRpcmVjdG9yeSBzZXJ2ZXIuICBUaGUgZm9sbG93aW5nIGFwcHJvYWNoZXMKKyAgICAgICAgc2hvdWxkIGJlIHN1cHBvcnRlZDoKKyAgICAgICAgPHVsPgorICAgICAgICA8bGk+Tm8gcHJldmlvdXMgbG9va3VwIGlzIHJlcXVpcmVkIC0gdXNlcm5hbWUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyCisgICAgICAgICAgICBpcyB0aGUgc2FtZSBhcyB0aGF0IHVzZWQgdG8gYXV0aGVudGljYXRlIHRvIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICAgIHNlcnZlci48L2xpPgorICAgICAgICA8bGk+U3Vic3RpdHV0ZSB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lIGludG8gYSBzdHJpbmcuPC9saT4KKyAgICAgICAgPGxpPlNlYXJjaCB0aGUgZGlyZWN0b3J5IHNlcnZlciBiYXNlZCBvbiBjb25maWd1cmVkIGNyaXRlcmlhIHRvCisgICAgICAgICAgICByZXRyaWV2ZSB0aGUgZGlzdGluZ3Vpc2hlZCBuYW1lIG9mIHRoZSB1c2VyLCB0aGVuIGF0dGVtcHQgdG8KKyAgICAgICAgICAgIGJpbmQgd2l0aCB0aGF0IGRpc3Rpbmd1aXNoZWQgbmFtZS48L2xpPgorICAgICAgICA8L3VsPjwvbGk+CisgICAgPGxpPkNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBkZWZpbmluZyBob3cgdGhlIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCBhCisgICAgICAgIHBhcnRpY3VsYXIgYXV0aGVudGljYXRlZCB1c2VyIGNhbiBiZSByZXRyaWV2ZWQuICBUaGUgZm9sbG93aW5nCisgICAgICAgIGFwcHJvYWNoZXMgc2hvdWxkIGJlIHN1cHBvcnRlZDoKKyAgICAgICAgPHVsPgorICAgICAgICA8bGk+UmV0cmlldmUgYSBzcGVjaWZpZWQgYXR0cmlidXRlIChwb3NzaWJseSBtdWx0aS12YWx1ZWQpCisgICAgICAgICAgICBmcm9tIGFuIExEQVAgc2VhcmNoIGV4cHJlc3Npb24sCisgICAgICAgICAgICB3aXRoIGEgcmVwbGFjZW1lbnQgcGxhY2Vob2xkZXIgZm9yIHRoZSBETiBvZiB0aGUgdXNlci4KKyAgICAgICAgICAgIFtDdXJyZW50XTwvbGk+CisgICAgICAgIDwvdWw+PC9saT4KKyAgICA8L3VsPgorCisgICAgPGgzPkxpZmVjeWNsZSBGdW5jdGlvbmFsaXR5PC9oMz4KKworICAgIDxwPlRoZSBmb2xsb3dpbmcgcHJvY2Vzc2luZyBtdXN0IGJlIHBlcmZvcm1lZCB3aGVuIHRoZSA8Y29kZT5zdGFydCgpPC9jb2RlPgorICAgIG1ldGhvZCBpcyBjYWxsZWQ6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+Tm9uZSByZXF1aXJlZC48L2xpPgorICAgIDwvdWw+CisKKyAgICA8cD5UaGUgZm9sbG93aW5nIHByb2Nlc3NpbmcgbXVzdCBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgPGNvZGU+c3RvcCgpPC9jb2RlPgorICAgIG1ldGhvZCBpcyBjYWxsZWQ6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+Tm9uZSByZXF1aXJlZC48L2xpPgorICAgIDwvdWw+CisKKworICAgIDxoMz5NZXRob2QgYXV0aGVudGljYXRlKCkgRnVuY3Rpb25hbGl0eTwvaDM+CisKKyAgICA8cD5XaGVuIDxjb2RlPmF1dGhlbnRpY2F0ZSgpPC9jb2RlPiBpcyBjYWxsZWQsIHRoZSBmb2xsb3dpbmcgcHJvY2Vzc2luZworICAgIGlzIHJlcXVpcmVkOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkF0dGVtcHQgdG8gYmluZCB0byB0aGUgZGlyZWN0b3J5IHNlcnZlciwgdXNpbmcgdGhlIHVzZXJuYW1lIGFuZAorICAgICAgICBwYXNzd29yZCBwcm92aWRlZCBieSB0aGUgdXNlci48L2xpPgorICAgIDxsaT5JZiB0aGUgdXNlciB3YXMgbm90IGF1dGhlbnRpY2F0ZWQsIHJlbGVhc2UgdGhlIGFsbG9jYXRlZCBjb25uZWN0aW9uCisgICAgICAgIGFuZCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uPC9saT4KKyAgICA8bGk+QWNxdWlyZSBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHRoZSBzZWN1cml0eSByb2xlcyBhc3NpZ25lZCB0byB0aGUKKyAgICAgICAgYXV0aGVudGljYXRlZCB1c2VyLjwvbGk+CisgICAgPGxpPkNvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcworICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkdlbmVyaWNQcmluY2lwYWw8L2NvZGU+LCBwYXNzaW5nIGFzCisgICAgICAgIGNvbnN0cnVjdG9yIGFyZ3VtZW50czogIHRoaXMgcmVhbG0gaW5zdGFuY2UsIHRoZSBhdXRoZW50aWNhdGVkCisgICAgICAgIHVzZXJuYW1lLCBhbmQgYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgYXNzb2NpYXRlZAorICAgICAgICB3aXRoIHRoaXMgdXNlci48L2xpPgorICAgIDxsaT48c3Ryb25nPldBUk5JTkc8L3N0cm9uZz4gLSBEbyBub3QgYXR0ZW1wdCB0byBjYWNoZSBhbmQgcmV1c2UgcHJldmlvdXMKKyAgICAgICAgPGNvZGU+R2VuZXJpY1ByaW5jaXBhbDwvY29kZT4gb2JqZWN0cyBmb3IgYSBwYXJ0aWN1bGFyIHVzZXIsIGJlY2F1c2UKKyAgICAgICAgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBkaXJlY3Rvcnkgc2VydmVyIG1pZ2h0IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUKKyAgICAgICAgbGFzdCB0aW1lIHRoaXMgdXNlciB3YXMgYXV0aGVudGljYXRlZC48L2xpPgorICAgIDxsaT5SZXR1cm4gdGhlIG5ld2x5IGNvbnN0cnVjdGVkIDxjb2RlPkdlbmVyaWNQcmluY2lwYWw8L2NvZGU+LjwvbGk+CisgICAgPC91bD4KKworCisgICAgPGgzPk1ldGhvZCBoYXNSb2xlKCkgRnVuY3Rpb25hbGl0eTwvaDM+CisKKyAgICA8cD5XaGVuIDxjb2RlPmhhc1JvbGUoKTwvY29kZT4gaXMgY2FsbGVkLCB0aGUgZm9sbG93aW5nIHByb2Nlc3NpbmcKKyAgICBpcyByZXF1aXJlZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT5UaGUgPGNvZGU+cHJpbmNpcGFsPC9jb2RlPiB0aGF0IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCBTSE9VTEQKKyAgICAgICAgYmUgb25lIHRoYXQgd2UgcmV0dXJuZWQgKGluc3RhbmNlb2YgY2xhc3MKKyAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5HZW5lcmljUHJpbmNpcGFsPC9jb2RlPiwgd2l0aCBhCisgICAgICAgIDxjb2RlPnJlYWxtPC9jb2RlPiBwcm9wZXJ0eSB0aGF0IGlzIGVxdWFsIHRvIG91ciBpbnN0YW5jZS48L2xpPgorICAgIDxsaT5JZiB0aGUgcGFzc2VkIDxjb2RlPnByaW5jaXBhbDwvY29kZT4gbWVldHMgdGhlc2UgY3JpdGVyaWEsIGNoZWNrCisgICAgICAgIHRoZSBzcGVjaWZpZWQgcm9sZSBhZ2FpbnN0IHRoZSBsaXN0IHJldHVybmVkIGJ5CisgICAgICAgIDxjb2RlPmdldFJvbGVzKCk8L2NvZGU+LCBhbmQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZQorICAgICAgICBzcGVjaWZpZWQgcm9sZSBpcyBpbmNsdWRlZDsgb3RoZXJ3aXNlLCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LjwvbGk+CisgICAgPGxpPklmIHRoZSBwYXNzZWQgPGNvZGU+cHJpbmNpcGFsPC9jb2RlPiBkb2VzIG5vdCBtZWV0IHRoZXNlIGNyaXRlcmlhLAorICAgICAgICByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LjwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJUZXN0YWJsZSBBc3NlcnRpb25zIj4KKworICA8cD5JbiBhZGRpdGlvbiB0aGUgdGhlIGFzc2VydGlvbnMgaW1wbGllZCBieSB0aGUgZnVuY3Rpb25hbGl0eSByZXF1aXJlbWVudHMKKyAgbGlzdGVkIGFib3ZlLCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYXNzZXJ0aW9ucyBzaGFsbCBiZSB0ZXN0ZWQgdG8KKyAgdmFsaWRhdGUgdGhlIGJlaGF2aW9yIG9mIDxjb2RlPkpORElSZWFsbTwvY29kZT46PC9wPgorICA8dWw+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9mcy1tZW1vcnktcmVhbG0ueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtbWVtb3J5LXJlYWxtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQ4YWI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtbWVtb3J5LXJlYWxtLnhtbApAQCAtMCwwICsxLDIzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImZzLW1lbW9yeS1yZWFsbS5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPk1lbW9yeVJlYWxtPC90aXRsZT4KKyAgICA8cmV2aXNpb24+JElkJDwvcmV2aXNpb24+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICAgIDxwPlRoZSBwdXJwb3NlIG9mIHRoZSA8c3Ryb25nPk1lbW9yeVJlYWxtPC9zdHJvbmc+IGltcGxlbWVudGF0aW9uIGlzIHRvCisgICAgcHJvdmlkZSBhIG1lY2hhbmlzbSBieSB3aGljaCBUb21jYXQgNSBjYW4gYWNxdWlyZSBpbmZvcm1hdGlvbiBuZWVkZWQKKyAgICB0byBhdXRoZW50aWNhdGUgd2ViIGFwcGxpY2F0aW9uIHVzZXJzLCBhbmQgZGVmaW5lIHRoZWlyIHNlY3VyaXR5IHJvbGVzLAorICAgIGZyb20gYSBzaW1wbGUgdGV4dC1iYXNlZCBjb25maWd1cmF0aW9uIGZpbGUgaW4gWE1MIGZvcm1hdC4gIFRoaXMgaXMKKyAgICBpbnRlbmRlZCB0byBzaW1wbGlmeSB0aGUgaW5pdGlhbCBpbnN0YWxsYXRpb24gYW5kIG9wZXJhdGlvbiBvZiBUb21jYXQgNSwKKyAgICB3aXRob3V0IHRoZSBjb21wbGV4aXR5IG9mIGNvbmZpZ3VyaW5nIGEgZGF0YWJhc2Ugb3IgZGlyZWN0b3J5IHNlcnZlcgorICAgIGJhc2VkIFJlYWxtLiAgSXQgaXMgbm90IGludGVuZGVkIGZvciBwcm9kdWN0aW9uIHVzZS48L3A+CisKKyAgICA8cD5UaGlzIHNwZWNpZmljYXRpb24gcmVmbGVjdHMgYSBjb21iaW5hdGlvbiBvZiBmdW5jdGlvbmFsaXR5IHRoYXQgaXMKKyAgICBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uTWVtb3J5UmVhbG08L2NvZGU+CisgICAgY2xhc3MsIGFzIHdlbGwgYXMgcmVxdWlyZW1lbnRzIGZvciBlbmhhbmNlbWVudHMgdGhhdCBoYXZlIGJlZW4KKyAgICBkaXNjdXNzZWQuICBXaGVyZSBhcHByb3ByaWF0ZSwgcmVxdWlyZW1lbnRzIHN0YXRlbWVudHMgYXJlIG1hcmtlZAorICAgIDxlbT5bQ3VycmVudF08L2VtPiBhbmQgPGVtPltSZXF1ZXN0ZWRdPC9lbT4gdG8gZGlzdGluZ3Vpc2ggdGhlbS48L3A+CisKKyAgICA8cD5UaGUgY3VycmVudCBzdGF0dXMgb2YgdGhpcyBmdW5jdGlvbmFsIHNwZWNpZmljYXRpb24gaXMKKyAgICA8c3Ryb25nPlBST1BPU0VEPC9zdHJvbmc+LiAgSXQgaGFzIG5vdCB5ZXQgYmVlbiBkaXNjdXNzZWQgYW5kCisgICAgYWdyZWVkIHRvIG9uIHRoZSBUT01DQVQtREVWIG1haWxpbmcgbGlzdC48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRXh0ZXJuYWwgU3BlY2lmaWNhdGlvbnMiPgorCisgICAgPHA+VGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb25hbGl0eSBkZXBlbmRzIG9uIHRoZSBmb2xsb3dpbmcKKyAgICBleHRlcm5hbCBzcGVjaWZpY2F0aW9uczo8L3A+CisgICAgPHVsPgorICAgIDxsaT5Ob25lPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkltcGxlbWVudGF0aW9uIFJlcXVpcmVtZW50cyI+CisKKyAgICA8cD5UaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbmFsaXR5IHNoYWxsIGNvbmZvcm0gdG8gdGhlCisgICAgZm9sbG93aW5nIHJlcXVpcmVtZW50czo8L3A+CisgICAgPHVsPgorICAgIDxsaT5CZSByZWFsaXplZCBpbiBvbmUgb3IgbW9yZSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLjwvbGk+CisgICAgPGxpPkltcGxlbWVudCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTwvY29kZT4gaW50ZXJmYWNlLgorICAgICAgICBbQ3VycmVudF08L2xpPgorICAgIDxsaT5JbXBsZW1lbnQgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlPC9jb2RlPgorICAgICAgICBpbnRlcmZhY2UuICBbQ3VycmVudF08L2xpPgorICAgIDxsaT5TdWJjbGFzcyB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5SZWFsbUJhc2U8L2NvZGU+CisgICAgICAgIGJhc2UgY2xhc3MuPC9saT4KKyAgICA8bGk+TGl2ZSBpbiB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbTwvY29kZT4gcGFja2FnZS4KKyAgICAgICAgW0N1cnJlbnRdPC9saT4KKyAgICA8bGk+U3VwcG9ydCBhIGNvbmZpZ3VyYWJsZSBkZWJ1Z2dpbmcgZGV0YWlsIGxldmVsLiBbQ3VycmVudF08L2xpPgorICAgIDxsaT5Mb2cgZGVidWdnaW5nIGFuZCBvcGVyYXRpb25hbCBtZXNzYWdlcyAoc3VpdGFibHkgaW50ZXJuYXRpb25hbGl6ZWQpCisgICAgICAgIHZpYSB0aGUgPGNvZGU+Z2V0Q29udGFpbmVyKCkubG9nKCk8L2NvZGU+IG1ldGhvZC4gW0N1cnJlbnRdPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRGVwZW5kZW5jaWVzIj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkVudmlyb25tZW50YWwgRGVwZW5kZW5jaWVzIj4KKworICAgIDxwPlRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnRhbCBkZXBlbmRlbmNpZXMgbXVzdCBiZSBtZXQgaW4gb3JkZXIgZm9yCisgICAgTWVtb3J5UmVhbG0gdG8gb3BlcmF0ZSBjb3JyZWN0bHk6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+VGhlIGRlc2lyZSB0byB1dGlsaXplIE1lbW9yeVJlYWxtIG11c3QgYmUgcmVnaXN0ZXJlZCBpbgorICAgICAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3NlcnZlci54bWw8L2NvZGU+LCBpbiBhCisgICAgICAgIDxjb2RlPiZsdDtSZWFsbSZndDs8L2NvZGU+IGVsZW1lbnQgdGhhdCBpcyBuZXN0ZWQgaW5zaWRlIGEKKyAgICAgICAgY29ycmVzcG9uZGluZyA8Y29kZT4mbHQ7RW5naW5lJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtIb3N0Jmd0OzwvY29kZT4sCisgICAgICAgIG9yIDxjb2RlPiZsdDtDb250ZXh0Jmd0OzwvY29kZT4gZWxlbWVudC4gIChUaGlzIGlzIGFscmVhZHkKKyAgICAgICAgaW5jbHVkZWQgaW4gdGhlIGRlZmF1bHQgPGNvZGU+c2VydmVyLnhtbDwvY29kZT4gZmlsZS4pPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbnRhaW5lciBEZXBlbmRlbmNpZXMiPgorCisgICAgPHA+Q29ycmVjdCBvcGVyYXRpb24gb2YgTWVtb3J5UmVhbG0gZGVwZW5kcyBvbiB0aGUgZm9sbG93aW5nCisgICAgc3BlY2lmaWMgZmVhdHVyZXMgb2YgdGhlIHN1cnJvdW5kaW5nIGNvbnRhaW5lcjo8L3A+CisgICAgPHVsPgorICAgIDxsaT5JbnRlcmFjdGlvbnMgd2l0aCA8Y29kZT5NZW1vcnlSZWFsbTwvY29kZT4gd2lsbCBiZSBpbml0aWF0ZWQgYnkKKyAgICAgICAgdGhlIGFwcHJvcHJpYXRlIDxjb2RlPkF1dGhlbnRpY2F0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uLCBiYXNlZAorICAgICAgICBvbiB0aGUgbG9naW4gbWV0aG9kIHRoYXQgaXMgc2VsZWN0ZWQuPC9saT4KKyAgICA8bGk+PGNvZGU+TWVtb3J5UmVhbG08L2NvZGU+IG11c3QgaGF2ZSBhbiBYTUwgcGFyc2VyIGNvbXBhdGlibGUgd2l0aAorICAgICAgICB0aGUgSkFYUC8xLjEgQVBJcyBhdmFpbGFibGUgdG8gaXQuICBUaGlzIGlzIG5vcm1hbGx5IGFjY29tcGxpc2hlZAorICAgICAgICBieSBwbGFjaW5nIHRoZSBjb3JyZXNwb25kaW5nIEpBUiBmaWxlcyBpbiBkaXJlY3RvcnkKKyAgICAgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvc2VydmVyL2xpYjwvY29kZT4gKHRvIG1ha2UgdGhlbSB2aXNpYmxlIG9ubHkKKyAgICAgICAgdG8gaW50ZXJuYWwgQ2F0YWxpbmEgY2xhc3Nlcykgb3IgaW4gZGlyZWN0b3J5CisgICAgICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbW1vbi9saWI8L2NvZGU+ICh0byBtYWtlIHRoZW0gdmlzaWJsZSB0bworICAgICAgICBDYXRhbGluYSBpbnRlcm5hbCBjbGFzc2VzIDxzdHJvbmc+YW5kPC9zdHJvbmc+IGluc3RhbGxlZCB3ZWIKKyAgICAgICAgYXBwbGljYXRpb25zKS48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJGdW5jdGlvbmFsaXR5Ij4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3IG9mIE9wZXJhdGlvbiI+CisKKyAgICA8cD5UaGUgbWFpbiBwdXJwb3NlIG9mIDxjb2RlPk1lbW9yeVJlYWxtPC9jb2RlPiBpcyB0byBhbGxvdyBDYXRhbGluYSB0bworICAgIGF1dGhlbnRpY2F0ZSB1c2VycywgYW5kIGxvb2sgdXAgdGhlIGNvcnJlc3BvbmRpbmcgc2VjdXJpdHkgcm9sZXMsIGZyb20KKyAgICB0aGUgaW5mb3JtYXRpb24gZm91bmQgaW4gYW4gWE1MLWZvcm1hdCBjb25maWd1cmF0aW9uIGZpbGUuICBUaGUgZm9ybWF0CisgICAgb2YgdGhpcyBmaWxlIGlzIGRlc2NyaWJlZCBiZWxvdy4gIFdoZW4gYSA8Y29kZT5NZW1vcnlSZWFsbTwvY29kZT4KKyAgICBpbnN0YW5jZSBpcyBzdGFydGVkLCBpdCB3aWxsIHJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoaXMgWE1MIGZpbGUgYW5kIGNyZWF0ZQorICAgIGFuICJpbiBtZW1vcnkgZGF0YWJhc2UiIG9mIGFsbCB0aGUgdmFsaWQgdXNlcnMgYW5kIHRoZWlyIGFzc29jaWF0ZWQKKyAgICBzZWN1cml0eSByb2xlcy48L3A+CisKKyAgICA8cD5FYWNoIHRpbWUgdGhhdCBDYXRhbGluYSBuZWVkcyB0byBhdXRoZW50aWNhdGUgYSB1c2VyLCBpdCB3aWxsIGNhbGwKKyAgICB0aGUgPGNvZGU+YXV0aGVudGljYXRlKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLAorICAgIHBhc3NpbmcgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCB0aGF0IHdlcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLiAgSWYKKyAgICB3ZSBmaW5kIHRoZSB1c2VyIGluIHRoZSBkYXRhYmFzZSAoYW5kIG1hdGNoIG9uIHRoZSBwYXNzd29yZCksIHdlIGFjY3VtdWxhdGUKKyAgICBhbGwgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIHRoYXQgYXJlIGRlZmluZWQgZm9yIHRoaXMgdXNlciwgYW5kIGNyZWF0ZSBhCisgICAgbmV3IDxjb2RlPkdlbmVyaWNQcmluY2lwYWw8L2NvZGU+IG9iamVjdCB0byBiZSByZXR1cm5lZC4gIElmIHRoZSB1c2VyCisgICAgaXMgbm90IGF1dGhlbnRpY2F0ZWQsIHdlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpbnN0ZWFkLiAgVGhlCisgICAgPGNvZGU+R2VuZXJpY1VzZXI8L2NvZGU+IG9iamVjdCBjYWNoZXMgdGhlIHNldCBvZiBzZWN1cml0eSByb2xlcyB0aGF0CisgICAgd2VyZSBvd25lZCBieSB0aGlzIHVzZXIgYXQgdGhlIHRpbWUgb2YgYXV0aGVudGljYXRpb24sIHNvIHRoYXQgY2FsbHMgdG8KKyAgICA8Y29kZT5pc1VzZXJJblJvbGUoKTwvY29kZT4gY2FuIGJlIGFuc3dlcmVkIHdpdGhvdXQgZ29pbmcgYmFjayB0byB0aGUKKyAgICBkYXRhYmFzZSBldmVyeSB0aW1lLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJEZXRhaWxlZCBGdW5jdGlvbmFsIFJlcXVpcmVtZW50cyI+CisKKworICAgIDxoMz5Db25maWd1cmFibGUgUHJvcGVydGllczwvaDM+CisKKyAgICA8cD5UaGUgaW1wbGVtZW50YXRpb24gc2hhbGwgc3VwcG9ydCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMKKyAgICB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHdpdGggSmF2YUJlYW5zIHByb3BlcnR5IHNldHRlcnM6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+Q29uZmlndXJhYmxlIGRlYnVnZ2luZyBkZXRhaWwgbGV2ZWwuPC9saT4KKyAgICA8bGk+Q29uZmlndXJhYmxlIGZpbGUgcGF0aG5hbWUgKGFic29sdXRlIG9yIHJlbGF0aXZlIHRvCisgICAgICAgIDxjb2RlPiRDQVRBTElOQV9IT01FPC9jb2RlPiBvZiB0aGUgWE1MIGZpbGUgY29udGFpbmluZyBvdXIKKyAgICAgICAgZGVmaW5lZCB1c2Vycy4gIFs8Y29kZT5jb25mL3RvbWNhdC11c2Vycy54bWw8L2NvZGU+XS48L2xpPgorICAgIDwvdWw+CisKKyAgICA8aDM+TGlmZWN5Y2xlIEZ1bmN0aW9uYWxpdHk8L2gzPgorCisgICAgPHA+VGhlIGZvbGxvd2luZyBwcm9jZXNzaW5nIG11c3QgYmUgcGVyZm9ybWVkIHdoZW4gdGhlIDxjb2RlPnN0YXJ0KCk8L2NvZGU+CisgICAgbWV0aG9kIGlzIGNhbGxlZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT5PcGVuIGFuZCBwYXJzZSB0aGUgc3BlY2lmaWVkIFhNTCBmaWxlLjwvbGk+CisgICAgPGxpPkNyZWF0ZSBhbiBpbi1tZW1vcnkgZGF0YWJhc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIFhNTCBmaWxlCisgICAgICAgIGNvbnRlbnRzLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+Tk9URTwvc3Ryb25nPiAtIFRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRvIHJlY29nbml6ZQorICAgICAgICBzdWJzZXF1ZW50IGNoYW5nZXMgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBYTUwgZmlsZS48L2xpPgorICAgIDwvdWw+CisKKyAgICA8cD5UaGUgZm9sbG93aW5nIHByb2Nlc3NpbmcgbXVzdCBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgPGNvZGU+c3RvcCgpPC9jb2RlPgorICAgIG1ldGhvZCBpcyBjYWxsZWQ6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+UmVsZWFzZSBvYmplY3QgcmVmZXJlbmNlcyB0byB0aGUgaW4tbWVtb3J5IGRhdGFiYXNlIHJlcHJlc2VudGF0aW9uLjwvbGk+CisgICAgPC91bD4KKworCisgICAgPGgzPk1ldGhvZCBhdXRoZW50aWNhdGUoKSBGdW5jdGlvbmFsaXR5PC9oMz4KKworICAgIDxwPldoZW4gPGNvZGU+YXV0aGVudGljYXRlKCk8L2NvZGU+IGlzIGNhbGxlZCwgdGhlIGZvbGxvd2luZyBwcm9jZXNzaW5nCisgICAgaXMgcmVxdWlyZWQ6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+U2VsZWN0IHRoZSBvbmUgYW5kIG9ubHkgInVzZXIiIGluc3RhbmNlIGZyb20gdGhlIGluLW1lbW9yeSBkYXRhYmFzZSwKKyAgICAgICAgYmFzZWQgb24gbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCB1c2VybmFtZS4gIElmIHRoZXJlIGlzIG5vIHN1Y2gKKyAgICAgICAgaW5zdGFuY2UsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi48L2xpPgorICAgIDxsaT5BdXRoZW50aWNhdGUgdGhlIHVzZXIgYnkgY29tcGFyaW5nIHRoZSAocG9zc2libHkgZW5jcnlwdGVkKSBwYXNzd29yZAorICAgICAgICB2YWx1ZSB0aGF0IHdhcyByZWNlaXZlZCBhZ2FpbnN0IHRoZSBwYXNzd29yZCBwcmVzZW50ZWQgYnkgdGhlIHVzZXIuCisgICAgICAgIElmIHRoZXJlIGlzIG5vIG1hdGNoLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uPC9saT4KKyAgICA8bGk+Q29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIGNsYXNzCisgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uR2VuZXJpY1ByaW5jaXBhbDwvY29kZT4gKGlmIG5vdAorICAgICAgICBhbHJlYWR5IHVzaW5nIHRoaXMgYXMgdGhlIGludGVybmFsIGRhdGFiYXNlIHJlcHJlc2VudGF0aW9uKSB0aGF0CisgICAgICAgIGNvbnRhaW5zIHRoZSBhdXRoZW50aWNhdGVkIHVzZXJuYW1lIGFuZCBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHRoZQorICAgICAgICBzZWN1cml0eSByb2xlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB1c2VyLjwvbGk+CisgICAgPGxpPlJldHVybiB0aGUgbmV3bHkgY29uc3RydWN0ZWQgPGNvZGU+R2VuZXJpY1ByaW5jaXBhbDwvY29kZT4uPC9saT4KKyAgICA8L3VsPgorCisKKyAgICA8aDM+TWV0aG9kIGhhc1JvbGUoKSBGdW5jdGlvbmFsaXR5PC9oMz4KKworICAgIDxwPldoZW4gPGNvZGU+aGFzUm9sZSgpPC9jb2RlPiBpcyBjYWxsZWQsIHRoZSBmb2xsb3dpbmcgcHJvY2Vzc2luZworICAgIGlzIHJlcXVpcmVkOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPlRoZSA8Y29kZT5wcmluY2lwYWw8L2NvZGU+IHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IFNIT1VMRAorICAgICAgICBiZSBvbmUgdGhhdCB3ZSByZXR1cm5lZCAoaW5zdGFuY2VvZiBjbGFzcworICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkdlbmVyaWNQcmluY2lwYWw8L2NvZGU+LCB3aXRoIGEKKyAgICAgICAgPGNvZGU+cmVhbG08L2NvZGU+IHByb3BlcnR5IHRoYXQgaXMgZXF1YWwgdG8gb3VyIGluc3RhbmNlLjwvbGk+CisgICAgPGxpPklmIHRoZSBwYXNzZWQgPGNvZGU+cHJpbmNpcGFsPC9jb2RlPiBtZWV0cyB0aGVzZSBjcml0ZXJpYSwgY2hlY2sKKyAgICAgICAgdGhlIHNwZWNpZmllZCByb2xlIGFnYWluc3QgdGhlIGxpc3QgcmV0dXJuZWQgYnkKKyAgICAgICAgPGNvZGU+Z2V0Um9sZXMoKTwvY29kZT4sIGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlCisgICAgICAgIHNwZWNpZmllZCByb2xlIGlzIGluY2x1ZGVkOyBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4uPC9saT4KKyAgICA8bGk+SWYgdGhlIHBhc3NlZCA8Y29kZT5wcmluY2lwYWw8L2NvZGU+IGRvZXMgbm90IG1lZXQgdGhlc2UgY3JpdGVyaWEsCisgICAgICAgIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4uPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlRlc3RhYmxlIEFzc2VydGlvbnMiPgorCisgIDxwPkluIGFkZGl0aW9uIHRoZSB0aGUgYXNzZXJ0aW9ucyBpbXBsaWVkIGJ5IHRoZSBmdW5jdGlvbmFsaXR5IHJlcXVpcmVtZW50cworICBsaXN0ZWQgYWJvdmUsIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhc3NlcnRpb25zIHNoYWxsIGJlIHRlc3RlZCB0bworICB2YWxpZGF0ZSB0aGUgYmVoYXZpb3Igb2YgPGNvZGU+TWVtb3J5UmVhbG08L2NvZGU+OjwvcD4KKyAgPHVsPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvaW5kZXgueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvaW5kZXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzA2NzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9pbmRleC54bWwKQEAgLTAsMCArMSw1NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImluZGV4Lmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8dGl0bGU+VGFibGUgb2YgQ29udGVudHM8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IkNhdGFsaW5hIEZ1bmN0aW9uYWwgU3BlY2lmaWNhdGlvbnMiPgorCis8cD5UaGlzIGRvY3VtZW50YXRpb24gYXJlYSBpbmNsdWRlcyA8ZW0+ZnVuY3Rpb25hbCBzcGVjaWZpY2F0aW9uczwvZW0+IGZvcgorbWFueSBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgdGhlIDxzdHJvbmc+Q2F0YWxpbmE8L3N0cm9uZz4gc2VydmxldCBjb250YWluZXIKK3BvcnRpb24gb2YgVG9tY2F0IDUuICBJbiBtb3N0IGNhc2VzLCB0aGVzZSBmZWF0dXJlcyBhcmUgbm90IGRvY3VtZW50ZWQgaW4gdGhlCit1bmRlcmx5aW5nIFNlcnZsZXQgb3IgSlNQIHNwZWNpZmljYXRpb25zLCBzbyBhIGRlZmluaXRpb24gb2YgdGhlIGV4cGVjdGVkCitjb3JyZWN0IGJlaGF2aW9yIGlzIGltcG9ydGFudCBib3RoIHRvIGltcGxlbWVudG9ycyBvZiB0aG9zZSBmZWF0dXJlcywgYW5kIHRvCit0ZXN0IHdyaXRlcnMgdHJ5aW5nIHRvIGRlY2lkZSB3aGF0IHRvIHRlc3QuPC9wPgorCis8cD5UaGUgZnVuY3Rpb25hbCBzcGVjaWZpY2F0aW9ucyBhcmUgZGl2aWRlZCBpbnRvIHRoZSBmb2xsb3dpbmcgY2F0ZWdvcmllcworaW4gdGhlIG1lbnUgKHRvIHRoZSBsZWZ0KTo8L3A+Cis8dWw+Cis8bGk+PGVtPkFkbWluaXN0cmF0aXZlIEFwcHM8L2VtPiAtIE92ZXJhbGwgcmVxdWlyZW1lbnRzIGZvciBzdXBwb3J0aW5nIGFuCisgICAgYWJpbGl0eSB0byBjb25maWd1cmUgYW5kIG9wZXJhdGUgYSBUb21jYXQgNSBpbnN0YWxsYXRpb24gdGhyb3VnaCB0b29scywKKyAgICBhcyB3ZWxsIGFzIGRldGFpbGVkIHJlcXVpcmVtZW50cyBmb3IgdGhlIHRvb2xzIHRoZW1zZWx2ZXMuPC9saT4KKzxsaT48ZW0+SW50ZXJuYWwgU2VydmxldHM8L2VtPiAtIFJlcXVpcmVtZW50cyBmb3IgQ2F0YWxpbmEgZmVhdHVyZXMgdGhhdCBhcmUKKyAgICBpbXBsZW1lbnRlZCBhcyBpbnRlcm5hbCwgY29udGFpbmVyLW1hbmFnZWQsIHNlcnZsZXRzLjwvbGk+Cis8bGk+PGVtPlJlYWxtIEltcGxlbWVudGF0aW9uczwvZW0+IC0gUmVxdWlyZW1lbnRzIGZvciB0aGUgaW1wbGVtZW50YXRpb25zIG9mCisgICAgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG08L2NvZGU+IGludGVyZmFjZSAocHJvdmlkaW5nIGFjY2VzcyB0bworICAgIGNvbGxlY3Rpb25zIG9mIHVzZXJzLCBwYXNzd29yZHMgYW5kIHJvbGVzKSB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUKKyAgICBzdGFuZGFyZCBUb21jYXQgNSBkaXN0cmlidXRpb24uPC9saT4KKzwvdWw+CisKKzxwPjxlbT5OT1RFPC9lbT4gLSBJbiBzb21lIGNhc2VzLCB0aGUgY29udGVudHMgb2YgdGhlc2UgZnVuY3Rpb25hbCBzcGVjcyBoYXMKK2JlZW4gInJldmVyc2UgZW5naW5lZXJlZCIgZnJvbSBleGlzdGluZyBpbXBsZW1lbnRhdGlvbnMuICBUaGlzIGV4ZXJjaXNlIGlzCitzdGlsIHVzZWZ1bCwgYmVjYXVzZSBpdCBwcm92aWRlcyBhbiBpbnRyb2R1Y3Rpb24gdG8gPHN0cm9uZz53aGF0PC9zdHJvbmc+CitDYXRhbGluYSBkb2VzLCB3aXRob3V0IGJlaW5nIGFzIGNvbmNlcm5lZCB3aXRoIDxzdHJvbmc+aG93PC9zdHJvbmc+IHRoaXMgaXMKK2FjY29tcGxpc2hlZC48L3A+CisKKzxwPjxzdHJvbmc+VE9ETzwvc3Ryb25nPiAtIE9idmlvdXNseSwgdGhpcyBhcmVhIGhhcyBhIGxvbmcgd2F5cyB0byBnbyBiZWZvcmUKK2l0IGlzIGNvbXBsZXRlLiAgQ29udHJpYnV0aW9ucyBhcmUgd2VsY29tZSE8L3A+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9tYmVhbi1uYW1lcy54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9tYmVhbi1uYW1lcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyOTNmZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL21iZWFuLW5hbWVzLnhtbApAQCAtMCwwICsxLDczNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9Im1iZWFuLW5hbWVzLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSJhbXlyb2hAYXBhY2hlLm9yZyI+QW15IFJvaDwvYXV0aG9yPgorICAgIDx0aXRsZT5Ub21jYXQgTUJlYW4gTmFtZXM8L3RpdGxlPgorICAgIDxyZXZpc2lvbj4kSWQkPC9yZXZpc2lvbj4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJCYWNrZ3JvdW5kIj4KKworICAgIDxwPldlIHdpbGwgYmUgdXNpbmcgPGVtPkpNWCBNQmVhbnM8L2VtPiBhcyB0aGUgdGVjaG5vbG9neSBmb3IKKyAgICBpbXBsZW1lbnRpbmcgbWFuYWdlYWJpbGl0eSBvZiBUb21jYXQuPC9wPgorCisgICAgPHA+T25lIG9mIHRoZSBrZXkgY29uY2VwdHMgb2YgSk1YIChhbmQgSlNSLTc3KSBpcyB0aGF0IGVhY2ggbWFuYWdlbWVudAorICAgIGJlYW4gaGFzIGEgdW5pcXVlIG5hbWUgaW4gdGhlIE1CZWFuU2VydmVyJ3MgcmVnaXN0cnksIGFuZCB0aGF0CisgICAgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgY2FuIHV0aWxpemUgdGhlc2UgbmFtZXMgdG8gcmV0cmlldmUgdGhlIE1CZWFuCisgICAgb2YgaW50ZXJlc3QgdG8gdGhlbSBmb3IgYSBwYXJ0aWN1bGFyIG1hbmFnZW1lbnQgb3BlcmF0aW9uLgorICAgIFRoaXMgZG9jdW1lbnQgcHJvcG9zZXMgYSBuYW1pbmcgY29udmVudGlvbiBmb3IgTUJlYW5zIHRoYXQgYWxsb3dzIGVhc3kKKyAgICBjYWxjdWxhdGlvbiBvZiB0aGUgbmFtZSBmb3IgYSBwYXJ0aWN1bGFyIE1CZWFuLiAgRm9yIGJhY2tncm91bmQKKyAgICBpbmZvcm1hdGlvbiBvbiBKTVggTUJlYW4gbmFtZXMsIHNlZSB0aGUgPGVtPkphdmEgTWFuYWdlbWVudCBFeHRlbnNpb25zCisgICAgSW5zdHJ1bWVudGF0aW9uIGFuZCBBZ2VudCBTcGVjaWZpY2F0aW9uPC9lbT4sIHZlcnNpb24gMS4wLCBzZWN0aW9uIDYuCisgICAgSW4gcGFydGljdWxhciwgd2Ugd2lsbCBiZSBkaXNjdXNzaW5nIHRoZSBTdHJpbmcgUmVwcmVzZW50YXRpb24gb2YKKyAgICA8Y29kZT5PYmplY3ROYW1lPC9jb2RlPiBpbnN0YW5jZXMuPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkNhdGFsaW5hIE9iamVjdCBIaWVyYXJjaHkiPgorCis8cD5Ub21jYXQncyBzZXJ2bGV0IGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiwgY2FsbGVkIENhdGFsaW5hLCBjYW4gYmUKK3JlcHJlc2VudGVkIGFzIGEgaGllcmFyY2h5IG9mIG9iamVjdHMgdGhhdCBjb250YWluIHJlZmVyZW5jZXMgdG8gZWFjaCBvdGhlci4KK1RoZSBvYmplY3QgaGllcmFyY2h5IGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIHRyZWUsIG9yIChpc29tb3JwaGljYWxseSkgYmFzZWQKK29uIHRoZSBuZXN0aW5nIG9mIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgaW4gdGhlIDxjb2RlPmNvbmYvc2VydmVyLnhtbDwvY29kZT4KK2ZpbGUgdGhhdCBpcyB0cmFkaXRpb25hbGx5IHVzZWQgdG8gY29uZmlndXJlIFRvbWNhdCBzdGFuZC1hbG9uZS48L3A+CisKKzxwPlRoZSB2YWxpZCBjb21wb25lbnQgbmVzdGluZ3MgZm9yIENhdGFsaW5hIGFyZSBkZXBpY3RlZCBpbiB0aGUgZm9sbG93aW5nCit0YWJsZSwgd2l0aCBjb2x1bW5zIHRoYXQgY29udGFpbiB0aGUgZm9sbG93aW5nIHZhbHVlczo8L3A+Cis8dWw+Cis8bGk+PGVtPlBhdHRlcm48L2VtPiAtIE5lc3RpbmcgcGF0dGVybiBvZiBYTUwgZWxlbWVudHMgKGluIHRoZQorICAgIDxjb2RlPmNvbmYvc2VydmVyLnhtbDwvY29kZT4gZmlsZSkgdXNlZCB0byBjb25maWd1cmUgdGhpcyBjb21wb25lbnQuPC9saT4KKzxsaT48ZW0+Q2FyZGluYWxpdHk8L2VtPiAtIE1pbmltdW0gYW5kIG1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mCisgICAgdGhpcyBlbGVtZW50IGF0IHRoaXMgbmVzdGluZyBwb3NpdGlvbiwgd2hpY2ggYWxzbyBjb3JyZXNwb25kcyB0byB0aGUKKyAgICBtaW5pbXVtIGFuZCBtYXhpbXVtIG51bWJlciBvZiBDYXRhbGluYSBjb21wb25lbnRzLjwvbGk+Cis8bGk+PGVtPklkZW50aWZpZXI8L2VtPiAtIE5hbWUgb2YgdGhlIEphdmFCZWFucyBwcm9wZXJ0eSBvZiB0aGlzIGNvbXBvbmVudAorICAgIHRoYXQgcmVwcmVzZW50cyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgKHdpdGhpbiB0aGUgbmVzdGVkIGhpZXJhcmNoeSksCisgICAgaWYgYW55LjwvbGk+Cis8bGk+PGVtPk1CZWFuIE9iamVjdE5hbWU8L2VtPiAtIFRoZSBwb3J0aW9uIG9mIHRoZSBNQmVhbiBvYmplY3QgbmFtZSB0aGF0CisgICAgYXBwZWFycyA8c3Ryb25nPmFmdGVyPC9zdHJvbmc+IHRoZSBkb21haW4gbmFtZS4gIEZvciBub3csIGl0IHNob3VsZCBiZQorICAgIGFzc3VtZWQgdGhhdCBhbGwgb2YgdGhlc2UgTUJlYW5zIGFwcGVhciBpbiB0aGUgZGVmYXVsdCBKTVggZG9tYWluLjwvbGk+Cis8L3VsPgorCis8cD5JbiB0aGUgPGVtPk1CZWFuIE9iamVjdE5hbWU8L2VtPiBkZXNjcmlwdGlvbnMsIHNldmVyYWwgdHlwZXMgb2Ygc3ltYm9saWMKK2V4cHJlc3Npb25zIGFyZSB1dGlsaXplZCB0byBkZWZpbmUgdmFyaWFibGUgdGV4dCB0aGF0IGlzIHJlcGxhY2VkIGJ5Citjb3JyZXNwb25kaW5nIHZhbHVlczo8L3A+Cis8dWw+Cis8bGk+PGVtPiR7R1JPVVB9PC9lbT4gLSBPbmUgb2YgdGhlIHN0YW5kYXJkIE1CZWFuIG5hbWVzIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAiZ3JvdXAiIGNhdGVnb3J5LiAgRm9yIGV4YW1wbGUsIHRoZSBleHByZXNzaW9uIDxjb2RlPiR7UkVBTE19PC9jb2RlPgorICAgIHJlcHJlc2VudHMgdGhlIHZhbHVlcyBsaWtlIDxjb2RlPkpEQkNSZWFsbTwvY29kZT4gYW5kIDxjb2RlPkpBQVNSZWFsbTwvY29kZT4KKyAgICB0aGF0IGlkZW50aWZ5IHRoZSB2YXJpb3VzIE1CZWFucyBmb3IgcG9zc2libGUgPGNvZGU+UmVhbG08L2NvZGU+IGNvbXBvbmVudHMuPC9saT4KKzxsaT48ZW0+JHtuYW1lfTwvZW0+IC0gUmVwbGFjZWQgYnkgdGhlIHZhbHVlIG9mIHByb3BlcnR5IDxjb2RlPm5hbWU8L2NvZGU+CisgICAgZnJvbSB0aGUgY3VycmVudCBjb21wb25lbnQuPC9saT4KKzxsaT48ZW0+JHtwYXJlbnQubmFtZX08L2VtPiAtIFJlcGxhY2VkIGJ5IHRoZSB2YWx1ZSBvZiBwcm9wZXJ0eQorICAgIDxjb2RlPm5hbWU8L2NvZGU+IGZyb20gYSBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgY29tcG9uZW50LCB3aXRoIHRoZQorICAgIHBhcmVudCdzIHR5cGUgaWRlbnRpZmllZCBieSA8ZW0+cGFyZW50PC9lbT4uPC9saT4KKzxsaT48ZW0+JHsjIyN9PC9lbT4gLSBBbiBhcmJpdHJhcnkgbnVtZXJpYyBpZGVudGlmaWVyIHRoYXQgcHJlc2VydmVzCisgICAgb3JkZXIgYnV0IGhhcyBubyBvdGhlciBwYXJ0aWN1bGFyIG1lYW5pbmcuICBJbiBnZW5lcmFsLCB0aGUgc2VydmVyIHdpbGwKKyAgICBhc3NpZ24gbnVtZXJpYyB2YWx1ZXMgdG8gZXhpc3RpbmcgaW5zdGFuY2VzIHdpdGggbGFyZ2UgZ2FwcyBpbnRvIHdoaWNoCisgICAgbmV3IGl0ZW1zIGNhbiBiZSBjb25maWd1cmVkIGlmIGRlc2lyZWQuPC9saT4KKzwvdWw+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1Ij4KKworICA8dHI+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPlBhdHRlcm48L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5DYXJkaW5hbGl0eTwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPklkZW50aWZpZXI8L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5NQmVhbiBPYmplY3ROYW1lPC90aD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlcjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjEuLjE8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPSR7U0VSVkVSfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gTGlzdGVuZXI8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi5uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT0ke0xJU1RFTkVSfSwgc2VxdWVuY2U9JHsjIyN9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MS4ubjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPm5hbWU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT0ke1NFUlZJQ0V9LCBuYW1lPSR7bmFtZX08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBDb25uZWN0b3I8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4xLi5uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+YWRkcmVzcywgcG9ydDwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPSR7Q09OTkVDVE9SfSwgc2VydmljZT0ke3NlcnZpY2V9LCBwb3J0PSR7cG9ydH0sCisgICAgICAgIGFkZHJlc3M9JHthZGRyZXNzfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIENvbm5lY3RvciAvIEZhY3Rvcnk8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi4xPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+KE9ubHkgZGVmaW5lZCBleHBsaWNpdGx5IGZvciBhbiBTU0wgY29ubmVjdG9yLCBidXQgY2FuIGJlIHRyZWF0ZWQKKyAgICAgICAgYXMgcGFydCBvZiB0aGUgY29ubmVjdG9yIGNvbXBvbmVudCk8L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIENvbm5lY3RvciAvIExpc3RlbmVyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4ubjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtMSVNURU5FUn0sIHNlcXVlbmNlPSR7IyMjfSwgc2VydmljZT0ke3NlcnZpY2V9LAorICAgICAgICBwb3J0PSR7Y29ubmVjdG9yLnBvcnR9LCBhZGRyZXNzPSR7Y29ubmVjdG9yLmFkZHJlc3N9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MS4uMTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtFTkdJTkV9LCBzZXJ2aWNlPSR7c2VydmljZS5uYW1lfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIEhvc3Q8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4xLi5uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+bmFtZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPSR7SE9TVH0sIGhvc3Q9JHtuYW1lfSwKKyAgICAgICAgc2VydmljZT0ke3NlcnZpY2UubmFtZX08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmUgLyBIb3N0IC8gQ29udGV4dDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjEuLm48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5wYXRoPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtDT05URVhUfSwgcGF0aD0ke3BhdGh9LCBob3N0PSR7aG9zdC5uYW1lfSwKKyAgICAgICAgc2VydmljZT0ke3NlcnZpY2UubmFtZX08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmUgLyBIb3N0IC8gQ29udGV4dCAvIEluc3RhbmNlTGlzdGVuZXI8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi5uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT0ke0lOU1RBTkNFLUxJU1RFTkVSfSwgc2VxdWVuY2U9JHsjIyN9LCBwYXRoPSR7Y29udGV4dC5wYXRofSwKKyAgICAgICAgaG9zdD0ke2hvc3QubmFtZX0sIHNlcnZpY2U9JHtzZXJ2aWNlLm5hbWV9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gSG9zdCAvIENvbnRleHQgLyBMaXN0ZW5lcjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLm48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPSR7TElTVEVORVJ9LCBzZXF1ZW5jZT0keyMjI30sIHBhdGg9JHtjb250ZXh0LnBhdGh9LAorICAgICAgICBob3N0PSR7aG9zdC5uYW1lfSwgc2VydmljZT0ke3NlcnZpY2UubmFtZX08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmUgLyBIb3N0IC8gQ29udGV4dCAvIExvYWRlcjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLjE8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPSR7TE9BREVSfSwgcGF0aD0ke2NvbnRleHQucGF0aH0sIGhvc3Q9JHtob3N0Lm5hbWV9LAorICAgICAgICBzZXJ2aWNlPSR7c2VydmljZS5uYW1lfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIEhvc3QgLyBDb250ZXh0IC8gTWFuYWdlcjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLjE8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPSR7TUFOQUdFUn0sIHBhdGg9JHtjb250ZXh0LnBhdGh9LCBob3N0PSR7aG9zdC5uYW1lfSwKKyAgICAgICAgc2VydmljZT0ke3NlcnZpY2UubmFtZX08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmUgLyBIb3N0IC8gQ29udGV4dCAvIFJlYWxtPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4uMTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtSRUFMTX0sIHBhdGg9JHtjb250ZXh0LnBhdGh9LCBob3N0PSR7aG9zdC5uYW1lfSwKKyAgICAgICAgc2VydmljZT0ke3NlcnZpY2UubmFtZX08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmUgLyBIb3N0IC8gQ29udGV4dCAvIFJlc291cmNlczwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLjE8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPSR7UkVTT1VSQ0VTfSwgcGF0aD0ke2NvbnRleHQucGF0aH0sIGhvc3Q9JHtob3N0Lm5hbWV9LAorICAgICAgICBzZXJ2aWNlPSR7c2VydmljZS5uYW1lfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIEhvc3QgLyBDb250ZXh0IC8gVmFsdmU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi5uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT0ke1ZBTFZFfSwgc2VxdWVuY2U9JHsjIyN9LCBwYXRoPSR7Y29udGV4dC5wYXRofSwKKyAgICAgICAgaG9zdD0ke2hvc3QubmFtZX0sIHNlcnZpY2U9JHtzZXJ2aWNlLm5hbWV9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gSG9zdCAvIENvbnRleHQgLyBXcmFwcGVyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4ubjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPmoyZWVUeXBlPVNlcnZsZXQsbmFtZT0ke25hbWV9LAorICAgICAgICBXZWJNb2R1bGU9Ly8ke2hvc3QubmFtZX0vJHtjb250ZXh0Lm5hbWV9LAorICAgICAgICBKMkVFQXBwbGljYXRpb249JHtjb250ZXh0LkoyRUVBcHBsaWNhdGlvbn0sCisgICAgICAgIEoyRUVTZXJ2ZXI9JHtjb250ZXh0LkoyRUVTZXJ2ZXJ9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gSG9zdCAvIENvbnRleHQgLyBXcmFwcGVyTGlmZWN5Y2xlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4ubjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtXUkFQUEVSLUxJRkVDWUNMRX0sIHNlcXVlbmNlPSR7IyMjfSwgcGF0aD0ke2NvbnRleHQucGF0aH0sCisgICAgICAgIGhvc3Q9JHtob3N0Lm5hbWV9LCBzZXJ2aWNlPSR7c2VydmljZS5uYW1lfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIEhvc3QgLyBDb250ZXh0IC8gV3JhcHBlckxpc3RlbmVyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4ubjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtXUkFQUEVSLUxJU1RFTkVSfSwgc2VxdWVuY2U9JHsjIyN9LCBwYXRoPSR7Y29udGV4dC5wYXRofSwKKyAgICAgICAgaG9zdD0ke2hvc3QubmFtZX0sIHNlcnZpY2U9JHtzZXJ2aWNlLm5hbWV9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gSG9zdCAvIExpc3RlbmVyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4ubjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtMSVNURU5FUn0sIHNlcXVlbmNlPSR7IyMjfSwgaG9zdD0ke2hvc3QubmFtZX0sCisgICAgICAgIHNlcnZpY2U9JHtzZXJ2aWNlLm5hbWV9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gSG9zdCAvIFJlYWxtPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4uMTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtSRUFMTX0sIGhvc3Q9JHtob3N0Lm5hbWV9LAorICAgICAgICBzZXJ2aWNlPSR7c2VydmljZS5uYW1lfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIEhvc3QgLyBWYWx2ZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLm48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPSR7VkFMVkV9LCBzZXF1ZW5jZT0keyMjI30sCisgICAgICAgIGhvc3Q9JHtob3N0Lm5hbWV9LCBzZXJ2aWNlPSR7c2VydmljZS5uYW1lfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIExpc3RlbmVyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4ubjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtMSVNURU5FUn0sIHNlcXVlbmNlPSR7IyMjfTwvY29kZT4KKyAgICAgICAgKDxzdHJvbmc+RklYTUU8L3N0cm9uZz4gLSBkaXNhbWJpZ3VhdGUgZnJvbSBTZXJ2ZXIgLyBTZXJ2aWNlIC8KKyAgICAgICAgTGlzdGVuZXIpPC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmUgLyBSZWFsbTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLjE8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPSR7UkVBTE19LCBzZXJ2aWNlPSR7c2VydmljZS5uYW1lfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIFZhbHZlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4ubjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtWQUxWRX0sIHNlcXVlbmNlPSR7IyMjfSwKKyAgICAgICAgc2VydmljZT0ke3NlcnZpY2UubmFtZX08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBMaXN0ZW5lcjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLm48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPSR7TElTVEVORVJ9LCBzZXF1ZW5jZT0keyMjI308L2NvZGU+CisgICAgICAgICg8c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gZGlzYW1iaWd1YXRlIGZyb20gU2VydmVyIC8gU2VydmljZSAvCisgICAgICAgIEVuZ2luZSAvIExpc3RlbmVyKTwvdGQ+CisgIDwvdHI+CisKKzwvdGFibGU+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iTUJlYW4gR3JvdXBzIGFuZCBOYW1lcyI+CisKKzxwPlRoZSBmb2xsb3dpbmcgTUJlYW4gbmFtZXMgc2hhbGwgYmUgZGVmaW5lZCBpbiB0aGUgcmVzb3VyY2UgZmlsZQorPGNvZGU+L29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL21iZWFucy1kZXNjcmlwdG9ycy54bWw8L2NvZGU+IChhbmQKK3RoZXJlZm9yZSBhdmFpbGFibGUgZm9yIHVzZSB3aXRoaW4gdGhlIEFkbWluaXN0cmF0aW9uL0NvbmZpZ3VyYXRpb24KK3dlYiBhcHBsaWNhdGlvbiBmb3IgVG9tY2F0KTo8L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1Ij4KKworICA8dHI+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPk1CZWFuIE5hbWU8L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5Hcm91cCBOYW1lPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+Q2F0YWxpbmEgSW50ZXJmYWNlPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+SW1wbGVtZW50YXRpb24gQ2xhc3M8L3RoPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+QWNjZXNzTG9nVmFsdmU8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VkFMVkU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5BY2Nlc3NMb2dWYWx2ZTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+QmFzaWNBdXRoZW50aWNhdG9yPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlZBTFZFPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkJhc2ljQXV0aGVudGljYXRvcjwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+Q2VydGlmaWNhdGVzVmFsdmU8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VkFMVkU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5DZXJ0aWZpY2F0ZXNWYWx2ZTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+Q29udGV4dENvbmZpZzwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5MSVNURU5FUjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Db250ZXh0Q29uZmlnPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5Db250ZXh0RW52aXJvbm1lbnQ8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+UkVTT1VSQ0VTPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFbnZpcm9ubWVudDwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RW52aXJvbm1lbnQ8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPkNvbnRleHRSZXNvdXJjZTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5SRVNPVVJDRVM8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+Q29udGV4dFJlc291cmNlTGluazwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5SRVNPVVJDRVM8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlTGluazwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VMaW5rPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5Db3lvdGVDb25uZWN0b3I8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+Q09OTkVDVE9SPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuQ29ubmVjdG9yPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY295b3RlLnRvbWNhdDQuQ295b3RlQ29ubmVjdG9yPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5EaWdlc3RBdXRoZW50aWNhdG9yPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlZBTFZFPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkRpZ2VzdEF1dGhlbnRpY2F0b3I8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPkVuZ2luZUNvbmZpZzwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5MSVNURU5FUjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5FbmdpbmVDb25maWc8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPkVycm9yUmVwb3J0VmFsdmU8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VkFMVkU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5FcnJvclJlcG9ydFZhbHZlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5FcnJvckRpc3BhdGNoZXJWYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5WQUxWRTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkVycm9yRGlzcGF0Y2hlclZhbHZlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5Gb3JtQXV0aGVudGljYXRvcjwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5WQUxWRTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5Gb3JtQXV0aGVudGljYXRvcjwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+R3JvdXA8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+R1JPVVA8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Hcm91cDwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkdyb3VwPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5Ib3N0Q29uZmlnPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPkxJU1RFTkVSPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkhvc3RDb25maWc8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPkh0dHBDb25uZWN0b3IxMDwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5DT05ORUNUT1I8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Db25uZWN0b3I8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuaHR0cDEwLkh0dHBDb25uZWN0b3I8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPkh0dHBDb25uZWN0b3IxMTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5DT05ORUNUT1I8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Db25uZWN0b3I8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuaHR0cC5IdHRwQ29ubmVjdG9yPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5KQUFTUmVhbG08L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+UkVBTE08L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpBQVNSZWFsbTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+SkRCQ1JlYWxtPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlJFQUxNPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG08L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPkpEQkNVc2VyRGF0YWJhc2U8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VVNFUkRBVEFCQVNFPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnMuSkRCQ1VzZXJEYXRhYmFzZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLkpEQkNVc2VyRGF0YWJhc2U8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPkpORElSZWFsbTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5SRUFMTTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSk5ESVJlYWxtPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5NQmVhbkZhY3Rvcnk8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+PC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5NQmVhbkZhY3Rvcnk8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPk1lbW9yeVJlYWxtPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlJFQUxNPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG08L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5NZW1vcnlSZWFsbTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+TWVtb3J5VXNlckRhdGFiYXNlPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlVTRVJEQVRBQkFTRTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLk1lbW9yeVVzZXJEYXRhYmFzZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLk1lbW9yeVVzZXJEYXRhYmFzZTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+TmFtaW5nQ29udGV4dExpc3RlbmVyPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPkxJU1RFTkVSPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLk5hbWluZ0NvbnRleHRMaXN0ZW5lcjwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+TmFtaW5nUmVzb3VyY2VzPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlJFU09VUkNFUzwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5Ob25Mb2dpbkF1dGhlbnRpY2F0b3I8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VkFMVkU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuTm9uTG9naW5BdXRoZW50aWNhdG9yPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5QZXJzaXN0ZW50TWFuYWdlcjwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5NQU5BR0VSPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uUGVyc2lzdGVudE1hbmFnZXI8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlJlbW90ZUFkZHJWYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5WQUxWRTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlbW90ZUFkZHJWYWx2ZTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+UmVtb3RlSG9zdFZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlZBTFZFPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVtb3RlSG9zdFZhbHZlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5SZXF1ZXN0RHVtcGVyVmFsdmU8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VkFMVkU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZXF1ZXN0RHVtcGVyVmFsdmU8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlJvbGU8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+Uk9MRTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlJvbGU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Sb2xlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5TaW5nbGVTaWduT248L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VkFMVkU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5TaW5nbGVTaWduT248L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlNTTEF1dGhlbnRpY2F0b3I8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VkFMVkU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuU1NMQXV0aGVudGljYXRvcjwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+U3RhbmRhcmRDb250ZXh0PC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPkNPTlRFWFQ8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0PC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlN0YW5kYXJkQ29udGV4dFZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlZBTFZFPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dFZhbHZlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5TdGFuZGFyZEVuZ2luZTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5FTkdJTkU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5TdGFuZGFyZEVuZ2luZVZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlZBTFZFPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lVmFsdmU8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlN0YW5kYXJkSG9zdDwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5IT1NUPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuSG9zdDwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5TdGFuZGFyZEhvc3RWYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5WQUxWRTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3RWYWx2ZTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+U3RhbmRhcmRNYW5hZ2VyPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPk1BTkFHRVI8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5TdGFuZGFyZE1hbmFnZXI8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlN0YW5kYXJkU2VydmVyPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlNFUlZFUjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlcjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXI8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlN0YW5kYXJkU2VydmljZTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5TRVJWSUNFPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmljZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2aWNlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5TdGFuZGFyZFdyYXBwZXI8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+V1JBUFBFUjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLldyYXBwZXI8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkV3JhcHBlcjwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+U3RhbmRhcmRXcmFwcGVyVmFsdmU8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VkFMVkU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRXcmFwcGVyVmFsdmU8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlVzZXI8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VVNFUjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXI8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5Vc2VyRGF0YWJhc2VSZWFsbTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5SRUFMTTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uVXNlckRhdGFiYXNlUmVhbG08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPldlYmFwcExvYWRlcjwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5MT0FERVI8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIuV2ViYXBwTG9hZGVyPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKzwvdGFibGU+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iSlNSLTc3IENyb3NzIFJlZmVyZW5jZSI+CisKKzxwPlRoZSBtYW5hZ2VkIG9iamVjdHMgaW4gdGhlIEpTUi03NyBvYmplY3QgaGllcmFyY2h5IGNvcnJlc3BvbmQKK3RvIHRoZSBzcGVjaWZpZWQgTUJlYW4gbmFtZXMgb3IgZ3JvdXBzIGFzIGZvbGxvd3M6PC9wPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSI+CisKKyAgPHRyPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5KU1ItNzcgTWFuYWdlZCBPYmplY3Q8L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5NQmVhbiBOYW1lIG9yIEdyb3VwPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+Q29tbWVudHM8L3RoPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+SjJFRVNlcnZlcjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT4ke1NFUlZJQ0V9PC9jb2RlPjwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5Ob2RlPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPiR7U0VSVklDRX08L2NvZGU+PC90ZD4KKyAgICA8dGQ+VG9tY2F0IHN1cHBvcnRzIGEgc2luZ2xlIG5vZGUgb25seS48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+UG9ydDwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT4ke0NPTk5FQ1RPUn08L2NvZGU+PC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlNlcnZsZXQ8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+JHtXUkFQUEVSfTwvY29kZT48L3RkPgorICAgIDx0ZD48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+V2ViTW9kdWxlPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPiR7Q09OVEVYVH08L2NvZGU+PC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJKU1ItODggQ3Jvc3MgUmVmZXJlbmNlIj4KKworPHA+VGhlIGRlcGxveW1lbnQgb2JqZWN0cyBpbiB0aGUgSlNSLTg4IEFQSSBvYmplY3QgaGllcmFyY2h5IGNvcnJlc3BvbmQKK3RvIHRoZSBzcGVjaWZpZWQgTUJlYW4gbmFtZXMgb3IgZ3JvdXBzIGFzIGZvbGxvd3M6PC9wPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSI+CisKKyAgPHRyPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5KU1ItODggQVBJIE9iamVjdDwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPk1CZWFuIE5hbWUgb3IgR3JvdXA8L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5Db21tZW50czwvdGg+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5EZXBsb3lhYmxlT2JqZWN0PC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPiR7Q09OVEVYVH08L2NvZGU+PC90ZD4KKyAgICA8dGQ+Q29udGV4dCBkZXBsb3ltZW50IGluZm8gcGx1cyB0aGUgY29ycmVzcG9uZGluZyBXQVIgZmlsZTwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5UYXJnZXQ8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+JHtIT1NUfTwvY29kZT48L3RkPgorICAgIDx0ZD48L3RkPgorICA8L3RyPgorCis8L3RhYmxlPgorCis8L3NlY3Rpb24+CisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL3Byb2plY3QueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvcHJvamVjdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQxMjU0YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL3Byb2plY3QueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzxwcm9qZWN0IG5hbWU9IkNhdGFsaW5hIEZ1bmN0aW9uYWwgU3BlY2lmaWNhdGlvbnMiCisgICAgICAgIGhyZWY9Imh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy8iPgorCisgICAgPHRpdGxlPkNhdGFsaW5hIEZ1bmN0aW9uYWwgU3BlY2lmaWNhdGlvbnM8L3RpdGxlPgorCisgICAgPGxvZ28gaHJlZj0iL2ltYWdlcy90b21jYXQuZ2lmIj4KKyAgICAgIENhdGFsaW5hIEZ1bmN0aW9uYWwgU3BlY2lmaWNhdGlvbnMKKyAgICA8L2xvZ28+CisKKyAgICA8Ym9keT4KKworICAgIDxtZW51IG5hbWU9IkxpbmtzIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iRG9jcyBIb21lIiAgICAgICAgICAgICBocmVmPSIuLi8uLi9pbmRleC5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IkZ1bmN0aW9uYWwgU3BlY3MiICAgICAgaHJlZj0iaW5kZXguaHRtbCIvPgorICAgIDwvbWVudT4KKworICAgIDxtZW51IG5hbWU9IkFkbWluaXN0cmF0aXZlIEFwcHMiPgorICAgICAgICA8aXRlbSBuYW1lPSJPdmVyYWxsIFJlcXVpcmVtZW50cyIgIGhyZWY9ImZzLWFkbWluLWFwcHMuaHRtbCIvPgorCSAgPGl0ZW0gbmFtZT0iVG9tY2F0IE1CZWFuIE5hbWVzIiAgICBocmVmPSJtYmVhbi1uYW1lcy5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IkFkbWluaXN0ZXJlZCBPYmplY3RzIiAgaHJlZj0iZnMtYWRtaW4tb2JqZWN0cy5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IlN1cHBvcnRlZCBPcGVyYXRpb25zIiAgaHJlZj0iZnMtYWRtaW4tb3BlcnMuaHRtbCIvPgorICAgIDwvbWVudT4KKworICAgIDxtZW51IG5hbWU9IkludGVybmFsIFNlcnZsZXRzIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iRGVmYXVsdCBTZXJ2bGV0IiAgICAgICBocmVmPSJmcy1kZWZhdWx0Lmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iSW52b2tlciBTZXJ2bGV0IiAgICAgICBocmVmPSJmcy1pbnZva2VyLmh0bWwiLz4KKyAgICA8L21lbnU+CisKKyAgICA8bWVudSBuYW1lPSJSZWFsbSBJbXBsZW1lbnRhdGlvbnMiPgorICAgICAgICA8aXRlbSBuYW1lPSJKREJDIFJlYWxtIiAgICAgICAgICAgIGhyZWY9ImZzLWpkYmMtcmVhbG0uaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJKTkRJIFJlYWxtIiAgICAgICAgICAgIGhyZWY9ImZzLWpuZGktcmVhbG0uaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJNZW1vcnkgUmVhbG0iICAgICAgICAgIGhyZWY9ImZzLW1lbW9yeS1yZWFsbS5odG1sIi8+CisgICAgPC9tZW51PgorCisKKyAgICA8L2JvZHk+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaHRtbC1tYW5hZ2VyLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaHRtbC1tYW5hZ2VyLWhvd3RvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjNhNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9odG1sLW1hbmFnZXItaG93dG8ueG1sCkBAIC0wLDAgKzEsNTQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iaHRtbC1tYW5hZ2VyLWhvd3RvLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0iZ2xlbm5AYXBhY2hlLm9yZyI+R2xlbm4gTC4gTmllbHNlbjwvYXV0aG9yPgorICAgICAgICA8dGl0bGU+VG9tY2F0IFdlYiBBcHBsaWNhdGlvbiBNYW5hZ2VyIEhvdyBUbzwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworPHA+SW4gbWFueSBwcm9kdWN0aW9uIGVudmlyb25tZW50cyBpdCBpcyB2ZXJ5IHVzZWZ1bCB0byBoYXZlIHRoZSBjYXBhYmlsaXR5Cit0byBtYW5hZ2UgeW91ciB3ZWIgYXBwbGljYXRpb25zIHdpdGhvdXQgaGF2aW5nIHRvIHNodXQgZG93biBhbmQgcmVzdGFydAorVG9tY2F0LiAgVGhpcyBkb2N1bWVudCBpcyBmb3IgdGhlIEhUTUwgd2ViIGludGVyZmFjZSB0byB0aGUgd2ViIGFwcGxpY2F0aW9uCis8YSBocmVmPSJtYW5hZ2VyLWhvd3RvLmh0bWwiPm1hbmFnZXI8L2E+LjwvcD4KKworPHA+VGhlIGludGVyZmFjZSBpcyBkaXZpZGVkIGludG8gZml2ZSBzZWN0aW9uczoKKzx1bD4KKyAgPGxpPjxzdHJvbmc+TWVzc2FnZTwvc3Ryb25nPiAtIERpc3BsYXlzIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgbWVzc2FnZXMuPC9saT4KKyAgPGxpPjxzdHJvbmc+TWFuYWdlcjwvc3Ryb25nPiAtIEdlbmVyYWwgbWFuYWdlciBvcGVyYXRpb25zIGxpa2UgbGlzdCBhbmQKKyAgICAgIGhlbHAuPC9saT4KKyAgPGxpPjxzdHJvbmc+QXBwbGljYXRpb25zPC9zdHJvbmc+IC0gTGlzdCBvZiB3ZWIgYXBwbGljYXRpb25zIGFuZAorICAgICAgY29tbWFuZHMuPC9saT4KKyAgPGxpPjxzdHJvbmc+RGVwbG95PC9zdHJvbmc+IC0gRGVwbG95aW5nIHdlYiBhcHBsaWNhdGlvbnMuPC9saT4KKyAgPGxpPjxzdHJvbmc+U2VydmVyIEluZm9ybWF0aW9uPC9zdHJvbmc+IC0gSW5mb3JtYXRpb24gYWJvdXQgdGhlIFRvbWNhdAorICAgICAgc2VydmVyLjwvbGk+Cis8L3VsPgorPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9Ik1lc3NhZ2UiPgorCis8cD4KK0Rpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlIGxhc3Qgd2ViIGFwcGxpY2F0aW9uCittYW5hZ2VyIGNvbW1hbmQgeW91IHBlcmZvcm1lZC4gSWYgaXQgc3VjY2VlZGVkIDxzdHJvbmc+T0s8L3N0cm9uZz4gaXMgZGlzcGxheWVkCithbmQgbWF5IGJlIGZvbGxvd2VkIGJ5IGEgc3VjY2VzcyBtZXNzYWdlLiBJZiBpdCBmYWlsZWQgPHN0cm9uZz5GQUlMPC9zdHJvbmc+CitpcyBkaXNwbGF5ZWQgZm9sbG93ZWQgYnkgYW4gZXJyb3IgbWVzc2FnZS4gQ29tbW9uIGZhaWx1cmUgbWVzc2FnZXMgYXJlCitkb2N1bWVudGVkIGJlbG93IGZvciBlYWNoIGNvbW1hbmQuICBUaGUgY29tcGxldGUgbGlzdCBvZiBmYWlsdXJlIG1lc3NhZ2VzIGZvcgorZWFjaCBjb21tYW5kIGNhbiBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0ibWFuYWdlci1ob3d0by5odG1sIj5tYW5hZ2VyPC9hPiB3ZWIKK2FwcGxpY2F0aW9uIGRvY3VtZW50YXRpb24uCis8L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iTWFuYWdlciI+CisKKzxwPlRoZSBNYW5hZ2VyIHNlY3Rpb24gaGFzIHRocmVlIGxpbmtzOgorPHVsPgorICA8bGk+PHN0cm9uZz5MaXN0IEFwcGxpY2F0aW9uczwvc3Ryb25nPiAtIFJlZGlzcGxheSBhIGxpc3Qgb2Ygd2ViCisgICAgICBhcHBsaWNhdGlvbnMuPC9saT4KKyAgPGxpPjxzdHJvbmc+SFRNTCBNYW5hZ2VyIEhlbHA8L3N0cm9uZz4gLSBBIGxpbmsgdG8gdGhpcyBkb2N1bWVudC48L2xpPgorICA8bGk+PHN0cm9uZz5NYW5hZ2VyIEhlbHA8L3N0cm9uZz4gLSBBIGxpbmsgdG8gdGhlIGNvbXByZWhlbnNpdmUgTWFuYWdlcgorICAgICAgQXBwIEhPVyBUTy48L2xpPgorPC91bD4KKzwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJBcHBsaWNhdGlvbnMiPgorCis8cD5UaGUgQXBwbGljYXRpb25zIHNlY3Rpb24gbGlzdHMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHRoZSBpbnN0YWxsZWQgd2ViCithcHBsaWNhdGlvbnMgYW5kIHByb3ZpZGVzIGxpbmtzIGZvciBtYW5hZ2luZyB0aGVtLiBGb3IgZWFjaCB3ZWIgYXBwbGljYXRpb24KK3RoZSBmb2xsb3dpbmcgaXMgZGlzcGxheWVkOgorPHVsPgorICA8bGk+PHN0cm9uZz5QYXRoPC9zdHJvbmc+IC0gVGhlIHdlYiBhcHBsaWNhdG9uIGNvbnRleHQgcGF0aC48L2xpPgorICA8bGk+PHN0cm9uZz5EaXNwbGF5IE5hbWU8L3N0cm9uZz4gLSBUaGUgZGlzcGxheSBuYW1lIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgICBpZiBpdCBoYXMgb25lIGNvbmZpZ3VyZWQgaW4gaXRzICJ3ZWIueG1sIiBmaWxlLjwvbGk+CisgIDxsaT48c3Ryb25nPlJ1bm5pbmc8L3N0cm9uZz4gLSBXaGV0aGVyIHRoZSB3ZWIgYXBwbGljYXRpb24gaXMgcnVubmluZyBhbmQKKyAgICAgIGF2YWlsYWJsZSAodHJ1ZSksIG9yIG5vdCBydW5uaW5nIGFuZCB1bmF2YWlsYWJsZSAoZmFsc2UpLjwvbGk+CisgIDxsaT48c3Ryb25nPlNlc3Npb25zPC9zdHJvbmc+IC0gVGhlIG51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMgZm9yIHJlbW90ZQorICAgICAgdXNlcnMgb2YgdGhpcyB3ZWIgYXBwbGljYXRpb24uICBUaGUgbnVtYmVyIG9mIHNlc3Npb25zIGlzIGEgbGluayB3aGljaAorICAgICAgd2hlbiBzdWJtaXR0ZWQgZGlzcGxheXMgbW9yZSBkZXRhaWxzIGFib3V0IHNlc3Npb24gdXNhZ2UgYnkgdGhlIHdlYgorICAgICAgYXBwbGljYXRpb24gaW4gdGhlIE1lc3NhZ2UgYm94LjwvbGk+CisgIDxsaT48c3Ryb25nPkNvbW1hbmRzPC9zdHJvbmc+IC0gTGlzdHMgYWxsIGNvbW1hbmRzIHdoaWNoIGNhbiBiZSBwZXJmb3JtZWQgb24KKyAgICAgIHRoZSB3ZWIgYXBwbGljYXRpb24uIE9ubHkgdGhvc2UgY29tbWFuZHMgd2hpY2ggY2FuIGJlIHBlcmZvcm1lZCB3aWxsIGJlCisgICAgICBsaXN0ZWQgYXMgYSBsaW5rIHdoaWNoIGNhbiBiZSBzdWJtaXR0ZWQuIE5vIGNvbW1hbmRzIGNhbiBiZSBwZXJmb3JtZWQgb24KKyAgICAgIHRoZSBtYW5hZ2VyIHdlYiBhcHBsaWNhdGlvbiBpdHNlbGYuIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgY2FuIGJlCisgICAgICBwZXJmb3JtZWQ6CisgICAgICA8dWw+CisgICAgICAgIDxsaT48c3Ryb25nPlN0YXJ0PC9zdHJvbmc+IC0gU3RhcnQgYSB3ZWIgYXBwbGljYXRpb24gd2hpY2ggaGFkIGJlZW4KKyAgICAgICAgICAgIHN0b3BwZWQuPC9saT4KKyAgICAgICAgPGxpPjxzdHJvbmc+U3RvcDwvc3Ryb25nPiAtIFN0b3AgYSB3ZWIgYXBwbGljYXRpb24gd2hpY2ggaXMgY3VycmVudGx5CisgICAgICAgICAgICBydW5uaW5nIGFuZCBtYWtlIGl0IHVuYXZhaWxhYmxlLjwvbGk+CisgICAgICAgIDxsaT48c3Ryb25nPlJlbG9hZDwvc3Ryb25nPiAtIFJlbG9hZCB0aGUgd2ViIGFwcGxpY2F0aW9uIHNvIHRoYXQgbmV3CisgICAgICAgICAgICAiLmphciIgZmlsZXMgaW4gPGNvZGU+L1dFQi1JTkYvbGliLzwvY29kZT4gb3IgbmV3IGNsYXNzZXMgaW4KKyAgICAgICAgICAgIDxjb2RlPi9XRUItSU5GL2NsYXNzZXMvPC9jb2RlPiBjYW4gYmUgdXNlZC48L2xpPgorICAgICAgICA8bGk+PHN0cm9uZz5VbmRlcGxveTwvc3Ryb25nPiAtIFN0b3AgYW5kIHRoZW4gcmVtb3ZlIHRoaXMgd2ViCisgICAgICAgICAgICAgYXBwbGljYXRpb24gZnJvbSB0aGUgc2VydmVyLjwvbGk+CisgICAgICA8L3VsPgorICA8L2xpPgorPC91bD4KKzwvcD4KKworPHN1YnNlY3Rpb24gbmFtZT0iU3RhcnQiPgorCis8cD5TaWduYWwgYSBzdG9wcGVkIGFwcGxpY2F0aW9uIHRvIHJlc3RhcnQsIGFuZCBtYWtlIGl0c2VsZiBhdmFpbGFibGUgYWdhaW4uCitTdG9wcGluZyBhbmQgc3RhcnRpbmcgaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgaWYgdGhlIGRhdGFiYXNlIHJlcXVpcmVkIGJ5Cit5b3VyIGFwcGxpY2F0aW9uIGJlY29tZXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUuICBJdCBpcyB1c3VhbGx5IGJldHRlciB0bworc3RvcCB0aGUgd2ViIGFwcGxpY2F0aW9uIHRoYXQgcmVsaWVzIG9uIHRoaXMgZGF0YWJhc2UgcmF0aGVyIHRoYW4gbGV0dGluZwordXNlcnMgY29udGludW91c2x5IGVuY291bnRlciBkYXRhYmFzZSBleGNlcHRpb25zLjwvcD4KKworPHA+SWYgdGhpcyBjb21tYW5kIHN1Y2NlZWRzLCB5b3Ugd2lsbCBzZWUgYSBNZXNzYWdlIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorT0sgLSBTdGFydGVkIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCAvZXhhbXBsZXMKKzwvc291cmNlPgorCis8cD5PdGhlcndpc2UsIHRoZSBNZXNzYWdlIHdpbGwgc3RhcnQgd2l0aCA8Y29kZT5GQUlMPC9jb2RlPiBhbmQgaW5jbHVkZSBhbgorZXJyb3IgbWVzc2FnZS4gIFBvc3NpYmxlIGNhdXNlcyBmb3IgcHJvYmxlbXMgaW5jbHVkZToKKzx1bD4KKzxsaT48ZW0+RW5jb3VudGVyZWQgZXhjZXB0aW9uPC9lbT4KKyAgICA8YmxvY2txdW90ZT4gICAgICAgICAgICAgCisgICAgPHA+QW4gZXhjZXB0aW9uIHdhcyBlbmNvdW50ZXJlZCB0cnlpbmcgdG8gc3RhcnQgdGhlIHdlYiBhcHBsaWNhdGlvbi4KKyAgICBDaGVjayB0aGUgVG9tY2F0IDUgbG9ncyBmb3IgdGhlIGRldGFpbHMuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPiAgICAgICAKKzxsaT48ZW0+SW52YWxpZCBjb250ZXh0IHBhdGggd2FzIHNwZWNpZmllZDwvZW0+CisgICAgPGJsb2NrcXVvdGU+ICAgICAgICAgICAgIAorICAgIDxwPlRoZSBjb250ZXh0IHBhdGggbXVzdCBzdGFydCB3aXRoIGEgc2xhc2ggY2hhcmFjdGVyLCB1bmxlc3MgeW91IGFyZQorICAgIHJlZmVyZW5jaW5nIHRoZSBST09UIHdlYiBhcHBsaWNhdGlvbiAtLSBpbiB3aGljaCBjYXNlIHRoZSBjb250ZXh0IHBhdGgKKyAgICBtdXN0IGJlIGEgemVyby1sZW5ndGggc3RyaW5nLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4gICAgICAgCis8bGk+PGVtPk5vIGNvbnRleHQgZXhpc3RzIGZvciBwYXRoIC9mb288L2VtPgorICAgIDxibG9ja3F1b3RlPiAgICAgICAgICAgICAKKyAgICA8cD5UaGVyZSBpcyBubyBkZXBsb3llZCBhcHBsaWNhdGlvbiBvbiB0aGUgY29udGV4dCBwYXRoCisgICAgdGhhdCB5b3Ugc3BlY2lmaWVkLjwvcD4gIAorICAgIDwvYmxvY2txdW90ZT48L2xpPiAgICAgICAKKzxsaT48ZW0+Tm8gY29udGV4dCBwYXRoIHdhcyBzcGVjaWZpZWQ8L2VtPgorICAgIDxibG9ja3F1b3RlPiAgICAgICAgICAgICAKKyAgICBUaGUgPGNvZGU+cGF0aDwvY29kZT4gcGFyYW1ldGVyIGlzIHJlcXVpcmVkLgorICAgIDwvYmxvY2txdW90ZT48L2xpPiAgICAgICAKKzwvdWw+Cis8L3A+CisKKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iU3RvcCI+CisKKzxwPlNpZ25hbCBhbiBleGlzdGluZyBhcHBsaWNhdGlvbiB0byBtYWtlIGl0c2VsZiB1bmF2YWlsYWJsZSwgYnV0IGxlYXZlIGl0CitkZXBsb3llZC4gIEFueSByZXF1ZXN0IHRoYXQgY29tZXMgaW4gd2hpbGUgYW4gYXBwbGljYXRpb24gaXMKK3N0b3BwZWQgd2lsbCBzZWUgYW4gSFRUUCBlcnJvciA0MDQsIGFuZCB0aGlzIGFwcGxpY2F0aW9uIHdpbGwgc2hvdyBhcworInN0b3BwZWQiIG9uIGEgbGlzdCBhcHBsaWNhdGlvbnMgY29tbWFuZC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorPHA+SWYgdGhpcyBjb21tYW5kIHN1Y2NlZWRzLCB5b3Ugd2lsbCBzZWUgYSBNZXNzYWdlIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorT0sgLSBTdG9wcGVkIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCAvZXhhbXBsZXMKKzwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzxwPk90aGVyd2lzZSwgdGhlIE1lc3NhZ2Ugd2lsbCBzdGFydCB3aXRoIDxjb2RlPkZBSUw8L2NvZGU+IGFuZCBpbmNsdWRlIGFuCitlcnJvciBtZXNzYWdlLiAgUG9zc2libGUgY2F1c2VzIGZvciBwcm9ibGVtcyBpbmNsdWRlOgorPHVsPiAgICAgICAgICAgICAgICAgICAgICAgICAKKzxsaT48ZW0+RW5jb3VudGVyZWQgZXhjZXB0aW9uPC9lbT4KKyAgICA8YmxvY2txdW90ZT4gICAgICAgICAgICAgCisgICAgPHA+QW4gZXhjZXB0aW9uIHdhcyBlbmNvdW50ZXJlZCB0cnlpbmcgdG8gc3RvcCB0aGUgd2ViIGFwcGxpY2F0aW9uLgorICAgIENoZWNrIHRoZSBUb21jYXQgNSBsb2dzIGZvciB0aGUgZGV0YWlscy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+ICAgICAgIAorPGxpPjxlbT5JbnZhbGlkIGNvbnRleHQgcGF0aCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4gICAgICAgICAgICAgCisgICAgPHA+VGhlIGNvbnRleHQgcGF0aCBtdXN0IHN0YXJ0IHdpdGggYSBzbGFzaCBjaGFyYWN0ZXIsIHVubGVzcyB5b3UgYXJlCisgICAgcmVmZXJlbmNpbmcgdGhlIFJPT1Qgd2ViIGFwcGxpY2F0aW9uIC0tIGluIHdoaWNoIGNhc2UgdGhlIGNvbnRleHQgcGF0aAorICAgIG11c3QgYmUgYSB6ZXJvLWxlbmd0aCBzdHJpbmcuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPiAgICAgICAKKzxsaT48ZW0+Tm8gY29udGV4dCBleGlzdHMgZm9yIHBhdGggL2ZvbzwvZW0+CisgICAgPGJsb2NrcXVvdGU+ICAgICAgICAgICAgIAorICAgIDxwPlRoZXJlIGlzIG5vIGRlcGxveWVkIGFwcGxpY2F0aW9uIG9uIHRoZSBjb250ZXh0IHBhdGgKKyAgICB0aGF0IHlvdSBzcGVjaWZpZWQuPC9wPiAgCisgICAgPC9ibG9ja3F1b3RlPjwvbGk+ICAgICAgIAorPGxpPjxlbT5ObyBjb250ZXh0IHBhdGggd2FzIHNwZWNpZmllZDwvZW0+CisgICAgPGJsb2NrcXVvdGU+ICAgICAgICAgICAgIAorICAgIFRoZSA8Y29kZT5wYXRoPC9jb2RlPiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCisgICAgPC9ibG9ja3F1b3RlPjwvbGk+ICAgICAgIAorPC91bD4KKzwvcD4KKworPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJSZWxvYWQiPgorCis8cD5TaWduYWwgYW4gZXhpc3RpbmcgYXBwbGljYXRpb24gdG8gc2h1dCBpdHNlbGYgZG93biBhbmQgcmVsb2FkLiAgVGhpcyBjYW4KK2JlIHVzZWZ1bCB3aGVuIHRoZSB3ZWIgYXBwbGljYXRpb24gY29udGV4dCBpcyBub3QgcmVsb2FkYWJsZSBhbmQgeW91IGhhdmUKK3VwZGF0ZWQgY2xhc3NlcyBvciBwcm9wZXJ0eSBmaWxlcyBpbiB0aGUgPGNvZGU+L1dFQi1JTkYvY2xhc3NlczwvY29kZT4KK2RpcmVjdG9yeSBvciB3aGVuIHlvdSBoYXZlIGFkZGVkIG9yIHVwZGF0ZWQgamFyIGZpbGVzIGluIHRoZQorPGNvZGU+L1dFQi1JTkYvbGliPC9jb2RlPiBkaXJlY3RvcnkuCis8L3A+Cis8cD48c3Ryb25nPk5PVEU6PC9zdHJvbmc+IFRoZSA8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPgord2ViIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBub3QgY2hlY2tlZCBvbiBhIHJlbG9hZDsKK3RoZSBwcmV2aW91cyB3ZWIueG1sIGNvbmZpZ3VyYXRpb24gaXMgdXNlZC4KK0lmIHlvdSBoYXZlIG1hZGUgY2hhbmdlcyB0byB5b3VyIHdlYi54bWwgZmlsZSB5b3UgbXVzdCBzdG9wCit0aGVuIHN0YXJ0IHRoZSB3ZWIgYXBwbGljYXRpb24uCis8L3A+CisKKzxwPklmIHRoaXMgY29tbWFuZCBzdWNjZWVkcywgeW91IHdpbGwgc2VlIGEgTWVzc2FnZSBsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KK09LIC0gUmVsb2FkZWQgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIC9leGFtcGxlcworPC9zb3VyY2U+CisKKzxwPk90aGVyd2lzZSwgdGhlIE1lc3NhZ2Ugd2lsbCBzdGFydCB3aXRoIDxjb2RlPkZBSUw8L2NvZGU+IGFuZCBpbmNsdWRlIGFuCitlcnJvciBtZXNzYWdlLiAgUG9zc2libGUgY2F1c2VzIGZvciBwcm9ibGVtcyBpbmNsdWRlOgorPHVsPgorPGxpPjxlbT5FbmNvdW50ZXJlZCBleGNlcHRpb248L2VtPgorICAgIDxibG9ja3F1b3RlPiAgICAgICAgICAgICAKKyAgICA8cD5BbiBleGNlcHRpb24gd2FzIGVuY291bnRlcmVkIHRyeWluZyB0byByZXN0YXJ0IHRoZSB3ZWIgYXBwbGljYXRpb24uCisgICAgQ2hlY2sgdGhlIFRvbWNhdCA1IGxvZ3MgZm9yIHRoZSBkZXRhaWxzLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4gICAgICAgCis8bGk+PGVtPkludmFsaWQgY29udGV4dCBwYXRoIHdhcyBzcGVjaWZpZWQ8L2VtPgorICAgIDxibG9ja3F1b3RlPiAgICAgICAgICAgICAKKyAgICA8cD5UaGUgY29udGV4dCBwYXRoIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlciwgdW5sZXNzIHlvdSBhcmUKKyAgICByZWZlcmVuY2luZyB0aGUgUk9PVCB3ZWIgYXBwbGljYXRpb24gLS0gaW4gd2hpY2ggY2FzZSB0aGUgY29udGV4dCBwYXRoCisgICAgbXVzdCBiZSBhIHplcm8tbGVuZ3RoIHN0cmluZy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+ICAgICAgIAorPGxpPjxlbT5ObyBjb250ZXh0IGV4aXN0cyBmb3IgcGF0aCAvZm9vPC9lbT4KKyAgICA8YmxvY2txdW90ZT4gICAgICAgICAgICAgCisgICAgPHA+VGhlcmUgaXMgbm8gZGVwbG95ZWQgYXBwbGljYXRpb24gb24gdGhlIGNvbnRleHQgcGF0aAorICAgIHRoYXQgeW91IHNwZWNpZmllZC48L3A+ICAKKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4gICAgICAgCis8bGk+PGVtPk5vIGNvbnRleHQgcGF0aCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4gICAgICAgICAgICAgCisgICAgVGhlIDxjb2RlPnBhdGg8L2NvZGU+IHBhcmFtZXRlciBpcyByZXF1aXJlZC4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4gICAgICAgCis8bGk+PGVtPlJlbG9hZCBub3Qgc3VwcG9ydGVkIG9uIFdBUiBkZXBsb3llZCBhdCBwYXRoIC9mb288L2VtPgorICAgIDxibG9ja3F1b3RlPiAgICAgICAgICAgICAKKyAgICBDdXJyZW50bHksIGFwcGxpY2F0aW9uIHJlbG9hZGluZyAodG8gcGljayB1cCBjaGFuZ2VzIHRvIHRoZSBjbGFzc2VzIG9yCisgICAgPGNvZGU+d2ViLnhtbDwvY29kZT4gZmlsZSkgaXMgbm90IHN1cHBvcnRlZCB3aGVuIGEgd2ViIGFwcGxpY2F0aW9uIGlzCisgICAgaW5zdGFsbGVkIGRpcmVjdGx5IGZyb20gYSBXQVIgZmlsZSwgd2hpY2ggaGFwcGVucyB3aGVuIHRoZSBob3N0IGlzIAorICAgIGNvbmZpZ3VyZWQgdG8gbm90IHVucGFjayBXQVIgZmlsZXMuIEFzIGl0IG9ubHkgd29ya3Mgd2hlbiB0aGUgd2ViIAorICAgIGFwcGxpY2F0aW9uIGlzIGluc3RhbGxlZCBmcm9tIGFuIHVucGFja2VkIGRpcmVjdG9yeSwgaWYgeW91IGFyZSB1c2luZyAKKyAgICBhIFdBUiBmaWxlLCB5b3Ugc2hvdWxkIDxjb2RlPnVuZGVwbG95PC9jb2RlPiBhbmQgdGhlbiA8Y29kZT5kZXBsb3k8L2NvZGU+IAorICAgIHRoZSBhcHBsaWNhdGlvbiBhZ2FpbiB0byBwaWNrIHVwIHlvdXIgY2hhbmdlcy4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4gICAgICAgCis8L3VsPgorPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IlVuZGVwbG95Ij4KKworPHA+PHN0cm9uZz48Zm9udCBjb2xvcj0icmVkIj5XQVJOSU5HPC9mb250PiAtIFRoaXMgY29tbWFuZCB3aWxsIGRlbGV0ZSB0aGUKK2NvbnRlbnRzIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gZGlyZWN0b3J5IGFuZC9vciAiLndhciIgZmlsZSBpZiBpdCBleGlzdHMgd2l0aGluCit0aGUgPGNvZGU+YXBwQmFzZTwvY29kZT4gZGlyZWN0b3J5ICh0eXBpY2FsbHkgIndlYmFwcHMiKSBmb3IgdGhpcyB2aXJ0dWFsIGhvc3QKKzwvc3Ryb25nPi4gIFRoZSB3ZWIgYXBwbGljYXRpb24gdGVtcG9yYXJ5IHdvcmsgZGlyZWN0b3J5IGlzIGFsc28gZGVsZXRlZC4gIElmCit5b3Ugc2ltcGx5IHdhbnQgdG8gdGFrZSBhbiBhcHBsaWNhdGlvbiBvdXQgb2Ygc2VydmljZSwgeW91IHNob3VsZCB1c2UgdGhlCis8Y29kZT4vc3RvcDwvY29kZT4gY29tbWFuZCBpbnN0ZWFkLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCis8cD5TaWduYWwgYW4gZXhpc3RpbmcgYXBwbGljYXRpb24gdG8gZ3JhY2VmdWxseSBzaHV0IGl0c2VsZiBkb3duLCBhbmQgdGhlbgorcmVtb3ZlIGl0IGZyb20gVG9tY2F0ICh3aGljaCBhbHNvIG1ha2VzIHRoaXMgY29udGV4dCBwYXRoIGF2YWlsYWJsZSBmb3IKK3JldXNlIGxhdGVyKS4gIFRoaXMgY29tbWFuZCBpcyB0aGUgbG9naWNhbCBvcHBvc2l0ZSBvZiB0aGUKKzxjb2RlPi9kZXBsb3k8L2NvZGU+IEFudCBjb21tYW5kLCBhbmQgdGhlIHJlbGF0ZWQgZGVwbG95IGZlYXR1cmVzIGF2YWlsYWJsZSAKK2luIHRoZSBIVE1MIG1hbmFnZXIuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzxwPklmIHRoaXMgY29tbWFuZCBzdWNjZWVkcywgeW91IHdpbGwgc2VlIGEgTWVzc2FnZSBsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KK09LIC0gVW5kZXBsb3llZCBhcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggL2V4YW1wbGVzCis8L3NvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCis8cD5PdGhlcndpc2UsIHRoZSBNZXNzYWdlIHdpbGwgc3RhcnQgd2l0aCA8Y29kZT5GQUlMPC9jb2RlPiBhbmQgaW5jbHVkZSBhbgorZXJyb3IgbWVzc2FnZS4gIFBvc3NpYmxlIGNhdXNlcyBmb3IgcHJvYmxlbXMgaW5jbHVkZToKKzx1bD4gICAgICAgICAgICAgICAgICAgICAgICAgCis8bGk+PGVtPkVuY291bnRlcmVkIGV4Y2VwdGlvbjwvZW0+CisgICAgPGJsb2NrcXVvdGU+ICAgICAgICAgICAgIAorICAgIDxwPkFuIGV4Y2VwdGlvbiB3YXMgZW5jb3VudGVyZWQgdHJ5aW5nIHRvIHVuZGVwbG95IHRoZSB3ZWIgYXBwbGljYXRpb24uCisgICAgQ2hlY2sgdGhlIFRvbWNhdCBsb2dzIGZvciB0aGUgZGV0YWlscy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+ICAgICAgIAorPGxpPjxlbT5JbnZhbGlkIGNvbnRleHQgcGF0aCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4gICAgICAgICAgICAgCisgICAgPHA+VGhlIGNvbnRleHQgcGF0aCBtdXN0IHN0YXJ0IHdpdGggYSBzbGFzaCBjaGFyYWN0ZXIsIHVubGVzcyB5b3UgYXJlCisgICAgcmVmZXJlbmNpbmcgdGhlIFJPT1Qgd2ViIGFwcGxpY2F0aW9uIC0tIGluIHdoaWNoIGNhc2UgdGhlIGNvbnRleHQgcGF0aAorICAgIG11c3QgYmUgYSB6ZXJvLWxlbmd0aCBzdHJpbmcuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPiAgICAgICAKKzxsaT48ZW0+Tm8gY29udGV4dCBleGlzdHMgZm9yIHBhdGggL2ZvbzwvZW0+CisgICAgPGJsb2NrcXVvdGU+ICAgICAgICAgICAgIAorICAgIDxwPlRoZXJlIGlzIG5vIGRlcGxveWVkIGFwcGxpY2F0aW9uIG9uIHRoZSBjb250ZXh0IHBhdGgKKyAgICB0aGF0IHlvdSBzcGVjaWZpZWQuPC9wPiAgCisgICAgPC9ibG9ja3F1b3RlPjwvbGk+ICAgICAgIAorPGxpPjxlbT5ObyBjb250ZXh0IHBhdGggd2FzIHNwZWNpZmllZDwvZW0+CisgICAgPGJsb2NrcXVvdGU+ICAgICAgICAgICAgIAorICAgIFRoZSA8Y29kZT5wYXRoPC9jb2RlPiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCisgICAgPC9ibG9ja3F1b3RlPjwvbGk+ICAgICAgIAorPC91bD4KKzwvcD4KKworPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkRlcGxveSI+CisKKzxwPldlYiBhcHBsaWNhdGlvbnMgY2FuIGJlIGRlcGxveWVkIHVzaW5nIGZpbGVzIG9yIGRpcmVjdG9yaWVzIGxvY2F0ZWQKK29uIHRoZSBUb21jYXQgc2VydmVyIG9yIHlvdSBjYW4gdXBsb2FkIGEgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgKFdBUikKK2ZpbGUgdG8gdGhlIHNlcnZlci48L3A+CisKKzxwPlRvIGluc3RhbGwgYW4gYXBwbGljYXRpb24sIGZpbGwgaW4gdGhlIGFwcHJvcHJpYXRlIGZpZWxkcyBmb3IgdGhlIHR5cGUKK29mIGluc3RhbGwgeW91IHdhbnQgdG8gZG8gYW5kIHRoZW4gc3VibWl0IGl0IHVzaW5nIHRoZSA8aT5JbnN0YWxsPC9pPgorYnV0dG9uLjwvcD4KKworPHN1YnNlY3Rpb24gbmFtZT0iRGVwbG95IGRpcmVjdG9yeSBvciBXQVIgZmlsZSBsb2NhdGVkIG9uIHNlcnZlciI+CisKKzxwPkRlcGxveSBhbmQgc3RhcnQgYSBuZXcgd2ViIGFwcGxpY2F0aW9uLCBhdHRhY2hlZCB0byB0aGUgc3BlY2lmaWVkIDxpPkNvbnRleHQKK1BhdGg6PC9pPiAod2hpY2ggbXVzdCBub3QgYmUgaW4gdXNlIGJ5IGFueSBvdGhlciB3ZWIgYXBwbGljYXRpb24pLgorVGhpcyBjb21tYW5kIGlzIHRoZSBsb2dpY2FsIG9wcG9zaXRlIG9mIHRoZSA8ZW0+VW5kZXBsb3k8L2VtPiBjb21tYW5kLjwvcD4KKworPHA+VGhlcmUgYXJlIGEgbnVtYmVyIG9mIGRpZmZlcmVudCB3YXlzIHRoZSBkZXBsb3kgY29tbWFuZCBjYW4gYmUgdXNlZC48L3A+CisKKzxoMz5EZXBsb3kgYSBEaXJlY3Rvcnkgb3IgV0FSIGJ5IFVSTDwvaDM+CisKKzxwPkluc3RhbGwgYSB3ZWIgYXBwbGljYXRpb24gZGlyZWN0b3J5IG9yICIud2FyIiBmaWxlIGxvY2F0ZWQgb24gdGhlIFRvbWNhdAorc2VydmVyLiBJZiBubyA8aT5Db250ZXh0IFBhdGg8L2k+IGlzIHNwZWNpZmllZCwgdGhlIGRpcmVjdG9yeSBuYW1lIG9yIHRoZQord2FyIGZpbGUgbmFtZSB3aXRob3V0IHRoZSAiLndhciIgZXh0ZW5zaW9uIGlzIHVzZWQgYXMgdGhlIHBhdGguIFRoZQorPGk+V0FSIG9yIERpcmVjdG9yeSBVUkw8L2k+IHNwZWNpZmllcyBhIFVSTCAoaW5jbHVkaW5nIHRoZSA8Y29kZT5maWxlOjwvY29kZT4KK3NjaGVtZSkgZm9yIGVpdGhlciBhIGRpcmVjdG9yeSBvciBhIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIChXQVIpIGZpbGUuIFRoZQorc3VwcG9ydGVkIHN5bnRheCBmb3IgYSBVUkwgcmVmZXJyaW5nIHRvIGEgV0FSIGZpbGUgaXMgZGVzY3JpYmVkIG9uIHRoZSBKYXZhZG9jcworcGFnZSBmb3IgdGhlIDxjb2RlPmphdmEubmV0LkphclVSTENvbm5lY3Rpb248L2NvZGU+IGNsYXNzLiAgVXNlIG9ubHkgVVJMcyB0aGF0CityZWZlciB0byB0aGUgZW50aXJlIFdBUiBmaWxlLjwvcD4KKworPHA+SW4gdGhpcyBleGFtcGxlIHRoZSB3ZWIgYXBwbGljYXRpb24gbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5Cis8Y29kZT5DOlxwYXRoXHRvXGZvbzwvY29kZT4gb24gdGhlIFRvbWNhdCBzZXJ2ZXIgKHJ1bm5pbmcgb24gV2luZG93cykKK2lzIGRlcGxveWVkIGFzIHRoZSB3ZWIgYXBwbGljYXRpb24gY29udGV4dCBuYW1lZCA8Y29kZT4vZm9vdG9vPC9jb2RlPi4KKzxzb3VyY2U+CitDb250ZXh0IFBhdGg6IC9mb290b28KK1dBUiBvciBEaXJlY3RvcnkgVVJMOiBmaWxlOkM6L3BhdGgvdG8vZm9vCis8L3NvdXJjZT4KKzwvcD4KKworPHA+SW4gdGhpcyBleGFtcGxlIHRoZSAiLndhciIgZmlsZSA8Y29kZT4vcGF0aC90by9iYXIud2FyPC9jb2RlPiBvbiB0aGUKK1RvbWNhdCBzZXJ2ZXIgKHJ1bm5pbmcgb24gVW5peCkgaXMgZGVwbG95ZWQgYXMgdGhlIHdlYiBhcHBsaWNhdGlvbgorY29udGV4dCBuYW1lZCA8Y29kZT4vYmFyPC9jb2RlPi4gTm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gPGNvZGU+cGF0aDwvY29kZT4KK3BhcmFtZXRlciBzbyB0aGUgY29udGV4dCBwYXRoIGRlZmF1bHRzIHRvIHRoZSBuYW1lIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24KK2FyY2hpdmUgZmlsZSB3aXRob3V0IHRoZSAiLndhciIgZXh0ZW5zaW9uLgorPHNvdXJjZT4KK1dBUiBvciBEaXJlY3RvcnkgVVJMOiBqYXI6ZmlsZTovcGF0aC90by9iYXIud2FyIS8KKzwvc291cmNlPgorPC9wPgorCis8aDM+RGVwbG95IGEgRGlyZWN0b3J5IG9yIFdhciBmcm9tIHRoZSBIb3N0IGFwcEJhc2U8L2gzPgorCis8cD5JbnN0YWxsIGEgd2ViIGFwcGxpY2F0aW9uIGRpcmVjdG9yeSBvciAiLndhciIgZmlsZSBsb2NhdGVkIGluIHlvdXIgSG9zdAorYXBwQmFzZSBkaXJlY3RvcnkuIElmIG5vIDxpPkNvbnRleHQgUGF0aDwvaT4gaXMgc3BlY2lmaWVkIHRoZSBkaXJlY3RvcnkgbmFtZQorb3IgdGhlIHdhciBmaWxlIG5hbWUgd2l0aG91dCB0aGUgIi53YXIiIGV4dGVuc2lvbiBpcyB1c2VkIGFzIHRoZSBwYXRoLjwvcD4KKworPHA+SW4gdGhpcyBleGFtcGxlIHRoZSB3ZWIgYXBwbGljYXRpb24gbG9jYXRlZCBpbiBhIHN1YmRpcmVjdG9yeSBuYW1lZAorPGNvZGU+Zm9vPC9jb2RlPiBpbiB0aGUgSG9zdCBhcHBCYXNlIGRpcmVjdG9yeSBvZiB0aGUgVG9tY2F0IHNlcnZlciBpcworZGVwbG95ZWQgYXMgdGhlIHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0IG5hbWVkIDxjb2RlPi9mb288L2NvZGU+LiBOb3RpY2UKK3RoYXQgdGhlcmUgaXMgbm8gPGNvZGU+cGF0aDwvY29kZT4gcGFyYW1ldGVyIHNvIHRoZSBjb250ZXh0IHBhdGggZGVmYXVsdHMKK3RvIHRoZSBuYW1lIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gZGlyZWN0b3J5LgorPHNvdXJjZT4KK1dBUiBvciBEaXJlY3RvcnkgVVJMOiBmb28KKzwvc291cmNlPgorPC9wPgorCis8cD5JbiB0aGlzIGV4YW1wbGUgdGhlICIud2FyIiBmaWxlIDxjb2RlPmJhci53YXI8L2NvZGU+IGxvY2F0ZWQgaW4geW91cgorSG9zdCBhcHBCYXNlIGRpcmVjdG9yeSBvbiB0aGUgVG9tY2F0IHNlcnZlciBpcyBkZXBsb3llZCBhcyB0aGUgd2ViCithcHBsaWNhdGlvbiBjb250ZXh0IG5hbWVkIDxjb2RlPi9iYXJ0b288L2NvZGU+LgorPHNvdXJjZT4KK0NvbnRleHQgUGF0aDogL2JhcnRvbworV0FSIG9yIERpcmVjdG9yeSBVUkw6IGJhci53YXIKKzwvc291cmNlPgorPC9wPgorCis8aDM+RGVwbG95IHVzaW5nIGEgQ29udGV4dCBjb25maWd1cmF0aW9uICIueG1sIiBmaWxlPC9oMz4KKworPHA+SWYgdGhlIEhvc3QgZGVwbG95WE1MIGZsYWcgaXMgc2V0IHRvIHRydWUsIHlvdSBjYW4gaW5zdGFsbCBhIHdlYgorYXBwbGljYXRpb24gdXNpbmcgYSBDb250ZXh0IGNvbmZpZ3VyYXRpb24gIi54bWwiIGZpbGUgYW5kIGFuIG9wdGlvbmFsCisiLndhciIgZmlsZSBvciB3ZWIgYXBwbGljYXRpb24gZGlyZWN0b3J5LiBUaGUgPGk+Q29udGV4dCBQYXRoPC9pPgoraXMgbm90IHVzZWQgd2hlbiBpbnN0YWxsaW5nIGEgd2ViIGFwcGxpY2F0aW9uIHVzaW5nIGEgY29udGV4dCAiLnhtbCIKK2NvbmZpZ3VyYXRpb24gZmlsZS48L3A+CisKKzxwPkEgQ29udGV4dCBjb25maWd1cmF0aW9uICIueG1sIiBmaWxlIGNhbiBjb250YWluIHZhbGlkIFhNTCBmb3IgYQord2ViIGFwcGxpY2F0aW9uIENvbnRleHQganVzdCBhcyBpZiBpdCB3ZXJlIGNvbmZpZ3VyZWQgaW4geW91cgorVG9tY2F0IDxjb2RlPnNlcnZlci54bWw8L2NvZGU+IGNvbmZpZ3VyYXRpb24gZmlsZS4gSGVyZSBpcyBhbgorZXhhbXBsZSBmb3IgVG9tY2F0IHJ1bm5pbmcgb24gV2luZG93czoKKzxzb3VyY2U+CismbHQ7Q29udGV4dCBwYXRoPSIvZm9vYmFyIiBkb2NCYXNlPSJDOlxwYXRoXHRvXGFwcGxpY2F0aW9uXGZvb2JhciIKKyAgICAgICAgIGRlYnVnPSIwIiZndDsKKworICAmbHQ7IS0tIExpbmsgdG8gdGhlIHVzZXIgZGF0YWJhc2Ugd2Ugd2lsbCBnZXQgcm9sZXMgZnJvbSAtLSZndDsKKyAgJmx0O1Jlc291cmNlTGluayBuYW1lPSJ1c2VycyIgZ2xvYmFsPSJVc2VyRGF0YWJhc2UiCisgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2UiLyZndDsKKworJmx0Oy9Db250ZXh0Jmd0OworPC9zb3VyY2U+Cis8L3A+CisKKzxwPlVzZSBvZiB0aGUgPGk+V0FSIG9yIERpcmVjdG9yeSBVUkw8L2k+IGlzIG9wdGlvbmFsLiBXaGVuIHVzZWQKK3RvIHNlbGVjdCBhIHdlYiBhcHBsaWNhdGlvbiAiLndhciIgZmlsZSBvciBkaXJlY3RvcnkgaXQgb3ZlcnJpZGVzIGFueQorZG9jQmFzZSBjb25maWd1cmVkIGluIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb24gIi54bWwiIGZpbGUuPC9wPgorCis8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaW5zdGFsbGluZyBhbiBhcHBsaWNhdGlvbiB1c2luZyBhIENvbnRleHQKK2NvbmZpZ3VyYXRpb24gIi54bWwiIGZpbGUgZm9yIFRvbWNhdCBydW5uaW5nIG9uIFdpbmRvd3MuCis8c291cmNlPgorWE1MIENvbmZpZ3VyYXRpb24gZmlsZSBVUkw6IGZpbGU6QzovcGF0aC90by9jb250ZXh0LnhtbAorPC9zb3VyY2U+Cis8L3A+CisKKzxwPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBpbnN0YWxsaW5nIGFuIGFwcGxpY2F0aW9uIHVzaW5nIGEgQ29udGV4dAorY29uZmlndXJhdGlvbiAiLnhtbCIgZmlsZSBhbmQgYSB3ZWIgYXBwbGljYXRpb24gIi53YXIiIGZpbGUgbG9jYXRlZAorb24gdGhlIHNlcnZlciAoVG9tY2F0IHJ1bm5pbmcgb24gVW5peCkuCis8c291cmNlPgorWE1MIENvbmZpZ3VyYXRpb24gZmlsZSBVUkw6IGZpbGU6L3BhdGgvdG8vY29udGV4dC54bWwKK1dBUiBvciBEaXJlY3RvcnkgVVJMOiBqYXI6ZmlsZTovcGF0aC90by9iYXIud2FyIS8KKzwvc291cmNlPgorPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IlVwbG9hZCBhIFdBUiBmaWxlIHRvIGluc3RhbGwiPgorCis8cD5VcGxvYWQgYSBXQVIgZmlsZSBmcm9tIHlvdXIgbG9jYWwgc3lzdGVtIGFuZCBpbnN0YWxsIGl0IGludG8gdGhlCithcHBCYXNlIGZvciB5b3VyIEhvc3QuIFRoZSBuYW1lIG9mIHRoZSBXQVIgZmlsZSB3aXRob3V0IHRoZSAiLndhciIKK2V4dGVuc2lvbiBpcyB1c2VkIGFzIHRoZSBjb250ZXh0IHBhdGggbmFtZS48L3A+CisKKzxwPlVzZSB0aGUgPGk+QnJvd3NlPC9pPiBidXR0b24gdG8gc2VsZWN0IGEgV0FSIGZpbGUgdG8gdXBsb2FkIHRvIHRoZQorc2VydmVyIGZyb20geW91ciBsb2NhbCBkZXNrdG9wIHN5c3RlbS48L3A+CisKKzxwPlRoZSAuV0FSIGZpbGUgbWF5IGluY2x1ZGUgVG9tY2F0IHNwZWNpZmljIGRlcGxveW1lbnQgY29uZmlndXJhdGlvbiwgYnkgCitpbmNsdWRpbmcgYSBDb250ZXh0IGNvbmZpZ3VyYXRpb24gWE1MIGZpbGUgaW4gCis8Y29kZT4vTUVUQS1JTkYvY29udGV4dC54bWw8L2NvZGU+LjwvcD4KKworPHA+VXBsb2FkIG9mIGEgV0FSIGZpbGUgY291bGQgZmFpbCBmb3IgdGhlIGZvbGxvd2luZyByZWFzb25zOjwvcD4KKzx1bD4KKzxsaT48ZW0+RmlsZSB1cGxvYWRlZCBtdXN0IGJlIGEgLndhcjwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+VGhlIHVwbG9hZCBpbnN0YWxsIHdpbGwgb25seSBhY2NlcHQgZmlsZXMgd2hpY2ggaGF2ZSB0aGUgZmlsZW5hbWUKKyAgICBleHRlbnNpb24gb2YgIi53YXIiLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+V2FyIGZpbGUgYWxyZWFkeSBleGlzdHMgb24gc2VydmVyPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5JZiBhIHdhciBmaWxlIG9mIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4geW91ciBIb3N0J3MKKyAgICBhcHBCYXNlIHRoZSB1cGxvYWQgd2lsbCBmYWlsLiBFaXRoZXIgdW5kZXBsb3kgdGhlIGV4aXN0aW5nIHdhciBmaWxlCisgICAgZnJvbSB5b3VyIEhvc3QncyBhcHBCYXNlIG9yIHVwbG9hZCB0aGUgbmV3IHdhciBmaWxlIHVzaW5nIGEgZGlmZmVyZW50CisgICAgbmFtZS48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8bGk+PGVtPkZpbGUgdXBsb2FkIGZhaWxlZCwgbm8gZmlsZTwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+VGhlIGZpbGUgdXBsb2FkIGZhaWxlZCwgbm8gZmlsZSB3YXMgcmVjZWl2ZWQgYnkgdGhlIHNlcnZlci48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8bGk+PGVtPkluc3RhbGwgVXBsb2FkIEZhaWxlZCwgRXhjZXB0aW9uOjwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+VGhlIHdhciBmaWxlIHVwbG9hZCBvciBpbnN0YWxsIGZhaWxlZCB3aXRoIGEgSmF2YSBFeGNlcHRpb24uCisgICAgVGhlIGV4Y2VwdGlvbiBtZXNzYWdlIHdpbGwgYmUgbGlzdGVkLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzwvdWw+CisKKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iRGVwbG95bWVudCBOb3RlcyI+CisKKzxwPklmIHRoZSBIb3N0IGlzIGNvbmZpZ3VyZWQgd2l0aCB1bnBhY2tXQVJzPXRydWUgYW5kIHlvdSBpbnN0YWxsIGEgd2FyCitmaWxlLCB0aGUgd2FyIHdpbGwgYmUgdW5wYWNrZWQgaW50byBhIGRpcmVjdG9yeSBpbiB5b3VyIEhvc3QgYXBwQmFzZQorZGlyZWN0b3J5LjwvcD4KKworPHA+SWYgdGhlIGFwcGxpY2F0aW9uIHdhciBvciBkaXJlY3RvcnkgaXMgZGVwbG95ZWQgaW4geW91ciBIb3N0IGFwcEJhc2UKK2RpcmVjdG9yeSBhbmQgZWl0aGVyIHRoZSBIb3N0IGlzIGNvbmZpZ3VyZWQgd2l0aCBhdXRvRGVwbG95PXRydWUgb3IKK2xpdmVEZXBsb3k9dHJ1ZSwgdGhlIENvbnRleHQgcGF0aCBtdXN0IG1hdGNoIHRoZSBkaXJlY3RvcnkgbmFtZSBvcgord2FyIGZpbGUgbmFtZSB3aXRob3V0IHRoZSAiLndhciIgZXh0ZW5zaW9uLjwvcD4KKworPHA+Rm9yIHNlY3VyaXR5IHdoZW4gdW50cnVzdGVkIHVzZXJzIGNhbiBtYW5hZ2Ugd2ViIGFwcGxpY2F0aW9ucywgdGhlCitIb3N0IGRlcGxveVhNTCBmbGFnIGNhbiBiZSBzZXQgdG8gZmFsc2UuICBUaGlzIHByZXZlbnRzIHVudHJ1c3RlZCB1c2VycworZnJvbSBpbnN0YWxsaW5nIHdlYiBhcHBsaWNhdGlvbnMgdXNpbmcgYSBjb25maWd1cmF0aW9uIFhNTCBmaWxlIGFuZAorYWxzbyBwcmV2ZW50cyB0aGVtIGZyb20gaW5zdGFsbGluZyBhcHBsaWNhdGlvbiBkaXJlY3RvcmllcyBvciAiLndhciIKK2ZpbGVzIGxvY2F0ZWQgb3V0c2lkZSBvZiB0aGVpciBIb3N0IGFwcEJhc2UuPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IkRlcGxveSBNZXNzYWdlIj4KKworPHA+SWYgZGVwbG95bWVudCBhbmQgc3RhcnR1cCBpcyBzdWNjZXNzZnVsLCB5b3Ugd2lsbCByZWNlaXZlIGEgTWVzc2FnZQorbGlrZSB0aGlzOjwvcD4KKzxzb3VyY2U+CitPSyAtIERlcGxveWVkIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCAvZm9vCis8L3NvdXJjZT4KKworPHA+T3RoZXJ3aXNlLCB0aGUgTWVzc2FnZSB3aWxsIHN0YXJ0IHdpdGggPGNvZGU+RkFJTDwvY29kZT4gYW5kIGluY2x1ZGUgYW4KK2Vycm9yIG1lc3NhZ2UuICBQb3NzaWJsZSBjYXVzZXMgZm9yIHByb2JsZW1zIGluY2x1ZGU6PC9wPgorPHVsPgorPGxpPjxlbT5BcHBsaWNhdGlvbiBhbHJlYWR5IGV4aXN0cyBhdCBwYXRoIC9mb288L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPlRoZSBjb250ZXh0IHBhdGhzIGZvciBhbGwgY3VycmVudGx5IHJ1bm5pbmcgd2ViIGFwcGxpY2F0aW9ucyBtdXN0IGJlCisgICAgdW5pcXVlLiAgVGhlcmVmb3JlLCB5b3UgbXVzdCBlaXRoZXIgdW5kZXBsb3kgdGhlIGV4aXN0aW5nIHdlYgorICAgIGFwcGxpY2F0aW9uIHVzaW5nIHRoaXMgY29udGV4dCBwYXRoLCBvciBjaG9vc2UgYSBkaWZmZXJlbnQgY29udGV4dCBwYXRoCisgICAgZm9yIHRoZSBuZXcgb25lLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+RG9jdW1lbnQgYmFzZSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSByZWFkYWJsZSBkaXJlY3Rvcnk8L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPlRoZSBVUkwgc3BlY2lmaWVkIGJ5IHRoZSA8aT5XQVIgb3IgRGlyZWN0b3J5IFVSTDo8L2k+IGZpZWxkIG11c3QKKyAgICBpZGVudGlmeSBhIGRpcmVjdG9yeSBvbiB0aGlzIHNlcnZlciB0aGF0IGNvbnRhaW5zIHRoZSAidW5wYWNrZWQiIHZlcnNpb24KKyAgICBvZiBhIHdlYiBhcHBsaWNhdGlvbiwgb3IgdGhlIGFic29sdXRlIFVSTCBvZiBhIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlCisgICAgKFdBUikgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMgYXBwbGljYXRpb24uICBDb3JyZWN0IHRoZSB2YWx1ZSBlbnRlcmVkIGZvcgorICAgIHRoZSA8aT5XQVIgb3IgRGlyZWN0b3J5IFVSTDo8L2k+IGZpZWxkLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+RW5jb3VudGVyZWQgZXhjZXB0aW9uPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5BbiBleGNlcHRpb24gd2FzIGVuY291bnRlcmVkIHRyeWluZyB0byBzdGFydCB0aGUgbmV3IHdlYiBhcHBsaWNhdGlvbi4KKyAgICBDaGVjayB0aGUgVG9tY2F0IDUgbG9ncyBmb3IgdGhlIGRldGFpbHMsIGJ1dCBsaWtlbHkgZXhwbGFuYXRpb25zIGluY2x1ZGUKKyAgICBwcm9ibGVtcyBwYXJzaW5nIHlvdXIgPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4gZmlsZSwgb3IgbWlzc2luZworICAgIGNsYXNzZXMgZW5jb3VudGVyZWQgd2hlbiBpbml0aWFsaXppbmcgYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzIGFuZAorICAgIGZpbHRlcnMuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5JbnZhbGlkIGFwcGxpY2F0aW9uIFVSTCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5UaGUgVVJMIGZvciB0aGUgPGk+V0FSIG9yIERpcmVjdG9yeSBVUkw6PC9pPiBmaWVsZCB0aGF0IHlvdSBzcGVjaWZpZWQKKyAgICB3YXMgbm90IHZhbGlkLiAgU3VjaCBVUkxzIG11c3Qgc3RhcnQgd2l0aCA8Y29kZT5maWxlOjwvY29kZT4sIGFuZCBVUkxzCisgICAgZm9yIGEgV0FSIGZpbGUgbXVzdCBlbmQgaW4gIi53YXIiLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+SW52YWxpZCBjb250ZXh0IHBhdGggd2FzIHNwZWNpZmllZDwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+VGhlIGNvbnRleHQgcGF0aCBtdXN0IHN0YXJ0IHdpdGggYSBzbGFzaCBjaGFyYWN0ZXIsIHVubGVzcyB5b3UgYXJlCisgICAgcmVmZXJlbmNpbmcgdGhlIFJPT1Qgd2ViIGFwcGxpY2F0aW9uIC0tIGluIHdoaWNoIGNhc2UgdGhlIGNvbnRleHQgcGF0aAorICAgIG11c3QgYmUgYSAiLyIgc3RyaW5nLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+Q29udGV4dCBwYXRoIG11c3QgbWF0Y2ggdGhlIGRpcmVjdG9yeSBvciBXQVIgZmlsZSBuYW1lOjwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgSWYgdGhlIGFwcGxpY2F0aW9uIHdhciBvciBkaXJlY3RvcnkgaXMgZGVwbG95ZWQgaW4geW91ciBIb3N0IGFwcEJhc2UKKyAgICBkaXJlY3RvcnkgYW5kIGVpdGhlciB0aGUgSG9zdCBpcyBjb25maWd1cmVkIHdpdGggYXV0b0RlcGxveT10cnVlIG9yCisgICAgbGl2ZURlcGxveT10cnVlLCB0aGUgQ29udGV4dCBwYXRoIG11c3QgbWF0Y2ggdGhlIGRpcmVjdG9yeSBuYW1lIG9yCisgICAgd2FyIGZpbGUgbmFtZSB3aXRob3V0IHRoZSAiLndhciIgZXh0ZW5zaW9uLgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5Pbmx5IHdlYiBhcHBsaWNhdGlvbnMgaW4gdGhlIEhvc3Qgd2ViIGFwcGxpY2F0aW9uIGRpcmVjdG9yeSBjYW4KKyAgICAgYmUgZGVwbG95ZWQ8L2VtPgorICAgICA8YmxvY2txdW90ZT4KKyAgICAgSWYgdGhlIEhvc3QgZGVwbG95WE1MIGZsYWcgaXMgc2V0IHRvIGZhbHNlIHRoaXMgZXJyb3Igd2lsbCBoYXBwZW4KKyAgICAgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGluc3RhbGwgYSB3ZWIgYXBwbGljYXRpb24gZGlyZWN0b3J5IG9yCisgICAgICAiLndhciIgZmlsZSBvdXRzaWRlIG9mIHRoZSBIb3N0IGFwcEJhc2UgZGlyZWN0b3J5LgorICAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzwvdWw+CisKKzwvc3Vic2VjdGlvbj4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iU2VydmVyIEluZm9ybWF0aW9uIj4KKworPHA+VGhpcyBzZWN0aW9uIGRpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IFRvbWNhdCwgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb2YKK3RoZSBzZXJ2ZXIgVG9tY2F0IGlzIGhvc3RlZCBvbiwgYW5kIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSBUb21jYXQgaXMKK3J1bm5pbmcgaW4uPC9wPgorCis8L3NlY3Rpb24+CisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2FkZC5naWYgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2ltYWdlcy9hZGQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NzRkMDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2ltYWdlcy9hZGQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2FzZi1sb2dvLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2FzZi1sb2dvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmViOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvYXNmLWxvZ28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2NvZGUuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvY29kZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI3MzA3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2NvZGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2Rlc2lnbi5naWYgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2ltYWdlcy9kZXNpZ24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZGIwYTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2ltYWdlcy9kZXNpZ24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2RvY3MuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvZG9jcy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0YTRhMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2RvY3MuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2ZpeC5naWYgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2ltYWdlcy9maXguZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OWFkNjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2ltYWdlcy9maXguZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL3ByaW50ZXIuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvcHJpbnRlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyMTE4NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL3ByaW50ZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL3RvbWNhdC5naWYgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2ltYWdlcy90b21jYXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNzU2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2ltYWdlcy90b21jYXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL3VwZGF0ZS5naWYgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2ltYWdlcy91cGRhdGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTIyYWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2ltYWdlcy91cGRhdGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL3ZvaWQuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvdm9pZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2NTgyNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL3ZvaWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW5kZXgueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFkOTlmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW5kZXgueG1sCkBAIC0wLDAgKzEsMTc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iaW5kZXguaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgUi4gTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgIDxhdXRob3IgZW1haWw9InJlbW1AYXBhY2hlLm9yZyI+UmVteSBNYXVjaGVyYXQ8L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSJ5b2F2c0BhcGFjaGUub3JnIj5Zb2F2IFNoYXBpcmE8L2F1dGhvcj4KKyAgICA8dGl0bGU+RG9jdW1lbnRhdGlvbiBJbmRleDwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKzxwPlRoaXMgaXMgdGhlIHRvcC1sZXZlbCBlbnRyeSBwb2ludCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBidW5kbGUgZm9yIHRoZQorPHN0cm9uZz5BcGFjaGUgVG9tY2F0PC9zdHJvbmc+IFNlcnZsZXQvSlNQIGNvbnRhaW5lci4gIEFwYWNoZSBUb21jYXQgdmVyc2lvbiA1LjUgCitpbXBsZW1lbnRzIHRoZQorU2VydmxldCAyLjQgYW5kIEphdmFTZXJ2ZXIgUGFnZXMgMi4wIHNwZWNpZmljYXRpb25zIGZyb20gdGhlCis8YSBocmVmPSJodHRwOi8vd3d3LmpjcC5vcmciPkphdmEgQ29tbXVuaXR5IFByb2Nlc3M8L2E+LCBhbmQgaW5jbHVkZXMgbWFueQorYWRkaXRpb25hbCBmZWF0dXJlcyB0aGF0IG1ha2UgaXQgYSB1c2VmdWwgcGxhdGZvcm0gZm9yIGRldmVsb3BpbmcgYW5kIGRlcGxveWluZword2ViIGFwcGxpY2F0aW9ucyBhbmQgd2ViIHNlcnZpY2VzLjwvcD4KKworPHA+U2VsZWN0IG9uZSBvZiB0aGUgbGlua3MgZnJvbSB0aGUgbmF2aWdhdGlvbiBtZW51ICh0byB0aGUgbGVmdCkgdG8gZHJpbGwKK2Rvd24gdG8gdGhlIG1vcmUgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIGF2YWlsYWJsZS4gIEVhY2ggYXZhaWxhYmxlCittYW51YWwgaXMgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGJlbG93LjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkFwYWNoZSBUb21jYXQgVXNlciBHdWlkZSI+CisKKzxwPlRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzIHdpbGwgYXNzaXN0IHlvdSBpbiBkb3dubG9hZGluZywgaW5zdGFsbGluZworQXBhY2hlIFRvbWNhdCA1LCBhbmQgdXNpbmcgbWFueSBvZiB0aGUgQXBhY2hlIFRvbWNhdCBmZWF0dXJlcy48L3A+CisKKzxvbD4KKzxsaT48YSBocmVmPSJpbnRyb2R1Y3Rpb24uaHRtbCI+PHN0cm9uZz5JbnRyb2R1Y3Rpb248L3N0cm9uZz48L2E+IC0gQQorICAgIGJyaWVmLCBoaWdoIGxldmVsLCBvdmVydmlldyBvZiBBcGFjaGUgVG9tY2F0LjwvbGk+Cis8bGk+PGEgaHJlZj0ic2V0dXAuaHRtbCI+PHN0cm9uZz5TZXR1cDwvc3Ryb25nPjwvYT4gLSBIb3cgdG8gaW5zdGFsbCBhbmQgcnVuCisgICAgQXBhY2hlIFRvbWNhdCBvbiBhIHZhcmlldHkgb2YgcGxhdGZvcm1zLjwvbGk+Cis8bGk+PGEgaHJlZj0iYXBwZGV2L2luZGV4Lmh0bWwiPjxzdHJvbmc+Rmlyc3Qgd2ViIGFwcGxpY2F0aW9uPC9zdHJvbmc+PC9hPgorICAgIC0gQW4gaW50cm9kdWN0aW9uIHRvIHRoZSBjb25jZXB0cyBvZiBhIDxlbT53ZWIgYXBwbGljYXRpb248L2VtPiBhcyBkZWZpbmVkCisgICAgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldC9kb3dubG9hZC5odG1sIj5TZXJ2bGV0CisgICAgMi4zIFNwZWNpZmljYXRpb248L2E+LiAgQ292ZXJzIGJhc2ljIG9yZ2FuaXphdGlvbiBvZiB5b3VyIHdlYiBhcHBsaWNhdGlvbgorICAgIHNvdXJjZSB0cmVlLCB0aGUgc3RydWN0dXJlIG9mIGEgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUsIGFuZCBhbgorICAgIGludHJvZHVjdGlvbiB0byB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAgICg8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPikuPC9saT4KKzxsaT48YSBocmVmPSJkZXBsb3llci1ob3d0by5odG1sIj48c3Ryb25nPkRlcGxveWVyPC9zdHJvbmc+PC9hPiAtCisgICAgT3BlcmF0aW5nIHRoZSBBcGFjaGUgVG9tY2F0IERlcGxveWVyIHRvIGRlcGxveSwgcHJlY29tcGlsZSwgYW5kIHZhbGlkYXRlIHdlYgorICAgIGFwcGxpY2F0aW9ucy48L2xpPgorPGxpPjxhIGhyZWY9Im1hbmFnZXItaG93dG8uaHRtbCI+PHN0cm9uZz5NYW5hZ2VyPC9zdHJvbmc+PC9hPiAtCisgICAgT3BlcmF0aW5nIHRoZSA8Y29kZT5NYW5hZ2VyPC9jb2RlPiB3ZWIgYXBwIHRvIGRlcGxveSwgdW5kZXBsb3ksIGFuZAorICAgIHJlZGVwbG95IGFwcGxpY2F0aW9ucyB3aGlsZSBBcGFjaGUgVG9tY2F0IGlzIHJ1bm5pbmcuPC9saT4KKzxsaT48YSBocmVmPSJyZWFsbS1ob3d0by5odG1sIj48c3Ryb25nPlJlYWxtcyBhbmQgQWNjZXNzIENvbnRyb2w8L3N0cm9uZz48L2E+CisgICAgLSBEZXNjcmlwdGlvbiBvZiBob3cgdG8gY29uZmlndXJlIDxlbT5SZWFsbXM8L2VtPiAoZGF0YWJhc2VzIG9mIHVzZXJzLAorICAgIHBhc3N3b3JkcywgYW5kIHRoZWlyIGFzc29jaWF0ZWQgcm9sZXMpIGZvciB1c2UgaW4gd2ViIGFwcGxpY2F0aW9ucyB0aGF0CisgICAgdXRpbGl6ZSA8ZW0+Q29udGFpbmVyIE1hbmFnZWQgU2VjdXJpdHk8L2VtPi48L2xpPgorPGxpPjxhIGhyZWY9InNlY3VyaXR5LW1hbmFnZXItaG93dG8uaHRtbCI+PHN0cm9uZz5TZWN1cml0eSBNYW5hZ2VyPC9zdHJvbmc+PC9hPgorICAgIC0gQ29uZmlndXJpbmcgYW5kIHVzaW5nIGEgSmF2YSBTZWN1cml0eSBNYW5hZ2VyIHRvCisgICAgc3VwcG9ydCBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIHRoZSBiZWhhdmlvciBvZiB5b3VyIHdlYiBhcHBsaWNhdGlvbnMuCisgICAgPC9saT4KKzxsaT48YSBocmVmPSJqbmRpLXJlc291cmNlcy1ob3d0by5odG1sIj48c3Ryb25nPkpOREkgUmVzb3VyY2VzPC9zdHJvbmc+PC9hPgorICAgIC0gQ29uZmlndXJpbmcgc3RhbmRhcmQgYW5kIGN1c3RvbSByZXNvdXJjZXMgaW4gdGhlIEpOREkgbmFtaW5nIGNvbnRleHQKKyAgICB0aGF0IGlzIHByb3ZpZGVkIHRvIGVhY2ggd2ViIGFwcGxpY2F0aW9uLjwvbGk+Cis8bGk+PGEgaHJlZj0iam5kaS1kYXRhc291cmNlLWV4YW1wbGVzLWhvd3RvLmh0bWwiPgorICAgIDxzdHJvbmc+SkRCQyBEYXRhU291cmNlPC9zdHJvbmc+PC9hPgorICAgIC0gQ29uZmlndXJpbmcgYSBKTkRJIERhdGFTb3VyZSB3aXRoIGEgREIgY29ubmVjdGlvbiBwb29sLgorICAgIEV4YW1wbGVzIGZvciBtYW55IHBvcHVsYXIgZGF0YWJhc2VzLjwvbGk+Cis8bGk+PGEgaHJlZj0iY2xhc3MtbG9hZGVyLWhvd3RvLmh0bWwiPjxzdHJvbmc+Q2xhc3Nsb2FkaW5nPC9zdHJvbmc+PC9hPgorICAgIC0gSW5mb3JtYXRpb24gYWJvdXQgY2xhc3MgbG9hZGluZyBpbiBBcGFjaGUgVG9tY2F0IDUsIGluY2x1ZGluZyB3aGVyZSB0byBwbGFjZQorICAgIHlvdXIgYXBwbGljYXRpb24gY2xhc3NlcyBzbyB0aGF0IHRoZXkgYXJlIHZpc2libGUuPC9saT4KKzxsaT48YSBocmVmPSJqYXNwZXItaG93dG8uaHRtbCI+PHN0cm9uZz5KU1BzPC9zdHJvbmc+PC9hPgorICAgIC0gSW5mb3JtYXRpb24gYWJvdXQgSmFzcGVyIGNvbmZpZ3VyYXRpb24sIGFzIHdlbGwgYXMgdGhlIEpTUCBjb21waWxlcgorICAgIHVzYWdlLjwvbGk+Cis8bGk+PGEgaHJlZj0ic3NsLWhvd3RvLmh0bWwiPjxzdHJvbmc+U1NMPC9zdHJvbmc+PC9hPiAtCisgICAgSW5zdGFsbGluZyBhbmQKKyAgICBjb25maWd1cmluZyBTU0wgc3VwcG9ydCBzbyB0aGF0IHlvdXIgQXBhY2hlIFRvbWNhdCB3aWxsIHNlcnZlIHJlcXVlc3RzIHVzaW5nCisgICAgdGhlIDxjb2RlPmh0dHBzPC9jb2RlPiBwcm90b2NvbC48L2xpPgorPGxpPjxhIGhyZWY9InNzaS1ob3d0by5odG1sIj48c3Ryb25nPlNTSTwvc3Ryb25nPjwvYT4gLQorICAgIFVzaW5nIFNlcnZlciBTaWRlIEluY2x1ZGVzIGluIEFwYWNoZSBUb21jYXQuPC9saT4KKzxsaT48YSBocmVmPSJjZ2ktaG93dG8uaHRtbCI+PHN0cm9uZz5DR0k8L3N0cm9uZz48L2E+IC0KKyAgICBVc2luZyBDR0lzIHdpdGggQXBhY2hlIFRvbWNhdC48L2xpPgorPGxpPjxhIGhyZWY9InByb3h5LWhvd3RvLmh0bWwiPjxzdHJvbmc+UHJveHkgU3VwcG9ydDwvc3Ryb25nPjwvYT4gLQorICAgIENvbmZpZ3VyaW5nIEFwYWNoZSBUb21jYXQgNSB0byBydW4gYmVoaW5kIGEgcHJveHkgc2VydmVyIChvciBhIHdlYiBzZXJ2ZXIKKyAgICBmdW5jdGlvbmluZyBhcyBhIHByb3h5IHNlcnZlcikuPC9saT4KKzxsaT48YSBocmVmPSJtYmVhbnMtZGVzY3JpcHRvci1ob3d0by5odG1sIj48c3Ryb25nPk1CZWFuIERlc2NyaXB0b3I8L3N0cm9uZz48L2E+IC0KKyAgICBDb25maWd1cmluZyBNQmVhbiBkZXNjcmlwdG9ycyBmaWxlcyBmb3IgY3VzdG9tIGNvbXBvbmVudHMuPC9saT4KKzxsaT48YSBocmVmPSJkZWZhdWx0LXNlcnZsZXQuaHRtbCI+PHN0cm9uZz5EZWZhdWx0IFNlcnZsZXQ8L3N0cm9uZz48L2E+IC0KKyAgICBDb25maWd1cmluZyB0aGUgZGVmYXVsdCBzZXJ2bGV0IGFuZCBjdXN0b21pemluZyBkaXJlY3RvcnkgbGlzdGluZ3MuPC9saT4KKzxsaT48YSBocmVmPSJjbHVzdGVyLWhvd3RvLmh0bWwiPjxzdHJvbmc+QXBhY2hlIFRvbWNhdCBDbHVzdGVyaW5nPC9zdHJvbmc+PC9hPiAtCisgICAgRW5hYmxlIHNlc3Npb24gcmVwbGljYXRpb24gaW4gYSBBcGFjaGUgVG9tY2F0IGVudmlyb25tZW50LjwvbGk+Cis8bGk+PGEgaHJlZj0iYmFsYW5jZXItaG93dG8uaHRtbCI+PHN0cm9uZz5CYWxhbmNlcjwvc3Ryb25nPjwvYT4gLQorICAgIENvbmZpZ3VyaW5nLCB1c2luZywgYW5kIGV4dGVuZGluZyB0aGUgbG9hZCBiYWxhbmNlciBhcHBsaWNhdGlvbi48L2xpPgorPGxpPjxhIGhyZWY9ImNvbm5lY3RvcnMuaHRtbCI+PHN0cm9uZz5Db25uZWN0b3JzPC9zdHJvbmc+PC9hPiAtCisgICAgQ29ubmVjdG9ycyBhdmFpbGFibGUgaW4gQXBhY2hlIFRvbWNhdCwgYW5kIG5hdGl2ZSB3ZWIgc2VydmVyIGludGVncmF0aW9uLjwvbGk+Cis8bGk+PGEgaHJlZj0ibW9uaXRvcmluZy5odG1sIj48c3Ryb25nPk1vbml0b3JpbmcgYW5kIE1hbmFnZW1lbnQ8L3N0cm9uZz48L2E+IC0KKyAgICBFbmFibGluZyBKTVggUmVtb3RlIHN1cHBvcnQsIGFuZCB1c2luZyB0b29scyB0byBtb25pdG9yIGFuZCBtYW5hZ2UgQXBhY2hlIFRvbWNhdC48L2xpPgorPGxpPjxhIGhyZWY9ImxvZ2dpbmcuaHRtbCI+PHN0cm9uZz5Mb2dnaW5nPC9zdHJvbmc+PC9hPiAtCisgICAgQ29uZmlndXJpbmcgbG9nZ2luZyBpbiBBcGFjaGUgVG9tY2F0LjwvbGk+Cis8bGk+PGEgaHJlZj0iYXByLmh0bWwiPjxzdHJvbmc+QXBhY2hlIFBvcnRhYmxlIFJ1bnRpbWU8L3N0cm9uZz48L2E+IC0KKyAgICBVc2luZyBBUFIgdG8gcHJvdmlkZSBzdXBlcmlvciBwZXJmb3JtYW5jZSwgc2NhbGFiaWxpdHkgYW5kIGJldHRlcgorICAgIGludGVncmF0aW9uIHdpdGggbmF0aXZlIHNlcnZlciB0ZWNobm9sb2dpZXMuPC9saT4KKzxsaT48YSBocmVmPSJ2aXJ0dWFsLWhvc3RpbmctaG93dG8uaHRtbCI+PHN0cm9uZz5WaXJ0dWFsIEhvc3Rpbmc8L3N0cm9uZz48L2E+IC0KKyAgICBDb25maWd1cmluZyB2aXR1YWwgaG9zdGluZyBpbiBBcGFjaGUgVG9tY2F0LjwvbGk+Cis8L29sPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iUmVmZXJlbmNlIj4KKworPHA+VGhlIGZvbGxvd2luZyBkb2N1bWVudHMgYXJlIGFpbWVkIGF0IDxlbT5TeXN0ZW0gQWRtaW5pc3RyYXRvcnM8L2VtPiB3aG8KK2FyZSByZXNwb25zaWJsZSBmb3IgaW5zdGFsbGluZywgY29uZmlndXJpbmcsIGFuZCBvcGVyYXRpbmcgYSBBcGFjaGUgVG9tY2F0IDUgc2VydmVyLgorPC9wPgorPHVsPgorPGxpPjxhIGhyZWY9IlJFTEVBU0UtTk9URVMudHh0Ij48c3Ryb25nPlJlbGVhc2Ugbm90ZXM8L3N0cm9uZz48L2E+CisgICAgLSBLbm93biBpc3N1ZXMgaW4gdGhpcyBBcGFjaGUgVG9tY2F0IHJlbGVhc2UuCisgICAgPC9saT4KKzxsaT48YSBocmVmPSJjb25maWcvaW5kZXguaHRtbCI+PHN0cm9uZz5BcGFjaGUgVG9tY2F0IFNlcnZlciBDb25maWd1cmF0aW9uIFJlZmVyZW5jZTwvc3Ryb25nPjwvYT4KKyAgICAtIFJlZmVyZW5jZSBtYW51YWwgdGhhdCBkb2N1bWVudHMgYWxsIGF2YWlsYWJsZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcworICAgICAgdGhhdCBtYXkgYmUgcGxhY2VkIGludG8gYSBBcGFjaGUgVG9tY2F0IDUgPGNvZGU+Y29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBmaWxlLgorICAgIDwvbGk+Cis8bGk+PGEgaHJlZj0iaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnL2Nvbm5lY3RvcnMtZG9jL2luZGV4Lmh0bWwiPjxzdHJvbmc+SksgRG9jdW1lbnRhdGlvbjwvc3Ryb25nPjwvYT4KKyAgICAtIENvbXBsZXRlIGRvY3VtZW50YXRpb24gYW5kIEhPV1RPcyBvbiB0aGUgSksgbmF0aXZlIHdlYnNlcnZlciBjb25uZWN0b3IsCisgICAgICB1c2VkIHRvIGludGVyZmFjZSBBcGFjaGUgVG9tY2F0IHdpdGggc2VydmVycyBsaWtlIEFwYWNoZSBIVFRQZCwgSUlTCisgICAgICBhbmQgb3RoZXJzLjwvbGk+Cis8bGk+PGEgaHJlZj0ic2VydmxldGFwaS9pbmRleC5odG1sIj48c3Ryb25nPlNlcnZsZXQgQVBJIEphdmFkb2NzPC9zdHJvbmc+PC9hPiAtCisgICAgVGhlIFNlcnZsZXQgMi40IEFQSSBKYXZhZG9jcy48L2xpPgorPGxpPjxhIGhyZWY9ImpzcGFwaS9pbmRleC5odG1sIj48c3Ryb25nPkpTUCBBUEkgSmF2YWRvY3M8L3N0cm9uZz48L2E+IC0KKyAgICBUaGUgSlNQIDIuMCBBUEkgSmF2YWRvY3MuPC9saT4KKzwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJBcGFjaGUgVG9tY2F0IERldmVsb3BlcnMiPgorCis8cD5UaGUgZm9sbG93aW5nIGRvY3VtZW50cyBhcmUgZm9yIEphdmEgZGV2ZWxvcGVycyB3aG8gd2lzaCB0byBjb250cmlidXRlIHRvCit0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlIDxlbT5BcGFjaGUgVG9tY2F0PC9lbT4gcHJvamVjdC48L3A+Cis8dWw+Cis8bGk+PGEgaHJlZj0iYnVpbGRpbmcuaHRtbCI+PHN0cm9uZz5CdWlsZGluZyBmcm9tIFNvdXJjZTwvc3Ryb25nPjwvYT4gLSAKKyAgICBEZXRhaWxzIHRoZSBzdGVwcyBuZWNlc3NhcnkgdG8gZG93bmxvYWQgQXBhY2hlIFRvbWNhdCA1IHNvdXJjZSBjb2RlIChhbmQgdGhlIAorICAgIG90aGVyIHBhY2thZ2VzIHRoYXQgaXQgZGVwZW5kcyBvbiksIGFuZCBidWlsZCBhIGJpbmFyeSBkaXN0cmlidXRpb24gZnJvbSAKKyAgICB0aG9zZSBzb3VyY2VzLgorICAgIDwvbGk+Cis8bGk+PGEgaHJlZj0iY2hhbmdlbG9nLmh0bWwiPjxzdHJvbmc+Q2hhbmdlbG9nPC9zdHJvbmc+PC9hPiAtIERldGFpbHMgdGhlCisgICAgY2hhbmdlcyBtYWRlIHRvIEFwYWNoZSBUb21jYXQuCisgICAgPC9saT4KKzxsaT48YSBocmVmPSJzdGF0dXMuaHRtbCI+PHN0cm9uZz5TdGF0dXM8L3N0cm9uZz48L2E+IC0gQXBhY2hlIFRvbWNhdCBkZXZlbG9wbWVudCAKKyAgICBzdGF0dXMuCisgICAgPC9saT4KKzxsaT48YSBocmVmPSJkZXZlbG9wZXJzLmh0bWwiPjxzdHJvbmc+RGV2ZWxvcGVyczwvc3Ryb25nPjwvYT4gLSBMaXN0IG9mIGFjdGl2ZQorICAgIEFwYWNoZSBUb21jYXQgY29udHJpYnV0b3JzLgorICAgIDwvbGk+Cis8bGk+PGEgaHJlZj0iY2F0YWxpbmEvZnVuY3NwZWNzL2luZGV4Lmh0bWwiPjxzdHJvbmc+RnVuY3Rpb25hbCBTcGVjaWZpY2F0aW9uczwvc3Ryb25nPjwvYT4KKyAgICAtIFJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyBmb3IgZmVhdHVyZXMgb2YgdGhlIDxlbT5DYXRhbGluYTwvZW0+IHNlcnZsZXQKKyAgICBjb250YWluZXIgcG9ydGlvbiBvZiBBcGFjaGUgVG9tY2F0IDUuPC9saT4KKzxsaT48YSBocmVmPSJjYXRhbGluYS9kb2NzL2FwaS9pbmRleC5odG1sIj48c3Ryb25nPkNhdGFsaW5hIEphdmFkb2NzPC9zdHJvbmc+PC9hPgorICAgIC0gSmF2YWRvYyBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIDxlbT5DYXRhbGluYTwvZW0+IHNlcnZsZXQKKyAgICBjb250YWluZXIgYW5kIGl0cyBkZXBlbmRlbmNpZXMuPC9saT4KKzxsaT48YSBocmVmPSJqYXNwZXIvZG9jcy9hcGkvaW5kZXguaHRtbCI+PHN0cm9uZz5KYXNwZXIgSmF2YWRvY3M8L3N0cm9uZz48L2E+CisgICAgLSBKYXZhZG9jIEFQSSBkb2N1bWVudGF0aW9uIGZvciB0aGUgPGVtPkphc3BlcjwvZW0+IEpTUCBjb250YWluZXIKKyAgICBwb3J0aW9uIG9mIEFwYWNoZSBUb21jYXQgNS48L2xpPgorPGxpPjxhIGhyZWY9ImFyY2hpdGVjdHVyZS9pbmRleC5odG1sIj48c3Ryb25nPkFwYWNoZSBUb21jYXQgQXJjaGl0ZWN0dXJlPC9zdHJvbmc+PC9hPgorICAgIC0gRG9jdW1lbnRhdGlvbiBvZiB0aGUgQXBhY2hlIFRvbWNhdCBTZXJ2ZXIgQXJjaGl0ZWN0dXJlLjwvbGk+CisgICAgCis8L3VsPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW50cm9kdWN0aW9uLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW50cm9kdWN0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGIwMjIxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbnRyb2R1Y3Rpb24ueG1sCkBAIC0wLDAgKzEsMTMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iaW50cm9kdWN0aW9uLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0icnNsaWZrYUBzZnUuY2EiPlJvYmVydCBTbGlma2E8L2F1dGhvcj4KKyAgICAgICAgPHRpdGxlPkludHJvZHVjdGlvbjwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCis8cD5Gb3IgYWRtaW5pc3RyYXRvcnMgYW5kIHdlYiBkZXZlbG9wZXJzIGFsaWtlLCB0aGVyZSBhcmUgc29tZSBpbXBvcnRhbnQgYml0cworb2YgaW5mb3JtYXRpb24geW91IHNob3VsZCBmYW1pbGlhcml6ZSB5b3Vyc2VsZiB3aXRoIGJlZm9yZSBzdGFydGluZyBvdXQuIFRoaXMKK2RvY3VtZW50IHNlcnZlcyBhcyBhIGJyaWVmIGludHJvZHVjdGlvbiB0byBzb21lIG9mIHRoZSBjb25jZXB0cyBhbmQKK3Rlcm1pbm9sb2d5IGJlaGluZCB0aGUgVG9tY2F0IGNvbnRhaW5lci4gQXMgd2VsbCwgd2hlcmUgdG8gZ28gd2hlbiB5b3UgbmVlZAoraGVscC48L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJUZXJtaW5vbG9neSI+CisKKzxwPkluIHRoZSBjb3Vyc2Ugb2YgcmVhZGluZyB0aGVzZSBkb2N1bWVudHMsIHlvdSdsbCBydW4gYWNyb3NzIGEgbnVtYmVyIG9mCit0ZXJtczsgc29tZSBzcGVjaWZpYyB0byBUb21jYXQsIGFuZCBvdGhlcnMgZGVmaW5lZCBieSB0aGUKKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldC8iPlNlcnZsZXQ8L2E+IG9yCis8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pzcC8iPkpTUDwvYT4gc3BlY2lmaWNhdGlvbnMuPC9wPgorCis8dWw+Cis8bGk+PHN0cm9uZz5Db250ZXh0PC9zdHJvbmc+IC0gSW4gYSBudXRzaGVsbCwgYSBDb250ZXh0IGlzIGEKKyAgICB3ZWIgYXBwbGljYXRpb24uPC9saT4KKzxsaT48c3Ryb25nPlRlcm0yPC9zdHJvbmc+IC0gVGhpcyBpcyBpdC48L2xpPgorPGxpPjxzdHJvbmc+VGVybTM8L3N0cm9uZz4gLSBUaGlzIGlzIGl0ITwvbGk+Cis8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRGlyZWN0b3JpZXMgYW5kIEZpbGVzIj4KKworPHA+VGhyb3VnaG91dCB0aGUgZG9jcywgeW91J2xsIG5vdGljZSB0aGVyZSBhcmUgbnVtZXJvdXMgcmVmZXJlbmNlcyB0bworPHN0cm9uZz4kQ0FUQUxJTkFfSE9NRTwvc3Ryb25nPi4gVGhpcyByZXByZXNlbnRzIHRoZSByb290IG9mIHlvdXIgVG9tY2F0CitpbnN0YWxsYXRpb24uIFdoZW4gd2Ugc2F5LCAiVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4geW91cgorJENBVEFMSU5BX0hPTUUvUkVBRE1FLnR4dCBmaWxlIiB3ZSBtZWFuIHRvIGxvb2sgYXQgdGhlIFJFQURNRS50eHQgZmlsZSBhdCB0aGUKK3Jvb3Qgb2YgeW91ciBUb21jYXQgaW5zdGFsbC48L3A+CisKKzxwPlRoZXNlIGFyZSBzb21lIG9mIHRoZSBrZXkgdG9tY2F0IGRpcmVjdG9yaWVzLCBhbGwgcmVsYXRpdmUKK3RvIDxzdHJvbmc+JENBVEFMSU5BX0hPTUU8L3N0cm9uZz46PC9wPgorCis8dWw+Cis8bGk+PHN0cm9uZz4vYmluPC9zdHJvbmc+IC0gU3RhcnR1cCwgc2h1dGRvd24sIGFuZCBvdGhlciBzY3JpcHRzLiBUaGUKKyAgICA8Y29kZT4qLnNoPC9jb2RlPiBmaWxlcyAoZm9yIFVuaXggc3lzdGVtcykgYXJlIGZ1bmN0aW9uYWwgZHVwbGljYXRlcyBvZgorICAgIHRoZSA8Y29kZT4qLmJhdDwvY29kZT4gZmlsZXMgKGZvciBXaW5kb3dzIHN5c3RlbXMpLiAgU2luY2UgdGhlIFdpbjMyCisgICAgY29tbWFuZC1saW5lIGxhY2tzIGNlcnRhaW4gZnVuY3Rpb25hbGl0eSwgdGhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbAorICAgIGZpbGVzIGluIGhlcmUuPC9saT4KKzxsaT48c3Ryb25nPi9jb25mPC9zdHJvbmc+IC0gQ29uZmlndXJhdGlvbiBmaWxlcyBhbmQgcmVsYXRlZCBEVERzLiAgVGhlIG1vc3QKKyAgICBpbXBvcnRhbnQgZmlsZSBpbiBoZXJlIGlzIHNlcnZlci54bWwuICBJdCBpcyB0aGUgbWFpbiBjb25maWd1cmF0aW9uIGZpbGUKKyAgICBmb3IgdGhlIGNvbnRhaW5lci48L2xpPgorPGxpPjxzdHJvbmc+L2xvZ3M8L3N0cm9uZz4gLSBMb2cgZmlsZXMgYXJlIGhlcmUgYnkgZGVmYXVsdC48L2xpPgorPGxpPjxzdHJvbmc+L3dlYmFwcHM8L3N0cm9uZz4gLSBUaGlzIGlzIHdoZXJlIHlvdXIgd2ViYXBwcyBnby48L2xpPgorPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkNvbmZpZ3VyaW5nIFRvbWNhdCI+CisKKzxwPlRoaXMgc2VjdGlvbiB3aWxsIGFjcXVhaW50IHlvdSB3aXRoIHRoZSBiYXNpYyBpbmZvcm1hdGlvbiB1c2VkIGR1cmluZwordGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbnRhaW5lci48L3A+CisKKzxwPkFsbCBvZiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgaXMgcmVhZCBhdCBzdGFydHVwLAorbWVhbmluZyB0aGF0IGFueSBjaGFuZ2UgdG8gdGhlIGZpbGVzIG5lY2Vzc2l0YXRlcyBhIHJlc3RhcnQgb2YgdGhlIGNvbnRhaW5lci4KKzwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IldoZXJlIHRvIEdvIGZvciBIZWxwIj4KKworPHA+V2hpbGUgd2UndmUgZG9uZSBvdXIgYmVzdCB0byBlbnN1cmUgdGhhdCB0aGVzZSBkb2N1bWVudHMgYXJlIGNsZWFybHkKK3dyaXR0ZW4gYW5kIGVhc3kgdG8gdW5kZXJzdGFuZCwgd2UgbWF5IGhhdmUgbWlzc2VkIHNvbWV0aGluZy4gIFByb3ZpZGVkCitiZWxvdyBhcmUgdmFyaW91cyB3ZWIgc2l0ZXMgYW5kIG1haWxpbmcgbGlzdHMgaW4gY2FzZSB5b3UgZ2V0IHN0dWNrLjwvcD4KKworPHA+QXMgVG9tY2F0IDUgaXMgYSBuZXcgcmVsZWFzZSBvZiBUb21jYXQsIGtlZXAgaW4gbWluZCB0aGF0IHNvbWUgb2YgdGhlCitpc3N1ZXMgYW5kIHNvbHV0aW9ucyB2YXJ5IGJldHdlZW4gdGhlIG1ham9yIHZlcnNpb25zIG9mIFRvbWNhdCAoNC54IHZlcnN1cworNSkuICBBcyB5b3Ugc2VhcmNoIGFyb3VuZCB0aGUgd2ViLCB0aGVyZSB3aWxsIGJlIHNvbWUgZG9jdW1lbnRhdGlvbiB0aGF0CitpcyBub3QgcmVsZXZhbnQgdG8gVG9tY2F0IDUsIGJ1dCAzLnggYW5kIDQueC4gIERvaW5nIDMueCBvciA0LnggdGhpbmdzIHRvIDUKK3dpbGwgcHJvYmFibHkgbm90IHdvcmsgaW4gbW9zdCBjYXNlcyBhcyB0aGUgc2VydmVyLnhtbCBmaWxlcyBhcmUgdmVyeQorZGlmZmVyZW50LjwvcD4KKworPHVsPgorPGxpPkN1cnJlbnQgZG9jdW1lbnQgLSBtb3N0IGRvY3VtZW50cyB3aWxsIGxpc3QgcG90ZW50aWFsIGhhbmd1cHMuIEJlIHN1cmUKKyAgICB0byBmdWxseSByZWFkIHRoZSByZWxldmFudCBkb2N1bWVudGF0aW9uIGFzIGl0IHdpbGwgc2F2ZSB5b3UgbXVjaCB0aW1lCisgICAgYW5kIGVmZm9ydC4gVGhlcmUncyBub3RoaW5nIGxpa2Ugc2NvdXJpbmcgdGhlIHdlYiBvbmx5IHRvIGZpbmQgb3V0IHRoYXQKKyAgICB0aGUgYW5zd2VyIHdhcyByaWdodCBpbiBmcm9udCBvZiB5b3UgYWxsIGFsb25nITwvbGk+Cis8bGk+PGEgaHJlZj0iaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnL2ZhcS8iPlRvbWNhdCBGQVE8L2E+IGFzIG1haW50YWluZWQgYnkgdGhlIGRldmVsb3BlcnMuPC9saT4KKzxsaT48YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL3RvbWNhdC8iPlRvbWNhdCBXSUtJPC9hPjwvbGk+Cis8bGk+VG9tY2F0IEZBUSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmpndXJ1LmNvbS9mYXEvaG9tZS5qc3A/dG9waWM9VG9tY2F0Ij5qR3VydTwvYT48L2xpPgorPGxpPlRvbWNhdCBtYWlsaW5nIGxpc3QgYXJjaGl2ZXMgLSBudW1lcm91cyBzaXRlcyBhcmNoaXZlIHRoZSBUb21jYXQgbWFpbGluZworICAgIGxpc3RzLiBTaW5jZSB0aGUgbGlua3MgY2hhbmdlIG92ZXIgdGltZSwgY2xpY2tpbmcgaGVyZSB3aWxsIHNlYXJjaAorICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT10b21jYXQrbWFpbGluZytsaXN0K2FyY2hpdmVzIj5Hb29nbGU8L2E+LgorICAgIDwvbGk+Cis8bGk+VGhlIFRPTUNBVC1VU0VSIG1haWxpbmcgbGlzdCwgd2hpY2ggeW91IGNhbiBzdWJzY3JpYmUgdG8KKyAgICA8YSBocmVmPSJodHRwOi8vdG9tY2F0LmFwYWNoZS5vcmcvbGlzdHMuaHRtbCI+aGVyZTwvYT4uIElmIHlvdSBkb24ndAorICAgIGdldCBhIHJlcGx5LCB0aGVuIHRoZXJlJ3MgYSBnb29kIGNoYW5jZSB0aGF0IHlvdXIgcXVlc3Rpb24gd2FzIHByb2JhYmx5CisgICAgYW5zd2VyZWQgaW4gdGhlIGxpc3QgYXJjaGl2ZXMgb3Igb25lIG9mIHRoZSBGQVFzLiAgQWx0aG91Z2ggcXVlc3Rpb25zCisgICAgYWJvdXQgd2ViIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IGluIGdlbmVyYWwgYXJlIHNvbWV0aW1lcyBhc2tlZCBhbmQKKyAgICBhbnN3ZXJlZCwgcGxlYXNlIGZvY3VzIHlvdXIgcXVlc3Rpb25zIG9uIFRvbWNhdC1zcGVjaWZpYyBpc3N1ZXMuPC9saT4KKzxsaT5UaGUgVE9NQ0FULURFViBtYWlsaW5nIGxpc3QsIHdoaWNoIHlvdSBjYW4gc3Vic2NyaWJlIHRvCisgICAgPGEgaHJlZj0iaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnL2xpc3RzLmh0bWwiPmhlcmU8L2E+LiAgVGhpcyBsaXN0IGlzCisgICAgPHN0cm9uZz5yZXNlcnZlZDwvc3Ryb25nPiBmb3IgZGlzY3Vzc2lvbnMgYWJvdXQgdGhlIGRldmVsb3BtZW50IG9mIFRvbWNhdAorICAgIGl0c2VsZi4gIFF1ZXN0aW9ucyBhYm91dCBUb21jYXQgY29uZmlndXJhdGlvbiwgYW5kIHRoZSBwcm9ibGVtcyB5b3UgcnVuCisgICAgaW50byB3aGlsZSBkZXZlbG9waW5nIGFuZCBydW5uaW5nIGFwcGxpY2F0aW9ucywgd2lsbCBub3JtYWxseSBiZSBtb3JlCisgICAgYXBwcm9wcmlhdGUgb24gdGhlIFRPTUNBVC1VU0VSIGxpc3QgaW5zdGVhZC48L2xpPgorPC91bD4KKworPHA+QW5kLCBpZiB5b3UgdGhpbmsgc29tZXRoaW5nIHNob3VsZCBiZSBpbiB0aGUgZG9jcywgYnkgYWxsIG1lYW5zIGxldCB1cyBrbm93CitvbiB0aGUgVE9NQ0FULURFViBsaXN0LCBvciBzZW5kIG9uZSBvZiB0aGUgZG9jIGF1dGhvcnMgZW1haWwuPC9wPgorCis8L3NlY3Rpb24+CisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvamFzcGVyLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvamFzcGVyLWhvd3RvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDYxNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9qYXNwZXItaG93dG8ueG1sCkBAIC0wLDAgKzEsMzQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iamFzcGVyLWhvd3RvLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0iZ2xlbm5AYXBhY2hlLm9yZyI+R2xlbm4gTC4gTmllbHNlbjwvYXV0aG9yPgorICAgICAgICA8YXV0aG9yIGVtYWlsPSJwZXJvQGFwYWNoZS5vcmciPlBldGVyIFJvc3NiYWNoPC9hdXRob3I+CisgICAgICAgIDx0aXRsZT5KYXNwZXIgMiBKU1AgRW5naW5lIEhvdyBUbzwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworPHNlY3Rpb24gbmFtZT0iVGFibGUgb2YgQ29udGVudHMiPgorPHA+Cis8YSBocmVmPSIjSW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L2E+PGJyIC8+Cis8YSBocmVmPSIjQ29uZmlndXJhdGlvbiI+Q29uZmlndXJhdGlvbjwvYT48YnIgLz4KKzxhIGhyZWY9IiNQcm9kdWN0aW9uIENvbmZpZ3VyYXRpb24iPlByb2R1Y3Rpb24gQ29uZmlndXJhdGlvbjwvYT48YnIgLz4KKzxhIGhyZWY9IiNXZWIgQXBwbGljYXRpb24gQ29tcGlsYXRpb24iPldlYiBBcHBsaWNhdGlvbiBDb21waWxhdGlvbjwvYT48YnIgLz4KKzxhIGhyZWY9IiNVc2luZyBKaWtlcyI+VXNpbmcgSmlrZXM8L2E+PGJyIC8+Cis8L3A+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKzxwPlRvbWNhdCA1LjUgdXNlcyB0aGUgSmFzcGVyIDIgSlNQIEVuZ2luZSB0byBpbXBsZW1lbnQKK3RoZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pzcC8iPkphdmFTZXJ2ZXIgUGFnZXMgMi4wPC9hPgorc3BlY2lmaWNhdGlvbi48L3A+CisKKzxwPkphc3BlciAyIGhhcyBiZWVuIHJlZGVzaWduZWQgdG8gc2lnbmlmaWNhbnRseSBpbXByb3ZlIHBlcmZvcm1hbmNlIG92ZXIKK3RoZSBvcmlnbmFsIEphc3Blci4gIEluIGFkZGl0aW9uIHRvIGdlbmVyYWwgY29kZSBpbXByb3ZlbWVudHMgdGhlIGZvbGxvd2luZworY2hhbmdlcyB3ZXJlIG1hZGU6Cis8dWw+Cis8bGk+PHN0cm9uZz5KU1AgQ3VzdG9tIFRhZyBQb29saW5nPC9zdHJvbmc+IC0gVGhlIGphdmEgb2JqZWN0cyBpbnN0YW50aWF0ZWQKK2ZvciBKU1AgQ3VzdG9tIFRhZ3MgY2FuIG5vdyBiZSBwb29sZWQgYW5kIHJldXNlZC4gIFRoaXMgc2lnbmlmaWNhbnRseSBib29zdHMKK3RoZSBwZXJmb3JtYW5jZSBvZiBKU1AgcGFnZXMgd2hpY2ggdXNlIGN1c3RvbSB0YWdzLjwvbGk+Cis8bGk+PHN0cm9uZz5CYWNrZ3JvdW5kIEpTUCBjb21waWxhdGlvbjwvc3Ryb25nPiAtIElmIHlvdSBtYWtlIGEgY2hhbmdlIHRvCithIEpTUCBwYWdlIHdoaWNoIGhhZCBhbHJlYWR5IGJlZW4gY29tcGlsZWQgSmFzcGVyIDIgY2FuIHJlY29tcGlsZSB0aGF0CitwYWdlIGluIHRoZSBiYWNrZ3JvdW5kLiAgVGhlIHByZXZpb3VzbHkgY29tcGlsZWQgSlNQIHBhZ2Ugd2lsbCBzdGlsbCBiZQorYXZhaWxhYmxlIHRvIHNlcnZlIHJlcXVlc3RzLiAgT25jZSB0aGUgbmV3IHBhZ2UgaGFzIGJlZW4gY29tcGlsZWQKK3N1Y2Nlc3NmdWxseSBpdCB3aWxsIHJlcGxhY2UgdGhlIG9sZCBwYWdlLiAgVGhpcyBoZWxwcyBpbXByb3ZlIGF2YWlsYWJsaXR5CitvZiB5b3VyIEpTUCBwYWdlcyBvbiBhIHByb2R1Y3Rpb24gc2VydmVyLjwvbGk+Cis8bGk+PHN0cm9uZz5SZWNvbXBpbGUgSlNQIHdoZW4gaW5jbHVkZWQgcGFnZSBjaGFuZ2VzPC9zdHJvbmc+IC0gSmFzcGVyIDIKK2NhbiBub3cgZGV0ZWN0IHdoZW4gYSBwYWdlIGluY2x1ZGVkIGF0IGNvbXBpbGUgdGltZSBmcm9tIGEgSlNQIGhhcyBjaGFuZ2VkCithbmQgdGhlbiByZWNvbXBpbGUgdGhlIHBhcmVudCBKU1AuPC9saT4KKzxsaT48c3Ryb25nPkpEVCB1c2VkIHRvIGNvbXBpbGUgSlNQIHBhZ2VzPC9zdHJvbmc+IC0gVGhlCitFY2xpcHNlIEpEVCBKYXZhIGNvbXBpbGVyIGlzIG5vdyB1c2VkIHRvIHBlcmZvcm0gSlNQIGphdmEgc291cmNlIGNvZGUKK2NvbXBpbGF0aW9uLiBUaGlzIGNvbXBpbGVyIGxvYWRzIHNvdXJjZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgY29udGFpbmVyCitjbGFzc2xvYWRlci4gQW50IGFuZCBqYXZhYyBjYW4gc3RpbGwgYmUgdXNlZC48L2xpPgorPC91bD4KKzwvcD4KKworPHA+SmFzcGVyIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSBzZXJ2bGV0IGNsYXNzCis8Y29kZT5vcmcuYXBhY2hlLmphc3Blci5zZXJ2bGV0LkpzcFNlcnZsZXQ8L2NvZGU+LjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJDb25maWd1cmF0aW9uIj4KKworPHA+QnkgZGVmYXVsdCBKYXNwZXIgaXMgY29uZmlndXJlZCBmb3IgdXNlIHdoZW4gZG9pbmcgd2ViIGFwcGxpY2F0aW9uCitkZXZlbG9wbWVudC4gIFNlZSB0aGUgc2VjdGlvbiA8YSBocmVmPSIjUHJvZHVjdGlvbiBDb25maWd1cmF0aW9uIj4KK1Byb2R1Y3Rpb24gQ29uZmlndXJhdGlvbjwvYT4gZm9yIGluZm9ybWF0aW9uIG9uIGNvbmZpZ3VyaW5nIEphc3BlcgorZm9yIHVzZSBvbiBhIHByb2R1Y3Rpb24gVG9tY2F0IHNlcnZlci48L3A+CisKKzxwPlRoZSBzZXJ2bGV0IHdoaWNoIGltcGxlbWVudHMgSmFzcGVyIGlzIGNvbmZpZ3VyZWQgdXNpbmcgaW5pdCBwYXJhbWV0ZXJzCitpbiB5b3VyIGdsb2JhbCA8Y29kZT4kQ0FUQUxJTkFfQkFTRS9jb25mL3dlYi54bWw8L2NvZGU+LgorCis8dWw+Cis8bGk+PHN0cm9uZz5jaGVja0ludGVydmFsPC9zdHJvbmc+IC0gSWYgZGV2ZWxvcG1lbnQgaXMgZmFsc2UgYW5kIHJlbG9hZGluZyBpcwordHJ1ZSwgYmFja2dyb3VuZCBjb21waWxlcyBhcmUgZW5hYmxlZC4gY2hlY2tJbnRlcnZhbCBpcyB0aGUgdGltZSBpbiBzZWNvbmRzCitiZXR3ZWVuIGNoZWNrcyB0byBzZWUgaWYgYSBKU1AgcGFnZSBuZWVkcyB0byBiZSByZWNvbXBpbGVkLiBEZWZhdWx0Cis8Y29kZT4zMDA8L2NvZGU+IHNlY29uZHMuPC9saT4KKworPGxpPjxzdHJvbmc+Y29tcGlsZXI8L3N0cm9uZz4gLSBXaGljaCBjb21waWxlciBBbnQgc2hvdWxkIHVzZSB0byBjb21waWxlIEpTUAorcGFnZXMuICBTZWUgdGhlIEFudCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLiBJZiB0aGUgdmFsdWUgaXMgbm90IHNldCwKK3RoZW4gdGhlIGRlZmF1bHQgRWNsaXBzZSBKRFQgSmF2YSBjb21waWxlciB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB1c2luZyBBbnQuIAorTm8gZGVmYXVsdCB2YWx1ZS48L2xpPgorCis8bGk+PHN0cm9uZz5jbGFzc2RlYnVnaW5mbzwvc3Ryb25nPiAtIFNob3VsZCB0aGUgY2xhc3MgZmlsZSBiZSBjb21waWxlZCB3aXRoCitkZWJ1Z2dpbmcgaW5mb3JtYXRpb24/ICA8Y29kZT50cnVlPC9jb2RlPiBvciA8Y29kZT5mYWxzZTwvY29kZT4sIGRlZmF1bHQKKzxjb2RlPnRydWU8L2NvZGU+LgorPC9saT4KKworPGxpPjxzdHJvbmc+Y2xhc3NwYXRoPC9zdHJvbmc+IC0gRGVmaW5lcyB0aGUgY2xhc3MgcGF0aCB0byBiZSB1c2VkIHRvIGNvbXBpbGUKK3RoZSBnZW5lcmF0ZWQgc2VydmxldHMuIFRoaXMgcGFyYW1ldGVyIG9ubHkgaGFzIGFuIGVmZmVjdCBpZiB0aGUgU2VydmxldENvbnRleHQKK2F0dHJpYnV0ZSBvcmcuYXBhY2hlLmphc3Blci5Db25zdGFudHMuU0VSVkxFVF9DTEFTU1BBVEggaXMgbm90IHNldC4gVGhpcworYXR0cmlidXRlIGlzIGFsd2F5cyBzZXQgd2hlbiBKYXNwZXIgaXMgdXNlZCB3aXRoaW4gVG9tY2F0LiBCeSBkZWZhdWx0IHRoZQorY2xhc3NwYXRoIGlzIGNyZWF0ZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGN1cnJlbnQgd2ViIGFwcGxpY2F0aW9uLjwvbGk+CisKKzxsaT48c3Ryb25nPmNvbXBpbGVyU291cmNlVk08L3N0cm9uZz4gLSBXaGF0IEpESyB2ZXJzaW9uIGFyZSB0aGUgc291cmNlIGZpbGVzIGNvbXBhdGlibGUgd2l0aD8gKERlZmF1bHQgSkRLIDEuNCk8L2xpPgorCis8bGk+PHN0cm9uZz5jb21waWxlclRhcmdldFZNPC9zdHJvbmc+IC0gV2hhdCBKREsgdmVyc2lvbiBhcmUgdGhlIGdlbmVyYXRlZCBmaWxlcyBjb21wYXRpYmxlIHdpdGg/IChEZWZhdWx0IEpESyAxLjQpPC9saT4KKworPGxpPjxzdHJvbmc+ZGV2ZWxvcG1lbnQ8L3N0cm9uZz4gLSBJcyBKYXNwZXIgdXNlZCBpbiBkZXZlbG9wbWVudCBtb2RlICh3aWxsCitjaGVjayBmb3IgSlNQIG1vZGlmaWNhdGlvbiBvbiBldmVyeSBhY2Nlc3MpPyA8Y29kZT50cnVlPC9jb2RlPiBvcgorPGNvZGU+ZmFsc2U8L2NvZGU+LCBkZWZhdWx0IDxjb2RlPnRydWU8L2NvZGU+LjwvbGk+CisKKzxsaT48c3Ryb25nPmVuYWJsZVBvb2xpbmc8L3N0cm9uZz4gLSBEZXRlcm1pbmVzIHdoZXRoZXIgdGFnIGhhbmRsZXIgcG9vbGluZyBpcworZW5hYmxlZC4gPGNvZGU+dHJ1ZTwvY29kZT4gb3IgPGNvZGU+ZmFsc2U8L2NvZGU+LCBkZWZhdWx0IDxjb2RlPnRydWU8L2NvZGU+LgorPC9saT4KKworPGxpPjxzdHJvbmc+ZW5naW5lT3B0aW9uc0NsYXNzPC9zdHJvbmc+IC0gQWxsb3dzIHNwZWNpZnlpbmcgdGhlIE9wdGlvbnMgY2xhc3MKK3VzZWQgdG8gY29uZmlndXJlIEphc3Blci4gSWYgbm90IHByZXNlbnQsIHRoZSBkZWZhdWx0IEVtYmVkZGVkU2VydmxldE9wdGlvbnMKK3dpbGwgYmUgdXNlZC4KKzwvbGk+CisKKzxsaT48c3Ryb25nPmllQ2xhc3NJZDwvc3Ryb25nPiAtIFRoZSBjbGFzcy1pZCB2YWx1ZSB0byBiZSBzZW50IHRvIEludGVybmV0CitFeHBsb3JlciB3aGVuIHVzaW5nICZsdDtqc3A6cGx1Z2luJmd0OyB0YWdzLiAgIERlZmF1bHQKKzxjb2RlPmNsc2lkOjhBRDlDODQwLTA0NEUtMTFEMS1CM0U5LTAwODA1RjQ5OUQ5MzwvY29kZT4uPC9saT4KKworPGxpPjxzdHJvbmc+Zm9yazwvc3Ryb25nPiAtIEhhdmUgQW50IGZvcmsgSlNQIHBhZ2UgY29tcGlsZXMgc28gdGhleSBhcmUKK3BlcmZvcm1lZCBpbiBhIHNlcGVyYXRlIEpWTSBmcm9tIFRvbWNhdD8gPGNvZGU+dHJ1ZTwvY29kZT4gb3IKKzxjb2RlPmZhbHNlPC9jb2RlPiwgZGVmYXVsdCA8Y29kZT50cnVlPC9jb2RlPi48L2xpPgorCis8bGk+PHN0cm9uZz5qYXZhRW5jb2Rpbmc8L3N0cm9uZz4gLSBKYXZhIGZpbGUgZW5jb2RpbmcgdG8gdXNlIGZvciBnZW5lcmF0aW5nCitqYXZhIHNvdXJjZSBmaWxlcy4gRGVmYXVsdCA8Y29kZT5VVEY4PC9jb2RlPi48L2xpPgorCis8bGk+PHN0cm9uZz5nZW5TdHJpbmdBc0NoYXJBcnJheTwvc3Ryb25nPiAtIFNob3VsZCB0ZXh0IHN0cmluZ3MgYmUgZ2VuZXJhdGVkIGFzIGNoYXIKK2FycmF5cywgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBpbiBzb21lIGNhc2VzPyBEZWZhdWx0IDxjb2RlPmZhbHNlPC9jb2RlPi48L2xpPgorCis8bGk+PHN0cm9uZz5rZWVwZ2VuZXJhdGVkPC9zdHJvbmc+IC0gU2hvdWxkIHdlIGtlZXAgdGhlIGdlbmVyYXRlZCBKYXZhIHNvdXJjZQorY29kZSBmb3IgZWFjaCBwYWdlIGluc3RlYWQgb2YgZGVsZXRpbmcgaXQ/IDxjb2RlPnRydWU8L2NvZGU+IG9yCis8Y29kZT5mYWxzZTwvY29kZT4sIGRlZmF1bHQgPGNvZGU+dHJ1ZTwvY29kZT4uPC9saT4KKworPGxpPjxzdHJvbmc+bWFwcGVkZmlsZTwvc3Ryb25nPiAtIFNob3VsZCB3ZSBnZW5lcmF0ZSBzdGF0aWMgY29udGVudCB3aXRoIG9uZSAKK3ByaW50IHN0YXRlbWVudCBwZXIgaW5wdXQgbGluZSwgdG8gZWFzZSBkZWJ1Z2dpbmc/Cis8Y29kZT50cnVlPC9jb2RlPiBvciA8Y29kZT5mYWxzZTwvY29kZT4sIGRlZmF1bHQgPGNvZGU+dHJ1ZTwvY29kZT4uPC9saT4KKworPGxpPjxzdHJvbmc+bW9kaWZpY2F0aW9uVGVzdEludGVydmFsPC9zdHJvbmc+IC0gQ2hlY2tzIGZvciBtb2RpZmljYXRpb24gZm9yIGEgZ2l2ZW4KK0pTUCBmaWxlIChhbmQgYWxsIGl0cyBkZXBlbmRlbnQgZmlsZXMpIHdpbGwgYmUgcGVyZm9ybWVkIG9ubHkgb25jZSBldmVyeSBzcGVjaWZpZWQgYW1vdW50CitvZiBzZWNvbmRzLiBTZXR0aW5nIHRoaXMgdG8gMCB3aWxsIGNhdXNlIHRoZSBKU1AgdG8gYmUgY2hlY2tlZCBvbiBldmVyeSBhY2Nlc3MuCitEZWZhdWx0IGlzIDxjb2RlPjQ8L2NvZGU+IHNlY29uZHMuPC9saT4KKworPGxpPjxzdHJvbmc+cmVsb2FkaW5nPC9zdHJvbmc+IC0gU2hvdWxkIEphc3BlciBjaGVjayBmb3IgbW9kaWZpZWQgSlNQcz8KKzxjb2RlPnRydWU8L2NvZGU+IG9yIDxjb2RlPmZhbHNlPC9jb2RlPiwgZGVmYXVsdCA8Y29kZT5mYWxzZTwvY29kZT4uPC9saT4KKworPGxpPjxzdHJvbmc+c2NyYXRjaGRpcjwvc3Ryb25nPiAtIFdoYXQgc2NyYXRjaCBkaXJlY3Rvcnkgc2hvdWxkIHdlIHVzZSB3aGVuCitjb21waWxpbmcgSlNQIHBhZ2VzPyBEZWZhdWx0IGlzIHRoZSB3b3JrIGRpcmVjdG9yeSBmb3IgdGhlIGN1cnJlbnQgd2ViCithcHBsaWNhdGlvbi48L2xpPgorCis8bGk+PHN0cm9uZz50cmltU3BhY2VzPC9zdHJvbmc+IC0gU2hvdWxkIHdoaXRlIHNwYWNlcyBpbiB0ZW1wbGF0ZSB0ZXh0IGJldHdlZW4KK2FjdGlvbnMgb3IgZGlyZWN0aXZlcyBiZSB0cmltbWVkID8sIGRlZmF1bHQgPGNvZGU+ZmFsc2U8L2NvZGU+LjwvbGk+Cis8L3VsPgorPC9wPgorCis8cD5UaGUgSmF2YSBjb21waWxlciBmcm9tIEVjbGlwc2UgSkRUIGluIGluY2x1ZGVkIGFzIHRoZSBkZWZhdWx0IGNvbXBpbGVyLiBJdCBpcyBhbgorYWR2YW5jZWQgSmF2YSBjb21waWxlciB3aGljaCB3aWxsIGxvYWQgYWxsIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBUb21jYXQgY2xhc3MgbG9hZGVyLCAKK3doaWNoIHdpbGwgaGVscCB0cmVtZW5kb3VzbHkgd2hlbiBjb21waWxpbmcgb24gbGFyZ2UgaW5zdGFsbGF0aW9ucyB3aXRoIHRlbnMgb2YgSkFScy4KK09uIGZhc3Qgc2VydmVycywgdGhpcyB3aWxsIGFsbG93IHN1Yi1zZWNvbmQgcmVjb21waWxhdGlvbiBjeWNsZXMgZm9yIGV2ZW4gbGFyZ2UgSlNQIAorcGFnZXMuIFRoaXMgbmV3IGNvbXBpbGVyIHdpbGwgYmUgdXBkYXRlZCB0byBzdXBwb3J0IHRoZSBKYXZhIDUgc3ludGF4IGFzIHNvb24gYXMKK3Bvc3NpYmxlLjwvcD4KKworPHA+QXBhY2hlIEFudCwgd2hpY2ggd2FzIHVzZWQgaW4gcHJldmlvdXMgVG9tY2F0IHJlbGVhc2VzLCBjYW4gYmUgdXNlZCBpbnN0ZWFkIGluc3RlYWQgb2YgCit0aGUgbmV3IGNvbXBpbGVyIGJ5IHNpbXBseSByZW1vdmluZyB0aGUgPGNvZGU+Y29tbW9uL2xpYi9qYXNwZXItY29tcGlsZXItamR0LmphcjwvY29kZT4gZmlsZSwgCithbmQgcGxhY2luZyB0aGUgPGNvZGU+YW50LmphcjwvY29kZT4gZmlsZSBmcm9tIHRoZSBsYXRlc3QgQW50IGRpc3RyaWJ1dGlvbiBpbiB0aGUgCis8Y29kZT5jb21tb24vbGliPC9jb2RlPiBmb2xkZXIuICBJZiB5b3UgZG8gdGhpcywgeW91IGFsc28gbmVlZCB0byB1c2UgdGhlICJqYXZhYyIKK2FyZ3VtZW50IHRvIGNhdGFsaW5hLnNoLjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJQcm9kdWN0aW9uIENvbmZpZ3VyYXRpb24iPgorCis8cD5UaGUgbWFpbiBKU1Agb3B0aW1pemF0aW9uIHdoaWNoIGNhbiBiZSBkb25lIGlzIHByZWNvbXBpbGF0aW9uIG9mIEpTUHMuIEhvd2V2ZXIsCit0aGlzIG1pZ2h0IG5vdCBiZSBwb3NzaWJsZSAoZm9yIGV4YW1wbGUsIHdoZW4gdXNpbmcgdGhlIGpzcC1wcm9wZXJ0eS1ncm91cCBmZWF0dXJlKQorb3IgcHJhY3RpY2FsLCBpbiB3aGljaCBjYXNlIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBKYXNwZXIgc2VydmxldCBiZWNvbWVzIGNyaXRpY2FsLjwvcD4KKworPHA+V2hlbiB1c2luZyBKYXNwZXIgMiBpbiBhIHByb2R1Y3Rpb24gVG9tY2F0IHNlcnZlciB5b3Ugc2hvdWxkIGNvbnNpZGVyCittYWtpbmcgdGhlIGZvbGxvd2luZyBjaGFuZ2VzIGZyb20gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KKzx1bD4KKzxsaT48c3Ryb25nPmRldmVsb3BtZW50PC9zdHJvbmc+IC0gVG8gZGlzYWJsZSBvbiBhY2Nlc3MgY2hlY2tzIGZvciBKU1AKK3BhZ2VzIGNvbXBpbGF0aW9uIHNldCB0aGlzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L2xpPgorPGxpPjxzdHJvbmc+Z2VuU3RyaW5nQXNDaGFyQXJyYXk8L3N0cm9uZz4gLSBUbyBnZW5lcmF0ZSBzbGlnaHRseSBtb3JlIGVmZmljaWVudCAKK2NoYXIgYXJyYXlzLCBzZXQgdGhpcyB0byA8Y29kZT50cnVlPC9jb2RlPi48L2xpPgorPGxpPjxzdHJvbmc+bW9kaWZpY2F0aW9uVGVzdEludGVydmFsPC9zdHJvbmc+IC0gSWYgZGV2ZWxvcG1lbnQgaGFzIHRvIGJlIHNldCB0bworPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGFueSByZWFzb24gKHN1Y2ggYXMgZHluYW1pYyBnZW5lcmF0aW9uIG9mIEpTUHMpLCBzZXR0aW5nCit0aGlzIHRvIGEgaGlnaCB2YWx1ZSB3aWxsIGltcHJvdmUgcGVyZm9ybWFuY2UgYSBsb3QuPC9saT4KKzxsaT48c3Ryb25nPnRyaW1TcGFjZXM8L3N0cm9uZz4gLSBUbyByZW1vdmUgdXNlbGVzcyBieXRlcyBmcm9tIHRoZSByZXNwb25zZSwKK3NldCB0aGlzIHRvIDxjb2RlPnRydWU8L2NvZGU+LjwvbGk+Cis8L3VsPgorPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IldlYiBBcHBsaWNhdGlvbiBDb21waWxhdGlvbiI+CisKKzxwPlVzaW5nIEFudCBpcyB0aGUgcHJlZmVycmVkIHdheSB0byBjb21waWxlIHdlYiBhcHBsaWNhdGlvbnMgdXNpbmcgSlNQQy4gCitVc2UgdGhlIHNjcmlwdCBnaXZlbiBiZWxvdyAoYSBzaW1pbGFyIHNjcmlwdCBpcyBpbmNsdWRlZCBpbiB0aGUgImRlcGxveWVyIiAKK2Rvd25sb2FkKSB0byBwcmVjb21waWxlIGEgd2ViYXBwOgorPC9wPgorCis8cD4KKzxzb3VyY2U+CismbHQ7cHJvamVjdCBuYW1lPSJXZWJhcHAgUHJlY29tcGlsYXRpb24iIGRlZmF1bHQ9ImFsbCIgYmFzZWRpcj0iLiImZ3Q7IAorCisgICZsdDt0YXJnZXQgbmFtZT0ianNwYyImZ3Q7IAorCisgICAgJmx0O3Rhc2tkZWYgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmphc3Blci5Kc3BDIiBuYW1lPSJqYXNwZXIyIiAmZ3Q7IAorICAgICAgJmx0O2NsYXNzcGF0aCBpZD0ianNwYy5jbGFzc3BhdGgiJmd0OyAKKyAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIke2phdmEuaG9tZX0vLi4vbGliL3Rvb2xzLmphciIvJmd0OyAKKyAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke3RvbWNhdC5ob21lfS9iaW4iJmd0OyAKKyAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqLmphciIvJmd0OyAKKyAgICAgICAgJmx0Oy9maWxlc2V0Jmd0OyAKKyAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke3RvbWNhdC5ob21lfS9zZXJ2ZXIvbGliIiZndDsgCisgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKi5qYXIiLyZndDsgCisgICAgICAgICZsdDsvZmlsZXNldCZndDsgCisgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHt0b21jYXQuaG9tZX0vY29tbW9uL2xpYiImZ3Q7IAorICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IiouamFyIi8mZ3Q7IAorICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7IAorICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7IAorICAgICZsdDsvdGFza2RlZiZndDsgCisKKyAgICAmbHQ7amFzcGVyMiAKKyAgICAgICAgICAgICB2YWxpZGF0ZVhtbD0iZmFsc2UiIAorICAgICAgICAgICAgIHVyaXJvb3Q9IiR7d2ViYXBwLnBhdGh9IiAKKyAgICAgICAgICAgICB3ZWJYbWxGcmFnbWVudD0iJHt3ZWJhcHAucGF0aH0vV0VCLUlORi9nZW5lcmF0ZWRfd2ViLnhtbCIgCisgICAgICAgICAgICAgb3V0cHV0RGlyPSIke3dlYmFwcC5wYXRofS9XRUItSU5GL3NyYyIgLyZndDsgCisKKyAgJmx0Oy90YXJnZXQmZ3Q7IAorCisgICZsdDt0YXJnZXQgbmFtZT0iY29tcGlsZSImZ3Q7CisKKyAgICAmbHQ7bWtkaXIgZGlyPSIke3dlYmFwcC5wYXRofS9XRUItSU5GL2NsYXNzZXMiLyZndDsKKyAgICAmbHQ7bWtkaXIgZGlyPSIke3dlYmFwcC5wYXRofS9XRUItSU5GL2xpYiIvJmd0OworCisgICAgJmx0O2phdmFjIGRlc3RkaXI9IiR7d2ViYXBwLnBhdGh9L1dFQi1JTkYvY2xhc3NlcyIKKyAgICAgICAgICAgb3B0aW1pemU9Im9mZiIKKyAgICAgICAgICAgZGVidWc9Im9uIiBmYWlsb25lcnJvcj0iZmFsc2UiCisgICAgICAgICAgIHNyY2Rpcj0iJHt3ZWJhcHAucGF0aH0vV0VCLUlORi9zcmMiIAorCSAgIGV4Y2x1ZGVzPSIqKi8qLnNtYXAiJmd0OworICAgICAgJmx0O2NsYXNzcGF0aCZndDsKKyAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIke3dlYmFwcC5wYXRofS9XRUItSU5GL2NsYXNzZXMiLyZndDsKKyAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke3dlYmFwcC5wYXRofS9XRUItSU5GL2xpYiImZ3Q7CisgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKi5qYXIiLyZndDsKKyAgICAgICAgJmx0Oy9maWxlc2V0Jmd0OworICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dG9tY2F0LmhvbWV9L2NvbW1vbi9jbGFzc2VzIi8mZ3Q7CisgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHt0b21jYXQuaG9tZX0vY29tbW9uL2xpYiImZ3Q7CisgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKi5qYXIiLyZndDsKKyAgICAgICAgJmx0Oy9maWxlc2V0Jmd0OworICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dG9tY2F0LmhvbWV9L3NoYXJlZC9jbGFzc2VzIi8mZ3Q7CisgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHt0b21jYXQuaG9tZX0vc2hhcmVkL2xpYiImZ3Q7CisgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKi5qYXIiLyZndDsKKyAgICAgICAgJmx0Oy9maWxlc2V0Jmd0OworICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7dG9tY2F0LmhvbWV9L2JpbiImZ3Q7IAorICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IiouamFyIi8mZ3Q7IAorICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7IAorICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7CisgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKiIgLyZndDsKKyAgICAgICZsdDtleGNsdWRlIG5hbWU9InRhZ3MvKioiIC8mZ3Q7CisgICAgJmx0Oy9qYXZhYyZndDsKKworICAmbHQ7L3RhcmdldCZndDsKKworICAmbHQ7dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0ianNwYyxjb21waWxlIiZndDsKKyAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgJmx0O3RhcmdldCBuYW1lPSJjbGVhbnVwIiZndDsKKyAgCSZsdDtkZWxldGUmZ3Q7CisgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHt3ZWJhcHAucGF0aH0vV0VCLUlORi9zcmMiLyZndDsKKyAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke3dlYmFwcC5wYXRofS9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9qc3AiLyZndDsKKyAgCSZsdDsvZGVsZXRlJmd0OworICAmbHQ7L3RhcmdldCZndDsKKworJmx0Oy9wcm9qZWN0Jmd0OworPC9zb3VyY2U+Cis8L3A+CisKKzxwPgorVGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgY2FuIGJlIHVzZWQgdG8gcnVuIHRoZSBzY3JpcHQKKyhyZXBsYWNpbmcgdGhlIHRva2VucyB3aXRoIHRoZSBUb21jYXQgYmFzZSBwYXRoIGFuZCB0aGUgcGF0aCB0byB0aGUgd2ViYXBwIAord2hpY2ggc2hvdWxkIGJlIHByZWNvbXBpbGVkKTo8YnIvPgorPHNvdXJjZT4KKyRBTlRfSE9NRS9iaW4vYW50IC1EdG9tY2F0LmhvbWU9Jmx0OyRUT01DQVRfSE9NRSZndDsgLUR3ZWJhcHAucGF0aD0mbHQ7JFdFQkFQUF9QQVRIJmd0OworPC9zb3VyY2U+Cis8L3A+CisKKzxwPgorVGhlbiwgdGhlIGRlY2xhcmF0aW9ucyBhbmQgbWFwcGluZ3MgZm9yIHRoZSBzZXJ2bGV0cyB3aGljaCB3ZXJlIGdlbmVyYXRlZCAKK2R1cmluZyB0aGUgcHJlY29tcGlsYXRpb24gbXVzdCBiZSBhZGRlZCB0byB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKK2Rlc2NyaXB0b3IuIEluc2VydCB0aGUgPGNvZGU+JHt3ZWJhcHAucGF0aH0vV0VCLUlORi9nZW5lcmF0ZWRfd2ViLnhtbDwvY29kZT4KK2F0IHRoZSByaWdodCBwbGFjZSBpbnNpZGUgdGhlIDxjb2RlPiR7d2ViYXBwLnBhdGh9L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4gZmlsZS4KK1Jlc3RhcnQgdGhlIHdlYiBhcHBsaWNhdGlvbiAodXNpbmcgdGhlIG1hbmFnZXIpIGFuZCB0ZXN0IGl0IHRvIHZlcmlmeSBpdCBpcyAKK3J1bm5pbmcgZmluZSB3aXRoIHByZWNvbXBpbGVkIHNlcnZsZXRzLiBBbiBhcHByb3ByaWF0ZSB0b2tlbiBwbGFjZWQgaW4gdGhlCit3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG1heSBhbHNvIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseQoraW5zZXJ0IHRoZSBnZW5lcmF0ZWQgc2VydmxldCBkZWNsYXJhdGlvbnMgYW5kIG1hcHBpbmdzIHVzaW5nIEFudCBmaWx0ZXJpbmcgCitjYXBhYmlsaXRpZXMuIFRoaXMgaXMgYWN0dWFsbHkgaG93IGFsbCB0aGUgd2ViYXBwcyBkaXN0cmlidXRlZCB3aXRoIFRvbWNhdCAKK2FyZSBhdXRvbWF0aWNhbGx5IGNvbXBpbGVkIGFzIHBhcnQgb2YgdGhlIGJ1aWxkIHByb2Nlc3MuCis8L3A+CisKKzxwPgorQXQgdGhlIGphc3BlcjIgdGFzayB5b3UgY2FuIHVzZSB0aGUgb3B0aW9uIDxjb2RlPmFkZFdlYlhtbE1hcHBpbmdzPC9jb2RlPiBmb3IgCithdXRvbWF0aWMgbWVyZ2UgdGhlIDxjb2RlPiR7d2ViYXBwLnBhdGh9L1dFQi1JTkYvZ2VuZXJhdGVkX3dlYi54bWw8L2NvZGU+Cit3aXRoIHRoZSBjdXJyZW50IHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXQgPGNvZGU+JHt3ZWJhcHAucGF0aH0vV0VCLUlORi93ZWIueG1sPC9jb2RlPi4KK1doZW4geW91IHdhbnQgdG8gdXNlIEphdmEgNSBmZWF0dXJlIGluc2lkZSB5b3VyIGpzcCdzLCBhZGQgdGhlIGZvbGxvd2luZyBqYXZhYyBjb21waWxlciB0YXNrCithdHRyaWJ1dGVzOiA8Y29kZT5zb3VyY2U9JnF1b3Q7MS41JnF1b3Q7IHRhcmdldD0mcXVvdDsxLjUmcXVvdDs8L2NvZGU+LiBGb3IgbGl2ZSBhcHBsaWNhdGlvbgoreW91IGNhbiBhbHNvIGNvbXBpbGUgd2l0aCA8Y29kZT5vcHRpbWl6ZT0mcXVvdDtvbiZxdW90OzwvY29kZT4gYW5kIHdpdGhvdXQgZGVidWcgaW5mbworPGNvZGU+ZGVidWc9JnF1b3Q7b2ZmJnF1b3Q7PC9jb2RlPi4KKzwvcD4KKworPHA+CitXaGVuIHlvdSBkb24ndCB3YW50IHRvIHN0b3AgdGhlIGpzcCBnZW5lcmF0aW9uIGF0IGZpcnN0IGpzcCBzeW50YXggZXJyb3IsIHVzZSAgIAorPGNvZGU+ZmFpbE9uRXJyb3I9JnF1b3Q7ZmFsc2UmcXVvdDs8L2NvZGU+YW5kIHdpdGggPGNvZGU+c2hvd1N1Y2Nlc3M9JnF1b3Q7dHJ1ZSZxdW90OzwvY29kZT4KK2FsbCBzdWNjZXNzZnVsbCA8aT5qc3AgdG8gamF2YTwvaT4gZ2VuZXJhdGlvbiBhcmUgcHJpbnRlZCBvdXQuIFNvbWV0aW1lcyBpdCBpcwordmVyeSBoZWxwZnVsbCwgd2hlbiB5b3UgY2xlYW51cCB0aGUgZ2VuZXJhdGUgamF2YSBzb3VyY2UgZmlsZXMgYXQgPGNvZGU+JHt3ZWJhcHAucGF0aH0vV0VCLUlORi9zcmM8L2NvZGU+CithbmQgdGhlIGNvbXBpbGUganNwIHNlcnZsZXQgY2xhc3NlcyBhdCA8Y29kZT4ke3dlYmFwcC5wYXRofS9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9qc3A8L2NvZGU+LgorPC9wPgorCis8cD48c3Ryb25nPkhpbnRzOjwvc3Ryb25nPgorPHVsPgorPGxpPiBXaGVuIHlvdSBzd2l0Y2ggdG8gYW5vdGhlciB0b21jYXQgcmVsZWFzZSwgdGhlbiByZWdlbmVyYXRlIGFuZCByZWNvbXBpbGUKK3lvdXIganNwJ3Mgd2l0aCB0aGlzIHZlcnNpb24gYWdhaW4hPC9saT4KKzxsaT5Vc2UgamF2YSBzeXN0ZW0gcHJvcGVydHkgYXQgc2VydmVyIHJ1bnRpbWUgdG8gZGlzYWJsZSB0YWcgcG9vbGluZyA8Y29kZT5vcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcEZhY3RvcnlJbXBsLlVTRV9QT09MPWZhbHNlPC9jb2RlPi4KK2FuZCBsaW1pdCB0aGUgYnVmZmVyaW5nIHdpdGggPGNvZGU+b3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Cb2R5Q29udGVudEltcGwuTElNSVRfQlVGRkVSPXRydWU8L2NvZGU+LiBOb3RlIHRoYXQgY2hhbmdpbmcKK2Zyb20gdGhlIGRlZmF1bHRzIG1heSBhZmZlY3QgcGVyZm9ybWFuY2UsIGJ1dCBkZXBlbmRpbmcgb24gdGhlIGFwcGxpY2F0aW9uLjwvbGk+Cis8L3VsPgorPC9wPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJVc2luZyBKaWtlcyI+CisKKzxwPklmIHlvdSB3aXNoIHRvIHVzZQorPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvamlrZXMvIj4KK0ppa2VzPC9hPiB0byBjb21waWxlIEpTUCBwYWdlczoKKzx1bD4KKzxsaT5Gcm9tIHlvdXIgPGEgaHJlZj0iYW50LmFwYWNoZS5vcmciPkFudDwvYT4gaW5zdGFsbGF0aW9uLCBjb3B5IGFudC5qYXIKK2FuZCAoaWYgaXQncyBhdmFpbGFibGU6IEFudCAxLjUgYW5kIGxhdGVyKSBhbnQtbGF1bmNoZXIuamFyIHRvIAorPGNvZGU+JENBVEFMSU5BX0JBU0UvY29tbW9uL2xpYjwvY29kZT4uPC9saT4KKzxsaT5Eb3dubG9hZCBhbmQgaW5zdGFsbCBqaWtlcy4gamlrZXMgbXVzdCBzdXBwb3J0IHRoZSAtZW5jb2Rpbmcgb3B0aW9uLgorRXhlY3V0ZSA8Y29kZT5qaWtlcyAtaGVscDwvY29kZT4gdG8gdmVyaWZ5IHRoYXQgaXQgd2FzIGJ1aWx0IHdpdGggc3VwcG9ydAorZm9yIDxjb2RlPi1lbmNvZGluZzwvY29kZT4uPC9saT4KKzxsaT5TZXQgdGhlIGluaXQgcGFyYW1ldGVyIDxjb2RlPmNvbXBpbGVyPC9jb2RlPiB0byA8Y29kZT5qaWtlczwvY29kZT4uPC9saT4KKzxsaT5EZWZpbmUgdGhlIHByb3BlcnR5IDxjb2RlPi1EYnVpbGQuY29tcGlsZXIuZW1hY3M9dHJ1ZTwvY29kZT4gd2hlbiBzdGFydGluZworVG9tY2F0IGJ5IGFkZGluZyBpdCB0byB5b3VyIDxjb2RlPkNBVEFMSU5BX09QVFM8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlLgorVGhpcyBjaGFuZ2VzIGhvdyBqaWtlcyBvdXRwdXRzIGVycm9yIG1lc3NhZ2VzIHNvIHRoYXQgaXQgaXMgY29tcGF0aWJsZSB3aXRoCitKYXNwZXIuPC9saT4KKzxsaT5JZiB5b3UgZ2V0IGFuIGVycm9yIHJlcG9ydGluZyB0aGF0IGppa2VzIGNhbid0IHVzZSBVVEY4IGVuY29kaW5nLCB0cnkKK3NldHRpbmcgdGhlIGluaXQgcGFyYW1ldGVyIDxjb2RlPmphdmFFbmNvZGluZzwvY29kZT4gdG8KKzxjb2RlPklTTy04ODU5LTE8L2NvZGU+LjwvbGk+Cis8L3VsPgorPC9wPgorCis8L3NlY3Rpb24+Cis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2phc3Blci9kb2NzL2FwaS9pbmRleC5odG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9qYXNwZXIvZG9jcy9hcGkvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmU4ZjlhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9qYXNwZXIvZG9jcy9hcGkvaW5kZXguaHRtbApAQCAtMCwwICsxLDE3IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL3N0cmljdC5kdGQiPgorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICAgPHRpdGxlPkFkbWluaXN0cmF0aW9uPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKK1RvbWNhdCdzIGludGVybmFsIGphdmFkb2MgaXMgbm8gbG9uZ2VyIGluc3RhbGxlZCBieSBkZWZhdWx0LiBEb3dubG9hZCBhbmQgaW5zdGFsbCAKK3RoZSAiZnVsbGRvY3MiIHBhY2thZ2UgdG8gZ2V0IGl0LgorCitZb3UgY2FuIGFsc28gYWNjZXNzIHRoZSBqYXZhZG9jIG9ubGluZSBpbiB0aGUgVG9tY2F0IAorPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvdG9tY2F0LTUuNS1kb2MvIj5kb2N1bWVudGF0aW9uIGJ1bmRsZTwvYT4uCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvam5kaS1kYXRhc291cmNlLWV4YW1wbGVzLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvam5kaS1kYXRhc291cmNlLWV4YW1wbGVzLWhvd3RvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTdiNThhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9qbmRpLWRhdGFzb3VyY2UtZXhhbXBsZXMtaG93dG8ueG1sCkBAIC0wLDAgKzEsNjU1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iam5kaS1kYXRhc291cmNlLWV4YW1wbGVzLWhvd3RvLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0ibGVzbGllLmh1Z2hlc0BydWJ1cy5jb20iPkxlcyBIdWdoZXM8L2F1dGhvcj4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0iZGF2aWQtdG9tY2F0QGhhcmFidXJkYS5jb20iPkRhdmlkIEhhcmFidXJkYTwvYXV0aG9yPgorICAgICAgICA8YXV0aG9yPkdsZW5uIE5pZWxzZW48L2F1dGhvcj4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0ieW9hdnNAYXBhY2hlLm9yZyI+WW9hdiBTaGFwaXJhPC9hdXRob3I+CisgICAgICAgIDx0aXRsZT5KTkRJIERhdGFzb3VyY2UgSE9XLVRPPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCis8c2VjdGlvbiBuYW1lPSJUYWJsZSBvZiBDb250ZW50cyI+Cis8cD4KKzxhIGhyZWY9IiNJbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT48YnIgLz4KKzxhIGhyZWY9IiNEYXRhYmFzZSBDb25uZWN0aW9uIFBvb2wgKERCQ1ApIENvbmZpZ3VyYXRpb25zIj4KK0RhdGFiYXNlIENvbm5lY3Rpb24gUG9vbCAoREJDUCkgQ29uZmlndXJhdGlvbnM8L2E+PGJyIC8+Cis8YSBocmVmPSIjTm9uIERCQ1AgU29sdXRpb25zIj5Ob24gREJDUCBTb2x1dGlvbnM8L2E+PGJyIC8+Cis8YSBocmVmPSIjT3JhY2xlIDhpIHdpdGggT0NJIGNsaWVudCI+T3JhY2xlIDhpIHdpdGggT0NJIGNsaWVudDwvYT48YnIgLz4KKzxhIGhyZWY9IiNDb21tb24gUHJvYmxlbXMiPkNvbW1vbiBQcm9ibGVtczwvYT48YnIgLz4KKzwvcD4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworPHA+Sk5ESSBEYXRhc291cmNlIGNvbmZpZ3VyYXRpb24gaXMgY292ZXJlZCBleHRlbnNpdmVseSBpbiB0aGUKK0pOREktUmVzb3VyY2VzLUhPV1RPLiAgSG93ZXZlciwgZmVlZGJhY2sgZnJvbSA8Y29kZT50b21jYXQtdXNlcjwvY29kZT4gaGFzCitzaG93biB0aGF0IHNwZWNpZmljcyBmb3IgaW5kaXZpZHVhbCBjb25maWd1cmF0aW9ucyBjYW4gYmUgcmF0aGVyIHRyaWNreS48L3A+CisKKzxwPkhlcmUgdGhlbiBhcmUgc29tZSBleGFtcGxlIGNvbmZpZ3VyYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHBvc3RlZCB0bwordG9tY2F0LXVzZXIgZm9yIHBvcHVsYXIgZGF0YWJhc2VzIGFuZCBzb21lIGdlbmVyYWwgdGlwcyBmb3IgZGIgdXNlYWdlLjwvcD4KKworPHA+WW91IHNob3VsZCBiZSBhd2FyZSB0aGF0IHNpbmNlIHRoZXNlIG5vdGVzIGFyZSBkZXJpdmVkIGZyb20gY29uZmlndXJhdGlvbgorYW5kL29yIGZlZWRiYWNrIHBvc3RlZCB0byA8Y29kZT50b21jYXQtdXNlcjwvY29kZT4gWU1NViA6LSkuIFBsZWFzZSBsZXQgdXMKK2tub3cgaWYgeW91IGhhdmUgYW55IG90aGVyIHRlc3RlZCBjb25maWd1cmF0aW9ucyB0aGF0IHlvdSBmZWVsIG1heSBiZSBvZiB1c2UKK3RvIHRoZSB3aWRlciBhdWRpZW5jZSwgb3IgaWYgeW91IGZlZWwgd2UgY2FuIGltcHJvdmUgdGhpcyBzZWN0aW9uIGluIGFueXdheS48L3A+CisKKzxwPgorPGI+UGxlYXNlIG5vdGUgdGhhdCBKTkRJIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gaGFzIGNoYW5nZWQgc29tZXdoYXQgYmV0d2VlbgorVG9tY2F0IDUuMC54IGFuZCBUb21jYXQgNS41LnguPC9iPiAgWW91IHdpbGwgbW9zdCBsaWtlbHkgbmVlZCB0byBtb2RpZnkgeW91ciBKTkRJCityZXNvdXJjZSBjb25maWd1cmF0aW9ucyB0byBtYXRjaCB0aGUgc3ludGF4IGluIHRoZSBleGFtcGxlIGJlbG93IGluIG9yZGVyCit0byBtYWtlIHRoZW0gd29yayBpbiBUb21jYXQgNS41LnguCis8L3A+CisKKzxwPgorQWxzbywgcGxlYXNlIG5vdGUgdGhhdCBKTkRJIERhdGFTb3VyY2UgY29uZmlndXJhdGlvbiBpbiBnZW5lcmFsLCBhbmQgdGhpcyAKK3R1dG9yaWFsIGluIHBhcnRpY3VsYXIsIGFzc3VtZXMgdGhhdCB5b3UgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSAKKzxhIGhyZWY9ImNvbmZpZy9jb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+IGFuZCAKKzxhIGhyZWY9ImNvbmZpZy9ob3N0Lmh0bWwiPkhvc3Q8L2E+IGNvbmZpZ3VyYXRpb24gcmVmZXJlbmNlcywgaW5jbHVkaW5nCit0aGUgc2VjdGlvbiBhYm91dCBBdXRvbWF0aWMgQXBwbGljYXRpb24gRGVwbG95bWVudCBpbiB0aGUgbGF0dGVyIHJlZmVyZW5jZS4KKzwvcD4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iRGF0YWJhc2UgQ29ubmVjdGlvbiBQb29sIChEQkNQKSBDb25maWd1cmF0aW9ucyI+CisKKzxwPkRCQ1AgcHJvdmlkZXMgc3VwcG9ydCBmb3IgSkRCQyAyLjAuICBPbiBzeXN0ZW1zIHVzaW5nIGEgMS40IEpWTSBEQkNQCit3aWxsIHN1cHBvcnQgSkRCQyAzLjAuIFBsZWFzZSBsZXQgdXMga25vdyBpZiB5b3UgaGF2ZSB1c2VkIERCQ1AgYW5kIGl0cworSkRCQyAzLjAgZmVhdHVyZXMgd2l0aCBhIDEuNCBKVk0uCis8L3A+CisKKzxwPlNlZSB0aGUgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2RiY3AvY29uZmlndXJhdGlvbi5odG1sIj4KK0RCQ1AgZG9jdW1lbnRhdGlvbjwvYT4gZm9yIGEgY29tcGxldGUgbGlzdCBvZiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCis8L3A+CisKKzxzdWJzZWN0aW9uIG5hbWU9Ikluc3RhbGxhdGlvbiI+Cis8cD5EQkNQIHVzZXMgdGhlIEpha2FydGEtQ29tbW9ucyBEYXRhYmFzZSBDb25uZWN0aW9uIFBvb2wuIEl0IHJlbGllcyBvbgorbnVtYmVyIG9mIEpha2FydGEtQ29tbW9ucyBjb21wb25lbnRzOgorPHVsPgorPGxpPkpha2FydGEtQ29tbW9ucyBEQkNQPC9saT4KKzxsaT5KYWthcnRhLUNvbW1vbnMgQ29sbGVjdGlvbnM8L2xpPgorPGxpPkpha2FydGEtQ29tbW9ucyBQb29sPC9saT4KKzwvdWw+CitUaGVzZSBsaWJyYXJpZXMgYXJlIGxvY2F0ZWQgaW4gYSBzaW5nbGUgSkFSIGF0IAorPGNvZGU+JENBVEFMSU5BX0hPTUUvY29tbW9uL2xpYi9uYW1pbmctZmFjdG9yeS1kYmNwLmphcjwvY29kZT4uIEhvd2V2ZXIsCitvbmx5IHRoZSBjbGFzc2VzIG5lZWRlZCBmb3IgY29ubmVjdGlvbiBwb29saW5nIGhhdmUgYmVlbiBpbmNsdWRlZCwgYW5kIHRoZQorcGFja2FnZXMgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gYXZvaWQgaW50ZXJmZXJpbmcgd2l0aCBhcHBsaWNhdGlvbnMuCis8L3A+CisKKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iUHJldmVudGluZyBkQiBjb25uZWN0aW9uIHBvb2wgbGVha3MiPgorCis8cD4KK0EgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29sIGNyZWF0ZXMgYW5kIG1hbmFnZXMgYSBwb29sIG9mIGNvbm5lY3Rpb25zCit0byBhIGRhdGFiYXNlLiBSZWN5Y2xpbmcgYW5kIHJldXNpbmcgYWxyZWFkeSBleGlzdGluZyBjb25uZWN0aW9ucwordG8gYSBkQiBpcyBtb3JlIGVmZmljaWVudCB0aGFuIG9wZW5pbmcgYSBuZXcgY29ubmVjdGlvbi4KKzwvcD4KKworPHA+CitUaGVyZSBpcyBvbmUgcHJvYmxlbSB3aXRoIGNvbm5lY3Rpb24gcG9vbGluZy4gIEEgd2ViIGFwcGxpY2F0aW9uIGhhcwordG8gZXhwbGljZXRlbHkgY2xvc2UgUmVzdWx0U2V0J3MsIFN0YXRlbWVudCdzLCBhbmQgQ29ubmVjdGlvbidzLgorRmFpbHVyZSBvZiBhIHdlYiBhcHBsaWNhdGlvbiB0byBjbG9zZSB0aGVzZSByZXNvdXJjZXMgY2FuIHJlc3VsdCBpbgordGhlbSBuZXZlciBiZWluZyBhdmFpbGFibGUgYWdhaW4gZm9yIHJldXNlLCBhIGRiIGNvbm5lY3Rpb24gcG9vbCAibGVhayIuCitUaGlzIGNhbiBldmVudHVhbGx5IHJlc3VsdCBpbiB5b3VyIHdlYiBhcHBsaWNhdGlvbiBkYiBjb25uZWN0aW9ucyBmYWlsaW5nCitpZiB0aGVyZSBhcmUgbm8gbW9yZSBhdmFpbGFibGUgY29ubmVjdGlvbnMuPC9wPgorCis8cD4KK1RoZXJlIGlzIGEgc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtLiAgVGhlIEpha2FydGEtQ29tbW9ucyBEQkNQIGNhbiBiZQorY29uZmlndXJlZCB0byB0cmFjayBhbmQgcmVjb3ZlciB0aGVzZSBhYmFuZG9uZWQgZEIgY29ubmVjdGlvbnMuICBOb3QKK29ubHkgY2FuIGl0IHJlY292ZXIgdGhlbSwgYnV0IGFsc28gZ2VuZXJhdGUgYSBzdGFjayB0cmFjZSBmb3IgdGhlIGNvZGUKK3doaWNoIG9wZW5lZCB0aGVzZSByZXNvdXJjZXMgYW5kIG5ldmVyIGNsb3NlZCB0aGVtLjwvcD4KKworPHA+CitUbyBjb25maWd1cmUgYSBEQkNQIERhdGFTb3VyY2Ugc28gdGhhdCBhYmFuZG9uZWQgZEIgY29ubmVjdGlvbnMgYXJlCityZW1vdmVkIGFuZCByZWN5Y2xlZCBhZGQgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGUgdG8gdGhlCis8Y29kZT5SZXNvdXJjZTwvY29kZT4gY29uZmlndXJhdGlvbiBmb3IgeW91ciBEQkNQIERhdGFTb3VyY2U6Cis8c291cmNlPgorICAgICAgICAgICAgcmVtb3ZlQWJhbmRvbmVkPSJ0cnVlIgorPC9zb3VyY2U+CitXaGVuIGF2YWlsYWJsZSBkYiBjb25uZWN0aW9ucyBydW4gbG93IERCQ1Agd2lsbCByZWNvdmVyIGFuZCByZWN5bGUKK2FueSBhYmFuZG9uZWQgZEIgY29ubmVjdGlvbnMgaXQgZmluZHMuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KKzwvcD4KKworPHA+CitVc2UgdGhlIDxjb2RlPnJlbW92ZUFiYW5kb25lZFRpbWVvdXQ8L2NvZGU+IGF0dHJpYnV0ZSB0byBzZXQgdGhlIG51bWJlcgorb2Ygc2Vjb25kcyBhIGRCIGNvbm5lY3Rpb24gaGFzIGJlZW4gaWRsZSBiZWZvcmUgaXQgaXMgY29uc2lkZXJlZCBhYmFuZG9uZWQuCis8c291cmNlPgorICAgICAgICAgICAgcmVtb3ZlQWJhbmRvbmVkVGltZW91dD0iNjAiCis8L3NvdXJjZT4KK1RoZSBkZWZhdWx0IHRpbWVvdXQgZm9yIHJlbW92aW5nIGFiYW5kb25lZCBjb25uZWN0aW9ucyBpcyAzMDAgc2Vjb25kcy4KKzwvcD4KKworPHA+CitUaGUgPGNvZGU+bG9nQWJhbmRvbmVkPC9jb2RlPiBhdHRyaWJ1dGUgY2FuIGJlIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPgoraWYgeW91IHdhbnQgREJDUCB0byBsb2cgYSBzdGFjayB0cmFjZSBvZiB0aGUgY29kZSB3aGljaCBhYmFuZG9uZWQgdGhlCitkQiBjb25uZWN0aW9uIHJlc291cmNlcy4KKzxzb3VyY2U+CisgICAgICAgICAgICBsb2dBYmFuZG9uZWQ9InRydWUiCis8L3NvdXJjZT4KK1RoZSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KKzwvcD4KKworPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJNeVNRTCBEQkNQIEV4YW1wbGUiPgorCis8aDM+MC4gSW50cm9kdWN0aW9uPC9oMz4KKzxwPlZlcnNpb25zIG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cubXlzcWwuY29tL3Byb2R1Y3RzL215c3FsL2luZGV4Lmh0bWwiPk15U1FMPC9hPiBhbmQgSkRCQyBkcml2ZXJzIHRoYXQgaGF2ZSBiZWVuIHJlcG9ydGVkIHRvIHdvcms6Cis8dWw+Cis8bGk+TXlTUUwgMy4yMy40NywgTXlTUUwgMy4yMy40NyB1c2luZyBJbm5vREIsLCBNeVNRTCAzLjIzLjU4LCAgTXlTUUwgNC4wLjFhbHBoYTwvbGk+Cis8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5teXNxbC5jb20vcHJvZHVjdHMvY29ubmVjdG9yLWoiPkNvbm5lY3Rvci9KPC9hPiAzLjAuMTEtc3RhYmxlICh0aGUgb2ZmaWNpYWwgSkRCQyBEcml2ZXIpPC9saT4KKzxsaT48YSBocmVmPSJodHRwOi8vbW1teXNxbC5zb3VyY2Vmb3JnZS5uZXQiPm1tLm15c3FsPC9hPiAyLjAuMTQgKGFuIG9sZCAzcmQgcGFydHkgSkRCQyBEcml2ZXIpPC9saT4KKzwvdWw+Cis8L3A+CisKKzxwPkJlZm9yZSB5b3UgcHJvY2VlZCwgZG9uJ3QgZm9yZ2V0IHRvIGNvcHkgdGhlIEpEQkMgRHJpdmVyJ3MgamFyIGludG8gPGNvZGU+JENBVEFMSU5BX0hPTUUvY29tbW9uL2xpYjwvY29kZT4uPC9wPgorCis8aDM+MS4gTXlTUUwgY29uZmlndXJhdGlvbjwvaDM+Cis8cD4KK0Vuc3VyZSB0aGF0IHlvdSBmb2xsb3cgdGhlc2UgaW5zdHJ1Y3Rpb25zIGFzIHZhcmlhdGlvbnMgY2FuIGNhdXNlIHByb2JsZW1zLgorPC9wPgorCis8cD5DcmVhdGUgYSBuZXcgdGVzdCB1c2VyLCBhIG5ldyBkYXRhYmFzZSBhbmQgYSBzaW5nbGUgdGVzdCB0YWJsZS4KK1lvdXIgTXlTUUwgdXNlciA8c3Ryb25nPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIHBhc3N3b3JkIGFzc2lnbmVkLiBUaGUgZHJpdmVyCit3aWxsIGZhaWwgaWYgeW91IHRyeSB0byBjb25uZWN0IHdpdGggYW4gZW1wdHkgcGFzc3dvcmQuCis8c291cmNlPgorbXlzcWwmZ3Q7IEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OICouKiBUTyBqYXZhdXNlckBsb2NhbGhvc3QgCisgICAgLSZndDsgICBJREVOVElGSUVEIEJZICdqYXZhZHVkZScgV0lUSCBHUkFOVCBPUFRJT047CitteXNxbCZndDsgY3JlYXRlIGRhdGFiYXNlIGphdmF0ZXN0OworbXlzcWwmZ3Q7IHVzZSBqYXZhdGVzdDsKK215c3FsJmd0OyBjcmVhdGUgdGFibGUgdGVzdGRhdGEgKAorICAgIC0mZ3Q7ICAgaWQgaW50IG5vdCBudWxsIGF1dG9faW5jcmVtZW50IHByaW1hcnkga2V5LAorICAgIC0mZ3Q7ICAgZm9vIHZhcmNoYXIoMjUpLCAKKyAgICAtJmd0OyAgIGJhciBpbnQpOworPC9zb3VyY2U+Cis8YmxvY2txdW90ZT4KKzxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gdGhlIGFib3ZlIHVzZXIgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSB0ZXN0aW5nIGlzCitjb21wbGV0ZSEKKzwvYmxvY2txdW90ZT4KKzwvcD4KKworPHA+TmV4dCBpbnNlcnQgc29tZSB0ZXN0IGRhdGEgaW50byB0aGUgdGVzdGRhdGEgdGFibGUuCis8c291cmNlPgorbXlzcWwmZ3Q7IGluc2VydCBpbnRvIHRlc3RkYXRhIHZhbHVlcyhudWxsLCAnaGVsbG8nLCAxMjM0NSk7CitRdWVyeSBPSywgMSByb3cgYWZmZWN0ZWQgKDAuMDAgc2VjKQorCitteXNxbD4gc2VsZWN0ICogZnJvbSB0ZXN0ZGF0YTsKKystLS0tKy0tLS0tLS0rLS0tLS0tLSsKK3wgSUQgfCBGT08gICB8IEJBUiAgIHwKKystLS0tKy0tLS0tLS0rLS0tLS0tLSsKK3wgIDEgfCBoZWxsbyB8IDEyMzQ1IHwKKystLS0tKy0tLS0tLS0rLS0tLS0tLSsKKzEgcm93IGluIHNldCAoMC4wMCBzZWMpCisKK215c3FsJmd0OworPC9zb3VyY2U+Cis8L3A+CisKKzxoMz4yLiBzZXJ2ZXIueG1sIGNvbmZpZ3VyYXRpb248L2gzPgorPHA+Q29uZmlndXJlIHRoZSBKTkRJIERhdGFTb3VyY2UgaW4gVG9tY2F0IGJ5IGFkZGluZyBhIGRlY2xhcmF0aW9uIGZvciB5b3VyCityZXNvdXJjZSB0byA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3NlcnZlci54bWw8L2NvZGU+LjwvcD4KKzxwPkFkZCB0aGlzIGluIGJldHdlZW4gdGhlIDxjb2RlPiZsdDsvQ29udGV4dCZndDs8L2NvZGU+IHRhZyBvZiB0aGUgZXhhbXBsZXMKK2NvbnRleHQgYW5kIHRoZSA8Y29kZT4mbHQ7L0hvc3QmZ3Q7PC9jb2RlPiB0YWcgY2xvc2luZyB0aGUgbG9jYWxob3N0IGRlZmluaXRpb24uCitJZiB0aGVyZSBpcyBubyBzdWNoIHRhZywgeW91IGNhbiBhZGQgb25lIGFzIGlsbHVzdHJhdGVkIGluIHRoZSAKKzxhIGhyZWY9ImNvbmZpZy9jb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+IGFuZAorPGEgaHJlZj0iY29uZmlnL2hvc3QuaHRtbCI+SG9zdDwvYT4gY29uZmlndXJhdGlvbiByZWZlcmVuY2VzLCBhbmQgcmVwZWF0ZWQgYmVsb3cKK2ZvciB5b3VyIGNvbnZlbmllbmNlLgorCis8c291cmNlPgorJmx0O0NvbnRleHQgcGF0aD0iL0RCVGVzdCIgZG9jQmFzZT0iREJUZXN0IgorICAgICAgICBkZWJ1Zz0iNSIgcmVsb2FkYWJsZT0idHJ1ZSIgY3Jvc3NDb250ZXh0PSJ0cnVlIiZndDsKKworICAgICZsdDshLS0gbWF4QWN0aXZlOiBNYXhpbXVtIG51bWJlciBvZiBkQiBjb25uZWN0aW9ucyBpbiBwb29sLiBNYWtlIHN1cmUgeW91CisgICAgICAgICBjb25maWd1cmUgeW91ciBteXNxbGQgbWF4X2Nvbm5lY3Rpb25zIGxhcmdlIGVub3VnaCB0byBoYW5kbGUKKyAgICAgICAgIGFsbCBvZiB5b3VyIGRiIGNvbm5lY3Rpb25zLiBTZXQgdG8gMCBmb3Igbm8gbGltaXQuCisgICAgICAgICAtLSZndDsKKworICAgICZsdDshLS0gbWF4SWRsZTogTWF4aW11bSBudW1iZXIgb2YgaWRsZSBkQiBjb25uZWN0aW9ucyB0byByZXRhaW4gaW4gcG9vbC4KKyAgICAgICAgIFNldCB0byAtMSBmb3Igbm8gbGltaXQuICBTZWUgYWxzbyB0aGUgREJDUCBkb2N1bWVudGF0aW9uIG9uIHRoaXMKKyAgICAgICAgIGFuZCB0aGUgbWluRXZpY3RhYmxlSWRsZVRpbWVNaWxsaXMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuCisgICAgICAgICAtLSZndDsKKworICAgICZsdDshLS0gbWF4V2FpdDogTWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGEgZEIgY29ubmVjdGlvbiB0byBiZWNvbWUgYXZhaWxhYmxlCisgICAgICAgICBpbiBtcywgaW4gdGhpcyBleGFtcGxlIDEwIHNlY29uZHMuIEFuIEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYKKyAgICAgICAgIHRoaXMgdGltZW91dCBpcyBleGNlZWRlZC4gIFNldCB0byAtMSB0byB3YWl0IGluZGVmaW5pdGVseS4KKyAgICAgICAgIC0tJmd0OworCisgICAgJmx0OyEtLSB1c2VybmFtZSBhbmQgcGFzc3dvcmQ6IE15U1FMIGRCIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmb3IgZEIgY29ubmVjdGlvbnMgIC0tJmd0OworCisgICAgJmx0OyEtLSBkcml2ZXJDbGFzc05hbWU6IENsYXNzIG5hbWUgZm9yIHRoZSBvbGQgbW0ubXlzcWwgSkRCQyBkcml2ZXIgaXMKKyAgICAgICAgIG9yZy5nanQubW0ubXlzcWwuRHJpdmVyIC0gd2UgcmVjb21tZW5kIHVzaW5nIENvbm5lY3Rvci9KIHRob3VnaC4KKyAgICAgICAgIENsYXNzIG5hbWUgZm9yIHRoZSBvZmZpY2lhbCBNeVNRTCBDb25uZWN0b3IvSiBkcml2ZXIgaXMgY29tLm15c3FsLmpkYmMuRHJpdmVyLgorICAgICAgICAgLS0mZ3Q7CisgICAgCisgICAgJmx0OyEtLSB1cmw6IFRoZSBKREJDIGNvbm5lY3Rpb24gdXJsIGZvciBjb25uZWN0aW5nIHRvIHlvdXIgTXlTUUwgZEIuCisgICAgICAgICBUaGUgYXV0b1JlY29ubmVjdD10cnVlIGFyZ3VtZW50IHRvIHRoZSB1cmwgbWFrZXMgc3VyZSB0aGF0IHRoZQorICAgICAgICAgbW0ubXlzcWwgSkRCQyBEcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IHJlY29ubmVjdCBpZiBteXNxbGQgY2xvc2VkIHRoZQorICAgICAgICAgY29ubmVjdGlvbi4gIG15c3FsZCBieSBkZWZhdWx0IGNsb3NlcyBpZGxlIGNvbm5lY3Rpb25zIGFmdGVyIDggaG91cnMuCisgICAgICAgICAtLSZndDsKKworICAmbHQ7UmVzb3VyY2UgbmFtZT0iamRiYy9UZXN0REIiIGF1dGg9IkNvbnRhaW5lciIgdHlwZT0iamF2YXguc3FsLkRhdGFTb3VyY2UiCisgICAgICAgICAgICAgICBtYXhBY3RpdmU9IjEwMCIgbWF4SWRsZT0iMzAiIG1heFdhaXQ9IjEwMDAwIgorICAgICAgICAgICAgICAgdXNlcm5hbWU9ImphdmF1c2VyIiBwYXNzd29yZD0iamF2YWR1ZGUiIGRyaXZlckNsYXNzTmFtZT0iY29tLm15c3FsLmpkYmMuRHJpdmVyIgorICAgICAgICAgICAgICAgdXJsPSJqZGJjOm15c3FsOi8vbG9jYWxob3N0OjMzMDYvamF2YXRlc3Q/YXV0b1JlY29ubmVjdD10cnVlIi8mZ3Q7CisKKyZsdDsvQ29udGV4dCZndDsKKzwvc291cmNlPgorPC9wPgorCis8aDM+My4gd2ViLnhtbCBjb25maWd1cmF0aW9uPC9oMz4KKworPHA+Tm93IGNyZWF0ZSBhIDxjb2RlPldFQi1JTkYvd2ViLnhtbDwvY29kZT4gZm9yIHRoaXMgdGVzdCBhcHBsaWNhdGlvbi4KKzxzb3VyY2U+CismbHQ7d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKKyAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQoraHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCisgICAgdmVyc2lvbj0iMi40IiZndDsKKyAgJmx0O2Rlc2NyaXB0aW9uJmd0O015U1FMIFRlc3QgQXBwJmx0Oy9kZXNjcmlwdGlvbiZndDsKKyAgJmx0O3Jlc291cmNlLXJlZiZndDsKKyAgICAgICZsdDtkZXNjcmlwdGlvbiZndDtEQiBDb25uZWN0aW9uJmx0Oy9kZXNjcmlwdGlvbiZndDsKKyAgICAgICZsdDtyZXMtcmVmLW5hbWUmZ3Q7amRiYy9UZXN0REImbHQ7L3Jlcy1yZWYtbmFtZSZndDsKKyAgICAgICZsdDtyZXMtdHlwZSZndDtqYXZheC5zcWwuRGF0YVNvdXJjZSZsdDsvcmVzLXR5cGUmZ3Q7CisgICAgICAmbHQ7cmVzLWF1dGgmZ3Q7Q29udGFpbmVyJmx0Oy9yZXMtYXV0aCZndDsKKyAgJmx0Oy9yZXNvdXJjZS1yZWYmZ3Q7CismbHQ7L3dlYi1hcHAmZ3Q7Cis8L3NvdXJjZT4KKzwvcD4KKworPGgzPjQuIFRlc3QgY29kZTwvaDM+Cis8cD5Ob3cgY3JlYXRlIGEgc2ltcGxlIDxjb2RlPnRlc3QuanNwPC9jb2RlPiBwYWdlIGZvciB1c2UgbGF0ZXIuCis8c291cmNlPgorJmx0OyVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvc3FsIiBwcmVmaXg9InNxbCIgJSZndDsKKyZsdDslQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiIHByZWZpeD0iYyIgJSZndDsKKworJmx0O3NxbDpxdWVyeSB2YXI9InJzIiBkYXRhU291cmNlPSJqZGJjL1Rlc3REQiImZ3Q7CitzZWxlY3QgaWQsIGZvbywgYmFyIGZyb20gdGVzdGRhdGEKKyZsdDsvc3FsOnF1ZXJ5Jmd0OworCismbHQ7aHRtbCZndDsKKyAgJmx0O2hlYWQmZ3Q7CisgICAgJmx0O3RpdGxlJmd0O0RCIFRlc3QmbHQ7L3RpdGxlJmd0OworICAmbHQ7L2hlYWQmZ3Q7CisgICZsdDtib2R5Jmd0OworCisgICZsdDtoMiZndDtSZXN1bHRzJmx0Oy9oMiZndDsKKyAgCismbHQ7Yzpmb3JFYWNoIHZhcj0icm93IiBpdGVtcz0iJHtycy5yb3dzfSImZ3Q7CisgICAgRm9vICR7cm93LmZvb30mbHQ7YnIvJmd0OworICAgIEJhciAke3Jvdy5iYXJ9Jmx0O2JyLyZndDsKKyZsdDsvYzpmb3JFYWNoJmd0OworCisgICZsdDsvYm9keSZndDsKKyZsdDsvaHRtbCZndDsKKzwvc291cmNlPgorPC9wPgorCis8cD5UaGF0IEpTUCBwYWdlIG1ha2VzIHVzZSBvZiA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pzcC9qc3RsIj5KU1RMPC9hPidzIFNRTCBhbmQgQ29yZSB0YWdsaWJzLiBZb3UgY2FuIGdldCBpdCBmcm9tIFN1bidzIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vd2Vic2VydmljZXMvZG93bmxvYWRzL3dlYnNlcnZpY2VzcGFjay5odG1sIj5KYXZhIFdlYiBTZXJ2aWNlcyBEZXZlbG9wZXIgUGFjazwvYT4gb3IgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90YWdsaWJzL2RvYy9zdGFuZGFyZC1kb2MvaW50cm8uaHRtbCI+SmFrYXJ0YSBUYWdsaWIgU3RhbmRhcmQgMS4xPC9hPiBwcm9qZWN0IC0ganVzdCBtYWtlIHN1cmUgeW91IGdldCBhIDEuMS54IHJlbGVhc2UuIE9uY2UgeW91IGhhdmUgSlNUTCwgY29weSA8Y29kZT5qc3RsLmphcjwvY29kZT4gYW5kIDxjb2RlPnN0YW5kYXJkLmphcjwvY29kZT4gdG8geW91ciB3ZWIgYXBwJ3MgPGNvZGU+V0VCLUlORi9saWI8L2NvZGU+IGRpcmVjdG9yeS4KKworPC9wPgorCis8cD5GaW5hbGx5IGRlcGxveSB5b3VyIHdlYiBhcHAgaW50byA8Y29kZT4kQ0FUQUxJTkFfSE9NRS93ZWJhcHBzPC9jb2RlPiBlaXRoZXIKK2FzIGEgd2FyZmlsZSBjYWxsZWQgPGNvZGU+REJUZXN0LndhcjwvY29kZT4gb3IgaW50byBhIHN1Yi1kaXJlY3RvcnkgY2FsbGVkCis8Y29kZT5EQlRlc3Q8L2NvZGU+PC9wPgorPHA+T25jZSBkZXBsb3llZCwgcG9pbnQgYSBicm93c2VyIGF0Cis8Y29kZT5odHRwOi8vbG9jYWxob3N0OjgwODAvREJUZXN0L3Rlc3QuanNwPC9jb2RlPiB0byB2aWV3IHRoZSBmcnVpdHMgb2YKK3lvdXIgaGFyZCB3b3JrLjwvcD4KKworPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJPcmFjbGUgOGksIDlpICZhbXA7IDEwZyI+Cis8aDM+MC4gICAgSW50cm9kdWN0aW9uPC9oMz4KKworPHA+T3JhY2xlIHJlcXVpcmVzIG1pbmltYWwgY2hhbmdlcyBmcm9tIHRoZSBNeVNRTCBjb25maWd1cmF0aW9uIGV4Y2VwdCBmb3IgdGhlCit1c3VhbCBnb3RjaGFzIDotKTwvcD4KKzxwPkRyaXZlcnMgZm9yIG9sZGVyIE9yYWNsZSB2ZXJzaW9ucyBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgKi56aXAgZmlsZXMgcmF0aGVyCit0aGFuICouamFyIGZpbGVzLiBUb21jYXQgd2lsbCBvbmx5IHVzZSA8Y29kZT4qLmphcjwvY29kZT4gZmlsZXMgaW5zdGFsbGVkIGluCis8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb21tb24vbGliPC9jb2RlPi4gVGhlcmVmb3JlIDxjb2RlPmNsYXNzZXMxMTEuemlwPC9jb2RlPgorb3IgPGNvZGU+Y2xhc3NlczEyLnppcDwvY29kZT4gd2lsbCBuZWVkIHRvIGJlIHJlbmFtZWQgd2l0aCBhIDxjb2RlPi5qYXI8L2NvZGU+CitleHRlbnNpb24uIFNpbmNlIGphcmZpbGVzIGFyZSB6aXBmaWxlcywgdGhlcmUgaXMgbm8gbmVlZCB0byB1bnppcCBhbmQgamFyIHRoZXNlCitmaWxlcyAtIGEgc2ltcGxlIHJlbmFtZSB3aWxsIHN1ZmZpY2UuPC9wPgorCis8cD5Tb21lIGVhcmx5IHZlcnNpb25zIG9mIFRvbWNhdCA0LjAgd2hlbiB1c2VkIHdpdGggSkRLIDEuNCB3aWxsIG5vdCBsb2FkCitjbGFzc2VzMTIuemlwIHVubGVzcyB5b3UgdW56aXAgdGhlIGZpbGUsIHJlbW92ZSB0aGUgPGNvZGU+amF2YXguc3FsLio8L2NvZGU+CitjbGFzcyBoZWlyYXJjaHkgYW5kIHJlamFyLjwvcD4KKworPHA+Rm9yIE9yYWNsZSA5aSBvbndhcmRzIHlvdSBzaG91bGQgdXNlIDxjb2RlPm9yYWNsZS5qZGJjLk9yYWNsZURyaXZlcjwvY29kZT4KK3JhdGhlciB0aGFuIDxjb2RlPm9yYWNsZS5qZGJjLmRyaXZlci5PcmFjbGVEcml2ZXI8L2NvZGU+IGFzIE9yYWNsZSBoYXZlIHN0YXRlZAordGhhdCA8Y29kZT5vcmFjbGUuamRiYy5kcml2ZXIuT3JhY2xlRHJpdmVyPC9jb2RlPiBpcyBkZXByZWNhdGVkIGFuZCBzdXBwb3J0Citmb3IgdGhpcyBkcml2ZXIgY2xhc3Mgd2lsbCBiZSBkaXNjb250aW51ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4KKzwvcD4KKworPGgzPjEuICAgIHNlcnZlci54bWwgY29uZmlndXJhdGlvbjwvaDM+Cis8cD5JbiBhIHNpbWlsYXIgbWFubmVyIHRvIHRoZSBteXNxbCBjb25maWcgYWJvdmUsIHlvdSB3aWxsIG5lZWQgdG8gZGVmaW5lIHlvdXIKK0RhdGFzb3VyY2UgaW4geW91ciBzZXJ2ZXIueG1sIGZpbGUuIEhlcmUgd2UgZGVmaW5lIGEgRGF0YXNvdXJjZSBjYWxsZWQgbXlvcmFjbGUKK3VzaW5nIHRoZSB0aGluIGRyaXZlciB0byBjb25uZWN0IGFzIHVzZXIgc2NvdHQsIHBhc3N3b3JkIHRpZ2VyIHRvIHRoZSBzaWQKK2NhbGxlZCBteXNpZC4gKE5vdGU6IHdpdGggdGhlIHRoaW4gZHJpdmVyIHRoaXMgc2lkIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUKK3Ruc25hbWUpLiBUaGUgc2NoZW1hIHVzZWQgd2lsbCBiZSB0aGUgZGVmYXVsdCBzY2hlbWEgZm9yIHRoZSB1c2VyIHNjb3R0LjwvcD4KKworPHA+VXNlIG9mIHRoZSBPQ0kgZHJpdmVyIHNob3VsZCBzaW1wbHkgaW52b2x2ZSBhIGNoYW5naW5nIHRoaW4gdG8gb2NpIGluIHRoZSBVUkwgc3RyaW5nLgorPHNvdXJjZT4KKyZsdDtSZXNvdXJjZSBuYW1lPSJqZGJjL215b3JhY2xlIiBhdXRoPSJDb250YWluZXIiCisgICAgICAgICAgICAgIHR5cGU9ImphdmF4LnNxbC5EYXRhU291cmNlIiBkcml2ZXJDbGFzc05hbWU9Im9yYWNsZS5qZGJjLk9yYWNsZURyaXZlciIKKyAgICAgICAgICAgICAgdXJsPSJqZGJjOm9yYWNsZTp0aGluOkAxMjcuMC4wLjE6MTUyMTpteXNpZCIKKyAgICAgICAgICAgICAgdXNlcm5hbWU9InNjb3R0IiBwYXNzd29yZD0idGlnZXIiIG1heEFjdGl2ZT0iMjAiIG1heElkbGU9IjEwIgorICAgICAgICAgICAgICBtYXhXYWl0PSItMSIvJmd0OyAKKzwvc291cmNlPgorPC9wPgorCis8aDM+Mi4gICAgd2ViLnhtbCBjb25maWd1cmF0aW9uPC9oMz4KKzxwPllvdSBzaG91bGQgZW5zdXJlIHRoYXQgeW91IHJlc3BlY3QgdGhlIGVsZW1lZW50IG9yZGVyaW5nIGRlZmluZWQgYnkgdGhlIERURCB3aGVuIHlvdQorY3JlYXRlIHlvdSBhcHBsaWNhdGlvbnMgd2ViLnhtbCBmaWxlLjwvcD4KKzxzb3VyY2U+CismbHQ7cmVzb3VyY2UtcmVmJmd0OworICZsdDtkZXNjcmlwdGlvbiZndDtPcmFjbGUgRGF0YXNvdXJjZSBleGFtcGxlJmx0Oy9kZXNjcmlwdGlvbiZndDsKKyAmbHQ7cmVzLXJlZi1uYW1lJmd0O2pkYmMvbXlvcmFjbGUmbHQ7L3Jlcy1yZWYtbmFtZSZndDsKKyAmbHQ7cmVzLXR5cGUmZ3Q7amF2YXguc3FsLkRhdGFTb3VyY2UmbHQ7L3Jlcy10eXBlJmd0OworICZsdDtyZXMtYXV0aCZndDtDb250YWluZXImbHQ7L3Jlcy1hdXRoJmd0OworJmx0Oy9yZXNvdXJjZS1yZWYmZ3Q7Cis8L3NvdXJjZT4KKzxoMz4zLiAgIENvZGUgZXhhbXBsZTwvaDM+Cis8cD5Zb3UgY2FuIHVzZSB0aGUgc2FtZSBleGFtcGxlIGFwcGxpY2F0aW9uIGFzIGFib3ZlIChhc3VtaW5nIHlvdSBjcmVhdGUgdGhlIHJlcXVpcmVkIERCCitpbnN0YW5jZSwgdGFibGVzIGV0Yy4pIHJlcGxhY2luZyB0aGUgRGF0YXNvdXJjZSBjb2RlIHdpdGggc29tZXRoaW5nIGxpa2U8L3A+Cis8c291cmNlPgorQ29udGV4dCBpbml0Q29udGV4dCA9IG5ldyBJbml0aWFsQ29udGV4dCgpOworQ29udGV4dCBlbnZDb250ZXh0ICA9IChDb250ZXh0KWluaXRDb250ZXh0Lmxvb2t1cCgiamF2YTovY29tcC9lbnYiKTsKK0RhdGFTb3VyY2UgZHMgPSAoRGF0YVNvdXJjZSllbnZDb250ZXh0Lmxvb2t1cCgiamRiYy9teW9yYWNsZSIpOworQ29ubmVjdGlvbiBjb25uID0gZHMuZ2V0Q29ubmVjdGlvbigpOworLy9ldGMuCis8L3NvdXJjZT4KKzwvc3Vic2VjdGlvbj4KKworCis8c3Vic2VjdGlvbiBuYW1lPSJQb3N0Z3JlU1FMIj4KKzxoMz4wLiAgICBJbnRyb2R1Y3Rpb248L2gzPgorPHA+UG9zdGdyZVNRTCBpcyBjb25maWd1cmVkIGluIGEgc2ltaWxhciBtYW5uZXIgdG8gT3JhY2xlLjwvcD4KKworPGgzPjEuIFJlcXVpcmVkIGZpbGVzIDwvaDM+Cis8cD4KK0NvcHkgdGhlIFBvc3RncmVzIEpEQkMgamFyIHRvICRDQVRBTElOQV9IT01FL2NvbW1vbi9saWIuIEFzIHdpdGggT3JhY2xlLCB0aGUKK2phcnMgbmVlZCB0byBiZSBpbiB0aGlzIGRpcmVjdG9yeSBpbiBvcmRlciBmb3IgREJDUCdzIENsYXNzbG9hZGVyIHRvIGZpbmQKK3RoZW0uIFRoaXMgaGFzIHRvIGJlIGRvbmUgcmVnYXJkbGVzcyBvZiB3aGljaCBjb25maWd1cmF0aW9uIHN0ZXAgeW91IHRha2UgbmV4dC4KKzwvcD4KKworPGgzPjIuIFJlc291cmNlIGNvbmZpZ3VyYXRpb248L2gzPgorCis8cD4KK1lvdSBoYXZlIHR3byBjaG9pY2VzIGhlcmU6IGRlZmluZSBhIGRhdGFzb3VyY2UgdGhhdCBpcyBzaGFyZWQgYWNyb3NzIGFsbCBUb21jYXQKK2FwcGxpY2F0aW9ucywgb3IgZGVmaW5lIGEgZGF0YXNvdXJjZSBzcGVjaWZpY2FsbHkgZm9yIG9uZSBhcHBsaWNhdGlvbi4KKzwvcD4KKworPGg0PjJhLiBTaGFyZWQgcmVzb3VyY2UgY29uZmlndXJhdGlvbjwvaDQ+Cis8cD4KK1VzZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2lzaCB0byBkZWZpbmUgYSBkYXRhc291cmNlIHRoYXQgaXMgc2hhcmVkIGFjcm9zcworbXVsdGlwbGUgVG9tY2F0IGFwcGxpY2F0aW9ucywgb3IgaWYgeW91IGp1c3QgcHJlZmVyIGRlZmluaW5nIHlvdXIgZGF0YXNvdXJjZQoraW4gdGhpcyBmaWxlLgorPC9wPgorPHA+PGk+VGhpcyBhdXRob3IgaGFzIG5vdCBoYWQgc3VjY2VzcyBoZXJlLCBhbHRob3VnaCBvdGhlcnMgaGF2ZSByZXBvcnRlZCBzby4KK0NsYXJpZmljYXRpb24gd291bGQgYmUgYXBwcmVjaWF0ZWQgaGVyZS48L2k+PC9wPgorCis8c291cmNlPgorJmx0O1Jlc291cmNlIG5hbWU9ImpkYmMvcG9zdGdyZXMiIGF1dGg9IkNvbnRhaW5lciIKKyAgICAgICAgICB0eXBlPSJqYXZheC5zcWwuRGF0YVNvdXJjZSIgZHJpdmVyQ2xhc3NOYW1lPSJvcmcucG9zdGdyZXNxbC5Ecml2ZXIiCisgICAgICAgICAgdXJsPSJqZGJjOnBvc3RncmVzcWw6Ly8xMjcuMC4wLjE6NTQzMi9teWRiIgorICAgICAgICAgIHVzZXJuYW1lPSJteXVzZXIiIHBhc3N3b3JkPSJteXBhc3N3ZCIgbWF4QWN0aXZlPSIyMCIgbWF4SWRsZT0iMTAiIG1heFdhaXQ9Ii0xIi8mZ3Q7Cis8L3NvdXJjZT4KKzxoND4yYi4gQXBwbGljYXRpb24tc3BlY2lmaWMgcmVzb3VyY2UgY29uZmlndXJhdGlvbjwvaDQ+CisKKzxwPgorVXNlIHRoaXMgb3B0aW9uIGlmIHlvdSB3aXNoIHRvIGRlZmluZSBhIGRhdGFzb3VyY2Ugc3BlY2lmaWMgdG8geW91ciBhcHBsaWNhdGlvbiwKK25vdCB2aXNpYmxlIHRvIG90aGVyIFRvbWNhdCBhcHBsaWNhdGlvbnMuIFRoaXMgbWV0aG9kIGlzIGxlc3MgaW52YXNpdmUgdG8geW91cgorVG9tY2F0IGluc3RhbGxhdGlvbi4KKzwvcD4KKworPHA+CitDcmVhdGUgYSByZXNvdXJjZSBkZWZpbml0aW9uIGZpbGUgZm9yIHlvdXIgYXBwbGljYXRpb24gZGVmaW5pbmcgdGhlCitkYXRhc291cmNlLiBUaGlzIGZpbGUgbXVzdCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgeW91ciBhcHBsaWNhdGlvbiwgc28gaWYKK3lvdXIgYXBwbGljYXRpb24gZGVwbG95cyBhcyA8Y29kZT5zb21lQXBwLndhcjwvY29kZT4sIHRoaXMgZmlsZW5hbWUgbXVzdAorYmUgPGNvZGU+c29tZUFwcC54bWw8L2NvZGU+LiBUaGlzIGZpbGUgc2hvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZy4KKzwvcD4KKworPHNvdXJjZT4KKyZsdDtDb250ZXh0IHBhdGg9Ii9zb21lQXBwIiBkb2NCYXNlPSJzb21lQXBwIgorICAgY3Jvc3NDb250ZXh0PSJ0cnVlIiByZWxvYWRhYmxlPSJ0cnVlIiBkZWJ1Zz0iMSImZ3Q7CisKKyZsdDtSZXNvdXJjZSBuYW1lPSJqZGJjL3Bvc3RncmVzIiBhdXRoPSJDb250YWluZXIiCisgICAgICAgICAgdHlwZT0iamF2YXguc3FsLkRhdGFTb3VyY2UiIGRyaXZlckNsYXNzTmFtZT0ib3JnLnBvc3RncmVzcWwuRHJpdmVyIgorICAgICAgICAgIHVybD0iamRiYzpwb3N0Z3Jlc3FsOi8vMTI3LjAuMC4xOjU0MzIvbXlkYiIKKyAgICAgICAgICB1c2VybmFtZT0ibXl1c2VyIiBwYXNzd29yZD0ibXlwYXNzd2QiIG1heEFjdGl2ZT0iMjAiIG1heElkbGU9IjEwIgorbWF4V2FpdD0iLTEiLyZndDsKKyZsdDsvQ29udGV4dCZndDsKKzwvc291cmNlPgorCis8aDM+My4gd2ViLnhtbCBjb25maWd1cmF0aW9uPC9oMz4KKzxzb3VyY2U+CismbHQ7cmVzb3VyY2UtcmVmJmd0OworICZsdDtkZXNjcmlwdGlvbiZndDtwb3N0Z3JlU1FMIERhdGFzb3VyY2UgZXhhbXBsZSZsdDsvZGVzY3JpcHRpb24mZ3Q7CisgJmx0O3Jlcy1yZWYtbmFtZSZndDtqZGJjL3Bvc3RncmVzJmx0Oy9yZXMtcmVmLW5hbWUmZ3Q7CisgJmx0O3Jlcy10eXBlJmd0O2phdmF4LnNxbC5EYXRhU291cmNlJmx0Oy9yZXMtdHlwZSZndDsKKyAmbHQ7cmVzLWF1dGgmZ3Q7Q29udGFpbmVyJmx0Oy9yZXMtYXV0aCZndDsKKyZsdDsvcmVzb3VyY2UtcmVmJmd0OworPC9zb3VyY2U+CisKKzxoND40LiBBY2Nlc3NpbmcgdGhlIGRhdGFzb3VyY2U8L2g0PgorPHA+CitXaGVuIGFjY2Vzc2luZyB0aGUgZGF0YXNvdXJjZSBwcm9ncmFtbWF0aWNhbGx5LCByZW1lbWJlciB0byBwcmVwZW5kCis8Y29kZT5qYXZhOi9jb21wL2VudjwvY29kZT4gdG8geW91ciBKTkRJIGxvb2t1cCwgYXMgaW4gdGhlIGZvbGxvd2luZyBzbmlwcGV0IG9mCitjb2RlLiBOb3RlIGFsc28gdGhhdCAiamRiYy9wb3N0Z3JlcyIgY2FuIGJlIHJlcGxhY2VkIHdpdGggYW55IHZhbHVlIHlvdSBwcmVmZXIsIHByb3ZpZGVkCit5b3UgY2hhbmdlIGl0IGluIHRoZSBhYm92ZSByZXNvdXJjZSBkZWZpbml0aW9uIGZpbGUgYXMgd2VsbC4KKzwvcD4KKworPHNvdXJjZT4KK0luaXRpYWxDb250ZXh0IGN4dCA9IG5ldyBJbml0aWFsQ29udGV4dCgpOworaWYgKCBjeHQgPT0gbnVsbCApIHsKKyAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVoIG9oIC0tIG5vIGNvbnRleHQhIik7Cit9CisKK0RhdGFTb3VyY2UgZHMgPSAoRGF0YVNvdXJjZSkgY3h0Lmxvb2t1cCggImphdmE6L2NvbXAvZW52L2pkYmMvcG9zdGdyZXMiICk7CisKK2lmICggZHMgPT0gbnVsbCApIHsKKyAgIHRocm93IG5ldyBFeGNlcHRpb24oIkRhdGEgc291cmNlIG5vdCBmb3VuZCEiKTsKK30KKzwvc291cmNlPgorCis8L3N1YnNlY3Rpb24+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9Ik5vbi1EQkNQIFNvbHV0aW9ucyI+Cis8cD4KK1RoZXNlIHNvbHV0aW9ucyBlaXRoZXIgdXRpbGlzZSBhIHNpbmdsZSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSAobm90IHJlY29tbWVuZGVkIGZvciBhbnl0aGluZyBvdGhlcgordGhhbiB0ZXN0aW5nISkgb3Igc29tZSBvdGhlciBwb29saW5nIHRlY2hub2xvZ3kuCis8L3A+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9Ik9yYWNsZSA4aSB3aXRoIE9DSSBjbGllbnQiPgorPHN1YnNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKzxwPldoaWxzdCBub3Qgc3RyaWN0bHkgYWRkcmVzc2luZyB0aGUgY3JlYXRpb24gb2YgYSBKTkRJIERhdGFTb3VyY2UgdXNpbmcgdGhlIE9DSSBjbGllbnQsIHRoZXNlIG5vdGVzIGNhbiBiZSBjb21iaW5lZCB3aXRoIHRoZQorT3JhY2xlIGFuZCBEQkNQIHNvbHV0aW9uIGFib3ZlLjwvcD4KKzxwPgorSW4gb3JkZXIgdG8gdXNlIE9DSSBkcml2ZXIsIHlvdSBzaG91bGQgaGF2ZSBhbiBPcmFjbGUgY2xpZW50IGluc3RhbGxlZC4gWW91IHNob3VsZCBoYXZlIGluc3RhbGxlZAorT3JhY2xlOGkoOC4xLjcpIGNsaWVudCBmcm9tIGNkLCAgYW5kIGRvd25sb2FkIHRoZSBzdWl0YWJsZSBKREJDL09DSQorZHJpdmVyKE9yYWNsZThpIDguMS43LjEgSkRCQy9PQ0kgRHJpdmVyKSBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9vdG4ub3JhY2xlLmNvbS8iPm90bi5vcmFjbGUuY29tPC9hPi4gCis8L3A+Cis8cD4KK0FmdGVyIHJlbmFtaW5nIDxjb2RlPmNsYXNzZXMxMi56aXA8L2NvZGU+IGZpbGUgdG8gPGNvZGU+Y2xhc3NlczEyLmphcjwvY29kZT4KK2ZvciBUb21jYXQsIGNvcHkgaXQgaW50byA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb21tb24vbGliPC9jb2RlPi4gCitZb3UgbWF5IGFsc28gaGF2ZSB0byByZW1vdmUgdGhlIDxjb2RlPmphdmF4LnNxbC4qPC9jb2RlPiBjbGFzc2VzCitmcm9tIHRoaXMgZmlsZSBkZXBlbmRpbmcgdXBvbiB0aGUgdmVyc2lvbiBvZiBUb21jYXQgYW5kIEpESyB5b3UgYXJlIHVzaW5nLgorPC9wPgorPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJQdXR0aW5nIGl0IGFsbCB0b2dldGhlciI+Cis8cD4KK0Vuc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSA8Y29kZT5vY2lqZGJjOC5kbGw8L2NvZGU+IG9yIDxjb2RlPi5zbzwvY29kZT4gaW4geW91ciA8Y29kZT4kUEFUSDwvY29kZT4gb3IgPGNvZGU+TERfTElCUkFSWV9QQVRIPC9jb2RlPgorIChwb3NzaWJseSBpbiA8Y29kZT4kT1JBSE9NRVxiaW48L2NvZGU+KSBhbmQgYWxzbyBjb25maXJtIHRoYXQgdGhlIG5hdGl2ZSBsaWJyYXJ5IGNhbiBiZSBsb2FkZWQgYnkgYSBzaW1wbGUgdGVzdCBwcm9ncmFtIAordXNpbmcgPGNvZGU+U3lzdGVtLmxvYWRMaWJyYXJ5KCJvY2lqZGJjOCIpOzwvY29kZT4KKzwvcD4KKzxwPgorWW91IHNob3VsZCBuZXh0IGNyZWF0ZSBhIHNpbXBsZSB0ZXN0IHNlcnZsZXQgb3IganNwIHRoYXQgaGFzIHRoZXNlCis8c3Ryb25nPmNyaXRpY2FsIGxpbmVzPC9zdHJvbmc+OgorPC9wPgorPHNvdXJjZT4KK0RyaXZlck1hbmFnZXIucmVnaXN0ZXJEcml2ZXIobmV3CitvcmFjbGUuamRiYy5kcml2ZXIuT3JhY2xlRHJpdmVyKCkpOworY29ubiA9CitEcml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24oImpkYmM6b3JhY2xlOm9jaTg6QGRhdGFiYXNlIiwidXNlcm5hbWUiLCJwYXNzd29yZCIpOworPC9zb3VyY2U+Cis8cD4KK3doZXJlIGRhdGFiYXNlIGlzIG9mIHRoZSBmb3JtIDxjb2RlPmhvc3Q6cG9ydDpTSUQ8L2NvZGU+IE5vdyBpZiB5b3UgdHJ5IHRvIGFjY2VzcyB0aGUgVVJMIG9mIHlvdXIgCit0ZXN0IHNlcnZsZXQvanNwIGFuZCB3aGF0IHlvdSBnZXQgaXMgYSAKKzxjb2RlPlNlcnZsZXRFeGNlcHRpb248L2NvZGU+IHdpdGggYSByb290IGNhdXNlIG9mIDxjb2RlPmphdmEubGFuZy5VbnNhdGlzZmllZExpbmtFcnJvcjpnZXRfZW52X2hhbmRsZTwvY29kZT4uCis8L3A+Cis8cD4KK0ZpcnN0LCB0aGUgPGNvZGU+VW5zYXRpc2ZpZWRMaW5rRXJyb3I8L2NvZGU+IGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIAorPHVsPgorPGxpPmEgbWlzbWF0Y2ggYmV0d2VlbiB5b3VyIEpEQkMgY2xhc3NlcyBmaWxlIGFuZAoreW91ciBPcmFjbGUgY2xpZW50IHZlcnNpb24uIFRoZSBnaXZlYXdheSBoZXJlIGlzIHRoZSBtZXNzYWdlIHN0YXRpbmcgdGhhdCBhIG5lZWRlZCBsaWJyYXJ5IGZpbGUgY2Fubm90IGJlCitmb3VuZC4gRm9yIGV4YW1wbGUsIHlvdSBtYXkgYmUgdXNpbmcgYSBjbGFzc2VzMTIuemlwIGZpbGUgZnJvbSBPcmFjbGUgVmVyc2lvbiA4LjEuNiB3aXRoIGEgVmVyc2lvbiA4LjEuNQorT3JhY2xlIGNsaWVudC4gVGhlIGNsYXNzZVhYWHMuemlwIGZpbGUgYW5kIE9yYWNsZSBjbGllbnQgc29mdHdhcmUgdmVyc2lvbnMgbXVzdCBtYXRjaC4KKzwvbGk+Cis8bGk+QSA8Y29kZT4kUEFUSDwvY29kZT4sIDxjb2RlPkxEX0xJQlJBUllfUEFUSDwvY29kZT4gcHJvYmxlbS48L2xpPgorPGxpPkl0IGhhcyBiZWVuIHJlcG9ydGVkIHRoYXQgaWdub3JpbmcgdGhlIGRyaXZlciB5b3UgaGF2ZSBkb3dubG9kZWQgZnJvbSBvdG4gYW5kIHVzaW5nIAordGhlIGNsYXNzZXMxMi56aXAgZmlsZSBmcm9tIHRoZSBkaXJlY3RvcnkgPGNvZGU+JE9SQUhPTUVcamRiY1xsaWI8L2NvZGU+IHdpbGwgYWxzbyB3b3JrLgorPC9saT4KKzwvdWw+Cis8L3A+Cis8cD4KK05leHQgeW91IG1heSBleHBlcmllbmNlIHRoZSBlcnJvciA8Y29kZT5PUkEtMDY0MDEgTkVUQ01OOiBpbnZhbGlkIGRyaXZlciBkZXNpZ25hdG9yPC9jb2RlPgorPC9wPgorPHA+CitUaGUgT3JhY2xlIGRvY3VtZW50YXRpb24gc2F5cyA6ICJDYXVzZTogVGhlIGxvZ2luIChjb25uZWN0KSBzdHJpbmcgY29udGFpbnMgYW4gaW52YWxpZAorZHJpdmVyIGRlc2lnbmF0b3IuIEFjdGlvbjogQ29ycmVjdCB0aGUgc3RyaW5nIGFuZCByZS1zdWJtaXQuIgorCitDaGFuZ2UgdGhlIGRhdGFiYXNlIGNvbm5lY3Qgc3RyaW5nIChvZiB0aGUgZm9ybSA8Y29kZT5ob3N0OnBvcnQ6U0lEPC9jb2RlPikgd2l0aCB0aGlzIG9uZToKKzxjb2RlPihkZXNjcmlwdGlvbj0oYWRkcmVzcz0oaG9zdD1teWhvc3QpKHByb3RvY29sPXRjcCkocG9ydD0xNTIxKSkoY29ubmVjdF9kYXRhPShzaWQ9b3JjbCkpKTwvY29kZT4KKzwvcD4KKzxwPgorPGk+RWQuIEhtbSwgSSBkb24ndCB0aGluayB0aGlzIGlzIHJlYWxseSBuZWVkZWQgaWYgeW91IHNvcnQgb3V0IHlvdXIgVE5TTmFtZXMgLSBidXQgSSdtIG5vdCBhbiBPcmFjbGUgREJBIDotKTwvaT4KKzwvcD4KKzwvc3Vic2VjdGlvbj4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iQ29tbW9uIFByb2JsZW1zIj4KKzxwPkhlcmUgYXJlIHNvbWUgY29tbW9uIHByb2JsZW1zIGVuY291bnRlcmVkIHdpdGggYSB3ZWIgYXBwbGljYXRpb24gd2hpY2gKK3VzZXMgYSBkYXRhYmFzZSBhbmQgdGlwcyBmb3IgaG93IHRvIHNvbHZlIHRoZW0uPC9wPgorCis8c3Vic2VjdGlvbiBuYW1lPSJJbnRlcm1pdHRlbnQgZEIgQ29ubmVjdGlvbiBGYWlsdXJlcyI+Cis8cD4KK1RvbWNhdCBydW5zIHdpdGhpbiBhIEpWTS4gIFRoZSBKVk0gcGVyaW9kaWNhbGx5IHBlcmZvcm1zIGdhcmJhZ2UgY29sbGVjdGlvbgorKEdDKSB0byByZW1vdmUgamF2YSBvYmplY3RzIHdoaWNoIGFyZSBubyBsb25nZXIgYmVpbmcgdXNlZC4gIFdoZW4gdGhlIEpWTQorcGVyZm9ybXMgR0MgZXhlY3V0aW9uIG9mIGNvZGUgd2l0aGluIFRvbWNhdCBmcmVlemVzLiBJZiB0aGUgbWF4aW11bSB0aW1lCitjb25maWd1cmVkIGZvciBlc3RhYmxpc2htZW50IG9mIGEgZEIgY29ubmVjdGlvbiBpcyBsZXNzIHRoYW4gdGhlIGFtb3VudAorb2YgdGltZSBnYXJiYWdlIGNvbGxlY3Rpb24gdG9vayB5b3UgY2FuIGdldCBhIGRiIGNvbm5lY2l0b24gZmFpbHVyZS4KKzwvcD4KKworPHA+VG8gY29sbGVjdCBkYXRhIG9uIGhvdyBsb25nIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyB0YWtpbmcgYWRkIHRoZQorPGNvZGU+LXZlcmJvc2U6Z2M8L2NvZGU+IGFyZ3VtZW50IHRvIHlvdXIgPGNvZGU+Q0FUQUxJTkFfT1BUUzwvY29kZT4KK2Vudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gc3RhcnRpbmcgVG9tY2F0LiAgV2hlbiB2ZXJib3NlIGdjIGlzIGVuYWJsZWQKK3lvdXIgPGNvZGU+JENBVEFMSU5BX0JBU0UvbG9ncy9jYXRhbGluYS5vdXQ8L2NvZGU+IGxvZyBmaWxlIHdpbGwgaW5jbHVkZQorZGF0YSBmb3IgZXZlcnkgZ2FyYmFnZSBjb2xsZWN0aW9uIGluY2x1ZGluZyBob3cgbG9uZyBpdCB0b29rLjwvcD4KKworPHA+V2hlbiB5b3VyIEpWTSBpcyB0dW5lZCBjb3JyZWN0bHkgOTklIG9mIHRoZSB0aW1lIGEgR0Mgd2lsbCB0YWtlIGxlc3MKK3RoYW4gb25lIHNlY29uZC4gIFRoZSByZW1haW5kZXIgd2lsbCBvbmx5IHRha2UgYSBmZXcgc2Vjb25kcy4gIFJhcmVseSwKK2lmIGV2ZXIgc2hvdWxkIGEgR0MgdGFrZSBtb3JlIHRoYW4gMTAgc2Vjb25kcy48L3A+CisKKzxwPk1ha2Ugc3VyZSB0aGF0IHRoZSBkYiBjb25uZWN0aW9uIHRpbWVvdXQgaXMgc2V0IHRvIDEwLTE1IHNlY29uZHMuCitGb3IgdGhlIERCQ1AgeW91IHNldCB0aGlzIHVzaW5nIHRoZSBwYXJhbWV0ZXIgPGNvZGU+bWF4V2FpdDwvY29kZT4uPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IlJhbmRvbSBDb25uZWN0aW9uIENsb3NlZCBFeGNlcHRpb25zIj4KKzxwPgorVGhlc2UgY2FuIG9jY3VyIHdoZW4gb25lIHJlcXVlc3QgZ2V0cyBhIGRiIGNvbm5lY3Rpb24gZnJvbSB0aGUgY29ubmVjdGlvbgorcG9vbCBhbmQgY2xvc2VzIGl0IHR3aWNlLiAgV2hlbiB1c2luZyBhIGNvbm5lY3Rpb24gcG9vbCwgY2xvc2luZyB0aGUKK2Nvbm5lY3Rpb24ganVzdCByZXR1cm5zIGl0IHRvIHRoZSBwb29sIGZvciByZXVzZSBieSBhbm90aGVyIHJlcXVlc3QsCitpdCBkb2Vzbid0IGNsb3NlIHRoZSBjb25uZWN0aW9uLiAgQW5kIFRvbWNhdCB1c2VzIG11bHRpcGxlIHRocmVhZHMgdG8KK2hhbmRsZSBjb25jdXJyZW50IHJlcXVlc3RzLiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIHNlcXVlbmNlCitvZiBldmVudHMgd2hpY2ggY291bGQgY2F1c2UgdGhpcyBlcnJvciBpbiBUb21jYXQ6Cis8cHJlPgorICBSZXF1ZXN0IDEgcnVubmluZyBpbiBUaHJlYWQgMSBnZXRzIGEgZGIgY29ubmVjdGlvbi4KKworICBSZXF1ZXN0IDEgY2xvc2VzIHRoZSBkYiBjb25uZWN0aW9uLgorCisgIFRoZSBKVk0gc3dpdGNoZXMgdGhlIHJ1bm5pbmcgdGhyZWFkIHRvIFRocmVhZCAyCisKKyAgUmVxdWVzdCAyIHJ1bm5pbmcgaW4gVGhyZWFkIDIgZ2V0cyBhIGRiIGNvbm5lY3Rpb24KKyAgKHRoZSBzYW1lIGRiIGNvbm5lY3Rpb24ganVzdCBjbG9zZWQgYnkgUmVxdWVzdCAxKS4KKworICBUaGUgSlZNIHN3aXRjaGVzIHRoZSBydW5uaW5nIHRocmVhZCBiYWNrIHRvIFRocmVhZCAxCisKKyAgUmVxdWVzdCAxIGNsb3NlcyB0aGUgZGIgY29ubmVjdGlvbiBhIHNlY29uZCB0aW1lIGluIGEgZmluYWxseSBibG9jay4KKworICBUaGUgSlZNIHN3aXRjaGVzIHRoZSBydW5uaW5nIHRocmVhZCBiYWNrIHRvIFRocmVhZCAyCisKKyAgUmVxdWVzdCAyIFRocmVhZCAyIHRyaWVzIHRvIHVzZSB0aGUgZGIgY29ubmVjdGlvbiBidXQgZmFpbHMKKyAgYmVjYXVzZSBSZXF1ZXN0IDEgY2xvc2VkIGl0LgorPC9wcmU+CitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgcHJvcGVybHkgd3JpdHRlbiBjb2RlIHRvIHVzZSBhIGRiIGNvbm5lY3Rpb24KK29idGFpbmVkIGZyb20gYSBjb25uZWN0aW9uIHBvb2w6Cis8cHJlPgorICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICBTdGF0ZW1lbnQgc3RtdCA9IG51bGw7ICAvLyBPciBQcmVwYXJlZFN0YXRlbWVudCBpZiBuZWVkZWQKKyAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgdHJ5IHsKKyAgICBjb25uID0gLi4uIGdldCBjb25uZWN0aW9uIGZyb20gY29ubmVjdGlvbiBwb29sIC4uLgorICAgIHN0bXQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgic2VsZWN0IC4uLiIpOworICAgIHJzID0gc3RtdC5leGVjdXRlUXVlcnkoKTsKKyAgICAuLi4gaXRlcmF0ZSB0aHJvdWdoIHRoZSByZXN1bHQgc2V0IC4uLgorICAgIHJzLmNsb3NlKCk7CisgICAgcnMgPSBudWxsOworICAgIHN0bXQuY2xvc2UoKTsKKyAgICBzdG10ID0gbnVsbDsKKyAgICBjb25uLmNsb3NlKCk7IC8vIFJldHVybiB0byBjb25uZWN0aW9uIHBvb2wKKyAgICBjb25uID0gbnVsbDsgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBjbG9zZSBpdCB0d2ljZQorICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgIC4uLiBkZWFsIHdpdGggZXJyb3JzIC4uLgorICB9IGZpbmFsbHkgeworICAgIC8vIEFsd2F5cyBtYWtlIHN1cmUgcmVzdWx0IHNldHMgYW5kIHN0YXRlbWVudHMgYXJlIGNsb3NlZCwKKyAgICAvLyBhbmQgdGhlIGNvbm5lY3Rpb24gaXMgcmV0dXJuZWQgdG8gdGhlIHBvb2wKKyAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgdHJ5IHsgcnMuY2xvc2UoKTsgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsgOyB9CisgICAgICBycyA9IG51bGw7CisgICAgfQorICAgIGlmIChzdG10ICE9IG51bGwpIHsKKyAgICAgIHRyeSB7IHN0bXQuY2xvc2UoKTsgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsgOyB9CisgICAgICBzdG10ID0gbnVsbDsKKyAgICB9CisgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgdHJ5IHsgY29ubi5jbG9zZSgpOyB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeyA7IH0KKyAgICAgIGNvbm4gPSBudWxsOworICAgIH0KKyAgfQorPC9wcmU+Cis8L3A+CisKKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iQ29udGV4dCB2ZXJzdXMgR2xvYmFsTmFtaW5nUmVzb3VyY2VzIj4KKzxwPgorICBQbGVhc2Ugbm90ZSB0aGF0IGFsdGhvdWdoIHRoZSBhYm92ZSBpbnN0cnVjdGlvbnMgcGxhY2UgdGhlIEpOREkgZGVjbGFyYXRpb25zIGluIGEgQ29udGV4dAorICBlbGVtZW50LCBpdCBpcyBwb3NzaWJsZSBhbmQgc29tZXRpbWVzIGRlc2lyYWJsZSB0byBwbGFjZSB0aGVzZSBkZWNsYXJhdGlvbnMgaW4gdGhlIAorICA8YSBocmVmPSJjb25maWcvZ2xvYmFscmVzb3VyY2VzLmh0bWwiPkdsb2JhbE5hbWluZ1Jlc291cmNlczwvYT4gc2VjdGlvbiBvZiB0aGUgc2VydmVyCisgIGNvbmZpZ3VyYXRpb24gZmlsZS4gIEEgcmVzb3VyY2UgcGxhY2VkIGluIHRoZSBHbG9iYWxOYW1pbmdSZXNvdXJjZXMgc2VjdGlvbiB3aWxsIGJlIHNoYXJlZAorICBhbW9uZyB0aGUgQ29udGV4dHMgb2YgdGhlIHNlcnZlci4KKzwvcD4KKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iSk5ESSBSZXNvdXJjZSBOYW1pbmcgYW5kIFJlYWxtIEludGVyYWN0aW9uIj4KKzxwPgorICBJbiBvcmRlciB0byBnZXQgUmVhbG1zIHRvIHdvcmssIHRoZSByZWFsbSBtdXN0IHJlZmVyIHRvIHRoZSBkYXRhc291cmNlIGFzCisgIGRlZmluZWQgaW4gdGhlICZsdDtHbG9iYWxOYW1pbmdSZXNvdXJjZXMmZ3Q7IG9yICZsdDtDb250ZXh0Jmd0OyBzZWN0aW9uLCBub3QgYSBkYXRhc291cmNlIGFzIHJlbmFtZWQKKyAgdXNpbmcgJmx0O1Jlc291cmNlTGluayZndDsuCis8L3A+Cis8L3N1YnNlY3Rpb24+IAorCis8L3NlY3Rpb24+CisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2puZGktcmVzb3VyY2VzLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvam5kaS1yZXNvdXJjZXMtaG93dG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OTliYTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2puZGktcmVzb3VyY2VzLWhvd3RvLnhtbApAQCAtMCwwICsxLDc2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImpuZGktcmVzb3VyY2VzLWhvd3RvLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICAgIDxhdXRob3IgZW1haWw9InlvYXZzQGFwYWNoZS5vcmciPllvYXYgU2hhcGlyYTwvYXV0aG9yPgorICAgICAgPHRpdGxlPkpOREkgUmVzb3VyY2VzIEhPVy1UTzwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCis8cD5Ub21jYXQgNSBwcm92aWRlcyBhIEpOREkgPHN0cm9uZz5Jbml0aWFsQ29udGV4dDwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbgoraW5zdGFuY2UgZm9yIGVhY2ggd2ViIGFwcGxpY2F0aW9uIHJ1bm5pbmcgdW5kZXIgaXQsIGluIGEgbWFubmVyIHRoYXQgaXMgCitjb21wYXRpYmxlIHdpdGggdGhvc2UgcHJvdmlkZWQgYnkgYSAKKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZSI+SmF2YTIgRW50ZXJwcmlzZSBFZGl0aW9uPC9hPiBhcHBsaWNhdGlvbiAKK3NlcnZlci4gCisKK1RoZSBKMkVFIHN0YW5kYXJkIHByb3ZpZGVzIGEgc3RhbmRhcmQgc2V0IG9mIGVsZW1lbnRzIGluIAordGhlIDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+IGZpbGUgdG8gcmVmZXJlbmNlIHJlc291cmNlczsgcmVzb3VyY2VzIAorcmVmZXJlbmNlZCBpbiB0aGVzZSBlbGVtZW50cyBtdXN0IGJlIGRlZmluZWQgaW4gYW4gYXBwbGljYXRpb24tc2VydmVyLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24uIAorPC9wPgorCis8cD5Gb3IgVG9tY2F0IDUsIHRoZXNlIGVudHJpZXMgaW4gcGVyLXdlYi1hcHBsaWNhdGlvbiAKKzxjb2RlPkluaXRpYWxDb250ZXh0PC9jb2RlPiBhcmUgY29uZmlndXJlZCBpbiB0aGUgCis8Y29kZT48c3Ryb25nPiZsdDtDb250ZXh0Jmd0Ozwvc3Ryb25nPjwvY29kZT4gZWxlbWVudHMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIAoraW4gZWl0aGVyIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4gb3IsIHByZWZlcmFibHksIAordGhlIHBlci13ZWItYXBwbGljYXRpb24gY29udGV4dCBYTUwgZmlsZSAoZWl0aGVyIDxjb2RlPk1FVEEtSU5GL2NvbnRleHQueG1sPC9jb2RlPikuCis8L3A+CisKKzxwPlRvbWNhdCA1IG1haW50YWlucyBhIHNlcGFyYXRlIG5hbWVzcGFjZSBvZiBnbG9iYWwgcmVzb3VyY2VzIGZvciB0aGUgCitlbnRpcmUgc2VydmVyLiAgVGhlc2UgYXJlIGNvbmZpZ3VyZWQgaW4gdGhlIAorPGEgaHJlZj0iY29uZmlnL2dsb2JhbHJlc291cmNlcy5odG1sIj4KKzxjb2RlPjxzdHJvbmc+Jmx0O0dsb2JhbE5hbWVpbmdSZXNvdXJjZXMmZ3Q7PC9zdHJvbmc+PC9jb2RlPjwvYT4gZWxlbWVudCBvZiAKKzxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4uIFlvdSBtYXkgZXhwb3NlIHRoZXNlIHJlc291cmNlcyB0byAKK3dlYiBhcHBsaWNhdGlvbnMgYnkgdXNpbmcgCis8Y29kZT48c3Ryb25nPiZsdDtSZXNvdXJjZUxpbmsmZ3Q7PC9zdHJvbmc+PC9jb2RlPiBlbGVtZW50cy4KKzwvcD4KKworPHA+VGhlIHJlc291cmNlcyBkZWZpbmVkIGluIHRoZXNlIGVsZW1lbnRzCittYXkgYmUgcmVmZXJlbmNlZCBieSB0aGUgZm9sbG93aW5nIGVsZW1lbnRzIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudAorZGVzY3JpcHRvciAoPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4pIG9mIHlvdXIgd2ViIGFwcGxpY2F0aW9uOjwvcD4KKzx1bD4KKzxsaT48Y29kZT48c3Ryb25nPiZsdDtlbnYtZW50cnkmZ3Q7PC9zdHJvbmc+PC9jb2RlPiAtIEVudmlyb25tZW50IGVudHJ5LCBhCisgICAgc2luZ2xlLXZhbHVlIHBhcmFtZXRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBob3cgdGhlIGFwcGxpY2F0aW9uCisgICAgd2lsbCBvcGVyYXRlLjwvbGk+Cis8bGk+PGNvZGU+PHN0cm9uZz4mbHQ7cmVzb3VyY2UtcmVmJmd0Ozwvc3Ryb25nPjwvY29kZT4gLSBSZXNvdXJjZSByZWZlcmVuY2UsCisgICAgd2hpY2ggaXMgdHlwaWNhbGx5IHRvIGFuIG9iamVjdCBmYWN0b3J5IGZvciByZXNvdXJjZXMgc3VjaCBhcyBhIEpEQkMKKyAgICA8Y29kZT5EYXRhU291cmNlPC9jb2RlPiwgYSBKYXZhTWFpbCA8Y29kZT5TZXNzaW9uPC9jb2RlPiwgb3IgY3VzdG9tCisgICAgb2JqZWN0IGZhY3RvcmllcyBjb25maWd1cmVkIGludG8gVG9tY2F0IDUuPC9saT4KKzxsaT48Y29kZT48c3Ryb25nPiZsdDtyZXNvdXJjZS1lbnYtcmVmJmd0Ozwvc3Ryb25nPjwvY29kZT4gLSBSZXNvdXJjZQorICAgIGVudmlyb25tZW50IHJlZmVyZW5jZSwgYSBuZXcgdmFyaWF0aW9uIG9mIDxjb2RlPnJlc291cmNlLXJlZjwvY29kZT4KKyAgICBhZGRlZCBpbiBTZXJ2bGV0IDIuNCB0aGF0IGlzIHNpbXBsZXIgdG8gY29uZmlndXJlIGZvciByZXNvdXJjZXMKKyAgICB0aGF0IGRvIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLjwvbGk+Cis8L3VsPgorCis8cD5UaGUgPGNvZGU+SW5pdGlhbENvbnRleHQ8L2NvZGU+IGlzIGNvbmZpZ3VyZWQgYXMgYSB3ZWIgYXBwbGljYXRpb24gaXMKK2luaXRpYWxseSBkZXBsb3llZCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHRvIHdlYiBhcHBsaWNhdGlvbiBjb21wb25lbnRzIChmb3IKK3JlYWQtb25seSBhY2Nlc3MpLiAgQWxsIGNvbmZpZ3VyZWQgZW50cmllcyBhbmQgcmVzb3VyY2VzIGFyZSBwbGFjZWQgaW4KK3RoZSA8Y29kZT5qYXZhOmNvbXAvZW52PC9jb2RlPiBwb3J0aW9uIG9mIHRoZSBKTkRJIG5hbWVzcGFjZSwgc28gYSB0eXBpY2FsCithY2Nlc3MgdG8gYSByZXNvdXJjZSAtIGluIHRoaXMgY2FzZSwgdG8gYSBKREJDIDxjb2RlPkRhdGFTb3VyY2U8L2NvZGU+IC0KK3dvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczo8L3A+CisKKzxzb3VyY2U+CisvLyBPYnRhaW4gb3VyIGVudmlyb25tZW50IG5hbWluZyBjb250ZXh0CitDb250ZXh0IGluaXRDdHggPSBuZXcgSW5pdGlhbENvbnRleHQoKTsKK0NvbnRleHQgZW52Q3R4ID0gKENvbnRleHQpIGluaXRDdHgubG9va3VwKCJqYXZhOmNvbXAvZW52Iik7CisKKy8vIExvb2sgdXAgb3VyIGRhdGEgc291cmNlCitEYXRhU291cmNlIGRzID0gKERhdGFTb3VyY2UpCisgIGVudkN0eC5sb29rdXAoImpkYmMvRW1wbG95ZWVEQiIpOworCisvLyBBbGxvY2F0ZSBhbmQgdXNlIGEgY29ubmVjdGlvbiBmcm9tIHRoZSBwb29sCitDb25uZWN0aW9uIGNvbm4gPSBkcy5nZXRDb25uZWN0aW9uKCk7CisuLi4gdXNlIHRoaXMgY29ubmVjdGlvbiB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlIC4uLgorY29ubi5jbG9zZSgpOworPC9zb3VyY2U+CisKKzxwPlNlZSB0aGUgZm9sbG93aW5nIFNwZWNpZmljYXRpb25zIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHByb2dyYW1taW5nIEFQSXMKK2ZvciBKTkRJLCBhbmQgZm9yIHRoZSBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgSmF2YTIgRW50ZXJwcmlzZSBFZGl0aW9uIChKMkVFKQorc2VydmVycywgd2hpY2ggVG9tY2F0IGVtdWxhdGVzIGZvciB0aGUgc2VydmljZXMgdGhhdCBpdCBwcm92aWRlczo8L3A+Cis8dWw+Cis8bGk+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qbmRpLyNkb3dubG9hZCI+SmF2YSBOYW1pbmcgYW5kCisgICAgRGlyZWN0b3J5IEludGVyZmFjZTwvYT4gKGluY2x1ZGVkIGluIEpESyAxLjQsIGF2YWlsYWJsZSBzZXBhcmF0ZWx5IGZvcgorICAgIHByaW9yIEpESyB2ZXJzaW9ucyk8L2xpPgorPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kb3dubG9hZC5odG1sIj5KMkVFIFBsYXRmb3JtCisgICAgU3BlY2lmaWNhdGlvbjwvYT4gKGluIHBhcnRpY3VsYXIsIHNlZSBDaGFwdGVyIDUgb24gPGVtPk5hbWluZzwvZW0+KTwvbGk+Cis8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQ29uZmlndXJpbmcgSk5ESSBSZXNvdXJjZXMiPgorCis8cD5FYWNoIGF2YWlsYWJsZSBKTkRJIFJlc291cmNlIGlzIGNvbmZpZ3VyZWQgYmFzZWQgb24gaW5jbHVzaW9uIG9mIHRoZQorZm9sbG93aW5nIGVsZW1lbnRzIGluIHRoZSA8Y29kZT48c3Ryb25nPiZsdDtDb250ZXh0Jmd0Ozwvc3Ryb25nPjwvY29kZT4KK2VsZW1lbnQ6PC9wPgorCis8dWw+Cis8bGk+PGEgaHJlZj0iY29uZmlnL2NvbnRleHQuaHRtbCNFbnZpcm9ubWVudCBFbnRyaWVzIj4mbHQ7RW52aXJvbm1lbnQmZ3Q7PC9hPiAtCisgICAgQ29uZmlndXJlIG5hbWVzIGFuZCB2YWx1ZXMgZm9yIHNjYWxhciBlbnZpcm9ubWVudCBlbnRyaWVzIHRoYXQgd2lsbCBiZQorICAgIGV4cG9zZWQgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiB0aHJvdWdoIHRoZSBKTkRJCisgICAgPGNvZGU+SW5pdGlhbENvbnRleHQ8L2NvZGU+IChlcXVpdmFsZW50IHRvIHRoZSBpbmNsdXNpb24gb2YgYW4KKyAgICA8Y29kZT4mbHQ7ZW52LWVudHJ5Jmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yKS48L2xpPgorPGxpPjxhIGhyZWY9ImNvbmZpZy9jb250ZXh0Lmh0bWwjUmVzb3VyY2UgRGVmaW5pdGlvbnMiPiZsdDtSZXNvdXJjZSZndDs8L2E+IC0KKyAgICBDb25maWd1cmUgdGhlIG5hbWUgYW5kIGRhdGEgdHlwZSBvZiBhIHJlc291cmNlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZQorICAgIGFwcGxpY2F0aW9uIChlcXVpdmFsZW50IHRvIHRoZSBpbmNsdXNpb24gb2YgYQorICAgIDxjb2RlPiZsdDtyZXNvdXJjZS1yZWYmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSB3ZWIgYXBwbGljYXRpb24KKyAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IpLjwvbGk+Cis8bGk+PGEgaHJlZj0iY29uZmlnL2NvbnRleHQuaHRtbCNSZXNvdXJjZSBMaW5rcyI+Jmx0O1Jlc291cmNlTGluayZndDs8L2E+IC0KKyAgICBBZGQgYSBsaW5rIHRvIGEgcmVzb3VyY2UgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIEpOREkgY29udGV4dC4gVXNlIHJlc291cmNlIAorICAgIGxpbmtzIHRvIGdpdmUgYSB3ZWIgYXBwbGljYXRpb24gYWNjZXNzIHRvIGEgcmVzb3VyY2UgZGVmaW5lZCBpbiAKKyAgICB0aGU8YSBocmVmPSJjb25maWcvZ2xvYmFscmVzb3VyY2VzLmh0bWwiPiZsdDtHbG9iYWxOYW1pbmdSZXNvdXJjZXMmZ3Q7PC9hPgorICAgIGNoaWxkIGVsZW1lbnQgb2YgdGhlIDxhIGhyZWY9ImNvbmZpZy9zZXJ2ZXIuaHRtbCI+Jmx0O1NlcnZlciZndDs8L2E+CisgICAgZWxlbWVudC48L2xpPgorPGxpPjxhIGhyZWY9ImNvbmZpZy9jb250ZXh0Lmh0bWwjVHJhbnNhY3Rpb24iPiZsdDtUcmFuc2FjdGlvbiZndDs8L2E+IC0KKyAgICBBZGQgYSByZXNvdXJjZSBmYWN0b3J5IGZvciBpbnN0YW50aWF0aW5nIHRoZSBVc2VyVHJhbnNhY3Rpb24gb2JqZWN0IAorICAgIGluc3RhbmNlIHRoYXQgaXMgYXZhaWxhYmxlIGF0IDxjb2RlPmphdmE6Y29tcC9Vc2VyVHJhbnNhY3Rpb248L2NvZGU+LjwvbGk+CisKKzwvdWw+CisKKzxwPkFueSBudW1iZXIgb2YgdGhlc2UgZWxlbWVudHMgbWF5IGJlIG5lc3RlZCBpbnNpZGUgYQorPGEgaHJlZj0iY29uZmlnL2NvbnRleHQuaHRtbCI+Jmx0O0NvbnRleHQmZ3Q7PC9hPiBlbGVtZW50ICh0byBiZSBhc3NvY2lhdGVkCitvbmx5IHdpdGggdGhhdCBwYXJ0aWN1bGFyIHdlYiBhcHBsaWNhdGlvbikuPC9wPgorCis8cD5JbiBhZGRpdGlvbiwgdGhlIG5hbWVzIGFuZCB2YWx1ZXMgb2YgYWxsIDxjb2RlPiZsdDtlbnYtZW50cnkmZ3Q7PC9jb2RlPgorZWxlbWVudHMgaW5jbHVkZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyg8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPikgYXJlIGNvbmZpZ3VyZWQgaW50byB0aGUgaW5pdGlhbCBjb250ZXh0IGFzCit3ZWxsLCBvdmVycmlkaW5nIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZyb20gPGNvZGU+Y29uZi9zZXJ2ZXIueG1sPC9jb2RlPgorPHN0cm9uZz5vbmx5PC9zdHJvbmc+IGlmIGFsbG93ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcKKzxjb2RlPiZsdDtFbnZpcm9ubWVudCZndDs8L2NvZGU+IGVsZW1lbnQgKGJ5IHNldHRpbmcgdGhlCis8Y29kZT5vdmVycmlkZTwvY29kZT4gYXR0cmlidXRlIHRvICJ0cnVlIikuPC9wPgorCis8cD5HbG9iYWwgcmVzb3VyY2VzIGNhbiBiZSBkZWZpbmVkIGluIHRoZSBzZXJ2ZXItd2lkZSBKTkRJIGNvbnRleHQsIGJ5IGFkZGluZwordGhlIHJlc291cmNlIGVsZW1lbnRzIGRlc2NyaWJlZCBhYm92ZSB0byB0aGUKKzxhIGhyZWY9ImNvbmZpZy9nbG9iYWxyZXNvdXJjZXMuaHRtbCI+Jmx0O0dsb2JhbE5hbWluZ1Jlc291cmNlcyZndDs8L2E+CitjaGlsZCBlbGVtZW50IG9mIHRoZSA8YSBocmVmPSJjb25maWcvc2VydmVyLmh0bWwiPiZsdDtTZXJ2ZXImZ3Q7PC9hPgorZWxlbWVudCBhbmQgdXNpbmcgYSAKKzxhIGhyZWY9ImNvbmZpZy9jb250ZXh0Lmh0bWwjUmVzb3VyY2UgTGlua3MiPiZsdDtSZXNvdXJjZUxpbmsmZ3Q7PC9hPiB0bworaW5jbHVkZSBpdCBpbiB0aGUgcGVyLXdlYi1hcHBsaWNhdGlvbiBjb250ZXh0LjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlRvbWNhdCBTdGFuZGFyZCBSZXNvdXJjZSBGYWN0b3JpZXMiPgorCisgIDxwPlRvbWNhdCA1IGluY2x1ZGVzIGEgc2VyaWVzIG9mIHN0YW5kYXJkIHJlc291cmNlIGZhY3RvcmllcyB0aGF0IGNhbgorICBwcm92aWRlIHNlcnZpY2VzIHRvIHlvdXIgd2ViIGFwcGxpY2F0aW9ucywgYnV0IGdpdmUgeW91IGNvbmZpZ3VyYXRpb24KKyAgZmxleGliaWxpdHkgKGluIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4pIHdpdGhvdXQKKyAgbW9kaWZ5aW5nIHRoZSB3ZWIgYXBwbGljYXRpb24gb3IgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEVhY2gKKyAgc3Vic2VjdGlvbiBiZWxvdyBkZXRhaWxzIHRoZSBjb25maWd1cmF0aW9uIGFuZCB1c2FnZSBvZiB0aGUgc3RhbmRhcmQKKyAgcmVzb3VyY2UgZmFjdG9yaWVzLjwvcD4KKworICA8cD5TZWUgPGEgaHJlZj0iI0FkZGluZyBDdXN0b20gUmVzb3VyY2UgRmFjdG9yaWVzIj5BZGRpbmcgQ3VzdG9tCisgIFJlc291cmNlIEZhY3RvcmllczwvYT4gZm9yIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBjcmVhdGUsIGluc3RhbGwsCisgIGNvbmZpZ3VyZSwgYW5kIHVzZSB5b3VyIG93biBjdXN0b20gcmVzb3VyY2UgZmFjdG9yeSBjbGFzc2VzIHdpdGgKKyAgVG9tY2F0IDUuPC9wPgorCisgIDxwPjxlbT5OT1RFPC9lbT4gLSBPZiB0aGUgc3RhbmRhcmQgcmVzb3VyY2UgZmFjdG9yaWVzLCBvbmx5IHRoZQorICAiSkRCQyBEYXRhIFNvdXJjZSIgYW5kICJVc2VyIFRyYW5zYWN0aW9uIiBmYWN0b3JpZXMgYXJlIG1hbmRhdGVkIHRvCisgIGJlIGF2YWlsYWJsZSBvbiBvdGhlciBwbGF0Zm9ybXMsIGFuZCB0aGVuIHRoZXkgYXJlIHJlcXVpcmVkIG9ubHkgaWYKKyAgdGhlIHBsYXRmb3JtIGltcGxlbWVudHMgdGhlIEphdmEyIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgc3BlY3MuCisgIEFsbCBvdGhlciBzdGFuZGFyZCByZXNvdXJjZSBmYWN0b3JpZXMsIHBsdXMgY3VzdG9tIHJlc291cmNlIGZhY3RvcmllcworICB0aGF0IHlvdSB3cml0ZSB5b3Vyc2VsZiwgYXJlIHNwZWNpZmljIHRvIFRvbWNhdCBhbmQgY2Fubm90IGJlIGFzc3VtZWQKKyAgdG8gYmUgYXZhaWxhYmxlIG9uIG90aGVyIGNvbnRhaW5lcnMuPC9wPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkdlbmVyaWMgSmF2YUJlYW4gUmVzb3VyY2VzIj4KKworICAgIDxoMz4wLiAgSW50cm9kdWN0aW9uPC9oMz4KKworICAgIDxwPlRoaXMgcmVzb3VyY2UgZmFjdG9yeSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgb2JqZWN0cyBvZiA8ZW0+YW55PC9lbT4KKyAgICBKYXZhIGNsYXNzIHRoYXQgY29uZm9ybXMgdG8gc3RhbmRhcmQgSmF2YUJlYW5zIG5hbWluZyBjb252ZW50aW9ucyAoaS5lLgorICAgIGl0IGhhcyBhIHplcm8tYXJndW1lbnRzIGNvbnN0cnVjdG9yLCBhbmQgaGFzIHByb3BlcnR5IHNldHRlcnMgdGhhdAorICAgIGNvbmZvcm0gdG8gdGhlIHNldEZvbygpIG5hbWluZyBwYXR0ZXJuLiAgVGhlIHJlc291cmNlIGZhY3Rvcnkgd2lsbAorICAgIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgYXBwcm9wcmlhdGUgYmVhbiBjbGFzcyBldmVyeSB0aW1lIGEKKyAgICA8Y29kZT5sb29rdXAoKTwvY29kZT4gZm9yIHRoaXMgZW50cnkgaXMgbWFkZS48L3A+CisKKyAgICA8cD5UaGUgc3RlcHMgcmVxdWlyZWQgdG8gdXNlIHRoaXMgZmFjaWxpdHkgYXJlIGRlc2NyaWJlZCBiZWxvdy48L3A+CisKKyAgICA8aDM+MS4gIENyZWF0ZSBZb3VyIEphdmFCZWFuIENsYXNzPC9oMz4KKworICAgIDxwPkNyZWF0ZSB0aGUgSmF2YUJlYW4gY2xhc3Mgd2hpY2ggd2lsbCBiZSBpbnN0YW50aWF0ZWQgZWFjaCB0aW1lCisgICAgdGhhdCB0aGUgcmVzb3VyY2UgZmFjdG9yeSBpcyBsb29rZWQgdXAuICBGb3IgdGhpcyBleGFtcGxlLCBhc3N1bWUKKyAgICB5b3UgY3JlYXRlIGEgY2xhc3MgPGNvZGU+Y29tLm15Y29tcGFueS5NeUJlYW48L2NvZGU+LCB3aGljaCBsb29rcworICAgIGxpa2UgdGhpczo8L3A+CisKKzxzb3VyY2U+CitwYWNrYWdlIGNvbS5teWNvbXBhbnk7CisKK3B1YmxpYyBjbGFzcyBNeUJlYW4geworCisgIHByaXZhdGUgU3RyaW5nIGZvbyA9ICJEZWZhdWx0IEZvbyI7CisKKyAgcHVibGljIFN0cmluZyBnZXRGb28oKSB7CisgICAgcmV0dXJuICh0aGlzLmZvbyk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRGb28oU3RyaW5nIGZvbykgeworICAgIHRoaXMuZm9vID0gZm9vOworICB9CisKKyAgcHJpdmF0ZSBpbnQgYmFyID0gMDsKKworICBwdWJsaWMgaW50IGdldEJhcigpIHsKKyAgICByZXR1cm4gKHRoaXMuYmFyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEJhcihpbnQgYmFyKSB7CisgICAgdGhpcy5iYXIgPSBiYXI7CisgIH0KKworCit9Cis8L3NvdXJjZT4KKworICA8aDM+Mi4gIERlY2xhcmUgWW91ciBSZXNvdXJjZSBSZXF1aXJlbWVudHM8L2gzPgorCisgIDxwPk5leHQsIG1vZGlmeSB5b3VyIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAgKDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+KSB0byBkZWNsYXJlIHRoZSBKTkRJIG5hbWUgdW5kZXIgd2hpY2gKKyAgeW91IHdpbGwgcmVxdWVzdCBuZXcgaW5zdGFuY2VzIG9mIHRoaXMgYmVhbi4gIFRoZSBzaW1wbGVzdCBhcHByb2FjaCBpcworICB0byB1c2UgYSA8Y29kZT4mbHQ7cmVzb3VyY2UtZW52LXJlZiZndDs8L2NvZGU+IGVsZW1lbnQsIGxpa2UgdGhpczo8L3A+CisKKzxzb3VyY2U+CismbHQ7cmVzb3VyY2UtZW52LXJlZiZndDsKKyAgJmx0O2Rlc2NyaXB0aW9uJmd0OworICAgIE9iamVjdCBmYWN0b3J5IGZvciBNeUJlYW4gaW5zdGFuY2VzLgorICAmbHQ7L2Rlc2NyaXB0aW9uJmd0OworICAmbHQ7cmVzb3VyY2UtZW52LXJlZi1uYW1lJmd0OworICAgIGJlYW4vTXlCZWFuRmFjdG9yeQorICAmbHQ7L3Jlc291cmNlLWVudi1yZWYtbmFtZSZndDsKKyAgJmx0O3Jlc291cmNlLWVudi1yZWYtdHlwZSZndDsKKyAgICBjb20ubXljb21wYW55Lk15QmVhbgorICAmbHQ7L3Jlc291cmNlLWVudi1yZWYtdHlwZSZndDsKKyZsdDsvcmVzb3VyY2UtZW52LXJlZiZndDsKKzwvc291cmNlPgorCisgICAgPHA+PHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+IC0gQmUgc3VyZSB5b3UgcmVzcGVjdCB0aGUgZWxlbWVudCBvcmRlcmluZworICAgIHRoYXQgaXMgcmVxdWlyZWQgYnkgdGhlIERURCBmb3Igd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMhCisgICAgU2VlIHRoZQorICAgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldC9kb3dubG9hZC5odG1sIj5TZXJ2bGV0CisgICAgU3BlY2lmaWNhdGlvbjwvYT4gZm9yIGRldGFpbHMuPC9wPgorCisgIDxoMz4zLiAgQ29kZSBZb3VyIEFwcGxpY2F0aW9uJ3MgVXNlIE9mIFRoaXMgUmVzb3VyY2U8L2gzPgorCisgIDxwPkEgdHlwaWNhbCB1c2Ugb2YgdGhpcyByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgbWlnaHQgbG9vaworICBsaWtlIHRoaXM6PC9wPgorCis8c291cmNlPgorQ29udGV4dCBpbml0Q3R4ID0gbmV3IEluaXRpYWxDb250ZXh0KCk7CitDb250ZXh0IGVudkN0eCA9IChDb250ZXh0KSBpbml0Q3R4Lmxvb2t1cCgiamF2YTpjb21wL2VudiIpOworTXlCZWFuIGJlYW4gPSAoTXlCZWFuKSBlbnZDdHgubG9va3VwKCJiZWFuL015QmVhbkZhY3RvcnkiKTsKKword3JpdGVyLnByaW50bG4oImZvbyA9ICIgKyBiZWFuLmdldEZvbygpICsgIiwgYmFyID0gIiArCisgICAgICAgICAgICAgICBiZWFuLmdldEJhcigpKTsKKzwvc291cmNlPgorCisgICAgPGgzPjQuICBDb25maWd1cmUgVG9tY2F0J3MgUmVzb3VyY2UgRmFjdG9yeTwvaDM+CisKKyAgICA8cD5UbyBjb25maWd1cmUgVG9tY2F0J3MgcmVzb3VyY2UgZmFjdG9yeSwgYWRkIGFuIGVsZW1lbnRzIGxpa2UgdGhpcyB0byB0aGUKKyAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3NlcnZlci54bWw8L2NvZGU+IGZpbGUsIG5lc3RlZCBpbnNpZGUgdGhlCisgICAgPGNvZGU+Q29udGV4dDwvY29kZT4gZWxlbWVudCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uPC9wPgorPHNvdXJjZT4KKyZsdDtDb250ZXh0IC4uLiZndDsKKyAgLi4uCisgICZsdDtSZXNvdXJjZSBuYW1lPSJiZWFuL015QmVhbkZhY3RvcnkiIGF1dGg9IkNvbnRhaW5lciIKKyAgICAgICAgICAgIHR5cGU9ImNvbS5teWNvbXBhbnkuTXlCZWFuIgorICAgICAgICAgICAgZmFjdG9yeT0ib3JnLmFwYWNoZS5uYW1pbmcuZmFjdG9yeS5CZWFuRmFjdG9yeSIKKyAgICAgICAgICAgIGJhcj0iMjMiLyZndDsKKyAgLi4uCismbHQ7L0NvbnRleHQmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPk5vdGUgdGhhdCB0aGUgcmVzb3VyY2UgbmFtZSAoaGVyZSwgPGNvZGU+YmVhbi9NeUJlYW5GYWN0b3J5PC9jb2RlPgorICAgIG11c3QgbWF0Y2ggdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKKyAgICBkZXNjcmlwdG9yLiAgV2UgYXJlIGFsc28gaW5pdGlhbGl6aW5nIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+YmFyPC9jb2RlPgorICAgIHByb3BlcnR5LCB3aGljaCB3aWxsIGNhdXNlIDxjb2RlPnNldEJhcigyMyk8L2NvZGU+IHRvIGJlIGNhbGxlZCBiZWZvcmUKKyAgICB0aGUgbmV3IGJlYW4gaXMgcmV0dXJuZWQuICBCZWNhdXNlIHdlIGFyZSBub3QgaW5pdGlhbGl6aW5nIHRoZQorICAgIDxjb2RlPmZvbzwvY29kZT4gcHJvcGVydHkgKGFsdGhvdWdoIHdlIGNvdWxkIGhhdmUpLCB0aGUgYmVhbiB3aWxsCisgICAgY29udGFpbiB3aGF0ZXZlciBkZWZhdWx0IHZhbHVlIGlzIHNldCB1cCBieSBpdHMgY29uc3RydWN0b3IuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkphdmFNYWlsIFNlc3Npb25zIj4KKworICAgIDxoMz4wLiAgSW50cm9kdWN0aW9uPC9oMz4KKworICAgIDxwPkluIG1hbnkgd2ViIGFwcGxpY2F0aW9ucywgc2VuZGluZyBlbGVjdHJvbmljIG1haWwgbWVzc2FnZXMgaXMgYQorICAgIHJlcXVpcmVkIHBhcnQgb2YgdGhlIHN5c3RlbSdzIGZ1bmN0aW9uYWxpdHkuICBUaGUKKyAgICA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2phdmFtYWlsIj5KYXZhIE1haWw8L2E+IEFQSQorICAgIG1ha2VzIHRoaXMgcHJvY2VzcyByZWxhdGl2ZWx5IHN0cmFpZ2h0Zm9yd2FyZCwgYnV0IHJlcXVpcmVzIG1hbnkKKyAgICBjb25maWd1cmF0aW9uIGRldGFpbHMgdGhhdCB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIG11c3QgYmUgYXdhcmUgb2YKKyAgICAoaW5jbHVkaW5nIHRoZSBuYW1lIG9mIHRoZSBTTVRQIGhvc3QgdG8gYmUgdXNlZCBmb3IgbWVzc2FnZSBzZW5kaW5nKS48L3A+CisKKyAgICA8cD5Ub21jYXQgNSBpbmNsdWRlcyBhIHN0YW5kYXJkIHJlc291cmNlIGZhY3RvcnkgdGhhdCB3aWxsIGNyZWF0ZQorICAgIDxjb2RlPmphdmF4Lm1haWwuU2Vzc2lvbjwvY29kZT4gc2Vzc2lvbiBpbnN0YW5jZXMgZm9yIHlvdSwgYWxyZWFkeQorICAgIGNvbm5lY3RlZCB0byB0aGUgU01UUCBzZXJ2ZXIgdGhhdCBpcyBjb25maWd1cmVkIGluIDxjb2RlPnNlcnZlci54bWw8L2NvZGU+LgorICAgIEluIHRoaXMgd2F5LCB0aGUgYXBwbGljYXRpb24gaXMgdG90YWxseSBpbnN1bGF0ZWQgZnJvbSBjaGFuZ2VzIGluIHRoZQorICAgIGVtYWlsIHNlcnZlciBjb25maWd1cmF0aW9uIGVudmlyb25tZW50IC0gaXQgc2ltcGx5IGFza3MgZm9yLCBhbmQgcmVjZWl2ZXMsCisgICAgYSBwcmVjb25maWd1cmVkIHNlc3Npb24gd2hlbmV2ZXIgbmVlZGVkLjwvcD4KKworICAgIDxwPlRoZSBzdGVwcyByZXF1aXJlZCBmb3IgdGhpcyBhcmUgb3V0bGluZWQgYmVsb3cuPC9wPgorCisgICAgPGgzPjEuICBEZWNsYXJlIFlvdXIgUmVzb3VyY2UgUmVxdWlyZW1lbnRzPC9oMz4KKworICAgIDxwPlRoZSBmaXJzdCB0aGluZyB5b3Ugc2hvdWxkIGRvIGlzIG1vZGlmeSB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKKyAgICBkZXNjcmlwdG9yICg8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPikgdG8gZGVjbGFyZSB0aGUgSk5ESSBuYW1lIHVuZGVyCisgICAgd2hpY2ggeW91IHdpbGwgbG9vayB1cCBwcmVjb25maWd1cmVkIHNlc3Npb25zLiAgQnkgY29udmVudGlvbiwgYWxsIHN1Y2gKKyAgICBuYW1lcyBzaG91bGQgcmVzb2x2ZSB0byB0aGUgPGNvZGU+bWFpbDwvY29kZT4gc3ViY29udGV4dCAocmVsYXRpdmUgdG8gdGhlCisgICAgc3RhbmRhcmQgPGNvZGU+amF2YTpjb21wL2VudjwvY29kZT4gbmFtaW5nIGNvbnRleHQgdGhhdCBpcyB0aGUgcm9vdCBvZgorICAgIGFsbCBwcm92aWRlZCByZXNvdXJjZSBmYWN0b3JpZXMuICBBIHR5cGljYWwgPGNvZGU+d2ViLnhtbDwvY29kZT4gZW50cnkKKyAgICBtaWdodCBsb29rIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorJmx0O3Jlc291cmNlLXJlZiZndDsKKyAgJmx0O2Rlc2NyaXB0aW9uJmd0OworICAgIFJlc291cmNlIHJlZmVyZW5jZSB0byBhIGZhY3RvcnkgZm9yIGphdmF4Lm1haWwuU2Vzc2lvbgorICAgIGluc3RhbmNlcyB0aGF0IG1heSBiZSB1c2VkIGZvciBzZW5kaW5nIGVsZWN0cm9uaWMgbWFpbAorICAgIG1lc3NhZ2VzLCBwcmVjb25maWd1cmVkIHRvIGNvbm5lY3QgdG8gdGhlIGFwcHJvcHJpYXRlCisgICAgU01UUCBzZXJ2ZXIuCisgICZsdDsvZGVzY3JpcHRpb24mZ3Q7CisgICZsdDtyZXMtcmVmLW5hbWUmZ3Q7CisgICAgbWFpbC9TZXNzaW9uCisgICZsdDsvcmVzLXJlZi1uYW1lJmd0OworICAmbHQ7cmVzLXR5cGUmZ3Q7CisgICAgamF2YXgubWFpbC5TZXNzaW9uCisgICZsdDsvcmVzLXR5cGUmZ3Q7CisgICZsdDtyZXMtYXV0aCZndDsKKyAgICBDb250YWluZXIKKyAgJmx0Oy9yZXMtYXV0aCZndDsKKyZsdDsvcmVzb3VyY2UtcmVmJmd0OworPC9zb3VyY2U+CisKKyAgICA8cD48c3Ryb25nPldBUk5JTkc8L3N0cm9uZz4gLSBCZSBzdXJlIHlvdSByZXNwZWN0IHRoZSBlbGVtZW50IG9yZGVyaW5nCisgICAgdGhhdCBpcyByZXF1aXJlZCBieSB0aGUgRFREIGZvciB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9ycyEKKyAgICBTZWUgdGhlCisgICAgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0L2Rvd25sb2FkLmh0bWwiPlNlcnZsZXQKKyAgICBTcGVjaWZpY2F0aW9uPC9hPiBmb3IgZGV0YWlscy48L3A+CisKKyAgICA8aDM+Mi4gIENvZGUgWW91ciBBcHBsaWNhdGlvbidzIFVzZSBPZiBUaGlzIFJlc291cmNlPC9oMz4KKworICAgIDxwPkEgdHlwaWNhbCB1c2Ugb2YgdGhpcyByZXNvdXJjZSByZWZlcmVuY2UgbWlnaHQgbG9vayBsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KK0NvbnRleHQgaW5pdEN0eCA9IG5ldyBJbml0aWFsQ29udGV4dCgpOworQ29udGV4dCBlbnZDdHggPSAoQ29udGV4dCkgaW5pdEN0eC5sb29rdXAoImphdmE6Y29tcC9lbnYiKTsKK1Nlc3Npb24gc2Vzc2lvbiA9IChTZXNzaW9uKSBlbnZDdHgubG9va3VwKCJtYWlsL1Nlc3Npb24iKTsKKworTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1pbWVNZXNzYWdlKHNlc3Npb24pOworbWVzc2FnZS5zZXRGcm9tKG5ldyBJbnRlcm5ldEFkZHJlc3MocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImZyb20iKSk7CitJbnRlcm5ldEFkZHJlc3MgdG9bXSA9IG5ldyBJbnRlcm5ldEFkZHJlc3NbMV07Cit0b1swXSA9IG5ldyBJbnRlcm5ldEFkZHJlc3MocmVxdWVzdC5nZXRQYXJhbWV0ZXIoInRvIikpOworbWVzc2FnZS5zZXRSZWNpcGllbnRzKE1lc3NhZ2UuUmVjaXBpZW50VHlwZS5UTywgdG8pOworbWVzc2FnZS5zZXRTdWJqZWN0KHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzdWJqZWN0IikpOworbWVzc2FnZS5zZXRDb250ZW50KHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJjb250ZW50IiksICJ0ZXh0L3BsYWluIik7CitUcmFuc3BvcnQuc2VuZChtZXNzYWdlKTsKKzwvc291cmNlPgorCisgICAgPHA+Tm90ZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiB1c2VzIHRoZSBzYW1lIHJlc291cmNlIHJlZmVyZW5jZSBuYW1lCisgICAgdGhhdCB3YXMgZGVjbGFyZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBUaGlzCisgICAgaXMgbWF0Y2hlZCB1cCBhZ2FpbnN0IHRoZSByZXNvdXJjZSBmYWN0b3J5IHRoYXQgaXMgY29uZmlndXJlZCBpbgorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4sIGFzIGRlc2NyaWJlZCBiZWxvdy48L3A+CisKKyAgICA8aDM+My4gIENvbmZpZ3VyZSBUb21jYXQncyBSZXNvdXJjZSBGYWN0b3J5PC9oMz4KKworICAgIDxwPlRvIGNvbmZpZ3VyZSBUb21jYXQncyByZXNvdXJjZSBmYWN0b3J5LCBhZGQgYW4gZWxlbWVudHMgbGlrZSB0aGlzIHRvIHRoZQorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4gZmlsZSwgbmVzdGVkIGluc2lkZSB0aGUKKyAgICA8Y29kZT5Db250ZXh0PC9jb2RlPiBlbGVtZW50IGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi48L3A+Cis8c291cmNlPgorJmx0O0NvbnRleHQgLi4uJmd0OworICAuLi4KKyAgJmx0O1Jlc291cmNlIG5hbWU9Im1haWwvU2Vzc2lvbiIgYXV0aD0iQ29udGFpbmVyIgorICAgICAgICAgICAgdHlwZT0iamF2YXgubWFpbC5TZXNzaW9uIgorICAgICAgICAgICAgbWFpbC5zbXRwLmhvc3Q9ImxvY2FsaG9zdCIvJmd0OworICAuLi4KKyZsdDsvQ29udGV4dCZndDsKKzwvc291cmNlPgorCisgICAgPHA+Tm90ZSB0aGF0IHRoZSByZXNvdXJjZSBuYW1lIChoZXJlLCA8Y29kZT5tYWlsL1Nlc3Npb248L2NvZGU+KSBtdXN0CisgICAgbWF0Y2ggdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAgICBDdXN0b21pemUgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5tYWlsLnNtdHAuaG9zdDwvY29kZT4gcGFyYW1ldGVyIHRvCisgICAgcG9pbnQgYXQgdGhlIHNlcnZlciB0aGF0IHByb3ZpZGVzIFNNVFAgc2VydmljZSBmb3IgeW91ciBuZXR3b3JrLjwvcD4KKworICAgIDxoMz40LiAgSW5zdGFsbCB0aGUgSmF2YU1haWwgbGlicmFyaWVzPC9oMz4KKworICAgIDxwPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamF2YW1haWwvZG93bmxvYWRzL2luZGV4Lmh0bWwiIHRhcmdldD0iX2JsYW5rIj4KKyAgICBEb3dubG9hZCB0aGUgSmF2YU1haWwgQVBJPC9hPi4gIFRoZSBKYXZhTWFpbCBBUEkgcmVxdWlyZXMgdGhlIEphdmEgQWN0aXZhdGlvbgorICAgIEZyYW1ld29yayAoSkFGKSBBUEkgYXMgd2VsbC4gIFRoZSBKYXZhIEFjdGl2YXRpb24gRnJhbWV3b3JrIGNhbiBiZSBkb3dubG9hZGVkCisgICAgZnJvbSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2phdmFiZWFucy9nbGFzZ293L2phZi5odG1sIj5TdW4ncyBzaXRlPC9hPi4KKyAgICA8L3A+CisKKyAgICA8cD5UaGlzIGRvd25sb2FkIGluY2x1ZGVzIDIgdml0YWwgbGlicmFyaWVzIGZvciB0aGUgY29uZmlndXJhdGlvbjsgCisgICAgYWN0aXZhdGlvbi5qYXIgYW5kIG1haWwuamFyLiBVbnBhY2thZ2UgYm90aCBkaXN0cmlidXRpb25zIGFuZCBwbGFjZSAKKyAgICB0aGVtIGludG8gJENBVEFMSU5BX0hPTUUvY29tbW9uL2xpYiBzbyB0aGF0IHRoZXkgYXJlIGF2YWlsYWJsZSB0bworICAgIFRvbWNhdCBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBtYWlsIFNlc3Npb24gUmVzb3VyY2UuCisgICAgPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBwbGFjaW5nIHRoZXNlIGphcnMgaW4gYm90aCBjb21tb24vbGliIGFuZCBhIAorICAgIHdlYiBhcHBsaWNhdGlvbidzIGxpYiBmb2xkZXIgd2lsbCBjYXVzZSBhbiBlcnJvciwgc28gZW5zdXJlIHlvdSBoYXZlCisgICAgdGhlbSBpbiB0aGUgJENBVEFMSU5BX0hPTUUvY29tbW9uL2xpYiBsb2NhdGlvbiBvbmx5LgorICAgIDwvcD4KKworICAgIDxoMz5FeGFtcGxlIEFwcGxpY2F0aW9uPC9oMz4KKworICAgIDxwPlRoZSA8Y29kZT4vZXhhbXBsZXM8L2NvZGU+IGFwcGxpY2F0aW9uIGluY2x1ZGVkIHdpdGggVG9tY2F0IGNvbnRhaW5zCisgICAgYW4gZXhhbXBsZSBvZiB1dGlsaXppbmcgdGhpcyByZXNvdXJjZSBmYWN0b3J5LiAgSXQgaXMgYWNjZXNzZWQgdmlhIHRoZQorICAgICJKU1AgRXhhbXBsZXMiIGxpbmsuICBUaGUgc291cmNlIGNvZGUgZm9yIHRoZSBzZXJ2bGV0IHRoYXQgYWN0dWFsbHkKKyAgICBzZW5kcyB0aGUgbWFpbCBtZXNzYWdlIGlzIGluCisgICAgPGNvZGU+L1dFQi1JTkYvY2xhc3Nlcy9TZW5kTWFpbFNlcnZsZXQuamF2YTwvY29kZT4uPC9wPgorCisgICAgPHA+PHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+IC0gVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBhc3N1bWVzIHRoYXQKKyAgICB0aGVyZSBpcyBhbiBTTVRQIHNlcnZlciBsaXN0aW5nIG9uIHBvcnQgMjUgb24gPGNvZGU+bG9jYWxob3N0PC9jb2RlPi4KKyAgICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgZWRpdCB0aGUKKyAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3NlcnZlci54bWw8L2NvZGU+IGZpbGUsIGFuZCBtb2RpZnkgdGhlCisgICAgcGFyYW1ldGVyIHZhbHVlIGZvciB0aGUgPGNvZGU+bWFpbC5zbXRwLmhvc3Q8L2NvZGU+IHBhcmFtZXRlciB0byBiZQorICAgIHRoZSBob3N0IG5hbWUgb2YgYW4gU01UUCBzZXJ2ZXIgb24geW91ciBuZXR3b3JrLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSkRCQyBEYXRhIFNvdXJjZXMiPgorCisgICAgPGgzPjAuICBJbnRyb2R1Y3Rpb248L2gzPgorCisgICAgPHA+TWFueSB3ZWIgYXBwbGljYXRpb25zIG5lZWQgdG8gYWNjZXNzIGEgZGF0YWJhc2UgdmlhIGEgSkRCQyBkcml2ZXIsCisgICAgdG8gc3VwcG9ydCB0aGUgZnVuY3Rpb25hbGl0eSByZXF1aXJlZCBieSB0aGF0IGFwcGxpY2F0aW9uLiAgVGhlIEoyRUUKKyAgICBQbGF0Zm9ybSBTcGVjaWZpY2F0aW9uIHJlcXVpcmVzIEoyRUUgQXBwbGljYXRpb24gU2VydmVycyB0byBtYWtlCisgICAgYXZhaWxhYmxlIGEgPGVtPkRhdGFTb3VyY2U8L2VtPiBpbXBsZW1lbnRhdGlvbiAodGhhdCBpcywgYSBjb25uZWN0aW9uCisgICAgcG9vbCBmb3IgSkRCQyBjb25uZWN0aW9ucykgZm9yIHRoaXMgcHVycG9zZS4gIFRvbWNhdCA1IG9mZmVycyBleGFjdGx5CisgICAgdGhlIHNhbWUgc3VwcG9ydCwgc28gdGhhdCBkYXRhYmFzZS1iYXNlZCBhcHBsaWNhdGlvbnMgeW91IGRldmVsb3Agb24KKyAgICBUb21jYXQgdXNpbmcgdGhpcyBzZXJ2aWNlIHdpbGwgcnVuIHVuY2hhbmdlZCBvbiBhbnkgSjJFRSBzZXJ2ZXIuPC9wPgorCisgICAgPHA+Rm9yIGluZm9ybWF0aW9uIGFib3V0IEpEQkMsIHlvdSBzaG91bGQgY29uc3VsdCB0aGUgZm9sbG93aW5nOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRiYy8iPmh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRiYy88L2E+IC0KKyAgICAgICAgSG9tZSBwYWdlIGZvciBpbmZvcm1hdGlvbiBhYm91dCBKYXZhIERhdGFiYXNlIENvbm5lY3Rpdml0eS48L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvamRiYy9zcGVjMi9qZGJjMi4xLmZyYW1lLmh0bWwiPmh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9qZGJjL3NwZWMyL2pkYmMyLjEuZnJhbWUuaHRtbDwvYT4gLQorICAgICAgICBUaGUgSkRCQyAyLjEgQVBJIFNwZWNpZmljYXRpb24uPC9saT4KKyAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGJjL2pkYmMyMC5zdGRleHQucGRmIj5odHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkYmMvamRiYzIwLnN0ZGV4dC5wZGY8L2E+IC0KKyAgICAgICAgVGhlIEpEQkMgMi4wIFN0YW5kYXJkIEV4dGVuc2lvbiBBUEkgKGluY2x1ZGluZyB0aGUKKyAgICAgICAgPGNvZGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L2NvZGU+IEFQSSkuICBUaGlzIHBhY2thZ2UgaXMgbm93IGtub3duCisgICAgICAgIGFzIHRoZSAiSkRCQyBPcHRpb25hbCBQYWNrYWdlIi48L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZG93bmxvYWQuaHRtbCI+aHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2Rvd25sb2FkLmh0bWw8L2E+IC0KKyAgICAgICAgVGhlIEoyRUUgUGxhdGZvcm0gU3BlY2lmaWNhdGlvbiAoY292ZXJzIHRoZSBKREJDIGZhY2lsaXRpZXMgdGhhdAorICAgICAgICBhbGwgSjJFRSBwbGF0Zm9ybXMgbXVzdCBwcm92aWRlIHRvIGFwcGxpY2F0aW9ucykuPC9saT4KKyAgICA8L3VsPgorCisgICAgPHA+PHN0cm9uZz5OT1RFPC9zdHJvbmc+IC0gVGhlIGRlZmF1bHQgZGF0YSBzb3VyY2Ugc3VwcG9ydCBpbiBUb21jYXQKKyAgICBpcyBiYXNlZCBvbiB0aGUgPHN0cm9uZz5EQkNQPC9zdHJvbmc+IGNvbm5lY3Rpb24gcG9vbCBmcm9tIHRoZQorICAgIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucyI+SmFrYXJ0YSBDb21tb25zPC9hPgorICAgIHN1YnByb2plY3QuICBIb3dldmVyLCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgYW55IG90aGVyIGNvbm5lY3Rpb24gcG9vbAorICAgIHRoYXQgaW1wbGVtZW50cyA8Y29kZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvY29kZT4sIGJ5IHdyaXRpbmcgeW91cgorICAgIG93biBjdXN0b20gcmVzb3VyY2UgZmFjdG9yeSwgYXMgZGVzY3JpYmVkCisgICAgPGEgaHJlZj0iI0FkZGluZyBDdXN0b20gUmVzb3VyY2UgRmFjdG9yaWVzIj5iZWxvdzwvYT4uPC9wPgorCisgICAgPGgzPjEuICBJbnN0YWxsIFlvdXIgSkRCQyBEcml2ZXI8L2gzPgorCisgICAgPHA+VXNlIG9mIHRoZSA8ZW0+SkRCQyBEYXRhIFNvdXJjZXM8L2VtPiBKTkRJIFJlc291cmNlIEZhY3RvcnkgcmVxdWlyZXMKKyAgICB0aGF0IHlvdSBtYWtlIGFuIGFwcHJvcHJpYXRlIEpEQkMgZHJpdmVyIGF2YWlsYWJsZSB0byBib3RoIFRvbWNhdCBpbnRlcm5hbAorICAgIGNsYXNzZXMgYW5kIHRvIHlvdXIgd2ViIGFwcGxpY2F0aW9uLiAgVGhpcyBpcyBtb3N0IGVhc2lseSBhY2NvbXBsaXNoZWQgYnkKKyAgICBpbnN0YWxsaW5nIHRoZSBkcml2ZXIncyBKQVIgZmlsZShzKSBpbnRvIHRoZQorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbW1vbi9saWI8L2NvZGU+IGRpcmVjdG9yeSwgd2hpY2ggbWFrZXMgdGhlIGRyaXZlcgorICAgIGF2YWlsYWJsZSBib3RoIHRvIHRoZSByZXNvdXJjZSBmYWN0b3J5IGFuZCB0byB5b3VyIGFwcGxpY2F0aW9uLjwvcD4KKworICAgIDxoMz4yLiAgRGVjbGFyZSBZb3VyIFJlc291cmNlIFJlcXVpcmVtZW50czwvaDM+CisKKyAgICA8cD5OZXh0LCBtb2RpZnkgdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAgICAoPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4pIHRvIGRlY2xhcmUgdGhlIEpOREkgbmFtZSB1bmRlcgorICAgIHdoaWNoIHlvdSB3aWxsIGxvb2sgdXAgcHJlY29uZmlndXJlZCBkYXRhIHNvdXJjZS4gIEJ5IGNvbnZlbnRpb24sIGFsbCBzdWNoCisgICAgbmFtZXMgc2hvdWxkIHJlc29sdmUgdG8gdGhlIDxjb2RlPmpkYmM8L2NvZGU+IHN1YmNvbnRleHQgKHJlbGF0aXZlIHRvIHRoZQorICAgIHN0YW5kYXJkIDxjb2RlPmphdmE6Y29tcC9lbnY8L2NvZGU+IG5hbWluZyBjb250ZXh0IHRoYXQgaXMgdGhlIHJvb3Qgb2YKKyAgICBhbGwgcHJvdmlkZWQgcmVzb3VyY2UgZmFjdG9yaWVzLiAgQSB0eXBpY2FsIDxjb2RlPndlYi54bWw8L2NvZGU+IGVudHJ5CisgICAgbWlnaHQgbG9vayBsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KKyZsdDtyZXNvdXJjZS1yZWYmZ3Q7CisgICZsdDtkZXNjcmlwdGlvbiZndDsKKyAgICBSZXNvdXJjZSByZWZlcmVuY2UgdG8gYSBmYWN0b3J5IGZvciBqYXZhLnNxbC5Db25uZWN0aW9uCisgICAgaW5zdGFuY2VzIHRoYXQgbWF5IGJlIHVzZWQgZm9yIHRhbGtpbmcgdG8gYSBwYXJ0aWN1bGFyCisgICAgZGF0YWJhc2UgdGhhdCBpcyBjb25maWd1cmVkIGluIHRoZSBzZXJ2ZXIueG1sIGZpbGUuCisgICZsdDsvZGVzY3JpcHRpb24mZ3Q7CisgICZsdDtyZXMtcmVmLW5hbWUmZ3Q7CisgICAgamRiYy9FbXBsb3llZURCCisgICZsdDsvcmVzLXJlZi1uYW1lJmd0OworICAmbHQ7cmVzLXR5cGUmZ3Q7CisgICAgamF2YXguc3FsLkRhdGFTb3VyY2UKKyAgJmx0Oy9yZXMtdHlwZSZndDsKKyAgJmx0O3Jlcy1hdXRoJmd0OworICAgIENvbnRhaW5lcgorICAmbHQ7L3Jlcy1hdXRoJmd0OworJmx0Oy9yZXNvdXJjZS1yZWYmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPjxzdHJvbmc+V0FSTklORzwvc3Ryb25nPiAtIEJlIHN1cmUgeW91IHJlc3BlY3QgdGhlIGVsZW1lbnQgb3JkZXJpbmcKKyAgICB0aGF0IGlzIHJlcXVpcmVkIGJ5IHRoZSBEVEQgZm9yIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIQorICAgIFNlZSB0aGUKKyAgICA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL3NlcnZsZXQvZG93bmxvYWQuaHRtbCI+U2VydmxldAorICAgIFNwZWNpZmljYXRpb248L2E+IGZvciBkZXRhaWxzLjwvcD4KKworICAgIDxoMz4zLiAgQ29kZSBZb3VyIEFwcGxpY2F0aW9uJ3MgVXNlIE9mIFRoaXMgUmVzb3VyY2U8L2gzPgorCisgICAgPHA+QSB0eXBpY2FsIHVzZSBvZiB0aGlzIHJlc291cmNlIHJlZmVyZW5jZSBtaWdodCBsb29rIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorQ29udGV4dCBpbml0Q3R4ID0gbmV3IEluaXRpYWxDb250ZXh0KCk7CitDb250ZXh0IGVudkN0eCA9IChDb250ZXh0KSBpbml0Q3R4Lmxvb2t1cCgiamF2YTpjb21wL2VudiIpOworRGF0YVNvdXJjZSBkcyA9IChEYXRhU291cmNlKQorICBlbnZDdHgubG9va3VwKCJqZGJjL0VtcGxveWVlREIiKTsKKworQ29ubmVjdGlvbiBjb25uID0gZHMuZ2V0Q29ubmVjdGlvbigpOworLi4uIHVzZSB0aGlzIGNvbm5lY3Rpb24gdG8gYWNjZXNzIHRoZSBkYXRhYmFzZSAuLi4KK2Nvbm4uY2xvc2UoKTsKKzwvc291cmNlPgorCisgICAgPHA+Tm90ZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiB1c2VzIHRoZSBzYW1lIHJlc291cmNlIHJlZmVyZW5jZSBuYW1lCisgICAgdGhhdCB3YXMgZGVjbGFyZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBUaGlzCisgICAgaXMgbWF0Y2hlZCB1cCBhZ2FpbnN0IHRoZSByZXNvdXJjZSBmYWN0b3J5IHRoYXQgaXMgY29uZmlndXJlZCBpbgorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4sIGFzIGRlc2NyaWJlZCBiZWxvdy48L3A+CisKKyAgICA8aDM+NC4gIENvbmZpZ3VyZSBUb21jYXQncyBSZXNvdXJjZSBGYWN0b3J5PC9oMz4KKworICAgIDxwPlRvIGNvbmZpZ3VyZSBUb21jYXQncyByZXNvdXJjZSBmYWN0b3J5LCBhZGQgYW4gZWxlbWVudCBsaWtlIHRoaXMgdG8gdGhlCisgICAgPGNvZGU+L01FVEEtSU5GL2NvbnRleHQueG1sPC9jb2RlPiBmaWxlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uPC9wPgorPHNvdXJjZT4KKyZsdDtDb250ZXh0IC4uLiZndDsKKyAgLi4uCisgICZsdDtSZXNvdXJjZSBuYW1lPSJqZGJjL0VtcGxveWVlREIiIGF1dGg9IkNvbnRhaW5lciIKKyAgICAgICAgICAgIHR5cGU9ImphdmF4LnNxbC5EYXRhU291cmNlIiB1c2VybmFtZT0iZGJ1c2VybmFtZSIgcGFzc3dvcmQ9ImRicGFzc3dvcmQiCisgICAgICAgICAgICBkcml2ZXJDbGFzc05hbWU9Im9yZy5oc3FsLmpkYmNEcml2ZXIiIHVybD0iamRiYzpIeXBlcnNvbmljU1FMOmRhdGFiYXNlIgorICAgICAgICAgICAgbWF4QWN0aXZlPSI4IiBtYXhJZGxlPSI0Ii8mZ3Q7CisgIC4uLgorJmx0Oy9Db250ZXh0Jmd0OworPC9zb3VyY2U+CisKKyAgICA8cD5Ob3RlIHRoYXQgdGhlIHJlc291cmNlIG5hbWUgKGhlcmUsIDxjb2RlPmpkYmMvRW1wbG95ZWVEQjwvY29kZT4pIG11c3QKKyAgICBtYXRjaCB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yLjwvcD4KKworICAgIDxwPlRoaXMgZXhhbXBsZSBhc3N1bWVzIHRoYXQgeW91IGFyZSB1c2luZyB0aGUgSHlwZXJzb25pY1NRTCBkYXRhYmFzZQorICAgIEpEQkMgZHJpdmVyLiAgQ3VzdG9taXplIHRoZSA8Y29kZT5kcml2ZXJDbGFzc05hbWU8L2NvZGU+IGFuZAorICAgIDxjb2RlPmRyaXZlck5hbWU8L2NvZGU+IHBhcmFtZXRlcnMgdG8gbWF0Y2ggeW91ciBhY3R1YWwgZGF0YWJhc2UncworICAgIEpEQkMgZHJpdmVyIGFuZCBjb25uZWN0aW9uIFVSTC48L3A+CisKKyAgICA8cD5UaGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBUb21jYXQncyBzdGFuZGFyZCBkYXRhIHNvdXJjZQorICAgIHJlc291cmNlIGZhY3RvcnkKKyAgICAoPGNvZGU+b3JnLmFwYWNoZS50b21jYXQuZGJjcC5kYmNwLkJhc2ljRGF0YVNvdXJjZUZhY3Rvcnk8L2NvZGU+KSBhcmUKKyAgICBhcyBmb2xsb3dzOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPjxzdHJvbmc+ZHJpdmVyQ2xhc3NOYW1lPC9zdHJvbmc+IC0gRnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQorICAgICAgICBvZiB0aGUgSkRCQyBkcml2ZXIgdG8gYmUgdXNlZC48L2xpPgorICAgIDxsaT48c3Ryb25nPm1heEFjdGl2ZTwvc3Ryb25nPiAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgaW5zdGFuY2VzCisgICAgICAgIHRoYXQgY2FuIGJlIGFsbG9jYXRlZCBmcm9tIHRoaXMgcG9vbCBhdCB0aGUgc2FtZSB0aW1lLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+bWF4SWRsZTwvc3Ryb25nPiAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0CisgICAgICAgIGNhbiBzaXQgaWRsZSBpbiB0aGlzIHBvb2wgYXQgdGhlIHNhbWUgdGltZS48L2xpPgorICAgIDxsaT48c3Ryb25nPm1heFdhaXQ8L3N0cm9uZz4gLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgdGhlCisgICAgICAgIHBvb2wgd2lsbCB3YWl0ICh3aGVuIHRoZXJlIGFyZSBubyBhdmFpbGFibGUgY29ubmVjdGlvbnMpIGZvciBhCisgICAgICAgIGNvbm5lY3Rpb24gdG8gYmUgcmV0dXJuZWQgYmVmb3JlIHRocm93aW5nIGFuIGV4Y2VwdGlvbi48L2xpPgorICAgIDxsaT48c3Ryb25nPnBhc3N3b3JkPC9zdHJvbmc+IC0gRGF0YWJhc2UgcGFzc3dvcmQgdG8gYmUgcGFzc2VkIHRvIG91cgorICAgICAgICBKREJDIGRyaXZlci48L2xpPgorICAgIDxsaT48c3Ryb25nPnVybDwvc3Ryb25nPiAtIENvbm5lY3Rpb24gVVJMIHRvIGJlIHBhc3NlZCB0byBvdXIgSkRCQyBkcml2ZXIuCisgICAgICAgIChGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHRoZSBwcm9wZXJ0eSA8Y29kZT5kcml2ZXJOYW1lPC9jb2RlPgorICAgICAgICBpcyBhbHNvIHJlY29nbml6ZWQuKTwvbGk+CisgICAgPGxpPjxzdHJvbmc+dXNlcjwvc3Ryb25nPiAtIERhdGFiYXNlIHVzZXJuYW1lIHRvIGJlIHBhc3NlZCB0byBvdXIKKyAgICAgICAgSkRCQyBkcml2ZXIuPC9saT4KKyAgICA8bGk+PHN0cm9uZz52YWxpZGF0aW9uUXVlcnk8L3N0cm9uZz4gLSBTUUwgcXVlcnkgdGhhdCBjYW4gYmUgdXNlZCBieSB0aGUKKyAgICAgICAgcG9vbCB0byB2YWxpZGF0ZSBjb25uZWN0aW9ucyBiZWZvcmUgdGhleSBhcmUgcmV0dXJuZWQgdG8gdGhlCisgICAgICAgIGFwcGxpY2F0aW9uLiAgSWYgc3BlY2lmaWVkLCB0aGlzIHF1ZXJ5IE1VU1QgYmUgYW4gU1FMIFNFTEVDVAorICAgICAgICBzdGF0ZW1lbnQgdGhhdCByZXR1cm5zIGF0IGxlYXN0IG9uZSByb3cuPC9saT4KKyAgICA8L3VsPgorICAgIDxwPkZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSByZWZlciB0byB0aGUgY29tbW9ucy1kYmNwIGRvY3VtZW50YXRpb24uPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkFkZGluZyBDdXN0b20gUmVzb3VyY2UgRmFjdG9yaWVzIj4KKworICA8cD5JZiBub25lIG9mIHRoZSBzdGFuZGFyZCByZXNvdXJjZSBmYWN0b3JpZXMgbWVldCB5b3VyIG5lZWRzLCB5b3UgY2FuCisgIHdyaXRlIHlvdXIgb3duIGZhY3RvcnkgYW5kIGludGVncmF0ZSBpdCBpbnRvIFRvbWNhdCA1LCBhbmQgdGhlbiBjb25maWd1cmUKKyAgdGhlIHVzZSBvZiB0aGlzIGZhY3RvcnkgaW4gdGhlIDxjb2RlPmNvbmYvc2VydmVyLnhtbDwvY29kZT4gY29uZmlndXJhdGlvbgorICBmaWxlLiAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHdlIHdpbGwgY3JlYXRlIGEgZmFjdG9yeSB0aGF0IG9ubHkga25vd3MgaG93CisgIHRvIGNyZWF0ZSA8Y29kZT5jb20ubXljb21wYW55Lk15QmVhbjwvY29kZT4gYmVhbnMsIGZyb20gdGhlCisgIDxhIGhyZWY9IiNHZW5lcmljIEphdmFCZWFuIFJlc291cmNlcyI+R2VuZXJpYyBKYXZhQmVhbiBSZXNvdXJjZXM8L2E+CisgIGV4YW1wbGUsIGFib3ZlLjwvcD4KKworICA8aDM+MS4gIFdyaXRlIEEgUmVzb3VyY2UgRmFjdG9yeSBDbGFzczwvaDM+CisKKyAgPHA+WW91IG11c3Qgd3JpdGUgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIEpOREkgc2VydmljZSBwcm92aWRlcgorICA8Y29kZT5qYXZheC5uYW1pbmcuc3BpLk9iamVjdEZhY3Rvcnk8L2NvZGU+IGludGVmYWNlLiAgRXZlcnkgdGltZSB5b3VyCisgIHdlYiBhcHBsaWNhdGlvbiBjYWxscyA8Y29kZT5sb29rdXAoKTwvY29kZT4gb24gYSBjb250ZXh0IGVudHJ5IHRoYXQgaXMKKyAgYm91bmQgdG8gdGhpcyBmYWN0b3J5LCB0aGUgPGNvZGU+Z2V0T2JqZWN0SW5zdGFuY2UoKTwvY29kZT4gbWV0aG9kIGlzCisgIGNhbGxlZCwgd2l0aCB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czo8L3A+CisgIDx1bD4KKyAgPGxpPjxzdHJvbmc+T2JqZWN0IG9iajwvc3Ryb25nPiAtIFRoZSAocG9zc2libHkgbnVsbCkgb2JqZWN0IGNvbnRhaW5pbmcKKyAgICAgIGxvY2F0aW9uIG9yIHJlZmVyZW5jZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIGNyZWF0aW5nIGFuCisgICAgICBvYmplY3QuICBGb3IgVG9tY2F0LCB0aGlzIHdpbGwgYWx3YXlzIGJlIGFuIG9iamVjdCBvZiB0eXBlCisgICAgICA8Y29kZT5qYXZheC5uYW1pbmcuUmVmZXJlbmNlPC9jb2RlPiwgd2hpY2ggY29udGFpbnMgdGhlIGNsYXNzIG5hbWUKKyAgICAgIG9mIHRoaXMgZmFjdG9yeSBjbGFzcywgYXMgd2VsbCBhcyB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzCisgICAgICAoZnJvbSA8Y29kZT5jb25mL3NlcnZlci54bWw8L2NvZGU+KSB0byB1c2UgaW4gY3JlYXRpbmcgb2JqZWN0cworICAgICAgdG8gYmUgcmV0dXJuZWQuPC9saT4KKyAgPGxpPjxzdHJvbmc+TmFtZSBuYW1lPC9zdHJvbmc+IC0gVGhlIG5hbWUgdG8gd2hpY2ggdGhpcyBmYWN0b3J5IGlzIGJvdW5kCisgICAgICByZWxhdGl2ZSB0byA8Y29kZT5uYW1lQ3R4PC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gbmFtZQorICAgICAgaXMgc3BlY2lmaWVkLjwvbGk+CisgIDxsaT48c3Ryb25nPkNvbnRleHQgbmFtZUN0eDwvc3Ryb25nPiAtIFRoZSBjb250ZXh0IHJlbGF0aXZlIHRvIHdoaWNoIHRoZQorICAgICAgPGNvZGU+bmFtZTwvY29kZT4gcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAgICAgIDxjb2RlPm5hbWU8L2NvZGU+IGlzIHJlbGF0aXZlIHRvIHRoZSBkZWZhdWx0IGluaXRpYWwgY29udGV4dC48L2xpPgorICA8bGk+PHN0cm9uZz5IYXNodGFibGUgZW52aXJvbm1lbnQ8L3N0cm9uZz4gLSBUaGUgKHBvc3NpYmx5IG51bGwpCisgICAgICBlbnZpcm9ubWVudCB0aGF0IGlzIHVzZWQgaW4gY3JlYXRpbmcgdGhpcyBvYmplY3QuICBUaGlzIGlzIGdlbmVyYWxseQorICAgICAgaWdub3JlZCBpbiBUb21jYXQgb2JqZWN0IGZhY3Rvcmllcy48L2xpPgorICA8L3VsPgorCisgIDxwPlRvIGNyZWF0ZSBhIHJlc291cmNlIGZhY3RvcnkgdGhhdCBrbm93cyBob3cgdG8gcHJvZHVjZSA8Y29kZT5NeUJlYW48L2NvZGU+CisgIGluc3RhbmNlcywgeW91IG1pZ2h0IGNyZWF0ZSBhIGNsYXNzIGxpa2UgdGhpczo8L3A+CisKKzxzb3VyY2U+CitwYWNrYWdlIGNvbS5teWNvbXBhbnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZBZGRyOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZlcmVuY2U7CitpbXBvcnQgamF2YXgubmFtaW5nLnNwaS5PYmplY3RGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgTXlCZWFuRmFjdG9yeSBpbXBsZW1lbnRzIE9iamVjdEZhY3RvcnkgeworCisgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0SW5zdGFuY2UoT2JqZWN0IG9iaiwKKyAgICAgIE5hbWUgbmFtZSwgQ29udGV4dCBuYW1lQ3R4LCBIYXNodGFibGUgZW52aXJvbm1lbnQpCisgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgLy8gQWNxdWlyZSBhbiBpbnN0YW5jZSBvZiBvdXIgc3BlY2lmaWVkIGJlYW4gY2xhc3MKKyAgICAgIE15QmVhbiBiZWFuID0gbmV3IE15QmVhbigpOworCisgICAgICAvLyBDdXN0b21pemUgdGhlIGJlYW4gcHJvcGVydGllcyBmcm9tIG91ciBhdHRyaWJ1dGVzCisgICAgICBSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgb2JqOworICAgICAgRW51bWVyYXRpb24gYWRkcnMgPSByZWYuZ2V0QWxsKCk7CisgICAgICB3aGlsZSAoYWRkcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICBSZWZBZGRyIGFkZHIgPSAoUmVmQWRkcikgYWRkcnMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICBTdHJpbmcgbmFtZSA9IGFkZHIuZ2V0VHlwZSgpOworICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGFkZHIuZ2V0Q29udGVudCgpOworICAgICAgICAgIGlmIChuYW1lLmVxdWFscygiZm9vIikpIHsKKyAgICAgICAgICAgICAgYmVhbi5zZXRGb28odmFsdWUpOworICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImJhciIpKSB7CisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICBiZWFuLnNldEJhcihJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSk7CisgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uKCJJbnZhbGlkICdiYXInIHZhbHVlICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFJldHVybiB0aGUgY3VzdG9taXplZCBpbnN0YW5jZQorICAgICAgcmV0dXJuIChiZWFuKTsKKworICB9CisKK30KKzwvc291cmNlPgorCisgIDxwPkluIHRoaXMgZXhhbXBsZSwgd2UgYXJlIHVuY29uZGl0aW9uYWxseSBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBvZgorICB0aGUgPGNvZGU+Y29tLm15Y29tcGFueS5NeUJlYW48L2NvZGU+IGNsYXNzLCBhbmQgcG9wdWxhdGluZyBpdHMgcHJvcGVydGllcworICBiYXNlZCBvbiB0aGUgcGFyYW1ldGVycyBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+Jmx0O1Jlc291cmNlUGFyYW1zJmd0OzwvY29kZT4KKyAgZWxlbWVudCB0aGF0IGNvbmZpZ3VyZXMgdGhpcyBmYWN0b3J5IChzZWUgYmVsb3cpLiAgWW91IHNob3VsZCBub3RlIHRoYXQgYW55CisgIHBhcmFtZXRlciBuYW1lZCA8Y29kZT5mYWN0b3J5PC9jb2RlPiBzaG91bGQgYmUgc2tpcHBlZCAtIHRoYXQgcGFyYW1ldGVyIGlzCisgIHVzZWQgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZmFjdG9yeSBjbGFzcyBpdHNlbGYgKGluIHRoaXMgY2FzZSwKKyAgPGNvZGU+Y29tLm15Y29tcGFueS5NeUJlYW5GYWN0b3J5PC9jb2RlPikgcmF0aGVyIHRoYW4gYSBwcm9wZXJ0eSBvZiB0aGUKKyAgYmVhbiBiZWluZyBjb25maWd1cmVkLjwvcD4KKworICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCA8Y29kZT5PYmplY3RGYWN0b3J5PC9jb2RlPiwgc2VlIHRoZQorICA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2puZGkvZG9jcy5odG1sIj5KTkRJIDEuMiBTZXJ2aWNlCisgIFByb3ZpZGVyIEludGVyZmFjZSAoU1BJKSBTcGVjaWZpY2F0aW9uPC9hPi48L3A+CisKKyAgPHA+WW91IHdpbGwgbmVlZCB0byBjb21waWxlIHRoaXMgY2xhc3MgYWdhaW5zdCBhIGNsYXNzIHBhdGggdGhhdCBpbmNsdWRlcworICBhbGwgb2YgdGhlIEpBUiBmaWxlcyBpbiB0aGUgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29tbW9uL2xpYjwvY29kZT4gYW5kCisgIDxjb2RlPiRDQVRBTElOQV9IT01FL3NlcnZlci9saWI8L2NvZGU+IGRpcmVjdG9yaWVzLiAgV2hlbiB5b3UgYXJlIHRocm91Z2gsCisgIHBsYWNlIHRoZSBmYWN0b3J5IGNsYXNzIChhbmQgdGhlIGNvcnJlc3BvbmRpbmcgYmVhbiBjbGFzcykgdW5wYWNrZWQgdW5kZXIKKyAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29tbW9uL2NsYXNzZXM8L2NvZGU+LCBvciBpbiBhIEpBUiBmaWxlIGluc2lkZQorICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb21tb24vbGliPC9jb2RlPi4gIEluIHRoaXMgd2F5LCB0aGUgcmVxdWlyZWQgY2xhc3MKKyAgZmlsZXMgYXJlIHZpc2libGUgdG8gYm90aCBDYXRhbGluYSBpbnRlcm5hbCByZXNvdXJjZXMgYW5kIHlvdXIgd2ViCisgIGFwcGxpY2F0aW9uLjwvcD4KKworICA8aDM+Mi4gIERlY2xhcmUgWW91ciBSZXNvdXJjZSBSZXF1aXJlbWVudHM8L2gzPgorCisgIDxwPk5leHQsIG1vZGlmeSB5b3VyIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAgKDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+KSB0byBkZWNsYXJlIHRoZSBKTkRJIG5hbWUgdW5kZXIgd2hpY2gKKyAgeW91IHdpbGwgcmVxdWVzdCBuZXcgaW5zdGFuY2VzIG9mIHRoaXMgYmVhbi4gIFRoZSBzaW1wbGVzdCBhcHByb2FjaCBpcworICB0byB1c2UgYSA8Y29kZT4mbHQ7cmVzb3VyY2UtZW52LXJlZiZndDs8L2NvZGU+IGVsZW1lbnQsIGxpa2UgdGhpczo8L3A+CisKKzxzb3VyY2U+CismbHQ7cmVzb3VyY2UtZW52LXJlZiZndDsKKyAgJmx0O2Rlc2NyaXB0aW9uJmd0OworICAgIE9iamVjdCBmYWN0b3J5IGZvciBNeUJlYW4gaW5zdGFuY2VzLgorICAmbHQ7L2Rlc2NyaXB0aW9uJmd0OworICAmbHQ7cmVzb3VyY2UtZW52LXJlZi1uYW1lJmd0OworICAgIGJlYW4vTXlCZWFuRmFjdG9yeQorICAmbHQ7L3Jlc291cmNlLWVudi1yZWYtbmFtZSZndDsKKyAgJmx0O3Jlc291cmNlLWVudi1yZWYtdHlwZSZndDsKKyAgICBjb20ubXljb21wYW55Lk15QmVhbgorICAmbHQ7L3Jlc291cmNlLWVudi1yZWYtdHlwZSZndDsKKyZsdDtyZXNvdXJjZS1lbnYtcmVmJmd0OworPC9zb3VyY2U+CisKKyAgICA8cD48c3Ryb25nPldBUk5JTkc8L3N0cm9uZz4gLSBCZSBzdXJlIHlvdSByZXNwZWN0IHRoZSBlbGVtZW50IG9yZGVyaW5nCisgICAgdGhhdCBpcyByZXF1aXJlZCBieSB0aGUgRFREIGZvciB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9ycyEKKyAgICBTZWUgdGhlCisgICAgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0L2Rvd25sb2FkLmh0bWwiPlNlcnZsZXQKKyAgICBTcGVjaWZpY2F0aW9uPC9hPiBmb3IgZGV0YWlscy48L3A+CisKKyAgPGgzPjMuICBDb2RlIFlvdXIgQXBwbGljYXRpb24ncyBVc2UgT2YgVGhpcyBSZXNvdXJjZTwvaDM+CisKKyAgPHA+QSB0eXBpY2FsIHVzZSBvZiB0aGlzIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBtaWdodCBsb29rCisgIGxpa2UgdGhpczo8L3A+CisKKzxzb3VyY2U+CitDb250ZXh0IGluaXRDdHggPSBuZXcgSW5pdGlhbENvbnRleHQoKTsKK0NvbnRleHQgZW52Q3R4ID0gKENvbnRleHQpIGluaXRDdHgubG9va3VwKCJqYXZhOmNvbXAvZW52Iik7CitNeUJlYW4gYmVhbiA9IChNeUJlYW4pIGVudkN0eC5sb29rdXAoImJlYW4vTXlCZWFuRmFjdG9yeSIpOworCit3cml0ZXIucHJpbnRsbigiZm9vID0gIiArIGJlYW4uZ2V0Rm9vKCkgKyAiLCBiYXIgPSAiICsKKyAgICAgICAgICAgICAgIGJlYW4uZ2V0QmFyKCkpOworPC9zb3VyY2U+CisKKyAgICA8aDM+NC4gIENvbmZpZ3VyZSBUb21jYXQncyBSZXNvdXJjZSBGYWN0b3J5PC9oMz4KKworICAgIDxwPlRvIGNvbmZpZ3VyZSBUb21jYXQncyByZXNvdXJjZSBmYWN0b3J5LCBhZGQgYW4gZWxlbWVudHMgbGlrZSB0aGlzIHRvIHRoZQorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4gZmlsZSwgbmVzdGVkIGluc2lkZSB0aGUKKyAgICA8Y29kZT5Db250ZXh0PC9jb2RlPiBlbGVtZW50IGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi48L3A+Cis8c291cmNlPgorJmx0O0NvbnRleHQgLi4uJmd0OworICAuLi4KKyAgJmx0O1Jlc291cmNlIG5hbWU9ImJlYW4vTXlCZWFuRmFjdG9yeSIgYXV0aD0iQ29udGFpbmVyIgorICAgICAgICAgICAgdHlwZT0iY29tLm15Y29tcGFueS5NeUJlYW4iCisgICAgICAgICAgICBmYWN0b3J5PSJjb20ubXljb21wYW55Lk15QmVhbkZhY3RvcnkiCisgICAgICAgICAgICBiYXI9IjIzIi8mZ3Q7CisgIC4uLgorJmx0Oy9Db250ZXh0Jmd0OworPC9zb3VyY2U+CisKKyAgICA8cD5Ob3RlIHRoYXQgdGhlIHJlc291cmNlIG5hbWUgKGhlcmUsIDxjb2RlPmJlYW4vTXlCZWFuRmFjdG9yeTwvY29kZT4KKyAgICBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CisgICAgZGVzY3JpcHRvci4gIFdlIGFyZSBhbHNvIGluaXRpYWxpemluZyB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmJhcjwvY29kZT4KKyAgICBwcm9wZXJ0eSwgd2hpY2ggd2lsbCBjYXVzZSA8Y29kZT5zZXRCYXIoMjMpPC9jb2RlPiB0byBiZSBjYWxsZWQgYmVmb3JlCisgICAgdGhlIG5ldyBiZWFuIGlzIHJldHVybmVkLiAgQmVjYXVzZSB3ZSBhcmUgbm90IGluaXRpYWxpemluZyB0aGUKKyAgICA8Y29kZT5mb288L2NvZGU+IHByb3BlcnR5IChhbHRob3VnaCB3ZSBjb3VsZCBoYXZlKSwgdGhlIGJlYW4gd2lsbAorICAgIGNvbnRhaW4gd2hhdGV2ZXIgZGVmYXVsdCB2YWx1ZSBpcyBzZXQgdXAgYnkgaXRzIGNvbnN0cnVjdG9yLjwvcD4KKworICAgIDxwPllvdSB3aWxsIGFsc28gbm90ZSB0aGF0LCBmcm9tIHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIncyBwZXJzcGVjdGl2ZSwKKyAgICB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSwgYW5kIHRoZSBwcm9ncmFtbWluZworICAgIHVzZWQgdG8gcmVxdWVzdCBuZXcgaW5zdGFuY2VzLCBpcyBpZGVudGljYWwgdG8gdGhlIGFwcHJvYWNoIHVzZWQgZm9yIHRoZQorICAgIDxlbT5HZW5lcmljIEphdmFCZWFuIFJlc291cmNlczwvZW0+IGV4YW1wbGUuICBUaGlzIGlsbHVzdHJhdGVzIG9uZSBvZiB0aGUKKyAgICBhZHZhbnRhZ2VzIG9mIHVzaW5nIEpOREkgcmVzb3VyY2VzIHRvIGVuY2Fwc3VsYXRlIGZ1bmN0aW9uYWxpdHkgLSB5b3UgY2FuCisgICAgY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIHdpdGhvdXQgbmVjZXNzYXJpbHkgaGF2aW5nIHRvCisgICAgbW9kaWZ5IGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgcmVzb3VyY2VzLCBhcyBsb25nIGFzIHlvdSBtYWludGFpbgorICAgIGNvbXBhdGlibGUgQVBJcy48L3A+CisKKzwvc2VjdGlvbj4KKworCisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvbG9nZ2luZy54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2xvZ2dpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NWRiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2xvZ2dpbmcueG1sCkBAIC0wLDAgKzEsMzM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0ibG9nZ2luZy5odG1sIj4KKworICAgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDx0aXRsZT5Mb2dnaW5nIGluIFRvbWNhdDwvdGl0bGU+CisgICAgPGF1dGhvcj5BbGxpc3RhaXIgQ3Jvc3NsZXk8L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSJ5b2F2c0BhcGFjaGUub3JnIj5Zb2F2IFNoYXBpcmE8L2F1dGhvcj4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworICA8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorICA8cD4KKyAgICBUb21jYXQgNS41IHVzZXMgCisgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2xvZ2dpbmciPkNvbW1vbnMgTG9nZ2luZzwvYT4KKyAgICB0aHJvdWdob3V0IGl0cyBpbnRlcm5hbCBjb2RlIGFsbG93aW5nIHRoZSAKKyAgICBkZXZlbG9wZXIgdG8gY2hvb3NlIGEgbG9nZ2luZyBjb25maWd1cmF0aW9uIHRoYXQgc3VpdHMgdGhlaXIgbmVlZHMsIGUuZworICAgIGphdmEudXRpbC5sb2dnaW5nIG9yIAorICAgIDxhIGhyZWY9Imh0dHA6Ly9sb2dnaW5nLmFwYWNoZS5vcmcvbG9nNGoiPkxvZzRKPC9hPi4gCisgICAgQ29tbW9ucyBMb2dnaW5nIHByb3ZpZGVzIFRvbWNhdCB0aGUgYWJpbGl0eSB0byBsb2cKKyAgICBoaWVyYXJjaGlhbGx5IGFjcm9zcyB2YXJpb3VzIGxvZyBsZXZlbHMgd2l0aG91dCBuZWVkaW5nIHRvIHJlbHkgb24gYSBwYXJ0aWN1bGFyCisgICAgbG9nZ2luZyBpbXBsZW1lbnRhdGlvbi4KKyAgPC9wPgorICA8cD4KKyAgICBBbiBpbXBvcnRhbnQgY29uc2VxdWVuY2UgZm9yIFRvbWNhdCA1LjUgaXMgdGhhdCB0aGUgJmx0O0xvZ2dlciZndDsgZWxlbWVudCBmb3VuZCBpbiAKKyAgICBwcmV2aW91cyB2ZXJzaW9ucyB0byBjcmVhdGUgYSA8Y29kZT5sb2NhbGhvc3RfbG9nPC9jb2RlPiBpcyBubyBsb25nZXIgYSB2YWxpZCBuZXN0ZWQgZWxlbWVudCAKKyAgICBvZiAmbHQ7Q29udGV4dCZndDsuIEluc3RlYWQsIHRoZSBkZWZhdWx0IFRvbWNhdCBjb25maWd1cmF0aW9uIHdpbGwgdXNlIGphdmEudXRpbC5sb2dnaW5nLiAKKyAgICBJZiB0aGUgZGV2ZWxvcGVyIHdpc2hlcyB0byBjb2xsZWN0IGRldGFpbGVkIGludGVybmFsIFRvbWNhdCBsb2dnaW5nIChpLmUgd2hhdCBpcyBoYXBwZW5pbmcgCisgICAgd2l0aGluIHRoZSBUb21jYXQgZW5naW5lKSwgdGhlbiB0aGV5IHNob3VsZCBjb25maWd1cmUgYSBsb2dnaW5nIHN5c3RlbSBzdWNoIGFzIGphdmEudXRpbC5sb2dnaW5nIAorICAgIG9yIGxvZzRqIGFzIGRldGFpbGVkIG5leHQuCisgIDwvcD4KKworICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0ibG9nNGoiPgorICAgIDxwPgorICAgICAgVG9tY2F0IDUuNSBoYXMgZG9uZSBhd2F5IHdpdGggPGNvZGU+bG9jYWxob3N0X2xvZzwvY29kZT4gd2hpY2ggeW91IG1heSBiZSBmYW1pbGlhciB3aXRoCisgICAgICBhcyB0aGUgcnVudGltZSBleGNlcHRpb24vc3RhY2sgdHJhY2UgbG9nLiBUaGVzZSB0eXBlcyBvZiBlcnJvciBhcmUgdXN1YWxseSB0aHJvd24KKyAgICAgIGJ5IHVuY2F1Z2h0IGV4Y2VwdGlvbnMsIGJ1dCBhcmUgc3RpbGwgdmFsdWFibGUgdG8gdGhlIGRldmVsb3Blci4gVGhleSBjYW4gbm93IGJlCisgICAgICBmb3VuZCBpbiB0aGUgPGNvZGU+c3Rkb3V0PC9jb2RlPiBsb2cuCisgICAgPC9wPgorCisgICAgPHA+CisgICAgICBJZiB5b3UgbmVlZCB0byBzZXR1cCBjcm9zcy1jb250ZXh0IGRldGFpbGVkIGxvZ2dpbmcgZnJvbSB3aXRoaW4gVG9tY2F0J3MgY29kZSwgCisgICAgICB0aGVuIHlvdSBjYW4gdXNlIGEgc2ltcGxlIGxvZzRqIGNvbmZpZ3VyYXRpb24uIE5vdGUgdGhhdCB0aGlzIGxvZ2dpbmcgdmFuIGJlIHZlcnkgCisgICAgICB2ZXJib3NlIGRlcGVuZGluZyBvbiB0aGUgbG9nIGxldmVsIHlvdSBjaG9zZSB0byB1c2UuICBOb3RlIGFsc28gdGhhdCBhIGxvZzRqIGxvZ2dpbmcgCisgICAgICBjb25maWd1cmF0aW9uIGlzIG5vdCBnb2luZyB0byBwcm9kdWNlIHN0YWNrIHRyYWNlIHR5cGUgbG9nZ2luZzogdGhvc2Ugc3RhY2sgdHJhY2VzCisgICAgICBhcmUgb3V0cHV0IHRvIDxjb2RlPnN0ZG91dDwvY29kZT4gYXMgZGlzY3Vzc2VkIGFib3ZlLgorICAgIDwvcD4KKworICAgIDxwPgorICAgICAgRm9sbG93IHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gc2V0dXAgYSBmaWxlIG5hbWVkIHRvbWNhdC5sb2cgdGhhdCBoYXMgaW50ZXJuYWwgCisgICAgICBUb21jYXQgbG9nZ2luZyBvdXRwdXQgdG8gaXQ6CisgICAgPC9wPgorCisgICAgPHA+CisgICAgICA8b2w+CisgICAgICAgIDxsaT5DcmVhdGUgYSBmaWxlIGNhbGxlZCBsb2c0ai5wcm9wZXJ0aWVzIHdpdGggdGhlIGZvbGxvd2luZyBjb250ZW50IAorICAgICAgICAgICAgYW5kIHNhdmUgaXQgaW50byBjb21tb24vY2xhc3Nlcy4KKyAgICAgICAgICA8c291cmNlPgorICAgICAgICAgICAgbG9nNGoucm9vdExvZ2dlcj1ERUJVRywgUiA8YnIgLz4KKyAgICAgICAgICAgIGxvZzRqLmFwcGVuZGVyLlI9b3JnLmFwYWNoZS5sb2c0ai5Sb2xsaW5nRmlsZUFwcGVuZGVyIDxiciAvPgorICAgICAgICAgICAgbG9nNGouYXBwZW5kZXIuUi5GaWxlPSR7Y2F0YWxpbmEuaG9tZX0vbG9ncy90b21jYXQubG9nIDxiciAvPgorICAgICAgICAgICAgbG9nNGouYXBwZW5kZXIuUi5NYXhGaWxlU2l6ZT0xME1CIDxiciAvPgorICAgICAgICAgICAgbG9nNGouYXBwZW5kZXIuUi5NYXhCYWNrdXBJbmRleD0xMCA8YnIgLz4KKyAgICAgICAgICAgIGxvZzRqLmFwcGVuZGVyLlIubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dCA8YnIgLz4KKyAgICAgICAgICAgIGxvZzRqLmFwcGVuZGVyLlIubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVwICV0ICVjIC0gJW0lbgorICAgICAgICAgIDwvc291cmNlPgorCTwvbGk+CisKKwk8bGk+PGEgaHJlZj0iaHR0cDovL2xvZ2dpbmcuYXBhY2hlLm9yZy9sb2c0aiI+RG93bmxvYWQgTG9nNEo8L2E+IAorICAgICAgICAgICAgKHYxLjIgb3IgbGF0ZXIpIGFuZCBwbGFjZSB0aGUgbG9nNGogamFyIGluICRDQVRBTElOQV9IT01FL2NvbW1vbi9saWIuPC9saT4KKworICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9zaXRlL2Rvd25sb2Fkcy9kb3dubG9hZHNfY29tbW9ucy1sb2dnaW5nLmNnaSI+CisgICAgICAgICAgICBEb3dubG9hZCBDb21tb25zIExvZ2dpbmc8L2E+IGFuZCBwbGFjZSB0aGUgY29tbW9ucy1sb2dnaW5nLmphciAKKyAgICAgICAgICAgIChub3QgY29tbW9ucy1sb2dnaW5nLWFwaS5qYXIpIGluICRDQVRBTElOQV9IT01FL2NvbW1vbi9saWIgd2l0aCAKKyAgICAgICAgICAgIHRoZSBsb2c0aiBqYXIuPC9saT4KKworCTxsaT5TdGFydCBUb21jYXQ8L2xpPgorICAgICAgPC9vbD4KKyAgICA8L3A+CisKKyAgICA8cD4KKyAgICAgIFRoaXMgbG9nNGogY29uZmlndXJhdGlvbiBzZXRzIHVwIGEgZmlsZSBjYWxsZWQgdG9tY2F0LmxvZyBpbiB5b3VyIAorICAgICAgVG9tY2F0IGxvZ3MgZm9sZGVyIHdpdGggYSBtYXhpbXVtIGZpbGUgc2l6ZSBvZiAxME1CIGFuZAorICAgICAgdXAgdG8gMTAgYmFja3Vwcy4gIERFQlVHIGxldmVsIGlzIHNwZWNpZmllZCB3aGljaCB3aWxsIHJlc3VsdCBpbiB0aGUgCisgICAgICBtb3N0IHZlcmJvc2Ugb3V0cHV0IGZyb20gVG9tY2F0LgorICAgIDwvcD4KKwkKKyAgICA8cD4KKyAgICAgIFlvdSBjYW4gKGFuZCBzaG91bGQpIGJlIG1vcmUgcGlja3kgYWJvdXQgd2hpY2ggcGFja2FnZXMgdG8gaW5jbHVkZSAKKyAgICAgIGluIHRoZSBsb2dnaW5nLiBUb21jYXQgNS41IHVzZXMgZGVmaW5lcyBsb2dnZXJzIGJ5IEVuZ2luZSBhbmQgSG9zdCBuYW1lcy4KKyAgICAgIEZvciBleGFtcGxlLCBmb3IgYSBkZWZhdWx0IENhdGFsaW5hIGxvY2FsaG9zdCBsb2csIGFkZCB0aGlzIHRvIHRoZQorICAgICAgZW5kIG9mIHRoZSBsb2c0ai5wcm9wZXJ0aWVzIGFib3ZlLiBOb3RlIHRoYXQgdGhlcmUgYXJlIGtub3duIGlzc3VlcyB3aXRoIAorICAgICAgdXNpbmcgdGhpcyBuYW1pbmcgY29udmVudGlvbiAod2l0aCBzcXVhcmUgYnJhY2tldHMpIGluIGxvZzRqIFhNTCBiYXNlZAorICAgICAgY29uZmlndXJhdGlvbiBmaWxlcywgc28gd2UgcmVjb21tZW5kIHlvdSB1c2UgYSBwcm9wZXJ0aWVzIGZpbGUgYXMgZGVzY3JpYmVkCisgICAgICB1bnRpbCBhIGZ1dHVyZSB2ZXJzaW9uIG9mIGxvZzRqIGFsbG93cyB0aGlzIGNvbnZlbnRpb24uCisgICAgICAKKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPmxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQ29udGFpbmVyQmFzZS5bQ2F0YWxpbmFdLltsb2NhbGhvc3RdPURFQlVHLCBSPC9saT4KKwk8bGk+bG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZT1ERUJVRywgUjwvbGk+CisJPGxpPmxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb249REVCVUcsIFI8L2xpPgorICAgICAgPC91bD4KKworICAgICAgQmUgd2FybmVkIGEgbGV2ZWwgb2YgREVCVUcgd2lsbCBwcm9kdWNlIG1lZ2FieXRlcyBvZiBsb2dnaW5nIGFuZCBzbG93IHN0YXJ0dXAKKyAgICAgIG9mIFRvbWNhdC4gVGhpcyBsZXZlbCBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkgd2hlbiBkZWJ1Z2dpbmcgb2YgaW50ZXJuYWwgVG9tY2F0CisgICAgICBvcGVyYXRpb25zIGlzIHJlcXVpcmVkLgorICAgIDwvcD4KKwkKKyAgICA8cD4KKyAgICAgIFlvdXIgd2ViIGFwcGxpY2F0aW9ucyBzaG91bGQgY2VydGFpbmx5IHVzZSB0aGVpciBvd24gbG9nNGogY29uZmlndXJhdGlvbi4gCisgICAgICBUaGlzIGlzIHZhbGlkIDxpPndpdGg8L2k+IHRoZSBhYm92ZSBjb25maWd1cmF0aW9uLiAgWW91IHdvdWxkIHBsYWNlIGEgc2ltaWxhciBsb2c0ai5wcm9wZXJ0aWVzIAorICAgICAgZmlsZSBpbiB5b3VyIHdlYiBhcHBsaWNhdGlvbidzIFdFQi1JTkYvY2xhc3NlcyBmb2xkZXIsIGFuZCBsb2c0ajEuMi44LmphciBpbnRvCisgICAgICBXRUItSU5GL2xpYi4gVGhlbiBzcGVjaWZ5IHlvdXIgcGFja2FnZSBsZXZlbCBsb2dnaW5nLiBUaGlzIGlzIGEgYmFzaWMgc2V0dXAgb2YgbG9nNGogCisgICAgICB3aGljaCBkb2VzICpub3QqIHJlcXVpcmUgQ29tbW9ucy1Mb2dnaW5nLCAKKyAgICAgIGFuZCB5b3Ugc2hvdWxkIGNvbnN1bHQgdGhlIAorICAgICAgPGEgaHJlZj0iaHR0cDovL2xvZ2dpbmcuYXBhY2hlLm9yZy9sb2c0ai9kb2NzL2RvY3VtZW50YXRpb24uaHRtbCI+bG9nNGogZG9jdW1lbnRhdGlvbjwvYT4gCisgICAgICBmb3IgbW9yZSBvcHRpb25zLiAgVGhpcyBwYWdlIGlzIGludGVuZGVkIG9ubHkgYXMgYSBib290c3RyYXBwaW5nIGd1aWRlLgorICAgIDwvcD4KKwkKKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uIG5hbWU9ImphdmEudXRpbC5sb2dnaW5nIj4KKworICA8cD4KKyAgICBJbiBvcmRlciB0byBjb25maWd1cmUgSkRLIGxvZ2dpbmcgeW91IHNob3VsZCBoYXZlIEpESyAxLjQrLiBUb21jYXQgNS41IGlzIGludGVuZGVkIGZvcgorICAgIEpESyA1LjAgb3IgbGF0ZXIsIGJ1dCBjYW4gYmUgcnVuIG9uIEpESyAxLjQgdXNpbmcgYSBjb21wYXRpYmlsaXR5IHBhY2thZ2UuCisgIDwvcD4KKyAgPHA+CisgICAgVGhlIGRlZmF1bHQgaW1wbGVtZW5hdGF0aW9uIG9mIGphdmEudXRpbC5sb2dnaW5nIHByb3ZpZGVkIGluIHRoZSBKREsgaXMgdG9vIGxpbWl0ZWQgdG8gYmUgCisgICAgdXNlZnVsLiBBIGxpbWl0YXRpb24gb2YgSkRLIExvZ2dpbmcgYXBwZWFycyB0byBiZSB0aGUgaW5hYmlsaXR5IHRvIGhhdmUgcGVyLXdlYiBhcHBsaWNhdGlvbiBsb2dnaW5nLCAKKyAgICBhcyB0aGUgY29uZmlndXJhdGlvbiBpcyBwZXItVk0uIEFzIGEgcmVzdWx0LCBUb21jYXQgd2lsbCwgaW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwKKyAgICByZXBsYWNlIHRoZSBkZWZhdWx0IExvZ01hbmFnZXIgaW1wbGVtZW50YXRpb24gd2l0aCBhIGNvbnRhaW5lciBmcmllbmRseSBpbXBsZW1lbnRhdGlvbgorICAgIGNhbGxlZCBKVUxJLCB3aGljaCBhZGRyZXNzZXMgdGhlc2Ugc2hvcnRjb21pbmdzLiBJdCBzdXBwb3J0cyB0aGUgc2FtZSBjb25maWd1cmF0aW9uIG1lY2hhbmlzbXMgCisgICAgYXMgdGhlIHN0YW5kYXJkIEpESyBqYXZhLnV0aWwubG9nZ2luZywgdXNpbmcgZWl0aGVyIGEgcHJvZ3JhbW1hdGljIGFwcHJvYWNoLCBvciBwcm9wZXJ0aWVzCisgICAgZmlsZXMuIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhhdCBwZXItY2xhc3Nsb2FkZXIgcHJvcGVydGllcyBmaWxlcyBjYW4gYmUgc2V0ICh3aGljaCBlbmFibGVzIGVhc3kKKyAgICByZWRlcGxveW1lbnQgZnJpZW5kbHkgd2ViYXBwIGNvbmZpZ3VyYXRpb24pLCBhbmQgdGhlIHByb3BlcnRpZXMgZmlsZXMgc3VwcG9ydCBzbGlnaHRseSBleHRlbmRlZAorICAgIGNvbnN0cnVjdHMgd2hpY2ggYWxsb3dzIG1vcmUgZnJlZWRvbSBmb3IgZGVmaW5pbmcgaGFuZGxlcnMgYW5kIGFzc2lnbmluZyB0aGVtIHRvIGxvZ2dlcnMuCisgIDwvcD4KKyAgPHA+CisgICAgSlVMSSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gVG9tY2F0IDUuNSwgYW5kIHN1cHBvcnRzIHBlciBjbGFzc2xvYWRlciBjb25maWd1cmF0aW9uLCBpbiBhZGRpdGlvbiB0byAKKyAgICB0aGUgcmVndWxhciBnbG9iYWwgamF2YS51dGlsLmxvZ2dpbmcgY29uZmlndXJhdGlvbi4gVGhpcyBtZWFucyB0aGF0IGxvZ2dpbmcgY2FuIGJlIGNvbmZpZ3VyZWQgYXQgCisgICAgdGhlIGZvbGxvd2luZyBsYXllcnM6CisgICAgPHVsPgorICAgICAgPGxpPkluIHRoZSBKREsncyBsb2dnaW5nLnByb3BlcnRpZXMgZmlsZS4gQ2hlY2sKKyAgICAgIHlvdXIgSkFWQV9IT01FIGVudmlyb25tZW50IHNldHRpbmcgdG8gc2VlIHdoaWNoIEpESyBUb21jYXQgaXMgdXNpbmcgKG9yIG1heWJlIEpSRSA1LjAgYXMgVG9tY2F0CisgICAgICBjYW4gbm93IHJ1biBvbiBhIEpSRSBmcm9tIHZlcnNpb24gNS41KS4gVGhlIGZpbGUgd2lsbCBiZSBpbiA8Y29kZT4kSkFWQV9IT01FL2pyZS9saWI8L2NvZGU+LgorICAgICAgQWx0ZXJuYXRlbHksIGl0IGNhbiBhbHNvIHVzZSBhIGdsb2JhbCBjb25maWd1cmF0aW9uIGZpbGUgbG9jYXRlZCBlbHNld2hlcmUgYnkgdXNpbmcgdGhlIAorICAgICAgc3lzdGVtIHByb3BlcnR5IDxjb2RlPmphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPC9jb2RlPiwgb3IgcHJvZ3JhbW1hdGljIGNvbmZpZ3VyYXRpb24gdXNpbmcKKyAgICAgIDxjb2RlPmphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5jbGFzczwvY29kZT4uPC9saT4KKyAgICAgIDxsaT5JbiBlYWNoIGNsYXNzbG9hZGVyIHVzaW5nIGEgbG9nZ2luZy5wcm9wZXJ0aWVzIGZpbGUuIFRoaXMgbWVhbnMgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEKKyAgICAgIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBUb21jYXQgY29yZSwgYXMgd2VsbCBhcyBzZXBhcmF0ZSBjb25maWd1cmF0aW9ucyBmb3IgZWFjaCB3ZWJhcHBzIHdoaWNoIHdpbGwgCisgICAgICBoYXZlIHRoZSBzYW1lIGxpZmVjeWNsZSBhcyB0aGUgd2ViYXBwcy48L2xpPgorICAgIDwvdWw+CisgIDwvcD4KKyAgPHA+CisgICAgVGhlIGRlZmF1bHQgbG9nZ2luZy5wcm9wZXJ0aWVzIHNwZWNpZmllcyBhIENvbnNvbGVIYW5kbGVyIGZvciByb3V0aW5nIGxvZ2dpbmcgdG8gc3Rkb3V0IGFuZAorICAgIGFsc28gYSBGaWxlSGFuZGxlci4gQSBoYW5kbGVyJ3MgbG9nIGxldmVsIHRocmVzaG9sZCBjYW4gYmUgc2V0IHVzaW5nIFNFVkVSRSwgQ09ORklHLCBJTkZPLCAKKyAgICBXQVJOLCBGSU5FLCBGSU5FU1Qgb3IgQUxMLiBUaGUgbG9nZ2luZy5wcm9wZXJ0aWVzIHNoaXBwZWQgd2l0aCBKREsgaXMgc2V0IHRvIElORk8uIFlvdQorICAgIGNhbiBhbHNvIHRhcmdldCBzcGVjaWZpYyBwYWNrYWdlcyB0byBjb2xsZWN0IGxvZ2dpbmcgZnJvbSBhbmQgc3BlY2lmeSBhIGxldmVsLiBIZXJlIGlzIGhvdworICAgIHlvdSB3b3VsZCBzZXQgZGVidWdnaW5nIGZyb20gVG9tY2F0LiBZb3Ugd291bGQgbmVlZCB0byBlbnN1cmUgdGhlIENvbnNvbGVIYW5kbGVyJ3MgbGV2ZWwgaXMgYWxzbworICAgIHNldCB0byBjb2xsZWN0IHRoaXMgdGhyZXNob2xkLCBzbyBGSU5FU1Qgb3IgQUxMIHNob3VsZCBiZSBzZXQuIFBsZWFzZSByZWZlciB0byBTdW4ncyBqYXZhLnV0aWwubG9nZ2luZworICAgIGRvY3VtZW50YXRpb24gZm9yIHRoZSBjb21wbGV0ZSBkZXRhaWxzLgorICA8L3A+CisgIDxwPgorICAgIDxzb3VyY2U+b3JnLmFwYWNoZS5jYXRhbGluYS5sZXZlbD1GSU5FU1Q8L3NvdXJjZT4KKyAgPC9wPgorICA8cD4KKyAgICBUaGUgY29uZmlndXJhdGlvbiB1c2VkIGJ5IEpVTEkgaXMgZXh0cmVtZWx5IHNpbWlsYXIsIGJ1dCB1c2VzIGEgZmV3IGV4dGVuc2lvbnMgdG8gYWxsb3cgYmV0dGVyIAorICAgIGZsZXhpYmlsaXR5IGluIGFzc2lnbmluZyBsb2dnZXJzLiBUaGUgbWFpbiBkaWZmZXJlbmNlcyBhcmU6CisgICAgPHVsPgorICAgICAgPGxpPkEgcHJlZml4IG1heSBiZSBhZGRlZCB0byBoYW5kbGVyIG5hbWVzLCBzbyB0aGF0IG11bHRpcGxlIGhhbmRsZXJzIG9mIGEgc2luZ2xlIGNsYXNzIG1heSBiZSAKKyAgICAgIGluc3RhbnRpYXRlZC4gQSBwcmVmaXggaXMgYSBTdHJpbmcgd2hpY2ggc3RhcnRzIHdpdGggYSBkaWdpdCwgYW5kIGVuZHMgd2l0aCAnLicuIEZvciBleGFtcGxlLCAKKyAgICAgIDxjb2RlPjIyZm9vYmFyLjwvY29kZT4gaXMgYSB2YWxpZCBwcmVmaXguPC9saT4KKyAgICAgIDxsaT5BcyBpbiBKYXZhIDUuMCwgbG9nZ2VycyBjYW4gZGVmaW5lIGEgbGlzdCBvZiBoYW5kbGVycyB1c2luZyB0aGUgPGNvZGU+bG9nZ2VyTmFtZS5oYW5kbGVyczwvY29kZT4KKyAgICAgIHByb3BlcnR5LjwvbGk+CisgICAgICA8bGk+QnkgZGVmYXVsdCwgbG9nZ2VycyB3aWxsIG5vdCBkZWxlZ2F0ZSB0byB0aGVpciBwYXJlbnQgaWYgdGhleSBoYXZlIGFzc29jaWF0ZWQgaGFuZGxlcnMuIFRoaXMKKyAgICAgIG1heSBiZSBjaGFuZ2VkIHBlciBsb2dnZXIgdXNpbmcgdGhlIDxjb2RlPmxvZ2dlck5hbWUudXNlUGFyZW50SGFuZGxlcnM8L2NvZGU+IHByb3BlcnR5LCB3aGljaCBhY2NlcHRzIAorICAgICAgYSBib29sZWFuIHZhbHVlLjwvbGk+CisgICAgICA8bGk+VGhlIHJvb3QgbG9nZ2VyIGNhbiBkZWZpbmUgaXRzIHNldCBvZiBoYW5kbGVycyB1c2luZyBhIDxjb2RlPi5oYW5kbGVyczwvY29kZT4gcHJvcGVydHkuPC9saT4KKyAgICAgIDxsaT5TeXN0ZW0gcHJvcGVydHkgcmVwbGFjZW1lbnQgZm9yIHByb3BlcnR5IHZhbHVlcyB3aGljaCBzdGFydCB3aXRoICR7c3l0c3RlbVByb3BlcnR5TmFtZX0uPC9saT4KKyAgICA8L3VsPgorICA8L3A+CisgIDxwPgorICAgIEV4YW1wbGUgbG9nZ2luZy5wcm9wZXJ0aWVzIGZpbGUgdG8gYmUgcGxhY2VkIGluIGNvbW1vbi9jbGFzc2VzOgorICAgIDxzb3VyY2U+CitoYW5kbGVycyA9IDFjYXRhbGluYS5vcmcuYXBhY2hlLmp1bGkuRmlsZUhhbmRsZXIsIDJsb2NhbGhvc3Qub3JnLmFwYWNoZS5qdWxpLkZpbGVIYW5kbGVyLCBcCisgICAgICAgICAgIDNtYW5hZ2VyLm9yZy5hcGFjaGUuanVsaS5GaWxlSGFuZGxlciwgNGFkbWluLm9yZy5hcGFjaGUuanVsaS5GaWxlSGFuZGxlciwgXAorICAgICAgICAgICBqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlcgorCisuaGFuZGxlcnMgPSAxY2F0YWxpbmEub3JnLmFwYWNoZS5qdWxpLkZpbGVIYW5kbGVyLCBqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlcgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgSGFuZGxlciBzcGVjaWZpYyBwcm9wZXJ0aWVzLgorIyBEZXNjcmliZXMgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBpbmZvIGZvciBIYW5kbGVycy4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisxY2F0YWxpbmEub3JnLmFwYWNoZS5qdWxpLkZpbGVIYW5kbGVyLmxldmVsID0gRklORQorMWNhdGFsaW5hLm9yZy5hcGFjaGUuanVsaS5GaWxlSGFuZGxlci5kaXJlY3RvcnkgPSAke2NhdGFsaW5hLmJhc2V9L2xvZ3MKKzFjYXRhbGluYS5vcmcuYXBhY2hlLmp1bGkuRmlsZUhhbmRsZXIucHJlZml4ID0gY2F0YWxpbmEuCisKKzJsb2NhbGhvc3Qub3JnLmFwYWNoZS5qdWxpLkZpbGVIYW5kbGVyLmxldmVsID0gRklORQorMmxvY2FsaG9zdC5vcmcuYXBhY2hlLmp1bGkuRmlsZUhhbmRsZXIuZGlyZWN0b3J5ID0gJHtjYXRhbGluYS5iYXNlfS9sb2dzCisybG9jYWxob3N0Lm9yZy5hcGFjaGUuanVsaS5GaWxlSGFuZGxlci5wcmVmaXggPSBsb2NhbGhvc3QuCisKKzNtYW5hZ2VyLm9yZy5hcGFjaGUuanVsaS5GaWxlSGFuZGxlci5sZXZlbCA9IEZJTkUKKzNtYW5hZ2VyLm9yZy5hcGFjaGUuanVsaS5GaWxlSGFuZGxlci5kaXJlY3RvcnkgPSAke2NhdGFsaW5hLmJhc2V9L2xvZ3MKKzNtYW5hZ2VyLm9yZy5hcGFjaGUuanVsaS5GaWxlSGFuZGxlci5wcmVmaXggPSBtYW5hZ2VyLgorCis0YWRtaW4ub3JnLmFwYWNoZS5qdWxpLkZpbGVIYW5kbGVyLmxldmVsID0gRklORQorNGFkbWluLm9yZy5hcGFjaGUuanVsaS5GaWxlSGFuZGxlci5kaXJlY3RvcnkgPSAke2NhdGFsaW5hLmJhc2V9L2xvZ3MKKzRhZG1pbi5vcmcuYXBhY2hlLmp1bGkuRmlsZUhhbmRsZXIucHJlZml4ID0gYWRtaW4uCisKK2phdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmxldmVsID0gRklORQoramF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyID0gamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEZhY2lsaXR5IHNwZWNpZmljIHByb3BlcnRpZXMuCisjIFByb3ZpZGVzIGV4dHJhIGNvbnRyb2wgZm9yIGVhY2ggbG9nZ2VyLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK29yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5Db250YWluZXJCYXNlLltDYXRhbGluYV0uW2xvY2FsaG9zdF0ubGV2ZWwgPSBJTkZPCitvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQ29udGFpbmVyQmFzZS5bQ2F0YWxpbmFdLltsb2NhbGhvc3RdLmhhbmRsZXJzID0gXAorICAgMmxvY2FsaG9zdC5vcmcuYXBhY2hlLmp1bGkuRmlsZUhhbmRsZXIKKworb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkNvbnRhaW5lckJhc2UuW0NhdGFsaW5hXS5bbG9jYWxob3N0XS5bL21hbmFnZXJdLmxldmVsID0gSU5GTworb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkNvbnRhaW5lckJhc2UuW0NhdGFsaW5hXS5bbG9jYWxob3N0XS5bL21hbmFnZXJdLmhhbmRsZXJzID0gXAorICAgM21hbmFnZXIub3JnLmFwYWNoZS5qdWxpLkZpbGVIYW5kbGVyCisKK29yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5Db250YWluZXJCYXNlLltDYXRhbGluYV0uW2xvY2FsaG9zdF0uWy9hZG1pbl0ubGV2ZWwgPSBJTkZPCitvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQ29udGFpbmVyQmFzZS5bQ2F0YWxpbmFdLltsb2NhbGhvc3RdLlsvYWRtaW5dLmhhbmRsZXJzID0gXAorICAgNGFkbWluLm9yZy5hcGFjaGUuanVsaS5GaWxlSGFuZGxlcgorCisjIEZvciBleGFtcGxlLCBzZXQgdGhlIGNvbS54eXouZm9vIGxvZ2dlciB0byBvbmx5IGxvZyBTRVZFUkUKKyMgbWVzc2FnZXM6Cisjb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNvbnRleHRDb25maWcubGV2ZWwgPSBGSU5FCisjb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkhvc3RDb25maWcubGV2ZWwgPSBGSU5FCisjb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLk1hbmFnZXJCYXNlLmxldmVsID0gRklORQorICAgIDwvc291cmNlPgorICAgIDwvcD4KKyAgICAKKyAgICA8cD4KKyAgICAgIEV4YW1wbGUgbG9nZ2luZy5wcm9wZXJ0aWVzIGZvciB0aGUgc2VydmxldC1leGFtcGxlcyB3ZWIgYXBwbGljYXRpb24gdG8gYmUgcGxhY2VkCisgICAgICBpbiBXRUItSU5GL2NsYXNzZXMgaW5zaWRlIHRoZSB3ZWIgYXBwbGljYXRpb246CisgICAgICA8c291cmNlPgoraGFuZGxlcnMgPSBvcmcuYXBhY2hlLmp1bGkuRmlsZUhhbmRsZXIsIGphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBIYW5kbGVyIHNwZWNpZmljIHByb3BlcnRpZXMuCisjIERlc2NyaWJlcyBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGluZm8gZm9yIEhhbmRsZXJzLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK29yZy5hcGFjaGUuanVsaS5GaWxlSGFuZGxlci5sZXZlbCA9IEZJTkUKK29yZy5hcGFjaGUuanVsaS5GaWxlSGFuZGxlci5kaXJlY3RvcnkgPSAke2NhdGFsaW5hLmJhc2V9L2xvZ3MKK29yZy5hcGFjaGUuanVsaS5GaWxlSGFuZGxlci5wcmVmaXggPSBzZXJ2bGV0LWV4YW1wbGVzLgorCitqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5sZXZlbCA9IEZJTkUKK2phdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmZvcm1hdHRlciA9IGphdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlcgorICAgICAgPC9zb3VyY2U+CisgICAgPC9wPgorCisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSJIYW5kbGVyIFByb3BlcnRpZXMiPgorICAgIDxwPgorICAgICAgVG9tY2F0J3MgSlVMSSBpbXBsZW1lbnRhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgYSBmdWxseS1mZWF0dXJlZCBsb2dnaW5nIGxpYmFyeSwgb25seQorICAgICAgYSBzaW1wbGUgYnJpZGdlIHRvIHRob3NlIGxpYnJhcmllcy4gIEhvd2V2ZXIsIEpVTEkgZG9lcyBwcm92aWRlIHNldmVyYWwgcHJvcGVydGllcworICAgICAgZm9yIGNvbmZpZ3VyaW5nIHRoZSBpdHMgaGFuZGxlcnMuICBUaGVzZSBhcmUgbGlzdGVkIGJlbG93LgorICAgIDwvcD4KKyAgICAKKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJGaWxlSGFuZGxlciI+CisgICAgICA8YXR0cmlidXRlcz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXJlY3RvcnkiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgICAgPHA+CisgICAgICAgICAgICBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBsb2cgZmlsZSB3aWxsIGJlIHdyaXR0ZW4uICBUaGUgVG9tY2F0IHNlcnZlciBhY2NvdW50CisgICAgICAgICAgICBzaG91bGQgaGF2ZSB3cml0ZSBwZXJtaXNzaW9ucyB0byB0aGlzIGRpcmVjdG9yeS4gIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMKKyAgICAgICAgICAgIHByb3BlcnR5IGlzIDxlbT5sb2dzPC9lbT4uCisgICAgICAgICAgPC9wPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByZWZpeCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgICA8cD4KKyAgICAgICAgICAgIFRoZSBsb2cgZmlsZSBuYW1lIHByZWZpeC4gIFRoaXMgaXMgdGhlIHBvcnRpb24gb2YgdGhlIGxvZyBmaWxlIG5hbWUgYmVmb3JlIHRoZSBkYXRlLiAgCisgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IGlzIDxlbT5qdWxpLjwvZW0+LgorICAgICAgICAgIDwvcD4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdWZmaXgiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgICAgPHA+CisgICAgICAgICAgICBUaGUgbG9nIGZpbGUgbmFtZSBzdWZmaXguICBUaGlzIGlzIHRoZSBwb3J0aW9uIG9mIHRoZSBsb2cgZmlsZSBuYW1lIGFmdGVyIHRoZSBkYXRlLgorICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpcyA8ZW0+LmxvZzwvZW0+LgorICAgICAgICAgIDwvcD4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsZXZlbCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgICA8cD4KKyAgICAgICAgICAgIFRoZSB0aHJlc2hvbGQgbGV2ZWwgZm9yIHRoaXMgaGFuZGxlci4gIEl0IG11c3QgYmUgb25lIG9mIHRoZSBsZXZlbHMgaW4gdGhlIAorICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvdXRpbC9sb2dnaW5nL0xldmVsLmh0bWwiPmphdmEudXRpbC5sb2dnaW5nLkxldmVsPC9hPiBjbGFzcy4KKyAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaXMgPGVtPkFMTDwvZW0+LiAgTWVzc2FnZXMgd2hvc2UgbGV2ZWwgaXMgYmVsb3cKKyAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgbGV2ZWwgd2lsbCBub3QgYmUgd3JpdHRlbiB0byB0aGUgZmlsZS4KKyAgICAgICAgICA8L3A+CisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsdGVyIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICAgIDxwPgorICAgICAgICAgICAgVGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSAKKyAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3V0aWwvbG9nZ2luZy9GaWx0ZXIuaHRtbCI+amF2YS51dGlsLmxvZ2dpbmcuRmlsdGVyPC9hPiAKKyAgICAgICAgICAgIGludGVyZmFjZS4gIEpVTEkgd2lsbCBsb2FkIHRoaXMgY2xhc3MgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoaXMgaGFuZGxlciB0byBmaWx0ZXIgaXRzIG1lc3NhZ2VzLgorICAgICAgICAgICAgQnkgZGVmYXVsdCwgdGhlcmUgaXMgbm8gRmlsdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlci4gICAgICAgICAgICAKKyAgICAgICAgICA8L3A+CisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9ybWF0dGVyIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICAgIDxwPgorICAgICAgICAgICAgVGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZQorICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvdXRpbC9sb2dnaW5nL0Zvcm1hdHRlci5odG1sIj5qYXZhLnV0aWwubG9nZ2luZy5Gb3JtYXR0ZXI8L2E+CisgICAgICAgICAgICBpbnRlcmZhY2UuICBKVUxJIHdpbGwgbG9hZCB0aGlzIGNsYXNzIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGlzIGhhbmRsZXIgdG8gZm9ybWF0IGl0cyBtZXNzYWdlcy4KKyAgICAgICAgICAgIEJ5IGRlZmF1bHQsIHRoZXJlIGlzIG5vIEZvcm1hdHRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZXIuCisgICAgICAgICAgPC9wPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPC9zdWJzZWN0aW9uPiAgICAKKyAgCisgIDwvc2VjdGlvbj4KKworPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvbWFuYWdlci1ob3d0by54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL21hbmFnZXItaG93dG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZGViYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL21hbmFnZXItaG93dG8ueG1sCkBAIC0wLDAgKzEsMTI3MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9Im1hbmFnZXItaG93dG8uaHRtbCI+CisKKyAgICAmcHJvamVjdDsKKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgICAgIDx0aXRsZT5NYW5hZ2VyIEFwcCBIT1ctVE88L3RpdGxlPgorICAgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKzxzZWN0aW9uIG5hbWU9IlRhYmxlIG9mIENvbnRlbnRzIj4KKworPHA+Cis8YSBocmVmPSIjSW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L2E+PGJyIC8+Cis8YSBocmVmPSIjQ29uZmlndXJpbmcgTWFuYWdlciBBcHBsaWNhdGlvbiBBY2Nlc3MiPgorQ29uZmlndXJpbmcgTWFuYWdlciBBcHBsaWNhdGlvbiBBY2Nlc3M8L2E+PGJyIC8+Cis8YSBocmVmPSIjU3VwcG9ydGVkIE1hbmFnZXIgQ29tbWFuZHMiPlN1cHBvcnRlZCBNYW5hZ2VyIENvbW1hbmRzPC9hPjxiciAvPgorPGJsb2NrcXVvdGU+Cis8YSBocmVmPSIjRGVwbG95IEEgTmV3IEFwcGxpY2F0aW9uIFJlbW90ZWx5Ij5EZXBsb3kgQSBOZXcgQXBwbGljYXRpb24gUmVtb3RlbHk8L2E+PGJyIC8+Cis8YSBocmVmPSIjRGVwbG95IEEgTmV3IEFwcGxpY2F0aW9uIGZyb20gYSBMb2NhbCBQYXRoIj5EZXBsb3kgQSBOZXcgQXBwbGljYXRpb24gZnJvbSBhIExvY2FsIFBhdGg8L2E+PGJyIC8+Cis8YSBocmVmPSIjTGlzdCBDdXJyZW50bHkgRGVwbG95ZWQgQXBwbGljYXRpb25zIj4KK0xpc3QgQ3VycmVudGx5IERlcGxveWVkIEFwcGxpY2F0aW9uczwvYT48YnIgLz4KKzxhIGhyZWY9IiNSZWxvYWQgQW4gRXhpc3RpbmcgQXBwbGljYXRpb24iPlJlbG9hZCBBbiBFeGlzdGluZyBBcHBsaWNhdGlvbjwvYT48YnIgLz4KKzxhIGhyZWY9IiNMaXN0IE9TIGFuZCBKVk0gUHJvcGVydGllcyI+TGlzdCBPUyBhbmQgSlZNIFByb3BlcnRpZXM8L2E+PGJyIC8+Cis8YSBocmVmPSIjTGlzdCBBdmFpbGFibGUgR2xvYmFsIEpOREkgUmVzb3VyY2VzIj4KK0xpc3QgQXZhaWxhYmxlIEdsb2JhbCBKTkRJIFJlc291cmNlczwvYT48YnIgLz4KKzxhIGhyZWY9IiNMaXN0IEF2YWlsYWJsZSBTZWN1cml0eSBSb2xlcyI+TGlzdCBBdmFpbGFibGUgU2VjdXJpdHkgUm9sZXM8L2E+PGJyIC8+Cis8YSBocmVmPSIjU2Vzc2lvbiBTdGF0aXN0aWNzIj5TZXNzaW9uIFN0YXRpc3RpY3M8L2E+PGJyIC8+Cis8YSBocmVmPSIjU3RhcnQgYW4gRXhpc3RpbmcgQXBwbGljYXRpb24iPlN0YXJ0IGFuIEV4aXN0aW5nIEFwcGxpY2F0aW9uPC9hPjxiciAvPgorPGEgaHJlZj0iI1N0b3AgYW4gRXhpc3RpbmcgQXBwbGljYXRpb24iPlN0b3AgYW4gRXhpc3RpbmcgQXBwbGljYXRpb248L2E+PGJyIC8+Cis8YSBocmVmPSIjVW5kZXBsb3kgYW4gRXhpc3RpbmcgQXBwbGljYXRpb24iPgorVW5kZXBsb3kgYW4gRXhpc3RpbmcgQXBwbGljYXRpb248L2E+PGJyIC8+Cis8L2Jsb2NrcXVvdGU+Cis8YSBocmVmPSIjRXhlY3V0aW5nIE1hbmFnZXIgQ29tbWFuZHMgV2l0aCBBbnQiPgorRXhlY3V0aW5nIE1hbmFnZXIgQ29tbWFuZHMgV2l0aCBBbnQ8L2E+PGJyIC8+Cis8YSBocmVmPSIjVXNpbmcgdGhlIEpNWCBQcm94eSBTZXJ2bGV0Ij4KK1VzaW5nIHRoZSBKTVggUHJveHkgU2VydmxldDwvYT48YnIgLz4KKzxibG9ja3F1b3RlPgorPGEgaHJlZj0iI1doYXQgaXMgSk1YIFByb3h5IFNlcnZsZXQiPldoYXQgaXMgSk1YIFByb3h5IFNlcnZsZXQ/PC9hPjxiciAvPgorPGEgaHJlZj0iI0pNWCBRdWVyeSBjb21tYW5kIj5RdWVyeSBjb21tYW5kPC9hPjxiciAvPgorPGEgaHJlZj0iI0pNWCBTZXQgY29tbWFuZCI+U2V0IGNvbW1hbmQ8L2E+PGJyIC8+Cis8L2Jsb2NrcXVvdGU+Cis8L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworPHA+SW4gbWFueSBwcm9kdWN0aW9uIGVudmlyb25tZW50cywgaXQgaXMgdmVyeSB1c2VmdWwgdG8gaGF2ZSB0aGUgY2FwYWJpbGl0eQordG8gZGVwbG95IGEgbmV3IHdlYiBhcHBsaWNhdGlvbiwgb3IgdW5kZXBsb3kgYW4gZXhpc3Rpbmcgb25lLCB3aXRob3V0IGhhdmluZwordG8gc2h1dCBkb3duIGFuZCByZXN0YXJ0IHRoZSBlbnRpcmUgY29udGFpbmVyLiAgSW4gYWRkaXRpb24sIHlvdSBjYW4gcmVxdWVzdAorYW4gZXhpc3RpbmcgYXBwbGljYXRpb24gdG8gcmVsb2FkIGl0c2VsZiwgZXZlbiBpZiB5b3UgaGF2ZSBub3QgZGVjbGFyZWQgaXQKK3RvIGJlIDxjb2RlPnJlbG9hZGFibGU8L2NvZGU+IGluIHRoZSBUb21jYXQgNSBzZXJ2ZXIKK2NvbmZpZ3VyYXRpb24gZmlsZS48L3A+CisKKzxwPlRvIHN1cHBvcnQgdGhlc2UgY2FwYWJpbGl0aWVzLCBUb21jYXQgNSBpbmNsdWRlcyBhIHdlYiBhcHBsaWNhdGlvbgorKGluc3RhbGxlZCBieSBkZWZhdWx0IG9uIGNvbnRleHQgcGF0aCA8Y29kZT4vbWFuYWdlcjwvY29kZT4pIHRoYXQgc3VwcG9ydHMKK3RoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOjwvcD4KKzx1bD4KKzxsaT5EZXBsb3kgYSBuZXcgd2ViIGFwcGxpY2F0aW9uIGZyb20gdGhlIHVwbG9hZGVkIGNvbnRlbnRzIG9mIGEgV0FSIGZpbGUuPC9saT4KKzxsaT5EZXBsb3kgYSBuZXcgd2ViIGFwcGxpY2F0aW9uLCBvbiBhIHNwZWNpZmllZCBjb250ZXh0IHBhdGgsIGZyb20gdGhlCisgICAgc2VydmVyIGZpbGUgc3lzdGVtLjwvbGk+Cis8bGk+TGlzdCB0aGUgY3VycmVudGx5IGRlcGxveWVkIHdlYiBhcHBsaWNhdGlvbnMsIGFzIHdlbGwgYXMgdGhlCisgICAgc2Vzc2lvbnMgdGhhdCBhcmUgY3VycmVudGx5IGFjdGl2ZSBmb3IgdGhvc2Ugd2ViIGFwcHMuPC9saT4KKzxsaT5SZWxvYWQgYW4gZXhpc3Rpbmcgd2ViIGFwcGxpY2F0aW9uLCB0byByZWZsZWN0IGNoYW5nZXMgaW4gdGhlCisgICAgY29udGVudHMgb2YgPGNvZGU+L1dFQi1JTkYvY2xhc3NlczwvY29kZT4gb3IgPGNvZGU+L1dFQi1JTkYvbGliPC9jb2RlPi4KKyAgICA8L2xpPgorPGxpPkxpc3QgdGhlIE9TIGFuZCBKVk0gcHJvcGVydHkgdmFsdWVzLjwvbGk+Cis8bGk+TGlzdCB0aGUgYXZhaWxhYmxlIGdsb2JhbCBKTkRJIHJlc291cmNlcywgZm9yIHVzZSBpbiBkZXBsb3ltZW50CisgICAgdG9vbHMgdGhhdCBhcmUgcHJlcGFyaW5nIDxjb2RlPiZsdDtSZXNvdXJjZUxpbmsmZ3Q7PC9jb2RlPiBlbGVtZW50cworICAgIG5lc3RlZCBpbiBhIDxjb2RlPiZsdDtDb250ZXh0Jmd0OzwvY29kZT4gZGVwbG95bWVudCBkZXNjcmlwdGlvbi48L2xpPgorPGxpPkxpc3QgdGhlIGF2YWlsYWJsZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIHRoZSB1c2VyIGRhdGFiYXNlLjwvbGk+Cis8bGk+U3RhcnQgYSBzdG9wcGVkIGFwcGxpY2F0aW9uICh0aHVzIG1ha2luZyBpdCBhdmFpbGFibGUgYWdhaW4pLjwvbGk+Cis8bGk+U3RvcCBhbiBleGlzdGluZyBhcHBsaWNhdGlvbiAoc28gdGhhdCBpdCBiZWNvbWVzIHVuYXZhaWxhYmxlKSwgYnV0CisgICAgZG8gbm90IHVuZGVwbG95IGl0LjwvbGk+Cis8bGk+VW5kZXBsb3kgYSBkZXBsb3llZCB3ZWIgYXBwbGljYXRpb24gYW5kIGRlbGV0ZSBpdHMgZG9jdW1lbnQgYmFzZQorICAgIGRpcmVjdG9yeSAodW5sZXNzIGl0IHdhcyBkZXBsb3llZCBmcm9tIGZpbGUgc3lzdGVtKS48L2xpPgorPC91bD4KKworPHA+VGhlcmUgYXJlIHR3byB3YXlzIHRvIGNvbmZpZ3VyZSB0aGUgTWFuYWdlciB3ZWIgYXBwbGljYXRpb24KKzxjb2RlPkNvbnRleHQ8L2NvZGU+OgorPHVsPgorPGxpPkluc3RhbGwgdGhlIDxjb2RlPm1hbmFnZXIueG1sPC9jb2RlPiBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZQorICAgIGluIHRoZSA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL1tlbmdpbmVuYW1lXS9baG9zdG5hbWVdPC9jb2RlPiBmb2xkZXIuCis8L2xpPgorPGxpPkNvbmZpZ3VyZSB0aGUgTWFuYWdlciA8Y29kZT5Db250ZXh0PC9jb2RlPiB3aXRoaW4gdGhlCisgICAgPGNvZGU+SG9zdDwvY29kZT4gY29uZmlndXJhdGlvbiBpbiB5b3VyIFRvbWNhdCA8Y29kZT5zZXJ2ZXIueG1sPC9jb2RlPgorICAgIGNvbmZpZ3VyYXRpb24uIEhlcmUgaXMgYW4gZXhhbXBsZToKKzxwcmU+CismbHQ7Q29udGV4dCBwYXRoPSIvbWFuYWdlciIgZGVidWc9IjAiIHByaXZpbGVnZWQ9InRydWUiCisgICAgICAgICBkb2NCYXNlPSIvdXNyL2xvY2FsL2tpbmV0aWMvdG9tY2F0NS9zZXJ2ZXIvd2ViYXBwcy9tYW5hZ2VyIiZndDsKKyZsdDsvQ29udGV4dCZndDsKKzwvcHJlPgorPC9saT4KKzwvdWw+Cis8L3A+CisKKzxwPklmIHlvdSBoYXZlIFRvbWNhdCBjb25maWd1cmVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgdmlydHVhbCBob3N0cworKHdlYnNpdGVzKSB5b3Ugd291bGQgbmVlZCB0byBjb25maWd1cmUgYSBNYW5hZ2VyIGZvciBlYWNoLjwvcD4KKworPHA+VGhlcmUgYXJlIHRocmVlIHdheXMgdG8gdXNlIHRoZSA8Y29kZT5NYW5hZ2VyPC9jb2RlPiB3ZWIgYXBwbGljYXRpb24uCis8dWw+Cis8bGk+QXMgYW4gYXBwbGljYXRpb24gd2l0aCBhIHVzZXIgaW50ZXJmYWNlIHlvdSB1c2UgaW4geW91ciBicm93c2VyLgorSGVyZSBpcyBhbiBleGFtcGxlIFVSTCB3aGVyZSB5b3UgY2FuIHJlcGxhY2UgPGNvZGU+bG9jYWxob3N0PC9jb2RlPiB3aXRoCit5b3VyIHdlYnNpdGUgaG9zdCBuYW1lOiAgPGNvZGU+aHR0cDovL2xvY2FsaG9zdC9tYW5hZ2VyL2h0bWwvPC9jb2RlPiAuPC9saT4KKzxsaT5BIG1pbmltYWwgdmVyc2lvbiB1c2luZyBIVFRQIHJlcXVlc3RzIG9ubHkgd2hpY2ggaXMgc3VpdGFibGUgZm9yIHVzZQorYnkgc2NyaXB0cyBzZXR1cCBieSBzeXN0ZW0gYWRtaW5pc3RyYXRvcnMuICBDb21tYW5kcyBhcmUgZ2l2ZW4gYXMgcGFydCBvZiB0aGUKK3JlcXVlc3QgVVJJLCBhbmQgcmVzcG9uc2VzIGFyZSBpbiB0aGUgZm9ybSBvZiBzaW1wbGUgdGV4dCB0aGF0IGNhbiBiZSBlYXNpbHkKK3BhcnNlZCBhbmQgcHJvY2Vzc2VkLiAgU2VlIDxhIGhyZWY9IiNTdXBwb3J0ZWQgTWFuYWdlciBDb21tYW5kcyI+CitTdXBwb3J0ZWQgTWFuYWdlciBDb21tYW5kczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9saT4KKzxsaT5BIGNvbnZlbmllbnQgc2V0IG9mIHRhc2sgZGVmaW5pdGlvbnMgZm9yIHRoZSA8ZW0+QW50PC9lbT4KKyh2ZXJzaW9uIDEuNCBvciBsYXRlcikgYnVpbGQgdG9vbC4gIFNlZQorPGEgaHJlZj0iI0V4ZWN1dGluZyBNYW5hZ2VyIENvbW1hbmRzIFdpdGggQW50Ij5FeGVjdXRpbmcgTWFuYWdlciBDb21tYW5kcworV2l0aCBBbnQ8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvbGk+Cis8L3VsPgorPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkNvbmZpZ3VyaW5nIE1hbmFnZXIgQXBwbGljYXRpb24gQWNjZXNzIj4KKworICAgIDxibG9ja3F1b3RlPjxlbT4KKyAgICA8cD5UaGUgZGVzY3JpcHRpb24gYmVsb3cgdXNlcyB0aGUgdmFyaWFibGUgbmFtZSAkQ0FUQUxJTkFfSE9NRQorICAgIHRvIHJlZmVyIHRvIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB5b3UgaGF2ZSBpbnN0YWxsZWQgVG9tY2F0IDUsCisgICAgYW5kIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSBhZ2FpbnN0IHdoaWNoIG1vc3QgcmVsYXRpdmUgcGF0aHMgYXJlCisgICAgcmVzb2x2ZWQuICBIb3dldmVyLCBpZiB5b3UgaGF2ZSBjb25maWd1cmVkIFRvbWNhdCA1IGZvciBtdWx0aXBsZQorICAgIGluc3RhbmNlcyBieSBzZXR0aW5nIGEgQ0FUQUxJTkFfQkFTRSBkaXJlY3RvcnksIHlvdSBzaG91bGQgdXNlCisgICAgJENBVEFMSU5BX0JBU0UgaW5zdGVhZCBvZiAkQ0FUQUxJTkFfSE9NRSBmb3IgZWFjaCBvZiB0aGVzZQorICAgIHJlZmVyZW5jZXMuPC9wPgorICAgIDwvZW0+PC9ibG9ja3F1b3RlPgorCis8cD5JdCB3b3VsZCBiZSBxdWl0ZSB1bnNhZmUgdG8gc2hpcCBUb21jYXQgd2l0aCBkZWZhdWx0IHNldHRpbmdzIHRoYXQgYWxsb3dlZAorYW55b25lIG9uIHRoZSBJbnRlcm5ldCB0byBleGVjdXRlIHRoZSBNYW5hZ2VyIGFwcGxpY2F0aW9uIG9uIHlvdXIgc2VydmVyLgorVGhlcmVmb3JlLCB0aGUgTWFuYWdlciBhcHBsaWNhdGlvbiBpcyBzaGlwcGVkIHdpdGggdGhlIHJlcXVpcmVtZW50IHRoYXQgYW55b25lCit3aG8gYXR0ZW1wdHMgdG8gdXNlIGl0IG11c3QgYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMsIHVzaW5nIGEgdXNlcm5hbWUgYW5kCitwYXNzd29yZCB0aGF0IGhhdmUgdGhlIHJvbGUgPHN0cm9uZz5tYW5hZ2VyPC9zdHJvbmc+IGFzc29jaWF0ZWQgd2l0aCB0aGVtLgorRnVydGhlciwgdGhlcmUgaXMgbm8gdXNlcm5hbWUgaW4gdGhlIGRlZmF1bHQgdXNlcnMgZmlsZQorKDxjb25mPiRDQVRBTElOQV9IT01FL2NvbmYvdG9tY2F0LXVzZXJzLnhtbDwvY29uZj4pIHRoYXQgaXMgYXNzaWduZWQgdGhpcworcm9sZS4gIFRoZXJlZm9yZSwgYWNjZXNzIHRvIHRoZSBNYW5hZ2VyIGFwcGxpY2F0aW9uIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQKK2J5IGRlZmF1bHQuPC9wPgorCis8cD5UbyBlbmFibGUgYWNjZXNzIHRvIHRoZSBNYW5hZ2VyIHdlYiBhcHBsaWNhdGlvbiwgeW91IG11c3QgZWl0aGVyIGNyZWF0ZQorYSBuZXcgdXNlcm5hbWUvcGFzc3dvcmQgY29tYmluYXRpb24gYW5kIGFzc29jaWF0ZSB0aGUgcm9sZSBuYW1lCis8c3Ryb25nPm1hbmFnZXI8L3N0cm9uZz4gd2l0aCBpdCwgb3IgYWRkIHRoZSA8c3Ryb25nPm1hbmFnZXI8L3N0cm9uZz4gcm9sZQordG8gc29tZSBleGlzdGluZyB1c2VybmFtZS9wYXNzd29yZCBjb21iaW5hdGlvbi4gIEV4YWN0bHkgd2hlcmUgdGhpcyBpcyBkb25lCitkZXBlbmRzIG9uIHdoaWNoIDxjb2RlPlJlYWxtPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiB5b3UgYXJlIHVzaW5nOjwvcD4KKzx1bD4KKzxsaT48ZW0+TWVtb3J5UmVhbG08L2VtPiAtIElmIHlvdSBoYXZlIG5vdCBjdXN0b21pemVkIHlvdXIKKyAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3NlcnZlci54bWw8L2NvZGU+IHRvIHNlbGVjdCBhIGRpZmZlcmVudCBvbmUsCisgICAgVG9tY2F0IDUgZGVmYXVsdHMgdG8gYW4gWE1MLWZvcm1hdCBmaWxlIHN0b3JlZCBhdAorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvdG9tY2F0LXVzZXJzLnhtbDwvY29kZT4sIHdoaWNoIGNhbiBiZQorICAgIGVkaXRlZCB3aXRoIGFueSB0ZXh0IGVkaXRvci4gIFRoaXMgZmlsZSBjb250YWlucyBhbiBYTUwKKyAgICA8Y29kZT4mbHQ7dXNlciZndDs8L2NvZGU+IGZvciBlYWNoIGluZGl2aWR1YWwgdXNlciwgd2hpY2ggbWlnaHQKKyAgICBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Cis8c291cmNlPgorJmx0O3VzZXIgbmFtZT0iY3JhaWdtY2MiIHBhc3N3b3JkPSJzZWNyZXQiIHJvbGVzPSJzdGFuZGFyZCxtYW5hZ2VyIiAvJmd0OworPC9zb3VyY2U+CisgICAgd2hpY2ggZGVmaW5lcyB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHVzZWQgYnkgdGhpcyBpbmRpdmlkdWFsIHRvCisgICAgbG9nIG9uLCBhbmQgdGhlIHJvbGUgbmFtZXMgaGUgb3Igc2hlIGlzIGFzc29jaWF0ZWQgd2l0aC4gIFlvdSBjYW4KKyAgICBhZGQgdGhlIDxzdHJvbmc+bWFuYWdlcjwvc3Ryb25nPiByb2xlIHRvIHRoZSBjb21tYS1kZWxpbWl0ZWQKKyAgICA8Y29kZT5yb2xlczwvY29kZT4gYXR0cmlidXRlIGZvciBvbmUgb3IgbW9yZSBleGlzdGluZyB1c2VycywgYW5kL29yCisgICAgY3JlYXRlIG5ldyB1c2VycyB3aXRoIHRoYXQgYXNzaWduZWQgcm9sZS48L2xpPgorPGxpPjxlbT5KREJDUmVhbG08L2VtPiAtIFlvdXIgdXNlciBhbmQgcm9sZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4KKyAgICBhIGRhdGFiYXNlIGFjY2Vzc2VkIHZpYSBKREJDLiAgQWRkIHRoZSA8c3Ryb25nPm1hbmFnZXI8L3N0cm9uZz4gcm9sZQorICAgIHRvIG9uZSBvciBtb3JlIGV4aXN0aW5nIHVzZXJzLCBhbmQvb3IgY3JlYXRlIG9uZSBvciBtb3JlIG5ldyB1c2VycworICAgIHdpdGggdGhpcyByb2xlIGFzc2lnbmVkLCBmb2xsb3dpbmcgdGhlIHN0YW5kYXJkIHByb2NlZHVyZXMgZm9yIHlvdXIKKyAgICBlbnZpcm9ubWVudC48L2xpPgorPGxpPjxlbT5KTkRJUmVhbG08L2VtPiAtIFlvdXIgdXNlciBhbmQgcm9sZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4KKyAgICBhIGRpcmVjdG9yeSBzZXJ2ZXIgYWNjZXNzZWQgdmlhIExEQVAuICBBZGQgdGhlIDxzdHJvbmc+bWFuYWdlcjwvc3Ryb25nPgorICAgIHJvbGUgdG8gb25lIG9yIG1vcmUgZXhpc3RpbmcgdXNlcnMsIGFuZC9vciBjcmVhdGUgb25lIG9yIG1vcmUgbmV3IHVzZXJzCisgICAgd2l0aCB0aGlzIHJvbGUgYXNzaWduZWQsIGZvbGxvd2luZyB0aGUgc3RhbmRhcmQgcHJvY2VkdXJlcyBmb3IgeW91cgorICAgIGVudmlyb25tZW50LjwvbGk+Cis8L3VsPgorCis8cD5UaGUgZmlyc3QgdGltZSB5b3UgYXR0ZW1wdCB0byBpc3N1ZSBvbmUgb2YgdGhlIE1hbmFnZXIgY29tbWFuZHMKK2Rlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLCB5b3Ugd2lsbCBiZSBjaGFsbGVuZ2VkIHRvIGxvZyBvbiB1c2luZworQkFTSUMgYXV0aGVudGljYXRpb24uICBUaGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHlvdSBlbnRlciBkbyBub3QgbWF0dGVyLAorYXMgbG9uZyBhcyB0aGV5IGlkZW50aWZ5IGEgdmFsaWQgdXNlciBpbiB0aGUgdXNlcnMgZGF0YWJhc2Ugd2hvIHBvc3Nlc3NlcwordGhlIHJvbGUgPHN0cm9uZz5tYW5hZ2VyPC9zdHJvbmc+LjwvcD4KKworPHA+SW4gYWRkaXRpb24gdG8gdGhlIHBhc3N3b3JkIHJlc3RyaWN0aW9ucyB0aGUgbWFuYWdlciB3ZWIgYXBwbGljYXRpb24KK2NvdWxkIGJlIHJlc3RyaWN0ZWQgYnkgdGhlIHJlbW90ZSBJUCBhZGRyZXNzIG9yIGhvc3QgYnkgYWRkaW5nIGEKKzxjb2RlPlJlbW90ZUFkZHJWYWx2ZTwvY29kZT4gb3IgPGNvZGU+UmVtb3RlSG9zdFZhbHZlPC9jb2RlPi4gIEhlcmUgaXMKK2FuIGV4YW1wbGUgb2YgcmVzdHJpY3RpbmcgYWNjZXNzIHRvIHRoZSBsb2NhbGhvc3QgYnkgSVAgYWRkcmVzczoKKzxwcmU+CismbHQ7Q29udGV4dCBwYXRoPSIvbWFuYWdlciIgZGVidWc9IjAiIHByaXZpbGVnZWQ9InRydWUiCisgICAgICAgICBkb2NCYXNlPSIvdXNyL2xvY2FsL2tpbmV0aWMvdG9tY2F0NS9zZXJ2ZXIvd2ViYXBwcy9tYW5hZ2VyIiZndDsKKyAgICAgICAgICZsdDtWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlbW90ZUFkZHJWYWx2ZSIKKyAgICAgICAgICAgICAgICBhbGxvdz0iMTI3XC4wXC4wXC4xIi8mZ3Q7CismbHQ7L0NvbnRleHQmZ3Q7Cis8L3ByZT4KKzwvcD4KKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJTdXBwb3J0ZWQgTWFuYWdlciBDb21tYW5kcyI+CisKKzxwPkFsbCBjb21tYW5kcyB0aGF0IHRoZSBNYW5hZ2VyIGFwcGxpY2F0aW9uIGtub3dzIGhvdyB0byBwcm9jZXNzIGFyZQorc3BlY2lmaWVkIGluIGEgc2luZ2xlIHJlcXVlc3QgVVJJIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgoraHR0cDovL3tob3N0fTp7cG9ydH0vbWFuYWdlci97Y29tbWFuZH0/e3BhcmFtZXRlcnN9Cis8L3NvdXJjZT4KKzxwPndoZXJlIDxjb2RlPntob3N0fTwvY29kZT4gYW5kIDxjb2RlPntwb3J0fTwvY29kZT4gcmVwcmVzZW50IHRoZSBob3N0bmFtZQorYW5kIHBvcnQgbnVtYmVyIG9uIHdoaWNoIFRvbWNhdCBpcyBydW5uaW5nLCA8Y29kZT57Y29tbWFuZH08L2NvZGU+CityZXByZXNlbnRzIHRoZSBNYW5hZ2VyIGNvbW1hbmQgeW91IHdpc2ggdG8gZXhlY3V0ZSwgYW5kCis8Y29kZT57cGFyYW1ldGVyc308L2NvZGU+IHJlcHJlc2VudHMgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMKK3RoYXQgYXJlIHNwZWNpZmljIHRvIHRoYXQgY29tbWFuZC4gIEluIHRoZSBpbGx1c3RyYXRpb25zIGJlbG93LCBjdXN0b21pemUKK3RoZSBob3N0IGFuZCBwb3J0IGFwcHJvcHJpYXRlbHkgZm9yIHlvdXIgaW5zdGFsbGF0aW9uLjwvcD4KKworPHA+TW9zdCBjb21tYW5kcyBhY2NlcHQgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBxdWVyeSBwYXJhbWV0ZXJzOjwvcD4KKzx1bD4KKzxsaT48c3Ryb25nPnBhdGg8L3N0cm9uZz4gLSBUaGUgY29udGV4dCBwYXRoIChpbmNsdWRpbmcgdGhlIGxlYWRpbmcgc2xhc2gpCisgICAgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiB5b3UgYXJlIGRlYWxpbmcgd2l0aC4gIFRvIHNlbGVjdCB0aGUgUk9PVCB3ZWIKKyAgICBhcHBsaWNhdGlvbiwgc3BlY2lmeSAiLyIuICA8c3Ryb25nPk5PVEU8L3N0cm9uZz4gLQorICAgIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBwZXJmb3JtIGFkbWluaXN0cmF0aXZlIGNvbW1hbmRzIG9uIHRoZQorICAgIE1hbmFnZXIgYXBwbGljYXRpb24gaXRzZWxmLjwvbGk+Cis8bGk+PHN0cm9uZz53YXI8L3N0cm9uZz4gLSBVUkwgb2YgYSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSAoV0FSKSBmaWxlLAorICAgIHBhdGhuYW1lIG9mIGEgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZSB3ZWIgYXBwbGljYXRpb24sIG9yIGEKKyAgICBDb250ZXh0IGNvbmZpZ3VyYXRpb24gIi54bWwiIGZpbGUuICBZb3UgY2FuIHVzZSBVUkxzIGluIGFueSBvZiB0aGUKKyAgICBmb2xsb3dpbmcgZm9ybWF0czoKKyAgICA8dWw+CisgICAgPGxpPjxzdHJvbmc+ZmlsZTovYWJzb2x1dGUvcGF0aC90by9hL2RpcmVjdG9yeTwvc3Ryb25nPiAtIFRoZSBhYnNvbHV0ZQorICAgICAgICBwYXRoIG9mIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIHVucGFja2VkIHZlcnNpb24gb2YgYSB3ZWIKKyAgICAgICAgYXBwbGljYXRpb24uICBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBjb250ZXh0IHBhdGgKKyAgICAgICAgeW91IHNwZWNpZnkgd2l0aG91dCBhbnkgY2hhbmdlcy48L2xpPgorICAgIDxsaT48c3Ryb25nPmZpbGU6L2Fic29sdXRlL3BhdGgvdG8vYS93ZWJhcHAud2FyPC9zdHJvbmc+IC0gVGhlIGFic29sdXRlCisgICAgICAgIHBhdGggb2YgYSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSAoV0FSKSBmaWxlLiAgVGhpcyBpcyB2YWxpZAorICAgICAgICA8c3Ryb25nPm9ubHk8L3N0cm9uZz4gZm9yIHRoZSA8Y29kZT4vZGVwbG95PC9jb2RlPiBjb21tYW5kLCBhbmQgaXMKKyAgICAgICAgdGhlIG9ubHkgYWNjZXB0YWJsZSBmb3JtYXQgdG8gdGhhdCBjb21tYW5kLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+amFyOmZpbGU6L2Fic29sdXRlL3BhdGgvdG8vYS93YXJmaWxlLndhciEvPC9zdHJvbmc+IC0gVGhlCisgICAgICAgIFVSTCB0byBhIGxvY2FsIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIChXQVIpIGZpbGUuICBZb3UgY2FuIHVzZSBhbnkKKyAgICAgICAgc3ludGF4IHRoYXQgaXMgdmFsaWQgZm9yIHRoZSA8Y29kZT5KYXJVUkxDb25uZWN0aW9uPC9jb2RlPiBjbGFzcworICAgICAgICBmb3IgcmVmZXJlbmNlIHRvIGFuIGVudGlyZSBKQVIgZmlsZS48L2xpPgorICAgIDxsaT48c3Ryb25nPmZpbGU6L2Fic29sdXRlL3BhdGgvdG8vYS9jb250ZXh0LnhtbDwvc3Ryb25nPiAtIFRoZQorICAgICAgICBhYnNvbHV0ZSBwYXRoIG9mIGEgd2ViIGFwcGxpY2F0aW9uIENvbnRleHQgY29uZmlndXJhdGlvbiAiLnhtbCIKKyAgICAgICAgZmlsZSB3aGljaCBjb250YWlucyB0aGUgQ29udGV4dCBjb25maWd1cmF0aW9uIGVsZW1lbnQuPC9saT4KKyAgICA8bGk+PHN0cm9uZz5kaXJlY3Rvcnk8L3N0cm9uZz4gLSBUaGUgZGlyZWN0b3J5IG5hbWUgZm9yIHRoZSB3ZWIKKyAgICAgICAgYXBwbGNpYXRpb24gY29udGV4dCBpbiB0aGUgSG9zdCdzIGFwcGxpY2F0aW9uIGJhc2UgZGlyZWN0b3J5LjwvbGk+CisgICAgPGxpPjxzdHJvbmc+d2ViYXBwLndhcjwvc3Ryb25nPiAtIFRoZSBuYW1lIG9mIGEgd2ViIGFwcGxpY2F0aW9uIHdhciBmaWxlCisgICAgICAgIGxvY2F0ZWQgaW4gdGhlIEhvc3QncyBhcHBsaWNhdGlvbiBiYXNlIGRpcmVjdG9yeS48L2xpPgorICAgIDwvdWw+PC9saT4KKzwvdWw+CisKKzxwPkVhY2ggY29tbWFuZCB3aWxsIHJldHVybiBhIHJlc3BvbnNlIGluIDxjb2RlPnRleHQvcGxhaW48L2NvZGU+IGZvcm1hdAorKGkuZS4gcGxhaW4gQVNDSUkgd2l0aCBubyBIVE1MIG1hcmt1cCksIG1ha2luZyBpdCBlYXN5IGZvciBib3RoIGh1bWFucyBhbmQKK3Byb2dyYW1zIHRvIHJlYWQpLiAgVGhlIGZpcnN0IGxpbmUgb2YgdGhlIHJlc3BvbnNlIHdpbCBiZWdpbiB3aXRoIGVpdGhlcgorPGNvZGU+T0s8L2NvZGU+IG9yIDxjb2RlPkZBSUw8L2NvZGU+LCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlcXVlc3RlZAorY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bCBvciBub3QuICBJbiB0aGUgY2FzZSBvZiBmYWlsdXJlLCB0aGUgcmVzdCBvZiB0aGUgZmlyc3QKK2xpbmUgd2lsbCBjb250YWluIGEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhhdCB3YXMgZW5jb3VudGVyZWQuICBTb21lCitjb21tYW5kcyBpbmNsdWRlIGFkZGl0aW9uYWwgbGluZXMgb2YgaW5mb3JtYXRpb24gYXMgZGVzY3JpYmVkIGJlbG93LjwvcD4KKworPHA+PGVtPkludGVybmF0aW9uYWxpemF0aW9uIE5vdGU8L2VtPiAtIFRoZSBNYW5hZ2VyIGFwcGxpY2F0aW9uIGxvb2tzIHVwCitpdHMgbWVzc2FnZSBzdHJpbmdzIGluIHJlc291cmNlIGJ1bmRsZXMsIHNvIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHN0cmluZ3MKK2hhdmUgYmVlbiB0cmFuc2xhdGVkIGZvciB5b3VyIHBsYXRmb3JtLiAgVGhlIGV4YW1wbGVzIGJlbG93IHNob3cgdGhlIEVuZ2xpc2gKK3ZlcnNpb24gb2YgdGhlIG1lc3NhZ2VzLjwvcD4KKworPGJsb2NrcXVvdGU+PGVtPgorPHA+PHN0cm9uZz5XQVJOSU5HOjwvc3Ryb25nPiAgdGhlIGxlZ2FjeSBjb21tYW5kcyA8Y29kZT4vaW5zdGFsbDwvY29kZT4gYW5kIAorPGNvZGU+L3JlbW92ZTwvY29kZT4gYXJlIGRlcHJlY2F0ZWQuCitUaGV5IGFyZSBwcmVzZW50bHkgZXF1aXZhbGVudCB0byA8Y29kZT4vZGVwbG95PC9jb2RlPiBhbmQgPGNvZGU+L3VuZGVwbG95PC9jb2RlPiwKK2J1dCBjb3VsZCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuPC9wPgorPC9lbT48L2Jsb2NrcXVvdGU+CisKKzxzdWJzZWN0aW9uIG5hbWU9IkRlcGxveSBBIE5ldyBBcHBsaWNhdGlvbiBSZW1vdGVseSI+CisKKzxzb3VyY2U+CitodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlci9kZXBsb3kKKzwvc291cmNlPgorCis8cD5VcGxvYWQgdGhlIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIChXQVIpIGZpbGUgdGhhdCBpcyBzcGVjaWZpZWQgYXMgdGhlCityZXF1ZXN0IGRhdGEgaW4gdGhpcyBIVFRQIFBVVCByZXF1ZXN0LCBpbnN0YWxsIGl0IGludG8gdGhlIDxjb2RlPmFwcEJhc2U8L2NvZGU+CitkaXJlY3Rvcnkgb2Ygb3VyIGNvcnJlc3BvbmRpbmcgdmlydHVhbCBob3N0LCBhbmQgc3RhcnQgaXQgdXNpbmcgdGhlIHdhciBmaWxlCituYW1lIHdpdGhvdXQgdGhlIC53YXIgZXh0ZW5zaW9uIGFzIHRoZSBwYXRoLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiBsYXRlciBiZQordW5kZXBsb3llZCAoYW5kIHRoZSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uIGRpcmVjdG9yeSByZW1vdmVkKSBieSB1c2Ugb2YgdGhlCis8Y29kZT4vdW5kZXBsb3k8L2NvZGU+LiBUbyBkZXBsb3kgdGhlIFJPT1Qgd2ViIGFwcGxpY2F0aW9uICh0aGUgYXBwbGljYXRpb24KK3dpdGggYSBjb250ZXh0IHBhdGggb2YgIi8iKSwgbmFtZSB0aGUgd2FyIFJPT1Qud2FyLjwvcD4KKworPHA+VGhlIC5XQVIgZmlsZSBtYXkgaW5jbHVkZSBUb21jYXQgc3BlY2lmaWMgZGVwbG95bWVudCBjb25maWd1cmF0aW9uLCBieSAKK2luY2x1ZGluZyBhIENvbnRleHQgY29uZmlndXJhdGlvbiBYTUwgZmlsZSBpbiAKKzxjb2RlPi9NRVRBLUlORi9jb250ZXh0LnhtbDwvY29kZT4uPC9wPgorCis8cD5VUkwgcGFyYW1ldGVycyBpbmNsdWRlOgorPHVsPgorPGxpPjxjb2RlPnVwZGF0ZTwvY29kZT46IFdoZW4gc2V0IHRvIHRydWUsIGFueSBleGlzdGluZyB1cGRhdGUgd2lsbCBiZQorICAgIHVuZGVwbG95ZWQgZmlyc3QuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHNldCB0byBmYWxzZS48L2xpPgorPGxpPjxjb2RlPnRhZzwvY29kZT46IFNwZWNpZnlpbmcgYSB0YWcgbmFtZSwgdGhpcyBhbGxvd3MgYXNzb2NpYXRpbmcgdGhlCisgICAgZGVwbG95ZWQgd2ViYXBwIHdpdGggYSB2ZXJzaW9uIG51bWJlci4gVGhlIGFwcGxpY2F0aW9uIHZlcnNpb24gY2FuCisgICAgYmUgbGF0ZXIgcmVkZXBsb3llZCB3aGVuIG5lZWRlZCB1c2luZyBvbmx5IHRoZSB0YWcuPC9saT4KKzwvdWw+Cis8L3A+CisKKzxwPjxzdHJvbmc+Tk9URTwvc3Ryb25nPiAtIFRoaXMgY29tbWFuZCBpcyB0aGUgbG9naWNhbAorb3Bwb3NpdGUgb2YgdGhlIDxjb2RlPi91bmRlcGxveTwvY29kZT4gY29tbWFuZC48L3A+CisKKzxwPklmIGluc3RhbGxhdGlvbiBhbmQgc3RhcnR1cCBpcyBzdWNjZXNzZnVsLCB5b3Ugd2lsbCByZWNlaXZlIGEgcmVzcG9uc2UKK2xpa2UgdGhpczo8L3A+Cis8c291cmNlPgorT0sgLSBEZXBsb3llZCBhcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggL2ZvbworPC9zb3VyY2U+CisKKzxwPk90aGVyd2lzZSwgdGhlIHJlc3BvbnNlIHdpbGwgc3RhcnQgd2l0aCA8Y29kZT5GQUlMPC9jb2RlPiBhbmQgaW5jbHVkZSBhbgorZXJyb3IgbWVzc2FnZS4gIFBvc3NpYmxlIGNhdXNlcyBmb3IgcHJvYmxlbXMgaW5jbHVkZTo8L3A+Cis8dWw+Cis8bGk+PGVtPkFwcGxpY2F0aW9uIGFscmVhZHkgZXhpc3RzIGF0IHBhdGggL2ZvbzwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+VGhlIGNvbnRleHQgcGF0aHMgZm9yIGFsbCBjdXJyZW50bHkgcnVubmluZyB3ZWIgYXBwbGljYXRpb25zIG11c3QgYmUKKyAgICB1bmlxdWUuICBUaGVyZWZvcmUsIHlvdSBtdXN0IHVuZGVwbG95IHRoZSBleGlzdGluZyB3ZWIKKyAgICBhcHBsaWNhdGlvbiB1c2luZyB0aGlzIGNvbnRleHQgcGF0aCwgb3IgY2hvb3NlIGEgZGlmZmVyZW50IGNvbnRleHQgcGF0aAorICAgIGZvciB0aGUgbmV3IG9uZS4gVGhlIDxjb2RlPnVwZGF0ZTwvY29kZT4gcGFyYW1ldGVyIG1heSBiZSBzcGVjaWZpZWQgYXMKKyAgICBhIHBhcmFtZXRlciBvbiB0aGUgVVJMLCB3aXRoIGEgdmFsdWUgb2YgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gYXZvaWQgdGhpcworICAgIGVycm9yLiBJbiB0aGF0IGNhc2UsIGFuIHVuZGVwbG95IHdpbGwgYmUgcGVyZm9ybWVkIG9uIGFuIGV4aXN0aW5nCisgICAgYXBwbGljYXRpb24gYmVmb3JlIHBlcmZvcm1pbmcgdGhlIGRlcGxveW1lbnQuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5FbmNvdW50ZXJlZCBleGNlcHRpb248L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPkFuIGV4Y2VwdGlvbiB3YXMgZW5jb3VudGVyZWQgdHJ5aW5nIHRvIHN0YXJ0IHRoZSBuZXcgd2ViIGFwcGxpY2F0aW9uLgorICAgIENoZWNrIHRoZSBUb21jYXQgNSBsb2dzIGZvciB0aGUgZGV0YWlscywgYnV0IGxpa2VseSBleHBsYW5hdGlvbnMgaW5jbHVkZQorICAgIHByb2JsZW1zIHBhcnNpbmcgeW91ciA8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPiBmaWxlLCBvciBtaXNzaW5nCisgICAgY2xhc3NlcyBlbmNvdW50ZXJlZCB3aGVuIGluaXRpYWxpemluZyBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMgYW5kCisgICAgZmlsdGVycy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8L3VsPgorCis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IkRlcGxveSBBIE5ldyBBcHBsaWNhdGlvbiBmcm9tIGEgTG9jYWwgUGF0aCI+CisKKzxwPkRlcGxveSBhbmQgc3RhcnQgYSBuZXcgd2ViIGFwcGxpY2F0aW9uLCBhdHRhY2hlZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQKKzxjb2RlPnBhdGg8L2NvZGU+ICh3aGljaCBtdXN0IG5vdCBiZSBpbiB1c2UgYnkgYW55IG90aGVyIHdlYiBhcHBsaWNhdGlvbikuCitUaGlzIGNvbW1hbmQgaXMgdGhlIGxvZ2ljYWwgb3Bwb3NpdGUgb2YgdGhlIDxjb2RlPi91bmRlcGxveTwvY29kZT4gY29tbWFuZC48L3A+CisKKzxwPlRoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgd2F5cyB0aGUgZGVwbG95IGNvbW1hbmQgY2FuIGJlIHVzZWQuPC9wPgorCis8aDM+RGVwbG95IGEgdmVyc2lvbiBvZiBhIHByZXZpb3VzbHkgZGVwbG95ZWQgd2ViYXBwPC9oMz4KKworPHA+VGhpcyBjYW4gYmUgdXNlZCB0byBkZXBsb3kgYSBwcmV2aW91cyB2ZXJzaW9uIG9mIGEgd2ViIGFwcGxpY2F0aW9uLCB3aGljaAoraGFzIGJlZW4gZGVwbG95ZWQgdXNpbmcgdGhlIDxjb2RlPnRhZzwvY29kZT4gYXR0cmlidXRlLiBOb3RlIHRoYXQgdGhlIHdvcmsKK2RpcmVjdG9yeSBmb3IgdGhlIG1hbmFnZXIgd2ViYXBwIHdpbGwgY29udGFpbiB0aGUgcHJldmlvdXNseSBkZXBsb3llZCBXQVJzOworcmVtb3ZpbmcgaXQgd291bGQgbWFrZSB0aGUgZGVwbG95bWVudCBmYWlsLgorPHNvdXJjZT4KK2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyL2RlcGxveT9wYXRoPS9mb290b28mYW1wO3RhZz1mb290YWcKKzwvc291cmNlPgorPC9wPgorCis8aDM+RGVwbG95IGEgRGlyZWN0b3J5IG9yIFdBUiBieSBVUkw8L2gzPgorCis8cD5EZXBsb3kgYSB3ZWIgYXBwbGljYXRpb24gZGlyZWN0b3J5IG9yICIud2FyIiBmaWxlIGxvY2F0ZWQgb24gdGhlIFRvbWNhdAorc2VydmVyLiBJZiBubyA8Y29kZT5wYXRoPC9jb2RlPiBpcyBzcGVjaWZpZWQsIHRoZSBkaXJlY3RvcnkgbmFtZSBvciB0aGUgd2FyIGZpbGUKK25hbWUgd2l0aG91dCB0aGUgIi53YXIiIGV4dGVuc2lvbiBpcyB1c2VkIGFzIHRoZSBwYXRoLiBUaGUgPGNvZGU+d2FyPC9jb2RlPgorcGFyYW1ldGVyIHNwZWNpZmllcyBhIFVSTCAoaW5jbHVkaW5nIHRoZSA8Y29kZT5maWxlOjwvY29kZT4gc2NoZW1lKSBmb3IgZWl0aGVyCithIGRpcmVjdG9yeSBvciBhIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIChXQVIpIGZpbGUuIFRoZSBzdXBwb3J0ZWQgc3ludGF4IGZvcgorYSBVUkwgcmVmZXJyaW5nIHRvIGEgV0FSIGZpbGUgaXMgZGVzY3JpYmVkIG9uIHRoZSBKYXZhZG9jcyBwYWdlIGZvciB0aGUKKzxjb2RlPmphdmEubmV0LkphclVSTENvbm5lY3Rpb248L2NvZGU+IGNsYXNzLiAgVXNlIG9ubHkgVVJMcyB0aGF0IHJlZmVyIHRvCit0aGUgZW50aXJlIFdBUiBmaWxlLjwvcD4KKworPHA+SW4gdGhpcyBleGFtcGxlIHRoZSB3ZWIgYXBwbGljYXRpb24gbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5Cis8Y29kZT4vcGF0aC90by9mb288L2NvZGU+IG9uIHRoZSBUb21jYXQgc2VydmVyIGlzIGRlcGxveWVkIGFzIHRoZQord2ViIGFwcGxpY2F0aW9uIGNvbnRleHQgbmFtZWQgPGNvZGU+L2Zvb3RvbzwvY29kZT4uCis8c291cmNlPgoraHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZXIvZGVwbG95P3BhdGg9L2Zvb3RvbyZhbXA7d2FyPWZpbGU6L3BhdGgvdG8vZm9vCis8L3NvdXJjZT4KKzwvcD4KKworPHA+SW4gdGhpcyBleGFtcGxlIHRoZSAiLndhciIgZmlsZSA8Y29kZT4vcGF0aC90by9iYXIud2FyPC9jb2RlPiBvbiB0aGUKK1RvbWNhdCBzZXJ2ZXIgaXMgZGVwbG95ZWQgYXMgdGhlIHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0IG5hbWVkCis8Y29kZT4vYmFyPC9jb2RlPi4gTm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gPGNvZGU+cGF0aDwvY29kZT4gcGFyYW1ldGVyCitzbyB0aGUgY29udGV4dCBwYXRoIGRlZmF1bHRzIHRvIHRoZSBuYW1lIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZQorZmlsZSB3aXRob3V0IHRoZSAiLndhciIgZXh0ZW5zaW9uLgorPHNvdXJjZT4KK2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyL2RlcGxveT93YXI9amFyOmZpbGU6L3BhdGgvdG8vYmFyLndhciEvCis8L3NvdXJjZT4KKzwvcD4KKworPGgzPkRlcGxveSBhIERpcmVjdG9yeSBvciBXYXIgZnJvbSB0aGUgSG9zdCBhcHBCYXNlPC9oMz4KKworPHA+RGVwbG95IGEgd2ViIGFwcGxpY2F0aW9uIGRpcmVjdG9yeSBvciAiLndhciIgZmlsZSBsb2NhdGVkIGluIHlvdXIgSG9zdAorYXBwQmFzZSBkaXJlY3RvcnkuIFRoZSBkaXJlY3RvcnkgbmFtZSBvciB0aGUgd2FyIGZpbGUgbmFtZSB3aXRob3V0IHRoZSAiLndhciIKK2V4dGVuc2lvbiBpcyB1c2VkIGFzIHRoZSBwYXRoLjwvcD4KKworPHA+SW4gdGhpcyBleGFtcGxlIHRoZSB3ZWIgYXBwbGljYXRpb24gbG9jYXRlZCBpbiBhIHN1YiBkaXJlY3RvcnkgbmFtZWQKKzxjb2RlPmZvbzwvY29kZT4gaW4gdGhlIEhvc3QgYXBwQmFzZSBkaXJlY3Rvcnkgb2YgdGhlIFRvbWNhdCBzZXJ2ZXIgaXMKK2RlcGxveWVkIGFzIHRoZSB3ZWIgYXBwbGljYXRpb24gY29udGV4dCBuYW1lZCA8Y29kZT4vZm9vPC9jb2RlPi4gTm90aWNlCit0aGF0IHRoZSBjb250ZXh0IHBhdGggdXNlZCBpcyB0aGUgbmFtZSBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRpcmVjdG9yeS4KKzxzb3VyY2U+CitodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlci9kZXBsb3k/d2FyPWZvbworPC9zb3VyY2U+Cis8L3A+CisKKzxwPkluIHRoaXMgZXhhbXBsZSB0aGUgIi53YXIiIGZpbGUgPGNvZGU+YmFyLndhcjwvY29kZT4gbG9jYXRlZCBpbiB5b3VyCitIb3N0IGFwcEJhc2UgZGlyZWN0b3J5IG9uIHRoZSBUb21jYXQgc2VydmVyIGlzIGRlcGxveWVkIGFzIHRoZSB3ZWIKK2FwcGxpY2F0aW9uIGNvbnRleHQgbmFtZWQgPGNvZGU+L2JhcjwvY29kZT4uCis8c291cmNlPgoraHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZXIvZGVwbG95P3dhcj1iYXIud2FyCis8L3NvdXJjZT4KKzwvcD4KKworPGgzPkRlcGxveSB1c2luZyBhIENvbnRleHQgY29uZmlndXJhdGlvbiAiLnhtbCIgZmlsZTwvaDM+CisKKzxwPklmIHRoZSBIb3N0IGRlcGxveVhNTCBmbGFnIGlzIHNldCB0byB0cnVlIHlvdSBjYW4gZGVwbG95IGEgd2ViCithcHBsaWNhdGlvbiB1c2luZyBhIENvbnRleHQgY29uZmlndXJhdGlvbiAiLnhtbCIgZmlsZSBhbmQgYW4gb3B0aW9uYWwKKyIud2FyIiBmaWxlIG9yIHdlYiBhcHBsaWNhdGlvbiBkaXJlY3RvcnkuIFRoZSBjb250ZXh0IDxjb2RlPnBhdGg8L2NvZGU+CitpcyBub3QgdXNlZCB3aGVuIGRlcGxveWluZyBhIHdlYiBhcHBsaWNhdGlvbiB1c2luZyBhIGNvbnRleHQgIi54bWwiCitjb25maWd1cmF0aW9uIGZpbGUuPC9wPgorCis8cD5BIENvbnRleHQgY29uZmlndXJhdGlvbiAiLnhtbCIgZmlsZSBjYW4gY29udGFpbiB2YWxpZCBYTUwgZm9yIGEKK3dlYiBhcHBsaWNhdGlvbiBDb250ZXh0IGp1c3QgYXMgaWYgaXQgd2VyZSBjb25maWd1cmVkIGluIHlvdXIKK1RvbWNhdCA8Y29kZT5zZXJ2ZXIueG1sPC9jb2RlPiBjb25maWd1cmF0aW9uIGZpbGUuIEhlcmUgaXMgYW4KK2V4YW1wbGU6Cis8c291cmNlPgorJmx0O0NvbnRleHQgcGF0aD0iL2Zvb2JhciIgZG9jQmFzZT0iL3BhdGgvdG8vYXBwbGljYXRpb24vZm9vYmFyIgorICAgICAgICAgZGVidWc9IjAiJmd0OworCisgICZsdDshLS0gTGluayB0byB0aGUgdXNlciBkYXRhYmFzZSB3ZSB3aWxsIGdldCByb2xlcyBmcm9tIC0tJmd0OworICAmbHQ7UmVzb3VyY2VMaW5rIG5hbWU9InVzZXJzIiBnbG9iYWw9IlVzZXJEYXRhYmFzZSIKKyAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZSIvJmd0OworCismbHQ7L0NvbnRleHQmZ3Q7Cis8L3NvdXJjZT4KKzwvcD4KKworPHA+V2hlbiB0aGUgb3B0aW9uYWwgPGNvZGU+d2FyPC9jb2RlPiBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRoZSBVUkwKK2ZvciBhIHdlYiBhcHBsaWNhdGlvbiAiLndhciIgZmlsZSBvciBkaXJlY3RvcnkgaXQgb3ZlcnJpZGVzIGFueQorZG9jQmFzZSBjb25maWd1cmVkIGluIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb24gIi54bWwiIGZpbGUuPC9wPgorCis8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgZGVwbG95aW5nIGFuIGFwcGxpY2F0aW9uIHVzaW5nIGEgQ29udGV4dAorY29uZmlndXJhdGlvbiAiLnhtbCIgZmlsZS4KKzxzb3VyY2U+CitodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlci9kZXBsb3k/Y29uZmlnPWZpbGU6L3BhdGgvY29udGV4dC54bWwKKzwvc291cmNlPgorPC9wPgorCis8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgZGVwbG95aW5nIGFuIGFwcGxpY2F0aW9uIHVzaW5nIGEgQ29udGV4dAorY29uZmlndXJhdGlvbiAiLnhtbCIgZmlsZSBhbmQgYSB3ZWIgYXBwbGljYXRpb24gIi53YXIiIGZpbGUgbG9jYXRlZAorb24gdGhlIHNlcnZlci4KKzxzb3VyY2U+CitodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlci9kZXBsb3k/Y29uZmlnPWZpbGU6L3BhdGgvY29udGV4dC54bWwmYW1wO3dhcj1maWxlOi9wYXRoL2Jhci53YXImYW1wO3BhdGg9L2JhcgorPC9zb3VyY2U+Cis8L3A+CisKKzxoMz5EZXBsb3ltZW50IE5vdGVzPC9oMz4KKworPHA+SWYgdGhlIEhvc3QgaXMgY29uZmlndXJlZCB3aXRoIHVucGFja1dBUnM9dHJ1ZSBhbmQgeW91IGRlcGxveSBhIHdhcgorZmlsZSwgdGhlIHdhciB3aWxsIGJlIHVucGFja2VkIGludG8gYSBkaXJlY3RvcnkgaW4geW91ciBIb3N0IGFwcEJhc2UKK2RpcmVjdG9yeS48L3A+CisKKzxwPklmIHRoZSBhcHBsaWNhdGlvbiB3YXIgb3IgZGlyZWN0b3J5IGlzIGluc3RhbGxlZCBpbiB5b3VyIEhvc3QgYXBwQmFzZQorZGlyZWN0b3J5IGFuZCBlaXRoZXIgdGhlIEhvc3QgaXMgY29uZmlndXJlZCB3aXRoIGF1dG9EZXBsb3k9dHJ1ZSBvcgorbGl2ZURlcGxveT10cnVlLCB0aGUgQ29udGV4dCBwYXRoIG11c3QgbWF0Y2ggdGhlIGRpcmVjdG9yeSBuYW1lIG9yCit3YXIgZmlsZSBuYW1lIHdpdGhvdXQgdGhlICIud2FyIiBleHRlbnNpb24uPC9wPgorCis8cD5Gb3Igc2VjdXJpdHkgd2hlbiB1bnRydXN0ZWQgdXNlcnMgY2FuIG1hbmFnZSB3ZWIgYXBwbGljYXRpb25zLCB0aGUKK0hvc3QgZGVwbG95WE1MIGZsYWcgY2FuIGJlIHNldCB0byBmYWxzZS4gIFRoaXMgcHJldmVudHMgdW50cnVzdGVkIHVzZXJzCitmcm9tIGRlcGxveWluZyB3ZWIgYXBwbGljYXRpb25zIHVzaW5nIGEgY29uZmlndXJhdGlvbiBYTUwgZmlsZSBhbmQKK2Fsc28gcHJldmVudHMgdGhlbSBmcm9tIGRlcGxveWluZyBhcHBsaWNhdGlvbiBkaXJlY3RvcmllcyBvciAiLndhciIKK2ZpbGVzIGxvY2F0ZWQgb3V0c2lkZSBvZiB0aGVpciBIb3N0IGFwcEJhc2UuPC9wPgorCisKKzxoMz5EZXBsb3kgUmVzcG9uc2U8L2gzPgorCis8cD5JZiBpbnN0YWxsYXRpb24gYW5kIHN0YXJ0dXAgaXMgc3VjY2Vzc2Z1bCwgeW91IHdpbGwgcmVjZWl2ZSBhIHJlc3BvbnNlCitsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KK09LIC0gRGVwbG95ZWQgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIC9mb28KKzwvc291cmNlPgorCis8cD5PdGhlcndpc2UsIHRoZSByZXNwb25zZSB3aWxsIHN0YXJ0IHdpdGggPGNvZGU+RkFJTDwvY29kZT4gYW5kIGluY2x1ZGUgYW4KK2Vycm9yIG1lc3NhZ2UuICBQb3NzaWJsZSBjYXVzZXMgZm9yIHByb2JsZW1zIGluY2x1ZGU6PC9wPgorPHVsPgorPGxpPjxlbT5BcHBsaWNhdGlvbiBhbHJlYWR5IGV4aXN0cyBhdCBwYXRoIC9mb288L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPlRoZSBjb250ZXh0IHBhdGhzIGZvciBhbGwgY3VycmVudGx5IHJ1bm5pbmcgd2ViIGFwcGxpY2F0aW9ucyBtdXN0IGJlCisgICAgdW5pcXVlLiAgVGhlcmVmb3JlLCB5b3UgbXVzdCB1bmRlcGxveSB0aGUgZXhpc3Rpbmcgd2ViCisgICAgYXBwbGljYXRpb24gdXNpbmcgdGhpcyBjb250ZXh0IHBhdGgsIG9yIGNob29zZSBhIGRpZmZlcmVudCBjb250ZXh0IHBhdGgKKyAgICBmb3IgdGhlIG5ldyBvbmUuIFRoZSA8Y29kZT51cGRhdGU8L2NvZGU+IHBhcmFtZXRlciBtYXkgYmUgc3BlY2lmaWVkIGFzCisgICAgYSBwYXJhbWV0ZXIgb24gdGhlIFVSTCwgd2l0aCBhIHZhbHVlIG9mIDxjb2RlPnRydWU8L2NvZGU+IHRvIGF2b2lkIHRoaXMKKyAgICBlcnJvci4gSW4gdGhhdCBjYXNlLCBhbiB1bmRlcGxveSB3aWxsIGJlIHBlcmZvcm1lZCBvbiBhbiBleGlzdGluZworICAgIGFwcGxpY2F0aW9uIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBkZXBsb3ltZW50LjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+RG9jdW1lbnQgYmFzZSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSByZWFkYWJsZSBkaXJlY3Rvcnk8L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPlRoZSBVUkwgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT53YXI8L2NvZGU+IHBhcmFtZXRlciBtdXN0IGlkZW50aWZ5IGEKKyAgICBkaXJlY3Rvcnkgb24gdGhpcyBzZXJ2ZXIgdGhhdCBjb250YWlucyB0aGUgInVucGFja2VkIiB2ZXJzaW9uIG9mIGEKKyAgICB3ZWIgYXBwbGljYXRpb24sIG9yIHRoZSBhYnNvbHV0ZSBVUkwgb2YgYSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSAoV0FSKQorICAgIGZpbGUgdGhhdCBjb250YWlucyB0aGlzIGFwcGxpY2F0aW9uLiAgQ29ycmVjdCB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5CisgICAgdGhlIDxjb2RlPndhcjwvY29kZT4gcGFyYW1ldGVyLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+RW5jb3VudGVyZWQgZXhjZXB0aW9uPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5BbiBleGNlcHRpb24gd2FzIGVuY291bnRlcmVkIHRyeWluZyB0byBzdGFydCB0aGUgbmV3IHdlYiBhcHBsaWNhdGlvbi4KKyAgICBDaGVjayB0aGUgVG9tY2F0IDUgbG9ncyBmb3IgdGhlIGRldGFpbHMsIGJ1dCBsaWtlbHkgZXhwbGFuYXRpb25zIGluY2x1ZGUKKyAgICBwcm9ibGVtcyBwYXJzaW5nIHlvdXIgPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4gZmlsZSwgb3IgbWlzc2luZworICAgIGNsYXNzZXMgZW5jb3VudGVyZWQgd2hlbiBpbml0aWFsaXppbmcgYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzIGFuZAorICAgIGZpbHRlcnMuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5JbnZhbGlkIGFwcGxpY2F0aW9uIFVSTCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5UaGUgVVJMIGZvciB0aGUgZGlyZWN0b3J5IG9yIHdlYiBhcHBsaWNhdGlvbiB0aGF0IHlvdSBzcGVjaWZpZWQKKyAgICB3YXMgbm90IHZhbGlkLiAgU3VjaCBVUkxzIG11c3Qgc3RhcnQgd2l0aCA8Y29kZT5maWxlOjwvY29kZT4sIGFuZCBVUkxzCisgICAgZm9yIGEgV0FSIGZpbGUgbXVzdCBlbmQgaW4gIi53YXIiLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+SW52YWxpZCBjb250ZXh0IHBhdGggd2FzIHNwZWNpZmllZDwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+VGhlIGNvbnRleHQgcGF0aCBtdXN0IHN0YXJ0IHdpdGggYSBzbGFzaCBjaGFyYWN0ZXIuIFRvIHJlZmVyZW5jZSB0aGUKKyAgICBST09UIHdlYiBhcHBsaWNhdGlvbiB1c2UgIi8iLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+Q29udGV4dCBwYXRoIG11c3QgbWF0Y2ggdGhlIGRpcmVjdG9yeSBvciBXQVIgZmlsZSBuYW1lOjwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgSWYgdGhlIGFwcGxpY2F0aW9uIHdhciBvciBkaXJlY3RvcnkgaXMgaW5zdGFsbGVkIGluIHlvdXIgSG9zdCBhcHBCYXNlCisgICAgZGlyZWN0b3J5IGFuZCBlaXRoZXIgdGhlIEhvc3QgaXMgY29uZmlndXJlZCB3aXRoIGF1dG9EZXBsb3k9dHJ1ZSBvcgorICAgIGxpdmVEZXBsb3k9dHJ1ZSwgdGhlIENvbnRleHQgcGF0aCBtdXN0IG1hdGNoIHRoZSBkaXJlY3RvcnkgbmFtZSBvcgorICAgIHdhciBmaWxlIG5hbWUgd2l0aG91dCB0aGUgIi53YXIiIGV4dGVuc2lvbi4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+T25seSB3ZWIgYXBwbGljYXRpb25zIGluIHRoZSBIb3N0IHdlYiBhcHBsaWNhdGlvbiBkaXJlY3RvcnkgY2FuCisgICAgIGJlIGluc3RhbGxlZDwvZW0+CisgICAgIDxibG9ja3F1b3RlPgorICAgICBJZiB0aGUgSG9zdCBkZXBsb3lYTUwgZmxhZyBpcyBzZXQgdG8gZmFsc2UgdGhpcyBlcnJvciB3aWxsIGhhcHBlbgorICAgICBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gZGVwbG95IGEgd2ViIGFwcGxpY2F0aW9uIGRpcmVjdG9yeSBvcgorICAgICAgIi53YXIiIGZpbGUgb3V0c2lkZSBvZiB0aGUgSG9zdCBhcHBCYXNlIGRpcmVjdG9yeS4KKyAgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8L3VsPgorCis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9Ikxpc3QgQ3VycmVudGx5IERlcGxveWVkIEFwcGxpY2F0aW9ucyI+CisKKzxzb3VyY2U+CitodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlci9saXN0Cis8L3NvdXJjZT4KKworPHA+TGlzdCB0aGUgY29udGV4dCBwYXRocywgY3VycmVudCBzdGF0dXMgKDxjb2RlPnJ1bm5pbmc8L2NvZGU+IG9yCis8Y29kZT5zdG9wcGVkPC9jb2RlPiksIGFuZCBudW1iZXIgb2YgYWN0aXZlIHNlc3Npb25zIGZvciBhbGwgY3VycmVudGx5CitkZXBsb3llZCB3ZWIgYXBwbGljYXRpb25zLiAgQSB0eXBpY2FsIHJlc3BvbnNlIGltbWVkaWF0ZWx5CithZnRlciBzdGFydGluZyBUb21jYXQgbWlnaHQgbG9vayBsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KK09LIC0gTGlzdGVkIGFwcGxpY2F0aW9ucyBmb3IgdmlydHVhbCBob3N0IGxvY2FsaG9zdAorL3dlYmRhdjpydW5uaW5nOjAKKy9leGFtcGxlczpydW5uaW5nOjAKKy9tYW5hZ2VyOnJ1bm5pbmc6MAorLzpydW5uaW5nOjAKKzwvc291cmNlPgorCis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IlJlbG9hZCBBbiBFeGlzdGluZyBBcHBsaWNhdGlvbiI+CisKKzxzb3VyY2U+CitodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlci9yZWxvYWQ/cGF0aD0vZXhhbXBsZXMKKzwvc291cmNlPgorCis8cD5TaWduYWwgYW4gZXhpc3RpbmcgYXBwbGljYXRpb24gdG8gc2h1dCBpdHNlbGYgZG93biBhbmQgcmVsb2FkLiAgVGhpcyBjYW4KK2JlIHVzZWZ1bCB3aGVuIHRoZSB3ZWIgYXBwbGljYXRpb24gY29udGV4dCBpcyBub3QgcmVsb2FkYWJsZSBhbmQgeW91IGhhdmUKK3VwZGF0ZWQgY2xhc3NlcyBvciBwcm9wZXJ0eSBmaWxlcyBpbiB0aGUgPGNvZGU+L1dFQi1JTkYvY2xhc3NlczwvY29kZT4KK2RpcmVjdG9yeSBvciB3aGVuIHlvdSBoYXZlIGFkZGVkIG9yIHVwZGF0ZWQgamFyIGZpbGVzIGluIHRoZQorPGNvZGU+L1dFQi1JTkYvbGliPC9jb2RlPiBkaXJlY3RvcnkuCis8L3A+Cis8cD48c3Ryb25nPk5PVEU6PC9zdHJvbmc+IFRoZSA8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPgord2ViIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBub3QgcmVyZWFkIG9uIGEgcmVsb2FkLgorSWYgeW91IGhhdmUgbWFkZSBjaGFuZ2VzIHRvIHlvdXIgd2ViLnhtbCBmaWxlIHlvdSBtdXN0IHN0b3AKK3RoZW4gc3RhcnQgdGhlIHdlYiBhcHBsaWNhdGlvbi4KKzwvcD4KKworPHA+SWYgdGhpcyBjb21tYW5kIHN1Y2NlZWRzLCB5b3Ugd2lsbCBzZWUgYSByZXNwb25zZSBsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KK09LIC0gUmVsb2FkZWQgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIC9leGFtcGxlcworPC9zb3VyY2U+CisKKzxwPk90aGVyd2lzZSwgdGhlIHJlc3BvbnNlIHdpbGwgc3RhcnQgd2l0aCA8Y29kZT5GQUlMPC9jb2RlPiBhbmQgaW5jbHVkZSBhbgorZXJyb3IgbWVzc2FnZS4gIFBvc3NpYmxlIGNhdXNlcyBmb3IgcHJvYmxlbXMgaW5jbHVkZTo8L3A+Cis8dWw+Cis8bGk+PGVtPkVuY291bnRlcmVkIGV4Y2VwdGlvbjwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+QW4gZXhjZXB0aW9uIHdhcyBlbmNvdW50ZXJlZCB0cnlpbmcgdG8gcmVzdGFydCB0aGUgd2ViIGFwcGxpY2F0aW9uLgorICAgIENoZWNrIHRoZSBUb21jYXQgNSBsb2dzIGZvciB0aGUgZGV0YWlscy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8bGk+PGVtPkludmFsaWQgY29udGV4dCBwYXRoIHdhcyBzcGVjaWZpZWQ8L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPlRoZSBjb250ZXh0IHBhdGggbXVzdCBzdGFydCB3aXRoIGEgc2xhc2ggY2hhcmFjdGVyLiBUbyByZWZlcmVuY2UgdGhlCisgICAgUk9PVCB3ZWIgYXBwbGljYXRpb24gdXNlICIvIi48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8bGk+PGVtPk5vIGNvbnRleHQgZXhpc3RzIGZvciBwYXRoIC9mb288L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPlRoZXJlIGlzIG5vIGRlcGxveWVkIGFwcGxpY2F0aW9uIG9uIHRoZSBjb250ZXh0IHBhdGgKKyAgICB0aGF0IHlvdSBzcGVjaWZpZWQuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5ObyBjb250ZXh0IHBhdGggd2FzIHNwZWNpZmllZDwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgVGhlIDxjb2RlPnBhdGg8L2NvZGU+IHBhcmFtZXRlciBpcyByZXF1aXJlZC4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+UmVsb2FkIG5vdCBzdXBwb3J0ZWQgb24gV0FSIGRlcGxveWVkIGF0IHBhdGggL2ZvbzwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgQ3VycmVudGx5LCBhcHBsaWNhdGlvbiByZWxvYWRpbmcgKHRvIHBpY2sgdXAgY2hhbmdlcyB0byB0aGUgY2xhc3NlcyBvcgorICAgIDxjb2RlPndlYi54bWw8L2NvZGU+IGZpbGUpIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBhIHdlYiBhcHBsaWNhdGlvbiBpcworICAgIGRlcGxveWVkIGRpcmVjdGx5IGZyb20gYSBXQVIgZmlsZS4gIEl0IG9ubHkgd29ya3Mgd2hlbiB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgaXMgZGVwbG95ZWQgZnJvbSBhbiB1bnBhY2tlZCBkaXJlY3RvcnkuICBJZiB5b3UgYXJlIHVzaW5nIGEgV0FSIGZpbGUsCisgICAgeW91IHNob3VsZCA8Y29kZT51bmRlcGxveTwvY29kZT4gYW5kIHRoZW4gPGNvZGU+ZGVwbG95PC9jb2RlPiBvcgorICAgIDxjb2RlPmRlcGxveTwvY29kZT4gd2l0aCB0aGUgPGNvZGU+dXBkYXRlPC9jb2RlPiBwYXJhbWV0ZXIgdGhlCisgICAgYXBwbGljYXRpb24gYWdhaW4gdG8gcGljayB1cCB5b3VyIGNoYW5nZXMuCisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8L3VsPgorCis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9Ikxpc3QgT1MgYW5kIEpWTSBQcm9wZXJ0aWVzIj4KKworPHNvdXJjZT4KK2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyL3NlcnZlcmluZm8KKzwvc291cmNlPgorCis8cD5MaXN0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgVG9tY2F0IHZlcnNpb24sIE9TLCBhbmQgSlZNIHByb3BlcnRpZXMuPC9wPgorCis8cD5JZiBhbiBlcnJvciBvY2N1cnMsIHRoZSByZXNwb25zZSB3aWxsIHN0YXJ0IHdpdGggPGNvZGU+RkFJTDwvY29kZT4gYW5kCitpbmNsdWRlIGFuIGVycm9yIG1lc3NhZ2UuICBQb3NzaWJsZSBjYXVzZXMgZm9yIHByb2JsZW1zIGluY2x1ZGU6PC9wPgorPHVsPgorPGxpPjxlbT5FbmNvdW50ZXJlZCBleGNlcHRpb248L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPkFuIGV4Y2VwdGlvbiB3YXMgZW5jb3VudGVyZWQgdHJ5aW5nIHRvIGVudW1lcmF0ZSB0aGUgc3lzdGVtIHByb3BlcnRpZXMuCisgICAgQ2hlY2sgdGhlIFRvbWNhdCA1IGxvZ3MgZm9yIHRoZSBkZXRhaWxzLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzwvdWw+CisKKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iTGlzdCBBdmFpbGFibGUgR2xvYmFsIEpOREkgUmVzb3VyY2VzIj4KKworPHNvdXJjZT4KK2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyL3Jlc291cmNlc1s/dHlwZT14eHh4eF0KKzwvc291cmNlPgorCis8cD5MaXN0IHRoZSBnbG9iYWwgSk5ESSByZXNvdXJjZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB1c2UgaW4gcmVzb3VyY2UKK2xpbmtzIGZvciBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZXMuICBJZiB5b3Ugc3BlY2lmeSB0aGUgPGNvZGU+dHlwZTwvY29kZT4KK3JlcXVlc3QgcGFyYW1ldGVyLCB0aGUgdmFsdWUgbXVzdCBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZgordGhlIHJlc291cmNlIHR5cGUgeW91IGFyZSBpbnRlcmVzdGVkIGluIChmb3IgZXhhbXBsZSwgeW91IHdvdWxkIHNwZWNpZnkKKzxjb2RlPmphdmF4LnNxbC5EYXRhU291cmNlPC9jb2RlPiB0byBhY3F1aXJlIHRoZSBuYW1lcyBvZiBhbGwgYXZhaWxhYmxlCitKREJDIGRhdGEgc291cmNlcykuICBJZiB5b3UgZG8gbm90IHNwZWNpZnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+IHJlcXVlc3QKK3BhcmFtZXRlciwgcmVzb3VyY2VzIG9mIGFsbCB0eXBlcyB3aWxsIGJlIHJldHVybmVkLjwvcD4KKworPHA+RGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIDxjb2RlPnR5cGU8L2NvZGU+IHJlcXVlc3QgcGFyYW1ldGVyIGlzIHNwZWNmaWVkCitvciBub3QsIHRoZSBmaXJzdCBsaW5lIG9mIGEgbm9ybWFsIHJlc3BvbnNlIHdpbGwgYmU6PC9wPgorPHByZT4KKyAgT0sgLSBMaXN0ZWQgZ2xvYmFsIHJlc291cmNlcyBvZiBhbGwgdHlwZXMKKzwvcHJlPgorPHA+b3I8L3A+Cis8cHJlPgorICBPSyAtIExpc3RlZCBnbG9iYWwgcmVzb3VyY2VzIG9mIHR5cGUgeHh4eHgKKzwvcHJlPgorPHA+Zm9sbG93ZWQgYnkgb25lIGxpbmUgZm9yIGVhY2ggcmVzb3VyY2UuICBFYWNoIGxpbmUgaXMgY29tcG9zZWQgb2YgZmllbGRzCitkZWxpbWl0ZWQgYnkgY29sb24gY2hhcmFjdGVycyAoIjoiKSwgYXMgZm9sbG93czo8L3A+Cis8dWw+Cis8bGk+PGVtPkdsb2JhbCBSZXNvdXJjZSBOYW1lPC9lbT4gLSBUaGUgbmFtZSBvZiB0aGlzIGdsb2JhbCBKTkRJIHJlc291cmNlLAorICAgIHdoaWNoIHdvdWxkIGJlIHVzZWQgaW4gdGhlIDxjb2RlPmdsb2JhbDwvY29kZT4gYXR0cmlidXRlIG9mIGEKKyAgICA8Y29kZT4mbHQ7UmVzb3VyY2VMaW5rJmd0OzwvY29kZT4gZWxlbWVudC48L2xpPgorPGxpPjxlbT5HbG9iYWwgUmVzb3VyY2UgVHlwZTwvZW0+IC0gVGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YKKyAgICB0aGlzIGdsb2JhbCBKTkRJIHJlc291cmNlLjwvbGk+Cis8L3VsPgorCis8cD5JZiBhbiBlcnJvciBvY2N1cnMsIHRoZSByZXNwb25zZSB3aWxsIHN0YXJ0IHdpdGggPGNvZGU+RkFJTDwvY29kZT4gYW5kCitpbmNsdWRlIGFuIGVycm9yIG1lc3NhZ2UuICBQb3NzaWJsZSBjYXVzZXMgZm9yIHByb2JsZW1zIGluY2x1ZGU6PC9wPgorPHVsPgorPGxpPjxlbT5FbmNvdW50ZXJlZCBleGNlcHRpb248L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPkFuIGV4Y2VwdGlvbiB3YXMgZW5jb3VudGVyZWQgdHJ5aW5nIHRvIGVudW1lcmF0ZSB0aGUgZ2xvYmFsIEpOREkKKyAgICByZXNvdXJjZXMuICBDaGVjayB0aGUgVG9tY2F0IDUgbG9ncyBmb3IgdGhlIGRldGFpbHMuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5ObyBnbG9iYWwgSk5ESSByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZTwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+VGhlIFRvbWNhdCBzZXJ2ZXIgeW91IGFyZSBydW5uaW5nIGhhcyBiZWVuIGNvbmZpZ3VyZWQgd2l0aG91dAorICAgIGdsb2JhbCBKTkRJIHJlc291cmNlcy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8L3VsPgorCisKKzwvc3Vic2VjdGlvbj4KKworCis8c3Vic2VjdGlvbiBuYW1lPSJMaXN0IEF2YWlsYWJsZSBTZWN1cml0eSBSb2xlcyI+CisKKzxzb3VyY2U+CitodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlci9yb2xlcworPC9zb3VyY2U+CisKKzxwPkxpc3QgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZXMgKGFuZCBjb3JyZXNwb25kaW5nIGRlc2NyaXB0aW9ucykgdGhhdCBhcmUKK2F2YWlsYWJsZSBpbiB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2U8L2NvZGU+IHJlc291cmNlIHRoYXQKK2lzIGxpbmtlZCB0byB0aGUgPGNvZGU+dXNlcnM8L2NvZGU+IHJlc291cmNlIHJlZmVyZW5jZSBpbiB0aGUgd2ViLnhtbCBmaWxlCitmb3IgdGhlIE1hbmFnZXIgd2ViIGFwcGxpY2F0aW9uLiAgVGhpcyB3b3VsZCB0eXBpY2FsbHkgYmUgdXNlZCwgZm9yIGV4YW1wbGUsCitieSBhIGRlcGxveW1lbnQgdG9vbCB0aGF0IHdhbnRlZCB0byBjcmVhdGUKKzxjb2RlPiZsdDtzZWN1cml0eS1yb2xlLXJlZiZndDs8L2NvZGU+IGVsZW1lbnRzIHRvIG1hcCBzZWN1cml0eSByb2xlIG5hbWVzCit1c2VkIGluIGEgd2ViIGFwcGxpY2F0aW9uIHRvIHRoZSByb2xlIG5hbWVzIGFjdHVhbGx5IGRlZmluZWQgd2l0aGluIHRoZQorY29udGFpbmVyLjwvcD4KKworPHA+QnkgZGVmYXVsdCwgdGhlIDxjb2RlPnVzZXJzPC9jb2RlPiByZXNvdXJjZSByZWZlcmVuY2UgaXMgcG9pbnRlZCBhdCB0aGUKK2dsb2JhbCA8Y29kZT5Vc2VyRGF0YWJhc2U8L2NvZGU+IHJlc291cmNlLiAgSWYgeW91IGNob29zZSB0byB1dGlsaXplIGEKK2RpZmZlcmVudCB1c2VyIGRhdGFiYXNlIHBlciB2aXJ0dWFsIGhvc3QsIHlvdSBzaG91bGQgbW9kaWZ5IHRoZQorPGNvZGU+Jmx0O1Jlc291cmNlTGluayZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIGRlZmF1bHQKKzxjb2RlPm1hbmFnZXIueG1sPC9jb2RlPiBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZSB0byBwb2ludCBhdCB0aGUgZ2xvYmFsCit1c2VyIGRhdGFiYXNlIHJlc291cmNlIGZvciB0aGlzIHZpcnR1YWwgaG9zdC48L3A+CisKKzxwPldoZW4gdGhpcyBjb21tYW5kIGlzIGV4ZWN1dGVkLCB0aGUgZmlyc3QgbGluZSBvZiB0aGUgcmVzcG9uc2Ugd2lsbCBiZTo8L3A+Cis8cHJlPgorICBPSyAtIExpc3RlZCBzZWN1cml0eSByb2xlcworPC9wcmU+Cis8cD5mb2xsb3dlZCBieSBvbmUgbGluZSBmb3IgZWFjaCBzZWN1cml0eSByb2xlLiAgRWFjaCBsaW5lIGlzIGNvbXBvc2VkIG9mCitmaWVsZHMgZGVsaW1pdGVkIGJ5IGNvbG9uIGNoYXJhY3RlcnMgKCI6IikgYXMgZm9sbG93czo8L3A+Cis8dWw+Cis8bGk+PGVtPlNlY3VyaXR5IFJvbGUgTmFtZTwvZW0+IC0gQSBzZWN1cml0eSByb2xlIG5hbWUgdGhhdCBpcyBrbm93biB0byBUb21jYXQKKyAgICBpbiB0aGUgdXNlciBkYXRhYmFzZS48L2xpPgorPGxpPjxlbT5EZXNjcmlwdGlvbjwvZW0+IC0gRGVzY3JpcHRpb24gb2YgdGhpcyBzZWN1cml0eSByb2xlICh1c2VmdWwgaW4KKyAgICBjcmVhdGluZyB1c2VyIGludGVyZmFjZXMgZm9yIHNlbGVjdGluZyByb2xlcy48L2xpPgorPC91bD4KKworPHA+SWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgcmVzcG9uc2Ugd2lsbCBzdGFydCB3aXRoIDxjb2RlPkZBSUw8L2NvZGU+IGFuZAoraW5jbHVkZSBhbiBlcnJvciBtZXNzYWdlLiAgUG9zc2libGUgY2F1c2VzIGZvciBwcm9ibGVtcyBpbmNsdWRlOjwvcD4KKzx1bD4KKzxsaT48ZW0+Q2Fubm90IHJlc29sdmUgdXNlciBkYXRhYmFzZSByZWZlcmVuY2U8L2VtPiAtIEEgSk5ESSBlcnJvciBwcmV2ZW50ZWQKKyAgICB0aGUgc3VjY2Vzc2Z1bCBsb29rdXAgb2YgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlPC9jb2RlPgorICAgIHJlc291cmNlLiAgQ2hlY2sgdGhlIFRvbWNhdCBsb2cgZmlsZXMgZm9yIGEgc3RhY2sgdHJhY2UgYXNzb2NpYXRlZCB3aXRoCisgICAgdGhpcyBlcnJvci48L2xpPgorPGxpPjxlbT5ObyB1c2VyIGRhdGFiYXNlIGlzIGF2YWlsYWJsZTwvZW0+IC0gWW91IGhhdmUgbm90IGNvbmZpZ3VyZWQgYSByZXNvdXJjZQorICAgIHJlZmVyZW5jZSBmb3IgdGhlIDxjb2RlPnVzZXJzPC9jb2RlPiByZXNvdXJjZSB0aGF0IHBvaW50cyBhdCBhbgorICAgIGFwcHJvcHJpYXRlIHVzZXIgZGF0YWJhc2UgaW5zdGFuY2UuICBDaGVjayB5b3VyIDxjb2RlPm1hbmFnZXIueG1sPC9jb2RlPgorICAgIGZpbGUgYW5kIGVuc3VyZSB0aGF0IHlvdSBoYXZlIGNyZWF0ZWQgYW4gYXBwcm9wcmlhdGUKKyAgICA8Y29kZT4mbHQ7UmVzb3VyY2VMaW5rJmd0OzwvY29kZT4gb3IKKyAgICA8Y29kZT4mbHQ7UmVzb3VyY2VQYXJhbXMmZ3Q7PC9jb2RlPiBlbGVtZW50IGZvciB0aGlzIHJlc291cmNlLjwvbGk+Cis8L3VsPgorCis8L3N1YnNlY3Rpb24+CisKKworPHN1YnNlY3Rpb24gbmFtZT0iU2Vzc2lvbiBTdGF0aXN0aWNzIj4KKworPHNvdXJjZT4KK2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyL3Nlc3Npb25zP3BhdGg9L2V4YW1wbGVzCis8L3NvdXJjZT4KKworPHA+RGlzcGxheSB0aGUgZGVmYXVsdCBzZXNzaW9uIHRpbWVvdXQgZm9yIGEgd2ViIGFwcGxpY2F0aW9uLCBhbmQgdGhlCitudW1iZXIgb2YgY3VycmVudGx5IGFjdGl2ZSBzZXNzaW9ucyB0aGF0IGZhbGwgd2l0aGluIHRlbi1taW51dGUgcmFuZ2VzIG9mCit0aGVpciBhY3R1YWwgdGltZW91dCB0aW1lcy4gIEZvciBleGFtcGxlLCBhZnRlciByZXN0YXJ0aW5nIFRvbWNhdCBhbmQgdGhlbgorZXhlY3V0aW5nIG9uZSBvZiB0aGUgSlNQIHNhbXBsZXMgaW4gdGhlIDxjb2RlPi9leGFtcGxlczwvY29kZT4gd2ViIGFwcCwKK3lvdSBtaWdodCBnZXQgc29tZXRoaW5nIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorT0sgLSBTZXNzaW9uIGluZm9ybWF0aW9uIGZvciBhcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggL2V4YW1wbGVzCitEZWZhdWx0IG1heGltdW0gc2Vzc2lvbiBpbmFjdGl2ZSBpbnRlcnZhbCAzMCBtaW51dGVzCiszMCAtICZsdDs0MCBtaW51dGVzOjEgc2Vzc2lvbnMKKzwvc291cmNlPgorCis8L3N1YnNlY3Rpb24+CisKKworPHN1YnNlY3Rpb24gbmFtZT0iU3RhcnQgYW4gRXhpc3RpbmcgQXBwbGljYXRpb24iPgorCis8c291cmNlPgoraHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZXIvc3RhcnQ/cGF0aD0vZXhhbXBsZXMKKzwvc291cmNlPgorCis8cD5TaWduYWwgYSBzdG9wcGVkIGFwcGxpY2F0aW9uIHRvIHJlc3RhcnQsIGFuZCBtYWtlIGl0c2VsZiBhdmFpbGFibGUgYWdhaW4uCitTdG9wcGluZyBhbmQgc3RhcnRpbmcgaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgaWYgdGhlIGRhdGFiYXNlIHJlcXVpcmVkIGJ5Cit5b3VyIGFwcGxpY2F0aW9uIGJlY29tZXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUuICBJdCBpcyB1c3VhbGx5IGJldHRlciB0bworc3RvcCB0aGUgd2ViIGFwcGxpY2F0aW9uIHRoYXQgcmVsaWVzIG9uIHRoaXMgZGF0YWJhc2UgcmF0aGVyIHRoYW4gbGV0dGluZwordXNlcnMgY29udGludW91c2x5IGVuY291bnRlciBkYXRhYmFzZSBleGNlcHRpb25zLjwvcD4KKworPHA+SWYgdGhpcyBjb21tYW5kIHN1Y2NlZWRzLCB5b3Ugd2lsbCBzZWUgYSByZXNwb25zZSBsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KK09LIC0gU3RhcnRlZCBhcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggL2V4YW1wbGVzCis8L3NvdXJjZT4KKworPHA+T3RoZXJ3aXNlLCB0aGUgcmVzcG9uc2Ugd2lsbCBzdGFydCB3aXRoIDxjb2RlPkZBSUw8L2NvZGU+IGFuZCBpbmNsdWRlIGFuCitlcnJvciBtZXNzYWdlLiAgUG9zc2libGUgY2F1c2VzIGZvciBwcm9ibGVtcyBpbmNsdWRlOjwvcD4KKzx1bD4KKzxsaT48ZW0+RW5jb3VudGVyZWQgZXhjZXB0aW9uPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5BbiBleGNlcHRpb24gd2FzIGVuY291bnRlcmVkIHRyeWluZyB0byBzdGFydCB0aGUgd2ViIGFwcGxpY2F0aW9uLgorICAgIENoZWNrIHRoZSBUb21jYXQgNSBsb2dzIGZvciB0aGUgZGV0YWlscy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8bGk+PGVtPkludmFsaWQgY29udGV4dCBwYXRoIHdhcyBzcGVjaWZpZWQ8L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPlRoZSBjb250ZXh0IHBhdGggbXVzdCBzdGFydCB3aXRoIGEgc2xhc2ggY2hhcmFjdGVyLiBUbyByZWZlcmVuY2UgdGhlCisgICAgUk9PVCB3ZWIgYXBwbGljYXRpb24gdXNlICIvIi48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8bGk+PGVtPk5vIGNvbnRleHQgZXhpc3RzIGZvciBwYXRoIC9mb288L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPlRoZXJlIGlzIG5vIGRlcGxveWVkIGFwcGxpY2F0aW9uIG9uIHRoZSBjb250ZXh0IHBhdGgKKyAgICB0aGF0IHlvdSBzcGVjaWZpZWQuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5ObyBjb250ZXh0IHBhdGggd2FzIHNwZWNpZmllZDwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgVGhlIDxjb2RlPnBhdGg8L2NvZGU+IHBhcmFtZXRlciBpcyByZXF1aXJlZC4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzwvdWw+CisKKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iU3RvcCBhbiBFeGlzdGluZyBBcHBsaWNhdGlvbiI+CisKKzxzb3VyY2U+CitodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlci9zdG9wP3BhdGg9L2V4YW1wbGVzCis8L3NvdXJjZT4KKworPHA+U2lnbmFsIGFuIGV4aXN0aW5nIGFwcGxpY2F0aW9uIHRvIG1ha2UgaXRzZWxmIHVuYXZhaWxhYmxlLCBidXQgbGVhdmUgaXQKK2RlcGxveWVkLiAgQW55IHJlcXVlc3QgdGhhdCBjb21lcyBpbiB3aGlsZSBhbiBhcHBsaWNhdGlvbiBpcworc3RvcHBlZCB3aWxsIHNlZSBhbiBIVFRQIGVycm9yIDQwNCwgYW5kIHRoaXMgYXBwbGljYXRpb24gd2lsbCBzaG93IGFzCisic3RvcHBlZCIgb24gYSBsaXN0IGFwcGxpY2F0aW9ucyBjb21tYW5kLjwvcD4KKworPHA+SWYgdGhpcyBjb21tYW5kIHN1Y2NlZWRzLCB5b3Ugd2lsbCBzZWUgYSByZXNwb25zZSBsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KK09LIC0gU3RvcHBlZCBhcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggL2V4YW1wbGVzCis8L3NvdXJjZT4KKworPHA+T3RoZXJ3aXNlLCB0aGUgcmVzcG9uc2Ugd2lsbCBzdGFydCB3aXRoIDxjb2RlPkZBSUw8L2NvZGU+IGFuZCBpbmNsdWRlIGFuCitlcnJvciBtZXNzYWdlLiAgUG9zc2libGUgY2F1c2VzIGZvciBwcm9ibGVtcyBpbmNsdWRlOjwvcD4KKzx1bD4KKzxsaT48ZW0+RW5jb3VudGVyZWQgZXhjZXB0aW9uPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5BbiBleGNlcHRpb24gd2FzIGVuY291bnRlcmVkIHRyeWluZyB0byBzdG9wIHRoZSB3ZWIgYXBwbGljYXRpb24uCisgICAgQ2hlY2sgdGhlIFRvbWNhdCA1IGxvZ3MgZm9yIHRoZSBkZXRhaWxzLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+SW52YWxpZCBjb250ZXh0IHBhdGggd2FzIHNwZWNpZmllZDwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+VGhlIGNvbnRleHQgcGF0aCBtdXN0IHN0YXJ0IHdpdGggYSBzbGFzaCBjaGFyYWN0ZXIuIFRvIHJlZmVyZW5jZSB0aGUKKyAgICBST09UIHdlYiBhcHBsaWNhdGlvbiB1c2UgIi8iLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+Tm8gY29udGV4dCBleGlzdHMgZm9yIHBhdGggL2ZvbzwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+VGhlcmUgaXMgbm8gZGVwbG95ZWQgYXBwbGljYXRpb24gb24gdGhlIGNvbnRleHQgcGF0aAorICAgIHRoYXQgeW91IHNwZWNpZmllZC48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8bGk+PGVtPk5vIGNvbnRleHQgcGF0aCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICBUaGUgPGNvZGU+cGF0aDwvY29kZT4gcGFyYW1ldGVyIGlzIHJlcXVpcmVkLgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPC91bD4KKworPC9zdWJzZWN0aW9uPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9IlVuZGVwbG95IGFuIEV4aXN0aW5nIEFwcGxpY2F0aW9uIj4KKworPHNvdXJjZT4KK2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyL3VuZGVwbG95P3BhdGg9L2V4YW1wbGVzCis8L3NvdXJjZT4KKworPHA+PHN0cm9uZz48Zm9udCBjb2xvcj0icmVkIj5XQVJOSU5HPC9mb250PiAtIFRoaXMgY29tbWFuZCB3aWxsIGRlbGV0ZSBhbnkgd2ViIAorYXBwbGljYXRpb24gYXJ0aWZhY3RzIHRoYXQgZXhpc3Qgd2l0aGluIDxjb2RlPmFwcEJhc2U8L2NvZGU+IGRpcmVjdG9yeSAKKyh0eXBpY2FsbHkgIndlYmFwcHMiKSBmb3IgdGhpcyB2aXJ0dWFsIGhvc3Q8L3N0cm9uZz4uCitUaGlzIHdpbGwgZGVsZXRlIHRoZSB0aGUgYXBwbGljYXRpb24gLldBUiwgaWYgcHJlc2VudCwgCit0aGUgYXBwbGljYXRpb24gZGlyZWN0b3J5IHJlc3VsdGluZyBlaXRoZXIgZnJvbSBhIGRlcGxveSBpbiB1bnBhY2tlZCBmb3JtIAorb3IgZnJvbSAuV0FSIGV4cGFuc2lvbiBhcyB3ZWxsIGFzIHRoZSBYTUwgQ29udGV4dCBkZWZpbml0aW9uIGZyb20KKzxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvW2VuZ2luZW5hbWVdL1tob3N0bmFtZV0vPC9jb2RlPiBkaXJlY3RvcnkuIAorSWYgeW91IHNpbXBseSB3YW50IHRvIHRha2UgYW4gYXBwbGljYXRpb24KK291dCBvZiBzZXJ2aWNlLCB5b3Ugc2hvdWxkIHVzZSB0aGUgPGNvZGU+L3N0b3A8L2NvZGU+IGNvbW1hbmQgaW5zdGVhZC48L3A+CisKKzxwPlNpZ25hbCBhbiBleGlzdGluZyBhcHBsaWNhdGlvbiB0byBncmFjZWZ1bGx5IHNodXQgaXRzZWxmIGRvd24sIGFuZAorcmVtb3ZlIGl0IGZyb20gVG9tY2F0ICh3aGljaCBhbHNvIG1ha2VzIHRoaXMgY29udGV4dCBwYXRoIGF2YWlsYWJsZSBmb3IKK3JldXNlIGxhdGVyKS4gIEluIGFkZGl0aW9uLCB0aGUgZG9jdW1lbnQgcm9vdCBkaXJlY3RvcnkgaXMgcmVtb3ZlZCwgaWYgaXQKK2V4aXN0cyBpbiB0aGUgPGNvZGU+YXBwQmFzZTwvY29kZT4gZGlyZWN0b3J5ICh0eXBpY2FsbHkgIndlYmFwcHMiKSBmb3IKK3RoaXMgdmlydHVhbCBob3N0LiAgVGhpcyBjb21tYW5kIGlzIHRoZSBsb2dpY2FsIG9wcG9zaXRlIG9mIHRoZQorPGNvZGU+L2RlcGxveTwvY29kZT4gY29tbWFuZC48L3A+CisKKzxwPklmIHRoaXMgY29tbWFuZCBzdWNjZWVkcywgeW91IHdpbGwgc2VlIGEgcmVzcG9uc2UgbGlrZSB0aGlzOjwvcD4KKzxzb3VyY2U+CitPSyAtIFVuZGVwbG95ZWQgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIC9leGFtcGxlcworPC9zb3VyY2U+CisKKzxwPk90aGVyd2lzZSwgdGhlIHJlc3BvbnNlIHdpbGwgc3RhcnQgd2l0aCA8Y29kZT5GQUlMPC9jb2RlPiBhbmQgaW5jbHVkZSBhbgorZXJyb3IgbWVzc2FnZS4gIFBvc3NpYmxlIGNhdXNlcyBmb3IgcHJvYmxlbXMgaW5jbHVkZTo8L3A+Cis8dWw+Cis8bGk+PGVtPkVuY291bnRlcmVkIGV4Y2VwdGlvbjwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+QW4gZXhjZXB0aW9uIHdhcyBlbmNvdW50ZXJlZCB0cnlpbmcgdG8gdW5kZXBsb3kgdGhlIHdlYiBhcHBsaWNhdGlvbi4KKyAgICBDaGVjayB0aGUgVG9tY2F0IDUgbG9ncyBmb3IgdGhlIGRldGFpbHMuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5JbnZhbGlkIGNvbnRleHQgcGF0aCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5UaGUgY29udGV4dCBwYXRoIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoIGNoYXJhY3Rlci4gVG8gcmVmZXJlbmNlIHRoZQorICAgIFJPT1Qgd2ViIGFwcGxpY2F0aW9uIHVzZSAiLyIuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5ObyBjb250ZXh0IGV4aXN0cyBmb3IgcGF0aCAvZm9vPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5UaGVyZSBpcyBubyBkZXBsb3llZCBhcHBsaWNhdGlvbiBvbiB0aGUgY29udGV4dCBwYXRoCisgICAgdGhhdCB5b3Ugc3BlY2lmaWVkLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+Tm8gY29udGV4dCBwYXRoIHdhcyBzcGVjaWZpZWQ8L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIFRoZSA8Y29kZT5wYXRoPC9jb2RlPiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8L3VsPgorCis8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iRXhlY3V0aW5nIE1hbmFnZXIgQ29tbWFuZHMgV2l0aCBBbnQiPgorCis8cD5JbiBhZGRpdGlvbiB0byB0aGUgYWJpbGl0eSB0byBleGVjdXRlIE1hbmFnZXIgY29tbWFuZHMgdmlhIEhUVFAgcmVxdWVzdHMsCithcyBkb2N1bWVudGVkIGFib3ZlLCBUb21jYXQgNSBpbmNsdWRlcyBhIGNvbnZlbmllbnQgc2V0IG9mIFRhc2sgZGVmaW5pdGlvbnMKK2ZvciB0aGUgPGVtPkFudDwvZW0+ICh2ZXJzaW9uIDEuNCBvciBsYXRlcikgYnVpbGQgdG9vbC4gIEluIG9yZGVyIHRvIHVzZSB0aGVzZQorY29tbWFuZHMsIHlvdSBtdXN0IHBlcmZvcm0gdGhlIGZvbGxvd2luZyBzZXR1cCBvcGVyYXRpb25zOjwvcD4KKzx1bD4KKzxsaT5Eb3dubG9hZCB0aGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBBbnQgZnJvbQorICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZyI+aHR0cDovL2FudC5hcGFjaGUub3JnPC9hPi4KKyAgICBZb3UgbXVzdCB1c2UgdmVyc2lvbiA8c3Ryb25nPjEuNDwvc3Ryb25nPiBvciBsYXRlci48L2xpPgorPGxpPkluc3RhbGwgdGhlIEFudCBkaXN0cmlidXRpb24gaW4gYSBjb252ZW5pZW50IGRpcmVjdG9yeSAoY2FsbGVkCisgICAgQU5UX0hPTUUgaW4gdGhlIHJlbWFpbmRlciBvZiB0aGVzZSBpbnN0cnVjdGlvbnMpLjwvbGk+Cis8bGk+Q29weSB0aGUgZmlsZSA8Y29kZT5zZXJ2ZXIvbGliL2NhdGFsaW5hLWFudC5qYXI8L2NvZGU+IGZyb20geW91ciBUb21jYXQgNQorICAgIGluc3RhbGxhdGlvbiBpbnRvIEFudCdzIGxpYnJhcnkgZGlyZWN0b3J5ICg8Y29kZT4kQU5UX0hPTUUvbGliPC9jb2RlPikuCisgICAgPC9saT4KKzxsaT5BZGQgdGhlIDxjb2RlPiRBTlRfSE9NRS9iaW48L2NvZGU+IGRpcmVjdG9yeSB0byB5b3VyIDxjb2RlPlBBVEg8L2NvZGU+CisgICAgZW52aXJvbm1lbnQgdmFyaWFibGUuPC9saT4KKzxsaT5Db25maWd1cmUgYXQgbGVhc3Qgb25lIHVzZXJuYW1lL3Bhc3N3b3JkIGNvbWJpbmF0aW9uIGluIHlvdXIgVG9tY2F0CisgICAgdXNlciBkYXRhYmFzZSB0aGF0IGluY2x1ZGVzIHRoZSA8Y29kZT5tYW5hZ2VyPC9jb2RlPiByb2xlLjwvbGk+Cis8L3VsPgorCis8cD5UbyB1c2UgY3VzdG9tIHRhc2tzIHdpdGhpbiBBbnQsIHlvdSBtdXN0IGRlY2xhcmUgdGhlbSBmaXJzdCB3aXRoIGEKKzxjb2RlPiZsdDt0YXNrZGVmJmd0OzwvY29kZT4gZWxlbWVudC4gIFRoZXJlZm9yZSwgeW91ciA8Y29kZT5idWlsZC54bWw8L2NvZGU+CitmaWxlIG1pZ2h0IGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczo8L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiPgorPHRyPjx0ZD48cHJlPgorJmx0O3Byb2plY3QgbmFtZT0iTXkgQXBwbGljYXRpb24iIGRlZmF1bHQ9ImNvbXBpbGUiIGJhc2VkaXI9Ii4iJmd0OworCisgICZsdDshLS0gQ29uZmlndXJlIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgd2ViIGFwcGxpY2F0aW9uIGlzIGJ1aWx0IC0tJmd0OworICAmbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQiICAgIHZhbHVlPSIke2Jhc2VkaXJ9L2J1aWxkIi8mZ3Q7CisKKyAgJmx0OyEtLSBDb25maWd1cmUgdGhlIGNvbnRleHQgcGF0aCBmb3IgdGhpcyBhcHBsaWNhdGlvbiAtLSZndDsKKyAgJmx0O3Byb3BlcnR5IG5hbWU9InBhdGgiICAgICB2YWx1ZT0iL215YXBwIi8mZ3Q7CisKKyAgJmx0OyEtLSBDb25maWd1cmUgcHJvcGVydGllcyB0byBhY2Nlc3MgdGhlIE1hbmFnZXIgYXBwbGljYXRpb24gLS0mZ3Q7CisgICZsdDtwcm9wZXJ0eSBuYW1lPSJ1cmwiICAgICAgdmFsdWU9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyIi8mZ3Q7CisgICZsdDtwcm9wZXJ0eSBuYW1lPSJ1c2VybmFtZSIgdmFsdWU9Im15dXNlcm5hbWUiLyZndDsKKyAgJmx0O3Byb3BlcnR5IG5hbWU9InBhc3N3b3JkIiB2YWx1ZT0ibXlwYXNzd29yZCIvJmd0OworCisgICZsdDshLS0gQ29uZmlndXJlIHRoZSBjdXN0b20gQW50IHRhc2tzIGZvciB0aGUgTWFuYWdlciBhcHBsaWNhdGlvbiAtLSZndDsKKyAgJmx0O3Rhc2tkZWYgbmFtZT0iZGVwbG95IiAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LkRlcGxveVRhc2siLyZndDsKKyAgJmx0O3Rhc2tkZWYgbmFtZT0ibGlzdCIgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50Lkxpc3RUYXNrIi8mZ3Q7CisgICZsdDt0YXNrZGVmIG5hbWU9InJlbG9hZCIgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5SZWxvYWRUYXNrIi8mZ3Q7CisgICZsdDt0YXNrZGVmIG5hbWU9InJlc291cmNlcyIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5SZXNvdXJjZXNUYXNrIi8mZ3Q7CisgICZsdDt0YXNrZGVmIG5hbWU9InJvbGVzIiAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5Sb2xlc1Rhc2siLyZndDsKKyAgJmx0O3Rhc2tkZWYgbmFtZT0ic3RhcnQiICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LlN0YXJ0VGFzayIvJmd0OworICAmbHQ7dGFza2RlZiBuYW1lPSJzdG9wIiAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuU3RvcFRhc2siLyZndDsKKyAgJmx0O3Rhc2tkZWYgbmFtZT0idW5kZXBsb3kiICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LlVuZGVwbG95VGFzayIvJmd0OworCisgICZsdDshLS0gRXhlY3V0YWJsZSBUYXJnZXRzIC0tJmd0OworICAmbHQ7dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJDb21waWxlIHdlYiBhcHBsaWNhdGlvbiImZ3Q7CisgICAgJmx0OyEtLSAuLi4gY29uc3RydWN0IHdlYiBhcHBsaWNhdGlvbiBpbiAke2J1aWxkfSBzdWJkaXJlY3RvcnksIGFuZAorICAgICAgICAgICAgZ2VuZXJhdGVkIGEgJHtwYXRofS53YXIgLi4uIC0tJmd0OworICAmbHQ7L3RhcmdldCZndDsKKworICAmbHQ7dGFyZ2V0IG5hbWU9ImRlcGxveSIgZGVzY3JpcHRpb249Ikluc3RhbGwgd2ViIGFwcGxpY2F0aW9uIgorICAgICAgICAgIGRlcGVuZHM9ImNvbXBpbGUiJmd0OworICAgICZsdDtkZXBsb3kgdXJsPSIke3VybH0iIHVzZXJuYW1lPSIke3VzZXJuYW1lfSIgcGFzc3dvcmQ9IiR7cGFzc3dvcmR9IgorICAgICAgICAgICAgcGF0aD0iJHtwYXRofSIgd2FyPSJmaWxlOiR7YnVpbGR9JHtwYXRofS53YXIiLyZndDsKKyAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgJmx0O3RhcmdldCBuYW1lPSJyZWxvYWQiIGRlc2NyaXB0aW9uPSJSZWxvYWQgd2ViIGFwcGxpY2F0aW9uIgorICAgICAgICAgIGRlcGVuZHM9ImNvbXBpbGUiJmd0OworICAgICZsdDtyZWxvYWQgIHVybD0iJHt1cmx9IiB1c2VybmFtZT0iJHt1c2VybmFtZX0iIHBhc3N3b3JkPSIke3Bhc3N3b3JkfSIKKyAgICAgICAgICAgIHBhdGg9IiR7cGF0aH0iLyZndDsKKyAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgJmx0O3RhcmdldCBuYW1lPSJ1bmRlcGxveSIgZGVzY3JpcHRpb249IlJlbW92ZSB3ZWIgYXBwbGljYXRpb24iJmd0OworICAgICZsdDt1bmRlcGxveSB1cmw9IiR7dXJsfSIgdXNlcm5hbWU9IiR7dXNlcm5hbWV9IiBwYXNzd29yZD0iJHtwYXNzd29yZH0iCisgICAgICAgICAgICBwYXRoPSIke3BhdGh9Ii8mZ3Q7CisgICZsdDsvdGFyZ2V0Jmd0OworCismbHQ7L3Byb2plY3QmZ3Q7Cis8L3ByZT48L3RkPjwvdHI+Cis8L3RhYmxlPgorCis8cD5Ob3csIHlvdSBjYW4gZXhlY3V0ZSBjb21tYW5kcyBsaWtlIDxjb2RlPmFudCBkZXBsb3k8L2NvZGU+IHRvIGRlcGxveSB0aGUKK2FwcGxpY2F0aW9uIHRvIGEgcnVubmluZyBpbnN0YW5jZSBvZiBUb21jYXQsIG9yIDxjb2RlPmFudCByZWxvYWQ8L2NvZGU+IHRvCit0ZWxsIFRvbWNhdCB0byByZWxvYWQgaXQuICBOb3RlIGFsc28gdGhhdCBtb3N0IG9mIHRoZSBpbnRlcmVzdGluZyB2YWx1ZXMgaW4KK3RoaXMgPGNvZGU+YnVpbGQueG1sPC9jb2RlPiBmaWxlIGFyZSBkZWZpbmVkIGFzIHJlcGxhY2VhYmxlIHByb3BlcnRpZXMsIHNvCit5b3UgY2FuIG92ZXJyaWRlIHRoZWlyIHZhbHVlcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0Citjb25zaWRlciBpdCBhIHNlY3VyaXR5IHJpc2sgdG8gaW5jbHVkZSB0aGUgcmVhbCBtYW5hZ2VyIHBhc3N3b3JkIGluIHlvdXIKKzxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gZmlsZSdzIHNvdXJjZSBjb2RlLiAgVG8gYXZvaWQgdGhpcywgb21pdCB0aGUgcGFzc3dvcmQKK3Byb3BlcnR5LCBhbmQgc3BlY2lmeSBpdCBmcm9tIHRoZSBjb21tYW5kIGxpbmU6PC9wPgorPHByZT4KKyAgYW50IC1EcGFzc3dvcmQ9c2VjcmV0IGRlcGxveQorPC9wcmU+CisKKzxzdWJzZWN0aW9uIG5hbWU9IlRhc2tzIG91dHB1dCBjYXB0dXJlIj4KKworPHA+VXNpbmcgPGVtPkFudDwvZW0+IHZlcnNpb24gPHN0cm9uZz4xLjYuMjwvc3Ryb25nPiBvciBsYXRlciwKK3RoZSBDYXRhbGluYSB0YXNrcyBvZmZlciB0aGUgb3B0aW9uIHRvIGNhcHR1cmUgdGhlaXIgb3V0cHV0IGluIAorcHJvcGVydGllcyBvciBleHRlcm5hbCBmaWxlcy4gVGhleSBzdXBwb3J0IGRpcmVjdGx5IHRoZSBmb2xsb3dpbmcgc3Vic2V0IG9mIHRoZSAKKzxjb2RlPiZsdDtyZWRpcmVjdG9yJmd0OzwvY29kZT4gdHlwZSBhdHRyaWJ1dGVzOgorPC9wPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRib2R5PgorPHRyPgorPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKzx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgdmFsaWduPSJ0b3AiPm91dHB1dDwvdGQ+Cis8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgYSBmaWxlIHRvIHdoaWNoIHRvIHdyaXRlIHRoZSBvdXRwdXQuIElmCit0aGUgZXJyb3Igc3RyZWFtIGlzIG5vdCBhbHNvIHJlZGlyZWN0ZWQgdG8gYSBmaWxlIG9yIHByb3BlcnR5LCBpdCB3aWxsCithcHBlYXIgaW4gdGhpcyBvdXRwdXQuPC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB2YWxpZ249InRvcCI+ZXJyb3I8L3RkPgorPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byB3aGljaCB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlCitjb21tYW5kIHNob3VsZCBiZSByZWRpcmVjdGVkLjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgdmFsaWduPSJ0b3AiPmxvZ0Vycm9yPC90ZD4KKzx0ZCB2YWxpZ249InRvcCI+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB3aGVuIHlvdSB3aXNoIHRvIHNlZQorZXJyb3Igb3V0cHV0IGluIEFudCdzIGxvZyBhbmQgeW91IGFyZSByZWRpcmVjdGluZyBvdXRwdXQgdG8gYQorZmlsZS9wcm9wZXJ0eS4gVGhlIGVycm9yIG91dHB1dCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0CitmaWxlL3Byb3BlcnR5LiBJZiB5b3UgcmVkaXJlY3QgZXJyb3Igd2l0aCB0aGUgPGk+ZXJyb3I8L2k+IG9yIDxpPmVycm9yUHJvcGVydHk8L2k+CithdHRyaWJ1dGVzLCB0aGlzIHdpbGwgaGF2ZSBubyBlZmZlY3QuPC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB2YWxpZ249InRvcCI+YXBwZW5kPC90ZD4KKzx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBvdXRwdXQgYW5kIGVycm9yIGZpbGVzIHNob3VsZCBiZQorYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXR0ZW4uIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHZhbGlnbj0idG9wIj5jcmVhdGVlbXB0eWZpbGVzPC90ZD4KKzx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBvdXRwdXQgYW5kIGVycm9yIGZpbGVzIHNob3VsZCBiZSBjcmVhdGVkCitldmVuIHdoZW4gZW1wdHkuIERlZmF1bHRzIHRvIDxjb2RlPnRydWU8L2NvZGU+LjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgdmFsaWduPSJ0b3AiPm91dHB1dHByb3BlcnR5PC90ZD4KKzx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgb3V0cHV0IG9mCit0aGUgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLiBVbmxlc3MgdGhlIGVycm9yIHN0cmVhbSBpcyByZWRpcmVjdGVkIHRvCithIHNlcGFyYXRlIGZpbGUgb3Igc3RyZWFtLCB0aGlzIHByb3BlcnR5IHdpbGwgaW5jbHVkZSB0aGUgZXJyb3Igb3V0cHV0LjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgdmFsaWduPSJ0b3AiPmVycm9ycHJvcGVydHk8L3RkPgorPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSBzdGFuZGFyZAorZXJyb3Igb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Cis8L3RyPgorPC90Ym9keT4KKzwvdGFibGU+CisKKzxwPkEgY291cGxlIG9mIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQ6Cis8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRib2R5PgorPHRyPgorPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKzx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgdmFsaWduPSJ0b3AiPmFsd2F5c0xvZzwvdGQ+Cis8dGQgdmFsaWduPSJ0b3AiPlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgd2hlbiB5b3Ugd2lzaCB0byBzZWUgdGhlCitvdXRwdXQgeW91IGFyZSBjYXB0dXJpbmcsIGFwcGVhcmluZyBhbHNvIGluIHRoZSBBbnQncyBsb2cuIEl0IG11c3Qgbm90IGJlCit1c2VkIHVubGVzcyB5b3UgYXJlIGNhcHR1cmluZyB0YXNrIG91dHB1dC4KK0RlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KKzxlbT5UaGlzIGF0dHJpYnV0ZSB3aWxsIGJlIHN1cHBvcnRlZCBkaXJlY3RseSBieSA8Y29kZT4mbHQ7cmVkaXJlY3RvciZndDs8L2NvZGU+CitpbiBBbnQgMS42LjM8L2VtPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KKzx0ZCB2YWxpZ249InRvcCI+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB3aGVuIHlvdSB3aXNoIHRvIGF2b2lkIHRoYXQKK2FueSBtYW5hZ2VyIGNvbW1hbmQgcHJvY2Vzc2luZyBlcnJvciB0ZXJtaW5hdGVzIHRoZSBhbnQgZXhlY3V0aW9uLiBEZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPi4KK0l0IG11c3QgYmUgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgaWYgeW91IHdhbnQgdG8gY2FwdHVyZSBlcnJvciBvdXRwdXQsCitvdGhlcndpc2UgZXhlY3V0aW9uIHdpbGwgdGVybWluYXRlIGJlZm9yZSBhbnl0aGluZyBjYW4gYmUgY2FwdHVyZWQuCis8YnI+PC9icj4KK1RoaXMgYXR0cmlidXRlIGFjdHMgb25seSBvbiBtYW5hZ2VyIGNvbW1hbmQgZXhlY3V0aW9uLAorYW55IHdyb25nIG9yIG1pc3NpbmcgY29tbWFuZCBhdHRyaWJ1dGUgd2lsbCBzdGlsbCBjYXVzZSBBbnQgZXhlY3V0aW9uIHRlcm1pbmF0aW9uLgorPC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorPC90cj4KKzwvdGJvZHk+Cis8L3RhYmxlPgorCis8cD5UaGV5IGFsc28gc3VwcG9ydCB0aGUgZW1iZWRkZWQgPGNvZGU+Jmx0O3JlZGlyZWN0b3ImZ3Q7PC9jb2RlPiBlbGVtZW50CitpbiB3aGljaCB5b3UgY2FuIHNwZWNpZnkKK2l0cyBmdWxsIHNldCBvZiBhdHRyaWJ1dGVzLCBidXQgPGNvZGU+aW5wdXQ8L2NvZGU+LCA8Y29kZT5pbnB1dHN0cmluZzwvY29kZT4gYW5kIAorPGNvZGU+aW5wdXRlbmNvZGluZzwvY29kZT4gdGhhdCwgZXZlbiBpZiBhY2NlcHRlZCwgYXJlIG5vdCB1c2VkIGJlY2F1c2UgdGhleSBoYXZlCitubyBtZWFuaW5nIGluIHRoaXMgY29udGV4dC4KK1JlZmVyIHRvIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZyI+YW50IG1hbnVhbDwvYT4gZm9yIGRldGFpbHMgb24gCis8Y29kZT4mbHQ7cmVkaXJlY3RvciZndDs8L2NvZGU+IGVsZW1lbnQgYXR0cmlidXRlcy4KKzwvcD4KKworPHA+CitIZXJlIGlzIGEgc2FtcGxlIGJ1aWxkIGZpbGUgZXh0cmFjdCB0aGF0IHNob3dzIGhvdyB0aGlzIG91dHB1dCByZWRpcmVjdGlvbiBzdXBwb3J0CitjYW4gYmUgdXNlZDoKKzwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSI+Cis8dHI+PHRkPjxwcmU+CisJJmx0O3RhcmdldCBuYW1lPSJtYW5hZ2VyLmRlcGxveSIKKwkJZGVwZW5kcz0iY29udGV4dC5zdGF0dXMiCisJCWlmPSJjb250ZXh0Lm5vdEluc3RhbGxlZCImZ3Q7CisJCSZsdDtkZXBsb3kgdXJsPSIke21nci51cmx9IgorCQkJdXNlcm5hbWU9IiR7bWdyLnVzZXJuYW1lfSIKKwkJCXBhc3N3b3JkPSIke21nci5wYXNzd29yZH0iCisJCQlwYXRoPSIke21nci5jb250ZXh0LnBhdGh9IgorCQkJY29uZmlnPSIke21nci5jb250ZXh0LmRlc2NyaXB0b3J9Ii8mZ3Q7CisJJmx0Oy90YXJnZXQmZ3Q7CisKKwkmbHQ7dGFyZ2V0IG5hbWU9Im1hbmFnZXIuZGVwbG95LndhciIKKwkJZGVwZW5kcz0iY29udGV4dC5zdGF0dXMiCisJCWlmPSJjb250ZXh0LmRlcGxveWFibGUiJmd0OworCQkmbHQ7ZGVwbG95IHVybD0iJHttZ3IudXJsfSIKKwkJCXVzZXJuYW1lPSIke21nci51c2VybmFtZX0iCisJCQlwYXNzd29yZD0iJHttZ3IucGFzc3dvcmR9IgorCQkJdXBkYXRlPSIke21nci51cGRhdGV9IgorCQkJcGF0aD0iJHttZ3IuY29udGV4dC5wYXRofSIKKwkJCXdhcj0iJHttZ3Iud2FyLmZpbGV9Ii8mZ3Q7CisJJmx0Oy90YXJnZXQmZ3Q7CisJCisJJmx0O3RhcmdldCBuYW1lPSJjb250ZXh0LnN0YXR1cyImZ3Q7CisJCSZsdDtwcm9wZXJ0eSBuYW1lPSJydW5uaW5nIiB2YWx1ZT0iJHttZ3IuY29udGV4dC5wYXRofTpydW5uaW5nIi8mZ3Q7CisJCSZsdDtwcm9wZXJ0eSBuYW1lPSJzdG9wcGVkIiB2YWx1ZT0iJHttZ3IuY29udGV4dC5wYXRofTpzdG9wcGVkIi8mZ3Q7CisJCisJCSZsdDtsaXN0IHVybD0iJHttZ3IudXJsfSIKKwkJCW91dHB1dHByb3BlcnR5PSJjdHguc3RhdHVzIgorCQkJdXNlcm5hbWU9IiR7bWdyLnVzZXJuYW1lfSIKKwkJCXBhc3N3b3JkPSIke21nci5wYXNzd29yZH0iJmd0OworCQkmbHQ7L2xpc3QmZ3Q7CisJCQorCQkmbHQ7Y29uZGl0aW9uIHByb3BlcnR5PSJjb250ZXh0LnJ1bm5pbmciJmd0OworCQkJJmx0O2NvbnRhaW5zIHN0cmluZz0iJHtjdHguc3RhdHVzfSIgc3Vic3RyaW5nPSIke3J1bm5pbmd9Ii8mZ3Q7CisJCSZsdDsvY29uZGl0aW9uJmd0OworCQkmbHQ7Y29uZGl0aW9uIHByb3BlcnR5PSJjb250ZXh0LnN0b3BwZWQiJmd0OworCQkJJmx0O2NvbnRhaW5zIHN0cmluZz0iJHtjdHguc3RhdHVzfSIgc3Vic3RyaW5nPSIke3N0b3BwZWR9Ii8mZ3Q7CisJCSZsdDsvY29uZGl0aW9uJmd0OworCQkmbHQ7Y29uZGl0aW9uIHByb3BlcnR5PSJjb250ZXh0Lm5vdEluc3RhbGxlZCImZ3Q7CisJCQkmbHQ7YW5kJmd0OworCQkJCSZsdDtpc2ZhbHNlIHZhbHVlPSIke2NvbnRleHQucnVubmluZ30iLyZndDsKKwkJCQkmbHQ7aXNmYWxzZSB2YWx1ZT0iJHtjb250ZXh0LnN0b3BwZWR9Ii8mZ3Q7CisJCQkmbHQ7L2FuZCZndDsKKwkJJmx0Oy9jb25kaXRpb24mZ3Q7CisJCSZsdDtjb25kaXRpb24gcHJvcGVydHk9ImNvbnRleHQuZGVwbG95YWJsZSImZ3Q7CisJCQkmbHQ7b3ImZ3Q7CisJCQkJJmx0O2lzdHJ1ZSB2YWx1ZT0iJHtjb250ZXh0Lm5vdEluc3RhbGxlZH0iLyZndDsKKwkJCQkmbHQ7YW5kJmd0OworCQkJCQkmbHQ7aXN0cnVlIHZhbHVlPSIke2NvbnRleHQucnVubmluZ30iLyZndDsKKwkJCQkJJmx0O2lzdHJ1ZSB2YWx1ZT0iJHttZ3IudXBkYXRlfSIvJmd0OworCQkJCSZsdDsvYW5kJmd0OworCQkJCSZsdDthbmQmZ3Q7CisJCQkJCSZsdDtpc3RydWUgdmFsdWU9IiR7Y29udGV4dC5zdG9wcGVkfSIvJmd0OworCQkJCQkmbHQ7aXN0cnVlIHZhbHVlPSIke21nci51cGRhdGV9Ii8mZ3Q7CisJCQkJJmx0Oy9hbmQmZ3Q7CisJCQkmbHQ7L29yJmd0OworCQkmbHQ7L2NvbmRpdGlvbiZndDsKKwkJJmx0O2NvbmRpdGlvbiBwcm9wZXJ0eT0iY29udGV4dC51bmRlcGxveWFibGUiJmd0OworCQkJJmx0O29yJmd0OworCQkJCSZsdDtpc3RydWUgdmFsdWU9IiR7Y29udGV4dC5ydW5uaW5nfSIvJmd0OworCQkJCSZsdDtpc3RydWUgdmFsdWU9IiR7Y29udGV4dC5zdG9wcGVkfSIvJmd0OworCQkJJmx0Oy9vciZndDsKKwkJJmx0Oy9jb25kaXRpb24mZ3Q7CisJJmx0Oy90YXJnZXQmZ3Q7Cis8L3ByZT48L3RkPjwvdHI+Cis8L3RhYmxlPgorCis8cD48c3Ryb25nPldBUk5JTkc6PC9zdHJvbmc+IGV2ZW4gaWYgaXQgZG9lc24ndCBtYWtlIG1hbnkgc2Vuc2UsIGFuZCBpcyBhbHdheXMgYSBiYWQgaWRlYSwKK2NhbGxpbmcgYSBDYXRhbGluYSB0YXNrIG1vcmUgdGhhbiBvbmNlLAorYmFkbHkgc2V0IEFudCB0YXNrcyBkZXBlbmRzIGNoYWlucyBtYXkgY2F1c2UgdGhhdCBhIHRhc2sgYmUgY2FsbGVkCittb3JlIHRoYW4gb25jZSBpbiB0aGUgc2FtZSBBbnQgcnVuLCBldmVuIGlmIG5vdCBpbnRlbmRlZCB0by4gQSBiaXQgb2YgY2F1dGlvbiBzaG91bGQgYmUgZXhlcmNpc2VkIHdoZW4geW91IGFyZQorY2FwdHVyaW5nIG91dHB1dCBmcm9tIHRoYXQgdGFzaywgYmVjYXVzZSB0aGlzIGNvdWxkIGxlYWQgdG8gc29tZXRoaW5nIHVuZXhwZWN0ZWQ6Cis8dWw+Cis8bGk+d2hlbiBjYXB0dXJpbmcgaW4gYSBwcm9wZXJ0eSB5b3Ugd2lsbCBmaW5kIGluIGl0IG9ubHkgdGhlIG91dHB1dCBmcm9tIHRoZSA8ZW0+Zmlyc3Q8L2VtPiBjYWxsLCBiZWNhdXNlCitBbnQgcHJvcGVydGllcyBhcmUgaW1tdXRhYmxlIGFuZCBvbmNlIHNldCB0aGV5IGNhbm5vdCBiZSBjaGFuZ2VkLAorPC9saT4KKzxsaT53aGVuIGNhcHR1cmluZyBpbiBhIGZpbGUsIGVhY2ggcnVuIHdpbGwgb3ZlcndyaXRlIGl0IGFuZCB5b3Ugd2lsbCBmaW5kIGluIGl0IG9ubHkgdGhlIDxlbT5sYXN0PC9lbT4gY2FsbAorb3V0cHV0LCB1bmxlc3MgeW91IGFyZSB1c2luZyB0aGUgPGNvZGU+YXBwZW5kPSJ0cnVlIjwvY29kZT4gYXR0cmlidXRlLCBpbiB3aGljaCBjYXNlIHlvdSB3aWxsCitzZWUgdGhlIG91dHB1dCBvZiBlYWNoIHRhc2sgY2FsbCBhcHBlbmRlZCB0byB0aGUgZmlsZS4KKzwvbGk+Cis8L3VsPgorPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVXNpbmcgdGhlIEpNWCBQcm94eSBTZXJ2bGV0Ij4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJXaGF0IGlzIEpNWCBQcm94eSBTZXJ2bGV0Ij4KKyAgICBUaGUgSk1YIFByb3h5IFNlcnZsZXQgaXMgYSBsaWdodHdlaWdodCBwcm94eSB0byBnZXQgYW5kIHNldCB0aGUKKyAgICB0b21jYXQgaW50ZXJuYWxzLiAoT3IgYW55IGNsYXNzIHRoYXQgaGFzIGJlZW4gZXhwb3NlZCB2aWEgYW4gTUJlYW4pCisgICAgSXRzIHVzYWdlIGlzIG5vdCB2ZXJ5IHVzZXIgZnJpZW5kbHkgYnV0IHRoZSBVSSBpcworICAgIGV4dHJlbWVseSBoZWxwIGZvciBpbnRlZ3JhdGluZyBjb21tYW5kIGxpbmUgc2NyaXB0cyBmb3IgbW9uaXRvcmluZworICAgIGFuZCBjaGFuZ2luZyB0aGUgaW50ZXJuYWxzIG9mIHRvbWNhdC4gWW91IGNhbiBkbyB0d28gdGhpbmdzIHdpdGggdGhlIHByb3h5OgorICAgIGdldCBpbmZvcm1hdGlvbiBhbmQgc2V0IGluZm9ybWF0aW9uLiBGb3IgeW91IHRvIHJlYWxseSB1bmRlcnN0YW5kIHRoZQorICAgIEpNWCBQcm94eSBTZXJ2bGV0LCB5b3Ugc2hvdWxkIGhhdmUgYSBnZW5lcmFsIHVuZGVyc3RhbmRpbmcgb2YgSk1YLgorICAgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgSk1YIGlzLCB0aGVuIHByZXBhcmUgdG8gYmUgY29uZnVzZWQuCisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJKTVggUXVlcnkgY29tbWFuZCI+CisgICAgVGhpcyB0YWtlcyB0aGUgZm9ybToKKzxzb3VyY2U+CitodHRwOi8vd2Vic2VydmVyL21hbmFnZXIvam14cHJveHkvP3FyeT1TVFVGRgorPC9zb3VyY2U+CisgICAgV2hlcmUgPGNvZGU+U1RVRkY8L2NvZGU+IGlzIHRoZSBKTVggcXVlcnkgeW91IHdpc2ggdG8gcGVyZm9ybS4gRm9yIGV4YW1wbGUsCisgICAgaGVyZSBhcmUgc29tZSBxdWVyaWVzIHlvdSBtaWdodCB3aXNoIHRvIHJ1bjoKKyAgICA8dWw+CisgICAgICA8bGk+CisgICAgICAgIDxjb2RlPnFyeT0qJTNBdHlwZSUzRFJlcXVlc3RQcm9jZXNzb3IlMkMqIC0tPgorICAgICAgICAgdHlwZT1SZXF1ZXN0UHJvY2Vzc29yPC9jb2RlPiB3aGljaCB3aWxsIGxvY2F0ZSBhbGwKKyAgICAgICAgIHdvcmtlcnMgd2hpY2ggY2FuIHByb2Nlc3MgcmVxdWVzdHMgYW5kIHJlcG9ydAorICAgICAgICAgdGhlaXIgc3RhdGUuCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICA8Y29kZT5xcnk9KiUzQWoyZWVUeXBlPVNlcnZsZXQlMmMqIC0tPgorICAgICAgICAgICAgajJlZVR5cGU9U2VydmxldDwvY29kZT4gd2hpY2ggcmV0dXJuIGFsbCBsb2FkZWQgc2VydmxldHMuCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICA8Y29kZT5xcnk9Q2F0YWxpbmElM0F0eXBlJTNERW52aXJvbm1lbnQlMkNyZXNvdXJjZXR5cGUlM0RHbG9iYWwlMkNuYW1lJTNEc2ltcGxlVmFsdWUgLS0+CisgICAgICAgICAgICBDYXRhbGluYTp0eXBlPUVudmlyb25tZW50LHJlc291cmNldHlwZT1HbG9iYWwsbmFtZT1zaW1wbGVWYWx1ZTwvY29kZT4KKyAgICAgICAgICAgIHdoaWNoIGxvb2sgZm9yIGEgc3BlY2lmaWMgTUJlYW4gYnkgdGhlIGdpdmVuIG5hbWUuCisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgWW91J2xsIG5lZWQgdG8gZXhwZXJpbWVudCB3aXRoIHRoaXMgdG8gcmVhbGx5IHVuZGVyc3RhbmQgaXRzIGNhcGFiaWxpdGVzLgorICAgIElmIHlvdSBwcm92aWRlIG5vIDxjb2RlPnFyeTwvY29kZT4gcGFyYW1ldGVyLCB0aGVuIGFsbCBvZiB0aGUgTUJlYW5zIHdpbGwKKyAgICBiZSBkaXNwbGF5ZWQuIFdlIHJlYWxseSByZWNvbW1lbmQgbG9va2luZyBhdCB0aGUgdG9tY2F0IHNvdXJjZSBjb2RlIGFuZAorICAgIHVuZGVyc3RhbmQgdGhlIEpNWCBzcGVjIHRvIGdldCBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGFsbCB0aGUgcXVlcmllcworICAgIHlvdSBtYXkgcnVuLgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSk1YIFNldCBjb21tYW5kIj4KKyAgICBOb3cgdGhhdCB5b3UgY2FuIHF1ZXJ5IGFuIE1CZWFuLCBpdHMgdGltZSB0byBtdWNrIHdpdGggVG9tY2F0J3MgaW50ZXJuYWxzIQorICAgIFRoZSBnZW5lcmFsIGZvcm0gb2YgdGhlIHNldCBjb21tYW5kIGlzIDoKKzxzb3VyY2U+CitodHRwOi8vd2Vic2VydmVyL21hbmFnZXIvam14cHJveHkvP3NldD1CRUFOTkFNRSZhbXA7YXR0PU1ZQVRUUklCVVRFJmFtcDt2YWw9TkVXVkFMVUUKKzwvc291cmNlPgorICAgIFNvIHlvdSBuZWVkIHRvIHByb3ZpZGUgMyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgPG9sPgorICAgICAgPGxpPjxjb2RlPnNldDwvY29kZT46IFRoZSBmdWxsIGJlYW4gbmFtZTwvbGk+CisgICAgICA8bGk+PGNvZGU+YXR0PC9jb2RlPjogVGhlIGF0dHJpYnV0ZSB5b3Ugd2lzaCB0byBhbHRlcjwvbGk+CisgICAgICA8bGk+PGNvZGU+dmFsPC9jb2RlPjogVGhlIG5ldyB2YWx1ZSA8L2xpPgorICAgIDwvb2w+CisgICAgSWYgYWxsIGdvZXMgb2ssIHRoZW4gaXQgd2lsbCBzYXkgT0ssIG90aGVyd2lzZSBhbiBlcnJvciBtZXNzYWdlIHdpbGwgYmUKKyAgICBzaG93bi4gRm9yIGV4YW1wbGUsIGxldHMgc2F5IHdlIHdpc2ggdG8gdHVybiB1cCBkZWJ1Z2dpbmcgb24gdGhlIGZseSBmb3IgdGhlCisgICAgPGNvZGU+RXJyb3JSZXBvcnRWYWx2ZTwvY29kZT4uIFRoZSBmb2xsb3dpbmcgd2lsbCBzZXQgZGVidWdnaW5nIHRvIDEwLgorPHNvdXJjZT4KK2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyL2pteHByb3h5LworP3NldD1DYXRhbGluYSUzQXR5cGUlM0RWYWx2ZSUyQ25hbWUlM0RFcnJvclJlcG9ydFZhbHZlJTJDaG9zdCUzRGxvY2FsaG9zdCZhbXA7YXR0PWRlYnVnJmFtcDt2YWw9MTAKKzwvc291cmNlPgorICAgIGFuZCBteSByZXN1bHQgaXMgKFlNTVYpOgorPHNvdXJjZT4KK1Jlc3VsdDogb2sKKzwvc291cmNlPgorCisgICAgSGVyZSBpcyB3aGF0IEkgc2VlIGlmIEkgcGFzcyBpbiBhIGJhZCB2YWx1ZS4gSGVyZSBpcyB0aGUgVVJMIEkgdXNlZCwKKyAgICBJIHRyeSBzZXQgZGVidWdnaW5nIGVxdWFsIHRvICdjb3diZWxsJzoKKzxzb3VyY2U+CitodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlci9qbXhwcm94eS8KKz9zZXQ9Q2F0YWxpbmElM0F0eXBlJTNEVmFsdmUlMkNuYW1lJTNERXJyb3JSZXBvcnRWYWx2ZSUyQ2hvc3QlM0Rsb2NhbGhvc3QmYW1wO2F0dD1kZWJ1ZyZhbXA7dmFsPWNvd2JlbGwKKzwvc291cmNlPgorICAgIFdoZW4gSSB0cnkgdGhhdCwgbXkgcmVzdWx0IGlzCis8c291cmNlPgorRXJyb3I6IGphdmEubGFuZy5OdW1iZXJGb3JtYXRFeGNlcHRpb246IEZvciBpbnB1dCBzdHJpbmc6ICJjb3diZWxsIgorPC9zb3VyY2U+CisgIDwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL21iZWFucy1kZXNjcmlwdG9yLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvbWJlYW5zLWRlc2NyaXB0b3ItaG93dG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZGY4NGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL21iZWFucy1kZXNjcmlwdG9yLWhvd3RvLnhtbApAQCAtMCwwICsxLDYzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0ibWJlYW5zLWRlc2NyaXB0b3ItaG93dG8uaHRtbCI+CisKKyAgICAmcHJvamVjdDsKKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8YXV0aG9yIGVtYWlsPSJhbXlyb2hAYXBhY2hlLm9yZyI+QW15IFJvaDwvYXV0aG9yPgorICAgICAgICA8dGl0bGU+TUJlYW4gRGVzY3JpcHRvciBIb3cgVG88L3RpdGxlPgorICAgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKzxwPlRvbWNhdCA1IHVzZXMgSk1YIE1CZWFucyBhcyB0aGUgdGVjaG5vbG9neSBmb3IgaW1wbGVtZW50aW5nIAorbWFuYWdlYWJpbGl0eSBvZiBUb21jYXQuPC9wPgorCis8cD5UaGUgZGVzY3JpcHRpb25zIG9mIEpNWCBNQmVhbnMgZm9yIENhdGFsaW5hIGFyZSBpbiB0aGUgbWJlYW5zLWRlc2NyaXB0b3IueG1sIAorZmlsZSBpbiBlYWNoIHBhY2thZ2UuPC9wPgorCis8cD5Zb3Ugd2lsbCBuZWVkIHRvIGFkZCBNQmVhbiBkZXNjcmlwdGlvbnMgZm9yIHlvdXIgY3VzdG9tIGNvbXBvbmVudHMgCitpbiBvcmRlciB0byBhdm9pZCBhICJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQiIGV4Y2VwdGlvbi48L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iQWRkaW5nIE1CZWFuIGRlc2NyaXB0aW9ucyI+CisKKzxwPllvdSBtYXkgYWxzbyBhZGQgTUJlYW4gZGVzY3JpcHRpb25zIGZvciBjdXN0b20gY29tcG9uZW50cyBpbiAKK2EgbWJlYW5zLWRlc2NyaXB0b3IueG1sIGZpbGUsIGxvY2F0ZWQgaW4gdGhlIHNhbWUgcGFja2FnZSBhcyB0aGUgY2xhc3MgZmlsZXMKK2l0IGRlc2NyaWJlcy48L3A+CisKKzxzb3VyY2U+CisgICZsdDttYmVhbiAgICAgICAgIG5hbWU9IkxEQVBSZWFsbSIKKyAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuQ2xhc3NOYW1lTUJlYW4iCisgICAgICAgICAgZGVzY3JpcHRpb249IkN1c3RvbSBMREFQUmVhbG0iCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJSZWFsbSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iY29tLm15ZmlybS5teXBhY2thZ2UuTERBUFJlYWxtIiZndDsKKworICAgICZsdDthdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLyZndDsKKworICAgICZsdDthdHRyaWJ1dGUgICBuYW1lPSJkZWJ1ZyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGRlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgZm9yIHRoaXMgY29tcG9uZW50IgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLyZndDsKKyAgICAuCisgICAgLgorICAgIC4KKworICAmbHQ7L21iZWFuJmd0OworPC9zb3VyY2U+CisKKworPC9zZWN0aW9uPgorCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL21vbml0b3JpbmcueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9tb25pdG9yaW5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGJjMTRmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9tb25pdG9yaW5nLnhtbApAQCAtMCwwICsxLDExNDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJtb25pdG9yaW5nLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9InBlcm9AYXBhY2hlLm9yZyI+UGV0ZXIgUm9zc2JhY2g8L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSJyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hdXRob3I+CisgICAgPHRpdGxlPk1vbml0b3JpbmcgYW5kIE1hbmFnaW5nIFRvbWNhdDwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKyAgPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICA8cD5Nb25pdG9yaW5nIGlzIGEgdmVyeSBpbXBvcnRhbnQgcXVlc3Rpb24gdG9kYXkuIExvb2tpbmcgaW5zaWRlIHRoZSBydW5uaW5nCisgICAgICAgIHNlcnZlciwgZ3JhYiBzb21lIHN0YXRpc3RpYyBkYXRhIG9yIHJlY29uZmlndXJlIHNvbWUgYXNwZWN0cyBhcmUgCisgICAgICAgIGRhbGl5IGFkbWluc3RyYXRpb24gdGFza3MuPC9wPiAgCisgIAorICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iRW5hYmxpbmcgSk1YIFJlbW90ZSI+CisKKyAgICA8cD5UaGUgU3VuIHdlYnNpdGUgaW5jbHVkZXMgdGhlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgaG93IHRvIGNvbmZpZ3VyZSBKTVggUmVtb3RlIG9uIEphdmEgNToKKyAgICAgICAgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvbWFuYWdlbWVudC9hZ2VudC5odG1sIj4KKyAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvbWFuYWdlbWVudC9hZ2VudC5odG1sPC9hPi4KKyAgICA8L3A+CisgICAgPHA+Rm9yIHF1aWNrIGluc3RhbGxhdGlvbiB5b3UgZmluZCBoZXJlIGEgc2hvcnQgaW5zdGFsbGF0aW9uIGd1aWRlOjwvcD4KKyAgICA8cD5BZGQgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIHRvIHlvdXIgdG9tY2F0IHN0YXJ0dXAgc2NyaXB0OgorICAgIDxzb3VyY2U+CisgICAgc2V0IENBVEFMSU5BX09QVFM9Ii1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZSBcCisgICAgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnBvcnQ9JW15LmpteC5wb3J0JSBcCisgICAgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbD1mYWxzZSBcCisgICAgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLmF1dGhlbnRpY2F0ZT1mYWxzZSIKKyAgICA8L3NvdXJjZT4KKyAgICA8L3A+CisgICAgPHA+CisgICAgPG9sPgorICAgIDxsaT5XaGVuIHlvdSB0aGluayBhdXRob3Jpc2F0aW9uIGlzIGEgZ29vZCwgYWRkIGFuZCBjaGFuZ2UgdGhpcyA6CisgICAgPHNvdXJjZT4KKyAgICAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuYXV0aGVudGljYXRlPXRydWUgXAorICAgIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5wYXNzd29yZC5maWxlPS4uL2NvbmYvam14cmVtb3RlLnBhc3N3b3JkIFwKKyAgICAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuYWNjZXNzLmZpbGU9Li4vY29uZi9qbXhyZW1vdGUuYWNjZXNzIFwKKyAgICA8L3NvdXJjZT4KKyAgICA8L2xpPgorICAgIDxsaT5lZGl0IHRoZSBhY2Nlc3MgYWxsb3cgZmlsZSA8ZW0+JENBVEFMSU5BX0JBU0UvY29uZi9qbXhyZW1vdGUuYWNjZXNzPC9lbT4gOgorICAgIDxzb3VyY2U+Cittb25pdG9yUm9sZSByZWFkb25seQorY29udHJvbFJvbGUgcmVhZHdyaXRlCisgICAgPC9zb3VyY2U+CisgICAgPC9saT4KKyAgICA8bGk+ZWRpdCB0aGUgcGFzc3dvcmQgZmlsZSA8ZW0+JENBVEFMSU5BX0JBU0UvY29uZi9qbXhyZW1vdGUucGFzc3dvcmQ8L2VtPiA6CisgICAgPHNvdXJjZT4KK21vbml0b3JSb2xlIHRvbWNhdAorY29udHJvbFJvbGUgdG9tY2F0CisgICAgPC9zb3VyY2U+CisgICAgPGI+VGlwcDwvYj46IFBhc3N3b3JkIEZpbGUgbXVzdCBiZSByZWFkb25seSBhbmQgbm90IGFjY2Vzc2FibGUgZnJvbSBldmVyeSAKKyAgICBvdGhlciB1c2VyISBSZW1vdmUgYWxsIG90aGVyIHVzZXJzIHVuZGVyIHdpbmRvd3MgdG8gYWNjZXNzIHRoaXMgZmlsZS4KKyAgICA8L2xpPgorICAgIDwvb2w+CisgICAgPGI+Tm90ZTo8L2I+VGhlIEpTUiAxNjAgSk1YLUFkYXB0b3Igb3BlbnMgYSBzZWNvbmQgZGF0YSBwcm90b2NvbCBwb3J0LiBUaGF0IGlzIGEgcHJvYmxlbQorICAgIHdoZW4geW91IGhhdmUgaW5zdGFsbGVkIGEgbG9jYWwgZmlyZXdhbGwuICBIb3dldmVyLCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcG9zc2libGUKKyAgICB3b3JrYXJvdW5kOiB1c2luZyBhIGN1c3RvbSBKTVhDb25uZWN0b3JTZXJ2ZXIuICBUaGUgY29kZSBmb3IgdGhpcyBpcyBhdmFpbGFibGUKKyAgICBhdCA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM5MDU1IiB0aXRsZT0iQnVnemlsYSAzOTA1NSI+QnVnemlsbGEgMzkwNTU8L2E+LgorICAgIDwvcD4KKyAgICA8cD5BY3RpdmF0ZSBKTVggTVg0SiBIdHRwIEFkYXB0b3Igd2l0aCBKYXZhIDEuNDoKKyAgICA8b2w+CisgICAgICA8bGk+SW5zdGFsbCB0aGUgdG9tY2F0IGNvbXBhdCBwYWNrYWdlPC9saT4KKyAgICAgIDxsaT5JbnN0YWxsIHRoZSBteDRqLXRvb2xzLmphciBhdCBjb21tb24vbGliLiBQbGVhc2UsIHVzZSB0aGUgc2FtZSBNWDRqIAorICAgICAgICAgIHZlcnNpb24gYXMgeW91ciB0b21jYXQgcmVsZWFzZTwvbGk+CisgICAgICA8bGk+Q29uZmlndXJlIGEgTVg0SiBKTVggSFRUUCBBZGFwdG9yIGF0IHlvdXIgQUpQIENvbm5lY3RvcgorICAgICAgPHA+CisgICAgICA8c291cmNlPgorICAgICAgJmx0O0Nvbm5lY3RvciBwb3J0PSIke0FKUC5QT1JUfSIgCisgICAgICAgICAgICBoYW5kbGVyLmxpc3Q9Im14IiAKKyAgICAgICAgICAgIG14LmVuYWJsZWQ9InRydWUiIAorICAgICAgICAgICAgbXguaHR0cEhvc3Q9IiR7Sk1YLkhPU1R9IgorICAgICAgICAgICAgbXguaHR0cFBvcnQ9IiR7Sk1YLlBPUlR9IgorICAgICAgICAgICAgcHJvdG9jb2w9IkFKUC8xLjMiIC8mZ3Q7CisgICAgICA8L3NvdXJjZT4KKyAgICAgIDwvcD4KKyAgICAgIDxwPjxiPlRpcHA8L2I+OiBXaXRoIDxlbT4ke0FKUC5QT1JUfT0wPC9lbT4gbm8gYWpwIGNvbm5lY3Rpb24gd2hlcmUgc3RhcnRlZC4gCisgICAgICA8L3A+CisgICAgICA8cD48Yj5Ob3RlPC9iPjogTVg0SiBKU1IgMTYwIFJNSSBBZGFwdG9yIHRvIHN1cHBvcnQgSkRLIDEuNCBjdXJyZW50bHkgbm90IGludGVncmF0ZWQuCisgICAgICA8L3A+CisgICAgICA8L2xpPgorICAgICAgPGxpPlN0YXJ0IHlvdXIgdG9tY2F0IGFuZCBsb29rIHdpdGggYSBicm93c2VyIGF0IGh0dHA6Ly8ke0pNWC5IT1NUfToke0pNWC5QT1JUfTwvbGk+CisgICAgICA8bGk+V2l0aCB0aGUgbXggY29ubmVjdG9yIHBhcmFtZXRlciA8Y29kZT5teC5hdXRoTW9kZT0iYmFzaWMiIG14LmF1dGhVc2VyPSJ0b21jYXQiIG14LmF1dGhQYXNzd29yZD0ic3RyYW5nZSI8L2NvZGU+IAorICAgICAgICAgIHlvdSBjYW4gY29udHJvbCB0aGUgYWNjZXNzITwvbGk+CisgICAgICA8bGk+QSBjb21wbGV0ZSBsaXN0IG9mIGFsbCB0b21jYXQgY29yZSBNQmVhbnMgY2FuIHlvdSBmaW5kIGF0IDxhIGhyZWY9Imh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy90b21jYXQtNS41LWRvYy9jYXRhbGluYS9mdW5jc3BlY3MvbWJlYW4tbmFtZXMuaHRtbCI+CisgICAgICAgIGh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy90b21jYXQtNS41LWRvYy9jYXRhbGluYS9mdW5jc3BlY3MvbWJlYW4tbmFtZXMuaHRtbDwvYT4uPC9saT4KKyAgICA8L29sPgorICAgIDwvcD4KKworICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iTWFuYWdlIFRvbWNhdCB3aXRoIEpNWCByZW1vdGUgQW50IFRhc2tzIj4KKyAgIDxwPkZvciBzaW1wbGUgdG9tY2F0IGFudCB0YXNrIHVzYWdlIHdpdGggYW50IDEuNi54IHdlIGhhdmUgaW50ZWdyYXRlIGltcG9ydCBhbmQgYW50bGliIHN1cHBvcnQuPC9wPiAgIAorICAgPHA+PGI+YW50bGliPC9iPkNvcHkgeW91ciBjYXRhbGluYS1hbnQuamFyIGZyb20gJENBVEFMSU5BX0hPTUUvc2VydmVyL2xpYiB0byAkQU5UX0hPTUUvbGliLjwvcD4KKyAgIDxwPkZvbGxvd2luZyBleGFtcGxlIHNob3cgdGhlIEpNWCBBY2Nlc3NvciB1c2FnZTo8L3A+CisgICA8dGFibGUgYm9yZGVyPSIxIj4KKyAgIDx0cj48dGQ+PHA+PHByZT4KKyZsdDtwcm9qZWN0IG5hbWU9IkNhdGFsaW5hIEFudCBKTVgiIAorICAgICAgICB4bWxuczpqbXg9ImFudGxpYjpvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5qbXgiIAorICAgICAgICBkZWZhdWx0PSJzdGF0ZSIKKyAgICAgICAgYmFzZWRpcj0iLiImZ3Q7CisgICAgJmx0O3Byb3BlcnR5IG5hbWU9ImpteC5zZXJ2ZXIubmFtZSIgdmFsdWU9ImxvY2FsaG9zdCIgLyZndDsKKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0iam14LnNlcnZlci5wb3J0IiB2YWx1ZT0iOTAxMiIgLyZndDsKKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0iY2x1c3Rlci5zZXJ2ZXIuYWRkcmVzcyIgdmFsdWU9IjE5Mi4xNjguMS43NSIgLyZndDsKKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0iY2x1c3Rlci5zZXJ2ZXIucG9ydCIgdmFsdWU9IjkwMjUiIC8mZ3Q7CisgCisgICAgJmx0O3RhcmdldCBuYW1lPSJzdGF0ZSIgZGVzY3JpcHRpb249IlNob3cgSk1YIENsdXN0ZXIgc3RhdGUiJmd0OworICAgICAgICAmbHQ7am14Om9wZW4KKyAgICAgICAgICAgIGhvc3Q9IiR7am14LnNlcnZlci5uYW1lfSIKKyAgICAgICAgICAgIHBvcnQ9IiR7am14LnNlcnZlci5wb3J0fSIKKyAgICAgICAgICAgIHVzZXJuYW1lPSJjb250cm9sUm9sZSIKKyAgICAgICAgICAgIHBhc3N3b3JkPSJ0b21jYXQiLyZndDsKKyAgICAgICAgJmx0O2pteDpnZXQKKyAgICAgICAgICAgIG5hbWU9IkNhdGFsaW5hOnR5cGU9SURhdGFTZW5kZXIsaG9zdD1sb2NhbGhvc3Qsc2VuZGVyQWRkcmVzcz0ke2NsdXN0ZXIuc2VydmVyLmFkZHJlc3N9LHNlbmRlclBvcnQ9JHtjbHVzdGVyLnNlcnZlci5wb3J0fSIgCisgICAgICAgICAgICBhdHRyaWJ1dGU9ImNvbm5lY3RlZCIKKyAgICAgICAgICAgIHJlc3VsdHByb3BlcnR5PSJJRGF0YVNlbmRlci5iYWNrdXAuY29ubmVjdGVkIgorICAgICAgICAgICAgZWNobz0iZmFsc2UiCisgICAgICAgIC8mZ3Q7CisgICAgICAgJmx0O2pteDpnZXQKKyAgICAgICAgICAgIG5hbWU9IkNhdGFsaW5hOnR5cGU9Q2x1c3RlclNlbmRlcixob3N0PWxvY2FsaG9zdCIgCisgICAgICAgICAgICBhdHRyaWJ1dGU9InNlbmRlck9iamVjdE5hbWVzIgorICAgICAgICAgICAgcmVzdWx0cHJvcGVydHk9InNlbmRlck9iamVjdE5hbWVzIgorICAgICAgICAgICAgZWNobz0iZmFsc2UiCisgICAgICAgIC8mZ3Q7CisgICAgICAgICZsdDshLS0gZ2V0IGN1cnJlbnQgbWF4QWN0aXZlU2Vzc2lvbiBmcm9tIENsdXN0ZXJUZXN0IGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgZWNobyBpdCB0byBhbnQgb3V0cHV0IGFuZCBzdG9yZSBhdCAKKyAgICAgICAgICAgICBwcm9wZXJ0eSAmbHQ7ZW0mZ3Q7Y2x1c3RlcnRlc3QubWF4QWN0aXZlU2Vzc2lvbnMub3JnaW5hbCZsdDsvZW0mZ3Q7CisgICAgICAgIC0tJmd0OworICAgICAgICZsdDtqbXg6Z2V0CisgICAgICAgICAgICBuYW1lPSJDYXRhbGluYTp0eXBlPU1hbmFnZXIscGF0aD0vQ2x1c3RlclRlc3QsaG9zdD1sb2NhbGhvc3QiIAorICAgICAgICAgICAgYXR0cmlidXRlPSJtYXhBY3RpdmVTZXNzaW9ucyIKKyAgICAgICAgICAgIHJlc3VsdHByb3BlcnR5PSJjbHVzdGVydGVzdC5tYXhBY3RpdmVTZXNzaW9ucy5vcmdpbmFsIgorICAgICAgICAgICAgZWNobz0idHJ1ZSIKKyAgICAgICAgLyZndDsKKyAgICAgICAgJmx0OyEtLSBzZXQgbWF4QWN0aXZlU2Vzc2lvbiB0byAxMDAKKyAgICAgICAgLS0mZ3Q7CisgICAgICAgICZsdDtqbXg6c2V0CisgICAgICAgICAgICBuYW1lPSJDYXRhbGluYTp0eXBlPU1hbmFnZXIscGF0aD0vQ2x1c3RlclRlc3QsaG9zdD1sb2NhbGhvc3QiIAorICAgICAgICAgICAgYXR0cmlidXRlPSJtYXhBY3RpdmVTZXNzaW9ucyIKKyAgICAgICAgICAgIHZhbHVlPSIxMDAiCisgICAgICAgICAgICB0eXBlPSJpbnQiCisgICAgICAgIC8mZ3Q7CisgICAgICAgICZsdDshLS0gZ2V0IGFsbCBzZXNzaW9ucyBhbmQgc3BsaXQgcmVzdWx0IGFzIGRlbGltaXRlciAmbHQ7ZW0mZ3Q7U1BBQ0UmbHQ7L2VtJmd0OyBmb3IgZWFzeQorICAgICAgICAgICAgIGFjY2VzcyBhbGwgc2Vzc2lvbiBpZHMgZGlyZWN0bHkgd2l0aCBhbnQgcHJvcGVydHkgc2Vzc2lvbnMuWzAuLm5dLgorICAgICAgICAtLSZndDsKKyAgICAgICAgJmx0O2pteDppbnZva2UKKyAgICAgICAgICAgIG5hbWU9IkNhdGFsaW5hOnR5cGU9TWFuYWdlcixwYXRoPS9DbHVzdGVyVGVzdCxob3N0PWxvY2FsaG9zdCIgCisgICAgICAgICAgICBvcGVyYXRpb249Imxpc3RTZXNzaW9uSWRzIgorICAgICAgICAgICAgcmVzdWx0cHJvcGVydHk9InNlc3Npb25zIgorICAgICAgICAgICAgZWNobz0iZmFsc2UiCisgICAgICAgICAgICBkZWxpbWl0ZXI9IiAiCisgICAgICAgIC8mZ3Q7CisgICAgICAgICZsdDshLS0gQWNjZXNzIHNlc3Npb24gYXR0cmlidXRlICZsdDtlbSZndDtIZWxsbyZsdDsvZW0mZ3Q7IGZyb20gZmlyc3Qgc2Vzc2lvbi4KKyAgICAgICAgLS0mZ3Q7CisgICAgICAgICZsdDtqbXg6aW52b2tlCisgICAgICAgICAgICBuYW1lPSJDYXRhbGluYTp0eXBlPU1hbmFnZXIscGF0aD0vQ2x1c3RlclRlc3QsaG9zdD1sb2NhbGhvc3QiIAorICAgICAgICAgICAgb3BlcmF0aW9uPSJnZXRTZXNzaW9uQXR0cmlidXRlIgorICAgICAgICAgICAgcmVzdWx0cHJvcGVydHk9IkhlbGxvIgorICAgICAgICAgICAgZWNobz0iZmFsc2UiCisgICAgICAgICZndDsKKyAgICAgICAgICAmbHQ7YXJnIHZhbHVlPSIke3Nlc3Npb25zLjB9Ii8mZ3Q7CisgICAgICAgICAgJmx0O2FyZyB2YWx1ZT0iSGVsbG8iLyZndDsKKyAgICAgICAgJmx0Oy9qbXg6aW52b2tlJmd0OyAKKyAgICAgICAgJmx0OyEtLSBRdWVyeSBmb3IgYWxsIGFwcGxpY2F0aW9uIG1hbmFnZXIub2YgdGhlIHNlcnZlciBmcm9tIGFsbCBob3N0cworICAgICAgICAgICAgIGFuZCBiaW5kIGFsbCBhdHRyaWJ1dGVzIGZyb20gYWxsIGZvdW5kIG1hbmFnZXIgbWJlYW5zLgorICAgICAgICAtLSZndDsKKyAgICAgICAgJmx0O2pteDpxdWVyeQorICAgICAgICAgICAgbmFtZT0iQ2F0YWxpbmE6dHlwZT1NYW5hZ2VyLCoiIAorICAgICAgICAgICAgcmVzdWx0cHJvcGVydHk9Im1hbmFnZXIiCisgICAgICAgICAgICBlY2hvPSJ0cnVlIgorICAgICAgICAgICAgYXR0cmlidXRlYmluZGluZz0idHJ1ZSIKKyAgICAgICAgLyZndDsKKyAgICAgICAgJmx0OyEtLSBlY2hvIHRoZSBjcmVhdGUgcHJvcGVydGllcyAtLSZndDsKKyAgICAgICAgJmx0O2VjaG8mZ3Q7CisgICAgICAgICAgIHNlbmRlck9iamVjdE5hbWVzOiAke3NlbmRlck9iamVjdE5hbWVzLjB9CisgICAgICAgICAgIElEYXRhU2VuZGVyLmJhY2t1cC5jb25uZWN0ZWQ6ICR7SURhdGFTZW5kZXIuYmFja3VwLmNvbm5lY3RlZH0KKyAgICAgICAgICAgc2Vzc2lvbjogJHtzZXNzaW9ucy4wfQorICAgICAgICAgICBtYW5hZ2VyLmxlbmd0aDogJHttYW5hZ2VyLmxlbmd0aH0KKyAgICAgICAgICAgbWFuYWdlci4wLm5hbWU6ICR7bWFuYWdlci4wLm5hbWV9CisgICAgICAgICAgIG1hbmFnZXIuMS5uYW1lOiAke21hbmFnZXIuMS5uYW1lfQorICAgICAgICAgICBoZWxsbzogJHtIZWxsb30KKyAgICAgICAgICAgbWFuYWdlci5DbHVzdGVyVGVzdC4wLm5hbWU6ICR7bWFuYWdlci5DbHVzdGVyVGVzdC4wLm5hbWV9CisgICAgICAgICAgIG1hbmFnZXIuQ2x1c3RlclRlc3QuMC5hY3RpdmVTZXNzaW9uczogJHttYW5hZ2VyLkNsdXN0ZXJUZXN0LjAuYWN0aXZlU2Vzc2lvbnN9CisgICAgICAgICAgIG1hbmFnZXIuQ2x1c3RlclRlc3QuMC5jb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9FWFBJUkVEOiAke21hbmFnZXIuQ2x1c3RlclRlc3QuMC5jb3VudGVyU2VuZF9FVlRfU0VTU0lPTl9FWFBJUkVEfQorICAgICAgICAgICBtYW5hZ2VyLkNsdXN0ZXJUZXN0LjAuY291bnRlclNlbmRfRVZUX0dFVF9BTExfU0VTU0lPTlM6ICR7bWFuYWdlci5DbHVzdGVyVGVzdC4wLmNvdW50ZXJTZW5kX0VWVF9HRVRfQUxMX1NFU1NJT05TfQorICAgICAgICAmbHQ7L2VjaG8mZ3Q7ICAgCisKKyAgICAmbHQ7L3RhcmdldCZndDsKKyAKKyZsdDsvcHJvamVjdCZndDsKKyAgIDwvcHJlPjwvcD4KKyAgIDwvdGQ+PC90cj4KKzwvdGFibGU+CisgICA8cD48Yj5pbXBvcnQ6PC9iPiBJbXBvcnQgdGhlIEpNWCBBY2Nlc3NvciBQcm9qZWt0IHdpdGggCisgICA8ZW0+Jmx0O2ltcG9ydCBmaWxlPSIke0NBVEFMSU5BLkhPTUV9L2Jpbi9qbXhhY2Nlc3Nvci10YXNrcy54bWwiIC8mZ3Q7PC9lbT4gYW5kCisgICByZWZlcmVuY2UgdGhlIHRhc2tzIHdpdGggPGVtPmpteE9wZW48L2VtPiwgPGVtPmpteFNldDwvZW0+LCA8ZW0+am14R2V0PC9lbT4sCisgICAgPGVtPmpteFF1ZXJ5PC9lbT4sIDxlbT5qbXhJbnZva2U8L2VtPiw8ZW0+am14RXF1YWxzPC9lbT4gYW5kIDxlbT5qbXhDb25kaXRpb248L2VtPi4gPC9wPgorCisgIDwvc2VjdGlvbj4KKworPCEtLSBPcGVuICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCistLT4KKworPHNlY3Rpb24gbmFtZT0iSk1YQWNjZXNzb3JPcGVuVGFzayAtIGpteCBvcGVuIGNvbm5lY3Rpb24gdGFzayI+Cis8cD4KK0xpc3Qgb2YgQXR0cmlidXRlczxici8+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSI+CisKKyAgPHRyPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkRlZmF1bHQgdmFsdWU8L3RoPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+dXJsPC90ZD4KKyAgICA8dGQ+U2V0IGpteCBjb25uZWN0aW9uIHVybCAtIDxlbT5zZXJ2aWNlOmpteDpybWk6Ly8vam5kaS9ybWk6Ly9sb2NhbGhvc3Q6ODA1MC9qbXhybWk8L2VtPgorICAgIDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5ob3N0PC90ZD4KKyAgICA8dGQ+U2V0IHRoZSBob3N0LCBzaG9ydGN1dCB0aGUgdmVyeSBsb25nIHVybCBzeW50YXguCisgICAgPC90ZD4KKyAgICA8dGQ+PGNvZGU+bG9jYWxob3N0PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5wb3J0PC90ZD4KKyAgICA8dGQ+U2V0IHRoZSByZW1vdGUgY29ubmVjdGlvbiBwb3J0IAorICAgIDwvdGQ+CisgICAgPHRkPjxjb2RlPjgwNTA8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPnVzZXJuYW1lPC90ZD4KKyAgICA8dGQ+cmVtb3RlIGpteCBjb25uZWN0aW9uIHVzZXIgbmFtZS4KKyAgICA8L3RkPgorICAgIDx0ZD48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+cGFzc3dvcmQ8L3RkPgorICAgIDx0ZD5yZW1vdGUgam14IGNvbm5lY3Rpb24gcGFzc3dvcmQuCisgICAgPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPnJlZjwvdGQ+CisgICAgPHRkPk5hbWUgb2YgdGhlIGludGVybmFsIGNvbm5lY3Rpb24gcmVmZXJlbnouIFdpdGggdGhpcyBhdHRyaWJ1dGUgeW91IGNhbgorICAgICAgICBjb25maWd1cmUgbW9yZSB0aGUgb25lIGNvbm5lY3Rpb24gaW5zaWRlIHRoZSBzYW1lIGFudCBwcm9qZWt0LgorICAgIDwvdGQ+CisgICAgPHRkPjxjb2RlPmpteC5zZXJ2ZXI8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmVjaG88L3RkPgorICAgIDx0ZD5FY2hvIHRoZSBjb21tYW5kIHVzYWdlIChmb3IgYW5hbHlzZSBhY2Nlc3Mgb3IgZGVidWdnaW5nKQorICAgIDwvdGQ+CisgICAgPHRkPjxjb2RlPmZhbHNlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIAorICA8dHI+CisgICAgPHRkPmlmPC90ZD4KKyAgICA8dGQ+T25seSBleGVjdXRlIGlmIGEgcHJvcGVydHkgb2YgdGhlIGdpdmVuIG5hbWUgPGI+ZXhpc3RzPC9iPiBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgorICAgIDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD51bmxlc3M8L3RkPgorICAgIDx0ZD5Pbmx5IGV4ZWN1dGUgaWYgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbmFtZSA8Yj5ub3QgZXhpc3RzPC9iPiBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgorICAgIDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKzwvdGFibGU+Cis8L3A+Cis8cD4KK0V4YW1wbGUgdG8gb3BlbiBhIG5ldyBqbXggY29ubmVjdGlvbjxici8+Cis8c291cmNlPgorICAgICZsdDtqbXg6b3BlbgorICAgICAgICAgICAgaG9zdD0iJHtqbXguc2VydmVyLm5hbWV9IgorICAgICAgICAgICAgcG9ydD0iJHtqbXguc2VydmVyLnBvcnR9IgorICAgIC8mZ3Q7Cis8L3NvdXJjZT4KKzwvcD4gIAorPHA+CitFeGFtcGxlIHRvIG9wZW4gYSBqbXggY29ubmVjdGlvbiBmcm9tIHVybCwgd2l0aCBhdXRob3Jpc2F0aW9uIGFuZCAKK3N0b3JlIGF0IG90aGVyIHJlZmVyZW5jZSA8YnIvPgorPHNvdXJjZT4KKyAgICAmbHQ7am14Om9wZW4KKyAgICAgICAgICAgIHVybD0ic2VydmljZTpqbXg6cm1pOi8vL2puZGkvcm1pOi8vbG9jYWxob3N0OjkwMjQvam14cm1pIgorICAgICAgICAgICAgcmVmPSJqbXguc2VydmVyLjkwMjQiCisgICAgICAgICAgICB1c2VybmFtZT0iY29udHJvbFJvbGUiCisgICAgICAgICAgICBwYXNzd29yZD0idG9tY2F0IiAgICAKKyAgICAvJmd0OworPC9zb3VyY2U+Cis8L3A+ICAKKworPHA+CitFeGFtcGxlIHRvIG9wZW4gYSBqbXggY29ubmVjdGlvbiBmcm9tIHVybCwgd2l0aCBhdXRob3Jpc2F0aW9uIGFuZCAKK3N0b3JlIGF0IG90aGVyIHJlZmVyZW5jZSwgYnV0IG9ubHkgd2hlbiBwcm9wZXJ0eSA8ZW0+am14LmlmPC9lbT4gZXhpc3RzIGFuZCAKKzxlbT5qbXgudW5sZXNzPC9lbT4gbm90IGV4aXN0czxici8+Cis8c291cmNlPgorICAgICZsdDtqbXg6b3BlbgorICAgICAgICAgICAgdXJsPSJzZXJ2aWNlOmpteDpybWk6Ly8vam5kaS9ybWk6Ly9sb2NhbGhvc3Q6OTAyNC9qbXhybWkiCisgICAgICAgICAgICByZWY9ImpteC5zZXJ2ZXIuOTAyNCIKKyAgICAgICAgICAgIHVzZXJuYW1lPSJjb250cm9sUm9sZSIKKyAgICAgICAgICAgIHBhc3N3b3JkPSJ0b21jYXQiICAgIAorICAgICAgICAgICAgaWY9ImpteC5pZiIgICAgCisgICAgICAgICAgICB1bmxlc3M9ImpteC51bmxlc3MiICAgIAorICAgIC8mZ3Q7Cis8L3NvdXJjZT4KKzwvcD4gCis8cD48Yj5Ob3RlPC9iPjogQWxsIHByb3BlcnRpZXMgZnJvbSA8ZW0+am14T3BlbjwvZW0+IHRhc2sgYWxzbyBleGlzdHMgYXQgYWxsIAorb3RoZXIgdGFza3MgYW5kIGNvbmRpdGlvbnMuIAorPC9wPgorCis8L3NlY3Rpb24+CisKKzwhLS0gR2V0ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCistLT4KKworPHNlY3Rpb24gbmFtZT0iSk1YQWNjZXNzb3JHZXRUYXNrOiAgZ2V0IGF0dHJpYnV0ZSB2YWx1ZSBhbnQgdGFzayI+Cis8cD4KK0xpc3Qgb2YgQXR0cmlidXRlczxici8+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSI+CisKKyAgPHRyPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkRlZmF1bHQgdmFsdWU8L3RoPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPkZ1bGwgcXVhbGlmaWVkIEpNWCBPYmplY3ROYW1lIC0tIDxlbT5DYXRhbGluYTp0eXBlPVNlcnZlcjwvZW0+CisgICAgPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmF0dHJpYnV0ZTwvdGQ+CisgICAgPHRkPkV4aXN0aW5nIE1iZWFuIGF0dHJpYnV0ZSAoc2VlIFRvbWNhdCBtYmVhbiBkZXNjcmlwdGlvbiBhYm92ZSkKKyAgICA8L3RkPgorICAgIDx0ZD48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+cmVmPC90ZD4KKyAgICA8dGQ+Sk1YIENvbm5lY3Rpb24gcmVmZXJlbmNlCisgICAgPC90ZD4KKyAgICA8dGQ+PGNvZGU+am14LnNlcnZlcjwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+ZWNobzwvdGQ+CisgICAgPHRkPkVjaG8gY29tbWFuZCB1c2FnZSAoYWNjZXNzIGFuZCByZXN1bHQpCisgICAgPC90ZD4KKyAgICA8dGQ+PGNvZGU+ZmFsc2U8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPnJlc3VsdHByb3BlcnR5PC90ZD4KKyAgICA8dGQ+U2F2ZSByZXN1bHQgYXQgdGhpcyBwcm9qZWN0IHByb3BlcnR5CisgICAgPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmRlbGltaXRlcjwvdGQ+CisgICAgPHRkPlNwbGl0IHJlc3VsdCB3aXRoIGRlbGltaXRlciAoamF2YS51dGlsLlN0cmluZ1Rva2VuaXppZXIpIAorICAgICAgICBhbmQgdXNlIHJlc3VsdHByb3BlcnR5IGFzIHByZWZpeCB0byBzdG9yZSB0b2tlbnMuCisgICAgPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPnNlcGFyYXRlYXJyYXlyZXN1bHRzPC90ZD4KKyAgICA8dGQ+V2hlbiByZXR1cm4gdmFsdWUgaXMgYW4gYXJyYXksIHNhdmUgcmVzdWx0IGFzIHByb3BlcnR5IGxpc3QgCisgICAgKDxlbT4kcmVzdWx0cHJvcGVydHkuWzAuLk5dPC9lbT4gYW5kIDxlbT4kcmVzdWx0cHJvcGVydHkubGVuZ2h0PC9lbT4pIAorICAgIDwvdGQ+CisgICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKzwvcD4KKzxwPgorRXhhbXBsZSB0byBnZXQgcmVtb3RlIG1iZWFuIGF0dHJpYnV0ZSBmcm9tIGRlZmF1bHQgam14IGNvbm5lY3Rpb24gPGJyLz4KKzxzb3VyY2U+CisgICAgJmx0O2pteDpnZXQKKyAgICAgICAgbmFtZT0iQ2F0YWxpbmE6dHlwZT1NYW5hZ2VyLHBhdGg9L3NlcnZsZXRzLWV4YW1wbGVzLGhvc3Q9bG9jYWxob3N0IiAKKyAgICAgICAgYXR0cmlidXRlPSJtYXhBY3RpdmVTZXNzaW9ucyIKKyAgICAgICAgcmVzdWx0cHJvcGVydHk9InNlcnZsZXRzLWV4YW1wbGVzLm1heEFjdGl2ZVNlc3Npb25zIgorICAgIC8mZ3Q7Cis8L3NvdXJjZT4KKzwvcD4gIAorPHA+CitFeGFtcGxlIHRvIGdldCBhbmQgcmVzdWx0IGFycmF5IGFuZCBzcGxpdCBpdCBhdCBzZXBhcmF0ZSBwcm9wZXJ0aWVzPGJyLz4KKzxzb3VyY2U+CisgICAgJmx0O2pteDpnZXQKKyAgICAgICAgbmFtZT0iQ2F0YWxpbmE6dHlwZT1DbHVzdGVyU2VuZGVyLGhvc3Q9bG9jYWxob3N0IiAKKyAgICAgICAgYXR0cmlidXRlPSJzZW5kZXJPYmplY3ROYW1lcyIKKyAgICAgICAgcmVzdWx0cHJvcGVydHk9InNlbmRlck9iamVjdE5hbWVzIgorICAgIC8mZ3Q7Cis8L3NvdXJjZT4KK0FjY2VzcyB0aGUgc2VuZGVyT2JqZWN0TmFtZXMgcHJvcGVydGllcyB3aXRoOgorPHNvdXJjZT4KKyAgICAke3NlbmRlck9iamVjdE5hbWVzLmxlbmdodH0gZ2l2ZSB0aGUgbnVtYmVyIG9mIHJldHVybmVkIHNlbmRlciBsaXN0LgorICAgICR7c2VuZGVyT2JqZWN0TmFtZXMuWzAuLk5dfSBmb3VuZCBhbGwgc2VuZGVyIG9iamVjdCBuYW1lcworPC9zb3VyY2U+Cis8L3A+ICAKKworPHA+CitFeGFtcGxlIHRvIGdldCBJRGF0YVNlbmRlciBhdHRyaWJ1dGUgY29ubmVjdGVkIG9ubHkgd2hlbiBjbHVzdGVyIGlzIGNvbmZpZ3VyZWQuCis8c291cmNlPgorJmx0O2pteDpxdWVyeQorICAgIGZhaWxvbmVycm9yPSJmYWxzZSIKKyAgICBuYW1lPSJDYXRhbGluYTp0eXBlPUNsdXN0ZXIsaG9zdD0ke3RvbWNhdC5hcHBsaWNhdGlvbi5ob3N0fSIKKyAgICByZXN1bHRwcm9wZXJ0eT0iY2x1c3RlciIKKy8mZ3Q7CismbHQ7am14OmdldAorICAgIG5hbWU9IkNhdGFsaW5hOnR5cGU9SURhdGFTZW5kZXIsaG9zdD0ke3RvbWNhdC5hcHBsaWNhdGlvbi5ob3N0fSxzZW5kZXJBZGRyZXNzPSR7Y2x1c3Rlci5iYWNrdXAuYWRkcmVzc30sc2VuZGVyUG9ydD0ke2NsdXN0ZXIuYmFja3VwLnBvcnR9IiAKKyAgICBhdHRyaWJ1dGU9ImNvbm5lY3RlZCIKKyAgICByZXN1bHRwcm9wZXJ0eT0iZGF0YXNlbmRlci5jb25uZWN0ZWQiCisgICAgaWY9ImNsdXN0ZXIuMC5uYW1lIiAvJmd0OworPC9zb3VyY2U+Cis8L3A+ICAKKworPC9zZWN0aW9uPgorCis8IS0tIFNldCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorLS0+CisKKzxzZWN0aW9uIG5hbWU9IkpNWEFjY2Vzc29yU2V0VGFzazogIHNldCBhdHRyaWJ1dGUgdmFsdWUgYW50IHRhc2siPgorPHA+CitMaXN0IG9mIEF0dHJpYnV0ZXM8YnIvPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgorCisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5EZWZhdWx0IHZhbHVlPC90aD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5GdWxsIHF1YWxpZmllZCBKTVggT2JqZWN0TmFtZSAtLSA8ZW0+Q2F0YWxpbmE6dHlwZT1TZXJ2ZXI8L2VtPgorICAgIDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5hdHRyaWJ1dGU8L3RkPgorICAgIDx0ZD5FeGlzdGluZyBNYmVhbiBhdHRyaWJ1dGUgKHNlZSBUb21jYXQgbWJlYW4gZGVzY3JpcHRpb24gYWJvdmUpCisgICAgPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPnZhbHVlPC90ZD4KKyAgICA8dGQ+dmFsdWUgdGhhdCBzZXQgdG8gYXR0cmlidXRlIAorICAgIDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD50eXBlPC90ZD4KKyAgICA8dGQ+dHlwZSBvZiB0aGUgYXR0cmlidXRlLgorICAgIDwvdGQ+CisgICAgPHRkPmphdmEubGFuZy5TdHJpbmc8L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+cmVmPC90ZD4KKyAgICA8dGQ+Sk1YIENvbm5lY3Rpb24gcmVmZXJlbmNlCisgICAgPC90ZD4KKyAgICA8dGQ+PGNvZGU+am14LnNlcnZlcjwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+ZWNobzwvdGQ+CisgICAgPHRkPkVjaG8gY29tbWFuZCB1c2FnZSAoYWNjZXNzIGFuZCByZXN1bHQpCisgICAgPC90ZD4KKyAgICA8dGQ+PGNvZGU+ZmFsc2U8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKzwvcD4KKzxwPgorRXhhbXBsZSB0byBzZXQgcmVtb3RlIG1iZWFuIGF0dHJpYnV0ZSB2YWx1ZTxici8+Cis8c291cmNlPgorICAgICZsdDtqbXg6c2V0CisgICAgICAgIG5hbWU9IkNhdGFsaW5hOnR5cGU9TWFuYWdlcixwYXRoPS9zZXJ2bGV0cy1leGFtcGxlcyxob3N0PWxvY2FsaG9zdCIgCisgICAgICAgIGF0dHJpYnV0ZT0ibWF4QWN0aXZlU2Vzc2lvbnMiCisgICAgICAgIHZhbHVlPSI1MDAiCisgICAgICAgIHR5cGU9ImludCIKKyAgICAvJmd0OworPC9zb3VyY2U+Cis8L3A+ICAKKzxwPgorRXhhbXBsZXMgdG8gc2V0IG11bHRpcGxlIHJlbW90ZSBtYmVhbiBhdHRyaWJ1dGVzPGJyLz4KKzxzb3VyY2U+CisgICAgJmx0O2pteDpzZXQKKyAgICAgICAgbmFtZT0iamF2YS5sYW5nOnR5cGU9VGhyZWFkaW5nIiZndDsgCisJCQkgJmx0O2FyZyBuYW1lPSJUaHJlYWRDb250ZW50aW9uTW9uaXRvcmluZ0VuYWJsZWQiIHZhbHVlPSJ0cnVlIiB0eXBlPSJib29sZWFuIi8mZ3Q7CisJCQkgJmx0O2FyZyBuYW1lPSJUaHJlYWRDcHVUaW1lRW5hYmxlZCIgdmFsdWU9ImZhbHNlIiB0eXBlPSJib29sZWFuIi8mZ3Q7CisgICAgJmx0Oy9qbXg6c2V0Jmd0OworPC9zb3VyY2U+Cis8L3A+ICAKKworPC9zZWN0aW9uPgorCis8IS0tIEludm9rZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorLS0+CisKKzxzZWN0aW9uIG5hbWU9IkpNWEFjY2Vzc29ySW52b2tlVGFzazogIGludm9rZSBNYmVhbiBvcGVyYXRpb24gYW50IHRhc2siPgorPHA+CitMaXN0IG9mIEF0dHJpYnV0ZXM8YnIvPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgorCisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5EZWZhdWx0IHZhbHVlPC90aD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5GdWxsIHF1YWxpZmllZCBKTVggT2JqZWN0TmFtZSAtLSA8ZW0+Q2F0YWxpbmE6dHlwZT1TZXJ2ZXI8L2VtPgorICAgIDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5vcGVyYXRpb248L3RkPgorICAgIDx0ZD5FeGlzdGluZyBNYmVhbiBvcGVyYXRpb24gKHNlZSBUb21jYXQgCisgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy90b21jYXQtNS41LWRvYy9jYXRhbGluYS9mdW5jc3BlY3MvZnMtYWRtaW4tb3BlcnMuaHRtbCI+CisgICAgICAgIGh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy90b21jYXQtNS41LWRvYy9jYXRhbGluYS9mdW5jc3BlY3MvZnMtYWRtaW4tb3BlcnMuaHRtbDwvYT4uCisgICAgPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPnJlZjwvdGQ+CisgICAgPHRkPkpNWCBDb25uZWN0aW9uIHJlZmVyZW5jZQorICAgIDwvdGQ+CisgICAgPHRkPjxjb2RlPmpteC5zZXJ2ZXI8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmVjaG88L3RkPgorICAgIDx0ZD5FY2hvIGNvbW1hbmQgdXNhZ2UgKGFjY2VzcyBhbmQgcmVzdWx0KQorICAgIDwvdGQ+CisgICAgPHRkPjxjb2RlPmZhbHNlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5yZXN1bHRwcm9wZXJ0eTwvdGQ+CisgICAgPHRkPlNhdmUgcmVzdWx0IGF0IHRoaXMgcHJvamVjdCBwcm9wZXJ0eQorICAgIDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5kZWxpbWl0ZXI8L3RkPgorICAgIDx0ZD5TcGxpdCByZXN1bHQgd2l0aCBkZWxpbWl0ZXIgKGphdmEudXRpbC5TdHJpbmdUb2tlbml6aWVyKSAKKyAgICAgICAgYW5kIHVzZSByZXN1bHRwcm9wZXJ0eSBhcyBwcmVmaXggdG8gc3RvcmUgdG9rZW5zLgorICAgIDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5zZXBhcmF0ZWFycmF5cmVzdWx0czwvdGQ+CisgICAgPHRkPldoZW4gcmV0dXJuIHZhbHVlIGlzIGFuIGFycmF5LCBzYXZlIHJlc3VsdCBhcyBwcm9wZXJ0eSBsaXN0IAorICAgICg8ZW0+JHJlc3VsdHByb3BlcnR5LlswLi5OXTwvZW0+IGFuZCA8ZW0+JHJlc3VsdHByb3BlcnR5LmxlbmdodDwvZW0+KSAKKyAgICA8L3RkPgorICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKzwvdGFibGU+Cis8L3A+Cis8cD4KK3N0b3AgYW4gYXBwbGljYXRpb24gPGJyLz4KKzxzb3VyY2U+CisgICAgJmx0O2pteDppbnZva2UKKyAgICAgICAgbmFtZT0iQ2F0YWxpbmE6dHlwZT1NYW5hZ2VyLHBhdGg9L3NlcnZsZXRzLWV4YW1wbGVzLGhvc3Q9bG9jYWxob3N0IiAKKyAgICAgICAgb3BlcmF0aW9uPSJzdG9wIi8mZ3Q7Cis8L3NvdXJjZT4KK05vdyB5b3UgY2FuIGZpbmQgdGhlIHNlc3Npb25pZCBhdCA8ZW0+JHtzZXNzaW9ucy5bMC4uTn08L2VtPiBwcm9wZXJ0aWVzIGFuZCBhY2Nlc3MgdGhlIGNvdW50Cit3aXRoICR7c2Vzc2lvbnMubGVuZ2h0fSBwcm9wZXJ0eS4KKzwvcD4gIAorPHA+CitFeGFtcGxlIHRvIGdldCBhbGwgc2Vzc2lvbmlkcyA8YnIvPgorPHNvdXJjZT4KKyAgICAmbHQ7am14Omludm9rZQorICAgICAgICBuYW1lPSJDYXRhbGluYTp0eXBlPU1hbmFnZXIscGF0aD0vc2VydmxldHMtZXhhbXBsZXMsaG9zdD1sb2NhbGhvc3QiIAorICAgICAgICBvcGVyYXRpb249Imxpc3RTZXNzaW9uSWRzIgorICAgICAgICByZXN1bHRwcm9wZXJ0eT0ic2Vzc2lvbnMiCisgICAgICAgIGRlbGltaXRlcj0iICIgICAgICAgIAorICAgIC8mZ3Q7Cis8L3NvdXJjZT4KK05vdyB5b3UgY2FuIGZpbmQgdGhlIHNlc3Npb25pZCBhdCA8ZW0+JHtzZXNzaW9ucy5bMC4uTn08L2VtPiBwcm9wZXJ0aWVzIGFuZCBhY2Nlc3MgdGhlIGNvdW50Cit3aXRoICR7c2Vzc2lvbnMubGVuZ2h0fSBwcm9wZXJ0eS4KKzwvcD4gIAorPHA+CitFeGFtcGxlIHRvIGdldCByZW1vdGUgbWJlYW4gc2Vzc2lvbiBhdHRyaWJ1dGUgZnJvbSBzZXNzaW9uICR7c2Vzc2lvbmlkLjB9PGJyLz4KKzxzb3VyY2U+CisgICAgJmx0O2pteDppbnZva2UKKyAgICAgICAgbmFtZT0iQ2F0YWxpbmE6dHlwZT1NYW5hZ2VyLHBhdGg9L0NsdXN0ZXJUZXN0LGhvc3Q9bG9jYWxob3N0IiAKKyAgICAgICAgb3BlcmF0aW9uPSJnZXRTZXNzaW9uQXR0cmlidXRlIgorICAgICAgICByZXN1bHRwcm9wZXJ0eT0iaGVsbG8iJmd0OworICAgICAgICAgJmx0O2FyZyB2YWx1ZT0iJHtzZXNzaW9uaWQuMH0iLyZndDsKKyAgICAgICAgICZsdDthcmcgdmFsdWU9IkhlbGxvIiAvJmd0OworICZsdDsvam14Omludm9rZSZndDsKKzwvc291cmNlPgorPC9wPgorPHA+CitFeGFtcGxlIHRvIGNyZWF0ZSBhIG5ldyBhY2Nlc3MgbG9nZ2VyIHZhbHZlIGF0IHZob3N0IDxlbT5sb2NhbGhvc3Q8L2VtPgorPHNvdXJjZT4KKyAmbHQ7am14Omludm9rZQorICAgICAgICAgbmFtZT0iQ2F0YWxpbmE6dHlwZT1NQmVhbkZhY3RvcnkiIAorICAgICAgICAgb3BlcmF0aW9uPSJjcmVhdGVBY2NjZXNMb2dnZXJWYWx2ZSIKKyAgICAgICAgIHJlc3VsdHByb3BlcnR5PSJhY2NjZXNMb2dnZXJPYmplY3ROYW1lIgorICZndDsKKyAgICAgJmx0O2FyZyB2YWx1ZT0iQ2F0YWxpbmE6dHlwZT1Ib3N0LGhvc3Q9bG9jYWxob3N0Ii8mZ3Q7CisgJmx0Oy9qbXg6aW52b2tlJmd0OworPC9zb3VyY2U+CitOb3cgeW91IGNhbiBmaW5kIG5ldyBNYmVhbiB3aXRoIG5hbWUgc3RvcmVkIGF0IDxlbT4ke2FjY2Nlc0xvZ2dlck9iamVjdE5hbWV9PC9lbT4KK3Byb2VwcnR5LgorPC9wPiAgCisKKzwvc2VjdGlvbj4KKworPCEtLSBRdWVyeSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorLS0+CisKKzxzZWN0aW9uIG5hbWU9IkpNWEFjY2Vzc29yUXVlcnlUYXNrOiAgcXVlcnkgTWJlYW4gYW50IHRhc2siPgorPHA+CitMaXN0IG9mIEF0dHJpYnV0ZXM8YnIvPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgorCisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5EZWZhdWx0IHZhbHVlPC90aD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5KTVggIE9iamVjdE5hbWUgcXVlcnkgc3RyaW5nIC0tIDxlbT5DYXRhbGluYTp0eXBlPU1hbmFnZXIsKjwvZW0+CisgICAgPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPnJlZjwvdGQ+CisgICAgPHRkPkpNWCBDb25uZWN0aW9uIHJlZmVyZW5jZQorICAgIDwvdGQ+CisgICAgPHRkPjxjb2RlPmpteC5zZXJ2ZXI8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmVjaG88L3RkPgorICAgIDx0ZD5FY2hvIGNvbW1hbmQgdXNhZ2UgKGFjY2VzcyBhbmQgcmVzdWx0KQorICAgIDwvdGQ+CisgICAgPHRkPjxjb2RlPmZhbHNlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5yZXN1bHRwcm9wZXJ0eTwvdGQ+CisgICAgPHRkPlByZWZpeCBwcm9qZWN0IHByb3BlcnR5IG5hbWUgdG8gYWxsIGZvdW5kZWQgTWJlYW5zICg8ZW0+bWJlYW5zLlswLi5OXS5vYmplY3RuYW1lPC9lbT4pCisgICAgPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmF0dHJpYnV0ZWJpbmR1aW5nPC90ZD4KKyAgICA8dGQ+YmluZCBBTEwgTUJlYW4gYXR0cmlidXRlcyBpbiBhZGRpdGlvbiB0byA8ZW0+bmFtZTwvZW0+CisgICAgPC90ZD4KKyAgICA8dGQ+PGNvZGU+ZmFsc2U8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmRlbGltaXRlcjwvdGQ+CisgICAgPHRkPlNwbGl0IHJlc3VsdCB3aXRoIGRlbGltaXRlciAoamF2YS51dGlsLlN0cmluZ1Rva2VuaXppZXIpIAorICAgICAgICBhbmQgdXNlIHJlc3VsdHByb3BlcnR5IGFzIHByZWZpeCB0byBzdG9yZSB0b2tlbnMuCisgICAgPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPnNlcGFyYXRlYXJyYXlyZXN1bHRzPC90ZD4KKyAgICA8dGQ+V2hlbiByZXR1cm4gdmFsdWUgaXMgYW4gYXJyYXksIHNhdmUgcmVzdWx0IGFzIHByb3BlcnR5IGxpc3QgCisgICAgKDxlbT4kcmVzdWx0cHJvcGVydHkuWzAuLk5dPC9lbT4gYW5kIDxlbT4kcmVzdWx0cHJvcGVydHkubGVuZ2h0PC9lbT4pIAorICAgIDwvdGQ+CisgICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKzwvcD4KKzxwPgorR2V0IGFsbCBNYW5hZ2VyIE9iamVjdE5hbWVzIGZyb20gYWxsIHNlcnZpY2VzIGFuZCBIb3N0cyA8YnIvPgorPHNvdXJjZT4KKyAgJmx0O2pteDpxdWVyeQorICAgICAgICAgICBuYW1lPSJDYXRhbGluYTp0eXBlPU1hbmFnZXIsKiAKKyAgICAgICAgICAgcmVzdWx0cHJvcGVydHk9Im1hbmFnZXIiIC8mZ3Q7Cis8L3NvdXJjZT4KK05vdyB5b3UgY2FuIGZpbmQgdGhlIFNlc3Npb24gTWFuYWdlciBhdCA8ZW0+JHttYW5hZ2VyLlswLi5OXS5uYW1lfTwvZW0+IAorcHJvcGVydGllcyBhbmQgYWNjZXNzIHRoZSByZXN1bHQgb2JqZWN0IGNvdW50ZXIgd2l0aCAke21hbmFnZXIubGVuZ3RofSBwcm9wZXJ0eS4KKzwvcD4gIAorPHA+CitFeGFtcGxlIHRvIGdldCB0aGUgTWFuYWdlciBmcm9tIDxlbT5zZXJ2bGV0LWV4YW1wbGVzPC9lbT4gYXBwbGljYXRpb24gYW4gYmluZCBhbGwgbWJlYW4gcHJvcGVydGllczxici8+Cis8c291cmNlPgorICAmbHQ7am14OnF1ZXJ5CisgICAgICAgICAgIG5hbWU9IkNhdGFsaW5hOnR5cGU9TWFuYWdlcixwYXRoPS9zZXJ2bGV0LWV4YW1wbGVzLGhvc3Q9bG9jYWxob3N0KiIgCisgICAgICAgICAgIGF0dHJpYnV0ZWJpbmRpbmc9InRydWUiCisgICAgICAgICAgIHJlc3VsdHByb3BlcnR5PSJtYW5hZ2VyLnNlcnZsZXRFeGFtcGxlcyIgLyZndDsKKzwvc291cmNlPgorTm93IHlvdSBjYW4gZmluZCB0aGUgbWFuYWdlciBhdCA8ZW0+JHttYW5hZ2VyLnNlcnZsZXRFeGFtcGxlcy4wLm5hbWV9PC9lbT4gcHJvcGVydHkKK2FuZCBjYW4gYWNjZXNzIGFsbCBwcm9wZXJ0aWVzIGZyb20gdGhpcyBtYW5hZ2VyIHdpdGggPGVtPiR7bWFuYWdlci5zZXJ2bGV0RXhhbXBsZXMuMC5bbWFuYWdlciBhdHRyaWJ1dGUgbmFtZXNdPC9lbT59LgorVGhlIHJlc3VsdCBvYmplY3QgY291bnRlciBmcm9tIE1CZWFucyBpcyBzdG9yZWQgYWQgJHttYW5hZ2VyLmxlbmd0aH0gcHJvcGVydHkuCis8L3A+ICAKKworPHA+CitFeGFtcGxlIHRvIGdldCBhbGwgTUJlYW5zIGZyb20gYSBzZXJ2ZXIgYW5kIHN0b3JlIGluc2lkZSBhbiBleHRlcm5hbCB4bWwgcHJvcGVydHkgZmlsZTxici8+Cis8c291cmNlPgorJmx0O3Byb2plY3QgbmFtZT0iam14LnF1ZXJ5IiAgICAgICAgIAorICAgICAgICAgICAgeG1sbnM6am14PSJhbnRsaWI6b3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuam14IgorICAgICAgICAgICAgZGVmYXVsdD0icXVlcnktYWxsIiBiYXNlZGlyPSIuIiZndDsKKyZsdDtwcm9wZXJ0eSBuYW1lPSJqbXguaG9zdCIgdmFsdWU9ImxvY2FsaG9zdCIvJmd0OworJmx0O3Byb3BlcnR5IG5hbWU9ImpteC5wb3J0IiB2YWx1ZT0iODA1MCIvJmd0OworJmx0O3Byb3BlcnR5IG5hbWU9ImpteC51c2VybmFtZSIgdmFsdWU9ImNvbnRyb2xSb2xlIi8mZ3Q7CismbHQ7cHJvcGVydHkgbmFtZT0iam14LnBhc3N3b3JkIiB2YWx1ZT0idG9tY2F0Ii8mZ3Q7CisKKyZsdDt0YXJnZXQgbmFtZT0icXVlcnktYWxsIiBkZXNjcmlwdGlvbj0iUXVlcnkgYWxsIE1CZWFucyBvZiBhIHNlcnZlciImZ3Q7CismbHQ7IS0tIENvbmZpZ3VyZSBjb25uZWN0aW9uIC0tJmd0OworJmx0O2pteDpvcGVuIAorICAgIGhvc3Q9IiR7am14Lmhvc3R9IgorICAgIHBvcnQ9IiR7am14LnBvcnR9IgorICAgIHJlZj0iam14LnNlcnZlciIKKyAgICB1c2VybmFtZT0iJHtqbXgudXNlcm5hbWV9IgorICAgIHBhc3N3b3JkPSIke2pteC5wYXNzd29yZH0iLyZndDsKKyZsdDshLS0gUXVlcnkgTUJlYW4gbGlzdCAtLSZndDsKKyZsdDtqbXg6cXVlcnkgCisgICAgbmFtZT0iKjoqIgorICAgIHJlc3VsdHByb3BlcnR5PSJtYmVhbnMiCisgICAgYXR0cmlidXRlYmluZGluZz0iZmFsc2UiLyZndDsKKyAgICAKKyZsdDtlY2hvcHJvcGVydGllcworICAgIGRlc3RmaWxlPSJtYmVhbnMucHJvcGVydGllcyIKKyAgICBwcmVmaXg9Im1iZWFucy4iCisgICAgZm9ybWF0PSJ4bWwiLyZndDsKKyAgICAKKyZsdDshLS0gUHJpbnQgcmVzdWx0cyAtLSZndDsKKyZsdDtlY2hvCisgICAgbWVzc2FnZT0iTnVtYmVyIG9mIE1CZWFucyBpbiBzZXJ2ZXIgJHtqbXguaG9zdH06JHtqbXgucG9ydH0gaXMgJHttYmVhbnMubGVuZ3RofSIvJmd0OworJmx0Oy90YXJnZXQmZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7Cis8L3NvdXJjZT4KK05vdyB5b3UgY2FuIGZpbmQgYWxsIE1CZWFucyBpbnNpZGUgdGhlIGZpbGUgPGVtPm1iZWFucy5wcm9wZXJ0aWVzPC9lbT4uCis8L3A+ICAKKworPC9zZWN0aW9uPgorCis8IS0tIENyZWF0ZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorLS0+CisKKzxzZWN0aW9uIG5hbWU9IkpNWEFjY2Vzc29yQ3JlYXRlVGFzazogIHJlbW90ZSBjcmVhdGUgbWJlYW4gYW50IHRhc2siPgorPHA+CitMaXN0IG9mIEF0dHJpYnV0ZXM8YnIvPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgorCisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5EZWZhdWx0IHZhbHVlPC90aD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5GdWxsIHF1YWxpZmllZCBKTVggT2JqZWN0TmFtZSAtLSA8ZW0+Q2F0YWxpbmE6dHlwZT1NQmVhbkZhY3Rvcnk8L2VtPgorICAgIDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5jbGFzc05hbWU8L3RkPgorICAgIDx0ZD5FeGlzdGluZyBNQmVhbiBmdWxsIHF1YWxpZmllZCBjbGFzc25hbWUgKHNlZSBUb21jYXQgbWJlYW4gZGVzY3JpcHRpb24gYWJvdmUpCisgICAgPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmNsYXNzTG9hZGVyPC90ZD4KKyAgICA8dGQ+T2JqZWN0TmFtZSBvZiBzZXJ2ZXIgb3Igd2ViIGFwcGxpY2F0aW9uIGNsYXNzbG9hZGVyIDxici8+CisgICAgKCA8ZW0+Q2F0YWxpbmE6dHlwZT1TZXJ2ZXJDbGFzc0xvYWRlcixuYW1lPVtzZXJ2ZXIsY29tbW9uLHNoYXJlZF08L2VtPiBvcjxici8+CisgICAgIDxlbT5DYXRhbGluYTp0eXBlPVdlYmFwcENsYXNzTG9hZGVyLHBhdGg9L215YXBwcyxob3N0PWxvY2FsaG9zdDwvZW0+KSAKKyAgICA8L3RkPgorICAgIDx0ZD48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+cmVmPC90ZD4KKyAgICA8dGQ+Sk1YIENvbm5lY3Rpb24gcmVmZXJlbmNlCisgICAgPC90ZD4KKyAgICA8dGQ+PGNvZGU+am14LnNlcnZlcjwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+ZWNobzwvdGQ+CisgICAgPHRkPkVjaG8gY29tbWFuZCB1c2FnZSAoYWNjZXNzIGFuZCByZXN1bHQpCisgICAgPC90ZD4KKyAgICA8dGQ+PGNvZGU+ZmFsc2U8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKzwvcD4KKzxwPgorRXhhbXBsZSB0byBjcmVhdGUgcmVtb3RlIG1iZWFuPGJyLz4KKzxzb3VyY2U+CisgICAgJmx0O2pteDpjcmVhdGUKKyAgICAgICAgICAgICByZWY9IiR7am14LnJlZmVyZW5jZX0iCisgICAgICAgICAgICAgbmFtZT0iQ2F0YWxpbmE6dHlwZT1NQmVhbkZhY3RvcnkiCisgICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5CYXNlTW9kZWxNQmVhbiIKKyAgICAgICAgICAgICBjbGFzc0xvYWRlcj0iQ2F0YWxpbmE6dHlwZT1TZXJ2ZXJDbGFzc0xvYWRlcixuYW1lPXNlcnZlciImZ3Q7ICAgICAgICAgICAgIAorICAgICAgICAgICAgICZsdDtBcmcgdmFsdWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLk1CZWFuRmFjdG9yeSIgLyZndDsKKyAgICAmbHQ7L2pteDpjcmVhdGUmZ3Q7IAorPC9zb3VyY2U+Cis8L3A+ICAKKzxwPgorICAgIDxiPldhcm5pbmc8L2I+OiBBIGxvdCBvZiB0b21jYXQgbWJlYW5zIGNhbid0IGJlIHJlYWxseSBjcmVhdGUgYW5kIGNvbm5lY3Qgd2l0aCA8YnIvPgorICAgIHRoZSBwYXJlbnQuIFRoZSB2YWx2ZSwgY2x1c3RlciBvciByZWFsbSBNYmVhbnMgYXJlIG5vdCBhdXRjb25uZWN0IHdpdGggdGhlcmUgcGFyZW50Ljxici8+IAorICAgIFVzZSA8ZW0+TUJlYW5GYWNyb3J5PC9lbT4gY3JlYXRlIG9wZXJhdGlvbiBpbnN0ZWFkLgorPC9wPgorCis8L3NlY3Rpb24+CisKKzwhLS0gVW5yZWdpc3RlciAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorLS0+CisKKzxzZWN0aW9uIG5hbWU9IkpNWEFjY2Vzc29yVW5yZWdpc3RlclRhc2s6ICByZW1vdGUgdW5yZWdpc3RlciBtYmVhbiBhbnQgdGFzayI+Cis8cD4KK0xpc3Qgb2YgQXR0cmlidXRlczxici8+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSI+CisKKyAgPHRyPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkRlZmF1bHQgdmFsdWU8L3RoPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPkZ1bGwgcXVhbGlmaWVkIEpNWCBPYmplY3ROYW1lIC0tIDxlbT5DYXRhbGluYTp0eXBlPU1CZWFuRmFjdG9yeTwvZW0+CisgICAgPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPnJlZjwvdGQ+CisgICAgPHRkPkpNWCBDb25uZWN0aW9uIHJlZmVyZW5jZQorICAgIDwvdGQ+CisgICAgPHRkPjxjb2RlPmpteC5zZXJ2ZXI8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmVjaG88L3RkPgorICAgIDx0ZD5FY2hvIGNvbW1hbmQgdXNhZ2UgKGFjY2VzcyBhbmQgcmVzdWx0KQorICAgIDwvdGQ+CisgICAgPHRkPjxjb2RlPmZhbHNlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKzwvdGFibGU+Cis8L3A+Cis8cD4KK0V4YW1wbGUgdG8gdW5yZWdpc3RlciByZW1vdGUgbWJlYW48YnIvPgorPHNvdXJjZT4KKyAgICAmbHQ7am14OnVucmVnaXN0ZXIKKyAgICAgICAgbmFtZT0iQ2F0YWxpbmE6dHlwZT1NQmVhbkZhY3RvcnkiIAorICAgIC8mZ3Q7Cis8L3NvdXJjZT4KKzwvcD4gIAorPHA+CisgICAgPGI+V2FybmluZzwvYj46IEEgbG90IG9mIHRvbWNhdCBtYmVhbnMgY2FuJ3QgYmUgcmVhbGx5IHVucmVnaXN0ZXIuIDxici8+CisgICAgVGhlIE1iZWFucyBhcmUgbm90IGRlcmVnaXN0ZXIgZnJvbSBwYXJlbnQuIFVzZSA8ZW0+TUJlYW5GYWNyb3J5PC9lbT4gPGJyLz4KKyAgICByZW1vdmUgb3BlcmF0aW9uIGluc3RlYWQuCis8L3A+CisKKzwvc2VjdGlvbj4KKworPCEtLSBjb25kaXRpb24gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKKy0tPgorCis8c2VjdGlvbiBuYW1lPSJKTVhBY2Nlc3NvckNvbmRpdGlvbjogIGV4cHJlc3MgY29uZGl0aW9uIj4KKzxwPgorTGlzdCBvZiBBdHRyaWJ1dGVzPGJyLz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1Ij4KKworICA8dHI+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+RGVmYXVsdCB2YWx1ZTwvdGg+CisgIDwvdHI+CisKKyA8dHI+CisgICAgPHRkPnVybDwvdGQ+CisgICAgPHRkPlNldCBqbXggY29ubmVjdGlvbiB1cmwgLSA8ZW0+c2VydmljZTpqbXg6cm1pOi8vL2puZGkvcm1pOi8vbG9jYWxob3N0OjgwNTAvam14cm1pPC9lbT4KKyAgICA8L3RkPgorICAgIDx0ZD48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+aG9zdDwvdGQ+CisgICAgPHRkPlNldCB0aGUgaG9zdCwgc2hvcnRjdXQgdGhlIHZlcnkgbG9uZyB1cmwgc3ludGF4LgorICAgIDwvdGQ+CisgICAgPHRkPjxjb2RlPmxvY2FsaG9zdDwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+cG9ydDwvdGQ+CisgICAgPHRkPlNldCB0aGUgcmVtb3RlIGNvbm5lY3Rpb24gcG9ydCAKKyAgICA8L3RkPgorICAgIDx0ZD48Y29kZT44MDUwPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD51c2VybmFtZTwvdGQ+CisgICAgPHRkPnJlbW90ZSBqbXggY29ubmVjdGlvbiB1c2VyIG5hbWUuCisgICAgPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPnBhc3N3b3JkPC90ZD4KKyAgICA8dGQ+cmVtb3RlIGpteCBjb25uZWN0aW9uIHBhc3N3b3JkLgorICAgIDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5yZWY8L3RkPgorICAgIDx0ZD5OYW1lIG9mIHRoZSBpbnRlcm5hbCBjb25uZWN0aW9uIHJlZmVyZW5jZS4gV2l0aCB0aGlzIGF0dHJpYnV0ZSB5b3UgY2FuCisgICAgICAgIGNvbmZpZ3VyZSBtb3JlIHRoZSBvbmUgY29ubmVjdGlvbiBpbnNpZGUgdGhlIHNhbWUgYW50IHByb2pla3QuCisgICAgPC90ZD4KKyAgICA8dGQ+PGNvZGU+am14LnNlcnZlcjwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPkZ1bGwgcXVhbGlmaWVkIEpNWCBPYmplY3ROYW1lIC0tIDxlbT5DYXRhbGluYTp0eXBlPVNlcnZlcjwvZW0+CisgICAgPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmVjaG88L3RkPgorICAgIDx0ZD5FY2hvIGNvbmRpdGlvbiB1c2FnZSAoYWNjZXNzIGFuZCByZXN1bHQpCisgICAgPC90ZD4KKyAgICA8dGQ+PGNvZGU+ZmFsc2U8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmlmPC90ZD4KKyAgICA8dGQ+T25seSBleGVjdXRlIGlmIGEgcHJvcGVydHkgb2YgdGhlIGdpdmVuIG5hbWUgPGI+ZXhpc3RzPC9iPiBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgorICAgIDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD51bmxlc3M8L3RkPgorICAgIDx0ZD5Pbmx5IGV4ZWN1dGUgaWYgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbmFtZSA8Yj5ub3QgZXhpc3RzPC9iPiBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgorICAgIDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD52YWx1ZSAocmVxdWllcmVkKTwvdGQ+CisgICAgPHRkPlNlY29uZCBhcmcgZm9yIG9wZXJhdGlvbgorICAgIDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD50eXBlPC90ZD4KKyAgICA8dGQ+VmFsdWUgdHlwZSB0byBleHByZXNzIG9wZXJhdGlvbiAoc3VwcG9ydCA8ZW0+bG9uZzwvZW0+IGFuZCA8ZW0+ZG91YmxlPC9lbT4pCisgICAgPC90ZD4KKyAgICA8dGQ+PGNvZGU+bG9uZzwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+b3BlcmF0aW9uPC90ZD4KKyAgICA8dGQ+IGV4cHJlc3Mgb25lIAorICAgIDx1bD4KKyAgICA8bGk+PT0gIGVxdWFsczwvbGk+CisgICAgPGxpPiE9ICBub3QgZXF1YWxzPC9saT4KKyAgICA8bGk+Jmd0OyBncmVhdGVyIHRoYW4gKCZhbXA7Z3Q7KTwvbGk+CisgICAgPGxpPiZndDs9IGdyZWF0ZXIgdGhhbiBvciBlcXVhbHMgKCZhbXA7Z3Q7PSk8L2xpPgorICAgIDxsaT4mbHQ7IGxlc3NlciB0aGFuICgmYW1wO2x0Oyk8L2xpPgorICAgIDxsaT4mbHQ7PSBsZXNzZXIgdGhhbiBvciBlcXVhbHMgKCZhbXA7bHQ7PSk8L2xpPgorICAgIDwvdWw+ICAgICAgICAgCisgICAgPC90ZD4KKyAgICA8dGQ+PGNvZGU+PT08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKzwvcD4KKzxwPgorV2FpdCBmb3Igc2VydmVyIGNvbm5lY3Rpb24gYW5kIHRoYXQgY2x1c3RlciBiYWNrdXAgbm9kZSBpcyBhY2Nlc3NhYmxlPGJyLz4KKzxzb3VyY2U+CisgICAgICAmbHQ7dGFyZ2V0IG5hbWU9IndhaXQiJmd0OworICAgICAgICAgJmx0O3dhaXRmb3IgbWF4d2FpdD0iJHttYXh3YWl0fSIgbWF4d2FpdHVuaXQ9InNlY29uZCIgdGltZW91dHByb3BlcnR5PSJzZXJ2ZXIudGltZW91dCIgJmd0OworICAgICAgICAgICAgJmx0O2FuZCZndDsKKyAgICAgICAgICAgICAgICAmbHQ7c29ja2V0IHNlcnZlcj0iJHtzZXJ2ZXIubmFtZX0iIHBvcnQ9IiR7c2VydmVyLnBvcnR9Ii8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2h0dHAgdXJsPSIke3VybH0iLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7am14OmNvbmRpdGlvbgorICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb249Ij09IiAKKyAgICAgICAgICAgICAgICAgICAgaG9zdD0ibG9jYWxob3N0IiAKKyAgICAgICAgICAgICAgICAgICAgcG9ydD0iOTAxNCIKKyAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU9ImNvbnRyb2xSb2xlIgorICAgICAgICAgICAgICAgICAgICBwYXNzd29yZD0idG9tY2F0IgorICAgICAgICAgICAgICAgICAgICBuYW1lPSJDYXRhbGluYTp0eXBlPUlEYXRhU2VuZGVyLGhvc3Q9bG9jYWxob3N0LHNlbmRlckFkZHJlc3M9MTkyLjE2OC4xMTEuMSxzZW5kZXJQb3J0PTkwMjUiCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZT0iY29ubmVjdGVkIgorICAgICAgICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICAvJmd0OworICAgICAgICAgICAgJmx0Oy9hbmQmZ3Q7CisgICAgICAgICZsdDsvd2FpdGZvciZndDsKKyAgICAgICAgJmx0O2ZhaWwgaWY9InNlcnZlci50aW1lb3V0IiBtZXNzYWdlPSJTZXJ2ZXIgJHt1cmx9IGRvbid0IGFuc3dlciBpbnNpZGUgJHttYXh3YWl0fSBzZWMiIC8mZ3Q7CisgICAgICAgICZsdDtlY2hvIG1lc3NhZ2U9IlNlcnZlciAke3VybH0gYWxpdmUiIC8mZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7Cis8L3NvdXJjZT4KKzwvcD4gIAorCis8L3NlY3Rpb24+CisKKzwhLS0gRXF1YWxzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCistLT4KKworPHNlY3Rpb24gbmFtZT0iSk1YQWNjZXNzb3JFcXVhbHNDb25kaXRpb246ICBlcXVhbHMgTWJlYW4gYW50IGNvbmRpdGlvbiI+Cis8cD4KK0xpc3Qgb2YgQXR0cmlidXRlczxici8+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSI+CisKKyAgPHRyPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkRlZmF1bHQgdmFsdWU8L3RoPgorICA8L3RyPgorCisgPHRyPgorICAgIDx0ZD51cmw8L3RkPgorICAgIDx0ZD5TZXQgam14IGNvbm5lY3Rpb24gdXJsIC0gPGVtPnNlcnZpY2U6am14OnJtaTovLy9qbmRpL3JtaTovL2xvY2FsaG9zdDo4MDUwL2pteHJtaTwvZW0+CisgICAgPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmhvc3Q8L3RkPgorICAgIDx0ZD5TZXQgdGhlIGhvc3QsIHNob3J0Y3V0IHRoZSB2ZXJ5IGxvbmcgdXJsIHN5bnRheC4KKyAgICA8L3RkPgorICAgIDx0ZD48Y29kZT5sb2NhbGhvc3Q8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPnBvcnQ8L3RkPgorICAgIDx0ZD5TZXQgdGhlIHJlbW90ZSBjb25uZWN0aW9uIHBvcnQgCisgICAgPC90ZD4KKyAgICA8dGQ+PGNvZGU+ODA1MDwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+dXNlcm5hbWU8L3RkPgorICAgIDx0ZD5yZW1vdGUgam14IGNvbm5lY3Rpb24gdXNlciBuYW1lLgorICAgIDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5wYXNzd29yZDwvdGQ+CisgICAgPHRkPnJlbW90ZSBqbXggY29ubmVjdGlvbiBwYXNzd29yZC4KKyAgICA8L3RkPgorICAgIDx0ZD48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+cmVmPC90ZD4KKyAgICA8dGQ+TmFtZSBvZiB0aGUgaW50ZXJuYWwgY29ubmVjdGlvbiByZWZlcmVuei4gV2l0aCB0aGlzIGF0dHJpYnV0ZSB5b3UgY2FuCisgICAgICAgIGNvbmZpZ3VyZSBtb3JlIHRoZSBvbmUgY29ubmVjdGlvbiBpbnNpZGUgdGhlIHNhbWUgYW50IHByb2pla3QuCisgICAgPC90ZD4KKyAgICA8dGQ+PGNvZGU+am14LnNlcnZlcjwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPkZ1bGwgcXVhbGlmaWVkIEpNWCBPYmplY3ROYW1lIC0tIDxlbT5DYXRhbGluYTp0eXBlPVNlcnZlcjwvZW0+CisgICAgPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworCisgIDx0cj4KKyAgICA8dGQ+ZWNobzwvdGQ+CisgICAgPHRkPkVjaG8gY29uZGl0aW9uIHVzYWdlIChhY2Nlc3MgYW5kIHJlc3VsdCkKKyAgICA8L3RkPgorICAgIDx0ZD48Y29kZT5mYWxzZTwvY29kZT48L3RkPgorICA8L3RyPgorCis8L3RhYmxlPgorPC9wPgorPHA+CitXYWl0IGZvciBzZXJ2ZXIgY29ubmVjdGlvbiBhbmQgdGhhdCBjbHVzdGVyIGJhY2t1cCBub2RlIGlzIGFjY2Vzc2FibGU8YnIvPgorPHNvdXJjZT4KKyAgICAgICZsdDt0YXJnZXQgbmFtZT0id2FpdCImZ3Q7CisgICAgICAgICAmbHQ7d2FpdGZvciBtYXh3YWl0PSIke21heHdhaXR9IiBtYXh3YWl0dW5pdD0ic2Vjb25kIiB0aW1lb3V0cHJvcGVydHk9InNlcnZlci50aW1lb3V0IiAmZ3Q7CisgICAgICAgICAgICAmbHQ7YW5kJmd0OworICAgICAgICAgICAgICAgICZsdDtzb2NrZXQgc2VydmVyPSIke3NlcnZlci5uYW1lfSIgcG9ydD0iJHtzZXJ2ZXIucG9ydH0iLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7aHR0cCB1cmw9IiR7dXJsfSIvJmd0OworICAgICAgICAgICAgICAgICZsdDtqbXg6ZXF1YWxzIAorICAgICAgICAgICAgICAgICAgICBob3N0PSJsb2NhbGhvc3QiIAorICAgICAgICAgICAgICAgICAgICBwb3J0PSI5MDE0IgorICAgICAgICAgICAgICAgICAgICB1c2VybmFtZT0iY29udHJvbFJvbGUiCisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkPSJ0b21jYXQiCisgICAgICAgICAgICAgICAgICAgIG5hbWU9IkNhdGFsaW5hOnR5cGU9SURhdGFTZW5kZXIsaG9zdD1sb2NhbGhvc3Qsc2VuZGVyQWRkcmVzcz0xOTIuMTY4LjExMS4xLHNlbmRlclBvcnQ9OTAyNSIKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlPSJjb25uZWN0ZWQiCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIgorICAgICAgICAgICAgICAgIC8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2FuZCZndDsKKyAgICAgICAgJmx0Oy93YWl0Zm9yJmd0OworICAgICAgICAmbHQ7ZmFpbCBpZj0ic2VydmVyLnRpbWVvdXQiIG1lc3NhZ2U9IlNlcnZlciAke3VybH0gZG9uJ3QgYW5zd2VyIGluc2lkZSAke21heHdhaXR9IHNlYyIgLyZndDsKKyAgICAgICAgJmx0O2VjaG8gbWVzc2FnZT0iU2VydmVyICR7dXJsfSBhbGl2ZSIgLyZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKzwvc291cmNlPgorPC9wPiAgCisKKzwvc2VjdGlvbj4KKworPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvcHJvamVjdC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL3Byb2plY3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMTdlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL3Byb2plY3QueG1sCkBAIC0wLDAgKzEsNzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzxwcm9qZWN0IG5hbWU9IkFwYWNoZSBUb21jYXQgRG9jdW1lbnRhdGlvbiAtIFRvcCBMZXZlbCBEaXJlY3RvcnkiCisgICAgICAgIGhyZWY9Imh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy8iPgorCisgICAgPHRpdGxlPlRoZSBBcGFjaGUgVG9tY2F0IDUuNSBTZXJ2bGV0L0pTUCBDb250YWluZXI8L3RpdGxlPgorCisgICAgPGxvZ28gaHJlZj0iL2ltYWdlcy90b21jYXQuZ2lmIj4KKyAgICAgIFRoZSBBcGFjaGUgVG9tY2F0IFNlcnZsZXQvSlNQIENvbnRhaW5lcgorICAgIDwvbG9nbz4KKworCisgICAgPGJvZHk+CisKKyAgICA8bWVudSBuYW1lPSJMaW5rcyI+CisgICAgICAgIDxpdGVtIG5hbWU9IkRvY3MgSG9tZSIgICAgICAgICAgICAgaHJlZj0iaW5kZXguaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJGQVEiICAgICAgICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy9mYXEiIC8+CisgICAgPC9tZW51PgorCisgICAgPG1lbnUgbmFtZT0iVXNlciBHdWlkZSI+CisgICAgICAgIDxpdGVtIG5hbWU9IjEpIEludHJvZHVjdGlvbiIgICAgICAgIGhyZWY9ImludHJvZHVjdGlvbi5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjIpIFNldHVwIiAgICAgICAgICAgICAgIGhyZWY9InNldHVwLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iMykgRmlyc3Qgd2ViYXBwIiAgICAgICAgaHJlZj0iYXBwZGV2L2luZGV4Lmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iNCkgRGVwbG95ZXIiICAgICAgICAgICAgaHJlZj0iZGVwbG95ZXItaG93dG8uaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSI1KSBNYW5hZ2VyIiAgICAgICAgICAgICBocmVmPSJtYW5hZ2VyLWhvd3RvLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iNikgUmVhbG1zIGFuZCBBQUEiICAgICAgaHJlZj0icmVhbG0taG93dG8uaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSI3KSBTZWN1cml0eSBNYW5hZ2VyIgorICAgICAgICAgICAgICBocmVmPSJzZWN1cml0eS1tYW5hZ2VyLWhvd3RvLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iOCkgSk5ESSBSZXNvdXJjZXMiICAgICAgaHJlZj0iam5kaS1yZXNvdXJjZXMtaG93dG8uaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSI5KSBKREJDIERhdGFTb3VyY2VzIgorICAgICAgICAgICAgICBocmVmPSJqbmRpLWRhdGFzb3VyY2UtZXhhbXBsZXMtaG93dG8uaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSIxMCkgQ2xhc3Nsb2FkaW5nIiAgICAgICBocmVmPSJjbGFzcy1sb2FkZXItaG93dG8uaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSIxMSkgSlNQcyIgICAgICAgICAgICAgICBocmVmPSJqYXNwZXItaG93dG8uaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSIxMikgU1NMIiAgICAgICAgICAgICAgICBocmVmPSJzc2wtaG93dG8uaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSIxMykgU1NJIiAgICAgICAgICAgICAgICBocmVmPSJzc2ktaG93dG8uaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSIxNCkgQ0dJIiAgICAgICAgICAgICAgICBocmVmPSJjZ2ktaG93dG8uaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSIxNSkgUHJveHkgU3VwcG9ydCIgICAgICBocmVmPSJwcm94eS1ob3d0by5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjE2KSBNQmVhbiBEZXNjcmlwdG9yIgorICAgICAgICAgICAgICBocmVmPSJtYmVhbnMtZGVzY3JpcHRvci1ob3d0by5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjE3KSBEZWZhdWx0IFNlcnZsZXQiICAgIGhyZWY9ImRlZmF1bHQtc2VydmxldC5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjE4KSBDbHVzdGVyaW5nIiAgICAgICAgIGhyZWY9ImNsdXN0ZXItaG93dG8uaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSIxOSkgTG9hZCBCYWxhbmNlciIgICAgICBocmVmPSJiYWxhbmNlci1ob3d0by5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjIwKSBDb25uZWN0b3JzIiAgICAgICAgIGhyZWY9ImNvbm5lY3RvcnMuaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSIyMSkgTW9uaXRvcmluZyBhbmQgTWFuYWdlbWVudCIgICAgICAgICAKKyAgICAgICAgICAgICAgaHJlZj0ibW9uaXRvcmluZy5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjIyKSBMb2dnaW5nIiAgICAgICAgICAgIGhyZWY9ImxvZ2dpbmcuaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSIyMykgQVBSIiAgICAgICAgICAgICAgICBocmVmPSJhcHIuaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSIyNCkgVmlydHVhbCBIb3N0aW5nIiAgICBocmVmPSJ2aXJ0dWFsLWhvc3RpbmctaG93dG8uaHRtbCIvPgorICAgIDwvbWVudT4KKworICAgIDxtZW51IG5hbWU9IlJlZmVyZW5jZSI+CisgICAgICAgIDxpdGVtIG5hbWU9IlJlbGVhc2UgTm90ZXMiICAgICAgICAgaHJlZj0iUkVMRUFTRS1OT1RFUy50eHQiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIFRvbWNhdCBDb25maWd1cmF0aW9uIiAgaHJlZj0iY29uZmlnL2luZGV4Lmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iSksgMS4yIERvY3VtZW50YXRpb24iICAgICAgCisgICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy9jb25uZWN0b3JzLWRvYy8iLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iU2VydmxldCBBUEkgSmF2YWRvY3MiICBocmVmPSJzZXJ2bGV0YXBpL2luZGV4Lmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iSlNQIEFQSSBKYXZhZG9jcyIgICAgICBocmVmPSJqc3BhcGkvaW5kZXguaHRtbCIvPgorICAgIDwvbWVudT4KKworICAgIDxtZW51IG5hbWU9IkFwYWNoZSBUb21jYXQgRGV2ZWxvcG1lbnQiPgorICAgICAgICA8aXRlbSBuYW1lPSJCdWlsZGluZyIgICAgICAgICAgICAgIGhyZWY9ImJ1aWxkaW5nLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iQ2hhbmdlbG9nIiAgICAgICAgICAgICBocmVmPSJjaGFuZ2Vsb2cuaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJTdGF0dXMiICAgICAgICAgICAgICAgIGhyZWY9InN0YXR1cy5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IkRldmVsb3BlcnMiICAgICAgICAgICAgaHJlZj0iZGV2ZWxvcGVycy5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IkZ1bmN0aW9uYWwgU3BlY3MuIiAgICAgaHJlZj0iY2F0YWxpbmEvZnVuY3NwZWNzL2luZGV4Lmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIFRvbWNhdCBKYXZhZG9jcyIgICAgICAgaHJlZj0iY2F0YWxpbmEvZG9jcy9hcGkvaW5kZXguaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJBcGFjaGUgSmFzcGVyIEphdmFkb2NzIiAgICAgICBocmVmPSJqYXNwZXIvZG9jcy9hcGkvaW5kZXguaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJBcmNoaXRlY3R1cmUiICAgICAgICAgIGhyZWY9ImFyY2hpdGVjdHVyZS9pbmRleC5odG1sIiAvPgorICAgIDwvbWVudT4KKworICAgIDwvYm9keT4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9wcm94eS1ob3d0by54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL3Byb3h5LWhvd3RvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGVmMWM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9wcm94eS1ob3d0by54bWwKQEAgLTAsMCArMSwxMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJwcm94eS1ob3d0by5odG1sIj4KKworICAgICZwcm9qZWN0OworCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICAgICAgPHRpdGxlPlByb3h5IFN1cHBvcnQgSE9XLVRPPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKzxwPlVzaW5nIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb25zIG9mIFRvbWNhdCwgd2ViIGFwcGxpY2F0aW9ucyBjYW4gYXNrIGZvcgordGhlIHNlcnZlciBuYW1lIGFuZCBwb3J0IG51bWJlciB0byB3aGljaCB0aGUgcmVxdWVzdCB3YXMgZGlyZWN0ZWQgZm9yCitwcm9jZXNzaW5nLiAgV2hlbiBUb21jYXQgaXMgcnVubmluZyBzdGFuZGFsb25lIHdpdGggdGhlCis8YSBocmVmPSJjb25maWcvY295b3RlLmh0bWwiPkNveW90ZSBIVFRQLzEuMSBDb25uZWN0b3I8L2E+LCBpdCB3aWxsIGdlbmVyYWxseQorcmVwb3J0IHRoZSBzZXJ2ZXIgbmFtZSBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QsIGFuZCB0aGUgcG9ydCBudW1iZXIgb24KK3doaWNoIHRoZSA8c3Ryb25nPkNvbm5lY3Rvcjwvc3Ryb25nPiBpcyBsaXN0ZW5pbmcuICBUaGUgc2VydmxldCBBUEkKK2NhbGxzIG9mIGludGVyZXN0LCBmb3IgdGhpcyBwdXJwb3NlLCBhcmU6PC9wPgorPHVsPgorPGxpPjxjb2RlPlNlcnZsZXRSZXF1ZXN0LmdldFNlcnZlck5hbWUoKTwvY29kZT46IFJldHVybnMgdGhlIGhvc3QgbmFtZSBvZiB0aGUgc2VydmVyIHRvIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyBzZW50LjwvbGk+Cis8bGk+PGNvZGU+U2VydmxldFJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpPC9jb2RlPjogUmV0dXJucyB0aGUgaG9zdCBuYW1lIG9mIHRoZSBzZXJ2ZXIgdG8gd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIHNlbnQuPC9saT4KKzxsaT48Y29kZT5TZXJ2bGV0UmVxdWVzdC5nZXRMb2NhbE5hbWUoKTwvY29kZT46IFJldHVybnMgdGhlIGhvc3QgbmFtZSBvZiB0aGUgSW50ZXJuZXQgUHJvdG9jb2wgKElQKSBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIHJlY2VpdmVkLjwvbGk+Cis8bGk+PGNvZGU+U2VydmxldFJlcXVlc3QuZ2V0TG9jYWxQb3J0KCk8L2NvZGU+OiAgUmV0dXJucyB0aGUgSW50ZXJuZXQgUHJvdG9jb2wgKElQKSBwb3J0IG51bWJlciBvZiB0aGUgaW50ZXJmYWNlIG9uIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyByZWNlaXZlZC48L2xpPgorPC91bD4KKworPHA+V2hlbiB5b3UgYXJlIHJ1bm5pbmcgYmVoaW5kIGEgcHJveHkgc2VydmVyIChvciBhIHdlYiBzZXJ2ZXIgdGhhdCBpcworY29uZmlndXJlZCB0byBiZWhhdmUgbGlrZSBhIHByb3h5IHNlcnZlciksIHlvdSB3aWxsIHNvbWV0aW1lcyBwcmVmZXIgdG8KK21hbmFnZSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHRoZXNlIGNhbGxzLiAgSW4gcGFydGljdWxhciwgeW91IHdpbGwKK2dlbmVyYWxseSB3YW50IHRoZSBwb3J0IG51bWJlciB0byByZWZsZWN0IHRoYXQgc3BlY2lmaWVkIGluIHRoZSBvcmlnaW5hbAorcmVxdWVzdCwgbm90IHRoZSBvbmUgb24gd2hpY2ggdGhlIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+IGl0c2VsZiBpcworbGlzdGVuaW5nLiAgWW91IGNhbiB1c2UgdGhlIDxjb2RlPnByb3h5TmFtZTwvY29kZT4gYW5kIDxjb2RlPnByb3h5UG9ydDwvY29kZT4KK2F0dHJpYnV0ZXMgb24gdGhlIDxjb2RlPiZsdDtDb25uZWN0b3ImZ3Q7PC9jb2RlPiBlbGVtZW50IHRvIGNvbmZpZ3VyZQordGhlc2UgdmFsdWVzLjwvcD4KKworPHA+UHJveHkgc3VwcG9ydCBjYW4gdGFrZSBtYW55IGZvcm1zLiAgVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBkZXNjcmliZQorcHJveHkgY29uZmlndXJhdGlvbnMgZm9yIHNldmVyYWwgY29tbW9uIGNhc2VzLjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJBcGFjaGUgMS4zIFByb3h5IFN1cHBvcnQiPgorCis8cD5BcGFjaGUgMS4zIHN1cHBvcnRzIGFuIG9wdGlvbmFsIG1vZHVsZSAoPGNvZGU+bW9kX3Byb3h5PC9jb2RlPikgdGhhdAorY29uZmlndXJlcyB0aGUgd2ViIHNlcnZlciB0byBhY3QgYXMgYSBwcm94eSBzZXJ2ZXIuICBUaGlzIGNhbiBiZSB1c2VkIHRvCitmb3J3YXJkIHJlcXVlc3RzIGZvciBhIHBhcnRpY3VsYXIgd2ViIGFwcGxpY2F0aW9uIHRvIGEgVG9tY2F0IDUgaW5zdGFuY2UsCit3aXRob3V0IGhhdmluZyB0byBjb25maWd1cmUgYSB3ZWIgY29ubmVjdG9yIHN1Y2ggYXMgPGNvZGU+bW9kX2prPC9jb2RlPi4KK1RvIGFjY29tcGxpc2ggdGhpcywgeW91IG5lZWQgdG8gcGVyZm9ybSB0aGUgZm9sbG93aW5nIHRhc2tzOjwvcD4KKzxvbD4KKzxsaT5Db25maWd1cmUgeW91ciBjb3B5IG9mIEFwYWNoZSBzbyB0aGF0IGl0IGluY2x1ZGVzIHRoZQorICAgIDxjb2RlPm1vZF9wcm94eTwvY29kZT4gbW9kdWxlLiAgSWYgeW91IGFyZSBidWlsZGluZyBmcm9tIHNvdXJjZSwKKyAgICB0aGUgZWFzaWVzdCB3YXkgdG8gZG8gdGhpcyBpcyB0byBpbmNsdWRlIHRoZQorICAgIDxjb2RlPi0tZW5hYmxlLW1vZHVsZT1wcm94eTwvY29kZT4gZGlyZWN0aXZlIG9uIHRoZQorICAgIDxjb2RlPi4vY29uZmlndXJlPC9jb2RlPiBjb21tYW5kIGxpbmUuPC9saT4KKzxsaT5JZiBub3QgYWxyZWFkeSBhZGRlZCBmb3IgeW91LCBtYWtlIHN1cmUgdGhhdCB5b3UgYXJlIGxvYWRpbmcgdGhlCisgICAgPGNvZGU+bW9kX3Byb3h5PC9jb2RlPiBtb2R1bGUgYXQgQXBhY2hlIHN0YXJ0dXAgdGltZSwgYnkgdXNpbmcgdGhlCisgICAgZm9sbG93aW5nIGRpcmVjdGl2ZXMgaW4geW91ciA8Y29kZT5odHRwZC5jb25mPC9jb2RlPiBmaWxlOgorPHNvdXJjZT4KK0xvYWRNb2R1bGUgcHJveHlfbW9kdWxlICB7cGF0aC10by1tb2R1bGVzfS9tb2RfcHJveHkuc28KK0FkZE1vZHVsZSAgbW9kX3Byb3h5LmMKKzwvc291cmNlPjwvbGk+Cis8bGk+SW5jbHVkZSB0d28gZGlyZWN0aXZlcyBpbiB5b3VyIDxjb2RlPmh0dHBkLmNvbmY8L2NvZGU+IGZpbGUgZm9yCisgICAgZWFjaCB3ZWIgYXBwbGljYXRpb24gdGhhdCB5b3Ugd2lzaCB0byBmb3J3YXJkIHRvIFRvbWNhdCA1LiAgRm9yCisgICAgZXhhbXBsZSwgdG8gZm9yd2FyZCBhbiBhcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggPGNvZGU+L215YXBwPC9jb2RlPjoKKzxzb3VyY2U+CitQcm94eVBhc3MgICAgICAgICAvbXlhcHAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9teWFwcAorUHJveHlQYXNzUmV2ZXJzZSAgL215YXBwICBodHRwOi8vbG9jYWxob3N0OjgwODEvbXlhcHAKKzwvc291cmNlPgorICAgIHdoaWNoIHRlbGxzIEFwYWNoZSB0byBmb3J3YXJkIFVSTHMgb2YgdGhlIGZvcm0KKyAgICA8Y29kZT5odHRwOi8vbG9jYWxob3N0L215YXBwLyo8L2NvZGU+IHRvIHRoZSBUb21jYXQgNSBjb25uZWN0b3IKKyAgICBsaXN0ZW5pbmcgb24gcG9ydCA4MDgxLjwvbGk+Cis8bGk+Q29uZmlndXJlIHlvdXIgY29weSBvZiBUb21jYXQgNSB0byBpbmNsdWRlIGEgc3BlY2lhbAorICAgIDxjb2RlPiZsdDtDb25uZWN0b3ImZ3Q7PC9jb2RlPiBlbGVtZW50LCB3aXRoIGFwcHJvcHJpYXRlCisgICAgcHJveHkgc2V0dGluZ3MsIGZvciBleGFtcGxlOgorPHNvdXJjZT4KKyZsdDtDb25uZWN0b3IgcG9ydD0iODA4MSIgLi4uCisgICAgICAgICAgICAgIHByb3h5TmFtZT0id3d3Lm15Y29tcGFueS5jb20iCisgICAgICAgICAgICAgIHByb3h5UG9ydD0iODAiLyZndDsKKzwvc291cmNlPgorICAgIHdoaWNoIHdpbGwgY2F1c2Ugc2VydmxldHMgaW5zaWRlIHRoaXMgd2ViIGFwcGxpY2F0aW9uIHRvIHRoaW5rIHRoYXQKKyAgICBhbGwgcHJveGllZCByZXF1ZXN0cyB3ZXJlIGRpcmVjdGVkIHRvIDxjb2RlPnd3dy5teWNvbXBhbnkuY29tPC9jb2RlPgorICAgIG9uIHBvcnQgODAuPC9saT4KKzxsaT5JdCBpcyBsZWdhbCB0byBvbWl0IHRoZSA8Y29kZT5wcm94eU5hbWU8L2NvZGU+IGF0dHJpYnV0ZSBmcm9tIHRoZQorICAgIDxjb2RlPiZsdDtDb25uZWN0b3ImZ3Q7PC9jb2RlPiBlbGVtZW50LiAgSWYgeW91IGRvIHNvLCB0aGUgdmFsdWUKKyAgICByZXR1cm5lZCBieSA8Y29kZT5yZXF1ZXN0LmdldFNlcnZlck5hbWUoKTwvY29kZT4gd2lsbCBieSB0aGUgaG9zdAorICAgIG5hbWUgb24gd2hpY2ggVG9tY2F0IGlzIHJ1bm5pbmcuICBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgaXQgd291bGQgYmUKKyAgICA8Y29kZT5sb2NhbGhvc3Q8L2NvZGU+LjwvbGk+Cis8bGk+SWYgeW91IGFsc28gaGF2ZSBhIDxjb2RlPiZsdDtDb25uZWN0b3ImZ3Q7PC9jb2RlPiBsaXN0ZW5pbmcgb24gcG9ydAorICAgIDgwODAgKG5lc3RlZCB3aXRoaW4gdGhlIHNhbWUgPGEgaHJlZj0iY29uZmlnL3NlcnZpY2UuaHRtbCI+U2VydmljZTwvYT4KKyAgICBlbGVtZW50KSwgdGhlIHJlcXVlc3RzIHRvIGVpdGhlciBwb3J0IHdpbGwgc2hhcmUgdGhlIHNhbWUgc2V0IG9mCisgICAgdmlydHVhbCBob3N0cyBhbmQgd2ViIGFwcGxpY2F0aW9ucy48L2xpPgorPGxpPllvdSBtaWdodCB3aXNoIHRvIHVzZSB0aGUgSVAgZmlsdGVyaW5nIGZlYXR1cmVzIG9mIHlvdXIgb3BlcmF0aW5nCisgICAgc3lzdGVtIHRvIHJlc3RyaWN0IGNvbm5lY3Rpb25zIHRvIHBvcnQgODA4MSAoaW4gdGhpcyBleGFtcGxlKSB0bworICAgIGJlIGFsbG93ZWQgPHN0cm9uZz5vbmx5PC9zdHJvbmc+IGZyb20gdGhlIHNlcnZlciB0aGF0IGlzIHJ1bm5pbmcKKyAgICBBcGFjaGUuPC9saT4KKzxsaT5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNldCB1cCBhIHNlcmllcyBvZiB3ZWIgYXBwbGljYXRpb25zIHRoYXQgYXJlCisgICAgb25seSBhdmFpbGFibGUgdmlhIHByb3h5aW5nLCBhcyBmb2xsb3dzOgorICAgIDx1bD4KKyAgICA8bGk+Q29uZmlndXJlIGFub3RoZXIgPGNvZGU+Jmx0O1NlcnZpY2UmZ3Q7PC9jb2RlPiB0aGF0IGNvbnRhaW5zCisgICAgICAgIG9ubHkgYSA8Y29kZT4mbHQ7Q29ubmVjdG9yJmd0OzwvY29kZT4gZm9yIHRoZSBwcm94eSBwb3J0LjwvbGk+CisgICAgPGxpPkNvbmZpZ3VyZSBhcHByb3ByaWF0ZSA8YSBocmVmPSJjb25maWcvZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4sCisgICAgICAgIDxhIGhyZWY9ImNvbmZpZy9ob3N0Lmh0bWwiPkhvc3Q8L2E+LCBhbmQKKyAgICAgICAgPGEgaHJlZj0iY29uZmlnL2NvbnRleHQuaHRtbCI+Q29udGV4dDwvYT4gZWxlbWVudHMgZm9yIHRoZSB2aXJ0dWFsIGhvc3RzCisgICAgICAgIGFuZCB3ZWIgYXBwbGljYXRpb25zIGFjY2Vzc2libGUgdmlhIHByb3h5aW5nLjwvbGk+CisgICAgPGxpPk9wdGlvbmFsbHksIHByb3RlY3QgcG9ydCA4MDgxIHdpdGggSVAgZmlsdGVycyBhcyBkZXNjcmliZWQKKyAgICAgICAgZWFybGllci48L2xpPgorICAgIDwvdWw+PC9saT4KKzxsaT5XaGVuIHJlcXVlc3RzIGFyZSBwcm94aWVkIGJ5IEFwYWNoZSwgdGhlIHdlYiBzZXJ2ZXIgd2lsbCBiZSByZWNvcmRpbmcKKyAgICB0aGVzZSByZXF1ZXN0cyBpbiBpdHMgYWNjZXNzIGxvZy4gIFRoZXJlZm9yZSwgeW91IHdpbGwgZ2VuZXJhbGx5IHdhbnQgdG8KKyAgICBkaXNhYmxlIGFueSBhY2Nlc3MgbG9nZ2luZyBwZXJmb3JtZWQgYnkgVG9tY2F0IGl0c2VsZi48L2xpPgorPC9vbD4KKworPHA+V2hlbiByZXF1ZXN0cyBhcmUgcHJveGllZCBpbiB0aGlzIG1hbm5lciwgPHN0cm9uZz5hbGw8L3N0cm9uZz4gcmVxdWVzdHMKK2ZvciB0aGUgY29uZmlndXJlZCB3ZWIgYXBwbGljYXRpb25zIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IFRvbWNhdCAoaW5jbHVkaW5nCityZXF1ZXN0cyBmb3Igc3RhdGljIGNvbnRlbnQpLiAgWW91IGNhbiBpbXByb3ZlIHBlcmZvcm1hbmNlIGJ5IHVzaW5nIHRoZQorPGNvZGU+bW9kX2prPC9jb2RlPiB3ZWIgY29ubmVjdG9yIGluc3RlYWQgb2YgPGNvZGU+bW9kX3Byb3h5PC9jb2RlPi4gCis8Y29kZT5tb2Rfams8L2NvZGU+IGNhbiBiZSBjb25maWd1cmVkIHNvIHRoYXQgdGhlIHdlYiBzZXJ2ZXIgc2VydmVzIHN0YXRpYworY29udGVudCB0aGF0IGlzIG5vdCBwcm9jZXNzZWQgYnkgZmlsdGVycyBvciBzZWN1cml0eSBjb25zdHJhaW50cyBkZWZpbmVkCit3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbidzIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorKDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+KS48L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iQXBhY2hlIDIuMCBQcm94eSBTdXBwb3J0Ij4KK1RoZSBzYW1lIGluc3RydWN0aW9ucyBob2xkIHRydWUgYXMgZm9yIDEuMy4gKEV4Y2VwdCBpbiBBcGFjaGUgMi4wLAoreW91IG1heSBvbWl0IDxjb2RlPkFkZE1vZHVsZSAgbW9kX3Byb3h5LmM8L2NvZGU+KQorPC9zZWN0aW9uPgorCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL3JlYWxtLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvcmVhbG0taG93dG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMTU1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL3JlYWxtLWhvd3RvLnhtbApAQCAtMCwwICsxLDExMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJyZWFsbS1ob3d0by5odG1sIj4KKworICAgICZwcm9qZWN0OworCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0ieW9hdnNAYXBhY2hlLm9yZyI+WW9hdiBTaGFwaXJhPC9hdXRob3I+CisgICAgICAgIDxhdXRob3IgZW1haWw9ImFyamFxdWl0aEBtaW5kc3ByaW5nLmNvbSI+QW5kcmV3IFIuIEphcXVpdGg8L2F1dGhvcj4KKyAgICAgICAgPHRpdGxlPlJlYWxtIENvbmZpZ3VyYXRpb24gSE9XLVRPPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IlRhYmxlIG9mIENvbnRlbnRzIj4KKworPHA+Cis8YSBocmVmPSIjUXVpY2sgU3RhcnQiPlF1aWNrIFN0YXJ0PC9hPjxiciAvPgorPGJsb2NrcXVvdGU+Cis8YSBocmVmPSIjV2hhdCBpcyBhIFJlYWxtPyI+V2hhdCBpcyBhIFJlYWxtPzwvYT48YnIgLz4KKzxhIGhyZWY9IiNDb25maWd1cmluZyBhIFJlYWxtIj5Db25maWd1cmluZyBhIFJlYWxtPC9hPjxiciAvPgorPC9ibG9ja3F1b3RlPgorPGEgaHJlZj0iI0NvbW1vbiBGZWF0dXJlcyI+Q29tbW9uIEZlYXR1cmVzPC9hPjxiciAvPgorPGJsb2NrcXVvdGU+Cis8YSBocmVmPSIjRGlnZXN0ZWQgUGFzc3dvcmRzIj5EaWdlc3RlZCBQYXNzd29yZHM8L2E+PGJyIC8+Cis8YSBocmVmPSIjRXhhbXBsZSBBcHBsaWNhdGlvbiI+RXhhbXBsZSBBcHBsaWNhdGlvbjwvYT48YnIgLz4KKzxhIGhyZWY9IiNNYW5hZ2VyIEFwcGxpY2F0aW9uIj5NYW5hZ2VyIEFwcGxpY2F0aW9uPC9hPjxiciAvPgorPGEgaHJlZj0iI1JlYWxtIExvZ2dpbmciPkxvZ2dpbmcgV2l0aGluIFJlYWxtczwvYT48YnIgLz4KKzwvYmxvY2txdW90ZT4KKzxhIGhyZWY9IiNTdGFuZGFyZCBSZWFsbSBJbXBsZW1lbnRhdGlvbnMiPgorU3RhbmRhcmQgUmVhbG0gSW1wbGVtZW50YXRpb25zPC9hPjxiciAvPgorPGJsb2NrcXVvdGU+Cis8YSBocmVmPSIjSkRCQ1JlYWxtIj5KREJDUmVhbG08L2E+PGJyIC8+Cis8YSBocmVmPSIjRGF0YVNvdXJjZVJlYWxtIj5EYXRhU291cmNlUmVhbG08L2E+PGJyIC8+Cis8YSBocmVmPSIjSk5ESVJlYWxtIj5KTkRJUmVhbG08L2E+PGJyIC8+Cis8YSBocmVmPSIjTWVtb3J5UmVhbG0iPk1lbW9yeVJlYWxtPC9hPjxiciAvPgorPGEgaHJlZj0iI0pBQVNSZWFsbSI+SkFBU1JlYWxtPC9hPjxiciAvPgorPGEgaHJlZj0iI1VzZXJEYXRhYmFzZVJlYWxtIj5Vc2VyRGF0YWJhc2VSZWFsbTwvYT48YnIgLz4KKzwvYmxvY2txdW90ZT4KKzwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJRdWljayBTdGFydCI+CisKKzxwPlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyB0byBjb25maWd1cmUgVG9tY2F0IHRvIHN1cHBvcnQgPGVtPmNvbnRhaW5lcgorbWFuYWdlZCBzZWN1cml0eTwvZW0+LCBieSBjb25uZWN0aW5nIHRvIGFuIGV4aXN0aW5nICJkYXRhYmFzZSIgb2YgdXNlcm5hbWVzLAorcGFzc3dvcmRzLCBhbmQgdXNlciByb2xlcy4gIFlvdSBvbmx5IG5lZWQgdG8gY2FyZSBhYm91dCB0aGlzIGlmIHlvdSBhcmUgdXNpbmcKK2Egd2ViIGFwcGxpY2F0aW9uIHRoYXQgaW5jbHVkZXMgb25lIG9yIG1vcmUKKzxjb2RlPiZsdDtzZWN1cml0eS1jb25zdHJhaW50Jmd0OzwvY29kZT4gZWxlbWVudHMsIGFuZCBhCis8Y29kZT4mbHQ7bG9naW4tY29uZmlnJmd0OzwvY29kZT4gZWxlbWVudCBkZWZpbmluZyBob3cgdXNlcnMgYXJlIHJlcXVpcmVkCit0byBhdXRoZW50aWNhdGUgdGhlbXNlbHZlcy4gIElmIHlvdSBhcmUgbm90IHV0aWxpemluZyB0aGVzZSBmZWF0dXJlcywgeW91IGNhbgorc2FmZWx5IHNraXAgdGhpcyBkb2N1bWVudC48L3A+CisKKzxwPkZvciBmdW5kYW1lbnRhbCBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IGNvbnRhaW5lciBtYW5hZ2VkIHNlY3VyaXR5LAorc2VlIHRoZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL3NlcnZsZXQvZG93bmxvYWQuaHRtbCI+U2VydmxldAorU3BlY2lmaWNhdGlvbiAoVmVyc2lvbiAyLjQpPC9hPiwgU2VjdGlvbiAxMi48L3A+CisKKzxwPkZvciBpbmZvcm1hdGlvbiBhYm91dCB1dGlsaXppbmcgdGhlIDxlbT5TaW5nbGUgU2lnbiBPbjwvZW0+IGZlYXR1cmUgb2YKK1RvbWNhdCA1IChhbGxvd2luZyBhIHVzZXIgdG8gYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMgb25jZSBhY3Jvc3MgdGhlIGVudGlyZQorc2V0IG9mIHdlYiBhcHBsaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgdmlydHVhbCBob3N0KSwgc2VlCis8YSBocmVmPSJjb25maWcvaG9zdC5odG1sI1NpbmdsZSBTaWduIE9uIj5oZXJlPC9hPi48L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+CisKKworPHN1YnNlY3Rpb24gbmFtZT0iV2hhdCBpcyBhIFJlYWxtPyI+CisKKzxwPkEgPHN0cm9uZz5SZWFsbTwvc3Ryb25nPiBpcyBhICJkYXRhYmFzZSIgb2YgdXNlcm5hbWVzIGFuZCBwYXNzd29yZHMgdGhhdAoraWRlbnRpZnkgdmFsaWQgdXNlcnMgb2YgYSB3ZWIgYXBwbGljYXRpb24gKG9yIHNldCBvZiB3ZWIgYXBwbGljYXRpb25zKSwgcGx1cworYW4gZW51bWVyYXRpb24gb2YgdGhlIGxpc3Qgb2YgPGVtPnJvbGVzPC9lbT4gYXNzb2NpYXRlZCB3aXRoIGVhY2ggdmFsaWQgdXNlci4KK1lvdSBjYW4gdGhpbmsgb2Ygcm9sZXMgYXMgc2ltaWxhciB0byA8ZW0+Z3JvdXBzPC9lbT4gaW4gVW5peC1saWtlIG9wZXJhdGluZworc3lzdGVtcywgYmVjYXVzZSBhY2Nlc3MgdG8gc3BlY2lmaWMgd2ViIGFwcGxpY2F0aW9uIHJlc291cmNlcyBpcyBncmFudGVkIHRvCithbGwgdXNlcnMgcG9zc2Vzc2luZyBhIHBhcnRpY3VsYXIgcm9sZSAocmF0aGVyIHRoYW4gZW51bWVyYXRpbmcgdGhlIGxpc3Qgb2YKK2Fzc29jaWF0ZWQgdXNlcm5hbWVzKS4gIEEgcGFydGljdWxhciB1c2VyIGNhbiBoYXZlIGFueSBudW1iZXIgb2Ygcm9sZXMKK2Fzc29jaWF0ZWQgd2l0aCB0aGVpciB1c2VybmFtZS48L3A+CisKKzxwPkFsdGhvdWdoIHRoZSBTZXJ2bGV0IFNwZWNpZmljYXRpb24gZGVzY3JpYmVzIGEgcG9ydGFibGUgbWVjaGFuaXNtIGZvcgorYXBwbGljYXRpb25zIHRvIDxlbT5kZWNsYXJlPC9lbT4gdGhlaXIgc2VjdXJpdHkgcmVxdWlyZW1lbnRzIChpbiB0aGUKKzxjb2RlPndlYi54bWw8L2NvZGU+IGRlcGxveW1lbnQgZGVzY3JpcHRvciksIHRoZXJlIGlzIG5vIHBvcnRhYmxlIEFQSQorZGVmaW5pbmcgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGEgc2VydmxldCBjb250YWluZXIgYW5kIHRoZSBhc3NvY2lhdGVkIHVzZXIKK2FuZCByb2xlIGluZm9ybWF0aW9uLiAgSW4gbWFueSBjYXNlcywgaG93ZXZlciwgaXQgaXMgZGVzaXJlYWJsZSB0byAiY29ubmVjdCIKK2Egc2VydmxldCBjb250YWluZXIgdG8gc29tZSBleGlzdGluZyBhdXRoZW50aWNhdGlvbiBkYXRhYmFzZSBvciBtZWNoYW5pc20KK3RoYXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuICBUaGVyZWZvcmUsIFRvbWNhdCA1CitkZWZpbmVzIGEgSmF2YSBpbnRlcmZhY2UgKDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG08L2NvZGU+KSB0aGF0CitjYW4gYmUgaW1wbGVtZW50ZWQgYnkgInBsdWcgaW4iIGNvbXBvbmVudHMgdG8gZXN0YWJsaXNoIHRoaXMgY29ubmVjdGlvbi4KK0ZpdmUgc3RhbmRhcmQgcGx1Zy1pbnMgYXJlIHByb3ZpZGVkLCBzdXBwb3J0aW5nIGNvbm5lY3Rpb25zIHRvIHZhcmlvdXMKK3NvdXJjZXMgb2YgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb246PC9wPgorPHVsPgorPGxpPjxhIGhyZWY9IiNKREJDUmVhbG0iPkpEQkNSZWFsbTwvYT4gLSBBY2Nlc3NlcyBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbgorICAgIHN0b3JlZCBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UsIGFjY2Vzc2VkIHZpYSBhIEpEQkMgZHJpdmVyLjwvbGk+Cis8bGk+PGEgaHJlZj0iI0RhdGFTb3VyY2VSZWFsbSI+RGF0YVNvdXJjZVJlYWxtPC9hPiAtIEFjY2Vzc2VzIGF1dGhlbnRpY2F0aW9uCisgICAgaW5mb3JtYXRpb24gc3RvcmVkIGluIGEgcmVsYXRpb25hbCBkYXRhYmFzZSwgYWNjZXNzZWQgdmlhIGEgbmFtZWQgSk5ESQorICAgIEpEQkMgRGF0YVNvdXJjZS48L2xpPgorPGxpPjxhIGhyZWY9IiNKTkRJUmVhbG0iPkpORElSZWFsbTwvYT4gLSBBY2Nlc3NlcyBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbgorICAgIHN0b3JlZCBpbiBhbiBMREFQIGJhc2VkIGRpcmVjdG9yeSBzZXJ2ZXIsIGFjY2Vzc2VkIHZpYSBhIEpOREkgcHJvdmlkZXIuCisgICAgPC9saT4KKzxsaT48YSBocmVmPSIjTWVtb3J5UmVhbG0iPk1lbW9yeVJlYWxtPC9hPiAtIEFjY2Vzc2VzIGF1dGhlbnRpY2F0aW9uCisgICAgaW5mb3JtYXRpb24gc3RvcmVkIGluIGFuIGluLW1lbW9yeSBvYmplY3QgY29sbGVjdGlvbiwgd2hpY2ggaXMgaW5pdGlhbGl6ZWQKKyAgICBmcm9tIGFuIFhNTCBkb2N1bWVudCAoPGNvZGU+Y29uZi90b21jYXQtdXNlcnMueG1sPC9jb2RlPikuPC9saT4KKzxsaT48YSBocmVmPSIjSkFBU1JlYWxtIj5KQUFTUmVhbG08L2E+IC0gQWNjZXNzZXMgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24KKyAgICB0aHJvdWdoIHRoZSBKYXZhIEF1dGhlbnRpY2F0aW9uICZhbXA7IEF1dGhvcml6YXRpb24gU2VydmljZSAoSkFBUykKKyAgICBmcmFtZXdvcmsuPC9saT4KKzwvdWw+CisKKzxwPkl0IGlzIGFsc28gcG9zc2libGUgdG8gd3JpdGUgeW91ciBvd24gPGNvZGU+UmVhbG08L2NvZGU+IGltcGxlbWVudGF0aW9uLAorYW5kIGludGVncmF0ZSBpdCB3aXRoIFRvbWNhdCA1LiAgVG8gZG8gc28sIHlvdSBuZWVkIHRvOgorPHVsPgorICA8bGk+SW1wbGVtZW50IDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG08L2NvZGU+LDwvbGk+CisgIDxsaT5QbGFjZSB5b3VyIGNvbXBpbGVkIHJlYWxtIGluICRDQVRBTElOQV9IT01FL3NlcnZlci9saWIsPC9saT4KKyAgPGxpPkRlY2xhcmUgeW91ciByZWFsbSBhcyBkZXNjcmliZWQgaW4gdGhlICJDb25maWd1cmluZyBhIFJlYWxtIiBzZWN0aW9uIGJlbG93LDwvbGk+CisgIDxsaT5EZWNsYXJlIHlvdXIgcmVhbG0gdG8gdGhlIDxhIGhyZWY9Im1iZWFucy1kZXNjcmlwdG9yLWhvd3RvLmh0bWwiPk1CZWFucyBEZXNjcmlwdG9yPC9hPi48L2xpPgorPC91bD4KKzwvcD4KKworPC9zdWJzZWN0aW9uPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9IkNvbmZpZ3VyaW5nIGEgUmVhbG0iPgorCis8cD5CZWZvcmUgZ2V0dGluZyBpbnRvIHRoZSBkZXRhaWxzIG9mIHRoZSBzdGFuZGFyZCBSZWFsbSBpbXBsZW1lbnRhdGlvbnMsIGl0IGlzCitpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCwgaW4gZ2VuZXJhbCB0ZXJtcywgaG93IGEgUmVhbG0gaXMgY29uZmlndXJlZC4gIEluCitnZW5lcmFsLCB5b3Ugd2lsbCBiZSBhZGRpbmcgYW4gWE1MIGVsZW1lbnQgdG8geW91ciA8Y29kZT5jb25mL3NlcnZlci54bWw8L2NvZGU+Citjb25maWd1cmF0aW9uIGZpbGUsIHRoYXQgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczo8L3A+CisKKzxzb3VyY2U+CismbHQ7UmVhbG0gY2xhc3NOYW1lPSIuLi4gY2xhc3MgbmFtZSBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiIKKyAgICAgICAuLi4gb3RoZXIgYXR0cmlidXRlcyBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiAuLi4vJmd0OworPC9zb3VyY2U+CisKKzxwPlRoZSA8Y29kZT4mbHQ7UmVhbG0mZ3Q7PC9jb2RlPiBlbGVtZW50IGNhbiBiZSBuZXN0ZWQgaW5zaWRlIGFueSBvbmUgb2YgCitvZiB0aGUgZm9sbG93aW5nIDxjb2RlPkNvbnRhaW5lcjwvY29kZT4gZWxlbWVudHMuICBUaGUgbG9jYXRpb24gb2YgdGhlCitSZWFsbSBlbGVtZW50IGhhcyBhIGRpcmVjdCBpbXBhY3Qgb24gdGhlICJzY29wZSIgb2YgdGhhdCBSZWFsbQorKGkuZS4gd2hpY2ggd2ViIGFwcGxpY2F0aW9ucyB3aWxsIHNoYXJlIHRoZSBzYW1lIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uKToKKzwvcD4KKzx1bD4KKzxsaT48ZW0+SW5zaWRlIGFuICZsdDtFbmdpbmUmZ3Q7IGVsZW1lbnQ8L2VtPiAtIFRoaXMgUmVhbG0gd2lsbCBiZSBzaGFyZWQKKyAgICBhY3Jvc3MgQUxMIHdlYiBhcHBsaWNhdGlvbnMgb24gQUxMIHZpcnR1YWwgaG9zdHMsIFVOTEVTUyBpdCBpcyBvdmVycmlkZGVuCisgICAgYnkgYSBSZWFsbSBlbGVtZW50IG5lc3RlZCBpbnNpZGUgYSBzdWJvcmRpbmF0ZSA8Y29kZT4mbHQ7SG9zdCZndDs8L2NvZGU+CisgICAgb3IgPGNvZGU+Jmx0O0NvbnRleHQmZ3Q7PC9jb2RlPiBlbGVtZW50LjwvbGk+Cis8bGk+PGVtPkluc2lkZSBhICZsdDtIb3N0Jmd0OyBlbGVtZW50PC9lbT4gLSBUaGlzIFJlYWxtIHdpbGwgYmUgc2hhcmVkIGFjcm9zcworICAgIEFMTCB3ZWIgYXBwbGljYXRpb25zIGZvciBUSElTIHZpcnR1YWwgaG9zdCwgVU5MRVNTIGl0IGlzIG92ZXJyaWRkZW4KKyAgICBieSBhIFJlYWxtIGVsZW1lbnQgbmVzdGVkIGluc2lkZSBhIHN1Ym9yZGluYXRlIDxjb2RlPiZsdDtDb250ZXh0Jmd0OzwvY29kZT4KKyAgICBlbGVtZW50LjwvbGk+Cis8bGk+PGVtPkluc2lkZSBhICZsdDtDb250ZXh0Jmd0OyBlbGVtZW50PC9lbT4gLSBUaGlzIFJlYWxtIHdpbGwgYmUgdXNlZCBPTkxZCisgICAgZm9yIFRISVMgd2ViIGFwcGxpY2F0aW9uLjwvbGk+Cis8L3VsPgorCisKKzwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQ29tbW9uIEZlYXR1cmVzIj4KKworCis8c3Vic2VjdGlvbiBuYW1lPSJEaWdlc3RlZCBQYXNzd29yZHMiPgorCis8cD5Gb3IgZWFjaCBvZiB0aGUgc3RhbmRhcmQgPGNvZGU+UmVhbG08L2NvZGU+IGltcGxlbWVudGF0aW9ucywgdGhlCit1c2VyJ3MgcGFzc3dvcmQgKGJ5IGRlZmF1bHQpIGlzIHN0b3JlZCBpbiBjbGVhciB0ZXh0LiAgSW4gbWFueQorZW52aXJvbm1lbnRzLCB0aGlzIGlzIHVuZGVzaXJlYWJsZSBiZWNhdXNlIGNhc3VhbCBvYnNlcnZlcnMgb2YgdGhlCithdXRoZW50aWNhdGlvbiBkYXRhIGNhbiBjb2xsZWN0IGVub3VnaCBpbmZvcm1hdGlvbiB0byBsb2cgb24KK3N1Y2Nlc3NmdWxseSwgYW5kIGltcGVyc29uYXRlIG90aGVyIHVzZXJzLiAgVG8gYXZvaWQgdGhpcyBwcm9ibGVtLCB0aGUKK3N0YW5kYXJkIGltcGxlbWVudGF0aW9ucyBzdXBwb3J0IHRoZSBjb25jZXB0IG9mIDxlbT5kaWdlc3Rpbmc8L2VtPgordXNlciBwYXNzd29yZHMuICBUaGlzIGFsbG93cyB0aGUgc3RvcmVkIHZlcnNpb24gb2YgdGhlIHBhc3N3b3JkcyB0byBiZQorZW5jb2RlZCAoaW4gYSBmb3JtIHRoYXQgaXMgbm90IGVhc2lseSByZXZlcnNpYmxlKSwgYnV0IHRoYXQgdGhlCis8Y29kZT5SZWFsbTwvY29kZT4gaW1wbGVtZW50YXRpb24gY2FuIHN0aWxsIHV0aWxpemUgZm9yCithdXRoZW50aWNhdGlvbi48L3A+CisKKzxwPldoZW4gYSBzdGFuZGFyZCByZWFsbSBhdXRoZW50aWNhdGVzIGJ5IHJldHJpZXZpbmcgdGhlIHN0b3JlZAorcGFzc3dvcmQgYW5kIGNvbXBhcmluZyBpdCB3aXRoIHRoZSB2YWx1ZSBwcmVzZW50ZWQgYnkgdGhlIHVzZXIsIHlvdQorY2FuIHNlbGVjdCBkaWdlc3RlZCBwYXNzd29yZHMgYnkgc3BlY2lmeWluZyB0aGUgPGNvZGU+ZGlnZXN0PC9jb2RlPgorYXR0cmlidXRlIG9uIHlvdXIgPGNvZGU+Jmx0O1JlYWxtJmd0OzwvY29kZT4gZWxlbWVudC4gIFRoZSB2YWx1ZSBmb3IKK3RoaXMgYXR0cmlidXRlIG11c3QgYmUgb25lIG9mIHRoZSBkaWdlc3QgYWxnb3JpdGhtcyBzdXBwb3J0ZWQgYnkgdGhlCis8Y29kZT5qYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q8L2NvZGU+IGNsYXNzIChTSEEsIE1EMiwgb3IgTUQ1KS4KK1doZW4geW91IHNlbGVjdCB0aGlzIG9wdGlvbiwgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYXNzd29yZCB0aGF0IGlzCitzdG9yZWQgaW4gdGhlIDxjb2RlPlJlYWxtPC9jb2RlPiBtdXN0IGJlIHRoZSBjbGVhcnRleHQgdmVyc2lvbiBvZiB0aGUKK3Bhc3N3b3JkLCBhcyBkaWdlc3RlZCBieSB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobS48L3A+CisKKzxwPldoZW4gdGhlIDxjb2RlPmF1dGhlbnRpY2F0ZSgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIFJlYWxtIGlzIGNhbGxlZCwgdGhlCisoY2xlYXJ0ZXh0KSBwYXNzd29yZCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgaXMgaXRzZWxmIGRpZ2VzdGVkIGJ5IHRoZSBzYW1lCithbGdvcml0aG0sIGFuZCB0aGUgcmVzdWx0IGlzIGNvbXBhcmVkIHdpdGggdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZQorPGNvZGU+UmVhbG08L2NvZGU+LiAgQW4gZXF1YWwgbWF0Y2ggaW1wbGllcyB0aGF0IHRoZSBjbGVhcnRleHQgdmVyc2lvbiBvZiB0aGUKK29yaWdpbmFsIHBhc3N3b3JkIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgcHJlc2VudGVkIGJ5IHRoZSB1c2VyLCBzbyB0aGF0IHRoaXMKK3VzZXIgc2hvdWxkIGJlIGF1dGhvcml6ZWQuPC9wPgorCis8cD5UbyBjYWxjdWxhdGUgdGhlIGRpZ2VzdGVkIHZhbHVlIG9mIGEgY2xlYXJ0ZXh0IHBhc3N3b3JkLCB0d28gY29udmVuaWVuY2UKK3RlY2huaXF1ZXMgYXJlIHN1cHBvcnRlZDo8L3A+Cis8dWw+Cis8bGk+SWYgeW91IGFyZSB3cml0aW5nIGFuIGFwcGxpY2F0aW9uIHRoYXQgbmVlZHMgdG8gY2FsY3VsYXRlIGRpZ2VzdGVkCisgICAgcGFzc3dvcmRzIGR5bmFtaWNhbGx5LCBjYWxsIHRoZSBzdGF0aWMgPGNvZGU+RGlnZXN0KCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUKKyAgICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLlJlYWxtQmFzZTwvY29kZT4gY2xhc3MsIHBhc3NpbmcgdGhlCisgICAgY2xlYXJ0ZXh0IHBhc3N3b3JkIGFuZCB0aGUgZGlnZXN0IGFsZ29yaXRobSBuYW1lIGFzIGFyZ3VtZW50cy4gIFRoaXMKKyAgICBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGRpZ2VzdGVkIHBhc3N3b3JkLjwvbGk+Cis8bGk+SWYgeW91IHdhbnQgdG8gZXhlY3V0ZSBhIGNvbW1hbmQgbGluZSB1dGlsaXR5IHRvIGNhbGN1bGF0ZSB0aGUgZGlnZXN0ZWQKKyAgICBwYXNzd29yZCwgc2ltcGx5IGV4ZWN1dGUKKzxzb3VyY2U+CitqYXZhIG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uUmVhbG1CYXNlIFwKKyAgICAtYSB7YWxnb3JpdGhtfSB7Y2xlYXJ0ZXh0LXBhc3N3b3JkfQorPC9zb3VyY2U+CisgICAgYW5kIHRoZSBkaWdlc3RlZCB2ZXJzaW9uIG9mIHRoaXMgY2xlYXJ0ZXh0IHBhc3N3b3JkIHdpbGwgYmUgcmV0dXJuZWQgdG8KKyAgICBzdGFuZGFyZCBvdXRwdXQuPC9saT4KKzwvdWw+CisKKzxwPklmIHVzaW5nIGRpZ2VzdGVkIHBhc3N3b3JkcyB3aXRoIERJR0VTVCBhdXRoZW50aWNhdGlvbiwgdGhlIGNsZWFydGV4dCB1c2VkCisgICB0byBnZW5lcmF0ZSB0aGUgZGlnZXN0IGlzIGRpZmZlcmVudC4gSW4gdGhlIGV4YW1wbGVzIGFib3ZlCisgICA8Y29kZT57Y2xlYXJ0ZXh0LXBhc3N3b3JkfTwvY29kZT4gbXVzdCBiZSByZXBsYWNlZCB3aXRoIAorICAgPGNvZGU+e3VzZXJuYW1lfTp7cmVhbG19OntjbGVhcnRleHQtcGFzc3dvcmR9PC9jb2RlPi4gRm9yIGV4YW1wbGUsIGluIGEKKyAgIGRldmVsb3BtZW50IGVudmlyb25tZW50IHRoaXMgbWlnaHQgdGFrZSB0aGUgZm9ybQorICAgPGNvZGU+dGVzdFVzZXI6bG9jYWxob3N0OjgwODA6dGVzdFBhc3N3b3JkPC9jb2RlPi48L3A+CisKKzxwPlRvIHVzZSBlaXRoZXIgb2YgdGhlIGFib3ZlIHRlY2huaXF1ZXMsIHRoZQorPGNvZGU+JENBVEFMSU5BX0hPTUUvc2VydmVyL2xpYi9jYXRhbGluYS5qYXI8L2NvZGU+IGZpbGUgd2lsbCBuZWVkIHRvIGJlCitvbiB5b3VyIGNsYXNzIHBhdGggdG8gbWFrZSB0aGUgPGNvZGU+UmVhbG1CYXNlPC9jb2RlPiBjbGFzcyBhdmFpbGFibGUuICBJbiAKK2FkZGl0aW9uLCB5b3Ugd2lsbCBuZWVkIHRoZSBKTVggamFyIGFuZCB0aGUgY29tbW9ucy1sb2dnaW5nIGphciAoZWl0aGVyIAorY29tbW9ucy1sb2dnaW5nLWFwaS5qYXIgb3IgY29tbW9ucy1sb2dnaW5nLmphcikuICBCb3RoIG9mIHRoZXNlIGFyZSBpbmNsdWRlZAord2l0aCB0aGUgVG9tY2F0IGRpc3RyaWJ1dGlvbi4KKzwvcD4KKworPHA+Tm9uLUFTQ0lJIHVzZXJuYW1lcyBhbmQvb3IgcGFzc3dvcmRzIGFyZSBzdXBwb3J0ZWQgdXNpbmcKKzxzb3VyY2U+amF2YSBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLlJlYWxtQmFzZSBcCisgICAgLWEge2FsZ29yaXRobX0gLWUge2VuY29kaW5nfSB7aW5wdXR9Cis8L3NvdXJjZT4KK2J1dCBjYXJlIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGF0IHRoZSBub24tQVNDSUkgaW5wdXQgaXMKK2NvcnJlY3RseSBwYXNzZWQgdG8gdGhlIGRpZ2VzdGVyLgorVGhlIGRpZ2VzdGVyIHJldHVybnMgPGNvZGU+e2lucHV0fTp7ZGlnZXN0fTwvY29kZT4uIElmIHRoZSBpbnB1dCBhcHBlYXJzCitjb3JydXB0ZWQgaW4gdGhlIHJldHVybiwgdGhlIGRpZ2VzdCB3aWxsIGJlIGludmFsaWQuPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKworCis8c3Vic2VjdGlvbiBuYW1lPSJFeGFtcGxlIEFwcGxpY2F0aW9uIj4KKworPHA+VGhlIGV4YW1wbGUgYXBwbGljYXRpb24gc2hpcHBlZCB3aXRoIFRvbWNhdCA1IGluY2x1ZGVzIGFuIGFyZWEgdGhhdCBpcworcHJvdGVjdGVkIGJ5IGEgc2VjdXJpdHkgY29uc3RyYWludCwgdXRpbGl6aW5nIGZvcm0tYmFzZWQgbG9naW4uICBUbyBhY2Nlc3MgaXQsCitwb2ludCB5b3VyIGJyb3dzZXIgYXQKKzxhIGhyZWY9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qc3AtZXhhbXBsZXMvc2VjdXJpdHkvcHJvdGVjdGVkLyI+aHR0cDovL2xvY2FsaG9zdDo4MDgwL2pzcC1leGFtcGxlcy9zZWN1cml0eS9wcm90ZWN0ZWQvPC9hPgorYW5kIGxvZyBvbiB3aXRoIG9uZSBvZiB0aGUgdXNlcm5hbWVzIGFuZCBwYXNzd29yZHMgZGVzY3JpYmVkIGZvciB0aGUgZGVmYXVsdAorPGEgaHJlZj0iI01lbW9yeVJlYWxtIj5NZW1vcnlSZWFsbTwvYT4uPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKworPHN1YnNlY3Rpb24gbmFtZT0iTWFuYWdlciBBcHBsaWNhdGlvbiI+CisKKzxwPklmIHlvdSB3aXNoIHRvIHVzZSB0aGUgPGEgaHJlZj0ibWFuYWdlci1ob3d0by5odG1sIj5NYW5hZ2VyIEFwcGxpY2F0aW9uPC9hPgordG8gZGVwbG95IGFuZCB1bmRlcGxveSBhcHBsaWNhdGlvbnMgaW4gYSBydW5uaW5nIFRvbWNhdCA1IGluc3RhbGxhdGlvbiwgeW91CitNVVNUIGFkZCB0aGUgIm1hbmFnZXIiIHJvbGUgdG8gYXQgbGVhc3Qgb25lIHVzZXJuYW1lIGluIHlvdXIgc2VsZWN0ZWQgUmVhbG0KK2ltcGxlbWVudGF0aW9uLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBtYW5hZ2VyIHdlYiBhcHBsaWNhdGlvbiBpdHNlbGYgdXNlcyBhCitzZWN1cml0eSBjb25zdHJhaW50IHRoYXQgcmVxdWlyZXMgcm9sZSAibWFuYWdlciIgdG8gYWNjZXNzIEFOWSByZXF1ZXN0IFVSSQord2l0aGluIHRoYXQgYXBwbGljYXRpb24uPC9wPgorCis8cD5Gb3Igc2VjdXJpdHkgcmVhc29ucywgbm8gdXNlcm5hbWUgaW4gdGhlIGRlZmF1bHQgUmVhbG0gKGkuZS4gdXNpbmcKKzxjb2RlPmNvbmYvdG9tY2F0LXVzZXJzLnhtbDwvY29kZT4gaXMgYXNzaWduZWQgdGhlICJtYW5hZ2VyIiByb2xlLiAgVGhlcmZvcmUsCitubyBvbmUgd2lsbCBiZSBhYmxlIHRvIHV0aWxpemUgdGhlIGZlYXR1cmVzIG9mIHRoaXMgYXBwbGljYXRpb24gdW50aWwgdGhlCitUb21jYXQgYWRtaW5pc3RyYXRvciBzcGVjaWZpY2FsbHkgYXNzaWducyB0aGlzIHJvbGUgdG8gb25lIG9yIG1vcmUgdXNlcnMuPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IlJlYWxtIExvZ2dpbmciPgorCis8cD5EZWJ1Z2dpbmcgYW5kIGV4Y2VwdGlvbiBtZXNzYWdlcyBsb2dnZWQgYnkgYSA8Y29kZT5SZWFsbTwvY29kZT4gd2lsbAorICAgYmUgcmVjb3JkZWQgYnkgdGhlIGxvZ2dpbmcgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRhaW5lcgorICAgZm9yIHRoZSByZWFsbTogaXRzIHN1cnJvdW5kaW5nIDxhIGhyZWY9ImNvbmZpZy9jb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+LAorICAgPGEgaHJlZj0iY29uZmlnL2hvc3QuaHRtbCI+SG9zdDwvYT4sIG9yCisgICA8YSBocmVmPSJjb25maWcvZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4uPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBSZWFsbSBJbXBsZW1lbnRhdGlvbnMiPgorCis8c3Vic2VjdGlvbiBuYW1lPSJKREJDUmVhbG0iPgorCis8aDM+SW50cm9kdWN0aW9uPC9oMz4KKworPHA+PHN0cm9uZz5KREJDUmVhbG08L3N0cm9uZz4gaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRvbWNhdCA1Cis8Y29kZT5SZWFsbTwvY29kZT4gaW50ZXJmYWNlIHRoYXQgbG9va3MgdXAgdXNlcnMgaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlCithY2Nlc3NlZCB2aWEgYSBKREJDIGRyaXZlci4gIFRoZXJlIGlzIHN1YnN0YW50aWFsIGNvbmZpZ3VyYXRpb24gZmxleGliaWxpdHkKK3RoYXQgbGV0cyB5b3UgYWRhcHQgdG8gZXhpc3RpbmcgdGFibGUgYW5kIGNvbHVtbiBuYW1lcywgYXMgbG9uZyBhcyB5b3VyCitkYXRhYmFzZSBzdHJ1Y3R1cmUgY29uZm9ybXMgdG8gdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHM6PC9wPgorPHVsPgorPGxpPlRoZXJlIG11c3QgYmUgYSB0YWJsZSwgcmVmZXJlbmNlZCBiZWxvdyBhcyB0aGUgPGVtPnVzZXJzPC9lbT4gdGFibGUsCisgICAgdGhhdCBjb250YWlucyBvbmUgcm93IGZvciBldmVyeSB2YWxpZCB1c2VyIHRoYXQgdGhpcyA8Y29kZT5SZWFsbTwvY29kZT4KKyAgICBzaG91bGQgcmVjb2duaXplLjwvbGk+Cis8bGk+VGhlIDxlbT51c2VyczwvZW0+IHRhYmxlIG11c3QgY29udGFpbiBhdCBsZWFzdCB0d28gY29sdW1ucyAoaXQgbWF5CisgICAgY29udGFpbiBtb3JlIGlmIHlvdXIgZXhpc3RpbmcgYXBwbGljYXRpb25zIHJlcXVpcmVkIGl0KToKKyAgICA8dWw+CisgICAgPGxpPlVzZXJuYW1lIHRvIGJlIHJlY29nbml6ZWQgYnkgVG9tY2F0IHdoZW4gdGhlIHVzZXIgbG9ncyBpbi48L2xpPgorICAgIDxsaT5QYXNzd29yZCB0byBiZSByZWNvZ25pemVkIGJ5IFRvbWNhdCB3aGVuIHRoZSB1c2VyIGxvZ3MgaW4uCisgICAgICAgIFRoaXMgdmFsdWUgbWF5IGluIGNsZWFydGV4dCBvciBkaWdlc3RlZCAtIHNlZSBiZWxvdyBmb3IgbW9yZQorICAgICAgICBpbmZvcm1hdGlvbi48L2xpPgorICAgIDwvdWw+PC9saT4KKzxsaT5UaGVyZSBtdXN0IGJlIGEgdGFibGUsIHJlZmVyZW5jZWQgYmVsb3cgYXMgdGhlIDxlbT51c2VyIHJvbGVzPC9lbT4gdGFibGUsCisgICAgdGhhdCBjb250YWlucyBvbmUgcm93IGZvciBldmVyeSB2YWxpZCByb2xlIHRoYXQgaXMgYXNzaWduZWQgdG8gYQorICAgIHBhcnRpY3VsYXIgdXNlci4gIEl0IGlzIGxlZ2FsIGZvciBhIHVzZXIgdG8gaGF2ZSB6ZXJvLCBvbmUsIG9yIG1vcmUgdGhhbgorICAgIG9uZSB2YWxpZCByb2xlLjwvbGk+Cis8bGk+VGhlIDxlbT51c2VyIHJvbGVzPC9lbT4gdGFibGUgbXVzdCBjb250YWluIGF0IGxlYXN0IHR3byBjb2x1bW5zIChpdCBtYXkKKyAgICBjb250YWluIG1vcmUgaWYgeW91ciBleGlzdGluZyBhcHBsaWNhdGlvbnMgcmVxdWlyZWQgaXQpOgorICAgIDx1bD4KKyAgICA8bGk+VXNlcm5hbWUgdG8gYmUgcmVjb2duaXplZCBieSBUb21jYXQgKHNhbWUgdmFsdWUgYXMgaXMgc3BlY2lmaWVkCisgICAgICAgIGluIHRoZSA8ZW0+dXNlcnM8L2VtPiB0YWJsZSkuPC9saT4KKyAgICA8bGk+Um9sZSBuYW1lIG9mIGEgdmFsaWQgcm9sZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB1c2VyLjwvbGk+CisgICAgPC91bD48L2xpPgorPC91bD4KKworPGgzPlF1aWNrIFN0YXJ0PC9oMz4KKworPHA+VG8gc2V0IHVwIFRvbWNhdCB0byB1c2UgSkRCQ1JlYWxtLCB5b3Ugd2lsbCBuZWVkIHRvIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Cis8b2w+Cis8bGk+SWYgeW91IGhhdmUgbm90IHlldCBkb25lIHNvLCBjcmVhdGUgdGFibGVzIGFuZCBjb2x1bW5zIGluIHlvdXIgZGF0YWJhc2UKKyAgICB0aGF0IGNvbmZvcm0gdG8gdGhlIHJlcXVpcmVtZW50cyBkZXNjcmliZWQgYWJvdmUuPC9saT4KKzxsaT5Db25maWd1cmUgYSBkYXRhYmFzZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZm9yIHVzZSBieSBUb21jYXQsIHRoYXQgaGFzCisgICAgYXQgbGVhc3QgcmVhZCBvbmx5IGFjY2VzcyB0byB0aGUgdGFibGVzIGRlc2NyaWJlZCBhYm92ZS4gIChUb21jYXQgd2lsbAorICAgIG5ldmVyIGF0dGVtcHQgdG8gd3JpdGUgdG8gdGhlc2UgdGFibGVzLik8L2xpPgorPGxpPlBsYWNlIGEgY29weSBvZiB0aGUgSkRCQyBkcml2ZXIgeW91IHdpbGwgYmUgdXNpbmcgaW5zaWRlIHRoZQorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL3NlcnZlci9saWI8L2NvZGU+IGRpcmVjdG9yeSAoaWYgeW91IGRvIG5vdCBuZWVkIGl0CisgICAgdmlzaWJsZSB0byB3ZWIgYXBwbGljYXRpb25zKSBvciA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb21tb24vbGliPC9jb2RlPgorICAgIChpZiBpdCB3aWxsIGJlIHVzZWQgYm90aCBieSBUb21jYXQgNSA8ZW0+YW5kPC9lbT4gYnkgeW91ciBhcHBzKS4KKyAgICBOb3RlIHRoYXQgPHN0cm9uZz5vbmx5PC9zdHJvbmc+IEpBUiBmaWxlcyBhcmUgcmVjb2duaXplZCE8L2xpPgorPGxpPlNldCB1cCBhIDxjb2RlPiZsdDtSZWFsbSZndDs8L2NvZGU+IGVsZW1lbnQsIGFzIGRlc2NyaWJlZCBiZWxvdywgaW4geW91cgorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4gZmlsZS48L2xpPgorPGxpPlJlc3RhcnQgVG9tY2F0IDUgaWYgaXQgaXMgYWxyZWFkeSBydW5uaW5nLjwvbGk+Cis8L29sPgorCis8aDM+UmVhbG0gRWxlbWVudCBBdHRyaWJ1dGVzPC9oMz4KKworPHA+VG8gY29uZmlndXJlIGEgSkRCQ1JlYWxtLCB5b3UgbXVzdCBjcmVhdGUgYSA8Y29kZT4mbHQ7UmVhbG0mZ3Q7PC9jb2RlPgorZWxlbWVudCBhbmQgbmVzdCBpdCBpbiB5b3VyIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4gZmlsZSwKK2FzIGRlc2NyaWJlZCA8YSBocmVmPSIjQ29uZmlndXJpbmcgYSBSZWFsbSI+YWJvdmU8L2E+LiAgVGhlIGF0dHJpYnV0ZXMgc3VwcG9ydGVkCitieSB0aGlzIFJlYWxtIGFyZSBsaXN0ZWQgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZy9yZWFsbS5odG1sIj5SZWFsbSBjb25maWd1cmF0aW9uCitkb2N1bWVudGF0aW9uPC9hPi48L3A+CisKKzxoMz5FeGFtcGxlPC9oMz4KKworPHA+QW4gZXhhbXBsZSBTUUwgc2NyaXB0IHRvIGNyZWF0ZSB0aGUgbmVlZGVkIHRhYmxlcyBtaWdodCBsb29rIHNvbWV0aGluZworbGlrZSB0aGlzIChhZGFwdCB0aGUgc3ludGF4IGFzIHJlcXVpcmVkIGZvciB5b3VyIHBhcnRpY3VsYXIgZGF0YWJhc2UpOjwvcD4KKzxzb3VyY2U+CitjcmVhdGUgdGFibGUgdXNlcnMgKAorICB1c2VyX25hbWUgICAgICAgICB2YXJjaGFyKDE1KSBub3QgbnVsbCBwcmltYXJ5IGtleSwKKyAgdXNlcl9wYXNzICAgICAgICAgdmFyY2hhcigxNSkgbm90IG51bGwKKyk7CisKK2NyZWF0ZSB0YWJsZSB1c2VyX3JvbGVzICgKKyAgdXNlcl9uYW1lICAgICAgICAgdmFyY2hhcigxNSkgbm90IG51bGwsCisgIHJvbGVfbmFtZSAgICAgICAgIHZhcmNoYXIoMTUpIG5vdCBudWxsLAorICBwcmltYXJ5IGtleSAodXNlcl9uYW1lLCByb2xlX25hbWUpCispOworPC9zb3VyY2U+CisKKzxwPkV4YW1wbGUgPGNvZGU+UmVhbG08L2NvZGU+IGVsZW1lbnRzIGFyZSBpbmNsdWRlZCAoY29tbWVudGVkIG91dCkgaW4gdGhlCitkZWZhdWx0IDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4gZmlsZS4gIEhlcmUncyBhbiBleGFtcGxlCitmb3IgdXNpbmcgYSBNeVNRTCBkYXRhYmFzZSBjYWxsZWQgImF1dGhvcml0eSIsIGNvbmZpZ3VyZWQgd2l0aCB0aGUgdGFibGVzCitkZXNjcmliZWQgYWJvdmUsIGFuZCBhY2Nlc3NlZCB3aXRoIHVzZXJuYW1lICJkYnVzZXIiIGFuZCBwYXNzd29yZCAiZGJwYXNzIjo8L3A+Cis8c291cmNlPgorJmx0O1JlYWxtIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG0iIGRlYnVnPSI5OSIKKyAgICAgIGRyaXZlck5hbWU9Im9yZy5nanQubW0ubXlzcWwuRHJpdmVyIgorICAgY29ubmVjdGlvblVSTD0iamRiYzpteXNxbDovL2xvY2FsaG9zdC9hdXRob3JpdHk/dXNlcj1kYnVzZXImYW1wO2FtcDtwYXNzd29yZD1kYnBhc3MiCisgICAgICAgdXNlclRhYmxlPSJ1c2VycyIgdXNlck5hbWVDb2w9InVzZXJfbmFtZSIgdXNlckNyZWRDb2w9InVzZXJfcGFzcyIKKyAgIHVzZXJSb2xlVGFibGU9InVzZXJfcm9sZXMiIHJvbGVOYW1lQ29sPSJyb2xlX25hbWUiLyZndDsKKzwvc291cmNlPgorCis8aDM+QWRkaXRpb25hbCBOb3RlczwvaDM+CisKKzxwPkpEQkNSZWFsbSBvcGVyYXRlcyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBydWxlczo8L3A+Cis8dWw+Cis8bGk+V2hlbiBhIHVzZXIgYXR0ZW1wdHMgdG8gYWNjZXNzIGEgcHJvdGVjdGVkIHJlc291cmNlIGZvciB0aGUgZmlyc3QgdGltZSwKKyAgICBUb21jYXQgNSB3aWxsIGNhbGwgdGhlIDxjb2RlPmF1dGhlbnRpY2F0ZSgpPC9jb2RlPiBtZXRob2Qgb2YgdGhpcworICAgIDxjb2RlPlJlYWxtPC9jb2RlPi4gIFRodXMsIGFueSBjaGFuZ2VzIHlvdSBoYXZlIG1hZGUgdG8gdGhlIGRhdGFiYXNlCisgICAgZGlyZWN0bHkgKG5ldyB1c2VycywgY2hhbmdlZCBwYXNzd29yZHMgb3Igcm9sZXMsIGV0Yy4pIHdpbGwgYmUgaW1tZWRpYXRlbHkKKyAgICByZWZsZWN0ZWQuPC9saT4KKzxsaT5PbmNlIGEgdXNlciBoYXMgYmVlbiBhdXRoZW50aWNhdGVkLCB0aGUgdXNlciAoYW5kIGhpcyBvciBoZXIgYXNzb2NpYXRlZAorICAgIHJvbGVzKSBhcmUgY2FjaGVkIHdpdGhpbiBUb21jYXQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdXNlcidzIGxvZ2luLgorICAgIChGb3IgRk9STS1iYXNlZCBhdXRoZW50aWNhdGlvbiwgdGhhdCBtZWFucyB1bnRpbCB0aGUgc2Vzc2lvbiB0aW1lcyBvdXQgb3IKKyAgICBpcyBpbnZhbGlkYXRlZDsgZm9yIEJBU0lDIGF1dGhlbnRpY2F0aW9uLCB0aGF0IG1lYW5zIHVudGlsIHRoZSB1c2VyCisgICAgY2xvc2VzIHRoZWlyIGJyb3dzZXIpLiAgVGhlIGNhY2hlZCB1c2VyIGlzIDxzdHJvbmc+bm90PC9zdHJvbmc+IHNhdmVkIGFuZAorICAgIHJlc3RvcmVkIGFjcm9zcyBzZXNzaW9ucyBzZXJpYWxpc2F0aW9ucy4gQW55IGNoYW5nZXMgdG8gdGhlIGRhdGFiYXNlCisgICAgaW5mb3JtYXRpb24gZm9yIGFuIGFscmVhZHkgYXV0aGVudGljYXRlZCB1c2VyIHdpbGwgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gYmUKKyAgICByZWZsZWN0ZWQgdW50aWwgdGhlIG5leHQgdGltZSB0aGF0IHVzZXIgbG9ncyBvbiBhZ2Fpbi48L2xpPgorPGxpPkFkbWluaXN0ZXJpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoZSA8ZW0+dXNlcnM8L2VtPiBhbmQgPGVtPnVzZXIgcm9sZXM8L2VtPgorICAgIHRhYmxlIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB5b3VyIG93biBhcHBsaWNhdGlvbnMuICBUb21jYXQgZG9lcyBub3QKKyAgICBwcm92aWRlIGFueSBidWlsdC1pbiBjYXBhYmlsaXRpZXMgdG8gbWFpbnRhaW4gdXNlcnMgYW5kIHJvbGVzLjwvbGk+Cis8L3VsPgorCis8L3N1YnNlY3Rpb24+CisKKworPHN1YnNlY3Rpb24gbmFtZT0iRGF0YVNvdXJjZVJlYWxtIj4KKworPGgzPkludHJvZHVjdGlvbjwvaDM+CisKKzxwPjxzdHJvbmc+RGF0YVNvdXJjZVJlYWxtPC9zdHJvbmc+IGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUb21jYXQgNQorPGNvZGU+UmVhbG08L2NvZGU+IGludGVyZmFjZSB0aGF0IGxvb2tzIHVwIHVzZXJzIGluIGEgcmVsYXRpb25hbCBkYXRhYmFzZQorYWNjZXNzZWQgdmlhIGEgSk5ESSBuYW1lZCBKREJDIERhdGFTb3VyY2UuICBUaGVyZSBpcyBzdWJzdGFudGlhbCBjb25maWd1cmF0aW9uCitmbGV4aWJpbGl0eSB0aGF0IGxldHMgeW91IGFkYXB0IHRvIGV4aXN0aW5nIHRhYmxlIGFuZCBjb2x1bW4gbmFtZXMsIGFzIGxvbmcKK2FzIHlvdXIgZGF0YWJhc2Ugc3RydWN0dXJlIGNvbmZvcm1zIHRvIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzOjwvcD4KKzx1bD4KKzxsaT5UaGVyZSBtdXN0IGJlIGEgdGFibGUsIHJlZmVyZW5jZWQgYmVsb3cgYXMgdGhlIDxlbT51c2VyczwvZW0+IHRhYmxlLAorICAgIHRoYXQgY29udGFpbnMgb25lIHJvdyBmb3IgZXZlcnkgdmFsaWQgdXNlciB0aGF0IHRoaXMgPGNvZGU+UmVhbG08L2NvZGU+CisgICAgc2hvdWxkIHJlY29nbml6ZS48L2xpPgorPGxpPlRoZSA8ZW0+dXNlcnM8L2VtPiB0YWJsZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgdHdvIGNvbHVtbnMgKGl0IG1heQorICAgIGNvbnRhaW4gbW9yZSBpZiB5b3VyIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyByZXF1aXJlZCBpdCk6CisgICAgPHVsPgorICAgIDxsaT5Vc2VybmFtZSB0byBiZSByZWNvZ25pemVkIGJ5IFRvbWNhdCB3aGVuIHRoZSB1c2VyIGxvZ3MgaW4uPC9saT4KKyAgICA8bGk+UGFzc3dvcmQgdG8gYmUgcmVjb2duaXplZCBieSBUb21jYXQgd2hlbiB0aGUgdXNlciBsb2dzIGluLgorICAgICAgICBUaGlzIHZhbHVlIG1heSBpbiBjbGVhcnRleHQgb3IgZGlnZXN0ZWQgLSBzZWUgYmVsb3cgZm9yIG1vcmUKKyAgICAgICAgaW5mb3JtYXRpb24uPC9saT4KKyAgICA8L3VsPjwvbGk+ICAgIAorPGxpPlRoZXJlIG11c3QgYmUgYSB0YWJsZSwgcmVmZXJlbmNlZCBiZWxvdyBhcyB0aGUgPGVtPnVzZXIgcm9sZXM8L2VtPiB0YWJsZSwKKyAgICB0aGF0IGNvbnRhaW5zIG9uZSByb3cgZm9yIGV2ZXJ5IHZhbGlkIHJvbGUgdGhhdCBpcyBhc3NpZ25lZCB0byBhCisgICAgcGFydGljdWxhciB1c2VyLiAgSXQgaXMgbGVnYWwgZm9yIGEgdXNlciB0byBoYXZlIHplcm8sIG9uZSwgb3IgbW9yZSB0aGFuCisgICAgb25lIHZhbGlkIHJvbGUuPC9saT4KKzxsaT5UaGUgPGVtPnVzZXIgcm9sZXM8L2VtPiB0YWJsZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgdHdvIGNvbHVtbnMgKGl0IG1heQorICAgIGNvbnRhaW4gbW9yZSBpZiB5b3VyIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyByZXF1aXJlZCBpdCk6CisgICAgPHVsPgorICAgIDxsaT5Vc2VybmFtZSB0byBiZSByZWNvZ25pemVkIGJ5IFRvbWNhdCAoc2FtZSB2YWx1ZSBhcyBpcyBzcGVjaWZpZWQKKyAgICAgICAgaW4gdGhlIDxlbT51c2VyczwvZW0+IHRhYmxlKS48L2xpPgorICAgIDxsaT5Sb2xlIG5hbWUgb2YgYSB2YWxpZCByb2xlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIuPC9saT4KKyAgICA8L3VsPjwvbGk+Cis8L3VsPgorCis8aDM+UXVpY2sgU3RhcnQ8L2gzPgorICAgICAgICAgICAgICAgICAgCis8cD5UbyBzZXQgdXAgVG9tY2F0IHRvIHVzZSBEYXRhU291cmNlUmVhbG0sIHlvdSB3aWxsIG5lZWQgdG8gZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KKzxvbD4gICAgICAgICAgICAgIAorPGxpPklmIHlvdSBoYXZlIG5vdCB5ZXQgZG9uZSBzbywgY3JlYXRlIHRhYmxlcyBhbmQgY29sdW1ucyBpbiB5b3VyIGRhdGFiYXNlCisgICAgdGhhdCBjb25mb3JtIHRvIHRoZSByZXF1aXJlbWVudHMgZGVzY3JpYmVkIGFib3ZlLjwvbGk+Cis8bGk+Q29uZmlndXJlIGEgZGF0YWJhc2UgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGZvciB1c2UgYnkgVG9tY2F0LCB0aGF0IGhhcworICAgIGF0IGxlYXN0IHJlYWQgb25seSBhY2Nlc3MgdG8gdGhlIHRhYmxlcyBkZXNjcmliZWQgYWJvdmUuICAoVG9tY2F0IHdpbGwKKyAgICBuZXZlciBhdHRlbXB0IHRvIHdyaXRlIHRvIHRoZXNlIHRhYmxlcy4pPC9saT4KKzxsaT5Db25maWd1cmUgYSBKTkRJIG5hbWVkIEpEQkMgRGF0YVNvdXJjZSBmb3IgeW91ciBkYXRhYmFzZS4gIFJlZmVyIHRvIHRoZQorICAgIDxhIGhyZWY9ImpuZGktZGF0YXNvdXJjZS1leGFtcGxlcy1ob3d0by5odG1sIj5KTkRJIERhdGFTb3VyY2UgRXhhbXBsZSBIT1ctVE88L2E+CisgICAgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb25maWd1cmUgYSBKTkRJIG5hbWVkIEpEQkMgRGF0YVNvdXJjZS48L2xpPgorPGxpPlNldCB1cCBhIDxjb2RlPiZsdDtSZWFsbSZndDs8L2NvZGU+IGVsZW1lbnQsIGFzIGRlc2NyaWJlZCBiZWxvdywgaW4geW91cgorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4gZmlsZS48L2xpPgorPGxpPlJlc3RhcnQgVG9tY2F0IDUgaWYgaXQgaXMgYWxyZWFkeSBydW5uaW5nLjwvbGk+Cis8L29sPgorCis8aDM+UmVhbG0gRWxlbWVudCBBdHRyaWJ1dGVzPC9oMz4KKworPHA+VG8gY29uZmlndXJlIGEgRGF0YVNvdXJjZVJlYWxtLCB5b3UgbXVzdCBjcmVhdGUgYSA8Y29kZT4mbHQ7UmVhbG0mZ3Q7PC9jb2RlPgorZWxlbWVudCBhbmQgbmVzdCBpdCBpbiB5b3VyIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4gZmlsZSwKK2FzIGRlc2NyaWJlZCA8YSBocmVmPSIjQ29uZmlndXJpbmcgYSBSZWFsbSI+YWJvdmU8L2E+LiAgVGhlIGF0dHJpYnV0ZXMgc3VwcG9ydGVkCitieSB0aGlzIFJlYWxtIGFyZSBsaXN0ZWQgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZy9yZWFsbS5odG1sIj5SZWFsbSBjb25maWd1cmF0aW9uCitkb2N1bWVudGF0aW9uPC9hPi48L3A+CisKKzxoMz5FeGFtcGxlPC9oMz4KKworPHA+QW4gZXhhbXBsZSBTUUwgc2NyaXB0IHRvIGNyZWF0ZSB0aGUgbmVlZGVkIHRhYmxlcyBtaWdodCBsb29rIHNvbWV0aGluZworbGlrZSB0aGlzIChhZGFwdCB0aGUgc3ludGF4IGFzIHJlcXVpcmVkIGZvciB5b3VyIHBhcnRpY3VsYXIgZGF0YWJhc2UpOjwvcD4KKzxzb3VyY2U+CitjcmVhdGUgdGFibGUgdXNlcnMgKAorICB1c2VyX25hbWUgICAgICAgICB2YXJjaGFyKDE1KSBub3QgbnVsbCBwcmltYXJ5IGtleSwKKyAgdXNlcl9wYXNzICAgICAgICAgdmFyY2hhcigxNSkgbm90IG51bGwKKyk7CisKK2NyZWF0ZSB0YWJsZSB1c2VyX3JvbGVzICgKKyAgdXNlcl9uYW1lICAgICAgICAgdmFyY2hhcigxNSkgbm90IG51bGwsCisgIHJvbGVfbmFtZSAgICAgICAgIHZhcmNoYXIoMTUpIG5vdCBudWxsLAorICBwcmltYXJ5IGtleSAodXNlcl9uYW1lLCByb2xlX25hbWUpCispOworPC9zb3VyY2U+CisKKzxwPkhlcmUgaXMgYW4gZXhhbXBsZSBmb3IgdXNpbmcgYSBNeVNRTCBkYXRhYmFzZSBjYWxsZWQgImF1dGhvcml0eSIsIGNvbmZpZ3VyZWQKK3dpdGggdGhlIHRhYmxlcyBkZXNjcmliZWQgYWJvdmUsIGFuZCBhY2Nlc3NlZCB3aXRoIHRoZSBKTkRJIEpEQkMgRGF0YVNvdXJjZSB3aXRoCituYW1lICJqYXZhOi9jb21wL2Vudi9qZGJjL2F1dGhvcml0eSIuPC9wPgorPHNvdXJjZT4KKyZsdDtSZWFsbSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uRGF0YVNvdXJjZVJlYWxtIiBkZWJ1Zz0iOTkiCisgICBkYXRhU291cmNlTmFtZT0iamRiYy9hdXRob3JpdHkiCisgICB1c2VyVGFibGU9InVzZXJzIiB1c2VyTmFtZUNvbD0idXNlcl9uYW1lIiB1c2VyQ3JlZENvbD0idXNlcl9wYXNzIgorICAgdXNlclJvbGVUYWJsZT0idXNlcl9yb2xlcyIgcm9sZU5hbWVDb2w9InJvbGVfbmFtZSIvJmd0OworPC9zb3VyY2U+CisKKzxoMz5BZGRpdGlvbmFsIE5vdGVzPC9oMz4KKworPHA+RGF0YVNvdXJjZVJlYWxtIG9wZXJhdGVzIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHJ1bGVzOjwvcD4KKzx1bD4KKzxsaT5XaGVuIGEgdXNlciBhdHRlbXB0cyB0byBhY2Nlc3MgYSBwcm90ZWN0ZWQgcmVzb3VyY2UgZm9yIHRoZSBmaXJzdCB0aW1lLAorICAgIFRvbWNhdCA1IHdpbGwgY2FsbCB0aGUgPGNvZGU+YXV0aGVudGljYXRlKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGlzCisgICAgPGNvZGU+UmVhbG08L2NvZGU+LiAgVGh1cywgYW55IGNoYW5nZXMgeW91IGhhdmUgbWFkZSB0byB0aGUgZGF0YWJhc2UKKyAgICBkaXJlY3RseSAobmV3IHVzZXJzLCBjaGFuZ2VkIHBhc3N3b3JkcyBvciByb2xlcywgZXRjLikgd2lsbCBiZSBpbW1lZGlhdGVseQorICAgIHJlZmxlY3RlZC48L2xpPgorPGxpPk9uY2UgYSB1c2VyIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQsIHRoZSB1c2VyIChhbmQgaGlzIG9yIGhlciBhc3NvY2lhdGVkCisgICAgcm9sZXMpIGFyZSBjYWNoZWQgd2l0aGluIFRvbWNhdCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB1c2VyJ3MgbG9naW4uCisgICAgKEZvciBGT1JNLWJhc2VkIGF1dGhlbnRpY2F0aW9uLCB0aGF0IG1lYW5zIHVudGlsIHRoZSBzZXNzaW9uIHRpbWVzIG91dCBvcgorICAgIGlzIGludmFsaWRhdGVkOyBmb3IgQkFTSUMgYXV0aGVudGljYXRpb24sIHRoYXQgbWVhbnMgdW50aWwgdGhlIHVzZXIKKyAgICBjbG9zZXMgdGhlaXIgYnJvd3NlcikuICBUaGUgY2FjaGVkIHVzZXIgaXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gc2F2ZWQgYW5kCisgICAgcmVzdG9yZWQgYWNyb3NzIHNlc3Npb25zIHNlcmlhbGlzYXRpb25zLiBBbnkgY2hhbmdlcyB0byB0aGUgZGF0YWJhc2UKKyAgICBpbmZvcm1hdGlvbiBmb3IgYW4gYWxyZWFkeSBhdXRoZW50aWNhdGVkIHVzZXIgd2lsbCA8c3Ryb25nPm5vdDwvc3Ryb25nPiBiZQorICAgIHJlZmxlY3RlZCB1bnRpbCB0aGUgbmV4dCB0aW1lIHRoYXQgdXNlciBsb2dzIG9uIGFnYWluLjwvbGk+Cis8bGk+QWRtaW5pc3RlcmluZyB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIDxlbT51c2VyczwvZW0+IGFuZCA8ZW0+dXNlciByb2xlczwvZW0+CisgICAgdGFibGUgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHlvdXIgb3duIGFwcGxpY2F0aW9ucy4gIFRvbWNhdCBkb2VzIG5vdAorICAgIHByb3ZpZGUgYW55IGJ1aWx0LWluIGNhcGFiaWxpdGllcyB0byBtYWludGFpbiB1c2VycyBhbmQgcm9sZXMuPC9saT4KKzwvdWw+CisKKzwvc3Vic2VjdGlvbj4KKworCis8c3Vic2VjdGlvbiBuYW1lPSJKTkRJUmVhbG0iPgorCis8aDM+SW50cm9kdWN0aW9uPC9oMz4KKworPHA+PHN0cm9uZz5KTkRJUmVhbG08L3N0cm9uZz4gaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRvbWNhdCA1Cis8Y29kZT5SZWFsbTwvY29kZT4gaW50ZXJmYWNlIHRoYXQgbG9va3MgdXAgdXNlcnMgaW4gYW4gTERBUCBkaXJlY3RvcnkKK3NlcnZlciBhY2Nlc3NlZCBieSBhIEpOREkgcHJvdmlkZXIgKHR5cGljYWxseSwgdGhlIHN0YW5kYXJkIExEQVAKK3Byb3ZpZGVyIHRoYXQgaXMgYXZhaWxhYmxlIHdpdGggdGhlIEpOREkgQVBJIGNsYXNzZXMpLiBUaGUgcmVhbG0KK3N1cHBvcnRzIGEgdmFyaWV0eSBvZiBhcHByb2FjaGVzIHRvIHVzaW5nIGEgZGlyZWN0b3J5IGZvcgorYXV0aGVudGljYXRpb24uPC9wPgorCis8aDQ+Q29ubmVjdGluZyB0byB0aGUgZGlyZWN0b3J5PC9oND4KKworPHA+VGhlIHJlYWxtJ3MgY29ubmVjdGlvbiB0byB0aGUgZGlyZWN0b3J5IGlzIGRlZmluZWQgYnkgdGhlCis8c3Ryb25nPmNvbm5lY3Rpb25VUkw8L3N0cm9uZz4gY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUuIFRoaXMgaXMgYSBVUkwKK3dob3NlIGZvcm1hdCBpcyBkZWZpbmVkIGJ5IHRoZSBKTkRJIHByb3ZpZGVyLiBJdCBpcyB1c3VhbGx5IGFuIExEQVAKK1VSTCB0aGF0IHNwZWNpZmllcyB0aGUgZG9tYWluIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBzZXJ2ZXIgdG8gY29ubmVjdAordG8sIGFuZCBvcHRpb25hbGx5IHRoZSBwb3J0IG51bWJlciBhbmQgZGlzdGluZ3Vpc2hlZCBuYW1lIChETikgb2YgdGhlCityZXF1aXJlZCByb290IG5hbWluZyBjb250ZXh0LjwvcD4KKworPHA+SWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBwcm92aWRlciB5b3UgY2FuIGNvbmZpZ3VyZSBhbgorPHN0cm9uZz5hbHRlcm5hdGVVUkw8L3N0cm9uZz4uICBJZiBhIHNvY2tldCBjb25uZWN0aW9uIGNhbiBub3QgYmUKK21hZGUgdG8gdGhlIHByb3ZpZGVyIGF0IHRoZSA8c3Ryb25nPmNvbm5lY3Rpb25VUkw8L3N0cm9uZz4gYW4KK2F0dGVtcHQgd2lsbCBiZSBtYWRlIHRvIHVzZSB0aGUgPHN0cm9uZz5hbHRlcm5hdGVVUkw8L3N0cm9uZz4uPC9wPgorCis8cD5XaGVuIG1ha2luZyBhIGNvbm5lY3Rpb24gaW4gb3JkZXIgdG8gc2VhcmNoIHRoZSBkaXJlY3RvcnkgYW5kCityZXRyaWV2ZSB1c2VyIGFuZCByb2xlIGluZm9ybWF0aW9uLCB0aGUgcmVhbG0gYXV0aGVudGljYXRlcyBpdHNlbGYgdG8KK3RoZSBkaXJlY3Rvcnkgd2l0aCB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHNwZWNpZmllZCBieSB0aGUKKzxzdHJvbmc+Y29ubmVjdGlvbk5hbWU8L3N0cm9uZz4gYW5kCis8c3Ryb25nPmNvbm5lY3Rpb25QYXNzd29yZDwvc3Ryb25nPiBwcm9wZXJ0aWVzLiBJZiB0aGVzZSBwcm9wZXJ0aWVzCithcmUgbm90IHNwZWNpZmllZCB0aGUgY29ubmVjdGlvbiBpcyBhbm9ueW1vdXMuIFRoaXMgaXMgc3VmZmljaWVudCBpbgorbWFueSBjYXNlcy4KKzwvcD4KKworCis8aDQ+U2VsZWN0aW5nIHRoZSB1c2VyJ3MgZGlyZWN0b3J5IGVudHJ5PC9oND4KKworPHA+RWFjaCB1c2VyIHRoYXQgY2FuIGJlIGF1dGhlbnRpY2F0ZWQgbXVzdCBiZSByZXByZXNlbnRlZCBpbiB0aGUKK2RpcmVjdG9yeSBieSBhbiBpbmRpdmlkdWFsIGVudHJ5IHRoYXQgY29ycmVzcG9uZHMgdG8gYW4gZWxlbWVudCBpbiB0aGUKK2luaXRpYWwgPGNvZGU+RGlyQ29udGV4dDwvY29kZT4gZGVmaW5lZCBieSB0aGUKKzxzdHJvbmc+Y29ubmVjdGlvblVSTDwvc3Ryb25nPiBhdHRyaWJ1dGUuIFRoaXMgdXNlciBlbnRyeSBtdXN0IGhhdmUgYW4KK2F0dHJpYnV0ZSBjb250YWluaW5nIHRoZSB1c2VybmFtZSB0aGF0IGlzIHByZXNlbnRlZCBmb3IKK2F1dGhlbnRpY2F0aW9uLjwvcD4KKworPHA+T2Z0ZW4gdGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSBvZiB0aGUgdXNlcidzIGVudHJ5IGNvbnRhaW5zIHRoZQordXNlcm5hbWUgcHJlc2VudGVkIGZvciBhdXRoZW50aWNhdGlvbiBidXQgaXMgb3RoZXJ3aXNlIHRoZSBzYW1lIGZvcgorYWxsIHVzZXJzLiBJbiB0aGlzIGNhc2UgdGhlIDxzdHJvbmc+dXNlclBhdHRlcm48L3N0cm9uZz4gYXR0cmlidXRlIG1heQorYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBETiwgd2l0aCAiezB9IiBtYXJraW5nIHdoZXJlCit0aGUgdXNlcm5hbWUgc2hvdWxkIGJlIHN1YnN0aXR1dGVkLjwvcD4KKworPHA+T3RoZXJ3aXNlIHRoZSByZWFsbSBtdXN0IHNlYXJjaCB0aGUgZGlyZWN0b3J5IHRvIGZpbmQgYSB1bmlxdWUgZW50cnkKK2NvbnRhaW5pbmcgdGhlIHVzZXJuYW1lLiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgY29uZmlndXJlIHRoaXMKK3NlYXJjaDoKKworICAgICA8dWw+CisgICAgIDxsaT48c3Ryb25nPnVzZXJCYXNlPC9zdHJvbmc+IC0gdGhlIGVudHJ5IHRoYXQgaXMgdGhlIGJhc2Ugb2YKKyAgICAgICAgIHRoZSBzdWJ0cmVlIGNvbnRhaW5pbmcgdXNlcnMuICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgc2VhcmNoCisgICAgICAgICBiYXNlIGlzIHRoZSB0b3AtbGV2ZWwgY29udGV4dC48L2xpPgorCisgICAgIDxsaT48c3Ryb25nPnVzZXJTdWJ0cmVlPC9zdHJvbmc+IC0gdGhlIHNlYXJjaCBzY29wZS4gU2V0IHRvCisgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3Ugd2lzaCB0byBzZWFyY2ggdGhlIGVudGlyZSBzdWJ0cmVlCisgICAgICAgICByb290ZWQgYXQgdGhlIDxzdHJvbmc+dXNlckJhc2U8L3N0cm9uZz4gZW50cnkuIFRoZSBkZWZhdWx0IHZhbHVlCisgICAgICAgICBvZiA8Y29kZT5mYWxzZTwvY29kZT4gcmVxdWVzdHMgYSBzaW5nbGUtbGV2ZWwgc2VhcmNoCisgICAgICAgICBpbmNsdWRpbmcgb25seSB0aGUgdG9wIGxldmVsLjwvbGk+CisKKyAgICAgPGxpPjxzdHJvbmc+dXNlclNlYXJjaDwvc3Ryb25nPiAtIHBhdHRlcm4gc3BlY2lmeWluZyB0aGUgTERBUAorICAgICAgICAgc2VhcmNoIGZpbHRlciB0byB1c2UgYWZ0ZXIgc3Vic3RpdHV0aW9uIG9mIHRoZSB1c2VybmFtZS48L2xpPgorCisgICAgPC91bD4KKzwvcD4KKworCis8aDQ+QXV0aGVudGljYXRpbmcgdGhlIHVzZXI8L2g0PgorCis8dWw+Cis8bGk+Cis8cD48Yj5CaW5kIG1vZGU8L2I+PC9wPgorCis8cD5CeSBkZWZhdWx0IHRoZSByZWFsbSBhdXRoZW50aWNhdGVzIGEgdXNlciBieSBiaW5kaW5nIHRvCit0aGUgZGlyZWN0b3J5IHdpdGggdGhlIEROIG9mIHRoZSBlbnRyeSBmb3IgdGhhdCB1c2VyIGFuZCB0aGUgcGFzc3dvcmQKK3ByZXNlbnRlZCBieSB0aGUgdXNlci4gSWYgdGhpcyBzaW1wbGUgYmluZCBzdWNjZWVkcyB0aGUgdXNlciBpcyBjb25zaWRlcmVkIHRvCitiZSBhdXRoZW50aWNhdGVkLjwvcD4KKworPHA+Rm9yIHNlY3VyaXR5IHJlYXNvbnMgYSBkaXJlY3RvcnkgbWF5IHN0b3JlIGEgZGlnZXN0IG9mIHRoZSB1c2VyJ3MKK3Bhc3N3b3JkIHJhdGhlciB0aGFuIHRoZSBjbGVhciB0ZXh0IHZlcnNpb24gKHNlZSA8YSBocmVmPSIjRGlnZXN0ZWQKK1Bhc3N3b3JkcyI+RGlnZXN0ZWQgUGFzc3dvcmRzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuIEluIHRoYXQgY2FzZSwKK2FzIHBhcnQgb2YgdGhlIHNpbXBsZSBiaW5kIG9wZXJhdGlvbiB0aGUgZGlyZWN0b3J5IGF1dG9tYXRpY2FsbHkKK2NvbXB1dGVzIHRoZSBjb3JyZWN0IGRpZ2VzdCBvZiB0aGUgcGxhaW50ZXh0IHBhc3N3b3JkIHByZXNlbnRlZCBieSB0aGUKK3VzZXIgYmVmb3JlIHZhbGlkYXRpbmcgaXQgYWdhaW5zdCB0aGUgc3RvcmVkIHZhbHVlLiBJbiBiaW5kIG1vZGUsCit0aGVyZWZvcmUsIHRoZSByZWFsbSBpcyBub3QgaW52b2x2ZWQgaW4gZGlnZXN0IHByb2Nlc3NpbmcuIFRoZQorPHN0cm9uZz5kaWdlc3Q8L3N0cm9uZz4gYXR0cmlidXRlIGlzIG5vdCB1c2VkLCBhbmQgd2lsbCBiZSBpZ25vcmVkIGlmCitzZXQuPC9wPgorPC9saT4KKworPGxpPgorPHA+PGI+Q29tcGFyaXNvbiBtb2RlPC9iPjwvcD4KKzxwPkFsdGVybmF0aXZlbHksIHRoZSByZWFsbSBtYXkgcmV0cmlldmUgdGhlIHN0b3JlZAorcGFzc3dvcmQgZnJvbSB0aGUgZGlyZWN0b3J5IGFuZCBjb21wYXJlIGl0IGV4cGxpY2l0bHkgd2l0aCB0aGUgdmFsdWUKK3ByZXNlbnRlZCBieSB0aGUgdXNlci4gVGhpcyBtb2RlIGlzIGNvbmZpZ3VyZWQgYnkgc2V0dGluZyB0aGUKKzxzdHJvbmc+dXNlclBhc3N3b3JkPC9zdHJvbmc+IGF0dHJpYnV0ZSB0byB0aGUgbmFtZSBvZiBhIGRpcmVjdG9yeQorYXR0cmlidXRlIGluIHRoZSB1c2VyJ3MgZW50cnkgdGhhdCBjb250YWlucyB0aGUgcGFzc3dvcmQuPC9wPgorCis8cD5Db21wYXJpc29uIG1vZGUgaGFzIHNvbWUgZGlzYWR2YW50YWdlcy4gRmlyc3QsIHRoZQorPHN0cm9uZz5jb25uZWN0aW9uTmFtZTwvc3Ryb25nPiBhbmQKKzxzdHJvbmc+Y29ubmVjdGlvblBhc3N3b3JkPC9zdHJvbmc+IGF0dHJpYnV0ZXMgbXVzdCBiZSBjb25maWd1cmVkIHRvCithbGxvdyB0aGUgcmVhbG0gdG8gcmVhZCB1c2VycycgcGFzc3dvcmRzIGluIHRoZSBkaXJlY3RvcnkuIEZvcgorc2VjdXJpdHkgcmVhc29ucyB0aGlzIGlzIGdlbmVyYWxseSB1bmRlc2lyYWJsZTsgaW5kZWVkIG1hbnkgZGlyZWN0b3J5CitpbXBsZW1lbnRhdGlvbnMgd2lsbCBub3QgYWxsb3cgZXZlbiB0aGUgZGlyZWN0b3J5IG1hbmFnZXIgdG8gcmVhZAordGhlc2UgcGFzc3dvcmRzLiBJbiBhZGRpdGlvbiwgdGhlIHJlYWxtIG11c3QgaGFuZGxlIHBhc3N3b3JkIGRpZ2VzdHMKK2l0c2VsZiwgaW5jbHVkaW5nIHZhcmlhdGlvbnMgaW4gdGhlIGFsZ29yaXRobXMgdXNlZCBhbmQgd2F5cyBvZgorcmVwcmVzZW50aW5nIHBhc3N3b3JkIGhhc2hlcyBpbiB0aGUgZGlyZWN0b3J5LiBIb3dldmVyLCB0aGUgcmVhbG0gbWF5Citzb21ldGltZXMgbmVlZCBhY2Nlc3MgdG8gdGhlIHN0b3JlZCBwYXNzd29yZCwgZm9yIGV4YW1wbGUgdG8gc3VwcG9ydAorSFRUUCBEaWdlc3QgQWNjZXNzIEF1dGhlbnRpY2F0aW9uIChSRkMgMjA2OSkuIChOb3RlIHRoYXQgSFRUUCBkaWdlc3QKK2F1dGhlbnRpY2F0aW9uIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzdG9yYWdlIG9mIHBhc3N3b3JkIGRpZ2VzdHMgaW4KK3RoZSByZXBvc2l0b3J5IGZvciB1c2VyIGluZm9ybWF0aW9uIGFzIGRpc2N1c3NlZCBhYm92ZSkuCis8L3A+Cis8L2xpPgorPC91bD4KKworPGg0PkFzc2lnbmluZyByb2xlcyB0byB0aGUgdXNlcjwvaDQ+CisKKzxwPlRoZSBkaXJlY3RvcnkgcmVhbG0gc3VwcG9ydHMgdHdvIGFwcHJvYWNoZXMgdG8gdGhlIHJlcHJlc2VudGF0aW9uCitvZiByb2xlcyBpbiB0aGUgZGlyZWN0b3J5OjwvcD4KKworPHVsPgorPGxpPgorPHA+PGI+Um9sZXMgYXMgZXhwbGljaXQgZGlyZWN0b3J5IGVudHJpZXM8L2I+PC9wPgorCis8cD5Sb2xlcyBtYXkgYmUgcmVwcmVzZW50ZWQgYnkgZXhwbGljaXQgZGlyZWN0b3J5IGVudHJpZXMuIEEgcm9sZQorZW50cnkgaXMgdXN1YWxseSBhbiBMREFQIGdyb3VwIGVudHJ5IHdpdGggb25lIGF0dHJpYnV0ZQorY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgcm9sZSBhbmQgYW5vdGhlciB3aG9zZSB2YWx1ZXMgYXJlIHRoZQorZGlzdGluZ3Vpc2hlZCBuYW1lcyBvciB1c2VybmFtZXMgb2YgdGhlIHVzZXJzIGluIHRoYXQgcm9sZS4gIFRoZQorZm9sbG93aW5nIGF0dHJpYnV0ZXMgY29uZmlndXJlIGEgZGlyZWN0b3J5IHNlYXJjaCB0bworZmluZCB0aGUgbmFtZXMgb2Ygcm9sZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdXRoZW50aWNhdGVkIHVzZXI6PC9wPgorCis8dWw+Cis8bGk+PHN0cm9uZz5yb2xlQmFzZTwvc3Ryb25nPiAtIHRoZSBiYXNlIGVudHJ5IGZvciB0aGUgcm9sZSBzZWFyY2guCisgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHNlYXJjaCBiYXNlIGlzIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5CisgICAgY29udGV4dC48L2xpPgorCis8bGk+PHN0cm9uZz5yb2xlU3VidHJlZTwvc3Ryb25nPiAtIHRoZSBzZWFyY2gKKyAgICBzY29wZS4gU2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3aXNoIHRvIHNlYXJjaCB0aGUgZW50aXJlCisgICAgc3VidHJlZSByb290ZWQgYXQgdGhlIDxjb2RlPnJvbGVCYXNlPC9jb2RlPiBlbnRyeS4gVGhlIGRlZmF1bHQKKyAgICB2YWx1ZSBvZiA8Y29kZT5mYWxzZTwvY29kZT4gcmVxdWVzdHMgYSBzaW5nbGUtbGV2ZWwgc2VhcmNoCisgICAgaW5jbHVkaW5nIHRoZSB0b3AgbGV2ZWwgb25seS48L2xpPgorCis8bGk+PHN0cm9uZz5yb2xlU2VhcmNoPC9zdHJvbmc+IC0gdGhlIExEQVAgc2VhcmNoIGZpbHRlciBmb3IKKyAgICBzZWxlY3Rpbmcgcm9sZSBlbnRyaWVzLiBJdCBvcHRpb25hbGx5IGluY2x1ZGVzIHBhdHRlcm4KKyAgICByZXBsYWNlbWVudHMgInswfSIgZm9yIHRoZSBkaXN0aW5ndWlzaGVkIG5hbWUgYW5kL29yICJ7MX0iIGZvciB0aGUKKyAgICB1c2VybmFtZSBvZiB0aGUgYXV0aGVudGljYXRlZCB1c2VyLjwvbGk+CisKKzxsaT48c3Ryb25nPnJvbGVOYW1lPC9zdHJvbmc+IC0gdGhlIGF0dHJpYnV0ZSBpbiBhIHJvbGUgZW50cnkKKyAgICAgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGF0IHJvbGUuPC9saT4KKworPC91bD4KKworPC9saT4KKzwvdWw+CisKKzx1bD4KKzxsaT4KKzxwPjxiPlJvbGVzIGFzIGFuIGF0dHJpYnV0ZSBvZiB0aGUgdXNlciBlbnRyeTwvYj48L3A+CisKKzxwPlJvbGUgbmFtZXMgbWF5IGFsc28gYmUgaGVsZCBhcyB0aGUgdmFsdWVzIG9mIGFuIGF0dHJpYnV0ZSBpbiB0aGUKK3VzZXIncyBkaXJlY3RvcnkgZW50cnkuIFVzZSA8c3Ryb25nPnVzZXJSb2xlTmFtZTwvc3Ryb25nPiB0byBzcGVjaWZ5Cit0aGUgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZS48L3A+CisKKzwvbGk+Cis8L3VsPgorPHA+QSBjb21iaW5hdGlvbiBvZiBib3RoIGFwcHJvYWNoZXMgdG8gcm9sZSByZXByZXNlbnRhdGlvbiBtYXkgYmUgdXNlZC48L3A+CisKKzxoMz5RdWljayBTdGFydDwvaDM+CisKKzxwPlRvIHNldCB1cCBUb21jYXQgdG8gdXNlIEpORElSZWFsbSwgeW91IHdpbGwgbmVlZCB0byBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgorPG9sPgorPGxpPk1ha2Ugc3VyZSB5b3VyIGRpcmVjdG9yeSBzZXJ2ZXIgaXMgY29uZmlndXJlZCB3aXRoIGEgc2NoZW1hIHRoYXQgbWF0Y2hlcworICAgIHRoZSByZXF1aXJlbWVudHMgbGlzdGVkIGFib3ZlLjwvbGk+Cis8bGk+SWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmb3IgdXNlIGJ5IFRvbWNhdCwgdGhhdCBoYXMKKyAgICByZWFkIG9ubHkgYWNjZXNzIHRvIHRoZSBpbmZvcm1hdGlvbiBkZXNjcmliZWQgYWJvdmUuICAoVG9tY2F0IHdpbGwKKyAgICBuZXZlciBhdHRlbXB0IHRvIG1vZGlmeSB0aGlzIGluZm9ybWF0aW9uLik8L2xpPgorPGxpPlBsYWNlIGEgY29weSBvZiB0aGUgSk5ESSBkcml2ZXIgeW91IHdpbGwgYmUgdXNpbmcgKHR5cGljYWxseQorICAgIDxjb2RlPmxkYXAuamFyPC9jb2RlPiBhdmFpbGFibGUgd2l0aCBKTkRJKSBpbnNpZGUgdGhlCisgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvc2VydmVyL2xpYjwvY29kZT4gZGlyZWN0b3J5IChpZiB5b3UgZG8gbm90IG5lZWQgaXQKKyAgICB2aXNpYmxlIHRvIHdlYiBhcHBsaWNhdGlvbnMpIG9yIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbW1vbi9saWI8L2NvZGU+CisgICAgKGlmIGl0IHdpbGwgYmUgdXNlZCBib3RoIGJ5IFRvbWNhdCA1IDxlbT5hbmQ8L2VtPiBieSB5b3VyIGFwcHMpLjwvbGk+Cis8bGk+U2V0IHVwIGEgPGNvZGU+Jmx0O1JlYWxtJmd0OzwvY29kZT4gZWxlbWVudCwgYXMgZGVzY3JpYmVkIGJlbG93LCBpbiB5b3VyCisgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBmaWxlLjwvbGk+Cis8bGk+UmVzdGFydCBUb21jYXQgNSBpZiBpdCBpcyBhbHJlYWR5IHJ1bm5pbmcuPC9saT4KKzwvb2w+CisKKzxoMz5SZWFsbSBFbGVtZW50IEF0dHJpYnV0ZXM8L2gzPgorCis8cD5UbyBjb25maWd1cmUgYSBKTkRJUmVhbG0sIHlvdSBtdXN0IGNyZWF0ZSBhIDxjb2RlPiZsdDtSZWFsbSZndDs8L2NvZGU+CitlbGVtZW50IGFuZCBuZXN0IGl0IGluIHlvdXIgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBmaWxlLAorYXMgZGVzY3JpYmVkIDxhIGhyZWY9IiNDb25maWd1cmluZyBhIFJlYWxtIj5hYm92ZTwvYT4uICBUaGUgYXR0cmlidXRlcyBzdXBwb3J0ZWQKK2J5IHRoaXMgUmVhbG0gYXJlIGxpc3RlZCBpbiB0aGUgPGEgaHJlZj0iY29uZmlnL3JlYWxtLmh0bWwiPlJlYWxtIGNvbmZpZ3VyYXRpb24KK2RvY3VtZW50YXRpb248L2E+LjwvcD4KKworPGgzPkV4YW1wbGU8L2gzPgorCis8cD5DcmVhdGlvbiBvZiB0aGUgYXBwcm9wcmlhdGUgc2NoZW1hIGluIHlvdXIgZGlyZWN0b3J5IHNlcnZlciBpcyBiZXlvbmQgdGhlCitzY29wZSBvZiB0aGlzIGRvY3VtZW50LCBiZWNhdXNlIGl0IGlzIHVuaXF1ZSB0byBlYWNoIGRpcmVjdG9yeSBzZXJ2ZXIKK2ltcGxlbWVudGF0aW9uLiAgSW4gdGhlIGV4YW1wbGVzIGJlbG93LCB3ZSB3aWxsIGFzc3VtZSB0aGF0IHlvdSBhcmUgdXNpbmcgYQorZGlzdHJpYnV0aW9uIG9mIHRoZSBPcGVuTERBUCBkaXJlY3Rvcnkgc2VydmVyICh2ZXJzaW9uIDIuMC4xMSBvciBsYXRlciksIHdoaWNoCitjYW4gYmUgZG93bmxvYWRlZCBmcm9tCis8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5sZGFwLm9yZyI+aHR0cDovL3d3dy5vcGVubGRhcC5vcmc8L2E+LiAgQXNzdW1lIHRoYXQKK3lvdXIgPGNvZGU+c2xhcGQuY29uZjwvY29kZT4gZmlsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIHNldHRpbmdzCisoYW1vbmcgb3RoZXJzKTo8L3A+Cis8c291cmNlPgorZGF0YWJhc2UgbGRibQorc3VmZml4IGRjPSJteWNvbXBhbnkiLGRjPSJjb20iCityb290ZG4gImNuPU1hbmFnZXIsZGM9bXljb21wYW55LGRjPWNvbSIKK3Jvb3RwdyBzZWNyZXQKKzwvc291cmNlPgorCis8cD5XZSB3aWxsIGFzc3VtZSBmb3IgPGNvZGU+Y29ubmVjdGlvblVSTDwvY29kZT4gdGhhdCB0aGUgZGlyZWN0b3J5CitzZXJ2ZXIgcnVucyBvbiB0aGUgc2FtZSBtYWNoaW5lIGFzIFRvbWNhdC4gIFNlZSA8YQoraHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qbmRpL2RvY3MuaHRtbCI+aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qbmRpL2RvY3MuaHRtbDwvYT4KK2ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbmZpZ3VyaW5nIGFuZCB1c2luZyB0aGUgSk5ESSBMREFQCitwcm92aWRlci48L3A+CisKKzxwPk5leHQsIGFzc3VtZSB0aGF0IHRoaXMgZGlyZWN0b3J5IHNlcnZlciBoYXMgYmVlbiBwb3B1bGF0ZWQgd2l0aCBlbGVtZW50cworYXMgc2hvd24gYmVsb3cgKGluIExESUYgZm9ybWF0KTo8L3A+CisKKzxzb3VyY2U+CisKKyMgRGVmaW5lIHRvcC1sZXZlbCBlbnRyeQorZG46IGRjPW15Y29tcGFueSxkYz1jb20KK29iamVjdENsYXNzOiBkY09iamVjdAorZGM6bXljb21wYW55CisKKyMgRGVmaW5lIGFuIGVudHJ5IHRvIGNvbnRhaW4gcGVvcGxlCisjIHNlYXJjaGVzIGZvciB1c2VycyBhcmUgYmFzZWQgb24gdGhpcyBlbnRyeQorZG46IG91PXBlb3BsZSxkYz1teWNvbXBhbnksZGM9Y29tCitvYmplY3RDbGFzczogb3JnYW5pemF0aW9uYWxVbml0CitvdTogcGVvcGxlCisKKyMgRGVmaW5lIGEgdXNlciBlbnRyeSBmb3IgSmFuZXQgSm9uZXMKK2RuOiB1aWQ9ampvbmVzLG91PXBlb3BsZSxkYz1teWNvbXBhbnksZGM9Y29tCitvYmplY3RDbGFzczogaW5ldE9yZ1BlcnNvbgordWlkOiBqam9uZXMKK3NuOiBqb25lcworY246IGphbmV0IGpvbmVzCittYWlsOiBqLmpvbmVzQG15Y29tcGFueS5jb20KK3VzZXJQYXNzd29yZDogamFuZXQKKworIyBEZWZpbmUgYSB1c2VyIGVudHJ5IGZvciBGcmVkIEJsb2dncworZG46IHVpZD1mYmxvZ2dzLG91PXBlb3BsZSxkYz1teWNvbXBhbnksZGM9Y29tCitvYmplY3RDbGFzczogaW5ldE9yZ1BlcnNvbgordWlkOiBmYmxvZ2dzCitzbjogYmxvZ2dzCitjbjogZnJlZCBibG9nZ3MKK21haWw6IGYuYmxvZ2dzQG15Y29tcGFueS5jb20KK3VzZXJQYXNzd29yZDogZnJlZAorCisjIERlZmluZSBhbiBlbnRyeSB0byBjb250YWluIExEQVAgZ3JvdXBzCisjIHNlYXJjaGVzIGZvciByb2xlcyBhcmUgYmFzZWQgb24gdGhpcyBlbnRyeQorZG46IG91PWdyb3VwcyxkYz1teWNvbXBhbnksZGM9Y29tCitvYmplY3RDbGFzczogb3JnYW5pemF0aW9uYWxVbml0CitvdTogZ3JvdXBzCisKKyMgRGVmaW5lIGFuIGVudHJ5IGZvciB0aGUgInRvbWNhdCIgcm9sZQorZG46IGNuPXRvbWNhdCxvdT1ncm91cHMsZGM9bXljb21wYW55LGRjPWNvbQorb2JqZWN0Q2xhc3M6IGdyb3VwT2ZVbmlxdWVOYW1lcworY246IHRvbWNhdAordW5pcXVlTWVtYmVyOiB1aWQ9ampvbmVzLG91PXBlb3BsZSxkYz1teWNvbXBhbnksZGM9Y29tCit1bmlxdWVNZW1iZXI6IHVpZD1mYmxvZ2dzLG91PXBlb3BsZSxkYz1teWNvbXBhbnksZGM9Y29tCisKKyMgRGVmaW5lIGFuIGVudHJ5IGZvciB0aGUgInJvbGUxIiByb2xlCitkbjogY249cm9sZTEsb3U9Z3JvdXBzLGRjPW15Y29tcGFueSxkYz1jb20KK29iamVjdENsYXNzOiBncm91cE9mVW5pcXVlTmFtZXMKK2NuOiByb2xlMQordW5pcXVlTWVtYmVyOiB1aWQ9ZmJsb2dncyxvdT1wZW9wbGUsZGM9bXljb21wYW55LGRjPWNvbQorPC9zb3VyY2U+CisKKzxwPkFuIGV4YW1wbGUgPGNvZGU+UmVhbG08L2NvZGU+IGVsZW1lbnQgZm9yIHRoZSBPcGVuTERBUCBkaXJlY3RvcnkKK3NlcnZlciBjb25maWd1cmVkIGFzIGRlc2NyaWJlZCBhYm92ZSBtaWdodCBsb29rIGxpa2UgdGhpcywgYXNzdW1pbmcKK3RoYXQgdXNlcnMgdXNlIHRoZWlyIHVpZCAoZS5nLiBqam9uZXMpIHRvIGxvZ2luIHRvIHRoZQorYXBwbGljYXRpb24gYW5kIHRoYXQgYW4gYW5vbnltb3VzIGNvbm5lY3Rpb24gaXMgc3VmZmljaWVudCB0byBzZWFyY2gKK3RoZSBkaXJlY3RvcnkgYW5kIHJldHJpZXZlIHJvbGUgaW5mb3JtYXRpb246PC9wPgorCis8c291cmNlPgorJmx0O1JlYWxtICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpORElSZWFsbSIgZGVidWc9Ijk5IgorICAgICBjb25uZWN0aW9uVVJMPSJsZGFwOi8vbG9jYWxob3N0OjM4OSIKKyAgICAgICB1c2VyUGF0dGVybj0idWlkPXswfSxvdT1wZW9wbGUsZGM9bXljb21wYW55LGRjPWNvbSIKKyAgICAgICAgICByb2xlQmFzZT0ib3U9Z3JvdXBzLGRjPW15Y29tcGFueSxkYz1jb20iCisgICAgICAgICAgcm9sZU5hbWU9ImNuIgorICAgICAgICByb2xlU2VhcmNoPSIodW5pcXVlTWVtYmVyPXswfSkiCisvJmd0OworPC9zb3VyY2U+CisKKzxwPldpdGggdGhpcyBjb25maWd1cmF0aW9uLCB0aGUgcmVhbG0gd2lsbCBkZXRlcm1pbmUgdGhlIHVzZXIncworZGlzdGluZ3Vpc2hlZCBuYW1lIGJ5IHN1YnN0aXR1dGluZyB0aGUgdXNlcm5hbWUgaW50byB0aGUKKzxjb2RlPnVzZXJQYXR0ZXJuPC9jb2RlPiwgYXV0aGVudGljYXRlIGJ5IGJpbmRpbmcgdG8gdGhlIGRpcmVjdG9yeQord2l0aCB0aGlzIEROIGFuZCB0aGUgcGFzc3dvcmQgcmVjZWl2ZWQgZnJvbSB0aGUgdXNlciwgYW5kIHNlYXJjaCB0aGUKK2RpcmVjdG9yeSB0byBmaW5kIHRoZSB1c2VyJ3Mgcm9sZXMuPC9wPgorCis8cD5Ob3cgc3VwcG9zZSB0aGF0IHVzZXJzIGFyZSBleHBlY3RlZCB0byBlbnRlciB0aGVpciBlbWFpbCBhZGRyZXNzCityYXRoZXIgdGhhbiB0aGVpciB1c2VyaWQgd2hlbiBsb2dnaW5nIGluLiBJbiB0aGlzIGNhc2UgdGhlIHJlYWxtIG11c3QKK3NlYXJjaCB0aGUgZGlyZWN0b3J5IGZvciB0aGUgdXNlcidzIGVudHJ5LiAoQSBzZWFyY2ggaXMgYWxzbyBuZWNlc3NhcnkKK3doZW4gdXNlciBlbnRyaWVzIGFyZSBoZWxkIGluIG11bHRpcGxlIHN1YnRyZWVzIGNvcnJlc3BvbmRpbmcgcGVyaGFwcwordG8gZGlmZmVyZW50IG9yZ2FuaXphdGlvbmFsIHVuaXRzIG9yIGNvbXBhbnkgbG9jYXRpb25zKS48L3A+CisKKzxwPkZ1cnRoZXIsIHN1cHBvc2UgdGhhdCBpbiBhZGRpdGlvbiB0byB0aGUgZ3JvdXAgZW50cmllcyB5b3Ugd2FudCB0bwordXNlIGFuIGF0dHJpYnV0ZSBvZiB0aGUgdXNlcidzIGVudHJ5IHRvIGhvbGQgcm9sZXMuIE5vdyB0aGUgZW50cnkgZm9yCitKYW5ldCBKb25lcyBtaWdodCByZWFkIGFzIGZvbGxvd3M6PC9wPgorCis8c291cmNlPgorZG46IHVpZD1qam9uZXMsb3U9cGVvcGxlLGRjPW15Y29tcGFueSxkYz1jb20KK29iamVjdENsYXNzOiBpbmV0T3JnUGVyc29uCit1aWQ6IGpqb25lcworc246IGpvbmVzCitjbjogamFuZXQgam9uZXMKK21haWw6IGouam9uZXNAbXljb21wYW55LmNvbQorbWVtYmVyT2Y6IHJvbGUyCittZW1iZXJPZjogcm9sZTMKK3VzZXJQYXNzd29yZDogamFuZXQKKzwvc291cmNlPgorCis8cD4gVGhpcyByZWFsbSBjb25maWd1cmF0aW9uIHdvdWxkIHNhdGlzZnkgdGhlIG5ldyByZXF1aXJlbWVudHM6PC9wPgorCis8c291cmNlPgorJmx0O1JlYWxtICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpORElSZWFsbSIgZGVidWc9Ijk5IgorICAgICBjb25uZWN0aW9uVVJMPSJsZGFwOi8vbG9jYWxob3N0OjM4OSIKKyAgICAgICAgICB1c2VyQmFzZT0ib3U9cGVvcGxlLGRjPW15Y29tcGFueSxkYz1jb20iCisgICAgICAgIHVzZXJTZWFyY2g9IihtYWlsPXswfSkiCisgICAgICB1c2VyUm9sZU5hbWU9Im1lbWJlck9mIgorICAgICAgICAgIHJvbGVCYXNlPSJvdT1ncm91cHMsZGM9bXljb21wYW55LGRjPWNvbSIKKyAgICAgICAgICByb2xlTmFtZT0iY24iCisgICAgICAgIHJvbGVTZWFyY2g9Iih1bmlxdWVNZW1iZXI9ezB9KSIKKy8mZ3Q7Cis8L3NvdXJjZT4KKworPHA+Tm93IHdoZW4gSmFuZXQgSm9uZXMgbG9ncyBpbiBhcyAiai5qb25lc0BteWNvbXBhbnkuY29tIiwgdGhlIHJlYWxtCitzZWFyY2hlcyB0aGUgZGlyZWN0b3J5IGZvciBhIHVuaXF1ZSBlbnRyeSB3aXRoIHRoYXQgdmFsdWUgYXMgaXRzIG1haWwKK2F0dHJpYnV0ZSBhbmQgYXR0ZW1wdHMgdG8gYmluZCB0byB0aGUgZGlyZWN0b3J5IGFzCis8Y29kZT51aWQ9ampvbmVzLG91PXBlb3BsZSxkYz1teWNvbXBhbnksZGM9Y29tPC9jb2RlPiB3aXRoIHRoZSBnaXZlbgorcGFzc3dvcmQuIElmIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRzLCBzaGUgaXMgYXNzaWduZWQgdGhyZWUgcm9sZXM6Cisicm9sZTIiIGFuZCAicm9sZTMiLCB0aGUgdmFsdWVzIG9mIHRoZSAibWVtYmVyT2YiIGF0dHJpYnV0ZSBpbiBoZXIKK2RpcmVjdG9yeSBlbnRyeSwgYW5kICJ0b21jYXQiLCB0aGUgdmFsdWUgb2YgdGhlICJjbiIgYXR0cmlidXRlIGluIHRoZQorb25seSBncm91cCBlbnRyeSBvZiB3aGljaCBzaGUgaXMgYSBtZW1iZXIuPC9wPgorCis8cD5GaW5hbGx5LCB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIgYnkgcmV0cmlldmluZwordGhlIHBhc3N3b3JkIGZyb20gdGhlIGRpcmVjdG9yeSBhbmQgbWFraW5nIGEgbG9jYWwgY29tcGFyaXNvbiBpbiB0aGUKK3JlYWxtLCB5b3UgbWlnaHQgdXNlIGEgcmVhbG0gY29uZmlndXJhdGlvbiBsaWtlIHRoaXM6PC9wPgorCis8c291cmNlPgorJmx0O1JlYWxtICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpORElSZWFsbSIgZGVidWc9Ijk5IgorICAgIGNvbm5lY3Rpb25OYW1lPSJjbj1NYW5hZ2VyLGRjPW15Y29tcGFueSxkYz1jb20iCitjb25uZWN0aW9uUGFzc3dvcmQ9InNlY3JldCIKKyAgICAgY29ubmVjdGlvblVSTD0ibGRhcDovL2xvY2FsaG9zdDozODkiCisgICAgICB1c2VyUGFzc3dvcmQ9InVzZXJQYXNzd29yZCIKKyAgICAgICB1c2VyUGF0dGVybj0idWlkPXswfSxvdT1wZW9wbGUsZGM9bXljb21wYW55LGRjPWNvbSIKKyAgICAgICAgICByb2xlQmFzZT0ib3U9Z3JvdXBzLGRjPW15Y29tcGFueSxkYz1jb20iCisgICAgICAgICAgcm9sZU5hbWU9ImNuIgorICAgICAgICByb2xlU2VhcmNoPSIodW5pcXVlTWVtYmVyPXswfSkiCisvJmd0OworPC9zb3VyY2U+CisKKzxwPkhvd2V2ZXIsIGFzIGRpc2N1c3NlZCBhYm92ZSwgdGhlIGRlZmF1bHQgYmluZCBtb2RlIGZvcgorYXV0aGVudGljYXRpb24gaXMgdXN1YWxseSB0byBiZSBwcmVmZXJyZWQuPC9wPgorCis8aDM+QWRkaXRpb25hbCBOb3RlczwvaDM+CisKKzxwPkpORElSZWFsbSBvcGVyYXRlcyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBydWxlczo8L3A+Cis8dWw+Cis8bGk+V2hlbiBhIHVzZXIgYXR0ZW1wdHMgdG8gYWNjZXNzIGEgcHJvdGVjdGVkIHJlc291cmNlIGZvciB0aGUgZmlyc3QgdGltZSwKKyAgICBUb21jYXQgNSB3aWxsIGNhbGwgdGhlIDxjb2RlPmF1dGhlbnRpY2F0ZSgpPC9jb2RlPiBtZXRob2Qgb2YgdGhpcworICAgIDxjb2RlPlJlYWxtPC9jb2RlPi4gIFRodXMsIGFueSBjaGFuZ2VzIHlvdSBoYXZlIG1hZGUgdG8gdGhlIGRpcmVjdG9yeQorICAgIChuZXcgdXNlcnMsIGNoYW5nZWQgcGFzc3dvcmRzIG9yIHJvbGVzLCBldGMuKSB3aWxsIGJlIGltbWVkaWF0ZWx5CisgICAgcmVmbGVjdGVkLjwvbGk+Cis8bGk+T25jZSBhIHVzZXIgaGFzIGJlZW4gYXV0aGVudGljYXRlZCwgdGhlIHVzZXIgKGFuZCBoaXMgb3IgaGVyIGFzc29jaWF0ZWQKKyAgICByb2xlcykgYXJlIGNhY2hlZCB3aXRoaW4gVG9tY2F0IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHVzZXIncyBsb2dpbi4KKyAgICAoRm9yIEZPUk0tYmFzZWQgYXV0aGVudGljYXRpb24sIHRoYXQgbWVhbnMgdW50aWwgdGhlIHNlc3Npb24gdGltZXMgb3V0IG9yCisgICAgaXMgaW52YWxpZGF0ZWQ7IGZvciBCQVNJQyBhdXRoZW50aWNhdGlvbiwgdGhhdCBtZWFucyB1bnRpbCB0aGUgdXNlcgorICAgIGNsb3NlcyB0aGVpciBicm93c2VyKS4gIFRoZSBjYWNoZWQgdXNlciBpcyA8c3Ryb25nPm5vdDwvc3Ryb25nPiBzYXZlZCBhbmQKKyAgICByZXN0b3JlZCBhY3Jvc3Mgc2Vzc2lvbnMgc2VyaWFsaXNhdGlvbnMuIEFueSBjaGFuZ2VzIHRvIHRoZSBkaXJlY3RvcnkKKyAgICBpbmZvcm1hdGlvbiBmb3IgYW4gYWxyZWFkeSBhdXRoZW50aWNhdGVkIHVzZXIgd2lsbCA8c3Ryb25nPm5vdDwvc3Ryb25nPiBiZQorICAgIHJlZmxlY3RlZCB1bnRpbCB0aGUgbmV4dCB0aW1lIHRoYXQgdXNlciBsb2dzIG9uIGFnYWluLjwvbGk+Cis8bGk+QWRtaW5pc3RlcmluZyB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGRpcmVjdG9yeSBzZXJ2ZXIKKyAgICBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgeW91ciBvd24gYXBwbGljYXRpb25zLiAgVG9tY2F0IGRvZXMgbm90CisgICAgcHJvdmlkZSBhbnkgYnVpbHQtaW4gY2FwYWJpbGl0aWVzIHRvIG1haW50YWluIHVzZXJzIGFuZCByb2xlcy48L2xpPgorPC91bD4KKworPC9zdWJzZWN0aW9uPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9Ik1lbW9yeVJlYWxtIj4KKworPGgzPkludHJvZHVjdGlvbjwvaDM+CisKKzxwPjxzdHJvbmc+TWVtb3J5UmVhbG08L3N0cm9uZz4gaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKK1RvbWNhdCA1IDxjb2RlPlJlYWxtPC9jb2RlPiBpbnRlcmZhY2UuICBJdCBpcyBub3QgZGVzaWduZWQgZm9yIHByb2R1Y3Rpb24gdXNlLgorQXQgc3RhcnR1cCB0aW1lLCBNZW1vcnlSZWFsbSBsb2FkcyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgdXNlcnMsIGFuZCB0aGVpcgorY29ycmVzcG9uZGluZyByb2xlcywgZnJvbSBhbiBYTUwgZG9jdW1lbnQgKGJ5IGRlZmF1bHQsIHRoaXMgZG9jdW1lbnQgaXMgbG9hZGVkIGZyb20gPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi90b21jYXQtdXNlcnMueG1sPC9jb2RlPikuICBDaGFuZ2VzIHRvIHRoZSBkYXRhCitpbiB0aGlzIGZpbGUgYXJlIG5vdCByZWNvZ25pemVkIHVudGlsIFRvbWNhdCBpcyByZXN0YXJ0ZWQuPC9wPgorCis8aDM+UmVhbG0gRWxlbWVudCBBdHRyaWJ1dGVzPC9oMz4KKworPHA+VG8gY29uZmlndXJlIGEgTWVtb3J5UmVhbG0sIHlvdSBtdXN0IGNyZWF0ZSBhIDxjb2RlPiZsdDtSZWFsbSZndDs8L2NvZGU+CitlbGVtZW50IGFuZCBuZXN0IGl0IGluIHlvdXIgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBmaWxlLAorYXMgZGVzY3JpYmVkIDxhIGhyZWY9IiNDb25maWd1cmluZyBhIFJlYWxtIj5hYm92ZTwvYT4uICBUaGUgYXR0cmlidXRlcyBzdXBwb3J0ZWQKK2J5IHRoaXMgUmVhbG0gYXJlIGxpc3RlZCBpbiB0aGUgPGEgaHJlZj0iY29uZmlnL3JlYWxtLmh0bWwiPlJlYWxtIGNvbmZpZ3VyYXRpb24KK2RvY3VtZW50YXRpb248L2E+LjwvcD4KKworPGgzPlVzZXIgRmlsZSBGb3JtYXQ8L2gzPgorCis8cD5UaGUgdXNlcnMgZmlsZSAoYnkgZGVmYXVsdCwgPGNvZGU+Y29uZi90b21jYXQtdXNlcnMueG1sPC9jb2RlPiBtdXN0IGJlIGFuCitYTUwgZG9jdW1lbnQsIHdpdGggYSByb290IGVsZW1lbnQgPGNvZGU+Jmx0O3RvbWNhdC11c2VycyZndDs8L2NvZGU+LiAgTmVzdGVkCitpbnNpZGUgdGhlIHJvb3QgZWxlbWVudCB3aWxsIGJlIGEgPGNvZGU+Jmx0O3VzZXImZ3Q7PC9jb2RlPiBlbGVtZW50IGZvciBlYWNoCit2YWxpZCB1c2VyLCBjb25zaXN0aW5nIG9mIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+Cis8dWw+Cis8bGk+PHN0cm9uZz5uYW1lPC9zdHJvbmc+IC0gVXNlcm5hbWUgdGhpcyB1c2VyIG11c3QgbG9nIG9uIHdpdGguPC9saT4KKzxsaT48c3Ryb25nPnBhc3N3b3JkPC9zdHJvbmc+IC0gUGFzc3dvcmQgdGhpcyB1c2VyIG11c3QgbG9nIG9uIHdpdGggKGluCisgICAgY2xlYXIgdGV4dCBpZiB0aGUgPGNvZGU+ZGlnZXN0PC9jb2RlPiBhdHRyaWJ1dGUgd2FzIG5vdCBzZXQgb24gdGhlCisgICAgPGNvZGU+Jmx0O1JlYWxtJmd0OzwvY29kZT4gZWxlbWVudCwgb3IgZGlnZXN0ZWQgYXBwcm9wcmlhdGVseSBhcworICAgIGRlc2NyaWJlZCA8YSBocmVmPSIjRGlnZXN0ZWQgUGFzc3dvcmRzIj5oZXJlPC9hPiBvdGhlcndpc2UpLjwvbGk+Cis8bGk+PHN0cm9uZz5yb2xlczwvc3Ryb25nPiAtIENvbW1hLWRlbGltaXRlZCBsaXN0IG9mIHRoZSByb2xlIG5hbWVzCisgICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdXNlci48L2xpPgorPC91bD4KKworPGgzPkV4YW1wbGU8L2gzPgorCis8cD5UaGUgZGVmYXVsdCBjb250ZW50cyBvZiB0aGUKKzxjb2RlPmNvbmYvdG9tY2F0LXVzZXJzLnhtbDwvY29kZT4gZmlsZSBpczo8L3A+Cis8c291cmNlPgorJmx0O3RvbWNhdC11c2VycyZndDsKKyAgJmx0O3VzZXIgbmFtZT0idG9tY2F0IiBwYXNzd29yZD0idG9tY2F0IiByb2xlcz0idG9tY2F0IiAvJmd0OworICAmbHQ7dXNlciBuYW1lPSJyb2xlMSIgIHBhc3N3b3JkPSJ0b21jYXQiIHJvbGVzPSJyb2xlMSIgIC8mZ3Q7CisgICZsdDt1c2VyIG5hbWU9ImJvdGgiICAgcGFzc3dvcmQ9InRvbWNhdCIgcm9sZXM9InRvbWNhdCxyb2xlMSIgLyZndDsKKyZsdDsvdG9tY2F0LXVzZXJzJmd0OworPC9zb3VyY2U+CisKKzxoMz5BZGRpdGlvbmFsIE5vdGVzPC9oMz4KKworPHA+TWVtb3J5UmVhbG0gb3BlcmF0ZXMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcnVsZXM6PC9wPgorPHVsPgorPGxpPldoZW4gVG9tY2F0IGZpcnN0IHN0YXJ0cyB1cCwgaXQgbG9hZHMgYWxsIGRlZmluZWQgdXNlcnMgYW5kIHRoZWlyCisgICAgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB1c2VycyBmaWxlLiAgQ2hhbmdlcyB0byB0aGUgZGF0YSBpbgorICAgIHRoaXMgZmlsZSB3aWxsIDxzdHJvbmc+bm90PC9zdHJvbmc+IGJlIHJlY29nbml6ZWQgdW50aWwgVG9tY2F0IGlzCisgICAgcmVzdGFydGVkLjwvbGk+Cis8bGk+V2hlbiBhIHVzZXIgYXR0ZW1wdHMgdG8gYWNjZXNzIGEgcHJvdGVjdGVkIHJlc291cmNlIGZvciB0aGUgZmlyc3QgdGltZSwKKyAgICBUb21jYXQgNSB3aWxsIGNhbGwgdGhlIDxjb2RlPmF1dGhlbnRpY2F0ZSgpPC9jb2RlPiBtZXRob2Qgb2YgdGhpcworICAgIDxjb2RlPlJlYWxtPC9jb2RlPi48L2xpPgorPGxpPk9uY2UgYSB1c2VyIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQsIHRoZSB1c2VyIChhbmQgaGlzIG9yIGhlciBhc3NvY2lhdGVkCisgICAgcm9sZXMpIGFyZSBjYWNoZWQgd2l0aGluIFRvbWNhdCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB1c2VyJ3MgbG9naW4uCisgICAgKEZvciBGT1JNLWJhc2VkIGF1dGhlbnRpY2F0aW9uLCB0aGF0IG1lYW5zIHVudGlsIHRoZSBzZXNzaW9uIHRpbWVzIG91dCBvcgorICAgIGlzIGludmFsaWRhdGVkOyBmb3IgQkFTSUMgYXV0aGVudGljYXRpb24sIHRoYXQgbWVhbnMgdW50aWwgdGhlIHVzZXIKKyAgICBjbG9zZXMgdGhlaXIgYnJvd3NlcikuICBUaGUgY2FjaGVkIHVzZXIgaXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gc2F2ZWQgYW5kCisgICAgcmVzdG9yZWQgYWNyb3NzIHNlc3Npb25zIHNlcmlhbGlzYXRpb25zLjwvbGk+Cis8bGk+QWRtaW5pc3RlcmluZyB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHVzZXJzIGZpbGUgaXMgdGhlIHJlc3BvbnNpYmlsaXR5CisgICAgb2YgeW91ciBhcHBsaWNhdGlvbi4gIFRvbWNhdCBkb2VzIG5vdAorICAgIHByb3ZpZGUgYW55IGJ1aWx0LWluIGNhcGFiaWxpdGllcyB0byBtYWludGFpbiB1c2VycyBhbmQgcm9sZXMuPC9saT4KKzwvdWw+CisKKzwvc3Vic2VjdGlvbj4KKworCis8c3Vic2VjdGlvbiBuYW1lPSJVc2VyRGF0YWJhc2VSZWFsbSI+CisKKzxoMz5JbnRyb2R1Y3Rpb248L2gzPgorCis8cD48c3Ryb25nPlVzZXJEYXRhYmFzZVJlYWxtPC9zdHJvbmc+IGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZQorVG9tY2F0IDxjb2RlPlJlYWxtPC9jb2RlPiBpbnRlcmZhY2UuIEluZm9ybWF0aW9uIGFib3V0IGFsbCB1c2VycywgYW5kIHRoZWlyCitjb3JyZXNwb25kaW5nIHJvbGVzLCBpcyBvYnRhaW5lZCBmcm9tIGEgSk5ESSByZXNvdXJjZSB0aGF0IGltcGxlbWVudHMgdGhlCis8Y29kZT5Vc2VyRGF0YWJhc2U8L2NvZGU+IGludGVyZmFjZS48L3A+CisKKzxoMz5SZWFsbSBFbGVtZW50IEF0dHJpYnV0ZXM8L2gzPgorCis8cD5UbyBjb25maWd1cmUgYSBVc2VyRGF0YWJhc2VSZWFsbSwgeW91IG11c3QgY3JlYXRlIGEgPGNvZGU+Jmx0O1JlYWxtJmd0OzwvY29kZT4KK2VsZW1lbnQgYW5kIG5lc3QgaXQgaW4geW91ciA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3NlcnZlci54bWw8L2NvZGU+IGZpbGUsCithcyBkZXNjcmliZWQgPGEgaHJlZj0iI0NvbmZpZ3VyaW5nIGEgUmVhbG0iPmFib3ZlPC9hPi4gIFRoZSBhdHRyaWJ1dGVzIHN1cHBvcnRlZAorYnkgdGhpcyBSZWFsbSBhcmUgbGlzdGVkIGluIHRoZSA8YSBocmVmPSJjb25maWcvcmVhbG0uaHRtbCI+UmVhbG0gY29uZmlndXJhdGlvbgorZG9jdW1lbnRhdGlvbjwvYT4uPC9wPgorCis8aDM+RXhhbXBsZTwvaDM+CisKKzxwPlRoZSBkZWZhdWx0IGluc3RhbGxhdGlvbiBvZiBUb21jYXQgNSBpcyBjb25maWd1cmVkIHdpdGggYQorVXNlckRhdGFiYXNlUmVhbG0gbmVzdGVkIGluc2lkZSB0aGUgPGNvZGU+Jmx0O0VuZ2luZSZndDs8L2NvZGU+IGVsZW1lbnQsIHNvIHRoYXQKK2l0IGFwcGxpZXMgdG8gYWxsIHZpcnR1YWwgaG9zdHMgYW5kIHdlYiBhcHBsaWNhdGlvbnMuIFRoaXMgcmVhbG0gdXNlcyB0aGUKK3NhbWUgPGNvZGU+dG9tY2F0LXVzZXJzLnhtbDwvY29kZT4gYXMgdGhlIE1lbW9yeVJlYWxtLjwvcD4KKworPC9zdWJzZWN0aW9uPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9IkpBQVNSZWFsbSI+CisKKzxoMz5JbnRyb2R1Y3Rpb248L2gzPgorCisgICAgICAgIDxwPjxzdHJvbmc+SkFBU1JlYWxtPC9zdHJvbmc+IGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUb21jYXQKKzQgPGNvZGU+UmVhbG08L2NvZGU+IGludGVyZmFjZSB0aGF0IGF1dGhlbnRpY2F0ZXMgdXNlcnMgdGhyb3VnaCB0aGUgSmF2YQorQXV0aGVudGljYXRpb24gJmFtcDsgQXV0aG9yaXphdGlvbiBTZXJ2aWNlIChKQUFTKSBmcmFtZXdvcmssIGEgSmF2YQorcGFja2FnZSB0aGF0IGlzIGF2YWlsYWJsZSBhcyBhbiBvcHRpb25hbCBwYWNrYWdlIGluIEphdmEgMiBTREsgMS4zIGFuZAoraXMgZnVsbHkgaW50ZWdyYXRlZCBhcyBvZiBTREsgMS40IC48L3A+CisgICAgICAgIDxwPlVzaW5nIEpBQVNSZWFsbSBnaXZlcyB0aGUgZGV2ZWxvcGVyIHRoZSBhYmlsaXR5IHRvIGNvbWJpbmUKK3ByYWN0aWNhbGx5IGFueSBjb25jZWl2YWJsZSBzZWN1cml0eSByZWFsbSB3aXRoIFRvbWNhdCdzIENNQS4gPC9wPgorICAgICAgICA8cD5KQUFTUmVhbG0gaXMgcHJvdG90eXBlIGZvciBUb21jYXQgb2YgdGhlIHByb3Bvc2VkIEpBQVMtYmFzZWQKK0oyRUUgYXV0aGVudGljYXRpb24gZnJhbWV3b3JrIGZvciBKMkVFIHYxLjQsIGJhc2VkIG9uIHRoZSA8YQorIGhyZWY9Imh0dHA6Ly93d3cuamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTE5NiI+SkNQIFNwZWNpZmljYXRpb24KK1JlcXVlc3QgMTk2PC9hPiB0byBlbmhhbmNlIGNvbnRhaW5lci1tYW5hZ2VkIHNlY3VyaXR5IGFuZCBwcm9tb3RlCisncGx1Z2dhYmxlJyBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHdob3NlIGltcGxlbWVudGF0aW9ucyB3b3VsZCBiZQorY29udGFpbmVyLWluZGVwZW5kZW50LgorICAgICAgICA8L3A+CisgICAgICAgIDxwPkJhc2VkIG9uIHRoZSBKQUFTIGxvZ2luIG1vZHVsZSBhbmQgcHJpbmNpcGFsIChzZWUgPGNvZGU+amF2YXguc2VjdXJpdHkuYXV0aC5zcGkuTG9naW5Nb2R1bGU8L2NvZGU+CithbmQgPGNvZGU+amF2YXguc2VjdXJpdHkuUHJpbmNpcGFsPC9jb2RlPiksIHlvdSBjYW4gZGV2ZWxvcCB5b3VyIG93bgorc2VjdXJpdHkgbWVjaGFuaXNtIG9yIHdyYXAgYW5vdGhlciB0aGlyZC1wYXJ0eSBtZWNoYW5pc20gZm9yCitpbnRlZ3JhdGlvbiB3aXRoIHRoZSBDTUEgYXMgaW1wbGVtZW50ZWQgYnkgVG9tY2F0LgorICAgICAgICA8L3A+CisKKyAgICAgICAgPGgzPlF1aWNrIFN0YXJ0PC9oMz4KKyAgICAgICAgPHA+VG8gc2V0IHVwIFRvbWNhdCB0byB1c2UgSkFBU1JlYWxtIHdpdGggeW91ciBvd24gSkFBUyBsb2dpbiBtb2R1bGUsCisgeW91IHdpbGwgbmVlZCB0byBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgorICAgICAgICA8b2w+CisgICAgICAgICAgPGxpPldyaXRlIHlvdXIgb3duIExvZ2luTW9kdWxlLCBVc2VyIGFuZCBSb2xlIGNsYXNzZXMgYmFzZWQKK29uIEpBQVMgKHNlZSAKKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2d1aWRlL3NlY3VyaXR5L2phYXMvdHV0b3JpYWxzL0dlbmVyYWxBY25Pbmx5Lmh0bWwiPnRoZQorSkFBUyBBdXRoZW50aWNhdGlvbiBUdXRvcmlhbDwvYT4gYW5kIAorPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvZ3VpZGUvc2VjdXJpdHkvamFhcy9KQUFTTE1EZXZHdWlkZS5odG1sIj50aGUgSkFBUyBMb2dpbiBNb2R1bGUgCitEZXZlbG9wZXIncyBHdWlkZTwvYT4pIHRvIGJlIG1hbmFnZWQgYnkgdGhlIEpBQVMgTG9naW4KK0NvbnRleHQgKDxjb2RlPmphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uTG9naW5Db250ZXh0PC9jb2RlPikKK1doZW4gZGV2ZWxvcGluZyB5b3VyIExvZ2luTW9kdWxlLCBub3RlIHRoYXQgSkFBU1JlYWxtJ3MgYnVpbHQtaW4gPGNvZGU+Q2FsbGJhY2tIYW5kbGVyPC9jb2RlPgorK29ubHkgcmVjb2duaXplcyB0aGUgPGNvZGU+TmFtZUNhbGxiYWNrPC9jb2RlPiBhbmQgPGNvZGU+UGFzc3dvcmRDYWxsYmFjazwvY29kZT4gYXQgcHJlc2VudC4KKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5BbHRob3VnaCBub3Qgc3BlY2lmaWVkIGluIEpBQVMsIHlvdSBzaG91bGQgY3JlYXRlCitzZXBlcmF0ZSBjbGFzc2VzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdXNlcnMgYW5kIHJvbGVzLCBleHRlbmRpbmcgPGNvZGU+amF2YXguc2VjdXJpdHkuUHJpbmNpcGFsPC9jb2RlPiwKK3NvIHRoYXQgVG9tY2F0IGNhbiB0ZWxsIHdoaWNoIFByaW5jaXBhbHMgcmV0dXJuZWQgZnJvbSB5b3VyIGxvZ2luCittb2R1bGUgYXJlIHVzZXJzIGFuZCB3aGljaCBhcmUgcm9sZXMgKHNlZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpBQVNSZWFsbTwvY29kZT4pLgorUmVnYXJkbGVzcywgdGhlIGZpcnN0IFByaW5jaXBhbCByZXR1cm5lZCBpcyA8ZW0+YWx3YXlzPC9lbT4gdHJlYXRlZCBhcyB0aGUgdXNlciBQcmluY2lwYWwuCisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+UGxhY2UgdGhlIGNvbXBpbGVkIGNsYXNzZXMgb24gVG9tY2F0J3MgY2xhc3NwYXRoCisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+U2V0IHVwIGEgbG9naW4uY29uZmlnIGZpbGUgZm9yIEphdmEgKHNlZSA8YQorIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2d1aWRlL3NlY3VyaXR5L2phYXMvdHV0b3JpYWxzL0xvZ2luQ29uZmlnRmlsZS5odG1sIj5KQUFTCitMb2dpbkNvbmZpZyBmaWxlPC9hPikgYW5kIHRlbGwgVG9tY2F0IHdoZXJlIHRvIGZpbmQgaXQgYnkgc3BlY2lmeWluZworaXRzIGxvY2F0aW9uIHRvIHRoZSBKVk0sIGZvciBpbnN0YW5jZSBieSBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudAordmFyaWFibGU6IDxjb2RlPkpBVkFfT1BUUz0tREpBVkFfT1BUUz0tRGphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWc9PSRDQVRBTElOQV9IT01FL2NvbmYvamFhcy5jb25maWc8L2NvZGU+PC9saT4KKworICAgICAgICAgIDxsaT5Db25maWd1cmUgeW91ciBzZWN1cml0eS1jb25zdHJhaW50cyBpbiB5b3VyIHdlYi54bWwgZm9yCit0aGUgcmVzb3VyY2VzIHlvdSB3YW50IHRvIHByb3RlY3Q8L2xpPgorICAgICAgICAgIDxsaT5Db25maWd1cmUgdGhlIEpBQVNSZWFsbSBtb2R1bGUgaW4geW91ciBzZXJ2ZXIueG1sIDwvbGk+CisgICAgICAgICAgPGxpPlJlc3RhcnQgVG9tY2F0IDUgaWYgaXQgaXMgYWxyZWFkeSBydW5uaW5nLjwvbGk+CisgICAgICAgIDwvb2w+CisKKworPGgzPlJlYWxtIEVsZW1lbnQgQXR0cmlidXRlczwvaDM+CisKKzxwPlRvIGNvbmZpZ3VyZSBhIEpBQVNSZWFsbSwgeW91IG11c3QgY3JlYXRlIGEgPGNvZGU+Jmx0O1JlYWxtJmd0OzwvY29kZT4KK2VsZW1lbnQgYW5kIG5lc3QgaXQgaW4geW91ciA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3NlcnZlci54bWw8L2NvZGU+IGZpbGUsCithcyBkZXNjcmliZWQgPGEgaHJlZj0iI0NvbmZpZ3VyaW5nIGEgUmVhbG0iPmFib3ZlPC9hPi4gIFRoZSBhdHRyaWJ1dGVzIHN1cHBvcnRlZAorYnkgdGhpcyBSZWFsbSBhcmUgbGlzdGVkIGluIHRoZSA8YSBocmVmPSJjb25maWcvcmVhbG0uaHRtbCI+UmVhbG0gY29uZmlndXJhdGlvbgorZG9jdW1lbnRhdGlvbjwvYT4uPC9wPgorCis8aDM+RXhhbXBsZTwvaDM+CisKKzxwPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBob3cgeW91ciBzZXJ2ZXIueG1sIHNuaXBwZXQgc2hvdWxkIGxvb2suPC9wPgorCis8c291cmNlPgorJmx0O1JlYWxtIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KQUFTUmVhbG0iICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBhcHBOYW1lPSJNeUZvb1JlYWxtIiAgICAgICAKKyAgICB1c2VyQ2xhc3NOYW1lcz0ib3JnLmZvb2Jhci5yZWFsbS5Gb29Vc2VyIiAgICAgICAKKyAgICAgcm9sZUNsYXNzTmFtZXM9Im9yZy5mb29iYXIucmVhbG0uRm9vUm9sZSIgCisgICAgICAgICAgICAgICAgICAgICAgZGVidWc9Ijk5Ii8mZ3Q7Cis8L3NvdXJjZT4KKworPHA+SXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHlvdXIgbG9naW4gbW9kdWxlIHRvIGNyZWF0ZSBhbmQgc2F2ZSBVc2VyIGFuZCAKK1JvbGUgb2JqZWN0cyByZXByZXNlbnRpbmcgUHJpbmNpcGFscyBmb3IgdGhlIHVzZXIgCisoPGNvZGU+amF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0PC9jb2RlPikuIElmIHlvdXIgbG9naW4gbW9kdWxlIGRvZXNuJ3QgCitjcmVhdGUgYSB1c2VyIG9iamVjdCBidXQgYWxzbyBkb2Vzbid0IHRocm93IGEgbG9naW4gZXhjZXB0aW9uLCB0aGVuIHRoZSAKK1RvbWNhdCBDTUEgd2lsbCBicmVhayBhbmQgeW91IHdpbGwgYmUgbGVmdCBhdCB0aGUgCitodHRwOi8vbG9jYWxob3N0OjgwODAvbXlhcHAval9zZWN1cml0eV9jaGVjayBVUkkgb3IgYXQgc29tZSBvdGhlciAKK3Vuc3BlY2lmaWVkIGxvY2F0aW9uLjwvcD4KKworICAgICAgICA8cD5UaGUgZmxleGliaWxpdHkgb2YgdGhlIEpBQVMgYXBwcm9hY2ggaXMgdHdvLWZvbGQ6IDwvcD4KKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT55b3UgY2FuIGNhcnJ5IG91dCB3aGF0ZXZlciBwcm9jZXNzaW5nIHlvdSByZXF1aXJlIGJlaGluZAordGhlIHNjZW5lcyBpbiB5b3VyIG93biBsb2dpbiBtb2R1bGUuPC9saT4KKyAgICAgICAgICA8bGk+eW91IGNhbiBwbHVnIGluIGEgY29tcGxldGVseSBkaWZmZXJlbnQgTG9naW5Nb2R1bGUgYnkgY2hhbmdpbmcgdGhlIGNvbmZpZ3VyYXRpb24gCithbmQgcmVzdGFydGluZyB0aGUgc2VydmVyLCB3aXRob3V0IGFueSBjb2RlIGNoYW5nZXMgdG8geW91ciBhcHBsaWNhdGlvbi48L2xpPgorICAgICAgICA8L3VsPgorCisgICAgICAgIDxoMz5BZGRpdGlvbmFsIE5vdGVzPC9oMz4KKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT5XaGVuIGEgdXNlciBhdHRlbXB0cyB0byBhY2Nlc3MgYSBwcm90ZWN0ZWQgcmVzb3VyY2UgZm9yCisgICAgICAgICAgICAgIHRoZSBmaXJzdCB0aW1lLCBUb21jYXQgNSB3aWxsIGNhbGwgdGhlIDxjb2RlPmF1dGhlbnRpY2F0ZSgpPC9jb2RlPgorICAgICAgICAgICAgICBtZXRob2Qgb2YgdGhpcyA8Y29kZT5SZWFsbTwvY29kZT4uICBUaHVzLCBhbnkgY2hhbmdlcyB5b3UgaGF2ZSBtYWRlIGluCisgICAgICAgICAgICAgIHRoZSBzZWN1cml0eSBtZWNoYW5pc20gZGlyZWN0bHkgKG5ldyB1c2VycywgY2hhbmdlZCBwYXNzd29yZHMgb3IKKyAgICAgICAgICAgICAgcm9sZXMsIGV0Yy4pIHdpbGwgYmUgaW1tZWRpYXRlbHkgcmVmbGVjdGVkLjwvbGk+CisgICAgICAgICAgPGxpPk9uY2UgYSB1c2VyIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQsIHRoZSB1c2VyIChhbmQgaGlzIG9yCisgICAgICAgICAgICAgIGhlciBhc3NvY2lhdGVkIHJvbGVzKSBhcmUgY2FjaGVkIHdpdGhpbiBUb21jYXQgZm9yIHRoZSBkdXJhdGlvbiBvZgorICAgICAgICAgICAgICB0aGUgdXNlcidzIGxvZ2luLiAgRm9yIEZPUk0tYmFzZWQgYXV0aGVudGljYXRpb24sIHRoYXQgbWVhbnMgdW50aWwKKyAgICAgICAgICAgICAgdGhlIHNlc3Npb24gdGltZXMgb3V0IG9yIGlzIGludmFsaWRhdGVkOyBmb3IgQkFTSUMgYXV0aGVudGljYXRpb24sCisgICAgICAgICAgICAgIHRoYXQgbWVhbnMgdW50aWwgdGhlIHVzZXIgY2xvc2VzIHRoZWlyIGJyb3dzZXIuICBBbnkgY2hhbmdlcyB0byB0aGUKKyAgICAgICAgICAgICAgc2VjdXJpdHkgaW5mb3JtYXRpb24gZm9yIGFuIGFscmVhZHkgYXV0aGVudGljYXRlZCB1c2VyIHdpbGwgPHN0cm9uZz5ub3Q8L3N0cm9uZz4KKyAgICAgICAgICAgICAgYmUgcmVmbGVjdGVkIHVudGlsIHRoZSBuZXh0IHRpbWUgdGhhdCB1c2VyIGxvZ3Mgb24gYWdhaW4uPC9saT4KKyAgICAgICAgICA8bGk+QXMgd2l0aCBvdGhlciA8Y29kZT5SZWFsbTwvY29kZT4gaW1wbGVtZW50YXRpb25zLCBkaWdlc3RlZCBwYXNzd29yZHMKKyAgICAgICAgICAgICAgYXJlIHN1cHBvcnRlZCBpZiB0aGUgPGNvZGU+Jmx0O1JlYWxtJmd0OzwvY29kZT4gZWxlbWVudCBpbiA8Y29kZT5zZXJ2ZXIueG1sPC9jb2RlPgorICAgICAgICAgICAgICBjb250YWlucyBhIDxjb2RlPmRpZ2VzdDwvY29kZT4gYXR0cmlidXRlOyBKQUFTUmVhbG0ncyA8Y29kZT5DYWxsYmFja0hhbmRsZXI8L2NvZGU+CisgICAgICAgICAgICAgIHdpbGwgZGlnZXN0IHRoZSBwYXNzd29yZCBwcmlvciB0byBwYXNzaW5nIGl0IGJhY2sgdG8gdGhlIDxjb2RlPkxvZ2luTW9kdWxlPC9jb2RlPjwvbGk+ICAKKyAgICAgICAgPC91bD4KKworPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9zZWN1cml0eS1tYW5hZ2VyLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvc2VjdXJpdHktbWFuYWdlci1ob3d0by54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlZmIwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvc2VjdXJpdHktbWFuYWdlci1ob3d0by54bWwKQEAgLTAsMCArMSwzODMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJzZWN1cml0eS1tYW5hZ2VyLWhvd3RvLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0iZ2xlbm5Adm95YWdlci5hcGcubW9yZS5uZXQiPkdsZW5uIE5pZWxzZW48L2F1dGhvcj4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0iamVhbmZyYW5jb2lzLmFyY2FuZEBzdW4uY29tIj5KZWFuLUZyYW5jb2lzIEFyY2FuZDwvYXV0aG9yPgorICAgICAgICA8dGl0bGU+U2VjdXJpdHkgTWFuYWdlciBIT1ctVE88L3RpdGxlPgorICAgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iQmFja2dyb3VuZCI+CisKKyAgPHA+VGhlIEphdmEgPHN0cm9uZz5TZWN1cml0eU1hbmFnZXI8L3N0cm9uZz4gaXMgd2hhdCBhbGxvd3MgYSB3ZWIgYnJvd3NlcgorICB0byBydW4gYW4gYXBwbGV0IGluIGl0cyBvd24gc2FuZGJveCB0byBwcmV2ZW50IHVudHJ1c3RlZCBjb2RlIGZyb20KKyAgYWNjZXNzaW5nIGZpbGVzIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSwgY29ubmVjdGluZyB0byBhIGhvc3Qgb3RoZXIKKyAgdGhhbiB0aGUgb25lIHRoZSBhcHBsZXQgd2FzIGxvYWRlZCBmcm9tLCBhbmQgc28gb24uICBJbiB0aGUgc2FtZSB3YXkKKyAgdGhlIFNlY3VyaXR5TWFuYWdlciBwcm90ZWN0cyB5b3UgZnJvbSBhbiB1bnRydXN0ZWQgYXBwbGV0IHJ1bm5pbmcgaW4KKyAgeW91ciBicm93c2VyLCB1c2Ugb2YgYSBTZWN1cml0eU1hbmFnZXIgd2hpbGUgcnVubmluZyBUb21jYXQgY2FuIHByb3RlY3QKKyAgeW91ciBzZXJ2ZXIgZnJvbSB0cm9qYW4gc2VydmxldHMsIEpTUHMsIEpTUCBiZWFucywgYW5kIHRhZyBsaWJyYXJpZXMuCisgIE9yIGV2ZW4gaW5hZHZlcnRlbnQgbWlzdGFrZXMuPC9wPgorCisgIDxwPkltYWdpbmUgaWYgc29tZW9uZSB3aG8gaXMgYXV0aG9yaXplZCB0byBwdWJsaXNoIEpTUHMgb24geW91ciBzaXRlCisgIGluYWR2ZXJ0ZW50bHkgaW5jbHVkZWQgdGhlIGZvbGxvd2luZyBpbiB0aGVpciBKU1A6PC9wPgorPHNvdXJjZT4KKyZsdDslIFN5c3RlbS5leGl0KDEpOyAlJmd0OworPC9zb3VyY2U+CisKKyAgPHA+RXZlcnkgdGltZSB0aGlzIEpTUCB3YXMgZXhlY3V0ZWQgYnkgVG9tY2F0LCBUb21jYXQgd291bGQgZXhpdC4KKyAgVXNpbmcgdGhlIEphdmEgU2VjdXJpdHlNYW5hZ2VyIGlzIGp1c3Qgb25lIG1vcmUgbGluZSBvZiBkZWZlbnNlIGEKKyAgc3lzdGVtIGFkbWluaXN0cmF0b3IgY2FuIHVzZSB0byBrZWVwIHRoZSBzZXJ2ZXIgc2VjdXJlIGFuZCByZWxpYWJsZS48L3A+CisKKyAgPHA+PHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+IC0gQSBzZWN1cml0eSBhdWRpdAorICBoYXZlIGJlZW4gY29uZHVjdGVkIHVzaW5nIHRoZSBUb21jYXQgNSBjb2RlYmFzZS4gTW9zdCBvZiB0aGUgY3JpdGljYWwKKyAgcGFja2FnZSBoYXZlIGJlZW4gcHJvdGVjdGVkIGFuZCBhIG5ldyBzZWN1cml0eSBwYWNrYWdlIHByb3RlY3Rpb24gbWVjaGFuaXNtIAorICBoYXMgYmVlbiBpbXBsZW1lbnRlZC4gU3RpbGwsIG1ha2Ugc3VyZSB0aGF0IHlvdSBhcmUgc2F0aXNmaWVkIHdpdGggeW91ciBTZWN1cml0eU1hbmFnZXIgCisgIGNvbmZpZ3VyYXRpb24gYmVmb3JlIGFsbG93aW5nIHVudHJ1c3RlZCB1c2VycyB0byBwdWJsaXNoIHdlYiBhcHBsaWNhdGlvbnMsIAorICBKU1BzLCBzZXJ2bGV0cywgYmVhbnMsIG9yIHRhZyBsaWJyYXJpZXMuICA8c3Ryb25nPkhvd2V2ZXIsIHJ1bm5pbmcgd2l0aCBhIAorICBTZWN1cml0eU1hbmFnZXIgaXMgZGVmaW5pdGVseSBiZXR0ZXIgdGhhbiBydW5uaW5nIHdpdGhvdXQgb25lLjwvc3Ryb25nPjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlBlcm1pc3Npb25zIj4KKworICA8cD5QZXJtaXNzaW9uIGNsYXNzZXMgYXJlIHVzZWQgdG8gZGVmaW5lIHdoYXQgUGVybWlzc2lvbnMgYSBjbGFzcyBsb2FkZWQKKyAgYnkgVG9tY2F0IHdpbGwgaGF2ZS4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiBQZXJtaXNzaW9uIGNsYXNzZXMgdGhhdCBhcmUKKyAgYSBzdGFuZGFyZCBwYXJ0IG9mIHRoZSBKREssIGFuZCB5b3UgY2FuIGNyZWF0ZSB5b3VyIG93biBQZXJtaXNzaW9uIGNsYXNzCisgIGZvciB1c2UgaW4geW91ciBvd24gd2ViIGFwcGxpY2F0aW9ucy4gIEJvdGggdGVjaG5pcXVlcyBhcmUgdXNlZCBpbgorICBUb21jYXQgNS48L3A+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBQZXJtaXNzaW9ucyI+CisKKyAgICA8cD5UaGlzIGlzIGp1c3QgYSBzaG9ydCBzdW1tYXJ5IG9mIHRoZSBzdGFuZGFyZCBzeXN0ZW0gU2VjdXJpdHlNYW5hZ2VyCisgICAgUGVybWlzc2lvbiBjbGFzc2VzIGFwcGxpY2FibGUgdG8gVG9tY2F0LiAgU2VlCisgICAgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9zZWN1cml0eS8iPmh0dHA6Ly9qYXZhLnN1bi5jb20vc2VjdXJpdHkvPC9hPgorICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KKworICAgIDx1bD4KKyAgICA8bGk+PHN0cm9uZz5qYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uPC9zdHJvbmc+IC0gQ29udHJvbHMgcmVhZC93cml0ZQorICAgICAgICBhY2Nlc3MgdG8gSlZNIHByb3BlcnRpZXMgc3VjaCBhcyA8Y29kZT5qYXZhLmhvbWU8L2NvZGU+LjwvbGk+CisgICAgPGxpPjxzdHJvbmc+amF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uPC9zdHJvbmc+IC0gQ29udHJvbHMgdXNlIG9mCisgICAgICAgIHNvbWUgU3lzdGVtL1J1bnRpbWUgZnVuY3Rpb25zIGxpa2UgPGNvZGU+ZXhpdCgpPC9jb2RlPiBhbmQKKyAgICAgICAgPGNvZGU+ZXhlYygpPC9jb2RlPi4gQWxzbyBjb250cm9sIHRoZSBwYWNrYWdlIGFjY2Vzcy9kZWZpbml0aW9uLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+amF2YS5pby5GaWxlUGVybWlzc2lvbjwvc3Ryb25nPiAtIENvbnRyb2xzIHJlYWQvd3JpdGUvZXhlY3V0ZQorICAgICAgICBhY2Nlc3MgdG8gZmlsZXMgYW5kIGRpcmVjdG9yaWVzLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+amF2YS5uZXQuU29ja2V0UGVybWlzc2lvbjwvc3Ryb25nPiAtIENvbnRyb2xzIHVzZSBvZgorICAgICAgICBuZXR3b3JrIHNvY2tldHMuPC9saT4KKyAgICA8bGk+PHN0cm9uZz5qYXZhLm5ldC5OZXRQZXJtaXNzaW9uPC9zdHJvbmc+IC0gQ29udHJvbHMgdXNlIG9mCisgICAgICAgIG11bHRpY2FzdCBuZXR3b3JrIGNvbm5lY3Rpb25zLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+amF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb248L3N0cm9uZz4gLSBDb250cm9scworICAgICAgICB1c2Ugb2YgcmVmbGVjdGlvbiB0byBkbyBjbGFzcyBpbnRyb3NwZWN0aW9uLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+amF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb248L3N0cm9uZz4gLSBDb250cm9scyBhY2Nlc3MKKyAgICAgICAgdG8gU2VjdXJpdHkgbWV0aG9kcy48L2xpPgorICAgIDxsaT48c3Ryb25nPmphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjwvc3Ryb25nPiAtIEFsbG93cyBhY2Nlc3MgdG8gYWxsCisgICAgICAgIHBlcm1pc3Npb25zLCBqdXN0IGFzIGlmIHlvdSB3ZXJlIHJ1bm5pbmcgVG9tY2F0IHdpdGhvdXQgYQorICAgICAgICBTZWN1cml0eU1hbmFnZXIuPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlRvbWNhdCBDdXN0b20gUGVybWlzc2lvbnMiPgorCisgICAgPHA+VG9tY2F0IHV0aWxpemVzIGEgY3VzdG9tIHBlcm1pc3Npb24gY2xhc3MgY2FsbGVkCisgICAgPHN0cm9uZz5vcmcuYXBhY2hlLm5hbWluZy5KbmRpUGVybWlzc2lvbjwvc3Ryb25nPi4gIFRoaXMgcGVybWlzc2lvbgorICAgIGNvbnRyb2xzIHJlYWQgYWNjZXNzIHRvIEpOREkgbmFtZWQgZmlsZSBiYXNlZCByZXNvdXJjZXMuICBUaGUgcGVybWlzc2lvbgorICAgIG5hbWUgaXMgdGhlIEpOREkgbmFtZSBhbmQgdGhlcmUgYXJlIG5vIGFjdGlvbnMuICBBIHRyYWlsaW5nICIqIiBjYW4gYmUKKyAgICB1c2VkIHRvIGRvIHdpbGQgY2FyZCBtYXRjaGluZyBmb3IgYSBKTkRJIG5hbWVkIGZpbGUgcmVzb3VyY2Ugd2hlbgorICAgIGdyYW50aW5nIHBlcm1pc3Npb24uICBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGluY2x1ZGUgdGhlIGZvbGxvd2luZworICAgIGluIHlvdXIgcG9saWN5IGZpbGU6PC9wPgorPHNvdXJjZT4KK3Blcm1pc3Npb24gIG9yZy5hcGFjaGUubmFtaW5nLkpuZGlQZXJtaXNzaW9uICAiam5kaTovL2xvY2FsaG9zdC9leGFtcGxlcy8qIjsKKzwvc291cmNlPgorCisgICAgPHA+QSBQZXJtaXNzaW9uIGVudHJ5IGxpa2UgdGhpcyBpcyBnZW5lcmF0ZWQgZHluYW1pY2FsbHkgZm9yIGVhY2ggd2ViCisgICAgYXBwbGljYXRpb24gdGhhdCBpcyBkZXBsb3llZCwgdG8gYWxsb3cgaXQgdG8gcmVhZCBpdHMgb3duIHN0YXRpYyByZXNvdXJjZXMKKyAgICBidXQgZGlzYWxsb3cgaXQgZnJvbSB1c2luZyBmaWxlIGFjY2VzcyB0byByZWFkIGFueSBvdGhlciBmaWxlcyAodW5sZXNzCisgICAgcGVybWlzc2lvbnMgZm9yIHRob3NlIGZpbGVzIGFyZSBleHBsaWNpdGx5IGdyYW50ZWQpLjwvcD4KKworICAgIDxwPkFsc28sIFRvbWNhdCBhbHdheXMgZHluYW1pY2FsbHkgY3JlYXRlcyB0aGUgZm9sbG93aW5nIGZpbGUgcGVybWlzc2lvbjo8L3A+Cis8c291cmNlPiAgCitwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIioqIHlvdXIgYXBwbGljYXRpb24gY29udGV4dCoqIiwgInJlYWQiOworPC9zb3VyY2U+ICAKKyAgICA8cD5XaGVyZSAqKnlvdXIgYXBwbGljYXRpb24gY29udGV4dCoqIGVxdWFscyB0aGUgZm9sZGVyKG9yIFdBUiBmaWxlKSB1bmRlciB3aGljaCAKKyAgICB5b3VyIGFwcGxpY2F0aW9uIGhhcyBiZWVuIGRlcGxveWVkLiA8L3A+ICAKKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkNvbmZpZ3VyaW5nIFRvbWNhdCBXaXRoIEEgU2VjdXJpdHlNYW5hZ2VyIj4KKworICA8aDM+UG9saWN5IEZpbGUgRm9ybWF0PC9oMz4KKworICA8cD5UaGUgc2VjdXJpdHkgcG9saWNpZXMgaW1wbGVtZW50ZWQgYnkgdGhlIEphdmEgU2VjdXJpdHlNYW5hZ2VyIGFyZQorICBjb25maWd1cmVkIGluIHRoZSA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL2NhdGFsaW5hLnBvbGljeTwvY29kZT4gZmlsZS4KKyAgVGhpcyBmaWxlIGNvbXBsZXRlbHkgcmVwbGFjZXMgdGhlIDxjb2RlPmphdmEucG9saWN5PC9jb2RlPiBmaWxlIHByZXNlbnQKKyAgaW4geW91ciBKREsgc3lzdGVtIGRpcmVjdG9yaWVzLiAgVGhlIDxjb2RlPmNhdGFsaW5hLnBvbGljeTwvY29kZT4gZmlsZQorICBjYW4gYmUgZWRpdGVkIGJ5IGhhbmQsIG9yIHlvdSBjYW4gdXNlIHRoZQorICA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjIvZG9jcy90b29sZG9jcy9zb2xhcmlzL3BvbGljeXRvb2wuaHRtbCI+cG9saWN5dG9vbDwvYT4KKyAgYXBwbGljYXRpb24gdGhhdCBjb21lcyB3aXRoIEphdmEgMS4yIG9yIGxhdGVyLjwvcD4KKworICA8cD5FbnRyaWVzIGluIHRoZSA8Y29kZT5jYXRhbGluYS5wb2xpY3k8L2NvZGU+IGZpbGUgdXNlIHRoZSBzdGFuZGFyZAorICA8Y29kZT5qYXZhLnBvbGljeTwvY29kZT4gZmlsZSBmb3JtYXQsIGFzIGZvbGxvd3M6PC9wPgorPHNvdXJjZT4KKy8vIEV4YW1wbGUgcG9saWN5IGZpbGUgZW50cnkKKworZ3JhbnQgW3NpZ25lZEJ5ICZsdDtzaWduZXImZ3Q7LF0gW2NvZGVCYXNlICZsdDtjb2RlIHNvdXJjZSZndDtdIHsKKyAgcGVybWlzc2lvbiAgJmx0O2NsYXNzJmd0OyAgWyZsdDtuYW1lJmd0OyBbLCAmbHQ7YWN0aW9uIGxpc3QmZ3Q7XV07Cit9OworPC9zb3VyY2U+CisKKyAgPHA+VGhlIDxzdHJvbmc+c2lnbmVkQnk8L3N0cm9uZz4gYW5kIDxzdHJvbmc+Y29kZUJhc2U8L3N0cm9uZz4gZW50cmllcyBhcmUKKyAgb3B0aW9uYWwgd2hlbiBncmFudGluZyBwZXJtaXNzaW9ucy4gIENvbW1lbnQgbGluZXMgYmVnaW4gd2l0aCAiLy8iIGFuZAorICBlbmQgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lLiAgVGhlIDxjb2RlPmNvZGVCYXNlPC9jb2RlPiBpcyBpbiB0aGUKKyAgZm9ybSBvZiBhIFVSTCwgYW5kIGZvciBhIGZpbGUgVVJMIGNhbiB1c2UgdGhlIDxjb2RlPiR7amF2YS5ob21lfTwvY29kZT4KKyAgYW5kIDxjb2RlPiR7Y2F0YWxpbmEuaG9tZX08L2NvZGU+IHByb3BlcnRpZXMgKHdoaWNoIGFyZSBleHBhbmRlZCBvdXQgdG8KKyAgdGhlIGRpcmVjdG9yeSBwYXRocyBkZWZpbmVkIGZvciB0aGVtIGJ5IHRoZSA8Y29kZT5KQVZBX0hPTUU8L2NvZGU+IGFuZAorICA8Y29kZT5DQVRBTElOQV9IT01FPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZXMpLjwvcD4KKworICA8aDM+VGhlIERlZmF1bHQgUG9saWN5IEZpbGU8L2gzPgorCisgIDxwPlRoZSBkZWZhdWx0IDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvY2F0YWxpbmEucG9saWN5PC9jb2RlPiBmaWxlCisgIGxvb2tzIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gY2F0YWxpbmEuY29yZXBvbGljeSAtIFNlY3VyaXR5IFBvbGljeSBQZXJtaXNzaW9ucyBmb3IgVG9tY2F0IDUKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYSBkZWZhdWx0IHNldCBvZiBzZWN1cml0eSBwb2xpY2llcyB0byBiZSBlbmZvcmNlZCAoYnkgdGhlCisvLyBKVk0pIHdoZW4gQ2F0YWxpbmEgaXMgZXhlY3V0ZWQgd2l0aCB0aGUgIi1zZWN1cml0eSIgb3B0aW9uLiAgSW4gYWRkaXRpb24KKy8vIHRvIHRoZSBwZXJtaXNzaW9ucyBncmFudGVkIGhlcmUsIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcmUKKy8vIGdyYW50ZWQgdG8gdGhlIGNvZGViYXNlIHNwZWNpZmljIHRvIGVhY2ggd2ViIGFwcGxpY2F0aW9uOgorLy8KKy8vICogUmVhZCBhY2Nlc3MgdG8gdGhlIGRvY3VtZW50IHJvb3QgZGlyZWN0b3J5CisvLworLy8gJElkJAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8vID09PT09PT09PT0gU1lTVEVNIENPREUgUEVSTUlTU0lPTlMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyBUaGVzZSBwZXJtaXNzaW9ucyBhcHBseSB0byBqYXZhYworZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtqYXZhLmhvbWV9L2xpYi8tIiB7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKworLy8gVGhlc2UgcGVybWlzc2lvbnMgYXBwbHkgdG8gYWxsIHNoYXJlZCBzeXN0ZW0gZXh0ZW5zaW9ucworZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtqYXZhLmhvbWV9L2pyZS9saWIvZXh0Ly0iIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyBUaGVzZSBwZXJtaXNzaW9ucyBhcHBseSB0byBqYXZhYyB3aGVuICR7amF2YS5ob21lXSBwb2ludHMgYXQgJEpBVkFfSE9NRS9qcmUKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7amF2YS5ob21lfS8uLi9saWIvLSIgeworICAgICAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKy8vIFRoZXNlIHBlcm1pc3Npb25zIGFwcGx5IHRvIGFsbCBzaGFyZWQgc3lzdGVtIGV4dGVuc2lvbnMgd2hlbgorLy8gJHtqYXZhLmhvbWV9IHBvaW50cyBhdCAkSkFWQV9IT01FL2pyZQorZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtqYXZhLmhvbWV9L2xpYi9leHQvLSIgeworICAgICAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKworLy8gPT09PT09PT09PSBDQVRBTElOQSBDT0RFIFBFUk1JU1NJT05TID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8vIFRoZXNlIHBlcm1pc3Npb25zIGFwcGx5IHRvIHRoZSBsYXVuY2hlciBjb2RlCitncmFudCBjb2RlQmFzZSAiZmlsZToke2NhdGFsaW5hLmhvbWV9L2Jpbi9jb21tb25zLWxhdW5jaGVyLmphciIgeworICAgICAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKy8vIFRoZXNlIHBlcm1pc3Npb25zIGFwcGx5IHRvIHRoZSBzZXJ2ZXIgc3RhcnR1cCBjb2RlCitncmFudCBjb2RlQmFzZSAiZmlsZToke2NhdGFsaW5hLmhvbWV9L2Jpbi9ib290c3RyYXAuamFyIiB7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKworLy8gVGhlc2UgcGVybWlzc2lvbnMgYXBwbHkgdG8gdGhlIHNlcnZsZXQgQVBJIGNsYXNzZXMKKy8vIGFuZCB0aG9zZSB0aGF0IGFyZSBzaGFyZWQgYWNyb3NzIGFsbCBjbGFzcyBsb2FkZXJzCisvLyBsb2NhdGVkIGluIHRoZSAiY29tbW9uIiBkaXJlY3RvcnkKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uLy0iIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyBUaGVzZSBwZXJtaXNzaW9ucyBhcHBseSB0byB0aGUgY29udGFpbmVyJ3MgY29yZSBjb2RlLCBwbHVzIGFueSBhZGRpdGlvbmFsCisvLyBsaWJyYXJpZXMgaW5zdGFsbGVkIGluIHRoZSAic2VydmVyIiBkaXJlY3RvcnkKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7Y2F0YWxpbmEuaG9tZX0vc2VydmVyLy0iIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyA9PT09PT09PT09IFdFQiBBUFBMSUNBVElPTiBQRVJNSVNTSU9OUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gVGhlc2UgcGVybWlzc2lvbnMgYXJlIGdyYW50ZWQgYnkgZGVmYXVsdCB0byBhbGwgd2ViIGFwcGxpY2F0aW9ucworLy8gSW4gYWRkaXRpb24sIGEgd2ViIGFwcGxpY2F0aW9uIHdpbGwgYmUgZ2l2ZW4gYSByZWFkIEZpbGVQZXJtaXNzaW9uCisvLyBhbmQgSm5kaVBlcm1pc3Npb24gZm9yIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW4gaXRzIGRvY3VtZW50IHJvb3QuCitncmFudCB7IAorICAgICAgICAvLyBSZXF1aXJlZCBmb3IgSk5ESSBsb29rdXAgb2YgbmFtZWQgSkRCQyBEYXRhU291cmNlJ3MgYW5kCisgICAgICAgIC8vIGphdmFtYWlsIG5hbWVkIE1pbWVQYXJ0IERhdGFTb3VyY2UgdXNlZCB0byBzZW5kIG1haWwKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLmhvbWUiLCAicmVhZCI7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS5uYW1pbmcuKiIsICJyZWFkIjsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZheC5zcWwuKiIsICJyZWFkIjsKKworICAgICAgICAvLyBPUyBTcGVjaWZpYyBwcm9wZXJ0aWVzIHRvIGFsbG93IHJlYWQgYWNjZXNzCisJcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJvcy5uYW1lIiwgInJlYWQiOworCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAib3MudmVyc2lvbiIsICJyZWFkIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIm9zLmFyY2giLCAicmVhZCI7CisJcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJmaWxlLnNlcGFyYXRvciIsICJyZWFkIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gInBhdGguc2VwYXJhdG9yIiwgInJlYWQiOworCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAibGluZS5zZXBhcmF0b3IiLCAicmVhZCI7CisKKyAgICAgICAgLy8gSlZNIHByb3BlcnRpZXMgdG8gYWxsb3cgcmVhZCBhY2Nlc3MKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnZlcnNpb24iLCAicmVhZCI7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52ZW5kb3IiLCAicmVhZCI7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52ZW5kb3IudXJsIiwgInJlYWQiOworICAgICAgICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEuY2xhc3MudmVyc2lvbiIsICJyZWFkIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEuc3BlY2lmaWNhdGlvbi52ZXJzaW9uIiwgInJlYWQiOworCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS5zcGVjaWZpY2F0aW9uLnZlbmRvciIsICJyZWFkIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEuc3BlY2lmaWNhdGlvbi5uYW1lIiwgInJlYWQiOworCisJcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnZtLnNwZWNpZmljYXRpb24udmVyc2lvbiIsICJyZWFkIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEudm0uc3BlY2lmaWNhdGlvbi52ZW5kb3IiLCAicmVhZCI7CisJcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnZtLnNwZWNpZmljYXRpb24ubmFtZSIsICJyZWFkIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEudm0udmVyc2lvbiIsICJyZWFkIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEudm0udmVuZG9yIiwgInJlYWQiOworCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52bS5uYW1lIiwgInJlYWQiOworCisgICAgICAgIC8vIFJlcXVpcmVkIGZvciBnZXR0aW5nIEJlYW5JbmZvCisgICAgICAgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NDbGFzc0luUGFja2FnZS5zdW4uYmVhbnMuKiI7CisKKyAgICAgICAgLy8gUmVxdWlyZWQgZm9yIE9wZW5KTVgKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImdldEF0dHJpYnV0ZSI7CisKKwkvLyBBbGxvdyByZWFkIG9mIEpBWFAgY29tcGxpYW50IFhNTCBwYXJzZXIgZGVidWcKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImpheHAuZGVidWciLCAicmVhZCI7Cit9OworCisKKy8vIFlvdSBjYW4gYXNzaWduIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgdG8gcGFydGljdWxhciB3ZWIgYXBwbGljYXRpb25zIGJ5CisvLyBhZGRpbmcgYWRkaXRpb25hbCAiZ3JhbnQiIGVudHJpZXMgaGVyZSwgYmFzZWQgb24gdGhlIGNvZGUgYmFzZSBmb3IgdGhhdAorLy8gYXBwbGljYXRpb24sIC9XRUItSU5GL2NsYXNzZXMvLCBvciAvV0VCLUlORi9saWIvIGphciBmaWxlcy4KKy8vCisvLyBEaWZmZXJlbnQgcGVybWlzc2lvbnMgY2FuIGJlIGdyYW50ZWQgdG8gSlNQIHBhZ2VzLCBjbGFzc2VzIGxvYWRlZCBmcm9tCisvLyB0aGUgL1dFQi1JTkYvY2xhc3Nlcy8gZGlyZWN0b3J5LCBhbGwgamFyIGZpbGVzIGluIHRoZSAvV0VCLUlORi9saWIvCisvLyBkaXJlY3RvcnksIG9yIGV2ZW4gdG8gaW5kaXZpZHVhbCBqYXIgZmlsZXMgaW4gdGhlIC9XRUItSU5GL2xpYi8gZGlyZWN0b3J5LgorLy8KKy8vIEZvciBpbnN0YW5jZSwgYXNzdW1lIHRoYXQgdGhlIHN0YW5kYXJkICJleGFtcGxlcyIgYXBwbGljYXRpb24KKy8vIGluY2x1ZGVkIGEgSkRCQyBkcml2ZXIgdGhhdCBuZWVkZWQgdG8gZXN0YWJsaXNoIGEgbmV0d29yayBjb25uZWN0aW9uIHRvIHRoZQorLy8gY29ycmVzcG9uZGluZyBkYXRhYmFzZSBhbmQgdXNlZCB0aGUgc2NyYXBlIHRhZ2xpYiB0byBnZXQgdGhlIHdlYXRoZXIgZnJvbQorLy8gdGhlIE5PQUEgd2ViIHNlcnZlci4gIFlvdSBtaWdodCBjcmVhdGUgYSAiZ3JhbnQiIGVudHJpZXMgbGlrZSB0aGlzOgorLy8KKy8vIFRoZSBwZXJtaXNzaW9ucyBncmFudGVkIHRvIHRoZSBjb250ZXh0IHJvb3QgZGlyZWN0b3J5IGFwcGx5IHRvIEpTUCBwYWdlcy4KKy8vIGdyYW50IGNvZGVCYXNlICJmaWxlOiR7Y2F0YWxpbmEuaG9tZX0vd2ViYXBwcy9leGFtcGxlcy8tIiB7CisvLyAgICAgIHBlcm1pc3Npb24gamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbiAiZGJob3N0Lm15Y29tcGFueS5jb206NTQzMiIsICJjb25uZWN0IjsKKy8vICAgICAgcGVybWlzc2lvbiBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uICIqLm5vYWEuZ292OjgwIiwgImNvbm5lY3QiOworLy8gfTsKKy8vCisvLyBUaGUgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byB0aGUgY29udGV4dCBXRUItSU5GL2NsYXNzZXMgZGlyZWN0b3J5CisvLyBncmFudCBjb2RlQmFzZSAiZmlsZToke2NhdGFsaW5hLmhvbWV9L3dlYmFwcHMvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzLy0iIHsKKy8vIH07CisvLworLy8gVGhlIHBlcm1pc3Npb24gZ3JhbnRlZCB0byB5b3VyIEpEQkMgZHJpdmVyCisvLyBncmFudCBjb2RlQmFzZSAiamFyOmZpbGU6JHtjYXRhbGluYS5ob21lfS93ZWJhcHBzL2V4YW1wbGVzL1dFQi1JTkYvbGliL2RyaXZlci5qYXIhLy0iIHsKKy8vICAgICAgcGVybWlzc2lvbiBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uICJkYmhvc3QubXljb21wYW55LmNvbTo1NDMyIiwgImNvbm5lY3QiOworLy8gfTsKKy8vIFRoZSBwZXJtaXNzaW9uIGdyYW50ZWQgdG8gdGhlIHNjcmFwZSB0YWdsaWIKKy8vIGdyYW50IGNvZGVCYXNlICJqYXI6ZmlsZToke2NhdGFsaW5hLmhvbWV9L3dlYmFwcHMvZXhhbXBsZXMvV0VCLUlORi9saWIvc2NyYXBlLmphciEvLSIgeworLy8gICAgICBwZXJtaXNzaW9uIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24gIioubm9hYS5nb3Y6ODAiLCAiY29ubmVjdCI7CisvLyB9OworPC9zb3VyY2U+CisKKyAgPGgzPlN0YXJ0aW5nIFRvbWNhdCBXaXRoIEEgU2VjdXJpdHlNYW5hZ2VyPC9oMz4KKworICA8cD5PbmNlIHlvdSBoYXZlIGNvbmZpZ3VyZWQgdGhlIDxjb2RlPmNhdGFsaW5hLnBvbGljeTwvY29kZT4gZmlsZSBmb3IgdXNlCisgIHdpdGggYSBTZWN1cml0eU1hbmFnZXIsIFRvbWNhdCBjYW4gYmUgc3RhcnRlZCB3aXRoIGEgU2VjdXJpdHlNYW5hZ2VyIGluCisgIHBsYWNlIGJ5IHVzaW5nIHRoZSAiLXNlY3VyaXR5IiBvcHRpb246PC9wPgorPHNvdXJjZT4KKyRDQVRBTElOQV9IT01FL2Jpbi9jYXRhbGluYS5zaCBzdGFydCAtc2VjdXJpdHkgICAgKFVuaXgpCislQ0FUQUxJTkFfSE9NRSVcYmluXGNhdGFsaW5hIHN0YXJ0IC1zZWN1cml0eSAgICAgIChXaW5kb3dzKQorPC9zb3VyY2U+CisKKzwvc2VjdGlvbj4KKzxzZWN0aW9uIG5hbWU9IkNvbmZpZ3VyaW5nIFBhY2thZ2UgUHJvdGVjdGlvbiBpbiBUb21jYXQiPgorICA8cD5TdGFydGluZyB3aXRoIFRvbWNhdCA1LCBpdCBpcyBub3cgcG9zc2libGUgdG8gY29uZmlndXJlIHdoaWNoIFRvbWNhdAorICBpbnRlcm5hbCBwYWNrYWdlIGFyZSBwcm90ZWN0ZWQgYWdhaW50cyBwYWNrYWdlIGRlZmluaXRpb24gYW5kIGFjY2Vzcy4gU2VlCisgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vc2VjdXJpdHkvc2VjY29kZWd1aWRlLmh0bWwiPgorICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20vc2VjdXJpdHkvc2VjY29kZWd1aWRlLmh0bWw8L2E+CisgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPiAgICAKKworICAKKyAgPHA+PHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+OiBCZSBhd2FyZSB0aGF0IHJlbW92aW5nIHRoZSBkZWZhdWx0IHBhY2thZ2UgcHJvdGVjdGlvbiAKKyAgY291bGQgcG9zc2libHkgb3BlbiBhIHNlY3VyaXR5IGhvbGU8L3A+CisKKyAgPGgzPlRoZSBEZWZhdWx0IFByb3BlcnRpZXMgRmlsZTwvaDM+CisKKyAgPHA+VGhlIGRlZmF1bHQgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9jYXRhbGluYS5wcm9wZXJ0aWVzPC9jb2RlPiBmaWxlCisgIGxvb2tzIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPiAgCisjCisjIExpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHBhY2thZ2VzIHRoYXQgc3RhcnQgd2l0aCBvciBlcXVhbCB0aGlzIHN0cmluZworIyB3aWxsIGNhdXNlIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuCisjIHBhc3NlZCB0byBjaGVja1BhY2thZ2VBY2Nlc3MgdW5sZXNzIHRoZQorIyBjb3JyZXNwb25kaW5nIFJ1bnRpbWVQZXJtaXNzaW9uICgiYWNjZXNzQ2xhc3NJblBhY2thZ2UuIitwYWNrYWdlKSBoYXMKKyMgYmVlbiBncmFudGVkLgorcGFja2FnZS5hY2Nlc3M9c3VuLixvcmcuYXBhY2hlLmNhdGFsaW5hLixvcmcuYXBhY2hlLmNveW90ZS4sb3JnLmFwYWNoZS50b21jYXQuLAorb3JnLmFwYWNoZS5qYXNwZXIuCisjCisjIExpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHBhY2thZ2VzIHRoYXQgc3RhcnQgd2l0aCBvciBlcXVhbCB0aGlzIHN0cmluZworIyB3aWxsIGNhdXNlIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuCisjIHBhc3NlZCB0byBjaGVja1BhY2thZ2VEZWZpbml0aW9uIHVubGVzcyB0aGUKKyMgY29ycmVzcG9uZGluZyBSdW50aW1lUGVybWlzc2lvbiAoImRlZmluZUNsYXNzSW5QYWNrYWdlLiIrcGFja2FnZSkgaGFzCisjIGJlZW4gZ3JhbnRlZC4KKyMKKyMgYnkgZGVmYXVsdCwgbm8gcGFja2FnZXMgYXJlIHJlc3RyaWN0ZWQgZm9yIGRlZmluaXRpb24sIGFuZCBub25lIG9mCisjIHRoZSBjbGFzcyBsb2FkZXJzIHN1cHBsaWVkIHdpdGggdGhlIEpESyBjYWxsIGNoZWNrUGFja2FnZURlZmluaXRpb24uCisjCitwYWNrYWdlLmRlZmluaXRpb249c3VuLixqYXZhLixvcmcuYXBhY2hlLmNhdGFsaW5hLixvcmcuYXBhY2hlLmNveW90ZS4sCitvcmcuYXBhY2hlLnRvbWNhdC4sb3JnLmFwYWNoZS5qYXNwZXIuCis8L3NvdXJjZT4KKyAgPHA+T25jZSB5b3UgaGF2ZSBjb25maWd1cmVkIHRoZSA8Y29kZT5jYXRhbGluYS5wcm9wZXJ0aWVzPC9jb2RlPiBmaWxlIGZvciB1c2UKKyAgd2l0aCBhIFNlY3VyaXR5TWFuYWdlciwgcmVtZW1iZXIgdG8gcmUtc3RhcnQgVG9tY2F0LjwvcD4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVHJvdWJsZXNob290aW5nIj4KKworICA8cD5JZiB5b3VyIHdlYiBhcHBsaWNhdGlvbiBhdHRlbXB0cyB0byBleGVjdXRlIGFuIG9wZXJhdGlvbiB0aGF0IGlzCisgIHByb2hpYml0ZWQgYnkgbGFjayBvZiBhIHJlcXVpcmVkIFBlcm1pc3Npb24sIGl0IHdpbGwgdGhyb3cgYW4KKyAgPGNvZGU+QWNjZXNzQ29udHJvTEV4Y2VwdGlvbjwvY29kZT4gb3IgYSA8Y29kZT5TZWN1cml0eUV4Y2VwdGlvbjwvY29kZT4KKyAgd2hlbiB0aGUgU2VjdXJpdHlNYW5hZ2VyIGRldGVjdHMgdGhlIHZpb2xhdGlvbi4gIERlYnVnZ2luZyB0aGUgcGVybWlzc2lvbgorICB0aGF0IGlzIG1pc3NpbmcgY2FuIGJlIGNoYWxsZW5naW5nLCBhbmQgb25lIG9wdGlvbiBpcyB0byB0dXJuIG9uIGRlYnVnCisgIG91dHB1dCBvZiBhbGwgc2VjdXJpdHkgZGVjaXNpb25zIHRoYXQgYXJlIG1hZGUgZHVyaW5nIGV4ZWN1dGlvbi4gIFRoaXMKKyAgaXMgZG9uZSBieSBzZXR0aW5nIGEgc3lzdGVtIHByb3BlcnR5IGJlZm9yZSBzdGFydGluZyBUb21jYXQuICBUaGUgZWFzaWVzdAorICB3YXkgdG8gZG8gdGhpcyBpcyB2aWEgdGhlIDxjb2RlPkNBVEFMSU5BX09QVFM8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlLgorICBFeGVjdXRlIHRoaXMgY29tbWFuZDo8L3A+Cis8c291cmNlPgorZXhwb3J0IENBVEFMSU5BX09QVFM9LURqYXZhLnNlY3VyaXR5LmRlYnVnPWFsbCAgICAoVW5peCkKK3NldCBDQVRBTElOQV9PUFRTPS1EamF2YS5zZWN1cml0eS5kZWJ1Zz1hbGwgICAgICAgKFdpbmRvd3MpCis8L3NvdXJjZT4KKworICA8cD5iZWZvcmUgc3RhcnRpbmcgVG9tY2F0LjwvcD4KKworICA8cD48c3Ryb25nPldBUk5JTkc8L3N0cm9uZz4gLSBUaGlzIHdpbGwgZ2VuZXJhdGUgPGVtPm1hbnkgbWVnYWJ5dGVzPC9lbT4KKyAgb2Ygb3V0cHV0ISAgSG93ZXZlciwgaXQgY2FuIGhlbHAgeW91IHRyYWNrIGRvd24gcHJvYmxlbXMgYnkgc2VhcmNoaW5nCisgIGZvciB0aGUgd29yZCAiRkFJTEVEIiBhbmQgZGV0ZXJtaW5pbmcgd2hpY2ggcGVybWlzc2lvbiB3YXMgYmVpbmcgY2hlY2tlZAorICBmb3IuICBTZWUgdGhlIEphdmEgc2VjdXJpdHkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBvcHRpb25zIHRoYXQgeW91IGNhbgorICBzcGVjaWZ5IGhlcmUgYXMgd2VsbC48L3A+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL3NldHVwLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvc2V0dXAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MjVkYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL3NldHVwLnhtbApAQCAtMCwwICsxLDEzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9InNldHVwLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9InJlbW1AYXBhY2hlLm9yZyI+UmVteSBNYXVjaGVyYXQ8L2F1dGhvcj4KKyAgICA8dGl0bGU+VG9tY2F0IFNldHVwPC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworICA8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorICAgIDxwPgorICAgICAgVGhpcyBkb2N1bWVudCBpbnRyb2R1Y2VzIHNldmVyYWwgd2F5cyB0byBzZXQgdXAgVG9tY2F0IGZvciBydW5uaW5nCisgICAgICBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zLiAgUGxlYXNlIG5vdGUgdGhhdCBzb21lIGFkdmFuY2VkIHNldHVwIGlzc3VlcworICAgICAgYXJlIG5vdCBjb3ZlcmVkIGhlcmU6IHRoZSBmdWxsIGRpc3RyaWJ1dGlvbiAoWklQIGZpbGUgb3IgdGFyYmFsbCkgCisgICAgICBpbmNsdWRlcyBhIGZpbGUgY2FsbGVkCisgICAgICBSVU5OSU5HLnR4dCB3aGljaCBkaXNjdXNzZXMgdGhlc2UgaXNzdWVzLiAgV2UgZW5jb3VyYWdlIHlvdSB0byByZWZlcgorICAgICAgdG8gaXQgaWYgdGhlIGluZm9ybWF0aW9uIGJlbG93IGRvZXMgbm90IGFuc3dlciBzb21lIG9mIHlvdXIgcXVlc3Rpb25zLgorICAgIDwvcD4KKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uIG5hbWU9IldpbmRvd3MiPgorCisgICAgPHA+CisgICAgICBJbnN0YWxsaW5nIFRvbWNhdCBvbiBXaW5kb3dzIGNhbiBiZSBkb25lIGVhc2lseSB1c2luZyB0aGUgV2luZG93cyAKKyAgICAgIGluc3RhbGxlci4gSXRzIGludGVyZmFjZSBhbmQgZnVuY3Rpb25hbGl0eSBpcyBzaW1pbGFyIHRvIG90aGVyIHdpemFyZAorICAgICAgYmFzZWQgaW5zdGFsbGVycywgd2l0aCBvbmx5IGEgZmV3IGl0ZW1zIG9mIGludGVyZXN0LgorICAgIDwvcD4KKworICAgIDxwPgorICAgICAgPHVsPgorICAgICAgICA8bGk+PHN0cm9uZz5JbnN0YWxsYXRpb24gYXMgYSBzZXJ2aWNlPC9zdHJvbmc+OiBUb21jYXQgd2lsbCBiZSAKKyAgICAgICAgICAgIGluc3RhbGxlZCBhcyBhIFdpbmRvd3MKKyAgICAgICAgICAgIE5ULzJrL1hQIHNlcnZpY2Ugbm8gbWF0dGVyIHdoYXQgc2V0dGluZyBpcyBzZWxlY3RlZC4gVXNpbmcgdGhlCisgICAgICAgICAgICBjaGVja2JveCBvbiB0aGUgY29tcG9uZW50IHBhZ2Ugc2V0cyB0aGUgc2VydmljZSBhcyAiYXV0byIKKyAgICAgICAgICAgIHN0YXJ0dXAsIHNvIHRoYXQgVG9tY2F0IGlzIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB3aGVuIFdpbmRvd3MKKyAgICAgICAgICAgIHN0YXJ0cy4gRm9yIG9wdGltYWwgc2VjdXJpdHksIHRoZSBzZXJ2aWNlIHNob3VsZCBiZSBydW4gYXMgYQorICAgICAgICAgICAgc2VwYXJhdGUgdXNlciwgd2l0aCByZWR1Y2VkIHBlcm1pc3Npb25zIChzZWUgdGhlIFdpbmRvd3MgU2VydmljZXMKKyAgICAgICAgICAgIGFkbWluaXN0cmF0aW9uIHRvb2wgYW5kIGl0cyBkb2N1bWVudGF0aW9uKS48L2xpPgorICAgICAgICA8bGk+PHN0cm9uZz5KYXZhIGxvY2F0aW9uPC9zdHJvbmc+OiBUaGUgaW5zdGFsbGVyIHdpbGwgdXNlIHRoZSByZWdpc3RyeQorICAgICAgICAgICAgb3IgdGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBkZXRlcm1pbmUgdGhlIGJhc2UgcGF0aAorICAgICAgICAgICAgb2YgYSBKMlNFIDUgSlJFLgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPjxzdHJvbmc+VHJheSBpY29uPC9zdHJvbmc+OiBXaGVuIFRvbWNhdCBpcyBydW4gYXMgYSBzZXJ2aWNlLCB0aGVyZQorICAgICAgICAgICAgd2lsbCBiZSBhIHRyYXkgaWNvbiB2aXNpYmxlLiAgTm90ZSB0aGF0CisgICAgICAgICAgICB3aGVuIGNob29zaW5nIHRvIHJ1biBUb21jYXQgYXQgdGhlIGVuZCBvZiBpbnN0YWxsYXRpb24sIHRoZSB0cmF5CisgICAgICAgICAgICBpY29uIHdpbGwgYmUgbG9hZGVkIGF0IHRoZSBzYW1lIHRpbWUuPC9saT4KKyAgICAgICAgPGxpPlJlZmVyIHRvIHRoZQorICAgICAgICAgICAgPGEgaHJlZj0id2luZG93cy1zZXJ2aWNlLWhvd3RvLmh0bWwiPldpbmRvd3MgU2VydmljZSBIT1ctVE88L2E+CisgICAgICAgICAgICBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIG1hbmFnZSBUb21jYXQgYXMgV2luZG93cyBOVCBzZXJ2aWNlLgorICAgICAgICAgICAgPC9saT4gICAgICAgICAgICAKKyAgICAgIDwvdWw+CisgICAgPC9wPgorCisgICAgPHA+VGhlIGluc3RhbGxlciB3aWxsIGNyZWF0ZSBzaG9ydGN1dHMgYWxsb3dpbmcgc3RhcnRpbmcgYW5kIGNvbmZpZ3VyaW5nIAorICAgICAgIFRvbWNhdC4gSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgVG9tY2F0IGFkbWluaXN0cmF0aW9uIHdlYiAKKyAgICAgICBhcHBsaWNhdGlvbiBjYW4gb25seSBiZSB1c2VkIHdoZW4gVG9tY2F0IGlzIHJ1bm5pbmcuPC9wPgorCisgICAgPHA+SWYgdXNpbmcgYSBKMlNFIDEuNCBKUkUsIHRoZSBjb21wYXRpYmlsaXR5IHBhY2thZ2UgbXVzdCBiZSBkb3dubG9hZGVkIGFuZAorICAgICAgIGV4cGFuZGVkIGluc2lkZSB0aGUgZm9sZGVyIHdoZXJlIFRvbWNhdCB3YXMgaW5zdGFsbGVkLjwvcD4KKworICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iVW5peCBkYWVtb24iPgorCisgICAgPHA+VG9tY2F0IGNhbiBiZSBydW4gYXMgYSBkYWVtb24gdXNpbmcgdGhlIGpzdmMgdG9vbCBmcm9tIHRoZSAKKyAgICAgICBjb21tb25zLWRhZW1vbiBwcm9qZWN0LiBTb3VyY2UgdGFyYmFsbHMgZm9yIGpzdmMgYXJlIGluY2x1ZGVkIHdpdGggdGhlCisgICAgICAgVG9tY2F0IGJpbmFyaWVzLCBhbmQgbmVlZCB0byBiZSBjb21waWxlZC4gQnVpbGRpbmcganN2YyByZXF1aXJlcworICAgICAgIGEgQyBBTlNJIGNvbXBpbGVyIChzdWNoIGFzIEdDQyksIEdOVSBBdXRvY29uZiwgYW5kIGEgSkRLLjwvcD4KKworICAgIDxwPkJlZm9yZSBydW5uaW5nIHRoZSBzY3JpcHQsIHRoZSA8Y29kZT5KQVZBX0hPTUU8L2NvZGU+IGVudmlyb25tZW50CisgICAgICAgdmFyaWFibGUgc2hvdWxkIGJlIHNldCB0byB0aGUgYmFzZSBwYXRoIG9mIHRoZSBKREsuIEFsdGVybmF0ZWx5LCB3aGVuCisgICAgICAgY2FsbGluZyB0aGUgPGNvZGU+Li9jb25maWd1cmU8L2NvZGU+IHNjcmlwdCwgdGhlIHBhdGggb2YgdGhlIEpESyBtYXkKKyAgICAgICBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIDxjb2RlPi0td2l0aC1qYXZhPC9jb2RlPiBwYXJhbWV0ZXIsIHN1Y2ggYXMKKyAgICAgICA8Y29kZT4uL2NvbmZpZ3VyZSAtLXdpdGgtamF2YT0vdXNyL2phdmE8L2NvZGU+LjwvcD4KKworICAgIDxwPlVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgc2hvdWxkIHJlc3VsdCBpbiBhIGNvbXBpbGVkIGpzdmMgYmluYXJ5LAorICAgICAgIGxvY2F0ZWQgaW4gdGhlIDxjb2RlPiRDQVRBTElOQV9IT01FL2JpbjwvY29kZT4gZm9sZGVyLiBUaGlzIGFzc3VtZXMKKyAgICAgICB0aGF0IEdOVSBUQVIgaXMgdXNlZCwgYW5kIHRoYXQgPGNvZGU+Q0FUQUxJTkFfSE9NRTwvY29kZT4gaXMgYW4gCisgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgcG9pbnRpbmcgdG8gdGhlIGJhc2UgcGF0aCBvZiB0aGUgVG9tY2F0IAorICAgICAgIGluc3RhbGxhdGlvbi48L3A+CisgIAorICAgIDxwPlBsZWFzZSBub3RlIHRoYXQgeW91IHNob3VsZCB1c2UgdGhlIEdOVSBtYWtlIChnbWFrZSkgaW5zdGVhZCBvZgorICAgICAgIHRoZSBuYXRpdmUgQlNEIG1ha2Ugb24gRnJlZUJTRCBzeXN0ZW1zLjwvcD4KKworCis8c291cmNlPgorICAgIGNkICRDQVRBTElOQV9IT01FL2JpbgorICAgIHRhciB4dmZ6IGpzdmMudGFyLmd6CisgICAgY2QganN2Yy1zcmMKKyAgICBhdXRvY29uZgorICAgIC4vY29uZmlndXJlCisgICAgbWFrZQorICAgIGNwIGpzdmMgLi4KKyAgICBjZCAuLgorPC9zb3VyY2U+CisKKyAgICA8cD5Ub21jYXQgY2FuIHRoZW4gYmUgcnVuIGFzIGEgZGFlbW9uIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMuPC9wPgorCis8c291cmNlPgorICAgIGNkICRDQVRBTElOQV9IT01FCisgICAgLi9iaW4vanN2YyAtRGphdmEuZW5kb3JzZWQuZGlycz0uL2NvbW1vbi9lbmRvcnNlZCAtY3AgLi9iaW4vYm9vdHN0cmFwLmphciBcCisgICAgICAgIC1vdXRmaWxlIC4vbG9ncy9jYXRhbGluYS5vdXQgLWVycmZpbGUgLi9sb2dzL2NhdGFsaW5hLmVyciBcCisgICAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAKKzwvc291cmNlPgorCisgICAgPHA+anN2YyBoYXMgb3RoZXIgdXNlZnVsIHBhcmFtZXRlcnMsIHN1Y2ggYXMgPGNvZGU+LXVzZXI8L2NvZGU+IHdoaWNoIAorICAgICAgIGNhdXNlcyBpdCB0byBzd2l0Y2ggdG8gYW5vdGhlciB1c2VyIGFmdGVyIHRoZSBkYWVtb24gaW5pdGlhbGl6YXRpb24gaXMKKyAgICAgICBjb21wbGV0ZS4gVGhpcyBhbGxvd3MsIGZvciBleGFtcGxlLCBydW5uaW5nIFRvbWNhdCBhcyBhIG5vbiBwcml2aWxlZ2VkCisgICAgICAgdXNlciB3aGlsZSBzdGlsbCBiZWluZyBhYmxlIHRvIHVzZSBwcml2aWxlZ2VkIHBvcnRzLiAKKyAgICAgICA8Y29kZT5qc3ZjIC0taGVscDwvY29kZT4gd2lsbCByZXR1cm4gdGhlIGZ1bGwganN2YyB1c2FnZSAKKyAgICAgICBpbmZvcm1hdGlvbi4gSW4gcGFydGljdWxhciwgdGhlIDxjb2RlPi1kZWJ1ZzwvY29kZT4gb3B0aW9uIGlzIHVzZWZ1bAorICAgICAgIHRvIGRlYnVnIGlzc3VlcyBydW5uaW5nIGpzdmMuPC9wPgorCisgICAgPHA+VGhlIGZpbGUgPGNvZGU+JENBVEFMSU5BX0hPTUUvYmluL2pzdmMvbmF0aXZlL3RvbWNhdC5zaDwvY29kZT4gY2FuIGJlIAorICAgICAgIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3Igc3RhcnRpbmcgVG9tY2F0IGF1dG9tYXRpY2FsbHkgYXQgYm9vdCB0aW1lIGZyb20gCisgICAgICAgPGNvZGU+L2V0Yy9pbml0LmQ8L2NvZGU+LiAgVGhlIGZpbGUgaXMgY3VycmVudGx5IHNldHVwIGZvciBydW5uaW5nIAorICAgICAgIFRvbWNhdCA0LjEueCwgc28gaXQgaXMgbmVjZXNzYXJ5IHRvIGVkaXQgaXQgYW5kIGNoYW5nZSB0aGUgY2xhc3NuYW1lIAorICAgICAgIGZyb20gPGNvZGU+Qm9vdHN0cmFwU2VydmljZTwvY29kZT4gdG8gPGNvZGU+Qm9vdHN0cmFwPC9jb2RlPi48L3A+CisKKyAgICA8cD5Ob3RlIHRoYXQgdGhlIENvbW1vbnMtRGFlbW9uIEpBUiBmaWxlIG11c3QgYmUgb24geW91ciBydW50aW1lIGNsYXNzcGF0aCAKKyAgICAgICB0byBydW4gVG9tY2F0IGluIHRoaXMgbWFubmVyLiAgVGhlIENvbW1vbnMtRGFlbW9uIEpBUiBmaWxlIGlzIGluIHRoZSBDbGFzcy1QYXRoIAorICAgICAgIGVudHJ5IG9mIHRoZSBib290c3RyYXAuamFyIG1hbmlmZXN0LCBidXQgaWYgeW91IGdldCBhIENsYXNzTm90Rm91bmRFeGNlcHRpb24gCisgICAgICAgb3IgYSBOb0NsYXNzRGVmRm91bmRFcnJvciBmb3IgYSBDb21tb25zLURhZW1vbiBjbGFzcywgYWRkIHRoZSBDb21tb25zLURhZW1vbiAKKyAgICAgICBKQVIgdG8gdGhlIC1jcCBhcmd1bWVudCB3aGVuIGxhdW5jaGluZyBqc3ZjLjwvcD4gCisKKyAgPC9zZWN0aW9uPgorCis8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9zc2ktaG93dG8ueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9zc2ktaG93dG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MGQ3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL3NzaS1ob3d0by54bWwKQEAgLTAsMCArMSwzNzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJzc2ktaG93dG8uaHRtbCI+CisKKyZwcm9qZWN0OworCis8cHJvcGVydGllcz4KKzxhdXRob3IgZW1haWw9ImdsZW5uQGFwYWNoZS5vcmciPkdsZW5uIEwuIE5pZWxzZW48L2F1dGhvcj4KKzx0aXRsZT5TU0kgSG93IFRvPC90aXRsZT4KKzwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKzxwPlNTSSAoU2VydmVyIFNpZGUgSW5jbHVkZXMpIGFyZSBkaXJlY3RpdmVzIHRoYXQgYXJlIHBsYWNlZCBpbiBIVE1MIHBhZ2VzLAorYW5kIGV2YWx1YXRlZCBvbiB0aGUgc2VydmVyIHdoaWxlIHRoZSBwYWdlcyBhcmUgYmVpbmcgc2VydmVkLiBUaGV5IGxldCB5b3UKK2FkZCBkeW5hbWljYWxseSBnZW5lcmF0ZWQgY29udGVudCB0byBhbiBleGlzdGluZyBIVE1MIHBhZ2UsIHdpdGhvdXQgaGF2aW5nCit0byBzZXJ2ZSB0aGUgZW50aXJlIHBhZ2UgdmlhIGEgQ0dJIHByb2dyYW0sIG9yIG90aGVyIGR5bmFtaWMgdGVjaG5vbG9neS4KKzwvcD4KKworPHA+V2l0aGluIFRvbWNhdCBTU0kgc3VwcG9ydCBjYW4gYmUgYWRkZWQgd2hlbiB1c2luZyBUb21jYXQgYXMgeW91cgorSFRUUCBzZXJ2ZXIgYW5kIHlvdSByZXF1aXJlIFNTSSBzdXBwb3J0LiAgVHlwaWNhbGx5IHRoaXMgaXMgZG9uZQorZHVyaW5nIGRldmVsb3BtZW50IHdoZW4geW91IGRvbid0IHdhbnQgdG8gcnVuIGEgd2ViIHNlcnZlciBsaWtlIEFwYWNoZS48L3A+CisKKzxwPlRvbWNhdCBTU0kgc3VwcG9ydCBpbXBsZW1lbnRzIHRoZSBzYW1lIFNTSSBkaXJlY3RpdmVzIGFzIEFwYWNoZS4gIFNlZSB0aGUKKzxhIGhyZWY9Imh0dHA6Ly9odHRwZC5hcGFjaGUub3JnL2RvY3MvaG93dG8vc3NpLmh0bWwjYmFzaWNzc2lkaXJlY3RpdmVzIj4KK0FwYWNoZSBJbnRyb2R1Y3Rpb24gdG8gU1NJPC9hPiBmb3IgaW5mb3JtYXRpb24gb24gdXNpbmcgU1NJIGRpcmVjdGl2ZXMuPC9wPgorCis8cD5TU0kgc3VwcG9ydCBpcyBhdmFpbGFibGUgYXMgYSBzZXJ2bGV0IGFuZCBhcyBhIGZpbHRlci4gWW91IHNob3VsZCB1c2Ugb25lCitvciB0aGUgb3RoZXIgdG8gcHJvdmlkZSBTU0kgc3VwcG9ydCBidXQgbm90IGJvdGguPC9wPgorCis8cD5TZXJ2bGV0IGJhc2VkIFNTSSBzdXBwb3J0IGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSBjbGFzcworPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5zc2kuU1NJU2VydmxldDwvY29kZT4uICBUcmFkaXRpb25hbGx5LCB0aGlzIHNlcnZsZXQKK2lzIG1hcHBlZCB0byB0aGUgVVJMIHBhdHRlcm4gIiouc2h0bWwiLjwvcD4KKworPHA+RmlsdGVyIGJhc2VkIFNTSSBzdXBwb3J0IGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSBjbGFzcworPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5zc2kuU1NJRmlsdGVyPC9jb2RlPi4gIFRyYWRpdGlvbmFsbHksIHRoaXMgZmlsdGVyCitpcyBtYXBwZWQgdG8gdGhlIFVSTCBwYXR0ZXJuICIqLnNodG1sIiwgdGhvdWdoIGl0IGNhbiBiZSBtYXBwZWQgdG8gIioiIGFzCitpdCB3aWxsIHNlbGVjdGl2ZWx5IGVuYWJsZS9kaXNhYmxlIFNTSSBwcm9jZXNzaW5nIGJhc2VkIG9uIG1pbWUgdHlwZXMuICBUaGUKK2NvbnRlbnRUeXBlIGluaXQgcGFyYW0gYWxsb3dzIHlvdSB0byBhcHBseSBTU0kgcHJvY2Vzc2luZyB0byBKU1AgcGFnZXMsCitqYXZhc2NyaXB0LCBvciBhbnkgb3RoZXIgY29udGVudCB5b3Ugd2lzaC48L3A+Cis8cD5CeSBkZWZhdWx0IFNTSSBzdXBwb3J0IGlzIGRpc2FibGVkIGluIFRvbWNhdC48L3A+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9Ikluc3RhbGxhdGlvbiI+CisKKzxwPjxzdHJvbmc+Q0FVVElPTjwvc3Ryb25nPiAtIFNTSSBkaXJlY3RpdmVzIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcHJvZ3JhbXMKK2V4dGVybmFsIHRvIHRoZSBUb21jYXQgSlZNLiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBKYXZhIFNlY3VyaXR5TWFuYWdlciB0aGlzCit3aWxsIGJ5cGFzcyB5b3VyIHNlY3VyaXR5IHBvbGljeSBjb25maWd1cmF0aW9uIGluIDxjb2RlPmNhdGFsaW5hLnBvbGljeS48L2NvZGU+Cis8L3A+CisKKzxwPlJlbmFtZSA8Y29kZT4kQ0FUQUxJTkFfQkFTRS9zZXJ2ZXIvbGliL3NlcnZsZXRzLXNzaS5yZW5hbWV0b2phcjwvY29kZT4KK3RvIDxjb2RlPiRDQVRBTElOQV9CQVNFL3NlcnZlci9saWIvc2VydmxldHMtc3NpLmphcjwvY29kZT4uPC9wPgorCis8cD5UbyB1c2UgdGhlIFNTSSBzZXJ2bGV0LCByZW1vdmUgdGhlIFhNTCBjb21tZW50cyBmcm9tIGFyb3VuZCB0aGUgU1NJIHNlcnZsZXQKK2FuZCBzZXJ2bGV0LW1hcHBpbmcgY29uZmlndXJhdGlvbiBpbgorPGNvZGU+JENBVEFMSU5BX0JBU0UvY29uZi93ZWIueG1sPC9jb2RlPi48L3A+CisKKzxwPlRvIHVzZSB0aGUgU1NJIGZpbHRlciwgcmVtb3ZlIHRoZSBYTUwgY29tbWVudHMgZnJvbSBhcm91bmQgdGhlIFNTSSBmaWx0ZXIKK2FuZCBmaWx0ZXItbWFwcGluZyBjb25maWd1cmF0aW9uIGluCis8Y29kZT4kQ0FUQUxJTkFfQkFTRS9jb25mL3dlYi54bWw8L2NvZGU+LjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJTZXJ2bGV0IENvbmZpZ3VyYXRpb24iPgorCis8cD5UaGVyZSBhcmUgc2V2ZXJhbCBzZXJ2bGV0IGluaXQgcGFyYW1ldGVycyB3aGljaCBjYW4gYmUgdXNlZCB0bworY29uZmlndXJlIHRoZSBiZWhhdmlvdXIgb2YgdGhlIFNTSSBzZXJ2bGV0LgorPHVsPgorPGxpPjxzdHJvbmc+YnVmZmVyZWQ8L3N0cm9uZz4gLSBTaG91bGQgb3V0cHV0IGZyb20gdGhpcyBzZXJ2bGV0IGJlIGJ1ZmZlcmVkPworKDA9ZmFsc2UsIDE9dHJ1ZSkgRGVmYXVsdCAwIChmYWxzZSkuPC9saT4KKzxsaT48c3Ryb25nPmRlYnVnPC9zdHJvbmc+IC0gRGVidWdnaW5nIGRldGFpbCBsZXZlbCBmb3IgbWVzc2FnZXMgbG9nZ2VkCitieSB0aGlzIHNlcnZsZXQuIERlZmF1bHQgMC48L2xpPgorPGxpPjxzdHJvbmc+ZXhwaXJlczwvc3Ryb25nPiAtIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBiZWZvcmUgYSBwYWdlIHdpdGggU1NJCitkaXJlY3RpdmVzIHdpbGwgZXhwaXJlLiBEZWZhdWx0IGJlaGF2aW91ciBpcyBmb3IgYWxsIFNTSSBkaXJlY3RpdmVzIHRvIGJlCitldmFsdWF0ZWQgZm9yIGV2ZXJ5IHJlcXVlc3QuPC9saT4KKzxsaT48c3Ryb25nPmlzVmlydHVhbFdlYmFwcFJlbGF0aXZlPC9zdHJvbmc+IC0gU2hvdWxkICJ2aXJ0dWFsIiBTU0kgZGlyZWN0aXZlCitwYXRocyBiZSBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUgY29udGV4dCByb290LCBpbnN0ZWFkIG9mIHRoZSBzZXJ2ZXIKK3Jvb3Q/ICgwPWZhbHNlLCAxPXRydWUpIERlZmF1bHQgMCAoZmFsc2UpLjwvbGk+Cis8bGk+PHN0cm9uZz5pbnB1dEVuY29kaW5nPC9zdHJvbmc+IC0gVGhlIGVuY29kaW5nIHRvIGJlIGFzc3VtZWQgZm9yIFNTSQorcmVzb3VyY2VzIGlmIG9uZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSByZXNvdXJjZSBpdHNlbGYuIERlZmF1bHQgaXMKK3RoZSBkZWZhdWx0IHBsYXRmb3JtIGVuY29kaW5nLjwvbGk+Cis8bGk+PHN0cm9uZz5vdXRwdXRFbmNvZGluZzwvc3Ryb25nPiAtIFRoZSBlbmNvZGluZyB0byBiZSB1c2VkIGZvciB0aGUgcmVzdWx0CitvZiB0aGUgU1NJIHByb2Nlc3NpbmcuIERlZmF1bHQgaXMgVVRGLTguPC9saT4KKzwvdWw+Cis8L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iRmlsdGVyIENvbmZpZ3VyYXRpb24iPgorCis8cD5UaGVyZSBhcmUgc2V2ZXJhbCBmaWx0ZXIgaW5pdCBwYXJhbWV0ZXJzIHdoaWNoIGNhbiBiZSB1c2VkIHRvCitjb25maWd1cmUgdGhlIGJlaGF2aW91ciBvZiB0aGUgU1NJIGZpbHRlci4KKzx1bD4KKzxsaT48c3Ryb25nPmNvbnRlbnRUeXBlPC9zdHJvbmc+IC0gQSByZWdleCBwYXR0ZXJuIHRoYXQgbXVzdCBiZSBtYXRjaGVkIGJlZm9yZQorU1NJIHByb2Nlc3NpbmcgaXMgYXBwbGllZC4gV2hlbiBjcmFmdGluZyB5b3VyIG93biBwYXR0ZXJuLCBkb24ndCBmb3JnZXQgdGhhdCBhCittaW1lIGNvbnRlbnQgdHlwZSBtYXkgYmUgZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgY2hhcmFjdGVyIHNldCBpbiB0aGUgZm9ybQorIm1pbWUvdHlwZTsgY2hhcnNldD1zZXQiIHRoYXQgeW91IG11c3QgdGFrZSBpbnRvIGFjY291bnQuICBEZWZhdWx0IGlzCisidGV4dC94LXNlcnZlci1wYXJzZWQtaHRtbCg7LiopPyIuPC9saT4KKzxsaT48c3Ryb25nPmRlYnVnPC9zdHJvbmc+IC0gRGVidWdnaW5nIGRldGFpbCBsZXZlbCBmb3IgbWVzc2FnZXMgbG9nZ2VkCitieSB0aGlzIHNlcnZsZXQuIERlZmF1bHQgMC48L2xpPgorPGxpPjxzdHJvbmc+ZXhwaXJlczwvc3Ryb25nPiAtIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBiZWZvcmUgYSBwYWdlIHdpdGggU1NJCitkaXJlY3RpdmVzIHdpbGwgZXhwaXJlLiBEZWZhdWx0IGJlaGF2aW91ciBpcyBmb3IgYWxsIFNTSSBkaXJlY3RpdmVzIHRvIGJlCitldmFsdWF0ZWQgZm9yIGV2ZXJ5IHJlcXVlc3QuPC9saT4KKzxsaT48c3Ryb25nPmlzVmlydHVhbFdlYmFwcFJlbGF0aXZlPC9zdHJvbmc+IC0gU2hvdWxkICJ2aXJ0dWFsIiBTU0kgZGlyZWN0aXZlCitwYXRocyBiZSBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUgY29udGV4dCByb290LCBpbnN0ZWFkIG9mIHRoZSBzZXJ2ZXIKK3Jvb3Q/ICgwPWZhbHNlLCAxPXRydWUpIERlZmF1bHQgMCAoZmFsc2UpLjwvbGk+Cis8L3VsPgorPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkRpcmVjdGl2ZXMiPgorPHA+U2VydmVyIFNpZGUgSW5jbHVkZXMgYXJlIGludm9rZWQgYnkgZW1iZWRkaW5nIFNTSSBkaXJlY3RpdmVzIGluIGFuIEhUTUwgZG9jdW1lbnQKKyB3aG9zZSB0eXBlIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoZSBTU0kgc2VydmxldC4gVGhlIGRpcmVjdGl2ZXMgdGFrZSB0aGUgZm9ybSBvZiBhbiBIVE1MCisgY29tbWVudC4gVGhlIGRpcmVjdGl2ZSBpcyByZXBsYWNlZCBieSB0aGUgcmVzdWx0cyBvZiBpbnRlcnByZXRpbmcgaXQgYmVmb3JlIHNlbmRpbmcgdGhlCisgcGFnZSB0byB0aGUgY2xpZW50LiBUaGUgZ2VuZXJhbCBmb3JtIG9mIGEgZGlyZWN0aXZlIGlzOiA8L3A+Cis8cD4gPGNvZGU+Jmx0OyEtLSNkaXJlY3RpdmUgW3Bhcm09dmFsdWVdIC0tJmd0OzwvY29kZT48L3A+Cis8cD5UaGUgZGlyZWN0aXZlcyBhcmU6Cis8dWw+Cis8bGk+Cis8c3Ryb25nPmNvbmZpZzwvc3Ryb25nPiAtIDxjb2RlPiZsdDshLS0jY29uZmlnIHRpbWVmbXQ9JnF1b3Q7JUIgJVkmcXVvdDsgLS0mZ3Q7PC9jb2RlPgorVXNlZCB0byBzZXQgdGhlIGZvcm1hdCBvZiBkYXRlcyBhbmQgb3RoZXIgaXRlbXMgcHJvY2Vzc2VkIGJ5IFNTSQorPC9saT4KKzxsaT4KKzxzdHJvbmc+ZWNobzwvc3Ryb25nPiAtICAgPGNvZGU+Jmx0OyEtLSNlY2hvIHZhcj0mcXVvdDtWQVJJQUJMRV9OQU1FJnF1b3Q7IC0tJmd0OzwvY29kZT4KK3dpbGwgYmUgcmVwbGFjZWQgYnQgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZS4KKzwvbGk+Cis8bGk+Cis8c3Ryb25nPmV4ZWM8L3N0cm9uZz4gLSAgVXNlZCB0byBydW4gY29tbWFuZHMgb24gdGhlIGhvc3Qgc3lzdGVtLgorPC9saT4KKzxsaT4KKzxzdHJvbmc+aW5jbHVkZTwvc3Ryb25nPiAtICA8Y29kZT4mbHQ7IS0tI2luY2x1ZGUgdmlydHVhbD0mcXVvdDtmaWxlLW5hbWUmcXVvdDsgLS0mZ3Q7PC9jb2RlPgoraW5zZXJ0cyB0aGUgY29udGVudHMKKzwvbGk+Cis8bGk+Cis8c3Ryb25nPmZsYXN0bW9kPC9zdHJvbmc+IC0gPGNvZGU+Jmx0OyEtLSNmbGFzdG1vZCBmaWxlPSZxdW90O2ZpbGVuYW1lLnNodG1sJnF1b3Q7IC0tJmd0OzwvY29kZT4KK1JldHVybnMgdGhlIHRpbWUgdGhhdCBhIGZpbGUgd2FzIGxvc3QgbW9kaWZpZWQuCis8L2xpPgorPGxpPgorPHN0cm9uZz5mc2l6ZTwvc3Ryb25nPiAtIDxjb2RlPiZsdDshLS0jZnNpemUgZmlsZT0mcXVvdDtmaWxlbmFtZS5zaHRtbCZxdW90OyAtLSZndDs8L2NvZGU+CitSZXR1cm5zIHRoZSBzaXplIG9mIGEgZmlsZS4KKzwvbGk+Cis8bGk+Cis8c3Ryb25nPnByaW50ZW52PC9zdHJvbmc+IC0gPGNvZGU+Jmx0OyEtLSNwcmludGVudiAtLSZndDs8L2NvZGU+CitSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCB0aGUgZGVmaW5lZCB2YXJpYWJsZXMuCis8L2xpPgorPGxpPgorPHN0cm9uZz5zZXQ8L3N0cm9uZz4gLSA8Y29kZT4mbHQ7IS0tI3NldCB2YXI9ImZvbyIgdmFsdWU9IkJhciIgLS0mZ3Q7PC9jb2RlPgoraXMgdXNlZCB0byBhc3NpZ24gYSB2YWx1ZSB0byBhIHVzZXItZGVmaW5kIHZhcmlhYmxlLgorPC9saT4KKzxsaT4KKzxzdHJvbmc+aWYgZWxpZiBlbmRpZiBlbHNlPC9zdHJvbmc+IC0gVXNlZCB0byBjcmVhdGUgY29uZGl0aW9uYWwgc2VjdGlvbnMuIEZvciBleGFtcGxlOjwvbGk+Cis8Y29kZT4mbHQ7IS0tI2NvbmZpZyB0aW1lZm10PSIlQSIgLS0mZ3Q7PGJyIC8+CisgICZsdDshLS0jaWYgZXhwcj0iJERBVEVfTE9DQUwgPSAvTW9uZGF5LyIgLS0mZ3Q7PGJyIC8+CisgICZsdDtwJmd0O01lZXRpbmcgYXQgMTA6MDAgb24gTW9uZGF5cyZsdDsvcCZndDs8YnIgLz4KKyAgJmx0OyEtLSNlbGlmIGV4cHI9IiREQVRFX0xPQ0FMID0gL0ZyaWRheS8iIC0tJmd0OzxiciAvPgorICAmbHQ7cCZndDtUdXJuIGluIHlvdXIgdGltZSBjYXJkJmx0Oy9wJmd0OzxiciAvPgorICAmbHQ7IS0tI2Vsc2UgLS0mZ3Q7PGJyIC8+CisgICZsdDtwJmd0O1lvZ2EgY2xhc3MgYXQgbm9vbi4mbHQ7L3AmZ3Q7PGJyIC8+CisgICZsdDshLS0jZW5kaWYgLS0mZ3Q7PC9jb2RlPgorIDwvdWw+Cis8L3A+CitTZWUgdGhlCis8cD4gPGEgaHJlZj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy9ob3d0by9zc2kuaHRtbCNiYXNpY3NzaWRpcmVjdGl2ZXMiPgorQXBhY2hlIEludHJvZHVjdGlvbiB0byBTU0k8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHVzaW5nIFNTSSBkaXJlY3RpdmVzLjwvcD4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVmFyaWFibGVzIj4KKzxwPlRoZSBTU0kgc2VydmxldCBjdXJyZW50bHkgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKKzwvcD4KKzx0YWJsZSBib3JkZXI9IjEiPgorPHRyPgorPHRoPlZhcmlhYmxlIE5hbWU8L3RoPgorPHRoPkRlc2NyaXB0aW9uPC90aD4KKzwvdHI+CisKKzx0cj4KKzx0ZD5BVVRIX1RZUEU8L3RkPgorPHRkPgorICBUaGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbiB1c2VkIGZvciB0aGlzIHVzZXI6IEJBU0lDLCBGT1JNLCBldGMuPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZD5DT05URU5UX0xFTkdUSDwvdGQ+Cis8dGQ+CisgIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgKGluIGJ5dGVzIG9yIHRoZSBudW1iZXIgb2YgCisgIGNoYXJhY3RlcnMpIHBhc3NlZCBmcm9tIGEgZm9ybS48L3RkPgorPC90cj4KKworPHRyPgorPHRkPkNPTlRFTlRfVFlQRTwvdGQ+Cis8dGQ+CisgIFRoZSBNSU1FIHR5cGUgb2YgdGhlIHF1ZXJ5IGRhdGEsIHN1Y2ggYXMgJnF1b3Q7dGV4dC9odG1sJnF1b3Q7LjwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQ+REFURV9HTVQ8L3RkPgorPHRkPgorQ3VycmVudCBkYXRlIGFuZCB0aW1lIGluIEdNVDwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQ+REFURV9MT0NBTDwvdGQ+Cis8dGQ+CitDdXJyZW50IGRhdGUgYW5kIHRpbWUgaW4gdGhlIGxvY2FsIHRpbWUgem9uZTwvdGQ+Cis8L3RyPgorPHRyPgorPHRkPkRPQ1VNRU5UX05BTUU8L3RkPgorPHRkPgorVGhlIGN1cnJlbnQgZmlsZTwvdGQ+Cis8L3RyPgorPHRyPgorPHRkPkRPQ1VNRU5UX1VSSTwvdGQ+Cis8dGQ+CitWaXJ0dWFsIHBhdGggdG8gdGhlIGZpbGU8L3RkPgorPC90cj4KKworPHRyPgorPHRkPkdBVEVXQVlfSU5URVJGQUNFPC90ZD4KKzx0ZD4KKyAgVGhlIHJldmlzaW9uIG9mIHRoZSBDb21tb24gR2F0ZXdheSBJbnRlcmZhY2UgdGhhdCB0aGUgCisgIHNlcnZlciB1c2VzIGlmIGVuYWJsZWQ6ICZxdW90O0NHSS8xLjEmcXVvdDsuPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZD5IVFRQX0FDQ0VQVDwvdGQ+Cis8dGQ+CisgIEEgbGlzdCBvZiB0aGUgTUlNRSB0eXBlcyB0aGF0IHRoZSBjbGllbnQgY2FuIGFjY2VwdC48L3RkPgorPC90cj4KKworPHRyPgorPHRkPkhUVFBfQUNDRVBUX0VOQ09ESU5HPC90ZD4KKzx0ZD4KKyAgQSBsaXN0IG9mIHRoZSBjb21wcmVzc2lvbiB0eXBlcyB0aGF0IHRoZSBjbGllbnQgY2FuIGFjY2VwdC48L3RkPgorPC90cj4KKworPHRyPgorPHRkPkhUVFBfQUNDRVBUX0xBTkdVQUdFPC90ZD4KKzx0ZD4KKyAgQSBsaXN0IG9mIHRoZSBsYWd1YWdlcyB0aGF0IHRoZSBjbGllbnQgY2FuIGFjY2VwdC48L3RkPgorPC90cj4KKzx0cj4KKzx0ZD5IVFRQX0NPTk5FQ1RJT048L3RkPgorPHRkPgorICBUaGUgd2F5IHRoYXQgdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUgY2xpZW50IGlzIGJlaW5nIG1hbmFnZWQ6CisgICZxdW90O0Nsb3NlJnF1b3Q7IG9yICZxdW90O0tlZXAtQWxpdmUmcXVvdDsuPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQ+SFRUUF9IT1NUPC90ZD4KKzx0ZD4KKyAgVGhlIHdlYiBzaXRlIHRoYXQgdGhlIGNsaWVudCByZXF1ZXN0ZWQuPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQ+SFRUUF9SRUZFUkVSPC90ZD4KKzx0ZD4KKyAgVGhlIFVSTCBvZiB0aGUgZG9jdW1lbnQgdGhhdCB0aGUgY2xpZW50IGxpbmtlZCBmcm9tLjwvdGQ+Cis8L3RyPgorPHRyPgorPHRkPkhUVFBfVVNFUl9BR0VOVDwvdGQ+Cis8dGQ+CisgIFRoZSBicm93c2VyIHRoZSBjbGllbnQgaXMgdXNpbmcgdG8gaXNzdWUgdGhlIHJlcXVlc3QuPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQ+TEFTVF9NT0RJRklFRDwvdGQ+Cis8dGQ+CitMYXN0IG1vZGlmaWNhdGlvbiBkYXRlIGFuZCB0aW1lIGZvciBjdXJyZW50IGZpbGU8L3RkPgorPC90cj4KKzx0cj4KKzx0ZD5QQVRIX0lORk88L3RkPgorPHRkPgorICBFeHRyYSBwYXRoIGluZm9ybWF0aW9uIHBhc3NlZCB0byBhIHNlcnZsZXQuPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQ+UEFUSF9UUkFOU0xBVEVEPC90ZD4KKzx0ZD4KKyAgVGhlIHRyYW5zbGF0ZWQgdmVyc2lvbiBvZiB0aGUgcGF0aCBnaXZlbiBieSB0aGUKKyAgdmFyaWFibGUgUEFUSF9JTkZPLjwvdGQ+Cis8L3RyPgorPHRyPgorPHRkPlFVRVJZX1NUUklORzwvdGQ+Cis8dGQ+CitUaGUgcXVlcnkgc3RyaW5nIHRoYXQgZm9sbG93cyB0aGUgJnF1b3Q7PyZxdW90OyBpbiB0aGUgVVJMLgorPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQ+UVVFUllfU1RSSU5HX1VORVNDQVBFRDwvdGQ+Cis8dGQ+CitVbmRlY29kZWQgcXVlcnkgc3RyaW5nIHdpdGggYWxsIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIGVzY2FwZWQgCit3aXRoICZxdW90O1wmcXVvdDs8L3RkPgorPC90cj4KKzx0cj4KKzx0ZD5SRU1PVEVfQUREUjwvdGQ+Cis8dGQ+CisgIFRoZSByZW1vdGUgSVAgYWRkcmVzcyBvZiB0aGUgdXNlciBtYWtpbmcgdGhlIHJlcXVlc3QuPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQ+UkVNT1RFX0hPU1Q8L3RkPgorPHRkPgorICBUaGUgcmVtb3RlIGhvc3RuYW1lIG9mIHRoZSB1c2VyIG1ha2luZyB0aGUgcmVxdWVzdC48L3RkPgorPC90cj4KKzx0cj4KKzx0ZD5SRU1PVEVfUE9SVDwvdGQ+Cis8dGQ+CisgIFRoZSBwb3J0IG51bWJlciBhdCByZW1vdGUgSVAgYWRkcmVzcyBvZiB0aGUgdXNlciBtYWtpbmcgdGhlIHJlcXVlc3QuPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQ+UkVNT1RFX1VTRVI8L3RkPgorPHRkPgorICBUaGUgYXV0aGVudGljYXRlZCBuYW1lIG9mIHRoZSB1c2VyLjwvdGQ+Cis8L3RyPgorPHRyPgorPHRkPlJFUVVFU1RfTUVUSE9EPC90ZD4KKzx0ZD4KKyAgVGhlIG1ldGhvZCB3aXRoIHdoaWNoIHRoZSBpbmZvcm1hdGlvbiByZXF1ZXN0IHdhcworICBpc3N1ZWQ6ICZxdW90O0dFVCZxdW90OywgJnF1b3Q7UE9TVCZxdW90OyBldGMuPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQ+UkVRVUVTVF9VUkk8L3RkPgorPHRkPgorICBUaGUgd2ViIHBhZ2Ugb3JpZ2luYWxseSByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC48L3RkPgorPC90cj4KKzx0cj4KKzx0ZD5TQ1JJUFRfRklMRU5BTUU8L3RkPgorPHRkPgorICBUaGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgd2ViIHBhZ2Ugb24gdGhlIHNlcnZlci48L3RkPgorPC90cj4KKzx0cj4KKzx0ZD5TQ1JJUFRfTkFNRTwvdGQ+Cis8dGQ+CisgIFRoZSBuYW1lIG9mIHRoZSB3ZWIgcGFnZS48L3RkPgorPC90cj4KKzx0cj4KKzx0ZD5TRVJWRVJfQUREUjwvdGQ+Cis8dGQ+CisgIFRoZSBzZXJ2ZXIncyBJUCBhZGRyZXNzLjwvdGQ+Cis8L3RyPgorPHRyPgorPHRkPlNFUlZFUl9OQU1FPC90ZD4KKzx0ZD4KKyAgVGhlIHNlcnZlcidzIGhvc3RuYW1lIG9yIElQIGFkZHJlc3MuPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQ+U0VSVkVSX1BPUlQ8L3RkPgorPHRkPgorICBUaGUgcG9ydCBvbiB3aGljaCB0aGUgc2VydmVyIHJlY2VpdmVkIHRoZSByZXF1ZXN0LjwvdGQ+Cis8L3RyPgorPHRyPgorPHRkPlNFUlZFUl9QUk9UT0NPTDwvdGQ+Cis8dGQ+CisgIFRoZSBwcm90b2NvbCB1c2VkIGJ5IHRoZSBzZXJ2ZXIuIEUuZy4gJnF1b3Q7SFRUUC8xLjEmcXVvdDsuPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQ+U0VSVkVSX1NPRlRXQVJFPC90ZD4KKzx0ZD4KKyAgVGhlIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhlIHNlcnZlciBzb2Z0d2FyZSB0aGF0IGlzIAorICBhbnN3ZXJpbmcgdGhlIGNsaWVudCByZXF1ZXN0LjwvdGQ+Cis8L3RyPgorPHRyPgorPHRkPlVOSVFVRV9JRDwvdGQ+Cis8dGQ+CisgIEEgdG9rZW4gdXNlZCB0byBpZGVudGlmeSB0aGUgY3VycmVudCBzZXNzaW9uIGlmIG9uZQorICBoYXMgYmVlbiBlc3RhYmxpc2hlZC48L3RkPgorPC90cj4KKzwvdGFibGU+Cis8L3NlY3Rpb24+CisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvc3NsLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvc3NsLWhvd3RvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODcyYTM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9zc2wtaG93dG8ueG1sCkBAIC0wLDAgKzEsNTc1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0ic3NsLWhvd3RvLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0iY2NhaW5AYXBhY2hlLm9yZyI+Q2hyaXN0b3BoZXIgQ2FpbjwvYXV0aG9yPgorICAgICAgICA8YXV0aG9yPllvYXYgU2hhcGlyYTwvYXV0aG9yPgorICAgICAgICA8dGl0bGU+U1NMIENvbmZpZ3VyYXRpb24gSE9XLVRPPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IlF1aWNrIFN0YXJ0Ij4KKworICAgPHA+PGI+SU1QT1JUQU5UIE5PVEU6IFRoaXMgSG93dG8gcmVmZXJzIHRvIHVzYWdlIG9mIEpTU0UuIFdoZW4gdXNpbmcgQVBSLCBUb21jYXQgd2lsbAorICAgdXNlIE9wZW5TU0wsIHdoaWNoIHVzZXMgYSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbi48L2I+PC9wPgorCisgICAgPGJsb2NrcXVvdGU+PGVtPgorICAgIDxwPlRoZSBkZXNjcmlwdGlvbiBiZWxvdyB1c2VzIHRoZSB2YXJpYWJsZSBuYW1lICRDQVRBTElOQV9IT01FCisgICAgdG8gcmVmZXIgdG8gdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHlvdSBoYXZlIGluc3RhbGxlZCBUb21jYXQgNSwKKyAgICBhbmQgaXMgdGhlIGJhc2UgZGlyZWN0b3J5IGFnYWluc3Qgd2hpY2ggbW9zdCByZWxhdGl2ZSBwYXRocyBhcmUKKyAgICByZXNvbHZlZC4gIEhvd2V2ZXIsIGlmIHlvdSBoYXZlIGNvbmZpZ3VyZWQgVG9tY2F0IDUgZm9yIG11bHRpcGxlCisgICAgaW5zdGFuY2VzIGJ5IHNldHRpbmcgYSBDQVRBTElOQV9CQVNFIGRpcmVjdG9yeSwgeW91IHNob3VsZCB1c2UKKyAgICAkQ0FUQUxJTkFfQkFTRSBpbnN0ZWFkIG9mICRDQVRBTElOQV9IT01FIGZvciBlYWNoIG9mIHRoZXNlCisgICAgcmVmZXJlbmNlcy48L3A+CisgICAgPC9lbT48L2Jsb2NrcXVvdGU+CisKKzxwPlRvIGluc3RhbGwgYW5kIGNvbmZpZ3VyZSBTU0wgc3VwcG9ydCBvbiBUb21jYXQgNSwgeW91IG5lZWQgdG8gZm9sbG93Cit0aGVzZSBzaW1wbGUgc3RlcHMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVhZCB0aGUgcmVzdCBvZiB0aGlzIEhPVy1UTy48L3A+Cis8b2w+Cis8bGk+SWYgeW91IGFyZSBydW5uaW5nIGEgMS4zIEpWTSwgZG93bmxvYWQgSlNTRSAxLjAuMyAob3IgbGF0ZXIpIGZyb20KKyAgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvanNzZS8iPmh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvanNzZS88L2E+CisgICBhbmQgZWl0aGVyIG1ha2UgaXQgYW4gPGVtPmluc3RhbGxlZCBleHRlbnNpb248L2VtPiBvbiB0aGUgc3lzdGVtLCBvciBlbHNlCisgICBzZXQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgPGNvZGU+SlNTRV9IT01FPC9jb2RlPiB0aGF0IHBvaW50cyBhdCB0aGUKKyAgIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHlvdSBpbnN0YWxsZWQgSlNTRS4gIDwvbGk+PGJyLz48YnIvPgorPGxpPkNyZWF0ZSBhIGNlcnRpZmljYXRlIGtleXN0b3JlIGJ5IGV4ZWN1dGluZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6Cis8cD5XaW5kb3dzOjwvcD4KKzxzb3VyY2U+CislSkFWQV9IT01FJVxiaW5ca2V5dG9vbCAtZ2Vua2V5IC1hbGlhcyB0b21jYXQgLWtleWFsZyBSU0EKKzwvc291cmNlPgorPHA+VW5peDo8L3A+Cis8c291cmNlPgorJEpBVkFfSE9NRS9iaW4va2V5dG9vbCAtZ2Vua2V5IC1hbGlhcyB0b21jYXQgLWtleWFsZyBSU0EKKzwvc291cmNlPgorPHA+PC9wPgorICAgIGFuZCBzcGVjaWZ5IGEgcGFzc3dvcmQgdmFsdWUgb2YgImNoYW5nZWl0Ii48L2xpPjxici8+PGJyLz4KKzxsaT5VbmNvbW1lbnQgdGhlICJTU0wgSFRUUC8xLjEgQ29ubmVjdG9yIiBlbnRyeSBpbgorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4gYW5kIHR3ZWFrIGFzIG5lY2Vzc2FyeS48L2xpPgorICAgIDxici8+PGJyLz4KKzwvb2w+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiB0byBTU0wiPgorCis8cD5TU0wsIG9yIFNlY3VyZSBTb2NrZXQgTGF5ZXIsIGlzIGEgdGVjaG5vbG9neSB3aGljaCBhbGxvd3Mgd2ViIGJyb3dzZXJzIGFuZAord2ViIHNlcnZlcnMgdG8gY29tbXVuaWNhdGUgb3ZlciBhIHNlY3VyZWQgY29ubmVjdGlvbi4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgZGF0YQorYmVpbmcgc2VudCBpcyBlbmNyeXB0ZWQgYnkgb25lIHNpZGUsIHRyYW5zbWl0dGVkLCB0aGVuIGRlY3J5cHRlZCBieSB0aGUgb3RoZXIKK3NpZGUgYmVmb3JlIHByb2Nlc3NpbmcuICBUaGlzIGlzIGEgdHdvLXdheSBwcm9jZXNzLCBtZWFuaW5nIHRoYXQgYm90aCB0aGUKK3NlcnZlciBBTkQgdGhlIGJyb3dzZXIgZW5jcnlwdCBhbGwgdHJhZmZpYyBiZWZvcmUgc2VuZGluZyBvdXQgZGF0YS48L3A+CisKKzxwPkFub3RoZXIgaW1wb3J0YW50IGFzcGVjdCBvZiB0aGUgU1NMIHByb3RvY29sIGlzIEF1dGhlbnRpY2F0aW9uLiAgVGhpcyBtZWFucwordGhhdCBkdXJpbmcgeW91ciBpbml0aWFsIGF0dGVtcHQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHdlYiBzZXJ2ZXIgb3ZlciBhIHNlY3VyZQorY29ubmVjdGlvbiwgdGhhdCBzZXJ2ZXIgd2lsbCBwcmVzZW50IHlvdXIgd2ViIGJyb3dzZXIgd2l0aCBhIHNldCBvZgorY3JlZGVudGlhbHMsIGluIHRoZSBmb3JtIG9mIGEgIkNlcnRpZmljYXRlIiwgYXMgcHJvb2YgdGhlIHNpdGUgaXMgd2hvIGFuZCB3aGF0CitpdCBjbGFpbXMgdG8gYmUuICBJbiBjZXJ0YWluIGNhc2VzLCB0aGUgc2VydmVyIG1heSBhbHNvIHJlcXVlc3QgYSBDZXJ0aWZpY2F0ZQorZnJvbSB5b3VyIHdlYiBicm93c2VyLCBhc2tpbmcgZm9yIHByb29mIHRoYXQgPGVtPnlvdTwvZW0+IGFyZSB3aG8geW91IGNsYWltCit0byBiZS4gIFRoaXMgaXMga25vd24gYXMgIkNsaWVudCBBdXRoZW50aWNhdGlvbiwiIGFsdGhvdWdoIGluIHByYWN0aWNlIHRoaXMgaXMKK3VzZWQgbW9yZSBmb3IgYnVzaW5lc3MtdG8tYnVzaW5lc3MgKEIyQikgdHJhbnNhY3Rpb25zIHRoYW4gd2l0aCBpbmRpdmlkdWFsCit1c2Vycy4gIE1vc3QgU1NMLWVuYWJsZWQgd2ViIHNlcnZlcnMgZG8gbm90IHJlcXVlc3QgQ2xpZW50IEF1dGhlbnRpY2F0aW9uLjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJTU0wgYW5kIFRvbWNhdCI+CisKKzxwPkl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgY29uZmlndXJpbmcgVG9tY2F0IHRvIHRha2UgYWR2YW50YWdlIG9mCitzZWN1cmUgc29ja2V0cyBpcyB1c3VhbGx5IG9ubHkgbmVjZXNzYXJ5IHdoZW4gcnVubmluZyBpdCBhcyBhIHN0YW5kLWFsb25lCit3ZWIgc2VydmVyLiAgV2hlbiBydW5uaW5nIFRvbWNhdCBwcmltYXJpbHkgYXMgYSBTZXJ2bGV0L0pTUCBjb250YWluZXIgYmVoaW5kCithbm90aGVyIHdlYiBzZXJ2ZXIsIHN1Y2ggYXMgQXBhY2hlIG9yIE1pY3Jvc29mdCBJSVMsIGl0IGlzIHVzdWFsbHkgbmVjZXNzYXJ5Cit0byBjb25maWd1cmUgdGhlIHByaW1hcnkgd2ViIHNlcnZlciB0byBoYW5kbGUgdGhlIFNTTCBjb25uZWN0aW9ucyBmcm9tIHVzZXJzLgorVHlwaWNhbGx5LCB0aGlzIHNlcnZlciB3aWxsIG5lZ290aWF0ZSBhbGwgU1NMLXJlbGF0ZWQgZnVuY3Rpb25hbGl0eSwgdGhlbgorcGFzcyBvbiBhbnkgcmVxdWVzdHMgZGVzdGluZWQgZm9yIHRoZSBUb21jYXQgY29udGFpbmVyIG9ubHkgYWZ0ZXIgZGVjcnlwdGluZwordGhvc2UgcmVxdWVzdHMuICBMaWtld2lzZSwgVG9tY2F0IHdpbGwgcmV0dXJuIGNsZWFydGV4dCByZXNwb25zZXMsIHRoYXQgd2lsbAorYmUgZW5jcnlwdGVkIGJlZm9yZSBiZWluZyByZXR1cm5lZCB0byB0aGUgdXNlcidzIGJyb3dzZXIuICBJbiB0aGlzIGVudmlyb25tZW50LAorVG9tY2F0IGtub3dzIHRoYXQgY29tbXVuaWNhdGlvbnMgYmV0d2VlbiB0aGUgcHJpbWFyeSB3ZWIgc2VydmVyIGFuZCB0aGUKK2NsaWVudCBhcmUgdGFraW5nIHBsYWNlIG92ZXIgYSBzZWN1cmUgY29ubmVjdGlvbiAoYmVjYXVzZSB5b3VyIGFwcGxpY2F0aW9uCituZWVkcyB0byBiZSBhYmxlIHRvIGFzayBhYm91dCB0aGlzKSwgYnV0IGl0IGRvZXMgbm90IHBhcnRpY2lwYXRlIGluIHRoZQorZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uIGl0c2VsZi48L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iQ2VydGlmaWNhdGVzIj4KKworPHA+SW4gb3JkZXIgdG8gaW1wbGVtZW50IFNTTCwgYSB3ZWIgc2VydmVyIG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIENlcnRpZmljYXRlCitmb3IgZWFjaCBleHRlcm5hbCBpbnRlcmZhY2UgKElQIGFkZHJlc3MpIHRoYXQgYWNjZXB0cyBzZWN1cmUgY29ubmVjdGlvbnMuCitUaGUgdGhlb3J5IGJlaGluZCB0aGlzIGRlc2lnbiBpcyB0aGF0IGEgc2VydmVyIHNob3VsZCBwcm92aWRlIHNvbWUga2luZCBvZgorcmVhc29uYWJsZSBhc3N1cmFuY2UgdGhhdCBpdHMgb3duZXIgaXMgd2hvIHlvdSB0aGluayBpdCBpcywgcGFydGljdWxhcmx5CitiZWZvcmUgcmVjZWl2aW5nIGFueSBzZW5zaXRpdmUgaW5mb3JtYXRpb24uICBXaGlsZSBhIGJyb2FkZXIgZXhwbGFuYXRpb24gb2YKK0NlcnRpZmljYXRlcyBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgZG9jdW1lbnQsIHRoaW5rIG9mIGEgQ2VydGlmaWNhdGUKK2FzIGEgImRpZ2l0YWwgZHJpdmVyJ3MgbGljZW5zZSIgZm9yIGFuIEludGVybmV0IGFkZHJlc3MuICBJdCBzdGF0ZXMgd2hhdAorY29tcGFueSB0aGUgc2l0ZSBpcyBhc3NvY2lhdGVkIHdpdGgsIGFsb25nIHdpdGggc29tZSBiYXNpYyBjb250YWN0CitpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2l0ZSBvd25lciBvciBhZG1pbmlzdHJhdG9yLjwvcD4KKworPHA+VGhpcyAiZHJpdmVyJ3MgbGljZW5zZSIgaXMgY3J5cHRvZ3JhcGhpY2FsbHkgc2lnbmVkIGJ5IGl0cyBvd25lciwgYW5kIGlzCit0aGVyZWZvcmUgZXh0cmVtZWx5IGRpZmZpY3VsdCBmb3IgYW55b25lIGVsc2UgdG8gZm9yZ2UuICBGb3Igc2l0ZXMgaW52b2x2ZWQKK2luIGUtY29tbWVyY2UsIG9yIGFueSBvdGhlciBidXNpbmVzcyB0cmFuc2FjdGlvbiBpbiB3aGljaCBhdXRoZW50aWNhdGlvbiBvZgoraWRlbnRpdHkgaXMgaW1wb3J0YW50LCBhIENlcnRpZmljYXRlIGlzIHR5cGljYWxseSBwdXJjaGFzZWQgZnJvbSBhIHdlbGwta25vd24KKzxlbT5DZXJ0aWZpY2F0ZSBBdXRob3JpdHk8L2VtPiAoQ0EpIHN1Y2ggYXMgVmVyaVNpZ24gb3IgVGhhd3RlLiAgU3VjaAorY2VydGlmaWNhdGVzIGNhbiBiZSBlbGVjdHJvbmljYWxseSB2ZXJpZmllZCAtLSBpbiBlZmZlY3QsIHRoZSBDZXJ0aWZpY2F0ZQorQXV0aG9yaXR5IHdpbGwgdm91Y2ggZm9yIHRoZSBhdXRoZW50aWNpdHkgb2YgdGhlIGNlcnRpZmljYXRlcyB0aGF0IGl0IGdyYW50cywKK3NvIHlvdSBjYW4gYmVsaWV2ZSB0aGF0IHRoYXQgQ2VydGlmaWNhdGUgaXMgdmFsaWQgaWYgeW91IHRydXN0IHRoZSBDZXJ0aWZpY2F0ZQorQXV0aG9yaXR5IHRoYXQgZ3JhbnRlZCBpdC48L3A+CisKKzxwPkluIG1hbnkgY2FzZXMsIGhvd2V2ZXIsIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCByZWFsbHkgYSBjb25jZXJuLiAgQW4KK2FkbWluaXN0cmF0b3IgbWF5IHNpbXBseSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSBkYXRhIGJlaW5nIHRyYW5zbWl0dGVkIGFuZAorcmVjZWl2ZWQgYnkgdGhlIHNlcnZlciBpcyBwcml2YXRlIGFuZCBjYW5ub3QgYmUgc25vb3BlZCBieSBhbnlvbmUgd2hvIG1heSBiZQorZWF2ZXNkcm9wcGluZyBvbiB0aGUgY29ubmVjdGlvbi4gIEZvcnR1bmF0ZWx5LCBKYXZhIHByb3ZpZGVzIGEgcmVsYXRpdmVseQorc2ltcGxlIGNvbW1hbmQtbGluZSB0b29sLCBjYWxsZWQgPGNvZGU+a2V5dG9vbDwvY29kZT4sIHdoaWNoIGNhbiBlYXNpbHkgY3JlYXRlCithICJzZWxmLXNpZ25lZCIgQ2VydGlmaWNhdGUuICBTZWxmLXNpZ25lZCBDZXJ0aWZpY2F0ZXMgYXJlIHNpbXBseSB1c2VyCitnZW5lcmF0ZWQgQ2VydGlmaWNhdGVzIHdoaWNoIGhhdmUgbm90IGJlZW4gb2ZmaWNpYWxseSByZWdpc3RlcmVkIHdpdGggYW55Cit3ZWxsLWtub3duIENBLCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgcmVhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYXV0aGVudGljIGF0IGFsbC4KK0FnYWluLCB0aGlzIG1heSBvciBtYXkgbm90IGV2ZW4gYmUgaW1wb3J0YW50LCBkZXBlbmRpbmcgb24geW91ciBuZWVkcy48L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iR2VuZXJhbCBUaXBzIG9uIFJ1bm5pbmcgU1NMIj4KKworPHA+VGhlIGZpcnN0IHRpbWUgYSB1c2VyIGF0dGVtcHRzIHRvIGFjY2VzcyBhIHNlY3VyZWQgcGFnZSBvbiB5b3VyIHNpdGUsCitoZSBvciBzaGUgaXMgdHlwaWNhbGx5IHByZXNlbnRlZCB3aXRoIGEgZGlhbG9nIGNvbnRhaW5pbmcgdGhlIGRldGFpbHMgb2YKK3RoZSBjZXJ0aWZpY2F0ZSAoc3VjaCBhcyB0aGUgY29tcGFueSBhbmQgY29udGFjdCBuYW1lKSwgYW5kIGFza2VkIGlmIGhlIG9yIHNoZQord2lzaGVzIHRvIGFjY2VwdCB0aGUgQ2VydGlmaWNhdGUgYXMgdmFsaWQgYW5kIGNvbnRpbnVlIHdpdGggdGhlIHRyYW5zYWN0aW9uLgorU29tZSBicm93c2VycyB3aWxsIHByb3ZpZGUgYW4gb3B0aW9uIGZvciBwZXJtYW5lbnRseSBhY2NlcHRpbmcgYSBnaXZlbgorQ2VydGlmaWNhdGUgYXMgdmFsaWQsIGluIHdoaWNoIGNhc2UgdGhlIHVzZXIgd2lsbCBub3QgYmUgYm90aGVyZWQgd2l0aCBhCitwcm9tcHQgZWFjaCB0aW1lIHRoZXkgdmlzaXQgeW91ciBzaXRlLiAgT3RoZXIgYnJvd3NlcnMgZG8gbm90IHByb3ZpZGUgdGhpcworb3B0aW9uLiAgT25jZSBhcHByb3ZlZCBieSB0aGUgdXNlciwgYSBDZXJ0aWZpY2F0ZSB3aWxsIGJlIGNvbnNpZGVyZWQgdmFsaWQKK2ZvciBhdCBsZWFzdCB0aGUgZW50aXJlIGJyb3dzZXIgc2Vzc2lvbi48L3A+CisKKzxwPkFsc28sIHdoaWxlIHRoZSBTU0wgcHJvdG9jb2wgd2FzIGRlc2lnbmVkIHRvIGJlIGFzIGVmZmljaWVudCBhcyBzZWN1cmVseQorcG9zc2libGUsIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBpcyBhIGNvbXB1dGF0aW9uYWxseSBleHBlbnNpdmUgcHJvY2VzcyBmcm9tCithIHBlcmZvcm1hbmNlIHN0YW5kcG9pbnQuICBJdCBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IHRvIHJ1biBhbiBlbnRpcmUKK3dlYiBhcHBsaWNhdGlvbiBvdmVyIFNTTCwgYW5kIGluZGVlZCBhIGRldmVsb3BlciBjYW4gcGljayBhbmQgY2hvb3NlIHdoaWNoCitwYWdlcyByZXF1aXJlIGEgc2VjdXJlIGNvbm5lY3Rpb24gYW5kIHdoaWNoIGRvIG5vdC4gIEZvciBhIHJlYXNvbmFibHkgYnVzeQorc2l0ZSwgaXQgaXMgY3VzdG9tYXJ5IHRvIG9ubHkgcnVuIGNlcnRhaW4gcGFnZXMgdW5kZXIgU1NMLCBuYW1lbHkgdGhvc2UKK3BhZ2VzIHdoZXJlIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiBjb3VsZCBwb3NzaWJseSBiZSBleGNoYW5nZWQuICBUaGlzIHdvdWxkCitpbmNsdWRlIHRoaW5ncyBsaWtlIGxvZ2luIHBhZ2VzLCBwZXJzb25hbCBpbmZvcm1hdGlvbiBwYWdlcywgYW5kIHNob3BwaW5nCitjYXJ0IGNoZWNrb3V0cywgd2hlcmUgY3JlZGl0IGNhcmQgaW5mb3JtYXRpb24gY291bGQgcG9zc2libHkgYmUgdHJhbnNtaXR0ZWQuCitBbnkgcGFnZSB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2FuIGJlIHJlcXVlc3RlZCBvdmVyIGEgc2VjdXJlIHNvY2tldCBieQorc2ltcGx5IHByZWZpeGluZyB0aGUgYWRkcmVzcyB3aXRoIDxjb2RlPmh0dHBzOjwvY29kZT4gaW5zdGVhZCBvZgorPGNvZGU+aHR0cDo8L2NvZGU+LiAgQW55IHBhZ2VzIHdoaWNoIGFic29sdXRlbHkgPHN0cm9uZz5yZXF1aXJlPC9zdHJvbmc+CithIHNlY3VyZSBjb25uZWN0aW9uIHNob3VsZCBjaGVjayB0aGUgcHJvdG9jb2wgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlCitwYWdlIHJlcXVlc3QgYW5kIHRha2UgdGhlIGFwcHJvcHJpYXRlIGFjdGlvbiBpZiA8Y29kZT5odHRwczwvY29kZT4gaXMgbm90CitzcGVjaWZpZWQuPC9wPgorCis8cD5GaW5hbGx5LCB1c2luZyBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdHMgb24gYSBzZWN1cmVkIGNvbm5lY3Rpb24gY2FuIGJlCitwcm9ibGVtYXRpYy4gIFRoaXMgaXMgYSBkZXNpZ24gbGltaXRhdGlvbiBvZiB0aGUgU1NMIHByb3RvY29sIGl0c2VsZi4gIFRoZSBTU0wKK2hhbmRzaGFrZSwgd2hlcmUgdGhlIGNsaWVudCBicm93c2VyIGFjY2VwdHMgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSwgbXVzdCBvY2N1cgorYmVmb3JlIHRoZSBIVFRQIHJlcXVlc3QgaXMgYWNjZXNzZWQuICBBcyBhIHJlc3VsdCwgdGhlIHJlcXVlc3QgaW5mb3JtYXRpb24KK2NvbnRhaW5pbmcgdGhlIHZpcnR1YWwgaG9zdCBuYW1lIGNhbm5vdCBiZSBkZXRlcm1pbmVkIHByaW9yIHRvIGF1dGhlbnRpY2F0aW9uLAorYW5kIGl0IGlzIHRoZXJlZm9yZSBub3QgcG9zc2libGUgdG8gYXNzaWduIG11bHRpcGxlIGNlcnRpZmljYXRlcyB0byBhIHNpbmdsZQorSVAgYWRkcmVzcy4gIElmIGFsbCB2aXJ0dWFsIGhvc3RzIG9uIGEgc2luZ2xlIElQIGFkZHJlc3MgbmVlZCB0byBhdXRoZW50aWNhdGUKK2FnYWluc3QgdGhlIHNhbWUgY2VydGlmaWNhdGUsIHRoZSBhZGRpdGlvbiBvZiBtdWx0aXBsZSB2aXJ0dWFsIGhvc3RzIHNob3VsZCBub3QKK2ludGVyZmVyZSB3aXRoIG5vcm1hbCBTU0wgb3BlcmF0aW9ucyBvbiB0aGUgc2VydmVyLiAgQmUgYXdhcmUsIGhvd2V2ZXIsIHRoYXQKK21vc3QgY2xpZW50IGJyb3dzZXJzIHdpbGwgY29tcGFyZSB0aGUgc2VydmVyJ3MgZG9tYWluIG5hbWUgYWdhaW5zdCB0aGUgZG9tYWluCituYW1lIGxpc3RlZCBpbiB0aGUgY2VydGlmaWNhdGUsIGlmIGFueSAoYXBwbGljYWJsZSBwcmltYXJpbHkgdG8gb2ZmaWNpYWwsCitDQS1zaWduZWQgY2VydGlmaWNhdGVzKS4gIElmIHRoZSBkb21haW4gbmFtZXMgZG8gbm90IG1hdGNoLCB0aGVzZSBicm93c2VycyB3aWxsCitkaXNwbGF5IGEgd2FybmluZyB0byB0aGUgY2xpZW50IHVzZXIuICBJbiBnZW5lcmFsLCBvbmx5IGFkZHJlc3MtYmFzZWQgdmlydHVhbAoraG9zdHMgYXJlIGNvbW1vbmx5IHVzZWQgd2l0aCBTU0wgaW4gYSBwcm9kdWN0aW9uIGVudmlyb25tZW50LjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJDb25maWd1cmF0aW9uIj4KKworPHN1YnNlY3Rpb24gbmFtZT0iRG93bmxvYWQgYW5kIEluc3RhbGwgSlNTRSAoaWYgbmVlZGVkKSI+Cis8cD5Ob3RlIHRoYXQgSlNTRSBpcyBidW5kbGVkIHdpdGggU3VuJ3MgSkRLIDEuNCBhbmQgbGF0ZXIsIHNvIGlmIHlvdSdyZSB1c2luZworSkRLIDEuNCBhbmQgbGF0ZXIsIHlvdSBjYW4gc2tpcCB0aGlzIHN0ZXAuPC9wPgorCisKKzxwPkRvd25sb2FkIHRoZSA8ZW0+SmF2YSBTZWN1cmUgU29ja2V0IEV4dGVuc2lvbnM8L2VtPiAoSlNTRSkgcGFja2FnZSwKK3ZlcnNpb24gMS4wLjMgb3IgbGF0ZXIsIGZyb20KKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvanNzZS8iPmh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvanNzZS88L2E+LgorSWYgeW91IGJ1aWx0IFRvbWNhdCBmcm9tIHNvdXJjZSwgeW91IGhhdmUgcHJvYmFibHkgYWxyZWFkeSBkb3dubG9hZGVkIHRoaXMKK3BhY2thZ2UuPC9wPgorCis8cD5BZnRlciBleHBhbmRpbmcgdGhlIHBhY2thZ2UsIHRoZXJlIGFyZSB0d28gd2F5cyB0byBtYWtlIGl0IGF2YWlsYWJsZSB0bworVG9tY2F0IChjaG9vc2Ugb25lIG9yIHRoZSBvdGhlcik6PC9wPgorPHVsPgorPGxpPk1ha2UgSlNTRSBhbiA8ZW0+aW5zdGFsbGVkIGV4dGVuc2lvbjwvZW0+IGJ5IGNvcHlpbmcgYWxsIHRocmVlIEpBUiBmaWxlcworICAgICg8Y29kZT5qY2VydC5qYXI8L2NvZGU+LCA8Y29kZT5qbmV0LmphcjwvY29kZT4sIGFuZCA8Y29kZT5qc3NlLmphcjwvY29kZT4pCisgICAgaW50byB5b3VyIDxjb2RlPiRKQVZBX0hPTUUvanJlL2xpYi9leHQ8L2NvZGU+IGRpcmVjdG9yeS48L2xpPgorPGxpPkNyZWF0ZSBhIG5ldyBlbnZpcm9ubWVudCB2YXJpYWJsZSA8Y29kZT5KU1NFX0hPTUU8L2NvZGU+IHRoYXQgY29udGFpbnMKKyAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IHVucGFja2VkIHRoZQorICAgIEpTU0UgYmluYXJ5IGRpc3RyaWJ1dGlvbi48L2xpPgorPC91bD4KKworPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJQcmVwYXJlIHRoZSBDZXJ0aWZpY2F0ZSBLZXlzdG9yZSI+CisKKzxwPlRvbWNhdCBjdXJyZW50bHkgb3BlcmF0ZXMgd2l0aCA8Y29kZT5KS1M8L2NvZGU+LCA8Y29kZT5QS0NTMTE8L2NvZGU+IG9yCis8Y29kZT5QS0NTMTI8L2NvZGU+IGZvcm1hdCBrZXlzdG9yZXMuICBUaGUgPGNvZGU+SktTPC9jb2RlPiBmb3JtYXQKK2lzIEphdmEncyBzdGFuZGFyZCAiSmF2YSBLZXlTdG9yZSIgZm9ybWF0LCBhbmQgaXMgdGhlIGZvcm1hdCBjcmVhdGVkIGJ5IHRoZQorPGNvZGU+a2V5dG9vbDwvY29kZT4gY29tbWFuZC1saW5lIHV0aWxpdHkuICBUaGlzIHRvb2wgaXMgaW5jbHVkZWQgaW4gdGhlIEpESy4KK1RoZSA8Y29kZT5QS0NTMTI8L2NvZGU+IGZvcm1hdCBpcyBhbiBpbnRlcm5ldCBzdGFuZGFyZCwgYW5kIGNhbiBiZSBtYW5pcHVsYXRlZAordmlhIChhbW9uZyBvdGhlciB0aGluZ3MpIE9wZW5TU0wgYW5kIE1pY3Jvc29mdCdzIEtleS1NYW5hZ2VyLgorPC9wPgorCis8cD5FYWNoIGVudHJ5IGluIGEga2V5c3RvcmUgaXMgaWRlbnRpZmllZCBieSBhbiBhbGlhcyBzdHJpbmcuIFdoaWxzdCBtYW55CitrZXlzdG9yZSBpbXBsbWVudGF0aW9ucyB0cmVhdCBhbGFpc2VzIGluIGEgY2FzZSBpbnNlbnNpdGl2ZSBtYW5uZXIsIGNhc2UKK3NlbnNpdGl2ZSBpbXBsZW1lbnRhdGlvbnMgYXJlIGF2YWlsYWJsZS4gVGhlIDxjb2RlPlBLQ1MxMTwvY29kZT4gc3BlY2lmaWNhdGlvbiwKK2ZvciBleGFtcGxlLCByZXF1aXJlcyB0aGF0IGFsaWFzZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLiBUbyBhdm9pZCBpc3N1ZXMgcmVsYXRlZAordG8gdGhlIGNhc2Ugc2Vuc2l0aXZpdHkgb2YgYWxpYWlzZXMsIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgYWxpYXNlcyB0aGF0CitkaWZmZXIgb25seSBpbiBjYXNlLgorPC9wPgorCis8cD5UbyBpbXBvcnQgYW4gZXhpc3RpbmcgY2VydGlmaWNhdGUgaW50byBhIEpLUyBrZXlzdG9yZSwgcGxlYXNlIHJlYWQgdGhlCitkb2N1bWVudGF0aW9uIChpbiB5b3VyIEpESyBkb2N1bWVudGF0aW9uIHBhY2thZ2UpIGFib3V0IDxjb2RlPmtleXRvb2w8L2NvZGU+LgorTm90ZSB0aGF0IG9wZW5zc2wgb2Z0ZW4gYWRkcyBhIHJlYWRhYmxlIGNvbW1lbnRzIGJlZm9yZSB0aGUga2V5LCA8Y29kZT5rZXl0b29sPC9jb2RlPmRvZXMgbm90IHN1cHBvcnQgdGhhdCwgc28gcmVtb3ZlIHRoZSBvcGVuc3NsIGNvbW1lbnRzIGlmIHRoZXkgZXhpc3QgYmVmb3JlIGltcG9ydGluZyB0aGUga2V5IHVzaW5nIDxjb2RlPmtleXRvb2w8L2NvZGU+LgorPC9wPgorPHA+VG8gaW1wb3J0IGFuIGV4aXN0aW5nIGNlcnRpZmljYXRlIHNpZ25lZCBieSB5b3VyIG93biBDQSBpbnRvIGEgUEtDUzEyIAora2V5c3RvcmUgdXNpbmcgT3BlblNTTCB5b3Ugd291bGQgZXhlY3V0ZSBhIGNvbW1hbmQgbGlrZToKKzxzb3VyY2U+b3BlbnNzbCBwa2NzMTIgLWV4cG9ydCAtaW4gbXljZXJ0LmNydCAtaW5rZXkgbXlrZXkua2V5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC1vdXQgbXljZXJ0LnAxMiAtbmFtZSB0b21jYXQgLUNBZmlsZSBteUNBLmNydCBcCisgICAgICAgICAgICAgICAgICAgICAgICAtY2FuYW1lIHJvb3QgLWNoYWluCis8L3NvdXJjZT4KK0ZvciBtb3JlIGFkdmFuY2VkIGNhc2VzLCBjb25zdWx0IHRoZSA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5zc2wub3JnLyI+T3BlblNTTAorZG9jdW1lbnRlbnRhdGlvbjwvYT4uCis8L3A+Cis8cD5UbyBjcmVhdGUgYSBuZXcga2V5c3RvcmUgZnJvbSBzY3JhdGNoLCBjb250YWluaW5nIGEgc2luZ2xlIHNlbGYtc2lnbmVkCitDZXJ0aWZpY2F0ZSwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGZyb20gYSB0ZXJtaW5hbCBjb21tYW5kIGxpbmU6PC9wPgorPHA+V2luZG93czo8L3A+Cis8c291cmNlPgorJUpBVkFfSE9NRSVcYmluXGtleXRvb2wgLWdlbmtleSAtYWxpYXMgdG9tY2F0IC1rZXlhbGcgUlNBCis8L3NvdXJjZT4KKzxwPlVuaXg6PC9wPgorPHNvdXJjZT4KKyRKQVZBX0hPTUUvYmluL2tleXRvb2wgLWdlbmtleSAtYWxpYXMgdG9tY2F0IC1rZXlhbGcgUlNBCis8L3NvdXJjZT4KKworPHA+KFRoZSBSU0EgYWxnb3JpdGhtIHNob3VsZCBiZSBwcmVmZXJyZWQgYXMgYSBzZWN1cmUgYWxnb3JpdGhtLCBhbmQgdGhpcworYWxzbyBlbnN1cmVzIGdlbmVyYWwgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHNlcnZlcnMgYW5kIGNvbXBvbmVudHMuKTwvcD4KKworPHA+VGhpcyBjb21tYW5kIHdpbGwgY3JlYXRlIGEgbmV3IGZpbGUsIGluIHRoZSBob21lIGRpcmVjdG9yeSBvZiB0aGUgdXNlcgordW5kZXIgd2hpY2ggeW91IHJ1biBpdCwgbmFtZWQgIjxjb2RlPi5rZXlzdG9yZTwvY29kZT4iLiAgVG8gc3BlY2lmeSBhCitkaWZmZXJlbnQgbG9jYXRpb24gb3IgZmlsZW5hbWUsIGFkZCB0aGUgPGNvZGU+LWtleXN0b3JlPC9jb2RlPiBwYXJhbWV0ZXIsCitmb2xsb3dlZCBieSB0aGUgY29tcGxldGUgcGF0aG5hbWUgdG8geW91ciBrZXlzdG9yZSBmaWxlLAordG8gdGhlIDxjb2RlPmtleXRvb2w8L2NvZGU+IGNvbW1hbmQgc2hvd24gYWJvdmUuICBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8KK3JlZmxlY3QgdGhpcyBuZXcgbG9jYXRpb24gaW4gdGhlIDxjb2RlPnNlcnZlci54bWw8L2NvZGU+IGNvbmZpZ3VyYXRpb24gZmlsZSwKK2FzIGRlc2NyaWJlZCBsYXRlci4gIEZvciBleGFtcGxlOjwvcD4KKzxwPldpbmRvd3M6PC9wPgorPHNvdXJjZT4KKyVKQVZBX0hPTUUlXGJpblxrZXl0b29sIC1nZW5rZXkgLWFsaWFzIHRvbWNhdCAta2V5YWxnIFJTQSBcCisgIC1rZXlzdG9yZSBccGF0aFx0b1xteVxrZXlzdG9yZQorPC9zb3VyY2U+Cis8cD5Vbml4OjwvcD4KKzxzb3VyY2U+CiskSkFWQV9IT01FL2Jpbi9rZXl0b29sIC1nZW5rZXkgLWFsaWFzIHRvbWNhdCAta2V5YWxnIFJTQSBcCisgIC1rZXlzdG9yZSAvcGF0aC90by9teS9rZXlzdG9yZQorPC9zb3VyY2U+CisKKzxwPkFmdGVyIGV4ZWN1dGluZyB0aGlzIGNvbW1hbmQsIHlvdSB3aWxsIGZpcnN0IGJlIHByb21wdGVkIGZvciB0aGUga2V5c3RvcmUKK3Bhc3N3b3JkLiAgVGhlIGRlZmF1bHQgcGFzc3dvcmQgdXNlZCBieSBUb21jYXQgaXMgIjxjb2RlPmNoYW5nZWl0PC9jb2RlPiIKKyhhbGwgbG93ZXIgY2FzZSksIGFsdGhvdWdoIHlvdSBjYW4gc3BlY2lmeSBhIGN1c3RvbSBwYXNzd29yZCBpZiB5b3UgbGlrZS4KK1lvdSB3aWxsIGFsc28gbmVlZCB0byBzcGVjaWZ5IHRoZSBjdXN0b20gcGFzc3dvcmQgaW4gdGhlCis8Y29kZT5zZXJ2ZXIueG1sPC9jb2RlPiBjb25maWd1cmF0aW9uIGZpbGUsIGFzIGRlc2NyaWJlZCBsYXRlci48L3A+CisKKzxwPk5leHQsIHlvdSB3aWxsIGJlIHByb21wdGVkIGZvciBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgQ2VydGlmaWNhdGUsCitzdWNoIGFzIGNvbXBhbnksIGNvbnRhY3QgbmFtZSwgYW5kIHNvIG9uLiAgVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIGRpc3BsYXllZAordG8gdXNlcnMgd2hvIGF0dGVtcHQgdG8gYWNjZXNzIGEgc2VjdXJlIHBhZ2UgaW4geW91ciBhcHBsaWNhdGlvbiwgc28gbWFrZQorc3VyZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBoZXJlIG1hdGNoZXMgd2hhdCB0aGV5IHdpbGwgZXhwZWN0LjwvcD4KKworPHA+RmluYWxseSwgeW91IHdpbGwgYmUgcHJvbXB0ZWQgZm9yIHRoZSA8ZW0+a2V5IHBhc3N3b3JkPC9lbT4sIHdoaWNoIGlzIHRoZQorcGFzc3dvcmQgc3BlY2lmaWNhbGx5IGZvciB0aGlzIENlcnRpZmljYXRlIChhcyBvcHBvc2VkIHRvIGFueSBvdGhlcgorQ2VydGlmaWNhdGVzIHN0b3JlZCBpbiB0aGUgc2FtZSBrZXlzdG9yZSBmaWxlKS4gIFlvdSA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4KK3VzZSB0aGUgc2FtZSBwYXNzd29yZCBoZXJlIGFzIHdhcyB1c2VkIGZvciB0aGUga2V5c3RvcmUgcGFzc3dvcmQgaXRzZWxmLgorKEN1cnJlbnRseSwgdGhlIDxjb2RlPmtleXRvb2w8L2NvZGU+IHByb21wdCB3aWxsIHRlbGwgeW91IHRoYXQgcHJlc3NpbmcgdGhlCitFTlRFUiBrZXkgZG9lcyB0aGlzIGZvciB5b3UgYXV0b21hdGljYWxseS4pPC9wPgorCis8cD5JZiBldmVyeXRoaW5nIHdhcyBzdWNjZXNzZnVsLCB5b3Ugbm93IGhhdmUgYSBrZXlzdG9yZSBmaWxlIHdpdGggYQorQ2VydGlmaWNhdGUgdGhhdCBjYW4gYmUgdXNlZCBieSB5b3VyIHNlcnZlci48L3A+CisKKzxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4geW91ciBwcml2YXRlIGtleSBwYXNzd29yZCBhbmQga2V5c3RvcmUgcGFzc3dvcmQKK3Nob3VsZCBiZSB0aGUgc2FtZS4gIElmIHRoZXkgZGlmZmVyLCB5b3Ugd2lsbCBnZXQgYW4gZXJyb3IgYWxvbmcgdGhlIGxpbmVzCitvZiA8Y29kZT5qYXZhLmlvLklPRXhjZXB0aW9uOiBDYW5ub3QgcmVjb3ZlciBrZXk8L2NvZGU+LCBhcyBkb2N1bWVudGVkIGluIAorPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zODIxNyI+QnVnemlsbGEgMzgyMTc8L2E+LCAKK3doaWNoIGNvbnRhaW5zIGZ1cnRoZXIgcmVmZXJlbmNlcyBmb3IgdGhpcyBpc3N1ZS48L3A+CisKKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iRWRpdCB0aGUgVG9tY2F0IENvbmZpZ3VyYXRpb24gRmlsZSI+CisKKzxwPlRoZSBmaW5hbCBzdGVwIGlzIHRvIGNvbmZpZ3VyZSB5b3VyIHNlY3VyZSBzb2NrZXQgaW4gdGhlCis8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3NlcnZlci54bWw8L2NvZGU+IGZpbGUsIHdoZXJlCis8Y29kZT4kQ0FUQUxJTkFfSE9NRTwvY29kZT4gcmVwcmVzZW50cyB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91CitpbnN0YWxsZWQgVG9tY2F0IDUuICBBbiBleGFtcGxlIDxjb2RlPiZsdDtDb25uZWN0b3ImZ3Q7PC9jb2RlPiBlbGVtZW50Citmb3IgYW4gU1NMIGNvbm5lY3RvciBpcyBpbmNsdWRlZCBpbiB0aGUgZGVmYXVsdCA8Y29kZT5zZXJ2ZXIueG1sPC9jb2RlPgorZmlsZSBpbnN0YWxsZWQgd2l0aCBUb21jYXQuICBJdCB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorJmx0Oy0tIERlZmluZSBhIFNTTCBDb3lvdGUgSFRUUC8xLjEgQ29ubmVjdG9yIG9uIHBvcnQgODQ0MyAtLSZndDsKKyZsdDshLS0KKyZsdDtDb25uZWN0b3IgCisgICAgICAgICAgIHBvcnQ9Ijg0NDMiIG1pblByb2Nlc3NvcnM9IjUiIG1heFByb2Nlc3NvcnM9Ijc1IgorICAgICAgICAgICBlbmFibGVMb29rdXBzPSJ0cnVlIiBkaXNhYmxlVXBsb2FkVGltZW91dD0idHJ1ZSIKKyAgICAgICAgICAgYWNjZXB0Q291bnQ9IjEwMCIgZGVidWc9IjAiIHNjaGVtZT0iaHR0cHMiIHNlY3VyZT0idHJ1ZSI7CisgICAgICAgICAgIGNsaWVudEF1dGg9ImZhbHNlIiBzc2xQcm90b2NvbD0iVExTIi8mZ3Q7CistLSZndDsKKzwvc291cmNlPgorCis8cD5Zb3Ugd2lsbCBub3RlIHRoYXQgdGhlIENvbm5lY3RvciBlbGVtZW50IGl0c2VsZiBpcyBjb21tZW50ZWQgb3V0IGJ5IGRlZmF1bHQsCitzbyB5b3Ugd2lsbCBuZWVkIHRvIHJlbW92ZSB0aGUgY29tbWVudCB0YWdzIGFyb3VuZCBpdC4gIFRoZW4sIHlvdSBjYW4KK2N1c3RvbWl6ZSB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZXMgYXMgbmVjZXNzYXJ5LiAgRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uCithYm91dCB0aGUgdmFyaW91cyBvcHRpb25zLCBjb25zdWx0IHRoZQorPGEgaHJlZj0iY29uZmlnL2luZGV4Lmh0bWwiPlNlcnZlciBDb25maWd1cmF0aW9uIFJlZmVyZW5jZTwvYT4uICBUaGUKK2ZvbGxvd2luZyBkaXNjdXNzaW9uIGNvdmVycyBvbmx5IHRob3NlIGF0dHJpYnV0ZXMgb2YgbW9zdCBpbnRlcmVzdCB3aGVuCitzZXR0aW5nIHVwIFNTTCBjb21tdW5pY2F0aW9uLjwvcD4KKworPHA+VGhlIDxjb2RlPnBvcnQ8L2NvZGU+IGF0dHJpYnV0ZSAoZGVmYXVsdCB2YWx1ZSBpcyA4NDQzKSBpcyB0aGUgVENQL0lQCitwb3J0IG51bWJlciBvbiB3aGljaCBUb21jYXQgd2lsbCBsaXN0ZW4gZm9yIHNlY3VyZSBjb25uZWN0aW9ucy4gIFlvdSBjYW4KK2NoYW5nZSB0aGlzIHRvIGFueSBwb3J0IG51bWJlciB5b3Ugd2lzaCAoc3VjaCBhcyB0byB0aGUgZGVmYXVsdCBwb3J0IGZvcgorPGNvZGU+aHR0cHM8L2NvZGU+IGNvbW11bmljYXRpb25zLCB3aGljaCBpcyA0NDMpLiAgSG93ZXZlciwgc3BlY2lhbCBzZXR1cAorKG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgZG9jdW1lbnQpIGlzIG5lY2Vzc2FyeSB0byBydW4gVG9tY2F0IG9uIHBvcnQKK251bWJlcnMgbG93ZXIgdGhhbiAxMDI0IG9uIG1hbnkgb3BlcmF0aW5nIHN5c3RlbXMuPC9wPgorCisgIDxibG9ja3F1b3RlPjxlbT4KKyAgPHA+SWYgeW91IGNoYW5nZSB0aGUgcG9ydCBudW1iZXIgaGVyZSwgeW91IHNob3VsZCBhbHNvIGNoYW5nZSB0aGUKKyAgdmFsdWUgc3BlY2lmaWVkIGZvciB0aGUgPGNvZGU+cmVkaXJlY3RQb3J0PC9jb2RlPiBhdHRyaWJ1dGUgb24gdGhlCisgIG5vbi1TU0wgY29ubmVjdG9yLiAgVGhpcyBhbGxvd3MgVG9tY2F0IHRvIGF1dG9tYXRpY2FsbHkgcmVkaXJlY3QKKyAgdXNlcnMgd2hvIGF0dGVtcHQgdG8gYWNjZXNzIGEgcGFnZSB3aXRoIGEgc2VjdXJpdHkgY29uc3RyYWludCBzcGVjaWZ5aW5nCisgIHRoYXQgU1NMIGlzIHJlcXVpcmVkLCBhcyByZXF1aXJlZCBieSB0aGUgU2VydmxldCAyLjQgU3BlY2lmaWNhdGlvbi48L3A+CisgIDwvZW0+PC9ibG9ja3F1b3RlPgorCis8cD5UaGVyZSBhcmUgYWRkaW9uYWwgb3B0aW9uIHVzZWQgdG8gY29uZmlndXJlIHRoZSBTU0wgcHJvdG9jb2wuCisgIFlvdSBtYXkgbmVlZCB0byBhZGQgb3IgY2hhbmdlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlCit2YWx1ZXMsIGRlcGVuZGluZyBvbiBob3cgeW91IGNvbmZpZ3VyZWQgeW91ciBrZXlzdG9yZSBlYXJsaWVyOjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSI+CisgIDx0cj4KKyAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAgICA8dGg+RGVzY3JpcHRpb248L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPjxjb2RlPmNsaWVudEF1dGg8L2NvZGU+PC90ZD4KKyAgICA8dGQ+U2V0IHRoaXMgdmFsdWUgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdhbnQgVG9tY2F0IHRvIHJlcXVpcmUKKyAgICAgICAgYWxsIFNTTCBjbGllbnRzIHRvIHByZXNlbnQgYSBjbGllbnQgQ2VydGlmaWNhdGUgaW4gb3JkZXIgdG8gdXNlCisgICAgICAgIHRoaXMgc29ja2V0LiAgU2V0IHRoaXMgdmFsdWUgdG8gPGNvZGU+d2FudDwvY29kZT4gaWYgeW91IHdhbnQgVG9tY2F0CisgICAgICAgIHRvIHJlcXVlc3QgYSBjbGllbnQgQ2VydGlmaWNhdGUsIGJ1dCBub3QgZmFpbCBpZiBvbmUgaXNuJ3QgcHJlc2VudGVkLgorICAgICAgICBGb3IgdXNpbmcgY2xpZW50QXV0aCBvbiBhIHBlci11c2VyIG9yIHBlci1zZXNzaW9uIGJhc2lzLCBjaGVjayBvdXQKKyAgICAgICAgdGhlIHRpcHMgaW4gCisgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzQ2NDMiIHRpdGxlPSJCdWd6aWxsYSAzNDY0MyI+QnVnemlsbGEgMzQ2NDM8L2E+LgorICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+a2V5c3RvcmVGaWxlPC9jb2RlPjwvdGQ+CisgICAgPHRkPkFkZCB0aGlzIGF0dHJpYnV0ZSBpZiB0aGUga2V5c3RvcmUgZmlsZSB5b3UgY3JlYXRlZCBpcyBub3QgaW4KKyAgICAgICAgdGhlIGRlZmF1bHQgcGxhY2UgdGhhdCBUb21jYXQgZXhwZWN0cyAoYSBmaWxlIG5hbWVkCisgICAgICAgIDxjb2RlPi5rZXlzdG9yZTwvY29kZT4gaW4gdGhlIHVzZXIgaG9tZSBkaXJlY3RvcnkgdW5kZXIKKyAgICAgICAgd2hpY2ggVG9tY2F0IGlzIHJ1bm5pbmcpLiAgWW91IGNhbiBzcGVjaWZ5IGFuIGFic29sdXRlIHBhdGhuYW1lLAorICAgICAgICBvciBhIHJlbGF0aXZlIHBhdGhuYW1lIHRoYXQgaXMgcmVzb2x2ZWQgYWdhaW5zdCB0aGUKKyAgICAgICAgPGNvZGU+JENBVEFMSU5BX0JBU0U8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+a2V5c3RvcmVQYXNzPC9jb2RlPjwvdGQ+CisgICAgPHRkPkFkZCB0aGlzIGVsZW1lbnQgaWYgeW91IHVzZWQgYSBkaWZmZXJlbnQga2V5c3RvcmUgKGFuZCBDZXJ0aWZpY2F0ZSkKKyAgICAgICAgcGFzc3dvcmQgdGhhbiB0aGUgb25lIFRvbWNhdCBleHBlY3RzICg8Y29kZT5jaGFuZ2VpdDwvY29kZT4pLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+a2V5c3RvcmVUeXBlPC9jb2RlPjwvdGQ+CisgICAgPHRkPkFkZCB0aGlzIGVsZW1lbnQgaWYgdXNpbmcgYSBrZXlzdG9yZSB0eXBlIG90aGVyIHRoYW4KKyAgICA8Y29kZT5KS1M8L2NvZGU+LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+c3NsUHJvdG9jb2w8L2NvZGU+PC90ZD4KKyAgICA8dGQ+VGhlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwcm90b2NvbCB0byBiZSB1c2VkIG9uIHRoaXMgc29ja2V0LgorICAgICAgICBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gY2hhbmdlIHRoaXMgdmFsdWUgaWYgeW91IGFyZSB1c2luZyBTdW4ncworICAgICAgICBKVk0uICBJdCBpcyByZXBvcnRlZCB0aGF0IElCTSdzIDEuNC4xIGltcGxlbWVudGF0aW9uCisgICAgICAgIG9mIHRoZSBUTFMgcHJvdG9jb2wgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBzb21lIHBvcHVsYXIgYnJvd3NlcnMuCisgICAgICAgIEluIHRoaXMgY2FzZSwgdXNlIHRoZSB2YWx1ZSA8Y29kZT5TU0w8L2NvZGU+LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+Y2lwaGVyczwvY29kZT48L3RkPgorICAgIDx0ZD5UaGUgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZW5jcnlwdGlvbiBjaXBoZXJzIHRoYXQgdGhpcyBzb2NrZXQgaXMgCisgICAgICAgIGFsbG93ZWQgdG8gdXNlLiAgQnkgZGVmYXVsdCwgYW55IGF2YWlsYWJsZSBjaXBoZXIgaXMgYWxsb3dlZC48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPjxjb2RlPmFsZ29yaXRobTwvY29kZT48L3RkPgorICAgIDx0ZD5UaGUgPGNvZGU+WDUwOTwvY29kZT4gYWxnb3JpdGhtIHRvIHVzZS4gIFRoaXMgZGVmYXVsdHMgdG8gdGhlIFN1biAKKyAgICAgICAgaW1wbGVtZW50YXRpb24gKDxjb2RlPlN1blg1MDk8L2NvZGU+KS4gIEZvciBJQk0gSlZNcyB5b3Ugc2hvdWxkIHVzZQorICAgICAgICB0aGUgdmFsdWUgPGNvZGU+SWJtWDUwOTwvY29kZT4uICBGb3Igb3RoZXIgdmVuZG9ycywgY29uc3VsdCB0aGUgSlZNCisgICAgICAgIGRvY3VtZW50YXRpb24gZm9yIHRoZSBjb3JyZWN0IHZhbHVlLgorICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgIDx0ZD48Y29kZT50cnVzdHN0b3JlRmlsZTwvY29kZT48L3RkPgorICAgPHRkPlRoZSBUcnVzdFN0b3JlIGZpbGUgdG8gdXNlIHRvIHZhbGlkYXRlIGNsaWVudCBjZXJ0aWZpY2F0ZXMuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgPHRkPjxjb2RlPnRydXN0c3RvcmVQYXNzPC9jb2RlPjwvdGQ+CisgICA8dGQ+VGhlIHBhc3N3b3JkIHRvIGFjY2VzcyB0aGUgVHJ1c3RTdG9yZS4gIFRoaXMgZGVmYXVsdHMgdG8gdGhlIHZhbHVlCisgICAgICAgb2YgPGNvZGU+a2V5c3RvcmVQYXNzPC9jb2RlPi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICA8dGQ+PGNvZGU+dHJ1c3RzdG9yZVR5cGU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+QWRkIHRoaXMgZWxlbWVudCBpZiB5b3VyIGFyZSB1c2luZyBhIGRpZmZlcmVudCBmb3JtYXQgZm9yIHRoZSAKKyAgICAgICAgVHJ1c3RTdG9yZSB0aGVuIHlvdSBhcmUgdXNpbmcgZm9yIHRoZSBLZXlTdG9yZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICA8dGQ+PGNvZGU+a2V5QWxpYXM8L2NvZGU+PC90ZD4KKyAgICA8dGQ+QWRkIHRoaXMgZWxlbWVudCBpZiB5b3VyIGhhdmUgbW9yZSB0aGFuIG9uZSBrZXkgaW4gdGhlIEtleVN0b3JlLgorICAgICAgICBJZiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudCB0aGUgZmlyc3Qga2V5IHJlYWQgaW4gdGhlIEtleVN0b3JlCisgICAgICAgIHdpbGwgYmUgdXNlZC48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+QWZ0ZXIgY29tcGxldGluZyB0aGVzZSBjb25maWd1cmF0aW9uIGNoYW5nZXMsIHlvdSBtdXN0IHJlc3RhcnQgVG9tY2F0IGFzCit5b3Ugbm9ybWFsbHkgZG8sIGFuZCB5b3Ugc2hvdWxkIGJlIGluIGJ1c2luZXNzLiAgWW91IHNob3VsZCBiZSBhYmxlIHRvIGFjY2VzcworYW55IHdlYiBhcHBsaWNhdGlvbiBzdXBwb3J0ZWQgYnkgVG9tY2F0IHZpYSBTU0wuICBGb3IgZXhhbXBsZSwgdHJ5OjwvcD4KKzxzb3VyY2U+CitodHRwczovL2xvY2FsaG9zdDo4NDQzCis8L3NvdXJjZT4KKworPHA+YW5kIHlvdSBzaG91bGQgc2VlIHRoZSB1c3VhbCBUb21jYXQgc3BsYXNoIHBhZ2UgKHVubGVzcyB5b3UgaGF2ZSBtb2RpZmllZAordGhlIFJPT1Qgd2ViIGFwcGxpY2F0aW9uKS4gIElmIHRoaXMgZG9lcyBub3Qgd29yaywgdGhlIGZvbGxvd2luZyBzZWN0aW9uCitjb250YWlucyBzb21lIHRyb3VibGVzaG9vdGluZyB0aXBzLjwvcD4KKworPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9Ikluc3RhbGxpbmcgYSBDZXJ0aWZpY2F0ZSBmcm9tIGEgQ2VydGlmaWNhdGUgQXV0aG9yaXR5Ij4KKzxwPlRvIG9ic3RhaW4gYW5kIGluc3RhbGwgYSBDZXJ0aWZpY2F0ZSBmcm9tIGEgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IChsaWtlIHZlcmlzaWduLmNvbSwgdGhhd3RlLmNvbSAKK29yIHRydXN0Y2VudGVyLmRlKSB5b3Ugc2hvdWxkIGhhdmUgcmVhZCB0aGUgcHJldmlvdXMgc2VjdGlvbiBhbmQgdGhlbiBmb2xsb3cgdGhlc2UgaW5zdHJ1Y3Rpb25zOjwvcD4KKworPHN1YnNlY3Rpb24gbmFtZT0iQ3JlYXRlIGEgbG9jYWwgQ2VydGlmaWNhdGUgU2lnbmluZyBSZXF1ZXN0IChDU1IpIj4KKzxwPkluIG9yZGVyIHRvIG9idGFpbiBhIENlcnRpZmljYXRlIGZyb20gdGhlIENlcnRpZmljYXRlIEF1dGhvcml0eSBvZiB5b3VyIGNob2ljZSAKK3lvdSBoYXZlIHRvIGNyZWF0ZSBhIHNvIGNhbGxlZCBDZXJ0aWZpY2F0ZSBTaWduaW5nIFJlcXVlc3QgKENTUikuIFRoYXQgQ1NSIHdpbGwgYmUgdXNlZCAKK2J5IHRoZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgdG8gY3JlYXRlIGEgQ2VydGlmaWNhdGUgdGhhdCB3aWxsIGlkZW50aWZ5IHlvdXIgd2Vic2l0ZSAKK2FzICJzZWN1cmUiLiBUbyBjcmVhdGUgYSBDU1IgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KKzx1bD4KKzxsaT5DcmVhdGUgYSBsb2NhbCBDZXJ0aWZpY2F0ZSAoYXMgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uKToKKwk8c291cmNlPmtleXRvb2wgLWdlbmtleSAtYWxpYXMgdG9tY2F0IC1rZXlhbGcgUlNBIFwKKwkta2V5c3RvcmUgJmx0O3lvdXJfa2V5c3RvcmVfZmlsZW5hbWUmZ3Q7PC9zb3VyY2U+CisJTm90ZTogSW4gc29tZSBjYXNlcyB5b3Ugd2lsbCBoYXZlIHRvIGVudGVyIHRoZSBkb21haW4gb2YgeW91ciB3ZWJzaXRlIChpLmUuIDxjb2RlPnd3dy5teXNpZGUub3JnPC9jb2RlPikKKwlpbiB0aGUgZmllbGQgImZpcnN0LSBhbmQgbGFzdG5hbWUiIGluIG9yZGVyIHRvIGNyZWF0ZSBhIHdvcmtpbmcgQ2VydGlmaWNhdGUuIAorPC9saT4KKzxsaT5UaGUgQ1NSIGlzIHRoZW4gY3JlYXRlZCB3aXRoOgorCTxzb3VyY2U+a2V5dG9vbCAtY2VydHJlcSAta2V5YWxnIFJTQSAtYWxpYXMgdG9tY2F0IC1maWxlIGNlcnRyZXEuY3NyIFwKKwkta2V5c3RvcmUgJmx0O3lvdXJfa2V5c3RvcmVfZmlsZW5hbWUmZ3Q7PC9zb3VyY2U+Cis8L2xpPgorPC91bD4KKzxwPk5vdyB5b3UgaGF2ZSBhIGZpbGUgY2FsbGVkIDxjb2RlPmNlcnRyZXEuY3NyPC9jb2RlPiB0aGF0IHlvdSBjYW4gc3VibWl0IHRvIHRoZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKGxvb2sgYXQgdGhlCitkb2N1bWVudGF0aW9uIG9mIHRoZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgd2Vic2l0ZSBvbiBob3cgdG8gZG8gdGhpcykuIEluIHJldHVybiB5b3UgZ2V0IGEgQ2VydGlmaWNhdGUuPC9wPgorPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJJbXBvcnRpbmcgdGhlIENlcnRpZmljYXRlIj4KKzxwPk5vdyB0aGF0IHlvdSBoYXZlIHlvdXIgQ2VydGlmaWNhdGUgeW91IGNhbiBpbXBvcnQgaXQgaW50byB5b3UgbG9jYWwga2V5c3RvcmUuIAorRmlyc3Qgb2YgYWxsIHlvdSBoYXZlIHRvIGltcG9ydCBhIHNvIGNhbGxlZCBDaGFpbiBDZXJ0aWZpY2F0ZSBvciBSb290IENlcnRpZmljYXRlIGludG8geW91ciBrZXlzdG9yZS4gCitBZnRlciB0aGF0IHlvdSBjYW4gcHJvY2VkZSB3aXRoIGltcG9ydGluZyB5b3VyIENlcnRpZmljYXRlLjwvcD4KKworPHVsPgorPGxpPkRvd25sb2FkIGEgQ2hhaW4gQ2VydGlmaWNhdGUgZnJvbSB0aGUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IHlvdSBvYnRhaW5lZCB0aGUgQ2VydGlmaWNhdGUgZnJvbS48YnIvPgorCUZvciBWZXJpc2lnbi5jb20gY29tbWVyY2lhbCBjZXJ0aWZpY2F0ZXMgZ28gdG86CisgICAgICAgICAgICBodHRwOi8vd3d3LnZlcmlzaWduLmNvbS9zdXBwb3J0L2luc3RhbGwvaW50ZXJtZWRpYXRlLmh0bWw8YnIvPgorICAgICAgICBGb3IgVmVyaXNpZ24uY29tIHRyaWFsIGNlcnRpZmljYXRlcyBnbyB0bzoKKyAgICAgICAgICAgIGh0dHA6Ly93d3cudmVyaXNpZ24uY29tL3N1cHBvcnQvdmVyaXNpZ24taW50ZXJtZWRpYXRlLWNhL1RyaWFsX1NlY3VyZV9TZXJ2ZXJfUm9vdC9pbmRleC5odG1sCisJRm9yIFRydXN0Y2VudGVyLmRlIGdvIHRvOgorICAgICAgICAgICAgaHR0cDovL3d3dy50cnVzdGNlbnRlci5kZS9jZXJ0c2VydmljZXMvY2FjZXJ0cy9lbi9lbi5odG0jc2VydmVyPGJyLz4KKwlGb3IgVGhhd3RlLmNvbSBnbyB0bzoKKyAgICAgICAgICAgIGh0dHA6Ly93d3cudGhhd3RlLmNvbS9jZXJ0cy90cnVzdG1hcC5odG1sPGJyLz4KKzwvbGk+Cis8bGk+SW1wb3J0IHRoZSBDaGFpbiBDZXJ0aWZpY2F0ZSBpbnRvIHlvdSBrZXlzdG9yZQorICAgIDxzb3VyY2U+a2V5dG9vbCAtaW1wb3J0IC1hbGlhcyByb290IC1rZXlzdG9yZSAmbHQ7eW91cl9rZXlzdG9yZV9maWxlbmFtZSZndDsgXAorCS10cnVzdGNhY2VydHMgLWZpbGUgJmx0O2ZpbGVuYW1lX29mX3RoZV9jaGFpbl9jZXJ0aWZpY2F0ZSZndDs8L3NvdXJjZT4KKzwvbGk+Cis8bGk+QW5kIGZpbmFsbHkgaW1wb3J0IHlvdXIgbmV3IENlcnRpZmljYXRlCisJPHNvdXJjZT5rZXl0b29sIC1pbXBvcnQgLWFsaWFzIHRvbWNhdCAta2V5c3RvcmUgJmx0O3lvdXJfa2V5c3RvcmVfZmlsZW5hbWUmZ3Q7IFwKKwktdHJ1c3RjYWNlcnRzIC1maWxlICZsdDt5b3VyX2NlcnRpZmljYXRlX2ZpbGVuYW1lJmd0Ozwvc291cmNlPgorPC9saT4KKzwvdWw+Cis8L3N1YnNlY3Rpb24+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlRyb3VibGVzaG9vdGluZyI+CisKKzxwPkhlcmUgaXMgYSBsaXN0IG9mIGNvbW1vbiBwcm9ibGVtcyB0aGF0IHlvdSBtYXkgZW5jb3VudGVyIHdoZW4gc2V0dGluZyB1cAorU1NMIGNvbW11bmljYXRpb25zLCBhbmQgd2hhdCB0byBkbyBhYm91dCB0aGVtLjwvcD4KKworPHVsPgorCis8bGk+SSBnZXQgImphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIiBlcnJvcnMgaW4gbXkKKyAgICBsb2cgZmlsZXMuCisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+VGhlIEpWTSBjYW5ub3QgZmluZCB0aGUgSlNTRSBKQVIgZmlsZXMuICBGb2xsb3cgYWxsIG9mIHRoZSBkaXJlY3Rpb25zIHRvCisgICAgPGEgaHJlZj0iI0Rvd25sb2FkIGFuZCBJbnN0YWxsIEpTU0UiPmRvd25sb2FkIGFuZCBpbnN0YWxsIEpTU0U8L2E+LjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKworPGxpPldoZW4gVG9tY2F0IHN0YXJ0cyB1cCwgSSBnZXQgYW4gZXhjZXB0aW9uIGxpa2UKKyAgICAiamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb246IHtzb21lLWRpcmVjdG9yeX0ve3NvbWUtZmlsZX0gbm90IGZvdW5kIi4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5BIGxpa2VseSBleHBsYW5hdGlvbiBpcyB0aGF0IFRvbWNhdCBjYW5ub3QgZmluZCB0aGUga2V5c3RvcmUgZmlsZQorICAgIHdoZXJlIGl0IGlzIGxvb2tpbmcuICBCeSBkZWZhdWx0LCBUb21jYXQgZXhwZWN0cyB0aGUga2V5c3RvcmUgZmlsZSB0bworICAgIGJlIG5hbWVkIDxjb2RlPi5rZXlzdG9yZTwvY29kZT4gaW4gdGhlIHVzZXIgaG9tZSBkaXJlY3RvcnkgdW5kZXIgd2hpY2gKKyAgICBUb21jYXQgaXMgcnVubmluZyAod2hpY2ggbWF5IG9yIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgeW91cnMgOi0pLiAgSWYKKyAgICB0aGUga2V5c3RvcmUgZmlsZSBpcyBhbnl3aGVyZSBlbHNlLCB5b3Ugd2lsbCBuZWVkIHRvIGFkZCBhCisgICAgPGNvZGU+a2V5c3RvcmVGaWxlPC9jb2RlPiBhdHRyaWJ1dGUgdG8gdGhlIDxjb2RlPiZsdDtGYWN0b3J5Jmd0OzwvY29kZT4KKyAgICBlbGVtZW50IGluIHRoZSA8YSBocmVmPSIjRWRpdCB0aGUgVG9tY2F0IENvbmZpZ3VyYXRpb24gRmlsZSI+VG9tY2F0CisgICAgY29uZmlndXJhdGlvbiBmaWxlPC9hPi48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+CisKKzxsaT5XaGVuIFRvbWNhdCBzdGFydHMgdXAsIEkgZ2V0IGFuIGV4Y2VwdGlvbiBsaWtlCisgICAgImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOiAgS2V5c3RvcmUgd2FzIHRhbXBlcmVkIHdpdGgsIG9yCisgICAgcGFzc3dvcmQgd2FzIGluY29ycmVjdCIuCisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+QXNzdW1pbmcgdGhhdCBzb21lb25lIGhhcyBub3QgPGVtPmFjdHVhbGx5PC9lbT4gdGFtcGVyZWQgd2l0aAorICAgIHlvdXIga2V5c3RvcmUgZmlsZSwgdGhlIG1vc3QgbGlrZWx5IGNhdXNlIGlzIHRoYXQgVG9tY2F0IGlzIHVzaW5nCisgICAgYSBkaWZmZXJlbnQgcGFzc3dvcmQgdGhhbiB0aGUgb25lIHlvdSB1c2VkIHdoZW4geW91IGNyZWF0ZWQgdGhlCisgICAga2V5c3RvcmUgZmlsZS4gIFRvIGZpeCB0aGlzLCB5b3UgY2FuIGVpdGhlciBnbyBiYWNrIGFuZAorICAgIDxhIGhyZWY9IiNQcmVwYXJlIHRoZSBDZXJ0aWZpY2F0ZSBLZXlzdG9yZSI+cmVjcmVhdGUgdGhlIGtleXN0b3JlCisgICAgZmlsZTwvYT4sIG9yIHlvdSBjYW4gYWRkIG9yIHVwZGF0ZSB0aGUgPGNvZGU+a2V5c3RvcmVQYXNzPC9jb2RlPgorICAgIGF0dHJpYnV0ZSBvbiB0aGUgPGNvZGU+Jmx0O0Nvbm5lY3RvciZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlCisgICAgPGEgaHJlZj0iI0VkaXQgdGhlIFRvbWNhdCBDb25maWd1cmF0aW9uIEZpbGUiPlRvbWNhdCBjb25maWd1cmF0aW9uCisgICAgZmlsZTwvYT4uICA8c3Ryb25nPlJFTUlOREVSPC9zdHJvbmc+IC0gUGFzc3dvcmRzIGFyZSBjYXNlIHNlbnNpdGl2ZSE8L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+CisKKzxsaT5XaGVuIFRvbWNhdCBzdGFydHMgdXAsIEkgZ2V0IGFuIGV4Y2VwdGlvbiBsaWtlCisgICAgImphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjogU1NMIGhhbmRzaGFrZSBlcnJvcmphdmF4Lm5ldC5zc2wuU1NMRXhjZXB0aW9uOiBObworICAgIGF2YWlsYWJsZSBjZXJ0aWZpY2F0ZSBvciBrZXkgY29ycmVzcG9uZHMgdG8gdGhlIFNTTCBjaXBoZXIgc3VpdGVzIHdoaWNoIGFyZQorICAgIGVuYWJsZWQuIgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPkEgbGlrZWx5IGV4cGxhbmF0aW9uIGlzIHRoYXQgVG9tY2F0IGNhbm5vdCBmaW5kIHRoZSBhbGlhcyBmb3IgdGhlIHNlcnZlcgorICAgIGtleSB3aXRoaW50aGUgc3BlY2lmaWVkIGtleXN0b3JlLiBDaGVjayB0aGF0IHRoZSBjb3JyZWN0CisgICAgPGNvZGU+a2V5c3RvcmVGaWxlPC9jb2RlPiBhbmQgPGNvZGU+a2V5QWxpYXM8L2NvZGU+IGFyZSBzcGVjaWZpZWQgaW4gdGhlCisgICAgPGNvZGU+Jmx0O0Nvbm5lY3RvciZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlCisgICAgPGEgaHJlZj0iI0VkaXQgdGhlIFRvbWNhdCBDb25maWd1cmF0aW9uIEZpbGUiPlRvbWNhdCBjb25maWd1cmF0aW9uIGZpbGU8L2E+LgorICAgIDxzdHJvbmc+UkVNSU5ERVI8L3N0cm9uZz4gLSA8Y29kZT5rZXlBbGlhczwvY29kZT4gdmFsdWVzIG1heSBiZSBjYXNlCisgICAgc2Vuc2l0aXZlITwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzwvdWw+CisKKzxwPklmIHlvdSBhcmUgc3RpbGwgaGF2aW5nIHByb2JsZW1zLCBhIGdvb2Qgc291cmNlIG9mIGluZm9ybWF0aW9uIGlzIHRoZQorPHN0cm9uZz5UT01DQVQtVVNFUjwvc3Ryb25nPiBtYWlsaW5nIGxpc3QuICBZb3UgY2FuIGZpbmQgcG9pbnRlcnMgdG8gYXJjaGl2ZXMKK29mIHByZXZpb3VzIG1lc3NhZ2VzIG9uIHRoaXMgbGlzdCwgYXMgd2VsbCBhcyBzdWJzY3JpcHRpb24gYW5kIHVuc3Vic2NyaXB0aW9uCitpbmZvcm1hdGlvbiwgYXQKKzxhIGhyZWY9Imh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy9saXN0cy5odG1sIj5odHRwOi8vdG9tY2F0LmFwYWNoZS5vcmcvbGlzdHMuaHRtbDwvYT4uPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9Ik1pc2NlbGxhbmVvdXMgVGlwcyBhbmQgQml0cyI+CisKKzxwPlRvIGFjY2VzcyB0aGUgU1NMIHNlc3Npb24gSUQgZnJvbSB0aGUgcmVxdWVzdCwgdXNlOjxiciAvPgorCisgIDxjb2RlPgorICAgIFN0cmluZyBzc2xJRCA9IChTdHJpbmcpcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQucmVxdWVzdC5zc2xfc2Vzc2lvbiIpOworICA8L2NvZGU+Cis8YnIgLz4KK0ZvciBhZGRpdGlvbmFsIGRpc2N1c3Npb24gb24gdGhpcyBhcmVhLCBwbGVhc2Ugc2VlCis8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTIyNjc5Ij5CdWd6aWxsYTwvYT4uCis8L3A+CisKKzxwPkZvciB0aXBzIG9uIHVzaW5nIGNsaWVudEF1dGggb24gYSBwZXItdXNlciBvciBwZXItc2Vzc2lvbiBiYXNpcywgYW5kIGFsc28gZm9yCit1c2luZyBjbGllbnRBdXRoIHdpdGggc2VsZi1zaWduZWQgb3IgZXhwaXJlZCBjbGllbnQgY2VydGlmaWNhdGVzLCBwbGVhc2Ugc2VlIHRoZQorZGlzY3Vzc2lvbiBpbiAKKzxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzQ2NDMiIHRpdGxlPSJCdWd6aWxsYSAzNDY0MyI+QnVnemlsbGEgMzQ2NDM8L2E+LgorPC9wPgorCis8L3NlY3Rpb24+CisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvc3RhdHVzLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvc3RhdHVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjU5NzNkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9zdGF0dXMueG1sCkBAIC0wLDAgKzEsMTIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0ic3RhdHVzLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9InJlbW1AYXBhY2hlLm9yZyI+UmVteSBNYXVjaGVyYXQ8L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSJ5b2F2c0BhcGFjaGUub3JnIj5Zb2F2IFNoYXBpcmE8L2F1dGhvcj4KKyAgICA8dGl0bGU+UHJvamVjdCBTdGF0dXM8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorICA8c2VjdGlvbiBuYW1lPSJQcmVmYWNlIj4KKyAgICA8cD4KKyAgICAgIFRoaXMgZG9jdW1lbnQgYXR0ZW1wdHMgdG8gY29udmV5IHRoZSBjdXJyZW50IHN0YXR1cyBvZiBUb21jYXQgZGV2ZWxvcG1lbnQKKyAgICAgIGluICJiaWcgcGljdHVyZSIgdGVybXMuICBUaGlzIGlzIG5vdCB0aGUgcGxhY2UgdG8gY2hlY2sgaWYgYW4gaW5kaXZpZHVhbAorICAgICAgYnVnIHJlcG9ydCBoYXMgYmVlbiBhZGRyZXNzZWQgb3Igd2hlbiBhbiBpbmRpdmlkdWFsIGZlYXR1cmUgd2lsbCBiZSBhdmFpbGFibGUuCisgICAgPC9wPgorICAgIDxwPgorICAgICAgVGhpcyBwYWdlIGlzIHVwZGF0ZWQgcm91Z2hseSBvbmNlIHBlciBldmVyeSBjb3VwbGUgb2YgVG9tY2F0IG1pbm9yIHJlbGVhc2VzLAorICAgICAgc28gZm9yIGRheS10by1kYXkgc3RhdHVzIHlvdSBzaG91bGQgY2hlY2sgdGhlIHRvbWNhdC11c2VyIGFuZCB0b21jYXQtZGV2IG1haWxpbmcKKyAgICAgIGxpc3RzLiAgWW91IGNhbiBhbHdheXMgaW5xdWlyZSB0aGVyZSBhcyB0byB0aGUgYXZhaWxhYmlsaXR5IG9yIHN0YXR1cyBvZiBhCisgICAgICBzcGVjaWZpYyBmZWF0dXJlIG9yIGNvbXBvbmVudC4KKyAgICA8L3A+CisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSJDdXJyZW50IFN0YXR1cyBTdW1tYXJ5Ij4KKyAgICA8cD4KKyAgICAgIDxiPlRvbWNhdCA1LjAuMjc8L2I+IHdhcyByZWxlYXNlZCBvbiBKdW5lIDE3dGgsIDIwMDQuICBBdCB0aGF0IHRpbWUsIHRoZSBUT01DQVRfNV8wCisgICAgICBicmFuY2ggd2FzIHRhZ2dlZCBpbiBDVlMsIGFuZCB3b3JrIG9uIFRvbWNhdCA1LjUgYmVnYW4uICBXZSBoYXZlIG5vdyBoYWQgc2V2ZXJhbAorICAgICAgVG9tY2F0IDUuNSByZWxlYXNlcywgaW5jbHVkaW5nIGEgY291cGxlIG9mIHN0YWJsZSBvbmVzLiAgQWNjb3JkaW5nbHksIFRvbWNhdCA1LjUKKyAgICAgIGlzIG5vdyB0aGUgZm9jdXMgb24gd29yay4gIFRvbWNhdCA1LjAgaXMgaW4gbWFpbnRlbmFuY2UgbW9kZSBhbmQgaXRzIHJlbGVhc2VzCisgICAgICB3aWxsIGJlY29tZSBsZXNzIGFuZCBsZXNzIGZyZXF1ZW50LgorICAgIDwvcD4KKyAgICA8cD4KKyAgICAgIDxiPlRvbWNhdCA1LjU8L2I+IGhhcyBzZXZlcmFsIG1ham9yIGdvYWxzLiAgVGhleSBhcmUgZGlzY3Vzc2VkIGluIHRoZSB0b21jYXQtZGV2CisgICAgICBtYWlsaW5nIGxpc3QncyAiNS5uZXh0IiB0aHJlYWQ6IAorICAgICAgPGEgaHJlZj0iaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD10b21jYXQtZGV2JmFtcDt3PTImYW1wO3I9MSZhbXA7cz01Lm5leHQmYW1wO3E9YiI+TUFSQzwvYT4uCisgICAgICBUaGUgc3RhdHVzIG9mIHNvbWUgb2YgdGhlc2UgaXRlbXMgaXMgZGV0YWlsZWQgYmVsb3cuICBPbmNlIDUuNSByZWxlYXNlcyBhcmUKKyAgICAgIGF2YWlsYWJsZSwgcGxlYXNlIHJlZmVyIHRvIHRoZSBDaGFuZ2Vsb2cgYWNjb21wYW55aW5nIGVhY2ggcmVsZWFzZSBmb3IgZGV0YWlsZWQKKyAgICAgIGNoYW5nZXMsIGVuaGFuY2VtZW50cywgYW5kIGZpeGVzLgorICAgIDwvcD4KKyAgICA8cD4KKyAgICAgIDxiPlRvbWNhdCA0LjEueDwvYj4gaXMgbm8gbG9uZ2VyIGFjdGl2ZWx5IGRldmVsb3BlZC4gIEl0IGlzIG1haW50YWluZWQgdG8gYWRkcmVzcworICAgICAgb25seSBzaG93c3RvcHBlciwgc2VjdXJpdHksIGFuZCBTZXJ2bGV0IFNwZWNpZmljYXRpb24gY29tcGxpYW5jZSBpc3N1ZXMuICBNYWludGVuYW5jZQorICAgICAgZm9yIFRvbWNhdCA0LjEueCB3aWxsIGxpa2VseSBjZWFzZSBvbmNlIGEgc3RhYmxlIHJlbGVhc2Ugb3IgdHdvIG9mIFRvbWNhdCA1LjUgYXJlIG91dC4KKyAgICAgIFVzZXJzIG9mIFRvbWNhdCA0LjEueCBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZCB0byB1cGdyYWRlIHRvIHRoZSBsYXRlc3Qgc3RhYmxlIFRvbWNhdAorICAgICAgNS4wIHJlbGVhc2UuCisgICAgPC9wPgorICAgIDxwPgorICAgICAgPGI+VG9tY2F0IDQuMC54PC9iPiBpcyByZWxhdGl2ZWx5IG9sZCwgYW5kIG5vdCBhY3RpdmVseSBtYWludGFpbmVkIG9yIHN1cHBvcnRlZC4KKyAgICAgIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgdXNlcnMgb2YgdGhlc2UgcmVsZWFzZXMgdXBncmFkZSB0byB0aGUgbGF0ZXN0CisgICAgICBzdGFibGUgVG9tY2F0IDUuMCByZWxlYXNlIG9yIGF0IGxlYXN0IHRoZSBsYXRlc3Qgc3RhYmxlIFRvbWNhdCA0LjEgcmVsZWFzZS4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICA8Yj5Ub21jYXQgMy4zLng8L2I+IGlzIGluIHJvdWdobHkgdGhlIHNhbWUgbWFpbnRlbmFuY2UgbW9kZSBhcyBUb21jYXQgNC4xLnguCisgICAgPC9wPgorICAgIDxwPgorICAgICAgPGI+VG9tY2F0IDMuMjwvYj4gYW5kIGVhcmxpZXIgYXJlIGluIHJvdWdobHkgdGhlIHNhbWUgc3VwcG9ydCBzdGF0ZSBhcyBUb21jYXQgNC4wLnguCisgICAgICBVc2VycyBzaG91bGQgdXBncmFkZSB0byBUb21jYXQgMy4zLnggb3IgdGhlIGxhdGVzdCBzdGFibGUgVG9tY2F0IDUuMC54LgorICAgIDwvcD4KKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uIG5hbWU9IkhvdyB0byByZWFkIHRoZSByZXBvcnQiPgorICAgIAorICAgIDxwPgorICAgICAgVGhlIGNvbHVtbnMgaW4gdGhpcyByZXBvcnQgY29udGFpbiB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgorICAgIDx1bD4KKyAgICAgIDxsaT48Yj5Qcmlvcml0eTwvYj4gLSBBIHNlbnNlIG9mIGhvdyBpbXBvcnRhbnQgaXQgaXMgdG8gYWRkcmVzcyB0aGlzIAorICAgICAgICBpc3N1ZSBpbiB0aGUgc2hvcnQgdGVybS48L2xpPgorICAgICAgPGxpPjxiPkFjdGlvbiBJdGVtPC9iPiAtIENvbmNpc2UgZGVzY3JpcHRpb24gb2YgdGhlIGFjdGlvbiBpdGVtCisgICAgICAgIHRvIGJlIGNvbXBsZXRlZC4gIFdoZXJlIHJlbGV2YW50LCBKYXZhIHBhY2thZ2UgbmFtZXMgb2YgdGhlCisgICAgICAgIHByaW1hcnkgY2xhc3NlcyBpbnZvbHZlZCBhcmUgbGlzdGVkIGluIFtzcXVhcmUgYnJhY2tldHNdPC9saT4KKyAgICAgIDxsaT48Yj5Wb2x1bnRlZXJzPC9iPiAtIExvZ2luIG9mIHRob3NlIGRldmVsb3BlcnMgd2hvCisgICAgICAgIGhhdmUgdm9sdW50ZWVyZWQgdG8gYXNzaXN0IGluIHRoZSBkZXNpZ24sIGltcGxlbWVudGF0aW9uLCB0ZXN0aW5nLCBhbmQKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBvZiB0aGlzIGFjdGlvbiBpdGVtJ3MgY2hhbmdlcyB0byBUb21jYXQuPC9saT4KKyAgICA8L3VsPgorICAgICAgRGV2ZWxvcGVycyBjYW4gbm9taW5hdGUKKyAgICAgIHRoZW1zZWx2ZXMgdG8gd29yayBvbiBwYXJ0aWN1bGFyIGFjdGlvbiBpdGVtcyBieSBhc2tpbmcgYSBDb21taXR0ZXIgdG8gCisgICAgICBhZGQgdGhlaXIgbmFtZSBhZGRyZXNzIHRvIHRob3NlIGl0ZW1zLiAgVGhlIGRldmVsb3BlcnMgCisgICAgICB3b3JraW5nIG9uIGVhY2ggaXRlbSBzaG91bGQgZGlzY3VzcyBhbmQgYWdyZWUgdXBvbiB0aGUgYXBwcm9hY2ggdG8gYmUgCisgICAgICB1c2VkIGZvciBpbXBsZW1lbnRpbmcgdGhlIGl0ZW0ncyBjaGFuZ2VzIHRvIHRoZSBwcm9qZWN0IHNvdXJjZSBjb2RlIAorICAgICAgYW5kIGRvY3VtZW50YXRpb24sIHByaW9yIHRvIGNvbXBsZXRpbmcgdGhvc2UgY2hhbmdlcy4gIFN1Y2ggZGlzY3Vzc2lvbnMgCisgICAgICBzaG91bGQgdGFrZSBwbGFjZSBvbiB0aGUgdG9tY2F0LWRldiBtYWlsaW5nIGxpc3Qgc28gdGhhdCBldmVyeW9uZSBjYW4gCisgICAgICBzdGF5IGFwcHJpc2VkIG9mIHdoYXQgaXMgZ29pbmcgb24sIG9yIGNoaW1lIGluIGlmIHRoZXkgd2FudCB0byAKKyAgICAgIGNvbnRyaWJ1dGUgaWRlYXMgYW5kIHN1Z2dlc3Rpb25zLgorICAgIDwvcD4KKyAgICAKKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uIG5hbWU9IlRPRE8gTGlzdCI+CisKKyAgICA8c3RhdHVzPgorICAgICAgPGl0ZW0gcHJpb3JpdHk9IkhpZ2giIG93bmVyPSJjb3N0aW4iPgorICAgICAgICBSZWZhY3RvciBDbGFzc0xvYWRlcnMgZm9yIFRvbWNhdCA1LjUgdG8gYWxsb3cgY29udGFpbmVyIHBsdWdpbnMuCisgICAgICA8L2l0ZW0+CisgICAgICA8aXRlbSBwcmlvcml0eT0iTWVkaXVtIiBvd25lcj0iZmhhbmlrIj4KKyAgICAgICAgRW5oYW5jZSBDbHVzdGVyIGZ1bmN0aW9uYWxpdHkgZm9yIFRvbWNhdCA1LjUuCisgICAgICA8L2l0ZW0+CisgICAgICA8aXRlbSBwcmlvcml0eT0iTWVkaXVtIiBvd25lcj0iZXZlcnlvbmUiPgorICAgICAgICBDb250aW51ZSBmaXhpbmcgYnVncyBhbmQgdXBkYXRpbmcgZG9jcy4KKyAgICAgIDwvaXRlbT4KKyAgICA8L3N0YXR1cz4KKworICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iT3BlbiBidWdzIj4KKyAgICAKKyAgICA8cD4KKyAgICAgIFRoZSBsaXN0IG9mIHRoZSBidWdzIHdoaWNoIGFyZSBpbiBhbiB1bnJlc29sdmVkIHN0YXRlIGZvciBUb21jYXQgNSBjYW4gYmUKKyAgICAgIHNlZW4gCisgICAgICA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvYnVnbGlzdC5jZ2k/YnVnX3N0YXR1cz1VTkNPTkZJUk1FRCZhbXA7YnVnX3N0YXR1cz1ORVcmYW1wO2J1Z19zdGF0dXM9QVNTSUdORUQmYW1wO2J1Z19zdGF0dXM9UkVPUEVORUQmYW1wO2J1Z19zdGF0dXM9UkVTT0xWRUQmYW1wO3Jlc29sdXRpb249TEFURVImYW1wO3Jlc29sdXRpb249UkVNSU5EJmFtcDtyZXNvbHV0aW9uPS0tLSZhbXA7YnVnaWR0eXBlPWluY2x1ZGUmYW1wO3Byb2R1Y3Q9VG9tY2F0KzUmYW1wO2NtZHR5cGU9ZG9pdCZhbXA7b3JkZXI9SW1wb3J0YW5jZSI+aGVyZTwvYT4uCisgICAgICBBc3BpcmluZyB2b2x1bnRlZXJzIGFuZCBvdGhlcnMgYXJlIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gYXR0ZW1wdCAKKyAgICAgIHRvIGNvbW1lbnQgYW5kIGhlbHAgcmVzb2x2ZSB0aGVzZSBpc3N1ZXMuCisgICAgPC9wPgorICAgIAorICA8L3NlY3Rpb24+CisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL3RvbWNhdC1kb2NzLnhzbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvdG9tY2F0LWRvY3MueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNzViODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL3RvbWNhdC1kb2NzLnhzbApAQCAtMCwwICsxLDQzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCEtLSBDb250ZW50IFN0eWxlc2hlZXQgZm9yICJ0b21jYXQtZG9jcyIgRG9jdW1lbnRhdGlvbiAtLT4KKworPCEtLSAkSWQkIC0tPgorCis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisgIHZlcnNpb249IjEuMCI+CisKKworICA8IS0tIE91dHB1dCBtZXRob2QgLS0+CisgIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIKKyAgICAgICAgICAgIGVuY29kaW5nPSJpc28tODg1OS0xIgorICAgICAgICAgICAgICBpbmRlbnQ9Im5vIi8+CisKKworICA8IS0tIERlZmluZWQgcGFyYW1ldGVycyAob3ZlcnJpZGVhYmxlKSAtLT4KKyAgPHhzbDpwYXJhbSAgICBuYW1lPSJob21lLW5hbWUiICAgICAgICBzZWxlY3Q9IidUaGUgVG9tY2F0IFByb2plY3QnIi8+CisgIDx4c2w6cGFyYW0gICAgbmFtZT0iaG9tZS1ocmVmIiAgICAgICAgc2VsZWN0PSInaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnLyciLz4KKyAgPHhzbDpwYXJhbSAgICBuYW1lPSJob21lLWxvZ28iICAgICAgICBzZWxlY3Q9IicvaW1hZ2VzL3RvbWNhdC5naWYnIi8+CisgIDx4c2w6cGFyYW0gICAgbmFtZT0icHJpbnRlci1sb2dvIiAgICAgc2VsZWN0PSInL2ltYWdlcy9wcmludGVyLmdpZiciLz4KKyAgPHhzbDpwYXJhbSAgICBuYW1lPSJhcGFjaGUtbG9nbyIgICAgICBzZWxlY3Q9IicvaW1hZ2VzL2FzZi1sb2dvLmdpZiciLz4KKyAgPHhzbDpwYXJhbSAgICBuYW1lPSJyZWxhdGl2ZS1wYXRoIiAgICBzZWxlY3Q9IicuJyIvPgorICA8eHNsOnBhcmFtICAgIG5hbWU9InZvaWQtaW1hZ2UiICAgICAgIHNlbGVjdD0iJy9pbWFnZXMvdm9pZC5naWYnIi8+CisgIDx4c2w6cGFyYW0gICAgbmFtZT0icHJvamVjdC1tZW51IiAgICAgc2VsZWN0PSInbWVudSciLz4KKyAgPHhzbDpwYXJhbSAgICBuYW1lPSJzdGFuZGFsb25lIiAgICAgICBzZWxlY3Q9IicnIi8+CisgIDx4c2w6cGFyYW0gICAgbmFtZT0iYnVnbGluayIgICAgICAgICAgc2VsZWN0PSInaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0nIi8+CisKKyAgPCEtLSBEZWZpbmVkIHZhcmlhYmxlcyAobm9uLW92ZXJyaWRlYWJsZSkgLS0+CisgIDx4c2w6dmFyaWFibGUgbmFtZT0iYm9keS1iZyIgICAgICAgICAgc2VsZWN0PSInI2ZmZmZmZiciLz4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJib2R5LWZnIiAgICAgICAgICBzZWxlY3Q9IicjMDAwMDAwJyIvPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9ImJvZHktbGluayIgICAgICAgIHNlbGVjdD0iJyM1MjVENzYnIi8+CisgIDx4c2w6dmFyaWFibGUgbmFtZT0iYmFubmVyLWJnIiAgICAgICAgc2VsZWN0PSInIzUyNUQ3NiciLz4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJiYW5uZXItZmciICAgICAgICBzZWxlY3Q9IicjZmZmZmZmJyIvPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9InN1Yi1iYW5uZXItYmciICAgIHNlbGVjdD0iJyM4MjhEQTYnIi8+CisgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3ViLWJhbm5lci1mZyIgICAgc2VsZWN0PSInI2ZmZmZmZiciLz4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzb3VyY2UtY29sb3IiICAgICBzZWxlY3Q9IicjMDIzMjY0JyIvPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9ImF0dHJpYnV0ZXMtY29sb3IiIHNlbGVjdD0iJyMwMjMyNjQnIi8+CisgIDx4c2w6dmFyaWFibGUgbmFtZT0idGFibGUtdGgtYmciICAgICAgc2VsZWN0PSInIzAzOWFjYyciLz4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0YWJsZS10ZC1iZyIgICAgICBzZWxlY3Q9IicjYTBkZGYwJyIvPgorCisgIDwhLS0gUHJvY2VzcyBhbiBlbnRpcmUgZG9jdW1lbnQgaW50byBhbiBIVE1MIHBhZ2UgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvY3VtZW50Ij4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9qZWN0IgorICAgICAgICAgICAgICBzZWxlY3Q9ImRvY3VtZW50KCdwcm9qZWN0LnhtbCcpL3Byb2plY3QiLz4KKyAgICA8aHRtbD4KKyAgICA8aGVhZD4KKyAgICA8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb2plY3QvdGl0bGUiLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJvcGVydGllcy90aXRsZSIvPjwvdGl0bGU+CisgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnRpZXMvYXV0aG9yIj4KKyAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZSI+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+CisgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZW1haWwiPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGVtYWlsIi8+CisgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgIDxtZXRhIG5hbWU9ImF1dGhvciIgdmFsdWU9InskbmFtZX0iLz4KKyAgICAgIDxtZXRhIG5hbWU9ImVtYWlsIiB2YWx1ZT0ieyRlbWFpbH0iLz4KKyAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICA8L2hlYWQ+CisKKyAgICA8Ym9keSBiZ2NvbG9yPSJ7JGJvZHktYmd9IiB0ZXh0PSJ7JGJvZHktZmd9IiBsaW5rPSJ7JGJvZHktbGlua30iCisgICAgICAgICAgYWxpbms9InskYm9keS1saW5rfSIgdmxpbms9InskYm9keS1saW5rfSI+CisKKyAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiPgorCisgICAgICA8eHNsOmNvbW1lbnQ+UEFHRSBIRUFERVI8L3hzbDpjb21tZW50PgorICAgICAgPHRyPgorICAgICAgICA8dGQ+CisgICAgICAgIDx4c2w6aWYgdGVzdD0icHJvamVjdC9sb2dvIj4KKyAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImFsdCI+CisgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJvamVjdC9sb2dvIi8+CisgICAgICAgICAgPC94c2w6dmFyaWFibGU+CisgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJob21lIj4KKyAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcm9qZWN0L0BocmVmIi8+CisgICAgICAgICAgPC94c2w6dmFyaWFibGU+CisgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiPgorICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGl2ZS1wYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb2plY3QvbG9nby9AaHJlZiIvPgorICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgorCisgICAgICAgICAgPHhzbDpjb21tZW50PlBST0pFQ1QgTE9HTzwveHNsOmNvbW1lbnQ+CisgICAgICAgICAgPGEgaHJlZj0ieyRob21lfSI+CisgICAgICAgICAgICA8aW1nIHNyYz0ieyRzcmN9IiBhbGlnbj0icmlnaHQiIGFsdD0ieyRhbHR9IiBib3JkZXI9IjAiLz4KKyAgICAgICAgICA8L2E+CisgICAgICAgIDwveHNsOmlmPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgPGZvbnQgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KKyAgICAgICAgICAgIDxoMT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb2plY3QvdGl0bGUiLz48L2gxPgorICAgICAgICAgIDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgIDx4c2w6Y29tbWVudD5BUEFDSEUgTE9HTzwveHNsOmNvbW1lbnQ+CisgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiPgorICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGl2ZS1wYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhcGFjaGUtbG9nbyIvPgorICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPgorICAgICAgICAgICAgPGltZyBzcmM9Inskc3JjfSIgYWxpZ249InJpZ2h0IiBhbHQ9IkFwYWNoZSBMb2dvIiBib3JkZXI9IjAiLz4KKyAgICAgICAgICA8L2E+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisKKyAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjQiPgorCisgICAgICA8eHNsOmNvbW1lbnQ+SEVBREVSIFNFUEFSQVRPUjwveHNsOmNvbW1lbnQ+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KKyAgICAgICAgICA8aHIgbm9zaGFkZT0ibm9zaGFkZSIgc2l6ZT0iMSIvPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorCisgICAgICAgIDwhLS0gRG9uJ3QgZ2VuZXJhdGUgYSBtZW51IGlmIHN0eWxpbmcgcHJpbnRlciBmcmllbmRseSBkb2NzIC0tPgorICAgICAgICA8eHNsOmlmIHRlc3Q9IiRwcm9qZWN0LW1lbnUgPSAnbWVudSciPgorICAgICAgICAgIDx4c2w6Y29tbWVudD5MRUZUIFNJREUgTkFWSUdBVElPTjwveHNsOmNvbW1lbnQ+CisgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIHZhbGlnbj0idG9wIiBub3dyYXA9InRydWUiPgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJwcm9qZWN0L2JvZHkvbWVudSIvPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwveHNsOmlmPgorCisgICAgICAgIDx4c2w6Y29tbWVudD5SSUdIVCBTSURFIE1BSU4gQk9EWTwveHNsOmNvbW1lbnQ+CisgICAgICAgIDx0ZCB3aWR0aD0iODAlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iNCI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgICAgIDxoMT48eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJvamVjdC90aXRsZSIvPjwvaDE+CisgICAgICAgICAgICAgICAgPGgyPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcm9wZXJ0aWVzL3RpdGxlIi8+PC9oMj4KKyAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCIgdmFsaWduPSJ0b3AiIG5vd3JhcD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgPCEtLSBBZGQgdGhlIHByaW50ZXIgZnJpZW5kbHkgbGluayBmb3IgZG9jcyB3aXRoIGEgbWVudSAtLT4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRwcm9qZWN0LW1lbnUgPSAnbWVudSciPgorICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aXZlLXBhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByaW50ZXItbG9nbyIvPgorICAgICAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+CisgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InVybCI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvZG9jdW1lbnQvQHVybCIvPgorICAgICAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+CisgICAgICAgICAgICAgICAgICA8c21hbGw+CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9InByaW50ZXIveyR1cmx9Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0ieyRzcmN9IiBib3JkZXI9IjAiIGFsdD0iUHJpbnRlciBGcmllbmRseSBWZXJzaW9uIi8+CisgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+cHJpbnQtZnJpZW5kbHk8YnIgLz52ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICAgIDwvc21hbGw+CisgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkcHJvamVjdC1tZW51ICE9ICdtZW51JyI+CisgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InZvaWQiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aXZlLXBhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZvaWQtaW1hZ2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+CisgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0ieyR2b2lkfSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdnNwYWNlPSIwIiBoc3BhY2U9IjAiIGJvcmRlcj0iMCIvPgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iYm9keS9zZWN0aW9uIi8+CisgICAgICAgIDwvdGQ+CisKKyAgICAgIDwvdHI+CisKKyAgICAgIDx4c2w6Y29tbWVudD5GT09URVIgU0VQQVJBVE9SPC94c2w6Y29tbWVudD4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIGNvbHNwYW49IjIiPgorICAgICAgICAgIDxociBub3NoYWRlPSJub3NoYWRlIiBzaXplPSIxIi8+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8eHNsOmNvbW1lbnQ+UEFHRSBGT09URVI8L3hzbDpjb21tZW50PgorICAgICAgPHRyPjx0ZCBjb2xzcGFuPSIyIj4KKyAgICAgICAgPGRpdiBhbGlnbj0iY2VudGVyIj48Zm9udCBjb2xvcj0ieyRib2R5LWxpbmt9IiBzaXplPSItMSI+PGVtPgorICAgICAgICBDb3B5cmlnaHQgJiMxNjk7IDE5OTktMjAwNiwgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAgICAgICAgPC9lbT48L2ZvbnQ+PC9kaXY+CisgICAgICA8L3RkPjwvdHI+CisKKyAgICA8L3RhYmxlPgorICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CisKKyAgPC94c2w6dGVtcGxhdGU+CisKKworICA8IS0tIFByb2Nlc3MgYSBtZW51IGZvciB0aGUgbmF2aWdhdGlvbiBiYXIgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lbnUiPgorICAgIDxwPjxzdHJvbmc+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9zdHJvbmc+PC9wPgorICAgIDx1bD4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iaXRlbSIvPgorICAgIDwvdWw+CisgIDwveHNsOnRlbXBsYXRlPgorCisKKyAgPCEtLSBQcm9jZXNzIGEgbWVudSBpdGVtIGZvciB0aGUgbmF2aWdhdGlvbiBiYXIgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Iml0ZW0iPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaHJlZiI+CisgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGhyZWYiLz4KKyAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICA8bGk+PGEgaHJlZj0ieyRocmVmfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPjwvbGk+CisgIDwveHNsOnRlbXBsYXRlPgorCisKKyAgPCEtLSBQcm9jZXNzIGEgZG9jdW1lbnRhdGlvbiBzZWN0aW9uIC0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzZWN0aW9uIj4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWUiPgorICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgPC94c2w6dmFyaWFibGU+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIj4KKyAgICAgIDwhLS0gU2VjdGlvbiBoZWFkaW5nIC0tPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSJ7JGJhbm5lci1iZ30iPgorICAgICAgICAgIDxmb250IGNvbG9yPSJ7JGJhbm5lci1mZ30iIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+CisgICAgICAgICAgPGEgbmFtZT0ieyRuYW1lfSI+CisgICAgICAgICAgPHN0cm9uZz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3N0cm9uZz48L2E+PC9mb250PgorICAgICAgPC90ZD48L3RyPgorICAgICAgPCEtLSBTZWN0aW9uIGJvZHkgLS0+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorICAgIDwvdGFibGU+CisgIDwveHNsOnRlbXBsYXRlPgorCisKKyAgPCEtLSBQcm9jZXNzIGEgZG9jdW1lbnRhdGlvbiBzdWJzZWN0aW9uIC0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzdWJzZWN0aW9uIj4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWUiPgorICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgPC94c2w6dmFyaWFibGU+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIj4KKyAgICAgIDwhLS0gU3Vic2VjdGlvbiBoZWFkaW5nIC0tPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSJ7JHN1Yi1iYW5uZXItYmd9Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0ieyRzdWItYmFubmVyLWZnfSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJ7JG5hbWV9Ij4KKyAgICAgICAgICA8c3Ryb25nPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8IS0tIFN1YnNlY3Rpb24gYm9keSAtLT4KKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKworICA8IS0tIFByb2Nlc3MgYSBzb3VyY2UgY29kZSBleGFtcGxlIC0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzb3VyY2UiPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idm9pZCI+CisgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aXZlLXBhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZvaWQtaW1hZ2UiLz4KKyAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICA8ZGl2IGFsaWduPSJsZWZ0Ij4KKyAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iNCIgY2VsbHBhZGRpbmc9IjAiIGJvcmRlcj0iMCI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgYmdjb2xvcj0ieyRzb3VyY2UtY29sb3J9IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4KKyAgICAgICAgICAgIDxpbWcgc3JjPSJ7JHZvaWR9IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2c3BhY2U9IjAiIGhzcGFjZT0iMCIgYm9yZGVyPSIwIi8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgYmdjb2xvcj0ieyRzb3VyY2UtY29sb3J9IiBoZWlnaHQ9IjEiPgorICAgICAgICAgICAgPGltZyBzcmM9Inskdm9pZH0iIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJ7JHNvdXJjZS1jb2xvcn0iIHdpZHRoPSIxIiBoZWlnaHQ9IjEiPgorICAgICAgICAgICAgPGltZyBzcmM9Inskdm9pZH0iIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIGJnY29sb3I9Inskc291cmNlLWNvbG9yfSIgd2lkdGg9IjEiPgorICAgICAgICAgICAgPGltZyBzcmM9Inskdm9pZH0iIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZmZmZmZmIiBoZWlnaHQ9IjEiPjxwcmU+CisgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgorICAgICAgICAgIDwvcHJlPjwvdGQ+CisgICAgICAgICAgPHRkIGJnY29sb3I9Inskc291cmNlLWNvbG9yfSIgd2lkdGg9IjEiPgorICAgICAgICAgICAgPGltZyBzcmM9Inskdm9pZH0iIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIGJnY29sb3I9Inskc291cmNlLWNvbG9yfSIgd2lkdGg9IjEiIGhlaWdodD0iMSI+CisgICAgICAgICAgICA8aW1nIHNyYz0ieyR2b2lkfSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdnNwYWNlPSIwIiBoc3BhY2U9IjAiIGJvcmRlcj0iMCIvPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIGJnY29sb3I9Inskc291cmNlLWNvbG9yfSIgaGVpZ2h0PSIxIj4KKyAgICAgICAgICAgIDxpbWcgc3JjPSJ7JHZvaWR9IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2c3BhY2U9IjAiIGhzcGFjZT0iMCIgYm9yZGVyPSIwIi8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgYmdjb2xvcj0ieyRzb3VyY2UtY29sb3J9IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4KKyAgICAgICAgICAgIDxpbWcgc3JjPSJ7JHZvaWR9IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2c3BhY2U9IjAiIGhzcGFjZT0iMCIgYm9yZGVyPSIwIi8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgIDwvdGFibGU+CisgICAgPC9kaXY+CisgIDwveHNsOnRlbXBsYXRlPgorCisKKyAgPCEtLSBQcm9jZXNzIGFuIGF0dHJpYnV0ZXMgbGlzdCB3aXRoIG5lc3RlZCBhdHRyaWJ1dGUgZWxlbWVudHMgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImF0dHJpYnV0ZXMiPgorICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1Ij4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoIHdpZHRoPSIxNSUiIGJnY29sb3I9InskYXR0cmlidXRlcy1jb2xvcn0iPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIj5BdHRyaWJ1dGU8L2ZvbnQ+CisgICAgICAgIDwvdGg+CisgICAgICAgIDx0aCB3aWR0aD0iODUlIiBiZ2NvbG9yPSJ7JGF0dHJpYnV0ZXMtY29sb3J9Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RGVzY3JpcHRpb248L2ZvbnQ+CisgICAgICAgIDwvdGg+CisgICAgICA8L3RyPgorICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImF0dHJpYnV0ZSI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0iY2VudGVyIj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHJlcXVpcmVkID0gJ3RydWUnIj4KKyAgICAgICAgICAgICAgPHN0cm9uZz48Y29kZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2NvZGU+PC9zdHJvbmc+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHJlcXVpcmVkICE9ICd0cnVlJyI+CisgICAgICAgICAgICAgIDxjb2RlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvY29kZT4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249ImNlbnRlciI+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgIDwveHNsOmZvci1lYWNoPgorICAgIDwvdGFibGU+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDwhLS0gRml4IHJlbGF0aXZlIGxpbmtzIGluIHByaW50ZXIgZnJpZW5kbHkgdmVyc2lvbnMgb2YgdGhlIGRvY3MgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImEiPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaHJlZiIgc2VsZWN0PSJAaHJlZiIvPgorICAgIDx4c2w6Y2hvb3NlPgorICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzdGFuZGFsb25lID0gJ3N0YW5kYWxvbmUnIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorICAgICAgPC94c2w6d2hlbj4KKyAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvamVjdC1tZW51ICE9ICdtZW51JyBhbmQgc3RhcnRzLXdpdGgoQGhyZWYsJy4uLycpIj4KKyAgICAgICAgPGEgaHJlZj0iLi4veyRocmVmfSI+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvYT4KKyAgICAgIDwveHNsOndoZW4+CisgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb2plY3QtbWVudSAhPSAnbWVudScgYW5kIHN0YXJ0cy13aXRoKEBocmVmLCcuLycpIGFuZCBjb250YWlucyhzdWJzdHJpbmcoQGhyZWYsMyksJy8nKSI+CisgICAgICAgIDxhIGhyZWY9Ii57JGhyZWZ9Ij48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9hPgorICAgICAgPC94c2w6d2hlbj4KKyAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvamVjdC1tZW51ICE9ICdtZW51JyBhbmQgbm90KGNvbnRhaW5zKEBocmVmLCcvLycpKSBhbmQgbm90KHN0YXJ0cy13aXRoKEBocmVmLCcvJykpIGFuZCBub3Qoc3RhcnRzLXdpdGgoQGhyZWYsJyMnKSkgYW5kIGNvbnRhaW5zKEBocmVmLCcvJykiPgorICAgICAgICA8YSBocmVmPSIuLi97JGhyZWZ9Ij48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9hPgorICAgICAgPC94c2w6d2hlbj4KKyAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaHJlZiAhPSAnJyI+CisgICAgICAgIDxhIGhyZWY9InskaHJlZn0iPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2E+CisgICAgICA8L3hzbDp3aGVuPgorICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZSIgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICA8YSBuYW1lPSJ7JG5hbWV9Ij48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9hPgorICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgIDwveHNsOmNob29zZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPCEtLSBDaGFuZ2Vsb2cgcmVsYXRlZCB0YWdzIC0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGFuZ2Vsb2ciPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgICAgPC90YWJsZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hhbmdlbG9nL2FkZCI+CisgICAgPHRyPgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpdmUtcGF0aCIvPi9pbWFnZXMvYWRkLmdpZjwveHNsOnZhcmlhYmxlPgorICAgICAgPHRkPjxpbWcgYWx0PSJhZGQiIGNsYXNzPSJpY29uIiBzcmM9Inskc3JjfSIvPjwvdGQ+CisgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvdGQ+CisgICAgPC90cj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hhbmdlbG9nL3VwZGF0ZSI+CisgICAgPHRyPgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpdmUtcGF0aCIvPi9pbWFnZXMvdXBkYXRlLmdpZjwveHNsOnZhcmlhYmxlPgorICAgICAgPHRkPjxpbWcgYWx0PSJ1cGRhdGUiIGNsYXNzPSJpY29uIiBzcmM9Inskc3JjfSIvPjwvdGQ+CisgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvdGQ+CisgICAgPC90cj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hhbmdlbG9nL2Rlc2lnbiI+CisgICAgPHRyPgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpdmUtcGF0aCIvPi9pbWFnZXMvZGVzaWduLmdpZjwveHNsOnZhcmlhYmxlPgorICAgICAgPHRkPjxpbWcgYWx0PSJkZXNpZ24iIGNsYXNzPSJpY29uIiBzcmM9Inskc3JjfSIvPjwvdGQ+CisgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvdGQ+CisgICAgPC90cj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hhbmdlbG9nL2RvY3MiPgorICAgIDx0cj4KKyAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3JjIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aXZlLXBhdGgiLz4vaW1hZ2VzL2RvY3MuZ2lmPC94c2w6dmFyaWFibGU+CisgICAgICA8dGQ+PGltZyBhbHQ9ImRvY3MiIGNsYXNzPSJpY29uIiBzcmM9Inskc3JjfSIvPjwvdGQ+CisgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvdGQ+CisgICAgPC90cj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hhbmdlbG9nL2ZpeCI+CisgICAgPHRyPgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpdmUtcGF0aCIvPi9pbWFnZXMvZml4LmdpZjwveHNsOnZhcmlhYmxlPgorICAgICAgPHRkPjxpbWcgYWx0PSJmaXgiIGNsYXNzPSJpY29uIiBzcmM9Inskc3JjfSIvPjwvdGQ+CisgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvdGQ+CisgICAgPC90cj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hhbmdlbG9nL3Njb2RlIj4KKyAgICA8dHI+CisgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNyYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGl2ZS1wYXRoIi8+L2ltYWdlcy9jb2RlLmdpZjwveHNsOnZhcmlhYmxlPgorICAgICAgPHRkPjxpbWcgYWx0PSJjb2RlIiBjbGFzcz0iaWNvbiIgc3JjPSJ7JHNyY30iLz48L3RkPgorICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L3RkPgorICAgIDwvdHI+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDwhLS0gUHJvY2VzcyBhbiBhdHRyaWJ1dGVzIGxpc3Qgd2l0aCBuZXN0ZWQgYXR0cmlidXRlIGVsZW1lbnRzIC0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzdGF0dXMiPgorICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1Ij4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoIHdpZHRoPSIxNSUiIGJnY29sb3I9InskYXR0cmlidXRlcy1jb2xvcn0iPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIj5Qcmlvcml0eTwvZm9udD4KKyAgICAgICAgPC90aD4KKyAgICAgICAgPHRoIHdpZHRoPSI1MCUiIGJnY29sb3I9InskYXR0cmlidXRlcy1jb2xvcn0iPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIj5BY3Rpb24gSXRlbTwvZm9udD4KKyAgICAgICAgPC90aD4KKyAgICAgICAgPHRoIHdpZHRoPSIyNSUiIGJnY29sb3I9InskYXR0cmlidXRlcy1jb2xvcn0iPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIj5Wb2x1bnRlZXJzPC9mb250PgorICAgICAgICA8L3RoPgorICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaXRlbSI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0iY2VudGVyIj4KKyAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcHJpb3JpdHkiLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJjZW50ZXIiPgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249ImNlbnRlciI+CisgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG93bmVyIi8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDwhLS0gTGluayB0byBhIGJ1ZyByZXBvcnQgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImJ1ZyI+CisgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImxpbmsiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYnVnbGluayIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiLz48L3hzbDp2YXJpYWJsZT4KKyAgICAgIDxhIGhyZWY9InskbGlua30iPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2E+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDwhLS0gUHJvY2VzcyBldmVyeXRoaW5nIGVsc2UgYnkganVzdCBwYXNzaW5nIGl0IHRocm91Z2ggLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Iip8QCoiPgorICAgIDx4c2w6Y29weT4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8Knx0ZXh0KCkiLz4KKyAgICA8L3hzbDpjb3B5PgorICA8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvdmlydHVhbC1ob3N0aW5nLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvdmlydHVhbC1ob3N0aW5nLWhvd3RvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGYzZTczCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy92aXJ0dWFsLWhvc3RpbmctaG93dG8ueG1sCkBAIC0wLDAgKzEsMTA3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0idmlydHVhbC1ob3N0aW5nLWhvd3RvLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHRpdGxlPlZpcnR1YWwgSG9zdGluZyBhbmQgVG9tY2F0PC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworICA8c2VjdGlvbiBuYW1lPSJBc3N1bXB0aW9ucyI+CisgICAgPHA+CisgICAgICBGb3IgdGhlIHNha2Ugb2YgdGhpcyBob3ctdG8sIGFzc3VtZSB5b3UgaGF2ZSBhIGRldmVsb3BtZW50IGhvc3Qgd2l0aCB0d28KKyAgICAgIGhvc3QgbmFtZXMsIDxjb2RlPnJlbjwvY29kZT4gYW5kIDxjb2RlPnN0aW1weTwvY29kZT4uIExldCdzIGFsc28gYXNzdW1lCisgICAgICBvbmUgaW5zdGFuY2Ugb2YgVG9tY2F0IHJ1bm5pbmcsIHNvIDxjb2RlPiRDQVRBTElOQV9IT01FPC9jb2RlPiByZWZlcnMgdG8KKyAgICAgIHdoZXJldmVyIGl0J3MgaW5zdGFsbGVkLCBwZXJoYXBzIDxjb2RlPi91c3IvbG9jYWwvdG9tY2F0PC9jb2RlPi4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBBbHNvLCB0aGlzIGhvdy10byB1c2VzIFVuaXgtc3R5bGUgcGF0aCBzZXBhcmF0b3JzIGFuZCBjb21tYW5kczsgaWYgeW91J3JlCisgICAgICBvbiBXaW5kb3dzIG1vZGlmeSBhY2NvcmRpbmdseS4gCisgICAgPC9wPgorICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0ic2VydmVyLnhtbCI+CisgICAgPHA+CisgICAgICBBdCB0aGUgc2ltcGxlc3QsIGVkaXQgdGhlIDxhIGhyZWY9ImNvbmZpZy9lbmdpbmUuaHRtbCI+RW5naW5lPC9hPiBwb3J0aW9uCisgICAgICBvZiB5b3VyIDxjb2RlPnNlcnZlci54bWw8L2NvZGU+IGZpbGUgdG8gbG9vayBsaWtlIHRoaXM6CisgICAgPC9wPgorICAgIDxzb3VyY2U+CismbHQ7RW5naW5lIG5hbWU9IkNhdGFsaW5hIiBkZWZhdWx0SG9zdD0icmVuIiZndDsKKyAgICAmbHQ7SG9zdCBuYW1lPSJyZW4iICAgIGFwcEJhc2U9IndlYmFwcHMvcmVuIi8mZ3Q7CisgICAgJmx0O0hvc3QgbmFtZT0ic3RpbXB5IiBhcHBCYXNlPSJ3ZWJhcHBzL3N0aW1weSIvJmd0OworJmx0Oy9FbmdpbmUmZ3Q7CisgICAgPC9zb3VyY2U+CisgICAgPHA+CisgICAgICBDb25zdWx0IHRoZSBjb25maWd1cmF0aW9uIGRvY3VtZW50YXRpb24gZm9yIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlCisgICAgICA8YSBocmVmPSJjb25maWcvZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4gYW5kIDxhIGhyZWY9ImNvbmZpZy9ob3N0Lmh0bWwiPgorICAgICAgSG9zdDwvYT5lbGVtZW50cy4KKyAgICA8L3A+CisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSJXZWJhcHBzIERpcmVjdG9yeSI+CisgICAgPHA+CisgICAgICBDcmVhdGUgZGlyZWN0b3JpZXMgZm9yIGVhY2ggb2YgdGhlIHZpcnR1YWwgaG9zdHM6CisgICAgPC9wPgorICAgIDxzb3VyY2U+Citta2RpciAkQ0FUQUxJTkFfSE9NRS93ZWJhcHBzL3JlbgorbWtkaXIgJENBVEFMSU5BX0hPTUUvd2ViYXBwcy9zdGltcHkKKyAgICA8L3NvdXJjZT4KKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uIG5hbWU9IkNvbmZpZ3VyaW5nIFlvdXIgQ29udGV4dHMiPgorICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFwcHJvYWNoICMxIj4KKyAgICAgIDxwPgorICAgICAgICBXaXRoaW4geW91ciBDb250ZXh0LCBjcmVhdGUgYSA8Y29kZT5NRVRBLUlORjwvY29kZT4gZGlyZWN0b3J5IGFuZCB0aGVuCisgICAgICAgIHBsYWNlIHlvdXIgQ29udGV4dCBkZWZpbml0aW9uIGluIGl0IGluIGEgZmlsZSBuYW1lZAorICAgICAgICA8Y29kZT5jb250ZXh0LnhtbDwvY29kZT4uIGkuZS4KKyAgICAgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvd2ViYXBwcy9yZW4vUk9PVC9NRVRBLUlORi9jb250ZXh0LnhtbDwvY29kZT4KKyAgICAgICAgVGhpcyBtYWtlcyBkZXBsb3ltZW50IGVhc2llciwgcGFydGljdWxhcmx5IGlmIHlvdSdyZSBkaXN0cmlidXRpbmcgYSBXQVIKKyAgICAgICAgZmlsZS4KKyAgICAgIDwvcD4KKyAgICA8L3N1YnNlY3Rpb24+CisgICAgPHN1YnNlY3Rpb24gbmFtZT0iQXBwcm9hY2ggIzIiPgorICAgICAgPHA+CisgICAgICAgIENyZWF0ZSBhIHN0cnVjdHVyZSB1bmRlciA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL0NhdGFsaW5hPC9jb2RlPgorICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHlvdXIgdmlydHVhbCBob3N0cywgZS5nLjoKKyAgICAgIDwvcD4KKyAgICAgIDxzb3VyY2U+Citta2RpciAkQ0FUQUxJTkFfSE9NRS9jb25mL0NhdGFsaW5hL3JlbgorbWtkaXIgJENBVEFMSU5BX0hPTUUvY29uZi9DYXRhbGluYS9zdGltcHkKKyAgICAgIDwvc291cmNlPgorICAgICAgPHA+CisgICAgICAgIE5vdGUgdGhhdCB0aGUgZW5kaW5nIGRpcmVjdG9yeSBuYW1lICJDYXRhbGluYSIgcmVwcmVzZW50cyB0aGUKKyAgICAgICAgPGNvZGU+bmFtZTwvY29kZT4gYXR0cmlidXRlIG9mIHRoZQorICAgICAgICA8YSBocmVmPSJjb25maWcvZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4gZWxlbWVudCBhcyBzaG93biBhYm92ZS4KKyAgICAgIDwvcD4KKyAgICAgIDxwPgorICAgICAgICBOb3csIGZvciB5b3VyIGRlZmF1bHQgd2ViYXBwcywgYWRkOgorICAgICAgPC9wPgorICAgICAgPHNvdXJjZT4KKyRDQVRBTElOQV9IT01FL2NvbmYvQ2F0YWxpbmEvcmVuL1JPT1QueG1sCiskQ0FUQUxJTkFfSE9NRS9jb25mL0NhdGFsaW5hL3N0aW1weS9ST09ULnhtbAorICAgICAgPC9zb3VyY2U+CisgICAgICA8cD4KKyAgICAgICAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBUb21jYXQgbWFuYWdlciB3ZWJhcHAgZm9yIGVhY2ggaG9zdCwgeW91J2xsIGFsc28KKyAgICAgICAgbmVlZCB0byBhZGQgaXQgaGVyZToKKyAgICAgIDwvcD4KKyAgICAgIDxzb3VyY2U+CitjZCAkQ0FUQUxJTkFfSE9NRS9jb25mL0NhdGFsaW5hCitjcCBsb2NhbGhvc3QvbWFuYWdlci54bWwgcmVuLworY3AgbG9jYWxob3N0L21hbmFnZXIueG1sIHN0aW1weS8KKyAgICAgIDwvc291cmNlPgorICAgIDwvc3Vic2VjdGlvbj4KKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJGdXJ0aGVyIEluZm9ybWF0aW9uIj4KKyAgICAgIDxwPgorICAgICAgICBDb25zdWx0IHRoZSBjb25maWd1cmF0aW9uIGRvY3VtZW50YXRpb24gZm9yIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlCisgICAgICAgIDxhIGhyZWY9ImNvbmZpZy9jb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+IGVsZW1lbnQuCisgICAgICA8L3A+CisgICAgPC9zdWJzZWN0aW9uPgorICA8L3NlY3Rpb24+CisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL3dpbmRvd3Mtc2VydmljZS1ob3d0by54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL3dpbmRvd3Mtc2VydmljZS1ob3d0by54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM3OGNlYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvd2luZG93cy1zZXJ2aWNlLWhvd3RvLnhtbApAQCAtMCwwICsxLDM1MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9IndpbmRvd3Mtc2VydmljZS1ob3d0by5odG1sIj4KKworICAgICZwcm9qZWN0OworCisgICAgPHByb3BlcnRpZXM+CisgICAgICA8YXV0aG9yIGVtYWlsPSJtdHVya0BhcGFjaGUub3JnIj5NbGFkZW4gVHVyazwvYXV0aG9yPgorICAgICAgPHRpdGxlPldpbmRvd3Mgc2VydmljZSBIT1ctVE88L3RpdGxlPgorICAgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisgCis8c2VjdGlvbiBuYW1lPSJOT1RJQ0UiPgorPHA+CisgICAgPGI+VGhpcyBzZWN0aW9uIG9mIHRoZSBkb2N1bWVudGF0aW9uIGFwcGxpZXMgdG8gcHJvY3J1biAxLjAsIGFuZCBpcyBub3cgb2Jzb2xldGUuPC9iPgorPC9wPgorPC9zZWN0aW9uPgorPHNlY3Rpb24gbmFtZT0iVG9tY2F0NSBzZXJ2aWNlIGFwcGxpY2F0aW9uIj4KKzxwPgorICAgIDxiPlRvbWNhdDU8L2I+IGlzIGEgc2VydmljZSBhcHBsaWNhdGlvbiBmb3IgcnVubmluZyBUb21jYXQ1IGFzIE5UIHNlcnZpY2UuCis8L3A+Cis8L3NlY3Rpb24+Cis8c2VjdGlvbiBuYW1lPSJUb21jYXQ1dyBtb25pdG9yIGFwcGxpY2F0aW9uIj4KKzxwPgorICAgIDxiPlRvbWNhdDV3PC9iPiBpcyBhIEdVSSBhcHBsaWNhdGlvbiBmb3IgbW9uaXRvcmluZyBhbmQgY29uZmlndXJpbmcgVG9tY2F0CisgICAgc2VydmljZXMuCis8L3A+ICAgIAorICAgIDxwPlRoZSBhdmFpbGFibGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlOjwvcD4KKzxwPiAKKyAgICA8dGFibGU+CisgICAgPHRyPjx0aD4vL0VTLy88L3RoPgorICAgICAgICA8dGQ+RWRpdCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb248L3RkPgorICAgICAgICA8dGQ+VGhpcyBpcyB0aGUgZGVmYXVsdCBvcGVyYXRpb24uIEl0IGlzIGNhbGxlZCBpZiB0aGUgbm8gb3B0aW9uIGlzCisgICAgICAgICAgICBwcm92aWRlZCBidXQgdGhlIGV4ZWN1dGFibGUgaXMgcmVuYW1lZCB0byA8Yj5zZXJ2aWNlbmFtZVcuZXhlPC9iPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+PHRoPi8vTVMvLzwvdGg+CisgICAgICAgIDx0ZD5Nb25pdG9yIHNlcnZpY2U8L3RkPgorICAgICAgICA8dGQ+UHV0IHRoZSBpY29uIGluIHRoZSBzeXN0ZW0gdHJ5PC90ZD4KKyAgICA8L3RyPgorICAgIDwvdGFibGU+Cis8L3A+Cis8L3NlY3Rpb24+Cis8c2VjdGlvbiBuYW1lPSJDb21tYW5kIGxpbmUgYXJndW1lbnRzIj4KKzxwPgorICAgIEVhY2ggY29tbWFuZCBsaW5lIGRpcmVjdGl2ZSBpcyBpbiB0aGUgZm9ybSBvZiA8Yj4vL1hYLy9TZXJ2aWNlTmFtZTwvYj4KKzwvcD4KKyAgICA8cD5UaGUgYXZhaWxhYmxlIGNvbW1hbmQgbGluZSBvcHRpb25zIGFyZTo8L3A+Cis8cD4gCisgICAgPHRhYmxlPgorICAgIDx0cj48dGg+Ly9UUy8vPC90aD4KKyAgICAgICAgPHRkPlJ1biB0aGUgc2VydmljZSBhcyBjb25zb2xlIGFwcGxpY2F0aW9uPC90ZD4KKyAgICAgICAgPHRkPlRoaXMgaXMgdGhlIGRlZmF1bHQgb3BlcmF0aW9uLiBJdCBpcyBjYWxsZWQgaWYgdGhlIG5vIG9wdGlvbiBpcworICAgICAgICAgICAgcHJvdmlkZWQuIFRoZSBTZXJ2aWNlTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSB3aXRob3V0CisgICAgICAgICAgICBleGUgc3VmaXgsIG1lYW5pbmcgVG9tY2F0NTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+PHRoPi8vUlMvLzwvdGg+CisgICAgICAgIDx0ZD5SdW4gdGhlIHNlcnZpY2U8L3RkPgorICAgICAgICA8dGQ+Q2FsbGVkIG9ubHkgZnJvbSBTZXJ2aWNlTWFuYWdlcjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+PHRoPi8vU1MvLzwvdGg+CisgICAgICAgIDx0ZD5TdG9wIHRoZSBzZXJ2aWNlPC90ZD4KKyAgICAgICAgPHRkPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+PHRoPi8vVVMvLzwvdGg+CisgICAgICAgIDx0ZD5VcGRhdGUgc2VydmljZSBwYXJhbWV0ZXJzPC90ZD4KKyAgICAgICAgPHRkPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+PHRoPi8vSVMvLzwvdGg+CisgICAgICAgIDx0ZD5JbnN0YWxsIHNlcnZpY2U8L3RkPgorICAgICAgICA8dGQ+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj48dGg+Ly9EUy8vPC90aD4KKyAgICAgICAgPHRkPkRlbGV0ZSBzZXJ2aWNlPC90ZD4KKyAgICAgICAgPHRkPlN0b3BzIHRoZSBzZXJ2aWNlIGlmIHJ1bm5pbmc8L3RkPgorICAgIDwvdHI+ICAgICAgICAKKyAgICA8L3RhYmxlPgorPC9wPiAKKzwvc2VjdGlvbj4KKzxzZWN0aW9uIG5hbWU9IkNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIj4KKzxwPgorICAgIEVhY2ggY29tbWFuZCBwYXJhbWV0ZXIgaXMgcHJlZml4ZWQgd2l0aCA8Yj4tLTwvYj4uCisgICAgSWYgdGhlIGNvbW1hbmQgbGluZSBpcyBwcmVmaXhlZCB3aXRoIDxiPisrPC9iPiB0aGVuIGl0J3MgdmFsdWUgd2lsbAorICAgIGJlIGFwcGVuZGVkIHRvIHRoZSBleGlzdGluZyBvcHRpb24uCisgICAgSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIGJ1dAorICAgIHByZWZpeGVkIHdpdGggPGNvZGU+UFJfPC9jb2RlPiBleGlzdHMgaXQgd2lsbCB0YWtlIHByZWNlZGVuY2UuCisgICAgRm9yIGV4YW1wbGU6Cis8c291cmNlPnNldCBQUl9DTEFTU1BBVEg9eHguamFyPC9zb3VyY2U+Cis8L3A+ICAgIAorPHA+aXMgZXF1aXZhbGVudCB0byBwcm92aWRpbmcKKzxzb3VyY2U+LS1DbGFzc3BhdGg9eHguamFyPC9zb3VyY2U+Cis8L3A+Cis8cD4gYXMgY29tbWFuZCBsaW5lIHBhcmFtZXRlci48L3A+Cis8cD4gCisgICAgPHRhYmxlPgorICAgIDx0cj4KKyAgICA8dGg+UGFyYW1ldGVyTmFtZTwvdGg+CisJPHRoPkRlZmF1bHQ8L3RoPgorCTx0aD5EZXNjcmlwdGlvbjwvdGg+CisJPC90cj4gCisgICAgPHRyPgorICAgIDx0ZD4tLURlc2NyaXB0aW9uPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgICA8dGQ+U2VydmljZSBuYW1lIGRlc2NyaXB0aW9uIChtYXhpbXVtIDEwMjQgY2hhcmFjdGVycyk8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLURpc3BsYXlOYW1lPC90ZD4KKyAgICA8dGQ+U2VydmljZU5hbWU8L3RkPgorICAgIDx0ZD5TZXJ2aWNlIGRpc3BsYXkgbmFtZTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tSW5zdGFsbDwvdGQ+CisgICAgPHRkPnByb2NydW4uZXhlIC8vUlMvL1NlcnZpY2VOYW1lPC90ZD4KKyAgICA8dGQ+SW5zdGFsbCBpbWFnZTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tU3RhcnR1cDwvdGQ+CisgICAgPHRkPm1hbnVhbDwvdGQ+CisgICAgPHRkPlNlcnZpY2Ugc3RhcnR1cCBtb2RlIGNhbiBiZSBlaXRoZXIgPGI+YXV0bzwvYj4gb3IgPGI+bWFudWFsPC9iPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tRGVwZW5kc09uPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgICA8dGQ+TGlzdCBvZiBzZXJ2aWNlcyB0aGF0IHRoaXMgc2VydmljZSBkZXBlbmQgb24uIERlcGVuZGVudCBzZXJ2aWNlcworICAgICAgICBhcmUgc2VwYXJhdGVkIHVzaW5nIGVpdGhlciA8Yj4jPC9iPiBvciA8Yj47PC9iPiBjaGFyYWN0ZXJzPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1FbnZpcm9ubWVudDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgICAgPHRkPkxpc3Qgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBwcm92aWRlZCB0byB0aGUgc2VydmljZQorICAgICAgICBpbiB0aGUgZm9ybSA8Yj5rZXk9dmFsdWU8L2I+LiBUaGV5IGFyZSBzZXBhcmF0ZWQgdXNpbmcgZWl0aGVyCisgICAgICAgIDxiPiM8L2I+IG9yIDxiPjs8L2I+IGNoYXJhY3RlcnM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLVVzZXI8L3RkPgorICAgIDx0ZD48L3RkPgorICAgIDx0ZD5Vc2VyIGFjY291bnQgdXNlZCBmb3IgcnVubmluZyBleGVjdXRhYmxlLiBJdCBpcyB1c2VkIG9ubHkgZm9yCisgICAgCVN0YXJ0TW9kZSA8Yj5qYXZhPC9iPiBvciA8Yj5leGU8L2I+IGFuZCBlbmFibGVzIHJ1bm5pbmcgYXBwbGljYXRpb25zCisgICAgCWFzIHNlcnZpY2UgdW5kZXIgYWNjb3VudCB3aXRob3V0IExvZ29uQXNTZXJ2aWNlIHByaXZpbGVnZS48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLVBhc3N3b3JkPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgICA8dGQ+UGFzc3dvcmQgZm9yIHVzZXIgYWNjb3VudCBzZXQgYnkgLS1Vc2VyIHBhcmFtZXRlcjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tSmF2YUhvbWU8L3RkPgorICAgIDx0ZD5KQVZBX0hPTUU8L3RkPgorICAgIDx0ZD5TZXQgYSBkaWZmZXJlbnQgSkFWQV9IT01FIHRoZW4gZGVmaW5lZCBieSBKQVZBX0hPTUUgZW52aXJvbm1lbnQKKyAgICAgICAgdmFyaWFibGU8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLUp2bTwvdGQ+CisgICAgPHRkPmF1dG88L3RkPgorICAgIDx0ZD5Vc2UgZWl0aGVyIDxiPmF1dG88L2I+IG9yIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aCB0byB0aGUgPGI+anZtLmRsbDwvYj4uCisgICAgICAgIFlvdSBjYW4gdXNlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBleHBhbnNpb24gaGVyZS48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLUp2bU9wdGlvbnM8L3RkPgorICAgIDx0ZD4tWHJzPC90ZD4KKyAgICA8dGQ+TGlzdCBvZiBvcHRpb25zIGluIHRoZSBmb3JtIG9mIDxiPi1EPC9iPiBvciA8Yj4tWDwvYj4gdGhhdCB3aWxsIGJlCisgICAgICAgIHBhc3NlZCB0byB0aGUgSlZNLiBUaGUgb3B0aW9ucyBhcmUgc2VwYXJhdGVkIHVzaW5nIGVpdGhlcgorICAgICAgICA8Yj4jPC9iPiBvciA8Yj47PC9iPiBjaGFyYWN0ZXJzLjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tQ2xhc3NwYXRoPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgICA8dGQ+U2V0IHRoZSBKYXZhIGNsYXNzcGF0aDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tSnZtTXM8L3RkPgorICAgIDx0ZD48L3RkPgorICAgIDx0ZD5Jbml0aWFsIG1lbW9yeSBwb29sIHNpemUgaW4gTUI8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLUp2bU14PC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgICA8dGQ+TWF4aW11bSBtZW1vcnkgcG9vbCBzaXplIGluIE1CPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1Kdm1TczwvdGQ+CisgICAgPHRkPjwvdGQ+CisgICAgPHRkPlRocmVhZCBzdGFjayBzaXplIGluIEtCPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dHI+CisgICAgPHRkPi0tU3RhcnRJbWFnZTwvdGQ+CisgICAgPHRkPjwvdGQ+CisgICAgPHRkPkV4ZWN1dGFibGUgdGhhdCB3aWxsIGJlIHJ1bi48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLVN0YXJ0UGF0aDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgICAgPHRkPldvcmtpbmcgcGF0aCBmb3IgdGhlIHN0YXJ0IGltYWdlIGV4ZWN1dGFibGUuPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1TdGFydENsYXNzPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgICA8dGQ+Q2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHN0YXJ0dXAuPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1TdGFydFBhcmFtczwvdGQ+CisgICAgPHRkPjwvdGQ+CisgICAgPHRkPkxpc3Qgb2YgcGFyYW1ldGVycyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIGVpdGhlciBTdGFydEltYWdlIG9yCisgICAgICAgIFN0YXJ0Q2xhc3MuIFBhcmFtZXRlcnMgYXJlIHNlcGFyYXRlZCB1c2luZyBlaXRoZXIgPGI+IzwvYj4gb3IKKyAgICAgICAgPGI+OzwvYj4gY2hhcmFjdGVyLjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tU3RhcnRNZXRob2Q8L3RkPgorICAgIDx0ZD5NYWluPC90ZD4KKyAgICA8dGQ+TWV0aG9kIG5hbWUgaWYgZGlmZmVycyB0aGVuIG1haW48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLVN0YXJ0TW9kZTwvdGQ+CisgICAgPHRkPmV4ZWN1dGFibGU8L3RkPgorICAgIDx0ZD5DYW4gb25lIG9mIDxiPmp2bTwvYj4gPGI+amF2YTwvYj4gb3IgPGI+ZXhlPC9iPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dGQ+LS1TdG9wSW1hZ2U8L3RkPgorICAgIDx0ZD48L3RkPgorICAgIDx0ZD5FeGVjdXRhYmxlIHRoYXQgd2lsbCBiZSBydW4gb24gU3RvcCBzZXJ2aWNlIHNpZ25hbC48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLVN0b3BQYXRoPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgICA8dGQ+V29ya2luZyBwYXRoIGZvciB0aGUgc3RvcCBpbWFnZSBleGVjdXRhYmxlLjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tU3RvcENsYXNzPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgICA8dGQ+Q2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQgb24gU3RvcCBzZXJ2aWNlIHNpZ25hbC48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLVN0b3BQYXJhbXM8L3RkPgorICAgIDx0ZD48L3RkPgorICAgIDx0ZD5MaXN0IG9mIHBhcmFtZXRlcnMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBlaXRoZXIgU3RvcEltYWdlIG9yCisgICAgICAgIFN0b3BDbGFzcy4gUGFyYW1ldGVycyBhcmUgc2VwYXJhdGVkIHVzaW5nIGVpdGhlciA8Yj4jPC9iPiBvcgorICAgICAgICA8Yj47PC9iPiBjaGFyYWN0ZXIuPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1TdG9wTWV0aG9kPC90ZD4KKyAgICA8dGQ+TWFpbjwvdGQ+CisgICAgPHRkPk1ldGhvZCBuYW1lIGlmIGRpZmZlcnMgdGhlbiBtYWluPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1TdG9wTW9kZTwvdGQ+CisgICAgPHRkPmV4ZWN1dGFibGU8L3RkPgorICAgIDx0ZD5DYW4gb25lIG9mIDxiPmp2bTwvYj4gPGI+amF2YTwvYj4gb3IgPGI+ZXhlPC9iPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tU3RvcFRpbWVvdXQ8L3RkPgorICAgIDx0ZD5ObyBUaW1lb3V0PC90ZD4KKyAgICA8dGQ+RGVmaW5lcyB0aGUgdGltZW91dCBpbiBzZWNvbmRzIHRoYXQgcHJvY3J1biB3YWl0cyBmb3Igc2VydmljZSB0bworICAgICAgICBleGl0IGdyYWNlZnVsbHkuPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1Mb2dQYXRoPC90ZD4KKyAgICA8dGQ+d29ya2luZyBwYXRoPC90ZD4KKyAgICA8dGQ+RGVmaW5lcyB0aGUgcGF0aCBmb3IgbG9nZ2luZzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tTG9nUHJlZml4PC90ZD4KKyAgICA8dGQ+amFrYXJ0YV9zZXJ2aWNlPC90ZD4KKyAgICA8dGQ+RGVmaW5lcyB0aGUgc2VydmljZSBsb2cgZmlsZW5hbWU8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLUxvZ0xldmVsPC90ZD4KKyAgICA8dGQ+SU5GTzwvdGQ+CisgICAgPHRkPkRlZmluZXMgdGhlIGxvZ2dpbmcgbGV2ZWwgYW5kIGNhbiBiZSBlaXRoZXIgPGI+ZXJyb3I8L2I+LAorICAgICAgICA8Yj5pbmZvPC9iPiwgPGI+d2FybjwvYj4gb3IgPGI+ZGVidWc8L2I+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1TdGRPdXRwdXQ8L3RkPgorICAgIDx0ZD48L3RkPgorICAgIDx0ZD5SZWRpcmVjdGVkIHN0ZG91dCBmaWxlbmFtZTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tU3RkRXJyb3I8L3RkPgorICAgIDx0ZD48L3RkPgorICAgIDx0ZD5SZWRpcmVjdGVkIHN0ZGVyciBmaWxlbmFtZTwvdGQ+CisgICAgPC90cj4gICAgCisgICAgPC90YWJsZT4KKzwvcD4gCis8L3NlY3Rpb24+Cis8c2VjdGlvbiBuYW1lPSJJbnN0YWxsaW5nIHNlcnZpY2VzIj4KKzxwPgorVGhlIHNhZmVzdCB3YXkgdG8gbWFudWFsbHkgaW5zdGFsbCB0aGUgc2VydmljZSBpcyB0byB1c2UgdGhlIHByb3ZpZGVkIDxiPnNlcnZpY2UuYmF0PC9iPiBzY3JpcHQuCis8L3A+Cis8cD4KKzxzb3VyY2U+CitJbnN0YWxsIHRoZSBzZXJ2aWNlIG5hbWVkICdUb21jYXQ1JworQzpcPiBzZXJ2aWNlLmJhdCBpbnN0YWxsCis8L3NvdXJjZT4KKzwvcD4KKzxwPgorSWYgdXNpbmcgdG9tY2F0NS5leGUsIHlvdSBuZWVkIHRvIHVzZSB0aGUgPGI+Ly9JUy8vPC9iPiBwYXJhbWV0ZXIuCis8L3A+Cis8cD4KKzxzb3VyY2U+CitJbnN0YWxsIHRoZSBzZXJ2aWNlIG5hbWVkICdUb21jYXQ1JworQzpcPiB0b21jYXQ1IC8vSVMvL1RvbWNhdDUgLS1EaXNwbGF5TmFtZT0iQXBhY2hlIFRvbWNhdCA1IiBcCitDOlw+IC0tSW5zdGFsbD0iQzpcUHJvZ3JhbSBGaWxlc1xUb21jYXRcYmluXHRvbWNhdDUuZXhlIiAtLUp2bT1hdXRvIFwKK0M6XD4gLS1TdGFydE1vZGU9anZtIC0tU3RvcE1vZGU9anZtIFwKK0M6XD4gLS1TdGFydENsYXNzPW9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAgLS1TdGFydFBhcmFtcz1zdGFydCBcCitDOlw+IC0tU3RvcENsYXNzPW9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAgLS1TdG9wUGFyYW1zPXN0b3AKKzwvc291cmNlPgorPC9wPgorPC9zZWN0aW9uPgorPHNlY3Rpb24gbmFtZT0iVXBkYXRpbmcgc2VydmljZXMiPgorPHA+CitUbyB1cGRhdGUgdGhlIHNlcnZpY2UgcGFyYW1ldGVycywgeW91IG5lZWQgdG8gdXNlIHRoZSA8Yj4vL1VTLy88L2I+IHBhcmFtZXRlci4KKzwvcD4KKzxwPgorPHNvdXJjZT4KK1VwZGF0ZSB0aGUgc2VydmljZSBuYW1lZCAnVG9tY2F0NQorQzpcPiB0b21jYXQ1IC8vVVMvL1RvbWNhdDUgLS1EZXNjcmlwdGlvbj0iQXBhY2hlIFRvbWNhdCBTZXJ2ZXIgLSBodHRwOi8vdG9tY2F0LmFwYWNoZS5vcmcvICIgXAorQzpcPiAtLVN0YXJ0dXA9YXV0byAtLUNsYXNzcGF0aD0lSkFWQV9IT01FJVxsaWJcdG9vbHMuamFyOyVDQVRBTElOQV9IT01FJVxiaW5cYm9vdHN0cmFwLmphcgorPC9zb3VyY2U+Cis8L3A+Cis8L3NlY3Rpb24+Cis8c2VjdGlvbiBuYW1lPSJSZW1vdmluZyBzZXJ2aWNlcyI+Cis8cD4KK1RvIHJlbW92ZSB0aGUgc2VydmljZSwgeW91IG5lZWQgdG8gdXNlIHRoZSA8Yj4vL0RTLy88L2I+IHBhcmFtZXRlci48YnIvPgorSWYgdGhlIHNlcnZpY2UgaXMgcnVubmluZyBpdCB3aWxsIGJlIHN0b3BwZWQgYW5kIHRoZW4gZGVsZXRlZC4KKzwvcD4KKzxwPgorPHNvdXJjZT4KK1JlbW92ZSB0aGUgc2VydmljZSBuYW1lZCAnVG9tY2F0NScKK0M6XD4gdG9tY2F0NSAvL0RTLy9Ub21jYXQ1Cis8L3NvdXJjZT4KKzwvcD4KKzwvc2VjdGlvbj4KKzxzZWN0aW9uIG5hbWU9IkRlYnVnZ2luZyBzZXJ2aWNlcyI+Cis8cD4KK1RvIHJ1biB0aGUgc2VydmljZSBpbiBjb25zb2xlIG1vZGUsIHlvdSBuZWVkIHRvIHVzZSB0aGUgPGI+Ly9UUy8vPC9iPiBwYXJhbWV0ZXIuCitUaGUgc2VydmljZSBzaHV0ZG93biBjYW4gYmUgaW5pdGlhdGVkIGJ5IHByZXNzaW5nIDxiPkNUUkwrQzwvYj4gb3IKKzxiPkNUUkwrQlJFQUs8L2I+LgorSWYgeW91IHJlbmFtZSB0aGUgdG9tY2F0NS5leGUgdG8gdGVzdHNlcnZpY2UuZXhlIHRoZW4geW91IGNhbiBqdXN0IGV4ZWN1dGUgdGhlCit0ZXN0c2VydmljZS5leGUgYW5kIHRoaXMgY29tbWFuZCBtb2RlIHdpbGwgYmUgZXhlY3V0ZWQgYnkgZGVmYXVsdC4KKzwvcD4KKzxwPgorPHNvdXJjZT4KK1J1biB0aGUgc2VydmljZSBuYW1lZCAnVG9tY2F0NScgaW4gY29uc29sZSBtb2RlCitDOlw+IHRvbWNhdDUgLy9UUy8vVG9tY2F0NSBbYWRkaXRpb25hbCBhcmd1bWVudHNdCitPciBzaW1wbHkgZXhlY3V0ZToKK0M6XD4gdG9tY2F0NQorPC9zb3VyY2U+Cis8L3A+Cis8L3NlY3Rpb24+Cis8L2JvZHk+Cis8L2RvY3VtZW50PiAKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2hvc3QtbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9ob3N0bWFuYWdlci9Db25zdGFudHMuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2hvc3QtbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9ob3N0bWFuYWdlci9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTA1YzExCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvaG9zdC1tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL2hvc3RtYW5hZ2VyL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuaG9zdG1hbmFnZXI7CisKKworcHVibGljIGNsYXNzIENvbnN0YW50cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQYWNrYWdlID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuaG9zdG1hbmFnZXIiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9IRUFERVJfU0VDVElPTiA9CisgICAgICAgICI8aHRtbD5cbiIgKworICAgICAgICAiPGhlYWQ+XG4iICsKKyAgICAgICAgIjxzdHlsZT5cbiIgKworICAgICAgICBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuVG9tY2F0Q1NTLlRPTUNBVF9DU1MgKworICAgICAgICAiICB0YWJsZSB7XG4iICsKKyAgICAgICAgIiAgICB3aWR0aDogMTAwJTtcbiIgKworICAgICAgICAiICB9XG4iICsKKyAgICAgICAgIiAgdGQucGFnZS10aXRsZSB7XG4iICsKKyAgICAgICAgIiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4iICsKKyAgICAgICAgIiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuIiArCisgICAgICAgICIgICAgZm9udC1mYW1pbHk6c2Fucy1zZXJpZixUYWhvbWEsQXJpYWw7XG4iICsKKyAgICAgICAgIiAgICBmb250LXdlaWdodDogYm9sZDtcbiIgKworICAgICAgICAiICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuIiArCisgICAgICAgICIgICAgY29sb3I6IGJsYWNrO1xuIiArCisgICAgICAgICIgIH1cbiIgKworICAgICAgICAiICB0ZC50aXRsZSB7XG4iICsKKyAgICAgICAgIiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuIiArCisgICAgICAgICIgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiIgKworICAgICAgICAiICAgIGZvbnQtZmFtaWx5OnNhbnMtc2VyaWYsVGFob21hLEFyaWFsO1xuIiArCisgICAgICAgICIgICAgZm9udC1zdHlsZTppdGFsaWM7XG4iICsKKyAgICAgICAgIiAgICBmb250LXdlaWdodDogYm9sZDtcbiIgKworICAgICAgICAiICAgIGJhY2tncm91bmQ6ICNEMkE0MUM7XG4iICsKKyAgICAgICAgIiAgfVxuIiArCisgICAgICAgICIgIHRkLmhlYWRlci1sZWZ0IHtcbiIgKworICAgICAgICAiICAgIHRleHQtYWxpZ246IGxlZnQ7XG4iICsKKyAgICAgICAgIiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuIiArCisgICAgICAgICIgICAgZm9udC1mYW1pbHk6c2Fucy1zZXJpZixUYWhvbWEsQXJpYWw7XG4iICsKKyAgICAgICAgIiAgICBmb250LXdlaWdodDogYm9sZDtcbiIgKworICAgICAgICAiICAgIGJhY2tncm91bmQ6ICNGRkRDNzU7XG4iICsKKyAgICAgICAgIiAgfVxuIiArCisgICAgICAgICIgIHRkLmhlYWRlci1jZW50ZXIge1xuIiArCisgICAgICAgICIgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuIiArCisgICAgICAgICIgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiIgKworICAgICAgICAiICAgIGZvbnQtZmFtaWx5OnNhbnMtc2VyaWYsVGFob21hLEFyaWFsO1xuIiArCisgICAgICAgICIgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4iICsKKyAgICAgICAgIiAgICBiYWNrZ3JvdW5kOiAjRkZEQzc1O1xuIiArCisgICAgICAgICIgIH1cbiIgKworICAgICAgICAiICB0ZC5yb3ctbGVmdCB7XG4iICsKKyAgICAgICAgIiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuIiArCisgICAgICAgICIgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiIgKworICAgICAgICAiICAgIGZvbnQtZmFtaWx5OnNhbnMtc2VyaWYsVGFob21hLEFyaWFsO1xuIiArCisgICAgICAgICIgICAgY29sb3I6IGJsYWNrO1xuIiArCisgICAgICAgICIgICAgYmFja2dyb3VuZDogd2hpdGU7XG4iICsKKyAgICAgICAgIiAgfVxuIiArCisgICAgICAgICIgIHRkLnJvdy1jZW50ZXIge1xuIiArCisgICAgICAgICIgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuIiArCisgICAgICAgICIgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiIgKworICAgICAgICAiICAgIGZvbnQtZmFtaWx5OnNhbnMtc2VyaWYsVGFob21hLEFyaWFsO1xuIiArCisgICAgICAgICIgICAgY29sb3I6IGJsYWNrO1xuIiArCisgICAgICAgICIgICAgYmFja2dyb3VuZDogd2hpdGU7XG4iICsKKyAgICAgICAgIiAgfVxuIiArCisgICAgICAgICIgIHRkLnJvdy1yaWdodCB7XG4iICsKKyAgICAgICAgIiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiIgKworICAgICAgICAiICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4iICsKKyAgICAgICAgIiAgICBmb250LWZhbWlseTpzYW5zLXNlcmlmLFRhaG9tYSxBcmlhbDtcbiIgKworICAgICAgICAiICAgIGNvbG9yOiBibGFjaztcbiIgKworICAgICAgICAiICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuIiArCisgICAgICAgICIgIH1cbiIgKworICAgICAgICAiICBUSCB7XG4iICsKKyAgICAgICAgIiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4iICsKKyAgICAgICAgIiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuIiArCisgICAgICAgICIgICAgZm9udC1mYW1pbHk6c2Fucy1zZXJpZixUYWhvbWEsQXJpYWw7XG4iICsKKyAgICAgICAgIiAgICBmb250LXdlaWdodDogYm9sZDtcbiIgKworICAgICAgICAiICAgIGJhY2tncm91bmQ6ICNGRkRDNzU7XG4iICsKKyAgICAgICAgIiAgfVxuIiArCisgICAgICAgICIgIFREIHtcbiIgKworICAgICAgICAiICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiIgKworICAgICAgICAiICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4iICsKKyAgICAgICAgIiAgICBmb250LWZhbWlseTpzYW5zLXNlcmlmLFRhaG9tYSxBcmlhbDtcbiIgKworICAgICAgICAiICAgIGNvbG9yOiBibGFjaztcbiIgKworICAgICAgICAiICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuIiArCisgICAgICAgICIgIH1cbiIgKworICAgICAgICAiPC9zdHlsZT5cbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZX0hFQURFUl9TRUNUSU9OID0KKyAgICAgICAgIjx0aXRsZT57MH08L3RpdGxlPlxuIiArCisgICAgICAgICI8L2hlYWQ+XG4iICsKKyAgICAgICAgIlxuIiArCisgICAgICAgICI8Ym9keSBiZ2NvbG9yPVwiI0ZGRkZGRlwiPlxuIiArCisgICAgICAgICJcbiIgKworICAgICAgICAiPHRhYmxlIGNlbGxzcGFjaW5nPVwiNFwiIHdpZHRoPVwiMTAwJVwiIGJvcmRlcj1cIjBcIj5cbiIgKworICAgICAgICAiIDx0cj5cbiIgKworICAgICAgICAiICA8dGQgY29sc3Bhbj1cIjJcIj5cbiIgKworICAgICAgICAiICAgPGEgaHJlZj1cImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9cIj5cbiIgKworICAgICAgICAiICAgIDxpbWcgYm9yZGVyPVwiMFwiIGFsdD1cIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvblwiIGFsaWduPVwibGVmdFwiXG4iICsKKyAgICAgICAgIiAgICAgICAgIHNyYz1cInswfS9pbWFnZXMvYXNmLWxvZ28uZ2lmXCI+XG4iICsKKyAgICAgICAgIiAgIDwvYT5cbiIgKworICAgICAgICAiICAgPGEgaHJlZj1cImh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy9cIj5cbiIgKworICAgICAgICAiICAgIDxpbWcgYm9yZGVyPVwiMFwiIGFsdD1cIlRoZSBUb21jYXQgU2VydmxldC9KU1AgQ29udGFpbmVyXCJcbiIgKworICAgICAgICAiICAgICAgICAgYWxpZ249XCJyaWdodFwiIHNyYz1cInswfS9pbWFnZXMvdG9tY2F0LmdpZlwiPlxuIiArCisgICAgICAgICIgICA8L2E+XG4iICsKKyAgICAgICAgIiAgPC90ZD5cbiIgKworICAgICAgICAiIDwvdHI+XG4iICsKKyAgICAgICAgIjwvdGFibGU+XG4iICsKKyAgICAgICAgIjxociBzaXplPVwiMVwiIG5vc2hhZGU9XCJub3NoYWRlXCI+XG4iICsKKyAgICAgICAgIjx0YWJsZSBjZWxsc3BhY2luZz1cIjRcIiB3aWR0aD1cIjEwMCVcIiBib3JkZXI9XCIwXCI+XG4iICsKKyAgICAgICAgIiA8dHI+XG4iICsKKyAgICAgICAgIiAgPHRkIGNsYXNzPVwicGFnZS10aXRsZVwiIGJvcmRlcmNvbG9yPVwiIzAwMDAwMFwiICIgKworICAgICAgICAiYWxpZ249XCJsZWZ0XCIgbm93cmFwPlxuIiArCisgICAgICAgICIgICA8Zm9udCBzaXplPVwiKzJcIj57MX08L2ZvbnQ+XG4iICsKKyAgICAgICAgIiAgPC90ZD5cbiIgKworICAgICAgICAiIDwvdHI+XG4iICsKKyAgICAgICAgIjwvdGFibGU+XG4iICsKKyAgICAgICAgIjxicj5cbiIgKworICAgICAgICAiXG4iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9TRUNUSU9OID0KKyAgICAgICAgIjx0YWJsZSBib3JkZXI9XCIxXCIgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIzXCI+XG4iICsKKyAgICAgICAgIiA8dHI+XG4iICsKKyAgICAgICAgIiAgPHRkIGNsYXNzPVwicm93LWxlZnRcIiB3aWR0aD1cIjEwJVwiPiIgKworICAgICAgICAiPHNtYWxsPjxzdHJvbmc+ezB9PC9zdHJvbmc+PC9zbWFsbD4mbmJzcDs8L3RkPlxuIiArCisgICAgICAgICIgIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCI+PHByZT57MX08L3ByZT48L3RkPlxuIiArCisgICAgICAgICIgPC90cj5cbiIgKworICAgICAgICAiPC90YWJsZT5cbiIgKworICAgICAgICAiPGJyPlxuIiArCisgICAgICAgICJcbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5BR0VSX1NFQ1RJT04gPQorICAgICAgICAiPHRhYmxlIGJvcmRlcj1cIjFcIiBjZWxsc3BhY2luZz1cIjBcIiBjZWxscGFkZGluZz1cIjNcIj5cbiIgKworICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNvbHNwYW49XCI0XCIgY2xhc3M9XCJ0aXRsZVwiPnswfTwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iICsKKyAgICAgICAgIiA8dHI+XG4iICsKKyAgICAgICAgIiAgPHRkIGNsYXNzPVwicm93LWxlZnRcIj48YSBocmVmPVwiezF9XCI+ezJ9PC9hPjwvdGQ+XG4iICsKKyAgICAgICAgIiAgPHRkIGNsYXNzPVwicm93LWNlbnRlclwiPjxhIGhyZWY9XCJ7M31cIj57NH08L2E+PC90ZD5cbiIgKworICAgICAgICAiICA8dGQgY2xhc3M9XCJyb3ctY2VudGVyXCI+PGEgaHJlZj1cIns1fVwiPns2fTwvYT48L3RkPlxuIiArCisgICAgICAgICIgIDx0ZCBjbGFzcz1cInJvdy1yaWdodFwiPjxhIGhyZWY9XCJ7N31cIj57OH08L2E+PC90ZD5cbiIgKworICAgICAgICAiIDwvdHI+XG4iICsKKyAgICAgICAgIjwvdGFibGU+XG4iICsKKyAgICAgICAgIjxicj5cbiIgKworICAgICAgICAiXG4iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0hFQURFUl9TRUNUSU9OID0KKyAgICAgICAgIjx0YWJsZSBib3JkZXI9XCIxXCIgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIzXCI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjb2xzcGFuPVwiNlwiIGNsYXNzPVwidGl0bGVcIj57MH08L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIiArCisgICAgICAgICI8dHI+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJoZWFkZXItY2VudGVyXCI+PHNtYWxsPnsxfTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cImhlYWRlci1jZW50ZXJcIj48c21hbGw+ezJ9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwiaGVhZGVyLWNlbnRlclwiPjxzbWFsbD57M308L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJoZWFkZXItY2VudGVyXCI+PHNtYWxsPns0fTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cImhlYWRlci1jZW50ZXJcIj48c21hbGw+ezV9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwiaGVhZGVyLWNlbnRlclwiPjxzbWFsbD57Nn08L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1JPV19TRUNUSU9OID0KKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1jZW50ZXJcIj48c21hbGw+ezB9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWNlbnRlclwiPjxzbWFsbD57MX08L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctY2VudGVyXCI+PHNtYWxsPnsyfTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1jZW50ZXJcIj48c21hbGw+ezN9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWNlbnRlclwiPjxzbWFsbD57NH08L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctY2VudGVyXCI+PHNtYWxsPns1fTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiIgKworICAgICAgICAiPC90YWJsZT5cbiIgKworICAgICAgICAiPGJyPlxuIiArCisgICAgICAgICJcbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1RBSUxfU0VDVElPTiA9CisgICAgICAgICI8aHIgc2l6ZT1cIjFcIiBub3NoYWRlPVwibm9zaGFkZVwiPlxuIiArCisgICAgICAgICI8Y2VudGVyPjxmb250IHNpemU9XCItMVwiIGNvbG9yPVwiIzUyNUQ3NlwiPlxuIiArCisgICAgICAgICIgPGVtPkNvcHlyaWdodCAmY29weTsgMTk5OS0yMDA1LCBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvZW0+IiArCisgICAgICAgICI8L2ZvbnQ+PC9jZW50ZXI+XG4iICsKKyAgICAgICAgIlxuIiArCisgICAgICAgICI8L2JvZHk+XG4iICsKKyAgICAgICAgIjwvaHRtbD4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJTRVQ9InV0Zi04IjsKKworICAgIC8vIEZJWE1FIG5lZWQgd2UgdGhpcz8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfREVDTEFSQVRJT04gPQorICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIitDSEFSU0VUKyJcIj8+IjsKKwkJCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NUWUxFID0KKyAgICAgICAgIjw/eG1sLXN0eWxlc2hlZXQgdHlwZT1cInRleHQveHNsXCIgaHJlZj1cIi9tYW5hZ2VyL3hmb3JtLnhzbFwiID8+IjsKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9ob3N0LW1hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvaG9zdG1hbmFnZXIvSFRNTEhvc3RNYW5hZ2VyU2VydmxldC5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvaG9zdC1tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL2hvc3RtYW5hZ2VyL0hUTUxIb3N0TWFuYWdlclNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2U1MDY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvaG9zdC1tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL2hvc3RtYW5hZ2VyL0hUTUxIb3N0TWFuYWdlclNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDQ3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmhvc3RtYW5hZ2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlNlcnZlckluZm87CisKKy8qKgorKiBTZXJ2bGV0IHRoYXQgZW5hYmxlcyByZW1vdGUgbWFuYWdlbWVudCBvZiB0aGUgdmlydHVhbCBob3N0cyBkZXBsb3llZAorKiBvbiB0aGUgc2VydmVyLiAgTm9ybWFsbHksIHRoaXMgZnVuY3Rpb25hbGl0eSB3aWxsIGJlIHByb3RlY3RlZCBieSBhIHNlY3VyaXR5CisqIGNvbnN0cmFpbnQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBIb3dldmVyLCAKKyogdGhpcyByZXF1aXJlbWVudCBjYW4gYmUgcmVsYXhlZCBkdXJpbmcgdGVzdGluZy4KKyogPHA+CisqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIDxjb2RlPkhvc3RNYW5hZ2VyU2VydmxldDwvY29kZT4gYW5kIHRoaXMKKyogU2VydmxldCBpcyB0aGF0IHRoaXMgU2VydmxldCBwcmludHMgb3V0IGEgSFRNTCBpbnRlcmZhY2Ugd2hpY2gKKyogbWFrZXMgaXQgZWFzaWVyIHRvIGFkbWluaXN0cmF0ZS4KKyogPHA+CisqIEhvd2V2ZXIgaWYgeW91IHVzZSBhIHNvZnR3YXJlIHRoYXQgcGFyc2VzIHRoZSBvdXRwdXQgb2YKKyogPGNvZGU+SG9zdE1hbmFnZXJTZXJ2bGV0PC9jb2RlPiB5b3Ugd29uJ3QgYmUgYWJsZSB0byB1cGdyYWRlCisqIHRvIHRoaXMgU2VydmxldCBzaW5jZSB0aGUgb3V0cHV0IGFyZSBub3QgaW4gdGhlCisqIHNhbWUgZm9ybWF0IGFzIGZyb20gPGNvZGU+SG9zdE1hbmFnZXJTZXJ2bGV0PC9jb2RlPgorKgorKiBAYXV0aG9yIEJpcCBUaGVsaW4KKyogQGF1dGhvciBNYWxjb2xtIEVkZ2FyCisqIEBhdXRob3IgR2xlbm4gTC4gTmllbHNlbgorKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorKiBAc2VlIE1hbmFnZXJTZXJ2bGV0CisqLworCitwdWJsaWMgZmluYWwgY2xhc3MgSFRNTEhvc3RNYW5hZ2VyU2VydmxldCBleHRlbmRzIEhvc3RNYW5hZ2VyU2VydmxldCB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBHRVQgcmVxdWVzdCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmllZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMgdGhhdCB3ZSBuZWVkCisgICAgICAgIFN0cmluZyBjb21tYW5kID0gcmVxdWVzdC5nZXRQYXRoSW5mbygpOworCisgICAgICAgIFN0cmluZyBuYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm5hbWUiKTsKKyAKKyAgICAgICAgLy8gUHJlcGFyZSBvdXIgb3V0cHV0IHdyaXRlciB0byBnZW5lcmF0ZSB0aGUgcmVzcG9uc2UgbWVzc2FnZQorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sOyBjaGFyc2V0PSIgKyBDb25zdGFudHMuQ0hBUlNFVCk7CisKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiIjsKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgcmVxdWVzdGVkIGNvbW1hbmQKKyAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgeworICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCIvYWRkIikpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBhZGQocmVxdWVzdCwgbmFtZSk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi9yZW1vdmUiKSkgeworICAgICAgICAgICAgbWVzc2FnZSA9IHJlbW92ZShuYW1lKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL2xpc3QiKSkgeworICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCIvc3RhcnQiKSkgeworICAgICAgICAgICAgbWVzc2FnZSA9IHN0YXJ0KG5hbWUpOworICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCIvc3RvcCIpKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gc3RvcChuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygiaG9zdE1hbmFnZXJTZXJ2bGV0LnVua25vd25Db21tYW5kIiwgY29tbWFuZCk7CisgICAgICAgIH0KKworICAgICAgICBsaXN0KHJlcXVlc3QsIHJlc3BvbnNlLCBtZXNzYWdlKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgYSBob3N0IHVzaW5nIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIGhvc3QgbmFtZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYWRkKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsKKworICAgICAgICBzdXBlci5hZGQocmVxdWVzdCxwcmludFdyaXRlcixuYW1lLHRydWUpOworCisgICAgICAgIHJldHVybiBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGhvc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFdyaXRlciB0byByZW5kZXIgcmVzdWx0cyB0bworICAgICAqIEBwYXJhbSBuYW1lIGhvc3QgbmFtZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVtb3ZlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsKKworICAgICAgICBzdXBlci5yZW1vdmUocHJpbnRXcml0ZXIsIG5hbWUpOworCisgICAgICAgIHJldHVybiBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGUgaG9zdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIEhvc3QgbmFtZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc3RhcnQoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOworCisgICAgICAgIHN1cGVyLnN0YXJ0KHByaW50V3JpdGVyLCBuYW1lKTsKKworICAgICAgICByZXR1cm4gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgaG9zdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIEhvc3QgbmFtZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc3RvcChTdHJpbmcgbmFtZSkgeworCisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIFByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcik7CisKKyAgICAgICAgc3VwZXIuc3RvcChwcmludFdyaXRlciwgbmFtZSk7CisKKyAgICAgICAgcmV0dXJuIHN0cmluZ1dyaXRlci50b1N0cmluZygpOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFJlbmRlciBhIEhUTUwgbGlzdCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBDb250ZXh0cyBpbiBvdXIgdmlydHVhbCBob3N0LAorICAgICAqIGFuZCBtZW1vcnkgYW5kIHNlcnZlciBzdGF0dXMgaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdAorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBhIG1lc3NhZ2UgdG8gZGlzcGxheQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxpc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gSFRNTCBIZWFkZXIgU2VjdGlvbgorICAgICAgICB3cml0ZXIucHJpbnQoQ29uc3RhbnRzLkhUTUxfSEVBREVSX1NFQ1RJT04pOworCisgICAgICAgIC8vIEJvZHkgSGVhZGVyIFNlY3Rpb24KKyAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbMl07CisgICAgICAgIGFyZ3NbMF0gPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCk7CisgICAgICAgIGFyZ3NbMV0gPSBzbS5nZXRTdHJpbmcoImh0bWxIb3N0TWFuYWdlclNlcnZsZXQudGl0bGUiKTsKKyAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAoQ29uc3RhbnRzLkJPRFlfSEVBREVSX1NFQ1RJT04sIGFyZ3MpKTsKKworICAgICAgICAvLyBNZXNzYWdlIFNlY3Rpb24KKyAgICAgICAgYXJncyA9IG5ldyBPYmplY3RbM107CisgICAgICAgIGFyZ3NbMF0gPSBzbS5nZXRTdHJpbmcoImh0bWxIb3N0TWFuYWdlclNlcnZsZXQubWVzc2FnZUxhYmVsIik7CisgICAgICAgIGFyZ3NbMV0gPSAobWVzc2FnZSA9PSBudWxsIHx8IG1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkgPyAiT0siIDogbWVzc2FnZTsKKyAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENvbnN0YW50cy5NRVNTQUdFX1NFQ1RJT04sIGFyZ3MpKTsKKworICAgICAgICAvLyBNYW5hZ2VyIFNlY3Rpb24KKyAgICAgICAgYXJncyA9IG5ldyBPYmplY3RbOV07CisgICAgICAgIGFyZ3NbMF0gPSBzbS5nZXRTdHJpbmcoImh0bWxIb3N0TWFuYWdlclNlcnZsZXQubWFuYWdlciIpOworICAgICAgICBhcmdzWzFdID0gcmVzcG9uc2UuZW5jb2RlVVJMKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvaHRtbC9saXN0Iik7CisgICAgICAgIGFyZ3NbMl0gPSBzbS5nZXRTdHJpbmcoImh0bWxIb3N0TWFuYWdlclNlcnZsZXQubGlzdCIpOworICAgICAgICBhcmdzWzNdID0gcmVzcG9uc2UuZW5jb2RlVVJMCisgICAgICAgICAgICAocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi8iICsKKyAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoImh0bWxIb3N0TWFuYWdlclNlcnZsZXQuaGVscEh0bWxNYW5hZ2VyRmlsZSIpKTsKKyAgICAgICAgYXJnc1s0XSA9IHNtLmdldFN0cmluZygiaHRtbEhvc3RNYW5hZ2VyU2VydmxldC5oZWxwSHRtbE1hbmFnZXIiKTsKKyAgICAgICAgYXJnc1s1XSA9IHJlc3BvbnNlLmVuY29kZVVSTAorICAgICAgICAgICAgKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvIiArCisgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJodG1sSG9zdE1hbmFnZXJTZXJ2bGV0LmhlbHBNYW5hZ2VyRmlsZSIpKTsKKyAgICAgICAgYXJnc1s2XSA9IHNtLmdldFN0cmluZygiaHRtbEhvc3RNYW5hZ2VyU2VydmxldC5oZWxwTWFuYWdlciIpOworICAgICAgICBhcmdzWzddID0gcmVzcG9uc2UuZW5jb2RlVVJMKCIvbWFuYWdlci9zdGF0dXMiKTsKKyAgICAgICAgYXJnc1s4XSA9IHNtLmdldFN0cmluZygic3RhdHVzU2VydmxldC50aXRsZSIpOworICAgICAgICB3cml0ZXIucHJpbnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ29uc3RhbnRzLk1BTkFHRVJfU0VDVElPTiwgYXJncykpOworCisgICAgICAgICAvLyBIb3N0cyBIZWFkZXIgU2VjdGlvbgorICAgICAgICBhcmdzID0gbmV3IE9iamVjdFszXTsKKyAgICAgICAgYXJnc1swXSA9IHNtLmdldFN0cmluZygiaHRtbEhvc3RNYW5hZ2VyU2VydmxldC5ob3N0TmFtZSIpOworICAgICAgICBhcmdzWzFdID0gc20uZ2V0U3RyaW5nKCJodG1sSG9zdE1hbmFnZXJTZXJ2bGV0Lmhvc3RBbGlhc2VzIik7CisgICAgICAgIGFyZ3NbMl0gPSBzbS5nZXRTdHJpbmcoImh0bWxIb3N0TWFuYWdlclNlcnZsZXQuaG9zdFRhc2tzIik7CisgICAgICAgIHdyaXRlci5wcmludChNZXNzYWdlRm9ybWF0LmZvcm1hdChIT1NUU19IRUFERVJfU0VDVElPTiwgYXJncykpOworCisgICAgICAgIC8vIEhvc3RzIFJvdyBTZWN0aW9uCisgICAgICAgIC8vIENyZWF0ZSBzb3J0ZWQgbWFwIG9mIGhvc3QgbmFtZXMuCisgICAgICAgIENvbnRhaW5lcltdIGNoaWxkcmVuID0gZW5naW5lLmZpbmRDaGlsZHJlbigpOworICAgICAgICBTdHJpbmcgaG9zdE5hbWVzW10gPSBuZXcgU3RyaW5nW2NoaWxkcmVuLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBob3N0TmFtZXNbaV0gPSBjaGlsZHJlbltpXS5nZXROYW1lKCk7CisKKyAgICAgICAgVHJlZU1hcCBzb3J0ZWRIb3N0TmFtZXNNYXAgPSBuZXcgVHJlZU1hcCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaG9zdE5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgZGlzcGxheVBhdGggPSBob3N0TmFtZXNbaV07CisgICAgICAgICAgICBzb3J0ZWRIb3N0TmFtZXNNYXAucHV0KGRpc3BsYXlQYXRoLCBob3N0TmFtZXNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGhvc3RzU3RhcnQgPSBzbS5nZXRTdHJpbmcoImh0bWxIb3N0TWFuYWdlclNlcnZsZXQuaG9zdHNTdGFydCIpOworICAgICAgICBTdHJpbmcgaG9zdHNTdG9wID0gc20uZ2V0U3RyaW5nKCJodG1sSG9zdE1hbmFnZXJTZXJ2bGV0Lmhvc3RzU3RvcCIpOworICAgICAgICBTdHJpbmcgaG9zdHNSZW1vdmUgPSBzbS5nZXRTdHJpbmcoImh0bWxIb3N0TWFuYWdlclNlcnZsZXQuaG9zdHNSZW1vdmUiKTsKKworICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNvcnRlZEhvc3ROYW1lc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyBob3N0TmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpIGVuZ2luZS5maW5kQ2hpbGQoaG9zdE5hbWUpOworCisgICAgICAgICAgICBpZiAoaG9zdCAhPSBudWxsICkgeworICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0WzJdOworICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSBob3N0TmFtZTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBhbGlhc2VzID0gaG9zdC5maW5kQWxpYXNlcygpOworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgaWYgKGFsaWFzZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGFsaWFzZXNbMF0pOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8IGFsaWFzZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIikuYXBwZW5kKGFsaWFzZXNbal0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGJ1Zi5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiZuYnNwOyIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFyZ3NbMV0gPSBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQKKyAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEhPU1RTX1JPV19ERVRBSUxTX1NFQ1RJT04sIGFyZ3MpKTsKKworICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0WzddOworICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSByZXNwb25zZS5lbmNvZGVVUkwKKyAgICAgICAgICAgICAgICAgICAgKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArCisgICAgICAgICAgICAgICAgICAgICAiL2h0bWwvc3RhcnQ/bmFtZT0iICsgaG9zdE5hbWUpOworICAgICAgICAgICAgICAgIGFyZ3NbMV0gPSBob3N0c1N0YXJ0OworICAgICAgICAgICAgICAgIGFyZ3NbMl0gPSByZXNwb25zZS5lbmNvZGVVUkwKKyAgICAgICAgICAgICAgICAgICAgKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArCisgICAgICAgICAgICAgICAgICAgICAiL2h0bWwvc3RvcD9uYW1lPSIgKyBob3N0TmFtZSk7CisgICAgICAgICAgICAgICAgYXJnc1szXSA9IGhvc3RzU3RvcDsKKyAgICAgICAgICAgICAgICBhcmdzWzRdID0gcmVzcG9uc2UuZW5jb2RlVVJMCisgICAgICAgICAgICAgICAgICAgIChyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKworICAgICAgICAgICAgICAgICAgICAgIi9odG1sL3JlbW92ZT9uYW1lPSIgKyBob3N0TmFtZSk7CisgICAgICAgICAgICAgICAgYXJnc1s1XSA9IGhvc3RzUmVtb3ZlOworICAgICAgICAgICAgICAgIGFyZ3NbNl0gPSBob3N0TmFtZTsKKyAgICAgICAgICAgICAgICBpZiAoaG9zdCA9PSB0aGlzLmhvc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgTUFOQUdFUl9IT1NUX1JPV19CVVRUT05fU0VDVElPTiwgYXJncykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIEhPU1RTX1JPV19CVVRUT05fU0VDVElPTiwgYXJncykpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIFNlY3Rpb24KKyAgICAgICAgYXJncyA9IG5ldyBPYmplY3RbNl07CisgICAgICAgIGFyZ3NbMF0gPSBzbS5nZXRTdHJpbmcoImh0bWxIb3N0TWFuYWdlclNlcnZsZXQuYWRkVGl0bGUiKTsKKyAgICAgICAgYXJnc1sxXSA9IHNtLmdldFN0cmluZygiaHRtbEhvc3RNYW5hZ2VyU2VydmxldC5hZGRIb3N0Iik7CisgICAgICAgIGFyZ3NbMl0gPSByZXNwb25zZS5lbmNvZGVVUkwocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi9odG1sL2FkZCIpOworICAgICAgICBhcmdzWzNdID0gc20uZ2V0U3RyaW5nKCJodG1sSG9zdE1hbmFnZXJTZXJ2bGV0LmFkZE5hbWUiKTsKKyAgICAgICAgYXJnc1s0XSA9IHNtLmdldFN0cmluZygiaHRtbEhvc3RNYW5hZ2VyU2VydmxldC5hZGRBbGlhc2VzIik7CisgICAgICAgIGFyZ3NbNV0gPSBzbS5nZXRTdHJpbmcoImh0bWxIb3N0TWFuYWdlclNlcnZsZXQuYWRkQXBwQmFzZSIpOworICAgICAgICB3cml0ZXIucHJpbnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQUREX1NFQ1RJT05fU1RBUlQsIGFyZ3MpKTsKKyAKKyAgICAgICAgYXJncyA9IG5ldyBPYmplY3RbM107CisgICAgICAgIGFyZ3NbMF0gPSBzbS5nZXRTdHJpbmcoImh0bWxIb3N0TWFuYWdlclNlcnZsZXQuYWRkQXV0b0RlcGxveSIpOworICAgICAgICBhcmdzWzFdID0gImF1dG9EZXBsb3kiOworICAgICAgICBhcmdzWzJdID0gImNoZWNrZWQiOworICAgICAgICB3cml0ZXIucHJpbnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQUREX1NFQ1RJT05fQk9PTEVBTiwgYXJncykpOworICAgICAgICBhcmdzWzBdID0gc20uZ2V0U3RyaW5nKCJodG1sSG9zdE1hbmFnZXJTZXJ2bGV0LmFkZERlcGxveU9uU3RhcnR1cCIpOworICAgICAgICBhcmdzWzFdID0gImRlcGxveU9uU3RhcnR1cCI7CisgICAgICAgIGFyZ3NbMl0gPSAiY2hlY2tlZCI7CisgICAgICAgIHdyaXRlci5wcmludChNZXNzYWdlRm9ybWF0LmZvcm1hdChBRERfU0VDVElPTl9CT09MRUFOLCBhcmdzKSk7CisgICAgICAgIGFyZ3NbMF0gPSBzbS5nZXRTdHJpbmcoImh0bWxIb3N0TWFuYWdlclNlcnZsZXQuYWRkRGVwbG95WE1MIik7CisgICAgICAgIGFyZ3NbMV0gPSAiZGVwbG95WE1MIjsKKyAgICAgICAgYXJnc1syXSA9ICJjaGVja2VkIjsKKyAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEFERF9TRUNUSU9OX0JPT0xFQU4sIGFyZ3MpKTsKKyAgICAgICAgYXJnc1swXSA9IHNtLmdldFN0cmluZygiaHRtbEhvc3RNYW5hZ2VyU2VydmxldC5hZGRVbnBhY2tXQVJzIik7CisgICAgICAgIGFyZ3NbMV0gPSAidW5wYWNrV0FScyI7CisgICAgICAgIGFyZ3NbMl0gPSAiY2hlY2tlZCI7CisgICAgICAgIHdyaXRlci5wcmludChNZXNzYWdlRm9ybWF0LmZvcm1hdChBRERfU0VDVElPTl9CT09MRUFOLCBhcmdzKSk7CisgICAgICAgIGFyZ3NbMF0gPSBzbS5nZXRTdHJpbmcoImh0bWxIb3N0TWFuYWdlclNlcnZsZXQuYWRkWG1sTmFtZXNwYWNlQXdhcmUiKTsKKyAgICAgICAgYXJnc1sxXSA9ICJ4bWxOYW1lc3BhY2VBd2FyZSI7CisgICAgICAgIGFyZ3NbMl0gPSAiIjsKKyAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEFERF9TRUNUSU9OX0JPT0xFQU4sIGFyZ3MpKTsKKyAgICAgICAgYXJnc1swXSA9IHNtLmdldFN0cmluZygiaHRtbEhvc3RNYW5hZ2VyU2VydmxldC5hZGRYbWxWYWxpZGF0aW9uIik7CisgICAgICAgIGFyZ3NbMV0gPSAieG1sVmFsaWRhdGlvbiI7CisgICAgICAgIGFyZ3NbMl0gPSAiIjsKKyAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEFERF9TRUNUSU9OX0JPT0xFQU4sIGFyZ3MpKTsKKworICAgICAgICBhcmdzWzBdID0gc20uZ2V0U3RyaW5nKCJodG1sSG9zdE1hbmFnZXJTZXJ2bGV0LmFkZE1hbmFnZXIiKTsKKyAgICAgICAgYXJnc1sxXSA9ICJtYW5hZ2VyIjsKKyAgICAgICAgYXJnc1syXSA9ICJjaGVja2VkIjsKKyAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEFERF9TRUNUSU9OX0JPT0xFQU4sIGFyZ3MpKTsKKyAgICAgICAgCisgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0WzFdOworICAgICAgICBhcmdzWzBdID0gc20uZ2V0U3RyaW5nKCJodG1sSG9zdE1hbmFnZXJTZXJ2bGV0LmFkZEJ1dHRvbiIpOworICAgICAgICB3cml0ZXIucHJpbnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQUREX1NFQ1RJT05fRU5ELCBhcmdzKSk7CisKKyAgICAgICAgLy8gU2VydmVyIEhlYWRlciBTZWN0aW9uCisgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0WzddOworICAgICAgICBhcmdzWzBdID0gc20uZ2V0U3RyaW5nKCJodG1sSG9zdE1hbmFnZXJTZXJ2bGV0LnNlcnZlclRpdGxlIik7CisgICAgICAgIGFyZ3NbMV0gPSBzbS5nZXRTdHJpbmcoImh0bWxIb3N0TWFuYWdlclNlcnZsZXQuc2VydmVyVmVyc2lvbiIpOworICAgICAgICBhcmdzWzJdID0gc20uZ2V0U3RyaW5nKCJodG1sSG9zdE1hbmFnZXJTZXJ2bGV0LnNlcnZlckpWTVZlcnNpb24iKTsKKyAgICAgICAgYXJnc1szXSA9IHNtLmdldFN0cmluZygiaHRtbEhvc3RNYW5hZ2VyU2VydmxldC5zZXJ2ZXJKVk1WZW5kb3IiKTsKKyAgICAgICAgYXJnc1s0XSA9IHNtLmdldFN0cmluZygiaHRtbEhvc3RNYW5hZ2VyU2VydmxldC5zZXJ2ZXJPU05hbWUiKTsKKyAgICAgICAgYXJnc1s1XSA9IHNtLmdldFN0cmluZygiaHRtbEhvc3RNYW5hZ2VyU2VydmxldC5zZXJ2ZXJPU1ZlcnNpb24iKTsKKyAgICAgICAgYXJnc1s2XSA9IHNtLmdldFN0cmluZygiaHRtbEhvc3RNYW5hZ2VyU2VydmxldC5zZXJ2ZXJPU0FyY2giKTsKKyAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAoQ29uc3RhbnRzLlNFUlZFUl9IRUFERVJfU0VDVElPTiwgYXJncykpOworCisgICAgICAgIC8vIFNlcnZlciBSb3cgU2VjdGlvbgorICAgICAgICBhcmdzID0gbmV3IE9iamVjdFs2XTsKKyAgICAgICAgYXJnc1swXSA9IFNlcnZlckluZm8uZ2V0U2VydmVySW5mbygpOworICAgICAgICBhcmdzWzFdID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnJ1bnRpbWUudmVyc2lvbiIpOworICAgICAgICBhcmdzWzJdID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZtLnZlbmRvciIpOworICAgICAgICBhcmdzWzNdID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7CisgICAgICAgIGFyZ3NbNF0gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLnZlcnNpb24iKTsKKyAgICAgICAgYXJnc1s1XSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpOworICAgICAgICB3cml0ZXIucHJpbnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ29uc3RhbnRzLlNFUlZFUl9ST1dfU0VDVElPTiwgYXJncykpOworCisgICAgICAgIC8vIEhUTUwgVGFpbCBTZWN0aW9uCisgICAgICAgIHdyaXRlci5wcmludChDb25zdGFudHMuSFRNTF9UQUlMX1NFQ1RJT04pOworCisgICAgICAgIC8vIEZpbmlzaCB1cCB0aGUgcmVzcG9uc2UKKyAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgIH0KKworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIENvbnN0YW50cworCisgICAgLy8gVGhlc2UgSFRNTCBzZWN0aW9ucyBhcmUgYnJva2VuIGluIHJlbGF0aXZlbHkgc21hbGwgc2VjdGlvbnMsIGJlY2F1c2Ugb2YKKyAgICAvLyBsaW1pdGVkIG51bWJlciBvZiBzdWJzaXR1dGlvbnMgTWVzc2FnZUZvcm1hdCBjYW4gcHJvY2VzcworICAgIC8vIChtYXhpbWl1bSBvZiAxMCkuCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVFNfSEVBREVSX1NFQ1RJT04gPQorICAgICAgICAiPHRhYmxlIGJvcmRlcj1cIjFcIiBjZWxsc3BhY2luZz1cIjBcIiBjZWxscGFkZGluZz1cIjNcIj5cbiIgKworICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNvbHNwYW49XCI1XCIgY2xhc3M9XCJ0aXRsZVwiPnswfTwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cImhlYWRlci1sZWZ0XCI+PHNtYWxsPnswfTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cImhlYWRlci1jZW50ZXJcIj48c21hbGw+ezF9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwiaGVhZGVyLWNlbnRlclwiPjxzbWFsbD57Mn08L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1RTX1JPV19ERVRBSUxTX1NFQ1RJT04gPQorICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWxlZnRcIj48c21hbGw+PGEgaHJlZj1cImh0dHA6Ly97MH1cIj57MH08L2E+IiArCisgICAgICAgICI8L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctY2VudGVyXCI+PHNtYWxsPnsxfTwvc21hbGw+PC90ZD5cbiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFUl9IT1NUX1JPV19CVVRUT05fU0VDVElPTiA9CisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWxlZnRcIj5cbiIgKworICAgICAgICAiICA8c21hbGw+XG4iICsKKyAgICAgICAgIiAgJm5ic3A7ezF9Jm5ic3A7XG4iICsKKyAgICAgICAgIiAgJm5ic3A7ezN9Jm5ic3A7XG4iICsKKyAgICAgICAgIiAgJm5ic3A7ezV9Jm5ic3A7XG4iICsKKyAgICAgICAgIiAgPC9zbWFsbD5cbiIgKworICAgICAgICAiIDwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1RTX1JPV19CVVRUT05fU0VDVElPTiA9CisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWxlZnRcIiBOT1dSQVA+XG4iICsKKyAgICAgICAgIiAgPHNtYWxsPlxuIiArCisgICAgICAgICIgICZuYnNwOzxhIGhyZWY9XCJ7MH1cIiBvbmNsaWNrPVwicmV0dXJuKGNvbmZpcm0oJyd7MX0gezZ9XFxuXFxuQXJlIHlvdSBzdXJlPycnKSlcIj57MX08L2E+Jm5ic3A7XG4iICsKKyAgICAgICAgIiAgJm5ic3A7PGEgaHJlZj1cInsyfVwiIG9uY2xpY2s9XCJyZXR1cm4oY29uZmlybSgnJ3szfSB7Nn1cXG5cXG5BcmUgeW91IHN1cmU/JycpKVwiPnszfTwvYT4mbmJzcDtcbiIgKworICAgICAgICAiICAmbmJzcDs8YSBocmVmPVwiezR9XCIgb25jbGljaz1cInJldHVybihjb25maXJtKCcnezV9IHs2fVxcblxcbkFyZSB5b3Ugc3VyZT8nJykpXCI+ezV9PC9hPiZuYnNwO1xuIiArCisgICAgICAgICIgIDwvc21hbGw+XG4iICsKKyAgICAgICAgIiA8L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfU0VDVElPTl9TVEFSVCA9CisgICAgICAgICI8L3RhYmxlPlxuIiArCisgICAgICAgICI8YnI+XG4iICsKKyAgICAgICAgIjx0YWJsZSBib3JkZXI9XCIxXCIgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIzXCI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjb2xzcGFuPVwiMlwiIGNsYXNzPVwidGl0bGVcIj57MH08L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIiArCisgICAgICAgICI8dHI+XG4iICsKKyAgICAgICAgIiA8dGQgY29sc3Bhbj1cIjJcIiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+PHNtYWxsPnsxfTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiIgKworICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNvbHNwYW49XCIyXCI+XG4iICsKKyAgICAgICAgIjxmb3JtIG1ldGhvZD1cImdldFwiIGFjdGlvbj1cInsyfVwiPlxuIiArCisgICAgICAgICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIzXCI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1yaWdodFwiPlxuIiArCisgICAgICAgICIgIDxzbWFsbD57M308L3NtYWxsPlxuIiArCisgICAgICAgICIgPC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCI+XG4iICsKKyAgICAgICAgIiAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm5hbWVcIiBzaXplPVwiMjBcIj5cbiIgKworICAgICAgICAiIDwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1yaWdodFwiPlxuIiArCisgICAgICAgICIgIDxzbWFsbD57NH08L3NtYWxsPlxuIiArCisgICAgICAgICIgPC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCI+XG4iICsKKyAgICAgICAgIiAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImFsaWFzZXNcIiBzaXplPVwiNjRcIj5cbiIgKworICAgICAgICAiIDwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1yaWdodFwiPlxuIiArCisgICAgICAgICIgIDxzbWFsbD57NX08L3NtYWxsPlxuIiArCisgICAgICAgICIgPC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCI+XG4iICsKKyAgICAgICAgIiAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImFwcEJhc2VcIiBzaXplPVwiNjRcIj5cbiIgKworICAgICAgICAiIDwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iIDsKKyAgICAKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9TRUNUSU9OX0JPT0xFQU4gPQorICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LXJpZ2h0XCI+XG4iICsKKyAgICAgICAgIiAgPHNtYWxsPnswfTwvc21hbGw+XG4iICsKKyAgICAgICAgIiA8L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWxlZnRcIj5cbiIgKworICAgICAgICAiICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cInsxfVwiIHsyfT5cbiIgKworICAgICAgICAiIDwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iIDsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfU0VDVElPTl9FTkQgPQorICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LXJpZ2h0XCI+XG4iICsKKyAgICAgICAgIiAgJm5ic3A7XG4iICsKKyAgICAgICAgIiA8L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWxlZnRcIj5cbiIgKworICAgICAgICAiICA8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiezB9XCI+XG4iICsKKyAgICAgICAgIiA8L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIiArCisgICAgICAgICAiPC90YWJsZT5cbiIgKworICAgICAgICAiPC9mb3JtPlxuIiArCisgICAgICAgICI8L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIiArCisgICAgICAgICI8L3RhYmxlPlxuIiArCisgICAgICAgICI8YnI+XG4iICsKKyAgICAgICAgIlxuIjsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvaG9zdC1tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL2hvc3RtYW5hZ2VyL0hvc3RNYW5hZ2VyU2VydmxldC5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvaG9zdC1tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL2hvc3RtYW5hZ2VyL0hvc3RNYW5hZ2VyU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNjI3NWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9ob3N0LW1hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvaG9zdG1hbmFnZXIvSG9zdE1hbmFnZXJTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSw2ODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5ob3N0bWFuYWdlcjsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5VbmF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLldyYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuSG9zdENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQ29udGFpbmVyQmFzZTsKKworCisvKioKKyAqIFNlcnZsZXQgdGhhdCBlbmFibGVzIHJlbW90ZSBtYW5hZ2VtZW50IG9mIHRoZSB2aXJ0dWFsIGhvc3RzIGluc3RhbGxlZAorICogb24gdGhlIHNlcnZlci4gIE5vcm1hbGx5LCB0aGlzIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBwcm90ZWN0ZWQgYnkgCisgKiBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICAKKyAqIEhvd2V2ZXIsIHRoaXMgcmVxdWlyZW1lbnQgY2FuIGJlIHJlbGF4ZWQgZHVyaW5nIHRlc3RpbmcuCisgKiA8cD4KKyAqIFRoaXMgc2VydmxldCBleGFtaW5lcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0UGF0aEluZm8oKTwvY29kZT4KKyAqIGFuZCByZWxhdGVkIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gZGV0ZXJtaW5lIHdoYXQgYWN0aW9uIGlzIGJlaW5nIHJlcXVlc3RlZC4KKyAqIFRoZSBmb2xsb3dpbmcgYWN0aW9ucyBhbmQgcGFyYW1ldGVycyAoc3RhcnRpbmcgYWZ0ZXIgdGhlIHNlcnZsZXQgcGF0aCkKKyAqIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiA8bGk+PGI+L2FkZD9uYW1lPXtob3N0LW5hbWV9JmFsaWFzZXM9e2hvc3QtYWxpYXNlc30mbWFuYWdlcj17bWFuYWdlcn08L2I+IC0KKyAqICAgICBDcmVhdGUgYW5kIGFkZCBhIG5ldyB2aXJ0dWFsIGhvc3QuIFRoZSA8Y29kZT5ob3N0LW5hbWU8L2NvZGU+IGF0dHJpYnV0ZQorICogICAgIGluZGljYXRlcyB0aGUgbmFtZSBvZiB0aGUgbmV3IGhvc3QuIFRoZSA8Y29kZT5ob3N0LWFsaWFzZXM8L2NvZGU+IAorICogICAgIGF0dHJpYnV0ZSBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHRoZSBob3N0IGFsaWFzIG5hbWVzLiAKKyAqICAgICBUaGUgPGNvZGU+bWFuYWdlcjwvY29kZT4gYXR0cmlidXRlIGlzIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIHRoZQorICogICAgIHdlYmFwcCBtYW5hZ2VyIHdpbGwgYmUgaW5zdGFsbGVkIGluIHRoZSBuZXdseSBjcmVhdGVkIGhvc3QgKG9wdGlvbmFsLCAKKyAqICAgICBmYWxzZSBieSBkZWZhdWx0KS48L2xpPgorICogPGxpPjxiPi9yZW1vdmU/bmFtZT17aG9zdC1uYW1lfTwvYj4gLSBSZW1vdmUgYSB2aXJ0dWFsIGhvc3QuIAorICogICAgIFRoZSA8Y29kZT5ob3N0LW5hbWU8L2NvZGU+IGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhlIG5hbWUgb2YgdGhlIGhvc3QuCisgKiAgICAgPC9saT4KKyAqIDxsaT48Yj4vbGlzdDwvYj4gLSBMaXN0IHRoZSB2aXJ0dWFsIGhvc3RzIGluc3RhbGxlZCBvbiB0aGUgc2VydmVyLgorICogICAgIEVhY2ggaG9zdCB3aWxsIGJlIGxpc3RlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybWF0IAorICogICAgIDxjb2RlPmhvc3QtbmFtZSNob3N0LWFsaWFzZXM8L2NvZGU+LjwvbGk+CisgKiA8bGk+PGI+L3N0YXJ0P25hbWU9e2hvc3QtbmFtZX08L2I+IC0gU3RhcnQgdGhlIHZpcnR1YWwgaG9zdC48L2xpPgorICogPGxpPjxiPi9zdG9wP25hbWU9e2hvc3QtbmFtZX08L2I+IC0gU3RvcCB0aGUgdmlydHVhbCBob3N0LjwvbGk+CisgKiA8L3VsPgorICogPHA+CisgKiA8Yj5OT1RFPC9iPiAtIEF0dGVtcHRpbmcgdG8gc3RvcCBvciByZW1vdmUgdGhlIGhvc3QgY29udGFpbmluZworICogdGhpcyBzZXJ2bGV0IGl0c2VsZiB3aWxsIG5vdCBzdWNjZWVkLiAgVGhlcmVmb3JlLCB0aGlzIHNlcnZsZXQgc2hvdWxkCisgKiBnZW5lcmFsbHkgYmUgZGVwbG95ZWQgaW4gYSBzZXBhcmF0ZSB2aXJ0dWFsIGhvc3QuCisgKiA8cD4KKyAqIDxiPk5PVEU8L2I+IC0gRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHRoaXMgYXBwbGljYXRpb24gd2lsbCBub3Qgb3BlcmF0ZQorICogd2hlbiBhY2Nlc3NlZCB2aWEgdGhlIGludm9rZXIgc2VydmxldC4gIFlvdSBtdXN0IGV4cGxpY2l0bHkgbWFwIHRoaXMgc2VydmxldAorICogd2l0aCBhIHNlcnZsZXQgbWFwcGluZywgYW5kIHlvdSB3aWxsIGFsd2F5cyB3YW50IHRvIHByb3RlY3QgaXQgd2l0aAorICogYXBwcm9wcmlhdGUgc2VjdXJpdHkgY29uc3RyYWludHMgYXMgd2VsbC4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBzZXJ2bGV0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgYXJlIHJlY29nbml6ZWQ6CisgKiA8dWw+CisgKiA8bGk+PGI+ZGVidWc8L2I+IC0gVGhlIGRlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgdGhhdCBjb250cm9scyB0aGUgYW1vdW50CisgKiAgICAgb2YgaW5mb3JtYXRpb24gdGhhdCBpcyBsb2dnZWQgYnkgdGhpcyBzZXJ2bGV0LiAgRGVmYXVsdCBpcyB6ZXJvLgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEhvc3RNYW5hZ2VyU2VydmxldAorICAgIGV4dGVuZHMgSHR0cFNlcnZsZXQgaW1wbGVtZW50cyBDb250YWluZXJTZXJ2bGV0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFBhdGggd2hlcmUgY29udGV4dCBkZXNjcmlwdG9ycyBzaG91bGQgYmUgZGVwbG95ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgY29uZmlnQmFzZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250ZXh0IGNvbnRhaW5lciBhc3NvY2lhdGVkIHdpdGggb3VyIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGRlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgZm9yIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGRlYnVnID0gMTsKKworCisgICAgLyoqCisgICAgICogVGhlIGFzc29jaWF0ZWQgaG9zdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSG9zdCBob3N0ID0gbnVsbDsKKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBhc3NvY2lhdGVkIGVuZ2luZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRW5naW5lIGVuZ2luZSA9IG51bGw7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBNQmVhbiBzZXJ2ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1CZWFuU2VydmVyIG1CZWFuU2VydmVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogVGhlIFdyYXBwZXIgY29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFdyYXBwZXIgd3JhcHBlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnRhaW5lclNlcnZsZXQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFdyYXBwZXIgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV3JhcHBlciBnZXRXcmFwcGVyKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy53cmFwcGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBXcmFwcGVyIHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JhcHBlciBUaGUgbmV3IHdyYXBwZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXcmFwcGVyKFdyYXBwZXIgd3JhcHBlcikgeworCisgICAgICAgIHRoaXMud3JhcHBlciA9IHdyYXBwZXI7CisgICAgICAgIGlmICh3cmFwcGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRleHQgPSBudWxsOworICAgICAgICAgICAgaG9zdCA9IG51bGw7CisgICAgICAgICAgICBlbmdpbmUgPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dCA9IChDb250ZXh0KSB3cmFwcGVyLmdldFBhcmVudCgpOworICAgICAgICAgICAgaG9zdCA9IChIb3N0KSBjb250ZXh0LmdldFBhcmVudCgpOworICAgICAgICAgICAgZW5naW5lID0gKEVuZ2luZSkgaG9zdC5nZXRQYXJlbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHJpZXZlIHRoZSBNQmVhbiBzZXJ2ZXIKKyAgICAgICAgbUJlYW5TZXJ2ZXIgPSBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS5nZXRNQmVhblNlcnZlcigpOworICAgICAgICAKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBGaW5hbGl6ZSB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKworICAgICAgICA7ICAgICAgIC8vIE5vIGFjdGlvbnMgbmVjZXNzYXJ5CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBHRVQgcmVxdWVzdCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmllZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIHdlcmUgbm90IGFjY2Vzc2VkIHVzaW5nIHRoZSBpbnZva2VyIHNlcnZsZXQKKyAgICAgICAgaWYgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKEdsb2JhbHMuSU5WT0tFRF9BVFRSKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuYXZhaWxhYmxlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiaG9zdE1hbmFnZXJTZXJ2bGV0LmNhbm5vdEludm9rZSIpKTsKKworICAgICAgICAvLyBJZGVudGlmeSB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzIHRoYXQgd2UgbmVlZAorICAgICAgICBTdHJpbmcgY29tbWFuZCA9IHJlcXVlc3QuZ2V0UGF0aEluZm8oKTsKKyAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkKKyAgICAgICAgICAgIGNvbW1hbmQgPSByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCk7CisgICAgICAgIFN0cmluZyBuYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm5hbWUiKTsKKyAgCisgICAgICAgIC8vIFByZXBhcmUgb3VyIG91dHB1dCB3cml0ZXIgdG8gZ2VuZXJhdGUgdGhlIHJlc3BvbnNlIG1lc3NhZ2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW47IGNoYXJzZXQ9IiArIENvbnN0YW50cy5DSEFSU0VUKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgcmVxdWVzdGVkIGNvbW1hbmQKKyAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJob3N0TWFuYWdlclNlcnZsZXQubm9Db21tYW5kIikpOworICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCIvYWRkIikpIHsKKyAgICAgICAgICAgIGFkZChyZXF1ZXN0LCB3cml0ZXIsIG5hbWUsIGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL3JlbW92ZSIpKSB7CisgICAgICAgICAgICByZW1vdmUod3JpdGVyLCBuYW1lKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL2xpc3QiKSkgeworICAgICAgICAgICAgbGlzdCh3cml0ZXIpOworICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCIvc3RhcnQiKSkgeworICAgICAgICAgICAgc3RhcnQod3JpdGVyLCBuYW1lKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL3N0b3AiKSkgeworICAgICAgICAgICAgc3RvcCh3cml0ZXIsIG5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJob3N0TWFuYWdlclNlcnZsZXQudW5rbm93bkNvbW1hbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmlzaCB1cCB0aGUgcmVzcG9uc2UKKyAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgIHdyaXRlci5jbG9zZSgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgaG9zdCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFRoZSBvdXRwdXQgd3JpdGVyCisgICAgICogQHBhcmFtIG5hbWUgVGhlIGhvc3QgbmFtZQorICAgICAqIEBwYXJhbSBodG1sTW9kZSBGbGFnIHZhbHVlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyBuYW1lLCBib29sZWFuIGh0bWxNb2RlICkgeworICAgICAgICBTdHJpbmcgYWxpYXNlcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJhbGlhc2VzIik7CisgICAgICAgIFN0cmluZyBhcHBCYXNlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImFwcEJhc2UiKTsKKyAgICAgICAgYm9vbGVhbiBtYW5hZ2VyID0gYm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCAibWFuYWdlciIsIGZhbHNlLCBodG1sTW9kZSk7CisgICAgICAgIGJvb2xlYW4gYXV0b0RlcGxveSA9IGJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgImF1dG9EZXBsb3kiLCB0cnVlLCBodG1sTW9kZSk7CisgICAgICAgIGJvb2xlYW4gZGVwbG95T25TdGFydHVwID0gYm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCAiZGVwbG95T25TdGFydHVwIiwgdHJ1ZSwgaHRtbE1vZGUpOworICAgICAgICBib29sZWFuIGRlcGxveVhNTCA9IGJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgImRlcGxveVhNTCIsIHRydWUsIGh0bWxNb2RlKTsKKyAgICAgICAgYm9vbGVhbiB1bnBhY2tXQVJzID0gYm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCAidW5wYWNrV0FScyIsIHRydWUsIGh0bWxNb2RlKTsKKyAgICAgICAgYm9vbGVhbiB4bWxOYW1lc3BhY2VBd2FyZSA9IGJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgInhtbE5hbWVzcGFjZUF3YXJlIiwgZmFsc2UsIGh0bWxNb2RlKTsKKyAgICAgICAgYm9vbGVhbiB4bWxWYWxpZGF0aW9uID0gYm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCAieG1sVmFsaWRhdGlvbiIsIGZhbHNlLCBodG1sTW9kZSk7CisgICAgICAgIGFkZCh3cml0ZXIsIG5hbWUsIGFsaWFzZXMsIGFwcEJhc2UsIG1hbmFnZXIsCisgICAgICAgICAgICBhdXRvRGVwbG95LAorICAgICAgICAgICAgZGVwbG95T25TdGFydHVwLAorICAgICAgICAgICAgZGVwbG95WE1MLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdW5wYWNrV0FScywKKyAgICAgICAgICAgIHhtbE5hbWVzcGFjZUF3YXJlLAorICAgICAgICAgICAgeG1sVmFsaWRhdGlvbik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBleHRyYWN0IGJvb2xlYW4gdmFsdWUgZnJvbSBjaGVja2JveCB3aXRoIGRlZmF1bHQKKyAgICAgKiBAcGFyYW0gcmVxdWVzdAorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gdGhlRGVmYXVsdAorICAgICAqIEBwYXJhbSBodG1sTW9kZQorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBib29sZWFuUGFyYW1ldGVyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlciwgYm9vbGVhbiB0aGVEZWZhdWx0LCBib29sZWFuIGh0bWxNb2RlKSB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKHBhcmFtZXRlcik7CisgICAgICAgIGJvb2xlYW4gYm9vbGVhblZhbHVlID0gdGhlRGVmYXVsdDsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChodG1sTW9kZSkgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoIm9uIikpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhblZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRoZURlZmF1bHQpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKCJmYWxzZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5WYWx1ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZXF1YWxzKCJ0cnVlIikpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuVmFsdWUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGh0bWxNb2RlKQorICAgICAgICAgICAgYm9vbGVhblZhbHVlID0gZmFsc2U7CisgICAgICAgIHJldHVybiBib29sZWFuVmFsdWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIEVuc3VyZSB0aGF0IG91ciBDb250YWluZXJTZXJ2bGV0IHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNldAorICAgICAgICBpZiAoKHdyYXBwZXIgPT0gbnVsbCkgfHwgKGNvbnRleHQgPT0gbnVsbCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5hdmFpbGFibGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJob3N0TWFuYWdlclNlcnZsZXQubm9XcmFwcGVyIikpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIHdlcmUgbm90IGFjY2Vzc2VkIHVzaW5nIHRoZSBpbnZva2VyIHNlcnZsZXQKKyAgICAgICAgU3RyaW5nIHNlcnZsZXROYW1lID0gZ2V0U2VydmxldENvbmZpZygpLmdldFNlcnZsZXROYW1lKCk7CisgICAgICAgIGlmIChzZXJ2bGV0TmFtZSA9PSBudWxsKQorICAgICAgICAgICAgc2VydmxldE5hbWUgPSAiIjsKKyAgICAgICAgaWYgKHNlcnZsZXROYW1lLnN0YXJ0c1dpdGgoIm9yZy5hcGFjaGUuY2F0YWxpbmEuSU5WT0tFUi4iKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbmF2YWlsYWJsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImhvc3RNYW5hZ2VyU2VydmxldC5jYW5ub3RJbnZva2UiKSk7CisKKyAgICAgICAgLy8gU2V0IG91ciBwcm9wZXJ0aWVzIGZyb20gdGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbHVlID0gZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoImRlYnVnIik7CisgICAgICAgICAgICBkZWJ1ZyA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgOworICAgICAgICB9CisKKyAgICB9CisKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGhvc3QgdXNpbmcgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlciBXcml0ZXIgdG8gcmVuZGVyIHJlc3VsdHMgdG8KKyAgICAgKiBAcGFyYW0gbmFtZSBob3N0IG5hbWUKKyAgICAgKiBAcGFyYW0gYWxpYXNlcyBjb21tYSBzZXBhcmF0ZWQgYWxpYXMgbGlzdAorICAgICAqIEBwYXJhbSBhcHBCYXNlIGFwcGxpY2F0aW9uIGJhc2UgZm9yIHRoZSBob3N0CisgICAgICogQHBhcmFtIG1hbmFnZXIgc2hvdWxkIHRoZSBtYW5hZ2VyIHdlYmFwcCBiZSBkZXBsb3llZCB0byB0aGUgbmV3IGhvc3QgPworICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBhZGQKKyAgICAgICAgKFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIG5hbWUsIFN0cmluZyBhbGlhc2VzLCBTdHJpbmcgYXBwQmFzZSwgCisgICAgICAgICBib29sZWFuIG1hbmFnZXIsCisgICAgICAgICBib29sZWFuIGF1dG9EZXBsb3ksCisgICAgICAgICBib29sZWFuIGRlcGxveU9uU3RhcnR1cCwKKyAgICAgICAgIGJvb2xlYW4gZGVwbG95WE1MLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgYm9vbGVhbiB1bnBhY2tXQVJzLAorICAgICAgICAgYm9vbGVhbiB4bWxOYW1lc3BhY2VBd2FyZSwKKyAgICAgICAgIGJvb2xlYW4geG1sVmFsaWRhdGlvbikgeworICAgICAgICBpZiAoZGVidWcgPj0gMSkgeworICAgICAgICAgICAgbG9nKCJhZGQ6IEFkZGluZyBob3N0ICciICsgbmFtZSArICInIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgcmVxdWVzdGVkIGhvc3QgbmFtZQorICAgICAgICBpZiAoKG5hbWUgPT0gbnVsbCkgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoImhvc3RNYW5hZ2VyU2VydmxldC5pbnZhbGlkSG9zdE5hbWUiLCBuYW1lKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBpZiBob3N0IGFscmVhZHkgZXhpc3RzCisgICAgICAgIGlmIChlbmdpbmUuZmluZENoaWxkKG5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiaG9zdE1hbmFnZXJTZXJ2bGV0LmFscmVhZHlIb3N0IiwgbmFtZSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIGNyZWF0ZSBhcHBCYXNlCisgICAgICAgIEZpbGUgYXBwQmFzZUZpbGUgPSBudWxsOworICAgICAgICBpZiAoYXBwQmFzZSA9PSBudWxsIHx8IGFwcEJhc2UubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgYXBwQmFzZSA9IG5hbWU7CisgICAgICAgIH0KKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoYXBwQmFzZSk7CisgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksIGFwcEJhc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXBwQmFzZUZpbGUgPSBmaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXBwQmFzZUZpbGUgPSBmaWxlOworICAgICAgICB9CisgICAgICAgIGlmICghYXBwQmFzZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGFwcEJhc2VGaWxlLm1rZGlycygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBDcmVhdGUgYmFzZSBmb3IgY29uZmlnIGZpbGVzCisgICAgICAgIEZpbGUgY29uZmlnQmFzZUZpbGUgPSBnZXRDb25maWdCYXNlKG5hbWUpOworICAgICAgICAKKyAgICAgICAgLy8gQ29weSBtYW5hZ2VyLnhtbCBpZiByZXF1ZXN0ZWQKKyAgICAgICAgaWYgKG1hbmFnZXIpIHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlzID0gZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvbWFuYWdlci54bWwiKTsKKyAgICAgICAgICAgICAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKGNvbmZpZ0Jhc2VGaWxlLCAibWFuYWdlci54bWwiKSk7CisgICAgICAgICAgICAgICAgYnl0ZSBidWZmZXJbXSA9IG5ldyBieXRlWzUxMl07CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IGJ1ZmZlci5sZW5ndGg7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gaXMucmVhZChidWZmZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAobGVuID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIG9zLndyaXRlKGJ1ZmZlciwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiaG9zdE1hbmFnZXJTZXJ2bGV0Lm1hbmFnZXJYbWwiKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0YW5kYXJkSG9zdCBob3N0ID0gbmV3IFN0YW5kYXJkSG9zdCgpOworICAgICAgICBob3N0LnNldEFwcEJhc2UoYXBwQmFzZSk7CisgICAgICAgIGhvc3Quc2V0TmFtZShuYW1lKTsKKworICAgICAgICBob3N0LmFkZExpZmVjeWNsZUxpc3RlbmVyKG5ldyBIb3N0Q29uZmlnKCkpOworCisgICAgICAgIC8vIEFkZCBob3N0IGFsaWFzZXMKKyAgICAgICAgaWYgKChhbGlhc2VzICE9IG51bGwpICYmICEoIiIuZXF1YWxzKGFsaWFzZXMpKSkgeworICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYWxpYXNlcywgIiwgIik7CisgICAgICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgIGhvc3QuYWRkQWxpYXModG9rLm5leHRUb2tlbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBob3N0LnNldEF1dG9EZXBsb3koYXV0b0RlcGxveSk7CisgICAgICAgIGhvc3Quc2V0RGVwbG95T25TdGFydHVwKGRlcGxveU9uU3RhcnR1cCk7CisgICAgICAgIGhvc3Quc2V0RGVwbG95WE1MKGRlcGxveVhNTCk7CisgICAgICAgIGhvc3Quc2V0VW5wYWNrV0FScyh1bnBhY2tXQVJzKTsKKyAgICAgICAgaG9zdC5zZXRYbWxOYW1lc3BhY2VBd2FyZSh4bWxOYW1lc3BhY2VBd2FyZSk7CisgICAgICAgIGhvc3Quc2V0WG1sVmFsaWRhdGlvbih4bWxWYWxpZGF0aW9uKTsKKyAgICAgICAgCisgICAgICAgIC8vIEFkZCBuZXcgaG9zdAorICAgICAgICB0cnkgeworICAgICAgICAgICAgZW5naW5lLmFkZENoaWxkKGhvc3QpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJob3N0TWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaG9zdCA9IChTdGFuZGFyZEhvc3QpIGVuZ2luZS5maW5kQ2hpbGQobmFtZSk7CisgICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygiaG9zdE1hbmFnZXJTZXJ2bGV0LmFkZCIsIG5hbWUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNvbWV0aGluZyBmYWlsZWQKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygiaG9zdE1hbmFnZXJTZXJ2bGV0LmFkZEZhaWxlZCIsIG5hbWUpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGhvc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFdyaXRlciB0byByZW5kZXIgcmVzdWx0cyB0bworICAgICAqIEBwYXJhbSBuYW1lIGhvc3QgbmFtZQorICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmUoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChkZWJ1ZyA+PSAxKSB7CisgICAgICAgICAgICBsb2coInJlbW92ZTogUmVtb3ZpbmcgaG9zdCAnIiArIG5hbWUgKyAiJyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHJlcXVlc3RlZCBob3N0IG5hbWUKKyAgICAgICAgaWYgKChuYW1lID09IG51bGwpIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJob3N0TWFuYWdlclNlcnZsZXQuaW52YWxpZEhvc3ROYW1lIiwgbmFtZSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgaG9zdCBleGlzdHMKKyAgICAgICAgaWYgKGVuZ2luZS5maW5kQ2hpbGQobmFtZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJob3N0TWFuYWdlclNlcnZsZXQubm9Ib3N0IiwgbmFtZSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJldmVudCByZW1vdmluZyBvdXIgb3duIGhvc3QKKyAgICAgICAgaWYgKGVuZ2luZS5maW5kQ2hpbGQobmFtZSkgPT0gaG9zdCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJob3N0TWFuYWdlclNlcnZsZXQuY2Fubm90UmVtb3ZlT3duSG9zdCIsIG5hbWUpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSBob3N0CisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgaG9zdCB3aWxsIG5vdCBnZXQgcGh5c2ljYWxseSByZW1vdmVkCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb250YWluZXIgY2hpbGQgPSBlbmdpbmUuZmluZENoaWxkKG5hbWUpOworICAgICAgICAgICAgZW5naW5lLnJlbW92ZUNoaWxkKGNoaWxkKTsKKyAgICAgICAgICAgIGlmICggY2hpbGQgaW5zdGFuY2VvZiBDb250YWluZXJCYXNlICkgKChDb250YWluZXJCYXNlKWNoaWxkKS5kZXN0cm95KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoImhvc3RNYW5hZ2VyU2VydmxldC5leGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBIb3N0IGhvc3QgPSAoU3RhbmRhcmRIb3N0KSBlbmdpbmUuZmluZENoaWxkKG5hbWUpOworICAgICAgICBpZiAoaG9zdCA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoImhvc3RNYW5hZ2VyU2VydmxldC5yZW1vdmUiLCBuYW1lKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTb21ldGhpbmcgZmFpbGVkCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoImhvc3RNYW5hZ2VyU2VydmxldC5yZW1vdmVGYWlsZWQiLCBuYW1lKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSBsaXN0IG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIENvbnRleHRzIGluIG91ciB2aXJ0dWFsIGhvc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFdyaXRlciB0byByZW5kZXIgdG8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBsaXN0KFByaW50V3JpdGVyIHdyaXRlcikgeworCisgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgbG9nKCJsaXN0OiBMaXN0aW5nIGhvc3RzIGZvciBlbmdpbmUgJyIgCisgICAgICAgICAgICAgICAgKyBlbmdpbmUuZ2V0TmFtZSgpICsgIiciKTsKKworICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoImhvc3RNYW5hZ2VyU2VydmxldC5saXN0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lLmdldE5hbWUoKSkpOworICAgICAgICBDb250YWluZXJbXSBob3N0cyA9IGVuZ2luZS5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBob3N0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpIGhvc3RzW2ldOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBob3N0LmdldE5hbWUoKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGFsaWFzZXMgPSBob3N0LmZpbmRBbGlhc2VzKCk7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgaWYgKGFsaWFzZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYWxpYXNlc1swXSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBhbGlhc2VzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJywnKS5hcHBlbmQoYWxpYXNlc1tqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJob3N0TWFuYWdlclNlcnZsZXQubGlzdGl0ZW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGJ1Zi50b1N0cmluZygpKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBob3N0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlciBXcml0ZXIgdG8gcmVuZGVyIHRvCisgICAgICogQHBhcmFtIG5hbWUgSG9zdCBuYW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3RhcnQoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgbG9nKCJzdGFydDogU3RhcnRpbmcgaG9zdCB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIiciKTsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgcmVxdWVzdGVkIGhvc3QgbmFtZQorICAgICAgICBpZiAoKG5hbWUgPT0gbnVsbCkgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoImhvc3RNYW5hZ2VyU2VydmxldC5pbnZhbGlkSG9zdE5hbWUiLCBuYW1lKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBpZiBob3N0IGV4aXN0cworICAgICAgICBpZiAoZW5naW5lLmZpbmRDaGlsZChuYW1lKSA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImhvc3RNYW5hZ2VyU2VydmxldC5ub0hvc3QiLCBuYW1lKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBQcmV2ZW50IHN0YXJ0aW5nIG91ciBvd24gaG9zdAorICAgICAgICBpZiAoZW5naW5lLmZpbmRDaGlsZChuYW1lKSA9PSBob3N0KSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImhvc3RNYW5hZ2VyU2VydmxldC5jYW5ub3RTdGFydE93bkhvc3QiLCBuYW1lKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCBob3N0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAoKExpZmVjeWNsZSkgZW5naW5lLmZpbmRDaGlsZChuYW1lKSkuc3RhcnQoKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiaG9zdE1hbmFnZXJTZXJ2bGV0LnN0YXJ0ZWQiLCBuYW1lKSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmxvZworICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImhvc3RNYW5hZ2VyU2VydmxldC5zdGFydEZhaWxlZCIsIG5hbWUpLCB0KTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiaG9zdE1hbmFnZXJTZXJ2bGV0LnN0YXJ0RmFpbGVkIiwgbmFtZSkpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJob3N0TWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBob3N0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlciBXcml0ZXIgdG8gcmVuZGVyIHRvCisgICAgICogQHBhcmFtIG5hbWUgSG9zdCBuYW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3RvcChQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICBsb2coInN0b3A6IFN0b3BwaW5nIGhvc3Qgd2l0aCBuYW1lICciICsgbmFtZSArICInIik7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHJlcXVlc3RlZCBob3N0IG5hbWUKKyAgICAgICAgaWYgKChuYW1lID09IG51bGwpIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJob3N0TWFuYWdlclNlcnZsZXQuaW52YWxpZEhvc3ROYW1lIiwgbmFtZSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgaG9zdCBleGlzdHMKKyAgICAgICAgaWYgKGVuZ2luZS5maW5kQ2hpbGQobmFtZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJob3N0TWFuYWdlclNlcnZsZXQubm9Ib3N0IiwgbmFtZSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJldmVudCBzdGFydGluZyBvdXIgb3duIGhvc3QKKyAgICAgICAgaWYgKGVuZ2luZS5maW5kQ2hpbGQobmFtZSkgPT0gaG9zdCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJob3N0TWFuYWdlclNlcnZsZXQuY2Fubm90U3RvcE93bkhvc3QiLCBuYW1lKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCBob3N0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAoKExpZmVjeWNsZSkgZW5naW5lLmZpbmRDaGlsZChuYW1lKSkuc3RvcCgpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJob3N0TWFuYWdlclNlcnZsZXQuc3RvcHBlZCIsIG5hbWUpKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkubG9nCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiaG9zdE1hbmFnZXJTZXJ2bGV0LnN0b3BGYWlsZWQiLCBuYW1lKSwgdCk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImhvc3RNYW5hZ2VyU2VydmxldC5zdG9wRmFpbGVkIiwgbmFtZSkpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJob3N0TWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN1cHBvcnQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBHZXQgY29uZmlnIGJhc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0Q29uZmlnQmFzZShTdHJpbmcgaG9zdE5hbWUpIHsKKyAgICAgICAgRmlsZSBjb25maWdCYXNlID0gCisgICAgICAgICAgICBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwgImNvbmYiKTsKKyAgICAgICAgaWYgKCFjb25maWdCYXNlLmV4aXN0cygpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5naW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbmZpZ0Jhc2UgPSBuZXcgRmlsZShjb25maWdCYXNlLCBlbmdpbmUuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb25maWdCYXNlID0gbmV3IEZpbGUoY29uZmlnQmFzZSwgaG9zdE5hbWUpOworICAgICAgICB9CisgICAgICAgIGNvbmZpZ0Jhc2UubWtkaXJzKCk7CisgICAgICAgIHJldHVybiBjb25maWdCYXNlOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9ob3N0LW1hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvaG9zdG1hbmFnZXIvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9jb250YWluZXIvd2ViYXBwcy9ob3N0LW1hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvaG9zdG1hbmFnZXIvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE2NjVjOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2hvc3QtbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9ob3N0bWFuYWdlci9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMCwwICsxLDU5IEBACitob3N0TWFuYWdlclNlcnZsZXQuY2Fubm90SW52b2tlPUNhbm5vdCBpbnZva2UgaG9zdCBtYW5hZ2VyIHNlcnZsZXQgdGhyb3VnaCBpbnZva2VyCitob3N0TWFuYWdlclNlcnZsZXQubm9Db21tYW5kPUZBSUwgLSBObyBjb21tYW5kIHdhcyBzcGVjaWZpZWQKK2hvc3RNYW5hZ2VyU2VydmxldC51bmtub3duQ29tbWFuZD1GQUlMIC0gVW5rbm93biBjb21tYW5kIHswfQoraG9zdE1hbmFnZXJTZXJ2bGV0Lm5vV3JhcHBlcj1Db250YWluZXIgaGFzIG5vdCBjYWxsZWQgc2V0V3JhcHBlcigpIGZvciB0aGlzIHNlcnZsZXQKK2hvc3RNYW5hZ2VyU2VydmxldC5pbnZhbGlkSG9zdE5hbWU9RkFJTCAtIEludmFsaWQgaG9zdCBuYW1lIHswfSB3YXMgc3BlY2lmaWVkCitob3N0TWFuYWdlclNlcnZsZXQuYWxyZWFkeUhvc3Q9RkFJTCAtIEhvc3QgYWxyZWFkeSBleGlzdHMgd2l0aCBob3N0IG5hbWUgezB9Citob3N0TWFuYWdlclNlcnZsZXQubWFuYWdlclhtbD1GQUlMIC0gQ291bGRuJ3QgaW5zdGFsbCBtYW5hZ2VyLnhtbAoraG9zdE1hbmFnZXJTZXJ2bGV0LmV4Y2VwdGlvbj1GQUlMIC0gRW5jb3VudGVyZWQgZXhjZXB0aW9uIHswfQoraG9zdE1hbmFnZXJTZXJ2bGV0LmFkZD1PSyAtIEhvc3QgezB9IGFkZGVkCitob3N0TWFuYWdlclNlcnZsZXQuYWRkRmFpbGVkPUZBSUwgLSBGYWlsZWQgdG8gYWRkIGhvc3QgezB9Citob3N0TWFuYWdlclNlcnZsZXQuY2Fubm90UmVtb3ZlT3duSG9zdD1GQUlMIC0gQ2Fubm90IHJlbW92ZSBvd24gaG9zdCB7MH0KK2hvc3RNYW5hZ2VyU2VydmxldC5yZW1vdmU9T0sgLSBSZW1vdmVkIGhvc3QgezB9Citob3N0TWFuYWdlclNlcnZsZXQucmVtb3ZlRmFpbGVkPUZBSUwgLSBGYWlsZWQgdG8gcmVtb3ZlIGhvc3QgezB9Citob3N0TWFuYWdlclNlcnZsZXQubGlzdGVkPU9LIC0gTGlzdGVkIGhvc3RzCitob3N0TWFuYWdlclNlcnZsZXQubGlzdGl0ZW09ezB9OnsxfQoraG9zdE1hbmFnZXJTZXJ2bGV0LmNhbm5vdFN0YXJ0T3duSG9zdD1GQUlMIC0gQ2Fubm90IHN0YXJ0IG93biBob3N0IHswfQoraG9zdE1hbmFnZXJTZXJ2bGV0LnN0YXJ0ZWQ9T0sgLSBIb3N0IHswfSBzdGFydGVkCitob3N0TWFuYWdlclNlcnZsZXQuc3RhcnRGYWlsZWQ9RkFJTCAtIEZhaWxlZCB0byBzdGFydCBob3N0IHswfQoraG9zdE1hbmFnZXJTZXJ2bGV0LmNhbm5vdFN0b3BPd25Ib3N0PUZBSUwgLSBDYW5ub3Qgc3RvcCBvd24gaG9zdCB7MH0KK2hvc3RNYW5hZ2VyU2VydmxldC5zdG9wcGVkPU9LIC0gSG9zdCB7MH0gc3RvcHBlZAoraG9zdE1hbmFnZXJTZXJ2bGV0LnN0b3BGYWlsZWQ9RkFJTCAtIEZhaWxlZCB0byBzdG9wIGhvc3QgezB9CisKK2h0bWxIb3N0TWFuYWdlclNlcnZsZXQudGl0bGU9VG9tY2F0IFZpcnR1YWwgSG9zdCBNYW5hZ2VyCitodG1sSG9zdE1hbmFnZXJTZXJ2bGV0Lm1lc3NhZ2VMYWJlbD1NZXNzYWdlOgoraHRtbEhvc3RNYW5hZ2VyU2VydmxldC5tYW5hZ2VyPUhvc3QgTWFuYWdlcgoraHRtbEhvc3RNYW5hZ2VyU2VydmxldC5saXN0PUxpc3QgVmlydHVhbCBIb3N0cworaHRtbEhvc3RNYW5hZ2VyU2VydmxldC5oZWxwSHRtbE1hbmFnZXJGaWxlPWh0bWwtaG9zdC1tYW5hZ2VyLWhvd3RvLmh0bWwKK2h0bWxIb3N0TWFuYWdlclNlcnZsZXQuaGVscEh0bWxNYW5hZ2VyPUhUTUwgSG9zdCBNYW5hZ2VyIEhlbHAgKENvbWluZyBTb29uISkKK2h0bWxIb3N0TWFuYWdlclNlcnZsZXQuaGVscE1hbmFnZXJGaWxlPWhvc3QtbWFuYWdlci1ob3d0by5odG1sCitodG1sSG9zdE1hbmFnZXJTZXJ2bGV0LmhlbHBNYW5hZ2VyPUhvc3QgTWFuYWdlciBIZWxwCitodG1sSG9zdE1hbmFnZXJTZXJ2bGV0Lmhvc3ROYW1lPUhvc3QgbmFtZQoraHRtbEhvc3RNYW5hZ2VyU2VydmxldC5ob3N0QWxpYXNlcz1Ib3N0IGFsaWFzZXMKK2h0bWxIb3N0TWFuYWdlclNlcnZsZXQuaG9zdFRhc2tzPUNvbW1hbmRzCitodG1sSG9zdE1hbmFnZXJTZXJ2bGV0Lmhvc3RzU3RhcnQ9U3RhcnQKK2h0bWxIb3N0TWFuYWdlclNlcnZsZXQuaG9zdHNTdG9wPVN0b3AKK2h0bWxIb3N0TWFuYWdlclNlcnZsZXQuaG9zdHNSZW1vdmU9UmVtb3ZlCitodG1sSG9zdE1hbmFnZXJTZXJ2bGV0LmFkZFRpdGxlPUFkZCBWaXJ0dWFsIEhvc3QKK2h0bWxIb3N0TWFuYWdlclNlcnZsZXQuYWRkSG9zdD1Ib3N0CitodG1sSG9zdE1hbmFnZXJTZXJ2bGV0LmFkZE5hbWU9TmFtZToKK2h0bWxIb3N0TWFuYWdlclNlcnZsZXQuYWRkQWxpYXNlcz1BbGlhc2VzOgoraHRtbEhvc3RNYW5hZ2VyU2VydmxldC5hZGRBcHBCYXNlPUFwcCBiYXNlOgoraHRtbEhvc3RNYW5hZ2VyU2VydmxldC5hZGRNYW5hZ2VyPU1hbmFnZXIgQXBwCitodG1sSG9zdE1hbmFnZXJTZXJ2bGV0LmFkZEF1dG9EZXBsb3k9QXV0b0RlcGxveQoraHRtbEhvc3RNYW5hZ2VyU2VydmxldC5hZGREZXBsb3lPblN0YXJ0dXA9RGVwbG95T25TdGFydHVwCitodG1sSG9zdE1hbmFnZXJTZXJ2bGV0LmFkZERlcGxveVhNTD1EZXBsb3lYTUwKK2h0bWxIb3N0TWFuYWdlclNlcnZsZXQuYWRkVW5wYWNrV0FScz1VbnBhY2tXQVJzCitodG1sSG9zdE1hbmFnZXJTZXJ2bGV0LmFkZFhtbE5hbWVzcGFjZUF3YXJlPVhtbE5hbWVzcGFjZUF3YXJlCitodG1sSG9zdE1hbmFnZXJTZXJ2bGV0LmFkZFhtbFZhbGlkYXRpb249WG1sVmFsaWRhdGlvbgoraHRtbEhvc3RNYW5hZ2VyU2VydmxldC5hZGRCdXR0b249QWRkCitodG1sSG9zdE1hbmFnZXJTZXJ2bGV0LnNlcnZlclRpdGxlPVNlcnZlciBJbmZvcm1hdGlvbgoraHRtbEhvc3RNYW5hZ2VyU2VydmxldC5zZXJ2ZXJWZXJzaW9uPVRvbWNhdCBWZXJzaW9uCitodG1sSG9zdE1hbmFnZXJTZXJ2bGV0LnNlcnZlckpWTVZlcnNpb249SlZNIFZlcnNpb24KK2h0bWxIb3N0TWFuYWdlclNlcnZsZXQuc2VydmVySlZNVmVuZG9yPUpWTSBWZW5kb3IKK2h0bWxIb3N0TWFuYWdlclNlcnZsZXQuc2VydmVyT1NOYW1lPU9TIE5hbWUKK2h0bWxIb3N0TWFuYWdlclNlcnZsZXQuc2VydmVyT1NWZXJzaW9uPU9TIFZlcnNpb24KK2h0bWxIb3N0TWFuYWdlclNlcnZsZXQuc2VydmVyT1NBcmNoPU9TIEFyY2hpdGVjdHVyZQorCitzdGF0dXNTZXJ2bGV0LnRpdGxlPVNlcnZlciBTdGF0dXMKK3N0YXR1c1NlcnZsZXQuY29tcGxldGU9Q29tcGxldGUgU2VydmVyIFN0YXR1cwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvaG9zdC1tYW5hZ2VyL1dFQi1JTkYvd2ViLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2hvc3QtbWFuYWdlci9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1YzA4NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2hvc3QtbWFuYWdlci9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw5NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorCis8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKKyAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKKyAgICB2ZXJzaW9uPSIyLjQiPgorCisgIDxkaXNwbGF5LW5hbWU+VG9tY2F0IE1hbmFnZXIgQXBwbGljYXRpb248L2Rpc3BsYXktbmFtZT4KKyAgPGRlc2NyaXB0aW9uPgorICAgIEEgc2NyaXB0YWJsZSBtYW5hZ2VtZW50IHdlYiBhcHBsaWNhdGlvbiBmb3IgdGhlIFRvbWNhdCBXZWIgU2VydmVyOworCU1hbmFnZXIgbGV0cyB5b3UgdmlldywgbG9hZC91bmxvYWQvZXRjIHBhcnRpY3VsYXIgd2ViIGFwcGxpY2F0aW9ucy4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8IS0tIERlZmluZSB0aGUgTWFuYWdlciBTZXJ2bGV0CisgICAgICAgQ2hhbmdlIHNlcnZsZXQtY2xhc3MgdG86IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VydmxldHMuSFRNTE1hbmFnZXJTZXJ2bGV0CisgICAgICAgdG8gZ2V0IGEgU2VydmxldCB3aXRoIGEgbW9yZSBpbnR1aXRpdmUgSFRNTCBpbnRlcmZhY2UsIGRvbid0IGNoYW5nZSBpZiB5b3UKKyAgICAgICBoYXZlIHNvZnR3YXJlIHRoYXQgaXMgZXhwZWN0ZWQgdG8gcGFyc2UgdGhlIG91dHB1dCBmcm9tIE1hbmFnZXJTZXJ2bGV0CisgICAgICAgc2luY2UgdGhleSdyZSBub3QgY29tcGF0aWJsZS4KKyAgIC0tPgorICA8c2VydmxldD4KKyAgICA8c2VydmxldC1uYW1lPkhvc3RNYW5hZ2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5jYXRhbGluYS5ob3N0bWFuYWdlci5Ib3N0TWFuYWdlclNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgICAgPGluaXQtcGFyYW0+CisgICAgICA8cGFyYW0tbmFtZT5kZWJ1ZzwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT4yPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgIDwvc2VydmxldD4KKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5IVE1MSG9zdE1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLmNhdGFsaW5hLmhvc3RtYW5hZ2VyLkhUTUxIb3N0TWFuYWdlclNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgICAgPGluaXQtcGFyYW0+CisgICAgICA8cGFyYW0tbmFtZT5kZWJ1ZzwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT4yPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgIDwvc2VydmxldD4KKworICA8IS0tIERlZmluZSB0aGUgTWFuYWdlciBTZXJ2bGV0IE1hcHBpbmcgLS0+CisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5Ib3N0TWFuYWdlcjwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vbGlzdDwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+SG9zdE1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICA8dXJsLXBhdHRlcm4+L2FkZDwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+SG9zdE1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICA8dXJsLXBhdHRlcm4+L3JlbW92ZTwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+SG9zdE1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICA8dXJsLXBhdHRlcm4+L3N0YXJ0PC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5Ib3N0TWFuYWdlcjwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vc3RvcDwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+SFRNTEhvc3RNYW5hZ2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPi9odG1sLyo8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKworICA8IS0tIERlZmluZSBhIFNlY3VyaXR5IENvbnN0cmFpbnQgb24gdGhpcyBBcHBsaWNhdGlvbiAtLT4KKyAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPkhUTUxIb3N0TWFuYWdlciBhbmQgSG9zdE1hbmFnZXIgY29tbWFuZHM8L3dlYi1yZXNvdXJjZS1uYW1lPgorICAgICAgPHVybC1wYXR0ZXJuPi9odG1sLyo8L3VybC1wYXR0ZXJuPgorICAgICAgPHVybC1wYXR0ZXJuPi9saXN0PC91cmwtcGF0dGVybj4KKyAgICAgIDx1cmwtcGF0dGVybj4vYWRkPC91cmwtcGF0dGVybj4KKyAgICAgIDx1cmwtcGF0dGVybj4vcmVtb3ZlPC91cmwtcGF0dGVybj4KKyAgICAgIDx1cmwtcGF0dGVybj4vc3RhcnQ8L3VybC1wYXR0ZXJuPgorICAgICAgPHVybC1wYXR0ZXJuPi9zdG9wPC91cmwtcGF0dGVybj4KKyAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgIDxhdXRoLWNvbnN0cmFpbnQ+CisgICAgICAgPCEtLSBOT1RFOiAgVGhpcyByb2xlIGlzIG5vdCBwcmVzZW50IGluIHRoZSBkZWZhdWx0IHVzZXJzIGZpbGUgLS0+CisgICAgICAgPHJvbGUtbmFtZT5hZG1pbjwvcm9sZS1uYW1lPgorICAgIDwvYXV0aC1jb25zdHJhaW50PgorICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+CisKKyAgPCEtLSBEZWZpbmUgdGhlIExvZ2luIENvbmZpZ3VyYXRpb24gZm9yIHRoaXMgQXBwbGljYXRpb24gLS0+CisgIDxsb2dpbi1jb25maWc+CisgICAgPGF1dGgtbWV0aG9kPkJBU0lDPC9hdXRoLW1ldGhvZD4KKyAgICA8cmVhbG0tbmFtZT5Ub21jYXQgSG9zdCBNYW5hZ2VyIEFwcGxpY2F0aW9uPC9yZWFsbS1uYW1lPgorICA8L2xvZ2luLWNvbmZpZz4KKworICA8IS0tIFNlY3VyaXR5IHJvbGVzIHJlZmVyZW5jZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24gLS0+CisgIDxzZWN1cml0eS1yb2xlPgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgIFRoZSByb2xlIHRoYXQgaXMgcmVxdWlyZWQgdG8gbG9nIGluIHRvIHRoZSBNYW5hZ2VyIEFwcGxpY2F0aW9uCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8cm9sZS1uYW1lPmFkbWluPC9yb2xlLW5hbWU+CisgIDwvc2VjdXJpdHktcm9sZT4KKworPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvaG9zdC1tYW5hZ2VyL2J1aWxkLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2hvc3QtbWFuYWdlci9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhZjQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2hvc3QtbWFuYWdlci9idWlsZC54bWwKQEAgLTAsMCArMSwxMjYgQEAKKzxwcm9qZWN0IG5hbWU9Imhvc3QtbWFuYWdlciIgZGVmYXVsdD0iYnVpbGQtbWFpbiIgYmFzZWRpcj0iLiI+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBJbml0aWFsaXplIFByb3BlcnR5IFZhbHVlcyA9PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDwhLS0gU2VlICJidWlsZC5wcm9wZXJ0aWVzLnNhbXBsZSIgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgZm9yIGFsbCAgICAgLS0+CisgIDwhLS0gcHJvcGVydHkgdmFsdWVzIHlvdSBtdXN0IGN1c3RvbWl6ZSBmb3Igc3VjY2Vzc2Z1bCBidWlsZGluZyEhISAgICAgICAgLS0+CisgIDxwcm9wZXJ0eSBmaWxlPSJidWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIuLi9idWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIuLi8uLi9idWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3VzZXIuaG9tZX0vYnVpbGQucHJvcGVydGllcyIvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlciIgIHZhbHVlPSJtb2Rlcm4iLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcHMuYnVpbGQiICAgdmFsdWU9Ii4uL2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWJhcHBzLmRpc3QiICAgIHZhbHVlPSIuLi9kaXN0Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWJhcHAubmFtZSIgICAgIHZhbHVlPSJob3N0LW1hbmFnZXIiLz4KKworICA8IS0tIERlcGVuZGVudCBKQVJzIGFuZCBmaWxlcyAtLT4KKyAgPHByb3BlcnR5IG5hbWU9InNlcnZsZXQtYXBpLmphciIgdmFsdWU9IiR7YXBpLmhvbWV9L2pzcjE1NC9kaXN0L2xpYi9zZXJ2bGV0LWFwaS5qYXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImpzcC1hcGkuamFyIiAgICAgdmFsdWU9IiR7YXBpLmhvbWV9L2pzcjE1Mi9kaXN0L2xpYi9qc3AtYXBpLmphciIvPgorCisgIDwhLS0gQ29uc3RydWN0IEFkbWluIGNsYXNzcGF0aCAtLT4KKyAgPHBhdGggaWQ9Imhvc3QtbWFuYWdlci5jbGFzc3BhdGgiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjYXRhbGluYS5kZXBsb3l9L2NsYXNzZXMiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1maWxldXBsb2FkLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sb2dnaW5nLmphcn0iLz4gICAKKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1tb2RlbGVyLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7am14Lmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7c2VydmxldC1hcGkuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqc3AtYXBpLmphcn0iLz4KKyAgPC9wYXRoPgorCisKKwkgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDb3B5IEpBUnMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5idWlsZH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9pbWFnZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYiLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYvY2xhc3NlcyIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ29weSBTdGF0aWMgRmlsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtc3RhdGljIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlIj4KKyAgICA8Y29weSB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJidWlsZC4qIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT0gQlVJTEQ6IENvbXBpbGUgU2VydmVyIENvbXBvbmVudHMgPT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtbWFpbiIgZGVwZW5kcz0iYnVpbGQtc3RhdGljIj4KKworICAgIDwhLS0gVG9wIExldmVsIERpcmVjdG9yeSAtLT4KKyAgICA8c3R5bGUgYmFzZWRpcj0iLi4vZG9jcyIKKyAgICAgICAgICAgZGVzdGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSIKKyAgICAgICAgICAgZXh0ZW5zaW9uPSIuaHRtbCIKKyAgICAgICAgICAgc3R5bGU9InRvbWNhdC1kb2NzLnhzbCIKKyAgICAgICAgICAgZXhjbHVkZXM9ImJ1aWxkLnhtbCBwcm9qZWN0LnhtbCIKKyAgICAgICAgICAgaW5jbHVkZXM9Imhvc3QtbWFuYWdlci1ob3d0by54bWwsaG9zdC1odG1sLW1hbmFnZXItaG93dG8ueG1sIj4KKyAgICAgIDxwYXJhbSBuYW1lPSJyZWxhdGl2ZS1wYXRoIiBleHByZXNzaW9uPSIuIi8+CisgICAgICA8cGFyYW0gbmFtZT0icHJvamVjdC1tZW51IiBleHByZXNzaW9uPSJub21lbnUiLz4KKyAgICAgIDxwYXJhbSBuYW1lPSJzdGFuZGFsb25lIiBleHByZXNzaW9uPSJzdGFuZGFsb25lIi8+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gSW1hZ2VzIFN1YmRpcmVjdG9yeSAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9pbWFnZXMiPgorICAgICAgPGZpbGVzZXQgZGlyPSIuLi9kb2NzL2ltYWdlcyI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9InByaW50ZXIuZ2lmIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorCisgICAgPGphdmFjICAgc3JjZGlyPSJXRUItSU5GL2NsYXNzZXMiIAorICAgICAgICAgICAgIGRlc3RkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vV0VCLUlORi9jbGFzc2VzIgorICAgICAgICAgICAgIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IiBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKyAgICAgICAgICAgICBvcHRpbWl6ZT0iJHtjb21waWxlLm9wdGltaXplfSIKKyAgICAgICAgICAgICBleGNsdWRlcz0iKiovQ1ZTLyoqIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Imhvc3QtbWFuYWdlci5jbGFzc3BhdGgiIC8+CisgICAgPC9qYXZhYz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IFJlYnVpbGQgRXZlcnl0aGluZyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJidWlsZC1jbGVhbixidWlsZC1tYWluIgorICAgZGVzY3JpcHRpb249IkNsZWFuIGFuZCBidWlsZCBob3N0IG1hbmFnZXIgd2ViYXBwIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuZGlzdH0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXN0cmlidXRpb24gRmlsZXMgPT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImJ1aWxkLW1haW4sZGlzdC1wcmVwYXJlIgorICAgZGVzY3JpcHRpb249IkNyZWF0ZSBob3N0IG1hbmFnZXIgd2ViYXBwIGJpbmFyeSBkaXN0cmlidXRpb24iPgorICAgICAgPGphciAgIGphcmZpbGU9IiR7d2ViYXBwcy5kaXN0fS8ke3dlYmFwcC5uYW1lfS53YXIiCisgICAgICAgICAgICAgYmFzZWRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSIgaW5jbHVkZXM9IioqIi8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0LWNsZWFuIj4KKyAgICA8ZGVsdHJlZSBkaXI9IiR7ZGlzdC5kaXJ9LyR7d2ViYXBwLm5hbWV9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IENvbnZlbmllbnQgU3lub255bXMgPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iYnVpbGQtY2xlYW4sZGlzdC1jbGVhbiIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiBidWlsZCBhbmQgZGlzdCBkaXJlY3RvcmllcyIvPgorCisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2hvc3QtbWFuYWdlci9ob3N0LW1hbmFnZXIueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvaG9zdC1tYW5hZ2VyL2hvc3QtbWFuYWdlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxOTE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2hvc3QtbWFuYWdlci9ob3N0LW1hbmFnZXIueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzwhLS0KKworICAgIENvbnRleHQgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgVG9tY2F0IEhvc3QgTWFuYWdlciBXZWIgQXBwCisKKyAgICAkSWQkCisKKy0tPgorCisKKzxDb250ZXh0IGRvY0Jhc2U9IiR7Y2F0YWxpbmEuaG9tZX0vc2VydmVyL3dlYmFwcHMvaG9zdC1tYW5hZ2VyIgorICAgICAgICAgcHJpdmlsZWdlZD0idHJ1ZSIgYW50aVJlc291cmNlTG9ja2luZz0iZmFsc2UiIGFudGlKQVJMb2NraW5nPSJmYWxzZSI+CisKKzwvQ29udGV4dD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2hvc3QtbWFuYWdlci9tYW5hZ2VyLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2hvc3QtbWFuYWdlci9tYW5hZ2VyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZThjZDZhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvaG9zdC1tYW5hZ2VyL21hbmFnZXIueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzwhLS0KKworICAgIENvbnRleHQgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgVG9tY2F0IE1hbmFnZXIgV2ViIEFwcAorCisgICAgJElkJAorCistLT4KKworCis8Q29udGV4dCBkb2NCYXNlPSIke2NhdGFsaW5hLmhvbWV9L3NlcnZlci93ZWJhcHBzL21hbmFnZXIiCisgICAgICAgICBwcml2aWxlZ2VkPSJ0cnVlIiBhbnRpUmVzb3VyY2VMb2NraW5nPSJmYWxzZSIgYW50aUpBUkxvY2tpbmc9ImZhbHNlIj4KKworPC9Db250ZXh0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvam14cmVtb3RlL1JFQURNRSBiL2NvbnRhaW5lci93ZWJhcHBzL2pteHJlbW90ZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyOWQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2pteHJlbW90ZS9SRUFETUUKQEAgLTAsMCArMSwxMiBAQAorU2ltcGxlIHdlYmFwcCB0aGF0IGxvYWRzIHRoZSBKbXggcmVtb3RlIGNvbm5lY3Rvci4gCisKK1lvdSBuZWVkIHRvIGFkZCBteDRqLXJlbW90ZS5qYXIgdG8geW91ciBjb21tb24gbG9hZGVyIG9yIHVzZSBKREsxLjUuIEFueSBvdGhlciBKTVggaW1wbGVtZW50YXRpb24KK3RoYXQgc3VwcG9ydHMgamF2YXgucmVtb3RlIHNob3VsZCB3b3JrIGFzIHdlbGwuIAorCitUaGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBpcyBhIGJpdCBkaWZmZXJlbnQgZnJvbSBtYW5hZ2VyIGFuZCB0aGUgb3RoZXIgd2ViYXBwcyBpbiBjYXRhbGluYS4gSSdtCit1c2luZyBlY2xpcHNlLCBzZXQgdXAgdG8gdXNlIHNlcGFyYXRlIG91dHB1dCBkaXJzIGFuZCBhdXRvY29tcGlsZS4gVGhlIG91dHB1dCBkaXIgaXMgc2V0IHRvIFdFQi1JTkYvY2xhc3NlcywKK2FuZCBJIGhhdmUgYSBzeW1saW5rIHRvIHRoZSBqbXhyZW1vdGUgZGlyIGluIHRoZSBzb3VyY2VzIC0gc28gYmFzaWNhbGx5IHRoZXJlIGlzIG5vIG5lZWQgdG8gcnVuIGFudC9tYW51YWxseSBjb21waWxlLCAKK2p1c3Qgc2F2ZSB0aGUgZmlsZSBhbmQgcmVsb2FkIHRoZSBhcHAuIAorCitNSVNTSU5HOiB1c2VyL3Bhc3N3b3JkLCBTU0wsIGN1c3RvbSBSTUkgc2VydmVyIGFkZHJlc3MgLSBjYW4gYmUgZWFzaWx5IGFkZGVkIHVzaW5nIHNlcnZsZXQgcGFyYW1zICggYW5kIHNob3VsZCBiZSAKK2FkZGVkIGlmIHRoaXMgZXZlciBnZXRzIGluY2x1ZGVkIGluIHRoZSBkaXN0cm8gKQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvam14cmVtb3RlL1dFQi1JTkYvc3JjL29yZy9hcGFjaGUvdG9tY2F0L3NlcnZsZXRzL2pteHJlbW90ZS9KbXhSZW1vdGVTZXJ2bGV0LmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9qbXhyZW1vdGUvV0VCLUlORi9zcmMvb3JnL2FwYWNoZS90b21jYXQvc2VydmxldHMvam14cmVtb3RlL0pteFJlbW90ZVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2VkMDgyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvam14cmVtb3RlL1dFQi1JTkYvc3JjL29yZy9hcGFjaGUvdG9tY2F0L3NlcnZsZXRzL2pteHJlbW90ZS9KbXhSZW1vdGVTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDcmVhdGVkIG9uIEp1bCAxNCwgMjAwNAorICoKKyAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bworICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b21jYXQuc2VydmxldHMuam14cmVtb3RlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnJtaS5yZWdpc3RyeS5Mb2NhdGVSZWdpc3RyeTsKK2ltcG9ydCBqYXZhLnJtaS5yZWdpc3RyeS5SZWdpc3RyeTsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YQ29ubmVjdG9yU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvclNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YU2VydmljZVVSTDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvLyBVc2luZyBvLmEudG9tY2F0LnNlcnZsZXRzIGJlY2F1c2Ugby5hLmNhdGFsaW5hIHdvbid0IGJlIGxvYWRlZCB1bmxlc3MgdHJ1c3RlZCBhcHAgCisKKy8qKgorICogRXhwZXJpbWVudGFsIHNlcnZsZXQgYWxsb3dpbmcgY29ubmVjdG9ycyB0byBiZSBkZXBsb3llZCBhbmQgbWFuYWdlZCB1c2luZyB0aGUgCisgKiB3ZWJhcHAgaW5mcmFzdHJ1Y3R1cmUuCisgKiAKKyAqIENvbm5lY3RvcnMgY2FuIGJlIHBhY2thZ2VkIGluIGEgV0FSIGZpbGUsIGRlcGxveWVkIGFuZCBtYW5hZ2VkIHVzaW5nIHRoZSAKKyAqIG5vcm1hbCB0b29scy4gQ29uZmlndXJhdGlvbiBpcyBkb25lIHVzaW5nIHdlYi54bWwgaW5pdC1wYXJhbXMgLSB3aGlsZSB0aGlzIGlzIAorICogbm90IGFzIHNpbXBsZSBhcyA8Y29ubmVjdG9yPiB0YWdzIGluIHNlcnZlci54bWwsIGl0IG1heSBiZSBlYXNpZXIgdG8gc3VwcG9ydAorICogaW4gdG9vbHMgYW5kIGV4cGxhaW4gdG8gd2ViYXBwIGRldmVsb3BlcnMuCisgKiAKKyAqIFNpbmNlIHdlYmFwcCBjbGFzcyBsb2FkZXIgaXMgdXNlZCAtIHN0YXJ0L3N0b3AgYXMgd2VsbCBhcyByZWxvYWRpbmcgY2FuIGJlIAorICogY29udHJvbGxlZCBmcm9tIHRoZSAvbWFuYWdlci4KKyAqIAorICogSXNzdWVzOgorICogIC0gbWF5IHBvbHV0ZSB0aGUgd2ViYXBwcyBuYW1lc3BhY2UgLSBzb2x1dGlvbiB3b3VsZCBiZSB0byByZXNlcnZlIGEgcHJlZml4CisgKiBvciB1c2Ugc29tZSBpbnZhbGlkL3NwZWNpYWwgbmFtZS4gICAgCisgKgorICogQGF1dGhvciBDb3N0aW4gTWFub2xhY2hlCisgKi8KK3B1YmxpYyBjbGFzcyBKbXhSZW1vdGVTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworICAgIEpNWENvbm5lY3RvclNlcnZlciBjbnRvclNlcnZlciA9IG51bGw7IAorICAgIAorICAgIHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25mKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG90aGVyd2lzZSBsb2cgZG9lc24ndCB3b3JrCisgICAgICAgIHN1cGVyLmluaXQoY29uZik7CisgICAgICAgIAorICAgICAgICBNQmVhblNlcnZlciBtQmVhblNlcnZlciA9IG51bGw7CisKKyAgICAgICAgUmVnaXN0cnkgcmVnPW51bGw7CisgICAgICAgIAorICAgICAgICAvLyBUT0RPOiB1c2UgY29uZmlnIHRvIGdldCB0aGUgcmVnaXN0cnkgcG9ydCwgdXJsLCBwYXNzLCB1c2VyCisKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiggcmVnPT1udWxsICkKKyAgICAgICAgICAgICAgICByZWc9TG9jYXRlUmVnaXN0cnkuY3JlYXRlUmVnaXN0cnkoMTA5OSk7CisgICAgICAgIH0gY2F0Y2goIFRocm93YWJsZSB0ICkgeworICAgICAgICAgICAgbG9nKCJDYW4ndCBzdGFydCByZWdpc3RyeSAtIGl0IG1heSBiZSBhbHJlYWR5IHN0YXJ0ZWQ6ICIgKyB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CZWFuU2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChNQmVhblNlcnZlckZhY3RvcnkuZmluZE1CZWFuU2VydmVyKG51bGwpLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtQmVhblNlcnZlciA9CisgICAgICAgICAgICAgICAgICAgIChNQmVhblNlcnZlcikgTUJlYW5TZXJ2ZXJGYWN0b3J5LmZpbmRNQmVhblNlcnZlcihudWxsKS5nZXQoMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1CZWFuU2VydmVyID0gTUJlYW5TZXJ2ZXJGYWN0b3J5LmNyZWF0ZU1CZWFuU2VydmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goIFRocm93YWJsZSB0ICkgeworICAgICAgICAgICAgbG9nKCJDYW4ndCBnZXQgdGhlIG1iZWFuIHNlcnZlciAiICsgdCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKTVhTZXJ2aWNlVVJMIGFkZHJlc3MgPSBuZXcgSk1YU2VydmljZVVSTCgic2VydmljZTpqbXg6cm1pOi8vcm1pSG9zdC9qbmRpL3JtaTovL2xvY2FsaG9zdDoxMDk5L2puZGlQYXRoIik7CisgICAgICAgICAgICBjbnRvclNlcnZlciA9IAorICAgICAgICAgICAgICAgIEpNWENvbm5lY3RvclNlcnZlckZhY3RvcnkubmV3Sk1YQ29ubmVjdG9yU2VydmVyKGFkZHJlc3MsIG51bGwsIG1CZWFuU2VydmVyKTsKKyAgICAgICAgICAgIGNudG9yU2VydmVyLnN0YXJ0KCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBsb2coIkNhbid0IHJlZ2lzdGVyIGpteCBjb25uZWN0b3IgIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogU3RvcCB0aGUgY29ubmVjdG9yCisgICAgICogCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmKCBjbnRvclNlcnZlciAhPSBudWxsICkgY250b3JTZXJ2ZXIuc3RvcCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJlc3Auc2VuZEVycm9yKDQwNCk7CisgICAgfQorCisgICAgLy8gSSBkb24ndCBrbm93IHdoeSBzdXBlci5sb2cgaXMgYnJva2VuIGluIGluaXQgCisvLyAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIHMpIHsKKy8vICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkpNWCByZW06IiArIHMpOworLy8gICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9qbXhyZW1vdGUvV0VCLUlORi93ZWIueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvam14cmVtb3RlL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMTBlMDBiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvam14cmVtb3RlL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCisgICAgdmVyc2lvbj0iMi40Ij4KKworICA8ZGlzcGxheS1uYW1lPkpNWCBSZW1vdGUgQ29ubmVjdG9yIExvYWRlcjwvZGlzcGxheS1uYW1lPgorICA8ZGVzY3JpcHRpb24+CisJV2lsbCBzdGFydCBKbXggUk1JIGNvbm5lY3RvciBpZiBKTVggaXMgYXZhaWxhYmxlLgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW5hbWU+Sm14UmVtb3RlPC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50b21jYXQuc2VydmxldHMuam14cmVtb3RlLkpteFJlbW90ZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgICAgPGluaXQtcGFyYW0+CisgICAgICA8cGFyYW0tbmFtZT5kZWJ1ZzwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT4wPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgIDwvc2VydmxldD4KKworPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvam14cmVtb3RlL2J1aWxkLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2pteHJlbW90ZS9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwOTZiNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2pteHJlbW90ZS9idWlsZC54bWwKQEAgLTAsMCArMSwxMDUgQEAKKzxwcm9qZWN0IG5hbWU9Im1hbmFnZXIiIGRlZmF1bHQ9ImJ1aWxkLW1haW4iIGJhc2VkaXI9Ii4iPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSBQcm9wZXJ0eSBWYWx1ZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8IS0tIFNlZSAiYnVpbGQucHJvcGVydGllcy5zYW1wbGUiIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGZvciBhbGwgICAgIC0tPgorICA8IS0tIHByb3BlcnR5IHZhbHVlcyB5b3UgbXVzdCBjdXN0b21pemUgZm9yIHN1Y2Nlc3NmdWwgYnVpbGRpbmchISEgICAgICAgIC0tPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9L2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uL2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uLy4uL2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uLy4uLy4uL2pha2FydGEtdG9tY2F0LTUvYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iLi4vLi4vLi4vamFrYXJ0YS10b21jYXQtNS9idWlsZC5wcm9wZXJ0aWVzLmRlZmF1bHQiLz4KKworICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiICB2YWx1ZT0ibW9kZXJuIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWJhcHBzLmJ1aWxkIiAgIHZhbHVlPSIuLi9idWlsZCIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViYXBwcy5kaXN0IiAgICB2YWx1ZT0iLi4vZGlzdCIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViYXBwLm5hbWUiICAgICB2YWx1ZT0iam14cmVtb3RlIi8+CisKKyAgPCEtLSBEZXBlbmRlbnQgSkFScyBhbmQgZmlsZXMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2bGV0LWFwaS5qYXIiIHZhbHVlPSIke2FwaS5ob21lfS9qc3IxNTQvZGlzdC9saWIvc2VydmxldC1hcGkuamFyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqc3AtYXBpLmphciIgICAgIHZhbHVlPSIke2FwaS5ob21lfS9qc3IxNTIvZGlzdC9saWIvanNwLWFwaS5qYXIiLz4KKworICA8cGF0aCBpZD0iYnVpbGQuY2xhc3NwYXRoIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2F0YWxpbmEuZGVwbG95fS9jbGFzc2VzIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtZmlsZXVwbG9hZC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbW9kZWxlci5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pteC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pteC1yZW1vdGUuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtzZXJ2bGV0LWFwaS5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pzcC1hcGkuamFyfSIvPgorICA8L3BhdGg+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5idWlsZH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9pbWFnZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYiLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYvY2xhc3NlcyIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ29weSBTdGF0aWMgRmlsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtc3RhdGljIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlIj4KKyAgICA8Y29weSB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJidWlsZC4qIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT0gQlVJTEQ6IENvbXBpbGUgU2VydmVyIENvbXBvbmVudHMgPT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtbWFpbiIgZGVwZW5kcz0iYnVpbGQtc3RhdGljIj4KKworICAgIDxqYXZhYyAgIHNyY2Rpcj0iV0VCLUlORi9zcmMiIAorICAgICAgICAgICAgIGRlc3RkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vV0VCLUlORi9jbGFzc2VzIgorICAgICAgICAgICAgIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IiBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKyAgICAgICAgICAgICBvcHRpbWl6ZT0iJHtjb21waWxlLm9wdGltaXplfSIKKyAgICAgICAgICAgICBleGNsdWRlcz0iKiovQ1ZTLyoqIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzcGF0aCIgLz4KKyAgICA8L2phdmFjPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBCVUlMRDogUmVidWlsZCBFdmVyeXRoaW5nID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGJ1aWxkLW1haW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYW5kIGJ1aWxkIG1hbmFnZXIgd2ViYXBwIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuZGlzdH0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXN0cmlidXRpb24gRmlsZXMgPT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImJ1aWxkLW1haW4sZGlzdC1wcmVwYXJlIgorICAgZGVzY3JpcHRpb249IkNyZWF0ZSBtYW5hZ2VyIHdlYmFwcCBiaW5hcnkgZGlzdHJpYnV0aW9uIj4KKyAgICAgIDxqYXIgICBqYXJmaWxlPSIke3dlYmFwcHMuZGlzdH0vJHt3ZWJhcHAubmFtZX0ud2FyIgorICAgICAgICAgICAgIGJhc2VkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0iIGluY2x1ZGVzPSIqKiIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1jbGVhbiI+CisgICAgPGRlbHRyZWUgZGlyPSIke2Rpc3QuZGlyfS8ke3dlYmFwcC5uYW1lfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBDb252ZW5pZW50IFN5bm9ueW1zID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGRpc3QtY2xlYW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYnVpbGQgYW5kIGRpc3QgZGlyZWN0b3JpZXMiLz4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvQ29uc3RhbnRzLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5N2Q4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1hbmFnZXI7CisKKworcHVibGljIGNsYXNzIENvbnN0YW50cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQYWNrYWdlID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEubWFuYWdlciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0hFQURFUl9TRUNUSU9OID0KKyAgICAgICAgIjxodG1sPlxuIiArCisgICAgICAgICI8aGVhZD5cbiIgKworICAgICAgICAiPHN0eWxlPlxuIiArCisgICAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5Ub21jYXRDU1MuVE9NQ0FUX0NTUyArCisgICAgICAgICIgIHRhYmxlIHtcbiIgKworICAgICAgICAiICAgIHdpZHRoOiAxMDAlO1xuIiArCisgICAgICAgICIgIH1cbiIgKworICAgICAgICAiICB0ZC5wYWdlLXRpdGxlIHtcbiIgKworICAgICAgICAiICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiIgKworICAgICAgICAiICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4iICsKKyAgICAgICAgIiAgICBmb250LWZhbWlseTpzYW5zLXNlcmlmLFRhaG9tYSxBcmlhbDtcbiIgKworICAgICAgICAiICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuIiArCisgICAgICAgICIgICAgYmFja2dyb3VuZDogd2hpdGU7XG4iICsKKyAgICAgICAgIiAgICBjb2xvcjogYmxhY2s7XG4iICsKKyAgICAgICAgIiAgfVxuIiArCisgICAgICAgICIgIHRkLnRpdGxlIHtcbiIgKworICAgICAgICAiICAgIHRleHQtYWxpZ246IGxlZnQ7XG4iICsKKyAgICAgICAgIiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuIiArCisgICAgICAgICIgICAgZm9udC1mYW1pbHk6c2Fucy1zZXJpZixUYWhvbWEsQXJpYWw7XG4iICsKKyAgICAgICAgIiAgICBmb250LXN0eWxlOml0YWxpYztcbiIgKworICAgICAgICAiICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuIiArCisgICAgICAgICIgICAgYmFja2dyb3VuZDogI0QyQTQxQztcbiIgKworICAgICAgICAiICB9XG4iICsKKyAgICAgICAgIiAgdGQuaGVhZGVyLWxlZnQge1xuIiArCisgICAgICAgICIgICAgdGV4dC1hbGlnbjogbGVmdDtcbiIgKworICAgICAgICAiICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4iICsKKyAgICAgICAgIiAgICBmb250LWZhbWlseTpzYW5zLXNlcmlmLFRhaG9tYSxBcmlhbDtcbiIgKworICAgICAgICAiICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuIiArCisgICAgICAgICIgICAgYmFja2dyb3VuZDogI0ZGREM3NTtcbiIgKworICAgICAgICAiICB9XG4iICsKKyAgICAgICAgIiAgdGQuaGVhZGVyLWNlbnRlciB7XG4iICsKKyAgICAgICAgIiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4iICsKKyAgICAgICAgIiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuIiArCisgICAgICAgICIgICAgZm9udC1mYW1pbHk6c2Fucy1zZXJpZixUYWhvbWEsQXJpYWw7XG4iICsKKyAgICAgICAgIiAgICBmb250LXdlaWdodDogYm9sZDtcbiIgKworICAgICAgICAiICAgIGJhY2tncm91bmQ6ICNGRkRDNzU7XG4iICsKKyAgICAgICAgIiAgfVxuIiArCisgICAgICAgICIgIHRkLnJvdy1sZWZ0IHtcbiIgKworICAgICAgICAiICAgIHRleHQtYWxpZ246IGxlZnQ7XG4iICsKKyAgICAgICAgIiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuIiArCisgICAgICAgICIgICAgZm9udC1mYW1pbHk6c2Fucy1zZXJpZixUYWhvbWEsQXJpYWw7XG4iICsKKyAgICAgICAgIiAgICBjb2xvcjogYmxhY2s7XG4iICsKKyAgICAgICAgIiAgfVxuIiArCisgICAgICAgICIgIHRkLnJvdy1jZW50ZXIge1xuIiArCisgICAgICAgICIgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuIiArCisgICAgICAgICIgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiIgKworICAgICAgICAiICAgIGZvbnQtZmFtaWx5OnNhbnMtc2VyaWYsVGFob21hLEFyaWFsO1xuIiArCisgICAgICAgICIgICAgY29sb3I6IGJsYWNrO1xuIiArCisgICAgICAgICIgIH1cbiIgKworICAgICAgICAiICB0ZC5yb3ctcmlnaHQge1xuIiArCisgICAgICAgICIgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4iICsKKyAgICAgICAgIiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuIiArCisgICAgICAgICIgICAgZm9udC1mYW1pbHk6c2Fucy1zZXJpZixUYWhvbWEsQXJpYWw7XG4iICsKKyAgICAgICAgIiAgICBjb2xvcjogYmxhY2s7XG4iICsKKyAgICAgICAgIiAgfVxuIiArCisgICAgICAgICIgIFRIIHtcbiIgKworICAgICAgICAiICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiIgKworICAgICAgICAiICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4iICsKKyAgICAgICAgIiAgICBmb250LWZhbWlseTpzYW5zLXNlcmlmLFRhaG9tYSxBcmlhbDtcbiIgKworICAgICAgICAiICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuIiArCisgICAgICAgICIgICAgYmFja2dyb3VuZDogI0ZGREM3NTtcbiIgKworICAgICAgICAiICB9XG4iICsKKyAgICAgICAgIiAgVEQge1xuIiArCisgICAgICAgICIgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuIiArCisgICAgICAgICIgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiIgKworICAgICAgICAiICAgIGZvbnQtZmFtaWx5OnNhbnMtc2VyaWYsVGFob21hLEFyaWFsO1xuIiArCisgICAgICAgICIgICAgY29sb3I6IGJsYWNrO1xuIiArCisgICAgICAgICIgIH1cbiIgKworICAgICAgICAiPC9zdHlsZT5cbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZX0hFQURFUl9TRUNUSU9OID0KKyAgICAgICAgIjx0aXRsZT57MH08L3RpdGxlPlxuIiArCisgICAgICAgICI8L2hlYWQ+XG4iICsKKyAgICAgICAgIlxuIiArCisgICAgICAgICI8Ym9keSBiZ2NvbG9yPVwiI0ZGRkZGRlwiPlxuIiArCisgICAgICAgICJcbiIgKworICAgICAgICAiPHRhYmxlIGNlbGxzcGFjaW5nPVwiNFwiIHdpZHRoPVwiMTAwJVwiIGJvcmRlcj1cIjBcIj5cbiIgKworICAgICAgICAiIDx0cj5cbiIgKworICAgICAgICAiICA8dGQgY29sc3Bhbj1cIjJcIj5cbiIgKworICAgICAgICAiICAgPGEgaHJlZj1cImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9cIj5cbiIgKworICAgICAgICAiICAgIDxpbWcgYm9yZGVyPVwiMFwiIGFsdD1cIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvblwiIGFsaWduPVwibGVmdFwiXG4iICsKKyAgICAgICAgIiAgICAgICAgIHNyYz1cInswfS9pbWFnZXMvYXNmLWxvZ28uZ2lmXCI+XG4iICsKKyAgICAgICAgIiAgIDwvYT5cbiIgKworICAgICAgICAiICAgPGEgaHJlZj1cImh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy9cIj5cbiIgKworICAgICAgICAiICAgIDxpbWcgYm9yZGVyPVwiMFwiIGFsdD1cIlRoZSBUb21jYXQgU2VydmxldC9KU1AgQ29udGFpbmVyXCJcbiIgKworICAgICAgICAiICAgICAgICAgYWxpZ249XCJyaWdodFwiIHNyYz1cInswfS9pbWFnZXMvdG9tY2F0LmdpZlwiPlxuIiArCisgICAgICAgICIgICA8L2E+XG4iICsKKyAgICAgICAgIiAgPC90ZD5cbiIgKworICAgICAgICAiIDwvdHI+XG4iICsKKyAgICAgICAgIjwvdGFibGU+XG4iICsKKyAgICAgICAgIjxociBzaXplPVwiMVwiIG5vc2hhZGU9XCJub3NoYWRlXCI+XG4iICsKKyAgICAgICAgIjx0YWJsZSBjZWxsc3BhY2luZz1cIjRcIiB3aWR0aD1cIjEwMCVcIiBib3JkZXI9XCIwXCI+XG4iICsKKyAgICAgICAgIiA8dHI+XG4iICsKKyAgICAgICAgIiAgPHRkIGNsYXNzPVwicGFnZS10aXRsZVwiIGJvcmRlcmNvbG9yPVwiIzAwMDAwMFwiICIgKworICAgICAgICAiYWxpZ249XCJsZWZ0XCIgbm93cmFwPlxuIiArCisgICAgICAgICIgICA8Zm9udCBzaXplPVwiKzJcIj57MX08L2ZvbnQ+XG4iICsKKyAgICAgICAgIiAgPC90ZD5cbiIgKworICAgICAgICAiIDwvdHI+XG4iICsKKyAgICAgICAgIjwvdGFibGU+XG4iICsKKyAgICAgICAgIjxicj5cbiIgKworICAgICAgICAiXG4iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9TRUNUSU9OID0KKyAgICAgICAgIjx0YWJsZSBib3JkZXI9XCIxXCIgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIzXCI+XG4iICsKKyAgICAgICAgIiA8dHI+XG4iICsKKyAgICAgICAgIiAgPHRkIGNsYXNzPVwicm93LWxlZnRcIiB3aWR0aD1cIjEwJVwiPiIgKworICAgICAgICAiPHNtYWxsPjxzdHJvbmc+ezB9PC9zdHJvbmc+PC9zbWFsbD4mbmJzcDs8L3RkPlxuIiArCisgICAgICAgICIgIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCI+PHByZT57MX08L3ByZT48L3RkPlxuIiArCisgICAgICAgICIgPC90cj5cbiIgKworICAgICAgICAiPC90YWJsZT5cbiIgKworICAgICAgICAiPGJyPlxuIiArCisgICAgICAgICJcbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5BR0VSX1NFQ1RJT04gPQorICAgICAgICAiPHRhYmxlIGJvcmRlcj1cIjFcIiBjZWxsc3BhY2luZz1cIjBcIiBjZWxscGFkZGluZz1cIjNcIj5cbiIgKworICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNvbHNwYW49XCI0XCIgY2xhc3M9XCJ0aXRsZVwiPnswfTwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iICsKKyAgICAgICAgIiA8dHI+XG4iICsKKyAgICAgICAgIiAgPHRkIGNsYXNzPVwicm93LWxlZnRcIj48YSBocmVmPVwiezF9XCI+ezJ9PC9hPjwvdGQ+XG4iICsKKyAgICAgICAgIiAgPHRkIGNsYXNzPVwicm93LWNlbnRlclwiPjxhIGhyZWY9XCJ7M31cIj57NH08L2E+PC90ZD5cbiIgKworICAgICAgICAiICA8dGQgY2xhc3M9XCJyb3ctY2VudGVyXCI+PGEgaHJlZj1cIns1fVwiPns2fTwvYT48L3RkPlxuIiArCisgICAgICAgICIgIDx0ZCBjbGFzcz1cInJvdy1yaWdodFwiPjxhIGhyZWY9XCJ7N31cIj57OH08L2E+PC90ZD5cbiIgKworICAgICAgICAiIDwvdHI+XG4iICsKKyAgICAgICAgIjwvdGFibGU+XG4iICsKKyAgICAgICAgIjxicj5cbiIgKworICAgICAgICAiXG4iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0hFQURFUl9TRUNUSU9OID0KKyAgICAgICAgIjx0YWJsZSBib3JkZXI9XCIxXCIgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIzXCI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjb2xzcGFuPVwiNlwiIGNsYXNzPVwidGl0bGVcIj57MH08L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIiArCisgICAgICAgICI8dHI+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJoZWFkZXItY2VudGVyXCI+PHNtYWxsPnsxfTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cImhlYWRlci1jZW50ZXJcIj48c21hbGw+ezJ9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwiaGVhZGVyLWNlbnRlclwiPjxzbWFsbD57M308L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJoZWFkZXItY2VudGVyXCI+PHNtYWxsPns0fTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cImhlYWRlci1jZW50ZXJcIj48c21hbGw+ezV9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwiaGVhZGVyLWNlbnRlclwiPjxzbWFsbD57Nn08L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1JPV19TRUNUSU9OID0KKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1jZW50ZXJcIj48c21hbGw+ezB9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWNlbnRlclwiPjxzbWFsbD57MX08L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctY2VudGVyXCI+PHNtYWxsPnsyfTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1jZW50ZXJcIj48c21hbGw+ezN9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWNlbnRlclwiPjxzbWFsbD57NH08L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctY2VudGVyXCI+PHNtYWxsPns1fTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiIgKworICAgICAgICAiPC90YWJsZT5cbiIgKworICAgICAgICAiPGJyPlxuIiArCisgICAgICAgICJcbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1RBSUxfU0VDVElPTiA9CisgICAgICAgICI8aHIgc2l6ZT1cIjFcIiBub3NoYWRlPVwibm9zaGFkZVwiPlxuIiArCisgICAgICAgICI8Y2VudGVyPjxmb250IHNpemU9XCItMVwiIGNvbG9yPVwiIzUyNUQ3NlwiPlxuIiArCisgICAgICAgICIgPGVtPkNvcHlyaWdodCAmY29weTsgMTk5OS0yMDA1LCBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvZW0+IiArCisgICAgICAgICI8L2ZvbnQ+PC9jZW50ZXI+XG4iICsKKyAgICAgICAgIlxuIiArCisgICAgICAgICI8L2JvZHk+XG4iICsKKyAgICAgICAgIjwvaHRtbD4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJTRVQ9InV0Zi04IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ERUNMQVJBVElPTiA9CisgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiK0NIQVJTRVQrIlwiPz4iOworCQkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfU1RZTEUgPQorICAgICAgICAiPD94bWwtc3R5bGVzaGVldCB0eXBlPVwidGV4dC94c2xcIiBocmVmPVwiL21hbmFnZXIveGZvcm0ueHNsXCIgPz4iOworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9IVE1MTWFuYWdlclNlcnZsZXQuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9IVE1MTWFuYWdlclNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDZhMjUwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL0hUTUxNYW5hZ2VyU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsNzI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWFuYWdlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlJlcXVlc3RVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TZXJ2ZXJJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLkZpbGVJdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLkRpc2tGaWxlVXBsb2FkOworCisvKioKKyogU2VydmxldCB0aGF0IGVuYWJsZXMgcmVtb3RlIG1hbmFnZW1lbnQgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbnMgZGVwbG95ZWQKKyogd2l0aGluIHRoZSBzYW1lIHZpcnR1YWwgaG9zdCBhcyB0aGlzIHdlYiBhcHBsaWNhdGlvbiBpcy4gIE5vcm1hbGx5LCB0aGlzCisqIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBwcm90ZWN0ZWQgYnkgYSBzZWN1cml0eSBjb25zdHJhaW50IGluIHRoZSB3ZWIKKyogYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgSG93ZXZlciwgdGhpcyByZXF1aXJlbWVudCBjYW4gYmUKKyogcmVsYXhlZCBkdXJpbmcgdGVzdGluZy4KKyogPHA+CisqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIDxjb2RlPk1hbmFnZXJTZXJ2bGV0PC9jb2RlPiBhbmQgdGhpcworKiBTZXJ2bGV0IGlzIHRoYXQgdGhpcyBTZXJ2bGV0IHByaW50cyBvdXQgYSBIVE1MIGludGVyZmFjZSB3aGljaAorKiBtYWtlcyBpdCBlYXNpZXIgdG8gYWRtaW5pc3RyYXRlLgorKiA8cD4KKyogSG93ZXZlciBpZiB5b3UgdXNlIGEgc29mdHdhcmUgdGhhdCBwYXJzZXMgdGhlIG91dHB1dCBvZgorKiA8Y29kZT5NYW5hZ2VyU2VydmxldDwvY29kZSB5b3Ugd29uJ3QgYmUgYWJsZSB0byB1cGdyYWRlCisqIHRvIHRoaXMgU2VydmxldCBzaW5jZSB0aGUgb3V0cHV0IGFyZSBub3QgaW4gdGhlCisqIHNhbWUgZm9ybWF0IGFyIGZyb20gPGNvZGU+TWFuYWdlclNlcnZsZXQ8L2NvZGU+CisqCisqIEBhdXRob3IgQmlwIFRoZWxpbgorKiBAYXV0aG9yIE1hbGNvbG0gRWRnYXIKKyogQGF1dGhvciBHbGVubiBMLiBOaWVsc2VuCisqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorKiBAc2VlIE1hbmFnZXJTZXJ2bGV0CisqLworCitwdWJsaWMgZmluYWwgY2xhc3MgSFRNTE1hbmFnZXJTZXJ2bGV0IGV4dGVuZHMgTWFuYWdlclNlcnZsZXQgeworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgR0VUIHJlcXVlc3QgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldC1zcGVjaWZpZWQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJZGVudGlmeSB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzIHRoYXQgd2UgbmVlZAorICAgICAgICBTdHJpbmcgY29tbWFuZCA9IHJlcXVlc3QuZ2V0UGF0aEluZm8oKTsKKworICAgICAgICBTdHJpbmcgcGF0aCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXRoIik7CisgICAgICAgIFN0cmluZyBkZXBsb3lQYXRoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRlcGxveVBhdGgiKTsKKyAgICAgICAgU3RyaW5nIGRlcGxveUNvbmZpZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkZXBsb3lDb25maWciKTsKKyAgICAgICAgU3RyaW5nIGRlcGxveVdhciA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkZXBsb3lXYXIiKTsKKworICAgICAgICAvLyBQcmVwYXJlIG91ciBvdXRwdXQgd3JpdGVyIHRvIGdlbmVyYXRlIHRoZSByZXNwb25zZSBtZXNzYWdlCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9IiArIENvbnN0YW50cy5DSEFSU0VUKTsKKworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICIiOworICAgICAgICAvLyBQcm9jZXNzIHRoZSByZXF1ZXN0ZWQgY29tbWFuZAorICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsIHx8IGNvbW1hbmQuZXF1YWxzKCIvIikpIHsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL2RlcGxveSIpKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gZGVwbG95SW50ZXJuYWwoZGVwbG95Q29uZmlnLCBkZXBsb3lQYXRoLCBkZXBsb3lXYXIpOworICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCIvbGlzdCIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi9yZWxvYWQiKSkgeworICAgICAgICAgICAgbWVzc2FnZSA9IHJlbG9hZChwYXRoKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL3VuZGVwbG95IikpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSB1bmRlcGxveShwYXRoKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL3Nlc3Npb25zIikpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBzZXNzaW9ucyhwYXRoKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL3N0YXJ0IikpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBzdGFydChwYXRoKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL3N0b3AiKSkgeworICAgICAgICAgICAgbWVzc2FnZSA9IHN0b3AocGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnVua25vd25Db21tYW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdFV0aWwuZmlsdGVyKGNvbW1hbmQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxpc3QocmVxdWVzdCwgcmVzcG9uc2UsIG1lc3NhZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBQT1NUIHJlcXVlc3QgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldC1zcGVjaWZpZWQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3QgcGFyYW1ldGVycyB0aGF0IHdlIG5lZWQKKyAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSByZXF1ZXN0LmdldFBhdGhJbmZvKCk7CisKKyAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCB8fCAhY29tbWFuZC5lcXVhbHMoIi91cGxvYWQiKSkgeworICAgICAgICAgICAgZG9HZXQocmVxdWVzdCxyZXNwb25zZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBQcmVwYXJlIG91ciBvdXRwdXQgd3JpdGVyIHRvIGdlbmVyYXRlIHRoZSByZXNwb25zZSBtZXNzYWdlCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9IiArIENvbnN0YW50cy5DSEFSU0VUKTsKKworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICIiOworCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBmaWxlIHVwbG9hZCBoYW5kbGVyCisgICAgICAgIERpc2tGaWxlVXBsb2FkIHVwbG9hZCA9IG5ldyBEaXNrRmlsZVVwbG9hZCgpOworCisgICAgICAgIC8vIEdldCB0aGUgdGVtcGRpcgorICAgICAgICBGaWxlIHRlbXBkaXIgPSAoRmlsZSkgZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICgiamF2YXguc2VydmxldC5jb250ZXh0LnRlbXBkaXIiKTsKKyAgICAgICAgLy8gU2V0IHVwbG9hZCBwYXJhbWV0ZXJzCisgICAgICAgIHVwbG9hZC5zZXRTaXplTWF4KC0xKTsKKyAgICAgICAgdXBsb2FkLnNldFJlcG9zaXRvcnlQYXRoKHRlbXBkaXIuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKKyAgICAKKyAgICAgICAgLy8gUGFyc2UgdGhlIHJlcXVlc3QKKyAgICAgICAgU3RyaW5nIGJhc2VuYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHdhciA9IG51bGw7CisgICAgICAgIEZpbGVJdGVtIHdhclVwbG9hZCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMaXN0IGl0ZW1zID0gdXBsb2FkLnBhcnNlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgICAgICAvLyBQcm9jZXNzIHRoZSB1cGxvYWRlZCBmaWVsZHMKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBpdGVtcy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgRmlsZUl0ZW0gaXRlbSA9IChGaWxlSXRlbSkgaXRlci5uZXh0KCk7CisgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICghaXRlbS5pc0Zvcm1GaWVsZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmdldEZpZWxkTmFtZSgpLmVxdWFscygiZGVwbG95V2FyIikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhclVwbG9hZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3YXJVcGxvYWQgPSBpdGVtOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaWYgKHdhclVwbG9hZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZE5vRmlsZSIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2FyID0gd2FyVXBsb2FkLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXdhci50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIud2FyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgKCJodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95VXBsb2FkTm90V2FyIix3YXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBmaWxlbmFtZSBpZiB1cGxvYWRlZCBuYW1lIGluY2x1ZGVzIGEgcGF0aAorICAgICAgICAgICAgICAgIGlmICh3YXIubGFzdEluZGV4T2YoJ1xcJykgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICB3YXIgPSB3YXIuc3Vic3RyaW5nKHdhci5sYXN0SW5kZXhPZignXFwnKSArIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAod2FyLmxhc3RJbmRleE9mKCcvJykgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICB3YXIgPSB3YXIuc3Vic3RyaW5nKHdhci5sYXN0SW5kZXhPZignLycpICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIElkZW50aWZ5IHRoZSBhcHBCYXNlIG9mIHRoZSBvd25pbmcgSG9zdCBvZiB0aGlzIENvbnRleHQKKyAgICAgICAgICAgICAgICAvLyAoaWYgYW55KQorICAgICAgICAgICAgICAgIGJhc2VuYW1lID0gd2FyLnN1YnN0cmluZygwLCB3YXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIud2FyIikpOworICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldEFwcEJhc2UoKSwgd2FyKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAoImh0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWRXYXJFeGlzdHMiLHdhcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKGJhc2VuYW1lLmVxdWFscygiUk9PVCIpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSAiIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXRoID0gIi8iICsgYmFzZW5hbWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VkKHBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFNlcnZpY2VkKHBhdGgpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2FyVXBsb2FkLndyaXRlKGZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGVyZm9ybSBuZXcgZGVwbG95bWVudAorICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2socGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVTZXJ2aWNlZChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbWVzc2FnZSA9IHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICgiaHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZEZhaWwiLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBsb2cobWVzc2FnZSwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAod2FyVXBsb2FkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3YXJVcGxvYWQuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3YXJVcGxvYWQgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgbGlzdChyZXF1ZXN0LCByZXNwb25zZSwgbWVzc2FnZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVwbG95IGFuIGFwcGxpY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHBhdGggZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIFVSTCBvZiB0aGUgY29udGV4dCBjb25maWd1cmF0aW9uIGZpbGUgdG8gYmUgZGVwbG95ZWQKKyAgICAgKiBAcGFyYW0gcGF0aCBDb250ZXh0IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIGRlcGxveWVkCisgICAgICogQHBhcmFtIHdhciBVUkwgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIHRvIGJlIGRlcGxveWVkCisgICAgICogQHJldHVybiBtZXNzYWdlIFN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZGVwbG95SW50ZXJuYWwoU3RyaW5nIGNvbmZpZywgU3RyaW5nIHBhdGgsIFN0cmluZyB3YXIpIHsKKworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOworCisgICAgICAgIHN1cGVyLmRlcGxveShwcmludFdyaXRlciwgY29uZmlnLCBwYXRoLCB3YXIsIGZhbHNlKTsKKworICAgICAgICByZXR1cm4gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVuZGVyIGEgSFRNTCBsaXN0IG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIENvbnRleHRzIGluIG91ciB2aXJ0dWFsIGhvc3QsCisgICAgICogYW5kIG1lbW9yeSBhbmQgc2VydmVyIHN0YXR1cyBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0CisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXNwb25zZQorICAgICAqIEBwYXJhbSBtZXNzYWdlIGEgbWVzc2FnZSB0byBkaXNwbGF5CisgICAgICovCisgICAgcHVibGljIHZvaWQgbGlzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgIGxvZygibGlzdDogTGlzdGluZyBjb250ZXh0cyBmb3IgdmlydHVhbCBob3N0ICciICsKKyAgICAgICAgICAgICAgICBob3N0LmdldE5hbWUoKSArICInIik7CisKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gSFRNTCBIZWFkZXIgU2VjdGlvbgorICAgICAgICB3cml0ZXIucHJpbnQoQ29uc3RhbnRzLkhUTUxfSEVBREVSX1NFQ1RJT04pOworCisgICAgICAgIC8vIEJvZHkgSGVhZGVyIFNlY3Rpb24KKyAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbMl07CisgICAgICAgIGFyZ3NbMF0gPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCk7CisgICAgICAgIGFyZ3NbMV0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC50aXRsZSIpOworICAgICAgICB3cml0ZXIucHJpbnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgIChDb25zdGFudHMuQk9EWV9IRUFERVJfU0VDVElPTiwgYXJncykpOworCisgICAgICAgIC8vIE1lc3NhZ2UgU2VjdGlvbgorICAgICAgICBhcmdzID0gbmV3IE9iamVjdFszXTsKKyAgICAgICAgYXJnc1swXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0Lm1lc3NhZ2VMYWJlbCIpOworICAgICAgICBhcmdzWzFdID0gKG1lc3NhZ2UgPT0gbnVsbCB8fCBtZXNzYWdlLmxlbmd0aCgpID09IDApID8gIk9LIiA6IG1lc3NhZ2U7CisgICAgICAgIHdyaXRlci5wcmludChNZXNzYWdlRm9ybWF0LmZvcm1hdChDb25zdGFudHMuTUVTU0FHRV9TRUNUSU9OLCBhcmdzKSk7CisKKyAgICAgICAgLy8gTWFuYWdlciBTZWN0aW9uCisgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0WzldOworICAgICAgICBhcmdzWzBdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQubWFuYWdlciIpOworICAgICAgICBhcmdzWzFdID0gcmVzcG9uc2UuZW5jb2RlVVJMKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvaHRtbC9saXN0Iik7CisgICAgICAgIGFyZ3NbMl0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5saXN0Iik7CisgICAgICAgIGFyZ3NbM10gPSByZXNwb25zZS5lbmNvZGVVUkwKKyAgICAgICAgICAgIChyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAiLyIgKworICAgICAgICAgICAgIHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmhlbHBIdG1sTWFuYWdlckZpbGUiKSk7CisgICAgICAgIGFyZ3NbNF0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5oZWxwSHRtbE1hbmFnZXIiKTsKKyAgICAgICAgYXJnc1s1XSA9IHJlc3BvbnNlLmVuY29kZVVSTAorICAgICAgICAgICAgKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvIiArCisgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuaGVscE1hbmFnZXJGaWxlIikpOworICAgICAgICBhcmdzWzZdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuaGVscE1hbmFnZXIiKTsKKyAgICAgICAgYXJnc1s3XSA9IHJlc3BvbnNlLmVuY29kZVVSTAorICAgICAgICAgICAgKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvc3RhdHVzIik7CisgICAgICAgIGFyZ3NbOF0gPSBzbS5nZXRTdHJpbmcoInN0YXR1c1NlcnZsZXQudGl0bGUiKTsKKyAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENvbnN0YW50cy5NQU5BR0VSX1NFQ1RJT04sIGFyZ3MpKTsKKworICAgICAgICAvLyBBcHBzIEhlYWRlciBTZWN0aW9uCisgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0WzZdOworICAgICAgICBhcmdzWzBdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuYXBwc1RpdGxlIik7CisgICAgICAgIGFyZ3NbMV0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5hcHBzUGF0aCIpOworICAgICAgICBhcmdzWzJdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuYXBwc05hbWUiKTsKKyAgICAgICAgYXJnc1szXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNBdmFpbGFibGUiKTsKKyAgICAgICAgYXJnc1s0XSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNTZXNzaW9ucyIpOworICAgICAgICBhcmdzWzVdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuYXBwc1Rhc2tzIik7CisgICAgICAgIHdyaXRlci5wcmludChNZXNzYWdlRm9ybWF0LmZvcm1hdChBUFBTX0hFQURFUl9TRUNUSU9OLCBhcmdzKSk7CisKKyAgICAgICAgLy8gQXBwcyBSb3cgU2VjdGlvbgorICAgICAgICAvLyBDcmVhdGUgc29ydGVkIG1hcCBvZiBkZXBsb3llZCBhcHBsaWNhdGlvbnMgY29udGV4dCBwYXRocy4KKyAgICAgICAgQ29udGFpbmVyIGNoaWxkcmVuW10gPSBob3N0LmZpbmRDaGlsZHJlbigpOworICAgICAgICBTdHJpbmcgY29udGV4dFBhdGhzW10gPSBuZXcgU3RyaW5nW2NoaWxkcmVuLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBjb250ZXh0UGF0aHNbaV0gPSBjaGlsZHJlbltpXS5nZXROYW1lKCk7CisKKyAgICAgICAgVHJlZU1hcCBzb3J0ZWRDb250ZXh0UGF0aHNNYXAgPSBuZXcgVHJlZU1hcCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dFBhdGhzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgZGlzcGxheVBhdGggPSBjb250ZXh0UGF0aHNbaV07CisgICAgICAgICAgICBzb3J0ZWRDb250ZXh0UGF0aHNNYXAucHV0KGRpc3BsYXlQYXRoLCBjb250ZXh0UGF0aHNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGFwcHNTdGFydCA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNTdGFydCIpOworICAgICAgICBTdHJpbmcgYXBwc1N0b3AgPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5hcHBzU3RvcCIpOworICAgICAgICBTdHJpbmcgYXBwc1JlbG9hZCA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNSZWxvYWQiKTsKKyAgICAgICAgU3RyaW5nIGFwcHNVbmRlcGxveSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNVbmRlcGxveSIpOworCisgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc29ydGVkQ29udGV4dFBhdGhzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgYm9vbGVhbiBpc0hpZ2hsaWdodGVkID0gdHJ1ZTsKKyAgICAgICAgYm9vbGVhbiBpc0RlcGxveWVkID0gdHJ1ZTsKKyAgICAgICAgU3RyaW5nIGhpZ2hsaWdodENvbG9yID0gbnVsbDsKKworICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAvLyBCdWd6aWxsYSAzNDgxOCwgYWx0ZXJuYXRpbmcgcm93IGNvbG9ycworICAgICAgICAgICAgaXNIaWdobGlnaHRlZCA9ICFpc0hpZ2hsaWdodGVkOworICAgICAgICAgICAgaWYoaXNIaWdobGlnaHRlZCkgeworICAgICAgICAgICAgICAgIGhpZ2hsaWdodENvbG9yID0gIiNDM0YzQzMiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoaWdobGlnaHRDb2xvciA9ICIjRkZGRkZGIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlQYXRoID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChjb250ZXh0UGF0aCk7CisgICAgICAgICAgICBpZiAoZGlzcGxheVBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgIGRpc3BsYXlQYXRoID0gIi8iOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsICkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzRGVwbG95ZWQgPSBpc0RlcGxveWVkKGNvbnRleHRQYXRoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgZmFsc2Ugb24gZmFpbHVyZSBmb3Igc2FmZXR5CisgICAgICAgICAgICAgICAgICAgIGlzRGVwbG95ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYXJncyA9IG5ldyBPYmplY3RbNl07CisgICAgICAgICAgICAgICAgYXJnc1swXSA9IGRpc3BsYXlQYXRoOworICAgICAgICAgICAgICAgIGFyZ3NbMV0gPSBjb250ZXh0LmdldERpc3BsYXlOYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhcmdzWzFdID0gIiZuYnNwOyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFyZ3NbMl0gPSBuZXcgQm9vbGVhbihjb250ZXh0LmdldEF2YWlsYWJsZSgpKTsKKyAgICAgICAgICAgICAgICBhcmdzWzNdID0gcmVzcG9uc2UuZW5jb2RlVVJMCisgICAgICAgICAgICAgICAgICAgIChyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKworICAgICAgICAgICAgICAgICAgICAgIi9odG1sL3Nlc3Npb25zP3BhdGg9IiArIGRpc3BsYXlQYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhcmdzWzRdID0gbmV3IEludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZXh0LmdldE1hbmFnZXIoKS5nZXRBY3RpdmVTZXNzaW9ucygpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhcmdzWzRdID0gbmV3IEludGVnZXIoMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXJnc1s1XSA9IGhpZ2hsaWdodENvbG9yOworCisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50CisgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlRm9ybWF0LmZvcm1hdChBUFBTX1JPV19ERVRBSUxTX1NFQ1RJT04sIGFyZ3MpKTsKKworICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0WzldOworICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSByZXNwb25zZS5lbmNvZGVVUkwKKyAgICAgICAgICAgICAgICAgICAgKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArCisgICAgICAgICAgICAgICAgICAgICAiL2h0bWwvc3RhcnQ/cGF0aD0iICsgZGlzcGxheVBhdGgpOworICAgICAgICAgICAgICAgIGFyZ3NbMV0gPSBhcHBzU3RhcnQ7CisgICAgICAgICAgICAgICAgYXJnc1syXSA9IHJlc3BvbnNlLmVuY29kZVVSTAorICAgICAgICAgICAgICAgICAgICAocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsKKyAgICAgICAgICAgICAgICAgICAgICIvaHRtbC9zdG9wP3BhdGg9IiArIGRpc3BsYXlQYXRoKTsKKyAgICAgICAgICAgICAgICBhcmdzWzNdID0gYXBwc1N0b3A7CisgICAgICAgICAgICAgICAgYXJnc1s0XSA9IHJlc3BvbnNlLmVuY29kZVVSTAorICAgICAgICAgICAgICAgICAgICAocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsKKyAgICAgICAgICAgICAgICAgICAgICIvaHRtbC9yZWxvYWQ/cGF0aD0iICsgZGlzcGxheVBhdGgpOworICAgICAgICAgICAgICAgIGFyZ3NbNV0gPSBhcHBzUmVsb2FkOworICAgICAgICAgICAgICAgIGFyZ3NbNl0gPSByZXNwb25zZS5lbmNvZGVVUkwKKyAgICAgICAgICAgICAgICAgICAgKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArCisgICAgICAgICAgICAgICAgICAgICAiL2h0bWwvdW5kZXBsb3k/cGF0aD0iICsgZGlzcGxheVBhdGgpOworICAgICAgICAgICAgICAgIGFyZ3NbN10gPSBhcHBzVW5kZXBsb3k7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYXJnc1s4XSA9IGhpZ2hsaWdodENvbG9yOworCisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0UGF0aCgpLmVxdWFscyh0aGlzLmNvbnRleHQuZ2V0UGF0aCgpKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBNQU5BR0VSX0FQUF9ST1dfQlVUVE9OX1NFQ1RJT04sIGFyZ3MpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQuZ2V0QXZhaWxhYmxlKCkgJiYgaXNEZXBsb3llZCkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBTVEFSVEVEX0RFUExPWUVEX0FQUFNfUk9XX0JVVFRPTl9TRUNUSU9OLCBhcmdzKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0LmdldEF2YWlsYWJsZSgpICYmICFpc0RlcGxveWVkKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFNUQVJURURfTk9OREVQTE9ZRURfQVBQU19ST1dfQlVUVE9OX1NFQ1RJT04sIGFyZ3MpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjb250ZXh0LmdldEF2YWlsYWJsZSgpICYmIGlzRGVwbG95ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgU1RPUFBFRF9ERVBMT1lFRF9BUFBTX1JPV19CVVRUT05fU0VDVElPTiwgYXJncykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFNUT1BQRURfTk9OREVQTE9ZRURfQVBQU19ST1dfQlVUVE9OX1NFQ1RJT04sIGFyZ3MpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIERlcGxveSBTZWN0aW9uCisgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0WzddOworICAgICAgICBhcmdzWzBdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95VGl0bGUiKTsKKyAgICAgICAgYXJnc1sxXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVNlcnZlciIpOworICAgICAgICBhcmdzWzJdID0gcmVzcG9uc2UuZW5jb2RlVVJMKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvaHRtbC9kZXBsb3kiKTsKKyAgICAgICAgYXJnc1szXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVBhdGgiKTsKKyAgICAgICAgYXJnc1s0XSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveUNvbmZpZyIpOworICAgICAgICBhcmdzWzVdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95V2FyIik7CisgICAgICAgIGFyZ3NbNl0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lCdXR0b24iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KERFUExPWV9TRUNUSU9OLCBhcmdzKSk7CisKKyAgICAgICAgYXJncyA9IG5ldyBPYmplY3RbNF07CisgICAgICAgIGFyZ3NbMF0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWQiKTsKKyAgICAgICAgYXJnc1sxXSA9IHJlc3BvbnNlLmVuY29kZVVSTChyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAiL2h0bWwvdXBsb2FkIik7CisgICAgICAgIGFyZ3NbMl0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWRGaWxlIik7CisgICAgICAgIGFyZ3NbM10gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lCdXR0b24iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFVQTE9BRF9TRUNUSU9OLCBhcmdzKSk7CisKKyAgICAgICAgLy8gU2VydmVyIEhlYWRlciBTZWN0aW9uCisgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0WzddOworICAgICAgICBhcmdzWzBdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyVGl0bGUiKTsKKyAgICAgICAgYXJnc1sxXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlclZlcnNpb24iKTsKKyAgICAgICAgYXJnc1syXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlckpWTVZlcnNpb24iKTsKKyAgICAgICAgYXJnc1szXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlckpWTVZlbmRvciIpOworICAgICAgICBhcmdzWzRdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyT1NOYW1lIik7CisgICAgICAgIGFyZ3NbNV0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJPU1ZlcnNpb24iKTsKKyAgICAgICAgYXJnc1s2XSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlck9TQXJjaCIpOworICAgICAgICB3cml0ZXIucHJpbnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgIChDb25zdGFudHMuU0VSVkVSX0hFQURFUl9TRUNUSU9OLCBhcmdzKSk7CisKKyAgICAgICAgLy8gU2VydmVyIFJvdyBTZWN0aW9uCisgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0WzZdOworICAgICAgICBhcmdzWzBdID0gU2VydmVySW5mby5nZXRTZXJ2ZXJJbmZvKCk7CisgICAgICAgIGFyZ3NbMV0gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEucnVudGltZS52ZXJzaW9uIik7CisgICAgICAgIGFyZ3NbMl0gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudm0udmVuZG9yIik7CisgICAgICAgIGFyZ3NbM10gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKKyAgICAgICAgYXJnc1s0XSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MudmVyc2lvbiIpOworICAgICAgICBhcmdzWzVdID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5hcmNoIik7CisgICAgICAgIHdyaXRlci5wcmludChNZXNzYWdlRm9ybWF0LmZvcm1hdChDb25zdGFudHMuU0VSVkVSX1JPV19TRUNUSU9OLCBhcmdzKSk7CisKKyAgICAgICAgLy8gSFRNTCBUYWlsIFNlY3Rpb24KKyAgICAgICAgd3JpdGVyLnByaW50KENvbnN0YW50cy5IVE1MX1RBSUxfU0VDVElPTik7CisKKyAgICAgICAgLy8gRmluaXNoIHVwIHRoZSByZXNwb25zZQorICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsb2FkIHRoZSB3ZWIgYXBwbGljYXRpb24gYXQgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGguCisgICAgICoKKyAgICAgKiBAc2VlIE1hbmFnZXJTZXJ2bGV0I3JlbG9hZChQcmludFdyaXRlciwgU3RyaW5nKQorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggQ29udGV4dCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSByZXN0YXJ0ZWQKKyAgICAgKiBAcmV0dXJuIG1lc3NhZ2UgU3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByZWxvYWQoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOworCisgICAgICAgIHN1cGVyLnJlbG9hZChwcmludFdyaXRlciwgcGF0aCk7CisKKyAgICAgICAgcmV0dXJuIHN0cmluZ1dyaXRlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuZGVwbG95IHRoZSB3ZWIgYXBwbGljYXRpb24gYXQgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGguCisgICAgICoKKyAgICAgKiBAc2VlIE1hbmFnZXJTZXJ2bGV0I3VuZGVwbG95KFByaW50V3JpdGVyLCBTdHJpbmcpCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBDb250ZXh0IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHVuZGVwbG95ZAorICAgICAqIEByZXR1cm4gbWVzc2FnZSBTdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHVuZGVwbG95KFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsKKworICAgICAgICBzdXBlci51bmRlcGxveShwcmludFdyaXRlciwgcGF0aCk7CisKKyAgICAgICAgcmV0dXJuIHN0cmluZ1dyaXRlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BsYXkgc2Vzc2lvbiBpbmZvcm1hdGlvbiBhbmQgaW52b2tlIGxpc3QuCisgICAgICoKKyAgICAgKiBAc2VlIE1hbmFnZXJTZXJ2bGV0I3Nlc3Npb25zKFByaW50V3JpdGVyLCBTdHJpbmcpCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBDb250ZXh0IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGxpc3Qgc2Vzc2lvbiBpbmZvcm1hdGlvbgorICAgICAqIEByZXR1cm4gbWVzc2FnZSBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHNlc3Npb25zKFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsKKworICAgICAgICBzdXBlci5zZXNzaW9ucyhwcmludFdyaXRlciwgcGF0aCk7CisKKyAgICAgICAgcmV0dXJuIHN0cmluZ1dyaXRlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSB3ZWIgYXBwbGljYXRpb24gYXQgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGguCisgICAgICoKKyAgICAgKiBAc2VlIE1hbmFnZXJTZXJ2bGV0I3N0YXJ0KFByaW50V3JpdGVyLCBTdHJpbmcpCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBDb250ZXh0IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHN0YXJ0ZWQKKyAgICAgKiBAcmV0dXJuIG1lc3NhZ2UgU3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzdGFydChTdHJpbmcgcGF0aCkgeworCisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIFByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcik7CisKKyAgICAgICAgc3VwZXIuc3RhcnQocHJpbnRXcml0ZXIsIHBhdGgpOworCisgICAgICAgIHJldHVybiBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSB3ZWIgYXBwbGljYXRpb24gYXQgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGguCisgICAgICoKKyAgICAgKiBAc2VlIE1hbmFnZXJTZXJ2bGV0I3N0b3AoUHJpbnRXcml0ZXIsIFN0cmluZykKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIENvbnRleHQgcGF0aCBvZiB0aGUgYXBwbGljYXRpb24gdG8gYmUgc3RvcHBlZAorICAgICAqIEByZXR1cm4gbWVzc2FnZSBTdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN0b3AoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOworCisgICAgICAgIHN1cGVyLnN0b3AocHJpbnRXcml0ZXIsIHBhdGgpOworCisgICAgICAgIHJldHVybiBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBDb25zdGFudHMKKworICAgIC8vIFRoZXNlIEhUTUwgc2VjdGlvbnMgYXJlIGJyb2tlbiBpbiByZWxhdGl2ZWx5IHNtYWxsIHNlY3Rpb25zLCBiZWNhdXNlIG9mCisgICAgLy8gbGltaXRlZCBudW1iZXIgb2Ygc3Vic2l0dXRpb25zIE1lc3NhZ2VGb3JtYXQgY2FuIHByb2Nlc3MKKyAgICAvLyAobWF4aW1pdW0gb2YgMTApLgorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUFNfSEVBREVSX1NFQ1RJT04gPQorICAgICAgICAiPHRhYmxlIGJvcmRlcj1cIjFcIiBjZWxsc3BhY2luZz1cIjBcIiBjZWxscGFkZGluZz1cIjNcIj5cbiIgKworICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNvbHNwYW49XCI1XCIgY2xhc3M9XCJ0aXRsZVwiPnswfTwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cImhlYWRlci1sZWZ0XCI+PHNtYWxsPnsxfTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cImhlYWRlci1sZWZ0XCI+PHNtYWxsPnsyfTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cImhlYWRlci1jZW50ZXJcIj48c21hbGw+ezN9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwiaGVhZGVyLWNlbnRlclwiPjxzbWFsbD57NH08L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJoZWFkZXItY2VudGVyXCI+PHNtYWxsPns1fTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQU19ST1dfREVUQUlMU19TRUNUSU9OID0KKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCIgYmdjb2xvcj1cIns1fVwiPjxzbWFsbD48YSBocmVmPVwiezB9XCI+ezB9PC9hPjwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCIgYmdjb2xvcj1cIns1fVwiPjxzbWFsbD57MX08L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctY2VudGVyXCIgYmdjb2xvcj1cIns1fVwiPjxzbWFsbD57Mn08L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctY2VudGVyXCIgYmdjb2xvcj1cIns1fVwiPjxzbWFsbD48YSBocmVmPVwiezN9XCI+ezR9PC9hPjwvc21hbGw+PC90ZD5cbiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFUl9BUFBfUk9XX0JVVFRPTl9TRUNUSU9OID0KKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctbGVmdFwiIGJnY29sb3I9XCJ7OH1cIj5cbiIgKworICAgICAgICAiICA8c21hbGw+XG4iICsKKyAgICAgICAgIiAgJm5ic3A7ezF9Jm5ic3A7XG4iICsKKyAgICAgICAgIiAgJm5ic3A7ezN9Jm5ic3A7XG4iICsKKyAgICAgICAgIiAgJm5ic3A7ezV9Jm5ic3A7XG4iICsKKyAgICAgICAgIiAgJm5ic3A7ezd9Jm5ic3A7XG4iICsKKyAgICAgICAgIiAgPC9zbWFsbD5cbiIgKworICAgICAgICAiIDwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJURURfREVQTE9ZRURfQVBQU19ST1dfQlVUVE9OX1NFQ1RJT04gPQorICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCIgYmdjb2xvcj1cIns4fVwiPlxuIiArCisgICAgICAgICIgIDxzbWFsbD5cbiIgKworICAgICAgICAiICAmbmJzcDt7MX0mbmJzcDtcbiIgKworICAgICAgICAiICAmbmJzcDs8YSBocmVmPVwiezJ9XCIgb25jbGljaz1cInJldHVybihjb25maXJtKCcnJ0FyZSB5b3Ugc3VyZT8nJycpKVwiPnszfTwvYT4mbmJzcDtcbiIgKworICAgICAgICAiICAmbmJzcDs8YSBocmVmPVwiezR9XCIgb25jbGljaz1cInJldHVybihjb25maXJtKCcnJ0FyZSB5b3Ugc3VyZT8nJycpKVwiPns1fTwvYT4mbmJzcDtcbiIgKworICAgICAgICAiICAmbmJzcDs8YSBocmVmPVwiezZ9XCIgb25jbGljaz1cInJldHVybihjb25maXJtKCcnJ0FyZSB5b3Ugc3VyZT8nJycpKVwiPns3fTwvYT4mbmJzcDtcbiIgKworICAgICAgICAiICA8L3NtYWxsPlxuIiArCisgICAgICAgICIgPC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUFBFRF9ERVBMT1lFRF9BUFBTX1JPV19CVVRUT05fU0VDVElPTiA9CisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWxlZnRcIiBiZ2NvbG9yPVwiezh9XCI+XG4iICsKKyAgICAgICAgIiAgPHNtYWxsPlxuIiArCisgICAgICAgICIgICZuYnNwOzxhIGhyZWY9XCJ7MH1cIiBvbmNsaWNrPVwicmV0dXJuKGNvbmZpcm0oJycnQXJlIHlvdSBzdXJlPycnJykpXCI+ezF9PC9hPiZuYnNwO1xuIiArCisgICAgICAgICIgICZuYnNwO3szfSZuYnNwO1xuIiArCisgICAgICAgICIgICZuYnNwO3s1fSZuYnNwO1xuIiArCisgICAgICAgICIgICZuYnNwOzxhIGhyZWY9XCJ7Nn1cIiBvbmNsaWNrPVwicmV0dXJuKGNvbmZpcm0oJycnQXJlIHlvdSBzdXJlPyAgVGhpcyB3aWxsIGRlbGV0ZSB0aGUgYXBwbGljYXRpb24uJycnKSlcIj57N308L2E+Jm5ic3A7XG4iICsKKyAgICAgICAgIiAgPC9zbWFsbD5cbiIgKworICAgICAgICAiIDwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJURURfTk9OREVQTE9ZRURfQVBQU19ST1dfQlVUVE9OX1NFQ1RJT04gPQorICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCIgYmdjb2xvcj1cIns4fVwiPlxuIiArCisgICAgICAgICIgIDxzbWFsbD5cbiIgKworICAgICAgICAiICAmbmJzcDt7MX0mbmJzcDtcbiIgKworICAgICAgICAiICAmbmJzcDs8YSBocmVmPVwiezJ9XCIgb25jbGljaz1cInJldHVybihjb25maXJtKCcnJ0FyZSB5b3Ugc3VyZT8nJycpKVwiPnszfTwvYT4mbmJzcDtcbiIgKworICAgICAgICAiICAmbmJzcDs8YSBocmVmPVwiezR9XCIgb25jbGljaz1cInJldHVybihjb25maXJtKCcnJ0FyZSB5b3Ugc3VyZT8nJycpKVwiPns1fTwvYT4mbmJzcDtcbiIgKworICAgICAgICAiICAmbmJzcDt7N30mbmJzcDtcbiIgKworICAgICAgICAiICA8L3NtYWxsPlxuIiArCisgICAgICAgICIgPC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUFBFRF9OT05ERVBMT1lFRF9BUFBTX1JPV19CVVRUT05fU0VDVElPTiA9CisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWxlZnRcIiBiZ2NvbG9yPVwiezh9XCI+XG4iICsKKyAgICAgICAgIiAgPHNtYWxsPlxuIiArCisgICAgICAgICIgICZuYnNwOzxhIGhyZWY9XCJ7MH1cIiBvbmNsaWNrPVwicmV0dXJuKGNvbmZpcm0oJycnQXJlIHlvdSBzdXJlPycnJykpXCI+ezF9PC9hPiZuYnNwO1xuIiArCisgICAgICAgICIgICZuYnNwO3szfSZuYnNwO1xuIiArCisgICAgICAgICIgICZuYnNwO3s1fSZuYnNwO1xuIiArCisgICAgICAgICIgICZuYnNwO3s3fSZuYnNwO1xuIiArCisgICAgICAgICIgIDwvc21hbGw+XG4iICsKKyAgICAgICAgIiA8L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lfU0VDVElPTiA9CisgICAgICAgICI8L3RhYmxlPlxuIiArCisgICAgICAgICI8YnI+XG4iICsKKyAgICAgICAgIjx0YWJsZSBib3JkZXI9XCIxXCIgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIzXCI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjb2xzcGFuPVwiMlwiIGNsYXNzPVwidGl0bGVcIj57MH08L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIiArCisgICAgICAgICI8dHI+XG4iICsKKyAgICAgICAgIiA8dGQgY29sc3Bhbj1cIjJcIiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+PHNtYWxsPnsxfTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiIgKworICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNvbHNwYW49XCIyXCI+XG4iICsKKyAgICAgICAgIjxmb3JtIG1ldGhvZD1cImdldFwiIGFjdGlvbj1cInsyfVwiPlxuIiArCisgICAgICAgICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIzXCI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1yaWdodFwiPlxuIiArCisgICAgICAgICIgIDxzbWFsbD57M308L3NtYWxsPlxuIiArCisgICAgICAgICIgPC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCI+XG4iICsKKyAgICAgICAgIiAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImRlcGxveVBhdGhcIiBzaXplPVwiMjBcIj5cbiIgKworICAgICAgICAiIDwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1yaWdodFwiPlxuIiArCisgICAgICAgICIgIDxzbWFsbD57NH08L3NtYWxsPlxuIiArCisgICAgICAgICIgPC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCI+XG4iICsKKyAgICAgICAgIiAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImRlcGxveUNvbmZpZ1wiIHNpemU9XCIyMFwiPlxuIiArCisgICAgICAgICIgPC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiIgKworICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LXJpZ2h0XCI+XG4iICsKKyAgICAgICAgIiAgPHNtYWxsPns1fTwvc21hbGw+XG4iICsKKyAgICAgICAgIiA8L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWxlZnRcIj5cbiIgKworICAgICAgICAiICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiZGVwbG95V2FyXCIgc2l6ZT1cIjQwXCI+XG4iICsKKyAgICAgICAgIiA8L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIiArCisgICAgICAgICI8dHI+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctcmlnaHRcIj5cbiIgKworICAgICAgICAiICAmbmJzcDtcbiIgKworICAgICAgICAiIDwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctbGVmdFwiPlxuIiArCisgICAgICAgICIgIDxpbnB1dCB0eXBlPVwic3VibWl0XCIgdmFsdWU9XCJ7Nn1cIj5cbiIgKworICAgICAgICAiIDwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iICsKKyAgICAgICAgIjwvdGFibGU+XG4iICsKKyAgICAgICAgIjwvZm9ybT5cbiIgKworICAgICAgICAiPC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBMT0FEX1NFQ1RJT04gPQorICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNvbHNwYW49XCIyXCIgY2xhc3M9XCJoZWFkZXItbGVmdFwiPjxzbWFsbD57MH08L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjb2xzcGFuPVwiMlwiPlxuIiArCisgICAgICAgICI8Zm9ybSBhY3Rpb249XCJ7MX1cIiBtZXRob2Q9XCJwb3N0XCIgIiArCisgICAgICAgICJlbmN0eXBlPVwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiPlxuIiArCisgICAgICAgICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIzXCI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1yaWdodFwiPlxuIiArCisgICAgICAgICIgIDxzbWFsbD57Mn08L3NtYWxsPlxuIiArCisgICAgICAgICIgPC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCI+XG4iICsKKyAgICAgICAgIiAgPGlucHV0IHR5cGU9XCJmaWxlXCIgbmFtZT1cImRlcGxveVdhclwiIHNpemU9XCI0MFwiPlxuIiArCisgICAgICAgICIgPC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiIgKworICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LXJpZ2h0XCI+XG4iICsKKyAgICAgICAgIiAgJm5ic3A7XG4iICsKKyAgICAgICAgIiA8L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWxlZnRcIj5cbiIgKworICAgICAgICAiICA8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiezN9XCI+XG4iICsKKyAgICAgICAgIiA8L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIiArCisgICAgICAgICI8L3RhYmxlPlxuIiArCisgICAgICAgICI8L2Zvcm0+XG4iICsKKyAgICAgICAgIjwvdGFibGU+XG4iICsKKyAgICAgICAgIjxicj5cbiIgKworICAgICAgICAiXG4iOworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvSk1YUHJveHlTZXJ2bGV0LmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvSk1YUHJveHlTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkMGQxYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9KTVhQcm94eVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1hbmFnZXI7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuQXR0cmlidXRlSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CisKKy8qKgorICogVGhpcyBzZXJ2bGV0IHdpbGwgZHVtcCBKTVggYXR0cmlidXRlcyBpbiBhIHNpbXBsZSBmb3JtYXQKKyAqIGFuZCBpbXBsZW1lbnQgcHJveHkgc2VydmljZXMgZm9yIG1vZGVsZXIuCisgKgorICogQGF1dGhvciBDb3N0aW4gTWFub2xhY2hlCisgKi8KK3B1YmxpYyBjbGFzcyBKTVhQcm94eVNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCAgeworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogTUJlYW4gc2VydmVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBNQmVhblNlcnZlciBtQmVhblNlcnZlciA9IG51bGw7CisgICAgcHJvdGVjdGVkIFJlZ2lzdHJ5IHJlZ2lzdHJ5OworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgTUJlYW4gc2VydmVyCisgICAgICAgIHJlZ2lzdHJ5ID0gUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCk7CisgICAgICAgIG1CZWFuU2VydmVyID0gUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkuZ2V0TUJlYW5TZXJ2ZXIoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBHRVQgcmVxdWVzdCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmllZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICBpZiggbUJlYW5TZXJ2ZXI9PW51bGwgKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRXJyb3IgLSBObyBtYmVhbiBzZXJ2ZXIiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBxcnk9cmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNldCIpOworICAgICAgICBpZiggcXJ5IT0gbnVsbCApIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lPXJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJhdHQiKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWw9cmVxdWVzdC5nZXRQYXJhbWV0ZXIoInZhbCIpOworCisgICAgICAgICAgICBzZXRBdHRyaWJ1dGUoIHdyaXRlciwgcXJ5LCBuYW1lLCB2YWwgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBxcnk9cmVxdWVzdC5nZXRQYXJhbWV0ZXIoImdldCIpOworICAgICAgICBpZiggcXJ5IT0gbnVsbCApIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lPXJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJhdHQiKTsKKyAgICAgICAgICAgIGdldEF0dHJpYnV0ZSggd3JpdGVyLCBxcnksIG5hbWUgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIHFyeT1yZXF1ZXN0LmdldFBhcmFtZXRlcigicXJ5Iik7CisgICAgICAgIGlmKCBxcnkgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIHFyeSA9ICIqOioiOworICAgICAgICB9CisKKyAgICAgICAgbGlzdEJlYW5zKCB3cml0ZXIsIHFyeSApOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2V0QXR0cmlidXRlKFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIG9uYW1lU3RyLCBTdHJpbmcgYXR0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUob25hbWVTdHIpOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHQpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIk9LIC0gQXR0cmlidXRlIGdldCAnIiArIG9uYW1lU3RyICsgIicgLSAiICsgYXR0CisgICAgICAgICAgICAgICAgICAgICsgIj0gIiArIGVzY2FwZSh2YWx1ZS50b1N0cmluZygpKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkVycm9yIC0gIiArIGV4LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKCBQcmludFdyaXRlciB3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb25hbWVTdHIsIFN0cmluZyBhdHQsIFN0cmluZyB2YWwgKQorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWU9bmV3IE9iamVjdE5hbWUoIG9uYW1lU3RyICk7CisgICAgICAgICAgICBTdHJpbmcgdHlwZT1yZWdpc3RyeS5nZXRUeXBlKG9uYW1lLCBhdHQpOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlT2JqPXJlZ2lzdHJ5LmNvbnZlcnRWYWx1ZSh0eXBlLCB2YWwgKTsKKyAgICAgICAgICAgIG1CZWFuU2VydmVyLnNldEF0dHJpYnV0ZSggb25hbWUsIG5ldyBBdHRyaWJ1dGUoYXR0LCB2YWx1ZU9iaikpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIk9LIC0gQXR0cmlidXRlIHNldCIpOworICAgICAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRXJyb3IgLSAiICsgZXgudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsaXN0QmVhbnMoIFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIHFyeSApCisgICAgeworCisgICAgICAgIFNldCBuYW1lcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuYW1lcz1tQmVhblNlcnZlci5xdWVyeU5hbWVzKG5ldyBPYmplY3ROYW1lKHFyeSksIG51bGwpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIk9LIC0gTnVtYmVyIG9mIHJlc3VsdHM6ICIgKyBuYW1lcy5zaXplKCkpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJFcnJvciAtICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgSXRlcmF0b3IgaXQ9bmFtZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUoIGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZT0oT2JqZWN0TmFtZSlpdC5uZXh0KCk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbiggIk5hbWU6ICIgKyBvbmFtZS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBNQmVhbkluZm8gbWluZm89bUJlYW5TZXJ2ZXIuZ2V0TUJlYW5JbmZvKG9uYW1lKTsKKyAgICAgICAgICAgICAgICAvLyBjYW4ndCBiZSBudWxsIC0gSSB0aGlubAorICAgICAgICAgICAgICAgIFN0cmluZyBjb2RlPW1pbmZvLmdldENsYXNzTmFtZSgpOworICAgICAgICAgICAgICAgIGlmICgib3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuQmFzZU1vZGVsTUJlYW4iLmVxdWFscyhjb2RlKSkgeworICAgICAgICAgICAgICAgICAgICBjb2RlPShTdHJpbmcpbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCAibW9kZWxlclR5cGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIm1vZGVsZXJUeXBlOiAiICsgY29kZSk7CisKKyAgICAgICAgICAgICAgICBNQmVhbkF0dHJpYnV0ZUluZm8gYXR0cnNbXT1taW5mby5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlPW51bGw7CisKKyAgICAgICAgICAgICAgICBmb3IoIGludCBpPTA7IGk8IGF0dHJzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBpZiggISBhdHRyc1tpXS5pc1JlYWRhYmxlKCkgKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYoICEgaXNTdXBwb3J0ZWQoIGF0dHJzW2ldLmdldFR5cGUoKSApKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dE5hbWU9YXR0cnNbaV0uZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiggYXR0TmFtZS5pbmRleE9mKCAiPSIpID49MCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dE5hbWUuaW5kZXhPZiggIjoiKSA+PTAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHROYW1lLmluZGV4T2YoICIgIikgPj0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9bUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCggVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgZ2V0dGluZyBhdHRyaWJ1dGUgIiArIG9uYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAiICsgYXR0TmFtZSArICIgIiArIHQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiggdmFsdWU9PW51bGwgKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYoICJtb2RlbGVyVHlwZSIuZXF1YWxzKCBhdHROYW1lKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZVN0cmluZz12YWx1ZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbiggYXR0TmFtZSArICI6ICIgKyBlc2NhcGUodmFsdWVTdHJpbmcpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIC8vIFRoZSBvbmx5IGludmFsaWQgY2hhciBpcyBcbgorICAgICAgICAvLyBXZSBhbHNvIG5lZWQgdG8ga2VlcCB0aGUgc3RyaW5nIHNob3J0IGFuZCBzcGxpdCBpdCB3aXRoIFxuU1BBQ0UKKyAgICAgICAgLy8gWFhYIFRPRE8KKyAgICAgICAgaW50IGlkeD12YWx1ZS5pbmRleE9mKCAiXG4iICk7CisgICAgICAgIGlmKCBpZHggPCAwICkgcmV0dXJuIHZhbHVlOworCisgICAgICAgIGludCBwcmV2PTA7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYj1uZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHdoaWxlKCBpZHggPj0gMCApIHsKKyAgICAgICAgICAgIGFwcGVuZEhlYWQoc2IsIHZhbHVlLCBwcmV2LCBpZHgpOworCisgICAgICAgICAgICBzYi5hcHBlbmQoICJcXG5cbiAiKTsKKyAgICAgICAgICAgIHByZXY9aWR4KzE7CisgICAgICAgICAgICBpZiggaWR4PT12YWx1ZS5sZW5ndGgoKSAtMSApIGJyZWFrOworICAgICAgICAgICAgaWR4PXZhbHVlLmluZGV4T2YoJ1xuJywgaWR4KzEpOworICAgICAgICB9CisgICAgICAgIGlmKCBwcmV2IDwgdmFsdWUubGVuZ3RoKCkgKQorICAgICAgICAgICAgYXBwZW5kSGVhZCggc2IsIHZhbHVlLCBwcmV2LCB2YWx1ZS5sZW5ndGgoKSk7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhcHBlbmRIZWFkKCBTdHJpbmdCdWZmZXIgc2IsIFN0cmluZyB2YWx1ZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgICAgICAgIGlmIChlbmQgPCAxKSByZXR1cm47CisgICAgICAgIAorICAgICAgICBpbnQgcG9zPXN0YXJ0OworICAgICAgICB3aGlsZSggZW5kLXBvcyA+IDc4ICkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCB2YWx1ZS5zdWJzdHJpbmcocG9zLCBwb3MrNzgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCggIlxuICIpOworICAgICAgICAgICAgcG9zPXBvcys3ODsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIHZhbHVlLnN1YnN0cmluZyhwb3MsZW5kKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWQoIFN0cmluZyB0eXBlICkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEzNjNhNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMCwwICsxLDgyIEBACitodG1sTWFuYWdlclNlcnZsZXQuYXBwc0F2YWlsYWJsZT1SdW5uaW5nCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc05hbWU9RGlzcGxheSBOYW1lCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1BhdGg9UGF0aAoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNSZWxvYWQ9UmVsb2FkCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1VuZGVwbG95PVVuZGVwbG95CitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1Nlc3Npb25zPVNlc3Npb25zCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1N0YXJ0PVN0YXJ0CitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1N0b3A9U3RvcAoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNUYXNrcz1Db21tYW5kcworaHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNUaXRsZT1BcHBsaWNhdGlvbnMKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwSHRtbE1hbmFnZXI9SFRNTCBNYW5hZ2VyIEhlbHAKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwSHRtbE1hbmFnZXJGaWxlPWh0bWwtbWFuYWdlci1ob3d0by5odG1sCitodG1sTWFuYWdlclNlcnZsZXQuaGVscE1hbmFnZXI9TWFuYWdlciBIZWxwCitodG1sTWFuYWdlclNlcnZsZXQuaGVscE1hbmFnZXJGaWxlPW1hbmFnZXItaG93dG8uaHRtbAoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveUJ1dHRvbj1EZXBsb3kKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lDb25maWc9WE1MIENvbmZpZ3VyYXRpb24gZmlsZSBVUkw6CitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95UGF0aD1Db250ZXh0IFBhdGggKG9wdGlvbmFsKToKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lTZXJ2ZXI9RGVwbG95IGRpcmVjdG9yeSBvciBXQVIgZmlsZSBsb2NhdGVkIG9uIHNlcnZlcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVRpdGxlPURlcGxveQoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZD1XQVIgZmlsZSB0byBkZXBsb3kKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWRGYWlsPUZBSUwgLSBEZXBsb3kgVXBsb2FkIEZhaWxlZCwgRXhjZXB0aW9uOiB7MH0KK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWRGaWxlPVNlbGVjdCBXQVIgZmlsZSB0byB1cGxvYWQKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWROb3RXYXI9RkFJTCAtIEZpbGUgdXBsb2FkZWQgXCJ7MH1cIiBtdXN0IGJlIGEgLndhcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZE5vRmlsZT1GQUlMIC0gRmlsZSB1cGxvYWQgZmFpbGVkLCBubyBmaWxlCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95VXBsb2FkV2FyRXhpc3RzPUZBSUwgLSBXYXIgZmlsZSBcInswfVwiIGFscmVhZHkgZXhpc3RzIG9uIHNlcnZlcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVdhcj1XQVIgb3IgRGlyZWN0b3J5IFVSTDoKK2h0bWxNYW5hZ2VyU2VydmxldC5saXN0PUxpc3QgQXBwbGljYXRpb25zCitodG1sTWFuYWdlclNlcnZsZXQubWFuYWdlcj1NYW5hZ2VyCitodG1sTWFuYWdlclNlcnZsZXQubWVzc2FnZUxhYmVsPU1lc3NhZ2U6CitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVySlZNVmVuZG9yPUpWTSBWZW5kb3IKK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJKVk1WZXJzaW9uPUpWTSBWZXJzaW9uCitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyT1NBcmNoPU9TIEFyY2hpdGVjdHVyZQoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlck9TTmFtZT1PUyBOYW1lCitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyT1NWZXJzaW9uPU9TIFZlcnNpb24KK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJUaXRsZT1TZXJ2ZXIgSW5mb3JtYXRpb24KK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJWZXJzaW9uPVRvbWNhdCBWZXJzaW9uCitodG1sTWFuYWdlclNlcnZsZXQudGl0bGU9VG9tY2F0IFdlYiBBcHBsaWNhdGlvbiBNYW5hZ2VyCittYW5hZ2VyU2VydmxldC5hbHJlYWR5Q29udGV4dD1GQUlMIC0gQXBwbGljYXRpb24gYWxyZWFkeSBleGlzdHMgYXQgcGF0aCB7MH0KK21hbmFnZXJTZXJ2bGV0LmFscmVhZHlEb2NCYXNlPUZBSUwgLSBEaXJlY3RvcnkgezB9IGlzIGFscmVhZHkgaW4gdXNlCittYW5hZ2VyU2VydmxldC5jYW5ub3RJbnZva2U9Q2Fubm90IGludm9rZSBtYW5hZ2VyIHNlcnZsZXQgdGhyb3VnaCBpbnZva2VyCittYW5hZ2VyU2VydmxldC5jb25maWd1cmVkPU9LIC0gRGVwbG95ZWQgYXBwbGljYXRpb24gZnJvbSBjb250ZXh0IGZpbGUgezB9CittYW5hZ2VyU2VydmxldC5kZXBsb3llZD1PSyAtIERlcGxveWVkIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCB7MH0KK21hbmFnZXJTZXJ2bGV0LmRlcGxveUZhaWxlZD1GQUlMIC0gRmFpbGVkIHRvIGRlcGxveSBhcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggezB9CittYW5hZ2VyU2VydmxldC5leGNlcHRpb249RkFJTCAtIEVuY291bnRlcmVkIGV4Y2VwdGlvbiB7MH0KK21hbmFnZXJTZXJ2bGV0LmRlcGxveWVkPU9LIC0gRGVwbG95ZWQgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIHswfQorbWFuYWdlclNlcnZsZXQuaW52YWxpZFBhdGg9RkFJTCAtIEludmFsaWQgY29udGV4dCBwYXRoIHswfSB3YXMgc3BlY2lmaWVkCittYW5hZ2VyU2VydmxldC5pbnZhbGlkV2FyPUZBSUwgLSBJbnZhbGlkIGFwcGxpY2F0aW9uIFVSTCB7MH0gd2FzIHNwZWNpZmllZAorbWFuYWdlclNlcnZsZXQubGlzdGVkPU9LIC0gTGlzdGVkIGFwcGxpY2F0aW9ucyBmb3IgdmlydHVhbCBob3N0IHswfQorbWFuYWdlclNlcnZsZXQubGlzdGl0ZW09ezB9OnsxfTp7Mn06ezN9CittYW5hZ2VyU2VydmxldC5ub0FwcEJhc2U9RkFJTCAtIENhbm5vdCBpZGVudGlmeSBhcHBsaWNhdGlvbiBiYXNlIGZvciBjb250ZXh0IHBhdGggezB9CittYW5hZ2VyU2VydmxldC5ub0NvbW1hbmQ9RkFJTCAtIE5vIGNvbW1hbmQgd2FzIHNwZWNpZmllZAorbWFuYWdlclNlcnZsZXQubm9Db250ZXh0PUZBSUwgLSBObyBjb250ZXh0IGV4aXN0cyBmb3IgcGF0aCB7MH0KK21hbmFnZXJTZXJ2bGV0Lm5vRGlyZWN0b3J5PUZBSUwgLSBOb24tZGlyZWN0b3J5IGRvY3VtZW50IGJhc2UgZm9yIHBhdGggezB9CittYW5hZ2VyU2VydmxldC5ub0RvY0Jhc2U9RkFJTCAtIENhbm5vdCB1bmRlcGxveSBkb2N1bWVudCBiYXNlIGZvciBwYXRoIHswfQorbWFuYWdlclNlcnZsZXQubm9HbG9iYWw9RkFJTCAtIE5vIGdsb2JhbCBKTkRJIHJlc291cmNlcyBhcmUgYXZhaWxhYmxlCittYW5hZ2VyU2VydmxldC5ub1JlbG9hZD1GQUlMIC0gUmVsb2FkIG5vdCBzdXBwb3J0ZWQgb24gV0FSIGRlcGxveWVkIGF0IHBhdGggezB9CittYW5hZ2VyU2VydmxldC5ub1JlbmFtZT1GQUlMIC0gQ2Fubm90IGRlcGxveSB1cGxvYWRlZCBXQVIgZm9yIHBhdGggezB9CittYW5hZ2VyU2VydmxldC5ub1JvbGU9RkFJTCAtIFVzZXIgZG9lcyBub3QgcG9zc2VzcyByb2xlIHswfQorbWFuYWdlclNlcnZsZXQubm9TZWxmPUZBSUwgLSBUaGUgbWFuYWdlciBjYW4gbm90IHJlbG9hZCwgdW5kZXBsb3ksIHN0b3AsIG9yIHVuZGVwbG95IGl0c2VsZgorbWFuYWdlclNlcnZsZXQubm9XcmFwcGVyPUNvbnRhaW5lciBoYXMgbm90IGNhbGxlZCBzZXRXcmFwcGVyKCkgZm9yIHRoaXMgc2VydmxldAorbWFuYWdlclNlcnZsZXQubm90RGVwbG95ZWQ9RkFJTCAtIENvbnRleHQgezB9IGlzIGRlZmluZWQgaW4gc2VydmVyLnhtbCBhbmQgbWF5IG5vdCBiZSB1bmRlcGxveWVkCittYW5hZ2VyU2VydmxldC5yZWxvYWRlZD1PSyAtIFJlbG9hZGVkIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCB7MH0KK21hbmFnZXJTZXJ2bGV0LnVuZGVwbG95ZD1PSyAtIFVuZGVwbG95ZWQgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIHswfQorbWFuYWdlclNlcnZsZXQucmVzb3VyY2VzQWxsPU9LIC0gTGlzdGVkIGdsb2JhbCByZXNvdXJjZXMgb2YgYWxsIHR5cGVzCittYW5hZ2VyU2VydmxldC5yZXNvdXJjZXNUeXBlPU9LIC0gTGlzdGVkIGdsb2JhbCByZXNvdXJjZXMgb2YgdHlwZSB7MH0KK21hbmFnZXJTZXJ2bGV0LnJvbGVzTGlzdD1PSyAtIExpc3RlZCBzZWN1cml0eSByb2xlcworbWFuYWdlclNlcnZsZXQuc2F2ZUZhaWw9RkFJTCAtIENvbmZpZ3VyYXRpb24gc2F2ZSBmYWlsZWQ6IHswfQorbWFuYWdlclNlcnZsZXQuc2F2ZWQ9T0sgLSBTZXJ2ZXIgY29uZmlndXJhdGlvbiBzYXZlZAorbWFuYWdlclNlcnZsZXQuc2F2ZWRDb250ZXh0PU9LIC0gQ29udGV4dCB7MH0gY29uZmlndXJhdGlvbiBzYXZlZAorbWFuYWdlclNlcnZsZXQuc2Vzc2lvbmRlZmF1bHRtYXg9RGVmYXVsdCBtYXhpbXVtIHNlc3Npb24gaW5hY3RpdmUgaW50ZXJ2YWwgezB9IG1pbnV0ZXMKK21hbmFnZXJTZXJ2bGV0LnNlc3Npb250aW1lb3V0PXswfSBtaW51dGVzOnsxfSBzZXNzaW9ucworbWFuYWdlclNlcnZsZXQuc2Vzc2lvbnM9T0sgLSBTZXNzaW9uIGluZm9ybWF0aW9uIGZvciBhcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggezB9CittYW5hZ2VyU2VydmxldC5zdGFydGVkPU9LIC0gU3RhcnRlZCBhcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggezB9CittYW5hZ2VyU2VydmxldC5zdGFydEZhaWxlZD1GQUlMIC0gQXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIHswfSBjb3VsZCBub3QgYmUgc3RhcnRlZAorbWFuYWdlclNlcnZsZXQuc3RvcHBlZD1PSyAtIFN0b3BwZWQgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIHswfQorbWFuYWdlclNlcnZsZXQudW5kZXBsb3llZD1PSyAtIFVuZGVwbG95ZWQgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIHswfQorbWFuYWdlclNlcnZsZXQudW5rbm93bkNvbW1hbmQ9RkFJTCAtIFVua25vd24gY29tbWFuZCB7MH0KK21hbmFnZXJTZXJ2bGV0LnVzZXJEYXRhYmFzZUVycm9yPUZBSUwgLSBDYW5ub3QgcmVzb2x2ZSB1c2VyIGRhdGFiYXNlIHJlZmVyZW5jZQorbWFuYWdlclNlcnZsZXQudXNlckRhdGFiYXNlTWlzc2luZz1GQUlMIC0gTm8gdXNlciBkYXRhYmFzZSBpcyBhdmFpbGFibGUKKworc3RhdHVzU2VydmxldC50aXRsZT1TZXJ2ZXIgU3RhdHVzCitzdGF0dXNTZXJ2bGV0LmNvbXBsZXRlPUNvbXBsZXRlIFNlcnZlciBTdGF0dXMKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Mb2NhbFN0cmluZ3NfZGUucHJvcGVydGllcyBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Mb2NhbFN0cmluZ3NfZGUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGFkYTQwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL0xvY2FsU3RyaW5nc19kZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNzggQEAKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzQXZhaWxhYmxlPVZlcmb8Z2JhcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNOYW1lPUFuemVpZ2VuYW1lCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1BhdGg9S29udGV4dCBQZmFkCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1JlbG9hZD1OZXUgbGFkZW4KK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzVW5kZXBsb3k9RW50ZmVybmVuCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1Nlc3Npb25zPVNpdHp1bmdlbgoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNTdGFydD1TdGFydAoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNTdG9wPVN0b3AKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzVGFza3M9S29tbWFuZG9zCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1RpdGxlPUFud2VuZHVuZ2VuCitodG1sTWFuYWdlclNlcnZsZXQuaGVscEh0bWxNYW5hZ2VyPUhpbGZlc2VpdGUgSFRNTCBNYW5hZ2VyIChlbmdsaXNjaCkKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwSHRtbE1hbmFnZXJGaWxlPWh0bWwtbWFuYWdlci1ob3d0by5odG1sCitodG1sTWFuYWdlclNlcnZsZXQuaGVscE1hbmFnZXI9SGlsZmVzZWl0ZSBNYW5hZ2VyIChlbmdsaXNjaCkKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwTWFuYWdlckZpbGU9bWFuYWdlci1ob3d0by5odG1sCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95QnV0dG9uPUluc3RhbGxpZXJlbgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveUNvbmZpZz1YTUwgS29uZmlndXJhdGlvbnNkYXRlaSBVUkw6CitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95UGF0aD1Lb250ZXh0IFBmYWQgKG9wdGlvbmFsKToKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lTZXJ2ZXI9VmVyemVpY2huaXMgb2RlciBXQVIgRGF0ZWkgYXVmIFNlcnZlciBpbnN0YWxsaWVyZW4KK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lUaXRsZT1JbnN0YWxsaWVyZW4KK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWQ9TG9rYWxlIFdBUiBEYXRlaSB6dXIgSW5zdGFsbGF0aW9uIGhvY2hsYWRlbgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZEZhaWw9RkVITEVSIC0gSG9jaGxhZGVuIHp1ciBJbnN0YWxsYXRpb24gZmVobGdlc2NobGFnZW4sIEF1c25haG1lOiB7MH0KK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWRGaWxlPVdBUiBEYXRlaSBhdXN35GhsZW4KK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWROb3RXYXI9RkVITEVSIC0gSG9jaGdlbGFkZW5lIERhdGVpIFwiezB9XCIgbXVzcyBlaW4gLndhciBzZWluCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95VXBsb2FkTm9GaWxlPUZFSExFUiAtIEhvY2hsYWRlbiBmZWhsZ2VzY2hsYWdlbiwga2VpbmUgRGF0ZWkgdm9yaGFuZGVuCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95VXBsb2FkV2FyRXhpc3RzPUZFSExFUiAtIFdBUiBEYXRlaSBcInswfVwiIGV4aXN0aWVydCBiZXJlaXRzIGF1ZiBTZXJ2ZXIKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lXYXI9V0FSIG9kZXIgVmVyemVpY2huaXMgVVJMOgoraHRtbE1hbmFnZXJTZXJ2bGV0Lmxpc3Q9QW53ZW5kdW5nZW4gYXVmbGlzdGVuCitodG1sTWFuYWdlclNlcnZsZXQubWFuYWdlcj1NYW5hZ2VyCitodG1sTWFuYWdlclNlcnZsZXQubWVzc2FnZUxhYmVsPU5hY2hyaWNodDoKK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJKVk1WZW5kb3I9SlZNIEhlcnN0ZWxsZXIKK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJKVk1WZXJzaW9uPUpWTSBWZXJzaW9uCitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyT1NBcmNoPU9TIEFyY2hpdGVrdHVyCitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyT1NOYW1lPU9TIE5hbWUKK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJPU1ZlcnNpb249T1MgVmVyc2lvbgoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlclRpdGxlPVNlcnZlciBJbmZvcm1hdGlvbmVuCitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyVmVyc2lvbj1Ub21jYXQgVmVyc2lvbgoraHRtbE1hbmFnZXJTZXJ2bGV0LnRpdGxlPVRvbWNhdCBXZWJhbndlbmR1bmdzLU1hbmFnZXIKK21hbmFnZXJTZXJ2bGV0LmFscmVhZHlDb250ZXh0PUZFSExFUiAtIEFud2VuZHVuZyBleGlzdGllcnQgYmVyZWl0cyBm/HIgS29udGV4dCBQZmFkIHswfQorbWFuYWdlclNlcnZsZXQuYWxyZWFkeURvY0Jhc2U9RkVITEVSIC0gVmVyemVpY2huaXMgezB9IGJlcmVpdHMgaW4gQmVudXR6dW5nCittYW5hZ2VyU2VydmxldC5jYW5ub3RJbnZva2U9S2FubiBNYW5hZ2VyLVNlcnZsZXQgbmljaHQgZHVyY2ggSW52b2tlciBhdWZydWZlbgorbWFuYWdlclNlcnZsZXQuY29uZmlndXJlZD1PSyAtIEFud2VuZHVuZyB2b24gS29udGV4dC1EYXRlaSB7MH0gaW5zdGFsbGllcnQKK21hbmFnZXJTZXJ2bGV0LmRlcGxveWVkPU9LIC0gQW53ZW5kdW5nIG1pdCBLb250ZXh0IFBmYWQgezB9IGluc3RhbGxpZXJ0CittYW5hZ2VyU2VydmxldC5leGNlcHRpb249RkVITEVSIC0gQXVzbmFobWUgYXVmZ2V0cmV0ZW4gezB9CittYW5hZ2VyU2VydmxldC5kZXBsb3llZD1PSyAtIEFud2VuZHVuZyBtaXQgS29udGV4dCBQZmFkIHswfSBpbnN0YWxsaWVydAorbWFuYWdlclNlcnZsZXQuaW52YWxpZFBhdGg9RkVITEVSIC0gVW5n/Gx0aWdlciBLb250ZXh0IFBmYWQgezB9IGFuZ2VnZWJlbgorbWFuYWdlclNlcnZsZXQuaW52YWxpZFdhcj1GRUhMRVIgLSBVbmf8bHRpZ2UgVVJMIHswfSBm/HIgQW53ZW5kdW5nIGFuZ2VnZWJlbgorbWFuYWdlclNlcnZsZXQubGlzdGVkPU9LIC0gQXVmbGlzdHVuZyBkZXIgV2ViYW53ZW5kdW5nZW4gZvxyIHZpcnR1ZWxsZW4gU2VydmVyIHswfQorbWFuYWdlclNlcnZsZXQubGlzdGl0ZW09ezB9OnsxfTp7Mn06ezN9CittYW5hZ2VyU2VydmxldC5ub0FwcEJhc2U9RkVITEVSIC0gS2FubiBWZXJ6ZWljaG5pcyBm/HIgS29udGV4dCBQZmFkIHswfSBuaWNodCBmaW5kZW4KK21hbmFnZXJTZXJ2bGV0Lm5vQ29tbWFuZD1GRUhMRVIgLSBFcyB3dXJkZSBrZWluIEtvbW1hbmRvIGFuZ2VnZWJlbgorbWFuYWdlclNlcnZsZXQubm9Db250ZXh0PUZFSExFUiAtIEVzIGV4aXN0aWVydCBrZWluIEtvbnRleHQgZvxyIFBmYWQgezB9CittYW5hZ2VyU2VydmxldC5ub0RpcmVjdG9yeT1GRUhMRVIgLSBQZmFkIHswfSBpc3Qga2VpbiBWZXJ6ZWljaG5pcworbWFuYWdlclNlcnZsZXQubm9Eb2NCYXNlPUZFSExFUiAtIEthbm4gV2ViYW53ZW5kdW5ncy1WZXJ6ZWljaG5pcyBuaWNodCBlbnRmZXJuZW4gZvxyIEtvbnRleHQgUGZhZCB7MH0KK21hbmFnZXJTZXJ2bGV0Lm5vR2xvYmFsPUZFSExFUiAtIEtlaW5lIGdsb2JhbGVuIEpOREkgUmVzc291cmNlbiB2ZXJm/GdiYXIKK21hbmFnZXJTZXJ2bGV0Lm5vUmVsb2FkPUZFSExFUiAtIE5ldSBsYWRlbiBuaWNodCB1bnRlcnN0/HR6dCBm/HIgV0FSIG1pdCBQZmFkIHswfQorbWFuYWdlclNlcnZsZXQubm9SZW5hbWU9RkVITEVSIC0gS2FubiBob2NoZ2VsYWRlbmVzIFdBUiBtaXQgUGZhZCB7MH0gbmljaHQgaW5zdGFsbGllcmVuCittYW5hZ2VyU2VydmxldC5ub1JvbGU9RkVITEVSIC0gQmVudXR6ZXIgbmljaHQgaW4gUm9sbGUgezB9CittYW5hZ2VyU2VydmxldC5ub1NlbGY9RkVITEVSIC0gTWFuYWdlci1Lb21tYW5kb3Mga/ZubmVuIG5pY2h0IGF1ZiBkaWUgTWFuYWdlci1BbndlbmR1bmcgc2VsYnN0IGFuZ2V3ZW5kZXQgd2VyZGVuCittYW5hZ2VyU2VydmxldC5ub1dyYXBwZXI9Q29udGFpbmVyIGhhdCBzZXRXcmFwcGVyKCkgZvxyIGRpZXNlcyBTZXJ2bGV0IG5pY2h0IGF1ZmdlcnVmZW4KK21hbmFnZXJTZXJ2bGV0LnJlbG9hZGVkPU9LIC0gQW53ZW5kdW5nIG1pdCBLb250ZXh0IFBmYWQgezB9IG5ldSBnZWxhZGVuCittYW5hZ2VyU2VydmxldC51bmRlcGxveWQ9T0sgLSBBbndlbmR1bmcgbWl0IEtvbnRleHQgUGZhZCB7MH0gZW50ZmVybnQKK21hbmFnZXJTZXJ2bGV0LnJlc291cmNlc0FsbD1PSyAtIEF1Zmxpc3R1bmcgZ2xvYmFsZXIgUmVzc291cmNlbiAoYWxsZSBUeXBlbikKK21hbmFnZXJTZXJ2bGV0LnJlc291cmNlc1R5cGU9T0sgLSBBdWZsaXN0dW5nIGdsb2JhbGVyIFJlc3NvdXJjZW4gdm9uIFR5cCB7MH0KK21hbmFnZXJTZXJ2bGV0LnJvbGVzTGlzdD1PSyAtIEF1Zmxpc3R1bmcgZGVyIFNpY2hlcmhlaXRzLVJvbGxlbgorbWFuYWdlclNlcnZsZXQuc2F2ZUZhaWw9RkVITEVSIC0gU3BlaWNoZXJuIGRlciBLb25maWd1cmF0aW9uIGZlaGxnZXNjaGxhZ2VuOiB7MH0KK21hbmFnZXJTZXJ2bGV0LnNlc3Npb25kZWZhdWx0bWF4PVZvcmVpbmdlc3RlbGx0ZXIgU2l0enVuZ3NhYmxhdWYgbmFjaCBtYXhpbWFsIHswfSBNaW51dGVuIEluYWt0aXZpdOR0CittYW5hZ2VyU2VydmxldC5zZXNzaW9udGltZW91dD17MH0gTWludXRlbjogezF9IFNpdHp1bmdlbgorbWFuYWdlclNlcnZsZXQuc2Vzc2lvbnM9T0sgLSBTaXR6dW5ncy1JbmZvcm1hdGlvbmVuIGb8ciBBbndlbmR1bmcgbWl0IEtvbnRleHQgUGZhZCB7MH0KK21hbmFnZXJTZXJ2bGV0LnN0YXJ0ZWQ9T0sgLSBBbndlbmR1bmcgbWl0IEtvbnRleHQgUGZhZCB7MH0gZ2VzdGFydGV0CittYW5hZ2VyU2VydmxldC5zdGFydEZhaWxlZD1GRUhMRVIgLSBBbndlbmR1bmcgbWl0IEtvbnRleHQgUGZhZCB7MH0ga29ubnRlIG5pY2h0IGdlc3RhcnRldCB3ZXJkZW4KK21hbmFnZXJTZXJ2bGV0LnN0b3BwZWQ9T0sgLSBBbndlbmR1bmcgbWl0IEtvbnRleHQgUGZhZCB7MH0gZ2VzdG9wcHQKK21hbmFnZXJTZXJ2bGV0LnVuZGVwbG95ZWQ9T0sgLSBBbndlbmR1bmcgbWl0IEtvbnRleHQgUGZhZCB7MH0gZW50ZmVybnQKK21hbmFnZXJTZXJ2bGV0LnVua25vd25Db21tYW5kPUZFSExFUiAtIFVuYmVrYW5udGVzIEtvbW1hbmRvIHswfQorbWFuYWdlclNlcnZsZXQudXNlckRhdGFiYXNlRXJyb3I9RkVITEVSIC0gS2FubiBSZWZlcmVueiBhdWYgQmVudXR6ZXJkYXRlbmRhbmsgbmljaHQgYXVmbPZzZW4KK21hbmFnZXJTZXJ2bGV0LnVzZXJEYXRhYmFzZU1pc3Npbmc9RkVITEVSIC0gS2VpbmUgQmVudXR6ZXJkYXRlbmJhbmsgdm9yaGFuZGVuCisKK3N0YXR1c1NlcnZsZXQudGl0bGU9U2VydmVyIFN0YXR1cworc3RhdHVzU2VydmxldC5jb21wbGV0ZT1BdXNm/GhybGljaGVyIFNlcnZlciBTdGF0dXMKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmEyYzFiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsODAgQEAKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzQXZhaWxhYmxlPUVqZWN1dOFuZG9zZQoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNOYW1lPU5vbWJyZSBhIE1vc3RyYXIKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzUGF0aD1UcmF5ZWN0b3JpYQoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNSZWxvYWQ9UmVjYXJnYXIKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzVW5kZXBsb3k9UmVwbGVnYXIKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzU2Vzc2lvbnM9U2VzaW9uZXMKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzU3RhcnQ9QXJyYW5jYXIKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzU3RvcD1QYXJhcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNUYXNrcz1Db21hbmRvcworaHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNUaXRsZT1BcGxpY2FjaW9uZXMKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwSHRtbE1hbmFnZXI9QXl1ZGEgSFRNTCBkZSBHZXN0b3IKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwSHRtbE1hbmFnZXJGaWxlPWh0bWwtbWFuYWdlci1ob3d0by5odG1sCitodG1sTWFuYWdlclNlcnZsZXQuaGVscE1hbmFnZXI9QXl1ZGEgZGUgR2VzdG9yCitodG1sTWFuYWdlclNlcnZsZXQuaGVscE1hbmFnZXJGaWxlPW1hbmFnZXItaG93dG8uaHRtbAoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveUJ1dHRvbj1EZXNwbGVnYXIKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lDb25maWc9VVJMIGRlIGFyY2hpdm8gZGUgQ29uZmlndXJhY2nzbiBYTUw6CitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95UGF0aD1UcmF5ZWN0b3JpYSBkZSBDb250ZXh0byAob3BjaW9uYWwpOgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVNlcnZlcj1EZXNwbGVnYXIgZGlyZWN0b3JpbyBvIGFyY2hpdm8gV0FSIGxvY2FsaXphZG8gZW4gc2Vydmlkb3IKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lUaXRsZT1EZXNwbGVnYXIKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWQ9QXJjaGl2byBXQVIgYSBkZXNwbGVnYXIKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWRGYWlsPUZBTExPIC0gRmFsbPMgQ2FyZ2EgZGUgRGVzcGxpZWd1ZSwgRXhjZXBjafNuOiB7MH0KK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWRGaWxlPVNlbGVjY2lvbmUgYXJjaGl2byBXQVIgYSBjYXJnYXIKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWROb3RXYXI9RkFMTE8gLSBFbCBhcmNoaXZvIGNhcmdhZG8gXCJ7MH1cIiBkZWJlIGRlIHNlciB1biAud2FyCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95VXBsb2FkTm9GaWxlPUZBTExPIC0gRmFsbPMgbGEgY2FyZ2EgZGUgYXJjaGl2bywgbm8gaGF5IGFyY2hpdm8KK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWRXYXJFeGlzdHM9RkFMTE8gLSBFbCBhcmNoaXZvIHdhciBcInswfVwiIHlhIGV4aXN0ZSBlbiBlbCBzZXJ2aWRvcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVdhcj1VUkwgZGUgV0FSIG8gRGlyZWN0b3JpbzoKK2h0bWxNYW5hZ2VyU2VydmxldC5saXN0PUxpc3RhciBBcGxpY2FjaW9uZXMKK2h0bWxNYW5hZ2VyU2VydmxldC5tYW5hZ2VyPUdlc3RvcgoraHRtbE1hbmFnZXJTZXJ2bGV0Lm1lc3NhZ2VMYWJlbD1NZW5zYWplOgoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlckpWTVZlbmRvcj1WZW5kZWRvciBKVk0KK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJKVk1WZXJzaW9uPVZlcnNp824gSlZNCitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyT1NBcmNoPUFycXVpdGVjdHVyYSBkZSBTTworaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlck9TTmFtZT1Ob21icmUgZGUgU08KK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJPU1ZlcnNpb249VmVyc2nzbiBkZSBTTworaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlclRpdGxlPUluZm9ybWFjafNuIGRlIFNlcnZpZG9yCitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyVmVyc2lvbj1WZXJzafNuIGRlIFRvbWNhdAoraHRtbE1hbmFnZXJTZXJ2bGV0LnRpdGxlPUdlc3RvciBkZSBBcGxpY2FjaW9uZXMgV2ViIGRlIFRvbWNhdAorbWFuYWdlclNlcnZsZXQuYWxyZWFkeUNvbnRleHQ9RkFMTE8gLSBZYSBleGlzdGUgbGEgYXBsaWNhY2nzbiBlbiBsYSB0cmF5ZWN0b3JpYSB7MH0KK21hbmFnZXJTZXJ2bGV0LmFscmVhZHlEb2NCYXNlPUZBTExPIC0gRGlyZWN0b3JpbyB7MH0geWEgZXN04SBzaWVuZG8gdXNhZG8KK21hbmFnZXJTZXJ2bGV0LmNhbm5vdEludm9rZT1ObyBwdWVkbyBpbnZvY2FyIHNlcnZsZXQgZGUgZ2VzdG9yIGEgdHJhdulzIGRlIGludm9jYWRvcgorbWFuYWdlclNlcnZsZXQuY29uZmlndXJlZD1PSyAtIERlc3BsZWdhZGEgYXBsaWNhY2nzbiBkZXNkZSBhcmNoaXZvIGRlIGNvbnRleHRvIHswfQorbWFuYWdlclNlcnZsZXQuZGVwbG95ZWQ9T0sgLSBEZXNwbGVnYWRhIGFwbGljYWNp824gZW4gdHJheWVjdG9yaWEgZGUgY29udGV4dG8gezB9CittYW5hZ2VyU2VydmxldC5leGNlcHRpb249RkFMTE8gLSBFbmNvbnRyYWRhIGV4Y2VwY2nzbiB7MH0KK21hbmFnZXJTZXJ2bGV0LmRlcGxveWVkPU9LIC0gRGVzcGxlZ2FkYSBhcGxpY2FjafNuIGVuIHRyYXllY3RvcmlhIGRlIGNvbnRleHRvIHswfQorbWFuYWdlclNlcnZsZXQuaW52YWxpZFBhdGg9RkFMTE8gLSBTZSBoYSBlc3BlY2lmaWNhZG8gdW5hIHRyYXllY3RvcmlhIGluduFsaWRhIGRlIGNvbnRleHRvIHswfQorbWFuYWdlclNlcnZsZXQuaW52YWxpZFdhcj1GQUxMTyAtIFNlIGhhIGVzcGVjaWZpY2FkbyB1bmEgVVJMIGRlIGFwbGljYWNp824gaW524WxpZGEgezB9CittYW5hZ2VyU2VydmxldC5saXN0ZWQ9T0sgLSBBcGxpY2FjaW9uZXMgbGlzdGFkYXMgcGFyYSBt4XF1aW5kYSB2aXJ1dGFsIHswfQorbWFuYWdlclNlcnZsZXQubGlzdGl0ZW09ezB9OnsxfTp7Mn06ezN9CittYW5hZ2VyU2VydmxldC5ub0FwcEJhc2U9RkFMTE8gLSBObyBwdWVkbyBpZGVudGlmaWNhciBhcGxpY2FjafNuIGJhc2UgcGFyYSB0cmF5ZWN0b3JpYSBkZSBjb250ZXh0byB7MH0KK21hbmFnZXJTZXJ2bGV0Lm5vQ29tbWFuZD1GQUxMTyAtIE5vIHNlIGhhIGVzcGVjaWZpY2FkbyBjb21hbmRvCittYW5hZ2VyU2VydmxldC5ub0NvbnRleHQ9RkFMTE8gLSBObyBleGlzdGUgY29udGV4dG8gcGFyYSB0cmF5ZWN0b3JpYSB7MH0KK21hbmFnZXJTZXJ2bGV0Lm5vRGlyZWN0b3J5PUZBTExPIC0gRG9jdW1lbnRvIGJhc2UgTm8tZGlyZWN0b3JpbyBwYXJhIHRyYXllY3RvcmlhIHswfQorbWFuYWdlclNlcnZsZXQubm9Eb2NCYXNlPUZBTExPIC0gTm8gcHVlZG8gcmVwbGVnYXIgZG9jdW1lbnRvIGJhc2UgcGFyYSB0cmF5ZWN0b3JpYSB7MH0KK21hbmFnZXJTZXJ2bGV0Lm5vR2xvYmFsPUZBTExPIC0gTm8gaGF5IGRpc3BvbmlibGVzIHJlY3Vyc29zIGdsb2JhbGVzIEpOREkgCittYW5hZ2VyU2VydmxldC5ub1JlbG9hZD1GQUxMTyAtIFJlY2FyZ2Egbm8gc29wb3J0YWRhIGVuIFdBUiBkZXNwbGVnYWRvIGVuIHRyYXllY3RvcmlhIHswfQorbWFuYWdlclNlcnZsZXQubm9SZW5hbWU9RkFMTE8gLSBObyBwdWRlbyBkZXNwbGVnYXIgV0FSIGNhcmdhZG8gcGFyYSB0cmF5ZWN0b3JpYSB7MH0KK21hbmFnZXJTZXJ2bGV0Lm5vUm9sZT1GQUxMTyAtIEVsIHVzdWFyaW8gbm8gZGVzZW1wZfFhIGVsIHBhcGVsIGRlIHswfQorbWFuYWdlclNlcnZsZXQubm9TZWxmPUZBTExPIC0gRWwgZ2VzdG9yIG5vIHB1ZWRlIHJlY2FyZ2Fyc2UsIHJlcGxlZ2Fyc2UsIHBhcmFyc2UgbyByZXBsZWdhcnNlIGEgc+0gbWlzbW8KK21hbmFnZXJTZXJ2bGV0Lm5vV3JhcHBlcj1FbCBDb250ZW5lZG9yIG5vIGhhIGxsYW1hZG8gYSBzZXRXcmFwcGVyKCkgcGFyYSBlc3RlIHNlcnZsZXQKK21hbmFnZXJTZXJ2bGV0LnJlbG9hZGVkPU9LIC0gUmVjYXJnYWRhIGFwbGljYWNp824gZW4gdHJheWVjdG9yaWEgZGUgY29udGV4dG8gezB9CittYW5hZ2VyU2VydmxldC51bmRlcGxveWQ9T0sgLSBSZXBsZWdhZGEgYXBsaWNhY2nzbiBlbiB0cmF5ZWN0b3JpYSBkZSBjb250ZXh0byB7MH0KK21hbmFnZXJTZXJ2bGV0LnJlc291cmNlc0FsbD1PSyAtIExpc3RhZG9zIHJlY3Vyc29zIGdsb2JhbGVzIGRlIHRvZG9zIGxvcyB0aXBvcworbWFuYWdlclNlcnZsZXQucmVzb3VyY2VzVHlwZT1PSyAtIExpc3RhZG9zIHJlY3Vyc29zIGdsb2JhbGVzIGRlIHRpcG8gezB9CittYW5hZ2VyU2VydmxldC5yb2xlc0xpc3Q9T0sgLSBMaXN0YWRvcyBwYXBlbGVzIGRlIHNlZ3VyaWRhZAorbWFuYWdlclNlcnZsZXQuc2F2ZUZhaWw9RkFJTCAtIEZhbGxvIGFsIGd1YXJkYXIgbGEgY29uZmlndXJhY2nzbjogezB9CittYW5hZ2VyU2VydmxldC5zYXZlZD1PSyAtIENvbmZpZ3VyYWNp824gZGUgU2Vydmlkb3IgZ3VhcmRhZGEKK21hbmFnZXJTZXJ2bGV0LnNhdmVkQ29udGV4dD1PSyAtIENvbmZpZ3VyYWNp824gZGUgQ29udGV4dG8gezB9IGd1YXJkYWRhCittYW5hZ2VyU2VydmxldC5zZXNzaW9uZGVmYXVsdG1heD1JbnRlcnZhbG8gbeF4aW1vIHBvciBkZWZlY3RvIGRlIHNlc2nzbiBpbmFjdGl2YSB7MH0gbWludXRvcworbWFuYWdlclNlcnZsZXQuc2Vzc2lvbnRpbWVvdXQ9ezB9IG1pbnV0b3M6IHsxfSBzZXNpb25lcworbWFuYWdlclNlcnZsZXQuc2Vzc2lvbnM9T0sgLSBJbmZvcm1hY2nzbiBkZSBzZXNp824gcGFyYSBhcGxpY2FjafNuIGVuIHRyYXllY3RvcmlhIGRlIGNvbnRleHRvIHswfQorbWFuYWdlclNlcnZsZXQuc3RhcnRlZD1PSyAtIEFycmFuY2FkYSBhcGxpY2FjafNuIGVuIHRyYXllY3RvcmlhIGRlIGNvbnRleHRvIHswfQorbWFuYWdlclNlcnZsZXQuc3RhcnRGYWlsZWQ9RkFMTE8gLSBObyBzZSBwdWRvIGFycmFuY2FyIGxhIGFwbGljYWNp824gZW4gdHJheWVjdG9yaWEgZGUgY29udGV4dG8gezB9CittYW5hZ2VyU2VydmxldC5zdG9wcGVkPU9LIC0gUGFyYWRhIGFwbGljYWNp824gZW4gdHJheWVjdG9yaWEgZGUgY29udGV4dG8gezB9CittYW5hZ2VyU2VydmxldC51bmRlcGxveWVkPU9LIC0gUmVwbGVnYWRhIGFwbGljYWNhY2nzbiBlbiB0cmF5ZWN0b3JpYSBkZSBjb250ZXh0byB7MH0KK21hbmFnZXJTZXJ2bGV0LnVua25vd25Db21tYW5kPUZBTExPIC0gQ29tYW5kbyBkZXNjb25vY2lkbyB7MH0KK21hbmFnZXJTZXJ2bGV0LnVzZXJEYXRhYmFzZUVycm9yPUZBTExPIC0gTm8gcHVlZG8gcmVzb2x2ZXIgcmVmZXJlbmNpYSBkZSBiYXNlIGRlIGRhdG9zIGRlIHVzdWFyaW8KK21hbmFnZXJTZXJ2bGV0LnVzZXJEYXRhYmFzZU1pc3Npbmc9RkFMTE8gLSBObyBzZSBlbmN1ZW50cmEgZGlzcG9uaWJsZSBiYXNlIGRlIGRhdG9zIGRlIHVzdWFyaW8KKworc3RhdHVzU2VydmxldC50aXRsZT1Fc3RhZG8gZGUgU2Vydmlkb3IKK3N0YXR1c1NlcnZsZXQuY29tcGxldGU9RXN0YWRvIENvbXBsZXRvIGRlIFNlcnZpZG9yCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyZTFmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpAQCAtMCwwICsxLDY0IEBACitodG1sTWFuYWdlclNlcnZsZXQuYXBwc0F2YWlsYWJsZT1Gb25jdGlvbm5hbnQKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzTmFtZT1Ob20gZCcnYWZmaWNoYWdlCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1BhdGg9Q2hlbWluCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1JlbG9hZD1SZWNoYXJnZXIKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzUmVtb3ZlPVJldGlyZXIKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzU2Vzc2lvbnM9U2Vzc2lvbnMKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzU3RhcnQ9ROltYXJyZXIKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzU3RvcD1BcnLpdGVyCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1RpdGxlPUFwcGxpY2F0aW9ucworaHRtbE1hbmFnZXJTZXJ2bGV0Lmluc3RhbGxCdXR0b249SW5zdGFsbGF0aW9uCitodG1sTWFuYWdlclNlcnZsZXQuaW5zdGFsbENvbmZpZz1VUkwgZGUgY29uZmlndXJhdGlvbjoKK2h0bWxNYW5hZ2VyU2VydmxldC5pbnN0YWxsUGF0aD1DaGVtaW46CitodG1sTWFuYWdlclNlcnZsZXQuaW5zdGFsbFRpdGxlPUluc3RhbGxhdGlvbgoraHRtbE1hbmFnZXJTZXJ2bGV0Lmluc3RhbGxXYXI9VVJMIGR1IFdBUjoKK2h0bWxNYW5hZ2VyU2VydmxldC5tZXNzYWdlTGFiZWw9TWVzc2FnZToKK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJKVk1WZW5kb3I9Rm91cm5pc3NldXIgZGUgbGEgSlZNCitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVySlZNVmVyc2lvbj1WZXJzaW9uIGRlIGxhIEpWTQoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlck9TQXJjaD1BcmNoaXRlY3R1cmUgZCcnT1MKK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJPU05hbWU9Tm9tIGQnJ09TCitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyT1NWZXJzaW9uPVZlcnNpb24gZCcnT1MKK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJUaXRsZT1TZXJ2ZXVyCitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyVmVyc2lvbj1WZXJzaW9uIGRlIHNlcnZldXIKK2h0bWxNYW5hZ2VyU2VydmxldC50aXRsZT1HZXN0aW9ubmFpcmUgZCcnYXBwbGljYXRpb25zIFdFQiBUb21jYXQKK21hbmFnZXJTZXJ2bGV0LmFscmVhZHlDb250ZXh0PUVDSEVDIC0gbCcnYXBwbGljYXRpb24gZXhpc3RlIGTpauAgZGFucyBsZSBjaGVtaW4gezB9CittYW5hZ2VyU2VydmxldC5hbHJlYWR5RG9jQmFzZT1FQ0hFQyAtIExlIHLpcGVydG9pcmUgezB9IGVzdCBk6WrgIHV0aWxpc+kKK21hbmFnZXJTZXJ2bGV0LmNhbm5vdEludm9rZT1JbXBvc3NpYmxlIGQnJ3V0aWxpc2VyIGxlIGdlc3Rpb25uYWlyZSBkZSBzZXJ2bGV0IGF1IHRyYXZlcnMgZHUgZOls6Wd16SAoaW52b2tlcikKK21hbmFnZXJTZXJ2bGV0LmNvbmZpZ3VyZWQ9T0sgLSBBcHBsaWNhdGlvbiBjb25maWd1cullIGRlcHVpcyBsZSBmaWNoaWVyIGNvbnRleHRlIHswfQorbWFuYWdlclNlcnZsZXQuZGVwbG95ZWQ9T0sgLSBBcHBsaWNhdGlvbiBk6XBsb3npZSBwb3VyIGxlIGNoZW1pbiBkZSBjb250ZXh0ZSB7MH0KK21hbmFnZXJTZXJ2bGV0LmV4Y2VwdGlvbj1FQ0hFQyAtIEwnJ2V4Y2VwdGlvbiB7MH0gYSDpdOkgcmVuY29udHLpZQorbWFuYWdlclNlcnZsZXQuaW5zdGFsbGVkPU9LIC0gQXBwbGljYXRpb24gaW5zdGFsbOllIHBvdXIgbGUgY2hlbWluIGRlIGNvbnRleHRlIHswfQorbWFuYWdlclNlcnZsZXQuaW52YWxpZFBhdGg9RUNIRUMgLSBVbiBjaGVtaW4gZGUgY29udGV4dGUgaW52YWxpZGUgezB9IGEg6XTpIHNw6WNpZmnpCittYW5hZ2VyU2VydmxldC5pbnZhbGlkV2FyPUVDSEVDIC0gVW5lIFVSTCBkJydhcHBsaWNhdGlvbiBpbnZhbGlkZSB7MH0gYSDpdOkgc3DpY2lmaellCittYW5hZ2VyU2VydmxldC5saXN0ZWQ9T0sgLSBBcHBsaWNhdGlvbnMgbGlzdOllcyBwb3VyIGwnJ2j0dGUgdmlydHVlbCAodmlydHVhbCBob3N0KSB7MH0KK21hbmFnZXJTZXJ2bGV0Lmxpc3RpdGVtPXswfTp7MX06ezJ9OnszfQorbWFuYWdlclNlcnZsZXQubm9BcHBCYXNlPUVDSEVDIC0gSW1wb3NzaWJsZSBkJydpZGVudGlmaWVyIGxhIGJhc2UgZGUgbCcnYXBwbGljYXRpb24gYmFzZSBwb3VyIGxlIGNoZW1pbiBkZSBjb250ZXh0IHswfQorbWFuYWdlclNlcnZsZXQubm9Db21tYW5kPUVDSEVDIC0gQXVjdW5lIGNvbW1hbmRlIG4nJ2Eg6XTpIHNw6WNpZmnpZQorbWFuYWdlclNlcnZsZXQubm9Db250ZXh0PUVDSEVDIC0gQXVjdW5lIGNvbnRleHRlIG4nJ2V4aXN0ZSBwb3VyIGxlIGNoZW1pbiB7MH0KK21hbmFnZXJTZXJ2bGV0Lm5vRGlyZWN0b3J5PUVDSEVDIC0gTGEgYmFzZSBkZSBkb2N1bWVudCBuJydlc3QgcGFzIHVuIHLpcGVydG9pcmUgcG91ciBsZSBjaGVtaW4gezB9CittYW5hZ2VyU2VydmxldC5ub0RvY0Jhc2U9RUNIRUMgLSBJbXBvc3NpYmxlIGRlIHJldGlyZXIgbGEgYmFzZSBkZSBkb2N1bWVudCBwb3VyIGxlIGNoZW1pbiB7MH0KK21hbmFnZXJTZXJ2bGV0Lm5vR2xvYmFsPUVDSEVDIC0gQXVjdW5lIHJlc3NvdXJjZSBKTkRJIGdsb2JhbGUgbicnZXN0IGRpc3BvbmlibGUKK21hbmFnZXJTZXJ2bGV0Lm5vUmVsb2FkPUVDSEVDIC0gUmVjaGFyZ2VtZW50IG5vbiBzdXBwb3J06SBwYXIgbGUgV0FSIGTpcGxveekgYXUgY2hlbWluIHswfQorbWFuYWdlclNlcnZsZXQubm9SZW5hbWU9RUNIRUMgLSBJbXBvc3NpYmxlIGRlIGTpcGxveWVyIHVuIFdBUiB06WzpY2hhcmfpIHBvdXIgbGUgY2hlbWluIHswfQorbWFuYWdlclNlcnZsZXQubm9Sb2xlPUVDSEVDIC0gTCcndXRpbGlzYXRldXIgbmUgcG9zc+hkZSBwYXMgbGUgcvRsZSB7MH0KK21hbmFnZXJTZXJ2bGV0Lm5vU2VsZj1FQ0hFQyAtIExlIGdlc3Rpb25uYWlyZSBuZSBwZXV0IHJlY2hhcmdlciwgcmV0aXJlciwgYXJy6nRlciwgb3Ugc2UgZOlwbG95ZXIgbHVpLW3qbWUKK21hbmFnZXJTZXJ2bGV0Lm5vV3JhcHBlcj1MZSBjb250ZW5ldXIgbicnYSBwYXMgYXBwZWzpICJzZXRXcmFwcGVyKCkiIHBvdXIgY2V0dGUgc2VydmxldAorbWFuYWdlclNlcnZsZXQucmVsb2FkZWQ9T0sgLSBBcHBsaWNhdGlvbiByZWNoYXJn6WUgYXUgY2hlbWluIGRlIGNvbnRleHRlIHswfQorbWFuYWdlclNlcnZsZXQucmVtb3ZlZD1PSyAtIEFwcGxpY2F0aW9uIHJldGly6WUgYXUgY2hlbWluIGRlIGNvbnRleHRlIHswfQorbWFuYWdlclNlcnZsZXQucmVzb3VyY2VzQWxsPU9LIC0gTGlzdGUgZGVzIHJlc3NvdXJjZXMgZ2xvYmFsZXMgZGUgdG91dCB0eXBlCittYW5hZ2VyU2VydmxldC5yZXNvdXJjZXNUeXBlPU9LIC0gTGlzdGUgZGVzIHJlc3NvdXJjZXMgZ2xvYmFsZXMgZGUgdHlwZSB7MH0KK21hbmFnZXJTZXJ2bGV0LnJvbGVzTGlzdD1PSyAtIExpc3RlIGRlIHL0bGVzIGRlIHNlY3VyaXTpCittYW5hZ2VyU2VydmxldC5zYXZlRmFpbD1FQ0hFQyAtIExhIHNhdXZlZ2FyZGUgZGUgbGEgY29uZmlndXJhdGlvbiBhIOljaG916TogezB9CittYW5hZ2VyU2VydmxldC5zZXNzaW9uZGVmYXVsdG1heD1JbnRlcnZhbCBwYXIgZOlmYXV0IGRlIG1heGltdW0gZGUgc2Vzc2lvbiBpbmFjdGl2ZSB7MH0gbWludXRlcworbWFuYWdlclNlcnZsZXQuc2Vzc2lvbnRpbWVvdXQ9ezB9IG1pbnV0ZXM6ezF9IHNlc3Npb25zCittYW5hZ2VyU2VydmxldC5zZXNzaW9ucz1PSyAtIEluZm9ybWF0aW9uIGRlIHNlc3Npb24gcG91ciBsJydhcHBsaWNhdGlvbiBhdSBjaGVtaW4gZGUgY29udGV4dGUgezB9CittYW5hZ2VyU2VydmxldC5zdGFydGVkPU9LIC0gQXBwbGljYXRpb24gZOltYXJy6WUgcG91ciBsZSBjaGVtaW4gZGUgY29udGV4dGUgezB9CittYW5hZ2VyU2VydmxldC5zdGFydEZhaWxlZD1FQ0hFQyAtIEwnJ2FwcGxpY2F0aW9uIHBvdXIgbGUgY2hlbWluIGRlIGNvbnRleHRlIHswfSBuJydhIHBhcyBwdep0cmVk6W1hcnLpZQorbWFuYWdlclNlcnZsZXQuc3RvcHBlZD1PSyAtIEFwcGxpY2F0aW9uIGFycul06WUgcG91ciBsZSBjaGVtaW4gZGUgY29udGV4dGUgezB9CittYW5hZ2VyU2VydmxldC51bmRlcGxveWVkPU9LIC0gQXBwbGljYXRpb24gbm9uLWTpcGxveellIHBvdXIgbGUgY2hlbWluIGRlIGNvbnRleHRlIHswfQorbWFuYWdlclNlcnZsZXQudW5rbm93bkNvbW1hbmQ9RUNIRUMgLSBDb21tYW5kZSBpbmNvbm51ZSB7MH0KK21hbmFnZXJTZXJ2bGV0LnVzZXJEYXRhYmFzZUVycm9yPUVDSEVDIC0gSW1wb3NzaWJsZSBkZSBy6XNvdWRyZSBsYSBiYXNlIGRlIGRvbm7pZXMgdXRpbGlzYXRldXJzIGRlculm6XJlbmNlCittYW5hZ2VyU2VydmxldC51c2VyRGF0YWJhc2VNaXNzaW5nPUVDSEVDIC0gQXVjdW5lIGJhc2UgZGUgZG9ubullcyB1dGlsaXNhdGV1cnMgbicnZXN0IGRpc3BvbmlibGUKKworc3RhdHVzU2VydmxldC50aXRsZT1FdGF0IGR1IHNlcnZldXIKK3N0YXR1c1NlcnZsZXQuY29tcGxldGU9RXRhdCBjb21wbGV0IGR1IHNlcnZldXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcyBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzMwN2RlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNzkgQEAKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzQXZhaWxhYmxlPVx1NWI5Zlx1ODg0Y1x1NGUyZAoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNOYW1lPVx1ODg2OFx1NzkzYVx1NTQwZAoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNQYXRoPVx1MzBkMVx1MzBiOQoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNSZWxvYWQ9XHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5CitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1VuZGVwbG95PVx1OTE0ZFx1NTA5OVx1ODllM1x1OTY2NAoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNTZXNzaW9ucz1cdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjMKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzU3RhcnQ9XHU4ZDc3XHU1MmQ1CitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1N0b3A9XHU1MDVjXHU2YjYyCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1Rhc2tzPVx1MzBiM1x1MzBkZVx1MzBmM1x1MzBjOQoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNUaXRsZT1cdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjMKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwSHRtbE1hbmFnZXI9SFRNTFx1MzBkZVx1MzBjZFx1MzBmY1x1MzBiOFx1MzBlM1x1MzBkOFx1MzBlYlx1MzBkNworaHRtbE1hbmFnZXJTZXJ2bGV0LmhlbHBIdG1sTWFuYWdlckZpbGU9aHRtbC1tYW5hZ2VyLWhvd3RvLmh0bWwKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwTWFuYWdlcj1cdTMwZGVcdTMwY2RcdTMwZmNcdTMwYjhcdTMwZTNcdTMwZDhcdTMwZWJcdTMwZDcKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwTWFuYWdlckZpbGU9bWFuYWdlci1ob3d0by5odG1sCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95QnV0dG9uPVx1OTE0ZFx1NTA5OQoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveUNvbmZpZz1YTUxcdThhMmRcdTViOWFcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmVVUkw6CitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95UGF0aD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgKFx1NzcwMVx1NzU2NVx1NTNlZik6CitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95U2VydmVyPVx1MzBiNVx1MzBmY1x1MzBkMFx1NGUwYVx1MzA2ZVdBUlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1NTNjOFx1MzA2Zlx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzA2ZVx1OTE0ZFx1NTA5OQoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVRpdGxlPVx1OTE0ZFx1NTA5OQoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZD1XQVJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmVcdTkxNGRcdTUwOTkKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWRGYWlsPUZBSUwgLSBcdTkxNGRcdTUwOTlcdTMwNmVcdTMwYTJcdTMwYzNcdTMwZDdcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNGNcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDFcdTRmOGJcdTU5MTY6IHswfQoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZEZpbGU9XHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU5XHUzMDhiV0FSXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHU5MDc4XHU2MjllCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95VXBsb2FkTm90V2FyPUZBSUwgLSBcdTMwYTJcdTMwYzNcdTMwZDdcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNTlcdTMwOGJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgXCJ7MH1cIiBcdTMwNmZXQVJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNjdcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWROb0ZpbGU9RkFJTCAtIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZVx1MzBhMlx1MzBjM1x1MzBkN1x1MzBlZFx1MzBmY1x1MzBjOVx1MzA0Y1x1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1Ylx1MzA5MworaHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZFdhckV4aXN0cz1GQUlMIC0gV0FSXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViIFwiezB9XCIgXHUzMDZmXHU2NWUyXHUzMDZiXHUzMGI1XHUzMGZjXHUzMGQwXHU0ZTBhXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5CitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95V2FyPVdBUlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1NTNjOFx1MzA2Zlx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzA2ZVVSTDoKK2h0bWxNYW5hZ2VyU2VydmxldC5saXN0PVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZVx1NGUwMFx1ODlhNworaHRtbE1hbmFnZXJTZXJ2bGV0Lm1hbmFnZXI9XHUzMGRlXHUzMGNkXHUzMGZjXHUzMGI4XHUzMGUzCitodG1sTWFuYWdlclNlcnZsZXQubWVzc2FnZUxhYmVsPVx1MzBlMVx1MzBjM1x1MzBiYlx1MzBmY1x1MzBiOAoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlckpWTVZlbmRvcj1KVk1cdTMwZDlcdTMwZjNcdTMwYzAKK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJKVk1WZXJzaW9uPUpWTVx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmMworaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlck9TQXJjaD1PU1x1MzBhMlx1MzBmY1x1MzBhZFx1MzBjNlx1MzBhZlx1MzBjMVx1MzBlMworaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlck9TTmFtZT1PU1x1NTQwZAoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlck9TVmVyc2lvbj1PU1x1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmMworaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlclRpdGxlPVx1MzBiNVx1MzBmY1x1MzBkMFx1NjBjNVx1NTgzMQoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlclZlcnNpb249VG9tY2F0XHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzCitodG1sTWFuYWdlclNlcnZsZXQudGl0bGU9VG9tY2F0IFdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBkZVx1MzBjZFx1MzBmY1x1MzBiOFx1MzBlMworbWFuYWdlclNlcnZsZXQuYWxyZWFkeUNvbnRleHQ9RkFJTCAtIFx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2Zlx1MzAwMVx1NjVlMlx1MzA2Ylx1MzBkMVx1MzBiOSB7MH0gXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5CittYW5hZ2VyU2VydmxldC5hbHJlYWR5RG9jQmFzZT1GQUlMIC0gXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhIHswfSBcdTMwNmZcdTY1ZTJcdTMwNmJcdTRmN2ZcdTc1MjhcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK21hbmFnZXJTZXJ2bGV0LmNhbm5vdEludm9rZT1cdTMwYTRcdTMwZjNcdTMwZGNcdTMwZmNcdTMwYWJcdTMwNjdcdTMwZGVcdTMwY2RcdTMwZmNcdTMwYjhcdTMwZTNcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTMwOTJcdThkNzdcdTUyZDVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWYKK21hbmFnZXJTZXJ2bGV0LmNvbmZpZ3VyZWQ9T0sgLSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgezB9IFx1MzA0Ylx1MzA4OVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1MzBhNFx1MzBmM1x1MzBiOVx1MzBjOFx1MzBmY1x1MzBlYlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQuZGVwbG95ZWQ9T0sgLSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2N1x1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1OTE0ZFx1NTA5OVx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uPUZBSUwgLSBcdTRmOGJcdTU5MTYgezB9IFx1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQuZGVwbG95ZWQ9T0sgLSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2Ylx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1MzBhNFx1MzBmM1x1MzBiOVx1MzBjOFx1MzBmY1x1MzBlYlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQuaW52YWxpZFBhdGg9RkFJTCAtIFx1NzEyMVx1NTJiOVx1MzA2YVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmCittYW5hZ2VyU2VydmxldC5pbnZhbGlkV2FyPUZBSUwgLSBcdTcxMjFcdTUyYjlcdTMwNmFcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmVVUkwgezB9IFx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQubGlzdGVkPU9LIC0gXHUzMGQwXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGViXHUzMGRiXHUzMGI5XHUzMGM4IHswfSBcdTMwNmVcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTRlMDBcdTg5YTdcdTMwNjdcdTMwNTkKK21hbmFnZXJTZXJ2bGV0Lmxpc3RpdGVtPXswfTp7MX06ezJ9OnszfQorbWFuYWdlclNlcnZsZXQubm9BcHBCYXNlPUZBSUwgLSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2Ylx1NWJmZVx1MzA1N1x1MzA2Nlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBkOVx1MzBmY1x1MzBiOVx1MzA5Mlx1NzhiYVx1OGE4ZFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworbWFuYWdlclNlcnZsZXQubm9Db21tYW5kPUZBSUwgLSBcdTMwYjNcdTMwZGVcdTMwZjNcdTMwYzlcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK21hbmFnZXJTZXJ2bGV0Lm5vQ29udGV4dD1GQUlMIC0gXHUzMGQxXHUzMGI5IHswfSBcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNGNcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNWJcdTMwOTMKK21hbmFnZXJTZXJ2bGV0Lm5vRGlyZWN0b3J5PUZBSUwgLSBcdTMwZDFcdTMwYjkgezB9IFx1MzA2Ylx1NWJmZVx1MzA1OVx1MzA4Ylx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBjOVx1MzBhZFx1MzBlNVx1MzBlMVx1MzBmM1x1MzBjOFx1MzBkOVx1MzBmY1x1MzBiOVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworbWFuYWdlclNlcnZsZXQubm9Eb2NCYXNlPUZBSUwgLSBcdTMwZDFcdTMwYjkgezB9IFx1MzA2Ylx1NWJmZVx1MzA1OVx1MzA4Ylx1MzBjOVx1MzBhZFx1MzBlNVx1MzBlMVx1MzBmM1x1MzBjOFx1MzBkOVx1MzBmY1x1MzBiOVx1MzA5Mlx1NTI0YVx1OTY2NFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworbWFuYWdlclNlcnZsZXQubm9HbG9iYWw9RkFJTCAtIFx1MzBiMFx1MzBlZFx1MzBmY1x1MzBkMFx1MzBlYlx1MzA2YUpORElcdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwNGNcdTUyMjlcdTc1MjhcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK21hbmFnZXJTZXJ2bGV0Lm5vUmVsb2FkPUZBSUwgLSBcdTMwZDFcdTMwYjkgezB9IFx1MzA2Ylx1OTE0ZFx1NTA5OVx1MzA1NVx1MzA4Y1x1MzA1ZldBUlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2N1x1MzA2Zlx1NTE4ZFx1MzBlZFx1MzBmY1x1MzBjOVx1MzA0Y1x1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworbWFuYWdlclNlcnZsZXQubm9SZW5hbWU9RkFJTCAtIFx1MzBhMlx1MzBjM1x1MzBkN1x1MzBlZFx1MzBmY1x1MzBjOVx1MzA1NVx1MzA4Y1x1MzA1ZldBUlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1MzBkMVx1MzBiOSB7MH0gXHUzMDZiXHU5MTRkXHU1MDk5XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCittYW5hZ2VyU2VydmxldC5ub1JvbGU9RkFJTCAtIFx1MzBlNlx1MzBmY1x1MzBiNlx1MzA2Zlx1MzBlZFx1MzBmY1x1MzBlYiB7MH0gXHUzMDkyXHU2MzAxXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCittYW5hZ2VyU2VydmxldC5ub1NlbGY9RkFJTCAtIFx1MzBkZVx1MzBjZFx1MzBmY1x1MzBiOFx1MzBlM1x1ODFlYVx1OGVhYlx1MzA5Mlx1NTE4ZFx1MzBlZFx1MzBmY1x1MzBjOVx1MzAwMVx1NTI0YVx1OTY2NFx1MzAwMVx1NTA1Y1x1NmI2Mlx1MzAwMVx1NTNjOFx1MzA2Zlx1OTE0ZFx1NTA5OVx1ODllM1x1OTY2NFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworbWFuYWdlclNlcnZsZXQubm9XcmFwcGVyPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzA2Zlx1MzA1M1x1MzA2ZVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOFx1MzA2Ylx1NWJmZVx1MzA1N1x1MzA2Nlx1NTQ3Y1x1MzA3M1x1NTFmYVx1MzA1NVx1MzA4Y1x1MzA1ZnNldFdyYXBwZXIoKVx1MzA5Mlx1NjMwMVx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworbWFuYWdlclNlcnZsZXQucmVsb2FkZWQ9T0sgLSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2ZVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1NTE4ZFx1MzBlZFx1MzBmY1x1MzBjOVx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQudW5kZXBsb3lkPU9LIC0gXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGQxXHUzMGI5IHswfSBcdTMwNGJcdTMwODlcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTkxNGRcdTUwOTlcdTg5ZTNcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK21hbmFnZXJTZXJ2bGV0LnJlc291cmNlc0FsbD1PSyAtIFx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1MzBiZlx1MzBhNFx1MzBkN1x1MzA2ZVx1MzBiMFx1MzBlZFx1MzBmY1x1MzBkMFx1MzBlYlx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzA5Mlx1NTIxN1x1NjMxOVx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQucmVzb3VyY2VzVHlwZT1PSyAtIFx1MzBiZlx1MzBhNFx1MzBkNyB7MH0gXHUzMDZlXHUzMGIwXHUzMGVkXHUzMGZjXHUzMGQwXHUzMGViXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDkyXHU1MjE3XHU2MzE5XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCittYW5hZ2VyU2VydmxldC5yb2xlc0xpc3Q9T0sgLSBcdTMwYmJcdTMwYWRcdTMwZTVcdTMwZWFcdTMwYzZcdTMwYTNcdTMwZWRcdTMwZmNcdTMwZWJcdTMwOTJcdTUyMTdcdTYzMTlcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK21hbmFnZXJTZXJ2bGV0LnNhdmVGYWlsPUZBSUwgLSBcdThhMmRcdTViOWFcdTMwNmVcdTRmZGRcdTViNThcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWY6IHswfQorbWFuYWdlclNlcnZsZXQuc2F2ZWQ9T0sgLSBcdTMwYjVcdTMwZmNcdTMwZDBcdTMwNmVcdThhMmRcdTViOWFcdTMwOTJcdTRmZGRcdTViNThcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK21hbmFnZXJTZXJ2bGV0LnNhdmVkQ29udGV4dD1PSyAtIFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOCB7MH0gXHUzMDZlXHU4YTJkXHU1YjlhXHUzMDkyXHU0ZmRkXHU1YjU4XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCittYW5hZ2VyU2VydmxldC5zZXNzaW9uZGVmYXVsdG1heD1cdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmVcdTY3MDBcdTU5MjdcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTUwNWNcdTZiNjJcdTk1OTNcdTk2OTRcdTMwNmZ7MH1cdTUyMDZcdTMwNjdcdTMwNTkKK21hbmFnZXJTZXJ2bGV0LnNlc3Npb250aW1lb3V0PXswfVx1NTIwNjogezF9XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzCittYW5hZ2VyU2VydmxldC5zZXNzaW9ucz1PSyAtIFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZlXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDY3XHUzMDU5CittYW5hZ2VyU2VydmxldC5zdGFydGVkPU9LIC0gXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGQxXHUzMGI5IHswfSBcdTMwNjdcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdThkNzdcdTUyZDVcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK21hbmFnZXJTZXJ2bGV0LnN0YXJ0RmFpbGVkPUZBSUwgLSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2ZVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA0Y1x1OGQ3N1x1NTJkNVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworbWFuYWdlclNlcnZsZXQuc3RvcHBlZD1PSyAtIFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDY3XHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU1MDVjXHU2YjYyXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCittYW5hZ2VyU2VydmxldC51bmRlcGxveWVkPU9LIC0gXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGQxXHUzMGI5IHswfSBcdTMwNmVcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTkxNGRcdTUwOTlcdTg5ZTNcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK21hbmFnZXJTZXJ2bGV0LnVua25vd25Db21tYW5kPUZBSUwgLSBcdTY3MmFcdTc3ZTVcdTMwNmVcdTMwYjNcdTMwZGVcdTMwZjNcdTMwYzkgezB9IFx1MzA2N1x1MzA1OQorbWFuYWdlclNlcnZsZXQudXNlckRhdGFiYXNlRXJyb3I9RkFJTCAtIFx1MzBlNlx1MzBmY1x1MzBiNlx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOVx1NTNjMlx1NzE2N1x1MzA5Mlx1ODllM1x1NmM3YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworbWFuYWdlclNlcnZsZXQudXNlckRhdGFiYXNlTWlzc2luZz1GQUlMIC0gXHUzMGU2XHUzMGZjXHUzMGI2XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMDRjXHU1MjI5XHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitzdGF0dXNTZXJ2bGV0LnRpdGxlPVx1MzBiNVx1MzBmY1x1MzBkMFx1MzA2ZVx1NzJiNlx1NjE0Ygorc3RhdHVzU2VydmxldC5jb21wbGV0ZT1cdTMwYjVcdTMwZmNcdTMwZDBcdTMwNmVcdTUxNjhcdTcyYjZcdTYxNGIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9NYW5hZ2VyU2VydmxldC5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL01hbmFnZXJTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQzN2QzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9NYW5hZ2VyU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTYwMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1hbmFnZXI7CisKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLkJpbmRpbmc7CitpbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlVuYXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlJvbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLldyYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5SZXF1ZXN0VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU2VydmVySW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKKworCisvKioKKyAqIFNlcnZsZXQgdGhhdCBlbmFibGVzIHJlbW90ZSBtYW5hZ2VtZW50IG9mIHRoZSB3ZWIgYXBwbGljYXRpb25zIGluc3RhbGxlZAorICogd2l0aGluIHRoZSBzYW1lIHZpcnR1YWwgaG9zdCBhcyB0aGlzIHdlYiBhcHBsaWNhdGlvbiBpcy4gIE5vcm1hbGx5LCB0aGlzCisgKiBmdW5jdGlvbmFsaXR5IHdpbGwgYmUgcHJvdGVjdGVkIGJ5IGEgc2VjdXJpdHkgY29uc3RyYWludCBpbiB0aGUgd2ViCisgKiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBIb3dldmVyLCB0aGlzIHJlcXVpcmVtZW50IGNhbiBiZQorICogcmVsYXhlZCBkdXJpbmcgdGVzdGluZy4KKyAqIDxwPgorICogVGhpcyBzZXJ2bGV0IGV4YW1pbmVzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSA8Y29kZT5nZXRQYXRoSW5mbygpPC9jb2RlPgorICogYW5kIHJlbGF0ZWQgcXVlcnkgcGFyYW1ldGVycyB0byBkZXRlcm1pbmUgd2hhdCBhY3Rpb24gaXMgYmVpbmcgcmVxdWVzdGVkLgorICogVGhlIGZvbGxvd2luZyBhY3Rpb25zIGFuZCBwYXJhbWV0ZXJzIChzdGFydGluZyBhZnRlciB0aGUgc2VydmxldCBwYXRoKQorICogYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqIDxsaT48Yj4vZGVwbG95P2NvbmZpZz17Y29uZmlnLXVybH08L2I+IC0gSW5zdGFsbCBhbmQgc3RhcnQgYSBuZXcKKyAqICAgICB3ZWIgYXBwbGljYXRpb24sIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgY29udGV4dCBjb25maWd1cmF0aW9uCisgKiAgICAgZmlsZSBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIFVSTC4gIFRoZSA8Y29kZT5kb2NCYXNlPC9jb2RlPiBhdHRyaWJ1dGUKKyAqICAgICBvZiB0aGUgY29udGV4dCBjb25maWd1cmF0aW9uIGZpbGUgaXMgdXNlZCB0byBsb2NhdGUgdGhlIGFjdHVhbAorICogICAgIFdBUiBvciBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgYXBwbGljYXRpb24uPC9saT4KKyAqIDxsaT48Yj4vZGVwbG95P2NvbmZpZz17Y29uZmlnLXVybH0md2FyPXt3YXItdXJsfS88L2I+IC0gSW5zdGFsbCBhbmQgc3RhcnQKKyAqICAgICBhIG5ldyB3ZWIgYXBwbGljYXRpb24sIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgY29udGV4dAorICogICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3VuZCBhdCA8Y29kZT57Y29uZmlnLXVybH08L2NvZGU+LCBvdmVycmlkaW5nIHRoZQorICogICAgIDxjb2RlPmRvY0Jhc2U8L2NvZGU+IGF0dHJpYnV0ZSB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgd2ViCisgKiAgICAgYXBwbGljYXRpb24gYXJjaGl2ZSBmb3VuZCBhdCA8Y29kZT57d2FyLXVybH08L2NvZGU+LjwvbGk+CisgKiA8bGk+PGI+L2RlcGxveT9wYXRoPS94eHgmd2FyPXt3YXItdXJsfTwvYj4gLSBJbnN0YWxsIGFuZCBzdGFydCBhIG5ldworICogICAgIHdlYiBhcHBsaWNhdGlvbiBhdHRhY2hlZCB0byBjb250ZXh0IHBhdGggPGNvZGU+L3h4eDwvY29kZT4sIGJhc2VkCisgKiAgICAgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSBmb3VuZCBhdCB0aGUKKyAqICAgICBzcGVjaWZpZWQgVVJMLjwvbGk+CisgKiA8bGk+PGI+L2xpc3Q8L2I+IC0gTGlzdCB0aGUgY29udGV4dCBwYXRocyBvZiBhbGwgY3VycmVudGx5IGluc3RhbGxlZCB3ZWIKKyAqICAgICBhcHBsaWNhdGlvbnMgZm9yIHRoaXMgdmlydHVhbCBob3N0LiAgRWFjaCBjb250ZXh0IHdpbGwgYmUgbGlzdGVkIHdpdGgKKyAqICAgICB0aGUgZm9sbG93aW5nIGZvcm1hdCA8Y29kZT5wYXRoOnN0YXR1czpzZXNzaW9uczwvY29kZT4uCisgKiAgICAgV2hlcmUgcGF0aCBpcyB0aGUgY29udGV4dCBwYXRoLiAgU3RhdHVzIGlzIGVpdGhlciBydW5uaW5nIG9yIHN0b3BwZWQuCisgKiAgICAgU2Vzc2lvbnMgaXMgdGhlIG51bWJlciBvZiBhY3RpdmUgU2Vzc2lvbnMuPC9saT4KKyAqIDxsaT48Yj4vcmVsb2FkP3BhdGg9L3h4eDwvYj4gLSBSZWxvYWQgdGhlIEphdmEgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIGZvcgorICogICAgIHRoZSBhcHBsaWNhdGlvbiBhdCB0aGUgc3BlY2lmaWVkIHBhdGguPC9saT4KKyAqIDxsaT48Yj4vcmVzb3VyY2VzP3R5cGU9eHh4eDwvYj4gLSBFbnVtZXJhdGUgdGhlIGF2YWlsYWJsZSBnbG9iYWwgSk5ESQorICogICAgIHJlc291cmNlcywgb3B0aW9uYWxseSBsaW1pdGVkIHRvIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZQorICogICAgIChmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lKSwgaWYgYXZhaWxhYmxlLjwvbGk+CisgKiA8bGk+PGI+L3JvbGVzPC9iPiAtIEVudW1lcmF0ZSB0aGUgYXZhaWxhYmxlIHNlY3VyaXR5IHJvbGUgbmFtZXMgYW5kCisgKiAgICAgZGVzY3JpcHRpb25zIGZyb20gdGhlIHVzZXIgZGF0YWJhc2UgY29ubmVjdGVkIHRvIHRoZSA8Y29kZT51c2VyczwvY29kZT4KKyAqICAgICByZXNvdXJjZSByZWZlcmVuY2UuCisgKiA8bGk+PGI+L3NlcnZlcmluZm88L2I+IC0gRGlzcGxheSBzeXN0ZW0gT1MgYW5kIEpWTSBwcm9wZXJ0aWVzLgorICogPGxpPjxiPi9zZXNzaW9ucz9wYXRoPS94eHg8L2I+IC0gTGlzdCBzZXNzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoZSB3ZWIKKyAqICAgICBhcHBsaWNhdGlvbiBhdHRhY2hlZCB0byBjb250ZXh0IHBhdGggPGNvZGU+L3h4eDwvY29kZT4gZm9yIHRoaXMKKyAqICAgICB2aXJ0dWFsIGhvc3QuPC9saT4KKyAqIDxsaT48Yj4vc3RhcnQ/cGF0aD0veHh4PC9iPiAtIFN0YXJ0IHRoZSB3ZWIgYXBwbGljYXRpb24gYXR0YWNoZWQgdG8KKyAqICAgICBjb250ZXh0IHBhdGggPGNvZGU+L3h4eDwvY29kZT4gZm9yIHRoaXMgdmlydHVhbCBob3N0LjwvbGk+CisgKiA8bGk+PGI+L3N0b3A/cGF0aD0veHh4PC9iPiAtIFN0b3AgdGhlIHdlYiBhcHBsaWNhdGlvbiBhdHRhY2hlZCB0bworICogICAgIGNvbnRleHQgcGF0aCA8Y29kZT4veHh4PC9jb2RlPiBmb3IgdGhpcyB2aXJ0dWFsIGhvc3QuPC9saT4KKyAqIDxsaT48Yj4vdW5kZXBsb3k/cGF0aD0veHh4PC9iPiAtIFNodXRkb3duIGFuZCByZW1vdmUgdGhlIHdlYiBhcHBsaWNhdGlvbgorICogICAgIGF0dGFjaGVkIHRvIGNvbnRleHQgcGF0aCA8Y29kZT4veHh4PC9jb2RlPiBmb3IgdGhpcyB2aXJ0dWFsIGhvc3QsCisgKiAgICAgYW5kIHJlbW92ZSB0aGUgdW5kZXJseWluZyBXQVIgZmlsZSBvciBkb2N1bWVudCBiYXNlIGRpcmVjdG9yeS4KKyAqICAgICAoPGVtPk5PVEU8L2VtPiAtIFRoaXMgaXMgb25seSBhbGxvd2VkIGlmIHRoZSBXQVIgZmlsZSBvciBkb2N1bWVudAorICogICAgIGJhc2UgaXMgc3RvcmVkIGluIHRoZSA8Y29kZT5hcHBCYXNlPC9jb2RlPiBkaXJlY3Rvcnkgb2YgdGhpcyBob3N0LAorICogICAgIHR5cGljYWxseSBhcyBhIHJlc3VsdCBvZiBiZWluZyBwbGFjZWQgdGhlcmUgdmlhIHRoZSA8Y29kZT4vZGVwbG95PC9jb2RlPgorICogICAgIGNvbW1hbmQuPC9saT4KKyAqIDwvdWw+CisgKiA8cD5Vc2UgPGNvZGU+cGF0aD0vPC9jb2RlPiBmb3IgdGhlIFJPT1QgY29udGV4dC48L3A+CisgKiA8cD5UaGUgc3ludGF4IG9mIHRoZSBVUkwgZm9yIGEgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgbXVzdCBjb25mb3JtIHRvIG9uZQorICogb2YgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyB0byBiZSBzdWNjZXNzZnVsbHkgZGVwbG95ZWQ6PC9wPgorICogPHVsPgorICogPGxpPjxiPmZpbGU6L2Fic29sdXRlL3BhdGgvdG8vYS9kaXJlY3Rvcnk8L2I+IC0gWW91IGNhbiBzcGVjaWZ5IHRoZSBhYnNvbHV0ZQorICogICAgIHBhdGggb2YgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUgdW5wYWNrZWQgdmVyc2lvbiBvZiBhIHdlYgorICogICAgIGFwcGxpY2F0aW9uLiAgVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgY29udGV4dCBwYXRoIHlvdQorICogICAgIHNwZWNpZnkgd2l0aG91dCBhbnkgY2hhbmdlcy48L2xpPgorICogPGxpPjxiPmphcjpmaWxlOi9hYnNvbHV0ZS9wYXRoL3RvL2Evd2FyZmlsZS53YXIhLzwvYj4gLSBZb3UgY2FuIHNwZWNpZnkgYQorICogICAgIFVSTCB0byBhIGxvY2FsIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIGZpbGUuICBUaGUgc3ludGF4IG11c3QgY29uZm9ybSB0bworICogICAgIHRoZSBydWxlcyBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPkphclVSTENvbm5lY3Rpb248L2NvZGU+IGNsYXNzIGZvciBhCisgKiAgICAgcmVmZXJlbmNlIHRvIGFuIGVudGlyZSBKQVIgZmlsZS48L2xpPgorICogPGxpPjxiPmphcjpodHRwOi8vaG9zdG5hbWU6cG9ydC9wYXRoL3RvL2Evd2FyZmlsZS53YXIhLzwvYj4gLSBZb3UgY2FuIHNwZWNpZnkKKyAqICAgICBhIFVSTCB0byBhIHJlbW90ZSAoSFRUUC1hY2Nlc3NpYmxlKSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSBmaWxlLiAgVGhlCisgKiAgICAgc3ludGF4IG11c3QgY29uZm9ybSB0byB0aGUgcnVsZXMgc3BlY2lmaWVkIGJ5IHRoZQorICogICAgIDxjb2RlPkphclVSTENvbm5lY3Rpb248L2NvZGU+IGNsYXNzIGZvciBhIHJlZmVyZW5jZSB0byBhbiBlbnRpcmUKKyAqICAgICBKQVIgZmlsZS48L2xpPgorICogPC91bD4KKyAqIDxwPgorICogPGI+Tk9URTwvYj4gLSBBdHRlbXB0aW5nIHRvIHJlbG9hZCBvciByZW1vdmUgdGhlIGFwcGxpY2F0aW9uIGNvbnRhaW5pbmcKKyAqIHRoaXMgc2VydmxldCBpdHNlbGYgd2lsbCBub3Qgc3VjY2VlZC4gIFRoZXJlZm9yZSwgdGhpcyBzZXJ2bGV0IHNob3VsZAorICogZ2VuZXJhbGx5IGJlIGRlcGxveWVkIGFzIGEgc2VwYXJhdGUgd2ViIGFwcGxpY2F0aW9uIHdpdGhpbiB0aGUgdmlydHVhbCBob3N0CisgKiB0byBiZSBtYW5hZ2VkLgorICogPHA+CisgKiA8Yj5OT1RFPC9iPiAtIEZvciBzZWN1cml0eSByZWFzb25zLCB0aGlzIGFwcGxpY2F0aW9uIHdpbGwgbm90IG9wZXJhdGUKKyAqIHdoZW4gYWNjZXNzZWQgdmlhIHRoZSBpbnZva2VyIHNlcnZsZXQuICBZb3UgbXVzdCBleHBsaWNpdGx5IG1hcCB0aGlzIHNlcnZsZXQKKyAqIHdpdGggYSBzZXJ2bGV0IG1hcHBpbmcsIGFuZCB5b3Ugd2lsbCBhbHdheXMgd2FudCB0byBwcm90ZWN0IGl0IHdpdGgKKyAqIGFwcHJvcHJpYXRlIHNlY3VyaXR5IGNvbnN0cmFpbnRzIGFzIHdlbGwuCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgc2VydmxldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGFyZSByZWNvZ25pemVkOgorICogPHVsPgorICogPGxpPjxiPmRlYnVnPC9iPiAtIFRoZSBkZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIHRoYXQgY29udHJvbHMgdGhlIGFtb3VudAorICogICAgIG9mIGluZm9ybWF0aW9uIHRoYXQgaXMgbG9nZ2VkIGJ5IHRoaXMgc2VydmxldC4gIERlZmF1bHQgaXMgemVyby4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBNYW5hZ2VyU2VydmxldAorICAgIGV4dGVuZHMgSHR0cFNlcnZsZXQgaW1wbGVtZW50cyBDb250YWluZXJTZXJ2bGV0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFBhdGggd2hlcmUgY29udGV4dCBkZXNjcmlwdG9ycyBzaG91bGQgYmUgZGVwbG95ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgY29uZmlnQmFzZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250ZXh0IGNvbnRhaW5lciBhc3NvY2lhdGVkIHdpdGggb3VyIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGRlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgZm9yIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGRlYnVnID0gMTsKKworCisgICAgLyoqCisgICAgICogRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgZGVwbG95KCkgY29tbWFuZAorICAgICAqIHdpbGwgc3RvcmUgdGhlIFdBUiBhbmQgY29udGV4dCBjb25maWd1cmF0aW9uIGZpbGVzIHRoYXQgaGF2ZSBiZWVuCisgICAgICogdXBsb2FkZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgZGVwbG95ZWQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBQYXRoIHVzZWQgdG8gc3RvcmUgcmV2aXNpb25zIG9mIHdlYmFwcHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgdmVyc2lvbmVkID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogUGF0aCB1c2VkIHRvIHN0b3JlIGNvbnRleHQgZGVzY3JpcHRvcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgY29udGV4dERlc2NyaXB0b3JzID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGFzc29jaWF0ZWQgaG9zdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSG9zdCBob3N0ID0gbnVsbDsKKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBob3N0IGFwcEJhc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgYXBwQmFzZSA9IG51bGw7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogTUJlYW4gc2VydmVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBNQmVhblNlcnZlciBtQmVhblNlcnZlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhc3NvY2lhdGVkIGRlcGxveWVyIE9iamVjdE5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdE5hbWUgb25hbWUgPSBudWxsOworICAgIAorCisgICAgLyoqCisgICAgICogVGhlIGdsb2JhbCBKTkRJIDxjb2RlPk5hbWluZ0NvbnRleHQ8L2NvZGU+IGZvciB0aGlzIHNlcnZlciwKKyAgICAgKiBpZiBhdmFpbGFibGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGphdmF4Lm5hbWluZy5Db250ZXh0IGdsb2JhbCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBXcmFwcGVyIGNvbnRhaW5lciBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2bGV0LgorICAgICAqLworICAgIHByb3RlY3RlZCBXcmFwcGVyIHdyYXBwZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb250YWluZXJTZXJ2bGV0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBXcmFwcGVyIHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHVibGljIFdyYXBwZXIgZ2V0V3JhcHBlcigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMud3JhcHBlcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgV3JhcHBlciB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHdyYXBwZXIgVGhlIG5ldyB3cmFwcGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V3JhcHBlcihXcmFwcGVyIHdyYXBwZXIpIHsKKworICAgICAgICB0aGlzLndyYXBwZXIgPSB3cmFwcGVyOworICAgICAgICBpZiAod3JhcHBlciA9PSBudWxsKSB7CisgICAgICAgICAgICBjb250ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIGhvc3QgPSBudWxsOworICAgICAgICAgICAgb25hbWUgPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dCA9IChDb250ZXh0KSB3cmFwcGVyLmdldFBhcmVudCgpOworICAgICAgICAgICAgaG9zdCA9IChIb3N0KSBjb250ZXh0LmdldFBhcmVudCgpOworICAgICAgICAgICAgRW5naW5lIGVuZ2luZSA9IChFbmdpbmUpIGhvc3QuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoZW5naW5lLmdldE5hbWUoKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjp0eXBlPURlcGxveWVyLGhvc3Q9IiArIGhvc3QuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gPworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0cmlldmUgdGhlIE1CZWFuIHNlcnZlcgorICAgICAgICBtQmVhblNlcnZlciA9IFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLmdldE1CZWFuU2VydmVyKCk7CisgICAgICAgIAorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEZpbmFsaXplIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworCisgICAgICAgIDsgICAgICAgLy8gTm8gYWN0aW9ucyBuZWNlc3NhcnkKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIEdFVCByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQtc3BlY2lmaWVkIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgd2Ugd2VyZSBub3QgYWNjZXNzZWQgdXNpbmcgdGhlIGludm9rZXIgc2VydmxldAorICAgICAgICBpZiAocmVxdWVzdC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5JTlZPS0VEX0FUVFIpICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5hdmFpbGFibGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5jYW5ub3RJbnZva2UiKSk7CisKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3QgcGFyYW1ldGVycyB0aGF0IHdlIG5lZWQKKyAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSByZXF1ZXN0LmdldFBhdGhJbmZvKCk7CisgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpCisgICAgICAgICAgICBjb21tYW5kID0gcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpOworICAgICAgICBTdHJpbmcgY29uZmlnID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImNvbmZpZyIpOworICAgICAgICBTdHJpbmcgcGF0aCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXRoIik7CisgICAgICAgIFN0cmluZyB0eXBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInR5cGUiKTsKKyAgICAgICAgU3RyaW5nIHdhciA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ3YXIiKTsKKyAgICAgICAgU3RyaW5nIHRhZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ0YWciKTsKKyAgICAgICAgYm9vbGVhbiB1cGRhdGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKChyZXF1ZXN0LmdldFBhcmFtZXRlcigidXBkYXRlIikgIT0gbnVsbCkgCisgICAgICAgICAgICAmJiAocmVxdWVzdC5nZXRQYXJhbWV0ZXIoInVwZGF0ZSIpLmVxdWFscygidHJ1ZSIpKSkgeworICAgICAgICAgICAgdXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByZXBhcmUgb3VyIG91dHB1dCB3cml0ZXIgdG8gZ2VuZXJhdGUgdGhlIHJlc3BvbnNlIG1lc3NhZ2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW47IGNoYXJzZXQ9IiArIENvbnN0YW50cy5DSEFSU0VUKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgcmVxdWVzdGVkIGNvbW1hbmQgKG5vdGUgLSAiL2RlcGxveSIgaXMgbm90IGxpc3RlZCBoZXJlKQorICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0Lm5vQ29tbWFuZCIpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL2RlcGxveSIpKSB7CisgICAgICAgICAgICBpZiAod2FyICE9IG51bGwgfHwgY29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXBsb3kod3JpdGVyLCBjb25maWcsIHBhdGgsIHdhciwgdXBkYXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVwbG95KHdyaXRlciwgcGF0aCwgdGFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL2luc3RhbGwiKSkgeworICAgICAgICAgICAgLy8gRGVwcmVjYXRlZAorICAgICAgICAgICAgZGVwbG95KHdyaXRlciwgY29uZmlnLCBwYXRoLCB3YXIsIGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL2xpc3QiKSkgeworICAgICAgICAgICAgbGlzdCh3cml0ZXIpOworICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCIvcmVsb2FkIikpIHsKKyAgICAgICAgICAgIHJlbG9hZCh3cml0ZXIsIHBhdGgpOworICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCIvcmVtb3ZlIikpIHsKKyAgICAgICAgICAgIC8vIERlcHJlY2F0ZWQKKyAgICAgICAgICAgIHVuZGVwbG95KHdyaXRlciwgcGF0aCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi9yZXNvdXJjZXMiKSkgeworICAgICAgICAgICAgcmVzb3VyY2VzKHdyaXRlciwgdHlwZSk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi9yb2xlcyIpKSB7CisgICAgICAgICAgICByb2xlcyh3cml0ZXIpOworICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCIvc2F2ZSIpKSB7CisgICAgICAgICAgICBzYXZlKHdyaXRlciwgcGF0aCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi9zZXJ2ZXJpbmZvIikpIHsKKyAgICAgICAgICAgIHNlcnZlcmluZm8od3JpdGVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL3Nlc3Npb25zIikpIHsKKyAgICAgICAgICAgIHNlc3Npb25zKHdyaXRlciwgcGF0aCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi9zdGFydCIpKSB7CisgICAgICAgICAgICBzdGFydCh3cml0ZXIsIHBhdGgpOworICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCIvc3RvcCIpKSB7CisgICAgICAgICAgICBzdG9wKHdyaXRlciwgcGF0aCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi91bmRlcGxveSIpKSB7CisgICAgICAgICAgICB1bmRlcGxveSh3cml0ZXIsIHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC51bmtub3duQ29tbWFuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluaXNoIHVwIHRoZSByZXNwb25zZQorICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBQVVQgcmVxdWVzdCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmllZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb1B1dChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIHdlcmUgbm90IGFjY2Vzc2VkIHVzaW5nIHRoZSBpbnZva2VyIHNlcnZsZXQKKyAgICAgICAgaWYgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKEdsb2JhbHMuSU5WT0tFRF9BVFRSKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuYXZhaWxhYmxlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuY2Fubm90SW52b2tlIikpOworCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMgdGhhdCB3ZSBuZWVkCisgICAgICAgIFN0cmluZyBjb21tYW5kID0gcmVxdWVzdC5nZXRQYXRoSW5mbygpOworICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKQorICAgICAgICAgICAgY29tbWFuZCA9IHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBTdHJpbmcgdGFnID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInRhZyIpOworICAgICAgICBib29sZWFuIHVwZGF0ZSA9IGZhbHNlOworICAgICAgICBpZiAoKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ1cGRhdGUiKSAhPSBudWxsKSAKKyAgICAgICAgICAgICYmIChyZXF1ZXN0LmdldFBhcmFtZXRlcigidXBkYXRlIikuZXF1YWxzKCJ0cnVlIikpKSB7CisgICAgICAgICAgICB1cGRhdGUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJlcGFyZSBvdXIgb3V0cHV0IHdyaXRlciB0byBnZW5lcmF0ZSB0aGUgcmVzcG9uc2UgbWVzc2FnZQorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbjtjaGFyc2V0PSIrQ29uc3RhbnRzLkNIQVJTRVQpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBQcm9jZXNzIHRoZSByZXF1ZXN0ZWQgY29tbWFuZAorICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0Lm5vQ29tbWFuZCIpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL2RlcGxveSIpKSB7CisgICAgICAgICAgICBkZXBsb3kod3JpdGVyLCBwYXRoLCB0YWcsIHVwZGF0ZSwgcmVxdWVzdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnVua25vd25Db21tYW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5pc2ggdXAgdGhlIHJlc3BvbnNlCisgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBFbnN1cmUgdGhhdCBvdXIgQ29udGFpbmVyU2VydmxldCBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzZXQKKyAgICAgICAgaWYgKCh3cmFwcGVyID09IG51bGwpIHx8IChjb250ZXh0ID09IG51bGwpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuYXZhaWxhYmxlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQubm9XcmFwcGVyIikpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIHdlcmUgbm90IGFjY2Vzc2VkIHVzaW5nIHRoZSBpbnZva2VyIHNlcnZsZXQKKyAgICAgICAgU3RyaW5nIHNlcnZsZXROYW1lID0gZ2V0U2VydmxldENvbmZpZygpLmdldFNlcnZsZXROYW1lKCk7CisgICAgICAgIGlmIChzZXJ2bGV0TmFtZSA9PSBudWxsKQorICAgICAgICAgICAgc2VydmxldE5hbWUgPSAiIjsKKyAgICAgICAgaWYgKHNlcnZsZXROYW1lLnN0YXJ0c1dpdGgoIm9yZy5hcGFjaGUuY2F0YWxpbmEuSU5WT0tFUi4iKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbmF2YWlsYWJsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmNhbm5vdEludm9rZSIpKTsKKworICAgICAgICAvLyBTZXQgb3VyIHByb3BlcnRpZXMgZnJvbSB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycworICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsdWUgPSBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0SW5pdFBhcmFtZXRlcigiZGVidWciKTsKKyAgICAgICAgICAgIGRlYnVnID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKworICAgICAgICAvLyBBY3F1aXJlIGdsb2JhbCBKTkRJIHJlc291cmNlcyBpZiBhdmFpbGFibGUKKyAgICAgICAgU2VydmVyIHNlcnZlciA9IFNlcnZlckZhY3RvcnkuZ2V0U2VydmVyKCk7CisgICAgICAgIGlmICgoc2VydmVyICE9IG51bGwpICYmIChzZXJ2ZXIgaW5zdGFuY2VvZiBTdGFuZGFyZFNlcnZlcikpIHsKKyAgICAgICAgICAgIGdsb2JhbCA9ICgoU3RhbmRhcmRTZXJ2ZXIpIHNlcnZlcikuZ2V0R2xvYmFsTmFtaW5nQ29udGV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB3ZSB3aWxsIGJlIGRlcGxveWluZyBhcHBsaWNhdGlvbnMKKyAgICAgICAgdmVyc2lvbmVkID0gKEZpbGUpIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAoImphdmF4LnNlcnZsZXQuY29udGV4dC50ZW1wZGlyIik7CisKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIGFwcEJhc2Ugb2YgdGhlIG93bmluZyBIb3N0IG9mIHRoaXMgQ29udGV4dAorICAgICAgICAvLyAoaWYgYW55KQorICAgICAgICBTdHJpbmcgYXBwQmFzZSA9ICgoSG9zdCkgY29udGV4dC5nZXRQYXJlbnQoKSkuZ2V0QXBwQmFzZSgpOworICAgICAgICBkZXBsb3llZCA9IG5ldyBGaWxlKGFwcEJhc2UpOworICAgICAgICBpZiAoIWRlcGxveWVkLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgZGVwbG95ZWQgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwQmFzZSk7CisgICAgICAgIH0KKyAgICAgICAgY29uZmlnQmFzZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLCAiY29uZiIpOworICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gY29udGV4dDsKKyAgICAgICAgQ29udGFpbmVyIGhvc3QgPSBudWxsOworICAgICAgICBDb250YWluZXIgZW5naW5lID0gbnVsbDsKKyAgICAgICAgd2hpbGUgKGNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSG9zdCkKKyAgICAgICAgICAgICAgICBob3N0ID0gY29udGFpbmVyOworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEVuZ2luZSkKKyAgICAgICAgICAgICAgICBlbmdpbmUgPSBjb250YWluZXI7CisgICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuZ2luZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb25maWdCYXNlID0gbmV3IEZpbGUoY29uZmlnQmFzZSwgZW5naW5lLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgY29uZmlnQmFzZSA9IG5ldyBGaWxlKGNvbmZpZ0Jhc2UsIGhvc3QuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOb3RlOiBUaGUgZGlyZWN0b3J5IG11c3QgZXhpc3QgZm9yIHRoaXMgdG8gd29yay4KKworICAgICAgICAvLyBMb2cgZGVidWdnaW5nIG1lc3NhZ2VzIGFzIG5lY2Vzc2FyeQorICAgICAgICBpZiAoZGVidWcgPj0gMSkgeworICAgICAgICAgICAgbG9nKCJpbml0OiBBc3NvY2lhdGVkIHdpdGggRGVwbG95ZXIgJyIgKworICAgICAgICAgICAgICAgIG9uYW1lICsgIiciKTsKKyAgICAgICAgICAgIGlmIChnbG9iYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZygiaW5pdDogR2xvYmFsIHJlc291cmNlcyBhcmUgYXZhaWxhYmxlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogU3RvcmUgc2VydmVyIGNvbmZpZ3VyYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIHBhdGggT3B0aW9uYWwgY29udGV4dCBwYXRoIHRvIHNhdmUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2F2ZShQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgU2VydmVyIHNlcnZlciA9IFNlcnZlckZhY3RvcnkuZ2V0U2VydmVyKCk7CisKKyAgICAgICAgaWYgKCEoc2VydmVyIGluc3RhbmNlb2YgU3RhbmRhcmRTZXJ2ZXIpKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnNhdmVGYWlsIiwgc2VydmVyKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBhdGggPT0gbnVsbCkgfHwgcGF0aC5sZW5ndGgoKSA9PSAwIHx8ICFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKFN0YW5kYXJkU2VydmVyKSBzZXJ2ZXIpLnN0b3JlQ29uZmlnKCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5zYXZlZCIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nKCJtYW5hZ2VyU2VydmxldC5zdG9yZUNvbmZpZyIsIGUpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRQYXRoID0gcGF0aDsKKyAgICAgICAgICAgIGlmIChwYXRoLmVxdWFscygiLyIpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dFBhdGggPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChjb250ZXh0UGF0aCk7CisgICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5ub0NvbnRleHQiLCBwYXRoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKFN0YW5kYXJkU2VydmVyKSBzZXJ2ZXIpLnN0b3JlQ29udGV4dChjb250ZXh0KTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnNhdmVkQ29udGV4dCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nKCJtYW5hZ2VyU2VydmxldC5zYXZlWyIgKyBwYXRoICsgIl0iLCBlKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXBsb3kgYSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSAoaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgcmVxdWVzdCkKKyAgICAgKiBhdCB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cml0ZXIgV3JpdGVyIHRvIHJlbmRlciByZXN1bHRzIHRvCisgICAgICogQHBhcmFtIHBhdGggQ29udGV4dCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSBpbnN0YWxsZWQKKyAgICAgKiBAcGFyYW0gdGFnIFRhZyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmFwcAorICAgICAqIEBwYXJhbSByZXF1ZXN0IFNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkZXBsb3kKKyAgICAgICAgKFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIHBhdGgsCisgICAgICAgICBTdHJpbmcgdGFnLCBib29sZWFuIHVwZGF0ZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBpZiAoZGVidWcgPj0gMSkgeworICAgICAgICAgICAgbG9nKCJkZXBsb3k6IERlcGxveWluZyB3ZWIgYXBwbGljYXRpb24gYXQgJyIgKyBwYXRoICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXF1ZXN0ZWQgY29udGV4dCBwYXRoCisgICAgICAgIGlmICgocGF0aCA9PSBudWxsKSB8fCBwYXRoLmxlbmd0aCgpID09IDAgfHwgIXBhdGguc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmludmFsaWRQYXRoIiwgcGF0aCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkaXNwbGF5UGF0aCA9IHBhdGg7CisgICAgICAgIGlmKCBwYXRoLmVxdWFscygiLyIpICkKKyAgICAgICAgICAgIHBhdGggPSAiIjsKKyAgICAgICAgU3RyaW5nIGJhc2VuYW1lID0gZ2V0RG9jQmFzZShwYXRoKTsKKworICAgICAgICAvLyBDaGVjayBpZiBhcHAgYWxyZWFkeSBleGlzdHMsIG9yIHVuZGVwbG95IGl0IGlmIHVwZGF0aW5nCisgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChwYXRoKTsKKyAgICAgICAgaWYgKHVwZGF0ZSkgeworICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVuZGVwbG95KHdyaXRlciwgZGlzcGxheVBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmFscmVhZHlDb250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlQYXRoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGJhc2UgcGF0aAorICAgICAgICBGaWxlIGRlcGxveWVkUGF0aCA9IGRlcGxveWVkOworICAgICAgICBpZiAodGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRlcGxveWVkUGF0aCA9IG5ldyBGaWxlKHZlcnNpb25lZCwgdGFnKTsKKyAgICAgICAgICAgIGRlcGxveWVkUGF0aC5ta2RpcnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVwbG9hZCB0aGUgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgdG8gYSBsb2NhbCBXQVIgZmlsZQorICAgICAgICBGaWxlIGxvY2FsV2FyID0gbmV3IEZpbGUoZGVwbG95ZWRQYXRoLCBiYXNlbmFtZSArICIud2FyIik7CisgICAgICAgIGlmIChkZWJ1ZyA+PSAyKSB7CisgICAgICAgICAgICBsb2coIlVwbG9hZGluZyBXQVIgZmlsZSB0byAiICsgbG9jYWxXYXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBXQVIgdG8gYXBwQmFzZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VkKHBhdGgpKSB7CisgICAgICAgICAgICAgICAgYWRkU2VydmljZWQocGF0aCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBsb2FkIFdBUgorICAgICAgICAgICAgICAgICAgICB1cGxvYWRXYXIocmVxdWVzdCwgbG9jYWxXYXIpOworICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IFdBUiBhbmQgWE1MIHRvIHRoZSBob3N0IGFwcCBiYXNlIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveWVkUGF0aCA9IGRlcGxveWVkOworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBsb2NhbFdhckNvcHkgPSBuZXcgRmlsZShkZXBsb3llZFBhdGgsIGJhc2VuYW1lICsgIi53YXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkobG9jYWxXYXIsIGxvY2FsV2FyQ29weSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFdhciA9IGxvY2FsV2FyQ29weTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkobG9jYWxXYXIsIG5ldyBGaWxlKGdldEFwcEJhc2UoKSwgYmFzZW5hbWUgKyAiLndhciIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBQZXJmb3JtIG5ldyBkZXBsb3ltZW50CisgICAgICAgICAgICAgICAgICAgIGNoZWNrKHBhdGgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNlcnZpY2VkKHBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygibWFuYWdlclNlcnZsZXQuY2hlY2tbIiArIGRpc3BsYXlQYXRoICsgIl0iLCBlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChwYXRoKTsKKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCAmJiBjb250ZXh0LmdldENvbmZpZ3VyZWQoKSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5kZXBsb3llZCIsIGRpc3BsYXlQYXRoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTb21ldGhpbmcgZmFpbGVkCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmRlcGxveUZhaWxlZCIsIGRpc3BsYXlQYXRoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbnN0YWxsIGFuIGFwcGxpY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHBhdGggZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFdyaXRlciB0byByZW5kZXIgcmVzdWx0cyB0bworICAgICAqIEBwYXJhbSB0YWcgUmV2aXNpb24gdGFnIHRvIGRlcGxveSBmcm9tCisgICAgICogQHBhcmFtIHBhdGggQ29udGV4dCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSBpbnN0YWxsZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXBsb3koUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcGF0aCwgU3RyaW5nIHRhZykgeworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXF1ZXN0ZWQgY29udGV4dCBwYXRoCisgICAgICAgIGlmICgocGF0aCA9PSBudWxsKSB8fCBwYXRoLmxlbmd0aCgpID09IDAgfHwgIXBhdGguc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmludmFsaWRQYXRoIiwgcGF0aCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkaXNwbGF5UGF0aCA9IHBhdGg7CisgICAgICAgIGlmKCBwYXRoLmVxdWFscygiLyIpICkKKyAgICAgICAgICAgIHBhdGggPSAiIjsKKworICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGJhc2UgcGF0aAorICAgICAgICBGaWxlIGRlcGxveWVkUGF0aCA9IHZlcnNpb25lZDsKKyAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICBkZXBsb3llZFBhdGggPSBuZXcgRmlsZShkZXBsb3llZFBhdGgsIHRhZyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5kIHRoZSBsb2NhbCBXQVIgZmlsZQorICAgICAgICBGaWxlIGxvY2FsV2FyID0gbmV3IEZpbGUoZGVwbG95ZWRQYXRoLCBnZXREb2NCYXNlKHBhdGgpICsgIi53YXIiKTsKKyAgICAgICAgLy8gRmluZCB0aGUgbG9jYWwgY29udGV4dCBkZXBsb3ltZW50IGZpbGUgKGlmIGFueSkKKyAgICAgICAgRmlsZSBsb2NhbFhtbCA9IG5ldyBGaWxlKGNvbmZpZ0Jhc2UsIGdldENvbmZpZ0ZpbGUocGF0aCkgKyAiLnhtbCIpOworCisgICAgICAgIC8vIENoZWNrIGlmIGFwcCBhbHJlYWR5IGV4aXN0cywgb3IgdW5kZXBsb3kgaXQgaWYgdXBkYXRpbmcKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGhvc3QuZmluZENoaWxkKHBhdGgpOworICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICB1bmRlcGxveSh3cml0ZXIsIGRpc3BsYXlQYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgV0FSIHRvIGFwcEJhc2UKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghaXNTZXJ2aWNlZChwYXRoKSkgeworICAgICAgICAgICAgICAgIGFkZFNlcnZpY2VkKHBhdGgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvcHkobG9jYWxXYXIsIG5ldyBGaWxlKGdldEFwcEJhc2UoKSwgZ2V0RG9jQmFzZShwYXRoKSArICIud2FyIikpOworICAgICAgICAgICAgICAgICAgICAvLyBQZXJmb3JtIG5ldyBkZXBsb3ltZW50CisgICAgICAgICAgICAgICAgICAgIGNoZWNrKHBhdGgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNlcnZpY2VkKHBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygibWFuYWdlclNlcnZsZXQuY2hlY2tbIiArIGRpc3BsYXlQYXRoICsgIl0iLCBlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChwYXRoKTsKKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCAmJiBjb250ZXh0LmdldENvbmZpZ3VyZWQoKSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5kZXBsb3llZCIsIGRpc3BsYXlQYXRoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTb21ldGhpbmcgZmFpbGVkCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmRlcGxveUZhaWxlZCIsIGRpc3BsYXlQYXRoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbnN0YWxsIGFuIGFwcGxpY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHBhdGggZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFdyaXRlciB0byByZW5kZXIgcmVzdWx0cyB0bworICAgICAqIEBwYXJhbSBjb25maWcgVVJMIG9mIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZSB0byBiZSBpbnN0YWxsZWQKKyAgICAgKiBAcGFyYW0gcGF0aCBDb250ZXh0IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIGluc3RhbGxlZAorICAgICAqIEBwYXJhbSB3YXIgVVJMIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSB0byBiZSBpbnN0YWxsZWQKKyAgICAgKiBAcGFyYW0gdXBkYXRlIHRydWUgdG8gb3ZlcnJpZGUgYW55IGV4aXN0aW5nIHdlYmFwcCBvbiB0aGUgcGF0aAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlcGxveShQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyBjb25maWcsCisgICAgICAgICAgICBTdHJpbmcgcGF0aCwgU3RyaW5nIHdhciwgYm9vbGVhbiB1cGRhdGUpIHsKKyAgICAgICAgCisgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCAmJiBjb25maWcubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgY29uZmlnID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAod2FyICE9IG51bGwgJiYgd2FyLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHdhciA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChkZWJ1ZyA+PSAxKSB7CisgICAgICAgICAgICBpZiAoY29uZmlnICE9IG51bGwgJiYgY29uZmlnLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGlmICh3YXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsb2coImluc3RhbGw6IEluc3RhbGxpbmcgY29udGV4dCBjb25maWd1cmF0aW9uIGF0ICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgKyAiJyBmcm9tICciICsgd2FyICsgIiciKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2coImluc3RhbGw6IEluc3RhbGxpbmcgY29udGV4dCBjb25maWd1cmF0aW9uIGF0ICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgKyAiJyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBsb2coImluc3RhbGw6IEluc3RhbGxpbmcgd2ViIGFwcGxpY2F0aW9uIGF0ICciICsgcGF0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgZnJvbSAnIiArIHdhciArICInIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJpbnN0YWxsOiBJbnN0YWxsaW5nIHdlYiBhcHBsaWNhdGlvbiBmcm9tICciICsgd2FyICsgIiciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aC5sZW5ndGgoKSA9PSAwIHx8ICFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5pbnZhbGlkUGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdFV0aWwuZmlsdGVyKHBhdGgpKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRpc3BsYXlQYXRoID0gcGF0aDsKKyAgICAgICAgaWYoIi8iLmVxdWFscyhwYXRoKSkgeworICAgICAgICAgICAgcGF0aCA9ICIiOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayBpZiBhcHAgYWxyZWFkeSBleGlzdHMsIG9yIHVuZGVwbG95IGl0IGlmIHVwZGF0aW5nCisgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChwYXRoKTsKKyAgICAgICAgaWYgKHVwZGF0ZSkgeworICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVuZGVwbG95KHdyaXRlciwgZGlzcGxheVBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbgorICAgICAgICAgICAgKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuYWxyZWFkeUNvbnRleHQiLAorICAgICAgICAgICAgICAgICAgICBkaXNwbGF5UGF0aCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoY29uZmlnICE9IG51bGwgJiYgKGNvbmZpZy5zdGFydHNXaXRoKCJmaWxlOiIpKSkgeworICAgICAgICAgICAgY29uZmlnID0gY29uZmlnLnN1YnN0cmluZygiZmlsZToiLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2FyICE9IG51bGwgJiYgKHdhci5zdGFydHNXaXRoKCJmaWxlOiIpKSkgeworICAgICAgICAgICAgd2FyID0gd2FyLnN1YnN0cmluZygiZmlsZToiLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghaXNTZXJ2aWNlZChwYXRoKSkgeworICAgICAgICAgICAgICAgIGFkZFNlcnZpY2VkKHBhdGgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQmFzZS5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkobmV3IEZpbGUoY29uZmlnKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGNvbmZpZ0Jhc2UsIGdldENvbmZpZ0ZpbGUocGF0aCkgKyAiLnhtbCIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAod2FyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YXIuZW5kc1dpdGgoIi53YXIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkobmV3IEZpbGUod2FyKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShnZXRBcHBCYXNlKCksIGdldERvY0Jhc2UocGF0aCkgKyAiLndhciIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weShuZXcgRmlsZSh3YXIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGdldEFwcEJhc2UoKSwgZ2V0RG9jQmFzZShwYXRoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFBlcmZvcm0gbmV3IGRlcGxveW1lbnQKKyAgICAgICAgICAgICAgICAgICAgY2hlY2socGF0aCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU2VydmljZWQocGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChwYXRoKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwgJiYgY29udGV4dC5nZXRDb25maWd1cmVkKCkpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmRlcGxveWVkIiwgZGlzcGxheVBhdGgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU29tZXRoaW5nIGZhaWxlZAorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuZGVwbG95RmFpbGVkIiwgZGlzcGxheVBhdGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZygiTWFuYWdlclNlcnZsZXQuaW5zdGFsbFsiICsgZGlzcGxheVBhdGggKyAiXSIsIHQpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5leGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICB0LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbmRlciBhIGxpc3Qgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgQ29udGV4dHMgaW4gb3VyIHZpcnR1YWwgaG9zdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cml0ZXIgV3JpdGVyIHRvIHJlbmRlciB0bworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGxpc3QoUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisKKyAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICBsb2coImxpc3Q6IExpc3RpbmcgY29udGV4dHMgZm9yIHZpcnR1YWwgaG9zdCAnIiArCisgICAgICAgICAgICAgICAgaG9zdC5nZXROYW1lKCkgKyAiJyIpOworCisgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQubGlzdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QuZ2V0TmFtZSgpKSk7CisgICAgICAgIENvbnRhaW5lcltdIGNvbnRleHRzID0gaG9zdC5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGNvbnRleHRzW2ldOworICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlQYXRoID0gY29udGV4dC5nZXRQYXRoKCk7CisgICAgICAgICAgICBpZiggZGlzcGxheVBhdGguZXF1YWxzKCIiKSApCisgICAgICAgICAgICAgICAgZGlzcGxheVBhdGggPSAiLyI7CisgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsICkgeworICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmdldEF2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQubGlzdGl0ZW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVubmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiICsgY29udGV4dC5nZXRNYW5hZ2VyKCkuZmluZFNlc3Npb25zKCkubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXREb2NCYXNlKCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0Lmxpc3RpdGVtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0b3BwZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXREb2NCYXNlKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbG9hZCB0aGUgd2ViIGFwcGxpY2F0aW9uIGF0IHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlciBXcml0ZXIgdG8gcmVuZGVyIHRvCisgICAgICogQHBhcmFtIHBhdGggQ29udGV4dCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSByZXN0YXJ0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWxvYWQoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcGF0aCkgeworCisgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgbG9nKCJyZXN0YXJ0OiBSZWxvYWRpbmcgd2ViIGFwcGxpY2F0aW9uIGF0ICciICsgcGF0aCArICInIik7CisKKyAgICAgICAgaWYgKChwYXRoID09IG51bGwpIHx8ICghcGF0aC5zdGFydHNXaXRoKCIvIikgJiYgcGF0aC5lcXVhbHMoIiIpKSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5pbnZhbGlkUGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdFV0aWwuZmlsdGVyKHBhdGgpKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRpc3BsYXlQYXRoID0gcGF0aDsKKyAgICAgICAgaWYoIHBhdGguZXF1YWxzKCIvIikgKQorICAgICAgICAgICAgcGF0aCA9ICIiOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgaG9zdC5maW5kQ2hpbGQocGF0aCk7CisgICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJtYW5hZ2VyU2VydmxldC5ub0NvbnRleHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0VXRpbC5maWx0ZXIoZGlzcGxheVBhdGgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSXQgaXNuJ3QgcG9zc2libGUgZm9yIHRoZSBtYW5hZ2VyIHRvIHJlbG9hZCBpdHNlbGYKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmdldFBhdGgoKS5lcXVhbHModGhpcy5jb250ZXh0LmdldFBhdGgoKSkpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0Lm5vU2VsZiIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250ZXh0LnJlbG9hZCgpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5yZWxvYWRlZCIsIGRpc3BsYXlQYXRoKSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIk1hbmFnZXJTZXJ2bGV0LnJlbG9hZFsiICsgZGlzcGxheVBhdGggKyAiXSIsIHQpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5leGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudG9TdHJpbmcoKSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbmRlciBhIGxpc3Qgb2YgYXZhaWxhYmxlIGdsb2JhbCBKTkRJIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIEZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSByZXNvdXJjZSB0eXBlIG9mIGludGVyZXN0LAorICAgICAqICBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBsaXN0IHJlc291cmNlcyBvZiBhbGwgdHlwZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZXNvdXJjZXMoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgdHlwZSkgeworCisgICAgICAgIGlmIChkZWJ1ZyA+PSAxKSB7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nKCJyZXNvdXJjZXM6ICBMaXN0aW5nIHJlc291cmNlcyBvZiB0eXBlICIgKyB0eXBlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJyZXNvdXJjZXM6ICBMaXN0aW5nIHJlc291cmNlcyBvZiBhbGwgdHlwZXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElzIHRoZSBnbG9iYWwgSk5ESSByZXNvdXJjZXMgY29udGV4dCBhdmFpbGFibGU/CisgICAgICAgIGlmIChnbG9iYWwgPT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5ub0dsb2JhbCIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVudW1lcmF0ZSB0aGUgZ2xvYmFsIEpOREkgcmVzb3VyY2VzIG9mIHRoZSByZXF1ZXN0ZWQgdHlwZQorICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnJlc291cmNlc1R5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQucmVzb3VyY2VzQWxsIikpOworICAgICAgICB9CisKKyAgICAgICAgQ2xhc3MgY2xhenogPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSh0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZygiTWFuYWdlclNlcnZsZXQucmVzb3VyY2VzWyIgKyB0eXBlICsgIl0iLCB0KTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHByaW50UmVzb3VyY2VzKHdyaXRlciwgIiIsIGdsb2JhbCwgdHlwZSwgY2xhenopOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMaXN0IHRoZSByZXNvdXJjZXMgb2YgdGhlIGdpdmVuIGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRSZXNvdXJjZXMoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4Lm5hbWluZy5Db250ZXh0IG5hbWluZ0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUsIENsYXNzIGNsYXp6KSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE5hbWluZ0VudW1lcmF0aW9uIGl0ZW1zID0gbmFtaW5nQ29udGV4dC5saXN0QmluZGluZ3MoIiIpOworICAgICAgICAgICAgd2hpbGUgKGl0ZW1zLmhhc01vcmUoKSkgeworICAgICAgICAgICAgICAgIEJpbmRpbmcgaXRlbSA9IChCaW5kaW5nKSBpdGVtcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBqYXZheC5uYW1pbmcuQ29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICBwcmludFJlc291cmNlcworICAgICAgICAgICAgICAgICAgICAgICAgKHdyaXRlciwgcHJlZml4ICsgaXRlbS5nZXROYW1lKCkgKyAiLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmF4Lm5hbWluZy5Db250ZXh0KSBpdGVtLmdldE9iamVjdCgpLCB0eXBlLCBjbGF6eik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjbGF6eiAhPSBudWxsKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKCEoY2xhenouaXNJbnN0YW5jZShpdGVtLmdldE9iamVjdCgpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQocHJlZml4ICsgaXRlbS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoJzonKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KGl0ZW0uZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAvLyBEbyB3ZSB3YW50IGEgZGVzY3JpcHRpb24gaWYgYXZhaWxhYmxlPworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZygiTWFuYWdlclNlcnZsZXQucmVzb3VyY2VzWyIgKyB0eXBlICsgIl0iLCB0KTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMgKGFuZCBjb3JyZXNwb25kaW5nIGRlc2NyaXB0aW9ucykKKyAgICAgKiBmcm9tIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZTwvY29kZT4gcmVzb3VyY2UgdGhhdCBpcworICAgICAqIGNvbm5lY3RlZCB0byB0aGUgPGNvZGU+dXNlcnM8L2NvZGU+IHJlc291cmNlIHJlZmVyZW5jZS4gIFR5cGljYWxseSwgdGhpcworICAgICAqIHdpbGwgYmUgdGhlIGdsb2JhbCB1c2VyIGRhdGFiYXNlLCBidXQgY2FuIGJlIGFkanVzdGVkIGlmIHlvdSBoYXZlCisgICAgICogZGlmZmVyZW50IHVzZXIgZGF0YWJhc2VzIGZvciBkaWZmZXJlbnQgdmlydHVhbCBob3N0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cml0ZXIgV3JpdGVyIHRvIHJlbmRlciB0bworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJvbGVzKFByaW50V3JpdGVyIHdyaXRlcikgeworCisgICAgICAgIGlmIChkZWJ1ZyA+PSAxKSB7CisgICAgICAgICAgICBsb2coInJvbGVzOiAgTGlzdCBzZWN1cml0eSByb2xlcyBmcm9tIHVzZXIgZGF0YWJhc2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvb2sgdXAgdGhlIFVzZXJEYXRhYmFzZSBpbnN0YW5jZSB3ZSBzaG91bGQgdXNlCisgICAgICAgIFVzZXJEYXRhYmFzZSBkYXRhYmFzZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbml0aWFsQ29udGV4dCBpYyA9IG5ldyBJbml0aWFsQ29udGV4dCgpOworICAgICAgICAgICAgZGF0YWJhc2UgPSAoVXNlckRhdGFiYXNlKSBpYy5sb29rdXAoImphdmE6Y29tcC9lbnYvdXNlcnMiKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQudXNlckRhdGFiYXNlRXJyb3IiKSk7CisgICAgICAgICAgICBsb2coImphdmE6Y29tcC9lbnYvdXNlcnMiLCBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC51c2VyRGF0YWJhc2VNaXNzaW5nIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gRW51bWVyYXRlIHRoZSBhdmFpbGFibGUgcm9sZXMKKyAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5yb2xlc0xpc3QiKSk7CisgICAgICAgIEl0ZXJhdG9yIHJvbGVzID0gZGF0YWJhc2UuZ2V0Um9sZXMoKTsKKyAgICAgICAgaWYgKHJvbGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdoaWxlIChyb2xlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBSb2xlIHJvbGUgPSAoUm9sZSkgcm9sZXMubmV4dCgpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChyb2xlLmdldFJvbGVuYW1lKCkpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgnOicpOworICAgICAgICAgICAgICAgIGlmIChyb2xlLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQocm9sZS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlcyBTeXN0ZW0gT1MgYW5kIEpWTSBwcm9wZXJ0aWVzLgorICAgICAqIEBwYXJhbSB3cml0ZXIgV3JpdGVyIHRvIHJlbmRlciB0bworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlcnZlcmluZm8oUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgbG9nKCJzZXJ2ZXJpbmZvIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgcHJvcHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBwcm9wcy5hcHBlbmQoIk9LIC0gU2VydmVyIGluZm8iKTsKKyAgICAgICAgICAgIHByb3BzLmFwcGVuZCgiXG5Ub21jYXQgVmVyc2lvbjogIik7CisgICAgICAgICAgICBwcm9wcy5hcHBlbmQoU2VydmVySW5mby5nZXRTZXJ2ZXJJbmZvKCkpOworICAgICAgICAgICAgcHJvcHMuYXBwZW5kKCJcbk9TIE5hbWU6ICIpOworICAgICAgICAgICAgcHJvcHMuYXBwZW5kKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpKTsKKyAgICAgICAgICAgIHByb3BzLmFwcGVuZCgiXG5PUyBWZXJzaW9uOiAiKTsKKyAgICAgICAgICAgIHByb3BzLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLnZlcnNpb24iKSk7CisgICAgICAgICAgICBwcm9wcy5hcHBlbmQoIlxuT1MgQXJjaGl0ZWN0dXJlOiAiKTsKKyAgICAgICAgICAgIHByb3BzLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLmFyY2giKSk7CisgICAgICAgICAgICBwcm9wcy5hcHBlbmQoIlxuSlZNIFZlcnNpb246ICIpOworICAgICAgICAgICAgcHJvcHMuYXBwZW5kKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ydW50aW1lLnZlcnNpb24iKSk7CisgICAgICAgICAgICBwcm9wcy5hcHBlbmQoIlxuSlZNIFZlbmRvcjogIik7CisgICAgICAgICAgICBwcm9wcy5hcHBlbmQoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZtLnZlbmRvciIpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHByb3BzLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5sb2coIk1hbmFnZXJTZXJ2bGV0LnNlcnZlcmluZm8iLHQpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5leGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudG9TdHJpbmcoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2Vzc2lvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aC4KKyAgICAgKiBEaXNwbGF5cyBhIHByb2ZpbGUgb2Ygc2Vzc2lvbiBNYXhJbmFjdGl2ZUludGVydmFsIHRpbWVvdXRzIGxpc3RpbmcgbnVtYmVyCisgICAgICogb2Ygc2Vzc2lvbnMgZm9yIGVhY2ggMTAgbWludXRlIHRpbWVvdXQgaW50ZXJ2YWwgdXAgdG8gMTAgaG91cnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFdyaXRlciB0byByZW5kZXIgdG8KKyAgICAgKiBAcGFyYW0gcGF0aCBDb250ZXh0IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGxpc3Qgc2Vzc2lvbiBpbmZvcm1hdGlvbiBmb3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXNzaW9ucyhQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICBsb2coInNlc3Npb25zOiBTZXNzaW9uIGluZm9ybWF0aW9uIGZvciB3ZWIgYXBwbGljYXRpb24gYXQgJyIgKyBwYXRoICsgIiciKTsKKworICAgICAgICBpZiAoKHBhdGggPT0gbnVsbCkgfHwgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSAmJiBwYXRoLmVxdWFscygiIikpKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmludmFsaWRQYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0VXRpbC5maWx0ZXIocGF0aCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZGlzcGxheVBhdGggPSBwYXRoOworICAgICAgICBpZiggcGF0aC5lcXVhbHMoIi8iKSApCisgICAgICAgICAgICBwYXRoID0gIiI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgaG9zdC5maW5kQ2hpbGQocGF0aCk7CisgICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5ub0NvbnRleHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0VXRpbC5maWx0ZXIoZGlzcGxheVBhdGgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5zZXNzaW9ucyIsIGRpc3BsYXlQYXRoKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnNlc3Npb25kZWZhdWx0bWF4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIgKyBjb250ZXh0LmdldE1hbmFnZXIoKS5nZXRNYXhJbmFjdGl2ZUludGVydmFsKCkvNjApKTsKKyAgICAgICAgICAgIFNlc3Npb24gW10gc2Vzc2lvbnMgPSBjb250ZXh0LmdldE1hbmFnZXIoKS5maW5kU2Vzc2lvbnMoKTsKKyAgICAgICAgICAgIGludCBbXSB0aW1lb3V0ID0gbmV3IGludFs2MF07CisgICAgICAgICAgICBpbnQgbm90aW1lb3V0ID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vzc2lvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgdGltZSA9IHNlc3Npb25zW2ldLmdldE1heEluYWN0aXZlSW50ZXJ2YWwoKS8oMTAqNjApOworICAgICAgICAgICAgICAgIGlmICh0aW1lIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgbm90aW1lb3V0Kys7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodGltZSA+PSB0aW1lb3V0Lmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgdGltZW91dFt0aW1lb3V0Lmxlbmd0aC0xXSsrOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGltZW91dFt0aW1lXSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRpbWVvdXRbMF0gPiAwKQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuc2Vzc2lvbnRpbWVvdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPDEwIiwgIiIgKyB0aW1lb3V0WzBdKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHRpbWVvdXQubGVuZ3RoLTE7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0W2ldID4gMCkKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5zZXNzaW9udGltZW91dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIgKyAoaSkqMTAgKyAiIC0gPCIgKyAoaSsxKSoxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiICsgdGltZW91dFtpXSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRpbWVvdXRbdGltZW91dC5sZW5ndGgtMV0gPiAwKQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuc2Vzc2lvbnRpbWVvdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0iICsgdGltZW91dC5sZW5ndGgqMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiICsgdGltZW91dFt0aW1lb3V0Lmxlbmd0aC0xXSkpOworICAgICAgICAgICAgaWYgKG5vdGltZW91dCA+IDApCisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5zZXNzaW9udGltZW91dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmxpbWl0ZWQiLCIiICsgbm90aW1lb3V0KSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIk1hbmFnZXJTZXJ2bGV0LnNlc3Npb25zWyIgKyBkaXNwbGF5UGF0aCArICJdIiwgdCk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC50b1N0cmluZygpKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RhcnQgdGhlIHdlYiBhcHBsaWNhdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cml0ZXIgV3JpdGVyIHRvIHJlbmRlciB0bworICAgICAqIEBwYXJhbSBwYXRoIENvbnRleHQgcGF0aCBvZiB0aGUgYXBwbGljYXRpb24gdG8gYmUgc3RhcnRlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0KFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgIGxvZygic3RhcnQ6IFN0YXJ0aW5nIHdlYiBhcHBsaWNhdGlvbiBhdCAnIiArIHBhdGggKyAiJyIpOworCisgICAgICAgIGlmICgocGF0aCA9PSBudWxsKSB8fCAoIXBhdGguc3RhcnRzV2l0aCgiLyIpICYmIHBhdGguZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuaW52YWxpZFBhdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RVdGlsLmZpbHRlcihwYXRoKSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkaXNwbGF5UGF0aCA9IHBhdGg7CisgICAgICAgIGlmKCBwYXRoLmVxdWFscygiLyIpICkKKyAgICAgICAgICAgIHBhdGggPSAiIjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGhvc3QuZmluZENoaWxkKHBhdGgpOworICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQubm9Db250ZXh0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RVdGlsLmZpbHRlcihkaXNwbGF5UGF0aCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKExpZmVjeWNsZSkgY29udGV4dCkuc3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmdldEF2YWlsYWJsZSgpKQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnN0YXJ0ZWQiLCBkaXNwbGF5UGF0aCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnN0YXJ0RmFpbGVkIiwgZGlzcGxheVBhdGgpKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkubG9nCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuc3RhcnRGYWlsZWQiLCBkaXNwbGF5UGF0aCksIHQpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5zdGFydEZhaWxlZCIsIGRpc3BsYXlQYXRoKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC50b1N0cmluZygpKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgd2ViIGFwcGxpY2F0aW9uIGF0IHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlciBXcml0ZXIgdG8gcmVuZGVyIHRvCisgICAgICogQHBhcmFtIHBhdGggQ29udGV4dCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSBzdG9wcGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3RvcChQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICBsb2coInN0b3A6IFN0b3BwaW5nIHdlYiBhcHBsaWNhdGlvbiBhdCAnIiArIHBhdGggKyAiJyIpOworCisgICAgICAgIGlmICgocGF0aCA9PSBudWxsKSB8fCAoIXBhdGguc3RhcnRzV2l0aCgiLyIpICYmIHBhdGguZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuaW52YWxpZFBhdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RVdGlsLmZpbHRlcihwYXRoKSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkaXNwbGF5UGF0aCA9IHBhdGg7CisgICAgICAgIGlmKCBwYXRoLmVxdWFscygiLyIpICkKKyAgICAgICAgICAgIHBhdGggPSAiIjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGhvc3QuZmluZENoaWxkKHBhdGgpOworICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQubm9Db250ZXh0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RVdGlsLmZpbHRlcihkaXNwbGF5UGF0aCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJdCBpc24ndCBwb3NzaWJsZSBmb3IgdGhlIG1hbmFnZXIgdG8gc3RvcCBpdHNlbGYKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmdldFBhdGgoKS5lcXVhbHModGhpcy5jb250ZXh0LmdldFBhdGgoKSkpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0Lm5vU2VsZiIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKExpZmVjeWNsZSkgY29udGV4dCkuc3RvcCgpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5zdG9wcGVkIiwgZGlzcGxheVBhdGgpKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZygiTWFuYWdlclNlcnZsZXQuc3RvcFsiICsgZGlzcGxheVBhdGggKyAiXSIsIHQpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5leGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudG9TdHJpbmcoKSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVuZGVwbG95IHRoZSB3ZWIgYXBwbGljYXRpb24gYXQgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFdyaXRlciB0byByZW5kZXIgdG8KKyAgICAgKiBAcGFyYW0gcGF0aCBDb250ZXh0IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB1bmRlcGxveShQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICBsb2coInVuZGVwbG95OiBVbmRlcGxveWluZyB3ZWIgYXBwbGljYXRpb24gYXQgJyIgKyBwYXRoICsgIiciKTsKKworICAgICAgICBpZiAoKHBhdGggPT0gbnVsbCkgfHwgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSAmJiBwYXRoLmVxdWFscygiIikpKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmludmFsaWRQYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0VXRpbC5maWx0ZXIocGF0aCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZGlzcGxheVBhdGggPSBwYXRoOworICAgICAgICBpZiggcGF0aC5lcXVhbHMoIi8iKSApCisgICAgICAgICAgICBwYXRoID0gIiI7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhlIENvbnRleHQgb2YgdGhlIHNwZWNpZmllZCBhcHBsaWNhdGlvbgorICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGhvc3QuZmluZENoaWxkKHBhdGgpOworICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQubm9Db250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdFV0aWwuZmlsdGVyKGRpc3BsYXlQYXRoKSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWRlbnRpZnkgdGhlIGFwcEJhc2Ugb2YgdGhlIG93bmluZyBIb3N0IG9mIHRoaXMgQ29udGV4dCAoaWYgYW55KQorICAgICAgICAgICAgU3RyaW5nIGFwcEJhc2UgPSBudWxsOworICAgICAgICAgICAgRmlsZSBhcHBCYXNlRGlyID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmdldFBhcmVudCgpIGluc3RhbmNlb2YgSG9zdCkgeworICAgICAgICAgICAgICAgIGFwcEJhc2UgPSAoKEhvc3QpIGNvbnRleHQuZ2V0UGFyZW50KCkpLmdldEFwcEJhc2UoKTsKKyAgICAgICAgICAgICAgICBhcHBCYXNlRGlyID0gbmV3IEZpbGUoYXBwQmFzZSk7CisgICAgICAgICAgICAgICAgaWYgKCFhcHBCYXNlRGlyLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgICAgICBhcHBCYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBCYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghaXNEZXBsb3llZChwYXRoKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQubm90RGVwbG95ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdFV0aWwuZmlsdGVyKGRpc3BsYXlQYXRoKSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VkKHBhdGgpKSB7CisgICAgICAgICAgICAgICAgYWRkU2VydmljZWQocGF0aCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIHN0b3AgdGhlIGNvbnRleHQgZmlyc3QgdG8gYmUgbmljZXIKKyAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNvbnRleHQpLnN0b3AoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSB3YXIgPSBuZXcgRmlsZShnZXRBcHBCYXNlKCksIGdldERvY0Jhc2UocGF0aCkgKyAiLndhciIpOworICAgICAgICAgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKGdldEFwcEJhc2UoKSwgZ2V0RG9jQmFzZShwYXRoKSk7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgeG1sID0gbmV3IEZpbGUoY29uZmlnQmFzZSwgZ2V0Q29uZmlnRmlsZShwYXRoKSArICIueG1sIik7CisgICAgICAgICAgICAgICAgICAgIGlmICh3YXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhci5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVwbG95RGlyKGRpcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB4bWwuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gUGVyZm9ybSBuZXcgZGVwbG95bWVudAorICAgICAgICAgICAgICAgICAgICBjaGVjayhwYXRoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVTZXJ2aWNlZChwYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnVuZGVwbG95ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlQYXRoKSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIk1hbmFnZXJTZXJ2bGV0LnVuZGVwbG95WyIgKyBkaXNwbGF5UGF0aCArICJdIiwgdCk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC50b1N0cmluZygpKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3VwcG9ydCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgY29udGV4dCBwYXRoLCBnZXQgdGhlIGNvbmZpZyBmaWxlIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWdGaWxlKFN0cmluZyBwYXRoKSB7CisgICAgICAgIFN0cmluZyBiYXNlbmFtZSA9IG51bGw7CisgICAgICAgIGlmIChwYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIGJhc2VuYW1lID0gIlJPT1QiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmFzZW5hbWUgPSBwYXRoLnN1YnN0cmluZygxKS5yZXBsYWNlKCcvJywgJyMnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGJhc2VuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgY29udGV4dCBwYXRoLCBnZXQgdGhlIGNvbmZpZyBmaWxlIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXREb2NCYXNlKFN0cmluZyBwYXRoKSB7CisgICAgICAgIFN0cmluZyBiYXNlbmFtZSA9IG51bGw7CisgICAgICAgIGlmIChwYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIGJhc2VuYW1lID0gIlJPT1QiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmFzZW5hbWUgPSBwYXRoLnN1YnN0cmluZygxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGJhc2VuYW1lKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlICJhcHBsaWNhdGlvbiByb290IiBkaXJlY3RvcnkKKyAgICAgKiBmb3Igb3VyIGFzc29jaWF0ZWQgSG9zdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRBcHBCYXNlKCkgeworCisgICAgICAgIGlmIChhcHBCYXNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhcHBCYXNlOworICAgICAgICB9CisKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoaG9zdC5nZXRBcHBCYXNlKCkpOworICAgICAgICBpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKQorICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QuZ2V0QXBwQmFzZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFwcEJhc2UgPSBmaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXBwQmFzZSA9IGZpbGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChhcHBCYXNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSBpc0RlcGxveWVkIG1ldGhvZCBvbiB0aGUgZGVwbG95ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEZXBsb3llZChTdHJpbmcgbmFtZSkgCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSB7IG5hbWUgfTsKKyAgICAgICAgU3RyaW5nW10gc2lnbmF0dXJlID0geyAiamF2YS5sYW5nLlN0cmluZyIgfTsKKyAgICAgICAgQm9vbGVhbiByZXN1bHQgPSAKKyAgICAgICAgICAgIChCb29sZWFuKSBtQmVhblNlcnZlci5pbnZva2Uob25hbWUsICJpc0RlcGxveWVkIiwgcGFyYW1zLCBzaWduYXR1cmUpOworICAgICAgICByZXR1cm4gcmVzdWx0LmJvb2xlYW5WYWx1ZSgpOworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIEludm9rZSB0aGUgY2hlY2sgbWV0aG9kIG9uIHRoZSBkZXBsb3llci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVjayhTdHJpbmcgbmFtZSkgCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSB7IG5hbWUgfTsKKyAgICAgICAgU3RyaW5nW10gc2lnbmF0dXJlID0geyAiamF2YS5sYW5nLlN0cmluZyIgfTsKKyAgICAgICAgbUJlYW5TZXJ2ZXIuaW52b2tlKG9uYW1lLCAiY2hlY2siLCBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSBpc1NlcnZpY2VkIG1ldGhvZCBvbiB0aGUgZGVwbG95ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXJ2aWNlZChTdHJpbmcgbmFtZSkgCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSB7IG5hbWUgfTsKKyAgICAgICAgU3RyaW5nW10gc2lnbmF0dXJlID0geyAiamF2YS5sYW5nLlN0cmluZyIgfTsKKyAgICAgICAgQm9vbGVhbiByZXN1bHQgPSAKKyAgICAgICAgICAgIChCb29sZWFuKSBtQmVhblNlcnZlci5pbnZva2Uob25hbWUsICJpc1NlcnZpY2VkIiwgcGFyYW1zLCBzaWduYXR1cmUpOworICAgICAgICByZXR1cm4gcmVzdWx0LmJvb2xlYW5WYWx1ZSgpOworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIEludm9rZSB0aGUgYWRkU2VydmljZWQgbWV0aG9kIG9uIHRoZSBkZXBsb3llci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2aWNlZChTdHJpbmcgbmFtZSkgCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSB7IG5hbWUgfTsKKyAgICAgICAgU3RyaW5nW10gc2lnbmF0dXJlID0geyAiamF2YS5sYW5nLlN0cmluZyIgfTsKKyAgICAgICAgbUJlYW5TZXJ2ZXIuaW52b2tlKG9uYW1lLCAiYWRkU2VydmljZWQiLCBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSByZW1vdmVTZXJ2aWNlZCBtZXRob2Qgb24gdGhlIGRlcGxveWVyLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZVNlcnZpY2VkKFN0cmluZyBuYW1lKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IHsgbmFtZSB9OworICAgICAgICBTdHJpbmdbXSBzaWduYXR1cmUgPSB7ICJqYXZhLmxhbmcuU3RyaW5nIiB9OworICAgICAgICBtQmVhblNlcnZlci5pbnZva2Uob25hbWUsICJyZW1vdmVTZXJ2aWNlZCIsIHBhcmFtcywgc2lnbmF0dXJlKTsKKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBEZWxldGUgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnksIGluY2x1ZGluZyBhbGwgb2YgaXRzIGNvbnRlbnRzIGFuZAorICAgICAqIHN1YmRpcmVjdG9yaWVzIHJlY3Vyc2l2ZWx5LgorICAgICAqCisgICAgICogQHBhcmFtIGRpciBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRpcmVjdG9yeSB0byBiZSBkZWxldGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdW5kZXBsb3lEaXIoRmlsZSBkaXIpIHsKKworICAgICAgICBTdHJpbmcgZmlsZXNbXSA9IGRpci5saXN0KCk7CisgICAgICAgIGlmIChmaWxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBmaWxlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBmaWxlc1tpXSk7CisgICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgdW5kZXBsb3lEaXIoZmlsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGlyLmRlbGV0ZSgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVcGxvYWQgdGhlIFdBUiBmaWxlIGluY2x1ZGVkIGluIHRoaXMgcmVxdWVzdCwgYW5kIHN0b3JlIGl0IGF0IHRoZQorICAgICAqIHNwZWNpZmllZCBmaWxlIGxvY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSB3YXIgVGhlIGZpbGUgaW50byB3aGljaCB3ZSBzaG91bGQgc3RvcmUgdGhlIHVwbG9hZGVkIFdBUgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdXBsb2FkV2FyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBGaWxlIHdhcikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICB3YXIuZGVsZXRlKCk7CisgICAgICAgIFNlcnZsZXRJbnB1dFN0cmVhbSBpc3RyZWFtID0gbnVsbDsKKyAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gb3N0cmVhbSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpc3RyZWFtID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgb3N0cmVhbSA9CisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHdhciksIDEwMjQpOworICAgICAgICAgICAgYnl0ZSBidWZmZXJbXSA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgbiA9IGlzdHJlYW0ucmVhZChidWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3N0cmVhbS53cml0ZShidWZmZXIsIDAsIG4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3N0cmVhbS5mbHVzaCgpOworICAgICAgICAgICAgb3N0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgb3N0cmVhbSA9IG51bGw7CisgICAgICAgICAgICBpc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICBpc3RyZWFtID0gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgd2FyLmRlbGV0ZSgpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChvc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBzcGVjaWZpZWQgZmlsZSBvciBkaXJlY3RvcnkgdG8gdGhlIGRlc3RpbmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNyYyBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNvdXJjZQorICAgICAqIEBwYXJhbSBkZXN0IEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGVzdGluYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29weShGaWxlIHNyYywgRmlsZSBkZXN0KSB7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiggc3JjICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgIXNyYy5nZXRDYW5vbmljYWxQYXRoKCkuZXF1YWxzKGRlc3QuZ2V0Q2Fub25pY2FsUGF0aCgpKSApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBjb3B5SW50ZXJuYWwoc3JjLCBkZXN0LCBuZXcgYnl0ZVs0MDk2XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBzcGVjaWZpZWQgZmlsZSBvciBkaXJlY3RvcnkgdG8gdGhlIGRlc3RpbmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNyYyBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNvdXJjZQorICAgICAqIEBwYXJhbSBkZXN0IEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGVzdGluYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29weUludGVybmFsKEZpbGUgc3JjLCBGaWxlIGRlc3QsIGJ5dGVbXSBidWYpIHsKKyAgICAgICAgCisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBmaWxlc1tdID0gbnVsbDsKKyAgICAgICAgaWYgKHNyYy5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBmaWxlcyA9IHNyYy5saXN0KCk7CisgICAgICAgICAgICByZXN1bHQgPSBkZXN0Lm1rZGlyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxlcyA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICBmaWxlc1swXSA9ICIiOworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBmaWxlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IChpIDwgZmlsZXMubGVuZ3RoKSAmJiByZXN1bHQ7IGkrKykgeworICAgICAgICAgICAgRmlsZSBmaWxlU3JjID0gbmV3IEZpbGUoc3JjLCBmaWxlc1tpXSk7CisgICAgICAgICAgICBGaWxlIGZpbGVEZXN0ID0gbmV3IEZpbGUoZGVzdCwgZmlsZXNbaV0pOworICAgICAgICAgICAgaWYgKGZpbGVTcmMuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvcHlJbnRlcm5hbChmaWxlU3JjLCBmaWxlRGVzdCwgYnVmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZVNyYyk7CisgICAgICAgICAgICAgICAgICAgIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZURlc3QpOworICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IGlzLnJlYWQoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBvcy53cml0ZShidWYsIDAsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvU3RhdHVzTWFuYWdlclNlcnZsZXQuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9TdGF0dXNNYW5hZ2VyU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNWQxYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvU3RhdHVzTWFuYWdlclNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDM2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1hbmFnZXI7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU2VydmVySW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworLyoqCisgKiBUaGlzIHNlcnZsZXQgd2lsbCBkaXNwbGF5IGEgY29tcGxldGUgc3RhdHVzIG9mIHRoZSBIVFRQLzEuMSBjb25uZWN0b3IuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU3RhdHVzTWFuYWdlclNlcnZsZXQKKyAgICBleHRlbmRzIEh0dHBTZXJ2bGV0IGltcGxlbWVudHMgTm90aWZpY2F0aW9uTGlzdGVuZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgZm9yIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBkZWJ1ZyA9IDA7CisKKworICAgIC8qKgorICAgICAqIE1CZWFuIHNlcnZlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTUJlYW5TZXJ2ZXIgbUJlYW5TZXJ2ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBWZWN0b3Igb2YgcHJvdG9jb2wgaGFuZGxlcnMgb2JqZWN0IG5hbWVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgcHJvdG9jb2xIYW5kbGVycyA9IG5ldyBWZWN0b3IoKTsKKworCisgICAgLyoqCisgICAgICogVmVjdG9yIG9mIHRocmVhZCBwb29scyBvYmplY3QgbmFtZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFZlY3RvciB0aHJlYWRQb29scyA9IG5ldyBWZWN0b3IoKTsKKworCisgICAgLyoqCisgICAgICogVmVjdG9yIG9mIHJlcXVlc3QgcHJvY2Vzc29ycyBvYmplY3QgbmFtZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFZlY3RvciByZXF1ZXN0UHJvY2Vzc29ycyA9IG5ldyBWZWN0b3IoKTsKKworCisgICAgLyoqCisgICAgICogVmVjdG9yIG9mIGdsb2JhbCByZXF1ZXN0IHByb2Nlc3NvcnMgb2JqZWN0IG5hbWVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgZ2xvYmFsUmVxdWVzdFByb2Nlc3NvcnMgPSBuZXcgVmVjdG9yKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFJldHJpZXZlIHRoZSBNQmVhbiBzZXJ2ZXIKKyAgICAgICAgbUJlYW5TZXJ2ZXIgPSBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS5nZXRNQmVhblNlcnZlcigpOworCisgICAgICAgIC8vIFNldCBvdXIgcHJvcGVydGllcyBmcm9tIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJkZWJ1ZyIpOworICAgICAgICAgICAgZGVidWcgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIFF1ZXJ5IHByb3RvY29sIGhhbmRsZXJzCisgICAgICAgICAgICBTdHJpbmcgb25TdHIgPSAiKjp0eXBlPVByb3RvY29sSGFuZGxlciwqIjsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKG9uU3RyKTsKKyAgICAgICAgICAgIFNldCBzZXQgPSBtQmVhblNlcnZlci5xdWVyeU1CZWFucyhvYmplY3ROYW1lLCBudWxsKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2V0Lml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0SW5zdGFuY2Ugb2kgPSAoT2JqZWN0SW5zdGFuY2UpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBwcm90b2NvbEhhbmRsZXJzLmFkZEVsZW1lbnQob2kuZ2V0T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUXVlcnkgVGhyZWFkIFBvb2xzCisgICAgICAgICAgICBvblN0ciA9ICIqOnR5cGU9VGhyZWFkUG9vbCwqIjsKKyAgICAgICAgICAgIG9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZShvblN0cik7CisgICAgICAgICAgICBzZXQgPSBtQmVhblNlcnZlci5xdWVyeU1CZWFucyhvYmplY3ROYW1lLCBudWxsKTsKKyAgICAgICAgICAgIGl0ZXJhdG9yID0gc2V0Lml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0SW5zdGFuY2Ugb2kgPSAoT2JqZWN0SW5zdGFuY2UpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICB0aHJlYWRQb29scy5hZGRFbGVtZW50KG9pLmdldE9iamVjdE5hbWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFF1ZXJ5IEdsb2JhbCBSZXF1ZXN0IFByb2Nlc3NvcnMKKyAgICAgICAgICAgIG9uU3RyID0gIio6dHlwZT1HbG9iYWxSZXF1ZXN0UHJvY2Vzc29yLCoiOworICAgICAgICAgICAgb2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKG9uU3RyKTsKKyAgICAgICAgICAgIHNldCA9IG1CZWFuU2VydmVyLnF1ZXJ5TUJlYW5zKG9iamVjdE5hbWUsIG51bGwpOworICAgICAgICAgICAgaXRlcmF0b3IgPSBzZXQuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3RJbnN0YW5jZSBvaSA9IChPYmplY3RJbnN0YW5jZSkgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgIGdsb2JhbFJlcXVlc3RQcm9jZXNzb3JzLmFkZEVsZW1lbnQob2kuZ2V0T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUXVlcnkgUmVxdWVzdCBQcm9jZXNzb3JzCisgICAgICAgICAgICBvblN0ciA9ICIqOnR5cGU9UmVxdWVzdFByb2Nlc3NvciwqIjsKKyAgICAgICAgICAgIG9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZShvblN0cik7CisgICAgICAgICAgICBzZXQgPSBtQmVhblNlcnZlci5xdWVyeU1CZWFucyhvYmplY3ROYW1lLCBudWxsKTsKKyAgICAgICAgICAgIGl0ZXJhdG9yID0gc2V0Lml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0SW5zdGFuY2Ugb2kgPSAoT2JqZWN0SW5zdGFuY2UpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0UHJvY2Vzc29ycy5hZGRFbGVtZW50KG9pLmdldE9iamVjdE5hbWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHdpdGggTUJlYW4gc2VydmVyCisgICAgICAgICAgICBvblN0ciA9ICJKTUltcGxlbWVudGF0aW9uOnR5cGU9TUJlYW5TZXJ2ZXJEZWxlZ2F0ZSI7CisgICAgICAgICAgICBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUob25TdHIpOworICAgICAgICAgICAgbUJlYW5TZXJ2ZXIuYWRkTm90aWZpY2F0aW9uTGlzdGVuZXIob2JqZWN0TmFtZSwgdGhpcywgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmluYWxpemUgdGhpcyBzZXJ2bGV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisKKyAgICAgICAgOyAgICAgICAvLyBObyBhY3Rpb25zIG5lY2Vzc2FyeQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgR0VUIHJlcXVlc3QgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldC1zcGVjaWZpZWQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBtb2RlIGlzIGZsYWcgZm9yIEhUTUwgb3IgWE1MIG91dHB1dAorICAgICAgICBpbnQgbW9kZSA9IDA7CisgICAgICAgIC8vIGlmID9YTUw9dHJ1ZSwgc2V0IHRoZSBtb2RlIHRvIFhNTAorICAgICAgICBpZiAocmVxdWVzdC5nZXRQYXJhbWV0ZXIoIlhNTCIpICE9IG51bGwgCisgICAgICAgICAgICAmJiByZXF1ZXN0LmdldFBhcmFtZXRlcigiWE1MIikuZXF1YWxzKCJ0cnVlIikpIHsKKyAgICAgICAgICAgIG1vZGUgPSAxOworICAgICAgICB9CisgICAgICAgIFN0YXR1c1RyYW5zZm9ybWVyLnNldENvbnRlbnRUeXBlKHJlc3BvbnNlLCBtb2RlKTsKKworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICBib29sZWFuIGNvbXBsZXRlU3RhdHVzID0gZmFsc2U7CisgICAgICAgIGlmICgocmVxdWVzdC5nZXRQYXRoSW5mbygpICE9IG51bGwpIAorICAgICAgICAgICAgJiYgKHJlcXVlc3QuZ2V0UGF0aEluZm8oKS5lcXVhbHMoIi9hbGwiKSkpIHsKKyAgICAgICAgICAgIGNvbXBsZXRlU3RhdHVzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyB1c2UgU3RhdHVzVHJhbnNmb3JtZXIgdG8gb3V0cHV0IHN0YXR1cworICAgICAgICBTdGF0dXNUcmFuc2Zvcm1lci53cml0ZUhlYWRlcih3cml0ZXIsbW9kZSk7CisKKyAgICAgICAgLy8gQm9keSBIZWFkZXIgU2VjdGlvbgorICAgICAgICBPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFsyXTsKKyAgICAgICAgYXJnc1swXSA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKTsKKyAgICAgICAgaWYgKGNvbXBsZXRlU3RhdHVzKSB7CisgICAgICAgICAgICBhcmdzWzFdID0gc20uZ2V0U3RyaW5nKCJzdGF0dXNTZXJ2bGV0LmNvbXBsZXRlIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcmdzWzFdID0gc20uZ2V0U3RyaW5nKCJzdGF0dXNTZXJ2bGV0LnRpdGxlIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gdXNlIFN0YXR1c1RyYW5zZm9ybWVyIHRvIG91dHB1dCBzdGF0dXMKKyAgICAgICAgU3RhdHVzVHJhbnNmb3JtZXIud3JpdGVCb2R5KHdyaXRlcixhcmdzLG1vZGUpOworCisgICAgICAgIC8vIE1hbmFnZXIgU2VjdGlvbgorICAgICAgICBhcmdzID0gbmV3IE9iamVjdFs5XTsKKyAgICAgICAgYXJnc1swXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0Lm1hbmFnZXIiKTsKKyAgICAgICAgYXJnc1sxXSA9IHJlc3BvbnNlLmVuY29kZVVSTChyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAiL2h0bWwvbGlzdCIpOworICAgICAgICBhcmdzWzJdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQubGlzdCIpOworICAgICAgICBhcmdzWzNdID0gcmVzcG9uc2UuZW5jb2RlVVJMCisgICAgICAgICAgICAocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi8iICsKKyAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5oZWxwSHRtbE1hbmFnZXJGaWxlIikpOworICAgICAgICBhcmdzWzRdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuaGVscEh0bWxNYW5hZ2VyIik7CisgICAgICAgIGFyZ3NbNV0gPSByZXNwb25zZS5lbmNvZGVVUkwKKyAgICAgICAgICAgIChyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAiLyIgKworICAgICAgICAgICAgIHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmhlbHBNYW5hZ2VyRmlsZSIpKTsKKyAgICAgICAgYXJnc1s2XSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmhlbHBNYW5hZ2VyIik7CisgICAgICAgIGlmIChjb21wbGV0ZVN0YXR1cykgeworICAgICAgICAgICAgYXJnc1s3XSA9IHJlc3BvbnNlLmVuY29kZVVSTAorICAgICAgICAgICAgICAgIChyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAiL3N0YXR1cyIpOworICAgICAgICAgICAgYXJnc1s4XSA9IHNtLmdldFN0cmluZygic3RhdHVzU2VydmxldC50aXRsZSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXJnc1s3XSA9IHJlc3BvbnNlLmVuY29kZVVSTAorICAgICAgICAgICAgICAgIChyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAiL3N0YXR1cy9hbGwiKTsKKyAgICAgICAgICAgIGFyZ3NbOF0gPSBzbS5nZXRTdHJpbmcoInN0YXR1c1NlcnZsZXQuY29tcGxldGUiKTsKKyAgICAgICAgfQorICAgICAgICAvLyB1c2UgU3RhdHVzVHJhbnNmb3JtZXIgdG8gb3V0cHV0IHN0YXR1cworICAgICAgICBTdGF0dXNUcmFuc2Zvcm1lci53cml0ZU1hbmFnZXIod3JpdGVyLGFyZ3MsbW9kZSk7CisKKyAgICAgICAgLy8gU2VydmVyIEhlYWRlciBTZWN0aW9uCisgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0WzddOworICAgICAgICBhcmdzWzBdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyVGl0bGUiKTsKKyAgICAgICAgYXJnc1sxXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlclZlcnNpb24iKTsKKyAgICAgICAgYXJnc1syXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlckpWTVZlcnNpb24iKTsKKyAgICAgICAgYXJnc1szXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlckpWTVZlbmRvciIpOworICAgICAgICBhcmdzWzRdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyT1NOYW1lIik7CisgICAgICAgIGFyZ3NbNV0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJPU1ZlcnNpb24iKTsKKyAgICAgICAgYXJnc1s2XSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlck9TQXJjaCIpOworICAgICAgICAvLyB1c2UgU3RhdHVzVHJhbnNmb3JtZXIgdG8gb3V0cHV0IHN0YXR1cworICAgICAgICBTdGF0dXNUcmFuc2Zvcm1lci53cml0ZVBhZ2VIZWFkaW5nKHdyaXRlcixhcmdzLG1vZGUpOworCisgICAgICAgIC8vIFNlcnZlciBSb3cgU2VjdGlvbgorICAgICAgICBhcmdzID0gbmV3IE9iamVjdFs2XTsKKyAgICAgICAgYXJnc1swXSA9IFNlcnZlckluZm8uZ2V0U2VydmVySW5mbygpOworICAgICAgICBhcmdzWzFdID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnJ1bnRpbWUudmVyc2lvbiIpOworICAgICAgICBhcmdzWzJdID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZtLnZlbmRvciIpOworICAgICAgICBhcmdzWzNdID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7CisgICAgICAgIGFyZ3NbNF0gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLnZlcnNpb24iKTsKKyAgICAgICAgYXJnc1s1XSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpOworICAgICAgICAvLyB1c2UgU3RhdHVzVHJhbnNmb3JtZXIgdG8gb3V0cHV0IHN0YXR1cworICAgICAgICBTdGF0dXNUcmFuc2Zvcm1lci53cml0ZVNlcnZlckluZm8od3JpdGVyLCBhcmdzLCBtb2RlKTsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBEaXNwbGF5IG9wZXJhdGluZyBzeXN0ZW0gc3RhdGlzdGljcyB1c2luZyBBUFIgaWYgYXZhaWxhYmxlCisgICAgICAgICAgICBTdGF0dXNUcmFuc2Zvcm1lci53cml0ZU9TU3RhdGUod3JpdGVyLG1vZGUpOworCisgICAgICAgICAgICAvLyBEaXNwbGF5IHZpcnR1YWwgbWFjaGluZSBzdGF0aXN0aWNzCisgICAgICAgICAgICBTdGF0dXNUcmFuc2Zvcm1lci53cml0ZVZNU3RhdGUod3JpdGVyLG1vZGUpOworCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IHRocmVhZFBvb2xzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSAoT2JqZWN0TmFtZSkgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG9iamVjdE5hbWUuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgICAgICAgICAvLyB1c2UgU3RhdHVzVHJhbnNmb3JtZXIgdG8gb3V0cHV0IHN0YXR1cworICAgICAgICAgICAgICAgIFN0YXR1c1RyYW5zZm9ybWVyLndyaXRlQ29ubmVjdG9yU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgKHdyaXRlciwgb2JqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUsIG1CZWFuU2VydmVyLCBnbG9iYWxSZXF1ZXN0UHJvY2Vzc29ycywKKyAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQcm9jZXNzb3JzLCBtb2RlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChyZXF1ZXN0LmdldFBhdGhJbmZvKCkgIT0gbnVsbCkgCisgICAgICAgICAgICAgICAgJiYgKHJlcXVlc3QuZ2V0UGF0aEluZm8oKS5lcXVhbHMoIi9hbGwiKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBOb3RlOiBSZXRyaWV2aW5nIHRoZSBmdWxsIHN0YXR1cyBpcyBtdWNoIHNsb3dlcgorICAgICAgICAgICAgICAgIC8vIHVzZSBTdGF0dXNUcmFuc2Zvcm1lciB0byBvdXRwdXQgc3RhdHVzCisgICAgICAgICAgICAgICAgU3RhdHVzVHJhbnNmb3JtZXIud3JpdGVEZXRhaWxlZFN0YXRlCisgICAgICAgICAgICAgICAgICAgICh3cml0ZXIsIG1CZWFuU2VydmVyLCBtb2RlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgU3RhdHVzVHJhbnNmb3JtZXIgdG8gb3V0cHV0IHN0YXR1cworICAgICAgICBTdGF0dXNUcmFuc2Zvcm1lci53cml0ZUZvb3Rlcih3cml0ZXIsIG1vZGUpOworCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBOb3RpZmljYXRpb25MaXN0ZW5lciBNZXRob2RzCisKKworICAgIHB1YmxpYyB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IGhhbmRiYWNrKSB7CisKKyAgICAgICAgaWYgKG5vdGlmaWNhdGlvbiBpbnN0YW5jZW9mIE1CZWFuU2VydmVyTm90aWZpY2F0aW9uKSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSAKKyAgICAgICAgICAgICAgICAoKE1CZWFuU2VydmVyTm90aWZpY2F0aW9uKSBub3RpZmljYXRpb24pLmdldE1CZWFuTmFtZSgpOworICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5nZXRUeXBlKCkuZXF1YWxzCisgICAgICAgICAgICAgICAgKE1CZWFuU2VydmVyTm90aWZpY2F0aW9uLlJFR0lTVFJBVElPTl9OT1RJRklDQVRJT04pKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJ0eXBlIik7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5lcXVhbHMoIlByb3RvY29sSGFuZGxlciIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEhhbmRsZXJzLmFkZEVsZW1lbnQob2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoIlRocmVhZFBvb2wiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkUG9vbHMuYWRkRWxlbWVudChvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiR2xvYmFsUmVxdWVzdFByb2Nlc3NvciIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxSZXF1ZXN0UHJvY2Vzc29ycy5hZGRFbGVtZW50KG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJSZXF1ZXN0UHJvY2Vzc29yIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQcm9jZXNzb3JzLmFkZEVsZW1lbnQob2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRUeXBlKCkuZXF1YWxzCisgICAgICAgICAgICAgICAgICAgICAgIChNQmVhblNlcnZlck5vdGlmaWNhdGlvbi5VTlJFR0lTVFJBVElPTl9OT1RJRklDQVRJT04pKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJ0eXBlIik7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5lcXVhbHMoIlByb3RvY29sSGFuZGxlciIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEhhbmRsZXJzLnJlbW92ZUVsZW1lbnQob2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoIlRocmVhZFBvb2wiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkUG9vbHMucmVtb3ZlRWxlbWVudChvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiR2xvYmFsUmVxdWVzdFByb2Nlc3NvciIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxSZXF1ZXN0UHJvY2Vzc29ycy5yZW1vdmVFbGVtZW50KG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJSZXF1ZXN0UHJvY2Vzc29yIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQcm9jZXNzb3JzLnJlbW92ZUVsZW1lbnQob2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIGoyZWVUeXBlID0gb2JqZWN0TmFtZS5nZXRLZXlQcm9wZXJ0eSgiajJlZVR5cGUiKTsKKyAgICAgICAgICAgICAgICBpZiAoajJlZVR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvU3RhdHVzVHJhbnNmb3JtZXIuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9TdGF0dXNUcmFuc2Zvcm1lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjBiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvU3RhdHVzVHJhbnNmb3JtZXIuamF2YQpAQCAtMCwwICsxLDkzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5SZXF1ZXN0VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmNvbXBhdC5KZGtDb21wYXQ7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCisvKioKKyAqIFRoaXMgaXMgYSByZWZhY3RvcmluZyBvZiB0aGUgc2VydmxldCB0byBleHRlcm5hbGl6ZQorICogdGhlIG91dHB1dCBpbnRvIGEgc2ltcGxlIGNsYXNzLiBBbHRob3VnaCB3ZSBjb3VsZAorICogdXNlIFhTTFQsIHRoYXQgaXMgdW5uZWNlc3NhcmlseSBjb21wbGV4LgorICoKKyAqIEBhdXRob3IgUGV0ZXIgTGluCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTdGF0dXNUcmFuc2Zvcm1lciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29udGVudFR5cGUoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlKSB7CisgICAgICAgIGlmIChtb2RlID09IDApeworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbDtjaGFyc2V0PSIrQ29uc3RhbnRzLkNIQVJTRVQpOworICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMSl7CisgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC94bWw7Y2hhcnNldD0iK0NvbnN0YW50cy5DSEFSU0VUKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIEdFVCByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQtc3BlY2lmaWVkIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUhlYWRlcihQcmludFdyaXRlciB3cml0ZXIsIGludCBtb2RlKSB7CisgICAgICAgIGlmIChtb2RlID09IDApeworICAgICAgICAgICAgLy8gSFRNTCBIZWFkZXIgU2VjdGlvbgorICAgICAgICAgICAgd3JpdGVyLnByaW50KENvbnN0YW50cy5IVE1MX0hFQURFUl9TRUNUSU9OKTsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDEpeworICAgICAgICAgICAgd3JpdGVyLndyaXRlKENvbnN0YW50cy5YTUxfREVDTEFSQVRJT04pOworICAgICAgICAgICAgd3JpdGVyLndyaXRlCisgICAgICAgICAgICAgICAgKENvbnN0YW50cy5YTUxfU1RZTEUpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8c3RhdHVzPiIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgaGVhZGVyIGJvZHkuIFhNTCBvdXRwdXQgZG9lc24ndCBib3RoZXIKKyAgICAgKiB0byBvdXRwdXQgdGhpcyBzdHVmZiwgc2luY2UgaXQncyBqdXN0IHRpdGxlLgorICAgICAqIAorICAgICAqIEBwYXJhbSB3cml0ZXIgVGhlIG91dHB1dCB3cml0ZXIKKyAgICAgKiBAcGFyYW0gYXJncyBXaGF0IHRvIHdyaXRlCisgICAgICogQHBhcmFtIG1vZGUgMCBtZWFucyB3cml0ZSAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVCb2R5KFByaW50V3JpdGVyIHdyaXRlciwgT2JqZWN0W10gYXJncywgaW50IG1vZGUpIHsKKyAgICAgICAgaWYgKG1vZGUgPT0gMCl7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAoQ29uc3RhbnRzLkJPRFlfSEVBREVSX1NFQ1RJT04sIGFyZ3MpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIG1hbmFnZXIgd2ViYXBwIGluZm9ybWF0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSB3cml0ZXIgVGhlIG91dHB1dCB3cml0ZXIKKyAgICAgKiBAcGFyYW0gYXJncyBXaGF0IHRvIHdyaXRlCisgICAgICogQHBhcmFtIG1vZGUgMCBtZWFucyB3cml0ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZU1hbmFnZXIoUHJpbnRXcml0ZXIgd3JpdGVyLCBPYmplY3RbXSBhcmdzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlKSB7CisgICAgICAgIGlmIChtb2RlID09IDApeworICAgICAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENvbnN0YW50cy5NQU5BR0VSX1NFQ1RJT04sIGFyZ3MpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlUGFnZUhlYWRpbmcoUHJpbnRXcml0ZXIgd3JpdGVyLCBPYmplY3RbXSBhcmdzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSkgeworICAgICAgICBpZiAobW9kZSA9PSAwKXsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChNZXNzYWdlRm9ybWF0LmZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgIChDb25zdGFudHMuU0VSVkVSX0hFQURFUl9TRUNUSU9OLCBhcmdzKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVNlcnZlckluZm8oUHJpbnRXcml0ZXIgd3JpdGVyLCBPYmplY3RbXSBhcmdzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlKXsKKyAgICAgICAgaWYgKG1vZGUgPT0gMCl7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ29uc3RhbnRzLlNFUlZFUl9ST1dfU0VDVElPTiwgYXJncykpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVGb290ZXIoUHJpbnRXcml0ZXIgd3JpdGVyLCBpbnQgbW9kZSkgeworICAgICAgICBpZiAobW9kZSA9PSAwKXsKKyAgICAgICAgICAgIC8vIEhUTUwgVGFpbCBTZWN0aW9uCisgICAgICAgICAgICB3cml0ZXIucHJpbnQoQ29uc3RhbnRzLkhUTUxfVEFJTF9TRUNUSU9OKTsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDEpeworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8L3N0YXR1cz4iKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIE9TIHN0YXRlLiBNb2RlIDAgd2lsbCBnZW5lcmF0ZSBIVE1MLgorICAgICAqIE1vZGUgMSB3aWxsIGdlbmVyYXRlIFhNTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVPU1N0YXRlKFByaW50V3JpdGVyIHdyaXRlciwgaW50IG1vZGUpIHsKKyAgICAgICAgbG9uZ1tdIHJlc3VsdCA9IG5ldyBsb25nWzE2XTsKKyAgICAgICAgYm9vbGVhbiBvayA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSAiaW5mbyI7CisgICAgICAgICAgICBDbGFzcyBwYXJhbVR5cGVzW10gPSBuZXcgQ2xhc3NbMV07CisgICAgICAgICAgICBwYXJhbVR5cGVzWzBdID0gcmVzdWx0LmdldENsYXNzKCk7CisgICAgICAgICAgICBPYmplY3QgcGFyYW1WYWx1ZXNbXSA9IG5ldyBPYmplY3RbMV07CisgICAgICAgICAgICBwYXJhbVZhbHVlc1swXSA9IHJlc3VsdDsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnRvbWNhdC5qbmkuT1MiKQorICAgICAgICAgICAgICAgIC5nZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1UeXBlcyk7CisgICAgICAgICAgICBtZXRob2QuaW52b2tlKG51bGwsIHBhcmFtVmFsdWVzKTsKKyAgICAgICAgICAgIG9rID0gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIGlmIChtb2RlID09IDApeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPGgxPk9TPC9oMT4iKTsKKworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPHA+Iik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgUGh5c2ljYWwgbWVtb3J5OiAiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0U2l6ZShuZXcgTG9uZyhyZXN1bHRbMF0pLCB0cnVlKSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgQXZhaWxhYmxlIG1lbW9yeTogIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFNpemUobmV3IExvbmcocmVzdWx0WzFdKSwgdHJ1ZSkpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIFRvdGFsIHBhZ2UgZmlsZTogIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFNpemUobmV3IExvbmcocmVzdWx0WzJdKSwgdHJ1ZSkpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIEZyZWUgcGFnZSBmaWxlOiAiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0U2l6ZShuZXcgTG9uZyhyZXN1bHRbM10pLCB0cnVlKSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgTWVtb3J5IGxvYWQ6ICIpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChuZXcgTG9uZyhyZXN1bHRbNl0pKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxicj4iKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBQcm9jZXNzIGtlcm5lbCB0aW1lOiAiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0VGltZShuZXcgTG9uZyhyZXN1bHRbMTFdIC8gMTAwMCksIHRydWUpKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBQcm9jZXNzIHVzZXIgdGltZTogIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFRpbWUobmV3IExvbmcocmVzdWx0WzEyXSAvIDEwMDApLCB0cnVlKSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8L3A+Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMSl7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBWTSBzdGF0ZS4gTW9kZSAwIHdpbGwgZ2VuZXJhdGUgSFRNTC4KKyAgICAgKiBNb2RlIDEgd2lsbCBnZW5lcmF0ZSBYTUwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVk1TdGF0ZShQcmludFdyaXRlciB3cml0ZXIsIGludCBtb2RlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobW9kZSA9PSAwKXsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPGgxPkpWTTwvaDE+Iik7CisKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPHA+Iik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBGcmVlIG1lbW9yeTogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0U2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgTG9uZyhSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkpLCB0cnVlKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBUb3RhbCBtZW1vcnk6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IExvbmcoUnVudGltZS5nZXRSdW50aW1lKCkudG90YWxNZW1vcnkoKSksIHRydWUpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIE1heCBtZW1vcnk6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IExvbmcoSmRrQ29tcGF0LmdldEpka0NvbXBhdCgpLmdldE1heE1lbW9yeSgpKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC9wPiIpOworICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMSl7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjxqdm0+Iik7CisKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPG1lbW9yeSIpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgZnJlZT0nIiArIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKSArICInIik7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiB0b3RhbD0nIiArIFJ1bnRpbWUuZ2V0UnVudGltZSgpLnRvdGFsTWVtb3J5KCkgKyAiJyIpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgbWF4PSciICsgSmRrQ29tcGF0LmdldEpka0NvbXBhdCgpLmdldE1heE1lbW9yeSgpICsgIicvPiIpOworCisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjwvanZtPiIpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIGNvbm5lY3RvciBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVDb25uZWN0b3JTdGF0ZShQcmludFdyaXRlciB3cml0ZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgdHBOYW1lLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQmVhblNlcnZlciBtQmVhblNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3IgZ2xvYmFsUmVxdWVzdFByb2Nlc3NvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yIHJlcXVlc3RQcm9jZXNzb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobW9kZSA9PSAwKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxoMT4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChuYW1lKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC9oMT4iKTsKKworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8cD4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIE1heCB0aHJlYWRzOiAiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUodHBOYW1lLCAibWF4VGhyZWFkcyIpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIE1pbiBzcGFyZSB0aHJlYWRzOiAiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUodHBOYW1lLCAibWluU3BhcmVUaHJlYWRzIikpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgTWF4IHNwYXJlIHRocmVhZHM6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZSh0cE5hbWUsICJtYXhTcGFyZVRocmVhZHMiKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBDdXJyZW50IHRocmVhZCBjb3VudDogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKHRwTmFtZSwgImN1cnJlbnRUaHJlYWRDb3VudCIpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIEN1cnJlbnQgdGhyZWFkIGJ1c3k6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZSh0cE5hbWUsICJjdXJyZW50VGhyZWFkc0J1c3kiKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZSh0cE5hbWUsICJrZWVwQWxpdmVDb3VudCIpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIEtlZXBlZCBhbGl2ZSBzb2NrZXRzIGNvdW50OiAiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQodmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8YnI+Iik7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgZ3JwTmFtZSA9IG51bGw7CisKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gZ2xvYmFsUmVxdWVzdFByb2Nlc3NvcnMuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IChPYmplY3ROYW1lKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIikpKSB7CisgICAgICAgICAgICAgICAgICAgIGdycE5hbWUgPSBvYmplY3ROYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGdycE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgTWF4IHByb2Nlc3NpbmcgdGltZTogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0VGltZShtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncnBOYW1lLCAibWF4VGltZSIpLCBmYWxzZSkpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgUHJvY2Vzc2luZyB0aW1lOiAiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChmb3JtYXRUaW1lKG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdycE5hbWUsICJwcm9jZXNzaW5nVGltZSIpLCB0cnVlKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBSZXF1ZXN0IGNvdW50OiAiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUoZ3JwTmFtZSwgInJlcXVlc3RDb3VudCIpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIEVycm9yIGNvdW50OiAiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUoZ3JwTmFtZSwgImVycm9yQ291bnQiKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBCeXRlcyByZWNlaXZlZDogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0U2l6ZShtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncnBOYW1lLCAiYnl0ZXNSZWNlaXZlZCIpLCB0cnVlKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBCeXRlcyBzZW50OiAiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChmb3JtYXRTaXplKG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdycE5hbWUsICJieXRlc1NlbnQiKSwgdHJ1ZSkpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8L3A+Iik7CisKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPHRhYmxlIGJvcmRlcj1cIjBcIj48dHI+PHRoPlN0YWdlPC90aD48dGg+VGltZTwvdGg+PHRoPkIgU2VudDwvdGg+PHRoPkIgUmVjdjwvdGg+PHRoPkNsaWVudDwvdGg+PHRoPlZIb3N0PC90aD48dGg+UmVxdWVzdDwvdGg+PC90cj4iKTsKKworICAgICAgICAgICAgZW51bWVyYXRpb24gPSByZXF1ZXN0UHJvY2Vzc29ycy5lbGVtZW50cygpOworICAgICAgICAgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gKE9iamVjdE5hbWUpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKG9iamVjdE5hbWUuZ2V0S2V5UHJvcGVydHkoIndvcmtlciIpKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjx0cj4iKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVQcm9jZXNzb3JTdGF0ZSh3cml0ZXIsIG9iamVjdE5hbWUsIG1CZWFuU2VydmVyLCBtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8L3RyPiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8L3RhYmxlPiIpOworCisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxwPiIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCJQOiBQYXJzZSBhbmQgcHJlcGFyZSByZXF1ZXN0IFM6IFNlcnZpY2UgRjogRmluaXNoaW5nIFI6IFJlYWR5IEs6IEtlZXBhbGl2ZSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8L3A+Iik7CisgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSAxKXsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPGNvbm5lY3RvciBuYW1lPSciICsgbmFtZSArICInPiIpOworCisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjx0aHJlYWRJbmZvICIpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgbWF4VGhyZWFkcz1cIiIgKyBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUodHBOYW1lLCAibWF4VGhyZWFkcyIpICsgIlwiIik7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBtaW5TcGFyZVRocmVhZHM9XCIiICsgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKHRwTmFtZSwgIm1pblNwYXJlVGhyZWFkcyIpICsgIlwiIik7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBtYXhTcGFyZVRocmVhZHM9XCIiICsgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKHRwTmFtZSwgIm1heFNwYXJlVGhyZWFkcyIpICsgIlwiIik7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBjdXJyZW50VGhyZWFkQ291bnQ9XCIiICsgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKHRwTmFtZSwgImN1cnJlbnRUaHJlYWRDb3VudCIpICsgIlwiIik7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBjdXJyZW50VGhyZWFkc0J1c3k9XCIiICsgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKHRwTmFtZSwgImN1cnJlbnRUaHJlYWRzQnVzeSIpICsgIlwiIik7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiAvPiIpOworCisgICAgICAgICAgICBPYmplY3ROYW1lIGdycE5hbWUgPSBudWxsOworCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IGdsb2JhbFJlcXVlc3RQcm9jZXNzb3JzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSAoT2JqZWN0TmFtZSkgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMob2JqZWN0TmFtZS5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpKSkgeworICAgICAgICAgICAgICAgICAgICBncnBOYW1lID0gb2JqZWN0TmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChncnBOYW1lICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPHJlcXVlc3RJbmZvICIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIG1heFRpbWU9XCIiICsgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKGdycE5hbWUsICJtYXhUaW1lIikgKyAiXCIiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBwcm9jZXNzaW5nVGltZT1cIiIgKyBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUoZ3JwTmFtZSwgInByb2Nlc3NpbmdUaW1lIikgKyAiXCIiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiByZXF1ZXN0Q291bnQ9XCIiICsgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKGdycE5hbWUsICJyZXF1ZXN0Q291bnQiKSArICJcIiIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIGVycm9yQ291bnQ9XCIiICsgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKGdycE5hbWUsICJlcnJvckNvdW50IikgKyAiXCIiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBieXRlc1JlY2VpdmVkPVwiIiArIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShncnBOYW1lLCAiYnl0ZXNSZWNlaXZlZCIpICsgIlwiIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgYnl0ZXNTZW50PVwiIiArIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShncnBOYW1lLCAiYnl0ZXNTZW50IikgKyAiXCIiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiAvPiIpOworCisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8d29ya2Vycz4iKTsKKyAgICAgICAgICAgICAgICBlbnVtZXJhdGlvbiA9IHJlcXVlc3RQcm9jZXNzb3JzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IChPYmplY3ROYW1lKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMob2JqZWN0TmFtZS5nZXRLZXlQcm9wZXJ0eSgid29ya2VyIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVByb2Nlc3NvclN0YXRlKHdyaXRlciwgb2JqZWN0TmFtZSwgbUJlYW5TZXJ2ZXIsIG1vZGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPC93b3JrZXJzPiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjwvY29ubmVjdG9yPiIpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIHByb2Nlc3NvciBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgd3JpdGVQcm9jZXNzb3JTdGF0ZShQcmludFdyaXRlciB3cml0ZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJlYW5TZXJ2ZXIgbUJlYW5TZXJ2ZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBJbnRlZ2VyIHN0YWdlVmFsdWUgPSAKKyAgICAgICAgICAgIChJbnRlZ2VyKSBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUocE5hbWUsICJzdGFnZSIpOworICAgICAgICBpbnQgc3RhZ2UgPSBzdGFnZVZhbHVlLmludFZhbHVlKCk7CisgICAgICAgIGJvb2xlYW4gZnVsbFN0YXR1cyA9IHRydWU7CisgICAgICAgIGJvb2xlYW4gc2hvd1JlcXVlc3QgPSB0cnVlOworICAgICAgICBTdHJpbmcgc3RhZ2VTdHIgPSBudWxsOworCisgICAgICAgIHN3aXRjaCAoc3RhZ2UpIHsKKworICAgICAgICBjYXNlICgxLypvcmcuYXBhY2hlLmNveW90ZS5Db25zdGFudHMuU1RBR0VfUEFSU0UqLyk6CisgICAgICAgICAgICBzdGFnZVN0ciA9ICJQIjsKKyAgICAgICAgICAgIGZ1bGxTdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICgyLypvcmcuYXBhY2hlLmNveW90ZS5Db25zdGFudHMuU1RBR0VfUFJFUEFSRSovKToKKyAgICAgICAgICAgIHN0YWdlU3RyID0gIlAiOworICAgICAgICAgICAgZnVsbFN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgKDMvKm9yZy5hcGFjaGUuY295b3RlLkNvbnN0YW50cy5TVEFHRV9TRVJWSUNFKi8pOgorICAgICAgICAgICAgc3RhZ2VTdHIgPSAiUyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAoNC8qb3JnLmFwYWNoZS5jb3lvdGUuQ29uc3RhbnRzLlNUQUdFX0VORElOUFVUKi8pOgorICAgICAgICAgICAgc3RhZ2VTdHIgPSAiRiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAoNS8qb3JnLmFwYWNoZS5jb3lvdGUuQ29uc3RhbnRzLlNUQUdFX0VORE9VVFBVVCovKToKKyAgICAgICAgICAgIHN0YWdlU3RyID0gIkYiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgKDcvKm9yZy5hcGFjaGUuY295b3RlLkNvbnN0YW50cy5TVEFHRV9FTkRFRCovKToKKyAgICAgICAgICAgIHN0YWdlU3RyID0gIlIiOworICAgICAgICAgICAgZnVsbFN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgKDYvKm9yZy5hcGFjaGUuY295b3RlLkNvbnN0YW50cy5TVEFHRV9LRUVQQUxJVkUqLyk6CisgICAgICAgICAgICBzdGFnZVN0ciA9ICJLIjsKKyAgICAgICAgICAgIGZ1bGxTdGF0dXMgPSB0cnVlOworICAgICAgICAgICAgc2hvd1JlcXVlc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICgwLypvcmcuYXBhY2hlLmNveW90ZS5Db25zdGFudHMuU1RBR0VfTkVXKi8pOgorICAgICAgICAgICAgc3RhZ2VTdHIgPSAiUiI7CisgICAgICAgICAgICBmdWxsU3RhdHVzID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFVua25vd24gc3RhZ2UKKyAgICAgICAgICAgIHN0YWdlU3RyID0gIj8iOworICAgICAgICAgICAgZnVsbFN0YXR1cyA9IGZhbHNlOworCisgICAgICAgIH0KKworICAgICAgICBpZiAobW9kZSA9PSAwKSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjx0ZD48c3Ryb25nPiIpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKHN0YWdlU3RyKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPC9zdHJvbmc+PC90ZD4iKTsKKworICAgICAgICAgICAgaWYgKGZ1bGxTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjx0ZD4iKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0VGltZShtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJyZXF1ZXN0UHJvY2Vzc2luZ1RpbWUiKSwgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjwvdGQ+Iik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8dGQ+Iik7CisgICAgICAgICAgICAgICAgaWYgKHNob3dSZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChmb3JtYXRTaXplKG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJyZXF1ZXN0Qnl0ZXNTZW50IiksIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI/Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPC90ZD4iKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjx0ZD4iKTsKKyAgICAgICAgICAgICAgICBpZiAoc2hvd1JlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFNpemUobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTmFtZSwgInJlcXVlc3RCeXRlc1JlY2VpdmVkIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjwvdGQ+Iik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8dGQ+Iik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KGZpbHRlcihtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTmFtZSwgInJlbW90ZUFkZHIiKSkpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPC90ZD4iKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjx0ZCBub3dyYXA+Iik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGZpbHRlcihtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTmFtZSwgInZpcnR1YWxIb3N0IikpKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjwvdGQ+Iik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8dGQgbm93cmFwPiIpOworICAgICAgICAgICAgICAgIGlmIChzaG93UmVxdWVzdCkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoZmlsdGVyKG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTmFtZSwgIm1ldGhvZCIpKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiICIpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoZmlsdGVyKG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTmFtZSwgImN1cnJlbnRVcmkiKSkpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcXVlcnlTdHJpbmcgPSAoU3RyaW5nKSBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgIChwTmFtZSwgImN1cnJlbnRRdWVyeVN0cmluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHF1ZXJ5U3RyaW5nICE9IG51bGwpICYmICghcXVlcnlTdHJpbmcuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPyIpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KFJlcXVlc3RVdGlsLmZpbHRlcihxdWVyeVN0cmluZykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiICIpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoZmlsdGVyKG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTmFtZSwgInByb3RvY29sIikpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIj8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8L3RkPiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjx0ZD4/PC90ZD48dGQ+PzwvdGQ+PHRkPj88L3RkPjx0ZD4/PC90ZD48dGQ+PzwvdGQ+PHRkPj88L3RkPiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMSl7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjx3b3JrZXIgIik7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBzdGFnZT1cIiIgKyBzdGFnZVN0ciArICJcIiIpOworCisgICAgICAgICAgICBpZiAoZnVsbFN0YXR1cykgeworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIHJlcXVlc3RQcm9jZXNzaW5nVGltZT1cIiIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTmFtZSwgInJlcXVlc3RQcm9jZXNzaW5nVGltZSIpICsgIlwiIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgcmVxdWVzdEJ5dGVzU2VudD1cIiIpOworICAgICAgICAgICAgICAgIGlmIChzaG93UmVxdWVzdCkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiIgKyBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTmFtZSwgInJlcXVlc3RCeXRlc1NlbnQiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIwIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiXCIiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiByZXF1ZXN0Qnl0ZXNSZWNlaXZlZD1cIiIpOworICAgICAgICAgICAgICAgIGlmIChzaG93UmVxdWVzdCkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiIgKyBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTmFtZSwgInJlcXVlc3RCeXRlc1JlY2VpdmVkIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiMCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIlwiIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgcmVtb3RlQWRkcj1cIiIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsdGVyKG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJyZW1vdGVBZGRyIikpICsgIlwiIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgdmlydHVhbEhvc3Q9XCIiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZpbHRlcihtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBOYW1lLCAidmlydHVhbEhvc3QiKSkgKyAiXCIiKTsKKworICAgICAgICAgICAgICAgIGlmIChzaG93UmVxdWVzdCkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBtZXRob2Q9XCIiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWx0ZXIobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJtZXRob2QiKSkgKyAiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgY3VycmVudFVyaT1cIiIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZpbHRlcihtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTmFtZSwgImN1cnJlbnRVcmkiKSkgKyAiXCIiKTsKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcXVlcnlTdHJpbmcgPSAoU3RyaW5nKSBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgIChwTmFtZSwgImN1cnJlbnRRdWVyeVN0cmluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHF1ZXJ5U3RyaW5nICE9IG51bGwpICYmICghcXVlcnlTdHJpbmcuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIGN1cnJlbnRRdWVyeVN0cmluZz1cIiIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBSZXF1ZXN0VXRpbC5maWx0ZXIocXVlcnlTdHJpbmcpICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBjdXJyZW50UXVlcnlTdHJpbmc9XCImIzYzO1wiIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgcHJvdG9jb2w9XCIiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWx0ZXIobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJwcm90b2NvbCIpKSArICJcIiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIG1ldGhvZD1cIiYjNjM7XCIiKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgY3VycmVudFVyaT1cIiYjNjM7XCIiKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgY3VycmVudFF1ZXJ5U3RyaW5nPVwiJiM2MztcIiIpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBwcm90b2NvbD1cIiYjNjM7XCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIHJlcXVlc3RQcm9jZXNzaW5nVGltZT1cIjBcIiIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIHJlcXVlc3RCeXRlc1NlbnQ9XCIwXCIiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiByZXF1ZXN0Qnl0ZXNSZWNpZXZlZD1cIjBcIiIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIHJlbW90ZUFkZHI9XCImIzYzO1wiIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgdmlydHVhbEhvc3Q9XCImIzYzO1wiIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgbWV0aG9kPVwiJiM2MztcIiIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIGN1cnJlbnRVcmk9XCImIzYzO1wiIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgY3VycmVudFF1ZXJ5U3RyaW5nPVwiJiM2MztcIiIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIHByb3RvY29sPVwiJiM2MztcIiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgLz4iKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhcHBsaWNhdGlvbnMgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRGV0YWlsZWRTdGF0ZShQcmludFdyaXRlciB3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQmVhblNlcnZlciBtQmVhblNlcnZlciwgaW50IG1vZGUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChtb2RlID09IDApeworICAgICAgICAgICAgT2JqZWN0TmFtZSBxdWVyeUhvc3RzID0gbmV3IE9iamVjdE5hbWUoIio6ajJlZVR5cGU9V2ViTW9kdWxlLCoiKTsKKyAgICAgICAgICAgIFNldCBob3N0c09OID0gbUJlYW5TZXJ2ZXIucXVlcnlOYW1lcyhxdWVyeUhvc3RzLCBudWxsKTsKKworICAgICAgICAgICAgLy8gTmF2aWdhdGlvbiBtZW51CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxoMT4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiQXBwbGljYXRpb24gbGlzdCIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8L2gxPiIpOworCisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxwPiIpOworICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gaG9zdHNPTi5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgY29udGV4dE9OID0gKE9iamVjdE5hbWUpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgd2ViTW9kdWxlTmFtZSA9IGNvbnRleHRPTi5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICAgICAgICAgIGlmICh3ZWJNb2R1bGVOYW1lLnN0YXJ0c1dpdGgoIi8vIikpIHsKKyAgICAgICAgICAgICAgICAgICAgd2ViTW9kdWxlTmFtZSA9IHdlYk1vZHVsZU5hbWUuc3Vic3RyaW5nKDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgc2xhc2ggPSB3ZWJNb2R1bGVOYW1lLmluZGV4T2YoIi8iKTsKKyAgICAgICAgICAgICAgICBpZiAoc2xhc2ggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8YSBocmVmPVwiIyIgKyAoY291bnQrKykgKyAiLjBcIj4iKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQod2ViTW9kdWxlTmFtZSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8L2E+Iik7CisgICAgICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxicj4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC9wPiIpOworCisgICAgICAgICAgICAvLyBXZWJhcHAgbGlzdAorICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgaXRlcmF0b3IgPSBob3N0c09OLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBjb250ZXh0T04gPSAoT2JqZWN0TmFtZSkgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPGEgY2xhc3M9XCJBLm5hbWVcIiBuYW1lPVwiIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoY291bnQrKykgKyAiLjBcIj4iKTsKKyAgICAgICAgICAgICAgICB3cml0ZUNvbnRleHQod3JpdGVyLCBjb250ZXh0T04sIG1CZWFuU2VydmVyLCBtb2RlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMSl7CisgICAgICAgICAgICAvLyBmb3Igbm93IHdlIGRvbid0IHdyaXRlIG91dCB0aGUgRGV0YWlsZWQgc3RhdGUgaW4gWE1MCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgY29udGV4dCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgd3JpdGVDb250ZXh0KFByaW50V3JpdGVyIHdyaXRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQmVhblNlcnZlciBtQmVhblNlcnZlciwgaW50IG1vZGUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChtb2RlID09IDApeworICAgICAgICAgICAgU3RyaW5nIHdlYk1vZHVsZU5hbWUgPSBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHdlYk1vZHVsZU5hbWU7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIGNvbnRleHROYW1lID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIi8vIikpIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc2xhc2ggPSBuYW1lLmluZGV4T2YoIi8iKTsKKyAgICAgICAgICAgIGlmIChzbGFzaCAhPSAtMSkgeworICAgICAgICAgICAgICAgIGhvc3ROYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgc2xhc2gpOworICAgICAgICAgICAgICAgIGNvbnRleHROYW1lID0gbmFtZS5zdWJzdHJpbmcoc2xhc2gpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgcXVlcnlNYW5hZ2VyID0gbmV3IE9iamVjdE5hbWUKKyAgICAgICAgICAgICAgICAob2JqZWN0TmFtZS5nZXREb21haW4oKSArICI6dHlwZT1NYW5hZ2VyLHBhdGg9IiArIGNvbnRleHROYW1lIAorICAgICAgICAgICAgICAgICArICIsaG9zdD0iICsgaG9zdE5hbWUgKyAiLCoiKTsKKyAgICAgICAgICAgIFNldCBtYW5hZ2Vyc09OID0gbUJlYW5TZXJ2ZXIucXVlcnlOYW1lcyhxdWVyeU1hbmFnZXIsIG51bGwpOworICAgICAgICAgICAgT2JqZWN0TmFtZSBtYW5hZ2VyT04gPSBudWxsOworICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IyID0gbWFuYWdlcnNPTi5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yMi5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBtYW5hZ2VyT04gPSAoT2JqZWN0TmFtZSkgaXRlcmF0b3IyLm5leHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgT2JqZWN0TmFtZSBxdWVyeUpzcE1vbml0b3IgPSBuZXcgT2JqZWN0TmFtZQorICAgICAgICAgICAgICAgIChvYmplY3ROYW1lLmdldERvbWFpbigpICsgIjp0eXBlPUpzcE1vbml0b3IsV2ViTW9kdWxlPSIgKworICAgICAgICAgICAgICAgICB3ZWJNb2R1bGVOYW1lICsgIiwqIik7CisgICAgICAgICAgICBTZXQganNwTW9uaXRvck9OcyA9IG1CZWFuU2VydmVyLnF1ZXJ5TmFtZXMocXVlcnlKc3BNb25pdG9yLCBudWxsKTsKKworICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciB0aGUgcm9vdCBjb250ZXh0CisgICAgICAgICAgICBpZiAoY29udGV4dE5hbWUuZXF1YWxzKCIvIikpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0TmFtZSA9ICIiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxoMT4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChuYW1lKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC9oMT4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC9hPiIpOworCisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxwPiIpOworICAgICAgICAgICAgT2JqZWN0IHN0YXJ0VGltZSA9IG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhcnRUaW1lIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBTdGFydCB0aW1lOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZSgoKExvbmcpIHN0YXJ0VGltZSkubG9uZ1ZhbHVlKCkpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIFN0YXJ0dXAgdGltZTogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0VGltZShtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3ROYW1lLCAic3RhcnR1cFRpbWUiKSwgZmFsc2UpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIFRMRCBzY2FuIHRpbWU6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFRpbWUobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2JqZWN0TmFtZSwgInRsZFNjYW5UaW1lIiksIGZhbHNlKSk7CisgICAgICAgICAgICBpZiAobWFuYWdlck9OICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZU1hbmFnZXIod3JpdGVyLCBtYW5hZ2VyT04sIG1CZWFuU2VydmVyLCBtb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqc3BNb25pdG9yT05zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZUpzcE1vbml0b3Iod3JpdGVyLCBqc3BNb25pdG9yT05zLCBtQmVhblNlcnZlciwgbW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjwvcD4iKTsKKworICAgICAgICAgICAgU3RyaW5nIG9uU3RyID0gb2JqZWN0TmFtZS5nZXREb21haW4oKSAKKyAgICAgICAgICAgICAgICArICI6ajJlZVR5cGU9U2VydmxldCxXZWJNb2R1bGU9IiArIHdlYk1vZHVsZU5hbWUgKyAiLCoiOworICAgICAgICAgICAgT2JqZWN0TmFtZSBzZXJ2bGV0T2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKG9uU3RyKTsKKyAgICAgICAgICAgIFNldCBzZXQgPSBtQmVhblNlcnZlci5xdWVyeU1CZWFucyhzZXJ2bGV0T2JqZWN0TmFtZSwgbnVsbCk7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdEluc3RhbmNlIG9pID0gKE9iamVjdEluc3RhbmNlKSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgd3JpdGVXcmFwcGVyKHdyaXRlciwgb2kuZ2V0T2JqZWN0TmFtZSgpLCBtQmVhblNlcnZlciwgbW9kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDEpeworICAgICAgICAgICAgLy8gZm9yIG5vdyB3ZSBkb24ndCB3cml0ZSBvdXQgdGhlIGNvbnRleHQgaW4gWE1MCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZU1hbmFnZXIoUHJpbnRXcml0ZXIgd3JpdGVyLCBPYmplY3ROYW1lIG9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQmVhblNlcnZlciBtQmVhblNlcnZlciwgaW50IG1vZGUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChtb2RlID09IDApIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPGJyPiIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgQWN0aXZlIHNlc3Npb25zOiAiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAob2JqZWN0TmFtZSwgImFjdGl2ZVNlc3Npb25zIikpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgU2Vzc2lvbiBjb3VudDogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgKG9iamVjdE5hbWUsICJzZXNzaW9uQ291bnRlciIpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIE1heCBhY3RpdmUgc2Vzc2lvbnM6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLCAibWF4QWN0aXZlIikpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgUmVqZWN0ZWQgc2Vzc2lvbiBjcmVhdGlvbnM6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3ROYW1lLCAicmVqZWN0ZWRTZXNzaW9ucyIpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIEV4cGlyZWQgc2Vzc2lvbnM6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3ROYW1lLCAiZXhwaXJlZFNlc3Npb25zIikpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgTG9uZ2VzdCBzZXNzaW9uIGFsaXZlIHRpbWU6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFNlY29uZHMobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlc3Npb25NYXhBbGl2ZVRpbWUiKSkpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgQXZlcmFnZSBzZXNzaW9uIGFsaXZlIHRpbWU6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFNlY29uZHMobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlc3Npb25BdmVyYWdlQWxpdmVUaW1lIikpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIFByb2Nlc3NpbmcgdGltZTogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0VGltZShtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3ROYW1lLCAicHJvY2Vzc2luZ1RpbWUiKSwgZmFsc2UpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDEpIHsKKyAgICAgICAgICAgIC8vIGZvciBub3cgd2UgZG9uJ3Qgd3JpdGUgb3V0IHRoZSB3cmFwcGVyIGRldGFpbHMKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBKU1AgbW9uaXRvcmluZyBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVKc3BNb25pdG9yKFByaW50V3JpdGVyIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBqc3BNb25pdG9yT05zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJlYW5TZXJ2ZXIgbUJlYW5TZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGludCBqc3BDb3VudCA9IDA7CisgICAgICAgIGludCBqc3BSZWxvYWRDb3VudCA9IDA7CisKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGpzcE1vbml0b3JPTnMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIGpzcE1vbml0b3JPTiA9IChPYmplY3ROYW1lKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUoanNwTW9uaXRvck9OLCAianNwQ291bnQiKTsKKyAgICAgICAgICAgIGpzcENvdW50ICs9ICgoSW50ZWdlcikgb2JqKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgb2JqID0gbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKGpzcE1vbml0b3JPTiwgImpzcFJlbG9hZENvdW50Iik7CisgICAgICAgICAgICBqc3BSZWxvYWRDb3VudCArPSAoKEludGVnZXIpIG9iaikuaW50VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtb2RlID09IDApIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPGJyPiIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgSlNQcyBsb2FkZWQ6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGpzcENvdW50KTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIEpTUHMgcmVsb2FkZWQ6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGpzcFJlbG9hZENvdW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDEpIHsKKyAgICAgICAgICAgIC8vIGZvciBub3cgd2UgZG9uJ3Qgd3JpdGUgb3V0IGFueXRoaW5nCisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgd3JhcHBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVXcmFwcGVyKFByaW50V3JpdGVyIHdyaXRlciwgT2JqZWN0TmFtZSBvYmplY3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJlYW5TZXJ2ZXIgbUJlYW5TZXJ2ZXIsIGludCBtb2RlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobW9kZSA9PSAwKSB7CisgICAgICAgICAgICBTdHJpbmcgc2VydmxldE5hbWUgPSBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZ1tdIG1hcHBpbmdzID0gKFN0cmluZ1tdKSAKKyAgICAgICAgICAgICAgICBtQmVhblNlcnZlci5pbnZva2Uob2JqZWN0TmFtZSwgImZpbmRNYXBwaW5ncyIsIG51bGwsIG51bGwpOworICAgICAgICAgICAgCisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxoMj4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChzZXJ2bGV0TmFtZSk7CisgICAgICAgICAgICBpZiAoKG1hcHBpbmdzICE9IG51bGwpICYmIChtYXBwaW5ncy5sZW5ndGggPiAwKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIFsgIik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5ncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQobWFwcGluZ3NbaV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IG1hcHBpbmdzLmxlbmd0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiICwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgXSAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC9oMj4iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8cD4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIFByb2Nlc3NpbmcgdGltZTogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0VGltZShtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3ROYW1lLCAicHJvY2Vzc2luZ1RpbWUiKSwgdHJ1ZSkpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgTWF4IHRpbWU6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFRpbWUobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2JqZWN0TmFtZSwgIm1heFRpbWUiKSwgZmFsc2UpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIFJlcXVlc3QgY291bnQ6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLCAicmVxdWVzdENvdW50IikpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgRXJyb3IgY291bnQ6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLCAiZXJyb3JDb3VudCIpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIExvYWQgdGltZTogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0VGltZShtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3ROYW1lLCAibG9hZFRpbWUiKSwgZmFsc2UpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIENsYXNzbG9hZGluZyB0aW1lOiAiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChmb3JtYXRUaW1lKG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9iamVjdE5hbWUsICJjbGFzc0xvYWRUaW1lIiksIGZhbHNlKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjwvcD4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDEpeworICAgICAgICAgICAgLy8gZm9yIG5vdyB3ZSBkb24ndCB3cml0ZSBvdXQgdGhlIHdyYXBwZXIgZGV0YWlscworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZpbHRlciB0aGUgc3BlY2lmaWVkIG1lc3NhZ2Ugc3RyaW5nIGZvciBjaGFyYWN0ZXJzIHRoYXQgYXJlIHNlbnNpdGl2ZQorICAgICAqIGluIEhUTUwuICBUaGlzIGF2b2lkcyBwb3RlbnRpYWwgYXR0YWNrcyBjYXVzZWQgYnkgaW5jbHVkaW5nIEphdmFTY3JpcHQKKyAgICAgKiBjb2RlcyBpbiB0aGUgcmVxdWVzdCBVUkwgdGhhdCBpcyBvZnRlbiByZXBvcnRlZCBpbiBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmogVGhlIG1lc3NhZ2Ugc3RyaW5nIHRvIGJlIGZpbHRlcmVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyKE9iamVjdCBvYmopIHsKKworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKCI/Iik7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gb2JqLnRvU3RyaW5nKCk7CisKKyAgICAgICAgY2hhciBjb250ZW50W10gPSBuZXcgY2hhclttZXNzYWdlLmxlbmd0aCgpXTsKKyAgICAgICAgbWVzc2FnZS5nZXRDaGFycygwLCBtZXNzYWdlLmxlbmd0aCgpLCBjb250ZW50LCAwKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoY29udGVudC5sZW5ndGggKyA1MCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChjb250ZW50W2ldKSB7CisgICAgICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImbHQ7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImZ3Q7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcmJzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImYW1wOyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiJnF1b3Q7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoY29udGVudFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChyZXN1bHQudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc3BsYXkgdGhlIGdpdmVuIHNpemUgaW4gYnl0ZXMsIGVpdGhlciBhcyBLQiBvciBNQi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYiB0cnVlIHRvIGRpc3BsYXkgbWVnYWJ5dGVzLCBmYWxzZSBmb3Iga2lsb2J5dGVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0U2l6ZShPYmplY3Qgb2JqLCBib29sZWFuIG1iKSB7CisKKyAgICAgICAgbG9uZyBieXRlcyA9IC0xTDsKKworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTG9uZykgeworICAgICAgICAgICAgYnl0ZXMgPSAoKExvbmcpIG9iaikubG9uZ1ZhbHVlKCk7CisgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgYnl0ZXMgPSAoKEludGVnZXIpIG9iaikuaW50VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYikgeworICAgICAgICAgICAgbG9uZyBtYnl0ZXMgPSBieXRlcyAvICgxMDI0ICogMTAyNCk7CisgICAgICAgICAgICBsb25nIHJlc3QgPSAKKyAgICAgICAgICAgICAgICAoKGJ5dGVzIC0gKG1ieXRlcyAqICgxMDI0ICogMTAyNCkpKSAqIDEwMCkgLyAoMTAyNCAqIDEwMjQpOworICAgICAgICAgICAgcmV0dXJuIChtYnl0ZXMgKyAiLiIgKyAoKHJlc3QgPCAxMCkgPyAiMCIgOiAiIikgKyByZXN0ICsgIiBNQiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICgoYnl0ZXMgLyAxMDI0KSArICIgS0IiKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IHRoZSBnaXZlbiB0aW1lIGluIG1zLCBlaXRoZXIgYXMgbXMgb3Igcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWNvbmRzIHRydWUgdG8gZGlzcGxheSBzZWNvbmRzLCBmYWxzZSBmb3IgbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0VGltZShPYmplY3Qgb2JqLCBib29sZWFuIHNlY29uZHMpIHsKKworICAgICAgICBsb25nIHRpbWUgPSAtMUw7CisKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIExvbmcpIHsKKyAgICAgICAgICAgIHRpbWUgPSAoKExvbmcpIG9iaikubG9uZ1ZhbHVlKCk7CisgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgdGltZSA9ICgoSW50ZWdlcikgb2JqKS5pbnRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlY29uZHMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKCgoZmxvYXQpIHRpbWUgKSAvIDEwMDApICsgIiBzIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKHRpbWUgKyAiIG1zIik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZvcm1hdHMgdGhlIGdpdmVuIHRpbWUgKGdpdmVuIGluIHNlY29uZHMpIGFzIGEgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIG9iaiBUaW1lIG9iamVjdCB0byBiZSBmb3JtYXR0ZWQgYXMgc3RyaW5nCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBmb3JtYXR0ZWQgdGltZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdFNlY29uZHMoT2JqZWN0IG9iaikgeworCisgICAgICAgIGxvbmcgdGltZSA9IC0xTDsKKworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTG9uZykgeworICAgICAgICAgICAgdGltZSA9ICgoTG9uZykgb2JqKS5sb25nVmFsdWUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisgICAgICAgICAgICB0aW1lID0gKChJbnRlZ2VyKSBvYmopLmludFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHRpbWUgKyAiIHMiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi93ZWIueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllZDFmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMTg3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCisgICAgdmVyc2lvbj0iMi40Ij4KKworICA8ZGlzcGxheS1uYW1lPlRvbWNhdCBNYW5hZ2VyIEFwcGxpY2F0aW9uPC9kaXNwbGF5LW5hbWU+CisgIDxkZXNjcmlwdGlvbj4KKyAgICBBIHNjcmlwdGFibGUgbWFuYWdlbWVudCB3ZWIgYXBwbGljYXRpb24gZm9yIHRoZSBUb21jYXQgV2ViIFNlcnZlcjsKKwlNYW5hZ2VyIGxldHMgeW91IHZpZXcsIGxvYWQvdW5sb2FkL2V0YyBwYXJ0aWN1bGFyIHdlYiBhcHBsaWNhdGlvbnMuCisgIDwvZGVzY3JpcHRpb24+CisKKyAgPCEtLSBEZWZpbmUgdGhlIE1hbmFnZXIgU2VydmxldAorICAgICAgIENoYW5nZSBzZXJ2bGV0LWNsYXNzIHRvOiBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlcnZsZXRzLkhUTUxNYW5hZ2VyU2VydmxldAorICAgICAgIHRvIGdldCBhIFNlcnZsZXQgd2l0aCBhIG1vcmUgaW50dWl0aXZlIEhUTUwgaW50ZXJmYWNlLCBkb24ndCBjaGFuZ2UgaWYgeW91CisgICAgICAgaGF2ZSBzb2Z0d2FyZSB0aGF0IGlzIGV4cGVjdGVkIHRvIHBhcnNlIHRoZSBvdXRwdXQgZnJvbSBNYW5hZ2VyU2VydmxldAorICAgICAgIHNpbmNlIHRoZXkncmUgbm90IGNvbXBhdGlibGUuCisgICAtLT4KKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5NYW5hZ2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5jYXRhbGluYS5tYW5hZ2VyLk1hbmFnZXJTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+ZGVidWc8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+MjwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICA8L3NlcnZsZXQ+CisgIDxzZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW5hbWU+SFRNTE1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLmNhdGFsaW5hLm1hbmFnZXIuSFRNTE1hbmFnZXJTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+ZGVidWc8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+MjwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICA8L3NlcnZsZXQ+CisgIDxzZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW5hbWU+U3RhdHVzPC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5jYXRhbGluYS5tYW5hZ2VyLlN0YXR1c01hbmFnZXJTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+ZGVidWc8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+MDwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICA8L3NlcnZsZXQ+CisKKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5KTVhQcm94eTwvc2VydmxldC1uYW1lPgorICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUuY2F0YWxpbmEubWFuYWdlci5KTVhQcm94eVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgIDwvc2VydmxldD4KKworICA8IS0tIERlZmluZSB0aGUgTWFuYWdlciBTZXJ2bGV0IE1hcHBpbmcgLS0+CisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5NYW5hZ2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgICA8dXJsLXBhdHRlcm4+L2xpc3Q8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPk1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgIDx1cmwtcGF0dGVybj4vc2Vzc2lvbnM8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPk1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgIDx1cmwtcGF0dGVybj4vc3RhcnQ8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPk1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgIDx1cmwtcGF0dGVybj4vc3RvcDwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+TWFuYWdlcjwvc2VydmxldC1uYW1lPgorICAgICAgPHVybC1wYXR0ZXJuPi9pbnN0YWxsPC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5NYW5hZ2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgICA8dXJsLXBhdHRlcm4+L3JlbW92ZTwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+TWFuYWdlcjwvc2VydmxldC1uYW1lPgorICAgICAgPHVybC1wYXR0ZXJuPi9kZXBsb3k8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPk1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgIDx1cmwtcGF0dGVybj4vdW5kZXBsb3k8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPk1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgIDx1cmwtcGF0dGVybj4vcmVsb2FkPC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5NYW5hZ2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgICA8dXJsLXBhdHRlcm4+L3NhdmU8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPk1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgIDx1cmwtcGF0dGVybj4vc2VydmVyaW5mbzwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+TWFuYWdlcjwvc2VydmxldC1uYW1lPgorICAgICAgPHVybC1wYXR0ZXJuPi9yb2xlczwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+TWFuYWdlcjwvc2VydmxldC1uYW1lPgorICAgICAgPHVybC1wYXR0ZXJuPi9yZXNvdXJjZXM8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPlN0YXR1czwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vc3RhdHVzLyo8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPkpNWFByb3h5PC9zZXJ2bGV0LW5hbWU+CisgICAgICA8dXJsLXBhdHRlcm4+L2pteHByb3h5Lyo8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPkhUTUxNYW5hZ2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPi9odG1sLyo8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKworICA8IS0tIERlZmluZSByZWZlcmVuY2UgdG8gdGhlIHVzZXIgZGF0YWJhc2UgZm9yIGxvb2tpbmcgdXAgcm9sZXMgLS0+CisgIDxyZXNvdXJjZS1lbnYtcmVmPgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgIExpbmsgdG8gdGhlIFVzZXJEYXRhYmFzZSBpbnN0YW5jZSBmcm9tIHdoaWNoIHdlIHJlcXVlc3QgbGlzdHMgb2YKKyAgICAgIGRlZmluZWQgcm9sZSBuYW1lcy4gIFR5cGljYWxseSwgdGhpcyB3aWxsIGJlIGNvbm5lY3RlZCB0byB0aGUgZ2xvYmFsCisgICAgICB1c2VyIGRhdGFiYXNlIHdpdGggYSBSZXNvdXJjZUxpbmsgZWxlbWVudCBpbiBzZXJ2ZXIueG1sIG9yIHRoZSBjb250ZXh0CisgICAgICBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBNYW5hZ2VyIHdlYiBhcHBsaWNhdGlvbi4KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+dXNlcnM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KKyAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPgorICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2UKKyAgICA8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KKyAgPC9yZXNvdXJjZS1lbnYtcmVmPgorCisgIDwhLS0gRGVmaW5lIGEgU2VjdXJpdHkgQ29uc3RyYWludCBvbiB0aGlzIEFwcGxpY2F0aW9uIC0tPgorICA8c2VjdXJpdHktY29uc3RyYWludD4KKyAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICA8d2ViLXJlc291cmNlLW5hbWU+SFRNTE1hbmdlciBhbmQgTWFuYWdlciBjb21tYW5kPC93ZWItcmVzb3VyY2UtbmFtZT4KKyAgICAgIDx1cmwtcGF0dGVybj4vam14cHJveHkvKjwvdXJsLXBhdHRlcm4+CisgICAgICA8dXJsLXBhdHRlcm4+L2h0bWwvKjwvdXJsLXBhdHRlcm4+CisgICAgICA8dXJsLXBhdHRlcm4+L2xpc3Q8L3VybC1wYXR0ZXJuPgorICAgICAgPHVybC1wYXR0ZXJuPi9zZXNzaW9uczwvdXJsLXBhdHRlcm4+CisgICAgICA8dXJsLXBhdHRlcm4+L3N0YXJ0PC91cmwtcGF0dGVybj4KKyAgICAgIDx1cmwtcGF0dGVybj4vc3RvcDwvdXJsLXBhdHRlcm4+CisgICAgICA8dXJsLXBhdHRlcm4+L2luc3RhbGw8L3VybC1wYXR0ZXJuPgorICAgICAgPHVybC1wYXR0ZXJuPi9yZW1vdmU8L3VybC1wYXR0ZXJuPgorICAgICAgPHVybC1wYXR0ZXJuPi9kZXBsb3k8L3VybC1wYXR0ZXJuPgorICAgICAgPHVybC1wYXR0ZXJuPi91bmRlcGxveTwvdXJsLXBhdHRlcm4+CisgICAgICA8dXJsLXBhdHRlcm4+L3JlbG9hZDwvdXJsLXBhdHRlcm4+CisgICAgICA8dXJsLXBhdHRlcm4+L3NhdmU8L3VybC1wYXR0ZXJuPgorICAgICAgPHVybC1wYXR0ZXJuPi9zZXJ2ZXJpbmZvPC91cmwtcGF0dGVybj4KKyAgICAgIDx1cmwtcGF0dGVybj4vc3RhdHVzLyo8L3VybC1wYXR0ZXJuPgorICAgICAgPHVybC1wYXR0ZXJuPi9yb2xlczwvdXJsLXBhdHRlcm4+CisgICAgICA8dXJsLXBhdHRlcm4+L3Jlc291cmNlczwvdXJsLXBhdHRlcm4+CisgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICA8YXV0aC1jb25zdHJhaW50PgorICAgICAgIDwhLS0gTk9URTogIFRoaXMgcm9sZSBpcyBub3QgcHJlc2VudCBpbiB0aGUgZGVmYXVsdCB1c2VycyBmaWxlIC0tPgorICAgICAgIDxyb2xlLW5hbWU+bWFuYWdlcjwvcm9sZS1uYW1lPgorICAgIDwvYXV0aC1jb25zdHJhaW50PgorICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+CisKKyAgPCEtLSBEZWZpbmUgdGhlIExvZ2luIENvbmZpZ3VyYXRpb24gZm9yIHRoaXMgQXBwbGljYXRpb24gLS0+CisgIDxsb2dpbi1jb25maWc+CisgICAgPGF1dGgtbWV0aG9kPkJBU0lDPC9hdXRoLW1ldGhvZD4KKyAgICA8cmVhbG0tbmFtZT5Ub21jYXQgTWFuYWdlciBBcHBsaWNhdGlvbjwvcmVhbG0tbmFtZT4KKyAgPC9sb2dpbi1jb25maWc+CisKKyAgPCEtLSBTZWN1cml0eSByb2xlcyByZWZlcmVuY2VkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uIC0tPgorICA8c2VjdXJpdHktcm9sZT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBUaGUgcm9sZSB0aGF0IGlzIHJlcXVpcmVkIHRvIGxvZyBpbiB0byB0aGUgTWFuYWdlciBBcHBsaWNhdGlvbgorICAgIDwvZGVzY3JpcHRpb24+CisgICAgPHJvbGUtbmFtZT5tYW5hZ2VyPC9yb2xlLW5hbWU+CisgIDwvc2VjdXJpdHktcm9sZT4KKworPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9idWlsZC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTZhZjkwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9idWlsZC54bWwKQEAgLTAsMCArMSwxMjkgQEAKKzxwcm9qZWN0IG5hbWU9Im1hbmFnZXIiIGRlZmF1bHQ9ImJ1aWxkLW1haW4iIGJhc2VkaXI9Ii4iPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSBQcm9wZXJ0eSBWYWx1ZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8IS0tIFNlZSAiYnVpbGQucHJvcGVydGllcy5zYW1wbGUiIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGZvciBhbGwgICAgIC0tPgorICA8IS0tIHByb3BlcnR5IHZhbHVlcyB5b3UgbXVzdCBjdXN0b21pemUgZm9yIHN1Y2Nlc3NmdWwgYnVpbGRpbmchISEgICAgICAgIC0tPgorICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iLi4vYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iLi4vLi4vYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9L2J1aWxkLnByb3BlcnRpZXMiLz4KKworICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiICB2YWx1ZT0ibW9kZXJuIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWJhcHBzLmJ1aWxkIiAgIHZhbHVlPSIuLi9idWlsZCIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViYXBwcy5kaXN0IiAgICB2YWx1ZT0iLi4vZGlzdCIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViYXBwLm5hbWUiICAgICB2YWx1ZT0ibWFuYWdlciIvPgorCisgIDwhLS0gRGVwZW5kZW50IEpBUnMgYW5kIGZpbGVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0ic2VydmxldC1hcGkuamFyIiB2YWx1ZT0iJHthcGkuaG9tZX0vanNyMTU0L2Rpc3QvbGliL3NlcnZsZXQtYXBpLmphciIvPgorICA8cHJvcGVydHkgbmFtZT0ianNwLWFwaS5qYXIiICAgICB2YWx1ZT0iJHthcGkuaG9tZX0vanNyMTUyL2Rpc3QvbGliL2pzcC1hcGkuamFyIi8+CisKKyAgPCEtLSBDb25zdHJ1Y3QgQWRtaW4gY2xhc3NwYXRoIC0tPgorICA8cGF0aCBpZD0ibWFuYWdlci5jbGFzc3BhdGgiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjYXRhbGluYS5kZXBsb3l9L2NsYXNzZXMiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1maWxldXBsb2FkLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sb2dnaW5nLmphcn0iLz4gICAKKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1tb2RlbGVyLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7am14Lmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7c2VydmxldC1hcGkuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqc3AtYXBpLmphcn0iLz4KKyAgPC9wYXRoPgorCisKKwkgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDb3B5IEpBUnMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJICA8dGFyZ2V0IG5hbWU9ImNvcHktZmlsZXVwbG9hZC5qYXIiPgorCSAgICA8Y29weSB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9XRUItSU5GL2xpYiIgZmlsZT0iJHtjb21tb25zLWZpbGV1cGxvYWQuamFyfSIvPgorCSAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5idWlsZH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9pbWFnZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYiLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYvY2xhc3NlcyIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ29weSBTdGF0aWMgRmlsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtc3RhdGljIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlLGNvcHktZmlsZXVwbG9hZC5qYXIiPgorICAgIDxjb3B5IHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImJ1aWxkLioiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PSBCVUlMRDogQ29tcGlsZSBTZXJ2ZXIgQ29tcG9uZW50cyA9PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1tYWluIiBkZXBlbmRzPSJidWlsZC1zdGF0aWMiPgorCisgICAgPCEtLSBUb3AgTGV2ZWwgRGlyZWN0b3J5IC0tPgorICAgIDxzdHlsZSBiYXNlZGlyPSIuLi9kb2NzIgorICAgICAgICAgICBkZXN0ZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9IgorICAgICAgICAgICBleHRlbnNpb249Ii5odG1sIgorICAgICAgICAgICBzdHlsZT0idG9tY2F0LWRvY3MueHNsIgorICAgICAgICAgICBleGNsdWRlcz0iYnVpbGQueG1sIHByb2plY3QueG1sIgorICAgICAgICAgICBpbmNsdWRlcz0ibWFuYWdlci1ob3d0by54bWwsaHRtbC1tYW5hZ2VyLWhvd3RvLnhtbCI+CisgICAgICA8cGFyYW0gbmFtZT0icmVsYXRpdmUtcGF0aCIgZXhwcmVzc2lvbj0iLiIvPgorICAgICAgPHBhcmFtIG5hbWU9InByb2plY3QtbWVudSIgZXhwcmVzc2lvbj0ibm9tZW51Ii8+CisgICAgICA8cGFyYW0gbmFtZT0ic3RhbmRhbG9uZSIgZXhwcmVzc2lvbj0ic3RhbmRhbG9uZSIvPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIEltYWdlcyBTdWJkaXJlY3RvcnkgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vaW1hZ2VzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLi4vZG9jcy9pbWFnZXMiPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJwcmludGVyLmdpZiIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY29weT4KKworICAgIDxqYXZhYyAgIHNyY2Rpcj0iV0VCLUlORi9jbGFzc2VzIiAKKyAgICAgICAgICAgICBkZXN0ZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYvY2xhc3NlcyIKKyAgICAgICAgICAgICBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIgZGVwcmVjYXRpb249IiR7Y29tcGlsZS5kZXByZWNhdGlvbn0iCisgICAgICAgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iCisgICAgICAgICAgICAgZXhjbHVkZXM9IioqL0NWUy8qKiI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYW5hZ2VyLmNsYXNzcGF0aCIgLz4KKyAgICA8L2phdmFjPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBCVUlMRDogUmVidWlsZCBFdmVyeXRoaW5nID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGJ1aWxkLW1haW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYW5kIGJ1aWxkIG1hbmFnZXIgd2ViYXBwIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuZGlzdH0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXN0cmlidXRpb24gRmlsZXMgPT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImJ1aWxkLW1haW4sZGlzdC1wcmVwYXJlIgorICAgZGVzY3JpcHRpb249IkNyZWF0ZSBtYW5hZ2VyIHdlYmFwcCBiaW5hcnkgZGlzdHJpYnV0aW9uIj4KKyAgICAgIDxqYXIgICBqYXJmaWxlPSIke3dlYmFwcHMuZGlzdH0vJHt3ZWJhcHAubmFtZX0ud2FyIgorICAgICAgICAgICAgIGJhc2VkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0iIGluY2x1ZGVzPSIqKiIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1jbGVhbiI+CisgICAgPGRlbHRyZWUgZGlyPSIke2Rpc3QuZGlyfS8ke3dlYmFwcC5uYW1lfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBDb252ZW5pZW50IFN5bm9ueW1zID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGRpc3QtY2xlYW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYnVpbGQgYW5kIGRpc3QgZGlyZWN0b3JpZXMiLz4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL21hbmFnZXIueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9tYW5hZ2VyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmMwMjZlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9tYW5hZ2VyLnhtbApAQCAtMCwwICsxLDE3IEBACis8IS0tCisKKyAgICBDb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIFRvbWNhdCBNYW5hZ2VyIFdlYiBBcHAKKworICAgICRJZCQKKworLS0+CisKKworPENvbnRleHQgZG9jQmFzZT0iJHtjYXRhbGluYS5ob21lfS9zZXJ2ZXIvd2ViYXBwcy9tYW5hZ2VyIgorICAgICAgICAgcHJpdmlsZWdlZD0idHJ1ZSIgYW50aVJlc291cmNlTG9ja2luZz0iZmFsc2UiIGFudGlKQVJMb2NraW5nPSJmYWxzZSI+CisKKyAgPCEtLSBMaW5rIHRvIHRoZSB1c2VyIGRhdGFiYXNlIHdlIHdpbGwgZ2V0IHJvbGVzIGZyb20gLS0+CisgIDxSZXNvdXJjZUxpbmsgbmFtZT0idXNlcnMiIGdsb2JhbD0iVXNlckRhdGFiYXNlIgorICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlIi8+CisKKzwvQ29udGV4dD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvc3RhdHVzLnhzZCBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvc3RhdHVzLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjI2NmRlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9zdGF0dXMueHNkCkBAIC0wLDAgKzEsNjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIGVkaXRlZCB3aXRoIFhNTFNQWSB2NSByZWwuIDQgVSAoaHR0cDovL3d3dy54bWxzcHkuY29tKSBieSBwZXRlciBsaW4gKGNvbnN1bHRhbnQpIC0tPgorPCEtLVczQyBTY2hlbWEgZ2VuZXJhdGVkIGJ5IFhNTFNQWSB2NSByZWwuIDQgVSAoaHR0cDovL3d3dy54bWxzcHkuY29tKS0tPgorPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKwk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdG9yIj4KKwkJPHhzOnNlcXVlbmNlPgorCQkJPHhzOmVsZW1lbnQgbmFtZT0idGhyZWFkSW5mbyIgdHlwZT0idGhyZWFkSW5mbyIvPgorCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVxdWVzdEluZm8iIHR5cGU9InJlcXVlc3RJbmZvIi8+CisJCQk8eHM6ZWxlbWVudCBuYW1lPSJ3b3JrZXJzIiB0eXBlPSJ3b3JrZXJzIi8+CisJCTwveHM6c2VxdWVuY2U+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94czpjb21wbGV4VHlwZT4KKwk8eHM6Y29tcGxleFR5cGUgbmFtZT0ianZtIj4KKwkJPHhzOnNlcXVlbmNlPgorCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWVtb3J5IiB0eXBlPSJtZW1vcnkiLz4KKwkJPC94czpzZXF1ZW5jZT4KKwk8L3hzOmNvbXBsZXhUeXBlPgorCTx4czpjb21wbGV4VHlwZSBuYW1lPSJtZW1vcnkiPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9ImZyZWUiIHR5cGU9InhzOmxvbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0b3RhbCIgdHlwZT0ieHM6bG9uZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9Im1heCIgdHlwZT0ieHM6bG9uZyIgdXNlPSJyZXF1aXJlZCIvPgorCTwveHM6Y29tcGxleFR5cGU+CisJPHhzOmNvbXBsZXhUeXBlIG5hbWU9InJlcXVlc3RJbmZvIj4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhUaW1lIiB0eXBlPSJ4czpsb25nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0icHJvY2Vzc2luZ1RpbWUiIHR5cGU9InhzOmludCIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVlc3RDb3VudCIgdHlwZT0ieHM6bG9uZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9ImVycm9yQ291bnQiIHR5cGU9InhzOmxvbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJieXRlc1JlY2VpdmVkIiB0eXBlPSJ4czpsb25nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0iYnl0ZXNTZW50IiB0eXBlPSJ4czpsb25nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94czpjb21wbGV4VHlwZT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJzdGF0dXMiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0ianZtIiB0eXBlPSJqdm0iLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjb25uZWN0b3IiIHR5cGU9ImNvbm5lY3RvciIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRocmVhZEluZm8iPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9Im1heFRocmVhZHMiIHR5cGU9InhzOmludCIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9Im1pblNwYXJlVGhyZWFkcyIgdHlwZT0ieHM6aW50IiB1c2U9InJlcXVpcmVkIi8+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0ibWF4U3BhcmVUaHJlYWRzIiB0eXBlPSJ4czppbnQiIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjdXJyZW50VGhyZWFkQ291bnQiIHR5cGU9InhzOmludCIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9ImN1cnJlbnRUaHJlYWRzQnVzeSIgdHlwZT0ieHM6aW50IiB1c2U9InJlcXVpcmVkIi8+CisJPC94czpjb21wbGV4VHlwZT4KKwk8eHM6Y29tcGxleFR5cGUgbmFtZT0id29ya2VyIj4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdGFnZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWVzdFByb2Nlc3NpbmdUaW1lIiB0eXBlPSJ4czppbnQiIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1ZXN0Qnl0ZXNTZW50IiB0eXBlPSJ4czpsb25nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWVzdEJ5dGVzUmVjaWV2ZWQiIHR5cGU9InhzOmxvbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZW1vdGVBZGRyIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2aXJ0dWFsSG9zdCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjdXJyZW50VXJpIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjdXJyZW50UXVlcnlTdHJpbmciIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9InByb3RvY29sIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzOmNvbXBsZXhUeXBlPgorCTx4czpjb21wbGV4VHlwZSBuYW1lPSJ3b3JrZXJzIj4KKwkJPHhzOnNlcXVlbmNlPgorCQkJPHhzOmVsZW1lbnQgbmFtZT0id29ya2VyIiB0eXBlPSJ3b3JrZXIiLz4KKwkJPC94czpzZXF1ZW5jZT4KKwk8L3hzOmNvbXBsZXhUeXBlPgorPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL3hmb3JtLnhzbCBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIveGZvcm0ueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Y2VkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL3hmb3JtLnhzbApAQCAtMCwwICsxLDk2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKworPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorICB2ZXJzaW9uPSIxLjAiPgorCisgIDwhLS0gT3V0cHV0IG1ldGhvZCAtLT4KKyAgPHhzbDpvdXRwdXQgZW5jb2Rpbmc9Imlzby04ODU5LTEiCisgICAgICAgICAgICAgIGluZGVudD0ibm8iLz4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzdGF0dXMiPgorICAgIDxodG1sPgorICAgIDxoZWFkPgorICAgIAk8VElUTEU+VG9tY2F0IFN0YXR1czwvVElUTEU+CisJCTxTVFlMRSB0eXBlPSJ0ZXh0L2NzcyI+CisJCQlib2R5LCB0YWJsZSwgdHIsIHRkLCBhLCBkaXYsIHNwYW4geworCQkJCXZlcnRpY2FsLWFsaWduIDogdG9wOworCQkJfQorCQk8L1NUWUxFPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKyAgICAgIDxkaXYgc3R5bGU9J2ZvbnQtc2l6ZToyMHB4Oyc+VG9tY2F0IFN0YXR1czwvZGl2PgorCisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Imp2bSIvPgorICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJjb25uZWN0b3IiLz4KKyAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ianZtIj4KKyAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibWVtb3J5Ii8+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lbW9yeSI+CisgICAgPHRhYmxlPjx0cj4KKyAgICAJCSA8dGQ+PGI+SlZNOjwvYj48L3RkPgorICAgIAkJIDx0ZD48Yj5mcmVlOjwvYj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBmcmVlIi8+PC90ZD4KKyAgICAJCSA8dGQ+PGI+dG90YWw6PC9iPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRvdGFsIi8+PC90ZD4KKyAgICAJCSA8dGQ+PGI+bWF4OjwvYj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtYXgiLz48L3RkPgorICAgIAkgICA8L3RyPgorICAgIDwvdGFibGU+PGhyIC8+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbm5lY3RvciI+CisJIDxiPkNvbm5lY3RvciAtLSA8L2I+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjxiciAvPgorCisgIAk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InRocmVhZEluZm8iLz4KKyAgCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icmVxdWVzdEluZm8iLz4KKyAgCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0id29ya2VycyIvPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0aHJlYWRJbmZvIj4KKyAgICA8dGFibGU+PHRyPgorICAgIAkJIDx0ZD48Yj50aHJlYWRJbmZvIDwvYj48L3RkPgorICAgIAkJIDx0ZD48Yj5tYXhUaHJlYWRzOjwvYj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtYXhUaHJlYWRzIi8+PC90ZD4KKyAgICAJCSA8dGQ+PGI+bWluU3BhcmVUaHJlYWRzOjwvYj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtaW5TcGFyZVRocmVhZHMiLz48L3RkPgorICAgIAkJIDx0ZD48Yj5tYXhTcGFyZVRocmVhZHM6PC9iPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1heFNwYXJlVGhyZWFkcyIvPjwvdGQ+CisgICAgCQkgPHRkPjxiPmN1cnJlbnRUaHJlYWRDb3VudDo8L2I+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY3VycmVudFRocmVhZENvdW50Ii8+PC90ZD4KKyAgICAJCSA8dGQ+PGI+Y3VycmVudFRocmVhZHNCdXN5OjwvYj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjdXJyZW50VGhyZWFkc0J1c3kiLz48L3RkPgorICAgIAkgICA8L3RyPgorICAgIDwvdGFibGU+PGhyIC8+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InJlcXVlc3RJbmZvIj4KKyAgICA8dGFibGU+PHRyPgorICAgIAkJIDx0ZD48Yj5yZXF1ZXN0SW5mbyA8L2I+PC90ZD4KKyAgICAJCSA8dGQ+PGI+bWF4VGltZTo8L2I+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWF4VGltZSIvPjwvdGQ+CisgICAgCQkgPHRkPjxiPnByb2Nlc3NpbmdUaW1lOjwvYj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwcm9jZXNzaW5nVGltZSIvPjwvdGQ+CisgICAgCQkgPHRkPjxiPnJlcXVlc3RDb3VudDo8L2I+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcmVxdWVzdENvdW50Ii8+PC90ZD4KKyAgICAJCSA8dGQ+PGI+ZXJyb3JDb3VudDo8L2I+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZXJyb3JDb3VudCIvPjwvdGQ+CisgICAgCQkgPHRkPjxiPmJ5dGVzUmVjZWl2ZWQ6PC9iPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGJ5dGVzUmVjZWl2ZWQiLz48L3RkPgorICAgIAkJIDx0ZD48Yj5ieXRlc1NlbnQ6PC9iPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGJ5dGVzU2VudCIvPjwvdGQ+CisgICAgCSAgIDwvdHI+CisgICAgPC90YWJsZT48aHIgLz4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0id29ya2VycyI+CisgICA8dGFibGU+CisgICAgPHRyPjx0aD5TdGFnZTwvdGg+PHRoPlRpbWU8L3RoPjx0aD5CIFNlbnQ8L3RoPjx0aD5CIFJlY3Y8L3RoPjx0aD5DbGllbnQ8L3RoPjx0aD5WSG9zdDwvdGg+PHRoPlJlcXVlc3Q8L3RoPjwvdHI+CisgIAk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IndvcmtlciIvPgorCisgICA8L3RhYmxlPjxociAvPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ3b3JrZXIiPgorICAgPHRyPgorICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN0YWdlIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByZXF1ZXN0UHJvY2Vzc2luZ1RpbWUiLz48L3RkPgorICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHJlcXVlc3RCeXRlc1NlbnQiLz48L3RkPgorICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHJlcXVlc3RCeXRlc1JlY2VpdmVkIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByZW1vdGVBZGRyIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2aXJ0dWFsSG9zdCIvPjwvdGQ+CisgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWV0aG9kIi8+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY3VycmVudFVyaSIvPj88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGN1cnJlbnRRdWVyeVN0cmluZyIvPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByb3RvY29sIi8+PC90ZD4KKyAgIDwvdHI+CisgIDwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvd2ViZGF2L1dFQi1JTkYvd2ViLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL3dlYmRhdi9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhYzBhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL3dlYmRhdi9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw5MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgorICAgIHZlcnNpb249IjIuNCI+CisKKyAgPGRpc3BsYXktbmFtZT5XZWJkYXYgQ29udGVudCBNYW5hZ2VtZW50PC9kaXNwbGF5LW5hbWU+CisgIDxkZXNjcmlwdGlvbj4KKyAgICAgV2ViZGF2IENvbnRlbnQgTWFuYWdlbWVudAorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW5hbWU+d2ViZGF2PC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5jYXRhbGluYS5zZXJ2bGV0cy5XZWJkYXZTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+ZGVidWc8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+MDwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+bGlzdGluZ3M8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICAgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gZW5hYmxlIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyAtLT4KKzwhLS0KKyAgICA8aW5pdC1wYXJhbT4KKyAgICAgIDxwYXJhbS1uYW1lPnJlYWRvbmx5PC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CistLT4KKyAgICA8IS0tbG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cC0tPgorICA8L3NlcnZsZXQ+CisKKyAgPCEtLSBUaGUgbWFwcGluZyBmb3IgdGhlIHdlYmRhdiBzZXJ2bGV0IC0tPgorICA8IS0tIFVzaW5nIC8qIGFzIHRoZSBtYXBwaW5nIGVuc3VyZXMgdGhhdCBqYXNwZXIsIHdlbGNvbWUgZmlsZXMgZXRjIGFyZQorICAgICAgIG92ZXItcmlkZGVuIGFuZCBhbGwgcmVxdWVzdHMgYXJlIHByb2Nlc3NlZCBieSB0aGUgd2ViZGF2IHNlcnZsZXQuCisgICAgICAgVGhpcyBhbHNvIG92ZXJjb21lcyBhIG51bWJlciBvZiBpc3N1ZXMgd2l0aCBzb21lIHdlYmRhdiBjbGllbnRzCisgICAgICAgKGluY2x1ZGluZyBNUyBXZWJmb2xkZXJzKSB0aGF0IGRvIG5vdCByZXNwb25kIGNvcnJlY3RseQorIHRvIHRoZQorICAgICAgIHJlZGlyZWN0cyAoMzAyKSB0aGF0IHJlc3VsdCBmcm9tIHVzaW5nIGEgbWFwcGluZyBvZiAvIC0tPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+d2ViZGF2PC9zZXJ2bGV0LW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09IFNlY3VyaXR5IENvbnN0cmFpbnRzIGZvciBUZXN0aW5nID09PT09PT09PT09PT09PSAtLT4KKworPCEtLQorICA8c2VjdXJpdHktY29uc3RyYWludD4KKyAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICA8d2ViLXJlc291cmNlLW5hbWU+VGhlIEVudGlyZSBXZWIgQXBwbGljYXRpb248L3dlYi1yZXNvdXJjZS1uYW1lPgorICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgIDxhdXRoLWNvbnN0cmFpbnQ+CisgICAgICA8cm9sZS1uYW1lPnRvbWNhdDwvcm9sZS1uYW1lPgorICAgIDwvYXV0aC1jb25zdHJhaW50PgorICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+CisKKyAgPGxvZ2luLWNvbmZpZz4KKyAgICA8YXV0aC1tZXRob2Q+QkFTSUM8L2F1dGgtbWV0aG9kPgorICAgIDxyZWFsbS1uYW1lPlRvbWNhdCBTdXBwb3J0ZWQgUmVhbG08L3JlYWxtLW5hbWU+CisgIDwvbG9naW4tY29uZmlnPgorCisgIDxzZWN1cml0eS1yb2xlPgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgIEFuIGV4YW1wbGUgcm9sZSBkZWZpbmVkIGluICJjb25mL3RvbWNhdC11c2Vycy54bWwiCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8cm9sZS1uYW1lPnRvbWNhdDwvcm9sZS1uYW1lPgorICA8L3NlY3VyaXR5LXJvbGU+CistLT4KKworICA8d2VsY29tZS1maWxlLWxpc3Q+CisgICAgPHdlbGNvbWUtZmlsZS8+CisgIDwvd2VsY29tZS1maWxlLWxpc3Q+ICAKKworPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvd2ViZGF2L2J1aWxkLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL3dlYmRhdi9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmYTEyNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL3dlYmRhdi9idWlsZC54bWwKQEAgLTAsMCArMSw3NyBAQAorPHByb2plY3QgbmFtZT0id2ViZGF2IiBkZWZhdWx0PSJidWlsZC1tYWluIiBiYXNlZGlyPSIuIj4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgUHJvcGVydHkgVmFsdWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPCEtLSBTZWUgImJ1aWxkLnByb3BlcnRpZXMuc2FtcGxlIiBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBmb3IgYWxsICAgICAtLT4KKyAgPCEtLSBwcm9wZXJ0eSB2YWx1ZXMgeW91IG11c3QgY3VzdG9taXplIGZvciBzdWNjZXNzZnVsIGJ1aWxkaW5nISEhICAgICAgICAtLT4KKyAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uL2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uLy4uL2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dXNlci5ob21lfS9idWlsZC5wcm9wZXJ0aWVzIi8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiAgdmFsdWU9Im1vZGVybiIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViYXBwcy5idWlsZCIgICB2YWx1ZT0iLi4vYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcHMuZGlzdCIgICAgdmFsdWU9Ii4uL2Rpc3QiLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcC5uYW1lIiAgICAgdmFsdWU9IndlYmRhdiIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDcmVhdGUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSIvPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vV0VCLUlORiIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ29weSBTdGF0aWMgRmlsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtc3RhdGljIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlIj4KKyAgICA8Y29weSB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJidWlsZC4qIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT0gQlVJTEQ6IENvbXBpbGUgU2VydmVyIENvbXBvbmVudHMgPT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtbWFpbiIgZGVwZW5kcz0iYnVpbGQtc3RhdGljIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBSZWJ1aWxkIEV2ZXJ5dGhpbmcgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iYnVpbGQtY2xlYW4sYnVpbGQtbWFpbiIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiBhbmQgYnVpbGQgd2ViZGF2IHdlYmFwcCIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QtcHJlcGFyZSI+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmRpc3R9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDcmVhdGUgRGlzdHJpYnV0aW9uIEZpbGVzID09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJidWlsZC1tYWluLGRpc3QtcHJlcGFyZSIKKyAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgd2ViZGF2IHdlYmFwcCBiaW5hcnkgZGlzdHJpYnV0aW9uIj4KKyAgICAgIDxqYXIgICBqYXJmaWxlPSIke3dlYmFwcHMuZGlzdH0vJHt3ZWJhcHAubmFtZX0ud2FyIgorICAgICAgICAgICAgIGJhc2VkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0iIGluY2x1ZGVzPSIqKiIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdC5kaXJ9LyR7d2ViYXBwLm5hbWV9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IENvbnZlbmllbnQgU3lub255bXMgPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iYnVpbGQtY2xlYW4sZGlzdC1jbGVhbiIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiBidWlsZCBhbmQgZGlzdCBkaXJlY3RvcmllcyIvPgorCisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL3dlYmRhdi9pbmRleC5odG1sIGIvY29udGFpbmVyL3dlYmFwcHMvd2ViZGF2L2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzMzRhNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL3dlYmRhdi9pbmRleC5odG1sCkBAIC0wLDAgKzEsNzYgQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43MiBbZW5dIChXaW5OVDsgVSkgW05ldHNjYXBlXSI+Cis8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IkFuaWwgSy4gVmlqZW5kcmFuIj4KKzx0aXRsZT5Ub21jYXQgV2ViREFWIHN1cHBvcnQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8aW1nIFNSQz0idG9tY2F0LmdpZiIgaGVpZ2h0PTkyIHdpZHRoPTEzMCBhbGlnbj1MRUZUPjxiPjxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiPjxmb250IHNpemU9KzM+VG9tY2F0PC9mb250PjwvZm9udD48L2I+IAorPGJyPgorPGI+PGZvbnQgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiI+PGZvbnQgc2l6ZT0tMT5XZWJEQVYgc3VwcG9ydDwvZm9udD48L2ZvbnQ+PC9iPgorPHA+VGhpcyBpcyB0aGUgaG9tZSBwYWdlIGZvciB0aGUgd2ViZGF2IGNvbnRleHQuIFRoaXMgcGFnZSBpcyBsb2NhdGVkIGF0OgorPHVsPgorPGxpPgorPGZvbnQgZmFjZT0iQ291cmllciBOZXcsIENvdXJpZXIsbW9ubyI+JFRPTUNBVF9IT01FL3dlYmFwcHMvd2ViZGF2L2luZGV4Lmh0bWw8L2ZvbnQ+PC9saT4KKzwvdWw+CisKKzxwPlRvbWNhdCBpbmNsdWRlcyBidWlsdC1pbiBzdXBwb3J0IGZvciBXZWJEQVYgbGV2ZWwgMiwgd2hpY2ggZW5hYmxlcyAKK3JlbW90ZSBhdXRob3Jpbmcgb2YgdGhlIHdlYnNpdGUuIFlvdSBjYW4gdGVzdCB0aGVzZSBjYXBhYmlsaXRpZXMgdXNpbmcgYSBXZWJEQVYKK2NsaWVudCBsaWtlIE1TIFdlYkZvbGRlcnMgKGluY2x1ZGVkIHdpdGggSUUgNC4wIGFuZCB1cCksIE1TIE9mZmljZSAyMDAwLCBEQVYKK0V4cGxvcmVyIChvdGhlcnMgYXJlIGxpc3RlZCBvbiB0aGUgd2VicGFnZXMgbGlua2VkIGJlbG93KSwgYW5kIHBvaW50IHRvIHRoZQorPGI+L3dlYmRhdjwvYj4gcGF0aCBvZiB0aGUgc2VydmVyLgorCis8cD5UaGlzIHRlc3QgY29udGV4dCBpcyBEQVYgZW5hYmxlZCwgYnV0IGhhcyBiZWVuIHNldCB1cCBpbiByZWFkLW9ubHkgbW9kZSBmb3IKK3NhZmV0eSByZWFzb25zLiBJdCBjYW4gYmUgcHV0IGluIHJlYWQtd3JpdGUgbW9kZSBieSBlZGl0aW5nIHRoZSB3ZWIgCithcHBsaWNhdGlvbiBkZXNjcmlwdG9yIGZpbGUgKFdFQi1JTkYvd2ViLnhtbCkuCisKKzxwPlRvIGFkZCByZW1vdGUgYXV0aG9yaW5nIHRvIHlvdXIgd2ViIGFwcGxpY2F0aW9uLCB5b3UgbmVlZCB0byBtYWtlIHRoZSBmb2xsb3dpbmcKK2NoYW5nZXM6Cis8dWw+Cis8bGk+QWRkIHRoZSB3ZWJEQVYgc2VydmxldCB0byB5b3VyIHdlYiBhcHBsaWNhdGlvbi4gU2VlIHRoZSB3ZWIgYXBwbGljYXRpb24KK2RlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgYW4gZXhhbXBsZS4gRG9uJ3QgZm9yZ2V0IHRvIG1ha2UgaXQgcmVhZC93cml0ZS4KKzxsaT5BZGQgYSBzZXJ2bGV0IG1hcHBpbmcgZm9yIHRoZSB3ZWJEQVYgc2VydmxldCB3aXRoIGEgdXJsIHBhdHRlcm4gb2YgIi93ZWJkYXYvKiIKK3RvIHlvdXIgd2ViLnhtbC4KKzxsaT5BZGQgYW4gYXBwcm9wcmlhdGUgc2VjdXJpdHkgY29uc3RyYWludCB0byBwcmV2ZW50IHVuYXV0aG9yaXNlZCBjaGFuZ2VzIHRvIHlvdXIKK3dlYiBhcHBsaWNhdGlvbi4KKzxsaT5Zb3UgY2FuIHRoZW4gZWRpdCB5b3VyIHdlYiBhcHBsaWNhdGlvbiB1c2luZyBhIHdlYkRBViBjbGllbnQgdXNpbmcgYSB1cmwKK2xpa2UgPGZvbnQgZmFjZT0iQ291cmllciBOZXcsIENvdXJpZXIsbW9ubyI+aHR0cDovL2hvc3Q6cG9ydC93ZWJhcHAvd2ViZGF2PC9mb250PjwvbGk+Cis8L3VsPgorCis8cD5Xb3JraW5nIFdlYkRBViBjbGllbnRzIGluY2x1ZGUgOgorPHVsPgorPGxpPkFkb2JlIEdvTGl2ZSA1LjAgKGFuZCBvdGhlciBXZWJEQVYtZW5hYmxlZCBBZG9iZSBwcm9kdWN0cywgbGlrZQorICBQaG90b3Nob3ApPC9saT4KKzxsaT5DYWRhdmVyIDAuMTU8L2xpPgorPGxpPkRBViBFeHBsb3JlciAwLjYwIGFuZCAwLjcwPC9saT4KKzxsaT5JbnRlcm5ldCBFeHBsb3JlciA1IChXaW5kb3dzIDIwMDApPC9saT4KKzxsaT5JbnRlcm5ldCBFeHBsb3JlciA1LjUgKFdpbmRvd3MgMjAwMCk8L2xpPgorPGxpPkpha2FydGEgU2xpZGUgMS4wIFdlYkRBViBjbGllbnQgbGlicmFyeTwvbGk+Cis8bGk+T2ZmaWNlIDIwMDAgKFdpbmRvd3MgMjAwMCk8L2xpPgorPGxpPlNrdW5rREFWIDEuMDwvbGk+Cis8bGk+WHl0aG9zIERyaXZlPC9saT4KKzwvdWw+CisKKzxwPldlYkRBViBsaW5rczo8L3A+Cis8dWw+Cis8bGk+PGI+PGEgaHJlZj0iaHR0cDovL3d3dy53ZWJkYXYub3JnIj5HZW5lcmFsIGluZm8gb24gV2ViREFWPC9hPjwvYj48L2xpPgorPGxpPjxiPjxhIGhyZWY9Imh0dHA6Ly93d3cuaWNzLnVjaS5lZHUvcHViL2lldGYvd2ViZGF2LyI+V2ViREFWIHdvcmtpbmcgCitncm91cDwvYT48L2I+PC9saT4KKzxsaT48Yj48YSBocmVmPSJodHRwOi8vd3d3LndlYmRhdi5vcmcvcHJvamVjdHMvIj5XZWJEQVYgY2xpZW50czwvYT48L2I+PC9saT4KKzxsaT48Yj4KKzxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2xpZGUvIj5UaGUgSmFrYXJ0YSBTbGlkZSBQcm9qZWN0PC9hPgorPC9iPjwvbGk+Cis8L3VsPgorCisKKzxocj4KKzxwIGFsaWduPSJyaWdodCI+PGZvbnQgc2l6ZT0tMT48aW1nIHNyYz0idG9tY2F0LXBvd2VyLmdpZiIgd2lkdGg9Ijc3IiBoZWlnaHQ9IjgwIj48L2ZvbnQ+PGJyPgorJm5ic3A7Cis8Zm9udCBzaXplPS0xPkNvcHlyaWdodCAmY29weTsgMTk5OS0yMDAxIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9mb250Pjxicj4KKzxmb250IHNpemU9LTE+QWxsIFJpZ2h0cyBSZXNlcnZlZDwvZm9udD4gPGJyPgorJm5ic3A7PC9wPgorPHAgYWxpZ249InJpZ2h0Ij4mbmJzcDs8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy93ZWJkYXYvdG9tY2F0LXBvd2VyLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL3dlYmRhdi90b21jYXQtcG93ZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYTc0MDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy93ZWJkYXYvdG9tY2F0LXBvd2VyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy93ZWJkYXYvdG9tY2F0LmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL3dlYmRhdi90b21jYXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNzU2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy93ZWJkYXYvdG9tY2F0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXNwZXIvLmNsYXNzcGF0aCBiL2phc3Blci8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMjQ5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvLmNsYXNzcGF0aApAQCAtMCwwICsxLDEyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvc2hhcmUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJUT01DQVRfTElCU19CQVNFL2NvbW1vbnMtbG9nZ2luZy0xLjAuNC9jb21tb25zLWxvZ2dpbmctYXBpLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IkFOVF9IT01FL2xpYi9hbnQuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iVE9NQ0FUX0xJQlNfQkFTRS9jb21tb25zLWVsLTEuMC9jb21tb25zLWVsLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IlRPTUNBVF9MSUJTX0JBU0UvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmpkdC5jb3JlXzMuMS4xLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IlRPTUNBVF9MSUJTX0JBU0UvanNwLWFwaS0yLjAvbGliL2pzcC1hcGkuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iVE9NQ0FUX0xJQlNfQkFTRS9zZXJ2bGV0LWFwaS0yLjQvbGliL3NlcnZsZXQtYXBpLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qYXNwZXIvLnByb2plY3QgYi9qYXNwZXIvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjMDkyMQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci8ucHJvamVjdApAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5qYXNwZXI8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamFzcGVyL0JVSUxESU5HLnR4dCBiL2phc3Blci9CVUlMRElORy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkMGI1YgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9CVUlMRElORy50eHQKQEAgLTAsMCArMSw3MyBAQAorJElkJAorCisgICAgICAgICBCdWlsZGluZyBUaGUgVG9tY2F0IDQuMCBTZXJ2bGV0L0pTUCBDb250YWluZXIgV2l0aCBKYXNwZXIyCisgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0phc3BlcjIgaXMgYSByZWltcGxlbWVudGF0aW9uIG9mIHRoZSBKU1AgQ29udGFpbmVyIGZvciBUb21jYXQgNC4wIHRoYXQgaXMKK2NsZWFuZXIgYW5kIGVhc2llciB0byBleHRlbmQuICBJdCBhbHNvIGZvcm1zIHRoZSBiYXNpcyBvZiB0aGUgSlNQIDIuMCAKK2ltcGxlbWVudGF0aW9uLiAgSmFzcGVyMiB3aWxsIGV2ZW50dWFsbHkgcmVwbGFjZSB0aGUgSmFzcGVyIG1vZHVsZQorYnVpbHQgaW50byB0aGUgVG9tY2F0IGRpc3RyaWJ1dGlvbi4gIEluIHRoZSBtZWFud2hpbGUsIHlvdSBjYW4gYnVpbGQgSmFzcGVyMgorYWxvbmdzaWRlIFRvbWNhdCA0LjAgYW5kIHJlcGxhY2UgSmFzcGVyLgorCitUbyBidWlsZCBKYXNwZXIyLCBmaXJzdCBtYWtlIHN1cmUgeW91IGhhdmUgYSB3b3JraW5nIGJ1aWxkIGVudmlyb25tZW50IGZvcgorVG9tY2F0IDQuMC4gIFlvdSBjYW4gZG8gc28gYnkgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIEJVSUxESU5HLnR4dAorZmlsZSBpbiB0aGUgVG9tY2F0IDQuMCB3b3Jrc3BhY2UuCisKK09uY2UgeW91IGhhdmUgYSB3b3JraW5nIGJ1aWxkIGVudmlyb25tZW50IGZvciBUb21jYXQgNC4wLCBkbyB0aGUgZm9sbG93aW5nOgorCisoMCkgTW9kaWZ5IHlvdXIgYnVpbGQucHJvcGVydGllcyBmaWxlIGluIFRvbWNhdCA0LjAKKworKiBBZGQgYSBsaW5lIHRvIHlvdXIgYnVpbGQucHJvcGVydGllcyBmaWxlIGZvciBUb21jYXQgNC4wIHRoYXQKKyAgcG9pbnRzIHRoZSBidWlsZCBzY3JpcHQgdG8gSmFzcGVyMiBpbnN0ZWFkIG9mIEphc3BlciwgYXMgZm9sbG93czoKKworICAgICAgIyAtLS0tLSBKYWthcnRhIFRvbWNhdCBKYXNwZXIgc291cmNlIHBhdGggLS0tLS0KKyAgICAgIGphc3Blci5ob21lPSR7YmFzZS5wYXRofS9qYWthcnRhLXRvbWNhdC1qYXNwZXIvamFzcGVyMgorCisgIFRoaXMgZGlyZWN0b3J5IGlzIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBvZiBidWlsZC54bWwgZm9yIFRvbWNhdC4KKworKDEpIFVzZSBhbm9ueW1vdXMgQ1ZTIChhcyBkZXNjcmliZWQgb24gdGhlIEpha2FydGEgd2ViIHNpdGUgYXQKKyAgICA8aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9zaXRlL2N2c2luZGV4Lmh0bWw+LCBvciBkb3dubG9hZCBhIHNvdXJjZQorICAgIGRpc3RyaWJ1dGlvbiBvZiB0aGUgImpha2FydGEtdGFnbGlicyIgcmVwb3NpdG9yeSAoNy8xNS8yMDAyIG9yIGxhdGVyKS4KKworICAgIGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYnVpbGRzL2pha2FydGEtdGFnbGlicy9uaWdodGx5L3Byb2plY3RzL3N0YW5kYXJkLworCisqIFVucGFjayB0aGUgcGFja2FnZSBpbnRvIGEgY29udmVuaWVudCBsb2NhdGlvbiBzbyB0aGF0CisgIGl0IHJlc2lkZXMgaW4gaXRzIG93biBzdWJkaXJlY3RvcnkuCisKKyogRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaW4gQlVJTERJTkcudHh0IHRvIHNldCB1cCB0aGUgY29ycmVjdCAKKyAgYnVpbGQgZW52aXJvbm1lbnQuICBNYWtlIHN1cmUgeW91IGhhdmUgYSB2YWxpZCBidWlsZC5wcm9wZXJ0aWVzIGZpbGUuCisKKyogQ2hhbmdlIGRpcmVjdG9yeSB0byAic3RhbmRhcmQiIGFuZCBidWlsZCB0aGUgc3BlY2lhbCBKU1AgMi4wIGJ1aWxkIHRhcmdldAorICBmb3IgcHJvZHVjaW5nIHRoZSBKU1AgMi4wIEV4cHJlc3Npb24gTGFuZ3VhZ2UgRXZhbHVhdG9yLiAgVGhlIGFudCB0YXJnZXQKKyAgaXMgY2FsbGVkIGpzcDIwZWwuZGlzdC4KKworICAgICAgICBjZCBzdGFuZGFyZAorICAgICAgICBhbnQganNwMjBlbC5kaXN0CisKKygyKSBDdXN0b21pemUgQnVpbGQgUHJvcGVydGllcyBmb3IgdGhpcyBzdWJwcm9qZWN0CisKK01vc3QgSmFrYXJ0YSBzdWJwcm9qZWN0cyBhbGxvdyB5b3UgdG8gY3VzdG9taXplIEFudCBwcm9wZXJ0aWVzICh3aXRoIGRlZmF1bHQKK3ZhbHVlcyBkZWZpbmVkIGluIHRoZSAiYnVpbGQueG1sIiBmaWxlLiAgVGhpcyBpcyBkb25lIGJ5IGNyZWF0aW5nIGEgdGV4dCBmaWxlCituYW1lZCAiYnVpbGQucHJvcGVydGllcyIgaW4gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gZGlyZWN0b3J5IChmb3IgcHJvcGVydHkKK2RlZmluaXRpb25zIGxvY2FsIHRvIHRoaXMgc3VicHJvamVjdCkgYW5kL29yIHlvdXIgdXNlciBob21lIGRpcmVjdG9yeSAoZm9yCitwcm9wZXJ0eSBkZWZpbml0aW9ucyBzaGFyZWQgYWNyb3NzIHN1YnByb2plY3RzKS4gIFlvdSBjYW4gdXNlIHRoZSBpbmNsdWRlZAorImJ1aWxkLnByb3BlcnRpZXMuc2FtcGxlIiBmaWxlIGFzIGEgc3RhcnRpbmcgcG9pbnQgZm9yIHRoaXMuCisKK0phc3BlcjIgaGFzIGV4dGVybmFsIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBzYXRpc2ZpZWQgYnkgY29uZmlndXJpbmcKK2FwcHJvcHJpYXRlIHZhbHVlcyBpbiB5b3VyIGJ1aWxkLnByb3BlcnRpZXMgZmlsZS4gIFRoZSBlYXNpZXN0Cit3YXkgdG8gc2F0aXNmeSB0aGVzZSBkZXBlbmRlbmNpZXMgaXMgdG8gY29weSB0aGUgImJ1aWxkLnByb3BlcnRpZXMuc2FtcGxlIgorZmlsZSAoaW4gdGhlIHRvcC1sZXZlbCBUb21jYXQgc291cmNlIGRpcmVjdG9yeSkgdG8gImJ1aWxkLnByb3BlcnRpZXMiLCBhbmQKK3RoZW4gZWRpdCBpdCB0byBzdWl0IHlvdXIgZW52aXJvbm1lbnQuICBPbiBVbml4LCB0aGlzIHdvdWxkIGJlIGRvbmUgYXM6CisKKyAgY2QgJHtqYXNwZXIyLnNvdXJjZX0KKyAgY3AgYnVpbGQucHJvcGVydGllcy5zYW1wbGUgYnVpbGQucHJvcGVydGllcworICBlbWFjcyBidWlsZC5wcm9wZXJ0aWVzCisKK05PVEU6ICBCZSAqc3VyZSogdGhhdCB5b3UgZG8gbm90IGNoZWNrICJidWlsZC5wcm9wZXJ0aWVzIiBpbiB0byB0aGUgQ1ZTCityZXBvc2l0b3J5LiAgVGhpcyBmaWxlIGlzIGxvY2FsIHRvIHlvdXIgb3duIGRldmVsb3BtZW50IGVudmlyb25tZW50LCBhbmQKK2VhY2ggZGV2ZWxvcGVyIHdpbGwgaGF2ZSB0aGVpciBvd24gdmVyc2lvbi4KKworKDMpIEJ1aWxkIEEgQmluYXJ5IERpc3RyaWJ1dGlvbgorCitKYXNwZXIyIGlzIGJ1aWx0IGFzIHBhcnQgb2YgVG9tY2F0LiAgRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaW4gCitCVUlMRElORy50eHQgaW4gdGhlIFRvbWNhdCBwcm9qZWN0IHRvIGJ1aWxkIFRvbWNhdCB3aXRoIEphc3BlcjIuCmRpZmYgLS1naXQgYS9qYXNwZXIvTElDRU5TRSBiL2phc3Blci9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDU2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvTElDRU5TRQpAQCAtMCwwICsxLDIwMiBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2phc3Blci9SRUFETUUudHh0IGIvamFzcGVyL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0NDlhMAotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9SRUFETUUudHh0CkBAIC0wLDAgKzEsMjQgQEAKK1RoaXMgcHJvamVjdCBpcyBhIHJld3JpdGUgb2YgSmFzcGVyIGZvciB0b21jYXQgNC54LgorCisxLiBNYWluIGdvYWxzOgorCisgICAqIENsZWFudXAgb2YgdGhlIGN1cnJlbnQgSmFzcGVyLgorICAgKiBVc2UgZm9yIFJJIHdvcmsgZm9yIEpTUCAxLjMKKyAgICogVXNlIGZvciBvcHRpbWl6YXRpb24gd29yayBmb3IgZ2VuZXJhdGVkIHNlcnZsZXQgY29kZXMuCisKKzIuIFN0YXR1cworCisgICAqIE1haW4gamFzcGVyIGVuZ2luZSAocGFyc2VyLCBhdHRyaWJ1dGUgdmFsaWRhdGVzLCBjb2RlIGdlbmVyYXRvcikKKyAgICAgYmFzaWNhbGx5IGNvbXBsZXRlLgorCiszLiBUb2RvCisKKyAgICogUmV3cml0ZSBhdHRyaWJ1dGUgcGFyc2VyIGZvciBiZXR0ZXIgc3BlYyBjb21mb3JtYW5jZS4KKyAgICogTW9yZSBjbGVhbnVwLCBlc3BlY2lhbGx5IGpzcGMgcGFydHMuCisgICAqIEFkZGVkIGxhcmdlIGZpbGUgb3B0aW9uLgorICAgKiBFcnJvciBtZXNzYWdlcy4KKyAgICogSlNSMDQ1IHN1cHBvcnQKKyAgICogRXhwcmVzc2lvbiBsYW5ndWFnZSBzdXBwb3J0IChKU1AxLjMpCisgICAqIE9wdGltaXphdGlvbnMsIG9wdGltaXphdGlvbnMsIGFuZCBvcHRpbWl6YXRpb25zCisKKwpkaWZmIC0tZ2l0IGEvamFzcGVyL2J1aWxkLnByb3BlcnRpZXMuc2FtcGxlIGIvamFzcGVyL2J1aWxkLnByb3BlcnRpZXMuc2FtcGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OWEzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvYnVpbGQucHJvcGVydGllcy5zYW1wbGUKQEAgLTAsMCArMSwxNyBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBidWlsZC5wcm9wZXJ0aWVzLnNhbXBsZQorIworIyBUaGlzIGlzIGFuIGV4YW1wbGUgImJ1aWxkLnByb3BlcnRpZXMiIGZpbGUsIHVzZWQgdG8gY3VzdG9taXplIGJ1aWxkaW5nIAorIyBKYXNwZXIyIGZvciB5b3VyIGxvY2FsIGVudmlyb25tZW50LiAgSXQgZGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgYWxsIGV4dGVybmFsCisjIG1vZHVsZXMgdGhhdCBKYXNwZXIyIGRlcGVuZHMgb24uICBDb3B5IHRoaXMgZmlsZSB0byAiYnVpbGQucHJvcGVydGllcyIKKyMgaW4gdGhlIHRvcC1sZXZlbCBzb3VyY2UgZGlyZWN0b3J5LCBhbmQgY3VzdG9taXplIGl0IGFzIG5lZWRlZC4KKyMKKyMgJElkJAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIC0tLS0tIFBvaW50ZXIgdG8gQ2F0YWxpbmEgLS0tLS0KK2NhdGFsaW5hLmhvbWU9Li4vLi4vamFrYXJ0YS10b21jYXQtNS9idWlsZAorCisjIC0tLS0tIFBvaW50ZXIgdG8gSlNQIFN0YW5kYXJkIFRhZyBMaWJyYXJ5IGRpc3RyaWJ1dGlvbiAtLS0tLQorI3N0YW5kYXJkLmhvbWU9JHtiYXNlLnBhdGh9L2pha2FydGEtdGFnbGlicy9zdGFuZGFyZAorI2pzcDIwZWwuamFyPSR7c3RhbmRhcmQuaG9tZX0vLi4vZGlzdC9qc3AyMGVsL2pzcDIwZWwuamFyCmRpZmYgLS1naXQgYS9qYXNwZXIvYnVpbGQueG1sIGIvamFzcGVyL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjFkYWNkCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2J1aWxkLnhtbApAQCAtMCwwICsxLDMwNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8cHJvamVjdCBuYW1lPSJKYXNwZXIyIiBkZWZhdWx0PSJkZXBsb3kiIGJhc2VkaXI9Ii4iPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSBQcm9wZXJ0eSBWYWx1ZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8IS0tIFNlZSAiYnVpbGQucHJvcGVydGllcy5zYW1wbGUiIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGZvciBhbGwgICAgIC0tPgorICA8IS0tIHByb3BlcnR5IHZhbHVlcyB5b3UgbXVzdCBjdXN0b21pemUgZm9yIHN1Y2Nlc3NmdWwgYnVpbGRpbmchISEgICAgICAgIC0tPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9L2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMuc2FtcGxlIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke2NhdGFsaW5hLmhvbWV9L2J1aWxkLnByb3BlcnRpZXMiLz4KKworICA8IS0tIEJ1aWxkIERlZmF1bHRzIC0tPgorICA8cHJvcGVydHkgbmFtZT0iamFzcGVyLmJ1aWxkIiAgICAgIHZhbHVlPSIke2Jhc2VkaXJ9L2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5ob21lIiAgICAgdmFsdWU9Ii4uLy4uL2pha2FydGEtdG9tY2F0LTQuMS9idWlsZCIvPgorICA8cHJvcGVydHkgbmFtZT0iamFzcGVyLmRlcGxveSIgICAgIHZhbHVlPSIke2NhdGFsaW5hLmhvbWV9Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXNwZXIuZGlzdCIgICAgICAgdmFsdWU9IiR7YmFzZWRpcn0vZGlzdCIvPgorICA8cHJvcGVydHkgbmFtZT0idGVzdC5mYWlsb25lcnJvciIgIHZhbHVlPSJ0cnVlIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LnJ1bm5lciIgICAgICAgdmFsdWU9Imp1bml0LnRleHR1aS5UZXN0UnVubmVyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0b29scy5qYXIiICAgICAgICAgdmFsdWU9IiR7amF2YS5ob21lfS9saWIvdG9vbHMuamFyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJhbnQuamFyIiAgICAgICAgICAgdmFsdWU9IiR7YW50LmhvbWV9L2xpYi9hbnQuamFyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2bGV0LWFwaS5qYXIiIHZhbHVlPSIke2FwaS5ob21lfS9qc3IxNTQvZGlzdC9saWIvc2VydmxldC1hcGkuamFyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqc3AtYXBpLmphciIgdmFsdWU9IiR7YXBpLmhvbWV9L2pzcjE1Mi9kaXN0L2xpYi9qc3AtYXBpLmphciIvPgorCisKKyAgPCEtLSBDb25zdHJ1Y3QgSmFzcGVyIGNsYXNzcGF0aCAtLT4KKyAgPHBhdGggaWQ9Imphc3Blci5jbGFzc3BhdGgiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthbnQuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtzZXJ2bGV0LWFwaS5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pzcC1hcGkuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0b29scy5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2phc3Blci1jb21waWxlci1qZHQuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4ZXJjZXMuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4ZXJjZXNJbXBsLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eG1sLWFwaXMuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWVsLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1jb2xsZWN0aW9ucy5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbG9nZ2luZy5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtZGFlbW9uLWxhdW5jaGVyLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amFzcGVyLmJ1aWxkfS9zaGFyZWQvY2xhc3NlcyIvPgorICA8L3BhdGg+CisKKyAgPCEtLSBDb25zdHJ1Y3QgdW5pdCB0ZXN0cyBjbGFzc3BhdGggLS0+CisgIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2FudC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2p1bml0Lmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7c2VydmxldC1hcGkuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqc3AtYXBpLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dG9vbHMuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4ZXJjZXMuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4ZXJjZXNJbXBsLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eG1sLWFwaXMuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWNvbGxlY3Rpb25zLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sYXVuY2hlci5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2phc3Blci5idWlsZH0vc2hhcmVkL2NsYXNzZXMiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amFzcGVyLmJ1aWxkfS90ZXN0cyIvPgorICA8L3BhdGg+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXByZXBhcmUiPgorCisgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9Imp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSIgcHJvcGVydHk9Imp1bml0LnByZXNlbnQiIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ibGF1bmNoZXIucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMubGF1bmNoZXIuTGF1bmNoZXIiCisgICAgIGNsYXNzcGF0aD0iJHtjb21tb25zLWRhZW1vbi1sYXVuY2hlci5qYXJ9Ii8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ibGF1bmNoZXIuYm9vdHN0cmFwLnByZXNlbnQiCisgICAgIGZpbGU9IiR7Y29tbW9ucy1kYWVtb24tbGF1bmNoZXItYm9vdHN0cmFwLmNsYXNzfSIvPgorCisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY29weS5sYXVuY2hlci5qYXJzIj4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtsYXVuY2hlci5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2xhdW5jaGVyLmJvb3RzdHJhcC5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPG1rZGlyIGRpcj0iJHtqYXNwZXIuYnVpbGR9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtqYXNwZXIuYnVpbGR9L2JpbiIvPgorICAgIDxta2RpciBkaXI9IiR7amFzcGVyLmJ1aWxkfS9jb21tb24vY2xhc3NlcyIvPgorICAgIDxta2RpciBkaXI9IiR7amFzcGVyLmJ1aWxkfS9jb21tb24vbGliIi8+CisgICAgPG1rZGlyIGRpcj0iJHtqYXNwZXIuYnVpbGR9L3NoYXJlZC9jbGFzc2VzIi8+CisgICAgPG1rZGlyIGRpcj0iJHtqYXNwZXIuYnVpbGR9L3NoYXJlZC9saWIiLz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ29weSBMYXVuY2hlciBGaWxlcyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iY29weS1sYXVuY2hlci5qYXJzIiBpZj0iY29weS5sYXVuY2hlci5qYXJzIj4KKyAgICA8IS0tIDxjb3B5IHRvZGlyPSIke2phc3Blci5idWlsZH0vY29tbW9uL2xpYiIgZmlsZT0iJHthbnQuamFyfSIvPiAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtqYXNwZXIuYnVpbGR9L2JpbiIgZmlsZT0iJHtjb21tb25zLWRhZW1vbi1sYXVuY2hlci5qYXJ9Ii8+CisgICAgPGNvcHkgdG9kaXI9IiR7amFzcGVyLmJ1aWxkfS9iaW4iIGZpbGU9IiR7Y29tbW9ucy1kYWVtb24tbGF1bmNoZXItYm9vdHN0cmFwLmNsYXNzfSIvPgorICAgIDxjb3B5IHRvZGlyPSIke2phc3Blci5idWlsZH0vYmluIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2JpbiIgaW5jbHVkZXM9IiotdXNpbmctbGF1bmNoZXIuKixsYXVuY2hlci5wcm9wZXJ0aWVzLGphc3Blci54bWwiIC8+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ29weSBTdGF0aWMgRmlsZXMgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtc3RhdGljIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlLGNvcHktbGF1bmNoZXIuamFycyI+CisKKyAgICA8IS0tIEV4ZWN1dGFibGUgQ29tbWFuZHMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7amFzcGVyLmJ1aWxkfS9iaW4iPgorICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvYmluIiBleGNsdWRlcz0iKi11c2luZy1sYXVuY2hlci4qLGxhdW5jaGVyLnByb3BlcnRpZXMsamFzcGVyLnhtbCIgLz4KKyAgICA8L2NvcHk+CisgICAgPGZpeGNybGYgc3JjZGlyPSIke2phc3Blci5idWlsZH0vYmluIiBpbmNsdWRlcz0iKi5zaCIgZW9sPSJsZiIvPgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHtqYXNwZXIuYnVpbGR9L2JpbiIgaW5jbHVkZXM9IiouYmF0IiBlb2w9ImNybGYiLz4KKyAgICA8Y2htb2QgcGVybT0iK3giIGRpcj0iJHtqYXNwZXIuYnVpbGR9L2JpbiIgaW5jbHVkZXM9Iiouc2giLz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT0gQlVJTEQ6IENvbXBpbGUgU2VydmVyIENvbXBvbmVudHMgPT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtbWFpbiIgZGVwZW5kcz0iYnVpbGQtc3RhdGljLGJ1aWxkLW9ubHkiPgorICAgIDwhLS0gRXh0cmEgb3BlcmF0aW9uczogU3VwcG9ydGluZyBKQVIgRmlsZXMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7amFzcGVyLmJ1aWxkfS9zaGFyZWQvbGliIiBmaWxlPSIke2NvbW1vbnMtZWwuamFyfSIvPgorICA8L3RhcmdldD4KKworICA8IS0tIEp1c3QgYnVpbGQgamFzcGVyIC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLW9ubHkiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXNwZXIuY2xhc3NlcyIgdmFsdWU9IiR7amFzcGVyLmJ1aWxkfS9zaGFyZWQvY2xhc3NlcyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXNwZXItY29tcGlsZXIuamFyIiB2YWx1ZT0iJHtqYXNwZXIuYnVpbGR9L3NoYXJlZC9saWIvamFzcGVyLWNvbXBpbGVyLmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXNwZXItcnVudGltZS5qYXIiIHZhbHVlPSIke2phc3Blci5idWlsZH0vc2hhcmVkL2xpYi9qYXNwZXItcnVudGltZS5qYXIiLz4KKworICAgIDwhLS0gQ29tcGlsZSBpbnRlcm5hbCBzZXJ2ZXIgY29tcG9uZW50cyAtLT4KKyAgICA8amF2YWMgc3JjZGlyPSJzcmMvc2hhcmUiIGRlc3RkaXI9IiR7amFzcGVyLmNsYXNzZXN9IgorICAgICAgICAgICBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIKKyAgICAgICAgICAgZGVwcmVjYXRpb249IiR7Y29tcGlsZS5kZXByZWNhdGlvbn0iCisgICAgICAgICAgIHNvdXJjZT0iJHtjb21waWxlLnNvdXJjZX0iCisgICAgICAgICAgIG9wdGltaXplPSIke2NvbXBpbGUub3B0aW1pemV9IgorICAgICAgICAgICBleGNsdWRlcz0iKiovQ1ZTLyoqIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Imphc3Blci5jbGFzc3BhdGgiIC8+CisgICAgPC9qYXZhYz4KKworICAgIDwhLS0gQ29weSBzdGF0aWMgcmVzb3VyY2UgZmlsZXMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7amFzcGVyLmNsYXNzZXN9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3NoYXJlIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZHRkIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorCisgICA8IS0tIEphc3BlciBDb21waWxlciBKQVIgRmlsZSAtLT4KKyAgIDxqYXIgIGphcmZpbGU9IiR7amFzcGVyLWNvbXBpbGVyLmphcn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2phc3Blci5jbGFzc2VzfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyLyoqIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvKioiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvamFzcGVyL3NlcnZsZXQvKioiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvKioiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvamFzcGVyL0NvbnN0YW50cy5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9qYXNwZXIvSmFzcGVyRXhjZXB0aW9uLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2phc3Blci8qLmNsYXNzIiAvPgorICAgICAgICA8IS0tIEphdmFkb2MgYW5kIGkxOG4gZXhjbHVzaW9ucyAtLT4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovcGFja2FnZS5odG1sIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9Mb2NhbFN0cmluZ3NfKiIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2phcj4KKworICAgIDwhLS0gSmFzcGVyIFJ1bnRpbWUgSkFSIEZpbGUgLS0+CisgICAgPGphciAgamFyZmlsZT0iJHtqYXNwZXItcnVudGltZS5qYXJ9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtqYXNwZXIuY2xhc3Nlc30iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2phc3Blci9Db25zdGFudHMuY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvamFzcGVyL0phc3BlckV4Y2VwdGlvbi5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvTG9jYWxpemVyLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2phc3Blci9yZXNvdXJjZXMvKioiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvKioiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvamFzcGVyL3NlY3VyaXR5LyoqIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2phc3Blci91dGlsLyoqIiAvPgorICAgICAgICA8IS0tIEphdmFkb2MgYW5kIGkxOG4gZXhjbHVzaW9ucyAtLT4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovcGFja2FnZS5odG1sIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9Mb2NhbFN0cmluZ3NfKiIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2phcj4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ3JlYXRlIEphc3BlciBKYXZhZG9jcyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iamF2YWRvYyI+CisgICAgPGRlbGV0ZSBkaXI9IiR7amFzcGVyLmJ1aWxkfS9qYXZhZG9jIi8+CisgICAgPG1rZGlyIGRpcj0iJHtqYXNwZXIuYnVpbGR9L2phdmFkb2MiLz4KKyAgICA8amF2YWRvYyBwYWNrYWdlbmFtZXM9Im9yZy5hcGFjaGUuamFzcGVyLioiCisgICAgIGNsYXNzcGF0aHJlZj0iamFzcGVyLmNsYXNzcGF0aCIKKyAgICAgc291cmNlcGF0aD0ic3JjL3NoYXJlIgorICAgICBkZXN0ZGlyPSIke2phc3Blci5idWlsZH0vamF2YWRvYyIKKyAgICAgYXV0aG9yPSJ0cnVlIgorICAgICB2ZXJzaW9uPSJ0cnVlIgorICAgICB3aW5kb3d0aXRsZT0iSmFzcGVyIEludGVybmFsIEFQSSBEb2N1bWVudGF0aW9uIgorICAgICBkb2N0aXRsZT0iSmFzcGVyIEFQSSIKKyAgICAgYm90dG9tPSJDb3B5cmlnaHQgJiMxNjk7IDIwMDAtMjAwNCBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIgorICAgICBhZGRpdGlvbmFscGFyYW09Ii1icmVha2l0ZXJhdG9yIgorICAgIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7amFzcGVyLmJ1aWxkfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IFJlYnVpbGQgRXZlcnl0aGluZyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJidWlsZC1jbGVhbixidWlsZC1tYWluIgorICAgZGVzY3JpcHRpb249IkNsZWFuLCBidWlsZCwgYW5kIGRlcGxveSBKYXNwZXIgY29tcG9uZW50Ii8+CisKKworICA8IS0tID09PT09PT09PT09PT09PSBCVUlMRDogQ29tcGlsZSBVbml0IFRlc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXRlc3RzIiBkZXBlbmRzPSJidWlsZC1tYWluIiBpZj0ianVuaXQucHJlc2VudCI+CisgICAgPG1rZGlyICAgICAgZGlyPSIke2phc3Blci5idWlsZH0vdGVzdHMiLz4KKyAgICA8IS0tIENvbXBpbGUgdW5pdCB0ZXN0IGNsYXNzZXMgLS0+Cis8IS0tCisgICAgPGphdmFjICAgc3JjZGlyPSJzcmMvdGVzdCIgZGVzdGRpcj0iJHtqYXNwZXIuYnVpbGR9L3Rlc3RzIgorICAgICAgICAgICAgIGRlcHJlY2F0aW9uPSIke2NvbXBpbGUuZGVwcmVjYXRpb259IgorICAgICAgICAgICAgIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IgorICAgICAgICAgICAgIHNvdXJjZT0iJHtjb21waWxlLnNvdXJjZX0iCisgICAgICAgICAgICAgb3B0aW1pemU9Im9mZiIKKyAgICAgICAgICAgICBleGNsdWRlcz0iKiovQ1ZTLyoqIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+CisgICAgPC9qYXZhYz4KKy0tPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IEV4ZWN1dGUgVW5pdCBUZXN0cyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdCIgaWY9Imp1bml0LnByZXNlbnQiCisgICBkZXNjcmlwdGlvbj0iUnVuIGFsbCB1bml0IHRlc3QgY2FzZXMiCisgICBkZXBlbmRzPSJidWlsZC10ZXN0cyI+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IERFUExPWTogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkZXBsb3ktcHJlcGFyZSI+CisgICAgPG1rZGlyIGRpcj0iJHtqYXNwZXIuZGVwbG95fSIvPgorICAgIDxta2RpciBkaXI9IiR7amFzcGVyLmRlcGxveX0vYmluIi8+CisgICAgPG1rZGlyIGRpcj0iJHtqYXNwZXIuZGVwbG95fS9jb21tb24vbGliIi8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IERFUExPWTogQ29weSBTdGF0aWMgRmlsZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkZXBsb3ktc3RhdGljIiBkZXBlbmRzPSJidWlsZC1tYWluLGRlcGxveS1wcmVwYXJlIj4KKworICAgIDwhLS0gRXhlY3V0YWJsZSBDb21tYW5kcyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtqYXNwZXIuZGVwbG95fS9iaW4iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2phc3Blci5idWlsZH0vYmluIiAvPgorICAgIDwvY29weT4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7amFzcGVyLmRlcGxveX0vYmluIiBpbmNsdWRlcz0iKi5zaCIgZW9sPSJsZiIvPgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHtqYXNwZXIuZGVwbG95fS9iaW4iIGluY2x1ZGVzPSIqLmJhdCIgZW9sPSJjcmxmIi8+CisgICAgPGNobW9kIHBlcm09Iit4IiBmaWxlPSIke2phc3Blci5kZXBsb3l9L2Jpbi9qc3BjLnNoIi8+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gREVQTE9ZOiBDcmVhdGUgSmFzcGVyIEpBUnMgPT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRlcGxveSIgZGVwZW5kcz0iZGVwbG95LXN0YXRpYyxidWlsZC1tYWluIgorICAgZGVzY3JpcHRpb249IkJ1aWxkIGFuZCBkZXBsb3kgSmFzcGVyIGNvbXBvbmVudCI+CisgICAgPGVjaG8gbWVzc2FnZT0iRGVwbG95IHRvICR7amFzcGVyLmRlcGxveX0vY29tbW9uL2xpYiIgLz4gCisgICAgPCEtLSBKYXNwZXIgQ29tcGlsZXIgSkFSIEZpbGUgLS0+CisgICAgPGNvcHkgZmlsZT0iJHtqYXNwZXIuYnVpbGR9L3NoYXJlZC9saWIvamFzcGVyLWNvbXBpbGVyLmphciIKKyAgICAgICAgICB0b2ZpbGU9IiR7amFzcGVyLmRlcGxveX0vY29tbW9uL2xpYi9qYXNwZXItY29tcGlsZXIuamFyIiAvPgorCisgICAgPGNvcHkgZmlsZT0iJHtqYXNwZXIuYnVpbGR9L3NoYXJlZC9saWIvamFzcGVyLXJ1bnRpbWUuamFyIgorICAgICAgICAgIHRvZmlsZT0iJHtqYXNwZXIuZGVwbG95fS9jb21tb24vbGliL2phc3Blci1ydW50aW1lLmphciIgLz4KKworICAgIDwhLS0gQ29weSBKQVJzIC0tPgorICAgIDxjb3B5IHRvZGlyPSIke2phc3Blci5kZXBsb3l9L2NvbW1vbi9saWIiIGZpbGU9IiR7amFzcGVyLWNvbXBpbGVyLWpkdC5qYXJ9Ii8+CisgICAgPGNvcHkgdG9kaXI9IiR7amFzcGVyLmRlcGxveX0vY29tbW9uL2xpYiIgZmlsZT0iJHtqc3AtYXBpLmphcn0iLz4KKyAgICA8Y29weSB0b2Rpcj0iJHtqYXNwZXIuZGVwbG95fS9jb21tb24vbGliIiBmaWxlPSIke2NvbW1vbnMtZWwuamFyfSIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXN0cmlidXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJidWlsZC1tYWluIgorICAgZGVzY3JpcHRpb249IkNyZWF0ZSBiaW5hcnkgZGlzdHJpYnV0aW9uIj4KKworICAgIDwhLS0gRXhlY3V0YWJsZSBjb21tYW5kcyAtLT4KKyAgICA8bWtkaXIgZGlyPSIke2phc3Blci5kaXN0fS9iaW4iLz4KKyAgICA8Y29weSB0b2Rpcj0iJHtqYXNwZXIuZGlzdH0vYmluIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtqYXNwZXIuYnVpbGR9L2JpbiIgLz4KKyAgICA8L2NvcHk+CisgICAgPGZpeGNybGYgc3JjZGlyPSIke2phc3Blci5kaXN0fS9iaW4iIGluY2x1ZGVzPSIqLnNoIiBlb2w9ImxmIi8+CisgICAgPGZpeGNybGYgc3JjZGlyPSIke2phc3Blci5kaXN0fS9iaW4iIGluY2x1ZGVzPSIqLmJhdCIgZW9sPSJjcmxmIi8+CisgICAgPGNobW9kIHBlcm09Iit4IiBmaWxlPSIke2phc3Blci5kaXN0fS9iaW4vanNwYy5zaCIvPgorCisgICAgPCEtLSBKYXNwZXIgQ29tcGlsZXIgYW5kIFJ1bnRpbWUgSkFSIEZpbGVzIC0tPgorICAgIDxta2RpciBkaXI9IiR7amFzcGVyLmRpc3R9L3NoYXJlZC9saWIiLz4KKyAgICA8Y29weSB0b2Rpcj0iJHtqYXNwZXIuZGlzdH0vc2hhcmVkL2xpYiI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7amFzcGVyLmJ1aWxkfS9zaGFyZWQvbGliIi8+CisgICAgPC9jb3B5PgorCisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QtY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke2phc3Blci5kaXN0fSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBDb252ZW5pZW50IFN5bm9ueW1zID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLCBkaXN0LWNsZWFuIgorICAgZGVzY3JpcHRpb249IkNsZWFuIGJ1aWxkIGFuZCBkaXN0IGRpcmVjdG9yaWVzIi8+CisKKworPC9wcm9qZWN0PgorCmRpZmYgLS1naXQgYS9qYXNwZXIvZG9jL2pzcGMuaHRtbCBiL2phc3Blci9kb2MvanNwYy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOTBkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvZG9jL2pzcGMuaHRtbApAQCAtMCwwICsxLDEzNyBAQAorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT4mbHQ7anNwYyZndDs8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8SDE+IEpzcEMgLS0gQSBDb21tYW5kIExpbmUgSlNQIENvbXBpbGF0aW9uIFRvb2wgPC9IMT4KKzxIMz4kSWQkPC9IMz4KKworPEgyPk9WRVJWSUVXIDwvSDI+CisKK0V2ZW4gdGhvdWdodCB0aGUgcHJpbWFyeSBmb2N1cyBvZiBKU1AgaXMgYXMgYSBjb250YWluZXIgcnVuIGVudmlyb25tZW50LAorc29tZXRpbWVzIGl0IGlzIHVzZWZ1bCB0byBjcmVhdGUgYSBwdXJlIHNlcnZsZXQgb3V0IG9mIHRoZSBKU1AgcGFnZS4KK0pzcEMgZW5jYXBzdWxhdGVzIHRoZSBjb3JlIEpTUCB0byBzZXJ2bGV0IHRyYW5zbGF0aW9uIGludG8gYSBwcm9ncmFtCit0aGF0IGhhcyBubyBkZXBlbmRlbmNpZXMgb24gYSBjb250YWluaW5nIHNlcnZsZXQgZW5naW5lIGFuZCBhbGxvd3MgeW91Cit0byB0cmFuc2xhdGUgSlNQIHBhZ2VzIGludG8gYW4gZXF1aXZhbGVudCBKYXZhIHNlcnZsZXQuCisKKzxIMj5HRU5FUkFMIFVTRSA8L0gyPgorCitUaGUgbW9zdCBiYXNpYyB1c2Ugb2YgSnNwQyBpcyB0byBjb21waWxlIGEgSlNQIHBhZ2UgaW4gcGxhY2Ugd2l0aCB0aGUKK2pzcCBwYWdlKHMpIGFzIHRoZSBhcmd1bWVudHMuICBUaGlzIHdpbGwgY29tcGlsZSB0aGUgcGFnZSB3aXRoIHRoZQorcmVzdWx0aW5nIGphdmEgZmlsZXMgcGxhY2VkIGluIHRoZSBkaXJlY3RvcnkgSnNwQyB3YXMgY2FsbGVkIGZyb20uICBUaGUKK3BhY2thZ2Ugd2lsbCBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIGRpcmVjdG9yaWVzIHRoYXQgdGhlIEpTUCBwYWdlIGxpdmVzCitpbi4gIFRoaXMgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgd2ViLWFwcCBpdCBsaXZlIGluIChpZiBpdCBleGlzdHMgb3IgaXMKK3NwZWNpZmllZCkgb3IgdGhlIGRlZmF1bHQgcGFja2FnZS4gIFRoZSBjbGFzcyBuYW1lIHdpbGwgYmUgdGhlIG5hbWUgb2YKK3RoZSBKU1AgcGFnZSB3aXRob3V0IHRoZSBleHRlbnNpb24uCisKKzxQPlRvIG92ZXJyaWRlIHRoZXNlIGRlZmF1bHQgdmFsdWVzIHlvdSBjYW4gdXNlIHRoZSA8dHQ+LWM8L3R0PiBhbmQgCis8dHQ+LXA8L3R0PiBvcHRpb25zLiAgPHR0Pi1jICZsdDtjbGFzcyBuYW1lJmd0OzwvdHQ+IGNoYW5nZXMgdGhlIG5hbWUgb2YgCit0aGUgY2xhc3Mgb2YgdGhlIGZpcnN0IGNvbXBpbGVkIEpTUCBwYWdlIHRvIHRoZSBjbGFzcyBzcGVjaWZpZWQuCitTdWJzZXF1ZW50IEpTUCBwYWdlcyB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSB0aGlzIG9wdGlvbi4gIFRoZSAKKzx0dD4tcCAmbHQ7cGFja2FnZSBuYW1lJmd0OzwvdHQ+IG9wdGlvbiBzZXRzIHRoZSBwYWNrYWdlIG5hbWUgb2YgYWxsIEpTUCAKK3BhZ2VzIGNvbXBpbGVkIGJ5IHRoYXQgaW52b2NhdGlvbi4gIFdlYi1BcHBzIHNwZWNpZmllZCBmb3IgdHJhbnNsYXRpb24gCit3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBlaXRoZXIgb2YgdGhlc2Ugb3B0aW9ucy48L1A+CisKKzxQPlRoZSBkaXJlY3RvcnkgdGhhdCB0aGUgcmVzdWx0aW5nIGphdmEgZmlsZXMgd2lsbCBnbyBpbnRvIGlzIHNwZWNpZmllZCBieQordGhlIDxUVD4tZCAmbHQ7ZGlyJmd0OzwvVFQ+IGFuZCA8dHQ+LWRkICZsdDtkaXImZ3Q7PC90dD4gb3B0aW9ucy4gIEJvdGgKK29mIHRoZXNlIHNwZWNpZnkgYSBkaXJlY3RvcnkgdGhhdCBmaWxlcyB3aWxsIGJlIHdyaXR0ZW4gaW50by4gIFdoZW4KK3VzaW5nIDx0dD4tZDwvdHQ+IHRoZSBqYXZhIGZpbGVzIHdpbGwgYmUgcGxhY2VkIGluIHBhY2thZ2UgYXBwcm9wcmlhdGUKK3N1YiBkaXJlY3RvcmllcyB3aGlsZSB3aXRoIDx0dD4tZGQ8L3R0PiBhbGwgb2YgdGhlIGphdmEgZmlsZXMgd2lsbCBiZQorcGxhY2VkIGxpdGVyYWxseSBpbnRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5ICh3aXRob3V0IGFueSBzdWJkaXJlY3RvcnkKK3N0cnVjdHVyZSkuPC9QPgorCis8UD5UaGUgYW1vdW50IG9mIGNvbW1hbmQgbGluZSBvdXRwdXQgY2FuIGJlIHRocm90dGxlZCBieSB0aGUgPHR0Pi1xPC90dD4gYW5kIAordGhlIDx0dD4tdiZsdDsjJmd0OzwvdHQ+IG9wdGlvbnMuICA8dHQ+LXE8L3R0PiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzCis8dHQ+LXYwPC90dD4sIHdoaWNoIGlzIHRvIHR1cm4gb2ZmIGFsbCBidXQgZmF0YWwgZXJyb3IgbWVzc2FnZXMuICAKKzx0dD4tdjE8L3R0PiBidWlsZHMgb24gPHR0Pi12MDwvdHQ+IGFuZCBpdCB3aWxsIHByaW50IG91dCBlcnJvciBtZXNzYWdlcywgCis8dHQ+LXYyPC90dD4gYWRkcyB3YXJuaW5ncywgPHR0Pi12MzwvdHQ+IGFkZHMgaW5mb3JtYXRpb25hbCBtZXNzYWdlcwordGhhdCBoYXZlIG5vIG9wZXJhdGlvbmFsIGltcGFjdCwgYW5kIDx0dD4tdjQ8L3R0PiBhZGRzIHZhcmlvdXMgbWVzc2FnZXMKK3VzZWQgaW4gZGVidWdnaW5nIEpzcEMgaXRzZWxmLjwvUD4KKworPFA+PHR0Pi1pZXBsdWdpbjwvdHQ+IGlzIHVzZWQgYnkgdGhlIDx0dD4mbHQ7anNwOnBsdWdpbiZndDs8L3R0PiB0YWdzLgorSWYgdGhlIEphdmEgUGx1Zy1pbiBDT00gQ2xhc3MtSUQgeW91IHdhbnQgdG8gdXNlIGNoYW5nZXMgdGhlbiBpdCBjYW4gYmUKK3NwZWNpZmllZCBoZXJlLiAgVGhpcyBzaG91bGQgbm90IG5lZWQgdG8gYmUgYWx0ZXJlZC48L1A+CisKKzxQPkFzIGFuIGFpZCB0byBtYWtlZmlsZXMsIHRoZSA8dHQ+LWRpZVsjXTwvdHQ+IG9wdGlvbiB3aWxsIGNhdXNlIHRoZQorSlZNIHRvIGV4aXQgd2l0aCBhbiBlcnJvciBjb2RlIGlmIGEgZmF0YWwgZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUKK3RyYW5zbGF0aW9uLiAgIFRoaXMgY2FuIGJlIGNhdXNlZCBieSBzdWNoIHRoaW5ncyBhcyBhbiBpbnZhbGlkIEpTUCAKK29yIGFuIHVud3JpdGFibGUgZGVzdGluYXRpb24uICBUaGVyZSBpcyBhbiBvcHRpb25hbCBudW1iZXIgdGhhdCBjYW4gYmUgCitzcGVjaWZpZWQgdG8gc3BlY2lmeSB0aGUgc3BlY2lmaWMgZXhpdCBjb2RlLCBidXQgaXQgZGVmYXVsdHMgdG8gCis8dHQ+MTwvdHQ+IGlmIGl0IGlzIG5vdCBzcGVjaWZpZWQgb3IgY2Fubm90IGJlIGRlY2lwaGVyZWQuPC9QPgorCis8UD5UaGUgPHR0Pi1tYXBwZWQ8L3R0PiBvcHRpb24gd2lsbCBzcGxpdCB0aGUgSlNQIHRleHQgY29udGVudCBpbnRvIGEKK29uZSBsaW5lIHBlciBjYWxsIGZvcm1hdC4gIFRoZXJlIGFyZSBjb21tZW50cyBhYm92ZSBhbmQgYmVsb3cgdGhlIG1hcHBlZAord3JpdGUgY2FsbHMgdG8gbG9jYWxpemUgd2hlcmUgaW4gdGhlIEpTUCBmaWxlIGVhY2ggbGluZSBvZiB0ZXh0IGNvbWVzCitmcm9tLiAgVGhpcyBjYW4gbGVhZCB0byBhIG1pbm9yIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIChidXQgaXQgaXMgYm91bmQgCitieSBhIGxpbmVhciBjb21wbGV4aXR5KS4gIFdpdGhvdXQgdGhpcyBvcHRpb25zIGFsbCBhZGphY2VudCB3cml0ZXMgYXJlCitjb25jYXRlbmF0ZWQgaW50byBhIHNpbmdsZSB3cml0ZS48L1A+CisKKzxIMj5XRUItQVBQIElOVEVHUkFUSU9OPC9IMj4KKzxQPkpzcEMgaXMgd2ViLWFwcCBhd2FyZS4gIFRoZSBwYWNrYWdlIG5hbWVzIGFuZCBhbGwgcmVsYXRpdmUgdXJpCityZWZlcmVuY2VzIGluIEpTUCBlbGVtZW50cyBhcmUgcm9vdGVkIHRvIGEgd2ViLWFwcCBiYXNlIHRoYXQgaXMgZWl0aGVyCitoZXVyaXN0aWNhbGx5IGRldGVybWluZWQgb3Igc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLjxQPgorCis8UD48dHQ+LXVyaXJvb3QgJmx0O2RpciZndDs8L3R0PiBzcGVjaWZpZXMgdGhlIHJvb3Qgb2YgdGhlIHdlYiAKK2FwcGxpY2F0aW9uLiAgVGhpcyBpcyB3aGVyZSBhbGwgYWJzb2x1dGUgdXJpcyB3aWxsIGJlIHJlc29sdmVkIGZyb20uICAKK0lmIGl0IGlzIG5vdCBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgSlNQIHBhZ2Ugd2lsbCBiZSB1c2VkIHRvIGRlcml2ZSAKK2l0LiAgVG8gZGVyaXZlIGl0IGVhY2ggcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgZmlyc3QgSlNQIHBhZ2UgaXMgCitzZWFyY2hlZCBmb3IgYSA8dHQ+V0VCLUlORjwvdHQ+IGRpcmVjdG9yeSwgYW5kIHRoZSBkaXJlY3RvcnkgY2xvc2VzdCB0byAKK3RoZSBKU1AgcGFnZSB0aGF0IGhhcyBvbmUgd2lsbCBiZSB1c2VkLiAgSWYgbm9uZSBjYW4gYmUgZm91bmQgdGhlbiB0aGUgCitkaXJlY3RvcnkgSnNwQyB3YXMgY2FsbGVkIGZyb20gd2lsbCBiZSB1c2VkLiAgVGhpcyBvbmx5IGFmZmVjdHMgcGFnZXMgCit0cmFuc2xhdGVkIGZyb20gYW4gZXhwbGljaXRseSBkZWNsYXJlZCBKU1AgZmlsZS48L1A+CisKKzxQPjx0dD4tdXJpYmFzZSAmbHQ7dXJpJmd0OzwvdHQ+IGlzIHVzZWQgdG8gZXN0YWJsaXNoIHRoZSB1cmkgY29udGV4dCBvZgorcmVsYXRpdmUgVVJJIHJlZmVyZW5jZXMgaW4gdGhlIEpTUCBwYWdlcy4gIElmIGl0IGRvZXMgbm90IGV4aXN0IHRoZW4gaXQKK2lzIGRlcml2ZWQgZnJvbSB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgcmVsYXRpdmUgdG8gdGhlIGRlY2xhcmVkIG9yIAorZGVyaXZlZCB2YWx1ZSBvZiA8dHQ+LXVyaXJvb3Q8L3R0Pi4gICAgVGhpcyBvbmx5IGFmZmVjdHMgcGFnZXMgCit0cmFuc2xhdGVkIGZyb20gYW4gZXhwbGljaXRseSBkZWNsYXJlZCBKU1AgZmlsZS48L1A+CisKKzxQPiBUaGUganNwIGZpbGVzIG9wdGlvbiBvZiA8dHQ+LXdlYmFwcCAmbHQ7ZGlyJmd0OzwvdHQ+IGlzIHVzZWQgdG8KK3NwZWNpZnkgdGhhdCBhbiBlbnRpcmUgd2ViLWFwcCdzIEpTUCBmaWxlcyBhcmUgdG8gYmUgdHJhbnNsYXRlZC4gIFRoZQordmFsdWUgb2YgPHR0Pi11cmlyb290PC90dD4gZm9yIHRoYXQgZGlyZWN0b3J5IGJlY29tZXMgdGhlIHNwZWNpZmllZAorZGlyZWN0b3J5LCBhbmQgYWxsIHJlbGF0aXZlIHVyaXMgYXJlIHJlc29sdmVkIGFnYWluc3QgdGhlaXIgcG9zaXRpb24gaW4KK3RoZSB3ZWIgYXBwLiAgQ3VycmVudGx5IHNwZWNpZnlpbmcgYSB3YXIsIGphciwgb3IgemlwIGZpbGUgaXMgbm90CitzdXBwb3J0ZWQuICBFYWNoIGRpcmVjdG9yeSBpcyByZWN1cnNpdmVseSBzZWFyY2hlZCBhbmQgYW55IGZpbGUgd2l0aCBhIAorPHR0Pi5qc3A8L3R0PiBleHRlbnNpb24gaXMgcGFyc2VkIGFzIHRob3VnaCBpdCBpcyBhIEpTUCBwYWdlLiAgVGhlc2UKK3BhZ2VzIG9iZXkgdGhlIDx0dD4tZDwvdHQ+LCA8dHQ+LWRkPC90dD4sIGFuZCA8dHQ+LXA8L3R0PiBvcHRpb25zLgorCis8UD5BcHByb3ByaWF0ZSBlbnRyaWVzIGZvciB0aGUgPHR0PndlYi54bWw8L3R0PiBmaWxlIGNhbiBiZSBjcmVhdGVkIHZpYQordGhlIDx0dD4td2ViaW5jICZsdDtmaWxlJmd0OzwvdHQ+IGFuZCA8dHQ+LXdlYnhtbCAmbHQ7ZmlsZSZndDs8L3R0Pgorb3B0aW9ucy4gIEFsbCBKU1AgZmlsZXMgYW5kIHdlYi1hcHBzIHBhcnNlZCBieSB0aGUgc2luZ2xlIGludm9jYXRpb24KK3dpbGwgaGF2ZSBhcHByb3ByaWF0ZSA8dHQ+c2VydmxldDwvdHQ+IGFuZCA8dHQ+c2VydmxldC1tYXBwaW5nPC90dD4gCitlbGVtZW50cyBjcmVhdGVkIGZvciB0aGVtLiAgVGhlIDx0dD53ZWJpbmM8L3R0PiBjcmVhdGVzIG9ubHkgYW4gWE1MCitmcmFnbWVudCBzdWl0YWJsZSBmb3IgaW5jbHVzaW9uIGludG8gYW4gZXhpc3RpbmcgPHR0PndlYi54bWw8L3R0PiBmaWxlLAord2hpbGUgdGhlIDx0dD53ZWJ4bWw8L3R0PiBvcHRpb24gY3JlYXRlcyBhbiBlbnRpcmUgZmlsZSB3aXRoIHRoZSAKK2FwcHJvcHJpYXRlIGhlYWRlcnMgYW5kIHJvb3QgZWxlbWVudHMgc3VpdGFibGUgZm9yIHVzZSBhcyBhIAorPHR0PndlYi54bWw8L3R0PiBmaWxlLjwvUD4KKworPEgyPkNPTU1BTkQgTElORSBTVU1NQVJZPC9IMj4KKzxwcmU+CitVc2FnZToganNwYyAmbHQ7b3B0aW9ucyZndDsgWy0tXSAmbHQ7anNwIGZpbGVzJmd0Oword2hlcmUganNwIGZpbGVzIGlzIGFueSBudW1iZXIgb2Y6CisgICAgJmx0O2ZpbGUmZ3Q7ICAgICAgICAgQSBmaWxlIHRvIGJlIHBhcnNlZCBhcyBhIGpzcCBwYWdlCisgICAgLXdlYmFwcCAmbHQ7ZGlyJmd0OyAgQSBkaXJlY3RvcnkgY29udGFpbmluZyBhIHdlYi1hcHAsIGFsbCBqc3AgcGFnZXMKKyAgICAgICAgICAgICAgICAgICB3aWxsIHJlY3Vyc2l2ZWx5IGJlIHBhcnNlZAord2hlcmUgb3B0aW9ucyBpbmNsdWRlOgorICAgIC1xICAgICAgICAgIFF1aXRlIG1vZGUgKHNhbWUgYXMgLXYwKQorICAgIC12WyNdICAgICAgIFZlcmJvc2UgbW9kZSAob3B0aW9uYWwgbnVtYmVyIGlzIGxldmVsLCBkZWZhdWx0IGlzIDIpCisgICAgLWQgJmx0O2RpciZndDsgICAgT3V0cHV0IERpcmVjdG9yeQorICAgIC1kZCAmbHQ7ZGlyJmd0OyAgIExpdGVyYWwgT3V0cHV0IERpcmVjdG9yeS4gIChwYWNrYWdlIGRpcnMgd2lsbCBub3QgYmUgbWFkZSkKKyAgICAtcCAmbHQ7bmFtZSZndDsgICAgICAgICBOYW1lIG9mIHRhcmdldCBwYWNrYWdlCisgICAgLWMgJmx0O25hbWUmZ3Q7ICAgICAgICAgTmFtZSBvZiB0YXJnZXQgY2xhc3MgbmFtZQorICAgICAgICAgICAgICAgIChvbmx5IGFwcGxpZXMgdG8gZmlyc3QgSlNQIHBhZ2UpCisgICAgLW1hcHBlZCAgICAgR2VuZXJhdGUgc2VwYXJhdGUgd3JpdGUoKSBjYWxscyBmb3IgZWFjaCBIVE1MIGxpbmUgaW4gdGhlIEpTUAorICAgIC1kaWVbI10gICAgIEdlbmVyYXRlIGFuIGVycm9yIHJldHVybiBjb2RlICgjKSBvbiBmYXRhbCBlcnJvcnMuCisgICAgICAgICAgICAgICAgSWYgdGhlIG51bWJlciBpcyBhYnNlbnQgb3IgdW5wYXJzYWJsZSBpdCBkZWZhdWx0cyB0byAxLgorICAgIC11cmliYXNlICZsdDtkaXImZ3Q7ICBUaGUgdXJpIGRpcmVjdG9yeSBjb21waWxhdGlvbnMgc2hvdWxkIGJlIHJlbGF0aXZlIHRvCisgICAgICAgICAgICAgICAgICAgIChEZWZhdWx0IGlzICIvIikKKyAgICAtdXJpcm9vdCAmbHQ7ZGlyJmd0OyAgVGhlIHJvb3QgZGlyZWN0b3J5IHRoYXQgdXJpIGZpbGVzIHNob3VsZCBiZSByZXNvbHZlZAorICAgICAgICAgICAgICAgICAgICBhZ2FpbnN0LCAoRGVmYXVsdCBpcyB0aGUgZGlyZWN0b3J5IGpzcGMgaXMgaW52b2tlZCBmcm9tKQorICAgIC13ZWJpbmMgJmx0O2ZpbGUmZ3Q7ICBDcmVhdGVzIHBhcnRpYWwgc2VydmxldCBtYXBwaW5ncyBmb3IgdGhlIC13ZWJhcHAgb3B0aW9uCisgICAgLXdlYnhtbCAmbHQ7ZmlsZSZndDsgIENyZWF0ZXMgYSBjb21wbGV0ZSB3ZWIueG1sIHdoZW4gdXNpbmcgdGhlIC13ZWJhcHAgb3B0aW9uLgorICAgIC1pZXBsdWdpbiAmbHQ7Y2xzaWQmZ3Q7ICBKYXZhIFBsdWdpbiBjbGFzc2lkIGZvciBJbnRlcm5ldCBFeHBsb3JlcgorICAgIC1zYXgyICZsdDtkcml2ZXJjbGFzc25hbWUmZ3Q7IERyaXZlciBjbGFzcyBuYW1lIGZvciB0aGUgU0FYIDIuMCBwYXJzZXIgdG8gYmUgdXNlZAorPC9wcmU+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvYmluL2phc3Blci5iYXQgYi9qYXNwZXIvc3JjL2Jpbi9qYXNwZXIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZkODdlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL2Jpbi9qYXNwZXIuYmF0CkBAIC0wLDAgKzEsNzEgQEAKK0BlY2hvIG9mZgoraWYgIiVPUyUiID09ICJXaW5kb3dzX05UIiBzZXRsb2NhbAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcmVtIFNjcmlwdCBmb3IgSmFzcGVyIGNvbXBpbGVyCityZW0KK3JlbSBFbnZpcm9ubWVudCBWYXJpYWJsZSBQcmVxdWlzaXRlcworcmVtCityZW0gICBKQVNQRVJfSE9NRSAgIE1heSBwb2ludCBhdCB5b3VyIENhdGFsaW5hICJidWlsZCIgZGlyZWN0b3J5LgorcmVtCityZW0gICBKQVNQRVJfT1BUUyAgIChPcHRpb25hbCkgSmF2YSBydW50aW1lIG9wdGlvbnMgdXNlZCB3aGVuIHRoZSAic3RhcnQiLAorcmVtICAgICAgICAgICAgICAgICAic3RvcCIsIG9yICJydW4iIGNvbW1hbmQgaXMgZXhlY3V0ZWQuCityZW0KK3JlbSAgIEpBVkFfSE9NRSAgICAgTXVzdCBwb2ludCBhdCB5b3VyIEphdmEgRGV2ZWxvcG1lbnQgS2l0IGluc3RhbGxhdGlvbi4KK3JlbQorcmVtICAgSkFWQV9PUFRTICAgICAoT3B0aW9uYWwpIEphdmEgcnVudGltZSBvcHRpb25zIHVzZWQgd2hlbiB0aGUgInN0YXJ0IiwKK3JlbSAgICAgICAgICAgICAgICAgInN0b3AiLCBvciAicnVuIiBjb21tYW5kIGlzIGV4ZWN1dGVkLgorcmVtCityZW0gJElkJAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZW0gR3Vlc3MgSkFTUEVSX0hPTUUgaWYgbm90IGRlZmluZWQKK2lmIG5vdCAiJUpBU1BFUl9IT01FJSIgPT0gIiIgZ290byBnb3RIb21lCitzZXQgSkFTUEVSX0hPTUU9LgoraWYgZXhpc3QgIiVKQVNQRVJfSE9NRSVcYmluXGphc3Blci5iYXQiIGdvdG8gb2tIb21lCitzZXQgSkFTUEVSX0hPTUU9Li4KKzpnb3RIb21lCitpZiBleGlzdCAiJUpBU1BFUl9IT01FJVxiaW5camFzcGVyLmJhdCIgZ290byBva0hvbWUKK2VjaG8gVGhlIEpBU1BFUl9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseQorZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZAorOm9rSG9tZQorCityZW0gR2V0IHN0YW5kYXJkIGVudmlyb25tZW50IHZhcmlhYmxlcworaWYgZXhpc3QgIiVKQVNQRVJfSE9NRSVcYmluXHNldGVudi5iYXQiIGNhbGwgIiVKQVNQRVJfSE9NRSVcYmluXHNldGVudi5iYXQiCisKK3JlbSBHZXQgc3RhbmRhcmQgSmF2YSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK2lmIGV4aXN0ICIlSkFTUEVSX0hPTUUlXGJpblxzZXRjbGFzc3BhdGguYmF0IiBnb3RvIG9rU2V0Y2xhc3NwYXRoCitlY2hvIENhbm5vdCBmaW5kICVKQVNQRVJfSE9NRSVcYmluXHNldGNsYXNzcGF0aC5iYXQKK2VjaG8gVGhpcyBmaWxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZAorOm9rU2V0Y2xhc3NwYXRoCitzZXQgQkFTRURJUj0lSkFTUEVSX0hPTUUlCitjYWxsICIlSkFTUEVSX0hPTUUlXGJpblxzZXRjbGFzc3BhdGguYmF0IgorCityZW0gQWRkIG9uIGV4dHJhIGphciBmaWxlcyB0byBDTEFTU1BBVEgKK2ZvciAlJWkgaW4gKCIlSkFTUEVSX0hPTUUlXGNvbW1vblxlbmRvcnNlZFwqLmphciIpIGRvIGNhbGwgIiVKQVNQRVJfSE9NRSVcYmluXGNwYXBwZW5kLmJhdCIgJSVpCitmb3IgJSVpIGluICgiJUpBU1BFUl9IT01FJVxjb21tb25cbGliXCouamFyIikgZG8gY2FsbCAiJUpBU1BFUl9IT01FJVxiaW5cY3BhcHBlbmQuYmF0IiAlJWkKK2ZvciAlJWkgaW4gKCIlSkFTUEVSX0hPTUUlXHNoYXJlZFxsaWJcKi5qYXIiKSBkbyBjYWxsICIlSkFTUEVSX0hPTUUlXGJpblxjcGFwcGVuZC5iYXQiICUlaQorc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJTslSkFTUEVSX0hPTUUlXHNoYXJlZFxjbGFzc2VzCisKK3JlbSBQYXJzZSBhcmd1bWVudHMKK2lmICIiJTEiIiA9PSAiImpzcGMiIiBnb3RvIGRvSnNwYworZWNobyBVc2FnZTogamFzcGVyICgganNwYyApCitlY2hvIENvbW1hbmRzOgorZWNobyAgIGpzcGMgLSBSdW4gdGhlIG9mZmxpbmUgSlNQIGNvbXBpbGVyCitnb3RvIGVuZAorOmRvSnNwYworc2hpZnQKKworcmVtIEdldCByZW1haW5pbmcgdW5zaGlmdGVkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIHNhdmUgdGhlbSBpbiB0aGUKK3NldCBDTURfTElORV9BUkdTPQorOnNldEFyZ3MKK2lmICIiJTEiIj09IiIiIiBnb3RvIGRvbmVTZXRBcmdzCitzZXQgQ01EX0xJTkVfQVJHUz0lQ01EX0xJTkVfQVJHUyUgJTEKK3NoaWZ0Citnb3RvIHNldEFyZ3MKKzpkb25lU2V0QXJncworCislX1JVTkpBVkElICVKQVZBX09QVFMlICVKQVNQRVJfT1BUUyUgLURqYXZhLmVuZG9yc2VkLmRpcnM9IiVKQVZBX0VORE9SU0VEX0RJUlMlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgLURqYXNwZXIuaG9tZT0iJUpBU1BFUl9IT01FJSIgb3JnLmFwYWNoZS5qYXNwZXIuSnNwQyAlQ01EX0xJTkVfQVJHUyUKKworOmVuZApkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9iaW4vamFzcGVyLnNoIGIvamFzcGVyL3NyYy9iaW4vamFzcGVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYmQ5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL2Jpbi9qYXNwZXIuc2gKQEAgLTAsMCArMSwxMTEgQEAKKyMhL2Jpbi9zaAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTY3JpcHQgZm9yIEphc3BlciBjb21waWxlcgorIworIyBFbnZpcm9ubWVudCBWYXJpYWJsZSBQcmVxdWlzaXRlcworIworIyAgIEpBU1BFUl9IT01FICAgTWF5IHBvaW50IGF0IHlvdXIgQ2F0YWxpbmEgImJ1aWxkIiBkaXJlY3RvcnkuCisjCisjICAgSkFTUEVSX09QVFMgICAoT3B0aW9uYWwpIEphdmEgcnVudGltZSBvcHRpb25zIHVzZWQgd2hlbiB0aGUgInN0YXJ0IiwKKyMgICAgICAgICAgICAgICAgICJzdG9wIiwgb3IgInJ1biIgY29tbWFuZCBpcyBleGVjdXRlZC4KKyMKKyMgICBKQVZBX0hPTUUgICAgIE11c3QgcG9pbnQgYXQgeW91ciBKYXZhIERldmVsb3BtZW50IEtpdCBpbnN0YWxsYXRpb24uCisjCisjICAgSkFWQV9PUFRTICAgICAoT3B0aW9uYWwpIEphdmEgcnVudGltZSBvcHRpb25zIHVzZWQgd2hlbiB0aGUgInN0YXJ0IiwKKyMgICAgICAgICAgICAgICAgICJzdG9wIiwgb3IgInJ1biIgY29tbWFuZCBpcyBleGVjdXRlZC4KKyMKKyMgJElkJAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIE9TIHNwZWNpZmljIHN1cHBvcnQuICAkdmFyIF9tdXN0XyBiZSBzZXQgdG8gZWl0aGVyIHRydWUgb3IgZmFsc2UuCitjeWd3aW49ZmFsc2UKK29zNDAwPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorQ1lHV0lOKikgY3lnd2luPXRydWU7OworT1M0MDAqKSBvczQwMD10cnVlOzsKK2VzYWMKKworIyByZXNvbHZlIGxpbmtzIC0gJDAgbWF5IGJlIGEgc29mdGxpbmsKK1BSRz0iJDAiCisKK3doaWxlIFsgLWggIiRQUkciIF07IGRvCisgIGxzPWBscyAtbGQgIiRQUkciYAorICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgIGlmIGV4cHIgIiRsaW5rIiA6ICcuKi8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICBQUkc9IiRsaW5rIgorICBlbHNlCisgICAgUFJHPWBkaXJuYW1lICIkUFJHImAvIiRsaW5rIgorICBmaQorZG9uZQorCisjIEdldCBzdGFuZGFyZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK1BSR0RJUj1gZGlybmFtZSAiJFBSRyJgCitKQVNQRVJfSE9NRT1gY2QgIiRQUkdESVIvLi4iIDsgcHdkYAoraWYgWyAtciAiJEpBU1BFUl9IT01FIi9iaW4vc2V0ZW52LnNoIF07IHRoZW4KKyAgLiAiJEpBU1BFUl9IT01FIi9iaW4vc2V0ZW52LnNoCitmaQorCisjIEZvciBDeWd3aW4sIGVuc3VyZSBwYXRocyBhcmUgaW4gVU5JWCBmb3JtYXQgYmVmb3JlIGFueXRoaW5nIGlzIHRvdWNoZWQKK2lmICRjeWd3aW47IHRoZW4KKyAgWyAtbiAiJEpBVkFfSE9NRSIgXSAmJiBKQVZBX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkSkFWQV9IT01FImAKKyAgWyAtbiAiJEpBU1BFUl9IT01FIiBdICYmIEpBU1BFUl9IT01FPWBjeWdwYXRoIC0tdW5peCAiJEpBU1BFUl9IT01FImAKKyAgWyAtbiAiJENMQVNTUEFUSCIgXSAmJiBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJENMQVNTUEFUSCJgCitmaQorCisjIEdldCBzdGFuZGFyZCBKYXZhIGVudmlyb25tZW50IHZhcmlhYmxlcworaWYgWyAtciAiJEpBU1BFUl9IT01FIi9iaW4vc2V0Y2xhc3NwYXRoLnNoIF07IHRoZW4KKyAgQkFTRURJUj0iJEpBU1BFUl9IT01FIgorICAuICIkSkFTUEVSX0hPTUUiL2Jpbi9zZXRjbGFzc3BhdGguc2gKK2Vsc2UKKyAgZWNobyAiQ2Fubm90IGZpbmQgJEpBU1BFUl9IT01FL2Jpbi9zZXRjbGFzc3BhdGguc2giCisgIGVjaG8gIlRoaXMgZmlsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbSIKKyAgZXhpdCAxCitmaQorCisjIEFkZCBvbiBleHRyYSBqYXIgZmlsZXMgdG8gQ0xBU1NQQVRICitmb3IgaSBpbiAiJEpBU1BFUl9IT01FIi9jb21tb24vZW5kb3JzZWQvKi5qYXI7IGRvCisgIENMQVNTUEFUSD0iJENMQVNTUEFUSCI6IiRpIgorZG9uZQorZm9yIGkgaW4gIiRKQVNQRVJfSE9NRSIvY29tbW9uL2xpYi8qLmphcjsgZG8KKyAgQ0xBU1NQQVRIPSIkQ0xBU1NQQVRIIjoiJGkiCitkb25lCitmb3IgaSBpbiAiJEpBU1BFUl9IT01FIi9zaGFyZWQvbGliLyouamFyOyBkbworICBDTEFTU1BBVEg9IiRDTEFTU1BBVEgiOiIkaSIKK2RvbmUKK0NMQVNTUEFUSD0iJENMQVNTUEFUSCI6IiRKQVNQRVJfSE9NRSIvc2hhcmVkL2NsYXNzZXMKKworIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgJGN5Z3dpbjsgdGhlbgorICBKQVZBX0hPTUU9YGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAiJEpBVkFfSE9NRSJgCisgIEpBU1BFUl9IT01FPWBjeWdwYXRoIC0tcGF0aCAtLXdpbmRvd3MgIiRKQVNQRVJfSE9NRSJgCisgIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS13aW5kb3dzICIkQ0xBU1NQQVRIImAKK2ZpCisKKyMgLS0tLS0gRXhlY3V0ZSBUaGUgUmVxdWVzdGVkIENvbW1hbmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaWYgWyAiJDEiID0gImpzcGMiIF0gOyB0aGVuCisKKyAgc2hpZnQKKyAgZXhlYyAiJF9SVU5KQVZBIiAkSkFWQV9PUFRTICRKQVNQRVJfT1BUUyBcCisgICAgLURqYXZhLmVuZG9yc2VkLmRpcnM9IiRKQVZBX0VORE9SU0VEX0RJUlMiIC1jbGFzc3BhdGggIiRDTEFTU1BBVEgiIFwKKyAgICAtRGphc3Blci5ob21lPSIkSkFTUEVSX0hPTUUiIFwKKyAgICAtRGNhdGFsaW5hLmhvbWU9IiRKQVNQRVJfSE9NRSIgXAorICAgIG9yZy5hcGFjaGUuamFzcGVyLkpzcEMgIiRAIgorCitlbGlmIFsgIiQxIiA9ICJkZWJ1ZyIgXSA7IHRoZW4KKworICBzaGlmdAorICBleGVjICIkX1JVTkpEQiIgJEpBVkFfT1BUUyAkSkFTUEVSX09QVFMgXAorICAgIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIkSkFWQV9FTkRPUlNFRF9ESVJTIiAtY2xhc3NwYXRoICIkQ0xBU1NQQVRIIiBcCisgICAgLURqYXNwZXIuaG9tZT0iJEpBU1BFUl9IT01FIiBcCisgICAgLURjYXRhbGluYS5ob21lPSIkSkFTUEVSX0hPTUUiIFwKKyAgICBvcmcuYXBhY2hlLmphc3Blci5Kc3BDICIkQCIKKworZWxzZQorCisgIGVjaG8gIlVzYWdlOiBqYXNwZXIuc2ggKCBqc3BjICkiCisgIGVjaG8gIkNvbW1hbmRzOiIKKyAgZWNobyAiICBqc3BjIC0gUnVuIHRoZSBvZmZsaW5lIEpTUCBjb21waWxlciIKKyAgZXhpdCAxCisKK2ZpCmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL2Jpbi9qYXNwZXIueG1sIGIvamFzcGVyL3NyYy9iaW4vamFzcGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmMxMTUwCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9iaW4vamFzcGVyLnhtbApAQCAtMCwwICsxLDk3IEBACis8IS0tCisKKyAgWE1MIGZpbGUgZm9yIGxhdW5jaGluZyBKYXNwZXIgYXBwbGljYXRpb25zIHVzaW5nIHRoZSBMYXVuY2hlci4KKworICBUbyBydW4gYW55IG9mIHRoZSBhcHBsaWNhdGlvbnMgaW4gdGhlIEpEQiBkZWJ1Z2dlciwgZXhlY3V0ZSB0aGUgTGF1bmNoZXIgd2l0aAorICBhICItRGRlYnVnPXRydWUiIGFyZ3VtZW50LgorCisgIFRvIHJ1biBhbnkgb2YgdGhlIGFwcGxpY2F0aW9ucyBpbiBKUERBIG1vZGUsIGV4ZWN1dGUgdGhlIExhdW5jaGVyIHdpdGggYQorICAiLURqcGRhPXRydWUiIGFyZ3VtZW50LgorCistLT4KKworPHByb2plY3QgbmFtZT0iSmFzcGVyIExhdW5jaGVyIiBkZWZhdWx0PSJqc3BjIiBiYXNlZGlyPSIuIj4KKworICA8IS0tIFNldCB0aGUgYXBwbGljYXRpb24gaG9tZSB0byB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGlzIGRpcmVjdG9yeSAtLT4KKyAgPHByb3BlcnR5IG5hbWU9Imphc3Blci5ob21lIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLiIvPgorCisgIDwhLS0gSW1wb3J0IHRoZSB1c2VyJ3MgY3VzdG9tIHByb3BlcnRpZXMgLS0+CisgIDxwcm9wZXJ0eSBmaWxlPSIke2phc3Blci5ob21lfS9iaW4vamFzcGVyLnByb3BlcnRpZXMiLz4KKworICA8IS0tIFNldCB1c2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0iamFzcGVyLmp2bS5hcmdzIiB2YWx1ZT0iIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXNwZXIuc291cmNlLnBhdGgiIHZhbHVlPSIke2phc3Blci5ob21lfS8uLi8uLi9qYWthcnRhLXNlcnZsZXRhcGktNS9zcmMvc2hhcmU6JHtqYXNwZXIuaG9tZX0vLi4vLi4vamFrYXJ0YS10b21jYXQtamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlIi8+CisKKyAgPCEtLSBCdWlsZCB0aGUgY2xhc3NwYXRoIHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbiBob21lIC0tPgorICA8cGF0aCBpZD0iYmFzZS5jbGFzcy5wYXRoIj4KKyAgICA8ZmlsZXNldCBkaXI9IiR7amFzcGVyLmhvbWV9L2NvbW1vbi9saWIiIGluY2x1ZGVzPSIqLmphciIvPgorICAgIDxmaWxlc2V0IGRpcj0iJHtqYXNwZXIuaG9tZX0vY29tbW9uL2VuZG9yc2VkIiBpbmNsdWRlcz0iKi5qYXIiLz4KKyAgICA8ZmlsZXNldCBkaXI9IiR7amFzcGVyLmhvbWV9L3NoYXJlZC9saWIiIGluY2x1ZGVzPSIqLmphciIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXNwZXIuaG9tZX0vc2hhcmVkL2NsYXNzZXMiLz4KKyAgPC9wYXRoPgorCisgIDwhLS0gQnVpbGQgdGhlIHN5c3Byb3BlcnRpZXMgcmVsYXRpdmUgdG8gdGhlIGFwcGxpY2F0aW9uIGhvbWUgLS0+CisgIDxzeXNwcm9wZXJ0eXNldCBpZD0iYmFzZS5zeXMucHJvcGVydGllcyI+CisgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YS5lbmRvcnNlZC5kaXJzIiBmaWxlPSIke2phc3Blci5ob21lfS9jb21tb24vZW5kb3JzZWQiLz4KKyAgICA8c3lzcHJvcGVydHkga2V5PSJqYXNwZXIuaG9tZSIgZmlsZT0iJHtqYXNwZXIuaG9tZX0iLz4KKyAgPC9zeXNwcm9wZXJ0eXNldD4KKworICA8IS0tIEJ1aWxkIHRoZSBzdGFuZGFyZCBqdm1hcmdzIC0tPgorICA8anZtYXJnc2V0IGlkPSJiYXNlLmp2bS5hcmdzIj4KKyAgICA8anZtYXJnIGxpbmU9IiR7amFzcGVyLmp2bS5hcmdzfSIvPgorICAgIDxqdm1hcmcgdmFsdWU9Ii1YZGVidWciIGlmPSJqcGRhLnNldHRpbmdzIi8+CisgICAgPGp2bWFyZyB2YWx1ZT0iLVhydW5qZHdwOiR7anBkYS5zZXR0aW5nc30iIGlmPSJqcGRhLnNldHRpbmdzIi8+CisgICAgPGp2bWFyZyB2YWx1ZT0iLXNvdXJjZXBhdGgiIGlmPSJqZGIiLz4KKyAgICA8anZtYXJnIHBhdGg9IiR7amFzcGVyLnNvdXJjZS5wYXRofSIgaWY9ImpkYiIvPgorICA8L2p2bWFyZ3NldD4KKworICA8IS0tIFRhcmdldCB0aGF0IHNldHMgSkRCIHByb3BlcnRpZXMgd2hlbiB0aGUgImRlYnVnIiBwcm9wZXJ0eSBpcyBzZXQgLS0+CisgIDx0YXJnZXQgbmFtZT0ic2V0amRiIiBkZXNjcmlwdGlvbj0iU2V0IEpEQiBwcm9wZXJ0aWVzIiBpZj0iZGVidWciPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImpkYiIgdmFsdWU9InRydWUiLz4KKworICA8L3RhcmdldD4KKworICA8IS0tIFRhcmdldCB0aGF0IHNldHMgSlBEQSBwcm9wZXJ0aWVzIHdoZW4gdGhlICJqcGRhIiBwcm9wZXJ0eSBpcyBzZXQgLS0+CisgIDx0YXJnZXQgbmFtZT0ic2V0anBkYSIgZGVzY3JpcHRpb249IlNldCBKUERBIHByb3BlcnRpZXMiIGlmPSJqcGRhIj4KKworICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImpwZGEudHJhbnNwb3J0IiB2YWx1ZT0iZHRfc2htZW0iPgorICAgICAgPG9zIGZhbWlseT0id2luZG93cyIvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImpwZGEudHJhbnNwb3J0IiB2YWx1ZT0iZHRfc29ja2V0Ij4KKyAgICAgIDxub3Q+CisgICAgICAgIDxvcyBmYW1pbHk9IndpbmRvd3MiLz4KKyAgICAgIDwvbm90PgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImpwZGEuYWRkcmVzcyIgdmFsdWU9ImpkYmNvbm4iPgorICAgICAgPGVxdWFscyBhcmcxPSIke2pwZGEudHJhbnNwb3J0fSIgYXJnMj0iZHRfc2htZW0iLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqcGRhLmFkZHJlc3MiIHZhbHVlPSI4MDAwIj4KKyAgICAgIDxub3Q+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtqcGRhLnRyYW5zcG9ydH0iIGFyZzI9ImR0X3NobWVtIi8+CisgICAgICA8L25vdD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8cHJvcGVydHkgbmFtZT0ianBkYS5zdXNwZW5kIiB2YWx1ZT0ieSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqcGRhLnNldHRpbmdzIiB2YWx1ZT0idHJhbnNwb3J0PSR7anBkYS50cmFuc3BvcnR9LGFkZHJlc3M9JHtqcGRhLmFkZHJlc3N9LHNlcnZlcj15LHN1c3BlbmQ9JHtqcGRhLnN1c3BlbmR9Ii8+CisKKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBUYXJnZXQgdGhhdCBleGVjdXRlcyB0aGUgSlNQQyBjb21waWxlci0tPgorICA8dGFyZ2V0IG5hbWU9ImpzcGMiIGRlc2NyaXB0aW9uPSJFeGVjdXRlIEpTUEMgY29tcGlsZXIiCisgICAgZGVwZW5kcz0ic2V0amRiLHNldGpwZGEiPgorCisgICAgPCEtLSBMYXVuY2ggSlNQQyBjb21waWxlciAtLT4KKyAgICA8bGF1bmNoIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5qYXNwZXIuSnNwQyIKKyAgICAgIGRlYnVnPSIke2pkYn0iCisgICAgICBwcmludD0iJHtwcmludH0iCisgICAgICB1c2VzeXN0ZW1pbj0iZmFsc2UiCisgICAgICByZXF1aXJldG9vbHM9InRydWUiPgorICAgICAgICA8anZtYXJnc2V0IHJlZmlkPSJiYXNlLmp2bS5hcmdzIi8+CisgICAgICAgIDxhcmcgdmFsdWU9ImpzcGMiLz4KKyAgICAgICAgPHN5c3Byb3BlcnR5c2V0IHJlZmlkPSJiYXNlLnN5cy5wcm9wZXJ0aWVzIi8+CisgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImJhc2UuY2xhc3MucGF0aCIvPgorICAgIDwvbGF1bmNoPgorCisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL2Jpbi9qc3BjLXVzaW5nLWxhdW5jaGVyLmJhdCBiL2phc3Blci9zcmMvYmluL2pzcGMtdXNpbmctbGF1bmNoZXIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1MjdlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL2Jpbi9qc3BjLXVzaW5nLWxhdW5jaGVyLmJhdApAQCAtMCwwICsxLDQwIEBACitAZWNobyBvZmYKK2lmICIlT1MlIiA9PSAiV2luZG93c19OVCIgc2V0bG9jYWwKKworcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcmVtCityZW0gU2NyaXB0IGZvciBydW5uaW5nIEpTUEMgY29tcGlsZXIgdXNpbmcgdGhlIExhdW5jaGVyCityZW0KK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmVtIEdldCBzdGFuZGFyZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK3NldCBQUkc9JTAKK2lmIGV4aXN0ICVQUkclXC4uXHNldGVudi5iYXQgZ290byBnb3RDbWRQYXRoCityZW0gJTAgbXVzdCBoYXZlIGJlZW4gZm91bmQgYnkgRE9TIHVzaW5nIHRoZSAlUEFUSCUgc28gd2UgYXNzdW1lIHRoYXQKK3JlbSBzZXRlbnYuYmF0IHdpbGwgYWxzbyBiZSBmb3VuZCBpbiB0aGUgJVBBVEglCitjYWxsIHNldGVudi5iYXQKK2dvdG8gZG9uZVNldGVudgorOmdvdENtZFBhdGgKK2NhbGwgJVBSRyVcLi5cc2V0ZW52LmJhdAorOmRvbmVTZXRlbnYKKworcmVtIE1ha2Ugc3VyZSBwcmVyZXF1aXNpdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQKK2lmIG5vdCAiJUpBVkFfSE9NRSUiID09ICIiIGdvdG8gZ290SmF2YUhvbWUKK2VjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZAorZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZAorOmdvdEphdmFIb21lCisKK3JlbSBHZXQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgc2F2ZSB0aGVtIHdpdGggdGhlIHByb3BlciBxdW90aW5nCitzZXQgQ01EX0xJTkVfQVJHUz0KKzpzZXRBcmdzCitpZiAiIiUxIiI9PSIiIiIgZ290byBkb25lU2V0QXJncworc2V0IENNRF9MSU5FX0FSR1M9JUNNRF9MSU5FX0FSR1MlICUxCitzaGlmdAorZ290byBzZXRBcmdzCis6ZG9uZVNldEFyZ3MKKworcmVtIEV4ZWN1dGUgdGhlIExhdW5jaGVyIHVzaW5nIHRoZSAianNwYyIgdGFyZ2V0CisiJUpBVkFfSE9NRSVcYmluXGphdmEuZXhlIiAtY2xhc3NwYXRoICVQUkclXC4uOyIlUEFUSCUiOy4gTGF1bmNoZXJCb290c3RyYXAgLWxhdW5jaGZpbGUgamFzcGVyLnhtbCAtdmVyYm9zZSBqc3BjICVDTURfTElORV9BUkdTJQorCis6ZW5kCmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL2Jpbi9qc3BjLXVzaW5nLWxhdW5jaGVyLnNoIGIvamFzcGVyL3NyYy9iaW4vanNwYy11c2luZy1sYXVuY2hlci5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYThkOWVjCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9iaW4vanNwYy11c2luZy1sYXVuY2hlci5zaApAQCAtMCwwICsxLDI5IEBACisjIS9iaW4vc2gKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIworIyBTY3JpcHQgZm9yIHJ1bm5pbmcgSlNQQyBjb21waWxlciB1c2luZyB0aGUgTGF1bmNoZXIKKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBSZXNvbHZlIGxpbmtzIC0gJDAgbWF5IGJlIGEgc29mdGxpbmsKK1BSRz0iJDAiCisKK3doaWxlIFsgLWggIiRQUkciIF07IGRvCisgIGxzPWBscyAtbGQgIiRQUkciYAorICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgIGlmIGV4cHIgIiRsaW5rIiA6ICcuKi8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICBQUkc9IiRsaW5rIgorICBlbHNlCisgICAgUFJHPWBkaXJuYW1lICIkUFJHImAvIiRsaW5rIgorICBmaQorZG9uZQorCisjIEdldCBzdGFuZGFyZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK1BSR0RJUj1gZGlybmFtZSAiJFBSRyJgCitpZiBbIC1yICIkUFJHRElSIi9zZXRlbnYuc2ggXTsgdGhlbgorICAuICIkUFJHRElSIi9zZXRlbnYuc2gKK2ZpCisKKyMgRXhlY3V0ZSB0aGUgTGF1bmNoZXIgdXNpbmcgdGhlICJqc3BjIiB0YXJnZXQKK2V4ZWMgIiRKQVZBX0hPTUUiL2Jpbi9qYXZhIC1jbGFzc3BhdGggIiRQUkdESVIiIExhdW5jaGVyQm9vdHN0cmFwIC1sYXVuY2hmaWxlIGphc3Blci54bWwgLXZlcmJvc2UganNwYyAiJEAiCmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL2Jpbi9qc3BjLmJhdCBiL2phc3Blci9zcmMvYmluL2pzcGMuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI5NTljYmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL2Jpbi9qc3BjLmJhdApAQCAtMCwwICsxLDQxIEBACitAZWNobyBvZmYKK2lmICIlT1MlIiA9PSAiV2luZG93c19OVCIgc2V0bG9jYWwKK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JlbSBTY3JpcHQgdG8gcnVuIHRoZSBKYXNwZXIgIm9mZmxpbmUgSlNQIGNvbXBpbGVyIgorcmVtCityZW0gJElkJAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZW0gR3Vlc3MgSkFTUEVSX0hPTUUgaWYgbm90IGRlZmluZWQKK2lmIG5vdCAiJUpBU1BFUl9IT01FJSIgPT0gIiIgZ290byBnb3RIb21lCitzZXQgSkFTUEVSX0hPTUU9LgoraWYgZXhpc3QgIiVKQVNQRVJfSE9NRSVcYmluXGpzcGMuYmF0IiBnb3RvIG9rSG9tZQorc2V0IEpBU1BFUl9IT01FPS4uCis6Z290SG9tZQoraWYgZXhpc3QgIiVKQVNQRVJfSE9NRSVcYmluXGpzcGMuYmF0IiBnb3RvIG9rSG9tZQorZWNobyBUaGUgSkFTUEVSX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5CitlY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KK2dvdG8gZW5kCis6b2tIb21lCisKK3NldCBFWEVDVVRBQkxFPSVKQVNQRVJfSE9NRSVcYmluXGphc3Blci5iYXQKKworcmVtIENoZWNrIHRoYXQgdGFyZ2V0IGV4ZWN1dGFibGUgZXhpc3RzCitpZiBleGlzdCAiJUVYRUNVVEFCTEUlIiBnb3RvIG9rRXhlYworZWNobyBDYW5ub3QgZmluZCAlRVhFQ1VUQUJMRSUKK2VjaG8gVGhpcyBmaWxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZAorOm9rRXhlYworCityZW0gR2V0IHJlbWFpbmluZyB1bnNoaWZ0ZWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgc2F2ZSB0aGVtIGluIHRoZQorc2V0IENNRF9MSU5FX0FSR1M9Cis6c2V0QXJncworaWYgIiIlMSIiPT0iIiIiIGdvdG8gZG9uZVNldEFyZ3MKK3NldCBDTURfTElORV9BUkdTPSVDTURfTElORV9BUkdTJSAlMQorc2hpZnQKK2dvdG8gc2V0QXJncworOmRvbmVTZXRBcmdzCisKK2NhbGwgIiVFWEVDVVRBQkxFJSIganNwYyAlQ01EX0xJTkVfQVJHUyUKKworOmVuZApkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9iaW4vanNwYy5zaCBiL2phc3Blci9zcmMvYmluL2pzcGMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyNjc4NwotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvYmluL2pzcGMuc2gKQEAgLTAsMCArMSwzNiBAQAorIyEvYmluL3NoCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNjcmlwdCB0byBydW4gdGhlIEphc3BlciAib2ZmbGluZSBKU1AgY29tcGlsZXIiCisjCisjICRJZCQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyByZXNvbHZlIGxpbmtzIC0gJDAgbWF5IGJlIGEgc29mdGxpbmsKK1BSRz0iJDAiCisKK3doaWxlIFsgLWggIiRQUkciIF0gOyBkbworICBscz1gbHMgLWxkICIkUFJHImAKKyAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAorICBpZiBleHByICIkbGluayIgOiAnLiovLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgUFJHPSIkbGluayIKKyAgZWxzZQorICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgLyIkbGluayIKKyAgZmkKK2RvbmUKKyAKK1BSR0RJUj1gZGlybmFtZSAiJFBSRyJgCitFWEVDVVRBQkxFPWphc3Blci5zaAorCisjIENoZWNrIHRoYXQgdGFyZ2V0IGV4ZWN1dGFibGUgZXhpc3RzCitpZiBbICEgLXggIiRQUkdESVIiLyIkRVhFQ1VUQUJMRSIgXTsgdGhlbgorICBlY2hvICJDYW5ub3QgZmluZCAkUFJHRElSLyRFWEVDVVRBQkxFIgorICBlY2hvICJUaGlzIGZpbGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0iCisgIGV4aXQgMQorZmkKKworaWYgWyAiJDEiID0gImRlYnVnIiBdOyB0aGVuCisgIHNoaWZ0CisgIGV4ZWMgIiRQUkdESVIiLyIkRVhFQ1VUQUJMRSIgZGVidWcgIiRAIgorZWxzZQorICBleGVjICIkUFJHRElSIi8iJEVYRUNVVEFCTEUiIGpzcGMgIiRAIgorZmkKZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvQ29uc3RhbnRzLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZDg1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3BlcjsKKworCisvKioKKyAqIFNvbWUgY29uc3RhbnRzIGFuZCBvdGhlciBnbG9iYWwgZGF0YSB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBjb21waWxlciBhbmQgdGhlIHJ1bnRpbWUuCisgKgorICogQGF1dGhvciBBbmlsIEsuIFZpamVuZHJhbgorICogQGF1dGhvciBIYXJpc2ggUHJhYmFuZGhhbQorICogQGF1dGhvciBTaGF3biBCYXllcm4KKyAqIEBhdXRob3IgTWFyayBSb3RoCisgKi8KK3B1YmxpYyBjbGFzcyBDb25zdGFudHMgeworICAgIC8qKgorICAgICAqIFRoZSBiYXNlIGNsYXNzIG9mIHRoZSBnZW5lcmF0ZWQgc2VydmxldHMuIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9TRVJWTEVUX0JBU0UgPSAib3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5IdHRwSnNwQmFzZSI7CisKKyAgICAvKioKKyAgICAgKiBfanNwU2VydmljZSBpcyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIGJ5IAorICAgICAqIEh0dHBKc3BCYXNlLnNlcnZpY2UoKS4gVGhpcyBpcyB3aGVyZSBtb3N0IG9mIHRoZSBjb2RlIGdlbmVyYXRlZAorICAgICAqIGZyb20gSlNQcyBnby4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX01FVEhPRF9OQU1FID0gIl9qc3BTZXJ2aWNlIjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgc2VydmxldCBjb250ZW50IHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9DT05URU5UX1RZUEUgPSAidGV4dC9odG1sIjsKKworICAgIC8qKgorICAgICAqIFRoZXNlIGNsYXNzZXMvcGFja2FnZXMgYXJlIGF1dG9tYXRpY2FsbHkgaW1wb3J0ZWQgYnkgdGhlCisgICAgICogZ2VuZXJhdGVkIGNvZGUuIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1RBTkRBUkRfSU1QT1JUUyA9IHsgCisJImphdmF4LnNlcnZsZXQuKiIsIAorCSJqYXZheC5zZXJ2bGV0Lmh0dHAuKiIsIAorCSJqYXZheC5zZXJ2bGV0LmpzcC4qIgorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBGSVhNRQorICAgICAqIFNlcnZsZXRDb250ZXh0IGF0dHJpYnV0ZSBmb3IgY2xhc3NwYXRoLiBUaGlzIGlzIHRvbWNhdCBzcGVjaWZpYy4gCisgICAgICogT3RoZXIgc2VydmxldCBlbmdpbmVzIG1heSBjaG9vc2UgdG8gc3VwcG9ydCB0aGlzIGF0dHJpYnV0ZSBpZiB0aGV5IAorICAgICAqIHdhbnQgdG8gaGF2ZSB0aGlzIEpTUCBlbmdpbmUgcnVubmluZyBvbiB0aGVtLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX0NMQVNTUEFUSCA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmpzcF9jbGFzc3BhdGgiOworCisgICAgLyoqCisgICAgICogRklYTUUKKyAgICAgKiBSZXF1ZXN0IGF0dHJpYnV0ZSBmb3IgPGNvZGU+Jmx0O2pzcC1maWxlJmd0OzwvY29kZT4gZWxlbWVudCBvZiBhCisgICAgICogc2VydmxldCBkZWZpbml0aW9uLiAgSWYgcHJlc2VudCBvbiBhIHJlcXVlc3QsIHRoaXMgb3ZlcnJpZGVzIHRoZQorICAgICAqIHZhbHVlIHJldHVybmVkIGJ5IDxjb2RlPnJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKTwvY29kZT4gdG8gc2VsZWN0CisgICAgICogdGhlIEpTUCBwYWdlIHRvIGJlIGV4ZWN1dGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9GSUxFID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuanNwX2ZpbGUiOworCisKKyAgICAvKioKKyAgICAgKiBGSVhNRQorICAgICAqIFNlcnZsZXRDb250ZXh0IGF0dHJpYnV0ZSBmb3IgY2xhc3MgbG9hZGVyLiBUaGlzIGlzIHRvbWNhdCBzcGVjaWZpYy4gCisgICAgICogT3RoZXIgc2VydmxldCBlbmdpbmVzIGNhbiBjaG9vc2UgdG8gaGF2ZSB0aGlzIGF0dHJpYnV0ZSBpZiB0aGV5IAorICAgICAqIHdhbnQgdG8gaGF2ZSB0aGlzIEpTUCBlbmdpbmUgcnVubmluZyBvbiB0aGVtLiAKKyAgICAgKi8KKyAgICAvL3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfQ0xBU1NfTE9BREVSID0gIm9yZy5hcGFjaGUudG9tY2F0LmNsYXNzbG9hZGVyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX0NMQVNTX0xPQURFUiA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsYXNzbG9hZGVyIjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgc2l6ZSBvZiB0aGUgSlNQIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLID0gMTAyNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gOCpLOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBzaXplIGZvciB0aGUgdGFnIGJ1ZmZlcnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9UQUdfQlVGRkVSX1NJWkUgPSA1MTI7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHRhZyBoYW5kbGVyIHBvb2wgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfUE9PTF9TSVpFID0gNTsKKworICAgIC8qKgorICAgICAqIFRoZSBxdWVyeSBwYXJhbWV0ZXIgdGhhdCBjYXVzZXMgdGhlIEpTUCBlbmdpbmUgdG8ganVzdAorICAgICAqIHByZWdlbmVyYXRlZCB0aGUgc2VydmxldCBidXQgbm90IGludm9rZSBpdC4gCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFQ09NUElMRSA9ICJqc3BfcHJlY29tcGlsZSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBwYWNrYWdlIG5hbWUgZm9yIGNvbXBpbGVkIGpzcCBwYWdlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUEFDS0FHRV9OQU1FID0gIm9yZy5hcGFjaGUuanNwIjsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHBhY2thZ2UgbmFtZSBmb3IgdGFnIGhhbmRsZXJzIGdlbmVyYXRlZCBmcm9tIHRhZyBmaWxlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19GSUxFX1BBQ0tBR0VfTkFNRSA9ICJvcmcuYXBhY2hlLmpzcC50YWciOworCisgICAgLyoqCisgICAgICogU2VydmxldCBjb250ZXh0IGFuZCByZXF1ZXN0IGF0dHJpYnV0ZXMgdGhhdCB0aGUgSlNQIGVuZ2luZQorICAgICAqIHVzZXMuIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ19SRVFVRVNUX1VSSSA9ICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucmVxdWVzdF91cmkiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ19TRVJWTEVUX1BBVEggPSAiamF2YXguc2VydmxldC5pbmNsdWRlLnNlcnZsZXRfcGF0aCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE1QX0RJUiA9ICJqYXZheC5zZXJ2bGV0LmNvbnRleHQudGVtcGRpciI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSRF9TRUVOID0gImphdmF4LnNlcnZsZXQuZm9yd2FyZC5zZWVuIjsKKworICAgIC8vIE11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggb3JnL2FwYWNoZS9jYXRhbGluYS9HbG9iYWxzLmphdmEKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRfRERfQVRUUiA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5hbHRfZGQiOworCisgICAgLyoqCisgICAgICogUHVibGljIElkIGFuZCB0aGUgUmVzb3VyY2UgcGF0aCAob2YgdGhlIGNhY2hlZCBjb3B5KSAKKyAgICAgKiBvZiB0aGUgRFREcyBmb3IgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcnMuIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR0xJQl9EVERfUFVCTElDX0lEXzExID0gCisJIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKU1AgVGFnIExpYnJhcnkgMS4xLy9FTiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHTElCX0RURF9SRVNPVVJDRV9QQVRIXzExID0gCisJIi9qYXZheC9zZXJ2bGV0L2pzcC9yZXNvdXJjZXMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8xLmR0ZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHTElCX0RURF9QVUJMSUNfSURfMTIgPSAKKwkiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdMSUJfRFREX1JFU09VUkNFX1BBVEhfMTIgPSAKKwkiL2phdmF4L3NlcnZsZXQvanNwL3Jlc291cmNlcy93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkIjsKKworICAgIC8qKgorICAgICAqIFB1YmxpYyBJZCBhbmQgdGhlIFJlc291cmNlIHBhdGggKG9mIHRoZSBjYWNoZWQgY29weSkgCisgICAgICogb2YgdGhlIERURHMgZm9yIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCQVBQX0RURF9QVUJMSUNfSURfMjIgPSAKKwkiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjIvL0VOIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJBUFBfRFREX1JFU09VUkNFX1BBVEhfMjIgPSAKKwkiL2phdmF4L3NlcnZsZXQvcmVzb3VyY2VzL3dlYi1hcHBfMl8yLmR0ZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCQVBQX0RURF9QVUJMSUNfSURfMjMgPSAKKwkiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJBUFBfRFREX1JFU09VUkNFX1BBVEhfMjMgPSAKKwkiL2phdmF4L3NlcnZsZXQvcmVzb3VyY2VzL3dlYi1hcHBfMl8zLmR0ZCI7CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIHRoZSBQdWJsaWMgSURzIHRoYXQgd2UgY2FjaGUsIGFuZCB0aGVpcgorICAgICAqIGFzc29jaWF0ZWQgbG9jYXRpb24uIFRoaXMgaXMgdXNlZCBieSAKKyAgICAgKiBhbiBFbnRpdHlSZXNvbHZlciB0byByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZQorICAgICAqIGNhY2hlZCBjb3B5IG9mIGEgRFRELgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ0FDSEVEX0RURF9QVUJMSUNfSURTID0geworCVRBR0xJQl9EVERfUFVCTElDX0lEXzExLAorCVRBR0xJQl9EVERfUFVCTElDX0lEXzEyLAorCVdFQkFQUF9EVERfUFVCTElDX0lEXzIyLAorCVdFQkFQUF9EVERfUFVCTElDX0lEXzIzLAorICAgIH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDQUNIRURfRFREX1JFU09VUkNFX1BBVEhTID0geworCVRBR0xJQl9EVERfUkVTT1VSQ0VfUEFUSF8xMSwKKwlUQUdMSUJfRFREX1JFU09VUkNFX1BBVEhfMTIsCisJV0VCQVBQX0RURF9SRVNPVVJDRV9QQVRIXzIyLAorCVdFQkFQUF9EVERfUkVTT1VSQ0VfUEFUSF8yMywKKyAgICB9OworICAgIAorICAgIC8qKgorICAgICAqIERlZmF1bHQgVVJMcyB0byBkb3dubG9hZCB0aGUgcGx1Z2luZyBmb3IgTmV0c2NhcGUgYW5kIElFLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1BMVUdJTl9VUkwgPSAKKyAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvcGx1Z2luLyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRV9QTFVHSU5fVVJMID0gCisgICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL3BsdWdpbi8xLjIuMi9qaW5zdGFsbC0xXzJfMi13aW4uY2FiI1ZlcnNpb249MSwyLDIsMCI7CisKKyAgICAvKioKKyAgICAgKiBQcmVmaXggdG8gdXNlIGZvciBnZW5lcmF0ZWQgdGVtcG9yYXJ5IHZhcmlhYmxlIG5hbWVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUF9WQVJJQUJMRV9OQU1FX1BSRUZJWCA9CisgICAgICAgICJfanNweF90ZW1wIjsKKworICAgIC8qKgorICAgICAqIFByZXZpb3VzIHJlcGxhY2VtZW50IGNoYXIgZm9yICJcJCIuCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRVNDPSdcdTAwMWInOworICAgIAorICAgIC8qKgorICAgICAqIFByZXZpb3VzIHJlcGxhY2VtZW50IGNoYXIgZm9yICJcJCIuCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NTdHI9IidcXHUwMDFiJyI7CisgICAgCisgICAgLyoqCisgICAgICogUmVwbGFjZW1lbnQgY2hhciBmb3IgIlwkIi4gVGhpcyBpcyB0aGUgZmlyc3QgdW5pY29kZSBjaGFyYWN0ZXIgaW4gdGhlCisgICAgICogcHJpdmF0ZSB1c2UgYXJlYS4KKyAgICAgKiBYWFggVGhpcyBpcyBhIGhhY2sgdG8gYXZvaWQgY2hhbmdpbmcgRUwgaW50ZXJwcmV0ZXIgdG8gcmVjb2duaXplICJcJCIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSEFDS19DSEFSID0gJ1x1ZTAwMCc7CisgICAgCisgICAgLyoqCisgICAgICogUmVwbGFjZW1lbnQgc3RyaW5nIGZvciAiXCQiLiBUaGlzIGlzIHRoZSBmaXJzdCB1bmljb2RlIGNoYXJhY3RlciBpbiB0aGUKKyAgICAgKiBwcml2YXRlIHVzZSBhcmVhLgorICAgICAqIFhYWCBUaGlzIGlzIGEgaGFjayB0byBhdm9pZCBjaGFuZ2luZyBFTCBpbnRlcnByZXRlciB0byByZWNvZ25pemUgIlwkIgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBQ0tfU1RSID0gIidcXHVlMDAwJyI7CisgICAgCit9CisKZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvRW1iZWRkZWRTZXJ2bGV0T3B0aW9ucy5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9FbWJlZGRlZFNlcnZsZXRPcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhNzQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvRW1iZWRkZWRTZXJ2bGV0T3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsNjQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3BlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuVGxkTG9jYXRpb25zQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuSnNwQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLlRhZ1BsdWdpbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlci5QYXJzZXJVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLyoqCisgKiBBIGNsYXNzIHRvIGhvbGQgYWxsIGluaXQgcGFyYW1ldGVycyBzcGVjaWZpYyB0byB0aGUgSlNQIGVuZ2luZS4gCisgKgorICogQGF1dGhvciBBbmlsIEsuIFZpamVuZHJhbgorICogQGF1dGhvciBIYW5zIEJlcmdzdGVuCisgKiBAYXV0aG9yIFBpZXJyZSBEZWxpc2xlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFbWJlZGRlZFNlcnZsZXRPcHRpb25zIGltcGxlbWVudHMgT3B0aW9ucyB7CisgICAgCisgICAgLy8gTG9nZ2VyCisgICAgcHJpdmF0ZSBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRW1iZWRkZWRTZXJ2bGV0T3B0aW9ucy5jbGFzcyk7CisgICAgCisgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHNldHRpbmdzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBJcyBKYXNwZXIgYmVpbmcgdXNlZCBpbiBkZXZlbG9wbWVudCBtb2RlPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkZXZlbG9wbWVudCA9IHRydWU7CisgICAgCisgICAgLyoqCisgICAgICogU2hvdWxkIEFudCBmb3JrIGl0cyBqYXZhIGNvbXBpbGVzIG9mIEpTUCBwYWdlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBmb3JrID0gdHJ1ZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEbyB5b3Ugd2FudCB0byBrZWVwIHRoZSBnZW5lcmF0ZWQgSmF2YSBmaWxlcyBhcm91bmQ/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGtlZXBHZW5lcmF0ZWQgPSB0cnVlOworICAgIAorICAgIC8qKgorICAgICAqIFNob3VsZCB3aGl0ZSBzcGFjZXMgYmV0d2VlbiBkaXJlY3RpdmVzIG9yIGFjdGlvbnMgYmUgdHJpbW1lZD8KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdHJpbVNwYWNlcyA9IGZhbHNlOworICAgIAorICAgIC8qKgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0YWcgaGFuZGxlciBwb29saW5nIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzUG9vbGluZ0VuYWJsZWQgPSB0cnVlOworICAgIAorICAgIC8qKgorICAgICAqIERvIHlvdSB3YW50IHN1cHBvcnQgZm9yICJtYXBwZWQiIGZpbGVzPyBUaGlzIHdpbGwgZ2VuZXJhdGUKKyAgICAgKiBzZXJ2bGV0IHRoYXQgaGFzIGEgcHJpbnQgc3RhdGVtZW50IHBlciBsaW5lIG9mIHRoZSBKU1AgZmlsZS4KKyAgICAgKiBUaGlzIHNlZW1zIGxpa2UgYSByZWFsbHkgbmljZSBmZWF0dXJlIHRvIGhhdmUgZm9yIGRlYnVnZ2luZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbWFwcGVkRmlsZSA9IHRydWU7CisgICAgCisgICAgLyoqCisgICAgICogRG8geW91IHdhbnQgc3RhY2sgdHJhY2VzIGFuZCBzdWNoIGRpc3BsYXllZCBpbiB0aGUgY2xpZW50J3MKKyAgICAgKiBicm93c2VyPyBJZiB0aGlzIGlzIGZhbHNlLCBzdWNoIG1lc3NhZ2VzIGdvIHRvIHRoZSBzdGFuZGFyZAorICAgICAqIGVycm9yIG9yIGEgbG9nIGZpbGUgaWYgdGhlIHN0YW5kYXJkIGVycm9yIGlzIHJlZGlyZWN0ZWQuIAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzZW5kRXJyb3JUb0NsaWVudCA9IGZhbHNlOworICAgIAorICAgIC8qKgorICAgICAqIERvIHdlIHdhbnQgdG8gaW5jbHVkZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIGNsYXNzIGZpbGU/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNsYXNzRGVidWdJbmZvID0gdHJ1ZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBCYWNrZ3JvdW5kIGNvbXBpbGUgdGhyZWFkIGNoZWNrIGludGVydmFsIGluIHNlY29uZHMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY2hlY2tJbnRlcnZhbCA9IDA7CisgICAgCisgICAgLyoqCisgICAgICogSXMgdGhlIGdlbmVyYXRpb24gb2YgU01BUCBpbmZvIGZvciBKU1I0NSBkZWJ1Z2dpbiBzdXBwcmVzc2VkPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NtYXBTdXBwcmVzc2VkID0gZmFsc2U7CisgICAgCisgICAgLyoqCisgICAgICogU2hvdWxkIFNNQVAgaW5mbyBmb3IgSlNSNDUgZGVidWdnaW5nIGJlIGR1bXBlZCB0byBhIGZpbGU/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzU21hcER1bXBlZCA9IGZhbHNlOworICAgIAorICAgIC8qKgorICAgICAqIEFyZSBUZXh0IHN0cmluZ3MgdG8gYmUgZ2VuZXJhdGVkIGFzIGNoYXIgYXJyYXlzPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBnZW5TdHJpbmdBc0NoYXJBcnJheSA9IGZhbHNlOworICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBlcnJvck9uVXNlQmVhbkludmFsaWRDbGFzc0F0dHJpYnV0ZSA9IHRydWU7CisgICAgCisgICAgLyoqCisgICAgICogSSB3YW50IHRvIHNlZSBteSBnZW5lcmF0ZWQgc2VydmxldHMuIFdoaWNoIGRpcmVjdG9yeSBhcmUgdGhleQorICAgICAqIGluPworICAgICAqLworICAgIHByaXZhdGUgRmlsZSBzY3JhdGNoRGlyOworICAgIAorICAgIC8qKgorICAgICAqIE5lZWQgdG8gaGF2ZSB0aGlzIGFzIGlzIGZvciB2ZXJzaW9ucyA0IGFuZCA1IG9mIElFLiBDYW4gYmUgc2V0IGZyb20KKyAgICAgKiB0aGUgaW5pdFBhcmFtcyBzbyBpZiBpdCBjaGFuZ2VzIGluIHRoZSBmdXR1cmUgYWxsIHRoYXQgaXMgbmVlZGVkIGlzCisgICAgICogdG8gaGF2ZSBhIGpzcCBpbml0UGFyYW0gb2YgdHlwZSBpZUNsYXNzSWQ9Ijx2YWx1ZT4iCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaWVDbGFzc0lkID0gImNsc2lkOjhBRDlDODQwLTA0NEUtMTFEMS1CM0U5LTAwODA1RjQ5OUQ5MyI7CisgICAgCisgICAgLyoqCisgICAgICogV2hhdCBjbGFzc3BhdGggc2hvdWxkIEkgdXNlIHdoaWxlIGNvbXBpbGluZyBnZW5lcmF0ZWQgc2VydmxldHM/CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NwYXRoID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb21waWxlciB0byB1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29tcGlsZXIgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIENvbXBpbGVyIHRhcmdldCBWTS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb21waWxlclRhcmdldFZNID0gIjEuNSI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGNvbXBpbGVyIHNvdXJjZSBWTS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb21waWxlclNvdXJjZVZNID0gIjEuNSI7CisgICAgCisgICAgLyoqCisgICAgICogQ2FjaGUgZm9yIHRoZSBUTEQgbG9jYXRpb25zCisgICAgICovCisgICAgcHJpdmF0ZSBUbGRMb2NhdGlvbnNDYWNoZSB0bGRMb2NhdGlvbnNDYWNoZSA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogSnNwIGNvbmZpZyBpbmZvcm1hdGlvbgorICAgICAqLworICAgIHByaXZhdGUgSnNwQ29uZmlnIGpzcENvbmZpZyA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGFnUGx1Z2luTWFuYWdlcgorICAgICAqLworICAgIHByaXZhdGUgVGFnUGx1Z2luTWFuYWdlciB0YWdQbHVnaW5NYW5hZ2VyID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBKYXZhIHBsYXRmb3JtIGVuY29kaW5nIHRvIGdlbmVyYXRlIHRoZSBKU1AKKyAgICAgKiBwYWdlIHNlcnZsZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgamF2YUVuY29kaW5nID0gIlVURjgiOworICAgIAorICAgIC8qKgorICAgICAqIE1vZGlmaWNhdGlvbiB0ZXN0IGludGVydmFsLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1vZGlmaWNhdGlvblRlc3RJbnRlcnZhbCA9IDQ7CisgICAgCisgICAgLyoqCisgICAgICogSXMgZ2VuZXJhdGlvbiBvZiBYLVBvd2VyZWQtQnkgcmVzcG9uc2UgaGVhZGVyIGVuYWJsZWQvZGlzYWJsZWQ/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHhwb3dlcmVkQnk7CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSApIHsKKyAgICAgICAgcmV0dXJuIHNldHRpbmdzLmdldFByb3BlcnR5KCBuYW1lICk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUgKSB7CisgICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCl7IAorICAgICAgICAgICAgc2V0dGluZ3Muc2V0UHJvcGVydHkoIG5hbWUsIHZhbHVlICk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQXJlIHdlIGtlZXBpbmcgZ2VuZXJhdGVkIGNvZGUgYXJvdW5kPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEtlZXBHZW5lcmF0ZWQoKSB7CisgICAgICAgIHJldHVybiBrZWVwR2VuZXJhdGVkOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTaG91bGQgd2hpdGUgc3BhY2VzIGJldHdlZW4gZGlyZWN0aXZlcyBvciBhY3Rpb25zIGJlIHRyaW1tZWQ/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VHJpbVNwYWNlcygpIHsKKyAgICAgICAgcmV0dXJuIHRyaW1TcGFjZXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzUG9vbGluZ0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBpc1Bvb2xpbmdFbmFibGVkOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBcmUgd2Ugc3VwcG9ydGluZyBIVE1MIG1hcHBlZCBzZXJ2bGV0cz8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRNYXBwZWRGaWxlKCkgeworICAgICAgICByZXR1cm4gbWFwcGVkRmlsZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2hvdWxkIGVycm9ycyBiZSBzZW50IHRvIGNsaWVudCBvciB0aHJvd24gaW50byBzdGRlcnI/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U2VuZEVycm9yVG9DbGllbnQoKSB7CisgICAgICAgIHJldHVybiBzZW5kRXJyb3JUb0NsaWVudDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2hvdWxkIGNsYXNzIGZpbGVzIGJlIGNvbXBpbGVkIHdpdGggZGVidWcgaW5mb3JtYXRpb24/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q2xhc3NEZWJ1Z0luZm8oKSB7CisgICAgICAgIHJldHVybiBjbGFzc0RlYnVnSW5mbzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQmFja2dyb3VuZCBKU1AgY29tcGlsZSB0aHJlYWQgY2hlY2sgaW50ZXJ2YWxsCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDaGVja0ludGVydmFsKCkgeworICAgICAgICByZXR1cm4gY2hlY2tJbnRlcnZhbDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogTW9kaWZpY2F0aW9uIHRlc3QgaW50ZXJ2YWwuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNb2RpZmljYXRpb25UZXN0SW50ZXJ2YWwoKSB7CisgICAgICAgIHJldHVybiBtb2RpZmljYXRpb25UZXN0SW50ZXJ2YWw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIElzIEphc3BlciBiZWluZyB1c2VkIGluIGRldmVsb3BtZW50IG1vZGU/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGV2ZWxvcG1lbnQoKSB7CisgICAgICAgIHJldHVybiBkZXZlbG9wbWVudDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSXMgdGhlIGdlbmVyYXRpb24gb2YgU01BUCBpbmZvIGZvciBKU1I0NSBkZWJ1Z2dpbiBzdXBwcmVzc2VkPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU21hcFN1cHByZXNzZWQoKSB7CisgICAgICAgIHJldHVybiBpc1NtYXBTdXBwcmVzc2VkOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTaG91bGQgU01BUCBpbmZvIGZvciBKU1I0NSBkZWJ1Z2dpbmcgYmUgZHVtcGVkIHRvIGEgZmlsZT8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NtYXBEdW1wZWQoKSB7CisgICAgICAgIHJldHVybiBpc1NtYXBEdW1wZWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEFyZSBUZXh0IHN0cmluZ3MgdG8gYmUgZ2VuZXJhdGVkIGFzIGNoYXIgYXJyYXlzPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdlblN0cmluZ0FzQ2hhckFycmF5KCkgeworICAgICAgICByZXR1cm4gdGhpcy5nZW5TdHJpbmdBc0NoYXJBcnJheTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2xhc3MgSUQgZm9yIHVzZSBpbiB0aGUgcGx1Z2luIHRhZyB3aGVuIHRoZSBicm93c2VyIGlzIElFLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEllQ2xhc3NJZCgpIHsKKyAgICAgICAgcmV0dXJuIGllQ2xhc3NJZDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogV2hhdCBpcyBteSBzY3JhdGNoIGRpcj8KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRTY3JhdGNoRGlyKCkgeworICAgICAgICByZXR1cm4gc2NyYXRjaERpcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogV2hhdCBjbGFzc3BhdGggc2hvdWxkIEkgdXNlIHdoaWxlIGNvbXBpbGluZyB0aGUgc2VydmxldHMKKyAgICAgKiBnZW5lcmF0ZWQgZnJvbSBKU1AgZmlsZXM/CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc1BhdGgoKSB7CisgICAgICAgIHJldHVybiBjbGFzc3BhdGg7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIElzIGdlbmVyYXRpb24gb2YgWC1Qb3dlcmVkLUJ5IHJlc3BvbnNlIGhlYWRlciBlbmFibGVkL2Rpc2FibGVkPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzWHBvd2VyZWRCeSgpIHsKKyAgICAgICAgcmV0dXJuIHhwb3dlcmVkQnk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbXBpbGVyIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBpbGVyKCkgeworICAgICAgICByZXR1cm4gY29tcGlsZXI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBzZWUgT3B0aW9ucyNnZXRDb21waWxlclRhcmdldFZNCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21waWxlclRhcmdldFZNKCkgeworICAgICAgICByZXR1cm4gY29tcGlsZXJUYXJnZXRWTTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHNlZSBPcHRpb25zI2dldENvbXBpbGVyU291cmNlVk0KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBpbGVyU291cmNlVk0oKSB7CisgICAgICAgIHJldHVybiBjb21waWxlclNvdXJjZVZNOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRFcnJvck9uVXNlQmVhbkludmFsaWRDbGFzc0F0dHJpYnV0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yT25Vc2VCZWFuSW52YWxpZENsYXNzQXR0cmlidXRlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvck9uVXNlQmVhbkludmFsaWRDbGFzc0F0dHJpYnV0ZShib29sZWFuIGIpIHsKKyAgICAgICAgZXJyb3JPblVzZUJlYW5JbnZhbGlkQ2xhc3NBdHRyaWJ1dGUgPSBiOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVGxkTG9jYXRpb25zQ2FjaGUgZ2V0VGxkTG9jYXRpb25zQ2FjaGUoKSB7CisgICAgICAgIHJldHVybiB0bGRMb2NhdGlvbnNDYWNoZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0VGxkTG9jYXRpb25zQ2FjaGUoIFRsZExvY2F0aW9uc0NhY2hlIHRsZEMgKSB7CisgICAgICAgIHRsZExvY2F0aW9uc0NhY2hlID0gdGxkQzsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRKYXZhRW5jb2RpbmcoKSB7CisgICAgICAgIHJldHVybiBqYXZhRW5jb2Rpbmc7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGdldEZvcmsoKSB7CisgICAgICAgIHJldHVybiBmb3JrOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgSnNwQ29uZmlnIGdldEpzcENvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIGpzcENvbmZpZzsKKyAgICB9CisgICAgCisgICAgcHVibGljIFRhZ1BsdWdpbk1hbmFnZXIgZ2V0VGFnUGx1Z2luTWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIHRhZ1BsdWdpbk1hbmFnZXI7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzQ2FjaGluZygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTWFwIGdldENhY2hlKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gRW1iZWRkZWRTZXJ2bGV0T3B0aW9ucyBvYmplY3QgdXNpbmcgZGF0YSBhdmFpbGFibGUgZnJvbQorICAgICAqIFNlcnZsZXRDb25maWcgYW5kIFNlcnZsZXRDb250ZXh0LiAKKyAgICAgKi8KKyAgICBwdWJsaWMgRW1iZWRkZWRTZXJ2bGV0T3B0aW9ucyhTZXJ2bGV0Q29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgCisgICAgICAgIC8vIEpWTSB2ZXJzaW9uIG51bWJlcnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChGbG9hdC5wYXJzZUZsb2F0KFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5zcGVjaWZpY2F0aW9uLnZlcnNpb24iKSkgPiAxLjQpIHsKKyAgICAgICAgICAgICAgICBjb21waWxlclNvdXJjZVZNID0gY29tcGlsZXJUYXJnZXRWTSA9ICIxLjUiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb21waWxlclNvdXJjZVZNID0gY29tcGlsZXJUYXJnZXRWTSA9ICIxLjQiOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uPWNvbmZpZy5nZXRJbml0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgd2hpbGUoIGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpICkgeworICAgICAgICAgICAgU3RyaW5nIGs9KFN0cmluZyllbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIHY9Y29uZmlnLmdldEluaXRQYXJhbWV0ZXIoIGsgKTsKKyAgICAgICAgICAgIHNldFByb3BlcnR5KCBrLCB2KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gcXVpY2sgaGFjaworICAgICAgICBTdHJpbmcgdmFsaWRhdGluZz1jb25maWcuZ2V0SW5pdFBhcmFtZXRlciggInZhbGlkYXRpbmciKTsKKyAgICAgICAgaWYoICJmYWxzZSIuZXF1YWxzKCB2YWxpZGF0aW5nICkpIFBhcnNlclV0aWxzLnZhbGlkYXRpbmc9ZmFsc2U7CisgICAgICAgIAorICAgICAgICBTdHJpbmcga2VlcGdlbiA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJrZWVwZ2VuZXJhdGVkIik7CisgICAgICAgIGlmIChrZWVwZ2VuICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChrZWVwZ2VuLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeworICAgICAgICAgICAgICAgIHRoaXMua2VlcEdlbmVyYXRlZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGtlZXBnZW4uZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIHRoaXMua2VlcEdlbmVyYXRlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLndhcm5pbmcua2VlcGdlbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBTdHJpbmcgdHJpbXNwID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoInRyaW1TcGFjZXMiKTsgCisgICAgICAgIGlmICh0cmltc3AgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHRyaW1zcC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpIHsKKyAgICAgICAgICAgICAgICB0cmltU3BhY2VzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHJpbXNwLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIHsKKyAgICAgICAgICAgICAgICB0cmltU3BhY2VzID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3Aud2FybmluZy50cmltc3BhY2VzIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdGhpcy5pc1Bvb2xpbmdFbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgU3RyaW5nIHBvb2xpbmdFbmFibGVkUGFyYW0KKyAgICAgICAgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiZW5hYmxlUG9vbGluZyIpOyAKKyAgICAgICAgaWYgKHBvb2xpbmdFbmFibGVkUGFyYW0gIT0gbnVsbAorICAgICAgICAgICAgICAgICYmICFwb29saW5nRW5hYmxlZFBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeworICAgICAgICAgICAgaWYgKHBvb2xpbmdFbmFibGVkUGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIHRoaXMuaXNQb29saW5nRW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLndhcm5pbmcuZW5hYmxlUG9vbGluZyIpKTsKKyAgICAgICAgICAgICAgICB9CQkgICAgICAgCSAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdHJpbmcgbWFwRmlsZSA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJtYXBwZWRmaWxlIik7IAorICAgICAgICBpZiAobWFwRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobWFwRmlsZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm1hcHBlZEZpbGUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChtYXBGaWxlLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm1hcHBlZEZpbGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC53YXJuaW5nLm1hcHBlZEZpbGUiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdHJpbmcgc2VuZGVyciA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJzZW5kRXJyVG9DbGllbnQiKTsKKyAgICAgICAgaWYgKHNlbmRlcnIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHNlbmRlcnIuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zZW5kRXJyb3JUb0NsaWVudCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbmRlcnIuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIHRoaXMuc2VuZEVycm9yVG9DbGllbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC53YXJuaW5nLnNlbmRFcnJUb0NsaWVudCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZyBkZWJ1Z0luZm8gPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiY2xhc3NkZWJ1Z2luZm8iKTsKKyAgICAgICAgaWYgKGRlYnVnSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZGVidWdJbmZvLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeworICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NEZWJ1Z0luZm8gID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVidWdJbmZvLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNsYXNzRGVidWdJbmZvICA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLndhcm5pbmcuY2xhc3NEZWJ1Z0luZm8iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdHJpbmcgY2hlY2tJbnRlcnZhbCA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJjaGVja0ludGVydmFsIik7CisgICAgICAgIGlmIChjaGVja0ludGVydmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhpcy5jaGVja0ludGVydmFsID0gSW50ZWdlci5wYXJzZUludChjaGVja0ludGVydmFsKTsKKyAgICAgICAgICAgIH0gY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC53YXJuaW5nLmNoZWNrSW50ZXJ2YWwiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdHJpbmcgbW9kaWZpY2F0aW9uVGVzdEludGVydmFsID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoIm1vZGlmaWNhdGlvblRlc3RJbnRlcnZhbCIpOworICAgICAgICBpZiAobW9kaWZpY2F0aW9uVGVzdEludGVydmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhpcy5tb2RpZmljYXRpb25UZXN0SW50ZXJ2YWwgPSBJbnRlZ2VyLnBhcnNlSW50KG1vZGlmaWNhdGlvblRlc3RJbnRlcnZhbCk7CisgICAgICAgICAgICB9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3Aud2FybmluZy5tb2RpZmljYXRpb25UZXN0SW50ZXJ2YWwiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdHJpbmcgZGV2ZWxvcG1lbnQgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiZGV2ZWxvcG1lbnQiKTsKKyAgICAgICAgaWYgKGRldmVsb3BtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChkZXZlbG9wbWVudC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmRldmVsb3BtZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGV2ZWxvcG1lbnQuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIHRoaXMuZGV2ZWxvcG1lbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC53YXJuaW5nLmRldmVsb3BtZW50IikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIHN1cHByZXNzU21hcCA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJzdXBwcmVzc1NtYXAiKTsKKyAgICAgICAgaWYgKHN1cHByZXNzU21hcCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoc3VwcHJlc3NTbWFwLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeworICAgICAgICAgICAgICAgIGlzU21hcFN1cHByZXNzZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdXBwcmVzc1NtYXAuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIGlzU21hcFN1cHByZXNzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC53YXJuaW5nLnN1cHByZXNzU21hcCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZyBkdW1wU21hcCA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJkdW1wU21hcCIpOworICAgICAgICBpZiAoZHVtcFNtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGR1bXBTbWFwLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeworICAgICAgICAgICAgICAgIGlzU21hcER1bXBlZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGR1bXBTbWFwLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIHsKKyAgICAgICAgICAgICAgICBpc1NtYXBEdW1wZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC53YXJuaW5nLmR1bXBTbWFwIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIGdlbkNoYXJBcnJheSA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJnZW5TdHJBc0NoYXJBcnJheSIpOworICAgICAgICBpZiAoZ2VuQ2hhckFycmF5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChnZW5DaGFyQXJyYXkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSB7CisgICAgICAgICAgICAgICAgZ2VuU3RyaW5nQXNDaGFyQXJyYXkgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChnZW5DaGFyQXJyYXkuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIGdlblN0cmluZ0FzQ2hhckFycmF5ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3Aud2FybmluZy5nZW5jaGFyYXJyYXkiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdHJpbmcgZXJyQmVhbkNsYXNzID0KKyAgICAgICAgICAgIGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJlcnJvck9uVXNlQmVhbkludmFsaWRDbGFzc0F0dHJpYnV0ZSIpOworICAgICAgICBpZiAoZXJyQmVhbkNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChlcnJCZWFuQ2xhc3MuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JPblVzZUJlYW5JbnZhbGlkQ2xhc3NBdHRyaWJ1dGUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJCZWFuQ2xhc3MuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIGVycm9yT25Vc2VCZWFuSW52YWxpZENsYXNzQXR0cmlidXRlID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3Aud2FybmluZy5lcnJCZWFuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIGllQ2xhc3NJZCA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJpZUNsYXNzSWQiKTsKKyAgICAgICAgaWYgKGllQ2xhc3NJZCAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5pZUNsYXNzSWQgPSBpZUNsYXNzSWQ7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgY2xhc3NwYXRoID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImNsYXNzcGF0aCIpOworICAgICAgICBpZiAoY2xhc3NwYXRoICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKKyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIHNjcmF0Y2hkaXIKKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBkaXIgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigic2NyYXRjaGRpciIpOyAKKyAgICAgICAgaWYgKGRpciAhPSBudWxsKSB7CisgICAgICAgICAgICBzY3JhdGNoRGlyID0gbmV3IEZpbGUoZGlyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IHRyeSB0aGUgU2VydmxldCAyLjIgamF2YXguc2VydmxldC5jb250ZXh0LnRlbXBkaXIgcHJvcGVydHkKKyAgICAgICAgICAgIHNjcmF0Y2hEaXIgPSAoRmlsZSkgY29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlRNUF9ESVIpOworICAgICAgICAgICAgaWYgKHNjcmF0Y2hEaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIE5vdCBydW5uaW5nIGluIGEgU2VydmxldCAyLjIgY29udGFpbmVyLgorICAgICAgICAgICAgICAgIC8vIFRyeSB0byBnZXQgdGhlIEpESyAxLjIgamF2YS5pby50bXBkaXIgcHJvcGVydHkKKyAgICAgICAgICAgICAgICBkaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7CisgICAgICAgICAgICAgICAgaWYgKGRpciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzY3JhdGNoRGlyID0gbmV3IEZpbGUoZGlyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgIAorICAgICAgICBpZiAodGhpcy5zY3JhdGNoRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZy5mYXRhbChMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLm5vLnNjcmF0Y2guZGlyIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIShzY3JhdGNoRGlyLmV4aXN0cygpICYmIHNjcmF0Y2hEaXIuY2FuUmVhZCgpICYmCisgICAgICAgICAgICAgICAgc2NyYXRjaERpci5jYW5Xcml0ZSgpICYmIHNjcmF0Y2hEaXIuaXNEaXJlY3RvcnkoKSkpCisgICAgICAgICAgICBsb2cuZmF0YWwoTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5iYWQuc2NyYXRjaC5kaXIiLAorICAgICAgICAgICAgICAgICAgICBzY3JhdGNoRGlyLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICAgIAorICAgICAgICB0aGlzLmNvbXBpbGVyID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImNvbXBpbGVyIik7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgY29tcGlsZXJUYXJnZXRWTSA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJjb21waWxlclRhcmdldFZNIik7CisgICAgICAgIGlmKGNvbXBpbGVyVGFyZ2V0Vk0gIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jb21waWxlclRhcmdldFZNID0gY29tcGlsZXJUYXJnZXRWTTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIGNvbXBpbGVyU291cmNlVk0gPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiY29tcGlsZXJTb3VyY2VWTSIpOworICAgICAgICBpZihjb21waWxlclNvdXJjZVZNICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY29tcGlsZXJTb3VyY2VWTSA9IGNvbXBpbGVyU291cmNlVk07CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZyBqYXZhRW5jb2RpbmcgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiamF2YUVuY29kaW5nIik7CisgICAgICAgIGlmIChqYXZhRW5jb2RpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5qYXZhRW5jb2RpbmcgPSBqYXZhRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZyBmb3JrID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImZvcmsiKTsKKyAgICAgICAgaWYgKGZvcmsgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGZvcmsuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5mb3JrID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9yay5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5mb3JrID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3Aud2FybmluZy5mb3JrIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIHhwb3dlcmVkQnkgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigieHBvd2VyZWRCeSIpOyAKKyAgICAgICAgaWYgKHhwb3dlcmVkQnkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHhwb3dlcmVkQnkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSB7CisgICAgICAgICAgICAgICAgdGhpcy54cG93ZXJlZEJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoeHBvd2VyZWRCeS5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKSB7CisgICAgICAgICAgICAgICAgdGhpcy54cG93ZXJlZEJ5ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3Aud2FybmluZy54cG93ZXJlZEJ5IikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gU2V0dXAgdGhlIGdsb2JhbCBUYWcgTGlicmFyaWVzIGxvY2F0aW9uIGNhY2hlIGZvciB0aGlzCisgICAgICAgIC8vIHdlYi1hcHBsaWNhdGlvbi4KKyAgICAgICAgdGxkTG9jYXRpb25zQ2FjaGUgPSBuZXcgVGxkTG9jYXRpb25zQ2FjaGUoY29udGV4dCk7CisgICAgICAgIAorICAgICAgICAvLyBTZXR1cCB0aGUganNwIGNvbmZpZyBpbmZvIGZvciB0aGlzIHdlYiBhcHAuCisgICAgICAgIGpzcENvbmZpZyA9IG5ldyBKc3BDb25maWcoY29udGV4dCk7CisgICAgICAgIAorICAgICAgICAvLyBDcmVhdGUgYSBUYWcgcGx1Z2luIGluc3RhbmNlCisgICAgICAgIHRhZ1BsdWdpbk1hbmFnZXIgPSBuZXcgVGFnUGx1Z2luTWFuYWdlcihjb250ZXh0KTsKKyAgICB9CisgICAgCit9CisKZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvSmFzcGVyRXhjZXB0aW9uLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL0phc3BlckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMDZhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL0phc3BlckV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGFsbCBleGNlcHRpb25zIGdlbmVyYXRlZCBieSB0aGUgSlNQIGVuZ2luZS4gTWFrZXMgaXQKKyAqIGNvbnZpZW5pZW50IHRvIGNhdGNoIGp1c3QgdGhpcyBhdCB0aGUgdG9wLWxldmVsLiAKKyAqCisgKiBAYXV0aG9yIEFuaWwgSy4gVmlqZW5kcmFuCisgKi8KK3B1YmxpYyBjbGFzcyBKYXNwZXJFeGNlcHRpb24gZXh0ZW5kcyBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24geworICAgIAorICAgIHB1YmxpYyBKYXNwZXJFeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgeworCXN1cGVyKHJlYXNvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIEphc3BlckV4Y2VwdGlvbiB3aXRoIHRoZSBlbWJlZGRlZCBleGNlcHRpb24gYW5kIHRoZSByZWFzb24gZm9yCisgICAgICogdGhyb3dpbmcgYSBKYXNwZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgSmFzcGVyRXhjZXB0aW9uIChTdHJpbmcgcmVhc29uLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisgICAJc3VwZXIocmVhc29uLCBleGNlcHRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBKYXNwZXJFeGNlcHRpb24gd2l0aCB0aGUgZW1iZWRkZWQgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIEphc3BlckV4Y2VwdGlvbiAoVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworICAgCXN1cGVyKGV4Y2VwdGlvbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9Kc3BDLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL0pzcEMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzFlYzExCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9Kc3BDLmphdmEKQEAgLTAsMCArMSwxNDE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5V3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Db21waWxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Kc3BDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuSnNwUnVudGltZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLlRhZ1BsdWdpbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuVGxkTG9jYXRpb25zQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuc2VydmxldC5Kc3BDU2VydmxldENvbnRleHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIFNoZWxsIGZvciB0aGUganNwYyBjb21waWxlci4gIEhhbmRsZXMgYWxsIG9wdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogY29tbWFuZCBsaW5lIGFuZCBjcmVhdGVzIGNvbXBpbGF0aW9uIGNvbnRleHRzIHdoaWNoIGl0IHRoZW4gY29tcGlsZXMKKyAqIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIG9wdGlvbnMuCisgKgorICogVGhpcyB2ZXJzaW9uIGNhbiBwcm9jZXNzIGZpbGVzIGZyb20gYSBfc2luZ2xlXyB3ZWJhcHAgYXQgb25jZSwgaS5lLgorICogYSBzaW5nbGUgZG9jYmFzZSBjYW4gYmUgc3BlY2lmaWVkLgorICoKKyAqIEl0IGNhbiBiZSB1c2VkIGFzIGFuIEFudCB0YXNrIHVzaW5nOgorICogPHByZT4KKyAqICAgJmx0O3Rhc2tkZWYgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmphc3Blci5Kc3BDIiBuYW1lPSJqYXNwZXIyIiAmZ3Q7CisgKiAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgKiAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF2YS5ob21lfS8uLi9saWIvdG9vbHMuamFyIi8mZ3Q7CisgKiAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7RU5WLkNBVEFMSU5BX0hPTUV9L3NlcnZlci9saWIiJmd0OworICogICAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IiouamFyIi8mZ3Q7CisgKiAgICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgKiAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7RU5WLkNBVEFMSU5BX0hPTUV9L2NvbW1vbi9saWIiJmd0OworICogICAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IiouamFyIi8mZ3Q7CisgKiAgICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgKiAgICAgICAgICAmbHQ7cGF0aCByZWZpZD0ibXlqYXJzIi8mZ3Q7CisgKiAgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAqICAmbHQ7L3Rhc2tkZWYmZ3Q7CisgKgorICogICZsdDtqYXNwZXIyIHZlcmJvc2U9IjAiCisgKiAgICAgICAgICAgcGFja2FnZT0ibXkucGFja2FnZSIKKyAqICAgICAgICAgICB1cmlyb290PSIke3dlYmFwcHMuZGlyfS8ke3dlYmFwcC5uYW1lfSIKKyAqICAgICAgICAgICB3ZWJYbWxGcmFnbWVudD0iJHtidWlsZC5kaXJ9L2dlbmVyYXRlZF93ZWIueG1sIgorICogICAgICAgICAgIG91dHB1dERpcj0iJHt3ZWJhcHAuZGlyfS8ke3dlYmFwcC5uYW1lfS9XRUItSU5GL3NyYy9teS9wYWNrYWdlIiAvJmd0OworICogPC9wcmU+CisgKgorICogQGF1dGhvciBEYW5ubyBGZXJyaW4KKyAqIEBhdXRob3IgUGllcnJlIERlbGlzbGUKKyAqIEBhdXRob3IgQ29zdGluIE1hbm9sYWNoZQorICogQGF1dGhvciBZb2F2IFNoYXBpcmEKKyAqLworcHVibGljIGNsYXNzIEpzcEMgaW1wbGVtZW50cyBPcHRpb25zIHsKKyAgICAvKiogVGhlIGRlZmF1bHQgTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIGNsYXNzIElELiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSUVfQ0xBU1NfSUQgPQorICAgICAgICAgICAgImNsc2lkOjhBRDlDODQwLTA0NEUtMTFEMS1CM0U5LTAwODA1RjQ5OUQ5MyI7CisKKyAgICAvKiogTG9nZ2VyIChzZXQgYnkgY29uc3RydWN0b3IuKSAqLworICAgIHByaXZhdGUgTG9nIGxvZzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTV0lUQ0hfVkVSQk9TRSA9ICItdiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9IRUxQID0gIi1oZWxwIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dJVENIX1FVSUVUID0gIi1xIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dJVENIX09VVFBVVF9ESVIgPSAiLWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTV0lUQ0hfSUVfQ0xBU1NfSUQgPSAiLWllcGx1Z2luIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dJVENIX1BBQ0tBR0VfTkFNRSA9ICItcCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9DQUNIRSA9ICItY2FjaGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTV0lUQ0hfQ0xBU1NfTkFNRSA9ICItYyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9GVUxMX1NUT1AgPSAiLS0iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTV0lUQ0hfQ09NUElMRSA9ICItY29tcGlsZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9TT1VSQ0UgPSAiLXNvdXJjZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9UQVJHRVQgPSAiLXRhcmdldCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9VUklfQkFTRSA9ICItdXJpYmFzZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9VUklfUk9PVCA9ICItdXJpcm9vdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9GSUxFX1dFQkFQUCA9ICItd2ViYXBwIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dJVENIX1dFQkFQUF9JTkMgPSAiLXdlYmluYyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9XRUJBUFBfWE1MID0gIi13ZWJ4bWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTV0lUQ0hfTUFQUEVEID0gIi1tYXBwZWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTV0lUQ0hfWFBPV0VSRURfQlkgPSAiLXhwb3dlcmVkQnkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTV0lUQ0hfVFJJTV9TUEFDRVMgPSAiLXRyaW1TcGFjZXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTV0lUQ0hfQ0xBU1NQQVRIID0gIi1jbGFzc3BhdGgiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTV0lUQ0hfRElFID0gIi1kaWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTV0lUQ0hfUE9PTElORyA9ICItcG9vbGluZ0VuYWJsZWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTV0lUQ0hfRU5DT0RJTkcgPSAiLWphdmFFbmNvZGluZyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9TTUFQID0gIi1zbWFwIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dJVENIX0RVTVBfU01BUCA9ICItZHVtcHNtYXAiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfU1VDQ0VTUyA9Ii1zIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9FUlJPUlMgPSAiLWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19XRUJYTUwgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkNfV0VCWE1MID0gMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFMTF9XRUJYTUwgPSAyMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ESUVfTEVWRUwgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19ESUVfTEVWRUwgPSAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gaW5zZXJ0QmVmb3JlID0KKyAgICB7ICI8L3dlYi1hcHA+IiwgIjxzZXJ2bGV0LW1hcHBpbmc+IiwgIjxzZXNzaW9uLWNvbmZpZz4iLAorICAgICAgIjxtaW1lLW1hcHBpbmc+IiwgIjx3ZWxjb21lLWZpbGUtbGlzdD4iLCAiPGVycm9yLXBhZ2U+IiwgIjx0YWdsaWI+IiwKKyAgICAgICI8cmVzb3VyY2UtZW52LXJlZj4iLCAiPHJlc291cmNlLXJlZj4iLCAiPHNlY3VyaXR5LWNvbnN0cmFpbnQ+IiwKKyAgICAgICI8bG9naW4tY29uZmlnPiIsICI8c2VjdXJpdHktcm9sZT4iLCAiPGVudi1lbnRyeT4iLCAiPGVqYi1yZWY+IiwKKyAgICAgICI8ZWpiLWxvY2FsLXJlZj4iIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZGllOworICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzUGF0aCA9IG51bGw7CisgICAgcHJpdmF0ZSBVUkxDbGFzc0xvYWRlciBsb2FkZXIgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiB0cmltU3BhY2VzID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGdlblN0cmluZ0FzQ2hhckFycmF5ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHhwb3dlcmVkQnk7CisgICAgcHJpdmF0ZSBib29sZWFuIG1hcHBlZEZpbGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gcG9vbGluZ0VuYWJsZWQgPSB0cnVlOworICAgIHByaXZhdGUgRmlsZSBzY3JhdGNoRGlyOworICAgIHByaXZhdGUgU3RyaW5nIGllQ2xhc3NJZCA9IERFRkFVTFRfSUVfQ0xBU1NfSUQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0UGFja2FnZTsKKyAgICBwcml2YXRlIFN0cmluZyB0YXJnZXRDbGFzc05hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgdXJpQmFzZTsKKyAgICBwcml2YXRlIFN0cmluZyB1cmlSb290OworICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OworICAgIHByaXZhdGUgaW50IGRpZUxldmVsOworICAgIHByaXZhdGUgYm9vbGVhbiBoZWxwTmVlZGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGNvbXBpbGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc21hcFN1cHByZXNzZWQgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBzbWFwRHVtcGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGNhY2hpbmcgPSB0cnVlOworICAgIHByaXZhdGUgTWFwIGNhY2hlID0gbmV3IEhhc2hNYXAoKTsKKworICAgIHByaXZhdGUgU3RyaW5nIGNvbXBpbGVyID0gbnVsbDsKKworICAgIHByaXZhdGUgU3RyaW5nIGNvbXBpbGVyVGFyZ2V0Vk0gPSAiMS40IjsKKyAgICBwcml2YXRlIFN0cmluZyBjb21waWxlclNvdXJjZVZNID0gIjEuNCI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2xhc3NEZWJ1Z0luZm8gPSB0cnVlOworCisgICAgLyoqCisgICAgICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZXJlJ3MgYSBjb21waWxhdGlvbiBlcnJvciwgb3Igc3dhbGxvdyBpdC4KKyAgICAgKiBEZWZhdWx0IGlzIHRydWUgdG8gcHJlc2VydmUgb2xkIGJlaGF2aW9yLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBmYWlsT25FcnJvciA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSBleHRlbnNpb25zIHRvIGJlIGhhbmRsZWQgYXMgSlNQIGZpbGVzLgorICAgICAqIERlZmF1bHQgbGlzdCBpcyAuanNwIGFuZCAuanNweC4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QgZXh0ZW5zaW9uczsKKworICAgIC8qKgorICAgICAqIFRoZSBwYWdlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QgcGFnZXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBOZWVkcyBiZXR0ZXIgZG9jdW1lbnRhdGlvbiwgdGhpcyBkYXRhIG1lbWJlciBkb2VzLgorICAgICAqIFRydWUgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZXJyb3JPblVzZUJlYW5JbnZhbGlkQ2xhc3NBdHRyaWJ1dGUgPSB0cnVlOworCisgICAgLyoqCisgICAgICogVGhlIGphdmEgZmlsZSBlbmNvZGluZy4gIERlZmF1bHQKKyAgICAgKiBpcyBVVEYtOC4gIEFkZGVkIHBlciBidWd6aWxsYSAxOTYyMi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBqYXZhRW5jb2RpbmcgPSAiVVRGLTgiOworCisgICAgLy8gR2VuZXJhdGlvbiBvZiB3ZWIueG1sIGZyYWdtZW50cworICAgIHByaXZhdGUgU3RyaW5nIHdlYnhtbEZpbGU7CisgICAgcHJpdmF0ZSBpbnQgd2VieG1sTGV2ZWw7CisgICAgcHJpdmF0ZSBib29sZWFuIGFkZFdlYlhtbE1hcHBpbmdzID0gZmFsc2U7CisKKyAgICBwcml2YXRlIFdyaXRlciBtYXBvdXQ7CisgICAgcHJpdmF0ZSBDaGFyQXJyYXlXcml0ZXIgc2VydmxldG91dDsKKyAgICBwcml2YXRlIENoYXJBcnJheVdyaXRlciBtYXBwaW5nb3V0OworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZsZXQgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzcENTZXJ2bGV0Q29udGV4dCBjb250ZXh0OworCisgICAgLyoqCisgICAgICogVGhlIHJ1bnRpbWUgY29udGV4dC4KKyAgICAgKiBNYWludGFpbiBhIGR1bW15IEpzcFJ1bnRpbWVDb250ZXh0IGZvciBjb21waWxpbmcgdGFnIGZpbGVzLgorICAgICAqLworICAgIHByaXZhdGUgSnNwUnVudGltZUNvbnRleHQgcmN0eHQ7CisKKyAgICAvKioKKyAgICAgKiBDYWNoZSBmb3IgdGhlIFRMRCBsb2NhdGlvbnMKKyAgICAgKi8KKyAgICBwcml2YXRlIFRsZExvY2F0aW9uc0NhY2hlIHRsZExvY2F0aW9uc0NhY2hlID0gbnVsbDsKKworICAgIHByaXZhdGUgSnNwQ29uZmlnIGpzcENvbmZpZyA9IG51bGw7CisgICAgcHJpdmF0ZSBUYWdQbHVnaW5NYW5hZ2VyIHRhZ1BsdWdpbk1hbmFnZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbGlzdEVycm9ycyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBzaG93U3VjY2VzcyA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IGFyZ1BvczsKKyAgICBwcml2YXRlIGJvb2xlYW4gZnVsbHN0b3AgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBhcmdzW107CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnW10pIHsKKyAgICAgICAgaWYgKGFyZy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3BjLnVzYWdlIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBKc3BDIGpzcGMgPSBuZXcgSnNwQygpOworICAgICAgICAgICAgICAgIGpzcGMuc2V0QXJncyhhcmcpOworICAgICAgICAgICAgICAgIGlmIChqc3BjLmhlbHBOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3BjLnVzYWdlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGpzcGMuZXhlY3V0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEphc3BlckV4Y2VwdGlvbiBqZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihqZSk7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oamUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoZGllICE9IE5PX0RJRV9MRVZFTCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdChkaWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBDb25zdHJ1Y3Rvci4gKi8KKyAgICBwdWJsaWMgSnNwQygpIHsKKyAgICAgICAgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXJncyhTdHJpbmdbXSBhcmcpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBhcmdzID0gYXJnOworICAgICAgICBTdHJpbmcgdG9rOworCisgICAgICAgIGRpZUxldmVsID0gTk9fRElFX0xFVkVMOworICAgICAgICBkaWUgPSBkaWVMZXZlbDsKKworICAgICAgICB3aGlsZSAoKHRvayA9IG5leHRBcmcoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHRvay5lcXVhbHMoU1dJVENIX1ZFUkJPU0UpKSB7CisgICAgICAgICAgICAgICAgdmVyYm9zZSA9IHRydWU7CisgICAgICAgICAgICAgICAgc2hvd1N1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgICAgIGxpc3RFcnJvcnMgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICh0b2suZXF1YWxzKFNXSVRDSF9PVVRQVVRfRElSKSkgeworICAgICAgICAgICAgICAgIHRvayA9IG5leHRBcmcoKTsKKyAgICAgICAgICAgICAgICBzZXRPdXRwdXREaXIoIHRvayApOworICAgICAgICAgICAgfSBlbHNlIGlmICh0b2suZXF1YWxzKFNXSVRDSF9QQUNLQUdFX05BTUUpKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0UGFja2FnZSA9IG5leHRBcmcoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLmVxdWFscyhTV0lUQ0hfQ09NUElMRSkpIHsKKyAgICAgICAgICAgICAgICBjb21waWxlPXRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRvay5lcXVhbHMoU1dJVENIX0NMQVNTX05BTUUpKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3NOYW1lID0gbmV4dEFyZygpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0b2suZXF1YWxzKFNXSVRDSF9VUklfQkFTRSkpIHsKKyAgICAgICAgICAgICAgICB1cmlCYXNlPW5leHRBcmcoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLmVxdWFscyhTV0lUQ0hfVVJJX1JPT1QpKSB7CisgICAgICAgICAgICAgICAgc2V0VXJpcm9vdCggbmV4dEFyZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLmVxdWFscyhTV0lUQ0hfRklMRV9XRUJBUFApKSB7CisgICAgICAgICAgICAgICAgc2V0VXJpcm9vdCggbmV4dEFyZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHRvay5lcXVhbHMoIFNIT1dfU1VDQ0VTUyApICkgeworICAgICAgICAgICAgICAgIHNob3dTdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHRvay5lcXVhbHMoIExJU1RfRVJST1JTICkgKSB7CisgICAgICAgICAgICAgICAgbGlzdEVycm9ycyA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRvay5lcXVhbHMoU1dJVENIX1dFQkFQUF9JTkMpKSB7CisgICAgICAgICAgICAgICAgd2VieG1sRmlsZSA9IG5leHRBcmcoKTsKKyAgICAgICAgICAgICAgICBpZiAod2VieG1sRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHdlYnhtbExldmVsID0gSU5DX1dFQlhNTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRvay5lcXVhbHMoU1dJVENIX1dFQkFQUF9YTUwpKSB7CisgICAgICAgICAgICAgICAgd2VieG1sRmlsZSA9IG5leHRBcmcoKTsKKyAgICAgICAgICAgICAgICBpZiAod2VieG1sRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHdlYnhtbExldmVsID0gQUxMX1dFQlhNTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRvay5lcXVhbHMoU1dJVENIX01BUFBFRCkpIHsKKyAgICAgICAgICAgICAgICBtYXBwZWRGaWxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLmVxdWFscyhTV0lUQ0hfWFBPV0VSRURfQlkpKSB7CisgICAgICAgICAgICAgICAgeHBvd2VyZWRCeSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRvay5lcXVhbHMoU1dJVENIX1RSSU1fU1BBQ0VTKSkgeworICAgICAgICAgICAgICAgIHNldFRyaW1TcGFjZXModHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRvay5lcXVhbHMoU1dJVENIX0NBQ0hFKSkgeworICAgICAgICAgICAgICAgIHRvayA9IG5leHRBcmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoImZhbHNlIi5lcXVhbHModG9rKSkgeworICAgICAgICAgICAgICAgICAgICBjYWNoaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICAgICAgfSBlbHNlIGlmICh0b2suZXF1YWxzKFNXSVRDSF9DTEFTU1BBVEgpKSB7CisgICAgICAgICAgICAgICAgc2V0Q2xhc3NQYXRoKG5leHRBcmcoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRvay5zdGFydHNXaXRoKFNXSVRDSF9ESUUpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZGllTGV2ZWwgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgdG9rLnN1YnN0cmluZyhTV0lUQ0hfRElFLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgICAgICAgICAgICAgICBkaWVMZXZlbCA9IERFRkFVTFRfRElFX0xFVkVMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkaWUgPSBkaWVMZXZlbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLmVxdWFscyhTV0lUQ0hfSEVMUCkpIHsKKyAgICAgICAgICAgICAgICBoZWxwTmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLmVxdWFscyhTV0lUQ0hfUE9PTElORykpIHsKKyAgICAgICAgICAgICAgICB0b2sgPSBuZXh0QXJnKCk7CisgICAgICAgICAgICAgICAgaWYgKCJmYWxzZSIuZXF1YWxzKHRvaykpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9vbGluZ0VuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwb29saW5nRW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0b2suZXF1YWxzKFNXSVRDSF9FTkNPRElORykpIHsKKyAgICAgICAgICAgICAgICBzZXRKYXZhRW5jb2RpbmcobmV4dEFyZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLmVxdWFscyhTV0lUQ0hfU09VUkNFKSkgeworICAgICAgICAgICAgICAgIHNldENvbXBpbGVyU291cmNlVk0obmV4dEFyZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLmVxdWFscyhTV0lUQ0hfVEFSR0VUKSkgeworICAgICAgICAgICAgICAgIHNldENvbXBpbGVyVGFyZ2V0Vk0obmV4dEFyZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLmVxdWFscyhTV0lUQ0hfU01BUCkpIHsKKyAgICAgICAgICAgICAgICBzbWFwU3VwcHJlc3NlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmICh0b2suZXF1YWxzKFNXSVRDSF9EVU1QX1NNQVApKSB7CisgICAgICAgICAgICAgICAgc21hcER1bXBlZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh0b2suc3RhcnRzV2l0aCgiLSIpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oIlVucmVjb2duaXplZCBvcHRpb246ICIgKyB0b2sgKworICAgICAgICAgICAgICAgICAgICAgICAgIi4gIFVzZSAtaGVscCBmb3IgaGVscC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFmdWxsc3RvcCkgeworICAgICAgICAgICAgICAgICAgICBhcmdQb3MtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gU3RhcnQgdHJlYXRpbmcgdGhlIHJlc3QgYXMgSlNQIFBhZ2VzCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgYWxsIGV4dHJhIGFyZ3VtZW50cyB0byB0aGUgbGlzdCBvZiBmaWxlcworICAgICAgICB3aGlsZSggdHJ1ZSApIHsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlID0gbmV4dEZpbGUoKTsKKyAgICAgICAgICAgIGlmKCBmaWxlPT1udWxsICkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFnZXMuYWRkKCBmaWxlICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRLZWVwR2VuZXJhdGVkKCkgeworICAgICAgICAvLyBpc24ndCB0aGlzIHdoeSB3ZSBhcmUgcnVubmluZyBqc3BjPworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUcmltU3BhY2VzKCkgeworICAgICAgICByZXR1cm4gdHJpbVNwYWNlczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmltU3BhY2VzKGJvb2xlYW4gdHMpIHsKKyAgICAgICAgdGhpcy50cmltU3BhY2VzID0gdHM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQb29saW5nRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIHBvb2xpbmdFbmFibGVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBvb2xpbmdFbmFibGVkKGJvb2xlYW4gcG9vbGluZ0VuYWJsZWQpIHsKKyAgICAgICAgdGhpcy5wb29saW5nRW5hYmxlZCA9IHBvb2xpbmdFbmFibGVkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzWHBvd2VyZWRCeSgpIHsKKyAgICAgICAgcmV0dXJuIHhwb3dlcmVkQnk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0WHBvd2VyZWRCeShib29sZWFuIHhwb3dlcmVkQnkpIHsKKyAgICAgICAgdGhpcy54cG93ZXJlZEJ5ID0geHBvd2VyZWRCeTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRFcnJvck9uVXNlQmVhbkludmFsaWRDbGFzc0F0dHJpYnV0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yT25Vc2VCZWFuSW52YWxpZENsYXNzQXR0cmlidXRlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yT25Vc2VCZWFuSW52YWxpZENsYXNzQXR0cmlidXRlKGJvb2xlYW4gYikgeworICAgICAgICBlcnJvck9uVXNlQmVhbkludmFsaWRDbGFzc0F0dHJpYnV0ZSA9IGI7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUYWdQb29sU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIENvbnN0YW50cy5NQVhfUE9PTF9TSVpFOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFyZSB3ZSBzdXBwb3J0aW5nIEhUTUwgbWFwcGVkIHNlcnZsZXRzPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE1hcHBlZEZpbGUoKSB7CisgICAgICAgIHJldHVybiBtYXBwZWRGaWxlOworICAgIH0KKworICAgIC8vIE9mZi1saW5lIGNvbXBpbGVyLCBubyBuZWVkIGZvciBzZWN1cml0eSBtYW5hZ2VyCisgICAgcHVibGljIE9iamVjdCBnZXRQcm90ZWN0aW9uRG9tYWluKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTZW5kRXJyb3JUb0NsaWVudCgpIHsKKyAgICAgICAgLy8gaW1wbGllZCBzZW5kIHRvIFN5c3RlbS5lcnIKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NEZWJ1Z0luZm8oIGJvb2xlYW4gYiApIHsKKyAgICAgICAgY2xhc3NEZWJ1Z0luZm89YjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDbGFzc0RlYnVnSW5mbygpIHsKKyAgICAgICAgLy8gY29tcGlsZSB3aXRoIGRlYnVnIGluZm8KKyAgICAgICAgcmV0dXJuIGNsYXNzRGVidWdJbmZvOworICAgIH0KKworICAgICAvKioKKyAgICAgICogQHNlZSBPcHRpb25zI2lzQ2FjaGluZygpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDYWNoaW5nKCkgeworICAgICAgICByZXR1cm4gY2FjaGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIE9wdGlvbnMjaXNDYWNoaW5nKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWNoaW5nKGJvb2xlYW4gY2FjaGluZykgeworICAgICAgICB0aGlzLmNhY2hpbmcgPSBjYWNoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgT3B0aW9ucyNnZXRDYWNoZSgpCisgICAgICovCisgICAgcHVibGljIE1hcCBnZXRDYWNoZSgpIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJhY2tncm91bmQgY29tcGlsYXRpb24gY2hlY2sgaW50ZXJ2YWxzIGluIHNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENoZWNrSW50ZXJ2YWwoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1vZGlmaWNhdGlvbiB0ZXN0IGludGVydmFsLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TW9kaWZpY2F0aW9uVGVzdEludGVydmFsKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyBKYXNwZXIgYmVpbmcgdXNlZCBpbiBkZXZlbG9wbWVudCBtb2RlPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldERldmVsb3BtZW50KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhlIGdlbmVyYXRpb24gb2YgU01BUCBpbmZvIGZvciBKU1I0NSBkZWJ1Z2dpbiBzdXBwcmVzc2VkPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU21hcFN1cHByZXNzZWQoKSB7CisgICAgICAgIHJldHVybiBzbWFwU3VwcHJlc3NlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgc21hcFN1cHByZXNzZWQgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTbWFwU3VwcHJlc3NlZChib29sZWFuIHNtYXBTdXBwcmVzc2VkKSB7CisgICAgICAgIHRoaXMuc21hcFN1cHByZXNzZWQgPSBzbWFwU3VwcHJlc3NlZDsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBTaG91bGQgU01BUCBpbmZvIGZvciBKU1I0NSBkZWJ1Z2dpbmcgYmUgZHVtcGVkIHRvIGEgZmlsZT8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NtYXBEdW1wZWQoKSB7CisgICAgICAgIHJldHVybiBzbWFwRHVtcGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBzbWFwU3VwcHJlc3NlZCBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNtYXBEdW1wZWQoYm9vbGVhbiBzbWFwRHVtcGVkKSB7CisgICAgICAgIHRoaXMuc21hcER1bXBlZCA9IHNtYXBEdW1wZWQ7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRleHQgc3RyaW5ncyBhcmUgdG8gYmUgZ2VuZXJhdGVkIGFzIGNoYXIgYXJyYXlzLAorICAgICAqIHdoaWNoIGltcHJvdmVzIHBlcmZvcm1hbmNlIGluIHNvbWUgY2FzZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ2VuU3RyaW5nQXNDaGFyQXJyYXkgdHJ1ZSBpZiB0ZXh0IHN0cmluZ3MgYXJlIHRvIGJlIGdlbmVyYXRlZCBhcworICAgICAqIGNoYXIgYXJyYXlzLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRHZW5TdHJpbmdBc0NoYXJBcnJheShib29sZWFuIGdlblN0cmluZ0FzQ2hhckFycmF5KSB7CisgICAgICAgIHRoaXMuZ2VuU3RyaW5nQXNDaGFyQXJyYXkgPSBnZW5TdHJpbmdBc0NoYXJBcnJheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0ZXh0IHN0cmluZ3MgYXJlIHRvIGJlIGdlbmVyYXRlZCBhcyBjaGFyIGFycmF5cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0ZXh0IHN0cmluZ3MgYXJlIHRvIGJlIGdlbmVyYXRlZCBhcyBjaGFyIGFycmF5cywgZmFsc2UKKyAgICAgKiBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZW5TdHJpbmdBc0NoYXJBcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIGdlblN0cmluZ0FzQ2hhckFycmF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNsYXNzLWlkIHZhbHVlIHRvIGJlIHNlbnQgdG8gSW50ZXJuZXQgRXhwbG9yZXIgd2hlbiB1c2luZworICAgICAqIDxqc3A6cGx1Z2luPiB0YWdzLgorICAgICAqCisgICAgICogQHBhcmFtIGllQ2xhc3NJZCBDbGFzcy1pZCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEllQ2xhc3NJZChTdHJpbmcgaWVDbGFzc0lkKSB7CisgICAgICAgIHRoaXMuaWVDbGFzc0lkID0gaWVDbGFzc0lkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGNsYXNzLWlkIHZhbHVlIHRoYXQgaXMgc2VudCB0byBJbnRlcm5ldCBFeHBsb3JlciB3aGVuIHVzaW5nCisgICAgICogPGpzcDpwbHVnaW4+IHRhZ3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIENsYXNzLWlkIHZhbHVlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJZUNsYXNzSWQoKSB7CisgICAgICAgIHJldHVybiBpZUNsYXNzSWQ7CisgICAgfQorCisgICAgcHVibGljIEZpbGUgZ2V0U2NyYXRjaERpcigpIHsKKyAgICAgICAgcmV0dXJuIHNjcmF0Y2hEaXI7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldEpzcENvbXBpbGVyUGx1Z2luKCkgeworICAgICAgIC8vIHdlIGRvbid0IGNvbXBpbGUsIHNvIHRoaXMgaXMgbWVhbmxpbmdsZXNzCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SnNwQ29tcGlsZXJQYXRoKCkgeworICAgICAgIC8vIHdlIGRvbid0IGNvbXBpbGUsIHNvIHRoaXMgaXMgbWVhbmxpbmdsZXNzCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBpbGVyIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBpbGVyKCkgeworICAgICAgICByZXR1cm4gY29tcGlsZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZXIoU3RyaW5nIGMpIHsKKyAgICAgICAgY29tcGlsZXI9YzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIE9wdGlvbnMjZ2V0Q29tcGlsZXJUYXJnZXRWTQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcGlsZXJUYXJnZXRWTSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyVGFyZ2V0Vk07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZXJUYXJnZXRWTShTdHJpbmcgdm0pIHsKKyAgICAgICAgY29tcGlsZXJUYXJnZXRWTSA9IHZtOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgT3B0aW9ucyNnZXRDb21waWxlclNvdXJjZVZNKCkKKyAgICAgKi8KKyAgICAgcHVibGljIFN0cmluZyBnZXRDb21waWxlclNvdXJjZVZNKCkgeworICAgICAgICAgcmV0dXJuIGNvbXBpbGVyU291cmNlVk07CisgICAgIH0KKyAgICAgICAgCisgICAgLyoqCisgICAgICogQHNlZSBPcHRpb25zI2dldENvbXBpbGVyU291cmNlVk0oKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXBpbGVyU291cmNlVk0oU3RyaW5nIHZtKSB7CisgICAgICAgIGNvbXBpbGVyU291cmNlVk0gPSB2bTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGxkTG9jYXRpb25zQ2FjaGUgZ2V0VGxkTG9jYXRpb25zQ2FjaGUoKSB7CisgICAgICAgIHJldHVybiB0bGRMb2NhdGlvbnNDYWNoZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBlbmNvZGluZyB0byB1c2UgZm9yCisgICAgICogamF2YSBmaWxlcy4gIFRoZSBkZWZhdWx0IGlzIFVURi04LgorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgVGhlIGVuY29kaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRKYXZhRW5jb2RpbmcoKSB7CisgICAgICAgIHJldHVybiBqYXZhRW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZW5jb2RpbmcgdG8gdXNlIGZvcgorICAgICAqIGphdmEgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5jb2RpbmdOYW1lIFRoZSBuYW1lLCBlLmcuICJVVEYtOCIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKYXZhRW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nTmFtZSkgeworICAgICAgICBqYXZhRW5jb2RpbmcgPSBlbmNvZGluZ05hbWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Rm9yaygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NQYXRoKCkgeworICAgICAgICBpZiggY2xhc3NQYXRoICE9IG51bGwgKQorICAgICAgICAgICAgcmV0dXJuIGNsYXNzUGF0aDsKKyAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NQYXRoKFN0cmluZyBzKSB7CisgICAgICAgIGNsYXNzUGF0aD1zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgZmlsZSBleHRlbnNpb25zCisgICAgICogdGhhdCBhcmUgdHJlYXRlZCBhcyBKU1AgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGV4dGVuc2lvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRFeHRlbnNpb25zKCkgeworICAgICAgICByZXR1cm4gZXh0ZW5zaW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBnaXZlbiBmaWxlIGV4dGVuc2lvbiB0byB0aGUKKyAgICAgKiBsaXN0IG9mIGV4dGVuc2lvbnMgaGFuZGxlZCBhcyBKU1AgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uIFRoZSBleHRlbnNpb24gdG8gYWRkLCBlLmcuICJteWpzcCIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlbnNpb24oZmluYWwgU3RyaW5nIGV4dGVuc2lvbikgeworICAgICAgICBpZihleHRlbnNpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYoZXh0ZW5zaW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZXh0ZW5zaW9ucy5hZGQoZXh0ZW5zaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlUHJvamVjdCBUaGUgcHJvamVjdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoZmluYWwgUHJvamVjdCB0aGVQcm9qZWN0KSB7CisgICAgICAgIHByb2plY3QgPSB0aGVQcm9qZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHByb2plY3Q6IG1heSBiZSBudWxsIGlmIG5vdCBydW5uaW5nCisgICAgICogaW5zaWRlIGFuIEFudCBwcm9qZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcHJvamVjdAorICAgICAqLworICAgIHB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEJhc2UgZGlyIGZvciB0aGUgd2ViYXBwLiBVc2VkIHRvIGdlbmVyYXRlIGNsYXNzIG5hbWVzIGFuZCByZXNvbHZlCisgICAgICogaW5jbHVkZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcmlyb290KCBTdHJpbmcgcyApIHsKKyAgICAgICAgaWYoIHM9PW51bGwgKSB7CisgICAgICAgICAgICB1cmlSb290ID0gczsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdXJpUm9vdCA9IHJlc29sdmVGaWxlKHMpLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgdXJpUm9vdCA9IHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgSlNQIGZpbGVzIHRvIGJlIHByb2Nlc3NlZC4gIElmIHRoZSBhcmd1bWVudAorICAgICAqIGlzIG51bGwsIG5vdGhpbmcgaXMgZG9uZS4KKyAgICAgKgorICAgICAqIDxwPkVhY2ggZmlsZSBpcyBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB1cmlyb290LCB1bmxlc3MgaXQgaXMgYWJzb2x1dGUsCisgICAgICogaW4gd2hpY2ggY2FzZSBpdCBtdXN0IHN0YXJ0IHdpdGggdXJpcm9vdC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0ganNwRmlsZXMgQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgSlNQIGZpbGVzIHRvIGJlIHByb2Nlc3NlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEpzcEZpbGVzKGZpbmFsIFN0cmluZyBqc3BGaWxlcykgeworICAgICAgICBpZihqc3BGaWxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihqc3BGaWxlcywgIiwiKTsKKyAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIHBhZ2VzLmFkZCh0b2submV4dFRva2VuKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29tcGlsZSBmbGFnLgorICAgICAqCisgICAgICogQHBhcmFtIGIgRmxhZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXBpbGUoIGZpbmFsIGJvb2xlYW4gYiApIHsKKyAgICAgICAgY29tcGlsZSA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmVyYm9zaXR5IGxldmVsLiAgVGhlIGFjdHVhbCBudW1iZXIgZG9lc24ndAorICAgICAqIG1hdHRlcjogaWYgaXQncyBncmVhdGVyIHRoYW4gemVybywgdGhlIHZlcmJvc2UgZmxhZyB3aWxsCisgICAgICogYmUgdHJ1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZXZlbCBQb3NpdGl2ZSBtZWFucyB2ZXJib3NlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZSggZmluYWwgaW50IGxldmVsICkgeworICAgICAgICBpZiAobGV2ZWwgPiAwKSB7CisgICAgICAgICAgICB2ZXJib3NlID0gdHJ1ZTsKKyAgICAgICAgICAgIHNob3dTdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIGxpc3RFcnJvcnMgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGVYbWwoIGJvb2xlYW4gYiApIHsKKyAgICAgICAgb3JnLmFwYWNoZS5qYXNwZXIueG1scGFyc2VyLlBhcnNlclV0aWxzLnZhbGlkYXRpbmc9YjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0RXJyb3JzKCBib29sZWFuIGIgKSB7CisgICAgICAgIGxpc3RFcnJvcnMgPSBiOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dERpciggU3RyaW5nIHMgKSB7CisgICAgICAgIGlmKCBzIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHNjcmF0Y2hEaXIgPSByZXNvbHZlRmlsZShzKS5nZXRBYnNvbHV0ZUZpbGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNjcmF0Y2hEaXI9bnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2UoIFN0cmluZyBwICkgeworICAgICAgICB0YXJnZXRQYWNrYWdlPXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3MgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGZpbGUgKCB3aXRob3V0IHBhY2thZ2UgKS4KKyAgICAgKiBDYW4gb25seSBiZSB1c2VkIGlmIGEgc2luZ2xlIGZpbGUgaXMgY29udmVydGVkLgorICAgICAqIFhYWCBEbyB3ZSBuZWVkIHRoaXMgZmVhdHVyZSA/CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKCBTdHJpbmcgcCApIHsKKyAgICAgICAgdGFyZ2V0Q2xhc3NOYW1lPXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsZSB3aGVyZSB3ZSBnZW5lcmF0ZSBhIHdlYi54bWwgZnJhZ21lbnQgd2l0aCB0aGUgY2xhc3MgZGVmaW5pdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2ViWG1sRnJhZ21lbnQoIFN0cmluZyBzICkgeworICAgICAgICB3ZWJ4bWxGaWxlPXJlc29sdmVGaWxlKHMpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICB3ZWJ4bWxMZXZlbD1JTkNfV0VCWE1MOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbGUgd2hlcmUgd2UgZ2VuZXJhdGUgYSBjb21wbGV0ZSB3ZWIueG1sIHdpdGggdGhlIGNsYXNzIGRlZmluaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdlYlhtbCggU3RyaW5nIHMgKSB7CisgICAgICAgIHdlYnhtbEZpbGU9cmVzb2x2ZUZpbGUocykuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIHdlYnhtbExldmVsPUFMTF9XRUJYTUw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWRkV2ViWG1sTWFwcGluZ3MoYm9vbGVhbiBiKSB7CisgICAgICAgIGFkZFdlYlhtbE1hcHBpbmdzID0gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG9wdGlvbiB0aGF0IHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBvZiBhIGNvbXBpbGF0aW9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWxPbkVycm9yKGZpbmFsIGJvb2xlYW4gYikgeworICAgICAgICBmYWlsT25FcnJvciA9IGI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RmFpbE9uRXJyb3IoKSB7CisgICAgICAgIHJldHVybiBmYWlsT25FcnJvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW4gSlNQIGNvbmZpZ3VyYXRpb24gaW5mb3JtYW50aW9uIHNwZWNpZmllZCBpbiB3ZWIueG1sLgorICAgICAqLworICAgIHB1YmxpYyBKc3BDb25maWcgZ2V0SnNwQ29uZmlnKCkgeworICAgICAgICByZXR1cm4ganNwQ29uZmlnOworICAgIH0KKworICAgIHB1YmxpYyBUYWdQbHVnaW5NYW5hZ2VyIGdldFRhZ1BsdWdpbk1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiB0YWdQbHVnaW5NYW5hZ2VyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlV2ViTWFwcGluZyggU3RyaW5nIGZpbGUsIEpzcENvbXBpbGF0aW9uQ29udGV4dCBjbGN0eHQgKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJHZW5lcmF0aW5nIHdlYiBtYXBwaW5nIGZvciBmaWxlICIgKyBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgKyAiIHVzaW5nIGNvbXBpbGF0aW9uIGNvbnRleHQgIiArIGNsY3R4dCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY2xjdHh0LmdldFNlcnZsZXRDbGFzc05hbWUoKTsKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY2xjdHh0LmdldFNlcnZsZXRQYWNrYWdlTmFtZSgpOworCisgICAgICAgIFN0cmluZyB0aGlzU2VydmxldE5hbWU7CisgICAgICAgIGlmICAoIiIuZXF1YWxzKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgdGhpc1NlcnZsZXROYW1lID0gY2xhc3NOYW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpc1NlcnZsZXROYW1lID0gcGFja2FnZU5hbWUgKyAnLicgKyBjbGFzc05hbWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VydmxldG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXJ2bGV0b3V0LndyaXRlKCJcbiAgICA8c2VydmxldD5cbiAgICAgICAgPHNlcnZsZXQtbmFtZT4iKTsKKyAgICAgICAgICAgIHNlcnZsZXRvdXQud3JpdGUodGhpc1NlcnZsZXROYW1lKTsKKyAgICAgICAgICAgIHNlcnZsZXRvdXQud3JpdGUoIjwvc2VydmxldC1uYW1lPlxuICAgICAgICA8c2VydmxldC1jbGFzcz4iKTsKKyAgICAgICAgICAgIHNlcnZsZXRvdXQud3JpdGUodGhpc1NlcnZsZXROYW1lKTsKKyAgICAgICAgICAgIHNlcnZsZXRvdXQud3JpdGUoIjwvc2VydmxldC1jbGFzcz5cbiAgICA8L3NlcnZsZXQ+XG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWFwcGluZ291dCAhPSBudWxsKSB7CisgICAgICAgICAgICBtYXBwaW5nb3V0LndyaXRlKCJcbiAgICA8c2VydmxldC1tYXBwaW5nPlxuICAgICAgICA8c2VydmxldC1uYW1lPiIpOworICAgICAgICAgICAgbWFwcGluZ291dC53cml0ZSh0aGlzU2VydmxldE5hbWUpOworICAgICAgICAgICAgbWFwcGluZ291dC53cml0ZSgiPC9zZXJ2bGV0LW5hbWU+XG4gICAgICAgIDx1cmwtcGF0dGVybj4iKTsKKyAgICAgICAgICAgIG1hcHBpbmdvdXQud3JpdGUoZmlsZS5yZXBsYWNlKCdcXCcsICcvJykpOworICAgICAgICAgICAgbWFwcGluZ291dC53cml0ZSgiPC91cmwtcGF0dGVybj5cbiAgICA8L3NlcnZsZXQtbWFwcGluZz5cbiIpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmNsdWRlIHRoZSBnZW5lcmF0ZWQgd2ViLnhtbCBpbnNpZGUgdGhlIHdlYmFwcCdzIHdlYi54bWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbWVyZ2VJbnRvV2ViWG1sKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBGaWxlIHdlYmFwcEJhc2UgPSBuZXcgRmlsZSh1cmlSb290KTsKKyAgICAgICAgRmlsZSB3ZWJYbWwgPSBuZXcgRmlsZSh3ZWJhcHBCYXNlLCAiV0VCLUlORi93ZWIueG1sIik7CisgICAgICAgIEZpbGUgd2ViWG1sMiA9IG5ldyBGaWxlKHdlYmFwcEJhc2UsICJXRUItSU5GL3dlYjIueG1sIik7CisgICAgICAgIFN0cmluZyBpbnNlcnRTdGFydE1hcmtlciA9CisgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwYy53ZWJpbmMuaW5zZXJ0U3RhcnQiKTsKKyAgICAgICAgU3RyaW5nIGluc2VydEVuZE1hcmtlciA9CisgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwYy53ZWJpbmMuaW5zZXJ0RW5kIik7CisKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHdlYlhtbCkpOworICAgICAgICBCdWZmZXJlZFJlYWRlciBmcmFnbWVudFJlYWRlciA9CisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIod2VieG1sRmlsZSkpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIod2ViWG1sMikpOworCisgICAgICAgIC8vIEluc2VydCB0aGUgPHNlcnZsZXQ+IGFuZCA8c2VydmxldC1tYXBwaW5nPiBkZWNsYXJhdGlvbnMKKyAgICAgICAgaW50IHBvcyA9IC0xOworICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTa2lwIGFueXRoaW5nIHByZXZpb3VzbHkgZ2VuZXJhdGVkIGJ5IEpTUEMKKyAgICAgICAgICAgIGlmIChsaW5lLmluZGV4T2YoaW5zZXJ0U3RhcnRNYXJrZXIpID49IDApIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5pbmRleE9mKGluc2VydEVuZE1hcmtlcikgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnNlcnRCZWZvcmUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwb3MgPSBsaW5lLmluZGV4T2YoaW5zZXJ0QmVmb3JlW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAocG9zID49IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KGxpbmUuc3Vic3RyaW5nKDAsIHBvcykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdyaXRlci5wcmludGxuKGluc2VydFN0YXJ0TWFya2VyKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lMiA9IGZyYWdtZW50UmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBpZiAobGluZTIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihsaW5lMik7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLnByaW50bG4oaW5zZXJ0RW5kTWFya2VyKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvczsgaSsrKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZXIucHJpbnRsbihsaW5lLnN1YnN0cmluZyhwb3MpKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obGluZSk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisKKyAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgIGZyYWdtZW50UmVhZGVyLmNsb3NlKCk7CisKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0od2ViWG1sMik7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0od2ViWG1sKTsKKworICAgICAgICBieXRlIGJ1ZltdID0gbmV3IGJ5dGVbNTEyXTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBuID0gZmlzLnJlYWQoYnVmKTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9zLndyaXRlKGJ1ZiwgMCwgbik7CisgICAgICAgIH0KKworICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgZm9zLmNsb3NlKCk7CisKKyAgICAgICAgd2ViWG1sMi5kZWxldGUoKTsKKyAgICAgICAgKG5ldyBGaWxlKHdlYnhtbEZpbGUpKS5kZWxldGUoKTsKKworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmlsZShTdHJpbmcgZmlsZSkKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIlByb2Nlc3NpbmcgZmlsZTogIiArIGZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgQ2xhc3NMb2FkZXIgb3JpZ2luYWxDbGFzc0xvYWRlciA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHNldCB1cCBhIHNjcmF0Y2gvb3V0cHV0IGRpciBpZiBub25lIGlzIHByb3ZpZGVkCisgICAgICAgICAgICBpZiAoc2NyYXRjaERpciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRlbXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7CisgICAgICAgICAgICAgICAgaWYgKHRlbXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gIiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNjcmF0Y2hEaXIgPSBuZXcgRmlsZShuZXcgRmlsZSh0ZW1wKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBqc3BVcmk9ZmlsZS5yZXBsYWNlKCdcXCcsJy8nKTsKKyAgICAgICAgICAgIEpzcENvbXBpbGF0aW9uQ29udGV4dCBjbGN0eHQgPSBuZXcgSnNwQ29tcGlsYXRpb25Db250ZXh0CisgICAgICAgICAgICAgICAgKCBqc3BVcmksIGZhbHNlLCAgdGhpcywgY29udGV4dCwgbnVsbCwgcmN0eHQgKTsKKworICAgICAgICAgICAgLyogT3ZlcnJpZGUgdGhlIGRlZmF1bHRzICovCisgICAgICAgICAgICBpZiAoKHRhcmdldENsYXNzTmFtZSAhPSBudWxsKSAmJiAodGFyZ2V0Q2xhc3NOYW1lLmxlbmd0aCgpID4gMCkpIHsKKyAgICAgICAgICAgICAgICBjbGN0eHQuc2V0U2VydmxldENsYXNzTmFtZSh0YXJnZXRDbGFzc05hbWUpOworICAgICAgICAgICAgICAgIHRhcmdldENsYXNzTmFtZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGFyZ2V0UGFja2FnZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xjdHh0LnNldFNlcnZsZXRQYWNrYWdlTmFtZSh0YXJnZXRQYWNrYWdlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3JpZ2luYWxDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICBpZiggbG9hZGVyPT1udWxsICkgeworICAgICAgICAgICAgICAgIGluaXRDbGFzc0xvYWRlciggY2xjdHh0ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihsb2FkZXIpOworCisgICAgICAgICAgICBjbGN0eHQuc2V0Q2xhc3NMb2FkZXIobG9hZGVyKTsKKyAgICAgICAgICAgIGNsY3R4dC5zZXRDbGFzc1BhdGgoY2xhc3NQYXRoKTsKKworICAgICAgICAgICAgQ29tcGlsZXIgY2xjID0gY2xjdHh0LmNyZWF0ZUNvbXBpbGVyKCk7CisKKyAgICAgICAgICAgIC8vIElmIGNvbXBpbGUgaXMgc2V0LCBnZW5lcmF0ZSBib3RoIC5qYXZhIGFuZCAuY2xhc3MsIGlmCisgICAgICAgICAgICAvLyAuanNwIGZpbGUgaXMgbmV3ZXIgdGhhbiAuY2xhc3MgZmlsZTsKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSBvbmx5IGdlbmVyYXRlIC5qYXZhLCBpZiAuanNwIGZpbGUgaXMgbmV3ZXIgdGhhbgorICAgICAgICAgICAgLy8gdGhlIC5qYXZhIGZpbGUKKyAgICAgICAgICAgIGlmKCBjbGMuaXNPdXREYXRlZChjb21waWxlKSApIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGpzcFVyaSArICIgaXMgb3V0IGRhdGVkLCBjb21waWxpbmcuLi4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjbGMuY29tcGlsZShjb21waWxlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gR2VuZXJhdGUgbWFwcGluZworICAgICAgICAgICAgZ2VuZXJhdGVXZWJNYXBwaW5nKCBmaWxlLCBjbGN0eHQgKTsKKyAgICAgICAgICAgIGlmICggc2hvd1N1Y2Nlc3MgKSB7CisgICAgICAgICAgICAgICAgbG9nLmluZm8oICJCdWlsdCBGaWxlOiAiICsgZmlsZSApOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKEphc3BlckV4Y2VwdGlvbiBqZSkgeworICAgICAgICAgICAgVGhyb3dhYmxlIHJvb3RDYXVzZSA9IGplOworICAgICAgICAgICAgd2hpbGUgKHJvb3RDYXVzZSBpbnN0YW5jZW9mIEphc3BlckV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAmJiAoKEphc3BlckV4Y2VwdGlvbikgcm9vdENhdXNlKS5nZXRSb290Q2F1c2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcm9vdENhdXNlID0gKChKYXNwZXJFeGNlcHRpb24pIHJvb3RDYXVzZSkuZ2V0Um9vdENhdXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocm9vdENhdXNlICE9IGplKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3BjLmVycm9yLmdlbmVyYWxFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdENhdXNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQnVnemlsbGEgMzUxMTQuCisgICAgICAgICAgICBpZihnZXRGYWlsT25FcnJvcigpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgamU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihqZS5nZXRNZXNzYWdlKCksIGplKTs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmICgoZSBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikgJiYgbG9nLmlzV2FybkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3BjLmVycm9yLmZpbGVEb2VzTm90RXhpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYob3JpZ2luYWxDbGFzc0xvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIob3JpZ2luYWxDbGFzc0xvYWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGUgYWxsIGpzcCBmaWxlcyBpbiB0aGUgd2ViYXBwLiBVc2VkIGlmIG5vIGV4cGxpY2l0CisgICAgICoganNwcyBhcmUgc3BlY2lmaWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNjYW5GaWxlcyggRmlsZSBiYXNlICkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIFN0YWNrIGRpcnMgPSBuZXcgU3RhY2soKTsKKyAgICAgICAgZGlycy5wdXNoKGJhc2UpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBkZWZhdWx0IGV4dGVuc2lvbnMgYXJlIGFsd2F5cyBpbmNsdWRlZAorICAgICAgICBpZiAoKGdldEV4dGVuc2lvbnMoKSA9PSBudWxsKSB8fCAoZ2V0RXh0ZW5zaW9ucygpLnNpemUoKSA8IDIpKSB7CisgICAgICAgICAgICBhZGRFeHRlbnNpb24oImpzcCIpOworICAgICAgICAgICAgYWRkRXh0ZW5zaW9uKCJqc3B4Iik7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoIWRpcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IGRpcnMucG9wKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHMpOworICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkgJiYgZi5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBmLmxpc3QoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZXh0OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAoZmlsZXMgIT0gbnVsbCkgJiYgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZjIgPSBuZXcgRmlsZShzLCBmaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmMi5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXJzLnB1c2goZjIuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZjIuZ2V0UGF0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHBhdGguc3Vic3RyaW5nKHVyaVJvb3QubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZXh0ID0gZmlsZXNbaV0uc3Vic3RyaW5nKGZpbGVzW2ldLmxhc3RJbmRleE9mKCcuJykgKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEV4dGVuc2lvbnMoKS5jb250YWlucyhleHQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAganNwQ29uZmlnLmlzSnNwUGFnZSh1cmkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZXMuYWRkKHBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIGNvbXBpbGF0aW9uLgorICAgICAqCisgICAgICogQHRocm93cyBKYXNwZXJFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJleGVjdXRlKCkgc3RhcnRpbmcgZm9yICIgKyBwYWdlcy5zaXplKCkgKyAiIHBhZ2VzLiIpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh1cmlSb290ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiggcGFnZXMuc2l6ZSgpID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmpzcGMubWlzc2luZ1RhcmdldCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpcnN0SnNwID0gKFN0cmluZykgcGFnZXMuZ2V0KCAwICk7CisgICAgICAgICAgICAgICAgRmlsZSBmaXJzdEpzcEYgPSBuZXcgRmlsZSggZmlyc3RKc3AgKTsKKyAgICAgICAgICAgICAgICBpZiAoIWZpcnN0SnNwRi5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcGMuZXJyb3IuZmlsZURvZXNOb3RFeGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEpzcCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2NhdGVVcmlSb290KCBmaXJzdEpzcEYgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHVyaVJvb3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuanNwYy5ub191cmlyb290IikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggY29udGV4dD09bnVsbCApIHsKKyAgICAgICAgICAgICAgICBpbml0U2VydmxldENvbnRleHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTm8gZXhwbGljaXQgcGFnZXMsIHdlJ2xsIHByb2Nlc3MgYWxsIC5qc3AgaW4gdGhlIHdlYmFwcAorICAgICAgICAgICAgaWYgKHBhZ2VzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc2NhbkZpbGVzKCBuZXcgRmlsZSggdXJpUm9vdCApKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRmlsZSB1cmlSb290RiA9IG5ldyBGaWxlKHVyaVJvb3QpOworICAgICAgICAgICAgaWYgKCF1cmlSb290Ri5leGlzdHMoKSB8fCAhdXJpUm9vdEYuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuanNwYy51cmlyb290X25vdF9kaXIiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluaXRXZWJYbWwoKTsKKworICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IHBhZ2VzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmV4dGpzcCA9IGl0ZXIubmV4dCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgRmlsZSBmanNwID0gbmV3IEZpbGUobmV4dGpzcCk7CisgICAgICAgICAgICAgICAgaWYgKCFmanNwLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgICAgICBmanNwID0gbmV3IEZpbGUodXJpUm9vdEYsIG5leHRqc3ApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWZqc3AuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExvY2FsaXplci5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgianNwYy5lcnJvci5maWxlRG9lc05vdEV4aXN0IiwgZmpzcC50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBzID0gZmpzcC5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICBpZiAocy5zdGFydHNXaXRoKHVyaVJvb3QpKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHRqc3AgPSBzLnN1YnN0cmluZyh1cmlSb290Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5leHRqc3Auc3RhcnRzV2l0aCgiLiIgKyBGaWxlLnNlcGFyYXRvckNoYXIpKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHRqc3AgPSBuZXh0anNwLnN1YnN0cmluZygyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbGUobmV4dGpzcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbXBsZXRlV2ViWG1sKCk7CisKKyAgICAgICAgICAgIGlmIChhZGRXZWJYbWxNYXBwaW5ncykgeworICAgICAgICAgICAgICAgIG1lcmdlSW50b1dlYlhtbCgpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihpb2UpOworCisgICAgICAgIH0gY2F0Y2ggKEphc3BlckV4Y2VwdGlvbiBqZSkgeworICAgICAgICAgICAgVGhyb3dhYmxlIHJvb3RDYXVzZSA9IGplOworICAgICAgICAgICAgd2hpbGUgKHJvb3RDYXVzZSBpbnN0YW5jZW9mIEphc3BlckV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAmJiAoKEphc3BlckV4Y2VwdGlvbikgcm9vdENhdXNlKS5nZXRSb290Q2F1c2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcm9vdENhdXNlID0gKChKYXNwZXJFeGNlcHRpb24pIHJvb3RDYXVzZSkuZ2V0Um9vdENhdXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocm9vdENhdXNlICE9IGplKSB7CisgICAgICAgICAgICAgICAgcm9vdENhdXNlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgamU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2dGYWN0b3J5LnJlbGVhc2UobG9hZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09IFByaXZhdGUgdXRpbGl0eSBtZXRob2RzID09PT09PT09PT09PT09PT09PT09CisKKyAgICBwcml2YXRlIFN0cmluZyBuZXh0QXJnKCkgeworICAgICAgICBpZiAoKGFyZ1BvcyA+PSBhcmdzLmxlbmd0aCkKKyAgICAgICAgICAgIHx8IChmdWxsc3RvcCA9IFNXSVRDSF9GVUxMX1NUT1AuZXF1YWxzKGFyZ3NbYXJnUG9zXSkpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhcmdzW2FyZ1BvcysrXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIG5leHRGaWxlKCkgeworICAgICAgICBpZiAoZnVsbHN0b3ApIGFyZ1BvcysrOworICAgICAgICBpZiAoYXJnUG9zID49IGFyZ3MubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhcmdzW2FyZ1BvcysrXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0V2ViWG1sKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHdlYnhtbExldmVsID49IElOQ19XRUJYTUwpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGZtYXBpbmdzID0gbmV3IEZpbGUod2VieG1sRmlsZSk7CisgICAgICAgICAgICAgICAgbWFwb3V0ID0gbmV3IEZpbGVXcml0ZXIoZm1hcGluZ3MpOworICAgICAgICAgICAgICAgIHNlcnZsZXRvdXQgPSBuZXcgQ2hhckFycmF5V3JpdGVyKCk7CisgICAgICAgICAgICAgICAgbWFwcGluZ291dCA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWFwb3V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBzZXJ2bGV0b3V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtYXBwaW5nb3V0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3ZWJ4bWxMZXZlbCA+PSBBTExfV0VCWE1MKSB7CisgICAgICAgICAgICAgICAgbWFwb3V0LndyaXRlKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3BjLndlYnhtbC5oZWFkZXIiKSk7CisgICAgICAgICAgICAgICAgbWFwb3V0LmZsdXNoKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCh3ZWJ4bWxMZXZlbD49IElOQ19XRUJYTUwpICYmICFhZGRXZWJYbWxNYXBwaW5ncykgeworICAgICAgICAgICAgICAgIG1hcG91dC53cml0ZShMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwYy53ZWJpbmMuaGVhZGVyIikpOworICAgICAgICAgICAgICAgIG1hcG91dC5mbHVzaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIG1hcG91dCA9IG51bGw7CisgICAgICAgICAgICBzZXJ2bGV0b3V0ID0gbnVsbDsKKyAgICAgICAgICAgIG1hcHBpbmdvdXQgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbXBsZXRlV2ViWG1sKCkgeworICAgICAgICBpZiAobWFwb3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VydmxldG91dC53cml0ZVRvKG1hcG91dCk7CisgICAgICAgICAgICAgICAgbWFwcGluZ291dC53cml0ZVRvKG1hcG91dCk7CisgICAgICAgICAgICAgICAgaWYgKHdlYnhtbExldmVsID49IEFMTF9XRUJYTUwpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFwb3V0LndyaXRlKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3BjLndlYnhtbC5mb290ZXIiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgod2VieG1sTGV2ZWwgPj0gSU5DX1dFQlhNTCkgJiYgIWFkZFdlYlhtbE1hcHBpbmdzKSB7CisgICAgICAgICAgICAgICAgICAgIG1hcG91dC53cml0ZShMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwYy53ZWJpbmMuZm9vdGVyIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYXBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIC8vIG5vdGluZyB0byBkbyBpZiBpdCBmYWlscyBzaW5jZSB3ZSBhcmUgZG9uZSB3aXRoIGl0CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFNlcnZsZXRDb250ZXh0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29udGV4dCA9bmV3IEpzcENTZXJ2bGV0Q29udGV4dAorICAgICAgICAgICAgICAgIChuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCksCisgICAgICAgICAgICAgICAgIG5ldyBVUkwoImZpbGU6IiArIHVyaVJvb3QucmVwbGFjZSgnXFwnLCcvJykgKyAnLycpKTsKKyAgICAgICAgICAgIHRsZExvY2F0aW9uc0NhY2hlID0gbmV3IFRsZExvY2F0aW9uc0NhY2hlKGNvbnRleHQsIHRydWUpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioiICsgbWUpOworICAgICAgICB9CisgICAgICAgIHJjdHh0ID0gbmV3IEpzcFJ1bnRpbWVDb250ZXh0KGNvbnRleHQsIHRoaXMpOworICAgICAgICBqc3BDb25maWcgPSBuZXcgSnNwQ29uZmlnKGNvbnRleHQpOworICAgICAgICB0YWdQbHVnaW5NYW5hZ2VyID0gbmV3IFRhZ1BsdWdpbk1hbmFnZXIoY29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIGNsYXNzbG9hZGVyIGFzL2lmIG5lZWRlZCBmb3IgdGhlIGdpdmVuCisgICAgICogY29tcGlsYXRpb24gY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGN0eHQgVGhlIGNvbXBpbGF0aW9uIGNvbnRleHQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0Q2xhc3NMb2FkZXIoSnNwQ29tcGlsYXRpb25Db250ZXh0IGNsY3R4dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBjbGFzc1BhdGggPSBnZXRDbGFzc1BhdGgoKTsKKworICAgICAgICBDbGFzc0xvYWRlciBqc3BjTG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICBpZiAoanNwY0xvYWRlciBpbnN0YW5jZW9mIEFudENsYXNzTG9hZGVyKSB7CisgICAgICAgICAgICBjbGFzc1BhdGggKz0gRmlsZS5wYXRoU2VwYXJhdG9yCisgICAgICAgICAgICAgICAgKyAoKEFudENsYXNzTG9hZGVyKSBqc3BjTG9hZGVyKS5nZXRDbGFzc3BhdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFR1cm4gdGhlIGNsYXNzUGF0aCBpbnRvIFVSTHMKKyAgICAgICAgQXJyYXlMaXN0IHVybHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNsYXNzUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5wYXRoU2VwYXJhdG9yKTsKKyAgICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gdG9rZW5pemVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWxlIGxpYkZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgICAgICAgICB1cmxzLmFkZChsaWJGaWxlLnRvVVJMKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgLy8gRmFpbGluZyBhIHRvQ2Fub25pY2FsUGF0aCBvbiBhIGZpbGUgdGhhdAorICAgICAgICAgICAgICAgIC8vIGV4aXN0cygpIHNob3VsZCBiZSBhIEpWTSByZWdyZXNzaW9uIHRlc3QsCisgICAgICAgICAgICAgICAgLy8gdGhlcmVmb3JlIHdlIGhhdmUgcGVybWlzc2lvbiB0byBmcmVhayB1b3QKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpb2UudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBGaWxlIHdlYmFwcEJhc2UgPSBuZXcgRmlsZSh1cmlSb290KTsKKyAgICAgICAgaWYgKHdlYmFwcEJhc2UuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIEZpbGUgY2xhc3NlcyA9IG5ldyBGaWxlKHdlYmFwcEJhc2UsICIvV0VCLUlORi9jbGFzc2VzIik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChjbGFzc2VzLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIGNsYXNzUGF0aCA9IGNsYXNzUGF0aCArIEZpbGUucGF0aFNlcGFyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGFzc2VzLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgdXJscy5hZGQoY2xhc3Nlcy5nZXRDYW5vbmljYWxGaWxlKCkudG9VUkwoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgLy8gZmFpbGluZyBhIHRvQ2Fub25pY2FsUGF0aCBvbiBhIGZpbGUgdGhhdAorICAgICAgICAgICAgICAgIC8vIGV4aXN0cygpIHNob3VsZCBiZSBhIEpWTSByZWdyZXNzaW9uIHRlc3QsCisgICAgICAgICAgICAgICAgLy8gdGhlcmVmb3JlIHdlIGhhdmUgcGVybWlzc2lvbiB0byBmcmVhayBvdXQKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpb2UudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGaWxlIGxpYiA9IG5ldyBGaWxlKHdlYmFwcEJhc2UsICIvV0VCLUlORi9saWIiKTsKKyAgICAgICAgICAgIGlmIChsaWIuZXhpc3RzKCkgJiYgbGliLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBsaWJzID0gbGliLmxpc3QoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpYnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGxpYnNbaV0ubGVuZ3RoKCkgPDUgKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4dD1saWJzW2ldLnN1YnN0cmluZyggbGlic1tpXS5sZW5ndGgoKSAtIDQgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEgIi5qYXIiLmVxdWFsc0lnbm9yZUNhc2UoZXh0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCIudGxkIi5lcXVhbHNJZ25vcmVDYXNlKGV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiVExEIGZpbGVzIHNob3VsZCBub3QgYmUgcGxhY2VkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIvV0VCLUlORi9saWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGxpYkZpbGUgPSBuZXcgRmlsZShsaWIsIGxpYnNbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NQYXRoID0gY2xhc3NQYXRoICsgRmlsZS5wYXRoU2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsaWJGaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdXJscy5hZGQobGliRmlsZS5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSTCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIGEgdG9DYW5vbmljYWxQYXRoIG9uIGEgZmlsZSB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGlzdHMoKSBzaG91bGQgYmUgYSBKVk0gcmVncmVzc2lvbiB0ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmVmb3JlIHdlIGhhdmUgcGVybWlzc2lvbiB0byBmcmVhayBvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlvZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFdoYXQgaXMgdGhpcyA/PworICAgICAgICB1cmxzLmFkZChuZXcgRmlsZShjbGN0eHQuZ2V0UmVhbFBhdGgoIi8iKSkuZ2V0Q2Fub25pY2FsRmlsZSgpLnRvVVJMKCkpOworCisgICAgICAgIFVSTCB1cmxzQVtdPW5ldyBVUkxbdXJscy5zaXplKCldOworICAgICAgICB1cmxzLnRvQXJyYXkodXJsc0EpOworICAgICAgICBsb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIodXJsc0EsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIFdFQi1JTkYgZGlyIGJ5IGxvb2tpbmcgdXAgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLgorICAgICAqIFRoaXMgaXMgdXNlZCBpZiBubyBleHBsaWNpdCBkb2NiYXNlIGlzIHNldCwgYnV0IG9ubHkgZmlsZXMuCisgICAgICogWFhYIE1heWJlIHdlIHNob3VsZCByZXF1aXJlIHRoZSBkb2NiYXNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2NhdGVVcmlSb290KCBGaWxlIGYgKSB7CisgICAgICAgIFN0cmluZyB0VXJpQmFzZSA9IHVyaUJhc2U7CisgICAgICAgIGlmICh0VXJpQmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0VXJpQmFzZSA9ICIvIjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBmID0gbmV3IEZpbGUoZi5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGcgPSBuZXcgRmlsZShmLCAiV0VCLUlORiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZy5leGlzdHMoKSAmJiBnLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaVJvb3QgPSBmLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaUJhc2UgPSB0VXJpQmFzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcGMuaW1wbGljaXQudXJpUm9vdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpUm9vdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkgJiYgZi5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0VXJpQmFzZSA9ICIvIiArIGYuZ2V0TmFtZSgpICsgIi8iICsgdFVyaUJhc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZlBhcmVudCA9IGYuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmUGFyZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZiA9IG5ldyBGaWxlKGZQYXJlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gYWNjZXB0aWJsZSBjYW5kaWRhdGUsIHVyaVJvb3Qgd2lsbAorICAgICAgICAgICAgICAgICAgICAvLyByZW1haW4gbnVsbCB0byBpbmRpY2F0ZSB0byB0aGUgQ29tcGlsZXJDb250ZXh0IHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgY3VycmVudCB3b3JraW5nL3VzZXIgZGlyLgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh1cmlSb290ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmcm9vdCA9IG5ldyBGaWxlKHVyaVJvb3QpOworICAgICAgICAgICAgICAgICAgICB1cmlSb290ID0gZnJvb3QuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIG9wdGlvbmFsIGRlZmF1bHQgYW5kIGEgbnVsbCB2YWx1ZQorICAgICAgICAgICAgLy8gZm9yIHVyaVJvb3QgaGFzIGEgbm9uLWVycm9yIG1lYW5pbmcsIHdlIGNhbiBqdXN0CisgICAgICAgICAgICAvLyBwYXNzIHN0cmFpZ2h0IHRocm91Z2gKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmVzIHRoZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRobmFtZSBjb3JyZWN0bHkKKyAgICAgKiBpbiBib3RoIEFudCBhbmQgY29tbWFuZC1saW5lIHNpdHVhdGlvbnMuICBJZiBBbnQgbGF1bmNoZWQKKyAgICAgKiB1cywgd2Ugc2hvdWxkIHVzZSB0aGUgYmFzZWRpciBvZiB0aGUgY3VycmVudCBwcm9qZWN0CisgICAgICogdG8gcmVzb2x2ZSByZWxhdGl2ZSBwYXRocy4KKyAgICAgKgorICAgICAqIFNlZSBCdWd6aWxsYSAzNTU3MS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIFRoZSBmaWxlCisgICAgICogQHJldHVybiBUaGUgZmlsZSByZXNvbHZlZAorICAgICAqLworICAgICBwcm90ZWN0ZWQgRmlsZSByZXNvbHZlRmlsZShmaW5hbCBTdHJpbmcgcykgeworICAgICAgICAgaWYoZ2V0UHJvamVjdCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAvLyBOb3RlIEZpbGVVdGlscy5nZXRGaWxlVXRpbHMgcmVwbGFjZXMgRmlsZVV0aWxzLm5ld0ZpbGVVdGlscyBpbiBBbnQgMS42LjMKKyAgICAgICAgICAgICByZXR1cm4gRmlsZVV0aWxzLm5ld0ZpbGVVdGlscygpLnJlc29sdmVGaWxlKG51bGwsIHMpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICByZXR1cm4gRmlsZVV0aWxzLm5ld0ZpbGVVdGlscygpLnJlc29sdmVGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIHMpOworICAgICAgICAgfQorICAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL0pzcENvbXBpbGF0aW9uQ29udGV4dC5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9Kc3BDb21waWxhdGlvbkNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2E1MzU0Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9Kc3BDb21waWxhdGlvbkNvbnRleHQuamF2YQpAQCAtMCwwICsxLDcwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdJbmZvOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuQ29tcGlsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuSnNwUnVudGltZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuSnNwVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuU2VydmxldFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5zZXJ2bGV0Lkphc3BlckxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5zZXJ2bGV0LkpzcFNlcnZsZXRXcmFwcGVyOworCisvKioKKyAqIEEgcGxhY2UgaG9sZGVyIGZvciB2YXJpb3VzIHRoaW5ncyB0aGF0IGFyZSB1c2VkIHRocm91Z2ggb3V0IHRoZSBKU1AKKyAqIGVuZ2luZS4gVGhpcyBpcyBhIHBlci1yZXF1ZXN0L3Blci1jb250ZXh0IGRhdGEgc3RydWN0dXJlLiBTb21lIG9mCisgKiB0aGUgaW5zdGFuY2UgdmFyaWFibGVzIGFyZSBzZXQgYXQgZGlmZmVyZW50IHBvaW50cy4KKyAqCisgKiBNb3N0IG9mIHRoZSBwYXRoLXJlbGF0ZWQgc3R1ZmYgaXMgaGVyZSAtIG1hbmdsaW5nIG5hbWVzLCB2ZXJzaW9ucywgZGlycywKKyAqIGxvYWRpbmcgcmVzb3VyY2VzIGFuZCBkZWFsaW5nIHdpdGggdXJpcy4gCisgKgorICogQGF1dGhvciBBbmlsIEsuIFZpamVuZHJhbgorICogQGF1dGhvciBIYXJpc2ggUHJhYmFuZGhhbQorICogQGF1dGhvciBQaWVycmUgRGVsaXNsZQorICogQGF1dGhvciBDb3N0aW4gTWFub2xhY2hlCisgKiBAYXV0aG9yIEtpbi1tYW4gQ2h1bmcKKyAqLworcHVibGljIGNsYXNzIEpzcENvbXBpbGF0aW9uQ29udGV4dCB7CisKKyAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKEpzcENvbXBpbGF0aW9uQ29udGV4dC5jbGFzcyk7CisKKyAgICBwcml2YXRlIEhhc2h0YWJsZSB0YWdGaWxlSmFyVXJsczsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNQYWNrYWdlZFRhZ0ZpbGU7CisKKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcganNwVXJpOworICAgIHByaXZhdGUgYm9vbGVhbiBpc0VyclBhZ2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgYmFzZVBhY2thZ2VOYW1lOworICAgIHByaXZhdGUgU3RyaW5nIGRlcml2ZWRQYWNrYWdlTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2bGV0SmF2YUZpbGVOYW1lOworICAgIHByaXZhdGUgU3RyaW5nIGphdmFQYXRoOworICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzRmlsZU5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgY29udGVudFR5cGU7CisgICAgcHJpdmF0ZSBTZXJ2bGV0V3JpdGVyIHdyaXRlcjsKKyAgICBwcml2YXRlIE9wdGlvbnMgb3B0aW9uczsKKyAgICBwcml2YXRlIEpzcFNlcnZsZXRXcmFwcGVyIGpzdzsKKyAgICBwcml2YXRlIENvbXBpbGVyIGpzcENvbXBpbGVyOworICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzUGF0aDsKKworICAgIHByaXZhdGUgU3RyaW5nIGJhc2VVUkk7CisgICAgcHJpdmF0ZSBTdHJpbmcgYmFzZU91dHB1dERpcjsKKyAgICBwcml2YXRlIFN0cmluZyBvdXRwdXREaXI7CisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0OworICAgIHByaXZhdGUgVVJMQ2xhc3NMb2FkZXIgbG9hZGVyOworCisgICAgcHJpdmF0ZSBKc3BSdW50aW1lQ29udGV4dCByY3R4dDsKKworICAgIHByaXZhdGUgaW50IHJlbW92ZWQgPSAwOworCisgICAgcHJpdmF0ZSBVUkxDbGFzc0xvYWRlciBqc3BMb2FkZXI7CisgICAgcHJpdmF0ZSBVUkwgYmFzZVVybDsKKyAgICBwcml2YXRlIENsYXNzIHNlcnZsZXRDbGFzczsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1RhZ0ZpbGU7CisgICAgcHJpdmF0ZSBib29sZWFuIHByb3RvVHlwZU1vZGU7CisgICAgcHJpdmF0ZSBUYWdJbmZvIHRhZ0luZm87CisgICAgcHJpdmF0ZSBVUkwgdGFnRmlsZUphclVybDsKKworICAgIC8vIGpzcFVSSSBfbXVzdF8gYmUgcmVsYXRpdmUgdG8gdGhlIGNvbnRleHQKKyAgICBwdWJsaWMgSnNwQ29tcGlsYXRpb25Db250ZXh0KFN0cmluZyBqc3BVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzRXJyUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc3BTZXJ2bGV0V3JhcHBlciBqc3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc3BSdW50aW1lQ29udGV4dCByY3R4dCkgeworCisgICAgICAgIHRoaXMuanNwVXJpID0gY2Fub25pY2FsVVJJKGpzcFVyaSk7CisgICAgICAgIHRoaXMuaXNFcnJQYWdlID0gaXNFcnJQYWdlOworICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICB0aGlzLmpzdyA9IGpzdzsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKworICAgICAgICB0aGlzLmJhc2VVUkkgPSBqc3BVcmkuc3Vic3RyaW5nKDAsIGpzcFVyaS5sYXN0SW5kZXhPZignLycpICsgMSk7CisgICAgICAgIC8vIGhhY2sgZml4IGZvciByZXNvbHZlUmVsYXRpdmVVUkkKKyAgICAgICAgaWYgKGJhc2VVUkkgPT0gbnVsbCkgeworICAgICAgICAgICAgYmFzZVVSSSA9ICIvIjsKKyAgICAgICAgfSBlbHNlIGlmIChiYXNlVVJJLmNoYXJBdCgwKSAhPSAnLycpIHsKKyAgICAgICAgICAgIC8vIHN0cmlwIHRoZSBiYXNkZSBzbGFzaCBzaW5jZSBpdCB3aWxsIGJlIGNvbWJpbmVkIHdpdGggdGhlCisgICAgICAgICAgICAvLyB1cmlCYXNlIHRvIGdlbmVyYXRlIGEgZmlsZQorICAgICAgICAgICAgYmFzZVVSSSA9ICIvIiArIGJhc2VVUkk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJhc2VVUkkuY2hhckF0KGJhc2VVUkkubGVuZ3RoKCkgLSAxKSAhPSAnLycpIHsKKyAgICAgICAgICAgIGJhc2VVUkkgKz0gJy8nOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5yY3R4dCA9IHJjdHh0OworICAgICAgICB0aGlzLnRhZ0ZpbGVKYXJVcmxzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICB0aGlzLmJhc2VQYWNrYWdlTmFtZSA9IENvbnN0YW50cy5KU1BfUEFDS0FHRV9OQU1FOworICAgIH0KKworICAgIHB1YmxpYyBKc3BDb21waWxhdGlvbkNvbnRleHQoU3RyaW5nIHRhZ2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWdJbmZvIHRhZ0luZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpzcFNlcnZsZXRXcmFwcGVyIGpzdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpzcFJ1bnRpbWVDb250ZXh0IHJjdHh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMIHRhZ0ZpbGVKYXJVcmwpIHsKKyAgICAgICAgdGhpcyh0YWdmaWxlLCBmYWxzZSwgb3B0aW9ucywgY29udGV4dCwganN3LCByY3R4dCk7CisgICAgICAgIHRoaXMuaXNUYWdGaWxlID0gdHJ1ZTsKKyAgICAgICAgdGhpcy50YWdJbmZvID0gdGFnSW5mbzsKKyAgICAgICAgdGhpcy50YWdGaWxlSmFyVXJsID0gdGFnRmlsZUphclVybDsKKyAgICAgICAgaWYgKHRhZ0ZpbGVKYXJVcmwgIT0gbnVsbCkgeworICAgICAgICAgICAgaXNQYWNrYWdlZFRhZ0ZpbGUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyogPT09PT09PT09PT09PT09PT09PT0gTWV0aG9kcyB0byBvdmVycmlkZSA9PT09PT09PT09PT09PT09PT09PSAqLworICAgIAorICAgIC8qKiAtLS0tLS0tLS0tIENsYXNzIHBhdGggYW5kIGxvYWRlciAtLS0tLS0tLS0tICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3NwYXRoIHRoYXQgaXMgcGFzc2VkIG9mZiB0byB0aGUgSmF2YSBjb21waWxlci4gCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc1BhdGgoKSB7CisgICAgICAgIGlmKCBjbGFzc1BhdGggIT0gbnVsbCApCisgICAgICAgICAgICByZXR1cm4gY2xhc3NQYXRoOworICAgICAgICByZXR1cm4gcmN0eHQuZ2V0Q2xhc3NQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzcGF0aCB0aGF0IGlzIHBhc3NlZCBvZmYgdG8gdGhlIEphdmEgY29tcGlsZXIuIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzUGF0aChTdHJpbmcgY2xhc3NQYXRoKSB7CisgICAgICAgIHRoaXMuY2xhc3NQYXRoID0gY2xhc3NQYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoYXQgY2xhc3MgbG9hZGVyIHRvIHVzZSBmb3IgbG9hZGluZyBjbGFzc2VzIHdoaWxlIGNvbXBpbGluZworICAgICAqIHRoaXMgSlNQPworICAgICAqLworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgaWYoIGxvYWRlciAhPSBudWxsICkKKyAgICAgICAgICAgIHJldHVybiBsb2FkZXI7CisgICAgICAgIHJldHVybiByY3R4dC5nZXRQYXJlbnRDbGFzc0xvYWRlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKFVSTENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0SnNwTG9hZGVyKCkgeworICAgICAgICBpZigganNwTG9hZGVyID09IG51bGwgKSB7CisgICAgICAgICAgICBqc3BMb2FkZXIgPSBuZXcgSmFzcGVyTG9hZGVyCisgICAgICAgICAgICAobmV3IFVSTFtdIHtiYXNlVXJsfSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgcmN0eHQuZ2V0UGVybWlzc2lvbkNvbGxlY3Rpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgcmN0eHQuZ2V0Q29kZVNvdXJjZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4ganNwTG9hZGVyOworICAgIH0KKworICAgIC8qKiAtLS0tLS0tLS0tIElucHV0L091dHB1dCAgLS0tLS0tLS0tLSAqLworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBvdXRwdXQgZGlyZWN0b3J5IHRvIGdlbmVyYXRlIGNvZGUgaW50by4gIFRoZSBvdXRwdXQgZGlyZWN0b3J5CisgICAgICogaXMgbWFrZSB1cCBvZiB0aGUgc2NyYXRjaCBkaXJlY3RvcnksIHdoaWNoIGlzIHByb3ZpZGUgaW4gT3B0aW9ucywKKyAgICAgKiBwbHVzIHRoZSBkaXJlY3RvcnkgZGVyaXZlZCBmcm9tIHRoZSBwYWNrYWdlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXIoKSB7CisJaWYgKG91dHB1dERpciA9PSBudWxsKSB7CisJICAgIGNyZWF0ZU91dHB1dERpcigpOworCX0KKworICAgICAgICByZXR1cm4gb3V0cHV0RGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhICJDb21waWxlciIgb2JqZWN0IGJhc2VkIG9uIHNvbWUgaW5pdCBwYXJhbSBkYXRhLiBUaGlzCisgICAgICogaXMgbm90IGRvbmUgeWV0LiBSaWdodCBub3cgd2UncmUganVzdCBoYXJkY29kaW5nIHRoZSBhY3R1YWwKKyAgICAgKiBjb21waWxlcnMgdGhhdCBhcmUgY3JlYXRlZC4gCisgICAgICovCisgICAgcHVibGljIENvbXBpbGVyIGNyZWF0ZUNvbXBpbGVyKCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChqc3BDb21waWxlciAhPSBudWxsICkgeworICAgICAgICAgICAgcmV0dXJuIGpzcENvbXBpbGVyOworICAgICAgICB9CisgICAgICAgIGpzcENvbXBpbGVyID0gbnVsbDsKKyAgICAgICAgaWYgKG9wdGlvbnMuZ2V0Q29tcGlsZXIoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBqc3BDb21waWxlciA9IGNyZWF0ZUNvbXBpbGVyKCJvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5KRFRDb21waWxlciIpOworICAgICAgICAgICAgaWYgKGpzcENvbXBpbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBqc3BDb21waWxlciA9IGNyZWF0ZUNvbXBpbGVyKCJvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5BbnRDb21waWxlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAganNwQ29tcGlsZXIgPSBjcmVhdGVDb21waWxlcigib3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuQW50Q29tcGlsZXIiKTsKKyAgICAgICAgICAgIGlmIChqc3BDb21waWxlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAganNwQ29tcGlsZXIgPSBjcmVhdGVDb21waWxlcigib3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuSkRUQ29tcGlsZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoanNwQ29tcGlsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmNvbXBpbGVyIikpOworICAgICAgICB9CisgICAgICAgIGpzcENvbXBpbGVyLmluaXQodGhpcywganN3KTsKKyAgICAgICAgcmV0dXJuIGpzcENvbXBpbGVyOworICAgIH0KKworICAgIHByaXZhdGUgQ29tcGlsZXIgY3JlYXRlQ29tcGlsZXIoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICBDb21waWxlciBjb21waWxlciA9IG51bGw7IAorICAgICAgICB0cnkgeworICAgICAgICAgICAgY29tcGlsZXIgPSAoQ29tcGlsZXIpIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuY29tcGlsZXIiKSwgdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ29tcGlsZXIgZ2V0Q29tcGlsZXIoKSB7CisgICAgICAgIHJldHVybiBqc3BDb21waWxlcjsKKyAgICB9CisKKyAgICAvKiogLS0tLS0tLS0tLSBBY2Nlc3MgcmVzb3VyY2VzIGluIHRoZSB3ZWJhcHAgLS0tLS0tLS0tLSAqLworCisgICAgLyoqIAorICAgICAqIEdldCB0aGUgZnVsbCB2YWx1ZSBvZiBhIFVSSSByZWxhdGl2ZSB0byB0aGlzIGNvbXBpbGF0aW9ucyBjb250ZXh0CisgICAgICogdXNlcyBjdXJyZW50IGZpbGUgYXMgdGhlIGJhc2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyByZXNvbHZlUmVsYXRpdmVVcmkoU3RyaW5nIHVyaSkgeworICAgICAgICAvLyBzb21ldGltZXMgd2UgZ2V0IHVyaSdzIG1hc3NhZ2VkIGZyb20gRmlsZShTdHJpbmcpLCBzbyBjaGVjayBmb3IKKyAgICAgICAgLy8gYSByb290IGRpcmVjdG9yeSBkZXBlcmF0b3IgY2hhcgorICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoIi8iKSB8fCB1cmkuc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKKyAgICAgICAgICAgIHJldHVybiB1cmk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gYmFzZVVSSSArIHVyaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSByZXNvdXJjZSBhcyBhIHN0cmVhbSwgcmVsYXRpdmUgdG8gdGhlIG1lYW5pbmdzIG9mIHRoaXMKKyAgICAgKiBjb250ZXh0J3MgaW1wbGVtZW50YXRpb24uCisgICAgICogQHJldHVybiBhIG51bGwgaWYgdGhlIHJlc291cmNlIGNhbm5vdCBiZSBmb3VuZCBvciByZXByZXNlbnRlZCAKKyAgICAgKiAgICAgICAgIGFzIGFuIElucHV0U3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHJlcykgeworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKGNhbm9uaWNhbFVSSShyZXMpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIHJlcykgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldFJlc291cmNlKGNhbm9uaWNhbFVSSShyZXMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0IGdldFJlc291cmNlUGF0aHMoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UmVzb3VyY2VQYXRocyhjYW5vbmljYWxVUkkocGF0aCkpOworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBHZXRzIHRoZSBhY3R1YWwgcGF0aCBvZiBhIFVSSSByZWxhdGl2ZSB0byB0aGUgY29udGV4dCBvZgorICAgICAqIHRoZSBjb21waWxhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFJlYWxQYXRoKHBhdGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRhZy1maWxlLW5hbWUtdG8tSkFSLWZpbGUgbWFwIG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdCwKKyAgICAgKiB3aGljaCBtYXBzIHRhZyBmaWxlIG5hbWVzIHRvIHRoZSBKQVIgZmlsZXMgaW4gd2hpY2ggdGhlIHRhZyBmaWxlcyBhcmUKKyAgICAgKiBwYWNrYWdlZC4KKyAgICAgKgorICAgICAqIFRoZSBtYXAgaXMgcG9wdWxhdGVkIHdoZW4gcGFyc2luZyB0aGUgdGFnLWZpbGUgZWxlbWVudHMgb2YgdGhlIFRMRHMKKyAgICAgKiBvZiBhbnkgaW1wb3J0ZWQgdGFnbGlicy4gCisgICAgICovCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRUYWdGaWxlSmFyVXJscygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudGFnRmlsZUphclVybHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSkFSIGZpbGUgaW4gd2hpY2ggdGhlIHRhZyBmaWxlIGZvciB3aGljaCB0aGlzCisgICAgICogSnNwQ29tcGlsYXRpb25Db250ZXh0IHdhcyBjcmVhdGVkIGlzIHBhY2thZ2VkLCBvciBudWxsIGlmIHRoaXMKKyAgICAgKiBKc3BDb21waWxhdGlvbkNvbnRleHQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHRhZyBmaWxlLCBvciBpZiB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHRhZyBmaWxlIGlzIG5vdCBwYWNrYWdlZCBpbiBhIEpBUi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMIGdldFRhZ0ZpbGVKYXJVcmwoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRhZ0ZpbGVKYXJVcmw7CisgICAgfQorCisgICAgLyogPT09PT09PT09PT09PT09PT09PT0gQ29tbW9uIGltcGxlbWVudGF0aW9uID09PT09PT09PT09PT09PT09PT09ICovCisKKyAgICAvKioKKyAgICAgKiBKdXN0IHRoZSBjbGFzcyBuYW1lIChkb2VzIG5vdCBpbmNsdWRlIHBhY2thZ2UgbmFtZSkgb2YgdGhlCisgICAgICogZ2VuZXJhdGVkIGNsYXNzLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRDbGFzc05hbWUoKSB7CisKKyAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzVGFnRmlsZSkgeworICAgICAgICAgICAgY2xhc3NOYW1lID0gdGFnSW5mby5nZXRUYWdDbGFzc05hbWUoKTsKKyAgICAgICAgICAgIGludCBsYXN0SW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgIGlmIChsYXN0SW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGxhc3RJbmRleCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGlTZXAgPSBqc3BVcmkubGFzdEluZGV4T2YoJy8nKSArIDE7CisgICAgICAgICAgICBjbGFzc05hbWUgPSBKc3BVdGlsLm1ha2VKYXZhSWRlbnRpZmllcihqc3BVcmkuc3Vic3RyaW5nKGlTZXApKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZsZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUGF0aCBvZiB0aGUgSlNQIFVSSS4gTm90ZSB0aGF0IHRoaXMgaXMgbm90IGEgZmlsZSBuYW1lLiBUaGlzIGlzCisgICAgICogdGhlIGNvbnRleHQgcm9vdGVkIFVSSSBvZiB0aGUgSlNQIGZpbGUuIAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SnNwRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGpzcFVyaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcmUgd2UgcHJvY2Vzc2luZyBzb21ldGhpbmcgdGhhdCBoYXMgYmVlbiBkZWNsYXJlZCBhcyBhbgorICAgICAqIGVycm9ycGFnZT8gCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFcnJvclBhZ2UoKSB7CisgICAgICAgIHJldHVybiBpc0VyclBhZ2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JQYWdlKGJvb2xlYW4gaXNFcnJQYWdlKSB7CisgICAgICAgIHRoaXMuaXNFcnJQYWdlID0gaXNFcnJQYWdlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVGFnRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGlzVGFnRmlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFnSW5mbyBnZXRUYWdJbmZvKCkgeworICAgICAgICByZXR1cm4gdGFnSW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUYWdJbmZvKFRhZ0luZm8gdGFnaSkgeworICAgICAgICB0YWdJbmZvID0gdGFnaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHdlIGFyZSBjb21waWxpbmcgYSB0YWcgZmlsZSBpbiBwcm90b3R5cGUgbW9kZS4KKyAgICAgKiBpZSB3ZSBvbmx5IGdlbmVyYXRlIGNvZGVzIHdpdGggY2xhc3MgZm9yIHRoZSB0YWcgaGFuZGxlciB3aXRoIGVtcHR5CisgICAgICogbWV0aG9kIGJvZGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3RvdHlwZU1vZGUoKSB7CisgICAgICAgIHJldHVybiBwcm90b1R5cGVNb2RlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3RvdHlwZU1vZGUoYm9vbGVhbiBwbSkgeworICAgICAgICBwcm90b1R5cGVNb2RlID0gcG07CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFja2FnZSBuYW1lIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzIGlzIG1ha2UgdXAgb2YgdGhlIGJhc2UgcGFja2FnZQorICAgICAqIG5hbWUsIHdoaWNoIGlzIHVzZXIgc2V0dGFibGUsIGFuZCB0aGUgZGVyaXZlZCBwYWNrYWdlIG5hbWUuICBUaGUKKyAgICAgKiBkZXJpdmVkIHBhY2thZ2UgbmFtZSBkaXJlY3RseSBtaXJyb3JzIHRoZSBmaWxlIGhlaXJhY2h5IG9mIHRoZSBKU1AgcGFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgaWYgKGlzVGFnRmlsZSgpKSB7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gdGFnSW5mby5nZXRUYWdDbGFzc05hbWUoKTsKKyAgICAgICAgICAgIGludCBsYXN0SW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgIFN0cmluZyBwa2dOYW1lID0gIiI7CisgICAgICAgICAgICBpZiAobGFzdEluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgcGtnTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwa2dOYW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIGRQYWNrYWdlTmFtZSA9IGdldERlcml2ZWRQYWNrYWdlTmFtZSgpOworICAgICAgICAgICAgaWYgKGRQYWNrYWdlTmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VQYWNrYWdlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBiYXNlUGFja2FnZU5hbWUgKyAnLicgKyBnZXREZXJpdmVkUGFja2FnZU5hbWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldERlcml2ZWRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgaWYgKGRlcml2ZWRQYWNrYWdlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpbnQgaVNlcCA9IGpzcFVyaS5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgZGVyaXZlZFBhY2thZ2VOYW1lID0gKGlTZXAgPiAwKSA/CisgICAgICAgICAgICAgICAgICAgIEpzcFV0aWwubWFrZUphdmFQYWNrYWdlKGpzcFVyaS5zdWJzdHJpbmcoMSxpU2VwKSkgOiAiIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVyaXZlZFBhY2thZ2VOYW1lOworICAgIH0KKwkgICAgCisgICAgLyoqCisgICAgICogVGhlIHBhY2thZ2UgbmFtZSBpbnRvIHdoaWNoIHRoZSBzZXJ2bGV0IGNsYXNzIGlzIGdlbmVyYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2bGV0UGFja2FnZU5hbWUoU3RyaW5nIHNlcnZsZXRQYWNrYWdlTmFtZSkgeworICAgICAgICB0aGlzLmJhc2VQYWNrYWdlTmFtZSA9IHNlcnZsZXRQYWNrYWdlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxsIHBhdGggbmFtZSBvZiB0aGUgSmF2YSBmaWxlIGludG8gd2hpY2ggdGhlIHNlcnZsZXQgaXMgYmVpbmcKKyAgICAgKiBnZW5lcmF0ZWQuIAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldEphdmFGaWxlTmFtZSgpIHsKKworICAgICAgICBpZiAoc2VydmxldEphdmFGaWxlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXJ2bGV0SmF2YUZpbGVOYW1lID0KKwkJZ2V0T3V0cHV0RGlyKCkgKyBnZXRTZXJ2bGV0Q2xhc3NOYW1lKCkgKyAiLmphdmEiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG91dHB1dCBkaXIgZXhpc3RzCisgICAgICAgICAgICBtYWtlT3V0cHV0RGlyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlcnZsZXRKYXZhRmlsZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VydmxldEphdmFGaWxlTmFtZShTdHJpbmcgc2VydmxldEphdmFGaWxlTmFtZSkgeworICAgICAgICB0aGlzLnNlcnZsZXRKYXZhRmlsZU5hbWUgPSBzZXJ2bGV0SmF2YUZpbGVOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBob2xkIG9mIHRoZSBPcHRpb25zIG9iamVjdCBmb3IgdGhpcyBjb250ZXh0LiAKKyAgICAgKi8KKyAgICBwdWJsaWMgT3B0aW9ucyBnZXRPcHRpb25zKCkgeworICAgICAgICByZXR1cm4gb3B0aW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBKc3BSdW50aW1lQ29udGV4dCBnZXRSdW50aW1lQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHJjdHh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhdGggb2YgdGhlIEphdmEgZmlsZSByZWxhdGl2ZSB0byB0aGUgd29yayBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRKYXZhUGF0aCgpIHsKKworICAgICAgICBpZiAoamF2YVBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGphdmFQYXRoOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzVGFnRmlsZSgpKSB7CisJICAgIFN0cmluZyB0YWdOYW1lID0gdGFnSW5mby5nZXRUYWdDbGFzc05hbWUoKTsKKyAgICAgICAgICAgIGphdmFQYXRoID0gdGFnTmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIuamF2YSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqYXZhUGF0aCA9IGdldFNlcnZsZXRQYWNrYWdlTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgJy8nICsKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldENsYXNzTmFtZSgpICsgIi5qYXZhIjsKKwl9CisgICAgICAgIHJldHVybiBqYXZhUGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzRmlsZU5hbWUoKSB7CisKKyAgICAgICAgaWYgKGNsYXNzRmlsZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgY2xhc3NGaWxlTmFtZSA9IGdldE91dHB1dERpcigpICsgZ2V0U2VydmxldENsYXNzTmFtZSgpICsgIi5jbGFzcyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgb3V0cHV0IGRpciBleGlzdHMKKyAgICAgICAgICAgIG1ha2VPdXRwdXREaXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NGaWxlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGlzIEpTUC4KKyAgICAgKgorICAgICAqIENvbnRlbnQgdHlwZSBpbmNsdWRlcyBjb250ZW50IHR5cGUgYW5kIGVuY29kaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50VHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpIHsKKyAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXJlIGlzIHRoZSBzZXJ2bGV0IGJlaW5nIGdlbmVyYXRlZD8KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldFdyaXRlciBnZXRXcml0ZXIoKSB7CisgICAgICAgIHJldHVybiB3cml0ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0V3JpdGVyKFNlcnZsZXRXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgIHRoaXMud3JpdGVyID0gd3JpdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlICdsb2NhdGlvbicgb2YgdGhlIFRMRCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHRhZ2xpYiAndXJpJy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHR3byBTdHJpbmdzOiBUaGUgZmlyc3QgZWxlbWVudCBkZW5vdGVzIHRoZSByZWFsCisgICAgICogcGF0aCB0byB0aGUgVExELiBJZiB0aGUgcGF0aCB0byB0aGUgVExEIHBvaW50cyB0byBhIGphciBmaWxlLCB0aGVuIHRoZQorICAgICAqIHNlY29uZCBlbGVtZW50IGRlbm90ZXMgdGhlIG5hbWUgb2YgdGhlIFRMRCBlbnRyeSBpbiB0aGUgamFyIGZpbGUuCisgICAgICogUmV0dXJucyBudWxsIGlmIHRoZSBnaXZlbiB1cmkgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgdGFnIGxpYnJhcnkKKyAgICAgKiAnZXhwb3NlZCcgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VGxkTG9jYXRpb24oU3RyaW5nIHVyaSkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIGxvY2F0aW9uID0gCisgICAgICAgICAgICBnZXRPcHRpb25zKCkuZ2V0VGxkTG9jYXRpb25zQ2FjaGUoKS5nZXRMb2NhdGlvbih1cmkpOworICAgICAgICByZXR1cm4gbG9jYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQXJlIHdlIGtlZXBpbmcgZ2VuZXJhdGVkIGNvZGUgYXJvdW5kPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGtlZXBHZW5lcmF0ZWQoKSB7CisgICAgICAgIHJldHVybiBnZXRPcHRpb25zKCkuZ2V0S2VlcEdlbmVyYXRlZCgpOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09IFJlbW92YWwgPT09PT09PT09PT09PT09PT09PT0gCisKKyAgICBwdWJsaWMgdm9pZCBpbmNyZW1lbnRSZW1vdmVkKCkgeworICAgICAgICBpZiAocmVtb3ZlZCA+IDEpIHsKKyAgICAgICAgICAgIGpzcENvbXBpbGVyLnJlbW92ZUdlbmVyYXRlZEZpbGVzKCk7CisgICAgICAgICAgICBpZiggcmN0eHQgIT0gbnVsbCApCisgICAgICAgICAgICAgICAgcmN0eHQucmVtb3ZlV3JhcHBlcihqc3BVcmkpOworICAgICAgICB9CisgICAgICAgIHJlbW92ZWQrKzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZWQoKSB7CisgICAgICAgIGlmIChyZW1vdmVkID4gMSApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PSBDb21waWxlIGFuZCByZWxvYWQgPT09PT09PT09PT09PT09PT09PT0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBjb21waWxlKCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlQ29tcGlsZXIoKTsKKyAgICAgICAgaWYgKGlzUGFja2FnZWRUYWdGaWxlIHx8IGpzcENvbXBpbGVyLmlzT3V0RGF0ZWQoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBqc3BMb2FkZXIgPSBudWxsOworICAgICAgICAgICAgICAgIGpzcENvbXBpbGVyLmNvbXBpbGUoKTsKKyAgICAgICAgICAgICAgICBqc3cuc2V0UmVsb2FkKHRydWUpOworICAgICAgICAgICAgICAgIGpzdy5zZXRDb21waWxhdGlvbkV4Y2VwdGlvbihudWxsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEphc3BlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIENhY2hlIGNvbXBpbGF0aW9uIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIGpzdy5zZXRDb21waWxhdGlvbkV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBKYXNwZXJFeGNlcHRpb24gamUgPSBuZXcgSmFzcGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IudW5hYmxlLmNvbXBpbGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleCk7CisgICAgICAgICAgICAgICAgLy8gQ2FjaGUgY29tcGlsYXRpb24gZXhjZXB0aW9uCisgICAgICAgICAgICAgICAganN3LnNldENvbXBpbGF0aW9uRXhjZXB0aW9uKGplKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBqZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09IE1hbmlwdWxhdGluZyB0aGUgY2xhc3MgPT09PT09PT09PT09PT09PT09PT0KKworICAgIHB1YmxpYyBDbGFzcyBsb2FkKCkgCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldEpzcExvYWRlcigpOworICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgbmFtZTsKKyAgICAgICAgICAgIGlmIChpc1RhZ0ZpbGUoKSkgeworICAgICAgICAgICAgICAgIG5hbWUgPSB0YWdJbmZvLmdldFRhZ0NsYXNzTmFtZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gZ2V0U2VydmxldFBhY2thZ2VOYW1lKCkgKyAiLiIgKyBnZXRTZXJ2bGV0Q2xhc3NOYW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXJ2bGV0Q2xhc3MgPSBqc3BMb2FkZXIubG9hZENsYXNzKG5hbWUpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnVuYWJsZS5sb2FkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNleCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnVuYWJsZS5jb21waWxlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4KTsKKyAgICAgICAgfQorICAgICAgICByZW1vdmVkID0gMDsKKyAgICAgICAgcmV0dXJuIHNlcnZsZXRDbGFzczsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PSBQcml2YXRlIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT0gCisKKyAgICBzdGF0aWMgT2JqZWN0IG91dHB1dERpckxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICBwcml2YXRlIHZvaWQgbWFrZU91dHB1dERpcigpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG91dHB1dERpckxvY2spIHsKKyAgICAgICAgICAgIEZpbGUgb3V0RGlyRmlsZSA9IG5ldyBGaWxlKG91dHB1dERpcik7CisgICAgICAgICAgICBvdXREaXJGaWxlLm1rZGlycygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU91dHB1dERpcigpIHsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOworICAgICAgICBpZiAoaXNUYWdGaWxlKCkpIHsKKwkgICAgU3RyaW5nIHRhZ05hbWUgPSB0YWdJbmZvLmdldFRhZ0NsYXNzTmFtZSgpOworICAgICAgICAgICAgcGF0aCA9IHRhZ05hbWUucmVwbGFjZSgnLicsICcvJyk7CisJICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKCcvJykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGF0aCA9IGdldFNlcnZsZXRQYWNrYWdlTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpOworCX0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gQXBwZW5kIHNlcnZsZXQgb3IgdGFnIGhhbmRsZXIgcGF0aCB0byBzY3JhdGNoIGRpcgorICAgICAgICAgICAgYmFzZVVybCA9IG9wdGlvbnMuZ2V0U2NyYXRjaERpcigpLnRvVVJMKCk7CisgICAgICAgICAgICBTdHJpbmcgb3V0VXJsU3RyaW5nID0gYmFzZVVybC50b1N0cmluZygpICsgJy8nICsgcGF0aDsKKyAgICAgICAgICAgIFVSTCBvdXRVcmwgPSBuZXcgVVJMKG91dFVybFN0cmluZyk7CisgICAgICAgICAgICBvdXRwdXREaXIgPSBvdXRVcmwuZ2V0RmlsZSgpICsgRmlsZS5zZXBhcmF0b3I7CisgICAgICAgICAgICBtYWtlT3V0cHV0RGlyKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBvdXRwdXQgZGlyZWN0b3J5OiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNQYXRoU2VwYXJhdG9yKGNoYXIgYykgeworICAgICAgIHJldHVybiAoYyA9PSAnLycgfHwgYyA9PSAnXFwnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY2Fub25pY2FsVVJJKFN0cmluZyBzKSB7CisgICAgICAgaWYgKHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICBmaW5hbCBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICAgICBpbnQgcG9zID0gMDsKKyAgICAgICB3aGlsZSAocG9zIDwgbGVuKSB7CisgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KHBvcyk7CisgICAgICAgICAgIGlmICggaXNQYXRoU2VwYXJhdG9yKGMpICkgeworICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqIG11bHRpcGxlIHBhdGggc2VwYXJhdG9ycy4KKyAgICAgICAgICAgICAgICAqICdmb28vLy9iYXInIC0+ICdmb28vYmFyJworICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICB3aGlsZSAocG9zKzEgPCBsZW4gJiYgaXNQYXRoU2VwYXJhdG9yKHMuY2hhckF0KHBvcysxKSkpIHsKKyAgICAgICAgICAgICAgICAgICArK3BvczsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgaWYgKHBvcysxIDwgbGVuICYmIHMuY2hhckF0KHBvcysxKSA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAqIGEgc2luZ2xlIGRvdCBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoIC0gd2UgYXJlIGRvbmUuCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgaWYgKHBvcysyID49IGxlbikgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHMuY2hhckF0KHBvcysyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgKiBzZWxmIGRpcmVjdG9yeSBpbiBwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAqIGZvby8uL2JhciAtPiBmb28vYmFyCisgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAqIHR3byBkb3RzIGluIGEgcGF0aDogZ28gYmFjayBvbmUgaGllcmFyY2h5LgorICAgICAgICAgICAgICAgICAgICAgICAgKiBmb28vYmFyLy4uL2JheiAtPiBmb28vYmF6CisgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgIGNhc2UgJy4nOgorICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGlmIHdlIGhhdmUgZXhhY3RseSBfdHdvXyBkb3RzLgorICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zKzMgPCBsZW4gJiYgaXNQYXRoU2VwYXJhdG9yKHMuY2hhckF0KHBvcyszKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlcGFyYXRvclBvcyA9IHJlc3VsdC5sZW5ndGgoKS0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNlcGFyYXRvclBvcyA+PSAwICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgaXNQYXRoU2VwYXJhdG9yKHJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGFyQXQoc2VwYXJhdG9yUG9zKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXNlcGFyYXRvclBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXBhcmF0b3JQb3MgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0TGVuZ3RoKHNlcGFyYXRvclBvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICAgICByZXN1bHQuYXBwZW5kKGMpOworICAgICAgICAgICArK3BvczsKKyAgICAgICB9CisgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9PcHRpb25zLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL09wdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGM2NjM4Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9PcHRpb25zLmphdmEKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Kc3BDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuVGFnUGx1Z2luTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5UbGRMb2NhdGlvbnNDYWNoZTsKKworLyoqCisgKiBBIGNsYXNzIHRvIGhvbGQgYWxsIGluaXQgcGFyYW1ldGVycyBzcGVjaWZpYyB0byB0aGUgSlNQIGVuZ2luZS4gCisgKgorICogQGF1dGhvciBBbmlsIEsuIFZpamVuZHJhbgorICogQGF1dGhvciBIYW5zIEJlcmdzdGVuCisgKiBAYXV0aG9yIFBpZXJyZSBEZWxpc2xlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3B0aW9ucyB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgSmFzcGVyIGlzc3VlcyBhIGNvbXBpbGF0aW9uIGVycm9yIGluc3RlYWQgb2YgYSBydW50aW1lCisgICAgICogSW5zdGFudGlhdGlvbiBlcnJvciBpZiB0aGUgY2xhc3MgYXR0cmlidXRlIHNwZWNpZmllZCBpbiB1c2VCZWFuIGFjdGlvbgorICAgICAqIGlzIGludmFsaWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RXJyb3JPblVzZUJlYW5JbnZhbGlkQ2xhc3NBdHRyaWJ1dGUoKTsKKworICAgIC8qKgorICAgICAqIEFyZSB3ZSBrZWVwaW5nIGdlbmVyYXRlZCBjb2RlIGFyb3VuZD8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRLZWVwR2VuZXJhdGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGFnIGhhbmRsZXIgcG9vbGluZyBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQb29saW5nRW5hYmxlZCgpOworCisgICAgLyoqCisgICAgICogQXJlIHdlIHN1cHBvcnRpbmcgSFRNTCBtYXBwZWQgc2VydmxldHM/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0TWFwcGVkRmlsZSgpOworCisgICAgLyoqCisgICAgICogU2hvdWxkIGVycm9ycyBiZSBzZW50IHRvIGNsaWVudCBvciB0aHJvd24gaW50byBzdGRlcnI/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U2VuZEVycm9yVG9DbGllbnQoKTsKKyAKKyAgICAvKioKKyAgICAgKiBTaG91bGQgd2UgaW5jbHVkZSBkZWJ1ZyBpbmZvcm1hdGlvbiBpbiBjb21waWxlZCBjbGFzcz8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDbGFzc0RlYnVnSW5mbygpOworCisgICAgLyoqCisgICAgICogQmFja2dyb3VuZCBjb21waWxlIHRocmVhZCBjaGVjayBpbnRlcnZhbCBpbiBzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDaGVja0ludGVydmFsKCk7CisKKyAgICAvKioKKyAgICAgKiBJcyBKYXNwZXIgYmVpbmcgdXNlZCBpbiBkZXZlbG9wbWVudCBtb2RlPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldERldmVsb3BtZW50KCk7CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgZ2VuZXJhdGlvbiBvZiBTTUFQIGluZm8gZm9yIEpTUjQ1IGRlYnVnZ2luZyBzdXBwcmVzc2VkPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU21hcFN1cHByZXNzZWQoKTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIFNNQVAgaW5mbyBmb3IgSlNSNDUgZGVidWdnaW5nIHNob3VsZCBiZSBkdW1wZWQgdG8gYQorICAgICAqIGZpbGUuCisgICAgICogSWdub3JlZCBpcyBzdXBwcmVzc1NtYXAoKSBpcyB0cnVlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTbWFwRHVtcGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgd2hpdGUgc3BhY2VzIGJldHdlZW4gZGlyZWN0aXZlcyBvciBhY3Rpb25zIGJlIHRyaW1tZWQ/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VHJpbVNwYWNlcygpOworCisgICAgLyoqCisgICAgICogQ2xhc3MgSUQgZm9yIHVzZSBpbiB0aGUgcGx1Z2luIHRhZyB3aGVuIHRoZSBicm93c2VyIGlzIElFLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEllQ2xhc3NJZCgpOworCisgICAgLyoqCisgICAgICogV2hhdCBpcyBteSBzY3JhdGNoIGRpcj8KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRTY3JhdGNoRGlyKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGF0IGNsYXNzcGF0aCBzaG91bGQgSSB1c2Ugd2hpbGUgY29tcGlsaW5nIHRoZSBzZXJ2bGV0cworICAgICAqIGdlbmVyYXRlZCBmcm9tIEpTUCBmaWxlcz8KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzUGF0aCgpOworCisgICAgLyoqCisgICAgICogQ29tcGlsZXIgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcGlsZXIoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBjb21waWxlciB0YXJnZXQgVk0sIGUuZy4gMS4xLCAxLjIsIDEuMywgMS40LCBvciAxLjUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21waWxlclRhcmdldFZNKCk7CisKKyAgICAvKioKKyAgICAgKiBDb21waWxlciBzb3VyY2UgVk0sIGUuZy4gMS4zLCAxLjQsIG9yIDEuNS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBpbGVyU291cmNlVk0oKTsgICAKKworICAgIC8qKgorICAgICAqIFRoZSBjYWNoZSBmb3IgdGhlIGxvY2F0aW9uIG9mIHRoZSBUTEQncworICAgICAqIGZvciB0aGUgdmFyaW91cyB0YWcgbGlicmFyaWVzICdleHBvc2VkJworICAgICAqIGJ5IHRoZSB3ZWIgYXBwbGljYXRpb24uCisgICAgICogQSB0YWcgbGlicmFyeSBpcyAnZXhwb3NlZCcgZWl0aGVyIGV4cGxpY2l0ZWx5IGluIAorICAgICAqIHdlYi54bWwgb3IgaW1wbGljaXRlbHkgdmlhIHRoZSB1cmkgdGFnIGluIHRoZSBUTEQgCisgICAgICogb2YgYSB0YWdsaWIgZGVwbG95ZWQgaW4gYSBqYXIgZmlsZSAoV0VCLUlORi9saWIpLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2YgdGhlIFRsZExvY2F0aW9uc0NhY2hlCisgICAgICogZm9yIHRoZSB3ZWItYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIFRsZExvY2F0aW9uc0NhY2hlIGdldFRsZExvY2F0aW9uc0NhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBKYXZhIHBsYXRmb3JtIGVuY29kaW5nIHRvIGdlbmVyYXRlIHRoZSBKU1AKKyAgICAgKiBwYWdlIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRKYXZhRW5jb2RpbmcoKTsKKworICAgIC8qKgorICAgICAqIGJvb2xlYW4gZmxhZyB0byB0ZWxsIEFudCB3aGV0aGVyIHRvIGZvcmsgSlNQIHBhZ2UgY29tcGlsYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEZvcmsoKTsKKworICAgIC8qKgorICAgICAqIE9idGFpbiBKU1AgY29uZmlndXJhdGlvbiBpbmZvcm1hbnRpb24gc3BlY2lmaWVkIGluIHdlYi54bWwuICAKKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwQ29uZmlnIGdldEpzcENvbmZpZygpOworCisgICAgLyoqCisgICAgICogSXMgZ2VuZXJhdGlvbiBvZiBYLVBvd2VyZWQtQnkgcmVzcG9uc2UgaGVhZGVyIGVuYWJsZWQvZGlzYWJsZWQ/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNYcG93ZXJlZEJ5KCk7CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW4gYSBUYWcgUGx1Z2luIE1hbmFnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnUGx1Z2luTWFuYWdlciBnZXRUYWdQbHVnaW5NYW5hZ2VyKCk7CisKKyAgICAvKioKKyAgICAgKiBBcmUgVGV4dCBzdHJpbmdzIHRvIGJlIGdlbmVyYXRlZCBhcyBjaGFyIGFycmF5cz8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZW5TdHJpbmdBc0NoYXJBcnJheSgpOworICAgIAorICAgIC8qKgorICAgICAqIE1vZGlmaWNhdGlvbiB0ZXN0IGludGVydmFsLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TW9kaWZpY2F0aW9uVGVzdEludGVydmFsKCk7CisgICAgCisgICAgLyoqCisgICAgICogSXMgY2FjaGluZyBlbmFibGVkICh1c2VkIGZvciBwcmVjb21waWxhdGlvbikuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDYWNoaW5nKCk7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHdlYi1hcHBsaWNhdGlvbiB3aWRlIGNhY2hlIGZvciB0aGUgcmV0dXJuZWQgVHJlZU5vZGUKKyAgICAgKiBieSBwYXJzZVhNTERvY3VtZW50IGluIFRhZ0xpYnJhcnlJbmZvSW1wbC5wYXJzZVRMRCwKKyAgICAgKiBpZiBpc0NhY2hpbmcgcmV0dXJucyB0cnVlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIE1hcChTdHJpbmcgdXJpLCBUcmVlTm9kZSB0bGQpIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBNYXAgZ2V0Q2FjaGUoKTsKKyAgICAKK30KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvQW50Q29tcGlsZXIuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvQW50Q29tcGlsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjkyZmY0Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9BbnRDb21waWxlci5qYXZhCkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIudXRpbC5TeXN0ZW1Mb2dIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRlZmF1bHRMb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhYzsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQ7CisKKy8qKgorICogTWFpbiBKU1AgY29tcGlsZXIgY2xhc3MuIFRoaXMgY2xhc3MgdXNlcyBBbnQgZm9yIGNvbXBpbGluZy4KKyAqCisgKiBAYXV0aG9yIEFuaWwgSy4gVmlqZW5kcmFuCisgKiBAYXV0aG9yIE1hbmRhciBSYWplCisgKiBAYXV0aG9yIFBpZXJyZSBEZWxpc2xlCisgKiBAYXV0aG9yIEtpbi1tYW4gQ2h1bmcKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEBhdXRob3IgTWFyayBSb3RoCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRDb21waWxlciBleHRlbmRzIENvbXBpbGVyIHsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFN5c3RlbS5zZXRFcnIobmV3IFN5c3RlbUxvZ0hhbmRsZXIoU3lzdGVtLmVycikpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgcHJvdGVjdGVkIFByb2plY3QgcHJvamVjdD1udWxsOworICAgIHByb3RlY3RlZCBKYXNwZXJBbnRMb2dnZXIgbG9nZ2VyOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKyAgICAvLyBMYXp5IGV2YWwgLSBpZiB3ZSBkb24ndCBuZWVkIHRvIGNvbXBpbGUgd2UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0aGUgcHJvamVjdAorICAgIHByb3RlY3RlZCBQcm9qZWN0IGdldFByb2plY3QoKSB7CisgICAgICAgIAorICAgICAgICBpZiggcHJvamVjdCE9bnVsbCApIHJldHVybiBwcm9qZWN0OworICAgICAgICAKKyAgICAgICAgLy8gSW5pdGlhbGl6aW5nIHByb2plY3QKKyAgICAgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIGxvZ2dlciA9IG5ldyBKYXNwZXJBbnRMb2dnZXIoKTsKKyAgICAgICAgbG9nZ2VyLnNldE91dHB1dFByaW50U3RyZWFtKFN5c3RlbS5vdXQpOworICAgICAgICBsb2dnZXIuc2V0RXJyb3JQcmludFN0cmVhbShTeXN0ZW0uZXJyKTsKKyAgICAgICAgbG9nZ2VyLnNldE1lc3NhZ2VPdXRwdXRMZXZlbChQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgcHJvamVjdC5hZGRCdWlsZExpc3RlbmVyKCBsb2dnZXIpOworICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5ob21lIikgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJvamVjdC5zZXRCYXNlZGlyKCBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmhvbWUiKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmKCBvcHRpb25zLmdldENvbXBpbGVyKCkgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb21waWxlciAiICsgb3B0aW9ucy5nZXRDb21waWxlcigpICk7CisgICAgICAgICAgICBwcm9qZWN0LnNldFByb3BlcnR5KCJidWlsZC5jb21waWxlciIsIG9wdGlvbnMuZ2V0Q29tcGlsZXIoKSApOworICAgICAgICB9CisgICAgICAgIHByb2plY3QuaW5pdCgpOworICAgICAgICByZXR1cm4gcHJvamVjdDsKKyAgICB9CisgICAgCisgICAgY2xhc3MgSmFzcGVyQW50TG9nZ2VyIGV4dGVuZHMgRGVmYXVsdExvZ2dlciB7CisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIHJlcG9ydEJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHByaW50TWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBQcmludFN0cmVhbSBzdHJlYW0sCisgICAgICAgICAgICAgICAgZmluYWwgaW50IHByaW9yaXR5KSB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgcmVwb3J0QnVmLmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgICAgIHJlcG9ydEJ1Zi5hcHBlbmQoU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXBvcnQoKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVwb3J0ID0gcmVwb3J0QnVmLnRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXBvcnRCdWYuc2V0TGVuZ3RoKDApOworICAgICAgICAgICAgcmV0dXJuIHJlcG9ydDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqIAorICAgICAqIENvbXBpbGUgdGhlIHNlcnZsZXQgZnJvbSAuamF2YSBmaWxlIHRvIC5jbGFzcyBmaWxlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVDbGFzcyhTdHJpbmdbXSBzbWFwKQorICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBKYXNwZXJFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBsb25nIHQxID0gMDsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICB0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGphdmFFbmNvZGluZyA9IGN0eHQuZ2V0T3B0aW9ucygpLmdldEphdmFFbmNvZGluZygpOworICAgICAgICBTdHJpbmcgamF2YUZpbGVOYW1lID0gY3R4dC5nZXRTZXJ2bGV0SmF2YUZpbGVOYW1lKCk7CisgICAgICAgIFN0cmluZyBjbGFzc3BhdGggPSBjdHh0LmdldENsYXNzUGF0aCgpOyAKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBzZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIik7CisgICAgICAgIAorICAgICAgICBTdHJpbmdCdWZmZXIgZXJyb3JSZXBvcnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIAorICAgICAgICBTdHJpbmdCdWZmZXIgaW5mbz1uZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGluZm8uYXBwZW5kKCJDb21waWxlOiBqYXZhRmlsZU5hbWU9IiArIGphdmFGaWxlTmFtZSArICJcbiIgKTsKKyAgICAgICAgaW5mby5hcHBlbmQoIiAgICBjbGFzc3BhdGg9IiArIGNsYXNzcGF0aCArICJcbiIgKTsKKyAgICAgICAgCisgICAgICAgIC8vIFN0YXJ0IGNhcHR1cmluZyB0aGUgU3lzdGVtLmVyciBvdXRwdXQgZm9yIHRoaXMgdGhyZWFkCisgICAgICAgIFN5c3RlbUxvZ0hhbmRsZXIuc2V0VGhyZWFkKCk7CisgICAgICAgIAorICAgICAgICAvLyBJbml0aWFsaXppbmcgamF2YWMgdGFzaworICAgICAgICBnZXRQcm9qZWN0KCk7CisgICAgICAgIEphdmFjIGphdmFjID0gKEphdmFjKSBwcm9qZWN0LmNyZWF0ZVRhc2soImphdmFjIik7CisgICAgICAgIAorICAgICAgICAvLyBJbml0aWFsaXppbmcgY2xhc3NwYXRoCisgICAgICAgIFBhdGggcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOworICAgICAgICBwYXRoLnNldFBhdGgoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKSk7CisgICAgICAgIGluZm8uYXBwZW5kKCIgICAgY3A9IiArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIikgKyAiXG4iKTsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xhc3NwYXRoLCBzZXApOworICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0aEVsZW1lbnQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICBGaWxlIHJlcG9zaXRvcnkgPSBuZXcgRmlsZShwYXRoRWxlbWVudCk7CisgICAgICAgICAgICBwYXRoLnNldExvY2F0aW9uKHJlcG9zaXRvcnkpOworICAgICAgICAgICAgaW5mby5hcHBlbmQoIiAgICBjcD0iICsgcmVwb3NpdG9yeSArICJcbiIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgbG9nLmRlYnVnKCAiVXNpbmcgY2xhc3NwYXRoOiAiICsgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKSArIHNlcAorICAgICAgICAgICAgICAgICAgICArIGNsYXNzcGF0aCk7CisgICAgICAgIAorICAgICAgICAvLyBJbml0aWFsaXppbmcgc291cmNlcGF0aAorICAgICAgICBQYXRoIHNyY1BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKKyAgICAgICAgc3JjUGF0aC5zZXRMb2NhdGlvbihvcHRpb25zLmdldFNjcmF0Y2hEaXIoKSk7CisgICAgICAgIAorICAgICAgICBpbmZvLmFwcGVuZCgiICAgIHdvcmsgZGlyPSIgKyBvcHRpb25zLmdldFNjcmF0Y2hEaXIoKSArICJcbiIpOworICAgICAgICAKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBhbmQgc2V0IGphdmEgZXh0ZW5zaW9ucworICAgICAgICBTdHJpbmcgZXh0cyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5leHQuZGlycyIpOworICAgICAgICBpZiAoZXh0cyAhPSBudWxsKSB7CisgICAgICAgICAgICBQYXRoIGV4dGRpcnMgPSBuZXcgUGF0aChwcm9qZWN0KTsKKyAgICAgICAgICAgIGV4dGRpcnMuc2V0UGF0aChleHRzKTsKKyAgICAgICAgICAgIGphdmFjLnNldEV4dGRpcnMoZXh0ZGlycyk7CisgICAgICAgICAgICBpbmZvLmFwcGVuZCgiICAgIGV4dGVuc2lvbiBkaXI9IiArIGV4dHMgKyAiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCBlbmRvcnNlZCBkaXJlY3RvcmllcyBpZiBhbnkgYXJlIHNwZWNpZmllZCBhbmQgd2UncmUgZm9ya2luZworICAgICAgICAvLyBTZWUgQnVnemlsbGEgMzEyNTcKKyAgICAgICAgaWYoY3R4dC5nZXRPcHRpb25zKCkuZ2V0Rm9yaygpKSB7CisgICAgICAgICAgICBTdHJpbmcgZW5kb3JzZWQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuZW5kb3JzZWQuZGlycyIpOworICAgICAgICAgICAgaWYoZW5kb3JzZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEphdmFjLkltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudCBlbmRvcnNlZEFyZyA9IAorICAgICAgICAgICAgICAgICAgICBqYXZhYy5jcmVhdGVDb21waWxlckFyZygpOworICAgICAgICAgICAgICAgIGVuZG9yc2VkQXJnLnNldExpbmUoIi1KLURqYXZhLmVuZG9yc2VkLmRpcnM9IitlbmRvcnNlZCk7CisgICAgICAgICAgICAgICAgaW5mby5hcHBlbmQoIiAgICBlbmRvcnNlZCBkaXI9IiArIGVuZG9yc2VkICsgIlxuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZm8uYXBwZW5kKCIgICAgbm8gZW5kb3JzZWQgZGlycyBzcGVjaWZpZWRcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBDb25maWd1cmUgdGhlIGNvbXBpbGVyIG9iamVjdAorICAgICAgICBqYXZhYy5zZXRFbmNvZGluZyhqYXZhRW5jb2RpbmcpOworICAgICAgICBqYXZhYy5zZXRDbGFzc3BhdGgocGF0aCk7CisgICAgICAgIGphdmFjLnNldERlYnVnKGN0eHQuZ2V0T3B0aW9ucygpLmdldENsYXNzRGVidWdJbmZvKCkpOworICAgICAgICBqYXZhYy5zZXRTcmNkaXIoc3JjUGF0aCk7CisgICAgICAgIGphdmFjLnNldFRlbXBkaXIob3B0aW9ucy5nZXRTY3JhdGNoRGlyKCkpOworICAgICAgICBqYXZhYy5zZXRPcHRpbWl6ZSghIGN0eHQuZ2V0T3B0aW9ucygpLmdldENsYXNzRGVidWdJbmZvKCkgKTsKKyAgICAgICAgamF2YWMuc2V0Rm9yayhjdHh0LmdldE9wdGlvbnMoKS5nZXRGb3JrKCkpOworICAgICAgICBpbmZvLmFwcGVuZCgiICAgIHNyY0Rpcj0iICsgc3JjUGF0aCArICJcbiIgKTsKKyAgICAgICAgCisgICAgICAgIC8vIFNldCB0aGUgSmF2YSBjb21waWxlciB0byB1c2UKKyAgICAgICAgaWYgKG9wdGlvbnMuZ2V0Q29tcGlsZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBqYXZhYy5zZXRDb21waWxlcihvcHRpb25zLmdldENvbXBpbGVyKCkpOworICAgICAgICAgICAgaW5mby5hcHBlbmQoIiAgICBjb21waWxlcj0iICsgb3B0aW9ucy5nZXRDb21waWxlcigpICsgIlxuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3B0aW9ucy5nZXRDb21waWxlclRhcmdldFZNKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgamF2YWMuc2V0VGFyZ2V0KG9wdGlvbnMuZ2V0Q29tcGlsZXJUYXJnZXRWTSgpKTsKKyAgICAgICAgICAgIGluZm8uYXBwZW5kKCIgICBjb21waWxlclRhcmdldFZNPSIgKyBvcHRpb25zLmdldENvbXBpbGVyVGFyZ2V0Vk0oKSArICJcbiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wdGlvbnMuZ2V0Q29tcGlsZXJTb3VyY2VWTSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGphdmFjLnNldFNvdXJjZShvcHRpb25zLmdldENvbXBpbGVyU291cmNlVk0oKSk7CisgICAgICAgICAgICBpbmZvLmFwcGVuZCgiICAgY29tcGlsZXJTb3VyY2VWTT0iICsgb3B0aW9ucy5nZXRDb21waWxlclNvdXJjZVZNKCkgKyAiXG4iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgaW5jbHVkZXMgcGF0aAorICAgICAgICBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBpbmNsdWRlcyA9IGphdmFjLmNyZWF0ZUluY2x1ZGUoKTsKKyAgICAgICAgCisgICAgICAgIGluY2x1ZGVzLnNldE5hbWUoY3R4dC5nZXRKYXZhUGF0aCgpKTsKKyAgICAgICAgaW5mby5hcHBlbmQoIiAgICBpbmNsdWRlPSIrIGN0eHQuZ2V0SmF2YVBhdGgoKSArICJcbiIgKTsKKyAgICAgICAgCisgICAgICAgIEJ1aWxkRXhjZXB0aW9uIGJlID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoY3R4dC5nZXRPcHRpb25zKCkuZ2V0Rm9yaygpKSB7CisgICAgICAgICAgICAgICAgamF2YWMuZXhlY3V0ZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQoamF2YWNMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIGphdmFjLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGJlID0gZTsKKyAgICAgICAgICAgIGxvZy5lcnJvciggIkphdmFjIGV4Y2VwdGlvbiAiLCBlKTsKKyAgICAgICAgICAgIGxvZy5lcnJvciggIkVudjogIiArIGluZm8udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGVycm9yUmVwb3J0LmFwcGVuZChsb2dnZXIuZ2V0UmVwb3J0KCkpOworCisgICAgICAgIC8vIFN0b3AgY2FwdHVyaW5nIHRoZSBTeXN0ZW0uZXJyIG91dHB1dCBmb3IgdGhpcyB0aHJlYWQKKyAgICAgICAgU3RyaW5nIGVycm9yQ2FwdHVyZSA9IFN5c3RlbUxvZ0hhbmRsZXIudW5zZXRUaHJlYWQoKTsKKyAgICAgICAgaWYgKGVycm9yQ2FwdHVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICBlcnJvclJlcG9ydC5hcHBlbmQoU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTsKKyAgICAgICAgICAgIGVycm9yUmVwb3J0LmFwcGVuZChlcnJvckNhcHR1cmUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjdHh0LmtlZXBHZW5lcmF0ZWQoKSkgeworICAgICAgICAgICAgRmlsZSBqYXZhRmlsZSA9IG5ldyBGaWxlKGphdmFGaWxlTmFtZSk7CisgICAgICAgICAgICBqYXZhRmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGJlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBlcnJvclJlcG9ydFN0cmluZyA9IGVycm9yUmVwb3J0LnRvU3RyaW5nKCk7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIGNvbXBpbGluZyBmaWxlOiAiICsgamF2YUZpbGVOYW1lICsgIiAiCisgICAgICAgICAgICAgICAgICAgICsgZXJyb3JSZXBvcnRTdHJpbmcpOworICAgICAgICAgICAgSmF2YWNFcnJvckRldGFpbFtdIGphdmFjRXJyb3JzID0gRXJyb3JEaXNwYXRjaGVyLnBhcnNlSmF2YWNFcnJvcnMoCisgICAgICAgICAgICAgICAgICAgIGVycm9yUmVwb3J0U3RyaW5nLCBqYXZhRmlsZU5hbWUsIHBhZ2VOb2Rlcyk7CisgICAgICAgICAgICBpZiAoamF2YWNFcnJvcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVyckRpc3BhdGNoZXIuamF2YWNFcnJvcihqYXZhY0Vycm9ycyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyckRpc3BhdGNoZXIuamF2YWNFcnJvcihlcnJvclJlcG9ydFN0cmluZywgYmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKSB7CisgICAgICAgICAgICBsb25nIHQyPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgbG9nLmRlYnVnKCJDb21waWxlZCAiICsgY3R4dC5nZXRTZXJ2bGV0SmF2YUZpbGVOYW1lKCkgKyAiICIKKyAgICAgICAgICAgICAgICAgICAgICArICh0Mi10MSkgKyAibXMiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbG9nZ2VyID0gbnVsbDsKKyAgICAgICAgcHJvamVjdCA9IG51bGw7CisgICAgICAgIAorICAgICAgICBpZiAoY3R4dC5pc1Byb3RvdHlwZU1vZGUoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBKU1I0NSBTdXBwb3J0CisgICAgICAgIGlmICghIG9wdGlvbnMuaXNTbWFwU3VwcHJlc3NlZCgpKSB7CisgICAgICAgICAgICBTbWFwVXRpbC5pbnN0YWxsU21hcChzbWFwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIAorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9CZWFuUmVwb3NpdG9yeS5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9CZWFuUmVwb3NpdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMTY2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0JlYW5SZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSmFzcGVyRXhjZXB0aW9uOworCisvKioKKyAqIFJlcG9zaXRvcnkgb2Yge3BhZ2UsIHJlcXVlc3QsIHNlc3Npb24sIGFwcGxpY2F0aW9ufS1zY29wZWQgYmVhbnMgCisgKgorICogQGF1dGhvciBNYW5kYXIgUmFqZQorICovCitjbGFzcyBCZWFuUmVwb3NpdG9yeSB7CisKKyAgICBwcml2YXRlIFZlY3RvciBzZXNzaW9uQmVhbnM7CisgICAgcHJpdmF0ZSBWZWN0b3IgcGFnZUJlYW5zOworICAgIHByaXZhdGUgVmVjdG9yIGFwcEJlYW5zOworICAgIHByaXZhdGUgVmVjdG9yIHJlcXVlc3RCZWFuczsKKyAgICBwcml2YXRlIEhhc2h0YWJsZSBiZWFuVHlwZXM7CisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBsb2FkZXI7CisgICAgcHJpdmF0ZSBFcnJvckRpc3BhdGNoZXIgZXJyRGlzcGF0Y2hlcjsKKworICAgIC8qCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICovICAgIAorICAgIHB1YmxpYyBCZWFuUmVwb3NpdG9yeShDbGFzc0xvYWRlciBsb2FkZXIsIEVycm9yRGlzcGF0Y2hlciBlcnIpIHsKKworICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjsKKwl0aGlzLmVyckRpc3BhdGNoZXIgPSBlcnI7CisKKwlzZXNzaW9uQmVhbnMgPSBuZXcgVmVjdG9yKDExKTsKKwlwYWdlQmVhbnMgPSBuZXcgVmVjdG9yKDExKTsKKwlhcHBCZWFucyA9IG5ldyBWZWN0b3IoMTEpOworCXJlcXVlc3RCZWFucyA9IG5ldyBWZWN0b3IoMTEpOworCWJlYW5UeXBlcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICB9CisgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZEJlYW4oTm9kZS5Vc2VCZWFuIG4sIFN0cmluZyBzLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHNjb3BlKQorCSAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworCWlmIChzY29wZSA9PSBudWxsIHx8IHNjb3BlLmVxdWFscygicGFnZSIpKSB7CisJICAgIHBhZ2VCZWFucy5hZGRFbGVtZW50KHMpOwkKKwl9IGVsc2UgaWYgKHNjb3BlLmVxdWFscygicmVxdWVzdCIpKSB7CisJICAgIHJlcXVlc3RCZWFucy5hZGRFbGVtZW50KHMpOworCX0gZWxzZSBpZiAoc2NvcGUuZXF1YWxzKCJzZXNzaW9uIikpIHsKKwkgICAgc2Vzc2lvbkJlYW5zLmFkZEVsZW1lbnQocyk7CisJfSBlbHNlIGlmIChzY29wZS5lcXVhbHMoImFwcGxpY2F0aW9uIikpIHsKKwkgICAgYXBwQmVhbnMuYWRkRWxlbWVudChzKTsKKwl9IGVsc2UgeworCSAgICBlcnJEaXNwYXRjaGVyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IudXNlYmVhbi5iYWRTY29wZSIpOworCX0KKwkKKwlwdXRCZWFuVHlwZShzLCB0eXBlKTsKKyAgICB9CisgICAgICAgICAgICAKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0QmVhblR5cGUoU3RyaW5nIGJlYW4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCUNsYXNzIGNsYXp6ID0gbnVsbDsKKwl0cnkgeworCSAgICBjbGF6eiA9IGxvYWRlci5sb2FkQ2xhc3MgKChTdHJpbmcpYmVhblR5cGVzLmdldChiZWFuKSk7CisJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworCSAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uIChleCk7CisJfQorCXJldHVybiBjbGF6ejsKKyAgICB9CisgICAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja1ZhcmlhYmxlIChTdHJpbmcgYmVhbikgeworCS8vIFhYWCBOb3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSBjb3JyZWN0IHdheS4KKwkvLyBBZnRlciBwYWdlQ29udGV4dCBpcyBmaW5hbGlzZWQgdGhpcyB3aWxsIGNoYW5nZS4KKwlyZXR1cm4gKGNoZWNrUGFnZUJlYW4oYmVhbikgfHwgY2hlY2tTZXNzaW9uQmVhbihiZWFuKSB8fAorCQljaGVja1JlcXVlc3RCZWFuKGJlYW4pIHx8IGNoZWNrQXBwbGljYXRpb25CZWFuKGJlYW4pKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgdm9pZCBwdXRCZWFuVHlwZShTdHJpbmcgYmVhbiwgU3RyaW5nIHR5cGUpIHsKKwliZWFuVHlwZXMucHV0IChiZWFuLCB0eXBlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tQYWdlQmVhbiAoU3RyaW5nIHMpIHsKKwlyZXR1cm4gcGFnZUJlYW5zLmNvbnRhaW5zIChzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tSZXF1ZXN0QmVhbiAoU3RyaW5nIHMpIHsKKwlyZXR1cm4gcmVxdWVzdEJlYW5zLmNvbnRhaW5zIChzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tTZXNzaW9uQmVhbiAoU3RyaW5nIHMpIHsKKwlyZXR1cm4gc2Vzc2lvbkJlYW5zLmNvbnRhaW5zIChzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tBcHBsaWNhdGlvbkJlYW4gKFN0cmluZyBzKSB7CisJcmV0dXJuIGFwcEJlYW5zLmNvbnRhaW5zIChzKTsKKyAgICB9CisKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Db2xsZWN0b3IuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvQ29sbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiMmI5ZAotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvQ29sbGVjdG9yLmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKKworLyoqCisgKiBDb2xsZWN0IGluZm8gYWJvdXQgdGhlIHBhZ2UgYW5kIG5vZGVzLCBhbmQgbWFrZSB0aGVtIGF2YWlsYWJlIHRocm91Z2gKKyAqIHRoZSBQYWdlSW5mbyBvYmplY3QuCisgKgorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKiBAYXV0aG9yIE1hcmsgUm90aAorICovCisKK2NsYXNzIENvbGxlY3RvciB7CisKKyAgICAvKioKKyAgICAgKiBBIHZpc2l0b3IgZm9yIGNvbGxlY3RpbmcgaW5mb3JtYXRpb24gb24gdGhlIHBhZ2UgYW5kIHRoZSBib2R5IG9mCisgICAgICogdGhlIGN1c3RvbSB0YWdzLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBDb2xsZWN0VmlzaXRvciBleHRlbmRzIE5vZGUuVmlzaXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNjcmlwdGluZ0VsZW1lbnRTZWVuID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiB1c2ViZWFuU2VlbiA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZUFjdGlvblNlZW4gPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHBhcmFtQWN0aW9uU2VlbiA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2V0UHJvcGVydHlTZWVuID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNTY3JpcHRpbmdWYXJzID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5QYXJhbUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChuLmdldFZhbHVlKCkuaXNFeHByZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICBzY3JpcHRpbmdFbGVtZW50U2VlbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJhbUFjdGlvblNlZW4gPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5JbmNsdWRlQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG4uZ2V0UGFnZSgpLmlzRXhwcmVzc2lvbigpKSB7CisgICAgICAgICAgICAgICAgc2NyaXB0aW5nRWxlbWVudFNlZW4gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5jbHVkZUFjdGlvblNlZW4gPSB0cnVlOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Gb3J3YXJkQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG4uZ2V0UGFnZSgpLmlzRXhwcmVzc2lvbigpKSB7CisgICAgICAgICAgICAgICAgc2NyaXB0aW5nRWxlbWVudFNlZW4gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5TZXRQcm9wZXJ0eSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChuLmdldFZhbHVlKCkgIT0gbnVsbCAmJiBuLmdldFZhbHVlKCkuaXNFeHByZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICBzY3JpcHRpbmdFbGVtZW50U2VlbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRQcm9wZXJ0eVNlZW4gPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Vc2VCZWFuIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG4uZ2V0QmVhbk5hbWUoKSAhPSBudWxsICYmIG4uZ2V0QmVhbk5hbWUoKS5pc0V4cHJlc3Npb24oKSkgeworICAgICAgICAgICAgICAgIHNjcmlwdGluZ0VsZW1lbnRTZWVuID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVzZWJlYW5TZWVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlBsdWdJbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChuLmdldEhlaWdodCgpICE9IG51bGwgJiYgbi5nZXRIZWlnaHQoKS5pc0V4cHJlc3Npb24oKSkgeworICAgICAgICAgICAgICAgIHNjcmlwdGluZ0VsZW1lbnRTZWVuID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuLmdldFdpZHRoKCkgIT0gbnVsbCAmJiBuLmdldFdpZHRoKCkuaXNFeHByZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICBzY3JpcHRpbmdFbGVtZW50U2VlbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkN1c3RvbVRhZyBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSB3aGF0IGtpbmRzIG9mIGVsZW1lbnQgd2Ugc2VlIGFzIGNoaWxkIGVsZW1lbnRzCisgICAgICAgICAgICBjaGVja1NlZW4oIG4uZ2V0Q2hpbGRJbmZvKCksIG4gKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVjayBhbGwgY2hpbGQgbm9kZXMgZm9yIHZhcmlvdXMgZWxlbWVudHMgYW5kIHVwZGF0ZSB0aGUgZ2l2ZW4KKyAgICAgICAgICogQ2hpbGRJbmZvIG9iamVjdCBhY2NvcmRpbmdseS4gIFZpc2l0cyBib2R5IGluIHRoZSBwcm9jZXNzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrU2VlbiggTm9kZS5DaGlsZEluZm8gY2ksIE5vZGUgbiApCisgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHNhdmUgdmFsdWVzIGNvbGxlY3RlZCBzbyBmYXIKKyAgICAgICAgICAgIGJvb2xlYW4gc2NyaXB0aW5nRWxlbWVudFNlZW5TYXZlID0gc2NyaXB0aW5nRWxlbWVudFNlZW47CisgICAgICAgICAgICBzY3JpcHRpbmdFbGVtZW50U2VlbiA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiB1c2ViZWFuU2VlblNhdmUgPSB1c2ViZWFuU2VlbjsKKyAgICAgICAgICAgIHVzZWJlYW5TZWVuID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVBY3Rpb25TZWVuU2F2ZSA9IGluY2x1ZGVBY3Rpb25TZWVuOworICAgICAgICAgICAgaW5jbHVkZUFjdGlvblNlZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gcGFyYW1BY3Rpb25TZWVuU2F2ZSA9IHBhcmFtQWN0aW9uU2VlbjsKKyAgICAgICAgICAgIHBhcmFtQWN0aW9uU2VlbiA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBzZXRQcm9wZXJ0eVNlZW5TYXZlID0gc2V0UHJvcGVydHlTZWVuOworICAgICAgICAgICAgc2V0UHJvcGVydHlTZWVuID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGhhc1NjcmlwdGluZ1ZhcnNTYXZlID0gaGFzU2NyaXB0aW5nVmFyczsKKyAgICAgICAgICAgIGhhc1NjcmlwdGluZ1ZhcnMgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gU2NhbiBhdHRyaWJ1dGUgbGlzdCBmb3IgZXhwcmVzc2lvbnMKKyAgICAgICAgICAgIGlmKCBuIGluc3RhbmNlb2YgTm9kZS5DdXN0b21UYWcgKSB7CisgICAgICAgICAgICAgICAgTm9kZS5DdXN0b21UYWcgY3QgPSAoTm9kZS5DdXN0b21UYWcpbjsKKyAgICAgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZVtdIGF0dHJzID0gY3QuZ2V0SnNwQXR0cmlidXRlcygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBhdHRycyAhPSBudWxsICYmIGkgPCBhdHRycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cnNbaV0uaXNFeHByZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdGluZ0VsZW1lbnRTZWVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisKKyAgICAgICAgICAgIGlmKCAobiBpbnN0YW5jZW9mIE5vZGUuQ3VzdG9tVGFnKSAmJiAhaGFzU2NyaXB0aW5nVmFycykgeworICAgICAgICAgICAgICAgIE5vZGUuQ3VzdG9tVGFnIGN0ID0gKE5vZGUuQ3VzdG9tVGFnKW47CisgICAgICAgICAgICAgICAgaGFzU2NyaXB0aW5nVmFycyA9IGN0LmdldFZhcmlhYmxlSW5mb3MoKS5sZW5ndGggPiAwIHx8CisgICAgICAgICAgICAgICAgICAgIGN0LmdldFRhZ1ZhcmlhYmxlSW5mb3MoKS5sZW5ndGggPiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWNvcmQgaWYgdGhlIHRhZyBlbGVtZW50IGFuZCBpdHMgYm9keSBjb250YWlucyBhbnkgc2NyaXB0bGV0LgorICAgICAgICAgICAgY2kuc2V0U2NyaXB0bGVzcyghIHNjcmlwdGluZ0VsZW1lbnRTZWVuKTsKKyAgICAgICAgICAgIGNpLnNldEhhc1VzZUJlYW4odXNlYmVhblNlZW4pOworICAgICAgICAgICAgY2kuc2V0SGFzSW5jbHVkZUFjdGlvbihpbmNsdWRlQWN0aW9uU2Vlbik7CisgICAgICAgICAgICBjaS5zZXRIYXNQYXJhbUFjdGlvbihwYXJhbUFjdGlvblNlZW4pOworICAgICAgICAgICAgY2kuc2V0SGFzU2V0UHJvcGVydHkoc2V0UHJvcGVydHlTZWVuKTsKKyAgICAgICAgICAgIGNpLnNldEhhc1NjcmlwdGluZ1ZhcnMoaGFzU2NyaXB0aW5nVmFycyk7CisKKyAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSB2YWx1ZSBvZiBzY3JpcHRpbmdFbGVtZW50U2VlbiB1cC4KKyAgICAgICAgICAgIHNjcmlwdGluZ0VsZW1lbnRTZWVuID0gc2NyaXB0aW5nRWxlbWVudFNlZW4gfHwgc2NyaXB0aW5nRWxlbWVudFNlZW5TYXZlOworICAgICAgICAgICAgdXNlYmVhblNlZW4gPSB1c2ViZWFuU2VlbiB8fCB1c2ViZWFuU2VlblNhdmU7CisgICAgICAgICAgICBzZXRQcm9wZXJ0eVNlZW4gPSBzZXRQcm9wZXJ0eVNlZW4gfHwgc2V0UHJvcGVydHlTZWVuU2F2ZTsKKyAgICAgICAgICAgIGluY2x1ZGVBY3Rpb25TZWVuID0gaW5jbHVkZUFjdGlvblNlZW4gfHwgaW5jbHVkZUFjdGlvblNlZW5TYXZlOworICAgICAgICAgICAgcGFyYW1BY3Rpb25TZWVuID0gcGFyYW1BY3Rpb25TZWVuIHx8IHBhcmFtQWN0aW9uU2VlblNhdmU7CisgICAgICAgICAgICBoYXNTY3JpcHRpbmdWYXJzID0gaGFzU2NyaXB0aW5nVmFycyB8fCBoYXNTY3JpcHRpbmdWYXJzU2F2ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSnNwRWxlbWVudCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChuLmdldE5hbWVBdHRyaWJ1dGUoKS5pc0V4cHJlc3Npb24oKSkKKyAgICAgICAgICAgICAgICBzY3JpcHRpbmdFbGVtZW50U2VlbiA9IHRydWU7CisKKyAgICAgICAgICAgIE5vZGUuSnNwQXR0cmlidXRlW10gYXR0cnMgPSBuLmdldEpzcEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXR0cnNbaV0uaXNFeHByZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0aW5nRWxlbWVudFNlZW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkpzcEJvZHkgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBjaGVja1NlZW4oIG4uZ2V0Q2hpbGRJbmZvKCksIG4gKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuTmFtZWRBdHRyaWJ1dGUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBjaGVja1NlZW4oIG4uZ2V0Q2hpbGRJbmZvKCksIG4gKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuRGVjbGFyYXRpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzY3JpcHRpbmdFbGVtZW50U2VlbiA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkV4cHJlc3Npb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzY3JpcHRpbmdFbGVtZW50U2VlbiA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlNjcmlwdGxldCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHNjcmlwdGluZ0VsZW1lbnRTZWVuID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBhZ2VJbmZvKFBhZ2VJbmZvIHBhZ2VJbmZvKSB7CisgICAgICAgICAgICBwYWdlSW5mby5zZXRTY3JpcHRsZXNzKCEgc2NyaXB0aW5nRWxlbWVudFNlZW4pOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29sbGVjdChDb21waWxlciBjb21waWxlciwgTm9kZS5Ob2RlcyBwYWdlKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgIENvbGxlY3RWaXNpdG9yIGNvbGxlY3RWaXNpdG9yID0gbmV3IENvbGxlY3RWaXNpdG9yKCk7CisgICAgICAgIHBhZ2UudmlzaXQoY29sbGVjdFZpc2l0b3IpOworICAgICAgICBjb2xsZWN0VmlzaXRvci51cGRhdGVQYWdlSW5mbyhjb21waWxlci5nZXRQYWdlSW5mbygpKTsKKworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Db21waWxlci5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Db21waWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYmE4NTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0NvbXBpbGVyLmphdmEKQEAgLTAsMCArMSw1MDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSnNwQ29tcGlsYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLk9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuc2VydmxldC5Kc3BTZXJ2bGV0V3JhcHBlcjsKKworLyoqCisgKiBNYWluIEpTUCBjb21waWxlciBjbGFzcy4gVGhpcyBjbGFzcyB1c2VzIEFudCBmb3IgY29tcGlsaW5nLgorICoKKyAqIEBhdXRob3IgQW5pbCBLLiBWaWplbmRyYW4KKyAqIEBhdXRob3IgTWFuZGFyIFJhamUKKyAqIEBhdXRob3IgUGllcnJlIERlbGlzbGUKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQGF1dGhvciBNYXJrIFJvdGgKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBpbGVyIHsKKyAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIENvbXBpbGVyLmNsYXNzICk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMKKworCisgICAgLy8gU29tZSBqYXZhYyBhcmUgbm90IHRocmVhZCBzYWZlOyB1c2UgYSBsb2NrIHRvIHNlcmlhbGl6ZSBjb21waWxhdGlvbiwgCisgICAgc3RhdGljIE9iamVjdCBqYXZhY0xvY2sgPSBuZXcgT2JqZWN0KCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICBwcm90ZWN0ZWQgSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQ7CisKKyAgICBwcm90ZWN0ZWQgRXJyb3JEaXNwYXRjaGVyIGVyckRpc3BhdGNoZXI7CisgICAgcHJvdGVjdGVkIFBhZ2VJbmZvIHBhZ2VJbmZvOworICAgIHByb3RlY3RlZCBKc3BTZXJ2bGV0V3JhcHBlciBqc3c7CisgICAgcHJvdGVjdGVkIFRhZ0ZpbGVQcm9jZXNzb3IgdGZwOworCisgICAgcHJvdGVjdGVkIE9wdGlvbnMgb3B0aW9uczsKKworICAgIHByb3RlY3RlZCBOb2RlLk5vZGVzIHBhZ2VOb2RlczsKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworICAgIHB1YmxpYyB2b2lkIGluaXQoSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQsIEpzcFNlcnZsZXRXcmFwcGVyIGpzdykgeworICAgICAgICB0aGlzLmpzdyA9IGpzdzsKKyAgICAgICAgdGhpcy5jdHh0ID0gY3R4dDsKKyAgICAgICAgdGhpcy5vcHRpb25zID0gY3R4dC5nZXRPcHRpb25zKCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiA8cD5SZXRyaWV2ZXMgdGhlIHBhcnNlZCBub2RlcyBvZiB0aGUgSlNQIHBhZ2UsIGlmIHRoZXkgYXJlIGF2YWlsYWJsZS4KKyAgICAgKiBNYXkgcmV0dXJuIG51bGwuICBVc2VkIGluIGRldmVsb3BtZW50IG1vZGUgZm9yIGdlbmVyYXRpbmcgZGV0YWlsZWQKKyAgICAgKiBlcnJvciBtZXNzYWdlcy4gIGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzcwNjIuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBOb2RlLk5vZGVzIGdldFBhZ2VOb2RlcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGFnZU5vZGVzOworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBDb21waWxlIHRoZSBqc3AgZmlsZSBpbnRvIGVxdWl2YWxlbnQgc2VydmxldCBpbiAuamF2YSBmaWxlCisgICAgICogQHJldHVybiBhIHNtYXAgZm9yIHRoZSBjdXJyZW50IEpTUCBwYWdlLCBpZiBvbmUgaXMgZ2VuZXJhdGVkLAorICAgICAqICAgICAgICAgbnVsbCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2VuZXJhdGVKYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nW10gc21hcFN0ciA9IG51bGw7CisKKyAgICAgICAgbG9uZyB0MSwgdDIsIHQzLCB0NDsKKworICAgICAgICB0MSA9IHQyID0gdDMgPSB0NCA9IDA7CisgICAgICAKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICB0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0dXAgcGFnZSBpbmZvIGFyZWEKKyAgICAgICAgcGFnZUluZm8gPSBuZXcgUGFnZUluZm8obmV3IEJlYW5SZXBvc2l0b3J5KGN0eHQuZ2V0Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyckRpc3BhdGNoZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC5nZXRKc3BGaWxlKCkpOworCisgICAgICAgIEpzcENvbmZpZyBqc3BDb25maWcgPSBvcHRpb25zLmdldEpzcENvbmZpZygpOworICAgICAgICBKc3BDb25maWcuSnNwUHJvcGVydHkganNwUHJvcGVydHkgPQorICAgICAgICAgICAganNwQ29uZmlnLmZpbmRKc3BQcm9wZXJ0eShjdHh0LmdldEpzcEZpbGUoKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIGN1cnJlbnQgdXJpIGlzIG1hdGNoZWQgYnkgYSBwYXR0ZXJuIHNwZWNpZmllZCBpbgorICAgICAgICAgKiBhIGpzcC1wcm9wZXJ0eS1ncm91cCBpbiB3ZWIueG1sLCBpbml0aWFsaXplIHBhZ2VJbmZvIHdpdGgKKyAgICAgICAgICogdGhvc2UgcHJvcGVydGllcy4KKyAgICAgICAgICovCisgICAgICAgIHBhZ2VJbmZvLnNldEVMSWdub3JlZChKc3BVdGlsLmJvb2xlYW5WYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNwUHJvcGVydHkuaXNFTElnbm9yZWQoKSkpOworICAgICAgICBwYWdlSW5mby5zZXRTY3JpcHRpbmdJbnZhbGlkKEpzcFV0aWwuYm9vbGVhblZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3BQcm9wZXJ0eS5pc1NjcmlwdGluZ0ludmFsaWQoKSkpOworICAgICAgICBpZiAoanNwUHJvcGVydHkuZ2V0SW5jbHVkZVByZWx1ZGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBwYWdlSW5mby5zZXRJbmNsdWRlUHJlbHVkZShqc3BQcm9wZXJ0eS5nZXRJbmNsdWRlUHJlbHVkZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoanNwUHJvcGVydHkuZ2V0SW5jbHVkZUNvZGEoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBwYWdlSW5mby5zZXRJbmNsdWRlQ29kYShqc3BQcm9wZXJ0eS5nZXRJbmNsdWRlQ29kYSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBqYXZhRmlsZU5hbWUgPSBjdHh0LmdldFNlcnZsZXRKYXZhRmlsZU5hbWUoKTsKKyAgICAgICAgU2VydmxldFdyaXRlciB3cml0ZXIgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBTZXR1cCB0aGUgU2VydmxldFdyaXRlcgorICAgICAgICAgICAgU3RyaW5nIGphdmFFbmNvZGluZyA9IGN0eHQuZ2V0T3B0aW9ucygpLmdldEphdmFFbmNvZGluZygpOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIG9zdyA9IG51bGw7IAorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0oamF2YUZpbGVOYW1lKSwgamF2YUVuY29kaW5nKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBlcnJEaXNwYXRjaGVyLmpzcEVycm9yKCJqc3AuZXJyb3IubmVlZEFsdGVybmF0ZUphdmFFbmNvZGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhRW5jb2RpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgU2VydmxldFdyaXRlcihuZXcgUHJpbnRXcml0ZXIob3N3KSk7CisgICAgICAgICAgICBjdHh0LnNldFdyaXRlcih3cml0ZXIpOworCisgICAgICAgICAgICAvLyBSZXNldCB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlIGNvdW50ZXIgZm9yIHRoZSBnZW5lcmF0b3IuCisgICAgICAgICAgICBKc3BVdGlsLnJlc2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisKKyAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBmaWxlCisgICAgICAgICAgICBQYXJzZXJDb250cm9sbGVyIHBhcnNlckN0bCA9IG5ldyBQYXJzZXJDb250cm9sbGVyKGN0eHQsIHRoaXMpOworICAgICAgICAgICAgcGFnZU5vZGVzID0gcGFyc2VyQ3RsLnBhcnNlKGN0eHQuZ2V0SnNwRmlsZSgpKTsKKworICAgICAgICAgICAgaWYgKGN0eHQuaXNQcm90b3R5cGVNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZSBwcm90b3R5cGUgLmphdmEgZmlsZSBmb3IgdGhlIHRhZyBmaWxlCisgICAgICAgICAgICAgICAgR2VuZXJhdG9yLmdlbmVyYXRlKHdyaXRlciwgdGhpcywgcGFnZU5vZGVzKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgcHJvY2VzcyBhdHRyaWJ1dGVzCisgICAgICAgICAgICBWYWxpZGF0b3IudmFsaWRhdGUodGhpcywgcGFnZU5vZGVzKTsKKworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgdDIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ29sbGVjdCBwYWdlIGluZm8KKyAgICAgICAgICAgIENvbGxlY3Rvci5jb2xsZWN0KHRoaXMsIHBhZ2VOb2Rlcyk7CisKKyAgICAgICAgICAgIC8vIENvbXBpbGUgKGlmIG5lY2Vzc2FyeSkgYW5kIGxvYWQgdGhlIHRhZyBmaWxlcyByZWZlcmVuY2VkIGluCisgICAgICAgICAgICAvLyB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCisgICAgICAgICAgICB0ZnAgPSBuZXcgVGFnRmlsZVByb2Nlc3NvcigpOworICAgICAgICAgICAgdGZwLmxvYWRUYWdGaWxlcyh0aGlzLCBwYWdlTm9kZXMpOworCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0MyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIERldGVybWluZSB3aGljaCBjdXN0b20gdGFnIG5lZWRzIHRvIGRlY2xhcmUgd2hpY2ggc2NyaXB0aW5nIHZhcnMKKyAgICAgICAgICAgIFNjcmlwdGluZ1ZhcmlhYmxlci5zZXQocGFnZU5vZGVzLCBlcnJEaXNwYXRjaGVyKTsKKworICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9ucyBieSBUYWcgUGx1Z2lucworICAgICAgICAgICAgVGFnUGx1Z2luTWFuYWdlciB0YWdQbHVnaW5NYW5hZ2VyID0gb3B0aW9ucy5nZXRUYWdQbHVnaW5NYW5hZ2VyKCk7CisgICAgICAgICAgICB0YWdQbHVnaW5NYW5hZ2VyLmFwcGx5KHBhZ2VOb2RlcywgZXJyRGlzcGF0Y2hlciwgcGFnZUluZm8pOworCisgICAgICAgICAgICAvLyBPcHRpbWl6YXRpb246IGNvbmNhdGVuYXRlIGNvbnRpZ3VvdXMgdGVtcGxhdGUgdGV4dHMuCisgICAgICAgICAgICBUZXh0T3B0aW1pemVyLmNvbmNhdGVuYXRlKHRoaXMsIHBhZ2VOb2Rlcyk7CisKKyAgICAgICAgICAgIC8vIEdlbmVyYXRlIHN0YXRpYyBmdW5jdGlvbiBtYXBwZXIgY29kZXMuCisgICAgICAgICAgICBFTEZ1bmN0aW9uTWFwcGVyLm1hcCh0aGlzLCBwYWdlTm9kZXMpOworCisgICAgICAgICAgICAvLyBnZW5lcmF0ZSBzZXJ2bGV0IC5qYXZhIGZpbGUKKyAgICAgICAgICAgIEdlbmVyYXRvci5nZW5lcmF0ZSh3cml0ZXIsIHRoaXMsIHBhZ2VOb2Rlcyk7CisgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIHdyaXRlciA9IG51bGw7CisKKyAgICAgICAgICAgIC8vIFRoZSB3cml0ZXIgaXMgb25seSB1c2VkIGR1cmluZyB0aGUgY29tcGlsZSwgZGVyZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIGl0IGluIHRoZSBKc3BDb21waWxhdGlvbkNvbnRleHQgd2hlbiBkb25lIHRvIGFsbG93IGl0CisgICAgICAgICAgICAvLyB0byBiZSBHQydkIGFuZCBzYXZlIG1lbW9yeS4KKyAgICAgICAgICAgIGN0eHQuc2V0V3JpdGVyKG51bGwpOworCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0NCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiR2VuZXJhdGVkICIrIGphdmFGaWxlTmFtZSArICIgdG90YWw9IgorICAgICAgICAgICAgICAgICAgICAgICAgICArICh0NC10MSkgKyAiIGdlbmVyYXRlPSIgKyAodDQtdDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB2YWxpZGF0ZT0iICsgKHQyLXQxKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBnZW5lcmF0ZWQgLmphdmEgZmlsZQorICAgICAgICAgICAgbmV3IEZpbGUoamF2YUZpbGVOYW1lKS5kZWxldGUoKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSlNSNDUgU3VwcG9ydAorICAgICAgICBpZiAoISBvcHRpb25zLmlzU21hcFN1cHByZXNzZWQoKSkgeworICAgICAgICAgICAgc21hcFN0ciA9IFNtYXBVdGlsLmdlbmVyYXRlU21hcChjdHh0LCBwYWdlTm9kZXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgYW55IHByb3RvIHR5cGUgLmphdmEgYW5kIC5jbGFzcyBmaWxlcyB3YXMgZ2VuZXJhdGVkLAorICAgICAgICAvLyB0aGUgcHJvdG90eXBlIC5qYXZhIG1heSBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgdGhlIGN1cnJlbnQKKyAgICAgICAgLy8gY29tcGlsYXRpb24gKGlmIHRoZSB0YWcgZmlsZSBpcyBzZWxmIHJlZmVyZW5jaW5nKSwgYnV0IHRoZQorICAgICAgICAvLyAuY2xhc3MgZmlsZSBuZWVkIHRvIGJlIHJlbW92ZWQsIHRvIG1ha2Ugc3VyZSB0aGF0IGphdmFjIHdvdWxkCisgICAgICAgIC8vIGdlbmVyYXRlIC5jbGFzcyBhZ2FpbiBmcm9tIHRoZSBuZXcgLmphdmEgZmlsZSBqdXN0IGdlbmVyYXRlZC4KKyAgICAgICAgdGZwLnJlbW92ZVByb3RvVHlwZUZpbGVzKGN0eHQuZ2V0Q2xhc3NGaWxlTmFtZSgpKTsKKworICAgICAgICByZXR1cm4gc21hcFN0cjsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogQ29tcGlsZSB0aGUgc2VydmxldCBmcm9tIC5qYXZhIGZpbGUgdG8gLmNsYXNzIGZpbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZUNsYXNzKFN0cmluZ1tdIHNtYXApCisgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbiwgRXhjZXB0aW9uOworICAgIAorICAgIAorICAgIC8qKiAKKyAgICAgKiBDb21waWxlIHRoZSBqc3AgZmlsZSBmcm9tIHRoZSBjdXJyZW50IGVuZ2luZSBjb250ZXh0CisgICAgICovCisgICAgcHVibGljIHZvaWQgY29tcGlsZSgpCisgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbiwgRXhjZXB0aW9uCisgICAgeworICAgICAgICBjb21waWxlKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBpbGUgdGhlIGpzcCBmaWxlIGZyb20gdGhlIGN1cnJlbnQgZW5naW5lIGNvbnRleHQuICBBcyBhbiBzaWRlLQorICAgICAqIGVmZmVjdCwgdGFnIGZpbGVzIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgdGhpcyBwYWdlIGFyZSBhbHNvIGNvbXBpbGVkLgorICAgICAqIEBwYXJhbSBjb21waWxlQ2xhc3MgSWYgdHJ1ZSwgZ2VuZXJhdGUgYm90aCAuamF2YSBhbmQgLmNsYXNzIGZpbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIElmIGZhbHNlLCBnZW5lcmF0ZSBvbmx5IC5qYXZhIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb21waWxlKGJvb2xlYW4gY29tcGlsZUNsYXNzKQorICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBKYXNwZXJFeGNlcHRpb24sIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY29tcGlsZShjb21waWxlQ2xhc3MsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21waWxlIHRoZSBqc3AgZmlsZSBmcm9tIHRoZSBjdXJyZW50IGVuZ2luZSBjb250ZXh0LiAgQXMgYW4gc2lkZS0KKyAgICAgKiBlZmZlY3QsIHRhZyBmaWxlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IHRoaXMgcGFnZSBhcmUgYWxzbyBjb21waWxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21waWxlQ2xhc3MgSWYgdHJ1ZSwgZ2VuZXJhdGUgYm90aCAuamF2YSBhbmQgLmNsYXNzIGZpbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIElmIGZhbHNlLCBnZW5lcmF0ZSBvbmx5IC5qYXZhIGZpbGUKKyAgICAgKiBAcGFyYW0ganNwY01vZGUgdHJ1ZSBpZiBpbnZva2VkIGZyb20gSnNwQywgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29tcGlsZShib29sZWFuIGNvbXBpbGVDbGFzcywgYm9vbGVhbiBqc3BjTW9kZSkKKyAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmFzcGVyRXhjZXB0aW9uLCBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChlcnJEaXNwYXRjaGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZXJyRGlzcGF0Y2hlciA9IG5ldyBFcnJvckRpc3BhdGNoZXIoanNwY01vZGUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHNtYXAgPSBnZW5lcmF0ZUphdmEoKTsKKyAgICAgICAgICAgIGlmIChjb21waWxlQ2xhc3MpIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZUNsYXNzKHNtYXApOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHRmcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGZwLnJlbW92ZVByb3RvVHlwZUZpbGVzKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXNlIG9iamVjdCB3aGljaCBhcmUgb25seSB1c2VkIGR1cmluZyB0aGUKKyAgICAgICAgICAgIC8vIGdlbmVyYXRpb24gYW5kIGNvbXBpbGF0aW9uIG9mIHRoZSBKU1AgcGFnZSBnZXQKKyAgICAgICAgICAgIC8vIGRlcmVmZXJlbmNlZCBzbyB0aGF0IHRoZXkgY2FuIGJlIEdDJ2QgYW5kIHJlZHVjZSB0aGUKKyAgICAgICAgICAgIC8vIG1lbW9yeSBmb290cHJpbnQuCisgICAgICAgICAgICB0ZnAgPSBudWxsOworICAgICAgICAgICAgZXJyRGlzcGF0Y2hlciA9IG51bGw7CisgICAgICAgICAgICBwYWdlSW5mbyA9IG51bGw7CisKKyAgICAgICAgICAgIC8vIE9ubHkgZ2V0IHJpZCBvZiB0aGUgcGFnZU5vZGVzIGlmIGluIHByb2R1Y3Rpb24uCisgICAgICAgICAgICAvLyBJbiBkZXZlbG9wbWVudCBtb2RlLCB0aGV5IGFyZSB1c2VkIGZvciBkZXRhaWxlZAorICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZXMuCisgICAgICAgICAgICAvLyBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM3MDYyCisgICAgICAgICAgICBpZighdGhpcy5vcHRpb25zLmdldERldmVsb3BtZW50KCkpIHsKKyAgICAgICAgICAgICAgICBwYWdlTm9kZXMgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY3R4dC5nZXRXcml0ZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3R4dC5nZXRXcml0ZXIoKS5jbG9zZSgpOworICAgICAgICAgICAgICAgIGN0eHQuc2V0V3JpdGVyKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIHByb3RlY3RlZCBtZXRob2QgaW50ZW5kZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSAKKyAgICAgKiBzdWJjbGFzc2VzIG9mIENvbXBpbGVyLiBUaGlzIGlzIHVzZWQgYnkgdGhlIGNvbXBpbGUgbWV0aG9kCisgICAgICogdG8gZG8gYWxsIHRoZSBjb21waWxhdGlvbi4gCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNPdXREYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGlzT3V0RGF0ZWQoIHRydWUgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgaWYgYSBjb21waWxhdGlvbiBpcyBuZWNlc3NhcnkgYnkgY2hlY2tpbmcgdGhlIHRpbWUgc3RhbXAKKyAgICAgKiBvZiB0aGUgSlNQIHBhZ2Ugd2l0aCB0aGF0IG9mIHRoZSBjb3JyZXNwb25kaW5nIC5jbGFzcyBvciAuamF2YSBmaWxlLgorICAgICAqIElmIHRoZSBwYWdlIGhhcyBkZXBlbmRlbmNpZXMsIHRoZSBjaGVjayBpcyBhbHNvIGV4dGVuZGVkIHRvIGl0cworICAgICAqIGRlcGVuZGVhbnRzLCBhbmQgc28gb24uCisgICAgICogVGhpcyBtZXRob2QgY2FuIGJ5IG92ZXJpZGRlbiBieSBhIHN1YmNsYXNzZXMgb2YgQ29tcGlsZXIuCisgICAgICogQHBhcmFtIGNoZWNrQ2xhc3MgSWYgdHJ1ZSwgY2hlY2sgYWdhaW5zdCAuY2xhc3MgZmlsZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICBpZiBmYWxzZSwgY2hlY2sgYWdhaW5zdCAuamF2YSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzT3V0RGF0ZWQoYm9vbGVhbiBjaGVja0NsYXNzKSB7CisKKyAgICAgICAgU3RyaW5nIGpzcCA9IGN0eHQuZ2V0SnNwRmlsZSgpOworCisgICAgICAgIGlmIChqc3cgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIChjdHh0LmdldE9wdGlvbnMoKS5nZXRNb2RpZmljYXRpb25UZXN0SW50ZXJ2YWwoKSA+IDApKSB7CisgCisgICAgICAgICAgICBpZiAoanN3LmdldExhc3RNb2RpZmljYXRpb25UZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgKyAoY3R4dC5nZXRPcHRpb25zKCkuZ2V0TW9kaWZpY2F0aW9uVGVzdEludGVydmFsKCkgKiAxMDAwKSAKKyAgICAgICAgICAgICAgICAgICAgPiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAganN3LnNldExhc3RNb2RpZmljYXRpb25UZXN0KFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbG9uZyBqc3BSZWFsTGFzdE1vZGlmaWVkID0gMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCBqc3BVcmwgPSBjdHh0LmdldFJlc291cmNlKGpzcCk7CisgICAgICAgICAgICBpZiAoanNwVXJsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjdHh0LmluY3JlbWVudFJlbW92ZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVUkxDb25uZWN0aW9uIHVjID0ganNwVXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICBqc3BSZWFsTGFzdE1vZGlmaWVkID0gdWMuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICB1Yy5nZXRJbnB1dFN0cmVhbSgpLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHRhcmdldExhc3RNb2RpZmllZCA9IDA7CisgICAgICAgIEZpbGUgdGFyZ2V0RmlsZTsKKyAgICAgICAgCisgICAgICAgIGlmKCBjaGVja0NsYXNzICkgeworICAgICAgICAgICAgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKGN0eHQuZ2V0Q2xhc3NGaWxlTmFtZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRhcmdldEZpbGUgPSBuZXcgRmlsZShjdHh0LmdldFNlcnZsZXRKYXZhRmlsZU5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghdGFyZ2V0RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB0YXJnZXRMYXN0TW9kaWZpZWQgPSB0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICBpZiAoY2hlY2tDbGFzcyAmJiBqc3cgIT0gbnVsbCkgeworICAgICAgICAgICAganN3LnNldFNlcnZsZXRDbGFzc0xhc3RNb2RpZmllZFRpbWUodGFyZ2V0TGFzdE1vZGlmaWVkKTsKKyAgICAgICAgfSAgIAorICAgICAgICBpZiAodGFyZ2V0TGFzdE1vZGlmaWVkIDwganNwUmVhbExhc3RNb2RpZmllZCkgeworICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29tcGlsZXI6IG91dGRhdGVkOiAiICsgdGFyZ2V0RmlsZSArICIgIiArCisgICAgICAgICAgICAgICAgICAgIHRhcmdldExhc3RNb2RpZmllZCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBkZXRlcm1pbmUgaWYgc291cmNlIGRlcGVuZGVudCBmaWxlcyAoZS5nLiBpbmNsdWRlcyB1c2luZyBpbmNsdWRlCisgICAgICAgIC8vIGRpcmVjdGl2ZXMpIGhhdmUgYmVlbiBjaGFuZ2VkLgorICAgICAgICBpZigganN3PT1udWxsICkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBMaXN0IGRlcGVuZHMgPSBqc3cuZ2V0RGVwZW5kYW50cygpOworICAgICAgICBpZiAoZGVwZW5kcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBJdGVyYXRvciBpdCA9IGRlcGVuZHMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyaW5nIGluY2x1ZGUgPSAoU3RyaW5nKWl0Lm5leHQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVVJMIGluY2x1ZGVVcmwgPSBjdHh0LmdldFJlc291cmNlKGluY2x1ZGUpOworICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlVXJsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBpbmNsdWRlVWNvbm4gPSBpbmNsdWRlVXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgbG9uZyBpbmNsdWRlTGFzdE1vZGlmaWVkID0gaW5jbHVkZVVjb25uLmdldExhc3RNb2RpZmllZCgpOworICAgICAgICAgICAgICAgIGluY2x1ZGVVY29ubi5nZXRJbnB1dFN0cmVhbSgpLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUxhc3RNb2RpZmllZCA+IHRhcmdldExhc3RNb2RpZmllZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBlcnJvciBkaXNwYXRjaGVyLgorICAgICAqLworICAgIHB1YmxpYyBFcnJvckRpc3BhdGNoZXIgZ2V0RXJyb3JEaXNwYXRjaGVyKCkgeworICAgICAgICByZXR1cm4gZXJyRGlzcGF0Y2hlcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGluZm8gYWJvdXQgdGhlIHBhZ2UgdW5kZXIgY29tcGlsYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFnZUluZm8gZ2V0UGFnZUluZm8oKSB7CisgICAgICAgIHJldHVybiBwYWdlSW5mbzsKKyAgICB9CisKKworICAgIHB1YmxpYyBKc3BDb21waWxhdGlvbkNvbnRleHQgZ2V0Q29tcGlsYXRpb25Db250ZXh0KCkgeworICAgICAgICByZXR1cm4gY3R4dDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBnZW5lcmF0ZWQgZmlsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVHZW5lcmF0ZWRGaWxlcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc0ZpbGVOYW1lID0gY3R4dC5nZXRDbGFzc0ZpbGVOYW1lKCk7CisgICAgICAgICAgICBpZiAoY2xhc3NGaWxlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRmlsZSBjbGFzc0ZpbGUgPSBuZXcgRmlsZShjbGFzc0ZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoICJEZWxldGluZyAiICsgY2xhc3NGaWxlICk7CisgICAgICAgICAgICAgICAgY2xhc3NGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gUmVtb3ZlIGFzIG11Y2ggYXMgcG9zc2libGUsIGlnbm9yZSBwb3NzaWJsZSBleGNlcHRpb25zCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBqYXZhRmlsZU5hbWUgPSBjdHh0LmdldFNlcnZsZXRKYXZhRmlsZU5hbWUoKTsKKyAgICAgICAgICAgIGlmIChqYXZhRmlsZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZpbGUgamF2YUZpbGUgPSBuZXcgRmlsZShqYXZhRmlsZU5hbWUpOworICAgICAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyggIkRlbGV0aW5nICIgKyBqYXZhRmlsZSApOworICAgICAgICAgICAgICAgIGphdmFGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gUmVtb3ZlIGFzIG11Y2ggYXMgcG9zc2libGUsIGlnbm9yZSBwb3NzaWJsZSBleGNlcHRpb25zCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVHZW5lcmF0ZWRDbGFzc0ZpbGVzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGNsYXNzRmlsZU5hbWUgPSBjdHh0LmdldENsYXNzRmlsZU5hbWUoKTsKKyAgICAgICAgICAgIGlmIChjbGFzc0ZpbGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGNsYXNzRmlsZSA9IG5ldyBGaWxlKGNsYXNzRmlsZU5hbWUpOworICAgICAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyggIkRlbGV0aW5nICIgKyBjbGFzc0ZpbGUgKTsKKyAgICAgICAgICAgICAgICBjbGFzc0ZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgYXMgbXVjaCBhcyBwb3NzaWJsZSwgaWdub3JlIHBvc3NpYmxlIGV4Y2VwdGlvbnMKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvRGVmYXVsdEVycm9ySGFuZGxlci5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9EZWZhdWx0RXJyb3JIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwMzMwZQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvRGVmYXVsdEVycm9ySGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEVycm9ySGFuZGxlciBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBKYW4gTHVlaGUKKyAqLworY2xhc3MgRGVmYXVsdEVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlciB7CisgICAgCisgICAgLyoKKyAgICAgKiBQcm9jZXNzZXMgdGhlIGdpdmVuIEpTUCBwYXJzZSBlcnJvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbmFtZSBOYW1lIG9mIHRoZSBKU1AgZmlsZSBpbiB3aGljaCB0aGUgcGFyc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gbGluZSBQYXJzZSBlcnJvciBsaW5lIG51bWJlcgorICAgICAqIEBwYXJhbSBjb2x1bW4gUGFyc2UgZXJyb3IgY29sdW1uIG51bWJlcgorICAgICAqIEBwYXJhbSBlcnJNc2cgUGFyc2UgZXJyb3IgbWVzc2FnZQorICAgICAqIEBwYXJhbSBleGNlcHRpb24gUGFyc2UgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQganNwRXJyb3IoU3RyaW5nIGZuYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIGVyck1zZywKKyAgICAgICAgICAgIEV4Y2VwdGlvbiBleCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oZm5hbWUgKyAiKCIgKyBsaW5lICsgIiwiICsgY29sdW1uICsgIikiCisgICAgICAgICAgICAgICAgKyAiICIgKyBlcnJNc2csIGV4KTsKKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBQcm9jZXNzZXMgdGhlIGdpdmVuIEpTUCBwYXJzZSBlcnJvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJNc2cgUGFyc2UgZXJyb3IgbWVzc2FnZQorICAgICAqIEBwYXJhbSBleGNlcHRpb24gUGFyc2UgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQganNwRXJyb3IoU3RyaW5nIGVyck1zZywgRXhjZXB0aW9uIGV4KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihlcnJNc2csIGV4KTsKKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBQcm9jZXNzZXMgdGhlIGdpdmVuIGphdmFjIGNvbXBpbGF0aW9uIGVycm9ycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXRhaWxzIEFycmF5IG9mIEphdmFjRXJyb3JEZXRhaWwgaW5zdGFuY2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICAgICogY29tcGlsYXRpb24gZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHZvaWQgamF2YWNFcnJvcihKYXZhY0Vycm9yRGV0YWlsW10gZGV0YWlscykgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBpZiAoZGV0YWlscyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBudWxsOworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZGV0YWlscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIGlmIChkZXRhaWxzW2ldLmdldEpzcEJlZ2luTGluZU51bWJlcigpID49IDApIHsKKyAgICAgICAgICAgICAgICBhcmdzID0gbmV3IE9iamVjdFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKGRldGFpbHNbaV0uZ2V0SnNwQmVnaW5MaW5lTnVtYmVyKCkpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHNbaV0uZ2V0SnNwRmlsZU5hbWUoKSB9OworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnNpbmdsZS5saW5lLm51bWJlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzKSk7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsgCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChkZXRhaWxzW2ldLmdldEVycm9yTWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJcbiIpOyAKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGRldGFpbHNbaV0uZ2V0SnNwRXh0cmFjdCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCJcblxuU3RhY2t0cmFjZToiKTsKKyAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnVuYWJsZS5jb21waWxlIikgKyAiOiAiICsgYnVmKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHRoZSBnaXZlbiBqYXZhYyBlcnJvciByZXBvcnQgYW5kIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvclJlcG9ydCBDb21waWxhdGlvbiBlcnJvciByZXBvcnQKKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIENvbXBpbGF0aW9uIGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGphdmFjRXJyb3IoU3RyaW5nIGVycm9yUmVwb3J0LCBFeGNlcHRpb24gZXhjZXB0aW9uKQorICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnVuYWJsZS5jb21waWxlIiksIGV4Y2VwdGlvbik7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9EdW1wZXIuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvRHVtcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkyNWY1NQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvRHVtcGVyLmphdmEKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CisKK2NsYXNzIER1bXBlciB7CisKKyAgICBzdGF0aWMgY2xhc3MgRHVtcFZpc2l0b3IgZXh0ZW5kcyBOb2RlLlZpc2l0b3IgeworCXByaXZhdGUgaW50IGluZGVudCA9IDA7CisKKwlwcml2YXRlIFN0cmluZyBnZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cnMpIHsKKwkgICAgaWYgKGF0dHJzID09IG51bGwpCisJCXJldHVybiAiIjsKKworCSAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCSAgICBmb3IgKGludCBpPTA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7CisJCWJ1Zi5hcHBlbmQoIiAiICsgYXR0cnMuZ2V0UU5hbWUoaSkgKyAiPVwiIgorCQkJICAgKyBhdHRycy5nZXRWYWx1ZShpKSArICJcIiIpOworCSAgICB9CisJICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcHJpbnRTdHJpbmcoU3RyaW5nIHN0cikgeworCSAgICBwcmludEluZGVudCgpOworCSAgICBTeXN0ZW0ub3V0LnByaW50KHN0cik7CisJfQorCisJcHJpdmF0ZSB2b2lkIHByaW50U3RyaW5nKFN0cmluZyBwcmVmaXgsIGNoYXJbXSBjaGFycywgU3RyaW5nIHN1ZmZpeCkgeworCSAgICBTdHJpbmcgc3RyID0gbnVsbDsKKwkgICAgaWYgKGNoYXJzICE9IG51bGwpIHsKKwkJc3RyID0gbmV3IFN0cmluZyhjaGFycyk7CisJICAgIH0KKwkgICAgcHJpbnRTdHJpbmcocHJlZml4LCBzdHIsIHN1ZmZpeCk7CisJfQorCSAgICAgCisJcHJpdmF0ZSB2b2lkIHByaW50U3RyaW5nKFN0cmluZyBwcmVmaXgsIFN0cmluZyBzdHIsIFN0cmluZyBzdWZmaXgpIHsKKwkgICAgcHJpbnRJbmRlbnQoKTsKKwkgICAgaWYgKHN0ciAhPSBudWxsKSB7CisJCVN5c3RlbS5vdXQucHJpbnQocHJlZml4ICsgc3RyICsgc3VmZml4KTsKKwkgICAgfSBlbHNlIHsKKwkJU3lzdGVtLm91dC5wcmludChwcmVmaXggKyBzdWZmaXgpOworCSAgICB9CisJfQorCisJcHJpdmF0ZSB2b2lkIHByaW50QXR0cmlidXRlcyhTdHJpbmcgcHJlZml4LCBBdHRyaWJ1dGVzIGF0dHJzLAorCQkJCSAgICAgU3RyaW5nIHN1ZmZpeCkgeworCSAgICBwcmludFN0cmluZyhwcmVmaXgsIGdldEF0dHJpYnV0ZXMoYXR0cnMpLCBzdWZmaXgpOworCX0KKworCXByaXZhdGUgdm9pZCBkdW1wQm9keShOb2RlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBOb2RlLk5vZGVzIHBhZ2UgPSBuLmdldEJvZHkoKTsKKwkgICAgaWYgKHBhZ2UgIT0gbnVsbCkgeworLy8JCWluZGVudCsrOworCQlwYWdlLnZpc2l0KHRoaXMpOworLy8JCWluZGVudC0tOworCSAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlBhZ2VEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHByaW50QXR0cmlidXRlcygiPCVAIHBhZ2UiLCBuLmdldEF0dHJpYnV0ZXMoKSwgIiU+Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlRhZ2xpYkRpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgcHJpbnRBdHRyaWJ1dGVzKCI8JUAgdGFnbGliIiwgbi5nZXRBdHRyaWJ1dGVzKCksICIlPiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5JbmNsdWRlRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBwcmludEF0dHJpYnV0ZXMoIjwlQCBpbmNsdWRlIiwgbi5nZXRBdHRyaWJ1dGVzKCksICIlPiIpOworCSAgICBkdW1wQm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuQ29tbWVudCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgcHJpbnRTdHJpbmcoIjwlLS0iLCBuLmdldFRleHQoKSwgIi0tJT4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuRGVjbGFyYXRpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHByaW50U3RyaW5nKCI8JSEiLCBuLmdldFRleHQoKSwgIiU+Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkV4cHJlc3Npb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHByaW50U3RyaW5nKCI8JT0iLCBuLmdldFRleHQoKSwgIiU+Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlNjcmlwdGxldCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgcHJpbnRTdHJpbmcoIjwlIiwgbi5nZXRUZXh0KCksICIlPiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5JbmNsdWRlQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBwcmludEF0dHJpYnV0ZXMoIjxqc3A6aW5jbHVkZSIsIG4uZ2V0QXR0cmlidXRlcygpLCAiPiIpOworCSAgICBkdW1wQm9keShuKTsKKyAgICAgICAgICAgIHByaW50U3RyaW5nKCI8L2pzcDppbmNsdWRlPiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Gb3J3YXJkQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBwcmludEF0dHJpYnV0ZXMoIjxqc3A6Zm9yd2FyZCIsIG4uZ2V0QXR0cmlidXRlcygpLCAiPiIpOworCSAgICBkdW1wQm9keShuKTsKKwkgICAgcHJpbnRTdHJpbmcoIjwvanNwOmZvcndhcmQ+Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkdldFByb3BlcnR5IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBwcmludEF0dHJpYnV0ZXMoIjxqc3A6Z2V0UHJvcGVydHkiLCBuLmdldEF0dHJpYnV0ZXMoKSwgIi8+Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlNldFByb3BlcnR5IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBwcmludEF0dHJpYnV0ZXMoIjxqc3A6c2V0UHJvcGVydHkiLCBuLmdldEF0dHJpYnV0ZXMoKSwgIj4iKTsKKyAgICAgICAgICAgIGR1bXBCb2R5KG4pOworICAgICAgICAgICAgcHJpbnRTdHJpbmcoIjwvanNwOnNldFByb3BlcnR5PiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Vc2VCZWFuIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBwcmludEF0dHJpYnV0ZXMoIjxqc3A6dXNlQmVhbiIsIG4uZ2V0QXR0cmlidXRlcygpLCAiPiIpOworCSAgICBkdW1wQm9keShuKTsKKwkgICAgcHJpbnRTdHJpbmcoIjwvanNwOnVzZUJlYW4+Iik7CisgICAgICAgIH0KKwkKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5QbHVnSW4gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHByaW50QXR0cmlidXRlcygiPGpzcDpwbHVnaW4iLCBuLmdldEF0dHJpYnV0ZXMoKSwgIj4iKTsKKwkgICAgZHVtcEJvZHkobik7CisJICAgIHByaW50U3RyaW5nKCI8L2pzcDpwbHVnaW4+Iik7CisJfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5QYXJhbXNBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHByaW50QXR0cmlidXRlcygiPGpzcDpwYXJhbXMiLCBuLmdldEF0dHJpYnV0ZXMoKSwgIj4iKTsKKwkgICAgZHVtcEJvZHkobik7CisJICAgIHByaW50U3RyaW5nKCI8L2pzcDpwYXJhbXM+Iik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuUGFyYW1BY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHByaW50QXR0cmlidXRlcygiPGpzcDpwYXJhbSIsIG4uZ2V0QXR0cmlidXRlcygpLCAiPiIpOworCSAgICBkdW1wQm9keShuKTsKKwkgICAgcHJpbnRTdHJpbmcoIjwvanNwOnBhcmFtPiIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLk5hbWVkQXR0cmlidXRlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBwcmludEF0dHJpYnV0ZXMoIjxqc3A6YXR0cmlidXRlIiwgbi5nZXRBdHRyaWJ1dGVzKCksICI+Iik7CisJICAgIGR1bXBCb2R5KG4pOworCSAgICBwcmludFN0cmluZygiPC9qc3A6YXR0cmlidXRlPiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Kc3BCb2R5IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBwcmludEF0dHJpYnV0ZXMoIjxqc3A6Ym9keSIsIG4uZ2V0QXR0cmlidXRlcygpLCAiPiIpOworCSAgICBkdW1wQm9keShuKTsKKwkgICAgcHJpbnRTdHJpbmcoIjwvanNwOmJvZHk+Iik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuRUxFeHByZXNzaW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBwcmludFN0cmluZyggIiR7IiArIG5ldyBTdHJpbmcoIG4uZ2V0VGV4dCgpICkgKyAifSIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuQ3VzdG9tVGFnIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBwcmludEF0dHJpYnV0ZXMoIjwiICsgbi5nZXRRTmFtZSgpLCBuLmdldEF0dHJpYnV0ZXMoKSwgIj4iKTsKKwkgICAgZHVtcEJvZHkobik7CisJICAgIHByaW50U3RyaW5nKCI8LyIgKyBuLmdldFFOYW1lKCkgKyAiPiIpOworICAgICAgICB9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlVuaW50ZXJwcmV0ZWRUYWcgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIFN0cmluZyB0YWcgPSBuLmdldFFOYW1lKCk7CisJICAgIHByaW50QXR0cmlidXRlcygiPCIrdGFnLCBuLmdldEF0dHJpYnV0ZXMoKSwgIj4iKTsKKwkgICAgZHVtcEJvZHkobik7CisJICAgIHByaW50U3RyaW5nKCI8LyIgKyB0YWcgKyAiPiIpOworICAgICAgICB9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlRlbXBsYXRlVGV4dCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgcHJpbnRTdHJpbmcobmV3IFN0cmluZyhuLmdldFRleHQoKSkpOworCX0KKworCXByaXZhdGUgdm9pZCBwcmludEluZGVudCgpIHsKKwkgICAgZm9yIChpbnQgaT0wOyBpIDwgaW5kZW50OyBpKyspIHsKKwkJU3lzdGVtLm91dC5wcmludCgiICAiKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcChOb2RlIG4pIHsKKwl0cnkgeworCSAgICBuLmFjY2VwdChuZXcgRHVtcFZpc2l0b3IoKSk7CQorCX0gY2F0Y2ggKEphc3BlckV4Y2VwdGlvbiBlKSB7CisJICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisJfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKE5vZGUuTm9kZXMgcGFnZSkgeworCXRyeSB7CisJICAgIHBhZ2UudmlzaXQobmV3IER1bXBWaXNpdG9yKCkpOworCX0gY2F0Y2ggKEphc3BlckV4Y2VwdGlvbiBlKSB7CisJICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisJfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9FTEZ1bmN0aW9uTWFwcGVyLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0VMRnVuY3Rpb25NYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjJlZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9FTEZ1bmN0aW9uTWFwcGVyLmphdmEKQEAgLTAsMCArMSwyODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkZ1bmN0aW9uSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBjbGFzcyBnZW5lcmF0ZXMgZnVuY3Rpb25zIG1hcHBlcnMgZm9yIHRoZSBFTCBleHByZXNzaW9ucyBpbiB0aGUgcGFnZS4KKyAqIEluc3RlYWQgb2YgYSBnbG9iYWwgbWFwcGVyLCBhIG1hcHBlciBpcyB1c2VkIGZvciBlY2FoIGNhbGwgdG8gRUwKKyAqIGV2YWx1YXRvciwgdGh1cyBhdm9pZGluZyB0aGUgcHJlZml4IG92ZXJsYXBwaW5nIGFuZCByZWRlZmluaXRpb24KKyAqIGlzc3Vlcy4KKyAqCisgKiBAYXV0aG9yIEtpbi1tYW4gQ2h1bmcKKyAqLworCitwdWJsaWMgY2xhc3MgRUxGdW5jdGlvbk1hcHBlciB7CisgICAgc3RhdGljIHByaXZhdGUgaW50IGN1cnJGdW5jID0gMDsKKyAgICBTdHJpbmdCdWZmZXIgZHM7ICAvLyBDb250YWlucyBjb2RlcyB0byBpbml0aWFsaXplIHRoZSBmdW5jdGlvbnMgbWFwcGVycy4KKyAgICBTdHJpbmdCdWZmZXIgc3M7ICAvLyBDb250YWlucyBkZWNsYXJhdGlvbnMgb2YgdGhlIGZ1bmN0aW9ucyBtYXBwZXJzLgorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgZnVuY3Rpb25zIG1hcHBlcnMgZm9yIGFsbCBFTCBleHByZXNzaW9ucyBpbiB0aGUgSlNQIHBhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcGlsZXIgQ3VycmVudCBjb21waWxlciwgbWFpbmx5IGZvciBhY2Nlc3NpbmcgZXJyb3IgZGlzcGF0Y2hlci4KKyAgICAgKiBAcGFyYW0gcGFnZSBUaGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXAoQ29tcGlsZXIgY29tcGlsZXIsIE5vZGUuTm9kZXMgcGFnZSkgCisJCXRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJY3VyckZ1bmMgPSAwOworCUVMRnVuY3Rpb25NYXBwZXIgbWFwID0gbmV3IEVMRnVuY3Rpb25NYXBwZXIoKTsKKwltYXAuZHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJbWFwLnNzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisJcGFnZS52aXNpdChtYXAubmV3IEVMRnVuY3Rpb25WaXNpdG9yKCkpOworCisJLy8gQXBwZW5kIHRoZSBkZWNsYXJhdGlvbnMgdG8gdGhlIHJvb3Qgbm9kZQorCVN0cmluZyBkcyA9IG1hcC5kcy50b1N0cmluZygpOworCWlmIChkcy5sZW5ndGgoKSA+IDApIHsKKwkgICAgTm9kZSByb290ID0gcGFnZS5nZXRSb290KCk7CisJICAgIG5ldyBOb2RlLkRlY2xhcmF0aW9uKG1hcC5zcy50b1N0cmluZygpLCBudWxsLCByb290KTsKKwkgICAgbmV3IE5vZGUuRGVjbGFyYXRpb24oInN0YXRpYyB7XG4iICsgZHMgKyAifVxuIiwgbnVsbCwgcm9vdCk7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdmlzaXRvciBmb3IgdGhlIHBhZ2UuICBUaGUgcGxhY2VzIHdoZXJlIEVMIGlzIGFsbG93ZWQgYXJlIHNjYW5uZWQKKyAgICAgKiBmb3IgZnVuY3Rpb25zLCBhbmQgaWYgZm91bmQgZnVuY3Rpb25zIG1hcHBlcnMgYXJlIGNyZWF0ZWQuCisgICAgICovCisgICAgY2xhc3MgRUxGdW5jdGlvblZpc2l0b3IgZXh0ZW5kcyBOb2RlLlZpc2l0b3IgeworCQorCS8qKgorCSAqIFVzZSBhIGdsb2JhbCBuYW1lIG1hcCB0byBmYWNpbGl0YXRlIHJldXNlIG9mIGZ1bmN0aW9uIG1hcHMuCisJICogVGhlIGtleSB1c2VkIGlzIHByZWZpeDpmdW5jdGlvbjp1cmkuCisJICovCisJcHJpdmF0ZSBIYXNoTWFwIGdNYXAgPSBuZXcgSGFzaE1hcCgpOworCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5QYXJhbUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgZG9NYXAobi5nZXRWYWx1ZSgpKTsKKwkgICAgdmlzaXRCb2R5KG4pOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSW5jbHVkZUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgZG9NYXAobi5nZXRQYWdlKCkpOworCSAgICB2aXNpdEJvZHkobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Gb3J3YXJkQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBkb01hcChuLmdldFBhZ2UoKSk7CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5TZXRQcm9wZXJ0eSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgZG9NYXAobi5nZXRWYWx1ZSgpKTsKKwkgICAgdmlzaXRCb2R5KG4pOworCX0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlVzZUJlYW4gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvTWFwKG4uZ2V0QmVhbk5hbWUoKSk7CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5QbHVnSW4gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvTWFwKG4uZ2V0SGVpZ2h0KCkpOworCSAgICBkb01hcChuLmdldFdpZHRoKCkpOworCSAgICB2aXNpdEJvZHkobik7CisJfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSnNwRWxlbWVudCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworCSAgICBOb2RlLkpzcEF0dHJpYnV0ZVtdIGF0dHJzID0gbi5nZXRKc3BBdHRyaWJ1dGVzKCk7CisJICAgIGZvciAoaW50IGkgPSAwOyBhdHRycyAhPSBudWxsICYmIGkgPCBhdHRycy5sZW5ndGg7IGkrKykgeworCQlkb01hcChhdHRyc1tpXSk7CisJICAgIH0KKwkgICAgZG9NYXAobi5nZXROYW1lQXR0cmlidXRlKCkpOworCSAgICB2aXNpdEJvZHkobik7CisJfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVW5pbnRlcnByZXRlZFRhZyBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworCSAgICBOb2RlLkpzcEF0dHJpYnV0ZVtdIGF0dHJzID0gbi5nZXRKc3BBdHRyaWJ1dGVzKCk7CisJICAgIGZvciAoaW50IGkgPSAwOyBhdHRycyAhPSBudWxsICYmIGkgPCBhdHRycy5sZW5ndGg7IGkrKykgeworCQlkb01hcChhdHRyc1tpXSk7CisJICAgIH0KKwkgICAgdmlzaXRCb2R5KG4pOworCX0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkN1c3RvbVRhZyBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgTm9kZS5Kc3BBdHRyaWJ1dGVbXSBhdHRycyA9IG4uZ2V0SnNwQXR0cmlidXRlcygpOworCSAgICBmb3IgKGludCBpID0gMDsgYXR0cnMgIT0gbnVsbCAmJiBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsKKwkJZG9NYXAoYXR0cnNbaV0pOworCSAgICB9CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5FTEV4cHJlc3Npb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvTWFwKG4uZ2V0RUwoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRvTWFwKE5vZGUuSnNwQXR0cmlidXRlIGF0dHIpIAorCQl0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgaWYgKGF0dHIgIT0gbnVsbCkgeworCQlkb01hcChhdHRyLmdldEVMKCkpOworCSAgICB9CisJfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGZ1bmN0aW9uIG1hcHBlcnMsIGlmIG5lZWRlZCwgZnJvbSBFTE5vZGVzCisgICAgICAgICAqLworCXByaXZhdGUgdm9pZCBkb01hcChFTE5vZGUuTm9kZXMgZWwpIAorCQl0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgLy8gT25seSBjYXJlIGFib3V0IGZ1bmN0aW9ucyBpbiBFTE5vZGUncworCSAgICBjbGFzcyBGdmlzaXRvciBleHRlbmRzIEVMTm9kZS5WaXNpdG9yIHsKKwkJQXJyYXlMaXN0IGZ1bmNzID0gbmV3IEFycmF5TGlzdCgpOworCQlIYXNoTWFwIGtleU1hcCA9IG5ldyBIYXNoTWFwKCk7CisJCXB1YmxpYyB2b2lkIHZpc2l0KEVMTm9kZS5GdW5jdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkJICAgIFN0cmluZyBrZXkgPSBuLmdldFByZWZpeCgpICsgIjoiICsgbi5nZXROYW1lKCk7CisJCSAgICBpZiAoISBrZXlNYXAuY29udGFpbnNLZXkoa2V5KSkgeworCQkJa2V5TWFwLnB1dChrZXksIiIpOworCQkJZnVuY3MuYWRkKG4pOworCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgICBpZiAoZWwgPT0gbnVsbCkgeworCQlyZXR1cm47CisJICAgIH0KKworCSAgICAvLyBGaXJzdCBsb2NhdGUgYWxsIHVuaXF1ZSBmdW5jdGlvbnMgaW4gdGhpcyBFTAorCSAgICBGdmlzaXRvciBmdiA9IG5ldyBGdmlzaXRvcigpOworCSAgICBlbC52aXNpdChmdik7CisJICAgIEFycmF5TGlzdCBmdW5jdGlvbnMgPSBmdi5mdW5jczsKKworCSAgICBpZiAoZnVuY3Rpb25zLnNpemUoKSA9PSAwKSB7CisJCXJldHVybjsKKwkgICAgfQorCisJICAgIC8vIFJldXNlIGEgcHJldmlvdXMgbWFwIGlmIHBvc3NpYmxlCisJICAgIFN0cmluZyBkZWNOYW1lID0gbWF0Y2hNYXAoZnVuY3Rpb25zKTsKKwkgICAgaWYgKGRlY05hbWUgIT0gbnVsbCkgeworCQllbC5zZXRNYXBOYW1lKGRlY05hbWUpOworCQlyZXR1cm47CisJICAgIH0KKwkKKwkgICAgLy8gR2VuZXJhdGUgZGVjbGFyYXRpb24gZm9yIHRoZSBtYXAgc3RhdGljYWxseQorCSAgICBkZWNOYW1lID0gZ2V0TWFwTmFtZSgpOworCSAgICBzcy5hcHBlbmQoInN0YXRpYyBwcml2YXRlIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuUHJvdGVjdGVkRnVuY3Rpb25NYXBwZXIgIiArIGRlY05hbWUgKyAiO1xuIik7CisKKwkgICAgZHMuYXBwZW5kKCIgICIgKyBkZWNOYW1lICsgIj0gIik7CisJICAgIGRzLmFwcGVuZCgib3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Qcm90ZWN0ZWRGdW5jdGlvbk1hcHBlciIpOworCisJICAgIC8vIFNwZWNpYWwgY2FzZSBpZiB0aGVyZSBpcyBvbmx5IG9uZSBmdW5jdGlvbiBpbiB0aGUgbWFwCisJICAgIFN0cmluZyBmdW5jTWV0aG9kID0gbnVsbDsKKwkgICAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPT0gMSkgeworCQlmdW5jTWV0aG9kID0gIi5nZXRNYXBGb3JGdW5jdGlvbiI7CisJICAgIH0gZWxzZSB7CisJCWRzLmFwcGVuZCgiLmdldEluc3RhbmNlKCk7XG4iKTsKKwkJZnVuY01ldGhvZCA9ICIgICIgKyBkZWNOYW1lICsgIi5tYXBGdW5jdGlvbiI7CisJICAgIH0KKworICAgICAgICAgICAgLy8gU2V0dXAgYXJndW1lbnRzIGZvciBlaXRoZXIgZ2V0TWFwRm9yRnVuY3Rpb24gb3IgbWFwRnVuY3Rpb24KKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmdW5jdGlvbnMuc2l6ZSgpOyBpKyspIHsKKwkJRUxOb2RlLkZ1bmN0aW9uIGYgPSAoRUxOb2RlLkZ1bmN0aW9uKWZ1bmN0aW9ucy5nZXQoaSk7CisJCUZ1bmN0aW9uSW5mbyBmdW5jSW5mbyA9IGYuZ2V0RnVuY3Rpb25JbmZvKCk7CisJCVN0cmluZyBrZXkgPSBmLmdldFByZWZpeCgpKyAiOiIgKyBmLmdldE5hbWUoKTsKKwkJZHMuYXBwZW5kKGZ1bmNNZXRob2QgKyAiKFwiIiArIGtleSArICJcIiwgIiArCisJCQlmdW5jSW5mby5nZXRGdW5jdGlvbkNsYXNzKCkgKyAiLmNsYXNzLCAiICsKKwkJCSdcIicgKyBmLmdldE1ldGhvZE5hbWUoKSArICJcIiwgIiArCisJCQkibmV3IENsYXNzW10geyIpOworCQlTdHJpbmcgcGFyYW1zW10gPSBmLmdldFBhcmFtZXRlcnMoKTsKKwkJZm9yIChpbnQgayA9IDA7IGsgPCBwYXJhbXMubGVuZ3RoOyBrKyspIHsKKwkJICAgIGlmIChrICE9IDApIHsKKwkJCWRzLmFwcGVuZCgiLCAiKTsKKwkJICAgIH0KKwkJICAgIGludCBpQXJyYXkgPSBwYXJhbXNba10uaW5kZXhPZignWycpOworCQkgICAgaWYgKGlBcnJheSA8IDApIHsKKwkJCWRzLmFwcGVuZChwYXJhbXNba10gKyAiLmNsYXNzIik7CisJCSAgICB9CisJCSAgICBlbHNlIHsKKwkJCVN0cmluZyBiYXNlVHlwZSA9IHBhcmFtc1trXS5zdWJzdHJpbmcoMCwgaUFycmF5KTsKKwkJCWRzLmFwcGVuZCgiamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkubmV3SW5zdGFuY2UoIik7CisJCQlkcy5hcHBlbmQoYmFzZVR5cGUpOworCQkJZHMuYXBwZW5kKCIuY2xhc3MsIik7CisKKwkJCS8vIENvdW50IHRoZSBudW1iZXIgb2YgYXJyYXkgZGltZW5zaW9uCisJCQlpbnQgYUNvdW50ID0gMDsKKwkJCWZvciAoaW50IGpqID0gaUFycmF5OyBqaiA8IHBhcmFtc1trXS5sZW5ndGgoKTsgamorKyApIHsKKwkJCSAgICBpZiAocGFyYW1zW2tdLmNoYXJBdChqaikgPT0gJ1snKSB7CisJCQkJYUNvdW50Kys7CisJCQkgICAgfQorCQkJfQorCQkJaWYgKGFDb3VudCA9PSAxKSB7CisJCQkgICAgZHMuYXBwZW5kKCIwKS5nZXRDbGFzcygpIik7CisJCQl9IGVsc2UgeworCQkJICAgIGRzLmFwcGVuZCgibmV3IGludFsiICsgYUNvdW50ICsgIl0pLmdldENsYXNzKCkiKTsKKwkJCX0KKwkJICAgIH0KKwkJfQorCQlkcy5hcHBlbmQoIn0pO1xuIik7CisJCS8vIFB1dCB0aGUgY3VycmVudCBuYW1lIGluIHRoZSBnbG9iYWwgZnVuY3Rpb24gbWFwCisJCWdNYXAucHV0KGYuZ2V0UHJlZml4KCkgKyAnOicgKyBmLmdldE5hbWUoKSArICc6JyArIGYuZ2V0VXJpKCksCisJCQkgZGVjTmFtZSk7CisJICAgIH0KKwkgICAgZWwuc2V0TWFwTmFtZShkZWNOYW1lKTsKKwl9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpbmQgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIG1hcHBlciBmb3IgYW4gRUwuICBSZXVzZSBhCisgICAgICAgICAqIHByZXZpb3VzbHkgZ2VuZXJhdGVkIG9uZSBpZiBwb3NzaWJsZS4KKyAgICAgICAgICogQHBhcmFtIGZ1bmN0aW9ucyBBbiBBcnJheUxpc3Qgb2YgRUxOb2RlLkZ1bmN0aW9uIGluc3RhbmNlcyB0aGF0CisgICAgICAgICAqICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyB0aGUgZnVuY3Rpb25zIGluIGFuIEVMCisgICAgICAgICAqIEByZXR1cm4gQSBwcmV2aW91cyBnZW5lcmF0ZWQgZnVuY3Rpb24gbWFwcGVyIG5hbWUgdGhhdCBjYW4gYmUgdXNlZAorICAgICAgICAgKiAgICAgICAgIGJ5IHRoaXMgRUw7IG51bGwgaWYgbm9uZSBmb3VuZC4KKyAgICAgICAgICovCisJcHJpdmF0ZSBTdHJpbmcgbWF0Y2hNYXAoQXJyYXlMaXN0IGZ1bmN0aW9ucykgeworCisJICAgIFN0cmluZyBtYXBOYW1lID0gbnVsbDsKKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmdW5jdGlvbnMuc2l6ZSgpOyBpKyspIHsKKwkJRUxOb2RlLkZ1bmN0aW9uIGYgPSAoRUxOb2RlLkZ1bmN0aW9uKWZ1bmN0aW9ucy5nZXQoaSk7CisJCVN0cmluZyB0ZW1OYW1lID0gKFN0cmluZykgZ01hcC5nZXQoZi5nZXRQcmVmaXgoKSArICc6JyArCisJCQkJCWYuZ2V0TmFtZSgpICsgJzonICsgZi5nZXRVcmkoKSk7CisJCWlmICh0ZW1OYW1lID09IG51bGwpIHsKKwkJICAgIHJldHVybiBudWxsOworCQl9CisJCWlmIChtYXBOYW1lID09IG51bGwpIHsKKwkJICAgIG1hcE5hbWUgPSB0ZW1OYW1lOworCQl9IGVsc2UgaWYgKCF0ZW1OYW1lLmVxdWFscyhtYXBOYW1lKSkgeworCQkgICAgLy8gSWYgbm90IGFsbCBpbiB0aGUgcHJldmlvdXMgbWF0Y2gsIHRoZW4gbm8gbWF0Y2guCisJCSAgICByZXR1cm4gbnVsbDsKKwkJfQorCSAgICB9CisJICAgIHJldHVybiBtYXBOYW1lOworCX0KKworICAgICAgICAvKgorICAgICAgICAgKiBAcmV0dXJuIEFuIHVuaXF1ZSBuYW1lIGZvciBhIGZ1bmN0aW9uIG1hcHBlci4KKyAgICAgICAgICovCisJcHJpdmF0ZSBTdHJpbmcgZ2V0TWFwTmFtZSgpIHsKKwkgICAgcmV0dXJuICJfanNweF9mbm1hcF8iICsgY3VyckZ1bmMrKzsKKwl9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0VMTm9kZS5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9FTE5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzU2OGU4Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9FTE5vZGUuamF2YQpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuRnVuY3Rpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGRlZmluZXMgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gZm9yIGFuIEVMIEV4cHJlc3Npb24KKyAqCisgKiBJdCBjdXJyZW50bHkgb25seSBkZWZpbmVzIGZ1bmN0aW9ucy4gIEl0IGNhbiBiZSBleHBhbmRlZCB0byBkZWZpbmUKKyAqIGFsbCB0aGUgY29tcG9uZW50cyBvZiBhbiBFTCBleHByZXNzaW9uLCBpZiBuZWVkIHRvLgorICoKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICovCisKK2Fic3RyYWN0IGNsYXNzIEVMTm9kZSB7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogQ2hpbGQgY2xhc3NlcworICAgICAqLworCisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGFuIEVMIGV4cHJlc3Npb246IGFueXRoaW5nIGluICR7IGFuZCB9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm9vdCBleHRlbmRzIEVMTm9kZSB7CisKKwlwcml2YXRlIEVMTm9kZS5Ob2RlcyBleHByOworCisJUm9vdChFTE5vZGUuTm9kZXMgZXhwcikgeworCSAgICB0aGlzLmV4cHIgPSBleHByOworCX0KKworCXB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICB2LnZpc2l0KHRoaXMpOworCX0KKworCXB1YmxpYyBFTE5vZGUuTm9kZXMgZ2V0RXhwcmVzc2lvbigpIHsKKwkgICAgcmV0dXJuIGV4cHI7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGV4dCBvdXRzaWRlIG9mIEVMIGV4cHJlc3Npb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXh0IGV4dGVuZHMgRUxOb2RlIHsKKworCXByaXZhdGUgU3RyaW5nIHRleHQ7CisKKwlUZXh0KFN0cmluZyB0ZXh0KSB7CisJICAgIHRoaXMudGV4dCA9IHRleHQ7CisJfQorCisJcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHYudmlzaXQodGhpcyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCSAgICByZXR1cm4gdGV4dDsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhbnl0aGluZyBpbiBFTCBleHByZXNzaW9uLCBvdGhlciB0aGFuIGZ1bmN0aW9ucywgaW5jbHVkaW5nCisgICAgICogZnVuY3Rpb24gYXJndW1lbnRzIGV0YworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRUxUZXh0IGV4dGVuZHMgRUxOb2RlIHsKKworCXByaXZhdGUgU3RyaW5nIHRleHQ7CisKKwlFTFRleHQoU3RyaW5nIHRleHQpIHsKKwkgICAgdGhpcy50ZXh0ID0gdGV4dDsKKwl9CisKKwlwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgdi52aXNpdCh0aGlzKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJICAgIHJldHVybiB0ZXh0OworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgZnVuY3Rpb24KKyAgICAgKiBDdXJyZW50bHkgb25seSBpbmNsdWRlIHRoZSBwcmVmaXggYW5kIGZ1bmN0aW9uIG5hbWUsIGJ1dCBub3QgaXRzCisgICAgICogYXJndW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRnVuY3Rpb24gZXh0ZW5kcyBFTE5vZGUgeworCisJcHJpdmF0ZSBTdHJpbmcgcHJlZml4OworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgdXJpOworCXByaXZhdGUgRnVuY3Rpb25JbmZvIGZ1bmN0aW9uSW5mbzsKKwlwcml2YXRlIFN0cmluZyBtZXRob2ROYW1lOworCXByaXZhdGUgU3RyaW5nW10gcGFyYW1ldGVyczsKKworCUZ1bmN0aW9uKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lKSB7CisJICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworCSAgICB0aGlzLm5hbWUgPSBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICB2LnZpc2l0KHRoaXMpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgeworCSAgICByZXR1cm4gcHJlZml4OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgICAgcmV0dXJuIG5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyB1cmkpIHsKKwkgICAgdGhpcy51cmkgPSB1cmk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVcmkoKSB7CisJICAgIHJldHVybiB1cmk7CisJfQorCisJcHVibGljIHZvaWQgc2V0RnVuY3Rpb25JbmZvKEZ1bmN0aW9uSW5mbyBmKSB7CisJICAgIHRoaXMuZnVuY3Rpb25JbmZvID0gZjsKKwl9CisKKwlwdWJsaWMgRnVuY3Rpb25JbmZvIGdldEZ1bmN0aW9uSW5mbygpIHsKKwkgICAgcmV0dXJuIGZ1bmN0aW9uSW5mbzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNZXRob2ROYW1lKFN0cmluZyBtZXRob2ROYW1lKSB7CisJICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgeworCSAgICByZXR1cm4gbWV0aG9kTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKFN0cmluZ1tdIHBhcmFtZXRlcnMpIHsKKwkgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVycygpIHsKKwkgICAgcmV0dXJuIHBhcmFtZXRlcnM7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIG9yZGVyZWQgbGlzdCBvZiBFTE5vZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb2RlcyB7CisKKwkvKiBOYW1lIHVzZWQgZm9yIGNyZWF0aW5nIGEgbWFwIGZvciB0aGUgZnVuY3Rpb25zIGluIHRoaXMKKwkgICBFTCBleHByZXNzaW9uLCBmb3IgY29tbXVuaWNhdGlvbiB0byBHZW5lcmF0b3IuCisJICovCisJU3RyaW5nIG1hcE5hbWUgPSBudWxsOwkvLyBUaGUgZnVuY3Rpb24gbWFwIGFzc29jaWF0ZWQgdGhpcyBFTAorCXByaXZhdGUgTGlzdCBsaXN0OworCisJcHVibGljIE5vZGVzKCkgeworCSAgICBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZChFTE5vZGUgZW4pIHsKKwkgICAgbGlzdC5hZGQoZW4pOworCX0KKworCS8qKgorCSAqIFZpc2l0IHRoZSBub2RlcyBpbiB0aGUgbGlzdCB3aXRoIHRoZSBzdXBwbGllZCB2aXNpdG9yCisJICogQHBhcmFtIHYgVGhlIHZpc2l0b3IgdXNlZAorCSAqLworCXB1YmxpYyB2b2lkIHZpc2l0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7CisJICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQlFTE5vZGUgbiA9IChFTE5vZGUpIGl0ZXIubmV4dCgpOworCQluLmFjY2VwdCh2KTsKKwkgICAgfQorCX0KKworCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKwkgICAgcmV0dXJuIGxpc3QuaXRlcmF0b3IoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworCSAgICByZXR1cm4gbGlzdC5zaXplKCkgPT0gMDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV4cHJlc3Npb24gY29udGFpbnMgYSAkey4uLn0KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc0VMKCkgeworCSAgICBJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOworCSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJRUxOb2RlIG4gPSAoRUxOb2RlKSBpdGVyLm5leHQoKTsKKwkJaWYgKG4gaW5zdGFuY2VvZiBSb290KSB7CisJCSAgICByZXR1cm4gdHJ1ZTsKKwkJfQorCSAgICB9CisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNYXBOYW1lKFN0cmluZyBuYW1lKSB7CisJICAgIHRoaXMubWFwTmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNYXBOYW1lKCkgeworCSAgICByZXR1cm4gbWFwTmFtZTsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBIHZpc2l0b3IgY2xhc3MgZm9yIHRyYXZlcnNpbmcgRUxOb2RlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmlzaXRvciB7CisKKwlwdWJsaWMgdm9pZCB2aXNpdChSb290IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBuLmdldEV4cHJlc3Npb24oKS52aXNpdCh0aGlzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChGdW5jdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChUZXh0IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KEVMVGV4dCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwl9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0VMUGFyc2VyLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0VMUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM3MmQzNgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvRUxQYXJzZXIuamF2YQpAQCAtMCwwICsxLDM2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgcGFyc2VyIGZvciBFTCBleHByZXNzaW9ucy4KKyAqCisgKiBJdCB0YWtlcyBzdHJpbmdzIG9mIHRoZSBmb3JtIHh4eCR7Li59eXl5JHsuLn16enogZXRjLCBhbmQgdHVybiBpdCBpbnRvCisgKiBhIEVMTm9kZS5Ob2Rlcy4KKyAqCisgKiBDdXJyZW50bHksIGl0IG9ubHkgaGFuZGxlcyB0ZXh0IG91dHNpZGUgJHsuLn0gYW5kIGZ1bmN0aW9ucyBpbiAkeyAuLn0uCisgKgorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKi8KKworcHVibGljIGNsYXNzIEVMUGFyc2VyIHsKKworICAgIHByaXZhdGUgVG9rZW4gY3VyVG9rZW47ICAgICAgICAvLyBjdXJyZW50IHRva2VuCisgICAgcHJpdmF0ZSBFTE5vZGUuTm9kZXMgZXhwcjsKKyAgICBwcml2YXRlIEVMTm9kZS5Ob2RlcyBFTGV4cHI7CisgICAgcHJpdmF0ZSBpbnQgaW5kZXg7ICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgaW5kZXggb2YgdGhlIGV4cHJlc3Npb24KKyAgICBwcml2YXRlIFN0cmluZyBleHByZXNzaW9uOyAgICAgICAgLy8gVGhlIEVMIGV4cHJlc3Npb24KKyAgICBwcml2YXRlIGJvb2xlYW4gZXNjYXBlQlM7ICAgICAgICAvLyBpcyAnXCcgYW4gZXNjYXBlIGNoYXIgaW4gdGV4dCBvdXRzaWRlIEVMPworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHJlc2VydmVkV29yZHNbXSA9IHsKKyAgICAgICAgImFuZCIsICJkaXYiLCAiZW1wdHkiLCAiZXEiLCAiZmFsc2UiLAorICAgICAgICAiZ2UiLCAiZ3QiLCAiaW5zdGFuY2VvZiIsICJsZSIsICJsdCIsICJtb2QiLAorICAgICAgICAibmUiLCAibm90IiwgIm51bGwiLCAib3IiLCAidHJ1ZSJ9OworCisgICAgcHVibGljIEVMUGFyc2VyKFN0cmluZyBleHByZXNzaW9uKSB7CisgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKyAgICAgICAgZXhwciA9IG5ldyBFTE5vZGUuTm9kZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhbiBFTCBleHByZXNzaW9uCisgICAgICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGlucHV0IGV4cHJlc3Npb24gc3RyaW5nIG9mIHRoZSBmb3JtCisgICAgICogICAgICAgICAgICAgICAgICAgQ2hhciogKCckeycgQ2hhciogJ30nKSogQ2hhcioKKyAgICAgKiBAcmV0dXJuIFBhcnNlZCBFTCBleHByZXNzaW9uIGluIEVMTm9kZS5Ob2RlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRUxOb2RlLk5vZGVzIHBhcnNlKFN0cmluZyBleHByZXNzaW9uKSB7CisgICAgICAgIEVMUGFyc2VyIHBhcnNlciA9IG5ldyBFTFBhcnNlcihleHByZXNzaW9uKTsKKyAgICAgICAgd2hpbGUgKHBhcnNlci5oYXNOZXh0Q2hhcigpKSB7CisgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IHBhcnNlci5za2lwVW50aWxFTCgpOworICAgICAgICAgICAgaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgcGFyc2VyLmV4cHIuYWRkKG5ldyBFTE5vZGUuVGV4dCh0ZXh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFTE5vZGUuTm9kZXMgZWxleHByID0gcGFyc2VyLnBhcnNlRUwoKTsKKyAgICAgICAgICAgIGlmICghIGVsZXhwci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBwYXJzZXIuZXhwci5hZGQobmV3IEVMTm9kZS5Sb290KGVsZXhwcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXJzZXIuZXhwcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhbiBFTCBleHByZXNzaW9uIHN0cmluZyAnJHsuLi59JworICAgICAqQHJldHVybiBBbiBFTE5vZGUuTm9kZXMgcmVwcmVzZW50aW5nIHRoZSBFTCBleHByZXNzaW9uCisgICAgICogVE9ETzogQ3VycmVudGx5IG9ubHkgcGFyc2VkIGludG8gZnVuY3Rpb25zIGFuZCB0ZXh0IHN0cmluZ3MuICBUaGlzCisgICAgICogICAgICAgc2hvdWxkIGJlIHJld3JpdHRlbiBmb3IgYSBmdWxsIHBhcnNlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIEVMTm9kZS5Ob2RlcyBwYXJzZUVMKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIEVMZXhwciA9IG5ldyBFTE5vZGUuTm9kZXMoKTsKKyAgICAgICAgd2hpbGUgKGhhc05leHQoKSkgeworICAgICAgICAgICAgY3VyVG9rZW4gPSBuZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGlmIChjdXJUb2tlbiBpbnN0YW5jZW9mIENoYXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VyVG9rZW4udG9DaGFyKCkgPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGN1clRva2VuLnRvQ2hhcigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gT3V0cHV0IHdoYXRldmVyIGlzIGluIGJ1ZmZlcgorICAgICAgICAgICAgICAgIGlmIChidWYubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEVMZXhwci5hZGQobmV3IEVMTm9kZS5FTFRleHQoYnVmLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFwYXJzZUZ1bmN0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRUxleHByLmFkZChuZXcgRUxOb2RlLkVMVGV4dChjdXJUb2tlbi50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChidWYubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBFTGV4cHIuYWRkKG5ldyBFTE5vZGUuRUxUZXh0KGJ1Zi50b1N0cmluZygpKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gRUxleHByOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGZvciBhIGZ1bmN0aW9uCisgICAgICogRnVuY3Rpb25JbnZva2F0aW9uIDo6PSAoaWRlbnRpZmllciAnOicpPyBpZGVudGlmaWVyICcoJworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEV4cHJlc3Npb24gKCxFeHByZXNzaW9uKSopPyAnKScKKyAgICAgKiBOb3RlOiBjdXJyZW50bHkgd2UgZG9uJ3QgcGFyc2UgYXJndW1lbnRzCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlRnVuY3Rpb24oKSB7CisgICAgICAgIGlmICghIChjdXJUb2tlbiBpbnN0YW5jZW9mIElkKSB8fCBpc0VMUmVzZXJ2ZWQoY3VyVG9rZW4udG9TdHJpbmcoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgczEgPSBudWxsOyAgICAgICAgICAgICAgICAgLy8gRnVuY3Rpb24gcHJlZml4CisgICAgICAgIFN0cmluZyBzMiA9IGN1clRva2VuLnRvU3RyaW5nKCk7ICAvLyBGdW5jdGlvbiBuYW1lCisgICAgICAgIGludCBtYXJrID0gZ2V0SW5kZXgoKTsKKyAgICAgICAgaWYgKGhhc05leHQoKSkgeworICAgICAgICAgICAgVG9rZW4gdCA9IG5leHRUb2tlbigpOworICAgICAgICAgICAgaWYgKHQudG9DaGFyKCkgPT0gJzonKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBUb2tlbiB0MiA9IG5leHRUb2tlbigpOworICAgICAgICAgICAgICAgICAgICBpZiAodDIgaW5zdGFuY2VvZiBJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgczEgPSBzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMyID0gdDIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gbmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodC50b0NoYXIoKSA9PSAnKCcpIHsKKyAgICAgICAgICAgICAgICBFTGV4cHIuYWRkKG5ldyBFTE5vZGUuRnVuY3Rpb24oczEsIHMyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0SW5kZXgobWFyayk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGlmIGFuIGlkIGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBFTAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0VMUmVzZXJ2ZWQoU3RyaW5nIGlkKSB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgaW50IGogPSByZXNlcnZlZFdvcmRzLmxlbmd0aDsKKyAgICAgICAgd2hpbGUgKGkgPCBqKSB7CisgICAgICAgICAgICBpbnQgayA9IChpK2opLzI7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gcmVzZXJ2ZWRXb3Jkc1trXS5jb21wYXJlVG8oaWQpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgICAgICAgICAgIGkgPSBrKzE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGogPSBrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTa2lwIHVudGlsIGFuIEVMIGV4cHJlc3Npb24gKCckeycpIGlzIHJlYWNoZWQsIGFsbG93aW5nIGVzY2FwZSBzZXF1ZW5jZXMKKyAgICAgKiAnXFwnIGFuZCAnXCQnLgorICAgICAqIEByZXR1cm4gVGhlIHRleHQgc3RyaW5nIHVwIHRvIHRoZSBFTCBleHByZXNzaW9uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2tpcFVudGlsRUwoKSB7CisgICAgICAgIGNoYXIgcHJldiA9IDA7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHdoaWxlIChoYXNOZXh0Q2hhcigpKSB7CisgICAgICAgICAgICBjaGFyIGNoID0gbmV4dENoYXIoKTsKKyAgICAgICAgICAgIGlmIChwcmV2ID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICBwcmV2ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWVzY2FwZUJTKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9ICdcXCc7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnJCcpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnJCcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBlbHNlIGVycm9yIQorICAgICAgICAgICAgfSBlbHNlIGlmIChwcmV2ID09ICckJykgeworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAneycpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnJCcpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY2gpOworICAgICAgICAgICAgICAgIHByZXYgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXFwnIHx8IGNoID09ICckJykgeworICAgICAgICAgICAgICAgIHByZXYgPSBjaDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXYgIT0gMCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChwcmV2KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgc29tZXRoaW5nIGxlZnQgaW4gRUwgZXhwcmVzc2lvbiBidWZmZXIgb3RoZXIKKyAgICAgKiAgICAgICAgIHRoYW4gd2hpdGUgc3BhY2VzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICBza2lwU3BhY2VzKCk7CisgICAgICAgIHJldHVybiBoYXNOZXh0Q2hhcigpOworICAgIH0KKworICAgIC8qCisgICAgICogQHJldHVybiBUaGUgbmV4dCB0b2tlbiBpbiB0aGUgRUwgZXhwcmVzc2lvbiBidWZmZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBUb2tlbiBuZXh0VG9rZW4oKSB7CisgICAgICAgIHNraXBTcGFjZXMoKTsKKyAgICAgICAgaWYgKGhhc05leHRDaGFyKCkpIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBuZXh0Q2hhcigpOworICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoY2gpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGNoID0gcGVla0NoYXIoKSkgIT0gLTEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGNoKSkgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dENoYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJZChidWYudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaCA9PSAnXCcnIHx8IGNoID09ICciJykgeworICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVF1b3RlZENoYXJzKGNoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRm9yIG5vdy4uLgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhcihjaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQYXJzZSBhIHN0cmluZyBpbiBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcywgYWxsb3dpbmcgZm9yIGVzY2FwZSBzZXF1ZW5jZXMKKyAgICAgKiAnXFwnLCBhbmQgKCdcIicsIG9yICJcJyIpCisgICAgICovCisgICAgcHJpdmF0ZSBUb2tlbiBwYXJzZVF1b3RlZENoYXJzKGNoYXIgcXVvdGUpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZChxdW90ZSk7CisgICAgICAgIHdoaWxlIChoYXNOZXh0Q2hhcigpKSB7CisgICAgICAgICAgICBjaGFyIGNoID0gbmV4dENoYXIoKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgY2ggPSBuZXh0Q2hhcigpOworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnIHx8IGNoID09IHF1b3RlKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBlbHNlIGVycm9yIQorICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBxdW90ZSkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY2gpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFF1b3RlZFN0cmluZyhidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBIGNvbGxlY3Rpb24gb2YgbG93IGxldmVsIHBhcnNlIG1ldGhvZHMgZGVhbGluZyB3aXRoIGNoYXJhY3RlciBpbgorICAgICAqIHRoZSBFTCBleHByZXNzaW9uIGJ1ZmZlci4KKyAgICAgKi8KKworICAgIHByaXZhdGUgdm9pZCBza2lwU3BhY2VzKCkgeworICAgICAgICB3aGlsZSAoaGFzTmV4dENoYXIoKSkgeworICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24uY2hhckF0KGluZGV4KSA+ICcgJykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzTmV4dENoYXIoKSB7CisgICAgICAgIHJldHVybiBpbmRleCA8IGV4cHJlc3Npb24ubGVuZ3RoKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjaGFyIG5leHRDaGFyKCkgeworICAgICAgICBpZiAoaW5kZXggPj0gZXhwcmVzc2lvbi5sZW5ndGgoKSkgeworICAgICAgICAgICAgcmV0dXJuIChjaGFyKS0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiBleHByZXNzaW9uLmNoYXJBdChpbmRleCsrKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNoYXIgcGVla0NoYXIoKSB7CisgICAgICAgIGlmIChpbmRleCA+PSBleHByZXNzaW9uLmxlbmd0aCgpKSB7CisgICAgICAgICAgICByZXR1cm4gKGNoYXIpLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24uY2hhckF0KGluZGV4KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRJbmRleChpbnQgaSkgeworICAgICAgICBpbmRleCA9IGk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXByZXNlbnRzIGEgdG9rZW4gaW4gRUwgZXhwcmVzc2lvbiBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUb2tlbiB7CisKKyAgICAgICAgY2hhciB0b0NoYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlcHJlc2VudHMgYW4gSUQgdG9rZW4gaW4gRUwKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJZCBleHRlbmRzIFRva2VuIHsKKyAgICAgICAgU3RyaW5nIGlkOworCisgICAgICAgIElkKFN0cmluZyBpZCkgeworICAgICAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUmVwcmVzZW50cyBhIGNoYXJhY3RlciB0b2tlbiBpbiBFTAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENoYXIgZXh0ZW5kcyBUb2tlbiB7CisKKyAgICAgICAgcHJpdmF0ZSBjaGFyIGNoOworCisgICAgICAgIENoYXIoY2hhciBjaCkgeworICAgICAgICAgICAgdGhpcy5jaCA9IGNoOworICAgICAgICB9CisKKyAgICAgICAgY2hhciB0b0NoYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gY2g7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIChuZXcgQ2hhcmFjdGVyKGNoKSkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUmVwcmVzZW50cyBhIHF1b3RlZCAoc2luZ2xlIG9yIGRvdWJsZSkgc3RyaW5nIHRva2VuIGluIEVMCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUXVvdGVkU3RyaW5nIGV4dGVuZHMgVG9rZW4geworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgICAgIFF1b3RlZFN0cmluZyhTdHJpbmcgdikgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHY7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0Vycm9yRGlzcGF0Y2hlci5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9FcnJvckRpc3BhdGNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2U1MzNkCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9FcnJvckRpc3BhdGNoZXIuamF2YQpAQCAtMCwwICsxLDYwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSmFzcGVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkpzcENvbXBpbGF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogQ2xhc3MgcmVzcG9uc2libGUgZm9yIGRpc3BhdGNoaW5nIEpTUCBwYXJzZSBhbmQgamF2YWMgY29tcGlsYXRpb24gZXJyb3JzCisgKiB0byB0aGUgY29uZmlndXJlZCBlcnJvciBoYW5kbGVyLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgbG9jYWxpemluZyBhbnkgZXJyb3IgY29kZXMgYmVmb3JlIHRoZXkKKyAqIGFyZSBwYXNzZWQgb24gdG8gdGhlIGNvbmZpZ3VyZWQgZXJyb3IgaGFuZGxlci4KKyAqIAorICogSW4gdGhlIGNhc2Ugb2YgYSBKYXZhIGNvbXBpbGF0aW9uIGVycm9yLCB0aGUgY29tcGlsZXIgZXJyb3IgbWVzc2FnZSBpcworICogcGFyc2VkIGludG8gYW4gYXJyYXkgb2YgSmF2YWNFcnJvckRldGFpbCBpbnN0YW5jZXMsIHdoaWNoIGlzIHBhc3NlZCBvbiB0byAKKyAqIHRoZSBjb25maWd1cmVkIGVycm9yIGhhbmRsZXIuCisgKgorICogQGF1dGhvciBKYW4gTHVlaGUKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICovCitwdWJsaWMgY2xhc3MgRXJyb3JEaXNwYXRjaGVyIHsKKworICAgIC8vIEN1c3RvbSBlcnJvciBoYW5kbGVyCisgICAgcHJpdmF0ZSBFcnJvckhhbmRsZXIgZXJySGFuZGxlcjsKKworICAgIC8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb21waWxhdGlvbiB3YXMgaW5pdGlhdGVkIGJ5IEpzcFNlcnZsZXQgb3IgSnNwQworICAgIHByaXZhdGUgYm9vbGVhbiBqc3BjTW9kZSA9IGZhbHNlOworCisKKyAgICAvKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGpzcGNNb2RlIHRydWUgaWYgY29tcGlsYXRpb24gaGFzIGJlZW4gaW5pdGlhdGVkIGJ5IEpzcEMsIGZhbHNlCisgICAgICogb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIEVycm9yRGlzcGF0Y2hlcihib29sZWFuIGpzcGNNb2RlKSB7CisJLy8gWFhYIGNoZWNrIHdlYi54bWwgZm9yIGN1c3RvbSBlcnJvciBoYW5kbGVyCisJZXJySGFuZGxlciA9IG5ldyBEZWZhdWx0RXJyb3JIYW5kbGVyKCk7CisgICAgICAgIHRoaXMuanNwY01vZGUgPSBqc3BjTW9kZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERpc3BhdGNoZXMgdGhlIGdpdmVuIEpTUCBwYXJzZSBlcnJvciB0byB0aGUgY29uZmlndXJlZCBlcnJvciBoYW5kbGVyLgorICAgICAqCisgICAgICogVGhlIGdpdmVuIGVycm9yIGNvZGUgaXMgbG9jYWxpemVkLiBJZiBpdCBpcyBub3QgZm91bmQgaW4gdGhlCisgICAgICogcmVzb3VyY2UgYnVuZGxlIGZvciBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZXMsIGl0IGlzIHVzZWQgYXMgdGhlIGVycm9yCisgICAgICogbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJDb2RlIEVycm9yIGNvZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqc3BFcnJvcihTdHJpbmcgZXJyQ29kZSkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJZGlzcGF0Y2gobnVsbCwgZXJyQ29kZSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEaXNwYXRjaGVzIHRoZSBnaXZlbiBKU1AgcGFyc2UgZXJyb3IgdG8gdGhlIGNvbmZpZ3VyZWQgZXJyb3IgaGFuZGxlci4KKyAgICAgKgorICAgICAqIFRoZSBnaXZlbiBlcnJvciBjb2RlIGlzIGxvY2FsaXplZC4gSWYgaXQgaXMgbm90IGZvdW5kIGluIHRoZQorICAgICAqIHJlc291cmNlIGJ1bmRsZSBmb3IgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2VzLCBpdCBpcyB1c2VkIGFzIHRoZSBlcnJvcgorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2hlcmUgRXJyb3IgbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlCisgICAgICovCisgICAgcHVibGljIHZvaWQganNwRXJyb3IoTWFyayB3aGVyZSwgU3RyaW5nIGVyckNvZGUpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCWRpc3BhdGNoKHdoZXJlLCBlcnJDb2RlLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERpc3BhdGNoZXMgdGhlIGdpdmVuIEpTUCBwYXJzZSBlcnJvciB0byB0aGUgY29uZmlndXJlZCBlcnJvciBoYW5kbGVyLgorICAgICAqCisgICAgICogVGhlIGdpdmVuIGVycm9yIGNvZGUgaXMgbG9jYWxpemVkLiBJZiBpdCBpcyBub3QgZm91bmQgaW4gdGhlCisgICAgICogcmVzb3VyY2UgYnVuZGxlIGZvciBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZXMsIGl0IGlzIHVzZWQgYXMgdGhlIGVycm9yCisgICAgICogbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuIE5vZGUgdGhhdCBjYXVzZWQgdGhlIGVycm9yCisgICAgICogQHBhcmFtIGVyckNvZGUgRXJyb3IgY29kZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGpzcEVycm9yKE5vZGUgbiwgU3RyaW5nIGVyckNvZGUpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCWRpc3BhdGNoKG4uZ2V0U3RhcnQoKSwgZXJyQ29kZSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEaXNwYXRjaGVzIHRoZSBnaXZlbiBKU1AgcGFyc2UgZXJyb3IgdG8gdGhlIGNvbmZpZ3VyZWQgZXJyb3IgaGFuZGxlci4KKyAgICAgKgorICAgICAqIFRoZSBnaXZlbiBlcnJvciBjb2RlIGlzIGxvY2FsaXplZC4gSWYgaXQgaXMgbm90IGZvdW5kIGluIHRoZQorICAgICAqIHJlc291cmNlIGJ1bmRsZSBmb3IgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2VzLCBpdCBpcyB1c2VkIGFzIHRoZSBlcnJvcgorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlCisgICAgICogQHBhcmFtIGFyZyBBcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGpzcEVycm9yKFN0cmluZyBlcnJDb2RlLCBTdHJpbmcgYXJnKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlkaXNwYXRjaChudWxsLCBlcnJDb2RlLCBuZXcgT2JqZWN0W10ge2FyZ30sIG51bGwpOworICAgIH0KKworICAgIC8qCisgICAgICogRGlzcGF0Y2hlcyB0aGUgZ2l2ZW4gSlNQIHBhcnNlIGVycm9yIHRvIHRoZSBjb25maWd1cmVkIGVycm9yIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBUaGUgZ2l2ZW4gZXJyb3IgY29kZSBpcyBsb2NhbGl6ZWQuIElmIGl0IGlzIG5vdCBmb3VuZCBpbiB0aGUKKyAgICAgKiByZXNvdXJjZSBidW5kbGUgZm9yIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlcywgaXQgaXMgdXNlZCBhcyB0aGUgZXJyb3IKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHdoZXJlIEVycm9yIGxvY2F0aW9uCisgICAgICogQHBhcmFtIGVyckNvZGUgRXJyb3IgY29kZQorICAgICAqIEBwYXJhbSBhcmcgQXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqc3BFcnJvcihNYXJrIHdoZXJlLCBTdHJpbmcgZXJyQ29kZSwgU3RyaW5nIGFyZykKKwkgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCWRpc3BhdGNoKHdoZXJlLCBlcnJDb2RlLCBuZXcgT2JqZWN0W10ge2FyZ30sIG51bGwpOworICAgIH0KKworICAgIC8qCisgICAgICogRGlzcGF0Y2hlcyB0aGUgZ2l2ZW4gSlNQIHBhcnNlIGVycm9yIHRvIHRoZSBjb25maWd1cmVkIGVycm9yIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBUaGUgZ2l2ZW4gZXJyb3IgY29kZSBpcyBsb2NhbGl6ZWQuIElmIGl0IGlzIG5vdCBmb3VuZCBpbiB0aGUKKyAgICAgKiByZXNvdXJjZSBidW5kbGUgZm9yIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlcywgaXQgaXMgdXNlZCBhcyB0aGUgZXJyb3IKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG4gTm9kZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3IKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlCisgICAgICogQHBhcmFtIGFyZyBBcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGpzcEVycm9yKE5vZGUgbiwgU3RyaW5nIGVyckNvZGUsIFN0cmluZyBhcmcpCisJICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlkaXNwYXRjaChuLmdldFN0YXJ0KCksIGVyckNvZGUsIG5ldyBPYmplY3RbXSB7YXJnfSwgbnVsbCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEaXNwYXRjaGVzIHRoZSBnaXZlbiBKU1AgcGFyc2UgZXJyb3IgdG8gdGhlIGNvbmZpZ3VyZWQgZXJyb3IgaGFuZGxlci4KKyAgICAgKgorICAgICAqIFRoZSBnaXZlbiBlcnJvciBjb2RlIGlzIGxvY2FsaXplZC4gSWYgaXQgaXMgbm90IGZvdW5kIGluIHRoZQorICAgICAqIHJlc291cmNlIGJ1bmRsZSBmb3IgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2VzLCBpdCBpcyB1c2VkIGFzIHRoZSBlcnJvcgorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlCisgICAgICogQHBhcmFtIGFyZzEgRmlyc3QgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMiBTZWNvbmQgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqc3BFcnJvcihTdHJpbmcgZXJyQ29kZSwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKQorCSAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJZGlzcGF0Y2gobnVsbCwgZXJyQ29kZSwgbmV3IE9iamVjdFtdIHthcmcxLCBhcmcyfSwgbnVsbCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEaXNwYXRjaGVzIHRoZSBnaXZlbiBKU1AgcGFyc2UgZXJyb3IgdG8gdGhlIGNvbmZpZ3VyZWQgZXJyb3IgaGFuZGxlci4KKyAgICAgKgorICAgICAqIFRoZSBnaXZlbiBlcnJvciBjb2RlIGlzIGxvY2FsaXplZC4gSWYgaXQgaXMgbm90IGZvdW5kIGluIHRoZQorICAgICAqIHJlc291cmNlIGJ1bmRsZSBmb3IgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2VzLCBpdCBpcyB1c2VkIGFzIHRoZSBlcnJvcgorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlCisgICAgICogQHBhcmFtIGFyZzEgRmlyc3QgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMiBTZWNvbmQgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMyBUaGlyZCBhcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGpzcEVycm9yKFN0cmluZyBlcnJDb2RlLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczKQorCSAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJZGlzcGF0Y2gobnVsbCwgZXJyQ29kZSwgbmV3IE9iamVjdFtdIHthcmcxLCBhcmcyLCBhcmczfSwgbnVsbCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEaXNwYXRjaGVzIHRoZSBnaXZlbiBKU1AgcGFyc2UgZXJyb3IgdG8gdGhlIGNvbmZpZ3VyZWQgZXJyb3IgaGFuZGxlci4KKyAgICAgKgorICAgICAqIFRoZSBnaXZlbiBlcnJvciBjb2RlIGlzIGxvY2FsaXplZC4gSWYgaXQgaXMgbm90IGZvdW5kIGluIHRoZQorICAgICAqIHJlc291cmNlIGJ1bmRsZSBmb3IgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2VzLCBpdCBpcyB1c2VkIGFzIHRoZSBlcnJvcgorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2hlcmUgRXJyb3IgbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlCisgICAgICogQHBhcmFtIGFyZzEgRmlyc3QgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMiBTZWNvbmQgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqc3BFcnJvcihNYXJrIHdoZXJlLCBTdHJpbmcgZXJyQ29kZSwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKQorCSAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJZGlzcGF0Y2god2hlcmUsIGVyckNvZGUsIG5ldyBPYmplY3RbXSB7YXJnMSwgYXJnMn0sIG51bGwpOworICAgIH0KKworICAgIC8qCisgICAgICogRGlzcGF0Y2hlcyB0aGUgZ2l2ZW4gSlNQIHBhcnNlIGVycm9yIHRvIHRoZSBjb25maWd1cmVkIGVycm9yIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBUaGUgZ2l2ZW4gZXJyb3IgY29kZSBpcyBsb2NhbGl6ZWQuIElmIGl0IGlzIG5vdCBmb3VuZCBpbiB0aGUKKyAgICAgKiByZXNvdXJjZSBidW5kbGUgZm9yIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlcywgaXQgaXMgdXNlZCBhcyB0aGUgZXJyb3IKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHdoZXJlIEVycm9yIGxvY2F0aW9uCisgICAgICogQHBhcmFtIGVyckNvZGUgRXJyb3IgY29kZQorICAgICAqIEBwYXJhbSBhcmcxIEZpcnN0IGFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIGFyZzIgU2Vjb25kIGFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIGFyZzMgVGhpcmQgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGpzcEVycm9yKE1hcmsgd2hlcmUsIFN0cmluZyBlcnJDb2RlLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFyZzMpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIGRpc3BhdGNoKHdoZXJlLCBlcnJDb2RlLCBuZXcgT2JqZWN0W10ge2FyZzEsIGFyZzIsIGFyZzN9LCBudWxsKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERpc3BhdGNoZXMgdGhlIGdpdmVuIEpTUCBwYXJzZSBlcnJvciB0byB0aGUgY29uZmlndXJlZCBlcnJvciBoYW5kbGVyLgorICAgICAqCisgICAgICogVGhlIGdpdmVuIGVycm9yIGNvZGUgaXMgbG9jYWxpemVkLiBJZiBpdCBpcyBub3QgZm91bmQgaW4gdGhlCisgICAgICogcmVzb3VyY2UgYnVuZGxlIGZvciBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZXMsIGl0IGlzIHVzZWQgYXMgdGhlIGVycm9yCisgICAgICogbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuIE5vZGUgdGhhdCBjYXVzZWQgdGhlIGVycm9yCisgICAgICogQHBhcmFtIGVyckNvZGUgRXJyb3IgY29kZQorICAgICAqIEBwYXJhbSBhcmcxIEZpcnN0IGFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIGFyZzIgU2Vjb25kIGFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBqc3BFcnJvcihOb2RlIG4sIFN0cmluZyBlcnJDb2RlLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIpCisJICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlkaXNwYXRjaChuLmdldFN0YXJ0KCksIGVyckNvZGUsIG5ldyBPYmplY3RbXSB7YXJnMSwgYXJnMn0sIG51bGwpOworICAgIH0KKworICAgIC8qCisgICAgICogRGlzcGF0Y2hlcyB0aGUgZ2l2ZW4gSlNQIHBhcnNlIGVycm9yIHRvIHRoZSBjb25maWd1cmVkIGVycm9yIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBUaGUgZ2l2ZW4gZXJyb3IgY29kZSBpcyBsb2NhbGl6ZWQuIElmIGl0IGlzIG5vdCBmb3VuZCBpbiB0aGUKKyAgICAgKiByZXNvdXJjZSBidW5kbGUgZm9yIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlcywgaXQgaXMgdXNlZCBhcyB0aGUgZXJyb3IKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG4gTm9kZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3IKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlCisgICAgICogQHBhcmFtIGFyZzEgRmlyc3QgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMiBTZWNvbmQgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMyBUaGlyZCBhcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqLworCisgICAgcHVibGljIHZvaWQganNwRXJyb3IoTm9kZSBuLCBTdHJpbmcgZXJyQ29kZSwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmczKQorCSAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJZGlzcGF0Y2gobi5nZXRTdGFydCgpLCBlcnJDb2RlLCBuZXcgT2JqZWN0W10ge2FyZzEsIGFyZzIsIGFyZzN9LCBudWxsKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERpc3BhdGNoZXMgdGhlIGdpdmVuIHBhcnNpbmcgZXhjZXB0aW9uIHRvIHRoZSBjb25maWd1cmVkIGVycm9yIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZSBQYXJzaW5nIGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGpzcEVycm9yKEV4Y2VwdGlvbiBlKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlkaXNwYXRjaChudWxsLCBudWxsLCBudWxsLCBlKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERpc3BhdGNoZXMgdGhlIGdpdmVuIEpTUCBwYXJzZSBlcnJvciB0byB0aGUgY29uZmlndXJlZCBlcnJvciBoYW5kbGVyLgorICAgICAqCisgICAgICogVGhlIGdpdmVuIGVycm9yIGNvZGUgaXMgbG9jYWxpemVkLiBJZiBpdCBpcyBub3QgZm91bmQgaW4gdGhlCisgICAgICogcmVzb3VyY2UgYnVuZGxlIGZvciBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZXMsIGl0IGlzIHVzZWQgYXMgdGhlIGVycm9yCisgICAgICogbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJDb2RlIEVycm9yIGNvZGUKKyAgICAgKiBAcGFyYW0gYXJnIEFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIGUgUGFyc2luZyBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqc3BFcnJvcihTdHJpbmcgZXJyQ29kZSwgU3RyaW5nIGFyZywgRXhjZXB0aW9uIGUpCisJICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlkaXNwYXRjaChudWxsLCBlcnJDb2RlLCBuZXcgT2JqZWN0W10ge2FyZ30sIGUpOworICAgIH0KKworICAgIC8qCisgICAgICogRGlzcGF0Y2hlcyB0aGUgZ2l2ZW4gSlNQIHBhcnNlIGVycm9yIHRvIHRoZSBjb25maWd1cmVkIGVycm9yIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBUaGUgZ2l2ZW4gZXJyb3IgY29kZSBpcyBsb2NhbGl6ZWQuIElmIGl0IGlzIG5vdCBmb3VuZCBpbiB0aGUKKyAgICAgKiByZXNvdXJjZSBidW5kbGUgZm9yIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlcywgaXQgaXMgdXNlZCBhcyB0aGUgZXJyb3IKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG4gTm9kZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3IKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlCisgICAgICogQHBhcmFtIGFyZyBBcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqIEBwYXJhbSBlIFBhcnNpbmcgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQganNwRXJyb3IoTm9kZSBuLCBTdHJpbmcgZXJyQ29kZSwgU3RyaW5nIGFyZywgRXhjZXB0aW9uIGUpCisJICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlkaXNwYXRjaChuLmdldFN0YXJ0KCksIGVyckNvZGUsIG5ldyBPYmplY3RbXSB7YXJnfSwgZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGludG8gYW4gYXJyYXkgb2YgamF2YWMgY29tcGlsYXRpb24gZXJyb3IKKyAgICAgKiBtZXNzYWdlcyAob25lIHBlciBqYXZhYyBjb21waWxhdGlvbiBlcnJvciBsaW5lIG51bWJlcikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyTXNnIEVycm9yIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gZm5hbWUgTmFtZSBvZiBKYXZhIHNvdXJjZSBmaWxlIHdob3NlIGNvbXBpbGF0aW9uIGZhaWxlZAorICAgICAqIEBwYXJhbSBwYWdlIE5vZGUgcmVwcmVzZW50YXRpb24gb2YgSlNQIHBhZ2UgZnJvbSB3aGljaCB0aGUgSmF2YSBzb3VyY2UKKyAgICAgKiBmaWxlIHdhcyBnZW5lcmF0ZWQKKyAgICAgKgorICAgICAqIEByZXR1cm4gQXJyYXkgb2YgamF2YWMgY29tcGlsYXRpb24gZXJyb3JzLCBvciBudWxsIGlmIHRoZSBnaXZlbiBlcnJvcgorICAgICAqIG1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiBhbnkgY29tcGlsYXRpb24gZXJyb3IgbGluZSBudW1iZXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBKYXZhY0Vycm9yRGV0YWlsW10gcGFyc2VKYXZhY0Vycm9ycyhTdHJpbmcgZXJyTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS5Ob2RlcyBwYWdlKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisJcmV0dXJuIHBhcnNlSmF2YWNNZXNzYWdlKGVyck1zZywgZm5hbWUsIHBhZ2UpOworICAgIH0KKworICAgIC8qCisgICAgICogRGlzcGF0Y2hlcyB0aGUgZ2l2ZW4gamF2YWMgY29tcGlsYXRpb24gZXJyb3JzIHRvIHRoZSBjb25maWd1cmVkIGVycm9yCisgICAgICogaGFuZGxlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXZhY0Vycm9ycyBBcnJheSBvZiBqYXZhYyBjb21waWxhdGlvbiBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqYXZhY0Vycm9yKEphdmFjRXJyb3JEZXRhaWxbXSBqYXZhY0Vycm9ycykKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIGVyckhhbmRsZXIuamF2YWNFcnJvcihqYXZhY0Vycm9ycyk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIERpc3BhdGNoZXMgdGhlIGdpdmVuIGNvbXBpbGF0aW9uIGVycm9yIHJlcG9ydCBhbmQgZXhjZXB0aW9uIHRvIHRoZQorICAgICAqIGNvbmZpZ3VyZWQgZXJyb3IgaGFuZGxlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvclJlcG9ydCBDb21waWxhdGlvbiBlcnJvciByZXBvcnQKKyAgICAgKiBAcGFyYW0gZSBDb21waWxhdGlvbiBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqYXZhY0Vycm9yKFN0cmluZyBlcnJvclJlcG9ydCwgRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgZXJySGFuZGxlci5qYXZhY0Vycm9yKGVycm9yUmVwb3J0LCBlKTsKKyAgICB9CisKKworICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLy8gUHJpdmF0ZSB1dGlsaXR5IG1ldGhvZHMKKworICAgIC8qCisgICAgICogRGlzcGF0Y2hlcyB0aGUgZ2l2ZW4gSlNQIHBhcnNlIGVycm9yIHRvIHRoZSBjb25maWd1cmVkIGVycm9yIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBUaGUgZ2l2ZW4gZXJyb3IgY29kZSBpcyBsb2NhbGl6ZWQuIElmIGl0IGlzIG5vdCBmb3VuZCBpbiB0aGUKKyAgICAgKiByZXNvdXJjZSBidW5kbGUgZm9yIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlcywgaXQgaXMgdXNlZCBhcyB0aGUgZXJyb3IKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHdoZXJlIEVycm9yIGxvY2F0aW9uCisgICAgICogQHBhcmFtIGVyckNvZGUgRXJyb3IgY29kZQorICAgICAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqIEBwYXJhbSBlIFBhcnNpbmcgZXhjZXB0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoKE1hcmsgd2hlcmUsIFN0cmluZyBlcnJDb2RlLCBPYmplY3RbXSBhcmdzLAorCQkJICBFeGNlcHRpb24gZSkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJU3RyaW5nIGZpbGUgPSBudWxsOworCVN0cmluZyBlcnJNc2cgPSBudWxsOworCWludCBsaW5lID0gLTE7CisJaW50IGNvbHVtbiA9IC0xOworCWJvb2xlYW4gaGFzTG9jYXRpb24gPSBmYWxzZTsKKworCS8vIExvY2FsaXplCisJaWYgKGVyckNvZGUgIT0gbnVsbCkgeworCSAgICBlcnJNc2cgPSBMb2NhbGl6ZXIuZ2V0TWVzc2FnZShlcnJDb2RlLCBhcmdzKTsKKwl9IGVsc2UgaWYgKGUgIT0gbnVsbCkgeworCSAgICAvLyBnaXZlIGEgaGludCBhYm91dCB3aGF0J3Mgd3JvbmcKKwkgICAgZXJyTXNnID0gZS5nZXRNZXNzYWdlKCk7CisJfQorCisJLy8gR2V0IGVycm9yIGxvY2F0aW9uCisJaWYgKHdoZXJlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChqc3BjTW9kZSkgeworICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZnVsbCBVUkwgb2YgdGhlIHJlc291cmNlIHRoYXQgY2F1c2VkIHRoZSBlcnJvcgorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGUgPSB3aGVyZS5nZXRVUkwoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byB1c2luZyBjb250ZXh0LXJlbGF0aXZlIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgZmlsZSA9IHdoZXJlLmdldEZpbGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgY29udGV4dC1yZWxhdGl2ZSByZXNvdXJjZSBwYXRoLCBzbyBhcyB0byBub3QKKyAgICAgICAgICAgICAgICAvLyBkaXNjbG9zZSBhbnkgbG9jYWwgZmlsZXN5c3RlbSBkZXRhaWxzCisgICAgICAgICAgICAgICAgZmlsZSA9IHdoZXJlLmdldEZpbGUoKTsKKyAgICAgICAgICAgIH0KKwkgICAgbGluZSA9IHdoZXJlLmdldExpbmVOdW1iZXIoKTsKKwkgICAgY29sdW1uID0gd2hlcmUuZ2V0Q29sdW1uTnVtYmVyKCk7CisJICAgIGhhc0xvY2F0aW9uID0gdHJ1ZTsKKwl9CisKKwkvLyBHZXQgbmVzdGVkIGV4Y2VwdGlvbgorCUV4Y2VwdGlvbiBuZXN0ZWRFeCA9IGU7CisJaWYgKChlIGluc3RhbmNlb2YgU0FYRXhjZXB0aW9uKQorCSAgICAgICAgJiYgKCgoU0FYRXhjZXB0aW9uKSBlKS5nZXRFeGNlcHRpb24oKSAhPSBudWxsKSkgeworCSAgICBuZXN0ZWRFeCA9ICgoU0FYRXhjZXB0aW9uKSBlKS5nZXRFeGNlcHRpb24oKTsKKwl9CisKKwlpZiAoaGFzTG9jYXRpb24pIHsKKwkgICAgZXJySGFuZGxlci5qc3BFcnJvcihmaWxlLCBsaW5lLCBjb2x1bW4sIGVyck1zZywgbmVzdGVkRXgpOworCX0gZWxzZSB7CisJICAgIGVyckhhbmRsZXIuanNwRXJyb3IoZXJyTXNnLCBuZXN0ZWRFeCk7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogUGFyc2VzIHRoZSBnaXZlbiBKYXZhIGNvbXBpbGF0aW9uIGVycm9yIG1lc3NhZ2UsIHdoaWNoIG1heSBjb250YWluIG9uZQorICAgICAqIG9yIG1vcmUgY29tcGlsYXRpb24gZXJyb3JzLCBpbnRvIGFuIGFycmF5IG9mIEphdmFjRXJyb3JEZXRhaWwgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogRWFjaCBKYXZhY0Vycm9yRGV0YWlsIGluc3RhbmNlIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZQorICAgICAqIGNvbXBpbGF0aW9uIGVycm9yLgorICAgICAqCisgICAgICogQHBhcmFtIGVyck1zZyBDb21waWxhdGlvbiBlcnJvciBtZXNzYWdlIHRoYXQgd2FzIGdlbmVyYXRlZCBieSB0aGUKKyAgICAgKiBqYXZhYyBjb21waWxlcgorICAgICAqIEBwYXJhbSBmbmFtZSBOYW1lIG9mIEphdmEgc291cmNlIGZpbGUgd2hvc2UgY29tcGlsYXRpb24gZmFpbGVkCisgICAgICogQHBhcmFtIHBhZ2UgTm9kZSByZXByZXNlbnRhdGlvbiBvZiBKU1AgcGFnZSBmcm9tIHdoaWNoIHRoZSBKYXZhIHNvdXJjZQorICAgICAqIGZpbGUgd2FzIGdlbmVyYXRlZAorICAgICAqCisgICAgICogQHJldHVybiBBcnJheSBvZiBKYXZhY0Vycm9yRGV0YWlsIGluc3RhbmNlcyBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgICAqIGNvbXBpbGF0aW9uIGVycm9ycworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEphdmFjRXJyb3JEZXRhaWxbXSBwYXJzZUphdmFjTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVyck1zZywgU3RyaW5nIGZuYW1lLCBOb2RlLk5vZGVzIHBhZ2UpCisJICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgVmVjdG9yIGVyclZlYyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGVyck1zZ0J1ZiA9IG51bGw7CisgICAgICAgIGludCBsaW5lTnVtID0gLTE7CisgICAgICAgIEphdmFjRXJyb3JEZXRhaWwgamF2YWNFcnJvciA9IG51bGw7CisgICAgICAgIAorICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihlcnJNc2cpKTsKKyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIFBhcnNlIGNvbXBpbGF0aW9uIGVycm9ycy4gRWFjaCBjb21waWxhdGlvbiBlcnJvciBjb25zaXN0cyBvZiBhIGZpbGUKKyAgICAgICAgICogcGF0aCBhbmQgZXJyb3IgbGluZSBudW1iZXIsIGZvbGxvd2VkIGJ5IGEgbnVtYmVyIG9mIGxpbmVzIGRlc2NyaWJpbmcKKyAgICAgICAgICogdGhlIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOworICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRXJyb3IgbGluZSBudW1iZXIgaXMgZGVsaW1pdGVkIGJ5IHNldCBvZiBjb2xvbnMuCisgICAgICAgICAgICAgKiBJZ25vcmUgY29sb24gZm9sbG93aW5nIGRyaXZlIGxldHRlciBvbiBXaW5kb3dzIChmcm9tSW5kZXggPSAyKS4KKyAgICAgICAgICAgICAqIFhYWCBIYW5kbGUgZGVwcmVjYXRpb24gd2FybmluZ3MgdGhhdCBkb24ndCBoYXZlIGxpbmUgaW5mbworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgYmVnaW5Db2xvbiA9IGxpbmUuaW5kZXhPZignOicsIDIpOyAKKyAgICAgICAgICAgIGludCBlbmRDb2xvbiA9IGxpbmUuaW5kZXhPZignOicsIGJlZ2luQ29sb24gKyAxKTsKKyAgICAgICAgICAgIGlmICgoYmVnaW5Db2xvbiA+PSAwKSAmJiAoZW5kQ29sb24gPj0gMCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoamF2YWNFcnJvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBwcmV2aW91cyBlcnJvciB0byBlcnJvciB2ZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgZXJyVmVjLmFkZChqYXZhY0Vycm9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmVOdW1TdHIgPSBsaW5lLnN1YnN0cmluZyhiZWdpbkNvbG9uICsgMSwgZW5kQ29sb24pOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmVOdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmVOdW1TdHIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFhYWAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBlcnJNc2dCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgamF2YWNFcnJvciA9IGNyZWF0ZUphdmFjRXJyb3IoZm5hbWUsIHBhZ2UsIGVyck1zZ0J1ZiwgbGluZU51bSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIElnbm9yZSBtZXNzYWdlcyBwcmVjZWRpbmcgZmlyc3QgZXJyb3IKKyAgICAgICAgICAgIGlmIChlcnJNc2dCdWYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVyck1zZ0J1Zi5hcHBlbmQobGluZSk7CisgICAgICAgICAgICAgICAgZXJyTXNnQnVmLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQWRkIGxhc3QgZXJyb3IgdG8gZXJyb3IgdmVjdG9yCisgICAgICAgIGlmIChqYXZhY0Vycm9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIGVyclZlYy5hZGQoamF2YWNFcnJvcik7CisgICAgICAgIH0gCisgICAgICAgIAorICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgCisgICAgICAgIEphdmFjRXJyb3JEZXRhaWxbXSBlcnJEZXRhaWxzID0gbnVsbDsKKyAgICAgICAgaWYgKGVyclZlYy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBlcnJEZXRhaWxzID0gbmV3IEphdmFjRXJyb3JEZXRhaWxbZXJyVmVjLnNpemUoKV07CisgICAgICAgICAgICBlcnJWZWMuY29weUludG8oZXJyRGV0YWlscyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBlcnJEZXRhaWxzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQHBhcmFtIGZuYW1lCisgICAgICogQHBhcmFtIHBhZ2UKKyAgICAgKiBAcGFyYW0gZXJyTXNnQnVmCisgICAgICogQHBhcmFtIGxpbmVOdW0KKyAgICAgKiBAcmV0dXJuIEphdmFjRXJyb3JEZXRhaWwgVGhlIGVycm9yIGRldGFpbHMKKyAgICAgKiBAdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSmF2YWNFcnJvckRldGFpbCBjcmVhdGVKYXZhY0Vycm9yKFN0cmluZyBmbmFtZSwKKyAgICAgICAgICAgIE5vZGUuTm9kZXMgcGFnZSwgCisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZXJyTXNnQnVmLCBpbnQgbGluZU51bSkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjcmVhdGVKYXZhY0Vycm9yKGZuYW1lLCBwYWdlLCBlcnJNc2dCdWYsIGxpbmVOdW0sIG51bGwpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZm5hbWUKKyAgICAgKiBAcGFyYW0gcGFnZQorICAgICAqIEBwYXJhbSBlcnJNc2dCdWYKKyAgICAgKiBAcGFyYW0gbGluZU51bQorICAgICAqIEBwYXJhbSBjdHh0CisgICAgICogQHJldHVybiBKYXZhY0Vycm9yRGV0YWlsIFRoZSBlcnJvciBkZXRhaWxzCisgICAgICogQHRocm93cyBKYXNwZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEphdmFjRXJyb3JEZXRhaWwgY3JlYXRlSmF2YWNFcnJvcihTdHJpbmcgZm5hbWUsCisgICAgICAgICAgICBOb2RlLk5vZGVzIHBhZ2UsIAorICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGVyck1zZ0J1ZiwgaW50IGxpbmVOdW0sIEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0KQorICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBKYXZhY0Vycm9yRGV0YWlsIGphdmFjRXJyb3I7CisgICAgICAgIC8vIEF0dGVtcHQgdG8gbWFwIGphdmFjIGVycm9yIGxpbmUgbnVtYmVyIHRvIGxpbmUgaW4gSlNQIHBhZ2UKKyAgICAgICAgRXJyb3JWaXNpdG9yIGVyclZpc2l0b3IgPSBuZXcgRXJyb3JWaXNpdG9yKGxpbmVOdW0pOworICAgICAgICBwYWdlLnZpc2l0KGVyclZpc2l0b3IpOworICAgICAgICBOb2RlIGVyck5vZGUgPSBlcnJWaXNpdG9yLmdldEpzcFNvdXJjZU5vZGUoKTsKKyAgICAgICAgaWYgKChlcnJOb2RlICE9IG51bGwpICYmIChlcnJOb2RlLmdldFN0YXJ0KCkgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIGphdmFjRXJyb3IgPSBuZXcgSmF2YWNFcnJvckRldGFpbCgKKyAgICAgICAgICAgICAgICAgICAgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgIGxpbmVOdW0sCisgICAgICAgICAgICAgICAgICAgIGVyck5vZGUuZ2V0U3RhcnQoKS5nZXRGaWxlKCksCisgICAgICAgICAgICAgICAgICAgIGVyck5vZGUuZ2V0U3RhcnQoKS5nZXRMaW5lTnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgIGVyck1zZ0J1ZiwKKyAgICAgICAgICAgICAgICAgICAgY3R4dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogamF2YWMgZXJyb3IgbGluZSBudW1iZXIgY2Fubm90IGJlIG1hcHBlZCB0byBKU1AgcGFnZQorICAgICAgICAgICAgICogbGluZSBudW1iZXIuIEZvciBleGFtcGxlLCB0aGlzIGlzIHRoZSBjYXNlIGlmIGEgCisgICAgICAgICAgICAgKiBzY3JpcHRsZXQgaXMgbWlzc2luZyBhIGNsb3NpbmcgYnJhY2UsIHdoaWNoIGNhdXNlcworICAgICAgICAgICAgICogaGF2b2Mgd2l0aCB0aGUgdHJ5LWNhdGNoLWZpbmFsbHkgYmxvY2sgdGhhdCB0aGUgY29kZQorICAgICAgICAgICAgICogZ2VuZXJhdG9yIHBsYWNlcyBhcm91bmQgYWxsIGdlbmVyYXRlZCBjb2RlOiBBcyBhIHJlc3VsdAorICAgICAgICAgICAgICogb2YgdGhpcywgdGhlIGphdmFjIGVycm9yIGxpbmUgbnVtYmVycyB3aWxsIGJlIG91dHNpZGUKKyAgICAgICAgICAgICAqIHRoZSByYW5nZSBvZiBiZWdpbiBhbmQgZW5kIGphdmEgbGluZSBudW1iZXJzIHRoYXQgd2VyZQorICAgICAgICAgICAgICogZ2VuZXJhdGVkIGZvciB0aGUgc2NyaXB0bGV0LCBhbmQgdGhlcmVmb3JlIGNhbm5vdCBiZQorICAgICAgICAgICAgICogbWFwcGVkIHRvIHRoZSBzdGFydCBsaW5lIG51bWJlciBvZiB0aGUgc2NyaXB0bGV0IGluIHRoZQorICAgICAgICAgICAgICogSlNQIHBhZ2UuCisgICAgICAgICAgICAgKiBJbmNsdWRlIGp1c3QgdGhlIGphdmFjIGVycm9yIGluZm8gaW4gdGhlIGVycm9yIGRldGFpbC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgamF2YWNFcnJvciA9IG5ldyBKYXZhY0Vycm9yRGV0YWlsKAorICAgICAgICAgICAgICAgICAgICBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbGluZU51bSwKKyAgICAgICAgICAgICAgICAgICAgZXJyTXNnQnVmKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gamF2YWNFcnJvcjsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVmlzaXRvciByZXNwb25zaWJsZSBmb3IgbWFwcGluZyBhIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc2VydmxldAorICAgICAqIHNvdXJjZSBjb2RlIHRvIHRoZSBjb3JyZXNwb25kaW5nIEpTUCBub2RlLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBFcnJvclZpc2l0b3IgZXh0ZW5kcyBOb2RlLlZpc2l0b3IgeworCisJLy8gSmF2YSBzb3VyY2UgbGluZSBudW1iZXIgdG8gYmUgbWFwcGVkCisJcHJpdmF0ZSBpbnQgbGluZU51bTsKKworCS8qCisJICogSlNQIG5vZGUgd2hvc2UgSmF2YSBzb3VyY2UgY29kZSByYW5nZSBpbiB0aGUgZ2VuZXJhdGVkIHNlcnZsZXQKKwkgKiBjb250YWlucyB0aGUgSmF2YSBzb3VyY2UgbGluZSBudW1iZXIgdG8gYmUgbWFwcGVkCisJICovCisJTm9kZSBmb3VuZDsKKworCS8qCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gbGluZU51bSBTb3VyY2UgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzZXJ2bGV0IGNvZGUKKwkgKi8KKwlwdWJsaWMgRXJyb3JWaXNpdG9yKGludCBsaW5lTnVtKSB7CisJICAgIHRoaXMubGluZU51bSA9IGxpbmVOdW07CisJfQorCisJcHVibGljIHZvaWQgZG9WaXNpdChOb2RlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBpZiAoKGxpbmVOdW0gPj0gbi5nZXRCZWdpbkphdmFMaW5lKCkpCisJCSAgICAmJiAobGluZU51bSA8IG4uZ2V0RW5kSmF2YUxpbmUoKSkpIHsKKwkJZm91bmQgPSBuOworCSAgICB9CisgICAgICAgIH0KKworCS8qCisJICogR2V0cyB0aGUgSlNQIG5vZGUgdG8gd2hpY2ggdGhlIHNvdXJjZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkCisJICogc2VydmxldCBjb2RlIHdhcyBtYXBwZWQuCisJICoKKwkgKiBAcmV0dXJuIEpTUCBub2RlIHRvIHdoaWNoIHRoZSBzb3VyY2UgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZAorCSAqIHNlcnZsZXQgY29kZSB3YXMgbWFwcGVkCisJICovCisJcHVibGljIE5vZGUgZ2V0SnNwU291cmNlTm9kZSgpIHsKKwkgICAgcmV0dXJuIGZvdW5kOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0Vycm9ySGFuZGxlci5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9FcnJvckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTk4ZWRhCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9FcnJvckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGhhbmRsaW5nIEpTUCBwYXJzZSBhbmQgamF2YWMgY29tcGlsYXRpb24gZXJyb3JzLgorICogCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSBtYXkgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZQorICogRXJyb3JEaXNwYXRjaGVyIGJ5IHNldHRpbmcgdGhlIFhYWCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgaW4gdGhlIEpTUAorICogcGFnZSBjb21waWxlciBhbmQgZXhlY3V0aW9uIHNlcnZsZXQgaW4gQ2F0YWxpbmEncyB3ZWIueG1sIGZpbGUgdG8gdGhlCisgKiBpbXBsZW1lbnRhdGlvbidzIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgorICoKKyAqIEBhdXRob3IgSmFuIEx1ZWhlCisgKiBAYXV0aG9yIEtpbi1tYW4gQ2h1bmcKKyAqLworcHVibGljIGludGVyZmFjZSBFcnJvckhhbmRsZXIgeworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHRoZSBnaXZlbiBKU1AgcGFyc2UgZXJyb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm5hbWUgTmFtZSBvZiB0aGUgSlNQIGZpbGUgaW4gd2hpY2ggdGhlIHBhcnNlIGVycm9yIG9jY3VycmVkCisgICAgICogQHBhcmFtIGxpbmUgUGFyc2UgZXJyb3IgbGluZSBudW1iZXIKKyAgICAgKiBAcGFyYW0gY29sdW1uIFBhcnNlIGVycm9yIGNvbHVtbiBudW1iZXIKKyAgICAgKiBAcGFyYW0gbXNnIFBhcnNlIGVycm9yIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIFBhcnNlIGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGpzcEVycm9yKFN0cmluZyBmbmFtZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyBtc2csCisJCQkgRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyB0aGUgZ2l2ZW4gSlNQIHBhcnNlIGVycm9yLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZyBQYXJzZSBlcnJvciBtZXNzYWdlCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBQYXJzZSBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqc3BFcnJvcihTdHJpbmcgbXNnLCBFeGNlcHRpb24gZXhjZXB0aW9uKQorCXRocm93cyBKYXNwZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgdGhlIGdpdmVuIGphdmFjIGNvbXBpbGF0aW9uIGVycm9ycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXRhaWxzIEFycmF5IG9mIEphdmFjRXJyb3JEZXRhaWwgaW5zdGFuY2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICAgICogY29tcGlsYXRpb24gZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHZvaWQgamF2YWNFcnJvcihKYXZhY0Vycm9yRGV0YWlsW10gZGV0YWlscykKKwl0aHJvd3MgSmFzcGVyRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHRoZSBnaXZlbiBqYXZhYyBlcnJvciByZXBvcnQgYW5kIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvclJlcG9ydCBDb21waWxhdGlvbiBlcnJvciByZXBvcnQKKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIENvbXBpbGF0aW9uIGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGphdmFjRXJyb3IoU3RyaW5nIGVycm9yUmVwb3J0LCBFeGNlcHRpb24gZXhjZXB0aW9uKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9HZW5lcmF0b3IuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBkYTQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw0MDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOworaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdBdHRyaWJ1dGVJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdWYXJpYWJsZUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlZhcmlhYmxlSW5mbzsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSnNwQ29tcGlsYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnk7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKKworLyoqCisgKiBHZW5lcmF0ZSBKYXZhIHNvdXJjZSBmcm9tIE5vZGVzCisgKgorICogQGF1dGhvciBBbmlsIEsuIFZpamVuZHJhbgorICogQGF1dGhvciBEYW5ubyBGZXJyaW4KKyAqIEBhdXRob3IgTWFuZGFyIFJhamUKKyAqIEBhdXRob3IgUmFqaXYgTW9yZGFuaQorICogQGF1dGhvciBQaWVycmUgRGVsaXNsZQorICoKKyAqIFRvbWNhdCA0LjEueCBhbmQgVG9tY2F0IDU6CisgKiBAYXV0aG9yIEtpbi1tYW4gQ2h1bmcKKyAqIEBhdXRob3IgSmFuIEx1ZWhlCisgKiBAYXV0aG9yIFNoYXduIEJheWVybgorICogQGF1dGhvciBNYXJrIFJvdGgKKyAqIEBhdXRob3IgRGVuaXMgQmVub2l0CisgKi8KKworY2xhc3MgR2VuZXJhdG9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gT0JKRUNUX0NMQVNTID0geyBPYmplY3QuY2xhc3MgfTsKKyAgICBwcml2YXRlIFNlcnZsZXRXcml0ZXIgb3V0OworICAgIHByaXZhdGUgQXJyYXlMaXN0IG1ldGhvZHNCdWZmZXJlZDsKKyAgICBwcml2YXRlIEZyYWdtZW50SGVscGVyQ2xhc3MgZnJhZ21lbnRIZWxwZXJDbGFzczsKKyAgICBwcml2YXRlIEVycm9yRGlzcGF0Y2hlciBlcnI7CisgICAgcHJpdmF0ZSBCZWFuUmVwb3NpdG9yeSBiZWFuSW5mbzsKKyAgICBwcml2YXRlIEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0OworICAgIHByaXZhdGUgYm9vbGVhbiBpc1Bvb2xpbmdFbmFibGVkOworICAgIHByaXZhdGUgYm9vbGVhbiBicmVha0F0TEY7CisgICAgcHJpdmF0ZSBQYWdlSW5mbyBwYWdlSW5mbzsKKyAgICBwcml2YXRlIFZlY3RvciB0YWdIYW5kbGVyUG9vbE5hbWVzOworICAgIHByaXZhdGUgR2VuQnVmZmVyIGNoYXJBcnJheUJ1ZmZlcjsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBzIHRoZSBpbnB1dCBzdHJpbmcKKyAgICAgKiBAcmV0dXJuIHF1b3RlZCBhbmQgZXNjYXBlZCBzdHJpbmcsIHBlciBKYXZhIHJ1bGUKKyAgICAgKi8KKyAgICBzdGF0aWMgU3RyaW5nIHF1b3RlKFN0cmluZyBzKSB7CisKKyAgICAgICAgaWYgKHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAibnVsbCI7CisKKyAgICAgICAgcmV0dXJuICciJyArIGVzY2FwZShzKSArICciJzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcyB0aGUgaW5wdXQgc3RyaW5nCisgICAgICogQHJldHVybiBlc2NhcGVkIHN0cmluZywgcGVyIEphdmEgcnVsZQorICAgICAqLworICAgIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBzKSB7CisKKyAgICAgICAgaWYgKHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAiIjsKKworICAgICAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGMgPT0gJyInKQorICAgICAgICAgICAgICAgIGIuYXBwZW5kKCdcXCcpLmFwcGVuZCgnIicpOworICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXFwnKQorICAgICAgICAgICAgICAgIGIuYXBwZW5kKCdcXCcpLmFwcGVuZCgnXFwnKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xuJykKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgnXFwnKS5hcHBlbmQoJ24nKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xyJykKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgnXFwnKS5hcHBlbmQoJ3InKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiLmFwcGVuZChjKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbmdsZSBxdW90ZSBhbmQgZXNjYXBlIGEgY2hhcmFjdGVyCisgICAgICovCisgICAgc3RhdGljIFN0cmluZyBxdW90ZShjaGFyIGMpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYi5hcHBlbmQoJ1wnJyk7CisgICAgICAgIGlmIChjID09ICdcJycpCisgICAgICAgICAgICBiLmFwcGVuZCgnXFwnKS5hcHBlbmQoJ1wnJyk7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xcJykKKyAgICAgICAgICAgIGIuYXBwZW5kKCdcXCcpLmFwcGVuZCgnXFwnKTsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnXG4nKQorICAgICAgICAgICAgYi5hcHBlbmQoJ1xcJykuYXBwZW5kKCduJyk7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xyJykKKyAgICAgICAgICAgIGIuYXBwZW5kKCdcXCcpLmFwcGVuZCgncicpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBiLmFwcGVuZChjKTsKKyAgICAgICAgYi5hcHBlbmQoJ1wnJyk7CisgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIGRlY2xhcmF0aW9ucy4gIFRoaXMgaW5jbHVkZXMgImluZm8iIG9mIHRoZSBwYWdlIGRpcmVjdGl2ZSwKKyAgICAgKiBhbmQgc2NyaXB0bGV0IGRlY2xhcmF0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVEZWNsYXJhdGlvbnMoTm9kZS5Ob2RlcyBwYWdlKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBjbGFzcyBEZWNsYXJhdGlvblZpc2l0b3IgZXh0ZW5kcyBOb2RlLlZpc2l0b3IgeworCisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gZ2V0U2VydmxldEluZm9HZW5lcmF0ZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEdlbmVyYXRlcyBnZXRTZXJ2bGV0SW5mbygpIG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZQorICAgICAgICAgICAgICogcGFnZSBkaXJlY3RpdmUncyAnaW5mbycgYXR0cmlidXRlLCBpZiBwcmVzZW50LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoZSBWYWxpZGF0b3IgaGFzIGFscmVhZHkgZW5zdXJlZCB0aGF0IGlmIHRoZSB0cmFuc2xhdGlvbiB1bml0CisgICAgICAgICAgICAgKiBjb250YWlucyBtb3JlIHRoYW4gb25lIHBhZ2UgZGlyZWN0aXZlIHdpdGggYW4gJ2luZm8nIGF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAqIHRoZWlyIHZhbHVlcyBtYXRjaC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5QYWdlRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICAgICAgaWYgKGdldFNlcnZsZXRJbmZvR2VuZXJhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgaW5mbyA9IG4uZ2V0QXR0cmlidXRlVmFsdWUoImluZm8iKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0SW5mb0dlbmVyYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoInB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldEluZm8oKSB7Iik7CisgICAgICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigicmV0dXJuICIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChxdW90ZShpbmZvKSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjsiKTsKKyAgICAgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIn0iKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkRlY2xhcmF0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgICAgIG4uc2V0QmVnaW5KYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50TXVsdGlMbihuZXcgU3RyaW5nKG4uZ2V0VGV4dCgpKSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ3VzdG9tIFRhZ3MgbWF5IGNvbnRhaW4gZGVjbGFyYXRpb25zIGZyb20gdGFnIHBsdWdpbnMuCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkN1c3RvbVRhZyBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZiAobi51c2VUYWdQbHVnaW4oKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobi5nZXRBdFNUYWcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuLmdldEF0U1RhZygpLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4uZ2V0QXRFVGFnKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbi5nZXRBdEVUYWcoKS52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICBwYWdlLnZpc2l0KG5ldyBEZWNsYXJhdGlvblZpc2l0b3IoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGlsZXMgbGlzdCBvZiB0YWcgaGFuZGxlciBwb29sIG5hbWVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjb21waWxlVGFnSGFuZGxlclBvb2xMaXN0KE5vZGUuTm9kZXMgcGFnZSkKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgY2xhc3MgVGFnSGFuZGxlclBvb2xWaXNpdG9yIGV4dGVuZHMgTm9kZS5WaXNpdG9yIHsKKworICAgICAgICAgICAgcHJpdmF0ZSBWZWN0b3IgbmFtZXM7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBwYXJhbSB2IFZlY3RvciBvZiB0YWcgaGFuZGxlciBwb29sIG5hbWVzIHRvIHBvcHVsYXRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFRhZ0hhbmRsZXJQb29sVmlzaXRvcihWZWN0b3IgdikgeworICAgICAgICAgICAgICAgIG5hbWVzID0gdjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIHRhZyBoYW5kbGVyIHBvb2wgZm9yIHRoZSBnaXZlbiBjdXN0b20gdGFnCisgICAgICAgICAgICAgKiBhbmQgYWRkcyBpdCB0byB0aGUgbGlzdCBvZiB0YWcgaGFuZGxlciBwb29sIG5hbWVzIHVubGVzcyBpdCBpcworICAgICAgICAgICAgICogYWxyZWFkeSBjb250YWluZWQgaW4gaXQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuQ3VzdG9tVGFnIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICAgICAgaWYgKCFuLmltcGxlbWVudHNTaW1wbGVUYWcoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVUYWdIYW5kbGVyUG9vbE5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5nZXRQcmVmaXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldExvY2FsTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZ2V0QXR0cmlidXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uaGFzRW1wdHlCb2R5KCkpOworICAgICAgICAgICAgICAgICAgICBuLnNldFRhZ0hhbmRsZXJQb29sTmFtZShuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lcy5jb250YWlucyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKG5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENyZWF0ZXMgdGhlIG5hbWUgb2YgdGhlIHRhZyBoYW5kbGVyIHBvb2wgd2hvc2UgdGFnIGhhbmRsZXJzIG1heQorICAgICAgICAgICAgICogYmUgKHJlKXVzZWQgdG8gc2VydmljZSB0aGlzIGFjdGlvbi4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSB0YWcgaGFuZGxlciBwb29sCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVRhZ0hhbmRsZXJQb29sTmFtZSgKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgIFN0cmluZyBzaG9ydE5hbWUsCisgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICBib29sZWFuIGhhc0VtcHR5Qm9keSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwb29sTmFtZSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBwb29sTmFtZSA9ICJfanNweF90YWdQb29sXyIgKyBwcmVmaXggKyAiXyIgKyBzaG9ydE5hbWU7CisgICAgICAgICAgICAgICAgaWYgKGF0dHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gYXR0ck5hbWVzID0gbmV3IFN0cmluZ1thdHRycy5nZXRMZW5ndGgoKV07CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0ck5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZXNbaV0gPSBhdHRycy5nZXRRTmFtZShpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBcnJheXMuc29ydChhdHRyTmFtZXMsIENvbGxlY3Rpb25zLnJldmVyc2VPcmRlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyTmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xOYW1lID0gcG9vbE5hbWUgKyAiXyIgKyBhdHRyTmFtZXNbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGhhc0VtcHR5Qm9keSkgeworICAgICAgICAgICAgICAgICAgICBwb29sTmFtZSA9IHBvb2xOYW1lICsgIl9ub2JvZHkiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gSnNwVXRpbC5tYWtlSmF2YUlkZW50aWZpZXIocG9vbE5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGFnZS52aXNpdChuZXcgVGFnSGFuZGxlclBvb2xWaXNpdG9yKHRhZ0hhbmRsZXJQb29sTmFtZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVjbGFyZVRlbXBvcmFyeVNjcmlwdGluZ1ZhcnMoTm9kZS5Ob2RlcyBwYWdlKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBjbGFzcyBTY3JpcHRpbmdWYXJWaXNpdG9yIGV4dGVuZHMgTm9kZS5WaXNpdG9yIHsKKworICAgICAgICAgICAgcHJpdmF0ZSBWZWN0b3IgdmFyczsKKworICAgICAgICAgICAgU2NyaXB0aW5nVmFyVmlzaXRvcigpIHsKKyAgICAgICAgICAgICAgICB2YXJzID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkN1c3RvbVRhZyBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgICAgIGlmIChuLmdldEN1c3RvbU5lc3RpbmdMZXZlbCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBUYWdWYXJpYWJsZUluZm9bXSB0YWdWYXJJbmZvcyA9IG4uZ2V0VGFnVmFyaWFibGVJbmZvcygpOworICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZUluZm9bXSB2YXJJbmZvcyA9IG4uZ2V0VmFyaWFibGVJbmZvcygpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh2YXJJbmZvcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhckluZm9zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSB2YXJJbmZvc1tpXS5nZXRWYXJOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRtcFZhck5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2pzcHhfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2YXJOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuLmdldEN1c3RvbU5lc3RpbmdMZXZlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFycy5jb250YWlucyh0bXBWYXJOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzLmFkZCh0bXBWYXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odmFySW5mb3NbaV0uZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHRtcFZhck5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiA9ICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQobnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCI7Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdWYXJJbmZvcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YXJOYW1lID0gdGFnVmFySW5mb3NbaV0uZ2V0TmFtZUdpdmVuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhck5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZ2V0VGFnRGF0YSgpLmdldEF0dHJpYnV0ZVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdWYXJJbmZvc1tpXS5nZXROYW1lRnJvbUF0dHJpYnV0ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdWYXJJbmZvc1tpXS5nZXROYW1lRnJvbUF0dHJpYnV0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsaWFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG1wVmFyTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfanNweF8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZhck5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG4uZ2V0Q3VzdG9tTmVzdGluZ0xldmVsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJzLmNvbnRhaW5zKHRtcFZhck5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMuYWRkKHRtcFZhck5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbih0YWdWYXJJbmZvc1tpXS5nZXRDbGFzc05hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQodG1wVmFyTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiID0gIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwYWdlLnZpc2l0KG5ldyBTY3JpcHRpbmdWYXJWaXNpdG9yKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgX2pzcEluaXQoKSBtZXRob2QgZm9yIGluc3RhbnRpYXRpbmcgdGhlIHRhZyBoYW5kbGVyIHBvb2xzLgorICAgICAqIEZvciB0YWcgZmlsZSwgX2pzcEluaXQgaGFzIHRvIGJlIGludm9rZWQgbWFudWFsbHksIGFuZCB0aGUgU2VydmxldENvbmZpZworICAgICAqIG9iamVjdCBleHBsaWNpdGx5IHBhc3NlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVJbml0KCkgeworCisgICAgICAgIGlmIChjdHh0LmlzVGFnRmlsZSgpKSB7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgicHJpdmF0ZSB2b2lkIF9qc3BJbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB7Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgicHVibGljIHZvaWQgX2pzcEluaXQoKSB7Iik7CisgICAgICAgIH0KKworICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ0hhbmRsZXJQb29sTmFtZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG91dC5wcmludGluKChTdHJpbmcpdGFnSGFuZGxlclBvb2xOYW1lcy5lbGVtZW50QXQoaSkpOworICAgICAgICAgICAgb3V0LnByaW50KAorICAgICAgICAgICAgICAgICIgPSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLlRhZ0hhbmRsZXJQb29sLmdldFRhZ0hhbmRsZXJQb29sKCIpOworICAgICAgICAgICAgaWYgKGN0eHQuaXNUYWdGaWxlKCkpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoImNvbmZpZyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoImdldFNlcnZsZXRDb25maWcoKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICBvdXQucHJpbnRsbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgX2pzcERlc3Ryb3koKSBtZXRob2Qgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgdGhlCisgICAgICogcmVsZWFzZSgpIG1ldGhvZCBvbiBldmVyeSB0YWcgaGFuZGxlciBpbiBhbnkgb2YgdGhlIHRhZyBoYW5kbGVyIHBvb2xzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZURlc3Ryb3koKSB7CisKKyAgICAgICAgb3V0LnByaW50aWwoInB1YmxpYyB2b2lkIF9qc3BEZXN0cm95KCkgeyIpOworICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ0hhbmRsZXJQb29sTmFtZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG91dC5wcmludGluKChTdHJpbmcpdGFnSGFuZGxlclBvb2xOYW1lcy5lbGVtZW50QXQoaSkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIi5yZWxlYXNlKCk7Iik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICBvdXQucHJpbnRsbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIHByZWFtYmxlIHBhY2thZ2UgbmFtZQorICAgICAqIChzaGFyZWQgYnkgc2VydmxldCBhbmQgdGFnIGhhbmRsZXIgcHJlYW1ibGUgZ2VuZXJhdGlvbikKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2VuUHJlYW1ibGVQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSkKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghIiIuZXF1YWxzKHBhY2thZ2VOYW1lKSAmJiBwYWNrYWdlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiOyIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIHByZWFtYmxlIGltcG9ydHMKKyAgICAgKiAoc2hhcmVkIGJ5IHNlcnZsZXQgYW5kIHRhZyBoYW5kbGVyIHByZWFtYmxlIGdlbmVyYXRpb24pCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdlblByZWFtYmxlSW1wb3J0cygpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBJdGVyYXRvciBpdGVyID0gcGFnZUluZm8uZ2V0SW1wb3J0cygpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgb3V0LnByaW50aW4oImltcG9ydCAiKTsKKyAgICAgICAgICAgIG91dC5wcmludCgoU3RyaW5nKWl0ZXIubmV4dCgpKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI7Iik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0aW9uIG9mIHN0YXRpYyBpbml0aWFsaXplcnMgaW4gcHJlYW1ibGUuCisgICAgICogRm9yIGV4YW1wbGUsIGRlcGVuZGFudCBsaXN0LCBlbCBmdW5jdGlvbiBtYXAsIHByZWZpeCBtYXAuCisgICAgICogKHNoYXJlZCBieSBzZXJ2bGV0IGFuZCB0YWcgaGFuZGxlciBwcmVhbWJsZSBnZW5lcmF0aW9uKQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZW5QcmVhbWJsZVN0YXRpY0luaXRpYWxpemVycygpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAvLyBTdGF0aWMgZGF0YSBmb3IgZ2V0RGVwZW5kYW50cygpCisgICAgICAgIG91dC5wcmludGlsKCJwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuTGlzdCBfanNweF9kZXBlbmRhbnRzOyIpOworICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICBMaXN0IGRlcGVuZGFudHMgPSBwYWdlSW5mby5nZXREZXBlbmRhbnRzKCk7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBkZXBlbmRhbnRzLml0ZXJhdG9yKCk7CisgICAgICAgIGlmICghZGVwZW5kYW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJzdGF0aWMgeyIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGluKCJfanNweF9kZXBlbmRhbnRzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoIik7CisgICAgICAgICAgICBvdXQucHJpbnQoIiIgKyBkZXBlbmRhbnRzLnNpemUoKSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiKTsiKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGluKCJfanNweF9kZXBlbmRhbnRzLmFkZChcIiIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgoU3RyaW5nKWl0ZXIubmV4dCgpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiXCIpOyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoIn0iKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNsYXJlIHRhZyBoYW5kbGVyIHBvb2xzICh0YWdzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdpdGggdGhlIHNhbWUKKyAgICAgKiBhdHRyaWJ1dGUgc2V0IHNoYXJlIHRoZSBzYW1lIHRhZyBoYW5kbGVyIHBvb2wpCisgICAgICogKHNoYXJlZCBieSBzZXJ2bGV0IGFuZCB0YWcgaGFuZGxlciBwcmVhbWJsZSBnZW5lcmF0aW9uKQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZW5QcmVhbWJsZUNsYXNzVmFyaWFibGVEZWNsYXJhdGlvbnMoU3RyaW5nIGNsYXNzTmFtZSkKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1Bvb2xpbmdFbmFibGVkICYmICF0YWdIYW5kbGVyUG9vbE5hbWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdIYW5kbGVyUG9vbE5hbWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgICAgICJwcml2YXRlIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuVGFnSGFuZGxlclBvb2wgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0YWdIYW5kbGVyUG9vbE5hbWVzLmVsZW1lbnRBdChpKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiOyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlY2xhcmUgZ2VuZXJhbC1wdXJwb3NlIG1ldGhvZHMKKyAgICAgKiAoc2hhcmVkIGJ5IHNlcnZsZXQgYW5kIHRhZyBoYW5kbGVyIHByZWFtYmxlIGdlbmVyYXRpb24pCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdlblByZWFtYmxlTWV0aG9kcygpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAvLyBNZXRob2QgdXNlZCB0byBnZXQgY29tcGlsZSB0aW1lIGZpbGUgZGVwZW5kZW5jaWVzCisgICAgICAgIG91dC5wcmludGlsKCJwdWJsaWMgT2JqZWN0IGdldERlcGVuZGFudHMoKSB7Iik7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJyZXR1cm4gX2pzcHhfZGVwZW5kYW50czsiKTsKKyAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICBvdXQucHJpbnRsbigpOworCisgICAgICAgIGlmIChpc1Bvb2xpbmdFbmFibGVkICYmICF0YWdIYW5kbGVyUG9vbE5hbWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZ2VuZXJhdGVJbml0KCk7CisgICAgICAgICAgICBnZW5lcmF0ZURlc3Ryb3koKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdGF0aWMgcG9ydGlvbiBvZiB0aGUgc2VydmxldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVQcmVhbWJsZShOb2RlLk5vZGVzIHBhZ2UpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBzZXJ2bGV0UGFja2FnZU5hbWUgPSBjdHh0LmdldFNlcnZsZXRQYWNrYWdlTmFtZSgpOworICAgICAgICBTdHJpbmcgc2VydmxldENsYXNzTmFtZSA9IGN0eHQuZ2V0U2VydmxldENsYXNzTmFtZSgpOworICAgICAgICBTdHJpbmcgc2VydmljZU1ldGhvZE5hbWUgPSBDb25zdGFudHMuU0VSVklDRV9NRVRIT0RfTkFNRTsKKworICAgICAgICAvLyBGaXJzdCB0aGUgcGFja2FnZSBuYW1lOgorICAgICAgICBnZW5QcmVhbWJsZVBhY2thZ2Uoc2VydmxldFBhY2thZ2VOYW1lKTsKKworICAgICAgICAvLyBHZW5lcmF0ZSBpbXBvcnRzCisgICAgICAgIGdlblByZWFtYmxlSW1wb3J0cygpOworCisgICAgICAgIC8vIEdlbmVyYXRlIGNsYXNzIGRlY2xhcmF0aW9uCisgICAgICAgIG91dC5wcmludGluKCJwdWJsaWMgZmluYWwgY2xhc3MgIik7CisgICAgICAgIG91dC5wcmludChzZXJ2bGV0Q2xhc3NOYW1lKTsKKyAgICAgICAgb3V0LnByaW50KCIgZXh0ZW5kcyAiKTsKKyAgICAgICAgb3V0LnByaW50bG4ocGFnZUluZm8uZ2V0RXh0ZW5kcygpKTsKKyAgICAgICAgb3V0LnByaW50aW4oCisgICAgICAgICAgICAiICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BTb3VyY2VEZXBlbmRlbnQiKTsKKyAgICAgICAgaWYgKCFwYWdlSW5mby5pc1RocmVhZFNhZmUoKSkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgIG91dC5wcmludGluKCIgICAgICAgICAgICAgICAgIFNpbmdsZVRocmVhZE1vZGVsIik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIiB7Iik7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisKKyAgICAgICAgLy8gQ2xhc3MgYm9keSBiZWdpbnMgaGVyZQorICAgICAgICBnZW5lcmF0ZURlY2xhcmF0aW9ucyhwYWdlKTsKKworICAgICAgICAvLyBTdGF0aWMgaW5pdGlhbGl6YXRpb25zIGhlcmUKKyAgICAgICAgZ2VuUHJlYW1ibGVTdGF0aWNJbml0aWFsaXplcnMoKTsKKworICAgICAgICAvLyBDbGFzcyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMKKyAgICAgICAgZ2VuUHJlYW1ibGVDbGFzc1ZhcmlhYmxlRGVjbGFyYXRpb25zKHNlcnZsZXRDbGFzc05hbWUpOworCisgICAgICAgIC8vIENvbnN0cnVjdG9yCisgICAgICAgIC8vICBnZW5lcmF0ZUNvbnN0cnVjdG9yKGNsYXNzTmFtZSk7CisKKyAgICAgICAgLy8gTWV0aG9kcyBoZXJlCisgICAgICAgIGdlblByZWFtYmxlTWV0aG9kcygpOworCisgICAgICAgIC8vIE5vdyB0aGUgc2VydmljZSBtZXRob2QKKyAgICAgICAgb3V0LnByaW50aW4oInB1YmxpYyB2b2lkICIpOworICAgICAgICBvdXQucHJpbnQoc2VydmljZU1ldGhvZE5hbWUpOworICAgICAgICBvdXQucHJpbnRsbigKKyAgICAgICAgICAgICIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIik7CisgICAgICAgIG91dC5wcmludGxuKCIgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsiKTsKKworICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRsbigpOworCisgICAgICAgIC8vIExvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucworICAgICAgICBvdXQucHJpbnRpbCgiSnNwRmFjdG9yeSBfanNweEZhY3RvcnkgPSBudWxsOyIpOworICAgICAgICBvdXQucHJpbnRpbCgiUGFnZUNvbnRleHQgcGFnZUNvbnRleHQgPSBudWxsOyIpOworICAgICAgICBpZiAocGFnZUluZm8uaXNTZXNzaW9uKCkpCisgICAgICAgICAgICBvdXQucHJpbnRpbCgiSHR0cFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7Iik7CisKKyAgICAgICAgaWYgKHBhZ2VJbmZvLmlzRXJyb3JQYWdlKCkpIHsKKyAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICJUaHJvd2FibGUgZXhjZXB0aW9uID0gb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS5nZXRUaHJvd2FibGUocmVxdWVzdCk7Iik7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgiaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7Iik7CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgInJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Iik7CisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICB9CisKKyAgICAgICAgb3V0LnByaW50aWwoIlNlcnZsZXRDb250ZXh0IGFwcGxpY2F0aW9uID0gbnVsbDsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoIlNlcnZsZXRDb25maWcgY29uZmlnID0gbnVsbDsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoIkpzcFdyaXRlciBvdXQgPSBudWxsOyIpOworICAgICAgICBvdXQucHJpbnRpbCgiT2JqZWN0IHBhZ2UgPSB0aGlzOyIpOworCisgICAgICAgIG91dC5wcmludGlsKCJKc3BXcml0ZXIgX2pzcHhfb3V0ID0gbnVsbDsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoIlBhZ2VDb250ZXh0IF9qc3B4X3BhZ2VfY29udGV4dCA9IG51bGw7Iik7CisgICAgICAgIG91dC5wcmludGxuKCk7CisKKyAgICAgICAgZGVjbGFyZVRlbXBvcmFyeVNjcmlwdGluZ1ZhcnMocGFnZSk7CisgICAgICAgIG91dC5wcmludGxuKCk7CisKKyAgICAgICAgb3V0LnByaW50aWwoInRyeSB7Iik7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisKKyAgICAgICAgb3V0LnByaW50aWwoIl9qc3B4RmFjdG9yeSA9IEpzcEZhY3RvcnkuZ2V0RGVmYXVsdEZhY3RvcnkoKTsiKTsKKworICAgICAgICBvdXQucHJpbnRpbigicmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoIik7CisgICAgICAgIG91dC5wcmludChxdW90ZShwYWdlSW5mby5nZXRDb250ZW50VHlwZSgpKSk7CisgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworCisgICAgICAgIGlmIChjdHh0LmdldE9wdGlvbnMoKS5pc1hwb3dlcmVkQnkoKSkgeworICAgICAgICAgICAgb3V0LnByaW50aWwoInJlc3BvbnNlLmFkZEhlYWRlcihcIlgtUG93ZXJlZC1CeVwiLCBcIkpTUC8yLjBcIik7Iik7CisgICAgICAgIH0KKworICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICJwYWdlQ29udGV4dCA9IF9qc3B4RmFjdG9yeS5nZXRQYWdlQ29udGV4dCh0aGlzLCByZXF1ZXN0LCByZXNwb25zZSwiKTsKKyAgICAgICAgb3V0LnByaW50aW4oIlx0XHRcdCIpOworICAgICAgICBvdXQucHJpbnQocXVvdGUocGFnZUluZm8uZ2V0RXJyb3JQYWdlKCkpKTsKKyAgICAgICAgb3V0LnByaW50KCIsICIgKyBwYWdlSW5mby5pc1Nlc3Npb24oKSk7CisgICAgICAgIG91dC5wcmludCgiLCAiICsgcGFnZUluZm8uZ2V0QnVmZmVyKCkpOworICAgICAgICBvdXQucHJpbnQoIiwgIiArIHBhZ2VJbmZvLmlzQXV0b0ZsdXNoKCkpOworICAgICAgICBvdXQucHJpbnRsbigiKTsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoIl9qc3B4X3BhZ2VfY29udGV4dCA9IHBhZ2VDb250ZXh0OyIpOworCisgICAgICAgIG91dC5wcmludGlsKCJhcHBsaWNhdGlvbiA9IHBhZ2VDb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCk7Iik7CisgICAgICAgIG91dC5wcmludGlsKCJjb25maWcgPSBwYWdlQ29udGV4dC5nZXRTZXJ2bGV0Q29uZmlnKCk7Iik7CisKKyAgICAgICAgaWYgKHBhZ2VJbmZvLmlzU2Vzc2lvbigpKQorICAgICAgICAgICAgb3V0LnByaW50aWwoInNlc3Npb24gPSBwYWdlQ29udGV4dC5nZXRTZXNzaW9uKCk7Iik7CisgICAgICAgIG91dC5wcmludGlsKCJvdXQgPSBwYWdlQ29udGV4dC5nZXRPdXQoKTsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoIl9qc3B4X291dCA9IG91dDsiKTsKKyAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYW4gWE1MIFByb2xvZywgd2hpY2ggaW5jbHVkZXMgYW4gWE1MIGRlY2xhcmF0aW9uIGFuZAorICAgICAqIGFuIFhNTCBkb2N0eXBlIGRlY2xhcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVhtbFByb2xvZyhOb2RlLk5vZGVzIHBhZ2UpIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBBbiBYTUwgZGVjbGFyYXRpb24gaXMgZ2VuZXJhdGVkIHVuZGVyIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAgICAgICAgICoKKyAgICAgICAgICogLSAnb21pdC14bWwtZGVjbGFyYXRpb24nIGF0dHJpYnV0ZSBvZiA8anNwOm91dHB1dD4gYWN0aW9uIGlzIHNldCB0bworICAgICAgICAgKiAgICJubyIgb3IgImZhbHNlIgorICAgICAgICAgKiAtIEpTUCBkb2N1bWVudCB3aXRob3V0IGEgPGpzcDpyb290PgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIG9taXRYbWxEZWNsID0gcGFnZUluZm8uZ2V0T21pdFhtbERlY2woKTsKKyAgICAgICAgaWYgKChvbWl0WG1sRGVjbCAhPSBudWxsICYmICFKc3BVdGlsLmJvb2xlYW5WYWx1ZShvbWl0WG1sRGVjbCkpCisgICAgICAgICAgICB8fCAob21pdFhtbERlY2wgPT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHBhZ2UuZ2V0Um9vdCgpLmlzWG1sU3ludGF4KCkKKyAgICAgICAgICAgICAgICAmJiAhcGFnZUluZm8uaGFzSnNwUm9vdCgpCisgICAgICAgICAgICAgICAgJiYgIWN0eHQuaXNUYWdGaWxlKCkpKSB7CisgICAgICAgICAgICBTdHJpbmcgY1R5cGUgPSBwYWdlSW5mby5nZXRDb250ZW50VHlwZSgpOworICAgICAgICAgICAgU3RyaW5nIGNoYXJTZXQgPSBjVHlwZS5zdWJzdHJpbmcoY1R5cGUuaW5kZXhPZigiY2hhcnNldD0iKSArIDgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgIm91dC53cml0ZShcIjw/eG1sIHZlcnNpb249XFxcIjEuMFxcXCIgZW5jb2Rpbmc9XFxcIiIKKyAgICAgICAgICAgICAgICAgICAgKyBjaGFyU2V0CisgICAgICAgICAgICAgICAgICAgICsgIlxcXCI/PlxcblwiKTsiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIE91dHB1dCBhIERPQ1RZUEUgZGVjbGFyYXRpb24gaWYgdGhlIGRvY3R5cGUtcm9vdC1lbGVtZW50IGFwcGVhcnMuCisgICAgICAgICAqIElmIGRvY3R5cGUtcHVibGljIGFwcGVhcnM6CisgICAgICAgICAqICAgICA8IURPQ1RZUEUgbmFtZSBQVUJMSUMgImRvY3R5cGVQdWJsaWMiICJkb2N0eXBlU3lzdGVtIj4KKyAgICAgICAgICogZWxzZQorICAgICAgICAgKiAgICAgPCFET0NUWVBFIG5hbWUgU1lTVEVNICJkb2N0eXBlU3lzdGVtIiA+CisgICAgICAgICAqLworCisgICAgICAgIFN0cmluZyBkb2N0eXBlTmFtZSA9IHBhZ2VJbmZvLmdldERvY3R5cGVOYW1lKCk7CisgICAgICAgIGlmIChkb2N0eXBlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgZG9jdHlwZVB1YmxpYyA9IHBhZ2VJbmZvLmdldERvY3R5cGVQdWJsaWMoKTsKKyAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlU3lzdGVtID0gcGFnZUluZm8uZ2V0RG9jdHlwZVN5c3RlbSgpOworICAgICAgICAgICAgb3V0LnByaW50aW4oIm91dC53cml0ZShcIjwhRE9DVFlQRSAiKTsKKyAgICAgICAgICAgIG91dC5wcmludChkb2N0eXBlTmFtZSk7CisgICAgICAgICAgICBpZiAoZG9jdHlwZVB1YmxpYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgU1lTVEVNIFxcXCIiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgUFVCTElDIFxcXCIiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoZG9jdHlwZVB1YmxpYyk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJcXFwiIFxcXCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludChkb2N0eXBlU3lzdGVtKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCJcXFwiPlxcblwiKTsiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogR2VuZXJhdGVzIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgKiAoc2hhcmVkIGJ5IHNlcnZsZXQgYW5kIHRhZyBoYW5kbGVyIHByZWFtYmxlIGdlbmVyYXRpb24pCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQ29uc3RydWN0b3IoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICBvdXQucHJpbnRpbCgicHVibGljICIgKyBjbGFzc05hbWUgKyAiKCkgeyIpOworICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICBvdXQucHJpbnRsbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdmlzaXRvciB0aGF0IGdlbmVyYXRlcyBjb2RlcyBmb3IgdGhlIGVsZW1lbnRzIGluIHRoZSBwYWdlLgorICAgICAqLworICAgIGNsYXNzIEdlbmVyYXRlVmlzaXRvciBleHRlbmRzIE5vZGUuVmlzaXRvciB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSGFzaHRhYmxlIGNvbnRhaW5pbmcgaW50cm9zcGVjdGlvbiBpbmZvcm1hdGlvbiBvbiB0YWcgaGFuZGxlcnM6CisgICAgICAgICAqICAgPGtleT46IHRhZyBwcmVmaXgKKyAgICAgICAgICogICA8dmFsdWU+OiBoYXNodGFibGUgY29udGFpbmluZyBpbnRyb3NwZWN0aW9uIG9uIHRhZyBoYW5kbGVyczoKKyAgICAgICAgICogICAgICAgICAgICAgIDxrZXk+OiB0YWcgc2hvcnQgbmFtZQorICAgICAgICAgKiAgICAgICAgICAgICAgPHZhbHVlPjogaW50cm9zcGVjdGlvbiBpbmZvIG9mIHRhZyBoYW5kbGVyIGZvcgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgPHByZWZpeDpzaG9ydE5hbWU+IHRhZworICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBIYXNodGFibGUgaGFuZGxlckluZm9zOworCisgICAgICAgIHByaXZhdGUgSGFzaHRhYmxlIHRhZ1Zhck51bWJlcnM7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhcmVudDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU2ltcGxlVGFnUGFyZW50OyAvLyBJcyBwYXJlbnQgYSBTaW1wbGVUYWc/CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHB1c2hCb2R5Q291bnRWYXI7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHNpbXBsZVRhZ0hhbmRsZXJWYXI7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1NpbXBsZVRhZ0hhbmRsZXI7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZyYWdtZW50OworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNUYWdGaWxlOworICAgICAgICBwcml2YXRlIFNlcnZsZXRXcml0ZXIgb3V0OworICAgICAgICBwcml2YXRlIEFycmF5TGlzdCBtZXRob2RzQnVmZmVyZWQ7CisgICAgICAgIHByaXZhdGUgRnJhZ21lbnRIZWxwZXJDbGFzcyBmcmFnbWVudEhlbHBlckNsYXNzOworICAgICAgICBwcml2YXRlIGludCBtZXRob2ROZXN0aW5nOworICAgICAgICBwcml2YXRlIFRhZ0luZm8gdGFnSW5mbzsKKyAgICAgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBsb2FkZXI7CisgICAgICAgIHByaXZhdGUgaW50IGNoYXJBcnJheUNvdW50OworICAgICAgICBwcml2YXRlIEhhc2hNYXAgdGV4dE1hcDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgR2VuZXJhdGVWaXNpdG9yKAorICAgICAgICAgICAgYm9vbGVhbiBpc1RhZ0ZpbGUsCisgICAgICAgICAgICBTZXJ2bGV0V3JpdGVyIG91dCwKKyAgICAgICAgICAgIEFycmF5TGlzdCBtZXRob2RzQnVmZmVyZWQsCisgICAgICAgICAgICBGcmFnbWVudEhlbHBlckNsYXNzIGZyYWdtZW50SGVscGVyQ2xhc3MsCisgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIsCisgICAgICAgICAgICBUYWdJbmZvIHRhZ0luZm8pIHsKKworICAgICAgICAgICAgdGhpcy5pc1RhZ0ZpbGUgPSBpc1RhZ0ZpbGU7CisgICAgICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kc0J1ZmZlcmVkID0gbWV0aG9kc0J1ZmZlcmVkOworICAgICAgICAgICAgdGhpcy5mcmFnbWVudEhlbHBlckNsYXNzID0gZnJhZ21lbnRIZWxwZXJDbGFzczsKKyAgICAgICAgICAgIHRoaXMubG9hZGVyID0gbG9hZGVyOworICAgICAgICAgICAgdGhpcy50YWdJbmZvID0gdGFnSW5mbzsKKyAgICAgICAgICAgIG1ldGhvZE5lc3RpbmcgPSAwOworICAgICAgICAgICAgaGFuZGxlckluZm9zID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICAgICAgdGFnVmFyTnVtYmVycyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgICAgIHRleHRNYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYW4gYXR0cmlidXRlIHZhbHVlLCBvcHRpb25hbGx5IFVSTCBlbmNvZGVkLiAgSWYKKyAgICAgICAgICogdGhlIHZhbHVlIGlzIGEgcnVudGltZSBleHByZXNzaW9uLCB0aGUgcmVzdWx0IGlzIHRoZSBleHByZXNzaW9uCisgICAgICAgICAqIGl0c2VsZiwgYXMgYSBzdHJpbmcuICBJZiB0aGUgcmVzdWx0IGlzIGFuIEVMIGV4cHJlc3Npb24sIHdlIGluc2VydAorICAgICAgICAgKiBhIGNhbGwgdG8gdGhlIGludGVycHJldGVyLiAgSWYgdGhlIHJlc3VsdCBpcyBhIE5hbWVkIEF0dHJpYnV0ZQorICAgICAgICAgKiB3ZSBpbnNlcnQgdGhlIGdlbmVyYXRlZCB2YXJpYWJsZSBuYW1lLiAgT3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgYQorICAgICAgICAgKiBzdHJpbmcgbGl0ZXJhbCwgcXVvdGVkIGFuZCBlc2NhcGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXR0ciBBbiBKc3BBdHRyaWJ1dGUgb2JqZWN0CisgICAgICAgICAqIEBwYXJhbSBlbmNvZGUgdHJ1ZSBpZiB0byBiZSBVUkwgZW5jb2RlZAorICAgICAgICAgKiBAcGFyYW0gZXhwZWN0ZWRUeXBlIHRoZSBleHBlY3RlZCB0eXBlIGZvciBhbiBFTCBldmFsdWF0aW9uCisgICAgICAgICAqICAgICAgICAoaWdub3JlZCBmb3IgYXR0cmlidXRlcyB0aGF0IGFyZW4ndCBFTCBleHByZXNzaW9ucykKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKAorICAgICAgICAgICAgTm9kZS5Kc3BBdHRyaWJ1dGUgYXR0ciwKKyAgICAgICAgICAgIGJvb2xlYW4gZW5jb2RlLAorICAgICAgICAgICAgQ2xhc3MgZXhwZWN0ZWRUeXBlKSB7CisgICAgICAgICAgICBTdHJpbmcgdiA9IGF0dHIuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmICghYXR0ci5pc05hbWVkQXR0cmlidXRlKCkgJiYgKHYgPT0gbnVsbCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworCisgICAgICAgICAgICBpZiAoYXR0ci5pc0V4cHJlc3Npb24oKSkgeworICAgICAgICAgICAgICAgIGlmIChlbmNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LlVSTEVuY29kZShTdHJpbmcudmFsdWVPZigiCisgICAgICAgICAgICAgICAgICAgICAgICArIHYKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiksIHJlcXVlc3QuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSkiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0ci5pc0VMSW50ZXJwcmV0ZXJJbnB1dCgpKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiByZXBsYWNlRVNDID0gdi5pbmRleE9mKENvbnN0YW50cy5IQUNLX0NIQVIpID4gMDsKKyAgICAgICAgICAgICAgICB2ID0KKyAgICAgICAgICAgICAgICAgICAgSnNwVXRpbC5pbnRlcnByZXRlckNhbGwoCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVGFnRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHYsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmdldEVMKCkuZ2V0TWFwTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgIC8vIFhYWCBoYWNrIHJlcGxhY2VtZW50CisgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VFU0MpIHsKKyAgICAgICAgICAgICAgICAgICAgdiA9ICIoIiArIHYgKyAiKS5yZXBsYWNlKCIgKyBDb25zdGFudHMuSEFDS19TVFIgKyAiLCAnJCcpIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVuY29kZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuVVJMRW5jb2RlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCByZXF1ZXN0LmdldENoYXJhY3RlckVuY29kaW5nKCkpIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHIuaXNOYW1lZEF0dHJpYnV0ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHIuZ2V0TmFtZWRBdHRyaWJ1dGVOb2RlKCkuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChlbmNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LlVSTEVuY29kZSgiCisgICAgICAgICAgICAgICAgICAgICAgICArIHF1b3RlKHYpCisgICAgICAgICAgICAgICAgICAgICAgICArICIsIHJlcXVlc3QuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSkiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcXVvdGUodik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUHJpbnRzIHRoZSBhdHRyaWJ1dGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBwYXJhbSBhY3Rpb24sIGluIHRoZQorICAgICAgICAgKiBmb3JtIG9mIG5hbWU9dmFsdWUgc3RyaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbiB0aGUgcGFyZW50IG5vZGUgZm9yIHRoZSBwYXJhbSBhY3Rpb24gbm9kZXMuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgcHJpbnRQYXJhbXMoTm9kZSBuLCBTdHJpbmcgcGFnZVBhcmFtLCBib29sZWFuIGxpdGVyYWwpCisgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgY2xhc3MgUGFyYW1WaXNpdG9yIGV4dGVuZHMgTm9kZS5WaXNpdG9yIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VwYXJhdG9yOworCisgICAgICAgICAgICAgICAgUGFyYW1WaXNpdG9yKFN0cmluZyBzZXBhcmF0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXBhcmF0b3IgPSBzZXBhcmF0b3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5QYXJhbUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiArICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoc2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgKyAiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVSTEVuY29kZSgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBxdW90ZShuLmdldFRleHRBdHRyaWJ1dGUoIm5hbWUiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHJlcXVlc3QuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSkiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIrIFwiPVwiICsgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChhdHRyaWJ1dGVWYWx1ZShuLmdldFZhbHVlKCksIHRydWUsIFN0cmluZy5jbGFzcykpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzZXBhcmF0b3IgaXMgJyYnIGFmdGVyIHRoZSBzZWNvbmQgdXNlCisgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvciA9ICJcIiZcIiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgc2VwOworICAgICAgICAgICAgaWYgKGxpdGVyYWwpIHsKKyAgICAgICAgICAgICAgICBzZXAgPSBwYWdlUGFyYW0uaW5kZXhPZignPycpID4gMCA/ICJcIiZcIiIgOiAiXCI/XCIiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXAgPSAiKCgiICsgcGFnZVBhcmFtICsgIikuaW5kZXhPZignPycpPjA/ICcmJzogJz8nKSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobi5nZXRCb2R5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG4uZ2V0Qm9keSgpLnZpc2l0KG5ldyBQYXJhbVZpc2l0b3Ioc2VwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkV4cHJlc3Npb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICAgICAgb3V0LnByaW50aW4oIm91dC5wcmludCgiKTsKKyAgICAgICAgICAgIG91dC5wcmludE11bHRpTG4obi5nZXRUZXh0KCkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuU2NyaXB0bGV0IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgbi5zZXRCZWdpbkphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgICAgIG91dC5wcmludE11bHRpTG4obi5nZXRUZXh0KCkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIG4uc2V0RW5kSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5FTEV4cHJlc3Npb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICAgICAgaWYgKCFwYWdlSW5mby5pc0VMSWdub3JlZCgpKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgICAgICJvdXQud3JpdGUoIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBKc3BVdGlsLmludGVycHJldGVyQ2FsbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVGFnRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHsiICsgbmV3IFN0cmluZyhuLmdldFRleHQoKSkgKyAifSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZ2V0RUwoKS5nZXRNYXBOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICArICIpOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgIm91dC53cml0ZSgiCisgICAgICAgICAgICAgICAgICAgICAgICArIHF1b3RlKCIkeyIgKyBuZXcgU3RyaW5nKG4uZ2V0VGV4dCgpKSArICJ9IikKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIik7Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSW5jbHVkZUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgU3RyaW5nIGZsdXNoID0gbi5nZXRUZXh0QXR0cmlidXRlKCJmbHVzaCIpOworICAgICAgICAgICAgTm9kZS5Kc3BBdHRyaWJ1dGUgcGFnZSA9IG4uZ2V0UGFnZSgpOworCisgICAgICAgICAgICBib29sZWFuIGlzRmx1c2ggPSBmYWxzZTsgLy8gZGVmYXVsdCB0byBmYWxzZTsKKyAgICAgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKGZsdXNoKSkKKyAgICAgICAgICAgICAgICBpc0ZsdXNoID0gdHJ1ZTsKKworICAgICAgICAgICAgbi5zZXRCZWdpbkphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKworICAgICAgICAgICAgU3RyaW5nIHBhZ2VQYXJhbTsKKyAgICAgICAgICAgIGlmIChwYWdlLmlzTmFtZWRBdHRyaWJ1dGUoKSkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwYWdlIGZvciBqc3A6aW5jbHVkZSB3YXMgc3BlY2lmaWVkIHZpYQorICAgICAgICAgICAgICAgIC8vIGpzcDphdHRyaWJ1dGUsIGZpcnN0IGdlbmVyYXRlIGNvZGUgdG8gZXZhbHVhdGUKKyAgICAgICAgICAgICAgICAvLyB0aGF0IGJvZHkuCisgICAgICAgICAgICAgICAgcGFnZVBhcmFtID0KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVOYW1lZEF0dHJpYnV0ZVZhbHVlKHBhZ2UuZ2V0TmFtZWRBdHRyaWJ1dGVOb2RlKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYWdlUGFyYW0gPSBhdHRyaWJ1dGVWYWx1ZShwYWdlLCBmYWxzZSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgYW55IG9mIHRoZSBwYXJhbXMgaGF2ZSB0aGVpciB2YWx1ZXMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAvLyBqc3A6YXR0cmlidXRlLCBwcmVwYXJlIHRob3NlIHZhbHVlcyBmaXJzdC4KKyAgICAgICAgICAgIE5vZGUganNwQm9keSA9IGZpbmRKc3BCb2R5KG4pOworICAgICAgICAgICAgaWYgKGpzcEJvZHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByZXBhcmVQYXJhbXMoanNwQm9keSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByZXBhcmVQYXJhbXMobik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dC5wcmludGluKAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmluY2x1ZGUocmVxdWVzdCwgcmVzcG9uc2UsICIKKyAgICAgICAgICAgICAgICAgICAgKyBwYWdlUGFyYW0pOworICAgICAgICAgICAgcHJpbnRQYXJhbXMobiwgcGFnZVBhcmFtLCBwYWdlLmlzTGl0ZXJhbCgpKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIsIG91dCwgIiArIGlzRmx1c2ggKyAiKTsiKTsKKworICAgICAgICAgICAgbi5zZXRFbmRKYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2NhbnMgdGhyb3VnaCBhbGwgY2hpbGQgbm9kZXMgb2YgdGhlIGdpdmVuIHBhcmVudCBmb3IKKyAgICAgICAgICogPHBhcmFtPiBzdWJlbGVtZW50cy4gIEZvciBlYWNoIDxwYXJhbT4gZWxlbWVudCwgaWYgaXRzIHZhbHVlCisgICAgICAgICAqIGlzIHNwZWNpZmllZCB2aWEgYSBOYW1lZCBBdHRyaWJ1dGUgKDxqc3A6YXR0cmlidXRlPiksCisgICAgICAgICAqIGdlbmVyYXRlIHRoZSBjb2RlIHRvIGV2YWx1YXRlIHRob3NlIGJvZGllcyBmaXJzdC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIElmIHBhcmVudCBpcyBudWxsLCBzaW1wbHkgcmV0dXJucy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlUGFyYW1zKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIE5vZGUuTm9kZXMgc3ViZWxlbWVudHMgPSBwYXJlbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgaWYgKHN1YmVsZW1lbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YmVsZW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgbiA9IHN1YmVsZW1lbnRzLmdldE5vZGUoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuIGluc3RhbmNlb2YgTm9kZS5QYXJhbUFjdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS5Ob2RlcyBwYXJhbVN1YkVsZW1lbnRzID0gbi5nZXRCb2R5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW1TdWJFbGVtZW50cyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoaiA8IHBhcmFtU3ViRWxlbWVudHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIG0gPSBwYXJhbVN1YkVsZW1lbnRzLmdldE5vZGUoaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gaW5zdGFuY2VvZiBOb2RlLk5hbWVkQXR0cmlidXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlTmFtZWRBdHRyaWJ1dGVWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOb2RlLk5hbWVkQXR0cmlidXRlKW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGaW5kcyB0aGUgPGpzcDpib2R5PiBzdWJlbGVtZW50IG9mIHRoZSBnaXZlbiBwYXJlbnQgbm9kZS4KKyAgICAgICAgICogSWYgbm90IGZvdW5kLCBudWxsIGlzIHJldHVybmVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBOb2RlLkpzcEJvZHkgZmluZEpzcEJvZHkoTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgTm9kZS5Kc3BCb2R5IHJlc3VsdCA9IG51bGw7CisKKyAgICAgICAgICAgIE5vZGUuTm9kZXMgc3ViZWxlbWVudHMgPSBwYXJlbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgKHN1YmVsZW1lbnRzICE9IG51bGwpICYmIChpIDwgc3ViZWxlbWVudHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpKyspIHsKKyAgICAgICAgICAgICAgICBOb2RlIG4gPSBzdWJlbGVtZW50cy5nZXROb2RlKGkpOworICAgICAgICAgICAgICAgIGlmIChuIGluc3RhbmNlb2YgTm9kZS5Kc3BCb2R5KSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChOb2RlLkpzcEJvZHkpbjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Gb3J3YXJkQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgTm9kZS5Kc3BBdHRyaWJ1dGUgcGFnZSA9IG4uZ2V0UGFnZSgpOworCisgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworCisgICAgICAgICAgICBvdXQucHJpbnRpbCgiaWYgKHRydWUpIHsiKTsgLy8gU28gdGhhdCBqYXZhYyB3b24ndCBjb21wbGFpbiBhYm91dAorICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsgLy8gY29kZXMgYWZ0ZXIgInJldHVybiIKKworICAgICAgICAgICAgU3RyaW5nIHBhZ2VQYXJhbTsKKyAgICAgICAgICAgIGlmIChwYWdlLmlzTmFtZWRBdHRyaWJ1dGUoKSkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwYWdlIGZvciBqc3A6Zm9yd2FyZCB3YXMgc3BlY2lmaWVkIHZpYQorICAgICAgICAgICAgICAgIC8vIGpzcDphdHRyaWJ1dGUsIGZpcnN0IGdlbmVyYXRlIGNvZGUgdG8gZXZhbHVhdGUKKyAgICAgICAgICAgICAgICAvLyB0aGF0IGJvZHkuCisgICAgICAgICAgICAgICAgcGFnZVBhcmFtID0KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVOYW1lZEF0dHJpYnV0ZVZhbHVlKHBhZ2UuZ2V0TmFtZWRBdHRyaWJ1dGVOb2RlKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYWdlUGFyYW0gPSBhdHRyaWJ1dGVWYWx1ZShwYWdlLCBmYWxzZSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgYW55IG9mIHRoZSBwYXJhbXMgaGF2ZSB0aGVpciB2YWx1ZXMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAvLyBqc3A6YXR0cmlidXRlLCBwcmVwYXJlIHRob3NlIHZhbHVlcyBmaXJzdC4KKyAgICAgICAgICAgIE5vZGUganNwQm9keSA9IGZpbmRKc3BCb2R5KG4pOworICAgICAgICAgICAgaWYgKGpzcEJvZHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByZXBhcmVQYXJhbXMoanNwQm9keSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByZXBhcmVQYXJhbXMobik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dC5wcmludGluKCJfanNweF9wYWdlX2NvbnRleHQuZm9yd2FyZCgiKTsKKyAgICAgICAgICAgIG91dC5wcmludChwYWdlUGFyYW0pOworICAgICAgICAgICAgcHJpbnRQYXJhbXMobiwgcGFnZVBhcmFtLCBwYWdlLmlzTGl0ZXJhbCgpKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICAgICAgaWYgKGlzVGFnRmlsZSB8fCBpc0ZyYWdtZW50KSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoInRocm93IG5ldyBTa2lwUGFnZUV4Y2VwdGlvbigpOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgobWV0aG9kTmVzdGluZyA+IDApID8gInJldHVybiB0cnVlOyIgOiAicmV0dXJuOyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoIn0iKTsKKworICAgICAgICAgICAgbi5zZXRFbmRKYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisgICAgICAgICAgICAvLyBYWFggTm90IHN1cmUgaWYgd2UgY2FuIGVsaW1pbmF0ZSBkZWFkIGNvZGVzIGFmdGVyIHRoaXMuCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkdldFByb3BlcnR5IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuLmdldFRleHRBdHRyaWJ1dGUoIm5hbWUiKTsKKyAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgicHJvcGVydHkiKTsKKworICAgICAgICAgICAgbi5zZXRCZWdpbkphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKworICAgICAgICAgICAgaWYgKGJlYW5JbmZvLmNoZWNrVmFyaWFibGUobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBCZWFuIGlzIGRlZmluZWQgdXNpbmcgdXNlQmVhbiwgaW50cm9zcGVjdCBhdCBjb21waWxlIHRpbWUKKyAgICAgICAgICAgICAgICBDbGFzcyBiZWFuID0gYmVhbkluZm8uZ2V0QmVhblR5cGUobmFtZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGJlYW5OYW1lID0gSnNwVXRpbC5nZXRDYW5vbmljYWxOYW1lKGJlYW4pOworICAgICAgICAgICAgICAgIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRoID0KKyAgICAgICAgICAgICAgICAgICAgSnNwUnVudGltZUxpYnJhcnkuZ2V0UmVhZE1ldGhvZChiZWFuLCBwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRoLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgIm91dC53cml0ZShvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LnRvU3RyaW5nKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIigoKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYmVhbk5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIilfanNweF9wYWdlX2NvbnRleHQuZmluZEF0dHJpYnV0ZSgiCisgICAgICAgICAgICAgICAgICAgICAgICArICJcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIpKS4iCisgICAgICAgICAgICAgICAgICAgICAgICArIG1ldGhvZE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIigpKSkpOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgb2JqZWN0IGNvdWxkIGJlIGEgY3VzdG9tIGFjdGlvbiB3aXRoIGFuIGFzc29jaWF0ZWQKKyAgICAgICAgICAgICAgICAvLyBWYXJpYWJsZUluZm8gZW50cnkgZm9yIHRoaXMgbmFtZS4KKyAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGNsYXNzIG5hbWUgYW5kIHRoZW4gaW50cm9zcGVjdCBhdCBydW50aW1lLgorICAgICAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICAgICAib3V0LndyaXRlKG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkudG9TdHJpbmciCisgICAgICAgICAgICAgICAgICAgICAgICArICIob3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS5oYW5kbGVHZXRQcm9wZXJ0eSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIihfanNweF9wYWdlX2NvbnRleHQuZ2V0QXR0cmlidXRlKFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICJcIiwgUGFnZUNvbnRleHQuUEFHRV9TQ09QRSksIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIpKSk7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG4uc2V0RW5kSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5TZXRQcm9wZXJ0eSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbi5nZXRUZXh0QXR0cmlidXRlKCJuYW1lIik7CisgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBuLmdldFRleHRBdHRyaWJ1dGUoInByb3BlcnR5Iik7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW0gPSBuLmdldFRleHRBdHRyaWJ1dGUoInBhcmFtIik7CisgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZSB2YWx1ZSA9IG4uZ2V0VmFsdWUoKTsKKworICAgICAgICAgICAgbi5zZXRCZWdpbkphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKworICAgICAgICAgICAgaWYgKCIqIi5lcXVhbHMocHJvcGVydHkpKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmludHJvc3BlY3QoIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiX2pzcHhfcGFnZV9jb250ZXh0LmZpbmRBdHRyaWJ1dGUoIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIiCisgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiKSwgcmVxdWVzdCk7Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBwcm9wZXJ0eTsgLy8gZGVmYXVsdCB0byBzYW1lIGFzIHByb3BlcnR5CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmludHJvc3BlY3RoZWxwZXIoIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiX2pzcHhfcGFnZV9jb250ZXh0LmZpbmRBdHRyaWJ1dGUoXCIiCisgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiKSwgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICArIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICArICJcIiwgcmVxdWVzdC5nZXRQYXJhbWV0ZXIoXCIiCisgICAgICAgICAgICAgICAgICAgICAgICArIHBhcmFtCisgICAgICAgICAgICAgICAgICAgICAgICArICJcIiksICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInJlcXVlc3QsIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwYXJhbQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsIGZhbHNlKTsiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXNFeHByZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuaGFuZGxlU2V0UHJvcGVydHkoIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiX2pzcHhfcGFnZV9jb250ZXh0LmZpbmRBdHRyaWJ1dGUoXCIiCisgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiKSwgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICArIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICArICJcIiwiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoYXR0cmlidXRlVmFsdWUodmFsdWUsIGZhbHNlLCBudWxsKSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmlzRUxJbnRlcnByZXRlcklucHV0KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSd2ZSBnb3QgdG8gcmVzb2x2ZSB0aGUgdmVyeSBjYWxsIHRvIHRoZSBpbnRlcnByZXRlcgorICAgICAgICAgICAgICAgIC8vIGF0IHJ1bnRpbWUgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGF0IHR5cGUgdG8gZXhwZWN0CisgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGdlbmVyYWwgY2FzZTsgd2UgdGh1cyBjYW4ndCBoYXJkLXdpcmUgdGhlIGNhbGwKKyAgICAgICAgICAgICAgICAvLyBpbnRvIHRoZSBnZW5lcmF0ZWQgY29kZS4gIChYWFggV2UgY291bGQsIGhvd2V2ZXIsCisgICAgICAgICAgICAgICAgLy8gb3B0aW1pemUgdGhlIGNhc2Ugd2hlcmUgdGhlIGJlYW4gaXMgZXhwb3NlZCB3aXRoCisgICAgICAgICAgICAgICAgLy8gPGpzcDp1c2VCZWFuPiwgbXVjaCBhcyB0aGUgY29kZSBoZXJlIGRvZXMgZm9yCisgICAgICAgICAgICAgICAgLy8gZ2V0UHJvcGVydHkuKQorCisgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBob2xkcyB0cnVlIGZvciB0aGUgYXJndW1lbnRzIHBhc3NlZCB0bworICAgICAgICAgICAgICAgIC8vIEpzcFJ1bnRpbWVMaWJyYXJ5LmhhbmRsZVNldFByb3BlcnR5RXhwcmVzc2lvbigpOgorICAgICAgICAgICAgICAgIC8vIC0gJ3BhZ2VDb250ZXh0JyBpcyBhIFZhcmlhYmxlUmVzb2x2ZXIuCisgICAgICAgICAgICAgICAgLy8gLSAndGhpcycgKGVpdGhlciB0aGUgZ2VuZXJhdGVkIFNlcnZsZXQgb3IgdGhlIGdlbmVyYXRlZCB0YWcKKyAgICAgICAgICAgICAgICAvLyAgIGhhbmRsZXIgZm9yIFRhZyBmaWxlcykgaXMgYSBGdW5jdGlvbk1hcHBlci4KKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuaGFuZGxlU2V0UHJvcGVydHlFeHByZXNzaW9uKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl9qc3B4X3BhZ2VfY29udGV4dC5maW5kQXR0cmlidXRlKFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICJcIiksIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcXVvdGUodmFsdWUuZ2V0VmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiX2pzcHhfcGFnZV9jb250ZXh0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHZhbHVlLmdldEVMKCkuZ2V0TWFwTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICArICIpOyIpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pc05hbWVkQXR0cmlidXRlKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgZm9yIHNldFByb3BlcnR5IHdhcyBzcGVjaWZpZWQgdmlhCisgICAgICAgICAgICAgICAgLy8ganNwOmF0dHJpYnV0ZSwgZmlyc3QgZ2VuZXJhdGUgY29kZSB0byBldmFsdWF0ZQorICAgICAgICAgICAgICAgIC8vIHRoYXQgYm9keS4KKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWVWYXJOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVOYW1lZEF0dHJpYnV0ZVZhbHVlKHZhbHVlLmdldE5hbWVkQXR0cmlidXRlTm9kZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuaW50cm9zcGVjdGhlbHBlcigiCisgICAgICAgICAgICAgICAgICAgICAgICArICJfanNweF9wYWdlX2NvbnRleHQuZmluZEF0dHJpYnV0ZShcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIpLCBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHZhbHVlVmFyTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBudWxsLCBudWxsLCBmYWxzZSk7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGluKAorICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS5pbnRyb3NwZWN0aGVscGVyKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl9qc3B4X3BhZ2VfY29udGV4dC5maW5kQXR0cmlidXRlKFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICJcIiksIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsICIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChhdHRyaWJ1dGVWYWx1ZSh2YWx1ZSwgZmFsc2UsIG51bGwpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCBudWxsLCBudWxsLCBmYWxzZSk7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG4uc2V0RW5kSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Vc2VCZWFuIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgiaWQiKTsKKyAgICAgICAgICAgIFN0cmluZyBzY29wZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgic2NvcGUiKTsKKyAgICAgICAgICAgIFN0cmluZyBrbGFzcyA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgiY2xhc3MiKTsKKyAgICAgICAgICAgIFN0cmluZyB0eXBlID0gbi5nZXRUZXh0QXR0cmlidXRlKCJ0eXBlIik7CisgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZSBiZWFuTmFtZSA9IG4uZ2V0QmVhbk5hbWUoKTsKKworICAgICAgICAgICAgLy8gSWYgImNsYXNzIiBpcyBzcGVjaWZpZWQsIHRyeSBhbiBpbnN0YW50aWF0aW9uIGF0IGNvbXBpbGUgdGltZQorICAgICAgICAgICAgYm9vbGVhbiBnZW5lcmF0ZU5ldyA9IGZhbHNlOworICAgICAgICAgICAgU3RyaW5nIGNhbm9uaWNhbE5hbWUgPSBudWxsOyAgICAvLyBDYW5vbmljYWwgbmFtZSBmb3Iga2xhc3MKKyAgICAgICAgICAgIGlmIChrbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYmVhbiA9IGN0eHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3Moa2xhc3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoa2xhc3MuaW5kZXhPZignJCcpID49IDApICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPYnRhaW4gdGhlIGNhbm9uaWNhbCB0eXBlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbE5hbWUgPSBKc3BVdGlsLmdldENhbm9uaWNhbE5hbWUoYmVhbik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW5vbmljYWxOYW1lID0ga2xhc3M7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVycyA9IGJlYW4uZ2V0TW9kaWZpZXJzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpZXIuaXNJbnRlcmZhY2UobW9kaWZpZXJzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpZXIuaXNBYnN0cmFjdChtb2RpZmllcnMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIGJlYW4gY2xhc3MgbW9kaWZpZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZXJlIGlzIGEgMCBhcmcgY29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICAgICAgYmVhbi5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEF0IGNvbXBpbGUgdGltZSwgd2UgaGF2ZSBkZXRlcm1pbmVkIHRoYXQgdGhlIGJlYW4gY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RzLCB3aXRoIGEgcHVibGljIHplcm8gY29uc3RydWN0b3IsIG5ldygpIGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAvLyB1c2VkIGZvciBiZWFuIGluc3RhbnRpYXRpb24uCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlTmV3ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBDYW5ub3QgaW5zdGFudGlhdGUgdGhlIHNwZWNpZmllZCBjbGFzcywgZWl0aGVyIGEKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcGlsYXRpb24gZXJyb3Igb3IgYSBydW50aW1lIGVycm9yIHdpbGwgYmUgcmFpc2VkLAorICAgICAgICAgICAgICAgICAgICAvLyBkZXBlbmRpbmcgb24gYSBjb21waWxlciBmbGFnLgorICAgICAgICAgICAgICAgICAgICBpZihjdHh0LmdldE9wdGlvbnMoKS5nZXRFcnJvck9uVXNlQmVhbkludmFsaWRDbGFzc0F0dHJpYnV0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5pbnZhbGlkLmJlYW4iLCBrbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbm9uaWNhbE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9pbmcgb3VyIGJlc3QgaGVyZSB0byBnZXQgYSBjYW5vbmljYWwgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgYmluYXJ5IG5hbWUsIHNob3VsZCB3b3JrIDk5Ljk5JSBvZiB0aW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsTmFtZSA9IGtsYXNzLnJlcGxhY2UoJyQnLCcuJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0eXBlIGlzIHVuc3BlY2lmaWVkLCB1c2UgImNsYXNzIiBhcyB0eXBlIG9mIGJlYW4KKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGNhbm9uaWNhbE5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgc2NvcGVuYW1lID0gIlBhZ2VDb250ZXh0LlBBR0VfU0NPUEUiOyAvLyBEZWZhdWx0IHRvIHBhZ2UKKyAgICAgICAgICAgIFN0cmluZyBsb2NrID0gIl9qc3B4X3BhZ2VfY29udGV4dCI7CisKKyAgICAgICAgICAgIGlmICgicmVxdWVzdCIuZXF1YWxzKHNjb3BlKSkgeworICAgICAgICAgICAgICAgIHNjb3BlbmFtZSA9ICJQYWdlQ29udGV4dC5SRVFVRVNUX1NDT1BFIjsKKyAgICAgICAgICAgICAgICBsb2NrID0gInJlcXVlc3QiOworICAgICAgICAgICAgfSBlbHNlIGlmICgic2Vzc2lvbiIuZXF1YWxzKHNjb3BlKSkgeworICAgICAgICAgICAgICAgIHNjb3BlbmFtZSA9ICJQYWdlQ29udGV4dC5TRVNTSU9OX1NDT1BFIjsKKyAgICAgICAgICAgICAgICBsb2NrID0gInNlc3Npb24iOworICAgICAgICAgICAgfSBlbHNlIGlmICgiYXBwbGljYXRpb24iLmVxdWFscyhzY29wZSkpIHsKKyAgICAgICAgICAgICAgICBzY29wZW5hbWUgPSAiUGFnZUNvbnRleHQuQVBQTElDQVRJT05fU0NPUEUiOworICAgICAgICAgICAgICAgIGxvY2sgPSAiYXBwbGljYXRpb24iOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworCisgICAgICAgICAgICAvLyBEZWNsYXJlIGJlYW4KKyAgICAgICAgICAgIG91dC5wcmludGluKHR5cGUpOworICAgICAgICAgICAgb3V0LnByaW50KCcgJyk7CisgICAgICAgICAgICBvdXQucHJpbnQobmFtZSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiID0gbnVsbDsiKTsKKworICAgICAgICAgICAgLy8gTG9jayB3aGlsZSBnZXR0aW5nIG9yIGNyZWF0aW5nIGJlYW4KKyAgICAgICAgICAgIG91dC5wcmludGluKCJzeW5jaHJvbml6ZWQgKCIpOworICAgICAgICAgICAgb3V0LnByaW50KGxvY2spOworICAgICAgICAgICAgb3V0LnByaW50bG4oIikgeyIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKworICAgICAgICAgICAgLy8gTG9jYXRlIGJlYW4gZnJvbSBjb250ZXh0CisgICAgICAgICAgICBvdXQucHJpbnRpbihuYW1lKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiID0gKCIpOworICAgICAgICAgICAgb3V0LnByaW50KHR5cGUpOworICAgICAgICAgICAgb3V0LnByaW50KCIpIF9qc3B4X3BhZ2VfY29udGV4dC5nZXRBdHRyaWJ1dGUoIik7CisgICAgICAgICAgICBvdXQucHJpbnQocXVvdGUobmFtZSkpOworICAgICAgICAgICAgb3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgb3V0LnByaW50KHNjb3BlbmFtZSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiKTsiKTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIGJlYW4KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDaGVjayBpZiBiZWFuIGlzIGFscmVkeSB0aGVyZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBvdXQucHJpbnRpbigiaWYgKCIpOworICAgICAgICAgICAgb3V0LnByaW50KG5hbWUpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIiA9PSBudWxsKXsiKTsKKyAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICBpZiAoa2xhc3MgPT0gbnVsbCAmJiBiZWFuTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBJZiBib3RoIGNsYXNzIG5hbWUgYW5kIGJlYW5OYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBiZWFuCisgICAgICAgICAgICAgICAgICogbXVzdCBiZSBmb3VuZCBsb2NhbGx5LCBvdGhlcndpc2UgaXQncyBhbiBlcnJvcgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG91dC5wcmludGluKAorICAgICAgICAgICAgICAgICAgICAidGhyb3cgbmV3IGphdmEubGFuZy5JbnN0YW50aWF0aW9uRXhjZXB0aW9uKFwiYmVhbiAiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQobmFtZSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiBub3QgZm91bmQgd2l0aGluIHNjb3BlXCIpOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEluc3RhbnRpYXRlIHRoZSBiZWFuIGlmIGl0IGlzIG5vdCBpbiB0aGUgc3BlY2lmaWVkIHNjb3BlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICghZ2VuZXJhdGVOZXcpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJpbmFyeU5hbWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChiZWFuTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmVhbk5hbWUuaXNOYW1lZEF0dHJpYnV0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGZvciBiZWFuTmFtZSB3YXMgc3BlY2lmaWVkIHZpYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGpzcDphdHRyaWJ1dGUsIGZpcnN0IGdlbmVyYXRlIGNvZGUgdG8gZXZhbHVhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGJvZHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5TmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlTmFtZWRBdHRyaWJ1dGVWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW5OYW1lLmdldE5hbWVkQXR0cmlidXRlTm9kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5TmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlKGJlYW5OYW1lLCBmYWxzZSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEltcGxpZXMga2xhc3MgaXMgbm90IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmFyeU5hbWUgPSBxdW90ZShrbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoInRyeSB7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiA9ICgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHR5cGUpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIikgamF2YS5iZWFucy5CZWFucy5pbnN0YW50aWF0ZSgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCJ0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChiaW5hcnlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogTm90ZTogQmVhbnMuaW5zdGFudGlhdGUgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICogaWYgdGhlIGJlYW4gY2xhc3MgaXMgYWJzdHJhY3QuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgifSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleGMpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgICAgICAgICAidGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oZXhjLmdldE1lc3NhZ2UoKSk7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIn0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oInRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIlwiQ2Fubm90IGNyZWF0ZSBiZWFuIG9mIGNsYXNzIFwiICsgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChiaW5hcnlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwgZXhjKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOyAvLyBjbG9zZSBvZiB0cnkKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBJbXBsaWVzIGtsYXNzIGlzIG5vdCBudWxsCisgICAgICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlIGNvZGVzIHRvIGluc3RhbnRpYXRlIHRoZSBiZWFuIGNsYXNzCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiA9IG5ldyAiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KGNhbm9uaWNhbE5hbWUpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiKCk7Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2V0IGF0dHJpYnV0ZSBmb3IgYmVhbiBpbiB0aGUgc3BlY2lmaWVkIHNjb3BlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oIl9qc3B4X3BhZ2VfY29udGV4dC5zZXRBdHRyaWJ1dGUoIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KHF1b3RlKG5hbWUpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KG5hbWUpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoc2NvcGVuYW1lKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiKTsiKTsKKworICAgICAgICAgICAgICAgIC8vIE9ubHkgdmlzaXQgdGhlIGJvZHkgd2hlbiBiZWFuIGlzIGluc3RhbnRpYXRlZAorICAgICAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIEVuZCBvZiBsb2NrIGJsb2NrCisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOworCisgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGZvciB0aGUgZm9ybSAnYXR0ciA9ICJ2YWx1ZSInCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFN0cmluZyBtYWtlQXR0cihTdHJpbmcgYXR0ciwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisKKyAgICAgICAgICAgIHJldHVybiAiICIgKyBhdHRyICsgIj1cIiIgKyB2YWx1ZSArICdcIic7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlBsdWdJbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBBIHZpc2l0b3IgdG8gaGFuZGxlIDxqc3A6cGFyYW0+IGluIGEgcGx1Z2luCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNsYXNzIFBhcmFtVmlzaXRvciBleHRlbmRzIE5vZGUuVmlzaXRvciB7CisKKyAgICAgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gaWU7CisKKyAgICAgICAgICAgICAgICBQYXJhbVZpc2l0b3IoYm9vbGVhbiBpZSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmllID0gaWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5QYXJhbUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgibmFtZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJvYmplY3QiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiamF2YV9vYmplY3QiOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInR5cGUiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiamF2YV90eXBlIjsKKworICAgICAgICAgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICAgICAgICAgICAgICAvLyBYWFggLSBGaXhlZCBhIGJ1ZyBoZXJlIC0gdmFsdWUgdXNlZCB0byBiZSBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lLCB3aGljaCBpcyBvbmx5IG9rYXkgaWYgdmFsdWUgaXMgbm90IGFuIEVMCisgICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3Npb24uICBBbHNvLCBrZXkvdmFsdWUgcGFpcnMgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBlbWJlZCB0YWcgd2VyZSBub3QgYmVpbmcgZ2VuZXJhdGVkIGNvcnJlY3RseS4KKyAgICAgICAgICAgICAgICAgICAgLy8gRG91YmxlIGNoZWNrIHRoYXQgdGhpcyBpcyBub3cgdGhlIGNvcnJlY3QgYmVoYXZpb3IuCisgICAgICAgICAgICAgICAgICAgIGlmIChpZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCBzb21ldGhpbmcgb2YgdGhlIGZvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dC5wcmludGxuKCAiPHBhcmFtIG5hbWU9XCJibGFoXCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB2YWx1ZT1cIiIgKyAuLi4gKyAiXCI+IiApOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dC53cml0ZSggXCI8cGFyYW0gbmFtZT1cXFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVzY2FwZShuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcXFwiIHZhbHVlPVxcXCJcIiArICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhdHRyaWJ1dGVWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZ2V0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgKyBcIlxcXCI+XCIgKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHNvbWV0aGluZyBvZiB0aGUgZm9ybQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0LnByaW50KCAiIGJsYWg9XCIiICsgLi4uICsgIlwiIiApOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dC53cml0ZSggXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVzY2FwZShuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI9XFxcIlwiICsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGF0dHJpYnV0ZVZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiArIFwiXFxcIlwiICk7Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyB0eXBlID0gbi5nZXRUZXh0QXR0cmlidXRlKCJ0eXBlIik7CisgICAgICAgICAgICBTdHJpbmcgY29kZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgiY29kZSIpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuLmdldFRleHRBdHRyaWJ1dGUoIm5hbWUiKTsKKyAgICAgICAgICAgIE5vZGUuSnNwQXR0cmlidXRlIGhlaWdodCA9IG4uZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZSB3aWR0aCA9IG4uZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIFN0cmluZyBoc3BhY2UgPSBuLmdldFRleHRBdHRyaWJ1dGUoImhzcGFjZSIpOworICAgICAgICAgICAgU3RyaW5nIHZzcGFjZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgidnNwYWNlIik7CisgICAgICAgICAgICBTdHJpbmcgYWxpZ24gPSBuLmdldFRleHRBdHRyaWJ1dGUoImFsaWduIik7CisgICAgICAgICAgICBTdHJpbmcgaWVwbHVnaW51cmwgPSBuLmdldFRleHRBdHRyaWJ1dGUoImllcGx1Z2ludXJsIik7CisgICAgICAgICAgICBTdHJpbmcgbnNwbHVnaW51cmwgPSBuLmdldFRleHRBdHRyaWJ1dGUoIm5zcGx1Z2ludXJsIik7CisgICAgICAgICAgICBTdHJpbmcgY29kZWJhc2UgPSBuLmdldFRleHRBdHRyaWJ1dGUoImNvZGViYXNlIik7CisgICAgICAgICAgICBTdHJpbmcgYXJjaGl2ZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgiYXJjaGl2ZSIpOworICAgICAgICAgICAgU3RyaW5nIGpyZXZlcnNpb24gPSBuLmdldFRleHRBdHRyaWJ1dGUoImpyZXZlcnNpb24iKTsKKworICAgICAgICAgICAgU3RyaW5nIHdpZHRoU3RyID0gbnVsbDsKKyAgICAgICAgICAgIGlmICh3aWR0aCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHdpZHRoLmlzTmFtZWRBdHRyaWJ1dGUoKSkgeworICAgICAgICAgICAgICAgICAgICB3aWR0aFN0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZU5hbWVkQXR0cmlidXRlVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGguZ2V0TmFtZWRBdHRyaWJ1dGVOb2RlKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdpZHRoU3RyID0gYXR0cmlidXRlVmFsdWUod2lkdGgsIGZhbHNlLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGhlaWdodFN0ciA9IG51bGw7CisgICAgICAgICAgICBpZiAoaGVpZ2h0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGVpZ2h0LmlzTmFtZWRBdHRyaWJ1dGUoKSkgeworICAgICAgICAgICAgICAgICAgICBoZWlnaHRTdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVOYW1lZEF0dHJpYnV0ZVZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodC5nZXROYW1lZEF0dHJpYnV0ZU5vZGUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0U3RyID0gYXR0cmlidXRlVmFsdWUoaGVpZ2h0LCBmYWxzZSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpZXBsdWdpbnVybCA9PSBudWxsKQorICAgICAgICAgICAgICAgIGllcGx1Z2ludXJsID0gQ29uc3RhbnRzLklFX1BMVUdJTl9VUkw7CisgICAgICAgICAgICBpZiAobnNwbHVnaW51cmwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBuc3BsdWdpbnVybCA9IENvbnN0YW50cy5OU19QTFVHSU5fVVJMOworCisgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworCisgICAgICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIHBhcmFtcyBoYXZlIHRoZWlyIHZhbHVlcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgIC8vIGpzcDphdHRyaWJ1dGUsIHByZXBhcmUgdGhvc2UgdmFsdWVzIGZpcnN0LgorICAgICAgICAgICAgLy8gTG9vayBmb3IgYSBwYXJhbXMgbm9kZSBhbmQgcHJlcGFyZSBpdHMgcGFyYW0gc3ViZWxlbWVudHM6CisgICAgICAgICAgICBOb2RlLkpzcEJvZHkganNwQm9keSA9IGZpbmRKc3BCb2R5KG4pOworICAgICAgICAgICAgaWYgKGpzcEJvZHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE5vZGUuTm9kZXMgc3ViZWxlbWVudHMgPSBqc3BCb2R5LmdldEJvZHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3ViZWxlbWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YmVsZW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIG0gPSBzdWJlbGVtZW50cy5nZXROb2RlKGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gaW5zdGFuY2VvZiBOb2RlLlBhcmFtc0FjdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVQYXJhbXMobSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFhYWCAtIEZpeGVkIGEgYnVnIGhlcmUgLSB3aWR0aCBhbmQgaGVpZ2h0IGNhbiBiZSBzZXQKKyAgICAgICAgICAgIC8vIGR5bmFtaWNhbGx5LiAgRG91YmxlLWNoZWNrIGlmIHRoaXMgZ2VuZXJhdGlvbiBpcyBjb3JyZWN0LgorCisgICAgICAgICAgICAvLyBJRSBzdHlsZSBwbHVnaW4KKyAgICAgICAgICAgIC8vIDxvYmplY3QgLi4uPgorICAgICAgICAgICAgLy8gRmlyc3QgY29tcG9zZSB0aGUgcnVudGltZSBvdXRwdXQgc3RyaW5nCisgICAgICAgICAgICBTdHJpbmcgczAgPSAiPG9iamVjdCIKKyAgICAgICAgICAgICAgICAgICAgKyBtYWtlQXR0cigiY2xhc3NpZCIsIGN0eHQuZ2V0T3B0aW9ucygpLmdldEllQ2xhc3NJZCgpKQorICAgICAgICAgICAgICAgICAgICArIG1ha2VBdHRyKCJuYW1lIiwgbmFtZSk7CisKKyAgICAgICAgICAgIFN0cmluZyBzMSA9ICIiOworICAgICAgICAgICAgaWYgKHdpZHRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzMSA9ICIgKyBcIiB3aWR0aD1cXFwiXCIgKyAiICsgd2lkdGhTdHIgKyAiICsgXCJcXFwiXCIiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgczIgPSAiIjsKKyAgICAgICAgICAgIGlmIChoZWlnaHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHMyID0gIiArIFwiIGhlaWdodD1cXFwiXCIgKyAiICsgaGVpZ2h0U3RyICsgIiArIFwiXFxcIlwiIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIHMzID0gbWFrZUF0dHIoImhzcGFjZSIsIGhzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgKyBtYWtlQXR0cigidnNwYWNlIiwgdnNwYWNlKQorICAgICAgICAgICAgICAgICAgICArIG1ha2VBdHRyKCJhbGlnbiIsIGFsaWduKQorICAgICAgICAgICAgICAgICAgICArIG1ha2VBdHRyKCJjb2RlYmFzZSIsIGllcGx1Z2ludXJsKQorICAgICAgICAgICAgICAgICAgICArICc+JzsKKworICAgICAgICAgICAgLy8gVGhlbiBwcmludCB0aGUgb3V0cHV0IHN0cmluZyB0byB0aGUgamF2YSBmaWxlCisgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAib3V0LndyaXRlKCIgKyBxdW90ZShzMCkgKyBzMSArIHMyICsgIiArICIgKyBxdW90ZShzMykgKyAiKTsiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisKKyAgICAgICAgICAgIC8vIDxwYXJhbSA+IGZvciBqYXZhX2NvZGUKKyAgICAgICAgICAgIHMwID0gIjxwYXJhbSBuYW1lPVwiamF2YV9jb2RlXCIiICsgbWFrZUF0dHIoInZhbHVlIiwgY29kZSkgKyAnPic7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgib3V0LndyaXRlKCIgKyBxdW90ZShzMCkgKyAiKTsiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisKKyAgICAgICAgICAgIC8vIDxwYXJhbSA+IGZvciBqYXZhX2NvZGViYXNlCisgICAgICAgICAgICBpZiAoY29kZWJhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHMwID0gIjxwYXJhbSBuYW1lPVwiamF2YV9jb2RlYmFzZVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtYWtlQXR0cigidmFsdWUiLCBjb2RlYmFzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgJz4nOworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoIiArIHF1b3RlKHMwKSArICIpOyIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIDxwYXJhbSA+IGZvciBqYXZhX2FyY2hpdmUKKyAgICAgICAgICAgIGlmIChhcmNoaXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzMCA9ICI8cGFyYW0gbmFtZT1cImphdmFfYXJjaGl2ZVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtYWtlQXR0cigidmFsdWUiLCBhcmNoaXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAnPic7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dC53cml0ZSgiICsgcXVvdGUoczApICsgIik7Iik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dC53cml0ZShcIlxcblwiKTsiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gPHBhcmFtID4gZm9yIHR5cGUKKyAgICAgICAgICAgIHMwID0gIjxwYXJhbSBuYW1lPVwidHlwZVwiIgorICAgICAgICAgICAgICAgICAgICArIG1ha2VBdHRyKAorICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94LWphdmEtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKGpyZXZlcnNpb24gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJ2ZXJzaW9uPSIgKyBqcmV2ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICAgICAgKyAnPic7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgib3V0LndyaXRlKCIgKyBxdW90ZShzMCkgKyAiKTsiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBnZW5lcmF0ZSBhIDxwYXJhbT4gZm9yIGVhY2ggPGpzcDpwYXJhbT4gaW4gdGhlIHBsdWdpbiBib2R5CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChuLmdldEJvZHkoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIG4uZ2V0Qm9keSgpLnZpc2l0KG5ldyBQYXJhbVZpc2l0b3IodHJ1ZSkpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogTmV0c2NhcGUgc3R5bGUgcGx1Z2luIHBhcnQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dC53cml0ZSgiICsgcXVvdGUoIjxjb21tZW50PiIpICsgIik7Iik7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgib3V0LndyaXRlKFwiXFxuXCIpOyIpOworICAgICAgICAgICAgczAgPSAiPGVtYmVkIgorICAgICAgICAgICAgICAgICAgICArIG1ha2VBdHRyKAorICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtamF2YS0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoanJldmVyc2lvbiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInZlcnNpb249IiArIGpyZXZlcnNpb24pKQorICAgICAgICAgICAgICAgICAgICArIG1ha2VBdHRyKCJuYW1lIiwgbmFtZSk7CisKKyAgICAgICAgICAgIC8vIHMxIGFuZCBzMiBhcmUgdGhlIHNhbWUgYXMgYmVmb3JlLgorCisgICAgICAgICAgICBzMyA9IG1ha2VBdHRyKCJoc3BhY2UiLCBoc3BhY2UpCisgICAgICAgICAgICAgICAgICAgICsgbWFrZUF0dHIoInZzcGFjZSIsIHZzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgKyBtYWtlQXR0cigiYWxpZ24iLCBhbGlnbikKKyAgICAgICAgICAgICAgICAgICAgKyBtYWtlQXR0cigicGx1Z2luc3BhZ2UiLCBuc3BsdWdpbnVybCkKKyAgICAgICAgICAgICAgICAgICAgKyBtYWtlQXR0cigiamF2YV9jb2RlIiwgY29kZSkKKyAgICAgICAgICAgICAgICAgICAgKyBtYWtlQXR0cigiamF2YV9jb2RlYmFzZSIsIGNvZGViYXNlKQorICAgICAgICAgICAgICAgICAgICArIG1ha2VBdHRyKCJqYXZhX2FyY2hpdmUiLCBhcmNoaXZlKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICJvdXQud3JpdGUoIiArIHF1b3RlKHMwKSArIHMxICsgczIgKyAiICsgIiArIHF1b3RlKHMzKSArICIpOyIpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogR2VuZXJhdGUgYSAnYXR0ciA9ICJ2YWx1ZSInIGZvciBlYWNoIDxqc3A6cGFyYW0+IGluIHBsdWdpbiBib2R5CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChuLmdldEJvZHkoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIG4uZ2V0Qm9keSgpLnZpc2l0KG5ldyBQYXJhbVZpc2l0b3IoZmFsc2UpKTsKKworICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dC53cml0ZSgiICsgcXVvdGUoIi8+IikgKyAiKTsiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoIiArIHF1b3RlKCI8bm9lbWJlZD4iKSArICIpOyIpOworICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dC53cml0ZShcIlxcblwiKTsiKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEZhbGxiYWNrCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChuLmdldEJvZHkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoIiArIHF1b3RlKCI8L25vZW1iZWQ+IikgKyAiKTsiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoIiArIHF1b3RlKCI8L2NvbW1lbnQ+IikgKyAiKTsiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoIiArIHF1b3RlKCI8L29iamVjdD4iKSArICIpOyIpOworICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dC53cml0ZShcIlxcblwiKTsiKTsKKworICAgICAgICAgICAgbi5zZXRFbmRKYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLk5hbWVkQXR0cmlidXRlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgLy8gRG9uJ3QgdmlzaXQgYm9keSBvZiB0aGlzIHRhZyAtIHdlIGFscmVhZHkgZGlkIGVhcmxpZXIuCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkN1c3RvbVRhZyBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgLy8gVXNlIHBsdWdpbiB0byBnZW5lcmF0ZSBtb3JlIGVmZmljaWVudCBjb2RlIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgICAgICAgIGlmIChuLnVzZVRhZ1BsdWdpbigpKSB7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVUYWdQbHVnaW4obik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUYWdIYW5kbGVySW5mbyBoYW5kbGVySW5mbyA9IGdldFRhZ0hhbmRsZXJJbmZvKG4pOworCisgICAgICAgICAgICAvLyBDcmVhdGUgdmFyaWFibGUgbmFtZXMKKyAgICAgICAgICAgIFN0cmluZyBiYXNlVmFyID0KKyAgICAgICAgICAgICAgICBjcmVhdGVUYWdWYXJOYW1lKG4uZ2V0UU5hbWUoKSwgbi5nZXRQcmVmaXgoKSwgbi5nZXRMb2NhbE5hbWUoKSk7CisgICAgICAgICAgICBTdHJpbmcgdGFnRXZhbFZhciA9ICJfanNweF9ldmFsXyIgKyBiYXNlVmFyOworICAgICAgICAgICAgU3RyaW5nIHRhZ0hhbmRsZXJWYXIgPSAiX2pzcHhfdGhfIiArIGJhc2VWYXI7CisgICAgICAgICAgICBTdHJpbmcgdGFnUHVzaEJvZHlDb3VudFZhciA9ICJfanNweF9wdXNoX2JvZHlfY291bnRfIiArIGJhc2VWYXI7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSB0YWcgY29udGFpbnMgbm8gc2NyaXB0aW5nIGVsZW1lbnQsIGdlbmVyYXRlIGl0cyBjb2RlcworICAgICAgICAgICAgLy8gdG8gYSBtZXRob2QuCisgICAgICAgICAgICBTZXJ2bGV0V3JpdGVyIG91dFNhdmUgPSBudWxsOworICAgICAgICAgICAgTm9kZS5DaGlsZEluZm8gY2kgPSBuLmdldENoaWxkSW5mbygpOworICAgICAgICAgICAgaWYgKGNpLmlzU2NyaXB0bGVzcygpICYmICFjaS5oYXNTY3JpcHRpbmdWYXJzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgdGFnIGhhbmRsZXIgYW5kIGl0cyBib2R5IGNvZGUgY2FuIHJlc2lkZSBpbiBhIHNlcGFyYXRlCisgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGlmIGl0IGlzIHNjcmlwdGxlc3MgYW5kIGRvZXMgbm90IGhhdmUgYW55IHNjcmlwdGluZworICAgICAgICAgICAgICAgIC8vIHZhcmlhYmxlIGRlZmluZWQuCisKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGFnTWV0aG9kID0gIl9qc3B4X21ldGhfIiArIGJhc2VWYXI7CisKKyAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSBhIGNhbGwgdG8gdGhpcyBtZXRob2QKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigiaWYgKCIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCh0YWdNZXRob2QpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiKCIpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQocGFyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIl9qc3B4X3BhZ2VfY29udGV4dCIpOworICAgICAgICAgICAgICAgIGlmIChwdXNoQm9keUNvdW50VmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQocHVzaEJvZHlDb3VudFZhcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpKSIpOworICAgICAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoKG1ldGhvZE5lc3RpbmcgPiAwKSA/ICJyZXR1cm4gdHJ1ZTsiIDogInJldHVybjsiKTsKKyAgICAgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisKKyAgICAgICAgICAgICAgICAvLyBTZXQgdXAgbmV3IGJ1ZmZlciBmb3IgdGhlIG1ldGhvZAorICAgICAgICAgICAgICAgIG91dFNhdmUgPSBvdXQ7CisgICAgICAgICAgICAgICAgLyogRm9yIGZyYWdtZW50cywgdGhlaXIgYm9kaWVzIHdpbGwgYmUgZ2VuZXJhdGVkIGluIGZyYWdtZW50CisgICAgICAgICAgICAgICAgICAgaGVscGVyIGNsYXNzZXMsIGFuZCB0aGUgSmF2YSBsaW5lIGFkanVzdG1lbnRzIHdpbGwgYmUgZG9uZQorICAgICAgICAgICAgICAgICAgIHRoZXJlLCBoZW5jZSB0aGV5IGFyZSBzZXQgdG8gbnVsbCBoZXJlIHRvIGF2b2lkIGRvdWJsZQorICAgICAgICAgICAgICAgICAgIGFkanVzdG1lbnRzLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgR2VuQnVmZmVyIGdlbkJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBHZW5CdWZmZXIobiwgbi5pbXBsZW1lbnRzU2ltcGxlVGFnKCk/IG51bGw6IG4uZ2V0Qm9keSgpKTsKKyAgICAgICAgICAgICAgICBtZXRob2RzQnVmZmVyZWQuYWRkKGdlbkJ1ZmZlcik7CisgICAgICAgICAgICAgICAgb3V0ID0gZ2VuQnVmZmVyLmdldE91dCgpOworCisgICAgICAgICAgICAgICAgbWV0aG9kTmVzdGluZysrOworICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlIGNvZGUgZm9yIG1ldGhvZCBkZWNsYXJhdGlvbgorICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigicHJpdmF0ZSBib29sZWFuICIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCh0YWdNZXRob2QpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiKCIpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoImphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BUYWcgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChwYXJlbnQpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiUGFnZUNvbnRleHQgX2pzcHhfcGFnZV9jb250ZXh0Iik7CisgICAgICAgICAgICAgICAgaWYgKHB1c2hCb2R5Q291bnRWYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiwgaW50W10gIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChwdXNoQm9keUNvdW50VmFyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIikiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgiICAgICAgICB0aHJvd3MgVGhyb3dhYmxlIHsiKTsKKyAgICAgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworCisgICAgICAgICAgICAgICAgLy8gSW5pdGlsYWl6ZSBsb2NhbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIG1ldGhvZC4KKyAgICAgICAgICAgICAgICBpZiAoISBpc1RhZ0ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIlBhZ2VDb250ZXh0IHBhZ2VDb250ZXh0ID0gX2pzcHhfcGFnZV9jb250ZXh0OyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgiSnNwV3JpdGVyIG91dCA9IF9qc3B4X3BhZ2VfY29udGV4dC5nZXRPdXQoKTsiKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZUxvY2FsVmFyaWFibGVzKG91dCwgbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuLmltcGxlbWVudHNTaW1wbGVUYWcoKSkgeworICAgICAgICAgICAgICAgIGdlbmVyYXRlQ3VzdG9tRG9UYWcobiwgaGFuZGxlckluZm8sIHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENsYXNzaWMgdGFnIGhhbmRsZXI6IEdlbmVyYXRlIGNvZGUgZm9yIHN0YXJ0IGVsZW1lbnQsIGJvZHksCisgICAgICAgICAgICAgICAgICogYW5kIGVuZCBlbGVtZW50CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZ2VuZXJhdGVDdXN0b21TdGFydCgKKyAgICAgICAgICAgICAgICAgICAgbiwKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlckluZm8sCisgICAgICAgICAgICAgICAgICAgIHRhZ0hhbmRsZXJWYXIsCisgICAgICAgICAgICAgICAgICAgIHRhZ0V2YWxWYXIsCisgICAgICAgICAgICAgICAgICAgIHRhZ1B1c2hCb2R5Q291bnRWYXIpOworCisgICAgICAgICAgICAgICAgLy8gdmlzaXQgYm9keQorICAgICAgICAgICAgICAgIFN0cmluZyB0bXBQYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgICAgICAgICAgcGFyZW50ID0gdGFnSGFuZGxlclZhcjsKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzU2ltcGxlVGFnUGFyZW50U2F2ZSA9IGlzU2ltcGxlVGFnUGFyZW50OworICAgICAgICAgICAgICAgIGlzU2ltcGxlVGFnUGFyZW50ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRtcFB1c2hCb2R5Q291bnRWYXIgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChuLmltcGxlbWVudHNUcnlDYXRjaEZpbmFsbHkoKSkgeworICAgICAgICAgICAgICAgICAgICB0bXBQdXNoQm9keUNvdW50VmFyID0gcHVzaEJvZHlDb3VudFZhcjsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEJvZHlDb3VudFZhciA9IHRhZ1B1c2hCb2R5Q291bnRWYXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2xlYW4gdG1wSXNTaW1wbGVUYWdIYW5kbGVyID0gaXNTaW1wbGVUYWdIYW5kbGVyOworICAgICAgICAgICAgICAgIGlzU2ltcGxlVGFnSGFuZGxlciA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworCisgICAgICAgICAgICAgICAgcGFyZW50ID0gdG1wUGFyZW50OworICAgICAgICAgICAgICAgIGlzU2ltcGxlVGFnUGFyZW50ID0gaXNTaW1wbGVUYWdQYXJlbnRTYXZlOworICAgICAgICAgICAgICAgIGlmIChuLmltcGxlbWVudHNUcnlDYXRjaEZpbmFsbHkoKSkgeworICAgICAgICAgICAgICAgICAgICBwdXNoQm9keUNvdW50VmFyID0gdG1wUHVzaEJvZHlDb3VudFZhcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXNTaW1wbGVUYWdIYW5kbGVyID0gdG1wSXNTaW1wbGVUYWdIYW5kbGVyOworCisgICAgICAgICAgICAgICAgZ2VuZXJhdGVDdXN0b21FbmQoCisgICAgICAgICAgICAgICAgICAgIG4sCisgICAgICAgICAgICAgICAgICAgIHRhZ0hhbmRsZXJWYXIsCisgICAgICAgICAgICAgICAgICAgIHRhZ0V2YWxWYXIsCisgICAgICAgICAgICAgICAgICAgIHRhZ1B1c2hCb2R5Q291bnRWYXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2kuaXNTY3JpcHRsZXNzKCkgJiYgIWNpLmhhc1NjcmlwdGluZ1ZhcnMoKSkgeworICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlIGVuZCBvZiBtZXRob2QKKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kTmVzdGluZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoInJldHVybiBmYWxzZTsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworCisgICAgICAgICAgICAgICAgbWV0aG9kTmVzdGluZy0tOworCisgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBwcmV2aW91cyB3cml0ZXIKKyAgICAgICAgICAgICAgICBvdXQgPSBvdXRTYXZlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9RVU9URSA9ICInIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9RVU9URSA9ICJcXFwiIjsKKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlVuaW50ZXJwcmV0ZWRUYWcgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIG4uc2V0QmVnaW5KYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBXcml0ZSBiZWdpbiB0YWcKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgb3V0LnByaW50aW4oIm91dC53cml0ZShcIjwiKTsKKyAgICAgICAgICAgIG91dC5wcmludChuLmdldFFOYW1lKCkpOworCisgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzID0gbi5nZXROb25UYWdsaWJYbWxuc0F0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIGludCBhdHRyc0xlbiA9IChhdHRycyA9PSBudWxsKSA/IDAgOiBhdHRycy5nZXRMZW5ndGgoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnNMZW47IGkrKykgeworICAgICAgICAgICAgICAgIG91dC5wcmludCgiICIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChhdHRycy5nZXRRTmFtZShpKSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCI9Iik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHF1b3RlID0gRE9VQkxFX1FVT1RFOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGF0dHJzLmdldFZhbHVlKGkpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCciJykgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBTSU5HTEVfUVVPVEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5wcmludChxdW90ZSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KHZhbHVlKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQocXVvdGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdHRycyA9IG4uZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgYXR0cnNMZW4gPSAoYXR0cnMgPT0gbnVsbCkgPyAwIDogYXR0cnMuZ2V0TGVuZ3RoKCk7CisgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZVtdIGpzcEF0dHJzID0gbi5nZXRKc3BBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzTGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoYXR0cnMuZ2V0UU5hbWUoaSkpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiPSIpOworICAgICAgICAgICAgICAgIGlmIChqc3BBdHRyc1tpXS5pc0VMSW50ZXJwcmV0ZXJJbnB1dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiXFxcIlwiICsgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChhdHRyaWJ1dGVWYWx1ZShqc3BBdHRyc1tpXSwgZmFsc2UsIFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiArIFwiXFxcIiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxdW90ZSA9IERPVUJMRV9RVU9URTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cnMuZ2V0VmFsdWUoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCciJykgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlID0gU0lOR0xFX1FVT1RFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChxdW90ZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChxdW90ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobi5nZXRCb2R5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCI+XCIpOyIpOworCisgICAgICAgICAgICAgICAgLy8gVmlzaXQgdGFnIGJvZHkKKyAgICAgICAgICAgICAgICB2aXNpdEJvZHkobik7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFdyaXRlIGVuZCB0YWcKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigib3V0LndyaXRlKFwiPC8iKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQobi5nZXRRTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPlwiKTsiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIi8+XCIpOyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSnNwRWxlbWVudCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgbi5zZXRCZWdpbkphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKworICAgICAgICAgICAgLy8gQ29tcHV0ZSBhdHRyaWJ1dGUgdmFsdWUgc3RyaW5nIGZvciBYTUwtc3R5bGUgYW5kIG5hbWVkCisgICAgICAgICAgICAvLyBhdHRyaWJ1dGVzCisgICAgICAgICAgICBIYXNodGFibGUgbWFwID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICAgICAgTm9kZS5Kc3BBdHRyaWJ1dGVbXSBhdHRycyA9IG4uZ2V0SnNwQXR0cmlidXRlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGF0dHJzICE9IG51bGwgJiYgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJTdHIgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChhdHRyc1tpXS5pc05hbWVkQXR0cmlidXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0clN0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZU5hbWVkQXR0cmlidXRlVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNbaV0uZ2V0TmFtZWRBdHRyaWJ1dGVOb2RlKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJTdHIgPSBhdHRyaWJ1dGVWYWx1ZShhdHRyc1tpXSwgZmFsc2UsIE9iamVjdC5jbGFzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBzID0KKyAgICAgICAgICAgICAgICAgICAgIiArIFwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYXR0cnNbaV0uZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICArICI9XFxcIlwiICsgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBhdHRyU3RyCisgICAgICAgICAgICAgICAgICAgICAgICArICIgKyBcIlxcXCJcIiI7CisgICAgICAgICAgICAgICAgbWFwLnB1dChhdHRyc1tpXS5nZXROYW1lKCksIHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXcml0ZSBiZWdpbiB0YWcsIHVzaW5nIFhNTC1zdHlsZSAnbmFtZScgYXR0cmlidXRlIGFzIHRoZQorICAgICAgICAgICAgLy8gZWxlbWVudCBuYW1lCisgICAgICAgICAgICBTdHJpbmcgZWxlbU5hbWUgPQorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlKG4uZ2V0TmFtZUF0dHJpYnV0ZSgpLCBmYWxzZSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIG91dC5wcmludGluKCJvdXQud3JpdGUoXCI8XCIiKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiICsgIiArIGVsZW1OYW1lKTsKKworICAgICAgICAgICAgLy8gV3JpdGUgcmVtYWluaW5nIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gbWFwLmtleXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IChTdHJpbmcpZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoKFN0cmluZyltYXAuZ2V0KGF0dHJOYW1lKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERvZXMgdGhlIDxqc3A6ZWxlbWVudD4gaGF2ZSBuZXN0ZWQgdGFncyBvdGhlciB0aGFuCisgICAgICAgICAgICAvLyA8anNwOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIGJvb2xlYW4gaGFzQm9keSA9IGZhbHNlOworICAgICAgICAgICAgTm9kZS5Ob2RlcyBzdWJlbGVtZW50cyA9IG4uZ2V0Qm9keSgpOworICAgICAgICAgICAgaWYgKHN1YmVsZW1lbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YmVsZW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgc3ViZWxlbSA9IHN1YmVsZW1lbnRzLmdldE5vZGUoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHN1YmVsZW0gaW5zdGFuY2VvZiBOb2RlLk5hbWVkQXR0cmlidXRlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFzQm9keSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXNCb2R5KSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiArIFwiPlwiKTsiKTsKKworICAgICAgICAgICAgICAgIC8vIFNtYXAgc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBib2R5CisgICAgICAgICAgICAgICAgbi5zZXRFbmRKYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBWaXNpdCB0YWcgYm9keQorICAgICAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKworICAgICAgICAgICAgICAgIC8vIFdyaXRlIGVuZCB0YWcKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigib3V0LndyaXRlKFwiPC9cIiIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiICsgIiArIGVsZW1OYW1lKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICsgXCI+XCIpOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICsgXCIvPlwiKTsiKTsKKyAgICAgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVGVtcGxhdGVUZXh0IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG4uZ2V0VGV4dCgpOworCisgICAgICAgICAgICBpbnQgdGV4dFNpemUgPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgICAgICAgaWYgKHRleHRTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlcGxhY2UgbWFya2VyIGZvciBcJCBzZXF1ZW5jZSB3aXRoIGNvcnJlY3Qgc2VxdWVuY2UKKyAgICAgICAgICAgIGlmICh0ZXh0LmluZGV4T2YoQ29uc3RhbnRzLkhBQ0tfQ0hBUikgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhZ2VJbmZvLmlzRUxJZ25vcmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZUFsbChTdHJpbmcudmFsdWVPZihDb25zdGFudHMuSEFDS19DSEFSKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxcXFxcJCIpOworICAgICAgICAgICAgICAgICAgICB0ZXh0U2l6ZSsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoQ29uc3RhbnRzLkhBQ0tfQ0hBUiwgJyQnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0ZXh0U2l6ZSA8PSAzKSB7CisgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2Ugc21hbGwgdGV4dCBzdHJpbmdzCisgICAgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICAgICAgICAgaW50IGxpbmVJbmMgPSAwOworICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IHRleHQuY2hhckF0KGkpOworICAgICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoIiArIHF1b3RlKGNoKSArICIpOyIpOworICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICBuLmFkZFNtYXAobGluZUluYyk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGxpbmVJbmMrKzsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY3R4dC5nZXRPcHRpb25zKCkuZ2VuU3RyaW5nQXNDaGFyQXJyYXkoKSkgeworICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgU3RyaW5ncyBhcyBjaGFyIGFycmF5cywgZm9yIHBlcmZvcm1hbmNlCisgICAgICAgICAgICAgICAgU2VydmxldFdyaXRlciBjYU91dDsKKyAgICAgICAgICAgICAgICBpZiAoY2hhckFycmF5QnVmZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhckFycmF5QnVmZmVyID0gbmV3IEdlbkJ1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICBjYU91dCA9IGNoYXJBcnJheUJ1ZmZlci5nZXRPdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgY2FPdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgICAgICAgICB0ZXh0TWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjYU91dCA9IGNoYXJBcnJheUJ1ZmZlci5nZXRPdXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJBcnJheU5hbWUgPSAoU3RyaW5nKSB0ZXh0TWFwLmdldCh0ZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAoY2hhckFycmF5TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXJBcnJheU5hbWUgPSAiX2pzcHhfY2hhcl9hcnJheV8iICsgY2hhckFycmF5Q291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgdGV4dE1hcC5wdXQodGV4dCwgY2hhckFycmF5TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGNhT3V0LnByaW50aW4oInN0YXRpYyBjaGFyW10gIik7CisgICAgICAgICAgICAgICAgICAgIGNhT3V0LnByaW50KGNoYXJBcnJheU5hbWUpOworICAgICAgICAgICAgICAgICAgICBjYU91dC5wcmludCgiID0gIik7CisgICAgICAgICAgICAgICAgICAgIGNhT3V0LnByaW50KHF1b3RlKHRleHQpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FPdXQucHJpbnRsbigiLnRvQ2hhckFycmF5KCk7Iik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbi5zZXRCZWdpbkphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgib3V0LndyaXRlKCIgKyBjaGFyQXJyYXlOYW1lICsgIik7Iik7CisgICAgICAgICAgICAgICAgbi5zZXRFbmRKYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworCisgICAgICAgICAgICBvdXQucHJpbnRpbigpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigib3V0LndyaXRlKFwiIik7CisgICAgICAgICAgICBpbnQgaW5pdExlbmd0aCA9IHNiLmxlbmd0aCgpOworICAgICAgICAgICAgaW50IGNvdW50ID0gSnNwVXRpbC5DSFVOS1NJWkU7CisgICAgICAgICAgICBpbnQgc3JjTGluZSA9IDA7ICAgIC8vIHJlbGF0aXZlIHRvIHN0YXJ0aW5nIHNyb3VjZSBsaW5lCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAtLWNvdW50OworICAgICAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnIicgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcXCcpLmFwcGVuZCgnXCInKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCcgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcXCcpLmFwcGVuZCgnXFwnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdccicgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcXCcpLmFwcGVuZCgncicpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xuJyA6CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1xcJykuYXBwZW5kKCduJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmNMaW5lKys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicmVha0F0TEYgfHwgY291bnQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgYW4gb3V0LndyaXRlKCkgd2hlbiBzZWUgYSAnXG4nIGluIHRlbXBsYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcIik7Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCB0ZXh0Lmxlbmd0aCgpIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5zZXRMZW5ndGgoaW5pdExlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBKc3BVdGlsLkNIVU5LU0laRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBhIFNtYXAgZm9yIHRoaXMgbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgbi5hZGRTbWFwKHNyY0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1x0JyA6IC8vIE5vdCBzdXJlIHdlIG5lZWQgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcXCcpLmFwcGVuZCgndCcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IGluaXRMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlwiKTsiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbi5zZXRFbmRKYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkpzcEJvZHkgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobi5nZXRCb2R5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChpc1NpbXBsZVRhZ0hhbmRsZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oc2ltcGxlVGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiLnNldEpzcEJvZHkoIik7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlSnNwRnJhZ21lbnQobiwgc2ltcGxlVGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkludm9rZUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgbi5zZXRCZWdpbkphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKworICAgICAgICAgICAgLy8gQ29weSB2aXJ0dWFsIHBhZ2Ugc2NvcGUgb2YgdGFnIGZpbGUgdG8gcGFnZSBzY29wZSBvZiBpbnZva2luZworICAgICAgICAgICAgLy8gcGFnZQorICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgIigob3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BDb250ZXh0V3JhcHBlcikgdGhpcy5qc3BDb250ZXh0KS5zeW5jQmVmb3JlSW52b2tlKCk7Iik7CisgICAgICAgICAgICBTdHJpbmcgdmFyUmVhZGVyQXR0ciA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgidmFyUmVhZGVyIik7CisgICAgICAgICAgICBTdHJpbmcgdmFyQXR0ciA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgidmFyIik7CisgICAgICAgICAgICBpZiAodmFyUmVhZGVyQXR0ciAhPSBudWxsIHx8IHZhckF0dHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJfanNweF9zb3V0ID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJfanNweF9zb3V0ID0gbnVsbDsiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW52b2tlIGZyYWdtZW50LCB1bmxlc3MgZnJhZ21lbnQgaXMgbnVsbAorICAgICAgICAgICAgb3V0LnByaW50aW4oImlmICgiKTsKKyAgICAgICAgICAgIG91dC5wcmludCh0b0dldHRlck1ldGhvZChuLmdldFRleHRBdHRyaWJ1dGUoImZyYWdtZW50IikpKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIgIT0gbnVsbCkgeyIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGluKHRvR2V0dGVyTWV0aG9kKG4uZ2V0VGV4dEF0dHJpYnV0ZSgiZnJhZ21lbnQiKSkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIi5pbnZva2UoX2pzcHhfc291dCk7Iik7CisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOworCisgICAgICAgICAgICAvLyBTdG9yZSB2YXJSZWFkZXIgaW4gYXBwcm9wcmlhdGUgc2NvcGUKKyAgICAgICAgICAgIGlmICh2YXJSZWFkZXJBdHRyICE9IG51bGwgfHwgdmFyQXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHNjb3BlTmFtZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgic2NvcGUiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigiX2pzcHhfcGFnZV9jb250ZXh0LnNldEF0dHJpYnV0ZSgiKTsKKyAgICAgICAgICAgICAgICBpZiAodmFyUmVhZGVyQXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChxdW90ZSh2YXJSZWFkZXJBdHRyKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICIsIG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihfanNweF9zb3V0LnRvU3RyaW5nKCkpIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHF1b3RlKHZhckF0dHIpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIsIF9qc3B4X3NvdXQudG9TdHJpbmcoKSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2NvcGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoZ2V0U2NvcGVDb25zdGFudChzY29wZU5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG4uc2V0RW5kSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Eb0JvZHlBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIG4uc2V0QmVnaW5KYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisKKyAgICAgICAgICAgIC8vIENvcHkgdmlydHVhbCBwYWdlIHNjb3BlIG9mIHRhZyBmaWxlIHRvIHBhZ2Ugc2NvcGUgb2YgaW52b2tpbmcKKyAgICAgICAgICAgIC8vIHBhZ2UKKyAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICIoKG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwQ29udGV4dFdyYXBwZXIpIHRoaXMuanNwQ29udGV4dCkuc3luY0JlZm9yZUludm9rZSgpOyIpOworCisgICAgICAgICAgICAvLyBJbnZva2UgYm9keQorICAgICAgICAgICAgU3RyaW5nIHZhclJlYWRlckF0dHIgPSBuLmdldFRleHRBdHRyaWJ1dGUoInZhclJlYWRlciIpOworICAgICAgICAgICAgU3RyaW5nIHZhckF0dHIgPSBuLmdldFRleHRBdHRyaWJ1dGUoInZhciIpOworICAgICAgICAgICAgaWYgKHZhclJlYWRlckF0dHIgIT0gbnVsbCB8fCB2YXJBdHRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgiX2pzcHhfc291dCA9IG5ldyBqYXZhLmlvLlN0cmluZ1dyaXRlcigpOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgiX2pzcHhfc291dCA9IG51bGw7Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnRpbCgiaWYgKGdldEpzcEJvZHkoKSAhPSBudWxsKSIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJnZXRKc3BCb2R5KCkuaW52b2tlKF9qc3B4X3NvdXQpOyIpOworICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworCisgICAgICAgICAgICAvLyBTdG9yZSB2YXJSZWFkZXIgaW4gYXBwcm9wcmlhdGUgc2NvcGUKKyAgICAgICAgICAgIGlmICh2YXJSZWFkZXJBdHRyICE9IG51bGwgfHwgdmFyQXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHNjb3BlTmFtZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgic2NvcGUiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigiX2pzcHhfcGFnZV9jb250ZXh0LnNldEF0dHJpYnV0ZSgiKTsKKyAgICAgICAgICAgICAgICBpZiAodmFyUmVhZGVyQXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChxdW90ZSh2YXJSZWFkZXJBdHRyKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICIsIG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihfanNweF9zb3V0LnRvU3RyaW5nKCkpIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHF1b3RlKHZhckF0dHIpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIsIF9qc3B4X3NvdXQudG9TdHJpbmcoKSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2NvcGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoZ2V0U2NvcGVDb25zdGFudChzY29wZU5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG4uc2V0RW5kSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5BdHRyaWJ1dGVHZW5lcmF0b3IgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBOb2RlLkN1c3RvbVRhZyB0YWcgPSBuLmdldFRhZygpOworICAgICAgICAgICAgTm9kZS5Kc3BBdHRyaWJ1dGVbXSBhdHRycyA9IHRhZy5nZXRKc3BBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgYXR0cnMgIT0gbnVsbCAmJiBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXR0cnNbaV0uZ2V0TmFtZSgpLmVxdWFscyhuLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KAorICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGFnSGFuZGxlckluZm8odGFnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFRhZ0hhbmRsZXJJbmZvIGdldFRhZ0hhbmRsZXJJbmZvKE5vZGUuQ3VzdG9tVGFnIG4pCisgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEhhc2h0YWJsZSBoYW5kbGVySW5mb3NCeVNob3J0TmFtZSA9CisgICAgICAgICAgICAgICAgKEhhc2h0YWJsZSloYW5kbGVySW5mb3MuZ2V0KG4uZ2V0UHJlZml4KCkpOworICAgICAgICAgICAgaWYgKGhhbmRsZXJJbmZvc0J5U2hvcnROYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVySW5mb3NCeVNob3J0TmFtZSA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgICAgICAgICBoYW5kbGVySW5mb3MucHV0KG4uZ2V0UHJlZml4KCksIGhhbmRsZXJJbmZvc0J5U2hvcnROYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRhZ0hhbmRsZXJJbmZvIGhhbmRsZXJJbmZvID0KKyAgICAgICAgICAgICAgICAoVGFnSGFuZGxlckluZm8paGFuZGxlckluZm9zQnlTaG9ydE5hbWUuZ2V0KG4uZ2V0TG9jYWxOYW1lKCkpOworICAgICAgICAgICAgaWYgKGhhbmRsZXJJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVySW5mbyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBUYWdIYW5kbGVySW5mbyhuLCBuLmdldFRhZ0hhbmRsZXJDbGFzcygpLCBlcnIpOworICAgICAgICAgICAgICAgIGhhbmRsZXJJbmZvc0J5U2hvcnROYW1lLnB1dChuLmdldExvY2FsTmFtZSgpLCBoYW5kbGVySW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlckluZm87CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVUYWdQbHVnaW4oTm9kZS5DdXN0b21UYWcgbikKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG4uZ2V0QXRTVGFnKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG4uZ2V0QXRTVGFnKCkudmlzaXQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgICAgICBpZiAobi5nZXRBdEVUYWcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbi5nZXRBdEVUYWcoKS52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUN1c3RvbVN0YXJ0KAorICAgICAgICAgICAgTm9kZS5DdXN0b21UYWcgbiwKKyAgICAgICAgICAgIFRhZ0hhbmRsZXJJbmZvIGhhbmRsZXJJbmZvLAorICAgICAgICAgICAgU3RyaW5nIHRhZ0hhbmRsZXJWYXIsCisgICAgICAgICAgICBTdHJpbmcgdGFnRXZhbFZhciwKKyAgICAgICAgICAgIFN0cmluZyB0YWdQdXNoQm9keUNvdW50VmFyKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIENsYXNzIHRhZ0hhbmRsZXJDbGFzcyA9IGhhbmRsZXJJbmZvLmdldFRhZ0hhbmRsZXJDbGFzcygpOworCisgICAgICAgICAgICBvdXQucHJpbnRpbigiLy8gICIpOworICAgICAgICAgICAgb3V0LnByaW50bG4obi5nZXRRTmFtZSgpKTsKKyAgICAgICAgICAgIG4uc2V0QmVnaW5KYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisKKyAgICAgICAgICAgIC8vIERlY2xhcmUgQVRfQkVHSU4gc2NyaXB0aW5nIHZhcmlhYmxlcworICAgICAgICAgICAgZGVjbGFyZVNjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLkFUX0JFR0lOKTsKKyAgICAgICAgICAgIHNhdmVTY3JpcHRpbmdWYXJzKG4sIFZhcmlhYmxlSW5mby5BVF9CRUdJTik7CisKKyAgICAgICAgICAgIFN0cmluZyB0YWdIYW5kbGVyQ2xhc3NOYW1lID0KKyAgICAgICAgICAgICAgICBKc3BVdGlsLmdldENhbm9uaWNhbE5hbWUodGFnSGFuZGxlckNsYXNzKTsKKyAgICAgICAgICAgIG91dC5wcmludGluKHRhZ0hhbmRsZXJDbGFzc05hbWUpOworICAgICAgICAgICAgb3V0LnByaW50KCIgIik7CisgICAgICAgICAgICBvdXQucHJpbnQodGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICBvdXQucHJpbnQoIiA9ICIpOworICAgICAgICAgICAgaWYgKGlzUG9vbGluZ0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIigiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQodGFnSGFuZGxlckNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIpICIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChuLmdldFRhZ0hhbmRsZXJQb29sTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIi5nZXQoIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KHRhZ0hhbmRsZXJDbGFzc05hbWUpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIuY2xhc3MpOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIm5ldyAiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQodGFnSGFuZGxlckNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIigpOyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnZW5lcmF0ZVNldHRlcnMobiwgdGFnSGFuZGxlclZhciwgaGFuZGxlckluZm8sIGZhbHNlKTsKKworICAgICAgICAgICAgaWYgKG4uaW1wbGVtZW50c1RyeUNhdGNoRmluYWxseSgpKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oImludFtdICIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCh0YWdQdXNoQm9keUNvdW50VmFyKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiID0gbmV3IGludFtdIHsgMCB9OyIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJ0cnkgeyIpOworICAgICAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnRpbigiaW50ICIpOworICAgICAgICAgICAgb3V0LnByaW50KHRhZ0V2YWxWYXIpOworICAgICAgICAgICAgb3V0LnByaW50KCIgPSAiKTsKKyAgICAgICAgICAgIG91dC5wcmludCh0YWdIYW5kbGVyVmFyKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIuZG9TdGFydFRhZygpOyIpOworCisgICAgICAgICAgICBpZiAoIW4uaW1wbGVtZW50c0JvZHlUYWcoKSkgeworICAgICAgICAgICAgICAgIC8vIFN5bmNocm9uaXplIEFUX0JFR0lOIHNjcmlwdGluZyB2YXJpYWJsZXMKKyAgICAgICAgICAgICAgICBzeW5jU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uQVRfQkVHSU4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW4uaGFzRW1wdHlCb2R5KCkpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigiaWYgKCIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCh0YWdFdmFsVmFyKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICE9IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcuU0tJUF9CT0RZKSB7Iik7CisgICAgICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKworICAgICAgICAgICAgICAgIC8vIERlY2xhcmUgTkVTVEVEIHNjcmlwdGluZyB2YXJpYWJsZXMKKyAgICAgICAgICAgICAgICBkZWNsYXJlU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uTkVTVEVEKTsKKyAgICAgICAgICAgICAgICBzYXZlU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uTkVTVEVEKTsKKworICAgICAgICAgICAgICAgIGlmIChuLmltcGxlbWVudHNCb2R5VGFnKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oImlmICgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHRhZ0V2YWxWYXIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIT0gamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZy5FVkFMX0JPRFlfSU5DTFVERSkgeyIpOworICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgRVZBTF9CT0RZX0JVRkZFUkVECisgICAgICAgICAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQgPSBfanNweF9wYWdlX2NvbnRleHQucHVzaEJvZHkoKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4uaW1wbGVtZW50c1RyeUNhdGNoRmluYWxseSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbih0YWdQdXNoQm9keUNvdW50VmFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJbMF0rKzsiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwdXNoQm9keUNvdW50VmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKHB1c2hCb2R5Q291bnRWYXIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIlswXSsrOyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgICAgICIuc2V0Qm9keUNvbnRlbnQoKGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Cb2R5Q29udGVudCkgb3V0KTsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIuZG9Jbml0Qm9keSgpOyIpOworCisgICAgICAgICAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIn0iKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBTeW5jaHJvbml6ZSBBVF9CRUdJTiBhbmQgTkVTVEVEIHNjcmlwdGluZyB2YXJpYWJsZXMKKyAgICAgICAgICAgICAgICAgICAgc3luY1NjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLkFUX0JFR0lOKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1NjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLk5FU1RFRCk7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBTeW5jaHJvbml6ZSBORVNURUQgc2NyaXB0aW5nIHZhcmlhYmxlcworICAgICAgICAgICAgICAgICAgICBzeW5jU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uTkVTVEVEKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobi5pbXBsZW1lbnRzSXRlcmF0aW9uVGFnKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoImRvIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBNYXAgdGhlIEphdmEgbGluZXMgdGhhdCBoYW5kbGVzIHN0YXJ0IG9mIGN1c3RvbSB0YWdzIHRvIHRoZQorICAgICAgICAgICAgLy8gSlNQIGxpbmUgZm9yIHRoaXMgdGFnCisgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUN1c3RvbUVuZCgKKyAgICAgICAgICAgIE5vZGUuQ3VzdG9tVGFnIG4sCisgICAgICAgICAgICBTdHJpbmcgdGFnSGFuZGxlclZhciwKKyAgICAgICAgICAgIFN0cmluZyB0YWdFdmFsVmFyLAorICAgICAgICAgICAgU3RyaW5nIHRhZ1B1c2hCb2R5Q291bnRWYXIpIHsKKworICAgICAgICAgICAgaWYgKCFuLmhhc0VtcHR5Qm9keSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG4uaW1wbGVtZW50c0l0ZXJhdGlvblRhZygpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKCJpbnQgZXZhbERvQWZ0ZXJCb2R5ID0gIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCh0YWdIYW5kbGVyVmFyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIi5kb0FmdGVyQm9keSgpOyIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFN5bmNocm9uaXplIEFUX0JFR0lOIGFuZCBORVNURUQgc2NyaXB0aW5nIHZhcmlhYmxlcworICAgICAgICAgICAgICAgICAgICBzeW5jU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uQVRfQkVHSU4pOworICAgICAgICAgICAgICAgICAgICBzeW5jU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uTkVTVEVEKTsKKworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJpZiAoZXZhbERvQWZ0ZXJCb2R5ICE9IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Cb2R5VGFnLkVWQUxfQk9EWV9BR0FJTikiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoImJyZWFrOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgifSB3aGlsZSAodHJ1ZSk7Iik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVzdG9yZVNjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLk5FU1RFRCk7CisKKyAgICAgICAgICAgICAgICBpZiAobi5pbXBsZW1lbnRzQm9keVRhZygpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKCJpZiAoIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCh0YWdFdmFsVmFyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgICAgICAgICAiICE9IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcuRVZBTF9CT0RZX0lOQ0xVREUpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dCA9IF9qc3B4X3BhZ2VfY29udGV4dC5wb3BCb2R5KCk7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChuLmltcGxlbWVudHNUcnlDYXRjaEZpbmFsbHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odGFnUHVzaEJvZHlDb3VudFZhcik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiWzBdLS07Iik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHVzaEJvZHlDb3VudFZhciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbihwdXNoQm9keUNvdW50VmFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJbMF0tLTsiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOyAvLyBFVkFMX0JPRFkKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXQucHJpbnRpbigiaWYgKCIpOworICAgICAgICAgICAgb3V0LnByaW50KHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgIi5kb0VuZFRhZygpID09IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcuU0tJUF9QQUdFKSB7Iik7CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgaWYoIW4uaW1wbGVtZW50c1RyeUNhdGNoRmluYWxseSgpKSB7CisgICAgICAgICAgICAgICAgaWYoaXNQb29saW5nRW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbihuLmdldFRhZ0hhbmRsZXJQb29sTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIucmV1c2UoIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCh0YWdIYW5kbGVyVmFyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIucmVsZWFzZSgpOyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc1RhZ0ZpbGUgfHwgaXNGcmFnbWVudCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJ0aHJvdyBuZXcgU2tpcFBhZ2VFeGNlcHRpb24oKTsiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoKG1ldGhvZE5lc3RpbmcgPiAwKSA/ICJyZXR1cm4gdHJ1ZTsiIDogInJldHVybjsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgICAgICAgICAvLyBTeW5jaHJvbml6ZSBBVF9CRUdJTiBzY3JpcHRpbmcgdmFyaWFibGVzCisgICAgICAgICAgICBzeW5jU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uQVRfQkVHSU4pOworCisgICAgICAgICAgICAvLyBUcnlDYXRjaEZpbmFsbHkKKyAgICAgICAgICAgIGlmIChuLmltcGxlbWVudHNUcnlDYXRjaEZpbmFsbHkoKSkgeworICAgICAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsgLy8gdHJ5CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIn0gY2F0Y2ggKFRocm93YWJsZSBfanNweF9leGNlcHRpb24pIHsiKTsKKyAgICAgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworCisgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oIndoaWxlICgiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQodGFnUHVzaEJvZHlDb3VudFZhcik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIlswXS0tID4gMCkiKTsKKyAgICAgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQgPSBfanNweF9wYWdlX2NvbnRleHQucG9wQm9keSgpOyIpOworICAgICAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKworICAgICAgICAgICAgICAgIG91dC5wcmludGluKHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIuZG9DYXRjaChfanNweF9leGNlcHRpb24pOyIpOworICAgICAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgifSBmaW5hbGx5IHsiKTsKKyAgICAgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgICAgIG91dC5wcmludGluKHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIuZG9GaW5hbGx5KCk7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc1Bvb2xpbmdFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aW4obi5nZXRUYWdIYW5kbGVyUG9vbE5hbWUoKSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIucmV1c2UoIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbih0YWdIYW5kbGVyVmFyKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLnJlbGVhc2UoKTsiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG4uaW1wbGVtZW50c1RyeUNhdGNoRmluYWxseSgpKSB7CisgICAgICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERlY2xhcmUgYW5kIHN5bmNocm9uaXplIEFUX0VORCBzY3JpcHRpbmcgdmFyaWFibGVzIChtdXN0IGRvIHRoaXMKKyAgICAgICAgICAgIC8vIG91dHNpZGUgdGhlIHRyeS9jYXRjaC9maW5hbGx5IGJsb2NrKQorICAgICAgICAgICAgZGVjbGFyZVNjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLkFUX0VORCk7CisgICAgICAgICAgICBzeW5jU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uQVRfRU5EKTsKKworICAgICAgICAgICAgcmVzdG9yZVNjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLkFUX0JFR0lOKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUN1c3RvbURvVGFnKAorICAgICAgICAgICAgTm9kZS5DdXN0b21UYWcgbiwKKyAgICAgICAgICAgIFRhZ0hhbmRsZXJJbmZvIGhhbmRsZXJJbmZvLAorICAgICAgICAgICAgU3RyaW5nIHRhZ0hhbmRsZXJWYXIpCisgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgQ2xhc3MgdGFnSGFuZGxlckNsYXNzID0gaGFuZGxlckluZm8uZ2V0VGFnSGFuZGxlckNsYXNzKCk7CisKKyAgICAgICAgICAgIG4uc2V0QmVnaW5KYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisgICAgICAgICAgICBvdXQucHJpbnRpbigiLy8gICIpOworICAgICAgICAgICAgb3V0LnByaW50bG4obi5nZXRRTmFtZSgpKTsKKworICAgICAgICAgICAgLy8gRGVjbGFyZSBBVF9CRUdJTiBzY3JpcHRpbmcgdmFyaWFibGVzCisgICAgICAgICAgICBkZWNsYXJlU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uQVRfQkVHSU4pOworICAgICAgICAgICAgc2F2ZVNjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLkFUX0JFR0lOKTsKKworICAgICAgICAgICAgU3RyaW5nIHRhZ0hhbmRsZXJDbGFzc05hbWUgPQorICAgICAgICAgICAgICAgIEpzcFV0aWwuZ2V0Q2Fub25pY2FsTmFtZSh0YWdIYW5kbGVyQ2xhc3MpOworICAgICAgICAgICAgb3V0LnByaW50aW4odGFnSGFuZGxlckNsYXNzTmFtZSk7CisgICAgICAgICAgICBvdXQucHJpbnQoIiAiKTsKKyAgICAgICAgICAgIG91dC5wcmludCh0YWdIYW5kbGVyVmFyKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiID0gIik7CisgICAgICAgICAgICBvdXQucHJpbnQoIm5ldyAiKTsKKyAgICAgICAgICAgIG91dC5wcmludCh0YWdIYW5kbGVyQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIoKTsiKTsKKworICAgICAgICAgICAgZ2VuZXJhdGVTZXR0ZXJzKG4sIHRhZ0hhbmRsZXJWYXIsIGhhbmRsZXJJbmZvLCB0cnVlKTsKKworICAgICAgICAgICAgLy8gU2V0IHRoZSBib2R5CisgICAgICAgICAgICBpZiAoZmluZEpzcEJvZHkobikgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRW5jYXBzdWxhdGUgYm9keSBvZiBjdXN0b20gdGFnIGludm9jYXRpb24gaW4gSnNwRnJhZ21lbnQKKyAgICAgICAgICAgICAgICAgKiBhbmQgcGFzcyBpdCB0byB0YWcgaGFuZGxlcidzIHNldEpzcEJvZHkoKSwgdW5sZXNzIHRhZyBib2R5CisgICAgICAgICAgICAgICAgICogaXMgZW1wdHkKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoIW4uaGFzRW1wdHlCb2R5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiLnNldEpzcEJvZHkoIik7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlSnNwRnJhZ21lbnQobiwgdGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBCb2R5IG9mIHRhZyBpcyB0aGUgYm9keSBvZiB0aGUgPGpzcDpib2R5PiBlbGVtZW50LgorICAgICAgICAgICAgICAgICAqIFRoZSB2aXNpdCBtZXRob2QgZm9yIHRoYXQgZWxlbWVudCBpcyBnb2luZyB0byBlbmNhcHN1bGF0ZQorICAgICAgICAgICAgICAgICAqIHRoYXQgZWxlbWVudCdzIGJvZHkgaW4gYSBKc3BGcmFnbWVudCBhbmQgcGFzcyBpdCB0bworICAgICAgICAgICAgICAgICAqIHRoZSB0YWcgaGFuZGxlcidzIHNldEpzcEJvZHkoKQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFN0cmluZyB0bXBUYWdIYW5kbGVyVmFyID0gc2ltcGxlVGFnSGFuZGxlclZhcjsKKyAgICAgICAgICAgICAgICBzaW1wbGVUYWdIYW5kbGVyVmFyID0gdGFnSGFuZGxlclZhcjsKKyAgICAgICAgICAgICAgICBib29sZWFuIHRtcElzU2ltcGxlVGFnSGFuZGxlciA9IGlzU2ltcGxlVGFnSGFuZGxlcjsKKyAgICAgICAgICAgICAgICBpc1NpbXBsZVRhZ0hhbmRsZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgICAgICAgICBzaW1wbGVUYWdIYW5kbGVyVmFyID0gdG1wVGFnSGFuZGxlclZhcjsKKyAgICAgICAgICAgICAgICBpc1NpbXBsZVRhZ0hhbmRsZXIgPSB0bXBJc1NpbXBsZVRhZ0hhbmRsZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dC5wcmludGluKHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIi5kb1RhZygpOyIpOworCisgICAgICAgICAgICByZXN0b3JlU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uQVRfQkVHSU4pOworCisgICAgICAgICAgICAvLyBTeW5jaHJvbml6ZSBBVF9CRUdJTiBzY3JpcHRpbmcgdmFyaWFibGVzCisgICAgICAgICAgICBzeW5jU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uQVRfQkVHSU4pOworCisgICAgICAgICAgICAvLyBEZWNsYXJlIGFuZCBzeW5jaHJvbml6ZSBBVF9FTkQgc2NyaXB0aW5nIHZhcmlhYmxlcworICAgICAgICAgICAgZGVjbGFyZVNjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLkFUX0VORCk7CisgICAgICAgICAgICBzeW5jU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uQVRfRU5EKTsKKworICAgICAgICAgICAgbi5zZXRFbmRKYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZGVjbGFyZVNjcmlwdGluZ1ZhcnMoTm9kZS5DdXN0b21UYWcgbiwgaW50IHNjb3BlKSB7CisKKyAgICAgICAgICAgIFZlY3RvciB2ZWMgPSBuLmdldFNjcmlwdGluZ1ZhcnMoc2NvcGUpOworICAgICAgICAgICAgaWYgKHZlYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGVsZW0gPSB2ZWMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbSBpbnN0YW5jZW9mIFZhcmlhYmxlSW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVJbmZvIHZhckluZm8gPSAoVmFyaWFibGVJbmZvKWVsZW07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFySW5mby5nZXREZWNsYXJlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbih2YXJJbmZvLmdldENsYXNzTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQodmFySW5mby5nZXRWYXJOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgPSBudWxsOyIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgVGFnVmFyaWFibGVJbmZvIHRhZ1ZhckluZm8gPSAoVGFnVmFyaWFibGVJbmZvKWVsZW07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnVmFySW5mby5nZXREZWNsYXJlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFyTmFtZSA9IHRhZ1ZhckluZm8uZ2V0TmFtZUdpdmVuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhck5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZ2V0VGFnRGF0YSgpLmdldEF0dHJpYnV0ZVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdWYXJJbmZvLmdldE5hbWVGcm9tQXR0cmlidXRlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1ZhckluZm8uZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsaWFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbih0YWdWYXJJbmZvLmdldENsYXNzTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQodmFyTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiA9IG51bGw7Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgY3VzdG9tIHRhZydzIHN0YXJ0IGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIElmIHRoZSBnaXZlbiBjdXN0b20gdGFnIGhhcyBhIGN1c3RvbSBuZXN0aW5nIGxldmVsIGdyZWF0ZXIgdGhhbiAwLAorICAgICAgICAgKiBzYXZlIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBpdHMgc2NyaXB0aW5nIHZhcmlhYmxlcyB0bworICAgICAgICAgKiB0ZW1wb3JhcnkgdmFyaWFibGVzLCBzbyB0aG9zZSB2YWx1ZXMgbWF5IGJlIHJlc3RvcmVkIGluIHRoZSB0YWcncworICAgICAgICAgKiBlbmQgZWxlbWVudC4gVGhpcyB3YXksIHRoZSBzY3JpcHRpbmcgdmFyaWFibGVzIG1heSBiZSBzeW5jaHJvbml6ZWQKKyAgICAgICAgICogYnkgdGhlIGdpdmVuIHRhZyB3aXRob3V0IGFmZmVjdGluZyB0aGVpciBvcmlnaW5hbCB2YWx1ZXMuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgc2F2ZVNjcmlwdGluZ1ZhcnMoTm9kZS5DdXN0b21UYWcgbiwgaW50IHNjb3BlKSB7CisgICAgICAgICAgICBpZiAobi5nZXRDdXN0b21OZXN0aW5nTGV2ZWwoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUYWdWYXJpYWJsZUluZm9bXSB0YWdWYXJJbmZvcyA9IG4uZ2V0VGFnVmFyaWFibGVJbmZvcygpOworICAgICAgICAgICAgVmFyaWFibGVJbmZvW10gdmFySW5mb3MgPSBuLmdldFZhcmlhYmxlSW5mb3MoKTsKKyAgICAgICAgICAgIGlmICgodmFySW5mb3MubGVuZ3RoID09IDApICYmICh0YWdWYXJJbmZvcy5sZW5ndGggPT0gMCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2YXJJbmZvcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJJbmZvcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFySW5mb3NbaV0uZ2V0U2NvcGUoKSAhPSBzY29wZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGhhcyBiZWVuIGRlY2xhcmVkLCBza2lwIGNvZGVzCisgICAgICAgICAgICAgICAgICAgIC8vIGZvciBzYXZpbmcgYW5kIHJlc3RvcmluZyBpdC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG4uZ2V0U2NyaXB0aW5nVmFycyhzY29wZSkuY29udGFpbnModmFySW5mb3NbaV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YXJOYW1lID0gdmFySW5mb3NbaV0uZ2V0VmFyTmFtZSgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG1wVmFyTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAiX2pzcHhfIiArIHZhck5hbWUgKyAiXyIgKyBuLmdldEN1c3RvbU5lc3RpbmdMZXZlbCgpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbih0bXBWYXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgPSAiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHZhck5hbWUpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiOyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdWYXJJbmZvcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFnVmFySW5mb3NbaV0uZ2V0U2NvcGUoKSAhPSBzY29wZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGhhcyBiZWVuIGRlY2xhcmVkLCBza2lwIGNvZGVzCisgICAgICAgICAgICAgICAgICAgIC8vIGZvciBzYXZpbmcgYW5kIHJlc3RvcmluZyBpdC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG4uZ2V0U2NyaXB0aW5nVmFycyhzY29wZSkuY29udGFpbnModGFnVmFySW5mb3NbaV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YXJOYW1lID0gdGFnVmFySW5mb3NbaV0uZ2V0TmFtZUdpdmVuKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YXJOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhck5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZ2V0VGFnRGF0YSgpLmdldEF0dHJpYnV0ZVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnVmFySW5mb3NbaV0uZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnVmFySW5mb3NbaV0uZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGlhcworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRtcFZhck5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgIl9qc3B4XyIgKyB2YXJOYW1lICsgIl8iICsgbi5nZXRDdXN0b21OZXN0aW5nTGV2ZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odG1wVmFyTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiID0gIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCh2YXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgY3VzdG9tIHRhZydzIGVuZCBlbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBJZiB0aGUgZ2l2ZW4gY3VzdG9tIHRhZyBoYXMgYSBjdXN0b20gbmVzdGluZyBsZXZlbCBncmVhdGVyIHRoYW4gMCwKKyAgICAgICAgICogcmVzdG9yZSBpdHMgc2NyaXB0aW5nIHZhcmlhYmxlcyB0byB0aGVpciBvcmlnaW5hbCB2YWx1ZXMgdGhhdCB3ZXJlCisgICAgICAgICAqIHNhdmVkIGluIHRoZSB0YWcncyBzdGFydCBlbGVtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVTY3JpcHRpbmdWYXJzKE5vZGUuQ3VzdG9tVGFnIG4sIGludCBzY29wZSkgeworICAgICAgICAgICAgaWYgKG4uZ2V0Q3VzdG9tTmVzdGluZ0xldmVsKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVGFnVmFyaWFibGVJbmZvW10gdGFnVmFySW5mb3MgPSBuLmdldFRhZ1ZhcmlhYmxlSW5mb3MoKTsKKyAgICAgICAgICAgIFZhcmlhYmxlSW5mb1tdIHZhckluZm9zID0gbi5nZXRWYXJpYWJsZUluZm9zKCk7CisgICAgICAgICAgICBpZiAoKHZhckluZm9zLmxlbmd0aCA9PSAwKSAmJiAodGFnVmFySW5mb3MubGVuZ3RoID09IDApKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmFySW5mb3MubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFySW5mb3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhckluZm9zW2ldLmdldFNjb3BlKCkgIT0gc2NvcGUpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBoYXMgYmVlbiBkZWNsYXJlZCwgc2tpcCBjb2RlcworICAgICAgICAgICAgICAgICAgICAvLyBmb3Igc2F2aW5nIGFuZCByZXN0b3JpbmcgaXQuCisgICAgICAgICAgICAgICAgICAgIGlmIChuLmdldFNjcmlwdGluZ1ZhcnMoc2NvcGUpLmNvbnRhaW5zKHZhckluZm9zW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFyTmFtZSA9IHZhckluZm9zW2ldLmdldFZhck5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRtcFZhck5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgIl9qc3B4XyIgKyB2YXJOYW1lICsgIl8iICsgbi5nZXRDdXN0b21OZXN0aW5nTGV2ZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odmFyTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiID0gIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCh0bXBWYXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnVmFySW5mb3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ1ZhckluZm9zW2ldLmdldFNjb3BlKCkgIT0gc2NvcGUpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBoYXMgYmVlbiBkZWNsYXJlZCwgc2tpcCBjb2RlcworICAgICAgICAgICAgICAgICAgICAvLyBmb3Igc2F2aW5nIGFuZCByZXN0b3JpbmcgaXQuCisgICAgICAgICAgICAgICAgICAgIGlmIChuLmdldFNjcmlwdGluZ1ZhcnMoc2NvcGUpLmNvbnRhaW5zKHRhZ1ZhckluZm9zW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFyTmFtZSA9IHRhZ1ZhckluZm9zW2ldLmdldE5hbWVHaXZlbigpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFyTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXJOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldFRhZ0RhdGEoKS5nZXRBdHRyaWJ1dGVTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1ZhckluZm9zW2ldLmdldE5hbWVGcm9tQXR0cmlidXRlKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhZ1ZhckluZm9zW2ldLmdldE5hbWVGcm9tQXR0cmlidXRlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxpYXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0bXBWYXJOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICJfanNweF8iICsgdmFyTmFtZSArICJfIiArIG4uZ2V0Q3VzdG9tTmVzdGluZ0xldmVsKCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKHZhck5hbWUpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiA9ICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQodG1wVmFyTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCI7Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU3luY2hyb25pemVzIHRoZSBzY3JpcHRpbmcgdmFyaWFibGVzIG9mIHRoZSBnaXZlbiBjdXN0b20gdGFnIGZvcgorICAgICAgICAgKiB0aGUgZ2l2ZW4gc2NvcGUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgc3luY1NjcmlwdGluZ1ZhcnMoTm9kZS5DdXN0b21UYWcgbiwgaW50IHNjb3BlKSB7CisgICAgICAgICAgICBUYWdWYXJpYWJsZUluZm9bXSB0YWdWYXJJbmZvcyA9IG4uZ2V0VGFnVmFyaWFibGVJbmZvcygpOworICAgICAgICAgICAgVmFyaWFibGVJbmZvW10gdmFySW5mb3MgPSBuLmdldFZhcmlhYmxlSW5mb3MoKTsKKworICAgICAgICAgICAgaWYgKCh2YXJJbmZvcy5sZW5ndGggPT0gMCkgJiYgKHRhZ1ZhckluZm9zLmxlbmd0aCA9PSAwKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZhckluZm9zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhckluZm9zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YXJJbmZvc1tpXS5nZXRTY29wZSgpID09IHNjb3BlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbih2YXJJbmZvc1tpXS5nZXRWYXJOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgPSAoIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQodmFySW5mb3NbaV0uZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIpIF9qc3B4X3BhZ2VfY29udGV4dC5maW5kQXR0cmlidXRlKCIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHF1b3RlKHZhckluZm9zW2ldLmdldFZhck5hbWUoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnVmFySW5mb3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ1ZhckluZm9zW2ldLmdldFNjb3BlKCkgPT0gc2NvcGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdGFnVmFySW5mb3NbaV0uZ2V0TmFtZUdpdmVuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZ2V0VGFnRGF0YSgpLmdldEF0dHJpYnV0ZVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1ZhckluZm9zW2ldLmdldE5hbWVGcm9tQXR0cmlidXRlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdWYXJJbmZvc1tpXS5nZXROYW1lRnJvbUF0dHJpYnV0ZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGlhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4obmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiA9ICgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCh0YWdWYXJJbmZvc1tpXS5nZXRDbGFzc05hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIikgX2pzcHhfcGFnZV9jb250ZXh0LmZpbmRBdHRyaWJ1dGUoIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQocXVvdGUobmFtZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBDcmVhdGVzIGEgdGFnIHZhcmlhYmxlIG5hbWUgYnkgY29uY2F0ZW5hdGluZyB0aGUgZ2l2ZW4gcHJlZml4IGFuZAorICAgICAgICAgKiBzaG9ydE5hbWUgYW5kIGVuZGNvZGVkIHRvIG1ha2UgdGhlIHJlc3VsdGFudCBzdHJpbmcgYSB2YWxpZCBKYXZhCisgICAgICAgICAqIElkZW50aWZpZXIuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVUYWdWYXJOYW1lKAorICAgICAgICAgICAgU3RyaW5nIGZ1bGxOYW1lLAorICAgICAgICAgICAgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgIFN0cmluZyBzaG9ydE5hbWUpIHsKKworICAgICAgICAgICAgU3RyaW5nIHZhck5hbWU7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRhZ1Zhck51bWJlcnMpIHsKKyAgICAgICAgICAgICAgICB2YXJOYW1lID0gcHJlZml4ICsgIl8iICsgc2hvcnROYW1lICsgIl8iOworICAgICAgICAgICAgICAgIGlmICh0YWdWYXJOdW1iZXJzLmdldChmdWxsTmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGkgPSAoSW50ZWdlcil0YWdWYXJOdW1iZXJzLmdldChmdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHZhck5hbWUgPSB2YXJOYW1lICsgaS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICB0YWdWYXJOdW1iZXJzLnB1dChmdWxsTmFtZSwgbmV3IEludGVnZXIoaS5pbnRWYWx1ZSgpICsgMSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRhZ1Zhck51bWJlcnMucHV0KGZ1bGxOYW1lLCBuZXcgSW50ZWdlcigxKSk7CisgICAgICAgICAgICAgICAgICAgIHZhck5hbWUgPSB2YXJOYW1lICsgIjAiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBKc3BVdGlsLm1ha2VKYXZhSWRlbnRpZmllcih2YXJOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGV2YWx1YXRlQXR0cmlidXRlKAorICAgICAgICAgICAgVGFnSGFuZGxlckluZm8gaGFuZGxlckluZm8sCisgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZSBhdHRyLAorICAgICAgICAgICAgTm9kZS5DdXN0b21UYWcgbiwKKyAgICAgICAgICAgIFN0cmluZyB0YWdIYW5kbGVyVmFyKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBhdHRyLmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoYXR0clZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXR0ci5pc05hbWVkQXR0cmlidXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4uY2hlY2tJZkF0dHJpYnV0ZUlzSnNwRnJhZ21lbnQoYXR0ci5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBYWFggLSBubyBuZWVkIHRvIGdlbmVyYXRlIHRlbXBvcmFyeSB2YXJpYWJsZSBoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlTmFtZWRBdHRyaWJ1dGVKc3BGcmFnbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5nZXROYW1lZEF0dHJpYnV0ZU5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlTmFtZWRBdHRyaWJ1dGVWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5nZXROYW1lZEF0dHJpYnV0ZU5vZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBhdHRyLmdldExvY2FsTmFtZSgpOworCisgICAgICAgICAgICBNZXRob2QgbSA9IG51bGw7CisgICAgICAgICAgICBDbGFzc1tdIGMgPSBudWxsOworICAgICAgICAgICAgaWYgKGF0dHIuaXNEeW5hbWljKCkpIHsKKyAgICAgICAgICAgICAgICBjID0gT0JKRUNUX0NMQVNTOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtID0gaGFuZGxlckluZm8uZ2V0U2V0dGVyTWV0aG9kKGxvY2FsTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKG0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICBuLAorICAgICAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci51bmFibGUudG9fZmluZF9tZXRob2QiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjID0gbS5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgICAgIC8vIFhYWCBhc3NlcnQoYy5sZW5ndGggPiAwKQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXR0ci5pc0V4cHJlc3Npb24oKSkgeworICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0ci5pc05hbWVkQXR0cmlidXRlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW4uY2hlY2tJZkF0dHJpYnV0ZUlzSnNwRnJhZ21lbnQoYXR0ci5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICYmICFhdHRyLmlzRHluYW1pYygpKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0clZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVySW5mby5nZXRQcm9wZXJ0eUVkaXRvckNsYXNzKGxvY2FsTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyLmlzRUxJbnRlcnByZXRlcklucHV0KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBydW4gYXR0clZhbHVlIHRocm91Z2ggdGhlIGV4cHJlc3Npb24gaW50ZXJwcmV0ZXIKKyAgICAgICAgICAgICAgICBib29sZWFuIHJlcGxhY2VFU0MgPSBhdHRyVmFsdWUuaW5kZXhPZihDb25zdGFudHMuSEFDS19DSEFSKSA+IDA7CisgICAgICAgICAgICAgICAgYXR0clZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgSnNwVXRpbC5pbnRlcnByZXRlckNhbGwoCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVGFnRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmdldEVMKCkuZ2V0TWFwTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgIC8vIFhYWCBoYWNrOiBSZXBsYWNlIEVTQyB3aXRoICckJworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlRVNDKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGF0dHJWYWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikucmVwbGFjZSgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDb25zdGFudHMuSEFDS19TVFIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsICckJykiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXR0clZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgY29udmVydFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVySW5mby5nZXRQcm9wZXJ0eUVkaXRvckNsYXNzKGxvY2FsTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYXR0clZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdlbmVyYXRlIGNvZGUgdG8gY3JlYXRlIGEgbWFwIGZvciB0aGUgYWxpYXMgdmFyaWFibGVzCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1hcAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVBbGlhc01hcChOb2RlLkN1c3RvbVRhZyBuLCBTdHJpbmcgdGFnSGFuZGxlclZhcikKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBUYWdWYXJpYWJsZUluZm9bXSB0YWdWYXJzID0gbi5nZXRUYWdWYXJpYWJsZUluZm9zKCk7CisgICAgICAgICAgICBTdHJpbmcgYWxpYXNNYXBWYXIgPSBudWxsOworCisgICAgICAgICAgICBib29sZWFuIGFsaWFzU2VlbiA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdWYXJzLmxlbmd0aDsgaSsrKSB7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZUZyb20gPSB0YWdWYXJzW2ldLmdldE5hbWVGcm9tQXR0cmlidXRlKCk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWVGcm9tICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFsaWFzZWROYW1lID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZShuYW1lRnJvbSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbGlhc2VkTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGlhc1NlZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKCJqYXZhLnV0aWwuSGFzaE1hcCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzTWFwVmFyID0gdGFnSGFuZGxlclZhciArICJfYWxpYXNNYXAiOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KGFsaWFzTWFwVmFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzU2VlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oYWxpYXNNYXBWYXIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIi5wdXQoIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChxdW90ZSh0YWdWYXJzW2ldLmdldE5hbWVHaXZlbigpKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHF1b3RlKGFsaWFzZWROYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhbGlhc01hcFZhcjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVNldHRlcnMoCisgICAgICAgICAgICBOb2RlLkN1c3RvbVRhZyBuLAorICAgICAgICAgICAgU3RyaW5nIHRhZ0hhbmRsZXJWYXIsCisgICAgICAgICAgICBUYWdIYW5kbGVySW5mbyBoYW5kbGVySW5mbywKKyAgICAgICAgICAgIGJvb2xlYW4gc2ltcGxlVGFnKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIC8vIFNldCBjb250ZXh0CisgICAgICAgICAgICBpZiAoc2ltcGxlVGFnKSB7CisgICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgYWxpYXMgbWFwCisgICAgICAgICAgICAgICAgU3RyaW5nIGFsaWFzTWFwVmFyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAobi5pc1RhZ0ZpbGUoKSkgeworICAgICAgICAgICAgICAgICAgICBhbGlhc01hcFZhciA9IGdlbmVyYXRlQWxpYXNNYXAobiwgdGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5wcmludGluKHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgICAgIGlmIChhbGlhc01hcFZhciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIuc2V0SnNwQ29udGV4dChfanNweF9wYWdlX2NvbnRleHQpOyIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiLnNldEpzcENvbnRleHQoX2pzcHhfcGFnZV9jb250ZXh0LCAiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KGFsaWFzTWFwVmFyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbih0YWdIYW5kbGVyVmFyKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLnNldFBhZ2VDb250ZXh0KF9qc3B4X3BhZ2VfY29udGV4dCk7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNldCBwYXJlbnQKKyAgICAgICAgICAgIGlmIChpc1RhZ0ZpbGUgJiYgcGFyZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbih0YWdIYW5kbGVyVmFyKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIi5zZXRQYXJlbnQoIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJuZXcgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0FkYXB0ZXIoIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIoamF2YXguc2VydmxldC5qc3AudGFnZXh0LlNpbXBsZVRhZykgdGhpcyApKTsiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXNpbXBsZVRhZykgeworICAgICAgICAgICAgICAgIG91dC5wcmludGluKHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiLnNldFBhcmVudCgiKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2ltcGxlVGFnUGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIm5ldyBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnQWRhcHRlcigiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiKGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5TaW1wbGVUYWcpICIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHBhcmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiKSk7Iik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIihqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnKSAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChwYXJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigibnVsbCk7Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgc2V0UGFyZW50KCkgbWV0aG9kIG5lZWQgbm90IGJlIGNhbGxlZCBpZiB0aGUgdmFsdWUgYmVpbmcKKyAgICAgICAgICAgICAgICAvLyBwYXNzZWQgaXMgbnVsbCwgc2luY2UgU2ltcGxlVGFnIGluc3RhbmNlcyBhcmUgbm90IHJldXNlZAorICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbih0YWdIYW5kbGVyVmFyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIuc2V0UGFyZW50KCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQocGFyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZVtdIGF0dHJzID0gbi5nZXRKc3BBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgYXR0cnMgIT0gbnVsbCAmJiBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVBdHRyaWJ1dGUoaGFuZGxlckluZm8sIGF0dHJzW2ldLCBuLCB0YWdIYW5kbGVyVmFyKTsKKworICAgICAgICAgICAgICAgIGlmIChhdHRyc1tpXS5pc0R5bmFtaWMoKSkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbih0YWdIYW5kbGVyVmFyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIuIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgic2V0RHluYW1pY0F0dHJpYnV0ZSgiKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGF0dHJzW2ldLmdldFVSSSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIiIuZXF1YWxzKHVyaSkgfHwgKHVyaSA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIlwiIiArIGF0dHJzW2ldLmdldFVSSSgpICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIsIFwiIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChhdHRyc1tpXS5nZXRMb2NhbE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiXCIsICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoYXR0clZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiLiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoCisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVySW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZXR0ZXJNZXRob2QoYXR0cnNbaV0uZ2V0TG9jYWxOYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiKCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoYXR0clZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQHBhcmFtIGMgVGhlIHRhcmdldCBjbGFzcyB0byB3aGljaCB0byBjb2VyY2UgdGhlIGdpdmVuIHN0cmluZworICAgICAgICAgKiBAcGFyYW0gcyBUaGUgc3RyaW5nIHZhbHVlCisgICAgICAgICAqIEBwYXJhbSBhdHRyTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdob3NlIHZhbHVlIGlzIGJlaW5nCisgICAgICAgICAqIHN1cHBsaWVkCisgICAgICAgICAqIEBwYXJhbSBwcm9wRWRpdG9yQ2xhc3MgVGhlIHByb3BlcnR5IGVkaXRvciBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZQorICAgICAgICAgKiBAcGFyYW0gaXNOYW1lZEF0dHJpYnV0ZSB0cnVlIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgaXMgYSBuYW1lZAorICAgICAgICAgKiBhdHRyaWJ1dGUgKHRoYXQgaXMsIHNwZWNpZmllZCB1c2luZyB0aGUganNwOmF0dHJpYnV0ZSBzdGFuZGFyZAorICAgICAgICAgKiBhY3Rpb24pLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFN0cmluZyBjb252ZXJ0U3RyaW5nKAorICAgICAgICAgICAgQ2xhc3MgYywKKyAgICAgICAgICAgIFN0cmluZyBzLAorICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lLAorICAgICAgICAgICAgQ2xhc3MgcHJvcEVkaXRvckNsYXNzLAorICAgICAgICAgICAgYm9vbGVhbiBpc05hbWVkQXR0cmlidXRlKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIFN0cmluZyBxdW90ZWQgPSBzOworICAgICAgICAgICAgaWYgKCFpc05hbWVkQXR0cmlidXRlKSB7CisgICAgICAgICAgICAgICAgcXVvdGVkID0gcXVvdGUocyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwcm9wRWRpdG9yQ2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBKc3BVdGlsLmdldENhbm9uaWNhbE5hbWUoYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuICIoIgorICAgICAgICAgICAgICAgICAgICArIGNsYXNzTmFtZQorICAgICAgICAgICAgICAgICAgICArICIpb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS5nZXRWYWx1ZUZyb21CZWFuSW5mb1Byb3BlcnR5RWRpdG9yKCIKKyAgICAgICAgICAgICAgICAgICAgKyBjbGFzc05hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiLmNsYXNzLCBcIiIKKyAgICAgICAgICAgICAgICAgICAgKyBhdHRyTmFtZQorICAgICAgICAgICAgICAgICAgICArICJcIiwgIgorICAgICAgICAgICAgICAgICAgICArIHF1b3RlZAorICAgICAgICAgICAgICAgICAgICArICIsICIKKyAgICAgICAgICAgICAgICAgICAgKyBKc3BVdGlsLmdldENhbm9uaWNhbE5hbWUocHJvcEVkaXRvckNsYXNzKQorICAgICAgICAgICAgICAgICAgICArICIuY2xhc3MpIjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBTdHJpbmcuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcXVvdGVkOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IGJvb2xlYW4uY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSnNwVXRpbC5jb2VyY2VUb1ByaW1pdGl2ZUJvb2xlYW4ocywgaXNOYW1lZEF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gQm9vbGVhbi5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBKc3BVdGlsLmNvZXJjZVRvQm9vbGVhbihzLCBpc05hbWVkQXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBieXRlLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEpzcFV0aWwuY29lcmNlVG9QcmltaXRpdmVCeXRlKHMsIGlzTmFtZWRBdHRyaWJ1dGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IEJ5dGUuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSnNwVXRpbC5jb2VyY2VUb0J5dGUocywgaXNOYW1lZEF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gY2hhci5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBKc3BVdGlsLmNvZXJjZVRvQ2hhcihzLCBpc05hbWVkQXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBDaGFyYWN0ZXIuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSnNwVXRpbC5jb2VyY2VUb0NoYXJhY3RlcihzLCBpc05hbWVkQXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBkb3VibGUuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSnNwVXRpbC5jb2VyY2VUb1ByaW1pdGl2ZURvdWJsZShzLCBpc05hbWVkQXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBEb3VibGUuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSnNwVXRpbC5jb2VyY2VUb0RvdWJsZShzLCBpc05hbWVkQXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBmbG9hdC5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBKc3BVdGlsLmNvZXJjZVRvUHJpbWl0aXZlRmxvYXQocywgaXNOYW1lZEF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gRmxvYXQuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSnNwVXRpbC5jb2VyY2VUb0Zsb2F0KHMsIGlzTmFtZWRBdHRyaWJ1dGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IGludC5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBKc3BVdGlsLmNvZXJjZVRvSW50KHMsIGlzTmFtZWRBdHRyaWJ1dGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IEludGVnZXIuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSnNwVXRpbC5jb2VyY2VUb0ludGVnZXIocywgaXNOYW1lZEF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gc2hvcnQuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSnNwVXRpbC5jb2VyY2VUb1ByaW1pdGl2ZVNob3J0KHMsIGlzTmFtZWRBdHRyaWJ1dGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IFNob3J0LmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEpzcFV0aWwuY29lcmNlVG9TaG9ydChzLCBpc05hbWVkQXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBsb25nLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEpzcFV0aWwuY29lcmNlVG9QcmltaXRpdmVMb25nKHMsIGlzTmFtZWRBdHRyaWJ1dGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IExvbmcuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSnNwVXRpbC5jb2VyY2VUb0xvbmcocywgaXNOYW1lZEF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gT2JqZWN0LmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJuZXcgU3RyaW5nKCIgKyBxdW90ZWQgKyAiKSI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBKc3BVdGlsLmdldENhbm9uaWNhbE5hbWUoYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuICIoIgorICAgICAgICAgICAgICAgICAgICArIGNsYXNzTmFtZQorICAgICAgICAgICAgICAgICAgICArICIpb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS5nZXRWYWx1ZUZyb21Qcm9wZXJ0eUVkaXRvck1hbmFnZXIoIgorICAgICAgICAgICAgICAgICAgICArIGNsYXNzTmFtZQorICAgICAgICAgICAgICAgICAgICArICIuY2xhc3MsIFwiIgorICAgICAgICAgICAgICAgICAgICArIGF0dHJOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIlwiLCAiCisgICAgICAgICAgICAgICAgICAgICsgcXVvdGVkCisgICAgICAgICAgICAgICAgICAgICsgIikiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29udmVydHMgdGhlIHNjb3BlIHN0cmluZyByZXByZXNlbnRhdGlvbiwgd2hvc2UgcG9zc2libGUgdmFsdWVzCisgICAgICAgICAqIGFyZSAicGFnZSIsICJyZXF1ZXN0IiwgInNlc3Npb24iLCBhbmQgImFwcGxpY2F0aW9uIiwgdG8gdGhlCisgICAgICAgICAqIGNvcnJlc3BvbmRpbmcgc2NvcGUgY29uc3RhbnQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRTY29wZUNvbnN0YW50KFN0cmluZyBzY29wZSkgeworICAgICAgICAgICAgU3RyaW5nIHNjb3BlTmFtZSA9ICJQYWdlQ29udGV4dC5QQUdFX1NDT1BFIjsgLy8gRGVmYXVsdCB0byBwYWdlCisKKyAgICAgICAgICAgIGlmICgicmVxdWVzdCIuZXF1YWxzKHNjb3BlKSkgeworICAgICAgICAgICAgICAgIHNjb3BlTmFtZSA9ICJQYWdlQ29udGV4dC5SRVFVRVNUX1NDT1BFIjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoInNlc3Npb24iLmVxdWFscyhzY29wZSkpIHsKKyAgICAgICAgICAgICAgICBzY29wZU5hbWUgPSAiUGFnZUNvbnRleHQuU0VTU0lPTl9TQ09QRSI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJhcHBsaWNhdGlvbiIuZXF1YWxzKHNjb3BlKSkgeworICAgICAgICAgICAgICAgIHNjb3BlTmFtZSA9ICJQYWdlQ29udGV4dC5BUFBMSUNBVElPTl9TQ09QRSI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzY29wZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2VuZXJhdGVzIGFub255bW91cyBKc3BGcmFnbWVudCBpbm5lciBjbGFzcyB3aGljaCBpcyBwYXNzZWQgYXMgYW4KKyAgICAgICAgICogYXJndW1lbnQgdG8gU2ltcGxlVGFnLnNldEpzcEJvZHkoKS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUpzcEZyYWdtZW50KE5vZGUgbiwgU3RyaW5nIHRhZ0hhbmRsZXJWYXIpCisgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIFhYWCAtIEEgcG9zc2libGUgb3B0aW1pemF0aW9uIGhlcmUgd291bGQgYmUgdG8gY2hlY2sgdG8gc2VlCisgICAgICAgICAgICAvLyBpZiB0aGUgb25seSBjaGlsZCBvZiB0aGUgcGFyZW50IG5vZGUgaXMgVGVtcGxhdGVUZXh0LiAgSWYgc28sCisgICAgICAgICAgICAvLyB3ZSBrbm93IHRoZXJlIHdvbid0IGJlIGFueSBwYXJhbWV0ZXJzLCBldGMsIHNvIHdlIGNhbgorICAgICAgICAgICAgLy8gZ2VuZXJhdGUgYSBsb3ctb3ZlcmhlYWQgSnNwRnJhZ21lbnQgdGhhdCBqdXN0IGVjaG9lcyBpdHMKKyAgICAgICAgICAgIC8vIGJvZHkuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFnbWVudCBjYW4gY29tZSBmcm9tCisgICAgICAgICAgICAvLyB0aGUgb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZSBwYWNrYWdlIGFzIGEgc3VwcG9ydCBjbGFzcy4KKyAgICAgICAgICAgIEZyYWdtZW50SGVscGVyQ2xhc3MuRnJhZ21lbnQgZnJhZ21lbnQgPQorICAgICAgICAgICAgICAgIGZyYWdtZW50SGVscGVyQ2xhc3Mub3BlbkZyYWdtZW50KAorICAgICAgICAgICAgICAgICAgICBuLAorICAgICAgICAgICAgICAgICAgICB0YWdIYW5kbGVyVmFyLAorICAgICAgICAgICAgICAgICAgICBtZXRob2ROZXN0aW5nKTsKKyAgICAgICAgICAgIFNlcnZsZXRXcml0ZXIgb3V0U2F2ZSA9IG91dDsKKyAgICAgICAgICAgIG91dCA9IGZyYWdtZW50LmdldEdlbkJ1ZmZlcigpLmdldE91dCgpOworICAgICAgICAgICAgU3RyaW5nIHRtcFBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgICAgIHBhcmVudCA9ICJfanNweF9wYXJlbnQiOworICAgICAgICAgICAgYm9vbGVhbiBpc1NpbXBsZVRhZ1BhcmVudFNhdmUgPSBpc1NpbXBsZVRhZ1BhcmVudDsKKyAgICAgICAgICAgIGlzU2ltcGxlVGFnUGFyZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJvb2xlYW4gdG1wSXNGcmFnbWVudCA9IGlzRnJhZ21lbnQ7CisgICAgICAgICAgICBpc0ZyYWdtZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIFN0cmluZyBwdXNoQm9keUNvdW50VmFyU2F2ZSA9IHB1c2hCb2R5Q291bnRWYXI7CisgICAgICAgICAgICBpZiAocHVzaEJvZHlDb3VudFZhciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVXNlIGEgZml4ZWQgbmFtZSBmb3IgcHVzaCBib2R5IGNvdW50LCB0byBzaW1wbGlmeSBjb2RlIGdlbgorICAgICAgICAgICAgICAgIHB1c2hCb2R5Q291bnRWYXIgPSAiX2pzcHhfcHVzaF9ib2R5X2NvdW50IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgICAgIG91dCA9IG91dFNhdmU7CisgICAgICAgICAgICBwYXJlbnQgPSB0bXBQYXJlbnQ7CisgICAgICAgICAgICBpc1NpbXBsZVRhZ1BhcmVudCA9IGlzU2ltcGxlVGFnUGFyZW50U2F2ZTsKKyAgICAgICAgICAgIGlzRnJhZ21lbnQgPSB0bXBJc0ZyYWdtZW50OworICAgICAgICAgICAgcHVzaEJvZHlDb3VudFZhciA9IHB1c2hCb2R5Q291bnRWYXJTYXZlOworICAgICAgICAgICAgZnJhZ21lbnRIZWxwZXJDbGFzcy5jbG9zZUZyYWdtZW50KGZyYWdtZW50LCBtZXRob2ROZXN0aW5nKTsKKyAgICAgICAgICAgIC8vIFhYWCAtIE5lZWQgdG8gY2hhbmdlIHBhZ2VDb250ZXh0IHRvIGpzcENvbnRleHQgaWYKKyAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBpbiBhIHBsYWNlIHdoZXJlIHBhZ2VDb250ZXh0IGlzIGRlZmluZWQgKGUuZy4KKyAgICAgICAgICAgIC8vIGluIGEgZnJhZ21lbnQgb3IgaW4gYSB0YWcgZmlsZS4KKyAgICAgICAgICAgIG91dC5wcmludCgKKyAgICAgICAgICAgICAgICAibmV3ICIKKyAgICAgICAgICAgICAgICAgICAgKyBmcmFnbWVudEhlbHBlckNsYXNzLmdldENsYXNzTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiggIgorICAgICAgICAgICAgICAgICAgICArIGZyYWdtZW50LmdldElkKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBfanNweF9wYWdlX2NvbnRleHQsICIKKyAgICAgICAgICAgICAgICAgICAgKyB0YWdIYW5kbGVyVmFyCisgICAgICAgICAgICAgICAgICAgICsgIiwgIgorICAgICAgICAgICAgICAgICAgICArIHB1c2hCb2R5Q291bnRWYXIKKyAgICAgICAgICAgICAgICAgICAgKyAiKSIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdlbmVyYXRlIHRoZSBjb2RlIHJlcXVpcmVkIHRvIG9idGFpbiB0aGUgcnVudGltZSB2YWx1ZSBvZiB0aGUKKyAgICAgICAgICogZ2l2ZW4gbmFtZWQgYXR0cmlidXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSB0ZW1wb3JhcnkgdmFyaWFibGUgdGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlTmFtZWRBdHRyaWJ1dGVWYWx1ZShOb2RlLk5hbWVkQXR0cmlidXRlIG4pCisgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSBuLmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworCisgICAgICAgICAgICAvLyBJZiB0aGUgb25seSBib2R5IGVsZW1lbnQgZm9yIHRoaXMgbmFtZWQgYXR0cmlidXRlIG5vZGUgaXMKKyAgICAgICAgICAgIC8vIHRlbXBsYXRlIHRleHQsIHdlIG5lZWQgbm90IGdlbmVyYXRlIGFuIGV4dHJhIGNhbGwgdG8KKyAgICAgICAgICAgIC8vIHB1c2hCb2R5IGFuZCBwb3BCb2R5LiAgTWF5YmUgd2UgY2FuIGZ1cnRoZXIgb3B0aW1pemUKKyAgICAgICAgICAgIC8vIGhlcmUgYnkgZ2V0dGluZyByaWQgb2YgdGhlIHRlbXBvcmFyeSB2YXJpYWJsZSwgYnV0IGluCisgICAgICAgICAgICAvLyByZWFsaXR5IGl0IGxvb2tzIGxpa2UgamF2YWMgZG9lcyB0aGlzIGZvciB1cy4KKyAgICAgICAgICAgIE5vZGUuTm9kZXMgYm9keSA9IG4uZ2V0Qm9keSgpOworICAgICAgICAgICAgaWYgKGJvZHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gdGVtcGxhdGVUZXh0T3B0aW1pemF0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKGJvZHkuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgTm9kZSBib2R5RWxlbWVudCA9IGJvZHkuZ2V0Tm9kZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHlFbGVtZW50IGluc3RhbmNlb2YgTm9kZS5UZW1wbGF0ZVRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVGV4dE9wdGltaXphdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RyaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2YXJOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBxdW90ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChOb2RlLlRlbXBsYXRlVGV4dClib2R5RWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRleHQoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjsiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFhYWCAtIEFub3RoZXIgcG9zc2libGUgb3B0aW1pemF0aW9uIHdvdWxkIGJlIGZvcgorICAgICAgICAgICAgICAgIC8vIGxvbmUgRUwgZXhwcmVzc2lvbnMgKG5vIG5lZWQgdG8gcHVzaEJvZHkgaGVyZSBlaXRoZXIpLgorCisgICAgICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZVRleHRPcHRpbWl6YXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dCA9IF9qc3B4X3BhZ2VfY29udGV4dC5wdXNoQm9keSgpOyIpOworICAgICAgICAgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICAgICAgICAgIlN0cmluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2YXJOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIigoamF2YXguc2VydmxldC5qc3AudGFnZXh0LkJvZHlDb250ZW50KSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJvdXQpLmdldFN0cmluZygpOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgib3V0ID0gX2pzcHhfcGFnZV9jb250ZXh0LnBvcEJvZHkoKTsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEVtcHR5IGJvZHkgbXVzdCBiZSB0cmVhdGVkIGFzICIiCisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIlN0cmluZyAiICsgdmFyTmFtZSArICIgPSBcIlwiOyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdmFyTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTaW1pbGFyIHRvIGdlbmVyYXRlTmFtZWRBdHRyaWJ1dGVWYWx1ZSwgYnV0IGNyZWF0ZSBhIEpzcEZyYWdtZW50CisgICAgICAgICAqIGluc3RlYWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuIFRoZSBwYXJlbnQgbm9kZSBvZiB0aGUgbmFtZWQgYXR0cmlidXRlCisgICAgICAgICAqIEBwYXJhbSB0YWdIYW5kbGVyVmFyIFRoZSB2YXJpYWJsZSB0aGUgdGFnIGhhbmRsZXIgaXMgc3RvcmVkIGluLAorICAgICAgICAgKiAgICAgc28gdGhlIGZyYWdtZW50IGtub3dzIGl0cyBwYXJlbnQgdGFnLgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSB0ZW1wb3JhcnkgdmFyaWFibGUgdGhlIGZyYWdtZW50CisgICAgICAgICAqICAgICBpcyBzdG9yZWQgaW4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlTmFtZWRBdHRyaWJ1dGVKc3BGcmFnbWVudCgKKyAgICAgICAgICAgIE5vZGUuTmFtZWRBdHRyaWJ1dGUgbiwKKyAgICAgICAgICAgIFN0cmluZyB0YWdIYW5kbGVyVmFyKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmcgdmFyTmFtZSA9IG4uZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisKKyAgICAgICAgICAgIG91dC5wcmludGluKAorICAgICAgICAgICAgICAgICJqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuSnNwRnJhZ21lbnQgIiArIHZhck5hbWUgKyAiID0gIik7CisgICAgICAgICAgICBnZW5lcmF0ZUpzcEZyYWdtZW50KG4sIHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjsiKTsKKworICAgICAgICAgICAgcmV0dXJuIHZhck5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdlbmVyYXRlTG9jYWxWYXJpYWJsZXMoU2VydmxldFdyaXRlciBvdXQsIE5vZGUgbikKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIE5vZGUuQ2hpbGRJbmZvIGNpOworICAgICAgICBpZiAobiBpbnN0YW5jZW9mIE5vZGUuQ3VzdG9tVGFnKSB7CisgICAgICAgICAgICBjaSA9ICgoTm9kZS5DdXN0b21UYWcpbikuZ2V0Q2hpbGRJbmZvKCk7CisgICAgICAgIH0gZWxzZSBpZiAobiBpbnN0YW5jZW9mIE5vZGUuSnNwQm9keSkgeworICAgICAgICAgICAgY2kgPSAoKE5vZGUuSnNwQm9keSluKS5nZXRDaGlsZEluZm8oKTsKKyAgICAgICAgfSBlbHNlIGlmIChuIGluc3RhbmNlb2YgTm9kZS5OYW1lZEF0dHJpYnV0ZSkgeworICAgICAgICAgICAgY2kgPSAoKE5vZGUuTmFtZWRBdHRyaWJ1dGUpbikuZ2V0Q2hpbGRJbmZvKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBDYW5ub3QgYWNjZXNzIGVyciBzaW5jZSB0aGlzIG1ldGhvZCBpcyBzdGF0aWMsIGJ1dCBhdAorICAgICAgICAgICAgLy8gbGVhc3QgZmxhZyBhbiBlcnJvci4KKyAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgTm9kZSBUeXBlIik7CisgICAgICAgICAgICAvL2Vyci5nZXRTdHJpbmcoCisgICAgICAgICAgICAvLyAgICAianNwLmVycm9yLmludGVybmFsLnVuZXhwZWN0ZWRfbm9kZV90eXBlIiApICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2kuaGFzVXNlQmVhbigpKSB7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgiSHR0cFNlc3Npb24gc2Vzc2lvbiA9IF9qc3B4X3BhZ2VfY29udGV4dC5nZXRTZXNzaW9uKCk7Iik7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAiU2VydmxldENvbnRleHQgYXBwbGljYXRpb24gPSBfanNweF9wYWdlX2NvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKTsiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2kuaGFzVXNlQmVhbigpCisgICAgICAgICAgICB8fCBjaS5oYXNJbmNsdWRlQWN0aW9uKCkKKyAgICAgICAgICAgIHx8IGNpLmhhc1NldFByb3BlcnR5KCkKKyAgICAgICAgICAgIHx8IGNpLmhhc1BhcmFtQWN0aW9uKCkpIHsKKyAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICJIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IChIdHRwU2VydmxldFJlcXVlc3QpX2pzcHhfcGFnZV9jb250ZXh0LmdldFJlcXVlc3QoKTsiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2kuaGFzSW5jbHVkZUFjdGlvbigpKSB7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAiSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9IChIdHRwU2VydmxldFJlc3BvbnNlKV9qc3B4X3BhZ2VfY29udGV4dC5nZXRSZXNwb25zZSgpOyIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tbW9uIHBhcnQgb2YgcG9zdGFtYmxlLCBzaGFyZWQgYnkgYm90aCBzZXJ2bGV0cyBhbmQgdGFnIGZpbGVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZW5Db21tb25Qb3N0YW1ibGUoKSB7CisgICAgICAgIC8vIEFwcGVuZCBhbnkgbWV0aG9kcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGluIHRoZSBidWZmZXIuCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kc0J1ZmZlcmVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBHZW5CdWZmZXIgbWV0aG9kQnVmZmVyID0gKEdlbkJ1ZmZlciltZXRob2RzQnVmZmVyZWQuZ2V0KGkpOworICAgICAgICAgICAgbWV0aG9kQnVmZmVyLmFkanVzdEphdmFMaW5lcyhvdXQuZ2V0SmF2YUxpbmUoKSAtIDEpOworICAgICAgICAgICAgb3V0LnByaW50TXVsdGlMbihtZXRob2RCdWZmZXIudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBcHBlbmQgdGhlIGhlbHBlciBjbGFzcworICAgICAgICBpZiAoZnJhZ21lbnRIZWxwZXJDbGFzcy5pc1VzZWQoKSkgeworICAgICAgICAgICAgZnJhZ21lbnRIZWxwZXJDbGFzcy5nZW5lcmF0ZVBvc3RhbWJsZSgpOworICAgICAgICAgICAgZnJhZ21lbnRIZWxwZXJDbGFzcy5hZGp1c3RKYXZhTGluZXMob3V0LmdldEphdmFMaW5lKCkgLSAxKTsKKyAgICAgICAgICAgIG91dC5wcmludE11bHRpTG4oZnJhZ21lbnRIZWxwZXJDbGFzcy50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFwcGVuZCBjaGFyIGFycmF5IGRlY2xhcmF0aW9ucworICAgICAgICBpZiAoY2hhckFycmF5QnVmZmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5wcmludE11bHRpTG4oY2hhckFycmF5QnVmZmVyLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2xvc2UgdGhlIGNsYXNzIGRlZmluaXRpb24KKyAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgZW5kaW5nIHBhcnQgb2YgdGhlIHN0YXRpYyBwb3J0aW9uIG9mIHRoZSBzZXJ2bGV0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVBvc3RhbWJsZShOb2RlLk5vZGVzIHBhZ2UpIHsKKyAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgifSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsiKTsKKyAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAiaWYgKCEodCBpbnN0YW5jZW9mIFNraXBQYWdlRXhjZXB0aW9uKSl7Iik7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJvdXQgPSBfanNweF9vdXQ7Iik7CisgICAgICAgIG91dC5wcmludGlsKCJpZiAob3V0ICE9IG51bGwgJiYgb3V0LmdldEJ1ZmZlclNpemUoKSAhPSAwKSIpOworICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgib3V0LmNsZWFyQnVmZmVyKCk7Iik7CisgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKworICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICJpZiAoX2pzcHhfcGFnZV9jb250ZXh0ICE9IG51bGwpIF9qc3B4X3BhZ2VfY29udGV4dC5oYW5kbGVQYWdlRXhjZXB0aW9uKHQpOyIpOworICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgb3V0LnByaW50aWwoIn0gZmluYWxseSB7Iik7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisKKyAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAiaWYgKF9qc3B4RmFjdG9yeSAhPSBudWxsKSBfanNweEZhY3RvcnkucmVsZWFzZVBhZ2VDb250ZXh0KF9qc3B4X3BhZ2VfY29udGV4dCk7Iik7CisKKyAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgifSIpOworCisgICAgICAgIC8vIENsb3NlIHRoZSBzZXJ2aWNlIG1ldGhvZAorICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisKKyAgICAgICAgLy8gR2VuZXJhdGVkIG1ldGhvZHMsIGhlbHBlciBjbGFzc2VzLCBldGMuCisgICAgICAgIGdlbkNvbW1vblBvc3RhbWJsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqLworICAgIEdlbmVyYXRvcihTZXJ2bGV0V3JpdGVyIG91dCwgQ29tcGlsZXIgY29tcGlsZXIpIHsKKyAgICAgICAgdGhpcy5vdXQgPSBvdXQ7CisgICAgICAgIG1ldGhvZHNCdWZmZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgY2hhckFycmF5QnVmZmVyID0gbnVsbDsKKyAgICAgICAgZXJyID0gY29tcGlsZXIuZ2V0RXJyb3JEaXNwYXRjaGVyKCk7CisgICAgICAgIGN0eHQgPSBjb21waWxlci5nZXRDb21waWxhdGlvbkNvbnRleHQoKTsKKyAgICAgICAgZnJhZ21lbnRIZWxwZXJDbGFzcyA9CisgICAgICAgICAgICBuZXcgRnJhZ21lbnRIZWxwZXJDbGFzcyhjdHh0LmdldFNlcnZsZXRDbGFzc05hbWUoKSArICJIZWxwZXIiKTsKKyAgICAgICAgcGFnZUluZm8gPSBjb21waWxlci5nZXRQYWdlSW5mbygpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFRlbXBvcmFyeSBoYWNrLiBJZiBhIEpTUCBwYWdlIHVzZXMgdGhlICJleHRlbmRzIiBhdHRyaWJ1dGUgb2YgdGhlCisgICAgICAgICAqIHBhZ2UgZGlyZWN0aXZlLCB0aGUgX2pzcEluaXQoKSBtZXRob2Qgb2YgdGhlIGdlbmVyYXRlZCBzZXJ2bGV0IGNsYXNzCisgICAgICAgICAqIHdpbGwgbm90IGJlIGNhbGxlZCAoaXQgaXMgb25seSBjYWxsZWQgZm9yIHRob3NlIGdlbmVyYXRlZCBzZXJ2bGV0cworICAgICAgICAgKiB0aGF0IGV4dGVuZCBIdHRwSnNwQmFzZSwgdGhlIGRlZmF1bHQpLCBjYXVzaW5nIHRoZSB0YWcgaGFuZGxlciBwb29scworICAgICAgICAgKiBub3QgdG8gYmUgaW5pdGlhbGl6ZWQgYW5kIHJlc3VsdGluZyBpbiBhIE5QRS4KKyAgICAgICAgICogVGhlIEpTUCBzcGVjIG5lZWRzIHRvIGNsYXJpZnkgd2hldGhlciBjb250YWluZXJzIGNhbiBvdmVycmlkZQorICAgICAgICAgKiBpbml0KCkgYW5kIGRlc3Ryb3koKS4gRm9yIG5vdywgd2UganVzdCBkaXNhYmxlIHRhZyBwb29saW5nIGZvciBwYWdlcworICAgICAgICAgKiB0aGF0IHVzZSAiZXh0ZW5kcyIuCisgICAgICAgICAqLworICAgICAgICBpZiAocGFnZUluZm8uZ2V0RXh0ZW5kcyhmYWxzZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgaXNQb29saW5nRW5hYmxlZCA9IGN0eHQuZ2V0T3B0aW9ucygpLmlzUG9vbGluZ0VuYWJsZWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlzUG9vbGluZ0VuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBiZWFuSW5mbyA9IHBhZ2VJbmZvLmdldEJlYW5SZXBvc2l0b3J5KCk7CisgICAgICAgIGJyZWFrQXRMRiA9IGN0eHQuZ2V0T3B0aW9ucygpLmdldE1hcHBlZEZpbGUoKTsKKyAgICAgICAgaWYgKGlzUG9vbGluZ0VuYWJsZWQpIHsKKyAgICAgICAgICAgIHRhZ0hhbmRsZXJQb29sTmFtZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWFpbiBlbnRyeSBmb3IgR2VuZXJhdG9yLgorICAgICAqIEBwYXJhbSBvdXQgVGhlIHNlcnZsZXQgb3V0cHV0IHdyaXRlcgorICAgICAqIEBwYXJhbSBjb21waWxlciBUaGUgY29tcGlsZXIKKyAgICAgKiBAcGFyYW0gcGFnZSBUaGUgaW5wdXQgcGFnZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZSgKKyAgICAgICAgU2VydmxldFdyaXRlciBvdXQsCisgICAgICAgIENvbXBpbGVyIGNvbXBpbGVyLAorICAgICAgICBOb2RlLk5vZGVzIHBhZ2UpCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIEdlbmVyYXRvciBnZW4gPSBuZXcgR2VuZXJhdG9yKG91dCwgY29tcGlsZXIpOworCisgICAgICAgIGlmIChnZW4uaXNQb29saW5nRW5hYmxlZCkgeworICAgICAgICAgICAgZ2VuLmNvbXBpbGVUYWdIYW5kbGVyUG9vbExpc3QocGFnZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdlbi5jdHh0LmlzVGFnRmlsZSgpKSB7CisgICAgICAgICAgICBKYXNwZXJUYWdJbmZvIHRhZ0luZm8gPSAoSmFzcGVyVGFnSW5mbylnZW4uY3R4dC5nZXRUYWdJbmZvKCk7CisgICAgICAgICAgICBnZW4uZ2VuZXJhdGVUYWdIYW5kbGVyUHJlYW1ibGUodGFnSW5mbywgcGFnZSk7CisKKyAgICAgICAgICAgIGlmIChnZW4uY3R4dC5pc1Byb3RvdHlwZU1vZGUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ2VuLmdlbmVyYXRlWG1sUHJvbG9nKHBhZ2UpOworICAgICAgICAgICAgZ2VuLmZyYWdtZW50SGVscGVyQ2xhc3MuZ2VuZXJhdGVQcmVhbWJsZSgpOworICAgICAgICAgICAgcGFnZS52aXNpdCgKKyAgICAgICAgICAgICAgICBnZW4ubmV3IEdlbmVyYXRlVmlzaXRvcigKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmN0eHQuaXNUYWdGaWxlKCksCisgICAgICAgICAgICAgICAgICAgIG91dCwKKyAgICAgICAgICAgICAgICAgICAgZ2VuLm1ldGhvZHNCdWZmZXJlZCwKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmZyYWdtZW50SGVscGVyQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgIGdlbi5jdHh0LmdldENsYXNzTG9hZGVyKCksCisgICAgICAgICAgICAgICAgICAgIHRhZ0luZm8pKTsKKyAgICAgICAgICAgIGdlbi5nZW5lcmF0ZVRhZ0hhbmRsZXJQb3N0YW1ibGUodGFnSW5mbyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW4uZ2VuZXJhdGVQcmVhbWJsZShwYWdlKTsKKyAgICAgICAgICAgIGdlbi5nZW5lcmF0ZVhtbFByb2xvZyhwYWdlKTsKKyAgICAgICAgICAgIGdlbi5mcmFnbWVudEhlbHBlckNsYXNzLmdlbmVyYXRlUHJlYW1ibGUoKTsKKyAgICAgICAgICAgIHBhZ2UudmlzaXQoCisgICAgICAgICAgICAgICAgZ2VuLm5ldyBHZW5lcmF0ZVZpc2l0b3IoCisgICAgICAgICAgICAgICAgICAgIGdlbi5jdHh0LmlzVGFnRmlsZSgpLAorICAgICAgICAgICAgICAgICAgICBvdXQsCisgICAgICAgICAgICAgICAgICAgIGdlbi5tZXRob2RzQnVmZmVyZWQsCisgICAgICAgICAgICAgICAgICAgIGdlbi5mcmFnbWVudEhlbHBlckNsYXNzLAorICAgICAgICAgICAgICAgICAgICBnZW4uY3R4dC5nZXRDbGFzc0xvYWRlcigpLAorICAgICAgICAgICAgICAgICAgICBudWxsKSk7CisgICAgICAgICAgICBnZW4uZ2VuZXJhdGVQb3N0YW1ibGUocGFnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEdlbmVyYXRlcyB0YWcgaGFuZGxlciBwcmVhbWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVUYWdIYW5kbGVyUHJlYW1ibGUoCisgICAgICAgIEphc3BlclRhZ0luZm8gdGFnSW5mbywKKyAgICAgICAgTm9kZS5Ob2RlcyB0YWcpCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIC8vIEdlbmVyYXRlIHBhY2thZ2UgZGVjbGFyYXRpb24KKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHRhZ0luZm8uZ2V0VGFnQ2xhc3NOYW1lKCk7CisgICAgICAgIGludCBsYXN0SW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKGxhc3RJbmRleCAhPSAtMSkgeworICAgICAgICAgICAgU3RyaW5nIHBrZ05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGxhc3RJbmRleCk7CisgICAgICAgICAgICBnZW5QcmVhbWJsZVBhY2thZ2UocGtnTmFtZSk7CisgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGxhc3RJbmRleCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2VuZXJhdGUgaW1wb3J0cworICAgICAgICBnZW5QcmVhbWJsZUltcG9ydHMoKTsKKworICAgICAgICAvLyBHZW5lcmF0ZSBjbGFzcyBkZWNsYXJhdGlvbgorICAgICAgICBvdXQucHJpbnRpbigicHVibGljIGZpbmFsIGNsYXNzICIpOworICAgICAgICBvdXQucHJpbnRsbihjbGFzc05hbWUpOworICAgICAgICBvdXQucHJpbnRpbCgiICAgIGV4dGVuZHMgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlNpbXBsZVRhZ1N1cHBvcnQiKTsKKyAgICAgICAgb3V0LnByaW50aW4oCisgICAgICAgICAgICAiICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BTb3VyY2VEZXBlbmRlbnQiKTsKKyAgICAgICAgaWYgKHRhZ0luZm8uaGFzRHluYW1pY0F0dHJpYnV0ZXMoKSkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgIG91dC5wcmludGluKAorICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuRHluYW1pY0F0dHJpYnV0ZXMiKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbigiIHsiKTsKKyAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDbGFzcyBib2R5IGJlZ2lucyBoZXJlCisgICAgICAgICAqLworCisgICAgICAgIGdlbmVyYXRlRGVjbGFyYXRpb25zKHRhZyk7CisKKyAgICAgICAgLy8gU3RhdGljIGluaXRpYWxpemF0aW9ucyBoZXJlCisgICAgICAgIGdlblByZWFtYmxlU3RhdGljSW5pdGlhbGl6ZXJzKCk7CisKKyAgICAgICAgb3V0LnByaW50aWwoInByaXZhdGUgSnNwQ29udGV4dCBqc3BDb250ZXh0OyIpOworCisgICAgICAgIC8vIERlY2xhcmUgd3JpdGVyIHVzZWQgZm9yIHN0b3JpbmcgcmVzdWx0IG9mIGZyYWdtZW50L2JvZHkgaW52b2NhdGlvbgorICAgICAgICAvLyBpZiAndmFyUmVhZGVyJyBvciAndmFyJyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkCisgICAgICAgIG91dC5wcmludGlsKCJwcml2YXRlIGphdmEuaW8uV3JpdGVyIF9qc3B4X3NvdXQ7Iik7CisKKyAgICAgICAgLy8gQ2xhc3MgdmFyaWFibGUgZGVjbGFyYXRpb25zCisgICAgICAgIGdlblByZWFtYmxlQ2xhc3NWYXJpYWJsZURlY2xhcmF0aW9ucyh0YWdJbmZvLmdldFRhZ05hbWUoKSk7CisKKyAgICAgICAgZ2VuZXJhdGVTZXRKc3BDb250ZXh0KHRhZ0luZm8pOworCisgICAgICAgIC8vIFRhZy1oYW5kbGVyIHNwZWNpZmljIGRlY2xhcmF0aW9ucworICAgICAgICBnZW5lcmF0ZVRhZ0hhbmRsZXJBdHRyaWJ1dGVzKHRhZ0luZm8pOworICAgICAgICBpZiAodGFnSW5mby5oYXNEeW5hbWljQXR0cmlidXRlcygpKQorICAgICAgICAgICAgZ2VuZXJhdGVTZXREeW5hbWljQXR0cmlidXRlKCk7CisKKyAgICAgICAgLy8gTWV0aG9kcyBoZXJlCisgICAgICAgIGdlblByZWFtYmxlTWV0aG9kcygpOworCisgICAgICAgIC8vIE5vdyB0aGUgZG9UYWcoKSBtZXRob2QKKyAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAicHVibGljIHZvaWQgZG9UYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsiKTsKKworICAgICAgICBpZiAoY3R4dC5pc1Byb3RvdHlwZU1vZGUoKSkgeworICAgICAgICAgICAgb3V0LnByaW50aWwoIn0iKTsKKyAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvdXQucHVzaEluZGVudCgpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFjY29yZGluZyB0byB0aGUgc3BlYywgJ3BhZ2VDb250ZXh0JyBtdXN0IG5vdCBiZSBtYWRlIGF2YWlsYWJsZSBhcworICAgICAgICAgKiBhbiBpbXBsaWNpdCBvYmplY3QgaW4gdGFnIGZpbGVzLgorICAgICAgICAgKiBEZWNsYXJlIF9qc3B4X3BhZ2VfY29udGV4dCwgc28gd2UgY2FuIHNoYXJlIHRoZSBjb2RlIGdlbmVyYXRvciB3aXRoCisgICAgICAgICAqIEpTUHMuCisgICAgICAgICAqLworICAgICAgICBvdXQucHJpbnRpbCgiUGFnZUNvbnRleHQgX2pzcHhfcGFnZV9jb250ZXh0ID0gKFBhZ2VDb250ZXh0KWpzcENvbnRleHQ7Iik7CisKKyAgICAgICAgLy8gRGVjbGFyZSBpbXBsaWNpdCBvYmplY3RzLgorICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICJIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9ICIKKyAgICAgICAgICAgICAgICArICIoSHR0cFNlcnZsZXRSZXF1ZXN0KSBfanNweF9wYWdlX2NvbnRleHQuZ2V0UmVxdWVzdCgpOyIpOworICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICJIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gIgorICAgICAgICAgICAgICAgICsgIihIdHRwU2VydmxldFJlc3BvbnNlKSBfanNweF9wYWdlX2NvbnRleHQuZ2V0UmVzcG9uc2UoKTsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoIkh0dHBTZXNzaW9uIHNlc3Npb24gPSBfanNweF9wYWdlX2NvbnRleHQuZ2V0U2Vzc2lvbigpOyIpOworICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICJTZXJ2bGV0Q29udGV4dCBhcHBsaWNhdGlvbiA9IF9qc3B4X3BhZ2VfY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpOyIpOworICAgICAgICBvdXQucHJpbnRpbCgiU2VydmxldENvbmZpZyBjb25maWcgPSBfanNweF9wYWdlX2NvbnRleHQuZ2V0U2VydmxldENvbmZpZygpOyIpOworICAgICAgICBvdXQucHJpbnRpbCgiSnNwV3JpdGVyIG91dCA9IGpzcENvbnRleHQuZ2V0T3V0KCk7Iik7CisgICAgICAgIGlmIChpc1Bvb2xpbmdFbmFibGVkICYmICF0YWdIYW5kbGVyUG9vbE5hbWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgb3V0LnByaW50aWwoIl9qc3BJbml0KGNvbmZpZyk7Iik7CisgICAgICAgIH0KKyAgICAgICAgZ2VuZXJhdGVQYWdlU2NvcGVkVmFyaWFibGVzKHRhZ0luZm8pOworCisgICAgICAgIGRlY2xhcmVUZW1wb3JhcnlTY3JpcHRpbmdWYXJzKHRhZyk7CisgICAgICAgIG91dC5wcmludGxuKCk7CisKKyAgICAgICAgb3V0LnByaW50aWwoInRyeSB7Iik7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlVGFnSGFuZGxlclBvc3RhbWJsZShUYWdJbmZvIHRhZ0luZm8pIHsKKyAgICAgICAgb3V0LnBvcEluZGVudCgpOworCisgICAgICAgIC8vIEhhdmUgdG8gY2F0Y2ggVGhyb3dhYmxlIGJlY2F1c2UgYSBjbGFzc2ljIHRhZyBoYW5kbGVyCisgICAgICAgIC8vIGhlbHBlciBtZXRob2QgaXMgZGVjbGFyZWQgdG8gdGhyb3cgVGhyb3dhYmxlLgorICAgICAgICBvdXQucHJpbnRpbCgifSBjYXRjaCggVGhyb3dhYmxlIHQgKSB7Iik7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJpZiggdCBpbnN0YW5jZW9mIFNraXBQYWdlRXhjZXB0aW9uICkiKTsKKyAgICAgICAgb3V0LnByaW50aWwoIiAgICB0aHJvdyAoU2tpcFBhZ2VFeGNlcHRpb24pIHQ7Iik7CisgICAgICAgIG91dC5wcmludGlsKCJpZiggdCBpbnN0YW5jZW9mIGphdmEuaW8uSU9FeGNlcHRpb24gKSIpOworICAgICAgICBvdXQucHJpbnRpbCgiICAgIHRocm93IChqYXZhLmlvLklPRXhjZXB0aW9uKSB0OyIpOworICAgICAgICBvdXQucHJpbnRpbCgiaWYoIHQgaW5zdGFuY2VvZiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gKSIpOworICAgICAgICBvdXQucHJpbnRpbCgiICAgIHRocm93IChJbGxlZ2FsU3RhdGVFeGNlcHRpb24pIHQ7Iik7CisgICAgICAgIG91dC5wcmludGlsKCJpZiggdCBpbnN0YW5jZW9mIEpzcEV4Y2VwdGlvbiApIik7CisgICAgICAgIG91dC5wcmludGlsKCIgICAgdGhyb3cgKEpzcEV4Y2VwdGlvbikgdDsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoInRocm93IG5ldyBKc3BFeGNlcHRpb24odCk7Iik7CisgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgb3V0LnByaW50aWwoIn0gZmluYWxseSB7Iik7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgIigob3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BDb250ZXh0V3JhcHBlcikganNwQ29udGV4dCkuc3luY0VuZFRhZ0ZpbGUoKTsiKTsKKyAgICAgICAgaWYgKGlzUG9vbGluZ0VuYWJsZWQgJiYgIXRhZ0hhbmRsZXJQb29sTmFtZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgiX2pzcERlc3Ryb3koKTsiKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisKKyAgICAgICAgLy8gQ2xvc2UgdGhlIGRvVGFnIG1ldGhvZAorICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisKKyAgICAgICAgLy8gR2VuZXJhdGVkIG1ldGhvZHMsIGhlbHBlciBjbGFzc2VzLCBldGMuCisgICAgICAgIGdlbkNvbW1vblBvc3RhbWJsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBkZWNsYXJhdGlvbnMgZm9yIHRhZyBoYW5kbGVyIGF0dHJpYnV0ZXMsIGFuZCBkZWZpbmVzIHRoZQorICAgICAqIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGVhY2guCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlVGFnSGFuZGxlckF0dHJpYnV0ZXMoVGFnSW5mbyB0YWdJbmZvKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAodGFnSW5mby5oYXNEeW5hbWljQXR0cmlidXRlcygpKSB7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAicHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBfanNweF9keW5hbWljX2F0dHJzID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZWNsYXJlIGF0dHJpYnV0ZXMKKyAgICAgICAgVGFnQXR0cmlidXRlSW5mb1tdIGF0dHJJbmZvcyA9IHRhZ0luZm8uZ2V0QXR0cmlidXRlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJJbmZvcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgb3V0LnByaW50aW4oInByaXZhdGUgIik7CisgICAgICAgICAgICBpZiAoYXR0ckluZm9zW2ldLmlzRnJhZ21lbnQoKSkgeworICAgICAgICAgICAgICAgIG91dC5wcmludCgiamF2YXguc2VydmxldC5qc3AudGFnZXh0LkpzcEZyYWdtZW50ICIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoSnNwVXRpbC50b0phdmFTb3VyY2VUeXBlKGF0dHJJbmZvc1tpXS5nZXRUeXBlTmFtZSgpKSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnQoYXR0ckluZm9zW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiOyIpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludGxuKCk7CisKKyAgICAgICAgLy8gRGVmaW5lIGF0dHJpYnV0ZSBnZXR0ZXIgYW5kIHNldHRlciBtZXRob2RzCisgICAgICAgIGlmIChhdHRySW5mb3MgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRySW5mb3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBnZXR0ZXIgbWV0aG9kCisgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oInB1YmxpYyAiKTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0ckluZm9zW2ldLmlzRnJhZ21lbnQoKSkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoImphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BGcmFnbWVudCAiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoSnNwVXRpbC50b0phdmFTb3VyY2VUeXBlKGF0dHJJbmZvc1tpXS5nZXRUeXBlTmFtZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQucHJpbnQodG9HZXR0ZXJNZXRob2QoYXR0ckluZm9zW2ldLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgeyIpOworICAgICAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oInJldHVybiB0aGlzLiIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChhdHRySW5mb3NbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiOyIpOworICAgICAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisKKyAgICAgICAgICAgICAgICAvLyBzZXR0ZXIgbWV0aG9kCisgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oInB1YmxpYyB2b2lkICIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCh0b1NldHRlck1ldGhvZE5hbWUoYXR0ckluZm9zW2ldLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgIGlmIChhdHRySW5mb3NbaV0uaXNGcmFnbWVudCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiKGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BGcmFnbWVudCAiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIigiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KEpzcFV0aWwudG9KYXZhU291cmNlVHlwZShhdHRySW5mb3NbaV0uZ2V0VHlwZU5hbWUoKSkpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LnByaW50KGF0dHJJbmZvc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpIHsiKTsKKyAgICAgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgICAgIG91dC5wcmludGluKCJ0aGlzLiIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChhdHRySW5mb3NbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiA9ICIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChhdHRySW5mb3NbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiOyIpOworICAgICAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEdlbmVyYXRlIHNldHRlciBmb3IgSnNwQ29udGV4dCBzbyB3ZSBjYW4gY3JlYXRlIGEgd3JhcHBlciBhbmQKKyAgICAgKiBzdG9yZSBib3RoIHRoZSBvcmlnaW5hbCBhbmQgdGhlIHdyYXBwZXIuICBXZSBuZWVkIHRoZSB3cmFwcGVyCisgICAgICogdG8gbWFzayB0aGUgcGFnZSBjb250ZXh0IGZyb20gdGhlIHRhZyBmaWxlIGFuZCBzaW11bGF0ZSBhCisgICAgICogZnJlc2ggcGFnZSBjb250ZXh0LiAgV2UgbmVlZCB0aGUgb3JpZ2luYWwgdG8gZG8gdGhpbmdzIGxpa2UKKyAgICAgKiBzeW5jIEFUX0JFR0lOIGFuZCBBVF9FTkQgc2NyaXB0aW5nIHZhcmlhYmxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVTZXRKc3BDb250ZXh0KFRhZ0luZm8gdGFnSW5mbykgeworCisgICAgICAgIGJvb2xlYW4gbmVzdGVkU2VlbiA9IGZhbHNlOworICAgICAgICBib29sZWFuIGF0QmVnaW5TZWVuID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gYXRFbmRTZWVuID0gZmFsc2U7CisKKyAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZXJlIGFyZSBhbnkgYWxpYXNlcworICAgICAgICBib29sZWFuIGFsaWFzU2VlbiA9IGZhbHNlOworICAgICAgICBUYWdWYXJpYWJsZUluZm9bXSB0YWdWYXJzID0gdGFnSW5mby5nZXRUYWdWYXJpYWJsZUluZm9zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnVmFycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHRhZ1ZhcnNbaV0uZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgdGFnVmFyc1tpXS5nZXROYW1lR2l2ZW4oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWxpYXNTZWVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChhbGlhc1NlZW4pIHsKKyAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICJwdWJsaWMgdm9pZCBzZXRKc3BDb250ZXh0KEpzcENvbnRleHQgY3R4LCBqYXZhLnV0aWwuTWFwIGFsaWFzTWFwKSB7Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgicHVibGljIHZvaWQgc2V0SnNwQ29udGV4dChKc3BDb250ZXh0IGN0eCkgeyIpOworICAgICAgICB9CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJzdXBlci5zZXRKc3BDb250ZXh0KGN0eCk7Iik7CisgICAgICAgIG91dC5wcmludGlsKCJqYXZhLnV0aWwuQXJyYXlMaXN0IF9qc3B4X25lc3RlZCA9IG51bGw7Iik7CisgICAgICAgIG91dC5wcmludGlsKCJqYXZhLnV0aWwuQXJyYXlMaXN0IF9qc3B4X2F0X2JlZ2luID0gbnVsbDsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoImphdmEudXRpbC5BcnJheUxpc3QgX2pzcHhfYXRfZW5kID0gbnVsbDsiKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ1ZhcnMubGVuZ3RoOyBpKyspIHsKKworICAgICAgICAgICAgc3dpdGNoICh0YWdWYXJzW2ldLmdldFNjb3BlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFZhcmlhYmxlSW5mby5ORVNURUQgOgorICAgICAgICAgICAgICAgICAgICBpZiAoIW5lc3RlZFNlZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfanNweF9uZXN0ZWQgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOyIpOworICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkU2VlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oIl9qc3B4X25lc3RlZC5hZGQoIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBWYXJpYWJsZUluZm8uQVRfQkVHSU4gOgorICAgICAgICAgICAgICAgICAgICBpZiAoIWF0QmVnaW5TZWVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2pzcHhfYXRfYmVnaW4gPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOyIpOworICAgICAgICAgICAgICAgICAgICAgICAgYXRCZWdpblNlZW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKCJfanNweF9hdF9iZWdpbi5hZGQoIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBWYXJpYWJsZUluZm8uQVRfRU5EIDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhdEVuZFNlZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfanNweF9hdF9lbmQgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOyIpOworICAgICAgICAgICAgICAgICAgICAgICAgYXRFbmRTZWVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigiX2pzcHhfYXRfZW5kLmFkZCgiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IC8vIHN3aXRjaAorCisgICAgICAgICAgICBvdXQucHJpbnQocXVvdGUodGFnVmFyc1tpXS5nZXROYW1lR2l2ZW4oKSkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFsaWFzU2VlbikgeworICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgInRoaXMuanNwQ29udGV4dCA9IG5ldyBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcENvbnRleHRXcmFwcGVyKGN0eCwgX2pzcHhfbmVzdGVkLCBfanNweF9hdF9iZWdpbiwgX2pzcHhfYXRfZW5kLCBhbGlhc01hcCk7Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAidGhpcy5qc3BDb250ZXh0ID0gbmV3IG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwQ29udGV4dFdyYXBwZXIoY3R4LCBfanNweF9uZXN0ZWQsIF9qc3B4X2F0X2JlZ2luLCBfanNweF9hdF9lbmQsIG51bGwpOyIpOworICAgICAgICB9CisgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgb3V0LnByaW50aWwoIn0iKTsKKyAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgb3V0LnByaW50aWwoInB1YmxpYyBKc3BDb250ZXh0IGdldEpzcENvbnRleHQoKSB7Iik7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJyZXR1cm4gdGhpcy5qc3BDb250ZXh0OyIpOworICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZW5lcmF0ZXMgaW1wbGVtZW50YXRpb24gb2YKKyAgICAgKiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuRHluYW1pY0F0dHJpYnV0ZXMuc2V0RHluYW1pY0F0dHJpYnV0ZSgpIG1ldGhvZCwKKyAgICAgKiB3aGljaCBzYXZlcyBlYWNoIGR5bmFtaWMgYXR0cmlidXRlIHRoYXQgaXMgcGFzc2VkIGluIHNvIHRoYXQgYSBzY29wZWQKKyAgICAgKiB2YXJpYWJsZSBjYW4gbGF0ZXIgYmUgY3JlYXRlZCBmb3IgaXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTZXREeW5hbWljQXR0cmlidXRlKCkgeworICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICJwdWJsaWMgdm9pZCBzZXREeW5hbWljQXR0cmlidXRlKFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7Iik7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgIC8qCisgICAgICAgICAqIEFjY29yZGluZyB0byB0aGUgc3BlYywgb25seSBkeW5hbWljIGF0dHJpYnV0ZXMgd2l0aCBubyB1cmkgYXJlIHRvCisgICAgICAgICAqIGJlIHByZXNlbnQgaW4gdGhlIE1hcDsgYWxsIG90aGVyIGR5bmFtaWMgYXR0cmlidXRlcyBhcmUgaWdub3JlZC4KKyAgICAgICAgICovCisgICAgICAgIG91dC5wcmludGlsKCJpZiAodXJpID09IG51bGwpIik7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJfanNweF9keW5hbWljX2F0dHJzLnB1dChsb2NhbE5hbWUsIHZhbHVlKTsiKTsKKyAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDcmVhdGVzIGEgcGFnZS1zY29wZWQgdmFyaWFibGUgZm9yIGVhY2ggZGVjbGFyZWQgdGFnIGF0dHJpYnV0ZS4KKyAgICAgKiBBbHNvLCBpZiB0aGUgdGFnIGFjY2VwdHMgZHluYW1pYyBhdHRyaWJ1dGVzLCBhIHBhZ2Utc2NvcGVkIHZhcmlhYmxlCisgICAgICogaXMgbWFkZSBhdmFpbGFibGUgZm9yIGVhY2ggZHluYW1pYyBhdHRyaWJ1dGUgdGhhdCB3YXMgcGFzc2VkIGluLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVBhZ2VTY29wZWRWYXJpYWJsZXMoSmFzcGVyVGFnSW5mbyB0YWdJbmZvKSB7CisKKyAgICAgICAgLy8gIm5vcm1hbCIgYXR0cmlidXRlcworICAgICAgICBUYWdBdHRyaWJ1dGVJbmZvW10gYXR0ckluZm9zID0gdGFnSW5mby5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0ckluZm9zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBhdHRySW5mb3NbaV0uZ2V0TmFtZSgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoImlmKCAiICsgdG9HZXR0ZXJNZXRob2QoYXR0ck5hbWUpICsgIiAhPSBudWxsICkgIik7CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aW4oIl9qc3B4X3BhZ2VfY29udGV4dC5zZXRBdHRyaWJ1dGUoIik7CisgICAgICAgICAgICBvdXQucHJpbnQocXVvdGUoYXR0ck5hbWUpKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICAgIG91dC5wcmludCh0b0dldHRlck1ldGhvZChhdHRyTmFtZSkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBFeHBvc2UgdGhlIE1hcCBjb250YWluaW5nIGR5bmFtaWMgYXR0cmlidXRlcyBhcyBhIHBhZ2Utc2NvcGVkIHZhcgorICAgICAgICBpZiAodGFnSW5mby5oYXNEeW5hbWljQXR0cmlidXRlcygpKSB7CisgICAgICAgICAgICBvdXQucHJpbnRpbigiX2pzcHhfcGFnZV9jb250ZXh0LnNldEF0dHJpYnV0ZShcIiIpOworICAgICAgICAgICAgb3V0LnByaW50KHRhZ0luZm8uZ2V0RHluYW1pY0F0dHJpYnV0ZXNNYXBOYW1lKCkpOworICAgICAgICAgICAgb3V0LnByaW50KCJcIiwgX2pzcHhfZHluYW1pY19hdHRycyk7Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEdlbmVyYXRlcyB0aGUgZ2V0dGVyIG1ldGhvZCBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHRvR2V0dGVyTWV0aG9kKFN0cmluZyBhdHRyTmFtZSkgeworICAgICAgICBjaGFyW10gYXR0ckNoYXJzID0gYXR0ck5hbWUudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgYXR0ckNoYXJzWzBdID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGF0dHJDaGFyc1swXSk7CisgICAgICAgIHJldHVybiAiZ2V0IiArIG5ldyBTdHJpbmcoYXR0ckNoYXJzKSArICIoKSI7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIHNldHRlciBtZXRob2QgbmFtZSBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHRvU2V0dGVyTWV0aG9kTmFtZShTdHJpbmcgYXR0ck5hbWUpIHsKKyAgICAgICAgY2hhcltdIGF0dHJDaGFycyA9IGF0dHJOYW1lLnRvQ2hhckFycmF5KCk7CisgICAgICAgIGF0dHJDaGFyc1swXSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShhdHRyQ2hhcnNbMF0pOworICAgICAgICByZXR1cm4gInNldCIgKyBuZXcgU3RyaW5nKGF0dHJDaGFycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3Mgc3RvcmluZyB0aGUgcmVzdWx0IG9mIGludHJvc3BlY3RpbmcgYSBjdXN0b20gdGFnIGhhbmRsZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGFnSGFuZGxlckluZm8geworCisgICAgICAgIHByaXZhdGUgSGFzaHRhYmxlIG1ldGhvZE1hcHM7CisgICAgICAgIHByaXZhdGUgSGFzaHRhYmxlIHByb3BlcnR5RWRpdG9yTWFwczsKKyAgICAgICAgcHJpdmF0ZSBDbGFzcyB0YWdIYW5kbGVyQ2xhc3M7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbiBUaGUgY3VzdG9tIHRhZyB3aG9zZSB0YWcgaGFuZGxlciBjbGFzcyBpcyB0byBiZQorICAgICAgICAgKiBpbnRyb3NwZWN0ZWQKKyAgICAgICAgICogQHBhcmFtIHRhZ0hhbmRsZXJDbGFzcyBUYWcgaGFuZGxlciBjbGFzcworICAgICAgICAgKiBAcGFyYW0gZXJyIEVycm9yIGRpc3BhdGNoZXIKKyAgICAgICAgICovCisgICAgICAgIFRhZ0hhbmRsZXJJbmZvKE5vZGUgbiwgQ2xhc3MgdGFnSGFuZGxlckNsYXNzLCBFcnJvckRpc3BhdGNoZXIgZXJyKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aGlzLnRhZ0hhbmRsZXJDbGFzcyA9IHRhZ0hhbmRsZXJDbGFzczsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kTWFwcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgICAgIHRoaXMucHJvcGVydHlFZGl0b3JNYXBzID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEJlYW5JbmZvIHRhZ0NsYXNzSW5mbyA9CisgICAgICAgICAgICAgICAgICAgIEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyh0YWdIYW5kbGVyQ2xhc3MpOworICAgICAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHBkID0gdGFnQ2xhc3NJbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIEZJWE1FOiBzaG91bGQgcHJvYmFibHkgYmUgY2hlY2tpbmcgZm9yIHRoaW5ncyBsaWtlCisgICAgICAgICAgICAgICAgICAgICAqICAgICAgICBwYWdlQ29udGV4dCwgYm9keUNvbnRlbnQsIGFuZCBwYXJlbnQgaGVyZSAtYWt2CisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAocGRbaV0uZ2V0V3JpdGVNZXRob2QoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RNYXBzLnB1dChwZFtpXS5nZXROYW1lKCksIHBkW2ldLmdldFdyaXRlTWV0aG9kKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwZFtpXS5nZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RWRpdG9yTWFwcy5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRbaV0uZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkW2ldLmdldFByb3BlcnR5RWRpdG9yQ2xhc3MoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgbiwKKyAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci5pbnRyb3NwZWN0LnRhZ2hhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICB0YWdIYW5kbGVyQ2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBpZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogWFhYCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWV0aG9kIGdldFNldHRlck1ldGhvZChTdHJpbmcgYXR0ck5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiAoTWV0aG9kKW1ldGhvZE1hcHMuZ2V0KGF0dHJOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBYWFgKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDbGFzcyBnZXRQcm9wZXJ0eUVkaXRvckNsYXNzKFN0cmluZyBhdHRyTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIChDbGFzcylwcm9wZXJ0eUVkaXRvck1hcHMuZ2V0KGF0dHJOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBYWFgKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDbGFzcyBnZXRUYWdIYW5kbGVyQ2xhc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gdGFnSGFuZGxlckNsYXNzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjbGFzcyBmb3IgZ2VuZXJhdGluZyBjb2RlcyB0byBhIGJ1ZmZlci4gIEluY2x1ZGVkIGhlcmUgYXJlIHNvbWUKKyAgICAgKiBzdXBwb3J0IGZvciB0cmFja2luZyBzb3VyY2UgdG8gSmF2YSBsaW5lcyBtYXBwaW5nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdlbkJ1ZmZlciB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRm9yIGEgQ3VzdG9tVGFnLCB0aGUgY29kZXMgdGhhdCBhcmUgZ2VuZXJhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgICAgICAgICogdGhlIHRhZyBtYXkgbm90IGJlIGluIHRoZSBzYW1lIGJ1ZmZlciBhcyB0aG9zZSBmb3IgdGhlIGJvZHkgb2YgdGhlCisgICAgICAgICAqIHRhZy4gIFR3byBmaWVsZHMgYXJlIHVzZWQgaGVyZSB0byBrZWVwIHRoaXMgc3RyYWlnaHQuICBGb3IgY29kZXMKKyAgICAgICAgICogdGhhdCBkbyBub3QgY29ycmVzcG9uZHMgdG8gYW55IEpTUCBsaW5lcywgdGhleSBzaG91bGQgYmUgbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgTm9kZSBub2RlOworICAgICAgICBwcml2YXRlIE5vZGUuTm9kZXMgYm9keTsKKyAgICAgICAgcHJpdmF0ZSBqYXZhLmlvLkNoYXJBcnJheVdyaXRlciBjaGFyV3JpdGVyOworICAgICAgICBwcm90ZWN0ZWQgU2VydmxldFdyaXRlciBvdXQ7CisKKyAgICAgICAgR2VuQnVmZmVyKCkgeworICAgICAgICAgICAgdGhpcyhudWxsLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIEdlbkJ1ZmZlcihOb2RlIG4sIE5vZGUuTm9kZXMgYikgeworICAgICAgICAgICAgbm9kZSA9IG47CisgICAgICAgICAgICBib2R5ID0gYjsKKyAgICAgICAgICAgIGlmIChib2R5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBib2R5LnNldEdlbmVyYXRlZEluQnVmZmVyKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhcldyaXRlciA9IG5ldyBqYXZhLmlvLkNoYXJBcnJheVdyaXRlcigpOworICAgICAgICAgICAgb3V0ID0gbmV3IFNlcnZsZXRXcml0ZXIobmV3IGphdmEuaW8uUHJpbnRXcml0ZXIoY2hhcldyaXRlcikpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNlcnZsZXRXcml0ZXIgZ2V0T3V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gY2hhcldyaXRlci50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkanVzdCB0aGUgSmF2YSBMaW5lcy4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIEphdmEgbGluZXMKKyAgICAgICAgICogc3RvcmVkIHdpdGggdGhlIG5vZGVzIGFyZSByZWxhdGl2ZSB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgYnVmZmVyCisgICAgICAgICAqIGFuZCBuZWVkIHRvIGJlIGFkanVzdGVkIHdoZW4gdGhpcyBidWZmZXIgaXMgaW5zZXJ0ZWQgaW50byB0aGUKKyAgICAgICAgICogc291cmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRqdXN0SmF2YUxpbmVzKGZpbmFsIGludCBvZmZzZXQpIHsKKworICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFkanVzdEphdmFMaW5lKG5vZGUsIG9mZnNldCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChib2R5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBib2R5LnZpc2l0KG5ldyBOb2RlLlZpc2l0b3IoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRvVmlzaXQoTm9kZSBuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0SmF2YUxpbmUobiwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5DdXN0b21UYWcgbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLk5vZGVzIGIgPSBuLmdldEJvZHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiAhPSBudWxsICYmICFiLmlzR2VuZXJhdGVkSW5CdWZmZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBhZGp1c3QgbGluZXMgZm9yIHRoZSBuZXN0ZWQgdGFncyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBhbHNvIGdlbmVyYXRlZCBpbiBidWZmZXJzLCBiZWNhdXNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGp1c3RtZW50cyB3aWxsIGJlIGRvbmUgZWxzZXdoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSmFzcGVyRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGp1c3RKYXZhTGluZShOb2RlIG4sIGludCBvZmZzZXQpIHsKKyAgICAgICAgICAgIGlmIChuLmdldEJlZ2luSmF2YUxpbmUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUobi5nZXRCZWdpbkphdmFMaW5lKCkgKyBvZmZzZXQpOworICAgICAgICAgICAgICAgIG4uc2V0RW5kSmF2YUxpbmUobi5nZXRFbmRKYXZhTGluZSgpICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBnZW5lcmF0ZWQgRnJhZ21lbnQgSGVscGVyIENsYXNzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRnJhZ21lbnRIZWxwZXJDbGFzcyB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRnJhZ21lbnQgeworICAgICAgICAgICAgcHJpdmF0ZSBHZW5CdWZmZXIgZ2VuQnVmZmVyOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgaWQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBGcmFnbWVudChpbnQgaWQsIE5vZGUgbm9kZSkgeworICAgICAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgICAgICAgICBnZW5CdWZmZXIgPSBuZXcgR2VuQnVmZmVyKG51bGwsIG5vZGUuZ2V0Qm9keSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEdlbkJ1ZmZlciBnZXRHZW5CdWZmZXIoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuQnVmZmVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IGdldElkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVHJ1ZSBpZiB0aGUgaGVscGVyIGNsYXNzIHNob3VsZCBiZSBnZW5lcmF0ZWQuCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiB1c2VkID0gZmFsc2U7CisKKyAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3QgZnJhZ21lbnRzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKworICAgICAgICAvLyBCdWZmZXIgZm9yIGVudGlyZSBoZWxwZXIgY2xhc3MKKyAgICAgICAgcHJpdmF0ZSBHZW5CdWZmZXIgY2xhc3NCdWZmZXIgPSBuZXcgR2VuQnVmZmVyKCk7CisKKyAgICAgICAgcHVibGljIEZyYWdtZW50SGVscGVyQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmNsYXNzTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVXNlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnVzZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVByZWFtYmxlKCkgeworICAgICAgICAgICAgU2VydmxldFdyaXRlciBvdXQgPSB0aGlzLmNsYXNzQnVmZmVyLmdldE91dCgpOworICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICAvLyBOb3RlOiBjYW5ub3QgYmUgc3RhdGljLCBhcyB3ZSBuZWVkIHRvIHJlZmVyZW5jZSB0aGluZ3MgbGlrZQorICAgICAgICAgICAgLy8gX2pzcHhfbWV0aF8qCisgICAgICAgICAgICBvdXQucHJpbnRpbCgicHJpdmF0ZSBjbGFzcyAiICsgY2xhc3NOYW1lKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICIgICAgZXh0ZW5kcyAiICsgIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwRnJhZ21lbnRIZWxwZXIiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ7Iik7CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgInByaXZhdGUgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkpzcFRhZyBfanNweF9wYXJlbnQ7Iik7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgicHJpdmF0ZSBpbnRbXSBfanNweF9wdXNoX2JvZHlfY291bnQ7Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgInB1YmxpYyAiCisgICAgICAgICAgICAgICAgICAgICsgY2xhc3NOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIiggaW50IGRpc2NyaW1pbmF0b3IsIEpzcENvbnRleHQganNwQ29udGV4dCwgIgorICAgICAgICAgICAgICAgICAgICArICJqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuSnNwVGFnIF9qc3B4X3BhcmVudCwgIgorICAgICAgICAgICAgICAgICAgICArICJpbnRbXSBfanNweF9wdXNoX2JvZHlfY291bnQgKSB7Iik7CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoInN1cGVyKCBkaXNjcmltaW5hdG9yLCBqc3BDb250ZXh0LCBfanNweF9wYXJlbnQgKTsiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ0aGlzLl9qc3B4X3BhcmVudCA9IF9qc3B4X3BhcmVudDsiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ0aGlzLl9qc3B4X3B1c2hfYm9keV9jb3VudCA9IF9qc3B4X3B1c2hfYm9keV9jb3VudDsiKTsKKyAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRnJhZ21lbnQgb3BlbkZyYWdtZW50KAorICAgICAgICAgICAgTm9kZSBwYXJlbnQsCisgICAgICAgICAgICBTdHJpbmcgdGFnSGFuZGxlclZhciwKKyAgICAgICAgICAgIGludCBtZXRob2ROZXN0aW5nKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBGcmFnbWVudCByZXN1bHQgPSBuZXcgRnJhZ21lbnQoZnJhZ21lbnRzLnNpemUoKSwgcGFyZW50KTsKKyAgICAgICAgICAgIGZyYWdtZW50cy5hZGQocmVzdWx0KTsKKyAgICAgICAgICAgIHRoaXMudXNlZCA9IHRydWU7CisgICAgICAgICAgICBwYXJlbnQuc2V0SW5uZXJDbGFzc05hbWUoY2xhc3NOYW1lKTsKKworICAgICAgICAgICAgU2VydmxldFdyaXRlciBvdXQgPSByZXN1bHQuZ2V0R2VuQnVmZmVyKCkuZ2V0T3V0KCk7CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIC8vIFhYWCAtIFJldHVybnMgYm9vbGVhbiBiZWNhdXNlIGlmIGEgdGFnIGlzIGludm9rZWQgZnJvbQorICAgICAgICAgICAgLy8gd2l0aGluIHRoaXMgZnJhZ21lbnQsIHRoZSBHZW5lcmF0b3Igc29tZXRpbWVzIG1pZ2h0CisgICAgICAgICAgICAvLyBnZW5lcmF0ZSBjb2RlIGxpa2UgInJldHVybiB0cnVlIi4gIFRoaXMgaXMgaWdub3JlZCBmb3Igbm93LAorICAgICAgICAgICAgLy8gbWVhbmluZyBvbmx5IHRoZSBmcmFnbWVudCBpcyBza2lwcGVkLiAgVGhlIEpTUi0xNTIKKyAgICAgICAgICAgIC8vIGV4cGVydCBncm91cCBpcyBjdXJyZW50bHkgZGlzY3Vzc2luZyB3aGF0IHRvIGRvIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgIC8vIFNlZSBjb21tZW50IGluIGNsb3NlRnJhZ21lbnQoKQorICAgICAgICAgICAgaWYgKG1ldGhvZE5lc3RpbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oInB1YmxpYyBib29sZWFuIGludm9rZSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigicHVibGljIHZvaWQgaW52b2tlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnRsbihyZXN1bHQuZ2V0SWQoKSArICIoICIgKyAiSnNwV3JpdGVyIG91dCApICIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIC8vIE5vdGU6IFRocm93YWJsZSByZXF1aXJlZCBiZWNhdXNlIG1ldGhvZHMgbGlrZSBfanNweF9tZXRoXyoKKyAgICAgICAgICAgIC8vIHRocm93IFRocm93YWJsZS4KKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ0aHJvd3MgVGhyb3dhYmxlIik7CisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgieyIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIGdlbmVyYXRlTG9jYWxWYXJpYWJsZXMob3V0LCBwYXJlbnQpOworCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2VGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgaW50IG1ldGhvZE5lc3RpbmcpIHsKKyAgICAgICAgICAgIFNlcnZsZXRXcml0ZXIgb3V0ID0gZnJhZ21lbnQuZ2V0R2VuQnVmZmVyKCkuZ2V0T3V0KCk7CisgICAgICAgICAgICAvLyBYWFggLSBTZWUgY29tbWVudCBpbiBvcGVuRnJhZ21lbnQoKQorICAgICAgICAgICAgaWYgKG1ldGhvZE5lc3RpbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoInJldHVybiBmYWxzZTsiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoInJldHVybjsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVBvc3RhbWJsZSgpIHsKKyAgICAgICAgICAgIFNlcnZsZXRXcml0ZXIgb3V0ID0gdGhpcy5jbGFzc0J1ZmZlci5nZXRPdXQoKTsKKyAgICAgICAgICAgIC8vIEdlbmVyYXRlIGFsbCBmcmFnbWVudCBtZXRob2RzOgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmcmFnbWVudCA9IChGcmFnbWVudClmcmFnbWVudHMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGZyYWdtZW50LmdldEdlbkJ1ZmZlcigpLmFkanVzdEphdmFMaW5lcyhvdXQuZ2V0SmF2YUxpbmUoKSAtIDEpOworICAgICAgICAgICAgICAgIG91dC5wcmludE11bHRpTG4oZnJhZ21lbnQuZ2V0R2VuQnVmZmVyKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEdlbmVyYXRlIHBvc3RhbWJsZToKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJwdWJsaWMgdm9pZCBpbnZva2UoIGphdmEuaW8uV3JpdGVyIHdyaXRlciApIik7CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoInRocm93cyBKc3BFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ7Iik7CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoIkpzcFdyaXRlciBvdXQgPSBudWxsOyIpOworICAgICAgICAgICAgb3V0LnByaW50aWwoImlmKCB3cml0ZXIgIT0gbnVsbCApIHsiKTsKKyAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgib3V0ID0gdGhpcy5qc3BDb250ZXh0LnB1c2hCb2R5KHdyaXRlcik7Iik7CisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgifSBlbHNlIHsiKTsKKyAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgib3V0ID0gdGhpcy5qc3BDb250ZXh0LmdldE91dCgpOyIpOworICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoIn0iKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ0cnkgeyIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJzd2l0Y2goIHRoaXMuZGlzY3JpbWluYXRvciApIHsiKTsKKyAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJjYXNlICIgKyBpICsgIjoiKTsKKyAgICAgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJpbnZva2UiICsgaSArICIoIG91dCApOyIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJicmVhazsiKTsKKyAgICAgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOyAvLyBzd2l0Y2gKKyAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7IC8vIHRyeQorICAgICAgICAgICAgb3V0LnByaW50aWwoImNhdGNoKCBUaHJvd2FibGUgZSApIHsiKTsKKyAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAiaWYgKGUgaW5zdGFuY2VvZiBTa2lwUGFnZUV4Y2VwdGlvbikiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCIgICAgdGhyb3cgKFNraXBQYWdlRXhjZXB0aW9uKSBlOyIpOworICAgICAgICAgICAgb3V0LnByaW50aWwoInRocm93IG5ldyBKc3BFeGNlcHRpb24oIGUgKTsiKTsKKyAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7IC8vIGNhdGNoCisgICAgICAgICAgICBvdXQucHJpbnRpbCgiZmluYWxseSB7Iik7CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworCisgICAgICAgICAgICBvdXQucHJpbnRpbCgiaWYoIHdyaXRlciAhPSBudWxsICkgeyIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ0aGlzLmpzcENvbnRleHQucG9wQm9keSgpOyIpOworICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoIn0iKTsKKworICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoIn0iKTsgLy8gZmluYWxseQorICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoIn0iKTsgLy8gaW52b2tlIG1ldGhvZAorICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoIn0iKTsgLy8gaGVscGVyIGNsYXNzCisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGNsYXNzQnVmZmVyLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGp1c3RKYXZhTGluZXMoaW50IG9mZnNldCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmcmFnbWVudCA9IChGcmFnbWVudClmcmFnbWVudHMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGZyYWdtZW50LmdldEdlbkJ1ZmZlcigpLmFkanVzdEphdmFMaW5lcyhvZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9JbXBsaWNpdFRhZ0xpYnJhcnlJbmZvLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0ltcGxpY2l0VGFnTGlicmFyeUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTgyODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9JbXBsaWNpdFRhZ0xpYnJhcnlJbmZvLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkZ1bmN0aW9uSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnTGlicmFyeUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0luZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0ZpbGVJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkpzcENvbXBpbGF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CisKKy8qKgorICogQ2xhc3MgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgYW4gaW1wbGljaXQgdGFnIGxpYnJhcnkgY29udGFpbmluZyB0YWcKKyAqIGhhbmRsZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhZyBmaWxlcyBpbiAiL1dFQi1JTkYvdGFncy8iIG9yIGEgCisgKiBzdWJkaXJlY3Rvcnkgb2YgaXQuCisgKgorICogQGF1dGhvciBKYW4gTHVlaGUKKyAqLworY2xhc3MgSW1wbGljaXRUYWdMaWJyYXJ5SW5mbyBleHRlbmRzIFRhZ0xpYnJhcnlJbmZvIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU5GX1RBR1MgPSAiL1dFQi1JTkYvdGFncyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19GSUxFX1NVRkZJWCA9ICIudGFnIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHWF9GSUxFX1NVRkZJWCA9ICIudGFneCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR1NfU0hPUlROQU1FID0gInRhZ3MiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUTElCX1ZFUlNJT04gPSAiMS4wIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1ZFUlNJT04gPSAiMi4wIjsKKworICAgIC8vIE1hcHMgdGFnIG5hbWVzIHRvIHRhZyBmaWxlIHBhdGhzCisgICAgcHJpdmF0ZSBIYXNodGFibGUgdGFnRmlsZU1hcDsKKworICAgIHByaXZhdGUgUGFyc2VyQ29udHJvbGxlciBwYzsKKyAgICBwcml2YXRlIFZlY3RvciB2ZWM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW1wbGljaXRUYWdMaWJyYXJ5SW5mbyhKc3BDb21waWxhdGlvbkNvbnRleHQgY3R4dCwKKwkJCQkgIFBhcnNlckNvbnRyb2xsZXIgcGMsCisJCQkJICBTdHJpbmcgcHJlZml4LAorCQkJCSAgU3RyaW5nIHRhZ2RpciwKKwkJCQkgIEVycm9yRGlzcGF0Y2hlciBlcnIpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBzdXBlcihwcmVmaXgsIG51bGwpOworCXRoaXMucGMgPSBwYzsKKwl0aGlzLnRhZ0ZpbGVNYXAgPSBuZXcgSGFzaHRhYmxlKCk7CisJdGhpcy52ZWMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgLy8gSW1wbGljaXQgdGFnIGxpYnJhcmllcyBoYXZlIG5vIGZ1bmN0aW9uczoKKyAgICAgICAgdGhpcy5mdW5jdGlvbnMgPSBuZXcgRnVuY3Rpb25JbmZvWzBdOworCisJdGxpYnZlcnNpb24gPSBUTElCX1ZFUlNJT047CisJanNwdmVyc2lvbiA9IEpTUF9WRVJTSU9OOworCisJaWYgKCF0YWdkaXIuc3RhcnRzV2l0aChXRUJfSU5GX1RBR1MpKSB7CisJICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLmludmFsaWQudGFnZGlyIiwgdGFnZGlyKTsKKwl9CisJCisJLy8gRGV0ZXJtaW5lIHRoZSB2YWx1ZSBvZiB0aGUgPHNob3J0LW5hbWU+IHN1YmVsZW1lbnQgb2YgdGhlCisJLy8gImltYWdpbmFyeSIgPHRhZ2xpYj4gZWxlbWVudAorCWlmICh0YWdkaXIuZXF1YWxzKFdFQl9JTkZfVEFHUykKKwkgICAgICAgIHx8IHRhZ2Rpci5lcXVhbHMoIFdFQl9JTkZfVEFHUyArICIvIikpIHsKKwkgICAgc2hvcnRuYW1lID0gVEFHU19TSE9SVE5BTUU7CisJfSBlbHNlIHsKKwkgICAgc2hvcnRuYW1lID0gdGFnZGlyLnN1YnN0cmluZyhXRUJfSU5GX1RBR1MubGVuZ3RoKCkpOworCSAgICBzaG9ydG5hbWUgPSBzaG9ydG5hbWUucmVwbGFjZSgnLycsICctJyk7CisJfQorCisJLy8gUG9wdWxhdGUgbWFwcGluZyBvZiB0YWcgbmFtZXMgdG8gdGFnIGZpbGUgcGF0aHMKKwlTZXQgZGlyTGlzdCA9IGN0eHQuZ2V0UmVzb3VyY2VQYXRocyh0YWdkaXIpOworCWlmIChkaXJMaXN0ICE9IG51bGwpIHsKKwkgICAgSXRlcmF0b3IgaXQgPSBkaXJMaXN0Lml0ZXJhdG9yKCk7CisJICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisJCWlmIChwYXRoLmVuZHNXaXRoKFRBR19GSUxFX1NVRkZJWCkKKwkJICAgICAgICB8fCBwYXRoLmVuZHNXaXRoKFRBR1hfRklMRV9TVUZGSVgpKSB7CisJCSAgICAvKgorCQkgICAgICogVXNlIHRoZSBmaWxlbmFtZSBvZiB0aGUgdGFnIGZpbGUsIHdpdGhvdXQgdGhlIC50YWcgb3IKKwkJICAgICAqIC50YWd4IGV4dGVuc2lvbiwgcmVzcGVjdGl2ZWx5LCBhcyB0aGUgPG5hbWU+IHN1YmVsZW1lbnQKKwkJICAgICAqIG9mIHRoZSAiaW1hZ2luYXJ5IiA8dGFnLWZpbGU+IGVsZW1lbnQKKwkJICAgICAqLworCQkgICAgU3RyaW5nIHN1ZmZpeCA9IHBhdGguZW5kc1dpdGgoVEFHX0ZJTEVfU1VGRklYKSA/CisJCQlUQUdfRklMRV9TVUZGSVggOiBUQUdYX0ZJTEVfU1VGRklYOyAKKwkJICAgIFN0cmluZyB0YWdOYW1lID0gcGF0aC5zdWJzdHJpbmcocGF0aC5sYXN0SW5kZXhPZigiLyIpICsgMSk7CisJCSAgICB0YWdOYW1lID0gdGFnTmFtZS5zdWJzdHJpbmcoMCwKKwkJCQkJCXRhZ05hbWUubGFzdEluZGV4T2Yoc3VmZml4KSk7CisJCSAgICB0YWdGaWxlTWFwLnB1dCh0YWdOYW1lLCBwYXRoKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIHRhZyBuYW1lIG1hcHMgdG8gYSB0YWcgZmlsZSBwYXRoLAorICAgICAqIGFuZCBpZiBzbywgcGFyc2VzIHRoZSBjb3JyZXNwb25kaW5nIHRhZyBmaWxlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgVGFnRmlsZUluZm8gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdGFnIG5hbWUsIG9yIG51bGwgaWYKKyAgICAgKiB0aGUgZ2l2ZW4gdGFnIG5hbWUgaXMgbm90IGltcGxlbWVudGVkIGFzIGEgdGFnIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnRmlsZUluZm8gZ2V0VGFnRmlsZShTdHJpbmcgc2hvcnROYW1lKSB7CisKKwlUYWdGaWxlSW5mbyB0YWdGaWxlID0gc3VwZXIuZ2V0VGFnRmlsZShzaG9ydE5hbWUpOworCWlmICh0YWdGaWxlID09IG51bGwpIHsKKwkgICAgU3RyaW5nIHBhdGggPSAoU3RyaW5nKSB0YWdGaWxlTWFwLmdldChzaG9ydE5hbWUpOworCSAgICBpZiAocGF0aCA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOworCSAgICB9CisKKwkgICAgVGFnSW5mbyB0YWdJbmZvID0gbnVsbDsKKwkgICAgdHJ5IHsKKwkJdGFnSW5mbyA9IFRhZ0ZpbGVQcm9jZXNzb3IucGFyc2VUYWdGaWxlRGlyZWN0aXZlcyhwYywKKwkJCQkJCQkJICBzaG9ydE5hbWUsCisJCQkJCQkJCSAgcGF0aCwKKwkJCQkJCQkJICB0aGlzKTsKKwkgICAgfSBjYXRjaCAoSmFzcGVyRXhjZXB0aW9uIGplKSB7CisJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGplLnRvU3RyaW5nKCkpOworCSAgICB9CisKKwkgICAgdGFnRmlsZSA9IG5ldyBUYWdGaWxlSW5mbyhzaG9ydE5hbWUsIHBhdGgsIHRhZ0luZm8pOworCSAgICB2ZWMuYWRkRWxlbWVudCh0YWdGaWxlKTsKKworCSAgICB0aGlzLnRhZ0ZpbGVzID0gbmV3IFRhZ0ZpbGVJbmZvW3ZlYy5zaXplKCldOworCSAgICB2ZWMuY29weUludG8odGhpcy50YWdGaWxlcyk7CisJfQorCisJcmV0dXJuIHRhZ0ZpbGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9KRFRDb21waWxlci5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9KRFRDb21waWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOTFiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0pEVENvbXBpbGVyLmphdmEKQEAgLTAsMCArMSw0NTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkRlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklDb21waWxlclJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUVycm9ySGFuZGxpbmdQb2xpY3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklQcm9ibGVtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlUmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5OYW1lRW52aXJvbm1lbnRBbnN3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkRlZmF1bHRQcm9ibGVtRmFjdG9yeTsKKworLyoqCisgKiBKRFQgY2xhc3MgY29tcGlsZXIuIFRoaXMgY29tcGlsZXIgd2lsbCBsb2FkIHNvdXJjZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUKKyAqIGNvbnRleHQgY2xhc3Nsb2FkZXIsIHJlZHVjaW5nIGRyYW1hdGljYWxseSBkaXNrIGFjY2VzcyBkdXJpbmcgCisgKiB0aGUgY29tcGlsYXRpb24gcHJvY2Vzcy4KKyAqCisgKiBAYXV0aG9yIENvY29vbjIKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqLworcHVibGljIGNsYXNzIEpEVENvbXBpbGVyIGV4dGVuZHMgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuQ29tcGlsZXIgeworCisgICAgCisgICAgLyoqIAorICAgICAqIENvbXBpbGUgdGhlIHNlcnZsZXQgZnJvbSAuamF2YSBmaWxlIHRvIC5jbGFzcyBmaWxlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVDbGFzcyhTdHJpbmdbXSBzbWFwKQorICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBKYXNwZXJFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgbG9uZyB0MSA9IDA7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgdDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZUZpbGUgPSBjdHh0LmdldFNlcnZsZXRKYXZhRmlsZU5hbWUoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dERpciA9IGN0eHQuZ2V0T3B0aW9ucygpLmdldFNjcmF0Y2hEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY3R4dC5nZXRTZXJ2bGV0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldENsYXNzTmFtZSA9IAorICAgICAgICAgICAgKChwYWNrYWdlTmFtZS5sZW5ndGgoKSAhPSAwKSA/IChwYWNrYWdlTmFtZSArICIuIikgOiAiIikgCisgICAgICAgICAgICAgICAgICAgICsgY3R4dC5nZXRTZXJ2bGV0Q2xhc3NOYW1lKCk7CisgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gY3R4dC5nZXRKc3BMb2FkZXIoKTsKKyAgICAgICAgU3RyaW5nW10gZmlsZU5hbWVzID0gbmV3IFN0cmluZ1tdIHtzb3VyY2VGaWxlfTsKKyAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lcyA9IG5ldyBTdHJpbmdbXSB7dGFyZ2V0Q2xhc3NOYW1lfTsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0IHByb2JsZW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAKKyAgICAgICAgY2xhc3MgQ29tcGlsYXRpb25Vbml0IGltcGxlbWVudHMgSUNvbXBpbGF0aW9uVW5pdCB7CisKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWU7CisgICAgICAgICAgICBTdHJpbmcgc291cmNlRmlsZTsKKworICAgICAgICAgICAgQ29tcGlsYXRpb25Vbml0KFN0cmluZyBzb3VyY2VGaWxlLCBTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VGaWxlID0gc291cmNlRmlsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGNoYXJbXSBnZXRGaWxlTmFtZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlRmlsZS50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgY2hhcltdIGdldENvbnRlbnRzKCkgeworICAgICAgICAgICAgICAgIGNoYXJbXSByZXN1bHQgPSBudWxsOworICAgICAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBudWxsIDsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciBpc1JlYWRlciA9IG51bGwgOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzUmVhZGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZUZpbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHh0LmdldE9wdGlvbnMoKS5nZXRKYXZhRW5jb2RpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpc1JlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbODE5Ml07CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChjb3VudCA9IHJlYWRlci5yZWFkKGNoYXJzLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFycy5sZW5ndGgpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGNoYXJzLCAwLCBjb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgY2hhcltidWYubGVuZ3RoKCldOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmdldENoYXJzKDAsIHJlc3VsdC5sZW5ndGgsIHJlc3VsdCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ29tcGlsYXRpb24gZXJyb3IiLCBlKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeyAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmKGlzUmVhZGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeyBpc1JlYWRlci5jbG9zZSgpIDsgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkge30KKyAgICAgICAgICAgICAgICAgICAgaWYocmVhZGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeyByZWFkZXIuY2xvc2UoKSA7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmUpIHt9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyBjaGFyW10gZ2V0TWFpblR5cGVOYW1lKCkgeworICAgICAgICAgICAgICAgIGludCBkb3QgPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgICAgICBpZiAoZG90ID4gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhkb3QgKyAxKS50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lLnRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyBjaGFyW11bXSBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgaXplciA9IAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKGNsYXNzTmFtZSwgIi4iKTsKKyAgICAgICAgICAgICAgICBjaGFyW11bXSByZXN1bHQgPSBuZXcgY2hhcltpemVyLmNvdW50VG9rZW5zKCktMV1bXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9rID0gaXplci5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gdG9rLnRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBJTmFtZUVudmlyb25tZW50IGVudiA9IG5ldyBJTmFtZUVudmlyb25tZW50KCkgeworCisgICAgICAgICAgICAgICAgcHVibGljIE5hbWVFbnZpcm9ubWVudEFuc3dlciAKKyAgICAgICAgICAgICAgICAgICAgZmluZFR5cGUoY2hhcltdW10gY29tcG91bmRUeXBlTmFtZSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gIiI7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXAgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb3VuZFR5cGVOYW1lLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gc2VwOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IG5ldyBTdHJpbmcoY29tcG91bmRUeXBlTmFtZVtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiLiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmRUeXBlKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIE5hbWVFbnZpcm9ubWVudEFuc3dlciAKKyAgICAgICAgICAgICAgICAgICAgZmluZFR5cGUoY2hhcltdIHR5cGVOYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdW10gcGFja2FnZU5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXAgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZU5hbWUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gc2VwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBuZXcgU3RyaW5nKHBhY2thZ2VOYW1lW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiLiI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gc2VwOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IG5ldyBTdHJpbmcodHlwZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmRUeXBlKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHByaXZhdGUgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmRUeXBlKFN0cmluZyBjbGFzc05hbWUpIHsKKworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lLmVxdWFscyh0YXJnZXRDbGFzc05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBpbGF0aW9uVW5pdChzb3VyY2VGaWxlLCBjbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5hbWVFbnZpcm9ubWVudEFuc3dlcihjb21waWxhdGlvblVuaXQsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlTmFtZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOworICAgICAgICAgICAgICAgICAgICAgICAgaXMgPSBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBjbGFzc0J5dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs4MTkyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGJ1Zi5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGNvdW50ID0gaXMucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFvcy53cml0ZShidWYsIDAsIGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFvcy5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzQnl0ZXMgPSBiYW9zLnRvQnl0ZUFycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIGZpbGVOYW1lID0gY2xhc3NOYW1lLnRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NGaWxlUmVhZGVyKGNsYXNzQnl0ZXMsIGZpbGVOYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIoY2xhc3NGaWxlUmVhZGVyLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvbXBpbGF0aW9uIGVycm9yIiwgZXhjKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRm9ybWF0RXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDb21waWxhdGlvbiBlcnJvciIsIGV4Yyk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNQYWNrYWdlKFN0cmluZyByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5lcXVhbHModGFyZ2V0Q2xhc3NOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUgPSByZXN1bHQucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzID09IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQYWNrYWdlKGNoYXJbXVtdIHBhcmVudFBhY2thZ2VOYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIHBhY2thZ2VOYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcCA9ICIiOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50UGFja2FnZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnRQYWNrYWdlTmFtZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzZXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcocGFyZW50UGFja2FnZU5hbWVbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHIgPSBuZXcgU3RyaW5nKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHIuY2hhckF0KDApKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1BhY2thZ2UocmVzdWx0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gc2VwOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gc3RyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNQYWNrYWdlKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgZmluYWwgSUVycm9ySGFuZGxpbmdQb2xpY3kgcG9saWN5ID0gCisgICAgICAgICAgICBEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLnByb2NlZWRXaXRoQWxsUHJvYmxlbXMoKTsKKworICAgICAgICBmaW5hbCBNYXAgc2V0dGluZ3MgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBzZXR0aW5ncy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9MaW5lTnVtYmVyQXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXJPcHRpb25zLkdFTkVSQVRFKTsKKyAgICAgICAgc2V0dGluZ3MucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlRmlsZUF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgIENvbXBpbGVyT3B0aW9ucy5HRU5FUkFURSk7CisgICAgICAgIHNldHRpbmdzLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CisgICAgICAgIGlmIChjdHh0LmdldE9wdGlvbnMoKS5nZXRKYXZhRW5jb2RpbmcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXR0aW5ncy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9FbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgY3R4dC5nZXRPcHRpb25zKCkuZ2V0SmF2YUVuY29kaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjdHh0LmdldE9wdGlvbnMoKS5nZXRDbGFzc0RlYnVnSW5mbygpKSB7CisgICAgICAgICAgICBzZXR0aW5ncy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Mb2NhbFZhcmlhYmxlQXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGVyT3B0aW9ucy5HRU5FUkFURSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTb3VyY2UgSlZNCisgICAgICAgIGlmKGN0eHQuZ2V0T3B0aW9ucygpLmdldENvbXBpbGVyU291cmNlVk0oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgb3B0ID0gY3R4dC5nZXRPcHRpb25zKCkuZ2V0Q29tcGlsZXJTb3VyY2VWTSgpOworICAgICAgICAgICAgaWYob3B0LmVxdWFscygiMS4xIikpIHsKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMSk7CisgICAgICAgICAgICB9IGVsc2UgaWYob3B0LmVxdWFscygiMS4yIikpIHsKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMik7CisgICAgICAgICAgICB9IGVsc2UgaWYob3B0LmVxdWFscygiMS4zIikpIHsgCisgICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzMpOworICAgICAgICAgICAgfSBlbHNlIGlmKG9wdC5lcXVhbHMoIjEuNCIpKSB7CisgICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzQpOworICAgICAgICAgICAgfSBlbHNlIGlmKG9wdC5lcXVhbHMoIjEuNSIpKSB7CisgICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2cud2FybigiVW5rbm93biBzb3VyY2UgVk0gIiArIG9wdCArICIgaWdub3JlZC4iKTsKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRGVmYXVsdCB0byAxLjUKKyAgICAgICAgICAgIHNldHRpbmdzLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV81KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gVGFyZ2V0IEpWTQorICAgICAgICBpZihjdHh0LmdldE9wdGlvbnMoKS5nZXRDb21waWxlclRhcmdldFZNKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIG9wdCA9IGN0eHQuZ2V0T3B0aW9ucygpLmdldENvbXBpbGVyVGFyZ2V0Vk0oKTsKKyAgICAgICAgICAgIGlmKG9wdC5lcXVhbHMoIjEuMSIpKSB7CisgICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMSk7CisgICAgICAgICAgICB9IGVsc2UgaWYob3B0LmVxdWFscygiMS4yIikpIHsKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8yKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihvcHQuZXF1YWxzKCIxLjMiKSkgeyAKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8zKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihvcHQuZXF1YWxzKCIxLjQiKSkgeworICAgICAgICAgICAgICAgIHNldHRpbmdzLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1RhcmdldFBsYXRmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzQpOworICAgICAgICAgICAgfSBlbHNlIGlmKG9wdC5lcXVhbHMoIjEuNSIpKSB7CisgICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNSk7CisgICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fQ29tcGxpYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKCJVbmtub3duIHRhcmdldCBWTSAiICsgb3B0ICsgIiBpZ25vcmVkLiIpOworICAgICAgICAgICAgICAgIHNldHRpbmdzLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1RhcmdldFBsYXRmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV81KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gMS41CisgICAgICAgICAgICBzZXR0aW5ncy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSwKKyAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV81KTsKKyAgICAgICAgICAgIHNldHRpbmdzLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UsCisgICAgICAgICAgICAgICAgICAgIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnkgPSAKKyAgICAgICAgICAgIG5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBJQ29tcGlsZXJSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IElDb21waWxlclJlcXVlc3RvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdFJlc3VsdChDb21waWxhdGlvblJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc1Byb2JsZW1zKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSVByb2JsZW1bXSBwcm9ibGVtcyA9IHJlc3VsdC5nZXRQcm9ibGVtcygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2JsZW1zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJUHJvYmxlbSBwcm9ibGVtID0gcHJvYmxlbXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvYmxlbS5pc0Vycm9yKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5ldyBTdHJpbmcocHJvYmxlbXNbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPcmlnaW5hdGluZ0ZpbGVOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JsZW1MaXN0LmFkZChFcnJvckRpc3BhdGNoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlSmF2YWNFcnJvcihuYW1lLCBwYWdlTm9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQnVmZmVyKHByb2JsZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSksIHByb2JsZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNvdXJjZUxpbmVOdW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXNwZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHZpc2l0aW5nIG5vZGUiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByb2JsZW1MaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBDbGFzc0ZpbGVbXSBjbGFzc0ZpbGVzID0gcmVzdWx0LmdldENsYXNzRmlsZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc0ZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0ZpbGUgY2xhc3NGaWxlID0gY2xhc3NGaWxlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IGNsYXNzRmlsZS5nZXRDb21wb3VuZE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXAgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29tcG91bmROYW1lLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lICs9IHNlcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgKz0gbmV3IFN0cmluZyhjb21wb3VuZE5hbWVbal0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IGNsYXNzRmlsZS5nZXRCeXRlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dEZpbGUgPSBvdXRwdXREaXIgKyAiLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGFzc05hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm91dCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGZvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcy53cml0ZShieXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvbXBpbGF0aW9uIGVycm9yIiwgaW9lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdXQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIElDb21waWxhdGlvblVuaXRbXSBjb21waWxhdGlvblVuaXRzID0gCisgICAgICAgICAgICBuZXcgSUNvbXBpbGF0aW9uVW5pdFtjbGFzc05hbWVzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcGlsYXRpb25Vbml0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbaV07CisgICAgICAgICAgICBjb21waWxhdGlvblVuaXRzW2ldID0gbmV3IENvbXBpbGF0aW9uVW5pdChmaWxlTmFtZXNbaV0sIGNsYXNzTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgQ29tcGlsZXIgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIoZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JsZW1GYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgY29tcGlsZXIuY29tcGlsZShjb21waWxhdGlvblVuaXRzKTsKKworICAgICAgICBpZiAoIWN0eHQua2VlcEdlbmVyYXRlZCgpKSB7CisgICAgICAgICAgICBGaWxlIGphdmFGaWxlID0gbmV3IEZpbGUoY3R4dC5nZXRTZXJ2bGV0SmF2YUZpbGVOYW1lKCkpOworICAgICAgICAgICAgamF2YUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgaWYgKCFwcm9ibGVtTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEphdmFjRXJyb3JEZXRhaWxbXSBqZWRzID0gCisgICAgICAgICAgICAgICAgKEphdmFjRXJyb3JEZXRhaWxbXSkgcHJvYmxlbUxpc3QudG9BcnJheShuZXcgSmF2YWNFcnJvckRldGFpbFswXSk7CisgICAgICAgICAgICBlcnJEaXNwYXRjaGVyLmphdmFjRXJyb3IoamVkcyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKKyAgICAgICAgICAgIGxvbmcgdDI9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBsb2cuZGVidWcoIkNvbXBpbGVkICIgKyBjdHh0LmdldFNlcnZsZXRKYXZhRmlsZU5hbWUoKSArICIgIgorICAgICAgICAgICAgICAgICAgICAgICsgKHQyLXQxKSArICJtcyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN0eHQuaXNQcm90b3R5cGVNb2RlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEpTUjQ1IFN1cHBvcnQKKyAgICAgICAgaWYgKCEgb3B0aW9ucy5pc1NtYXBTdXBwcmVzc2VkKCkpIHsKKyAgICAgICAgICAgIFNtYXBVdGlsLmluc3RhbGxTbWFwKHNtYXApOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKK30KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSmFzcGVyVGFnSW5mby5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9KYXNwZXJUYWdJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4NmQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSmFzcGVyVGFnSW5mby5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0Lio7CisKKy8qKgorICogVGFnSW5mbyBleHRlbnNpb24gdXNlZCBieSB0YWcgaGFuZGxlcnMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgdmlhIHRhZyBmaWxlcy4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBuYW1lIG9mIHRoZSBNYXAgdXNlZCB0byBzdG9yZSB0aGUKKyAqIGR5bmFtaWMgYXR0cmlidXRlIG5hbWVzIGFuZCB2YWx1ZXMgcGFzc2VkIHRvIHRoZSBjdXN0b20gYWN0aW9uIGludm9jYXRpb24uCisgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yLgorICovCitjbGFzcyBKYXNwZXJUYWdJbmZvIGV4dGVuZHMgVGFnSW5mbyB7CisKKyAgICBwcml2YXRlIFN0cmluZyBkeW5hbWljQXR0cnNNYXBOYW1lOworCisgICAgcHVibGljIEphc3BlclRhZ0luZm8oU3RyaW5nIHRhZ05hbWUsCisJCQkgU3RyaW5nIHRhZ0NsYXNzTmFtZSwKKwkJCSBTdHJpbmcgYm9keUNvbnRlbnQsCisJCQkgU3RyaW5nIGluZm9TdHJpbmcsCisJCQkgVGFnTGlicmFyeUluZm8gdGFnbGliLAorCQkJIFRhZ0V4dHJhSW5mbyB0YWdFeHRyYUluZm8sCisJCQkgVGFnQXR0cmlidXRlSW5mb1tdIGF0dHJpYnV0ZUluZm8sCisJCQkgU3RyaW5nIGRpc3BsYXlOYW1lLAorCQkJIFN0cmluZyBzbWFsbEljb24sCisJCQkgU3RyaW5nIGxhcmdlSWNvbiwKKwkJCSBUYWdWYXJpYWJsZUluZm9bXSB0dmksCisJCQkgU3RyaW5nIG1hcE5hbWUpIHsKKworCXN1cGVyKHRhZ05hbWUsIHRhZ0NsYXNzTmFtZSwgYm9keUNvbnRlbnQsIGluZm9TdHJpbmcsIHRhZ2xpYiwKKwkgICAgICB0YWdFeHRyYUluZm8sIGF0dHJpYnV0ZUluZm8sIGRpc3BsYXlOYW1lLCBzbWFsbEljb24sIGxhcmdlSWNvbiwKKwkgICAgICB0dmkpOworCXRoaXMuZHluYW1pY0F0dHJzTWFwTmFtZSA9IG1hcE5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREeW5hbWljQXR0cmlidXRlc01hcE5hbWUoKSB7CisJcmV0dXJuIGR5bmFtaWNBdHRyc01hcE5hbWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzRHluYW1pY0F0dHJpYnV0ZXMoKSB7CisgICAgICAgIHJldHVybiBkeW5hbWljQXR0cnNNYXBOYW1lICE9IG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9KYXZhY0Vycm9yRGV0YWlsLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0phdmFjRXJyb3JEZXRhaWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmYzYzEwCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9KYXZhY0Vycm9yRGV0YWlsLmphdmEKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSnNwQ29tcGlsYXRpb25Db250ZXh0OworCisvKioKKyAqIENsYXNzIHByb3ZpZGluZyBkZXRhaWxzIGFib3V0IGEgamF2YWMgY29tcGlsYXRpb24gZXJyb3IuCisgKgorICogQGF1dGhvciBKYW4gTHVlaGUKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICovCitwdWJsaWMgY2xhc3MgSmF2YWNFcnJvckRldGFpbCB7CisKKyAgICBwcml2YXRlIFN0cmluZyBqYXZhRmlsZU5hbWU7CisgICAgcHJpdmF0ZSBpbnQgamF2YUxpbmVOdW07CisgICAgcHJpdmF0ZSBTdHJpbmcganNwRmlsZU5hbWU7CisgICAgcHJpdmF0ZSBpbnQganNwQmVnaW5MaW5lTnVtOworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGVyck1zZzsKKyAgICBwcml2YXRlIFN0cmluZyBqc3BFeHRyYWN0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGphdmFGaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgSmF2YSBmaWxlIGluIHdoaWNoIHRoZSAKKyAgICAgKiBjb21waWxhdGlvbiBlcnJvciBvY2N1cnJlZAorICAgICAqIEBwYXJhbSBqYXZhTGluZU51bSBUaGUgY29tcGlsYXRpb24gZXJyb3IgbGluZSBudW1iZXIKKyAgICAgKiBAcGFyYW0gZXJyTXNnIFRoZSBjb21waWxhdGlvbiBlcnJvciBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIEphdmFjRXJyb3JEZXRhaWwoU3RyaW5nIGphdmFGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgamF2YUxpbmVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGVyck1zZykgeworCisgICAgICAgIHRoaXMuamF2YUZpbGVOYW1lID0gamF2YUZpbGVOYW1lOworICAgICAgICB0aGlzLmphdmFMaW5lTnVtID0gamF2YUxpbmVOdW07CisgICAgICAgIHRoaXMuZXJyTXNnID0gZXJyTXNnOworICAgICAgICB0aGlzLmpzcEJlZ2luTGluZU51bSA9IC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGphdmFGaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgSmF2YSBmaWxlIGluIHdoaWNoIHRoZSAKKyAgICAgKiBjb21waWxhdGlvbiBlcnJvciBvY2N1cnJlZAorICAgICAqIEBwYXJhbSBqYXZhTGluZU51bSBUaGUgY29tcGlsYXRpb24gZXJyb3IgbGluZSBudW1iZXIKKyAgICAgKiBAcGFyYW0ganNwRmlsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIEpTUCBmaWxlIGZyb20gd2hpY2ggdGhlIEphdmEgc291cmNlCisgICAgICogZmlsZSB3YXMgZ2VuZXJhdGVkCisgICAgICogQHBhcmFtIGpzcEJlZ2luTGluZU51bSBUaGUgc3RhcnQgbGluZSBudW1iZXIgb2YgdGhlIEpTUCBlbGVtZW50CisgICAgICogcmVzcG9uc2libGUgZm9yIHRoZSBjb21waWxhdGlvbiBlcnJvcgorICAgICAqIEBwYXJhbSBlcnJNc2cgVGhlIGNvbXBpbGF0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgSmF2YWNFcnJvckRldGFpbChTdHJpbmcgamF2YUZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqYXZhTGluZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcganNwRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGpzcEJlZ2luTGluZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZXJyTXNnKSB7CisKKyAgICAgICAgdGhpcyhqYXZhRmlsZU5hbWUsIGphdmFMaW5lTnVtLCBqc3BGaWxlTmFtZSwganNwQmVnaW5MaW5lTnVtLCBlcnJNc2csCisgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEphdmFjRXJyb3JEZXRhaWwoU3RyaW5nIGphdmFGaWxlTmFtZSwKKyAgICAgICAgICAgIGludCBqYXZhTGluZU51bSwKKyAgICAgICAgICAgIFN0cmluZyBqc3BGaWxlTmFtZSwKKyAgICAgICAgICAgIGludCBqc3BCZWdpbkxpbmVOdW0sCisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZXJyTXNnLAorICAgICAgICAgICAgSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQpIHsKKyAgICAgICAgdGhpcyhqYXZhRmlsZU5hbWUsIGphdmFMaW5lTnVtLCBlcnJNc2cpOworICAgICAgICB0aGlzLmpzcEZpbGVOYW1lID0ganNwRmlsZU5hbWU7CisgICAgICAgIHRoaXMuanNwQmVnaW5MaW5lTnVtID0ganNwQmVnaW5MaW5lTnVtOworICAgICAgICAKKyAgICAgICAgaWYgKGpzcEJlZ2luTGluZU51bSA+IDAgJiYgY3R4dCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFJlYWQgYm90aCBmaWxlcyBpbiwgc28gd2UgY2FuIGluc3BlY3QgdGhlbQorICAgICAgICAgICAgICAgIFN0cmluZ1tdIGpzcExpbmVzID0gcmVhZEZpbGUKKyAgICAgICAgICAgICAgICAgICAgKGN0eHQuZ2V0UmVzb3VyY2VBc1N0cmVhbShqc3BGaWxlTmFtZSkpOworICAgIAorICAgICAgICAgICAgICAgIFN0cmluZ1tdIGphdmFMaW5lcyA9IHJlYWRGaWxlCisgICAgICAgICAgICAgICAgICAgIChuZXcgRmlsZUlucHV0U3RyZWFtKGN0eHQuZ2V0U2VydmxldEphdmFGaWxlTmFtZSgpKSk7CisgICAgCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGxpbmUgY29udGFpbnMgdGhlIG9wZW5pbmcgb2YgYSBtdWx0aS1saW5lIHNjcmlwdGxldAorICAgICAgICAgICAgICAgIC8vIGJsb2NrLCB0aGVuIHRoZSBKU1AgbGluZSBudW1iZXIgd2UgZ290IGJhY2sgaXMgcHJvYmFibHkKKyAgICAgICAgICAgICAgICAvLyBmYXVsdHkuICBTY2FuIGZvcndhcmQgdG8gbWF0Y2ggdGhlIGphdmEgbGluZS4uLgorICAgICAgICAgICAgICAgIGlmIChqc3BMaW5lc1tqc3BCZWdpbkxpbmVOdW0tMV0ubGFzdEluZGV4T2YoIjwlIikgPgorICAgICAgICAgICAgICAgICAgICBqc3BMaW5lc1tqc3BCZWdpbkxpbmVOdW0tMV0ubGFzdEluZGV4T2YoIiU+IikpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGphdmFMaW5lID0gamF2YUxpbmVzW2phdmFMaW5lTnVtLTFdLnRyaW0oKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT1qc3BCZWdpbkxpbmVOdW0tMTsgaTxqc3BMaW5lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzcExpbmVzW2ldLmluZGV4T2YoamF2YUxpbmUpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGpzcCBsaW5lIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanNwQmVnaW5MaW5lTnVtID0gaSsxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgIC8vIGNvcHkgb3V0IGEgZnJhZ21lbnQgb2YgSlNQIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZnJhZ21lbnQgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMjQpOworICAgICAgICAgICAgICAgIGludCBzdGFydEluZGV4ID0gTWF0aC5tYXgoMCwgdGhpcy5qc3BCZWdpbkxpbmVOdW0tMS0zKTsKKyAgICAgICAgICAgICAgICBpbnQgZW5kSW5kZXggPSBNYXRoLm1pbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzcExpbmVzLmxlbmd0aC0xLCB0aGlzLmpzcEJlZ2luTGluZU51bS0xKzMpOworICAgIAorICAgICAgICAgICAgICAgIGZvciAoaW50IGk9c3RhcnRJbmRleDtpPD1lbmRJbmRleDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZChpKzEpOworICAgICAgICAgICAgICAgICAgICBmcmFnbWVudC5hcHBlbmQoIjogIik7CisgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZChqc3BMaW5lc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAganNwRXh0cmFjdCA9IGZyYWdtZW50LnRvU3RyaW5nKCk7CisgICAgCisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAvLyBDYW4ndCByZWFkIGZpbGVzIC0gaWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBKYXZhIHNvdXJjZSBmaWxlIGluIHdoaWNoIHRoZSBjb21waWxhdGlvbiBlcnJvcgorICAgICAqIG9jY3VycmVkLgorICAgICAqCisgICAgICogQHJldHVybiBKYXZhIHNvdXJjZSBmaWxlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEphdmFGaWxlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuamF2YUZpbGVOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGNvbXBpbGF0aW9uIGVycm9yIGxpbmUgbnVtYmVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQ29tcGlsYXRpb24gZXJyb3IgbGluZSBudW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEphdmFMaW5lTnVtYmVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5qYXZhTGluZU51bTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBKU1AgZmlsZSBmcm9tIHdoaWNoIHRoZSBKYXZhIHNvdXJjZSBmaWxlIHdhcworICAgICAqIGdlbmVyYXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gSlNQIGZpbGUgZnJvbSB3aGljaCB0aGUgSmF2YSBzb3VyY2UgZmlsZSB3YXMgZ2VuZXJhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SnNwRmlsZU5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmpzcEZpbGVOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHN0YXJ0IGxpbmUgbnVtYmVyIChpbiB0aGUgSlNQIGZpbGUpIG9mIHRoZSBKU1AgZWxlbWVudAorICAgICAqIHJlc3BvbnNpYmxlIGZvciB0aGUgY29tcGlsYXRpb24gZXJyb3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0YXJ0IGxpbmUgbnVtYmVyIG9mIHRoZSBKU1AgZWxlbWVudCByZXNwb25zaWJsZSBmb3IgdGhlCisgICAgICogY29tcGlsYXRpb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEpzcEJlZ2luTGluZU51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuanNwQmVnaW5MaW5lTnVtOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGNvbXBpbGF0aW9uIGVycm9yIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIENvbXBpbGF0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZXJyTXNnLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGV4dHJhY3Qgb2YgdGhlIEpTUCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gRXh0cmFjdCBvZiBKU1Agd2hlcmUgZXJyb3Igb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEpzcEV4dHJhY3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmpzcEV4dHJhY3Q7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlYWRzIGEgdGV4dCBmaWxlIGZyb20gYW4gaW5wdXQgc3RyZWFtIGludG8gYSBTdHJpbmdbXS4gVXNlZCB0byByZWFkIGluCisgICAgICogdGhlIEpTUCBhbmQgZ2VuZXJhdGVkIEphdmEgZmlsZSB3aGVuIGdlbmVyYXRpbmcgZXJyb3IgbWVzc2FnZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdbXSByZWFkRmlsZShJbnB1dFN0cmVhbSBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHMpKTsKKyAgICAgICAgTGlzdCBsaW5lcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgU3RyaW5nIGxpbmU7CisKKyAgICAgICAgd2hpbGUgKCAobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsICkgeworICAgICAgICAgICAgbGluZXMuYWRkKGxpbmUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgbGluZXMudG9BcnJheSggbmV3IFN0cmluZ1tsaW5lcy5zaXplKCldICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Kc3BDb25maWcuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSnNwQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QzOTU0NQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSnNwQ29uZmlnLmphdmEKQEAgLTAsMCArMSw0NzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSmFzcGVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlci5QYXJzZXJVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci54bWxwYXJzZXIuVHJlZU5vZGU7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CisKKy8qKgorICogSGFuZGxlcyB0aGUganNwLWNvbmZpZyBlbGVtZW50IGluIFdFQl9JTkYvd2ViLnhtbC4gIFRoaXMgaXMgdXNlZAorICogZm9yIHNwZWNpZnlpbmcgdGhlIEpTUCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIG9uIGEgSlNQIHBhZ2UKKyAqCisgKiBAYXV0aG9yIEtpbi1tYW4gQ2h1bmcKKyAqLworCitwdWJsaWMgY2xhc3MgSnNwQ29uZmlnIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfWE1MID0gIi9XRUItSU5GL3dlYi54bWwiOworCisgICAgLy8gTG9nZ2VyCisgICAgcHJpdmF0ZSBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSnNwQ29uZmlnLmNsYXNzKTsKKworICAgIHByaXZhdGUgVmVjdG9yIGpzcFByb3BlcnRpZXMgPSBudWxsOworICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgY3R4dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRJc1htbCA9IG51bGw7CQkvLyB1bnNwZWNpZmllZAorICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRJc0VMSWdub3JlZCA9IG51bGw7CS8vIHVuc3BlY2lmaWVkCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdElzU2NyaXB0aW5nSW52YWxpZCA9ICJmYWxzZSI7CisgICAgcHJpdmF0ZSBKc3BQcm9wZXJ0eSBkZWZhdWx0SnNwUHJvcGVydHk7CisKKyAgICBwdWJsaWMgSnNwQ29uZmlnKFNlcnZsZXRDb250ZXh0IGN0eHQpIHsKKwl0aGlzLmN0eHQgPSBjdHh0OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzV2ViRG90WG1sKFNlcnZsZXRDb250ZXh0IGN0eHQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIHVyaSA9IGN0eHQuZ2V0UmVzb3VyY2UoV0VCX1hNTCk7CisgICAgICAgICAgICBpZiAodXJpID09IG51bGwpIHsKKwkgICAgICAgIC8vIG5vIHdlYi54bWwKKyAgICAgICAgICAgICAgICByZXR1cm47CisJICAgIH0KKworICAgICAgICAgICAgaXMgPSB1cmkub3BlblN0cmVhbSgpOworICAgICAgICAgICAgSW5wdXRTb3VyY2UgaXAgPSBuZXcgSW5wdXRTb3VyY2UoaXMpOworICAgICAgICAgICAgaXAuc2V0U3lzdGVtSWQodXJpLnRvRXh0ZXJuYWxGb3JtKCkpOyAKKworICAgICAgICAgICAgUGFyc2VyVXRpbHMgcHUgPSBuZXcgUGFyc2VyVXRpbHMoKTsKKwkgICAgVHJlZU5vZGUgd2ViQXBwID0gcHUucGFyc2VYTUxEb2N1bWVudChXRUJfWE1MLCBpcCk7CisKKwkgICAgaWYgKHdlYkFwcCA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgIHx8ICEiMi40Ii5lcXVhbHMod2ViQXBwLmZpbmRBdHRyaWJ1dGUoInZlcnNpb24iKSkpIHsKKwkgICAgICAgIGRlZmF1bHRJc0VMSWdub3JlZCA9ICJ0cnVlIjsKKwkgICAgICAgIHJldHVybjsKKwkgICAgfQorCSAgICBUcmVlTm9kZSBqc3BDb25maWcgPSB3ZWJBcHAuZmluZENoaWxkKCJqc3AtY29uZmlnIik7CisJICAgIGlmIChqc3BDb25maWcgPT0gbnVsbCkgeworCSAgICAgICAgcmV0dXJuOworCSAgICB9CisKKyAgICAgICAgICAgIGpzcFByb3BlcnRpZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICBJdGVyYXRvciBqc3BQcm9wZXJ0eUxpc3QgPSBqc3BDb25maWcuZmluZENoaWxkcmVuKCJqc3AtcHJvcGVydHktZ3JvdXAiKTsKKyAgICAgICAgICAgIHdoaWxlIChqc3BQcm9wZXJ0eUxpc3QuaGFzTmV4dCgpKSB7CisKKyAgICAgICAgICAgICAgICBUcmVlTm9kZSBlbGVtZW50ID0gKFRyZWVOb2RlKSBqc3BQcm9wZXJ0eUxpc3QubmV4dCgpOworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGxpc3QgPSBlbGVtZW50LmZpbmRDaGlsZHJlbigpOworCisgICAgICAgICAgICAgICAgVmVjdG9yIHVybFBhdHRlcm5zID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgICAgIFN0cmluZyBwYWdlRW5jb2RpbmcgPSBudWxsOworICAgICAgICAgICAgICAgIFN0cmluZyBzY3JpcHRpbmdJbnZhbGlkID0gbnVsbDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZWxJZ25vcmVkID0gbnVsbDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaXNYbWwgPSBudWxsOworICAgICAgICAgICAgICAgIFZlY3RvciBpbmNsdWRlUHJlbHVkZSA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgICAgICBWZWN0b3IgaW5jbHVkZUNvZGEgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAobGlzdC5oYXNOZXh0KCkpIHsKKworICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gKFRyZWVOb2RlKSBsaXN0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJ1cmwtcGF0dGVybiIuZXF1YWxzKHRuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVybFBhdHRlcm5zLmFkZEVsZW1lbnQoIGVsZW1lbnQuZ2V0Qm9keSgpICk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJwYWdlLWVuY29kaW5nIi5lcXVhbHModG5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUVuY29kaW5nID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJpcy14bWwiLmVxdWFscyh0bmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBpc1htbCA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgiZWwtaWdub3JlZCIuZXF1YWxzKHRuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsSWdub3JlZCA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgic2NyaXB0aW5nLWludmFsaWQiLmVxdWFscyh0bmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRpbmdJbnZhbGlkID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJpbmNsdWRlLXByZWx1ZGUiLmVxdWFscyh0bmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUHJlbHVkZS5hZGRFbGVtZW50KGVsZW1lbnQuZ2V0Qm9keSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoImluY2x1ZGUtY29kYSIuZXF1YWxzKHRuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVDb2RhLmFkZEVsZW1lbnQoZWxlbWVudC5nZXRCb2R5KCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh1cmxQYXR0ZXJucy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgCisgICAgICAgICAgICAgICAgLy8gQWRkIG9uZSBKc3BQcm9wZXJ0eUdyb3VwIGZvciBlYWNoIFVSTCBQYXR0ZXJuLiAgVGhpcyBtYWtlcworICAgICAgICAgICAgICAgIC8vIHRoZSBtYXRjaGluZyBsb2dpYyBlYXNpZXIuCisgICAgICAgICAgICAgICAgZm9yKCBpbnQgcCA9IDA7IHAgPCB1cmxQYXR0ZXJucy5zaXplKCk7IHArKyApIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybFBhdHRlcm4gPSAoU3RyaW5nKXVybFBhdHRlcm5zLmVsZW1lbnRBdCggcCApOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBudWxsOworIAorICAgICAgICAgICAgICAgICAgICBpZiAodXJsUGF0dGVybi5pbmRleE9mKCcqJykgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGFjdCBtYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHVybFBhdHRlcm47CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IHVybFBhdHRlcm4ubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSB1cmxQYXR0ZXJuLnN1YnN0cmluZygwLGkrMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IHVybFBhdHRlcm4uc3Vic3RyaW5nKGkrMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSB1cmxQYXR0ZXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0dGVybiBtdXN0IGJlICIqIiwgb3Igb2YgdGhlIGZvcm0gIiouanNwIgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuZXF1YWxzKCIqIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24gPSAiKiI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGUuc3RhcnRzV2l0aCgiKi4iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9IGZpbGUuc3Vic3RyaW5nKGZpbGUuaW5kZXhPZignLicpKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdXJsIHBhdHRlcm5zIGFyZSByZWNvbnN0cnVjdGVkIGFzIHRoZSBmb2xsd29pbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXRoICE9IG51bGwsIGV4dGVuc2lvbiA9PSBudWxsOiAgLyBvciAvZm9vL2Jhci5leHQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGggPT0gbnVsbCwgZXh0ZW5zaW9uICE9IG51bGw6ICAqLmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0aCAhPSBudWxsLCBleHRlbnNpb24gPT0gIioiOiAgIC9mb28vKgorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1N0YXIgPSAiKiIuZXF1YWxzKGV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBhdGggPT0gbnVsbCAmJiAoZXh0ZW5zaW9uID09IG51bGwgfHwgaXNTdGFyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBhdGggIT0gbnVsbCAmJiAhaXNTdGFyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisJCQkgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC53YXJuaW5nLmJhZC51cmxwYXR0ZXJuLnByb3BlcnR5Z3JvdXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsUGF0dGVybikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEpzcFByb3BlcnR5IHByb3BlcnR5ID0gbmV3IEpzcFByb3BlcnR5KGlzWG1sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbElnbm9yZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdGluZ0ludmFsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVByZWx1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVDb2RhKTsKKyAgICAgICAgICAgICAgICAgICAgSnNwUHJvcGVydHlHcm91cCBwcm9wZXJ0eUdyb3VwID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBKc3BQcm9wZXJ0eUdyb3VwKHBhdGgsIGV4dGVuc2lvbiwgcHJvcGVydHkpOworCisgICAgICAgICAgICAgICAgICAgIGpzcFByb3BlcnRpZXMuYWRkRWxlbWVudChwcm9wZXJ0eUdyb3VwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHt9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJaWYgKCFpbml0aWFsaXplZCkgeworCSAgICBwcm9jZXNzV2ViRG90WG1sKGN0eHQpOworCSAgICBkZWZhdWx0SnNwUHJvcGVydHkgPSBuZXcgSnNwUHJvcGVydHkoZGVmYXVsdElzWG1sLAorCQkJCQkJIGRlZmF1bHRJc0VMSWdub3JlZCwKKwkJCQkJCSBkZWZhdWx0SXNTY3JpcHRpbmdJbnZhbGlkLAorCQkJCQkJIG51bGwsIG51bGwsIG51bGwpOworCSAgICBpbml0aWFsaXplZCA9IHRydWU7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdCB0aGUgcHJvcGVydHkgZ3JvdXAgdGhhdCBoYXMgbW9yZSByZXN0cmljdGl2ZSB1cmwtcGF0dGVybi4KKyAgICAgKiBJbiBjYXNlIG9mIHRpZSwgc2VsZWN0IHRoZSBmaXJzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzcFByb3BlcnR5R3JvdXAgc2VsZWN0UHJvcGVydHkoSnNwUHJvcGVydHlHcm91cCBwcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc3BQcm9wZXJ0eUdyb3VwIGN1cnIpIHsKKyAgICAgICAgaWYgKHByZXYgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXYuZ2V0RXh0ZW5zaW9uKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2gKKyAgICAgICAgICAgIHJldHVybiBwcmV2OworICAgICAgICB9CisgICAgICAgIGlmIChjdXJyLmdldEV4dGVuc2lvbigpID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGV4YWN0IG1hdGNoCisgICAgICAgICAgICByZXR1cm4gY3VycjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcHJldlBhdGggPSBwcmV2LmdldFBhdGgoKTsKKyAgICAgICAgU3RyaW5nIGN1cnJQYXRoID0gY3Vyci5nZXRQYXRoKCk7CisgICAgICAgIGlmIChwcmV2UGF0aCA9PSBudWxsICYmIGN1cnJQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEJvdGggc3BlY2lmaWVzIGEgKi5leHQsIGtlZXAgdGhlIGZpcnN0IG9uZQorICAgICAgICAgICAgcmV0dXJuIHByZXY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXZQYXRoID09IG51bGwgJiYgY3VyclBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXZQYXRoICE9IG51bGwgJiYgY3VyclBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHByZXY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXZQYXRoLmxlbmd0aCgpID49IGN1cnJQYXRoLmxlbmd0aCgpKSB7CisgICAgICAgICAgICByZXR1cm4gcHJldjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycjsKKyAgICB9CisgICAgICAgICAgICAKKworICAgIC8qKgorICAgICAqIEZpbmQgYSBwcm9wZXJ0eSB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgc3VwcGxpZWQgcmVzb3VyY2UuCisgICAgICogQHBhcmFtIHVyaSB0aGUgcmVzb3VyY2Ugc3VwcGxpZWQuCisgICAgICogQHJldHVybiBhIEpzcFByb3BlcnR5IGluZGljYXRpbmcgdGhlIGJlc3QgbWF0Y2gsIG9yIHNvbWUgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwUHJvcGVydHkgZmluZEpzcFByb3BlcnR5KFN0cmluZyB1cmkpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJaW5pdCgpOworCisJLy8gSlNQIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZG8gbm90IGFwcGx5IHRvIHRhZyBmaWxlcwkgICAgCisJaWYgKGpzcFByb3BlcnRpZXMgPT0gbnVsbCB8fCB1cmkuZW5kc1dpdGgoIi50YWciKQorCSAgICAgICAgfHwgdXJpLmVuZHNXaXRoKCIudGFneCIpKSB7CisJICAgIHJldHVybiBkZWZhdWx0SnNwUHJvcGVydHk7CisJfQorCisJU3RyaW5nIHVyaVBhdGggPSBudWxsOworCWludCBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZignLycpOworCWlmIChpbmRleCA+PTAgKSB7CisJICAgIHVyaVBhdGggPSB1cmkuc3Vic3RyaW5nKDAsIGluZGV4KzEpOworCX0KKwlTdHJpbmcgdXJpRXh0ZW5zaW9uID0gbnVsbDsKKwlpbmRleCA9IHVyaS5sYXN0SW5kZXhPZignLicpOworCWlmIChpbmRleCA+PTApIHsKKwkgICAgdXJpRXh0ZW5zaW9uID0gdXJpLnN1YnN0cmluZyhpbmRleCsxKTsKKwl9CisKKwlWZWN0b3IgaW5jbHVkZVByZWx1ZGVzID0gbmV3IFZlY3RvcigpOworCVZlY3RvciBpbmNsdWRlQ29kYXMgPSBuZXcgVmVjdG9yKCk7CisKKwlKc3BQcm9wZXJ0eUdyb3VwIGlzWG1sTWF0Y2ggPSBudWxsOworCUpzcFByb3BlcnR5R3JvdXAgZWxJZ25vcmVkTWF0Y2ggPSBudWxsOworCUpzcFByb3BlcnR5R3JvdXAgc2NyaXB0aW5nSW52YWxpZE1hdGNoID0gbnVsbDsKKwlKc3BQcm9wZXJ0eUdyb3VwIHBhZ2VFbmNvZGluZ01hdGNoID0gbnVsbDsKKworCUl0ZXJhdG9yIGl0ZXIgPSBqc3BQcm9wZXJ0aWVzLml0ZXJhdG9yKCk7CisJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisKKwkgICAgSnNwUHJvcGVydHlHcm91cCBqcGcgPSAoSnNwUHJvcGVydHlHcm91cCkgaXRlci5uZXh0KCk7CisJICAgIEpzcFByb3BlcnR5IGpwID0ganBnLmdldEpzcFByb3BlcnR5KCk7CisKKyAgICAgICAgICAgICAvLyAoYXJyYXlzIHdpbGwgYmUgdGhlIHNhbWUgbGVuZ3RoKQorICAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBqcGcuZ2V0RXh0ZW5zaW9uKCk7CisgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBqcGcuZ2V0UGF0aCgpOworIAorICAgICAgICAgICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAvLyBleGFjdCBtYXRjaCBwYXR0ZXJuOiAvYS9mb28uanNwCisgICAgICAgICAgICAgICAgIGlmICghdXJpLmVxdWFscyhwYXRoKSkgeworICAgICAgICAgICAgICAgICAgICAgLy8gbm90IG1hdGNoZWQ7CisgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIC8vIE1hdGNoaW5nIHBhdHRlcm5zICouZXh0IG9yIC9wLyoKKyAgICAgICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCAmJiB1cmlQYXRoICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAhIHVyaVBhdGguc3RhcnRzV2l0aChwYXRoKSkgeworICAgICAgICAgICAgICAgICAgICAgLy8gbm90IG1hdGNoZWQKKyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGlmICghZXh0ZW5zaW9uLmVxdWFscygiKiIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZXh0ZW5zaW9uLmVxdWFscyh1cmlFeHRlbnNpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAvLyBub3QgbWF0Y2hlZAorICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIG1hdGNoCisgICAgICAgICAgICAgLy8gQWRkIGluY2x1ZGUtcHJlbHVkZXMgYW5kIGluY2x1ZGUtY29kYXMKKyAgICAgICAgICAgICBpZiAoanAuZ2V0SW5jbHVkZVByZWx1ZGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgIGluY2x1ZGVQcmVsdWRlcy5hZGRBbGwoanAuZ2V0SW5jbHVkZVByZWx1ZGUoKSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGlmIChqcC5nZXRJbmNsdWRlQ29kYSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgaW5jbHVkZUNvZGFzLmFkZEFsbChqcC5nZXRJbmNsdWRlQ29kYSgpKTsKKyAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHByZXZpb3VzIG1hdGNoIGZvciB0aGUgc2FtZSBwcm9wZXJ0eSwgcmVtZW1iZXIKKyAgICAgICAgICAgICAvLyB0aGUgb25lIHRoYXQgaXMgbW9yZSByZXN0cmljdGl2ZS4KKyAgICAgICAgICAgICBpZiAoanAuaXNYbWwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgIGlzWG1sTWF0Y2ggPSBzZWxlY3RQcm9wZXJ0eShpc1htbE1hdGNoLCBqcGcpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBpZiAoanAuaXNFTElnbm9yZWQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgIGVsSWdub3JlZE1hdGNoID0gc2VsZWN0UHJvcGVydHkoZWxJZ25vcmVkTWF0Y2gsIGpwZyk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGlmIChqcC5pc1NjcmlwdGluZ0ludmFsaWQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgIHNjcmlwdGluZ0ludmFsaWRNYXRjaCA9CisgICAgICAgICAgICAgICAgICAgICBzZWxlY3RQcm9wZXJ0eShzY3JpcHRpbmdJbnZhbGlkTWF0Y2gsIGpwZyk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGlmIChqcC5nZXRQYWdlRW5jb2RpbmcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgIHBhZ2VFbmNvZGluZ01hdGNoID0gc2VsZWN0UHJvcGVydHkocGFnZUVuY29kaW5nTWF0Y2gsIGpwZyk7CisgICAgICAgICAgICAgfQorCX0KKworCisJU3RyaW5nIGlzWG1sID0gZGVmYXVsdElzWG1sOworCVN0cmluZyBpc0VMSWdub3JlZCA9IGRlZmF1bHRJc0VMSWdub3JlZDsKKwlTdHJpbmcgaXNTY3JpcHRpbmdJbnZhbGlkID0gZGVmYXVsdElzU2NyaXB0aW5nSW52YWxpZDsKKwlTdHJpbmcgcGFnZUVuY29kaW5nID0gbnVsbDsKKworCWlmIChpc1htbE1hdGNoICE9IG51bGwpIHsKKwkgICAgaXNYbWwgPSBpc1htbE1hdGNoLmdldEpzcFByb3BlcnR5KCkuaXNYbWwoKTsKKwl9CisJaWYgKGVsSWdub3JlZE1hdGNoICE9IG51bGwpIHsKKwkgICAgaXNFTElnbm9yZWQgPSBlbElnbm9yZWRNYXRjaC5nZXRKc3BQcm9wZXJ0eSgpLmlzRUxJZ25vcmVkKCk7CisJfQorCWlmIChzY3JpcHRpbmdJbnZhbGlkTWF0Y2ggIT0gbnVsbCkgeworCSAgICBpc1NjcmlwdGluZ0ludmFsaWQgPQorCQlzY3JpcHRpbmdJbnZhbGlkTWF0Y2guZ2V0SnNwUHJvcGVydHkoKS5pc1NjcmlwdGluZ0ludmFsaWQoKTsKKwl9CisJaWYgKHBhZ2VFbmNvZGluZ01hdGNoICE9IG51bGwpIHsKKwkgICAgcGFnZUVuY29kaW5nID0gcGFnZUVuY29kaW5nTWF0Y2guZ2V0SnNwUHJvcGVydHkoKS5nZXRQYWdlRW5jb2RpbmcoKTsKKwl9CisKKwlyZXR1cm4gbmV3IEpzcFByb3BlcnR5KGlzWG1sLCBpc0VMSWdub3JlZCwgaXNTY3JpcHRpbmdJbnZhbGlkLAorCQkJICAgICAgIHBhZ2VFbmNvZGluZywgaW5jbHVkZVByZWx1ZGVzLCBpbmNsdWRlQ29kYXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRvIGZpbmQgb3V0IGlmIGFuIHVyaSBtYXRjaGVzIGFuIHVybCBwYXR0ZXJuIGluIGpzcCBjb25maWcuICBJZiBzbywKKyAgICAgKiB0aGVuIHRoZSB1cmkgaXMgYSBKU1AgcGFnZS4gIFRoaXMgaXMgdXNlZCBwcmltYXJpbHkgZm9yIGpzcGMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNKc3BQYWdlKFN0cmluZyB1cmkpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIGluaXQoKTsKKyAgICAgICAgaWYgKGpzcFByb3BlcnRpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHVyaVBhdGggPSBudWxsOworICAgICAgICBpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgaWYgKGluZGV4ID49MCApIHsKKyAgICAgICAgICAgIHVyaVBhdGggPSB1cmkuc3Vic3RyaW5nKDAsIGluZGV4KzEpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyB1cmlFeHRlbnNpb24gPSBudWxsOworICAgICAgICBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZignLicpOworICAgICAgICBpZiAoaW5kZXggPj0wKSB7CisgICAgICAgICAgICB1cmlFeHRlbnNpb24gPSB1cmkuc3Vic3RyaW5nKGluZGV4KzEpOworICAgICAgICB9CisKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGpzcFByb3BlcnRpZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisKKyAgICAgICAgICAgIEpzcFByb3BlcnR5R3JvdXAganBnID0gKEpzcFByb3BlcnR5R3JvdXApIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgSnNwUHJvcGVydHkganAgPSBqcGcuZ2V0SnNwUHJvcGVydHkoKTsKKworICAgICAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9IGpwZy5nZXRFeHRlbnNpb24oKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0ganBnLmdldFBhdGgoKTsKKworICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHVyaS5lcXVhbHMocGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgYW4gZXhhY3QgbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKHBhdGggPT0gbnVsbCB8fCBwYXRoLmVxdWFscyh1cmlQYXRoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGV4dGVuc2lvbi5lcXVhbHMoIioiKSB8fCBleHRlbnNpb24uZXF1YWxzKHVyaUV4dGVuc2lvbikpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoZXMgKiwgKi5leHQsIC9wLyosIG9yIC9wLyouZXh0CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEpzcFByb3BlcnR5R3JvdXAgeworCXByaXZhdGUgU3RyaW5nIHBhdGg7CisJcHJpdmF0ZSBTdHJpbmcgZXh0ZW5zaW9uOworCXByaXZhdGUgSnNwUHJvcGVydHkganNwUHJvcGVydHk7CisKKwlKc3BQcm9wZXJ0eUdyb3VwKFN0cmluZyBwYXRoLCBTdHJpbmcgZXh0ZW5zaW9uLAorCQkJIEpzcFByb3BlcnR5IGpzcFByb3BlcnR5KSB7CisJICAgIHRoaXMucGF0aCA9IHBhdGg7CisJICAgIHRoaXMuZXh0ZW5zaW9uID0gZXh0ZW5zaW9uOworCSAgICB0aGlzLmpzcFByb3BlcnR5ID0ganNwUHJvcGVydHk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworCSAgICByZXR1cm4gcGF0aDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKKwkgICAgcmV0dXJuIGV4dGVuc2lvbjsKKwl9CisKKwlwdWJsaWMgSnNwUHJvcGVydHkgZ2V0SnNwUHJvcGVydHkoKSB7CisJICAgIHJldHVybiBqc3BQcm9wZXJ0eTsKKwl9CisgICAgfQorCisgICAgc3RhdGljIHB1YmxpYyBjbGFzcyBKc3BQcm9wZXJ0eSB7CisKKwlwcml2YXRlIFN0cmluZyBpc1htbDsKKwlwcml2YXRlIFN0cmluZyBlbElnbm9yZWQ7CisJcHJpdmF0ZSBTdHJpbmcgc2NyaXB0aW5nSW52YWxpZDsKKwlwcml2YXRlIFN0cmluZyBwYWdlRW5jb2Rpbmc7CisJcHJpdmF0ZSBWZWN0b3IgaW5jbHVkZVByZWx1ZGU7CisJcHJpdmF0ZSBWZWN0b3IgaW5jbHVkZUNvZGE7CisKKwlwdWJsaWMgSnNwUHJvcGVydHkoU3RyaW5nIGlzWG1sLCBTdHJpbmcgZWxJZ25vcmVkLAorCQkgICAgU3RyaW5nIHNjcmlwdGluZ0ludmFsaWQsIFN0cmluZyBwYWdlRW5jb2RpbmcsCisJCSAgICBWZWN0b3IgaW5jbHVkZVByZWx1ZGUsIFZlY3RvciBpbmNsdWRlQ29kYSkgeworCisJICAgIHRoaXMuaXNYbWwgPSBpc1htbDsKKwkgICAgdGhpcy5lbElnbm9yZWQgPSBlbElnbm9yZWQ7CisJICAgIHRoaXMuc2NyaXB0aW5nSW52YWxpZCA9IHNjcmlwdGluZ0ludmFsaWQ7CisJICAgIHRoaXMucGFnZUVuY29kaW5nID0gcGFnZUVuY29kaW5nOworCSAgICB0aGlzLmluY2x1ZGVQcmVsdWRlID0gaW5jbHVkZVByZWx1ZGU7CisJICAgIHRoaXMuaW5jbHVkZUNvZGEgPSBpbmNsdWRlQ29kYTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGlzWG1sKCkgeworCSAgICByZXR1cm4gaXNYbWw7CisJfQorCisJcHVibGljIFN0cmluZyBpc0VMSWdub3JlZCgpIHsKKwkgICAgcmV0dXJuIGVsSWdub3JlZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGlzU2NyaXB0aW5nSW52YWxpZCgpIHsKKwkgICAgcmV0dXJuIHNjcmlwdGluZ0ludmFsaWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQYWdlRW5jb2RpbmcoKSB7CisJICAgIHJldHVybiBwYWdlRW5jb2Rpbmc7CisJfQorCisJcHVibGljIFZlY3RvciBnZXRJbmNsdWRlUHJlbHVkZSgpIHsKKwkgICAgcmV0dXJuIGluY2x1ZGVQcmVsdWRlOworCX0KKworCXB1YmxpYyBWZWN0b3IgZ2V0SW5jbHVkZUNvZGEoKSB7CisJICAgIHJldHVybiBpbmNsdWRlQ29kYTsKKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Kc3BEb2N1bWVudFBhcnNlci5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Kc3BEb2N1bWVudFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MTU5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0pzcERvY3VtZW50UGFyc2VyLmphdmEKQEAgLTAsMCArMSwxNDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0ZpbGVJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdMaWJyYXJ5SW5mbzsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Kc3BDb21waWxhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKKworLyoqCisgKiBDbGFzcyBpbXBsZW1lbnRpbmcgYSBwYXJzZXIgZm9yIGEgSlNQIGRvY3VtZW50LCB0aGF0IGlzLCBhIEpTUCBwYWdlIGluIFhNTAorICogc3ludGF4LgorICoKKyAqIEBhdXRob3IgSmFuIEx1ZWhlCisgKiBAYXV0aG9yIEtpbi1tYW4gQ2h1bmcKKyAqLworCitjbGFzcyBKc3BEb2N1bWVudFBhcnNlcgorICAgIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKKyAgICBpbXBsZW1lbnRzIExleGljYWxIYW5kbGVyLCBUYWdDb25zdGFudHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WRVJTSU9OID0gInZlcnNpb24iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRVhJQ0FMX0hBTkRMRVJfUFJPUEVSVFkgPQorICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1VSSSA9ICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEVuYWJsZURURFZhbGlkYXRpb25FeGNlcHRpb24gRU5BQkxFX0RURF9WQUxJREFUSU9OX0VYQ0VQVElPTiA9CisgICAgICAgIG5ldyBFbmFibGVEVERWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgImpzcC5lcnJvci5lbmFibGVfZHRkX3ZhbGlkYXRpb24iLAorICAgICAgICAgICAgbnVsbCk7CisKKyAgICBwcml2YXRlIFBhcnNlckNvbnRyb2xsZXIgcGFyc2VyQ29udHJvbGxlcjsKKyAgICBwcml2YXRlIEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0OworICAgIHByaXZhdGUgUGFnZUluZm8gcGFnZUluZm87CisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsKKyAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBjaGFyQnVmZmVyOworCisgICAgLy8gTm9kZSByZXByZXNlbnRpbmcgdGhlIFhNTCBlbGVtZW50IGN1cnJlbnRseSBiZWluZyBwYXJzZWQKKyAgICBwcml2YXRlIE5vZGUgY3VycmVudDsKKworICAgIC8qCisgICAgICogT3V0ZXJtb3N0IChpbiB0aGUgbmVzdGluZyBoaWVyYXJjaHkpIG5vZGUgd2hvc2UgYm9keSBpcyBkZWNsYXJlZCB0byBiZQorICAgICAqIHNjcmlwdGxlc3MuIElmIGEgbm9kZSdzIGJvZHkgaXMgZGVjbGFyZWQgdG8gYmUgc2NyaXB0bGVzcywgYWxsIGl0cworICAgICAqIG5lc3RlZCBub2RlcyBtdXN0IGJlIHNjcmlwdGxlc3MsIHRvby4KKyAgICAgKi8gCisgICAgcHJpdmF0ZSBOb2RlIHNjcmlwdGxlc3NCb2R5Tm9kZTsKKworICAgIHByaXZhdGUgTG9jYXRvciBsb2NhdG9yOworCisgICAgLy9NYXJrIHJlcHJlc2VudGluZyB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZWxlbWVudC4gIE5vdGUKKyAgICAvL3RoYXQgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgYW5kIGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkKKyAgICAvL3JldHVybiB0aGUgbGluZSBhbmQgY29sdW1uIG51bWJlcnMgZm9yIHRoZSBjaGFyYWN0ZXIKKyAgICAvL2ltbWVkaWF0ZWx5IF9mb2xsb3dpbmdfIHRoZSBjdXJyZW50IGVsZW1lbnQuICBUaGUgdW5kZXJseWluZworICAgIC8vWE1sIHBhcnNlciBlYXRzIHdoaXRlIHNwYWNlIHRoYXQgaXMgbm90IHBhcnQgb2YgY2hhcmFjdGVyCisgICAgLy9kYXRhLCBzbyBmb3IgTm9kZXMgdGhhdCBhcmUgbm90IGNyZWF0ZWQgZnJvbSBjaGFyYWN0ZXIgZGF0YSwKKyAgICAvL3RoaXMgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvLiAgQnV0IHdoZW4gd2UgcGFyc2UgY2hhcmFjdGVyIGRhdGEsCisgICAgLy93ZSBnZXQgYW4gYWNjdXJhdGUgc3RhcnRpbmcgbG9jYXRpb24gYnkgc3RhcnRpbmcgd2l0aCBzdGFydE1hcmsKKyAgICAvL2FzIHNldCBieSB0aGUgcHJldmlvdXMgZWxlbWVudCwgYW5kIHVwZGF0aW5nIGl0IGFzIHdlIGFkdmFuY2UKKyAgICAvL3Rocm91Z2ggdGhlIGNoYXJhY3RlcnMuCisgICAgcHJpdmF0ZSBNYXJrIHN0YXJ0TWFyazsKKworICAgIC8vIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHdlIGFyZSBpbnNpZGUgRFREIGRlY2xhcmF0aW9ucworICAgIHByaXZhdGUgYm9vbGVhbiBpbkRURDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRpbmc7CisKKyAgICBwcml2YXRlIEVycm9yRGlzcGF0Y2hlciBlcnI7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzVGFnRmlsZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZGlyZWN0aXZlc09ubHk7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzVG9wOworCisgICAgLy8gTmVzdGluZyBsZXZlbCBvZiBUYWcgZGVwZW5kZW50IGJvZGllcworICAgIHByaXZhdGUgaW50IHRhZ0RlcGVuZGVudE5lc3RpbmcgPSAwOworICAgIC8vIEZsYWcgc2V0IHRvIGRlbGF5IGluY3JtZW50aW5nIHRhZ0RlcGVuZGVudE5lc3RpbmcgdW50aWwganNwOmJvZHkKKyAgICAvLyBpcyBmaXJzdCBlbmNvdW50ZXJlZAorICAgIHByaXZhdGUgYm9vbGVhbiB0YWdEZXBlbmRlbnRQZW5kaW5nID0gZmFsc2U7CisKKyAgICAvKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIEpzcERvY3VtZW50UGFyc2VyKAorICAgICAgICBQYXJzZXJDb250cm9sbGVyIHBjLAorICAgICAgICBTdHJpbmcgcGF0aCwKKyAgICAgICAgYm9vbGVhbiBpc1RhZ0ZpbGUsCisgICAgICAgIGJvb2xlYW4gZGlyZWN0aXZlc09ubHkpIHsKKyAgICAgICAgdGhpcy5wYXJzZXJDb250cm9sbGVyID0gcGM7CisgICAgICAgIHRoaXMuY3R4dCA9IHBjLmdldEpzcENvbXBpbGF0aW9uQ29udGV4dCgpOworICAgICAgICB0aGlzLnBhZ2VJbmZvID0gcGMuZ2V0Q29tcGlsZXIoKS5nZXRQYWdlSW5mbygpOworICAgICAgICB0aGlzLmVyciA9IHBjLmdldENvbXBpbGVyKCkuZ2V0RXJyb3JEaXNwYXRjaGVyKCk7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgICAgIHRoaXMuaXNUYWdGaWxlID0gaXNUYWdGaWxlOworICAgICAgICB0aGlzLmRpcmVjdGl2ZXNPbmx5ID0gZGlyZWN0aXZlc09ubHk7CisgICAgICAgIHRoaXMuaXNUb3AgPSB0cnVlOworICAgIH0KKworICAgIC8qCisgICAgICogUGFyc2VzIGEgSlNQIGRvY3VtZW50IGJ5IHJlc3BvbmRpbmcgdG8gU0FYIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOb2RlLk5vZGVzIHBhcnNlKAorICAgICAgICBQYXJzZXJDb250cm9sbGVyIHBjLAorICAgICAgICBTdHJpbmcgcGF0aCwKKyAgICAgICAgSmFyRmlsZSBqYXJGaWxlLAorICAgICAgICBOb2RlIHBhcmVudCwKKyAgICAgICAgYm9vbGVhbiBpc1RhZ0ZpbGUsCisgICAgICAgIGJvb2xlYW4gZGlyZWN0aXZlc09ubHksCisgICAgICAgIFN0cmluZyBwYWdlRW5jLAorICAgICAgICBTdHJpbmcganNwQ29uZmlnUGFnZUVuYywKKyAgICAgICAgYm9vbGVhbiBpc0VuY29kaW5nU3BlY2lmaWVkSW5Qcm9sb2cpCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIEpzcERvY3VtZW50UGFyc2VyIGpzcERvY1BhcnNlciA9CisgICAgICAgICAgICBuZXcgSnNwRG9jdW1lbnRQYXJzZXIocGMsIHBhdGgsIGlzVGFnRmlsZSwgZGlyZWN0aXZlc09ubHkpOworICAgICAgICBOb2RlLk5vZGVzIHBhZ2VOb2RlcyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIGR1bW15IHJvb3QgYW5kIGluaXRpYWxpemUgaXQgd2l0aCBnaXZlbiBwYWdlIGVuY29kaW5ncworICAgICAgICAgICAgTm9kZS5Sb290IGR1bW15Um9vdCA9IG5ldyBOb2RlLlJvb3QobnVsbCwgcGFyZW50LCB0cnVlKTsKKyAgICAgICAgICAgIGR1bW15Um9vdC5zZXRQYWdlRW5jb2RpbmcocGFnZUVuYyk7CisgICAgICAgICAgICBkdW1teVJvb3Quc2V0SnNwQ29uZmlnUGFnZUVuY29kaW5nKGpzcENvbmZpZ1BhZ2VFbmMpOworICAgICAgICAgICAgZHVtbXlSb290LnNldElzRW5jb2RpbmdTcGVjaWZpZWRJblByb2xvZygKKyAgICAgICAgICAgICAgICBpc0VuY29kaW5nU3BlY2lmaWVkSW5Qcm9sb2cpOworICAgICAgICAgICAganNwRG9jUGFyc2VyLmN1cnJlbnQgPSBkdW1teVJvb3Q7CisgICAgICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBqc3BEb2NQYXJzZXIuYWRkSW5jbHVkZSgKKyAgICAgICAgICAgICAgICAgICAgZHVtbXlSb290LAorICAgICAgICAgICAgICAgICAgICBqc3BEb2NQYXJzZXIucGFnZUluZm8uZ2V0SW5jbHVkZVByZWx1ZGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGpzcERvY1BhcnNlci5pc1RvcCA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBQYXJzZSB0aGUgaW5wdXQKKyAgICAgICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBnZXRTQVhQYXJzZXIoZmFsc2UsIGpzcERvY1BhcnNlcik7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGluU3RyZWFtID0gSnNwVXRpbC5nZXRJbnB1dFN0cmVhbShwYXRoLCBqYXJGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3BEb2NQYXJzZXIuY3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNwRG9jUGFyc2VyLmVycik7CisgICAgICAgICAgICAgICAgc2F4UGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpblN0cmVhbSksIGpzcERvY1BhcnNlcik7CisgICAgICAgICAgICB9IGNhdGNoIChFbmFibGVEVERWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBzYXhQYXJzZXIgPSBnZXRTQVhQYXJzZXIodHJ1ZSwganNwRG9jUGFyc2VyKTsKKyAgICAgICAgICAgICAgICBqc3BEb2NQYXJzZXIuaXNWYWxpZGF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoaW5TdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGFueSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluU3RyZWFtID0gSnNwVXRpbC5nZXRJbnB1dFN0cmVhbShwYXRoLCBqYXJGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3BEb2NQYXJzZXIuY3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNwRG9jUGFyc2VyLmVycik7CisgICAgICAgICAgICAgICAgc2F4UGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpblN0cmVhbSksIGpzcERvY1BhcnNlcik7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChpblN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gYW55KSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGpzcERvY1BhcnNlci5hZGRJbmNsdWRlKAorICAgICAgICAgICAgICAgICAgICBkdW1teVJvb3QsCisgICAgICAgICAgICAgICAgICAgIGpzcERvY1BhcnNlci5wYWdlSW5mby5nZXRJbmNsdWRlQ29kYSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ3JlYXRlIE5vZGUuTm9kZXMgZnJvbSBkdW1teSByb290CisgICAgICAgICAgICBwYWdlTm9kZXMgPSBuZXcgTm9kZS5Ob2RlcyhkdW1teVJvb3QpOworCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAganNwRG9jUGFyc2VyLmVyci5qc3BFcnJvcigianNwLmVycm9yLmRhdGEuZmlsZS5yZWFkIiwgcGF0aCwgaW9lKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAganNwRG9jUGFyc2VyLmVyci5qc3BFcnJvcgorICAgICAgICAgICAgICAgIChuZXcgTWFyayhqc3BEb2NQYXJzZXIuY3R4dCwgcGF0aCwgZS5nZXRMaW5lTnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0Q29sdW1uTnVtYmVyKCkpLAorICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBqc3BEb2NQYXJzZXIuZXJyLmpzcEVycm9yKGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBhZ2VOb2RlczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFByb2Nlc3NlcyB0aGUgZ2l2ZW4gbGlzdCBvZiBpbmNsdWRlZCBmaWxlcy4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGluY2x1ZGUtcHJlbHVkZSBhbmQgaW5jbHVkZS1jb2RhCisgICAgICogc3ViZWxlbWVudHMgb2YgdGhlIGpzcC1jb25maWcgZWxlbWVudCBpbiB3ZWIueG1sCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZEluY2x1ZGUoTm9kZSBwYXJlbnQsIExpc3QgZmlsZXMpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoZmlsZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGZpbGVzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZSA9IChTdHJpbmcpaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgQXR0cmlidXRlc0ltcGwgYXR0cnMgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKKyAgICAgICAgICAgICAgICBhdHRycy5hZGRBdHRyaWJ1dGUoIiIsICJmaWxlIiwgImZpbGUiLCAiQ0RBVEEiLCBmaWxlKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGR1bW15IEluY2x1ZGUgZGlyZWN0aXZlIG5vZGUKKyAgICAgICAgICAgICAgICAgICAgTm9kZSBpbmNsdWRlRGlyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb2RlLkluY2x1ZGVEaXJlY3RpdmUoYXR0cnMsIG51bGwsIC8vIFhYWAorICAgIHBhcmVudCk7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0luY2x1ZGVEaXJlY3RpdmUoZmlsZSwgaW5jbHVkZURpcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiBvZiB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGFzc2lnbnMgdGhlIGdpdmVuIHRhZyBhdHRyaWJ1dGVzIHRvIG9uZSBvZiAzIGJ1Y2tldHM6CisgICAgICogCisgICAgICogLSAieG1sbnMiIGF0dHJpYnV0ZXMgdGhhdCByZXByZXNlbnQgKHN0YW5kYXJkIG9yIGN1c3RvbSkgdGFnIGxpYnJhcmllcy4KKyAgICAgKiAtICJ4bWxucyIgYXR0cmlidXRlcyB0aGF0IGRvIG5vdCByZXByZXNlbnQgdGFnIGxpYnJhcmllcy4KKyAgICAgKiAtIGFsbCByZW1haW5pbmcgYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEZvciBlYWNoICJ4bWxucyIgYXR0cmlidXRlIHRoYXQgcmVwcmVzZW50cyBhIGN1c3RvbSB0YWcgbGlicmFyeSwgdGhlCisgICAgICogY29ycmVzcG9uZGluZyBUYWdMaWJyYXJ5SW5mbyBvYmplY3QgaXMgYWRkZWQgdG8gdGhlIHNldCBvZiBjdXN0b20KKyAgICAgKiB0YWcgbGlicmFyaWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudCgKKyAgICAgICAgU3RyaW5nIHVyaSwKKyAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSwKKyAgICAgICAgU3RyaW5nIHFOYW1lLAorICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICBBdHRyaWJ1dGVzSW1wbCB0YWdsaWJBdHRycyA9IG51bGw7CisgICAgICAgIEF0dHJpYnV0ZXNJbXBsIG5vblRhZ2xpYkF0dHJzID0gbnVsbDsKKyAgICAgICAgQXR0cmlidXRlc0ltcGwgbm9uVGFnbGliWG1sbnNBdHRycyA9IG51bGw7CisKKyAgICAgICAgcHJvY2Vzc0NoYXJzKCk7CisKKyAgICAgICAgY2hlY2tQcmVmaXhlcyh1cmksIHFOYW1lLCBhdHRycyk7CisKKyAgICAgICAgaWYgKGRpcmVjdGl2ZXNPbmx5ICYmCisgICAgICAgICAgICAhKEpTUF9VUkkuZXF1YWxzKHVyaSkgJiYgbG9jYWxOYW1lLnN0YXJ0c1dpdGgoRElSRUNUSVZFX0FDVElPTikpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBqc3A6dGV4dCBtdXN0IG5vdCBoYXZlIGFueSBzdWJlbGVtZW50cworICAgICAgICBpZiAoSlNQX1VSSS5lcXVhbHModXJpKSAmJiBURVhUX0FDVElPTi5lcXVhbHMoY3VycmVudC5nZXRMb2NhbE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnRleHQuaGFzX3N1YmVsZW1lbnQiKSwKKyAgICAgICAgICAgICAgICBsb2NhdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXJ0TWFyayA9IG5ldyBNYXJrKGN0eHQsIHBhdGgsIGxvY2F0b3IuZ2V0TGluZU51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKTsKKworICAgICAgICBpZiAoYXR0cnMgIT0gbnVsbCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIE5vdGljZSB0aGF0IGR1ZSB0byBhIGJ1ZyBpbiB0aGUgdW5kZXJseWluZyBTQVggcGFyc2VyLCB0aGUKKyAgICAgICAgICAgICAqIGF0dHJpYnV0ZXMgbXVzdCBiZSBlbnVtZXJhdGVkIGluIGRlc2NlbmRpbmcgb3JkZXIuIAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBib29sZWFuIGlzVGFnbGliID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gYXR0cnMuZ2V0TGVuZ3RoKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGlzVGFnbGliID0gZmFsc2U7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJRTmFtZSA9IGF0dHJzLmdldFFOYW1lKGkpOworICAgICAgICAgICAgICAgIGlmICghYXR0clFOYW1lLnN0YXJ0c1dpdGgoInhtbG5zIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vblRhZ2xpYkF0dHJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMuYWRkQXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0VVJJKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0TG9jYWxOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRUeXBlKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0VmFsdWUoaSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyUU5hbWUuc3RhcnRzV2l0aCgieG1sbnM6anNwIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFnbGliID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyVXJpID0gYXR0cnMuZ2V0VmFsdWUoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWdsaWJJbmZvIGZvciB0aGlzIHVyaSBhbHJlYWR5IGVzdGFibGlzaGVkIGluCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydFByZWZpeE1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFnbGliID0gcGFnZUluZm8uaGFzVGFnbGliKGF0dHJVcmkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZ2xpYikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ2xpYkF0dHJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMuYWRkQXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFVSSShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRMb2NhbE5hbWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0VHlwZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRWYWx1ZShpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9uVGFnbGliWG1sbnNBdHRycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycy5hZGRBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0VVJJKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldExvY2FsTmFtZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRRTmFtZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRUeXBlKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFZhbHVlKGkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE5vZGUgbm9kZSA9IG51bGw7CisKKyAgICAgICAgaWYgKHRhZ0RlcGVuZGVudFBlbmRpbmcgJiYgSlNQX1VSSS5lcXVhbHModXJpKSAmJgorICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lLmVxdWFscyhCT0RZX0FDVElPTikpIHsKKyAgICAgICAgICAgIHRhZ0RlcGVuZGVudFBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHRhZ0RlcGVuZGVudE5lc3RpbmcrKzsKKyAgICAgICAgICAgIGN1cnJlbnQgPQorICAgICAgICAgICAgICAgIHBhcnNlU3RhbmRhcmRBY3Rpb24oCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRNYXJrLAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0YWdEZXBlbmRlbnRQZW5kaW5nICYmIEpTUF9VUkkuZXF1YWxzKHVyaSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZS5lcXVhbHMoQVRUUklCVVRFX0FDVElPTikpIHsKKyAgICAgICAgICAgIGN1cnJlbnQgPQorICAgICAgICAgICAgICAgIHBhcnNlU3RhbmRhcmRBY3Rpb24oCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRNYXJrLAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0YWdEZXBlbmRlbnRQZW5kaW5nKSB7CisgICAgICAgICAgICB0YWdEZXBlbmRlbnRQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICB0YWdEZXBlbmRlbnROZXN0aW5nKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFnRGVwZW5kZW50TmVzdGluZyA+IDApIHsKKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLlVuaW50ZXJwcmV0ZWRUYWcoCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRNYXJrLAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChKU1BfVVJJLmVxdWFscyh1cmkpKSB7CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBwYXJzZVN0YW5kYXJkQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0TWFyaywKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBwYXJzZUN1c3RvbUFjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdXJpLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0TWFyaywKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb2RlLlVuaW50ZXJwcmV0ZWRUYWcoCisgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRNYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBhY3Rpb24KKyAgICAgICAgICAgICAgICBTdHJpbmcgYm9keVR5cGUgPSBnZXRCb2R5VHlwZSgoTm9kZS5DdXN0b21UYWcpIG5vZGUpOworCisgICAgICAgICAgICAgICAgaWYgKHNjcmlwdGxlc3NCb2R5Tm9kZSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBib2R5VHlwZS5lcXVhbHNJZ25vcmVDYXNlKFRhZ0luZm8uQk9EWV9DT05URU5UX1NDUklQVExFU1MpKSB7CisgICAgICAgICAgICAgICAgICAgIHNjcmlwdGxlc3NCb2R5Tm9kZSA9IG5vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRhZ0luZm8uQk9EWV9DT05URU5UX1RBR19ERVBFTkRFTlQuZXF1YWxzSWdub3JlQ2FzZShib2R5VHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFnRGVwZW5kZW50UGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY3VycmVudCA9IG5vZGU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gb2YgY2hhcmFjdGVyIGRhdGEgaW5zaWRlIGFuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBUaGUgU0FYIGRvZXMgbm90IGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBhbGwgb2YgdGhlIHRlbXBsYXRlIHRleHQsIGJ1dCBtYXkKKyAgICAgKiBpbnZva2UgdGhpcyBtZXRob2Qgd2l0aCBjaHVua3Mgb2YgaXQuICBUaGlzIGlzIGEgcHJvYmxlbSB3aGVuIHdlIHRyeQorICAgICAqIHRvIGRldGVybWluZSBpZiB0aGUgdGV4dCBjb250YWlucyBvbmx5IHdoaXRlc3BhY2VzLCBvciB3aGVuIHdlIGFyZQorICAgICAqIGxvb2tpbmcgZm9yIGFuIEVMIGV4cHJlc3Npb24gc3RyaW5nLiAgVGhlcmVmb3JlIGl0IGlzIG5lY2Vzc2FyeSB0bworICAgICAqIGJ1ZmZlciBhbmQgY29uY2F0ZW5hdGUgdGhlIGNodW5rcyBhbmQgcHJvY2VzcyB0aGUgY29uY2F0ZW5hdGVkIHRleHQgCisgICAgICogbGF0ZXIgKGF0IGJlZ2luVGFnIGFuZCBlbmRUYWcpCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIFRoZSBjaGFyYWN0ZXJzCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgc3RhcnQgcG9zaXRpb24gaW4gdGhlIGNoYXJhY3RlciBhcnJheQorICAgICAqIEBwYXJhbSBsZW4gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZSBmcm9tIHRoZSBjaGFyYWN0ZXIgYXJyYXkKKyAgICAgKgorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gYnVmLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CisKKyAgICAgICAgaWYgKGNoYXJCdWZmZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgY2hhckJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgfQorICAgICAgICBjaGFyQnVmZmVyLmFwcGVuZChidWYsIG9mZnNldCwgbGVuKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0NoYXJzKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGNoYXJCdWZmZXIgPT0gbnVsbCB8fCBkaXJlY3RpdmVzT25seSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSlNQLjYuMS4xOiBBbGwgdGV4dHVhbCBub2RlcyB0aGF0IGhhdmUgb25seSB3aGl0ZSBzcGFjZSBhcmUgdG8gYmUKKyAgICAgICAgICogZHJvcHBlZCBmcm9tIHRoZSBkb2N1bWVudCwgZXhjZXB0IGZvciBub2RlcyBpbiBhIGpzcDp0ZXh0IGVsZW1lbnQsCisgICAgICAgICAqIGFuZCBhbnkgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGUtc3BhY2Utb25seSB0ZXh0dWFsIG5vZGVzIGluIGEKKyAgICAgICAgICoganNwOmF0dHJpYnV0ZSB3aG9zZSAndHJpbScgYXR0cmlidXRlIGlzIHNldCB0byBGQUxTRSwgd2hpY2ggYXJlIHRvCisgICAgICAgICAqIGJlIGtlcHQgdmVyYmF0aW0uCisgICAgICAgICAqIEpTUC42LjIuMyBkZWZpbmVzIHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIGlzQWxsU3BhY2UgPSB0cnVlOworICAgICAgICBpZiAoIShjdXJyZW50IGluc3RhbmNlb2YgTm9kZS5Kc3BUZXh0KQorICAgICAgICAgICAgJiYgIShjdXJyZW50IGluc3RhbmNlb2YgTm9kZS5OYW1lZEF0dHJpYnV0ZSkpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhckJ1ZmZlci5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoY2hhckJ1ZmZlci5jaGFyQXQoaSkgPT0gJyAnCisgICAgICAgICAgICAgICAgICAgIHx8IGNoYXJCdWZmZXIuY2hhckF0KGkpID09ICdcbicKKyAgICAgICAgICAgICAgICAgICAgfHwgY2hhckJ1ZmZlci5jaGFyQXQoaSkgPT0gJ1xyJworICAgICAgICAgICAgICAgICAgICB8fCBjaGFyQnVmZmVyLmNoYXJBdChpKSA9PSAnXHQnKSkgeworICAgICAgICAgICAgICAgICAgICBpc0FsbFNwYWNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNBbGxTcGFjZSAmJiB0YWdEZXBlbmRlbnRQZW5kaW5nKSB7CisgICAgICAgICAgICB0YWdEZXBlbmRlbnRQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICB0YWdEZXBlbmRlbnROZXN0aW5nKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFnRGVwZW5kZW50TmVzdGluZyA+IDApIHsKKyAgICAgICAgICAgIGlmIChjaGFyQnVmZmVyLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIG5ldyBOb2RlLlRlbXBsYXRlVGV4dChjaGFyQnVmZmVyLnRvU3RyaW5nKCksIHN0YXJ0TWFyaywgY3VycmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFydE1hcmsgPSBuZXcgTWFyayhjdHh0LCBwYXRoLCBsb2NhdG9yLmdldExpbmVOdW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkpOworICAgICAgICAgICAgY2hhckJ1ZmZlciA9IG51bGw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGN1cnJlbnQgaW5zdGFuY2VvZiBOb2RlLkpzcFRleHQpCisgICAgICAgICAgICB8fCAoY3VycmVudCBpbnN0YW5jZW9mIE5vZGUuTmFtZWRBdHRyaWJ1dGUpCisgICAgICAgICAgICB8fCAhaXNBbGxTcGFjZSkgeworCisgICAgICAgICAgICBpbnQgbGluZSA9IHN0YXJ0TWFyay5nZXRMaW5lTnVtYmVyKCk7CisgICAgICAgICAgICBpbnQgY29sdW1uID0gc3RhcnRNYXJrLmdldENvbHVtbk51bWJlcigpOworCisgICAgICAgICAgICBDaGFyQXJyYXlXcml0ZXIgdHRleHQgPSBuZXcgQ2hhckFycmF5V3JpdGVyKCk7CisgICAgICAgICAgICBpbnQgbGFzdENoID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhckJ1ZmZlci5sZW5ndGgoKTsgaSsrKSB7CisKKyAgICAgICAgICAgICAgICBpbnQgY2ggPSBjaGFyQnVmZmVyLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSAxOworICAgICAgICAgICAgICAgICAgICBsaW5lKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29sdW1uKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsYXN0Q2ggPT0gJyQnICYmIGNoID09ICd7JykgeworICAgICAgICAgICAgICAgICAgICBpZiAodHRleHQuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vZGUuVGVtcGxhdGVUZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0ZXh0LnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRNYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgdHRleHQgPSBuZXcgQ2hhckFycmF5V3JpdGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1dlIHN1YnRyYWN0IHR3byBmcm9tIHRoZSBjb2x1bW4gbnVtYmVyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAvL2FjY291bnQgZm9yIHRoZSAnJHsnIHRoYXQgd2UndmUgYWxyZWFkeSBwYXJzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TWFyayA9IG5ldyBNYXJrKGN0eHQsIHBhdGgsIGxpbmUsIGNvbHVtbiAtIDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGZvbGxvd2luZyAiJHsiIHRvIGZpcnN0IHVucXVvdGVkICJ9IgorICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2luZ2xlUSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRvdWJsZVEgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdENoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IGNoYXJCdWZmZXIubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR7IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IpOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IGNoYXJCdWZmZXIuY2hhckF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdENoID09ICdcXCcgJiYgKHNpbmdsZVEgfHwgZG91YmxlUSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGV4dC53cml0ZShjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9kZS5FTEV4cHJlc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0ZXh0LnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRleHQgPSBuZXcgQ2hhckFycmF5V3JpdGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRNYXJrID0gbmV3IE1hcmsoY3R4dCwgcGF0aCwgbGluZSwgY29sdW1uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnIicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlUSA9ICFkb3VibGVROworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1wnJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVRID0gIXNpbmdsZVE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHR0ZXh0LndyaXRlKGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDaCA9IGNoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0Q2ggPT0gJ1xcJyAmJiBjaCA9PSAnJCcpIHsKKyAgICAgICAgICAgICAgICAgICAgdHRleHQud3JpdGUoJyQnKTsKKyAgICAgICAgICAgICAgICAgICAgY2ggPSAwOyAgLy8gTm90IHN0YXJ0IG9mIEVMIGFueW1vcmUKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobGFzdENoID09ICckJyB8fCBsYXN0Q2ggPT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICAgICAgdHRleHQud3JpdGUobGFzdENoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJyQnICYmIGNoICE9ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR0ZXh0LndyaXRlKGNoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0Q2ggPSBjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXN0Q2ggPT0gJyQnIHx8IGxhc3RDaCA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgdHRleHQud3JpdGUobGFzdENoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0dGV4dC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuVGVtcGxhdGVUZXh0KHR0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0TWFyaywgY3VycmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRNYXJrID0gbmV3IE1hcmsoY3R4dCwgcGF0aCwgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkpOworCisgICAgICAgIGNoYXJCdWZmZXIgPSBudWxsOworICAgIH0KKworICAgIC8qCisgICAgICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIG9mIHRoZSBlbmQgb2YgYW4gZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcHJvY2Vzc0NoYXJzKCk7CisKKyAgICAgICAgaWYgKGRpcmVjdGl2ZXNPbmx5ICYmCisgICAgICAgICAgICAhKEpTUF9VUkkuZXF1YWxzKHVyaSkgJiYgbG9jYWxOYW1lLnN0YXJ0c1dpdGgoRElSRUNUSVZFX0FDVElPTikpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIE5vZGUuTmFtZWRBdHRyaWJ1dGUpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNUcmltID0gKChOb2RlLk5hbWVkQXR0cmlidXRlKWN1cnJlbnQpLmlzVHJpbSgpOworICAgICAgICAgICAgTm9kZS5Ob2RlcyBzdWJFbGVtcyA9ICgoTm9kZS5OYW1lZEF0dHJpYnV0ZSljdXJyZW50KS5nZXRCb2R5KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgc3ViRWxlbXMgIT0gbnVsbCAmJiBpIDwgc3ViRWxlbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBOb2RlIHN1YkVsZW0gPSBzdWJFbGVtcy5nZXROb2RlKGkpOworICAgICAgICAgICAgICAgIGlmICghKHN1YkVsZW0gaW5zdGFuY2VvZiBOb2RlLlRlbXBsYXRlVGV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIElnbm9yZSBhbnkgd2hpdGVzcGFjZSAoaW5jbHVkaW5nIHNwYWNlcywgY2FycmlhZ2UgcmV0dXJucywKKyAgICAgICAgICAgICAgICAvLyBsaW5lIGZlZWRzLCBhbmQgdGFicywgdGhhdCBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBhbmQgYXQKKyAgICAgICAgICAgICAgICAvLyB0aGUgZW5kIG9mIHRoZSBib2R5IG9mIHRoZSA8anNwOmF0dHJpYnV0ZT4gYWN0aW9uLCBpZiB0aGUKKyAgICAgICAgICAgICAgICAvLyBhY3Rpb24ncyAndHJpbScgYXR0cmlidXRlIGlzIHNldCB0byBUUlVFIChkZWZhdWx0KS4KKyAgICAgICAgICAgICAgICAvLyBJbiBhZGRpdGlvbiwgYW55IHRleHR1YWwgbm9kZXMgaW4gdGhlIDxqc3A6YXR0cmlidXRlPiB0aGF0CisgICAgICAgICAgICAgICAgLy8gaGF2ZSBvbmx5IHdoaXRlIHNwYWNlIGFyZSBkcm9wcGVkIGZyb20gdGhlIGRvY3VtZW50LCB3aXRoCisgICAgICAgICAgICAgICAgLy8gdGhlIGV4Y2VwdGlvbiBvZiBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZS1zcGFjZS1vbmx5CisgICAgICAgICAgICAgICAgLy8gdGV4dHVhbCBub2RlcyBpbiBhIDxqc3A6YXR0cmlidXRlPiB3aG9zZSAndHJpbScgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgLy8gaXMgc2V0IHRvIEZBTFNFLCB3aGljaCBtdXN0IGJlIGtlcHQgdmVyYmF0aW0uCisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNUcmltKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKE5vZGUuVGVtcGxhdGVUZXh0KXN1YkVsZW0pLmx0cmltKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gc3ViRWxlbXMuc2l6ZSgpIC0gMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNUcmltKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKE5vZGUuVGVtcGxhdGVUZXh0KXN1YkVsZW0pLnJ0cmltKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoKChOb2RlLlRlbXBsYXRlVGV4dClzdWJFbGVtKS5pc0FsbFNwYWNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YkVsZW1zLnJlbW92ZShzdWJFbGVtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50IGluc3RhbmNlb2YgTm9kZS5TY3JpcHRpbmdFbGVtZW50KSB7CisgICAgICAgICAgICBjaGVja1NjcmlwdGluZ0JvZHkoKE5vZGUuU2NyaXB0aW5nRWxlbWVudCljdXJyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggaXNUYWdEZXBlbmRlbnQoY3VycmVudCkpIHsKKyAgICAgICAgICAgIHRhZ0RlcGVuZGVudE5lc3RpbmctLTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzY3JpcHRsZXNzQm9keU5vZGUgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGN1cnJlbnQuZXF1YWxzKHNjcmlwdGxlc3NCb2R5Tm9kZSkpIHsKKyAgICAgICAgICAgIHNjcmlwdGxlc3NCb2R5Tm9kZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VycmVudC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5nZXRQYXJlbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUmVjZWl2ZXMgdGhlIGRvY3VtZW50IGxvY2F0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYXRvciB0aGUgZG9jdW1lbnQgbG9jYXRvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpIHsKKyAgICAgICAgdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29tbWVudChjaGFyW10gYnVmLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICBwcm9jZXNzQ2hhcnMoKTsgIC8vIEZsdXNoIGNoYXIgYnVmZmVyIGFuZCByZW1vdmUgd2hpdGUgc3BhY2VzCisKKyAgICAgICAgLy8gaWdub3JlIGNvbW1lbnRzIGluIHRoZSBEVEQKKyAgICAgICAgaWYgKCFpbkRURCkgeworICAgICAgICAgICAgc3RhcnRNYXJrID0KKyAgICAgICAgICAgICAgICBuZXcgTWFyaygKKyAgICAgICAgICAgICAgICAgICAgY3R4dCwKKyAgICAgICAgICAgICAgICAgICAgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkpOworICAgICAgICAgICAgbmV3IE5vZGUuQ29tbWVudChuZXcgU3RyaW5nKGJ1Ziwgb2Zmc2V0LCBsZW4pLCBzdGFydE1hcmssIGN1cnJlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICBwcm9jZXNzQ2hhcnMoKTsgIC8vIEZsdXNoIGNoYXIgYnVmZmVyIGFuZCByZW1vdmUgd2hpdGUgc3BhY2VzCisgICAgICAgIHN0YXJ0TWFyayA9IG5ldyBNYXJrKGN0eHQsIHBhdGgsIGxvY2F0b3IuZ2V0TGluZU51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kQ0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgcHJvY2Vzc0NoYXJzKCk7ICAvLyBGbHVzaCBjaGFyIGJ1ZmZlciBhbmQgcmVtb3ZlIHdoaXRlIHNwYWNlcworICAgIH0KKworICAgIC8qCisgICAgICogU2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kRW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgIH0KKworICAgIC8qCisgICAgICogU2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydERURChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzVmFsaWRhdGluZykgeworICAgICAgICAgICAgZmF0YWxFcnJvcihFTkFCTEVfRFREX1ZBTElEQVRJT05fRVhDRVBUSU9OKTsKKyAgICAgICAgfQorCisgICAgICAgIGluRFREID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kRFREKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGluRFREID0gZmFsc2U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gb2YgYSBub24tcmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiBvZiBhIHJlY292ZXJhYmxlIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICB0aHJvdyBlOworICAgIH0KKworICAgIC8qCisgICAgICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIG9mIHRoZSBzdGFydCBvZiBhIE5hbWVzcGFjZSBtYXBwaW5nLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIFRhZ0xpYnJhcnlJbmZvIHRhZ2xpYkluZm87CisKKyAgICAgICAgaWYgKGRpcmVjdGl2ZXNPbmx5ICYmICEoSlNQX1VSSS5lcXVhbHModXJpKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhZ2xpYkluZm8gPSBnZXRUYWdsaWJJbmZvKHByZWZpeCwgdXJpKTsKKyAgICAgICAgfSBjYXRjaCAoSmFzcGVyRXhjZXB0aW9uIGplKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5jb3VsZC5ub3QuYWRkLnRhZ2xpYnJhcmllcyIpLAorICAgICAgICAgICAgICAgIGxvY2F0b3IsCisgICAgICAgICAgICAgICAgamUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRhZ2xpYkluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHBhZ2VJbmZvLmdldFRhZ2xpYih1cmkpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYWdlSW5mby5hZGRUYWdsaWIodXJpLCB0YWdsaWJJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhZ2VJbmZvLnB1c2hQcmVmaXhNYXBwaW5nKHByZWZpeCwgdXJpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhZ2VJbmZvLnB1c2hQcmVmaXhNYXBwaW5nKHByZWZpeCwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiBvZiB0aGUgZW5kIG9mIGEgTmFtZXNwYWNlIG1hcHBpbmcuIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRpcmVjdGl2ZXNPbmx5KSB7CisgICAgICAgICAgICBTdHJpbmcgdXJpID0gcGFnZUluZm8uZ2V0VVJJKHByZWZpeCk7CisgICAgICAgICAgICBpZiAoIUpTUF9VUkkuZXF1YWxzKHVyaSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwYWdlSW5mby5wb3BQcmVmaXhNYXBwaW5nKHByZWZpeCk7CisgICAgfQorCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBQcml2YXRlIHV0aWxpdHkgbWV0aG9kcworCisgICAgcHJpdmF0ZSBOb2RlIHBhcnNlU3RhbmRhcmRBY3Rpb24oCisgICAgICAgIFN0cmluZyBxTmFtZSwKKyAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSwKKyAgICAgICAgQXR0cmlidXRlcyBub25UYWdsaWJBdHRycywKKyAgICAgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLAorICAgICAgICBNYXJrIHN0YXJ0LAorICAgICAgICBOb2RlIHBhcmVudCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgTm9kZSBub2RlID0gbnVsbDsKKworICAgICAgICBpZiAobG9jYWxOYW1lLmVxdWFscyhST09UX0FDVElPTikpIHsKKyAgICAgICAgICAgIGlmICghKGN1cnJlbnQgaW5zdGFuY2VvZiBOb2RlLlJvb3QpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLm5lc3RlZF9qc3Byb290IiksCisgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuSnNwUm9vdCgKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgaWYgKGlzVG9wKSB7CisgICAgICAgICAgICAgICAgcGFnZUluZm8uc2V0SGFzSnNwUm9vdCh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFBBR0VfRElSRUNUSVZFX0FDVElPTikpIHsKKyAgICAgICAgICAgIGlmIChpc1RhZ0ZpbGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci5hY3Rpb24uaXN0YWdmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSksCisgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuUGFnZURpcmVjdGl2ZSgKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgU3RyaW5nIGltcG9ydHMgPSBub25UYWdsaWJBdHRycy5nZXRWYWx1ZSgiaW1wb3J0Iik7CisgICAgICAgICAgICAvLyBUaGVyZSBjYW4gb25seSBiZSBvbmUgJ2ltcG9ydCcgYXR0cmlidXRlIHBlciBwYWdlIGRpcmVjdGl2ZQorICAgICAgICAgICAgaWYgKGltcG9ydHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICgoTm9kZS5QYWdlRGlyZWN0aXZlKW5vZGUpLmFkZEltcG9ydChpbXBvcnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKElOQ0xVREVfRElSRUNUSVZFX0FDVElPTikpIHsKKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLkluY2x1ZGVEaXJlY3RpdmUoCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgIHByb2Nlc3NJbmNsdWRlRGlyZWN0aXZlKG5vblRhZ2xpYkF0dHJzLmdldFZhbHVlKCJmaWxlIiksIG5vZGUpOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoREVDTEFSQVRJT05fQUNUSU9OKSkgeworICAgICAgICAgICAgaWYgKHNjcmlwdGxlc3NCb2R5Tm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gV2UncmUgbmVzdGVkIGluc2lkZSBhIG5vZGUgd2hvc2UgYm9keSBpcworICAgICAgICAgICAgICAgIC8vIGRlY2xhcmVkIHRvIGJlIHNjcmlwdGxlc3MKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci5uby5zY3JpcHRsZXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSksCisgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuRGVjbGFyYXRpb24oCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoU0NSSVBUTEVUX0FDVElPTikpIHsKKyAgICAgICAgICAgIGlmIChzY3JpcHRsZXNzQm9keU5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5lc3RlZCBpbnNpZGUgYSBub2RlIHdob3NlIGJvZHkgaXMKKyAgICAgICAgICAgICAgICAvLyBkZWNsYXJlZCB0byBiZSBzY3JpcHRsZXNzCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJqc3AuZXJyb3Iubm8uc2NyaXB0bGV0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUpLAorICAgICAgICAgICAgICAgICAgICBsb2NhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLlNjcmlwdGxldCgKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhFWFBSRVNTSU9OX0FDVElPTikpIHsKKyAgICAgICAgICAgIGlmIChzY3JpcHRsZXNzQm9keU5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5lc3RlZCBpbnNpZGUgYSBub2RlIHdob3NlIGJvZHkgaXMKKyAgICAgICAgICAgICAgICAvLyBkZWNsYXJlZCB0byBiZSBzY3JpcHRsZXNzCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJqc3AuZXJyb3Iubm8uc2NyaXB0bGV0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUpLAorICAgICAgICAgICAgICAgICAgICBsb2NhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLkV4cHJlc3Npb24oCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoVVNFX0JFQU5fQUNUSU9OKSkgeworICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuVXNlQmVhbigKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoU0VUX1BST1BFUlRZX0FDVElPTikpIHsKKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLlNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhHRVRfUFJPUEVSVFlfQUNUSU9OKSkgeworICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuR2V0UHJvcGVydHkoCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKElOQ0xVREVfQUNUSU9OKSkgeworICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuSW5jbHVkZUFjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoRk9SV0FSRF9BQ1RJT04pKSB7CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5Gb3J3YXJkQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhQQVJBTV9BQ1RJT04pKSB7CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5QYXJhbUFjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoUEFSQU1TX0FDVElPTikpIHsKKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLlBhcmFtc0FjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhQTFVHSU5fQUNUSU9OKSkgeworICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuUGx1Z0luKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhURVhUX0FDVElPTikpIHsKKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLkpzcFRleHQoCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoQk9EWV9BQ1RJT04pKSB7CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5Kc3BCb2R5KAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKEFUVFJJQlVURV9BQ1RJT04pKSB7CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5OYW1lZEF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoT1VUUFVUX0FDVElPTikpIHsKKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLkpzcE91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoVEFHX0RJUkVDVElWRV9BQ1RJT04pKSB7CisgICAgICAgICAgICBpZiAoIWlzVGFnRmlsZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLmFjdGlvbi5pc25vdHRhZ2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgbG9jYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5UYWdEaXJlY3RpdmUoCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgIFN0cmluZyBpbXBvcnRzID0gbm9uVGFnbGliQXR0cnMuZ2V0VmFsdWUoImltcG9ydCIpOworICAgICAgICAgICAgLy8gVGhlcmUgY2FuIG9ubHkgYmUgb25lICdpbXBvcnQnIGF0dHJpYnV0ZSBwZXIgdGFnIGRpcmVjdGl2ZQorICAgICAgICAgICAgaWYgKGltcG9ydHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICgoTm9kZS5UYWdEaXJlY3RpdmUpbm9kZSkuYWRkSW1wb3J0KGltcG9ydHMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoQVRUUklCVVRFX0RJUkVDVElWRV9BQ1RJT04pKSB7CisgICAgICAgICAgICBpZiAoIWlzVGFnRmlsZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLmFjdGlvbi5pc25vdHRhZ2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgbG9jYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5BdHRyaWJ1dGVEaXJlY3RpdmUoCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFZBUklBQkxFX0RJUkVDVElWRV9BQ1RJT04pKSB7CisgICAgICAgICAgICBpZiAoIWlzVGFnRmlsZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLmFjdGlvbi5pc25vdHRhZ2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgbG9jYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5WYXJpYWJsZURpcmVjdGl2ZSgKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoSU5WT0tFX0FDVElPTikpIHsKKyAgICAgICAgICAgIGlmICghaXNUYWdGaWxlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJqc3AuZXJyb3IuYWN0aW9uLmlzbm90dGFnZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUpLAorICAgICAgICAgICAgICAgICAgICBsb2NhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLkludm9rZUFjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoRE9CT0RZX0FDVElPTikpIHsKKyAgICAgICAgICAgIGlmICghaXNUYWdGaWxlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJqc3AuZXJyb3IuYWN0aW9uLmlzbm90dGFnZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUpLAorICAgICAgICAgICAgICAgICAgICBsb2NhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLkRvQm9keUFjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoRUxFTUVOVF9BQ1RJT04pKSB7CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5Kc3BFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhGQUxMQkFDS19BQ1RJT04pKSB7CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5GYWxsQmFja0FjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICJqc3AuZXJyb3IueG1sLmJhZFN0YW5kYXJkQWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lKSwKKyAgICAgICAgICAgICAgICBsb2NhdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2tzIGlmIHRoZSBYTUwgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0YWcgbmFtZSBpcyBhIGN1c3RvbSBhY3Rpb24sCisgICAgICogYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgTm9kZSBvYmplY3QuCisgICAgICovCisgICAgcHJpdmF0ZSBOb2RlIHBhcnNlQ3VzdG9tQWN0aW9uKAorICAgICAgICBTdHJpbmcgcU5hbWUsCisgICAgICAgIFN0cmluZyBsb2NhbE5hbWUsCisgICAgICAgIFN0cmluZyB1cmksCisgICAgICAgIEF0dHJpYnV0ZXMgbm9uVGFnbGliQXR0cnMsCisgICAgICAgIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgQXR0cmlidXRlcyB0YWdsaWJBdHRycywKKyAgICAgICAgTWFyayBzdGFydCwKKyAgICAgICAgTm9kZSBwYXJlbnQpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworCisgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSB1c2VyLWRlZmluZWQgKGN1c3RvbSkgdGFnCisgICAgICAgIFRhZ0xpYnJhcnlJbmZvIHRhZ0xpYkluZm8gPSBwYWdlSW5mby5nZXRUYWdsaWIodXJpKTsKKyAgICAgICAgaWYgKHRhZ0xpYkluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBUYWdJbmZvIHRhZ0luZm8gPSB0YWdMaWJJbmZvLmdldFRhZyhsb2NhbE5hbWUpOworICAgICAgICBUYWdGaWxlSW5mbyB0YWdGaWxlSW5mbyA9IHRhZ0xpYkluZm8uZ2V0VGFnRmlsZShsb2NhbE5hbWUpOworICAgICAgICBpZiAodGFnSW5mbyA9PSBudWxsICYmIHRhZ0ZpbGVJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci54bWwuYmFkX3RhZyIsIGxvY2FsTmFtZSwgdXJpKSk7CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3MgdGFnSGFuZGxlckNsYXNzID0gbnVsbDsKKyAgICAgICAgaWYgKHRhZ0luZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGhhbmRsZXJDbGFzc05hbWUgPSB0YWdJbmZvLmdldFRhZ0NsYXNzTmFtZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0YWdIYW5kbGVyQ2xhc3MgPQorICAgICAgICAgICAgICAgICAgICBjdHh0LmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGhhbmRsZXJDbGFzc05hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmxvYWRjbGFzcy50YWdoYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlckNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUpLAorICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKKyAgICAgICAgaW50IGNvbG9uID0gcU5hbWUuaW5kZXhPZignOicpOworICAgICAgICBpZiAoY29sb24gIT0gLTEpIHsKKyAgICAgICAgICAgIHByZWZpeCA9IHFOYW1lLnN1YnN0cmluZygwLCBjb2xvbik7CisgICAgICAgIH0KKworICAgICAgICBOb2RlLkN1c3RvbVRhZyByZXQgPSBudWxsOworICAgICAgICBpZiAodGFnSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXQgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLkN1c3RvbVRhZygKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICB1cmksCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgdGFnSW5mbywKKyAgICAgICAgICAgICAgICAgICAgdGFnSGFuZGxlckNsYXNzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuQ3VzdG9tVGFnKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICB0YWdGaWxlSW5mbyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qCisgICAgICogQ3JlYXRlcyB0aGUgdGFnIGxpYnJhcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB1cmkgbmFtZXNwYWNlLCBhbmQKKyAgICAgKiByZXR1cm5zIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IG9mIHRoZSB4bWxucyBhdHRyaWJ1dGUKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSB1cmkgbmFtZXNwYWNlICh2YWx1ZSBvZiB0aGUgeG1sbnMgYXR0cmlidXRlKQorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdGFnIGxpYnJhcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB1cmkgbmFtZXNwYWNlCisgICAgICovCisgICAgcHJpdmF0ZSBUYWdMaWJyYXJ5SW5mbyBnZXRUYWdsaWJJbmZvKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIFRhZ0xpYnJhcnlJbmZvIHJlc3VsdCA9IG51bGw7CisKKyAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKFVSTl9KU1BUQUdESVIpKSB7CisgICAgICAgICAgICAvLyB1cmkgKG9mIHRoZSBmb3JtICJ1cm46anNwdGFnZGlyOnBhdGgiKSByZWZlcmVuY2VzIHRhZyBmaWxlIGRpcgorICAgICAgICAgICAgU3RyaW5nIHRhZ2RpciA9IHVyaS5zdWJzdHJpbmcoVVJOX0pTUFRBR0RJUi5sZW5ndGgoKSk7CisgICAgICAgICAgICByZXN1bHQgPQorICAgICAgICAgICAgICAgIG5ldyBJbXBsaWNpdFRhZ0xpYnJhcnlJbmZvKAorICAgICAgICAgICAgICAgICAgICBjdHh0LAorICAgICAgICAgICAgICAgICAgICBwYXJzZXJDb250cm9sbGVyLAorICAgICAgICAgICAgICAgICAgICBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgIHRhZ2RpciwKKyAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHVyaSByZWZlcmVuY2VzIFRMRCBmaWxlCisgICAgICAgICAgICBib29sZWFuIGlzUGxhaW5VcmkgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICh1cmkuc3RhcnRzV2l0aChVUk5fSlNQVExEKSkgeworICAgICAgICAgICAgICAgIC8vIHVyaSBpcyBvZiB0aGUgZm9ybSAidXJuOmpzcHRsZDpwYXRoIgorICAgICAgICAgICAgICAgIHVyaSA9IHVyaS5zdWJzdHJpbmcoVVJOX0pTUFRMRC5sZW5ndGgoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlzUGxhaW5VcmkgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmdbXSBsb2NhdGlvbiA9IGN0eHQuZ2V0VGxkTG9jYXRpb24odXJpKTsKKyAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsIHx8ICFpc1BsYWluVXJpKSB7CisgICAgICAgICAgICAgICAgaWYgKGN0eHQuZ2V0T3B0aW9ucygpLmlzQ2FjaGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChUYWdMaWJyYXJ5SW5mb0ltcGwpIGN0eHQuZ2V0T3B0aW9ucygpLmdldENhY2hlKCkuZ2V0KHVyaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBJZiB0aGUgdXJpIHZhbHVlIGlzIGEgcGxhaW4gdXJpLCBhIHRyYW5zbGF0aW9uIGVycm9yIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICogbm90IGJlIGdlbmVyYXRlZCBpZiB0aGUgdXJpIGlzIG5vdCBmb3VuZCBpbiB0aGUgdGFnbGliIG1hcC4KKyAgICAgICAgICAgICAgICAgICAgICogSW5zdGVhZCwgYW55IGFjdGlvbnMgaW4gdGhlIG5hbWVzcGFjZSBkZWZpbmVkIGJ5IHRoZSB1cmkKKyAgICAgICAgICAgICAgICAgICAgICogdmFsdWUgbXVzdCBiZSB0cmVhdGVkIGFzIHVuaW50ZXJwcmV0ZWQuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRhZ0xpYnJhcnlJbmZvSW1wbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlckNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3R4dC5nZXRPcHRpb25zKCkuaXNDYWNoaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQuZ2V0T3B0aW9ucygpLmdldENhY2hlKCkucHV0KHVyaSwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBFbnN1cmVzIHRoYXQgdGhlIGdpdmVuIGJvZHkgb25seSBjb250YWlucyBub2RlcyB0aGF0IGFyZSBpbnN0YW5jZXMgb2YKKyAgICAgKiBUZW1wbGF0ZVRleHQuCisgICAgICoKKyAgICAgKiBUaGlzIGNoZWNrIGlzIHBlcmZvcm1lZCBvbmx5IGZvciB0aGUgYm9keSBvZiBhIHNjcmlwdGluZyAodGhhdCBpczoKKyAgICAgKiBkZWNsYXJhdGlvbiwgc2NyaXB0bGV0LCBvciBleHByZXNzaW9uKSBlbGVtZW50LCBhZnRlciB0aGUgZW5kIHRhZyBvZiBhCisgICAgICogc2NyaXB0aW5nIGVsZW1lbnQgaGFzIGJlZW4gcmVhY2hlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tTY3JpcHRpbmdCb2R5KE5vZGUuU2NyaXB0aW5nRWxlbWVudCBzY3JpcHRpbmdFbGVtKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgTm9kZS5Ob2RlcyBib2R5ID0gc2NyaXB0aW5nRWxlbS5nZXRCb2R5KCk7CisgICAgICAgIGlmIChib2R5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBzaXplID0gYm9keS5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIE5vZGUgbiA9IGJvZHkuZ2V0Tm9kZShpKTsKKyAgICAgICAgICAgICAgICBpZiAoIShuIGluc3RhbmNlb2YgTm9kZS5UZW1wbGF0ZVRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtVHlwZSA9IFNDUklQVExFVF9BQ1RJT047CisgICAgICAgICAgICAgICAgICAgIGlmIChzY3JpcHRpbmdFbGVtIGluc3RhbmNlb2YgTm9kZS5EZWNsYXJhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1UeXBlID0gREVDTEFSQVRJT05fQUNUSU9OOworICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0aW5nRWxlbSBpbnN0YW5jZW9mIE5vZGUuRXhwcmVzc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1UeXBlID0gRVhQUkVTU0lPTl9BQ1RJT047CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPQorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci5wYXJzZS54bWwuc2NyaXB0aW5nLmludmFsaWQuYm9keSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVR5cGUpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKG1zZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIGZpbGUgaW5jbHVkZWQgdmlhIGFuIGluY2x1ZGUgZGlyZWN0aXZlLgorICAgICAqCisgICAgICogQHBhcmFtIGZuYW1lIFRoZSBwYXRoIHRvIHRoZSBpbmNsdWRlZCByZXNvdXJjZSwgYXMgc3BlY2lmaWVkIGJ5IHRoZQorICAgICAqICdmaWxlJyBhdHRyaWJ1dGUgb2YgdGhlIGluY2x1ZGUgZGlyZWN0aXZlCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgTm9kZSByZXByZXNlbnRpbmcgdGhlIGluY2x1ZGUgZGlyZWN0aXZlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbmNsdWRlRGlyZWN0aXZlKFN0cmluZyBmbmFtZSwgTm9kZSBwYXJlbnQpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworCisgICAgICAgIGlmIChmbmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyQ29udHJvbGxlci5wYXJzZShmbmFtZSwgcGFyZW50LCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmZpbGUubm90LmZvdW5kIiwgZm5hbWUpLAorICAgICAgICAgICAgICAgIGxvY2F0b3IsCisgICAgICAgICAgICAgICAgZm5mZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVja3MgYW4gZWxlbWVudCdzIGdpdmVuIFVSSSwgcW5hbWUsIGFuZCBhdHRyaWJ1dGVzIHRvIHNlZSBpZiBhbnkKKyAgICAgKiBvZiB0aGVtIGhpamFjayB0aGUgJ2pzcCcgcHJlZml4LCB0aGF0IGlzLCBiaW5kIGl0IHRvIGEgbmFtZXNwYWNlIG90aGVyCisgICAgICogdGhhbiBodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgZWxlbWVudCdzIFVSSQorICAgICAqIEBwYXJhbSBxTmFtZSBUaGUgZWxlbWVudCdzIHFuYW1lCisgICAgICogQHBhcmFtIGF0dHJzIFRoZSBlbGVtZW50J3MgYXR0cmlidXRlcworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja1ByZWZpeGVzKFN0cmluZyB1cmksIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRycykgeworCisgICAgICAgIGNoZWNrUHJlZml4KHVyaSwgcU5hbWUpOworCisgICAgICAgIGludCBsZW4gPSBhdHRycy5nZXRMZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgY2hlY2tQcmVmaXgoYXR0cnMuZ2V0VVJJKGkpLCBhdHRycy5nZXRRTmFtZShpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrcyB0aGUgZ2l2ZW4gVVJJIGFuZCBxbmFtZSB0byBzZWUgaWYgdGhleSBoaWphY2sgdGhlICdqc3AnIHByZWZpeCwKKyAgICAgKiB3aGljaCB3b3VsZCBiZSB0aGUgY2FzZSBpZiBxTmFtZSBjb250YWluZWQgdGhlICdqc3AnIHByZWZpeCBhbmQKKyAgICAgKiB1cmkgd2FzIGRpZmZlcmVudCBmcm9tIGh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgdG8gY2hlY2sKKyAgICAgKiBAcGFyYW0gcU5hbWUgVGhlIHFuYW1lIHRvIGNoZWNrCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUHJlZml4KFN0cmluZyB1cmksIFN0cmluZyBxTmFtZSkgeworCisgICAgICAgIGludCBpbmRleCA9IHFOYW1lLmluZGV4T2YoJzonKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gcU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgICAgIHBhZ2VJbmZvLmFkZFByZWZpeChwcmVmaXgpOworICAgICAgICAgICAgaWYgKCJqc3AiLmVxdWFscyhwcmVmaXgpICYmICFKU1BfVVJJLmVxdWFscyh1cmkpKSB7CisgICAgICAgICAgICAgICAgcGFnZUluZm8uc2V0SXNKc3BQcmVmaXhIaWphY2tlZCh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogR2V0cyBTQVhQYXJzZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsaWRhdGluZyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVxdWVzdGVkIFNBWFBhcnNlciBzaG91bGQKKyAgICAgKiBiZSB2YWxpZGF0aW5nCisgICAgICogQHBhcmFtIGpzcERvY1BhcnNlciBUaGUgSlNQIGRvY3VtZW50IHBhcnNlcgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgU0FYUGFyc2VyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU0FYUGFyc2VyIGdldFNBWFBhcnNlcigKKyAgICAgICAgYm9vbGVhbiB2YWxpZGF0aW5nLAorICAgICAgICBKc3BEb2N1bWVudFBhcnNlciBqc3BEb2NQYXJzZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKworICAgICAgICAvLyBQcmVzZXJ2ZSB4bWxucyBhdHRyaWJ1dGVzCisgICAgICAgIGZhY3Rvcnkuc2V0RmVhdHVyZSgKKyAgICAgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIiwKKyAgICAgICAgICAgIHRydWUpOworICAgICAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcodmFsaWRhdGluZyk7CisgICAgICAgIC8vZmFjdG9yeS5zZXRGZWF0dXJlKAorICAgICAgICAvLyAgICAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLAorICAgICAgICAvLyAgICB2YWxpZGF0aW5nKTsKKyAgICAgICAgCisgICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgcGFyc2VyCisgICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOworICAgICAgICBYTUxSZWFkZXIgeG1sUmVhZGVyID0gc2F4UGFyc2VyLmdldFhNTFJlYWRlcigpOworICAgICAgICB4bWxSZWFkZXIuc2V0UHJvcGVydHkoTEVYSUNBTF9IQU5ETEVSX1BST1BFUlRZLCBqc3BEb2NQYXJzZXIpOworICAgICAgICB4bWxSZWFkZXIuc2V0RXJyb3JIYW5kbGVyKGpzcERvY1BhcnNlcik7CisKKyAgICAgICAgcmV0dXJuIHNheFBhcnNlcjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoYXQgYSBET0NUWVBFIGRlY2xhcmF0aW9uIGlzIHByZXNlbnQsIGJ1dAorICAgICAqIHZhbGlkYXRpb24gaXMgdHVybmVkIG9mZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbmFibGVEVERWYWxpZGF0aW9uRXhjZXB0aW9uCisgICAgICAgIGV4dGVuZHMgU0FYUGFyc2VFeGNlcHRpb24geworCisgICAgICAgIEVuYWJsZURURFZhbGlkYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIExvY2F0b3IgbG9jKSB7CisgICAgICAgICAgICBzdXBlcihtZXNzYWdlLCBsb2MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEJvZHlUeXBlKE5vZGUuQ3VzdG9tVGFnIGN1c3RvbSkgeworCisgICAgICAgIGlmIChjdXN0b20uZ2V0VGFnSW5mbygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXN0b20uZ2V0VGFnSW5mbygpLmdldEJvZHlDb250ZW50KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3VzdG9tLmdldFRhZ0ZpbGVJbmZvKCkuZ2V0VGFnSW5mbygpLmdldEJvZHlDb250ZW50KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVGFnRGVwZW5kZW50KE5vZGUgbikgeworCisgICAgICAgIGlmIChuIGluc3RhbmNlb2YgTm9kZS5DdXN0b21UYWcpIHsKKyAgICAgICAgICAgIFN0cmluZyBib2R5VHlwZSA9IGdldEJvZHlUeXBlKChOb2RlLkN1c3RvbVRhZykgbik7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBUYWdJbmZvLkJPRFlfQ09OVEVOVF9UQUdfREVQRU5ERU5ULmVxdWFsc0lnbm9yZUNhc2UoYm9keVR5cGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0pzcFJlYWRlci5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Kc3BSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGVlNTJiCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Kc3BSZWFkZXIuamF2YQpAQCAtMCwwICsxLDY1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Kc3BDb21waWxhdGlvbkNvbnRleHQ7CisKKy8qKgorICogSnNwUmVhZGVyIGlzIGFuIGlucHV0IGJ1ZmZlciBmb3IgdGhlIEpTUCBwYXJzZXIuIEl0IHNob3VsZCBhbGxvdworICogdW5saW1pdGVkIGxvb2thaGVhZCBhbmQgcHVzaGJhY2suIEl0IGFsc28gaGFzIGEgYnVuY2ggb2YgcGFyc2luZworICogdXRpbGl0eSBtZXRob2RzIGZvciB1bmRlcnN0YW5kaW5nIGh0bWxlc3F1ZSB0aGluZ2llcy4KKyAqCisgKiBAYXV0aG9yIEFuaWwgSy4gVmlqZW5kcmFuCisgKiBAYXV0aG9yIEFuc2VsbSBCYWlyZC1TbWl0aAorICogQGF1dGhvciBIYXJpc2ggUHJhYmFuZGhhbQorICogQGF1dGhvciBSYWppdiBNb3JkYW5pCisgKiBAYXV0aG9yIE1hbmRhciBSYWplCisgKiBAYXV0aG9yIERhbm5vIEZlcnJpbgorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKiBAYXV0aG9yIFNoYXduIEJheWVybgorICogQGF1dGhvciBNYXJrIFJvdGgKKyAqLworCitjbGFzcyBKc3BSZWFkZXIgeworCisgICAgLyoqCisgICAgICogTG9nZ2VyLgorICAgICAqLworICAgIHByaXZhdGUgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpzcFJlYWRlci5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBzcG90IGluIHRoZSBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgTWFyayBjdXJyZW50OworCisgICAgLyoqCisgICAgICogV2hhdCBpcyB0aGlzPworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1hc3RlcjsKKworICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIHNvdXJjZSBmaWxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3Qgc291cmNlRmlsZXM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBmaWxlIElEICgtMSBpbmRpY2F0ZXMgYW4gZXJyb3Igb3Igbm8gZmlsZSkuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY3VyckZpbGVJZDsKKworICAgIC8qKgorICAgICAqIFNlZW1zIHJlZHVuZGFudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzaXplOworCisgICAgLyoqCisgICAgICogVGhlIGNvbXBpbGF0aW9uIGNvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBKc3BDb21waWxhdGlvbkNvbnRleHQgY29udGV4dDsKKworICAgIC8qKgorICAgICAqIFRoZSBKYXNwZXIgZXJyb3IgZGlzcGF0Y2hlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIEVycm9yRGlzcGF0Y2hlciBlcnI7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdG8gdHJ1ZSB3aGVuIHVzaW5nIHRoZSBKc3BSZWFkZXIgb24gYSBzaW5nbGUgZmlsZSB3aGVyZSB3ZSByZWFkIHVwCisgICAgICogdG8gdGhlIGVuZCBhbmQgcmVzZXQgdG8gdGhlIGJlZ2lubmluZyBtYW55IHRpbWVzLgorICAgICAqIChhcyBpbiBQYXJzZXJDb250cm9sbGVyLmZpZ3VyZU91dEpzcERvY3VtZW50KCkpLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzaW5nbGVGaWxlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3R4dCBUaGUgY29tcGlsYXRpb24gY29udGV4dAorICAgICAqIEBwYXJhbSBmbmFtZSBUaGUgZmlsZSBuYW1lCisgICAgICogQHBhcmFtIGVuY29kaW5nIFRoZSBmaWxlIGVuY29kaW5nCisgICAgICogQHBhcmFtIGphckZpbGUgPworICAgICAqIEBwYXJhbSBlcnIgVGhlIGVycm9yIGRpc3BhdGNoZXIKKyAgICAgKiBAdGhyb3dzIEphc3BlckV4Y2VwdGlvbiBJZiBhIEphc3Blci1pbnRlcm5hbCBlcnJvciBvY2N1cnMKKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBJZiB0aGUgSlNQIGZpbGUgaXMgbm90IGZvdW5kIChvciBpcyB1bnJlYWRhYmxlKQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gSU8tbGV2ZWwgZXJyb3Igb2NjdXJzLCBlLmcuIHJlYWRpbmcgdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwUmVhZGVyKEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0LAorICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgSmFyRmlsZSBqYXJGaWxlLAorICAgICAgICAgICAgICAgICAgICAgRXJyb3JEaXNwYXRjaGVyIGVycikKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIHRoaXMoY3R4dCwgZm5hbWUsIGVuY29kaW5nLAorICAgICAgICAgICAgIEpzcFV0aWwuZ2V0UmVhZGVyKGZuYW1lLCBlbmNvZGluZywgamFyRmlsZSwgY3R4dCwgZXJyKSwKKyAgICAgICAgICAgICBlcnIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOiBzYW1lIGFzIGFib3ZlIGNvbnN0cnVjdG9yIGJ1dCB3aXRoIGluaXRpYWxpemVkIHJlYWRlcgorICAgICAqIHRvIHRoZSBmaWxlIGdpdmVuLgorICAgICAqLworICAgIHB1YmxpYyBKc3BSZWFkZXIoSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQsCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICBFcnJvckRpc3BhdGNoZXIgZXJyKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKworICAgICAgICB0aGlzLmNvbnRleHQgPSBjdHh0OworICAgICAgICB0aGlzLmVyciA9IGVycjsKKyAgICAgICAgc291cmNlRmlsZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGN1cnJGaWxlSWQgPSAwOworICAgICAgICBzaXplID0gMDsKKyAgICAgICAgc2luZ2xlRmlsZSA9IGZhbHNlOworICAgICAgICBwdXNoRmlsZShmbmFtZSwgZW5jb2RpbmcsIHJlYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBKU1AgY29tcGlsYXRpb24gY29udGV4dCB3aXRoIHdoaWNoIHRoaXMgSnNwUmVhZGVyIGlzIAorICAgICAqIGFzc29jaWF0ZWQKKyAgICAgKi8KKyAgICBKc3BDb21waWxhdGlvbkNvbnRleHQgZ2V0SnNwQ29tcGlsYXRpb25Db250ZXh0KCkgeworICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZWlkIFRoZSBmaWxlIHBvc2l0aW9uIGluIHRoZSBsaXN0CisgICAgICogQHJldHVybiBUaGUgZmlsZSBhdCB0aGF0IHBvc2l0aW9uLCBpZiBmb3VuZCwgbnVsbCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0RmlsZShmaW5hbCBpbnQgZmlsZWlkKSB7CisgICAgICAgIHJldHVybiAoU3RyaW5nKSBzb3VyY2VGaWxlcy5nZXQoZmlsZWlkKTsKKyAgICB9CisgICAgICAgCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGZpbGUgaGFzIG1vcmUgaW5wdXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgbW9yZSByZWFkaW5nIGlzIHBvc3NpYmxlCisgICAgICogQHRocm93cyBKYXNwZXJFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovIAorICAgIGJvb2xlYW4gaGFzTW9yZUlucHV0KCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjdXJyZW50LmN1cnNvciA+PSBjdXJyZW50LnN0cmVhbS5sZW5ndGgpIHsKKyAgICAgICAgICAgIGlmIChzaW5nbGVGaWxlKSByZXR1cm4gZmFsc2U7IAorICAgICAgICAgICAgd2hpbGUgKHBvcEZpbGUoKSkgeworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmN1cnNvciA8IGN1cnJlbnQuc3RyZWFtLmxlbmd0aCkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIGludCBuZXh0Q2hhcigpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc01vcmVJbnB1dCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAKKyAgICAgICAgaW50IGNoID0gY3VycmVudC5zdHJlYW1bY3VycmVudC5jdXJzb3JdOworCisgICAgICAgIGN1cnJlbnQuY3Vyc29yKys7CisgICAgICAgIAorICAgICAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgY3VycmVudC5saW5lKys7CisgICAgICAgICAgICBjdXJyZW50LmNvbCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdXJyZW50LmNvbCsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYWNrIHVwIHRoZSBjdXJyZW50IGN1cnNvciBieSBvbmUgY2hhciwgYXNzdW1lcyBjdXJyZW50LmN1cnNvciA+IDAsCisgICAgICogYW5kIHRoYXQgdGhlIGNoYXIgdG8gYmUgcHVzaGVkIGJhY2sgaXMgbm90ICdcbicuCisgICAgICovCisgICAgdm9pZCBwdXNoQ2hhcigpIHsKKyAgICAgICAgY3VycmVudC5jdXJzb3ItLTsKKyAgICAgICAgY3VycmVudC5jb2wtLTsKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0VGV4dChNYXJrIHN0YXJ0LCBNYXJrIHN0b3ApIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBNYXJrIG9sZHN0YXJ0ID0gbWFyaygpOworICAgICAgICByZXNldChzdGFydCk7CisgICAgICAgIENoYXJBcnJheVdyaXRlciBjYXcgPSBuZXcgQ2hhckFycmF5V3JpdGVyKCk7CisgICAgICAgIHdoaWxlICghc3RvcC5lcXVhbHMobWFyaygpKSkKKyAgICAgICAgICAgIGNhdy53cml0ZShuZXh0Q2hhcigpKTsKKyAgICAgICAgY2F3LmNsb3NlKCk7CisgICAgICAgIHJlc2V0KG9sZHN0YXJ0KTsKKyAgICAgICAgcmV0dXJuIGNhdy50b1N0cmluZygpOworICAgIH0KKworICAgIGludCBwZWVrQ2hhcigpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc01vcmVJbnB1dCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gY3VycmVudC5zdHJlYW1bY3VycmVudC5jdXJzb3JdOworICAgIH0KKworICAgIE1hcmsgbWFyaygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNYXJrKGN1cnJlbnQpOworICAgIH0KKworICAgIHZvaWQgcmVzZXQoTWFyayBtYXJrKSB7CisgICAgICAgIGN1cnJlbnQgPSBuZXcgTWFyayhtYXJrKTsKKyAgICB9CisKKyAgICBib29sZWFuIG1hdGNoZXNJZ25vcmVDYXNlKFN0cmluZyBzdHJpbmcpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBNYXJrIG1hcmsgPSBtYXJrKCk7CisgICAgICAgIGludCBjaCA9IDA7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgY2ggPSBuZXh0Q2hhcigpOworICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZSgoY2hhcikgY2gpICE9IHN0cmluZy5jaGFyQXQoaSsrKSkgeworICAgICAgICAgICAgICAgIHJlc2V0KG1hcmspOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoaSA8IHN0cmluZy5sZW5ndGgoKSk7CisgICAgICAgIHJlc2V0KG1hcmspOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZWFyY2ggdGhlIHN0cmVhbSBmb3IgYSBtYXRjaCB0byBhIHN0cmluZworICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBtYXRjaAorICAgICAqIEByZXR1cm4gPHN0cm9uZz50cnVlPC9zdHJvbmc+IGlzIG9uZSBpcyBmb3VuZCwgdGhlIGN1cnJlbnQgcG9zaXRpb24KKyAgICAgKiAgICAgICAgIGluIHN0cmVhbSBpcyBwb3NpdGlvbmVkIGFmdGVyIHRoZSBzZWFyY2ggc3RyaW5nLCA8c3Ryb25nPgorICAgICAqICAgICAgICAgICAgICAgZmFsc2U8L3N0cm9uZz4gb3RoZXJ3aXNlLCBwb3NpdGlvbiBpbiBzdHJlYW0gdW5jaGFuZ2VkLgorICAgICAqLworICAgIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgTWFyayBtYXJrID0gbWFyaygpOworICAgICAgICBpbnQgY2ggPSAwOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGNoID0gbmV4dENoYXIoKTsKKyAgICAgICAgICAgIGlmICgoKGNoYXIpIGNoKSAhPSBzdHJpbmcuY2hhckF0KGkrKykpIHsKKyAgICAgICAgICAgICAgICByZXNldChtYXJrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKGkgPCBzdHJpbmcubGVuZ3RoKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sZWFuIG1hdGNoZXNFVGFnKFN0cmluZyB0YWdOYW1lKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgTWFyayBtYXJrID0gbWFyaygpOworCisgICAgICAgIGlmICghbWF0Y2hlcygiPC8iICsgdGFnTmFtZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHNraXBTcGFjZXMoKTsKKyAgICAgICAgaWYgKG5leHRDaGFyKCkgPT0gJz4nKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgcmVzZXQobWFyayk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIG1hdGNoZXNFVGFnV2l0aG91dExlc3NUaGFuKFN0cmluZyB0YWdOYW1lKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgeworICAgICAgIE1hcmsgbWFyayA9IG1hcmsoKTsKKworICAgICAgIGlmICghbWF0Y2hlcygiLyIgKyB0YWdOYW1lKSkKKyAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgIHNraXBTcGFjZXMoKTsKKyAgICAgICBpZiAobmV4dENoYXIoKSA9PSAnPicpCisgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgcmVzZXQobWFyayk7CisgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogTG9va3MgYWhlYWQgdG8gc2VlIGlmIHRoZXJlIGFyZSBvcHRpb25hbCBzcGFjZXMgZm9sbG93ZWQgYnkKKyAgICAgKiB0aGUgZ2l2ZW4gU3RyaW5nLiAgSWYgc28sIHRydWUgaXMgcmV0dXJuZWQgYW5kIHRob3NlIHNwYWNlcyBhbmQKKyAgICAgKiBjaGFyYWN0ZXJzIGFyZSBza2lwcGVkLiAgSWYgbm90LCBmYWxzZSBpcyByZXR1cm5lZCBhbmQgdGhlCisgICAgICogcG9zaXRpb24gaXMgcmVzdG9yZWQgdG8gd2hlcmUgd2Ugd2VyZSBiZWZvcmUuCisgICAgICovCisgICAgYm9vbGVhbiBtYXRjaGVzT3B0aW9uYWxTcGFjZXNGb2xsb3dlZEJ5KCBTdHJpbmcgcyApCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIE1hcmsgbWFyayA9IG1hcmsoKTsKKworICAgICAgICBza2lwU3BhY2VzKCk7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gbWF0Y2hlcyggcyApOworICAgICAgICBpZiggIXJlc3VsdCApIHsKKyAgICAgICAgICAgIHJlc2V0KCBtYXJrICk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGludCBza2lwU3BhY2VzKCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGhhc01vcmVJbnB1dCgpICYmIGlzU3BhY2UoKSkgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgbmV4dENoYXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTa2lwIHVudGlsIHRoZSBnaXZlbiBzdHJpbmcgaXMgbWF0Y2hlZCBpbiB0aGUgc3RyZWFtLgorICAgICAqIFdoZW4gcmV0dXJuZWQsIHRoZSBjb250ZXh0IGlzIHBvc2l0aW9uZWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBtYXRjaC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIFRoZSBTdHJpbmcgdG8gbWF0Y2guCisgICAgICogQHJldHVybiBBIG5vbi1udWxsIDxjb2RlPk1hcms8L2NvZGU+IGluc3RhbmNlIChwb3NpdGlvbmVkIGltbWVkaWF0ZWx5CisgICAgICogICAgICAgICBiZWZvcmUgdGhlIHNlYXJjaCBzdHJpbmcpIGlmIGZvdW5kLCA8c3Ryb25nPm51bGw8L3N0cm9uZz4KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBNYXJrIHNraXBVbnRpbChTdHJpbmcgbGltaXQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBNYXJrIHJldCA9IG51bGw7CisgICAgICAgIGludCBsaW1sZW4gPSBsaW1pdC5sZW5ndGgoKTsKKyAgICAgICAgaW50IGNoOworCisgICAgc2tpcDoKKyAgICAgICAgZm9yIChyZXQgPSBtYXJrKCksIGNoID0gbmV4dENoYXIoKSA7IGNoICE9IC0xIDsKKyAgICAgICAgICAgICAgICAgcmV0ID0gbWFyaygpLCBjaCA9IG5leHRDaGFyKCkpIHsKKyAgICAgICAgICAgIGlmIChjaCA9PSBsaW1pdC5jaGFyQXQoMCkpIHsKKyAgICAgICAgICAgICAgICBNYXJrIHJlc3RhcnQgPSBtYXJrKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDEgOyBpIDwgbGltbGVuIDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwZWVrQ2hhcigpID09IGxpbWl0LmNoYXJBdChpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRDaGFyKCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXQocmVzdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBza2lwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2tpcCB1bnRpbCB0aGUgZ2l2ZW4gc3RyaW5nIGlzIG1hdGNoZWQgaW4gdGhlIHN0cmVhbSwgYnV0IGlnbm9yaW5nCisgICAgICogY2hhcnMgaW5pdGlhbGx5IGVzY2FwZWQgYnkgYSAnXCcuCisgICAgICogV2hlbiByZXR1cm5lZCwgdGhlIGNvbnRleHQgaXMgcG9zaXRpb25lZCBwYXN0IHRoZSBlbmQgb2YgdGhlIG1hdGNoLgorICAgICAqCisgICAgICogQHBhcmFtIHMgVGhlIFN0cmluZyB0byBtYXRjaC4KKyAgICAgKiBAcmV0dXJuIEEgbm9uLW51bGwgPGNvZGU+TWFyazwvY29kZT4gaW5zdGFuY2UgKHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkKKyAgICAgKiAgICAgICAgIGJlZm9yZSB0aGUgc2VhcmNoIHN0cmluZykgaWYgZm91bmQsIDxzdHJvbmc+bnVsbDwvc3Ryb25nPgorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIE1hcmsgc2tpcFVudGlsSWdub3JlRXNjKFN0cmluZyBsaW1pdCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIE1hcmsgcmV0ID0gbnVsbDsKKyAgICAgICAgaW50IGxpbWxlbiA9IGxpbWl0Lmxlbmd0aCgpOworICAgICAgICBpbnQgY2g7CisgICAgICAgIGludCBwcmV2ID0gJ3gnOyAgICAgICAgLy8gRG9lc24ndCBtYXR0ZXIKKyAgICAgICAgCisgICAgc2tpcDoKKyAgICAgICAgZm9yIChyZXQgPSBtYXJrKCksIGNoID0gbmV4dENoYXIoKSA7IGNoICE9IC0xIDsKKyAgICAgICAgICAgICAgICAgcmV0ID0gbWFyaygpLCBwcmV2ID0gY2gsIGNoID0gbmV4dENoYXIoKSkgeyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGNoID09ICdcXCcgJiYgcHJldiA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgY2ggPSAwOyAgICAgICAgICAgICAgICAvLyBEb3VibGUgXCBpcyBub3QgYW4gZXNjYXBlIGNoYXIgYW55bW9yZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gbGltaXQuY2hhckF0KDApICYmIHByZXYgIT0gJ1xcJykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxIDsgaSA8IGxpbWxlbiA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAocGVla0NoYXIoKSA9PSBsaW1pdC5jaGFyQXQoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Q2hhcigpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBza2lwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTa2lwIHVudGlsIHRoZSBnaXZlbiBlbmQgdGFnIGlzIG1hdGNoZWQgaW4gdGhlIHN0cmVhbS4KKyAgICAgKiBXaGVuIHJldHVybmVkLCB0aGUgY29udGV4dCBpcyBwb3NpdGlvbmVkIHBhc3QgdGhlIGVuZCBvZiB0aGUgdGFnLgorICAgICAqCisgICAgICogQHBhcmFtIHRhZyBUaGUgbmFtZSBvZiB0aGUgdGFnIHdob3NlIEVUYWcgKDwvdGFnPikgdG8gbWF0Y2guCisgICAgICogQHJldHVybiBBIG5vbi1udWxsIDxjb2RlPk1hcms8L2NvZGU+IGluc3RhbmNlIChwb3NpdGlvbmVkIGltbWVkaWF0ZWx5CisgICAgICogICAgICAgICAgICAgICBiZWZvcmUgdGhlIEVUYWcpIGlmIGZvdW5kLCA8c3Ryb25nPm51bGw8L3N0cm9uZz4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIE1hcmsgc2tpcFVudGlsRVRhZyhTdHJpbmcgdGFnKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgTWFyayByZXQgPSBza2lwVW50aWwoIjwvIiArIHRhZyk7CisgICAgICAgIGlmIChyZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2tpcFNwYWNlcygpOworICAgICAgICAgICAgaWYgKG5leHRDaGFyKCkgIT0gJz4nKQorICAgICAgICAgICAgICAgIHJldCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBmaW5hbCBib29sZWFuIGlzU3BhY2UoKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTm90ZTogSWYgdGhpcyBsb2dpYyBjaGFuZ2VzLCBhbHNvIHVwZGF0ZSBOb2RlLlRlbXBsYXRlVGV4dC5ydHJpbSgpCisgICAgICAgIHJldHVybiBwZWVrQ2hhcigpIDw9ICcgJzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhIHNwYWNlIGRlbGltaXRlZCB0b2tlbi4KKyAgICAgKiBJZiBxdW90ZWQgdGhlIHRva2VuIHdpbGwgY29uc3VtZSBhbGwgY2hhcmFjdGVycyB1cCB0byBhIG1hdGNoaW5nIHF1b3RlLAorICAgICAqIG90aGVyd2lzZSwgaXQgY29uc3VtZXMgdXAgdG8gdGhlIGZpcnN0IGRlbGltaXRlciBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcXVvdGVkIElmIDxzdHJvbmc+dHJ1ZTwvc3Ryb25nPiBhY2NlcHQgcXVvdGVkIHN0cmluZ3MuCisgICAgICovCisgICAgU3RyaW5nIHBhcnNlVG9rZW4oYm9vbGVhbiBxdW90ZWQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBza2lwU3BhY2VzKCk7CisgICAgICAgIHN0cmluZ0J1ZmZlci5zZXRMZW5ndGgoMCk7CisgICAgICAgIAorICAgICAgICBpZiAoIWhhc01vcmVJbnB1dCgpKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY2ggPSBwZWVrQ2hhcigpOworICAgICAgICAKKyAgICAgICAgaWYgKHF1b3RlZCkgeworICAgICAgICAgICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAnXCcnKSB7CisKKyAgICAgICAgICAgICAgICBjaGFyIGVuZFF1b3RlID0gY2ggPT0gJyInID8gJyInIDogJ1wnJzsKKyAgICAgICAgICAgICAgICAvLyBDb25zdW1lIHRoZSBvcGVuIHF1b3RlOiAKKyAgICAgICAgICAgICAgICBjaCA9IG5leHRDaGFyKCk7CisgICAgICAgICAgICAgICAgZm9yIChjaCA9IG5leHRDaGFyKCk7IGNoICE9IC0xICYmIGNoICE9IGVuZFF1b3RlOworICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gbmV4dENoYXIoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xcJykgCisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IG5leHRDaGFyKCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoKGNoYXIpIGNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZW5kIG9mIHF1b3RlLCBza2lwIGNsb3NpbmcgcXVvdGU6CisgICAgICAgICAgICAgICAgaWYgKGNoID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihtYXJrKCksICJqc3AuZXJyb3IucXVvdGVzLnVudGVybWluYXRlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG1hcmsoKSwgImpzcC5lcnJvci5hdHRyLnF1b3RlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFpc0RlbGltaXRlcigpKSB7CisgICAgICAgICAgICAgICAgLy8gUmVhZCB2YWx1ZSB1bnRpbCBkZWxpbWl0ZXIgaXMgZm91bmQ6CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBjaCA9IG5leHRDaGFyKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRha2UgY2FyZSBvZiB0aGUgcXVvdGluZyBoZXJlLgorICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlZWtDaGFyKCkgPT0gJyInIHx8IHBlZWtDaGFyKCkgPT0gJ1wnJyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZWtDaGFyKCkgPT0gJz4nIHx8IHBlZWtDaGFyKCkgPT0gJyUnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gbmV4dENoYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKChjaGFyKSBjaCk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoIWlzRGVsaW1pdGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0cmluZ0J1ZmZlci50b1N0cmluZygpOworICAgIH0KKworICAgIHZvaWQgc2V0U2luZ2xlRmlsZShib29sZWFuIHZhbCkgeworICAgICAgICBzaW5nbGVGaWxlID0gdmFsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgVVJMIGZvciB0aGUgZ2l2ZW4gcGF0aCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggUGF0aCBuYW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFVSTCBmb3IgdGhlIGdpdmVuIHBhdGggbmFtZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIHRoZSBwYXRoIG5hbWUgaXMgbm90IGdpdmVuIGluIAorICAgICAqIHRoZSBjb3JyZWN0IGZvcm0KKyAgICAgKi8KKyAgICBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIHBhdGgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRSZXNvdXJjZShwYXRoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIHV0aWxzIC0gSXMgY3VycmVudCBjaGFyYWN0ZXIgYSB0b2tlbiBkZWxpbWl0ZXIgPworICAgICAqIERlbGltaXRlcnMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIHRvIGJlID0sICZndDssICZsdDssICIsIGFuZCAnIG9yIGFueQorICAgICAqIGFueSBzcGFjZSBjaGFyYWN0ZXIgYXMgZGVmaW5lZCBieSA8Y29kZT5pc1NwYWNlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBib29sZWFuLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlbGltaXRlcigpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBpZiAoISBpc1NwYWNlKCkpIHsKKyAgICAgICAgICAgIGludCBjaCA9IHBlZWtDaGFyKCk7CisgICAgICAgICAgICAvLyBMb29rIGZvciBhIHNpbmdsZS1jaGFyIHdvcmsgZGVsaW1pdGVyOgorICAgICAgICAgICAgaWYgKGNoID09ICc9JyB8fCBjaCA9PSAnPicgfHwgY2ggPT0gJyInIHx8IGNoID09ICdcJycKKyAgICAgICAgICAgICAgICAgICAgfHwgY2ggPT0gJy8nKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBMb29rIGZvciBhbiBlbmQtb2YtY29tbWVudCBvciBlbmQtb2YtdGFnOiAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBNYXJrIG1hcmsgPSBtYXJrKCk7CisgICAgICAgICAgICAgICAgaWYgKCgoY2ggPSBuZXh0Q2hhcigpKSA9PSAnPicpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKGNoID09ICctJykgJiYgKG5leHRDaGFyKCkgPT0gJz4nKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzZXQobWFyayk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0KG1hcmspOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIG5ldyBzb3VyY2UgZmlsZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGltcGxlbWVudCBmaWxlIGluY2x1c2lvbi4gRWFjaCBpbmNsdWRlZCBmaWxlCisgICAgICogZ2V0cyBhIHVuaXF1ZSBpZGVudGlmaWVyICh3aGljaCBpcyB0aGUgaW5kZXggaW4gdGhlIGFycmF5IG9mIHNvdXJjZQorICAgICAqIGZpbGVzKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBub3cgcmVnaXN0ZXJlZCBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHJlZ2lzdGVyU291cmNlRmlsZShmaW5hbCBTdHJpbmcgZmlsZSkgeworICAgICAgICBpZiAoc291cmNlRmlsZXMuY29udGFpbnMoZmlsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHNvdXJjZUZpbGVzLmFkZChmaWxlKTsKKyAgICAgICAgdGhpcy5zaXplKys7CisKKyAgICAgICAgcmV0dXJuIHNvdXJjZUZpbGVzLnNpemUoKSAtIDE7CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlciB0aGUgc291cmNlIGZpbGUuCisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbXBsZW1lbnQgZmlsZSBpbmNsdXNpb24uIEVhY2ggaW5jbHVkZWQgZmlsZQorICAgICAqIGdldHMgYSB1bmlxIGlkZW50aWZpZXIgKHdoaWNoIGlzIHRoZSBpbmRleCBpbiB0aGUgYXJyYXkgb2Ygc291cmNlCisgICAgICogZmlsZXMpLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIG5vdyByZWdpc3RlcmVkIGZpbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgdW5yZWdpc3RlclNvdXJjZUZpbGUoZmluYWwgU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgaWYgKCFzb3VyY2VGaWxlcy5jb250YWlucyhmaWxlKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgc291cmNlRmlsZXMucmVtb3ZlKGZpbGUpOworICAgICAgICB0aGlzLnNpemUtLTsKKyAgICAgICAgcmV0dXJuIHNvdXJjZUZpbGVzLnNpemUoKSAtIDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHVzaCBhIGZpbGUgKGFuZCBpdHMgYXNzb2NpYXRlZCBTdHJlYW0pIG9uIHRoZSBmaWxlIHN0YWNrLiAgVEhlCisgICAgICogY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBmaWxlIGlzIHJlbWVtYmVyZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHB1c2hGaWxlKFN0cmluZyBmaWxlLCBTdHJpbmcgZW5jb2RpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyKSAKKyAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBmaWxlCisgICAgICAgIFN0cmluZyBsb25nTmFtZSA9IGZpbGU7CisKKyAgICAgICAgaW50IGZpbGVpZCA9IHJlZ2lzdGVyU291cmNlRmlsZShsb25nTmFtZSk7CisKKyAgICAgICAgaWYgKGZpbGVpZCA9PSAtMSkgeworICAgICAgICAgICAgLy8gQnVnemlsbGEgMzc0MDc6IGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9Mzc0MDcKKyAgICAgICAgICAgIGlmKHJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGFueSkgeworICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gY2xvc2luZyByZWFkZXI6ICIsIGFueSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLmZpbGUuYWxyZWFkeS5yZWdpc3RlcmVkIiwgZmlsZSk7CisgICAgICAgIH0KKworICAgICAgICBjdXJyRmlsZUlkID0gZmlsZWlkOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDaGFyQXJyYXlXcml0ZXIgY2F3ID0gbmV3IENoYXJBcnJheVdyaXRlcigpOworICAgICAgICAgICAgY2hhciBidWZbXSA9IG5ldyBjaGFyWzEwMjRdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyAoaSA9IHJlYWRlci5yZWFkKGJ1ZikpICE9IC0xIDspCisgICAgICAgICAgICAgICAgY2F3LndyaXRlKGJ1ZiwgMCwgaSk7CisgICAgICAgICAgICBjYXcuY2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gbmV3IE1hcmsodGhpcywgY2F3LnRvQ2hhckFycmF5KCksIGZpbGVpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpbGUoZmlsZWlkKSwgbWFzdGVyLCBlbmNvZGluZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGN1cnJlbnQucHVzaFN0cmVhbShjYXcudG9DaGFyQXJyYXkoKSwgZmlsZWlkLCBnZXRGaWxlKGZpbGVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdOYW1lLCBlbmNvZGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJFeGNlcHRpb24gcGFyc2luZyBmaWxlICIsIGV4KTsKKyAgICAgICAgICAgIC8vIFBvcCBzdGF0ZSBiZWluZyBjb25zdHJ1Y3RlZDoKKyAgICAgICAgICAgIHBvcEZpbGUoKTsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLmZpbGUuY2Fubm90LnJlYWQiLCBmaWxlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBhbnkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIGNsb3NpbmcgcmVhZGVyOiAiLCBhbnkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wIGEgZmlsZSBmcm9tIHRoZSBmaWxlIHN0YWNrLiAgVGhlIGZpZWxkICJjdXJyZW50IiBpcyByZXRvcmVkCisgICAgICogdG8gdGhlIHZhbHVlIHRvIHBvaW50IHRvIHRoZSBwcmV2aW91cyBmaWxlcywgaWYgYW55LCBhbmQgaXMgc2V0CisgICAgICogdG8gbnVsbCBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlIGlzIHRoZXJlIGlzIGEgcHJldmlvdXMgZmlsZSBvbiB0aGUgc3RhY2suCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHBvcEZpbGUoKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJcyBzdGFjayBjcmVhdGVkID8gKHdpbGwgaGFwcGVuIGlmIHRoZSBKc3AgZmlsZSB3ZSdyZSBsb29raW5nIGF0IGlzCisgICAgICAgIC8vIG1pc3NpbmcuCisgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwgfHwgY3VyckZpbGVJZCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc3RvcmUgcGFyc2VyIHN0YXRlOgorICAgICAgICBTdHJpbmcgZk5hbWUgPSBnZXRGaWxlKGN1cnJGaWxlSWQpOworICAgICAgICBjdXJyRmlsZUlkID0gdW5yZWdpc3RlclNvdXJjZUZpbGUoZk5hbWUpOworICAgICAgICBpZiAoY3VyckZpbGVJZCA8IC0xKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci5maWxlLm5vdC5yZWdpc3RlcmVkIiwgZk5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgTWFyayBwcmV2aW91cyA9IGN1cnJlbnQucG9wU3RyZWFtKCk7CisgICAgICAgIGlmIChwcmV2aW91cyAhPSBudWxsKSB7CisgICAgICAgICAgICBtYXN0ZXIgPSBjdXJyZW50LmJhc2VEaXI7CisgICAgICAgICAgICBjdXJyZW50ID0gcHJldmlvdXM7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBOb3RlIHRoYXQgYWx0aG91Z2ggdGhlIGN1cnJlbnQgZmlsZSBpcyB1bmRlZmluZWQgaGVyZSwgImN1cnJlbnQiCisgICAgICAgIC8vIGlzIG5vdCBzZXQgdG8gbnVsbCBqdXN0IGZvciBjb252aWVuY2UsIGZvciBpdCBtYXliZSB1c2VkIHRvCisgICAgICAgIC8vIHNldCB0aGUgY3VycmVudCAodW5kZWZpbmVkKSBwb3NpdGlvbi4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Kc3BSdW50aW1lQ29udGV4dC5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Kc3BSdW50aW1lQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MjQ3NzEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0pzcFJ1bnRpbWVDb250ZXh0LmphdmEKQEAgLTAsMCArMSw1MjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZVBlcm1pc3Npb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUG9saWN5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Db25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSnNwQ29tcGlsYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLk9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5zZWN1cml0eS5TZWN1cml0eUNsYXNzTG9hZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5zZXJ2bGV0LkpzcFNlcnZsZXRXcmFwcGVyOworCisvKioKKyAqIENsYXNzIGZvciB0cmFja2luZyBKU1AgY29tcGlsZSB0aW1lIGZpbGUgZGVwZW5kZW5jaWVzIHdoZW4gdGhlCisgKiAmMDYwOyVAaW5jbHVkZSBmaWxlPSIuLi4iJSYwNjI7IGRpcmVjdGl2ZSBpcyB1c2VkLgorICoKKyAqIEEgYmFja2dyb3VuZCB0aHJlYWQgcGVyaW9kaWNhbGx5IGNoZWNrcyB0aGUgZmlsZXMgYSBKU1AgcGFnZQorICogaXMgZGVwZW5kZW50IHVwb24uICBJZiBhIGRwZW5kZW50IGZpbGUgY2hhbmdlcyB0aGUgSlNQIHBhZ2UKKyAqIHdoaWNoIGluY2x1ZGVkIGl0IGlzIHJlY29tcGlsZWQuCisgKgorICogT25seSB1c2VkIGlmIGEgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQgaXMgYSBkaXJlY3RvcnkuCisgKgorICogQGF1dGhvciBHbGVubiBMLiBOaWVsc2VuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKc3BSdW50aW1lQ29udGV4dCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworICAgIC8vIExvZ2dlcgorICAgIHByaXZhdGUgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpzcFJ1bnRpbWVDb250ZXh0LmNsYXNzKTsKKworICAgIC8qCisgICAgICogQ291bnRzIGhvdyBtYW55IHRpbWVzIHRoZSB3ZWJhcHAncyBKU1BzIGhhdmUgYmVlbiByZWxvYWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBqc3BSZWxvYWRDb3VudDsKKworICAgIC8qKgorICAgICAqIFByZWxvYWQgY2xhc3NlcyByZXF1aXJlZCBhdCBydW50aW1lIGJ5IGEgSlNQIHNlcnZsZXQgc28gdGhhdAorICAgICAqIHdlIGRvbid0IGdldCBhIGRlZmluZUNsYXNzSW5QYWNrYWdlIHNlY3VyaXR5IGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBzdGF0aWMgeworICAgICAgICBKc3BGYWN0b3J5SW1wbCBmYWN0b3J5ID0gbmV3IEpzcEZhY3RvcnlJbXBsKCk7CisgICAgICAgIFNlY3VyaXR5Q2xhc3NMb2FkLnNlY3VyaXR5Q2xhc3NMb2FkKGZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgSnNwRmFjdG9yeS5zZXREZWZhdWx0RmFjdG9yeShmYWN0b3J5KTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIEpzcFJ1bnRpbWVDb250ZXh0IGZvciBhIHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0LgorICAgICAqCisgICAgICogTG9hZHMgaW4gYW55IHByZXZpb3VzbHkgZ2VuZXJhdGVkIGRlcGVuZGVuY2llcyBmcm9tIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTZXJ2bGV0Q29udGV4dCBmb3Igd2ViIGFwcGxpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIEpzcFJ1bnRpbWVDb250ZXh0KFNlcnZsZXRDb250ZXh0IGNvbnRleHQsIE9wdGlvbnMgb3B0aW9ucykgeworCisgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisKKyAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyCisgICAgICAgIHBhcmVudENsYXNzTG9hZGVyID0KKyAgICAgICAgICAgIChVUkxDbGFzc0xvYWRlcikgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgaWYgKHBhcmVudENsYXNzTG9hZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmVudENsYXNzTG9hZGVyID0KKyAgICAgICAgICAgICAgICAoVVJMQ2xhc3NMb2FkZXIpdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIH0KKworCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCSAgICBpZiAocGFyZW50Q2xhc3NMb2FkZXIgIT0gbnVsbCkgeworCQlsb2cuZGVidWcoTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5tZXNzYWdlLnBhcmVudF9jbGFzc19sb2FkZXJfaXMiLAorCQkJCQkgICAgICAgcGFyZW50Q2xhc3NMb2FkZXIudG9TdHJpbmcoKSkpOworCSAgICB9IGVsc2UgeworCQlsb2cuZGVidWcoTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5tZXNzYWdlLnBhcmVudF9jbGFzc19sb2FkZXJfaXMiLAorCQkJCQkgICAgICAgIjxub25lPiIpKTsKKwkgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW5pdENsYXNzUGF0aCgpOworCisJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmphc3Blci5zZXJ2bGV0LkpzcENTZXJ2bGV0Q29udGV4dCkgeworCSAgICByZXR1cm47CisJfQorCisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaW5pdFNlY3VyaXR5KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGlzIHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0IGlzIHJ1bm5pbmcgZnJvbSBhCisgICAgICAgIC8vIGRpcmVjdG9yeSwgc3RhcnQgdGhlIGJhY2tncm91bmQgY29tcGlsYXRpb24gdGhyZWFkCisgICAgICAgIFN0cmluZyBhcHBCYXNlID0gY29udGV4dC5nZXRSZWFsUGF0aCgiLyIpOyAgICAgICAgIAorICAgICAgICBpZiAoIW9wdGlvbnMuZ2V0RGV2ZWxvcG1lbnQoKQorICAgICAgICAgICAgICAgICYmIGFwcEJhc2UgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG9wdGlvbnMuZ2V0Q2hlY2tJbnRlcnZhbCgpID4gMCkgeworICAgICAgICAgICAgaWYgKGFwcEJhc2UuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpICkgeworICAgICAgICAgICAgICAgIGFwcEJhc2UgPSBhcHBCYXNlLnN1YnN0cmluZygwLGFwcEJhc2UubGVuZ3RoKCktMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgZGlyZWN0b3J5ID0KKyAgICAgICAgICAgICAgICBhcHBCYXNlLnN1YnN0cmluZyhhcHBCYXNlLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSk7CisgICAgICAgICAgICB0aHJlYWROYW1lID0gdGhyZWFkTmFtZSArICJbIiArIGRpcmVjdG9yeSArICJdIjsKKyAgICAgICAgICAgIHRocmVhZFN0YXJ0KCk7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVGhpcyB3ZWIgYXBwbGljYXRpb25zIFNlcnZsZXRDb250ZXh0CisgICAgICovCisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0OworICAgIHByaXZhdGUgT3B0aW9ucyBvcHRpb25zOworICAgIHByaXZhdGUgVVJMQ2xhc3NMb2FkZXIgcGFyZW50Q2xhc3NMb2FkZXI7CisgICAgcHJpdmF0ZSBQZXJtaXNzaW9uQ29sbGVjdGlvbiBwZXJtaXNzaW9uQ29sbGVjdGlvbjsKKyAgICBwcml2YXRlIENvZGVTb3VyY2UgY29kZVNvdXJjZTsgICAgICAgICAgICAgICAgICAgIAorICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzcGF0aDsKKworICAgIC8qKgorICAgICAqIE1hcHMgSlNQIHBhZ2VzIHRvIHRoZWlyIEpzcFNlcnZsZXRXcmFwcGVyJ3MKKyAgICAgKi8KKyAgICBwcml2YXRlIE1hcCBqc3BzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKCBuZXcgSGFzaE1hcCgpKTsKKyAKKworICAgIC8qKgorICAgICAqIFRoZSBiYWNrZ3JvdW5kIHRocmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFRocmVhZCB0aHJlYWQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFja2dyb3VuZCB0aHJlYWQgY29tcGxldGlvbiBzZW1hcGhvcmUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHRocmVhZERvbmUgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogTmFtZSB0byByZWdpc3RlciBmb3IgdGhlIGJhY2tncm91bmQgdGhyZWFkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHRocmVhZE5hbWUgPSAiSnNwUnVudGltZUNvbnRleHQiOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgSnNwU2VydmxldFdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0ganNwVXJpIEpTUCBVUkkKKyAgICAgKiBAcGFyYW0ganN3IFNlcnZsZXQgd3JhcHBlciBmb3IgSlNQCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkV3JhcHBlcihTdHJpbmcganNwVXJpLCBKc3BTZXJ2bGV0V3JhcHBlciBqc3cpIHsKKyAgICAgICAganNwcy5yZW1vdmUoanNwVXJpKTsKKyAgICAgICAganNwcy5wdXQoanNwVXJpLGpzdyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFuIGFscmVhZHkgZXhpc3RpbmcgSnNwU2VydmxldFdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0ganNwVXJpIEpTUCBVUkkKKyAgICAgKiBAcmV0dXJuIEpzcFNlcnZsZXRXcmFwcGVyIGZvciBKU1AKKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwU2VydmxldFdyYXBwZXIgZ2V0V3JhcHBlcihTdHJpbmcganNwVXJpKSB7CisgICAgICAgIHJldHVybiAoSnNwU2VydmxldFdyYXBwZXIpIGpzcHMuZ2V0KGpzcFVyaSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgIEpzcFNlcnZsZXRXcmFwcGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGpzcFVyaSBKU1AgVVJJIG9mIEpzcFNlcnZsZXRXcmFwcGVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVdyYXBwZXIoU3RyaW5nIGpzcFVyaSkgeworICAgICAgICBqc3BzLnJlbW92ZShqc3BVcmkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBKU1BzIGZvciB3aGljaCBKc3BTZXJ2bGV0V3JhcHBlcnMgZXhpc3QsIGkuZS4sCisgICAgICogdGhlIG51bWJlciBvZiBKU1BzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvIHRoZSB3ZWJhcHAuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgSlNQcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgaW50byB0aGUgd2ViYXBwCisgICAgICovCisgICAgcHVibGljIGludCBnZXRKc3BDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGpzcHMuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgU2VjdXJpdHlNYW5hZ2VyIFBvbGljeSBDb2RlU291cmNlIGZvciB0aGlzIHdlYgorICAgICAqIGFwcGxpY2FpdG9uIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIENvZGVTb3VyY2UgZm9yIEpTUAorICAgICAqLworICAgIHB1YmxpYyBDb2RlU291cmNlIGdldENvZGVTb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBjb2RlU291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGFyZW50IFVSTENsYXNzTG9hZGVyLgorICAgICAqCisgICAgICogQHJldHVybiBVUkxDbGFzc0xvYWRlciBwYXJlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMQ2xhc3NMb2FkZXIgZ2V0UGFyZW50Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnRDbGFzc0xvYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFNlY3VyaXR5TWFuYWdlciBQZXJtaXNzaW9uQ29sbGVjdGlvbiBmb3IgdGhpcworICAgICAqIHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0LgorICAgICAqCisgICAgICogQHJldHVybiBQZXJtaXNzaW9uQ29sbGVjdGlvbiBwZXJtaXNzaW9ucworICAgICAqLworICAgIHB1YmxpYyBQZXJtaXNzaW9uQ29sbGVjdGlvbiBnZXRQZXJtaXNzaW9uQ29sbGVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25Db2xsZWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSAiZGVzdG9yeSIgZXZlbnQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQuCisgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICB0aHJlYWRTdG9wKCk7CisKKyAgICAgICAgSXRlcmF0b3Igc2VydmxldHMgPSBqc3BzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChzZXJ2bGV0cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICgoSnNwU2VydmxldFdyYXBwZXIpIHNlcnZsZXRzLm5leHQoKSkuZGVzdHJveSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5jcmVtZW50cyB0aGUgSlNQIHJlbG9hZCBjb3VudGVyLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBpbmNyZW1lbnRKc3BSZWxvYWRDb3VudCgpIHsKKyAgICAgICAganNwUmVsb2FkQ291bnQrKzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIEpTUCByZWxvYWQgY291bnRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb3VudCBWYWx1ZSB0byB3aGljaCB0byByZXNldCB0aGUgSlNQIHJlbG9hZCBjb3VudGVyCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEpzcFJlbG9hZENvdW50KGludCBjb3VudCkgeworICAgICAgICB0aGlzLmpzcFJlbG9hZENvdW50ID0gY291bnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgSlNQIHJlbG9hZCBjb3VudGVyLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgSlNQIHJlbG9hZCBjb3VudGVyCisgICAgICovCisgICAgcHVibGljIGludCBnZXRKc3BSZWxvYWRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGpzcFJlbG9hZENvdW50OworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgdXNlZCBieSBiYWNrZ3JvdW5kIHRocmVhZCB0byBjaGVjayB0aGUgSlNQIGRlcGVuZGVuY2llcworICAgICAqIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGNsYXNzIGZvciBKU1Ancy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tDb21waWxlKCkgeworICAgICAgICBPYmplY3QgW10gd3JhcHBlcnMgPSBqc3BzLnZhbHVlcygpLnRvQXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3cmFwcGVycy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgIEpzcFNlcnZsZXRXcmFwcGVyIGpzdyA9IChKc3BTZXJ2bGV0V3JhcHBlcil3cmFwcGVyc1tpXTsKKyAgICAgICAgICAgIEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0ID0ganN3LmdldEpzcEVuZ2luZUNvbnRleHQoKTsKKyAgICAgICAgICAgIC8vIEpzcFNlcnZsZXRXcmFwcGVyIGFsc28gc3luY2hyb25pemVzIG9uIHRoaXMgd2hlbgorICAgICAgICAgICAgLy8gaXQgZGV0ZWN0cyBpdCBoYXMgdG8gZG8gYSByZWxvYWQKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChqc3cpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjdHh0LmNvbXBpbGUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY3R4dC5pbmNyZW1lbnRSZW1vdmVkKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAganN3LmdldFNlcnZsZXRDb250ZXh0KCkubG9nKCJCYWNrZ3JvdW5kIGNvbXBpbGUgZmFpbGVkIiwKKwkJCQkJCXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzc3BhdGggdGhhdCBpcyBwYXNzZWQgb2ZmIHRvIHRoZSBKYXZhIGNvbXBpbGVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NQYXRoKCkgeworICAgICAgICByZXR1cm4gY2xhc3NwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCB1c2VkIHRvIGluaXRpYWxpemUgY2xhc3NwYXRoIGZvciBjb21waWxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdENsYXNzUGF0aCgpIHsKKworICAgICAgICBVUkwgW10gdXJscyA9IHBhcmVudENsYXNzTG9hZGVyLmdldFVSTHMoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGNwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmcgc2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJwYXRoLnNlcGFyYXRvciIpOworCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAvLyBUb21jYXQgNCBjYW4gdXNlIFVSTCdzIG90aGVyIHRoYW4gZmlsZSBVUkwncywKKyAgICAgICAgICAgIC8vIGEgcHJvdG9jb2wgb3RoZXIgdGhhbiBmaWxlOiB3aWxsIGdlbmVyYXRlIGEKKyAgICAgICAgICAgIC8vIGJhZCBmaWxlIHN5c3RlbSBwYXRoLCBzbyBvbmx5IGFkZCBmaWxlOgorICAgICAgICAgICAgLy8gcHJvdG9jb2wgVVJMJ3MgdG8gdGhlIGNsYXNzcGF0aC4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoIHVybHNbaV0uZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSApIHsKKyAgICAgICAgICAgICAgICBjcGF0aC5hcHBlbmQoKFN0cmluZyl1cmxzW2ldLmdldEZpbGUoKStzZXApOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgIAorCisJY3BhdGguYXBwZW5kKG9wdGlvbnMuZ2V0U2NyYXRjaERpcigpICsgc2VwKTsKKworICAgICAgICBTdHJpbmcgY3AgPSAoU3RyaW5nKSBjb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVkxFVF9DTEFTU1BBVEgpOworICAgICAgICBpZiAoY3AgPT0gbnVsbCB8fCBjcC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBjcCA9IG9wdGlvbnMuZ2V0Q2xhc3NQYXRoKCk7CisgICAgICAgIH0KKworICAgICAgICBjbGFzc3BhdGggPSBjcGF0aC50b1N0cmluZygpICsgY3A7CisKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29tcGlsYXRpb24gY2xhc3NwYXRoIGluaXRpYWxpemVkOiAiICsgZ2V0Q2xhc3NQYXRoKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIHVzZWQgdG8gaW5pdGlhbGl6ZSBTZWN1cml0eU1hbmFnZXIgZGF0YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdFNlY3VyaXR5KCkgeworCisgICAgICAgIC8vIFNldHVwIHRoZSBQZXJtaXNzaW9uQ29sbGVjdGlvbiBmb3IgdGhpcyB3ZWIgYXBwIGNvbnRleHQKKyAgICAgICAgLy8gYmFzZWQgb24gdGhlIHBlcm1pc3Npb25zIGNvbmZpZ3VyZWQgZm9yIHRoZSByb290IG9mIHRoZQorICAgICAgICAvLyB3ZWIgYXBwIGNvbnRleHQgZGlyZWN0b3J5LCB0aGVuIGFkZCBhIGZpbGUgcmVhZCBwZXJtaXNzaW9uCisgICAgICAgIC8vIGZvciB0aGF0IGRpcmVjdG9yeS4KKyAgICAgICAgUG9saWN5IHBvbGljeSA9IFBvbGljeS5nZXRQb2xpY3koKTsKKyAgICAgICAgaWYoIHBvbGljeSAhPSBudWxsICkgeworICAgICAgICAgICAgdHJ5IHsgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHdlYiBhcHAgY29udGV4dAorICAgICAgICAgICAgICAgIFN0cmluZyBkb2NCYXNlID0gY29udGV4dC5nZXRSZWFsUGF0aCgiLyIpOworICAgICAgICAgICAgICAgIGlmKCBkb2NCYXNlID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIGRvY0Jhc2UgPSBvcHRpb25zLmdldFNjcmF0Y2hEaXIoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgY29kZUJhc2UgPSBkb2NCYXNlOworICAgICAgICAgICAgICAgIGlmICghY29kZUJhc2UuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKXsKKyAgICAgICAgICAgICAgICAgICAgY29kZUJhc2UgPSBjb2RlQmFzZSArIEZpbGUuc2VwYXJhdG9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGaWxlIGNvbnRleHREaXIgPSBuZXcgRmlsZShjb2RlQmFzZSk7CisgICAgICAgICAgICAgICAgVVJMIHVybCA9IGNvbnRleHREaXIuZ2V0Q2Fub25pY2FsRmlsZSgpLnRvVVJMKCk7CisgICAgICAgICAgICAgICAgY29kZVNvdXJjZSA9IG5ldyBDb2RlU291cmNlKHVybCwoQ2VydGlmaWNhdGVbXSludWxsKTsKKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9uQ29sbGVjdGlvbiA9IHBvbGljeS5nZXRQZXJtaXNzaW9ucyhjb2RlU291cmNlKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGZpbGUgcmVhZCBwZXJtaXNzaW9uIGZvciB3ZWIgYXBwIGNvbnRleHQgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgaWYgKCFkb2NCYXNlLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSl7CisgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25Db2xsZWN0aW9uLmFkZAorICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBGaWxlUGVybWlzc2lvbihkb2NCYXNlLCJyZWFkIikpOworICAgICAgICAgICAgICAgICAgICBkb2NCYXNlID0gZG9jQmFzZSArIEZpbGUuc2VwYXJhdG9yOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25Db2xsZWN0aW9uLmFkZAorICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBGaWxlUGVybWlzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb2NCYXNlLnN1YnN0cmluZygwLGRvY0Jhc2UubGVuZ3RoKCkgLSAxKSwicmVhZCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZG9jQmFzZSA9IGRvY0Jhc2UgKyAiLSI7CisgICAgICAgICAgICAgICAgcGVybWlzc2lvbkNvbGxlY3Rpb24uYWRkKG5ldyBGaWxlUGVybWlzc2lvbihkb2NCYXNlLCJyZWFkIikpOworCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgZmlsZSByZWFkIHBlcm1pc3Npb24gZm9yIHdlYiBhcHAgdGVtcGRpciAod29yaykKKyAgICAgICAgICAgICAgICAvLyBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICBTdHJpbmcgd29ya0RpciA9IG9wdGlvbnMuZ2V0U2NyYXRjaERpcigpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKCF3b3JrRGlyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSl7CisgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25Db2xsZWN0aW9uLmFkZAorICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBGaWxlUGVybWlzc2lvbih3b3JrRGlyLCJyZWFkIikpOworICAgICAgICAgICAgICAgICAgICB3b3JrRGlyID0gd29ya0RpciArIEZpbGUuc2VwYXJhdG9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3b3JrRGlyID0gd29ya0RpciArICItIjsKKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9uQ29sbGVjdGlvbi5hZGQobmV3IEZpbGVQZXJtaXNzaW9uKHdvcmtEaXIsInJlYWQiKSk7CisKKyAgICAgICAgICAgICAgICAvLyBBbGxvdyB0aGUgSlNQIHRvIGFjY2VzcyBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkh0dHBKc3BCYXNlCisgICAgICAgICAgICAgICAgcGVybWlzc2lvbkNvbGxlY3Rpb24uYWRkKCBuZXcgUnVudGltZVBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgICAgICJhY2Nlc3NDbGFzc0luUGFja2FnZS5vcmcuYXBhY2hlLmphc3Blci5ydW50aW1lIikgKTsKKworICAgICAgICAgICAgICAgIGlmIChwYXJlbnRDbGFzc0xvYWRlciBpbnN0YW5jZW9mIFVSTENsYXNzTG9hZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIFVSTCBbXSB1cmxzID0gcGFyZW50Q2xhc3NMb2FkZXIuZ2V0VVJMcygpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgamFyVXJsID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGpuZGlVcmwgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dXJscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpuZGlVcmwgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB1cmxzW2ldLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiam5kaToiKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbmRpVXJsID0gdXJsc1tpXS50b1N0cmluZygpICsgIi0iOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGphclVybCA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHVybHNbaV0udG9TdHJpbmcoKS5zdGFydHNXaXRoKCJqYXI6am5kaToiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXJVcmwgPSB1cmxzW2ldLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFyVXJsID0gamFyVXJsLnN1YnN0cmluZygwLGphclVybC5sZW5ndGgoKSAtIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphclVybCA9IGphclVybC5zdWJzdHJpbmcoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXJVcmwubGFzdEluZGV4T2YoJy8nKSkgKyAiLy0iOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChqYXJVcmwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbkNvbGxlY3Rpb24uYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZVBlcm1pc3Npb24oamFyVXJsLCJyZWFkIikpOworICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbkNvbGxlY3Rpb24uYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZVBlcm1pc3Npb24oamFyVXJsLnN1YnN0cmluZyg0KSwicmVhZCIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoam5kaVVybCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbkNvbGxlY3Rpb24uYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZVBlcm1pc3Npb24oam5kaVVybCwicmVhZCIpICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQubG9nKCJTZWN1cml0eSBJbml0IGZvciBjb250ZXh0IGZhaWxlZCIsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRocmVhZCBTdXBwb3J0CisKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGUgYmFja2dyb3VuZCB0aHJlYWQgdGhhdCB3aWxsIHBlcmlvZGljYWxseSBjaGVjayBmb3IKKyAgICAgKiBjaGFuZ2VzIHRvIGNvbXBpbGUgdGltZSBpbmNsdWRlZCBmaWxlcyBpbiBhIEpTUC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHdlIHNob3VsZCBub3QgYmUgc3RhcnRpbmcKKyAgICAgKiAgYSBiYWNrZ3JvdW5kIHRocmVhZCBub3cKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0aHJlYWRTdGFydCgpIHsKKworICAgICAgICAvLyBIYXMgdGhlIGJhY2tncm91bmQgdGhyZWFkIGFscmVhZHkgYmVlbiBzdGFydGVkPworICAgICAgICBpZiAodGhyZWFkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHRocmVhZAorICAgICAgICB0aHJlYWREb25lID0gZmFsc2U7CisgICAgICAgIHRocmVhZCA9IG5ldyBUaHJlYWQodGhpcywgdGhyZWFkTmFtZSk7CisgICAgICAgIHRocmVhZC5zZXREYWVtb24odHJ1ZSk7CisgICAgICAgIHRocmVhZC5zdGFydCgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBiYWNrZ3JvdW5kIHRocmVhZCB0aGF0IGlzIHBlcmlvZGljYWxseSBjaGVja2luZyBmb3IKKyAgICAgKiBjaGFuZ2VzIHRvIGNvbXBpbGUgdGltZSBpbmNsdWRlZCBmaWxlcyBpbiBhIEpTUC4KKyAgICAgKi8gCisgICAgcHJvdGVjdGVkIHZvaWQgdGhyZWFkU3RvcCgpIHsKKworICAgICAgICBpZiAodGhyZWFkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRocmVhZERvbmUgPSB0cnVlOworICAgICAgICB0aHJlYWQuaW50ZXJydXB0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aHJlYWQuam9pbigpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRocmVhZCA9IG51bGw7CisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIFNsZWVwIGZvciB0aGUgZHVyYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT5jaGVja0ludGVydmFsPC9jb2RlPgorICAgICAqIHByb3BlcnR5LgorICAgICAqLyAKKyAgICBwcm90ZWN0ZWQgdm9pZCB0aHJlYWRTbGVlcCgpIHsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAob3B0aW9ucy5nZXRDaGVja0ludGVydmFsKCkgKiAxMDAwTCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9ICAgCisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJhY2tncm91bmQgVGhyZWFkCisgICAgICAgIAorICAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgYmFja2dyb3VuZCB0aHJlYWQgdGhhdCBjaGVja3MgZm9yIGNoYW5nZXMgdG8gZmlsZXMKKyAgICAgKiBpbmNsdWRlZCBieSBhIEpTUCBhbmQgZmxhZ3MgdGhhdCBhIHJlY29tcGlsZSBpcyByZXF1aXJlZC4KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAKKyAgICAgICAgLy8gTG9vcCB1bnRpbCB0aGUgdGVybWluYXRpb24gc2VtYXBob3JlIGlzIHNldAorICAgICAgICB3aGlsZSAoIXRocmVhZERvbmUpIHsKKworICAgICAgICAgICAgLy8gV2FpdCBmb3Igb3VyIGNoZWNrIGludGVydmFsCisgICAgICAgICAgICB0aHJlYWRTbGVlcCgpOworCisgICAgICAgICAgICAvLyBDaGVjayBmb3IgaW5jbHVkZWQgZmlsZXMgd2hpY2ggYXJlIG5ld2VyIHRoYW4gdGhlCisgICAgICAgICAgICAvLyBKU1Agd2hpY2ggdXNlcyB0aGVtLgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjaGVja0NvbXBpbGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFeGNlcHRpb24gY2hlY2tpbmcgaWYgcmVjb21waWxlIG5lZWRlZDogIiwgdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0pzcFV0aWwuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSnNwVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMDk3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0pzcFV0aWwuamF2YQpAQCAtMCwwICsxLDExMDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5lbC5FTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5lbC5FTFBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLmVsLkZ1bmN0aW9uTWFwcGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmVsLkV4cHJlc3Npb25FdmFsdWF0b3JJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSnNwQ29tcGlsYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CisKKy8qKiAKKyAqIFRoaXMgY2xhc3MgaGFzIGFsbCB0aGUgdXRpbGl0eSBtZXRob2QocykuCisgKiBJZGVhbGx5IHNob3VsZCBtb3ZlIGFsbCB0aGUgYmVhbiBjb250YWluZXJzIGhlcmUuCisgKgorICogQGF1dGhvciBNYW5kYXIgUmFqZS4KKyAqIEBhdXRob3IgUmFqaXYgTW9yZGFuaS4KKyAqIEBhdXRob3IgRGFubm8gRmVycmluCisgKiBAYXV0aG9yIFBpZXJyZSBEZWxpc2xlCisgKiBAYXV0aG9yIFNoYXduIEJheWVybgorICogQGF1dGhvciBNYXJrIFJvdGgKKyAqLworcHVibGljIGNsYXNzIEpzcFV0aWwgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTkZfVEFHUyA9ICIvV0VCLUlORi90YWdzLyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFfSU5GX1RBR1MgPSAiL01FVEEtSU5GL3RhZ3MvIjsKKworICAgIC8vIERlbGltaXRlcnMgZm9yIHJlcXVlc3QtdGltZSBleHByZXNzaW9ucyAoSlNQIGFuZCBYTUwgc3ludGF4KQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0VYUFIgID0gIjwlPSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMT1NFX0VYUFIgPSAiJT4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0VYUFJfWE1MICA9ICIlPSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMT1NFX0VYUFJfWE1MID0gIiUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHRlbXBTZXF1ZW5jZU51bWJlciA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgRXhwcmVzc2lvbkV2YWx1YXRvckltcGwgZXhwcmVzc2lvbkV2YWx1YXRvcgorCT0gbmV3IEV4cHJlc3Npb25FdmFsdWF0b3JJbXBsKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgamF2YUtleXdvcmRzW10gPSB7CisgICAgICAgICJhYnN0cmFjdCIsICJhc3NlcnQiLCAiYm9vbGVhbiIsICJicmVhayIsICJieXRlIiwgImNhc2UiLAorICAgICAgICAiY2F0Y2giLCAiY2hhciIsICJjbGFzcyIsICJjb25zdCIsICJjb250aW51ZSIsCisgICAgICAgICJkZWZhdWx0IiwgImRvIiwgImRvdWJsZSIsICJlbHNlIiwgImVudW0iLCAiZXh0ZW5kcyIsCisgICAgICAgICJmaW5hbCIsICJmaW5hbGx5IiwgImZsb2F0IiwgImZvciIsICJnb3RvIiwKKyAgICAgICAgImlmIiwgImltcGxlbWVudHMiLCAiaW1wb3J0IiwgImluc3RhbmNlb2YiLCAiaW50IiwKKyAgICAgICAgImludGVyZmFjZSIsICJsb25nIiwgIm5hdGl2ZSIsICJuZXciLCAicGFja2FnZSIsCisgICAgICAgICJwcml2YXRlIiwgInByb3RlY3RlZCIsICJwdWJsaWMiLCAicmV0dXJuIiwgInNob3J0IiwKKyAgICAgICAgInN0YXRpYyIsICJzdHJpY3RmcCIsICJzdXBlciIsICJzd2l0Y2giLCAic3luY2hyb25pemVkIiwKKyAgICAgICAgInRoaXMiLCAidGhyb3dzIiwgInRyYW5zaWVudCIsICJ0cnkiLCAidm9pZCIsCisgICAgICAgICJ2b2xhdGlsZSIsICJ3aGlsZSIgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LU0laRSA9IDEwMjQ7CisgICAgICAgIAorICAgIHB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZVF1b3RlcyhjaGFyIFtdY2hhcnMpIHsKKyAgICAgICAgQ2hhckFycmF5V3JpdGVyIGNhdyA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNoYXJzW2ldID09ICclJyAmJiBjaGFyc1tpKzFdID09ICdcXCcgJiYKKyAgICAgICAgICAgICAgICBjaGFyc1tpKzJdID09ICc+JykgeworICAgICAgICAgICAgICAgIGNhdy53cml0ZSgnJScpOworICAgICAgICAgICAgICAgIGNhdy53cml0ZSgnPicpOworICAgICAgICAgICAgICAgIGkgPSBpICsgMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2F3LndyaXRlKGNoYXJzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2F3LnRvQ2hhckFycmF5KCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjaGFyW10gZXNjYXBlUXVvdGVzIChjaGFyIFtdY2hhcnMpIHsKKyAgICAgICAgLy8gUHJlc2NhbiB0byBjb252ZXJ0ICVcPiB0byAlPgorICAgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcoY2hhcnMpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IG4gPSBzLmluZGV4T2YoIiVcXD4iKTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIocy5zdWJzdHJpbmcoMCwgbikpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIlPiIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHMuc3Vic3RyaW5nKG4gKyAzKSk7CisgICAgICAgICAgICBzID0gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBjaGFycyA9IHMudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgcmV0dXJuIChjaGFycyk7CisKKworICAgICAgICAvLyBFc2NhcGUgYWxsIGJhY2tzbGFzaGVzIG5vdCBpbnNpZGUgYSBKYXZhIHN0cmluZyBsaXRlcmFsCisgICAgICAgIC8qCisgICAgICAgIENoYXJBcnJheVdyaXRlciBjYXcgPSBuZXcgQ2hhckFycmF5V3JpdGVyKCk7CisgICAgICAgIGJvb2xlYW4gaW5KYXZhU3RyaW5nID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjaGFyc1tpXSA9PSAnIicpIGluSmF2YVN0cmluZyA9ICFpbkphdmFTdHJpbmc7CisgICAgICAgICAgICAvLyBlc2NhcGUgb3V0IHRoZSBlc2NhcGUgY2hhcmFjdGVyCisgICAgICAgICAgICBpZiAoIWluSmF2YVN0cmluZyAmJiAoY2hhcnNbaV0gPT0gJ1xcJykpIGNhdy53cml0ZSgnXFwnKTsKKyAgICAgICAgICAgIGNhdy53cml0ZShjaGFyc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNhdy50b0NoYXJBcnJheSgpOworICAgICAgICAqLworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgdG9rZW4gaXMgYSBydW50aW1lIGV4cHJlc3Npb24uCisgICAgICogSW4gc3RhbmRhcmQgSlNQIHN5bnRheCwgYSBydW50aW1lIGV4cHJlc3Npb24gc3RhcnRzIHdpdGggJzwlJyBhbmQKKyAgICAgKiBlbmRzIHdpdGggJyU+Jy4gV2hlbiB0aGUgSlNQIGRvY3VtZW50IGlzIGluIFhNTCBzeW50YXgsIGEgcnVudGltZQorICAgICAqIGV4cHJlc3Npb24gc3RhcnRzIHdpdGggJyU9JyBhbmQgZW5kcyB3aXRoICclJy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b2tlbiBUaGUgdG9rZW4gdG8gYmUgY2hlY2tlZAorICAgICAqIHJldHVybiB3aGV0aGVyIHRoZSB0b2tlbiBpcyBhIHJ1bnRpbWUgZXhwcmVzc2lvbiBvciBub3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXhwcmVzc2lvbihTdHJpbmcgdG9rZW4sIGJvb2xlYW4gaXNYbWwpIHsKKwlTdHJpbmcgb3BlbkV4cHI7CisJU3RyaW5nIGNsb3NlRXhwcjsKKwlpZiAoaXNYbWwpIHsKKwkgICAgb3BlbkV4cHIgPSBPUEVOX0VYUFJfWE1MOworCSAgICBjbG9zZUV4cHIgPSBDTE9TRV9FWFBSX1hNTDsKKwl9IGVsc2UgeworCSAgICBvcGVuRXhwciA9IE9QRU5fRVhQUjsKKwkgICAgY2xvc2VFeHByID0gQ0xPU0VfRVhQUjsKKwl9CisJaWYgKHRva2VuLnN0YXJ0c1dpdGgob3BlbkV4cHIpICYmIHRva2VuLmVuZHNXaXRoKGNsb3NlRXhwcikpIHsKKwkgICAgcmV0dXJuIHRydWU7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSAiZXhwcmVzc2lvbiIgcGFydCBvZiBhIHJ1bnRpbWUgZXhwcmVzc2lvbiwgCisgICAgICogdGFraW5nIHRoZSBkZWxpbWl0ZXJzIG91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHByIChTdHJpbmcgZXhwcmVzc2lvbiwgYm9vbGVhbiBpc1htbCkgeworCVN0cmluZyByZXR1cm5TdHJpbmc7CisJU3RyaW5nIG9wZW5FeHByOworCVN0cmluZyBjbG9zZUV4cHI7CisJaWYgKGlzWG1sKSB7CisJICAgIG9wZW5FeHByID0gT1BFTl9FWFBSX1hNTDsKKwkgICAgY2xvc2VFeHByID0gQ0xPU0VfRVhQUl9YTUw7CisJfSBlbHNlIHsKKwkgICAgb3BlbkV4cHIgPSBPUEVOX0VYUFI7CisJICAgIGNsb3NlRXhwciA9IENMT1NFX0VYUFI7CisJfQorCWludCBsZW5ndGggPSBleHByZXNzaW9uLmxlbmd0aCgpOworCWlmIChleHByZXNzaW9uLnN0YXJ0c1dpdGgob3BlbkV4cHIpICYmIAorICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uZW5kc1dpdGgoY2xvc2VFeHByKSkgeworCSAgICByZXR1cm5TdHJpbmcgPSBleHByZXNzaW9uLnN1YnN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuRXhwci5sZW5ndGgoKSwgbGVuZ3RoIC0gY2xvc2VFeHByLmxlbmd0aCgpKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm5TdHJpbmcgPSAiIjsKKwl9CisJcmV0dXJuIHJldHVyblN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWtlcyBhIHBvdGVudGlhbCBleHByZXNzaW9uIGFuZCBjb252ZXJ0cyBpdCBpbnRvIFhNTCBmb3JtCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXhwckluWG1sKFN0cmluZyBleHByZXNzaW9uKSB7CisgICAgICAgIFN0cmluZyByZXR1cm5TdHJpbmc7CisgICAgICAgIGludCBsZW5ndGggPSBleHByZXNzaW9uLmxlbmd0aCgpOworCisgICAgICAgIGlmIChleHByZXNzaW9uLnN0YXJ0c1dpdGgoT1BFTl9FWFBSKSAKKyAgICAgICAgICAgICAgICAmJiBleHByZXNzaW9uLmVuZHNXaXRoKENMT1NFX0VYUFIpKSB7CisgICAgICAgICAgICByZXR1cm5TdHJpbmcgPSBleHByZXNzaW9uLnN1YnN0cmluZyAoMSwgbGVuZ3RoIC0gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm5TdHJpbmcgPSBleHByZXNzaW9uOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVzY2FwZVhtbChyZXR1cm5TdHJpbmcucmVwbGFjZShDb25zdGFudHMuSEFDS19DSEFSLCAnJCcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBzY29wZSBpcyB2YWxpZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgdG8gYmUgY2hlY2tlZAorICAgICAqIEBwYXJhbSBuIFRoZSBOb2RlIGNvbnRhaW5pbmcgdGhlICdzY29wZScgYXR0cmlidXRlIHdob3NlIHZhbHVlIGlzIHRvIGJlCisgICAgICogY2hlY2tlZAorICAgICAqIEBwYXJhbSBlcnIgZXJyb3IgZGlzcGF0Y2hlcgorICAgICAqCisgICAgICogQHRocm93cyBKYXNwZXJFeGNlcHRpb24gaWYgc2NvcGUgaXMgbm90IG51bGwgYW5kIGRpZmZlcmVudCBmcm9tCisgICAgICogJnF1b3Q7cGFnZSZxdW90OywgJnF1b3Q7cmVxdWVzdCZxdW90OywgJnF1b3Q7c2Vzc2lvbiZxdW90OywgYW5kCisgICAgICogJnF1b3Q7YXBwbGljYXRpb24mcXVvdDsKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tTY29wZShTdHJpbmcgc2NvcGUsIE5vZGUgbiwgRXJyb3JEaXNwYXRjaGVyIGVycikKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCWlmIChzY29wZSAhPSBudWxsICYmICFzY29wZS5lcXVhbHMoInBhZ2UiKSAmJiAhc2NvcGUuZXF1YWxzKCJyZXF1ZXN0IikKKwkJJiYgIXNjb3BlLmVxdWFscygic2Vzc2lvbiIpICYmICFzY29wZS5lcXVhbHMoImFwcGxpY2F0aW9uIikpIHsKKwkgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuaW52YWxpZC5zY29wZSIsIHNjb3BlKTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGFsbCBtYW5kYXRvcnkgYXR0cmlidXRlcyBhcmUgcHJlc2VudCBhbmQgaWYgYWxsIGF0dHJpYnV0ZXMKKyAgICAgKiBwcmVzZW50IGhhdmUgdmFsaWQgbmFtZXMuICBDaGVja3MgYXR0cmlidXRlcyBzcGVjaWZpZWQgYXMgWE1MLXN0eWxlCisgICAgICogYXR0cmlidXRlcyBhcyB3ZWxsIGFzIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIHVzaW5nIHRoZSBqc3A6YXR0cmlidXRlCisgICAgICogc3RhbmRhcmQgYWN0aW9uLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tBdHRyaWJ1dGVzKFN0cmluZyB0eXBlT2ZUYWcsCisJCQkJICAgICAgIE5vZGUgbiwKKwkJCQkgICAgICAgVmFsaWRBdHRyaWJ1dGVbXSB2YWxpZEF0dHJpYnV0ZXMsCisJCQkJICAgICAgIEVycm9yRGlzcGF0Y2hlciBlcnIpCisJCQkJdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBuLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgTWFyayBzdGFydCA9IG4uZ2V0U3RhcnQoKTsKKwlib29sZWFuIHZhbGlkID0gdHJ1ZTsKKworICAgICAgICAvLyBBdHRyaWJ1dGVzSW1wbC5yZW1vdmVBdHRyaWJ1dGUgaXMgYnJva2VuLCBzbyB3ZSBkbyB0aGlzLi4uCisgICAgICAgIGludCB0ZW1wTGVuZ3RoID0gKGF0dHJzID09IG51bGwpID8gMCA6IGF0dHJzLmdldExlbmd0aCgpOworCVZlY3RvciB0ZW1wID0gbmV3IFZlY3Rvcih0ZW1wTGVuZ3RoLCAxKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBxTmFtZSA9IGF0dHJzLmdldFFOYW1lKGkpOworICAgICAgICAgICAgaWYgKCghcU5hbWUuZXF1YWxzKCJ4bWxucyIpKSAmJiAoIXFOYW1lLnN0YXJ0c1dpdGgoInhtbG5zOiIpKSkKKyAgICAgICAgICAgICAgICB0ZW1wLmFkZEVsZW1lbnQocU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIG5hbWVzIG9mIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIHVzaW5nIGpzcDphdHRyaWJ1dGUKKyAgICAgICAgTm9kZS5Ob2RlcyB0YWdCb2R5ID0gbi5nZXRCb2R5KCk7CisgICAgICAgIGlmKCB0YWdCb2R5ICE9IG51bGwgKSB7CisgICAgICAgICAgICBpbnQgbnVtU3ViRWxlbWVudHMgPSB0YWdCb2R5LnNpemUoKTsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbnVtU3ViRWxlbWVudHM7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSB0YWdCb2R5LmdldE5vZGUoIGkgKTsKKyAgICAgICAgICAgICAgICBpZiggbm9kZSBpbnN0YW5jZW9mIE5vZGUuTmFtZWRBdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlVmFsdWUoICJuYW1lIiApOworICAgICAgICAgICAgICAgICAgICB0ZW1wLmFkZEVsZW1lbnQoIGF0dHJOYW1lICk7CisJCSAgICAvLyBDaGVjayBpZiB0aGlzIHZhbHVlIGFwcGVhciBpbiB0aGUgYXR0cmlidXRlIG9mIHRoZSBub2RlCisJCSAgICBpZiAobi5nZXRBdHRyaWJ1dGVWYWx1ZShhdHRyTmFtZSkgIT0gbnVsbCkgeworCQkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuZHVwbGljYXRlLm5hbWUuanNwYXR0cmlidXRlIiwKKwkJCQkJYXR0ck5hbWUpOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyBjYW4gY29tZSBiZWZvcmUganNwOmF0dHJpYnV0ZSwgYW5kIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgLy8ganNwOmJvZHkgY2FuIGNvbWUgYWZ0ZXIgaXQuCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJLyoKKwkgKiBGaXJzdCBjaGVjayB0byBzZWUgaWYgYWxsIHRoZSBtYW5kYXRvcnkgYXR0cmlidXRlcyBhcmUgcHJlc2VudC4KKwkgKiBJZiBzbyBvbmx5IHRoZW4gcHJvY2VlZCB0byBzZWUgaWYgdGhlIG90aGVyIGF0dHJpYnV0ZXMgYXJlIHZhbGlkCisJICogZm9yIHRoZSBwYXJ0aWN1bGFyIHRhZy4KKwkgKi8KKwlTdHJpbmcgbWlzc2luZ0F0dHJpYnV0ZSA9IG51bGw7CisKKwlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkQXR0cmlidXRlcy5sZW5ndGg7IGkrKykgeworCSAgICBpbnQgYXR0clBvczsgICAgCisJICAgIGlmICh2YWxpZEF0dHJpYnV0ZXNbaV0ubWFuZGF0b3J5KSB7CisgICAgICAgICAgICAgICAgYXR0clBvcyA9IHRlbXAuaW5kZXhPZih2YWxpZEF0dHJpYnV0ZXNbaV0ubmFtZSk7CisJCWlmIChhdHRyUG9zICE9IC0xKSB7CisJCSAgICB0ZW1wLnJlbW92ZShhdHRyUG9zKTsKKwkJICAgIHZhbGlkID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJICAgIHZhbGlkID0gZmFsc2U7CisJCSAgICBtaXNzaW5nQXR0cmlidXRlID0gdmFsaWRBdHRyaWJ1dGVzW2ldLm5hbWU7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJfQorCisJLy8gSWYgbWFuZGF0b3J5IGF0dHJpYnV0ZSBpcyBtaXNzaW5nIHRoZW4gdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24KKwlpZiAoIXZhbGlkKQorCSAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IubWFuZGF0b3J5LmF0dHJpYnV0ZSIsIHR5cGVPZlRhZywKKwkJCSBtaXNzaW5nQXR0cmlidXRlKTsKKworCS8vIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IG1vcmUgYXR0cmlidXRlcyBmb3IgdGhlIHNwZWNpZmllZCB0YWcuCisgICAgICAgIGludCBhdHRyTGVmdExlbmd0aCA9IHRlbXAuc2l6ZSgpOworCWlmIChhdHRyTGVmdExlbmd0aCA9PSAwKQorCSAgICByZXR1cm47CisKKwkvLyBOb3cgY2hlY2sgdG8gc2VlIGlmIHRoZSByZXN0IG9mIHRoZSBhdHRyaWJ1dGVzIGFyZSB2YWxpZCB0b28uCisJU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisKKwlmb3IgKGludCBqID0gMDsgaiA8IGF0dHJMZWZ0TGVuZ3RoOyBqKyspIHsKKwkgICAgdmFsaWQgPSBmYWxzZTsKKwkgICAgYXR0cmlidXRlID0gKFN0cmluZykgdGVtcC5lbGVtZW50QXQoaik7CisJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7CisJCWlmIChhdHRyaWJ1dGUuZXF1YWxzKHZhbGlkQXR0cmlidXRlc1tpXS5uYW1lKSkgeworCQkgICAgdmFsaWQgPSB0cnVlOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgICBpZiAoIXZhbGlkKQorCQllcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IuaW52YWxpZC5hdHRyaWJ1dGUiLCB0eXBlT2ZUYWcsCisJCQkgICAgIGF0dHJpYnV0ZSk7CisJfQorCS8vIFhYWCAqY291bGQqIG1vdmUgRUwtc3ludGF4IHZhbGlkYXRpb24gaGVyZS4uLiAoc2IpCisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZVF1ZXJ5U3RyaW5nKFN0cmluZyB1bmVzY1N0cmluZykgeworCWlmICggdW5lc2NTdHJpbmcgPT0gbnVsbCApCisJICAgIHJldHVybiBudWxsOworCQorCVN0cmluZyBlc2NTdHJpbmcgICAgPSAiIjsKKwlTdHJpbmcgc2hlbGxTcENoYXJzID0gIlxcXCIiOworCQorCWZvcihpbnQgaW5kZXg9MDsgaW5kZXg8dW5lc2NTdHJpbmcubGVuZ3RoKCk7IGluZGV4KyspIHsKKwkgICAgY2hhciBuZXh0Q2hhciA9IHVuZXNjU3RyaW5nLmNoYXJBdChpbmRleCk7CisJICAgIAorCSAgICBpZiggc2hlbGxTcENoYXJzLmluZGV4T2YobmV4dENoYXIpICE9IC0xICkKKwkJZXNjU3RyaW5nICs9ICJcXCI7CisJICAgIAorCSAgICBlc2NTdHJpbmcgKz0gbmV4dENoYXI7CisJfQorCXJldHVybiBlc2NTdHJpbmc7CisgICAgfQorIAorICAgIC8qKgorICAgICAqICBFc2NhcGUgdGhlIDUgZW50aXRpZXMgZGVmaW5lZCBieSBYTUwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlWG1sKFN0cmluZyBzKSB7CisgICAgICAgIGlmIChzID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPHMubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoYyA9PSAnPCcpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiZsdDsiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnPicpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiZndDsiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXCcnKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImYXBvczsiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnJicpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiZhbXA7Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyInKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImcXVvdDsiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2VzIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgY2hhcmFjdGVyIDx0dD5yZXBsYWNlPC90dD4gd2l0aCB0aGUKKyAgICAgKiBzdHJpbmcgPHR0PndpdGg8L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlKFN0cmluZyBuYW1lLCBjaGFyIHJlcGxhY2UsIFN0cmluZyB3aXRoKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlpbnQgYmVnaW4gPSAwOworCWludCBlbmQ7CisJaW50IGxhc3QgPSBuYW1lLmxlbmd0aCgpOworCisJd2hpbGUgKHRydWUpIHsKKwkgICAgZW5kID0gbmFtZS5pbmRleE9mKHJlcGxhY2UsIGJlZ2luKTsKKwkgICAgaWYgKGVuZCA8IDApIHsKKwkJZW5kID0gbGFzdDsKKwkgICAgfQorCSAgICBidWYuYXBwZW5kKG5hbWUuc3Vic3RyaW5nKGJlZ2luLCBlbmQpKTsKKwkgICAgaWYgKGVuZCA9PSBsYXN0KSB7CisJCWJyZWFrOworCSAgICB9CisJICAgIGJ1Zi5hcHBlbmQod2l0aCk7CisJICAgIGJlZ2luID0gZW5kICsgMTsKKwl9CisJCisJcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRBdHRyaWJ1dGUgeworCVN0cmluZyBuYW1lOworCWJvb2xlYW4gbWFuZGF0b3J5OworCWJvb2xlYW4gcnRleHBydmFsdWU7CS8vIG5vdCB1c2VkIG5vdworCisJcHVibGljIFZhbGlkQXR0cmlidXRlIChTdHJpbmcgbmFtZSwgYm9vbGVhbiBtYW5kYXRvcnksCisgICAgICAgICAgICBib29sZWFuIHJ0ZXhwcnZhbHVlICkKKyAgICAgICAgeworCSAgICB0aGlzLm5hbWUgPSBuYW1lOworCSAgICB0aGlzLm1hbmRhdG9yeSA9IG1hbmRhdG9yeTsKKyAgICAgICAgICAgIHRoaXMucnRleHBydmFsdWUgPSBydGV4cHJ2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgcHVibGljIFZhbGlkQXR0cmlidXRlIChTdHJpbmcgbmFtZSwgYm9vbGVhbiBtYW5kYXRvcnkpIHsKKyAgICAgICAgICAgIHRoaXMoIG5hbWUsIG1hbmRhdG9yeSwgZmFsc2UgKTsKKwl9CisKKwlwdWJsaWMgVmFsaWRBdHRyaWJ1dGUgKFN0cmluZyBuYW1lKSB7CisJICAgIHRoaXMgKG5hbWUsIGZhbHNlKTsKKwl9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBTdHJpbmcgdmFsdWUgdG8gJ2Jvb2xlYW4nLgorICAgICAqIEJlc2lkZXMgdGhlIHN0YW5kYXJkIGNvbnZlcnNpb25zIGRvbmUgYnkKKyAgICAgKiBCb29sZWFuLnZhbHVlT2YocykuYm9vbGVhblZhbHVlKCksIHRoZSB2YWx1ZSAieWVzIgorICAgICAqIChpZ25vcmUgY2FzZSkgaXMgYWxzbyBjb252ZXJ0ZWQgdG8gJ3RydWUnLiAKKyAgICAgKiBJZiAncycgaXMgbnVsbCwgdGhlbiAnZmFsc2UnIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHMgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBib29sZWFuIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RyaW5nIHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYm9vbGVhblZhbHVlKFN0cmluZyBzKSB7CisJYm9vbGVhbiBiID0gZmFsc2U7CisJaWYgKHMgIT0gbnVsbCkgeworCSAgICBpZiAocy5lcXVhbHNJZ25vcmVDYXNlKCJ5ZXMiKSkgeworCQliID0gdHJ1ZTsKKwkgICAgfSBlbHNlIHsKKwkJYiA9IEJvb2xlYW4udmFsdWVPZihzKS5ib29sZWFuVmFsdWUoKTsKKwkgICAgfQorCX0KKwlyZXR1cm4gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSA8dHQ+Q2xhc3M8L3R0PiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGFzcyBvcgorICAgICAqIGludGVyZmFjZSB3aXRoIHRoZSBnaXZlbiBzdHJpbmcgbmFtZS4KKyAgICAgKgorICAgICAqIDxwPiBUaGUgPHR0PkNsYXNzPC90dD4gb2JqZWN0IGlzIGRldGVybWluZWQgYnkgcGFzc2luZyB0aGUgZ2l2ZW4gc3RyaW5nCisgICAgICogbmFtZSB0byB0aGUgPHR0PkNsYXNzLmZvck5hbWUoKTwvdHQ+IG1ldGhvZCwgdW5sZXNzIHRoZSBnaXZlbiBzdHJpbmcKKyAgICAgKiBuYW1lIHJlcHJlc2VudHMgYSBwcmltaXRpdmUgdHlwZSwgaW4gd2hpY2ggY2FzZSBpdCBpcyBjb252ZXJ0ZWQgdG8gYQorICAgICAqIDx0dD5DbGFzczwvdHQ+IG9iamVjdCBieSBhcHBlbmRpbmcgIi5jbGFzcyIgdG8gaXQgKGUuZy4sICJpbnQuY2xhc3MiKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzIHRvQ2xhc3MoU3RyaW5nIHR5cGUsIENsYXNzTG9hZGVyIGxvYWRlcikKKwkgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworCisJQ2xhc3MgYyA9IG51bGw7CisJaW50IGkwID0gdHlwZS5pbmRleE9mKCdbJyk7CisJaW50IGRpbXMgPSAwOworCWlmIChpMCA+IDApIHsKKwkgICAgLy8gVGhpcyBpcyBhbiBhcnJheS4gIENvdW50IHRoZSBkaW1lbnNpb25zCisJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS5sZW5ndGgoKTsgaSsrKSB7CisJCWlmICh0eXBlLmNoYXJBdChpKSA9PSAnWycpCisJCSAgICBkaW1zKys7CisJICAgIH0KKwkgICAgdHlwZSA9IHR5cGUuc3Vic3RyaW5nKDAsIGkwKTsKKwl9CisKKwlpZiAoImJvb2xlYW4iLmVxdWFscyh0eXBlKSkKKwkgICAgYyA9IGJvb2xlYW4uY2xhc3M7CisJZWxzZSBpZiAoImNoYXIiLmVxdWFscyh0eXBlKSkKKwkgICAgYyA9IGNoYXIuY2xhc3M7CisJZWxzZSBpZiAoImJ5dGUiLmVxdWFscyh0eXBlKSkKKwkgICAgYyA9ICBieXRlLmNsYXNzOworCWVsc2UgaWYgKCJzaG9ydCIuZXF1YWxzKHR5cGUpKQorCSAgICBjID0gc2hvcnQuY2xhc3M7CisJZWxzZSBpZiAoImludCIuZXF1YWxzKHR5cGUpKQorCSAgICBjID0gaW50LmNsYXNzOworCWVsc2UgaWYgKCJsb25nIi5lcXVhbHModHlwZSkpCisJICAgIGMgPSBsb25nLmNsYXNzOworCWVsc2UgaWYgKCJmbG9hdCIuZXF1YWxzKHR5cGUpKQorCSAgICBjID0gZmxvYXQuY2xhc3M7CisJZWxzZSBpZiAoImRvdWJsZSIuZXF1YWxzKHR5cGUpKQorCSAgICBjID0gZG91YmxlLmNsYXNzOworCWVsc2UgaWYgKHR5cGUuaW5kZXhPZignWycpIDwgMCkKKwkgICAgYyA9IGxvYWRlci5sb2FkQ2xhc3ModHlwZSk7CisKKwlpZiAoZGltcyA9PSAwKQorCSAgICByZXR1cm4gYzsKKworCWlmIChkaW1zID09IDEpCisJICAgIHJldHVybiBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5uZXdJbnN0YW5jZShjLCAxKS5nZXRDbGFzcygpOworCisJLy8gQXJyYXkgb2YgbW9yZSB0aGFuIGkgZGltZW5zaW9uCisJcmV0dXJuIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGMsIG5ldyBpbnRbZGltc10pLmdldENsYXNzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvZHVjZXMgYSBTdHJpbmcgcmVwcmVzZW50aW5nIGEgY2FsbCB0byB0aGUgRUwgaW50ZXJwcmV0ZXIuCisgICAgICogQHBhcmFtIGV4cHJlc3Npb24gYSBTdHJpbmcgY29udGFpbmluZyB6ZXJvIG9yIG1vcmUgIiR7fSIgZXhwcmVzc2lvbnMKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRUeXBlIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSBpbnRlcnByZXRlZCByZXN1bHQKKyAgICAgKiBAcGFyYW0gZm5tYXB2YXIgVmFyaWFibGUgcG9pbnRpbmcgdG8gYSBmdW5jdGlvbiBtYXAuCisgICAgICogQHBhcmFtIFhtbEVzY2FwZSBUcnVlIGlmIHRoZSByZXN1bHQgc2hvdWxkIGRvIFhNTCBlc2NhcGluZworICAgICAqIEByZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50aW5nIGEgY2FsbCB0byB0aGUgRUwgaW50ZXJwcmV0ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW50ZXJwcmV0ZXJDYWxsKGJvb2xlYW4gaXNUYWdGaWxlLAorCQkJCQkgU3RyaW5nIGV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGV4cGVjdGVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZubWFwdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIFhtbEVzY2FwZSApIAorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRGV0ZXJtaW5lIHdoaWNoIGNvbnRleHQgb2JqZWN0IHRvIHVzZS4KKyAgICAgICAgICovCisJU3RyaW5nIGpzcEN0eHQgPSBudWxsOworCWlmIChpc1RhZ0ZpbGUpCisJICAgIGpzcEN0eHQgPSAidGhpcy5nZXRKc3BDb250ZXh0KCkiOworCWVsc2UKKwkgICAganNwQ3R4dCA9ICJfanNweF9wYWdlX2NvbnRleHQiOworCisJLyoKKyAgICAgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdG8gdXNlIHRoZSBleHBlY3RlZCB0eXBlJ3MgdGV4dHVhbCBuYW1lCisJICogb3IsIGlmIGl0J3MgYSBwcmltaXRpdmUsIHRoZSBuYW1lIG9mIGl0cyBjb3JyZXNwb25kZW50IGJveGVkCisJICogdHlwZS4KKyAgICAgICAgICovCisJU3RyaW5nIHRhcmdldFR5cGUgPSBleHBlY3RlZFR5cGUuZ2V0TmFtZSgpOworCVN0cmluZyBwcmltaXRpdmVDb252ZXJ0ZXJNZXRob2QgPSBudWxsOworCWlmIChleHBlY3RlZFR5cGUuaXNQcmltaXRpdmUoKSkgeworCSAgICBpZiAoZXhwZWN0ZWRUeXBlLmVxdWFscyhCb29sZWFuLlRZUEUpKSB7CisJCXRhcmdldFR5cGUgPSBCb29sZWFuLmNsYXNzLmdldE5hbWUoKTsKKwkJcHJpbWl0aXZlQ29udmVydGVyTWV0aG9kID0gImJvb2xlYW5WYWx1ZSI7CisJICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlLmVxdWFscyhCeXRlLlRZUEUpKSB7CisJCXRhcmdldFR5cGUgPSBCeXRlLmNsYXNzLmdldE5hbWUoKTsKKwkJcHJpbWl0aXZlQ29udmVydGVyTWV0aG9kID0gImJ5dGVWYWx1ZSI7CisJICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlLmVxdWFscyhDaGFyYWN0ZXIuVFlQRSkpIHsKKwkJdGFyZ2V0VHlwZSA9IENoYXJhY3Rlci5jbGFzcy5nZXROYW1lKCk7CisJCXByaW1pdGl2ZUNvbnZlcnRlck1ldGhvZCA9ICJjaGFyVmFsdWUiOworCSAgICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZS5lcXVhbHMoU2hvcnQuVFlQRSkpIHsKKwkJdGFyZ2V0VHlwZSA9IFNob3J0LmNsYXNzLmdldE5hbWUoKTsKKwkJcHJpbWl0aXZlQ29udmVydGVyTWV0aG9kID0gInNob3J0VmFsdWUiOworCSAgICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZS5lcXVhbHMoSW50ZWdlci5UWVBFKSkgeworCQl0YXJnZXRUeXBlID0gSW50ZWdlci5jbGFzcy5nZXROYW1lKCk7CisJCXByaW1pdGl2ZUNvbnZlcnRlck1ldGhvZCA9ICJpbnRWYWx1ZSI7CisJICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlLmVxdWFscyhMb25nLlRZUEUpKSB7CisJCXRhcmdldFR5cGUgPSBMb25nLmNsYXNzLmdldE5hbWUoKTsKKwkJcHJpbWl0aXZlQ29udmVydGVyTWV0aG9kID0gImxvbmdWYWx1ZSI7CisJICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlLmVxdWFscyhGbG9hdC5UWVBFKSkgeworCQl0YXJnZXRUeXBlID0gRmxvYXQuY2xhc3MuZ2V0TmFtZSgpOworCQlwcmltaXRpdmVDb252ZXJ0ZXJNZXRob2QgPSAiZmxvYXRWYWx1ZSI7CisJICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlLmVxdWFscyhEb3VibGUuVFlQRSkpIHsgCisJCXRhcmdldFR5cGUgPSBEb3VibGUuY2xhc3MuZ2V0TmFtZSgpOworCQlwcmltaXRpdmVDb252ZXJ0ZXJNZXRob2QgPSAiZG91YmxlVmFsdWUiOworCSAgICB9CisJfQorIAorCWlmIChwcmltaXRpdmVDb252ZXJ0ZXJNZXRob2QgIT0gbnVsbCkgeworCSAgICBYbWxFc2NhcGUgPSBmYWxzZTsKKwl9CisKKwkvKgorICAgICAgICAgKiBCdWlsZCB1cCB0aGUgYmFzZSBjYWxsIHRvIHRoZSBpbnRlcnByZXRlci4KKyAgICAgICAgICovCisgICAgICAgIC8vIFhYWCAtIFdlIHVzZSBhIHByb3ByaWV0YXJ5IGNhbGwgdG8gdGhlIGludGVycHJldGVyIGZvciBub3cKKyAgICAgICAgLy8gYXMgdGhlIGN1cnJlbnQgc3RhbmRhcmQgbWFjaGluZXJ5IGlzIGluZWZmaWNpZW50IGFuZCByZXF1aXJlcworICAgICAgICAvLyBsb3RzIG9mIHdyYXBwZXJzIGFuZCBhZGFwdGVycy4gIFRoaXMgc2hvdWxkIGFsbCBjbGVhciB1cCBvbmNlCisgICAgICAgIC8vIHRoZSBFTCBpbnRlcnByZXRlciBtb3ZlcyBvdXQgb2YgSlNUTCBhbmQgaW50byBpdHMgb3duIHByb2plY3QuCisgICAgICAgIC8vIEluIHRoZSBmdXR1cmUsIHRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGNvZGUgdGhhdCBjYWxscworICAgICAgICAvLyBFeHByZXNzaW9uRXZhbHVhdG9yLnBhcnNlRXhwcmVzc2lvbigpIGFuZCB0aGVuIGNhY2hlIHRoZSByZXN1bHRpbmcKKyAgICAgICAgLy8gZXhwcmVzc2lvbiBvYmplY3RzLiAgVGhlIGludGVycHJldGVyQ2FsbCB3b3VsZCBzaW1wbHkgc2VsZWN0CisgICAgICAgIC8vIG9uZSBvZiB0aGUgcHJlLWNhY2hlZCBleHByZXNzaW9ucyBhbmQgZXZhbHVhdGUgaXQuCisgICAgICAgIC8vIE5vdGUgdGhhdCBQYWdlQ29udGV4dEltcGwgaW1wbGVtZW50cyBWYXJpYWJsZVJlc29sdmVyIGFuZAorICAgICAgICAvLyB0aGUgZ2VuZXJhdGVkIFNlcnZsZXQvU2ltcGxlVGFnIGltcGxlbWVudHMgRnVuY3Rpb25NYXBwZXIsIHNvCisgICAgICAgIC8vIHRoYXQgbWFjaGluZXJ5IGlzIGFscmVhZHkgaW4gcGxhY2UgKG1yb3RoKS4KKwl0YXJnZXRUeXBlID0gdG9KYXZhU291cmNlVHlwZSh0YXJnZXRUeXBlKTsKKwlTdHJpbmdCdWZmZXIgY2FsbCA9IG5ldyBTdHJpbmdCdWZmZXIoCisgICAgICAgICAgICAgIigiICsgdGFyZ2V0VHlwZSArICIpICIKKyAgICAgICAgICAgICAgICsgIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuUGFnZUNvbnRleHRJbXBsLnByb3ByaWV0YXJ5RXZhbHVhdGUiCisgICAgICAgICAgICAgICArICIoIiArIEdlbmVyYXRvci5xdW90ZShleHByZXNzaW9uKSArICIsICIKKyAgICAgICAgICAgICAgICsgICAgICAgdGFyZ2V0VHlwZSArICIuY2xhc3MsICIKKwkgICAgICAgKyAgICAgICAiKFBhZ2VDb250ZXh0KSIgKyBqc3BDdHh0IAorICAgICAgICAgICAgICAgKyAgICAgICAiLCAiICsgZm5tYXB2YXIKKwkgICAgICAgKyAiLCAiICsgWG1sRXNjYXBlCisgICAgICAgICAgICAgICArICIpIik7CisgCisJLyoKKyAgICAgICAgICogQWRkIHRoZSBwcmltaXRpdmUgY29udmVydGVyIG1ldGhvZCBpZiB3ZSBuZWVkIHRvLgorICAgICAgICAgKi8KKwlpZiAocHJpbWl0aXZlQ29udmVydGVyTWV0aG9kICE9IG51bGwpIHsKKwkgICAgY2FsbC5pbnNlcnQoMCwgIigiKTsKKwkgICAgY2FsbC5hcHBlbmQoIikuIiArIHByaW1pdGl2ZUNvbnZlcnRlck1ldGhvZCArICIoKSIpOworCX0KKyAKKwlyZXR1cm4gY2FsbC50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlcyB0aGUgc3ludGF4IG9mIGFsbCAke30gZXhwcmVzc2lvbnMgd2l0aGluIHRoZSBnaXZlbiBzdHJpbmcuCisgICAgICogQHBhcmFtIHdoZXJlIHRoZSBhcHByb3hpbWF0ZSBsb2NhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbnMgaW4gdGhlIEpTUCBwYWdlCisgICAgICogQHBhcmFtIGV4cHJlc3Npb25zIGEgc3RyaW5nIGNvbnRhaW5pbmcgemVybyBvciBtb3JlICIke30iIGV4cHJlc3Npb25zCisgICAgICogQHBhcmFtIGVyciBhbiBlcnJvciBkaXNwYXRjaGVyIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUV4cHJlc3Npb25zKE1hcmsgd2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4cHJlc3Npb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGV4cGVjdGVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbk1hcHBlciBmdW5jdGlvbk1hcHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckRpc3BhdGNoZXIgZXJyKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpzcFV0aWwuZXhwcmVzc2lvbkV2YWx1YXRvci5wYXJzZUV4cHJlc3Npb24oIGV4cHJlc3Npb25zLCAKKyAgICAgICAgICAgICAgICBleHBlY3RlZFR5cGUsIG51bGwgKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggRUxQYXJzZUV4Y2VwdGlvbiBlICkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHdoZXJlLCAianNwLmVycm9yLmludmFsaWQuZXhwcmVzc2lvbiIsIGV4cHJlc3Npb25zLAorICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBFTEV4Y2VwdGlvbiBlICkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHdoZXJlLCAianNwLmVycm9yLmludmFsaWQuZXhwcmVzc2lvbiIsIGV4cHJlc3Npb25zLAorICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSB0ZW1wb3JhcnkgdmFyaWFibGUgbmFtZS4KKyAgICAgKiAobm90IHRocmVhZC1zYWZlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpIHsKKyAgICAgICAgdGVtcFNlcXVlbmNlTnVtYmVyID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYSBuZXcgdGVtcG9yYXJ5IHZhcmlhYmxlIG5hbWUuCisgICAgICogKG5vdCB0aHJlYWQtc2FmZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBuZXh0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCkgeworICAgICAgICByZXR1cm4gQ29uc3RhbnRzLlRFTVBfVkFSSUFCTEVfTkFNRV9QUkVGSVggKyAodGVtcFNlcXVlbmNlTnVtYmVyKyspOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvZXJjZVRvUHJpbWl0aXZlQm9vbGVhbihTdHJpbmcgcywKKwkJCQkJCSAgYm9vbGVhbiBpc05hbWVkQXR0cmlidXRlKSB7CisJaWYgKGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwkgICAgcmV0dXJuICJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmNvZXJjZVRvQm9vbGVhbigiICsgcyArICIpIjsKKwl9IGVsc2UgeworCSAgICBpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKKwkJcmV0dXJuICJmYWxzZSI7CisJICAgIGVsc2UKKwkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihzKS50b1N0cmluZygpOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb2VyY2VUb0Jvb2xlYW4oU3RyaW5nIHMsIGJvb2xlYW4gaXNOYW1lZEF0dHJpYnV0ZSkgeworCWlmIChpc05hbWVkQXR0cmlidXRlKSB7CisJICAgIHJldHVybiAiKEJvb2xlYW4pIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuY29lcmNlKCIgKyBzICsgIiwgQm9vbGVhbi5jbGFzcykiOworCX0gZWxzZSB7CisJICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7CisJCXJldHVybiAibmV3IEJvb2xlYW4oZmFsc2UpIjsKKwkgICAgfSBlbHNlIHsKKwkJLy8gRGV0ZWN0IGZvcm1hdCBlcnJvciBhdCB0cmFuc2xhdGlvbiB0aW1lCisJCXJldHVybiAibmV3IEJvb2xlYW4oIiArIEJvb2xlYW4udmFsdWVPZihzKS50b1N0cmluZygpICsgIikiOworCSAgICB9CisJfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvZXJjZVRvUHJpbWl0aXZlQnl0ZShTdHJpbmcgcywKKwkJCQkJICAgICAgIGJvb2xlYW4gaXNOYW1lZEF0dHJpYnV0ZSkgeworCWlmIChpc05hbWVkQXR0cmlidXRlKSB7CisJICAgIHJldHVybiAib3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS5jb2VyY2VUb0J5dGUoIiArIHMgKyAiKSI7CisJfSBlbHNlIHsKKwkgICAgaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCisJCXJldHVybiAiKGJ5dGUpIDAiOworCSAgICBlbHNlCisJCXJldHVybiAiKChieXRlKSIgKyBCeXRlLnZhbHVlT2YocykudG9TdHJpbmcoKSArICIpIjsKKwl9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29lcmNlVG9CeXRlKFN0cmluZyBzLCBib29sZWFuIGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwlpZiAoaXNOYW1lZEF0dHJpYnV0ZSkgeworCSAgICByZXR1cm4gIihCeXRlKSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmNvZXJjZSgiICsgcyArICIsIEJ5dGUuY2xhc3MpIjsKKwl9IGVsc2UgeworCSAgICBpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgeworCQlyZXR1cm4gIm5ldyBCeXRlKChieXRlKSAwKSI7CisJICAgIH0gZWxzZSB7CisJCS8vIERldGVjdCBmb3JtYXQgZXJyb3IgYXQgdHJhbnNsYXRpb24gdGltZQorCQlyZXR1cm4gIm5ldyBCeXRlKChieXRlKSIgKyBCeXRlLnZhbHVlT2YocykudG9TdHJpbmcoKSArICIpIjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb2VyY2VUb0NoYXIoU3RyaW5nIHMsIGJvb2xlYW4gaXNOYW1lZEF0dHJpYnV0ZSkgeworCWlmIChpc05hbWVkQXR0cmlidXRlKSB7CisJICAgIHJldHVybiAib3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS5jb2VyY2VUb0NoYXIoIiArIHMgKyAiKSI7CisJfSBlbHNlIHsKKwkgICAgaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApIHsKKwkJcmV0dXJuICIoY2hhcikgMCI7CisJICAgIH0gZWxzZSB7CisJCWNoYXIgY2ggPSBzLmNoYXJBdCgwKTsKKwkJLy8gdGhpcyB0cmljayBhdm9pZHMgZXNjYXBpbmcgaXNzdWVzCisJCXJldHVybiAiKChjaGFyKSAiICsgKGludCkgY2ggKyAiKSI7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29lcmNlVG9DaGFyYWN0ZXIoU3RyaW5nIHMsIGJvb2xlYW4gaXNOYW1lZEF0dHJpYnV0ZSkgeworCWlmIChpc05hbWVkQXR0cmlidXRlKSB7CisJICAgIHJldHVybiAiKENoYXJhY3Rlcikgb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS5jb2VyY2UoIiArIHMgKyAiLCBDaGFyYWN0ZXIuY2xhc3MpIjsKKwl9IGVsc2UgeworCSAgICBpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgeworCQlyZXR1cm4gIm5ldyBDaGFyYWN0ZXIoKGNoYXIpIDApIjsKKwkgICAgfSBlbHNlIHsKKwkJY2hhciBjaCA9IHMuY2hhckF0KDApOworCQkvLyB0aGlzIHRyaWNrIGF2b2lkcyBlc2NhcGluZyBpc3N1ZXMKKwkJcmV0dXJuICJuZXcgQ2hhcmFjdGVyKChjaGFyKSAiICsgKGludCkgY2ggKyAiKSI7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29lcmNlVG9QcmltaXRpdmVEb3VibGUoU3RyaW5nIHMsCisJCQkJCQkgYm9vbGVhbiBpc05hbWVkQXR0cmlidXRlKSB7CisJaWYgKGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwkgICAgcmV0dXJuICJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmNvZXJjZVRvRG91YmxlKCIgKyBzICsgIikiOworCX0gZWxzZSB7CisJICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQorCQlyZXR1cm4gIihkb3VibGUpIDAiOworCSAgICBlbHNlCisJCXJldHVybiBEb3VibGUudmFsdWVPZihzKS50b1N0cmluZygpOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb2VyY2VUb0RvdWJsZShTdHJpbmcgcywgYm9vbGVhbiBpc05hbWVkQXR0cmlidXRlKSB7CisJaWYgKGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwkgICAgcmV0dXJuICIoRG91YmxlKSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmNvZXJjZSgiICsgcyArICIsIERvdWJsZS5jbGFzcykiOworCX0gZWxzZSB7CisJICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7CisJCXJldHVybiAibmV3IERvdWJsZSgwKSI7CisJICAgIH0gZWxzZSB7CisJCS8vIERldGVjdCBmb3JtYXQgZXJyb3IgYXQgdHJhbnNsYXRpb24gdGltZQorCQlyZXR1cm4gIm5ldyBEb3VibGUoIiArIERvdWJsZS52YWx1ZU9mKHMpLnRvU3RyaW5nKCkgKyAiKSI7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29lcmNlVG9QcmltaXRpdmVGbG9hdChTdHJpbmcgcywKKwkJCQkJCWJvb2xlYW4gaXNOYW1lZEF0dHJpYnV0ZSkgeworCWlmIChpc05hbWVkQXR0cmlidXRlKSB7CisJICAgIHJldHVybiAib3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS5jb2VyY2VUb0Zsb2F0KCIgKyBzICsgIikiOworCX0gZWxzZSB7CisJICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQorCQlyZXR1cm4gIihmbG9hdCkgMCI7CisJICAgIGVsc2UKKwkJcmV0dXJuIEZsb2F0LnZhbHVlT2YocykudG9TdHJpbmcoKSArICJmIjsKKwl9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29lcmNlVG9GbG9hdChTdHJpbmcgcywgYm9vbGVhbiBpc05hbWVkQXR0cmlidXRlKSB7CisJaWYgKGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwkgICAgcmV0dXJuICIoRmxvYXQpIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuY29lcmNlKCIgKyBzICsgIiwgRmxvYXQuY2xhc3MpIjsKKwl9IGVsc2UgeworCSAgICBpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgeworCQlyZXR1cm4gIm5ldyBGbG9hdCgwKSI7CisJICAgIH0gZWxzZSB7CisJCS8vIERldGVjdCBmb3JtYXQgZXJyb3IgYXQgdHJhbnNsYXRpb24gdGltZQorCQlyZXR1cm4gIm5ldyBGbG9hdCgiICsgRmxvYXQudmFsdWVPZihzKS50b1N0cmluZygpICsgImYpIjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb2VyY2VUb0ludChTdHJpbmcgcywgYm9vbGVhbiBpc05hbWVkQXR0cmlidXRlKSB7CisJaWYgKGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwkgICAgcmV0dXJuICJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmNvZXJjZVRvSW50KCIgKyBzICsgIikiOworCX0gZWxzZSB7CisJICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQorCQlyZXR1cm4gIjAiOworCSAgICBlbHNlCisJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YocykudG9TdHJpbmcoKTsKKwl9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29lcmNlVG9JbnRlZ2VyKFN0cmluZyBzLCBib29sZWFuIGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwlpZiAoaXNOYW1lZEF0dHJpYnV0ZSkgeworCSAgICByZXR1cm4gIihJbnRlZ2VyKSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmNvZXJjZSgiICsgcyArICIsIEludGVnZXIuY2xhc3MpIjsKKwl9IGVsc2UgeworCSAgICBpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgeworCQlyZXR1cm4gIm5ldyBJbnRlZ2VyKDApIjsKKwkgICAgfSBlbHNlIHsKKwkJLy8gRGV0ZWN0IGZvcm1hdCBlcnJvciBhdCB0cmFuc2xhdGlvbiB0aW1lCisJCXJldHVybiAibmV3IEludGVnZXIoIiArIEludGVnZXIudmFsdWVPZihzKS50b1N0cmluZygpICsgIikiOworCSAgICB9CisJfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvZXJjZVRvUHJpbWl0aXZlU2hvcnQoU3RyaW5nIHMsCisJCQkJCQlib29sZWFuIGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwlpZiAoaXNOYW1lZEF0dHJpYnV0ZSkgeworCSAgICByZXR1cm4gIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuY29lcmNlVG9TaG9ydCgiICsgcyArICIpIjsKKwl9IGVsc2UgeworCSAgICBpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKKwkJcmV0dXJuICIoc2hvcnQpIDAiOworCSAgICBlbHNlCisJCXJldHVybiAiKChzaG9ydCkgIiArIFNob3J0LnZhbHVlT2YocykudG9TdHJpbmcoKSArICIpIjsKKwl9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvZXJjZVRvU2hvcnQoU3RyaW5nIHMsIGJvb2xlYW4gaXNOYW1lZEF0dHJpYnV0ZSkgeworCWlmIChpc05hbWVkQXR0cmlidXRlKSB7CisJICAgIHJldHVybiAiKFNob3J0KSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmNvZXJjZSgiICsgcyArICIsIFNob3J0LmNsYXNzKSI7CisJfSBlbHNlIHsKKwkgICAgaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApIHsKKwkJcmV0dXJuICJuZXcgU2hvcnQoKHNob3J0KSAwKSI7CisJICAgIH0gZWxzZSB7CisJCS8vIERldGVjdCBmb3JtYXQgZXJyb3IgYXQgdHJhbnNsYXRpb24gdGltZQorCQlyZXR1cm4gIm5ldyBTaG9ydChcIiIgKyBTaG9ydC52YWx1ZU9mKHMpLnRvU3RyaW5nKCkgKyAiXCIpIjsKKwkgICAgfQorCX0KKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29lcmNlVG9QcmltaXRpdmVMb25nKFN0cmluZyBzLAorCQkJCQkgICAgICAgYm9vbGVhbiBpc05hbWVkQXR0cmlidXRlKSB7CisJaWYgKGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwkgICAgcmV0dXJuICJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmNvZXJjZVRvTG9uZygiICsgcyArICIpIjsKKwl9IGVsc2UgeworCSAgICBpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKKwkJcmV0dXJuICIobG9uZykgMCI7CisJICAgIGVsc2UKKwkJcmV0dXJuIExvbmcudmFsdWVPZihzKS50b1N0cmluZygpICsgImwiOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb2VyY2VUb0xvbmcoU3RyaW5nIHMsIGJvb2xlYW4gaXNOYW1lZEF0dHJpYnV0ZSkgeworCWlmIChpc05hbWVkQXR0cmlidXRlKSB7CisJICAgIHJldHVybiAiKExvbmcpIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuY29lcmNlKCIgKyBzICsgIiwgTG9uZy5jbGFzcykiOworCX0gZWxzZSB7CisJICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7CisJCXJldHVybiAibmV3IExvbmcoMCkiOworCSAgICB9IGVsc2UgeworCQkvLyBEZXRlY3QgZm9ybWF0IGVycm9yIGF0IHRyYW5zbGF0aW9uIHRpbWUKKwkJcmV0dXJuICJuZXcgTG9uZygiICsgTG9uZy52YWx1ZU9mKHMpLnRvU3RyaW5nKCkgKyAibCkiOworCSAgICB9CisJfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIGZuYW1lLCBKYXJGaWxlIGphckZpbGUsCisJCQkJCSAgICAgSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQsCisJCQkJCSAgICAgRXJyb3JEaXNwYXRjaGVyIGVycikKKwkJdGhyb3dzIEphc3BlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKKworCWlmIChqYXJGaWxlICE9IG51bGwpIHsKKwkgICAgU3RyaW5nIGphckVudHJ5TmFtZSA9IGZuYW1lLnN1YnN0cmluZygxLCBmbmFtZS5sZW5ndGgoKSk7CisJICAgIFppcEVudHJ5IGphckVudHJ5ID0gamFyRmlsZS5nZXRFbnRyeShqYXJFbnRyeU5hbWUpOworCSAgICBpZiAoamFyRW50cnkgPT0gbnVsbCkgeworCQllcnIuanNwRXJyb3IoImpzcC5lcnJvci5maWxlLm5vdC5mb3VuZCIsIGZuYW1lKTsKKwkgICAgfQorCSAgICBpbiA9IGphckZpbGUuZ2V0SW5wdXRTdHJlYW0oamFyRW50cnkpOworCX0gZWxzZSB7CisJICAgIGluID0gY3R4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKGZuYW1lKTsKKwl9CisKKwlpZiAoaW4gPT0gbnVsbCkgeworCSAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci5maWxlLm5vdC5mb3VuZCIsIGZuYW1lKTsKKwl9CisKKwlyZXR1cm4gaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHRhZyBoYW5kbGVyIGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgKiB0aGUgZ2l2ZW4gdGFnIGZpbGUgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFRhZyBmaWxlIHBhdGgKKyAgICAgKiBAcGFyYW0gZXJyIEVycm9yIGRpc3BhdGNoZXIKKyAgICAgKgorICAgICAqIEByZXR1cm4gRnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHRhZyBoYW5kbGVyIGNvcnJlc3BvbmRpbmcgdG8gCisgICAgICogdGhlIGdpdmVuIHRhZyBmaWxlIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYWdIYW5kbGVyQ2xhc3NOYW1lKFN0cmluZyBwYXRoLAorCQkJCQkJRXJyb3JEaXNwYXRjaGVyIGVycikKKyAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbnVsbDsKKyAgICAgICAgaW50IGJlZ2luID0gMDsKKyAgICAgICAgaW50IGluZGV4OworICAgICAgICAKKyAgICAgICAgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKCIudGFnIik7CisgICAgICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IudGFnZmlsZS5iYWRTdWZmaXgiLCBwYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vSXQncyB0ZW1wdGluZyB0byByZW1vdmUgdGhlICIudGFnIiBzdWZmaXggaGVyZSwgYnV0IHdlIGNhbid0LgorICAgICAgICAvL0lmIHdlIHJlbW92ZSBpdCwgdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoaXMgdGFnCisgICAgICAgIC8vY291bGQgY29uZmxpY3Qgd2l0aCB0aGUgcGFja2FnZSBuYW1lIG9mIG90aGVyIHRhZ3MuCisgICAgICAgIC8vRm9yIGluc3RhbmNlLCB0aGUgdGFnIGZpbGUKKyAgICAgICAgLy8gICAgL1dFQi1JTkYvdGFncy9mb28udGFnCisgICAgICAgIC8vd291bGQgaGF2ZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZQorICAgICAgICAvLyAgICBvcmcuYXBhY2hlLmpzcC50YWcud2ViLmZvbworICAgICAgICAvL3doaWNoIHdvdWxkIGNvbmZsaWN0IHdpdGggdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgdGFnIGZpbGUKKyAgICAgICAgLy8gICAgL1dFQi1JTkYvdGFncy9mb28vYmFyLnRhZworCisgICAgICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKFdFQl9JTkZfVEFHUyk7CisgICAgICAgIGlmIChpbmRleCAhPSAtMSkgeworICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuanNwLnRhZy53ZWIuIjsKKyAgICAgICAgICAgIGJlZ2luID0gaW5kZXggKyBXRUJfSU5GX1RBR1MubGVuZ3RoKCk7CisgICAgICAgIH0gZWxzZSB7CisJICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKE1FVEFfSU5GX1RBR1MpOworCSAgICBpZiAoaW5kZXggIT0gLTEpIHsKKwkJY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuanNwLnRhZy5tZXRhLiI7CisJCWJlZ2luID0gaW5kZXggKyBNRVRBX0lORl9UQUdTLmxlbmd0aCgpOworCSAgICB9IGVsc2UgeworCQllcnIuanNwRXJyb3IoImpzcC5lcnJvci50YWdmaWxlLmlsbGVnYWxQYXRoIiwgcGF0aCk7CisJICAgIH0KKwl9CisKKyAgICAgICAgY2xhc3NOYW1lICs9IG1ha2VKYXZhUGFja2FnZShwYXRoLnN1YnN0cmluZyhiZWdpbikpOworICAKKyAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBwYXRoIHRvIGEgSmF2YSBwYWNrYWdlIG9yIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIGNvbnZlcnQKKyAgICAgKgorICAgICAqIEByZXR1cm4gSmF2YSBwYWNrYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBtYWtlSmF2YVBhY2thZ2UoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZUNvbXBvbmVudHNbXSA9IHNwbGl0KHBhdGgsIi8iKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGxlZ2FsQ2xhc3NOYW1lcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc05hbWVDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBsZWdhbENsYXNzTmFtZXMuYXBwZW5kKG1ha2VKYXZhSWRlbnRpZmllcihjbGFzc05hbWVDb21wb25lbnRzW2ldKSk7CisgICAgICAgICAgICBpZiAoaSA8IGNsYXNzTmFtZUNvbXBvbmVudHMubGVuZ3RoIC0gMSkgeworICAgICAgICAgICAgICAgIGxlZ2FsQ2xhc3NOYW1lcy5hcHBlbmQoJy4nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGVnYWxDbGFzc05hbWVzLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BsaXRzIGEgc3RyaW5nIGludG8gaXQncyBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSBwYXRoIFN0cmluZyB0byBzcGxpdAorICAgICAqIEBwYXJhbSBwYXQgUGF0dGVybiB0byBzcGxpdCBhdAorICAgICAqIEByZXR1cm4gdGhlIGNvbXBvbmVudHMgb2YgdGhlIHBhdGgKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgW10gc3BsaXQoU3RyaW5nIHBhdGgsIFN0cmluZyBwYXQpIHsKKyAgICAgICAgVmVjdG9yIGNvbXBzID0gbmV3IFZlY3RvcigpOworICAgICAgICBpbnQgcG9zID0gcGF0aC5pbmRleE9mKHBhdCk7CisgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgIHdoaWxlKCBwb3MgPj0gMCApIHsKKyAgICAgICAgICAgIGlmKHBvcyA+IHN0YXJ0ICkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjb21wID0gcGF0aC5zdWJzdHJpbmcoc3RhcnQscG9zKTsKKyAgICAgICAgICAgICAgICBjb21wcy5hZGQoY29tcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFydCA9IHBvcyArIHBhdC5sZW5ndGgoKTsKKyAgICAgICAgICAgIHBvcyA9IHBhdGguaW5kZXhPZihwYXQsc3RhcnQpOworICAgICAgICB9CisgICAgICAgIGlmKCBzdGFydCA8IHBhdGgubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIGNvbXBzLmFkZChwYXRoLnN1YnN0cmluZyhzdGFydCkpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2NvbXBzLnNpemUoKV07CisgICAgICAgIGZvcihpbnQgaT0wOyBpIDwgY29tcHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdFtpXSA9IChTdHJpbmcpY29tcHMuZWxlbWVudEF0KGkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgICAgICAgICAgCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhlIGdpdmVuIGlkZW50aWZpZXIgdG8gYSBsZWdhbCBKYXZhIGlkZW50aWZpZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIElkZW50aWZpZXIgdG8gY29udmVydAorICAgICAqCisgICAgICogQHJldHVybiBMZWdhbCBKYXZhIGlkZW50aWZpZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gaWRlbnRpZmllcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1ha2VKYXZhSWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgeworICAgICAgICBTdHJpbmdCdWZmZXIgbW9kaWZpZWRJZGVudGlmaWVyID0gCisgICAgICAgICAgICBuZXcgU3RyaW5nQnVmZmVyKGlkZW50aWZpZXIubGVuZ3RoKCkpOworICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoaWRlbnRpZmllci5jaGFyQXQoMCkpKSB7CisgICAgICAgICAgICBtb2RpZmllZElkZW50aWZpZXIuYXBwZW5kKCdfJyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZGVudGlmaWVyLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBpZGVudGlmaWVyLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY2gpICYmIGNoICE9ICdfJykgeworICAgICAgICAgICAgICAgIG1vZGlmaWVkSWRlbnRpZmllci5hcHBlbmQoY2gpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICBtb2RpZmllZElkZW50aWZpZXIuYXBwZW5kKCdfJyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1vZGlmaWVkSWRlbnRpZmllci5hcHBlbmQobWFuZ2xlQ2hhcihjaCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpc0phdmFLZXl3b3JkKG1vZGlmaWVkSWRlbnRpZmllci50b1N0cmluZygpKSkgeworICAgICAgICAgICAgbW9kaWZpZWRJZGVudGlmaWVyLmFwcGVuZCgnXycpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtb2RpZmllZElkZW50aWZpZXIudG9TdHJpbmcoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogTWFuZ2xlIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHRvIGNyZWF0ZSBhIGxlZ2FsIEphdmEgY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBtYW5nbGVDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyWzVdOworICAgICAgICByZXN1bHRbMF0gPSAnXyc7CisgICAgICAgIHJlc3VsdFsxXSA9IENoYXJhY3Rlci5mb3JEaWdpdCgoY2ggPj4gMTIpICYgMHhmLCAxNik7CisgICAgICAgIHJlc3VsdFsyXSA9IENoYXJhY3Rlci5mb3JEaWdpdCgoY2ggPj4gOCkgJiAweGYsIDE2KTsKKyAgICAgICAgcmVzdWx0WzNdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KChjaCA+PiA0KSAmIDB4ZiwgMTYpOworICAgICAgICByZXN1bHRbNF0gPSBDaGFyYWN0ZXIuZm9yRGlnaXQoY2ggJiAweGYsIDE2KTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcocmVzdWx0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgSmF2YSBrZXl3b3JkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUtleXdvcmQoU3RyaW5nIGtleSkgeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGludCBqID0gamF2YUtleXdvcmRzLmxlbmd0aDsKKyAgICAgICAgd2hpbGUgKGkgPCBqKSB7CisgICAgICAgICAgICBpbnQgayA9IChpK2opLzI7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gamF2YUtleXdvcmRzW2tdLmNvbXBhcmVUbyhrZXkpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgICAgICAgICAgIGkgPSBrKzE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGogPSBrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gWG1sIG5hbWUgdG8gYSBsZWdhbCBKYXZhIGlkZW50aWZpZXIuICBUaGlzIGlzCisgICAgICogc2xpZ2h0bHkgbW9yZSBlZmZpY2llbnQgdGhhbiBtYWtlSmF2YUlkZW50aWZpZXIgaW4gdGhhdCB3ZSBvbmx5IG5lZWQKKyAgICAgKiB0byB3b3JyeSBhYm91dCAnLicsICctJywgYW5kICc6JyBpbiB0aGUgc3RyaW5nLiAgV2UgYWxzbyBhc3N1bWUgdGhhdAorICAgICAqIHRoZSByZXN1bHRhbnQgc3RyaW5nIGlzIGZ1cnRoZXIgY29uY2F0ZW5hdGVkIHdpdGggc29tZSBwcmVmaXggc3RyaW5nCisgICAgICogc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGl0IGJlaW5nIGEgSmF2YSBrZXkgd29yZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIElkZW50aWZpZXIgdG8gY29udmVydAorICAgICAqCisgICAgICogQHJldHVybiBMZWdhbCBKYXZhIGlkZW50aWZpZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gaWRlbnRpZmllcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1ha2VYbWxKYXZhSWRlbnRpZmllcihTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZS5pbmRleE9mKCctJykgPj0gMCkKKyAgICAgICAgICAgIG5hbWUgPSByZXBsYWNlKG5hbWUsICctJywgIiQxIik7CisgICAgICAgIGlmIChuYW1lLmluZGV4T2YoJy4nKSA+PSAwKQorICAgICAgICAgICAgbmFtZSA9IHJlcGxhY2UobmFtZSwgJy4nLCAiJDIiKTsKKyAgICAgICAgaWYgKG5hbWUuaW5kZXhPZignOicpID49IDApCisgICAgICAgICAgICBuYW1lID0gcmVwbGFjZShuYW1lLCAnOicsICIkMyIpOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBzdGF0aWMgSW5wdXRTdHJlYW1SZWFkZXIgZ2V0UmVhZGVyKFN0cmluZyBmbmFtZSwgU3RyaW5nIGVuY29kaW5nLAorCQkJCSAgICAgICBKYXJGaWxlIGphckZpbGUsCisJCQkJICAgICAgIEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0LAorCQkJCSAgICAgICBFcnJvckRpc3BhdGNoZXIgZXJyKQorCQl0aHJvd3MgSmFzcGVyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyID0gbnVsbDsKKwlJbnB1dFN0cmVhbSBpbiA9IGdldElucHV0U3RyZWFtKGZuYW1lLCBqYXJGaWxlLCBjdHh0LCBlcnIpOworCisJdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgZW5jb2RpbmcpOworCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKKwkgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IudW5zdXBwb3J0ZWQuZW5jb2RpbmciLCBlbmNvZGluZyk7CisJfQorCisJcmV0dXJuIHJlYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGFzcy5nZXROYW1lKCkgcmV0dXJuIGFycmF5cyBpbiB0aGUgZm9ybSAiW1tbPGV0PiIsIHdoZXJlIGV0LAorICAgICAqIHRoZSBlbGVtZW50IHR5cGUgY2FuIGJlIG9uZSBvZiBaQkNERklKUyBvciBMPGNsYXNzbmFtZT47CisgICAgICogSXQgaXMgY29udmVydGVkIGludG8gZm9ybXMgdGhhdCBjYW4gYmUgdW5kZXJzdG9vZCBieSBqYXZhYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFTb3VyY2VUeXBlKFN0cmluZyB0eXBlKSB7CisKKwlpZiAodHlwZS5jaGFyQXQoMCkgIT0gJ1snKSB7CisJICAgIHJldHVybiB0eXBlOworIAl9CisKKwlpbnQgZGltcyA9IDE7CisJU3RyaW5nIHQgPSBudWxsOworCWZvciAoaW50IGkgPSAxOyBpIDwgdHlwZS5sZW5ndGgoKTsgaSsrKSB7CisJICAgIGlmICh0eXBlLmNoYXJBdChpKSA9PSAnWycpIHsKKwkJZGltcysrOworCSAgICB9IGVsc2UgeworCQlzd2l0Y2ggKHR5cGUuY2hhckF0KGkpKSB7CisJCWNhc2UgJ1onOiB0ID0gImJvb2xlYW4iOyBicmVhazsKKwkJY2FzZSAnQic6IHQgPSAiYnl0ZSI7IGJyZWFrOworCQljYXNlICdDJzogdCA9ICJjaGFyIjsgYnJlYWs7CisJCWNhc2UgJ0QnOiB0ID0gImRvdWJsZSI7IGJyZWFrOworCQljYXNlICdGJzogdCA9ICJmbG9hdCI7IGJyZWFrOworCQljYXNlICdJJzogdCA9ICJpbnQiOyBicmVhazsKKwkJY2FzZSAnSic6IHQgPSAibG9uZyI7IGJyZWFrOworCQljYXNlICdTJzogdCA9ICJzaG9ydCI7IGJyZWFrOworCQljYXNlICdMJzogdCA9IHR5cGUuc3Vic3RyaW5nKGkrMSwgdHlwZS5pbmRleE9mKCc7JykpOyBicmVhazsKKwkJfQorCQlicmVhazsKKwkgICAgfQorCX0KKwlTdHJpbmdCdWZmZXIgcmVzdWx0VHlwZSA9IG5ldyBTdHJpbmdCdWZmZXIodCk7CisJZm9yICg7IGRpbXMgPiAwOyBkaW1zLS0pIHsKKwkgICAgcmVzdWx0VHlwZS5hcHBlbmQoIltdIik7CisJfQorCXJldHVybiByZXN1bHRUeXBlLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcHV0ZSB0aGUgY2Fub25pY2FsIG5hbWUgZnJvbSBhIENsYXNzIGluc3RhbmNlLiAgTm90ZSB0aGF0IGEKKyAgICAgKiBzaW1wbGUgcmVwbGFjbWVudCBvZiAnJCcgd2l0aCAnLicgb2YgYSBiaW5hcnkgbmFtZSB3b3VsZCBub3Qgd29yaywKKyAgICAgKiBhcyAnJCcgaXMgYSBsZWdhbCBKYXZhIElkZW50aWZpZXIgY2hhcmFjdGVyLgorICAgICAqIEBwYXJhbSBjIEEgaW5zdGFuY2Ugb2YgamF2YS5sYW5nLkNsYXNzCisgICAgICogQHJldHVybiAgVGhlIGNhbm9uaWNhbCBuYW1lIG9mIGMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2Fub25pY2FsTmFtZShDbGFzcyBjKSB7CisKKyAgICAgICAgU3RyaW5nIGJpbmFyeU5hbWUgPSBjLmdldE5hbWUoKTsKKyAgICAgICAgYyA9IGMuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKworICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gYmluYXJ5TmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKGJpbmFyeU5hbWUpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBidWYuc2V0Q2hhckF0KGMuZ2V0TmFtZSgpLmxlbmd0aCgpLCAnLicpOworICAgICAgICAgICAgYyA9IGMuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKyAgICAgICAgfSB3aGlsZSAoIGMgIT0gbnVsbCk7CisKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Mb2NhbGl6ZXIuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvTG9jYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYwYWM1MQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvTG9jYWxpemVyLmphdmEKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8qKgorICogQ2xhc3MgcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgZXJyb3IgY29kZXMgdG8gY29ycmVzcG9uZGluZyBsb2NhbGl6ZWQKKyAqIGVycm9yIG1lc3NhZ2VzLgorICoKKyAqIEBhdXRob3IgSmFuIEx1ZWhlCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhbGl6ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKKyAgICAKKyAgICBzdGF0aWMgeworICAgICAgICB0cnkgeworICAgICAgICBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoCisgICAgICAgICAgICAib3JnLmFwYWNoZS5qYXNwZXIucmVzb3VyY2VzLkxvY2FsU3RyaW5ncyIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUmV0dXJucyB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZXJyb3IKKyAgICAgKiBjb2RlLgorICAgICAqCisgICAgICogSWYgdGhlIGdpdmVuIGVycm9yIGNvZGUgaXMgbm90IGRlZmluZWQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IKKyAgICAgKiBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZXMsIGl0IGlzIHVzZWQgYXMgdGhlIGVycm9yIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlIHRvIGxvY2FsaXplCisgICAgICogCisgICAgICogQHJldHVybiBMb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGVyckNvZGUpIHsKKwlTdHJpbmcgZXJyTXNnID0gZXJyQ29kZTsKKwl0cnkgeworCSAgICBlcnJNc2cgPSBidW5kbGUuZ2V0U3RyaW5nKGVyckNvZGUpOworCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJfQorCXJldHVybiBlcnJNc2c7CisgICAgfQorCisgICAgLyogCisgICAgICogUmV0dXJucyB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZXJyb3IKKyAgICAgKiBjb2RlLgorICAgICAqCisgICAgICogSWYgdGhlIGdpdmVuIGVycm9yIGNvZGUgaXMgbm90IGRlZmluZWQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IKKyAgICAgKiBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZXMsIGl0IGlzIHVzZWQgYXMgdGhlIGVycm9yIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlIHRvIGxvY2FsaXplCisgICAgICogQHBhcmFtIGFyZyBBcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqCisgICAgICogQHJldHVybiBMb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGVyckNvZGUsIFN0cmluZyBhcmcpIHsKKwlyZXR1cm4gZ2V0TWVzc2FnZShlcnJDb2RlLCBuZXcgT2JqZWN0W10ge2FyZ30pOworICAgIH0KKworICAgIC8qIAorICAgICAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGVycm9yCisgICAgICogY29kZS4KKyAgICAgKgorICAgICAqIElmIHRoZSBnaXZlbiBlcnJvciBjb2RlIGlzIG5vdCBkZWZpbmVkIGluIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yCisgICAgICogbG9jYWxpemVkIGVycm9yIG1lc3NhZ2VzLCBpdCBpcyB1c2VkIGFzIHRoZSBlcnJvciBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIGVyckNvZGUgRXJyb3IgY29kZSB0byBsb2NhbGl6ZQorICAgICAqIEBwYXJhbSBhcmcxIEZpcnN0IGFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIGFyZzIgU2Vjb25kIGFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICoKKyAgICAgKiBAcmV0dXJuIExvY2FsaXplZCBlcnJvciBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcgZXJyQ29kZSwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKSB7CisJcmV0dXJuIGdldE1lc3NhZ2UoZXJyQ29kZSwgbmV3IE9iamVjdFtdIHthcmcxLCBhcmcyfSk7CisgICAgfQorICAgIAorICAgIC8qIAorICAgICAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGVycm9yCisgICAgICogY29kZS4KKyAgICAgKgorICAgICAqIElmIHRoZSBnaXZlbiBlcnJvciBjb2RlIGlzIG5vdCBkZWZpbmVkIGluIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yCisgICAgICogbG9jYWxpemVkIGVycm9yIG1lc3NhZ2VzLCBpdCBpcyB1c2VkIGFzIHRoZSBlcnJvciBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIGVyckNvZGUgRXJyb3IgY29kZSB0byBsb2NhbGl6ZQorICAgICAqIEBwYXJhbSBhcmcxIEZpcnN0IGFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIGFyZzIgU2Vjb25kIGFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIGFyZzMgVGhpcmQgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKgorICAgICAqIEByZXR1cm4gTG9jYWxpemVkIGVycm9yIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBlcnJDb2RlLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsCisJCQkJICAgIFN0cmluZyBhcmczKSB7CisJcmV0dXJuIGdldE1lc3NhZ2UoZXJyQ29kZSwgbmV3IE9iamVjdFtdIHthcmcxLCBhcmcyLCBhcmczfSk7CisgICAgfQorCisgICAgLyogCisgICAgICogUmV0dXJucyB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZXJyb3IKKyAgICAgKiBjb2RlLgorICAgICAqCisgICAgICogSWYgdGhlIGdpdmVuIGVycm9yIGNvZGUgaXMgbm90IGRlZmluZWQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IKKyAgICAgKiBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZXMsIGl0IGlzIHVzZWQgYXMgdGhlIGVycm9yIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlIHRvIGxvY2FsaXplCisgICAgICogQHBhcmFtIGFyZzEgRmlyc3QgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMiBTZWNvbmQgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMyBUaGlyZCBhcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqIEBwYXJhbSBhcmc0IEZvdXJ0aCBhcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqCisgICAgICogQHJldHVybiBMb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGVyckNvZGUsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwKKwkJCQkgICAgU3RyaW5nIGFyZzMsIFN0cmluZyBhcmc0KSB7CisJcmV0dXJuIGdldE1lc3NhZ2UoZXJyQ29kZSwgbmV3IE9iamVjdFtdIHthcmcxLCBhcmcyLCBhcmczLCBhcmc0fSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBlcnJvcgorICAgICAqIGNvZGUuCisgICAgICoKKyAgICAgKiBJZiB0aGUgZ2l2ZW4gZXJyb3IgY29kZSBpcyBub3QgZGVmaW5lZCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvcgorICAgICAqIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlcywgaXQgaXMgdXNlZCBhcyB0aGUgZXJyb3IgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJDb2RlIEVycm9yIGNvZGUgdG8gbG9jYWxpemUKKyAgICAgKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKgorICAgICAqIEByZXR1cm4gTG9jYWxpemVkIGVycm9yIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBlcnJDb2RlLCBPYmplY3RbXSBhcmdzKSB7CisJU3RyaW5nIGVyck1zZyA9IGVyckNvZGU7CisJdHJ5IHsKKwkgICAgZXJyTXNnID0gYnVuZGxlLmdldFN0cmluZyhlcnJDb2RlKTsKKwkgICAgaWYgKGFyZ3MgIT0gbnVsbCkgeworCQlNZXNzYWdlRm9ybWF0IGZvcm1hdHRlciA9IG5ldyBNZXNzYWdlRm9ybWF0KGVyck1zZyk7CisJCWVyck1zZyA9IGZvcm1hdHRlci5mb3JtYXQoYXJncyk7CisJICAgIH0KKwl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCX0KKwkKKwlyZXR1cm4gZXJyTXNnOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvTWFyay5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9NYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjOTQyYgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvTWFyay5qYXZhCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Kc3BDb21waWxhdGlvbkNvbnRleHQ7CisKKy8qKgorICogTWFyayByZXByZXNlbnRzIGEgcG9pbnQgaW4gdGhlIEpTUCBpbnB1dC4gCisgKgorICogQGF1dGhvciBBbmlsIEsuIFZpamVuZHJhbgorICovCitmaW5hbCBjbGFzcyBNYXJrIHsKKworICAgIC8vIHBvc2l0aW9uIHdpdGhpbiBjdXJyZW50IHN0cmVhbQorICAgIGludCBjdXJzb3IsIGxpbmUsIGNvbDsKKworICAgIC8vIGRpcmVjdG9yeSBvZiBmaWxlIGZvciBjdXJyZW50IHN0cmVhbQorICAgIFN0cmluZyBiYXNlRGlyOworCisgICAgLy8gY3VycmVudCBzdHJlYW0KKyAgICBjaGFyW10gc3RyZWFtID0gbnVsbDsKKworICAgIC8vIGZpbGVpZCBvZiBjdXJyZW50IHN0cmVhbQorICAgIHByaXZhdGUgaW50IGZpbGVJZDsKKworICAgIC8vIG5hbWUgb2YgdGhlIGN1cnJlbnQgZmlsZQorICAgIHByaXZhdGUgU3RyaW5nIGZpbGVOYW1lOworCisgICAgLyoKKyAgICAgKiBzdGFjayBvZiBzdHJlYW0gYW5kIHN0cmVhbSBzdGF0ZSBvZiBzdHJlYW1zIHRoYXQgaGF2ZSBpbmNsdWRlZAorICAgICAqIGN1cnJlbnQgc3RyZWFtCisgICAgICovCisgICAgcHJpdmF0ZSBTdGFjayBpbmNsdWRlU3RhY2sgPSBudWxsOworCisgICAgLy8gZW5jb2Rpbmcgb2YgY3VycmVudCBmaWxlCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RpbmcgPSBudWxsOworCisgICAgLy8gcmVhZGVyIHRoYXQgb3ducyB0aGlzIG1hcmsgKHNvIHdlIGNhbiBsb29rIHVwIGZpbGVpZCdzKQorICAgIHByaXZhdGUgSnNwUmVhZGVyIHJlYWRlcjsKKworICAgIHByaXZhdGUgSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlciBKc3BSZWFkZXIgdGhpcyBtYXJrIGJlbG9uZ3MgdG8KKyAgICAgKiBAcGFyYW0gaW5TdHJlYW0gY3VycmVudCBzdHJlYW0gZm9yIHRoaXMgbWFyaworICAgICAqIEBwYXJhbSBmaWxlSWQgaWQgb2YgcmVxdWVzdGVkIGpzcCBmaWxlCisgICAgICogQHBhcmFtIG5hbWUgSlNQIGZpbGUgbmFtZQorICAgICAqIEBwYXJhbSBpbkJhc2VEaXIgYmFzZSBkaXJlY3Rvcnkgb2YgcmVxdWVzdGVkIGpzcCBmaWxlCisgICAgICogQHBhcmFtIGluRW5jb2RpbmcgZW5jb2Rpbmcgb2YgY3VycmVudCBmaWxlCisgICAgICovCisgICAgTWFyayhKc3BSZWFkZXIgcmVhZGVyLCBjaGFyW10gaW5TdHJlYW0sIGludCBmaWxlSWQsIFN0cmluZyBuYW1lLAorICAgICAgICAgU3RyaW5nIGluQmFzZURpciwgU3RyaW5nIGluRW5jb2RpbmcpIHsKKworICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlcjsKKyAgICAgICAgdGhpcy5jdHh0ID0gcmVhZGVyLmdldEpzcENvbXBpbGF0aW9uQ29udGV4dCgpOworICAgICAgICB0aGlzLnN0cmVhbSA9IGluU3RyZWFtOworICAgICAgICB0aGlzLmN1cnNvciA9IDA7CisgICAgICAgIHRoaXMubGluZSA9IDE7CisgICAgICAgIHRoaXMuY29sID0gMTsKKyAgICAgICAgdGhpcy5maWxlSWQgPSBmaWxlSWQ7CisgICAgICAgIHRoaXMuZmlsZU5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmJhc2VEaXIgPSBpbkJhc2VEaXI7CisgICAgICAgIHRoaXMuZW5jb2RpbmcgPSBpbkVuY29kaW5nOworICAgICAgICB0aGlzLmluY2x1ZGVTdGFjayA9IG5ldyBTdGFjaygpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBNYXJrKE1hcmsgb3RoZXIpIHsKKworICAgICAgICB0aGlzLnJlYWRlciA9IG90aGVyLnJlYWRlcjsKKyAgICAgICAgdGhpcy5jdHh0ID0gb3RoZXIucmVhZGVyLmdldEpzcENvbXBpbGF0aW9uQ29udGV4dCgpOworICAgICAgICB0aGlzLnN0cmVhbSA9IG90aGVyLnN0cmVhbTsKKyAgICAgICAgdGhpcy5maWxlSWQgPSBvdGhlci5maWxlSWQ7CisgICAgICAgIHRoaXMuZmlsZU5hbWUgPSBvdGhlci5maWxlTmFtZTsKKyAgICAgICAgdGhpcy5jdXJzb3IgPSBvdGhlci5jdXJzb3I7CisgICAgICAgIHRoaXMubGluZSA9IG90aGVyLmxpbmU7CisgICAgICAgIHRoaXMuY29sID0gb3RoZXIuY29sOworICAgICAgICB0aGlzLmJhc2VEaXIgPSBvdGhlci5iYXNlRGlyOworICAgICAgICB0aGlzLmVuY29kaW5nID0gb3RoZXIuZW5jb2Rpbmc7CisKKyAgICAgICAgLy8gY2xvbmUgaW5jbHVkZVN0YWNrIHdpdGhvdXQgY2xvbmluZyBjb250ZW50cworICAgICAgICBpbmNsdWRlU3RhY2sgPSBuZXcgU3RhY2soKTsKKyAgICAgICAgZm9yICggaW50IGk9MDsgaSA8IG90aGVyLmluY2x1ZGVTdGFjay5zaXplKCk7IGkrKyApIHsKKyAgICAgICAgICAgIGluY2x1ZGVTdGFjay5hZGRFbGVtZW50KCBvdGhlci5pbmNsdWRlU3RhY2suZWxlbWVudEF0KGkpICk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICovICAgIAorICAgIE1hcmsoSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQsIFN0cmluZyBmaWxlbmFtZSwgaW50IGxpbmUsIGludCBjb2wpIHsKKworICAgICAgICB0aGlzLnJlYWRlciA9IG51bGw7CisgICAgICAgIHRoaXMuY3R4dCA9IGN0eHQ7CisgICAgICAgIHRoaXMuc3RyZWFtID0gbnVsbDsKKyAgICAgICAgdGhpcy5jdXJzb3IgPSAwOworICAgICAgICB0aGlzLmxpbmUgPSBsaW5lOworICAgICAgICB0aGlzLmNvbCA9IGNvbDsKKyAgICAgICAgdGhpcy5maWxlSWQgPSAtMTsKKyAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVuYW1lOworICAgICAgICB0aGlzLmJhc2VEaXIgPSAibGUtYmFzZWRpciI7CisgICAgICAgIHRoaXMuZW5jb2RpbmcgPSAibGUtZW5kb2NpbmciOworICAgICAgICB0aGlzLmluY2x1ZGVTdGFjayA9IG51bGw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgbWFyaydzIHN0YXRlIHRvIGEgbmV3IHN0cmVhbS4KKyAgICAgKiBJdCB3aWxsIHN0b3JlIHRoZSBjdXJyZW50IHN0cmVhbSBpbiBpdCdzIGluY2x1ZGVTdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpblN0cmVhbSBuZXcgc3RyZWFtIGZvciBtYXJrCisgICAgICogQHBhcmFtIGluRmlsZUlkIGlkIG9mIG5ldyBmaWxlIGZyb20gd2hpY2ggc3RyZWFtIGNvbWVzIGZyb20KKyAgICAgKiBAcGFyYW0gaW5CYXNlRGlyIGRpcmVjdG9yeSBvZiBmaWxlCisgICAgICogQHBhcmFtIGluRW5jb2RpbmcgZW5jb2Rpbmcgb2YgbmV3IGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXNoU3RyZWFtKGNoYXJbXSBpblN0cmVhbSwgaW50IGluRmlsZUlkLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbkJhc2VEaXIsIFN0cmluZyBpbkVuY29kaW5nKSAKKyAgICB7CisgICAgICAgIC8vIHN0b3JlIGN1cnJlbnQgc3RhdGUgaW4gc3RhY2sKKyAgICAgICAgaW5jbHVkZVN0YWNrLnB1c2gobmV3IEluY2x1ZGVTdGF0ZShjdXJzb3IsIGxpbmUsIGNvbCwgZmlsZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLCBiYXNlRGlyLCAKKwkJCQkJICAgZW5jb2RpbmcsIHN0cmVhbSkgKTsKKworICAgICAgICAvLyBzZXQgbmV3IHZhcmlhYmxlcworICAgICAgICBjdXJzb3IgPSAwOworICAgICAgICBsaW5lID0gMTsKKyAgICAgICAgY29sID0gMTsKKyAgICAgICAgZmlsZUlkID0gaW5GaWxlSWQ7CisgICAgICAgIGZpbGVOYW1lID0gbmFtZTsKKyAgICAgICAgYmFzZURpciA9IGluQmFzZURpcjsKKyAgICAgICAgZW5jb2RpbmcgPSBpbkVuY29kaW5nOworICAgICAgICBzdHJlYW0gPSBpblN0cmVhbTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlc3RvcmVzIHRoaXMgbWFyaydzIHN0YXRlIHRvIGEgcHJldmlvdXNseSBzdG9yZWQgc3RyZWFtLgorICAgICAqIEByZXR1cm4gVGhlIHByZXZpb3VzIE1hcmsgaW5zdGFuY2Ugd2hlbiB0aGUgc3RyZWFtIHdhcyBwdXNoZWQsIG9yIG51bGwKKyAgICAgKiBpZiB0aGVyZSBpcyBubyBwcmV2aW91cyBzdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFyayBwb3BTdHJlYW0oKSB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV0aGluZyB0byBwb3AKKyAgICAgICAgaWYgKCBpbmNsdWRlU3RhY2suc2l6ZSgpIDw9IDAgKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdldCBwcmV2aW91cyBzdGF0ZSBpbiBzdGFjaworICAgICAgICBJbmNsdWRlU3RhdGUgc3RhdGUgPSAoSW5jbHVkZVN0YXRlKSBpbmNsdWRlU3RhY2sucG9wKCApOworCisgICAgICAgIC8vIHNldCBuZXcgdmFyaWFibGVzCisgICAgICAgIGN1cnNvciA9IHN0YXRlLmN1cnNvcjsKKyAgICAgICAgbGluZSA9IHN0YXRlLmxpbmU7CisgICAgICAgIGNvbCA9IHN0YXRlLmNvbDsKKyAgICAgICAgZmlsZUlkID0gc3RhdGUuZmlsZUlkOworICAgICAgICBmaWxlTmFtZSA9IHN0YXRlLmZpbGVOYW1lOworICAgICAgICBiYXNlRGlyID0gc3RhdGUuYmFzZURpcjsKKyAgICAgICAgc3RyZWFtID0gc3RhdGUuc3RyZWFtOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIExvY2F0b3IgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7CisgICAgICAgIHJldHVybiBsaW5lOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkgeworICAgICAgICByZXR1cm4gY29sOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7CisgICAgICAgIHJldHVybiBnZXRGaWxlKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gZ2V0RmlsZSgpKyIoIitsaW5lKyIsIitjb2wrIikiOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZmlsZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZSB3aXRoIHdoaWNoIHRoaXMgTWFyayBpcyBhc3NvY2lhdGVkCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFVSTCBvZiB0aGUgcmVzb3VyY2Ugd2l0aCB3aGljaCB0aGlzIE1hcmsgaXMgYXNzb2NpYXRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgdGhlIHJlc291cmNlIHBhdGhuYW1lIGlzIGluY29ycmVjdAorICAgICAqLworICAgIHB1YmxpYyBVUkwgZ2V0VVJMKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjdHh0LmdldFJlc291cmNlKGdldEZpbGUoKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1Nob3J0U3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIigiK2xpbmUrIiwiK2NvbCsiKSI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworCWlmIChvdGhlciBpbnN0YW5jZW9mIE1hcmspIHsKKwkgICAgTWFyayBtID0gKE1hcmspIG90aGVyOworCSAgICByZXR1cm4gdGhpcy5yZWFkZXIgPT0gbS5yZWFkZXIgJiYgdGhpcy5maWxlSWQgPT0gbS5maWxlSWQgCisJCSYmIHRoaXMuY3Vyc29yID09IG0uY3Vyc29yICYmIHRoaXMubGluZSA9PSBtLmxpbmUgCisJCSYmIHRoaXMuY29sID09IG0uY29sOworCX0gCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIE1hcmsgaXMgZ3JlYXRoZXIgdGhhbiB0aGUgPGNvZGU+b3RoZXI8L2NvZGU+CisgICAgICogTWFyaywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzR3JlYXRlcihNYXJrIG90aGVyKSB7CisKKyAgICAgICAgYm9vbGVhbiBncmVhdGVyID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHRoaXMubGluZSA+IG90aGVyLmxpbmUpIHsKKyAgICAgICAgICAgIGdyZWF0ZXIgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGluZSA9PSBvdGhlci5saW5lICYmIHRoaXMuY29sID4gb3RoZXIuY29sKSB7CisgICAgICAgICAgICBncmVhdGVyID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBncmVhdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEtlZXAgdHJhY2sgb2YgcGFyc2VyIGJlZm9yZSBwYXJzaW5nIGFuIGluY2x1ZGVkIGZpbGUuCisgICAgICogVGhpcyBjbGFzcyBrZWVwcyB0cmFjayBvZiB0aGUgcGFyc2VyIGJlZm9yZSB3ZSBzd2l0Y2ggdG8gcGFyc2luZyBhbgorICAgICAqIGluY2x1ZGVkIGZpbGUuIEluIG90aGVyIHdvcmRzLCBpdCdzIHRoZSBwYXJzZXIncyBjb250aW51YXRpb24gdG8gYmUKKyAgICAgKiByZWluc3RhbGxlZCBhZnRlciB0aGUgaW5jbHVkZWQgZmlsZSBwYXJzaW5nIGlzIGRvbmUuCisgICAgICovCisgICAgY2xhc3MgSW5jbHVkZVN0YXRlIHsKKyAgICAgICAgaW50IGN1cnNvciwgbGluZSwgY29sOworICAgICAgICBpbnQgZmlsZUlkOworICAgICAgICBTdHJpbmcgZmlsZU5hbWU7CisgICAgICAgIFN0cmluZyBiYXNlRGlyOworICAgICAgICBTdHJpbmcgZW5jb2Rpbmc7CisgICAgICAgIGNoYXJbXSBzdHJlYW0gPSBudWxsOworCisgICAgICAgIEluY2x1ZGVTdGF0ZShpbnQgaW5DdXJzb3IsIGludCBpbkxpbmUsIGludCBpbkNvbCwgaW50IGluRmlsZUlkLCAKKyAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgaW5CYXNlRGlyLCBTdHJpbmcgaW5FbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBpblN0cmVhbSkgeworICAgICAgICAgICAgY3Vyc29yID0gaW5DdXJzb3I7CisgICAgICAgICAgICBsaW5lID0gaW5MaW5lOworICAgICAgICAgICAgY29sID0gaW5Db2w7CisgICAgICAgICAgICBmaWxlSWQgPSBpbkZpbGVJZDsKKyAgICAgICAgICAgIGZpbGVOYW1lID0gbmFtZTsKKyAgICAgICAgICAgIGJhc2VEaXIgPSBpbkJhc2VEaXI7CisgICAgICAgICAgICBlbmNvZGluZyA9IGluRW5jb2Rpbmc7CisgICAgICAgICAgICBzdHJlYW0gPSBpblN0cmVhbTsKKyAgICAgICAgfQorICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL05vZGUuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMWExNTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL05vZGUuamF2YQpAQCAtMCwwICsxLDIzNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Cb2R5VGFnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5EeW5hbWljQXR0cmlidXRlczsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuSXRlcmF0aW9uVGFnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5TaW1wbGVUYWc7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0F0dHJpYnV0ZUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0RhdGE7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0ZpbGVJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdWYXJpYWJsZUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRyeUNhdGNoRmluYWxseTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVmFyaWFibGVJbmZvOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSmFzcGVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi5UYWdQbHVnaW5Db250ZXh0OworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CisKKworLyoqCisgKiBBbiBpbnRlcm5hbCBkYXRhIHJlcHJlc2VudGF0aW9uIG9mIGEgSlNQIHBhZ2Ugb3IgYSBKU1AgZG9jdWVtZW50IChYTUwpLgorICogQWxzbyBpbmNsdWRlZCBoZXJlIGlzIGEgdmlzaXRvciBjbGFzcyBmb3IgdHJhbnZlcnNpbmcgbm9kZXMuCisgKgorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKiBAYXV0aG9yIEphbiBMdWVoZQorICogQGF1dGhvciBTaGF3biBCYXllcm4KKyAqIEBhdXRob3IgTWFyayBSb3RoCisgKi8KKworYWJzdHJhY3QgY2xhc3MgTm9kZSBpbXBsZW1lbnRzIFRhZ0NvbnN0YW50cyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWYXJpYWJsZUluZm9bXSBaRVJPX1ZBUklBQkxFX0lORk8gPSB7IH07CisgICAgCisgICAgcHJvdGVjdGVkIEF0dHJpYnV0ZXMgYXR0cnM7CisKKyAgICAvLyB4bWxucyBhdHRyaWJ1dGVzIHRoYXQgcmVwcmVzZW50IHRhZyBsaWJyYXJpZXMgKG9ubHkgaW4gWE1MIHN5bnRheCkKKyAgICBwcm90ZWN0ZWQgQXR0cmlidXRlcyB0YWdsaWJBdHRyczsKKworICAgIC8qCisgICAgICogeG1sbnMgYXR0cmlidXRlcyB0aGF0IGRvIG5vdCByZXByZXNlbnQgdGFnIGxpYnJhcmllcworICAgICAqIChvbmx5IGluIFhNTCBzeW50YXgpCisgICAgICovCisgICAgcHJvdGVjdGVkIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRyczsKKworICAgIHByb3RlY3RlZCBOb2RlcyBib2R5OworICAgIHByb3RlY3RlZCBTdHJpbmcgdGV4dDsKKyAgICBwcm90ZWN0ZWQgTWFyayBzdGFydE1hcms7CisgICAgcHJvdGVjdGVkIGludCBiZWdpbkphdmFMaW5lOworICAgIHByb3RlY3RlZCBpbnQgZW5kSmF2YUxpbmU7CisgICAgcHJvdGVjdGVkIE5vZGUgcGFyZW50OworICAgIHByb3RlY3RlZCBOb2RlcyBuYW1lZEF0dHJpYnV0ZU5vZGVzOyAvLyBjYWNoZWQgZm9yIHBlcmZvcm1hbmNlCisgICAgcHJvdGVjdGVkIFN0cmluZyBxTmFtZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsTmFtZTsKKyAgICAvKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbm5lciBjbGFzcyB0byB3aGljaCB0aGUgY29kZXMgZm9yIHRoaXMgbm9kZSBhbmQKKyAgICAgKiBpdHMgYm9keSBhcmUgZ2VuZXJhdGVkLiAgRm9yIGluc3RhbmNlLCBmb3IgPGpzcDpib2R5PiBpbiBmb28uanNwLAorICAgICAqIHRoaXMgaXMgImZvb19qc3BIZWxwZXIiLiAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBmb3IgY29tbXVuaWNhdGluZworICAgICAqIHN1Y2ggaW5mbyBmcm9tIEdlbmVyYXRvciB0byBTbWFwIGdlbmVyYXRvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGlubmVyQ2xhc3NOYW1lOworCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRHVtbXk7CisKKyAgICAvKioKKyAgICAgKiBaZXJvLWFyZyBDb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgTm9kZSgpIHsKKyAgICAgICAgdGhpcy5pc0R1bW15ID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydCBUaGUgbG9jYXRpb24gb2YgdGhlIGpzcCBwYWdlCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgZW5jbG9zaW5nIG5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTm9kZShNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICB0aGlzLnN0YXJ0TWFyayA9IHN0YXJ0OworICAgICAgICB0aGlzLmlzRHVtbXkgPSAoc3RhcnQgPT0gbnVsbCk7CisgICAgICAgIGFkZFRvUGFyZW50KHBhcmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcU5hbWUgVGhlIGFjdGlvbidzIHF1YWxpZmllZCBuYW1lCisgICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgYWN0aW9uJ3MgbG9jYWwgbmFtZQorICAgICAqIEBwYXJhbSBzdGFydCBUaGUgbG9jYXRpb24gb2YgdGhlIGpzcCBwYWdlCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgZW5jbG9zaW5nIG5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTm9kZShTdHJpbmcgcU5hbWUsIFN0cmluZyBsb2NhbE5hbWUsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisgICAgICAgIHRoaXMucU5hbWUgPSBxTmFtZTsKKyAgICAgICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7CisgICAgICAgIHRoaXMuc3RhcnRNYXJrID0gc3RhcnQ7CisgICAgICAgIHRoaXMuaXNEdW1teSA9IChzdGFydCA9PSBudWxsKTsKKyAgICAgICAgYWRkVG9QYXJlbnQocGFyZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgTm9kZXMgcGFyc2VkIGZyb20gc3RhbmRhcmQgc3ludGF4LgorICAgICAqCisgICAgICogQHBhcmFtIHFOYW1lIFRoZSBhY3Rpb24ncyBxdWFsaWZpZWQgbmFtZQorICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIGFjdGlvbidzIGxvY2FsIG5hbWUKKyAgICAgKiBAcGFyYW0gYXR0cnMgVGhlIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbm9kZQorICAgICAqIEBwYXJhbSBzdGFydCBUaGUgbG9jYXRpb24gb2YgdGhlIGpzcCBwYWdlCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgZW5jbG9zaW5nIG5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTm9kZShTdHJpbmcgcU5hbWUsIFN0cmluZyBsb2NhbE5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsIE1hcmsgc3RhcnQsCisgICAgICAgICAgICAgICAgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgdGhpcy5xTmFtZSA9IHFOYW1lOworICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKKyAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzOworICAgICAgICB0aGlzLnN0YXJ0TWFyayA9IHN0YXJ0OworICAgICAgICB0aGlzLmlzRHVtbXkgPSAoc3RhcnQgPT0gbnVsbCk7CisgICAgICAgIGFkZFRvUGFyZW50KHBhcmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIE5vZGVzIHBhcnNlZCBmcm9tIFhNTCBzeW50YXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcU5hbWUgVGhlIGFjdGlvbidzIHF1YWxpZmllZCBuYW1lCisgICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgYWN0aW9uJ3MgbG9jYWwgbmFtZQorICAgICAqIEBwYXJhbSBhdHRycyBUaGUgYWN0aW9uJ3MgYXR0cmlidXRlcyB3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGgKKyAgICAgKiB4bWxucworICAgICAqIEBwYXJhbSBub25UYWdsaWJYbWxuc0F0dHJzIFRoZSBhY3Rpb24ncyB4bWxucyBhdHRyaWJ1dGVzIHRoYXQgZG8gbm90CisgICAgICogcmVwcmVzZW50IHRhZyBsaWJyYXJpZXMKKyAgICAgKiBAcGFyYW0gdGFnbGliQXR0cnMgVGhlIGFjdGlvbidzIHhtbG5zIGF0dHJpYnV0ZXMgdGhhdCByZXByZXNlbnQgdGFnCisgICAgICogbGlicmFyaWVzCisgICAgICogQHBhcmFtIHN0YXJ0IFRoZSBsb2NhdGlvbiBvZiB0aGUganNwIHBhZ2UKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBlbmNsb3Npbmcgbm9kZQorICAgICAqLworICAgIHB1YmxpYyBOb2RlKFN0cmluZyBxTmFtZSwgU3RyaW5nIGxvY2FsTmFtZSwgQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgdGhpcy5xTmFtZSA9IHFOYW1lOworICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKKyAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzOworICAgICAgICB0aGlzLm5vblRhZ2xpYlhtbG5zQXR0cnMgPSBub25UYWdsaWJYbWxuc0F0dHJzOworICAgICAgICB0aGlzLnRhZ2xpYkF0dHJzID0gdGFnbGliQXR0cnM7CisgICAgICAgIHRoaXMuc3RhcnRNYXJrID0gc3RhcnQ7CisgICAgICAgIHRoaXMuaXNEdW1teSA9IChzdGFydCA9PSBudWxsKTsKKyAgICAgICAgYWRkVG9QYXJlbnQocGFyZW50KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHFOYW1lIFRoZSBhY3Rpb24ncyBxdWFsaWZpZWQgbmFtZQorICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIGFjdGlvbidzIGxvY2FsIG5hbWUKKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlCisgICAgICogQHBhcmFtIHN0YXJ0IFRoZSBsb2NhdGlvbiBvZiB0aGUganNwIHBhZ2UKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBlbmNsb3Npbmcgbm9kZQorICAgICAqLworICAgIHB1YmxpYyBOb2RlKFN0cmluZyBxTmFtZSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHRleHQsIE1hcmsgc3RhcnQsCisgICAgICAgICAgICAgICAgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgdGhpcy5xTmFtZSA9IHFOYW1lOworICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKKyAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICAgICAgdGhpcy5zdGFydE1hcmsgPSBzdGFydDsKKyAgICAgICAgdGhpcy5pc0R1bW15ID0gKHN0YXJ0ID09IG51bGwpOworICAgICAgICBhZGRUb1BhcmVudChwYXJlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UU5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnFOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5sb2NhbE5hbWU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZXRzIHRoaXMgTm9kZSdzIGF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKiBJbiB0aGUgY2FzZSBvZiBhIE5vZGUgcGFyc2VkIGZyb20gc3RhbmRhcmQgc3ludGF4LCB0aGlzIG1ldGhvZCByZXR1cm5zCisgICAgICogYWxsIHRoZSBOb2RlJ3MgYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEluIHRoZSBjYXNlIG9mIGEgTm9kZSBwYXJzZWQgZnJvbSBYTUwgc3ludGF4LCB0aGlzIG1ldGhvZCByZXR1cm5zIG9ubHkKKyAgICAgKiB0aG9zZSBhdHRyaWJ1dGVzIHdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB4bWxucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5hdHRyczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEdldHMgdGhpcyBOb2RlJ3MgeG1sbnMgYXR0cmlidXRlcyB0aGF0IHJlcHJlc2VudCB0YWcgbGlicmFyaWVzCisgICAgICogKG9ubHkgbWVhbmluZ2Z1bCBmb3IgTm9kZXMgcGFyc2VkIGZyb20gWE1MIHN5bnRheCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQXR0cmlidXRlcyBnZXRUYWdsaWJBdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gdGhpcy50YWdsaWJBdHRyczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEdldHMgdGhpcyBOb2RlJ3MgeG1sbnMgYXR0cmlidXRlcyB0aGF0IGRvIG5vdCByZXByZXNlbnQgdGFnIGxpYnJhcmllcworICAgICAqIChvbmx5IG1lYW5pbmdmdWwgZm9yIE5vZGVzIHBhcnNlZCBmcm9tIFhNTCBzeW50YXgpCisgICAgICovCisgICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0Tm9uVGFnbGliWG1sbnNBdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5ub25UYWdsaWJYbWxuc0F0dHJzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoQXR0cmlidXRlcyBhdHRycykgeworICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gKGF0dHJzID09IG51bGwpID8gbnVsbCA6IGF0dHJzLmdldFZhbHVlKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYXR0cmlidXRlIHRoYXQgaXMgbm9uIHJlcXVlc3QgdGltZSBleHByZXNzaW9uLCBlaXRoZXIKKyAgICAgKiBmcm9tIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIG5vZGUsIG9yIGZyb20gYSBqc3A6YXR0cmJ1dGUgCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgU3RyaW5nIGF0dHIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShuYW1lKTsKKyAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGF0dHI7CisgICAgICAgIH0KKworICAgICAgICBOYW1lZEF0dHJpYnV0ZSBuYW1lZEF0dHJpYnV0ZSA9IGdldE5hbWVkQXR0cmlidXRlTm9kZShuYW1lKTsKKyAgICAgICAgaWYgKG5hbWVkQXR0cmlidXRlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5hbWVkQXR0cmlidXRlLmdldFRleHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyBhbGwgc3Vibm9kZXMgb2YgdGhpcyBub2RlIGZvciBqc3A6YXR0cmlidXRlIHN0YW5kYXJkCisgICAgICogYWN0aW9ucyB3aXRoIHRoZSBnaXZlbiBuYW1lLCBhbmQgcmV0dXJucyB0aGUgTmFtZWRBdHRyaWJ1dGUgbm9kZQorICAgICAqIG9mIHRoZSBtYXRjaGluZyBuYW1lZCBhdHRyaWJ1dGUsIG5vciBudWxsIGlmIG5vIHN1Y2ggbm9kZSBpcyBmb3VuZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIGFuZCBvbmx5IGJlIGNhbGxlZCBmb3Igbm9kZXMgdGhhdAorICAgICAqIGFjY2VwdCBkeW5hbWljIHJ1bnRpbWUgYXR0cmlidXRlIGV4cHJlc3Npb25zLgorICAgICAqLworICAgIHB1YmxpYyBOYW1lZEF0dHJpYnV0ZSBnZXROYW1lZEF0dHJpYnV0ZU5vZGUoIFN0cmluZyBuYW1lICkgeworICAgICAgICBOYW1lZEF0dHJpYnV0ZSByZXN1bHQgPSBudWxsOworICAgICAgICAKKyAgICAgICAgLy8gTG9vayBmb3IgdGhlIGF0dHJpYnV0ZSBpbiBOYW1lZEF0dHJpYnV0ZSBjaGlsZHJlbgorICAgICAgICBOb2RlcyBub2RlcyA9IGdldE5hbWVkQXR0cmlidXRlTm9kZXMoKTsKKyAgICAgICAgaW50IG51bUNoaWxkTm9kZXMgPSBub2Rlcy5zaXplKCk7CisgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbnVtQ2hpbGROb2RlczsgaSsrICkgeworICAgICAgICAgICAgTmFtZWRBdHRyaWJ1dGUgbmEgPSAoTmFtZWRBdHRyaWJ1dGUpbm9kZXMuZ2V0Tm9kZSggaSApOworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCc6Jyk7CisgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAvLyBxdWFsaWZpZWQgbmFtZQorICAgICAgICAgICAgICAgIGZvdW5kID0gbmEuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSBuYS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBuYTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyBhbGwgc3Vibm9kZXMgb2YgdGhpcyBub2RlIGZvciBqc3A6YXR0cmlidXRlIHN0YW5kYXJkCisgICAgICogYWN0aW9ucywgYW5kIHJldHVybnMgdGhhdCBzZXQgb2Ygbm9kZXMgYXMgYSBOb2RlLk5vZGVzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUG9zc2libHkgZW1wdHkgTm9kZS5Ob2RlcyBvYmplY3QgY29udGFpbmluZyBhbnkganNwOmF0dHJpYnV0ZQorICAgICAqIHN1Ym5vZGVzIG9mIHRoaXMgTm9kZQorICAgICAqLworICAgIHB1YmxpYyBOb2RlLk5vZGVzIGdldE5hbWVkQXR0cmlidXRlTm9kZXMoKSB7CisKKyAgICAgICAgaWYgKG5hbWVkQXR0cmlidXRlTm9kZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWVkQXR0cmlidXRlTm9kZXM7CisgICAgICAgIH0KKworICAgICAgICBOb2RlLk5vZGVzIHJlc3VsdCA9IG5ldyBOb2RlLk5vZGVzKCk7CisgICAgICAgIAorICAgICAgICAvLyBMb29rIGZvciB0aGUgYXR0cmlidXRlIGluIE5hbWVkQXR0cmlidXRlIGNoaWxkcmVuCisgICAgICAgIE5vZGVzIG5vZGVzID0gZ2V0Qm9keSgpOworICAgICAgICBpZiggbm9kZXMgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIGludCBudW1DaGlsZE5vZGVzID0gbm9kZXMuc2l6ZSgpOworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBudW1DaGlsZE5vZGVzOyBpKysgKSB7CisgICAgICAgICAgICAgICAgTm9kZSBuID0gbm9kZXMuZ2V0Tm9kZSggaSApOworICAgICAgICAgICAgICAgIGlmKCBuIGluc3RhbmNlb2YgTmFtZWRBdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoIG4gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoISAobiBpbnN0YW5jZW9mIENvbW1lbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgY2FuIGNvbWUgYmVmb3JlIGpzcDphdHRyaWJ1dGUsIGFuZCBvbmx5CisgICAgICAgICAgICAgICAgICAgIC8vIGpzcDpib2R5IGNhbiBjb21lIGFmdGVyIGl0LgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBuYW1lZEF0dHJpYnV0ZU5vZGVzID0gcmVzdWx0OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTm9kZXMgZ2V0Qm9keSgpIHsKKyAgICAgICAgcmV0dXJuIGJvZHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qm9keShOb2RlcyBib2R5KSB7CisgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFyayBnZXRTdGFydCgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXJ0TWFyazsKKyAgICB9CisKKyAgICBwdWJsaWMgTm9kZSBnZXRQYXJlbnQoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRCZWdpbkphdmFMaW5lKCkgeworICAgICAgICByZXR1cm4gYmVnaW5KYXZhTGluZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCZWdpbkphdmFMaW5lKGludCBiZWdpbikgeworICAgICAgICBiZWdpbkphdmFMaW5lID0gYmVnaW47CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRFbmRKYXZhTGluZSgpIHsKKyAgICAgICAgcmV0dXJuIGVuZEphdmFMaW5lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVuZEphdmFMaW5lKGludCBlbmQpIHsKKyAgICAgICAgZW5kSmF2YUxpbmUgPSBlbmQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEdW1teSgpIHsKKyAgICAgICAgcmV0dXJuIGlzRHVtbXk7CisgICAgfQorCisgICAgcHVibGljIE5vZGUuUm9vdCBnZXRSb290KCkgeworICAgICAgICBOb2RlIG4gPSB0aGlzOworICAgICAgICB3aGlsZSAoIShuIGluc3RhbmNlb2YgTm9kZS5Sb290KSkgeworICAgICAgICAgICAgbiA9IG4uZ2V0UGFyZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChOb2RlLlJvb3QpIG47CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJbm5lckNsYXNzTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGlubmVyQ2xhc3NOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElubmVyQ2xhc3NOYW1lKFN0cmluZyBpY24pIHsKKyAgICAgICAgaW5uZXJDbGFzc05hbWUgPSBpY247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0cyBhbmQgaW52b2tlcyBhIG1ldGhvZCBpbiB0aGUgdmlzaXRvciBjbGFzcyBiYXNlZCBvbiB0aGUgbm9kZQorICAgICAqIHR5cGUuICBUaGlzIGlzIGFic3RyYWN0IGFuZCBzaG91bGQgYmUgb3ZlcnJvZGUgYnkgdGhlIGV4dGVuZGluZyBjbGFzc2VzLgorICAgICAqIEBwYXJhbSB2IFRoZSB2aXNpdG9yIGNsYXNzCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uOworCisKKyAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8vIFByaXZhdGUgdXRpbGl0eSBtZXRob2RzCisKKyAgICAvKgorICAgICAqIEFkZHMgdGhpcyBOb2RlIHRvIHRoZSBib2R5IG9mIHRoZSBnaXZlbiBwYXJlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFRvUGFyZW50KE5vZGUgcGFyZW50KSB7CisgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgICAgICBOb2RlcyBwYXJlbnRCb2R5ID0gcGFyZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnRCb2R5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnRCb2R5ID0gbmV3IE5vZGVzKCk7CisgICAgICAgICAgICAgICAgcGFyZW50LnNldEJvZHkocGFyZW50Qm9keSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJlbnRCb2R5LmFkZCh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIENoaWxkIGNsYXNzZXMKKyAgICAgKi8KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSByb290IG9mIGEgSnNwIHBhZ2Ugb3IgSnNwIGRvY3VtZW50CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb290IGV4dGVuZHMgTm9kZSB7CisKKyAgICAgICAgcHJpdmF0ZSBSb290IHBhcmVudFJvb3Q7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1htbFN5bnRheDsKKworICAgICAgICAvLyBTb3VyY2UgZW5jb2Rpbmcgb2YgdGhlIHBhZ2UgY29udGFpbmluZyB0aGlzIFJvb3QKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGFnZUVuYzsKKyAgICAgICAgCisgICAgICAgIC8vIFBhZ2UgZW5jb2Rpbmcgc3BlY2lmaWVkIGluIEpTUCBjb25maWcgZWxlbWVudAorICAgICAgICBwcml2YXRlIFN0cmluZyBqc3BDb25maWdQYWdlRW5jOworCisgICAgICAgIC8qCisgICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgZGVmYXVsdCBwYWdlIGVuY29kaW5nIGlzIGJlaW5nIHVzZWQgKG9ubHkKKyAgICAgICAgICogYXBwbGljYWJsZSB3aXRoIHN0YW5kYXJkIHN5bnRheCkuCisgICAgICAgICAqCisgICAgICAgICAqIFRydWUgaWYgdGhlIHBhZ2UgZG9lcyBub3QgcHJvdmlkZSBhIHBhZ2UgZGlyZWN0aXZlIHdpdGggYQorICAgICAgICAgKiAnY29udGVudFR5cGUnIGF0dHJpYnV0ZSAob3IgdGhlICdjb250ZW50VHlwZScgYXR0cmlidXRlIGRvZXNuJ3QKKyAgICAgICAgICogaGF2ZSBhIENIQVJTRVQgdmFsdWUpLCB0aGUgcGFnZSBkb2VzIG5vdCBwcm92aWRlIGEgcGFnZSBkaXJlY3RpdmUKKyAgICAgICAgICogd2l0aCBhICdwYWdlRW5jb2RpbmcnIGF0dHJpYnV0ZSwgYW5kIHRoZXJlIGlzIG5vIEpTUCBjb25maWd1cmF0aW9uCisgICAgICAgICAqIGVsZW1lbnQgcGFnZS1lbmNvZGluZyB3aG9zZSBVUkwgcGF0dGVybiBtYXRjaGVzIHRoZSBwYWdlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdFBhZ2VFbmNvZGluZzsKKworICAgICAgICAvKgorICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhbiBlbmNvZGluZyBoYXMgYmVlbiBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiB0aGUKKyAgICAgICAgICogcGFnZSdzIFhNTCBwcm9sb2cgKG9ubHkgdXNlZCBmb3IgcGFnZXMgaW4gWE1MIHN5bnRheCkuCisgICAgICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciBhIHRyYW5zbGF0aW9uIGVycm9yIG11c3QKKyAgICAgICAgICogYmUgcmVwb3J0ZWQgZm9yIGVuY29kaW5nIGNvbmZsaWN0cy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0VuY29kaW5nU3BlY2lmaWVkSW5Qcm9sb2c7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29uc3RydWN0b3IuCisgICAgICAgICAqLworICAgICAgICBSb290KE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50LCBib29sZWFuIGlzWG1sU3ludGF4KSB7CisgICAgICAgICAgICBzdXBlcihzdGFydCwgcGFyZW50KTsKKyAgICAgICAgICAgIHRoaXMuaXNYbWxTeW50YXggPSBpc1htbFN5bnRheDsKKyAgICAgICAgICAgIHRoaXMucU5hbWUgPSBKU1BfUk9PVF9BQ1RJT047CisgICAgICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IFJPT1RfQUNUSU9OOworCisgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IGFuZCBzZXQgdGhlIHBhcmVudCByb290CisgICAgICAgICAgICBOb2RlIHIgPSBwYXJlbnQ7CisgICAgICAgICAgICB3aGlsZSAoKHIgIT0gbnVsbCkgJiYgIShyIGluc3RhbmNlb2YgTm9kZS5Sb290KSkKKyAgICAgICAgICAgICAgICByID0gci5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIHBhcmVudFJvb3QgPSAoTm9kZS5Sb290KSByOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICB2LnZpc2l0KHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNYbWxTeW50YXgoKSB7CisgICAgICAgICAgICByZXR1cm4gaXNYbWxTeW50YXg7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBTZXRzIHRoZSBlbmNvZGluZyBzcGVjaWZpZWQgaW4gdGhlIEpTUCBjb25maWcgZWxlbWVudCB3aG9zZSBVUkwKKyAgICAgICAgICogcGF0dGVybiBtYXRjaGVzIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhpcyBSb290LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0SnNwQ29uZmlnUGFnZUVuY29kaW5nKFN0cmluZyBlbmMpIHsKKyAgICAgICAgICAgIGpzcENvbmZpZ1BhZ2VFbmMgPSBlbmM7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBHZXRzIHRoZSBlbmNvZGluZyBzcGVjaWZpZWQgaW4gdGhlIEpTUCBjb25maWcgZWxlbWVudCB3aG9zZSBVUkwKKyAgICAgICAgICogcGF0dGVybiBtYXRjaGVzIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhpcyBSb290LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRKc3BDb25maWdQYWdlRW5jb2RpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4ganNwQ29uZmlnUGFnZUVuYzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBhZ2VFbmNvZGluZyhTdHJpbmcgZW5jKSB7CisgICAgICAgICAgICBwYWdlRW5jID0gZW5jOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWdlRW5jb2RpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gcGFnZUVuYzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldElzRGVmYXVsdFBhZ2VFbmNvZGluZyhib29sZWFuIGlzRGVmYXVsdCkgeworICAgICAgICAgICAgaXNEZWZhdWx0UGFnZUVuY29kaW5nID0gaXNEZWZhdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0UGFnZUVuY29kaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGlzRGVmYXVsdFBhZ2VFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SXNFbmNvZGluZ1NwZWNpZmllZEluUHJvbG9nKGJvb2xlYW4gaXNTcGVjaWZpZWQpIHsKKyAgICAgICAgICAgIGlzRW5jb2RpbmdTcGVjaWZpZWRJblByb2xvZyA9IGlzU3BlY2lmaWVkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGluZ1NwZWNpZmllZEluUHJvbG9nKCkgeworICAgICAgICAgICAgcmV0dXJuIGlzRW5jb2RpbmdTcGVjaWZpZWRJblByb2xvZzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBlbmNsb3Npbmcgcm9vdCB0byB0aGlzIFJvb3QuIFVzdWFsbHkgcmVwcmVzZW50cyB0aGUKKyAgICAgICAgICogcGFnZSB0aGF0IGluY2x1ZGVzIHRoaXMgb25lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJvb3QgZ2V0UGFyZW50Um9vdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnRSb290OworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIHJvb3Qgb2YgYSBKc3AgZG9jdW1lbnQgKFhNTCBzeW50YXgpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKc3BSb290IGV4dGVuZHMgTm9kZSB7CisKKyAgICAgICAgcHVibGljIEpzcFJvb3QoU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICBzdXBlcihxTmFtZSwgUk9PVF9BQ1RJT04sIGF0dHJzLCBub25UYWdsaWJYbWxuc0F0dHJzLCB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICB2LnZpc2l0KHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIHBhZ2UgZGlyZWN0aXZlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYWdlRGlyZWN0aXZlIGV4dGVuZHMgTm9kZSB7CisKKyAgICAgICAgcHJpdmF0ZSBWZWN0b3IgaW1wb3J0czsKKworICAgICAgICBwdWJsaWMgUGFnZURpcmVjdGl2ZShBdHRyaWJ1dGVzIGF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgdGhpcyhKU1BfUEFHRV9ESVJFQ1RJVkVfQUNUSU9OLCBhdHRycywgbnVsbCwgbnVsbCwgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGFnZURpcmVjdGl2ZShTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyB0YWdsaWJBdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHN1cGVyKHFOYW1lLCBQQUdFX0RJUkVDVElWRV9BQ1RJT04sIGF0dHJzLCBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICAgICAgaW1wb3J0cyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgdi52aXNpdCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXJzZXMgdGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzIG9yIHBhY2thZ2UgbmFtZXMgaW4gdGhlCisgICAgICAgICAqIGdpdmVuIGF0dHJpYnV0ZSB2YWx1ZSBhbmQgYWRkcyBlYWNoIGNvbXBvbmVudCB0byB0aGlzCisgICAgICAgICAqIFBhZ2VEaXJlY3RpdmUncyB2ZWN0b3Igb2YgaW1wb3J0ZWQgY2xhc3NlcyBhbmQgcGFja2FnZXMuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBBIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcgb2YgaW1wb3J0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZEltcG9ydChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgICAgICB3aGlsZSAoKGluZGV4ID0gdmFsdWUuaW5kZXhPZignLCcsIHN0YXJ0KSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpbXBvcnRzLmFkZCh2YWx1ZS5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KS50cmltKCkpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gaW5kZXggKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXJ0ID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBObyBjb21tYSBmb3VuZAorICAgICAgICAgICAgICAgIGltcG9ydHMuYWRkKHZhbHVlLnRyaW0oKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGltcG9ydHMuYWRkKHZhbHVlLnN1YnN0cmluZyhzdGFydCkudHJpbSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaXN0IGdldEltcG9ydHMoKSB7CisgICAgICAgICAgICByZXR1cm4gaW1wb3J0czsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYW4gaW5jbHVkZSBkaXJlY3RpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluY2x1ZGVEaXJlY3RpdmUgZXh0ZW5kcyBOb2RlIHsKKworICAgICAgICBwdWJsaWMgSW5jbHVkZURpcmVjdGl2ZShBdHRyaWJ1dGVzIGF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgdGhpcyhKU1BfSU5DTFVERV9ESVJFQ1RJVkVfQUNUSU9OLCBhdHRycywgbnVsbCwgbnVsbCwgc3RhcnQsCisgICAgICAgICAgICAgICAgIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW5jbHVkZURpcmVjdGl2ZShTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyB0YWdsaWJBdHRycywgTWFyayBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHN1cGVyKHFOYW1lLCBJTkNMVURFX0RJUkVDVElWRV9BQ1RJT04sIGF0dHJzLCBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICB2LnZpc2l0KHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIGN1c3RvbSB0YWdsaWIgZGlyZWN0aXZlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUYWdsaWJEaXJlY3RpdmUgZXh0ZW5kcyBOb2RlIHsKKworICAgICAgICBwdWJsaWMgVGFnbGliRGlyZWN0aXZlKEF0dHJpYnV0ZXMgYXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICBzdXBlcihKU1BfVEFHTElCX0RJUkVDVElWRV9BQ1RJT04sIFRBR0xJQl9ESVJFQ1RJVkVfQUNUSU9OLCBhdHRycywKKyAgICAgICAgICAgICAgICAgIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICB2LnZpc2l0KHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIHRhZyBkaXJlY3RpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRhZ0RpcmVjdGl2ZSBleHRlbmRzIE5vZGUgeworICAgICAgICBwcml2YXRlIFZlY3RvciBpbXBvcnRzOworCisgICAgICAgIHB1YmxpYyBUYWdEaXJlY3RpdmUoQXR0cmlidXRlcyBhdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHRoaXMoSlNQX1RBR19ESVJFQ1RJVkVfQUNUSU9OLCBhdHRycywgbnVsbCwgbnVsbCwgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGFnRGlyZWN0aXZlKFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyB0YWdsaWJBdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHN1cGVyKHFOYW1lLCBUQUdfRElSRUNUSVZFX0FDVElPTiwgYXR0cnMsIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywgc3RhcnQsIHBhcmVudCk7CisgICAgICAgICAgICBpbXBvcnRzID0gbmV3IFZlY3RvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICB2LnZpc2l0KHRoaXMpOworICAgICAgICB9CisgCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXJzZXMgdGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzIG9yIHBhY2thZ2UgbmFtZXMgaW4gdGhlCisgICAgICAgICAqIGdpdmVuIGF0dHJpYnV0ZSB2YWx1ZSBhbmQgYWRkcyBlYWNoIGNvbXBvbmVudCB0byB0aGlzCisgICAgICAgICAqIFBhZ2VEaXJlY3RpdmUncyB2ZWN0b3Igb2YgaW1wb3J0ZWQgY2xhc3NlcyBhbmQgcGFja2FnZXMuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBBIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcgb2YgaW1wb3J0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZEltcG9ydChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgICAgICB3aGlsZSAoKGluZGV4ID0gdmFsdWUuaW5kZXhPZignLCcsIHN0YXJ0KSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpbXBvcnRzLmFkZCh2YWx1ZS5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KS50cmltKCkpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gaW5kZXggKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXJ0ID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBObyBjb21tYSBmb3VuZAorICAgICAgICAgICAgICAgIGltcG9ydHMuYWRkKHZhbHVlLnRyaW0oKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGltcG9ydHMuYWRkKHZhbHVlLnN1YnN0cmluZyhzdGFydCkudHJpbSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorIAorICAgICAgICBwdWJsaWMgTGlzdCBnZXRJbXBvcnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIGltcG9ydHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGFuIGF0dHJpYnV0ZSBkaXJlY3RpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEF0dHJpYnV0ZURpcmVjdGl2ZSBleHRlbmRzIE5vZGUgeworCisgICAgICAgIHB1YmxpYyBBdHRyaWJ1dGVEaXJlY3RpdmUoQXR0cmlidXRlcyBhdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHRoaXMoSlNQX0FUVFJJQlVURV9ESVJFQ1RJVkVfQUNUSU9OLCBhdHRycywgbnVsbCwgbnVsbCwgc3RhcnQsCisgICAgICAgICAgICAgICAgIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQXR0cmlidXRlRGlyZWN0aXZlKFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyB0YWdsaWJBdHRycywgTWFyayBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIocU5hbWUsIEFUVFJJQlVURV9ESVJFQ1RJVkVfQUNUSU9OLCBhdHRycywKKyAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsIHRhZ2xpYkF0dHJzLCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgdi52aXNpdCh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSB2YXJpYWJsZSBkaXJlY3RpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhcmlhYmxlRGlyZWN0aXZlIGV4dGVuZHMgTm9kZSB7CisKKyAgICAgICAgcHVibGljIFZhcmlhYmxlRGlyZWN0aXZlKEF0dHJpYnV0ZXMgYXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICB0aGlzKEpTUF9WQVJJQUJMRV9ESVJFQ1RJVkVfQUNUSU9OLCBhdHRycywgbnVsbCwgbnVsbCwgc3RhcnQsCisgICAgICAgICAgICAgICAgIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVmFyaWFibGVEaXJlY3RpdmUoU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICBzdXBlcihxTmFtZSwgVkFSSUFCTEVfRElSRUNUSVZFX0FDVElPTiwgYXR0cnMsIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHYudmlzaXQodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgPGpzcDppbnZva2U+IHRhZyBmaWxlIGFjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW52b2tlQWN0aW9uIGV4dGVuZHMgTm9kZSB7CisKKyAgICAgICAgcHVibGljIEludm9rZUFjdGlvbihBdHRyaWJ1dGVzIGF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgdGhpcyhKU1BfSU5WT0tFX0FDVElPTiwgYXR0cnMsIG51bGwsIG51bGwsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEludm9rZUFjdGlvbihTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICBzdXBlcihxTmFtZSwgSU5WT0tFX0FDVElPTiwgYXR0cnMsIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHYudmlzaXQodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgPGpzcDpkb0JvZHk+IHRhZyBmaWxlIGFjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRG9Cb2R5QWN0aW9uIGV4dGVuZHMgTm9kZSB7CisKKyAgICAgICAgcHVibGljIERvQm9keUFjdGlvbihBdHRyaWJ1dGVzIGF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgdGhpcyhKU1BfRE9CT0RZX0FDVElPTiwgYXR0cnMsIG51bGwsIG51bGwsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERvQm9keUFjdGlvbihTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICBzdXBlcihxTmFtZSwgRE9CT0RZX0FDVElPTiwgYXR0cnMsIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHYudmlzaXQodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgSnNwIGNvbW1lbnQKKyAgICAgKiBDb21tZW50cyBhcmUga2VwdCBmb3IgY29tcGxldGVuZXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tbWVudCBleHRlbmRzIE5vZGUgeworCisgICAgICAgIHB1YmxpYyBDb21tZW50KFN0cmluZyB0ZXh0LCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIobnVsbCwgbnVsbCwgdGV4dCwgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHYudmlzaXQodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGFuIGV4cHJlc3Npb24sIGRlY2xhcmF0aW9uLCBvciBzY3JpcHRsZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFNjcmlwdGluZ0VsZW1lbnQgZXh0ZW5kcyBOb2RlIHsKKworICAgICAgICBwdWJsaWMgU2NyaXB0aW5nRWxlbWVudChTdHJpbmcgcU5hbWUsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIocU5hbWUsIGxvY2FsTmFtZSwgdGV4dCwgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2NyaXB0aW5nRWxlbWVudChTdHJpbmcgcU5hbWUsIFN0cmluZyBsb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyB0YWdsaWJBdHRycywgTWFyayBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHN1cGVyKHFOYW1lLCBsb2NhbE5hbWUsIG51bGwsIG5vblRhZ2xpYlhtbG5zQXR0cnMsIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogV2hlbiB0aGlzIG5vZGUgd2FzIGNyZWF0ZWQgZnJvbSBhIEpTUCBwYWdlIGluIEpTUCBzeW50YXgsIGl0cyB0ZXh0CisgICAgICAgICAqIHdhcyBzdG9yZWQgYXMgYSBTdHJpbmcgaW4gdGhlICJ0ZXh0IiBmaWVsZCwgd2hlcmVhcyB3aGVuIHRoaXMgbm9kZQorICAgICAgICAgKiB3YXMgY3JlYXRlZCBmcm9tIGEgSlNQIGRvY3VtZW50LCBpdHMgdGV4dCB3YXMgc3RvcmVkIGFzIG9uZSBvciBtb3JlCisgICAgICAgICAqIFRlbXBsYXRlVGV4dCBub2RlcyBpbiBpdHMgYm9keS4gVGhpcyBtZXRob2QgaGFuZGxlcyBlaXRoZXIgY2FzZS4KKyAgICAgICAgICogQHJldHVybiBUaGUgdGV4dCBzdHJpbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXQgPSB0ZXh0OworICAgICAgICAgICAgaWYgKChyZXQgPT0gbnVsbCkgJiYgKGJvZHkgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxib2R5LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYm9keS5nZXROb2RlKGkpLmdldFRleHQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldCA9IGJ1Zi50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGb3IgdGhlIHNhbWUgcmVhc29uIGFzIGFib3ZlLCB0aGUgc291cmNlIGxpbmUgaW5mb3JtYXRpb24gaW4gdGhlCisgICAgICAgICAqIGNvbnRhaW5lZCBUZW1wbGF0ZVRleHQgbm9kZSBzaG91bGQgYmUgdXNlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNYXJrIGdldFN0YXJ0KCkgeworICAgICAgICAgICAgaWYgKHRleHQgPT0gbnVsbCAmJiBib2R5ICE9IG51bGwgJiYgYm9keS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJvZHkuZ2V0Tm9kZSgwKS5nZXRTdGFydCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBkZWNsYXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVjbGFyYXRpb24gZXh0ZW5kcyBTY3JpcHRpbmdFbGVtZW50IHsKKworICAgICAgICBwdWJsaWMgRGVjbGFyYXRpb24oU3RyaW5nIHRleHQsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICBzdXBlcihKU1BfREVDTEFSQVRJT05fQUNUSU9OLCBERUNMQVJBVElPTl9BQ1RJT04sIHRleHQsIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgcGFyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEZWNsYXJhdGlvbihTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsIE1hcmsgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIocU5hbWUsIERFQ0xBUkFUSU9OX0FDVElPTiwgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgdi52aXNpdCh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbi4gIEV4cHJlc3Npb25zIGluIGF0dHJpYnV0ZXMgYXJlIGVtYmVkZGVkCisgICAgICogaW4gdGhlIGF0dHJpYnV0ZSBzdHJpbmcgYW5kIG5vdCBoZXJlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhwcmVzc2lvbiBleHRlbmRzIFNjcmlwdGluZ0VsZW1lbnQgeworCisgICAgICAgIHB1YmxpYyBFeHByZXNzaW9uKFN0cmluZyB0ZXh0LCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIoSlNQX0VYUFJFU1NJT05fQUNUSU9OLCBFWFBSRVNTSU9OX0FDVElPTiwgdGV4dCwgc3RhcnQsCisgICAgICAgICAgICAgICAgICBwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEV4cHJlc3Npb24oU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsIE1hcmsgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICBzdXBlcihxTmFtZSwgRVhQUkVTU0lPTl9BQ1RJT04sIG5vblRhZ2xpYlhtbG5zQXR0cnMsIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHYudmlzaXQodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgc2NyaXB0bGV0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTY3JpcHRsZXQgZXh0ZW5kcyBTY3JpcHRpbmdFbGVtZW50IHsKKworICAgICAgICBwdWJsaWMgU2NyaXB0bGV0KFN0cmluZyB0ZXh0LCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIoSlNQX1NDUklQVExFVF9BQ1RJT04sIFNDUklQVExFVF9BQ1RJT04sIHRleHQsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNjcmlwdGxldChTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLCBNYXJrIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICBzdXBlcihxTmFtZSwgU0NSSVBUTEVUX0FDVElPTiwgbm9uVGFnbGliWG1sbnNBdHRycywgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgdi52aXNpdCh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYW4gRUwgZXhwcmVzc2lvbi4gIEV4cHJlc3Npb25zIGluIGF0dHJpYnV0ZXMgYXJlIGVtYmVkZGVkCisgICAgICogaW4gdGhlIGF0dHJpYnV0ZSBzdHJpbmcgYW5kIG5vdCBoZXJlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRUxFeHByZXNzaW9uIGV4dGVuZHMgTm9kZSB7CisKKyAgICAgICAgcHJpdmF0ZSBFTE5vZGUuTm9kZXMgZWw7CisKKyAgICAgICAgcHVibGljIEVMRXhwcmVzc2lvbihTdHJpbmcgdGV4dCwgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHN1cGVyKG51bGwsIG51bGwsIHRleHQsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICB2LnZpc2l0KHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RUwoRUxOb2RlLk5vZGVzIGVsKSB7CisgICAgICAgICAgICB0aGlzLmVsID0gZWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRUxOb2RlLk5vZGVzIGdldEVMKCkgeworICAgICAgICAgICAgcmV0dXJuIGVsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIHBhcmFtIGFjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1BY3Rpb24gZXh0ZW5kcyBOb2RlIHsKKworICAgICAgICBKc3BBdHRyaWJ1dGUgdmFsdWU7CisKKyAgICAgICAgcHVibGljIFBhcmFtQWN0aW9uKEF0dHJpYnV0ZXMgYXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICB0aGlzKEpTUF9QQVJBTV9BQ1RJT04sIGF0dHJzLCBudWxsLCBudWxsLCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQYXJhbUFjdGlvbihTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIocU5hbWUsIFBBUkFNX0FDVElPTiwgYXR0cnMsIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHYudmlzaXQodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShKc3BBdHRyaWJ1dGUgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKc3BBdHRyaWJ1dGUgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgcGFyYW1zIGFjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1zQWN0aW9uIGV4dGVuZHMgTm9kZSB7CisKKyAgICAgICAgcHVibGljIFBhcmFtc0FjdGlvbihNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgdGhpcyhKU1BfUEFSQU1TX0FDVElPTiwgbnVsbCwgbnVsbCwgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGFyYW1zQWN0aW9uKFN0cmluZyBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIocU5hbWUsIFBBUkFNU19BQ1RJT04sIG51bGwsIG5vblRhZ2xpYlhtbG5zQXR0cnMsIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHYudmlzaXQodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgZmFsbGJhY2sgYWN0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWxsQmFja0FjdGlvbiBleHRlbmRzIE5vZGUgeworCisgICAgICAgIHB1YmxpYyBGYWxsQmFja0FjdGlvbihNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgdGhpcyhKU1BfRkFMTEJBQ0tfQUNUSU9OLCBudWxsLCBudWxsLCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGYWxsQmFja0FjdGlvbihTdHJpbmcgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLCBNYXJrIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHN1cGVyKHFOYW1lLCBGQUxMQkFDS19BQ1RJT04sIG51bGwsIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHYudmlzaXQodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGFuIGluY2x1ZGUgYWN0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmNsdWRlQWN0aW9uIGV4dGVuZHMgTm9kZSB7CisKKyAgICAgICAgcHJpdmF0ZSBKc3BBdHRyaWJ1dGUgcGFnZTsKKworICAgICAgICBwdWJsaWMgSW5jbHVkZUFjdGlvbihBdHRyaWJ1dGVzIGF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgdGhpcyhKU1BfSU5DTFVERV9BQ1RJT04sIGF0dHJzLCBudWxsLCBudWxsLCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbmNsdWRlQWN0aW9uKFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIocU5hbWUsIElOQ0xVREVfQUNUSU9OLCBhdHRycywgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgdi52aXNpdCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBhZ2UoSnNwQXR0cmlidXRlIHBhZ2UpIHsKKyAgICAgICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSnNwQXR0cmlidXRlIGdldFBhZ2UoKSB7CisgICAgICAgICAgICByZXR1cm4gcGFnZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBmb3J3YXJkIGFjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9yd2FyZEFjdGlvbiBleHRlbmRzIE5vZGUgeworCisgICAgICAgIHByaXZhdGUgSnNwQXR0cmlidXRlIHBhZ2U7CisKKyAgICAgICAgcHVibGljIEZvcndhcmRBY3Rpb24oQXR0cmlidXRlcyBhdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHRoaXMoSlNQX0ZPUldBUkRfQUNUSU9OLCBhdHRycywgbnVsbCwgbnVsbCwgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRm9yd2FyZEFjdGlvbihTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyB0YWdsaWJBdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHN1cGVyKHFOYW1lLCBGT1JXQVJEX0FDVElPTiwgYXR0cnMsIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHYudmlzaXQodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYWdlKEpzcEF0dHJpYnV0ZSBwYWdlKSB7CisgICAgICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpzcEF0dHJpYnV0ZSBnZXRQYWdlKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhZ2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgZ2V0UHJvcGVydHkgYWN0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRQcm9wZXJ0eSBleHRlbmRzIE5vZGUgeworCisgICAgICAgIHB1YmxpYyBHZXRQcm9wZXJ0eShBdHRyaWJ1dGVzIGF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgdGhpcyhKU1BfR0VUX1BST1BFUlRZX0FDVElPTiwgYXR0cnMsIG51bGwsIG51bGwsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEdldFByb3BlcnR5KFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICBzdXBlcihxTmFtZSwgR0VUX1BST1BFUlRZX0FDVElPTiwgYXR0cnMsIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywgc3RhcnQsICBwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICB2LnZpc2l0KHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIHNldFByb3BlcnR5IGFjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2V0UHJvcGVydHkgZXh0ZW5kcyBOb2RlIHsKKworICAgICAgICBwcml2YXRlIEpzcEF0dHJpYnV0ZSB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgU2V0UHJvcGVydHkoQXR0cmlidXRlcyBhdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHRoaXMoSlNQX1NFVF9QUk9QRVJUWV9BQ1RJT04sIGF0dHJzLCBudWxsLCBudWxsLCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXRQcm9wZXJ0eShTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIocU5hbWUsIFNFVF9QUk9QRVJUWV9BQ1RJT04sIGF0dHJzLCBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICB2LnZpc2l0KHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoSnNwQXR0cmlidXRlIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSnNwQXR0cmlidXRlIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIHVzZUJlYW4gYWN0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVc2VCZWFuIGV4dGVuZHMgTm9kZSB7CisKKyAgICAgICAgSnNwQXR0cmlidXRlIGJlYW5OYW1lOworCisgICAgICAgIHB1YmxpYyBVc2VCZWFuKEF0dHJpYnV0ZXMgYXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICB0aGlzKEpTUF9VU0VfQkVBTl9BQ1RJT04sIGF0dHJzLCBudWxsLCBudWxsLCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBVc2VCZWFuKFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLCBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIocU5hbWUsIFVTRV9CRUFOX0FDVElPTiwgYXR0cnMsIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHYudmlzaXQodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRCZWFuTmFtZShKc3BBdHRyaWJ1dGUgYmVhbk5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMuYmVhbk5hbWUgPSBiZWFuTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKc3BBdHRyaWJ1dGUgZ2V0QmVhbk5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gYmVhbk5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgcGx1Z2luIGFjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGx1Z0luIGV4dGVuZHMgTm9kZSB7CisKKyAgICAgICAgcHJpdmF0ZSBKc3BBdHRyaWJ1dGUgd2lkdGg7CisgICAgICAgIHByaXZhdGUgSnNwQXR0cmlidXRlIGhlaWdodDsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBQbHVnSW4oQXR0cmlidXRlcyBhdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHRoaXMoSlNQX1BMVUdJTl9BQ1RJT04sIGF0dHJzLCBudWxsLCBudWxsLCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQbHVnSW4oU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywgQXR0cmlidXRlcyB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIocU5hbWUsIFBMVUdJTl9BQ1RJT04sIGF0dHJzLCBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICB2LnZpc2l0KHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SGVpZ2h0KEpzcEF0dHJpYnV0ZSBoZWlnaHQpIHsKKyAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0V2lkdGgoSnNwQXR0cmlidXRlIHdpZHRoKSB7CisgICAgICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSnNwQXR0cmlidXRlIGdldEhlaWdodCgpIHsKKyAgICAgICAgICAgIHJldHVybiBoZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSnNwQXR0cmlidXRlIGdldFdpZHRoKCkgeworICAgICAgICAgICAgcmV0dXJuIHdpZHRoOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhbiB1bmludGVycHJldGVkIHRhZywgZnJvbSBhIEpzcCBkb2N1bWVudAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVW5pbnRlcnByZXRlZFRhZyBleHRlbmRzIE5vZGUgeworCisgICAgICAgIHByaXZhdGUgSnNwQXR0cmlidXRlW10ganNwQXR0cnM7CisKKyAgICAgICAgcHVibGljIFVuaW50ZXJwcmV0ZWRUYWcoU3RyaW5nIHFOYW1lLCBTdHJpbmcgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICBzdXBlcihxTmFtZSwgbG9jYWxOYW1lLCBhdHRycywgbm9uVGFnbGliWG1sbnNBdHRycywgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgdi52aXNpdCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEpzcEF0dHJpYnV0ZXMoSnNwQXR0cmlidXRlW10ganNwQXR0cnMpIHsKKyAgICAgICAgICAgIHRoaXMuanNwQXR0cnMgPSBqc3BBdHRyczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKc3BBdHRyaWJ1dGVbXSBnZXRKc3BBdHRyaWJ1dGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIGpzcEF0dHJzOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSA8anNwOmVsZW1lbnQ+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSnNwRWxlbWVudCBleHRlbmRzIE5vZGUgeworCisgICAgICAgIHByaXZhdGUgSnNwQXR0cmlidXRlW10ganNwQXR0cnM7CisgICAgICAgIHByaXZhdGUgSnNwQXR0cmlidXRlIG5hbWVBdHRyOworCisgICAgICAgIHB1YmxpYyBKc3BFbGVtZW50KEF0dHJpYnV0ZXMgYXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICB0aGlzKEpTUF9FTEVNRU5UX0FDVElPTiwgYXR0cnMsIG51bGwsIG51bGwsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpzcEVsZW1lbnQoU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICBzdXBlcihxTmFtZSwgRUxFTUVOVF9BQ1RJT04sIGF0dHJzLCBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICB2LnZpc2l0KHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SnNwQXR0cmlidXRlcyhKc3BBdHRyaWJ1dGVbXSBqc3BBdHRycykgeworICAgICAgICAgICAgdGhpcy5qc3BBdHRycyA9IGpzcEF0dHJzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpzcEF0dHJpYnV0ZVtdIGdldEpzcEF0dHJpYnV0ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4ganNwQXR0cnM7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBTZXRzIHRoZSBYTUwtc3R5bGUgJ25hbWUnIGF0dHJpYnV0ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZUF0dHJpYnV0ZShKc3BBdHRyaWJ1dGUgbmFtZUF0dHIpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZUF0dHIgPSBuYW1lQXR0cjsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEdldHMgdGhlIFhNTC1zdHlsZSAnbmFtZScgYXR0cmlidXRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSnNwQXR0cmlidXRlIGdldE5hbWVBdHRyaWJ1dGUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lQXR0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSA8anNwOm91dHB1dD4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKc3BPdXRwdXQgZXh0ZW5kcyBOb2RlIHsKKworICAgICAgICBwdWJsaWMgSnNwT3V0cHV0KFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIocU5hbWUsIE9VVFBVVF9BQ1RJT04sIGF0dHJzLCBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICB2LnZpc2l0KHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sbGVjdGVkIGluZm9ybWF0aW9uIGFib3V0IGNoaWxkIGVsZW1lbnRzLiAgVXNlZCBieSBub2RlcyBsaWtlCisgICAgICogQ3VzdG9tVGFnLCBKc3BCb2R5LCBhbmQgTmFtZWRBdHRyaWJ1dGUuICBUaGUgaW5mb3JtYXRpb24gaXMgCisgICAgICogc2V0IGluIHRoZSBDb2xsZWN0b3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGlsZEluZm8geworICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2NyaXB0bGVzczsgICAgICAgIC8vIHRydWUgaWYgdGhlIHRhZyBhbmQgaXRzIGJvZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250YWluIG5vIHNjcmlwdGluZyBlbGVtZW50cy4KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhhc1VzZUJlYW47CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNJbmNsdWRlQWN0aW9uOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGFzUGFyYW1BY3Rpb247CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNTZXRQcm9wZXJ0eTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhhc1NjcmlwdGluZ1ZhcnM7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U2NyaXB0bGVzcyhib29sZWFuIHMpIHsKKyAgICAgICAgICAgIHNjcmlwdGxlc3MgPSBzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTY3JpcHRsZXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIHNjcmlwdGxlc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRIYXNVc2VCZWFuKGJvb2xlYW4gdSkgeworICAgICAgICAgICAgaGFzVXNlQmVhbiA9IHU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNVc2VCZWFuKCkgeworICAgICAgICAgICAgcmV0dXJuIGhhc1VzZUJlYW47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRIYXNJbmNsdWRlQWN0aW9uKGJvb2xlYW4gaSkgeworICAgICAgICAgICAgaGFzSW5jbHVkZUFjdGlvbiA9IGk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNJbmNsdWRlQWN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGhhc0luY2x1ZGVBY3Rpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRIYXNQYXJhbUFjdGlvbihib29sZWFuIGkpIHsKKyAgICAgICAgICAgIGhhc1BhcmFtQWN0aW9uID0gaTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1BhcmFtQWN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGhhc1BhcmFtQWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SGFzU2V0UHJvcGVydHkoYm9vbGVhbiBzKSB7CisgICAgICAgICAgICBoYXNTZXRQcm9wZXJ0eSA9IHM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTZXRQcm9wZXJ0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBoYXNTZXRQcm9wZXJ0eTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SGFzU2NyaXB0aW5nVmFycyhib29sZWFuIHMpIHsKKyAgICAgICAgICAgIGhhc1NjcmlwdGluZ1ZhcnMgPSBzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzU2NyaXB0aW5nVmFycygpIHsKKyAgICAgICAgICAgIHJldHVybiBoYXNTY3JpcHRpbmdWYXJzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIGN1c3RvbSB0YWcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbVRhZyBleHRlbmRzIE5vZGUgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHVyaTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4OworICAgICAgICBwcml2YXRlIEpzcEF0dHJpYnV0ZVtdIGpzcEF0dHJzOworICAgICAgICBwcml2YXRlIFRhZ0RhdGEgdGFnRGF0YTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGFnSGFuZGxlclBvb2xOYW1lOworICAgICAgICBwcml2YXRlIFRhZ0luZm8gdGFnSW5mbzsKKyAgICAgICAgcHJpdmF0ZSBUYWdGaWxlSW5mbyB0YWdGaWxlSW5mbzsKKyAgICAgICAgcHJpdmF0ZSBDbGFzcyB0YWdIYW5kbGVyQ2xhc3M7CisgICAgICAgIHByaXZhdGUgVmFyaWFibGVJbmZvW10gdmFySW5mb3M7CisgICAgICAgIHByaXZhdGUgaW50IGN1c3RvbU5lc3RpbmdMZXZlbDsKKyAgICAgICAgcHJpdmF0ZSBDaGlsZEluZm8gY2hpbGRJbmZvOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaW1wbGVtZW50c0l0ZXJhdGlvblRhZzsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGltcGxlbWVudHNCb2R5VGFnOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaW1wbGVtZW50c1RyeUNhdGNoRmluYWxseTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGltcGxlbWVudHNTaW1wbGVUYWc7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpbXBsZW1lbnRzRHluYW1pY0F0dHJpYnV0ZXM7CisgICAgICAgIHByaXZhdGUgVmVjdG9yIGF0QmVnaW5TY3JpcHRpbmdWYXJzOworICAgICAgICBwcml2YXRlIFZlY3RvciBhdEVuZFNjcmlwdGluZ1ZhcnM7CisgICAgICAgIHByaXZhdGUgVmVjdG9yIG5lc3RlZFNjcmlwdGluZ1ZhcnM7CisgICAgICAgIHByaXZhdGUgTm9kZS5DdXN0b21UYWcgY3VzdG9tVGFnUGFyZW50OworICAgICAgICBwcml2YXRlIEludGVnZXIgbnVtQ291bnQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiB1c2VUYWdQbHVnaW47CisgICAgICAgIHByaXZhdGUgVGFnUGx1Z2luQ29udGV4dCB0YWdQbHVnaW5Db250ZXh0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZm9sbG93aW5nIHR3byBmaWVsZHMgYXJlIHVzZWQgZm9yIGhvbGRpbmcgdGhlIEphdmEKKyAgICAgICAgICogc2NyaXB0bGV0cyB0aGF0IHRoZSB0YWcgcGx1Z2lucyBtYXkgZ2VuZXJhdGUuICBNZWFuaW5nZnVsCisgICAgICAgICAqIG9ubHkgaWYgdXNlVGFnUGx1Z2luIGlzIHRydWU7CisgICAgICAgICAqIENvdWxkIG1vdmUgdGhlbSBpbnRvIFRhZ1BsdWdpbkNvbnRleHRJbXBsLCBidXQgd2UnbGwgbmVlZAorICAgICAgICAgKiB0byBjYXN0IHRhZ1BsdWdpbkNvbnRleHQgdG8gVGFnUGx1Z2luQ29udGV4dEltcGwgYWxsIHRoZSB0aW1lLi4uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIE5vZGVzIGF0U1RhZzsKKyAgICAgICAgcHJpdmF0ZSBOb2RlcyBhdEVUYWc7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGN1c3RvbSBhY3Rpb24gaW1wbGVtZW50ZWQgYnkgdGFnIGhhbmRsZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ3VzdG9tVGFnKFN0cmluZyBxTmFtZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpLCBBdHRyaWJ1dGVzIGF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUYWdJbmZvIHRhZ0luZm8sIENsYXNzIHRhZ0hhbmRsZXJDbGFzcykgeworICAgICAgICAgICAgdGhpcyhxTmFtZSwgcHJlZml4LCBsb2NhbE5hbWUsIHVyaSwgYXR0cnMsIG51bGwsIG51bGwsIHN0YXJ0LAorICAgICAgICAgICAgICAgICBwYXJlbnQsIHRhZ0luZm8sIHRhZ0hhbmRsZXJDbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgY3VzdG9tIGFjdGlvbiBpbXBsZW1lbnRlZCBieSB0YWcgaGFuZGxlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDdXN0b21UYWcoU3RyaW5nIHFOYW1lLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmksIEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQsIFRhZ0luZm8gdGFnSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyB0YWdIYW5kbGVyQ2xhc3MpIHsKKyAgICAgICAgICAgIHN1cGVyKHFOYW1lLCBsb2NhbE5hbWUsIGF0dHJzLCBub25UYWdsaWJYbWxuc0F0dHJzLCB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgIHN0YXJ0LCBwYXJlbnQpOworCisgICAgICAgICAgICB0aGlzLnVyaSA9IHVyaTsKKyAgICAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworICAgICAgICAgICAgdGhpcy50YWdJbmZvID0gdGFnSW5mbzsKKyAgICAgICAgICAgIHRoaXMudGFnSGFuZGxlckNsYXNzID0gdGFnSGFuZGxlckNsYXNzOworICAgICAgICAgICAgdGhpcy5jdXN0b21OZXN0aW5nTGV2ZWwgPSBtYWtlQ3VzdG9tTmVzdGluZ0xldmVsKCk7CisgICAgICAgICAgICB0aGlzLmNoaWxkSW5mbyA9IG5ldyBDaGlsZEluZm8oKTsKKworICAgICAgICAgICAgdGhpcy5pbXBsZW1lbnRzSXRlcmF0aW9uVGFnID0gCisgICAgICAgICAgICAgICAgSXRlcmF0aW9uVGFnLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGFnSGFuZGxlckNsYXNzKTsKKyAgICAgICAgICAgIHRoaXMuaW1wbGVtZW50c0JvZHlUYWcgPQorICAgICAgICAgICAgICAgIEJvZHlUYWcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0YWdIYW5kbGVyQ2xhc3MpOworICAgICAgICAgICAgdGhpcy5pbXBsZW1lbnRzVHJ5Q2F0Y2hGaW5hbGx5ID0gCisgICAgICAgICAgICAgICAgVHJ5Q2F0Y2hGaW5hbGx5LmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGFnSGFuZGxlckNsYXNzKTsKKyAgICAgICAgICAgIHRoaXMuaW1wbGVtZW50c1NpbXBsZVRhZyA9IAorICAgICAgICAgICAgICAgIFNpbXBsZVRhZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhZ0hhbmRsZXJDbGFzcyk7CisgICAgICAgICAgICB0aGlzLmltcGxlbWVudHNEeW5hbWljQXR0cmlidXRlcyA9IAorICAgICAgICAgICAgICAgIER5bmFtaWNBdHRyaWJ1dGVzLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGFnSGFuZGxlckNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBjdXN0b20gYWN0aW9uIGltcGxlbWVudGVkIGJ5IHRhZyBmaWxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEN1c3RvbVRhZyhTdHJpbmcgcU5hbWUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSwgQXR0cmlidXRlcyBhdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGFnRmlsZUluZm8gdGFnRmlsZUluZm8pIHsKKyAgICAgICAgICAgIHRoaXMocU5hbWUsIHByZWZpeCwgbG9jYWxOYW1lLCB1cmksIGF0dHJzLCBudWxsLCBudWxsLCBzdGFydCwKKyAgICAgICAgICAgICAgICAgcGFyZW50LCB0YWdGaWxlSW5mbyk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgY3VzdG9tIGFjdGlvbiBpbXBsZW1lbnRlZCBieSB0YWcgZmlsZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDdXN0b21UYWcoU3RyaW5nIHFOYW1lLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmksIEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQsIFRhZ0ZpbGVJbmZvIHRhZ0ZpbGVJbmZvKSB7CisKKyAgICAgICAgICAgIHN1cGVyKHFOYW1lLCBsb2NhbE5hbWUsIGF0dHJzLCBub25UYWdsaWJYbWxuc0F0dHJzLCB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgIHN0YXJ0LCBwYXJlbnQpOworCisgICAgICAgICAgICB0aGlzLnVyaSA9IHVyaTsKKyAgICAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworICAgICAgICAgICAgdGhpcy50YWdGaWxlSW5mbyA9IHRhZ0ZpbGVJbmZvOworICAgICAgICAgICAgdGhpcy50YWdJbmZvID0gdGFnRmlsZUluZm8uZ2V0VGFnSW5mbygpOworICAgICAgICAgICAgdGhpcy5jdXN0b21OZXN0aW5nTGV2ZWwgPSBtYWtlQ3VzdG9tTmVzdGluZ0xldmVsKCk7CisgICAgICAgICAgICB0aGlzLmNoaWxkSW5mbyA9IG5ldyBDaGlsZEluZm8oKTsKKworICAgICAgICAgICAgdGhpcy5pbXBsZW1lbnRzSXRlcmF0aW9uVGFnID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLmltcGxlbWVudHNCb2R5VGFnID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLmltcGxlbWVudHNUcnlDYXRjaEZpbmFsbHkgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuaW1wbGVtZW50c1NpbXBsZVRhZyA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmltcGxlbWVudHNEeW5hbWljQXR0cmlidXRlcyA9IHRhZ0luZm8uaGFzRHluYW1pY0F0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgdi52aXNpdCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBVUkkgbmFtZXNwYWNlIHRoYXQgdGhpcyBjdXN0b20gYWN0aW9uIGJlbG9uZ3MgdG8KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMudXJpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHRhZyBwcmVmaXgKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgeworICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEpzcEF0dHJpYnV0ZXMoSnNwQXR0cmlidXRlW10ganNwQXR0cnMpIHsKKyAgICAgICAgICAgIHRoaXMuanNwQXR0cnMgPSBqc3BBdHRyczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKc3BBdHRyaWJ1dGVbXSBnZXRKc3BBdHRyaWJ1dGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIGpzcEF0dHJzOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQ2hpbGRJbmZvIGdldENoaWxkSW5mbygpIHsKKyAgICAgICAgICAgIHJldHVybiBjaGlsZEluZm87CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRhZ0RhdGEoVGFnRGF0YSB0YWdEYXRhKSB7CisgICAgICAgICAgICB0aGlzLnRhZ0RhdGEgPSB0YWdEYXRhOworICAgICAgICAgICAgdGhpcy52YXJJbmZvcyA9IHRhZ0luZm8uZ2V0VmFyaWFibGVJbmZvKHRhZ0RhdGEpOworICAgICAgICAgICAgaWYgKHRoaXMudmFySW5mb3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMudmFySW5mb3MgPSBaRVJPX1ZBUklBQkxFX0lORk87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGFnRGF0YSBnZXRUYWdEYXRhKCkgeworICAgICAgICAgICAgcmV0dXJuIHRhZ0RhdGE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUYWdIYW5kbGVyUG9vbE5hbWUoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHRhZ0hhbmRsZXJQb29sTmFtZSA9IHM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRhZ0hhbmRsZXJQb29sTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0YWdIYW5kbGVyUG9vbE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGFnSW5mbyBnZXRUYWdJbmZvKCkgeworICAgICAgICAgICAgcmV0dXJuIHRhZ0luZm87CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGFnRmlsZUluZm8gZ2V0VGFnRmlsZUluZm8oKSB7CisgICAgICAgICAgICByZXR1cm4gdGFnRmlsZUluZm87CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjdXN0b20gYWN0aW9uIGlzIHN1cHBvcnRlZCBieSBhIHRhZyBmaWxlLAorICAgICAgICAgKiBmYWxzZSBvdGhlcndpc2UKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVGFnRmlsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0YWdGaWxlSW5mbyAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzIGdldFRhZ0hhbmRsZXJDbGFzcygpIHsKKyAgICAgICAgICAgIHJldHVybiB0YWdIYW5kbGVyQ2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUYWdIYW5kbGVyQ2xhc3MoQ2xhc3MgaGMpIHsKKyAgICAgICAgICAgIHRhZ0hhbmRsZXJDbGFzcyA9IGhjOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaW1wbGVtZW50c0l0ZXJhdGlvblRhZygpIHsKKyAgICAgICAgICAgIHJldHVybiBpbXBsZW1lbnRzSXRlcmF0aW9uVGFnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaW1wbGVtZW50c0JvZHlUYWcoKSB7CisgICAgICAgICAgICByZXR1cm4gaW1wbGVtZW50c0JvZHlUYWc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbXBsZW1lbnRzVHJ5Q2F0Y2hGaW5hbGx5KCkgeworICAgICAgICAgICAgcmV0dXJuIGltcGxlbWVudHNUcnlDYXRjaEZpbmFsbHk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbXBsZW1lbnRzU2ltcGxlVGFnKCkgeworICAgICAgICAgICAgcmV0dXJuIGltcGxlbWVudHNTaW1wbGVUYWc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbXBsZW1lbnRzRHluYW1pY0F0dHJpYnV0ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gaW1wbGVtZW50c0R5bmFtaWNBdHRyaWJ1dGVzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRhZ1ZhcmlhYmxlSW5mb1tdIGdldFRhZ1ZhcmlhYmxlSW5mb3MoKSB7CisgICAgICAgICAgICByZXR1cm4gdGFnSW5mby5nZXRUYWdWYXJpYWJsZUluZm9zKCk7CisgICAgICAgICB9CisgCisgICAgICAgIHB1YmxpYyBWYXJpYWJsZUluZm9bXSBnZXRWYXJpYWJsZUluZm9zKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhckluZm9zOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tVGFnUGFyZW50KE5vZGUuQ3VzdG9tVGFnIG4pIHsKKyAgICAgICAgICAgIHRoaXMuY3VzdG9tVGFnUGFyZW50ID0gbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOb2RlLkN1c3RvbVRhZyBnZXRDdXN0b21UYWdQYXJlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21UYWdQYXJlbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXROdW1Db3VudChJbnRlZ2VyIGNvdW50KSB7CisgICAgICAgICAgICB0aGlzLm51bUNvdW50ID0gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW50ZWdlciBnZXROdW1Db3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm51bUNvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U2NyaXB0aW5nVmFycyhWZWN0b3IgdmVjLCBpbnQgc2NvcGUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc2NvcGUpIHsKKyAgICAgICAgICAgIGNhc2UgVmFyaWFibGVJbmZvLkFUX0JFR0lOOgorICAgICAgICAgICAgICAgIHRoaXMuYXRCZWdpblNjcmlwdGluZ1ZhcnMgPSB2ZWM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZhcmlhYmxlSW5mby5BVF9FTkQ6CisgICAgICAgICAgICAgICAgdGhpcy5hdEVuZFNjcmlwdGluZ1ZhcnMgPSB2ZWM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZhcmlhYmxlSW5mby5ORVNURUQ6CisgICAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRTY3JpcHRpbmdWYXJzID0gdmVjOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0cyB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlcyBmb3IgdGhlIGdpdmVuIHNjb3BlIHRoYXQgbmVlZCB0byBiZQorICAgICAgICAgKiBkZWNsYXJlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBWZWN0b3IgZ2V0U2NyaXB0aW5nVmFycyhpbnQgc2NvcGUpIHsKKyAgICAgICAgICAgIFZlY3RvciB2ZWMgPSBudWxsOworCisgICAgICAgICAgICBzd2l0Y2ggKHNjb3BlKSB7CisgICAgICAgICAgICBjYXNlIFZhcmlhYmxlSW5mby5BVF9CRUdJTjoKKyAgICAgICAgICAgICAgICB2ZWMgPSB0aGlzLmF0QmVnaW5TY3JpcHRpbmdWYXJzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWYXJpYWJsZUluZm8uQVRfRU5EOgorICAgICAgICAgICAgICAgIHZlYyA9IHRoaXMuYXRFbmRTY3JpcHRpbmdWYXJzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWYXJpYWJsZUluZm8uTkVTVEVEOgorICAgICAgICAgICAgICAgIHZlYyA9IHRoaXMubmVzdGVkU2NyaXB0aW5nVmFyczsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHZlYzsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEdldHMgdGhpcyBjdXN0b20gdGFnJ3MgY3VzdG9tIG5lc3RpbmcgbGV2ZWwsIHdoaWNoIGlzIGdpdmVuIGFzCisgICAgICAgICAqIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBjdXN0b20gdGFnIGlzIG5lc3RlZCBpbnNpZGUgaXRzZWxmLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRDdXN0b21OZXN0aW5nTGV2ZWwoKSB7CisgICAgICAgICAgICByZXR1cm4gY3VzdG9tTmVzdGluZ0xldmVsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW4gbmFtZSBpcyBvZiB0eXBlCisgICAgICAgICAqIEpzcEZyYWdtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2hlY2tJZkF0dHJpYnV0ZUlzSnNwRnJhZ21lbnQoIFN0cmluZyBuYW1lICkgeworICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKworICAgICAgICAgICAgVGFnQXR0cmlidXRlSW5mb1tdIGF0dHJpYnV0ZXMgPSB0YWdJbmZvLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzW2ldLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW2ldLmlzRnJhZ21lbnQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRVc2VUYWdQbHVnaW4oYm9vbGVhbiB1c2UpIHsKKyAgICAgICAgICAgIHVzZVRhZ1BsdWdpbiA9IHVzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHVzZVRhZ1BsdWdpbigpIHsKKyAgICAgICAgICAgIHJldHVybiB1c2VUYWdQbHVnaW47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUYWdQbHVnaW5Db250ZXh0KFRhZ1BsdWdpbkNvbnRleHQgdGFnUGx1Z2luQ29udGV4dCkgeworICAgICAgICAgICAgdGhpcy50YWdQbHVnaW5Db250ZXh0ID0gdGFnUGx1Z2luQ29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUYWdQbHVnaW5Db250ZXh0IGdldFRhZ1BsdWdpbkNvbnRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gdGFnUGx1Z2luQ29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEF0U1RhZyhOb2RlcyBzVGFnKSB7CisgICAgICAgICAgICBhdFNUYWcgPSBzVGFnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE5vZGVzIGdldEF0U1RhZygpIHsKKyAgICAgICAgICAgIHJldHVybiBhdFNUYWc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEF0RVRhZyhOb2RlcyBlVGFnKSB7CisgICAgICAgICAgICBhdEVUYWcgPSBlVGFnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE5vZGVzIGdldEF0RVRhZygpIHsKKyAgICAgICAgICAgIHJldHVybiBhdEVUYWc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIENvbXB1dGVzIHRoaXMgY3VzdG9tIHRhZydzIGN1c3RvbSBuZXN0aW5nIGxldmVsLCB3aGljaCBjb3JyZXNwb25kcworICAgICAgICAgKiB0byB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgY3VzdG9tIHRhZyBpcyBuZXN0ZWQgaW5zaWRlIGl0c2VsZi4KKyAgICAgICAgICoKKyAgICAgICAgICogRXhhbXBsZToKKyAgICAgICAgICogCisgICAgICAgICAqICA8ZzpoPgorICAgICAgICAgKiAgICA8YTpiPiAtLSBuZXN0aW5nIGxldmVsIDAKKyAgICAgICAgICogICAgICA8YzpkPgorICAgICAgICAgKiAgICAgICAgPGU6Zj4KKyAgICAgICAgICogICAgICAgICAgPGE6Yj4gLS0gbmVzdGluZyBsZXZlbCAxCisgICAgICAgICAqICAgICAgICAgICAgPGE6Yj4gLS0gbmVzdGluZyBsZXZlbCAyCisgICAgICAgICAqICAgICAgICAgICAgPC9hOmI+CisgICAgICAgICAqICAgICAgICAgIDwvYTpiPgorICAgICAgICAgKiAgICAgICAgICA8YTpiPiAtLSBuZXN0aW5nIGxldmVsIDEKKyAgICAgICAgICogICAgICAgICAgPC9hOmI+CisgICAgICAgICAqICAgICAgICA8L2U6Zj4KKyAgICAgICAgICogICAgICA8L2M6ZD4KKyAgICAgICAgICogICAgPC9hOmI+CisgICAgICAgICAqICA8L2c6aD4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gQ3VzdG9tIHRhZydzIG5lc3RpbmcgbGV2ZWwKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaW50IG1ha2VDdXN0b21OZXN0aW5nTGV2ZWwoKSB7CisgICAgICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgICAgICBOb2RlIHAgPSBwYXJlbnQ7CisgICAgICAgICAgICB3aGlsZSAocCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKChwIGluc3RhbmNlb2YgTm9kZS5DdXN0b21UYWcpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBxTmFtZS5lcXVhbHMoKChOb2RlLkN1c3RvbVRhZykgcCkucU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcCA9IHAucGFyZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY3VzdG9tIGFjdGlvbiBoYXMgYW4gZW1wdHkgYm9keSwgYW5kIGZhbHNlCisgICAgICAgICAqIG90aGVyd2lzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQSBjdXN0b20gYWN0aW9uIGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBhbiBlbXB0eSBib2R5IGlmIHRoZSAKKyAgICAgICAgICogZm9sbG93aW5nIGhvbGRzIHRydWU6CisgICAgICAgICAqIC0gZ2V0Qm9keSgpIHJldHVybnMgbnVsbCwgb3IKKyAgICAgICAgICogLSBhbGwgaW1tZWRpYXRlIGNoaWxkcmVuIGFyZSBqc3A6YXR0cmlidXRlIGFjdGlvbnMsIG9yCisgICAgICAgICAqIC0gdGhlIGFjdGlvbidzIGpzcDpib2R5IGlzIGVtcHR5LgorICAgICAgICAgKi8KKyAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0VtcHR5Qm9keSgpIHsKKyAgICAgICAgICAgICBib29sZWFuIGhhc0VtcHR5Qm9keSA9IHRydWU7CisgICAgICAgICAgICAgTm9kZXMgbm9kZXMgPSBnZXRCb2R5KCk7CisgICAgICAgICAgICAgaWYgKG5vZGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgaW50IG51bUNoaWxkTm9kZXMgPSBub2Rlcy5zaXplKCk7CisgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1DaGlsZE5vZGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgIE5vZGUgbiA9IG5vZGVzLmdldE5vZGUoaSk7CisgICAgICAgICAgICAgICAgICAgICBpZiAoIShuIGluc3RhbmNlb2YgTmFtZWRBdHRyaWJ1dGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBKc3BCb2R5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0VtcHR5Qm9keSA9IChuLmdldEJvZHkoKSA9PSBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNFbXB0eUJvZHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICByZXR1cm4gaGFzRW1wdHlCb2R5OworICAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGV2YWx1YXRpb24gY29kZSBvZiBhIGN1c3RvbSBhY3Rpb24KKyAgICAgKiBhdHRyaWJ1dGUgKHVzZWQgYnkgdGhlIHRhZyBwbHVnaW4gbWFjaGluZXJ5IG9ubHkpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXR0cmlidXRlR2VuZXJhdG9yIGV4dGVuZHMgTm9kZSB7CisgICAgICAgIFN0cmluZyBuYW1lOyAgICAgICAgLy8gbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICAgIEN1c3RvbVRhZyB0YWc7ICAgICAgICAvLyBUaGUgdGFnIHRoaXMgYXR0cmlidXRlIGJlbG9uZ3MgdG8KKworICAgICAgICBwdWJsaWMgQXR0cmlidXRlR2VuZXJhdG9yKE1hcmsgc3RhcnQsIFN0cmluZyBuYW1lLCBDdXN0b21UYWcgdGFnKSB7CisgICAgICAgICAgICBzdXBlcihzdGFydCwgbnVsbCk7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdGhpcy50YWcgPSB0YWc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHYudmlzaXQodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDdXN0b21UYWcgZ2V0VGFnKCkgeworICAgICAgICAgICAgcmV0dXJuIHRhZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIGJvZHkgb2YgYSAmbHQ7anNwOnRleHQmZ3Q7IGVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpzcFRleHQgZXh0ZW5kcyBOb2RlIHsKKworICAgICAgICBwdWJsaWMgSnNwVGV4dChTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyB0YWdsaWJBdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHN1cGVyKHFOYW1lLCBURVhUX0FDVElPTiwgbnVsbCwgbm9uVGFnbGliWG1sbnNBdHRycywgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgdi52aXNpdCh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBOYW1lZCBBdHRyaWJ1dGUgKCZsdDtqc3A6YXR0cmlidXRlJmd0OykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5hbWVkQXR0cmlidXRlIGV4dGVuZHMgTm9kZSB7CisKKyAgICAgICAgLy8gQSB1bmlxdWUgdGVtcG9yYXJ5IHZhcmlhYmxlIG5hbWUgc3VpdGFibGUgZm9yIGNvZGUgZ2VuZXJhdGlvbgorICAgICAgICBwcml2YXRlIFN0cmluZyB0ZW1wb3JhcnlWYXJpYWJsZU5hbWU7CisKKyAgICAgICAgLy8gVHJ1ZSBpZiB0aGlzIG5vZGUgaXMgdG8gYmUgdHJpbW1lZCwgb3IgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiB0cmltID0gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgQ2hpbGRJbmZvIGNoaWxkSW5mbzsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxOYW1lOworICAgICAgICBwcml2YXRlIFN0cmluZyBwcmVmaXg7CisKKyAgICAgICAgcHVibGljIE5hbWVkQXR0cmlidXRlKEF0dHJpYnV0ZXMgYXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICB0aGlzKEpTUF9BVFRSSUJVVEVfQUNUSU9OLCBhdHRycywgbnVsbCwgbnVsbCwgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTmFtZWRBdHRyaWJ1dGUoU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisKKyAgICAgICAgICAgIHN1cGVyKHFOYW1lLCBBVFRSSUJVVEVfQUNUSU9OLCBhdHRycywgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgICAgIGlmKCAiZmFsc2UiLmVxdWFscyggdGhpcy5nZXRBdHRyaWJ1dGVWYWx1ZSggInRyaW0iICkgKSApIHsKKyAgICAgICAgICAgICAgICAvLyAoaWYgbnVsbCBvciB0cnVlLCBsZWF2ZSBkZWZhdWx0IG9mIHRydWUpCisgICAgICAgICAgICAgICAgdHJpbSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hpbGRJbmZvID0gbmV3IENoaWxkSW5mbygpOworICAgICAgICAgICAgbmFtZSA9IHRoaXMuZ2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiKTsKKyAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBNYW5kYXRhcnkgYXR0cmlidXRlICJuYW1lIiB3aWxsIGJlIGNoZWNrZWQgaW4gVmFsaWRhdG9yCisgICAgICAgICAgICAgICAgbG9jYWxOYW1lID0gbmFtZTsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoJzonKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUgPSBuYW1lLnN1YnN0cmluZyhpbmRleCsxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHYudmlzaXQodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnByZWZpeDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIENoaWxkSW5mbyBnZXRDaGlsZEluZm8oKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZEluZm87CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1RyaW0oKSB7CisgICAgICAgICAgICByZXR1cm4gdHJpbTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIEEgdW5pcXVlIHRlbXBvcmFyeSB2YXJpYWJsZSBuYW1lIHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uCisgICAgICAgICAqICAgICAgKHRoaXMgcHJvYmFibHkgY291bGQgZ28gZWxzZXdoZXJlLCBidXQgaXQncyBjb252ZW5pZW50IGhlcmUpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpIHsKKyAgICAgICAgICAgIGlmICh0ZW1wb3JhcnlWYXJpYWJsZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRlbXBvcmFyeVZhcmlhYmxlTmFtZSA9IEpzcFV0aWwubmV4dFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRlbXBvcmFyeVZhcmlhYmxlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgYXR0cmlidXRlIHZhbHVlIGZyb20gdGhpcyBuYW1lZCBhdHRyaWJ1dGUgKDxqc3A6YXR0cmlidXRlPikuCisgICAgICAgICAqIFNpbmNlIHRoaXMgbWV0aG9kIGlzIG9ubHkgZm9yIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm90IHJ0ZXhwciwKKyAgICAgICAgICogd2UgY2FuIGFzc3VtZSB0aGUgYm9keSBvZiB0aGUganNwOmF0dHJpYnV0ZSBpcyBhIHRlbXBsYXRlIHRleHQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisKKyAgICAgICAgICAgIGNsYXNzIEF0dHJpYnV0ZVZpc2l0b3IgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChUZW1wbGF0ZVRleHQgdHh0KSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZSA9IG5ldyBTdHJpbmcodHh0LmdldFRleHQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0clZhbHVlKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0clZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIEpTUCAyLjAsIGlmIHRoZSBib2R5IG9mIHRoZSA8anNwOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIC8vIGFjdGlvbiBpcyBlbXB0eSwgaXQgaXMgZXF1aXZhbGVudCBvZiBzcGVjaWZ5aW5nICIiIGFzIHRoZSB2YWx1ZQorICAgICAgICAgICAgLy8gb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gIiI7CisgICAgICAgICAgICBpZiAoZ2V0Qm9keSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGVWaXNpdG9yIGF0dHJpYnV0ZVZpc2l0b3IgPSBuZXcgQXR0cmlidXRlVmlzaXRvcigpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGdldEJvZHkoKS52aXNpdChhdHRyaWJ1dGVWaXNpdG9yKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXNwZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZXh0ID0gYXR0cmlidXRlVmlzaXRvci5nZXRBdHRyVmFsdWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgSnNwQm9keSBub2RlICgmbHQ7anNwOmJvZHkmZ3Q7KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSnNwQm9keSBleHRlbmRzIE5vZGUgeworCisgICAgICAgIHByaXZhdGUgQ2hpbGRJbmZvIGNoaWxkSW5mbzsKKworICAgICAgICBwdWJsaWMgSnNwQm9keShNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgdGhpcyhKU1BfQk9EWV9BQ1RJT04sIG51bGwsIG51bGwsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpzcEJvZHkoU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisgICAgICAgICAgICBzdXBlcihxTmFtZSwgQk9EWV9BQ1RJT04sIG51bGwsIG5vblRhZ2xpYlhtbG5zQXR0cnMsIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgc3RhcnQsIHBhcmVudCk7CisgICAgICAgICAgICB0aGlzLmNoaWxkSW5mbyA9IG5ldyBDaGlsZEluZm8oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgdi52aXNpdCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDaGlsZEluZm8gZ2V0Q2hpbGRJbmZvKCkgeworICAgICAgICAgICAgcmV0dXJuIGNoaWxkSW5mbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSB0ZW1wbGF0ZSB0ZXh0IHN0cmluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVtcGxhdGVUZXh0IGV4dGVuZHMgTm9kZSB7CisKKyAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3QgZXh0cmFTbWFwID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgVGVtcGxhdGVUZXh0KFN0cmluZyB0ZXh0LCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIobnVsbCwgbnVsbCwgdGV4dCwgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHYudmlzaXQodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVHJpbSBhbGwgd2hpdGVzcGFjZSBmcm9tIHRoZSBsZWZ0IG9mIHRoZSB0ZW1wbGF0ZSB0ZXh0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBsdHJpbSgpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoKGluZGV4IDwgdGV4dC5sZW5ndGgoKSkgJiYgKHRleHQuY2hhckF0KGluZGV4KSA8PSAnICcpKSB7CisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZyhpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRyaW0gYWxsIHdoaXRlc3BhY2UgZnJvbSB0aGUgcmlnaHQgb2YgdGhlIHRlbXBsYXRlIHRleHQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHJ0cmltKCkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gdGV4dC5sZW5ndGgoKTsKKyAgICAgICAgICAgIHdoaWxlKCAoaW5kZXggPiAwKSAmJiAodGV4dC5jaGFyQXQoaW5kZXgtMSkgPD0gJyAnKSApIHsKKyAgICAgICAgICAgICAgICBpbmRleC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB0ZW1wbGF0ZSB0ZXh0IGNvbnRhaW5zIHdoaXRlc3BhY2Ugb25seS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWxsU3BhY2UoKSB7CisgICAgICAgICAgICBib29sZWFuIGlzQWxsU3BhY2UgPSB0cnVlOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHRleHQubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0ZXh0LmNoYXJBdChpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNBbGxTcGFjZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaXNBbGxTcGFjZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBzb3VyY2UgdG8gSmF2YSBsaW5lIG1hcHBpbmcKKyAgICAgICAgICogQHBhcmFtIHNyY0xpbmUgVGhlIHBvc3Rpb24gb2YgdGhlIHNvdXJjZSBsaW5lLCByZWxhdGl2ZSB0byB0aGUgbGluZQorICAgICAgICAgKiAgICAgICAgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgbm9kZS4gIFRoZSBjb3JyZXNwb25kaW5nIGphdmEgbGluZSBpcworICAgICAgICAgKiAgICAgICAgYXNzdW1lZCB0byBiZSBjb25zZWN1dGl2ZSwgaS5lLiBvbmUgbW9yZSB0aGFuIHRoZSBsYXN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkU21hcChpbnQgc3JjTGluZSkgeworICAgICAgICAgICAgaWYgKGV4dHJhU21hcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXh0cmFTbWFwID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXh0cmFTbWFwLmFkZChuZXcgSW50ZWdlcihzcmNMaW5lKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQXJyYXlMaXN0IGdldEV4dHJhU21hcCgpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRyYVNtYXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogQXV4aWxsYXJ5IGNsYXNzZXMgdXNlZCBpbiBOb2RlCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgcmVxdWVzdCB0aW1lIGV4cHJlc3Npb25zLgorICAgICAqCisgICAgICogQ2FuIGVpdGhlciBiZSBhIHBsYWluIGF0dHJpYnV0ZSwgYW4gYXR0cmlidXRlIHRoYXQgcmVwcmVzZW50cyBhCisgICAgICogcmVxdWVzdCB0aW1lIGV4cHJlc3Npb24gdmFsdWUsIG9yIGEgbmFtZWQgYXR0cmlidXRlIChzcGVjaWZpZWQgdXNpbmcKKyAgICAgKiB0aGUganNwOmF0dHJpYnV0ZSBzdGFuZGFyZCBhY3Rpb24pLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKc3BBdHRyaWJ1dGUgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHFOYW1lOworICAgICAgICBwcml2YXRlIFN0cmluZyB1cmk7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGxvY2FsTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBleHByZXNzaW9uOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZHluYW1pYzsKKyAgICAgICAgcHJpdmF0ZSBFTE5vZGUuTm9kZXMgZWw7CisKKyAgICAgICAgLy8gSWYgdHJ1ZSwgdGhpcyBKc3BBdHRyaWJ1dGUgcmVwcmVzZW50cyBhIDxqc3A6YXR0cmlidXRlPgorICAgICAgICBwcml2YXRlIGJvb2xlYW4gbmFtZWRBdHRyaWJ1dGU7CisgICAgICAgIC8vIFRoZSBub2RlIGluIHRoZSBwYXJzZSB0cmVlIGZvciB0aGUgTmFtZWRBdHRyaWJ1dGUKKyAgICAgICAgcHJpdmF0ZSBOYW1lZEF0dHJpYnV0ZSBuYW1lZEF0dHJpYnV0ZU5vZGU7CisKKyAgICAgICAgSnNwQXR0cmlidXRlKFN0cmluZyBxTmFtZSwgU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHByLCBFTE5vZGUuTm9kZXMgZWwsIGJvb2xlYW4gZHluICkgeworICAgICAgICAgICAgdGhpcy5xTmFtZSA9IHFOYW1lOworICAgICAgICAgICAgdGhpcy51cmkgPSB1cmk7CisgICAgICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHRoaXMubmFtZWRBdHRyaWJ1dGVOb2RlID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHI7CisgICAgICAgICAgICB0aGlzLmVsID0gZWw7CisgICAgICAgICAgICB0aGlzLmR5bmFtaWMgPSBkeW47CisgICAgICAgICAgICB0aGlzLm5hbWVkQXR0cmlidXRlID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgdGhlIEpzcEF0dHJpYnV0ZSByZXByZXNlbnRzIGEKKyAgICAgICAgICogbmFtZWQgYXR0cmlidXRlLiAgSW4gdGhpcyBjYXNlLCB3ZSBoYXZlIHRvIHN0b3JlIHRoZSBub2RlcyBvZgorICAgICAgICAgKiB0aGUgYm9keSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAgICAgKi8KKyAgICAgICAgSnNwQXR0cmlidXRlKE5hbWVkQXR0cmlidXRlIG5hLCBib29sZWFuIGR5bikgeworICAgICAgICAgICAgdGhpcy5xTmFtZSA9IG5hLmdldE5hbWUoKTsKKyAgICAgICAgICAgIHRoaXMubG9jYWxOYW1lID0gbmEuZ2V0TG9jYWxOYW1lKCk7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMubmFtZWRBdHRyaWJ1dGVOb2RlID0gbmE7CisgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuZWwgPSBudWxsOworICAgICAgICAgICAgdGhpcy5keW5hbWljID0gZHluOworICAgICAgICAgICAgdGhpcy5uYW1lZEF0dHJpYnV0ZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIHFOYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAgKiBAcmV0dXJuIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIGxvY2FsTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgICogQHJldHVybiBUaGUgbmFtZXNwYWNlIG9mIHRoZSBhdHRyaWJ1dGUsIG9yIG51bGwgaWYgaW4gdGhlIGRlZmF1bHQKKyAgICAgICAgICogbmFtZXNwYWNlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKKyAgICAgICAgICAgIHJldHVybiB1cmk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT25seSBtYWtlcyBzZW5zZSBpZiBuYW1lZEF0dHJpYnV0ZSBpcyBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUsIG9yIHRoZSBleHByZXNzaW9uIHN0cmluZworICAgICAgICAgKiAgICAgICAgIChzdHJpcHBlZCBvZiAiPCU9IiwgIiU+IiwgIiU9Iiwgb3IgIiUiCisgICAgICAgICAqICAgICAgICAgIGJ1dCBjb250YWluaW5nICIkeyIgYW5kICJ9IiBmb3IgRUwgZXhwcmVzc2lvbnMpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9ubHkgbWFrZXMgc2Vuc2UgaWYgbmFtZWRBdHRyaWJ1dGUgaXMgdHJ1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgbm9kZXMgdGhhdCBldmFsdWF0ZSB0byB0aGUgYm9keSBvZiB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBOYW1lZEF0dHJpYnV0ZSBnZXROYW1lZEF0dHJpYnV0ZU5vZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZWRBdHRyaWJ1dGVOb2RlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgcmVwcmVzZW50cyBhIHRyYWRpdGlvbmFsIHJ0ZXhwcnZhbHVlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cHJlc3Npb24oKSB7CisgICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIHJlcHJlc2VudHMgYSBOYW1lZEF0dHJpYnV0ZSB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTmFtZWRBdHRyaWJ1dGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZWRBdHRyaWJ1dGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gdGhhdCBzaG91bGQKKyAgICAgICAgICogYmUgZmVkIHRvIHRoZSBleHByZXNzaW9uIGludGVycHJldGVyCisgICAgICAgICAqIEByZXR1cm4gZmFsc2UgZm9yIHN0cmluZyBsaXRlcmFscyBvciBydGV4cHJ2YWx1ZXMgdGhhdCBzaG91bGQKKyAgICAgICAgICogbm90IGJlIGludGVycHJldGVkIG9yIHJlZXZhbHVhdGVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VMSW50ZXJwcmV0ZXJJbnB1dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBlbCAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmcgbGl0ZXJhbCBrbm93biBhdCB0cmFuc2xhdGlvbgorICAgICAgICAgKiB0aW1lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNMaXRlcmFsKCkgeworICAgICAgICAgICAgcmV0dXJuICFleHByZXNzaW9uICYmIChlbCAhPSBudWxsKSAmJiAhbmFtZWRBdHRyaWJ1dGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogWFhYCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKSB7CisgICAgICAgICAgICByZXR1cm4gZHluYW1pYzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFTE5vZGUuTm9kZXMgZ2V0RUwoKSB7CisgICAgICAgICAgICByZXR1cm4gZWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBvcmRlcmVkIGxpc3Qgb2YgTm9kZSwgdXNlZCB0byByZXByZXNlbnQgdGhlIGJvZHkgb2YgYW4gZWxlbWVudCwgb3IKKyAgICAgKiBhIGpzcCBwYWdlIG9mIGpzcCBkb2N1bWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vZGVzIHsKKworICAgICAgICBwcml2YXRlIExpc3QgbGlzdDsKKyAgICAgICAgcHJpdmF0ZSBOb2RlLlJvb3Qgcm9vdDsgICAgICAgICAgICAgICAgLy8gbnVsbCBpZiB0aGlzIGlzIG5vdCBhIHBhZ2UKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlZEluQnVmZmVyOworCisgICAgICAgIHB1YmxpYyBOb2RlcygpIHsKKyAgICAgICAgICAgIGxpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTm9kZXMoTm9kZS5Sb290IHJvb3QpIHsKKyAgICAgICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7CisgICAgICAgICAgICBsaXN0ID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgbGlzdC5hZGQocm9vdCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQXBwZW5kcyBhIG5vZGUgdG8gdGhlIGxpc3QKKyAgICAgICAgICogQHBhcmFtIG4gVGhlIG5vZGUgdG8gYWRkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZGQoTm9kZSBuKSB7CisgICAgICAgICAgICBsaXN0LmFkZChuKTsKKyAgICAgICAgICAgIHJvb3QgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIG5vZGUgZnJvbSB0aGUgbGlzdC4KKyAgICAgICAgICogQHBhcmFtIG4gVGhlIG5vZGUgdG8gYmUgcmVtb3ZlZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKE5vZGUgbikgeworICAgICAgICAgICAgbGlzdC5yZW1vdmUobik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVmlzaXQgdGhlIG5vZGVzIGluIHRoZSBsaXN0IHdpdGggdGhlIHN1cHBsaWVkIHZpc2l0b3IKKyAgICAgICAgICogQHBhcmFtIHYgVGhlIHZpc2l0b3IgdXNlZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBOb2RlIG4gPSAoTm9kZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgbi5hY2NlcHQodik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gbGlzdC5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTm9kZSBnZXROb2RlKGludCBpbmRleCkgeworICAgICAgICAgICAgTm9kZSBuID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbiA9IChOb2RlKSBsaXN0LmdldChpbmRleCk7CisgICAgICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBOb2RlLlJvb3QgZ2V0Um9vdCgpIHsKKyAgICAgICAgICAgIHJldHVybiByb290OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZWRJbkJ1ZmZlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWRJbkJ1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZEluQnVmZmVyKGJvb2xlYW4gZykgeworICAgICAgICAgICAgZ2VuZXJhdGVkSW5CdWZmZXIgPSBnOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB2aXNpdG9yIGNsYXNzIGZvciB2aXNpdGluZyB0aGUgbm9kZS4gIFRoaXMgY2xhc3MgYWxzbyBwcm92aWRlcyB0aGUKKyAgICAgKiBkZWZhdWx0IGFjdGlvbiAoaS5lLiBub3ApIGZvciBlYWNoIG9mIHRoZSBjaGlsZCBjbGFzcyBvZiB0aGUgTm9kZS4KKyAgICAgKiBBbiBhY3R1YWwgdmlzaXRvciBzaG91bGQgZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIHN1cHBseSB0aGUgdmlzaXQKKyAgICAgKiBtZXRob2QgZm9yIHRoZSBub2RlcyB0aGF0IGl0IGNhcmVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmlzaXRvciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgcGxhY2UgdG8gcHV0IGFjdGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCisgICAgICAgICAqIGFsbCBub2Rlcy4gT3ZlcnJpZGUgdGhpcyBpbiB0aGUgY2hpbGQgdmlzaXRvciBjbGFzcyBpZiBuZWVkIHRvLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9WaXNpdChOb2RlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZpc2l0IHRoZSBib2R5IG9mIGEgbm9kZSwgdXNpbmcgdGhlIGN1cnJlbnQgdmlzaXRvcgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCb2R5KE5vZGUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobi5nZXRCb2R5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG4uZ2V0Qm9keSgpLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoUm9vdCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvVmlzaXQobik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChKc3BSb290IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9WaXNpdChuKTsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KFBhZ2VEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1Zpc2l0KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoVGFnRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9WaXNpdChuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEluY2x1ZGVEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1Zpc2l0KG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoVGFnbGliRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9WaXNpdChuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEF0dHJpYnV0ZURpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvVmlzaXQobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChWYXJpYWJsZURpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvVmlzaXQobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChDb21tZW50IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9WaXNpdChuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KERlY2xhcmF0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9WaXNpdChuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEV4cHJlc3Npb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1Zpc2l0KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoU2NyaXB0bGV0IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9WaXNpdChuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEVMRXhwcmVzc2lvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvVmlzaXQobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChJbmNsdWRlQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9WaXNpdChuKTsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEZvcndhcmRBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1Zpc2l0KG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoR2V0UHJvcGVydHkgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1Zpc2l0KG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoU2V0UHJvcGVydHkgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1Zpc2l0KG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoUGFyYW1BY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1Zpc2l0KG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoUGFyYW1zQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9WaXNpdChuKTsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEZhbGxCYWNrQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9WaXNpdChuKTsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KFVzZUJlYW4gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1Zpc2l0KG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoUGx1Z0luIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9WaXNpdChuKTsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEN1c3RvbVRhZyBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvVmlzaXQobik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChVbmludGVycHJldGVkVGFnIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9WaXNpdChuKTsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEpzcEVsZW1lbnQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1Zpc2l0KG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoSnNwVGV4dCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvVmlzaXQobik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOYW1lZEF0dHJpYnV0ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvVmlzaXQobik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChKc3BCb2R5IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9WaXNpdChuKTsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEludm9rZUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvVmlzaXQobik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChEb0JvZHlBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1Zpc2l0KG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoVGVtcGxhdGVUZXh0IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9WaXNpdChuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEpzcE91dHB1dCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvVmlzaXQobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChBdHRyaWJ1dGVHZW5lcmF0b3IgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1Zpc2l0KG4pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9QYWdlRGF0YUltcGwuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvUGFnZURhdGFJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5NmFiYQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvUGFnZURhdGFJbXBsLmphdmEKQEAgLTAsMCArMSw3MTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuUGFnZURhdGE7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiA8dHQ+amF2YXguc2VydmxldC5qc3AudGFnZXh0LlBhZ2VEYXRhPC90dD4gd2hpY2gKKyAqIGJ1aWxkcyB0aGUgWE1MIHZpZXcgb2YgYSBnaXZlbiBwYWdlLgorICoKKyAqIFRoZSBYTUwgdmlldyBpcyBidWlsdCBpbiB0d28gcGFzc2VzOgorICoKKyAqIER1cmluZyB0aGUgZmlyc3QgcGFzcywgdGhlIEZpcnN0UGFzc1Zpc2l0b3IgY29sbGVjdHMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlCisgKiB0b3AtbGV2ZWwganNwOnJvb3QgYW5kIHRob3NlIG9mIHRoZSBqc3A6cm9vdCBlbGVtZW50cyBvZiBhbnkgaW5jbHVkZWQKKyAqIHBhZ2VzLCBhbmQgYWRkcyB0aGVtIHRvIHRoZSBqc3A6cm9vdCBlbGVtZW50IG9mIHRoZSBYTUwgdmlldy4KKyAqIEluIGFkZGl0aW9uLCBhbnkgdGFnbGliIGRpcmVjdGl2ZXMgYXJlIGNvbnZlcnRlZCBpbnRvIHhtbG5zOiBhdHRyaWJ1dGVzIGFuZAorICogYWRkZWQgdG8gdGhlIGpzcDpyb290IGVsZW1lbnQgb2YgdGhlIFhNTCB2aWV3LgorICogVGhpcyBwYXNzIGlnbm9yZXMgYW55IG5vZGVzIG90aGVyIHRoYW4gSnNwUm9vdCBhbmQgVGFnbGliRGlyZWN0aXZlLgorICoKKyAqIER1cmluZyB0aGUgc2Vjb25kIHBhc3MsIHRoZSBTZWNvbmRQYXNzVmlzaXRvciBwcm9kdWNlcyB0aGUgWE1MIHZpZXcsIHVzaW5nCisgKiB0aGUgY29tYmluZWQganNwOnJvb3QgYXR0cmlidXRlcyBkZXRlcm1pbmVkIGluIHRoZSBmaXJzdCBwYXNzIGFuZCBhbnkKKyAqIHJlbWFpbmluZyBwYWdlcyBub2RlcyAodGhpcyBwYXNzIGlnbm9yZXMgYW55IEpzcFJvb3QgYW5kIFRhZ2xpYkRpcmVjdGl2ZQorICogbm9kZXMpLgorICoKKyAqIEBhdXRob3IgSmFuIEx1ZWhlCisgKi8KK2NsYXNzIFBhZ2VEYXRhSW1wbCBleHRlbmRzIFBhZ2VEYXRhIGltcGxlbWVudHMgVGFnQ29uc3RhbnRzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVkVSU0lPTiA9ICIyLjAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQV9TVEFSVF9TRUNUSU9OID0gIjwhW0NEQVRBW1xuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfRU5EX1NFQ1RJT04gPSAiXV0+XG4iOworCisgICAgLy8gc3RyaW5nIGJ1ZmZlciB1c2VkIHRvIGJ1aWxkIFhNTCB2aWV3CisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYnVmOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFnZSB0aGUgcGFnZSBub2RlcyBmcm9tIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBYTUwgdmlldworICAgICAqLworICAgIHB1YmxpYyBQYWdlRGF0YUltcGwoTm9kZS5Ob2RlcyBwYWdlLCBDb21waWxlciBjb21waWxlcikKKyAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBGaXJzdCBwYXNzCisgICAgICAgIEZpcnN0UGFzc1Zpc2l0b3IgZmlyc3RQYXNzID0gbmV3IEZpcnN0UGFzc1Zpc2l0b3IocGFnZS5nZXRSb290KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXIuZ2V0UGFnZUluZm8oKSk7CisgICAgICAgIHBhZ2UudmlzaXQoZmlyc3RQYXNzKTsKKworICAgICAgICAvLyBTZWNvbmQgcGFzcworICAgICAgICBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFNlY29uZFBhc3NWaXNpdG9yIHNlY29uZFBhc3MKKyAgICAgICAgICAgID0gbmV3IFNlY29uZFBhc3NWaXNpdG9yKHBhZ2UuZ2V0Um9vdCgpLCBidWYsIGNvbXBpbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RQYXNzLmdldEpzcElkUHJlZml4KCkpOworICAgICAgICBwYWdlLnZpc2l0KHNlY29uZFBhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGlucHV0IHN0cmVhbSBvZiB0aGUgWE1MIHZpZXcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnB1dCBzdHJlYW0gb2YgdGhlIFhNTCB2aWV3CisgICAgICovCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgeworICAgICAgICAvLyBUdXJuIFN0cmluZ0J1ZmZlciBpbnRvIElucHV0U3RyZWFtCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1Zi50b1N0cmluZygpLmdldEJ5dGVzKCJVVEYtOCIpKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpIHsKKyAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHVlZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogRmlyc3QtcGFzcyBWaXNpdG9yIGZvciBKc3BSb290IG5vZGVzIChyZXByZXNlbnRpbmcganNwOnJvb3QgZWxlbWVudHMpCisgICAgICogYW5kIFRhYmxpYkRpcmVjdGl2ZSBub2RlcywgaWdub3JpbmcgYW55IG90aGVyIG5vZGVzLgorICAgICAqCisgICAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBWaXNpdG9yIGlzIHRvIGNvbGxlY3QgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlCisgICAgICogdG9wLWxldmVsIGpzcDpyb290IGFuZCB0aG9zZSBvZiB0aGUganNwOnJvb3QgZWxlbWVudHMgb2YgYW55IGluY2x1ZGVkCisgICAgICogcGFnZXMsIGFuZCBhZGQgdGhlbSB0byB0aGUganNwOnJvb3QgZWxlbWVudCBvZiB0aGUgWE1MIHZpZXcuCisgICAgICogSW4gYWRkaXRpb24sIHRoaXMgVmlzaXRvciBjb252ZXJ0cyBhbnkgdGFnbGliIGRpcmVjdGl2ZXMgaW50byB4bWxuczoKKyAgICAgKiBhdHRyaWJ1dGVzIGFuZCBhZGRzIHRoZW0gdG8gdGhlIGpzcDpyb290IGVsZW1lbnQgb2YgdGhlIFhNTCB2aWV3LgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBGaXJzdFBhc3NWaXNpdG9yCisgICAgICAgICAgICAgICAgZXh0ZW5kcyBOb2RlLlZpc2l0b3IgaW1wbGVtZW50cyBUYWdDb25zdGFudHMgeworCisgICAgICAgIHByaXZhdGUgTm9kZS5Sb290IHJvb3Q7CisgICAgICAgIHByaXZhdGUgQXR0cmlidXRlc0ltcGwgcm9vdEF0dHJzOworICAgICAgICBwcml2YXRlIFBhZ2VJbmZvIHBhZ2VJbmZvOworCisgICAgICAgIC8vIFByZWZpeCBmb3IgdGhlICdpZCcgYXR0cmlidXRlCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGpzcElkUHJlZml4OworCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnN0cnVjdG9yCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRmlyc3RQYXNzVmlzaXRvcihOb2RlLlJvb3Qgcm9vdCwgUGFnZUluZm8gcGFnZUluZm8pIHsKKyAgICAgICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7CisgICAgICAgICAgICB0aGlzLnBhZ2VJbmZvID0gcGFnZUluZm87CisgICAgICAgICAgICB0aGlzLnJvb3RBdHRycyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOworICAgICAgICAgICAgdGhpcy5yb290QXR0cnMuYWRkQXR0cmlidXRlKCIiLCAiIiwgInZlcnNpb24iLCAiQ0RBVEEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTUF9WRVJTSU9OKTsKKyAgICAgICAgICAgIHRoaXMuanNwSWRQcmVmaXggPSAianNwIjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuUm9vdCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgICAgIGlmIChuID09IHJvb3QpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFRvcC1sZXZlbCBwYWdlLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogQWRkCisgICAgICAgICAgICAgICAgICogICB4bWxuczpqc3A9Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiCisgICAgICAgICAgICAgICAgICogYXR0cmlidXRlIG9ubHkgaWYgbm90IGFscmVhZHkgcHJlc2VudC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoIUpTUF9VUkkuZXF1YWxzKHJvb3RBdHRycy5nZXRWYWx1ZSgieG1sbnM6anNwIikpKSB7CisgICAgICAgICAgICAgICAgICAgIHJvb3RBdHRycy5hZGRBdHRyaWJ1dGUoIiIsICIiLCAieG1sbnM6anNwIiwgIkNEQVRBIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU1BfVVJJKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocGFnZUluZm8uaXNKc3BQcmVmaXhIaWphY2tlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICdqc3AnIHByZWZpeCBoYXMgYmVlbiBoaWphY2tlZCwgdGhhdCBpcywgYm91bmQgdG8gYQorICAgICAgICAgICAgICAgICAgICAgKiBuYW1lc3BhY2Ugb3RoZXIgdGhhbiB0aGUgSlNQIG5hbWVzcGFjZS4gVGhpcyBtZWFucyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAqIHdoZW4gYWRkaW5nIGFuICdpZCcgYXR0cmlidXRlIHRvIGVhY2ggZWxlbWVudCwgd2UgY2FuJ3QKKyAgICAgICAgICAgICAgICAgICAgICogdXNlIHRoZSAnanNwJyBwcmVmaXguIFRoZXJlZm9yZSwgY3JlYXRlIGEgbmV3IHByZWZpeCAKKyAgICAgICAgICAgICAgICAgICAgICogKG9uZSB0aGF0IGlzIHVuaXF1ZSBhY3Jvc3MgdGhlIHRyYW5zbGF0aW9uIHVuaXQpIGZvciB1c2UKKyAgICAgICAgICAgICAgICAgICAgICogYnkgdGhlICdpZCcgYXR0cmlidXRlLCBhbmQgYmluZCBpdCB0byB0aGUgSlNQIG5hbWVzcGFjZQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAganNwSWRQcmVmaXggKz0gImpzcCI7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYWdlSW5mby5jb250YWluc1ByZWZpeChqc3BJZFByZWZpeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzcElkUHJlZml4ICs9ICJqc3AiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJvb3RBdHRycy5hZGRBdHRyaWJ1dGUoIiIsICIiLCAieG1sbnM6IiArIGpzcElkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDREFUQSIsIEpTUF9VUkkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlcyhyb290QXR0cnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Kc3BSb290IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgYWRkQXR0cmlidXRlcyhuLmdldFRhZ2xpYkF0dHJpYnV0ZXMoKSk7CisgICAgICAgICAgICBhZGRBdHRyaWJ1dGVzKG4uZ2V0Tm9uVGFnbGliWG1sbnNBdHRyaWJ1dGVzKCkpOworICAgICAgICAgICAgYWRkQXR0cmlidXRlcyhuLmdldEF0dHJpYnV0ZXMoKSk7CisKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnRzIHRhZ2xpYiBkaXJlY3RpdmUgaW50byAieG1sbnM6Li4uIiBhdHRyaWJ1dGUgb2YganNwOnJvb3QKKyAgICAgICAgICogZWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVGFnbGliRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IG4uZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgaWYgKGF0dHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcU5hbWUgPSAieG1sbnM6IiArIGF0dHJzLmdldFZhbHVlKCJwcmVmaXgiKTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEFjY29yZGluZyB0byBqYXZhZG9jcyBvZiBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsLAorICAgICAgICAgICAgICAgICAqIHRoZSBhZGRBdHRyaWJ1dGUgbWV0aG9kIGRvZXMgbm90IGNoZWNrIHRvIHNlZSBpZiB0aGUKKyAgICAgICAgICAgICAgICAgKiBzcGVjaWZpZWQgYXR0cmlidXRlIGlzIGFscmVhZHkgY29udGFpbmVkIGluIHRoZSBsaXN0OiBUaGlzCisgICAgICAgICAgICAgICAgICogaXMgdGhlIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkhCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHJvb3RBdHRycy5nZXRJbmRleChxTmFtZSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gYXR0cnMuZ2V0VmFsdWUoInVyaSIpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gVVJOX0pTUFRMRCArIGxvY2F0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEF0dHJzLmFkZEF0dHJpYnV0ZSgiIiwgIiIsIHFOYW1lLCAiQ0RBVEEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IGF0dHJzLmdldFZhbHVlKCJ0YWdkaXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RBdHRycy5hZGRBdHRyaWJ1dGUoIiIsICIiLCBxTmFtZSwgIkNEQVRBIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJOX0pTUFRBR0RJUiArIGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SnNwSWRQcmVmaXgoKSB7CisgICAgICAgICAgICByZXR1cm4ganNwSWRQcmVmaXg7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYWRkQXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJzKSB7CisgICAgICAgICAgICBpZiAoYXR0cnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBsZW4gPSBhdHRycy5nZXRMZW5ndGgoKTsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxsZW47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcU5hbWUgPSBhdHRycy5nZXRRTmFtZShpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJ2ZXJzaW9uIi5lcXVhbHMocU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIEJ1Z3ppbGxhIDM1MjUyOiBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM1MjUyCisgICAgICAgICAgICAgICAgICAgIGlmKHJvb3RBdHRycy5nZXRJbmRleChxTmFtZSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RBdHRycy5hZGRBdHRyaWJ1dGUoYXR0cnMuZ2V0VVJJKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRMb2NhbE5hbWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRUeXBlKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRWYWx1ZShpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogU2Vjb25kLXBhc3MgVmlzaXRvciByZXNwb25zaWJsZSBmb3IgcHJvZHVjaW5nIFhNTCB2aWV3IGFuZCBhc3NpZ25pbmcKKyAgICAgKiBlYWNoIGVsZW1lbnQgYSB1bmlxdWUganNwOmlkIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgU2Vjb25kUGFzc1Zpc2l0b3IgZXh0ZW5kcyBOb2RlLlZpc2l0b3IKKyAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIFRhZ0NvbnN0YW50cyB7CisKKyAgICAgICAgcHJpdmF0ZSBOb2RlLlJvb3Qgcm9vdDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYnVmOworICAgICAgICBwcml2YXRlIENvbXBpbGVyIGNvbXBpbGVyOworICAgICAgICBwcml2YXRlIFN0cmluZyBqc3BJZFByZWZpeDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJlc2V0RGVmYXVsdE5TID0gZmFsc2U7CisKKyAgICAgICAgLy8gQ3VycmVudCB2YWx1ZSBvZiBqc3A6aWQgYXR0cmlidXRlCisgICAgICAgIHByaXZhdGUgaW50IGpzcElkOworCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnN0cnVjdG9yCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU2Vjb25kUGFzc1Zpc2l0b3IoTm9kZS5Sb290IHJvb3QsIFN0cmluZ0J1ZmZlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlciBjb21waWxlciwgU3RyaW5nIGpzcElkUHJlZml4KSB7CisgICAgICAgICAgICB0aGlzLnJvb3QgPSByb290OworICAgICAgICAgICAgdGhpcy5idWYgPSBidWY7CisgICAgICAgICAgICB0aGlzLmNvbXBpbGVyID0gY29tcGlsZXI7CisgICAgICAgICAgICB0aGlzLmpzcElkUHJlZml4ID0ganNwSWRQcmVmaXg7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBWaXNpdHMgcm9vdCBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Sb290IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG4gPT0gdGhpcy5yb290KSB7CisgICAgICAgICAgICAgICAgLy8gdG9wLWxldmVsIHBhZ2UKKyAgICAgICAgICAgICAgICBhcHBlbmRYbWxQcm9sb2coKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRUYWcobik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzZXREZWZhdWx0TlNTYXZlID0gcmVzZXREZWZhdWx0TlM7CisgICAgICAgICAgICAgICAgaWYgKG4uaXNYbWxTeW50YXgoKSkgeworICAgICAgICAgICAgICAgICAgICByZXNldERlZmF1bHROUyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgICAgICAgICByZXNldERlZmF1bHROUyA9IHJlc2V0RGVmYXVsdE5TU2F2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFZpc2l0cyBqc3A6cm9vdCBlbGVtZW50IG9mIEpTUCBwYWdlIGluIFhNTCBzeW50YXguCisgICAgICAgICAqCisgICAgICAgICAqIEFueSBuZXN0ZWQganNwOnJvb3QgZWxlbWVudHMgKGZyb20gcGFnZXMgaW5jbHVkZWQgdmlhIGFuCisgICAgICAgICAqIGluY2x1ZGUgZGlyZWN0aXZlKSBhcmUgaWdub3JlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSnNwUm9vdCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuUGFnZURpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFwcGVuZFBhZ2VEaXJlY3RpdmUobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkluY2x1ZGVEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBleHBhbmQgaW4gcGxhY2UKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuQ29tbWVudCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIENvbW1lbnRzIGFyZSBpZ25vcmVkIGluIFhNTCB2aWV3CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkRlY2xhcmF0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgYXBwZW5kVGFnKG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5FeHByZXNzaW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgYXBwZW5kVGFnKG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5TY3JpcHRsZXQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBhcHBlbmRUYWcobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkpzcEVsZW1lbnQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBhcHBlbmRUYWcobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkVMRXhwcmVzc2lvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICghbi5nZXRSb290KCkuaXNYbWxTeW50YXgoKSkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjwiKS5hcHBlbmQoSlNQX1RFWFRfQUNUSU9OKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChqc3BJZFByZWZpeCk7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiOmlkPVwiIik7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChqc3BJZCsrKS5hcHBlbmQoIlwiPiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiJHsiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoSnNwVXRpbC5lc2NhcGVYbWwobi5nZXRUZXh0KCkpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKKyAgICAgICAgICAgIGlmICghbi5nZXRSb290KCkuaXNYbWxTeW50YXgoKSkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoSlNQX1RFWFRfQUNUSU9OX0VORCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcbiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5JbmNsdWRlQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgYXBwZW5kVGFnKG4pOworICAgICAgICB9CisgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuRm9yd2FyZEFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFwcGVuZFRhZyhuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuR2V0UHJvcGVydHkgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBhcHBlbmRUYWcobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlNldFByb3BlcnR5IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgYXBwZW5kVGFnKG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5QYXJhbUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFwcGVuZFRhZyhuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuUGFyYW1zQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgYXBwZW5kVGFnKG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5GYWxsQmFja0FjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFwcGVuZFRhZyhuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVXNlQmVhbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFwcGVuZFRhZyhuKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5QbHVnSW4gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBhcHBlbmRUYWcobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLk5hbWVkQXR0cmlidXRlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgYXBwZW5kVGFnKG4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkpzcEJvZHkgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBhcHBlbmRUYWcobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkN1c3RvbVRhZyBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVzZXREZWZhdWx0TlNTYXZlID0gcmVzZXREZWZhdWx0TlM7CisgICAgICAgICAgICBhcHBlbmRUYWcobiwgcmVzZXREZWZhdWx0TlMpOworICAgICAgICAgICAgcmVzZXREZWZhdWx0TlMgPSByZXNldERlZmF1bHROU1NhdmU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlVuaW50ZXJwcmV0ZWRUYWcgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBib29sZWFuIHJlc2V0RGVmYXVsdE5TU2F2ZSA9IHJlc2V0RGVmYXVsdE5TOworICAgICAgICAgICAgYXBwZW5kVGFnKG4sIHJlc2V0RGVmYXVsdE5TKTsKKyAgICAgICAgICAgIHJlc2V0RGVmYXVsdE5TID0gcmVzZXREZWZhdWx0TlNTYXZlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Kc3BUZXh0IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgYXBwZW5kVGFnKG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Eb0JvZHlBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBhcHBlbmRUYWcobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkludm9rZUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFwcGVuZFRhZyhuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVGFnRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgYXBwZW5kVGFnRGlyZWN0aXZlKG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5BdHRyaWJ1dGVEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBhcHBlbmRUYWcobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlZhcmlhYmxlRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgYXBwZW5kVGFnKG4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlRlbXBsYXRlVGV4dCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJZiB0aGUgdGVtcGxhdGUgdGV4dCBjYW1lIGZyb20gYSBKU1AgcGFnZSB3cml0dGVuIGluIEpTUCBzeW50YXgsCisgICAgICAgICAgICAgKiBjcmVhdGUgYSBqc3A6dGV4dCBlbGVtZW50IGZvciBpdCAoSlNQIDUuMy4yKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXBwZW5kVGV4dChuLmdldFRleHQoKSwgIW4uZ2V0Um9vdCgpLmlzWG1sU3ludGF4KCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwZW5kcyB0aGUgZ2l2ZW4gdGFnLCBpbmNsdWRpbmcgaXRzIGJvZHksIHRvIHRoZSBYTUwgdmlldy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBhcHBlbmRUYWcoTm9kZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFwcGVuZFRhZyhuLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBlbmRzIHRoZSBnaXZlbiB0YWcsIGluY2x1ZGluZyBpdHMgYm9keSwgdG8gdGhlIFhNTCB2aWV3LAorICAgICAgICAgKiBhbmQgb3B0aW9uYWxseSByZXNldCBkZWZhdWx0IG5hbWVzcGFjZSB0byAiIiwgaWYgbm9uZSBzcGVjaWZpZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgYXBwZW5kVGFnKE5vZGUgbiwgYm9vbGVhbiBhZGREZWZhdWx0TlMpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIE5vZGUuTm9kZXMgYm9keSA9IG4uZ2V0Qm9keSgpOworICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBuLmdldFRleHQoKTsKKworICAgICAgICAgICAgYnVmLmFwcGVuZCgiPCIpLmFwcGVuZChuLmdldFFOYW1lKCkpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKKworICAgICAgICAgICAgcHJpbnRBdHRyaWJ1dGVzKG4sIGFkZERlZmF1bHROUyk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgICIpLmFwcGVuZChqc3BJZFByZWZpeCkuYXBwZW5kKCI6aWQiKS5hcHBlbmQoIj1cIiIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChqc3BJZCsrKS5hcHBlbmQoIlwiXG4iKTsKKworICAgICAgICAgICAgaWYgKFJPT1RfQUNUSU9OLmVxdWFscyhuLmdldExvY2FsTmFtZSgpKSB8fCBib2R5ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIj5cbiIpOworICAgICAgICAgICAgICAgIGlmIChST09UX0FDVElPTi5lcXVhbHMobi5nZXRMb2NhbE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBpbGVyLmdldENvbXBpbGF0aW9uQ29udGV4dCgpLmlzVGFnRmlsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUYWdEaXJlY3RpdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFBhZ2VEaXJlY3RpdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJvZHkudmlzaXQodGhpcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kVGV4dCh0ZXh0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjwvIiArIG4uZ2V0UU5hbWUoKSArICI+XG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLz5cbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwZW5kcyB0aGUgcGFnZSBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcyB0byB0aGUgWE1MCisgICAgICAgICAqIHZpZXcuCisgICAgICAgICAqCisgICAgICAgICAqIFNpbmNlIHRoZSBpbXBvcnQgYXR0cmlidXRlIG9mIHRoZSBwYWdlIGRpcmVjdGl2ZSBpcyB0aGUgb25seSBwYWdlCisgICAgICAgICAqIGF0dHJpYnV0ZSB0aGF0IGlzIGFsbG93ZWQgdG8gYXBwZWFyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZQorICAgICAgICAgKiBkb2N1bWVudCwgYW5kIHNpbmNlIFhNTCBhbGxvd3Mgb25seSBzaW5nbGUtdmFsdWUgYXR0cmlidXRlcywKKyAgICAgICAgICogdGhlIHZhbHVlcyBvZiBtdWx0aXBsZSBpbXBvcnQgYXR0cmlidXRlcyBtdXN0IGJlIGNvbWJpbmVkIGludG8gb25lLAorICAgICAgICAgKiBzZXBhcmF0ZWQgYnkgY29tbWEuCisgICAgICAgICAqCisgICAgICAgICAqIElmIHRoZSBnaXZlbiBwYWdlIGRpcmVjdGl2ZSBjb250YWlucyBqdXN0ICdjb250ZW50VHlwZScgYW5kL29yCisgICAgICAgICAqICdwYWdlRW5jb2RpbmcnIGF0dHJpYnV0ZXMsIHdlIGlnbm9yZSBpdCwgYXMgd2UndmUgYWxyZWFkeSBhcHBlbmRlZAorICAgICAgICAgKiBhIHBhZ2UgZGlyZWN0aXZlIGNvbnRhaW5pbmcganVzdCB0aGVzZSB0d28gYXR0cmlidXRlcy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBhcHBlbmRQYWdlRGlyZWN0aXZlKE5vZGUuUGFnZURpcmVjdGl2ZSBuKSB7CisgICAgICAgICAgICBib29sZWFuIGFwcGVuZCA9IGZhbHNlOworICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IG4uZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgaW50IGxlbiA9IChhdHRycyA9PSBudWxsKSA/IDAgOiBhdHRycy5nZXRMZW5ndGgoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxsZW47IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IGF0dHJzLmdldFFOYW1lKGkpOworICAgICAgICAgICAgICAgIGlmICghInBhZ2VFbmNvZGluZyIuZXF1YWxzKGF0dHJOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgISJjb250ZW50VHlwZSIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBhcHBlbmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWFwcGVuZCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVmLmFwcGVuZCgiPCIpLmFwcGVuZChuLmdldFFOYW1lKCkpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKKworICAgICAgICAgICAgLy8gYXBwZW5kIGpzcDppZAorICAgICAgICAgICAgYnVmLmFwcGVuZCgiICAiKS5hcHBlbmQoanNwSWRQcmVmaXgpLmFwcGVuZCgiOmlkIikuYXBwZW5kKCI9XCIiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoanNwSWQrKykuYXBwZW5kKCJcIlxuIik7CisKKyAgICAgICAgICAgIC8vIGFwcGVuZCByZW1haW5pbmcgYXR0cmlidXRlcworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gYXR0cnMuZ2V0UU5hbWUoaSk7CisgICAgICAgICAgICAgICAgaWYgKCJpbXBvcnQiLmVxdWFscyhhdHRyTmFtZSkgfHwgImNvbnRlbnRUeXBlIi5lcXVhbHMoYXR0ck5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAicGFnZUVuY29kaW5nIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFBhZ2UgZGlyZWN0aXZlJ3MgJ2ltcG9ydCcgYXR0cmlidXRlIGlzIGNvbnNpZGVyZWQKKyAgICAgICAgICAgICAgICAgICAgICogZnVydGhlciBkb3duLCBhbmQgaXRzICdwYWdlRW5jb2RpbmcnIGFuZCAnY29udGVudFR5cGUnCisgICAgICAgICAgICAgICAgICAgICAqIGF0dHJpYnV0ZXMgYXJlIGlnbm9yZWQsIHNpbmNlIHdlJ3ZlIGFscmVhZHkgYXBwZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgICogYSBuZXcgcGFnZSBkaXJlY3RpdmUgY29udGFpbmluZyBqdXN0IHRoZXNlIHR3bworICAgICAgICAgICAgICAgICAgICAgKiBhdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cnMuZ2V0VmFsdWUoaSk7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiICAiKS5hcHBlbmQoYXR0ck5hbWUpLmFwcGVuZCgiPVwiIik7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChKc3BVdGlsLmdldEV4cHJJblhtbCh2YWx1ZSkpLmFwcGVuZCgiXCJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4uZ2V0SW1wb3J0cygpLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBDb25jYXRlbmF0ZSBuYW1lcyBvZiBpbXBvcnRlZCBjbGFzc2VzL3BhY2thZ2VzCisgICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgTGlzdEl0ZXJhdG9yIGl0ZXIgPSBuLmdldEltcG9ydHMoKS5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiICBpbXBvcnQ9XCIiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKEpzcFV0aWwuZ2V0RXhwckluWG1sKChTdHJpbmcpIGl0ZXIubmV4dCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlwiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIi8+XG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGVuZHMgYSBwYWdlIGRpcmVjdGl2ZSB3aXRoICdwYWdlRW5jb2RpbmcnIGFuZCAnY29udGVudFR5cGUnCisgICAgICAgICAqIGF0dHJpYnV0ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgJ3BhZ2VFbmNvZGluZycgYXR0cmlidXRlIGlzIGhhcmQtY29kZWQKKyAgICAgICAgICogdG8gVVRGLTgsIHdoZXJlYXMgdGhlIHZhbHVlIG9mIHRoZSAnY29udGVudFR5cGUnIGF0dHJpYnV0ZSwgd2hpY2gKKyAgICAgICAgICogaXMgaWRlbnRpY2FsIHRvIHdoYXQgdGhlIGNvbnRhaW5lciB3aWxsIHBhc3MgdG8KKyAgICAgICAgICogU2VydmxldFJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCksIGlzIGRlcml2ZWQgZnJvbSB0aGUgcGFnZUluZm8uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgYXBwZW5kUGFnZURpcmVjdGl2ZSgpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjwiKS5hcHBlbmQoSlNQX1BBR0VfRElSRUNUSVZFX0FDVElPTik7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcbiIpOworCisgICAgICAgICAgICAvLyBhcHBlbmQganNwOmlkCisgICAgICAgICAgICBidWYuYXBwZW5kKCIgICIpLmFwcGVuZChqc3BJZFByZWZpeCkuYXBwZW5kKCI6aWQiKS5hcHBlbmQoIj1cIiIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChqc3BJZCsrKS5hcHBlbmQoIlwiXG4iKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAgIikuYXBwZW5kKCJwYWdlRW5jb2RpbmciKS5hcHBlbmQoIj1cIlVURi04XCJcbiIpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiICAiKS5hcHBlbmQoImNvbnRlbnRUeXBlIikuYXBwZW5kKCI9XCIiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY29tcGlsZXIuZ2V0UGFnZUluZm8oKS5nZXRDb250ZW50VHlwZSgpKS5hcHBlbmQoIlwiXG4iKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIi8+XG4iKTsgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGVuZHMgdGhlIHRhZyBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcyB0byB0aGUgWE1MCisgICAgICAgICAqIHZpZXcuCisgICAgICAgICAqCisgICAgICAgICAqIElmIHRoZSBnaXZlbiB0YWcgZGlyZWN0aXZlIGNvbnRhaW5zIGp1c3QgYSAncGFnZUVuY29kaW5nJworICAgICAgICAgKiBhdHRyaWJ1dGVzLCB3ZSBpZ25vcmUgaXQsIGFzIHdlJ3ZlIGFscmVhZHkgYXBwZW5kZWQKKyAgICAgICAgICogYSB0YWcgZGlyZWN0aXZlIGNvbnRhaW5pbmcganVzdCB0aGlzIGF0dHJpYnV0ZXMuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgYXBwZW5kVGFnRGlyZWN0aXZlKE5vZGUuVGFnRGlyZWN0aXZlIG4pCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGJvb2xlYW4gYXBwZW5kID0gZmFsc2U7CisgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzID0gbi5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBpbnQgbGVuID0gKGF0dHJzID09IG51bGwpID8gMCA6IGF0dHJzLmdldExlbmd0aCgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gYXR0cnMuZ2V0UU5hbWUoaSk7CisgICAgICAgICAgICAgICAgaWYgKCEicGFnZUVuY29kaW5nIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghYXBwZW5kKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhcHBlbmRUYWcobik7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBlbmRzIGEgdGFnIGRpcmVjdGl2ZSBjb250YWluaW5nIGEgc2luZ2xlICdwYWdlRW5jb2RpbmcnCisgICAgICAgICAqIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSBpcyBoYXJkLWNvZGVkIHRvIFVURi04LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFRhZ0RpcmVjdGl2ZSgpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjwiKS5hcHBlbmQoSlNQX1RBR19ESVJFQ1RJVkVfQUNUSU9OKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxuIik7CisKKyAgICAgICAgICAgIC8vIGFwcGVuZCBqc3A6aWQKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAgIikuYXBwZW5kKGpzcElkUHJlZml4KS5hcHBlbmQoIjppZCIpLmFwcGVuZCgiPVwiIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGpzcElkKyspLmFwcGVuZCgiXCJcbiIpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiICAiKS5hcHBlbmQoInBhZ2VFbmNvZGluZyIpLmFwcGVuZCgiPVwiVVRGLThcIlxuIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIvPlxuIik7ICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYXBwZW5kVGV4dChTdHJpbmcgdGV4dCwgYm9vbGVhbiBjcmVhdGVKc3BUZXh0RWxlbWVudCkgeworICAgICAgICAgICAgaWYgKGNyZWF0ZUpzcFRleHRFbGVtZW50KSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiPCIpLmFwcGVuZChKU1BfVEVYVF9BQ1RJT04pOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxuIik7CisKKyAgICAgICAgICAgICAgICAvLyBhcHBlbmQganNwOmlkCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiICAiKS5hcHBlbmQoanNwSWRQcmVmaXgpLmFwcGVuZCgiOmlkIikuYXBwZW5kKCI9XCIiKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGpzcElkKyspLmFwcGVuZCgiXCJcbiIpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIj5cbiIpOworCisgICAgICAgICAgICAgICAgYXBwZW5kQ0RBVEEodGV4dCk7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChKU1BfVEVYVF9BQ1RJT05fRU5EKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhcHBlbmRDREFUQSh0ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwZW5kcyB0aGUgZ2l2ZW4gdGV4dCBhcyBhIENEQVRBIHNlY3Rpb24gdG8gdGhlIFhNTCB2aWV3LCB1bmxlc3MKKyAgICAgICAgICogdGhlIHRleHQgaGFzIGFscmVhZHkgYmVlbiBtYXJrZWQgYXMgQ0RBVEEuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgYXBwZW5kQ0RBVEEoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoQ0RBVEFfU1RBUlRfU0VDVElPTik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGVzY2FwZUNEQVRBKHRleHQpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoQ0RBVEFfRU5EX1NFQ1RJT04pOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRXNjYXBlcyBhbnkgb2NjdXJyZW5jZXMgb2YgIl1dPiIgKGJ5IHJlcGxhY2luZyB0aGVtIHdpdGggIl1dJmd0OyIpCisgICAgICAgICAqIHdpdGhpbiB0aGUgZ2l2ZW4gdGV4dCwgc28gaXQgY2FuIGJlIGluY2x1ZGVkIGluIGEgQ0RBVEEgc2VjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGVzY2FwZUNEQVRBKFN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICBpZiggdGV4dD09bnVsbCApIHJldHVybiAiIjsKKyAgICAgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgICAgICAgQ2hhckFycmF5V3JpdGVyIHJlc3VsdCA9IG5ldyBDaGFyQXJyYXlXcml0ZXIobGVuKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoKGkrMikgPCBsZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAodGV4dC5jaGFyQXQoaSkgPT0gJ10nKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHRleHQuY2hhckF0KGkrMSkgPT0gJ10nKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHRleHQuY2hhckF0KGkrMikgPT0gJz4nKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCBmb3VuZAorICAgICAgICAgICAgICAgICAgICByZXN1bHQud3JpdGUoJ10nKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LndyaXRlKCddJyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC53cml0ZSgnJicpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQud3JpdGUoJ2cnKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LndyaXRlKCd0Jyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC53cml0ZSgnOycpOworICAgICAgICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LndyaXRlKHRleHQuY2hhckF0KGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBlbmRzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBnaXZlbiBOb2RlIHRvIHRoZSBYTUwgdmlldy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBwcmludEF0dHJpYnV0ZXMoTm9kZSBuLCBib29sZWFuIGFkZERlZmF1bHROUykgeworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwZW5kICJ4bWxucyIgYXR0cmlidXRlcyB0aGF0IHJlcHJlc2VudCB0YWcgbGlicmFyaWVzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBuLmdldFRhZ2xpYkF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIGludCBsZW4gPSAoYXR0cnMgPT0gbnVsbCkgPyAwIDogYXR0cnMuZ2V0TGVuZ3RoKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJzLmdldFFOYW1lKGkpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGF0dHJzLmdldFZhbHVlKGkpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAgIikuYXBwZW5kKG5hbWUpLmFwcGVuZCgiPVwiIikuYXBwZW5kKHZhbHVlKS5hcHBlbmQoIlwiXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGVuZCAieG1sbnMiIGF0dHJpYnV0ZXMgdGhhdCBkbyBub3QgcmVwcmVzZW50IHRhZyBsaWJyYXJpZXMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXR0cnMgPSBuLmdldE5vblRhZ2xpYlhtbG5zQXR0cmlidXRlcygpOworICAgICAgICAgICAgbGVuID0gKGF0dHJzID09IG51bGwpID8gMCA6IGF0dHJzLmdldExlbmd0aCgpOworICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0TlNTZWVuID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJzLmdldFFOYW1lKGkpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGF0dHJzLmdldFZhbHVlKGkpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAgIikuYXBwZW5kKG5hbWUpLmFwcGVuZCgiPVwiIikuYXBwZW5kKHZhbHVlKS5hcHBlbmQoIlwiXG4iKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0TlNTZWVuIHw9ICJ4bWxucyIuZXF1YWxzKG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFkZERlZmF1bHROUyAmJiAhZGVmYXVsdE5TU2VlbikgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAgeG1sbnM9XCJcIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNldERlZmF1bHROUyA9IGZhbHNlOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwZW5kIGFsbCBvdGhlciBhdHRyaWJ1dGVzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGF0dHJzID0gbi5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBsZW4gPSAoYXR0cnMgPT0gbnVsbCkgPyAwIDogYXR0cnMuZ2V0TGVuZ3RoKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJzLmdldFFOYW1lKGkpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGF0dHJzLmdldFZhbHVlKGkpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAgIikuYXBwZW5kKG5hbWUpLmFwcGVuZCgiPVwiIik7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChKc3BVdGlsLmdldEV4cHJJblhtbCh2YWx1ZSkpLmFwcGVuZCgiXCJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwZW5kcyBYTUwgcHJvbG9nIHdpdGggZW5jb2RpbmcgZGVjbGFyYXRpb24uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgYXBwZW5kWG1sUHJvbG9nKCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PlxuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvUGFnZUluZm8uamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvUGFnZUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGE1ZDIxCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9QYWdlSW5mby5qYXZhCkBAIC0wLDAgKzEsNjI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0xpYnJhcnlJbmZvOworCisvKioKKyAqIEEgcmVwb3NpdG9yeSBmb3IgdmFyaW91cyBpbmZvIGFib3V0IHRoZSB0cmFuc2xhdGlvbiB1bml0IHVuZGVyIGNvbXBpbGF0aW9uLgorICoKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICovCisKK2NsYXNzIFBhZ2VJbmZvIHsKKworICAgIHByaXZhdGUgVmVjdG9yIGltcG9ydHM7CisgICAgcHJpdmF0ZSBWZWN0b3IgZGVwZW5kYW50czsKKworICAgIHByaXZhdGUgQmVhblJlcG9zaXRvcnkgYmVhblJlcG9zaXRvcnk7CisgICAgcHJpdmF0ZSBIYXNoTWFwIHRhZ2xpYnNNYXA7CisgICAgcHJpdmF0ZSBIYXNoTWFwIGpzcFByZWZpeE1hcHBlcjsKKyAgICBwcml2YXRlIEhhc2hNYXAgeG1sUHJlZml4TWFwcGVyOworICAgIHByaXZhdGUgSGFzaE1hcCBub25DdXN0b21UYWdQcmVmaXhNYXA7CisgICAgcHJpdmF0ZSBTdHJpbmcganNwRmlsZTsKKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0TGFuZ3VhZ2UgPSAiamF2YSI7CisgICAgcHJpdmF0ZSBTdHJpbmcgbGFuZ3VhZ2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdEV4dGVuZHMgPSBDb25zdGFudHMuSlNQX1NFUlZMRVRfQkFTRTsKKyAgICBwcml2YXRlIFN0cmluZyB4dGVuZHM7CisgICAgcHJpdmF0ZSBTdHJpbmcgY29udGVudFR5cGUgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIHNlc3Npb247CisgICAgcHJpdmF0ZSBib29sZWFuIGlzU2Vzc2lvbiA9IHRydWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgYnVmZmVyVmFsdWU7CisgICAgcHJpdmF0ZSBpbnQgYnVmZmVyID0gOCoxMDI0OyAgICAvLyBYWFggY29uZmlybQorICAgIHByaXZhdGUgU3RyaW5nIGF1dG9GbHVzaDsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNBdXRvRmx1c2ggPSB0cnVlOworICAgIHByaXZhdGUgU3RyaW5nIGlzVGhyZWFkU2FmZVZhbHVlOworICAgIHByaXZhdGUgYm9vbGVhbiBpc1RocmVhZFNhZmUgPSB0cnVlOworICAgIHByaXZhdGUgU3RyaW5nIGlzRXJyb3JQYWdlVmFsdWU7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzRXJyb3JQYWdlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JQYWdlID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBpbmZvOworCisgICAgcHJpdmF0ZSBib29sZWFuIHNjcmlwdGxlc3MgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc2NyaXB0aW5nSW52YWxpZCA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIGlzRUxJZ25vcmVkVmFsdWU7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzRUxJZ25vcmVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgb21pdFhtbERlY2wgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIGRvY3R5cGVOYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBkb2N0eXBlUHVibGljID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBkb2N0eXBlU3lzdGVtID0gbnVsbDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0pzcFByZWZpeEhpamFja2VkOworCisgICAgLy8gU2V0IG9mIGFsbCBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgcHJlZml4ZXMgdXNlZCBpbiB0aGlzIHRyYW5zbGF0aW9uIHVuaXQKKyAgICBwcml2YXRlIEhhc2hTZXQgcHJlZml4ZXM7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzSnNwUm9vdCA9IGZhbHNlOworICAgIHByaXZhdGUgVmVjdG9yIGluY2x1ZGVQcmVsdWRlOworICAgIHByaXZhdGUgVmVjdG9yIGluY2x1ZGVDb2RhOworICAgIHByaXZhdGUgVmVjdG9yIHBsdWdpbkRjbHM7ICAgICAgLy8gSWQncyBmb3IgdGFncGx1Z2luIGRlY2xhcmF0aW9ucworCisKKyAgICBQYWdlSW5mbyhCZWFuUmVwb3NpdG9yeSBiZWFuUmVwb3NpdG9yeSwgU3RyaW5nIGpzcEZpbGUpIHsKKworICAgICAgICB0aGlzLmpzcEZpbGUgPSBqc3BGaWxlOworICAgICAgICB0aGlzLmJlYW5SZXBvc2l0b3J5ID0gYmVhblJlcG9zaXRvcnk7CisgICAgICAgIHRoaXMudGFnbGlic01hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHRoaXMuanNwUHJlZml4TWFwcGVyID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgdGhpcy54bWxQcmVmaXhNYXBwZXIgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICB0aGlzLm5vbkN1c3RvbVRhZ1ByZWZpeE1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHRoaXMuaW1wb3J0cyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgdGhpcy5kZXBlbmRhbnRzID0gbmV3IFZlY3RvcigpOworICAgICAgICB0aGlzLmluY2x1ZGVQcmVsdWRlID0gbmV3IFZlY3RvcigpOworICAgICAgICB0aGlzLmluY2x1ZGVDb2RhID0gbmV3IFZlY3RvcigpOworICAgICAgICB0aGlzLnBsdWdpbkRjbHMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHRoaXMucHJlZml4ZXMgPSBuZXcgSGFzaFNldCgpOworCisgICAgICAgIC8vIEVudGVyIHN0YW5kYXJkIGltcG9ydHMKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IENvbnN0YW50cy5TVEFOREFSRF9JTVBPUlRTLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaW1wb3J0cy5hZGQoQ29uc3RhbnRzLlNUQU5EQVJEX0lNUE9SVFNbaV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBwbHVnaW4gSUQgaGFzIGJlZW4gcHJldmlvdXNseSBkZWNsYXJlZC4gIE1ha2UgYSBub3QKKyAgICAgKiB0aGF0IHRoaXMgSWQgaXMgbm93IGRlY2xhcmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBJZCBoYXMgYmVlbiBkZWNsYXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BsdWdpbkRlY2xhcmVkKFN0cmluZyBpZCkgeworICAgICAgICBpZiAocGx1Z2luRGNscy5jb250YWlucyhpZCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcGx1Z2luRGNscy5hZGQoaWQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSW1wb3J0cyhMaXN0IGltcG9ydHMpIHsKKyAgICAgICAgdGhpcy5pbXBvcnRzLmFkZEFsbChpbXBvcnRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJbXBvcnQoU3RyaW5nIGltcCkgeworICAgICAgICB0aGlzLmltcG9ydHMuYWRkKGltcCk7CisgICAgfQorCisgICAgcHVibGljIExpc3QgZ2V0SW1wb3J0cygpIHsKKyAgICAgICAgcmV0dXJuIGltcG9ydHM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRKc3BGaWxlKCkgeworICAgICAgICByZXR1cm4ganNwRmlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGREZXBlbmRhbnQoU3RyaW5nIGQpIHsKKyAgICAgICAgaWYgKCFkZXBlbmRhbnRzLmNvbnRhaW5zKGQpICYmICFqc3BGaWxlLmVxdWFscyhkKSkKKyAgICAgICAgICAgICAgICBkZXBlbmRhbnRzLmFkZChkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXREZXBlbmRhbnRzKCkgeworICAgICAgICByZXR1cm4gZGVwZW5kYW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgQmVhblJlcG9zaXRvcnkgZ2V0QmVhblJlcG9zaXRvcnkoKSB7CisgICAgICAgIHJldHVybiBiZWFuUmVwb3NpdG9yeTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTY3JpcHRsZXNzKGJvb2xlYW4gcykgeworICAgICAgICBzY3JpcHRsZXNzID0gczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NjcmlwdGxlc3MoKSB7CisgICAgICAgIHJldHVybiBzY3JpcHRsZXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNjcmlwdGluZ0ludmFsaWQoYm9vbGVhbiBzKSB7CisgICAgICAgIHNjcmlwdGluZ0ludmFsaWQgPSBzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2NyaXB0aW5nSW52YWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIHNjcmlwdGluZ0ludmFsaWQ7CisgICAgfQorCisgICAgcHVibGljIExpc3QgZ2V0SW5jbHVkZVByZWx1ZGUoKSB7CisgICAgICAgIHJldHVybiBpbmNsdWRlUHJlbHVkZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlUHJlbHVkZShWZWN0b3IgcHJlbHVkZSkgeworICAgICAgICBpbmNsdWRlUHJlbHVkZSA9IHByZWx1ZGU7CisgICAgfQorCisgICAgcHVibGljIExpc3QgZ2V0SW5jbHVkZUNvZGEoKSB7CisgICAgICAgIHJldHVybiBpbmNsdWRlQ29kYTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlQ29kYShWZWN0b3IgY29kYSkgeworICAgICAgICBpbmNsdWRlQ29kYSA9IGNvZGE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SGFzSnNwUm9vdChib29sZWFuIHMpIHsKKyAgICAgICAgaGFzSnNwUm9vdCA9IHM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzSnNwUm9vdCgpIHsKKyAgICAgICAgcmV0dXJuIGhhc0pzcFJvb3Q7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRPbWl0WG1sRGVjbCgpIHsKKyAgICAgICAgcmV0dXJuIG9taXRYbWxEZWNsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9taXRYbWxEZWNsKFN0cmluZyBvbWl0KSB7CisgICAgICAgIG9taXRYbWxEZWNsID0gb21pdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERvY3R5cGVOYW1lKCkgeworICAgICAgICByZXR1cm4gZG9jdHlwZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RG9jdHlwZU5hbWUoU3RyaW5nIGRvY3R5cGVOYW1lKSB7CisgICAgICAgIHRoaXMuZG9jdHlwZU5hbWUgPSBkb2N0eXBlTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERvY3R5cGVTeXN0ZW0oKSB7CisgICAgICAgIHJldHVybiBkb2N0eXBlU3lzdGVtOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERvY3R5cGVTeXN0ZW0oU3RyaW5nIGRvY3R5cGVTeXN0ZW0pIHsKKyAgICAgICAgdGhpcy5kb2N0eXBlU3lzdGVtID0gZG9jdHlwZVN5c3RlbTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERvY3R5cGVQdWJsaWMoKSB7CisgICAgICAgIHJldHVybiBkb2N0eXBlUHVibGljOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERvY3R5cGVQdWJsaWMoU3RyaW5nIGRvY3R5cGVQdWJsaWMpIHsKKyAgICAgICAgdGhpcy5kb2N0eXBlUHVibGljID0gZG9jdHlwZVB1YmxpYzsKKyAgICB9CisKKyAgICAvKiBUYWcgbGlicmFyeSBhbmQgWE1MIG5hbWVzcGFjZSBtYW5hZ2VtZW50IG1ldGhvZHMgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldElzSnNwUHJlZml4SGlqYWNrZWQoYm9vbGVhbiBpc0hpamFja2VkKSB7CisgICAgICAgIGlzSnNwUHJlZml4SGlqYWNrZWQgPSBpc0hpamFja2VkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSnNwUHJlZml4SGlqYWNrZWQoKSB7CisgICAgICAgIHJldHVybiBpc0pzcFByZWZpeEhpamFja2VkOworICAgIH0KKworICAgIC8qCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gcHJlZml4IHRvIHRoZSBzZXQgb2YgcHJlZml4ZXMgb2YgdGhpcyB0cmFuc2xhdGlvbiB1bml0LgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByZWZpeChTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIHByZWZpeGVzLmFkZChwcmVmaXgpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgY29udGFpbnMgdGhlIGdpdmVuIHByZWZpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggVGhlIHByZWZpeCB0byBjaGVjaworICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgdHJhbnNsYXRpb24gdW5pdCBjb250YWlucyB0aGUgZ2l2ZW4gcHJlZml4LCBmYWxzZQorICAgICAqIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zUHJlZml4KFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgcmV0dXJuIHByZWZpeGVzLmNvbnRhaW5zKHByZWZpeCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBNYXBzIHRoZSBnaXZlbiBVUkkgdG8gdGhlIGdpdmVuIHRhZyBsaWJyYXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHRvIG1hcAorICAgICAqIEBwYXJhbSBpbmZvIFRoZSB0YWcgbGlicmFyeSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFVSSQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRhZ2xpYihTdHJpbmcgdXJpLCBUYWdMaWJyYXJ5SW5mbyBpbmZvKSB7CisgICAgICAgIHRhZ2xpYnNNYXAucHV0KHVyaSwgaW5mbyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZXRzIHRoZSB0YWcgbGlicmFyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBVUkkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRhZyBsaWJyYXJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFVSSQorICAgICAqLworICAgIHB1YmxpYyBUYWdMaWJyYXJ5SW5mbyBnZXRUYWdsaWIoU3RyaW5nIHVyaSkgeworICAgICAgICByZXR1cm4gKFRhZ0xpYnJhcnlJbmZvKSB0YWdsaWJzTWFwLmdldCh1cmkpOworICAgIH0KKworICAgIC8qCisgICAgICogR2V0cyB0aGUgY29sbGVjdGlvbiBvZiB0YWcgbGlicmFyaWVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIFVSSQorICAgICAqCisgICAgICogQHJldHVybiBDb2xsZWN0aW9uIG9mIHRhZyBsaWJyYXJpZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgVVJJCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0VGFnbGlicygpIHsKKyAgICAgICAgcmV0dXJuIHRhZ2xpYnNNYXAudmFsdWVzKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBVUkkgaXMgbWFwcGVkIHRvIGEgdGFnIGxpYnJhcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgdG8gbWFwCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIFVSSSBpcyBtYXBwZWQgdG8gYSB0YWcgbGlicmFyeSwgZmFsc2UKKyAgICAgKiBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNUYWdsaWIoU3RyaW5nIHVyaSkgeworICAgICAgICByZXR1cm4gdGFnbGlic01hcC5jb250YWluc0tleSh1cmkpOworICAgIH0KKworICAgIC8qCisgICAgICogTWFwcyB0aGUgZ2l2ZW4gcHJlZml4IHRvIHRoZSBnaXZlbiBVUkkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFRoZSBwcmVmaXggdG8gbWFwCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7CisgICAgICAgIGpzcFByZWZpeE1hcHBlci5wdXQocHJlZml4LCB1cmkpOworICAgIH0KKworICAgIC8qCisgICAgICogUHVzaGVzIHRoZSBnaXZlbiBVUkkgb250byB0aGUgc3RhY2sgb2YgVVJJcyB0byB3aGljaCB0aGUgZ2l2ZW4gcHJlZml4CisgICAgICogaXMgbWFwcGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHdob3NlIHN0YWNrIG9mIFVSSXMgaXMgdG8gYmUgcHVzaGVkCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHRvIGJlIHB1c2hlZCBvbnRvIHRoZSBzdGFjaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1c2hQcmVmaXhNYXBwaW5nKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKKyAgICAgICAgTGlua2VkTGlzdCBzdGFjayA9IChMaW5rZWRMaXN0KSB4bWxQcmVmaXhNYXBwZXIuZ2V0KHByZWZpeCk7CisgICAgICAgIGlmIChzdGFjayA9PSBudWxsKSB7CisgICAgICAgICAgICBzdGFjayA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgICAgICB4bWxQcmVmaXhNYXBwZXIucHV0KHByZWZpeCwgc3RhY2spOworICAgICAgICB9CisgICAgICAgIHN0YWNrLmFkZEZpcnN0KHVyaSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZW1vdmVzIHRoZSBVUkkgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgb2YgVVJJcyB0byB3aGljaCB0aGUgZ2l2ZW4KKyAgICAgKiBwcmVmaXggaXMgbWFwcGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHdob3NlIHN0YWNrIG9mIFVSSXMgaXMgdG8gYmUgcG9wcGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcG9wUHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIExpbmtlZExpc3Qgc3RhY2sgPSAoTGlua2VkTGlzdCkgeG1sUHJlZml4TWFwcGVyLmdldChwcmVmaXgpOworICAgICAgICBpZiAoc3RhY2sgPT0gbnVsbCB8fCBzdGFjay5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gWFhYIHRocm93IG5ldyBFeGNlcHRpb24oIlhYWCIpOworICAgICAgICB9CisgICAgICAgIHN0YWNrLnJlbW92ZUZpcnN0KCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIHRoZSBVUkkgdG8gd2hpY2ggdGhlIGdpdmVuIHByZWZpeCBtYXBzLgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHdob3NlIFVSSSBpcyBzb3VnaHQKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIFVSSSB0byB3aGljaCB0aGUgZ2l2ZW4gcHJlZml4IG1hcHMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVSSShTdHJpbmcgcHJlZml4KSB7CisKKyAgICAgICAgU3RyaW5nIHVyaSA9IG51bGw7CisKKyAgICAgICAgTGlua2VkTGlzdCBzdGFjayA9IChMaW5rZWRMaXN0KSB4bWxQcmVmaXhNYXBwZXIuZ2V0KHByZWZpeCk7CisgICAgICAgIGlmIChzdGFjayA9PSBudWxsIHx8IHN0YWNrLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICB1cmkgPSAoU3RyaW5nKSBqc3BQcmVmaXhNYXBwZXIuZ2V0KHByZWZpeCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1cmkgPSAoU3RyaW5nKSBzdGFjay5nZXRGaXJzdCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9CisKKworICAgIC8qIFBhZ2UvVGFnIGRpcmVjdGl2ZSBhdHRyaWJ1dGVzICovCisKKyAgICAvKgorICAgICAqIGxhbmd1YWdlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIHZhbHVlLCBOb2RlIG4sIEVycm9yRGlzcGF0Y2hlciBlcnIsCisgICAgICAgICAgICAgICAgYm9vbGVhbiBwYWdlZGlyKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoISJqYXZhIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKSkgeworICAgICAgICAgICAgaWYgKHBhZ2VkaXIpCisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFnZS5sYW5ndWFnZS5ub25qYXZhIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IudGFnLmxhbmd1YWdlLm5vbmphdmEiKTsKKyAgICAgICAgfQorCisgICAgICAgIGxhbmd1YWdlID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZShib29sZWFuIHVzZURlZmF1bHQpIHsKKyAgICAgICAgcmV0dXJuIChsYW5ndWFnZSA9PSBudWxsICYmIHVzZURlZmF1bHQgPyBkZWZhdWx0TGFuZ3VhZ2UgOiBsYW5ndWFnZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldExhbmd1YWdlKHRydWUpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBleHRlbmRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXh0ZW5kcyhTdHJpbmcgdmFsdWUsIE5vZGUuUGFnZURpcmVjdGl2ZSBuKSB7CisKKyAgICAgICAgeHRlbmRzID0gdmFsdWU7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgcGFnZSBzdXBlcmNsYXNzIGlzIHRvcCBsZXZlbCBjbGFzcyAoaS5lLiBub3QgaW4gYSBwYWNrYWdlKQorICAgICAgICAgKiBleHBsaWNpdGx5IGltcG9ydCBpdC4gSWYgdGhpcyBpcyBub3QgZG9uZSwgdGhlIGNvbXBpbGVyIHdpbGwgYXNzdW1lCisgICAgICAgICAqIHRoZSBleHRlbmRlZCBjbGFzcyBpcyBpbiB0aGUgc2FtZSBwa2cgYXMgdGhlIGdlbmVyYXRlZCBzZXJ2bGV0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJy4nKSA8IDApCisgICAgICAgICAgICBuLmFkZEltcG9ydCh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlICdleHRlbmRzJyBwYWdlIGRpcmVjdGl2ZSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlRGVmYXVsdCBUUlVFIGlmIHRoZSBkZWZhdWx0CisgICAgICogKG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSHR0cEpzcEJhc2UpIHNob3VsZCBiZSByZXR1cm5lZCBpZiB0aGlzCisgICAgICogYXR0cmlidXRlIGhhcyBub3QgYmVlbiBzZXQsIEZBTFNFIG90aGVyd2lzZQorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlICdleHRlbmRzJyBwYWdlIGRpcmVjdGl2ZSBhdHRyaWJ1dGUsIG9yIHRoZQorICAgICAqIGRlZmF1bHQgKG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSHR0cEpzcEJhc2UpIGlmIHRoaXMgYXR0cmlidXRlIGhhcworICAgICAqIG5vdCBiZWVuIHNldCBhbmQgdXNlRGVmYXVsdCBpcyBUUlVFCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFeHRlbmRzKGJvb2xlYW4gdXNlRGVmYXVsdCkgeworICAgICAgICByZXR1cm4gKHh0ZW5kcyA9PSBudWxsICYmIHVzZURlZmF1bHQgPyBkZWZhdWx0RXh0ZW5kcyA6IHh0ZW5kcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlICdleHRlbmRzJyBwYWdlIGRpcmVjdGl2ZSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgJ2V4dGVuZHMnIHBhZ2UgZGlyZWN0aXZlIGF0dHJpYnV0ZSwgb3IgdGhlCisgICAgICogZGVmYXVsdCAob3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5IdHRwSnNwQmFzZSkgaWYgdGhpcyBhdHRyaWJ1dGUgaGFzCisgICAgICogbm90IGJlZW4gc2V0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFeHRlbmRzKCkgeworICAgICAgICByZXR1cm4gZ2V0RXh0ZW5kcyh0cnVlKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogY29udGVudFR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgY29udGVudFR5cGUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworICAgICAgICByZXR1cm4gY29udGVudFR5cGU7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIGJ1ZmZlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJ1ZmZlclZhbHVlKFN0cmluZyB2YWx1ZSwgTm9kZSBuLCBFcnJvckRpc3BhdGNoZXIgZXJyKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoIm5vbmUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKQorICAgICAgICAgICAgYnVmZmVyID0gMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCAhdmFsdWUuZW5kc1dpdGgoImtiIikpCisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmJ1ZmZlciIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyIGsgPSBuZXcgSW50ZWdlcih2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGVuZ3RoKCktMikpOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGsuaW50VmFsdWUoKSAqIDEwMjQ7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnBhZ2UuaW52YWxpZC5idWZmZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlclZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRCdWZmZXJWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlclZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QnVmZmVyKCkgeworICAgICAgICByZXR1cm4gYnVmZmVyOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbihTdHJpbmcgdmFsdWUsIE5vZGUgbiwgRXJyb3JEaXNwYXRjaGVyIGVycikKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKSkKKyAgICAgICAgICAgIGlzU2Vzc2lvbiA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKCJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSkpCisgICAgICAgICAgICBpc1Nlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFnZS5pbnZhbGlkLnNlc3Npb24iKTsKKworICAgICAgICBzZXNzaW9uID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gc2Vzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Nlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBpc1Nlc3Npb247CisgICAgfQorCisKKyAgICAvKgorICAgICAqIGF1dG9GbHVzaAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9GbHVzaChTdHJpbmcgdmFsdWUsIE5vZGUgbiwgRXJyb3JEaXNwYXRjaGVyIGVycikKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKSkKKyAgICAgICAgICAgIGlzQXV0b0ZsdXNoID0gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAoImZhbHNlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKSkKKyAgICAgICAgICAgIGlzQXV0b0ZsdXNoID0gZmFsc2U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLmF1dG9GbHVzaC5pbnZhbGlkIik7CisKKyAgICAgICAgYXV0b0ZsdXNoID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRvRmx1c2goKSB7CisgICAgICAgIHJldHVybiBhdXRvRmx1c2g7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBdXRvRmx1c2goKSB7CisgICAgICAgIHJldHVybiBpc0F1dG9GbHVzaDsKKyAgICB9CisKKworICAgIC8qCisgICAgICogaXNUaHJlYWRTYWZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SXNUaHJlYWRTYWZlKFN0cmluZyB2YWx1ZSwgTm9kZSBuLCBFcnJvckRpc3BhdGNoZXIgZXJyKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKQorICAgICAgICAgICAgaXNUaHJlYWRTYWZlID0gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAoImZhbHNlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKSkKKyAgICAgICAgICAgIGlzVGhyZWFkU2FmZSA9IGZhbHNlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wYWdlLmludmFsaWQuaXN0aHJlYWRzYWZlIik7CisKKyAgICAgICAgaXNUaHJlYWRTYWZlVmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldElzVGhyZWFkU2FmZSgpIHsKKyAgICAgICAgcmV0dXJuIGlzVGhyZWFkU2FmZVZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVGhyZWFkU2FmZSgpIHsKKyAgICAgICAgcmV0dXJuIGlzVGhyZWFkU2FmZTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogaW5mbworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluZm8oU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGluZm8gPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBlcnJvclBhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvclBhZ2UoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGVycm9yUGFnZSA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JQYWdlKCkgeworICAgICAgICByZXR1cm4gZXJyb3JQYWdlOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBpc0Vycm9yUGFnZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElzRXJyb3JQYWdlKFN0cmluZyB2YWx1ZSwgTm9kZSBuLCBFcnJvckRpc3BhdGNoZXIgZXJyKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKQorICAgICAgICAgICAgaXNFcnJvclBhZ2UgPSB0cnVlOworICAgICAgICBlbHNlIGlmICgiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKQorICAgICAgICAgICAgaXNFcnJvclBhZ2UgPSBmYWxzZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmlzZXJyb3JwYWdlIik7CisKKyAgICAgICAgaXNFcnJvclBhZ2VWYWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXNFcnJvclBhZ2UoKSB7CisgICAgICAgIHJldHVybiBpc0Vycm9yUGFnZVZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRXJyb3JQYWdlKCkgeworICAgICAgICByZXR1cm4gaXNFcnJvclBhZ2U7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIGlzRUxJZ25vcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SXNFTElnbm9yZWQoU3RyaW5nIHZhbHVlLCBOb2RlIG4sIEVycm9yRGlzcGF0Y2hlciBlcnIsCisgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwYWdlZGlyKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKQorICAgICAgICAgICAgaXNFTElnbm9yZWQgPSB0cnVlOworICAgICAgICBlbHNlIGlmICgiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKQorICAgICAgICAgICAgaXNFTElnbm9yZWQgPSBmYWxzZTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAocGFnZWRpcikKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wYWdlLmludmFsaWQuaXNlbGlnbm9yZWQiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci50YWcuaW52YWxpZC5pc2VsaWdub3JlZCIpOworICAgICAgICB9CisKKyAgICAgICAgaXNFTElnbm9yZWRWYWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVMSWdub3JlZChib29sZWFuIHMpIHsKKyAgICAgICAgaXNFTElnbm9yZWQgPSBzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXNFTElnbm9yZWQoKSB7CisgICAgICAgIHJldHVybiBpc0VMSWdub3JlZFZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRUxJZ25vcmVkKCkgeworICAgICAgICByZXR1cm4gaXNFTElnbm9yZWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHV0Tm9uQ3VzdG9tVGFnUHJlZml4KFN0cmluZyBwcmVmaXgsIE1hcmsgd2hlcmUpIHsKKyAgICAgICAgbm9uQ3VzdG9tVGFnUHJlZml4TWFwLnB1dChwcmVmaXgsIHdoZXJlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFyayBnZXROb25DdXN0b21UYWdQcmVmaXgoU3RyaW5nIHByZWZpeCkgeworICAgICAgICByZXR1cm4gKE1hcmspIG5vbkN1c3RvbVRhZ1ByZWZpeE1hcC5nZXQocHJlZml4KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1BhcnNlci5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9QYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzU4YTRmCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9QYXJzZXIuamF2YQpAQCAtMCwwICsxLDE5MzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5V3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnQXR0cmlidXRlSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRmlsZUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0luZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0xpYnJhcnlJbmZvOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Kc3BDb21waWxhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHBhcnNlciBmb3IgYSBKU1AgcGFnZSAobm9uLXhtbCB2aWV3KS4KKyAqIEpTUCBwYWdlIGdyYW1tYXIgaXMgaW5jbHVkZWQgaGVyZSBmb3IgcmVmZXJlbmNlLiAgVGhlIHRva2VuICcjJworICogdGhhdCBhcHBlYXJzIGluIHRoZSBwcm9kdWN0aW9uIGluZGljYXRlcyB0aGUgY3VycmVudCBpbnB1dCB0b2tlbgorICogbG9jYXRpb24gaW4gdGhlIHByb2R1Y3Rpb24uCisgKiAKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICogQGF1dGhvciBTaGF3biBCYXllcm4KKyAqIEBhdXRob3IgTWFyayBSb3RoCisgKi8KKworY2xhc3MgUGFyc2VyIGltcGxlbWVudHMgVGFnQ29uc3RhbnRzIHsKKworICAgIHByaXZhdGUgUGFyc2VyQ29udHJvbGxlciBwYXJzZXJDb250cm9sbGVyOworICAgIHByaXZhdGUgSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQ7CisgICAgcHJpdmF0ZSBKc3BSZWFkZXIgcmVhZGVyOworICAgIHByaXZhdGUgU3RyaW5nIGN1cnJlbnRGaWxlOworICAgIHByaXZhdGUgTWFyayBzdGFydDsKKyAgICBwcml2YXRlIEVycm9yRGlzcGF0Y2hlciBlcnI7CisgICAgcHJpdmF0ZSBpbnQgc2NyaXB0bGVzc0NvdW50OworICAgIHByaXZhdGUgYm9vbGVhbiBpc1RhZ0ZpbGU7CisgICAgcHJpdmF0ZSBib29sZWFuIGRpcmVjdGl2ZXNPbmx5OworICAgIHByaXZhdGUgVVJMIGphckZpbGVVcmw7CisgICAgcHJpdmF0ZSBQYWdlSW5mbyBwYWdlSW5mbzsKKworICAgIC8vIFZpcnR1YWwgYm9keSBjb250ZW50IHR5cGVzLCB0byBtYWtlIHBhcnNpbmcgYSBsaXR0bGUgZWFzaWVyLgorICAgIC8vIFRoZXNlIGFyZSBub3QgYWNjZXNzaWJsZSBmcm9tIG91dHNpZGUgdGhlIHBhcnNlci4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfQk9EWV9DT05URU5UX1BBUkFNID0gCisgICAgICAgICJKQVZBWF9CT0RZX0NPTlRFTlRfUEFSQU0iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9CT0RZX0NPTlRFTlRfUExVR0lOID0gCisgICAgICAgICJKQVZBWF9CT0RZX0NPTlRFTlRfUExVR0lOIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfQk9EWV9DT05URU5UX1RFTVBMQVRFX1RFWFQgPSAKKyAgICAgICAgIkpBVkFYX0JPRFlfQ09OVEVOVF9URU1QTEFURV9URVhUIjsKKworICAgIC8qKgorICAgICAqIFRoZSBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIHByaXZhdGUgUGFyc2VyKFBhcnNlckNvbnRyb2xsZXIgcGMsIEpzcFJlYWRlciByZWFkZXIsIGJvb2xlYW4gaXNUYWdGaWxlLAorICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlyZWN0aXZlc09ubHksIFVSTCBqYXJGaWxlVXJsKSB7CisgICAgICAgIHRoaXMucGFyc2VyQ29udHJvbGxlciA9IHBjOworICAgICAgICB0aGlzLmN0eHQgPSBwYy5nZXRKc3BDb21waWxhdGlvbkNvbnRleHQoKTsKKyAgICAgICAgdGhpcy5wYWdlSW5mbyA9IHBjLmdldENvbXBpbGVyKCkuZ2V0UGFnZUluZm8oKTsKKyAgICAgICAgdGhpcy5lcnIgPSBwYy5nZXRDb21waWxlcigpLmdldEVycm9yRGlzcGF0Y2hlcigpOworICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlcjsKKyAgICAgICAgdGhpcy5jdXJyZW50RmlsZSA9IHJlYWRlci5tYXJrKCkuZ2V0RmlsZSgpOworICAgICAgICB0aGlzLnNjcmlwdGxlc3NDb3VudCA9IDA7CisgICAgICAgIHRoaXMuaXNUYWdGaWxlID0gaXNUYWdGaWxlOworICAgICAgICB0aGlzLmRpcmVjdGl2ZXNPbmx5ID0gZGlyZWN0aXZlc09ubHk7CisgICAgICAgIHRoaXMuamFyRmlsZVVybCA9IGphckZpbGVVcmw7CisgICAgICAgIHN0YXJ0ID0gcmVhZGVyLm1hcmsoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWFpbiBlbnRyeSBmb3IgUGFyc2VyCisgICAgICogCisgICAgICogQHBhcmFtIHBjIFRoZSBQYXJzZUNvbnRyb2xsZXIsIHVzZSBmb3IgZ2V0dGluZyBvdGhlciBvYmplY3RzIGluIGNvbXBpbGVyCisgICAgICogICAgICAgICAgICAgICAgIGFuZCBmb3IgcGFyc2luZyBpbmNsdWRlZCBwYWdlcworICAgICAqIEBwYXJhbSByZWFkZXIgVG8gcmVhZCB0aGUgcGFnZQorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBub2RlIHRvIHRoaXMgcGFnZSwgbnVsbCBmb3IgdG9wIGxldmVsIHBhZ2UKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2Ygbm9kZXMgcmVwcmVzZW50aW5nIHRoZSBwYXJzZWQgcGFnZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTm9kZS5Ob2RlcyBwYXJzZShQYXJzZXJDb250cm9sbGVyIHBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc3BSZWFkZXIgcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1RhZ0ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlyZWN0aXZlc09ubHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBqYXJGaWxlVXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFnZUVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGpzcENvbmZpZ1BhZ2VFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNEZWZhdWx0UGFnZUVuY29kaW5nKQorICAgICAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXcgUGFyc2VyKHBjLCByZWFkZXIsIGlzVGFnRmlsZSwgZGlyZWN0aXZlc09ubHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphckZpbGVVcmwpOworCisgICAgICAgIE5vZGUuUm9vdCByb290ID0gbmV3IE5vZGUuUm9vdChyZWFkZXIubWFyaygpLCBwYXJlbnQsIGZhbHNlKTsKKyAgICAgICAgcm9vdC5zZXRQYWdlRW5jb2RpbmcocGFnZUVuYyk7CisgICAgICAgIHJvb3Quc2V0SnNwQ29uZmlnUGFnZUVuY29kaW5nKGpzcENvbmZpZ1BhZ2VFbmMpOworICAgICAgICByb290LnNldElzRGVmYXVsdFBhZ2VFbmNvZGluZyhpc0RlZmF1bHRQYWdlRW5jb2RpbmcpOworCisgICAgICAgIGlmIChkaXJlY3RpdmVzT25seSkgeworICAgICAgICAgICAgcGFyc2VyLnBhcnNlVGFnRmlsZURpcmVjdGl2ZXMocm9vdCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5vZGUuTm9kZXMocm9vdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGb3IgdGhlIFRvcCBsZXZlbCBwYWdlLCBhZGQgaW5sY3VkZS1wcmVsdWRlIGFuZCBpbmNsdWRlLWNvZGEKKyAgICAgICAgUGFnZUluZm8gcGFnZUluZm8gPSBwYy5nZXRDb21waWxlcigpLmdldFBhZ2VJbmZvKCk7CisgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcGFyc2VyLmFkZEluY2x1ZGUocm9vdCwgcGFnZUluZm8uZ2V0SW5jbHVkZVByZWx1ZGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHJlYWRlci5oYXNNb3JlSW5wdXQoKSkgeworICAgICAgICAgICAgcGFyc2VyLnBhcnNlRWxlbWVudHMocm9vdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBwYXJzZXIuYWRkSW5jbHVkZShyb290LCBwYWdlSW5mby5nZXRJbmNsdWRlQ29kYSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIE5vZGUuTm9kZXMgcGFnZSA9IG5ldyBOb2RlLk5vZGVzKHJvb3QpOworICAgICAgICByZXR1cm4gcGFnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGVzIDo6PSAoUyBBdHRyaWJ1dGUpKiBTPworICAgICAqLworICAgIEF0dHJpYnV0ZXMgcGFyc2VBdHRyaWJ1dGVzKCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIEF0dHJpYnV0ZXNJbXBsIGF0dHJzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7CisKKyAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgd2hpbGUgKHBhcnNlQXR0cmlidXRlKGF0dHJzKSkKKyAgICAgICAgICAgIHJlYWRlci5za2lwU3BhY2VzKCk7CisKKyAgICAgICAgcmV0dXJuIGF0dHJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIEF0dHJpYnV0ZXMgZm9yIGEgcmVhZGVyLCBwcm92aWRlZCBmb3IgZXh0ZXJuYWwgdXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBdHRyaWJ1dGVzIHBhcnNlQXR0cmlidXRlcyhQYXJzZXJDb250cm9sbGVyIHBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnNwUmVhZGVyIHJlYWRlcikKKyAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyc2VyIHRtcFBhcnNlciA9IG5ldyBQYXJzZXIocGMsIHJlYWRlciwgZmFsc2UsIGZhbHNlLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIHRtcFBhcnNlci5wYXJzZUF0dHJpYnV0ZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgOjo9IE5hbWUgUz8gRXEgUz8KKyAgICAgKiAgICAgICAgICAgICAgICggICAnIjwlPScgUlRBdHRyaWJ1dGVWYWx1ZURvdWJsZQorICAgICAqICAgICAgICAgICAgICAgICB8ICciJyBBdHRyaWJ1dGVWYWx1ZURvdWJsZQorICAgICAqICAgICAgICAgICAgICAgICB8ICInPCU9IiBSVEF0dHJpYnV0ZVZhbHVlU2luZ2xlCisgICAgICogICAgICAgICAgICAgICAgIHwgIiciIEF0dHJpYnV0ZVZhbHVlU2luZ2xlCisgICAgICogICAgICAgICAgICAgICB9CisgICAgICogTm90ZTogSlNQIGFuZCBYTUwgc3BlYyBkb2VzIG5vdCBhbGxvdyB3aGlsZSBzcGFjZXMgYXJvdW5kIEVxLiAgSXQgaXMKKyAgICAgKiBhZGRlZCB0byBiZSBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggVG9tY2F0LCBhbmQgd2l0aCBvdGhlciB4bWwgcGFyc2Vycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcGFyc2VBdHRyaWJ1dGUoQXR0cmlidXRlc0ltcGwgYXR0cnMpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gR2V0IHRoZSBxdWFsaWZpZWQgbmFtZQorICAgICAgICBTdHJpbmcgcU5hbWUgPSBwYXJzZU5hbWUoKTsKKyAgICAgICAgaWYgKHFOYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gRGV0ZXJtaW5lIHByZWZpeCBhbmQgbG9jYWwgbmFtZSBjb21wb25lbnRzCisgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBxTmFtZTsKKyAgICAgICAgU3RyaW5nIHVyaSA9ICIiOworICAgICAgICBpbnQgaW5kZXggPSBxTmFtZS5pbmRleE9mKCc6Jyk7CisgICAgICAgIGlmIChpbmRleCAhPSAtMSkgeworICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHFOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICB1cmkgPSBwYWdlSW5mby5nZXRVUkkocHJlZml4KTsKKyAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihyZWFkZXIubWFyaygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLmF0dHJpYnV0ZS5pbnZhbGlkUHJlZml4IiwgcHJlZml4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2FsTmFtZSA9IHFOYW1lLnN1YnN0cmluZyhpbmRleCsxKTsKKyAgICAgICAgfQorCisgICAgICAgICByZWFkZXIuc2tpcFNwYWNlcygpOworICAgICAgICBpZiAoIXJlYWRlci5tYXRjaGVzKCI9IikpCisgICAgICAgICAgICBlcnIuanNwRXJyb3IocmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5hdHRyaWJ1dGUubm9lcXVhbCIpOworCisgICAgICAgICByZWFkZXIuc2tpcFNwYWNlcygpOworICAgICAgICBjaGFyIHF1b3RlID0gKGNoYXIpIHJlYWRlci5uZXh0Q2hhcigpOworICAgICAgICBpZiAocXVvdGUgIT0gJ1wnJyAmJiBxdW90ZSAhPSAnIicpCisgICAgICAgICAgICBlcnIuanNwRXJyb3IocmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5hdHRyaWJ1dGUubm9xdW90ZSIpOworCisgICAgICAgICBTdHJpbmcgd2F0Y2hTdHJpbmcgPSAiIjsKKyAgICAgICAgaWYgKHJlYWRlci5tYXRjaGVzKCI8JT0iKSkKKyAgICAgICAgICAgIHdhdGNoU3RyaW5nID0gIiU+IjsKKyAgICAgICAgd2F0Y2hTdHJpbmcgPSB3YXRjaFN0cmluZyArIHF1b3RlOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IHBhcnNlQXR0cmlidXRlVmFsdWUod2F0Y2hTdHJpbmcpOworICAgICAgICBhdHRycy5hZGRBdHRyaWJ1dGUodXJpLCBsb2NhbE5hbWUsIHFOYW1lLCAiQ0RBVEEiLCBhdHRyVmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOYW1lIDo6PSAoTGV0dGVyIHwgJ18nIHwgJzonKSAoTGV0dGVyIHwgRGlnaXQgfCAnLicgfCAnXycgfCAnLScgfCAnOicpKgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhcnNlTmFtZSgpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBjaGFyIGNoID0gKGNoYXIpcmVhZGVyLnBlZWtDaGFyKCk7CisgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoY2gpIHx8IGNoID09ICdfJyB8fCBjaCA9PSAnOicpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBidWYuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Q2hhcigpOworICAgICAgICAgICAgY2ggPSAoY2hhcilyZWFkZXIucGVla0NoYXIoKTsKKyAgICAgICAgICAgIHdoaWxlIChDaGFyYWN0ZXIuaXNMZXR0ZXIoY2gpIHx8IENoYXJhY3Rlci5pc0RpZ2l0KGNoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gJy4nIHx8IGNoID09ICdfJyB8fCBjaCA9PSAnLScgfHwgY2ggPT0gJzonKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjaCk7CisgICAgICAgICAgICAgICAgcmVhZGVyLm5leHRDaGFyKCk7CisgICAgICAgICAgICAgICAgY2ggPSAoY2hhcikgcmVhZGVyLnBlZWtDaGFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0cmlidXRlVmFsdWVEb3VibGUgOjo9IChRdW90ZWRDaGFyIC0gJyInKSoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCciJyB8IDxUUkFOU0xBVElPTl9FUlJPUj4pCisgICAgICogUlRBdHRyaWJ1dGVWYWx1ZURvdWJsZSA6Oj0gKChRdW90ZWRDaGFyIC0gJyInKSogLSAoKFF1b3RlZENoYXItJyInKSclPiInKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnJT4iJyB8IFRSQU5TTEFUSU9OX0VSUk9SKQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhcnNlQXR0cmlidXRlVmFsdWUoU3RyaW5nIHdhdGNoKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgTWFyayBzdGFydCA9IHJlYWRlci5tYXJrKCk7CisgICAgICAgIE1hcmsgc3RvcCA9IHJlYWRlci5za2lwVW50aWxJZ25vcmVFc2Mod2F0Y2gpOworICAgICAgICBpZiAoc3RvcCA9PSBudWxsKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IuYXR0cmlidXRlLnVudGVybWluYXRlZCIsIHdhdGNoKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZXQgPSBwYXJzZVF1b3RlZChyZWFkZXIuZ2V0VGV4dChzdGFydCwgc3RvcCkpOworICAgICAgICBpZiAod2F0Y2gubGVuZ3RoKCkgPT0gMSkgICAgICAgIC8vIHF1b3RlCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIC8vIHB1dGJhY2sgZGVsaW1pdGVyICc8JT0nIGFuZCAnJT4nLCBzaW5jZSB0aGV5IGFyZSBuZWVkZWQgaWYgdGhlCisgICAgICAgIC8vIGF0dHJpYnV0ZSBkb2VzIG5vdCBhbGxvdyBSVGV4cHJlc3Npb24uCisgICAgICAgIHJldHVybiAiPCU9IiArIHJldCArICIlPiI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVvdGVkQ2hhciA6Oj0gICAnJmFwb3M7JworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHwgJyZxdW90OycKKyAgICAgKiAgICAgICAgICAgICAgICB8ICdcXCcKKyAgICAgKiAgICAgICAgICAgICAgICB8ICdcIicKKyAgICAgKiAgICAgICAgICAgICAgICB8ICJcJyIKKyAgICAgKiAgICAgICAgICAgICAgICB8ICdcPicKKyAgICAgKiAgICAgICAgICAgICAgICB8ICdcJCcKKyAgICAgKiAgICAgICAgICAgICAgICB8IENoYXIKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXJzZVF1b3RlZChTdHJpbmcgdHgpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaW50IHNpemUgPSB0eC5sZW5ndGgoKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoaSA8IHNpemUpIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSB0eC5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoY2ggPT0gJyYnKSB7CisgICAgICAgICAgICAgICAgaWYgKGkrNSA8IHNpemUgJiYgdHguY2hhckF0KGkrMSkgPT0gJ2EnCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eC5jaGFyQXQoaSsyKSA9PSAncCcgJiYgdHguY2hhckF0KGkrMykgPT0gJ28nCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eC5jaGFyQXQoaSs0KSA9PSAncycgJiYgdHguY2hhckF0KGkrNSkgPT0gJzsnKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ1wnJyk7CisgICAgICAgICAgICAgICAgICAgIGkgKz0gNjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkrNSA8IHNpemUgJiYgdHguY2hhckF0KGkrMSkgPT0gJ3EnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eC5jaGFyQXQoaSsyKSA9PSAndScgJiYgdHguY2hhckF0KGkrMykgPT0gJ28nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eC5jaGFyQXQoaSs0KSA9PSAndCcgJiYgdHguY2hhckF0KGkrNSkgPT0gJzsnKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJyInKTsKKyAgICAgICAgICAgICAgICAgICAgaSArPSA2OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY2gpOworICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXFwnICYmIGkrMSA8IHNpemUpIHsKKyAgICAgICAgICAgICAgICBjaCA9IHR4LmNoYXJBdChpKzEpOworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnIHx8IGNoID09ICdcIicgfHwgY2ggPT0gJ1wnJyB8fCBjaCA9PSAnPicpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjaCk7CisgICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICckJykgeworICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlICJcJCIgd2l0aCBzb21lIHNwZWNpYWwgY2hhci4gIFhYWCBoYWNrIQorICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKENvbnN0YW50cy5IQUNLX0NIQVIpOworICAgICAgICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnXFwnKTsKKyAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjaCk7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBwYXJzZVNjcmlwdFRleHQoU3RyaW5nIHR4KSB7CisgICAgICAgIENoYXJBcnJheVdyaXRlciBjdyA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoKTsKKyAgICAgICAgaW50IHNpemUgPSB0eC5sZW5ndGgoKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoaSA8IHNpemUpIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSB0eC5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoaSsyIDwgc2l6ZSAmJiBjaCA9PSAnJScgJiYgdHguY2hhckF0KGkrMSkgPT0gJ1xcJworICAgICAgICAgICAgICAgICAgICAmJiB0eC5jaGFyQXQoaSsyKSA9PSAnPicpIHsKKyAgICAgICAgICAgICAgICBjdy53cml0ZSgnJScpOworICAgICAgICAgICAgICAgIGN3LndyaXRlKCc+Jyk7CisgICAgICAgICAgICAgICAgaSArPSAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjdy53cml0ZShjaCk7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGN3LmNsb3NlKCk7CisgICAgICAgIHJldHVybiBjdy50b1N0cmluZygpOworICAgIH0KKworICAgIC8qCisgICAgICogSW52b2tlcyBwYXJzZXJDb250cm9sbGVyIHRvIHBhcnNlIHRoZSBpbmNsdWRlZCBwYWdlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbmNsdWRlRGlyZWN0aXZlKFN0cmluZyBmaWxlLCBOb2RlIHBhcmVudCkgCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXJDb250cm9sbGVyLnBhcnNlKGZpbGUsIHBhcmVudCwgamFyRmlsZVVybCk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLmZpbGUubm90LmZvdW5kIiwgZmlsZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQYXJzZXMgYSBwYWdlIGRpcmVjdGl2ZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorICAgICAqICAgUGFnZURpcmVjdGl2ZSA6Oj0gKCBTIEF0dHJpYnV0ZSkqCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUGFnZURpcmVjdGl2ZShOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBwYXJzZUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgTm9kZS5QYWdlRGlyZWN0aXZlIG4gPSBuZXcgTm9kZS5QYWdlRGlyZWN0aXZlKGF0dHJzLCBzdGFydCwgcGFyZW50KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBIHBhZ2UgZGlyZWN0aXZlIG1heSBjb250YWluIG11bHRpcGxlICdpbXBvcnQnIGF0dHJpYnV0ZXMsIGVhY2ggb2YKKyAgICAgICAgICogd2hpY2ggY29uc2lzdHMgb2YgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwYWNrYWdlIG5hbWVzLgorICAgICAgICAgKiBTdG9yZSBlYWNoIGxpc3Qgd2l0aCB0aGUgbm9kZSwgd2hlcmUgaXQgaXMgcGFyc2VkLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoImltcG9ydCIuZXF1YWxzKGF0dHJzLmdldFFOYW1lKGkpKSkgeworICAgICAgICAgICAgICAgIG4uYWRkSW1wb3J0KGF0dHJzLmdldFZhbHVlKGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUGFyc2VzIGFuIGluY2x1ZGUgZGlyZWN0aXZlIHdpdGggdGhlIGZvbGxvd2luZyBzeW50YXg6CisgICAgICogICBJbmNsdWRlRGlyZWN0aXZlIDo6PSAoIFMgQXR0cmlidXRlKSoKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VJbmNsdWRlRGlyZWN0aXZlKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IHBhcnNlQXR0cmlidXRlcygpOworCisgICAgICAgIC8vIEluY2x1ZGVkIGZpbGUgZXhwYW5kZWQgaGVyZQorICAgICAgICBOb2RlIGluY2x1ZGVOb2RlID0gbmV3IE5vZGUuSW5jbHVkZURpcmVjdGl2ZShhdHRycywgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIHByb2Nlc3NJbmNsdWRlRGlyZWN0aXZlKGF0dHJzLmdldFZhbHVlKCJmaWxlIiksIGluY2x1ZGVOb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaXN0IG9mIGZpbGVzLiAgVGhpcyBpcyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgaW5jbHVkZS1wcmVsdWRlCisgICAgICogYW5kIGluY2x1ZGUtY29kYSBvZiBqc3AtY29uZmlnIGVsZW1lbnQgaW4gd2ViLnhtbAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRJbmNsdWRlKE5vZGUgcGFyZW50LCBMaXN0IGZpbGVzKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoIGZpbGVzICE9IG51bGwgKSB7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gZmlsZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgQXR0cmlidXRlc0ltcGwgYXR0cnMgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKKyAgICAgICAgICAgICAgICBhdHRycy5hZGRBdHRyaWJ1dGUoIiIsICJmaWxlIiwgImZpbGUiLCAiQ0RBVEEiLCBmaWxlKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGR1bW15IEluY2x1ZGUgZGlyZWN0aXZlIG5vZGUKKyAgICAgICAgICAgICAgICBOb2RlIGluY2x1ZGVOb2RlID0gbmV3IE5vZGUuSW5jbHVkZURpcmVjdGl2ZShhdHRycywgCisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5tYXJrKCksIHBhcmVudCk7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0luY2x1ZGVEaXJlY3RpdmUoZmlsZSwgaW5jbHVkZU5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQYXJzZXMgYSB0YWdsaWIgZGlyZWN0aXZlIHdpdGggdGhlIGZvbGxvd2luZyBzeW50YXg6CisgICAgICogICBEaXJlY3RpdmUgOjo9ICggUyBBdHRyaWJ1dGUpKgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVRhZ2xpYkRpcmVjdGl2ZShOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IHBhcnNlQXR0cmlidXRlcygpOworICAgICAgICBTdHJpbmcgdXJpID0gYXR0cnMuZ2V0VmFsdWUoInVyaSIpOworICAgICAgICBTdHJpbmcgcHJlZml4ID0gYXR0cnMuZ2V0VmFsdWUoInByZWZpeCIpOworICAgICAgICBpZiAocHJlZml4ICE9IG51bGwpIHsKKyAgICAgICAgICAgIE1hcmsgcHJldk1hcmsgPSBwYWdlSW5mby5nZXROb25DdXN0b21UYWdQcmVmaXgocHJlZml4KTsKKyAgICAgICAgICAgIGlmIChwcmV2TWFyayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IucHJlZml4LnVzZV9iZWZvcmVfZGNsIiwKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4LCBwcmV2TWFyay5nZXRGaWxlKCksICIiICsgcHJldk1hcmsuZ2V0TGluZU51bWJlcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyB1cmlQcmV2ID0gcGFnZUluZm8uZ2V0VVJJKHByZWZpeCk7CisgICAgICAgICAgICAgICAgaWYgKHVyaVByZXYgIT0gbnVsbCAmJiAhdXJpUHJldi5lcXVhbHModXJpKSkgeworICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IocmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5wcmVmaXgucmVmaW5lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsIHVyaSwgdXJpUHJldik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwYWdlSW5mby5nZXRUYWdsaWIodXJpKSA9PSBudWxsKSB7CisgICAgICAgICAgICBUYWdMaWJyYXJ5SW5mb0ltcGwgaW1wbCA9IG51bGw7CisgICAgICAgICAgICBpZiAoY3R4dC5nZXRPcHRpb25zKCkuaXNDYWNoaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBpbXBsID0gKFRhZ0xpYnJhcnlJbmZvSW1wbCkgY3R4dC5nZXRPcHRpb25zKCkuZ2V0Q2FjaGUoKS5nZXQodXJpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbXBsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBsb2NhdGlvbiA9IGN0eHQuZ2V0VGxkTG9jYXRpb24odXJpKTsKKyAgICAgICAgICAgICAgICBpbXBsID0gbmV3IFRhZ0xpYnJhcnlJbmZvSW1wbChjdHh0LAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyQ29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoY3R4dC5nZXRPcHRpb25zKCkuaXNDYWNoaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY3R4dC5nZXRPcHRpb25zKCkuZ2V0Q2FjaGUoKS5wdXQodXJpLCBpbXBsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvLmFkZFRhZ2xpYih1cmksIGltcGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYWdlSW5mby5hZGRQcmVmaXhNYXBwaW5nKHByZWZpeCwgdXJpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRhZ2RpciA9IGF0dHJzLmdldFZhbHVlKCJ0YWdkaXIiKTsKKyAgICAgICAgICAgICAgICBpZiAodGFnZGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyblRhZ2RpciA9IFVSTl9KU1BUQUdESVIgKyB0YWdkaXI7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlSW5mby5nZXRUYWdsaWIodXJuVGFnZGlyKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWdlSW5mby5hZGRUYWdsaWIodXJuVGFnZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbXBsaWNpdFRhZ0xpYnJhcnlJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlckNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGFnZUluZm8uYWRkUHJlZml4TWFwcGluZyhwcmVmaXgsIHVyblRhZ2Rpcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbmV3IE5vZGUuVGFnbGliRGlyZWN0aXZlKGF0dHJzLCBzdGFydCwgcGFyZW50KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFBhcnNlcyBhIGRpcmVjdGl2ZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorICAgICAqICAgRGlyZWN0aXZlIDo6PSBTPyAoICAgJ3BhZ2UnIFBhZ2VEaXJlY3RpdmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICdpbmNsdWRlJyBJbmNsdWRlRGlyZWN0aXZlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAndGFnbGliJyBUYWdMaWJEaXJlY3RpdmUpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIFM/ICclPicKKyAgICAgKgorICAgICAqICAgVGFnRGlyZWN0aXZlIDo6PSBTPyAoJ3RhZycgUGFnZURpcmVjdGl2ZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJ2luY2x1ZGUnIEluY2x1ZGVEaXJlY3RpdmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICd0YWdsaWInIFRhZ0xpYkRpcmVjdGl2ZSkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8ICdhdHRyaWJ1dGUgQXR0cmlidXRlRGlyZWN0aXZlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgfCAndmFyaWFibGUgVmFyaWFibGVEaXJlY3RpdmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgUz8gJyU+JworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZURpcmVjdGl2ZShOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIHJlYWRlci5za2lwU3BhY2VzKCk7CisKKyAgICAgICAgU3RyaW5nIGRpcmVjdGl2ZSA9IG51bGw7CisgICAgICAgIGlmIChyZWFkZXIubWF0Y2hlcygicGFnZSIpKSB7CisgICAgICAgICAgICBkaXJlY3RpdmUgPSAiJmx0OyVAIHBhZ2UiOworICAgICAgICAgICAgaWYgKGlzVGFnRmlsZSkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihyZWFkZXIubWFyaygpLCAianNwLmVycm9yLmRpcmVjdGl2ZS5pc3RhZ2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFyc2VQYWdlRGlyZWN0aXZlKHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoImluY2x1ZGUiKSkgeworICAgICAgICAgICAgZGlyZWN0aXZlID0gIiZsdDslQCBpbmNsdWRlIjsKKyAgICAgICAgICAgIHBhcnNlSW5jbHVkZURpcmVjdGl2ZShwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCJ0YWdsaWIiKSkgeworICAgICAgICAgICAgaWYgKGRpcmVjdGl2ZXNPbmx5KSB7CisgICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBnZXQgdGhlIHRhZ0xpYkluZm8gb2JqZWN0cy4gIFRoaXMgYWxvcyBzdXBwcmVzc2VzCisgICAgICAgICAgICAgICAgLy8gcGFyc2luZyBvZiBhbnkgdGFnIGZpbGVzIHVzZWQgaW4gdGhpcyB0YWcgZmlsZS4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaXJlY3RpdmUgPSAiJmx0OyVAIHRhZ2xpYiI7CisgICAgICAgICAgICBwYXJzZVRhZ2xpYkRpcmVjdGl2ZShwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCJ0YWciKSkgeworICAgICAgICAgICAgZGlyZWN0aXZlID0gIiZsdDslQCB0YWciOworICAgICAgICAgICAgaWYgKCFpc1RhZ0ZpbGUpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IocmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5kaXJlY3RpdmUuaXNub3R0YWdmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhcnNlVGFnRGlyZWN0aXZlKHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoImF0dHJpYnV0ZSIpKSB7CisgICAgICAgICAgICBkaXJlY3RpdmUgPSAiJmx0OyVAIGF0dHJpYnV0ZSI7CisgICAgICAgICAgICBpZiAoIWlzVGFnRmlsZSkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihyZWFkZXIubWFyaygpLCAianNwLmVycm9yLmRpcmVjdGl2ZS5pc25vdHRhZ2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFyc2VBdHRyaWJ1dGVEaXJlY3RpdmUocGFyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygidmFyaWFibGUiKSkgeworICAgICAgICAgICAgZGlyZWN0aXZlID0gIiZsdDslQCB2YXJpYWJsZSI7CisgICAgICAgICAgICBpZiAoIWlzVGFnRmlsZSkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihyZWFkZXIubWFyaygpLCAianNwLmVycm9yLmRpcmVjdGl2ZS5pc25vdHRhZ2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFyc2VWYXJpYWJsZURpcmVjdGl2ZShwYXJlbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IuaW52YWxpZC5kaXJlY3RpdmUiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlYWRlci5za2lwU3BhY2VzKCk7CisgICAgICAgIGlmICghcmVhZGVyLm1hdGNoZXMoIiU+IikpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLCBkaXJlY3RpdmUpOworICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICAvKgorICAgICAqIFBhcnNlcyBhIGRpcmVjdGl2ZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorICAgICAqCisgICAgICogICBYTUxKU1BEaXJlY3RpdmVCb2R5IDo6PSBTPyAoICAgKCAncGFnZScgUGFnZURpcmVjdGl2ZUF0dHJMaXN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTPyAoICcvPicgfCAoICc+JyBTPyBFVGFnICkgKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCAnaW5jbHVkZScgSW5jbHVkZURpcmVjdGl2ZUF0dHJMaXN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTPyAoICcvPicgfCAoICc+JyBTPyBFVGFnICkgKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA8VFJBTlNMQVRJT05fRVJST1I+CisgICAgICoKKyAgICAgKiAgIFhNTFRhZ0RlZkRpcmVjdGl2ZUJvZHkgOjo9ICggICAoICd0YWcnIFRhZ0RpcmVjdGl2ZUF0dHJMaXN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTPyAoICcvPicgfCAoICc+JyBTPyBFVGFnICkgKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICggJ2luY2x1ZGUnIEluY2x1ZGVEaXJlY3RpdmVBdHRyTGlzdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUz8gKCAnLz4nIHwgKCAnPicgUz8gRVRhZyApICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoICdhdHRyaWJ1dGUnIEF0dHJpYnV0ZURpcmVjdGl2ZUF0dHJMaXN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTPyAoICcvPicgfCAoICc+JyBTPyBFVGFnICkgKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICggJ3ZhcmlhYmxlJyBWYXJpYWJsZURpcmVjdGl2ZUF0dHJMaXN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTPyAoICcvPicgfCAoICc+JyBTPyBFVGFnICkgKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgPFRSQU5TTEFUSU9OX0VSUk9SPgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVhNTERpcmVjdGl2ZShOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKworICAgICAgICBTdHJpbmcgZVRhZyA9IG51bGw7CisgICAgICAgaWYgKHJlYWRlci5tYXRjaGVzKCJwYWdlIikpIHsKKyAgICAgICAgICAgIGVUYWcgPSAianNwOmRpcmVjdGl2ZS5wYWdlIjsKKyAgICAgICAgICAgaWYgKGlzVGFnRmlsZSkgeworICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IuZGlyZWN0aXZlLmlzdGFnZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZsdDsiICsgZVRhZyk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgcGFyc2VQYWdlRGlyZWN0aXZlKHBhcmVudCk7CisgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiaW5jbHVkZSIpKSB7CisgICAgICAgICAgICBlVGFnID0gImpzcDpkaXJlY3RpdmUuaW5jbHVkZSI7CisgICAgICAgICAgIHBhcnNlSW5jbHVkZURpcmVjdGl2ZShwYXJlbnQpOworICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoInRhZyIpKSB7CisgICAgICAgICAgICBlVGFnID0gImpzcDpkaXJlY3RpdmUudGFnIjsKKyAgICAgICAgICAgaWYgKCFpc1RhZ0ZpbGUpIHsKKyAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihyZWFkZXIubWFyaygpLCAianNwLmVycm9yLmRpcmVjdGl2ZS5pc25vdHRhZ2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImbHQ7IiArIGVUYWcpOworICAgICAgICAgICB9CisgICAgICAgICAgIHBhcnNlVGFnRGlyZWN0aXZlKHBhcmVudCk7CisgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiYXR0cmlidXRlIikpIHsKKyAgICAgICAgICAgIGVUYWcgPSAianNwOmRpcmVjdGl2ZS5hdHRyaWJ1dGUiOworICAgICAgICAgICBpZiAoIWlzVGFnRmlsZSkgeworICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IuZGlyZWN0aXZlLmlzbm90dGFnZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZsdDsiICsgZVRhZyk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgcGFyc2VBdHRyaWJ1dGVEaXJlY3RpdmUocGFyZW50KTsKKyAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCJ2YXJpYWJsZSIpKSB7CisgICAgICAgICAgICBlVGFnID0gImpzcDpkaXJlY3RpdmUudmFyaWFibGUiOworICAgICAgICAgICBpZiAoIWlzVGFnRmlsZSkgeworICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IuZGlyZWN0aXZlLmlzbm90dGFnZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZsdDsiICsgZVRhZyk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgcGFyc2VWYXJpYWJsZURpcmVjdGl2ZShwYXJlbnQpOworICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIGVyci5qc3BFcnJvcihyZWFkZXIubWFyaygpLCAianNwLmVycm9yLmludmFsaWQuZGlyZWN0aXZlIik7CisgICAgICAgfQorCisgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgaWYoIHJlYWRlci5tYXRjaGVzKCAiPiIgKSApIHsKKyAgICAgICAgICAgIHJlYWRlci5za2lwU3BhY2VzKCk7CisgICAgICAgICAgICBpZiggIXJlYWRlci5tYXRjaGVzRVRhZyggZVRhZyApICkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLCAiJmx0OyIgKyBlVGFnICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggIXJlYWRlci5tYXRjaGVzKCAiLz4iICkgKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwgIiZsdDsiICsgZVRhZyApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQYXJzZXMgYSB0YWcgZGlyZWN0aXZlIHdpdGggdGhlIGZvbGxvd2luZyBzeW50YXg6CisgICAgICogICBQYWdlRGlyZWN0aXZlIDo6PSAoIFMgQXR0cmlidXRlKSoKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VUYWdEaXJlY3RpdmUoTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzID0gcGFyc2VBdHRyaWJ1dGVzKCk7CisgICAgICAgIE5vZGUuVGFnRGlyZWN0aXZlIG4gPSBuZXcgTm9kZS5UYWdEaXJlY3RpdmUoYXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEEgcGFnZSBkaXJlY3RpdmUgbWF5IGNvbnRhaW4gbXVsdGlwbGUgJ2ltcG9ydCcgYXR0cmlidXRlcywgZWFjaCBvZgorICAgICAgICAgKiB3aGljaCBjb25zaXN0cyBvZiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHBhY2thZ2UgbmFtZXMuCisgICAgICAgICAqIFN0b3JlIGVhY2ggbGlzdCB3aXRoIHRoZSBub2RlLCB3aGVyZSBpdCBpcyBwYXJzZWQuCisgICAgICAgICAqLworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgiaW1wb3J0Ii5lcXVhbHMoYXR0cnMuZ2V0UU5hbWUoaSkpKSB7CisgICAgICAgICAgICAgICAgbi5hZGRJbXBvcnQoYXR0cnMuZ2V0VmFsdWUoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQYXJzZXMgYSBhdHRyaWJ1dGUgZGlyZWN0aXZlIHdpdGggdGhlIGZvbGxvd2luZyBzeW50YXg6CisgICAgICogICBBdHRyaWJ1dGVEaXJlY3RpdmUgOjo9ICggUyBBdHRyaWJ1dGUpKgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZUF0dHJpYnV0ZURpcmVjdGl2ZShOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBwYXJzZUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgTm9kZS5BdHRyaWJ1dGVEaXJlY3RpdmUgbiA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuQXR0cmlidXRlRGlyZWN0aXZlKGF0dHJzLCBzdGFydCwgcGFyZW50KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFBhcnNlcyBhIHZhcmlhYmxlIGRpcmVjdGl2ZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorICAgICAqICAgUGFnZURpcmVjdGl2ZSA6Oj0gKCBTIEF0dHJpYnV0ZSkqCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlVmFyaWFibGVEaXJlY3RpdmUoTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzID0gcGFyc2VBdHRyaWJ1dGVzKCk7CisgICAgICAgIE5vZGUuVmFyaWFibGVEaXJlY3RpdmUgbiA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuVmFyaWFibGVEaXJlY3RpdmUoYXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworICAgIH0KKworICAgIC8qCisgICAgICogSlNQQ29tbWVudEJvZHkgOjo9IChDaGFyKiAtIChDaGFyKiAnLS0lPicpKSAnLS0lPicKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VDb21tZW50KE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsgICAgICAgIAorICAgICAgICBzdGFydCA9IHJlYWRlci5tYXJrKCk7CisgICAgICAgIE1hcmsgc3RvcCA9IHJlYWRlci5za2lwVW50aWwoIi0tJT4iKTsKKyAgICAgICAgaWYgKHN0b3AgPT0gbnVsbCkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsICImbHQ7JS0tIik7CisgICAgICAgIH0KKworICAgICAgICBuZXcgTm9kZS5Db21tZW50KHJlYWRlci5nZXRUZXh0KHN0YXJ0LCBzdG9wKSwgc3RhcnQsIHBhcmVudCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEZWNsYXJhdGlvbkJvZHkgOjo9IChDaGFyKiAtIChjaGFyKiAnJT4nKSkgJyU+JworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZURlY2xhcmF0aW9uKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnQgPSByZWFkZXIubWFyaygpOworICAgICAgICBNYXJrIHN0b3AgPSByZWFkZXIuc2tpcFVudGlsKCIlPiIpOworICAgICAgICBpZiAoc3RvcCA9PSBudWxsKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwgIiZsdDslISIpOworICAgICAgICB9CisKKyAgICAgICAgbmV3IE5vZGUuRGVjbGFyYXRpb24ocGFyc2VTY3JpcHRUZXh0KHJlYWRlci5nZXRUZXh0KHN0YXJ0LCBzdG9wKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBwYXJlbnQpOworICAgIH0KKworICAgIC8qCisgICAgICogWE1MRGVjbGFyYXRpb25Cb2R5IDo6PSAgICggUz8gJy8+JyApCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB8ICggUz8gJz4nIChDaGFyKiAtIChjaGFyKiAnPCcpKSBDRFNlY3Q/KSogRVRhZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgfCA8VFJBTlNMQVRJT05fRVJST1I+CisgICAgICogQ0RTZWN0IDo6PSBDRFN0YXJ0IENEYXRhIENERW5kCisgICAgICogQ0RTdGFydCA6Oj0gJzwhW0NEQVRBWycKKyAgICAgKiBDRGF0YSA6Oj0gKENoYXIqIC0gKENoYXIqICddXT4nIENoYXIqKSkKKyAgICAgKiBDREVuZCA6Oj0gJ11dPicKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VYTUxEZWNsYXJhdGlvbihOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIHJlYWRlci5za2lwU3BhY2VzKCk7CisgICAgICAgIGlmKCAhcmVhZGVyLm1hdGNoZXMoICIvPiIgKSApIHsKKyAgICAgICAgICAgIGlmKCAhcmVhZGVyLm1hdGNoZXMoICI+IiApICkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiZsdDtqc3A6ZGVjbGFyYXRpb24mZ3Q7Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNYXJrIHN0b3A7CisgICAgICAgICAgICBTdHJpbmcgdGV4dDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSByZWFkZXIubWFyaygpOworICAgICAgICAgICAgICAgIHN0b3AgPSByZWFkZXIuc2tpcFVudGlsKCI8Iik7CisgICAgICAgICAgICAgICAgaWYgKHN0b3AgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICImbHQ7anNwOmRlY2xhcmF0aW9uJmd0OyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZXh0ID0gcGFyc2VTY3JpcHRUZXh0KHJlYWRlci5nZXRUZXh0KHN0YXJ0LCBzdG9wKSk7CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuRGVjbGFyYXRpb24odGV4dCwgc3RhcnQsIHBhcmVudCk7CisgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5tYXRjaGVzKCIhW0NEQVRBWyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcmVhZGVyLm1hcmsoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHJlYWRlci5za2lwVW50aWwoIl1dPiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwgIkNEQVRBIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhcnNlU2NyaXB0VGV4dChyZWFkZXIuZ2V0VGV4dChzdGFydCwgc3RvcCkpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9kZS5EZWNsYXJhdGlvbih0ZXh0LCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICghcmVhZGVyLm1hdGNoZXNFVGFnV2l0aG91dExlc3NUaGFuKCAianNwOmRlY2xhcmF0aW9uIiApICkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiZsdDtqc3A6ZGVjbGFyYXRpb24mZ3Q7Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEV4cHJlc3Npb25Cb2R5IDo6PSAoQ2hhciogLSAoY2hhciogJyU+JykpICclPicKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VFeHByZXNzaW9uKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnQgPSByZWFkZXIubWFyaygpOworICAgICAgICBNYXJrIHN0b3AgPSByZWFkZXIuc2tpcFVudGlsKCIlPiIpOworICAgICAgICBpZiAoc3RvcCA9PSBudWxsKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwgIiZsdDslPSIpOworICAgICAgICB9CisKKyAgICAgICAgbmV3IE5vZGUuRXhwcmVzc2lvbihwYXJzZVNjcmlwdFRleHQocmVhZGVyLmdldFRleHQoc3RhcnQsIHN0b3ApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgcGFyZW50KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFhNTEV4cHJlc3Npb25Cb2R5IDo6PSAgICggUz8gJy8+JyApCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHwgKCBTPyAnPicgKENoYXIqIC0gKGNoYXIqICc8JykpIENEU2VjdD8pKiBFVGFnICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgfCA8VFJBTlNMQVRJT05fRVJST1I+CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlWE1MRXhwcmVzc2lvbihOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIHJlYWRlci5za2lwU3BhY2VzKCk7CisgICAgICAgIGlmKCAhcmVhZGVyLm1hdGNoZXMoICIvPiIgKSApIHsKKyAgICAgICAgICAgIGlmKCAhcmVhZGVyLm1hdGNoZXMoICI+IiApICkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAiJmx0O2pzcDpleHByZXNzaW9uJmd0OyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWFyayBzdG9wOworICAgICAgICAgICAgU3RyaW5nIHRleHQ7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gcmVhZGVyLm1hcmsoKTsKKyAgICAgICAgICAgICAgICBzdG9wID0gcmVhZGVyLnNraXBVbnRpbCgiPCIpOworICAgICAgICAgICAgICAgIGlmIChzdG9wID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJmx0O2pzcDpleHByZXNzaW9uJmd0OyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZXh0ID0gcGFyc2VTY3JpcHRUZXh0KHJlYWRlci5nZXRUZXh0KHN0YXJ0LCBzdG9wKSk7CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuRXhwcmVzc2lvbih0ZXh0LCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAocmVhZGVyLm1hdGNoZXMoIiFbQ0RBVEFbIikpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSByZWFkZXIubWFyaygpOworICAgICAgICAgICAgICAgICAgICBzdG9wID0gcmVhZGVyLnNraXBVbnRpbCgiXV0+Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdG9wID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLCAiQ0RBVEEiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFyc2VTY3JpcHRUZXh0KHJlYWRlci5nZXRUZXh0KHN0YXJ0LCBzdG9wKSk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb2RlLkV4cHJlc3Npb24odGV4dCwgc3RhcnQsIHBhcmVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXJlYWRlci5tYXRjaGVzRVRhZ1dpdGhvdXRMZXNzVGhhbiggImpzcDpleHByZXNzaW9uIiApKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICImbHQ7anNwOmV4cHJlc3Npb24mZ3Q7Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEVMRXhwcmVzc2lvbkJvZHkKKyAgICAgKiAoZm9sbG93aW5nICIkeyIgdG8gZmlyc3QgdW5xdW90ZWQgIn0iKQorICAgICAqIC8vIFhYWCBhZGQgZm9ybWFsIHByb2R1Y3Rpb24gYW5kIGNvbmZpcm0gaW1wbGVtZW50YXRpb24gYWdhaW5zdCBpdCwKKyAgICAgKiAvLyAgICAgb25jZSBpdCdzIGRlY2lkZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VFTEV4cHJlc3Npb24oTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBzdGFydCA9IHJlYWRlci5tYXJrKCk7CisgICAgICAgIE1hcmsgbGFzdCA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gc2luZ2xlUXVvdGVkID0gZmFsc2UsIGRvdWJsZVF1b3RlZCA9IGZhbHNlOworICAgICAgICBpbnQgY3VycmVudENoYXI7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8vIFhYWCBjb3VsZCBtb3ZlIHRoaXMgbG9naWMgdG8gSnNwUmVhZGVyCisgICAgICAgICAgICBsYXN0ID0gcmVhZGVyLm1hcmsoKTsgICAgICAgICAgICAgICAvLyBYWFggc29tZXdoYXQgd2FzdGVmdWwKKyAgICAgICAgICAgIGN1cnJlbnRDaGFyID0gcmVhZGVyLm5leHRDaGFyKCk7CisgICAgICAgICAgICBpZiAoY3VycmVudENoYXIgPT0gJ1xcJyAmJiAoc2luZ2xlUXVvdGVkIHx8IGRvdWJsZVF1b3RlZCkpIHsKKyAgICAgICAgICAgICAgICAvLyBza2lwIGNoYXJhY3RlciBmb2xsb3dpbmcgJ1wnIHdpdGhpbiBxdW90ZXMKKyAgICAgICAgICAgICAgICByZWFkZXIubmV4dENoYXIoKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50Q2hhciA9IHJlYWRlci5uZXh0Q2hhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN1cnJlbnRDaGFyID09IC0xKQorICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLCAiJHsiKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50Q2hhciA9PSAnIicpCisgICAgICAgICAgICAgICAgZG91YmxlUXVvdGVkID0gIWRvdWJsZVF1b3RlZDsKKyAgICAgICAgICAgIGlmIChjdXJyZW50Q2hhciA9PSAnXCcnKQorICAgICAgICAgICAgICAgIHNpbmdsZVF1b3RlZCA9ICFzaW5nbGVRdW90ZWQ7CisgICAgICAgIH0gd2hpbGUgKGN1cnJlbnRDaGFyICE9ICd9JyB8fCAoc2luZ2xlUXVvdGVkIHx8IGRvdWJsZVF1b3RlZCkpOworCisgICAgICAgIG5ldyBOb2RlLkVMRXhwcmVzc2lvbihyZWFkZXIuZ2V0VGV4dChzdGFydCwgbGFzdCksIHN0YXJ0LCBwYXJlbnQpOworICAgIH0KKworICAgIC8qCisgICAgICogU2NyaXB0bGV0Qm9keSA6Oj0gKENoYXIqIC0gKGNoYXIqICclPicpKSAnJT4nCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlU2NyaXB0bGV0KE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnQgPSByZWFkZXIubWFyaygpOworICAgICAgICBNYXJrIHN0b3AgPSByZWFkZXIuc2tpcFVudGlsKCIlPiIpOworICAgICAgICBpZiAoc3RvcCA9PSBudWxsKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwgIiZsdDslIik7CisgICAgICAgIH0KKworICAgICAgICBuZXcgTm9kZS5TY3JpcHRsZXQocGFyc2VTY3JpcHRUZXh0KHJlYWRlci5nZXRUZXh0KHN0YXJ0LCBzdG9wKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgcGFyZW50KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFhNTFNjcmlwdGxldEJvZHkgOjo9ICAgKCBTPyAnLz4nICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8ICggUz8gJz4nIChDaGFyKiAtIChjaGFyKiAnPCcpKSBDRFNlY3Q/KSogRVRhZyApCisgICAgICogICAgICAgICAgICAgICAgICAgICAgfCA8VFJBTlNMQVRJT05fRVJST1I+CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlWE1MU2NyaXB0bGV0KE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgaWYoICFyZWFkZXIubWF0Y2hlcyggIi8+IiApICkgeworICAgICAgICAgICAgaWYoICFyZWFkZXIubWF0Y2hlcyggIj4iICkgKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICImbHQ7anNwOnNjcmlwdGxldCZndDsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1hcmsgc3RvcDsKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0OworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBzdGFydCA9IHJlYWRlci5tYXJrKCk7CisgICAgICAgICAgICAgICAgc3RvcCA9IHJlYWRlci5za2lwVW50aWwoIjwiKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RvcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiZsdDtqc3A6c2NyaXB0bGV0Jmd0OyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZXh0ID0gcGFyc2VTY3JpcHRUZXh0KHJlYWRlci5nZXRUZXh0KHN0YXJ0LCBzdG9wKSk7CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuU2NyaXB0bGV0KHRleHQsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICAgICAgICAgIGlmIChyZWFkZXIubWF0Y2hlcygiIVtDREFUQVsiKSkgeworICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHJlYWRlci5tYXJrKCk7CisgICAgICAgICAgICAgICAgICAgIHN0b3AgPSByZWFkZXIuc2tpcFVudGlsKCJdXT4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3AgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsICJDREFUQSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXJzZVNjcmlwdFRleHQocmVhZGVyLmdldFRleHQoc3RhcnQsIHN0b3ApKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vZGUuU2NyaXB0bGV0KHRleHQsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXJlYWRlci5tYXRjaGVzRVRhZ1dpdGhvdXRMZXNzVGhhbiggImpzcDpzY3JpcHRsZXQiICkpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgIiZsdDtqc3A6c2NyaXB0bGV0Jmd0OyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICAvKioKKyAgICAgKiBQYXJhbSA6Oj0gJzxqc3A6cGFyYW0nIFMgQXR0cmlidXRlcyBTPyBFbXB0eUJvZHkgUz8KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VQYXJhbShOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghcmVhZGVyLm1hdGNoZXMoIjxqc3A6cGFyYW0iKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IucGFyYW1leHBlY3RlZCIpOworICAgICAgICB9CisgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBwYXJzZUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgCisgICAgICAgIE5vZGUgcGFyYW1BY3Rpb25Ob2RlID0gbmV3IE5vZGUuUGFyYW1BY3Rpb24oIGF0dHJzLCBzdGFydCwgcGFyZW50ICk7CisgICAgICAgIAorICAgICAgICBwYXJzZUVtcHR5Qm9keSggcGFyYW1BY3Rpb25Ob2RlLCAianNwOnBhcmFtIiApOworICAgICAgICAKKyAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciBJbmNsdWRlOgorICAgICAqIFN0ZEFjdGlvbkNvbnRlbnQgOjo9IEF0dHJpYnV0ZXMgUGFyYW1Cb2R5CisgICAgICoKKyAgICAgKiBQYXJhbUJvZHkgOjo9ICAgRW1wdHlCb2R5CisgICAgICogICAgICAgICAgICAgICB8ICggJz4nIFM/ICggJzxqc3A6YXR0cmlidXRlJyBOYW1lZEF0dHJpYnV0ZXMgKT8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAnPGpzcDpib2R5JworICAgICAqICAgICAgICAgICAgICAgICAgIChKc3BCb2R5UGFyYW0gfCA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICBTPyBFVGFnCisgICAgICogICAgICAgICAgICAgICAgICkKKyAgICAgKiAgICAgICAgICAgICAgIHwgKCAnPicgUz8gUGFyYW0qIEVUYWcgKQorICAgICAqCisgICAgICogRW1wdHlCb2R5IDo6PSAgICcvPicKKyAgICAgKiAgICAgICAgICAgICAgIHwgKCAnPicgRVRhZyApCisgICAgICogICAgICAgICAgICAgICB8ICggJz4nIFM/ICc8anNwOmF0dHJpYnV0ZScgTmFtZWRBdHRyaWJ1dGVzIEVUYWcgKQorICAgICAqCisgICAgICogSnNwQm9keVBhcmFtIDo6PSBTPyAnPicgUGFyYW0qICc8L2pzcDpib2R5PicKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VJbmNsdWRlKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IHBhcnNlQXR0cmlidXRlcygpOworICAgICAgICByZWFkZXIuc2tpcFNwYWNlcygpOworCisgICAgICAgIE5vZGUgaW5jbHVkZU5vZGUgPSBuZXcgTm9kZS5JbmNsdWRlQWN0aW9uKCBhdHRycywgc3RhcnQsIHBhcmVudCApOworICAgICAgICAKKyAgICAgICAgcGFyc2VPcHRpb25hbEJvZHkoaW5jbHVkZU5vZGUsICJqc3A6aW5jbHVkZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBKQVZBWF9CT0RZX0NPTlRFTlRfUEFSQU0pOworICAgIH0KKworICAgIC8qCisgICAgICogRm9yIEZvcndhcmQ6CisgICAgICogU3RkQWN0aW9uQ29udGVudCA6Oj0gQXR0cmlidXRlcyBQYXJhbUJvZHkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VGb3J3YXJkKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IHBhcnNlQXR0cmlidXRlcygpOworICAgICAgICByZWFkZXIuc2tpcFNwYWNlcygpOworCisgICAgICAgIE5vZGUgZm9yd2FyZE5vZGUgPSBuZXcgTm9kZS5Gb3J3YXJkQWN0aW9uKCBhdHRycywgc3RhcnQsIHBhcmVudCApOworICAgICAgICAKKyAgICAgICAgcGFyc2VPcHRpb25hbEJvZHkoZm9yd2FyZE5vZGUsICJqc3A6Zm9yd2FyZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEpBVkFYX0JPRFlfQ09OVEVOVF9QQVJBTSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlSW52b2tlKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IHBhcnNlQXR0cmlidXRlcygpOworICAgICAgICByZWFkZXIuc2tpcFNwYWNlcygpOworCisgICAgICAgIE5vZGUgaW52b2tlTm9kZSA9IG5ldyBOb2RlLkludm9rZUFjdGlvbihhdHRycywgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIAorICAgICAgICBwYXJzZUVtcHR5Qm9keShpbnZva2VOb2RlLCAianNwOmludm9rZSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYXJzZURvQm9keShOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBwYXJzZUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKworICAgICAgICBOb2RlIGRvQm9keU5vZGUgPSBuZXcgTm9kZS5Eb0JvZHlBY3Rpb24oYXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICAKKyAgICAgICAgcGFyc2VFbXB0eUJvZHkoZG9Cb2R5Tm9kZSwgImpzcDpkb0JvZHkiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VFbGVtZW50KE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IHBhcnNlQXR0cmlidXRlcygpOworICAgICAgICByZWFkZXIuc2tpcFNwYWNlcygpOworCisgICAgICAgIE5vZGUgZWxlbWVudE5vZGUgPSBuZXcgTm9kZS5Kc3BFbGVtZW50KGF0dHJzLCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgCisgICAgICAgIHBhcnNlT3B0aW9uYWxCb2R5KCBlbGVtZW50Tm9kZSwgImpzcDplbGVtZW50IiwgCisgICAgICAgICAgICBUYWdJbmZvLkJPRFlfQ09OVEVOVF9KU1AgKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciBHZXRQcm9wZXJ0eToKKyAgICAgKiBTdGRBY3Rpb25Db250ZW50IDo6PSBBdHRyaWJ1dGVzIEVtcHR5Qm9keQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZUdldFByb3BlcnR5KE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IHBhcnNlQXR0cmlidXRlcygpOworICAgICAgICByZWFkZXIuc2tpcFNwYWNlcygpOworCisgICAgICAgIE5vZGUgZ2V0UHJvcGVydHlOb2RlID0gbmV3IE5vZGUuR2V0UHJvcGVydHkoIGF0dHJzLCBzdGFydCwgcGFyZW50ICk7CisgICAgICAgIAorICAgICAgICBwYXJzZU9wdGlvbmFsQm9keShnZXRQcm9wZXJ0eU5vZGUsICJqc3A6Z2V0UHJvcGVydHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUYWdJbmZvLkJPRFlfQ09OVEVOVF9FTVBUWSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGb3IgU2V0UHJvcGVydHk6CisgICAgICogU3RkQWN0aW9uQ29udGVudCA6Oj0gQXR0cmlidXRlcyBFbXB0eUJvZHkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VTZXRQcm9wZXJ0eShOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBwYXJzZUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKworICAgICAgICBOb2RlIHNldFByb3BlcnR5Tm9kZSA9IG5ldyBOb2RlLlNldFByb3BlcnR5KCBhdHRycywgc3RhcnQsIHBhcmVudCApOworICAgICAgICAKKyAgICAgICAgcGFyc2VPcHRpb25hbEJvZHkoc2V0UHJvcGVydHlOb2RlLCAianNwOnNldFByb3BlcnR5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGFnSW5mby5CT0RZX0NPTlRFTlRfRU1QVFkpOworICAgIH0KKworICAgIC8qCisgICAgICogRW1wdHlCb2R5IDo6PSAgICcvPicKKyAgICAgKiAgICAgICAgICAgICAgIHwgKCAnPicgRVRhZyApCisgICAgICogICAgICAgICAgICAgICB8ICggJz4nIFM/ICc8anNwOmF0dHJpYnV0ZScgTmFtZWRBdHRyaWJ1dGVzIEVUYWcgKQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZUVtcHR5Qm9keSggTm9kZSBwYXJlbnQsIFN0cmluZyB0YWcgKSAKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYoIHJlYWRlci5tYXRjaGVzKCIvPiIpICkgeworICAgICAgICAgICAgLy8gRG9uZQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHJlYWRlci5tYXRjaGVzKCAiPiIgKSApIHsKKyAgICAgICAgICAgIGlmKCByZWFkZXIubWF0Y2hlc0VUYWcoIHRhZyApICkgeworICAgICAgICAgICAgICAgIC8vIERvbmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHJlYWRlci5tYXRjaGVzT3B0aW9uYWxTcGFjZXNGb2xsb3dlZEJ5KAorICAgICAgICAgICAgICAgICI8anNwOmF0dHJpYnV0ZSIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIG9uZSBvciBtb3JlIG5hbWVkIGF0dHJpYnV0ZSBub2RlcworICAgICAgICAgICAgICAgIHBhcnNlTmFtZWRBdHRyaWJ1dGVzKCBwYXJlbnQgKTsKKyAgICAgICAgICAgICAgICBpZiggIXJlYWRlci5tYXRjaGVzRVRhZyggdGFnICkgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEJvZHkgbm90IGFsbG93ZWQKKyAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLmpzcGJvZHkuZW1wdHlib2R5Lm9ubHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiZsdDsiICsgdGFnICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IuanNwYm9keS5lbXB0eWJvZHkub25seSIsCisgICAgICAgICAgICAgICAgICAgICImbHQ7IiArIHRhZyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwKKyAgICAgICAgICAgICAgICAiJmx0OyIgKyB0YWcgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogRm9yIFVzZUJlYW46CisgICAgICogU3RkQWN0aW9uQ29udGVudCA6Oj0gQXR0cmlidXRlcyBPcHRpb25hbEJvZHkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VVc2VCZWFuKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IHBhcnNlQXR0cmlidXRlcygpOworICAgICAgICByZWFkZXIuc2tpcFNwYWNlcygpOworICAgICAgICAKKyAgICAgICAgTm9kZSB1c2VCZWFuTm9kZSA9IG5ldyBOb2RlLlVzZUJlYW4oIGF0dHJzLCBzdGFydCwgcGFyZW50ICk7CisgICAgICAgIAorICAgICAgICBwYXJzZU9wdGlvbmFsQm9keSggdXNlQmVhbk5vZGUsICJqc3A6dXNlQmVhbiIsIAorICAgICAgICAgICAgVGFnSW5mby5CT0RZX0NPTlRFTlRfSlNQICk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQYXJzZXMgT3B0aW9uYWxCb2R5LCBidXQgYWxzbyByZXVzZWQgdG8gcGFyc2UgYm9kaWVzIGZvciBwbHVnaW4KKyAgICAgKiBhbmQgcGFyYW0gc2luY2UgdGhlIHN5bnRheCBpcyBpZGVudGljYWwgKHRoZSBvbmx5IHRoaW5nIHRoYXQKKyAgICAgKiBkaWZmZXJzIHN1YnN0YW50aWFsbHkgaXMgaG93IHRvIHByb2Nlc3MgdGhlIGJvZHksIGFuZCB0aHVzCisgICAgICogd2UgYWNjZXB0IHRoZSBib2R5IHR5cGUgYXMgYSBwYXJhbWV0ZXIpLgorICAgICAqCisgICAgICogT3B0aW9uYWxCb2R5IDo6PSBFbXB0eUJvZHkgfCBBY3Rpb25Cb2R5CisgICAgICoKKyAgICAgKiBTY3JpcHRsZXNzT3B0aW9uYWxCb2R5IDo6PSBFbXB0eUJvZHkgfCBTY3JpcHRsZXNzQWN0aW9uQm9keQorICAgICAqCisgICAgICogVGFnRGVwZW5kZW50T3B0aW9uYWxCb2R5IDo6PSBFbXB0eUJvZHkgfCBUYWdEZXBlbmRlbnRBY3Rpb25Cb2R5CisgICAgICoKKyAgICAgKiBFbXB0eUJvZHkgOjo9ICAgJy8+JworICAgICAqICAgICAgICAgICAgICAgfCAoICc+JyBFVGFnICkKKyAgICAgKiAgICAgICAgICAgICAgIHwgKCAnPicgUz8gJzxqc3A6YXR0cmlidXRlJyBOYW1lZEF0dHJpYnV0ZXMgRVRhZyApCisgICAgICoKKyAgICAgKiBBY3Rpb25Cb2R5IDo6PSAgIEpzcEF0dHJpYnV0ZUFuZEJvZHkKKyAgICAgKiAgICAgICAgICAgICAgICB8ICggJz4nIEJvZHkgRVRhZyApCisgICAgICoKKyAgICAgKiBTY3JpcHRsZXNzQWN0aW9uQm9keSA6Oj0gICBKc3BBdHRyaWJ1dGVBbmRCb2R5IAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB8ICggJz4nIFNjcmlwdGxlc3NCb2R5IEVUYWcgKQorICAgICAqIAorICAgICAqIFRhZ0RlcGVuZGVudEFjdGlvbkJvZHkgOjo9ICAgSnNwQXR0cmlidXRlQW5kQm9keQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCAnPicgVGFnRGVwZW5kZW50Qm9keSBFVGFnICkKKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZU9wdGlvbmFsQm9keSggTm9kZSBwYXJlbnQsIFN0cmluZyB0YWcsIFN0cmluZyBib2R5VHlwZSApIAorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIAorICAgIHsKKyAgICAgICAgaWYgKHJlYWRlci5tYXRjaGVzKCIvPiIpKSB7CisgICAgICAgICAgICAvLyBFbXB0eUJvZHkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmVhZGVyLm1hdGNoZXMoIj4iKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJmx0OyIgKyB0YWcgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoIHJlYWRlci5tYXRjaGVzRVRhZyggdGFnICkgKSB7CisgICAgICAgICAgICAvLyBFbXB0eUJvZHkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoICFwYXJzZUpzcEF0dHJpYnV0ZUFuZEJvZHkoIHBhcmVudCwgdGFnLCBib2R5VHlwZSApICkgeworICAgICAgICAgICAgLy8gTXVzdCBiZSAoICc+JyAjIEJvZHkgRVRhZyApCisgICAgICAgICAgICBwYXJzZUJvZHkocGFyZW50LCB0YWcsIGJvZHlUeXBlICk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gcGFyc2UgJ0pzcEF0dHJpYnV0ZUFuZEJvZHknIHByb2R1Y3Rpb24uICBSZXR1cm5zIHRydWUgaWYKKyAgICAgKiBpdCBtYXRjaGVkLCBvciBmYWxzZSBpZiBub3QuICBBc3N1bWVzIEVtcHR5Qm9keSBpcyBva2F5IGFzIHdlbGwuCisgICAgICoKKyAgICAgKiBKc3BBdHRyaWJ1dGVBbmRCb2R5IDo6PQorICAgICAqICAgICAgICAgICAgICAgICAgKCAnPicgIyBTPyAoICc8anNwOmF0dHJpYnV0ZScgTmFtZWRBdHRyaWJ1dGVzICk/CisgICAgICogICAgICAgICAgICAgICAgICAgICc8anNwOmJvZHknCisgICAgICogICAgICAgICAgICAgICAgICAgICggSnNwQm9keUJvZHkgfCA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgUz8gRVRhZworICAgICAqICAgICAgICAgICAgICAgICAgKQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZUpzcEF0dHJpYnV0ZUFuZEJvZHkoIE5vZGUgcGFyZW50LCBTdHJpbmcgdGFnLCAKKyAgICAgICAgU3RyaW5nIGJvZHlUeXBlICkgCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIAorICAgICAgICBpZiggcmVhZGVyLm1hdGNoZXNPcHRpb25hbFNwYWNlc0ZvbGxvd2VkQnkoICI8anNwOmF0dHJpYnV0ZSIgKSApIHsKKyAgICAgICAgICAgIC8vIE1heSBiZSBhbiBFbXB0eUJvZHksIGRlcGVuZGluZyBvbiB3aGV0aGVyCisgICAgICAgICAgICAvLyBUaGVyZSdzIGEgIjxqc3A6Ym9keSIgYmVmb3JlIHRoZSBFVGFnCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEZpcnN0LCBwYXJzZSA8anNwOmF0dHJpYnV0ZT4gZWxlbWVudHM6CisgICAgICAgICAgICBwYXJzZU5hbWVkQXR0cmlidXRlcyggcGFyZW50ICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmKCByZWFkZXIubWF0Y2hlc09wdGlvbmFsU3BhY2VzRm9sbG93ZWRCeSggIjxqc3A6Ym9keSIgKSApIHsKKyAgICAgICAgICAgIC8vIEFjdGlvbkJvZHkKKyAgICAgICAgICAgIHBhcnNlSnNwQm9keSggcGFyZW50LCBib2R5VHlwZSApOworICAgICAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgICAgIGlmKCAhcmVhZGVyLm1hdGNoZXNFVGFnKCB0YWcgKSApIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IocmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLCAKKyAgICAgICAgICAgICAgICAgICAgIiZsdDsiICsgdGFnICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggcmVzdWx0ICYmICFyZWFkZXIubWF0Y2hlc0VUYWcoIHRhZyApICkgeworICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSA8anNwOmF0dHJpYnV0ZT4gYnV0IHNvbWV0aGluZyBvdGhlciB0aGFuCisgICAgICAgICAgICAvLyA8anNwOmJvZHk+IG9yIHRoZSBlbmQgdGFnLCB0cmFuc2xhdGlvbiBlcnJvci4KKyAgICAgICAgICAgIGVyci5qc3BFcnJvcihyZWFkZXIubWFyaygpLCAianNwLmVycm9yLmpzcGJvZHkucmVxdWlyZWQiLCAKKyAgICAgICAgICAgICAgICAiJmx0OyIgKyB0YWcgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFBhcmFtcyA6Oj0gIGA+JyBTPworICAgICAqICAgICAgICAgICAgICAoICAgKCBgPGpzcDpib2R5PicKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgKCAoIFM/IFBhcmFtKyBTPyBgPC9qc3A6Ym9keT4nICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8IDxUUkFOU0xBVElPTl9FUlJPUj4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICAgKQorICAgICAqICAgICAgICAgICAgICAgIHwgUGFyYW0rCisgICAgICogICAgICAgICAgICAgICkKKyAgICAgKiAgICAgICAgICAgICAgJzwvanNwOnBhcmFtcz4nCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlSnNwUGFyYW1zKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgTm9kZSBqc3BQYXJhbXNOb2RlID0gbmV3IE5vZGUuUGFyYW1zQWN0aW9uKHN0YXJ0LCBwYXJlbnQpOworICAgICAgICBwYXJzZU9wdGlvbmFsQm9keShqc3BQYXJhbXNOb2RlLCAianNwOnBhcmFtcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEpBVkFYX0JPRFlfQ09OVEVOVF9QQVJBTSApOworICAgIH0KKworICAgIC8qCisgICAgICogRmFsbGJhY2sgOjo9ICAgJy8+JworICAgICAqICAgICAgICAgICAgICAgfCAoIGA+JyBTPyBgPGpzcDpib2R5PicKKyAgICAgKiAgICAgICAgICAgICAgICAgICAoICAgKCBTPworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICggQ2hhciogLSAoIENoYXIqIGA8L2pzcDpib2R5PicgKSApCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYDwvanNwOmJvZHk+JyBTPworICAgICAqICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICogICAgICAgICAgICAgICAgICAgICB8IDxUUkFOU0xBVElPTl9FUlJPUj4KKyAgICAgKiAgICAgICAgICAgICAgICAgICApCisgICAgICogICAgICAgICAgICAgICAgICAgYDwvanNwOmZhbGxiYWNrPicKKyAgICAgKiAgICAgICAgICAgICAgICAgKQorICAgICAqICAgICAgICAgICAgICAgfCAoICc+JworICAgICAqICAgICAgICAgICAgICAgICAgICggQ2hhciogLSAoIENoYXIqICc8L2pzcDpmYWxsYmFjaz4nICkgKQorICAgICAqICAgICAgICAgICAgICAgICAgICc8L2pzcDpmYWxsYmFjaz4nCisgICAgICogICAgICAgICAgICAgICAgICkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VGYWxsQmFjayhOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIE5vZGUgZmFsbEJhY2tOb2RlID0gbmV3IE5vZGUuRmFsbEJhY2tBY3Rpb24oc3RhcnQsIHBhcmVudCk7CisgICAgICAgIHBhcnNlT3B0aW9uYWxCb2R5KGZhbGxCYWNrTm9kZSwgImpzcDpmYWxsYmFjayIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBKQVZBWF9CT0RZX0NPTlRFTlRfVEVNUExBVEVfVEVYVCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGb3IgUGx1Z2luOgorICAgICAqIFN0ZEFjdGlvbkNvbnRlbnQgOjo9IEF0dHJpYnV0ZXMgUGx1Z2luQm9keQorICAgICAqCisgICAgICogUGx1Z2luQm9keSA6Oj0gICBFbXB0eUJvZHkgCisgICAgICogICAgICAgICAgICAgICAgfCAoICc+JyBTPyAoICc8anNwOmF0dHJpYnV0ZScgTmFtZWRBdHRyaWJ1dGVzICk/CisgICAgICogICAgICAgICAgICAgICAgICAgICc8anNwOmJvZHknCisgICAgICogICAgICAgICAgICAgICAgICAgICggSnNwQm9keVBsdWdpblRhZ3MgfCA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgUz8gRVRhZworICAgICAqICAgICAgICAgICAgICAgICAgKQorICAgICAqICAgICAgICAgICAgICAgIHwgKCAnPicgUz8gUGx1Z2luVGFncyBFVGFnICkKKyAgICAgKgorICAgICAqIEVtcHR5Qm9keSA6Oj0gICAnLz4nCisgICAgICogICAgICAgICAgICAgICB8ICggJz4nIEVUYWcgKQorICAgICAqICAgICAgICAgICAgICAgfCAoICc+JyBTPyAnPGpzcDphdHRyaWJ1dGUnIE5hbWVkQXR0cmlidXRlcyBFVGFnICkKKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVBsdWdpbihOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBwYXJzZUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgCisgICAgICAgIE5vZGUgcGx1Z2luTm9kZSA9IG5ldyBOb2RlLlBsdWdJbihhdHRycywgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIAorICAgICAgICBwYXJzZU9wdGlvbmFsQm9keSggcGx1Z2luTm9kZSwgImpzcDpwbHVnaW4iLCAKKyAgICAgICAgICAgIEpBVkFYX0JPRFlfQ09OVEVOVF9QTFVHSU4gKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFBsdWdpblRhZ3MgOjo9ICggJzxqc3A6cGFyYW1zJyBQYXJhbXMgUz8gKT8KKyAgICAgKiAgICAgICAgICAgICAgICAoICc8anNwOmZhbGxiYWNrJyBGYWxsYmFjaz8gUz8gKT8KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VQbHVnaW5UYWdzKCBOb2RlIHBhcmVudCApIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICByZWFkZXIuc2tpcFNwYWNlcygpOworICAgICAgICAKKyAgICAgICAgaWYoIHJlYWRlci5tYXRjaGVzKCAiPGpzcDpwYXJhbXMiICkgKSB7CisgICAgICAgICAgICBwYXJzZUpzcFBhcmFtcyggcGFyZW50ICk7CisgICAgICAgICAgICByZWFkZXIuc2tpcFNwYWNlcygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiggcmVhZGVyLm1hdGNoZXMoICI8anNwOmZhbGxiYWNrIiApICkgeworICAgICAgICAgICAgcGFyc2VGYWxsQmFjayggcGFyZW50ICk7CisgICAgICAgICAgICByZWFkZXIuc2tpcFNwYWNlcygpOworICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICAvKgorICAgICAqIFN0YW5kYXJkQWN0aW9uIDo6PSAgICdpbmNsdWRlJyAgICAgICBTdGRBY3Rpb25Db250ZW50CisgICAgICogICAgICAgICAgICAgICAgICAgIHwgJ2ZvcndhcmQnICAgICAgIFN0ZEFjdGlvbkNvbnRlbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgfCAnaW52b2tlJyAgICAgICAgU3RkQWN0aW9uQ29udGVudAorICAgICAqICAgICAgICAgICAgICAgICAgICB8ICdkb0JvZHknICAgICAgICBTdGRBY3Rpb25Db250ZW50CisgICAgICogICAgICAgICAgICAgICAgICAgIHwgJ2dldFByb3BlcnR5JyAgIFN0ZEFjdGlvbkNvbnRlbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgfCAnc2V0UHJvcGVydHknICAgU3RkQWN0aW9uQ29udGVudAorICAgICAqICAgICAgICAgICAgICAgICAgICB8ICd1c2VCZWFuJyAgICAgICBTdGRBY3Rpb25Db250ZW50CisgICAgICogICAgICAgICAgICAgICAgICAgIHwgJ3BsdWdpbicgICAgICAgIFN0ZEFjdGlvbkNvbnRlbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgfCAnZWxlbWVudCcgICAgICAgU3RkQWN0aW9uQ29udGVudAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVN0YW5kYXJkQWN0aW9uKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgTWFyayBzdGFydCA9IHJlYWRlci5tYXJrKCk7CisKKyAgICAgICAgaWYgKHJlYWRlci5tYXRjaGVzKElOQ0xVREVfQUNUSU9OKSkgeworICAgICAgICAgICAgcGFyc2VJbmNsdWRlKHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoRk9SV0FSRF9BQ1RJT04pKSB7CisgICAgICAgICAgICBwYXJzZUZvcndhcmQocGFyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcyhJTlZPS0VfQUNUSU9OKSkgeworICAgICAgICAgICAgaWYgKCFpc1RhZ0ZpbGUpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IocmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5hY3Rpb24uaXNub3R0YWdmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZsdDtqc3A6aW52b2tlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJzZUludm9rZShwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKERPQk9EWV9BQ1RJT04pKSB7CisgICAgICAgICAgICBpZiAoIWlzVGFnRmlsZSkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihyZWFkZXIubWFyaygpLCAianNwLmVycm9yLmFjdGlvbi5pc25vdHRhZ2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJmx0O2pzcDpkb0JvZHkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhcnNlRG9Cb2R5KHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoR0VUX1BST1BFUlRZX0FDVElPTikpIHsKKyAgICAgICAgICAgIHBhcnNlR2V0UHJvcGVydHkocGFyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcyhTRVRfUFJPUEVSVFlfQUNUSU9OKSkgeworICAgICAgICAgICAgcGFyc2VTZXRQcm9wZXJ0eShwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKFVTRV9CRUFOX0FDVElPTikpIHsKKyAgICAgICAgICAgIHBhcnNlVXNlQmVhbihwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKFBMVUdJTl9BQ1RJT04pKSB7CisgICAgICAgICAgICBwYXJzZVBsdWdpbihwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKEVMRU1FTlRfQUNUSU9OKSkgeworICAgICAgICAgICAgcGFyc2VFbGVtZW50KHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoQVRUUklCVVRFX0FDVElPTikpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci5uYW1lZEF0dHJpYnV0ZS5pbnZhbGlkVXNlIik7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoQk9EWV9BQ1RJT04pKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IuanNwYm9keS5pbnZhbGlkVXNlIik7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoRkFMTEJBQ0tfQUNUSU9OKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLmZhbGxiYWNrLmludmFsaWRVc2UiKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcyhQQVJBTVNfQUNUSU9OKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnBhcmFtcy5pbnZhbGlkVXNlIik7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoUEFSQU1fQUNUSU9OKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnBhcmFtLmludmFsaWRVc2UiKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcyhPVVRQVVRfQUNUSU9OKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLmpzcG91dHB1dC5pbnZhbGlkVXNlIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IuYmFkU3RhbmRhcmRBY3Rpb24iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogIyAnPCcgQ3VzdG9tQWN0aW9uIEN1c3RvbUFjdGlvbkJvZHkKKyAgICAgKgorICAgICAqIEN1c3RvbUFjdGlvbiA6Oj0gVGFnUHJlZml4ICc6JyBDdXN0b21BY3Rpb25OYW1lCisgICAgICoKKyAgICAgKiBUYWdQcmVmaXggOjo9IE5hbWUKKyAgICAgKgorICAgICAqIEN1c3RvbUFjdGlvbk5hbWUgOjo9IE5hbWUKKyAgICAgKgorICAgICAqIEN1c3RvbUFjdGlvbkJvZHkgOjo9ICAgKCBBdHRyaWJ1dGVzIEN1c3RvbUFjdGlvbkVuZCApCisgICAgICogICAgICAgICAgICAgICAgICAgICAgfCA8VFJBTlNMQVRJT05fRVJST1I+CisgICAgICoKKyAgICAgKiBBdHRyaWJ1dGVzIDo6PSAoIFMgQXR0cmlidXRlICkqIFM/CisgICAgICoKKyAgICAgKiBDdXN0b21BY3Rpb25FbmQgOjo9ICAgQ3VzdG9tQWN0aW9uVGFnRGVwZW5kZW50CisgICAgICogICAgICAgICAgICAgICAgICAgICB8IEN1c3RvbUFjdGlvbkpTUENvbnRlbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHwgQ3VzdG9tQWN0aW9uU2NyaXB0bGVzc0NvbnRlbnQKKyAgICAgKgorICAgICAqIEN1c3RvbUFjdGlvblRhZ0RlcGVuZGVudCA6Oj0gVGFnRGVwZW5kZW50T3B0aW9uYWxCb2R5CisgICAgICoKKyAgICAgKiBDdXN0b21BY3Rpb25KU1BDb250ZW50IDo6PSBPcHRpb25hbEJvZHkKKyAgICAgKgorICAgICAqIEN1c3RvbUFjdGlvblNjcmlwdGxlc3NDb250ZW50IDo6PSBTY3JpcHRsZXNzT3B0aW9uYWxCb2R5CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlQ3VzdG9tVGFnKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocmVhZGVyLnBlZWtDaGFyKCkgIT0gJzwnKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJzZSAnQ3VzdG9tQWN0aW9uJyBwcm9kdWN0aW9uICh0YWcgcHJlZml4IGFuZCBjdXN0b20gYWN0aW9uIG5hbWUpCisgICAgICAgIHJlYWRlci5uZXh0Q2hhcigpOyAgICAgICAgLy8gc2tpcCAnPCcKKyAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSByZWFkZXIucGFyc2VUb2tlbihmYWxzZSk7CisgICAgICAgIGludCBpID0gdGFnTmFtZS5pbmRleE9mKCc6Jyk7CisgICAgICAgIGlmIChpID09IC0xKSB7CisgICAgICAgICAgICByZWFkZXIucmVzZXQoc3RhcnQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHByZWZpeCA9IHRhZ05hbWUuc3Vic3RyaW5nKDAsIGkpOworICAgICAgICBTdHJpbmcgc2hvcnRUYWdOYW1lID0gdGFnTmFtZS5zdWJzdHJpbmcoaSsxKTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgdXNlci1kZWZpbmVkIHRhZy4KKyAgICAgICAgU3RyaW5nIHVyaSA9IHBhZ2VJbmZvLmdldFVSSShwcmVmaXgpOworICAgICAgICBpZiAodXJpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlYWRlci5yZXNldChzdGFydCk7CisgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgcHJlZml4IGZvciBsYXRlciBlcnJvciBjaGVja2luZworICAgICAgICAgICAgcGFnZUluZm8ucHV0Tm9uQ3VzdG9tVGFnUHJlZml4KHByZWZpeCwgcmVhZGVyLm1hcmsoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBUYWdMaWJyYXJ5SW5mbyB0YWdMaWJJbmZvID0gcGFnZUluZm8uZ2V0VGFnbGliKHVyaSk7CisgICAgICAgIFRhZ0luZm8gdGFnSW5mbyA9IHRhZ0xpYkluZm8uZ2V0VGFnKHNob3J0VGFnTmFtZSk7CisgICAgICAgIFRhZ0ZpbGVJbmZvIHRhZ0ZpbGVJbmZvID0gdGFnTGliSW5mby5nZXRUYWdGaWxlKHNob3J0VGFnTmFtZSk7CisgICAgICAgIGlmICh0YWdJbmZvID09IG51bGwgJiYgdGFnRmlsZUluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLmJhZF90YWciLCBzaG9ydFRhZ05hbWUsIHByZWZpeCk7CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3MgdGFnSGFuZGxlckNsYXNzID0gbnVsbDsKKyAgICAgICAgaWYgKHRhZ0luZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTXVzdCBiZSBhIGNsYXNzaWMgdGFnLCBsb2FkIGl0IGhlcmUuCisgICAgICAgICAgICAvLyB0YWcgZmlsZXMgd2lsbCBiZSBsb2FkZWQgbGF0ZXIsIGluIFRhZ0ZpbGVQcm9jZXNzb3IKKyAgICAgICAgICAgIFN0cmluZyBoYW5kbGVyQ2xhc3NOYW1lID0gdGFnSW5mby5nZXRUYWdDbGFzc05hbWUoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGFnSGFuZGxlckNsYXNzID0KKyAgICAgICAgICAgICAgICAgICAgY3R4dC5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhoYW5kbGVyQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLmxvYWRjbGFzcy50YWdoYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlckNsYXNzTmFtZSwgdGFnTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJzZSAnQ3VzdG9tQWN0aW9uQm9keScgcHJvZHVjdGlvbjoKKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBhcmUgY29tbWl0dGVkIC0gaWYgYW55dGhpbmcgZmFpbHMsIHdlIHByb2R1Y2UKKyAgICAgICAgLy8gYSB0cmFuc2xhdGlvbiBlcnJvci4KKworICAgICAgICAvLyBQYXJzZSAnQXR0cmlidXRlcycgcHJvZHVjdGlvbjoKKyAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IHBhcnNlQXR0cmlidXRlcygpOworICAgICAgICByZWFkZXIuc2tpcFNwYWNlcygpOworICAgICAgICAKKyAgICAgICAgLy8gUGFyc2UgJ0N1c3RvbUFjdGlvbkVuZCcgcHJvZHVjdGlvbjoKKyAgICAgICAgaWYgKHJlYWRlci5tYXRjaGVzKCIvPiIpKSB7CisgICAgICAgICAgICBpZiAodGFnSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuQ3VzdG9tVGFnKHRhZ05hbWUsIHByZWZpeCwgc2hvcnRUYWdOYW1lLCB1cmksIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgcGFyZW50LCB0YWdJbmZvLCB0YWdIYW5kbGVyQ2xhc3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5DdXN0b21UYWcodGFnTmFtZSwgcHJlZml4LCBzaG9ydFRhZ05hbWUsIHVyaSwgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBwYXJlbnQsIHRhZ0ZpbGVJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBOb3cgd2UgcGFyc2Ugb25lIG9mICdDdXN0b21BY3Rpb25UYWdEZXBlbmRlbnQnLCAKKyAgICAgICAgLy8gJ0N1c3RvbUFjdGlvbkpTUENvbnRlbnQnLCBvciAnQ3VzdG9tQWN0aW9uU2NyaXB0bGVzc0NvbnRlbnQnLgorICAgICAgICAvLyBkZXBlbmRpbmcgb24gYm9keS1jb250ZW50IGluIFRMRC4KKworICAgICAgICAvLyBMb29raW5nIGZvciBhIGJvZHksIGl0IHN0aWxsIGNhbiBiZSBlbXB0eTsgYnV0IGlmIHRoZXJlIGlzIGEKKyAgICAgICAgLy8gYSB0YWcgYm9keSwgaXRzIHN5bnRheCB3b3VsZCBiZSBkZXBlbmRlbnQgb24gdGhlIHR5cGUgb2YKKyAgICAgICAgLy8gYm9keSBjb250ZW50IGRlY2xhcmVkIGluIHRoZSBUTEQuCisgICAgICAgIFN0cmluZyBiYzsKKyAgICAgICAgaWYgKHRhZ0luZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgYmMgPSB0YWdJbmZvLmdldEJvZHlDb250ZW50KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiYyA9IHRhZ0ZpbGVJbmZvLmdldFRhZ0luZm8oKS5nZXRCb2R5Q29udGVudCgpOworICAgICAgICB9CisKKyAgICAgICAgTm9kZSB0YWdOb2RlID0gbnVsbDsKKyAgICAgICAgaWYgKHRhZ0luZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgdGFnTm9kZSA9IG5ldyBOb2RlLkN1c3RvbVRhZyh0YWdOYW1lLCBwcmVmaXgsIHNob3J0VGFnTmFtZSwgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycywgc3RhcnQsIHBhcmVudCwgdGFnSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnSGFuZGxlckNsYXNzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRhZ05vZGUgPSBuZXcgTm9kZS5DdXN0b21UYWcodGFnTmFtZSwgcHJlZml4LCBzaG9ydFRhZ05hbWUsIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMsIHN0YXJ0LCBwYXJlbnQsIHRhZ0ZpbGVJbmZvKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhcnNlT3B0aW9uYWxCb2R5KCB0YWdOb2RlLCB0YWdOYW1lLCBiYyApOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qCisgICAgICogUGFyc2UgZm9yIGEgdGVtcGxhdGUgdGV4dCBzdHJpbmcgdW50aWwgJzwnIG9yICIkeyIgaXMgZW5jb3VudGVyZWQsIAorICAgICAqIHJlY29nbml6aW5nIGVzY2FwZSBzZXF1ZW5jZXMgIlwlIiBhbmQgIlwkIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VUZW1wbGF0ZVRleHQoTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIGlmICghcmVhZGVyLmhhc01vcmVJbnB1dCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIENoYXJBcnJheVdyaXRlciB0dGV4dCA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoKTsKKyAgICAgICAgLy8gT3V0cHV0IHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgICAgICAgaW50IGNoID0gcmVhZGVyLm5leHRDaGFyKCk7CisgICAgICAgIGlmIChjaCA9PSAnXFwnKSB7CisgICAgICAgICAgICByZWFkZXIucHVzaENoYXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHR0ZXh0LndyaXRlKGNoKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChyZWFkZXIuaGFzTW9yZUlucHV0KCkpIHsKKyAgICAgICAgICAgIGNoID0gcmVhZGVyLm5leHRDaGFyKCk7CisgICAgICAgICAgICBpZiAoY2ggPT0gJzwnKSB7CisgICAgICAgICAgICAgICAgcmVhZGVyLnB1c2hDaGFyKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBjaCA9PSAnJCcgKSB7CisgICAgICAgICAgICAgICAgaWYgKCFyZWFkZXIuaGFzTW9yZUlucHV0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHRleHQud3JpdGUoJyQnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoID0gcmVhZGVyLm5leHRDaGFyKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoID09ICd7JykgeworICAgICAgICAgICAgICAgICAgICByZWFkZXIucHVzaENoYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnB1c2hDaGFyKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0dGV4dC53cml0ZSgnJCcpOworICAgICAgICAgICAgICAgIHJlYWRlci5wdXNoQ2hhcigpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1xcJykgeworICAgICAgICAgICAgICAgIGlmICghcmVhZGVyLmhhc01vcmVJbnB1dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHR0ZXh0LndyaXRlKCdcXCcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgXCUgb3IgXCQKKyAgICAgICAgICAgICAgICAvLyBPbmx5IHJlY29nbml6ZSBcJCBpZiBpc0VMSWdub3JlZCBpcyBmYWxzZSwgYnV0IHNpbmNlIGl0IGNhbgorICAgICAgICAgICAgICAgIC8vIGJlIHNldCBpbiBhIHBhZ2UgZGlyZWN0aXZlLCBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCB5ZXQuCisgICAgICAgICAgICAgICAgY2hhciBuZXh0ID0gKGNoYXIpcmVhZGVyLnBlZWtDaGFyKCk7CisgICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gJyUnKSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gcmVhZGVyLm5leHRDaGFyKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKG5leHQgPT0gJyQnKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlICQgYW5kIHVzZSBhIGhhY2sgdG8gZmxhZyB0aGlzIHNlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0Q2hhcigpOworICAgICAgICAgICAgICAgICAgICBjaCA9IENvbnN0YW50cy5IQUNLX0NIQVI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdHRleHQud3JpdGUoY2gpOworICAgICAgICB9CisgICAgICAgIG5ldyBOb2RlLlRlbXBsYXRlVGV4dCh0dGV4dC50b1N0cmluZygpLCBzdGFydCwgcGFyZW50KTsKKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBYTUxUZW1wbGF0ZVRleHQgOjo9ICAgKCBTPyAnLz4nICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHwgKCBTPyAnPicKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAoICggQ2hhciogLSAoIENoYXIqICggJzwnIHwgJyR7JyApICkgKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAnJHsnIEVMRXhwcmVzc2lvbkJvZHkgKT8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIENEU2VjdD8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICApKiBFVGFnCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHwgPFRSQU5TTEFUSU9OX0VSUk9SPgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVhNTFRlbXBsYXRlVGV4dChOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIHJlYWRlci5za2lwU3BhY2VzKCk7CisgICAgICAgIGlmKCAhcmVhZGVyLm1hdGNoZXMoICIvPiIgKSApIHsKKyAgICAgICAgICAgIGlmKCAhcmVhZGVyLm1hdGNoZXMoICI+IiApICkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAiJmx0O2pzcDp0ZXh0Jmd0OyIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENoYXJBcnJheVdyaXRlciB0dGV4dCA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoKTsKKyAgICAgICAgICAgIHdoaWxlIChyZWFkZXIuaGFzTW9yZUlucHV0KCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgY2ggPSByZWFkZXIubmV4dENoYXIoKTsKKyAgICAgICAgICAgICAgICBpZiggY2ggPT0gJzwnICkgeworICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgPCFbQ0RBVEFbCisgICAgICAgICAgICAgICAgICAgIGlmICghcmVhZGVyLm1hdGNoZXMoIiFbQ0RBVEFbIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcmVhZGVyLm1hcmsoKTsKKyAgICAgICAgICAgICAgICAgICAgTWFyayBzdG9wID0gcmVhZGVyLnNraXBVbnRpbCgiXV0+Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdG9wID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLCAiQ0RBVEEiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IHJlYWRlci5nZXRUZXh0KHN0YXJ0LCBzdG9wKTsKKyAgICAgICAgICAgICAgICAgICAgdHRleHQud3JpdGUodGV4dCwgMCwgdGV4dC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIGNoID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWFkZXIuaGFzTW9yZUlucHV0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR0ZXh0LndyaXRlKCdcXCcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2ggPSByZWFkZXIubmV4dENoYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9ICckJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR0ZXh0LndyaXRlKCdcXCcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHR0ZXh0LndyaXRlKGNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggY2ggPT0gJyQnICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlYWRlci5oYXNNb3JlSW5wdXQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHRleHQud3JpdGUoJyQnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNoID0gcmVhZGVyLm5leHRDaGFyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSAneycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR0ZXh0LndyaXRlKCckJyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIucHVzaENoYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHRlbXBsYXRlIHRleHQgbm9kZQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9kZS5UZW1wbGF0ZVRleHQoIHR0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBwYXJlbnQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgYW5kIHBhcnNlIHRoZSBFTCBleHByZXNzaW9uIGFuZCBjcmVhdGUgaXRzIG5vZGU6CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcmVhZGVyLm1hcmsoKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VFTEV4cHJlc3Npb24ocGFyZW50KTsKKworICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHJlYWRlci5tYXJrKCk7CisgICAgICAgICAgICAgICAgICAgIHR0ZXh0ID0gbmV3IENoYXJBcnJheVdyaXRlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdHRleHQud3JpdGUoIGNoICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXcgTm9kZS5UZW1wbGF0ZVRleHQoIHR0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBwYXJlbnQgKTsKKworICAgICAgICAgICAgaWYgKCEgcmVhZGVyLmhhc01vcmVJbnB1dCgpKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCBzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAiJmx0O2pzcDp0ZXh0Jmd0OyIgKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiggIXJlYWRlci5tYXRjaGVzRVRhZ1dpdGhvdXRMZXNzVGhhbiggImpzcDp0ZXh0IiApICkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvciggc3RhcnQsICJqc3AuZXJyb3IuanNwdGV4dC5iYWRjb250ZW50Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEFsbEJvZHkgOjo9ICAgICAgICggJzwlLS0nICAgICAgICAgICAgICBKU1BDb21tZW50Qm9keSAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzwlQCcgICAgICAgICAgICAgICBEaXJlY3RpdmVCb2R5ICAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzxqc3A6ZGlyZWN0aXZlLicgICBYTUxEaXJlY3RpdmVCb2R5ICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzwlIScgICAgICAgICAgICAgICBEZWNsYXJhdGlvbkJvZHkgICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzxqc3A6ZGVjbGFyYXRpb24nICBYTUxEZWNsYXJhdGlvbkJvZHkgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzwlPScgICAgICAgICAgICAgICBFeHByZXNzaW9uQm9keSAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzxqc3A6ZXhwcmVzc2lvbicgICBYTUxFeHByZXNzaW9uQm9keSAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJyR7JyAgICAgICAgICAgICAgICBFTEV4cHJlc3Npb25Cb2R5ICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzwlJyAgICAgICAgICAgICAgICBTY3JpcHRsZXRCb2R5ICAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzxqc3A6c2NyaXB0bGV0JyAgICBYTUxTY3JpcHRsZXRCb2R5ICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzxqc3A6dGV4dCcgICAgICAgICBYTUxUZW1wbGF0ZVRleHQgICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzxqc3A6JyAgICAgICAgICAgICBTdGFuZGFyZEFjdGlvbiAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzwnICAgICAgICAgICAgICAgICBDdXN0b21BY3Rpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tQWN0aW9uQm9keSAgICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgfCBUZW1wbGF0ZVRleHQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VFbGVtZW50cyhOb2RlIHBhcmVudCkgCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24gCisgICAgeworICAgICAgICBpZiggc2NyaXB0bGVzc0NvdW50ID4gMCApIHsKKyAgICAgICAgICAgIC8vIHZjOiBTY3JpcHRsZXNzQm9keQorICAgICAgICAgICAgLy8gV2UgbXVzdCBmb2xsb3cgdGhlIFNjcmlwdGxlc3NCb2R5IHByb2R1Y3Rpb24gaWYgb25lIG9mCisgICAgICAgICAgICAvLyBvdXIgcGFyZW50cyBpcyBTY3JpcHRsZXNzQm9keS4KKyAgICAgICAgICAgIHBhcnNlRWxlbWVudHNTY3JpcHRsZXNzKCBwYXJlbnQgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3RhcnQgPSByZWFkZXIubWFyaygpOworICAgICAgICBpZiAocmVhZGVyLm1hdGNoZXMoIjwlLS0iKSkgeworICAgICAgICAgICAgcGFyc2VDb21tZW50KHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjwlQCIpKSB7CisgICAgICAgICAgICBwYXJzZURpcmVjdGl2ZShwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8anNwOmRpcmVjdGl2ZS4iKSkgeworICAgICAgICAgICAgcGFyc2VYTUxEaXJlY3RpdmUocGFyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPCUhIikpIHsKKyAgICAgICAgICAgIHBhcnNlRGVjbGFyYXRpb24ocGFyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPGpzcDpkZWNsYXJhdGlvbiIpKSB7CisgICAgICAgICAgICBwYXJzZVhNTERlY2xhcmF0aW9uKHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjwlPSIpKSB7CisgICAgICAgICAgICBwYXJzZUV4cHJlc3Npb24ocGFyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPGpzcDpleHByZXNzaW9uIikpIHsKKyAgICAgICAgICAgIHBhcnNlWE1MRXhwcmVzc2lvbihwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8JSIpKSB7CisgICAgICAgICAgICBwYXJzZVNjcmlwdGxldChwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8anNwOnNjcmlwdGxldCIpKSB7CisgICAgICAgICAgICBwYXJzZVhNTFNjcmlwdGxldChwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8anNwOnRleHQiKSkgeworICAgICAgICAgICAgcGFyc2VYTUxUZW1wbGF0ZVRleHQocGFyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiJHsiKSkgeworICAgICAgICAgICAgcGFyc2VFTEV4cHJlc3Npb24ocGFyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPGpzcDoiKSkgeworICAgICAgICAgICAgcGFyc2VTdGFuZGFyZEFjdGlvbihwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKCFwYXJzZUN1c3RvbVRhZyhwYXJlbnQpKSB7CisgICAgICAgICAgICBjaGVja1VuYmFsYW5jZWRFbmRUYWcoKTsKKyAgICAgICAgICAgIHBhcnNlVGVtcGxhdGVUZXh0KHBhcmVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNjcmlwdGxlc3NCb2R5IDo6PSAgKCAnPCUtLScgICAgICAgICAgICAgIEpTUENvbW1lbnRCb2R5ICAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICAgIHwgKCAnPCVAJyAgICAgICAgICAgICAgIERpcmVjdGl2ZUJvZHkgICAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICAgIHwgKCAnPGpzcDpkaXJlY3RpdmUuJyAgIFhNTERpcmVjdGl2ZUJvZHkgICAgKQorICAgICAqICAgICAgICAgICAgICAgICAgIHwgKCAnPCUhJyAgICAgICAgICAgICAgIDxUUkFOU0xBVElPTl9FUlJPUj4gKQorICAgICAqICAgICAgICAgICAgICAgICAgIHwgKCAnPGpzcDpkZWNsYXJhdGlvbicgIDxUUkFOU0xBVElPTl9FUlJPUj4gKQorICAgICAqICAgICAgICAgICAgICAgICAgIHwgKCAnPCU9JyAgICAgICAgICAgICAgIDxUUkFOU0xBVElPTl9FUlJPUj4gKQorICAgICAqICAgICAgICAgICAgICAgICAgIHwgKCAnPGpzcDpleHByZXNzaW9uJyAgIDxUUkFOU0xBVElPTl9FUlJPUj4gKQorICAgICAqICAgICAgICAgICAgICAgICAgIHwgKCAnPCUnICAgICAgICAgICAgICAgIDxUUkFOU0xBVElPTl9FUlJPUj4gKQorICAgICAqICAgICAgICAgICAgICAgICAgIHwgKCAnPGpzcDpzY3JpcHRsZXQnICAgIDxUUkFOU0xBVElPTl9FUlJPUj4gKQorICAgICAqICAgICAgICAgICAgICAgICAgIHwgKCAnPGpzcDp0ZXh0JyAgICAgICAgIFhNTFRlbXBsYXRlVGV4dCAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICAgIHwgKCAnJHsnICAgICAgICAgICAgICAgIEVMRXhwcmVzc2lvbkJvZHkgICAgKQorICAgICAqICAgICAgICAgICAgICAgICAgIHwgKCAnPGpzcDonICAgICAgICAgICAgIFN0YW5kYXJkQWN0aW9uICAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICAgIHwgKCAnPCcgICAgICAgICAgICAgICAgIEN1c3RvbUFjdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbUFjdGlvbkJvZHkgICAgKQorICAgICAqICAgICAgICAgICAgICAgICAgIHwgVGVtcGxhdGVUZXh0CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlRWxlbWVudHNTY3JpcHRsZXNzKE5vZGUgcGFyZW50KSAKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiAKKyAgICB7CisgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgaG93IG1hbnkgc2NyaXB0bGVzcyBub2RlcyB3ZSd2ZSBlbmNvdW50ZXJlZAorICAgICAgICAvLyBzbyB3ZSBrbm93IHdoZXRoZXIgb3VyIGNoaWxkIG5vZGVzIGFyZSBmb3JjZWQgc2NyaXB0bGVzcworICAgICAgICBzY3JpcHRsZXNzQ291bnQrKzsKKyAgICAgICAgCisgICAgICAgIHN0YXJ0ID0gcmVhZGVyLm1hcmsoKTsKKyAgICAgICAgaWYgKHJlYWRlci5tYXRjaGVzKCI8JS0tIikpIHsKKyAgICAgICAgICAgIHBhcnNlQ29tbWVudChwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8JUAiKSkgeworICAgICAgICAgICAgcGFyc2VEaXJlY3RpdmUocGFyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPGpzcDpkaXJlY3RpdmUuIikpIHsKKyAgICAgICAgICAgIHBhcnNlWE1MRGlyZWN0aXZlKHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjwlISIpKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoIHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3Iubm8uc2NyaXB0bGV0cyIgKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPGpzcDpkZWNsYXJhdGlvbiIpKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoIHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3Iubm8uc2NyaXB0bGV0cyIgKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPCU9IikpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvciggcmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5uby5zY3JpcHRsZXRzIiApOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8anNwOmV4cHJlc3Npb24iKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCByZWFkZXIubWFyaygpLCAianNwLmVycm9yLm5vLnNjcmlwdGxldHMiICk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjwlIikpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvciggcmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5uby5zY3JpcHRsZXRzIiApOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8anNwOnNjcmlwdGxldCIpKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoIHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3Iubm8uc2NyaXB0bGV0cyIgKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPGpzcDp0ZXh0IikpIHsKKyAgICAgICAgICAgIHBhcnNlWE1MVGVtcGxhdGVUZXh0KHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIiR7IikpIHsKKyAgICAgICAgICAgIHBhcnNlRUxFeHByZXNzaW9uKHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjxqc3A6IikpIHsKKyAgICAgICAgICAgIHBhcnNlU3RhbmRhcmRBY3Rpb24ocGFyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmICghcGFyc2VDdXN0b21UYWcocGFyZW50KSkgeworICAgICAgICAgICAgY2hlY2tVbmJhbGFuY2VkRW5kVGFnKCk7CisgICAgICAgICAgICBwYXJzZVRlbXBsYXRlVGV4dChwYXJlbnQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzY3JpcHRsZXNzQ291bnQtLTsKKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBUZW1wbGF0ZVRleHRCb2R5IDo6PSAgICggJzwlLS0nICAgICAgICAgICAgICBKU1BDb21tZW50Qm9keSAgICAgICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8ICggJzwlQCcgICAgICAgICAgICAgICBEaXJlY3RpdmVCb2R5ICAgICAgICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8ICggJzxqc3A6ZGlyZWN0aXZlLicgICBYTUxEaXJlY3RpdmVCb2R5ICAgICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8ICggJzwlIScgICAgICAgICAgICAgICA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8ICggJzxqc3A6ZGVjbGFyYXRpb24nICA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8ICggJzwlPScgICAgICAgICAgICAgICA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8ICggJzxqc3A6ZXhwcmVzc2lvbicgICA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8ICggJzwlJyAgICAgICAgICAgICAgICA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8ICggJzxqc3A6c2NyaXB0bGV0JyAgICA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8ICggJzxqc3A6dGV4dCcgICAgICAgICA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8ICggJyR7JyAgICAgICAgICAgICAgICA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8ICggJzxqc3A6JyAgICAgICAgICAgICA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8IFRlbXBsYXRlVGV4dAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZUVsZW1lbnRzVGVtcGxhdGVUZXh0KE5vZGUgcGFyZW50KQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgeworICAgICAgICBzdGFydCA9IHJlYWRlci5tYXJrKCk7CisgICAgICAgIGlmIChyZWFkZXIubWF0Y2hlcygiPCUtLSIpKSB7CisgICAgICAgICAgICBwYXJzZUNvbW1lbnQocGFyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPCVAIikpIHsKKyAgICAgICAgICAgIHBhcnNlRGlyZWN0aXZlKHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjxqc3A6ZGlyZWN0aXZlLiIpKSB7CisgICAgICAgICAgICBwYXJzZVhNTERpcmVjdGl2ZShwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8JSEiKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCByZWFkZXIubWFyaygpLCAianNwLmVycm9yLm5vdC5pbi50ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgIkRlY2xhcmF0aW9ucyIgKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPGpzcDpkZWNsYXJhdGlvbiIpKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoIHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3Iubm90LmluLnRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAiRGVjbGFyYXRpb25zIiApOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8JT0iKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCByZWFkZXIubWFyaygpLCAianNwLmVycm9yLm5vdC5pbi50ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgIkV4cHJlc3Npb25zIiApOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8anNwOmV4cHJlc3Npb24iKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCByZWFkZXIubWFyaygpLCAianNwLmVycm9yLm5vdC5pbi50ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgIkV4cHJlc3Npb25zIiApOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8JSIpKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoIHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3Iubm90LmluLnRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAiU2NyaXB0bGV0cyIgKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPGpzcDpzY3JpcHRsZXQiKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCByZWFkZXIubWFyaygpLCAianNwLmVycm9yLm5vdC5pbi50ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgIlNjcmlwdGxldHMiICk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjxqc3A6dGV4dCIpKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoIHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3Iubm90LmluLnRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAiJmx0O2pzcDp0ZXh0IiApOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCIkeyIpKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoIHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3Iubm90LmluLnRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAiRXhwcmVzc2lvbiBsYW5ndWFnZSIgKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPGpzcDoiKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCByZWFkZXIubWFyaygpLCAianNwLmVycm9yLm5vdC5pbi50ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgIlN0YW5kYXJkIGFjdGlvbnMiICk7CisgICAgICAgIH0gZWxzZSBpZiAocGFyc2VDdXN0b21UYWcocGFyZW50KSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCByZWFkZXIubWFyaygpLCAianNwLmVycm9yLm5vdC5pbi50ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgIkN1c3RvbSBhY3Rpb25zIiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hlY2tVbmJhbGFuY2VkRW5kVGFnKCk7CisgICAgICAgICAgICBwYXJzZVRlbXBsYXRlVGV4dChwYXJlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGbGFnIGFzIGVycm9yIGlmIGFuIHVuYmFsYW5jZWQgZW5kIHRhZyBhcHBlYXJzIGJ5IGl0c2VsZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tVbmJhbGFuY2VkRW5kVGFnKCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCFyZWFkZXIubWF0Y2hlcygiPC8iKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHVuYmFsYW5jZWQgc3RhbmRhcmQgYWN0aW9ucworICAgICAgICBpZiAocmVhZGVyLm1hdGNoZXMoImpzcDoiKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVuYmFsYW5jZWQuZW5kdGFnIiwgImpzcDoiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGZvciB1bmJhbGFuY2VkIGN1c3RvbSBhY3Rpb25zCisgICAgICAgIFN0cmluZyB0YWdOYW1lID0gcmVhZGVyLnBhcnNlVG9rZW4oZmFsc2UpOworICAgICAgICBpbnQgaSA9IHRhZ05hbWUuaW5kZXhPZignOicpOworICAgICAgICBpZiAoaSA9PSAtMSB8fCBwYWdlSW5mby5nZXRVUkkodGFnTmFtZS5zdWJzdHJpbmcoMCwgaSkpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlYWRlci5yZXNldChzdGFydCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW5iYWxhbmNlZC5lbmR0YWciLCB0YWdOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWdEZXBlbmRlbnRCb2R5IDo9IAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVRhZ0RlcGVuZGVudEJvZHkoTm9kZSBwYXJlbnQsIFN0cmluZyB0YWcpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbnsKKyAgICAgICAgTWFyayBib2R5U3RhcnQgPSByZWFkZXIubWFyaygpOworICAgICAgICBNYXJrIGJvZHlFbmQgPSByZWFkZXIuc2tpcFVudGlsRVRhZyh0YWcpOworICAgICAgICBpZiAoYm9keUVuZCA9PSBudWxsKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwgIiZsdDsiK3RhZyApOworICAgICAgICB9CisgICAgICAgIG5ldyBOb2RlLlRlbXBsYXRlVGV4dChyZWFkZXIuZ2V0VGV4dChib2R5U3RhcnQsIGJvZHlFbmQpLCBib2R5U3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQpOworICAgIH0KKworICAgIC8qCisgICAgICogUGFyc2VzIGpzcDpib2R5IGFjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VKc3BCb2R5KE5vZGUgcGFyZW50LCBTdHJpbmcgYm9keVR5cGUpIAorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIAorICAgIHsKKyAgICAgICAgTWFyayBzdGFydCA9IHJlYWRlci5tYXJrKCk7CisgICAgICAgIE5vZGUgYm9keU5vZGUgPSBuZXcgTm9kZS5Kc3BCb2R5KHN0YXJ0LCBwYXJlbnQpOworCisgICAgICAgIHJlYWRlci5za2lwU3BhY2VzKCk7CisgICAgICAgIGlmICghcmVhZGVyLm1hdGNoZXMoIi8+IikpIHsKKyAgICAgICAgICAgIGlmICghcmVhZGVyLm1hdGNoZXMoIj4iKSkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJmx0O2pzcDpib2R5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJzZUJvZHkoIGJvZHlOb2RlLCAianNwOmJvZHkiLCBib2R5VHlwZSApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQYXJzZSB0aGUgYm9keSBhcyBKU1AgY29udGVudC4KKyAgICAgKiBAcGFyYW0gdGFnIFRoZSBuYW1lIG9mIHRoZSB0YWcgd2hvc2UgZW5kIHRhZyB3b3VsZCB0ZXJtaW5hdGUgdGhlIGJvZHkKKyAgICAgKiBAcGFyYW0gYm9keVR5cGUgT25lIG9mIHRoZSBUYWdJbmZvIGJvZHkgdHlwZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VCb2R5KE5vZGUgcGFyZW50LCBTdHJpbmcgdGFnLCBTdHJpbmcgYm9keVR5cGUpIAorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIAorICAgIHsKKyAgICAgICAgaWYoIGJvZHlUeXBlLmVxdWFsc0lnbm9yZUNhc2UoIFRhZ0luZm8uQk9EWV9DT05URU5UX1RBR19ERVBFTkRFTlQgKSApIHsKKyAgICAgICAgICAgIHBhcnNlVGFnRGVwZW5kZW50Qm9keSggcGFyZW50LCB0YWcgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBib2R5VHlwZS5lcXVhbHNJZ25vcmVDYXNlKCBUYWdJbmZvLkJPRFlfQ09OVEVOVF9FTVBUWSApICkgeworICAgICAgICAgICAgaWYoICFyZWFkZXIubWF0Y2hlc0VUYWcoIHRhZyApICkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImphc3Blci5lcnJvci5lbXB0eWJvZHljb250ZW50Lm5vbmVtcHR5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBib2R5VHlwZSA9PSBKQVZBWF9CT0RZX0NPTlRFTlRfUExVR0lOICkgeworICAgICAgICAgICAgLy8gKG5vdGUgdGhlID09IHNpbmNlIHdlIHdvbid0IHJlY29nbml6ZSBKQVZBWF8qIAorICAgICAgICAgICAgLy8gZnJvbSBvdXRzaWRlIHRoaXMgbW9kdWxlKS4KKyAgICAgICAgICAgIHBhcnNlUGx1Z2luVGFncyhwYXJlbnQpOworICAgICAgICAgICAgaWYoICFyZWFkZXIubWF0Y2hlc0VUYWcoIHRhZyApICkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvciggcmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAiJmx0OyIgKyB0YWcgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggYm9keVR5cGUuZXF1YWxzSWdub3JlQ2FzZSggVGFnSW5mby5CT0RZX0NPTlRFTlRfSlNQICkgfHwKKyAgICAgICAgICAgIGJvZHlUeXBlLmVxdWFsc0lnbm9yZUNhc2UoIFRhZ0luZm8uQk9EWV9DT05URU5UX1NDUklQVExFU1MgKSB8fAorICAgICAgICAgICAgKGJvZHlUeXBlID09IEpBVkFYX0JPRFlfQ09OVEVOVF9QQVJBTSkgfHwKKyAgICAgICAgICAgIChib2R5VHlwZSA9PSBKQVZBWF9CT0RZX0NPTlRFTlRfVEVNUExBVEVfVEVYVCkgKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAocmVhZGVyLmhhc01vcmVJbnB1dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5tYXRjaGVzRVRhZyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIG5lc3RlZCBqc3A6Ym9keSBvciBqc3A6YXR0cmlidXRlCisgICAgICAgICAgICAgICAgaWYgKHRhZy5lcXVhbHMoImpzcDpib2R5IikgfHwgdGFnLmVxdWFscygianNwOmF0dHJpYnV0ZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIubWF0Y2hlcygiPGpzcDphdHRyaWJ1dGUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IubmVzdGVkLmpzcGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8anNwOmJvZHkiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IubmVzdGVkLmpzcGJvZHkiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCBib2R5VHlwZS5lcXVhbHNJZ25vcmVDYXNlKCBUYWdJbmZvLkJPRFlfQ09OVEVOVF9KU1AgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VFbGVtZW50cyggcGFyZW50ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIGJvZHlUeXBlLmVxdWFsc0lnbm9yZUNhc2UoIAorICAgICAgICAgICAgICAgICAgICBUYWdJbmZvLkJPRFlfQ09OVEVOVF9TQ1JJUFRMRVNTICkgKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlRWxlbWVudHNTY3JpcHRsZXNzKCBwYXJlbnQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggYm9keVR5cGUgPT0gSkFWQVhfQk9EWV9DT05URU5UX1BBUkFNICkgeworICAgICAgICAgICAgICAgICAgICAvLyAobm90ZSB0aGUgPT0gc2luY2Ugd2Ugd29uJ3QgcmVjb2duaXplIEpBVkFYXyogCisgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gb3V0c2lkZSB0aGlzIG1vZHVsZSkuCisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwU3BhY2VzKCk7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlUGFyYW0oIHBhcmVudCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChib2R5VHlwZSA9PSBKQVZBWF9CT0RZX0NPTlRFTlRfVEVNUExBVEVfVEVYVCkgeworICAgICAgICAgICAgICAgICAgICBwYXJzZUVsZW1lbnRzVGVtcGxhdGVUZXh0KHBhcmVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsICImbHQ7Iit0YWcgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImphc3Blci5lcnJvci5iYWQuYm9keWNvbnRlbnQudHlwZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQYXJzZXMgbmFtZWQgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VOYW1lZEF0dHJpYnV0ZXMoTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBkbyB7CisgICAgICAgICAgICBNYXJrIHN0YXJ0ID0gcmVhZGVyLm1hcmsoKTsKKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBwYXJzZUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIE5vZGUuTmFtZWRBdHRyaWJ1dGUgbmFtZWRBdHRyaWJ1dGVOb2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5OYW1lZEF0dHJpYnV0ZSggYXR0cnMsIHN0YXJ0LCBwYXJlbnQgKTsKKworICAgICAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgICAgIGlmICghcmVhZGVyLm1hdGNoZXMoIi8+IikpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXJlYWRlci5tYXRjaGVzKCI+IikpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJmx0O2pzcDphdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5hbWVkQXR0cmlidXRlTm9kZS5pc1RyaW0oKSkgeworICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFNwYWNlcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXJzZUJvZHkobmFtZWRBdHRyaWJ1dGVOb2RlLCAianNwOmF0dHJpYnV0ZSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBdHRyaWJ1dGVCb2R5VHlwZShwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFZhbHVlKCJuYW1lIikpKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZWRBdHRyaWJ1dGVOb2RlLmlzVHJpbSgpKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUuTm9kZXMgc3ViRWxlbXMgPSBuYW1lZEF0dHJpYnV0ZU5vZGUuZ2V0Qm9keSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRWxlbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBsYXN0Tm9kZSA9IHN1YkVsZW1zLmdldE5vZGUoc3ViRWxlbXMuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdE5vZGUgaW5zdGFuY2VvZiBOb2RlLlRlbXBsYXRlVGV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTm9kZS5UZW1wbGF0ZVRleHQpbGFzdE5vZGUpLnJ0cmltKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWFkZXIuc2tpcFNwYWNlcygpOworICAgICAgICB9IHdoaWxlKCByZWFkZXIubWF0Y2hlcyggIjxqc3A6YXR0cmlidXRlIiApICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBib2R5IHR5cGUgb2YgPGpzcDphdHRyaWJ1dGU+IGZyb20gdGhlIGVuY2xvc2luZyBub2RlCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0cmlidXRlQm9keVR5cGUoTm9kZSBuLCBTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChuIGluc3RhbmNlb2YgTm9kZS5DdXN0b21UYWcpIHsKKyAgICAgICAgICAgIFRhZ0luZm8gdGFnSW5mbyA9ICgoTm9kZS5DdXN0b21UYWcpbikuZ2V0VGFnSW5mbygpOworICAgICAgICAgICAgVGFnQXR0cmlidXRlSW5mb1tdIHRsZEF0dHJzID0gdGFnSW5mby5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dGxkQXR0cnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHModGxkQXR0cnNbaV0uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGxkQXR0cnNbaV0uaXNGcmFnbWVudCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGFnSW5mby5CT0RZX0NPTlRFTlRfU0NSSVBUTEVTUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodGxkQXR0cnNbaV0uY2FuQmVSZXF1ZXN0VGltZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGFnSW5mby5CT0RZX0NPTlRFTlRfSlNQOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRhZ0luZm8uaGFzRHluYW1pY0F0dHJpYnV0ZXMoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBUYWdJbmZvLkJPRFlfQ09OVEVOVF9KU1A7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobiBpbnN0YW5jZW9mIE5vZGUuSW5jbHVkZUFjdGlvbikgeworICAgICAgICAgICAgaWYgKCJwYWdlIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFnSW5mby5CT0RZX0NPTlRFTlRfSlNQOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG4gaW5zdGFuY2VvZiBOb2RlLkZvcndhcmRBY3Rpb24pIHsKKyAgICAgICAgICAgIGlmICgicGFnZSIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhZ0luZm8uQk9EWV9DT05URU5UX0pTUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChuIGluc3RhbmNlb2YgTm9kZS5TZXRQcm9wZXJ0eSkgeworICAgICAgICAgICAgaWYgKCJ2YWx1ZSIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhZ0luZm8uQk9EWV9DT05URU5UX0pTUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChuIGluc3RhbmNlb2YgTm9kZS5Vc2VCZWFuKSB7CisgICAgICAgICAgICBpZiAoImJlYW5OYW1lIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFnSW5mby5CT0RZX0NPTlRFTlRfSlNQOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG4gaW5zdGFuY2VvZiBOb2RlLlBsdWdJbikgeworICAgICAgICAgICAgaWYgKCJ3aWR0aCIuZXF1YWxzKG5hbWUpIHx8ICJoZWlnaHQiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBUYWdJbmZvLkJPRFlfQ09OVEVOVF9KU1A7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobiBpbnN0YW5jZW9mIE5vZGUuUGFyYW1BY3Rpb24pIHsKKyAgICAgICAgICAgIGlmICgidmFsdWUiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBUYWdJbmZvLkJPRFlfQ09OVEVOVF9KU1A7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobiBpbnN0YW5jZW9mIE5vZGUuSnNwRWxlbWVudCkgeworICAgICAgICAgICAgcmV0dXJuIFRhZ0luZm8uQk9EWV9DT05URU5UX0pTUDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBKQVZBWF9CT0RZX0NPTlRFTlRfVEVNUExBVEVfVEVYVDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VUYWdGaWxlRGlyZWN0aXZlcyhOb2RlIHBhcmVudCkKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmVhZGVyLnNldFNpbmdsZUZpbGUodHJ1ZSk7CisgICAgICAgIHJlYWRlci5za2lwVW50aWwoIjwiKTsKKyAgICAgICAgd2hpbGUgKHJlYWRlci5oYXNNb3JlSW5wdXQoKSkgeworICAgICAgICAgICAgc3RhcnQgPSByZWFkZXIubWFyaygpOworICAgICAgICAgICAgaWYgKHJlYWRlci5tYXRjaGVzKCIlLS0iKSkgeworICAgICAgICAgICAgICAgIHBhcnNlQ29tbWVudChwYXJlbnQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiJUAiKSkgeworICAgICAgICAgICAgICAgIHBhcnNlRGlyZWN0aXZlKHBhcmVudCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCJqc3A6ZGlyZWN0aXZlLiIpKSB7CisgICAgICAgICAgICAgICAgcGFyc2VYTUxEaXJlY3RpdmUocGFyZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRlci5za2lwVW50aWwoIjwiKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9QYXJzZXJDb250cm9sbGVyLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1BhcnNlckNvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzZjMzIwCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9QYXJzZXJDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSw1ODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubmV0LkphclVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSnNwQ29tcGlsYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlci5YTUxFbmNvZGluZ0RldGVjdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CisKKy8qKgorICogQ29udHJvbGxlciBmb3IgdGhlIHBhcnNpbmcgb2YgYSBKU1AgcGFnZS4KKyAqIDxwPgorICogVGhlIHNhbWUgUGFyc2VyQ29udHJvbGxlciBpbnN0YW5jZSBpcyB1c2VkIGZvciBhIEpTUCBwYWdlIGFuZCBhbnkgSlNQCisgKiBzZWdtZW50cyBpbmNsdWRlZCBieSBpdCAodmlhIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSwgd2hlcmUgZWFjaCBzZWdtZW50IG1heQorICogYmUgcHJvdmlkZWQgaW4gc3RhbmRhcmQgb3IgWE1MIHN5bnRheC4gVGhpcyBjbGFzcyBzZWxlY3RzIGFuZCBpbnZva2VzIHRoZQorICogYXBwcm9wcmlhdGUgcGFyc2VyIGZvciB0aGUgSlNQIHBhZ2UgYW5kIGl0cyBpbmNsdWRlZCBzZWdtZW50cy4KKyAqCisgKiBAYXV0aG9yIFBpZXJyZSBEZWxpc2xlCisgKiBAYXV0aG9yIEphbiBMdWVoZQorICovCitjbGFzcyBQYXJzZXJDb250cm9sbGVyIGltcGxlbWVudHMgVGFnQ29uc3RhbnRzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSU0VUID0gImNoYXJzZXQ9IjsKKworICAgIHByaXZhdGUgSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQ7CisgICAgcHJpdmF0ZSBDb21waWxlciBjb21waWxlcjsKKyAgICBwcml2YXRlIEVycm9yRGlzcGF0Y2hlciBlcnI7CisKKyAgICAvKgorICAgICAqIEluZGljYXRlcyB0aGUgc3ludGF4IChYTUwgb3Igc3RhbmRhcmQpIG9mIHRoZSBmaWxlIGJlaW5nIHByb2Nlc3NlZAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1htbDsKKworICAgIC8qCisgICAgICogQSBzdGFjayB0byBrZWVwIHRyYWNrIG9mIHRoZSAnY3VycmVudCBiYXNlIGRpcmVjdG9yeScKKyAgICAgKiBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzIHRoYXQgcmVmZXIgdG8gcmVsYXRpdmUgcGF0aHMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdGFjayBiYXNlRGlyU3RhY2sgPSBuZXcgU3RhY2soKTsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNFbmNvZGluZ1NwZWNpZmllZEluUHJvbG9nOworCisgICAgcHJpdmF0ZSBTdHJpbmcgc291cmNlRW5jOworCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdFBhZ2VFbmNvZGluZzsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNUYWdGaWxlOworICAgIHByaXZhdGUgYm9vbGVhbiBkaXJlY3RpdmVPbmx5OworCisgICAgLyoKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBQYXJzZXJDb250cm9sbGVyKEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0LCBDb21waWxlciBjb21waWxlcikgeworICAgICAgICB0aGlzLmN0eHQgPSBjdHh0OyAKKwl0aGlzLmNvbXBpbGVyID0gY29tcGlsZXI7CisJdGhpcy5lcnIgPSBjb21waWxlci5nZXRFcnJvckRpc3BhdGNoZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSnNwQ29tcGlsYXRpb25Db250ZXh0IGdldEpzcENvbXBpbGF0aW9uQ29udGV4dCAoKSB7CisJcmV0dXJuIGN0eHQ7CisgICAgfQorCisgICAgcHVibGljIENvbXBpbGVyIGdldENvbXBpbGVyICgpIHsKKwlyZXR1cm4gY29tcGlsZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIGEgSlNQIHBhZ2Ugb3IgdGFnIGZpbGUuIFRoaXMgaXMgaW52b2tlZCBieSB0aGUgY29tcGlsZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5GaWxlTmFtZSBUaGUgcGF0aCB0byB0aGUgSlNQIHBhZ2Ugb3IgdGFnIGZpbGUgdG8gYmUgcGFyc2VkLgorICAgICAqLworICAgIHB1YmxpYyBOb2RlLk5vZGVzIHBhcnNlKFN0cmluZyBpbkZpbGVOYW1lKQorCSAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmFzcGVyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJLy8gSWYgd2UncmUgcGFyc2luZyBhIHBhY2thZ2VkIHRhZyBmaWxlIG9yIGEgcmVzb3VyY2UgaW5jbHVkZWQgYnkgaXQKKwkvLyAodXNpbmcgYW4gaW5jbHVkZSBkaXJlY3RpdmUpLCBjdHh0LmdldFRhZ0ZpbGVKYXIoKSByZXR1cm5zIHRoZSAKKwkvLyBKQVIgZmlsZSBmcm9tIHdoaWNoIHRvIHJlYWQgdGhlIHRhZyBmaWxlIG9yIGluY2x1ZGVkIHJlc291cmNlLAorCS8vIHJlc3BlY3RpdmVseS4KKyAgICAgICAgaXNUYWdGaWxlID0gY3R4dC5pc1RhZ0ZpbGUoKTsKKyAgICAgICAgZGlyZWN0aXZlT25seSA9IGZhbHNlOworICAgICAgICByZXR1cm4gZG9QYXJzZShpbkZpbGVOYW1lLCBudWxsLCBjdHh0LmdldFRhZ0ZpbGVKYXJVcmwoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIGFuIGluY2x1ZGUgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5GaWxlTmFtZSBUaGUgcGF0aCB0byB0aGUgcmVzb3VyY2UgdG8gYmUgaW5jbHVkZWQuCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG5vZGUgb2YgdGhlIGluY2x1ZGUgZGlyZWN0aXZlLgorICAgICAqIEBwYXJhbSBqYXJGaWxlIFRoZSBKQVIgZmlsZSBmcm9tIHdoaWNoIHRvIHJlYWQgdGhlIGluY2x1ZGVkIHJlc291cmNlLAorICAgICAqIG9yIG51bGwgb2YgdGhlIGluY2x1ZGVkIHJlc291cmNlIGlzIHRvIGJlIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbQorICAgICAqLworICAgIHB1YmxpYyBOb2RlLk5vZGVzIHBhcnNlKFN0cmluZyBpbkZpbGVOYW1lLCBOb2RlIHBhcmVudCwKKwkJCSAgICBVUkwgamFyRmlsZVVybCkKKwkgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAvLyBGb3IgZmlsZXMgdGhhdCBhcmUgc3RhdGljYWxseSBpbmNsdWRlZCwgaXNUYWdmaWxlIGFuZCBkaXJlY3RpdmVPbmx5CisgICAgICAgIC8vIHJlbWFpbiB1bmNoYW5nZWQuCisgICAgICAgIHJldHVybiBkb1BhcnNlKGluRmlsZU5hbWUsIHBhcmVudCwgamFyRmlsZVVybCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdHMgdGFnIGZpbGUgZGlyZWN0aXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRhZyBmaWxlIHdpdGggdGhlCisgICAgICogZ2l2ZW4gbmFtZS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgaW52b2tlZCBieSB0aGUgY29tcGlsZXIgCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5GaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFnIGZpbGUgdG8gYmUgcGFyc2VkLgorICAgICAqLworICAgIHB1YmxpYyBOb2RlLk5vZGVzIHBhcnNlVGFnRmlsZURpcmVjdGl2ZXMoU3RyaW5nIGluRmlsZU5hbWUpCisJICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBKYXNwZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBpc1RhZ0ZpbGVTYXZlID0gaXNUYWdGaWxlOworICAgICAgICBib29sZWFuIGRpcmVjdGl2ZU9ubHlTYXZlID0gZGlyZWN0aXZlT25seTsKKyAgICAgICAgaXNUYWdGaWxlID0gdHJ1ZTsKKyAgICAgICAgZGlyZWN0aXZlT25seSA9IHRydWU7CisgICAgICAgIE5vZGUuTm9kZXMgcGFnZSA9IGRvUGFyc2UoaW5GaWxlTmFtZSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVSTCkgY3R4dC5nZXRUYWdGaWxlSmFyVXJscygpLmdldChpbkZpbGVOYW1lKSk7CisgICAgICAgIGRpcmVjdGl2ZU9ubHkgPSBkaXJlY3RpdmVPbmx5U2F2ZTsKKyAgICAgICAgaXNUYWdGaWxlID0gaXNUYWdGaWxlU2F2ZTsKKyAgICAgICAgcmV0dXJuIHBhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBKU1AgcGFnZSBvciB0YWcgZmlsZSB3aXRoIHRoZSBnaXZlbiBwYXRoIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5GaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgSlNQIHBhZ2Ugb3IgdGFnIGZpbGUgdG8gYmUgcGFyc2VkLgorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBub2RlIChub24tbnVsbCB3aGVuIHByb2Nlc3NpbmcgYW4gaW5jbHVkZQorICAgICAqIGRpcmVjdGl2ZSkKKyAgICAgKiBAcGFyYW0gaXNUYWdGaWxlIHRydWUgaWYgZmlsZSB0byBiZSBwYXJzZWQgaXMgdGFnIGZpbGUsIGFuZCBmYWxzZSBpZiBpdAorICAgICAqIGlzIGEgcmVndWxhciBKU1AgcGFnZQorICAgICAqIEBwYXJhbSBkaXJlY3RpdmVzT25seSB0cnVlIGlmIHRoZSBmaWxlIHRvIGJlIHBhcnNlZCBpcyBhIHRhZyBmaWxlIGFuZAorICAgICAqIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGRpcmVjdGl2ZXMgbmVlZGVkIGZvciBjb25zdHJ1Y3RpbmcgYQorICAgICAqIFRhZ0ZpbGVJbmZvLgorICAgICAqIEBwYXJhbSBqYXJGaWxlIFRoZSBKQVIgZmlsZSBmcm9tIHdoaWNoIHRvIHJlYWQgdGhlIEpTUCBwYWdlIG9yIHRhZyBmaWxlLAorICAgICAqIG9yIG51bGwgaWYgdGhlIEpTUCBwYWdlIG9yIHRhZyBmaWxlIGlzIHRvIGJlIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbQorICAgICAqLworICAgIHByaXZhdGUgTm9kZS5Ob2RlcyBkb1BhcnNlKFN0cmluZyBpbkZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBqYXJGaWxlVXJsKQorCSAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmFzcGVyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKwlOb2RlLk5vZGVzIHBhcnNlZFBhZ2UgPSBudWxsOworCWlzRW5jb2RpbmdTcGVjaWZpZWRJblByb2xvZyA9IGZhbHNlOworCWlzRGVmYXVsdFBhZ2VFbmNvZGluZyA9IGZhbHNlOworCisJSmFyRmlsZSBqYXJGaWxlID0gZ2V0SmFyRmlsZShqYXJGaWxlVXJsKTsKKwlTdHJpbmcgYWJzRmlsZU5hbWUgPSByZXNvbHZlRmlsZU5hbWUoaW5GaWxlTmFtZSk7CisJU3RyaW5nIGpzcENvbmZpZ1BhZ2VFbmMgPSBnZXRKc3BDb25maWdQYWdlRW5jb2RpbmcoYWJzRmlsZU5hbWUpOworCisJLy8gRmlndXJlIG91dCB3aGF0IHR5cGUgb2YgSlNQIGRvY3VtZW50IGFuZCBlbmNvZGluZyB0eXBlIHdlIGFyZQorCS8vIGRlYWxpbmcgd2l0aAorCWRldGVybWluZVN5bnRheEFuZEVuY29kaW5nKGFic0ZpbGVOYW1lLCBqYXJGaWxlLCBqc3BDb25maWdQYWdlRW5jKTsKKworCWlmIChwYXJlbnQgIT0gbnVsbCkgeworCSAgICAvLyBJbmNsdWRlZCByZXNvdXJjZSwgYWRkIHRvIGRlcGVuZGVudCBsaXN0CisJICAgIGNvbXBpbGVyLmdldFBhZ2VJbmZvKCkuYWRkRGVwZW5kYW50KGFic0ZpbGVOYW1lKTsKKwl9CisKKwlpZiAoaXNYbWwgJiYgaXNFbmNvZGluZ1NwZWNpZmllZEluUHJvbG9nKSB7CisJICAgIC8qCisJICAgICAqIE1ha2Ugc3VyZSB0aGUgZW5jb2RpbmcgZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gdGhlIFhNTAorCSAgICAgKiBwcm9sb2cgKGlmIGFueSkgbWF0Y2hlcyB0aGF0IGluIHRoZSBKU1AgY29uZmlnIGVsZW1lbnQKKwkgICAgICogKGlmIGFueSksIHRyZWF0aW5nICJVVEYtMTYiLCAiVVRGLTE2QkUiLCBhbmQgIlVURi0xNkxFIiBhcworCSAgICAgKiBpZGVudGljYWwuCisJICAgICAqLworCSAgICBpZiAoanNwQ29uZmlnUGFnZUVuYyAhPSBudWxsICYmICFqc3BDb25maWdQYWdlRW5jLmVxdWFscyhzb3VyY2VFbmMpCisJCSAgICAgICAgJiYgKCFqc3BDb25maWdQYWdlRW5jLnN0YXJ0c1dpdGgoIlVURi0xNiIpCisJCQkgICAgfHwgIXNvdXJjZUVuYy5zdGFydHNXaXRoKCJVVEYtMTYiKSkpIHsKKwkJZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IucHJvbG9nX2NvbmZpZ19lbmNvZGluZ19taXNtYXRjaCIsCisJCQkgICAgIHNvdXJjZUVuYywganNwQ29uZmlnUGFnZUVuYyk7CisJICAgIH0KKwl9CisKKwkvLyBEaXNwYXRjaCB0byB0aGUgYXBwcm9wcmlhdGUgcGFyc2VyCisJaWYgKGlzWG1sKSB7CisJICAgIC8vIEpTUCBkb2N1bWVudCAoWE1MIHN5bnRheCkKKyAgICAgICAgICAgIC8vIElucHV0U3RyZWFtIGZvciBqc3B4IHBhZ2UgaXMgY3JlYXRlZCBhbmQgcHJvcGVybHkgY2xvc2VkIGluCisgICAgICAgICAgICAvLyBKc3BEb2N1bWVudFBhcnNlci4KKyAgICAgICAgICAgIHBhcnNlZFBhZ2UgPSBKc3BEb2N1bWVudFBhcnNlci5wYXJzZSh0aGlzLCBhYnNGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXJGaWxlLCBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUYWdGaWxlLCBkaXJlY3RpdmVPbmx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3BDb25maWdQYWdlRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRW5jb2RpbmdTcGVjaWZpZWRJblByb2xvZyk7CisJfSBlbHNlIHsKKwkgICAgLy8gU3RhbmRhcmQgc3ludGF4CisJICAgIElucHV0U3RyZWFtUmVhZGVyIGluU3RyZWFtUmVhZGVyID0gbnVsbDsKKwkgICAgdHJ5IHsKKwkJaW5TdHJlYW1SZWFkZXIgPSBKc3BVdGlsLmdldFJlYWRlcihhYnNGaWxlTmFtZSwgc291cmNlRW5jLAorCQkJCQkJICAgamFyRmlsZSwgY3R4dCwgZXJyKTsKKwkJSnNwUmVhZGVyIGpzcFJlYWRlciA9IG5ldyBKc3BSZWFkZXIoY3R4dCwgYWJzRmlsZU5hbWUsCisJCQkJCQkgICAgc291cmNlRW5jLCBpblN0cmVhbVJlYWRlciwKKwkJCQkJCSAgICBlcnIpOworICAgICAgICAgICAgICAgIHBhcnNlZFBhZ2UgPSBQYXJzZXIucGFyc2UodGhpcywganNwUmVhZGVyLCBwYXJlbnQsIGlzVGFnRmlsZSwKKwkJCQkJICBkaXJlY3RpdmVPbmx5LCBqYXJGaWxlVXJsLAorCQkJCQkgIHNvdXJjZUVuYywganNwQ29uZmlnUGFnZUVuYywKKwkJCQkJICBpc0RlZmF1bHRQYWdlRW5jb2RpbmcpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKwkJaWYgKGluU3RyZWFtUmVhZGVyICE9IG51bGwpIHsKKwkJICAgIHRyeSB7CisJCQlpblN0cmVhbVJlYWRlci5jbG9zZSgpOworCQkgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGFueSkgeworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisKKwlpZiAoamFyRmlsZSAhPSBudWxsKSB7CisJICAgIHRyeSB7CisJCWphckZpbGUuY2xvc2UoKTsKKwkgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHt9CisJfQorCisJYmFzZURpclN0YWNrLnBvcCgpOworCisJcmV0dXJuIHBhcnNlZFBhZ2U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBVUkkgaXMgbWF0Y2hlZCBieSBhIFVSTCBwYXR0ZXJuIHNwZWNpZmllZCBpbgorICAgICAqIGEganNwLXByb3BlcnR5LWdyb3VwIGluIHdlYi54bWwsIGFuZCBpZiBzbywgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlCisgICAgICogPHBhZ2UtZW5jb2Rpbmc+IGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWJzRmlsZU5hbWUgVGhlIFVSSSB0byBtYXRjaAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIDxwYWdlLWVuY29kaW5nPiBhdHRyaWJ1dGUgb2YgdGhlIAorICAgICAqIGpzcC1wcm9wZXJ0eS1ncm91cCB3aXRoIG1hdGNoaW5nIFVSTCBwYXR0ZXJuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SnNwQ29uZmlnUGFnZUVuY29kaW5nKFN0cmluZyBhYnNGaWxlTmFtZSkKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJSnNwQ29uZmlnIGpzcENvbmZpZyA9IGN0eHQuZ2V0T3B0aW9ucygpLmdldEpzcENvbmZpZygpOworCUpzcENvbmZpZy5Kc3BQcm9wZXJ0eSBqc3BQcm9wZXJ0eQorCSAgICA9IGpzcENvbmZpZy5maW5kSnNwUHJvcGVydHkoYWJzRmlsZU5hbWUpOworCXJldHVybiBqc3BQcm9wZXJ0eS5nZXRQYWdlRW5jb2RpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHRoZSBzeW50YXggKHN0YW5kYXJkIG9yIFhNTCkgYW5kIHBhZ2UgZW5jb2RpbmcgcHJvcGVydGllcworICAgICAqIGZvciB0aGUgZ2l2ZW4gZmlsZSwgYW5kIHN0b3JlcyB0aGVtIGluIHRoZSAnaXNYbWwnIGFuZCAnc291cmNlRW5jJworICAgICAqIGluc3RhbmNlIHZhcmlhYmxlcywgcmVzcGVjdGl2ZWx5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkZXRlcm1pbmVTeW50YXhBbmRFbmNvZGluZyhTdHJpbmcgYWJzRmlsZU5hbWUsCisJCQkJCSAgICBKYXJGaWxlIGphckZpbGUsCisJCQkJCSAgICBTdHJpbmcganNwQ29uZmlnUGFnZUVuYykKKwkgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworCWlzWG1sID0gZmFsc2U7CisKKwkvKgorCSAqICd0cnVlJyBpZiB0aGUgc3ludGF4IChYTUwgb3Igc3RhbmRhcmQpIG9mIHRoZSBmaWxlIGlzIGdpdmVuCisJICogZnJvbSBleHRlcm5hbCBpbmZvcm1hdGlvbjogZWl0aGVyIHZpYSBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQsCisJICogdGhlICIuanNweCIgc3VmZml4LCBvciB0aGUgZW5jbG9zaW5nIGZpbGUgKGZvciBpbmNsdWRlZCByZXNvdXJjZXMpCisJICovCisJYm9vbGVhbiBpc0V4dGVybmFsID0gZmFsc2U7CisKKwkvKgorCSAqIEluZGljYXRlcyB3aGV0aGVyIHdlIG5lZWQgdG8gcmV2ZXJ0IGZyb20gdGVtcG9yYXJ5IHVzYWdlIG9mCisJICogIklTTy04ODU5LTEiIGJhY2sgdG8gIlVURi04IgorCSAqLworCWJvb2xlYW4gcmV2ZXJ0ID0gZmFsc2U7CisKKyAgICAgICAgSnNwQ29uZmlnIGpzcENvbmZpZyA9IGN0eHQuZ2V0T3B0aW9ucygpLmdldEpzcENvbmZpZygpOworICAgICAgICBKc3BDb25maWcuSnNwUHJvcGVydHkganNwUHJvcGVydHkgPSBqc3BDb25maWcuZmluZEpzcFByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic0ZpbGVOYW1lKTsKKyAgICAgICAgaWYgKGpzcFByb3BlcnR5LmlzWG1sKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSWYgPGlzLXhtbD4gaXMgc3BlY2lmaWVkIGluIGEgPGpzcC1wcm9wZXJ0eS1ncm91cD4sIGl0IGlzIHVzZWQuCisgICAgICAgICAgICBpc1htbCA9IEpzcFV0aWwuYm9vbGVhblZhbHVlKGpzcFByb3BlcnR5LmlzWG1sKCkpOworCSAgICBpc0V4dGVybmFsID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKGFic0ZpbGVOYW1lLmVuZHNXaXRoKCIuanNweCIpCisJCSAgIHx8IGFic0ZpbGVOYW1lLmVuZHNXaXRoKCIudGFneCIpKSB7CisJICAgIGlzWG1sID0gdHJ1ZTsKKwkgICAgaXNFeHRlcm5hbCA9IHRydWU7CisJfQorCQorCWlmIChpc0V4dGVybmFsICYmICFpc1htbCkgeworCSAgICAvLyBKU1AgKHN0YW5kYXJkKSBzeW50YXguIFVzZSBlbmNvZGluZyBzcGVjaWZpZWQgaW4ganNwLWNvbmZpZworCSAgICAvLyBpZiBwcm92aWRlZC4KKwkgICAgc291cmNlRW5jID0ganNwQ29uZmlnUGFnZUVuYzsKKwkgICAgaWYgKHNvdXJjZUVuYyAhPSBudWxsKSB7CisJCXJldHVybjsKKwkgICAgfQorCSAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBlbmNvZGluZworCSAgICBzb3VyY2VFbmMgPSAiSVNPLTg4NTktMSI7CisJfSBlbHNlIHsKKwkgICAgLy8gWE1MIHN5bnRheCBvciB1bmtub3duLCAoYXV0bylkZXRlY3QgZW5jb2RpbmcgLi4uCisJICAgIE9iamVjdFtdIHJldCA9IFhNTEVuY29kaW5nRGV0ZWN0b3IuZ2V0RW5jb2RpbmcoYWJzRmlsZU5hbWUsCisJCQkJCQkJICAgamFyRmlsZSwgY3R4dCwgZXJyKTsKKwkgICAgc291cmNlRW5jID0gKFN0cmluZykgcmV0WzBdOworCSAgICBpZiAoKChCb29sZWFuKSByZXRbMV0pLmJvb2xlYW5WYWx1ZSgpKSB7CisJCWlzRW5jb2RpbmdTcGVjaWZpZWRJblByb2xvZyA9IHRydWU7CisJICAgIH0KKworCSAgICBpZiAoIWlzWG1sICYmIHNvdXJjZUVuYy5lcXVhbHMoIlVURi04IikpIHsKKwkJLyoKKwkJICogV2UgZG9uJ3Qga25vdyBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggWE1MIG9yIHN0YW5kYXJkIHN5bnRheC4KKwkJICogVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB0aGUgcGFnZSBjb250YWlucworCQkgKiBhIDxqc3A6cm9vdD4gZWxlbWVudC4KKwkJICoKKwkJICogV2UgbmVlZCB0byBiZSBjYXJlZnVsLCBiZWNhdXNlIHRoZSBwYWdlIG1heSBiZSBlbmNvZGVkIGluCisJCSAqIElTTy04ODU5LTEgKG9yIHNvbWV0aGluZyBlbnRpcmVseSBkaWZmZXJlbnQpLCBhbmQgbWF5CisJCSAqIGNvbnRhaW4gYnl0ZSBzZXF1ZW5jZXMgdGhhdCB3aWxsIGNhdXNlIGEgVVRGLTggY29udmVydGVyIHRvCisJCSAqIHRocm93IGV4Y2VwdGlvbnMuIAorCQkgKgorCQkgKiBJdCBpcyBzYWZlIHRvIHVzZSBhIHNvdXJjZSBlbmNvZGluZyBvZiBJU08tODg1OS0xIGluIHRoaXMKKwkJICogY2FzZSwgYXMgdGhlcmUgYXJlIG5vIGludmFsaWQgYnl0ZSBzZXF1ZW5jZXMgaW4gSVNPLTg4NTktMSwKKwkJICogYW5kIHRoZSBieXRlL2NoYXJhY3RlciBzZXF1ZW5jZXMgd2UncmUgbG9va2luZyBmb3IgKGkuZS4sCisJCSAqIDxqc3A6cm9vdD4pIGFyZSBpZGVudGljYWwgaW4gZWl0aGVyIGVuY29kaW5nIChib3RoIFVURi04CisJCSAqIGFuZCBJU08tODg1OS0xIGFyZSBleHRlbnNpb25zIG9mIEFTQ0lJKS4KKwkJICovCisJCXNvdXJjZUVuYyA9ICJJU08tODg1OS0xIjsKKwkJcmV2ZXJ0ID0gdHJ1ZTsKKwkgICAgfQorCX0KKworCWlmIChpc1htbCkgeworCSAgICAvLyAoVGhpcyBpbXBsaWVzICdpc0V4dGVybmFsJyBpcyBUUlVFLikKKwkgICAgLy8gV2Uga25vdyB3ZSdyZSBkZWFsaW5nIHdpdGggYSBKU1AgZG9jdW1lbnQgKHZpYSBKU1AgY29uZmlnIG9yCisJICAgIC8vICIuanNweCIgc3VmZml4KSwgc28gd2UncmUgZG9uZS4KKwkgICAgcmV0dXJuOworCX0KKworCS8qCisJICogQXQgdGhpcyBwb2ludCwgJ2lzRXh0ZXJuYWwnIG9yICdpc1htbCcgaXMgRkFMU0UuCisJICogU2VhcmNoIGZvciBqc3A6cm9vdCBhY3Rpb24sIGluIG9yZGVyIHRvIGRldGVybWluZSBpZiB3ZSdyZSBkZWFsaW5nIAorCSAqIHdpdGggWE1MIG9yIHN0YW5kYXJkIHN5bnRheCAodW5sZXNzIHdlIGFscmVhZHkga25vdyB3aGF0IHdlJ3JlIAorCSAqIGRlYWxpbmcgd2l0aCwgaS5lLiwgd2hlbiAnaXNFeHRlcm5hbCcgaXMgVFJVRSBhbmQgJ2lzWG1sJyBpcyBGQUxTRSkuCisJICogTm8gY2hlY2sgZm9yIFhNTCBwcm9sb2csIHNpbmNlIG5vdGhpbmcgcHJldmVudHMgYSBwYWdlIGZyb20KKwkgKiBvdXRwdXR0aW5nIFhNTCBhbmQgc3RpbGwgdXNpbmcgSlNQIHN5bnRheCAoaW4gdGhpcyBjYXNlLCB0aGUgCisJICogWE1MIHByb2xvZyBpcyB0cmVhdGVkIGFzIHRlbXBsYXRlIHRleHQpLgorCSAqLworCUpzcFJlYWRlciBqc3BSZWFkZXIgPSBudWxsOworCXRyeSB7CisJICAgIGpzcFJlYWRlciA9IG5ldyBKc3BSZWFkZXIoY3R4dCwgYWJzRmlsZU5hbWUsIHNvdXJjZUVuYywgamFyRmlsZSwKKwkJCQkgICAgICBlcnIpOworCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworCSAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKGV4KTsKKwl9CisgICAgICAgIGpzcFJlYWRlci5zZXRTaW5nbGVGaWxlKHRydWUpOworICAgICAgICBNYXJrIHN0YXJ0TWFyayA9IGpzcFJlYWRlci5tYXJrKCk7CisJaWYgKCFpc0V4dGVybmFsKSB7CisJICAgIGpzcFJlYWRlci5yZXNldChzdGFydE1hcmspOworCSAgICBpZiAoaGFzSnNwUm9vdChqc3BSZWFkZXIpKSB7CisJICAgICAgICBpc1htbCA9IHRydWU7CisJCWlmIChyZXZlcnQpIHNvdXJjZUVuYyA9ICJVVEYtOCI7CisJCXJldHVybjsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIGlzWG1sID0gZmFsc2U7CisJICAgIH0KKwl9CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgd2UncmUgZGVhbGluZyB3aXRoIEpTUCBzeW50YXguCisJICogSWYgYW4gWE1MIHByb2xvZyBpcyBwcm92aWRlZCwgaXQncyB0cmVhdGVkIGFzIHRlbXBsYXRlIHRleHQuCisJICogRGV0ZXJtaW5lIHRoZSBwYWdlIGVuY29kaW5nIGZyb20gdGhlIHBhZ2UgZGlyZWN0aXZlLCB1bmxlc3MgaXQncworCSAqIHNwZWNpZmllZCB2aWEgSlNQIGNvbmZpZy4KKwkgKi8KKwlzb3VyY2VFbmMgPSBqc3BDb25maWdQYWdlRW5jOworCWlmIChzb3VyY2VFbmMgPT0gbnVsbCkgeworCSAgICBzb3VyY2VFbmMgPSBnZXRQYWdlRW5jb2RpbmdGb3JKc3BTeW50YXgoanNwUmVhZGVyLCBzdGFydE1hcmspOworCSAgICBpZiAoc291cmNlRW5jID09IG51bGwpIHsKKwkJLy8gRGVmYXVsdCB0byAiSVNPLTg4NTktMSIgcGVyIEpTUCBzcGVjCisJCXNvdXJjZUVuYyA9ICJJU08tODg1OS0xIjsKKwkJaXNEZWZhdWx0UGFnZUVuY29kaW5nID0gdHJ1ZTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBEZXRlcm1pbmVzIHBhZ2Ugc291cmNlIGVuY29kaW5nIGZvciBwYWdlIG9yIHRhZyBmaWxlIGluIEpTUCBzeW50YXgsCisgICAgICogYnkgcmVhZGluZyAoaW4gdGhpcyBvcmRlcikgdGhlIHZhbHVlIG9mIHRoZSAncGFnZUVuY29kaW5nJyBwYWdlCisgICAgICogZGlyZWN0aXZlIGF0dHJpYnV0ZSwgb3IgdGhlIGNoYXJzZXQgdmFsdWUgb2YgdGhlICdjb250ZW50VHlwZScgcGFnZQorICAgICAqIGRpcmVjdGl2ZSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBwYWdlIGVuY29kaW5nLCBvciBudWxsIGlmIG5vdCBmb3VuZAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFBhZ2VFbmNvZGluZ0ZvckpzcFN5bnRheChKc3BSZWFkZXIganNwUmVhZGVyLAorCQkJCQkgICAgICAgTWFyayBzdGFydE1hcmspCisJICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworCVN0cmluZyBlbmNvZGluZyA9IG51bGw7CisgICAgICAgIFN0cmluZyBzYXZlRW5jb2RpbmcgPSBudWxsOworCisgICAgICAgIGpzcFJlYWRlci5yZXNldChzdGFydE1hcmspOworCisJLyoKKwkgKiBEZXRlcm1pbmUgcGFnZSBlbmNvZGluZyBmcm9tIGRpcmVjdGl2ZSBvZiB0aGUgZm9ybSA8JUAgcGFnZSAlPiwKKwkgKiA8JUAgdGFnICU+LCA8anNwOmRpcmVjdGl2ZS5wYWdlID4gb3IgPGpzcDpkaXJlY3RpdmUudGFnID4uCisJICovCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAoanNwUmVhZGVyLnNraXBVbnRpbCgiPCIpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBjb21tZW50LCBza2lwIHVudGlsIGl0cyBlbmQKKyAgICAgICAgICAgIGlmIChqc3BSZWFkZXIubWF0Y2hlcygiJS0tIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoanNwUmVhZGVyLnNraXBVbnRpbCgiLS0lPiIpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3Igd2lsbCBiZSBjYXVnaHQgaW4gUGFyc2VyCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gaXNEaXJlY3RpdmUgPSBqc3BSZWFkZXIubWF0Y2hlcygiJUAiKTsKKyAgICAgICAgICAgIGlmIChpc0RpcmVjdGl2ZSkgeworCSAgICAgICAganNwUmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlzRGlyZWN0aXZlID0ganNwUmVhZGVyLm1hdGNoZXMoImpzcDpkaXJlY3RpdmUuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWlzRGlyZWN0aXZlKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKwkgICAgLy8gY29tcGFyZSBmb3IgInRhZyAiLCBzbyB3ZSBkb24ndCBtYXRjaCAidGFnbGliIgorCSAgICBpZiAoanNwUmVhZGVyLm1hdGNoZXMoInRhZyAiKSB8fCBqc3BSZWFkZXIubWF0Y2hlcygicGFnZSIpKSB7CisKKwkJanNwUmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzID0gUGFyc2VyLnBhcnNlQXR0cmlidXRlcyh0aGlzLCBqc3BSZWFkZXIpOworCQllbmNvZGluZyA9IGdldFBhZ2VFbmNvZGluZ0Zyb21EaXJlY3RpdmUoYXR0cnMsICJwYWdlRW5jb2RpbmciKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisJCWVuY29kaW5nID0gZ2V0UGFnZUVuY29kaW5nRnJvbURpcmVjdGl2ZShhdHRycywgImNvbnRlbnRUeXBlIik7CisgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZUVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgICAgICAgICAgICAgfQorCSAgICB9CisJfQorCisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICBlbmNvZGluZyA9IHNhdmVFbmNvZGluZzsKKyAgICAgICAgfQorCisJcmV0dXJuIGVuY29kaW5nOworICAgIH0KKworICAgIC8qCisgICAgICogU2NhbnMgdGhlIGdpdmVuIGF0dHJpYnV0ZXMgZm9yIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwKKyAgICAgKiB3aGljaCBpcyBlaXRoZXIgJ3BhZ2VFbmNvZGluZycgb3IgJ2NvbnRlbnRUeXBlJywgYW5kIHJldHVybnMgdGhlCisgICAgICogc3BlY2lmaWVkIHBhZ2UgZW5jb2RpbmcuCisgICAgICoKKyAgICAgKiBJbiB0aGUgY2FzZSBvZiAnY29udGVudFR5cGUnLCB0aGUgcGFnZSBlbmNvZGluZyBpcyB0YWtlbiBmcm9tIHRoZQorICAgICAqIGNvbnRlbnQgdHlwZSdzICdjaGFyc2V0JyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cnMgVGhlIHBhZ2UgZGlyZWN0aXZlIGF0dHJpYnV0ZXMKKyAgICAgKiBAcGFyYW0gYXR0ck5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBzZWFyY2ggZm9yIChlaXRoZXIKKyAgICAgKiAncGFnZUVuY29kaW5nJyBvciAnY29udGVudFR5cGUnKQorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcGFnZSBlbmNvZGluZywgb3IgbnVsbAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFBhZ2VFbmNvZGluZ0Zyb21EaXJlY3RpdmUoQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSkgeworCVN0cmluZyB2YWx1ZSA9IGF0dHJzLmdldFZhbHVlKGF0dHJOYW1lKTsKKyAgICAgICAgaWYgKGF0dHJOYW1lLmVxdWFscygicGFnZUVuY29kaW5nIikpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGF0dHJOYW1lID0gY29udGVudFR5cGUKKyAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gdmFsdWU7CisgICAgICAgIFN0cmluZyBlbmNvZGluZyA9IG51bGw7CisgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7CisJICAgIGludCBsb2MgPSBjb250ZW50VHlwZS5pbmRleE9mKENIQVJTRVQpOworCSAgICBpZiAobG9jICE9IC0xKSB7CisJCWVuY29kaW5nID0gY29udGVudFR5cGUuc3Vic3RyaW5nKGxvYyArIENIQVJTRVQubGVuZ3RoKCkpOworCSAgICB9CisJfQorCisJcmV0dXJuIGVuY29kaW5nOworICAgIH0KKworICAgIC8qCisgICAgICogUmVzb2x2ZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSBhbmQgdXBkYXRlIGJhc2VEaXJTdGFjaygpIHRvIGtlZXAgdHJhY2sgb2YKKyAgICAgKiB0aGUgY3VycmVudCBiYXNlIGRpcmVjdG9yeSBmb3IgZWFjaCBpbmNsdWRlZCBmaWxlLgorICAgICAqIFRoZSAncm9vdCcgZmlsZSBpcyBhbHdheXMgYW4gJ2Fic29sdXRlJyBwYXRoLCBzbyBubyBuZWVkIHRvIHB1dCBhbgorICAgICAqIGluaXRpYWwgdmFsdWUgaW4gdGhlIGJhc2VEaXJTdGFjay4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlRmlsZU5hbWUoU3RyaW5nIGluRmlsZU5hbWUpIHsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gaW5GaWxlTmFtZS5yZXBsYWNlKCdcXCcsICcvJyk7CisgICAgICAgIGJvb2xlYW4gaXNBYnNvbHV0ZSA9IGZpbGVOYW1lLnN0YXJ0c1dpdGgoIi8iKTsKKwlmaWxlTmFtZSA9IGlzQWJzb2x1dGUgPyBmaWxlTmFtZSAKKyAgICAgICAgICAgIDogKFN0cmluZykgYmFzZURpclN0YWNrLnBlZWsoKSArIGZpbGVOYW1lOworCVN0cmluZyBiYXNlRGlyID0gCisJICAgIGZpbGVOYW1lLnN1YnN0cmluZygwLCBmaWxlTmFtZS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CisJYmFzZURpclN0YWNrLnB1c2goYmFzZURpcik7CisJcmV0dXJuIGZpbGVOYW1lOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gcGFnZSBjb250YWlucywgYXMgaXRzIGZpcnN0IGVsZW1lbnQsIGEgPHJvb3Q+CisgICAgICogZWxlbWVudCB3aG9zZSBwcmVmaXggaXMgYm91bmQgdG8gdGhlIEpTUCBuYW1lc3BhY2UsIGFzIGluOgorICAgICAqCisgICAgICogPHdvbWJhdDpyb290IHhtbG5zOndvbWJhdD0iaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIgdmVyc2lvbj0iMS4yIj4KKyAgICAgKiAgIC4uLgorICAgICAqIDwvd29tYmF0OnJvb3Q+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyIFRoZSByZWFkZXIgZm9yIHRoaXMgcGFnZQorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgcGFnZSBjb250YWlucyBhIHJvb3QgZWxlbWVudCB3aG9zZSBwcmVmaXggaXMgYm91bmQKKyAgICAgKiB0byB0aGUgSlNQIG5hbWVzcGFjZSwgYW5kIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNKc3BSb290KEpzcFJlYWRlciByZWFkZXIpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJLy8gPHByZWZpeD46cm9vdCBtdXN0IGJlIHRoZSBmaXJzdCBlbGVtZW50CisJTWFyayBzdGFydCA9IG51bGw7CisJd2hpbGUgKChzdGFydCA9IHJlYWRlci5za2lwVW50aWwoIjwiKSkgIT0gbnVsbCkgeworCSAgICBpbnQgYyA9IHJlYWRlci5uZXh0Q2hhcigpOworCSAgICBpZiAoYyAhPSAnIScgJiYgYyAhPSAnPycpIGJyZWFrOworCX0KKwlpZiAoc3RhcnQgPT0gbnVsbCkgeworCSAgICByZXR1cm4gZmFsc2U7CisJfQorCU1hcmsgc3RvcCA9IHJlYWRlci5za2lwVW50aWwoIjpyb290Iik7CisJaWYgKHN0b3AgPT0gbnVsbCkgeworCSAgICByZXR1cm4gZmFsc2U7CisJfQorCS8vIGNhbGwgc3Vic3RyaW5nIHRvIGdldCByaWQgb2YgbGVhZGluZyAnPCcKKwlTdHJpbmcgcHJlZml4ID0gcmVhZGVyLmdldFRleHQoc3RhcnQsIHN0b3ApLnN1YnN0cmluZygxKTsKKworCXN0YXJ0ID0gc3RvcDsKKwlzdG9wID0gcmVhZGVyLnNraXBVbnRpbCgiPiIpOworCWlmIChzdG9wID09IG51bGwpIHsKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworCS8vIERldGVybWluZSBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIDxyb290PiBlbGVtZW50J3MgcHJlZml4CisJU3RyaW5nIHJvb3QgPSByZWFkZXIuZ2V0VGV4dChzdGFydCwgc3RvcCk7CisJU3RyaW5nIHhtbG5zRGVjbCA9ICJ4bWxuczoiICsgcHJlZml4OworCWludCBpbmRleCA9IHJvb3QuaW5kZXhPZih4bWxuc0RlY2wpOworCWlmIChpbmRleCA9PSAtMSkgeworCSAgICByZXR1cm4gZmFsc2U7CisJfQorCWluZGV4ICs9IHhtbG5zRGVjbC5sZW5ndGgoKTsKKwl3aGlsZSAoaW5kZXggPCByb290Lmxlbmd0aCgpCisJICAgICAgICAgICAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHJvb3QuY2hhckF0KGluZGV4KSkpIHsKKwkgICAgaW5kZXgrKzsKKwl9CisJaWYgKGluZGV4IDwgcm9vdC5sZW5ndGgoKSAmJiByb290LmNoYXJBdChpbmRleCkgPT0gJz0nKSB7CisJICAgIGluZGV4Kys7CisJICAgIHdoaWxlIChpbmRleCA8IHJvb3QubGVuZ3RoKCkKKwkJICAgICAgICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2Uocm9vdC5jaGFyQXQoaW5kZXgpKSkgeworCQlpbmRleCsrOworCSAgICB9CisJICAgIGlmIChpbmRleCA8IHJvb3QubGVuZ3RoKCkgJiYgcm9vdC5jaGFyQXQoaW5kZXgrKykgPT0gJyInCisJCSAgICAmJiByb290LnJlZ2lvbk1hdGNoZXMoaW5kZXgsIEpTUF9VUkksIDAsCisJCQkJCSAgSlNQX1VSSS5sZW5ndGgoKSkpIHsKKwkJcmV0dXJuIHRydWU7CisJICAgIH0KKwl9CisKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBKYXJGaWxlIGdldEphckZpbGUoVVJMIGphckZpbGVVcmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJSmFyRmlsZSBqYXJGaWxlID0gbnVsbDsKKworCWlmIChqYXJGaWxlVXJsICE9IG51bGwpIHsKKwkgICAgSmFyVVJMQ29ubmVjdGlvbiBjb25uID0gKEphclVSTENvbm5lY3Rpb24pIGphckZpbGVVcmwub3BlbkNvbm5lY3Rpb24oKTsKKwkgICAgY29ubi5zZXRVc2VDYWNoZXMoZmFsc2UpOworCSAgICBjb25uLmNvbm5lY3QoKTsKKwkgICAgamFyRmlsZSA9IGNvbm4uZ2V0SmFyRmlsZSgpOworCX0KKworCXJldHVybiBqYXJGaWxlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9TY3JpcHRpbmdWYXJpYWJsZXIuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvU2NyaXB0aW5nVmFyaWFibGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExMDM1NgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvU2NyaXB0aW5nVmFyaWFibGVyLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSmFzcGVyRXhjZXB0aW9uOworCisvKioKKyAqIENsYXNzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlcyB0aGF0IGV2ZXJ5CisgKiBjdXN0b20gYWN0aW9uIG5lZWRzIHRvIGRlY2xhcmUuCisgKgorICogQGF1dGhvciBKYW4gTHVlaGUKKyAqLworY2xhc3MgU2NyaXB0aW5nVmFyaWFibGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgTUFYX1NDT1BFID0gbmV3IEludGVnZXIoSW50ZWdlci5NQVhfVkFMVUUpOworCisgICAgLyoKKyAgICAgKiBBc3NpZ25zIGFuIGlkZW50aWZpZXIgKG9mIHR5cGUgaW50ZWdlcikgdG8gZXZlcnkgY3VzdG9tIHRhZywgaW4gb3JkZXIKKyAgICAgKiB0byBoZWxwIGlkZW50aWZ5LCBmb3IgZXZlcnkgY3VzdG9tIHRhZywgdGhlIHNjcmlwdGluZyB2YXJpYWJsZXMgdGhhdCBpdAorICAgICAqIG5lZWRzIHRvIGRlY2xhcmUuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIEN1c3RvbVRhZ0NvdW50ZXIgZXh0ZW5kcyBOb2RlLlZpc2l0b3IgeworCisJcHJpdmF0ZSBpbnQgY291bnQ7CisJcHJpdmF0ZSBOb2RlLkN1c3RvbVRhZyBwYXJlbnQ7CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkN1c3RvbVRhZyBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgbi5zZXRDdXN0b21UYWdQYXJlbnQocGFyZW50KTsKKwkgICAgTm9kZS5DdXN0b21UYWcgdG1wUGFyZW50ID0gcGFyZW50OworCSAgICBwYXJlbnQgPSBuOworCSAgICB2aXNpdEJvZHkobik7CisJICAgIHBhcmVudCA9IHRtcFBhcmVudDsKKwkgICAgbi5zZXROdW1Db3VudChuZXcgSW50ZWdlcihjb3VudCsrKSk7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogRm9yIGV2ZXJ5IGN1c3RvbSB0YWcsIGRldGVybWluZXMgdGhlIHNjcmlwdGluZyB2YXJpYWJsZXMgaXQgbmVlZHMgdG8KKyAgICAgKiBkZWNsYXJlLiAKKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgU2NyaXB0aW5nVmFyaWFibGVWaXNpdG9yIGV4dGVuZHMgTm9kZS5WaXNpdG9yIHsKKworCXByaXZhdGUgRXJyb3JEaXNwYXRjaGVyIGVycjsKKwlwcml2YXRlIEhhc2h0YWJsZSBzY3JpcHRWYXJzOworCQorCXB1YmxpYyBTY3JpcHRpbmdWYXJpYWJsZVZpc2l0b3IoRXJyb3JEaXNwYXRjaGVyIGVycikgeworCSAgICB0aGlzLmVyciA9IGVycjsKKwkgICAgc2NyaXB0VmFycyA9IG5ldyBIYXNodGFibGUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkN1c3RvbVRhZyBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgc2V0U2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uQVRfQkVHSU4pOworCSAgICBzZXRTY3JpcHRpbmdWYXJzKG4sIFZhcmlhYmxlSW5mby5ORVNURUQpOworCSAgICB2aXNpdEJvZHkobik7CisJICAgIHNldFNjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLkFUX0VORCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFNjcmlwdGluZ1ZhcnMoTm9kZS5DdXN0b21UYWcgbiwgaW50IHNjb3BlKQorCSAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKwkgICAgVGFnVmFyaWFibGVJbmZvW10gdGFnVmFySW5mb3MgPSBuLmdldFRhZ1ZhcmlhYmxlSW5mb3MoKTsKKwkgICAgVmFyaWFibGVJbmZvW10gdmFySW5mb3MgPSBuLmdldFZhcmlhYmxlSW5mb3MoKTsKKwkgICAgaWYgKHRhZ1ZhckluZm9zLmxlbmd0aCA9PSAwICYmIHZhckluZm9zLmxlbmd0aCA9PSAwKSB7CisJCXJldHVybjsKKwkgICAgfQorCisJICAgIFZlY3RvciB2ZWMgPSBuZXcgVmVjdG9yKCk7CisKKwkgICAgSW50ZWdlciBvd25SYW5nZSA9IG51bGw7CisJICAgIGlmIChzY29wZSA9PSBWYXJpYWJsZUluZm8uQVRfQkVHSU4KKwkJICAgIHx8IHNjb3BlID09IFZhcmlhYmxlSW5mby5BVF9FTkQpIHsKKwkJTm9kZS5DdXN0b21UYWcgcGFyZW50ID0gbi5nZXRDdXN0b21UYWdQYXJlbnQoKTsKKwkJaWYgKHBhcmVudCA9PSBudWxsKQorCQkgICAgb3duUmFuZ2UgPSBNQVhfU0NPUEU7CisJCWVsc2UKKwkJICAgIG93blJhbmdlID0gcGFyZW50LmdldE51bUNvdW50KCk7CisJICAgIH0gZWxzZSB7CisJCS8vIE5FU1RFRAorCQlvd25SYW5nZSA9IG4uZ2V0TnVtQ291bnQoKTsKKwkgICAgfQorCisJICAgIGlmICh2YXJJbmZvcy5sZW5ndGggPiAwKSB7CisJCWZvciAoaW50IGk9MDsgaTx2YXJJbmZvcy5sZW5ndGg7IGkrKykgeworCQkgICAgaWYgKHZhckluZm9zW2ldLmdldFNjb3BlKCkgIT0gc2NvcGUKKwkJCSAgICB8fCAhdmFySW5mb3NbaV0uZ2V0RGVjbGFyZSgpKSB7CisJCQljb250aW51ZTsKKwkJICAgIH0KKwkJICAgIFN0cmluZyB2YXJOYW1lID0gdmFySW5mb3NbaV0uZ2V0VmFyTmFtZSgpOworCQkgICAgCisJCSAgICBJbnRlZ2VyIGN1cnJlbnRSYW5nZSA9IChJbnRlZ2VyKSBzY3JpcHRWYXJzLmdldCh2YXJOYW1lKTsKKwkJICAgIGlmIChjdXJyZW50UmFuZ2UgPT0gbnVsbAorCQkJICAgIHx8IG93blJhbmdlLmNvbXBhcmVUbyhjdXJyZW50UmFuZ2UpID4gMCkgeworCQkJc2NyaXB0VmFycy5wdXQodmFyTmFtZSwgb3duUmFuZ2UpOworCQkJdmVjLmFkZCh2YXJJbmZvc1tpXSk7CisJCSAgICB9CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJZm9yIChpbnQgaT0wOyBpPHRhZ1ZhckluZm9zLmxlbmd0aDsgaSsrKSB7CisJCSAgICBpZiAodGFnVmFySW5mb3NbaV0uZ2V0U2NvcGUoKSAhPSBzY29wZQorCQkJICAgIHx8ICF0YWdWYXJJbmZvc1tpXS5nZXREZWNsYXJlKCkpIHsKKwkJCWNvbnRpbnVlOworCQkgICAgfQorCQkgICAgU3RyaW5nIHZhck5hbWUgPSB0YWdWYXJJbmZvc1tpXS5nZXROYW1lR2l2ZW4oKTsKKwkJICAgIGlmICh2YXJOYW1lID09IG51bGwpIHsKKwkJCXZhck5hbWUgPSBuLmdldFRhZ0RhdGEoKS5nZXRBdHRyaWJ1dGVTdHJpbmcoCisJCSAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1ZhckluZm9zW2ldLmdldE5hbWVGcm9tQXR0cmlidXRlKCkpOworCQkJaWYgKHZhck5hbWUgPT0gbnVsbCkgeworCQkJICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnNjcmlwdGluZy52YXJpYWJsZS5taXNzaW5nX25hbWUiLAorCQkJCQkgdGFnVmFySW5mb3NbaV0uZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKSk7CisJCQl9CisJCSAgICB9CisKKwkJICAgIEludGVnZXIgY3VycmVudFJhbmdlID0gKEludGVnZXIpIHNjcmlwdFZhcnMuZ2V0KHZhck5hbWUpOworCQkgICAgaWYgKGN1cnJlbnRSYW5nZSA9PSBudWxsCisJCQkgICAgfHwgb3duUmFuZ2UuY29tcGFyZVRvKGN1cnJlbnRSYW5nZSkgPiAwKSB7CisJCQlzY3JpcHRWYXJzLnB1dCh2YXJOYW1lLCBvd25SYW5nZSk7CisJCQl2ZWMuYWRkKHRhZ1ZhckluZm9zW2ldKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgICAgbi5zZXRTY3JpcHRpbmdWYXJzKHZlYywgc2NvcGUpOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KE5vZGUuTm9kZXMgcGFnZSwgRXJyb3JEaXNwYXRjaGVyIGVycikKKwkgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJcGFnZS52aXNpdChuZXcgQ3VzdG9tVGFnQ291bnRlcigpKTsKKwlwYWdlLnZpc2l0KG5ldyBTY3JpcHRpbmdWYXJpYWJsZVZpc2l0b3IoZXJyKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9TZXJ2bGV0V3JpdGVyLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1NlcnZsZXRXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDA3Zjc3Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9TZXJ2bGV0V3JpdGVyLmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworLyoqCisgKiBUaGlzIGlzIHdoYXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBzZXJ2bGV0cy4gCisgKgorICogQGF1dGhvciBBbmlsIEsuIFZpamVuZHJhbgorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2bGV0V3JpdGVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGludCBUQUJfV0lEVEggPSAyOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNQQUNFUyA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworCisgICAgLy8gQ3VycmVudCBpbmRlbnQgbGV2ZWw6CisgICAgcHJpdmF0ZSBpbnQgaW5kZW50ID0gMDsKKyAgICBwcml2YXRlIGludCB2aXJ0dWFsX2luZGVudCA9IDA7CisKKyAgICAvLyBUaGUgc2luayB3cml0ZXI6CisgICAgUHJpbnRXcml0ZXIgd3JpdGVyOworICAgIAorICAgIC8vIHNlcnZsZXQgbGluZSBudW1iZXJzIHN0YXJ0IGZyb20gMQorICAgIHByaXZhdGUgaW50IGphdmFMaW5lID0gMTsKKworCisgICAgcHVibGljIFNlcnZsZXRXcml0ZXIoUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisJdGhpcy53cml0ZXIgPSB3cml0ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXdyaXRlci5jbG9zZSgpOworICAgIH0KKworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEFjY2VzcyBpbmZvcm1hdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyBpbnQgZ2V0SmF2YUxpbmUoKSB7CisgICAgICAgIHJldHVybiBqYXZhTGluZTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEZvcm1hdHRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyB2b2lkIHB1c2hJbmRlbnQoKSB7CisJdmlydHVhbF9pbmRlbnQgKz0gVEFCX1dJRFRIOworCWlmICh2aXJ0dWFsX2luZGVudCA+PSAwICYmIHZpcnR1YWxfaW5kZW50IDw9IFNQQUNFUy5sZW5ndGgoKSkKKwkgICAgaW5kZW50ID0gdmlydHVhbF9pbmRlbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9wSW5kZW50KCkgeworCXZpcnR1YWxfaW5kZW50IC09IFRBQl9XSURUSDsKKwlpZiAodmlydHVhbF9pbmRlbnQgPj0gMCAmJiB2aXJ0dWFsX2luZGVudCA8PSBTUEFDRVMubGVuZ3RoKCkpCisJICAgIGluZGVudCA9IHZpcnR1YWxfaW5kZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGEgc3RhbmRhcmQgY29tbWVudCBmb3IgZWNobyBvdXRwdXRlZCBjaHVuay4KKyAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBKU1AgY2h1bmsgYmVpbmcgcHJvY2Vzc2VkLiAKKyAgICAgKiBAcGFyYW0gc3RvcCAgVGhlIGVuZGluZyBwb3NpdGlvbiBvZiB0aGUgSlNQIGNodW5rIGJlaW5nIHByb2Nlc3NlZC4gCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRDb21tZW50KE1hcmsgc3RhcnQsIE1hcmsgc3RvcCwgY2hhcltdIGNoYXJzKSB7CisgICAgICAgIGlmIChzdGFydCAhPSBudWxsICYmIHN0b3AgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJpbnRsbigiLy8gZnJvbT0iK3N0YXJ0KTsKKyAgICAgICAgICAgIHByaW50bG4oIi8vICAgdG89IitzdG9wKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGNoYXJzICE9IG51bGwpCisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOykgeworICAgICAgICAgICAgICAgIHByaW50aW4oKTsKKyAgICAgICAgICAgICAgICBwcmludCgiLy8gIik7CisgICAgICAgICAgICAgICAgd2hpbGUgKGNoYXJzW2ldICE9ICdcbicgJiYgaSA8IGNoYXJzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KGNoYXJzW2krK10pOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyB0aGUgZ2l2ZW4gc3RyaW5nIGZvbGxvd2VkIGJ5ICdcbicKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKFN0cmluZyBzKSB7CisgICAgICAgIGphdmFMaW5lKys7CisJd3JpdGVyLnByaW50bG4ocyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnRzIGEgJ1xuJworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oKSB7CisgICAgICAgIGphdmFMaW5lKys7CisJd3JpdGVyLnByaW50bG4oIiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyB0aGUgY3VycmVudCBpbmRlbnRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludGluKCkgeworCXdyaXRlci5wcmludChTUEFDRVMuc3Vic3RyaW5nKDAsIGluZGVudCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyB0aGUgY3VycmVudCBpbmRlbnRpb24sIGZvbGxvd2VkIGJ5IHRoZSBnaXZlbiBzdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludGluKFN0cmluZyBzKSB7CisJd3JpdGVyLnByaW50KFNQQUNFUy5zdWJzdHJpbmcoMCwgaW5kZW50KSk7CisJd3JpdGVyLnByaW50KHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyB0aGUgY3VycmVudCBpbmRlbnRpb24sIGFuZCB0aGVuIHRoZSBzdHJpbmcsIGFuZCBhICdcbicuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRpbChTdHJpbmcgcykgeworICAgICAgICBqYXZhTGluZSsrOworCXdyaXRlci5wcmludChTUEFDRVMuc3Vic3RyaW5nKDAsIGluZGVudCkpOworCXdyaXRlci5wcmludGxuKHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyB0aGUgZ2l2ZW4gY2hhci4KKyAgICAgKgorICAgICAqIFVzZSBwcmludGxuKCkgdG8gcHJpbnQgYSAnXG4nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50KGNoYXIgYykgeworCXdyaXRlci5wcmludChjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludHMgdGhlIGdpdmVuIGludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludChpbnQgaSkgeworCXdyaXRlci5wcmludChpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludHMgdGhlIGdpdmVuIHN0cmluZy4KKyAgICAgKgorICAgICAqIFRoZSBzdHJpbmcgbXVzdCBub3QgY29udGFpbiBhbnkgJ1xuJywgb3RoZXJ3aXNlIHRoZSBsaW5lIGNvdW50IHdpbGwgYmUKKyAgICAgKiBvZmYuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQoU3RyaW5nIHMpIHsKKwl3cml0ZXIucHJpbnQocyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnRzIHRoZSBnaXZlbiBzdHJpbmcuCisgICAgICoKKyAgICAgKiBJZiB0aGUgc3RyaW5nIHNwYW5zIG11bHRpcGxlIGxpbmVzLCB0aGUgbGluZSBjb3VudCB3aWxsIGJlIGFkanVzdGVkCisgICAgICogYWNjb3JkaW5nbHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRNdWx0aUxuKFN0cmluZyBzKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisKKyAgICAgICAgLy8gbG9vayBmb3IgaGlkZGVuIG5ld2xpbmVzIGluc2lkZSBzdHJpbmdzCisgICAgICAgIHdoaWxlICgoaW5kZXg9cy5pbmRleE9mKCdcbicsaW5kZXgpKSA+IC0xICkgeworICAgICAgICAgICAgamF2YUxpbmUrKzsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKworCXdyaXRlci5wcmludChzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1NtYXBHZW5lcmF0b3IuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvU21hcEdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Mzc0NDcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1NtYXBHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIFJlcHJlc2VudHMgYSBzb3VyY2UgbWFwIChTTUFQKSwgd2hpY2ggc2VydmVzIHRvIGFzc29jaWF0ZSBsaW5lcworICogb2YgdGhlIGlucHV0IEpTUCBmaWxlKHMpIHRvIGxpbmVzIGluIHRoZSBnZW5lcmF0ZWQgc2VydmxldCBpbiB0aGUKKyAqIGZpbmFsIC5jbGFzcyBmaWxlLCBhY2NvcmRpbmcgdG8gdGhlIEpTUi0wNDUgc3BlYy4KKyAqIAorICogQGF1dGhvciBTaGF3biBCYXllcm4KKyAqLworcHVibGljIGNsYXNzIFNtYXBHZW5lcmF0b3IgeworCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBPdmVydmlldworCisgICAgLyoKKyAgICAgKiBUaGUgU01BUCBzeW50YXggaXMgcmVhc29uYWJseSBzdHJhaWdodGZvcndhcmQuICBUaGUgcHVycG9zZSBvZiB0aGlzCisgICAgICogY2xhc3MgaXMgY3VycmVudGx5IHR3b2ZvbGQ6CisgICAgICogIC0gdG8gcHJvdmlkZSBhIHNpbXBsZSBidXQgbG93LWxldmVsIEphdmEgaW50ZXJmYWNlIHRvIGJ1aWxkCisgICAgICogICAgYSBsb2dpY2FsIFNNQVAKKyAgICAgKiAgLSB0byBzZXJpYWxpemUgdGhpcyBsb2dpY2FsIFNNQVAgZm9yIGV2ZW50dWFsIGluY2x1c2lvbiBkaXJlY3RseQorICAgICAqICAgIGludG8gYSAuY2xhc3MgZmlsZS4KKyAgICAgKi8KKworCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBQcml2YXRlIHN0YXRlCisKKyAgICBwcml2YXRlIFN0cmluZyBvdXRwdXRGaWxlTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0U3RyYXR1bSA9ICJKYXZhIjsKKyAgICBwcml2YXRlIExpc3Qgc3RyYXRhID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgTGlzdCBlbWJlZGRlZCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZG9FbWJlZGRlZCA9IHRydWU7CisKKyAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8vIE1ldGhvZHMgZm9yIGFkZGluZyBtYXBwaW5nIGRhdGEKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGZpbGVuYW1lICh3aXRob3V0IHBhdGggaW5mb3JtYXRpb24pIGZvciB0aGUgZ2VuZXJhdGVkCisgICAgICogc291cmNlIGZpbGUuICBFLmcuLCAiZm9vJGpzcC5qYXZhIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0T3V0cHV0RmlsZU5hbWUoU3RyaW5nIHgpIHsKKwlvdXRwdXRGaWxlTmFtZSA9IHg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gU21hcFN0cmF0dW0gb2JqZWN0LCByZXByZXNlbnRpbmcgYSBTdHJhdHVtIHdpdGgKKyAgICAgKiBsb2dpY2FsbHkgYXNzb2NpYXRlZCBGaWxlU2VjdGlvbiBhbmQgTGluZVNlY3Rpb24gYmxvY2tzLCB0bworICAgICAqIHRoZSBjdXJyZW50IFNtYXBHZW5lcmF0b3IuICBJZiA8dHQ+ZGVmYXVsdDwvdHQ+IGlzIHRydWUsIHRoaXMKKyAgICAgKiBzdHJhdHVtIGlzIG1hZGUgdGhlIGRlZmF1bHQgc3RyYXR1bSwgb3ZlcnJpZGluZyBhbnkgcHJldmlvdXNseQorICAgICAqIHNldCBkZWZhdWx0LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmF0dW0gdGhlIFNtYXBTdHJhdHVtIG9iamVjdCB0byBhZGQKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFN0cmF0dW0gaWYgPHR0PnRydWU8L3R0PiwgdGhpcyBTbWFwU3RyYXR1bSBpcyBjb25zaWRlcmVkCisgICAgICogICAgICAgICAgICAgICAgdG8gcmVwcmVzZW50IHRoZSBkZWZhdWx0IFNNQVAgc3RyYXR1bSB1bmxlc3MKKyAgICAgKiAgICAgICAgICAgICAgICBvdmVyd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTdHJhdHVtKFNtYXBTdHJhdHVtIHN0cmF0dW0sCisJCQkJCWJvb2xlYW4gZGVmYXVsdFN0cmF0dW0pIHsKKwlzdHJhdGEuYWRkKHN0cmF0dW0pOworCWlmIChkZWZhdWx0U3RyYXR1bSkKKwkgICAgdGhpcy5kZWZhdWx0U3RyYXR1bSA9IHN0cmF0dW0uZ2V0U3RyYXR1bU5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBnaXZlbiBzdHJpbmcgYXMgYW4gZW1iZWRkZWQgU01BUCB3aXRoIHRoZSBnaXZlbiBzdHJhdHVtIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc21hcCB0aGUgU01BUCB0byBlbWJlZAorICAgICAqIEBwYXJhbSBzdHJhdHVtTmFtZSB0aGUgbmFtZSBvZiB0aGUgc3RyYXR1bSBvdXRwdXQgYnkgdGhlIGNvbXBpbGF0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgIHRoYXQgcHJvZHVjZWQgdGhlIDx0dD5zbWFwPC90dD4gdG8gYmUgZW1iZWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkU21hcChTdHJpbmcgc21hcCwgU3RyaW5nIHN0cmF0dW1OYW1lKSB7CisJZW1iZWRkZWQuYWRkKCIqTyAiICsgc3RyYXR1bU5hbWUgKyAiXG4iCisJCSAgICsgc21hcAorCQkgICArICIqQyAiICsgc3RyYXR1bU5hbWUgKyAiXG4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0cnVjdHMgdGhlIFNtYXBHZW5lcmF0b3Igd2hldGhlciB0byBhY3R1YWxseSBwcmludCBhbnkgZW1iZWRkZWQKKyAgICAgKiBTTUFQcyBvciBub3QuICBJbnRlbmRlZCBmb3Igc2l0dWF0aW9ucyB3aXRob3V0IGFuIFNNQVAgcmVzb2x2ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdHVzIElmIDx0dD5mYWxzZTwvdHQ+LCBpZ25vcmUgYW55IGVtYmVkZGVkIFNNQVBzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvRW1iZWRkZWQoYm9vbGVhbiBzdGF0dXMpIHsKKwlkb0VtYmVkZGVkID0gc3RhdHVzOworICAgIH0KKworICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLy8gTWV0aG9kcyBmb3Igc2VyaWFsaXppbmcgdGhlIGxvZ2ljYWwgU01BUAorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0U3RyaW5nKCkgeworCS8vIGNoZWNrIHN0YXRlIGFuZCBpbml0aWFsaXplIGJ1ZmZlcgorCWlmIChvdXRwdXRGaWxlTmFtZSA9PSBudWxsKQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKwkvLyBzdGFydCB0aGUgU01BUAorCW91dC5hcHBlbmQoIlNNQVBcbiIpOworCW91dC5hcHBlbmQob3V0cHV0RmlsZU5hbWUgKyAnXG4nKTsKKwlvdXQuYXBwZW5kKGRlZmF1bHRTdHJhdHVtICsgJ1xuJyk7CisKKwkvLyBpbmNsdWRlIGVtYmVkZGVkIFNNQVBzCisJaWYgKGRvRW1iZWRkZWQpIHsKKwkgICAgaW50IG5FbWJlZGRlZCA9IGVtYmVkZGVkLnNpemUoKTsKKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuRW1iZWRkZWQ7IGkrKykgeworCSAgICAgICAgb3V0LmFwcGVuZChlbWJlZGRlZC5nZXQoaSkpOworCSAgICB9CisJfQorCisJLy8gcHJpbnQgb3VyIFN0cmF0dW1TZWN0aW9ucywgRmlsZVNlY3Rpb25zLCBhbmQgTGluZVNlY3Rpb25zCisJaW50IG5TdHJhdGEgPSBzdHJhdGEuc2l6ZSgpOworCWZvciAoaW50IGkgPSAwOyBpIDwgblN0cmF0YTsgaSsrKSB7CisJICAgIFNtYXBTdHJhdHVtIHMgPSAoU21hcFN0cmF0dW0pIHN0cmF0YS5nZXQoaSk7CisJICAgIG91dC5hcHBlbmQocy5nZXRTdHJpbmcoKSk7CisJfQorCisJLy8gZW5kIHRoZSBTTUFQCisJb3V0LmFwcGVuZCgiKkVcbiIpOworCisJcmV0dXJuIG91dC50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiBnZXRTdHJpbmcoKTsgfQorCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBGb3IgdGVzdGluZyAoYW5kIGFzIGFuIGV4YW1wbGUgb2YgdXNlKS4uLgorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgeworCVNtYXBHZW5lcmF0b3IgZyA9IG5ldyBTbWFwR2VuZXJhdG9yKCk7CisJZy5zZXRPdXRwdXRGaWxlTmFtZSgiZm9vLmphdmEiKTsKKwlTbWFwU3RyYXR1bSBzID0gbmV3IFNtYXBTdHJhdHVtKCJKU1AiKTsKKwlzLmFkZEZpbGUoImZvby5qc3AiKTsKKwlzLmFkZEZpbGUoImJhci5qc3AiLCAiL2Zvby9mb28vYmFyLmpzcCIpOworCXMuYWRkTGluZURhdGEoMSwgImZvby5qc3AiLCAxLCAxLCAxKTsKKwlzLmFkZExpbmVEYXRhKDIsICJmb28uanNwIiwgMSwgNiwgMSk7CisJcy5hZGRMaW5lRGF0YSgzLCAiZm9vLmpzcCIsIDIsIDEwLCA1KTsKKwlzLmFkZExpbmVEYXRhKDIwLCAiYmFyLmpzcCIsIDEsIDMwLCAxKTsKKwlnLmFkZFN0cmF0dW0ocywgdHJ1ZSk7CisJU3lzdGVtLm91dC5wcmludChnKTsKKworCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tIik7CisKKwlTbWFwR2VuZXJhdG9yIGVtYmVkZGVkID0gbmV3IFNtYXBHZW5lcmF0b3IoKTsKKwllbWJlZGRlZC5zZXRPdXRwdXRGaWxlTmFtZSgiYmxhcmdoLnRpZXIyIik7CisJcyA9IG5ldyBTbWFwU3RyYXR1bSgiVGllcjIiKTsKKwlzLmFkZEZpbGUoIjEudGllcjIiKTsKKwlzLmFkZExpbmVEYXRhKDEsICIxLnRpZXIyIiwgMSwgMSwgMSk7CisJZW1iZWRkZWQuYWRkU3RyYXR1bShzLCB0cnVlKTsKKwlnLmFkZFNtYXAoZW1iZWRkZWQudG9TdHJpbmcoKSwgIkpTUCIpOworCVN5c3RlbS5vdXQucHJpbnRsbihnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1NtYXBTdHJhdHVtLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1NtYXBTdHJhdHVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBjNTA2ZQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvU21hcFN0cmF0dW0uamF2YQpAQCAtMCwwICsxLDMzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIFJlcHJlc2VudHMgdGhlIGxpbmUgYW5kIGZpbGUgbWFwcGluZ3MgYXNzb2NpYXRlZCB3aXRoIGEgSlNSLTA0NQorICogInN0cmF0dW0iLgorICoKKyAqIEBhdXRob3IgSmF5c29uIEZhbGtuZXIKKyAqIEBhdXRob3IgU2hhd24gQmF5ZXJuCisgKi8KK3B1YmxpYyBjbGFzcyBTbWFwU3RyYXR1bSB7CisKKyAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8vIENsYXNzIGZvciBzdG9yaW5nIExpbmVJbmZvIGRhdGEKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBzaW5nbGUgTGluZVNlY3Rpb24gaW4gYW4gU01BUCwgYXNzb2NpYXRlZCB3aXRoCisgICAgICogYSBwYXJ0aWN1bGFyIHN0cmF0dW0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaW5lSW5mbyB7CisgICAgICAgIHByaXZhdGUgaW50IGlucHV0U3RhcnRMaW5lID0gLTE7CisgICAgICAgIHByaXZhdGUgaW50IG91dHB1dFN0YXJ0TGluZSA9IC0xOworICAgICAgICBwcml2YXRlIGludCBsaW5lRmlsZUlEID0gMDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgaW5wdXRMaW5lQ291bnQgPSAxOworICAgICAgICBwcml2YXRlIGludCBvdXRwdXRMaW5lSW5jcmVtZW50ID0gMTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGxpbmVGaWxlSURTZXQgPSBmYWxzZTsKKworICAgICAgICAvKiogU2V0cyBJbnB1dFN0YXJ0TGluZS4gKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0SW5wdXRTdGFydExpbmUoaW50IGlucHV0U3RhcnRMaW5lKSB7CisgICAgICAgICAgICBpZiAoaW5wdXRTdGFydExpbmUgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIiIgKyBpbnB1dFN0YXJ0TGluZSk7CisgICAgICAgICAgICB0aGlzLmlucHV0U3RhcnRMaW5lID0gaW5wdXRTdGFydExpbmU7CisgICAgICAgIH0KKworICAgICAgICAvKiogU2V0cyBPdXRwdXRTdGFydExpbmUuICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dFN0YXJ0TGluZShpbnQgb3V0cHV0U3RhcnRMaW5lKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0U3RhcnRMaW5lIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCIiICsgb3V0cHV0U3RhcnRMaW5lKTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0U3RhcnRMaW5lID0gb3V0cHV0U3RhcnRMaW5lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBTZXRzIGxpbmVGaWxlSUQuICBTaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBkaWZmZXJlbnQgZnJvbQorICAgICAgICAgICAgICogdGhhdCBvZiBwcmlvciBMaW5lSW5mbyBvYmplY3QgKGluIGFueSBnaXZlbiBjb250ZXh0KSBvciAwCisgICAgICAgICAgICAgKiBpZiB0aGUgY3VycmVudCBMaW5lSW5mbyBoYXMgbm8gKGxvZ2ljYWwpIHByZWRlY2Vzc29yLgorICAgICAgICAgICAgICogPHR0PkxpbmVJbmZvPC90dD4gd2lsbCBwcmludCB0aGlzIGZpbGUgbnVtYmVyIG5vIG1hdHRlciB3aGF0LgorICAgICAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldExpbmVGaWxlSUQoaW50IGxpbmVGaWxlSUQpIHsKKyAgICAgICAgICAgIGlmIChsaW5lRmlsZUlEIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCIiICsgbGluZUZpbGVJRCk7CisgICAgICAgICAgICB0aGlzLmxpbmVGaWxlSUQgPSBsaW5lRmlsZUlEOworICAgICAgICAgICAgdGhpcy5saW5lRmlsZUlEU2V0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBTZXRzIElucHV0TGluZUNvdW50LiAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dExpbmVDb3VudChpbnQgaW5wdXRMaW5lQ291bnQpIHsKKyAgICAgICAgICAgIGlmIChpbnB1dExpbmVDb3VudCA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiIiArIGlucHV0TGluZUNvdW50KTsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRMaW5lQ291bnQgPSBpbnB1dExpbmVDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBTZXRzIE91dHB1dExpbmVJbmNyZW1lbnQuICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dExpbmVJbmNyZW1lbnQoaW50IG91dHB1dExpbmVJbmNyZW1lbnQpIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXRMaW5lSW5jcmVtZW50IDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCIiICsgb3V0cHV0TGluZUluY3JlbWVudCk7CisgICAgICAgICAgICB0aGlzLm91dHB1dExpbmVJbmNyZW1lbnQgPSBvdXRwdXRMaW5lSW5jcmVtZW50OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBMaW5lSW5mbyBhcyBhIFN0cmluZywgcHJpbnQgYWxsIHZhbHVlcworICAgICAgICAgKiBvbmx5IHdoZW4gYXBwcm9wcmlhdGUgKGJ1dCBMaW5lSW5mb0lEIGlmIGFuZCBvbmx5IGlmIGl0J3MgYmVlbgorICAgICAgICAgKiBzcGVjaWZpZWQsIGFzIGl0cyBuZWNlc3NpdHkgaXMgc2Vuc2l0aXZlIHRvIGNvbnRleHQpLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7CisgICAgICAgICAgICBpZiAoaW5wdXRTdGFydExpbmUgPT0gLTEgfHwgb3V0cHV0U3RhcnRMaW5lID09IC0xKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBvdXQuYXBwZW5kKGlucHV0U3RhcnRMaW5lKTsKKyAgICAgICAgICAgIGlmIChsaW5lRmlsZUlEU2V0KQorICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIiMiICsgbGluZUZpbGVJRCk7CisgICAgICAgICAgICBpZiAoaW5wdXRMaW5lQ291bnQgIT0gMSkKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCIsIiArIGlucHV0TGluZUNvdW50KTsKKyAgICAgICAgICAgIG91dC5hcHBlbmQoIjoiICsgb3V0cHV0U3RhcnRMaW5lKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRMaW5lSW5jcmVtZW50ICE9IDEpCisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiLCIgKyBvdXRwdXRMaW5lSW5jcmVtZW50KTsKKyAgICAgICAgICAgIG91dC5hcHBlbmQoJ1xuJyk7CisgICAgICAgICAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFN0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBQcml2YXRlIHN0YXRlCisKKyAgICBwcml2YXRlIFN0cmluZyBzdHJhdHVtTmFtZTsKKyAgICBwcml2YXRlIExpc3QgZmlsZU5hbWVMaXN0OworICAgIHByaXZhdGUgTGlzdCBmaWxlUGF0aExpc3Q7CisgICAgcHJpdmF0ZSBMaXN0IGxpbmVEYXRhOworICAgIHByaXZhdGUgaW50IGxhc3RGaWxlSUQ7CisKKyAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8vIENvbnN0cnVjdG9yCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFNtYXBTdHJhdHVtIG9iamVjdCBmb3IgdGhlIGdpdmVuIHN0cmF0dW0gbmFtZQorICAgICAqIChlLmcuLCBKU1ApLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmF0dW1OYW1lIHRoZSBuYW1lIG9mIHRoZSBzdHJhdHVtIChlLmcuLCBKU1ApCisgICAgICovCisgICAgcHVibGljIFNtYXBTdHJhdHVtKFN0cmluZyBzdHJhdHVtTmFtZSkgeworICAgICAgICB0aGlzLnN0cmF0dW1OYW1lID0gc3RyYXR1bU5hbWU7CisgICAgICAgIGZpbGVOYW1lTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZmlsZVBhdGhMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBsaW5lRGF0YSA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgbGFzdEZpbGVJRCA9IDA7CisgICAgfQorCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBNZXRob2RzIHRvIGFkZCBtYXBwaW5nIGluZm9ybWF0aW9uCisKKyAgICAvKioKKyAgICAgKiBBZGRzIHJlY29yZCBvZiBhIG5ldyBmaWxlLCBieSBmaWxlbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUgdG8gYWRkLCB1bnF1YWxpZmllZCBieSBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGUoU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgIGFkZEZpbGUoZmlsZW5hbWUsIGZpbGVuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHJlY29yZCBvZiBhIG5ldyBmaWxlLCBieSBmaWxlbmFtZSBhbmQgcGF0aC4gIFRoZSBwYXRoCisgICAgICogbWF5IGJlIHJlbGF0aXZlIHRvIGEgc291cmNlIGNvbXBpbGF0aW9uIHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lIHRvIGFkZCwgdW5xdWFsaWZpZWQgYnkgcGF0aAorICAgICAqIEBwYXJhbSBmaWxlUGF0aCB0aGUgcGF0aCBmb3IgdGhlIGZpbGVuYW1lLCBwb3RlbnRpYWxseSByZWxhdGl2ZQorICAgICAqICAgICAgICAgICAgICAgICB0byBhIHNvdXJjZSBjb21waWxhdGlvbiBwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBmaWxlUGF0aCkgeworICAgICAgICBpbnQgcGF0aEluZGV4ID0gZmlsZVBhdGhMaXN0LmluZGV4T2YoZmlsZVBhdGgpOworICAgICAgICBpZiAocGF0aEluZGV4ID09IC0xKSB7CisgICAgICAgICAgICBmaWxlTmFtZUxpc3QuYWRkKGZpbGVuYW1lKTsKKyAgICAgICAgICAgIGZpbGVQYXRoTGlzdC5hZGQoZmlsZVBhdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tYmluZXMgY29uc2VjdXRpdmUgTGluZUluZm9zIHdoZXJldmVyIHBvc3NpYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgb3B0aW1pemVMaW5lU2VjdGlvbigpIHsKKworLyogU29tZSBkZWJ1Z2dpbmcgY29kZQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmVEYXRhLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBMaW5lSW5mbyBsaSA9IChMaW5lSW5mbylsaW5lRGF0YS5nZXQoaSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGxpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisqLworICAgICAgICAvL0luY29ycG9yYXRlIGVhY2ggTGluZUluZm8gaW50byB0aGUgcHJldmlvdXMgTGluZUluZm8ncyAKKyAgICAgICAgLy9vdXRwdXRMaW5lSW5jcmVtZW50LCBpZiBwb3NzaWJsZQorICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIHdoaWxlIChpIDwgbGluZURhdGEuc2l6ZSgpIC0gMSkgeworICAgICAgICAgICAgTGluZUluZm8gbGkgPSAoTGluZUluZm8pbGluZURhdGEuZ2V0KGkpOworICAgICAgICAgICAgTGluZUluZm8gbGlOZXh0ID0gKExpbmVJbmZvKWxpbmVEYXRhLmdldChpICsgMSk7CisgICAgICAgICAgICBpZiAoIWxpTmV4dC5saW5lRmlsZUlEU2V0CisgICAgICAgICAgICAgICAgJiYgbGlOZXh0LmlucHV0U3RhcnRMaW5lID09IGxpLmlucHV0U3RhcnRMaW5lCisgICAgICAgICAgICAgICAgJiYgbGlOZXh0LmlucHV0TGluZUNvdW50ID09IDEKKyAgICAgICAgICAgICAgICAmJiBsaS5pbnB1dExpbmVDb3VudCA9PSAxCisgICAgICAgICAgICAgICAgJiYgbGlOZXh0Lm91dHB1dFN0YXJ0TGluZQorICAgICAgICAgICAgICAgICAgICA9PSBsaS5vdXRwdXRTdGFydExpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbGkuaW5wdXRMaW5lQ291bnQgKiBsaS5vdXRwdXRMaW5lSW5jcmVtZW50KSB7CisgICAgICAgICAgICAgICAgbGkuc2V0T3V0cHV0TGluZUluY3JlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgbGlOZXh0Lm91dHB1dFN0YXJ0TGluZQorICAgICAgICAgICAgICAgICAgICAgICAgLSBsaS5vdXRwdXRTdGFydExpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbGlOZXh0Lm91dHB1dExpbmVJbmNyZW1lbnQpOworICAgICAgICAgICAgICAgIGxpbmVEYXRhLnJlbW92ZShpICsgMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vSW5jb3Jwb3JhdGUgZWFjaCBMaW5lSW5mbyBpbnRvIHRoZSBwcmV2aW91cyBMaW5lSW5mbydzCisgICAgICAgIC8vaW5wdXRMaW5lQ291bnQsIGlmIHBvc3NpYmxlCisgICAgICAgIGkgPSAwOworICAgICAgICB3aGlsZSAoaSA8IGxpbmVEYXRhLnNpemUoKSAtIDEpIHsKKyAgICAgICAgICAgIExpbmVJbmZvIGxpID0gKExpbmVJbmZvKWxpbmVEYXRhLmdldChpKTsKKyAgICAgICAgICAgIExpbmVJbmZvIGxpTmV4dCA9IChMaW5lSW5mbylsaW5lRGF0YS5nZXQoaSArIDEpOworICAgICAgICAgICAgaWYgKCFsaU5leHQubGluZUZpbGVJRFNldAorICAgICAgICAgICAgICAgICYmIGxpTmV4dC5pbnB1dFN0YXJ0TGluZSA9PSBsaS5pbnB1dFN0YXJ0TGluZSArIGxpLmlucHV0TGluZUNvdW50CisgICAgICAgICAgICAgICAgJiYgbGlOZXh0Lm91dHB1dExpbmVJbmNyZW1lbnQgPT0gbGkub3V0cHV0TGluZUluY3JlbWVudAorICAgICAgICAgICAgICAgICYmIGxpTmV4dC5vdXRwdXRTdGFydExpbmUKKyAgICAgICAgICAgICAgICAgICAgPT0gbGkub3V0cHV0U3RhcnRMaW5lCisgICAgICAgICAgICAgICAgICAgICAgICArIGxpLmlucHV0TGluZUNvdW50ICogbGkub3V0cHV0TGluZUluY3JlbWVudCkgeworICAgICAgICAgICAgICAgIGxpLnNldElucHV0TGluZUNvdW50KGxpLmlucHV0TGluZUNvdW50ICsgbGlOZXh0LmlucHV0TGluZUNvdW50KTsKKyAgICAgICAgICAgICAgICBsaW5lRGF0YS5yZW1vdmUoaSArIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGNvbXBsZXRlIGluZm9ybWF0aW9uIGFib3V0IGEgc2ltcGxlIGxpbmUgbWFwcGluZy4gIFNwZWNpZnkKKyAgICAgKiBhbGwgdGhlIGZpZWxkcyBpbiB0aGlzIG1ldGhvZDsgdGhlIGJhY2stZW5kIG1hY2hpbmVyeSB0YWtlcyBjYXJlCisgICAgICogb2YgcHJpbnRpbmcgb25seSB0aG9zZSB0aGF0IGFyZSBuZWNlc3NhcnkgaW4gdGhlIGZpbmFsIFNNQVAuCisgICAgICogKE15IHZpZXcgaXMgdGhhdCBmaWVsZHMgYXJlIG9wdGlvbmFsIHByaW1hcmlseSBmb3Igc3BhdGlhbCBlZmZpY2llbmN5LAorICAgICAqIG5vdCBmb3IgcHJvZ3JhbW1lciBjb252ZW5pZW5jZS4gIENvdWxkIGFsd2F5cyBhZGQgdXRpbGl0eSBtZXRob2RzCisgICAgICogbGF0ZXIuKQorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0U3RhcnRMaW5lIHN0YXJ0aW5nIGxpbmUgaW4gdGhlIHNvdXJjZSBmaWxlCisgICAgICogICAgICAgIChTTUFQIDx0dD5JbnB1dFN0YXJ0TGluZTwvdHQ+KQorICAgICAqIEBwYXJhbSBpbnB1dEZpbGVOYW1lIHRoZSBmaWxlcGF0aCAob3IgbmFtZSkgZnJvbSB3aGljaCB0aGUgaW5wdXQgY29tZXMKKyAgICAgKiAgICAgICAgKHlpZWxkcyBTTUFQIDx0dD5MaW5lRmlsZUlEPC90dD4pICBVc2UgdW5xdWFsaWZpZWQgbmFtZXMKKyAgICAgKiAgICAgICAgY2FyZWZ1bGx5LCBhbmQgb25seSB3aGVuIHRoZXkgdW5pcXVlbHkgaWRlbnRpZnkgYSBmaWxlLgorICAgICAqIEBwYXJhbSBpbnB1dExpbmVDb3VudCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBpbnB1dCB0byBtYXAKKyAgICAgKiAgICAgICAgKFNNQVAgPHR0PkxpbmVGaWxlQ291bnQ8L3R0PikKKyAgICAgKiBAcGFyYW0gb3V0cHV0U3RhcnRMaW5lIHN0YXJ0aW5nIGxpbmUgaW4gdGhlIG91dHB1dCBmaWxlIAorICAgICAqICAgICAgICAoU01BUCA8dHQ+T3V0cHV0U3RhcnRMaW5lPC90dD4pCisgICAgICogQHBhcmFtIG91dHB1dExpbmVJbmNyZW1lbnQgbnVtYmVyIG9mIG91dHB1dCBsaW5lcyB0byBtYXAgdG8gZWFjaAorICAgICAqICAgICAgICBpbnB1dCBsaW5lIChTTUFQIDx0dD5PdXRwdXRMaW5lSW5jcmVtZW50PC90dD4pLiAgPGk+R2l2ZW4gdGhlCisgICAgICogICAgICAgIGZhY3QgdGhhdCB0aGUgbmFtZSBzdGFydHMgd2l0aCAib3V0cHV0IiwgSSBjb250aW51b3VzbHkgaGF2ZQorICAgICAqICAgICAgICB0aGUgc3ViY29uc2Npb3VzIHVyZ2UgdG8gY2FsbCB0aGlzIGZpZWxkCisgICAgICogICAgICAgIDx0dD5PdXRwdXRMaW5lRXhjcmVtZW50PC90dD4uPC9pPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpbmVEYXRhKAorICAgICAgICBpbnQgaW5wdXRTdGFydExpbmUsCisgICAgICAgIFN0cmluZyBpbnB1dEZpbGVOYW1lLAorICAgICAgICBpbnQgaW5wdXRMaW5lQ291bnQsCisgICAgICAgIGludCBvdXRwdXRTdGFydExpbmUsCisgICAgICAgIGludCBvdXRwdXRMaW5lSW5jcmVtZW50KSB7CisgICAgICAgIC8vIGNoZWNrIHRoZSBpbnB1dCAtIHdoYXQgYXJlIHlvdSBkb2luZyBoZXJlPz8KKyAgICAgICAgaW50IGZpbGVJbmRleCA9IGZpbGVQYXRoTGlzdC5pbmRleE9mKGlucHV0RmlsZU5hbWUpOworICAgICAgICBpZiAoZmlsZUluZGV4ID09IC0xKSAvLyBzdGlsbAorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiaW5wdXRGaWxlTmFtZTogIiArIGlucHV0RmlsZU5hbWUpOworCisgICAgICAgIC8vSmFzcGVyIGluY29ycmVjdGx5IFNNQVBzIGNlcnRhaW4gTm9kZXMsIGdpdmluZyB0aGVtIGFuIAorICAgICAgICAvL291dHB1dFN0YXJ0TGluZSBvZiAwLiAgVGhpcyBjYW4gY2F1c2UgYSBmYXRhbCBlcnJvciBpbgorICAgICAgICAvL29wdGltaXplTGluZVNlY3Rpb24sIG1ha2luZyBpdCBpbXBvc3NpYmxlIGZvciBKYXNwZXIgdG8KKyAgICAgICAgLy9jb21waWxlIHRoZSBKU1AuICBVbnRpbCB3ZSBjYW4gZml4IHRoZSB1bmRlcmx5aW5nCisgICAgICAgIC8vU01BUHBpbmcgcHJvYmxlbSwgd2Ugc2ltcGx5IGlnbm9yZSB0aGUgZmxhd2VkIFNNQVAgZW50cmllcy4KKyAgICAgICAgaWYgKG91dHB1dFN0YXJ0TGluZSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIGJ1aWxkIHRoZSBMaW5lSW5mbworICAgICAgICBMaW5lSW5mbyBsaSA9IG5ldyBMaW5lSW5mbygpOworICAgICAgICBsaS5zZXRJbnB1dFN0YXJ0TGluZShpbnB1dFN0YXJ0TGluZSk7CisgICAgICAgIGxpLnNldElucHV0TGluZUNvdW50KGlucHV0TGluZUNvdW50KTsKKyAgICAgICAgbGkuc2V0T3V0cHV0U3RhcnRMaW5lKG91dHB1dFN0YXJ0TGluZSk7CisgICAgICAgIGxpLnNldE91dHB1dExpbmVJbmNyZW1lbnQob3V0cHV0TGluZUluY3JlbWVudCk7CisgICAgICAgIGlmIChmaWxlSW5kZXggIT0gbGFzdEZpbGVJRCkKKyAgICAgICAgICAgIGxpLnNldExpbmVGaWxlSUQoZmlsZUluZGV4KTsKKyAgICAgICAgbGFzdEZpbGVJRCA9IGZpbGVJbmRleDsKKworICAgICAgICAvLyBzYXZlIGl0CisgICAgICAgIGxpbmVEYXRhLmFkZChsaSk7CisgICAgfQorCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBNZXRob2RzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzdHJhdHVtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyYXR1bU5hbWUoKSB7CisgICAgICAgIHJldHVybiBzdHJhdHVtTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdHJhdHVtIGFzIGEgU3RyaW5nOiAgYSBTdHJhdHVtU2VjdGlvbiwKKyAgICAgKiBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgRmlsZVNlY3Rpb24gYW5kIGF0IGxlYXN0IG9uZSBMaW5lU2VjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKKyAgICAgICAgLy8gY2hlY2sgc3RhdGUgYW5kIGluaXRpYWxpemUgYnVmZmVyCisgICAgICAgIGlmIChmaWxlTmFtZUxpc3Quc2l6ZSgpID09IDAgfHwgbGluZURhdGEuc2l6ZSgpID09IDApCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIC8vIHByaW50IFN0cmF0dW1TZWN0aW9uCisgICAgICAgIG91dC5hcHBlbmQoIipTICIgKyBzdHJhdHVtTmFtZSArICJcbiIpOworCisgICAgICAgIC8vIHByaW50IEZpbGVTZWN0aW9uCisgICAgICAgIG91dC5hcHBlbmQoIipGXG4iKTsKKyAgICAgICAgaW50IGJvdW5kID0gZmlsZU5hbWVMaXN0LnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib3VuZDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZmlsZVBhdGhMaXN0LmdldChpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiKyAiICsgaSArICIgIiArIGZpbGVOYW1lTGlzdC5nZXQoaSkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAvLyBTb3VyY2UgcGF0aHMgbXVzdCBiZSByZWxhdGl2ZSwgbm90IGFic29sdXRlLCBzbyB3ZQorICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgbGVhZGluZyAiLyIsIGlmIG9uZSBleGlzdHMuCisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gKFN0cmluZylmaWxlUGF0aExpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmaWxlUGF0aC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGggPSBmaWxlUGF0aC5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoZmlsZVBhdGggKyAiXG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChpICsgIiAiICsgZmlsZU5hbWVMaXN0LmdldChpKSArICJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcHJpbnQgTGluZVNlY3Rpb24KKyAgICAgICAgb3V0LmFwcGVuZCgiKkxcbiIpOworICAgICAgICBib3VuZCA9IGxpbmVEYXRhLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib3VuZDsgaSsrKSB7CisgICAgICAgICAgICBMaW5lSW5mbyBsaSA9IChMaW5lSW5mbylsaW5lRGF0YS5nZXQoaSk7CisgICAgICAgICAgICBvdXQuYXBwZW5kKGxpLmdldFN0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBvdXQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1NtYXBVdGlsLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1NtYXBVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4ZDZiOQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvU21hcFV0aWwuamF2YQpAQCAtMCwwICsxLDcyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSnNwQ29tcGlsYXRpb25Db250ZXh0OworCisvKioKKyAqIENvbnRhaW5zIHN0YXRpYyB1dGlsaXRpZXMgZm9yIGdlbmVyYXRpbmcgU01BUCBkYXRhIGJhc2VkIG9uIHRoZQorICogY3VycmVudCB2ZXJzaW9uIG9mIEphc3Blci4KKyAqIAorICogQGF1dGhvciBKYXlzb24gRmFsa25lcgorICogQGF1dGhvciBTaGF3biBCYXllcm4KKyAqIEBhdXRob3IgUm9iZXJ0IEZpZWxkIChpbm5lciBTREVJbnN0YWxsZXIgY2xhc3MpCisgKiBAYXV0aG9yIE1hcmsgUm90aAorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKi8KK3B1YmxpYyBjbGFzcyBTbWFwVXRpbCB7CisKKyAgICBwcml2YXRlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2c9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBTbWFwVXRpbC5jbGFzcyApOworCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBDb25zdGFudHMKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNNQVBfRU5DT0RJTkcgPSAiVVRGLTgiOworCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBQdWJsaWMgZW50cnkgcG9pbnRzCisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYW4gYXBwcm9wcmlhdGUgU01BUCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24KKyAgICAgKiBjb250ZXh0LiAgKEpTUi0wNDUuKQorICAgICAqCisgICAgICogQHBhcmFtIGN0eHQgQ3VycmVudCBjb21waWxhdGlvbiBjb250ZXh0CisgICAgICogQHBhcmFtIHBhZ2VOb2RlcyBUaGUgY3VycmVudCBKU1AgcGFnZQorICAgICAqIEByZXR1cm4gYSBTTUFQIGZvciB0aGUgcGFnZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2VuZXJhdGVTbWFwKAorICAgICAgICBKc3BDb21waWxhdGlvbkNvbnRleHQgY3R4dCwKKyAgICAgICAgTm9kZS5Ob2RlcyBwYWdlTm9kZXMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gU2NhbiB0aGUgbm9kZXMgZm9yIHByZXNlbmNlIG9mIEphc3BlciBnZW5lcmF0ZWQgaW5uZXIgY2xhc3NlcworICAgICAgICBQcmVTY2FuVmlzaXRvciBwc1Zpc2l0b3IgPSBuZXcgUHJlU2NhblZpc2l0b3IoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhZ2VOb2Rlcy52aXNpdChwc1Zpc2l0b3IpOworICAgICAgICB9IGNhdGNoIChKYXNwZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgfQorICAgICAgICBIYXNoTWFwIG1hcCA9IHBzVmlzaXRvci5nZXRNYXAoKTsKKworICAgICAgICAvLyBzZXQgdXAgb3VyIFNNQVAgZ2VuZXJhdG9yCisgICAgICAgIFNtYXBHZW5lcmF0b3IgZyA9IG5ldyBTbWFwR2VuZXJhdG9yKCk7CisgICAgICAgIAorICAgICAgICAvKiogRGlzYWJsZSByZWFkaW5nIG9mIGlucHV0IFNNQVAgYmVjYXVzZToKKyAgICAgICAgICAgIDEuIFRoZXJlIGlzIGEgYnVnIGhlcmU6IGdldFJlYWxQYXRoKCkgaXMgbnVsbCBpZiAuanNwIGlzIGluIGEgamFyCisgICAgICAgIAlCdWd6aWxsYSAxNDY2MC4KKyAgICAgICAgICAgIDIuIE1hcHBpbmdzIGZyb20gb3RoZXIgc291cmNlcyBpbnRvIC5qc3AgZmlsZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgICAgICBUT0RPOiBmaXggMS4gaWYgMi4gaXMgbm90IHRydWUuCisgICAgICAgIC8vIGRldGVybWluZSBpZiB3ZSBoYXZlIGFuIGlucHV0IFNNQVAKKyAgICAgICAgU3RyaW5nIHNtYXBQYXRoID0gaW5wdXRTbWFwUGF0aChjdHh0LmdldFJlYWxQYXRoKGN0eHQuZ2V0SnNwRmlsZSgpKSk7CisgICAgICAgICAgICBGaWxlIGlucHV0U21hcCA9IG5ldyBGaWxlKHNtYXBQYXRoKTsKKyAgICAgICAgICAgIGlmIChpbnB1dFNtYXAuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBieXRlW10gZW1iZWRkZWRTbWFwID0gbnVsbDsKKyAgICAgICAgICAgIGJ5dGVbXSBzdWJTbWFwID0gU0RFSW5zdGFsbGVyLnJlYWRXaG9sZShpbnB1dFNtYXApOworICAgICAgICAgICAgU3RyaW5nIHN1YlNtYXBTdHJpbmcgPSBuZXcgU3RyaW5nKHN1YlNtYXAsIFNNQVBfRU5DT0RJTkcpOworICAgICAgICAgICAgZy5hZGRTbWFwKHN1YlNtYXBTdHJpbmcsICJKU1AiKTsKKyAgICAgICAgfQorICAgICAgICAqKi8KKworICAgICAgICAvLyBub3csIGFzc2VtYmxlIGluZm8gYWJvdXQgb3VyIG93biBzdHJhdHVtIChKU1ApIHVzaW5nIEpzcExpbmVNYXAKKyAgICAgICAgU21hcFN0cmF0dW0gcyA9IG5ldyBTbWFwU3RyYXR1bSgiSlNQIik7CisKKyAgICAgICAgZy5zZXRPdXRwdXRGaWxlTmFtZSh1bnF1YWxpZnkoY3R4dC5nZXRTZXJ2bGV0SmF2YUZpbGVOYW1lKCkpKTsKKworICAgICAgICAvLyBNYXAgb3V0IE5vZGUuTm9kZXMKKyAgICAgICAgZXZhbHVhdGVOb2RlcyhwYWdlTm9kZXMsIHMsIG1hcCwgY3R4dC5nZXRPcHRpb25zKCkuZ2V0TWFwcGVkRmlsZSgpKTsKKyAgICAgICAgcy5vcHRpbWl6ZUxpbmVTZWN0aW9uKCk7CisgICAgICAgIGcuYWRkU3RyYXR1bShzLCB0cnVlKTsKKworICAgICAgICBpZiAoY3R4dC5nZXRPcHRpb25zKCkuaXNTbWFwRHVtcGVkKCkpIHsKKyAgICAgICAgICAgIEZpbGUgb3V0U21hcCA9IG5ldyBGaWxlKGN0eHQuZ2V0Q2xhc3NGaWxlTmFtZSgpICsgIi5zbWFwIik7CisgICAgICAgICAgICBQcmludFdyaXRlciBzbyA9CisgICAgICAgICAgICAgICAgbmV3IFByaW50V3JpdGVyKAorICAgICAgICAgICAgICAgICAgICBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0U21hcCksCisgICAgICAgICAgICAgICAgICAgICAgICBTTUFQX0VOQ09ESU5HKSk7CisgICAgICAgICAgICBzby5wcmludChnLmdldFN0cmluZygpKTsKKyAgICAgICAgICAgIHNvLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgY2xhc3NGaWxlTmFtZSA9IGN0eHQuZ2V0Q2xhc3NGaWxlTmFtZSgpOworICAgICAgICBpbnQgaW5uZXJDbGFzc0NvdW50ID0gbWFwLnNpemUoKTsKKyAgICAgICAgU3RyaW5nIFtdIHNtYXBJbmZvID0gbmV3IFN0cmluZ1syICsgaW5uZXJDbGFzc0NvdW50KjJdOworICAgICAgICBzbWFwSW5mb1swXSA9IGNsYXNzRmlsZU5hbWU7CisgICAgICAgIHNtYXBJbmZvWzFdID0gZy5nZXRTdHJpbmcoKTsKKworICAgICAgICBpbnQgY291bnQgPSAyOworICAgICAgICBJdGVyYXRvciBpdGVyID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyBpbm5lckNsYXNzID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBzID0gKFNtYXBTdHJhdHVtKSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgcy5vcHRpbWl6ZUxpbmVTZWN0aW9uKCk7CisgICAgICAgICAgICBnID0gbmV3IFNtYXBHZW5lcmF0b3IoKTsKKyAgICAgICAgICAgIGcuc2V0T3V0cHV0RmlsZU5hbWUodW5xdWFsaWZ5KGN0eHQuZ2V0U2VydmxldEphdmFGaWxlTmFtZSgpKSk7CisgICAgICAgICAgICBnLmFkZFN0cmF0dW0ocywgdHJ1ZSk7CisKKyAgICAgICAgICAgIFN0cmluZyBpbm5lckNsYXNzRmlsZU5hbWUgPQorICAgICAgICAgICAgICAgIGNsYXNzRmlsZU5hbWUuc3Vic3RyaW5nKDAsIGNsYXNzRmlsZU5hbWUuaW5kZXhPZigiLmNsYXNzIikpICsKKyAgICAgICAgICAgICAgICAnJCcgKyBpbm5lckNsYXNzICsgIi5jbGFzcyI7CisgICAgICAgICAgICBpZiAoY3R4dC5nZXRPcHRpb25zKCkuaXNTbWFwRHVtcGVkKCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlIG91dFNtYXAgPSBuZXcgRmlsZShpbm5lckNsYXNzRmlsZU5hbWUgKyAiLnNtYXAiKTsKKyAgICAgICAgICAgICAgICBQcmludFdyaXRlciBzbyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBQcmludFdyaXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0U21hcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUF9FTkNPRElORykpOworICAgICAgICAgICAgICAgIHNvLnByaW50KGcuZ2V0U3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHNvLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbWFwSW5mb1tjb3VudF0gPSBpbm5lckNsYXNzRmlsZU5hbWU7CisgICAgICAgICAgICBzbWFwSW5mb1tjb3VudCsxXSA9IGcuZ2V0U3RyaW5nKCk7CisgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNtYXBJbmZvOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnN0YWxsU21hcChTdHJpbmdbXSBzbWFwKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoc21hcCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNtYXAubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIEZpbGUgb3V0U2VydmxldCA9IG5ldyBGaWxlKHNtYXBbaV0pOworICAgICAgICAgICAgU0RFSW5zdGFsbGVyLmluc3RhbGwob3V0U2VydmxldCwgc21hcFtpKzFdLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBQcml2YXRlIHV0aWxpdGllcworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiB1bnF1YWxpZmllZCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBmaWxlIHBhdGguCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVucXVhbGlmeShTdHJpbmcgcGF0aCkgeworICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7CisgICAgICAgIHJldHVybiBwYXRoLnN1YnN0cmluZyhwYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZmlsZSBwYXRoIGNvcnJlc3BvbmRpbmcgdG8gYSBwb3RlbnRpYWwgU01BUCBpbnB1dAorICAgICAqIGZvciB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gaW5wdXQgKEpTUCBmaWxlKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgaW5wdXRTbWFwUGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICByZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sYXN0SW5kZXhPZignLicpICsgMSkgKyAic21hcCI7CisgICAgfQorCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBJbnN0YWxsYXRpb24gbG9naWMgKGZyb20gUm9iZXJ0IEZpZWxkLCBKU1ItMDQ1IHNwZWMgbGVhZCkKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTREVJbnN0YWxsZXIgeworCisgICAgICAgIHByaXZhdGUgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBTREVJbnN0YWxsZXIuY2xhc3MgKTsKKworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWVTREUgPSAiU291cmNlRGVidWdFeHRlbnNpb24iOworCisgICAgICAgIGJ5dGVbXSBvcmlnOworICAgICAgICBieXRlW10gc2RlQXR0cjsKKyAgICAgICAgYnl0ZVtdIGdlbjsKKworICAgICAgICBpbnQgb3JpZ1BvcyA9IDA7CisgICAgICAgIGludCBnZW5Qb3MgPSAwOworCisgICAgICAgIGludCBzZGVJbmRleDsKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpIHsKKyAgICAgICAgICAgICAgICBpbnN0YWxsKG5ldyBGaWxlKGFyZ3NbMF0pLCBuZXcgRmlsZShhcmdzWzFdKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDMpIHsKKyAgICAgICAgICAgICAgICBpbnN0YWxsKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShhcmdzWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoYXJnc1sxXSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGFyZ3NbMl0pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICAiVXNhZ2U6IDxjb21tYW5kPiA8aW5wdXQgY2xhc3MgZmlsZT4gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGF0dHJpYnV0ZSBmaWxlPiA8b3V0cHV0IGNsYXNzIGZpbGUgbmFtZT5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjxjb21tYW5kPiA8aW5wdXQvb3V0cHV0IGNsYXNzIGZpbGU+IDxhdHRyaWJ1dGUgZmlsZT4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2b2lkIGluc3RhbGwoRmlsZSBpbkNsYXNzRmlsZSwgRmlsZSBhdHRyRmlsZSwgRmlsZSBvdXRDbGFzc0ZpbGUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgbmV3IFNERUluc3RhbGxlcihpbkNsYXNzRmlsZSwgYXR0ckZpbGUsIG91dENsYXNzRmlsZSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgdm9pZCBpbnN0YWxsKEZpbGUgaW5PdXRDbGFzc0ZpbGUsIEZpbGUgYXR0ckZpbGUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgRmlsZSB0bXBGaWxlID0gbmV3IEZpbGUoaW5PdXRDbGFzc0ZpbGUuZ2V0UGF0aCgpICsgInRtcCIpOworICAgICAgICAgICAgbmV3IFNERUluc3RhbGxlcihpbk91dENsYXNzRmlsZSwgYXR0ckZpbGUsIHRtcEZpbGUpOworICAgICAgICAgICAgaWYgKCFpbk91dENsYXNzRmlsZS5kZWxldGUoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiaW5PdXRDbGFzc0ZpbGUuZGVsZXRlKCkgZmFpbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXRtcEZpbGUucmVuYW1lVG8oaW5PdXRDbGFzc0ZpbGUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ0bXBGaWxlLnJlbmFtZVRvKGluT3V0Q2xhc3NGaWxlKSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2b2lkIGluc3RhbGwoRmlsZSBjbGFzc0ZpbGUsIGJ5dGVbXSBzbWFwKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgRmlsZSB0bXBGaWxlID0gbmV3IEZpbGUoY2xhc3NGaWxlLmdldFBhdGgoKSArICJ0bXAiKTsKKyAgICAgICAgICAgIG5ldyBTREVJbnN0YWxsZXIoY2xhc3NGaWxlLCBzbWFwLCB0bXBGaWxlKTsKKyAgICAgICAgICAgIGlmICghY2xhc3NGaWxlLmRlbGV0ZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJjbGFzc0ZpbGUuZGVsZXRlKCkgZmFpbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXRtcEZpbGUucmVuYW1lVG8oY2xhc3NGaWxlKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigidG1wRmlsZS5yZW5hbWVUbyhjbGFzc0ZpbGUpIGZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU0RFSW5zdGFsbGVyKEZpbGUgaW5DbGFzc0ZpbGUsIGJ5dGVbXSBzZGVBdHRyLCBGaWxlIG91dENsYXNzRmlsZSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoIWluQ2xhc3NGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigibm8gc3VjaCBmaWxlOiAiICsgaW5DbGFzc0ZpbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnNkZUF0dHIgPSBzZGVBdHRyOworICAgICAgICAgICAgLy8gZ2V0IHRoZSBieXRlcworICAgICAgICAgICAgb3JpZyA9IHJlYWRXaG9sZShpbkNsYXNzRmlsZSk7CisgICAgICAgICAgICBnZW4gPSBuZXcgYnl0ZVtvcmlnLmxlbmd0aCArIHNkZUF0dHIubGVuZ3RoICsgMTAwXTsKKworICAgICAgICAgICAgLy8gZG8gaXQKKyAgICAgICAgICAgIGFkZFNERSgpOworCisgICAgICAgICAgICAvLyB3cml0ZSByZXN1bHQKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0Q2xhc3NGaWxlKTsKKyAgICAgICAgICAgIG91dFN0cmVhbS53cml0ZShnZW4sIDAsIGdlblBvcyk7CisgICAgICAgICAgICBvdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIFNERUluc3RhbGxlcihGaWxlIGluQ2xhc3NGaWxlLCBGaWxlIGF0dHJGaWxlLCBGaWxlIG91dENsYXNzRmlsZSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aGlzKGluQ2xhc3NGaWxlLCByZWFkV2hvbGUoYXR0ckZpbGUpLCBvdXRDbGFzc0ZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGJ5dGVbXSByZWFkV2hvbGUoRmlsZSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXQpOworICAgICAgICAgICAgaW50IGxlbiA9IChpbnQpaW5wdXQubGVuZ3RoKCk7CisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtsZW5dOworICAgICAgICAgICAgaWYgKGluU3RyZWFtLnJlYWQoYnl0ZXMsIDAsIGxlbikgIT0gbGVuKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJleHBlY3RlZCBzaXplOiAiICsgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluU3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gYnl0ZXM7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFkZFNERSgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGNvcHkoNCArIDIgKyAyKTsgLy8gbWFnaWMgbWluL21haiB2ZXJzaW9uCisgICAgICAgICAgICBpbnQgY29uc3RhbnRQb29sQ291bnRQb3MgPSBnZW5Qb3M7CisgICAgICAgICAgICBpbnQgY29uc3RhbnRQb29sQ291bnQgPSByZWFkVTIoKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoImNvbnN0YW50IHBvb2wgY291bnQ6ICIgKyBjb25zdGFudFBvb2xDb3VudCk7CisgICAgICAgICAgICB3cml0ZVUyKGNvbnN0YW50UG9vbENvdW50KTsKKworICAgICAgICAgICAgLy8gY29weSBvbGQgY29uc3RhbnQgcG9vbCByZXR1cm4gaW5kZXggb2YgU0RFIHN5bWJvbCwgaWYgZm91bmQKKyAgICAgICAgICAgIHNkZUluZGV4ID0gY29weUNvbnN0YW50UG9vbChjb25zdGFudFBvb2xDb3VudCk7CisgICAgICAgICAgICBpZiAoc2RlSW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgIlNvdXJjZURlYnVnRXh0ZW5zaW9uIiBzeW1ib2wgbm90IHRoZXJlIGFkZCBpdAorICAgICAgICAgICAgICAgIHdyaXRlVXRmOEZvclNERSgpOworCisgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IHRoZSBjb3VudGFudFBvb2xDb3VudAorICAgICAgICAgICAgICAgIHNkZUluZGV4ID0gY29uc3RhbnRQb29sQ291bnQ7CisgICAgICAgICAgICAgICAgKytjb25zdGFudFBvb2xDb3VudDsKKyAgICAgICAgICAgICAgICByYW5kb21BY2Nlc3NXcml0ZVUyKGNvbnN0YW50UG9vbENvdW50UG9zLCBjb25zdGFudFBvb2xDb3VudCk7CisKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU291cmNlRGVidWdFeHRlbnNpb24gbm90IGZvdW5kLCBpbnN0YWxsZWQgYXQ6ICIgKyBzZGVJbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTb3VyY2VEZWJ1Z0V4dGVuc2lvbiBmb3VuZCBhdDogIiArIHNkZUluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvcHkoMiArIDIgKyAyKTsgLy8gYWNjZXNzLCB0aGlzLCBzdXBlcgorICAgICAgICAgICAgaW50IGludGVyZmFjZUNvdW50ID0gcmVhZFUyKCk7CisgICAgICAgICAgICB3cml0ZVUyKGludGVyZmFjZUNvdW50KTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoImludGVyZmFjZUNvdW50OiAiICsgaW50ZXJmYWNlQ291bnQpOworICAgICAgICAgICAgY29weShpbnRlcmZhY2VDb3VudCAqIDIpOworICAgICAgICAgICAgY29weU1lbWJlcnMoKTsgLy8gZmllbGRzCisgICAgICAgICAgICBjb3B5TWVtYmVycygpOyAvLyBtZXRob2RzCisgICAgICAgICAgICBpbnQgYXR0ckNvdW50UG9zID0gZ2VuUG9zOworICAgICAgICAgICAgaW50IGF0dHJDb3VudCA9IHJlYWRVMigpOworICAgICAgICAgICAgd3JpdGVVMihhdHRyQ291bnQpOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiY2xhc3MgYXR0ckNvdW50OiAiICsgYXR0ckNvdW50KTsKKyAgICAgICAgICAgIC8vIGNvcHkgdGhlIGNsYXNzIGF0dHJpYnV0ZXMsIHJldHVybiB0cnVlIGlmIFNERSBhdHRyIGZvdW5kIChub3QgY29waWVkKQorICAgICAgICAgICAgaWYgKCFjb3B5QXR0cnMoYXR0ckNvdW50KSkgeworICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgYmUgYWRkaW5nIFNERSBhbmQgaXQgaXNuJ3QgYWxyZWFkeSBjb3VudGVkCisgICAgICAgICAgICAgICAgKythdHRyQ291bnQ7CisgICAgICAgICAgICAgICAgcmFuZG9tQWNjZXNzV3JpdGVVMihhdHRyQ291bnRQb3MsIGF0dHJDb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoImNsYXNzIGF0dHJDb3VudCBpbmNyZW1lbnRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVBdHRyRm9yU0RFKHNkZUluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY29weU1lbWJlcnMoKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSByZWFkVTIoKTsKKyAgICAgICAgICAgIHdyaXRlVTIoY291bnQpOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibWVtYmVycyBjb3VudDogIiArIGNvdW50KTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIGNvcHkoNik7IC8vIGFjY2VzcywgbmFtZSwgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgIGludCBhdHRyQ291bnQgPSByZWFkVTIoKTsKKyAgICAgICAgICAgICAgICB3cml0ZVUyKGF0dHJDb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm1lbWJlciBhdHRyIGNvdW50OiAiICsgYXR0ckNvdW50KTsKKyAgICAgICAgICAgICAgICBjb3B5QXR0cnMoYXR0ckNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gY29weUF0dHJzKGludCBhdHRyQ291bnQpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gc2RlRm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0ckNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmFtZUluZGV4ID0gcmVhZFUyKCk7CisgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgd3JpdGUgb2xkIFNERQorICAgICAgICAgICAgICAgIGlmIChuYW1lSW5kZXggPT0gc2RlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgc2RlRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNERSBhdHRyIGZvdW5kIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVVMihuYW1lSW5kZXgpOyAvLyBuYW1lCisgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSByZWFkVTQoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVVNChsZW4pOworICAgICAgICAgICAgICAgICAgICBjb3B5KGxlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiYXR0ciBsZW46ICIgKyBsZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzZGVGb3VuZDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVBdHRyRm9yU0RFKGludCBpbmRleCkgeworICAgICAgICAgICAgd3JpdGVVMihpbmRleCk7CisgICAgICAgICAgICB3cml0ZVU0KHNkZUF0dHIubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2RlQXR0ci5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIHdyaXRlVTEoc2RlQXR0cltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJhbmRvbUFjY2Vzc1dyaXRlVTIoaW50IHBvcywgaW50IHZhbCkgeworICAgICAgICAgICAgaW50IHNhdmVQb3MgPSBnZW5Qb3M7CisgICAgICAgICAgICBnZW5Qb3MgPSBwb3M7CisgICAgICAgICAgICB3cml0ZVUyKHZhbCk7CisgICAgICAgICAgICBnZW5Qb3MgPSBzYXZlUG9zOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJlYWRVMSgpIHsKKyAgICAgICAgICAgIHJldHVybiAoKGludClvcmlnW29yaWdQb3MrK10pICYgMHhGRjsKKyAgICAgICAgfQorCisgICAgICAgIGludCByZWFkVTIoKSB7CisgICAgICAgICAgICBpbnQgcmVzID0gcmVhZFUxKCk7CisgICAgICAgICAgICByZXR1cm4gKHJlcyA8PCA4KSArIHJlYWRVMSgpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJlYWRVNCgpIHsKKyAgICAgICAgICAgIGludCByZXMgPSByZWFkVTIoKTsKKyAgICAgICAgICAgIHJldHVybiAocmVzIDw8IDE2KSArIHJlYWRVMigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVUxKGludCB2YWwpIHsKKyAgICAgICAgICAgIGdlbltnZW5Qb3MrK10gPSAoYnl0ZSl2YWw7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlVTIoaW50IHZhbCkgeworICAgICAgICAgICAgd3JpdGVVMSh2YWwgPj4gOCk7CisgICAgICAgICAgICB3cml0ZVUxKHZhbCAmIDB4RkYpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVU0KGludCB2YWwpIHsKKyAgICAgICAgICAgIHdyaXRlVTIodmFsID4+IDE2KTsKKyAgICAgICAgICAgIHdyaXRlVTIodmFsICYgMHhGRkZGKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY29weShpbnQgY291bnQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIGdlbltnZW5Qb3MrK10gPSBvcmlnW29yaWdQb3MrK107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gcmVhZEJ5dGVzKGludCBjb3VudCkgeworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbY291bnRdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgYnl0ZXNbaV0gPSBvcmlnW29yaWdQb3MrK107CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnl0ZXM7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlQnl0ZXMoYnl0ZVtdIGJ5dGVzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgZ2VuW2dlblBvcysrXSA9IGJ5dGVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IGNvcHlDb25zdGFudFBvb2woaW50IGNvbnN0YW50UG9vbENvdW50KQorICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCBzZGVJbmRleCA9IC0xOworICAgICAgICAgICAgLy8gY29weSBjb25zdCBwb29sIGluZGV4IHplcm8gbm90IGluIGNsYXNzIGZpbGUKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY29uc3RhbnRQb29sQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIGludCB0YWcgPSByZWFkVTEoKTsKKyAgICAgICAgICAgICAgICB3cml0ZVUxKHRhZyk7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA3IDogLy8gQ2xhc3MKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA4IDogLy8gU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGkgKyAiIGNvcHlpbmcgMiBieXRlcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDkgOiAvLyBGaWVsZAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEwIDogLy8gTWV0aG9kCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTEgOiAvLyBJbnRlcmZhY2VNZXRob2QKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzIDogLy8gSW50ZWdlcgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQgOiAvLyBGbG9hdAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEyIDogLy8gTmFtZUFuZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoaSArICIgY29weWluZyA0IGJ5dGVzIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5KDQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNSA6IC8vIExvbmcKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2IDogLy8gRG91YmxlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGkgKyAiIGNvcHlpbmcgOCBieXRlcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiAvLyBVdGY4CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gcmVhZFUyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVUyKGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gdXRmOCA9IHJlYWRCeXRlcyhsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcodXRmOCwgIlVURi04Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGkgKyAiIHJlYWQgY2xhc3MgYXR0ciAtLSAnIiArIHN0ciArICInIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyLmVxdWFscyhuYW1lU0RFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkZUluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQnl0ZXModXRmOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInVuZXhwZWN0ZWQgdGFnOiAiICsgdGFnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc2RlSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlVXRmOEZvclNERSgpIHsKKyAgICAgICAgICAgIGludCBsZW4gPSBuYW1lU0RFLmxlbmd0aCgpOworICAgICAgICAgICAgd3JpdGVVMSgxKTsgLy8gVXRmOCB0YWcKKyAgICAgICAgICAgIHdyaXRlVTIobGVuKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICB3cml0ZVUxKG5hbWVTREUuY2hhckF0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBldmFsdWF0ZU5vZGVzKAorICAgICAgICBOb2RlLk5vZGVzIG5vZGVzLAorICAgICAgICBTbWFwU3RyYXR1bSBzLAorICAgICAgICBIYXNoTWFwIGlubmVyQ2xhc3NNYXAsCisgICAgICAgIGJvb2xlYW4gYnJlYWtBdExGKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBub2Rlcy52aXNpdChuZXcgU21hcEdlblZpc2l0b3IocywgYnJlYWtBdExGLCBpbm5lckNsYXNzTWFwKSk7CisgICAgICAgIH0gY2F0Y2ggKEphc3BlckV4Y2VwdGlvbiBleCkgeworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFNtYXBHZW5WaXNpdG9yIGV4dGVuZHMgTm9kZS5WaXNpdG9yIHsKKworICAgICAgICBwcml2YXRlIFNtYXBTdHJhdHVtIHNtYXA7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBicmVha0F0TEY7CisgICAgICAgIHByaXZhdGUgSGFzaE1hcCBpbm5lckNsYXNzTWFwOworCisgICAgICAgIFNtYXBHZW5WaXNpdG9yKFNtYXBTdHJhdHVtIHMsIGJvb2xlYW4gYnJlYWtBdExGLCBIYXNoTWFwIG1hcCkgeworICAgICAgICAgICAgdGhpcy5zbWFwID0gczsKKyAgICAgICAgICAgIHRoaXMuYnJlYWtBdExGID0gYnJlYWtBdExGOworICAgICAgICAgICAgdGhpcy5pbm5lckNsYXNzTWFwID0gbWFwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXRCb2R5KE5vZGUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTbWFwU3RyYXR1bSBzbWFwU2F2ZSA9IHNtYXA7CisgICAgICAgICAgICBTdHJpbmcgaW5uZXJDbGFzcyA9IG4uZ2V0SW5uZXJDbGFzc05hbWUoKTsKKyAgICAgICAgICAgIGlmIChpbm5lckNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNtYXAgPSAoU21hcFN0cmF0dW0pIGlubmVyQ2xhc3NNYXAuZ2V0KGlubmVyQ2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIudmlzaXRCb2R5KG4pOworICAgICAgICAgICAgc21hcCA9IHNtYXBTYXZlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5EZWNsYXJhdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvU21hcFRleHQobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkV4cHJlc3Npb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1NtYXBUZXh0KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5TY3JpcHRsZXQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1NtYXBUZXh0KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5JbmNsdWRlQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9TbWFwKG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Gb3J3YXJkQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9TbWFwKG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5HZXRQcm9wZXJ0eSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvU21hcChuKTsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuU2V0UHJvcGVydHkgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1NtYXAobik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlVzZUJlYW4gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1NtYXAobik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlBsdWdJbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvU21hcChuKTsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuQ3VzdG9tVGFnIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9TbWFwKG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5VbmludGVycHJldGVkVGFnIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9TbWFwKG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Kc3BFbGVtZW50IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9TbWFwKG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Kc3BUZXh0IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9TbWFwKG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5OYW1lZEF0dHJpYnV0ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSnNwQm9keSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvU21hcChuKTsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSW52b2tlQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9TbWFwKG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Eb0JvZHlBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1NtYXAobik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkVMRXhwcmVzc2lvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvU21hcChuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVGVtcGxhdGVUZXh0IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgTWFyayBtYXJrID0gbi5nZXRTdGFydCgpOworICAgICAgICAgICAgaWYgKG1hcmsgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9BZGQgdGhlIGZpbGUgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IG1hcmsuZ2V0RmlsZSgpOworICAgICAgICAgICAgc21hcC5hZGRGaWxlKHVucXVhbGlmeShmaWxlTmFtZSksIGZpbGVOYW1lKTsKKworICAgICAgICAgICAgLy9BZGQgYSBMaW5lSW5mbyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBub2RlCisgICAgICAgICAgICBpbnQgaUlucHV0U3RhcnRMaW5lID0gbWFyay5nZXRMaW5lTnVtYmVyKCk7CisgICAgICAgICAgICBpbnQgaU91dHB1dFN0YXJ0TGluZSA9IG4uZ2V0QmVnaW5KYXZhTGluZSgpOworICAgICAgICAgICAgaW50IGlPdXRwdXRMaW5lSW5jcmVtZW50ID0gYnJlYWtBdExGPyAxOiAwOworICAgICAgICAgICAgc21hcC5hZGRMaW5lRGF0YShpSW5wdXRTdGFydExpbmUsIGZpbGVOYW1lLCAxLCBpT3V0cHV0U3RhcnRMaW5lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU91dHB1dExpbmVJbmNyZW1lbnQpOworCisgICAgICAgICAgICAvLyBPdXRwdXQgYWRkaXRpb25hbCBtYXBwaW5ncyBpbiB0aGUgdGV4dAorICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBleHRyYVNtYXAgPSBuLmdldEV4dHJhU21hcCgpOworCisgICAgICAgICAgICBpZiAoZXh0cmFTbWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhU21hcC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpT3V0cHV0U3RhcnRMaW5lICs9IGlPdXRwdXRMaW5lSW5jcmVtZW50OworICAgICAgICAgICAgICAgICAgICBzbWFwLmFkZExpbmVEYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgaUlucHV0U3RhcnRMaW5lKygoSW50ZWdlcilleHRyYVNtYXAuZ2V0KGkpKS5pbnRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgaU91dHB1dFN0YXJ0TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlPdXRwdXRMaW5lSW5jcmVtZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZG9TbWFwKAorICAgICAgICAgICAgTm9kZSBuLAorICAgICAgICAgICAgaW50IGluTGluZUNvdW50LAorICAgICAgICAgICAgaW50IG91dEluY3JlbWVudCwKKyAgICAgICAgICAgIGludCBza2lwcGVkTGluZXMpIHsKKyAgICAgICAgICAgIE1hcmsgbWFyayA9IG4uZ2V0U3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChtYXJrID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyB1bnF1YWxpZmllZE5hbWUgPSB1bnF1YWxpZnkobWFyay5nZXRGaWxlKCkpOworICAgICAgICAgICAgc21hcC5hZGRGaWxlKHVucXVhbGlmaWVkTmFtZSwgbWFyay5nZXRGaWxlKCkpOworICAgICAgICAgICAgc21hcC5hZGRMaW5lRGF0YSgKKyAgICAgICAgICAgICAgICBtYXJrLmdldExpbmVOdW1iZXIoKSArIHNraXBwZWRMaW5lcywKKyAgICAgICAgICAgICAgICBtYXJrLmdldEZpbGUoKSwKKyAgICAgICAgICAgICAgICBpbkxpbmVDb3VudCAtIHNraXBwZWRMaW5lcywKKyAgICAgICAgICAgICAgICBuLmdldEJlZ2luSmF2YUxpbmUoKSArIHNraXBwZWRMaW5lcywKKyAgICAgICAgICAgICAgICBvdXRJbmNyZW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRvU21hcChOb2RlIG4pIHsKKyAgICAgICAgICAgIGRvU21hcChuLCAxLCBuLmdldEVuZEphdmFMaW5lKCkgLSBuLmdldEJlZ2luSmF2YUxpbmUoKSwgMCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZG9TbWFwVGV4dChOb2RlIG4pIHsKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gbi5nZXRUZXh0KCk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgaW50IG5leHQgPSAwOworICAgICAgICAgICAgaW50IGxpbmVDb3VudCA9IDE7CisgICAgICAgICAgICBpbnQgc2tpcHBlZExpbmVzID0gMDsKKyAgICAgICAgICAgIGJvb2xlYW4gc2xhc2hTdGFyU2VlbiA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBiZWdpbm5pbmcgPSB0cnVlOworCisgICAgICAgICAgICAvLyBDb3VudCBsaW5lcyBpbnNpZGUgdGV4dCwgYnV0IHNraXBwaW5nIGNvbW1lbnQgbGluZXMgYXQgdGhlCisgICAgICAgICAgICAvLyBiZWdpbm5pbmcgb2YgdGhlIHRleHQuCisgICAgICAgICAgICB3aGlsZSAoKG5leHQgPSB0ZXh0LmluZGV4T2YoJ1xuJywgaW5kZXgpKSA+IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKGJlZ2lubmluZykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHRleHQuc3Vic3RyaW5nKGluZGV4LCBuZXh0KS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghc2xhc2hTdGFyU2VlbiAmJiBsaW5lLnN0YXJ0c1dpdGgoIi8qIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsYXNoU3RhclNlZW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzbGFzaFN0YXJTZWVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkTGluZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmRJbmRleCA9IGxpbmUuaW5kZXhPZigiKi8iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW5kIG9mIC8qICovIGNvbW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGFzaFN0YXJTZWVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4IDwgbGluZS5sZW5ndGgoKSAtIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29tZSBleGVjdXRhYmxlIGNvZGUgYWZ0ZXIgY29tbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkTGluZXMtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCB8fCBsaW5lLnN0YXJ0c1dpdGgoIi8vIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWRMaW5lcysrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGluZUNvdW50Kys7CisgICAgICAgICAgICAgICAgaW5kZXggPSBuZXh0ICsgMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZG9TbWFwKG4sIGxpbmVDb3VudCwgMSwgc2tpcHBlZExpbmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByZVNjYW5WaXNpdG9yIGV4dGVuZHMgTm9kZS5WaXNpdG9yIHsKKworICAgICAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAgICAgcHVibGljIHZvaWQgZG9WaXNpdChOb2RlIG4pIHsKKyAgICAgICAgICAgIFN0cmluZyBpbm5lciA9IG4uZ2V0SW5uZXJDbGFzc05hbWUoKTsKKyAgICAgICAgICAgIGlmIChpbm5lciAhPSBudWxsICYmICFtYXAuY29udGFpbnNLZXkoaW5uZXIpKSB7CisgICAgICAgICAgICAgICAgbWFwLnB1dChpbm5lciwgbmV3IFNtYXBTdHJhdHVtKCJKU1AiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBIYXNoTWFwIGdldE1hcCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1RhZ0NvbnN0YW50cy5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9UYWdDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzNlYjBlCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9UYWdDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgVGFnQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9VUkkgPSAiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfQUNUSU9OID0gImRpcmVjdGl2ZS4iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9BQ1RJT04gPSAicm9vdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1JPT1RfQUNUSU9OID0gImpzcDpyb290IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfRElSRUNUSVZFX0FDVElPTiA9ICJkaXJlY3RpdmUucGFnZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1BBR0VfRElSRUNUSVZFX0FDVElPTiA9ICJqc3A6ZGlyZWN0aXZlLnBhZ2UiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9ESVJFQ1RJVkVfQUNUSU9OID0gImRpcmVjdGl2ZS5pbmNsdWRlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfSU5DTFVERV9ESVJFQ1RJVkVfQUNUSU9OID0gImpzcDpkaXJlY3RpdmUuaW5jbHVkZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUNMQVJBVElPTl9BQ1RJT04gPSAiZGVjbGFyYXRpb24iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ERUNMQVJBVElPTl9BQ1RJT04gPSAianNwOmRlY2xhcmF0aW9uIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDUklQVExFVF9BQ1RJT04gPSAic2NyaXB0bGV0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU0NSSVBUTEVUX0FDVElPTiA9ICJqc3A6c2NyaXB0bGV0IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fQUNUSU9OID0gImV4cHJlc3Npb24iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OX0FDVElPTiA9ICJqc3A6ZXhwcmVzc2lvbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfQkVBTl9BQ1RJT04gPSAidXNlQmVhbiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1VTRV9CRUFOX0FDVElPTiA9ICJqc3A6dXNlQmVhbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfUFJPUEVSVFlfQUNUSU9OID0gInNldFByb3BlcnR5IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU0VUX1BST1BFUlRZX0FDVElPTiA9ICJqc3A6c2V0UHJvcGVydHkiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX1BST1BFUlRZX0FDVElPTiA9ICJnZXRQcm9wZXJ0eSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0dFVF9QUk9QRVJUWV9BQ1RJT04gPSAianNwOmdldFByb3BlcnR5IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfQUNUSU9OID0gImluY2x1ZGUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9JTkNMVURFX0FDVElPTiA9ICJqc3A6aW5jbHVkZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJEX0FDVElPTiA9ICJmb3J3YXJkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRk9SV0FSRF9BQ1RJT04gPSAianNwOmZvcndhcmQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQUNUSU9OID0gInBhcmFtIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUEFSQU1fQUNUSU9OID0gImpzcDpwYXJhbSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTVNfQUNUSU9OID0gInBhcmFtcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1BBUkFNU19BQ1RJT04gPSAianNwOnBhcmFtcyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fQUNUSU9OID0gInBsdWdpbiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1BMVUdJTl9BQ1RJT04gPSAianNwOnBsdWdpbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUxMQkFDS19BQ1RJT04gPSAiZmFsbGJhY2siOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9GQUxMQkFDS19BQ1RJT04gPSAianNwOmZhbGxiYWNrIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQUNUSU9OID0gInRleHQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9URVhUX0FDVElPTiA9ICJqc3A6dGV4dCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1RFWFRfQUNUSU9OX0VORCA9ICI8L2pzcDp0ZXh0PiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfQUNUSU9OID0gImF0dHJpYnV0ZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0FUVFJJQlVURV9BQ1RJT04gPSAianNwOmF0dHJpYnV0ZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZX0FDVElPTiA9ICJib2R5IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQk9EWV9BQ1RJT04gPSAianNwOmJvZHkiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9BQ1RJT04gPSAiZWxlbWVudCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMRU1FTlRfQUNUSU9OID0gImpzcDplbGVtZW50IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9BQ1RJT04gPSAib3V0cHV0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfT1VUUFVUX0FDVElPTiA9ICJqc3A6b3V0cHV0IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR0xJQl9ESVJFQ1RJVkVfQUNUSU9OID0gInRhZ2xpYiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1RBR0xJQl9ESVJFQ1RJVkVfQUNUSU9OID0gImpzcDp0YWdsaWIiOworCisgICAgLyoKKyAgICAgKiBUYWcgRmlsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZPS0VfQUNUSU9OID0gImludm9rZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0lOVk9LRV9BQ1RJT04gPSAianNwOmludm9rZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0JPRFlfQUNUSU9OID0gImRvQm9keSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RPQk9EWV9BQ1RJT04gPSAianNwOmRvQm9keSI7CisKKyAgICAvKgorICAgICAqIFRhZyBGaWxlIERpcmVjdGl2ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRElSRUNUSVZFX0FDVElPTiA9ICJkaXJlY3RpdmUudGFnIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVEFHX0RJUkVDVElWRV9BQ1RJT04gPSAianNwOmRpcmVjdGl2ZS50YWciOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0RJUkVDVElWRV9BQ1RJT04gPSAiZGlyZWN0aXZlLmF0dHJpYnV0ZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0FUVFJJQlVURV9ESVJFQ1RJVkVfQUNUSU9OID0gImpzcDpkaXJlY3RpdmUuYXR0cmlidXRlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUklBQkxFX0RJUkVDVElWRV9BQ1RJT04gPSAiZGlyZWN0aXZlLnZhcmlhYmxlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVkFSSUFCTEVfRElSRUNUSVZFX0FDVElPTiA9ICJqc3A6ZGlyZWN0aXZlLnZhcmlhYmxlIjsKKworICAgIC8qCisgICAgICogRGlyZWN0aXZlIGF0dHJpYnV0ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUk5fSlNQVEFHRElSID0gInVybjpqc3B0YWdkaXI6IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUk5fSlNQVExEID0gInVybjpqc3B0bGQ6IjsKK30KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvVGFnRmlsZVByb2Nlc3Nvci5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9UYWdGaWxlUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzZmFlNAotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvVGFnRmlsZVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNjA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0F0dHJpYnV0ZUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRmlsZUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0luZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0xpYnJhcnlJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdWYXJpYWJsZUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlZhcmlhYmxlSW5mbzsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Kc3BDb21waWxhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuc2VydmxldC5Kc3BTZXJ2bGV0V3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFNvdXJjZURlcGVuZGVudDsKKworLyoqCisgKiAxLiBQcm9jZXNzZXMgYW5kIGV4dHJhY3RzIHRoZSBkaXJlY3RpdmUgaW5mbyBpbiBhIHRhZyBmaWxlLgorICogMi4gQ29tcGlsZXMgYW5kIGxvYWRzIHRhZyBmaWxlcyB1c2VkIGluIGEgSlNQIGZpbGUuCisgKgorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKi8KKworY2xhc3MgVGFnRmlsZVByb2Nlc3NvciB7CisKKyAgICBwcml2YXRlIFZlY3RvciB0ZW1wVmVjdG9yOworCisgICAgLyoqCisgICAgICogQSB2aXNpdG9yIHRoZSB0YWcgZmlsZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRhZ0ZpbGVEaXJlY3RpdmVWaXNpdG9yIGV4dGVuZHMgTm9kZS5WaXNpdG9yIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKc3BVdGlsLlZhbGlkQXR0cmlidXRlW10gdGFnRGlyZWN0aXZlQXR0cnMgPSB7CisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiZGlzcGxheS1uYW1lIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiYm9keS1jb250ZW50IiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiZHluYW1pYy1hdHRyaWJ1dGVzIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgic21hbGwtaWNvbiIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImxhcmdlLWljb24iKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJkZXNjcmlwdGlvbiIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImV4YW1wbGUiKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJwYWdlRW5jb2RpbmciKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJsYW5ndWFnZSIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImltcG9ydCIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImlzRUxJZ25vcmVkIikgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKc3BVdGlsLlZhbGlkQXR0cmlidXRlW10gYXR0cmlidXRlRGlyZWN0aXZlQXR0cnMgPSB7CisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgibmFtZSIsIHRydWUpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInJlcXVpcmVkIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiZnJhZ21lbnQiKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJydGV4cHJ2YWx1ZSIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInR5cGUiKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJkZXNjcmlwdGlvbiIpCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZVtdIHZhcmlhYmxlRGlyZWN0aXZlQXR0cnMgPSB7CisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgibmFtZS1naXZlbiIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoIm5hbWUtZnJvbS1hdHRyaWJ1dGUiKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJhbGlhcyIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInZhcmlhYmxlLWNsYXNzIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgic2NvcGUiKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJkZWNsYXJlIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgRXJyb3JEaXNwYXRjaGVyIGVycjsKKyAgICAgICAgcHJpdmF0ZSBUYWdMaWJyYXJ5SW5mbyB0YWdMaWJJbmZvOworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICBwcml2YXRlIFN0cmluZyBwYXRoID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBUYWdFeHRyYUluZm8gdGVpID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYm9keWNvbnRlbnQgPSBudWxsOworICAgICAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGRpc3BsYXlOYW1lID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc21hbGxJY29uID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbGFyZ2VJY29uID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZHluYW1pY0F0dHJzTWFwTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZXhhbXBsZSA9IG51bGw7CisgICAgICAgIAorICAgICAgICBwcml2YXRlIFZlY3RvciBhdHRyaWJ1dGVWZWN0b3I7CisgICAgICAgIHByaXZhdGUgVmVjdG9yIHZhcmlhYmxlVmVjdG9yOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUUgPQorICAgICAgICAgICAgInRoZSBuYW1lIGF0dHJpYnV0ZSBvZiB0aGUgYXR0cmlidXRlIGRpcmVjdGl2ZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJfTkFNRV9HSVZFTiA9CisgICAgICAgICAgICAidGhlIG5hbWUtZ2l2ZW4gYXR0cmlidXRlIG9mIHRoZSB2YXJpYWJsZSBkaXJlY3RpdmUiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX05BTUVfRlJPTSA9CisgICAgICAgICAgICAidGhlIG5hbWUtZnJvbS1hdHRyaWJ1dGUgYXR0cmlidXRlIG9mIHRoZSB2YXJpYWJsZSBkaXJlY3RpdmUiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX0FMSUFTID0KKyAgICAgICAgICAgICJ0aGUgYWxpYXMgYXR0cmlidXRlIG9mIHRoZSB2YXJpYWJsZSBkaXJlY3RpdmUiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RZTkFNSUMgPQorICAgICAgICAgICAgInRoZSBkeW5hbWljLWF0dHJpYnV0ZXMgYXR0cmlidXRlIG9mIHRoZSB0YWcgZGlyZWN0aXZlIjsKKyAgICAgICAgcHJpdmF0ZSBIYXNoTWFwIG5hbWVUYWJsZSA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHByaXZhdGUgSGFzaE1hcCBuYW1lRnJvbVRhYmxlID0gbmV3IEhhc2hNYXAoKTsKKworICAgICAgICBwdWJsaWMgVGFnRmlsZURpcmVjdGl2ZVZpc2l0b3IoQ29tcGlsZXIgY29tcGlsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWdMaWJyYXJ5SW5mbyB0YWdMaWJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCkgeworICAgICAgICAgICAgZXJyID0gY29tcGlsZXIuZ2V0RXJyb3JEaXNwYXRjaGVyKCk7CisgICAgICAgICAgICB0aGlzLnRhZ0xpYkluZm8gPSB0YWdMaWJJbmZvOworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgICAgICAgICBhdHRyaWJ1dGVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICB2YXJpYWJsZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVGFnRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBKc3BVdGlsLmNoZWNrQXR0cmlidXRlcygiVGFnIGRpcmVjdGl2ZSIsIG4sIHRhZ0RpcmVjdGl2ZUF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKKworICAgICAgICAgICAgYm9keWNvbnRlbnQgPSBjaGVja0NvbmZsaWN0KG4sIGJvZHljb250ZW50LCAiYm9keS1jb250ZW50Iik7CisgICAgICAgICAgICBpZiAoYm9keWNvbnRlbnQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAhYm9keWNvbnRlbnQuZXF1YWxzSWdub3JlQ2FzZShUYWdJbmZvLkJPRFlfQ09OVEVOVF9FTVBUWSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIWJvZHljb250ZW50LmVxdWFsc0lnbm9yZUNhc2UoVGFnSW5mby5CT0RZX0NPTlRFTlRfVEFHX0RFUEVOREVOVCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIWJvZHljb250ZW50LmVxdWFsc0lnbm9yZUNhc2UoVGFnSW5mby5CT0RZX0NPTlRFTlRfU0NSSVBUTEVTUykpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci50YWdkaXJlY3RpdmUuYmFkYm9keWNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5Y29udGVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkeW5hbWljQXR0cnNNYXBOYW1lID0gY2hlY2tDb25mbGljdChuLCBkeW5hbWljQXR0cnNNYXBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR5bmFtaWMtYXR0cmlidXRlcyIpOworICAgICAgICAgICAgaWYgKGR5bmFtaWNBdHRyc01hcE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNoZWNrVW5pcXVlTmFtZShkeW5hbWljQXR0cnNNYXBOYW1lLCBUQUdfRFlOQU1JQywgbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbWFsbEljb24gPSBjaGVja0NvbmZsaWN0KG4sIHNtYWxsSWNvbiwgInNtYWxsLWljb24iKTsKKyAgICAgICAgICAgIGxhcmdlSWNvbiA9IGNoZWNrQ29uZmxpY3QobiwgbGFyZ2VJY29uLCAibGFyZ2UtaWNvbiIpOworICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBjaGVja0NvbmZsaWN0KG4sIGRlc2NyaXB0aW9uLCAiZGVzY3JpcHRpb24iKTsKKyAgICAgICAgICAgIGRpc3BsYXlOYW1lID0gY2hlY2tDb25mbGljdChuLCBkaXNwbGF5TmFtZSwgImRpc3BsYXktbmFtZSIpOworICAgICAgICAgICAgZXhhbXBsZSA9IGNoZWNrQ29uZmxpY3QobiwgZXhhbXBsZSwgImV4YW1wbGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNoZWNrQ29uZmxpY3QoTm9kZSBuLCBTdHJpbmcgb2xkQXR0clZhbHVlLCBTdHJpbmcgYXR0cikKKyAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG9sZEF0dHJWYWx1ZTsKKyAgICAgICAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBuLmdldEF0dHJpYnV0ZVZhbHVlKGF0dHIpOworICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG9sZEF0dHJWYWx1ZSAhPSBudWxsICYmICFvbGRBdHRyVmFsdWUuZXF1YWxzKGF0dHJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IudGFnLmNvbmZsaWN0LmF0dHIiLCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQXR0clZhbHVlLCBhdHRyVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXN1bHQgPSBhdHRyVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgICAgICAKKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkF0dHJpYnV0ZURpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgSnNwVXRpbC5jaGVja0F0dHJpYnV0ZXMoIkF0dHJpYnV0ZSBkaXJlY3RpdmUiLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlRGlyZWN0aXZlQXR0cnMsIGVycik7CisKKyAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IG4uZ2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiKTsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVxdWlyZWQgPSBKc3BVdGlsLmJvb2xlYW5WYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldEF0dHJpYnV0ZVZhbHVlKCJyZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIGJvb2xlYW4gcnRleHBydmFsdWUgPSB0cnVlOworICAgICAgICAgICAgU3RyaW5nIHJ0ZXhwcnZhbHVlU3RyaW5nID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgicnRleHBydmFsdWUiKTsKKyAgICAgICAgICAgIGlmIChydGV4cHJ2YWx1ZVN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcnRleHBydmFsdWUgPSBKc3BVdGlsLmJvb2xlYW5WYWx1ZSggcnRleHBydmFsdWVTdHJpbmcgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gZnJhZ21lbnQgPSBKc3BVdGlsLmJvb2xlYW5WYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldEF0dHJpYnV0ZVZhbHVlKCJmcmFnbWVudCIpKTsKKyAgICAgICAgICAgIFN0cmluZyB0eXBlID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgidHlwZSIpOworICAgICAgICAgICAgaWYgKGZyYWdtZW50KSB7CisgICAgICAgICAgICAgICAgLy8gdHlwZSBpcyBmaXhlZCB0byAiSnNwRnJhZ21lbnQiIGFuZCBhIHRyYW5zbGF0aW9uIGVycm9yCisgICAgICAgICAgICAgICAgLy8gbXVzdCBvY2N1ciBpZiBzcGVjaWZpZWQuCisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5mcmFnbWVudHdpdGh0eXBlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHJ0ZXhwcnZhbHVlIGlzIGZpeGVkIHRvICJ0cnVlIiBhbmQgYSB0cmFuc2xhdGlvbiBlcnJvcgorICAgICAgICAgICAgICAgIC8vIG11c3Qgb2NjdXIgaWYgc3BlY2lmaWVkLgorICAgICAgICAgICAgICAgIHJ0ZXhwcnZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiggcnRleHBydmFsdWVTdHJpbmcgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuZnJnbWVudHdpdGhydGV4cHJ2YWx1ZSIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRhZ0F0dHJpYnV0ZUluZm8gdGFnQXR0cmlidXRlSW5mbyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBUYWdBdHRyaWJ1dGVJbmZvKGF0dHJOYW1lLCByZXF1aXJlZCwgdHlwZSwgcnRleHBydmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50KTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZVZlY3Rvci5hZGRFbGVtZW50KHRhZ0F0dHJpYnV0ZUluZm8pOworICAgICAgICAgICAgY2hlY2tVbmlxdWVOYW1lKGF0dHJOYW1lLCBBVFRSX05BTUUsIG4sIHRhZ0F0dHJpYnV0ZUluZm8pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5WYXJpYWJsZURpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgSnNwVXRpbC5jaGVja0F0dHJpYnV0ZXMoIlZhcmlhYmxlIGRpcmVjdGl2ZSIsIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZURpcmVjdGl2ZUF0dHJzLCBlcnIpOworCisgICAgICAgICAgICBTdHJpbmcgbmFtZUdpdmVuID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZS1naXZlbiIpOworICAgICAgICAgICAgU3RyaW5nIG5hbWVGcm9tQXR0cmlidXRlID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZS1mcm9tLWF0dHJpYnV0ZSIpOworICAgICAgICAgICAgaWYgKG5hbWVHaXZlbiA9PSBudWxsICYmIG5hbWVGcm9tQXR0cmlidXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci52YXJpYWJsZS5laXRoZXIubmFtZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmFtZUdpdmVuICE9IG51bGwgJiYgbmFtZUZyb21BdHRyaWJ1dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnZhcmlhYmxlLmJvdGgubmFtZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYWxpYXMgPSBuLmdldEF0dHJpYnV0ZVZhbHVlKCJhbGlhcyIpOworICAgICAgICAgICAgaWYgKG5hbWVGcm9tQXR0cmlidXRlICE9IG51bGwgJiYgYWxpYXMgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgIG5hbWVGcm9tQXR0cmlidXRlID09IG51bGwgJiYgYWxpYXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnZhcmlhYmxlLmFsaWFzIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBuLmdldEF0dHJpYnV0ZVZhbHVlKCJ2YXJpYWJsZS1jbGFzcyIpOworICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKworICAgICAgICAgICAgU3RyaW5nIGRlY2xhcmVTdHIgPSBuLmdldEF0dHJpYnV0ZVZhbHVlKCJkZWNsYXJlIik7CisgICAgICAgICAgICBib29sZWFuIGRlY2xhcmUgPSB0cnVlOworICAgICAgICAgICAgaWYgKGRlY2xhcmVTdHIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkZWNsYXJlID0gSnNwVXRpbC5ib29sZWFuVmFsdWUoZGVjbGFyZVN0cik7CisKKyAgICAgICAgICAgIGludCBzY29wZSA9IFZhcmlhYmxlSW5mby5ORVNURUQ7CisgICAgICAgICAgICBTdHJpbmcgc2NvcGVTdHIgPSBuLmdldEF0dHJpYnV0ZVZhbHVlKCJzY29wZSIpOworICAgICAgICAgICAgaWYgKHNjb3BlU3RyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIk5FU1RFRCIuZXF1YWxzKHNjb3BlU3RyKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiQVRfQkVHSU4iLmVxdWFscyhzY29wZVN0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUgPSBWYXJpYWJsZUluZm8uQVRfQkVHSU47CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiQVRfRU5EIi5lcXVhbHMoc2NvcGVTdHIpKSB7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlID0gVmFyaWFibGVJbmZvLkFUX0VORDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuYW1lRnJvbUF0dHJpYnV0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLyoKKwkJICogQW4gYWxpYXMgaGFzIGJlZW4gc3BlY2lmaWVkLiBXZSB1c2UgJ25hbWVHaXZlbicgdG8gaG9sZCB0aGUKKwkJICogdmFsdWUgb2YgdGhlIGFsaWFzLCBhbmQgJ25hbWVGcm9tQXR0cmlidXRlJyB0byBob2xkIHRoZSAKKwkJICogbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdob3NlIHZhbHVlIChhdCBpbnZvY2F0aW9uLXRpbWUpCisJCSAqIGRlbm90ZXMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgaXMgYmVpbmcgYWxpYXNlZAorCQkgKi8KKyAgICAgICAgICAgICAgICBuYW1lR2l2ZW4gPSBhbGlhczsKKyAgICAgICAgICAgICAgICBjaGVja1VuaXF1ZU5hbWUobmFtZUZyb21BdHRyaWJ1dGUsIFZBUl9OQU1FX0ZST00sIG4pOworICAgICAgICAgICAgICAgIGNoZWNrVW5pcXVlTmFtZShhbGlhcywgVkFSX0FMSUFTLCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIG5hbWUtZ2l2ZW4gc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgY2hlY2tVbmlxdWVOYW1lKG5hbWVHaXZlbiwgVkFSX05BTUVfR0lWRU4sIG4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyaWFibGVWZWN0b3IuYWRkRWxlbWVudChuZXcgVGFnVmFyaWFibGVJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUdpdmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUZyb21BdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFJldHVybnMgdGhlIHZlY3RvciBvZiBhdHRyaWJ1dGVzIGNvcnJlc3BvbmRpbmcgdG8gYXR0cmlidXRlCisgICAgICAgICAqIGRpcmVjdGl2ZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVmVjdG9yIGdldEF0dHJpYnV0ZXNWZWN0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlVmVjdG9yOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmV0dXJucyB0aGUgdmVjdG9yIG9mIHZhcmlhYmxlcyBjb3JyZXNwb25kaW5nIHRvIHZhcmlhYmxlCisgICAgICAgICAqIGRpcmVjdGl2ZXMuCisgICAgICAgICAqLyAgICAgICAgCisgICAgICAgIHB1YmxpYyBWZWN0b3IgZ2V0VmFyaWFibGVzVmVjdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlVmVjdG9yOworICAgICAgICB9CisKKwkvKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBkeW5hbWljLWF0dHJpYnV0ZXMgdGFnIGRpcmVjdGl2ZQorCSAqIGF0dHJpYnV0ZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldER5bmFtaWNBdHRyaWJ1dGVzTWFwTmFtZSgpIHsKKwkgICAgcmV0dXJuIGR5bmFtaWNBdHRyc01hcE5hbWU7CisJfQorCisgICAgICAgIHB1YmxpYyBUYWdJbmZvIGdldFRhZ0luZm8oKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFhYWCBHZXQgaXQgZnJvbSB0YWcgZmlsZSBuYW1lCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChib2R5Y29udGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYm9keWNvbnRlbnQgPSBUYWdJbmZvLkJPRFlfQ09OVEVOVF9TQ1JJUFRMRVNTOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgdGFnQ2xhc3NOYW1lID0gSnNwVXRpbC5nZXRUYWdIYW5kbGVyQ2xhc3NOYW1lKHBhdGgsIGVycik7CisKKyAgICAgICAgICAgIFRhZ1ZhcmlhYmxlSW5mb1tdIHRhZ1ZhcmlhYmxlSW5mb3MKKyAgICAgICAgICAgICAgICA9IG5ldyBUYWdWYXJpYWJsZUluZm9bdmFyaWFibGVWZWN0b3Iuc2l6ZSgpXTsKKyAgICAgICAgICAgIHZhcmlhYmxlVmVjdG9yLmNvcHlJbnRvKHRhZ1ZhcmlhYmxlSW5mb3MpOworCisgICAgICAgICAgICBUYWdBdHRyaWJ1dGVJbmZvW10gdGFnQXR0cmlidXRlSW5mbworICAgICAgICAgICAgICAgID0gbmV3IFRhZ0F0dHJpYnV0ZUluZm9bYXR0cmlidXRlVmVjdG9yLnNpemUoKV07CisgICAgICAgICAgICBhdHRyaWJ1dGVWZWN0b3IuY29weUludG8odGFnQXR0cmlidXRlSW5mbyk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmFzcGVyVGFnSW5mbyhuYW1lLAorCQkJICAgICAgIHRhZ0NsYXNzTmFtZSwKKwkJCSAgICAgICBib2R5Y29udGVudCwKKwkJCSAgICAgICBkZXNjcmlwdGlvbiwKKwkJCSAgICAgICB0YWdMaWJJbmZvLAorCQkJICAgICAgIHRlaSwKKwkJCSAgICAgICB0YWdBdHRyaWJ1dGVJbmZvLAorCQkJICAgICAgIGRpc3BsYXlOYW1lLAorCQkJICAgICAgIHNtYWxsSWNvbiwKKwkJCSAgICAgICBsYXJnZUljb24sCisJCQkgICAgICAgdGFnVmFyaWFibGVJbmZvcywKKwkJCSAgICAgICBkeW5hbWljQXR0cnNNYXBOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjbGFzcyBOYW1lRW50cnkgeworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKyAgICAgICAgICAgIHByaXZhdGUgTm9kZSBub2RlOworICAgICAgICAgICAgcHJpdmF0ZSBUYWdBdHRyaWJ1dGVJbmZvIGF0dHI7CisKKyAgICAgICAgICAgIE5hbWVFbnRyeShTdHJpbmcgdHlwZSwgTm9kZSBub2RlLCBUYWdBdHRyaWJ1dGVJbmZvIGF0dHIpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IG5vZGU7CisgICAgICAgICAgICAgICAgdGhpcy5hdHRyID0gYXR0cjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGdldFR5cGUoKSB7IHJldHVybiB0eXBlO30KKyAgICAgICAgICAgIE5vZGUgZ2V0Tm9kZSgpIHsgcmV0dXJuIG5vZGU7IH0KKyAgICAgICAgICAgIFRhZ0F0dHJpYnV0ZUluZm8gZ2V0VGFnQXR0cmlidXRlSW5mbygpIHsgcmV0dXJuIGF0dHI7IH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXBvcnRzIGEgdHJhbnNsYXRpb24gZXJyb3IgaWYgbmFtZXMgc3BlY2lmaWVkIGluIGF0dHJpYnV0ZXMgb2YKKyAgICAgICAgICogZGlyZWN0aXZlcyBhcmUgbm90IHVuaXF1ZSBpbiB0aGlzIHRyYW5zbGF0aW9uIHVuaXQuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgbXVzdCBiZSB1bmlxdWUuCisgICAgICAgICAqICAgMS4gJ25hbWUnIGF0dHJpYnV0ZSBvZiBhbiBhdHRyaWJ1dGUgZGlyZWN0aXZlCisgICAgICAgICAqICAgMi4gJ25hbWUtZ2l2ZW4nIGF0dHJpYnV0ZSBvZiBhIHZhcmlhYmxlIGRpcmVjdGl2ZQorICAgICAgICAgKiAgIDMuICdhbGlhcycgYXR0cmlidXRlIG9mIHZhcmlhYmxlIGRpcmVjdGl2ZQorICAgICAgICAgKiAgIDQuICdkeW5hbWljLWF0dHJpYnV0ZXMnIG9mIGEgdGFnIGRpcmVjdGl2ZQorICAgICAgICAgKiBleGNlcHQgdGhhdCAnZHluYW1pYy1hdHRyaWJ1dGVzJyBjYW4gKGFuZCBtdXN0KSBoYXZlIHRoZSBzYW1lCisgICAgICAgICAqIHZhbHVlIHdoZW4gaXQgYXBwZWFycyBpbiBtdWx0aXBsZSB0YWcgZGlyZWN0aXZlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQWxzbywgJ25hbWUtZnJvbScgYXR0cmlidXRlIG9mIGEgdmFyaWFibGUgZGlyZWN0aXZlIGNhbm5vdCBoYXZlCisgICAgICAgICAqIHRoZSBzYW1lIHZhbHVlIGFzIHRoYXQgZnJvbSBhbm90aGVyIHZhcmlhYmxlIGRpcmVjdGl2ZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1VuaXF1ZU5hbWUoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBOb2RlIG4pCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBjaGVja1VuaXF1ZU5hbWUobmFtZSwgdHlwZSwgbiwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tVbmlxdWVOYW1lKFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwgTm9kZSBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZ0F0dHJpYnV0ZUluZm8gYXR0cikKKyAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgSGFzaE1hcCB0YWJsZSA9ICh0eXBlID09IFZBUl9OQU1FX0ZST00pPyBuYW1lRnJvbVRhYmxlOiBuYW1lVGFibGU7CisgICAgICAgICAgICBOYW1lRW50cnkgbmFtZUVudHJ5ID0gKE5hbWVFbnRyeSkgdGFibGUuZ2V0KG5hbWUpOworICAgICAgICAgICAgaWYgKG5hbWVFbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gVEFHX0RZTkFNSUMgfHwgbmFtZUVudHJ5LmdldFR5cGUoKSAhPSBUQUdfRFlOQU1JQykgeworICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSA9IG5hbWVFbnRyeS5nZXROb2RlKCkuZ2V0U3RhcnQoKS5nZXRMaW5lTnVtYmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnRhZ2ZpbGUubmFtZU5vdFVuaXF1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgbmFtZUVudHJ5LmdldFR5cGUoKSwgSW50ZWdlci50b1N0cmluZyhsaW5lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0YWJsZS5wdXQobmFtZSwgbmV3IE5hbWVFbnRyeSh0eXBlLCBuLCBhdHRyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybSBtaXNjZWxsZWFuIGNoZWNrcyBhZnRlciB0aGUgbm9kZXMgYXJlIHZpc2l0ZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHBvc3RDaGVjaygpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB2YXIubmFtZS1mcm9tLWF0dHJpYnV0ZXMgaGFzIHZhbGlkIHZhbHVlcy4KKwkgICAgSXRlcmF0b3IgaXRlciA9IG5hbWVGcm9tVGFibGUua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lRnJvbSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIE5hbWVFbnRyeSBuYW1lRW50cnkgPSAoTmFtZUVudHJ5KSBuYW1lVGFibGUuZ2V0KG5hbWVGcm9tKTsKKyAgICAgICAgICAgICAgICBOYW1lRW50cnkgbmFtZUZyb21FbnRyeSA9CisgICAgICAgICAgICAgICAgICAgIChOYW1lRW50cnkpIG5hbWVGcm9tVGFibGUuZ2V0KG5hbWVGcm9tKTsKKyAgICAgICAgICAgICAgICBOb2RlIG5hbWVGcm9tTm9kZSA9IG5hbWVGcm9tRW50cnkuZ2V0Tm9kZSgpOworICAgICAgICAgICAgICAgIGlmIChuYW1lRW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobmFtZUZyb21Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci50YWdmaWxlLm5hbWVGcm9tLm5vQXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVGcm9tKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSBuYW1lRW50cnkuZ2V0Tm9kZSgpOworICAgICAgICAgICAgICAgICAgICBUYWdBdHRyaWJ1dGVJbmZvIHRhZ0F0dHIgPSBuYW1lRW50cnkuZ2V0VGFnQXR0cmlidXRlSW5mbygpOworICAgICAgICAgICAgICAgICAgICBpZiAoISAiamF2YS5sYW5nLlN0cmluZyIuZXF1YWxzKHRhZ0F0dHIuZ2V0VHlwZU5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhIHRhZ0F0dHIuaXNSZXF1aXJlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdGFnQXR0ci5jYW5CZVJlcXVlc3RUaW1lKCkpeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG5hbWVGcm9tTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLnRhZ2ZpbGUubmFtZUZyb20uYmFkQXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG5vZGUuZ2V0U3RhcnQoKS5nZXRMaW5lTnVtYmVyKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIHRhZyBmaWxlLCBhbmQgY29sbGVjdHMgaW5mb3JtYXRpb24gb24gdGhlIGRpcmVjdGl2ZXMgaW5jbHVkZWQKKyAgICAgKiBpbiBpdC4gIFRoZSBtZXRob2QgaXMgdXNlZCB0byBvYnRhaW4gdGhlIGluZm8gb24gdGhlIHRhZyBmaWxlLCB3aGVuIHRoZSAKKyAgICAgKiBoYW5kbGVyIHRoYXQgaXQgcmVwcmVzZW50cyBpcyByZWZlcmVuY2VkLiAgVGhlIHRhZyBmaWxlIGlzIG5vdCBjb21waWxlZAorICAgICAqIGhlcmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGMgdGhlIGN1cnJlbnQgUGFyc2VyQ29udHJvbGxlciB1c2VkIGluIHRoaXMgY29tcGlsYXRpb24KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgdGFnIG5hbWUgYXMgc3BlY2lmaWVkIGluIHRoZSBUTEQKKyAgICAgKiBAcGFyYW0gdGFnZmlsZSB0aGUgcGF0aCBmb3IgdGhlIHRhZ2ZpbGUKKyAgICAgKiBAcGFyYW0gdGFnTGliSW5mbyB0aGUgVGFnTGlicmFyeUluZm8gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRhZ0luZm8KKyAgICAgKiBAcmV0dXJuIGEgVGFnSW5mbyBvYmplY3QgYXNzZW1ibGVkIGZyb20gdGhlIGRpcmVjdGl2ZXMgaW4gdGhlIHRhZyBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVGFnSW5mbyBwYXJzZVRhZ0ZpbGVEaXJlY3RpdmVzKFBhcnNlckNvbnRyb2xsZXIgcGMsCisJCQkJCQkgU3RyaW5nIG5hbWUsCisJCQkJCQkgU3RyaW5nIHBhdGgsCisJCQkJCQkgVGFnTGlicmFyeUluZm8gdGFnTGliSW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIEVycm9yRGlzcGF0Y2hlciBlcnIgPSBwYy5nZXRDb21waWxlcigpLmdldEVycm9yRGlzcGF0Y2hlcigpOworCisgICAgICAgIE5vZGUuTm9kZXMgcGFnZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYWdlID0gcGMucGFyc2VUYWdGaWxlRGlyZWN0aXZlcyhwYXRoKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLmZpbGUubm90LmZvdW5kIiwgcGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLmZpbGUubm90LmZvdW5kIiwgcGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBUYWdGaWxlRGlyZWN0aXZlVmlzaXRvciB0YWdGaWxlVmlzaXRvcgorICAgICAgICAgICAgPSBuZXcgVGFnRmlsZURpcmVjdGl2ZVZpc2l0b3IocGMuZ2V0Q29tcGlsZXIoKSwgdGFnTGliSW5mbywgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgpOworICAgICAgICBwYWdlLnZpc2l0KHRhZ0ZpbGVWaXNpdG9yKTsKKyAgICAgICAgdGFnRmlsZVZpc2l0b3IucG9zdENoZWNrKCk7CisKKyAgICAgICAgcmV0dXJuIHRhZ0ZpbGVWaXNpdG9yLmdldFRhZ0luZm8oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21waWxlcyBhbmQgbG9hZHMgYSB0YWdmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3MgbG9hZFRhZ0ZpbGUoQ29tcGlsZXIgY29tcGlsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFnRmlsZVBhdGgsIFRhZ0luZm8gdGFnSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VJbmZvIHBhcmVudFBhZ2VJbmZvKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBKc3BDb21waWxhdGlvbkNvbnRleHQgY3R4dCA9IGNvbXBpbGVyLmdldENvbXBpbGF0aW9uQ29udGV4dCgpOworICAgICAgICBKc3BSdW50aW1lQ29udGV4dCByY3R4dCA9IGN0eHQuZ2V0UnVudGltZUNvbnRleHQoKTsKKyAgICAgICAgSnNwU2VydmxldFdyYXBwZXIgd3JhcHBlciA9CisgICAgICAgICAgICAgICAgKEpzcFNlcnZsZXRXcmFwcGVyKSByY3R4dC5nZXRXcmFwcGVyKHRhZ0ZpbGVQYXRoKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQocmN0eHQpIHsKKyAgICAgICAgICAgIGlmICh3cmFwcGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cmFwcGVyID0gbmV3IEpzcFNlcnZsZXRXcmFwcGVyKGN0eHQuZ2V0U2VydmxldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQuZ2V0T3B0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnRmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC5nZXRSdW50aW1lQ29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVSTCkgY3R4dC5nZXRUYWdGaWxlSmFyVXJscygpLmdldCh0YWdGaWxlUGF0aCkpOworICAgICAgICAgICAgICAgICAgICByY3R4dC5hZGRXcmFwcGVyKHRhZ0ZpbGVQYXRoLHdyYXBwZXIpOworCisJCS8vIFVzZSBzYW1lIGNsYXNzbG9hZGVyIGFuZCBjbGFzc3BhdGggZm9yIGNvbXBpbGluZyB0YWcgZmlsZXMKKwkJd3JhcHBlci5nZXRKc3BFbmdpbmVDb250ZXh0KCkuc2V0Q2xhc3NMb2FkZXIoCisJCQkJKFVSTENsYXNzTG9hZGVyKSBjdHh0LmdldENsYXNzTG9hZGVyKCkpOworCQl3cmFwcGVyLmdldEpzcEVuZ2luZUNvbnRleHQoKS5zZXRDbGFzc1BhdGgoY3R4dC5nZXRDbGFzc1BhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBKc3BDb21waWxhdGlvbkNvbnRleHQgZ2V0cyB0aGUgbGF0ZXN0IFRhZ0luZm8KKyAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHRhZyBmaWxlLiAgVGFnSW5mbyBpbnN0YW5jZSB3YXMgY3JlYXRlZCB0aGUgbGFzdAorICAgICAgICAgICAgICAgIC8vIHRpbWUgdGhlIHRhZyBmaWxlIHdhcyBzY2FubmVkIGZvciBkaXJlY3RpdmVzLCBhbmQgdGhlIHRhZworICAgICAgICAgICAgICAgIC8vIGZpbGUgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGVuLgorICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0SnNwRW5naW5lQ29udGV4dCgpLnNldFRhZ0luZm8odGFnSW5mbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENsYXNzIHRhZ0NsYXp6OworICAgICAgICAgICAgaW50IHRyaXBDb3VudCA9IHdyYXBwZXIuaW5jVHJpcENvdW50KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICh0cmlwQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdHJpcENvdW50IGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLCBhIGNpcmN1bGFyCisgICAgICAgICAgICAgICAgICAgIC8vIGRlcGVuZGVuY3kgZXhpc3RzLiAgVGhlIGNpcmN1bGFyaWx5IGRlcGVuZGFudCB0YWcKKyAgICAgICAgICAgICAgICAgICAgLy8gZmlsZSBpcyBjb21waWxlZCBpbiBwcm90b3R5cGUgbW9kZSwgdG8gYXZvaWQgaW5maW5pdGUKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVjdXJzaW9uLgorCisgICAgICAgICAgICAgICAgICAgIEpzcFNlcnZsZXRXcmFwcGVyIHRlbXBXcmFwcGVyCisgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBKc3BTZXJ2bGV0V3JhcHBlcihjdHh0LmdldFNlcnZsZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHh0LmdldE9wdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0ZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQuZ2V0UnVudGltZUNvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwpIGN0eHQuZ2V0VGFnRmlsZUphclVybHMoKS5nZXQodGFnRmlsZVBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgdGFnQ2xhenogPSB0ZW1wV3JhcHBlci5sb2FkVGFnRmlsZVByb3RvdHlwZSgpOworICAgICAgICAgICAgICAgICAgICB0ZW1wVmVjdG9yLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wV3JhcHBlci5nZXRKc3BFbmdpbmVDb250ZXh0KCkuZ2V0Q29tcGlsZXIoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGFnQ2xhenogPSB3cmFwcGVyLmxvYWRUYWdGaWxlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB3cmFwcGVyLmRlY1RyaXBDb3VudCgpOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIEFkZCB0aGUgZGVwZW5kYW50cyBmb3IgdGhpcyB0YWcgZmlsZSB0byBpdHMgcGFyZW50J3MKKyAgICAgICAgICAgIC8vIGRlcGVuZGFudCBsaXN0LiAgVGhlIG9ubHkgcmVsaWFibGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgLy8gY2FuIG9ubHkgYmUgb2J0YWluZWQgZnJvbSB0aGUgdGFnIGluc3RhbmNlLgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3QgdGFnSW5zID0gdGFnQ2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICBpZiAodGFnSW5zIGluc3RhbmNlb2YgSnNwU291cmNlRGVwZW5kZW50KSB7CisgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICgoTGlzdCkgKChKc3BTb3VyY2VEZXBlbmRlbnQpIHRhZ0lucykuZ2V0RGVwZW5kYW50cygpKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFBhZ2VJbmZvLmFkZERlcGVuZGFudCgoU3RyaW5nKWl0ZXIubmV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9ycworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiB0YWdDbGF6ejsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBWaXNpdG9yIHdoaWNoIHNjYW5zIHRoZSBwYWdlIGFuZCBsb29rcyBmb3IgdGFnIGhhbmRsZXJzIHRoYXQgYXJlIHRhZworICAgICAqIGZpbGVzLCBjb21waWxpbmcgKGlmIG5lY2Vzc2FyeSkgYW5kIGxvYWRpbmcgdGhlbS4KKyAgICAgKi8gCisgICAgcHJpdmF0ZSBjbGFzcyBUYWdGaWxlTG9hZGVyVmlzaXRvciBleHRlbmRzIE5vZGUuVmlzaXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBDb21waWxlciBjb21waWxlcjsKKyAgICAgICAgcHJpdmF0ZSBQYWdlSW5mbyBwYWdlSW5mbzsKKworICAgICAgICBUYWdGaWxlTG9hZGVyVmlzaXRvcihDb21waWxlciBjb21waWxlcikgeworICAgICAgICAgICAgCisgICAgICAgICAgICB0aGlzLmNvbXBpbGVyID0gY29tcGlsZXI7CisgICAgICAgICAgICB0aGlzLnBhZ2VJbmZvID0gY29tcGlsZXIuZ2V0UGFnZUluZm8oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuQ3VzdG9tVGFnIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgVGFnRmlsZUluZm8gdGFnRmlsZUluZm8gPSBuLmdldFRhZ0ZpbGVJbmZvKCk7CisgICAgICAgICAgICBpZiAodGFnRmlsZUluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0YWdGaWxlUGF0aCA9IHRhZ0ZpbGVJbmZvLmdldFBhdGgoKTsKKwkJSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQgPSBjb21waWxlci5nZXRDb21waWxhdGlvbkNvbnRleHQoKTsKKwkJaWYgKGN0eHQuZ2V0VGFnRmlsZUphclVybHMoKS5nZXQodGFnRmlsZVBhdGgpID09IG51bGwpIHsKKwkJICAgIC8vIE9taXQgdGFnIGZpbGUgZGVwZW5kZW5jeSBpbmZvIG9uIGphciBmaWxlcyBmb3Igbm93LgorICAgICAgICAgICAgICAgICAgICBwYWdlSW5mby5hZGREZXBlbmRhbnQodGFnRmlsZVBhdGgpOworCQl9CisgICAgICAgICAgICAgICAgQ2xhc3MgYyA9IGxvYWRUYWdGaWxlKGNvbXBpbGVyLCB0YWdGaWxlUGF0aCwgbi5nZXRUYWdJbmZvKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvKTsKKyAgICAgICAgICAgICAgICBuLnNldFRhZ0hhbmRsZXJDbGFzcyhjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudHMgYSBwaGFzZSBvZiB0aGUgdHJhbnNsYXRpb24gdGhhdCBjb21waWxlcyAoaWYgbmVjZXNzYXJ5KQorICAgICAqIHRoZSB0YWcgZmlsZXMgdXNlZCBpbiBhIEpTUCBmaWxlcy4gIFRoZSBkaXJlY3RpdmVzIGluIHRoZSB0YWcgZmlsZXMKKyAgICAgKiBhcmUgYXNzdW1lZCB0byBoYXZlIGJlZW4gcHJvY2Nlc3NlZCBhbmQgZW5jYXBzdWxhdGVkIGFzIFRhZ0ZpbGVJbmZvCisgICAgICogaW4gdGhlIEN1c3RvbVRhZyBub2Rlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkVGFnRmlsZXMoQ29tcGlsZXIgY29tcGlsZXIsIE5vZGUuTm9kZXMgcGFnZSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICB0ZW1wVmVjdG9yID0gbmV3IFZlY3RvcigpOworICAgICAgICBwYWdlLnZpc2l0KG5ldyBUYWdGaWxlTG9hZGVyVmlzaXRvcihjb21waWxlcikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZWQgdGhlIGphdmEgYW5kIGNsYXNzIGZpbGVzIGZvciB0aGUgdGFnIHByb3RvdHlwZSAKKyAgICAgKiBnZW5lcmF0ZWQgZnJvbSB0aGUgY3VycmVudCBjb21waWxhdGlvbi4KKyAgICAgKiBAcGFyYW0gY2xhc3NGaWxlTmFtZSBJZiBub24tbnVsbCwgcmVtb3ZlIG9ubHkgdGhlIGNsYXNzIGZpbGUgd2l0aAorICAgICAqICAgICAgICB3aXRoIHRoaXMgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm90b1R5cGVGaWxlcyhTdHJpbmcgY2xhc3NGaWxlTmFtZSkgeworICAgICAgICBJdGVyYXRvciBpdGVyID0gdGVtcFZlY3Rvci5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIENvbXBpbGVyIGMgPSAoQ29tcGlsZXIpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGNsYXNzRmlsZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMucmVtb3ZlR2VuZXJhdGVkQ2xhc3NGaWxlcygpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjbGFzc0ZpbGVOYW1lLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0Q29tcGlsYXRpb25Db250ZXh0KCkuZ2V0Q2xhc3NGaWxlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGMucmVtb3ZlR2VuZXJhdGVkQ2xhc3NGaWxlcygpOworICAgICAgICAgICAgICAgIHRlbXBWZWN0b3IucmVtb3ZlKGMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9UYWdMaWJyYXJ5SW5mb0ltcGwuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvVGFnTGlicmFyeUluZm9JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4OWIxNwotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvVGFnTGlicmFyeUluZm9JbXBsLmphdmEKQEAgLTAsMCArMSw3NjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubmV0LkphclVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuRnVuY3Rpb25JbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5QYWdlRGF0YTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnQXR0cmlidXRlSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdGaWxlSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnTGlicmFyeUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0xpYnJhcnlWYWxpZGF0b3I7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ1ZhcmlhYmxlSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVmFsaWRhdGlvbk1lc3NhZ2U7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlZhcmlhYmxlSW5mbzsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Kc3BDb21waWxhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIueG1scGFyc2VyLlBhcnNlclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlci5UcmVlTm9kZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGFnTGlicmFyeUluZm8gY2xhc3MgZnJvbSB0aGUgSlNQIHNwZWMuIAorICoKKyAqIEBhdXRob3IgQW5pbCBLLiBWaWplbmRyYW4KKyAqIEBhdXRob3IgTWFuZGFyIFJhamUKKyAqIEBhdXRob3IgUGllcnJlIERlbGlzbGUKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICogQGF1dGhvciBKYW4gTHVlaGUKKyAqLworY2xhc3MgVGFnTGlicmFyeUluZm9JbXBsIGV4dGVuZHMgVGFnTGlicmFyeUluZm8gaW1wbGVtZW50cyBUYWdDb25zdGFudHMgeworCisgICAgLy8gTG9nZ2VyCisgICAgcHJpdmF0ZSBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVGFnTGlicmFyeUluZm9JbXBsLmNsYXNzKTsKKworICAgIHByaXZhdGUgSGFzaHRhYmxlIGphckVudHJpZXM7CisgICAgcHJpdmF0ZSBKc3BDb21waWxhdGlvbkNvbnRleHQgY3R4dDsKKyAgICBwcml2YXRlIEVycm9yRGlzcGF0Y2hlciBlcnI7CisgICAgcHJpdmF0ZSBQYXJzZXJDb250cm9sbGVyIHBhcnNlckNvbnRyb2xsZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgcHJpbnQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSwgUHJpbnRXcml0ZXIgdykgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgdy5wcmludChuYW1lKyIgPSB7XG5cdCIpOworICAgICAgICAgICAgdy5wcmludCh2YWx1ZSk7CisgICAgICAgICAgICB3LnByaW50KCJcbn1cbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBQcmludFdyaXRlciBvdXQgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOworICAgICAgICBwcmludCgidGxpYnZlcnNpb24iLCB0bGlidmVyc2lvbiwgb3V0KTsKKyAgICAgICAgcHJpbnQoImpzcHZlcnNpb24iLCBqc3B2ZXJzaW9uLCBvdXQpOworICAgICAgICBwcmludCgic2hvcnRuYW1lIiwgc2hvcnRuYW1lLCBvdXQpOworICAgICAgICBwcmludCgidXJuIiwgdXJuLCBvdXQpOworICAgICAgICBwcmludCgiaW5mbyIsIGluZm8sIG91dCk7CisgICAgICAgIHByaW50KCJ1cmkiLCB1cmksIG91dCk7CisgICAgICAgIHByaW50KCJ0YWdMaWJyYXJ5VmFsaWRhdG9yIiwgIiIgKyB0YWdMaWJyYXJ5VmFsaWRhdG9yLCBvdXQpOworCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgb3V0LnByaW50bG4odGFnc1tpXS50b1N0cmluZygpKTsKKyAgICAgICAgCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCB0YWdGaWxlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIG91dC5wcmludGxuKHRhZ0ZpbGVzW2ldLnRvU3RyaW5nKCkpOworICAgICAgICAKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGZ1bmN0aW9ucy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIG91dC5wcmludGxuKGZ1bmN0aW9uc1tpXS50b1N0cmluZygpKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBzdy50b1N0cmluZygpOworICAgIH0KKyAgICAKKyAgICAvLyBYWFggRklYTUUKKyAgICAvLyByZXNvbHZlUmVsYXRpdmVVcmkgYW5kL29yIGdldFJlc291cmNlQXNTdHJlYW0gZG9uJ3Qgc2VlbSB0byBwcm9wZXJseQorICAgIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB3aGVuIGRlYWxpbmcgd2hlbiBob21lIGFuZCBnZXREb2NCYXNlIGFyZSBzZXQKKyAgICAvLyB0aGUgZm9sbG93aW5nIGlzIGEgd29ya2Fyb3VuZCB1bnRpbCB0aGVzZSBwcm9ibGVtcyBhcmUgcmVzb2x2ZWQuCisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyB1cmkpIAorICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIAorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHNlZSBpZiBmaWxlIGV4aXN0cyBvbiB0aGUgZmlsZXN5c3RlbSBmaXJzdAorICAgICAgICAgICAgU3RyaW5nIHJlYWwgPSBjdHh0LmdldFJlYWxQYXRoKHVyaSk7CisgICAgICAgICAgICBpZiAocmVhbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN0eHQuZ2V0UmVzb3VyY2VBc1N0cmVhbSh1cmkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShyZWFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBpZiBmaWxlIG5vdCBmb3VuZCBvbiBmaWxlc3lzdGVtLCBnZXQgdGhlIHJlc291cmNlIHRocm91Z2gKKyAgICAgICAgICAgIC8vIHRoZSBjb250ZXh0CisgICAgICAgICAgICByZXR1cm4gY3R4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKHVyaSk7CisgICAgICAgIH0KKyAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnTGlicmFyeUluZm9JbXBsKEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VyQ29udHJvbGxlciBwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckRpc3BhdGNoZXIgZXJyKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIocHJlZml4LCB1cmlJbik7CisKKyAgICAgICAgdGhpcy5jdHh0ID0gY3R4dDsKKyAgICAgICAgdGhpcy5wYXJzZXJDb250cm9sbGVyID0gcGM7CisgICAgICAgIHRoaXMuZXJyID0gZXJyOworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisgICAgICAgIEphckZpbGUgamFyRmlsZSA9IG51bGw7CisKKyAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRoZSBVUkkgcG9pbnRzIHRvIHRoZSBUTEQgaXRzZWxmIG9yIHRvIGEgSkFSIGZpbGUgaW4gd2hpY2ggdGhlCisgICAgICAgICAgICAvLyBUTEQgaXMgc3RvcmVkCisgICAgICAgICAgICBsb2NhdGlvbiA9IGdlbmVyYXRlVExETG9jYXRpb24odXJpLCBjdHh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIWxvY2F0aW9uWzBdLmVuZHNXaXRoKCJqYXIiKSkgeworICAgICAgICAgICAgICAgIC8vIExvY2F0aW9uIHBvaW50cyB0byBUTEQgZmlsZQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGluID0gZ2V0UmVzb3VyY2VBc1N0cmVhbShsb2NhdGlvblswXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGxvY2F0aW9uWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci5maWxlLm5vdC5mb3VuZCIsIGxvY2F0aW9uWzBdKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwYXJzZVRMRChjdHh0LCBsb2NhdGlvblswXSwgaW4sIG51bGwpOworICAgICAgICAgICAgICAgIC8vIEFkZCBUTEQgdG8gZGVwZW5kZW5jeSBsaXN0CisgICAgICAgICAgICAgICAgUGFnZUluZm8gcGFnZUluZm8gPSBjdHh0LmNyZWF0ZUNvbXBpbGVyKCkuZ2V0UGFnZUluZm8oKTsKKyAgICAgICAgICAgICAgICBpZiAocGFnZUluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYWdlSW5mby5hZGREZXBlbmRhbnQobG9jYXRpb25bMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGFnIGxpYnJhcnkgaXMgcGFja2FnZWQgaW4gSkFSIGZpbGUKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBVUkwgamFyRmlsZVVybCA9IG5ldyBVUkwoImphcjoiICsgbG9jYXRpb25bMF0gKyAiIS8iKTsKKyAgICAgICAgICAgICAgICAgICAgSmFyVVJMQ29ubmVjdGlvbiBjb25uID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChKYXJVUkxDb25uZWN0aW9uKSBqYXJGaWxlVXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uc2V0VXNlQ2FjaGVzKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgY29ubi5jb25uZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIGphckZpbGUgPSBjb25uLmdldEphckZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgWmlwRW50cnkgamFyRW50cnkgPSBqYXJGaWxlLmdldEVudHJ5KGxvY2F0aW9uWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgaW4gPSBqYXJGaWxlLmdldElucHV0U3RyZWFtKGphckVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VUTEQoY3R4dCwgbG9jYXRpb25bMF0sIGluLCBqYXJGaWxlVXJsKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IudGxkLnVuYWJsZV90b19yZWFkIiwgbG9jYXRpb25bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvblsxXSwgZXgudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7fQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGphckZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGphckZpbGUuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkge30KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorICAgIAorICAgIC8qCisgICAgICogQHBhcmFtIGN0eHQgVGhlIEpTUCBjb21waWxhdGlvbiBjb250ZXh0CisgICAgICogQHBhcmFtIHVyaSBUaGUgVExEJ3MgdXJpCisgICAgICogQHBhcmFtIGluIFRoZSBUTEQncyBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0gamFyRmlsZVVybCBUaGUgSkFSIGZpbGUgY29udGFpbmluZyB0aGUgVExELCBvciBudWxsIGlmIHRoZSB0YWcKKyAgICAgKiBsaWJyYXJ5IGlzIG5vdCBwYWNrYWdlZCBpbiBhIEpBUgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVRMRChKc3BDb21waWxhdGlvbkNvbnRleHQgY3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW4sIFVSTCBqYXJGaWxlVXJsKSAKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgVmVjdG9yIHRhZ1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgVmVjdG9yIHRhZ0ZpbGVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIEhhc2h0YWJsZSBmdW5jdGlvblRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgICAgIC8vIENyZWF0ZSBhbiBpdGVyYXRvciBvdmVyIHRoZSBjaGlsZCBlbGVtZW50cyBvZiBvdXIgPHRhZ2xpYj4gZWxlbWVudAorICAgICAgICBQYXJzZXJVdGlscyBwdSA9IG5ldyBQYXJzZXJVdGlscygpOworICAgICAgICBUcmVlTm9kZSB0bGQgPSBwdS5wYXJzZVhNTERvY3VtZW50KHVyaSwgaW4pOworCisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgPHRhZ2xpYj4gcm9vdCBlbGVtZW50IGNvbnRhaW5zIGEgJ3ZlcnNpb24nCisgICAgICAgIC8vIGF0dHJpYnV0ZSwgd2hpY2ggd2FzIGFkZGVkIGluIEpTUCAyLjAgdG8gcmVwbGFjZSB0aGUgPGpzcC12ZXJzaW9uPgorICAgICAgICAvLyBzdWJlbGVtZW50CisgICAgICAgIHRoaXMuanNwdmVyc2lvbiA9IHRsZC5maW5kQXR0cmlidXRlKCJ2ZXJzaW9uIik7CisKKyAgICAgICAgLy8gUHJvY2VzcyBlYWNoIGNoaWxkIGVsZW1lbnQgb2Ygb3VyIDx0YWdsaWI+IGVsZW1lbnQKKyAgICAgICAgSXRlcmF0b3IgbGlzdCA9IHRsZC5maW5kQ2hpbGRyZW4oKTsKKworICAgICAgICB3aGlsZSAobGlzdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFRyZWVOb2RlIGVsZW1lbnQgPSAoVHJlZU5vZGUpIGxpc3QubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHRuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7CisKKyAgICAgICAgICAgIGlmICgidGxpYnZlcnNpb24iLmVxdWFscyh0bmFtZSkgICAgICAgICAgICAgICAgICAgIC8vIEpTUCAxLjEKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICJ0bGliLXZlcnNpb24iLmVxdWFscyh0bmFtZSkpIHsgICAgIC8vIEpTUCAxLjIKKyAgICAgICAgICAgICAgICB0aGlzLnRsaWJ2ZXJzaW9uID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJqc3B2ZXJzaW9uIi5lcXVhbHModG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAianNwLXZlcnNpb24iLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmpzcHZlcnNpb24gPSBlbGVtZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoInNob3J0bmFtZSIuZXF1YWxzKHRuYW1lKSB8fAorICAgICAgICAgICAgICAgICAgICAgInNob3J0LW5hbWUiLmVxdWFscyh0bmFtZSkpCisgICAgICAgICAgICAgICAgdGhpcy5zaG9ydG5hbWUgPSBlbGVtZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCJ1cmkiLmVxdWFscyh0bmFtZSkpCisgICAgICAgICAgICAgICAgdGhpcy51cm4gPSBlbGVtZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCJpbmZvIi5lcXVhbHModG5hbWUpIHx8CisgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iLmVxdWFscyh0bmFtZSkpCisgICAgICAgICAgICAgICAgdGhpcy5pbmZvID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICBlbHNlIGlmICgidmFsaWRhdG9yIi5lcXVhbHModG5hbWUpKQorICAgICAgICAgICAgICAgIHRoaXMudGFnTGlicmFyeVZhbGlkYXRvciA9IGNyZWF0ZVZhbGlkYXRvcihlbGVtZW50KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCJ0YWciLmVxdWFscyh0bmFtZSkpCisgICAgICAgICAgICAgICAgdGFnVmVjdG9yLmFkZEVsZW1lbnQoY3JlYXRlVGFnSW5mbyhlbGVtZW50LCBqc3B2ZXJzaW9uKSk7CisgICAgICAgICAgICBlbHNlIGlmICgidGFnLWZpbGUiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICBUYWdGaWxlSW5mbyB0YWdGaWxlSW5mbyA9IGNyZWF0ZVRhZ0ZpbGVJbmZvKGVsZW1lbnQsIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphckZpbGVVcmwpOworICAgICAgICAgICAgICAgIHRhZ0ZpbGVWZWN0b3IuYWRkRWxlbWVudCh0YWdGaWxlSW5mbyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJmdW5jdGlvbiIuZXF1YWxzKHRuYW1lKSkgeyAgICAgICAgIC8vIEpTUDIuMAorICAgICAgICAgICAgICAgIEZ1bmN0aW9uSW5mbyBmdW5jSW5mbyA9IGNyZWF0ZUZ1bmN0aW9uSW5mbyhlbGVtZW50KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZnVuY05hbWUgPSBmdW5jSW5mby5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uVGFibGUuY29udGFpbnNLZXkoZnVuY05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnRsZC5mbi5kdXBsaWNhdGUubmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jTmFtZSwgdXJpKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmdW5jdGlvblRhYmxlLnB1dChmdW5jTmFtZSwgZnVuY0luZm8pOworICAgICAgICAgICAgfSBlbHNlIGlmICgiZGlzcGxheS1uYW1lIi5lcXVhbHModG5hbWUpIHx8ICAgIC8vIElnbm9yZWQgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICJzbWFsbC1pY29uIi5lcXVhbHModG5hbWUpIHx8CisgICAgICAgICAgICAgICAgICAgICAibGFyZ2UtaWNvbiIuZXF1YWxzKHRuYW1lKSB8fAorICAgICAgICAgICAgICAgICAgICAgImxpc3RlbmVyIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfSBlbHNlIGlmICgidGFnbGliLWV4dGVuc2lvbiIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIFJlY29nbml6ZWQgYnV0IGlnbm9yZWQKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi50YWdsaWIiLCB0bmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRsaWJ2ZXJzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnRsZC5tYW5kYXRvcnkuZWxlbWVudC5taXNzaW5nIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgInRsaWItdmVyc2lvbiIpOworICAgICAgICB9CisgICAgICAgIGlmIChqc3B2ZXJzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnRsZC5tYW5kYXRvcnkuZWxlbWVudC5taXNzaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAianNwLXZlcnNpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMudGFncyA9IG5ldyBUYWdJbmZvW3RhZ1ZlY3Rvci5zaXplKCldOworICAgICAgICB0YWdWZWN0b3IuY29weUludG8gKHRoaXMudGFncyk7CisKKyAgICAgICAgdGhpcy50YWdGaWxlcyA9IG5ldyBUYWdGaWxlSW5mb1t0YWdGaWxlVmVjdG9yLnNpemUoKV07CisgICAgICAgIHRhZ0ZpbGVWZWN0b3IuY29weUludG8gKHRoaXMudGFnRmlsZXMpOworCisgICAgICAgIHRoaXMuZnVuY3Rpb25zID0gbmV3IEZ1bmN0aW9uSW5mb1tmdW5jdGlvblRhYmxlLnNpemUoKV07CisgICAgICAgIGludCBpPTA7CisgICAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gZnVuY3Rpb25UYWJsZS5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25zW2krK10gPSAoRnVuY3Rpb25JbmZvKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qCisgICAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBUTEQKKyAgICAgKiBAcGFyYW0gY3R4dCBUaGUgY29tcGlsYXRpb24gY29udGV4dAorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgYXJyYXkgd2hvc2UgZmlyc3QgZWxlbWVudCBkZW5vdGVzIHRoZSBwYXRoIHRvIHRoZSBUTEQuCisgICAgICogSWYgdGhlIHBhdGggdG8gdGhlIFRMRCBwb2ludHMgdG8gYSBqYXIgZmlsZSwgdGhlbiB0aGUgc2Vjb25kIGVsZW1lbnQKKyAgICAgKiBkZW5vdGVzIHRoZSBuYW1lIG9mIHRoZSBUTEQgZW50cnkgaW4gdGhlIGphciBmaWxlLCB3aGljaCBpcyBoYXJkY29kZWQKKyAgICAgKiB0byBNRVRBLUlORi90YWdsaWIudGxkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nW10gZ2VuZXJhdGVUTERMb2NhdGlvbihTdHJpbmcgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc3BDb21waWxhdGlvbkNvbnRleHQgY3R4dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgdXJpVHlwZSA9IFRsZExvY2F0aW9uc0NhY2hlLnVyaVR5cGUodXJpKTsKKyAgICAgICAgaWYgKHVyaVR5cGUgPT0gVGxkTG9jYXRpb25zQ2FjaGUuQUJTX1VSSSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IudGFnbGliRGlyZWN0aXZlLmFic1VyaUNhbm5vdEJlUmVzb2x2ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVyaSk7CisgICAgICAgIH0gZWxzZSBpZiAodXJpVHlwZSA9PSBUbGRMb2NhdGlvbnNDYWNoZS5OT1JPT1RfUkVMX1VSSSkgeworICAgICAgICAgICAgdXJpID0gY3R4dC5yZXNvbHZlUmVsYXRpdmVVcmkodXJpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ1tdIGxvY2F0aW9uID0gbmV3IFN0cmluZ1syXTsKKyAgICAgICAgbG9jYXRpb25bMF0gPSB1cmk7CisgICAgICAgIGlmIChsb2NhdGlvblswXS5lbmRzV2l0aCgiamFyIikpIHsKKyAgICAgICAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB1cmwgPSBjdHh0LmdldFJlc291cmNlKGxvY2F0aW9uWzBdKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnRsZC51bmFibGVfdG9fZ2V0X2phciIsIGxvY2F0aW9uWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnRsZC5taXNzaW5nX2phciIsIGxvY2F0aW9uWzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2F0aW9uWzBdID0gdXJsLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBsb2NhdGlvblsxXSA9ICJNRVRBLUlORi90YWdsaWIudGxkIjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsb2NhdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIFRhZ0luZm8gY3JlYXRlVGFnSW5mbyhUcmVlTm9kZSBlbGVtLCBTdHJpbmcganNwVmVyc2lvbikKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyB0YWdOYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHRhZ0NsYXNzTmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyB0ZWlDbGFzc05hbWUgPSBudWxsOworCisgICAgICAgIC8qCisgICAgICAgICAqIERlZmF1bHQgYm9keSBjb250ZW50IGZvciBKU1AgMS4yIHRhZyBoYW5kbGVycyAoPGJvZHktY29udGVudD4gaGFzCisgICAgICAgICAqIGJlY29tZSBtYW5kYXRvcnkgaW4gSlNQIDIuMCwgYmVjYXVzZSB0aGUgZGVmYXVsdCB3b3VsZCBiZSBpbnZhbGlkCisgICAgICAgICAqIGZvciBzaW1wbGUgdGFnIGhhbmRsZXJzKQorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIGJvZHljb250ZW50ID0gIkpTUCI7CisKKyAgICAgICAgU3RyaW5nIGluZm8gPSBudWxsOworICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgc21hbGxJY29uID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGxhcmdlSWNvbiA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gZHluYW1pY0F0dHJpYnV0ZXMgPSBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIFZlY3RvciBhdHRyaWJ1dGVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIFZlY3RvciB2YXJpYWJsZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgSXRlcmF0b3IgbGlzdCA9IGVsZW0uZmluZENoaWxkcmVuKCk7CisgICAgICAgIHdoaWxlIChsaXN0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgVHJlZU5vZGUgZWxlbWVudCA9IChUcmVlTm9kZSkgbGlzdC5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgdG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKKworICAgICAgICAgICAgaWYgKCJuYW1lIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgidGFnY2xhc3MiLmVxdWFscyh0bmFtZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICJ0YWctY2xhc3MiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0YWdDbGFzc05hbWUgPSBlbGVtZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoInRlaWNsYXNzIi5lcXVhbHModG5hbWUpIHx8CisgICAgICAgICAgICAgICAgICAgICAidGVpLWNsYXNzIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGVpQ2xhc3NOYW1lID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJib2R5Y29udGVudCIuZXF1YWxzKHRuYW1lKSB8fAorICAgICAgICAgICAgICAgICAgICAgImJvZHktY29udGVudCIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIGJvZHljb250ZW50ID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJkaXNwbGF5LW5hbWUiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZSA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgic21hbGwtaWNvbiIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIHNtYWxsSWNvbiA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgibGFyZ2UtaWNvbiIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIGxhcmdlSWNvbiA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiaWNvbiIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIFRyZWVOb2RlIGljb24gPSBlbGVtZW50LmZpbmRDaGlsZCgic21hbGwtaWNvbiIpOworICAgICAgICAgICAgICAgIGlmIChpY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc21hbGxJY29uID0gaWNvbi5nZXRCb2R5KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGljb24gPSBlbGVtZW50LmZpbmRDaGlsZCgibGFyZ2UtaWNvbiIpOworICAgICAgICAgICAgICAgIGlmIChpY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VJY29uID0gaWNvbi5nZXRCb2R5KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgiaW5mbyIuZXF1YWxzKHRuYW1lKSB8fAorICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgaW5mbyA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgidmFyaWFibGUiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICB2YXJpYWJsZVZlY3Rvci5hZGRFbGVtZW50KGNyZWF0ZVZhcmlhYmxlKGVsZW1lbnQpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImF0dHJpYnV0ZSIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZlY3Rvci5hZGRFbGVtZW50KGNyZWF0ZUF0dHJpYnV0ZShlbGVtZW50LCBqc3BWZXJzaW9uKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJkeW5hbWljLWF0dHJpYnV0ZXMiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICBkeW5hbWljQXR0cmlidXRlcyA9IEpzcFV0aWwuYm9vbGVhblZhbHVlKGVsZW1lbnQuZ2V0Qm9keSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImV4YW1wbGUiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmVkIGVsZW1lbnRzCisgICAgICAgICAgICB9IGVsc2UgaWYgKCJ0YWctZXh0ZW5zaW9uIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlZAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLnRhZyIsIHRuYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVGFnRXh0cmFJbmZvIHRlaSA9IG51bGw7CisgICAgICAgIGlmICh0ZWlDbGFzc05hbWUgIT0gbnVsbCAmJiAhdGVpQ2xhc3NOYW1lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgdGVpQ2xhc3MgPSBjdHh0LmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKHRlaUNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgdGVpID0gKFRhZ0V4dHJhSW5mbykgdGVpQ2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IudGVpY2xhc3MuaW5zdGFudGlhdGlvbiIsIHRlaUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBUYWdBdHRyaWJ1dGVJbmZvW10gdGFnQXR0cmlidXRlSW5mbworICAgICAgICAgICAgPSBuZXcgVGFnQXR0cmlidXRlSW5mb1thdHRyaWJ1dGVWZWN0b3Iuc2l6ZSgpXTsKKyAgICAgICAgYXR0cmlidXRlVmVjdG9yLmNvcHlJbnRvKHRhZ0F0dHJpYnV0ZUluZm8pOworCisgICAgICAgIFRhZ1ZhcmlhYmxlSW5mb1tdIHRhZ1ZhcmlhYmxlSW5mb3MKKyAgICAgICAgICAgID0gbmV3IFRhZ1ZhcmlhYmxlSW5mb1t2YXJpYWJsZVZlY3Rvci5zaXplKCldOworICAgICAgICB2YXJpYWJsZVZlY3Rvci5jb3B5SW50byh0YWdWYXJpYWJsZUluZm9zKTsKKworICAgICAgICBUYWdJbmZvIHRhZ2luZm8gPSBuZXcgVGFnSW5mbyh0YWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHljb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdBdHRyaWJ1dGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxJY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXJnZUljb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1ZhcmlhYmxlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNBdHRyaWJ1dGVzKTsKKyAgICAgICAgcmV0dXJuIHRhZ2luZm87CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQYXJzZXMgdGhlIHRhZyBmaWxlIGRpcmVjdGl2ZXMgb2YgdGhlIGdpdmVuIFRhZ0ZpbGUgYW5kIHR1cm5zIHRoZW0gaW50bworICAgICAqIGEgVGFnSW5mby4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtIFRoZSA8dGFnLWZpbGU+IGVsZW1lbnQgaW4gdGhlIFRMRAorICAgICAqIEBwYXJhbSB1cmkgVGhlIGxvY2F0aW9uIG9mIHRoZSBUTEQsIGluIGNhc2UgdGhlIHRhZyBmaWxlIGlzIHNwZWNpZmllZAorICAgICAqIHJlbGF0aXZlIHRvIGl0CisgICAgICogQHBhcmFtIGphckZpbGUgVGhlIEpBUiBmaWxlLCBpbiBjYXNlIHRoZSB0YWcgZmlsZSBpcyBwYWNrYWdlZCBpbiBhIEpBUgorICAgICAqCisgICAgICogQHJldHVybiBUYWdJbmZvIGNvcnJlc3BvZGluZyB0byB0YWcgZmlsZSBkaXJlY3RpdmVzCisgICAgICovCisgICAgcHJpdmF0ZSBUYWdGaWxlSW5mbyBjcmVhdGVUYWdGaWxlSW5mbyhUcmVlTm9kZSBlbGVtLCBTdHJpbmcgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMIGphckZpbGVVcmwpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7CisKKyAgICAgICAgSXRlcmF0b3IgbGlzdCA9IGVsZW0uZmluZENoaWxkcmVuKCk7CisgICAgICAgIHdoaWxlIChsaXN0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgVHJlZU5vZGUgY2hpbGQgPSAoVHJlZU5vZGUpIGxpc3QubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHRuYW1lID0gY2hpbGQuZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKCJuYW1lIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IGNoaWxkLmdldEJvZHkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoInBhdGgiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICBwYXRoID0gY2hpbGQuZ2V0Qm9keSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiZXhhbXBsZSIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZSA8ZXhhbXBsZT4gZWxlbWVudDogQnVnemlsbGEgMzM1MzgKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoInRhZy1leHRlbnNpb24iLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgPHRhZy1leHRlbnNpb24+IGVsZW1lbnQ6IEJ1Z3ppbGxhIDMzNTM4CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJpY29uIi5lcXVhbHModG5hbWUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAiZGlzcGxheS1uYW1lIi5lcXVhbHModG5hbWUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aGVzZSBlbGVtZW50czogQnVnemlsbGEgMzgwMTUKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi50YWdmaWxlIiwgdG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvTUVUQS1JTkYvdGFncyIpKSB7CisgICAgICAgICAgICAvLyBUYWcgZmlsZSBwYWNrYWdlZCBpbiBKQVIKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIGphckZpbGVVcmwgaXMgbm90IG51bGwgYmVmb3JlIGFkZGluZyBpdCwgb3IgdGhpcyB3aWxsCisgICAgICAgICAgICAvLyBjYXVzZSBhIE5QRS4KKyAgICAgICAgICAgIGlmIChqYXJGaWxlVXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjdHh0LmdldFRhZ0ZpbGVKYXJVcmxzKCkucHV0KHBhdGgsIGphckZpbGVVcmwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoIi9XRUItSU5GL3RhZ3MiKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IudGFnZmlsZS5pbGxlZ2FsUGF0aCIsIHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgVGFnSW5mbyB0YWdJbmZvCisgICAgICAgICAgICA9IFRhZ0ZpbGVQcm9jZXNzb3IucGFyc2VUYWdGaWxlRGlyZWN0aXZlcyhwYXJzZXJDb250cm9sbGVyLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgdGhpcyk7CisgICAgICAgIHJldHVybiBuZXcgVGFnRmlsZUluZm8obmFtZSwgcGF0aCwgdGFnSW5mbyk7CisgICAgfQorCisgICAgVGFnQXR0cmlidXRlSW5mbyBjcmVhdGVBdHRyaWJ1dGUoVHJlZU5vZGUgZWxlbSwgU3RyaW5nIGpzcFZlcnNpb24pIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgdHlwZSA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gcmVxdWlyZWQgPSBmYWxzZSwgcnRleHBydmFsdWUgPSBmYWxzZSwgcmVxVGltZSA9IGZhbHNlLAorICAgICAgICAgICAgaXNGcmFnbWVudCA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgSXRlcmF0b3IgbGlzdCA9IGVsZW0uZmluZENoaWxkcmVuKCk7CisgICAgICAgIHdoaWxlIChsaXN0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgVHJlZU5vZGUgZWxlbWVudCA9IChUcmVlTm9kZSkgbGlzdC5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgdG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKKworICAgICAgICAgICAgaWYgKCJuYW1lIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgicmVxdWlyZWQiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgICAgIGlmIChzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gSnNwVXRpbC5ib29sZWFuVmFsdWUocyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJydGV4cHJ2YWx1ZSIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBzID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcnRleHBydmFsdWUgPSBKc3BVdGlsLmJvb2xlYW5WYWx1ZShzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoInR5cGUiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICAgICAgaWYgKCIxLjIiLmVxdWFscyhqc3BWZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHR5cGUuZXF1YWxzKCJCb29sZWFuIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlLmVxdWFscygiQnl0ZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZS5lcXVhbHMoIkNoYXJhY3RlciIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZS5lcXVhbHMoIkRvdWJsZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZS5lcXVhbHMoIkZsb2F0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlLmVxdWFscygiSW50ZWdlciIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZS5lcXVhbHMoIkxvbmciKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUuZXF1YWxzKCJPYmplY3QiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUuZXF1YWxzKCJTaG9ydCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZS5lcXVhbHMoIlN0cmluZyIpKSkgeworICAgICAgICAgICAgICAgICAgICB0eXBlID0gImphdmEubGFuZy4iICsgdHlwZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJmcmFnbWVudCIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBzID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpc0ZyYWdtZW50ID0gSnNwVXRpbC5ib29sZWFuVmFsdWUocyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgiZGVzY3JpcHRpb24iLmVxdWFscyh0bmFtZSkgfHwgICAgLy8gSWdub3JlZCBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkgeworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi5hdHRyaWJ1dGUiLCB0bmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0ZyYWdtZW50KSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQWNjb3JkaW5nIHRvIEpTUC5DLTMgKCJUTEQgU2NoZW1hIEVsZW1lbnQgU3RydWN0dXJlIC0gdGFnIiksIAorICAgICAgICAgICAgICogJ3R5cGUnIGFuZCAncnRleHBydmFsdWUnIG11c3Qgbm90IGJlIHNwZWNpZmllZCBpZiAnZnJhZ21lbnQnCisgICAgICAgICAgICAgKiBoYXMgYmVlbiBzcGVjaWZpZWQgKHRoaXMgd2lsbCBiZSBlbmZvcmNlZCBieSB2YWxpZGF0aW5nIHBhcnNlcikuCisgICAgICAgICAgICAgKiBBbHNvLCBpZiAnZnJhZ21lbnQnIGlzIFRSVUUsICd0eXBlJyBpcyBmaXhlZCBhdAorICAgICAgICAgICAgICogamF2YXguc2VydmxldC5qc3AudGFnZXh0LkpzcEZyYWdtZW50LCBhbmQgJ3J0ZXhwcnZhbHVlJyBpcworICAgICAgICAgICAgICogZml4ZWQgYXQgdHJ1ZS4gU2VlIGFsc28gSlNQLjguNS4yLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0eXBlID0gImphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BGcmFnbWVudCI7CisgICAgICAgICAgICBydGV4cHJ2YWx1ZSA9IHRydWU7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghcnRleHBydmFsdWUpIHsKKyAgICAgICAgICAgIC8vIEFjY29yZGluZyB0byBKU1Agc3BlYywgZm9yIHN0YXRpYyB2YWx1ZXMgKHRob3NlIGRldGVybWluZWQgYXQKKyAgICAgICAgICAgIC8vIHRyYW5zbGF0aW9uIHRpbWUpIHRoZSB0eXBlIGlzIGZpeGVkIGF0IGphdmEubGFuZy5TdHJpbmcuCisgICAgICAgICAgICB0eXBlID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBUYWdBdHRyaWJ1dGVJbmZvKG5hbWUsIHJlcXVpcmVkLCB0eXBlLCBydGV4cHJ2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRnJhZ21lbnQpOworICAgIH0KKworICAgIFRhZ1ZhcmlhYmxlSW5mbyBjcmVhdGVWYXJpYWJsZShUcmVlTm9kZSBlbGVtKSB7CisgICAgICAgIFN0cmluZyBuYW1lR2l2ZW4gPSBudWxsOworICAgICAgICBTdHJpbmcgbmFtZUZyb21BdHRyaWJ1dGUgPSBudWxsOworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICBib29sZWFuIGRlY2xhcmUgPSB0cnVlOworICAgICAgICBpbnQgc2NvcGUgPSBWYXJpYWJsZUluZm8uTkVTVEVEOworCisgICAgICAgIEl0ZXJhdG9yIGxpc3QgPSBlbGVtLmZpbmRDaGlsZHJlbigpOworICAgICAgICB3aGlsZSAobGlzdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFRyZWVOb2RlIGVsZW1lbnQgPSAoVHJlZU5vZGUpIGxpc3QubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHRuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAoIm5hbWUtZ2l2ZW4iLmVxdWFscyh0bmFtZSkpCisgICAgICAgICAgICAgICAgbmFtZUdpdmVuID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICBlbHNlIGlmICgibmFtZS1mcm9tLWF0dHJpYnV0ZSIuZXF1YWxzKHRuYW1lKSkKKyAgICAgICAgICAgICAgICBuYW1lRnJvbUF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgZWxzZSBpZiAoInZhcmlhYmxlLWNsYXNzIi5lcXVhbHModG5hbWUpKQorICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgZWxzZSBpZiAoImRlY2xhcmUiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgICAgIGlmIChzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGRlY2xhcmUgPSBKc3BVdGlsLmJvb2xlYW5WYWx1ZShzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoInNjb3BlIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBlbGVtZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgICAgICBpZiAocyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgiTkVTVEVEIi5lcXVhbHMocykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlID0gVmFyaWFibGVJbmZvLk5FU1RFRDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiQVRfQkVHSU4iLmVxdWFscyhzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUgPSBWYXJpYWJsZUluZm8uQVRfQkVHSU47CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIkFUX0VORCIuZXF1YWxzKHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY29wZSA9IFZhcmlhYmxlSW5mby5BVF9FTkQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJkZXNjcmlwdGlvbiIuZXF1YWxzKHRuYW1lKSB8fCAgICAvLyBJZ25vcmVkIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICBmYWxzZSApIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi52YXJpYWJsZSIsIHRuYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgVGFnVmFyaWFibGVJbmZvKG5hbWVHaXZlbiwgbmFtZUZyb21BdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwgZGVjbGFyZSwgc2NvcGUpOworICAgIH0KKworICAgIHByaXZhdGUgVGFnTGlicmFyeVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoVHJlZU5vZGUgZWxlbSkKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyB2YWxpZGF0b3JDbGFzcyA9IG51bGw7CisgICAgICAgIE1hcCBpbml0UGFyYW1zID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgICAgIEl0ZXJhdG9yIGxpc3QgPSBlbGVtLmZpbmRDaGlsZHJlbigpOworICAgICAgICB3aGlsZSAobGlzdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFRyZWVOb2RlIGVsZW1lbnQgPSAoVHJlZU5vZGUpIGxpc3QubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHRuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAoInZhbGlkYXRvci1jbGFzcyIuZXF1YWxzKHRuYW1lKSkKKyAgICAgICAgICAgICAgICB2YWxpZGF0b3JDbGFzcyA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgZWxzZSBpZiAoImluaXQtcGFyYW0iLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBpbml0UGFyYW0gPSBjcmVhdGVJbml0UGFyYW0oZWxlbWVudCk7CisgICAgICAgICAgICAgICAgaW5pdFBhcmFtcy5wdXQoaW5pdFBhcmFtWzBdLCBpbml0UGFyYW1bMV0pOworICAgICAgICAgICAgfSBlbHNlIGlmICgiZGVzY3JpcHRpb24iLmVxdWFscyh0bmFtZSkgfHwgICAgLy8gSWdub3JlZCBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKSB7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4udmFsaWRhdG9yIiwgdG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBUYWdMaWJyYXJ5VmFsaWRhdG9yIHRsdiA9IG51bGw7CisgICAgICAgIGlmICh2YWxpZGF0b3JDbGFzcyAhPSBudWxsICYmICF2YWxpZGF0b3JDbGFzcy5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzIHRsdkNsYXNzID0gCisgICAgICAgICAgICAgICAgICAgIGN0eHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3ModmFsaWRhdG9yQ2xhc3MpOworICAgICAgICAgICAgICAgIHRsdiA9IChUYWdMaWJyYXJ5VmFsaWRhdG9yKXRsdkNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnRsdmNsYXNzLmluc3RhbnRpYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JDbGFzcywgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRsdiAhPSBudWxsKSB7CisgICAgICAgICAgICB0bHYuc2V0SW5pdFBhcmFtZXRlcnMoaW5pdFBhcmFtcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRsdjsKKyAgICB9CisKKyAgICBTdHJpbmdbXSBjcmVhdGVJbml0UGFyYW0oVHJlZU5vZGUgZWxlbSkgeworICAgICAgICBTdHJpbmdbXSBpbml0UGFyYW0gPSBuZXcgU3RyaW5nWzJdOworICAgICAgICAKKyAgICAgICAgSXRlcmF0b3IgbGlzdCA9IGVsZW0uZmluZENoaWxkcmVuKCk7CisgICAgICAgIHdoaWxlIChsaXN0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgVHJlZU5vZGUgZWxlbWVudCA9IChUcmVlTm9kZSkgbGlzdC5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgdG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmICgicGFyYW0tbmFtZSIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIGluaXRQYXJhbVswXSA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgicGFyYW0tdmFsdWUiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpbml0UGFyYW1bMV0gPSBlbGVtZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImRlc2NyaXB0aW9uIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgOyAvLyBEbyBub3RoaW5nCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4uaW5pdFBhcmFtIiwgdG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluaXRQYXJhbTsKKyAgICB9CisKKyAgICBGdW5jdGlvbkluZm8gY3JlYXRlRnVuY3Rpb25JbmZvKFRyZWVOb2RlIGVsZW0pIHsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBrbGFzcyA9IG51bGw7CisgICAgICAgIFN0cmluZyBzaWduYXR1cmUgPSBudWxsOworCisgICAgICAgIEl0ZXJhdG9yIGxpc3QgPSBlbGVtLmZpbmRDaGlsZHJlbigpOworICAgICAgICB3aGlsZSAobGlzdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFRyZWVOb2RlIGVsZW1lbnQgPSAoVHJlZU5vZGUpIGxpc3QubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHRuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7CisKKyAgICAgICAgICAgIGlmICgibmFtZSIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIG5hbWUgPSBlbGVtZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImZ1bmN0aW9uLWNsYXNzIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAga2xhc3MgPSBlbGVtZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImZ1bmN0aW9uLXNpZ25hdHVyZSIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiZGlzcGxheS1uYW1lIi5lcXVhbHModG5hbWUpIHx8ICAgIC8vIElnbm9yZWQgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICJzbWFsbC1pY29uIi5lcXVhbHModG5hbWUpIHx8CisgICAgICAgICAgICAgICAgICAgICAibGFyZ2UtaWNvbiIuZXF1YWxzKHRuYW1lKSB8fAorICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIi5lcXVhbHModG5hbWUpIHx8IAorICAgICAgICAgICAgICAgICAgICAgImV4YW1wbGUiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAianNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLmZ1bmN0aW9uIiwgdG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uSW5mbyhuYW1lLCBrbGFzcywgc2lnbmF0dXJlKTsKKyAgICB9CisKKworICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLy8gVW50aWwgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0xpYnJhcnlJbmZvIGlzIGZpeGVkCisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5zdGFuY2UgKGlmIGFueSkgZm9yIHRoZSBUYWdMaWJyYXJ5VmFsaWRhdG9yIGNsYXNzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIFRhZ0xpYnJhcnlWYWxpZGF0b3IgaW5zdGFuY2UsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnTGlicmFyeVZhbGlkYXRvciBnZXRUYWdMaWJyYXJ5VmFsaWRhdG9yKCkgeworICAgICAgICByZXR1cm4gdGFnTGlicmFyeVZhbGlkYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGlvbi10aW1lIHZhbGlkYXRpb24gb2YgdGhlIFhNTCBkb2N1bWVudAorICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgSlNQIHBhZ2UuCisgICAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBvbiB0aGUgYXNzb2NpYXRlZCAKKyAgICAgKiBUYWdMaWJyYXJ5VmFsaWRhdG9yIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHRoZVBhZ2UgVGhlIEpTUCBwYWdlIG9iamVjdAorICAgICAqIEByZXR1cm4gQSBzdHJpbmcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwYWdlIGlzIHZhbGlkIG9yIG5vdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VbXSB2YWxpZGF0ZShQYWdlRGF0YSB0aGVQYWdlKSB7CisgICAgICAgIFRhZ0xpYnJhcnlWYWxpZGF0b3IgdGx2ID0gZ2V0VGFnTGlicmFyeVZhbGlkYXRvcigpOworICAgICAgICBpZiAodGx2ID09IG51bGwpIHJldHVybiBudWxsOworCisgICAgICAgIFN0cmluZyB1cmkgPSBnZXRVUkkoKTsKKyAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIHVyaSA9IFVSTl9KU1BUTEQgKyB1cmk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGx2LnZhbGlkYXRlKGdldFByZWZpeFN0cmluZygpLCB1cmksIHRoZVBhZ2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCBUYWdMaWJyYXJ5VmFsaWRhdG9yIHRhZ0xpYnJhcnlWYWxpZGF0b3I7IAorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9UYWdQbHVnaW5NYW5hZ2VyLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1RhZ1BsdWdpbk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzJmOWIzCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9UYWdQbHVnaW5NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIueG1scGFyc2VyLlBhcnNlclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlci5UcmVlTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci50YWdwbHVnaW4uVGFnUGx1Z2luOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi5UYWdQbHVnaW5Db250ZXh0OworCisvKioKKyAqIE1hbmFnZXMgdGFnIHBsdWdpbiBvcHRpbWl6YXRpb25zLgorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKi8KKworcHVibGljIGNsYXNzIFRhZ1BsdWdpbk1hbmFnZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QTFVHSU5TX1hNTCA9ICIvV0VCLUlORi90YWdQbHVnaW5zLnhtbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QTFVHSU5TX1JPT1RfRUxFTSA9ICJ0YWctcGx1Z2lucyI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIEhhc2hNYXAgdGFnUGx1Z2lucyA9IG51bGw7CisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjdHh0OworICAgIHByaXZhdGUgUGFnZUluZm8gcGFnZUluZm87CisKKyAgICBwdWJsaWMgVGFnUGx1Z2luTWFuYWdlcihTZXJ2bGV0Q29udGV4dCBjdHh0KSB7CisJdGhpcy5jdHh0ID0gY3R4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBseShOb2RlLk5vZGVzIHBhZ2UsIEVycm9yRGlzcGF0Y2hlciBlcnIsIFBhZ2VJbmZvIHBhZ2VJbmZvKQorCSAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworCWluaXQoZXJyKTsKKwlpZiAodGFnUGx1Z2lucyA9PSBudWxsIHx8IHRhZ1BsdWdpbnMuc2l6ZSgpID09IDApIHsKKwkgICAgcmV0dXJuOworCX0KKworCXRoaXMucGFnZUluZm8gPSBwYWdlSW5mbzsKKworICAgICAgICBwYWdlLnZpc2l0KG5ldyBOb2RlLlZpc2l0b3IoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkN1c3RvbVRhZyBuKQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpbnZva2VQbHVnaW4obik7CisgICAgICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgIH0KKyAKKyAgICBwcml2YXRlIHZvaWQgaW5pdChFcnJvckRpc3BhdGNoZXIgZXJyKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlpZiAoaW5pdGlhbGl6ZWQpCisJICAgIHJldHVybjsKKworCUlucHV0U3RyZWFtIGlzID0gY3R4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKFRBR19QTFVHSU5TX1hNTCk7CisJaWYgKGlzID09IG51bGwpCisJICAgIHJldHVybjsKKworCVRyZWVOb2RlIHJvb3QgPSAobmV3IFBhcnNlclV0aWxzKCkpLnBhcnNlWE1MRG9jdW1lbnQoVEFHX1BMVUdJTlNfWE1MLAorCQkJCQkJCSAgICAgaXMpOworCWlmIChyb290ID09IG51bGwpIHsKKwkgICAgcmV0dXJuOworCX0KKworCWlmICghVEFHX1BMVUdJTlNfUk9PVF9FTEVNLmVxdWFscyhyb290LmdldE5hbWUoKSkpIHsKKwkgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IucGx1Z2luLndyb25nUm9vdEVsZW1lbnQiLCBUQUdfUExVR0lOU19YTUwsCisJCQkgVEFHX1BMVUdJTlNfUk9PVF9FTEVNKTsKKwl9CisKKwl0YWdQbHVnaW5zID0gbmV3IEhhc2hNYXAoKTsKKwlJdGVyYXRvciBwbHVnaW5MaXN0ID0gcm9vdC5maW5kQ2hpbGRyZW4oInRhZy1wbHVnaW4iKTsKKwl3aGlsZSAocGx1Z2luTGlzdC5oYXNOZXh0KCkpIHsKKwkgICAgVHJlZU5vZGUgcGx1Z2luTm9kZSA9IChUcmVlTm9kZSkgcGx1Z2luTGlzdC5uZXh0KCk7CisgICAgICAgICAgICBUcmVlTm9kZSB0YWdDbGFzc05vZGUgPSBwbHVnaW5Ob2RlLmZpbmRDaGlsZCgidGFnLWNsYXNzIik7CisJICAgIGlmICh0YWdDbGFzc05vZGUgPT0gbnVsbCkgeworCQkvLyBFcnJvcgorCQlyZXR1cm47CisJICAgIH0KKwkgICAgU3RyaW5nIHRhZ0NsYXNzID0gdGFnQ2xhc3NOb2RlLmdldEJvZHkoKS50cmltKCk7CisJICAgIFRyZWVOb2RlIHBsdWdpbkNsYXNzTm9kZSA9IHBsdWdpbk5vZGUuZmluZENoaWxkKCJwbHVnaW4tY2xhc3MiKTsKKwkgICAgaWYgKHBsdWdpbkNsYXNzTm9kZSA9PSBudWxsKSB7CisJCS8vIEVycm9yCisJCXJldHVybjsKKwkgICAgfQorCisJICAgIFN0cmluZyBwbHVnaW5DbGFzc1N0ciA9IHBsdWdpbkNsYXNzTm9kZS5nZXRCb2R5KCk7CisJICAgIFRhZ1BsdWdpbiB0YWdQbHVnaW4gPSBudWxsOworCSAgICB0cnkgeworCQlDbGFzcyBwbHVnaW5DbGFzcyA9IENsYXNzLmZvck5hbWUocGx1Z2luQ2xhc3NTdHIpOworCQl0YWdQbHVnaW4gPSAoVGFnUGx1Z2luKSBwbHVnaW5DbGFzcy5uZXdJbnN0YW5jZSgpOworCSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQl0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKGUpOworCSAgICB9CisJICAgIGlmICh0YWdQbHVnaW4gPT0gbnVsbCkgeworCQlyZXR1cm47CisJICAgIH0KKwkgICAgdGFnUGx1Z2lucy5wdXQodGFnQ2xhc3MsIHRhZ1BsdWdpbik7CisJfQorCWluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgdGFnIHBsdWdpbiBmb3IgdGhlIGdpdmVuIGN1c3RvbSB0YWcsIGlmIGEgcGx1Z2luIGV4aXN0cyBmb3IgCisgICAgICogdGhlIGN1c3RvbSB0YWcncyB0YWcgaGFuZGxlci4KKyAgICAgKgorICAgICAqIFRoZSBnaXZlbiBjdXN0b20gdGFnIG5vZGUgd2lsbCBiZSBtYW5pcHVsYXRlZCBieSB0aGUgcGx1Z2luLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbnZva2VQbHVnaW4oTm9kZS5DdXN0b21UYWcgbikgeworCVRhZ1BsdWdpbiB0YWdQbHVnaW4gPSAoVGFnUGx1Z2luKQorCQl0YWdQbHVnaW5zLmdldChuLmdldFRhZ0hhbmRsZXJDbGFzcygpLmdldE5hbWUoKSk7CisJaWYgKHRhZ1BsdWdpbiA9PSBudWxsKSB7CisJICAgIHJldHVybjsKKwl9CisKKwlUYWdQbHVnaW5Db250ZXh0IHRhZ1BsdWdpbkNvbnRleHQgPSBuZXcgVGFnUGx1Z2luQ29udGV4dEltcGwobiwgcGFnZUluZm8pOworCW4uc2V0VGFnUGx1Z2luQ29udGV4dCh0YWdQbHVnaW5Db250ZXh0KTsKKwl0YWdQbHVnaW4uZG9UYWcodGFnUGx1Z2luQ29udGV4dCk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFRhZ1BsdWdpbkNvbnRleHRJbXBsIGltcGxlbWVudHMgVGFnUGx1Z2luQ29udGV4dCB7CisJcHJpdmF0ZSBOb2RlLkN1c3RvbVRhZyBub2RlOworCXByaXZhdGUgTm9kZS5Ob2RlcyBjdXJOb2RlczsKKwlwcml2YXRlIFBhZ2VJbmZvIHBhZ2VJbmZvOworCXByaXZhdGUgSGFzaE1hcCBwbHVnaW5BdHRyaWJ1dGVzOworCisJVGFnUGx1Z2luQ29udGV4dEltcGwoTm9kZS5DdXN0b21UYWcgbiwgUGFnZUluZm8gcGFnZUluZm8pIHsKKwkgICAgdGhpcy5ub2RlID0gbjsKKwkgICAgdGhpcy5wYWdlSW5mbyA9IHBhZ2VJbmZvOworCSAgICBjdXJOb2RlcyA9IG5ldyBOb2RlLk5vZGVzKCk7CisJICAgIG4uc2V0QXRFVGFnKGN1ck5vZGVzKTsKKwkgICAgY3VyTm9kZXMgPSBuZXcgTm9kZS5Ob2RlcygpOworCSAgICBuLnNldEF0U1RhZyhjdXJOb2Rlcyk7CisJICAgIG4uc2V0VXNlVGFnUGx1Z2luKHRydWUpOworCSAgICBwbHVnaW5BdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKKwl9CisKKwlwdWJsaWMgVGFnUGx1Z2luQ29udGV4dCBnZXRQYXJlbnRDb250ZXh0KCkgeworCSAgICBOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50KCk7CisJICAgIGlmICghIChwYXJlbnQgaW5zdGFuY2VvZiBOb2RlLkN1c3RvbVRhZykpIHsKKwkJcmV0dXJuIG51bGw7CisJICAgIH0KKwkgICAgcmV0dXJuICgoTm9kZS5DdXN0b21UYWcpIHBhcmVudCkuZ2V0VGFnUGx1Z2luQ29udGV4dCgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBsdWdpbkF0dHJpYnV0ZShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKwkgICAgcGx1Z2luQXR0cmlidXRlcy5wdXQoa2V5LCB2YWx1ZSk7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRQbHVnaW5BdHRyaWJ1dGUoU3RyaW5nIGtleSkgeworCSAgICByZXR1cm4gcGx1Z2luQXR0cmlidXRlcy5nZXQoa2V5KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1NjcmlwdGxlc3MoKSB7CisJICAgIHJldHVybiBub2RlLmdldENoaWxkSW5mbygpLmlzU2NyaXB0bGVzcygpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzQ29uc3RhbnRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSkgeworCSAgICBOb2RlLkpzcEF0dHJpYnV0ZSBhdHRyID0gZ2V0Tm9kZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOworCSAgICBpZiAoYXR0ciA9PSBudWxsKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIHJldHVybiBhdHRyLmlzTGl0ZXJhbCgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q29uc3RhbnRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSkgeworCSAgICBOb2RlLkpzcEF0dHJpYnV0ZSBhdHRyID0gZ2V0Tm9kZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOworICAgICAgICAgICAgaWYgKGF0dHIgPT0gbnVsbCkKKwkJcmV0dXJuIG51bGw7CisJICAgIHJldHVybiBhdHRyLmdldFZhbHVlKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoU3RyaW5nIGF0dHJpYnV0ZSkgeworCSAgICByZXR1cm4gZ2V0Tm9kZUF0dHJpYnV0ZShhdHRyaWJ1dGUpICE9IG51bGw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKSB7CisJICAgIHJldHVybiBKc3BVdGlsLm5leHRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUltcG9ydChTdHJpbmcgaW1wKSB7CisJICAgIHBhZ2VJbmZvLmFkZEltcG9ydChpbXApOworCX0KKworCXB1YmxpYyB2b2lkIGdlbmVyYXRlRGVjbGFyYXRpb24oU3RyaW5nIGlkLCBTdHJpbmcgdGV4dCkgeworCSAgICBpZiAocGFnZUluZm8uaXNQbHVnaW5EZWNsYXJlZChpZCkpIHsKKwkJcmV0dXJuOworCSAgICB9CisJICAgIGN1ck5vZGVzLmFkZChuZXcgTm9kZS5EZWNsYXJhdGlvbih0ZXh0LCBub2RlLmdldFN0YXJ0KCksIG51bGwpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUphdmFTb3VyY2UoU3RyaW5nIHNvdXJjZUNvZGUpIHsKKwkgICAgY3VyTm9kZXMuYWRkKG5ldyBOb2RlLlNjcmlwdGxldChzb3VyY2VDb2RlLCBub2RlLmdldFN0YXJ0KCksCisJCQkJCSAgICBudWxsKSk7CisJfQorCisJcHVibGljIHZvaWQgZ2VuZXJhdGVBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKwkgICAgY3VyTm9kZXMuYWRkKG5ldyBOb2RlLkF0dHJpYnV0ZUdlbmVyYXRvcihub2RlLmdldFN0YXJ0KCksCisJCQkJCQkgICAgIGF0dHJpYnV0ZU5hbWUsCisJCQkJCQkgICAgIG5vZGUpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkb250VXNlVGFnUGx1Z2luKCkgeworCSAgICBub2RlLnNldFVzZVRhZ1BsdWdpbihmYWxzZSk7CisJfQorCisJcHVibGljIHZvaWQgZ2VuZXJhdGVCb2R5KCkgeworCSAgICAvLyBTaW5jZSB3ZSdsbCBnZW5lcmF0ZSB0aGUgYm9keSBhbnl3YXksIHRoaXMgaXMgcmVhbGx5IGEgbm9wLCAKKwkgICAgLy8gZXhjZXB0IGZvciB0aGUgZmFjdCB0aGF0IGl0IGxldHMgdXMgcHV0IHRoZSBKYXZhIHNvdXJjZXMgdGhlCisJICAgIC8vIHBsdWdpbnMgcHJvZHVjZSBpbiB0aGUgY29ycmVjdCBvcmRlciAody5yLnQgdGhlIGJvZHkpLgorCSAgICBjdXJOb2RlcyA9IG5vZGUuZ2V0QXRFVGFnKCk7CisJfQorCisJcHJpdmF0ZSBOb2RlLkpzcEF0dHJpYnV0ZSBnZXROb2RlQXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGUpIHsKKwkgICAgTm9kZS5Kc3BBdHRyaWJ1dGVbXSBhdHRycyA9IG5vZGUuZ2V0SnNwQXR0cmlidXRlcygpOworCSAgICBmb3IgKGludCBpPTA7IGF0dHJzICE9IG51bGwgJiYgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CisJCWlmIChhdHRyc1tpXS5nZXROYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZSkpIHsKKwkJICAgIHJldHVybiBhdHRyc1tpXTsKKwkJfQorCSAgICB9CisJICAgIHJldHVybiBudWxsOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1RleHRPcHRpbWl6ZXIuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvVGV4dE9wdGltaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1Mzg2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1RleHRPcHRpbWl6ZXIuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSmFzcGVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLk9wdGlvbnM7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgVGV4dE9wdGltaXplciB7CisKKyAgICAvKioKKyAgICAgKiBBIHZpc2l0b3IgdG8gY29uY2F0ZW5hdGUgY29udGlndW91cyB0ZW1wbGF0ZSB0ZXh0cy4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgVGV4dENhdFZpc2l0b3IgZXh0ZW5kcyBOb2RlLlZpc2l0b3IgeworCisgICAgICAgIHByaXZhdGUgT3B0aW9ucyBvcHRpb25zOworICAgICAgICBwcml2YXRlIGludCB0ZXh0Tm9kZUNvdW50ID0gMDsKKyAgICAgICAgcHJpdmF0ZSBOb2RlLlRlbXBsYXRlVGV4dCBmaXJzdFRleHROb2RlID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgdGV4dEJ1ZmZlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZW1wdHlUZXh0ID0gbmV3IFN0cmluZygiIik7CisKKyAgICAgICAgcHVibGljIFRleHRDYXRWaXNpdG9yKENvbXBpbGVyIGNvbXBpbGVyKSB7CisgICAgICAgICAgICBvcHRpb25zID0gY29tcGlsZXIuZ2V0Q29tcGlsYXRpb25Db250ZXh0KCkuZ2V0T3B0aW9ucygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZG9WaXNpdChOb2RlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgY29sbGVjdFRleHQoKTsKKyAgICAgICAgfQorCisJLyoKKyAgICAgICAgICogVGhlIGZvbGxvd2luZyBkaXJlY3RpcyBhcmUgaWdub3JlZCBpbiB0ZXh0IGNvbmNhdGVuYXRpb24KKyAgICAgICAgICovCisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5QYWdlRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5UYWdEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlRhZ2xpYkRpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuQXR0cmlidXRlRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5WYXJpYWJsZURpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIERvbid0IGNvbmNhdGVuYXRlIHRleHQgYWNyb3NzIGJvZHkgYm91bmRhcmllcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXRCb2R5KE5vZGUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlci52aXNpdEJvZHkobik7CisgICAgICAgICAgICBjb2xsZWN0VGV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5UZW1wbGF0ZVRleHQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGlmIChvcHRpb25zLmdldFRyaW1TcGFjZXMoKSAmJiBuLmlzQWxsU3BhY2UoKSkgeworICAgICAgICAgICAgICAgIG4uc2V0VGV4dChlbXB0eVRleHQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRleHROb2RlQ291bnQrKyA9PSAwKSB7CisgICAgICAgICAgICAgICAgZmlyc3RUZXh0Tm9kZSA9IG47CisgICAgICAgICAgICAgICAgdGV4dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobi5nZXRUZXh0KCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBBcHBlbmQgdGV4dCB0byB0ZXh0IGJ1ZmZlcgorICAgICAgICAgICAgICAgIHRleHRCdWZmZXIuYXBwZW5kKG4uZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICBuLnNldFRleHQoZW1wdHlUZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBicmVha3MgY29uY2F0ZW5hdGlvbiBtb2RlLiAgQXMgYSBzaWRlIGVmZmVjdCBpdCBjb3BpZXMKKyAgICAgICAgICogdGhlIGNvbmNhdGVuYXRlZCBzdHJpbmcgdG8gdGhlIGZpcnN0IHRleHQgbm9kZSAKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBjb2xsZWN0VGV4dCgpIHsKKworICAgICAgICAgICAgaWYgKHRleHROb2RlQ291bnQgPiAxKSB7CisgICAgICAgICAgICAgICAgLy8gQ29weSB0aGUgdGV4dCBpbiBidWZmZXIgaW50byB0aGUgZmlyc3QgdGVtcGxhdGUgdGV4dCBub2RlLgorICAgICAgICAgICAgICAgIGZpcnN0VGV4dE5vZGUuc2V0VGV4dCh0ZXh0QnVmZmVyLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGV4dE5vZGVDb3VudCA9IDA7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25jYXRlbmF0ZShDb21waWxlciBjb21waWxlciwgTm9kZS5Ob2RlcyBwYWdlKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgVGV4dENhdFZpc2l0b3IgdiA9IG5ldyBUZXh0Q2F0VmlzaXRvcihjb21waWxlcik7CisgICAgICAgIHBhZ2UudmlzaXQodik7CisKKwkvLyBDbGVhbnVwLCBpbiBjYXNlIHRoZSBwYWdlIGVuZHMgd2l0aCBhIHRlbXBsYXRlIHRleHQKKyAgICAgICAgdi5jb2xsZWN0VGV4dCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvVGxkTG9jYXRpb25zQ2FjaGUuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvVGxkTG9jYXRpb25zQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Y4MGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9UbGRMb2NhdGlvbnNDYWNoZS5qYXZhCkBAIC0wLDAgKzEsNTU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIueG1scGFyc2VyLlBhcnNlclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlci5UcmVlTm9kZTsKKworLyoqCisgKiBBIGNvbnRhaW5lciBmb3IgYWxsIHRhZyBsaWJyYXJpZXMgdGhhdCBhcmUgZGVmaW5lZCAiZ2xvYmFsbHkiCisgKiBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbi4KKyAqIAorICogVGFnIExpYnJhcmllcyBjYW4gYmUgZGVmaW5lZCBnbG9iYWxseSBpbiBvbmUgb2YgdHdvIHdheXM6CisgKiAgIDEuIFZpYSA8dGFnbGliPiBlbGVtZW50cyBpbiB3ZWIueG1sOgorICogICAgICB0aGUgdXJpIGFuZCBsb2NhdGlvbiBvZiB0aGUgdGFnLWxpYnJhcnkgYXJlIHNwZWNpZmllZCBpbgorICogICAgICB0aGUgPHRhZ2xpYj4gZWxlbWVudC4KKyAqICAgMi4gVmlhIHBhY2thZ2VkIGphciBmaWxlcyB0aGF0IGNvbnRhaW4gLnRsZCBmaWxlcworICogICAgICB3aXRoaW4gdGhlIE1FVEEtSU5GIGRpcmVjdG9yeSwgb3Igc29tZSBzdWJkaXJlY3RvcnkKKyAqICAgICAgb2YgaXQuIFRoZSB0YWdsaWIgaXMgJ2dsb2JhbCcgaWYgaXQgaGFzIHRoZSA8dXJpPgorICogICAgICBlbGVtZW50IGRlZmluZWQuCisgKgorICogQSBtYXBwaW5nIGJldHdlZW4gdGhlIHRhZ2xpYiBVUkkgYW5kIGl0cyBhc3NvY2lhdGVkIFRhZ2xpYnJhcnlJbmZvSW1wbAorICogaXMgbWFpbnRhaW5lZCBpbiB0aGlzIGNvbnRhaW5lci4KKyAqIEFjdHVhbGx5LCB0aGF0J3Mgd2hhdCB3ZSdkIGxpa2UgdG8gZG8uIEhvd2V2ZXIsIGJlY2F1c2Ugb2YgdGhlCisgKiB3YXkgdGhlIGNsYXNzZXMgVGFnTGlicmFyeUluZm8gYW5kIFRhZ0luZm8gaGF2ZSBiZWVuIGRlZmluZWQsCisgKiBpdCBpcyBub3QgY3VycmVudGx5IHBvc3NpYmxlIHRvIHNoYXJlIGFuIGluc3RhbmNlIG9mIFRhZ0xpYnJhcnlJbmZvCisgKiBhY3Jvc3MgcGFnZSBpbnZvY2F0aW9ucy4gQSBidWcgaGFzIGJlZW4gc3VibWl0dGVkIHRvIHRoZSBzcGVjIGxlYWQuCisgKiBJbiB0aGUgbWVhbiB0aW1lLCBhbGwgd2UgZG8gaXMgc2F2ZSB0aGUgJ2xvY2F0aW9uJyB3aGVyZSB0aGUKKyAqIFRMRCBhc3NvY2lhdGVkIHdpdGggYSB0YWdsaWIgVVJJIGNhbiBiZSBmb3VuZC4KKyAqCisgKiBXaGVuIGEgSlNQIHBhZ2UgaGFzIGEgdGFnbGliIGRpcmVjdGl2ZSwgdGhlIG1hcHBpbmdzIGluIHRoaXMgY29udGFpbmVyCisgKiBhcmUgZmlyc3Qgc2VhcmNoZWQgKHNlZSBtZXRob2QgZ2V0TG9jYXRpb24oKSkuCisgKiBJZiBhIG1hcHBpbmcgaXMgZm91bmQsIHRoZW4gdGhlIGxvY2F0aW9uIG9mIHRoZSBUTEQgaXMgcmV0dXJuZWQuCisgKiBJZiBubyBtYXBwaW5nIGlzIGZvdW5kLCB0aGVuIHRoZSB1cmkgc3BlY2lmaWVkCisgKiBpbiB0aGUgdGFnbGliIGRpcmVjdGl2ZSBpcyB0byBiZSBpbnRlcnByZXRlZCBhcyB0aGUgbG9jYXRpb24gZm9yCisgKiB0aGUgVExEIG9mIHRoaXMgdGFnIGxpYnJhcnkuCisgKgorICogQGF1dGhvciBQaWVycmUgRGVsaXNsZQorICogQGF1dGhvciBKYW4gTHVlaGUKKyAqLworCitwdWJsaWMgY2xhc3MgVGxkTG9jYXRpb25zQ2FjaGUgeworCisgICAgLy8gTG9nZ2VyCisgICAgcHJpdmF0ZSBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVGxkTG9jYXRpb25zQ2FjaGUuY2xhc3MpOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGVzIG9mIFVSSSBvbmUgbWF5IHNwZWNpZnkgZm9yIGEgdGFnIGxpYnJhcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfVVJJID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST09UX1JFTF9VUkkgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PUk9PVF9SRUxfVVJJID0gMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfWE1MID0gIi9XRUItSU5GL3dlYi54bWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGU6IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0ZJTEVfU1VGRklYID0gIi5qYXIiOworCisgICAgLy8gTmFtZXMgb2YgSkFScyB0aGF0IGFyZSBrbm93biBub3QgdG8gY29udGFpbiBhbnkgVExEcworICAgIHByaXZhdGUgc3RhdGljIEhhc2hTZXQgbm9UbGRKYXJzOworCisgICAgLyoqCisgICAgICogVGhlIG1hcHBpbmcgb2YgdGhlICdnbG9iYWwnIHRhZyBsaWJyYXJ5IFVSSSB0byB0aGUgbG9jYXRpb24gKHJlc291cmNlCisgICAgICogcGF0aCkgb2YgdGhlIFRMRCBhc3NvY2lhdGVkIHdpdGggdGhhdCB0YWcgbGlicmFyeS4gVGhlIGxvY2F0aW9uIGlzCisgICAgICogcmV0dXJuZWQgYXMgYSBTdHJpbmcgYXJyYXk6CisgICAgICogICAgWzBdIFRoZSBsb2NhdGlvbgorICAgICAqICAgIFsxXSBJZiB0aGUgbG9jYXRpb24gaXMgYSBqYXIgZmlsZSwgdGhpcyBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIHRsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSBtYXBwaW5nczsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZDsKKyAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGN0eHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIHJlZGVwbG95TW9kZTsKKworICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLy8gQ29uc3RydWN0b3IgYW5kIEluaXRpbGl6YXRpb25zCisKKyAgICAvKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBzZXQgb2YgSkFScyB0aGF0IGFyZSBrbm93biBub3QgdG8gY29udGFpbiBhbnkgVExEcworICAgICAqLworICAgIHN0YXRpYyB7CisgICAgICAgIG5vVGxkSmFycyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImFudC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY2F0YWxpbmEuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNhdGFsaW5hLWFudC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY2F0YWxpbmEtY2x1c3Rlci5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY2F0YWxpbmEtb3B0aW9uYWwuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNhdGFsaW5hLWkxOG4tZnIuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNhdGFsaW5hLWkxOG4tamEuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNhdGFsaW5hLWkxOG4tZXMuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNvbW1vbnMtZGJjcC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY29tbW9ucy1tb2RlbGVyLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjb21tb25zLWxvZ2dpbmctYXBpLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjb21tb25zLWJlYW51dGlscy5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY29tbW9ucy1maWxldXBsb2FkLTEuMC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY29tbW9ucy1wb29sLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjb21tb25zLWRpZ2VzdGVyLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjb21tb25zLWxvZ2dpbmcuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNvbW1vbnMtY29sbGVjdGlvbnMuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNvbW1vbnMtZWwuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImpha2FydGEtcmVnZXhwLTEuMi5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiamFzcGVyLWNvbXBpbGVyLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJqYXNwZXItcnVudGltZS5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiam14LmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJqbXgtdG9vbHMuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImpzcC1hcGkuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImprc2htLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJqa2NvbmZpZy5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgibmFtaW5nLWNvbW1vbi5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgibmFtaW5nLXJlc291cmNlcy5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgibmFtaW5nLWZhY3RvcnkuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoIm5hbWluZy1qYXZhLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJzZXJ2bGV0LWFwaS5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgic2VydmxldHMtZGVmYXVsdC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgic2VydmxldHMtaW52b2tlci5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgic2VydmxldHMtY29tbW9uLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJzZXJ2bGV0cy13ZWJkYXYuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInRvbWNhdC11dGlsLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJ0b21jYXQtaHR0cDExLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJ0b21jYXQtam5pLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJ0b21jYXQtamsuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInRvbWNhdC1qazIuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInRvbWNhdC1jb3lvdGUuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInhlcmNlc0ltcGwuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInhtbFBhcnNlckFQSXMuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInhtbC1hcGlzLmphciIpOworICAgICAgICAvLyBKQVJzIGZyb20gSjJTRSBydW50aW1lCisgICAgICAgIG5vVGxkSmFycy5hZGQoInN1bmpjZV9wcm92aWRlci5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgibGRhcHNlYy5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgibG9jYWxlZGF0YS5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiZG5zbnMuamFyIik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBUbGRMb2NhdGlvbnNDYWNoZShTZXJ2bGV0Q29udGV4dCBjdHh0KSB7CisgICAgICAgIHRoaXMoY3R4dCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqIENvbnN0cnVjdG9yLiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBjdHh0IHRoZSBzZXJ2bGV0IGNvbnRleHQgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBpbiB3aGljaCBKYXNwZXIgCisgICAgICogaXMgcnVubmluZworICAgICAqIEBwYXJhbSByZWRlcGxveU1vZGUgaWYgdHJ1ZSwgdGhlbiB0aGUgY29tcGlsZXIgd2lsbCBhbGxvdyByZWRlcGxveWluZyAKKyAgICAgKiBhIHRhZyBsaWJyYXJ5IGZyb20gdGhlIHNhbWUgamFyLCBhdCB0aGUgZXhwZW5zZSBvZiBzbG93aW5nIGRvd24gdGhlCisgICAgICogc2VydmVyIGEgYml0LiBOb3RlIHRoYXQgdGhpcyBtYXkgb25seSB3b3JrIG9uIEpESyAxLjMuMV8wMWEgYW5kIGxhdGVyLAorICAgICAqIGJlY2F1c2Ugb2YgSkRLIGJ1ZyA0MjExODE3IGZpeGVkIGluIHRoaXMgcmVsZWFzZS4KKyAgICAgKiBJZiByZWRlcGxveU1vZGUgaXMgZmFsc2UsIGEgZmFzdGVyIGJ1dCBsZXNzIGNhcGFibGUgbW9kZSB3aWxsIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIFRsZExvY2F0aW9uc0NhY2hlKFNlcnZsZXRDb250ZXh0IGN0eHQsIGJvb2xlYW4gcmVkZXBsb3lNb2RlKSB7CisgICAgICAgIHRoaXMuY3R4dCA9IGN0eHQ7CisgICAgICAgIHRoaXMucmVkZXBsb3lNb2RlID0gcmVkZXBsb3lNb2RlOworICAgICAgICBtYXBwaW5ncyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIEpBUnMgdGhhdCBhcmUga25vd24gbm90IHRvIGNvbnRhaW4gYW55IFRMRHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamFyTmFtZXMgTGlzdCBvZiBjb21tYS1zZXBhcmF0ZWQgbmFtZXMgb2YgSkFSIGZpbGVzIHRoYXQgYXJlIAorICAgICAqIGtub3duIG5vdCB0byBjb250YWluIGFueSBUTERzIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXROb1RsZEphcnMoU3RyaW5nIGphck5hbWVzKSB7CisgICAgICAgIGlmIChqYXJOYW1lcyAhPSBudWxsKSB7CisgICAgICAgICAgICBub1RsZEphcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGphck5hbWVzLCAiLCIpOworICAgICAgICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIG5vVGxkSmFycy5hZGQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlICdsb2NhdGlvbicgb2YgdGhlIFRMRCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHRhZ2xpYiAndXJpJy4KKyAgICAgKgorICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgdXJpIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHRhZyBsaWJyYXJ5ICdleHBvc2VkJworICAgICAqIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uIEEgdGFnIGxpYnJhcnkgaXMgJ2V4cG9zZWQnIGVpdGhlciBleHBsaWNpdGx5IGluCisgICAgICogd2ViLnhtbCBvciBpbXBsaWNpdGx5IHZpYSB0aGUgdXJpIHRhZyBpbiB0aGUgVExEIG9mIGEgdGFnbGliIGRlcGxveWVkCisgICAgICogaW4gYSBqYXIgZmlsZSAoV0VCLUlORi9saWIpLgorICAgICAqIAorICAgICAqIEBwYXJhbSB1cmkgVGhlIHRhZ2xpYiB1cmkKKyAgICAgKgorICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgdHdvIFN0cmluZ3M6IFRoZSBmaXJzdCBlbGVtZW50IGRlbm90ZXMgdGhlIHJlYWwKKyAgICAgKiBwYXRoIHRvIHRoZSBUTEQuIElmIHRoZSBwYXRoIHRvIHRoZSBUTEQgcG9pbnRzIHRvIGEgamFyIGZpbGUsIHRoZW4gdGhlCisgICAgICogc2Vjb25kIGVsZW1lbnQgZGVub3RlcyB0aGUgbmFtZSBvZiB0aGUgVExEIGVudHJ5IGluIHRoZSBqYXIgZmlsZS4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHVyaSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSB0YWcgbGlicmFyeSAnZXhwb3NlZCcKKyAgICAgKiBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRMb2NhdGlvbihTdHJpbmcgdXJpKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpbml0aWFsaXplZCkgeworICAgICAgICAgICAgaW5pdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoU3RyaW5nW10pIG1hcHBpbmdzLmdldCh1cmkpOworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIGEgVVJJOgorICAgICAqICAgICBBQlNfVVJJCisgICAgICogICAgIFJPT1RfUkVMX1VSSQorICAgICAqICAgICBOT1JPT1RfUkVMX1VSSQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHVyaVR5cGUoU3RyaW5nIHVyaSkgeworICAgICAgICBpZiAodXJpLmluZGV4T2YoJzonKSAhPSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIEFCU19VUkk7CisgICAgICAgIH0gZWxzZSBpZiAodXJpLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgcmV0dXJuIFJPT1RfUkVMX1VSSTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOT1JPT1RfUkVMX1VSSTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0KCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbml0aWFsaXplZCkgcmV0dXJuOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvY2Vzc1dlYkRvdFhtbCgpOworICAgICAgICAgICAgc2NhbkphcnMoKTsKKyAgICAgICAgICAgIHByb2Nlc3NUbGRzSW5GaWxlU3lzdGVtKCIvV0VCLUlORi8iKTsKKyAgICAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLmludGVybmFsLnRsZGluaXQiLCBleC5nZXRNZXNzYWdlKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUG9wdWxhdGVzIHRhZ2xpYiBtYXAgZGVzY3JpYmVkIGluIHdlYi54bWwuCisgICAgICovICAgIAorICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzV2ViRG90WG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBBY3F1aXJlIGlucHV0IHN0cmVhbSB0byB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yCisgICAgICAgICAgICBTdHJpbmcgYWx0REROYW1lID0gKFN0cmluZyljdHh0LmdldEF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQUxUX0REX0FUVFIpOworICAgICAgICAgICAgVVJMIHVyaSA9IG51bGw7CisgICAgICAgICAgICBpZiAoYWx0REROYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB1cmkgPSBuZXcgVVJMKEZJTEVfUFJPVE9DT0wrYWx0REROYW1lLnJlcGxhY2UoJ1xcJywgJy8nKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLmludGVybmFsLmZpbGVub3Rmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdERETmFtZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1cmkgPSBjdHh0LmdldFJlc291cmNlKFdFQl9YTUwpOworICAgICAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCAmJiBsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLmludGVybmFsLmZpbGVub3Rmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQl9YTUwpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzID0gdXJpLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgICAgIElucHV0U291cmNlIGlwID0gbmV3IElucHV0U291cmNlKGlzKTsKKyAgICAgICAgICAgIGlwLnNldFN5c3RlbUlkKHVyaS50b0V4dGVybmFsRm9ybSgpKTsgCisKKyAgICAgICAgICAgIC8vIFBhcnNlIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yCisgICAgICAgICAgICBUcmVlTm9kZSB3ZWJ0bGQgPSBudWxsOworICAgICAgICAgICAgLy8gYWx0REROYW1lIGlzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBERAorICAgICAgICAgICAgaWYgKGFsdERETmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd2VidGxkID0gbmV3IFBhcnNlclV0aWxzKCkucGFyc2VYTUxEb2N1bWVudChhbHRERE5hbWUsIGlwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2VidGxkID0gbmV3IFBhcnNlclV0aWxzKCkucGFyc2VYTUxEb2N1bWVudChXRUJfWE1MLCBpcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFsbG93IHRhZ2xpYiB0byBiZSBhbiBlbGVtZW50IG9mIHRoZSByb290IG9yIGpzcC1jb25maWcgKEpTUDIuMCkKKyAgICAgICAgICAgIFRyZWVOb2RlIGpzcENvbmZpZyA9IHdlYnRsZC5maW5kQ2hpbGQoImpzcC1jb25maWciKTsKKyAgICAgICAgICAgIGlmIChqc3BDb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdlYnRsZCA9IGpzcENvbmZpZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEl0ZXJhdG9yIHRhZ2xpYnMgPSB3ZWJ0bGQuZmluZENoaWxkcmVuKCJ0YWdsaWIiKTsKKyAgICAgICAgICAgIHdoaWxlICh0YWdsaWJzLmhhc05leHQoKSkgeworCisgICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIG5leHQgPHRhZ2xpYj4gZWxlbWVudAorICAgICAgICAgICAgICAgIFRyZWVOb2RlIHRhZ2xpYiA9IChUcmVlTm9kZSkgdGFnbGlicy5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRhZ1VyaSA9IG51bGw7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRhZ0xvYyA9IG51bGw7CisgICAgICAgICAgICAgICAgVHJlZU5vZGUgY2hpbGQgPSB0YWdsaWIuZmluZENoaWxkKCJ0YWdsaWItdXJpIik7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRhZ1VyaSA9IGNoaWxkLmdldEJvZHkoKTsKKyAgICAgICAgICAgICAgICBjaGlsZCA9IHRhZ2xpYi5maW5kQ2hpbGQoInRhZ2xpYi1sb2NhdGlvbiIpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0YWdMb2MgPSBjaGlsZC5nZXRCb2R5KCk7CisKKyAgICAgICAgICAgICAgICAvLyBTYXZlIHRoaXMgbG9jYXRpb24gaWYgYXBwcm9wcmlhdGUKKyAgICAgICAgICAgICAgICBpZiAodGFnTG9jID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmICh1cmlUeXBlKHRhZ0xvYykgPT0gTk9ST09UX1JFTF9VUkkpCisgICAgICAgICAgICAgICAgICAgIHRhZ0xvYyA9ICIvV0VCLUlORi8iICsgdGFnTG9jOworICAgICAgICAgICAgICAgIFN0cmluZyB0YWdMb2MyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAodGFnTG9jLmVuZHNXaXRoKEpBUl9GSUxFX1NVRkZJWCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFnTG9jID0gY3R4dC5nZXRSZXNvdXJjZSh0YWdMb2MpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHRhZ0xvYzIgPSAiTUVUQS1JTkYvdGFnbGliLnRsZCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1hcHBpbmdzLnB1dCh0YWdVcmksIG5ldyBTdHJpbmdbXSB7IHRhZ0xvYywgdGFnTG9jMiB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkge30KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNjYW5zIHRoZSBnaXZlbiBKYXJVUkxDb25uZWN0aW9uIGZvciBUTEQgZmlsZXMgbG9jYXRlZCBpbiBNRVRBLUlORgorICAgICAqIChvciBhIHN1YmRpcmVjdG9yeSBvZiBpdCksIGFkZGluZyBhbiBpbXBsaWNpdCBtYXAgZW50cnkgdG8gdGhlIHRhZ2xpYgorICAgICAqIG1hcCBmb3IgYW55IFRMRCB0aGF0IGhhcyBhIDx1cmk+IGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubiBUaGUgSmFyVVJMQ29ubmVjdGlvbiB0byB0aGUgSkFSIGZpbGUgdG8gc2NhbgorICAgICAqIEBwYXJhbSBpZ25vcmUgdHJ1ZSBpZiBhbnkgZXhjZXB0aW9ucyByYWlzZWQgd2hlbiBwcm9jZXNzaW5nIHRoZSBnaXZlbgorICAgICAqIEpBUiBzaG91bGQgYmUgaWdub3JlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNjYW5KYXIoSmFyVVJMQ29ubmVjdGlvbiBjb25uLCBib29sZWFuIGlnbm9yZSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBKYXJGaWxlIGphckZpbGUgPSBudWxsOworICAgICAgICBTdHJpbmcgcmVzb3VyY2VQYXRoID0gY29ubi5nZXRKYXJGaWxlVVJMKCkudG9TdHJpbmcoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChyZWRlcGxveU1vZGUpIHsKKyAgICAgICAgICAgICAgICBjb25uLnNldFVzZUNhY2hlcyhmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBqYXJGaWxlID0gY29ubi5nZXRKYXJGaWxlKCk7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnRyaWVzID0gamFyRmlsZS5lbnRyaWVzKCk7CisgICAgICAgICAgICB3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIEphckVudHJ5IGVudHJ5ID0gKEphckVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCFuYW1lLnN0YXJ0c1dpdGgoIk1FVEEtSU5GLyIpKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoIi50bGQiKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gamFyRmlsZS5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGdldFVyaUZyb21UbGQocmVzb3VyY2VQYXRoLCBzdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAvLyBBZGQgaW1wbGljaXQgbWFwIGVudHJ5IG9ubHkgaWYgaXRzIHVyaSBpcyBub3QgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAvLyBwcmVzZW50IGluIHRoZSBtYXAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsICYmIG1hcHBpbmdzLmdldCh1cmkpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzLnB1dCh1cmksIG5ldyBTdHJpbmdbXXsgcmVzb3VyY2VQYXRoLCBuYW1lIH0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgaWYgKCFyZWRlcGxveU1vZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBub3QgaW4gcmVkZXBsb3kgbW9kZSwgY2xvc2UgdGhlIGphciBpbiBjYXNlIG9mIGFuIGVycm9yCisgICAgICAgICAgICAgICAgaWYgKGphckZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgamFyRmlsZS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWlnbm9yZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHJlZGVwbG95TW9kZSkgeworICAgICAgICAgICAgICAgIC8vIGlmIGluIHJlZGVwbG95IG1vZGUsIGFsd2F5cyBjbG9zZSB0aGUgamFyCisgICAgICAgICAgICAgICAgaWYgKGphckZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgamFyRmlsZS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNlYXJjaGVzIHRoZSBmaWxlc3lzdGVtIHVuZGVyIC9XRUItSU5GIGZvciBhbnkgVExEIGZpbGVzLCBhbmQgYWRkcworICAgICAqIGFuIGltcGxpY2l0IG1hcCBlbnRyeSB0byB0aGUgdGFnbGliIG1hcCBmb3IgYW55IFRMRCB0aGF0IGhhcyBhIDx1cmk+CisgICAgICogZWxlbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1RsZHNJbkZpbGVTeXN0ZW0oU3RyaW5nIHN0YXJ0UGF0aCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFNldCBkaXJMaXN0ID0gY3R4dC5nZXRSZXNvdXJjZVBhdGhzKHN0YXJ0UGF0aCk7CisgICAgICAgIGlmIChkaXJMaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gZGlyTGlzdC5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gKFN0cmluZykgaXQubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RsZHNJbkZpbGVTeXN0ZW0ocGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghcGF0aC5lbmRzV2l0aCgiLnRsZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBjdHh0LmdldFJlc291cmNlQXNTdHJlYW0ocGF0aCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdXJpID0gZ2V0VXJpRnJvbVRsZChwYXRoLCBzdHJlYW0pOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEFkZCBpbXBsaWNpdCBtYXAgZW50cnkgb25seSBpZiBpdHMgdXJpIGlzIG5vdCBhbHJlYWR5CisgICAgICAgICAgICAgICAgLy8gcHJlc2VudCBpbiB0aGUgbWFwCisgICAgICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsICYmIG1hcHBpbmdzLmdldCh1cmkpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFwcGluZ3MucHV0KHVyaSwgbmV3IFN0cmluZ1tdIHsgcGF0aCwgbnVsbCB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSB1cmkgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gVExELCBvciBudWxsIGlmIHRoZQorICAgICAqIGdpdmVuIFRMRCBkb2VzIG5vdCBjb250YWluIGFueSBzdWNoIGVsZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VXJpRnJvbVRsZChTdHJpbmcgcmVzb3VyY2VQYXRoLCBJbnB1dFN0cmVhbSBpbikgCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIFBhcnNlIHRoZSB0YWcgbGlicmFyeSBkZXNjcmlwdG9yIGF0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgcGF0aAorICAgICAgICBUcmVlTm9kZSB0bGQgPSBuZXcgUGFyc2VyVXRpbHMoKS5wYXJzZVhNTERvY3VtZW50KHJlc291cmNlUGF0aCwgaW4pOworICAgICAgICBUcmVlTm9kZSB1cmkgPSB0bGQuZmluZENoaWxkKCJ1cmkiKTsKKyAgICAgICAgaWYgKHVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgYm9keSA9IHVyaS5nZXRCb2R5KCk7CisgICAgICAgICAgICBpZiAoYm9keSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBib2R5OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTY2FucyBhbGwgSkFScyBhY2Nlc3NpYmxlIHRvIHRoZSB3ZWJhcHAncyBjbGFzc2xvYWRlciBhbmQgaXRzCisgICAgICogcGFyZW50IGNsYXNzbG9hZGVycyBmb3IgVExEcy4KKyAgICAgKiAKKyAgICAgKiBUaGUgbGlzdCBvZiBKQVJzIGFsd2F5cyBpbmNsdWRlcyB0aGUgSkFScyB1bmRlciBXRUItSU5GL2xpYiwgYXMgd2VsbCBhcworICAgICAqIGFsbCBzaGFyZWQgSkFScyBpbiB0aGUgY2xhc3Nsb2FkZXIgZGVsZWdhdGlvbiBjaGFpbiBvZiB0aGUgd2ViYXBwJ3MKKyAgICAgKiBjbGFzc2xvYWRlci4KKyAgICAgKgorICAgICAqIENvbnNpZGVyaW5nIEpBUnMgaW4gdGhlIGNsYXNzbG9hZGVyIGRlbGVnYXRpb24gY2hhaW4gY29uc3RpdHV0ZXMgYQorICAgICAqIFRvbWNhdC1zcGVjaWZpYyBleHRlbnNpb24gdG8gdGhlIFRMRCBzZWFyY2gKKyAgICAgKiBvcmRlciBkZWZpbmVkIGluIHRoZSBKU1Agc3BlYy4gSXQgYWxsb3dzIHRhZyBsaWJyYXJpZXMgcGFja2FnZWQgYXMgSkFSCisgICAgICogZmlsZXMgdG8gYmUgc2hhcmVkIGJ5IHdlYiBhcHBsaWNhdGlvbnMgYnkgc2ltcGx5IGRyb3BwaW5nIHRoZW0gaW4gYSAKKyAgICAgKiBsb2NhdGlvbiB0aGF0IGFsbCB3ZWIgYXBwbGljYXRpb25zIGhhdmUgYWNjZXNzIHRvIChlLmcuLAorICAgICAqIDxDQVRBTElOQV9IT01FPi9jb21tb24vbGliKS4KKyAgICAgKgorICAgICAqIFRoZSBzZXQgb2Ygc2hhcmVkIEpBUnMgdG8gYmUgc2Nhbm5lZCBmb3IgVExEcyBpcyBuYXJyb3dlZCBkb3duIGJ5CisgICAgICogdGhlIDx0dD5ub1RsZEphcnM8L3R0PiBjbGFzcyB2YXJpYWJsZSwgd2hpY2ggY29udGFpbnMgdGhlIG5hbWVzIG9mIEpBUnMKKyAgICAgKiB0aGF0IGFyZSBrbm93biBub3QgdG8gY29udGFpbiBhbnkgVExEcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2NhbkphcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBDbGFzc0xvYWRlciB3ZWJhcHBMb2FkZXIKKyAgICAgICAgICAgID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gd2ViYXBwTG9hZGVyOworCisgICAgICAgIHdoaWxlIChsb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvYWRlciBpbnN0YW5jZW9mIFVSTENsYXNzTG9hZGVyKSB7CisgICAgICAgICAgICAgICAgVVJMW10gdXJscyA9ICgoVVJMQ2xhc3NMb2FkZXIpIGxvYWRlcikuZ2V0VVJMcygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTx1cmxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IHVybHNbaV0ub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm4gaW5zdGFuY2VvZiBKYXJVUkxDb25uZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVlZFNjYW5KYXIobG9hZGVyLCB3ZWJhcHBMb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChKYXJVUkxDb25uZWN0aW9uKSBjb25uKS5nZXRKYXJGaWxlKCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5KYXIoKEphclVSTENvbm5lY3Rpb24pIGNvbm4sIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybFN0ciA9IHVybHNbaV0udG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmxTdHIuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB1cmxTdHIuZW5kc1dpdGgoSkFSX0ZJTEVfU1VGRklYKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBuZWVkU2Nhbkphcihsb2FkZXIsIHdlYmFwcExvYWRlciwgdXJsU3RyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBqYXJVUkwgPSBuZXcgVVJMKCJqYXI6IiArIHVybFN0ciArICIhLyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5KYXIoKEphclVSTENvbm5lY3Rpb24pIGphclVSTC5vcGVuQ29ubmVjdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvYWRlciA9IGxvYWRlci5nZXRQYXJlbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgSkFSIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gPHR0PmphclBhdGg8L3R0PiBuZWVkcyB0byBiZQorICAgICAqIHNjYW5uZWQgZm9yIFRMRHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9hZGVyIFRoZSBjdXJyZW50IGNsYXNzbG9hZGVyIGluIHRoZSBwYXJlbnQgY2hhaW4KKyAgICAgKiBAcGFyYW0gd2ViYXBwTG9hZGVyIFRoZSB3ZWJhcHAgY2xhc3Nsb2FkZXIKKyAgICAgKiBAcGFyYW0gamFyUGF0aCBUaGUgSkFSIGZpbGUgcGF0aAorICAgICAqCisgICAgICogQHJldHVybiBUUlVFIGlmIHRoZSBKQVIgZmlsZSBpZGVudGlmaWVkIGJ5IDx0dD5qYXJQYXRoPC90dD4gbmVlZHMgdG8gYmUKKyAgICAgKiBzY2FubmVkIGZvciBUTERzLCBGQUxTRSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbmVlZFNjYW5KYXIoQ2xhc3NMb2FkZXIgbG9hZGVyLCBDbGFzc0xvYWRlciB3ZWJhcHBMb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXJQYXRoKSB7CisgICAgICAgIGlmIChsb2FkZXIgPT0gd2ViYXBwTG9hZGVyKSB7CisgICAgICAgICAgICAvLyBKQVJzIHVuZGVyIFdFQi1JTkYvbGliIG11c3QgYmUgc2Nhbm5lZCB1bmNvbmRpdGlvbmFsbHkgYWNjb3JkaW5nCisgICAgICAgICAgICAvLyB0byB0aGUgc3BlYy4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIGphck5hbWUgPSBqYXJQYXRoOworICAgICAgICAgICAgaW50IHNsYXNoID0gamFyUGF0aC5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgaWYgKHNsYXNoID49IDApIHsKKyAgICAgICAgICAgICAgICBqYXJOYW1lID0gamFyUGF0aC5zdWJzdHJpbmcoc2xhc2ggKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoIW5vVGxkSmFycy5jb250YWlucyhqYXJOYW1lKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1ZhbGlkYXRvci5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9WYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzFhZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9WYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDE1NDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5lbC5GdW5jdGlvbk1hcHBlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuRnVuY3Rpb25JbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BGcmFnbWVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuUGFnZURhdGE7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0F0dHJpYnV0ZUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0RhdGE7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnTGlicmFyeUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlZhbGlkYXRpb25NZXNzYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworCisvKioKKyAqIFBlcmZvcm1zIHZhbGlkYXRpb24gb24gdGhlIHBhZ2UgZWxlbWVudHMuICBBdHRyaWJ1dGVzIGFyZSBjaGVja2VkIGZvcgorICogbWFuZGF0b3J5IHByZXNlbmNlLCBlbnRyeSB2YWx1ZSB2YWxpZGl0eSwgYW5kIGNvbnNpc3RlbmN5LiAgQXMgYQorICogc2lkZSBlZmZlY3QsIHNvbWUgcGFnZSBnbG9iYWwgdmFsdWUgKHN1Y2ggYXMgdGhvc2UgZnJvbSBwYWdlIGRpcmVjaXR2ZXMpCisgKiBhcmUgc3RvcmVkLCBmb3IgbGF0ZXIgdXNlLgorICoKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICogQGF1dGhvciBKYW4gTHVlaGUKKyAqIEBhdXRob3IgU2hhd24gQmF5ZXJuCisgKiBAYXV0aG9yIE1hcmsgUm90aAorICovCitjbGFzcyBWYWxpZGF0b3IgeworCisgICAgLyoqCisgICAgICogQSB2aXNpdG9yIHRvIHZhbGlkYXRlIGFuZCBleHRyYWN0IHBhZ2UgZGlyZWN0aXZlIGluZm8KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgRGlyZWN0aXZlVmlzaXRvciBleHRlbmRzIE5vZGUuVmlzaXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBQYWdlSW5mbyBwYWdlSW5mbzsKKyAgICAgICAgcHJpdmF0ZSBFcnJvckRpc3BhdGNoZXIgZXJyOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGVbXSBwYWdlRGlyZWN0aXZlQXR0cnMgPSB7CisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgibGFuZ3VhZ2UiKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJleHRlbmRzIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiaW1wb3J0IiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgic2Vzc2lvbiIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImJ1ZmZlciIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImF1dG9GbHVzaCIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImlzVGhyZWFkU2FmZSIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImluZm8iKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJlcnJvclBhZ2UiKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJpc0Vycm9yUGFnZSIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImNvbnRlbnRUeXBlIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgicGFnZUVuY29kaW5nIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiaXNFTElnbm9yZWQiKQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBwYWdlRW5jb2RpbmdTZWVuID0gZmFsc2U7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29uc3RydWN0b3IKKyAgICAgICAgICovCisgICAgICAgIERpcmVjdGl2ZVZpc2l0b3IoQ29tcGlsZXIgY29tcGlsZXIpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgdGhpcy5wYWdlSW5mbyA9IGNvbXBpbGVyLmdldFBhZ2VJbmZvKCk7CisgICAgICAgICAgICB0aGlzLmVyciA9IGNvbXBpbGVyLmdldEVycm9yRGlzcGF0Y2hlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5JbmNsdWRlRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgLy8gU2luY2UgcGFnZURpcmVjdGl2ZVNlZW4gZmxhZyBvbmx5IGFwcGxpZXMgdG8gdGhlIEN1cnJlbnQgcGFnZQorICAgICAgICAgICAgLy8gc2F2ZSBpdCBoZXJlIGFuZCByZXN0b3JlIGl0IGFmdGVyIHRoZSBmaWxlIGlzIGluY2x1ZGVkLgorICAgICAgICAgICAgYm9vbGVhbiBwYWdlRW5jb2RpbmdTZWVuU2F2ZSA9IHBhZ2VFbmNvZGluZ1NlZW47CisgICAgICAgICAgICBwYWdlRW5jb2RpbmdTZWVuID0gZmFsc2U7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgICAgICBwYWdlRW5jb2RpbmdTZWVuID0gcGFnZUVuY29kaW5nU2VlblNhdmU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlBhZ2VEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7ICAgIAorCisgICAgICAgICAgICBKc3BVdGlsLmNoZWNrQXR0cmlidXRlcygiUGFnZSBkaXJlY3RpdmUiLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZURpcmVjdGl2ZUF0dHJzLCBlcnIpOworCisgICAgICAgICAgICAvLyBKU1AuMi4xMC4xCisgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzID0gbi5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgYXR0cnMgIT0gbnVsbCAmJiBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyID0gYXR0cnMuZ2V0UU5hbWUoaSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cnMuZ2V0VmFsdWUoaSk7CisKKyAgICAgICAgICAgICAgICBpZiAoImxhbmd1YWdlIi5lcXVhbHMoYXR0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VJbmZvLmdldExhbmd1YWdlKGZhbHNlKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWdlSW5mby5zZXRMYW5ndWFnZSh2YWx1ZSwgbiwgZXJyLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcGFnZUluZm8uZ2V0TGFuZ3VhZ2UoZmFsc2UpLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnBhZ2UuY29uZmxpY3QubGFuZ3VhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvLmdldExhbmd1YWdlKGZhbHNlKSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiZXh0ZW5kcyIuZXF1YWxzKGF0dHIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlSW5mby5nZXRFeHRlbmRzKGZhbHNlKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWdlSW5mby5zZXRFeHRlbmRzKHZhbHVlLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcGFnZUluZm8uZ2V0RXh0ZW5kcyhmYWxzZSkuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFnZS5jb25mbGljdC5leHRlbmRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlSW5mby5nZXRFeHRlbmRzKGZhbHNlKSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiY29udGVudFR5cGUiLmVxdWFscyhhdHRyKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFnZUluZm8uZ2V0Q29udGVudFR5cGUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWdlSW5mby5zZXRDb250ZW50VHlwZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXBhZ2VJbmZvLmdldENvbnRlbnRUeXBlKCkuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFnZS5jb25mbGljdC5jb250ZW50dHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUluZm8uZ2V0Q29udGVudFR5cGUoKSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgic2Vzc2lvbiIuZXF1YWxzKGF0dHIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlSW5mby5nZXRTZXNzaW9uKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUluZm8uc2V0U2Vzc2lvbih2YWx1ZSwgbiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcGFnZUluZm8uZ2V0U2Vzc2lvbigpLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnBhZ2UuY29uZmxpY3Quc2Vzc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUluZm8uZ2V0U2Vzc2lvbigpLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJidWZmZXIiLmVxdWFscyhhdHRyKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFnZUluZm8uZ2V0QnVmZmVyVmFsdWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWdlSW5mby5zZXRCdWZmZXJWYWx1ZSh2YWx1ZSwgbiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcGFnZUluZm8uZ2V0QnVmZmVyVmFsdWUoKS5lcXVhbHModmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUluZm8uZ2V0QnVmZmVyVmFsdWUoKSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiYXV0b0ZsdXNoIi5lcXVhbHMoYXR0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VJbmZvLmdldEF1dG9GbHVzaCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvLnNldEF1dG9GbHVzaCh2YWx1ZSwgbiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcGFnZUluZm8uZ2V0QXV0b0ZsdXNoKCkuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFnZS5jb25mbGljdC5hdXRvZmx1c2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvLmdldEF1dG9GbHVzaCgpLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJpc1RocmVhZFNhZmUiLmVxdWFscyhhdHRyKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFnZUluZm8uZ2V0SXNUaHJlYWRTYWZlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUluZm8uc2V0SXNUaHJlYWRTYWZlKHZhbHVlLCBuLCBlcnIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFwYWdlSW5mby5nZXRJc1RocmVhZFNhZmUoKS5lcXVhbHModmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmlzdGhyZWFkc2FmZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUluZm8uZ2V0SXNUaHJlYWRTYWZlKCksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImlzRUxJZ25vcmVkIi5lcXVhbHMoYXR0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VJbmZvLmdldElzRUxJZ25vcmVkKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUluZm8uc2V0SXNFTElnbm9yZWQodmFsdWUsIG4sIGVyciwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXBhZ2VJbmZvLmdldElzRUxJZ25vcmVkKCkuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFnZS5jb25mbGljdC5pc2VsaWdub3JlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUluZm8uZ2V0SXNFTElnbm9yZWQoKSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiaXNFcnJvclBhZ2UiLmVxdWFscyhhdHRyKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFnZUluZm8uZ2V0SXNFcnJvclBhZ2UoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWdlSW5mby5zZXRJc0Vycm9yUGFnZSh2YWx1ZSwgbiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcGFnZUluZm8uZ2V0SXNFcnJvclBhZ2UoKS5lcXVhbHModmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmlzZXJyb3JwYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlSW5mby5nZXRJc0Vycm9yUGFnZSgpLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJlcnJvclBhZ2UiLmVxdWFscyhhdHRyKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFnZUluZm8uZ2V0RXJyb3JQYWdlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUluZm8uc2V0RXJyb3JQYWdlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcGFnZUluZm8uZ2V0RXJyb3JQYWdlKCkuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFnZS5jb25mbGljdC5lcnJvcnBhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvLmdldEVycm9yUGFnZSgpLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJpbmZvIi5lcXVhbHMoYXR0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VJbmZvLmdldEluZm8oKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWdlSW5mby5zZXRJbmZvKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcGFnZUluZm8uZ2V0SW5mbygpLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnBhZ2UuY29uZmxpY3QuaW5mbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUluZm8uZ2V0SW5mbygpLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJwYWdlRW5jb2RpbmciLmVxdWFscyhhdHRyKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFnZUVuY29kaW5nU2VlbikgCisgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wYWdlLm11bHRpLnBhZ2VlbmNvZGluZyIpOworICAgICAgICAgICAgICAgICAgICAvLyAncGFnZUVuY29kaW5nJyBjYW4gb2NjdXIgYXQgbW9zdCBvbmNlIHBlciBmaWxlCisgICAgICAgICAgICAgICAgICAgIHBhZ2VFbmNvZGluZ1NlZW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjb21wYXJlUGFnZUVuY29kaW5ncyh2YWx1ZSwgbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGVjayBmb3IgYmFkIGNvbWJpbmF0aW9ucworICAgICAgICAgICAgaWYgKHBhZ2VJbmZvLmdldEJ1ZmZlcigpID09IDAgJiYgIXBhZ2VJbmZvLmlzQXV0b0ZsdXNoKCkpCisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFnZS5iYWRDb21ibyIpOworCisgICAgICAgICAgICAvLyBBdHRyaWJ1dGVzIGZvciBpbXBvcnRzIGZvciB0aGlzIG5vZGUgaGF2ZSBiZWVuIHByb2Nlc3NlZCBieQorICAgICAgICAgICAgLy8gdGhlIHBhcnNlcnMsIGp1c3QgYWRkIHRoZW0gdG8gcGFnZUluZm8uCisgICAgICAgICAgICBwYWdlSW5mby5hZGRJbXBvcnRzKG4uZ2V0SW1wb3J0cygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVGFnRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgLy8gTm90ZTogTW9zdCBvZiB0aGUgdmFsaWRhdGlvbiBpcyBkb25lIGluIFRhZ0ZpbGVQcm9jZXNzb3IKKyAgICAgICAgICAgIC8vIHdoZW4gaXQgY3JlYXRlZCBhIFRhZ0luZm8gb2JqZWN0IGZyb20gdGhlCisgICAgICAgICAgICAvLyB0YWcgZmlsZSBpbiB3aGljaCB0aGUgZGlyZWN0aXZlIGFwcGVhcmVkLgorICAgICAgICAKKyAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGRvZXMgYWRkaXRpb25hbCBwcm9jZXNzaW5nIHRvIGNvbGxlY3QgcGFnZSBpbmZvCisgICAgICAgICAgICAKKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBuLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBhdHRycyAhPSBudWxsICYmIGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHIgPSBhdHRycy5nZXRRTmFtZShpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRycy5nZXRWYWx1ZShpKTsKKworICAgICAgICAgICAgICAgIGlmICgibGFuZ3VhZ2UiLmVxdWFscyhhdHRyKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFnZUluZm8uZ2V0TGFuZ3VhZ2UoZmFsc2UpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvLnNldExhbmd1YWdlKHZhbHVlLCBuLCBlcnIsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcGFnZUluZm8uZ2V0TGFuZ3VhZ2UoZmFsc2UpLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnRhZy5jb25mbGljdC5sYW5ndWFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUluZm8uZ2V0TGFuZ3VhZ2UoZmFsc2UpLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJpc0VMSWdub3JlZCIuZXF1YWxzKGF0dHIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlSW5mby5nZXRJc0VMSWdub3JlZCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvLnNldElzRUxJZ25vcmVkKHZhbHVlLCBuLCBlcnIsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcGFnZUluZm8uZ2V0SXNFTElnbm9yZWQoKS5lcXVhbHModmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci50YWcuY29uZmxpY3QuaXNlbGlnbm9yZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvLmdldElzRUxJZ25vcmVkKCksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInBhZ2VFbmNvZGluZyIuZXF1YWxzKGF0dHIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlRW5jb2RpbmdTZWVuKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnRhZy5tdWx0aS5wYWdlZW5jb2RpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgcGFnZUVuY29kaW5nU2VlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG4uZ2V0Um9vdCgpLnNldFBhZ2VFbmNvZGluZyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBdHRyaWJ1dGVzIGZvciBpbXBvcnRzIGZvciB0aGlzIG5vZGUgaGF2ZSBiZWVuIHByb2Nlc3NlZCBieQorICAgICAgICAgICAgLy8gdGhlIHBhcnNlcnMsIGp1c3QgYWRkIHRoZW0gdG8gcGFnZUluZm8uCisgICAgICAgICAgICBwYWdlSW5mby5hZGRJbXBvcnRzKG4uZ2V0SW1wb3J0cygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuQXR0cmlidXRlRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgLy8gRG8gbm90aGluZywgc2luY2UgdGhpcyBhdHRyaWJ1dGUgZGlyZWN0aXZlIGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgICAgICAgIC8vIHZhbGlkYXRlZCBieSBUYWdGaWxlUHJvY2Vzc29yIHdoZW4gaXQgY3JlYXRlZCBhIFRhZ0luZm8gb2JqZWN0CisgICAgICAgICAgICAvLyBmcm9tIHRoZSB0YWcgZmlsZSBpbiB3aGljaCB0aGUgZGlyZWN0aXZlIGFwcGVhcmVkCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlZhcmlhYmxlRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgLy8gRG8gbm90aGluZywgc2luY2UgdGhpcyB2YXJpYWJsZSBkaXJlY3RpdmUgaGFzIGFscmVhZHkgYmVlbgorICAgICAgICAgICAgLy8gdmFsaWRhdGVkIGJ5IFRhZ0ZpbGVQcm9jZXNzb3Igd2hlbiBpdCBjcmVhdGVkIGEgVGFnSW5mbyBvYmplY3QKKyAgICAgICAgICAgIC8vIGZyb20gdGhlIHRhZyBmaWxlIGluIHdoaWNoIHRoZSBkaXJlY3RpdmUgYXBwZWFyZWQKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENvbXBhcmVzIHBhZ2UgZW5jb2RpbmdzIHNwZWNpZmllZCBpbiB2YXJpb3VzIHBsYWNlcywgYW5kIHRocm93cworICAgICAgICAgKiBleGNlcHRpb24gaW4gY2FzZSBvZiBwYWdlIGVuY29kaW5nIG1pc21hdGNoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGFnZURpckVuYyBUaGUgdmFsdWUgb2YgdGhlIHBhZ2VFbmNvZGluZyBhdHRyaWJ1dGUgb2YgdGhlCisgICAgICAgICAqIHBhZ2UgZGlyZWN0aXZlCisgICAgICAgICAqIEBwYXJhbSBwYWdlRGlyIFRoZSBwYWdlIGRpcmVjdGl2ZSBub2RlCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIGluIGNhc2Ugb2YgcGFnZSBlbmNvZGluZyBtaXNtYXRjaAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNvbXBhcmVQYWdlRW5jb2RpbmdzKFN0cmluZyBwYWdlRGlyRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS5QYWdlRGlyZWN0aXZlIHBhZ2VEaXIpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIE5vZGUuUm9vdCByb290ID0gcGFnZURpci5nZXRSb290KCk7CisgICAgICAgICAgICBTdHJpbmcgY29uZmlnRW5jID0gcm9vdC5nZXRKc3BDb25maWdQYWdlRW5jb2RpbmcoKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvbXBhcmUgdGhlICdwYWdlRW5jb2RpbmcnIGF0dHJpYnV0ZSBvZiB0aGUgcGFnZSBkaXJlY3RpdmUgd2l0aAorICAgICAgICAgICAgICogdGhlIGVuY29kaW5nIHNwZWNpZmllZCBpbiB0aGUgSlNQIGNvbmZpZyBlbGVtZW50IHdob3NlIFVSTAorICAgICAgICAgICAgICogcGF0dGVybiBtYXRjaGVzIHRoaXMgcGFnZS4KKyAgICAgICAgICAgICAqIFRyZWF0ICJVVEYtMTYiLCAiVVRGLTE2QkUiLCBhbmQgIlVURi0xNkxFIiBhcyBpZGVudGljYWwuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChjb25maWdFbmMgIT0gbnVsbCAmJiAhcGFnZURpckVuYy5lcXVhbHMoY29uZmlnRW5jKSAKKyAgICAgICAgICAgICAgICAgICAgJiYgKCFwYWdlRGlyRW5jLnN0YXJ0c1dpdGgoIlVURi0xNiIpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhY29uZmlnRW5jLnN0YXJ0c1dpdGgoIlVURi0xNiIpKSkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihwYWdlRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLmNvbmZpZ19wYWdlZGlyX2VuY29kaW5nX21pc21hdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRW5jLCBwYWdlRGlyRW5jKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvbXBhcmUgdGhlICdwYWdlRW5jb2RpbmcnIGF0dHJpYnV0ZSBvZiB0aGUgcGFnZSBkaXJlY3RpdmUgd2l0aAorICAgICAgICAgICAgICogdGhlIGVuY29kaW5nIHNwZWNpZmllZCBpbiB0aGUgWE1MIHByb2xvZyAob25seSBmb3IgWE1MIHN5bnRheCwKKyAgICAgICAgICAgICAqIGFuZCBvbmx5IGlmIEpTUCBkb2N1bWVudCBjb250YWlucyBYTUwgcHJvbG9nIHdpdGggZW5jb2RpbmcKKyAgICAgICAgICAgICAqIGRlY2xhcmF0aW9uKS4KKyAgICAgICAgICAgICAqIFRyZWF0ICJVVEYtMTYiLCAiVVRGLTE2QkUiLCBhbmQgIlVURi0xNkxFIiBhcyBpZGVudGljYWwuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChyb290LmlzWG1sU3ludGF4KCkgJiYgcm9vdC5pc0VuY29kaW5nU3BlY2lmaWVkSW5Qcm9sb2coKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYWdlRW5jID0gcm9vdC5nZXRQYWdlRW5jb2RpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBhZ2VEaXJFbmMuZXF1YWxzKHBhZ2VFbmMpIAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFwYWdlRGlyRW5jLnN0YXJ0c1dpdGgoIlVURi0xNiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXBhZ2VFbmMuc3RhcnRzV2l0aCgiVVRGLTE2IikpKSB7CisgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihwYWdlRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci5wcm9sb2dfcGFnZWRpcl9lbmNvZGluZ19taXNtYXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlRW5jLCBwYWdlRGlyRW5jKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHZpc2l0b3IgZm9yIHZhbGlkYXRpbmcgbm9kZXMgb3RoZXIgdGhhbiBwYWdlIGRpcmVjdGl2ZXMKKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgVmFsaWRhdGVWaXNpdG9yIGV4dGVuZHMgTm9kZS5WaXNpdG9yIHsKKworICAgICAgICBwcml2YXRlIFBhZ2VJbmZvIHBhZ2VJbmZvOworICAgICAgICBwcml2YXRlIEVycm9yRGlzcGF0Y2hlciBlcnI7CisgICAgICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgbG9hZGVyOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGVbXSBqc3BSb290QXR0cnMgPSB7CisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgieHNpOnNjaGVtYUxvY2F0aW9uIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgidmVyc2lvbiIsIHRydWUpIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZVtdIGluY2x1ZGVEaXJlY3RpdmVBdHRycyA9IHsKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJmaWxlIiwgdHJ1ZSkgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKc3BVdGlsLlZhbGlkQXR0cmlidXRlW10gdGFnbGliRGlyZWN0aXZlQXR0cnMgPSB7CisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgidXJpIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgidGFnZGlyIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgicHJlZml4IiwgdHJ1ZSkgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKc3BVdGlsLlZhbGlkQXR0cmlidXRlW10gaW5jbHVkZUFjdGlvbkF0dHJzID0geworICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInBhZ2UiLCB0cnVlLCB0cnVlKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJmbHVzaCIpIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZVtdIHBhcmFtQWN0aW9uQXR0cnMgPSB7CisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgibmFtZSIsIHRydWUpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInZhbHVlIiwgdHJ1ZSwgdHJ1ZSkgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKc3BVdGlsLlZhbGlkQXR0cmlidXRlW10gZm9yd2FyZEFjdGlvbkF0dHJzID0geworICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInBhZ2UiLCB0cnVlLCB0cnVlKSB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGVbXSBnZXRQcm9wZXJ0eUF0dHJzID0geworICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoIm5hbWUiLCB0cnVlKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJwcm9wZXJ0eSIsIHRydWUpIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZVtdIHNldFByb3BlcnR5QXR0cnMgPSB7CisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgibmFtZSIsIHRydWUpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInByb3BlcnR5IiwgdHJ1ZSksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgidmFsdWUiLCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgicGFyYW0iKSB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGVbXSB1c2VCZWFuQXR0cnMgPSB7CisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiaWQiLCB0cnVlKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJzY29wZSIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImNsYXNzIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgidHlwZSIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImJlYW5OYW1lIiwgZmFsc2UsIHRydWUpIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZVtdIHBsdWdJbkF0dHJzID0geworICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInR5cGUiLHRydWUpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImNvZGUiLCB0cnVlKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJjb2RlYmFzZSIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImFsaWduIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiYXJjaGl2ZSIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImhlaWdodCIsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJoc3BhY2UiKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJqcmV2ZXJzaW9uIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgibmFtZSIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInZzcGFjZSIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoIndpZHRoIiwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoIm5zcGx1Z2ludXJsIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiaWVwbHVnaW51cmwiKSB9OworICAgICAgICAgICAgCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGVbXSBhdHRyaWJ1dGVBdHRycyA9IHsKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJuYW1lIiwgdHJ1ZSksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgidHJpbSIpIH07CisgICAgICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZVtdIGludm9rZUF0dHJzID0geworICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImZyYWdtZW50IiwgdHJ1ZSksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgidmFyIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgidmFyUmVhZGVyIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgic2NvcGUiKSB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGVbXSBkb0JvZHlBdHRycyA9IHsKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJ2YXIiKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJ2YXJSZWFkZXIiKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJzY29wZSIpIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZVtdIGpzcE91dHB1dEF0dHJzID0geworICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoIm9taXQteG1sLWRlY2xhcmF0aW9uIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiZG9jdHlwZS1yb290LWVsZW1lbnQiKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJkb2N0eXBlLXB1YmxpYyIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImRvY3R5cGUtc3lzdGVtIikgfTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAgICAgKi8KKyAgICAgICAgVmFsaWRhdGVWaXNpdG9yKENvbXBpbGVyIGNvbXBpbGVyKSB7CisgICAgICAgICAgICB0aGlzLnBhZ2VJbmZvID0gY29tcGlsZXIuZ2V0UGFnZUluZm8oKTsKKyAgICAgICAgICAgIHRoaXMuZXJyID0gY29tcGlsZXIuZ2V0RXJyb3JEaXNwYXRjaGVyKCk7CisgICAgICAgICAgICB0aGlzLmxvYWRlciA9IGNvbXBpbGVyLmdldENvbXBpbGF0aW9uQ29udGV4dCgpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkpzcFJvb3QgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBKc3BVdGlsLmNoZWNrQXR0cmlidXRlcygiSnNwOnJvb3QiLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNwUm9vdEF0dHJzLCBlcnIpOworICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBuLmdldFRleHRBdHRyaWJ1dGUoInZlcnNpb24iKTsKKyAgICAgICAgICAgIGlmICghdmVyc2lvbi5lcXVhbHMoIjEuMiIpICYmICF2ZXJzaW9uLmVxdWFscygiMi4wIikpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5qc3Byb290LnZlcnNpb24uaW52YWxpZCIsIHZlcnNpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5JbmNsdWRlRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgSnNwVXRpbC5jaGVja0F0dHJpYnV0ZXMoIkluY2x1ZGUgZGlyZWN0aXZlIiwgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVEaXJlY3RpdmVBdHRycywgZXJyKTsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVGFnbGliRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgSnNwVXRpbC5jaGVja0F0dHJpYnV0ZXMoIlRhZ2xpYiBkaXJlY3RpdmUiLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnbGliRGlyZWN0aXZlQXR0cnMsIGVycik7CisgICAgICAgICAgICAvLyBFaXRoZXIgJ3VyaScgb3IgJ3RhZ2RpcicgYXR0cmlidXRlIG11c3QgYmUgc3BlY2lmaWVkCisgICAgICAgICAgICBTdHJpbmcgdXJpID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgidXJpIik7CisgICAgICAgICAgICBTdHJpbmcgdGFnZGlyID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgidGFnZGlyIik7CisgICAgICAgICAgICBpZiAodXJpID09IG51bGwgJiYgdGFnZGlyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci50YWdsaWJEaXJlY3RpdmUubWlzc2luZy5sb2NhdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsICYmIHRhZ2RpciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IudGFnbGliRGlyZWN0aXZlLmJvdGhfdXJpX2FuZF90YWdkaXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuUGFyYW1BY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBKc3BVdGlsLmNoZWNrQXR0cmlidXRlcygiUGFyYW0gYWN0aW9uIiwgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtQWN0aW9uQXR0cnMsIGVycik7CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHZhbHVlIG9mIHRoZSAnbmFtZScgYXR0cmlidXRlIGlzIG5vdCBhCisgICAgICAgICAgICAvLyByZXF1ZXN0LXRpbWUgZXhwcmVzc2lvbgorICAgICAgICAgICAgdGhyb3dFcnJvcklmRXhwcmVzc2lvbihuLCAibmFtZSIsICJqc3A6cGFyYW0iKTsKKyAgICAgICAgICAgIG4uc2V0VmFsdWUoZ2V0SnNwQXR0cmlidXRlKCJ2YWx1ZSIsIG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldEF0dHJpYnV0ZVZhbHVlKCJ2YWx1ZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZy5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4sIGZhbHNlKSk7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlBhcmFtc0FjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSd2ZSBnb3QgYXQgbGVhc3Qgb25lIG5lc3RlZCBqc3A6cGFyYW0KKyAgICAgICAgICAgIE5vZGUuTm9kZXMgc3ViRWxlbXMgPSBuLmdldEJvZHkoKTsKKyAgICAgICAgICAgIGlmIChzdWJFbGVtcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFyYW1zLmVtcHR5Qm9keSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5JbmNsdWRlQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgSnNwVXRpbC5jaGVja0F0dHJpYnV0ZXMoIkluY2x1ZGUgYWN0aW9uIiwgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBY3Rpb25BdHRycywgZXJyKTsKKyAgICAgICAgICAgIG4uc2V0UGFnZShnZXRKc3BBdHRyaWJ1dGUoInBhZ2UiLCBudWxsLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldEF0dHJpYnV0ZVZhbHVlKCJwYWdlIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBuLCBmYWxzZSkpOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuRm9yd2FyZEFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEpzcFV0aWwuY2hlY2tBdHRyaWJ1dGVzKCJGb3J3YXJkIiwgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRBY3Rpb25BdHRycywgZXJyKTsKKyAgICAgICAgICAgIG4uc2V0UGFnZShnZXRKc3BBdHRyaWJ1dGUoInBhZ2UiLCBudWxsLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldEF0dHJpYnV0ZVZhbHVlKCJwYWdlIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBuLCBmYWxzZSkpOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5HZXRQcm9wZXJ0eSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEpzcFV0aWwuY2hlY2tBdHRyaWJ1dGVzKCJHZXRQcm9wZXJ0eSIsIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0eUF0dHJzLCBlcnIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5TZXRQcm9wZXJ0eSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEpzcFV0aWwuY2hlY2tBdHRyaWJ1dGVzKCJTZXRQcm9wZXJ0eSIsIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eUF0dHJzLCBlcnIpOworICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gbi5nZXRUZXh0QXR0cmlidXRlKCJwcm9wZXJ0eSIpOworICAgICAgICAgICAgU3RyaW5nIHBhcmFtID0gbi5nZXRUZXh0QXR0cmlidXRlKCJwYXJhbSIpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgidmFsdWUiKTsKKworICAgICAgICAgICAgbi5zZXRWYWx1ZShnZXRKc3BBdHRyaWJ1dGUoInZhbHVlIiwgbnVsbCwgbnVsbCwgdmFsdWUsIAorICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG4sIGZhbHNlKSk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gdmFsdWVTcGVjaWZpZWQgPSBuLmdldFZhbHVlKCkgIT0gbnVsbDsKKworICAgICAgICAgICAgaWYgKCIqIi5lcXVhbHMocHJvcGVydHkpKSB7IAorICAgICAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsIHx8IHZhbHVlU3BlY2lmaWVkKQorICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5zZXRQcm9wZXJ0eS5pbnZhbGlkIik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtICE9IG51bGwgJiYgdmFsdWVTcGVjaWZpZWQpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5zZXRQcm9wZXJ0eS5pbnZhbGlkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVXNlQmVhbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEpzcFV0aWwuY2hlY2tBdHRyaWJ1dGVzKCJVc2VCZWFuIiwgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUJlYW5BdHRycywgZXJyKTsKKworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuLmdldFRleHRBdHRyaWJ1dGUgKCJpZCIpOworICAgICAgICAgICAgU3RyaW5nIHNjb3BlID0gbi5nZXRUZXh0QXR0cmlidXRlICgic2NvcGUiKTsKKyAgICAgICAgICAgIEpzcFV0aWwuY2hlY2tTY29wZShzY29wZSwgbiwgZXJyKTsKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBuLmdldFRleHRBdHRyaWJ1dGUgKCJjbGFzcyIpOworICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBuLmdldFRleHRBdHRyaWJ1dGUgKCJ0eXBlIik7CisgICAgICAgICAgICBCZWFuUmVwb3NpdG9yeSBiZWFuSW5mbyA9IHBhZ2VJbmZvLmdldEJlYW5SZXBvc2l0b3J5KCk7CisKKyAgICAgICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCAmJiB0eXBlID09IG51bGwpCisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IudXNlYmVhbi5taXNzaW5nVHlwZSIpOworCisgICAgICAgICAgICBpZiAoYmVhbkluZm8uY2hlY2tWYXJpYWJsZShuYW1lKSkKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci51c2ViZWFuLmR1cGxpY2F0ZSIpOworCisgICAgICAgICAgICBpZiAoInNlc3Npb24iLmVxdWFscyhzY29wZSkgJiYgIXBhZ2VJbmZvLmlzU2Vzc2lvbigpKQorICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnVzZWJlYW4ubm9TZXNzaW9uIik7CisKKyAgICAgICAgICAgIE5vZGUuSnNwQXR0cmlidXRlIGphdHRyCisgICAgICAgICAgICAgICAgPSBnZXRKc3BBdHRyaWJ1dGUoImJlYW5OYW1lIiwgbnVsbCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldEF0dHJpYnV0ZVZhbHVlKCJiZWFuTmFtZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIG4sIGZhbHNlKTsKKyAgICAgICAgICAgIG4uc2V0QmVhbk5hbWUoamF0dHIpOworICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGphdHRyICE9IG51bGwpCisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IudXNlYmVhbi5ub3RCb3RoIik7CisKKyAgICAgICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB0eXBlOworCisgICAgICAgICAgICBiZWFuSW5mby5hZGRCZWFuKG4sIG5hbWUsIGNsYXNzTmFtZSwgc2NvcGUpOworCisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlBsdWdJbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEpzcFV0aWwuY2hlY2tBdHRyaWJ1dGVzKCJQbHVnaW4iLCBuLCBwbHVnSW5BdHRycywgZXJyKTsKKworICAgICAgICAgICAgdGhyb3dFcnJvcklmRXhwcmVzc2lvbihuLCAidHlwZSIsICJqc3A6cGx1Z2luIik7CisgICAgICAgICAgICB0aHJvd0Vycm9ySWZFeHByZXNzaW9uKG4sICJjb2RlIiwgImpzcDpwbHVnaW4iKTsKKyAgICAgICAgICAgIHRocm93RXJyb3JJZkV4cHJlc3Npb24obiwgImNvZGViYXNlIiwgImpzcDpwbHVnaW4iKTsKKyAgICAgICAgICAgIHRocm93RXJyb3JJZkV4cHJlc3Npb24obiwgImFsaWduIiwgImpzcDpwbHVnaW4iKTsKKyAgICAgICAgICAgIHRocm93RXJyb3JJZkV4cHJlc3Npb24obiwgImFyY2hpdmUiLCAianNwOnBsdWdpbiIpOworICAgICAgICAgICAgdGhyb3dFcnJvcklmRXhwcmVzc2lvbihuLCAiaHNwYWNlIiwgImpzcDpwbHVnaW4iKTsKKyAgICAgICAgICAgIHRocm93RXJyb3JJZkV4cHJlc3Npb24obiwgImpyZXZlcnNpb24iLCAianNwOnBsdWdpbiIpOworICAgICAgICAgICAgdGhyb3dFcnJvcklmRXhwcmVzc2lvbihuLCAibmFtZSIsICJqc3A6cGx1Z2luIik7CisgICAgICAgICAgICB0aHJvd0Vycm9ySWZFeHByZXNzaW9uKG4sICJ2c3BhY2UiLCAianNwOnBsdWdpbiIpOworICAgICAgICAgICAgdGhyb3dFcnJvcklmRXhwcmVzc2lvbihuLCAibnNwbHVnaW51cmwiLCAianNwOnBsdWdpbiIpOworICAgICAgICAgICAgdGhyb3dFcnJvcklmRXhwcmVzc2lvbihuLCAiaWVwbHVnaW51cmwiLCAianNwOnBsdWdpbiIpOworCisgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgidHlwZSIpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wbHVnaW4ubm90eXBlIik7CisgICAgICAgICAgICBpZiAoIXR5cGUuZXF1YWxzKCJiZWFuIikgJiYgIXR5cGUuZXF1YWxzKCJhcHBsZXQiKSkKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wbHVnaW4uYmFkdHlwZSIpOworICAgICAgICAgICAgaWYgKG4uZ2V0VGV4dEF0dHJpYnV0ZSgiY29kZSIpID09IG51bGwpCisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGx1Z2luLm5vY29kZSIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZSB3aWR0aAorICAgICAgICAgICAgICAgID0gZ2V0SnNwQXR0cmlidXRlKCJ3aWR0aCIsIG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5nZXRBdHRyaWJ1dGVWYWx1ZSgid2lkdGgiKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgbiwgZmFsc2UpOworICAgICAgICAgICAgbi5zZXRXaWR0aCggd2lkdGggKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgTm9kZS5Kc3BBdHRyaWJ1dGUgaGVpZ2h0CisgICAgICAgICAgICAgICAgPSBnZXRKc3BBdHRyaWJ1dGUoImhlaWdodCIsIG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5nZXRBdHRyaWJ1dGVWYWx1ZSgiaGVpZ2h0IiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIG4sIGZhbHNlKTsKKyAgICAgICAgICAgIG4uc2V0SGVpZ2h0KCBoZWlnaHQgKTsKKworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5OYW1lZEF0dHJpYnV0ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEpzcFV0aWwuY2hlY2tBdHRyaWJ1dGVzKCJBdHRyaWJ1dGUiLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlQXR0cnMsIGVycik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSnNwQm9keSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5EZWNsYXJhdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChwYWdlSW5mby5pc1NjcmlwdGluZ0ludmFsaWQoKSkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLmdldFN0YXJ0KCksICJqc3AuZXJyb3Iubm8uc2NyaXB0bGV0cyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5FeHByZXNzaW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHBhZ2VJbmZvLmlzU2NyaXB0aW5nSW52YWxpZCgpKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4uZ2V0U3RhcnQoKSwgImpzcC5lcnJvci5uby5zY3JpcHRsZXRzIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlNjcmlwdGxldCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChwYWdlSW5mby5pc1NjcmlwdGluZ0ludmFsaWQoKSkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLmdldFN0YXJ0KCksICJqc3AuZXJyb3Iubm8uc2NyaXB0bGV0cyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5FTEV4cHJlc3Npb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoICFwYWdlSW5mby5pc0VMSWdub3JlZCgpICkgeworICAgICAgICAgICAgICAgIFN0cmluZyBleHByZXNzaW9ucyA9ICIkeyIgKyBuZXcgU3RyaW5nKG4uZ2V0VGV4dCgpKSArICJ9IjsKKyAgICAgICAgICAgICAgICBFTE5vZGUuTm9kZXMgZWwgPSBFTFBhcnNlci5wYXJzZShleHByZXNzaW9ucyk7CisgICAgICAgICAgICAgICAgdmFsaWRhdGVGdW5jdGlvbnMoZWwsIG4pOworICAgICAgICAgICAgICAgIEpzcFV0aWwudmFsaWRhdGVFeHByZXNzaW9ucygKKyAgICAgICAgICAgICAgICAgICAgbi5nZXRTdGFydCgpLAorICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgLy8gWFhYIC0gU2hvdWxkIHRlbXBsYXRlIHRleHQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBldmFsdWF0ZSB0byBTdHJpbmc/CisgICAgICAgICAgICAgICAgICAgIGdldEZ1bmN0aW9uTWFwcGVyKGVsKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgICAgICAgICBuLnNldEVMKGVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVW5pbnRlcnByZXRlZFRhZyBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChuLmdldE5hbWVkQXR0cmlidXRlTm9kZXMoKS5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLm5hbWVkQXR0cmlidXRlLmludmFsaWRVc2UiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IG4uZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgaWYgKGF0dHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgYXR0clNpemUgPSBhdHRycy5nZXRMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZVtdIGpzcEF0dHJzID0gbmV3IE5vZGUuSnNwQXR0cmlidXRlW2F0dHJTaXplXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBhdHRyU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGpzcEF0dHJzW2ldID0gZ2V0SnNwQXR0cmlidXRlKGF0dHJzLmdldFFOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRVUkkoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldExvY2FsTmFtZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0VmFsdWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbi5zZXRKc3BBdHRyaWJ1dGVzKGpzcEF0dHJzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5DdXN0b21UYWcgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIFRhZ0luZm8gdGFnSW5mbyA9IG4uZ2V0VGFnSW5mbygpOworICAgICAgICAgICAgaWYgKHRhZ0luZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLm1pc3NpbmcudGFnSW5mbyIsIG4uZ2V0UU5hbWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgYm9keWNvbmV0IG9mIGEgU2ltcGxlVGFnIGNhbm5vdCBiZSBKU1AuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChuLmltcGxlbWVudHNTaW1wbGVUYWcoKSAmJgorICAgICAgICAgICAgICAgIHRhZ0luZm8uZ2V0Qm9keUNvbnRlbnQoKS5lcXVhbHNJZ25vcmVDYXNlKFRhZ0luZm8uQk9EWV9DT05URU5UX0pTUCkpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5zaW1wbGV0YWcuYmFkYm9keWNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFnSW5mby5nZXRUYWdDbGFzc05hbWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJZiB0aGUgdGFnIGhhbmRsZXIgZGVjbGFyZXMgaW4gdGhlIFRMRCB0aGF0IGl0IHN1cHBvcnRzIGR5bmFtaWMKKyAgICAgICAgICAgICAqIGF0dHJpYnV0ZXMsIGl0IGFsc28gbXVzdCBpbXBsZW1lbnQgdGhlIER5bmFtaWNBdHRyaWJ1dGVzCisgICAgICAgICAgICAgKiBpbnRlcmZhY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICh0YWdJbmZvLmhhc0R5bmFtaWNBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgIW4uaW1wbGVtZW50c0R5bmFtaWNBdHRyaWJ1dGVzKCkpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5keW5hbWljLmF0dHJpYnV0ZXMubm90LmltcGxlbWVudGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5nZXRRTmFtZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIE1ha2Ugc3VyZSBhbGwgcmVxdWlyZWQgYXR0cmlidXRlcyBhcmUgcHJlc2VudCwgZWl0aGVyIGFzCisgICAgICAgICAgICAgKiBhdHRyaWJ1dGVzIG9yIG5hbWVkIGF0dHJpYnV0ZXMgKDxqc3A6YXR0cmlidXRlPikuCisgICAgICAgICAgICAgICogQWxzbyBtYWtlIHN1cmUgdGhhdCB0aGUgc2FtZSBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCBpbgorICAgICAgICAgICAgICogYm90aCBhdHRyaWJ1dGVzIG9yIG5hbWVkIGF0dHJpYnV0ZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFRhZ0F0dHJpYnV0ZUluZm9bXSB0bGRBdHRycyA9IHRhZ0luZm8uZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgU3RyaW5nIGN1c3RvbUFjdGlvblVyaSA9IG4uZ2V0VVJJKCk7CisgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzID0gbi5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBpbnQgYXR0cnNTaXplID0gKGF0dHJzID09IG51bGwpID8gMCA6IGF0dHJzLmdldExlbmd0aCgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHRsZEF0dHJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHIgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChhdHRycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHIgPSBhdHRycy5nZXRWYWx1ZSh0bGRBdHRyc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyID0gYXR0cnMuZ2V0VmFsdWUoY3VzdG9tQWN0aW9uVXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsZEF0dHJzW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTm9kZS5OYW1lZEF0dHJpYnV0ZSBuYSA9CisgICAgICAgICAgICAgICAgICAgICAgICBuLmdldE5hbWVkQXR0cmlidXRlTm9kZSh0bGRBdHRyc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICh0bGRBdHRyc1tpXS5pc1JlcXVpcmVkKCkgJiYgYXR0ciA9PSBudWxsICYmIG5hID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IubWlzc2luZ19hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxkQXR0cnNbaV0uZ2V0TmFtZSgpLCBuLmdldExvY2FsTmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBuYSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLmR1cGxpY2F0ZS5uYW1lLmpzcGF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICB0bGRBdHRyc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTm9kZS5Ob2RlcyBuYU5vZGVzID0gbi5nZXROYW1lZEF0dHJpYnV0ZU5vZGVzKCk7CisgICAgICAgICAgICBpbnQganNwQXR0cnNTaXplID0gbmFOb2Rlcy5zaXplKCkgKyBhdHRyc1NpemU7CisgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZVtdIGpzcEF0dHJzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChqc3BBdHRyc1NpemUgPiAwKSB7CisgICAgICAgICAgICAgICAganNwQXR0cnMgPSBuZXcgTm9kZS5Kc3BBdHRyaWJ1dGVbanNwQXR0cnNTaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEhhc2h0YWJsZSB0YWdEYXRhQXR0cnMgPSBuZXcgSGFzaHRhYmxlKGF0dHJzU2l6ZSk7CisKKyAgICAgICAgICAgIGNoZWNrWG1sQXR0cmlidXRlcyhuLCBqc3BBdHRycywgdGFnRGF0YUF0dHJzKTsKKyAgICAgICAgICAgIGNoZWNrTmFtZWRBdHRyaWJ1dGVzKG4sIGpzcEF0dHJzLCBhdHRyc1NpemUsIHRhZ0RhdGFBdHRycyk7CisKKyAgICAgICAgICAgIFRhZ0RhdGEgdGFnRGF0YSA9IG5ldyBUYWdEYXRhKHRhZ0RhdGFBdHRycyk7CisKKyAgICAgICAgICAgIC8vIEpTUC5DMTogSXQgaXMgYSAodHJhbnNsYXRpb24gdGltZSkgZXJyb3IgZm9yIGFuIGFjdGlvbiB0aGF0CisgICAgICAgICAgICAvLyBoYXMgb25lIG9yIG1vcmUgdmFyaWFibGUgc3ViZWxlbWVudHMgdG8gaGF2ZSBhIFRhZ0V4dHJhSW5mbworICAgICAgICAgICAgLy8gY2xhc3MgdGhhdCByZXR1cm5zIGEgbm9uLW51bGwgb2JqZWN0LgorICAgICAgICAgICAgVGFnRXh0cmFJbmZvIHRlaSA9IHRhZ0luZm8uZ2V0VGFnRXh0cmFJbmZvKCk7CisgICAgICAgICAgICBpZiAodGVpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgdGVpLmdldFZhcmlhYmxlSW5mbyh0YWdEYXRhKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIHRlaS5nZXRWYXJpYWJsZUluZm8odGFnRGF0YSkubGVuZ3RoID4gMAorICAgICAgICAgICAgICAgICAgICAmJiB0YWdJbmZvLmdldFRhZ1ZhcmlhYmxlSW5mb3MoKS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3Iubm9uX251bGxfdGVpX2FuZF92YXJfc3ViZWxlbXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldFFOYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuLnNldFRhZ0RhdGEodGFnRGF0YSk7CisgICAgICAgICAgICBuLnNldEpzcEF0dHJpYnV0ZXMoanNwQXR0cnMpOworCisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkpzcEVsZW1lbnQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBuLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIGlmIChhdHRycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuanNwZWxlbWVudC5taXNzaW5nLm5hbWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCB4bWxBdHRyTGVuID0gYXR0cnMuZ2V0TGVuZ3RoKCk7CisKKyAgICAgICAgICAgIE5vZGUuTm9kZXMgbmFtZWRBdHRycyA9IG4uZ2V0TmFtZWRBdHRyaWJ1dGVOb2RlcygpOworCisgICAgICAgICAgICAvLyBYTUwtc3R5bGUgJ25hbWUnIGF0dHJpYnV0ZSwgd2hpY2ggaXMgbWFuZGF0b3J5LCBtdXN0IG5vdCBiZQorICAgICAgICAgICAgLy8gaW5jbHVkZWQgaW4gSnNwQXR0cmlidXRlIGFycmF5CisgICAgICAgICAgICBpbnQganNwQXR0clNpemUgPSB4bWxBdHRyTGVuLTEgKyBuYW1lZEF0dHJzLnNpemUoKTsKKworICAgICAgICAgICAgTm9kZS5Kc3BBdHRyaWJ1dGVbXSBqc3BBdHRycyA9IG5ldyBOb2RlLkpzcEF0dHJpYnV0ZVtqc3BBdHRyU2l6ZV07CisgICAgICAgICAgICBpbnQganNwQXR0ckluZGV4ID0gMDsKKworICAgICAgICAgICAgLy8gUHJvY2VzcyBYTUwtc3R5bGUgYXR0cmlidXRlcworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHhtbEF0dHJMZW47IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgibmFtZSIuZXF1YWxzKGF0dHJzLmdldExvY2FsTmFtZShpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbi5zZXROYW1lQXR0cmlidXRlKGdldEpzcEF0dHJpYnV0ZShhdHRycy5nZXRRTmFtZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRVUkkoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0TG9jYWxOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFZhbHVlKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChqc3BBdHRySW5kZXg8anNwQXR0clNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzcEF0dHJzW2pzcEF0dHJJbmRleCsrXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZ2V0SnNwQXR0cmlidXRlKGF0dHJzLmdldFFOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFVSSShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRMb2NhbE5hbWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0VmFsdWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdC5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuLmdldE5hbWVBdHRyaWJ1dGUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuanNwZWxlbWVudC5taXNzaW5nLm5hbWUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUHJvY2VzcyBuYW1lZCBhdHRyaWJ1dGVzCisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bmFtZWRBdHRycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIE5vZGUuTmFtZWRBdHRyaWJ1dGUgbmEgPQorICAgICAgICAgICAgICAgICAgICAoTm9kZS5OYW1lZEF0dHJpYnV0ZSkgbmFtZWRBdHRycy5nZXROb2RlKGkpOworICAgICAgICAgICAgICAgIGpzcEF0dHJzW2pzcEF0dHJJbmRleCsrXSA9IG5ldyBOb2RlLkpzcEF0dHJpYnV0ZShuYSwgZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuLnNldEpzcEF0dHJpYnV0ZXMoanNwQXR0cnMpOworCisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkpzcE91dHB1dCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEpzcFV0aWwuY2hlY2tBdHRyaWJ1dGVzKCJqc3A6b3V0cHV0IiwgbiwganNwT3V0cHV0QXR0cnMsIGVycik7CisKKyAgICAgICAgICAgIGlmIChuLmdldEJvZHkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuanNwb3V0cHV0Lm5vbmVtcHR5Ym9keSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgb21pdFhtbERlY2wgPSBuLmdldEF0dHJpYnV0ZVZhbHVlKCJvbWl0LXhtbC1kZWNsYXJhdGlvbiIpOworICAgICAgICAgICAgU3RyaW5nIGRvY3R5cGVOYW1lID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgiZG9jdHlwZS1yb290LWVsZW1lbnQiKTsKKyAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlUHVibGljID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgiZG9jdHlwZS1wdWJsaWMiKTsKKyAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlU3lzdGVtID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgiZG9jdHlwZS1zeXN0ZW0iKTsKKworICAgICAgICAgICAgU3RyaW5nIG9taXRYbWxEZWNsT2xkID0gcGFnZUluZm8uZ2V0T21pdFhtbERlY2woKTsKKyAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlTmFtZU9sZCA9IHBhZ2VJbmZvLmdldERvY3R5cGVOYW1lKCk7CisgICAgICAgICAgICBTdHJpbmcgZG9jdHlwZVB1YmxpY09sZCA9IHBhZ2VJbmZvLmdldERvY3R5cGVQdWJsaWMoKTsKKyAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlU3lzdGVtT2xkID0gcGFnZUluZm8uZ2V0RG9jdHlwZVN5c3RlbSgpOworCisgICAgICAgICAgICBpZiAob21pdFhtbERlY2wgIT0gbnVsbCAmJiBvbWl0WG1sRGVjbE9sZCAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhb21pdFhtbERlY2wuZXF1YWxzKG9taXRYbWxEZWNsT2xkKSApIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5qc3BvdXRwdXQuY29uZmxpY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9taXQteG1sLWRlY2xhcmF0aW9uIiwgb21pdFhtbERlY2xPbGQsIG9taXRYbWxEZWNsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRvY3R5cGVOYW1lICE9IG51bGwgJiYgZG9jdHlwZU5hbWVPbGQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIWRvY3R5cGVOYW1lLmVxdWFscyhkb2N0eXBlTmFtZU9sZCkgKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuanNwb3V0cHV0LmNvbmZsaWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkb2N0eXBlLXJvb3QtZWxlbWVudCIsIGRvY3R5cGVOYW1lT2xkLCBkb2N0eXBlTmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkb2N0eXBlUHVibGljICE9IG51bGwgJiYgZG9jdHlwZVB1YmxpY09sZCAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhZG9jdHlwZVB1YmxpYy5lcXVhbHMoZG9jdHlwZVB1YmxpY09sZCkgKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuanNwb3V0cHV0LmNvbmZsaWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkb2N0eXBlLXB1YmxpYyIsIGRvY3R5cGVQdWJsaWNPbGQsIGRvY3R5cGVQdWJsaWMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZG9jdHlwZVN5c3RlbSAhPSBudWxsICYmIGRvY3R5cGVTeXN0ZW1PbGQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIWRvY3R5cGVTeXN0ZW0uZXF1YWxzKGRvY3R5cGVTeXN0ZW1PbGQpICkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLmpzcG91dHB1dC5jb25mbGljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZG9jdHlwZS1zeXN0ZW0iLCBkb2N0eXBlU3lzdGVtT2xkLCBkb2N0eXBlU3lzdGVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRvY3R5cGVOYW1lID09IG51bGwgJiYgZG9jdHlwZVN5c3RlbSAhPSBudWxsIHx8CisgICAgICAgICAgICAgICAgZG9jdHlwZU5hbWUgIT0gbnVsbCAmJiBkb2N0eXBlU3lzdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5qc3BvdXRwdXQuZG9jdHlwZW5hbWVzeXN0ZW0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRvY3R5cGVQdWJsaWMgIT0gbnVsbCAmJiBkb2N0eXBlU3lzdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5qc3BvdXRwdXQuZG9jdHlwZXB1bGljc3lzdGVtIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvbWl0WG1sRGVjbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGFnZUluZm8uc2V0T21pdFhtbERlY2wob21pdFhtbERlY2wpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRvY3R5cGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYWdlSW5mby5zZXREb2N0eXBlTmFtZShkb2N0eXBlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZG9jdHlwZVN5c3RlbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGFnZUluZm8uc2V0RG9jdHlwZVN5c3RlbShkb2N0eXBlU3lzdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkb2N0eXBlUHVibGljICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYWdlSW5mby5zZXREb2N0eXBlUHVibGljKGRvY3R5cGVQdWJsaWMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5JbnZva2VBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIEpzcFV0aWwuY2hlY2tBdHRyaWJ1dGVzKCJJbnZva2UiLCBuLCBpbnZva2VBdHRycywgZXJyKTsKKworICAgICAgICAgICAgU3RyaW5nIHNjb3BlID0gbi5nZXRUZXh0QXR0cmlidXRlICgic2NvcGUiKTsKKyAgICAgICAgICAgIEpzcFV0aWwuY2hlY2tTY29wZShzY29wZSwgbiwgZXJyKTsKKworICAgICAgICAgICAgU3RyaW5nIHZhciA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgidmFyIik7CisgICAgICAgICAgICBTdHJpbmcgdmFyUmVhZGVyID0gbi5nZXRUZXh0QXR0cmlidXRlKCJ2YXJSZWFkZXIiKTsKKyAgICAgICAgICAgIGlmIChzY29wZSAhPSBudWxsICYmIHZhciA9PSBudWxsICYmIHZhclJlYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IubWlzc2luZ192YXJfb3JfdmFyUmVhZGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFyICE9IG51bGwgJiYgdmFyUmVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci52YXJfYW5kX3ZhclJlYWRlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Eb0JvZHlBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIEpzcFV0aWwuY2hlY2tBdHRyaWJ1dGVzKCJEb0JvZHkiLCBuLCBkb0JvZHlBdHRycywgZXJyKTsKKworICAgICAgICAgICAgU3RyaW5nIHNjb3BlID0gbi5nZXRUZXh0QXR0cmlidXRlICgic2NvcGUiKTsKKyAgICAgICAgICAgIEpzcFV0aWwuY2hlY2tTY29wZShzY29wZSwgbiwgZXJyKTsKKworICAgICAgICAgICAgU3RyaW5nIHZhciA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgidmFyIik7CisgICAgICAgICAgICBTdHJpbmcgdmFyUmVhZGVyID0gbi5nZXRUZXh0QXR0cmlidXRlKCJ2YXJSZWFkZXIiKTsKKyAgICAgICAgICAgIGlmIChzY29wZSAhPSBudWxsICYmIHZhciA9PSBudWxsICYmIHZhclJlYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IubWlzc2luZ192YXJfb3JfdmFyUmVhZGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFyICE9IG51bGwgJiYgdmFyUmVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci52YXJfYW5kX3ZhclJlYWRlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFrZSBzdXJlIHRoZSBnaXZlbiBjdXN0b20gYWN0aW9uIGRvZXMgbm90IGhhdmUgYW55IGludmFsaWQKKyAgICAgICAgICogYXR0cmlidXRlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQSBjdXN0b20gYWN0aW9uIGFuZCBpdHMgZGVjbGFyZWQgYXR0cmlidXRlcyBhbHdheXMgYmVsb25nIHRvIHRoZQorICAgICAgICAgKiBzYW1lIG5hbWVzcGFjZSwgd2hpY2ggaXMgaWRlbnRpZmllZCBieSB0aGUgcHJlZml4IG5hbWUgb2YgdGhlCisgICAgICAgICAqIGN1c3RvbSB0YWcgaW52b2NhdGlvbi4gRm9yIGV4YW1wbGUsIGluIHRoaXMgaW52b2NhdGlvbjoKKyAgICAgICAgICoKKyAgICAgICAgICogICAgIDxteTp0ZXN0IGE9IjEiIGI9IjIiIGM9IjMiLz4sIHRoZSBhY3Rpb24KKyAgICAgICAgICoKKyAgICAgICAgICogInRlc3QiIGFuZCBpdHMgYXR0cmlidXRlcyAiYSIsICJiIiwgYW5kICJjIiBhbGwgYmVsb25nIHRvIHRoZQorICAgICAgICAgKiBuYW1lc3BhY2UgaWRlbnRpZmllZCBieSB0aGUgcHJlZml4ICJteSIuIFRoZSBhYm92ZSBpbnZvY2F0aW9uIHdvdWxkCisgICAgICAgICAqIGJlIGVxdWl2YWxlbnQgdG86CisgICAgICAgICAqCisgICAgICAgICAqICAgICA8bXk6dGVzdCBteTphPSIxIiBteTpiPSIyIiBteTpjPSIzIi8+CisgICAgICAgICAqCisgICAgICAgICAqIEFuIGFjdGlvbiBhdHRyaWJ1dGUgbWF5IGhhdmUgYSBwcmVmaXggZGlmZmVyZW50IGZyb20gdGhhdCBvZiB0aGUKKyAgICAgICAgICogYWN0aW9uIGludm9jYXRpb24gb25seSBpZiB0aGUgdW5kZXJseWluZyB0YWcgaGFuZGxlciBzdXBwb3J0cworICAgICAgICAgKiBkeW5hbWljIGF0dHJpYnV0ZXMsIGluIHdoaWNoIGNhc2UgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBkaWZmZXJlbnQKKyAgICAgICAgICogcHJlZml4IGlzIGNvbnNpZGVyZWQgYSBkeW5hbWljIGF0dHJpYnV0ZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1htbEF0dHJpYnV0ZXMoTm9kZS5DdXN0b21UYWcgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZVtdIGpzcEF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2h0YWJsZSB0YWdEYXRhQXR0cnMpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIFRhZ0luZm8gdGFnSW5mbyA9IG4uZ2V0VGFnSW5mbygpOworICAgICAgICAgICAgaWYgKHRhZ0luZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLm1pc3NpbmcudGFnSW5mbyIsIG4uZ2V0UU5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUYWdBdHRyaWJ1dGVJbmZvW10gdGxkQXR0cnMgPSB0YWdJbmZvLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBuLmdldEF0dHJpYnV0ZXMoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBhdHRycyAhPSBudWxsICYmIGk8YXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqPTA7IHRsZEF0dHJzICE9IG51bGwgJiYgajx0bGRBdHRycy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cnMuZ2V0TG9jYWxOYW1lKGkpLmVxdWFscyh0bGRBdHRyc1tqXS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGF0dHJzLmdldFVSSShpKSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGF0dHJzLmdldFVSSShpKS5sZW5ndGgoKSA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGF0dHJzLmdldFVSSShpKS5lcXVhbHMobi5nZXRVUkkoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGxkQXR0cnNbal0uY2FuQmVSZXF1ZXN0VGltZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgZXhwZWN0ZWRUeXBlID0gU3RyaW5nLmNsYXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlU3RyID0gdGxkQXR0cnNbal0uZ2V0VHlwZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRsZEF0dHJzW2pdLmlzRnJhZ21lbnQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkVHlwZSA9IEpzcEZyYWdtZW50LmNsYXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHR5cGVTdHIgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkVHlwZSA9IEpzcFV0aWwudG9DbGFzcyh0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNwQXR0cnNbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZ2V0SnNwQXR0cmlidXRlKGF0dHJzLmdldFFOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0VVJJKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0TG9jYWxOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0VmFsdWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLnVua25vd25fYXR0cmlidXRlX3R5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxkQXR0cnNbal0uZ2V0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsZEF0dHJzW2pdLmdldFR5cGVOYW1lKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSBkb2VzIG5vdCBhY2NlcHQgYW55IGV4cHJlc3Npb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBpdHMgdmFsdWUgZG9lcyBub3QgY29udGFpbiBhbnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRXhwcmVzc2lvbihuLCBhdHRycy5nZXRWYWx1ZShpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci5hdHRyaWJ1dGUuY3VzdG9tLm5vbl9ydF93aXRoX2V4cHIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxkQXR0cnNbal0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAganNwQXR0cnNbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgTm9kZS5Kc3BBdHRyaWJ1dGUoYXR0cnMuZ2V0UU5hbWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFVSSShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0TG9jYWxOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRWYWx1ZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0V4cHJlc3Npb24obiwgYXR0cnMuZ2V0VmFsdWUoaSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnRGF0YUF0dHJzLnB1dChhdHRycy5nZXRRTmFtZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZ0RhdGEuUkVRVUVTVF9USU1FX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnRGF0YUF0dHJzLnB1dChhdHRycy5nZXRRTmFtZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFZhbHVlKGkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ0luZm8uaGFzRHluYW1pY0F0dHJpYnV0ZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAganNwQXR0cnNbaV0gPSBnZXRKc3BBdHRyaWJ1dGUoYXR0cnMuZ2V0UU5hbWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRVUkkoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRMb2NhbE5hbWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRWYWx1ZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5iYWRfYXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRRTmFtZShpKSwgbi5nZXRMb2NhbE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBNYWtlIHN1cmUgdGhlIGdpdmVuIGN1c3RvbSBhY3Rpb24gZG9lcyBub3QgaGF2ZSBhbnkgaW52YWxpZCBuYW1lZAorICAgICAgICAgKiBhdHRyaWJ1dGVzCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tOYW1lZEF0dHJpYnV0ZXMoTm9kZS5DdXN0b21UYWcgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUuSnNwQXR0cmlidXRlW10ganNwQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgdGFnRGF0YUF0dHJzKQorICAgICAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBUYWdJbmZvIHRhZ0luZm8gPSBuLmdldFRhZ0luZm8oKTsKKyAgICAgICAgICAgIGlmICh0YWdJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5taXNzaW5nLnRhZ0luZm8iLCBuLmdldFFOYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVGFnQXR0cmlidXRlSW5mb1tdIHRsZEF0dHJzID0gdGFnSW5mby5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBOb2RlLk5vZGVzIG5hTm9kZXMgPSBuLmdldE5hbWVkQXR0cmlidXRlTm9kZXMoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5hTm9kZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBOb2RlLk5hbWVkQXR0cmlidXRlIG5hID0gKE5vZGUuTmFtZWRBdHRyaWJ1dGUpCisgICAgICAgICAgICAgICAgICAgIG5hTm9kZXMuZ2V0Tm9kZShpKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPHRsZEF0dHJzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFNlZSBhYm92ZSBjb21tZW50IGFib3V0IG5hbWVzcGFjZSBtYXRjaGVzLiBGb3IgbmFtZWQKKyAgICAgICAgICAgICAgICAgICAgICogYXR0cmlidXRlcywgd2UgdXNlIHRoZSBwcmVmaXggaW5zdGVhZCBvZiBVUkkgYXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAqIG1hdGNoIGNyaXRlcmlvbiwgYmVjYXVzZSBpbiB0aGUgY2FzZSBvZiBhIEpTUCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICogd2UnZCBoYXZlIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggbmFtZXNwYWNlcyBhcmUgaW4gc2NvcGUKKyAgICAgICAgICAgICAgICAgICAgICogd2hlbiBwYXJzaW5nIGEgbmFtZWQgYXR0cmlidXRlLCBpbiBvcmRlciB0byBkZXRlcm1pbmUKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIFVSSSB0aGF0IHRoZSBwcmVmaXggb2YgdGhlIG5hbWVkIGF0dHJpYnV0ZSdzIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICogbWF0Y2hlcyB0by4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyUHJlZml4ID0gbmEuZ2V0UHJlZml4KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYS5nZXRMb2NhbE5hbWUoKS5lcXVhbHModGxkQXR0cnNbal0uZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChhdHRyUHJlZml4ID09IG51bGwgfHwgYXR0clByZWZpeC5sZW5ndGgoKSA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGF0dHJQcmVmaXguZXF1YWxzKG4uZ2V0UHJlZml4KCkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAganNwQXR0cnNbc3RhcnQgKyBpXSA9IG5ldyBOb2RlLkpzcEF0dHJpYnV0ZShuYSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWRBdHRyaWJ1dGVWaXNpdG9yIG5hdiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmEuZ2V0Qm9keSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXYgPSBuZXcgTmFtZWRBdHRyaWJ1dGVWaXNpdG9yKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEuZ2V0Qm9keSgpLnZpc2l0KG5hdik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2ICE9IG51bGwgJiYgbmF2Lmhhc0R5bmFtaWNDb250ZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdEYXRhQXR0cnMucHV0KG5hLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZ0RhdGEuUkVRVUVTVF9USU1FX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnRGF0YUF0dHJzLnB1dChuYS5nZXROYW1lKCksIG5hLmdldFRleHQoKSk7ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFnSW5mby5oYXNEeW5hbWljQXR0cmlidXRlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBqc3BBdHRyc1tzdGFydCArIGldID0gbmV3IE5vZGUuSnNwQXR0cmlidXRlKG5hLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLmJhZF9hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLmdldE5hbWUoKSwgbi5nZXRMb2NhbE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUHJlcHJvY2VzcyBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIGV4cHJlc3Npb25zLiAgRXhwcmVzc2lvbgorICAgICAgICAgKiBkZWxpbWl0ZXJzIGFyZSBzdHJpcHBlZC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIElmIHZhbHVlIGlzIG51bGwsIGNoZWNrcyBpZiB0aGVyZSBhcmUgYW55CisgICAgICAgICAqIE5hbWVkQXR0cmlidXRlIHN1YmVsZW1lbnRzIGluIHRoZSB0cmVlIG5vZGUsIGFuZCBpZiBzbywKKyAgICAgICAgICogY29uc3RydWN0cyBhIEpzcEF0dHJpYnV0ZSBvdXQgb2YgYSBjaGlsZCBOYW1lZEF0dHJpYnV0ZSBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBOb2RlLkpzcEF0dHJpYnV0ZSBnZXRKc3BBdHRyaWJ1dGUoU3RyaW5nIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGV4cGVjdGVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGR5bmFtaWMpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIE5vZGUuSnNwQXR0cmlidXRlIHJlc3VsdCA9IG51bGw7CisKKyAgICAgICAgICAgIC8vIFhYWCBJcyBpdCBhbiBlcnJvciB0byBzZWUgIiU9Zm9vJSIgaW4gbm9uLVhtbCBwYWdlPworICAgICAgICAgICAgLy8gKFdlIHdvbid0IHNlZSAiPCU9Zm9vJT4gaW4geG1sIHBhZ2UgYmVjYXVzZSAnPCcgaXMgbm90IGEKKyAgICAgICAgICAgIC8vIHZhbGlkIGF0dHJpYnV0ZSB2YWx1ZSBpbiB4bWwpLgorCisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChuLmdldFJvb3QoKS5pc1htbFN5bnRheCgpICYmIHZhbHVlLnN0YXJ0c1dpdGgoIiU9IikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE5vZGUuSnNwQXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc3Vic3RyaW5nKDIsIHZhbHVlLmxlbmd0aCgpLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZighbi5nZXRSb290KCkuaXNYbWxTeW50YXgoKSAmJiB2YWx1ZS5zdGFydHNXaXRoKCI8JT0iKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgTm9kZS5Kc3BBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zdWJzdHJpbmcoMywgdmFsdWUubGVuZ3RoKCktMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGF0dHJpYnV0ZSBjYW4gY29udGFpbiBleHByZXNzaW9ucyBidXQgaXMgbm90IGEKKyAgICAgICAgICAgICAgICAgICAgLy8gc2NyaXB0bGV0IGV4cHJlc3Npb247IHRodXMsIHdlIHdhbnQgdG8gcnVuIGl0IHRocm91Z2ggCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleHByZXNzaW9uIGludGVycHJldGVyCisKKyAgICAgICAgICAgICAgICAgICAgLy8gdmFsaWRhdGUgZXhwcmVzc2lvbiBzeW50YXggaWYgc3RyaW5nIGNvbnRhaW5zCisgICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3Npb24ocykKKyAgICAgICAgICAgICAgICAgICAgRUxOb2RlLk5vZGVzIGVsID0gRUxQYXJzZXIucGFyc2UodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZWwuY29udGFpbnNFTCgpICYmICFwYWdlSW5mby5pc0VMSWdub3JlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9ucyhlbCwgbik7CisgICAgICAgICAgICAgICAgICAgICAgICBKc3BVdGlsLnZhbGlkYXRlRXhwcmVzc2lvbnMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5nZXRTdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZ1bmN0aW9uTWFwcGVyKGVsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE5vZGUuSnNwQXR0cmlidXRlKHFOYW1lLCB1cmksIGxvY2FsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgZmFsc2UsIGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKENvbnN0YW50cy5IQUNLX0NIQVIsICckJyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgTm9kZS5Kc3BBdHRyaWJ1dGUocU5hbWUsIHVyaSwgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBmYWxzZSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFZhbHVlIGlzIG51bGwuICBDaGVjayBmb3IgYW55IE5hbWVkQXR0cmlidXRlIHN1Ym5vZGVzCisgICAgICAgICAgICAgICAgLy8gdGhhdCBtaWdodCBjb250YWluIHRoZSB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUuCisgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgYXR0cmlidXRlIHdhc24ndCBmb3VuZCBzbyB3ZSByZXR1cm4gbnVsbC4KKworICAgICAgICAgICAgICAgIE5vZGUuTmFtZWRBdHRyaWJ1dGUgbmFtZWRBdHRyaWJ1dGVOb2RlID0KKyAgICAgICAgICAgICAgICAgICAgbi5nZXROYW1lZEF0dHJpYnV0ZU5vZGUoIHFOYW1lICk7CisgICAgICAgICAgICAgICAgaWYoIG5hbWVkQXR0cmlidXRlTm9kZSAhPSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgTm9kZS5Kc3BBdHRyaWJ1dGUobmFtZWRBdHRyaWJ1dGVOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIHZhbHVlIHJlcHJlc2VudHMgYSBydW50aW1lIG9yCisgICAgICAgICAqIEVMIGV4cHJlc3Npb24uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNFeHByZXNzaW9uKE5vZGUgbiwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoKG4uZ2V0Um9vdCgpLmlzWG1sU3ludGF4KCkgJiYgdmFsdWUuc3RhcnRzV2l0aCgiJT0iKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKCFuLmdldFJvb3QoKS5pc1htbFN5bnRheCgpICYmIHZhbHVlLnN0YXJ0c1dpdGgoIjwlPSIpKQorICAgICAgICAgICAgICAgICAgICB8fCAodmFsdWUuaW5kZXhPZigiJHsiKSAhPSAtMSAmJiAhcGFnZUluZm8uaXNFTElnbm9yZWQoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhyb3dzIGV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbgorICAgICAgICAgKiBuYW1lIGluIHRoZSBnaXZlbiBub2RlIGlzIGdpdmVuIGFzIGFuIFJUIG9yIEVMIGV4cHJlc3Npb24sIGJ1dCB0aGUKKyAgICAgICAgICogc3BlYyByZXF1aXJlcyBhIHN0YXRpYyB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCB0aHJvd0Vycm9ySWZFeHByZXNzaW9uKE5vZGUgbiwgU3RyaW5nIGF0dHJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aW9uTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobi5nZXRBdHRyaWJ1dGVzKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBuLmdldEF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShhdHRyTmFtZSkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBpc0V4cHJlc3Npb24obiwgbi5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmFsdWUoYXR0ck5hbWUpKSkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLmF0dHJpYnV0ZS5zdGFuZGFyZC5ub25fcnRfd2l0aF9leHByIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUsIGFjdGlvbk5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTmFtZWRBdHRyaWJ1dGVWaXNpdG9yIGV4dGVuZHMgTm9kZS5WaXNpdG9yIHsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNEeW5hbWljQ29udGVudDsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgZG9WaXNpdChOb2RlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmICghKG4gaW5zdGFuY2VvZiBOb2RlLkpzcFRleHQpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhKG4gaW5zdGFuY2VvZiBOb2RlLlRlbXBsYXRlVGV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzRHluYW1pY0NvbnRlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0R5bmFtaWNDb250ZW50KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYXNEeW5hbWljQ29udGVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGZpbmRVcmkoU3RyaW5nIHByZWZpeCwgTm9kZSBuKSB7CisKKyAgICAgICAgICAgIGZvciAoTm9kZSBwID0gbjsgcCAhPSBudWxsOyBwID0gcC5nZXRQYXJlbnQoKSkgeworICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBwLmdldFRhZ2xpYkF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0cnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYXR0cnMuZ2V0UU5hbWUoaSk7CisgICAgICAgICAgICAgICAgICAgIGludCBrID0gbmFtZS5pbmRleE9mKCc6Jyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCAmJiBrIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlZml4IG5vdCBzcGVjaWZpZWQgYW5kIGEgZGVmYXVsdCBucyBmb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJzLmdldFZhbHVlKGkpOworICAgICAgICAgICAgICAgICAgICB9ICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBrID49IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LmVxdWFscyhuYW1lLnN1YnN0cmluZyhrKzEpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJzLmdldFZhbHVlKGkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVmFsaWRhdGUgZnVuY3Rpb25zIGluIEVMIGV4cHJlc3Npb25zCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVGdW5jdGlvbnMoRUxOb2RlLk5vZGVzIGVsLCBOb2RlIG4pIAorICAgICAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBjbGFzcyBGVlZpc2l0b3IgZXh0ZW5kcyBFTE5vZGUuVmlzaXRvciB7CisKKyAgICAgICAgICAgICAgICBOb2RlIG47CisKKyAgICAgICAgICAgICAgICBGVlZpc2l0b3IoTm9kZSBuKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMubiA9IG47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoRUxOb2RlLkZ1bmN0aW9uIGZ1bmMpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZnVuYy5nZXRQcmVmaXgoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bmN0aW9uID0gZnVuYy5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgIGlmIChuLmdldFJvb3QoKS5pc1htbFN5bnRheCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cmkgPSBmaW5kVXJpKHByZWZpeCwgbik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJlZml4ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaSA9IHBhZ2VJbmZvLmdldFVSSShwcmVmaXgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5ub0Z1bmN0aW9uUHJlZml4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqc3AuZXJyb3IuYXR0cmlidXRlLmludmFsaWRQcmVmaXgiLCBwcmVmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFRhZ0xpYnJhcnlJbmZvIHRhZ2xpYiA9IHBhZ2VJbmZvLmdldFRhZ2xpYih1cmkpOworICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkluZm8gZnVuY0luZm8gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAodGFnbGliICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNJbmZvID0gdGFnbGliLmdldEZ1bmN0aW9uKGZ1bmN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZnVuY0luZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3Iubm9GdW5jdGlvbiIsIGZ1bmN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIFRMRCBmdW5jdGlvbiB1bmlxdWVuZXNzIGNoZWNrLiAgRG9uZSBieSBTY2hlbWEgPworICAgICAgICAgICAgICAgICAgICBmdW5jLnNldFVyaSh1cmkpOworICAgICAgICAgICAgICAgICAgICBmdW5jLnNldEZ1bmN0aW9uSW5mbyhmdW5jSW5mbyk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NTaWduYXR1cmUoZnVuYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbC52aXNpdChuZXcgRlZWaXNpdG9yKG4pKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzU2lnbmF0dXJlKEVMTm9kZS5GdW5jdGlvbiBmdW5jKQorICAgICAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZnVuYy5zZXRNZXRob2ROYW1lKGdldE1ldGhvZChmdW5jKSk7CisgICAgICAgICAgICBmdW5jLnNldFBhcmFtZXRlcnMoZ2V0UGFyYW1ldGVycyhmdW5jKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBtZXRob2QgbmFtZSBmcm9tIHRoZSBzaWduYXR1cmUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRNZXRob2QoRUxOb2RlLkZ1bmN0aW9uIGZ1bmMpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBGdW5jdGlvbkluZm8gZnVuY0luZm8gPSBmdW5jLmdldEZ1bmN0aW9uSW5mbygpOworICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9IGZ1bmNJbmZvLmdldEZ1bmN0aW9uU2lnbmF0dXJlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBzdGFydCA9IHNpZ25hdHVyZS5pbmRleE9mKCcgJyk7CisgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IudGxkLmZuLmludmFsaWQuc2lnbmF0dXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5nZXRQcmVmaXgoKSwgZnVuYy5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGVuZCA9IHNpZ25hdHVyZS5pbmRleE9mKCcoJyk7CisgICAgICAgICAgICBpZiAoZW5kIDwgMCkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnRsZC5mbi5pbnZhbGlkLnNpZ25hdHVyZS5wYXJlbmV4cGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5nZXRQcmVmaXgoKSwgZnVuYy5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNpZ25hdHVyZS5zdWJzdHJpbmcoc3RhcnQrMSwgZW5kKS50cmltKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBwYXJhbWV0ZXJzIHR5cGVzIGZyb20gdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZS4KKyAgICAgICAgICogQHJldHVybiBBbiBhcnJheSBvZiBwYXJhbWV0ZXIgY2xhc3MgbmFtZXMKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0UGFyYW1ldGVycyhFTE5vZGUuRnVuY3Rpb24gZnVuYykgCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBGdW5jdGlvbkluZm8gZnVuY0luZm8gPSBmdW5jLmdldEZ1bmN0aW9uSW5mbygpOworICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9IGZ1bmNJbmZvLmdldEZ1bmN0aW9uU2lnbmF0dXJlKCk7CisgICAgICAgICAgICBBcnJheUxpc3QgcGFyYW1zID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgLy8gU2lnbmF0dXJlIGlzIG9mIHRoZSBmb3JtCisgICAgICAgICAgICAvLyA8cmV0dXJuLXR5cGU+IFMgPG1ldGhvZC1uYW1lIFM/ICcoJworICAgICAgICAgICAgLy8gPCA8YXJnLXR5cGU+ICggJywnIDxhcmctdHlwZT4gKSogKT8gJyknCisgICAgICAgICAgICBpbnQgc3RhcnQgPSBzaWduYXR1cmUuaW5kZXhPZignKCcpICsgMTsKKyAgICAgICAgICAgIGJvb2xlYW4gbGFzdEFyZyA9IGZhbHNlOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgcCA9IHNpZ25hdHVyZS5pbmRleE9mKCcsJywgc3RhcnQpOworICAgICAgICAgICAgICAgIGlmIChwIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBwID0gc2lnbmF0dXJlLmluZGV4T2YoJyknLCBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IudGxkLmZuLmludmFsaWQuc2lnbmF0dXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLmdldFByZWZpeCgpLCBmdW5jLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGFzdEFyZyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBhcmcgPSBzaWduYXR1cmUuc3Vic3RyaW5nKHN0YXJ0LCBwKS50cmltKCk7CisgICAgICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHMoYXJnKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJhbXMuYWRkKGFyZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsYXN0QXJnKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGFydCA9IHArMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nW10pIHBhcmFtcy50b0FycmF5KG5ldyBTdHJpbmdbcGFyYW1zLnNpemUoKV0pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBGdW5jdGlvbk1hcHBlciBnZXRGdW5jdGlvbk1hcHBlcihFTE5vZGUuTm9kZXMgZWwpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGNsYXNzIFZhbGlkYXRlRnVuY3Rpb25NYXBwZXIgaW1wbGVtZW50cyBGdW5jdGlvbk1hcHBlciB7CisKKyAgICAgICAgICAgICAgICBwcml2YXRlIEhhc2hNYXAgZm5tYXAgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtYXBGdW5jdGlvbihTdHJpbmcgZm5RTmFtZSwgTWV0aG9kIG1ldGhvZCkgeworICAgICAgICAgICAgICAgICAgICBmbm1hcC5wdXQoZm5RTmFtZSwgbWV0aG9kKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgTWV0aG9kIHJlc29sdmVGdW5jdGlvbihTdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChNZXRob2QpIHRoaXMuZm5tYXAuZ2V0KHByZWZpeCArICI6IiArIGxvY2FsTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGFzcyBNYXBwZXJFTFZpc2l0b3IgZXh0ZW5kcyBFTE5vZGUuVmlzaXRvciB7CisgICAgICAgICAgICAgICAgVmFsaWRhdGVGdW5jdGlvbk1hcHBlciBmbWFwcGVyOworCisgICAgICAgICAgICAgICAgTWFwcGVyRUxWaXNpdG9yKFZhbGlkYXRlRnVuY3Rpb25NYXBwZXIgZm1hcHBlcikgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmZtYXBwZXIgPSBmbWFwcGVyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEVMTm9kZS5GdW5jdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgICAgICAgICBDbGFzcyBjID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gbG9hZGVyLmxvYWRDbGFzcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5nZXRGdW5jdGlvbkluZm8oKS5nZXRGdW5jdGlvbkNsYXNzKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLmZ1bmN0aW9uLmNsYXNzbm90Zm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZ2V0RnVuY3Rpb25JbmZvKCkuZ2V0RnVuY3Rpb25DbGFzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZ2V0UHJlZml4KCkgKyAnOicgKyBuLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtVHlwZXNbXSA9IG4uZ2V0UGFyYW1ldGVycygpOworICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IHBhcmFtVHlwZXMubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBDbGFzcyBwYXJhbXNbXSA9IG5ldyBDbGFzc1tzaXplXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1tpXSA9IEpzcFV0aWwudG9DbGFzcyhwYXJhbVR5cGVzW2ldLCBsb2FkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gYy5nZXREZWNsYXJlZE1ldGhvZChuLmdldE1ldGhvZE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci5zaWduYXR1cmUuY2xhc3Nub3Rmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1UeXBlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldFByZWZpeCgpICsgJzonICsgbi5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLm5vRnVuY3Rpb25NZXRob2QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZ2V0TWV0aG9kTmFtZSgpLCBuLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm1hcHBlci5tYXBGdW5jdGlvbihuLmdldFByZWZpeCgpICsgJzonICsgbi5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFZhbGlkYXRlRnVuY3Rpb25NYXBwZXIgZm1hcHBlciA9IG5ldyBWYWxpZGF0ZUZ1bmN0aW9uTWFwcGVyKCk7CisgICAgICAgICAgICBlbC52aXNpdChuZXcgTWFwcGVyRUxWaXNpdG9yKGZtYXBwZXIpKTsKKyAgICAgICAgICAgIHJldHVybiBmbWFwcGVyOworICAgICAgICB9CisgICAgfSAvLyBFbmQgb2YgVmFsaWRhdGVWaXNpdG9yCisKKyAgICAvKioKKyAgICAgKiBBIHZpc2l0b3IgZm9yIHZhbGlkYXRpbmcgVGFnRXh0cmFJbmZvIGNsYXNzZXMgb2YgYWxsIHRhZ3MKKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgVGFnRXh0cmFJbmZvVmlzaXRvciBleHRlbmRzIE5vZGUuVmlzaXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBFcnJvckRpc3BhdGNoZXIgZXJyOworCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnN0cnVjdG9yCisgICAgICAgICAqLworICAgICAgICBUYWdFeHRyYUluZm9WaXNpdG9yKENvbXBpbGVyIGNvbXBpbGVyKSB7CisgICAgICAgICAgICB0aGlzLmVyciA9IGNvbXBpbGVyLmdldEVycm9yRGlzcGF0Y2hlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5DdXN0b21UYWcgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBUYWdJbmZvIHRhZ0luZm8gPSBuLmdldFRhZ0luZm8oKTsKKyAgICAgICAgICAgIGlmICh0YWdJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5taXNzaW5nLnRhZ0luZm8iLCBuLmdldFFOYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWYWxpZGF0aW9uTWVzc2FnZVtdIGVycm9ycyA9IHRhZ0luZm8udmFsaWRhdGUobi5nZXRUYWdEYXRhKCkpOworICAgICAgICAgICAgaWYgKGVycm9ycyAhPSBudWxsICYmIGVycm9ycy5sZW5ndGggIT0gMCkgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBlcnJNc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZCgiPGgzPiIpOworICAgICAgICAgICAgICAgIGVyck1zZy5hcHBlbmQoTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLnRlaS5pbnZhbGlkLmF0dHJpYnV0ZXMiLCBuLmdldFFOYW1lKCkpKTsKKyAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKCI8L2gzPiIpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxlcnJvcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZCgiPHA+Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnNbaV0uZ2V0SWQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKGVycm9yc1tpXS5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyck1zZy5hcHBlbmQoIjogIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZChlcnJvcnNbaV0uZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZCgiPC9wPiIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCBlcnJNc2cudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZShDb21waWxlciBjb21waWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS5Ob2RlcyBwYWdlKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBWaXNpdCB0aGUgcGFnZS90YWcgZGlyZWN0aXZlcyBmaXJzdCwgYXMgdGhleSBhcmUgZ2xvYmFsIHRvIHRoZSBwYWdlCisgICAgICAgICAqIGFuZCBhcmUgcG9zaXRpb24gaW5kZXBlbmRlbnQuCisgICAgICAgICAqLworICAgICAgICBwYWdlLnZpc2l0KG5ldyBEaXJlY3RpdmVWaXNpdG9yKGNvbXBpbGVyKSk7CisKKyAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IG91dHB1dCBjb250ZW50IHR5cGUKKyAgICAgICAgUGFnZUluZm8gcGFnZUluZm8gPSBjb21waWxlci5nZXRQYWdlSW5mbygpOworICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBwYWdlSW5mby5nZXRDb250ZW50VHlwZSgpOworCisgICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBudWxsIHx8IGNvbnRlbnRUeXBlLmluZGV4T2YoImNoYXJzZXQ9IikgPCAwKSB7CisgICAgICAgICAgICBib29sZWFuIGlzWG1sID0gcGFnZS5nZXRSb290KCkuaXNYbWxTeW50YXgoKTsKKyAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0VHlwZTsKKyAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFR5cGUgPSBpc1htbD8gInRleHQveG1sIjogInRleHQvaHRtbCI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlZmF1bHRUeXBlID0gY29udGVudFR5cGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBjaGFyc2V0ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChpc1htbCkgeworICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAiVVRGLTgiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBhZ2UuZ2V0Um9vdCgpLmlzRGVmYXVsdFBhZ2VFbmNvZGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBwYWdlLmdldFJvb3QoKS5nZXRQYWdlRW5jb2RpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaGFyc2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYWdlSW5mby5zZXRDb250ZW50VHlwZShkZWZhdWx0VHlwZSArICI7Y2hhcnNldD0iICsgY2hhcnNldCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhZ2VJbmZvLnNldENvbnRlbnRUeXBlKGRlZmF1bHRUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFZhbGlkYXRlIGFsbCBvdGhlciBub2Rlcy4KKyAgICAgICAgICogVGhpcyB2YWxpZGF0aW9uIHN0ZXAgaW5jbHVkZXMgY2hlY2tpbmcgYSBjdXN0b20gdGFnJ3MgbWFuZGF0b3J5IGFuZAorICAgICAgICAgKiBvcHRpb25hbCBhdHRyaWJ1dGVzIGFnYWluc3QgaW5mb3JtYXRpb24gaW4gdGhlIFRMRCAoZmlyc3QgdmFsaWRhdGlvbgorICAgICAgICAgKiBzdGVwIGZvciBjdXN0b20gdGFncyBhY2NvcmRpbmcgdG8gSlNQLjEwLjUpLgorICAgICAgICAgKi8KKyAgICAgICAgcGFnZS52aXNpdChuZXcgVmFsaWRhdGVWaXNpdG9yKGNvbXBpbGVyKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSW52b2tlIFRhZ0xpYnJhcnlWYWxpZGF0b3IgY2xhc3NlcyBvZiBhbGwgaW1wb3J0ZWQgdGFncworICAgICAgICAgKiAoc2Vjb25kIHZhbGlkYXRpb24gc3RlcCBmb3IgY3VzdG9tIHRhZ3MgYWNjb3JkaW5nIHRvIEpTUC4xMC41KS4KKyAgICAgICAgICovCisgICAgICAgIHZhbGlkYXRlWG1sVmlldyhuZXcgUGFnZURhdGFJbXBsKHBhZ2UsIGNvbXBpbGVyKSwgY29tcGlsZXIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEludm9rZSBUYWdFeHRyYUluZm8gbWV0aG9kIGlzVmFsaWQoKSBmb3IgYWxsIGltcG9ydGVkIHRhZ3MgCisgICAgICAgICAqICh0aGlyZCB2YWxpZGF0aW9uIHN0ZXAgZm9yIGN1c3RvbSB0YWdzIGFjY29yZGluZyB0byBKU1AuMTAuNSkuCisgICAgICAgICAqLworICAgICAgICBwYWdlLnZpc2l0KG5ldyBUYWdFeHRyYUluZm9WaXNpdG9yKGNvbXBpbGVyKSk7CisKKyAgICB9CisKKworICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLy8gUHJpdmF0ZSAodXRpbGl0eSkgbWV0aG9kcworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgWE1MIHZpZXcgYWdhaW5zdCB0aGUgVGFnTGlicmFyeVZhbGlkYXRvciBjbGFzc2VzIG9mIGFsbAorICAgICAqIGltcG9ydGVkIHRhZyBsaWJyYXJpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVhtbFZpZXcoUGFnZURhdGEgeG1sVmlldywgQ29tcGlsZXIgY29tcGlsZXIpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGVyck1zZyA9IG51bGw7CisgICAgICAgIEVycm9yRGlzcGF0Y2hlciBlcnJEaXNwID0gY29tcGlsZXIuZ2V0RXJyb3JEaXNwYXRjaGVyKCk7CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyPWNvbXBpbGVyLmdldFBhZ2VJbmZvKCkuZ2V0VGFnbGlicygpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOyApIHsKKworICAgICAgICAgICAgT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBUYWdMaWJyYXJ5SW5mb0ltcGwpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgVGFnTGlicmFyeUluZm9JbXBsIHRsaSA9IChUYWdMaWJyYXJ5SW5mb0ltcGwpIG87CisKKyAgICAgICAgICAgIFZhbGlkYXRpb25NZXNzYWdlW10gZXJyb3JzID0gdGxpLnZhbGlkYXRlKHhtbFZpZXcpOworICAgICAgICAgICAgaWYgKChlcnJvcnMgIT0gbnVsbCkgJiYgKGVycm9ycy5sZW5ndGggIT0gMCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJyTXNnID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyTXNnID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKCI8aDM+Iik7CisgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZChMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnRsdi5pbnZhbGlkLnBhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgdGxpLmdldFNob3J0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXIuZ2V0UGFnZUluZm8oKS5nZXRKc3BGaWxlKCkpKTsKKyAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKCI8L2gzPiIpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxlcnJvcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yc1tpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKCI8cD4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyck1zZy5hcHBlbmQoZXJyb3JzW2ldLmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZCgiOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyck1zZy5hcHBlbmQoZXJyb3JzW2ldLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKCI8L3A+Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyTXNnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGVyckRpc3AuanNwRXJyb3IoZXJyTXNnLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL3RhZ3BsdWdpbi9UYWdQbHVnaW4uamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvdGFncGx1Z2luL1RhZ1BsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5Y2JjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL3RhZ3BsdWdpbi9UYWdQbHVnaW4uamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci50YWdwbHVnaW47CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIHBsdWdpbiBhdXRob3IsIHRvIHN1cHBseQorICogYW4gYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0YWcgaGFuZGxlcnMuICBJdCBjYW4gYmUgdXNlZCB0bworICogc3BlY2lmeSB0aGUgSmF2YSBjb2RlcyB0byBiZSBnZW5lcmF0ZWQgd2hlbiBhIHRhZyBpcyBpbnZva2VkLgorICoKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIG11c3QgYmUgcmVnaXN0ZXJlZCBpbiBhIGZpbGUKKyAqIG5hbWVkICJ0YWdQbHVnaW5zLnhtbCIgdW5kZXIgV0VCLUlORi4KKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFRhZ1BsdWdpbiB7CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBjb2RlcyBmb3IgYSBjdXN0b20gdGFnLgorICAgICAqIEBwYXJhbSBjdHh0IGEgVGFnUGx1Z2luQ29udGV4dCBmb3IgYWNjZXNzaW5nIEphc3BlciBmdW5jdGlvbnMKKyAgICAgKi8KKyAgICB2b2lkIGRvVGFnKFRhZ1BsdWdpbkNvbnRleHQgY3R4dCk7Cit9CisKZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvdGFncGx1Z2luL1RhZ1BsdWdpbkNvbnRleHQuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvdGFncGx1Z2luL1RhZ1BsdWdpbkNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDFjNTU4Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci90YWdwbHVnaW4vVGFnUGx1Z2luQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci50YWdwbHVnaW47CisKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgdGhlIHBsdWdpbiBhdXRob3IgdG8gbWFrZSBpbnF1ZXJpZXMgYWJvdXQgdGhlCisgKiBwcm9wZXJ0aWVzIG9mIHRoZSBjdXJyZW50IHRhZywgYW5kIHRvIHVzZSBKYXNwZXIgcmVzb3VyY2VzIHRvIGdlbmVyYXRlCisgKiBkaXJlY3QgSmF2YSBjb2RlcyBpbiBwbGFjZSBvZiB0YWcgaGFuZGxlciBpbnZvY2F0aW9ucy4KKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFRhZ1BsdWdpbkNvbnRleHQgeworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYm9keSBvZiB0aGUgdGFnIGlzIHNjcmlwdGxlc3MuCisgICAgICovCisgICAgYm9vbGVhbiBpc1NjcmlwdGxlc3MoKTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgTmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIGluIHRoZSB0YWcKKyAgICAgKi8KKyAgICBib29sZWFuIGlzQXR0cmlidXRlU3BlY2lmaWVkKFN0cmluZyBhdHRyaWJ1dGUpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBBbiB1bmlxdWUgdGVtcG9yYXJ5IHZhcmlhYmxlIG5hbWUgdGhhdCB0aGUgcGx1Z2luIGNhbiB1c2UuCisgICAgICovCisgICAgU3RyaW5nIGdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgYW4gaW1wb3J0IHN0YXRlbWVudAorICAgICAqIEBwYXJhbSBzIE5hbWUgb2YgdGhlIGltcG9ydCBjbGFzcywgJyonIGFsbG93ZWQuCisgICAgICovCisgICAgdm9pZCBnZW5lcmF0ZUltcG9ydChTdHJpbmcgcyk7CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBhIGRlY2xhcmF0aW9uIGluIHRoZSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzLiAgVGhpcyBjYW4gYmUKKyAgICAgKiB1c2VkIHRvIGRlY2xhcmUgYW4gaW5udGVyIGNsYXNzLCBhIG1ldGhvZCwgb3IgYSBjbGFzcyB2YXJpYWJsZS4KKyAgICAgKiBAcGFyYW0gaWQgQW4gdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBkZWNsYXJhdGlvbi4gIEl0IGlzIG5vdAorICAgICAqICAgICAgICAgICBwYXJ0IG9mIHRoZSBkZWNsYXJhdGlvbiwgYW5kIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlCisgICAgICogICAgICAgICAgIGRlY2xhcmF0aW9uIHdpbGwgb25seSBhcHBlYXIgb25jZS4gIElmIHRoaXMgbWV0aG9kIGlzCisgICAgICogICAgICAgICAgIGludm9rZWQgd2l0aCB0aGUgc2FtZSBpZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgdHJhbnNsYXRpb24KKyAgICAgKiAgICAgICAgICAgdW5pdCwgb25seSB0aGUgZmlyc3QgZGVjbGFyYXRpb24gd2lsbCBiZSB0YWtlbi4KKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCBvZiB0aGUgZGVjbGFyYXRpb24uCisgICAgICoqLworICAgIHZvaWQgZ2VuZXJhdGVEZWNsYXJhdGlvbihTdHJpbmcgaWQsIFN0cmluZyB0ZXh0KTsKKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIEphdmEgc291cmNlIGNvZGVzCisgICAgICovCisgICAgdm9pZCBnZW5lcmF0ZUphdmFTb3VyY2UoU3RyaW5nIHMpOworCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIGFuZCBpdHMgdmFsdWUgaXMgYQorICAgICAqICAgICAgICAgdHJhbnNsYXRpb24tdGltZSBjb25zdGFudC4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzQ29uc3RhbnRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIHRoYXQgaXMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgYXR0cmlidXRlLiAgVW5kZWZpbmVkCisgICAgICogICAgICAgICBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBhICh0cmFuc2xhdGlvbi10aW1lKSBjb25zdGFudC4KKyAgICAgKiAgICAgICAgIG51bGwgaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLgorICAgICAqLworICAgIFN0cmluZyBnZXRDb25zdGFudEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlKTsKKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGNvZGVzdG8gZXZhbHVhdGUgdmFsdWUgb2YgYSBhdHRyaWJ1dGUgaW4gdGhlIGN1c3RvbSB0YWcKKyAgICAgKiBUaGUgY29kZXMgaXMgYSBKYXZhIGV4cHJlc3Npb24uCisgICAgICogTk9URTogQ3VycmVudGx5IGNhbm5vdCBoYW5kbGUgYXR0cmlidXRlcyB0aGF0IGFyZSBmcmFnbWVudHMuCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZSBUaGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQorICAgICAqLworICAgIHZvaWQgZ2VuZXJhdGVBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSk7CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBjb2RlcyBmb3IgdGhlIGJvZHkgb2YgdGhlIGN1c3RvbSB0YWcKKyAgICAgKi8KKyAgICB2b2lkIGdlbmVyYXRlQm9keSgpOworCisgICAgLyoqCisgICAgICogQWJhbmRvbiBvcHRpbWl6YXRpb24gZm9yIHRoaXMgdGFnIGhhbmRsZXIsIGFuZCBpbnN0cnVjdAorICAgICAqIEphc3BlciB0byBnZW5lcmF0ZSB0aGUgdGFnIGhhbmRsZXIgY2FsbHMsIGFzIHVzdWFsLgorICAgICAqIFNob3VsZCBiZSBpbnZva2VkIGlmIGVycm9ycyBhcmUgZGV0ZWN0ZWQsIG9yIHdoZW4gdGhlIHRhZyBib2R5CisgICAgICogaXMgZGVlbWVkIHRvbyBjb21waWxpY2F0ZWQgZm9yIG9wdGltaXphdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIGRvbnRVc2VUYWdQbHVnaW4oKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgUGx1Z2luQ29udGV4dCBmb3IgdGhlIHBhcmVudCBvZiB0aGlzIGN1c3RvbSB0YWcuICBOT1RFOgorICAgICAqIFRoZSBvcGVyYXRpb25zIGF2YWlsYWJsZSBmb3IgUGx1Z2luQ29udGV4dCBzbyBvYnRhaW5lZCBpcyBsaW1pdGVkCisgICAgICogdG8gZ2V0UGx1Z2luQXR0cmlidXRlIGFuZCBzZXRQbHVnaW5BdHRyaWJ1dGUsIGFuZCBxdWVyaWVzIChlLmcuCisgICAgICogaXNTY3JpcHRsZXNzKCkuICBUaGVyZSBzaG91bGQgYmUgbm8gY2FsbHMgdG8gZ2VuZXJhdGUqKCkuCisgICAgICogQHJldHVybiBUaGUgcGx1Z2luQ29udGV4dCBmb3IgdGhlIHBhcmVudCBub2RlLgorICAgICAqICAgICAgICAgbnVsbCBpZiB0aGUgcGFyZW50IGlzIG5vdCBhIGN1c3RvbSB0YWcsIG9yIGlmIHRoZSBwbHVnaW5Db254dAorICAgICAqICAgICAgICAgaWYgbm90IGF2YWlsYWJsZSAoYmVjYXVzZSB1c2VUYWdQbHVnaW4gaXMgZmFsc2UsIGUuZykuCisgICAgICovCisgICAgVGFnUGx1Z2luQ29udGV4dCBnZXRQYXJlbnRDb250ZXh0KCk7CisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGUgdGhlIGF0dHJpYnV0ZSB3aXRoIGEgdmFsdWUgaW4gdGhlIGN1cnJlbnQgdGFncGx1Z2luIGNvbnRleHQuCisgICAgICogVGhlIHBsdWdpbiBhdHRyaWJ1dGVzIGNhbiBiZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uIGFtb25nIHRhZ3MgdGhhdAorICAgICAqIG11c3Qgd29yayB0b2dldGhlciBhcyBhIGdyb3VwLiAgU2VlIDxjOndoZW4+IGZvciBhbiBleGFtcGxlLgorICAgICAqLworICAgIHZvaWQgc2V0UGx1Z2luQXR0cmlidXRlKFN0cmluZyBhdHRyLCBPYmplY3QgdmFsdWUpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgaW4gdGhlIGN1cnJlbnQgdGFncGx1Z2luIGNvbnRleHQuCisgICAgICovCisgICAgT2JqZWN0IGdldFBsdWdpbkF0dHJpYnV0ZShTdHJpbmcgYXR0cik7Cit9CisKZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcmVzb3VyY2VzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjOGUwMgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcmVzb3VyY2VzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDEyIEBACisjICRJZCQKKyMKKyMgRGVmYXVsdCBsb2NhbGl6ZWQgc3RyaW5nIGluZm9ybWF0aW9uCisjIExvY2FsaXplZCB0aGlzIHRoZSBEZWZhdWx0IExvY2FsZSBhcyBpcyBlbl9VUworCitqc3AuZXJyb3IuY29tcGlsZXI9Tm8gSmF2YSBjb21waWxlciBhdmFpbGFibGUKK2pzcC5lcnJvci5iYWQuc2VydmxldC5lbmdpbmU9SW5jb3JyZWN0IHNlcnZsZXQgZW5naW5lIHZlcnNpb24hCitqc3AuZXJyb3Iubm8uc2NyYXRjaC5kaXI9VGhlIEpTUCBlbmdpbmUgaXMgbm90IGNvbmZpZ3VyZWQgd2l0aCBhIHNjcmF0Y2ggZGlyLlwKK1xuIFBsZWFzZSBhZGQgXCJqc3AuaW5pdHBhcmFtcz1zY3JhdGNoZGlyPTxkaXItbmFtZT5cIiBcCitcbiBpbiB0aGUgc2VydmxldHMucHJvcGVydGllcyBmaWxlIGZvciB0aGlzIGNvbnRleHQuCitqc3AuZXJyb3IuYmFkLnNjcmF0Y2guZGlyPVRoZSBzY3JhdGNoRGlyIHlvdSBzcGVjaWZpZWQ6IHswfSBpcyB1bnVzYWJsZS4KK2pzcC5tZXNzYWdlLnNjcmF0Y2guZGlyLmlzPVNjcmF0Y2ggZGlyIGZvciB0aGUgSlNQIGVuZ2luZSBpczogezB9Citqc3AubWVzc2FnZS5wYXJlbnRfY2xhc3NfbG9hZGVyX2lzPVBhcmVudCBjbGFzcyBsb2FkZXIgaXM6IHswfQoranNwLm1lc3NhZ2UuZG9udC5tb2RpZnkuc2VydmxldHM9SU1QT1JUQU5UOiBEbyBub3QgbW9kaWZ5IHRoZSBnZW5lcmF0ZWQgc2VydmxldHMKK2pzcC5lcnJvci5ub3QuaW1wbC5jb21tZW50cz1JbnRlcm5hbCBlcnJvcjogQ29tbWVudHMgbm90IGltcGxlbWVudGVkCitqc3AuZXJyb3Iubm90LmltcGwuZGlyZWN0aXZlcz1JbnRlcm5hbCBlcnJvcjogRGlyZWN0aXZlcyBub3QgaW1wbGVtZW50ZWQKK2pzcC5lcnJvci5ub3QuaW1wbC5kZWNsYXJhdGlvbnM9SW50ZXJuYWwgZXJyb3I6IERlY2xhcmF0aW9ucyBub3QgaW1wbGVtZW50ZWQKK2pzcC5lcnJvci5ub3QuaW1wbC5leHByZXNzaW9ucz1JbnRlcm5hbCBlcnJvcjogRXhwcmVzc2lvbnMgbm90IGltcGxlbWVudGVkCitqc3AuZXJyb3Iubm90LmltcGwuc2NyaXB0bGV0cz1JbnRlcm5hbCBlcnJvcjogU2NyaXB0bGV0cyBub3QgaW1wbGVtZW50ZWQKK2pzcC5lcnJvci5ub3QuaW1wbC51c2ViZWFuPUludGVybmFsIGVycm9yOiB1c2VCZWFuIG5vdCBpbXBsZW1lbnRlZAoranNwLmVycm9yLm5vdC5pbXBsLmdldHA9SW50ZXJuYWwgZXJyb3I6IGdldFByb3BlcnR5IG5vdCBpbXBsZW1lbnRlZAoranNwLmVycm9yLm5vdC5pbXBsLnNldHA9SW50ZXJuYWwgZXJyb3I6IHNldFByb3BlcnR5IG5vdCBpbXBsZW1lbnRlZAoranNwLmVycm9yLm5vdC5pbXBsLnBsdWdpbj1JbnRlcm5hbCBlcnJvcjogcGx1Z2luIG5vdCBpbXBsZW1lbnRlZAoranNwLmVycm9yLm5vdC5pbXBsLmZvcndhcmQ9SW50ZXJuYWwgZXJyb3I6IGZvcndhcmQgbm90IGltcGxlbWVudGVkCitqc3AuZXJyb3Iubm90LmltcGwuaW5jbHVkZT1JbnRlcm5hbCBlcnJvcjogaW5jbHVkZSBub3QgaW1wbGVtZW50ZWQKK2pzcC5lcnJvci51bmF2YWlsYWJsZT1KU1AgaGFzIGJlZW4gbWFya2VkIHVuYXZhaWxhYmxlCitqc3AuZXJyb3IudXNlYmVhbi5taXNzaW5nLmF0dHJpYnV0ZT11c2VCZWFuOiBpZCBhdHRyaWJ1dGUgbWlzc2luZyBvciBtaXNzcGVsbGVkCitqc3AuZXJyb3IudXNlYmVhbi5taXNzaW5nLnR5cGU9dXNlQmVhbiAoezB9KTogRWl0aGVyIGNsYXNzIG9yIHR5cGUgYXR0cmlidXRlIG11c3QgYmUgXAorc3BlY2lmaWVkOiAKK2pzcC5lcnJvci51c2ViZWFuLmR1cGxpY2F0ZT11c2VCZWFuOiBEdXBsaWNhdGUgYmVhbiBuYW1lOiB7MH0KK2pzcC5lcnJvci51c2ViZWFuLnByb2hpYml0ZWQuYXMuc2Vzc2lvbj1DYW4ndCB1c2UgYXMgc2Vzc2lvbiBiZWFuIHswfSBzaW5jZSBpdCBpcyBwcm9oaWJpdGVkIFwKK2J5IGpzcCBkaXJlY3RpdmUgZGVmaW5lZCBlYXJsaWVyOiAKK2pzcC5lcnJvci51c2ViZWFuLm5vdC5ib3RoPXVzZUJlYW46IENhbid0IHNwZWNpZnkgYm90aCBjbGFzcyBhbmQgYmVhbk5hbWUgYXR0cmlidXRlOiAKK2pzcC5lcnJvci51c2ViZWFuLmJhZC50eXBlLmNhc3Q9dXNlQmVhbiAoezB9KTogVHlwZSAoezF9KSBpcyBub3QgYXNzaWduYWJsZSBmcm9tIGNsYXNzICh7Mn0pIAoranNwLmVycm9yLmludmFsaWQuc2NvcGU9SWxsZWdhbCB2YWx1ZSBvZiBcJ3Njb3BlXCcgYXR0cmlidXRlOiB7MH0gKG11c3QgYmUgb25lIG9mIFwicGFnZVwiLCBcInJlcXVlc3RcIiwgXCJzZXNzaW9uXCIsIG9yIFwiYXBwbGljYXRpb25cIikKK2pzcC5lcnJvci5jbGFzc25hbWU9Q2FuJ3QgZGV0ZXJtaW5lIGNsYXNzbmFtZSBmcm9tIC5jbGFzcyBmaWxlCitqc3Aud2FybmluZy5iYWQudHlwZT1XYXJuaW5nOiBiYWQgdHlwZSBpbiAuY2xhc3MgZmlsZQoranNwLmVycm9yLmRhdGEuZmlsZS53cml0ZT1FcnJvciB3aGlsZSB3cml0aW5nIGRhdGEgZmlsZQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5idWZmZXI9UGFnZSBkaXJlY3RpdmU6IGludmFsaWQgYnVmZmVyIHNpemUKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmNvbnRlbnR0eXBlPVBhZ2UgZGlyZWN0aXZlOiBpbGxlZ2FsIHRvIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgJ2NvbnRlbnRUeXBlJyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgKG9sZDogezB9LCBuZXc6IHsxfSkKK2pzcC5lcnJvci5wYWdlLmludmFsaWQuY29udGVudHR5cGU9UGFnZSBkaXJlY3RpdmU6IGludmFsaWQgdmFsdWUgZm9yIGNvbnRlbnRUeXBlCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5zZXNzaW9uPVBhZ2UgZGlyZWN0aXZlOiBpbGxlZ2FsIHRvIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgJ3Nlc3Npb24nIHdpdGggZGlmZmVyZW50IHZhbHVlcyAob2xkOiB7MH0sIG5ldzogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5zZXNzaW9uPVBhZ2UgZGlyZWN0aXZlOiBpbnZhbGlkIHZhbHVlIGZvciBzZXNzaW9uCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5idWZmZXI9UGFnZSBkaXJlY3RpdmU6IGlsbGVnYWwgdG8gaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiAnYnVmZmVyJyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgKG9sZDogezB9LCBuZXc6IHsxfSkKK2pzcC5lcnJvci5wYWdlLmludmFsaWQuYnVmZmVyPVBhZ2UgZGlyZWN0aXZlOiBpbnZhbGlkIHZhbHVlIGZvciBidWZmZXIKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmF1dG9mbHVzaD1QYWdlIGRpcmVjdGl2ZTogaWxsZWdhbCB0byBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mICdhdXRvRmx1c2gnIHdpdGggZGlmZmVyZW50IHZhbHVlcyAob2xkOiB7MH0sIG5ldzogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5hdXRvZmx1c2g9UGFnZSBkaXJlY3RpdmU6IGludmFsaWQgdmFsdWUgZm9yIGF1dG9GbHVzaAoranNwLmVycm9yLnBhZ2UuY29uZmxpY3QuaXN0aHJlYWRzYWZlPVBhZ2UgZGlyZWN0aXZlOiBpbGxlZ2FsIHRvIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgJ2lzVGhyZWFkU2FmZScgd2l0aCBkaWZmZXJlbnQgdmFsdWVzIChvbGQ6IHswfSwgbmV3OiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmlzdGhyZWFkc2FmZT1QYWdlIGRpcmVjdGl2ZTogaW52YWxpZCB2YWx1ZSBmb3IgaXNUaHJlYWRTYWZlCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5pbmZvPVBhZ2UgZGlyZWN0aXZlOiBpbGxlZ2FsIHRvIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgJ2luZm8nIHdpdGggZGlmZmVyZW50IHZhbHVlcyAob2xkOiB7MH0sIG5ldzogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5pbmZvPVBhZ2UgZGlyZWN0aXZlOiBpbnZhbGlkIHZhbHVlIGZvciBpbmZvCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5pc2Vycm9ycGFnZT1QYWdlIGRpcmVjdGl2ZTogaWxsZWdhbCB0byBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mICdpc0Vycm9yUGFnZScgd2l0aCBkaWZmZXJlbnQgdmFsdWVzIChvbGQ6IHswfSwgbmV3OiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmlzZXJyb3JwYWdlPVBhZ2UgZGlyZWN0aXZlOiBpbnZhbGlkIHZhbHVlIGZvciBpc0Vycm9yUGFnZQoranNwLmVycm9yLnBhZ2UuY29uZmxpY3QuZXJyb3JwYWdlPVBhZ2UgZGlyZWN0aXZlOiBpbGxlZ2FsIHRvIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgJ2Vycm9yUGFnZScgd2l0aCBkaWZmZXJlbnQgdmFsdWVzIChvbGQ6IHswfSwgbmV3OiB7MX0pCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5sYW5ndWFnZT1QYWdlIGRpcmVjdGl2ZTogaWxsZWdhbCB0byBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mICdsYW5ndWFnZScgd2l0aCBkaWZmZXJlbnQgdmFsdWVzIChvbGQ6IHswfSwgbmV3OiB7MX0pCitqc3AuZXJyb3IudGFnLmNvbmZsaWN0Lmxhbmd1YWdlPVRhZyBkaXJlY3RpdmU6IGlsbGVnYWwgdG8gaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiAnbGFuZ3VhZ2UnIHdpdGggZGlmZmVyZW50IHZhbHVlcyAob2xkOiB7MH0sIG5ldzogezF9KQoranNwLmVycm9yLnBhZ2UubGFuZ3VhZ2Uubm9uamF2YT1QYWdlIGRpcmVjdGl2ZTogaW52YWxpZCBsYW5ndWFnZSBhdHRyaWJ1dGUKK2pzcC5lcnJvci50YWcubGFuZ3VhZ2Uubm9uamF2YT1UYWcgZGlyZWN0aXZlOiBpbnZhbGlkIGxhbmd1YWdlIGF0dHJpYnV0ZQoranNwLmVycm9yLnBhZ2UuZGVmYWZ0ZXJ1c2UubGFuZ3VhZ2U9UGFnZSBkaXJlY3RpdmU6IGNhbid0IGRlZmluZSBsYW5ndWFnZSBhZnRlciBhIHNjcmlwdGxldCAKK2pzcC5lcnJvci5wYWdlLm5vbWFwcGluZy5sYW5ndWFnZT1QYWdlIGRpcmVjdGl2ZTogTm8gbWFwcGluZyBmb3IgbGFuZ3VhZ2U6IAoranNwLmVycm9yLnBhZ2UuY29uZmxpY3QuZXh0ZW5kcz1QYWdlIGRpcmVjdGl2ZTogaWxsZWdhbCB0byBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mICdleHRlbmRzJyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgKG9sZDogezB9LCBuZXc6IHsxfSkKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmlzZWxpZ25vcmVkPVBhZ2UgZGlyZWN0aXZlOiBpbGxlZ2FsIHRvIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgJ2lzRUxJZ25vcmVkJyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgKG9sZDogezB9LCBuZXc6IHsxfSkKK2pzcC5lcnJvci50YWcuY29uZmxpY3QuaXNlbGlnbm9yZWQ9VGFnIGRpcmVjdGl2ZTogaWxsZWdhbCB0byBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mICdpc0VMSWdub3JlZCcgd2l0aCBkaWZmZXJlbnQgdmFsdWVzIChvbGQ6IHswfSwgbmV3OiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmlzZWxpZ25vcmVkPVBhZ2UgZGlyZWN0aXZlOiBpbnZhbGlkIHZhbHVlIGZvciBpc0VMSWdub3JlZAoranNwLmVycm9yLnRhZy5pbnZhbGlkLmlzZWxpZ25vcmVkPVRhZyBkaXJlY3RpdmU6IGludmFsaWQgdmFsdWUgZm9yIGlzRUxJZ25vcmVkCitqc3AuZXJyb3IucGFnZS5tdWx0aS5wYWdlZW5jb2Rpbmc9UGFnZSBkaXJlY3RpdmUgbXVzdCBub3QgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiBwYWdlZW5jb2RpbmcKK2pzcC5lcnJvci50YWcuY29uZmxpY3QuYXR0cj1UYWcgZGlyZWN0aXZlOiBpbGxlZ2FsIHRvIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgdGhlIGF0dHJpYnV0ZSBcInswfVwiIHdpdGggZGlmZmVyZW50IHZhbHVlcyAob2xkOiB7MX0sIG5ldzogezJ9KQoranNwLmVycm9yLnRhZy5tdWx0aS5wYWdlZW5jb2Rpbmc9VGFnIGRpcmVjdGl2ZSBtdXN0IG5vdCBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIHBhZ2VlbmNvZGluZworanNwLmVycm9yLnBhZ2UuYmFkX2JfYW5kX2FfY29tYm89UGFnZSBkaXJlY3RpdmU6IElsbGVnYWwgY29tYmluYXRpb24gb2YgYnVmZmVyPVwibm9uZVwiICYmIGF1dG9GbHVzaD1cImZhbHNlXCIKK2pzcC5lcnJvci5ub3QuaW1wbC50YWdsaWI9SW50ZXJuYWwgZXJyb3I6IFRhZyBleHRlbnNpb25zIG5vdCBpbXBsZW1lbnRlZAoranNwLmVycm9yLmluY2x1ZGUubWlzc2luZy5maWxlPU1pc3NpbmcgZmlsZSBhcmd1bWVudCB0byBpbmNsdWRlCitqc3AuZXJyb3IuaW5jbHVkZS5iYWQuZmlsZT1CYWQgZmlsZSBhcmd1bWVudCB0byBpbmNsdWRlIAoranNwLmVycm9yLmluY2x1ZGUuZXhjZXB0aW9uPVVuYWJsZSB0byBpbmNsdWRlIHswfQoranNwLmVycm9yLnN0cmVhbS5jbG9zZWQ9U3RyZWFtIGNsb3NlZAoranNwLmVycm9yLmludmFsaWQuZm9yd2FyZD1JbnZhbGlkIGZvcndhcmQgdGFnCitqc3AuZXJyb3IudW5rbm93bkV4Y2VwdGlvbj1VbmhhbmRsZWQgZXJyb3IhIFlvdSBtaWdodCB3YW50IHRvIGNvbnNpZGVyIGhhdmluZyBhbiBlcnJvciBwYWdlIFwKK3RvIHJlcG9ydCBzdWNoIGVycm9ycyBtb3JlIGdyYWNlZnVsbHkKK2pzcC5lcnJvci5pbnZhbGlkLmRpcmVjdGl2ZT1JbnZhbGlkIGRpcmVjdGl2ZQoranNwLmVycm9yLmRpcmVjdGl2ZS5pc3RhZ2ZpbGU9ezB9IGRpcmVjdGl2ZSBjYW5ub3QgYmUgdXNlZCBpbiBhIHRhZyBmaWxlCitqc3AuZXJyb3IuZGlyZWN0aXZlLmlzbm90dGFnZmlsZT17MH0gZGlyZWN0aXZlIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSB0YWcgZmlsZQoranNwLmVycm9yLnRhZ2ZpbGUudGxkLm5hbWU9VGhlIFwibmFtZVwiIGF0dHJpYnV0ZSBvZiB0aGUgdGFnIGRpcmVjdGl2ZSBoYXMgYSB2YWx1ZSB7MH0gd2hpbGUgdGhlIFwibmFtZVwiIHRhZyBvZiB0aGUgXCJ0YWctZmlsZVwiIGVsZW1lbnQgaW4gdGhlIFRMRCBpcyB7MX0KK2pzcC5lcnJvci5hY3Rpb24uaXN0YWdmaWxlPXswfSBhY3Rpb24gY2Fubm90IGJlIHVzZWQgaW4gYSB0YWcgZmlsZQoranNwLmVycm9yLmFjdGlvbi5pc25vdHRhZ2ZpbGU9ezB9IGFjdGlvbiBjYW4gYmUgdXNlZCBpbiB0YWcgZmlsZXMgb25seQoranNwLmVycm9yLnVudGVybWluYXRlZD1VbnRlcm1pbmF0ZWQgezB9IHRhZworanNwLmVycm9yLnVzZWJlYW4ubm90aW5zYW1lZmlsZT11c2VCZWFuIHRhZyBtdXN0IGJlZ2luIGFuZCBlbmQgaW4gdGhlIHNhbWUgcGh5c2ljYWwgZmlsZQoranNwLmVycm9yLmxvYWRjbGFzcy50YWdoYW5kbGVyPVVuYWJsZSB0byBsb2FkIHRhZyBoYW5kbGVyIGNsYXNzIFwiezB9XCIgZm9yIHRhZyBcInsxfVwiCitqc3AuZXJyb3IudW5hYmxlLmNvbXBpbGU9VW5hYmxlIHRvIGNvbXBpbGUgY2xhc3MgZm9yIEpTUAoranNwLmVycm9yLnVuYWJsZS5sb2FkPVVuYWJsZSB0byBsb2FkIGNsYXNzIGZvciBKU1AKK2pzcC5lcnJvci51bmFibGUucmVuYW1lPVVuYWJsZSB0byByZW5hbWUgY2xhc3MgZmlsZSB7MH0gdG8gezF9Citqc3AuZXJyb3IubWFuZGF0b3J5LmF0dHJpYnV0ZT17MH06IE1hbmRhdG9yeSBhdHRyaWJ1dGUgezF9IG1pc3NpbmcKK2pzcC5lbmdpbmUuaW5mbz1KYXNwZXIgSlNQIDIuMCBFbmdpbmUKK2pzcC5lcnJvci5pbnZhbGlkLmV4cHJlc3Npb249InswfSIgY29udGFpbnMgaW52YWxpZCBleHByZXNzaW9uKHMpOiB7MX0KK2pzcC5lcnJvci5pbnZhbGlkLmF0dHJpYnV0ZT17MH0gaGFzIGludmFsaWQgYXR0cmlidXRlOiB7MX0KK2pzcC5lcnJvci51c2ViZWFuLmNsYXNzLm5vdGZvdW5kPUNsYXNzOiB7MH0gbm90IGZvdW5kCitqc3AuZXJyb3IuZmlsZS5jYW5ub3QucmVhZD1DYW5ub3QgcmVhZCBmaWxlOiB7MH0KK2pzcC5lcnJvci5maWxlLmFscmVhZHkucmVnaXN0ZXJlZD1SZWN1cnNpdmUgaW5jbHVkZSBvZiBmaWxlIHswfQoranNwLmVycm9yLmZpbGUubm90LnJlZ2lzdGVyZWQ9ZmlsZSB7MH0gbm90IHNlZW4gaW4gaW5jbHVkZQoranNwLmVycm9yLnF1b3Rlcy51bnRlcm1pbmF0ZWQ9VW50ZXJtaW5hdGVkIHF1b3RlcworanNwLmVycm9yLmF0dHIucXVvdGVkPUF0dHJpYnV0ZSB2YWx1ZSBzaG91bGQgYmUgcXVvdGVkCitqc3AuZXJyb3IuYXR0ci5ub3ZhbHVlPUF0dHJpYnV0ZSB7MH0gaGFzIG5vIHZhbHVlCitqc3AuZXJyb3IudGFnLmF0dHIudW50ZXJtaW5hdGVkPVVudGVybWluYXRlZCB0YWcgYXR0cmlidXRlIGxpc3QKK2pzcC5lcnJvci5wYXJhbS5ub25hbWU9Tm8gbmFtZSBpbiBQQVJBTSB0YWcKK2pzcC5lcnJvci5wYXJhbS5ub3ZhbHVlPU5vIHZhbHVlIGluIFBBUkFNIHRhZworanNwLmVycm9yLmJlYW5zLm51bGxiZWFuPUF0dGVtcHRlZCBhIGJlYW4gb3BlcmF0aW9uIG9uIGEgbnVsbCBvYmplY3QuCitqc3AuZXJyb3IuYmVhbnMubm9iZWFuaW5mbz1ObyBCZWFuSW5mbyBmb3IgdGhlIGJlYW4gb2YgdHlwZSAnJ3swfScnIGNvdWxkIGJlIGZvdW5kLCB0aGUgY2xhc3MgbGlrZWx5IGRvZXMgbm90IGV4aXN0LgoranNwLmVycm9yLmJlYW5zLmludHJvc3BlY3Rpb249QW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGludHJvc3BlY3RpbmcgdGhlIHJlYWQgbWV0aG9kIG9mIHByb3BlcnR5ICcnezB9JycgaW4gYSBiZWFuIG9mIHR5cGUgJyd7MX0nJzpcbnsyfQoranNwLmVycm9yLmJlYW5zLm5vbWV0aG9kPUNhbm5vdCBmaW5kIGEgbWV0aG9kIHRvIHJlYWQgcHJvcGVydHkgJyd7MH0nJyBpbiBhIGJlYW4gb2YgdHlwZSAnJ3sxfScnCitqc3AuZXJyb3IuYmVhbnMubm9tZXRob2Quc2V0cHJvcGVydHk9Q2FuJyd0IGZpbmQgYSBtZXRob2QgdG8gd3JpdGUgcHJvcGVydHkgJyd7MH0nJyBvZiB0eXBlICcnezF9JycgaW4gYSBiZWFuIG9mIHR5cGUgJyd7Mn0nJworanNwLmVycm9yLmJlYW5zLm5vcHJvcGVydHk9Q2Fubm90IGZpbmQgYW55IGluZm9ybWF0aW9uIG9uIHByb3BlcnR5ICcnezB9JycgaW4gYSBiZWFuIG9mIHR5cGUgJyd7MX0nJworanNwLmVycm9yLmJlYW5zLnByb3BlcnR5LmNvbnZlcnNpb249VW5hYmxlIHRvIGNvbnZlcnQgc3RyaW5nIFwiezB9XCIgdG8gY2xhc3MgXCJ7MX1cIiBmb3IgYXR0cmlidXRlIFwiezJ9XCI6IHszfQoranNwLmVycm9yLmJlYW5zLnByb3BlcnR5ZWRpdG9yLm5vdHJlZ2lzdGVyZWQ9UHJvcGVydHkgRWRpdG9yIG5vdCByZWdpc3RlcmVkIHdpdGggdGhlIFByb3BlcnR5RWRpdG9yTWFuYWdlcgoranNwLmVycm9yLmJlYW5zLnNldHByb3BlcnR5Lm5vaW5kZXhzZXQ9Q2Fubm90IHNldCBpbmRleGVkIHByb3BlcnR5Citqc3AuZXJyb3IuaW5jbHVkZS50YWc9SW52YWxpZCBqc3A6aW5jbHVkZSB0YWcKK2pzcC5lcnJvci5pbmNsdWRlLm5vZmx1c2g9anNwOmluY2x1ZGUgbmVlZHMgdG8gaGF2ZSBcImZsdXNoPXRydWVcIgoranNwLmVycm9yLmluY2x1ZGUuYmFkZmx1c2g9anNwOmluY2x1ZGUgcGFnZT1cIi4uLlwiIGZsdXNoPVwidHJ1ZVwiIGlzIHRoZSBvbmx5IHZhbGlkIGNvbWJpbmF0aW9uIGluIEpTUCAxLjAKK2pzcC5lcnJvci5hdHRlbXB0X3RvX2NsZWFyX2ZsdXNoZWRfYnVmZmVyPUVycm9yOiBBdHRlbXB0IHRvIGNsZWFyIGEgYnVmZmVyIHRoYXQncyBhbHJlYWR5IGJlZW4gZmx1c2hlZAoranNwLmVycm9yLm92ZXJmbG93PUVycm9yOiBKU1AgQnVmZmVyIG92ZXJmbG93Citqc3AuZXJyb3IucGFyYW1leHBlY3RlZD1FeHBlY3RpbmcgXCJqc3A6cGFyYW1cIiBzdGFuZGFyZCBhY3Rpb24gd2l0aCBcIm5hbWVcIiBhbmQgXCJ2YWx1ZVwiIGF0dHJpYnV0ZXMKK2pzcC5lcnJvci5wYXJhbS5pbnZhbGlkVXNlPVRoZSBqc3A6cGFyYW0gYWN0aW9uIG11c3Qgbm90IGJlIHVzZWQgb3V0c2lkZSB0aGUganNwOmluY2x1ZGUsIGpzcDpmb3J3YXJkLCBvciBqc3A6cGFyYW1zIGVsZW1lbnRzCitqc3AuZXJyb3IucGFyYW1zLmludmFsaWRVc2U9anNwOnBhcmFtcyBtdXN0IGJlIGEgZGlyZWN0IGNoaWxkIG9mIGpzcDpwbHVnaW4KK2pzcC5lcnJvci5mYWxsYmFjay5pbnZhbGlkVXNlPWpzcDpmYWxsYmFjayBtdXN0IGJlIGEgZGlyZWN0IGNoaWxkIG9mIGpzcDpwbHVnaW4KK2pzcC5lcnJvci5uYW1lZEF0dHJpYnV0ZS5pbnZhbGlkVXNlPWpzcDphdHRyaWJ1dGUgbXVzdCBiZSB0aGUgc3ViZWxlbWVudCBvZiBhIHN0YW5kYXJkIG9yIGN1c3RvbSBhY3Rpb24KK2pzcC5lcnJvci5qc3Bib2R5LmludmFsaWRVc2U9anNwOmJvZHkgbXVzdCBiZSB0aGUgc3ViZWxlbWVudCBvZiBhIHN0YW5kYXJkIG9yIGN1c3RvbSBhY3Rpb24KK2pzcC5lcnJvci5jbG9zZWluZGl2aWR1YWxwYXJhbT1wYXJhbSB0YWcgbmVlZHMgdG8gYmUgY2xvc2VkIHdpdGggXCIvPlwiCitqc3AuZXJyb3IuY2xvc2VwYXJhbXM9cGFyYW0gdGFnIG5lZWRzIHRvIGJlIGNsb3NlZCB3aXRoIC9wYXJhbXMKK2pzcC5lcnJvci5wYXJhbXMuZW1wdHlCb2R5PWpzcDpwYXJhbXMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBuZXN0ZWQganNwOnBhcmFtCitqc3AuZXJyb3IucGFyYW1zLmlsbGVnYWxDaGlsZD1qc3A6cGFyYW1zIG11c3Qgbm90IGhhdmUgYW55IG5lc3RlZCBlbGVtZW50cyBvdGhlciB0aGFuIGpzcDpwYXJhbQoranNwLmVycm9yLnBsdWdpbi5ub3R5cGU9dHlwZSBub3QgZGVjbGFyZWQgaW4ganNwOnBsdWdpbgoranNwLmVycm9yLnBsdWdpbi5iYWR0eXBlPUlsbGVnYWwgdmFsdWUgZm9yICd0eXBlJyBhdHRyaWJ1dGUgaW4ganNwOnBsdWdpbjogbXVzdCBiZSAnYmVhbicgb3IgJ2FwcGxldCcKK2pzcC5lcnJvci5wbHVnaW4ubm9jb2RlPWNvZGUgbm90IGRlY2xhcmVkIGluIGpzcDpwbHVnaW4KK2pzcC5lcnJvci5pc2Vfb25fY2xlYXI9SWxsZWdhbCB0byBjbGVhcigpIHdoZW4gYnVmZmVyIHNpemUgPT0gMAoranNwLmVycm9yLnNldHByb3BlcnR5LmJlYW5Ob3RGb3VuZD1zZXRQcm9wZXJ0eTogQmVhbiB7MH0gbm90IGZvdW5kCitqc3AuZXJyb3IuZ2V0cHJvcGVydHkuYmVhbk5vdEZvdW5kPWdldFByb3BlcnR5OiBCZWFuIHswfSBub3QgZm91bmQKK2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5DbGFzc05vdEZvdW5kPXNldFByb3BlcnR5OiBDbGFzcyB7MH0gbm90IGZvdW5kCisjIHR5cG8gPworI2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5pbnZhbGlkU2F5bnRheD1zZXRQcm9wZXJ0eTogY2FuJ3QgaGF2ZSBub24tbnVsbCB2YWx1ZSB3aGVuIHByb3BlcnR5PSoKK2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5pbnZhbGlkU3ludGF4PXNldFByb3BlcnR5OiBjYW4ndCBoYXZlIG5vbi1udWxsIHZhbHVlIHdoZW4gcHJvcGVydHk9KgoranNwLmVycm9yLnNldHByb3BlcnR5LmJlYW5JbmZvTm90Rm91bmQ9c2V0cHJvcGVydHk6IGJlYW5JbmZvIGZvciBiZWFuIHswfSBub3QgZm91bmQKK2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5wYXJhbU9yVmFsdWU9c2V0UHJvcGVydHk6IGVpdGhlciBwYXJhbSBvciB2YWx1ZSBjYW4gYmUgcHJlc2VudAoranNwLmVycm9yLnNldHByb3BlcnR5LmFycmF5VmFsPXNldFByb3BlcnR5OiBjYW4ndCBzZXQgYXJyYXkgcHJvcGVydHkgezB9IHRocm91Z2ggYSBzdHJpbmcgY29uc3RhbnQgdmFsdWUKK2pzcC53YXJuaW5nLmtlZXBnZW49V2FybmluZzogSW52YWxpZCB2YWx1ZSBmb3IgdGhlIGluaXRQYXJhbSBrZWVwZ2VuZXJhdGVkLiBXaWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcImZhbHNlXCIKK2pzcC53YXJuaW5nLnhwb3dlcmVkQnk9V2FybmluZzogSW52YWxpZCB2YWx1ZSBmb3IgdGhlIGluaXRQYXJhbSB4cG93ZXJlZEJ5LiBXaWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcImZhbHNlXCIKK2pzcC53YXJuaW5nLmVuYWJsZVBvb2xpbmc9V2FybmluZzogSW52YWxpZCB2YWx1ZSBmb3IgdGhlIGluaXRQYXJhbSBlbmFibGVQb29saW5nLiBXaWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcInRydWVcIgoranNwLndhcm5pbmcuaW52YWxpZFRhZ1Bvb2xTaXplPVdhcm5pbmc6IEludmFsaWQgdmFsdWUgZm9yIHRoZSBpbml0IHBhcmFtZXRlciBuYW1lZCB0YWdQb29sU2l6ZS4gV2lsbCB1c2UgZGVmYXVsdCBzaXplIG9mIHswfQoranNwLndhcm5pbmcubWFwcGVkRmlsZT1XYXJuaW5nOiBJbnZhbGlkIHZhbHVlIGZvciB0aGUgaW5pdFBhcmFtIG1hcHBlZEZpbGUuIFdpbGwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIFwiZmFsc2VcIgoranNwLndhcm5pbmcuc2VuZEVyclRvQ2xpZW50PVdhcm5pbmc6IEludmFsaWQgdmFsdWUgZm9yIHRoZSBpbml0UGFyYW0gc2VuZEVyclRvQ2xpZW50LiBXaWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcImZhbHNlXCIKK2pzcC53YXJuaW5nLmNsYXNzRGVidWdJbmZvPVdhcm5pbmc6IEludmFsaWQgdmFsdWUgZm9yIHRoZSBpbml0UGFyYW0gY2xhc3NkZWJ1Z2luZm8uIFdpbGwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIFwiZmFsc2VcIgoranNwLndhcm5pbmcuY2hlY2tJbnRlcnZhbD1XYXJuaW5nOiBJbnZhbGlkIHZhbHVlIGZvciB0aGUgaW5pdFBhcmFtIGNoZWNrSW50ZXJ2YWwuIFdpbGwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIFwiMzAwXCIgc2Vjb25kcworanNwLndhcm5pbmcubW9kaWZpY2F0aW9uVGVzdEludGVydmFsPVdhcm5pbmc6IEludmFsaWQgdmFsdWUgZm9yIHRoZSBpbml0UGFyYW0gbW9kaWZpY2F0aW9uVGVzdEludGVydmFsLiBXaWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcIjRcIiBzZWNvbmRzCitqc3Aud2FybmluZy5kZXZlbG9wbWVudD1XYXJuaW5nOiBJbnZhbGlkIHZhbHVlIGZvciB0aGUgaW5pdFBhcmFtIGRldmVsb3BtZW50LiBXaWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcInRydWVcIgoranNwLndhcm5pbmcuZm9yaz1XYXJuaW5nOiBJbnZhbGlkIHZhbHVlIGZvciB0aGUgaW5pdFBhcmFtIGZvcmsuIFdpbGwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIFwidHJ1ZVwiCitqc3Aud2FybmluZy5yZWxvYWRpbmc9V2FybmluZzogSW52YWxpZCB2YWx1ZSBmb3IgdGhlIGluaXRQYXJhbSByZWxvYWRpbmcuIFdpbGwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIFwidHJ1ZVwiCitqc3Aud2FybmluZy5kdW1wU21hcD1XYXJuaW5nOiBJbnZhbGlkIHZhbHVlIGZvciB0aGUgaW5pdFBhcmFtIGR1bXBTbWFwLiBXaWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcImZhbHNlXCIKK2pzcC53YXJuaW5nLmdlbmNoYXJhcnJheT1XYXJuaW5nOiBJbnZhbGlkIHZhbHVlIGZvciB0aGUgaW5pdFBhcmFtIGdlblN0ckFzQ2hhckFycmF5LiBXaWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcImZhbHNlXCIKK2pzcC53YXJuaW5nLnN1cHByZXNzU21hcD1XYXJuaW5nOiBJbnZhbGlkIHZhbHVlIGZvciB0aGUgaW5pdFBhcmFtIHN1cHByZXNzU21hcC4gV2lsbCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgXCJmYWxzZVwiCitqc3AuZXJyb3IuYmFkdGFnbGliPVVuYWJsZSB0byBvcGVuIHRhZ2xpYnJhcnkgezB9IDogezF9Citqc3AuZXJyb3IuYmFkR2V0UmVhZGVyPUNhbm5vdCBjcmVhdGUgYSByZWFkZXIgd2hlbiB0aGUgc3RyZWFtIGlzIG5vdCBidWZmZXJlZAoranNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLnRhZ2xpYj1Vbmtub3duIGVsZW1lbnQgKHswfSkgaW4gdGFnbGliCitqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4udGFnPVVua25vd24gZWxlbWVudCAoezB9KSBpbiB0YWcKK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi50YWdmaWxlPVVua25vd24gZWxlbWVudCAoezB9KSBpbiB0YWctZmlsZQoranNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLmF0dHJpYnV0ZT1Vbmtub3duIGVsZW1lbnQgKHswfSkgaW4gYXR0cmlidXRlCitqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4udmFyaWFibGU9VW5rbm93biBlbGVtZW50ICh7MH0pIGluIHZhcmlhYmxlCitqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4udmFsaWRhdG9yPVVua25vd24gZWxlbWVudCAoezB9KSBpbiB2YWxpZGF0b3IKK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi5pbml0UGFyYW09VW5rbm93biBlbGVtZW50ICh7MH0pIGluIHZhbGlkYXRvcidzIGluaXQtcGFyYW0KK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi5mdW5jdGlvbj1Vbmtub3duIGVsZW1lbnQgKHswfSkgaW4gZnVuY3Rpb24KK2pzcC5lcnJvci5tb3JlLnRoYW4ub25lLnRhZ2xpYj1Nb3JlIHRoYW4gb25lIHRhZ2xpYiBpbiB0aGUgVExEOiB7MH0KK2pzcC5lcnJvci50ZWljbGFzcy5pbnN0YW50aWF0aW9uPUZhaWxlZCB0byBsb2FkIG9yIGluc3RhbnRpYXRlIFRhZ0V4dHJhSW5mbyBjbGFzczogezB9Citqc3AuZXJyb3Iubm9uX251bGxfdGVpX2FuZF92YXJfc3ViZWxlbXM9VGFnIHswfSBoYXMgb25lIG9yIG1vcmUgdmFyaWFibGUgc3ViZWxlbWVudHMgYW5kIGEgVGFnRXh0cmFJbmZvIGNsYXNzIHRoYXQgcmV0dXJucyBvbmUgb3IgbW9yZSBWYXJpYWJsZUluZm8KK2pzcC5lcnJvci5wYXJzZS5lcnJvci5pbi5UTEQ9UGFyc2UgRXJyb3IgaW4gdGhlIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3I6IHswfQoranNwLmVycm9yLnVuYWJsZS50by5vcGVuLlRMRD1VbmFibGUgdG8gb3BlbiB0aGUgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcjogezB9Citqc3AuYnVmZmVyLnNpemUuemVybz1CdWZmZXIgc2l6ZSA8PSAwCitqc3AuZXJyb3IuZmlsZS5ub3QuZm91bmQ9RmlsZSBcInswfVwiIG5vdCBmb3VuZAoranNwLm1lc3NhZ2UuY29weWluZ3VyaT1Db3B5aW5nIHswfSBpbnRvIHsxfQoranNwLm1lc3NhZ2UuaHRtbGNvbW1lbnQ9XG5TdHJpcHBpbmcgQ29tbWVudDogXHR7MH0KK2pzcC5tZXNzYWdlLmhhbmRsaW5nX2RpcmVjdGl2ZT1cbkhhbmRsaW5nIERpcmVjdGl2ZTogezB9XHR7MX0KK2pzcC5tZXNzYWdlLmhhbmRsaW5nX3BsdWdpbj1cblBsdWdpbjogezB9Citqc3AubWVzc2FnZS5wYWNrYWdlX25hbWVfaXM9UGFja2FnZSBuYW1lIGlzOiB7MH0KK2pzcC5tZXNzYWdlLmNsYXNzX25hbWVfaXM9Q2xhc3MgbmFtZSBpczogezB9Citqc3AubWVzc2FnZS5qYXZhX2ZpbGVfbmFtZV9pcz1KYXZhIGZpbGUgbmFtZSBpczogezB9Citqc3AubWVzc2FnZS5jbGFzc19maWxlX25hbWVfaXM9Q2xhc3MgZmlsZSBuYW1lIGlzOiB7MH0KK2pzcC5tZXNzYWdlLmFjY2VwdGVkPUFjY2VwdGVkIHswfSBhdCB7MX0KK2pzcC5tZXNzYWdlLmFkZGluZ19qYXI9QWRkaW5nIGphciB7MH0gdG8gbXkgY2xhc3NwYXRoCitqc3AubWVzc2FnZS5jb21waWxpbmdfd2l0aD1Db21waWxpbmcgd2l0aDogezB9Citqc3AubWVzc2FnZS50ZW1wbGF0ZV90ZXh0PXRlbXBsYXRlIHRleHQKK2pzcC5lcnJvci5taXNzaW5nX2F0dHJpYnV0ZT1BY2NvcmRpbmcgdG8gdGhlIFRMRCBvciB0aGUgdGFnIGZpbGUsIGF0dHJpYnV0ZSB7MH0gaXMgbWFuZGF0b3J5IGZvciB0YWcgezF9Citqc3AuZXJyb3IuYmFkX2F0dHJpYnV0ZT1BdHRyaWJ1dGUgezB9IGludmFsaWQgZm9yIHRhZyB7MX0gYWNjb3JkaW5nIHRvIFRMRAoranNwLmVycm9yLnRsZC51bmFibGVfdG9fcmVhZD1VbmFibGUgdG8gcmVhZCBUTEQgXCJ7MX1cIiBmcm9tIEpBUiBmaWxlIFwiezB9XCI6IHsyfQoranNwLmVycm9yLnRsZC51bmFibGVfdG9fZ2V0X2phcj1VbmFibGUgdG8gZ2V0IEpBUiByZXNvdXJjZSBcInswfVwiIGNvbnRhaW5pbmcgVExEOiB7MX0KK2pzcC5lcnJvci50bGQubWlzc2luZ19qYXI9TWlzc2luZyBKQVIgcmVzb3VyY2UgXCJ7MH1cIiBjb250YWluaW5nIFRMRAoranNwLmVycm9yLndlYnhtbF9ub3RfZm91bmQ9Q291bGQgbm90IGxvY2F0ZSB3ZWIueG1sCitqc3AuY21kX2xpbmUudXNhZ2U9VXNhZ2U6IGpzcHRvc2VydmxldCBbLWRkIDxwYXRoL3RvL291dHB1dERpcmVjdG9yeT5dIFsta2VlcGdlbmVyYXRlZF0gXAorPC5qc3AgZmlsZXM+Citqc3AubWVzc2FnZS5jcF9pcz1DbGFzc3BhdGggezB9IGlzOiB7MX0KK2pzcC5lcnJvci51bmFibGUudG9fbG9hZF90YWdoYW5kbGVyX2NsYXNzPVVuYWJsZSB0byBsb2FkIHRhZyBoYW5kbGVyIGNsYXNzIHswfSBiZWNhdXNlIG9mIHsxfQoranNwLmVycm9yLnVuYWJsZS50b19maW5kX21ldGhvZD1VbmFibGUgdG8gZmluZCBzZXR0ZXIgbWV0aG9kIGZvciBhdHRyaWJ1dGU6IHswfQoranNwLmVycm9yLnVuYWJsZS50b19jb252ZXJ0X3N0cmluZz1VbmFibGUgdG8gY29udmVydCBhIFN0cmluZyB0byB7MH0gZm9yIGF0dHJpYnV0ZSB7MX0KK2pzcC5lcnJvci51bmFibGUudG9faW50cm9zcGVjdD1VbmFibGUgdG8gaW50cm9zcGVjdCBvbiB0YWcgaGFuZGxlciBjbGFzczogezB9IGJlY2F1c2Ugb2YgezF9Citqc3AuZXJyb3IuYmFkX3RhZz1ObyB0YWcgXCJ7MH1cIiBkZWZpbmVkIGluIHRhZyBsaWJyYXJ5IGltcG9ydGVkIHdpdGggcHJlZml4IFwiezF9XCIKK2pzcC5lcnJvci54bWwuYmFkX3RhZz1ObyB0YWcgXCJ7MH1cIiBkZWZpbmVkIGluIHRhZyBsaWJyYXJ5IGFzc29jaWF0ZWQgd2l0aCB1cmkgXCJ7MX1cIgoranNwLmVycm9yLmJhZF9zdHJpbmdfQ2hhcmFjdGVyPUNhbm5vdCBleHRyYWN0IGEgQ2hhcmFjdGVyIGZyb20gYSB6ZXJvIGxlbmd0aCBhcnJheQoranNwLmVycm9yLmJhZF9zdHJpbmdfY2hhcj1DYW5ub3QgZXh0cmFjdCBhIGNoYXIgZnJvbSBhIHplcm8gbGVuZ3RoIGFycmF5Citqc3Aud2FybmluZy5jb21waWxlci5jbGFzcy5jYW50Y3JlYXRlPUNhbid0IGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBzcGVjaWZpZWQgY29tcGlsZXIgcGx1Z2luIGNsYXNzIHswfSBkdWUgdG8gezF9LiBXaWxsIGRlZmF1bHQgdG8gU3VuIEphdmEgQ29tcGlsZXIuCitqc3Aud2FybmluZy5jb21waWxlci5jbGFzcy5ub3Rmb3VuZD1TcGVjaWZpZWQgY29tcGlsZXIgcGx1Z2luIGNsYXNzIHswfSBub3QgZm91bmQuIFdpbGwgZGVmYXVsdCB0byBTdW4gSmF2YSBDb21waWxlci4KK2pzcC53YXJuaW5nLmNvbXBpbGVyLnBhdGgubm90Zm91bmQ9U3BlY2lmaWVkIGNvbXBpbGVyIHBhdGggezB9IG5vdCBmb3VuZC4gV2lsbCBkZWZhdWx0IHRvIHN5c3RlbSBQQVRILgoranNwLmVycm9yLmpzcGMudXJpcm9vdF9ub3RfZGlyPVRoZSAtdXJpcm9vdCBvcHRpb24gbXVzdCBzcGVjaWZ5IGEgcHJlLWV4aXN0aW5nIGRpcmVjdG9yeQoranNwLmVycm9yLmpzcGMubWlzc2luZ1RhcmdldD1NaXNzaW5nIHRhcmdldDogTXVzdCBzcGVjaWZ5IC13ZWJhcHAgb3IgLXVyaXJvb3QsIG9yIG9uZSBvciBtb3JlIEpTUCBwYWdlcworanNwLmVycm9yLmpzcGMubm9fdXJpcm9vdD1UaGUgdXJpcm9vdCBpcyBub3Qgc3BlY2lmaWVkIGFuZCBjYW5ub3QgYmUgbG9jYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgSlNQIGZpbGUocykKK2pzcGMuaW1wbGljaXQudXJpUm9vdD11cmlSb290IGltcGxpY2l0bHkgc2V0IHRvICJ7MH0iCitqc3BjLnVzYWdlPVVzYWdlOiBqc3BjIDxvcHRpb25zPiBbLS1dIDxqc3AgZmlsZXM+XG5cCit3aGVyZSBqc3AgZmlsZXMgaXNcblwKK1wgICAgLXdlYmFwcCA8ZGlyPiAgICAgIEEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSB3ZWItYXBwLCB3aG9zZSBKU1AgcGFnZXNcblwKK1wgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcHJvY2Vzc2VkIHJlY3Vyc2l2ZWx5XG5cCitvciBhbnkgbnVtYmVyIG9mXG5cCitcICAgIDxmaWxlPiAgICAgICAgICAgICBBIGZpbGUgdG8gYmUgcGFyc2VkIGFzIGEgSlNQIHBhZ2VcblwKK3doZXJlIG9wdGlvbnMgaW5jbHVkZTpcblwKK1wgICAgLWhlbHAgICAgICAgICAgICAgIFByaW50IHRoaXMgaGVscCBtZXNzYWdlXG5cCitcICAgIC12ICAgICAgICAgICAgICAgICBWZXJib3NlIG1vZGVcblwKK1wgICAgLWQgPGRpcj4gICAgICAgICAgIE91dHB1dCBEaXJlY3RvcnkgKGRlZmF1bHQgLURqYXZhLmlvLnRtcGRpcilcblwKK1wgICAgLWwgICAgICAgICAgICAgICAgIE91dHB1dHMgdGhlIG5hbWUgb2YgdGhlIEpTUCBwYWdlIHVwb24gZmFpbHVyZVxuXAorXCAgICAtcyAgICAgICAgICAgICAgICAgT3V0cHV0cyB0aGUgbmFtZSBvZiB0aGUgSlNQIHBhZ2UgdXBvbiBzdWNjZXNzXG5cCitcICAgIC1wIDxuYW1lPiAgICAgICAgICBOYW1lIG9mIHRhcmdldCBwYWNrYWdlIChkZWZhdWx0IG9yZy5hcGFjaGUuanNwKVxuXAorXCAgICAtYyA8bmFtZT4gICAgICAgICAgTmFtZSBvZiB0YXJnZXQgY2xhc3MgbmFtZSAob25seSBhcHBsaWVzIHRvIGZpcnN0IEpTUCBwYWdlKVxuXAorXCAgICAtbWFwcGVkICAgICAgICAgICAgR2VuZXJhdGVzIHNlcGFyYXRlIHdyaXRlKCkgY2FsbHMgZm9yIGVhY2ggSFRNTCBsaW5lIGluIHRoZSBKU1BcblwKK1wgICAgLWRpZVsjXSAgICAgICAgICAgIEdlbmVyYXRlcyBhbiBlcnJvciByZXR1cm4gY29kZSAoIykgb24gZmF0YWwgZXJyb3JzIChkZWZhdWx0IDEpXG5cCitcICAgIC11cmliYXNlIDxkaXI+ICAgICBUaGUgdXJpIGRpcmVjdG9yeSBjb21waWxhdGlvbnMgc2hvdWxkIGJlIHJlbGF0aXZlIHRvXG5cCitcICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAiLyIpXG5cCitcICAgIC11cmlyb290IDxkaXI+ICAgICBTYW1lIGFzIC13ZWJhcHBcblwKK1wgICAgLWNvbXBpbGUgICAgICAgICAgIENvbXBpbGVzIGdlbmVyYXRlZCBzZXJ2bGV0c1xuXAorXCAgICAtd2ViaW5jIDxmaWxlPiAgICAgQ3JlYXRlcyBhIHBhcnRpYWwgc2VydmxldCBtYXBwaW5ncyBpbiB0aGUgZmlsZVxuXAorXCAgICAtd2VieG1sIDxmaWxlPiAgICAgQ3JlYXRlcyBhIGNvbXBsZXRlIHdlYi54bWwgaW4gdGhlIGZpbGVcblwKK1wgICAgLWllcGx1Z2luIDxjbHNpZD4gIEphdmEgUGx1Z2luIGNsYXNzaWQgZm9yIEludGVybmV0IEV4cGxvcmVyXG5cCitcICAgIC1jbGFzc3BhdGggPHBhdGg+ICBPdmVycmlkZXMgamF2YS5jbGFzcy5wYXRoIHN5c3RlbSBwcm9wZXJ0eVxuXAorXCAgICAteHBvd2VyZWRCeSAgICAgICAgQWRkIFgtUG93ZXJlZC1CeSByZXNwb25zZSBoZWFkZXJcblwKK1wgICAgLXRyaW1TcGFjZXMgICAgICAgIFRyaW0gc3BhY2VzIGluIHRlbXBsYXRlIHRleHQgYmV0d2VlbiBhY3Rpb25zLCBkaXJlY3RpdmVzXG5cCitcICAgIC1qYXZhRW5jb2RpbmcgPGVuYz4gU2V0IHRoZSBlbmNvZGluZyBjaGFyc2V0IGZvciBKYXZhIGNsYXNzZXMgKGRlZmF1bHQgVVRGLTgpXG5cCitcICAgIC1zb3VyY2UgPHZlcnNpb24+ICAgU2V0IHRoZSAtc291cmNlIGFyZ3VtZW50IHRvIHRoZSBjb21waWxlciAoZGVmYXVsdCAxLjQpXG5cCitcICAgIC10YXJnZXQgPHZlcnNpb24+ICAgU2V0IHRoZSAtdGFyZ2V0IGFyZ3VtZW50IHRvIHRoZSBjb21waWxlciAoZGVmYXVsdCAxLjQpXG5cCisKK2pzcGMud2VieG1sLmhlYWRlcj08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+XG5cCitcblwKKzwhRE9DVFlQRSB3ZWItYXBwXG5cCitcICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIlxuXAorXCAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIj5cblwKKzwhLS1cblwKK0F1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSBBcGFjaGUgSmFrYXJ0YSBUb21jYXQgSnNwQy5cblwKKy0tPlxuXAorPHdlYi1hcHA+XG5cCitcbgoranNwYy53ZWJ4bWwuZm9vdGVyPVxuXAorPC93ZWItYXBwPlxuXAorXG4KK2pzcGMud2ViaW5jLmhlYWRlcj1cblwKKzwhLS1cblwKK0F1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSBBcGFjaGUgSmFrYXJ0YSBUb21jYXQgSnNwQy5cblwKK1BsYWNlIHRoaXMgZnJhZ21lbnQgaW4gdGhlIHdlYi54bWwgYmVmb3JlIGFsbCBpY29uLCBkaXNwbGF5LW5hbWUsXG5cCitkZXNjcmlwdGlvbiwgZGlzdHJpYnV0YWJsZSwgYW5kIGNvbnRleHQtcGFyYW0gZWxlbWVudHMuXG5cCistLT5cbgoranNwYy53ZWJpbmMuZm9vdGVyPVxuXAorPCEtLVxuXAorQWxsIHNlc3Npb24tY29uZmlnLCBtaW1lLW1hcHBpbmcsIHdlbGNvbWUtZmlsZS1saXN0LCBlcnJvci1wYWdlLCB0YWdsaWIsXG5cCityZXNvdXJjZS1yZWYsIHNlY3VyaXR5LWNvbnN0cmFpbnQsIGxvZ2luLWNvbmZpZywgc2VjdXJpdHktcm9sZSxcblwKK2Vudi1lbnRyeSwgYW5kIGVqYi1yZWYgZWxlbWVudHMgc2hvdWxkIGZvbGxvdyB0aGlzIGZyYWdtZW50LlxuXAorLS0+XG4KK2pzcGMud2ViaW5jLmluc2VydEVuZD08IS0tIEpTUEMgc2VydmxldCBtYXBwaW5ncyBlbmQgLS0+Citqc3BjLndlYmluYy5pbnNlcnRTdGFydD08IS0tIEpTUEMgc2VydmxldCBtYXBwaW5ncyBzdGFydCAtLT4KK2pzcGMuZXJyb3IuamFzcGVyRXhjZXB0aW9uPWVycm9yLXRoZSBmaWxlICcnezB9JycgZ2VuZXJhdGVkIHRoZSBmb2xsb3dpbmcgcGFyc2UgZXhjZXB0aW9uOiB7MX0KK2pzcGMuZXJyb3IuZ2VuZXJhbEV4Y2VwdGlvbj1FUlJPUi10aGUgZmlsZSAnJ3swfScnIGdlbmVyYXRlZCB0aGUgZm9sbG93aW5nIGdlbmVyYWwgZXhjZXB0aW9uOgoranNwYy5lcnJvci5maWxlRG9lc05vdEV4aXN0PVRoZSBmaWxlIGFyZ3VtZW50ICcnezB9JycgZG9lcyBub3QgZXhpc3QKK2pzcGMuZXJyb3IuZW1wdHlXZWJBcHA9LXdlYmFwcCByZXF1aXJlcyBhIHRyYWlsaW5nIGZpbGUgYXJndW1lbnQKK2pzcC5lcnJvci5saWJyYXJ5LmludmFsaWQ9SlNQIHBhZ2UgaXMgaW52YWxpZCBhY2NvcmRpbmcgdG8gbGlicmFyeSB7MH06IHsxfQoranNwLmVycm9yLnRsdmNsYXNzLmluc3RhbnRpYXRpb249RmFpbGVkIHRvIGxvYWQgb3IgaW5zdGFudGlhdGUgVGFnTGlicmFyeVZhbGlkYXRvciBjbGFzczogezB9Citqc3AuZXJyb3IudGx2LmludmFsaWQucGFnZT1WYWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZyb20gVGFnTGlicmFyeVZhbGlkYXRvciBmb3IgezB9IGluIHsxfQoranNwLmVycm9yLnRlaS5pbnZhbGlkLmF0dHJpYnV0ZXM9VmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmcm9tIFRhZ0V4dHJhSW5mbyBmb3IgezB9Citqc3AucGFyc2VyLnNheC5wcm9wZXJ0eW5vdHN1cHBvcnRlZD1TQVggcHJvcGVydHkgbm90IHN1cHBvcnRlZDogezB9Citqc3AucGFyc2VyLnNheC5wcm9wZXJ0eW5vdHJlY29nbml6ZWQ9U0FYIHByb3BlcnR5IG5vdCByZWNvZ25pemVkOiB7MH0KK2pzcC5wYXJzZXIuc2F4LmZlYXR1cmVub3RzdXBwb3J0ZWQ9U0FYIGZlYXR1cmUgbm90IHN1cHBvcnRlZDogezB9Citqc3AucGFyc2VyLnNheC5mZWF0dXJlbm90cmVjb2duaXplZD1TQVggZmVhdHVyZSBub3QgcmVjb2duaXplZDogezB9Citqc3AuZXJyb3Iubm8ubW9yZS5jb250ZW50PUVuZCBvZiBjb250ZW50IHJlYWNoZWQgd2hpbGUgbW9yZSBwYXJzaW5nIHJlcXVpcmVkOiB0YWcgbmVzdGluZyBlcnJvcj8KK2pzcC5lcnJvci5wYXJzZS54bWw9WE1MIHBhcnNpbmcgZXJyb3Igb24gZmlsZSB7MH0KK2pzcC5lcnJvci5wYXJzZS54bWwubGluZT1YTUwgcGFyc2luZyBlcnJvciBvbiBmaWxlIHswfTogKGxpbmUgezF9LCBjb2wgezJ9KQoranNwLmVycm9yLnBhcnNlLnhtbC5zY3JpcHRpbmcuaW52YWxpZC5ib2R5PUJvZHkgb2YgezB9IGVsZW1lbnQgbXVzdCBub3QgY29udGFpbiBhbnkgWE1MIGVsZW1lbnRzCitqc3AuZXJyb3IuaW50ZXJuYWwudGxkaW5pdD1VbmFibGUgdG8gaW5pdGlhbGl6ZSBUbGRMb2NhdGlvbnNDYWNoZTogezB9Citqc3AuZXJyb3IuaW50ZXJuYWwuZmlsZW5vdGZvdW5kPUludGVybmFsIEVycm9yOiBGaWxlIHswfSBub3QgZm91bmQKK2pzcC5lcnJvci5pbnRlcm5hbC5ldmFsdWF0b3Jfbm90X2ZvdW5kPUludGVybmFsIGVycm9yOiB1bmFibGUgdG8gbG9hZCBleHByZXNzaW9uIGV2YWx1YXRvcgoranNwLmVycm9yLnBhcnNlLnhtbC5pbnZhbGlkUHVibGljSWQ9SW52YWxpZCBQVUJMSUMgSUQ6IHswfQoranNwLmVycm9yLmluY2x1ZGUuZmx1c2guaW52YWxpZC52YWx1ZT1JbnZhbGlkIHZhbHVlIGZvciB0aGUgZmx1c2ggYXR0cmlidXRlOiB7MH0KK2pzcC5lcnJvci51bnN1cHBvcnRlZC5lbmNvZGluZz1VbnN1cHBvcnRlZCBlbmNvZGluZzogezB9Cit0bGQuZXJyb3IudmFyaWFibGVOb3RBbGxvd2VkPUl0IGlzIGFuIGVycm9yIGZvciBhIHRhZyB0aGF0IGhhcyBvbmUgb3IgbW9yZSB2YXJpYWJsZSBzdWJlbGVtZW50cyB0byBoYXZlIGEgVGFnRXh0cmFJbmZvIGNsYXNzIHRoYXQgcmV0dXJucyBhIG5vbi1udWxsIG9iamVjdC4KK2pzcC5lcnJvci50bGRJbldlYkRvdFhtbE5vdEZvdW5kPUNvdWxkIG5vdCBsb2NhdGUgVExEIHsxfSBmb3IgVVJJIHswfSBzcGVjaWZpZWQgaW4gd2ViLnhtbAoranNwLmVycm9yLnRhZ2xpYkRpcmVjdGl2ZS5hYnNVcmlDYW5ub3RCZVJlc29sdmVkPVRoZSBhYnNvbHV0ZSB1cmk6IHswfSBjYW5ub3QgYmUgcmVzb2x2ZWQgaW4gZWl0aGVyIHdlYi54bWwgb3IgdGhlIGphciBmaWxlcyBkZXBsb3llZCB3aXRoIHRoaXMgYXBwbGljYXRpb24KK2pzcC5lcnJvci50YWdsaWJEaXJlY3RpdmUubWlzc2luZy5sb2NhdGlvbj1OZWl0aGVyIFwndXJpXCcgbm9yIFwndGFnZGlyXCcgYXR0cmlidXRlIHNwZWNpZmllZAoranNwLmVycm9yLnRhZ2xpYkRpcmVjdGl2ZS5ib3RoX3VyaV9hbmRfdGFnZGlyPUJvdGggXCd1cmlcJyBhbmQgXCd0YWdkaXJcJyBhdHRyaWJ1dGVzIHNwZWNpZmllZAoranNwLmVycm9yLmludmFsaWQudGFnZGlyPVRhZyBmaWxlIGRpcmVjdG9yeSB7MH0gZG9lcyBub3Qgc3RhcnQgd2l0aCBcIi9XRUItSU5GL3RhZ3NcIgoranNwLmVycm9yLnVudGVybWluYXRlZC51c2VyLnRhZz1VbnRlcm1pbmF0ZWQgdXNlci1kZWZpbmVkIHRhZzogZW5kaW5nIHRhZyB7MH0gbm90IGZvdW5kIG9yIGluY29ycmVjdGx5IG5lc3RlZAorI2pzcHguZXJyb3IudGVtcGxhdGVEYXRhTm90SW5Kc3BDZGF0YT1WYWxpZGF0aW9uIEVycm9yOiBFbGVtZW50ICZsdDt7MH0mZ3Q7IGNhbm5vdCBoYXZlIHRlbXBsYXRlIGRhdGEuIFRlbXBsYXRlIGRhdGEgbXVzdCBiZSBlbmNhcHN1bGF0ZWQgd2l0aGluIGEgJmx0O2pzcDpjZGF0YSZndDsgZWxlbWVudC4gW0pTUDEuMiBQRkQgc2VjdGlvbiA1LjEuOV1cblRlbXBsYXRlIGRhdGEgaW4gZXJyb3I6IHsxfQoranNweC5lcnJvci50ZW1wbGF0ZURhdGFOb3RJbkpzcENkYXRhPVZhbGlkYXRpb24gRXJyb3I6IEVsZW1lbnQgJmx0O3swfSZndDsgY2Fubm90IGhhdmUgdGVtcGxhdGUgZGF0YS4gVGVtcGxhdGUgZGF0YSBtdXN0IGJlIGVuY2Fwc3VsYXRlZCB3aXRoaW4gYSAmbHQ7anNwOnRleHQmZ3Q7IGVsZW1lbnQuIFtKU1AxLjIgUEZEIHNlY3Rpb24gNS4xLjldXG5UZW1wbGF0ZSBkYXRhIGluIGVycm9yOiB7MX0KKyNFcnJvciB3aGlsZSBwcm9jZXNzaW5nIHRhZ2xpYiBqYXIgZmlsZSB7MH06IHsxfQoranNwLmVycm9yLnRhZ2xpYi5yZXNlcnZlZC5wcmVmaXg9VGhlIHRhZ2xpYiBwcmVmaXggezB9IGlzIHJlc2VydmVkCitqc3AuZXJyb3IuaW52YWxpZC5qYXZhRW5jb2Rpbmc9SW52YWxpZCBqYXZhIGVuY29kaW5ncy4gVHJpZWQgezB9IGFuZCB0aGVuIHsxfS4gQm90aCBmYWlsZWQuCitqc3AuZXJyb3IubmVlZEFsdGVybmF0ZUphdmFFbmNvZGluZz1EZWZhdWx0IGphdmEgZW5jb2RpbmcgezB9IGlzIGludmFsaWQgb24geW91ciBqYXZhIHBsYXRmb3JtLiBBbiBhbHRlcm5hdGUgY2FuIGJlIHNwZWNpZmllZCB2aWEgdGhlICdqYXZhRW5jb2RpbmcnIHBhcmFtZXRlciBvZiBKc3BTZXJ2bGV0LgorI0Vycm9yIHdoZW4gY29tcGlsaW5nLCB1c2VkIGZvciBqc3AgbGluZSBudW1iZXIgZXJyb3IgbWVzc2FnZXMKK2pzcC5lcnJvci5zaW5nbGUubGluZS5udW1iZXI9QW4gZXJyb3Igb2NjdXJyZWQgYXQgbGluZTogezB9IGluIHRoZSBqc3AgZmlsZTogezF9Citqc3AuZXJyb3IubXVsdGlwbGUubGluZS5udW1iZXI9XG5cbkFuIGVycm9yIG9jY3VycmVkIGJldHdlZW4gbGluZXM6IHswfSBhbmQgezF9IGluIHRoZSBqc3AgZmlsZTogezJ9XG5cbgoranNwLmVycm9yLmNvcnJlc3BvbmRpbmcuc2VydmxldD1HZW5lcmF0ZWQgc2VydmxldCBlcnJvcjpcbgoranNwLmVycm9yLmVtcHR5LmJvZHkubm90LmFsbG93ZWQ9RW1wdHkgYm9keSBub3QgYWxsb3dlZCBmb3IgezB9Citqc3AuZXJyb3IuanNwYm9keS5yZXF1aXJlZD1NdXN0IHVzZSBqc3A6Ym9keSB0byBzcGVjaWZ5IHRhZyBib2R5IGZvciB7MH0gaWYganNwOmF0dHJpYnV0ZSBpcyB1c2VkLgoranNwLmVycm9yLmpzcGJvZHkuZW1wdHlib2R5Lm9ubHk9VGhlIHswfSB0YWcgY2FuIG9ubHkgaGF2ZSBqc3A6YXR0cmlidXRlIGluIGl0cyBib2R5LgoranNwLmVycm9yLm5vLnNjcmlwdGxldHM9U2NyaXB0aW5nIGVsZW1lbnRzICggJmx0OyUhLCAmbHQ7anNwOmRlY2xhcmF0aW9uLCAmbHQ7JT0sICZsdDtqc3A6ZXhwcmVzc2lvbiwgJmx0OyUsICZsdDtqc3A6c2NyaXB0bGV0ICkgYXJlIGRpc2FsbG93ZWQgaGVyZS4KK2pzcC5lcnJvci5pbnRlcm5hbC51bmV4cGVjdGVkX25vZGVfdHlwZT1JbnRlcm5hbCBFcnJvcjogVW5leHBlY3RlZCBub2RlIHR5cGUgZW5jb3VudGVyZWQKK2pzcC5lcnJvci50bGQuZm4uaW52YWxpZC5zaWduYXR1cmU9SW52YWxpZCBzeW50YXggZm9yIGZ1bmN0aW9uIHNpZ25hdHVyZSBpbiBUTEQuICBUYWcgTGlicmFyeTogezB9LCBGdW5jdGlvbjogezF9Citqc3AuZXJyb3IudGxkLmZuLmR1cGxpY2F0ZS5uYW1lPUR1cGxpY2F0ZSBmdW5jdGlvbiBuYW1lIHswfSBpbiB0YWcgbGlicmFyeSB7MX0KK2pzcC5lcnJvci50bGQuZm4uaW52YWxpZC5zaWduYXR1cmUuY29tbWFleHBlY3RlZD1JbnZhbGlkIHN5bnRheCBmb3IgZnVuY3Rpb24gc2lnbmF0dXJlIGluIFRMRC4gIENvbW1hICcsJyBleHBlY3RlZC4gIFRhZyBMaWJyYXJ5OiB7MH0sIEZ1bmN0aW9uOiB7MX0uCitqc3AuZXJyb3IudGxkLmZuLmludmFsaWQuc2lnbmF0dXJlLnBhcmVuZXhwZWN0ZWQ9SW52YWxpZCBzeW50YXggZm9yIGZ1bmN0aW9uIHNpZ25hdHVyZSBpbiBUTEQuICBQYXJlbnRoZXNpcyAnKCcgZXhwZWN0ZWQuICBUYWcgTGlicmFyeTogezB9LCBGdW5jdGlvbjogezF9LgoranNwLmVycm9yLnRsZC5tYW5kYXRvcnkuZWxlbWVudC5taXNzaW5nPU1hbmRhdG9yeSBUTEQgZWxlbWVudCBtaXNzaW5nIG9yIGVtcHR5OiB7MH0KK2pzcC5lcnJvci5keW5hbWljLmF0dHJpYnV0ZXMubm90LmltcGxlbWVudGVkPVRoZSB7MH0gdGFnIGRlY2xhcmVzIHRoYXQgaXQgYWNjZXB0cyBkeW5hbWljIGF0dHJpYnV0ZXMgYnV0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgcmVxdWlyZWQgaW50ZXJmYWNlCitqc3AuZXJyb3Iubm9tYXRjaGluZy5mcmFnbWVudD1DYW5ub3QgZmluZCBhbiBhdHRyaWJ1dGUgZGlyZWN0aXZlICh3aXRoIG5hbWU9ezB9IGFuZCBmcmFnbWVudD10cnVlKSBwcmlvciB0byB0aGUgZnJhZ21lbnQgZGlyZWN0aXZlLgoranNwLmVycm9yLmF0dHJpYnV0ZS5ub2VxdWFsPWVxdWFsIHN5bWJvbCBleHBlY3RlZAoranNwLmVycm9yLmF0dHJpYnV0ZS5ub3F1b3RlPXF1b3RlIHN5bWJvbCBleHBlY3RlZAoranNwLmVycm9yLmF0dHJpYnV0ZS51bnRlcm1pbmF0ZWQ9YXR0cmlidXRlIGZvciB7MH0gaXMgbm90IHByb3Blcmx5IHRlcm1pbmF0ZWQKK2pzcC5lcnJvci5taXNzaW5nLnRhZ0luZm89VGFnSW5mbyBvYmplY3QgZm9yIHswfSBpcyBtaXNzaW5nIGZyb20gVExECitqc3AuZXJyb3IuZnJhZ21lbnR3aXRodHlwZT1DYW5ub3Qgc3BlY2lmeSBib3RoICdmcmFnbWVudCcgYW5kICd0eXBlJyBhdHRyaWJ1dGVzLiAgSWYgJ2ZyYWdtZW50JyBpcyBwcmVzZW50LCAndHlwZScgaXMgZml4ZWQgYXMgJ2phdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BGcmFnbWVudCcKK2pzcC5lcnJvci5mcmFnbWVudHdpdGhydGV4cHJ2YWx1ZT1DYW5ub3Qgc3BlY2lmeSBib3RoICdmcmFnbWVudCcgYW5kICdydGV4cHJ2YWx1ZScgYXR0cmlidXRlcy4gIElmICdmcmFnbWVudCcgaXMgcHJlc2VudCwgJ3J0ZXhwcnZhbHVlJyBpcyBmaXhlZCBhcyAndHJ1ZScKK2pzcC5lcnJvci5mcmFnbWVudFdpdGhEZWNsYXJlT3JTY29wZT1Cb3RoICdmcmFnbWVudCcgYW5kICdkZWNsYXJlJyBvciAnc2NvcGUnIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIGluIHZhcmlhYmxlIGRpcmVjdGl2ZQoranNwLmVycm9yLnZhcl9hbmRfdmFyUmVhZGVyPU9ubHkgb25lIG9mIFwndmFyXCcgb3IgXCd2YXJSZWFkZXJcJyBtYXkgYmUgc3BlY2lmaWVkCitqc3AuZXJyb3IubWlzc2luZ192YXJfb3JfdmFyUmVhZGVyPU1pc3NpbmcgXCd2YXJcJyBvciBcJ3ZhclJlYWRlclwnIGF0dHJpYnV0ZQoranNwLndhcm5pbmcuYmFkLnVybHBhdHRlcm4ucHJvcGVydHlncm91cD1CYWQgdmFsdWUgezB9IGluIHRoZSB1cmwtcGF0dGVybiBzdWJlbGVtZW50IGluIHdlYi54bWwKK2pzcC5lcnJvci51bmtub3duX2F0dHJpYnV0ZV90eXBlPVVua25vd24gYXR0cmlidXRlIHR5cGUgKHsxfSkgZm9yIGF0dHJpYnV0ZSB7MH0uCitqc3AuZXJyb3IuanNwZWxlbWVudC5taXNzaW5nLm5hbWU9TWFuZGF0b3J5IFhNTC1zdHlsZSBcJ25hbWVcJyBhdHRyaWJ1dGUgbWlzc2luZworanNwLmVycm9yLnhtbG5zLnJlZGVmaW5pdGlvbi5ub3RpbXBsZW1lbnRlZD1JbnRlcm5hbCBlcnJvcjogQXR0ZW1wdCB0byByZWRlZmluZSB4bWxuczp7MH0uICBSZWRlZmluaXRpb24gb2YgbmFtZXNwYWNlcyBpcyBub3QgaW1wbGVtZW50ZWQuCitqc3AuZXJyb3IuY291bGQubm90LmFkZC50YWdsaWJyYXJpZXM9Q291bGQgbm90IGFkZCBvbmUgb3IgbW9yZSB0YWcgbGlicmFyaWVzLgoranNwLmVycm9yLmR1cGxpY2F0ZS5uYW1lLmpzcGF0dHJpYnV0ZT1UaGUgYXR0cmlidXRlIHswfSBzcGVjaWZpZWQgaW4gdGhlIHN0YW5kYXJkIG9yIGN1c3RvbSBhY3Rpb24gYWxzbyBhcHBlYXJzIGFzIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZSBhdHRyaWJ1dGUgaW4gdGhlIGVuY2xvc2VkIGpzcDphdHRyaWJ1dGUKK2pzcC5lcnJvci5ub3QuaW4udGVtcGxhdGU9ezB9IG5vdCBhbGxvd2VkIGluIGEgdGVtcGxhdGUgdGV4dCBib2R5LgoranNwLmVycm9yLmJhZFN0YW5kYXJkQWN0aW9uPUludmFsaWQgc3RhbmRhcmQgYWN0aW9uCitqc3AuZXJyb3IueG1sLmJhZFN0YW5kYXJkQWN0aW9uPUludmFsaWQgc3RhbmRhcmQgYWN0aW9uOiB7MH0KK2pzcC5lcnJvci50YWdkaXJlY3RpdmUuYmFkYm9keWNvbnRlbnQ9SW52YWxpZCBib2R5LWNvbnRlbnQgKHswfSkgaW4gdGFnIGRpcmVjdGl2ZQoranNwLmVycm9yLnNpbXBsZXRhZy5iYWRib2R5Y29udGVudD1UaGUgVExEIGZvciB0aGUgY2xhc3MgezB9IHNwZWNpZmllcyBhbiBpbnZhbGlkIGJvZHktY29udGVudCAoSlNQKSBmb3IgYSBTaW1wbGVUYWcuCitqc3AuZXJyb3IuY29uZmlnX3BhZ2VkaXJfZW5jb2RpbmdfbWlzbWF0Y2g9UGFnZS1lbmNvZGluZyBzcGVjaWZpZWQgaW4ganNwLXByb3BlcnR5LWdyb3VwICh7MH0pIGlzIGRpZmZlcmVudCBmcm9tIHRoYXQgc3BlY2lmaWVkIGluIHBhZ2UgZGlyZWN0aXZlICh7MX0pCitqc3AuZXJyb3IucHJvbG9nX3BhZ2VkaXJfZW5jb2RpbmdfbWlzbWF0Y2g9UGFnZS1lbmNvZGluZyBzcGVjaWZpZWQgaW4gWE1MIHByb2xvZyAoezB9KSBpcyBkaWZmZXJlbnQgZnJvbSB0aGF0IHNwZWNpZmllZCBpbiBwYWdlIGRpcmVjdGl2ZSAoezF9KQoranNwLmVycm9yLnByb2xvZ19jb25maWdfZW5jb2RpbmdfbWlzbWF0Y2g9UGFnZS1lbmNvZGluZyBzcGVjaWZpZWQgaW4gWE1MIHByb2xvZyAoezB9KSBpcyBkaWZmZXJlbnQgZnJvbSB0aGF0IHNwZWNpZmllZCBpbiBqc3AtcHJvcGVydHktZ3JvdXAgKHsxfSkKK2pzcC5lcnJvci5hdHRyaWJ1dGUuY3VzdG9tLm5vbl9ydF93aXRoX2V4cHI9QWNjb3JkaW5nIHRvIFRMRCBvciBhdHRyaWJ1dGUgZGlyZWN0aXZlIGluIHRhZyBmaWxlLCBhdHRyaWJ1dGUgezB9IGRvZXMgbm90IGFjY2VwdCBhbnkgZXhwcmVzc2lvbnMKK2pzcC5lcnJvci5hdHRyaWJ1dGUuc3RhbmRhcmQubm9uX3J0X3dpdGhfZXhwcj1UaGUgezB9IGF0dHJpYnV0ZSBvZiB0aGUgezF9IHN0YW5kYXJkIGFjdGlvbiBkb2VzIG5vdCBhY2NlcHQgYW55IGV4cHJlc3Npb25zCitqc3AuZXJyb3Iuc2NyaXB0aW5nLnZhcmlhYmxlLm1pc3NpbmdfbmFtZT1VbmFibGUgdG8gZGV0ZXJtaW5lIHNjcmlwdGluZyB2YXJpYWJsZSBuYW1lIGZyb20gYXR0cmlidXRlIHswfQoramFzcGVyLmVycm9yLmVtcHR5Ym9keWNvbnRlbnQubm9uZW1wdHk9QWNjb3JkaW5nIHRvIFRMRCwgdGFnIHswfSBtdXN0IGJlIGVtcHR5LCBidXQgaXMgbm90Citqc3AuZXJyb3IudGFnZmlsZS5uYW1lTm90VW5pcXVlPVRoZSB2YWx1ZSBvZiB7MH0gYW5kIHRoZSB2YWx1ZSBvZiB7MX0gaW4gbGluZSB7Mn0gYXJlIHRoZSBzYW1lLgoranNwLmVycm9yLnRhZ2ZpbGUubmFtZUZyb20ubm9BdHRyaWJ1dGU9Q2Fubm90IGZpbmQgYW4gYXR0cmlidXRlIGRpcmVjdGl2ZSB3aXRoIGEgbmFtZSBhdHRyaWJ1dGUgd2l0aCBhIHZhbHVlIFwiezB9XCIsIHRoZSB2YWx1ZSBvZiB0aGlzIG5hbWUtZnJvbS1hdHRyaWJ1dGUgYXR0cmlidXRlLgoranNwLmVycm9yLnRhZ2ZpbGUubmFtZUZyb20uYmFkQXR0cmlidXRlPVRoZSBhdHRyaWJ1dGUgZGlyZWN0aXZlIChkZWNsYXJlZCBpbiBsaW5lIHsxfSBhbmQgd2hvc2UgbmFtZSBhdHRyaWJ1dGUgaXMgXCJ7MH1cIiwgdGhlIHZhbHVlIG9mIHRoaXMgbmFtZS1mcm9tLWF0dHJpYnV0ZSBhdHRyaWJ1dGUpIG11c3QgYmUgb2YgdHlwZSBqYXZhLmxhbmcuU3RyaW5nLCBpcyBcInJlcXVpcmVkXCIgYW5kIG5vdCBhIFwicnRleHBydmFsdWVcIi4KK2pzcC5lcnJvci5wYWdlLm5vU2Vzc2lvbj1DYW5ub3QgYWNjZXNzIHNlc3Npb24gc2NvcGUgaW4gcGFnZSB0aGF0IGRvZXMgbm90IHBhcnRpY2lwYXRlIGluIGFueSBzZXNzaW9uCitqc3AuZXJyb3IudXNlYmVhbi5ub1Nlc3Npb249SWxsZWdhbCBmb3IgdXNlQmVhbiB0byB1c2Ugc2Vzc2lvbiBzY29wZSB3aGVuIEpTUCBwYWdlIGRlY2xhcmVzICh2aWEgcGFnZSBkaXJlY3RpdmUpIHRoYXQgaXQgZG9lcyBub3QgcGFydGljaXBhdGUgaW4gc2Vzc2lvbnMKK2pzcC5lcnJvci54bWwuZW5jb2RpbmdCeXRlT3JkZXJVbnN1cHBvcnRlZCA9IEdpdmVuIGJ5dGUgb3JkZXIgZm9yIGVuY29kaW5nIFwiezB9XCIgaXMgbm90IHN1cHBvcnRlZC4KK2pzcC5lcnJvci54bWwuZW5jb2RpbmdEZWNsSW52YWxpZCA9IEludmFsaWQgZW5jb2RpbmcgbmFtZSBcInswfVwiLgoranNwLmVycm9yLnhtbC5lbmNvZGluZ0RlY2xSZXF1aXJlZCA9IFRoZSBlbmNvZGluZyBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBpbiB0aGUgdGV4dCBkZWNsYXJhdGlvbi4KK2pzcC5lcnJvci54bWwubW9yZVBzZXVkb0F0dHJpYnV0ZXMgPSBtb3JlIHBzZXVkbyBhdHRyaWJ1dGVzIGlzIGV4cGVjdGVkLgoranNwLmVycm9yLnhtbC5ub01vcmVQc2V1ZG9BdHRyaWJ1dGVzID0gbm8gbW9yZSBwc2V1ZG8gYXR0cmlidXRlcyBpcyBhbGxvd2VkLgoranNwLmVycm9yLnhtbC52ZXJzaW9uSW5mb1JlcXVpcmVkID0gVGhlIHZlcnNpb24gaXMgcmVxdWlyZWQgaW4gdGhlIFhNTCBkZWNsYXJhdGlvbi4KK2pzcC5lcnJvci54bWwueG1sRGVjbFVudGVybWluYXRlZCA9IFRoZSBYTUwgZGVjbGFyYXRpb24gbXVzdCBlbmQgd2l0aCBcIj8+XCIuCitqc3AuZXJyb3IueG1sLnJlc2VydmVkUElUYXJnZXQgPSBUaGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQgbWF0Y2hpbmcgXCJbeFhdW21NXVtsTF1cIiBpcyBub3QgYWxsb3dlZC4KK2pzcC5lcnJvci54bWwuc3BhY2VSZXF1aXJlZEluUEkgPSBXaGl0ZSBzcGFjZSBpcyByZXF1aXJlZCBiZXR3ZWVuIHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCBhbmQgZGF0YS4KK2pzcC5lcnJvci54bWwuaW52YWxpZENoYXJJbkNvbnRlbnQgPSBBbiBpbnZhbGlkIFhNTCBjaGFyYWN0ZXIgKFVuaWNvZGU6IDB4ezB9KSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudCBvZiB0aGUgZG9jdW1lbnQuCitqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVTdGFuZGFsb25lID0gV2hpdGUgc3BhY2UgaXMgcmVxdWlyZWQgYmVmb3JlIHRoZSBlbmNvZGluZyBwc2V1ZG8gYXR0cmlidXRlIGluIHRoZSBYTUwgZGVjbGFyYXRpb24uCitqc3AuZXJyb3IueG1sLnNkRGVjbEludmFsaWQgPSBUaGUgc3RhbmRhbG9uZSBkb2N1bWVudCBkZWNsYXJhdGlvbiB2YWx1ZSBtdXN0IGJlIFwieWVzXCIgb3IgXCJub1wiLCBub3QgXCJ7MH1cIi4KK2pzcC5lcnJvci54bWwuaW52YWxpZENoYXJJblBJID0gQW4gaW52YWxpZCBYTUwgY2hhcmFjdGVyIChVbmljb2RlOiAweHswfSkgd2FzIGZvdW5kIGluIHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLgoranNwLmVycm9yLnhtbC52ZXJzaW9uTm90U3VwcG9ydGVkID0gWE1MIHZlcnNpb24gXCJ7MH1cIiBpcyBub3Qgc3VwcG9ydGVkLCBvbmx5IFhNTCAxLjAgaXMgc3VwcG9ydGVkLgoranNwLmVycm9yLnhtbC5wc2V1ZG9BdHRyTmFtZUV4cGVjdGVkID0gYSBwc2V1ZG8gYXR0cmlidXRlIG5hbWUgaXMgZXhwZWN0ZWQuCitqc3AuZXJyb3IueG1sLmV4cGVjdGVkQnl0ZSA9IEV4cGVjdGVkIGJ5dGUgezB9IG9mIHsxfS1ieXRlIFVURi04IHNlcXVlbmNlLgoranNwLmVycm9yLnhtbC5pbnZhbGlkQnl0ZSA9IEludmFsaWQgYnl0ZSB7MH0gb2YgezF9LWJ5dGUgVVRGLTggc2VxdWVuY2UuCitqc3AuZXJyb3IueG1sLm9wZXJhdGlvbk5vdFN1cHBvcnRlZCA9IE9wZXJhdGlvbiBcInswfVwiIG5vdCBzdXBwb3J0ZWQgYnkgezF9IHJlYWRlci4KK2pzcC5lcnJvci54bWwuaW52YWxpZEhpZ2hTdXJyb2dhdGUgPSBIaWdoIHN1cnJvZ2F0ZSBiaXRzIGluIFVURi04IHNlcXVlbmNlIG11c3Qgbm90IGV4Y2VlZCAweDEwIGJ1dCBmb3VuZCAweHswfS4KK2pzcC5lcnJvci54bWwuaW52YWxpZEFTQ0lJID0gQnl0ZSBcInswfVwiIG5vdCA3LWJpdCBBU0NJSS4KK2pzcC5lcnJvci54bWwuc3BhY2VSZXF1aXJlZEJlZm9yZUVuY29kaW5nSW5YTUxEZWNsID0gV2hpdGUgc3BhY2UgaXMgcmVxdWlyZWQgYmVmb3JlIHRoZSBlbmNvZGluZyBwc2V1ZG8gYXR0cmlidXRlIGluIHRoZSBYTUwgZGVjbGFyYXRpb24uCitqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVFbmNvZGluZ0luVGV4dERlY2wgPSBXaGl0ZSBzcGFjZSBpcyByZXF1aXJlZCBiZWZvcmUgdGhlIGVuY29kaW5nIHBzZXVkbyBhdHRyaWJ1dGUgaW4gdGhlIHRleHQgZGVjbGFyYXRpb24uCitqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVWZXJzaW9uSW5UZXh0RGVjbCA9IFdoaXRlIHNwYWNlIGlzIHJlcXVpcmVkIGJlZm9yZSB0aGUgdmVyc2lvbiBwc2V1ZG8gYXR0cmlidXRlIGluIHRoZSB0ZXh0IGRlY2xhcmF0aW9uLgoranNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlVmVyc2lvbkluWE1MRGVjbCA9IFdoaXRlIHNwYWNlIGlzIHJlcXVpcmVkIGJlZm9yZSB0aGUgdmVyc2lvbiBwc2V1ZG8gYXR0cmlidXRlIGluIHRoZSBYTUwgZGVjbGFyYXRpb24uCitqc3AuZXJyb3IueG1sLmVxUmVxdWlyZWRJblhNTERlY2wgPSBUaGUgJycgPSAnJyBjaGFyYWN0ZXIgbXVzdCBmb2xsb3cgXCJ7MH1cIiBpbiB0aGUgWE1MIGRlY2xhcmF0aW9uLgoranNwLmVycm9yLnhtbC5lcVJlcXVpcmVkSW5UZXh0RGVjbCA9IFRoZSAnJyA9ICcnIGNoYXJhY3RlciBtdXN0IGZvbGxvdyBcInswfVwiIGluIHRoZSB0ZXh0IGRlY2xhcmF0aW9uLgoranNwLmVycm9yLnhtbC5xdW90ZVJlcXVpcmVkSW5UZXh0RGVjbCA9IFRoZSB2YWx1ZSBmb2xsb3dpbmcgXCJ7MH1cIiBpbiB0aGUgdGV4dCBkZWNsYXJhdGlvbiBtdXN0IGJlIGEgcXVvdGVkIHN0cmluZy4KK2pzcC5lcnJvci54bWwucXVvdGVSZXF1aXJlZEluWE1MRGVjbCA9IFRoZSB2YWx1ZSBmb2xsb3dpbmcgXCJ7MH1cIiBpbiB0aGUgWE1MIGRlY2xhcmF0aW9uIG11c3QgYmUgYSBxdW90ZWQgc3RyaW5nLgoranNwLmVycm9yLnhtbC5pbnZhbGlkQ2hhckluVGV4dERlY2wgPSBBbiBpbnZhbGlkIFhNTCBjaGFyYWN0ZXIgKFVuaWNvZGU6IDB4ezB9KSB3YXMgZm91bmQgaW4gdGhlIHRleHQgZGVjbGFyYXRpb24uCitqc3AuZXJyb3IueG1sLmludmFsaWRDaGFySW5YTUxEZWNsID0gQW4gaW52YWxpZCBYTUwgY2hhcmFjdGVyIChVbmljb2RlOiAweHswfSkgd2FzIGZvdW5kIGluIHRoZSBYTUwgZGVjbGFyYXRpb24uCitqc3AuZXJyb3IueG1sLmNsb3NlUXVvdGVNaXNzaW5nSW5UZXh0RGVjbCA9IGNsb3NpbmcgcXVvdGUgaW4gdGhlIHZhbHVlIGZvbGxvd2luZyBcInswfVwiIGluIHRoZSB0ZXh0IGRlY2xhcmF0aW9uIGlzIG1pc3NpbmcuCitqc3AuZXJyb3IueG1sLmNsb3NlUXVvdGVNaXNzaW5nSW5YTUxEZWNsID0gY2xvc2luZyBxdW90ZSBpbiB0aGUgdmFsdWUgZm9sbG93aW5nIFwiezB9XCIgaW4gdGhlIFhNTCBkZWNsYXJhdGlvbiBpcyBtaXNzaW5nLgoranNwLmVycm9yLnhtbC5pbnZhbGlkSGlnaFN1cnJvZ2F0ZSA9IEhpZ2ggc3Vycm9nYXRlIGJpdHMgaW4gVVRGLTggc2VxdWVuY2UgbXVzdCBub3QgZXhjZWVkIDB4MTAgYnV0IGZvdW5kIDB4ezB9LgoranNwLmVycm9yLm11bHRpcGxlLmpzcCA9IENhbm5vdCBoYXZlIG11bHRpcGxlIHNwZWNpZmljYXRpb25zIG9mIAoranNwLmVycm9yLmpzcG91dHB1dC5jb25mbGljdD0mbHQ7anNwOm91dHB1dCZndDs6IGlsbGVnYWwgdG8gaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiBcInswfVwiIHdpdGggZGlmZmVyZW50IHZhbHVlcyAob2xkOiB7MX0sIG5ldzogezJ9KQoranNwLmVycm9yLmpzcG91dHB1dC5kb2N0eXBlbmFtZXN5c3RlbT0mbHQ7anNwOm91dHB1dCZndDs6ICdkb2N0eXBlLXJvb3QtZWxlbWVudCcgYW5kICdkb2N0eXBlLXN5c3RlbScgYXR0cmlidXRlcyBtdXN0IGFwcGVhciB0b2dldGhlcgoranNwLmVycm9yLmpzcG91dHB1dC5kb2N0eXBlcHVsaWNzeXN0ZW09Jmx0O2pzcDpvdXRwdXQmZ3Q7OiAnZG9jdHlwZS1zeXN0ZW0nIGF0dHJpYnV0ZSBtdXN0IGFwcGVhciBpZiAnZG9jdHlwZS1wdWJsaWMnIGF0dHJpYnV0ZSBhcHBlYXJzCitqc3AuZXJyb3IuanNwb3V0cHV0Lm5vbmVtcHR5Ym9keT0mbHQ7anNwOm91dHB1dCZndDsgbXVzdCBub3QgaGF2ZSBhIGJvZHkKK2pzcC5lcnJvci5qc3BvdXRwdXQuaW52YWxpZFVzZT0mbHQ7anNwOm91dHB1dCZndDsgbXVzdCBub3QgYmUgdXNlZCBpbiBzdGFuZGFyZCBzeW50YXgKK2pzcC5lcnJvci5hdHRyaWJ1dGVzLm5vdC5hbGxvd2VkID0gezB9IG11c3Qgbm90IGhhdmUgYW55IGF0dHJpYnV0ZXMKK2pzcC5lcnJvci50YWdmaWxlLmJhZFN1ZmZpeD1NaXNzaW5nIFwiLnRhZ1wiIHN1ZmZpeCBpbiB0YWcgZmlsZSBwYXRoIHswfQoranNwLmVycm9yLnRhZ2ZpbGUuaWxsZWdhbFBhdGg9SWxsZWdhbCB0YWcgZmlsZSBwYXRoOiB7MH0sIG11c3Qgc3RhcnQgd2l0aCBcIi9XRUItSU5GL3RhZ3NcIiBvciBcIi9NRVRBLUlORi90YWdzXCIKK2pzcC5lcnJvci5wbHVnaW4ud3JvbmdSb290RWxlbWVudD1OYW1lIG9mIHJvb3QgZWxlbWVudCBpbiB7MH0gZGlmZmVyZW50IGZyb20gezF9Citqc3AuZXJyb3IuYXR0cmlidXRlLmludmFsaWRQcmVmaXg9VGhlIGF0dHJpYnV0ZSBwcmVmaXggezB9IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW55IGltcG9ydGVkIHRhZyBsaWJyYXJ5Citqc3AuZXJyb3IubmVzdGVkLmpzcGF0dHJpYnV0ZT1BIGpzcDphdHRyaWJ1dGUgc3RhbmRhcmQgYWN0aW9uIGNhbm5vdCBiZSBuZXN0ZWQgd2l0aGluIGFub3RoZXIganNwOmF0dHJpYnV0ZSBzdGFuZGFyZCBhY3Rpb24KK2pzcC5lcnJvci5uZXN0ZWQuanNwYm9keT1BIGpzcDpib2R5IHN0YW5kYXJkIGFjdGlvbiBjYW5ub3QgYmUgbmVzdGVkIHdpdGhpbiBhbm90aGVyIGpzcDpib2R5IG9yIGpzcDphdHRyaWJ1dGUgc3RhbmRhcmQgYWN0aW9uCitqc3AuZXJyb3IudmFyaWFibGUuZWl0aGVyLm5hbWU9RWl0aGVyIG5hbWUtZ2l2ZW4gb3IgbmFtZS1mcm9tLWF0dHJpYnV0ZSBhdHRyaWJ1dGUgbXVzdCBiZSBzcGVjaWZpZWQgaW4gYSB2YXJpYWJsZSBkaXJlY3RpdmUKK2pzcC5lcnJvci52YXJpYWJsZS5ib3RoLm5hbWU9Q2Fubm90IHNwZWNpZnkgYm90aCBuYW1lLWdpdmVuIG9yIG5hbWUtZnJvbS1hdHRyaWJ1dGUgYXR0cmlidXRlcyBpbiBhIHZhcmlhYmxlIGRpcmVjdGl2ZQoranNwLmVycm9yLnZhcmlhYmxlLmFsaWFzPUJvdGggb3Igbm9uZSBvZiB0aGUgbmFtZS1mcm9tLWF0dHJpYnV0ZSBhbmQgYWxpYXMgYXR0cmlidXRlcyBtdXN0IGJlIHNwZWNpZmllZCBpbiBhIHZhcmlhYmxlIGRpcmVjdGl2ZQoranNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWU9TnVsbCBhdHRyaWJ1dGUgbmFtZQoranNwLmVycm9yLmpzcHRleHQuYmFkY29udGVudD1cJyZsdDtcJywgd2hlbiBhcHBlYXJzIGluIHRoZSBib2R5IG9mICZsdDtqc3A6dGV4dCZndDssIG11c3QgYmUgZW5jYXBzdWxhdGVkIHdpdGhpbiBhIENEQVRBCitqc3AuZXJyb3IuanNwcm9vdC52ZXJzaW9uLmludmFsaWQ9SW52YWxpZCB2ZXJzaW9uIG51bWJlcjogXCJ7MH1cIiwgbXVzdCBiZSBcIjEuMlwiIG9yIFwiMi4wXCIKK2pzcC5lcnJvci5ub0Z1bmN0aW9uUHJlZml4PVRoZSBmdW5jdGlvbiB7MH0gbXVzdCBiZSB1c2VkIHdpdGggYSBwcmVmaXggd2hlbiBhIGRlZmF1bHQgbmFtZXNwYWNlIGlzIG5vdCBzcGVjaWZpZWQKK2pzcC5lcnJvci5ub0Z1bmN0aW9uPVRoZSBmdW5jdGlvbiB7MH0gY2Fubm90IGJlIGxvY2F0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeAoranNwLmVycm9yLm5vRnVuY3Rpb25NZXRob2Q9TWV0aG9kIFwiezB9XCIgZm9yIGZ1bmN0aW9uIFwiezF9XCIgbm90IGZvdW5kIGluIGNsYXNzIFwiezJ9XCIKK2pzcC5lcnJvci5mdW5jdGlvbi5jbGFzc25vdGZvdW5kPVRoZSBjbGFzcyB7MH0gc3BlY2lmaWVkIGluIFRMRCBmb3IgdGhlIGZ1bmN0aW9uIHsxfSBjYW5ub3QgYmUgZm91bmQ6IHsyfQoranNwLmVycm9yLnNpZ25hdHVyZS5jbGFzc25vdGZvdW5kPVRoZSBjbGFzcyB7MH0gc3BlY2lmaWVkIGluIHRoZSBtZXRob2Qgc2lnbmF0dXJlIGluIFRMRCBmb3IgdGhlIGZ1bmN0aW9uIHsxfSBjYW5ub3QgYmUgZm91bmQuIHsyfQoranNwLmVycm9yLnRleHQuaGFzX3N1YmVsZW1lbnQ9Jmx0O2pzcDp0ZXh0Jmd0OyBtdXN0IG5vdCBoYXZlIGFueSBzdWJlbGVtZW50cworanNwLmVycm9yLmRhdGEuZmlsZS5yZWFkPUVycm9yIHJlYWRpbmcgZmlsZSBcInswfVwiCitqc3AuZXJyb3IucHJlZml4LnJlZmluZWQ9QXR0ZW1wdCB0byByZWRlZmluZSB0aGUgcHJlZml4IHswfSB0byB7MX0sIHdoZW4gaXQgd2FzIGFscmVhZHkgZGVmaW5lZCBhcyB7Mn0gaW4gdGhlIGN1cnJlbnQgc2NvcGUuCitqc3AuZXJyb3IubmVzdGVkX2pzcHJvb3Q9TmVzdGVkICZsdDtqc3A6cm9vdCZndDsKK2pzcC5lcnJvci51bmJhbGFuY2VkLmVuZHRhZz1UaGUgZW5kIHRhZyBcIiZsdDsvezB9XCIgaXMgdW5iYWxhbmNlZAoranNwLmVycm9yLmludmFsaWQuYmVhbj1UaGUgdmFsdWUgZm9yIHRoZSB1c2VCZWFuIGNsYXNzIGF0dHJpYnV0ZSB7MH0gaXMgaW52YWxpZC4KK2pzcC5lcnJvci5wcmVmaXgudXNlX2JlZm9yZV9kY2w9VGhlIHByZWZpeCB7MH0gc3BlY2lmaWVkIGluIHRoaXMgdGFnIGRpcmVjdGl2ZSBoYXMgYmVlbiBwcmV2aW91c2x5IHVzZWQgYnkgYW4gYWN0aW9uIGluIGZpbGUgezF9IGxpbmUgezJ9LgpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3Jlc291cmNlcy9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjE1Mzk5Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0MDggQEAKKyMgJElkJAorIworIyBEZWZhdWx0IGxvY2FsaXplZCBzdHJpbmcgaW5mb3JtYXRpb24KKyMgTG9jYWxpemVkIHBhcmEgTG9jYWxlIGVzX0VTCisKK2pzcC5lcnJvci5iYWQuc2VydmxldC5lbmdpbmU9oVZlcnNp824gaW5jb3JyZWN0YSBkZWwgbW90b3Igc2VydmxldCEKK2pzcC5lcnJvci5uby5zY3JhdGNoLmRpcj1FbCBtb3RvciBKU1Agbm8gdGllbmUgY29uZmlndXJhZG8gdW4gZGlyZWN0b3JpbyBkZSB0cmFiYWpvLlwKK1xuIEHxYWRhIFwianNwLmluaXRwYXJhbXM9c2NyYXRjaGRpcj08ZGlyLW5hbWU+XCIgXAorXG4gZW4gZWwgZmljaGVybyBzZXJ2bGV0cy5wcm9wZXJ0aWVzIHBhcmEgZXN0ZSBjb250ZXh0by4KK2pzcC5lcnJvci5iYWQuc2NyYXRjaC5kaXI9RWwgZGlyZWN0b3JpbyBkZSB0cmFiYWpvIGVzcGVjaWZpY2FkbzogezB9IG5vIGVzIHV0aWxpemFibGUuCitqc3AubWVzc2FnZS5zY3JhdGNoLmRpci5pcz1FbCBkaXJlY3RvcmlvIGRlIHRyYWJham8gcGFyYSBlbCBtb3RvciBKU1AgZXM6IHswfQoranNwLm1lc3NhZ2UucGFyZW50X2NsYXNzX2xvYWRlcl9pcz1FbCBjYXJnYWRvciBkZSBjbGFzZXMgZXM6IHswfQoranNwLm1lc3NhZ2UuZG9udC5tb2RpZnkuc2VydmxldHM9SU1QT1JUQU5URTogTm8gbW9kaWZpcXVlIGxvcyBzZXJ2bGV0cyBnZW5lcmFkb3MKK2pzcC5lcnJvci5ub3QuaW1wbC5jb21tZW50cz1FcnJvciBJbnRlcm5vOiBDb21tZW50cyBubyBpbXBsZW1lbnRhZG8KK2pzcC5lcnJvci5ub3QuaW1wbC5kaXJlY3RpdmVzPUVycm9yIEludGVybm86IERpcmVjdGl2ZXMgbm8gaW1wbGVtZW50YWRvCitqc3AuZXJyb3Iubm90LmltcGwuZGVjbGFyYXRpb25zPUVycm9yIEludGVybm86IERlY2xhcmF0aW9ucyBubyBpbXBsZW1lbnRhZG8KK2pzcC5lcnJvci5ub3QuaW1wbC5leHByZXNzaW9ucz1FcnJvciBJbnRlcm5vOiBFeHByZXNzaW9ucyBubyBpbXBsZW1lbnRhZG8KK2pzcC5lcnJvci5ub3QuaW1wbC5zY3JpcHRsZXRzPUVycm9yIEludGVybm86IFNjcmlwdGxldHMgbm8gaW1wbGVtZW50YWRvCitqc3AuZXJyb3Iubm90LmltcGwudXNlQmVhbj1FcnJvciBJbnRlcm5vOiB1c2VCZWFuIG5vIGltcGxlbWVudGFkbworanNwLmVycm9yLm5vdC5pbXBsLmdldHA9RXJyb3IgSW50ZXJubzogZ2V0UHJvcGVydHkgbm8gaW1wbGVtZW50YWRvCitqc3AuZXJyb3Iubm90LmltcGwuc2V0cD1FcnJvciBJbnRlcm5vOiBzZXRQcm9wZXJ0eSBubyBpbXBsZW1lbnRhZG8KK2pzcC5lcnJvci5ub3QuaW1wbC5wbHVnaW49RXJyb3IgSW50ZXJubzogcGx1Z2luIG5vIGltcGxlbWVudGFkbworanNwLmVycm9yLm5vdC5pbXBsLmZvcndhcmQ9RXJyb3IgSW50ZXJubzogZm9yd2FyZCBubyBpbXBsZW1lbnRhZG8KK2pzcC5lcnJvci5ub3QuaW1wbC5pbmNsdWRlPUVycm9yIEludGVybm86IGluY2x1ZGUgbm8gaW1wbGVtZW50YWRvCitqc3AuZXJyb3IudW5hdmFpbGFibGU9SlNQIGhhIHNpZG8gbWFyY2FkbyBjb21vIG5vIGRpc3BvbmlibGUKK2pzcC5lcnJvci51c2ViZWFuLm1pc3NpbmcuYXR0cmlidXRlPXVzZUJlYW46IGZhbHRhIGF0cmlidXRvIGlkIG8gZXN04SBtYWwgZGlnaXRhZG8KK2pzcC5lcnJvci51c2ViZWFuLm1pc3NpbmcudHlwZT11c2VCZWFuICh7MH0pOiBTZSBkZWJlIGRlIGVzcGVjaWZpY2FyIGF0cmlidXRvIGNsYXNzIG8gdHlwZToKK2pzcC5lcnJvci51c2ViZWFuLmR1cGxpY2F0ZT11c2VCZWFuOiBOb21icmUgZGUgYmVhbiBkdXBsaWNhZG86IHswfQoranNwLmVycm9yLnVzZWJlYW4ucHJvaGliaXRlZC5hcy5zZXNzaW9uPU5vIHB1ZWRvIHVzYXIgY29tbyBiZWFuIGRlIHNlc2nzbiB7MH0geWEgcXVlIGVzdOEgcHJvaGliaWRvIFwKK3BvciBkaXJlY3RpdmEganNwIGRlZmluaWRhIHByZXZpYW1lbnRlOiAKK2pzcC5lcnJvci51c2ViZWFuLm5vdC5ib3RoPXVzZUJlYW46IE5vIHB1ZWRlIGVzcGVjaWZpY2FyIGFtYm9zIGF0cmlidXRvcyBjbGFzcyB5IGJlYW5OYW1lOiAKK2pzcC5lcnJvci51c2ViZWFuLmJhZC50eXBlLmNhc3Q9dXNlQmVhbiAoezB9KTogVGlwbyAoezF9KSBubyBlcyBhc2lnbmFibGUgZGVzZGUgY2xhc2UgKHsyfSkgCitqc3AuZXJyb3IuaW52YWxpZC5zY29wZT1WYWxvciBpbGVnYWwgZGUgYXRyaWJ1dG8gXCdzY29wZVwnOiB7MH0gKGRlYmUgZGUgc2VyIHVubyBkZSBcInBhZ2VcIiwgXCJyZXF1ZXN0XCIsIFwic2Vzc2lvblwiLCBvIFwiYXBwbGljYXRpb25cIikKK2pzcC5lcnJvci5jbGFzc25hbWU9Tm8gcHVkZSBkZXRlcm1pbmFyIGVsIG5vbWJyZSBkZSBjbGFzZSBkZXNkZSBlbCBmaWNoZXJvIC5jbGFzcworanNwLndhcm5pbmcuYmFkLnR5cGU9QXZpc286IHRpcG8gaW5jb3JyZWN0byBlbiBhcmNoaXZvIC5jbGFzcworanNwLmVycm9yLmRhdGEuZmlsZS53cml0ZT1FcnJvciBtaWVudHJhcyBlc2NyaWLtYSBlbCBhcmNoaXZvIGRlIGRhdG9zCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmJ1ZmZlcj1EaXJlY3RpdmEgUGFnZTogbWVkaWRhIGRlIGJ1ZmZlciBpbnbhbGlkYQoranNwLmVycm9yLnBhZ2UuY29uZmxpY3QuY29udGVudHR5cGU9RGlyZWN0aXZhIFBhZ2U6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ2NvbnRlbnRUeXBlJyBjb24gdmFsb3JlcyBkaXN0aW50b3MgKHZpZWpvOiB7MH0sIG51ZXZvOiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmNvbnRlbnR0eXBlPURpcmVjdGl2YSBQYWdlOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgY29udGVudFR5cGUKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LnNlc3Npb249RGlyZWN0aXZhIFBhZ2U6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ3Nlc3Npb24nIGNvbiB2YWxvcmVzIGRpc3RpbnRvcyAodmllam86IHswfSwgbnVldm86IHsxfSkKK2pzcC5lcnJvci5wYWdlLmludmFsaWQuc2Vzc2lvbj1EaXJlY3RpdmEgUGFnZTogdmFsb3IgaW5jb3JyZWN0byBwYXJhIHNlc3Npb24KK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmJ1ZmZlcj1EaXJlY3RpdmEgUGFnZTogZXMgaWxlZ2FsIHRlbmVyIG36bHRpcGxlcyBvY3VycmVuY2lhcyBkZSAnYnVmZmVyJ2NvbiB2YWxvcmVzIGRpc3RpbnRvcyAodmllam86IHswfSwgbnVldm86IHsxfSkKK2pzcC5lcnJvci5wYWdlLmludmFsaWQuYnVmZmVyPURpcmVjdGl2YSBQYWdlOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgYnVmZmVyCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5hdXRvZmx1c2g9RGlyZWN0aXZhIFBhZ2U6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ2F1dG9GbHVzaCcgY29uIHZhbG9yZXMgZGlzdGludG9zICh2aWVqbzogezB9LCBudWV2bzogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5hdXRvZmx1c2g9PURpcmVjdGl2YSBQYWdlOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgYXV0b0ZsdXNoCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5pc3RocmVhZHNhZmU9RGlyZWN0aXZhIFBhZ2U6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ2lzVGhyZWFkU2FmZScgY29uIHZhbG9yZXMgZGlzdGludG9zICh2aWVqbzogezB9LCBudWV2bzogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5pc3RocmVhZHNhZmU9PURpcmVjdGl2YSBQYWdlOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgaXNUaHJlYWRTYWZlCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5pbmZvPURpcmVjdGl2YSBQYWdlOiBlcyBpbGVnYWwgdGVuZXIgbfpsdGlwbGVzIG9jdXJyZW5jaWFzIGRlICdpbmZvJyBjb24gdmFsb3JlcyBkaXN0aW50b3MgKHZpZWpvOiB7MH0sIG51ZXZvOiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmluZm89PURpcmVjdGl2YSBQYWdlOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgaW5mbworanNwLmVycm9yLnBhZ2UuY29uZmxpY3QuaXNlcnJvcnBhZ2U9RGlyZWN0aXZhIFBhZ2U6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ2lzRXJyb3JQYWdlJyBjb24gdmFsb3JlcyBkaXN0aW50b3MgKHZpZWpvOiB7MH0sIG51ZXZvOiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmlzZXJyb3JwYWdlPT1EaXJlY3RpdmEgUGFnZTogdmFsb3IgaW5jb3JyZWN0byBwYXJhIGlzRXJyb3JQYWdlCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5lcnJvcnBhZ2U9RGlyZWN0aXZhIFBhZ2U6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ2Vycm9yUGFnZScgY29uIHZhbG9yZXMgZGlzdGludG9zICh2aWVqbzogezB9LCBudWV2bzogezF9KQoranNwLmVycm9yLnBhZ2UuY29uZmxpY3QubGFuZ3VhZ2U9RGlyZWN0aXZhIFBhZ2U6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ2xhbmd1YWdlJyBjb24gdmFsb3JlcyBkaXN0aW50b3MgKHZpZWpvOiB7MH0sIG51ZXZvOiB7MX0pCitqc3AuZXJyb3IudGFnLmNvbmZsaWN0Lmxhbmd1YWdlPURpcmVjdGl2YSBUYWc6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ2xhbmd1YWdlJyBjb24gdmFsb3JlcyBkaXN0aW50b3MgKHZpZWpvOiB7MH0sIG51ZXZvOiB7MX0pCitqc3AuZXJyb3IucGFnZS5sYW5ndWFnZS5ub25qYXZhPURpcmVjdGl2YSBQYWdlOiBhdHJpYnV0byBsYW5ndWFnZSBpbmNvcnJlY3RvCitqc3AuZXJyb3IudGFnLmxhbmd1YWdlLm5vbmphdmE9RGlyZWN0aXZhIFRhZzogYXRyaWJ1dG8gbGFuZ3VhZ2UgaW5jb3JyZWN0bworanNwLmVycm9yLnBhZ2UuZGVmYWZ0ZXJ1c2FyLmxhbmd1YWdlPURpcmVjdGl2YSBQYWdlOiBObyBwdWVkZSBkZWZpbmlyIGxhbmd1YWdlIHRyYXMgdW4gc2NyaXB0bGV0IAoranNwLmVycm9yLnBhZ2Uubm9tYXBwaW5nLmxhbmd1YWdlPURpcmVjdGl2YSBQYWdlOiBObyBoYXkgbWFwZWFkbyBwYXJhIGxhbmd1YWdlOiAKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmV4dGVuZHM9RGlyZWN0aXZhIFBhZ2U6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ2V4dGVuZHMnIGNvbiB2YWxvcmVzIGRpc3RpbnRvcyAodmllam86IHswfSwgbnVldm86IHsxfSkKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmlzZWxpZ25vcmVkPURpcmVjdGl2YSBQYWdlOiBlcyBpbGVnYWwgdGVuZXIgbfpsdGlwbGVzIG9jdXJyZW5jaWFzIGRlICdpc0VMSWdub3JlZCcgY29uIHZhbG9yZXMgZGlzdGludG9zICh2aWVqbzogezB9LCBudWV2bzogezF9KQoranNwLmVycm9yLnRhZy5jb25mbGljdC5pc2VsaWdub3JlZD1EaXJlY3RpdmEgVGFnOiBlcyBpbGVnYWwgdGVuZXIgbfpsdGlwbGVzIG9jdXJyZW5jaWFzIGRlICdpc0VMSWdub3JlZCcgY29uIHZhbG9yZXMgZGlzdGludG9zICh2aWVqbzogezB9LCBudWV2bzogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5pc2VsaWdub3JlZD1EaXJlY3RpdmEgUGFnZTogdmFsb3IgaW524WxpZG8gcGFyYSBpc0VMSWdub3JlZAoranNwLmVycm9yLnRhZy5pbnZhbGlkLmlzZWxpZ25vcmVkPURpcmVjdGl2YSBUYWc6IHZhbG9yIGluY29ycmVjdG8gcGFyYSBpc0VMSWdub3JlZAoranNwLmVycm9yLnBhZ2UubXVsdGkucGFnZWVuY29kaW5nPUxhIGRpcmVjdGl2YSBQYWdlIG5vIGRlYmUgZGUgdGVuZXIgbfpsdGlwbGVzIG9jdXJyZW5jaWFzIGRlIHBhZ2VlbmNvZGluZworanNwLmVycm9yLnRhZy5jb25mbGljdC5hdHRyPURpcmVjdGl2YSBUYWc6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGVsIGF0cmlidXRvIFwiezB9XCIgY29uIHZhbG9yZXMgZGlzdGludG9zICh2aWVqbzogezF9LCBudWV2bzogezJ9KQoranNwLmVycm9yLnRhZy5tdWx0aS5wYWdlZW5jb2Rpbmc9TGEgZGlyZWN0aXZhIFRhZyBubyBkZWJlIGRlIHRlbmVyIG36bHRpcGxlcyBvY3VycmVuY2lhcyBkZSBwYWdlZW5jb2RpbmcKK2pzcC5lcnJvci5wYWdlLmJhZF9iX2FuZF9hX2NvbWJvPURpcmVjdGl2YSBQYWdlOiBDb21iaW5hY2nzbiBpbGVnYWwgZGUgYnVmZmVyPVwibm9uZVwiIHkgYXV0b0ZsdXNoPVwiZmFsc2VcIgoranNwLmVycm9yLm5vdC5pbXBsLnRhZ2xpYj1FcnJvciBJbnRlcm5vOiBUYWcgZXh0ZW5zaW9ucyBubyBpbXBsZW1lbnRhZG8KK2pzcC5lcnJvci5pbmNsdWRlLm1pc3NpbmcuZmlsZT1ObyB0aWVuZSBhcmd1bWVudG8gZGUgbm9tYnJlIGRlIGZpY2hlcm8gCitqc3AuZXJyb3IuaW5jbHVkZS5iYWQuZmlsZT1Bcmd1bWVudG8gZGUgbm9tYnJlIGRlIGZpY2hlcm8gbm8gduFsaWRvCitqc3AuZXJyb3IuaW5jbHVkZS5leGNlcHRpb249Tm8gc2UgcHVlZGUgaW5jbHVpciB7MH0KK2pzcC5lcnJvci5zdHJlYW0uY2xvc2VkPVN0cmVhbSBjZXJyYWRvCitqc3AuZXJyb3IuaW52YWxpZC5mb3J3YXJkPVRhZyBmb3J3YXJkIG5vIHbhbGlkbworanNwLmVycm9yLnVua25vd25FeGNlcHRpb249oUVycm9yIG5vIGNhdHVyYWRvIS4gRGViZXLtYXMgZGUgY29uc2lkZXJhciBlbCBwb25lciB1bmEgcOFnaW5hIGRlIGVycm9yIHBhcmEgYXZpc2FyIGRlIGxvcyBlcnJvcmVzIG3hcyBlbGVnYW50ZW1lbnRlCitqc3AuZXJyb3IuaW52YWxpZC5kaXJlY3RpdmU9RGlyZWN0aXZhIG5vIHbhbGlkYQoranNwLmVycm9yLmRpcmVjdGl2ZS5pc3RhZ2ZpbGU9TGEgRGlyZWN0aXZhIHswfSBubyBwdWVkZSB1c2Fyc2UgZW4gYXJjaGl2byBkZSB0YWcKK2pzcC5lcnJvci5kaXJlY3RpdmUuaXNub3R0YWdmaWxlPUxhIERpcmVjdGl2YSB7MH0gc/NsbyBzZSBwdWVkZSB1c2FyIGVuIHVuIGFyY2hpdm8gZGUgdGFnCitqc3AuZXJyb3IudGFnZmlsZS50bGQubmFtZT1FbCBhdHJpYnV0byBcIm5hbWVcIiBkZSBsYSBkaXJlY3RpdmEgdGFnIHRpZW5lIHVuIHZhbG9yIHswfSBtaWVudHJhcyBxdWUgZWwgdGFnIFwibmFtZVwiIGRlbCBlbGVtZW50byBcInRhZy1maWxlXCIgZW4gZWwgVExEIGVzIHsxfQoranNwLmVycm9yLmFjdGlvbi5pc3RhZ2ZpbGU9TGEgYWNjafNuIHswfSBubyBzZSBwdWVkZSB1c2FyIGVuIHVuIGFyY2hpdm8gdGFnCitqc3AuZXJyb3IuYWN0aW9uLmlzbm90dGFnZmlsZT1MYSBhY2Np824gezB9IHPzbG8gc2UgcHVlZGUgdXNhciBlbiBhcmNoaXZvcyB0YWcKK2pzcC5lcnJvci51bnRlcm1pbmF0ZWQ9VGFnIHswfSBubyB0ZXJtaW5hZG8KK2pzcC5lcnJvci51c2ViZWFuLm5vdGluc2FtZWZpbGU9RWwgVGFnIHVzZUJlYW4gZGViZSBkZSBlbXBlemFyIHkgdGVybWluYXIgZW4gZWwgbWlzbW8gYXJjaGl2byBm7XNpY28KK2pzcC5lcnJvci5sb2FkY2xhc3MudGFnaGFuZGxlcj1ObyBzZSBwdWVkZSBjYXJnYXIgbGEgY2xhc2UgezB9Citqc3AuZXJyb3IudW5hYmxlLmNvbXBpbGU9Tm8gc2UgcHVlZGUgY29tcGlsYXIgbGEgY2xhc2UgcGFyYSBKU1AKK2pzcC5lcnJvci51bmFibGUubG9hZD1ObyBzZSBwdWVkZSBjYXJnYXIgbGEgY2xhc2UgcGFyYSBKU1AKK2pzcC5lcnJvci51bmFibGUucmVuYW1lPU5vIHNlIHB1ZWRlIHJlbm9tYnJhciBlbCBhcmNoaXZvIGRlIGNsYXNlIHswfSBhIHsxfQoranNwLmVycm9yLm1hbmRhdG9yeS5hdHJpYnV0bz17MH06IGF0cmlidXRvIG9ibGlnYXRvcmlvIHsxfSBwZXJkaWRvCitqc3AuZW5naW5lLmluZm89TW90b3IgSmFzcGVyIEpTUCAyLjAKK2pzcC5lcnJvci5pbnZhbGlkLmV4cHJlc3Npb249InswfSIgY29udGllbmUgZXhwcmVzaW9uZXMgaW5jb3JyZWN0YXM6IHsxfQoranNwLmVycm9yLmludmFsaWQuYXR0cmlidXRlPXswfTogQXRyaWJ1dG8gaW5jb3JyZWN0bywgezF9Citqc3AuZXJyb3IudXNlYmVhbi5jbGFzcy5ub3Rmb3VuZD1DbGFzZTogezB9IG5vIGhhbGxhZGEKK2pzcC5lcnJvci5maWxlLmNhbm5vdC5yZWFkPU5vIHNlIHB1ZWRlIGxlZXIgZWwgYXJjaGl2bzogezB9Citqc3AuZXJyb3IuZmlsZS5hbHJlYWR5LnJlZ2lzdGVyZWQ9RWwgYXJjaGl2byB7MH0geWEgc2UgaGEgdmlzdG8sIL9wb2Ry7WEgc2VyIHVuIGluY2x1ZGUgcmVjdXJzaXZvPworanNwLmVycm9yLmZpbGUubm90LnJlZ2lzdGVyZWQ9QXJjaGl2byB7MH0gbm90IHZpc3RvIGVuIGluY2x1ZGUKK2pzcC5lcnJvci5xdW90ZXMudW50ZXJtaW5hdGVkPUNvbWlsbGFzIG5vIHRlcm1pbmFkYXMKK2pzcC5lcnJvci5hdHRyLnF1b3RlZD1FbCB2YWxvciBkZWwgYXRyaWJ1dG8gZGViZXLtYSBpciBlbnRyZSBjb21pbGxhcworanNwLmVycm9yLmF0dHIubm92YWx1ZT1BdHJpYnV0byB7MH0gbm8gdGllbmUgdmFsb3IKK2pzcC5lcnJvci50YWcuYXR0ci51bnRlcm1pbmF0ZWQ9TGlzdGEgZGUgYXRyaWJ1dG9zIGRlbCB0YWcgbm8gdGVybWluYWRhCitqc3AuZXJyb3IucGFyYW0ubm9uYW1lPU5vIGhheSBub21icmUgZW4gZWwgdGFnIFBBUkFNCitqc3AuZXJyb3IucGFyYW0ubm92YWx1ZT1ObyBoYXkgdmFsb3IgZW4gZWwgdGFnIFBBUkFNCitqc3AuZXJyb3IuYmVhbnMubnVsbGJlYW49U2UgaGEgaW50ZW50YWRvIHVuYSBvcGVyYWNp824gZGUgYmVhbiBlbiB1biBvYmpldG8gbnVsbworanNwLmVycm9yLmJlYW5zLm5vYmVhbmluZm89Tm8gc2UgcHVlZGUgZW5jb250cmFyIEJlYW5JbmZvIHBhcmEgZWwgYmVhbiAgJyd7MH0nJyBzZWd1cmFtZW50ZSBsYSBjbGFzZSBubyBleGlzdGUKK2pzcC5lcnJvci5iZWFucy5pbnRyb3NwZWN0aW9uPVVuYSBleGNlcGNp824gaGEgdGVuaWRvIGx1Z2FyIG1pZW50cmFzIHNlIGxl7WEgZWwgbel0b2RvIGRlIGxlY3R1cmEgZGUgbGEgcHJvcGllZGFkICcnezB9JycgZW4gdW4gYmVhbiBkZWwgdGlwbyAnJ3sxfScnOlxuezJ9Citqc3AuZXJyb3IuYmVhbnMubm9tZXRob2Q9Tm8gcHVlZG8gZW5jb250cmFyIHVuIG3pdG9kbyBwYXJhIGxlZXIgbGEgcHJvcGllZGFkICcnezB9JycgZW4gdW4gYmVhbiBkZWwgdGlwbyAnJ3sxfScnCitqc3AuZXJyb3IuYmVhbnMubm9tZXRob2Quc2V0cHJvcGVydHk9Tm8gcHVlZG8gZW5jb250cmFyIHVuIG3pdG9kbyBwYXJhIGVzY3JpYmlyIGxhIHByb3BpZWRhZCAnJ3swfScnIGVuIHVuIGJlYW4gZGVsIHRpcG8gJyd7Mn0nJworanNwLmVycm9yLmJlYW5zLm5vcHJvcGVydHk9Tm8gcHVlZG8gZW5jb250cmFyIGluZm9ybWFjafNuIGRlIGxhIHByb3BpZWRhZCAnJ3swfScnIGVuIHVuIGJlYW4gZGVsIHRpcG8gJyd7MX0nJworanNwLmVycm9yLmJlYW5zLnNldHByb3BlcnR5Lm5vaW5kZXhzZXQ9Tm8gcHVlZG8gcG9uZXIgbGEgcHJvcGllZGFkIGluZGV4YWRhCitqc3AuZXJyb3IuaW5jbHVkZS50YWc9VGFnIGpzcDppbmNsdWRlIG5vIHbhbGlkbworanNwLmVycm9yLmluY2x1ZGUubm9mbHVzaD1qc3A6aW5jbHVkZSBuZWNlc2l0YSB0ZW5lciBcImZsdXNoPXRydWVcIgoranNwLmVycm9yLmluY2x1ZGUuYmFkZmx1c2g9anNwOmluY2x1ZGUgcGFnZT1cIi4uLlwiIGZsdXNoPVwidHJ1ZVwiIGVzIGxhIPpuaWNhIGNvbWJpbmFjafNuIHbhbGlkYSBlbiBKU1AgMS4wCitqc3AuZXJyb3IuYXR0ZW1wdF90b19jbGVhcl9mbHVzaGVkX2J1ZmZlcj1FcnJvcjogU2UgaGEgaW50ZW50YWRvIGxpbXBpYXIgdW4gYnVmZmVyIHF1ZSB5YSBoYWLtYSBzaWRvIGVzY3JpdG8KK2pzcC5lcnJvci5vdmVyZmxvdz1FcnJvcjpCdWZmZXIgZGUgSlNQIGRlc2JvcmRhZG8KK2pzcC5lcnJvci5wYXJhbWV4cGVjdGVkPUVsIHRhZyBcInBhcmFtXCIgZXJhIGVzcGVyYWRvIGNvbiBsb3MgYXRyaWJ1dG9zIFwibmFtZVwiIHkgXCJ2YWx1ZVwiIGRlc3B16XMgZGVsIHRhZyBcInBhcmFtc1wiLgoranNwLmVycm9yLnBhcmFtLmludmFsaWRVc2U9TGEgYWNjafNuIGpzcDpwYXJhbSBubyBkZWJlIGRlIHNlciB1c2FkYSBmdWVyYSBkZSBsb3MgZWxlbWVudG9zIGpzcDppbmNsdWRlLCBqc3A6Zm9yd2FyZCBvIGpzcDpwYXJhbXMKK2pzcC5lcnJvci5wYXJhbXMuaW52YWxpZFVzZT1qc3A6cGFyYW1zIGRlYmUgZGUgc2VyIHVuIGhpam8gZGlyZWN0byBkZSBqc3A6cGx1Z2luCitqc3AuZXJyb3IuZmFsbGJhY2suaW52YWxpZFVzZT1qc3A6ZmFsbGJhY2sgZGViZSBkZSBzZXIgdW4gaGlqbyBkaXJlY3RvIGRlIGpzcDpwbHVnaW4KK2pzcC5lcnJvci5uYW1lZEF0dHJpYnV0ZS5pbnZhbGlkVXNlPWpzcDphdHRyaWJ1dGUgZGViZSBkZSBzZXIgZWwgc3ViZWxlbWVudG8gZGUgdW5hIGFjY2nzbiBlc3ThbmRhciBvIGRlIGNsaWVudGUKK2pzcC5lcnJvci5qc3Bib2R5LmludmFsaWRVc2U9anNwOmJvZHkgZGViZSBkZSBzZXIgZWwgc3ViZWxlbWVudG8gZGUgdW5hIGFjY2nzbiBlc3ThbmRhciBvIGRlIGNsaWVudGUKK2pzcC5lcnJvci5jbG9zZWluZGl2aWR1YWxwYXJhbT1FbCB0YWcgcGFyYW0gbmVjZXNpdGEgc2VyIGNlcnJhZG8gY29uIFwiLz5cIgoranNwLmVycm9yLmNsb3NlcGFyYW1zPUVsIHRhZyBwYXJhbSBuZWNlc2l0YSBzZXIgY2VycmFkbyBjb24gL3BhcmFtcworanNwLmVycm9yLnBhcmFtcy5lbXB0eUJvZHk9anNwOnBhcmFtcyBkZWJlIGRlIGNvbnRlbmVyIGFsIG1lbm9zIHVuIGpzcDpwYXJhbSBhbmlkYWRvCitqc3AuZXJyb3IucGFyYW1zLmlsbGVnYWxDaGlsZD1qc3A6cGFyYW1zIG5vIGRlYmUgZGUgY29udGVuZXIgZWxlbWVudG9zIGFuaWRhZG9zIHF1ZSBubyBzZWFuIGpzcDpwYXJhbQoranNwLmVycm9yLnBsdWdpbi5ub3R5cGU9VGlwbyBubyBkZWNsYXJhZG8gZW4ganNwOnBsdWdpbgoranNwLmVycm9yLnBsdWdpbi5iYWR0eXBlPVZhbG9yIGlsZWdhbCBwYXJhIGF0cmlidXRvICd0eXBlJyBlbiBqc3A6cGx1Z2luOiBkZWJlIGRlIHNlciAnYmVhbicgbyAnYXBwbGV0JworanNwLmVycm9yLnBsdWdpbi5ub2NvZGU9Q/NkaWdvIG5vIGRlY2xhcmFkbyBlbiBqc3A6cGx1Z2luCitqc3AuZXJyb3IuaXNlX29uX2NsZWFyPUVzIGlsZWdhbCB1c2FyIGNsZWFyKCkgY3VhbmRvIGVsIHRhbWHxbyBkZWwgYnVmZmVyIGVzIGNlcm8KK2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5iZWFuTm90Rm91bmQ9c2V0UHJvcGVydHk6IEJlYW4gezB9IG5vIGVuY29udHJhZG8KK2pzcC5lcnJvci5nZXRwcm9wZXJ0eS5iZWFuTm90Rm91bmQ9Z2V0UHJvcGVydHk6IEJlYW4gezB9IG5vIGVuY29udHJhZG8KK2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5DbGFzc05vdEZvdW5kPXNldFByb3BlcnR5OiBjbGFzZSB7MH0gbm8gZW5jb250cmFkYQorIyB0eXBvID8KKyNqc3AuZXJyb3Iuc2V0cHJvcGVydHkuaW52YWxpZFNheW50YXg9c2V0UHJvcGVydHk6IGNhbid0IGhhdmUgbm9uLW51bGwgdmFsdWUgd2hlbiBwcm9wZXJ0eT0qCitqc3AuZXJyb3Iuc2V0cHJvcGVydHkuaW52YWxpZFN5YW50YXg9c2V0UHJvcGVydHk6IE5vIHB1ZWRlIGhhYmVyIHVuIHZhbG9yIG5vIG51bG8gY3VhbmRvIHNlIGhhIGVzcGVjaWZpY2FkbyBwcm9wZXJ0eT0qCitqc3AuZXJyb3Iuc2V0cHJvcGVydHkuYmVhbkluZm9Ob3RGb3VuZD1zZXRwcm9wZXJ0eTogYmVhbkluZm8gcGFyYSBiZWFuIHswfSBubyBlbmNvbnRyYWRvCitqc3AuZXJyb3Iuc2V0cHJvcGVydHkucGFyYW1PclZhbHVlPXNldFByb3BlcnR5OiBPIHBhcmFtIG8gdmFsdWUgcHVlZGVuIGVzdGFyIHByZXNlbnRlcworanNwLmVycm9yLnNldHByb3BlcnR5LmFycmF5VmFsPXNldFByb3BlcnR5OiBObyBwdWVkZSBlc2NyaWJpciBlbiBsYSBwcm9waWVkYWQgZGUgYXJyYXkgezB9IGEgdHJhdulzIGRlIHVuYSB2YWxvciBkZSBjYWRlbmEgbGl0ZXJhbAoranNwLndhcm5pbmcua2VlcGdlbj1BdmlzbzogdmFsb3IgaW5jb3JyZWN0byBwYXJhIGVsIGluaXRQYXJhbSBrZWVwZ2VuLiBTZSB1c2Fy4SBlbCB2YWxvciBwb3IgZGVmZWN0byBkZSBcImZhbHNlXCIKK2pzcC53YXJuaW5nLnhwb3dlcmVkQnk9QXZpc286IHZhbG9yIGluY29ycmVjdG8gcGFyYSBlbCBpbml0UGFyYW0geHBvd2VyZWRCeS4gU2UgdXNhcuEgZWwgdmFsb3IgcG9yIGRlZmVjdG8gZGUgXCJmYWxzZVwiCitqc3Aud2FybmluZy5lbmFibGVQb29saW5nPUF2aXNvOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgZWwgaW5pdFBhcmFtIGVuYWJsZVBvb2xpbmcuIFNlIHVzYXLhIGVsIHZhbG9yIHBvciBkZWZlY3RvIGRlIFwidHJ1ZVwiCitqc3Aud2FybmluZy5pbnZhbGlkVGFnUG9vbFNpemU9QXZpc286IHZhbG9yIGluY29ycmVjdG8gcGFyYSBlbCBwYXLhbWV0cm8gaW5pdCBsbGFtYWRvIHRhZ1Bvb2xTaXplLiBTZSB1c2Fy4SBsYSBtZWRpZGEgcG9yIGRlZmVjdG8gZGUgezB9Citqc3Aud2FybmluZy5tYXBwZWRGaWxlPUF2aXNvOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgZWwgaW5pdFBhcmFtIG1hcHBlZEZpbGUuIFNlIHVzYXLhIGVsIHZhbG9yIHBvciBkZWZlY3RvIGRlIFwiZmFsc2VcIgoranNwLndhcm5pbmcuc2VuZEVyclRvQ2xpZW50PUF2aXNvOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgZWwgaW5pdFBhcmFtIHNlbmRFcnJUb0NsaWVudC4gU2UgdXNhcuEgZWwgdmFsb3IgcG9yIGRlZmVjdG8gZGUgXCJmYWxzZVwiCitqc3Aud2FybmluZy5jbGFzc0RlYnVnSW5mbz1BdmlzbzogdmFsb3IgaW5jb3JyZWN0byBwYXJhIGVsIGluaXRQYXJhbSBjbGFzc2RlYnVnaW5mby4gU2UgdXNhcuEgZWwgdmFsb3IgcG9yIGRlZmVjdG8gZGUgXCJmYWxzZVwiCitqc3Aud2FybmluZy5jaGVja0ludGVydmFsPUF2aXNvOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgZWwgaW5pdFBhcmFtIGNoZWNrSW50ZXJ2YWwuIFNlIHVzYXLhIGVsIHZhbG9yIHBvciBkZWZlY3RvIGRlIFwiMzAwXCIgc2VndW5kb3MKK2pzcC53YXJuaW5nLmRldmVsb3BtZW50PUF2aXNvOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgZWwgaW5pdFBhcmFtIGRldmVsb3BtZW50LiBTZSB1c2Fy4SBlbCB2YWxvciBwb3IgZGVmZWN0byBkZSBcInRydWVcIgoranNwLndhcm5pbmcuZm9yaz1BdmlzbzogdmFsb3IgaW5jb3JyZWN0byBwYXJhIGVsIGluaXRQYXJhbSBmb3JrLiBTZSB1c2Fy4SBlbCB2YWxvciBwb3IgZGVmZWN0byBkZSBcInRydWVcIgoranNwLndhcm5pbmcucmVsb2FkaW5nPUF2aXNvOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgZWwgaW5pdFBhcmFtIHJlbG9hZGluZy4gU2UgdXNhcuEgZWwgdmFsb3IgcG9yIGRlZmVjdG8gZGUgXCJ0cnVlXCIKK2pzcC53YXJuaW5nLmR1bXBTbWFwPUF2aXNvOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgZWwgaW5pdFBhcmFtIGR1bXBTbWFwLiBTZSB1c2Fy4SBlbCB2YWxvciBwb3IgZGVmZWN0byBkZSBcImZhbHNlXCIKK2pzcC53YXJuaW5nLmdlbmNoYXJhcnJheT1BdmlzbzogdmFsb3IgaW5jb3JyZWN0byBwYXJhIGVsIGluaXRQYXJhbSBnZW5TdHJBc0NoYXJBcnJheS4gU2UgdXNhcuEgZWwgdmFsb3IgcG9yIGRlZmVjdG8gZGUgXCJmYWxzZVwiCitqc3Aud2FybmluZy5zdXBwcmVzc1NtYXA9QXZpc286IHZhbG9yIGluY29ycmVjdG8gcGFyYSBlbCBpbml0UGFyYW0gc3VwcHJlc3NTbWFwLiBTZSB1c2Fy4SBlbCB2YWxvciBwb3IgZGVmZWN0byBkZSBcImZhbHNlXCIKK2pzcC5lcnJvci5iYWR0YWdsaWI9Tm8gc2UgcHVlZGUgYWJyaXIgbGEgYmlibGlvdGVjYSBkZSB0YWdzIHswfTogezF9Citqc3AuZXJyb3IuYmFkR2V0UmVhZGVyPU5vIHNlIHB1ZWRlIGNyZWFyIHVuIHJlYWRlciBjdWFuZG8gZWwgc3RyZWFtIG5vIHRpZW5lIGJ1ZmZlcgoranNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLnRhZ2xpYj1FbGVtZW50byBkZXNjb25vY2lkbyAoezB9KSBlbiB0YWdsaWIKK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi50YWc9RWxlbWVudG8gZGVzY29ub2NpZG8gKHswfSkgZW4gdGFnCitqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4udGFnZmlsZT1FbGVtZW50byBkZXNjb25vY2lkbyAoezB9KSBlbiB0YWctZmlsZQoranNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLmF0dHJpYnV0ZT1FbGVtZW50byBkZXNjb25vY2lkbyAoezB9KSBlbiBhdHRyaWJ1dGUKK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi52YXJpYWJsZT1FbGVtZW50byBkZXNjb25vY2lkbyAoezB9KSBlbiB2YXJpYWJsZQoranNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLnZhbGlkYXRvcj1FbGVtZW50byBkZXNjb25vY2lkbyAoezB9KSBlbiB2YWxpZGF0b3IKK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi5pbml0UGFyYW09RWxlbWVudG8gZGVzY29ub2NpZG8gKHswfSkgZW4gaW5pdC1wYXJhbSBkZSB2YWxpZGF0b3IKK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi5mdW5jdGlvbj1FbGVtZW50byBkZXNjb25vY2lkbyAoezB9KSBlbiBmdW5jdGlvbgoranNwLmVycm9yLm1vcmUudGhhbi5vbmUudGFnbGliPU3hcyBkZSB1bmEgYmlibGlvdGVjYSBkZSB0YWdzIGVuIGVsIFRMRDogezB9Citqc3AuZXJyb3IudGVpY2xhc3MuaW5zdGFudGlhdGlvbj1ObyBzZSBwdWVkZSBjYXJnYXIgbGEgY2xhc2UgVGFnRXh0cmFJbmZvIGxsYW1hZGE6IHswfQoranNwLmVycm9yLm5vbl9udWxsX3RlaV9hbmRfdmFyX3N1YmVsZW1zPVRhZyB7MH0gdGllbmUgdW5vIG8gbeFzIHN1YmVsZW1lbnRvcyB2YXJpYWJsZSB5IHVuYSBjbGFzZSBUYWdFeHRyYUluZm8gcXVlIGRldnVlbHZlIHVuYSBvIG3hcyBWYXJpYWJsZUluZm8KK2pzcC5lcnJvci5wYXJzZS5lcnJvci5pbi5UTEQ9RXJyb3IgZGUgYW7hbGlzaXMgZW4gZWwgZGVzY3JpcHRvciBkZSBiaWJsaW90ZWNhIGRlIHRhZ3M6IHswfQoranNwLmVycm9yLnVuYWJsZS50by5vcGVuLlRMRD1ObyBzZSBwdWVkZSBhYnJpciBlbCBkZXNjcmlwdG9yIGRlIGJpYmxpb3RlY2EgZGUgdGFnczogezB9Citqc3AuYnVmZmVyLnNpemUuemVybz1UYW1h8W8gZGUgYnVmZmVyIDw9IDAKK2pzcC5lcnJvci5maWxlLm5vdC5mb3VuZD1BcmNoaXZvIEpTUCBcInswfVwiIG5vIGVuY29udHJhZG8KK2pzcC5tZXNzYWdlLmNvcHlpbmd1cmk9Q29waWFuZG8gezB9IGVuIHsxfQoranNwLm1lc3NhZ2UuaHRtbGNvbW1lbnQ9XG5RdWl0YW5kbyBjb21lbnRhcmlvOiBcdHswfQoranNwLm1lc3NhZ2UuaGFuZGxpbmdfZGlyZWN0aXZlPVxuUmVzb2x2aWVuZG8gZGlyZWN0aXZhOiB7MH1cdHsxfQoranNwLm1lc3NhZ2UuaGFuZGxpbmdfcGx1Z2luPVxuUGx1Z2luOiB7MH0KK2pzcC5tZXNzYWdlLnBhY2thZ2VfbmFtZV9pcz1FbCBOb21icmUgZGVsIFBhY2thZ2UgZXM6IHswfQoranNwLm1lc3NhZ2UuY2xhc3NfbmFtZV9pcz1FbCBOb21icmUgZGUgbGEgY2xhc2UgZXM6IHswfQoranNwLm1lc3NhZ2UuamF2YV9maWxlX25hbWVfaXM9RWwgTm9tYnJlIGRlbCBBcmNoaXZvIEphdmEgZXM6IHswfQoranNwLm1lc3NhZ2UuY2xhc3NfZmlsZV9uYW1lX2lzPUVsIE5vbWJyZSBkZWwgQXJjaGl2byBkZSBjbGFzZSBlczogezB9Citqc3AubWVzc2FnZS5hY2NlcHRlZD1BY2VwdPMgezB9IGVuIHsxfQoranNwLm1lc3NhZ2UuYWRkaW5nX2phcj1B8WFkaWVuZG8gamFyIHswfSBhIG1pIGNsYXNzcGF0aAoranNwLm1lc3NhZ2UuY29tcGlsaW5nX3dpdGg9Q29tcGlsYWRvIGNvbjogezB9Citqc3AubWVzc2FnZS50ZW1wbGF0ZV90ZXh0PXRleHRvIHBsYW50aWxsYQoranNwLmVycm9yLm1pc3NpbmdfYXR0cmlidXRlPURlIGFjdWVyZG8gY29uIGVsIFRMRCBlbCBhdHJpYnV0byB7MH0gZXMgb2JsaWdhdG9yaW8gcGFyYSBlbCB0YWcgezF9Citqc3AuZXJyb3IuYmFkX2F0dHJpYnV0ZT1FbCBhdHJpYnV0byB7MH0gbm8gZXMgduFsaWRvIHNlZ/puIGVsIFRMRCBlc3BlY2lmaWNhZG8KK2pzcC5lcnJvci50bGQudW5hYmxlX3RvX3JlYWQ9SW1wb3NpYmxlIGRlIGxlZXIgVExEIFwiezF9XCIgZGVzZGUgYXJjaGl2byBKQVIgXCJ7MH1cIjogezJ9Citqc3AuZXJyb3IudGxkLnVuYWJsZV90b19nZXRfamFyPUltcG9zaWJsZSBvYnRlbmVyIHJlY3Vyc28gSkFSIFwiezB9XCIgY29udGVuaWVuZG8gVExEOiB7MX0KK2pzcC5lcnJvci50bGQubWlzc2luZ19qYXI9RmFsdGEgcmVjdXJzbyBKQVIgXCJ7MH1cIiBjb250ZW5pZW5kbyBUTEQKK2pzcC5lcnJvci53ZWJ4bWxfbm90X2ZvdW5kPU5vIHB1ZWRvIGxvY2FsaXphciB3ZWIueG1sCitqc3AuY21kX2xpbmUudXNhZ2U9VXNvOiBqc3B0b3NlcnZsZXQgWy1kZCA8cnV0YS9hL0RpcmVjdG9yaW9TYWxpZGE+XSBbLWtlZXBnZW5lcmF0ZWRdIDxBcmNoaXZvcyAuanNwPgoranNwLm1lc3NhZ2UuY3BfaXM9Q2xhc3NwYXRoIHswfSBlczogezF9Citqc3AuZXJyb3IudW5hYmxlLnRvX2xvYWRfdGFnaGFuZGxlcl9jbGFzcz1ObyBzZSBwdWVkZSBjYXJnYXIgY2xhc2UgbWFuZWphZG9yYSB7MH0gZGVsIHRhZyBhIGNhdXNhIGRlIHsxfQoranNwLmVycm9yLnVuYWJsZS50b19maW5kX21ldGhvZD1ObyBzZSBwdWVkZSBlbmNvbnRyYXIgZWwgbel0b2RvIGRlIGVzY3JpdHVyYSBwYXJhIGVsIGF0cmlidXRvOiB7MH0KK2pzcC5lcnJvci51bmFibGUudG9fY29udmVydF9zdHJpbmc9Tm8gcHVkZSBjb252ZXJ0aXIgdW4gU3RyaW5nIGEgezB9IHBhcmEgYXRyaWJ1dG8gezF9Citqc3AuZXJyb3IudW5hYmxlLnRvX2ludHJvc3BlY3Q9Tm8gc2UgcHVlZGUgaGFjZXIgaW50cm9zcGVjY2nzbiBlbiBtYW5lamFkb3IgZGUgdGFnIGNsYXNlOiB7MH0gYSBjYXVzYSBkZSB7MX0KK2pzcC5lcnJvci5iYWRfdGFnPU5vIGV4aXN0ZSBlbCB0YWcgezB9IGVuIGxhIGJpYmxpb3RlY2EgaW1wb3J0YWRhIGNvbiBwcmVmaWpvIHsxfQoranNwLmVycm9yLnhtbC5iYWRfdGFnPU5vIHNlIGhhIGRlZmluaWRvIGVsIHRhZyBcInswfVwiIGVuIGxhIGJpYmxpb3RlY2EgdGFnIGFzb2NpYWRhIGNvbiB1cmkgXCJ7MX1cIgoranNwLmVycm9yLmJhZF9zdHJpbmdfQ2hhcmFjdGVyPU5vIHB1ZWRlIGV4dHJhZXIgdW4gQ2hhcmFjdGVyIGRlc2RlIHVuIGFycmF5IGRlIHRhbWHxbyBjZXJvCitqc3AuZXJyb3IuYmFkX3N0cmluZ19jaGFyPU5vIHB1ZWRlIGV4dHJhZXIgdW4gY2hhciBkZXNkZSB1biBhcnJheSBkZSB0YW1h8W8gY2VybworanNwLndhcm5pbmcuY29tcGlsZXIuY2xhc3MuY2FudGNyZWF0ZT1ObyBwdWVkbyBjcmVhciB1bmEgaW5zdGFuY2lhIGRlIGxhIGNsYXNlIGVzcGVjaWZpY2FkYSB7MH0gZGUgcGx1Z2luIGRlbCBjb21waWxhZG9yIGRlYmlkbyBhIHsxfS4gU2UgdXNhcuEgZWwgY29tcGlsYWRvciBKYXZhIGRlIFN1bi4KK2pzcC53YXJuaW5nLmNvbXBpbGVyLmNsYXNzLm5vdGZvdW5kPU5vIHB1ZWRvIGVuY29udHJhciB1bmEgaW5zdGFuY2lhIGRlIGxhIGNsYXNlIHswfSBkZSBwbHVnaW4gZGUgY29tcGlsYWRvci4gU2UgdXNhcuEgZWwgY29tcGlsYWRvciBkZWwgSmF2YSBkZSBTdW4uCitqc3Aud2FybmluZy5jb21waWxlci5wYXRoLm5vdGZvdW5kPVRyYXllY3RvcmlhIGRlbCBjb21waWxhZG9yIGVzcGVjaWZpY2FkbyB7MH0gbm8gZW5jb250cmFkYS4gU2UgdXNhcuEgZWwgUEFUSCBkZWwgc2lzdGVtYS4KK2pzcC5lcnJvci5qc3BjLnVyaXJvb3Rfbm90X2Rpcj1MYSBvcGNp824gLXVyaXJvb3QgZGViZSBkZSBlc3BlY2lmaWNhciB1biBkaXJlY3RvcmlvIHlhIGV4aXN0ZW50ZQoranNwLmVycm9yLmpzcGMubWlzc2luZ1RhcmdldD1GYWx0YSB0YXJnZXQ6IERlYmUgZGUgZXNwZWNpZmljYXIgLXdlYmFwcCBvIC11cmlyb290IG8gdW5hIG8gbeFzIHDhZ2luYXMgSlNQCitqc3AuZXJyb3IuanNwYy5ub191cmlyb290PU5vIHNlIGhhIGVzcGVjaWZpY2FkbyB1cmlyb290IHkgbm8gcHVlZGUgc2VyIGxvY2FsaXphZG8gZW4gbG9zIGFyY2hpdm9zIEpTUCBlc3BlY2lmaWNhZG9zCitqc3BjLmltcGxpY2l0LnVyaVJvb3Q9dXJpUm9vdCBpbXBsaWNpdGFtZW50ZSBwdWVzdG8gYSAiezB9IgoranNwYy51c2FnZT1Vc286IGpzcGMgPG9wY2lvbmVzPiBbLS1dIDxBcmNoaXZvcyBKU1A+XG5cCitkb25kZSA8QXJjaGl2b3MgSlNQPiBzb246XG5cCitcICAgIC13ZWJhcHAgPGRpcj4gICAgICBVbiBkaXJlY3RvcmlvIGNvbnRlbmllbmRvIHVuYSB3ZWItYXBwLiBUb2RhcyBsYXNcblwKK1wgICAgICAgICAgICAgICAgICAgICAgIHDhZ2luYXMganNwIHNlcuFuIGNvbXBpbGFkYXMgcmVjdXJzaXZhbWVudGVcblwKK28gY3VhbHF1aWVyIG76bWVybyBkZVxuXAorXCAgICA8QXJjaGl2bz4gICAgICAgICAgVW4gQXJjaGl2byBwYXJhIHNlciBpbnRlcnByZXRhZG8gY29tbyB1bmEgcOFnaW5hIGpzcFxuXAoreSBkb25kZSA8b3BjaW9uZXM+IGluY2x1eWVuOlxuXAorXCAgICAtaGVscCAgICAgICAgICAgICAgTXVlc3RyYSBlc3RlIG1lbnNhamUgZGUgYXl1ZGFcblwKK1wgICAgLXYgICAgICAgICAgICAgICAgIE1vZG8gZGV0YWxsYWRvXG5cCitcICAgIC1kIDxkaXI+ICAgICAgICAgICBEaXJlY3RvcmlvIGRlIHNhbGlkYVxuXAorXCAgICAtbCAgICAgICAgICAgICAgICAgTXVlc3RyYSBlbCBub21icmUgZGUgbGEgcOFnaW5hIEpTUCBhbCBvY3VycmlyIHVuIGZhbGxvXG5cCitcICAgIC1zICAgICAgICAgICAgICAgICBNdWVzdHJhIGVsIG5vbWJyZSBkZSBsYSBw4WdpbmEgSlNQIGFsIHRlbmVyIOl4aXRvXG5cCitcICAgIC1wIDxuYW1lPiAgICAgICAgICBOb21icmUgZGVsIHBhY2thZ2Ugb2JqZXRpdm9cblwKK1wgICAgICAgICAgICAgICAgICAgICAgIChwb3IgZGVmZWN0byBvcmcuYXBhY2hlLmpzcClcblwKK1wgICAgLWMgPG5hbWU+ICAgICAgICAgIE5vbWJyZSBkZSBsYSBjbGFzZSBvYmpldGl2b1xuXAorXCAgICAgICAgICAgICAgICAgICAgICAgKHPzbG8gc2UgYXBsaWNhIGEgbGEgcHJpbWVyYSBw4WdpbmEgSlNQKVxuXAorXCAgICAtbWFwcGVkICAgICAgICAgICAgR2VuZXJhIGxsYW1hZGFzIHNlcGFyYWRhcyBhIHdyaXRlKCkgcGFyYSBjYWRhIGztbmVhIGRlXG5cCitcICAgICAgICAgICAgICAgICAgICAgICBIVE1MIGVuIGVsIEpTUFxuXAorXCAgICAtZGllWyNdICAgICAgICAgICAgR2VuZXJhIHVuIGPzZGlnbyBkZSByZXRvcm5vIGRlIGVycm9yICgjKSBlbiBlcnJvcmVzXG5cCitcICAgICAgICAgICAgICAgICAgICAgICBmYXRhbGVzLiAocG9yIGRlZmVjdG8gMSkuXG5cCitcICAgIC11cmliYXNlIDxkaXI+ICAgICBFbCBkaXJlY3RvcmlvIHVyaSBkZSBkb25kZSBkZWJlbiBkZSBwYXJ0aXIgbGFzXG5cCitcICAgICAgICAgICAgICAgICAgICAgICBjb21waWxhY2lvbmVzLiAocG9yIGRlZmVjdG8gIi8iKVxuXAorXCAgICAtdXJpcm9vdCA8ZGlyPiAgICAgSWd1YWwgcXVlIC13ZWJhcHBcblwKK1wgICAgLWNvbXBpbGUgICAgICAgICAgIENvbXBpbGEgbG9zIHNlcnZsZXRzIGdlbmVyYWRvc1xuXAorXCAgICAtd2ViaW5jIDxmaWxlPiAgICAgQ3JlYSB1bm9zIG1hcGVvcyBwYXJjaWFsZXMgZGUgc2VydmxldCBlbiBlbCBhcmNoaXZvXG5cCitcICAgIC13ZWJ4bWwgPGZpbGU+ICAgICBDcmVhIHVuIHdlYi54bWwgY29tcGxldG8gZW4gZWwgYXJjaGl2by5cblwKK1wgICAgLWllcGx1Z2luIDxjbHNpZD4gIEphdmEgUGx1Z2luIGNsYXNzaWQgcGFyYSBJbnRlcm5ldCBFeHBsb3JlclxuXAorXCAgICAtY2xhc3NwYXRoIDxwYXRoPiAgUGFzYSBwb3IgYWx0byBsYSBwcm9waWVkYWQgZGUgc2lzdGVtYSBqYXZhLmNsYXNzLnBhdGhcblwKK1wgICAgLXhwb3dlcmVkQnkgICAgICAgIEHxYWRlIGNhYmVjZXJhIGRlIHJlc3B1ZXN0YSAgWC1Qb3dlcmVkLUJ5XG5cCitcICAgIC10cmltU3BhY2VzICAgICAgICBUcmltIHNwYWNlcyBpbiB0ZW1wbGF0ZSB0ZXh0IGJldHdlZW4gYWN0aW9ucywgZGlyZWN0aXZlc1xuXAorXCAgICAtamF2YUVuY29kaW5nIDxlbmM+IFNldCB0aGUgZW5jb2RpbmcgY2hhcnNldCBmb3IgSmF2YSBjbGFzc2VzIChkZWZhdWx0IFVURi04KVxuXAorXCAgICAtc291cmNlIDx2ZXJzaW9uPiAgIFNldCB0aGUgLXNvdXJjZSBhcmd1bWVudCB0byB0aGUgY29tcGlsZXIgKGRlZmF1bHQgMS40KVxuXAorXCAgICAtdGFyZ2V0IDx2ZXJzaW9uPiAgIFNldCB0aGUgLXRhcmdldCBhcmd1bWVudCB0byB0aGUgY29tcGlsZXIgKGRlZmF1bHQgMS40KVxuXAorCitqc3BjLndlYnhtbC5oZWFkZXI9PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PlxuXAorXG5cCis8IURPQ1RZUEUgd2ViLWFwcFxuXAorXCAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiJcblwKK1wgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+XG5cCis8IS0tXG5cCitDcmVhZG8gYXV0b21hdGljYW1lbnRlIG1lZGlhbnRlIEFwYWNoZSBKYWthcnRhIFRvbWNhdCBKc3BDLlxuXAorLS0+XG5cCis8d2ViLWFwcD5cblwKK1xuCitqc3BjLndlYnhtbC5mb290ZXI9XG5cCis8L3dlYi1hcHA+XG5cCitcbgoranNwYy53ZWJpbmMuaGVhZGVyPVxuXAorPCEtLVxuXAorQ3JlYWRvIGF1dG9tYXRpY2FtZW50ZSBtZWRpYW50ZSBBcGFjaGUgSmFrYXJ0YSBUb21jYXQgSnNwQy5cblwKK0NvbG9xdWUgZXN0ZSBmcmFnbWVudG8gZW4gZWwgZmljaGVybyB3ZWIueG1sIGFudGVzIGRlIFxuXAordG9kb3MgbG9zIGVsZW1lbnRvczogaWNvbiwgZGlzcGxheS1uYW1lLCBkZXNjcmlwdGlvbiwgXG5cCitkaXN0cmlidXRhYmxlIHkgY29udGV4dC1wYXJhbSAuXG5cCistLT5cbgoranNwYy53ZWJpbmMuZm9vdGVyPVxuXAorPCEtLVxuXAorTG9zIEVsZW1lbnRvczogc2Vzc2lvbi1jb25maWcsIG1pbWUtbWFwcGluZywgd2VsY29tZS1maWxlLWxpc3QsIGVycm9yLXBhZ2UsIHRhZ2xpYixcblwKK3Jlc291cmNlLXJlZiwgc2VjdXJpdHktY29uc3RyYWludCwgbG9naW4tY29uZmlnLCBzZWN1cml0eS1yb2xlLFxuXAorZW52LWVudHJ5IHkgZWpiLXJlZiBkZWJlcuFuIGRlIGlyIGRlc3B16XMgZGUgZXN0ZSBmcmFnbWVudG8gLlxuXAorLS0+XG4KK2pzcGMud2ViaW5jLmluc2VydEVuZD08IS0tIEZpbiBkZSBtYXBlb3MgZGUgc2VydmxldCBKU1BDIC0tPgoranNwYy53ZWJpbmMuaW5zZXJ0U3RhcnQ9PCEtLSBJbmljaW8gZGUgbWFwZW9zIGRlIHNlcnZsZXQgSlNQQyAtLT4KK2pzcGMuZXJyb3IuamFzcGVyRXhjZXB0aW9uPWVycm9yLWVsIGFyY2hpdm8gJyd7MH0nJyBoYSBnZW5lcmFkbyBsYSBleGNlcGNp824gZGUgc2ludOF4aXMgc2lndWllbnRlOiB7MX0KK2pzcGMuZXJyb3IuZ2VuZXJhbEV4Y2VwdGlvbj1FUlJPUi1lbCBhcmNoaXZvICcnezB9JycgaGEgZ2VuZXJhZG8gbGEgZXhjZXBjafNuIGdlbmVyYWwgc2lndWllbnRlOgoranNwYy5lcnJvci5maWxlRG9lc05vdEV4aXN0PUVsIGFyY2hpdm8gJyd7MH0nJyB1dGlsaXphZG8gY29tbyBhcmd1bWVudG8gbm8gZXhpc3RlLgoranNwYy5lcnJvci5lbXB0eVdlYkFwcD0td2ViYXBwIG5lY2VzaXRhIHVuIGFyZ3VtZW50byBkZSBhcmNoaXZvCitqc3AuZXJyb3IubGlicmFyeS5pbnZhbGlkPUxhIHDhZ2luYSBKU1AgZXMgaW5jb3JyZWN0YSBkZSBhY3VlcmRvIGEgbGEgYmlibGlvdGVjYSB7MH06IHsxfQoranNwLmVycm9yLnRsdmNsYXNzLmluc3RhbnRpYXRpb249Tm8gcHVkZSBjYXJnYXIgbyBpbnN0YW5jaWFyIGNsYXNlIFRhZ0xpYnJhcnlWYWxpZGF0b3I6IHswfQoranNwLmVycm9yLnRsdi5pbnZhbGlkLnBhZ2U9TWVuc2FqZXMgZGUgZXJyb3IgZGUgdmFsaWRhY2nzbiBkZXNkZSBUYWdMaWJyYXJ5VmFsaWRhdG9yIHBhcmEgezB9IGluIHsxfQoranNwLmVycm9yLnRlaS5pbnZhbGlkLmF0dHJpYnV0ZXM9TWVuc2FqZXMgZGUgZXJyb3IgZGUgdmFsaWRhY2nzbiBkZXNkZSBUYWdFeHRyYUluZm8gcGFyYSB7MH0KK2pzcC5wYXJzZXIuc2F4LnByb3BlcnR5bm90c3VwcG9ydGVkPVByb3BpZWRhZCBTQVggbm8gc29wb3J0YWRhOiB7MH0KK2pzcC5wYXJzZXIuc2F4LnByb3BlcnR5bm90cmVjb2duaXplZD1Qcm9waWVkYWQgU0FYIG5vIHJlY29ub2NpZGE6IHswfQoranNwLnBhcnNlci5zYXguZmVhdHVyZW5vdHN1cHBvcnRlZD1DYXJhY3Rlcu1zdGljYSBTQVggbm8gc29wb3J0YWRhOiB7MH0KK2pzcC5wYXJzZXIuc2F4LmZlYXR1cmVub3RyZWNvZ25pemVkPUNhcmFjdGVy7XN0aWNhIFNBWCBubyByZWNvbm9jaWRhOiB7MH0KK2pzcC5lcnJvci5uby5tb3JlLmNvbnRlbnQ9QWxjYW56YWRvIGZpbiBkZSBjb250ZW5pZG8gbWlldHJhcyBzZSByZXF1ZXLtYSBt4XMgYW7hbGlzaXM6IL9lcnJvciBkZSBhbmlkYW1pZW50byBkZSB0YWc/Citqc3AuZXJyb3IucGFyc2UueG1sPUVycm9yIGRlIGFu4Wxpc2lzIFhNTCBlbiBhcmNoaXZvIHswfQoranNwLmVycm9yLnBhcnNlLnhtbC5saW5lPUVycm9yIGRlIGFu4Wxpc2lzIFhNTCBlbiBhcmNoaXZvIHswfTogKGztbmVhIHsxfSwgY29sIHsyfSkKK2pzcC5lcnJvci5wYXJzZS54bWwuc2NyaXB0aW5nLmludmFsaWQuYm9keT1FbCBjdWVycG8gZGUgZWxlbWVudG8gezB9IG5vIGRlYmUgZGUgY29udGVuZXIgZWxlbWVudG9zIFhNTAoranNwLmVycm9yLmludGVybmFsLnRsZGluaXQ9Tm8gcHVkZSBpbmljaWFsaXphciBUbGRMb2NhdGlvbnNDYWNoZTogezB9Citqc3AuZXJyb3IuaW50ZXJuYWwuZmlsZW5vdGZvdW5kPUVycm9yIEludGVybm86IEFyY2hpdm8gezB9IG5vIGhhbGxhZG8KK2pzcC5lcnJvci5pbnRlcm5hbC5ldmFsdWF0b3Jfbm90X2ZvdW5kPUVycm9yIGludGVybm86IG5vIHB1ZGUgY2FyZ2FyIGV2YWx1YWRvciBkZSBleHByZXNpb25lcworanNwLmVycm9yLnBhcnNlLnhtbC5pbnZhbGlkUHVibGljSWQ9UFVCTElDIElEIGluY29ycmVjdGE6IHswfQoranNwLmVycm9yLmluY2x1ZGUuZmx1c2guaW52YWxpZC52YWx1ZT1WYWxvciBpbmNvcnJlY3RvIHBhcmEgYXRyaWJ1dG8gZmx1c2g6IHswfQoranNwLmVycm9yLnVuc3VwcG9ydGVkLmVuY29kaW5nPUNvZGlmaWNhY2nzbiBubyBzb3BvcnRhZGE6IHswfQordGxkLmVycm9yLnZhcmlhYmxlTm90QWxsb3dlZD1FcyB1biBlcnJvciBwYXJhIHVuIHRhZywgcXVlIHRpZW5lIHVubyBvIG3hcyBzdWJlbGVtZW50b3MgdmFyaWFibGVzLCBlbCB0ZW5lciB1bmEgY2xhc2UgVGFnRXh0cmFJbmZvIHF1ZSBkZXZ1ZWx2ZSB1biBvYmpldG8gbm8gbnVsby4KK2pzcC5lcnJvci50bGRJbldlYkRvdFhtbE5vdEZvdW5kPU5vIHB1ZGUgbG9jYWxpemFyIFRMRCB7MX0gcGFyYSBVUkkgezB9IGVzcGVjaWZpY2FkbyBlbiB3ZWIueG1sCitqc3AuZXJyb3IudGFnbGliRGlyZWN0aXZlLmFic1VyaUNhbm5vdEJlUmVzb2x2ZWQ9TGEgdXJpIGFic29sdXRhOiB7MH0gbm8gcHVlZGUgcmVzb2x2ZXJzZSBvIGVuIHdlYi54bWwgbyBlbCBsb3MgYXJjaGl2b3MgamFyIGRlc3BsZWdhZG9zIGNvbiBlc3RhIGFwbGljYWNp824KK2pzcC5lcnJvci50YWdsaWJEaXJlY3RpdmUubWlzc2luZy5sb2NhdGlvbj1ObyBzZSBoYSBlc3BlY2lmaWNhZG8gbmkgZWwgYXRyaWJ1dG8gXCd1cmlcJyBuaSBlbCBcJ3RhZ2RpclwnCitqc3AuZXJyb3IudGFnbGliRGlyZWN0aXZlLmJvdGhfdXJpX2FuZF90YWdkaXI9U2UgaGFuIGVzcGVjaWZpY2FkbyBhbWJvcyBhdHJpYnV0b3MgXCd1cmlcJyB5IFwndGFnZGlyXCcKK2pzcC5lcnJvci5pbnZhbGlkLnRhZ2Rpcj1FbCBkaXJlY3RvcmlvIGRlIGFyY2hpdm8gVGFnIHswfSBubyBjb21pZW56YSBjb24gXCIvV0VCLUlORi90YWdzXCIKK2pzcC5lcnJvci51bnRlcm1pbmF0ZWQudXNlci50YWc9VGFnIGRlZmluaWRvIHBvciB1c3VhcmlvIG5vIHRlcm1pbmFkbzogdGFnIGZpbmFsIHswfSBubyBoYWxsYWRvIG8gYW5pZGFkbyBpbmNvcnJlY3RhbWVudGUKKyNqc3B4LmVycm9yLnRlbXBsYXRlRGF0YU5vdEluSnNwQ2RhdGE9VmFsaWRhdGlvbiBFcnJvcjogRWxlbWVudCAmbHQ7ezB9Jmd0OyBjYW5ub3QgaGF2ZSB0ZW1wbGF0ZSBkYXRhLiBUZW1wbGF0ZSBkYXRhIG11c3QgYmUgZW5jYXBzdWxhdGVkIHdpdGhpbiBhICZsdDtqc3A6Y2RhdGEmZ3Q7IGVsZW1lbnQuIFtKU1AxLjIgUEZEIHNlY3Rpb24gNS4xLjldXG5UZW1wbGF0ZSBkYXRhIGluIGVycm9yOiB7MX0KK2pzcHguZXJyb3IudGVtcGxhdGVEYXRhTm90SW5Kc3BDZGF0YT1FcnJvciBkZSBWYWxpZGFjafNuOiBFbCBFbGVtZW50byAmbHQ7ezB9Jmd0OyBubyBwdWVkZSB0ZW5lciBkYXRvcyBwbGFudGlsbGEuIExvcyBkYXRvcyBwbGFudGlsbGEgZGViZW4gZGUgZXN0YXIgZW5jYXBzdWxhZG9zIGRlbnRybyBkZSB1biBlbGVtZW50byAmbHQ7anNwOnRleHQmZ3Q7LiBbSlNQMS4yIFBGRCBzZWNjafNuIDUuMS45XVxuRGF0b3MgZGUgUGxhbnRpbGxhIGVuIGVycm9yOiB7MX0KKyNFcnJvciB3aGlsZSBwcm9jZXNzaW5nIHRhZ2xpYiBqYXIgZmlsZSB7MH06IHsxfQoranNwLmVycm9yLnRhZ2xpYi5yZXNlcnZlZC5wcmVmaXg9RWwgcHJlZmlqbyB0YWdsaWIgezB9IGVzdOEgcmVzZXJ2YWRvCitqc3AuZXJyb3IuaW52YWxpZC5qYXZhRW5jb2Rpbmc9Q29kaWZpY2FjaW9uZXMgamF2YSBpbmNvcnJlY3Rhcy4gSW50ZW506SB7MH0geSBsdWVnbyB7MX0uIEFtYmFzIGZhbGxhcm9uLgoranNwLmVycm9yLm5lZWRBbHRlcm5hdGVKYXZhRW5jb2Rpbmc9TGEgY29kaWZpY2FjafNuIGphdmEgcG9yIGRlZmVjdG8gezB9IGVzIGluY29ycmVjdGEgZW4gdHUgcGxhdGFmb3JtYSBqYXZhLiBTZSBwdWVkZSBlc3BlY2lmaWNhciB1bmEgYWx0ZXJuYXRpdmEgdu1hIHBhcuFtZXRybyAnamF2YUVuY29kaW5nJyBkZSBKc3BTZXJ2bGV0LgorI0Vycm9yIHdoZW4gY29tcGlsaW5nLCB1c2VkIGZvciBqc3AgbGluZSBudW1iZXIgZXJyb3IgbWVzc2FnZXMKK2pzcC5lcnJvci5zaW5nbGUubGluZS5udW1iZXI9SGEgdGVuaWRvIGx1Z2FyIHVuIGVycm9yIGVuIGxhIGztbmVhOiB7MH0gZW4gZWwgYXJjaGl2byBqc3A6IHsxfQoranNwLmVycm9yLm11bHRpcGxlLmxpbmUubnVtYmVyPVxuXG5IYSB0ZW5pZG8gbHVnYXIgdW4gZXJyb3IgZW50cmUgbGFzIGztbmVhczogezB9IHkgezF9IGVuIGVsIGFyY2hpdm8ganNwOiB7Mn1cblxuCitqc3AuZXJyb3IuY29ycmVzcG9uZGluZy5zZXJ2bGV0PUVycm9yIGRlIHNlcnZsZXQgZ2VuZXJhZG86XG4KK2pzcC5lcnJvci5lbXB0eS5ib2R5Lm5vdC5hbGxvd2VkPUN1ZXJwbyB2YWPtbyBubyBwZXJtaXRpZG8gcGFyYSB7MH0KK2pzcC5lcnJvci5qc3Bib2R5LnJlcXVpcmVkPVNlIGRlYmUgZGUgdXNhciBqc3A6Ym9keSBwYXJhIGVzcGVjaWZpY2FyIGN1ZXJwbyB0YWcgcGFyYSB7MH0gc2kgc2UgdXNhIGpzcDphdHRyaWJ1dGUuCitqc3AuZXJyb3IuanNwYm9keS5lbXB0eWJvZHkub25seT1FbCB0YWcgezB9IHPzbG8gcHVlZGUgdGVuZXIganNwOmF0dHJpYnV0ZSBlbiBzdSBjdWVycG8uCitqc3AuZXJyb3Iubm8uc2NyaXB0bGV0cz1Mb3MgZWxlbWVudG9zIGRlIFNjcmlwdGluZyAoJmx0OyUhLCAmbHQ7anNwOmRlY2xhcmF0aW9uLCAmbHQ7JT0sICZsdDtqc3A6ZXhwcmVzc2lvbiwgJmx0OyUsICZsdDtqc3A6c2NyaXB0bGV0ICkgbm8gZXN04W4gcGVybWl0aWRvcyBhcXXtLgoranNwLmVycm9yLmludGVybmFsLnVuZXhwZWN0ZWRfbm9kZV90eXBlPUVycm9yIEludGVybm86IEVuY29udHJhZG8gdGlwbyBkZSBub2RvIGluZXNwZXJhZG8KK2pzcC5lcnJvci50bGQuZm4uaW52YWxpZC5zaWduYXR1cmU9U2ludOF4aXMgaW5jb3JyZWN0YSBwYXJhIGZpcm1hIGRlIGZ1bmNp824gZW4gVExELiBCaWJsaW90ZWNhIGRlIFRhZzogezB9LCBGdW5jafNuOiB7MX0KK2pzcC5lcnJvci50bGQuZm4uZHVwbGljYXRlLm5hbWU9Tm9tYnJlIGR1cGxpY2FkbyBkZSBmdW5jafNuIHswfSBlbiBiaWJsaW90ZWNhIGRlIHRhZyB7MX0KK2pzcC5lcnJvci50bGQuZm4uaW52YWxpZC5zaWduYXR1cmUuY29tbWFleHBlY3RlZD1TaW504XhpcyBpbmNvcnJlY3RhIHBhcmEgZmlybWEgZGUgZnVuY2nzbiBlbiBUTEQuIFNlIGVzcGVyYWJhIENvbWEgJywnLiBCaWJsaW90ZWNhIGRlIFRhZzogezB9LCBGdW5jafNuOiB7MX0uCitqc3AuZXJyb3IudGxkLmZuLmludmFsaWQuc2lnbmF0dXJlLnBhcmVuZXhwZWN0ZWQ9U2ludOF4aXMgaW5jb3JyZWN0YSBwYXJhIGZpcm1hIGRlIGZ1bmNp824gZW4gVExELiBTZSBlc3BlcmFiYSBQYXLpbnRlc2lzICcoJy4gQmlibGlvdGVjYSBkZSBUYWc6IHswfSwgRnVuY2nzbjogezF9LgoranNwLmVycm9yLnRsZC5tYW5kYXRvcnkuZWxlbWVudC5taXNzaW5nPUZhbHRhIG8gZXN04SB2YWPtbyBlbGVtZW50byBUTEQgb2JsaWdhdG9yaW86IHswfQoranNwLmVycm9yLmR5bmFtaWMuYXR0cmlidXRlcy5ub3QuaW1wbGVtZW50ZWQ9RWwgdGFnIHswfSBkZWNsYXJhIHF1ZSBhY2VwdGEgYXRyaWJ1dG9zIGRpbuFtaWNvcyBwZXJvIG5vIGltcGxlbWVudGEgbGEgaW50ZXJmYXogcmVxdWVyaWRhCitqc3AuZXJyb3Iubm9tYXRjaGluZy5mcmFnbWVudD1ObyBwdWVkbyBoYWxsYXIgdW5hIGRpcmVjdGl2YSBkZSBhdHJpYnV0byAoY29uIG5hbWU9ezB9IHkgZnJhZ21lbnQ9dHJ1ZSkgYW50ZXMgZGUgbGEgZGlyZWN0aXZhIGRlIGZyYWdtZW50LgoranNwLmVycm9yLmF0dHJpYnV0ZS5ub2VxdWFsPXNlIGVzcGVyYWJhIHPtbWJvbG8gaWd1YWwKK2pzcC5lcnJvci5hdHRyaWJ1dGUubm9xdW90ZT1zZSBlc3BlcmFiYSBz7W1ib2xvIGNvbWlsbGFzCitqc3AuZXJyb3IuYXR0cmlidXRlLnVudGVybWluYXRlZD1lbCBhdHJpYnV0byBwYXJhIHswfSBubyBlc3ThIHRlcm1pbmFkbyBjb3JyZWN0YW1lbnRlCitqc3AuZXJyb3IubWlzc2luZy50YWdJbmZvPUVsIG9iamV0byBUYWdJbmZvIHBhcmEgezB9IGZhbHRhIGRlbCBUTEQKK2pzcC5lcnJvci5mcmFnbWVudHdpdGh0eXBlPU5vIHB1ZWRlIGVzcGVjaWZpY2FyIGFtYm9zIGF0cmlidXRvcyAnZnJhZ21lbnQnIHkgJ3R5cGUnLiBTaSBlc3ThIHByZXNlbnRlICdmcmFnbWVudCcsICd0eXBlJyBzZSBwb25lIGNvbW8gJ2phdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BGcmFnbWVudCcKK2pzcC5lcnJvci5mcmFnbWVudHdpdGhydGV4cHJ2YWx1ZT1ObyBwdWVkZSBlc3BlY2lmaWNhciBhbWJvcyBhdHJpYnV0b3MgJ2ZyYWdtZW50JyB5ICdydGV4cHJ2YWx1ZScuICBTaSBlc3ThIHByZXNlbnRlICdmcmFnbWVudCcsICdydGV4cHJ2YWx1ZScgc2UgcG9uZSBjb21vICd0cnVlJworanNwLmVycm9yLmZyYWdtZW50V2l0aERlY2xhcmVPclNjb3BlPUFtYm9zIGF0cmlidXRvcyAnZnJhZ21lbnQnIHkgJ2RlY2xhcmUnIG8gJ3Njb3BlJyBzZSBoYW4gZXNwZWNpZmljYWRvIGVuIGxhIGRpcmVjdGl2YSB2YXJpYWJsZQoranNwLmVycm9yLnZhcl9hbmRfdmFyUmVhZGVyPVPzbG8gc2UgcHVlZGUgZXNwZWNpZmljYXIgdW5vIGRlIFwndmFyXCcgbyBcJ3ZhclJlYWRlclwnCitqc3AuZXJyb3IubWlzc2luZ192YXJfb3JfdmFyUmVhZGVyPUZhbHRhIGF0cmlidXRvIFwndmFyXCcgbyBcJ3ZhclJlYWRlclwnCitqc3Aud2FybmluZy5iYWQudXJscGF0dGVybi5wcm9wZXJ0eWdyb3VwPVZhbG9yIG1hbG8gezB9IGVuIGVsIHN1YmVsZW1lbnRvIHVybC1wYXR0ZXJuIGVuIHdlYi54bWwKK2pzcC5lcnJvci51bmtub3duX2F0dHJpYnV0ZV90eXBlPVRpcG8gZGUgYXRyaWJ1dG8gZGVzY29ub2NpZG8gKHsxfSkgcGFyYSBhdHJpYnV0byB7MH0uCitqc3AuZXJyb3IuanNwZWxlbWVudC5taXNzaW5nLm5hbWU9RmFsdGEgYXRyaWJ1dG8gb2JsaWdhdG9yaW8gWE1MLXN0eWxlIFwnbmFtZVwnCitqc3AuZXJyb3IueG1sbnMucmVkZWZpbml0aW9uLm5vdGltcGxlbWVudGVkPUVycm9yIGludGVybm86IEludGVudG8gZGUgcmVkZWZpbmlyIHhtbG5zOnswfS4gTGEgcmVkZWZpbmljafNuIGRlIGVzcGFjaW9zIGRlIG5vbWJyZSBubyBlc3ThIGltcGxlbWVudGFkYS4KK2pzcC5lcnJvci5jb3VsZC5ub3QuYWRkLnRhZ2xpYnJhcmllcz1ObyBwdWRlIGHxYWRpciB1bmEgbyBt4XMgYmlibGlvdGVjYXMuCitqc3AuZXJyb3IuZHVwbGljYXRlLm5hbWUuanNwYXR0cmlidXRlPUVsIGF0cmlidXRvIHswfSBlc3BlY2lmaWNhZG8gZW4gbGEgYWNjafNuIHN0YW5kYXJkIG8gY3VzdG9tIHRhbWJp6W4gYXBhcmVjZSBjb21vIGVsIHZhbG9yIGRlbCBhdHJpYnV0byBuYW1lIGVuIGpzcDphdHRyaWJ1dGUKK2pzcC5lcnJvci5ub3QuaW4udGVtcGxhdGU9ezB9IG5vIHBlcm1pdGlkbyBlbiB1bmEgcGxhbnRpbGxhIGN1ZXJwbyBkZSB0ZXh0by4KK2pzcC5lcnJvci5iYWRTdGFuZGFyZEFjdGlvbj1BY2Np824gZXN04W5kYXIgaW5jb3JyZWN0YQoranNwLmVycm9yLnhtbC5iYWRTdGFuZGFyZEFjdGlvbj1BY2Np824gZXN04W5kYXIgaW5jb3JyZWN0YTogezB9Citqc3AuZXJyb3IudGFnZGlyZWN0aXZlLmJhZGJvZHljb250ZW50PWJvZHktY29udGVudCBpbmNvcnJlY3RvICh7MH0pIGVuIGRpcmVjdGl2YSB0YWcKK2pzcC5lcnJvci5zaW1wbGV0YWcuYmFkYm9keWNvbnRlbnQ9RWwgVExEIHBhcmEgbGEgY2xhc2UgezB9IGVzcGVjaWZpY2EgdW4gYm9keS1jb250ZW50IGVzIGluY29ycmVjdG8gKEpTUCkgcGFyYSB1biBTaW1wbGVUYWcuCitqc3AuZXJyb3IuY29uZmlnX3BhZ2VkaXJfZW5jb2RpbmdfbWlzbWF0Y2g9RWwgUGFnZS1lbmNvZGluZyBlc3BlY2lmaWNhZG8gZW4ganNwLXByb3BlcnR5LWdyb3VwICh7MH0pIGVzIGRpZmVyZW50ZSBkZWwgZXNwZWNpZmljYWRvIGVuIGxhIGRpZWN0aXZhIHBhZ2UgKHsxfSkKK2pzcC5lcnJvci5wcm9sb2dfcGFnZWRpcl9lbmNvZGluZ19taXNtYXRjaD1FbCBQYWdlLWVuY29kaW5nIGVzcGVjaWZpY2FkbyBlbiBYTUwgcHJvbG9nICh7MH0pIGRpZmllcmUgZGVsIGVzcGVjaWZpY2FkbyBlbiBsYSBkaXJlY3RpdmEgcGFnZSAoezF9KQoranNwLmVycm9yLnByb2xvZ19jb25maWdfZW5jb2RpbmdfbWlzbWF0Y2g9RWwgUGFnZS1lbmNvZGluZyBlc3BlY2lmaWNhZG8gZW4gWE1MIHByb2xvZyAoezB9KSBkaWZpZXJlIGRlbCBlc3BlY2lmaWNhZG8gZW4ganNwLXByb3BlcnR5LWdyb3VwICh7MX0pCitqc3AuZXJyb3IuYXR0cmlidXRlLmN1c3RvbS5ub25fcnRfd2l0aF9leHByPVNlZ/puIGVsIFRMRCBvIGxhIGRpcmVjdGl2YSBhdHRyaWJ1dGUgZGVsIGFyY2hpdm8gdGFnLCBlbCBhdHJpYnV0byB7MH0gbm8gYWNlcHRhIGV4cHJlc2lvbmVzCitqc3AuZXJyb3IuYXR0cmlidXRlLnN0YW5kYXJkLm5vbl9ydF93aXRoX2V4cHI9RWwgYXRyaWJ1dG8gezB9IGRlIGxhIGFjY2nzbiBlc3ThbmRhciB7MX0gbm8gYWNlcHRhIGV4cHJlc2lvbmVzCitqc3AuZXJyb3Iuc2NyaXB0aW5nLnZhcmlhYmxlLm1pc3NpbmdfbmFtZT1JbXBvc2libGUgZGV0ZXJtaW5hciBub21icmUgZGUgdmFyaWFibGUgZGUgc2NyaXB0aW5nIGRlc2RlIGF0cmlidXRvIHswfQoramFzcGVyLmVycm9yLmVtcHR5Ym9keWNvbnRlbnQubm9uZW1wdHk9U2Vn+m4gZWwgVExELCBlbCB0YWcgezB9IGRlYmUgZGUgZXN0YXIgdmFj7W8sIHBlcm8gbm8gbG8gZXN04QoranNwLmVycm9yLnRhZ2ZpbGUubmFtZU5vdFVuaXF1ZT1FbCB2YWxvciBkZSB7MH0geSBlbCB2YWxvciBkZSB7MX0gZW4gbGEgbO1uZWEgezJ9IHNvbiBlbCBtaXNtby4KK2pzcC5lcnJvci50YWdmaWxlLm5hbWVGcm9tLm5vQXR0cmlidXRlPU5vIHB1ZWRvIGhhbGxhciB1bmEgZGlyZWN0aXZhIGF0dHJpYnV0ZSBjb24gdW4gYXRyaWJ1dG8gbmFtZSBjb24gdW4gdmFsb3IgXCJ7MH1cIiwgZWwgdmFsb3IgZGUgZXN0ZSBhdHJpYnV0byBuYW1lLWZyb20tYXR0cmlidXRlLgoranNwLmVycm9yLnRhZ2ZpbGUubmFtZUZyb20uYmFkQXR0cmlidXRlPUxhIGRpcmVjdGl2YSBhdHRyaWJ1dGUgKGRlY2xhcmFkYSBlbiBsYSBs7W5lYSB7MX0geSBjdXlvIGF0cmlidXRvIG5hbWUgZXMgXCJ7MH1cIiwgZWwgdmFsb3IgZGUgZXN0ZSBhdHJpYnV0byBuYW1lLWZyb20tYXR0cmlidXRlIGF0dHJpYnV0ZSkgZGViZSBkZSBzZXIgZGVsIHRpcG8gamF2YS5sYW5nLlN0cmluZywgZXMgXCJyZXF1aXJlZFwiIHkgbm8gdW4gXCJydGV4cHJ2YWx1ZVwiLgoranNwLmVycm9yLnBhZ2Uubm9TZXNzaW9uPU5vIHB1ZWRvIGFjY2VkZXIgYWwg4W1iaXRvIGRlIHNlc2nzbiBlbiB1bmEgcOFnaW5hIHF1ZSBubyBwYXJ0aWNpcGEgZW4gdW5hIHNlc2nzbgoranNwLmVycm9yLnVzZUJlYW4ubm9TZXNzaW9uPUVzIGlsZWdhbCBwYXJhIHVzZUJlYW4gdXNhciB1biDhbWJpdG8gZGUgc2VzafNuIGN1YW5kbyBsYSBw4WdpbmEgSlNQIGRlY2xhcmEgKHbtYSBkaXJlY3RpdmEgcGFnZSkgcXVlIG5vIHBhcnRpY2lwYSBlbiBzZXNpb25lcworanNwLmVycm9yLnhtbC5lbmNvZGluZ0J5dGVPcmRlclVuc3VwcG9ydGVkPUVsIG9yZGVuIGRlIGJ5dGUgZGFkbyBwYXJhIGVuY29kaW5nIFwiezB9XCIgbm8gZXN04SBzb3BvcnRhZG8KK2pzcC5lcnJvci54bWwuZW5jb2RpbmdEZWNsSW52YWxpZD1Ob21icmUgZGUgY29kaWZpY2FjafNuIFwiezB9XCIgaW5jb3JyZWN0by4KK2pzcC5lcnJvci54bWwuZW5jb2RpbmdEZWNsUmVxdWlyZWQ9U2UgbmVjZXNpdGEgbGEgZGVjbGFyYWNp824gZW5jb2RpbmcgZW4gbGEgZGVjbGFyYWNp824gZGUgdGV4dG8KK2pzcC5lcnJvci54bWwubW9yZVBzZXVkb0F0dHJpYnV0ZXM9c2UgZXNwZXJhbiBt4XMgcHNldWRvLWF0cmlidXRvcworanNwLmVycm9yLnhtbC5ub01vcmVQc2V1ZG9BdHRyaWJ1dGVzPW5vIHNlIHBlcm1pdGVuIG3hcyBwc2V1ZG8tYXRyaWJ1dG9zLgoranNwLmVycm9yLnhtbC52ZXJzaW9uSW5mb1JlcXVpcmVkPVNlIHJlcXVpZXJlIGxhIHZlcnNp824gZW4gbGEgZGVjbGFyYWNp824gWE1MLgoranNwLmVycm9yLnhtbC54bWxEZWNsVW50ZXJtaW5hdGVkPUxhIGRlY2xhcmFjafNuIFhNTCBkZWJlIGRlIHRlcm1pbmFyIGNvbiBcIj8+XCIuCitqc3AuZXJyb3IueG1sLnJlc2VydmVkUElUYXJnZXQ9TGEgaW5zdHJ1Y2Np824gZGUgcHJvY2VzYW1pZW50byBxdWUgY29pbmNpZGUgY29uIFwiW3hYXVttTV1bbExdXCIgbm8gZXN04SBwZXJtaXRpZGEuCitqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRJblBJPVNlIG5lY2VzaXRhIHVuIGVzcGFjaW8gZW4gYmxhbmNvIGVudHJlIGxhIGluc3RydWNjafNuIGRlIHByb2Nlc2FtaWVudG8geSBsb3MgZGF0b3MuCitqc3AuZXJyb3IueG1sLmludmFsaWRDaGFySW5Db250ZW50PVVuIGNhcuFjdGVyIFhNTCBpbmNvcnJlY3RvIChVbmljb2RlOiAweHswfSkgc2UgaGFsbPMgZW4gZWwgY29udGVuaWRvIGRlbCBlbGVtZW50byBkZWwgZG9jdW1lbnRvLgoranNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlU3RhbmRhbG9uZT1TZSBuZWNlc2l0YSB1biBlc3BhY2lvIGVuIGJsYW5jbyBhbnRlcyBkZWwgcHNldWRvLWF0cmlidXRvIGVuY29kaW5nIGVuIGxhIGRlY2xhcmFjafNuIFhNTC4KK2pzcC5lcnJvci54bWwuc2REZWNsSW52YWxpZD1FbCB2YWxvciBkZSBkZWNsYXJhY2nzbiBkZSBkb2N1bWVudG8gc3RhbmRhbG9uZSBkZWJlIGRlIHNlciBcInllc1wiIG8gXCJub1wiLCBubyBcInswfVwiLgoranNwLmVycm9yLnhtbC5pbnZhbGlkQ2hhckluUEk9U2UgaGFsbPMgdW4gY2Fy4WN0ZXIgWE1MIGluY29ycmVjdG8gKFVuaWNvZGU6IDB4ezB9KSBlbiBsYSBpbnN0cnVjY2nzbiBkZSBwcm9jZXNhbWllbnRvCitqc3AuZXJyb3IueG1sLnZlcnNpb25Ob3RTdXBwb3J0ZWQ9Tm8gc2Ugc29wb3J0YSBsYSB2ZXJzafNuIFhNTCBcInswfVwiLCBz82xvIHNlIHNvcG9ydGEgWE1MIDEuMAoranNwLmVycm9yLnhtbC5wc2V1ZG9BdHRyTmFtZUV4cGVjdGVkPXNlIGVzcGVyYWJhIHVuIHBzZXVkby1hdHJpYnV0byBuYW1lLgoranNwLmVycm9yLnhtbC5leHBlY3RlZEJ5dGU9U2UgZXNwZXJhYmEgYnl0ZSB7MH0gZGUgezF9LWJ5dGUgZGUgc2VjdWVuY2lhIFVURi04LgoranNwLmVycm9yLnhtbC5pbnZhbGlkQnl0ZT1JbmNvcnJlY3RvIGJ5dGUgezB9IGRlIHsxfS1ieXRlIGRlIHNlY3VlbmNpYSBVVEYtOC4KK2pzcC5lcnJvci54bWwub3BlcmF0aW9uTm90U3VwcG9ydGVkPUxhIG9wZXJhY2nzbiBcInswfVwiIG5vIGVzdOEgc29wb3J0YWRhIHBvciBsZWN0b3IgezF9LgoranNwLmVycm9yLnhtbC5pbnZhbGlkSGlnaFN1cnJvZ2F0ZT1TdXJyb2dhY2nzbiBBbHRhIGRlIGJpdHMgZW4gc2VjdWVuY2lhIFVURi04IG5vIGRlYmUgZGUgZXhjZWRlciAweDEwLCBwZXJvIHNlIGhhbGzzIDB4ezB9LgoranNwLmVycm9yLnhtbC5pbnZhbGlkQVNDSUk9RWwgQnl0ZSBcInswfVwiIG5vIGVzIEFTQ0lJIGRlIDctYml0LgoranNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlRW5jb2RpbmdJblhNTERlY2w9U2UgbmVjZXNpdGEgZXNwYWNpbyBlbiBibGFuY28gYW50ZXMgZGVsIHBzZXVkby1hdHJpYnV0byBlbmNvZGluZyBlbiBsYSBkZWNsYXJhY2nzbiBYTUwuCitqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVFbmNvZGluZ0luVGV4dERlY2w9U2UgbmVjZXNpdGEgZXNwYWNpbyBlbiBibGFuY28gYW50ZXMgZGVsIHBzZXVkby1hdHJpYnV0byBlbmNvZGluZyBlbiBsYSBkZWNsYXJhY2nzbiB0ZXh0LgoranNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlVmVyc2lvbkluVGV4dERlY2w9U2UgbmVjZXNpdGEgZXNwYWNpbyBlbiBibGFuY28gYW50ZXMgZGVsIHBzZXVkby1hdHJpYnV0byB2ZXJzaW9uIGVuIGxhIGRlY2xhcmFjafNuIHRleHQuCitqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVWZXJzaW9uSW5YTUxEZWNsPVNlIG5lY2VzaXRhIGVzcGFjaW8gZW4gYmxhbmNvIGFudGVzIGRlbCBwc2V1ZG8tYXRyaWJ1dG8gdmVyc2lvbiBlbiBsYSBkZWNsYXJhY2nzbiBYTUwuCitqc3AuZXJyb3IueG1sLmVxUmVxdWlyZWRJblhNTERlY2w9RWwgY2Fy4WN0ZXIgJycgPSAnJyBkZWJlIGRlIHNlcmd1aXIgYSBcInswfVwiIGVuIGxhIGRlY2xhcmFjafNuIFhNTC4KK2pzcC5lcnJvci54bWwuZXFSZXF1aXJlZEluVGV4dERlY2w9RWwgY2Fy4WN0ZXIgJycgPSAnJyBkZWJlIGRlIHNlcmd1aXIgYSBcInswfVwiIGVuIGxhIGRlY2xhcmFjafNuIHRleHQuCitqc3AuZXJyb3IueG1sLnF1b3RlUmVxdWlyZWRJblRleHREZWNsPUVsIHZhbG9yIHF1ZSBzaWd1ZSBhIFwiezB9XCIgZW4gbGEgZGVjbGFyYWNp824gdGV4dCBkZWJlIGRlIHNlciB1bmEgY2FkZW5hIGVudHJlIGNvbWlsbGFzLgoranNwLmVycm9yLnhtbC5xdW90ZVJlcXVpcmVkSW5YTUxEZWNsPUVsIHZhbG9yIHF1ZSBzaWd1ZSBhIFwiezB9XCIgZW4gbGEgZGVjbGFyYWNp824gWE1MIGRlYmUgZGUgc2VyIHVuIGNhZGVuYSBlbnRyZSBjb21pbGxhcy4KK2pzcC5lcnJvci54bWwuaW52YWxpZENoYXJJblRleHREZWNsPVVuIGNhcuFjdGVyIFhNTCBpbmNvcnJlY3RvIChVbmljb2RlOiAweHswfSkgc2UgaGFsbPMgZW4gbGEgZGVjbGFyYWNp824gdGV4dAoranNwLmVycm9yLnhtbC5pbnZhbGlkQ2hhckluWE1MRGVjbD1VbiBjYXLhY3RlciBYTUwgaW5jb3JyZWN0byAoVW5pY29kZTogMHh7MH0pIHNlIGhhbGzzIGVuIGxhIGRlY2xhcmFjafNuIFhNTAoranNwLmVycm9yLnhtbC5jbG9zZVF1b3RlTWlzc2luZ0luVGV4dERlY2w9RmFsdGFuIGxhcyBjb21pbGxhcyBkZSBjaWVycmUgZW4gZWwgdmFsb3IgcXVlIHNpZ3VlIGEgXCJ7MH1cIiBlbiBsYSBkZWNsYXJhY2nzbiB0ZXh0LgoranNwLmVycm9yLnhtbC5jbG9zZVF1b3RlTWlzc2luZ0luWE1MRGVjbD1GYWx0YW4gbGFzIGNvbWlsbGFzIGRlIGNpZXJyZSBlbiBlbCB2YWxvciBxdWUgc2lndWUgYSAgXCJ7MH1cIiBlbiBsYSBkZWNsYXJhY2nzbiBYTUwuCitqc3AuZXJyb3IubXVsdGlwbGUuanNwPU5vIHB1ZWRvIHRlbmVyIG36bHRpcGxlcyBlc3BlY2lmaWNhY2lvbmVzIGRlCitqc3AuZXJyb3IuanNwb3V0cHV0LmNvbmZsaWN0PSZsdDtqc3A6b3V0cHV0Jmd0OzogaWxlZ2FsIHRlbmVyIG9jdXJyZW5jaWFzIG36bHRpcGxlcyBkZSBcInswfVwiIGNvbiBkaWZlcmVudGVzIHZhbG9yZXMgKHZpZWpvOiB7MX0sIG51ZXZvOiB7Mn0pCitqc3AuZXJyb3IuanNwb3V0cHV0LmRvY3R5cGVuYW1lc3lzdGVtPSZsdDtqc3A6b3V0cHV0Jmd0OzogYXRyaWJ1dG9zICdkb2N0eXBlLXJvb3QtZWxlbWVudCcgeSAnZG9jdHlwZS1zeXN0ZW0nIGRlYmVuIGRlIGFwYXJlY2VyIGp1bnRvcworanNwLmVycm9yLmpzcG91dHB1dC5kb2N0eXBlcHVsaWNzeXN0ZW09Jmx0O2pzcDpvdXRwdXQmZ3Q7OiBhdHJpYnV0byAnZG9jdHlwZS1zeXN0ZW0nIGRlYmUgZGUgYXBhcmVjZXIgc2kgYXBhcmVjZSBhdHJpYnV0byAnZG9jdHlwZS1wdWJsaWMnCitqc3AuZXJyb3IuanNwb3V0cHV0Lm5vbmVtcHR5Ym9keT0mbHQ7anNwOm91dHB1dCZndDsgbm8gZGViZSBkZSB0ZW5lciB1biBjdWVycG8KK2pzcC5lcnJvci5qc3BvdXRwdXQuaW52YWxpZFVzZT0mbHQ7anNwOm91dHB1dCZndDsgbm8gc2UgZGViZSBkZSB1c2FyIGVuIHNpbnTheGlzIGVzdOFuZGFyCitqc3AuZXJyb3IuYXR0cmlidXRlcy5ub3QuYWxsb3dlZCA9IHswfSBubyBkZWJlIGRlIHRlbmVyIGF0cmlidXRvcworanNwLmVycm9yLnRhZ2ZpbGUuYmFkU3VmZml4PUZhbHRhIHN1ZmlqbyBcIi50YWdcIiBlbiB0cmF5ZWN0b3JpYSBkZSBhcmNoaXZvIGRlIHRhZyB7MH0KK2pzcC5lcnJvci50YWdmaWxlLmlsbGVnYWxQYXRoPVRyYXllY3RvcmlhIGRlIGFyY2hpdm8gZGUgdGFnOiB7MH0sIGRlYmUgZGUgY29tZW56YXIgY29uIFwiL1dFQi1JTkYvdGFnc1wiIG8gXCIvTUVUQS1JTkYvdGFnc1wiCitqc3AuZXJyb3IucGx1Z2luLndyb25nUm9vdEVsZW1lbnQ9RWwgbm9tYnJlIGRlbCBlbGVtZW50byByYe16IGVuIHswfSBkaWZpZXJlIGRlIHsxfQoranNwLmVycm9yLmF0dHJpYnV0ZS5pbnZhbGlkUHJlZml4PUVsIHByZWZpam8gZGUgYXRyaWJ1dG8gezB9IG5vIHNlIGNvcnJlcG9uZGUgY29uIG5pbmd1bmEgYmlibGlvdGVjYSBpbXBvcnRhZGEKK2pzcC5lcnJvci5uZXN0ZWQuanNwYXR0cmlidXRlPVVuYSBhY2Np824gZXN04W5kYXIganNwOmF0dHJpYnV0ZSBubyBwdWVkZSBlc3RhciBhbmlkYWRhIGRlbnRybyBkZSBvdHJhIGFjY2nzbiBlc3ThbmRhciBqc3A6YXR0cmlidXRlCitqc3AuZXJyb3IubmVzdGVkLmpzcGJvZHk9VW5hIGFjY2nzbiBlc3ThbmRhciBqc3A6Ym9keSBubyBwdWVkZSBlc3RhciBhbmlkYWRhIGRlbnRybyBkZSBvdHJhIGFjY2nzbiBlc3ThbmRhciBqc3A6Ym9keSBvIGpzcDphdHRyaWJ1dGUKK2pzcC5lcnJvci52YXJpYWJsZS5laXRoZXIubmFtZT1PIGVsIGF0cmlidXRvIG5hbWUtZ2l2ZW4gbyBuYW1lLWZyb20tYXR0cmlidXRlIGRlYmVuIGRlIHNlciBlc3BlY2lmaWNhZG9zIGVuIHVuYSBkaXJlY3RpdmEgdmFyaWFibGUKK2pzcC5lcnJvci52YXJpYWJsZS5ib3RoLm5hbWU9Tm8gc2UgcHVlZGUgZXNwZWNpZmljYXIgYW1ib3MgYXRyaWJ1dG9zIG5hbWUtZ2l2ZW4gbyBuYW1lLWZyb20tYXR0cmlidXRlIGVuIHVuYSBkaXJlY3RpdmEgdmFyaWFibGUKK2pzcC5lcnJvci52YXJpYWJsZS5hbGlhcz1BbWJvcyBhdHJpYnV0b3MgbyBuaW5ndW5vIGRlIG5hbWUtZnJvbS1hdHRyaWJ1dGUgeSBhbGlhcyBwdWVkZW4gc2VyIGVzcGVjaWZpY2Fkb3MgZW4gdW5hIGRpcmVjdGl2YSB2YXJpYWJsZQoranNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWU9Tm9tYnJlIGRlIGF0cmlidXRvIG51bG8KK2pzcC5lcnJvci5qc3B0ZXh0LmJhZGNvbnRlbnQ9XCcmbHQ7XCcsIGN1YW5kbyBhcGFyZWNlIGVuIGVsIGN1ZXJwbyBkZSAmbHQ7anNwOnRleHQmZ3Q7LCBkZWJlIGRlIGVzdGFyIGVuY2Fwc3VsYWRvIGRlbnRybyBkZSB1biBDREFUQQoranNwLmVycm9yLmpzcHJvb3QudmVyc2lvbi5pbnZhbGlkPU76bWVybyBpbmNvcnJlY3RvIGRlIHZlcnNp8246IFwiezB9XCIsIGRlYmUgZGUgc2VyIFwiMS4yXCIgbyBcIjIuMFwiCitqc3AuZXJyb3Iubm9GdW5jdGlvblByZWZpeD1MYSBmdW5jafNuIHswfSBkZWJlIGRlIHVzYXJzZSBjb24gdW4gcHJlZmlqbyBjdWFuZG8gbm8gc2UgZXNwZWNpZmljYSB1biBlc3BhY2lvIGRlIG5vbWJyZXMgcG9yIGRlZmVjdG8KK2pzcC5lcnJvci5ub0Z1bmN0aW9uPUxhIGZ1bmNp824gezB9IG5vIHB1ZWRlIHNlciBsb2NhbGl6YWRhIG1lZGlhbnRlIGVsIHByZWZpam8gZXNwZWNpZmljYWRvCitqc3AuZXJyb3Iubm9GdW5jdGlvbk1ldGhvZD1FbCBt6XRvZG8gXCJ7MH1cIiBwYXJhIGxhIGZ1bmNp824gXCJ7MX1cIiBubyBzZSBwdWRvIGhhbGxhciBlbiBsYSBjbGFzZSBcInsyfVwiCitqc3AuZXJyb3IuZnVuY3Rpb24uY2xhc3Nub3Rmb3VuZD1MYSBjbGFzZSB7MH0gZXNwZWNpZmljYWRhIGVuIGVsIFRMRCBwYXJhIGxhIGZ1bmNp824gezF9IG5vIHNlIHB1ZWRlIGhhbGxhcjogezJ9Citqc3AuZXJyb3Iuc2lnbmF0dXJlLmNsYXNzbm90Zm91bmQ9TGEgY2xhc2UgezB9IGVzcGVjaWZpY2FkYSBlbiBsYSBmaXJtYSBkZWwgbel0b2RvIGVuIGVsIFRMRCBwYXJhIGxhIGZ1bmNp824gezF9IG5vIHNlIHB1ZWRlIGhhbGxhci4gezJ9Citqc3AuZXJyb3IudGV4dC5oYXNfc3ViZWxlbWVudD0mbHQ7anNwOnRleHQmZ3Q7IG5vIGRlYmUgZGUgdGVuZXIgc3ViZWxlbWVudG9zCitqc3AuZXJyb3IuZGF0YS5maWxlLnJlYWQ9RXJyb3IgbGV5ZW5kbyBhcmNoaXZvIFwiezB9XCIKK2pzcC5lcnJvci5wcmVmaXgucmVmaW5lZD1JbnRlbnRvIGRlIHJlZGVmaW5pciBlbCBwcmVmaWpvIHswfSBwb3IgezF9LCBjdWFuZG8geWEgZXN0YWJhIGRlZmluaWRvIGNvbW8gezJ9IGVuIGVsIOFtYml0byBlbiBjdXJzby4KK2pzcC5lcnJvci5uZXN0ZWRfanNwcm9vdD0mbHQ7anNwOnJvb3QmZ3Q7IGFuaWRhZG8KK2pzcC5lcnJvci51bmJhbGFuY2VkLmVuZHRhZz1FbCB0Z2FnIGZpbmFsIFwiJmx0Oy97MH1cIiBlc3ThIGRlc2VxdWlsaWJyYWRvCitqc3AuZXJyb3IuaW52YWxpZC5iZWFuPQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3Jlc291cmNlcy9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGI1YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMDUgQEAKKyMgJElkJAorIworIyBEZWZhdWx0IGxvY2FsaXplZCBzdHJpbmcgaW5mb3JtYXRpb24KKyMgTG9jYWxpemVkIHRoaXMgdGhlIERlZmF1bHQgTG9jYWxlIGFzIGlzIGZyX0ZSCisKK2pzcC5lcnJvci5iYWQuc2VydmxldC5lbmdpbmU9VmVyc2lvbiBkZSBtb3RldXIgZGUgc2VydmxldCBpbmNvcnJlY3RlIQoranNwLmVycm9yLm5vLnNjcmF0Y2guZGlyPUxlIG1vdGV1ciBkZSBKU1AgZW5naW5lIG4nJ2VzdCBwYXMgY29uZmlndXLpIGF2ZWMgdW4gculwZXJ0b2lyZSBkZSB0cmF2YWlsLlwKK1xuIE1lcmNpIGQnJ2Fqb3V0ZXIgXCJqc3AuaW5pdHBhcmFtcz1zY3JhdGNoZGlyPTxkaXItbmFtZT5cIiBcCitcbiBkYW5zIGxlIGZpY2hpZXIgInNlcnZsZXRzLnByb3BlcnRpZXMiIGRlIGNlIGNvbnRleHRlLgoranNwLmVycm9yLmJhZC5zY3JhdGNoLmRpcj1MZSBwYXJhbep0cmUgInNjcmF0Y2hEaXIiIHF1ZSB2b3VzIGF2ZXogc3DpY2lmaek6IHswfSBlc3QgaW51dGlsaXNhYmxlLgoranNwLm1lc3NhZ2Uuc2NyYXRjaC5kaXIuaXM9TGUgculwZXJ0b2lyZSBkZSB0cmF2YWlsIChzY3JhdGNoIGRpcikgcG91ciBsZSBtb3RldXIgZGUgSlNQIGVzdDogezB9Citqc3AubWVzc2FnZS5wYXJlbnRfY2xhc3NfbG9hZGVyX2lzPUxlIGNoYXJnZXVyIGRlIGNsYXNzZSBwYXJlbnQgKGNsYXNzIGxvYWRlcikgZXN0OiB7MH0KK2pzcC5tZXNzYWdlLmRvbnQubW9kaWZ5LnNlcnZsZXRzPUlNUE9SVEFOVDogTmUgcGFzIG1vZGlmaWVyIGxlcyBzZXJ2bGV0cyBn6W7pcullcworanNwLmVycm9yLm5vdC5pbXBsLmNvbW1lbnRzPUVycmV1ciBpbnRlcm5lOiBDb21tZW50YWlyZXMgbm9uIGltcGzpbWVudOlzCitqc3AuZXJyb3Iubm90LmltcGwuZGlyZWN0aXZlcz1FcnJldXIgaW50ZXJuZTogRGlyZWN0aXZlcyBub24gaW1wbOltZW506WVzCitqc3AuZXJyb3Iubm90LmltcGwuZGVjbGFyYXRpb25zPUVycmV1ciBpbnRlcm5lOiBEZWNsYXJhdGlvbnMgbm9uIGltcGzpbWVudOllcworanNwLmVycm9yLm5vdC5pbXBsLmV4cHJlc3Npb25zPUVycmV1ciBpbnRlcm5lOiBFeHByZXNzaW9ucyBub24gaW1wbOltZW506WVzCitqc3AuZXJyb3Iubm90LmltcGwuc2NyaXB0bGV0cz1FcnJldXIgaW50ZXJuZTogU2NyaXB0bGV0cyBub24gaW1wbOltZW506XMKK2pzcC5lcnJvci5ub3QuaW1wbC51c2ViZWFuPUVycmV1ciBpbnRlcm5lOiB1c2VCZWFuIG5vbiBpbXBs6W1lbnTpCitqc3AuZXJyb3Iubm90LmltcGwuZ2V0cD1FcnJldXIgaW50ZXJuZTogZ2V0UHJvcGVydHkgbm9uIGltcGzpbWVudOkKK2pzcC5lcnJvci5ub3QuaW1wbC5zZXRwPUVycmV1ciBpbnRlcm5lOiBzZXRQcm9wZXJ0eSBub24gaW1wbOltZW506QoranNwLmVycm9yLm5vdC5pbXBsLnBsdWdpbj1FcnJldXIgaW50ZXJuZTogcGx1Z2luIG5vbiBpbXBs6W1lbnTpCitqc3AuZXJyb3Iubm90LmltcGwuZm9yd2FyZD1FcnJldXIgaW50ZXJuZTogZm9yd2FyZCBub24gaW1wbOltZW506QoranNwLmVycm9yLm5vdC5pbXBsLmluY2x1ZGU9RXJyZXVyIGludGVybmU6IGluY2x1ZGUgbm9uIGltcGzpbWVudOkKK2pzcC5lcnJvci51bmF2YWlsYWJsZT1MYSBKU1AgYSDpdOkgbWFycXXpZSBjb21tZSBub24gZGlzcG9uaWJsZQoranNwLmVycm9yLnVzZWJlYW4ubWlzc2luZy5hdHRyaWJ1dGU9dXNlQmVhbjogbCcnaWRlbnRpZmljYXRldXIgZCcnYXR0cmlidXQgKGlkIGF0dHJpYnV0ZSkgZXN0IG1hbnF1YW50IG91IG1hbCBvcnRob2dyYXBoaekKK2pzcC5lcnJvci51c2ViZWFuLm1pc3NpbmcudHlwZT11c2VCZWFuICh7MH0pOiBMYSBjbGFzc2Ugb3UgbGUgdHlwZSBkJydhdHRyaWJ1dCBkb2l0IOp0cmVcCitzcOljaWZp6TogCitqc3AuZXJyb3IudXNlYmVhbi5kdXBsaWNhdGU9dXNlQmVhbjogTm9tIGRlIGJlYW4gZHVwbGlxdek6IHswfQoranNwLmVycm9yLnVzZWJlYW4ucHJvaGliaXRlZC5hcy5zZXNzaW9uPUltcG9zc2libGUgZCcndXRpbGlzZXIgY29tbWUgYmVhbiBkZSBzZXNzaW9uIHswfSBjYXIgYycnZXN0IGludGVyZGl0XAorcGFyIGxhIGRpcmVjdGl2ZSBqc3AgZOlmaW5pZSBwculj6WRlbW1lbnQ6IAoranNwLmVycm9yLnVzZWJlYW4ubm90LmJvdGg9dXNlQmVhbjogSW1wb3NzaWJsZSBkZSBzcOljaWZpZXIg4CBsYSBmb2lzIGxhIGNsYXNzZSBldCBsJydhdHRyaWJ1dCBiZWFuTmFtZTogCitqc3AuZXJyb3IudXNlYmVhbi5iYWQudHlwZS5jYXN0PXVzZUJlYW4gKHswfSk6IExlIHR5cGUgKHsxfSkgbicnZXN0IHBhcyBhc3NpZ25hYmxlIGRlcHVpcyBsYSBjbGFzc2UgKHsyfSkgCitqc3AuZXJyb3IuY2xhc3NuYW1lPUltcG9zc2libGUgZGUgZOl0ZXJtaW5lciBsZSBub20gZGUgY2xhc3NlIGQnJ2FwcuhzIGxlIGZpY2hpZXIgLmNsYXNzCitqc3Aud2FybmluZy5iYWQudHlwZT1BdHRlbnRpb246IG1hdXZhaXMgdHlwZSBkYW5zIGxlIGZpY2hpZXIgLmNsYXNzCitqc3AuZXJyb3IuZGF0YS5maWxlLndyaXRlPUVycmV1ciBsb3JzIGRlIGwnJ+ljcml0dXJlIGR1IGZpY2hpZXIgZGUgZG9ubullcworI0RpcmVjdGl2ZSBkZSBQYWdlOiB2YWxldXIgaW5jb3JyZWN0ZSBwb3VyIHBhZ2VFbmNvZGluZworanNwLmVycm9yLnBhZ2UuaW52YWxpZC5jb250ZW50dHlwZT1EaXJlY3RpdmUgZGUgUGFnZTogdmFsZXVyIGluY29ycmVjdGUgcG91ciBjb250ZW50VHlwZQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5zZXNzaW9uPURpcmVjdGl2ZSBkZSBQYWdlOiB2YWxldXIgaW5jb3JyZWN0ZSBwb3VyIHNlc3Npb24KK2pzcC5lcnJvci5wYWdlLmludmFsaWQuYnVmZmVyPURpcmVjdGl2ZSBkZSBQYWdlOiB2YWxldXIgaW5jb3JyZWN0ZSBwb3VyICJidWZmZXIiCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmF1dG9mbHVzaD1EaXJlY3RpdmUgZGUgUGFnZTogdmFsZXVyIGluY29ycmVjdGUgcG91ciBhdXRvRmx1c2gKK2pzcC5lcnJvci5wYWdlLmludmFsaWQuaXN0aHJlYWRzYWZlPURpcmVjdGl2ZSBkZSBQYWdlOiB2YWxldXIgaW5jb3JyZWN0ZSBwb3VyIGlzVGhyZWFkU2FmZQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5pbmZvPURpcmVjdGl2ZSBkZSBQYWdlOiB2YWxldXIgaW5jb3JyZWN0ZSBwb3VyIGluZm8KK2pzcC5lcnJvci5wYWdlLmludmFsaWQuaXNlcnJvcnBhZ2U9RGlyZWN0aXZlIGRlIFBhZ2U6IHZhbGV1ciBpbmNvcnJlY3RlIHBvdXIgaXNFcnJvclBhZ2UKK2pzcC5lcnJvci5wYWdlLmRlZmFmdGVydXNlLmxhbmd1YWdlPURpcmVjdGl2ZSBkZSBQYWdlOiBvbiBuZSBwZXV0IGTpZmluaXIgbGFuZ3VhZ2UgYXBy6HMgdW4gc2NyaXB0bGV0IAoranNwLmVycm9yLnBhZ2Uubm9tYXBwaW5nLmxhbmd1YWdlPURpcmVjdGl2ZSBkZSBQYWdlOiBQYXMgZGUgY29ycmVzcG9uZGFuY2UgcG91ciBsYW5ndWFnZTogCitqc3AuZXJyb3IucGFnZS5iYWRfYl9hbmRfYV9jb21ibz1EaXJlY3RpdmUgZGUgUGFnZTogY29tYmluYWlzb24gaWxs6WdhbGUgZGUgYnVmZmVyPVwibm9uZVwiICYmIGF1dG9GbHVzaD1cImZhbHNlXCIKK2pzcC5lcnJvci5ub3QuaW1wbC50YWdsaWI9SW50ZXJuYWwgZXJyb3I6IFRhZyBleHRlbnNpb25zIG5vbiBpbXBs6W1lbnTpcworanNwLmVycm9yLmluY2x1ZGUubWlzc2luZy5maWxlPWwnJ2FyZ3VtZW50IGZpY2hpZXIgKGZpbGUpIHBvdXIgbCcnaW5jbHVzaW9uIChpbmNsdWRlKSBlc3QgYWJzZW50Citqc3AuZXJyb3IuaW5jbHVkZS5iYWQuZmlsZT1NYXV2YWlzIGFyZ3VtZW50IGZpY2hpZXIgKGZpbGUpIHBvdXIgbCcnaW5jbHVzaW9uIChpbmNsdWRlKQoranNwLmVycm9yLmluY2x1ZGUuZXhjZXB0aW9uPUltcG9zc2libGUgZCcnaW5jbHVyZSAoaW5jbHVkZSkgezB9Citqc3AuZXJyb3Iuc3RyZWFtLmNsb3NlZD1GbHV4IGZlcm3pCitqc3AuZXJyb3IuaW52YWxpZC5mb3J3YXJkPVRhZyBmb3J3YXJkIGluY29ycmVjdAoranNwLmVycm9yLnVua25vd25FeGNlcHRpb249RXJyZXVyIG5vbiB0cmFpdOllISBWb3VzIGRldnJpZXogcGVuc2VyIOAgdXRpbGlzZXIgdW5lIHBhZ2UgZCcnZXJyZXVyIFwKK3BvdXIgcmFwcG9ydGVyIGNlIHR5cGUgZCcnZXJyZXVyIHBsdXMg6WzpZ2FtbWVudAoranNwLmVycm9yLmludmFsaWQuZGlyZWN0aXZlPURpcmVjdGl2ZSBpbmNvcnJlY3RlCitqc3AuZXJyb3IuZGlyZWN0aXZlLmlzdGFnZmlsZT1MYSBkaXJlY3RpdmUgezB9IG5lIHBldXQg6nRyZSB1dGlsaXPpZSBkYW5zIHVuIGZpY2hpZXIgdGFnCitqc3AuZXJyb3IuZGlyZWN0aXZlLmlzbm90dGFnZmlsZT1MYSBkaXJlY3RpdmUgezB9IG5lIHBldXQg6nRyZSB1dGlsaXPpZSBxdWUgZGFucyB1biBmaWNoaWVyIHRhZworanNwLmVycm9yLnRhZ2ZpbGUudGxkLm5hbWU9TCcnYXR0cmlidXQgXCJuYW1lXCIgZGUgbGEgZGlyZWN0aXZlIHRhZyBjb250aWVudCBsYSB2YWxldXIgezB9IGFsb3JzIHF1ZSBsZSB0YWcgXCJuYW1lXCIgZGUgbCcn6WzpbWVudCBcInRhZy1maWxlXCIgZGFucyBsZSBUTEQgZXN0IHsxfQoranNwLmVycm9yLmFjdGlvbi5pc3RhZ2ZpbGU9TCcnYWN0aW9uIHswfSBuZSBwZXV0IOp0cmUgdXRpbGlz6WUgZGFucyB1biBmaWNoaWVyIHRhZworanNwLmVycm9yLmFjdGlvbi5pc25vdHRhZ2ZpbGU9TCcnYWN0aW9uIHswfSBuZSBwZXV0IOp0cmUgdXRpbGlz6WUgcXVlIGRhbnMgdW4gZmljaGllciB0YWcKK2pzcC5lcnJvci51bnRlcm1pbmF0ZWQ9VGFnIHswfSBub24gdGVybWlu6QoranNwLmVycm9yLnVzZWJlYW4ubm90aW5zYW1lZmlsZT1sZSB0YWcgdXNlQmVhbiBkb2l0IGNvbW1lbmPpIGV0IGZpbmlyIGRhbnMgbGUgbeptZSBmaWNoaWVyIHBoeXNpcXVlCitqc3AuZXJyb3IubG9hZGNsYXNzLnRhZ2hhbmRsZXI9SW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGxhIGNsYXNzZSB7MH0KK2pzcC5lcnJvci51bmFibGUuY29tcGlsZT1JbXBvc3NpYmxlIGRlIGNvbXBpbGVyIGxhIGNsYXNzZSBwb3VyIGxhIEpTUAoranNwLmVycm9yLnVuYWJsZS5sb2FkPUltcG9zc2libGUgZGUgY2hhcmdlciBsYSBjbGFzc2UgcG91ciBsYSBKU1AKK2pzcC5lcnJvci51bmFibGUucmVuYW1lPUltcG9zc2libGUgZGUgcmVub21tZXIgbGUgZmljaGllciBjbGFzc2UgZGUgezB9IHZlcnMgezF9Citqc3AuZXJyb3IubWFuZGF0b3J5LmF0dHJpYnV0ZT17MH06IEwnJ2F0dHJpYnV0IG9ibGlnYXRvaXJlIHsxfSBlc3QgbWFucXVhbnQKK2pzcC5lbmdpbmUuaW5mbz1Nb3RldXIgSmFzcGVyIEpTUCAyLjAKK2pzcC5lcnJvci5pbnZhbGlkLmV4cHJlc3Npb249InswfSIgY29udGllbnQgZCcnaW5jb3JyZWN0ZShzKSBleHByZXNzaW9uKHMpOiB7MX0KK2pzcC5lcnJvci5pbnZhbGlkLmF0dHJpYnV0ZT17MH06IEF0dHJpYnV0IGluY29ycmVjdDogezF9Citqc3AuZXJyb3IudXNlYmVhbi5jbGFzcy5ub3Rmb3VuZD1DbGFzc2U6IHswfSBub24gdHJvdXbpZQoranNwLmVycm9yLmZpbGUuY2Fubm90LnJlYWQ9SW1wb3NzaWJsZSBkZSBsaXJlIGxlIGZpY2hpZXI6IHswfQoranNwLmVycm9yLmZpbGUuYWxyZWFkeS5yZWdpc3RlcmVkPUluY2x1c2lvbiBy6WN1cnNpdmUgZHUgZmljaGllciB7MH0KK2pzcC5lcnJvci5maWxlLm5vdC5yZWdpc3RlcmVkPUxlIGZpY2hpZXIgezB9IG4nJ2FwcGFyYe50IHBhcyBkYW5zIGwnJ2luY2x1c2lvbiAoaW5jbHVkZSkKK2pzcC5lcnJvci5xdW90ZXMudW50ZXJtaW5hdGVkPWd1aWxsZW1ldHMgbm9uIHRlcm1pbulzCitqc3AuZXJyb3IuYXR0ci5xdW90ZWQ9TGEgdmFsZXVyIGRlIGwnJ2F0dHJpYnV0ZSBkb2l0IOp0cmUgZW50cmUgZ3VpbGxlbWV0cyAKK2pzcC5lcnJvci5hdHRyLm5vdmFsdWU9TCcnYXR0cmlidXRlIHswfSBuJydhIHBhcyBkZSB2YWxldXIKK2pzcC5lcnJvci50YWcuYXR0ci51bnRlcm1pbmF0ZWQ9TGlzdGUgZGUgdGFnIGQnJ2F0dHJpYnV0IG5vbiB0ZXJtaW7pZQoranNwLmVycm9yLnBhcmFtLm5vbmFtZT1QYXMgZGUgbm9tIGRhbnMgbGUgdGFnIFBBUkFNCitqc3AuZXJyb3IucGFyYW0ubm92YWx1ZT1QYXMgZGUgdmFsZXVyIGRhbnMgbGUgdGFnIFBBUkFNCitqc3AuZXJyb3IuYmVhbnMubnVsbGJlYW49VGVudGF0aXZlIGQnJ29w6XJhdGlvbiBiZWFuIHN1ciB1biBvYmpldCBudWwuCitqc3AuZXJyb3IuYmVhbnMubm9iZWFuaW5mbz1QYXMgZCcnaW5mb3JtYXRpb24gYmVhbiAoQmVhbkluZm8pIHBvdXIgbGUgYmVhbiBkZSB0eXBlICcnezB9JycgbicnYSBwdSDqdHJlIHRyb3V26WUsIGxhIGNsYXNzZSBuJydleGlzdGUgcHJvYmFibGVtZW50IHBhcy4KK2pzcC5lcnJvci5iZWFucy5pbnRyb3NwZWN0aW9uPVVuZSBleGNlcHRpb24gcycnZXN0IHByb2R1aXRlIGxvcnMgZGUgbCcnaW50cm9zcGVjdGlvbiBkZSBsYSBt6XRob2RlIHJlYWQgZGUgbGEgcHJvcHJp6XTpICcnezB9JycgZGFucyBsZSBiZWFuIGRlIHR5cGUgJyd7MX0nJzpcbnsyfQoranNwLmVycm9yLmJlYW5zLm5vbWV0aG9kPUltcG9zc2libGUgZGUgdHJvdXZlciB1bmUgbel0aG9kZSBwb3VyIGxpcmUgbGEgcHJvcHJp6XTpICcnezB9JycgZGFucyBsZSBiZWFuIGRlIHR5cGUgJyd7MX0nJworanNwLmVycm9yLmJlYW5zLm5vbWV0aG9kLnNldHByb3BlcnR5PUltcG9zc2libGUgZGUgdHJvdXZlciB1bmUgbel0aG9kZSBwb3VyIG1ldHRyZSDgIGpvdXIgbGEgcHJvcHJp6XTpICcnezB9JycgZGUgdHlwZSAnJ3sxfScnZGFucyBsZSBiZWFuIGRlIHR5cGUgJyd7Mn0nJworanNwLmVycm9yLmJlYW5zLm5vcHJvcGVydHk9PUltcG9zc2libGUgZGUgdHJvdXZlciBkZSBsJydpbmZvcm1hdGlvbiBzdXIgbGEgcHJvcHJp6XTpICcnezB9JycgZGFucyBsZSBiZWFuIGRlIHR5cGUgJyd7MX0nJworanNwLmVycm9yLmJlYW5zLnNldHByb3BlcnR5Lm5vaW5kZXhzZXQ9SW1wb3NzaWJsZSBkZSByZW5zZWlnbmVyIGxhIHByb3Byael06SBpbmTpeOllCitqc3AuZXJyb3IuaW5jbHVkZS50YWc9VGFnIGpzcDppbmNsdWRlIGluY29ycmVjdAoranNwLmVycm9yLmluY2x1ZGUubm9mbHVzaD1qc3A6aW5jbHVkZSBkb2l0IGF2b2lyIFwiZmx1c2g9dHJ1ZVwiCitqc3AuZXJyb3IuaW5jbHVkZS5iYWRmbHVzaD1qc3A6aW5jbHVkZSBwYWdlPVwiLi4uXCIgZmx1c2g9XCJ0cnVlXCIgZXN0IGxhIHNldWxlIGNvbWJpbmFpc29uIHZhbGlkZSBkYW5zIEpTUCAxLjAKK2pzcC5lcnJvci5hdHRlbXB0X3RvX2NsZWFyX2ZsdXNoZWRfYnVmZmVyPUVycmV1cjogVGVudGF0aXZlIGQnJ2VmZmFjZW1lbnQgZCcndW4gdGFtcG9uIHF1aSBhIGTpauAg6XTpIHZpZGFuZ+kgKGZsdXNoKQoranNwLmVycm9yLm92ZXJmbG93PUVycmV1cjogROlwYXNzZW1lbnQgZGUgY2FwYWNpdOkgZHUgdGFtcG9uIEpTUAoranNwLmVycm9yLnBhcmFtZXhwZWN0ZWQ9TGUgdGFnIFwicGFyYW1cIiBlc3QgYXR0ZW5kdSBhdmVjIGxlcyBhdHRyaWJ1dHMgXCJuYW1lXCIgZXQgXCJ2YWx1ZVwiIGFwcuhzIGxlIHRhZyBcInBhcmFtc1wiLgoranNwLmVycm9yLmNsb3NlaW5kaXZpZHVhbHBhcmFtPUxlIHRhZyBwYXJhbSBkb2l0IOp0cmUgZmVybekgYXZlYyBcIi8+XCIKK2pzcC5lcnJvci5jbG9zZXBhcmFtcz1MZSB0YWcgcGFyYW0gdGFnIGRvaXQg6nRyZSBmZXJt6SBhdmVjICAvcGFyYW1zCitqc3AuZXJyb3IucGx1Z2luLm5vdHlwZT10eXBlIG5vbiBk6WNsYXLpIGRhbnMganNwOnBsdWdpbgoranNwLmVycm9yLnBsdWdpbi5ub2NvZGU9Y29kZSBub24gZOljbGFy6SBkYW5zIGpzcDpwbHVnaW4KK2pzcC5lcnJvci5pc2Vfb25fY2xlYXI9SWwgZXN0IGludGVyZGl0IGQnJ3V0aWxpc2VyIGNsZWFyKCkgcXVhbmQgbGEgdGFpbGxlIGRlIHRhbXBvbj09IDAKK2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5iZWFuTm90Rm91bmQ9c2V0UHJvcGVydHk6IGxlIEJlYW4gezB9IGVzdCBpbnRyb3V2YWJsZQoranNwLmVycm9yLmdldHByb3BlcnR5LmJlYW5Ob3RGb3VuZD1nZXRQcm9wZXJ0eTogbGUgQmVhbiB7MH0gZXN0IGludHJvdXZhYmxlCitqc3AuZXJyb3Iuc2V0cHJvcGVydHkuQ2xhc3NOb3RGb3VuZD1zZXRQcm9wZXJ0eTogbGEgQ2xhc3NlIHswfSBlc3QgaW50cm91dmFibGUKK2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5pbnZhbGlkU3ludGF4PXNldFByb3BlcnR5OiBPbiBuZSBwZXV0IGF2b2lyIGRlIHZhbGV1ciBub24gbnVsbGUgcXVhbmQgcHJvcGVydHk9KgoranNwLmVycm9yLnNldHByb3BlcnR5LmJlYW5JbmZvTm90Rm91bmQ9c2V0cHJvcGVydHk6IGJlYW5JbmZvIHBvdXIgbGUgYmVhbiB7MH0gZXN0IGludHJvdXZhYmxlCitqc3AuZXJyb3Iuc2V0cHJvcGVydHkucGFyYW1PclZhbHVlPXNldFByb3BlcnR5OiBwYXJhbSBvdSB2YWx1ZSBkb2l0IOp0cmUgcHLpc2VudAoranNwLmVycm9yLnNldHByb3BlcnR5LmFycmF5VmFsPXNldFByb3BlcnR5OiBvbiBuZSBwZXV0IHJlbnNlaWduZXIgbGVzIGFycmF5IHByb3BlcnR5IHswfSBhdSB0cmF2ZXJzIGQnJ3VuZSB2YWxldXIgY2hh7m5lIGNvbnN0YW50ZSAoc3RyaW5nIGNvbnN0YW50IHZhbHVlKQoranNwLndhcm5pbmcua2VlcGdlbj1BdHRlbnRpb246IFZhbGV1ciBpbmNvcnJlY3RlIHBvdXIgbGUgaW5pdFBhcmFtIGtlZXBnZW5lcmF0ZWQuIFV0aWxpc2F0aW9uIGRlIGxhIHZhbGV1ciBwYXIgZOlmYXV0IFwiZmFsc2VcIgoranNwLndhcm5pbmcuZW5hYmxlUG9vbGluZz1BdHRlbnRpb246IFZhbGV1ciBpbmNvcnJlY3RlIHBvdXIgbGUgaW5pdFBhcmFtIGVuYWJsZVBvb2xpbmcuIFV0aWxpc2F0aW9uIGRlIGxhIHZhbGV1ciBwYXIgZOlmYXV0IFwidHJ1ZVwiCitqc3Aud2FybmluZy5tYXBwZWRGaWxlPUF0dGVudGlvbjogVmFsZXVyIGluY29ycmVjdGUgcG91ciBsZSBpbml0UGFyYW0gbWFwcGVkRmlsZS4gVXRpbGlzYXRpb24gZGUgbGEgdmFsZXVyIHBhciBk6WZhdXQgXCJmYWxzZVwiCitqc3Aud2FybmluZy5zZW5kRXJyVG9DbGllbnQ9QXR0ZW50aW9uOiBWYWxldXIgaW5jb3JyZWN0ZSBwb3VyIGxlICBpbml0UGFyYW0gc2VuZEVyclRvQ2xpZW50LiBVdGlsaXNhdGlvbiBkZSBsYSB2YWxldXIgcGFyIGTpZmF1dCBcImZhbHNlXCIKK2pzcC53YXJuaW5nLmNsYXNzRGVidWdJbmZvPUF0dGVudGlvbjogVmFsZXVyIGluY29ycmVjdGUgcG91ciBsZSBpbml0UGFyYW0gY2xhc3NkZWJ1Z2luZm8uIFV0aWxpc2F0aW9uIGRlIGxhIHZhbGV1ciBwYXIgZOlmYXV0IFwiZmFsc2VcIgoranNwLndhcm5pbmcuY2hlY2tJbnRlcnZhbD1BdHRlbnRpb246IFZhbGV1ciBpbmNvcnJlY3RlIHBvdXIgbGUgaW5pdFBhcmFtIGNoZWNrSW50ZXJ2YWwuIFV0aWxpc2F0aW9uIGRlIGxhIHZhbGV1ciBwYXIgZOlmYXV0IFwiMzAwXCIgc2Vjb25kZXMKK2pzcC53YXJuaW5nLmRldmVsb3BtZW50PUF0dGVudGlvbjogVmFsZXVyIGluY29ycmVjdGUgcG91ciBsZSBpbml0UGFyYW0gZGV2ZWxvcG1lbnQuIFV0aWxpc2F0aW9uIGRlIGxhIHZhbGV1ciBwYXIgZOlmYXV0IFwidHJ1ZVwiCitqc3Aud2FybmluZy5yZWxvYWRpbmc9QXR0ZW50aW9uOiBWYWxldXIgaW5jb3JyZWN0ZSBwb3VyIGxlIGluaXRQYXJhbSByZWxvYWRpbmcuIFV0aWxpc2F0aW9uIGRlIGxhIHZhbGV1ciBwYXIgZOlmYXV0IFwidHJ1ZVwiCitqc3Aud2FybmluZy5yZWxvYWRpbmc9Citqc3AuZXJyb3IuYmFkdGFnbGliPUltcG9zc2libGUgZCcnb3V2cmlyIGxlIHRhZ2xpYnJhcnkgezB9IDogezF9Citqc3AuZXJyb3IuYmFkR2V0UmVhZGVyPUltcG9zc2libGUgZGUgY3LpZXIgdW4gbGVjdGV1ciAocmVhZGVyKSBxdWFuZCBsZSBmbHV4IG4nJ3V0aWxzZSBwYXMgZGVzIHRhbXBvbnMgKG5vdCBidWZmZXJlZCkKK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi5UTEQ9QXR0ZW50aW9uOiBFbOltZW50IGluY29ubnUgezB9IGRhbnMgbGUgVExECitqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4udGFnPUF0dGVudGlvbjogRWzpbWVudCBpbmNvbm51IHswfSBkYW5zIGxlIHRhZworanNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLnRhZ2ZpbGU9QXR0ZW50aW9uOiBFbD9tZW50IGluY29ubnUgezB9IGRhbnMgbGUgdGFnLWZpbGUKK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi5hdHRyaWJ1dGU9QXR0ZW50aW9uOiBFbOltZW50IGluY29ubnUgezB9IGRhbnMgbCcnYXR0cmlidXRlCitqc3AuZXJyb3IubW9yZS50aGFuLm9uZS50YWdsaWI9cGx1cyBkJyd1biB0YWdsaWIgZGFucyBsZSBUTEQ6IHswfQoranNwLmVycm9yLnRlaWNsYXNzLmluc3RhbnRpYXRpb249SW1wb3NzaWJsZSBkZSBjaGFyZ2VyIG91IGQnJ2luc3RhbmNpZXIgbGEgY2xhc3NlIFRhZ0V4dHJhSW5mbzogezB9Citqc3AuZXJyb3Iubm9uX251bGxfdGVpX2FuZF92YXJfc3ViZWxlbXM9TGUgdGFnIHswfSBwb3Nz6GRlIHVuZSBvdSBwbHVzaWV1cnMgdmFyaWFibGVzIHN1YmVsZW1lbnRzIGV0IHVuZSBjbGFzc2UgVGFnRXh0cmFJbmZvIHF1aSByZXRvdXJuZSB1bmUgb3UgcGx1c2lldXJzIFZhcmlhYmxlSW5mbworanNwLmVycm9yLnBhcnNlLmVycm9yLmluLlRMRD1FcnJldXIgZCcn6XZhbHVhdGlvbiAocGFyc2UpIGRhbnMgbGUgZGVzY3JpcHRldXIgZGUgbGlicmFpcmllIGRlIHRhZyAoVExEKTogezB9Citqc3AuZXJyb3IudW5hYmxlLnRvLm9wZW4uVExEPUltcG9zc2libGUgZCcnb3V2cmlyIGxlIGRlc2NyaXB0ZXVyIGRlIGxpYnJhaXJpZSBkZSB0YWcgKFRMRCk6IHswfQoranNwLmJ1ZmZlci5zaXplLnplcm89VGFpbGxlIGR1IHRhbXBvbiA8PSAwCitqc3AuZXJyb3IuZmlsZS5ub3QuZm91bmQ9TGUgZmljaGllciBcInswfVwiIG4nJ2EgcGFzIOl06SB0cm91dukKK2pzcC5tZXNzYWdlLmNvcHlpbmd1cmk9Q29waWUgZGUgezB9IGRhbnMgezF9Citqc3AubWVzc2FnZS5odG1sY29tbWVudD1cbkVmZmFjZW1lbnQgZGVzIGNvbW1lbnRhaXJlczogXHR7MH0KK2pzcC5tZXNzYWdlLmhhbmRsaW5nX2RpcmVjdGl2ZT1cbkRpcmVjdGl2ZSBkZSBnZXN0aW9uIChoYW5kbGluZyk6IHswfVx0ezF9Citqc3AubWVzc2FnZS5oYW5kbGluZ19wbHVnaW49XG5QbHVnaW46IHswfQoranNwLm1lc3NhZ2UucGFja2FnZV9uYW1lX2lzPUxlIG5vbSBkZSBwYWNrYWdlIGVzdDogezB9Citqc3AubWVzc2FnZS5jbGFzc19uYW1lX2lzPUxlIG5vbSBkZSBjbGFzc2UgZXN0OiB7MH0KK2pzcC5tZXNzYWdlLmphdmFfZmlsZV9uYW1lX2lzPUxlIG5vbSBkZSBmaWNoaWVyIEphdmEgZXN0OiB7MH0KK2pzcC5tZXNzYWdlLmNsYXNzX2ZpbGVfbmFtZV9pcz1MZSBub20gZGUgZmljaGllciBDbGFzcyBlc3Q6IHswfQoranNwLm1lc3NhZ2UuYWNjZXB0ZWQ9QWNjZXB06SB7MH0g4CB7MX0KK2pzcC5tZXNzYWdlLmFkZGluZ19qYXI9QWpvdXQgZHUgamFyIHswfSDgIG1vbiBjbGFzc3BhdGgKK2pzcC5tZXNzYWdlLmNvbXBpbGluZ193aXRoPUNvbXBpbGF0aW9uIGF2ZWM6IHswfQoranNwLm1lc3NhZ2UudGVtcGxhdGVfdGV4dD10ZXh0ZSB0ZW1wbGF0ZQoranNwLmVycm9yLm1pc3NpbmdfYXR0cmlidXRlPUQnJ2FwcuhzIGxlIFRMRCBsJydhdHRyaWJ1dCB7MH0gZXN0IG9ibGlnYXRvaXJlIHBvdXIgbGUgdGFnIHsxfQoranNwLmVycm9yLmJhZF9hdHRyaWJ1dGU9TCcnYXR0cmlidXQgezB9IGVzdCBpbmNvcnJlY3QgcG91ciBsZSB0YWcgezF9IGQnJ2FwcuhzIGxhIFRMRCBpbmRpcXXpZQoranNwLmVycm9yLndlYnhtbF9ub3RfZm91bmQ9SW1wb3NzaWJsZSBkZSBsb2NhbGlzZXIgbGUgZmljaGllciB3ZWIueG1sCitqc3AuY21kX2xpbmUudXNhZ2U9VXNhZ2U6IGpzcHRvc2VydmxldCBbLWRkIDxwYXRoL3RvL291dHB1dERpcmVjdG9yeT5dIFsta2VlcGdlbmVyYXRlZF0gXAorPC5qc3AgZmlsZXM+Citqc3AubWVzc2FnZS5jcF9pcz1MZSBDbGFzc3BhdGggezB9IGVzdDogezF9Citqc3AuZXJyb3IudW5hYmxlLnRvX2xvYWRfdGFnaGFuZGxlcl9jbGFzcz1JbXBvc3NpYmxlIGRlIGNoYXJnZXIgbGEgY2xhc3NlIGdlc3Rpb25uYWlyZSBkZSB0YWcgezB9IGNhciB7MX0KK2pzcC5lcnJvci51bmFibGUudG9fZmluZF9tZXRob2Q9SW1wb3NzaWJsZSBkZSB0cm91dmVyIHVuZSBt6XRob2RlIGRlIG1pc2Ug4CBqb3VyIHBvdXIgbCcnYXR0cmlidXQ6IHswfQoranNwLmVycm9yLnVuYWJsZS50b19jb252ZXJ0X3N0cmluZz1JbXBvc3NpYmxlIGRlIGNvbnZlcnRpciB1bmUgY2hh7m5lIHZlcnMgezB9IHBvdXIgbCcnYXR0cmlidXQgezF9Citqc3AuZXJyb3IudW5hYmxlLnRvX2ludHJvc3BlY3Q9SW1wb3NzaWJsZSBkJydpbnRyb3NwZWN0ZXIgbGEgY2xhc3NlIGdlc3Rpb25uYWlyZSBkZSB0YWcgOiB7MH0gY2FyIHsxfQoranNwLmVycm9yLmJhZF90YWc9QXVjdW4gdGFnIHswfSBkYW5zIGxhIGxpYnJhaXJpZSBkZSB0YWcgaW1wb3J06WUgYXZlYyBsZSBwculmaXhlIHsxfQoranNwLmVycm9yLmJhZF9zdHJpbmdfQ2hhcmFjdGVyPUltcG9zc2libGUgZCcnZXh0cmFpcmUgdW4gY2FyYWN06HJlIGRlcHVpcyB1biB0YWJsZWF1IHZpZGUKK2pzcC5lcnJvci5iYWRfc3RyaW5nX2NoYXI9SW1wb3NzaWJsZSBkJydleHRyYWlyZSB1biBjYXJhY3TocmUgZGVwdWlzIHVuIHRhYmxlYXUgdmlkZQoranNwLndhcm5pbmcuY29tcGlsZXIuY2xhc3MuY2FudGNyZWF0ZT1JbXBvc3NpYmxlIGRlIGNy6WVyIHVuZSBpbnN0YW5jZSBkZSBjbGFzc2UgcGx1Z2luIHBvdXIgbGUgY29tcGlsYXRldXIgaW5kaXF16SB7MH0gZHVlIHRvIHsxfS4gVXRpbGlzYXRpb24gcGFyIGTpZmF1dCBkdSBDb21waWxhdGV1ciBKYXZhIFN1bi4KK2pzcC53YXJuaW5nLmNvbXBpbGVyLmNsYXNzLm5vdGZvdW5kPUxhIGNsYXNzZSBwbHVnaW4gZGUgY29tcGlsYXRldXIgezB9IGVzdCBpbnRyb3V2YWJsZS4gVXRpbGlzYXRpb24gcGFyIGTpZmF1dCBkdSBDb21waWxhdGV1ciBKYXZhIFN1bi4KK2pzcC53YXJuaW5nLmNvbXBpbGVyLnBhdGgubm90Zm91bmQ9bGUgY2hlbWluIGRlIGNvbXBpbGF0ZXVyIGluZGlxdekgezB9IGVzdCBpbnRyb3V2YWJsZS4gVXRpbGlzYXRpb24gcGFyIGTpZmF1dCBkdSBjaGVtaW4gc3lzdOhtZSAoc3lzdGVtIFBBVEgpLgoranNwLmVycm9yLmpzcGMudXJpcm9vdF9ub3RfZGlyPUwnJ29wdGlvbiAtdXJpcm9vdCBkb2l0IGluZGlxdekgdW4gculwZXJ0b2lyZSBk6WrgIGV4aXN0YW50Citqc3BjLmltcGxpY2l0LnVyaVJvb3Q9dXJpUm9vdCBy6Wds6SBpbXBsaWNpdGVtZW50IOAgInswfSIKK2pzcGMudXNhZ2U9VXNhZ2U6IGpzcGMgPG9wdGlvbnM+IFstLV0gPGZpY2hpZXJzIGpzcD5cblwKK2/5IGxlcyBmaWNoaWVycyBqc3Agc29udCBuJydpbXBvcnRlIHF1ZWwgbm9tYnJlIGRlOlxuXAorXCAgICA8ZmlsZT4gICAgICAgICBVbiBmaWNoaWVyIOAg6XZhbHVlciAocGFyc2VyKSBjb21tZSBwYWdlIGpzcFxuXAorXCAgICAtd2ViYXBwIDxkaXI+ICBVbiBy6XBlcnRvaXJlIGNvbnRlbmFudCB1bmUgYXBwbGljYXRpb24gd2ViLCB0b3V0ZXMgbGVzIHBhZ2VzIGpzcFxuXAorXCAgICAgICAgICAgICAgICAgICBzZXJvbnQgculjdXJzaXZlbWVudCDpdmFsdellc1xuXAorb/kgbGVzIG9wdGlvbnMgY29tcHJlbm5ldDpcblwKK1wgICAgLXEgICAgICAgICAgTW9kZSBzaWxlbmNpZXV4IChpZGVudGlxdWUg4CAtdjApXG5cCitcICAgIC12WyNdICAgICAgIE1vZGUgYmF2YXJkIChMZSBub21icmUgb3B0aW9ubmVsIGluZGlxdWUgbGUgbml2ZWF1LCAyIHBhciBk6WZhdXQpXG5cCitcICAgIC1kIDxkaXI+ICAgIERvc3NpZXIgZGUgc29ydGllXG5cCitcICAgIC1kZCA8ZGlyPiAgIERvc3NpZXIgZGUgc29ydGllIGxpdGVyYWwuICAoTGVzIGRvc3NpZXJzIGRlIHBhcXVldHMgbmUgc2Vyb250IHBhcyBjb25zdHJ1aXRzKVxuXAorXCAgICAtbCAgICAgICAgICBTb3J0aWUgZHUgbm9tIGxhIHBhZ2UgSlNQIGVuIGNhcyBkJyfpY2hlY1xuXAorXCAgICAtcyAgICAgICAgICBTb3J0aWUgZHUgbm9tIGxhIHBhZ2UgSlNQIGVuIGNhcyBkZSBzdWNj6HNcblwKK1wgICAgLXAgPG5hbWU+ICAgTm9tIGR1IHBhcXVldCBjaWJsZVxuXAorXCAgICAtYyA8bmFtZT4gICBOb20gZCd1biBub20gZGUgY2xhc3NlIGNpYmxlXG5cCitcICAgICAgICAgICAgICAgIChzJydhcHBsaXF1ZSBzZXVsZW1lbnQg4CBsYSBwcmVtaehyZSBwYWdlIEpTUClcblwKK1wgICAgLW1hcHBlZCAgICAgR+lu6HJlIGRlcyBhcHBlbHMg4CB3cml0ZSgpIHPpcGFy6XMgcG91ciBjaGFxdWUgbGlnbmUgSFRNTCBkYW5zIGxhIEpTUFxuXAorXCAgICAtZGllWyNdICAgICBH6W7ocmUgdW4gY29kZSBkJydlcnJldXIgZGUgcmV0b3VyICgjKSBlbiBjYXMgZCcnZXJyZXVycyBmYXRhbGVzLlxuXAorXCAgICAgICAgICAgICAgICBTaSBsZSBub21icmUgZXN0IGFic2VudCBvdSBub24gbnVt6XJpcXVlLCBsZSBk6WZhdXQgZXN0IDEuXG5cCitcICAgIC11cmliYXNlIDxkaXI+ICBMZSBy6XBlcnRvaXJlIHVyaSBkZSBjb21waWxhdGlvbnMgcmVsYXRpZlxuXAorXCAgICAgICAgICAgICAgICAgICAgKFBhciBk6WZhdXQgIi8iKVxuXAorXCAgICAtdXJpcm9vdCA8ZGlyPiAgVGhlIHLpcGVydG9pcmUgcmFjaW5lIGNvbnRyZSBsZXF1ZWwgbGVzIGZpY2hpZXJzIHNlcm9udCBy6XNvbHVzXG5cCitcICAgICAgICAgICAgICAgICAgICAsIChQYXIgZOlmYXV0IGxlIHLpcGVydG9pcmUgZGVwdWlzIGxlcXVlbCBqc3BjIGVzdCBhcHBlbOkpXG5cCitcICAgIC13ZWJpbmMgPGZpbGU+ICBDculhdGlvbiBkJydhc3NvY2lhdGlvbiBwYXJ0aWVsbGUgZGUgc2VydmxldCBwb3VyIGwnJ29wdGlvbiAtd2ViYXBwLlxuXAorXCAgICAtd2VieG1sIDxmaWxlPiAgQ3LpYXRpb24gZCcndW4gZmljaGllciB3ZWIueG1sIGNvbXBsZXQgcG91ciBsJydvcHRpb24gLXdlYmFwcC5cblwKK1wgICAgLWllcGx1Z2luIDxjbHNpZD4gIExlIGNsYXNzaWQgZHUgUGx1Z2luIEphdmEgUGx1Z2luIHBvdXIgSW50ZXJuZXQgRXhwbG9yZXJcblwKK1wgICAgLXNheDIgPGRyaXZlcmNsYXNzbmFtZT4gIExlIG5vbSBkZSBjbGFzc2UgZHUgRHJpdmVyIFNBWCAyLjAg4CB1dGlsaXNlclxuXAorXCAgICAtdHJpbVNwYWNlcyAgICAgICAgVHJpbSBzcGFjZXMgaW4gdGVtcGxhdGUgdGV4dCBiZXR3ZWVuIGFjdGlvbnMsIGRpcmVjdGl2ZXNcblwKK1wgICAgLWphdmFFbmNvZGluZyA8ZW5jPiBTZXQgdGhlIGVuY29kaW5nIGNoYXJzZXQgZm9yIEphdmEgY2xhc3NlcyAoZGVmYXVsdCBVVEYtOClcblwKK1wgICAgLXNvdXJjZSA8dmVyc2lvbj4gICBTZXQgdGhlIC1zb3VyY2UgYXJndW1lbnQgdG8gdGhlIGNvbXBpbGVyIChkZWZhdWx0IDEuNClcblwKK1wgICAgLXRhcmdldCA8dmVyc2lvbj4gICBTZXQgdGhlIC10YXJnZXQgYXJndW1lbnQgdG8gdGhlIGNvbXBpbGVyIChkZWZhdWx0IDEuNClcblwKKworanNwYy53ZWJ4bWwuaGVhZGVyPTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz5cblwKK1xuXAorPCFET0NUWVBFIHdlYi1hcHBcblwKK1wgICAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iXG5cCitcICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiPlxuXAorPCEtLVxuXAorQ3LpZXIgYXV0b21hdGlxdWVtZW50IHBhciBsZSBKc3BDIEFwYWNoZSBKYWthcnRhIFRvbWNhdC5cblwKKy0tPlxuXAorPHdlYi1hcHA+XG5cCitcbgoranNwYy53ZWJ4bWwuZm9vdGVyPVxuXAorPC93ZWItYXBwPlxuXAorXG4KK2pzcGMud2ViaW5jLmhlYWRlcj1cblwKKzwhLS1cblwKK0Ny6WVyIGF1dG9tYXRpcXVlbWVudCBwYXIgbGUgSnNwQyBBcGFjaGUgSmFrYXJ0YSBUb21jYXQuXG5cCitQbGFjZXogY2UgZnJhZ21lbnQgZGFucyBsZSBmaWNoaWVyIHdlYi54bWwgYXZhbnQgYWxsIGljb24sIGRpc3BsYXktbmFtZSxcblwKK2Rlc2NyaXB0aW9uLCBkaXN0cmlidXRhYmxlLCBhbmQgY29udGV4dC1wYXJhbSBlbGVtZW50cy5cblwKKy0tPlxuCitqc3BjLndlYmluYy5mb290ZXI9XG5cCis8IS0tXG5cCitBbGwgc2Vzc2lvbi1jb25maWcsIG1pbWUtbWFwcGluZywgd2VsY29tZS1maWxlLWxpc3QsIGVycm9yLXBhZ2UsIHRhZ2xpYixcblwKK3Jlc291cmNlLXJlZiwgc2VjdXJpdHktY29uc3RyYWludCwgbG9naW4tY29uZmlnLCBzZWN1cml0eS1yb2xlLFxuXAorZW52LWVudHJ5LCBhbmQgZWpiLXJlZiBlbGVtZW50cyBzaG91bGQgZm9sbG93IHRoaXMgZnJhZ21lbnQuXG5cCistLT5cbgoranNwYy5lcnJvci5qYXNwZXJFeGNlcHRpb249ZXJyZXVyLWxlIGZpY2hpZXIgJyd7MH0nJyBhIGfpbuly6SBsJydleGNlcHRpb24gZCcn6XZhbHVhdGlvbiBzdWl2YW50ZTogezF9Citqc3BjLmVycm9yLmdlbmVyYWxFeGNlcHRpb249RVJSRVVSLWxlIGZpY2hpZXIgJyd7MH0nJyBhIGfpbuly6SBsJydleGNlcHRpb24gZ+lu6XJhbGUgc3VpdmFudGU6Citqc3BjLmVycm9yLmZpbGVEb2VzTm90RXhpc3Q9TCcnYXJndW1lbnQgZmljaGllciAnJ3swfScnIG4nJ2V4aXN0ZSBwYXMKK2pzcGMuZXJyb3IuZW1wdHlXZWJBcHA9LXdlYmFwcCBu6WNlc3NpdGUg4CBzYSBzdWl0ZSB1biBhcmd1bWVudCBmaWNoaWVyCitqc3AuZXJyb3IubGlicmFyeS5pbnZhbGlkPUxhIHBhZ2UgSlNQIHBhZ2UgZXN0IGluY29ycmVjdGUgZCcnYXBy6HMgbGEgbGlicmFpcmllIHswfTogezF9Citqc3AuZXJyb3IudGx2Y2xhc3MuaW5zdGFudGlhdGlvbj1JbXBvc3NpYmxlIGRlIGNoYXJnZXIgb3UgZCcnaW5zdGFuY2llciBsYSBjbGFzc2UgVGFnTGlicmFyeVZhbGlkYXRvcjogezB9Citqc3AuZXJyb3IudGx2LmludmFsaWQucGFnZT1NZXNzYWdlIGQnJ2VycmV1cnMgZGUgdmFsaWRhdGlvbiBwcm92ZW5hbnQgZHUgVGFnTGlicmFyeVZhbGlkYXRvciBwb3VyIHswfSBlbiB7MX0KK2pzcC5lcnJvci50ZWkuaW52YWxpZC5hdHRyaWJ1dGVzPU1lc3NhZ2UgZCcnZXJyZXVycyBkZSB2YWxpZGF0aW9uIHByb3ZlbmFudCBkdSBUYWdFeHRyYUluZm8gcG91ciB7MH0KK2pzcC5wYXJzZXIuc2F4LnByb3BlcnR5bm90c3VwcG9ydGVkPVByb3Byael06SBTQVggbm9uIHN1cHBvcnTpZTogezB9Citqc3AucGFyc2VyLnNheC5wcm9wZXJ0eW5vdHJlY29nbml6ZWQ9UHJvcHJp6XTpIFNBWCBub24gcmVjb25udWU6IHswfQoranNwLnBhcnNlci5zYXguZmVhdHVyZW5vdHN1cHBvcnRlZD1Gb25jdGlvbm5hbGl06SBTQVggbm9uIHN1cHBvcnTpZTogezB9Citqc3AucGFyc2VyLnNheC5mZWF0dXJlbm90cmVjb2duaXplZD1Gb25jdGlvbm5hbGl06SBTQVggbm9uIHJlY29ubnVlOiB7MH0KK2pzcC5lcnJvci5uby5tb3JlLmNvbnRlbnQ9RmluIGRlIGNvbnRlbnUgYWxvcnMgcXVlIGwnJ+l2YWx1dGlvbiBuJyfpdGFpdCBwYXMgdGVybWlu6WU6IGVycmV1ciBkZSB0YWdzIGltYnJpcXXpcz8KK2pzcC5lcnJvci5wYXJzZS54bWw9RXJyZXVyIGQnJ+l2YWx1YXRpb24gWE1MIHN1ciBsZSBmaWNoaWVyIHswfQoranNwLmVycm9yLnBhcnNlLnhtbC5saW5lPUVycmV1ciBkJyfpdmFsdWF0aW9uIFhNTCBzdXIgbGUgZmljaGllciAgezB9OiAobGlnbmUgezF9LCBjb2wgezJ9KQoranNwLmVycm9yLnBhcnNlLnhtbC5zY3JpcHRpbmcuaW52YWxpZC5ib2R5PUxlIGNvcnBzIGRlIGwnJ+ls6W1lbnQgezB9IG5lIGRvaXQgY29udGVuaXIgYXVjdW4g6WzpbWVudHMgWE1MCitqc3AuZXJyb3IuaW50ZXJuYWwudGxkaW5pdD1FeGNlcHRpb24gbG9ycyBkZSBsJ2luaXRpYWxpc2F0aW9uIGRlIFRsZExvY2F0aW9uc0NhY2hlOiB7MH0KK2pzcC5lcnJvci5pbnRlcm5hbC5maWxlbm90Zm91bmQ9RXJyZXVyIGludGVybmU6IEZpY2hpZXIgezB9IGludHJvdXZhYmxlCitqc3AuZXJyb3IuaW50ZXJuYWwuZXZhbHVhdG9yX25vdF9mb3VuZD1FcnJldXIgaW50ZXJuZTogSW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGwnJ+l2YWx1YXRldXIgZCcnZXhwcmVzc2lvbgoranNwLmVycm9yLnBhcnNlLnhtbC5pbnZhbGlkUHVibGljSWQ9UFVCTElDIElEIGludmFsaWRlOiB7MH0KK2pzcC5lcnJvci5pbmNsdWRlLmZsdXNoLmludmFsaWQudmFsdWU9VmFsZXVyIGluY29ycmVjdGUgcG91ciBsJydhdHRyaWJ1dCBmbHVzaDogezB9Citqc3AuZXJyb3IudW5zdXBwb3J0ZWQuZW5jb2Rpbmc9RW5jb2RhZ2Ugbm9uIHN1cHBvcnTpOiB7MH0KK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi52YXJpYWJsZT1BdHRlbnRpb246IEVsZW1lbnQgaW5jb25udSB7MH0gZGFucyBsYSB2YXJpYWJsZQordGxkLmVycm9yLnZhcmlhYmxlTm90QWxsb3dlZD1DZWNpIGVzdCB1bmUgZXJyZXVyIHBvdXIgbGUgdGFnIHF1aSBwb3Nz6GRlIHVuZSBvdSBwbHVzaWV1cnMgdmFyaWFibGVzIHN1YmVsZW1lbnRzIHBvdXIgYXZvaXIgdW5lIGNsYXNzZSBUYWdFeHRyYUluZm8gcXVpIHJldG91cm5lIHVuIG9iamV0IG5vbi1udWwuCitqc3AuZXJyb3IudGxkSW5XZWJEb3RYbWxOb3RGb3VuZD1OZSBwZXV0IHRyb3V2ZXIgbGUgVExEIHsxfSBwb3VyIGwnJ1VSSSB7MH0gaW5kaXF16WUgZGFucyBsZSBmaWNoaWVyIHdlYi54bWwKK2pzcC5lcnJvci50YWdsaWJEaXJlY3RpdmUuYWJzVXJpQ2Fubm90QmVSZXNvbHZlZD1MJyd1cmkgYWJzb2x1ZTogezB9IG5lIHBldXQg6nRyZSBy6XNvbHUgZGFucyBsZSBmaWNoaWVyIHdlYi54bWwgb3UgZGFucyBsZXMgZmljaGllcnMgamFyIGTpcGxveelzIGF2ZWMgY2V0dGUgYXBwbGljYXRpb24KK2pzcC5lcnJvci50YWdsaWJEaXJlY3RpdmUubWlzc2luZy5sb2NhdGlvbj1OaSBsJyd1cmknIG5pIGwnJ2F0dHJpYnV0ICd0YWdkaXInIG4nJ29udCDpdOkgaW5kaXF16XMgZGFucyBsYSBkaXJlY3RpdmUgdGFnbGliCitqc3AuZXJyb3IuaW52YWxpZC50YWdkaXI9TGUgculwZXJ0b2lyZSBkdSBmaWNoaWVyIFRhZyB7MH0gbmUgY29tbWVuY2UgcGFzIHBhciBcIi9XRUItSU5GL3RhZ3NcIgoranNwLmVycm9yLnVudGVybWluYXRlZC51c2VyLnRhZz1UYWcgdXNlci1kZWZpbmVkIG5vbiB0ZXJtaW7pOiBMZSB0YWcgZGUgZmVybWV0dXJlIHswfSBlc3QgaW50cm91dmFibGUgZm91bmQgb3UgaW5jb3JyZWN0ZW1lbnQgaW1icmlxdekKKyNqc3B4LmVycm9yLnRlbXBsYXRlRGF0YU5vdEluSnNwQ2RhdGE9RXJyZXVyIGRlIHZhbGlkYXRpb246IGwnJ+ls6W1lbnQgJmx0O3swfSZndDsgbmUgcGV1dCBhdm9pciBkZSBkb25u6WVzIHRlbXBsYXRlLiBMZXMgZG9ubullcyBUZW1wbGF0ZSBkb2l2ZW50IOp0cmUgZW5jYXBzdWzpZXMg4CBsJydpbnTpcmlldXIgZCcndW4g6WzpbWVudCAmbHQ7anNwOmNkYXRhJmd0Oy4gW0pTUDEuMiBQRkQgc2VjdGlvbiA1LjEuOV1cbkRvbm7pZSBUZW1wbGF0ZSBlbiBlcnJldXI6IHsxfQoranNweC5lcnJvci50ZW1wbGF0ZURhdGFOb3RJbkpzcENkYXRhPUVycmV1ciBkZSB2YWxpZGF0aW9uOiBsJyfpbOltZW50ICZsdDt7MH0mZ3Q7IG5lIHBldXQgYXZvaXIgZGUgZG9ubullcyB0ZW1wbGF0ZS4gTGVzIGRvbm7pZXMgVGVtcGxhdGUgZG9pdmVudCDqdHJlIGVuY2Fwc3Vs6WVzIOAgbCcnaW506XJpZXVyIGQnJ3VuIOls6W1lbnQgJmx0O2pzcDp0ZXh0Jmd0Oy4gW0pTUDEuMiBQRkQgc2VjdGlvbiA1LjEuOV1cbkRvbm7pZSBUZW1wbGF0ZSBlbiBlcnJldXI6IHsxfQorI0VycmV1ciBsb3JzIGR1IHRyYWl0ZW1lbnQgZHUgZmljaGllciBqYXIgZGUgbGEgdGFnbGliIHswfTogezF9Citqc3AuZXJyb3IudGFnbGliLnJlc2VydmVkLnByZWZpeD1MZSBwculmaXhlIHRhZ2xpYiB7MH0gZXN0IHLpc2VydukKK2pzcC5lcnJvci5pbnZhbGlkLmphdmFFbmNvZGluZz1FbmNvZGFnZSBqYXZhIGluY29ycmVjdC4gRXNzYWkgZGUgezB9IHB1aXMgZGUgezF9LiBMZXMgZGV1eCBvbnQg6WNob3XpLgoranNwLmVycm9yLm5lZWRBbHRlcm5hdGVKYXZhRW5jb2Rpbmc9TCcnZW5jb2RhZ2UgamF2YSBwYXIgZOlmYXV0IHswfSBlc3QgaW5jb3JyZWN0IHN1ciB2b3RyZSBlbnZpcm9ubmVtZW50IGphdmEuIFVuZSBhbHRlcm5hdGl2ZSBwZXV0IOp0cmUgaW5kaXF16WUgdmlhIGxlIHBhcmFt6nRyZSAnamF2YUVuY29kaW5nJyBkZSBsYSBKc3BTZXJ2bGV0LgorI0VycmV1ciBsb3JzIGRlIGxhIGNvbXBpbGF0aW9uLCB1dGlsaXPpIHBvdXIgbGEgbGlnbmUganNwIGRlcyBtZXNzYWdlcyBkJydlcnJldXIKK2pzcC5lcnJvci5zaW5nbGUubGluZS5udW1iZXI9VW5lIGVycmV1ciBzJydlc3QgcHJvZHVpdGUg4CBsYSBsaWduZTogezB9IGRhbnMgbGUgZmljaGllciBqc3A6IHsxfQoranNwLmVycm9yLm11bHRpcGxlLmxpbmUubnVtYmVyPVxuXG5VbmUgZXJyZXVyIHMnJ2VzdCBwcm9kdWl0ZSBlbnRyZSBsZXMgbGlnbmVzOiB7MH0gZXQgezF9IGRhbnMgbGUgZmljaGllciBqc3A6IHsyfVxuXG4KK2pzcC5lcnJvci5jb3JyZXNwb25kaW5nLnNlcnZsZXQ9RXJyZXVyIGRlIHNlcnZsZXQgZ+lu6XLpZTpcbgoranNwLmVycm9yLmVtcHR5LmJvZHkubm90LmFsbG93ZWQ9VW4gY29ycHMgdmlkZSBuJ2VzdCBwYXMgYXV0b3Jpc+kgcG91ciB7MH0KK2pzcC5lcnJvci5qc3Bib2R5LnJlcXVpcmVkPURvaXQgdXRpbGlzZXIganNwOmJvZHkgcG91ciBpbmRpcXXpIGxlIGNvcnBzIGRlIHRhZyBib2R5IGRlIHswfSBzaSBqc3A6YXR0cmlidXRlIGVzdCB1dGlsaXPpLgoranNwLmVycm9yLmpzcGJvZHkuZW1wdHlib2R5Lm9ubHk9TGUgdGFnIHswfSBuZSBwZXV0IGF2b2lyIHF1ZSBqc3A6YXR0cmlidXRlIGRhbnMgc29uIGNvcnBzLgoranNwLmVycm9yLm5vLnNjcmlwdGxldHM9TGVzIOls6W1lbnRzIGRlIFNjcmlwdGluZyAoIDwlISwgPGpzcDpkZWNsYXJhdGlvbiwgPCU9LCA8anNwOmV4cHJlc3Npb24sIDwlLCA8anNwOnNjcmlwdGxldCApIG5lIHNvbnQgcGFzIGF1dG9yaXPpcyBpY2kuCitqc3AuZXJyb3IuaW50ZXJuYWwudW5leHBlY3RlZF9ub2RlX3R5cGU9RXJyZXVyIEludGVybmU6IFR5cGUgZGUgbm9kZSBpbmF0dGVuZHUgcmVuY29udHLpCitqc3AuZXJyb3IudGxkLmZuLmludmFsaWQuc2lnbmF0dXJlPVN5bnRoYXhlIGludmFsaWRlIHBvdXIgbGEgc2lnbmF0dXJlIGRlIGZvbmN0aW9uIGRhbnMgbGEgVExELiAgTGlicmFpcmllIGRlIFRhZyA6IHswfSwgRm9uY3Rpb246IHsxfQoranNwLmVycm9yLnRsZC5mbi5pbnZhbGlkLnNpZ25hdHVyZS5jbGFzc25vdGZvdW5kPVN5bnRoYXhlIGludmFsaWRlIHBvdXIgbGEgc2lnbmF0dXJlIGRlIGZvbmN0aW9uIGRhbnMgbGEgVExELiAgQ2xhc3NlIGludHJvdXZhYmxlOiAkezB9LiAgTGlicmFpcmllIGRlIFRhZzogezF9LCBGb25jdGlvbjogezJ9LgoranNwLmVycm9yLnRsZC5mbi5pbnZhbGlkLnNpZ25hdHVyZS5jb21tYWV4cGVjdGVkPVN5bnRoYXhlIGludmFsaWRlIHBvdXIgbGEgc2lnbmF0dXJlIGRlIGZvbmN0aW9uIGRhbnMgbGEgVExELiAgVmlyZ3VsZSAnLCcgYXR0ZW5kdWUuICBMaWJyYWlyaWUgZGUgVGFnOiB7MH0sIEZvbmN0aW9uOiB7MX0uCitqc3AuZXJyb3IudGxkLmZuLmludmFsaWQuc2lnbmF0dXJlLnBhcmVuZXhwZWN0ZWQ9U3ludGhheGUgaW52YWxpZGUgcG91ciBsYSBzaWduYXR1cmUgZGUgZm9uY3Rpb24gZGFucyBsYSBUTEQuICBQYXJlbnRo6HNlICcoJyBhdHRlbmR1ZS4gIExpYnJhaXJpZSBkZSBUYWc6IHswfSwgRm9uY3Rpb246IHsxfS4KK2pzcC5lcnJvci5keW5hbWljLmF0dHJpYnV0ZXMubm90LmltcGxlbWVudGVkPUxlIHRhZyB7MH0gaW5kaXF1ZSBxdScnaWwgYWNjZXB0ZSBkZXMgYXR0cmlidXRzIGR5bmFtaWNzIG1haXMgbicnaW1wbOltZW50ZSBwYXMgbCcnaW50ZXJmYWNlIHJlcXVpc2UKK2pzcC5lcnJvci5ub21hdGNoaW5nLmZyYWdtZW50PU5lIHBldXQgdHJvdXZlciB1bmUgZGlyZWN0aXZlIGF0dHJpYnV0IChhdmVjIHBvdXIgbm9tPXswfSBldCBmcmFnbWVudD10cnVlKSBhdmFudCBsYSBkaXJlY3RpdmUgZnJhZ21lbnQuCitqc3AuZXJyb3IuYXR0cmlidXRlLm5vZXF1YWw9U3ltYm9sZSDpZ2FsIChlcXVhbCkgYXR0ZW5kdQoranNwLmVycm9yLmF0dHJpYnV0ZS5ub3F1b3RlPVN5bWJvbGUgZ3VpbGxlbWV0IChxdW90ZSkgYXR0ZW5kdQoranNwLmVycm9yLmF0dHJpYnV0ZS51bnRlcm1pbmF0ZWQ9TCcnYXR0cmlidXQgcG91ciB7MH0gbicnZXN0IHBhcyBjb3JyZWN0ZW1lbnQgdGVybWlu6QoranNwLmVycm9yLm1pc3NpbmcudGFnSW5mbz1MJydvYmpldCBUYWdJbmZvIGRlIHswfSBlc3QgYWJzZW50IGRlIGxhIFRMRAoranNwLmVycm9yLmZyYWdtZW50d2l0aHR5cGU9T24gbmUgcGV1dCBpbmRpcXVlciDgIGxhIGZvaXMgbGVzIGF0dHJpYnV0cyAnZnJhZ21lbnQnIGV0ICd0eXBlJy4gIFNpICdmcmFnbWVudCcgZXN0IHBy6XNlbnQsICd0eXBlJyBlc3QgZml46SBjb21tZSAnamF2YXguc2VydmxldC5qc3AudGFnZXh0LkpzcEZyYWdtZW50JworanNwLmVycm9yLmZyYWdtZW50d2l0aHJ0ZXhwcnZhbHVlPU9uIG5lIHBldXQgaW5kaXF1ZXIg4CBsYSBmb2lzIGxlcyBhdHRyaWJ1dHMgJ2ZyYWdtZW50JyBldCAncnRleHBydmFsdWUnLiAgU2kgJ2ZyYWdtZW50JyBlc3QgcHLpc2VudCwgJ3J0ZXhwcnZhbHVlJyBlc3QgZml46SDgICd0cnVlJworanNwLmVycm9yLmZyYWdtZW50V2l0aERlY2xhcmVPclNjb3BlPUxlcyBhdHRyaWJ1dHMgJ2ZyYWdtZW50JyBldCAnZGVjbGFyZScgb3UgJ3Njb3BlJyBzb250IGluZGlxdelzIGRhbnMgbGEgZGlyZWN0aXZlIHZhcmlhYmxlCitqc3AuZXJyb3IudmFyX2FuZF92YXJSZWFkZXI9QSBsYSBmb2lzICd2YXInIGV0ICd2YXJSZWFkZXInIHNvbnQgaW5kaXF16XMKK2pzcC53YXJuaW5nLmJhZC51cmxwYXR0ZXJuLnByb3BlcnR5Z3JvdXA9TWF1dmFpc2UgdmFsZXVyIHswfSBkYW5zIGxlIHNvdXMt6WzpbWVudCAoc3ViZWxlbWVudCkgdXJsLXBhdHRlcm4gZHUgZmljaGllciB3ZWIueG1sCitqc3AuZXJyb3IudW5rbm93bl9hdHRyaWJ1dGVfdHlwZT1UeXBlIGQnJ2F0dHJpYnV0IGluY29ubnUgKHsxfSkgcG91ciBsJydhdHRyaWJ1dCB7MH0uCitqc3AuZXJyb3IuanNwZWxlbWVudC5taXNzaW5nLm5hbWU9TCcnYXR0cmlidXQgb2JsaWdhdG9pcmUgJ25hbWUnIGVzdCBhYnNlbnQgZGUganNwOmVsZW1lbnQKK2pzcC5lcnJvci54bWxucy5yZWRlZmluaXRpb24ubm90aW1wbGVtZW50ZWQ9RXJyZXVyIEludGVybmU6IFRlbnRhdGl2ZSBkZSByZWTpZmluaXRpb24gZGUgeG1sbnM6ezB9LiAgTGEgcmVk6WZpbml0aW9uIGRlcyBkb21haW5lcyBkZSBub21zIChuYW1lc3BhY2VzKSBuJydlc3QgcGFzIGltcGzpbWVudOllLgoranNwLmVycm9yLmNvdWxkLm5vdC5hZGQudGFnbGlicmFyaWVzPUltcG9zc2libGUgZCcnYWpvdXRlciB1bmUgb3UgcGx1c2lldXJzIGxpYnJhaXJpZXMgZGUgdGFnLgoranNwLmVycm9yLmR1cGxpY2F0ZS5uYW1lLmpzcGF0dHJpYnV0ZT1MJydhdHRyaWJ1dCB7MH0gaW5kaXF16SBkYW5zIGwnJ2FjdGlvbiBzdGFuZGFyZCBvdSBzcOljaWZpcXVlIChjdXN0b20pIGFwcGFyYWl0IGF1c3NpIGNvbW1lIHZhbGV1ciBkZSBsJydhdHRyaWJ1dCBkZSBub20gZGFucyBsZSBqc3A6YXR0cmlidXRlIGluY2x1cworanNwLmVycm9yLm5vdC5pbi50ZW1wbGF0ZT17MH0gbicnZXN0IHBhcyBhdXRvcmlz6SBkYW5zIGxlIGNvcnBzIGRlIHRleHRlIGRlIHRlbXBsYXRlLgoranNwLmVycm9yLmJhZFN0YW5kYXJkQWN0aW9uPUwnJ2FjdGlvbiBuJydlc3QgcGFzIHJlY29ubnVlIGNvbW1lIHVuZSBhY3Rpb24gc3RhbmRhcmQuCitqc3AuZXJyb3IudGFnZGlyZWN0aXZlLmJhZGJvZHljb250ZW50PUNvbnRlbnUgZGUgY29ycHMgKGJvZHktY29udGVudCkgKHswfSkgaW52YWxpZGUgZGFucyBsYSBkaXJlY3RpdmUgdGFnCitqc3AuZXJyb3IuY29uZmlnX3BhZ2VkaXJfZW5jb2RpbmdfbWlzbWF0Y2g9TCcnZW5jb2RlIGRlIHBhZ2UgKFBhZ2UtZW5jb2RpbmcpIGluZGlxdekgZGFucyBsZSBqc3AtcHJvcGVydHktZ3JvdXAgKHswfSkgZXN0IGRpZmbpcmVudCBkZSBjZWx1aSBpbmRpcXXpIGRhbnMgbGEgZGlyZWN0aXZlIGRlIHBhZ2UgKHsxfSkKK2pzcC5lcnJvci5wcm9sb2dfcGFnZWRpcl9lbmNvZGluZ19taXNtYXRjaD0KK2pzcC5lcnJvci5wcm9sb2dfY29uZmlnX2VuY29kaW5nX21pc21hdGNoPQoranNwLmVycm9yLmF0dHJpYnV0ZS5jdXN0b20ubm9uX3J0X3dpdGhfZXhwcj1EJydhcHLocyBsYSBUTEQsIGwnJ2F0dHJpYnV0IHswfSBuJydhY2NlcHRlIGF1Y3VuZSBleHByZXNzaW9uCitqc3AuZXJyb3Iuc2NyaXB0aW5nLnZhcmlhYmxlLm1pc3NpbmdfbmFtZT1JbmNhcGFibGUgZGUgZOl0ZXJtaW5lciBsZSBub20gZGUgdmFyaWFibGUgc2NyaXB0aW5nIGQnJ2FwcuhzIGwnJ2F0dHJpYnV0IHswfQoramFzcGVyLmVycm9yLmVtcHR5Ym9keWNvbnRlbnQubm9uZW1wdHk9RCcnYXBy6HMgbGEgVExELCBsZSB0YWcgezB9IGRvaXQg6nRyZSB2aWRlLCBtYWlzIG5lIGwnJ2VzdCBwYXMKK2pzcC5lcnJvci50YWdmaWxlLm5hbWVOb3RVbmlxdWU9Citqc3AuZXJyb3IudGFnZmlsZS5uYW1lRnJvbS5ub0F0dHJpYnV0ZT0KK2pzcC5lcnJvci50YWdmaWxlLm5hbWVGcm9tLmJhZEF0dHJpYnV0ZT0KK2pzcC5lcnJvci51c2VCZWFuLm5vU2Vzc2lvbj1JbCBlc3QgaWxs6WdhbCBwb3VyIHVzZUJlYW4gZCcndXRpbGlzZXIgdW5lIHBvcnTpZSBkZSBzZXNzaW9uIChzZXNzaW9uIHNjb3BlKSBxdWFuZCBsYSBwYWdlIEpTUCBpbmRpcXVlICh2aWEgbGEgZGlyZWN0aXZlIGRlIHBhZ2UpIHF1JydlbGxlIG5lIHBhcnRpY2lwZSBwYXMgYXV4IHNlc3Npb25zCitqc3AuZXJyb3IuYXR0cmlidXRlcy5ub3QuYWxsb3dlZCA9IHswfSBuZSBkb2l0IGF2b2lyIGF1Y3VuIGF0dHJpYnV0Citqc3AuZXJyb3IubmVzdGVkLmpzcGF0dHJpYnV0ZT0KK2pzcC5lcnJvci5uZXN0ZWQuanNwYm9keT0KK2pzcC5lcnJvci52YXJpYWJsZS5laXRoZXIubmFtZT0KK2pzcC5lcnJvci52YXJpYWJsZS5ib3RoLm5hbWU9Citqc3AuZXJyb3IudmFyaWFibGUuYWxpYXM9Citqc3AuZXJyb3IuanNwdGV4dC5iYWRjb250ZW50PQoranNwLmVycm9yLnByZWZpeC5yZWZpbmVkPQoranNwLmVycm9yLmpzcG91dHB1dC5jb25mbGljdD0KK2pzcC5lcnJvci5qc3BvdXRwdXQuZG9jdHlwZW5hbWVzeXN0ZW09Citqc3AuZXJyb3IuanNwb3V0cHV0LmRvY3R5cGVwdWxpY3N5c3RlbT0KK2pzcC5lcnJvci5qc3BvdXRwdXQubm9uZW1wdHlib2R5PQoranNwLmVycm9yLmpzcG91dHB1dC5pbnZhbGlkVXNlPQoranNwLmVycm9yLmludmFsaWQuYmVhbj0KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcmVzb3VyY2VzL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDljNTk5OQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcmVzb3VyY2VzL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDA3IEBACisjICRJZCQKKyMKKyMgRGVmYXVsdCBsb2NhbGl6ZWQgc3RyaW5nIGluZm9ybWF0aW9uCisjIExvY2FsaXplZCB0aGlzIHRoZSBEZWZhdWx0IExvY2FsZSBhcyBpcyBqYV9KUAorCitqc3AuZXJyb3IuYmFkLnNlcnZsZXQuZW5naW5lPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOFx1MzBhOFx1MzBmM1x1MzBiOFx1MzBmM1x1MzA2ZVx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1MzA0Y1x1NmI2M1x1MzA1N1x1MzA0Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLm5vLnNjcmF0Y2guZGlyPUpTUFx1MzBhOFx1MzBmM1x1MzBiOFx1MzBmM1x1MzA2Ylx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA2ZXNjcmF0Y2hEaXJcdTMwNGNcdThhMmRcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcCitcbiBcdTMwNTNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNmVzZXJ2bGV0cy5wcm9wZXJ0aWVzXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZiXHUzMDAxXAorXG4gXCJqc3AuaW5pdHBhcmFtcz1zY3JhdGNoZGlyPTxkaXItbmFtZT5cIiBcdTMwOTJcdThmZmRcdTUyYTBcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIKK2pzcC5lcnJvci5iYWQuc2NyYXRjaC5kaXI9XHUzMDQyXHUzMDZhXHUzMDVmXHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDVmc2NyYXRjaERpcjogezB9IFx1MzA2Zlx1NGY3Zlx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLm1lc3NhZ2Uuc2NyYXRjaC5kaXIuaXM9SlNQXHUzMGE4XHUzMGYzXHUzMGI4XHUzMGYzXHUzMDZlU2NyYXRjaGRpcjogezB9Citqc3AubWVzc2FnZS5wYXJlbnRfY2xhc3NfbG9hZGVyX2lzPVx1ODlhYVx1MzBhZlx1MzBlOVx1MzBiOVx1MzBlZFx1MzBmY1x1MzBjMDogezB9Citqc3AubWVzc2FnZS5kb250Lm1vZGlmeS5zZXJ2bGV0cz1cdTkxY2RcdTg5ODE6IFx1NzUxZlx1NjIxMFx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOFx1MzA5Mlx1NTkwOVx1NjZmNFx1MzA1N1x1MzA2Nlx1MzA2Zlx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLm5vdC5pbXBsLmNvbW1lbnRzPVx1NTE4NVx1OTBlOFx1MzBhOFx1MzBlOVx1MzBmYzogQ29tbWVudHNcdTMwNmZcdTViOWZcdTg4YzVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5ub3QuaW1wbC5kaXJlY3RpdmVzPVx1NTE4NVx1OTBlOFx1MzBhOFx1MzBlOVx1MzBmYzogRGlyZWN0aXZlc1x1MzA2Zlx1NWI5Zlx1ODhjNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLm5vdC5pbXBsLmRlY2xhcmF0aW9ucz1cdTUxODVcdTkwZThcdTMwYThcdTMwZTlcdTMwZmM6IERlY2xhcmF0aW9uc1x1MzA2Zlx1NWI5Zlx1ODhjNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLm5vdC5pbXBsLmV4cHJlc3Npb25zPVx1NTE4NVx1OTBlOFx1MzBhOFx1MzBlOVx1MzBmYzogRXhwcmVzc2lvbnNcdTMwNmZcdTViOWZcdTg4YzVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5ub3QuaW1wbC5zY3JpcHRsZXRzPVx1NTE4NVx1OTBlOFx1MzBhOFx1MzBlOVx1MzBmYzogU2NyaXB0bGV0c1x1MzA2Zlx1NWI5Zlx1ODhjNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLm5vdC5pbXBsLnVzZWJlYW49XHU1MTg1XHU5MGU4XHUzMGE4XHUzMGU5XHUzMGZjOiB1c2VCZWFuXHUzMDZmXHU1YjlmXHU4OGM1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iubm90LmltcGwuZ2V0cD1cdTUxODVcdTkwZThcdTMwYThcdTMwZTlcdTMwZmM6IGdldFByb3BlcnR5XHUzMDZmXHU1YjlmXHU4OGM1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iubm90LmltcGwuc2V0cD1cdTUxODVcdTkwZThcdTMwYThcdTMwZTlcdTMwZmM6IHNldFByb3BlcnR5XHUzMDZmXHU1YjlmXHU4OGM1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iubm90LmltcGwucGx1Z2luPVx1NTE4NVx1OTBlOFx1MzBhOFx1MzBlOVx1MzBmYzogcGx1Z2luXHUzMDZmXHU1YjlmXHU4OGM1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iubm90LmltcGwuZm9yd2FyZD1cdTUxODVcdTkwZThcdTMwYThcdTMwZTlcdTMwZmM6IGZvcndhcmRcdTMwNmZcdTViOWZcdTg4YzVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5ub3QuaW1wbC5pbmNsdWRlPVx1NTE4NVx1OTBlOFx1MzBhOFx1MzBlOVx1MzBmYzogaW5jbHVkZVx1MzA2Zlx1NWI5Zlx1ODhjNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnVuYXZhaWxhYmxlPUpTUFx1MzA2Zlx1NTIyOVx1NzUyOFx1NGUwZFx1NTNlZlx1MzA2OFx1MzBkZVx1MzBmY1x1MzBhZlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQoranNwLmVycm9yLnVzZWJlYW4ubWlzc2luZy5hdHRyaWJ1dGU9dXNlQmVhbjogaWRcdTVjNWVcdTYwMjdcdTMwNGNcdTViNThcdTU3MjhcdTMwNTdcdTMwNmFcdTMwNDRcdTMwNGJcdTMwMDFcdTMwYjlcdTMwZGFcdTMwZWJcdTMwZGZcdTMwYjlcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci51c2ViZWFuLm1pc3NpbmcudHlwZT11c2VCZWFuICh7MH0pOiBjbGFzc1x1NWM1ZVx1NjAyN1x1MzA0YnR5cGVcdTVjNWVcdTYwMjdcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDQ6Citqc3AuZXJyb3IudXNlYmVhbi5kdXBsaWNhdGU9dXNlQmVhbjogYmVhbk5hbWVcdTVjNWVcdTYwMjdcdTMwNGNcdTkxY2RcdTg5MDdcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTk6IHswfQoranNwLmVycm9yLnVzZWJlYW4ucHJvaGliaXRlZC5hcy5zZXNzaW9uPVx1NGVlNVx1NTI0ZFx1MzA2Ylx1NWI5YVx1N2ZhOVx1MzA1N1x1MzA1ZkpTUFx1NjMwN1x1NzkzYVx1NWI1MFx1MzA2Ylx1MzA4OFx1MzA2M1x1MzA2Nlx1Nzk4MVx1NmI2Mlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzA2Ylx1MzAwMXNlc3Npb24gYmVhbiB7MH0gXHUzMDY4XHUzMDU3XHUzMDY2XHU0ZjdmXHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzOgoranNwLmVycm9yLnVzZWJlYW4ubm90LmJvdGg9dXNlQmVhbjogY2xhc3NcdTVjNWVcdTYwMjdcdTMwNjhiZWFuTmFtZVx1NWM1ZVx1NjAyN1x1MzA2ZVx1NGUyMVx1NjViOVx1MzA5Mlx1NTQwY1x1NjY0Mlx1MzA2Ylx1NjMwN1x1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzoKK2pzcC5lcnJvci51c2ViZWFuLmJhZC50eXBlLmNhc3Q9dXNlQmVhbiAoezB9KTogdHlwZSAoezF9KSBcdTMwNmZjbGFzcyAoezJ9KSBcdTMwNGJcdTMwODlcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjZcdTMwODlcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5pbnZhbGlkLnNjb3BlPSdzY29wZSdcdTVjNWVcdTYwMjdcdTMwNmVcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTk6IHswfSAoXCJwYWdlXCJcdTMwMDFcInJlcXVlc3RcIlx1MzAwMVwic2Vzc2lvblwiXHU1M2M4XHUzMDZmXCJhcHBsaWNhdGlvblwiXHUzMDZlXHUzMDY5XHUzMDhjXHUzMDRiXHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzKQoranNwLmVycm9yLmNsYXNzbmFtZT0uY2xhc3NcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNGJcdTMwODlcdTMwYWZcdTMwZTlcdTMwYjlcdTU0MGRcdTMwOTJcdTZjN2FcdTViOWFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC53YXJuaW5nLmJhZC50eXBlPVx1OGI2Nlx1NTQ0YTogLmNsYXNzXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU0ZTJkXHUzMDZlXHU1NzhiXHUzMDRjXHU5MDU1XHUzMDQ0XHUzMDdlXHUzMDU5Citqc3AuZXJyb3IuZGF0YS5maWxlLndyaXRlPVx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NjZmOFx1MzA0ZFx1OGZiY1x1MzA3Zlx1NGUyZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5idWZmZXI9cGFnZVx1NjMwN1x1NzkzYVx1NWI1MDogXHU3MTIxXHU1MmI5XHUzMDZhXHUzMGQwXHUzMGMzXHUzMGQ1XHUzMGExXHUzMGI1XHUzMGE0XHUzMGJhXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IucGFnZS5jb25mbGljdC5jb250ZW50dHlwZT1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwOiAnY29udGVudFR5cGUnXHUzMDkyXHU3NTcwXHUzMDZhXHUzMDhiXHU1MDI0XHUzMDY3XHU4OTA3XHU2NTcwXHU1NmRlXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDZlXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5IChcdTY1ZTc6IHswfSwgXHU2NWIwOiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmNvbnRlbnR0eXBlPXBhZ2VcdTYzMDdcdTc5M2FcdTViNTA6IGNvbnRlbnRUeXBlXHU1YzVlXHU2MDI3XHUzMDZlXHU1MDI0XHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5Citqc3AuZXJyb3IucGFnZS5jb25mbGljdC5zZXNzaW9uPXBhZ2VcdTYzMDdcdTc5M2FcdTViNTA6ICdzZXNzaW9uJ1x1MzA5Mlx1NzU3MFx1MzA2YVx1MzA4Ylx1NTAyNFx1MzA2N1x1ODkwN1x1NjU3MFx1NTZkZVx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA2ZVx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OSAoXHU2NWU3OiB7MH0sIFx1NjViMDogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5zZXNzaW9uPXBhZ2VcdTYzMDdcdTc5M2FcdTViNTA6IHNlc3Npb25cdTVjNWVcdTYwMjdcdTMwNmVcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmJ1ZmZlcj1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwOiAnYnVmZmVyJ1x1MzA5Mlx1NzU3MFx1MzA2YVx1MzA4Ylx1NTAyNFx1MzA2N1x1ODkwN1x1NjU3MFx1NTZkZVx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA2ZVx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OSAoXHU2NWU3OiB7MH0sIFx1NjViMDogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5idWZmZXI9cGFnZVx1NjMwN1x1NzkzYVx1NWI1MDogYnVmZmVyXHU1YzVlXHU2MDI3XHUzMDZlXHU1MDI0XHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5Citqc3AuZXJyb3IucGFnZS5jb25mbGljdC5hdXRvZmx1c2g9cGFnZVx1NjMwN1x1NzkzYVx1NWI1MDogJ2F1dG9GbHVzaCdcdTMwOTJcdTc1NzBcdTMwNmFcdTMwOGJcdTUwMjRcdTMwNjdcdTg5MDdcdTY1NzBcdTU2ZGVcdTYzMDdcdTViOWFcdTMwNTlcdTMwOGJcdTMwNmVcdTMwNmZcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTkgKFx1NjVlNzogezB9LCBcdTY1YjA6IHsxfSkKK2pzcC5lcnJvci5wYWdlLmludmFsaWQuYXV0b2ZsdXNoPXBhZ2VcdTYzMDdcdTc5M2FcdTViNTA6IGF1dG9GbHVzaFx1NWM1ZVx1NjAyN1x1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnBhZ2UuY29uZmxpY3QuaXN0aHJlYWRzYWZlPXBhZ2VcdTYzMDdcdTc5M2FcdTViNTA6ICdpc1RocmVhZFNhZmUnXHUzMDkyXHU3NTcwXHUzMDZhXHUzMDhiXHU1MDI0XHUzMDY3XHU4OTA3XHU2NTcwXHU1NmRlXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDZlXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5IChcdTY1ZTc6IHswfSwgXHU2NWIwOiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmlzdGhyZWFkc2FmZT1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwOiBpc1RocmVhZFNhZmVcdTMwNmVcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmluZm89cGFnZVx1NjMwN1x1NzkzYVx1NWI1MDogJ2luZm8nXHUzMDkyXHU3NTcwXHUzMDZhXHUzMDhiXHU1MDI0XHUzMDY3XHU4OTA3XHU2NTcwXHU1NmRlXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDZlXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5IChcdTY1ZTc6IHswfSwgXHU2NWIwOiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmluZm89cGFnZVx1NjMwN1x1NzkzYVx1NWI1MDogaW5mb1x1NWM1ZVx1NjAyN1x1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnBhZ2UuY29uZmxpY3QuaXNlcnJvcnBhZ2U9cGFnZVx1NjMwN1x1NzkzYVx1NWI1MDogJ2lzRXJyb3JQYWdlJ1x1MzA5Mlx1NzU3MFx1MzA2YVx1MzA4Ylx1NTAyNFx1MzA2N1x1ODkwN1x1NjU3MFx1NTZkZVx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA2ZVx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OSAoXHU2NWU3OiB7MH0sIFx1NjViMDogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5pc2Vycm9ycGFnZT1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwOiBpc0Vycm9yUGFnZVx1NWM1ZVx1NjAyN1x1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnBhZ2UuY29uZmxpY3QuZXJyb3JwYWdlPXBhZ2VcdTYzMDdcdTc5M2FcdTViNTA6ICdlcnJvclBhZ2UnXHUzMDkyXHU3NTcwXHUzMDZhXHUzMDhiXHU1MDI0XHUzMDY3XHU4OTA3XHU2NTcwXHU1NmRlXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDZlXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5IChcdTY1ZTc6IHswfSwgXHU2NWIwOiB7MX0pCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5sYW5ndWFnZT1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwOiAnbGFuZ3VhZ2UnXHUzMDkyXHU3NTcwXHUzMDZhXHUzMDhiXHU1MDI0XHUzMDY3XHU4OTA3XHU2NTcwXHU1NmRlXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDZlXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5IChcdTY1ZTc6IHswfSwgXHU2NWIwOiB7MX0pCitqc3AuZXJyb3IudGFnLmNvbmZsaWN0Lmxhbmd1YWdlPXRhZ1x1NjMwN1x1NzkzYVx1NWI1MDogJ2xhbmd1YWdlJ1x1MzA5Mlx1NzU3MFx1MzA2YVx1MzA4Ylx1NTAyNFx1MzA2N1x1ODkwN1x1NjU3MFx1NTZkZVx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA2ZVx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OSAoXHU2NWU3OiB7MH0sIFx1NjViMDogezF9KQoranNwLmVycm9yLnBhZ2UubGFuZ3VhZ2Uubm9uamF2YT1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwOiBcdTcxMjFcdTUyYjlcdTMwNmFsYW5ndWFnZVx1NWM1ZVx1NjAyN1x1MzA2N1x1MzA1OQoranNwLmVycm9yLnRhZy5sYW5ndWFnZS5ub25qYXZhPXRhZ1x1NjMwN1x1NzkzYVx1NWI1MDogXHU3MTIxXHU1MmI5XHUzMDZhbGFuZ3VhZ2VcdTVjNWVcdTYwMjdcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci5wYWdlLmRlZmFmdGVydXNlLmxhbmd1YWdlPXBhZ2VcdTYzMDdcdTc5M2FcdTViNTA6IHNjcmlwdGxldFx1MzA2ZVx1NWY4Y1x1MzA2N2xhbmd1YWdlXHU1YzVlXHU2MDI3XHUzMDkyXHU2MzA3XHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IucGFnZS5ub21hcHBpbmcubGFuZ3VhZ2U9cGFnZVx1NjMwN1x1NzkzYVx1NWI1MCBsYW5ndWFnZVx1NWM1ZVx1NjAyN1x1MzA2ZVx1MzBkZVx1MzBjM1x1MzBkNFx1MzBmM1x1MzBiMFx1MzA0Y1x1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1Ylx1MzA5MzoKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmV4dGVuZHM9cGFnZVx1NjMwN1x1NzkzYVx1NWI1MDogJ2V4dGVuZHMnXHUzMDkyXHU3NTcwXHUzMDZhXHUzMDhiXHU1MDI0XHUzMDY3XHU4OTA3XHU2NTcwXHU1NmRlXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDZlXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5IChcdTY1ZTc6IHswfSwgXHU2NWIwOiB7MX0pCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5pc2VsaWdub3JlZD1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwOiAnaXNFTElnbm9yZWQnXHUzMDkyXHU3NTcwXHUzMDZhXHUzMDhiXHU1MDI0XHUzMDY3XHU4OTA3XHU2NTcwXHU1NmRlXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDZlXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5IChcdTY1ZTc6IHswfSwgXHU2NWIwOiB7MX0pCitqc3AuZXJyb3IudGFnLmNvbmZsaWN0LmlzZWxpZ25vcmVkPXRhZ1x1NjMwN1x1NzkzYVx1NWI1MDogJ2lzRUxJZ25vcmVkJ1x1MzA5Mlx1NzU3MFx1MzA2YVx1MzA4Ylx1NTAyNFx1MzA2N1x1ODkwN1x1NjU3MFx1NTZkZVx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA2ZVx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OSAoXHU2NWU3OiB7MH0sIFx1NjViMDogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5pc2VsaWdub3JlZD1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwOiBpc0VMSWdub3JlZFx1MzA2Ylx1NzEyMVx1NTJiOVx1MzA2YVx1NTAyNFx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQoranNwLmVycm9yLnRhZy5pbnZhbGlkLmlzZWxpZ25vcmVkPXRhZ1x1NjMwN1x1NzkzYVx1NWI1MDogaXNFTElnbm9yZWRcdTMwNmJcdTcxMjFcdTUyYjlcdTMwNmFcdTUwMjRcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5wYWdlLm11bHRpLnBhZ2VlbmNvZGluZz1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwXHUzMDZmXHU4OTA3XHU2NTcwXHUzMDZlcGFnZWVuY29kaW5nXHUzMDkyXHU2MzAxXHUzMDY0XHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IudGFnLmNvbmZsaWN0LmF0dHI9VGFnXHU2MzA3XHU3OTNhXHU1YjUwOiBcdTVjNWVcdTYwMjdcInswfVwiXHUzMDkyXHU3NTcwXHUzMDZhXHUzMDhiXHU1MDI0XHUzMDY3XHU4OTA3XHU2NTcwXHU1NmRlXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDZlXHUzMDZmXHU0ZTBkXHU2YjYzXHUzMDY3XHUzMDU5IChcdTY1ZTc6IHsxfSwgXHU2NWIwOiB7Mn0pCitqc3AuZXJyb3IudGFnLm11bHRpLnBhZ2VlbmNvZGluZz10YWdcdTYzMDdcdTc5M2FcdTViNTBcdTMwNmZcdTg5MDdcdTY1NzBcdTMwNmVwYWdlZW5jb2RpbmdcdTMwOTJcdTYzMDFcdTMwNjRcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5wYWdlLmJhZF9iX2FuZF9hX2NvbWJvPXBhZ2VcdTYzMDdcdTc5M2FcdTViNTA6IGJ1ZmZlcj1cIm5vbmVcIlx1MzA2OGF1dG9GbHVzaD1cImZhbHNlXCJcdTMwOTJcdTU0MGNcdTY2NDJcdTMwNmJcdTRmN2ZcdTc1MjhcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5ub3QuaW1wbC50YWdsaWI9XHU1MTg1XHU5MGU4XHUzMGE4XHUzMGU5XHUzMGZjOiBcdTMwYmZcdTMwYjBcdTYyZTFcdTVmMzVcdTViNTBcdTMwNmZcdTViOWZcdTg4YzVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5pbmNsdWRlLm1pc3NpbmcuZmlsZT1cdTUzZDZcdTMwOGFcdThmYmNcdTMwODBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTVmMTVcdTY1NzBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5pbmNsdWRlLmJhZC5maWxlPWluY2x1ZGVcdTVjNWVcdTYwMjdcdTMwNmVcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTVmMTVcdTY1NzBcdTMwNGNcdTk1OTNcdTkwNTVcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5pbmNsdWRlLmV4Y2VwdGlvbj17MH0gXHUzMDkyXHU1M2Q2XHUzMDhhXHU4ZmJjXHUzMDgxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iuc3RyZWFtLmNsb3NlZD1cdTMwYjlcdTMwYzhcdTMwZWFcdTMwZmNcdTMwZTBcdTMwNGNcdTMwYWZcdTMwZWRcdTMwZmNcdTMwYmFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5pbnZhbGlkLmZvcndhcmQ9XHU3MTIxXHU1MmI5XHUzMDZhZm9yd2FyZFx1MzBiZlx1MzBiMFx1MzA2N1x1MzA1OQoranNwLmVycm9yLnVua25vd25FeGNlcHRpb249XHU1MWU2XHU3NDA2XHU0ZTBkXHU1M2VmXHU4MGZkXHUzMDZhXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5ISBcdTMwNTNcdTMwNmVcdTMwODhcdTMwNDZcdTMwNmFcdTMwYThcdTMwZTlcdTMwZmNcdTMwOTJcdTMwODhcdTMwOGFcdThhNzNcdTdkMzBcdTMwNmJcdTU4MzFcdTU0NGFcdTMwNTlcdTMwOGJcdTMwYThcdTMwZTlcdTMwZmNcdTMwZGFcdTMwZmNcdTMwYjhcdTMwOTJcdTYzMDFcdTMwNjNcdTMwNWZcdTY1YjlcdTMwNGNcdTMwODhcdTMwNDRcdTMwNGJcdTMwODJcdTMwNTdcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5pbnZhbGlkLmRpcmVjdGl2ZT1cdTcxMjFcdTUyYjlcdTMwNmFcdTYzMDdcdTc5M2FcdTViNTBcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci5kaXJlY3RpdmUuaXN0YWdmaWxlPXswfSBcdTYzMDdcdTc5M2FcdTViNTBcdTMwNmZcdTMwYmZcdTMwYjBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTRlMmRcdTMwNjdcdTMwNmZcdTRmN2ZcdTc1MjhcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5kaXJlY3RpdmUuaXNub3R0YWdmaWxlPXswfSBcdTYzMDdcdTc5M2FcdTViNTBcdTMwNmZcdTMwYmZcdTMwYjBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTRlMmRcdTMwNjdcdTMwNTdcdTMwNGJcdTRmN2ZcdTc1MjhcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci50YWdmaWxlLnRsZC5uYW1lPVRMRFx1NGUyZFx1MzA2ZVx1MzBiZlx1MzBiMFx1NjMwN1x1NzkzYVx1NWI1MFx1MzA2ZVwidGFnLWZpbGVcIlx1ODk4MVx1N2QyMFx1MzA2ZVwibmFtZVwiXHUzMGJmXHUzMGIwXHUzMDZmIHsxfSBcdTMwNjdcdTMwNTlcdTMwNGNcdWZmMGNcIm5hbWVcIlx1NWM1ZVx1NjAyN1x1MzA2Zlx1NTAyNCB7MH0gXHUzMDkyXHU2MzAxXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Citqc3AuZXJyb3IuYWN0aW9uLmlzdGFnZmlsZT17MH0gXHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHUzMGJmXHUzMGIwXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU0ZTJkXHUzMDY3XHU0ZjdmXHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuYWN0aW9uLmlzbm90dGFnZmlsZT17MH0gXHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHUzMGJmXHUzMGIwXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU0ZTJkXHUzMDY3XHUzMDZlXHUzMDdmXHU0ZjdmXHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IudW50ZXJtaW5hdGVkPXswfSBcdTMwYmZcdTMwYjBcdTMwNGNcdTdkNDJcdTRlODZcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci51c2ViZWFuLm5vdGluc2FtZWZpbGU9dXNlQmVhblx1MzBiZlx1MzBiMFx1MzA2Zlx1MzAwMVx1NTQwY1x1NGUwMFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1NGUyZFx1MzA2N1x1OTU4Ylx1NTljYlx1MzA1N1x1MzAwMVx1N2Q0Mlx1NGU4Nlx1MzA1N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmxvYWRjbGFzcy50YWdoYW5kbGVyPVx1MzBiZlx1MzBiMCBcInsxfVwiIFx1MzA2Ylx1MzBiZlx1MzBiMFx1MzBjZlx1MzBmM1x1MzBjOVx1MzBlOVx1MzBhZlx1MzBlOVx1MzBiOSBcInswfVwiIFx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnVuYWJsZS5jb21waWxlPUpTUFx1MzA2ZVx1MzBhZlx1MzBlOVx1MzBiOVx1MzA5Mlx1MzBiM1x1MzBmM1x1MzBkMVx1MzBhNFx1MzBlYlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnVuYWJsZS5sb2FkPUpTUFx1MzA2ZVx1MzBhZlx1MzBlOVx1MzBiOVx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnVuYWJsZS5yZW5hbWU9XHUzMGFmXHUzMGU5XHUzMGI5XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViIHswfSBcdTMwOTIgezF9IFx1MzA2Ylx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1NTQwZFx1MzA5Mlx1NTkwOVx1NjZmNFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLm1hbmRhdG9yeS5hdHRyaWJ1dGU9ezB9OiBcdTVmYzVcdTk4MDhcdTVjNWVcdTYwMjcgezF9IFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVuZ2luZS5pbmZvPUphc3BlciBKU1AgMi4wXHUzMGE4XHUzMGYzXHUzMGI4XHUzMGYzCitqc3AuZXJyb3IuaW52YWxpZC5leHByZXNzaW9uPSJ7MH0iIFx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2YVx1NWYwZlx1MzA5Mlx1NTQyYlx1MzA5M1x1MzA2N1x1MzA0NFx1MzA3ZVx1MzA1OTogezF9Citqc3AuZXJyb3IuaW52YWxpZC5hdHRyaWJ1dGU9ezB9XHUzMDZmXHU3MTIxXHU1MmI5XHUzMDZhXHU1YzVlXHU2MDI3XHUzMDkyXHU2MzAxXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5OiB7MX0KK2pzcC5lcnJvci51c2ViZWFuLmNsYXNzLm5vdGZvdW5kPVx1MzBhZlx1MzBlOVx1MzBiOTogezB9IFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmZpbGUuY2Fubm90LnJlYWQ9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHU4YWFkXHUzMDgxXHUzMDdlXHUzMDViXHUzMDkzOiB7MH0KK2pzcC5lcnJvci5maWxlLmFscmVhZHkucmVnaXN0ZXJlZD1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgezB9IFx1MzA2ZVx1NTE4ZFx1NWUzMFx1NzY4NFx1MzA2YVx1NTNkNlx1MzA4YVx1OGZiY1x1MzA3Zlx1MzA2N1x1MzA1OQoranNwLmVycm9yLmZpbGUubm90LnJlZ2lzdGVyZWQ9aW5jbHVkZVx1NWM1ZVx1NjAyN1x1NGUyZFx1MzA2ZVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiB7MH0gXHUzMDRjXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IucXVvdGVzLnVudGVybWluYXRlZD1cdTVmMTVcdTc1MjhcdTdiMjZcdTMwNGNcdTdkNDJcdTRlODZcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5hdHRyLnF1b3RlZD1cdTVjNWVcdTYwMjdcdTUwMjRcdTMwNmZcdTVmMTVcdTc1MjhcdTdiMjZcdTMwNjdcdTU2ZjJcdTMwOGZcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5hdHRyLm5vdmFsdWU9XHU1YzVlXHU2MDI3IHswfSBcdTMwNmJcdTMwNmZcdTUwMjRcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci50YWcuYXR0ci51bnRlcm1pbmF0ZWQ9XHUzMGJmXHUzMGIwXHUzMDZlXHU1YzVlXHU2MDI3XHUzMGVhXHUzMGI5XHUzMGM4XHUzMDRjXHU3ZDQyXHU0ZTg2XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IucGFyYW0ubm9uYW1lPVBBUkFNXHUzMGJmXHUzMGIwXHUzMDZibmFtZVx1NWM1ZVx1NjAyN1x1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnBhcmFtLm5vdmFsdWU9UEFSQU1cdTMwYmZcdTMwYjBcdTMwNmJ2YWx1ZVx1NWM1ZVx1NjAyN1x1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmJlYW5zLm51bGxiZWFuPW51bGxcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTMwNmJCZWFuXHU2NGNkXHU0ZjVjXHUzMDkyXHUzMDRhXHUzMDUzXHUzMDZhXHUzMDRhXHUzMDQ2XHUzMDY4XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitqc3AuZXJyb3IuYmVhbnMubm9iZWFuaW5mbz1cdTMwYmZcdTMwYTRcdTMwZDcgJyd7MH0nJyBcdTMwNmVCZWFuXHUzMDZiQmVhbkluZm9cdTMwNGNcdTMwNmFcdTMwNDRcdTMwNmVcdTMwOTJcdTY5MWNcdTUxZmFcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYsIFx1MzBhZlx1MzBlOVx1MzBiOVx1MzA0Y1x1NWI1OFx1NTcyOFx1MzA1N1x1MzA2YVx1MzA0NFx1MzA0Ylx1MzA4Mlx1MzA1N1x1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmJlYW5zLmludHJvc3BlY3Rpb249XHUzMGJmXHUzMGE0XHUzMGQ3ICcnezF9JycgXHUzMDZlQmVhblx1NGUyZFx1MzA2ZVx1NWM1ZVx1NjAyNyAnJ3swfScnIFx1MzA2ZXJlYWRcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwOTJcdTUxODVcdTc3MDFcdTRlMmRcdTMwNmJcdTRmOGJcdTU5MTZcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWY6XG57Mn0KK2pzcC5lcnJvci5iZWFucy5ub21ldGhvZD1cdTMwYmZcdTMwYTRcdTMwZDcgJyd7MX0nJyBcdTMwNmVCZWFuXHU0ZTJkXHUzMDZlXHU1YzVlXHU2MDI3ICcnezB9JycgXHUzMDkyXHU4YWFkXHUzMDdmXHU4ZmJjXHUzMDgwXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDkyXHU3NjdhXHU4OThiXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmCitqc3AuZXJyb3IuYmVhbnMubm9tZXRob2Quc2V0cHJvcGVydHk9XHUzMGJmXHUzMGE0XHUzMGQ3Jyd7Mn0nJ1x1MzA2ZUJlYW5cdTMwNmVcdTMwYmZcdTMwYTRcdTMwZDcgJyd7MX0nJyBcdTMwNmVcdTVjNWVcdTYwMjcgJyd7MH0nJyBcdTMwOTJcdTY2ZjhcdTMwNGRcdThmYmNcdTMwODBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwOTJcdTc2N2FcdTg5OGJcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWYKK2pzcC5lcnJvci5iZWFucy5ub3Byb3BlcnR5PVx1MzBiZlx1MzBhNFx1MzBkNyAnJ3sxfScnIFx1MzA2ZWJlYW5cdTRlMmRcdTMwNmVcdTVjNWVcdTYwMjcgJyd7MH0nJyBcdTMwNmVcdTYwYzVcdTU4MzFcdTMwOTJcdTc2N2FcdTg5OGJcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWYKK2pzcC5lcnJvci5iZWFucy5zZXRwcm9wZXJ0eS5ub2luZGV4c2V0PVx1MzBhNFx1MzBmM1x1MzBjN1x1MzBjM1x1MzBhZlx1MzBiOVx1NGVkOFx1MzA0ZFx1MzA2ZVx1NWM1ZVx1NjAyN1x1MzA5Mlx1NjMwN1x1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmluY2x1ZGUudGFnPVx1NzEyMVx1NTJiOVx1MzA2YWpzcDppbmNsdWRlXHUzMGJmXHUzMGIwXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IuaW5jbHVkZS5ub2ZsdXNoPWpzcDppbmNsdWRlXHUzMGJmXHUzMGIwXHUzMDZiIFwiZmx1c2g9dHJ1ZVwiIFx1MzA5Mlx1NWI5YVx1N2ZhOVx1MzA1N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmluY2x1ZGUuYmFkZmx1c2g9anNwOmluY2x1ZGUgcGFnZT1cIi4uLlwiIGZsdXNoPVwidHJ1ZVwiIFx1MzA2Zlx1MzAwMUpTUCAxLjBcdTMwNjdcdTMwNmVcdTMwN2ZcdTY3MDlcdTUyYjlcdTMwNmFcdTdkNDRcdTMwN2ZcdTU0MDhcdTMwOGZcdTMwNWJcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci5hdHRlbXB0X3RvX2NsZWFyX2ZsdXNoZWRfYnVmZmVyPVx1MzBhOFx1MzBlOVx1MzBmYzogXHU2NWUyXHUzMDZiXHUzMGQ1XHUzMGU5XHUzMGMzXHUzMGI3XHUzMGU1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGQwXHUzMGMzXHUzMGQ1XHUzMGExXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGEyXHUzMDU3XHUzMDg4XHUzMDQ2XHUzMDY4XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitqc3AuZXJyb3Iub3ZlcmZsb3c9XHUzMGE4XHUzMGU5XHUzMGZjOiBKU1BcdTMwZDBcdTMwYzNcdTMwZDVcdTMwYTFcdTMwNGNcdTMwYWFcdTMwZmNcdTMwZDBcdTMwZmNcdTMwZDVcdTMwZWRcdTMwZmNcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2pzcC5lcnJvci5wYXJhbWV4cGVjdGVkPVwibmFtZVwiXHU1YzVlXHU2MDI3IFx1MzA2OCBcInZhbHVlXCIgXHU1YzVlXHU2MDI3XHUzMDkyXHU2MzAxXHUzMDY0IFwianNwOnBhcmFtXCIgXHU2YTE5XHU2ZTk2XHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IucGFyYW0uaW52YWxpZFVzZT1qc3A6aW5jbHVkZVx1MzAwMWpzcDpmb3J3YXJkXHUzMDAxXHU1M2M4XHUzMDZmanNwOnBhcmFtc1x1ODk4MVx1N2QyMFx1MzA2ZVx1NTkxNlx1MzA2N2pzcDpwYXJhbVx1MzBhMlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzA2Nlx1MzA2Zlx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnBhcmFtcy5pbnZhbGlkVXNlPWpzcDpwYXJhbXNcdTMwNmZqc3A6cGx1Z2luXHUzMDZlXHU3NmY0XHU2M2E1XHUzMDZlXHU1YjUwXHU0ZjliXHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuZmFsbGJhY2suaW52YWxpZFVzZT1qc3A6ZmFsbGJhY2tcdTMwNmZqc3A6cGx1Z2luXHUzMDZlXHU3NmY0XHU2M2E1XHUzMDZlXHU1YjUwXHU0ZjliXHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IubmFtZWRBdHRyaWJ1dGUuaW52YWxpZFVzZT1qc3A6YXR0cmlidXRlXHUzMDZmXHU2YTE5XHU2ZTk2XHU1M2M4XHUzMDZmXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU1MjZmXHU4OTgxXHU3ZDIwXHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuanNwYm9keS5pbnZhbGlkVXNlPWpzcDpib2R5XHUzMDZmXHU2YTE5XHU2ZTk2XHU1M2M4XHUzMDZmXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU1MjZmXHU4OTgxXHU3ZDIwXHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuY2xvc2VpbmRpdmlkdWFscGFyYW09cGFyYW1cdTMwYmZcdTMwYjBcdTMwNmYgXCIvPlwiIFx1MzA2N1x1OTU4OVx1MzA1OFx1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmNsb3NlcGFyYW1zPXBhcmFtXHUzMGJmXHUzMGIwXHUzMDZmL3BhcmFtc1x1MzA2N1x1OTU4OVx1MzA1OFx1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnBhcmFtcy5lbXB0eUJvZHk9anNwOnBhcmFtc1x1MzA2Zlx1NWMxMVx1MzA2YVx1MzA0Zlx1MzA2OFx1MzA4Mlx1NGUwMFx1MzA2NFx1MzA2ZVx1MzBjZFx1MzBiOVx1MzBjOFx1MzA1N1x1MzA1ZmpzcDpwYXJhbVx1MzA5Mlx1NTQyYlx1MzA3ZVx1MzA2ZFx1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnBhcmFtcy5pbGxlZ2FsQ2hpbGQ9anNwOnBhcmFtc1x1MzA2ZmpzcDpwYXJhbVx1NGVlNVx1NTkxNlx1MzA2ZVx1MzBjZFx1MzBiOVx1MzBjOFx1MzA1N1x1MzA1Zlx1ODk4MVx1N2QyMFx1MzA5Mlx1NTQyYlx1MzA5M1x1MzA2N1x1MzA2Zlx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnBsdWdpbi5ub3R5cGU9anNwOnBsdWdpblx1MzA2N3R5cGVcdTVjNWVcdTYwMjdcdTMwNGNcdTViYTNcdThhMDBcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5wbHVnaW4uYmFkdHlwZT1qc3A6cGx1Z2luXHUzMDZlICd0eXBlJ1x1NWM1ZVx1NjAyN1x1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OTogJ2JlYW4nXHU1M2M4XHUzMDZmJ2FwcGxldCdcdTMwNjdcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5wbHVnaW4ubm9jb2RlPWpzcDpwbHVnaW5cdTMwNjdjb2RlXHU1YzVlXHU2MDI3XHUzMDRjXHU1YmEzXHU4YTAwXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuaXNlX29uX2NsZWFyPVx1MzBkMFx1MzBjM1x1MzBkNVx1MzBhMVx1MzBiNVx1MzBhNFx1MzBiYVx1MzA0YzBcdTMwNmVcdTY2NDJcdTMwNmJjbGVhcigpXHUzMDkyXHU1YjlmXHU4ODRjXHUzMDU3XHUzMDY2XHUzMDgyXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5Citqc3AuZXJyb3Iuc2V0cHJvcGVydHkuYmVhbk5vdEZvdW5kPXNldFByb3BlcnR5OiBCZWFuIHswfSBcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5nZXRwcm9wZXJ0eS5iZWFuTm90Rm91bmQ9Z2V0UHJvcGVydHk6IEJlYW4gezB9IFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnNldHByb3BlcnR5LkNsYXNzTm90Rm91bmQ9c2V0UHJvcGVydHk6IFx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCisjIHR5cG8gPworI2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5pbnZhbGlkU2F5bnRheD1zZXRQcm9wZXJ0eTogcHJvcGVydHk9Klx1MzA2ZVx1NTgzNFx1NTQwOFx1MzA2Zm51bGxcdTMwNjdcdTMwNmFcdTMwNDRcdTUwMjRcdTMwOTJcdTYzMDdcdTViOWFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5pbnZhbGlkU3ludGF4PXNldFByb3BlcnR5OiBwcm9wZXJ0eT0qXHUzMDZlXHU1ODM0XHU1NDA4XHUzMDZmbnVsbFx1MzA2N1x1MzA2YVx1MzA0NFx1NTAyNFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnNldHByb3BlcnR5LmJlYW5JbmZvTm90Rm91bmQ9c2V0cHJvcGVydHk6IEJlYW4gezB9IFx1MzA2ZWJlYW5JbmZvXHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iuc2V0cHJvcGVydHkucGFyYW1PclZhbHVlPXNldFByb3BlcnR5OiBwYXJhbVx1NWM1ZVx1NjAyN1x1MzA0YnZhbHVlXHU1YzVlXHU2MDI3XHUzMDZlXHUzMDY5XHUzMDYxXHUzMDg5XHUzMDRiXHU0ZTAwXHUzMDY0XHUzMDYwXHUzMDUxXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDU5Citqc3AuZXJyb3Iuc2V0cHJvcGVydHkuYXJyYXlWYWw9c2V0UHJvcGVydHk6IFx1NWM1ZVx1NjAyN1x1OTE0ZFx1NTIxNyB7MH0gXHUzMDkyXHU2NTg3XHU1YjU3XHU1MjE3XHU1YjlhXHU2NTcwXHU1MDI0XHUzMDY3XHU2MzA3XHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3Aud2FybmluZy5rZWVwZ2VuPVx1OGI2Nlx1NTQ0YTogaW5pdFBhcmFtIGtlZXBnZW5lcmF0ZWRcdTMwNmVcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTlcdTMwMDIgXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHU1MDI0IFwiZmFsc2VcIiBcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLnhwb3dlcmVkQnk9XHU4YjY2XHU1NDRhOiBJbnZhbGlkIHZhbHVlIGZvciB0aGUgaW5pdFBhcmFtIHhwb3dlcmVkQnlcdTMwNmVcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTlcdTMwMDJcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTUwMjQgXCJmYWxzZVwiIFx1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzA3ZVx1MzA1OQoranNwLndhcm5pbmcuZW5hYmxlUG9vbGluZz1cdThiNjZcdTU0NGE6IGluaXRQYXJhbSBlbmFibGVQb29saW5nXHUzMDRjXHU3MTIxXHU1MmI5XHUzMDZhXHU1MDI0XHUzMDY3XHUzMDU5XHUzMDAyXCJ0cnVlXCJcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTUwMjRcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLmludmFsaWRUYWdQb29sU2l6ZT1cdThiNjZcdTU0NGE6IHRhZ1Bvb2xTaXplXHUzMDZlXHU1MjFkXHU2NzFmXHUzMGQxXHUzMGU5XHUzMGUxXHUzMGZjXHUzMGJmXHUzMDRjXHU3MTIxXHU1MmI5XHUzMDZhXHU1MDI0XHUzMDY3XHUzMDU5XHUzMDAyezB9XHUzMDZlXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGI1XHUzMGE0XHUzMGJhXHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5Citqc3Aud2FybmluZy5tYXBwZWRGaWxlPVx1OGI2Nlx1NTQ0YTogaW5pdFBhcmFtIG1hcHBlZEZpbGVcdTMwNmVcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTlcdTMwMDJcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTUwMjQgXCJmYWxzZVwiIFx1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzA3ZVx1MzA1OQoranNwLndhcm5pbmcuc2VuZEVyclRvQ2xpZW50PVx1OGI2Nlx1NTQ0YTogaW5pdFBhcmFtIHNlbmRFcnJUb0NsaWVudFx1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OVx1MzAwMlx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1NTAyNCBcImZhbHNlXCIgXHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5Citqc3Aud2FybmluZy5jbGFzc0RlYnVnSW5mbz1cdThiNjZcdTU0NGE6IGluaXRQYXJhbSBjbGFzc0RlYnVnSW5mb1x1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OVx1MzAwMlx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1NTAyNCBcImZhbHNlXCJcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLmNoZWNrSW50ZXJ2YWw9XHU4YjY2XHU1NDRhOiBpbml0UGFyYW0gY2hlY2tJbnRlcnZhbFx1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OVx1MzAwMlwiMzAwXCJcdTc5ZDJcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTUwMjRcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLmRldmVsb3BtZW50PVx1OGI2Nlx1NTQ0YTogaW5pdFBhcmFtIGRldmVsb3BtZW50XHUzMDZlXHU1MDI0XHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXCJ0cnVlXCJcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTUwMjRcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLmZvcms9XHU4YjY2XHU1NDRhOiBpbml0UGFyYW0gZm9ya1x1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OVx1MzAwMlwidHJ1ZVwiXHUzMDZlXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHU1MDI0XHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5Citqc3Aud2FybmluZy5yZWxvYWRpbmc9XHU4YjY2XHU1NDRhOiBpbml0UGFyYW0gcmVsb2FkaW5nXHUzMDZlXHU1MDI0XHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXCJ0cnVlXCJcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTUwMjRcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLmR1bXBTbWFwPVx1OGI2Nlx1NTQ0YTogaW5pdFBhcmFtIGR1bXBTbWFwXHUzMDZlXHU1MDI0XHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXCJmYWxzZVwiXHUzMDZlXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHU1MDI0XHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5Citqc3Aud2FybmluZy5nZW5jaGFyYXJyYXk9XHU4YjY2XHU1NDRhOiBpbml0UGFyYW0gZ2VuU3RyQXNDaGFyQXJyYXlcdTMwNmVcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTlcdTMwMDJcImZhbHNlXCJcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTUwMjRcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLnN1cHByZXNzU21hcD1cdThiNjZcdTU0NGE6IGluaXRQYXJhbSBzdXBwcmVzc1NtYXBcdTMwNmVcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTlcdTMwMDJcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTUwMjQgXCJmYWxzZVwiIFx1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzA3ZVx1MzA1OQoranNwLmVycm9yLmJhZHRhZ2xpYj1cdTMwYmZcdTMwYjBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWEgezB9IFx1MzA5Mlx1MzBhYVx1MzBmY1x1MzBkN1x1MzBmM1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzogezF9Citqc3AuZXJyb3IuYmFkR2V0UmVhZGVyPVx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmY1x1MzBlMFx1MzA0Y1x1MzBkMFx1MzBjM1x1MzBkNVx1MzBhMVx1MzBlYVx1MzBmM1x1MzBiMFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA2YVx1MzA0NFx1NTgzNFx1NTQwOFx1MzA2Ylx1MzA2Zlx1MzAwMVJlYWRlclx1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLnRhZ2xpYj10YWdsaWJcdTRlMmRcdTMwNmJcdTY3MmFcdTc3ZTVcdTMwNmVcdTg5ODFcdTdkMjAgKHswfSkgXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5Citqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4udGFnPXRhZ1x1NGUyZFx1MzA2Ylx1NjcyYVx1NzdlNVx1MzA2ZVx1ODk4MVx1N2QyMCAoezB9KSBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi50YWdmaWxlPXRhZy1maWxlXHU0ZTJkXHUzMDZiXHU2NzJhXHU3N2U1XHUzMDZlXHU4OTgxXHU3ZDIwICh7MH0pIFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OQoranNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLmF0dHJpYnV0ZT1hdHRyaWJ1dGVcdTRlMmRcdTMwNmJcdTY3MmFcdTc3ZTVcdTMwNmVcdTg5ODFcdTdkMjAgKHswfSkgXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5Citqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4udmFyaWFibGU9dmFyaWFibGVcdTRlMmRcdTMwNmJcdTY3MmFcdTc3ZTVcdTMwNmVcdTg5ODFcdTdkMjAgKHswfSkgXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5Citqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4udmFsaWRhdG9yPXZhbGlkYXRvclx1NGUyZFx1MzA2Ylx1NjcyYVx1NzdlNVx1MzA2ZVx1ODk4MVx1N2QyMCAoezB9KSBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi5pbml0UGFyYW09dmFsaWRhdG9yXHUzMDZlaW5pdC1wYXJhbVx1NGUyZFx1MzA2Ylx1NjcyYVx1NzdlNVx1MzA2ZVx1ODk4MVx1N2QyMCAoezB9KSBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi5mdW5jdGlvbj1mdW5jdGlvblx1NGUyZFx1MzA2Ylx1NjcyYVx1NzdlNVx1MzA2ZVx1ODk4MVx1N2QyMCAoezB9KSBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5tb3JlLnRoYW4ub25lLnRhZ2xpYj1UTERcdTMwNmVcdTRlMmRcdTMwNmJcdTg5MDdcdTY1NzBcdTMwNmV0YWdsaWJcdTMwNGNcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNTk6IHswfQoranNwLmVycm9yLnRlaWNsYXNzLmluc3RhbnRpYXRpb249VGFnRXh0cmFJbmZvIGNsYXNzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGM5XHU1M2M4XHUzMDZmXHUzMGE0XHUzMGYzXHUzMGI5XHUzMGJmXHUzMGYzXHUzMGI5XHU1MzE2XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0KK2pzcC5lcnJvci5ub25fbnVsbF90ZWlfYW5kX3Zhcl9zdWJlbGVtcz1cdTMwYmZcdTMwYjAgezB9IFx1MzA2Zlx1NGUwMFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZXZhcmlhYmxlXHU1MjZmXHU4OTgxXHU3ZDIwXHUzMDY4XHU0ZTAwXHUzMDY0XHU0ZWU1XHU0ZTBhXHUzMDZlVmFyaWFibGVJbmZvXHUzMDkyXHU4ZmQ0XHUzMDU5VGFnRXh0cmFJbmZvXHUzMGFmXHUzMGU5XHUzMGI5XHUzMDkyXHU2MzAxXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Citqc3AuZXJyb3IucGFyc2UuZXJyb3IuaW4uVExEPVx1MzBiZlx1MzBiMFx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1OGExOFx1OGZmMFx1NWI1MCB7MH0gXHU0ZTJkXHUzMDZlXHU4OWUzXHU2NzkwXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IudW5hYmxlLnRvLm9wZW4uVExEPVx1MzBiZlx1MzBiMFx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1OGExOFx1OGZmMFx1NWI1MCB7MH0gXHUzMDkyXHUzMGFhXHUzMGZjXHUzMGQ3XHUzMGYzXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuYnVmZmVyLnNpemUuemVybz1cdTMwZDBcdTMwYzNcdTMwZDVcdTMwYTFcdTMwYjVcdTMwYTRcdTMwYmFcdTMwNGMwXHU0ZWU1XHU0ZTBiXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IuZmlsZS5ub3QuZm91bmQ9SlNQIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiBcInswfVwiIFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLm1lc3NhZ2UuY29weWluZ3VyaT17MH0gXHUzMDkyIHsxfSBcdTMwNmJcdTMwYjNcdTMwZDRcdTMwZmNcdTMwNTdcdTMwN2VcdTMwNTkKK2pzcC5tZXNzYWdlLmh0bWxjb21tZW50PVxuXHU1MjRhXHU5NjY0XHUzMDU5XHUzMDhiXHUzMGIzXHUzMGUxXHUzMGYzXHUzMGM4OiBcdHswfQoranNwLm1lc3NhZ2UuaGFuZGxpbmdfZGlyZWN0aXZlPVxuXHU1MWU2XHU3NDA2XHUzMDU5XHUzMDhiXHU2MzA3XHU3OTNhXHU1YjUwOiB7MH1cdHsxfQoranNwLm1lc3NhZ2UuaGFuZGxpbmdfcGx1Z2luPVxuUGx1Z2luOiB7MH0KK2pzcC5tZXNzYWdlLnBhY2thZ2VfbmFtZV9pcz1cdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjhcdTU0MGQ6IHswfQoranNwLm1lc3NhZ2UuY2xhc3NfbmFtZV9pcz1cdTMwYWZcdTMwZTlcdTMwYjlcdTU0MGQ6IHswfQoranNwLm1lc3NhZ2UuamF2YV9maWxlX25hbWVfaXM9SmF2YVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1NTQwZDogezB9Citqc3AubWVzc2FnZS5jbGFzc19maWxlX25hbWVfaXM9XHUzMGFmXHUzMGU5XHUzMGI5XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU1NDBkOiB7MH0KK2pzcC5tZXNzYWdlLmFjY2VwdGVkPXsxfSBcdTMwNjcgezB9IFx1MzA5Mlx1NTNkN1x1MzA1MVx1NTE2NVx1MzA4Y1x1MzA3ZVx1MzA1OQoranNwLm1lc3NhZ2UuYWRkaW5nX2phcj1qYXIgezB9IFx1MzA5Mlx1MzBhZlx1MzBlOVx1MzBiOVx1MzBkMVx1MzBiOVx1MzA2Ylx1OGZmZFx1NTJhMFx1MzA1N1x1MzA3ZVx1MzA1OQoranNwLm1lc3NhZ2UuY29tcGlsaW5nX3dpdGg9ezB9IFx1MzA5Mlx1MzBiM1x1MzBmM1x1MzBkMVx1MzBhNFx1MzBlYlx1NGUyZFx1MzA2N1x1MzA1OQoranNwLm1lc3NhZ2UudGVtcGxhdGVfdGV4dD1cdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzhcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzgKK2pzcC5lcnJvci5taXNzaW5nX2F0dHJpYnV0ZT1UTERcdTUzYzhcdTMwNmZcdTMwYmZcdTMwYjBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmJcdTMwODhcdTMwOGJcdTMwNjhcdTMwMDFcdTVjNWVcdTYwMjcgezB9IFx1MzA2Zlx1MzBiZlx1MzBiMCB7MX0gXHUzMDZiXHUzMDZmXHU1ZmM1XHU5ODA4XHUzMDY3XHUzMDU5Citqc3AuZXJyb3IuYmFkX2F0dHJpYnV0ZT1UTERcdTMwNmJcdTMwODhcdTMwOGJcdTMwNjhcdTMwMDFcdTMwYmZcdTMwYjAgezF9IFx1MzA2ZVx1NWM1ZVx1NjAyNyB7MH0gXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5Citqc3AuZXJyb3IudGxkLnVuYWJsZV90b19yZWFkPUpBUlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiBcInswfVwiIFx1MzA0Ylx1MzA4OVRMRCBcInsxfVwiIFx1MzA5Mlx1OGFhZFx1MzA3Zlx1OGZiY1x1MzA4MVx1MzA3ZVx1MzA1Ylx1MzA5MzogezJ9Citqc3AuZXJyb3IudGxkLnVuYWJsZV90b19nZXRfamFyPVRMRFx1MzA5Mlx1NTQyYlx1MzA4MEpBUlx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOSBcInswfVwiIFx1MzA5Mlx1NTNkNlx1NWY5N1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MyA6IHsxfQoranNwLmVycm9yLnRsZC5taXNzaW5nX2phcj1UTERcdTMwOTJcdTU0MmJcdTMwODBKQVJcdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjkgXCJ7MH1cIiBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci53ZWJ4bWxfbm90X2ZvdW5kPXdlYi54bWxcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5jbWRfbGluZS51c2FnZT1cdTRmN2ZcdTc1MjhcdTZjZDU6ICBbLWRkIDxcdTUxZmFcdTUyOWJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwNmVcdTMwZDFcdTMwYjk+XSBbLWtlZXBnZW5lcmF0ZWRdIFwKKzwuanNwXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU3ZmE0PgoranNwLm1lc3NhZ2UuY3BfaXM9XHUzMGFmXHUzMGU5XHUzMGI5XHUzMGQxXHUzMGI5IHswfSBcdTMwNmYgezF9IFx1MzA2N1x1MzA1OQoranNwLmVycm9yLnVuYWJsZS50b19sb2FkX3RhZ2hhbmRsZXJfY2xhc3M9XHUzMGJmXHUzMGIwXHUzMGNmXHUzMGYzXHUzMGM5XHUzMGU5XHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwOTIgezF9IFx1MzA2ZVx1MzA1Zlx1MzA4MVx1MzA2Ylx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnVuYWJsZS50b19maW5kX21ldGhvZD1cdTVjNWVcdTYwMjcgezB9IFx1MzA2ZXNldHRlclx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnVuYWJsZS50b19jb252ZXJ0X3N0cmluZz1cdTVjNWVcdTYwMjcgezF9XHUzMDZlXHU2NTg3XHU1YjU3XHU1MjE3XHUzMDkyIHswfVx1MzA2Ylx1NTkwOVx1NjNkYlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnVuYWJsZS50b19pbnRyb3NwZWN0PVx1MzBiZlx1MzBiMFx1MzBjZlx1MzBmM1x1MzBjOVx1MzBlOVx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDkyIHsxfSBcdTMwNmVcdTMwNWZcdTMwODFcdTMwNmJcdTUxODVcdTc3MDFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5iYWRfdGFnPVx1MzBkN1x1MzBlY1x1MzBkNVx1MzBhM1x1MzBjM1x1MzBhZlx1MzBiOSB7MX1cdTMwNjdcdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYmZcdTMwYjBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwNmJcdTMwNmZcdTMwMDFcdTMwYmZcdTMwYjAgezB9IFx1MzA2Zlx1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnhtbC5iYWRfdGFnPVVSSSBcInsxfVwiIFx1MzA2Ylx1OTVhMlx1OTAyM1x1MzA2NVx1MzA1MVx1MzA4OVx1MzA4Y1x1MzA1Zlx1MzBiZlx1MzBiMFx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzA2ZVx1NGUyZFx1MzA2Ylx1MzA2Zlx1MzBiZlx1MzBiMCBcInswfVwiIFx1MzA2Zlx1NWI5YVx1N2ZhOVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmJhZF9zdHJpbmdfQ2hhcmFjdGVyPVx1OTU3N1x1MzA1NTBcdTMwNmVcdTkxNGRcdTUyMTdcdTMwNGJcdTMwODlcdTMwNmZcdTY1ODdcdTViNTdcdTMwOTJcdTUzZDZcdTVmOTdcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5iYWRfc3RyaW5nX2NoYXI9XHU5NTc3XHUzMDU1MFx1MzA2ZVx1OTE0ZFx1NTIxN1x1MzA0Ylx1MzA4OVx1MzA2Zlx1NjU4N1x1NWI1N1x1MzA5Mlx1NTNkNlx1NWY5N1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLndhcm5pbmcuY29tcGlsZXIuY2xhc3MuY2FudGNyZWF0ZT1cdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYjNcdTMwZjNcdTMwZDFcdTMwYTRcdTMwZTlcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwYWZcdTMwZTlcdTMwYjkgezB9IFx1MzA2ZVx1MzBhNFx1MzBmM1x1MzBiOVx1MzBiZlx1MzBmM1x1MzBiOVx1MzA5MiB7MX0gXHUzMDZlXHUzMDVmXHUzMDgxXHUzMDZiXHU0ZjVjXHU2MjEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMDkyU3VuXHUzMDZlSmF2YVx1MzBiM1x1MzBmM1x1MzBkMVx1MzBhNFx1MzBlOVx1MzA2Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMgoranNwLndhcm5pbmcuY29tcGlsZXIuY2xhc3Mubm90Zm91bmQ9XHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGIzXHUzMGYzXHUzMGQxXHUzMGE0XHUzMGU5XHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJub3QgZm91bmQuIFx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA5MlN1blx1MzA2ZUphdmFcdTMwYjNcdTMwZjNcdTMwZDFcdTMwYTRcdTMwZTlcdTMwNmJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIKK2pzcC53YXJuaW5nLmNvbXBpbGVyLnBhdGgubm90Zm91bmQ9XHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGIzXHUzMGYzXHUzMGQxXHUzMGE0XHUzMGU5XHUzMGQxXHUzMGI5IHswfSBcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTMwYjdcdTMwYjlcdTMwYzZcdTMwZTBcdTMwNmVQQVRIXHUzMDkyXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMDZiXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyCitqc3AuZXJyb3IuanNwYy51cmlyb290X25vdF9kaXI9LXVyaXJvb3QgXHUzMGFhXHUzMGQ3XHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHUzMDAxXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU5XHUzMDhiXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuanNwYy5taXNzaW5nVGFyZ2V0PVx1MzBiZlx1MzBmY1x1MzBiMlx1MzBjM1x1MzBjOFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MzogLXdlYmFwcFx1NTNjOFx1MzA2Zi11cmlyb290XHVmZjBjXHU1M2M4XHUzMDZmXHU0ZTAwXHUzMDY0XHU0ZWU1XHU0ZTBhXHUzMDZlSlNQXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuanNwYy5ub191cmlyb290PXVyaXJvb3RcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwNmFcdTMwNDRcdTMwNmVcdTMwNjdcdTMwMDFcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZKU1BcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIoXHU3ZmE0KVx1MzA5Mlx1OTE0ZFx1N2Y2ZVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwYy5pbXBsaWNpdC51cmlSb290PXVyaVJvb3RcdTMwNmZcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzgiezB9Ilx1MzA2Ylx1OGEyZFx1NWI5YVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OQoranNwYy51c2FnZT1cdTRmN2ZcdTc1MjhcdTZjZDU6IGpzcGMgPG9wdGlvbnM+IFstLV0gPGpzcCBmaWxlcz5cblwKK0pTUFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZVx1NTgzNFx1NjI0MFx1MzA2Zlx1NmIyMVx1MzA2ZVx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2N1x1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA0Ylx1MzAwMVxuXAorXCAgICAtd2ViYXBwIDxkaXI+ICAgd2ViLWFwcFx1MzA5Mlx1NTQyYlx1MzA4MFx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzAwMlx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZUpTUFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZlxuXAorXCAgICAgICAgICAgICAgICAgICAgXHU1MThkXHU1ZTMwXHU3Njg0XHUzMDZiXHU4OWUzXHU2NzkwXHUzMDU1XHUzMDhjXHUzMDhiXG5cCitcdTUzYzhcdTMwNmZcdTZiMjFcdTMwNmVcdTRlZmJcdTYxMGZcdTMwNmVcdTY1NzBcdTMwNmVcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNjdcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDJcblwKK1wgICAgPGZpbGU+ICAgICAgICAgIEpTUFx1MzA2OFx1MzA1N1x1MzA2Nlx1ODllM1x1Njc5MFx1MzA1NVx1MzA4Y1x1MzA4Ylx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlxuXAorXHUzMGFhXHUzMGQ3XHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHU0ZWU1XHU0ZTBiXHUzMDZlXHU5MDFhXHUzMDhhXHUzMDY3XHUzMDU5XG5cCitcICAgIC1oZWxwICAgICAgICAgICBcdTMwNTNcdTMwNmVcdTMwZDhcdTMwZWJcdTMwZDdcdTMwZTFcdTMwYzNcdTMwYmJcdTMwZmNcdTMwYjhcdTMwNmVcdTg4NjhcdTc5M2FcblwKK1wgICAgLXYgICAgICAgICAgICAgIFZlcmJvc2VcdTMwZTJcdTMwZmNcdTMwYzlcblwKK1wgICAgLWQgPGRpcj4gICAgICAgIFx1NTFmYVx1NTI5Ylx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVxuXAorXCAgICAtbCAgICAgICAgICAgICAgXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDVmSlNQXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDZlXHU1MWZhXHU1MjliXG5cCitcICAgIC1zICAgICAgICAgICAgICBcdTYyMTBcdTUyOWZcdTMwNTdcdTMwNWZKU1BcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNmVcdTUxZmFcdTUyOWJcblwKK1wgICAgLXAgPG5hbWU+ICAgICAgIFx1MzBiZlx1MzBmY1x1MzBiMlx1MzBjM1x1MzBjOFx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOFx1MzA2ZVx1NTQwZFx1NTI0ZCAgKFx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA2Zm9yZy5hcGFjaGUuanNwKVxuXAorXCAgICAtYyA8bmFtZT4gICAgICAgXHUzMGJmXHUzMGZjXHUzMGIyXHUzMGMzXHUzMGM4XHUzMGFmXHUzMGU5XHUzMGI5XHUzMDZlXHU1NDBkXHU1MjRkIChcdTY3MDBcdTUyMWRcdTMwNmVKU1BcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNjBcdTMwNTFcdTMwNmJcdTkwNjlcdTc1MjhcdTMwNTVcdTMwOGNcdTMwOGIpXG5cCitcICAgIC1tYXBwZWQgICAgICAgICBKU1BcdTMwNmVcdTU0MDRIVE1MXHU4ODRjXHUzMDU0XHUzMDY4XHUzMDZid3JpdGUoKVx1MzBiM1x1MzBmY1x1MzBlYlx1MzA5Mlx1NzUxZlx1NjIxMFxuXAorXCAgICAtZGllWyNdICAgICAgICAgXHU4MWY0XHU1NDdkXHU3Njg0XHUzMGE4XHUzMGU5XHUzMGZjXHUzMDZiXHUzMGE4XHUzMGU5XHUzMGZjXHUzMGVhXHUzMGJmXHUzMGZjXHUzMGYzXHUzMGIzXHUzMGZjXHUzMGM5KCMpXHUzMDkyXHU3NTFmXHU2MjEwIChcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmYxKVxuXAorXCAgICAtdXJpYmFzZSA8ZGlyPiAgXHUzMGIzXHUzMGYzXHUzMGQxXHUzMGE0XHUzMGViXHUzMDRjXHU3NmY4XHU1YmZlXHU3Njg0XHUzMDZiXHUzMDRhXHUzMDUzXHUzMDZhXHUzMDhmXHUzMDhjXHUzMDhidXJpXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXG5cCitcICAgICAgICAgICAgICAgICAgICAoXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMDZmIi8iKVxuXAorXCAgICAtdXJpcm9vdCA8ZGlyPiAgLXdlYmFwcFx1MzA2OFx1NTQwY1x1MzA1OFxuXAorXCAgICAtY29tcGlsZSAgICAgICAgXHU3NTFmXHU2MjEwXHUzMDU3XHUzMDVmXHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHUzMDZlXHUzMGIzXHUzMGYzXHUzMGQxXHUzMGE0XHUzMGViXG5cCitcICAgIC13ZWJpbmMgPGZpbGU+ICBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmJcdTkwZThcdTUyMDZcdTc2ODRcdTMwNmFcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTMwZGVcdTMwYzNcdTMwZDRcdTMwZjNcdTMwYjBcdTMwOTJcdTRmNWNcdTYyMTBcblwKK1wgICAgLXdlYnhtbCA8ZmlsZT4gIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2Ylx1NWI4Y1x1NTE2OFx1MzA2YXdlYi54bWxcdTMwOTJcdTRmNWNcdTYyMTBcblwKK1wgICAgLWllcGx1Z2luIDxjbHNpZD4gIEludGVybmV0IEV4cGxvcmVyXHUzMDZlSmF2YSBQbHVnaW5cdTMwNmVjbGFzc2lkXG5cCitcICAgIC1jbGFzc3BhdGggPHBhdGg+ICBqYXZhLmNsYXNzLnBhdGhcdTMwYjdcdTMwYjlcdTMwYzZcdTMwZTBcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTRlMGFcdTY2ZjhcdTMwNGRcblwKK1wgICAgLXhwb3dlcmVkQnkgICAgICAgIFgtUG93ZXJlZC1CeVx1MzBlY1x1MzBiOVx1MzBkZFx1MzBmM1x1MzBiOVx1MzBkOFx1MzBjM1x1MzBjMFx1MzA2ZVx1OGZmZFx1NTJhMFxuXAorXCAgICAtdHJpbVNwYWNlcyAgICAgICAgXHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDg0XHU2MzA3XHU3OTNhXHU1YjUwXHUzMDZlXHU5NTkzXHUzMDZlXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHU0ZTJkXHUzMDZlXHUzMGI5XHUzMGRhXHUzMGZjXHUzMGI5XHUzMDkyXHU1MjRhXHU5NjY0XG5cCitcICAgIC10cmltU3BhY2VzICAgICAgICBUcmltIHNwYWNlcyBpbiB0ZW1wbGF0ZSB0ZXh0IGJldHdlZW4gYWN0aW9ucywgZGlyZWN0aXZlc1xuXAorXCAgICAtamF2YUVuY29kaW5nIDxlbmM+IFNldCB0aGUgZW5jb2RpbmcgY2hhcnNldCBmb3IgSmF2YSBjbGFzc2VzIChkZWZhdWx0IFVURi04KVxuXAorXCAgICAtc291cmNlIDx2ZXJzaW9uPiAgIFNldCB0aGUgLXNvdXJjZSBhcmd1bWVudCB0byB0aGUgY29tcGlsZXIgKGRlZmF1bHQgMS40KVxuXAorXCAgICAtdGFyZ2V0IDx2ZXJzaW9uPiAgIFNldCB0aGUgLXRhcmdldCBhcmd1bWVudCB0byB0aGUgY29tcGlsZXIgKGRlZmF1bHQgMS40KVxuXAorCitqc3BjLndlYnhtbC5oZWFkZXI9PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PlxuXAorXG5cCis8IURPQ1RZUEUgd2ViLWFwcFxuXAorXCAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiJcblwKK1wgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+XG5cCis8IS0tXG5cCitBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgQXBhY2hlIEpha2FydGEgVG9tY2F0IEpzcEMuXG5cCistLT5cblwKKzx3ZWItYXBwPlxuXAorXG4KK2pzcGMud2VieG1sLmZvb3Rlcj1cblwKKzwvd2ViLWFwcD5cblwKK1xuCitqc3BjLndlYmluYy5oZWFkZXI9XG5cCis8IS0tXG5cCitBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgQXBhY2hlIEpha2FydGEgVG9tY2F0IEpzcEMuXG5cCitQbGFjZSB0aGlzIGZyYWdtZW50IGluIHRoZSB3ZWIueG1sIGJlZm9yZSBhbGwgaWNvbiwgZGlzcGxheS1uYW1lLFxuXAorZGVzY3JpcHRpb24sIGRpc3RyaWJ1dGFibGUsIGFuZCBjb250ZXh0LXBhcmFtIGVsZW1lbnRzLlxuXAorLS0+XG4KK2pzcGMud2ViaW5jLmZvb3Rlcj1cblwKKzwhLS1cblwKK0FsbCBzZXNzaW9uLWNvbmZpZywgbWltZS1tYXBwaW5nLCB3ZWxjb21lLWZpbGUtbGlzdCwgZXJyb3ItcGFnZSwgdGFnbGliLFxuXAorcmVzb3VyY2UtcmVmLCBzZWN1cml0eS1jb25zdHJhaW50LCBsb2dpbi1jb25maWcsIHNlY3VyaXR5LXJvbGUsXG5cCitlbnYtZW50cnksIGFuZCBlamItcmVmIGVsZW1lbnRzIHNob3VsZCBmb2xsb3cgdGhpcyBmcmFnbWVudC5cblwKKy0tPlxuCitqc3BjLndlYmluYy5pbnNlcnRFbmQ9PCEtLSBKU1BDIHNlcnZsZXQgbWFwcGluZ3MgZW5kIC0tPgoranNwYy53ZWJpbmMuaW5zZXJ0U3RhcnQ9PCEtLSBKU1BDIHNlcnZsZXQgbWFwcGluZ3Mgc3RhcnQgLS0+Citqc3BjLmVycm9yLmphc3BlckV4Y2VwdGlvbj1cdTMwYThcdTMwZTlcdTMwZmM6IFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiAnJ3swfScnIFx1MzA2Zlx1NmIyMVx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA5Mlx1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZjogezF9Citqc3BjLmVycm9yLmdlbmVyYWxFeGNlcHRpb249XHUzMGE4XHUzMGU5XHUzMGZjOiBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgJyd7MH0nJyBcdTMwNmZcdTZiMjFcdTMwNmVcdTRmOGJcdTU5MTZcdTMwOTJcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWY6Citqc3BjLmVycm9yLmZpbGVEb2VzTm90RXhpc3Q9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU1ZjE1XHU2NTcwICcnezB9JycgXHUzMDZmXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCitqc3BjLmVycm9yLmVtcHR5V2ViQXBwPS13ZWJhcHBcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmJcdTMwNmZcdTMwMDFcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTVmMTVcdTY1NzBcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci5saWJyYXJ5LmludmFsaWQ9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhezB9XHUzMDZiXHU1ZjkzXHUzMDQ2XHUzMDY4SlNQXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5OiB7MX0KK2pzcC5lcnJvci50bHZjbGFzcy5pbnN0YW50aWF0aW9uPVRhZ0xpYnJhcnlWYWxpZGF0b3JcdTMwYWZcdTMwZTlcdTMwYjlcdTMwNmVcdTMwZWRcdTMwZmNcdTMwYzlcdTUzYzhcdTMwNmZcdTMwYTRcdTMwZjNcdTMwYjlcdTMwYmZcdTMwZjNcdTMwYjlcdTUzMTZcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWY6IHswfQoranNwLmVycm9yLnRsdi5pbnZhbGlkLnBhZ2U9ezB9IFx1MzA2Ylx1NWJmZVx1MzA1OVx1MzA4YlRhZ0xpYnJhcnlWYWxpZGF0b3JcdTMwNmVcdTY5MWNcdThhM2NcdTMwYThcdTMwZTlcdTMwZmNcdTMwZTFcdTMwYzNcdTMwYmJcdTMwZmNcdTMwYjhcdTMwNjdcdTMwNTkgKHsxfSkKK2pzcC5lcnJvci50ZWkuaW52YWxpZC5hdHRyaWJ1dGVzPXswfSBcdTMwNmJcdTViZmVcdTMwNTlcdTMwOGJUYWdFeHRyYUluZm9cdTMwNGJcdTMwODlcdTMwNmVcdTY5MWNcdThhM2NcdTMwYThcdTMwZTlcdTMwZmNcdTMwZTFcdTMwYzNcdTMwYmJcdTMwZmNcdTMwYjhcdTMwNjdcdTMwNTkKK2pzcC5wYXJzZXIuc2F4LnByb3BlcnR5bm90c3VwcG9ydGVkPVNBWFx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzA0Y1x1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5MzogezB9Citqc3AucGFyc2VyLnNheC5wcm9wZXJ0eW5vdHJlY29nbml6ZWQ9U0FYXHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMDRjXHU4YThkXHU4YjU4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzOiB7MH0KK2pzcC5wYXJzZXIuc2F4LmZlYXR1cmVub3RzdXBwb3J0ZWQ9U0FYXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMDRjXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzOiB7MH0KK2pzcC5wYXJzZXIuc2F4LmZlYXR1cmVub3RyZWNvZ25pemVkPVNBWFx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzA0Y1x1OGE4ZFx1OGI1OFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5MzogezB9Citqc3AuZXJyb3Iubm8ubW9yZS5jb250ZW50PVx1NWZjNVx1ODk4MVx1MzA2YVx1ODllM1x1Njc5MFx1NGUyZFx1MzA2Ylx1NTE4NVx1NWJiOVx1MzA2ZVx1NjcwMFx1NWY4Y1x1MzA3ZVx1MzA2N1x1OTA1NFx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZjogXHUzMGJmXHUzMGIwXHUzMDZlXHUzMGNkXHUzMGI5XHUzMGM4XHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRiXHUzMDgyXHUzMDU3XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IucGFyc2UueG1sPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYnswfVx1MzA2ZVhNTFx1ODllM1x1Njc5MFx1MzBhOFx1MzBlOVx1MzBmYworanNwLmVycm9yLnBhcnNlLnhtbC5saW5lPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYnswfVx1MzA2ZVhNTFx1ODllM1x1Njc5MFx1MzBhOFx1MzBlOVx1MzBmYzogKFx1ODg0YyB7MX0sIFx1NTIxNyB7Mn0pCitqc3AuZXJyb3IucGFyc2UueG1sLnNjcmlwdGluZy5pbnZhbGlkLmJvZHk9ezB9IFx1ODk4MVx1N2QyMFx1MzA2ZVx1MzBkY1x1MzBjN1x1MzBhM1x1MzA2ZlhNTFx1ODk4MVx1N2QyMFx1MzA5Mlx1NTQyYlx1MzA5M1x1MzA2N1x1MzA2Zlx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmludGVybmFsLnRsZGluaXQ9VGxkTG9jYXRpb25zQ2FjaGVcdTMwOTJcdTUyMWRcdTY3MWZcdTUzMTZcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTk6IHswfQoranNwLmVycm9yLmludGVybmFsLmZpbGVub3Rmb3VuZD1cdTUxODVcdTkwZThcdTMwYThcdTMwZTlcdTMwZmM6IFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiB7MH0gXHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuaW50ZXJuYWwuZXZhbHVhdG9yX25vdF9mb3VuZD1cdTUxODVcdTkwZThcdTMwYThcdTMwZTlcdTMwZmM6IFx1NWYwZlx1NjkxY1x1OGEzY1x1NTY2OFx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnBhcnNlLnhtbC5pbnZhbGlkUHVibGljSWQ9XHU3MTIxXHU1MmI5XHUzMDZhUFVCTElDIElEOiB7MH0KK2pzcC5lcnJvci5pbmNsdWRlLmZsdXNoLmludmFsaWQudmFsdWU9Zmx1c2hcdTVjNWVcdTYwMjdcdTMwNmJcdTcxMjFcdTUyYjlcdTMwNmFcdTUwMjRcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTk6IHswfQoranNwLmVycm9yLnVuc3VwcG9ydGVkLmVuY29kaW5nPVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA2YVx1MzA0NFx1MzBhOFx1MzBmM1x1MzBiM1x1MzBmY1x1MzBjN1x1MzBhM1x1MzBmM1x1MzBiMFx1MzA2N1x1MzA1OTogezB9Cit0bGQuZXJyb3IudmFyaWFibGVOb3RBbGxvd2VkPW51bGxcdTMwNjdcdTMwNmFcdTMwNDRcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTMwOTJcdThmZDRcdTMwNTlUYWdFeHRyYUluZm9cdTMwOTJcdTYzMDFcdTMwNjRcdTRlMDBcdTMwNjRcdTRlZTVcdTRlMGFcdTMwNmVcdTU5MDlcdTY1NzBcdTUyNmZcdTg5ODFcdTdkMjBcdTMwOTJcdTYzMDFcdTMwNjRcdTMwYmZcdTMwYjBcdTMwNmZcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTlcdTMwMDIKK2pzcC5lcnJvci50bGRJbldlYkRvdFhtbE5vdEZvdW5kPXdlYi54bWxcdTMwNjdcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZVUkkgezB9IFx1MzA2YlRMRFx1MzA5Mlx1OTE0ZFx1N2Y2ZVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnRhZ2xpYkRpcmVjdGl2ZS5hYnNVcmlDYW5ub3RCZVJlc29sdmVkPVx1N2Q3Nlx1NWJmZVVSSTogIHswfSBcdTMwNmZ3ZWIueG1sXHUzMDY4XHUzMDUzXHUzMDZlXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU5MTRkXHU1MDk5XHUzMDU3XHUzMDVmSkFSXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHUzMDY5XHUzMDYxXHUzMDg5XHUzMDRiXHUzMDY3XHUzMDgyXHU4OWUzXHU2YzdhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IudGFnbGliRGlyZWN0aXZlLm1pc3NpbmcubG9jYXRpb249dGFnbGliXHU2MzA3XHU3OTNhXHU1YjUwXHUzMDZlXHU0ZTJkXHUzMDZiJ3VyaSdcdTVjNWVcdTYwMjdcdTMwNjgndGFnZGlyJ1x1NWM1ZVx1NjAyN1x1MzA2ZVx1MzA2OVx1MzA2MVx1MzA4OVx1MzA4Mlx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnRhZ2xpYkRpcmVjdGl2ZS5ib3RoX3VyaV9hbmRfdGFnZGlyPVwndXJpXCdcdTVjNWVcdTYwMjcgXHUzMDY4IFwndGFnZGlyXCdcdTVjNWVcdTYwMjdcdTMwNmVcdTRlMjFcdTY1YjlcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5pbnZhbGlkLnRhZ2Rpcj1cdTMwYmZcdTMwYjBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWEgezB9IFx1MzA0Y1wiL1dFQi1JTkYvdGFnc1wiXHUzMDY3XHU1OWNiXHUzMDdlXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IudW50ZXJtaW5hdGVkLnVzZXIudGFnPVx1NjcyYVx1N2Q0Mlx1NGU4Nlx1MzA2ZVx1MzBlNlx1MzBmY1x1MzBiNlx1NWI5YVx1N2ZhOVx1MzBiZlx1MzBiMDogXHU3ZDQyXHU0ZTg2XHUzMGJmXHUzMGIwIHswfSBcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwODlcdTMwNmFcdTMwNDRcdTMwNGJcdTMwMDFcdTMwY2RcdTMwYjlcdTMwYzhcdTMwNGNcdTk1OTNcdTkwNTVcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKKyNqc3B4LmVycm9yLnRlbXBsYXRlRGF0YU5vdEluSnNwQ2RhdGE9VmFsaWRhdGlvbiBFcnJvcjogRWxlbWVudCAmbHQ7ezB9Jmd0OyBjYW5ub3QgaGF2ZSB0ZW1wbGF0ZSBkYXRhLiBUZW1wbGF0ZSBkYXRhIG11c3QgYmUgZW5jYXBzdWxhdGVkIHdpdGhpbiBhICZsdDtqc3A6Y2RhdGEmZ3Q7IGVsZW1lbnQuIFtKU1AxLjIgUEZEIHNlY3Rpb24gNS4xLjldXG5UZW1wbGF0ZSBkYXRhIGluIGVycm9yOiB7MX0KK2pzcHguZXJyb3IudGVtcGxhdGVEYXRhTm90SW5Kc3BDZGF0YT1cdThhM2NcdTY2MGVcdTMwYThcdTMwZTlcdTMwZmM6IFx1ODk4MVx1N2QyMCZsdDt7MH0mZ3Q7XHUzMDZmXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMGM3XHUzMGZjXHUzMGJmXHUzMDkyXHU2MzAxXHUzMDY0XHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMGM3XHUzMGZjXHUzMGJmXHUzMDZmXHUzMDAxJmx0O2pzcDp0ZXh0Jmd0O1x1ODk4MVx1N2QyMFx1MzA2ZVx1NGUyZFx1MzA2N1x1OTZhMFx1ODUzZFx1MzA1NVx1MzA4Y1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMltKU1AxLjIgUEZEIDUuMS45XVxuXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMGM3XHUzMGZjXHUzMGJmXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5OiB7MX0KKyNFcnJvciB3aGlsZSBwcm9jZXNzaW5nIHRhZ2xpYiBqYXIgZmlsZSB7MH06IHsxfQoranNwLmVycm9yLnRhZ2xpYi5yZXNlcnZlZC5wcmVmaXg9dGFnbGliXHUzMGQ3XHUzMGVhXHUzMGQ1XHUzMGEzXHUzMGFmXHUzMGI5IHswfSBcdTMwNmZcdTRlODhcdTdkMDRcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5pbnZhbGlkLmphdmFFbmNvZGluZz1cdTcxMjFcdTUyYjlcdTMwNmFKYXZhXHUzMGE4XHUzMGYzXHUzMGIzXHUzMGZjXHUzMGM3XHUzMGEzXHUzMGYzXHUzMGIwXHUzMDY3XHUzMDU5XHUzMDAyezB9XHUzMDkyXHU4YTY2XHUzMDU3XHUzMDY2XHUzMDAxXHUzMDVkXHUzMDhjXHUzMDRiXHUzMDg5ezF9XHUzMDkyXHU4YTY2XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDRjXHUzMDAxXHU0ZTIxXHU2NWI5XHUzMDRjXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitqc3AuZXJyb3IubmVlZEFsdGVybmF0ZUphdmFFbmNvZGluZz1cdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmVKYXZhXHUzMGE4XHUzMGYzXHUzMGIzXHUzMGZjXHUzMGM3XHUzMGEzXHUzMGYzXHUzMGIwIHswfSBcdTMwNmZcdTMwNDJcdTMwNmFcdTMwNWZcdTMwNmVcdTMwZDdcdTMwZTlcdTMwYzNcdTMwYzhcdTMwZDVcdTMwYTlcdTMwZmNcdTMwZTBcdTMwNjdcdTMwNmZcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTlcdTMwMDJKc3BTZXJ2bGV0XHUzMDZlICdqYXZhRW5jb2RpbmcnIFx1MzBkMVx1MzBlOVx1MzBlMVx1MzBiZlx1MzA2N1x1MzAwMVx1NTIyNVx1MzA2ZVx1NTAyNFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMgorI0Vycm9yIHdoZW4gY29tcGlsaW5nLCB1c2VkIGZvciBqc3AgbGluZSBudW1iZXIgZXJyb3IgbWVzc2FnZXMKK2pzcC5lcnJvci5zaW5nbGUubGluZS5udW1iZXI9SlNQXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViOiB7MX0gXHUzMDZlXHU0ZTJkXHUzMDZlezB9XHU4ODRjXHU3NmVlXHUzMDY3XHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitqc3AuZXJyb3IubXVsdGlwbGUubGluZS5udW1iZXI9XG5cbkpQU1x1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYjogezJ9XHUzMDZlXHU0ZTJkXHUzMDZlezB9XHU4ODRjXHU3NmVlXHUzMDY4ezF9XHU4ODRjXHU3NmVlXHUzMDZlXHU5NTkzXHUzMDY3XHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXG5cbgoranNwLmVycm9yLmNvcnJlc3BvbmRpbmcuc2VydmxldD1cdTc1MWZcdTYyMTBcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTk6XG4KK2pzcC5lcnJvci5lbXB0eS5ib2R5Lm5vdC5hbGxvd2VkPXswfSBcdTMwNmJcdTViZmVcdTMwNTdcdTMwNjZcdTdhN2FcdTMwNmVcdTMwZGNcdTMwYzdcdTMwYTNcdTMwNmZcdThhMzFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5qc3Bib2R5LnJlcXVpcmVkPWpzcDphdHRyaWJ1dGVcdTMwNGNcdTRmN2ZcdTc1MjhcdTMwNTVcdTMwOGNcdTMwNWZcdTU4MzRcdTU0MDhcdTMwNmJcdTMwNmZcdTMwMDF7MH1cdTMwNmJcdTMwYmZcdTMwYjBcdTMwZGNcdTMwYzdcdTMwYTNcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTlcdTMwOGJcdTMwNWZcdTMwODFcdTMwNmJqc3A6Ym9keVx1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmpzcGJvZHkuZW1wdHlib2R5Lm9ubHk9ezB9IFx1MzBiZlx1MzBiMFx1MzA2Zlx1MzAwMVx1MzA1ZFx1MzA2ZVx1MzBkY1x1MzBjN1x1MzBhM1x1NGUyZFx1MzA2YmpzcDphdHRyaWJ1dGVcdTMwNjBcdTMwNTFcdTMwOTJcdTYzMDFcdTMwNjRcdTMwNTNcdTMwNjhcdTMwNGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5uby5zY3JpcHRsZXRzPVx1MzBiOVx1MzBhZlx1MzBlYVx1MzBkN1x1MzBjNlx1MzBhM1x1MzBmM1x1MzBiMFx1ODk4MVx1N2QyMCAoICZsdDslIVx1MzAwMSZsdDtqc3A6ZGVjbGFyYXRpb25cdTMwMDEmbHQ7JT1cdTMwMDEmbHQ7anNwOmV4cHJlc3Npb25cdTMwMDEmbHQ7JVx1MzAwMSZsdDtqc3A6c2NyaXB0bGV0ICkgXHUzMDZmXHUzMDUzXHUzMDUzXHUzMDY3XHUzMDZmXHU4YTMxXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuaW50ZXJuYWwudW5leHBlY3RlZF9ub2RlX3R5cGU9XHU1MTg1XHU5MGU4XHUzMGE4XHUzMGU5XHUzMGZjOiBcdTY3MmFcdTc3ZTVcdTMwNmVcdTMwY2VcdTMwZmNcdTMwYzlcdTMwYmZcdTMwYTRcdTMwZDdcdTMwNGNcdTg4NjhcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWYKK2pzcC5lcnJvci50bGQuZm4uaW52YWxpZC5zaWduYXR1cmU9VExEXHUzMDZlXHU0ZTJkXHUzMDZlXHU5NWEyXHU2NTcwXHUzMGI3XHUzMGIwXHUzMGNkXHUzMGMxXHUzMGUzXHUzMDZiXHU1YmZlXHUzMDU5XHUzMDhiXHU3MTIxXHU1MmI5XHUzMDZhXHU2OWNiXHU2NTg3XHUzMDY3XHUzMDU5XHUzMDAyXHUzMGJmXHUzMGIwXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhOiB7MH1cdTMwMDFcdTk1YTJcdTY1NzA6IHsxfQoranNwLmVycm9yLnRsZC5mbi5kdXBsaWNhdGUubmFtZT1cdTMwYmZcdTMwYjBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWEgezF9IFx1MzA2ZVx1NGUyZFx1MzA2ZVx1OTVhMlx1NjU3MFx1NTQwZCB7MH0gXHUzMDRjXHU5MWNkXHU4OTA3XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Citqc3AuZXJyb3IudGxkLmZuLmludmFsaWQuc2lnbmF0dXJlLmNvbW1hZXhwZWN0ZWQ9VExEXHUzMDZlXHU0ZTJkXHUzMDZlXHU5NWEyXHU2NTcwXHUzMGI3XHUzMGIwXHUzMGNkXHUzMGMxXHUzMGUzXHUzMDZiXHU1YmZlXHUzMDU5XHUzMDhiXHU3MTIxXHU1MmI5XHUzMDZhXHU2OWNiXHU2NTg3XHUzMDY3XHUzMDU5XHUzMDAyXHUzMGIzXHUzMGYzXHUzMGRlICcsJyBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTMwYmZcdTMwYjBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWE6IHswfVx1MzAwMVx1OTVhMlx1NjU3MDogezF9XHUzMDAyCitqc3AuZXJyb3IudGxkLmZuLmludmFsaWQuc2lnbmF0dXJlLnBhcmVuZXhwZWN0ZWQ9VExEXHUzMDZlXHU0ZTJkXHUzMDZlXHU5NWEyXHU2NTcwXHUzMGI3XHUzMGIwXHUzMGNkXHUzMGMxXHUzMGUzXHUzMDZiXHU1YmZlXHUzMDU5XHUzMDhiXHU3MTIxXHU1MmI5XHUzMDZhXHU2OWNiXHU2NTg3XHUzMDY3XHUzMDU5XHUzMDAyXHU2MmVjXHU1ZjI3ICcoJyBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTMwYmZcdTMwYjBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWE6IHswfVx1MzAwMVx1OTVhMlx1NjU3MDogezF9XHUzMDAyCitqc3AuZXJyb3IudGxkLm1hbmRhdG9yeS5lbGVtZW50Lm1pc3Npbmc9XHU1ZmM1XHU5ODA4VExEXHU4OTgxXHU3ZDIwXHUzMDRjXHUzMDZhXHUzMDQ0XHUzMDAxXHU1M2M4XHUzMDZmXHU3YTdhXHUzMDY3XHUzMDU5OiB7MH0KK2pzcC5lcnJvci5keW5hbWljLmF0dHJpYnV0ZXMubm90LmltcGxlbWVudGVkPXswfSBcdTMwYmZcdTMwYjBcdTMwNmZcdTMwNWRcdTMwOGNcdTMwNGNkeW5hbWljXHU1YzVlXHU2MDI3XHUzMDkyXHU1M2Q3XHUzMDUxXHU0ZWQ4XHUzMDUxXHUzMDhiXHUzMDY4XHU1YmEzXHU4YTAwXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDRjXHUzMDAxXHUzMDVkXHUzMDhjXHUzMDZiXHU1ZmM1XHU4OTgxXHUzMDZhXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5XHUzMDkyXHU1YjlmXHU4OGM1XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iubm9tYXRjaGluZy5mcmFnbWVudD1hdHRyaWJ1dGVcdTYzMDdcdTc5M2FcdTViNTAgKG5hbWU9ezB9XHUzMDRhXHUzMDg4XHUzMDczZnJhZ21lbnQ9dHJ1ZVx1MzA5Mlx1NjMwMVx1MzA2NCkgXHUzMDRjZnJhZ21lbnRcdTYzMDdcdTc5M2FcdTViNTBcdTMwODhcdTMwOGFcdTUyNGRcdTMwNmJcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5hdHRyaWJ1dGUubm9lcXVhbD1cdTdiNDlcdTUzZjdcdThhMThcdTUzZjdcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci5hdHRyaWJ1dGUubm9xdW90ZT1cdTVmMTVcdTc1MjhcdTdiMjZcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci5hdHRyaWJ1dGUudW50ZXJtaW5hdGVkPXswfSBcdTMwNmVcdTVjNWVcdTYwMjdcdTMwNGNcdTZiNjNcdTMwNTdcdTMwNGZcdTdkNDJcdTRlODZcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5taXNzaW5nLnRhZ0luZm89ezB9IFx1MzA2Ylx1NWJmZVx1MzA1OVx1MzA4YlRhZ0luZm9cdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTMwNGNUTERcdTMwNGJcdTMwODlcdTU5MzFcdTMwOGZcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWYKK2pzcC5lcnJvci5mcmFnbWVudHdpdGh0eXBlPSdmcmFnbWVudCdcdTVjNWVcdTYwMjdcdTMwNjgndHlwZSdcdTVjNWVcdTYwMjdcdTMwOTJcdTRlMjFcdTY1YjlcdTYzMDdcdTViOWFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDInZnJhZ21lbnQnXHUzMDRjXHU1YjU4XHU1NzI4XHUzMDU5XHUzMDhiXHU1ODM0XHU1NDA4XHUzMDZiXHUzMDZmJ3R5cGUnXHUzMDZmJ2phdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BGcmFnbWVudCdcdTMwNmJcdTU2ZmFcdTViOWFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5mcmFnbWVudHdpdGhydGV4cHJ2YWx1ZT0nZnJhZ21lbnQnXHU1YzVlXHU2MDI3XHUzMDY4J3J0ZXhwcnZhbHVlJ1x1NWM1ZVx1NjAyN1x1MzA5Mlx1NGUyMVx1NjViOVx1NjMwN1x1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMidmcmFnbWVudCdcdTMwNGNcdTViNThcdTU3MjhcdTMwNTlcdTMwOGJcdTU4MzRcdTU0MDhcdTMwNmJcdTMwNmYncnRleHBydmFsdWUnXHUzMDZmJ3RydWUnXHUzMDZiXHU1NmZhXHU1YjlhXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5Citqc3AuZXJyb3IuZnJhZ21lbnRXaXRoRGVjbGFyZU9yU2NvcGU9J2ZyYWdtZW50J1x1NWM1ZVx1NjAyN1x1MzA2OCdkZWNsYXJlJ1x1NWM1ZVx1NjAyN1x1MzA2ZVx1NGUyMVx1NjViOVx1NTNjOFx1MzA2ZidzY29wZSdcdTVjNWVcdTYwMjdcdTMwNGN2YXJpYWJsZVx1NjMwN1x1NzkzYVx1NWI1MFx1NGUyZFx1MzA2N1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQoranNwLmVycm9yLnZhcl9hbmRfdmFyUmVhZGVyPVwndmFyXCdcdTUzYzhcdTMwNmZcJ3ZhclJlYWRlclwnXHUzMDZlXHUzMDY5XHUzMDYxXHUzMDg5XHUzMDRiXHU0ZTAwXHUzMDY0XHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDRjXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDU5Citqc3AuZXJyb3IubWlzc2luZ192YXJfb3JfdmFyUmVhZGVyPVwndmFyXCdcdTUzYzhcdTMwNmZcJ3ZhclJlYWRlclwnXHU1YzVlXHU2MDI3XHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3Aud2FybmluZy5iYWQudXJscGF0dGVybi5wcm9wZXJ0eWdyb3VwPXdlYi54bWxcdTRlMmRcdTMwNmV1cmwtcGF0dGVyblx1NTI2Zlx1ODk4MVx1N2QyMFx1NGUyZFx1MzA2Ylx1OGFhNFx1MzA2M1x1MzA1Zlx1NTAyNCB7MH0gXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5Citqc3AuZXJyb3IudW5rbm93bl9hdHRyaWJ1dGVfdHlwZT1cdTVjNWVcdTYwMjcgezB9IFx1MzA2Ylx1NWJmZVx1MzA1OVx1MzA4Ylx1NjcyYVx1NzdlNVx1MzA2ZVx1NWM1ZVx1NjAyN1x1MzBiZlx1MzBhNFx1MzBkN1x1MzA2N1x1MzA1OQoranNwLmVycm9yLmpzcGVsZW1lbnQubWlzc2luZy5uYW1lPVx1NWZjNVx1OTgwOFx1MzA2ZVhNTFx1MzBiOVx1MzBiZlx1MzBhNFx1MzBlYlx1MzA2ZSduYW1lJ1x1NWM1ZVx1NjAyN1x1MzA0Y2pzcDplbGVtZW50XHU0ZTJkXHUzMDZiXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IueG1sbnMucmVkZWZpbml0aW9uLm5vdGltcGxlbWVudGVkPVx1NTE4NVx1OTBlOFx1MzBhOFx1MzBlOVx1MzBmYzogeG1sbnM6ezB9XHUzMDkyXHU1MThkXHU1YjlhXHU3ZmE5XHUzMDU3XHUzMDg4XHUzMDQ2XHUzMDY4XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyXHU1NDBkXHU1MjRkXHU3YTdhXHU5NTkzXHUzMDZlXHU1MThkXHU1YjlhXHU3ZmE5XHUzMDZmXHU1YjlmXHU4OGM1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCitqc3AuZXJyb3IuY291bGQubm90LmFkZC50YWdsaWJyYXJpZXM9MVx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBiZlx1MzBiMFx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzA5Mlx1OGZmZFx1NTJhMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmR1cGxpY2F0ZS5uYW1lLmpzcGF0dHJpYnV0ZT1cdTZhMTlcdTZlOTZcdTUzYzhcdTMwNmZcdTMwYWJcdTMwYjlcdTMwYmZcdTMwZTBcdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTRlMmRcdTMwNjdcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwOGJcdTVjNWVcdTYwMjcgezB9IFx1MzA2Zlx1MzA1ZFx1MzA4Y1x1MzA2Ylx1NTZmMlx1MzA3ZVx1MzA4Y1x1MzA1ZmpzcDphdHRyaWJ1dGVcdTRlMmRcdTMwNmVuYW1lXHU1YzVlXHU2MDI3XHUzMDZlXHU1MDI0XHUzMDY4XHUzMDU3XHUzMDY2XHUzMDgyXHU4ODY4XHUzMDhjXHUzMDdlXHUzMDU5Citqc3AuZXJyb3Iubm90LmluLnRlbXBsYXRlPVx1MzBjNlx1MzBmM1x1MzBkN1x1MzBlY1x1MzBmY1x1MzBjOFx1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkY1x1MzBjN1x1MzBhM1x1NGUyZFx1MzA2N1x1MzA2ZiB7MH0gXHUzMDZmXHU4YTMxXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuYmFkU3RhbmRhcmRBY3Rpb249XHU3MTIxXHU1MmI5XHUzMDZhXHU2YTE5XHU2ZTk2XHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IueG1sLmJhZFN0YW5kYXJkQWN0aW9uPVx1NzEyMVx1NTJiOVx1MzA2YVx1NmExOVx1NmU5Nlx1MzBhMlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1MzA2N1x1MzA1OTogezB9Citqc3AuZXJyb3IudGFnZGlyZWN0aXZlLmJhZGJvZHljb250ZW50PXRhZ1x1NjMwN1x1NzkzYVx1NWI1MFx1NGUyZFx1MzA2ZVx1NzEyMVx1NTJiOVx1MzA2YWJvZHktY29udGVudCAoezB9KVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnNpbXBsZXRhZy5iYWRib2R5Y29udGVudD1cdTMwYWZcdTMwZTlcdTMwYjkgezB9IFx1MzA2ZVRMRFx1MzA2ZlNpbXBsZVRhZ1x1MzA2Ylx1NzEyMVx1NTJiOVx1MzA2YWJvZHktY29udGVudCAoSlNQKVx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQoranNwLmVycm9yLmNvbmZpZ19wYWdlZGlyX2VuY29kaW5nX21pc21hdGNoPWpzcC1wcm9wZXJ0eS1ncm91cFx1NGUyZFx1MzA2Ylx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA4YlBhZ2UtZW5jb2RpbmcgKHswfSkgXHUzMDRjcGFnZVx1NjMwN1x1NzkzYVx1NWI1MFx1NGUyZFx1MzA2ZVx1NjMwN1x1NWI5YSAoezF9KSBcdTMwNjhcdTkwNTVcdTMwNDRcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5wcm9sb2dfcGFnZWRpcl9lbmNvZGluZ19taXNtYXRjaD1YTUxcdTVjMGVcdTUxNjVcdTkwZThcdTMwNjdcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZwYWdlLWVuY29kaW5nICh7MH0pIFx1MzA0Y3BhZ2VcdTYzMDdcdTc5M2FcdTViNTBcdTRlMmRcdTMwNmVcdTYzMDdcdTViOWEgKHsxfSkgXHUzMDY4XHU5MDU1XHUzMDQ0XHUzMDdlXHUzMDU5Citqc3AuZXJyb3IucHJvbG9nX2NvbmZpZ19lbmNvZGluZ19taXNtYXRjaD1YTUxcdTVjMGVcdTUxNjVcdTkwZThcdTMwNjdcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZwYWdlLWVuY29kaW5nICh7MH0pIFx1MzA0Y2pzcC1wcm9wZXJ0eS1ncm91cFx1NGUyZFx1MzA2ZVx1NjMwN1x1NWI5YVx1MzA2OFx1OTA1NVx1MzA0NFx1MzA3ZVx1MzA1OSAoezF9KQoranNwLmVycm9yLmF0dHJpYnV0ZS5jdXN0b20ubm9uX3J0X3dpdGhfZXhwcj1UTERcdTUzYzhcdTMwNmZcdTMwYmZcdTMwYjBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTRlMmRcdTMwNmVhdHRyaWJ1dGVcdTYzMDdcdTc5M2FcdTViNTBcdTMwNmJcdTVmOTNcdTMwNjNcdTMwNjZcdTVjNWVcdTYwMjd7MH1cdTMwNmZcdTMwNjlcdTMwOTNcdTMwNmFcdTVmMGZcdTMwODJcdTUzZDdcdTMwNTFcdTRlZDhcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5hdHRyaWJ1dGUuc3RhbmRhcmQubm9uX3J0X3dpdGhfZXhwcj17MX0gXHU2YTE5XHU2ZTk2XHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlIHswfSBcdTVjNWVcdTYwMjdcdTMwNmZcdTMwNjlcdTMwOTNcdTMwNmFcdTVmMGZcdTMwODJcdTUzZDdcdTMwNTFcdTRlZDhcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5zY3JpcHRpbmcudmFyaWFibGUubWlzc2luZ19uYW1lPVx1NWM1ZVx1NjAyNyB7MH0gXHUzMDRiXHUzMDg5XHUzMGI5XHUzMGFmXHUzMGVhXHUzMGQ3XHUzMGM4XHU1OTA5XHU2NTcwXHU1NDBkXHUzMDkyXHU2YzdhXHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqYXNwZXIuZXJyb3IuZW1wdHlib2R5Y29udGVudC5ub25lbXB0eT1UTERcdTMwNmJcdTVmOTNcdTMwNjNcdTMwNjZcdTMwYmZcdTMwYjAgezB9IFx1MzA2Zlx1N2E3YVx1MzA2N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA0Y1x1MzAwMVx1MzA1ZFx1MzA0Nlx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnRhZ2ZpbGUubmFtZU5vdFVuaXF1ZT17Mn1cdTg4NGNcdTc2ZWVcdTMwNmUgezB9IFx1MzA2ZVx1NTAyNFx1MzA2OCB7MX0gXHUzMDZlXHU1MDI0XHUzMDZmXHU1NDBjXHUzMDU4XHUzMDY3XHUzMDU5Citqc3AuZXJyb3IudGFnZmlsZS5uYW1lRnJvbS5ub0F0dHJpYnV0ZT1cdTMwNTNcdTMwNmVuYW1lLWZyb20tYXR0cmlidXRlXHU1YzVlXHU2MDI3XHUzMDZlXHU1MDI0XHUzMDY3XHUzMDQyXHUzMDhiXHU1MDI0IFwiezB9XCIgXHUzMDZlbmFtZVx1NWM1ZVx1NjAyN1x1MzA5Mlx1NjMwMVx1MzA2NGF0dHJpYnV0ZVx1NjMwN1x1NzkzYVx1NWI1MFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnRhZ2ZpbGUubmFtZUZyb20uYmFkQXR0cmlidXRlPWF0dHJpYnV0ZVx1NjMwN1x1NzkzYVx1NWI1MCAoezF9XHU4ODRjXHU3NmVlXHUzMDY3XHU1YmEzXHU4YTAwXHUzMDU1XHUzMDhjXHUzMDAxXHUzMDVkXHUzMDZlbmFtZVx1NWM1ZVx1NjAyN1x1MzA0Y1wiezB9XCJcdTMwMDFcdTMwNTNcdTMwNmVuYW1lLWZyb20tYXR0cmlidXRlXHU1YzVlXHU2MDI3XHUzMDZlXHU1MDI0KSBcdTMwNmZqYXZhLmxhbmcuU3RyaW5nXHU1NzhiXHUzMDZlXCJyZXF1aXJlZFwiIFx1MzA2NyBcInJ0ZXhwcnZhbHVlXCIuXHUzMDY3XHUzMDQyXHUzMDYzXHUzMDY2XHUzMDZmXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IucGFnZS5ub1Nlc3Npb249XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZiXHU1MmEwXHUzMDhmXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDZhXHUzMDQ0XHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZlXHU0ZTJkXHUzMDY3XHUzMDZmXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGI5XHUzMGIzXHUzMGZjXHUzMGQ3XHUzMDZiXHUzMGEyXHUzMGFmXHUzMGJiXHUzMGI5XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IudXNlQmVhbi5ub1Nlc3Npb249SlNQXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDRjKHBhZ2VcdTYzMDdcdTc5M2FcdTViNTBcdTMwNmJcdTMwODhcdTMwOGEpXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHU0ZTJkXHUzMDY3XHU1MzU0XHU4YWJmXHUzMDU3XHUzMDZhXHUzMDQ0XHUzMDUzXHUzMDY4XHUzMDkyXHU1YmEzXHU4YTAwXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHU2NjQyXHUzMDAxXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGI5XHUzMGIzXHUzMGZjXHUzMGQ3XHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU5XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDZldXNlQmVhblx1MzA0Y1x1NGUwZFx1NmI2M1x1MzA2N1x1MzA1OQoranNwLmVycm9yLnhtbC5lbmNvZGluZ0J5dGVPcmRlclVuc3VwcG9ydGVkID0gXHUzMGE4XHUzMGYzXHUzMGIzXHUzMGZjXHUzMGM3XHUzMGEzXHUzMGYzXHUzMGIwIFwiezB9XCIgXHUzMDZiXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGQwXHUzMGE0XHUzMGM4XHUzMGFhXHUzMGZjXHUzMGMwXHUzMDZmXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IueG1sLmVuY29kaW5nRGVjbEludmFsaWQgPSBcdTcxMjFcdTUyYjlcdTMwNmFcdTMwYThcdTMwZjNcdTMwYjNcdTMwZmNcdTMwYzdcdTMwYTNcdTMwZjNcdTMwYjBcdTU0MGQgXCJ7MH1cIiBcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci54bWwuZW5jb2RpbmdEZWNsUmVxdWlyZWQgPSBcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTViYTNcdThhMDBcdTRlMmRcdTMwNmJcdTMwYThcdTMwZjNcdTMwYjNcdTMwZmNcdTMwYzdcdTMwYTNcdTMwZjNcdTMwYjBcdTViYTNcdThhMDBcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci54bWwubW9yZVBzZXVkb0F0dHJpYnV0ZXMgPSBcdTMwODhcdTMwOGFcdTU5MWFcdTMwNGZcdTMwNmVcdTc1OTFcdTRmM2NcdTVjNWVcdTYwMjdcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci54bWwubm9Nb3JlUHNldWRvQXR0cmlidXRlcyA9IFx1MzA1M1x1MzA4Y1x1NGVlNVx1NGUwYVx1MzA2ZVx1NzU5MVx1NGYzY1x1NWM1ZVx1NjAyN1x1MzA2Zlx1OGEzMVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnhtbC52ZXJzaW9uSW5mb1JlcXVpcmVkID0gWE1MXHU1YmEzXHU4YTAwXHUzMDZlXHU0ZTJkXHUzMDZiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IueG1sLnhtbERlY2xVbnRlcm1pbmF0ZWQgPSBYTUxcdTViYTNcdThhMDBcdTMwNmZcIj8+XCJcdTMwNjdcdTdkNDJcdTMwODlcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci54bWwucmVzZXJ2ZWRQSVRhcmdldCA9IFwiW3hYXVttTV1bbExdXCJcdTMwNmJcdTRlMDBcdTgxZjRcdTMwNTlcdTMwOGJcdTUxZTZcdTc0MDZcdTU0N2RcdTRlZTRcdTMwYmZcdTMwZmNcdTMwYjJcdTMwYzNcdTMwYzhcdTMwNmZcdThhMzFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci54bWwuc3BhY2VSZXF1aXJlZEluUEkgPSBcdTdhN2FcdTc2N2RcdTMwNGNcdTUxZTZcdTc0MDZcdTU0N2RcdTRlZTRcdTMwYmZcdTMwZmNcdTMwYjJcdTMwYzNcdTMwYzhcdTMwNjhcdTMwYzdcdTMwZmNcdTMwYmZcdTMwNmVcdTk1OTNcdTMwNmJcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci54bWwuaW52YWxpZENoYXJJbkNvbnRlbnQgPSBcdTMwYzlcdTMwYWRcdTMwZTVcdTMwZTFcdTMwZjNcdTMwYzhcdTMwNmVcdTcxMjFcdTUyYjlcdTMwNmFYTUxcdTY1ODdcdTViNTcgKFVuaWNvZGU6IDB4ezB9KSBcdTMwNGNcdTMwYzlcdTMwYWRcdTMwZTVcdTMwZTFcdTMwZjNcdTMwYzhcdTMwNmVcdTg5ODFcdTdkMjBcdTUxODVcdTViYjlcdTMwNmVcdTRlMmRcdTMwNmJcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNTdcdTMwNWYKK2pzcC5lcnJvci54bWwuc3BhY2VSZXF1aXJlZEJlZm9yZVN0YW5kYWxvbmUgPSBYTUxcdTViYTNcdThhMDBcdTMwNmVlbmNvZGluZ1x1NzU5MVx1NGYzY1x1NWM1ZVx1NjAyN1x1MzA2ZVx1NTI0ZFx1MzA2Ylx1N2E3YVx1NzY3ZFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnhtbC5zZERlY2xJbnZhbGlkID0gXHUzMGI5XHUzMGJmXHUzMGYzXHUzMGM5XHUzMGEyXHUzMGVkXHUzMGYzXHU2NTg3XHU2NmY4XHU1YmEzXHU4YTAwXHU1MDI0XHUzMDZmXCJ5ZXNcIlx1NTNjOFx1MzA2Zlwibm9cIlx1MzA2ZVx1MzA2OVx1MzA2MVx1MzA4OVx1MzA0Ylx1MzA2N1x1MzA0Mlx1MzA4YVx1MzAwMVwiezB9XCJcdTMwNjdcdTMwNmZcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci54bWwuaW52YWxpZENoYXJJblBJID0gXHU3MTIxXHU1MmI5XHUzMDZhWE1MXHU2NTg3XHU1YjU3IChVbmljb2RlOiAweHswfSkgXHUzMDRjXHU1NDdkXHU0ZWU0XHU1MWU2XHU3NDA2XHU0ZTJkXHUzMDZiXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDU3XHUzMDVmCitqc3AuZXJyb3IueG1sLnZlcnNpb25Ob3RTdXBwb3J0ZWQgPSBYTUxcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjMgXCJ7MH1cIiBcdTMwNmZcdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDFYTUwgMS4wXHUzMDYwXHUzMDUxXHUzMDkyXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Citqc3AuZXJyb3IueG1sLnBzZXVkb0F0dHJOYW1lRXhwZWN0ZWQgPSBcdTc1OTFcdTRmM2NcdTVjNWVcdTYwMjdcdTU0MGRcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci54bWwuZXhwZWN0ZWRCeXRlID17MX1cdTMwZDBcdTMwYTRcdTMwYzhVVEYtOFx1MzBiN1x1MzBmY1x1MzBiMVx1MzBmM1x1MzBiOVx1MzA2ZVx1MzBkMFx1MzBhNFx1MzBjOCB7MH0gXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IueG1sLmludmFsaWRCeXRlID0gezF9XHUzMGQwXHUzMGE0XHUzMGM4VVRGLThcdTMwYjdcdTMwZmNcdTMwYjFcdTMwZjNcdTMwYjlcdTMwNmVcdTcxMjFcdTUyYjlcdTMwNmFcdTMwZDBcdTMwYTRcdTMwYzggezB9IFx1MzA2N1x1MzA1OQoranNwLmVycm9yLnhtbC5vcGVyYXRpb25Ob3RTdXBwb3J0ZWQgPSB7MX0gcmVhZGVyXHUzMDZmXHU2NGNkXHU0ZjVjIFwiezB9XCIgXHUzMDkyXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IueG1sLmludmFsaWRIaWdoU3Vycm9nYXRlID0gVVRGLThcdTMwYjdcdTMwZmNcdTMwYjFcdTMwZjNcdTMwYjlcdTMwNmVcdTMwY2ZcdTMwYTRcdTMwYjVcdTMwZWRcdTMwYjJcdTMwZmNcdTMwYzhcdTMwZDNcdTMwYzNcdTMwYzhcdTMwNmYweDEwXHUzMDkyXHU4ZDhhXHUzMDQ4XHUzMDY2XHUzMDZmXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzXHUzMDRjXHUzMDAxMHh7MH1cdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNTdcdTMwNWYKK2pzcC5lcnJvci54bWwuaW52YWxpZEFTQ0lJID0gXHUzMGQwXHUzMGE0XHUzMGM4IFwiezB9XCIgXHUzMDZmN1x1MzBkM1x1MzBjM1x1MzBjOEFTQ0lJXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVFbmNvZGluZ0luWE1MRGVjbCA9IFhNTFx1NWJhM1x1OGEwMFx1MzA2ZWVuY29kaW5nXHU3NTkxXHU0ZjNjXHU1YzVlXHU2MDI3XHUzMDZlXHU1MjRkXHUzMDZiXHU3YTdhXHU3NjdkXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVFbmNvZGluZ0luVGV4dERlY2wgPSBcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTViYTNcdThhMDBcdTMwNmVlbmNvZGluZ1x1NzU5MVx1NGYzY1x1NWM1ZVx1NjAyN1x1MzA2ZVx1NTI0ZFx1MzA2Ylx1N2E3YVx1NzY3ZFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlVmVyc2lvbkluVGV4dERlY2wgPSBcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTViYTNcdThhMDBcdTMwNmV2ZXJzaW9uXHU3NTkxXHU0ZjNjXHU1YzVlXHU2MDI3XHUzMDZlXHU1MjRkXHUzMDZiXHU3YTdhXHU3NjdkXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVWZXJzaW9uSW5YTUxEZWNsID0gWE1MXHU1YmEzXHU4YTAwXHUzMDZldmVyc2lvblx1NzU5MVx1NGYzY1x1NWM1ZVx1NjAyN1x1MzA2ZVx1NTI0ZFx1MzA2Ylx1N2E3YVx1NzY3ZFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnhtbC5lcVJlcXVpcmVkSW5YTUxEZWNsID0gWE1MXHU1YmEzXHU4YTAwXHU0ZTJkXHUzMDY3XCJ7MH1cIlx1MzA2ZVx1NmIyMVx1MzA2YicnID0gJycgXHU2NTg3XHU1YjU3XHUzMDRjXHU3ZDlhXHUzMDRiXHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IueG1sLmVxUmVxdWlyZWRJblRleHREZWNsID0gXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHU1YmEzXHU4YTAwXHU0ZTJkXHUzMDY3XCJ7MH1cIlx1MzA2ZVx1NmIyMVx1MzA2YicnID0gJydcdTY1ODdcdTViNTdcdTMwNGNcdTdkOWFcdTMwNGJcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci54bWwucXVvdGVSZXF1aXJlZEluVGV4dERlY2wgPSBcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTViYTNcdThhMDBcdTRlMmRcdTMwNmVcInswfVwiXHUzMDZiXHU3ZDlhXHUzMDRmXHU1MDI0XHUzMDZmXHUzMGFmXHUzMGFhXHUzMGZjXHUzMGM4XHUzMDY3XHU1NmYyXHUzMDdlXHUzMDhjXHUzMDVmXHU2NTg3XHU1YjU3XHU1MjE3XHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IueG1sLnF1b3RlUmVxdWlyZWRJblhNTERlY2wgPSBYTUxcdTViYTNcdThhMDBcdTRlMmRcdTMwNmVcInswfVwiXHUzMDZiXHU3ZDlhXHUzMDRmXHU1MDI0XHUzMDZmXHUzMGFmXHUzMGFhXHUzMGZjXHUzMGM4XHUzMDY3XHU1NmYyXHUzMDdlXHUzMDhjXHUzMDVmXHU2NTg3XHU1YjU3XHU1MjE3XHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IueG1sLmludmFsaWRDaGFySW5UZXh0RGVjbCA9IFx1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1NWJhM1x1OGEwMFx1MzA2ZVx1NGUyZFx1MzA2Ylx1NzEyMVx1NTJiOVx1MzA2YVhNTFx1NjU4N1x1NWI1NyAoVW5pY29kZTogMHh7MH0pIFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1N1x1MzA1ZgoranNwLmVycm9yLnhtbC5pbnZhbGlkQ2hhckluWE1MRGVjbCA9IFhNTFx1NWJhM1x1OGEwMFx1MzA2ZVx1NGUyZFx1MzA2Ylx1NzEyMVx1NTJiOVx1MzA2YVhNTFx1NjU4N1x1NWI1NyAoVW5pY29kZTogMHh7MH0pIFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1N1x1MzA1ZgoranNwLmVycm9yLnhtbC5jbG9zZVF1b3RlTWlzc2luZ0luVGV4dERlY2wgPSBcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTViYTNcdThhMDBcdTRlMmRcdTMwNmVcInswfVwiXHUzMDZiXHU3ZDlhXHUzMDRmXHU1MDI0XHUzMDZlXHU0ZTJkXHUzMDZlXHU2NzAwXHU1ZjhjXHUzMDZlXHUzMGFmXHUzMGFhXHUzMGZjXHUzMGM4XHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IueG1sLmNsb3NlUXVvdGVNaXNzaW5nSW5YTUxEZWNsID0gWE1MXHU1YmEzXHU4YTAwXHU0ZTJkXHUzMDZlXCJ7MH1cIlx1MzA2Ylx1N2Q5YVx1MzA0Zlx1NTAyNFx1MzA2ZVx1NGUyZFx1MzA2ZVx1NjcwMFx1NWY4Y1x1MzA2ZVx1MzBhZlx1MzBhYVx1MzBmY1x1MzBjOFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnhtbC5pbnZhbGlkSGlnaFN1cnJvZ2F0ZSA9IFVURi04XHUzMGI3XHUzMGZjXHUzMGIxXHUzMGYzXHUzMGI5XHUzMDZlXHUzMGNmXHUzMGE0XHUzMGI1XHUzMGVkXHUzMGIyXHUzMGZjXHUzMGM4XHUzMGQzXHUzMGMzXHUzMGM4XHUzMDZmMHgxMFx1MzA5Mlx1OGQ4YVx1MzA0OFx1MzA2Nlx1MzA2Zlx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA0Y1x1MzAwMTB4ezB9XHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDU3XHUzMDVmCitqc3AuZXJyb3IubXVsdGlwbGUuanNwID0gXHU4OTA3XHU2NTcwXHUzMDZlXHU0ZWQ1XHU2OWQ4XHUzMDkyXHU2ZTgwXHUzMDVmXHUzMDU5XHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuanNwb3V0cHV0LmNvbmZsaWN0PSZsdDtqc3A6b3V0cHV0Jmd0OzogXCJ7MH1cIlx1MzA2Ylx1NzU3MFx1MzA2YVx1MzA4Ylx1NTAyNFx1MzA5Mlx1ODkwN1x1NjU3MFx1NTZkZVx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA2ZVx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OSAoXHU2NWU3OiB7MX0sIFx1NjViMDogezJ9KQoranNwLmVycm9yLmpzcG91dHB1dC5kb2N0eXBlbmFtZXN5c3RlbT0mbHQ7anNwOm91dHB1dCZndDs6ICdkb2N0eXBlLXJvb3QtZWxlbWVudCcgXHU1M2NhXHUzMDczICdkb2N0eXBlLXN5c3RlbScgXHU1YzVlXHU2MDI3XHUzMDZmXHU1NDBjXHU2NjQyXHUzMDZiXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuanNwb3V0cHV0LmRvY3R5cGVwdWxpY3N5c3RlbT0mbHQ7anNwOm91dHB1dCZndDs6ICdkb2N0eXBlLXB1YmxpYydcdTVjNWVcdTYwMjdcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTlcdTMwOGJcdTU4MzRcdTU0MDhcdTMwNmZcdTMwMDEnZG9jdHlwZS1zeXN0ZW0nIFx1NWM1ZVx1NjAyN1x1MzA4Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmpzcG91dHB1dC5ub25lbXB0eWJvZHk9Jmx0O2pzcDpvdXRwdXQmZ3Q7IFx1MzBkY1x1MzBjN1x1MzBhM1x1MzA5Mlx1NjMwMVx1MzA2M1x1MzA2Nlx1MzA2Zlx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmpzcG91dHB1dC5pbnZhbGlkVXNlPSZsdDtqc3A6b3V0cHV0Jmd0OyBcdTZhMTlcdTZlOTZcdTY5Y2JcdTY1ODdcdTMwNmVcdTRlMmRcdTMwNjdcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwNjZcdTMwNmZcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5hdHRyaWJ1dGVzLm5vdC5hbGxvd2VkID0gezB9IFx1MzA2Zlx1NWM1ZVx1NjAyN1x1MzA5Mlx1NjMwMVx1MzA2NFx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnRhZ2ZpbGUuYmFkU3VmZml4PVx1MzBiZlx1MzBiMFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzBkMVx1MzBiOSB7MH0gXHUzMDZlXHU0ZTJkXHUzMDZiXCIudGFnXCIgXHU2MmUxXHU1ZjM1XHU1YjUwXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IudGFnZmlsZS5pbGxlZ2FsUGF0aD1cdTRlMGRcdTZiNjNcdTMwNmFcdTMwYmZcdTMwYjBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwZDFcdTMwYjlcdTMwNjdcdTMwNTk6IHswfVx1MzAwMVx1MzA1M1x1MzA4Y1x1MzA2ZlwiL1dFQi1JTkYvdGFnc1wiXHU1M2M4XHUzMDZmXCIvTUVUQS1JTkYvdGFnc1wiXHUzMDY3XHU1OWNiXHUzMDdlXHUzMDg5XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IucGx1Z2luLndyb25nUm9vdEVsZW1lbnQ9ezB9IFx1MzA2ZVx1NGUyZFx1MzA2ZVx1MzBlYlx1MzBmY1x1MzBjOFx1ODk4MVx1N2QyMFx1MzA2ZVx1NTQwZFx1NTI0ZFx1MzA2ZiB7MX0gXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuYXR0cmlidXRlLmludmFsaWRQcmVmaXg9XHU1YzVlXHU2MDI3XHUzMDZlXHUzMGQ3XHUzMGVjXHUzMGQ1XHUzMGEzXHUzMGMzXHUzMGFmXHUzMGI5IHswfSBcdTMwNmZcdTMwNjlcdTMwNmVcdTUzZDZcdTMwOGFcdThmYmNcdTMwN2VcdTMwOGNcdTMwNWZcdTMwYmZcdTMwYjBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwNmJcdTMwODJcdTViZmVcdTVmZGNcdTMwNTdcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5uZXN0ZWQuanNwYXR0cmlidXRlPWpzcDphdHRyaWJ1dGVcdTZhMTlcdTZlOTZcdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmZcdTUyMjVcdTMwNmVqc3A6YXR0cmlidXRlXHU2YTE5XHU2ZTk2XHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU3YmM0XHU1NmYyXHU1MTg1XHUzMDY3XHUzMGNkXHUzMGI5XHUzMGM4XHUzMDU5XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IubmVzdGVkLmpzcGJvZHk9anNwOmJvZHlcdTZhMTlcdTZlOTZcdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmZcdTUyMjVcdTMwNmVqc3A6Ym9keVx1NTNjOFx1MzA2ZmpzcDphdHRyaWJ1dGVcdTZhMTlcdTZlOTZcdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmVcdTdiYzRcdTU2ZjJcdTUxODVcdTMwNjdcdTMwY2RcdTMwYjlcdTMwYzhcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci52YXJpYWJsZS5laXRoZXIubmFtZT1uYW1lLWdpdmVuXHU1M2M4XHUzMDZmbmFtZS1mcm9tLWF0dHJpYnV0ZVx1NWM1ZVx1NjAyN1x1MzA2ZVx1MzA2OVx1MzA2MVx1MzA4OVx1MzA0Ylx1MzA5MnZhcmlhYmxlXHU2MzA3XHU3OTNhXHU1YjUwXHUzMDZlXHU0ZTJkXHUzMDY3XHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IudmFyaWFibGUuYm90aC5uYW1lPXZhcmlhYmxlXHU2MzA3XHU3OTNhXHU1YjUwXHU0ZTJkXHUzMDY3bmFtZS1naXZlblx1MzA2OG5hbWUtZnJvbS1hdHRyaWJ1dGVcdTVjNWVcdTYwMjdcdTMwNmVcdTRlMjFcdTY1YjlcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci52YXJpYWJsZS5hbGlhcz1uYW1lLWZyb20tYXR0cmlidXRlXHUzMDRhXHUzMDg4XHUzMDczYWxpYXNcdTVjNWVcdTYwMjdcdTMwNmVcdTRlMjFcdTY1YjlcdTMwOTJ2YXJpYWJsZVx1NjMwN1x1NzkzYVx1NWI1MFx1NGUyZFx1MzA2Ylx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzAwMVx1NTNjOFx1MzA2Zlx1MzA2OVx1MzA2MVx1MzA4OVx1MzA4Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2YVx1MzA0NFx1MzA1M1x1MzA2OFx1MzA0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1OQoranNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWU9XHU3YTdhXHUzMDZlXHU1YzVlXHU2MDI3XHU1NDBkXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IuanNwdGV4dC5iYWRjb250ZW50PVwnJmx0O1wnXHUzMDRjJmx0O2pzcDp0ZXh0Jmd0O1x1MzA2ZVx1MzBkY1x1MzBjN1x1MzBhM1x1MzA2ZVx1NGUyZFx1MzA2Ylx1NzNmZVx1MzA4Y1x1MzA4Ylx1NjY0Mlx1MzA2Zlx1MzAwMUNEQVRBXHUzMDZlXHU0ZTJkXHUzMDZiXHU5NmEwXHU4NTNkXHUzMDU3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuanNwcm9vdC52ZXJzaW9uLmludmFsaWQ9XHU3MTIxXHU1MmI5XHUzMDZhXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU3NTZhXHU1M2Y3XHUzMDY3XHUzMDU5OiBcInswfVwiXHUzMDAxXCIxLjJcIiBcdTUzYzhcdTMwNmYgXCIyLjBcIlx1MzAwMFx1MzA2N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLm5vRnVuY3Rpb25QcmVmaXg9XHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMDZlXHU1NDBkXHU1MjRkXHU3YTdhXHU5NTkzXHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDZhXHUzMDQ0XHU2NjQyXHUzMDZiXHUzMDZmXHUzMDAxXHU5NWEyXHU2NTcwIHswfSBcdTMwNmZcdTMwZDdcdTMwZWFcdTMwZDVcdTMwYTNcdTMwYWZcdTMwYjlcdTRlZDhcdTMwNGRcdTMwNjdcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5ub0Z1bmN0aW9uPVx1OTVhMlx1NjU3MCB7MH0gXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGQ3XHUzMGVhXHUzMGQ1XHUzMGEzXHUzMGFmXHUzMGI5XHUzMDY3XHU5MTRkXHU3ZjZlXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iubm9GdW5jdGlvbk1ldGhvZD1cdTk1YTJcdTY1NzAgXCJ7MX1cIiBcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzkgXCJ7MH1cIiBcdTMwNGMgXCJ7Mn1cIiBcdTRlMmRcdTMwNjdcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5mdW5jdGlvbi5jbGFzc25vdGZvdW5kPVRMRFx1MzA2ZVx1NGUyZFx1MzA2N1x1OTVhMlx1NjU3MCB7MX0gXHUzMDZiXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTM6IHsyfQoranNwLmVycm9yLnNpZ25hdHVyZS5jbGFzc25vdGZvdW5kPVRMRFx1MzA2ZVx1NGUyZFx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBiN1x1MzBiMFx1MzBjZFx1MzBjMVx1MzBlM1x1MzA2N1x1OTVhMlx1NjU3MCB7MX0gXHUzMDZiXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgezJ9Citqc3AuZXJyb3IudGV4dC5oYXNfc3ViZWxlbWVudD0mbHQ7anNwOnRleHQmZ3Q7IFx1MzA2Zlx1NTI2Zlx1ODk4MVx1N2QyMFx1MzA5Mlx1NjMwMVx1MzA2M1x1MzA2Nlx1MzA2Zlx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmRhdGEuZmlsZS5yZWFkPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiBcInswfVwiIFx1MzA5Mlx1OGFhZFx1MzA3Zlx1OGZiY1x1MzA3Zlx1NGUyZFx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgoranNwLmVycm9yLnByZWZpeC5yZWZpbmVkPVx1MzBkN1x1MzBlYVx1MzBkNVx1MzBhM1x1MzBjM1x1MzBhZlx1MzBiOSB7MH0gXHUzMDRjXHU3M2ZlXHU1NzI4XHUzMDZlXHUzMGI5XHUzMGIzXHUzMGZjXHUzMGQ3XHU0ZTJkXHUzMDY3XHU2NWUyXHUzMDZiIHsyfSBcdTMwNjhcdTViOWFcdTdmYTlcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwOGJcdTMwNmVcdTMwNjcgezF9IFx1MzA2Ylx1NTE4ZFx1NWI5YVx1N2ZhOVx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgoranNwLmVycm9yLm5lc3RlZF9qc3Byb290PVx1NTE2NVx1MzA4Y1x1NWI1MFx1MzA2Ylx1MzA2YVx1MzA2M1x1MzA1ZiAmbHQ7anNwOnJvb3QmZ3Q7IFx1MzA2N1x1MzA1OQoranNwLmVycm9yLnVuYmFsYW5jZWQuZW5kdGFnPVx1N2Q0Mlx1NGU4Nlx1MzBiZlx1MzBiMCBcIiZsdDsvezB9XCIgXHUzMDZlXHU1YmZlXHU1ZmRjXHUzMDRjXHU1M2Q2XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuaW52YWxpZC5iZWFuPXVzZUJlYW5cdTMwNmVcdTMwYWZcdTMwZTlcdTMwYjlcdTVjNWVcdTYwMjcgezB9IFx1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnByZWZpeC51c2VfYmVmb3JlX2RjbD1cdTMwNTNcdTMwNmVcdTMwYmZcdTMwYjBcdTYzMDdcdTc5M2FcdTViNTBcdTMwNjdcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwOGJcdTMwZDdcdTMwZWFcdTMwZDVcdTMwYTNcdTMwYzNcdTMwYWZcdTMwYjkgezB9IFx1MzA2Zlx1MzAwMVx1MzA1OVx1MzA2N1x1MzA2Ylx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiB7MX0gXHUzMDZlIHsyfSBcdTg4NGNcdTc2ZWVcdTMwNmVcdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNjdcdTRmN2ZcdTc1MjhcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKKwpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0JvZHlDb250ZW50SW1wbC5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0JvZHlDb250ZW50SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhM2E0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvQm9keUNvbnRlbnRJbXBsLmphdmEKQEAgLTAsMCArMSw2MDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWU7CisKK2ltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Cb2R5Q29udGVudDsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkNvbnN0YW50czsKKworLyoqCisgKiBXcml0ZSB0ZXh0IHRvIGEgY2hhcmFjdGVyLW91dHB1dCBzdHJlYW0sIGJ1ZmZlcmluZyBjaGFyYWN0ZXJzIHNvIGFzCisgKiB0byBwcm92aWRlIGZvciB0aGUgZWZmaWNpZW50IHdyaXRpbmcgb2Ygc2luZ2xlIGNoYXJhY3RlcnMsIGFycmF5cywKKyAqIGFuZCBzdHJpbmdzLiAKKyAqCisgKiBQcm92aWRlIHN1cHBvcnQgZm9yIGRpc2NhcmRpbmcgZm9yIHRoZSBvdXRwdXQgdGhhdCBoYXMgYmVlbiBidWZmZXJlZC4gCisgKgorICogQGF1dGhvciBSYWppdiBNb3JkYW5pCisgKiBAYXV0aG9yIEphbiBMdWVoZQorICovCitwdWJsaWMgY2xhc3MgQm9keUNvbnRlbnRJbXBsIGV4dGVuZHMgQm9keUNvbnRlbnQgeworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUEFSQVRPUiA9IAorICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMSU1JVF9CVUZGRVIgPSAKKyAgICAgICAgQm9vbGVhbi52YWx1ZU9mKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Cb2R5Q29udGVudEltcGwuTElNSVRfQlVGRkVSIiwgImZhbHNlIikpLmJvb2xlYW5WYWx1ZSgpOworICAgIAorICAgIHByaXZhdGUgY2hhcltdIGNiOworICAgIHByaXZhdGUgaW50IG5leHRDaGFyOworICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQ7CisgICAgCisgICAgLy8gRW5jbG9zZWQgd3JpdGVyIHRvIHdoaWNoIGFueSBvdXRwdXQgaXMgd3JpdHRlbgorICAgIHByaXZhdGUgV3JpdGVyIHdyaXRlcjsKKyAgICAKKyAgICAvLyBTZWUgY29tbWVudCBpbiBzZXRXcml0ZXIoKQorICAgIHByaXZhdGUgaW50IGJ1ZmZlclNpemVTYXZlOworICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBCb2R5Q29udGVudEltcGwoSnNwV3JpdGVyIGVuY2xvc2luZ1dyaXRlcikgeworICAgICAgICBzdXBlcihlbmNsb3NpbmdXcml0ZXIpOworICAgICAgICBidWZmZXJTaXplID0gQ29uc3RhbnRzLkRFRkFVTFRfVEFHX0JVRkZFUl9TSVpFOworICAgICAgICBjYiA9IG5ldyBjaGFyW2J1ZmZlclNpemVdOworICAgICAgICBuZXh0Q2hhciA9IDA7CisgICAgICAgIGNsb3NlZCA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLndyaXRlKGMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW5zdXJlT3BlbigpOworICAgICAgICAgICAgaWYgKG5leHRDaGFyID49IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICByZUFsbG9jQnVmZiAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYltuZXh0Q2hhcisrXSA9IChjaGFyKSBjOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFdyaXRlIGEgcG9ydGlvbiBvZiBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogPHA+IE9yZGluYXJpbHkgdGhpcyBtZXRob2Qgc3RvcmVzIGNoYXJhY3RlcnMgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkgaW50bworICAgICAqIHRoaXMgc3RyZWFtJ3MgYnVmZmVyLCBmbHVzaGluZyB0aGUgYnVmZmVyIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBhcworICAgICAqIG5lZWRlZC4gIElmIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoIGlzIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZSBidWZmZXIsCisgICAgICogaG93ZXZlciwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIGZsdXNoIHRoZSBidWZmZXIgYW5kIHdyaXRlIHRoZSBjaGFyYWN0ZXJzCisgICAgICogZGlyZWN0bHkgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLiAgVGh1cyByZWR1bmRhbnQKKyAgICAgKiA8Y29kZT5EaXNjYXJkYWJsZUJ1ZmZlcmVkV3JpdGVyPC9jb2RlPnMgd2lsbCBub3QgY29weSBkYXRhCisgICAgICogdW5uZWNlc3NhcmlseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYnVmIEEgY2hhcmFjdGVyIGFycmF5CisgICAgICogQHBhcmFtIG9mZiBPZmZzZXQgZnJvbSB3aGljaCB0byBzdGFydCByZWFkaW5nIGNoYXJhY3RlcnMKKyAgICAgKiBAcGFyYW0gbGVuIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoY2hhcltdIGNidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLndyaXRlKGNidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVuc3VyZU9wZW4oKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKChvZmYgPCAwKSB8fCAob2ZmID4gY2J1Zi5sZW5ndGgpIHx8IChsZW4gPCAwKSB8fAorICAgICAgICAgICAgICAgICAgICAoKG9mZiArIGxlbikgPiBjYnVmLmxlbmd0aCkgfHwgKChvZmYgKyBsZW4pIDwgMCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChsZW4gPj0gYnVmZmVyU2l6ZSAtIG5leHRDaGFyKQorICAgICAgICAgICAgICAgIHJlQWxsb2NCdWZmIChsZW4pOworICAgICAgICAgICAgCisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNidWYsIG9mZiwgY2IsIG5leHRDaGFyLCBsZW4pOworICAgICAgICAgICAgbmV4dENoYXIrPWxlbjsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLiAgVGhpcyBtZXRob2QgY2Fubm90IGJlIGluaGVyaXRlZCBmcm9tIHRoZQorICAgICAqIFdyaXRlciBjbGFzcyBiZWNhdXNlIGl0IG11c3Qgc3VwcHJlc3MgSS9PIGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoY2hhcltdIGJ1ZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogV3JpdGUgYSBwb3J0aW9uIG9mIGEgU3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHMgU3RyaW5nIHRvIGJlIHdyaXR0ZW4KKyAgICAgKiBAcGFyYW0gb2ZmIE9mZnNldCBmcm9tIHdoaWNoIHRvIHN0YXJ0IHJlYWRpbmcgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSBsZW4gTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShzLCBvZmYsIGxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbnN1cmVPcGVuKCk7CisgICAgICAgICAgICBpZiAobGVuID49IGJ1ZmZlclNpemUgLSBuZXh0Q2hhcikKKyAgICAgICAgICAgICAgICByZUFsbG9jQnVmZihsZW4pOworICAgICAgICAgICAgCisgICAgICAgICAgICBzLmdldENoYXJzKG9mZiwgb2ZmICsgbGVuLCBjYiwgbmV4dENoYXIpOworICAgICAgICAgICAgbmV4dENoYXIgKz0gbGVuOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFdyaXRlIGEgc3RyaW5nLiAgVGhpcyBtZXRob2QgY2Fubm90IGJlIGluaGVyaXRlZCBmcm9tIHRoZSBXcml0ZXIgY2xhc3MKKyAgICAgKiBiZWNhdXNlIGl0IG11c3Qgc3VwcHJlc3MgSS9PIGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLndyaXRlKHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGUocywgMCwgcy5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogV3JpdGUgYSBsaW5lIHNlcGFyYXRvci4gIFRoZSBsaW5lIHNlcGFyYXRvciBzdHJpbmcgaXMgZGVmaW5lZCBieSB0aGUKKyAgICAgKiBzeXN0ZW0gcHJvcGVydHkgPHR0PmxpbmUuc2VwYXJhdG9yPC90dD4sIGFuZCBpcyBub3QgbmVjZXNzYXJpbHkgYSBzaW5nbGUKKyAgICAgKiBuZXdsaW5lICgnXG4nKSBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBuZXdMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoTElORV9TRVBBUkFUT1IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGUoTElORV9TRVBBUkFUT1IpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByaW50IGEgYm9vbGVhbiB2YWx1ZS4gIFRoZSBzdHJpbmcgcHJvZHVjZWQgYnkgPGNvZGU+e0BsaW5rCisgICAgICogamF2YS5sYW5nLlN0cmluZyN2YWx1ZU9mKGJvb2xlYW4pfTwvY29kZT4gaXMgdHJhbnNsYXRlZCBpbnRvIGJ5dGVzCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLCBhbmQgdGhlc2UgYnl0ZXMKKyAgICAgKiBhcmUgd3JpdHRlbiBpbiBleGFjdGx5IHRoZSBtYW5uZXIgb2YgdGhlIDxjb2RlPntAbGluaworICAgICAqICN3cml0ZShpbnQpfTwvY29kZT4gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGIgVGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHRvIGJlIHByaW50ZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQoYm9vbGVhbiBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShiID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZShiID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHJpbnQgYSBjaGFyYWN0ZXIuICBUaGUgY2hhcmFjdGVyIGlzIHRyYW5zbGF0ZWQgaW50byBvbmUgb3IgbW9yZSBieXRlcworICAgICAqIGFjY29yZGluZyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZywgYW5kIHRoZXNlIGJ5dGVzCisgICAgICogYXJlIHdyaXR0ZW4gaW4gZXhhY3RseSB0aGUgbWFubmVyIG9mIHRoZSA8Y29kZT57QGxpbmsKKyAgICAgKiAjd3JpdGUoaW50KX08L2NvZGU+IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSA8Y29kZT5jaGFyPC9jb2RlPiB0byBiZSBwcmludGVkCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50KGNoYXIgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoU3RyaW5nLnZhbHVlT2YoYykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGUoU3RyaW5nLnZhbHVlT2YoYykpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByaW50IGFuIGludGVnZXIuICBUaGUgc3RyaW5nIHByb2R1Y2VkIGJ5IDxjb2RlPntAbGluaworICAgICAqIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihpbnQpfTwvY29kZT4gaXMgdHJhbnNsYXRlZCBpbnRvIGJ5dGVzIGFjY29yZGluZworICAgICAqIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLCBhbmQgdGhlc2UgYnl0ZXMgYXJlCisgICAgICogd3JpdHRlbiBpbiBleGFjdGx5IHRoZSBtYW5uZXIgb2YgdGhlIDxjb2RlPntAbGluayAjd3JpdGUoaW50KX08L2NvZGU+CisgICAgICogbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGkgVGhlIDxjb2RlPmludDwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludChpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoU3RyaW5nLnZhbHVlT2YoaSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGUoU3RyaW5nLnZhbHVlT2YoaSkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByaW50IGEgbG9uZyBpbnRlZ2VyLiAgVGhlIHN0cmluZyBwcm9kdWNlZCBieSA8Y29kZT57QGxpbmsKKyAgICAgKiBqYXZhLmxhbmcuU3RyaW5nI3ZhbHVlT2YobG9uZyl9PC9jb2RlPiBpcyB0cmFuc2xhdGVkIGludG8gYnl0ZXMKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCB0aGVzZSBieXRlcworICAgICAqIGFyZSB3cml0dGVuIGluIGV4YWN0bHkgdGhlIG1hbm5lciBvZiB0aGUKKyAgICAgKiA8Y29kZT57QGxpbmsgI3dyaXRlKGludCl9PC9jb2RlPiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbCBUaGUgPGNvZGU+bG9uZzwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludChsb25nIGwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLndyaXRlKFN0cmluZy52YWx1ZU9mKGwpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlKFN0cmluZy52YWx1ZU9mKGwpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4gIFRoZSBzdHJpbmcgcHJvZHVjZWQgYnkgPGNvZGU+e0BsaW5rCisgICAgICogamF2YS5sYW5nLlN0cmluZyN2YWx1ZU9mKGZsb2F0KX08L2NvZGU+IGlzIHRyYW5zbGF0ZWQgaW50byBieXRlcworICAgICAqIGFjY29yZGluZyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZywgYW5kIHRoZXNlIGJ5dGVzCisgICAgICogYXJlIHdyaXR0ZW4gaW4gZXhhY3RseSB0aGUgbWFubmVyIG9mIHRoZQorICAgICAqIDxjb2RlPntAbGluayAjd3JpdGUoaW50KX08L2NvZGU+IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmIFRoZSA8Y29kZT5mbG9hdDwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludChmbG9hdCBmKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShTdHJpbmcudmFsdWVPZihmKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZShTdHJpbmcudmFsdWVPZihmKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHJpbnQgYSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IG51bWJlci4gIFRoZSBzdHJpbmcgcHJvZHVjZWQgYnkKKyAgICAgKiA8Y29kZT57QGxpbmsgamF2YS5sYW5nLlN0cmluZyN2YWx1ZU9mKGRvdWJsZSl9PC9jb2RlPiBpcyB0cmFuc2xhdGVkIGludG8KKyAgICAgKiBieXRlcyBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCB0aGVzZQorICAgICAqIGJ5dGVzIGFyZSB3cml0dGVuIGluIGV4YWN0bHkgdGhlIG1hbm5lciBvZiB0aGUgPGNvZGU+e0BsaW5rCisgICAgICogI3dyaXRlKGludCl9PC9jb2RlPiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZCBUaGUgPGNvZGU+ZG91YmxlPC9jb2RlPiB0byBiZSBwcmludGVkCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50KGRvdWJsZSBkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShTdHJpbmcudmFsdWVPZihkKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZShTdHJpbmcudmFsdWVPZihkKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHJpbnQgYW4gYXJyYXkgb2YgY2hhcmFjdGVycy4gIFRoZSBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQgaW50byBieXRlcworICAgICAqIGFjY29yZGluZyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZywgYW5kIHRoZXNlIGJ5dGVzCisgICAgICogYXJlIHdyaXR0ZW4gaW4gZXhhY3RseSB0aGUgbWFubmVyIG9mIHRoZQorICAgICAqIDxjb2RlPntAbGluayAjd3JpdGUoaW50KX08L2NvZGU+IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIFRoZSBhcnJheSBvZiBjaGFycyB0byBiZSBwcmludGVkCisgICAgICoKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIElmIDxjb2RlPnM8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50KGNoYXJbXSBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlKHMpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByaW50IGEgc3RyaW5nLiAgSWYgdGhlIGFyZ3VtZW50IGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdGhlIHN0cmluZworICAgICAqIDxjb2RlPiJudWxsIjwvY29kZT4gaXMgcHJpbnRlZC4gIE90aGVyd2lzZSwgdGhlIHN0cmluZydzIGNoYXJhY3RlcnMgYXJlCisgICAgICogY29udmVydGVkIGludG8gYnl0ZXMgYWNjb3JkaW5nIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyCisgICAgICogZW5jb2RpbmcsIGFuZCB0aGVzZSBieXRlcyBhcmUgd3JpdHRlbiBpbiBleGFjdGx5IHRoZSBtYW5uZXIgb2YgdGhlCisgICAgICogPGNvZGU+e0BsaW5rICN3cml0ZShpbnQpfTwvY29kZT4gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHMgVGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludChTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHMgPT0gbnVsbCkgcyA9ICJudWxsIjsKKyAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUocyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZShzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmludCBhbiBvYmplY3QuICBUaGUgc3RyaW5nIHByb2R1Y2VkIGJ5IHRoZSA8Y29kZT57QGxpbmsKKyAgICAgKiBqYXZhLmxhbmcuU3RyaW5nI3ZhbHVlT2YoT2JqZWN0KX08L2NvZGU+IG1ldGhvZCBpcyB0cmFuc2xhdGVkIGludG8gYnl0ZXMKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCB0aGVzZSBieXRlcworICAgICAqIGFyZSB3cml0dGVuIGluIGV4YWN0bHkgdGhlIG1hbm5lciBvZiB0aGUKKyAgICAgKiA8Y29kZT57QGxpbmsgI3dyaXRlKGludCl9PC9jb2RlPiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIFRoZSA8Y29kZT5PYmplY3Q8L2NvZGU+IHRvIGJlIHByaW50ZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQoT2JqZWN0IG9iaikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoU3RyaW5nLnZhbHVlT2Yob2JqKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZShTdHJpbmcudmFsdWVPZihvYmopKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXJtaW5hdGUgdGhlIGN1cnJlbnQgbGluZSBieSB3cml0aW5nIHRoZSBsaW5lIHNlcGFyYXRvciBzdHJpbmcuICBUaGUKKyAgICAgKiBsaW5lIHNlcGFyYXRvciBzdHJpbmcgaXMgZGVmaW5lZCBieSB0aGUgc3lzdGVtIHByb3BlcnR5CisgICAgICogPGNvZGU+bGluZS5zZXBhcmF0b3I8L2NvZGU+LCBhbmQgaXMgbm90IG5lY2Vzc2FyaWx5IGEgc2luZ2xlIG5ld2xpbmUKKyAgICAgKiBjaGFyYWN0ZXIgKDxjb2RlPidcbic8L2NvZGU+KS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbmV3TGluZSgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGJvb2xlYW4gdmFsdWUgYW5kIHRoZW4gdGVybWluYXRlIHRoZSBsaW5lLiAgVGhpcyBtZXRob2QgYmVoYXZlcworICAgICAqIGFzIHRob3VnaCBpdCBpbnZva2VzIDxjb2RlPntAbGluayAjcHJpbnQoYm9vbGVhbil9PC9jb2RlPiBhbmQgdGhlbgorICAgICAqIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihib29sZWFuIHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KHgpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByaW50IGEgY2hhcmFjdGVyIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMgYXMKKyAgICAgKiB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KGNoYXIpfTwvY29kZT4gYW5kIHRoZW4KKyAgICAgKiA8Y29kZT57QGxpbmsgI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oY2hhciB4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwcmludCh4KTsKKyAgICAgICAgcHJpbnRsbigpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmludCBhbiBpbnRlZ2VyIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMgYXMKKyAgICAgKiB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KGludCl9PC9jb2RlPiBhbmQgdGhlbgorICAgICAqIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihpbnQgeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpbnQoeCk7CisgICAgICAgIHByaW50bG4oKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHJpbnQgYSBsb25nIGludGVnZXIgYW5kIHRoZW4gdGVybWluYXRlIHRoZSBsaW5lLiAgVGhpcyBtZXRob2QgYmVoYXZlcworICAgICAqIGFzIHRob3VnaCBpdCBpbnZva2VzIDxjb2RlPntAbGluayAjcHJpbnQobG9uZyl9PC9jb2RlPiBhbmQgdGhlbgorICAgICAqIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihsb25nIHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KHgpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByaW50IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kCisgICAgICogYmVoYXZlcyBhcyB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KGZsb2F0KX08L2NvZGU+IGFuZCB0aGVuCisgICAgICogPGNvZGU+e0BsaW5rICNwcmludGxuKCl9PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGZsb2F0IHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KHgpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByaW50IGEgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXIgYW5kIHRoZW4gdGVybWluYXRlIHRoZQorICAgICAqIGxpbmUuICBUaGlzIG1ldGhvZCBiZWhhdmVzIGFzIHRob3VnaCBpdCBpbnZva2VzIDxjb2RlPntAbGluaworICAgICAqICNwcmludChkb3VibGUpfTwvY29kZT4gYW5kIHRoZW4gPGNvZGU+e0BsaW5rICNwcmludGxuKCl9PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGRvdWJsZSB4KSB0aHJvd3MgSU9FeGNlcHRpb257CisgICAgICAgIHByaW50KHgpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByaW50IGFuIGFycmF5IG9mIGNoYXJhY3RlcnMgYW5kIHRoZW4gdGVybWluYXRlIHRoZSBsaW5lLiAgVGhpcyBtZXRob2QKKyAgICAgKiBiZWhhdmVzIGFzIHRob3VnaCBpdCBpbnZva2VzIDxjb2RlPntAbGluayAjcHJpbnQoY2hhcltdKX08L2NvZGU+IGFuZAorICAgICAqIHRoZW4gPGNvZGU+e0BsaW5rICNwcmludGxuKCl9PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGNoYXIgeFtdKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwcmludCh4KTsKKyAgICAgICAgcHJpbnRsbigpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmludCBhIFN0cmluZyBhbmQgdGhlbiB0ZXJtaW5hdGUgdGhlIGxpbmUuICBUaGlzIG1ldGhvZCBiZWhhdmVzIGFzCisgICAgICogdGhvdWdoIGl0IGludm9rZXMgPGNvZGU+e0BsaW5rICNwcmludChTdHJpbmcpfTwvY29kZT4gYW5kIHRoZW4KKyAgICAgKiA8Y29kZT57QGxpbmsgI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oU3RyaW5nIHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KHgpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByaW50IGFuIE9iamVjdCBhbmQgdGhlbiB0ZXJtaW5hdGUgdGhlIGxpbmUuICBUaGlzIG1ldGhvZCBiZWhhdmVzIGFzCisgICAgICogdGhvdWdoIGl0IGludm9rZXMgPGNvZGU+e0BsaW5rICNwcmludChPYmplY3QpfTwvY29kZT4gYW5kIHRoZW4KKyAgICAgKiA8Y29kZT57QGxpbmsgI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oT2JqZWN0IHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KHgpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENsZWFyIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyLiBJZiB0aGUgYnVmZmVyIGhhcyBiZWVuIGFscmVhZHkKKyAgICAgKiBiZWVuIGZsdXNoZWQgdGhlbiB0aGUgY2xlYXIgb3BlcmF0aW9uIHNoYWxsIHRocm93IGFuIElPRXhjZXB0aW9uCisgICAgICogdG8gc2lnbmFsIHRoZSBmYWN0IHRoYXQgc29tZSBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gaXJyZXZvY2FibHkgCisgICAgICogd3JpdHRlbiB0byB0aGUgY2xpZW50IHJlc3BvbnNlIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5leHRDaGFyID0gMDsKKyAgICAgICAgICAgIGlmIChMSU1JVF9CVUZGRVIgJiYgKGNiLmxlbmd0aCA+IENvbnN0YW50cy5ERUZBVUxUX1RBR19CVUZGRVJfU0laRSkpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJTaXplID0gQ29uc3RhbnRzLkRFRkFVTFRfVEFHX0JVRkZFUl9TSVpFOworICAgICAgICAgICAgICAgIGNiID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuIFVubGlrZSBjbGVhcigpLCB0aGlzCisgICAgICogbWVodG9kIHdpbGwgbm90IHRocm93IGFuIElPRXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgaGFzIGFscmVhZHkgYmVlbgorICAgICAqIGZsdXNoZWQuIEl0IG1lcmVseSBjbGVhcnMgdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgYnVmZmVyIGFuZAorICAgICAqIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh3cml0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jbGVhcigpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBzdHJlYW0sIGZsdXNoaW5nIGl0IGZpcnN0LiAgT25jZSBhIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQsCisgICAgICogZnVydGhlciB3cml0ZSgpIG9yIGZsdXNoKCkgaW52b2NhdGlvbnMgd2lsbCBjYXVzZSBhbiBJT0V4Y2VwdGlvbiB0byBiZQorICAgICAqIHRocm93bi4gIENsb3NpbmcgYSBwcmV2aW91c2x5LWNsb3NlZCBzdHJlYW0sIGhvd2V2ZXIsIGhhcyBubyBlZmZlY3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB1bnVzZWQgaW4gdGhlIGJ1ZmZlcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVtYWluaW5nKCkgeworICAgICAgICByZXR1cm4gKHdyaXRlciA9PSBudWxsKSA/IGJ1ZmZlclNpemUtbmV4dENoYXIgOiAwOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgQm9keUpzcFdyaXRlciBhcyBhIFJlYWRlci4KKyAgICAgKiBOb3RlOiB0aGlzIGlzIGFmdGVyIGV2YWx1YXRpb24hISAgVGhlcmUgYXJlIG5vIHNjcmlwdGxldHMsCisgICAgICogZXRjIGluIHRoaXMgc3RyZWFtLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyBCb2R5SnNwV3JpdGVyIGFzIGEgUmVhZGVyCisgICAgICovCisgICAgcHVibGljIFJlYWRlciBnZXRSZWFkZXIoKSB7CisgICAgICAgIHJldHVybiAod3JpdGVyID09IG51bGwpID8gbmV3IENoYXJBcnJheVJlYWRlciAoY2IsIDAsIG5leHRDaGFyKSA6IG51bGw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIEJvZHlKc3BXcml0ZXIgYXMgYSBTdHJpbmcuCisgICAgICogTm90ZTogdGhpcyBpcyBhZnRlciBldmFsdWF0aW9uISEgIFRoZXJlIGFyZSBubyBzY3JpcHRsZXRzLAorICAgICAqIGV0YyBpbiB0aGlzIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBCb2R5SnNwV3JpdGVyIGFzIGEgU3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAod3JpdGVyID09IG51bGwpID8gbmV3IFN0cmluZyhjYiwgMCwgbmV4dENoYXIpIDogbnVsbDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgQm9keUpzcFdyaXRlciBpbnRvIGEgV3JpdGVyLgorICAgICAqIFN1YmNsYXNzZXMgYXJlIGxpa2VseSB0byBkbyBpbnRlcmVzdGluZyB0aGluZ3Mgd2l0aCB0aGUKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBzbyBzb21lIHRoaW5ncyBhcmUgZXh0cmEgZWZmaWNpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIG91dCBUaGUgd3JpdGVyIGludG8gd2hpY2ggdG8gcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYm9keQorICAgICAqIGV2YWx1YXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZU91dChXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAod3JpdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG91dC53cml0ZShjYiwgMCwgbmV4dENoYXIpOworICAgICAgICAgICAgLy8gRmx1c2ggbm90IGNhbGxlZCBhcyB0aGUgd3JpdGVyIHBhc3NlZCBjb3VsZCBiZSBhIEJvZHlDb250ZW50IGFuZAorICAgICAgICAgICAgLy8gaXQgZG9lc24ndCBhbGxvdyB0byBmbHVzaC4KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB3cml0ZXIgdG8gd2hpY2ggYWxsIG91dHB1dCBpcyB3cml0dGVuLgorICAgICAqLworICAgIHZvaWQgc2V0V3JpdGVyKFdyaXRlciB3cml0ZXIpIHsKKyAgICAgICAgdGhpcy53cml0ZXIgPSB3cml0ZXI7CisgICAgICAgIGNsb3NlZCA9IGZhbHNlOworICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgc3BlYywgdGhlIEpzcFdyaXRlciByZXR1cm5lZCBieSAKKyAgICAgICAgICAgIC8vIEpzcENvbnRleHQucHVzaEJvZHkoamF2YS5pby5Xcml0ZXIgd3JpdGVyKSBtdXN0IGJlaGF2ZSBhcworICAgICAgICAgICAgLy8gdGhvdWdoIGl0IHdlcmUgdW5idWZmZXJlZC4gVGhpcyBtZWFucyB0aGF0IGl0cyBnZXRCdWZmZXJTaXplKCkKKyAgICAgICAgICAgIC8vIG11c3QgYWx3YXlzIHJldHVybiAwLiBUaGUgaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICAgICAgIC8vIEpzcFdyaXRlci5nZXRCdWZmZXJTaXplKCkgcmV0dXJucyB0aGUgdmFsdWUgb2YgSnNwV3JpdGVyJ3MKKyAgICAgICAgICAgIC8vICdidWZmZXJTaXplJyBmaWVsZCwgd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IHRoaXMgY2xhc3MuIAorICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBzaW1wbHkgc2F2ZSB0aGUgY3VycmVudCAnYnVmZmVyU2l6ZScgKHNvIHdlIGNhbiAKKyAgICAgICAgICAgIC8vIGxhdGVyIHJlc3RvcmUgaXQgc2hvdWxkIHRoaXMgQm9keUNvbnRlbnRJbXBsIGV2ZXIgYmUgcmV1c2VkIGJ5CisgICAgICAgICAgICAvLyBhIGNhbGwgdG8gUGFnZUNvbnRleHQucHVzaEJvZHkoKSkgYmVmb3JlIHNldHRpbmcgaXQgdG8gMC4KKyAgICAgICAgICAgIGlmIChidWZmZXJTaXplICE9IDApIHsKKyAgICAgICAgICAgICAgICBidWZmZXJTaXplU2F2ZSA9IGJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXJTaXplID0gYnVmZmVyU2l6ZVNhdmU7CisgICAgICAgICAgICBjbGVhckJvZHkoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlT3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjbG9zZWQpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIGNsb3NlZCIpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZWFsbG9jYXRlcyBidWZmZXIgc2luY2UgdGhlIHNwZWMgcmVxdWlyZXMgaXQgdG8gYmUgdW5ib3VuZGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZUFsbG9jQnVmZihpbnQgbGVuKSB7CisgICAgICAgIAorICAgICAgICBpZiAoYnVmZmVyU2l6ZSArIGxlbiA8PSBjYi5sZW5ndGgpIHsKKyAgICAgICAgICAgIGJ1ZmZlclNpemUgPSBjYi5sZW5ndGg7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChsZW4gPCBjYi5sZW5ndGgpIHsKKyAgICAgICAgICAgIGxlbiA9IGNiLmxlbmd0aDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYnVmZmVyU2l6ZSA9IGNiLmxlbmd0aCArIGxlbjsKKyAgICAgICAgY2hhcltdIHRtcCA9IG5ldyBjaGFyW2J1ZmZlclNpemVdOworICAgICAgICAKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShjYiwgMCwgdG1wLCAwLCBjYi5sZW5ndGgpOworICAgICAgICBjYiA9IHRtcDsKKyAgICAgICAgdG1wID0gbnVsbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0h0dHBKc3BCYXNlLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSHR0cEpzcEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWZkOTlmCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0h0dHBKc3BCYXNlLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5IdHRwSnNwUGFnZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuTG9jYWxpemVyOworCisvKioKKyAqIFRoaXMgaXMgdGhlIHN1cGVyIGNsYXNzIG9mIGFsbCBKU1AtZ2VuZXJhdGVkIHNlcnZsZXRzLgorICoKKyAqIEBhdXRob3IgQW5pbCBLLiBWaWplbmRyYW4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEh0dHBKc3BCYXNlIAorICAgIGV4dGVuZHMgSHR0cFNlcnZsZXQgCisgICAgaW1wbGVtZW50cyBIdHRwSnNwUGFnZSAKKyAgICAgICAgCisgICAgCit7CisgICAgCisgICAgc3RhdGljIHsKKyAgICAgICAgaWYoIEpzcEZhY3RvcnkuZ2V0RGVmYXVsdEZhY3RvcnkoKSA9PSBudWxsICkgeworICAgICAgICAgICAgSnNwRmFjdG9yeUltcGwgZmFjdG9yeSA9IG5ldyBKc3BGYWN0b3J5SW1wbCgpOworICAgICAgICAgICAgaWYoIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsICkgeworICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlUGFja2FnZSA9ICJvcmcuYXBhY2hlLmphc3Blci4iOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydW50aW1lLkpzcEZhY3RvcnlJbXBsJFByaXZpbGVnZWRHZXRQYWdlQ29udGV4dCIpOworICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVudGltZS5Kc3BGYWN0b3J5SW1wbCRQcml2aWxlZ2VkUmVsZWFzZVBhZ2VDb250ZXh0Iik7CisgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5Iik7CisgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5JFByaXZpbGVnZWRJbnRyb3NwZWN0SGVscGVyIik7CisgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydW50aW1lLlNlcnZsZXRSZXNwb25zZVdyYXBwZXJJbmNsdWRlIik7CisgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2bGV0LkpzcFNlcnZsZXRXcmFwcGVyIik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggSHR0cEpzcEJhc2UuY2xhc3MgKQorICAgICAgICAgICAgICAgICAgICAgICAgLmVycm9yKCJKYXNwZXIgSnNwUnVudGltZUNvbnRleHQgcHJlbG9hZCBvZiBjbGFzcyBmYWlsZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXguZ2V0TWVzc2FnZSgpLCBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgSnNwRmFjdG9yeS5zZXREZWZhdWx0RmFjdG9yeShmYWN0b3J5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBIdHRwSnNwQmFzZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSAKKwl0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiAKKyAgICB7CisgICAgICAgIHN1cGVyLmluaXQoY29uZmlnKTsKKwlqc3BJbml0KCk7CisgICAgICAgIF9qc3BJbml0KCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldEluZm8oKSB7CisJcmV0dXJuIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZW5naW5lLmluZm8iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBkZXN0cm95KCkgeworCWpzcERlc3Ryb3koKTsKKwlfanNwRGVzdHJveSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVudHJ5IHBvaW50IGludG8gc2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSAKKwl0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gCisgICAgeworICAgICAgICBfanNwU2VydmljZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGpzcEluaXQoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgX2pzcEluaXQoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQganNwRGVzdHJveSgpIHsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBfanNwRGVzdHJveSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBfanNwU2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgCisJCQkJICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSAKKwl0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwQ29udGV4dFdyYXBwZXIuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9Kc3BDb250ZXh0V3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YmMxOWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwQ29udGV4dFdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDQ1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BXcml0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuUGFnZUNvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuZWwuRUxFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuZWwuRXhwcmVzc2lvbkV2YWx1YXRvcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5lbC5WYXJpYWJsZVJlc29sdmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Cb2R5Q29udGVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVmFyaWFibGVJbmZvOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmVsLlZhcmlhYmxlUmVzb2x2ZXJJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkxvY2FsaXplcjsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBhIEpTUCBDb250ZXh0IFdyYXBwZXIuCisgKgorICogVGhlIEpTUCBDb250ZXh0IFdyYXBwZXIgaXMgYSBKc3BDb250ZXh0IGNyZWF0ZWQgYW5kIG1haW50YWluZWQgYnkgYSB0YWcKKyAqIGhhbmRsZXIgaW1wbGVtZW50YXRpb24uIEl0IHdyYXBzIHRoZSBJbnZva2luZyBKU1AgQ29udGV4dCwgdGhhdCBpcywgdGhlCisgKiBKc3BDb250ZXh0IGluc3RhbmNlIHBhc3NlZCB0byB0aGUgdGFnIGhhbmRsZXIgYnkgdGhlIGludm9raW5nIHBhZ2UgdmlhCisgKiBzZXRKc3BDb250ZXh0KCkuCisgKgorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKiBAYXV0aG9yIEphbiBMdWVoZQorICovCitwdWJsaWMgY2xhc3MgSnNwQ29udGV4dFdyYXBwZXIKKyAgICAgICAgICAgIGV4dGVuZHMgUGFnZUNvbnRleHQgaW1wbGVtZW50cyBWYXJpYWJsZVJlc29sdmVyIHsKKworICAgIC8vIEludm9raW5nIEpTUCBjb250ZXh0CisgICAgcHJpdmF0ZSBQYWdlQ29udGV4dCBpbnZva2luZ0pzcEN0eHQ7CisKKyAgICBwcml2YXRlIHRyYW5zaWVudCBIYXNodGFibGUJcGFnZUF0dHJpYnV0ZXM7CisKKyAgICAvLyBBcnJheUxpc3Qgb2YgTkVTVEVEIHNjcmlwdGluZyB2YXJpYWJsZXMKKyAgICBwcml2YXRlIEFycmF5TGlzdCBuZXN0ZWRWYXJzOworCisgICAgLy8gQXJyYXlMaXN0IG9mIEFUX0JFR0lOIHNjcmlwdGluZyB2YXJpYWJsZXMKKyAgICBwcml2YXRlIEFycmF5TGlzdCBhdEJlZ2luVmFyczsKKworICAgIC8vIEFycmF5TGlzdCBvZiBBVF9FTkQgc2NyaXB0aW5nIHZhcmlhYmxlcworICAgIHByaXZhdGUgQXJyYXlMaXN0IGF0RW5kVmFyczsKKworICAgIHByaXZhdGUgTWFwIGFsaWFzZXM7CisKKyAgICBwcml2YXRlIEhhc2h0YWJsZSBvcmlnaW5hbE5lc3RlZFZhcnM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFyaWFibGUgcmVzb2x2ZXIsIGZvciBldmFsdWF0aW5nIEVMIGV4cHJlc3Npb25zLgorICAgICAqLworICAgIHByaXZhdGUgVmFyaWFibGVSZXNvbHZlckltcGwgdmFyaWFibGVSZXNvbHZlcgorICAgICAgICA9IG5ldyBWYXJpYWJsZVJlc29sdmVySW1wbCh0aGlzKTsKKworICAgIHB1YmxpYyBKc3BDb250ZXh0V3JhcHBlcihKc3BDb250ZXh0IGpzcENvbnRleHQsIEFycmF5TGlzdCBuZXN0ZWRWYXJzLAorCQkJICAgICBBcnJheUxpc3QgYXRCZWdpblZhcnMsIEFycmF5TGlzdCBhdEVuZFZhcnMsCisJCQkgICAgIE1hcCBhbGlhc2VzKSB7CisgICAgICAgIHRoaXMuaW52b2tpbmdKc3BDdHh0ID0gKFBhZ2VDb250ZXh0KSBqc3BDb250ZXh0OworCXRoaXMubmVzdGVkVmFycyA9IG5lc3RlZFZhcnM7CisJdGhpcy5hdEJlZ2luVmFycyA9IGF0QmVnaW5WYXJzOworCXRoaXMuYXRFbmRWYXJzID0gYXRFbmRWYXJzOworCXRoaXMucGFnZUF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlKDE2KTsKKwl0aGlzLmFsaWFzZXMgPSBhbGlhc2VzOworCisJaWYgKG5lc3RlZFZhcnMgIT0gbnVsbCkgeworCSAgICB0aGlzLm9yaWdpbmFsTmVzdGVkVmFycyA9IG5ldyBIYXNodGFibGUobmVzdGVkVmFycy5zaXplKCkpOworCX0KKwlzeW5jQmVnaW5UYWdGaWxlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTZXJ2bGV0IHNlcnZsZXQsIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIFN0cmluZyBlcnJvclBhZ2VVUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRzU2Vzc2lvbiwgaW50IGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9GbHVzaCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgIHsKKyAgICB9CisgICAgCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworCWlmIChuYW1lID09IG51bGwpIHsKKwkgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAorCSAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYXR0cmlidXRlLm51bGxfbmFtZSIpKTsKKwl9CisKKwlyZXR1cm4gcGFnZUF0dHJpYnV0ZXMuZ2V0KG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBpbnQgc2NvcGUpIHsKKworCWlmIChuYW1lID09IG51bGwpIHsKKwkgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAorCSAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYXR0cmlidXRlLm51bGxfbmFtZSIpKTsKKwl9CisKKwlpZiAoc2NvcGUgPT0gUEFHRV9TQ09QRSkgeworCSAgICByZXR1cm4gcGFnZUF0dHJpYnV0ZXMuZ2V0KG5hbWUpOworCX0KKworCXJldHVybiBpbnZva2luZ0pzcEN0eHQuZ2V0QXR0cmlidXRlKG5hbWUsIHNjb3BlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworCisJaWYgKG5hbWUgPT0gbnVsbCkgeworCSAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCisJICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5hdHRyaWJ1dGUubnVsbF9uYW1lIikpOworCX0KKworCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJICAgIHBhZ2VBdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7CisJfSBlbHNlIHsKKwkgICAgcmVtb3ZlQXR0cmlidXRlKG5hbWUsIFBBR0VfU0NPUEUpOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSwgaW50IHNjb3BlKSB7CisKKwlpZiAobmFtZSA9PSBudWxsKSB7CisJICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKwkgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWUiKSk7CisJfQorCisJaWYgKHNjb3BlID09IFBBR0VfU0NPUEUpIHsKKwkgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJcGFnZUF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKKwkgICAgfSBlbHNlIHsKKwkJcmVtb3ZlQXR0cmlidXRlKG5hbWUsIFBBR0VfU0NPUEUpOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaW52b2tpbmdKc3BDdHh0LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgc2NvcGUpOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGZpbmRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworCWlmIChuYW1lID09IG51bGwpIHsKKwkgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAorCSAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYXR0cmlidXRlLm51bGxfbmFtZSIpKTsKKwl9CisKKyAgICAgICAgT2JqZWN0IG8gPSBwYWdlQXR0cmlidXRlcy5nZXQobmFtZSk7CisgICAgICAgIGlmIChvID09IG51bGwpIHsKKwkgICAgbyA9IGludm9raW5nSnNwQ3R4dC5nZXRBdHRyaWJ1dGUobmFtZSwgUkVRVUVTVF9TQ09QRSk7CisJICAgIGlmIChvID09IG51bGwpIHsKKwkJaWYgKGdldFNlc3Npb24oKSAhPSBudWxsKSB7CisJCSAgICBvID0gaW52b2tpbmdKc3BDdHh0LmdldEF0dHJpYnV0ZShuYW1lLCBTRVNTSU9OX1NDT1BFKTsKKwkJfQorCQlpZiAobyA9PSBudWxsKSB7CisJCSAgICBvID0gaW52b2tpbmdKc3BDdHh0LmdldEF0dHJpYnV0ZShuYW1lLCBBUFBMSUNBVElPTl9TQ09QRSk7CisJCX0gCisJICAgIH0KKwl9CisKKwlyZXR1cm4gbzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworCWlmIChuYW1lID09IG51bGwpIHsKKwkgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAorCSAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYXR0cmlidXRlLm51bGxfbmFtZSIpKTsKKwl9CisKKwlwYWdlQXR0cmlidXRlcy5yZW1vdmUobmFtZSk7CisJaW52b2tpbmdKc3BDdHh0LnJlbW92ZUF0dHJpYnV0ZShuYW1lLCBSRVFVRVNUX1NDT1BFKTsKKwlpZiAoZ2V0U2Vzc2lvbigpICE9IG51bGwpIHsKKwkgICAgaW52b2tpbmdKc3BDdHh0LnJlbW92ZUF0dHJpYnV0ZShuYW1lLCBTRVNTSU9OX1NDT1BFKTsKKwl9CisJaW52b2tpbmdKc3BDdHh0LnJlbW92ZUF0dHJpYnV0ZShuYW1lLCBBUFBMSUNBVElPTl9TQ09QRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lLCBpbnQgc2NvcGUpIHsKKworCWlmIChuYW1lID09IG51bGwpIHsKKwkgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAorCSAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYXR0cmlidXRlLm51bGxfbmFtZSIpKTsKKwl9CisKKwlpZiAoc2NvcGUgPT0gUEFHRV9TQ09QRSl7CisJICAgIHBhZ2VBdHRyaWJ1dGVzLnJlbW92ZShuYW1lKTsKKwl9IGVsc2UgeworCSAgICBpbnZva2luZ0pzcEN0eHQucmVtb3ZlQXR0cmlidXRlKG5hbWUsIHNjb3BlKTsKKwl9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRBdHRyaWJ1dGVzU2NvcGUoU3RyaW5nIG5hbWUpIHsKKworCWlmIChuYW1lID09IG51bGwpIHsKKwkgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAorCSAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYXR0cmlidXRlLm51bGxfbmFtZSIpKTsKKwl9CisKKwlpZiAocGFnZUF0dHJpYnV0ZXMuZ2V0KG5hbWUpICE9IG51bGwpIHsKKwkgICAgcmV0dXJuIFBBR0VfU0NPUEU7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIGludm9raW5nSnNwQ3R4dC5nZXRBdHRyaWJ1dGVzU2NvcGUobmFtZSk7CisJfQorICAgIH0KKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVOYW1lc0luU2NvcGUoaW50IHNjb3BlKSB7CisgICAgICAgIGlmIChzY29wZSA9PSBQQUdFX1NDT1BFKSB7CisgICAgICAgICAgICByZXR1cm4gcGFnZUF0dHJpYnV0ZXMua2V5cygpOworCX0KKworCXJldHVybiBpbnZva2luZ0pzcEN0eHQuZ2V0QXR0cmlidXRlTmFtZXNJblNjb3BlKHNjb3BlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworCWludm9raW5nSnNwQ3R4dC5yZWxlYXNlKCk7CisgICAgfQorCisgICAgcHVibGljIEpzcFdyaXRlciBnZXRPdXQoKSB7CisJcmV0dXJuIGludm9raW5nSnNwQ3R4dC5nZXRPdXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKKwlyZXR1cm4gaW52b2tpbmdKc3BDdHh0LmdldFNlc3Npb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFBhZ2UoKSB7CisJcmV0dXJuIGludm9raW5nSnNwQ3R4dC5nZXRQYWdlKCk7CisgICAgfQorCisgICAgcHVibGljIFNlcnZsZXRSZXF1ZXN0IGdldFJlcXVlc3QoKSB7CisJcmV0dXJuIGludm9raW5nSnNwQ3R4dC5nZXRSZXF1ZXN0KCk7CisgICAgfQorCisgICAgcHVibGljIFNlcnZsZXRSZXNwb25zZSBnZXRSZXNwb25zZSgpIHsKKwlyZXR1cm4gaW52b2tpbmdKc3BDdHh0LmdldFJlc3BvbnNlKCk7CisgICAgfQorCisgICAgcHVibGljIEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7CisJcmV0dXJuIGludm9raW5nSnNwQ3R4dC5nZXRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VydmxldENvbmZpZyBnZXRTZXJ2bGV0Q29uZmlnKCkgeworCXJldHVybiBpbnZva2luZ0pzcEN0eHQuZ2V0U2VydmxldENvbmZpZygpOworICAgIH0KKworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKKwlyZXR1cm4gaW52b2tpbmdKc3BDdHh0LmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZm9yd2FyZChTdHJpbmcgcmVsYXRpdmVVcmxQYXRoKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICB7CisJaW52b2tpbmdKc3BDdHh0LmZvcndhcmQocmVsYXRpdmVVcmxQYXRoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbmNsdWRlKFN0cmluZyByZWxhdGl2ZVVybFBhdGgpCisJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworCWludm9raW5nSnNwQ3R4dC5pbmNsdWRlKHJlbGF0aXZlVXJsUGF0aCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5jbHVkZShTdHJpbmcgcmVsYXRpdmVVcmxQYXRoLCBib29sZWFuIGZsdXNoKSAKKwkgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwlpbmNsdWRlKHJlbGF0aXZlVXJsUGF0aCwgZmFsc2UpOyAvLyBYWFgKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVSZXNvbHZlciBnZXRWYXJpYWJsZVJlc29sdmVyKCkgeworCXJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCb2R5Q29udGVudCBwdXNoQm9keSgpIHsKKwlyZXR1cm4gaW52b2tpbmdKc3BDdHh0LnB1c2hCb2R5KCk7CisgICAgfQorCisgICAgcHVibGljIEpzcFdyaXRlciBwdXNoQm9keShXcml0ZXIgd3JpdGVyKSB7CisJcmV0dXJuIGludm9raW5nSnNwQ3R4dC5wdXNoQm9keSh3cml0ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBKc3BXcml0ZXIgcG9wQm9keSgpIHsKKyAgICAgICAgcmV0dXJuIGludm9raW5nSnNwQ3R4dC5wb3BCb2R5KCk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb25FdmFsdWF0b3IgZ2V0RXhwcmVzc2lvbkV2YWx1YXRvcigpIHsKKwlyZXR1cm4gaW52b2tpbmdKc3BDdHh0LmdldEV4cHJlc3Npb25FdmFsdWF0b3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVQYWdlRXhjZXB0aW9uKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIAorICAgIHsKKwkvLyBTaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHNpbmNlIGhhbmRsZUV4Y2VwdGlvbigpIGNhbGxlZCB3aXRoIGEKKwkvLyBUaHJvd2FibGUgaW4gdGhlIGdlbmVyYXRlZCBzZXJ2bGV0LgorCWhhbmRsZVBhZ2VFeGNlcHRpb24oKFRocm93YWJsZSkgZXgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGhhbmRsZVBhZ2VFeGNlcHRpb24oVGhyb3dhYmxlIHQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiAKKyAgICB7CisJaW52b2tpbmdKc3BDdHh0LmhhbmRsZVBhZ2VFeGNlcHRpb24odCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFyaWFibGVSZXNvbHZlciBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHJlc29sdmVWYXJpYWJsZSggU3RyaW5nIHBOYW1lICkgdGhyb3dzIEVMRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gdmFyaWFibGVSZXNvbHZlci5yZXNvbHZlVmFyaWFibGUocE5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN5bmNocm9uaXplIHZhcmlhYmxlcyBhdCBiZWdpbiBvZiB0YWcgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN5bmNCZWdpblRhZ0ZpbGUoKSB7CisJc2F2ZU5lc3RlZFZhcmlhYmxlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN5bmNocm9uaXplIHZhcmlhYmxlcyBiZWZvcmUgZnJhZ21lbnQgaW52b2thdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN5bmNCZWZvcmVJbnZva2UoKSB7CisJY29weVRhZ1RvUGFnZVNjb3BlKFZhcmlhYmxlSW5mby5ORVNURUQpOworCWNvcHlUYWdUb1BhZ2VTY29wZShWYXJpYWJsZUluZm8uQVRfQkVHSU4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN5bmNocm9uaXplIHZhcmlhYmxlcyBhdCBlbmQgb2YgdGFnIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzeW5jRW5kVGFnRmlsZSgpIHsKKwljb3B5VGFnVG9QYWdlU2NvcGUoVmFyaWFibGVJbmZvLkFUX0JFR0lOKTsKKwljb3B5VGFnVG9QYWdlU2NvcGUoVmFyaWFibGVJbmZvLkFUX0VORCk7CisJcmVzdG9yZU5lc3RlZFZhcmlhYmxlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcGllcyB0aGUgdmFyaWFibGVzIG9mIHRoZSBnaXZlbiBzY29wZSBmcm9tIHRoZSB2aXJ0dWFsIHBhZ2Ugc2NvcGUgb2YKKyAgICAgKiB0aGlzIEpTUCBjb250ZXh0IHdyYXBwZXIgdG8gdGhlIHBhZ2Ugc2NvcGUgb2YgdGhlIGludm9raW5nIEpTUCBjb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHNjb3BlIHZhcmlhYmxlIHNjb3BlIChvbmUgb2YgTkVTVEVELCBBVF9CRUdJTiwgb3IgQVRfRU5EKQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjb3B5VGFnVG9QYWdlU2NvcGUoaW50IHNjb3BlKSB7CisJSXRlcmF0b3IgaXRlciA9IG51bGw7CisKKwlzd2l0Y2ggKHNjb3BlKSB7CisJY2FzZSBWYXJpYWJsZUluZm8uTkVTVEVEOgorCSAgICBpZiAobmVzdGVkVmFycyAhPSBudWxsKSB7CisJCWl0ZXIgPSBuZXN0ZWRWYXJzLml0ZXJhdG9yKCk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBWYXJpYWJsZUluZm8uQVRfQkVHSU46CisJICAgIGlmIChhdEJlZ2luVmFycyAhPSBudWxsKSB7CisJCWl0ZXIgPSBhdEJlZ2luVmFycy5pdGVyYXRvcigpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgVmFyaWFibGVJbmZvLkFUX0VORDoKKwkgICAgaWYgKGF0RW5kVmFycyAhPSBudWxsKSB7CisJCWl0ZXIgPSBhdEVuZFZhcnMuaXRlcmF0b3IoKTsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisKKwl3aGlsZSAoKGl0ZXIgIT0gbnVsbCkgJiYgaXRlci5oYXNOZXh0KCkpIHsKKwkgICAgU3RyaW5nIHZhck5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKKwkgICAgT2JqZWN0IG9iaiA9IGdldEF0dHJpYnV0ZSh2YXJOYW1lKTsKKwkgICAgdmFyTmFtZSA9IGZpbmRBbGlhcyh2YXJOYW1lKTsKKwkgICAgaWYgKG9iaiAhPSBudWxsKSB7CisJCWludm9raW5nSnNwQ3R4dC5zZXRBdHRyaWJ1dGUodmFyTmFtZSwgb2JqKTsKKwkgICAgfSBlbHNlIHsKKwkJaW52b2tpbmdKc3BDdHh0LnJlbW92ZUF0dHJpYnV0ZSh2YXJOYW1lLCBQQUdFX1NDT1BFKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlcyB0aGUgdmFsdWVzIG9mIGFueSBORVNURUQgdmFyaWFibGVzIHRoYXQgYXJlIHByZXNlbnQgaW4KKyAgICAgKiB0aGUgaW52b2tpbmcgSlNQIGNvbnRleHQsIHNvIHRoZXkgY2FuIGxhdGVyIGJlIHJlc3RvcmVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzYXZlTmVzdGVkVmFyaWFibGVzKCkgeworCWlmIChuZXN0ZWRWYXJzICE9IG51bGwpIHsKKwkgICAgSXRlcmF0b3IgaXRlciA9IG5lc3RlZFZhcnMuaXRlcmF0b3IoKTsKKwkgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCVN0cmluZyB2YXJOYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisJCXZhck5hbWUgPSBmaW5kQWxpYXModmFyTmFtZSk7CisJCU9iamVjdCBvYmogPSBpbnZva2luZ0pzcEN0eHQuZ2V0QXR0cmlidXRlKHZhck5hbWUpOworCQlpZiAob2JqICE9IG51bGwpIHsKKwkJICAgIG9yaWdpbmFsTmVzdGVkVmFycy5wdXQodmFyTmFtZSwgb2JqKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RvcmVzIHRoZSB2YWx1ZXMgb2YgYW55IE5FU1RFRCB2YXJpYWJsZXMgaW4gdGhlIGludm9raW5nIEpTUAorICAgICAqIGNvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVOZXN0ZWRWYXJpYWJsZXMoKSB7CisJaWYgKG5lc3RlZFZhcnMgIT0gbnVsbCkgeworCSAgICBJdGVyYXRvciBpdGVyID0gbmVzdGVkVmFycy5pdGVyYXRvcigpOworCSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJU3RyaW5nIHZhck5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKKwkJdmFyTmFtZSA9IGZpbmRBbGlhcyh2YXJOYW1lKTsKKwkJT2JqZWN0IG9iaiA9IG9yaWdpbmFsTmVzdGVkVmFycy5nZXQodmFyTmFtZSk7CisJCWlmIChvYmogIT0gbnVsbCkgeworCQkgICAgaW52b2tpbmdKc3BDdHh0LnNldEF0dHJpYnV0ZSh2YXJOYW1lLCBvYmopOworCQl9IGVsc2UgeworCQkgICAgaW52b2tpbmdKc3BDdHh0LnJlbW92ZUF0dHJpYnV0ZSh2YXJOYW1lLCBQQUdFX1NDT1BFKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIHZhcmlhYmxlIG5hbWUgaXMgdXNlZCBhcyBhbiBhbGlhcywgYW5kIGlmIHNvLAorICAgICAqIHJldHVybnMgdGhlIHZhcmlhYmxlIG5hbWUgZm9yIHdoaWNoIGl0IGlzIHVzZWQgYXMgYW4gYWxpYXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFyTmFtZSBUaGUgdmFyaWFibGUgbmFtZSB0byBjaGVjaworICAgICAqIEByZXR1cm4gVGhlIHZhcmlhYmxlIG5hbWUgZm9yIHdoaWNoIHZhck5hbWUgaXMgdXNlZCBhcyBhbiBhbGlhcywgb3IKKyAgICAgKiB2YXJOYW1lIGlmIGl0IGlzIG5vdCBiZWluZyB1c2VkIGFzIGFuIGFsaWFzCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZmluZEFsaWFzKFN0cmluZyB2YXJOYW1lKSB7CisKKwlpZiAoYWxpYXNlcyA9PSBudWxsKQorCSAgICByZXR1cm4gdmFyTmFtZTsKKworCVN0cmluZyBhbGlhcyA9IChTdHJpbmcpIGFsaWFzZXMuZ2V0KHZhck5hbWUpOworCWlmIChhbGlhcyA9PSBudWxsKSB7CisJICAgIHJldHVybiB2YXJOYW1lOworCX0KKwlyZXR1cm4gYWxpYXM7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwRmFjdG9yeUltcGwuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9Kc3BGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTQwNGQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWU7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFbmdpbmVJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIudXRpbC5TaW1wbGVQb29sOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIEpzcEZhY3RvcnkuCisgKgorICogQGF1dGhvciBBbmlsIEsuIFZpamVuZHJhbgorICovCitwdWJsaWMgY2xhc3MgSnNwRmFjdG9yeUltcGwgZXh0ZW5kcyBKc3BGYWN0b3J5IHsKKworICAgIC8vIExvZ2dlcgorICAgIHByaXZhdGUgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpzcEZhY3RvcnlJbXBsLmNsYXNzKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUEVDX1ZFUlNJT04gPSAiMi4wIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9QT09MID0gCisgICAgICAgIEJvb2xlYW4udmFsdWVPZihTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwRmFjdG9yeUltcGwuVVNFX1BPT0wiLCAidHJ1ZSIpKS5ib29sZWFuVmFsdWUoKTsKKworICAgIHByaXZhdGUgU2ltcGxlUG9vbCBwb29sID0gbmV3IFNpbXBsZVBvb2woMTAwKTsKKyAgICAKKyAgICBwdWJsaWMgUGFnZUNvbnRleHQgZ2V0UGFnZUNvbnRleHQoU2VydmxldCBzZXJ2bGV0LAorCQkJCSAgICAgIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yUGFnZVVSTCwgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRzU2Vzc2lvbiwKKwkJCQkgICAgICBpbnQgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvZmx1c2gpIHsKKwlpZiggU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwgKSB7CisJICAgIFByaXZpbGVnZWRHZXRQYWdlQ29udGV4dCBkcCA9IG5ldyBQcml2aWxlZ2VkR2V0UGFnZUNvbnRleHQoCisJCShKc3BGYWN0b3J5SW1wbCl0aGlzLCBzZXJ2bGV0LCByZXF1ZXN0LCByZXNwb25zZSwgZXJyb3JQYWdlVVJMLAorICAgICAgICAgICAgICAgIG5lZWRzU2Vzc2lvbiwgYnVmZmVyU2l6ZSwgYXV0b2ZsdXNoKTsKKwkgICAgcmV0dXJuIChQYWdlQ29udGV4dClBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChkcCk7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIGludGVybmFsR2V0UGFnZUNvbnRleHQoc2VydmxldCwgcmVxdWVzdCwgcmVzcG9uc2UsCisJCQkJCSAgZXJyb3JQYWdlVVJMLCBuZWVkc1Nlc3Npb24sCisJCQkJCSAgYnVmZmVyU2l6ZSwgYXV0b2ZsdXNoKTsKKwl9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVBhZ2VDb250ZXh0KFBhZ2VDb250ZXh0IHBjKSB7CisJaWYoIHBjID09IG51bGwgKQorCSAgICByZXR1cm47CisgICAgICAgIGlmKCBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIFByaXZpbGVnZWRSZWxlYXNlUGFnZUNvbnRleHQgZHAgPSBuZXcgUHJpdmlsZWdlZFJlbGVhc2VQYWdlQ29udGV4dCgKKyAgICAgICAgICAgICAgICAoSnNwRmFjdG9yeUltcGwpdGhpcyxwYyk7CisgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChkcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnRlcm5hbFJlbGVhc2VQYWdlQ29udGV4dChwYyk7CisJfQorICAgIH0KKworICAgIHB1YmxpYyBKc3BFbmdpbmVJbmZvIGdldEVuZ2luZUluZm8oKSB7CisgICAgICAgIHJldHVybiBuZXcgSnNwRW5naW5lSW5mbygpIHsKKwkJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpY2F0aW9uVmVyc2lvbigpIHsKKwkJICAgIHJldHVybiBTUEVDX1ZFUlNJT047CisJCX0KKwkgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIFBhZ2VDb250ZXh0IGludGVybmFsR2V0UGFnZUNvbnRleHQoU2VydmxldCBzZXJ2bGV0LAorCQkJCQkgICAgICAgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJCQkJICAgICAgIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgCisJCQkJCSAgICAgICBTdHJpbmcgZXJyb3JQYWdlVVJMLCAKKwkJCQkJICAgICAgIGJvb2xlYW4gbmVlZHNTZXNzaW9uLAorCQkJCQkgICAgICAgaW50IGJ1ZmZlclNpemUsIAorCQkJCQkgICAgICAgYm9vbGVhbiBhdXRvZmx1c2gpIHsKKyAgICAgICAgdHJ5IHsKKwkgICAgUGFnZUNvbnRleHQgcGM7CisJICAgIGlmKCBVU0VfUE9PTCApIHsKKyAgICAgICAgICAgICAgICBwYyA9IChQYWdlQ29udGV4dCkgcG9vbC5nZXQoKTsKKwkJaWYoIHBjID09IG51bGwgKSB7CisJCSAgICBwYz0gbmV3IFBhZ2VDb250ZXh0SW1wbCh0aGlzKTsKKwkJfQorCSAgICB9IGVsc2UgeworCQlwYyA9IG5ldyBQYWdlQ29udGV4dEltcGwodGhpcyk7CisJICAgIH0KKwkgICAgcGMuaW5pdGlhbGl6ZShzZXJ2bGV0LCByZXF1ZXN0LCByZXNwb25zZSwgZXJyb3JQYWdlVVJMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHNTZXNzaW9uLCBidWZmZXJTaXplLCBhdXRvZmx1c2gpOworICAgICAgICAgICAgcmV0dXJuIHBjOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgIC8qIEZJWE1FOiBuZWVkIHRvIGRvIHNvbWV0aGluZyByZWFzb25hYmxlIGhlcmUhISAqLworICAgICAgICAgICAgbG9nLmZhdGFsKCJFeGNlcHRpb24gaW5pdGlhbGl6aW5nIHBhZ2UgY29udGV4dCIsIGV4KTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGludGVybmFsUmVsZWFzZVBhZ2VDb250ZXh0KFBhZ2VDb250ZXh0IHBjKSB7CisgICAgICAgIHBjLnJlbGVhc2UoKTsKKwlpZiAoVVNFX1BPT0wgJiYgKHBjIGluc3RhbmNlb2YgUGFnZUNvbnRleHRJbXBsKSkgeworCSAgICBwb29sLnB1dCggcGMgKTsKKwl9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBQcml2aWxlZ2VkR2V0UGFnZUNvbnRleHQgaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9uIHsKKworCXByaXZhdGUgSnNwRmFjdG9yeUltcGwgZmFjdG9yeTsKKwlwcml2YXRlIFNlcnZsZXQgc2VydmxldDsKKwlwcml2YXRlIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3Q7CisJcHJpdmF0ZSBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7CisJcHJpdmF0ZSBTdHJpbmcgZXJyb3JQYWdlVVJMOworCXByaXZhdGUgYm9vbGVhbiBuZWVkc1Nlc3Npb247CisJcHJpdmF0ZSBpbnQgYnVmZmVyU2l6ZTsKKwlwcml2YXRlIGJvb2xlYW4gYXV0b2ZsdXNoOworCisJUHJpdmlsZWdlZEdldFBhZ2VDb250ZXh0KEpzcEZhY3RvcnlJbXBsIGZhY3RvcnksCisJCQkJIFNlcnZsZXQgc2VydmxldCwKKwkJCQkgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJCQkgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorCQkJCSBTdHJpbmcgZXJyb3JQYWdlVVJMLAorCQkJCSBib29sZWFuIG5lZWRzU2Vzc2lvbiwKKwkJCQkgaW50IGJ1ZmZlclNpemUsCisJCQkJIGJvb2xlYW4gYXV0b2ZsdXNoKSB7CisJICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7CisJICAgIHRoaXMuc2VydmxldCA9IHNlcnZsZXQ7CisJICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisJICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKwkgICAgdGhpcy5lcnJvclBhZ2VVUkwgPSBlcnJvclBhZ2VVUkw7CisJICAgIHRoaXMubmVlZHNTZXNzaW9uID0gbmVlZHNTZXNzaW9uOworCSAgICB0aGlzLmJ1ZmZlclNpemUgPSBidWZmZXJTaXplOworCSAgICB0aGlzLmF1dG9mbHVzaCA9IGF1dG9mbHVzaDsKKwl9CisgCisJcHVibGljIE9iamVjdCBydW4oKSB7CisJICAgIHJldHVybiBmYWN0b3J5LmludGVybmFsR2V0UGFnZUNvbnRleHQoc2VydmxldCwKKwkJCQkJCSAgcmVxdWVzdCwKKwkJCQkJCSAgcmVzcG9uc2UsCisJCQkJCQkgIGVycm9yUGFnZVVSTCwKKwkJCQkJCSAgbmVlZHNTZXNzaW9uLAorCQkJCQkJICBidWZmZXJTaXplLAorCQkJCQkJICBhdXRvZmx1c2gpOworCX0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFByaXZpbGVnZWRSZWxlYXNlUGFnZUNvbnRleHQgaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9uIHsKKworICAgICAgICBwcml2YXRlIEpzcEZhY3RvcnlJbXBsIGZhY3Rvcnk7CisJcHJpdmF0ZSBQYWdlQ29udGV4dCBwYWdlQ29udGV4dDsKKworICAgICAgICBQcml2aWxlZ2VkUmVsZWFzZVBhZ2VDb250ZXh0KEpzcEZhY3RvcnlJbXBsIGZhY3RvcnksCisJCQkJICAgICBQYWdlQ29udGV4dCBwYWdlQ29udGV4dCkgeworICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMucGFnZUNvbnRleHQgPSBwYWdlQ29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworICAgICAgICAgICAgZmFjdG9yeS5pbnRlcm5hbFJlbGVhc2VQYWdlQ29udGV4dChwYWdlQ29udGV4dCk7CisJICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0pzcEZyYWdtZW50SGVscGVyLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwRnJhZ21lbnRIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGQyNmQzCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0pzcEZyYWdtZW50SGVscGVyLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuUGFnZUNvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkpzcEZyYWdtZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BUYWc7CisKKy8qKgorICogSGVscGVyIGNsYXNzIGZyb20gd2hpY2ggYWxsIEpzcCBGcmFnbWVudCBoZWxwZXIgY2xhc3NlcyBleHRlbmQuCisgKiBUaGlzIGNsYXNzIGFsbG93cyBmb3IgdGhlIGVtdWxhdGlvbiBvZiBudW1lcm91cyBmcmFnbWVudHMgd2l0aGluCisgKiBhIHNpbmdsZSBjbGFzcywgd2hpY2ggaW4gdHVybiByZWR1Y2VzIHRoZSBsb2FkIG9uIHRoZSBjbGFzcyBsb2FkZXIKKyAqIHNpbmNlIHRoZXJlIGFyZSBwb3RlbnRpYWxseSBtYW55IEpzcEZyYWdtZW50cyBpbiBhIHNpbmdsZSBwYWdlLgorICogPHA+CisgKiBUaGUgY2xhc3MgYWxzbyBwcm92aWRlcyB2YXJpb3VzIHV0aWxpdHkgbWV0aG9kcyBmb3IgSnNwRnJhZ21lbnQKKyAqIGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hcmsgUm90aAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSnNwRnJhZ21lbnRIZWxwZXIgCisgICAgZXh0ZW5kcyBKc3BGcmFnbWVudCAKK3sKKyAgICAKKyAgICBwcm90ZWN0ZWQgaW50IGRpc2NyaW1pbmF0b3I7CisgICAgcHJvdGVjdGVkIEpzcENvbnRleHQganNwQ29udGV4dDsKKyAgICBwcm90ZWN0ZWQgUGFnZUNvbnRleHQgX2pzcHhfcGFnZV9jb250ZXh0OworICAgIHByb3RlY3RlZCBKc3BUYWcgcGFyZW50VGFnOworCisgICAgcHVibGljIEpzcEZyYWdtZW50SGVscGVyKCBpbnQgZGlzY3JpbWluYXRvciwgSnNwQ29udGV4dCBqc3BDb250ZXh0LCAKKyAgICAgICAgSnNwVGFnIHBhcmVudFRhZyApIAorICAgIHsKKyAgICAgICAgdGhpcy5kaXNjcmltaW5hdG9yID0gZGlzY3JpbWluYXRvcjsKKyAgICAgICAgdGhpcy5qc3BDb250ZXh0ID0ganNwQ29udGV4dDsKKyAgICAgICAgdGhpcy5fanNweF9wYWdlX2NvbnRleHQgPSBudWxsOworICAgICAgICBpZigganNwQ29udGV4dCBpbnN0YW5jZW9mIFBhZ2VDb250ZXh0ICkgeworICAgICAgICAgICAgX2pzcHhfcGFnZV9jb250ZXh0ID0gKFBhZ2VDb250ZXh0KWpzcENvbnRleHQ7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5wYXJlbnRUYWcgPSBwYXJlbnRUYWc7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBKc3BDb250ZXh0IGdldEpzcENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmpzcENvbnRleHQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBKc3BUYWcgZ2V0UGFyZW50VGFnKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRUYWc7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0pzcFJ1bnRpbWVMaWJyYXJ5LmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwUnVudGltZUxpYnJhcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzY2NTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0pzcFJ1bnRpbWVMaWJyYXJ5LmphdmEKQEAgLTAsMCArMSwxMDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lOworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUVkaXRvcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RWRpdG9yTWFuYWdlcjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlJlcXVlc3REaXNwYXRjaGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Cb2R5Q29udGVudDsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Mb2NhbGl6ZXI7CisKKy8qKgorICogQnVuY2ggb2YgdXRpbCBtZXRob2RzIHRoYXQgYXJlIHVzZWQgYnkgY29kZSBnZW5lcmF0ZWQgZm9yIHVzZUJlYW4sCisgKiBnZXRQcm9wZXJ0eSBhbmQgc2V0UHJvcGVydHkuICAKKyAqCisgKiBUaGUgX19iZWdpbiwgX19lbmQgc3R1ZmYgaXMgdGhlcmUgc28gdGhhdCB0aGUgSlNQIGVuZ2luZSBjYW4KKyAqIGFjdHVhbGx5IHBhcnNlIHRoaXMgZmlsZSBhbmQgaW5saW5lIHRoZW0gaWYgcGVvcGxlIGRvbid0IHdhbnQKKyAqIHJ1bnRpbWUgZGVwZW5kZW5jaWVzIG9uIHRoaXMgY2xhc3MuIEhvd2V2ZXIsIEknbSBub3Qgc3VyZSBpZiB0aGF0CisgKiB3b3JrcyBzbyB3ZWxsIHJpZ2h0IG5vdy4gSXQgZ290IGZvcmdvdHRlbiBhdCBzb21lIHBvaW50LiAtYWt2CisgKgorICogQGF1dGhvciBNYW5kYXIgUmFqZQorICogQGF1dGhvciBTaGF3biBCYXllcm4KKyAqLworcHVibGljIGNsYXNzIEpzcFJ1bnRpbWVMaWJyYXJ5IHsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9FWENFUFRJT04KKyAgICAgICAgPSAiamF2YXguc2VydmxldC5lcnJvci5leGNlcHRpb24iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRVhDRVBUSU9OCisgICAgICAgID0gImphdmF4LnNlcnZsZXQuanNwLmpzcEV4Y2VwdGlvbiI7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFByaXZpbGVnZWRJbnRyb3NwZWN0SGVscGVyCisgICAgICAgIGltcGxlbWVudHMgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgYmVhbjsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisgICAgICAgIHByaXZhdGUgU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGFyYW07CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVNZXRob2RORjsKKworICAgICAgICBQcml2aWxlZ2VkSW50cm9zcGVjdEhlbHBlcihPYmplY3QgYmVhbiwgU3RyaW5nIHByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSwgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtLCBib29sZWFuIGlnbm9yZU1ldGhvZE5GKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmJlYW4gPSBiZWFuOworICAgICAgICAgICAgdGhpcy5wcm9wID0gcHJvcDsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgICAgICB0aGlzLnBhcmFtID0gcGFyYW07CisgICAgICAgICAgICB0aGlzLmlnbm9yZU1ldGhvZE5GID0gaWdub3JlTWV0aG9kTkY7CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgaW50ZXJuYWxJbnRyb3NwZWN0aGVscGVyKAorICAgICAgICAgICAgICAgIGJlYW4scHJvcCx2YWx1ZSxyZXF1ZXN0LHBhcmFtLGlnbm9yZU1ldGhvZE5GKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGphdmF4LnNlcnZsZXQuZXJyb3IuZXhjZXB0aW9uIHJlcXVlc3QKKyAgICAgKiBhdHRyaWJ1dGUgdmFsdWUsIGlmIHByZXNlbnQsIG90aGVyd2lzZSB0aGUgdmFsdWUgb2YgdGhlCisgICAgICogamF2YXguc2VydmxldC5qc3AuanNwRXhjZXB0aW9uIHJlcXVlc3QgYXR0cmlidXRlIHZhbHVlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGdlbmVyYXRlZCBzZXJ2bGV0IGNvZGUKKyAgICAgKiBmb3IgYSBKU1AgZXJyb3IgcGFnZSwgd2hlbiB0aGUgImV4Y2VwdGlvbiIgaW1wbGljaXQgc2NyaXB0aW5nIGxhbmd1YWdlCisgICAgICogdmFyaWFibGUgaXMgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUaHJvd2FibGUgZ2V0VGhyb3dhYmxlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgVGhyb3dhYmxlIGVycm9yID0gKFRocm93YWJsZSkgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoU0VSVkxFVF9FWENFUFRJT04pOworICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgZXJyb3IgPSAoVGhyb3dhYmxlKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShKU1BfRVhDRVBUSU9OKTsKKyAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBUaGUgb25seSBwbGFjZSB0aGF0IHNldHMgSlNQX0VYQ0VQVElPTiBpcworICAgICAgICAgICAgICAgICAqIFBhZ2VDb250ZXh0SW1wbC5oYW5kbGVQYWdlRXhjZXB0aW9uKCkuIEl0IHJlYWxseSBzaG91bGQgc2V0CisgICAgICAgICAgICAgICAgICogU0VSVkxFVF9FWENFUFRJT04sIGJ1dCB0aGF0IHdvdWxkIGludGVyZmVyZSB3aXRoIHRoZSAKKyAgICAgICAgICAgICAgICAgKiBFcnJvclJlcG9ydFZhbHZlLiBUaGVyZWZvcmUsIGlmIEpTUF9FWENFUFRJT04gaXMgc2V0LCB3ZQorICAgICAgICAgICAgICAgICAqIG5lZWQgdG8gc2V0IFNFUlZMRVRfRVhDRVBUSU9OLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKFNFUlZMRVRfRVhDRVBUSU9OLCBlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvZXJjZVRvQm9vbGVhbihTdHJpbmcgcykgeworICAgICAgICBpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihzKS5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGUgY29lcmNlVG9CeXRlKFN0cmluZyBzKSB7CisgICAgICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIChieXRlKSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gQnl0ZS52YWx1ZU9mKHMpLmJ5dGVWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2hhciBjb2VyY2VUb0NoYXIoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAoY2hhcikgMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHRoaXMgdHJpY2sgYXZvaWRzIGVzY2FwaW5nIGlzc3VlcworICAgICAgICAgICAgcmV0dXJuIChjaGFyKShpbnQpIHMuY2hhckF0KDApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBkb3VibGUgY29lcmNlVG9Eb3VibGUoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICByZXR1cm4gKGRvdWJsZSkgMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIERvdWJsZS52YWx1ZU9mKHMpLmRvdWJsZVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmbG9hdCBjb2VyY2VUb0Zsb2F0KFN0cmluZyBzKSB7CisgICAgICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIChmbG9hdCkgMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEZsb2F0LnZhbHVlT2YocykuZmxvYXRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvZXJjZVRvSW50KFN0cmluZyBzKSB7CisgICAgICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YocykuaW50VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHNob3J0IGNvZXJjZVRvU2hvcnQoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICByZXR1cm4gKHNob3J0KSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gU2hvcnQudmFsdWVPZihzKS5zaG9ydFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBsb25nIGNvZXJjZVRvTG9uZyhTdHJpbmcgcykgeworICAgICAgICBpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAobG9uZykgMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIExvbmcudmFsdWVPZihzKS5sb25nVmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjb2VyY2UoU3RyaW5nIHMsIENsYXNzIHRhcmdldCkgeworCisgICAgICAgIGJvb2xlYW4gaXNOdWxsT3JFbXB0eSA9IChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKTsKKworICAgICAgICBpZiAodGFyZ2V0ID09IEJvb2xlYW4uY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KSB7CisgICAgICAgICAgICAgICAgcyA9ICJmYWxzZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IEJvb2xlYW4ocyk7CisgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09IEJ5dGUuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZSgoYnl0ZSkgMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlKHMpOworICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCA9PSBDaGFyYWN0ZXIuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhcmFjdGVyKChjaGFyKSAwKTsKKyAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFyYWN0ZXIocy5jaGFyQXQoMCkpOworICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCA9PSBEb3VibGUuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlKDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlKHMpOworICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCA9PSBGbG9hdC5jbGFzcykgeworICAgICAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdCgwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0KHMpOworICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCA9PSBJbnRlZ2VyLmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXIoMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKHMpOworICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCA9PSBTaG9ydC5jbGFzcykgeworICAgICAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaG9ydCgoc2hvcnQpIDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hvcnQocyk7CisgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09IExvbmcuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZygwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvbmcocyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgLy8gX19iZWdpbiBjb252ZXJ0TWV0aG9kCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY29udmVydChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcywgQ2xhc3MgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHByb3BlcnR5RWRpdG9yQ2xhc3MpIAorICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24gCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICh0LmVxdWFscyhCb29sZWFuLmNsYXNzKSB8fCB0LmVxdWFscyhCb29sZWFuLlRZUEUpKQorICAgICAgICAgICAgICAgICAgICBzID0gImZhbHNlIjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHByb3BlcnR5RWRpdG9yQ2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZUZyb21CZWFuSW5mb1Byb3BlcnR5RWRpdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwgcHJvcGVydHlOYW1lLCBzLCBwcm9wZXJ0eUVkaXRvckNsYXNzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHQuZXF1YWxzKEJvb2xlYW4uY2xhc3MpIHx8IHQuZXF1YWxzKEJvb2xlYW4uVFlQRSkgKSB7CisgICAgICAgICAgICAgICAgaWYgKHMuZXF1YWxzSWdub3JlQ2FzZSgib24iKSB8fCBzLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkKKyAgICAgICAgICAgICAgICAgICAgcyA9ICJ0cnVlIjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHMgPSAiZmFsc2UiOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQm9vbGVhbihzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHQuZXF1YWxzKEJ5dGUuY2xhc3MpIHx8IHQuZXF1YWxzKEJ5dGUuVFlQRSkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlKHMpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0LmVxdWFscyhDaGFyYWN0ZXIuY2xhc3MpIHx8IHQuZXF1YWxzKENoYXJhY3Rlci5UWVBFKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzLmxlbmd0aCgpID4gMCA/IG5ldyBDaGFyYWN0ZXIocy5jaGFyQXQoMCkpIDogbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHQuZXF1YWxzKFNob3J0LmNsYXNzKSB8fCB0LmVxdWFscyhTaG9ydC5UWVBFKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNob3J0KHMpOworICAgICAgICAgICAgfSBlbHNlIGlmICggdC5lcXVhbHMoSW50ZWdlci5jbGFzcykgfHwgdC5lcXVhbHMoSW50ZWdlci5UWVBFKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXIocyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCB0LmVxdWFscyhGbG9hdC5jbGFzcykgfHwgdC5lcXVhbHMoRmxvYXQuVFlQRSkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHQuZXF1YWxzKExvbmcuY2xhc3MpIHx8IHQuZXF1YWxzKExvbmcuVFlQRSkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nKHMpOworICAgICAgICAgICAgfSBlbHNlIGlmICggdC5lcXVhbHMoRG91YmxlLmNsYXNzKSB8fCB0LmVxdWFscyhEb3VibGUuVFlQRSkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUocyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCB0LmVxdWFscyhTdHJpbmcuY2xhc3MpICkgeworICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgfSBlbHNlIGlmICggdC5lcXVhbHMoamF2YS5pby5GaWxlLmNsYXNzKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGphdmEuaW8uRmlsZShzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodC5nZXROYW1lKCkuZXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHtzfTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlRnJvbVByb3BlcnR5RWRpdG9yTWFuYWdlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwgcHJvcGVydHlOYW1lLCBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBfX2VuZCBjb252ZXJ0TWV0aG9kCisKKyAgICAvLyBfX2JlZ2luIGludHJvc3BlY3RNZXRob2QKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW50cm9zcGVjdChPYmplY3QgYmVhbiwgU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgeworICAgICAgICBFbnVtZXJhdGlvbiBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICB3aGlsZSAoIGUuaGFzTW9yZUVsZW1lbnRzKCkgKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSAgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihuYW1lKTsKKyAgICAgICAgICAgIGludHJvc3BlY3RoZWxwZXIoYmVhbiwgbmFtZSwgdmFsdWUsIHJlcXVlc3QsIG5hbWUsIHRydWUpOworICAgICAgICB9CisgICAgfQorICAgIC8vIF9fZW5kIGludHJvc3BlY3RNZXRob2QKKyAgICAKKyAgICAvLyBfX2JlZ2luIGludHJvc3BlY3RoZWxwZXJNZXRob2QKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW50cm9zcGVjdGhlbHBlcihPYmplY3QgYmVhbiwgU3RyaW5nIHByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlLCBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbSwgYm9vbGVhbiBpZ25vcmVNZXRob2RORikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiggU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFByaXZpbGVnZWRJbnRyb3NwZWN0SGVscGVyIGRwID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRJbnRyb3NwZWN0SGVscGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgYmVhbixwcm9wLHZhbHVlLHJlcXVlc3QscGFyYW0saWdub3JlTWV0aG9kTkYpOworICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGRwKTsKKyAgICAgICAgICAgIH0gY2F0Y2goIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGUpIHsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHBlLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIHRocm93IChKYXNwZXJFeGNlcHRpb24pZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludGVybmFsSW50cm9zcGVjdGhlbHBlcigKKyAgICAgICAgICAgICAgICBiZWFuLHByb3AsdmFsdWUscmVxdWVzdCxwYXJhbSxpZ25vcmVNZXRob2RORik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGludGVybmFsSW50cm9zcGVjdGhlbHBlcihPYmplY3QgYmVhbiwgU3RyaW5nIHByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlLCBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbSwgYm9vbGVhbiBpZ25vcmVNZXRob2RORikgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTWV0aG9kIG1ldGhvZCA9IG51bGw7CisgICAgICAgIENsYXNzIHR5cGUgPSBudWxsOworICAgICAgICBDbGFzcyBwcm9wZXJ0eUVkaXRvckNsYXNzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGphdmEuYmVhbnMuQmVhbkluZm8gaW5mbworICAgICAgICAgICAgICAgID0gamF2YS5iZWFucy5JbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oYmVhbi5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGlmICggaW5mbyAhPSBudWxsICkgeworICAgICAgICAgICAgICAgIGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yIHBkW10KKyAgICAgICAgICAgICAgICAgICAgPSBpbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBwZC5sZW5ndGggOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwZFtpXS5nZXROYW1lKCkuZXF1YWxzKHByb3ApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gcGRbaV0uZ2V0V3JpdGVNZXRob2QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgICA9IHBkW2ldLmdldFByb3BlcnR5VHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFZGl0b3JDbGFzcyA9IHBkW2ldLmdldFByb3BlcnR5RWRpdG9yQ2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBtZXRob2QgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmJlYW5zLnNldHByb3BlcnR5Lm5vaW5kZXhzZXQiKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdCA9IHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhwYXJhbSk7CisgICAgICAgICAgICAgICAgICAgIC8vWFhYIFBsZWFzZSBjaGVjay4KKyAgICAgICAgICAgICAgICAgICAgaWYodmFsdWVzID09IG51bGwpIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgaWYodC5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShiZWFuLCBuZXcgT2JqZWN0W10geyB2YWx1ZXMgfSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVUeXBlZEFycmF5IChwcm9wLCBiZWFuLCBtZXRob2QsIHZhbHVlcywgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RWRpdG9yQ2xhc3MpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbHVlID09IG51bGwgfHwgKHBhcmFtICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKCIiKSkpIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG92YWwgPSBjb252ZXJ0KHByb3AsIHZhbHVlLCB0eXBlLCBwcm9wZXJ0eUVkaXRvckNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBvdmFsICE9IG51bGwgKQorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShiZWFuLCBuZXcgT2JqZWN0W10geyBvdmFsIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlnbm9yZU1ldGhvZE5GICYmIChtZXRob2QgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmJlYW5zLm5vcHJvcGVydHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuLmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYmVhbnMubm9tZXRob2Quc2V0cHJvcGVydHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIF9fZW5kIGludHJvc3BlY3RoZWxwZXJNZXRob2QKKyAgICAKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBmdW5jdGlvbnMgdG8gY29udmVydCBidWlsdGluIEphdmEgZGF0YSB0eXBlcyB0byBzdHJpbmcuCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gX19iZWdpbiB0b1N0cmluZ01ldGhvZAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKE9iamVjdCBvKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhieXRlIGIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCeXRlKGIpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoYm9vbGVhbiBiKSB7CisgICAgICAgIHJldHVybiBuZXcgQm9vbGVhbihiKS50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKHNob3J0IHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaG9ydChzKS50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGludCBpKSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihpKS50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGZsb2F0IGYpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChmKS50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGxvbmcgbCkgeworICAgICAgICByZXR1cm4gbmV3IExvbmcobCkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhkb3VibGUgZCkgeworICAgICAgICByZXR1cm4gbmV3IERvdWJsZShkKS50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGNoYXIgYykgeworICAgICAgICByZXR1cm4gbmV3IENoYXJhY3RlcihjKS50b1N0cmluZygpOworICAgIH0KKyAgICAvLyBfX2VuZCB0b1N0cmluZ01ldGhvZAorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB0eXBlZCBhcnJheS4KKyAgICAgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHBhcmFtcyBhcmUgcGFzc2VkIHRocm91Z2gKKyAgICAgKiB0aGUgcmVxdWVzdCBhbmQgdGhlIHByb3BlcnR5IGlzIGluZGV4ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVR5cGVkQXJyYXkoU3RyaW5nIHByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYmVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHByb3BlcnR5RWRpdG9yQ2xhc3MpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eUVkaXRvckNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBPYmplY3RbXSB0bXB2YWwgPSBuZXcgSW50ZWdlclt2YWx1ZXMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcHZhbFtpXSA9IGdldFZhbHVlRnJvbUJlYW5JbmZvUHJvcGVydHlFZGl0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwgcHJvcGVydHlOYW1lLCB2YWx1ZXNbaV0sIHByb3BlcnR5RWRpdG9yQ2xhc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlIChiZWFuLCBuZXcgT2JqZWN0W10ge3RtcHZhbH0pOworICAgICAgICAgICAgfSBlbHNlIGlmICh0LmVxdWFscyhJbnRlZ2VyLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIEludGVnZXIgW110bXB2YWwgPSBuZXcgSW50ZWdlclt2YWx1ZXMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHRtcHZhbFtpXSA9ICBuZXcgSW50ZWdlciAodmFsdWVzW2ldKTsKKyAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlIChiZWFuLCBuZXcgT2JqZWN0W10ge3RtcHZhbH0pOworICAgICAgICAgICAgfSBlbHNlIGlmICh0LmVxdWFscyhCeXRlLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIEJ5dGVbXSB0bXB2YWwgPSBuZXcgQnl0ZVt2YWx1ZXMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHRtcHZhbFtpXSA9IG5ldyBCeXRlICh2YWx1ZXNbaV0pOworICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2UgKGJlYW4sIG5ldyBPYmplY3RbXSB7dG1wdmFsfSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHQuZXF1YWxzKEJvb2xlYW4uY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgQm9vbGVhbltdIHRtcHZhbCA9IG5ldyBCb29sZWFuW3ZhbHVlcy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgdG1wdmFsW2ldID0gbmV3IEJvb2xlYW4gKHZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZSAoYmVhbiwgbmV3IE9iamVjdFtdIHt0bXB2YWx9KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodC5lcXVhbHMoU2hvcnQuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgU2hvcnRbXSB0bXB2YWwgPSBuZXcgU2hvcnRbdmFsdWVzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB0bXB2YWxbaV0gPSBuZXcgU2hvcnQgKHZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZSAoYmVhbiwgbmV3IE9iamVjdFtdIHt0bXB2YWx9KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodC5lcXVhbHMoTG9uZy5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBMb25nW10gdG1wdmFsID0gbmV3IExvbmdbdmFsdWVzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB0bXB2YWxbaV0gPSBuZXcgTG9uZyAodmFsdWVzW2ldKTsKKyAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlIChiZWFuLCBuZXcgT2JqZWN0W10ge3RtcHZhbH0pOworICAgICAgICAgICAgfSBlbHNlIGlmICh0LmVxdWFscyhEb3VibGUuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgRG91YmxlW10gdG1wdmFsID0gbmV3IERvdWJsZVt2YWx1ZXMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHRtcHZhbFtpXSA9IG5ldyBEb3VibGUgKHZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZSAoYmVhbiwgbmV3IE9iamVjdFtdIHt0bXB2YWx9KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodC5lcXVhbHMoRmxvYXQuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgRmxvYXRbXSB0bXB2YWwgPSBuZXcgRmxvYXRbdmFsdWVzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB0bXB2YWxbaV0gPSBuZXcgRmxvYXQgKHZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZSAoYmVhbiwgbmV3IE9iamVjdFtdIHt0bXB2YWx9KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodC5lcXVhbHMoQ2hhcmFjdGVyLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIENoYXJhY3RlcltdIHRtcHZhbCA9IG5ldyBDaGFyYWN0ZXJbdmFsdWVzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB0bXB2YWxbaV0gPSBuZXcgQ2hhcmFjdGVyKHZhbHVlc1tpXS5jaGFyQXQoMCkpOworICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2UgKGJlYW4sIG5ldyBPYmplY3RbXSB7dG1wdmFsfSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHQuZXF1YWxzKGludC5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBpbnQgW110bXB2YWwgPSBuZXcgaW50W3ZhbHVlcy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgdG1wdmFsW2ldID0gSW50ZWdlci5wYXJzZUludCAodmFsdWVzW2ldKTsKKyAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlIChiZWFuLCBuZXcgT2JqZWN0W10ge3RtcHZhbH0pOworICAgICAgICAgICAgfSBlbHNlIGlmICh0LmVxdWFscyhieXRlLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIGJ5dGVbXSB0bXB2YWwgPSBuZXcgYnl0ZVt2YWx1ZXMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHRtcHZhbFtpXSA9IEJ5dGUucGFyc2VCeXRlICh2YWx1ZXNbaV0pOworICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2UgKGJlYW4sIG5ldyBPYmplY3RbXSB7dG1wdmFsfSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHQuZXF1YWxzKGJvb2xlYW4uY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbltdIHRtcHZhbCA9IG5ldyBib29sZWFuW3ZhbHVlcy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgdG1wdmFsW2ldID0gKEJvb2xlYW4udmFsdWVPZih2YWx1ZXNbaV0pKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlIChiZWFuLCBuZXcgT2JqZWN0W10ge3RtcHZhbH0pOworICAgICAgICAgICAgfSBlbHNlIGlmICh0LmVxdWFscyhzaG9ydC5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBzaG9ydFtdIHRtcHZhbCA9IG5ldyBzaG9ydFt2YWx1ZXMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHRtcHZhbFtpXSA9IFNob3J0LnBhcnNlU2hvcnQgKHZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZSAoYmVhbiwgbmV3IE9iamVjdFtdIHt0bXB2YWx9KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodC5lcXVhbHMobG9uZy5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBsb25nW10gdG1wdmFsID0gbmV3IGxvbmdbdmFsdWVzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB0bXB2YWxbaV0gPSBMb25nLnBhcnNlTG9uZyAodmFsdWVzW2ldKTsKKyAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlIChiZWFuLCBuZXcgT2JqZWN0W10ge3RtcHZhbH0pOworICAgICAgICAgICAgfSBlbHNlIGlmICh0LmVxdWFscyhkb3VibGUuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgZG91YmxlW10gdG1wdmFsID0gbmV3IGRvdWJsZVt2YWx1ZXMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHRtcHZhbFtpXSA9IERvdWJsZS52YWx1ZU9mKHZhbHVlc1tpXSkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlIChiZWFuLCBuZXcgT2JqZWN0W10ge3RtcHZhbH0pOworICAgICAgICAgICAgfSBlbHNlIGlmICh0LmVxdWFscyhmbG9hdC5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBmbG9hdFtdIHRtcHZhbCA9IG5ldyBmbG9hdFt2YWx1ZXMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHRtcHZhbFtpXSA9IEZsb2F0LnZhbHVlT2YodmFsdWVzW2ldKS5mbG9hdFZhbHVlKCk7CisgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZSAoYmVhbiwgbmV3IE9iamVjdFtdIHt0bXB2YWx9KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodC5lcXVhbHMoY2hhci5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBjaGFyW10gdG1wdmFsID0gbmV3IGNoYXJbdmFsdWVzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB0bXB2YWxbaV0gPSB2YWx1ZXNbaV0uY2hhckF0KDApOworICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2UgKGJlYW4sIG5ldyBPYmplY3RbXSB7dG1wdmFsfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIE9iamVjdFtdIHRtcHZhbCA9IG5ldyBJbnRlZ2VyW3ZhbHVlcy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTx2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wdmFsW2ldID0gIAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWVGcm9tUHJvcGVydHlFZGl0b3JNYW5hZ2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LCBwcm9wZXJ0eU5hbWUsIHZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2UgKGJlYW4sIG5ldyBPYmplY3RbXSB7dG1wdmFsfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbiAoImVycm9yIGluIGludm9raW5nIG1ldGhvZCIsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVzY2FwZSBzcGVjaWFsIHNoZWxsIGNoYXJhY3RlcnMuCisgICAgICogQHBhcmFtIHVuZXNjU3RyaW5nIFRoZSBzdHJpbmcgdG8gc2hlbGwtZXNjYXBlCisgICAgICogQHJldHVybiBUaGUgZXNjYXBlZCBzaGVsbCBzdHJpbmcuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGVRdWVyeVN0cmluZyhTdHJpbmcgdW5lc2NTdHJpbmcpIHsKKyAgICBpZiAoIHVuZXNjU3RyaW5nID09IG51bGwgKQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgIAorICAgIFN0cmluZyBlc2NTdHJpbmcgICAgPSAiIjsKKyAgICBTdHJpbmcgc2hlbGxTcENoYXJzID0gIiY7YCdcInwqP348Pl4oKVtde30kXFxcbiI7CisgICAKKyAgICBmb3IoaW50IGluZGV4PTA7IGluZGV4PHVuZXNjU3RyaW5nLmxlbmd0aCgpOyBpbmRleCsrKSB7CisgICAgICAgIGNoYXIgbmV4dENoYXIgPSB1bmVzY1N0cmluZy5jaGFyQXQoaW5kZXgpOworCisgICAgICAgIGlmKCBzaGVsbFNwQ2hhcnMuaW5kZXhPZihuZXh0Q2hhcikgIT0gLTEgKQorICAgICAgICBlc2NTdHJpbmcgKz0gIlxcIjsKKworICAgICAgICBlc2NTdHJpbmcgKz0gbmV4dENoYXI7CisgICAgfQorICAgIHJldHVybiBlc2NTdHJpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlIGFuIFVSTCBmb3JtYXR0ZWQgc3RyaW5nLgorICAgICAqIEBwYXJhbSBlbmNvZGVkIFRoZSBzdHJpbmcgdG8gZGVjb2RlLgorICAgICAqIEByZXR1cm4gVGhlIGRlY29kZWQgc3RyaW5nLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBlbmNvZGVkKSB7CisgICAgICAgIC8vIHNwZWVkaWx5IGxlYXZlIGlmIHdlJ3JlIG5vdCBuZWVkZWQKKyAgICBpZiAoZW5jb2RlZCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGVuY29kZWQuaW5kZXhPZignJScpID09IC0xICYmIGVuY29kZWQuaW5kZXhPZignKycpID09IC0xKQorICAgICAgICByZXR1cm4gZW5jb2RlZDsKKworICAgIC8vYWxsb2NhdGUgdGhlIGJ1ZmZlciAtIHVzZSBieXRlW10gdG8gYXZvaWQgY2FsbHMgdG8gbmV3LgorICAgICAgICBieXRlIGhvbGRidWZmZXJbXSA9IG5ldyBieXRlW2VuY29kZWQubGVuZ3RoKCldOworCisgICAgICAgIGludCBidWZjb3VudCA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IGVuY29kZWQubGVuZ3RoKCk7IGNvdW50KyspIHsKKyAgICAgICAgY2hhciBjdXIgPSBlbmNvZGVkLmNoYXJBdChjb3VudCk7CisgICAgICAgICAgICBpZiAoY3VyID09ICclJykgeworICAgICAgICAgICAgaG9sZGJ1ZmZlcltidWZjb3VudCsrXSA9CisgICAgICAgICAgKGJ5dGUpSW50ZWdlci5wYXJzZUludChlbmNvZGVkLnN1YnN0cmluZyhjb3VudCsxLGNvdW50KzMpLDE2KTsKKyAgICAgICAgICAgICAgICBpZiAoY291bnQgKyAyID49IGVuY29kZWQubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gZW5jb2RlZC5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGN1ciA9PSAnKycpIHsKKyAgICAgICAgaG9sZGJ1ZmZlcltidWZjb3VudCsrXSA9IChieXRlKSAnICc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBob2xkYnVmZmVyW2J1ZmNvdW50KytdID0gKGJ5dGUpIGN1cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBSRVZJU0lUIC0tIHJlbWVkeSBmb3IgRGVwcmVjYXRlZCB3YXJuaW5nLgorICAgIC8vcmV0dXJuIG5ldyBTdHJpbmcoaG9sZGJ1ZmZlciwwLDAsYnVmY291bnQpOworICAgIHJldHVybiBuZXcgU3RyaW5nKGhvbGRidWZmZXIsMCxidWZjb3VudCk7CisgICAgfQorCisgICAgLy8gX19iZWdpbiBsb29rdXBSZWFkTWV0aG9kTWV0aG9kCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaGFuZGxlR2V0UHJvcGVydHkoT2JqZWN0IG8sIFN0cmluZyBwcm9wKQorICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBpZiAobyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmJlYW5zLm51bGxiZWFuIikpOworICAgICAgICB9CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZ2V0UmVhZE1ldGhvZChvLmdldENsYXNzKCksIHByb3ApOworICAgICAgICAgICAgdmFsdWUgPSBtZXRob2QuaW52b2tlKG8sIG51bGwpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24gKGV4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIC8vIF9fZW5kIGxvb2t1cFJlYWRNZXRob2RNZXRob2QKKworICAgIC8vIGhhbmRsZXMgPGpzcDpzZXRQcm9wZXJ0eT4gd2l0aCBFTCBleHByZXNzaW9uIGZvciAndmFsdWUnIGF0dHJpYnV0ZQorLyoqIFVzZSBwcm9wcmlldGFyeUV2YWx1YXRlCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZVNldFByb3BlcnR5RXhwcmVzc2lvbihPYmplY3QgYmVhbiwKKyAgICAgICAgU3RyaW5nIHByb3AsIFN0cmluZyBleHByZXNzaW9uLCBQYWdlQ29udGV4dCBwYWdlQ29udGV4dCwKKyAgICAgICAgVmFyaWFibGVSZXNvbHZlciB2YXJpYWJsZVJlc29sdmVyLCBGdW5jdGlvbk1hcHBlciBmdW5jdGlvbk1hcHBlciApCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZ2V0V3JpdGVNZXRob2QoYmVhbi5nZXRDbGFzcygpLCBwcm9wKTsKKyAgICAgICAgICAgIG1ldGhvZC5pbnZva2UoYmVhbiwgbmV3IE9iamVjdFtdIHsgCisgICAgICAgICAgICAgICAgcGFnZUNvbnRleHQuZ2V0RXhwcmVzc2lvbkV2YWx1YXRvcigpLmV2YWx1YXRlKAorICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKVswXSwKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVSZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25NYXBwZXIsCisgICAgICAgICAgICAgICAgICAgIG51bGwgKQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisqKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlU2V0UHJvcGVydHlFeHByZXNzaW9uKE9iamVjdCBiZWFuLAorICAgICAgICBTdHJpbmcgcHJvcCwgU3RyaW5nIGV4cHJlc3Npb24sIFBhZ2VDb250ZXh0IHBhZ2VDb250ZXh0LAorICAgICAgICBQcm90ZWN0ZWRGdW5jdGlvbk1hcHBlciBmdW5jdGlvbk1hcHBlciApCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZ2V0V3JpdGVNZXRob2QoYmVhbi5nZXRDbGFzcygpLCBwcm9wKTsKKyAgICAgICAgICAgIG1ldGhvZC5pbnZva2UoYmVhbiwgbmV3IE9iamVjdFtdIHsKKyAgICAgICAgICAgICAgICBQYWdlQ29udGV4dEltcGwucHJvcHJpZXRhcnlFdmFsdWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKClbMF0sCisgICAgICAgICAgICAgICAgICAgIHBhZ2VDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk1hcHBlciwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UgKQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlU2V0UHJvcGVydHkoT2JqZWN0IGJlYW4sIFN0cmluZyBwcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUpCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZ2V0V3JpdGVNZXRob2QoYmVhbi5nZXRDbGFzcygpLCBwcm9wKTsKKyAgICAgICAgICAgIG1ldGhvZC5pbnZva2UoYmVhbiwgbmV3IE9iamVjdFtdIHsgdmFsdWUgfSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZVNldFByb3BlcnR5KE9iamVjdCBiZWFuLCBTdHJpbmcgcHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGdldFdyaXRlTWV0aG9kKGJlYW4uZ2V0Q2xhc3MoKSwgcHJvcCk7CisgICAgICAgICAgICBtZXRob2QuaW52b2tlKGJlYW4sIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKHZhbHVlKSB9KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVTZXRQcm9wZXJ0eShPYmplY3QgYmVhbiwgU3RyaW5nIHByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHZhbHVlKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGdldFdyaXRlTWV0aG9kKGJlYW4uZ2V0Q2xhc3MoKSwgcHJvcCk7CisgICAgICAgICAgICBtZXRob2QuaW52b2tlKGJlYW4sIG5ldyBPYmplY3RbXSB7IG5ldyBTaG9ydCh2YWx1ZSkgfSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlU2V0UHJvcGVydHkoT2JqZWN0IGJlYW4sIFN0cmluZyBwcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHZhbHVlKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGdldFdyaXRlTWV0aG9kKGJlYW4uZ2V0Q2xhc3MoKSwgcHJvcCk7CisgICAgICAgICAgICBtZXRob2QuaW52b2tlKGJlYW4sIG5ldyBPYmplY3RbXSB7IG5ldyBMb25nKHZhbHVlKSB9KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfSAKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlU2V0UHJvcGVydHkoT2JqZWN0IGJlYW4sIFN0cmluZyBwcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUpCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZ2V0V3JpdGVNZXRob2QoYmVhbi5nZXRDbGFzcygpLCBwcm9wKTsKKyAgICAgICAgICAgIG1ldGhvZC5pbnZva2UoYmVhbiwgbmV3IE9iamVjdFtdIHsgbmV3IERvdWJsZSh2YWx1ZSkgfSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlU2V0UHJvcGVydHkoT2JqZWN0IGJlYW4sIFN0cmluZyBwcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWx1ZSkKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBnZXRXcml0ZU1ldGhvZChiZWFuLmdldENsYXNzKCksIHByb3ApOworICAgICAgICAgICAgbWV0aG9kLmludm9rZShiZWFuLCBuZXcgT2JqZWN0W10geyBuZXcgRmxvYXQodmFsdWUpIH0pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oZXgpOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZVNldFByb3BlcnR5KE9iamVjdCBiZWFuLCBTdHJpbmcgcHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB2YWx1ZSkKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBnZXRXcml0ZU1ldGhvZChiZWFuLmdldENsYXNzKCksIHByb3ApOworICAgICAgICAgICAgbWV0aG9kLmludm9rZShiZWFuLCBuZXcgT2JqZWN0W10geyBuZXcgQ2hhcmFjdGVyKHZhbHVlKSB9KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZVNldFByb3BlcnR5KE9iamVjdCBiZWFuLCBTdHJpbmcgcHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSB2YWx1ZSkKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBnZXRXcml0ZU1ldGhvZChiZWFuLmdldENsYXNzKCksIHByb3ApOworICAgICAgICAgICAgbWV0aG9kLmludm9rZShiZWFuLCBuZXcgT2JqZWN0W10geyBuZXcgQnl0ZSh2YWx1ZSkgfSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlU2V0UHJvcGVydHkoT2JqZWN0IGJlYW4sIFN0cmluZyBwcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHZhbHVlKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGdldFdyaXRlTWV0aG9kKGJlYW4uZ2V0Q2xhc3MoKSwgcHJvcCk7CisgICAgICAgICAgICBtZXRob2QuaW52b2tlKGJlYW4sIG5ldyBPYmplY3RbXSB7IG5ldyBCb29sZWFuKHZhbHVlKSB9KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldFdyaXRlTWV0aG9kKENsYXNzIGJlYW5DbGFzcywgU3RyaW5nIHByb3ApCisgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIE1ldGhvZCBtZXRob2QgPSBudWxsOyAgICAgICAgCisgICAgICAgIENsYXNzIHR5cGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgamF2YS5iZWFucy5CZWFuSW5mbyBpbmZvCisgICAgICAgICAgICAgICAgPSBqYXZhLmJlYW5zLkludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhiZWFuQ2xhc3MpOworICAgICAgICAgICAgaWYgKCBpbmZvICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3IgcGRbXQorICAgICAgICAgICAgICAgICAgICA9IGluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHBkLmxlbmd0aCA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHBkW2ldLmdldE5hbWUoKS5lcXVhbHMocHJvcCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBwZFtpXS5nZXRXcml0ZU1ldGhvZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAgID0gcGRbaV0uZ2V0UHJvcGVydHlUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBqdXN0IGluIGNhc2UgaW50cm9zcGVjdGlvbiBzaWxlbnRseSBmYWlscy4KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmJlYW5zLm5vYmVhbmluZm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuQ2xhc3MuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbiAoZXgpOworICAgICAgICB9CisgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmJlYW5zLm5vcHJvcGVydHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW5DbGFzcy5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5iZWFucy5ub21ldGhvZC5zZXRwcm9wZXJ0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuQ2xhc3MuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ldGhvZDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRSZWFkTWV0aG9kKENsYXNzIGJlYW5DbGFzcywgU3RyaW5nIHByb3ApCisgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBNZXRob2QgbWV0aG9kID0gbnVsbDsgICAgICAgIAorICAgICAgICBDbGFzcyB0eXBlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGphdmEuYmVhbnMuQmVhbkluZm8gaW5mbworICAgICAgICAgICAgICAgID0gamF2YS5iZWFucy5JbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oYmVhbkNsYXNzKTsKKyAgICAgICAgICAgIGlmICggaW5mbyAhPSBudWxsICkgeworICAgICAgICAgICAgICAgIGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yIHBkW10KKyAgICAgICAgICAgICAgICAgICAgPSBpbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBwZC5sZW5ndGggOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwZFtpXS5nZXROYW1lKCkuZXF1YWxzKHByb3ApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gcGRbaV0uZ2V0UmVhZE1ldGhvZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAgID0gcGRbaV0uZ2V0UHJvcGVydHlUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBqdXN0IGluIGNhc2UgaW50cm9zcGVjdGlvbiBzaWxlbnRseSBmYWlscy4KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmJlYW5zLm5vYmVhbmluZm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuQ2xhc3MuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbiAoZXgpOworICAgICAgICB9CisgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYmVhbnMubm9wcm9wZXJ0eSIsIHByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW5DbGFzcy5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5iZWFucy5ub21ldGhvZCIsIHByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW5DbGFzcy5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgfQorCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBQcm9wZXJ0eUVkaXRvciBTdXBwb3J0CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRWYWx1ZUZyb21CZWFuSW5mb1Byb3BlcnR5RWRpdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYXR0ckNsYXNzLCBTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBhdHRyVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBwcm9wZXJ0eUVkaXRvckNsYXNzKSAKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiAKKyAgICB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcm9wZXJ0eUVkaXRvciBwZSA9IChQcm9wZXJ0eUVkaXRvcilwcm9wZXJ0eUVkaXRvckNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBwZS5zZXRBc1RleHQoYXR0clZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBwZS5nZXRWYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5iZWFucy5wcm9wZXJ0eS5jb252ZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyVmFsdWUsIGF0dHJDbGFzcy5nZXROYW1lKCksIGF0dHJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4LmdldE1lc3NhZ2UoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VmFsdWVGcm9tUHJvcGVydHlFZGl0b3JNYW5hZ2VyKAorICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYXR0ckNsYXNzLCBTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBhdHRyVmFsdWUpIAorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIAorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByb3BlcnR5RWRpdG9yIHByb3BFZGl0b3IgPSAKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eUVkaXRvck1hbmFnZXIuZmluZEVkaXRvcihhdHRyQ2xhc3MpOworICAgICAgICAgICAgaWYgKHByb3BFZGl0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb3BFZGl0b3Iuc2V0QXNUZXh0KGF0dHJWYWx1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BFZGl0b3IuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5iZWFucy5wcm9wZXJ0eWVkaXRvci5ub3RyZWdpc3RlcmVkIikpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5iZWFucy5wcm9wZXJ0eS5jb252ZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyVmFsdWUsIGF0dHJDbGFzcy5nZXROYW1lKCksIGF0dHJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4LmdldE1lc3NhZ2UoKSkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBHZW5lcmFsIFB1cnBvc2UgUnVudGltZSBNZXRob2RzCisgICAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBwb3NzaWJseSByZWxhdGl2ZSByZXNvdXJjZSBwYXRoIGludG8gYSBjb250ZXh0LXJlbGF0aXZlCisgICAgICogcmVzb3VyY2UgcGF0aCB0aGF0IHN0YXJ0cyB3aXRoIGEgJy8nLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZWxhdGl2ZVBhdGggVGhlIHBvc3NpYmx5IHJlbGF0aXZlIHJlc291cmNlIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb250ZXh0UmVsYXRpdmVQYXRoKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisKKyAgICAgICAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCIvIikpCisgICAgICAgICAgICByZXR1cm4gKHJlbGF0aXZlUGF0aCk7CisgICAgICAgIGlmICghKHJlcXVlc3QgaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlcXVlc3QpKQorICAgICAgICAgICAgcmV0dXJuIChyZWxhdGl2ZVBhdGgpOworICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgaHJlcXVlc3QgPSAoSHR0cFNlcnZsZXRSZXF1ZXN0KSByZXF1ZXN0OworICAgICAgICBTdHJpbmcgdXJpID0gKFN0cmluZykKKyAgICAgICAgICAgIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmluY2x1ZGUuc2VydmxldF9wYXRoIik7CisgICAgICAgIGlmICh1cmkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHBhdGhJbmZvID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5pbmNsdWRlLnBhdGhfaW5mbyIpOworICAgICAgICAgICAgaWYgKHBhdGhJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAodXJpLmxhc3RJbmRleE9mKCcvJykgPj0gMCkgCisgICAgICAgICAgICAgICAgICAgIHVyaSA9IHVyaS5zdWJzdHJpbmcoMCwgdXJpLmxhc3RJbmRleE9mKCcvJykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdXJpID0gaHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKTsKKyAgICAgICAgICAgIGlmICh1cmkubGFzdEluZGV4T2YoJy8nKSA+PSAwKSAKKyAgICAgICAgICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKDAsIHVyaS5sYXN0SW5kZXhPZignLycpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXJpICsgJy8nICsgcmVsYXRpdmVQYXRoOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGEgUmVxdWVzdERpc3BhdGNoZXIuaW5jbHVkZSgpIG9wZXJhdGlvbiwgd2l0aCBvcHRpb25hbCBmbHVzaGluZworICAgICAqIG9mIHRoZSByZXNwb25zZSBiZWZvcmVoYW5kLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZWxhdGl2ZVBhdGggVGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHJlc291cmNlIHRvIGJlIGluY2x1ZGVkCisgICAgICogQHBhcmFtIG91dCBUaGUgV3JpdGVyIHRvIHdob20gd2UgYXJlIGN1cnJlbnRseSB3cml0aW5nCisgICAgICogQHBhcmFtIGZsdXNoIFNob3VsZCB3ZSBmbHVzaCBiZWZvcmUgdGhlIGluY2x1ZGUgaXMgcHJvY2Vzc2VkPworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aHJvd24gYnkgdGhlIGluY2x1ZGVkIHNlcnZsZXQKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgdGhyb3duIGJ5IHRoZSBpbmNsdWRlZCBzZXJ2bGV0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluY2x1ZGUoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc3BXcml0ZXIgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmx1c2gpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGZsdXNoICYmICEob3V0IGluc3RhbmNlb2YgQm9keUNvbnRlbnQpKQorICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisKKyAgICAgICAgLy8gRklYTUUgLSBJdCBpcyB0ZW1wdGluZyB0byB1c2UgcmVxdWVzdC5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigpIHRvCisgICAgICAgIC8vIHJlc29sdmUgYSByZWxhdGl2ZSBwYXRoIGRpcmVjdGx5LCBidXQgQ2F0YWxpbmEgY3VycmVudGx5IGRvZXMgbm90CisgICAgICAgIC8vIHRha2UgaW50byBhY2NvdW50IHdoZXRoZXIgdGhlIGNhbGxlciBpcyBpbnNpZGUgYSBSZXF1ZXN0RGlzcGF0Y2hlcgorICAgICAgICAvLyBpbmNsdWRlIG9yIG5vdC4gIFdoZXRoZXIgQ2F0YWxpbmEgKnNob3VsZCogdGFrZSB0aGF0IGludG8gYWNjb3VudAorICAgICAgICAvLyBpcyBhIHNwZWMgaXNzdWUgY3VycmVudGx5IHVuZGVyIHJldmlldy4gIEluIHRoZSBtZWFuIHRpbWUsCisgICAgICAgIC8vIHJlcGxpY2F0ZSBKYXNwZXIncyBwcmV2aW91cyBiZWhhdmlvcgorCisgICAgICAgIFN0cmluZyByZXNvdXJjZVBhdGggPSBnZXRDb250ZXh0UmVsYXRpdmVQYXRoKHJlcXVlc3QsIHJlbGF0aXZlUGF0aCk7CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0gcmVxdWVzdC5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihyZXNvdXJjZVBhdGgpOworCisgICAgICAgIHJkLmluY2x1ZGUocmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICBuZXcgU2VydmxldFJlc3BvbnNlV3JhcHBlckluY2x1ZGUocmVzcG9uc2UsIG91dCkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogVVJMIGVuY29kZXMgYSBzdHJpbmcsIGJhc2VkIG9uIHRoZSBzdXBwbGllZCBjaGFyYWN0ZXIgZW5jb2RpbmcuCisgICAgICogVGhpcyBwZXJmb3JtcyB0aGUgc2FtZSBmdW5jdGlvbiBhcyBqYXZhLm5leHQuVVJMRW5jb2RlLmVuY29kZQorICAgICAqIGluIEoyU0RLMS40LCBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgaWYgdGhlIG9ubHkgcGxhdGZvcm0gc3VwcG9ydGVkCisgICAgICogaXMgMS40IG9yIGhpZ2hlci4KKyAgICAgKiBAcGFyYW0gcyBUaGUgU3RyaW5nIHRvIGJlIFVSTCBlbmNvZGVkLgorICAgICAqIEBwYXJhbSBlbmMgVGhlIGNoYXJhY3RlciBlbmNvZGluZyAKKyAgICAgKiBAcmV0dXJuIFRoZSBVUkwgZW5jb2RlZCBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVUkxFbmNvZGUoU3RyaW5nIHMsIFN0cmluZyBlbmMpIHsKKworICAgICAgICBpZiAocyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gIm51bGwiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuYyA9PSBudWxsKSB7CisgICAgICAgICAgICBlbmMgPSAiSVNPLTg4NTktMSI7ICAgICAgICAvLyBUaGUgZGVmYXVsdCByZXF1ZXN0IGVuY29kaW5nIAorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIG91dCA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihidWYsIGVuYyk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IGVuY29kaW5nPworICAgICAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihidWYpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgaW50IGMgPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChjID09ICcgJykgeworICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJysnKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNTYWZlQ2hhcihjKSkgeworICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoKGNoYXIpYyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gZXh0ZXJuYWwgZW5jb2RpbmcgYmVmb3JlIGhleCBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGMpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBieXRlW10gYmEgPSBidWYudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJhLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJyUnKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydGluZyBlYWNoIGJ5dGUgaW4gdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKENoYXJhY3Rlci5mb3JEaWdpdCgoYmFbal0+PjQpICYgMHhmLCAxNikpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKENoYXJhY3Rlci5mb3JEaWdpdChiYVtqXSAmIDB4ZiwgMTYpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmLnJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG91dC50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTYWZlQ2hhcihpbnQgYykgeworICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA9PSAnLScgfHwgYyA9PSAnXycgfHwgYyA9PSAnLicgfHwgYyA9PSAnIScgfHwKKyAgICAgICAgICAgIGMgPT0gJ34nIHx8IGMgPT0gJyonIHx8IGMgPT0gJ1wnJyB8fCBjID09ICcoJyB8fCBjID09ICcpJykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0pzcFNvdXJjZURlcGVuZGVudC5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0pzcFNvdXJjZURlcGVuZGVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYTkzNjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwU291cmNlRGVwZW5kZW50LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZTsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHRyYWNraW5nIHRoZSBzb3VyY2UgZmlsZXMgZGVwZW5kZW5jaWVzLCBmb3IgdGhlIHB1cnBvc2UKKyAqIG9mIGNvbXBpbGluZyBvdXQgb2YgZGF0ZSBwYWdlcy4gIFRoaXMgaXMgdXNlZCBmb3IKKyAqIDEpIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IHBhZ2UgZGlyZWN0aXZlcworICogMikgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgaW5jbHVkZS1wcmVsdWRlIGFuZCBpbmNsdWRlLWNvZGEgaW4ganNwOmNvbmZpZworICogMykgZmlsZXMgdGhhdCBhcmUgdGFnIGZpbGVzIGFuZCByZWZlcmVuY2VkCisgKiA0KSBUTERzIHJlZmVyZW5jZWQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIEpzcFNvdXJjZURlcGVuZGVudCB7CisKKyAgIC8qKgorICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZmlsZXMgbmFtZXMgdGhhdCB0aGUgY3VycmVudCBwYWdlIGhhcyBhIHNvdXJjZQorICAgICogZGVwZW5kZW5jeSBvbi4KKyAgICAqLworICAgIC8vIEZJWE1FOiBUeXBlIHVzZWQgaXMgT2JqZWN0IGR1ZSB0byB2ZXJ5IHdlaXJkIGJlaGF2aW9yIAorICAgIC8vIHdpdGggRWNsaXBzZSBKRFQgMy4xIGluIEphdmEgNSBtb2RlCisgICAgcHVibGljIE9iamVjdCBnZXREZXBlbmRhbnRzKCk7CisKK30KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9Kc3BXcml0ZXJJbXBsLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwV3JpdGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmN2E0NDMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwV3JpdGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsNTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5zZWN1cml0eS5TZWN1cml0eVV0aWw7CisKKy8qKgorICogV3JpdGUgdGV4dCB0byBhIGNoYXJhY3Rlci1vdXRwdXQgc3RyZWFtLCBidWZmZXJpbmcgY2hhcmFjdGVycyBzbyBhcworICogdG8gcHJvdmlkZSBmb3IgdGhlIGVmZmljaWVudCB3cml0aW5nIG9mIHNpbmdsZSBjaGFyYWN0ZXJzLCBhcnJheXMsCisgKiBhbmQgc3RyaW5ncy4gCisgKgorICogUHJvdmlkZSBzdXBwb3J0IGZvciBkaXNjYXJkaW5nIGZvciB0aGUgb3V0cHV0IHRoYXQgaGFzIGJlZW4gCisgKiBidWZmZXJlZC4gCisgKiAKKyAqIFRoaXMgbmVlZHMgcmV2aXNpdGluZyB3aGVuIHRoZSBidWZmZXJpbmcgcHJvYmxlbXMgaW4gdGhlIEpTUCBzcGVjCisgKiBhcmUgZml4ZWQgLWFrdiAKKyAqCisgKiBAYXV0aG9yIEFuaWwgSy4gVmlqZW5kcmFuCisgKi8KK3B1YmxpYyBjbGFzcyBKc3BXcml0ZXJJbXBsIGV4dGVuZHMgSnNwV3JpdGVyIHsKKyAgICAKKyAgICBwcml2YXRlIFdyaXRlciBvdXQ7CisgICAgcHJpdmF0ZSBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7ICAgIAorICAgIHByaXZhdGUgY2hhciBjYltdOworICAgIHByaXZhdGUgaW50IG5leHRDaGFyOworICAgIHByaXZhdGUgYm9vbGVhbiBmbHVzaGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworICAgIAorICAgIHB1YmxpYyBKc3BXcml0ZXJJbXBsKCkgeworICAgICAgICBzdXBlciggQ29uc3RhbnRzLkRFRkFVTFRfQlVGRkVSX1NJWkUsIHRydWUgKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgYnVmZmVyZWQgY2hhcmFjdGVyLW91dHB1dCBzdHJlYW0gdGhhdCB1c2VzIGEgZGVmYXVsdC1zaXplZAorICAgICAqIG91dHB1dCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHJlc3BvbnNlICBBIFNlcnZsZXQgUmVzcG9uc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwV3JpdGVySW1wbChTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgdGhpcyhyZXNwb25zZSwgQ29uc3RhbnRzLkRFRkFVTFRfQlVGRkVSX1NJWkUsIHRydWUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgYnVmZmVyZWQgY2hhcmFjdGVyLW91dHB1dCBzdHJlYW0gdGhhdCB1c2VzIGFuIG91dHB1dAorICAgICAqIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gc2l6ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgcmVzcG9uc2UgQSBTZXJ2bGV0IFJlc3BvbnNlCisgICAgICogQHBhcmFtICBzeiAgIAlPdXRwdXQtYnVmZmVyIHNpemUsIGEgcG9zaXRpdmUgaW50ZWdlcgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiBzeiBpcyA8PSAwCisgICAgICovCisgICAgcHVibGljIEpzcFdyaXRlckltcGwoU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBpbnQgc3osIAorICAgICAgICAgICAgYm9vbGVhbiBhdXRvRmx1c2gpIHsKKyAgICAgICAgc3VwZXIoc3osIGF1dG9GbHVzaCk7CisgICAgICAgIGlmIChzeiA8IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCdWZmZXIgc2l6ZSA8PSAwIik7CisgICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKyAgICAgICAgY2IgPSBzeiA9PSAwID8gbnVsbCA6IG5ldyBjaGFyW3N6XTsKKyAgICAgICAgbmV4dENoYXIgPSAwOworICAgIH0KKyAgICAKKyAgICB2b2lkIGluaXQoIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgaW50IHN6LCBib29sZWFuIGF1dG9GbHVzaCApIHsKKyAgICAgICAgdGhpcy5yZXNwb25zZT0gcmVzcG9uc2U7CisgICAgICAgIGlmKCBzeiA+IDAgJiYgKCBjYiA9PSBudWxsIHx8IHN6ID4gY2IubGVuZ3RoICkgKQorICAgICAgICAgICAgY2I9bmV3IGNoYXJbc3pdOworICAgICAgICBuZXh0Q2hhciA9IDA7CisgICAgICAgIHRoaXMuYXV0b0ZsdXNoPWF1dG9GbHVzaDsKKyAgICAgICAgdGhpcy5idWZmZXJTaXplPXN6OworICAgIH0KKyAgICAKKyAgICAvKiogUGFja2FnZS1sZXZlbCBhY2Nlc3MKKyAgICAgKi8KKyAgICB2b2lkIHJlY3ljbGUoKSB7CisgICAgICAgIGZsdXNoZWQgPSBmYWxzZTsKKyAgICAgICAgY2xvc2VkID0gZmFsc2U7CisgICAgICAgIG91dCA9IG51bGw7CisgICAgICAgIG5leHRDaGFyID0gMDsKKyAgICAgICAgcmVzcG9uc2UgPSBudWxsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgdW5kZXJseWluZyBjaGFyYWN0ZXIgc3RyZWFtLCB3aXRob3V0CisgICAgICogZmx1c2hpbmcgdGhlIHN0cmVhbSBpdHNlbGYuICBUaGlzIG1ldGhvZCBpcyBub24tcHJpdmF0ZSBvbmx5IHNvIHRoYXQgaXQKKyAgICAgKiBtYXkgYmUgaW52b2tlZCBieSBQcmludFN0cmVhbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBmbHVzaEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChidWZmZXJTaXplID09IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGZsdXNoZWQgPSB0cnVlOworICAgICAgICBlbnN1cmVPcGVuKCk7CisgICAgICAgIGlmIChuZXh0Q2hhciA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpbml0T3V0KCk7CisgICAgICAgIG91dC53cml0ZShjYiwgMCwgbmV4dENoYXIpOworICAgICAgICBuZXh0Q2hhciA9IDA7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBpbml0T3V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG91dCA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXQgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyBnZXRMb2NhbGl6ZU1lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpeworICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpeworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKXsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTG9jYWxpemVyLmdldE1lc3NhZ2UobWVzc2FnZSk7IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIExvY2FsaXplci5nZXRNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIERpc2NhcmQgdGhlIG91dHB1dCBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgY2xlYXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoKGJ1ZmZlclNpemUgPT0gMCkgJiYgKG91dCAhPSBudWxsKSkKKyAgICAgICAgICAgIC8vIGNsZWFyKCkgaXMgaWxsZWdhbCBhZnRlciBhbnkgdW5idWZmZXJlZCBvdXRwdXQgKEpTUC41LjUpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBnZXRMb2NhbGl6ZU1lc3NhZ2UoImpzcC5lcnJvci5pc2Vfb25fY2xlYXIiKSk7CisgICAgICAgIGlmIChmbHVzaGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBnZXRMb2NhbGl6ZU1lc3NhZ2UoImpzcC5lcnJvci5hdHRlbXB0X3RvX2NsZWFyX2ZsdXNoZWRfYnVmZmVyIikpOworICAgICAgICBlbnN1cmVPcGVuKCk7CisgICAgICAgIG5leHRDaGFyID0gMDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgY2xlYXJCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoYnVmZmVyU2l6ZSA9PSAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYWxpemVNZXNzYWdlKCJqc3AuZXJyb3IuaXNlX29uX2NsZWFyIikpOworICAgICAgICBlbnN1cmVPcGVuKCk7CisgICAgICAgIG5leHRDaGFyID0gMDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGJ1ZmZlck92ZXJmbG93KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGdldExvY2FsaXplTWVzc2FnZSgianNwLmVycm9yLm92ZXJmbG93IikpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgc3RyZWFtLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmx1c2goKSAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgc3RyZWFtLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCB8fCBjbG9zZWQpCisgICAgICAgICAgICAvLyBtdWx0aXBsZSBjYWxscyB0byBjbG9zZSBpcyBPSworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBmbHVzaCgpOworICAgICAgICBpZiAob3V0ICE9IG51bGwpCisgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgb3V0ID0gbnVsbDsKKyAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVudXNlZCBpbiB0aGUgYnVmZmVyCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZW1haW5pbmcoKSB7CisgICAgICAgIHJldHVybiBidWZmZXJTaXplIC0gbmV4dENoYXI7CisgICAgfQorICAgIAorICAgIC8qKiBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc3RyZWFtIGhhcyBub3QgYmVlbiBjbG9zZWQgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlT3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsIHx8IGNsb3NlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIGNsb3NlZCIpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGVuc3VyZU9wZW4oKTsKKyAgICAgICAgaWYgKGJ1ZmZlclNpemUgPT0gMCkgeworICAgICAgICAgICAgaW5pdE91dCgpOworICAgICAgICAgICAgb3V0LndyaXRlKGMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKG5leHRDaGFyID49IGJ1ZmZlclNpemUpCisgICAgICAgICAgICAgICAgaWYgKGF1dG9GbHVzaCkKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck92ZXJmbG93KCk7CisgICAgICAgICAgICBjYltuZXh0Q2hhcisrXSA9IChjaGFyKSBjOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIE91ciBvd24gbGl0dGxlIG1pbiBtZXRob2QsIHRvIGF2b2lkIGxvYWRpbmcgamF2YS5sYW5nLk1hdGggaWYgd2UndmUgcnVuCisgICAgICogb3V0IG9mIGZpbGUgZGVzY3JpcHRvcnMgYW5kIHdlJ3JlIHRyeWluZyB0byBwcmludCBhIHN0YWNrIHRyYWNlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1pbihpbnQgYSwgaW50IGIpIHsKKyAgICAgICAgaWYgKGEgPCBiKSByZXR1cm4gYTsKKyAgICAgICAgcmV0dXJuIGI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFdyaXRlIGEgcG9ydGlvbiBvZiBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogPHA+IE9yZGluYXJpbHkgdGhpcyBtZXRob2Qgc3RvcmVzIGNoYXJhY3RlcnMgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkgaW50bworICAgICAqIHRoaXMgc3RyZWFtJ3MgYnVmZmVyLCBmbHVzaGluZyB0aGUgYnVmZmVyIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBhcworICAgICAqIG5lZWRlZC4gIElmIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoIGlzIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZSBidWZmZXIsCisgICAgICogaG93ZXZlciwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIGZsdXNoIHRoZSBidWZmZXIgYW5kIHdyaXRlIHRoZSBjaGFyYWN0ZXJzCisgICAgICogZGlyZWN0bHkgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLiAgVGh1cyByZWR1bmRhbnQKKyAgICAgKiA8Y29kZT5EaXNjYXJkYWJsZUJ1ZmZlcmVkV3JpdGVyPC9jb2RlPnMgd2lsbCBub3QgY29weSBkYXRhIHVubmVjZXNzYXJpbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGNidWYgIEEgY2hhcmFjdGVyIGFycmF5CisgICAgICogQHBhcmFtICBvZmYgICBPZmZzZXQgZnJvbSB3aGljaCB0byBzdGFydCByZWFkaW5nIGNoYXJhY3RlcnMKKyAgICAgKiBAcGFyYW0gIGxlbiAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoY2hhciBjYnVmW10sIGludCBvZmYsIGludCBsZW4pIAorICAgIHRocm93cyBJT0V4Y2VwdGlvbiAKKyAgICB7CisgICAgICAgIGVuc3VyZU9wZW4oKTsKKyAgICAgICAgCisgICAgICAgIGlmIChidWZmZXJTaXplID09IDApIHsKKyAgICAgICAgICAgIGluaXRPdXQoKTsKKyAgICAgICAgICAgIG91dC53cml0ZShjYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICgob2ZmIDwgMCkgfHwgKG9mZiA+IGNidWYubGVuZ3RoKSB8fCAobGVuIDwgMCkgfHwKKyAgICAgICAgICAgICAgICAoKG9mZiArIGxlbikgPiBjYnVmLmxlbmd0aCkgfHwgKChvZmYgKyBsZW4pIDwgMCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZWxzZSBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSAKKyAgICAgICAgCisgICAgICAgIGlmIChsZW4gPj0gYnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgLyogSWYgdGhlIHJlcXVlc3QgbGVuZ3RoIGV4Y2VlZHMgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIsCisgICAgICAgICAgICAgZmx1c2ggdGhlIGJ1ZmZlciBhbmQgdGhlbiB3cml0ZSB0aGUgZGF0YSBkaXJlY3RseS4gIEluIHRoaXMKKyAgICAgICAgICAgICB3YXkgYnVmZmVyZWQgc3RyZWFtcyB3aWxsIGNhc2NhZGUgaGFybWxlc3NseS4gKi8KKyAgICAgICAgICAgIGlmIChhdXRvRmx1c2gpCisgICAgICAgICAgICAgICAgZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBidWZmZXJPdmVyZmxvdygpOworICAgICAgICAgICAgaW5pdE91dCgpOworICAgICAgICAgICAgb3V0LndyaXRlKGNidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW50IGIgPSBvZmYsIHQgPSBvZmYgKyBsZW47CisgICAgICAgIHdoaWxlIChiIDwgdCkgeworICAgICAgICAgICAgaW50IGQgPSBtaW4oYnVmZmVyU2l6ZSAtIG5leHRDaGFyLCB0IC0gYik7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNidWYsIGIsIGNiLCBuZXh0Q2hhciwgZCk7CisgICAgICAgICAgICBiICs9IGQ7CisgICAgICAgICAgICBuZXh0Q2hhciArPSBkOworICAgICAgICAgICAgaWYgKG5leHRDaGFyID49IGJ1ZmZlclNpemUpIAorICAgICAgICAgICAgICAgIGlmIChhdXRvRmx1c2gpCisgICAgICAgICAgICAgICAgICAgIGZsdXNoQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBidWZmZXJPdmVyZmxvdygpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLiAgVGhpcyBtZXRob2QgY2Fubm90IGJlIGluaGVyaXRlZCBmcm9tIHRoZQorICAgICAqIFdyaXRlciBjbGFzcyBiZWNhdXNlIGl0IG11c3Qgc3VwcHJlc3MgSS9PIGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoY2hhciBidWZbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGUoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogV3JpdGUgYSBwb3J0aW9uIG9mIGEgU3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtICBzICAgICBTdHJpbmcgdG8gYmUgd3JpdHRlbgorICAgICAqIEBwYXJhbSAgb2ZmICAgT2Zmc2V0IGZyb20gd2hpY2ggdG8gc3RhcnQgcmVhZGluZyBjaGFyYWN0ZXJzCisgICAgICogQHBhcmFtICBsZW4gICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHMsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGVuc3VyZU9wZW4oKTsKKyAgICAgICAgaWYgKGJ1ZmZlclNpemUgPT0gMCkgeworICAgICAgICAgICAgaW5pdE91dCgpOworICAgICAgICAgICAgb3V0LndyaXRlKHMsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgYiA9IG9mZiwgdCA9IG9mZiArIGxlbjsKKyAgICAgICAgd2hpbGUgKGIgPCB0KSB7CisgICAgICAgICAgICBpbnQgZCA9IG1pbihidWZmZXJTaXplIC0gbmV4dENoYXIsIHQgLSBiKTsKKyAgICAgICAgICAgIHMuZ2V0Q2hhcnMoYiwgYiArIGQsIGNiLCBuZXh0Q2hhcik7CisgICAgICAgICAgICBiICs9IGQ7CisgICAgICAgICAgICBuZXh0Q2hhciArPSBkOworICAgICAgICAgICAgaWYgKG5leHRDaGFyID49IGJ1ZmZlclNpemUpIAorICAgICAgICAgICAgICAgIGlmIChhdXRvRmx1c2gpCisgICAgICAgICAgICAgICAgICAgIGZsdXNoQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBidWZmZXJPdmVyZmxvdygpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFdyaXRlIGEgc3RyaW5nLiAgVGhpcyBtZXRob2QgY2Fubm90IGJlIGluaGVyaXRlZCBmcm9tIHRoZSBXcml0ZXIgY2xhc3MKKyAgICAgKiBiZWNhdXNlIGl0IG11c3Qgc3VwcHJlc3MgSS9PIGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNpbXBsZSBmaXggZm9yIEJ1Z3ppbGxhIDM1NDEwCisgICAgICAgIC8vIENhbGxpbmcgdGhlIG90aGVyIHdyaXRlIGZ1bmN0aW9uIHNvIGFzIHRvIGluaXQgdGhlIGJ1ZmZlciBhbnl3YXlzCisgICAgICAgIGlmKHMgPT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGUocywgMCwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZShzLCAwLCBzLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICBzdGF0aWMgU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisgICAgCisgICAgLyoqCisgICAgICogV3JpdGUgYSBsaW5lIHNlcGFyYXRvci4gIFRoZSBsaW5lIHNlcGFyYXRvciBzdHJpbmcgaXMgZGVmaW5lZCBieSB0aGUKKyAgICAgKiBzeXN0ZW0gcHJvcGVydHkgPHR0PmxpbmUuc2VwYXJhdG9yPC90dD4sIGFuZCBpcyBub3QgbmVjZXNzYXJpbHkgYSBzaW5nbGUKKyAgICAgKiBuZXdsaW5lICgnXG4nKSBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIG5ld0xpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZShsaW5lU2VwYXJhdG9yKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyogTWV0aG9kcyB0aGF0IGRvIG5vdCB0ZXJtaW5hdGUgbGluZXMgKi8KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGJvb2xlYW4gdmFsdWUuICBUaGUgc3RyaW5nIHByb2R1Y2VkIGJ5IDxjb2RlPntAbGluaworICAgICAqIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihib29sZWFuKX08L2NvZGU+IGlzIHRyYW5zbGF0ZWQgaW50byBieXRlcworICAgICAqIGFjY29yZGluZyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZywgYW5kIHRoZXNlIGJ5dGVzCisgICAgICogYXJlIHdyaXR0ZW4gaW4gZXhhY3RseSB0aGUgbWFubmVyIG9mIHRoZSA8Y29kZT57QGxpbmsKKyAgICAgKiAjd3JpdGUoaW50KX08L2NvZGU+IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIGIgICBUaGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50KGJvb2xlYW4gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGUoYiA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGNoYXJhY3Rlci4gIFRoZSBjaGFyYWN0ZXIgaXMgdHJhbnNsYXRlZCBpbnRvIG9uZSBvciBtb3JlIGJ5dGVzCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLCBhbmQgdGhlc2UgYnl0ZXMKKyAgICAgKiBhcmUgd3JpdHRlbiBpbiBleGFjdGx5IHRoZSBtYW5uZXIgb2YgdGhlIDxjb2RlPntAbGluaworICAgICAqICN3cml0ZShpbnQpfTwvY29kZT4gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgYyAgIFRoZSA8Y29kZT5jaGFyPC9jb2RlPiB0byBiZSBwcmludGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQoY2hhciBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZShTdHJpbmcudmFsdWVPZihjKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByaW50IGFuIGludGVnZXIuICBUaGUgc3RyaW5nIHByb2R1Y2VkIGJ5IDxjb2RlPntAbGluaworICAgICAqIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihpbnQpfTwvY29kZT4gaXMgdHJhbnNsYXRlZCBpbnRvIGJ5dGVzIGFjY29yZGluZworICAgICAqIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLCBhbmQgdGhlc2UgYnl0ZXMgYXJlCisgICAgICogd3JpdHRlbiBpbiBleGFjdGx5IHRoZSBtYW5uZXIgb2YgdGhlIDxjb2RlPntAbGluayAjd3JpdGUoaW50KX08L2NvZGU+CisgICAgICogbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgaSAgIFRoZSA8Y29kZT5pbnQ8L2NvZGU+IHRvIGJlIHByaW50ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludChpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGUoU3RyaW5nLnZhbHVlT2YoaSkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGxvbmcgaW50ZWdlci4gIFRoZSBzdHJpbmcgcHJvZHVjZWQgYnkgPGNvZGU+e0BsaW5rCisgICAgICogamF2YS5sYW5nLlN0cmluZyN2YWx1ZU9mKGxvbmcpfTwvY29kZT4gaXMgdHJhbnNsYXRlZCBpbnRvIGJ5dGVzCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLCBhbmQgdGhlc2UgYnl0ZXMKKyAgICAgKiBhcmUgd3JpdHRlbiBpbiBleGFjdGx5IHRoZSBtYW5uZXIgb2YgdGhlIDxjb2RlPntAbGluayAjd3JpdGUoaW50KX08L2NvZGU+CisgICAgICogbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgbCAgIFRoZSA8Y29kZT5sb25nPC9jb2RlPiB0byBiZSBwcmludGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQobG9uZyBsKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZShTdHJpbmcudmFsdWVPZihsKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByaW50IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLiAgVGhlIHN0cmluZyBwcm9kdWNlZCBieSA8Y29kZT57QGxpbmsKKyAgICAgKiBqYXZhLmxhbmcuU3RyaW5nI3ZhbHVlT2YoZmxvYXQpfTwvY29kZT4gaXMgdHJhbnNsYXRlZCBpbnRvIGJ5dGVzCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLCBhbmQgdGhlc2UgYnl0ZXMKKyAgICAgKiBhcmUgd3JpdHRlbiBpbiBleGFjdGx5IHRoZSBtYW5uZXIgb2YgdGhlIDxjb2RlPntAbGluayAjd3JpdGUoaW50KX08L2NvZGU+CisgICAgICogbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgZiAgIFRoZSA8Y29kZT5mbG9hdDwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50KGZsb2F0IGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlKFN0cmluZy52YWx1ZU9mKGYpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHJpbnQgYSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IG51bWJlci4gIFRoZSBzdHJpbmcgcHJvZHVjZWQgYnkKKyAgICAgKiA8Y29kZT57QGxpbmsgamF2YS5sYW5nLlN0cmluZyN2YWx1ZU9mKGRvdWJsZSl9PC9jb2RlPiBpcyB0cmFuc2xhdGVkIGludG8KKyAgICAgKiBieXRlcyBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCB0aGVzZQorICAgICAqIGJ5dGVzIGFyZSB3cml0dGVuIGluIGV4YWN0bHkgdGhlIG1hbm5lciBvZiB0aGUgPGNvZGU+e0BsaW5rCisgICAgICogI3dyaXRlKGludCl9PC9jb2RlPiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBkICAgVGhlIDxjb2RlPmRvdWJsZTwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50KGRvdWJsZSBkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZShTdHJpbmcudmFsdWVPZihkKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByaW50IGFuIGFycmF5IG9mIGNoYXJhY3RlcnMuICBUaGUgY2hhcmFjdGVycyBhcmUgY29udmVydGVkIGludG8gYnl0ZXMKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCB0aGVzZSBieXRlcworICAgICAqIGFyZSB3cml0dGVuIGluIGV4YWN0bHkgdGhlIG1hbm5lciBvZiB0aGUgPGNvZGU+e0BsaW5rICN3cml0ZShpbnQpfTwvY29kZT4KKyAgICAgKiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBzICAgVGhlIGFycmF5IG9mIGNoYXJzIHRvIGJlIHByaW50ZWQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgIE51bGxQb2ludGVyRXhjZXB0aW9uICBJZiA8Y29kZT5zPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50KGNoYXIgc1tdKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZShzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHJpbnQgYSBzdHJpbmcuICBJZiB0aGUgYXJndW1lbnQgaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiB0aGUgc3RyaW5nCisgICAgICogPGNvZGU+Im51bGwiPC9jb2RlPiBpcyBwcmludGVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RyaW5nJ3MgY2hhcmFjdGVycyBhcmUKKyAgICAgKiBjb252ZXJ0ZWQgaW50byBieXRlcyBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIKKyAgICAgKiBlbmNvZGluZywgYW5kIHRoZXNlIGJ5dGVzIGFyZSB3cml0dGVuIGluIGV4YWN0bHkgdGhlIG1hbm5lciBvZiB0aGUKKyAgICAgKiA8Y29kZT57QGxpbmsgI3dyaXRlKGludCl9PC9jb2RlPiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBzICAgVGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50KFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocyA9PSBudWxsKSB7CisgICAgICAgICAgICBzID0gIm51bGwiOworICAgICAgICB9CisgICAgICAgIHdyaXRlKHMpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmludCBhbiBvYmplY3QuICBUaGUgc3RyaW5nIHByb2R1Y2VkIGJ5IHRoZSA8Y29kZT57QGxpbmsKKyAgICAgKiBqYXZhLmxhbmcuU3RyaW5nI3ZhbHVlT2YoT2JqZWN0KX08L2NvZGU+IG1ldGhvZCBpcyB0cmFuc2xhdGVkIGludG8gYnl0ZXMKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCB0aGVzZSBieXRlcworICAgICAqIGFyZSB3cml0dGVuIGluIGV4YWN0bHkgdGhlIG1hbm5lciBvZiB0aGUgPGNvZGU+e0BsaW5rICN3cml0ZShpbnQpfTwvY29kZT4KKyAgICAgKiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBvYmogICBUaGUgPGNvZGU+T2JqZWN0PC9jb2RlPiB0byBiZSBwcmludGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQoT2JqZWN0IG9iaikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGUoU3RyaW5nLnZhbHVlT2Yob2JqKSk7CisgICAgfQorICAgIAorICAgIC8qIE1ldGhvZHMgdGhhdCBkbyB0ZXJtaW5hdGUgbGluZXMgKi8KKyAgICAKKyAgICAvKioKKyAgICAgKiBUZXJtaW5hdGUgdGhlIGN1cnJlbnQgbGluZSBieSB3cml0aW5nIHRoZSBsaW5lIHNlcGFyYXRvciBzdHJpbmcuICBUaGUKKyAgICAgKiBsaW5lIHNlcGFyYXRvciBzdHJpbmcgaXMgZGVmaW5lZCBieSB0aGUgc3lzdGVtIHByb3BlcnR5CisgICAgICogPGNvZGU+bGluZS5zZXBhcmF0b3I8L2NvZGU+LCBhbmQgaXMgbm90IG5lY2Vzc2FyaWx5IGEgc2luZ2xlIG5ld2xpbmUKKyAgICAgKiBjaGFyYWN0ZXIgKDxjb2RlPidcbic8L2NvZGU+KS4KKyAgICAgKgorICAgICAqIE5lZWQgdG8gY2hhbmdlIHRoaXMgZnJvbSBQcmludFdyaXRlciBiZWNhdXNlIHRoZSBkZWZhdWx0CisgICAgICogcHJpbnRsbigpIHdyaXRlcyAgdG8gdGhlIHNpbmsgZGlyZWN0bHkgaW5zdGVhZCBvZiB0aHJvdWdoIHRoZQorICAgICAqIHdyaXRlIG1ldGhvZC4uLiAgCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG5ld0xpbmUoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHJpbnQgYSBib29sZWFuIHZhbHVlIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMKKyAgICAgKiBhcyB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KGJvb2xlYW4pfTwvY29kZT4gYW5kIHRoZW4KKyAgICAgKiA8Y29kZT57QGxpbmsgI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oYm9vbGVhbiB4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwcmludCh4KTsKKyAgICAgICAgcHJpbnRsbigpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGNoYXJhY3RlciBhbmQgdGhlbiB0ZXJtaW5hdGUgdGhlIGxpbmUuICBUaGlzIG1ldGhvZCBiZWhhdmVzIGFzCisgICAgICogdGhvdWdoIGl0IGludm9rZXMgPGNvZGU+e0BsaW5rICNwcmludChjaGFyKX08L2NvZGU+IGFuZCB0aGVuIDxjb2RlPntAbGluaworICAgICAqICNwcmludGxuKCl9PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGNoYXIgeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpbnQoeCk7CisgICAgICAgIHByaW50bG4oKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHJpbnQgYW4gaW50ZWdlciBhbmQgdGhlbiB0ZXJtaW5hdGUgdGhlIGxpbmUuICBUaGlzIG1ldGhvZCBiZWhhdmVzIGFzCisgICAgICogdGhvdWdoIGl0IGludm9rZXMgPGNvZGU+e0BsaW5rICNwcmludChpbnQpfTwvY29kZT4gYW5kIHRoZW4gPGNvZGU+e0BsaW5rCisgICAgICogI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oaW50IHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KHgpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByaW50IGEgbG9uZyBpbnRlZ2VyIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMKKyAgICAgKiBhcyB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KGxvbmcpfTwvY29kZT4gYW5kIHRoZW4KKyAgICAgKiA8Y29kZT57QGxpbmsgI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4obG9uZyB4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwcmludCh4KTsKKyAgICAgICAgcHJpbnRsbigpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBhbmQgdGhlbiB0ZXJtaW5hdGUgdGhlIGxpbmUuICBUaGlzIG1ldGhvZAorICAgICAqIGJlaGF2ZXMgYXMgdGhvdWdoIGl0IGludm9rZXMgPGNvZGU+e0BsaW5rICNwcmludChmbG9hdCl9PC9jb2RlPiBhbmQgdGhlbgorICAgICAqIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihmbG9hdCB4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwcmludCh4KTsKKyAgICAgICAgcHJpbnRsbigpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgbnVtYmVyIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUKKyAgICAgKiBsaW5lLiAgVGhpcyBtZXRob2QgYmVoYXZlcyBhcyB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsKKyAgICAgKiAjcHJpbnQoZG91YmxlKX08L2NvZGU+IGFuZCB0aGVuIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihkb3VibGUgeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpbnQoeCk7CisgICAgICAgIHByaW50bG4oKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHJpbnQgYW4gYXJyYXkgb2YgY2hhcmFjdGVycyBhbmQgdGhlbiB0ZXJtaW5hdGUgdGhlIGxpbmUuICBUaGlzIG1ldGhvZAorICAgICAqIGJlaGF2ZXMgYXMgdGhvdWdoIGl0IGludm9rZXMgPGNvZGU+e0BsaW5rICNwcmludChjaGFyW10pfTwvY29kZT4gYW5kIHRoZW4KKyAgICAgKiA8Y29kZT57QGxpbmsgI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oY2hhciB4W10pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KHgpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByaW50IGEgU3RyaW5nIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMgYXMKKyAgICAgKiB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KFN0cmluZyl9PC9jb2RlPiBhbmQgdGhlbgorICAgICAqIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihTdHJpbmcgeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpbnQoeCk7CisgICAgICAgIHByaW50bG4oKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHJpbnQgYW4gT2JqZWN0IGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMgYXMKKyAgICAgKiB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KE9iamVjdCl9PC9jb2RlPiBhbmQgdGhlbgorICAgICAqIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihPYmplY3QgeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpbnQoeCk7CisgICAgICAgIHByaW50bG4oKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvUGFnZUNvbnRleHRJbXBsLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvUGFnZUNvbnRleHRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0YjIwMQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9QYWdlQ29udGV4dEltcGwuamF2YQpAQCAtMCwwICsxLDkzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BGYWN0b3J5OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcFdyaXRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5QYWdlQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5lbC5FTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5lbC5FeHByZXNzaW9uRXZhbHVhdG9yOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLmVsLlZhcmlhYmxlUmVzb2x2ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkJvZHlDb250ZW50OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmVsLkV4cHJlc3Npb25FdmFsdWF0b3JJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5lbC5WYXJpYWJsZVJlc29sdmVySW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Db25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnNlY3VyaXR5LlNlY3VyaXR5VXRpbDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGFnZUNvbnRleHQgY2xhc3MgZnJvbSB0aGUgSlNQIHNwZWMuCisgKiBBbHNvIGRvdWJsZXMgYXMgYSBWYXJpYWJsZVJlc29sdmVyIGZvciB0aGUgRUwuCisgKgorICogQGF1dGhvciBBbmlsIEsuIFZpamVuZHJhbgorICogQGF1dGhvciBMYXJyeSBDYWJsZQorICogQGF1dGhvciBIYW5zIEJlcmdzdGVuCisgKiBAYXV0aG9yIFBpZXJyZSBEZWxpc2xlCisgKiBAYXV0aG9yIE1hcmsgUm90aAorICogQGF1dGhvciBKYW4gTHVlaGUKKyAqLworcHVibGljIGNsYXNzIFBhZ2VDb250ZXh0SW1wbCBleHRlbmRzIFBhZ2VDb250ZXh0IGltcGxlbWVudHMgVmFyaWFibGVSZXNvbHZlciB7CisKKyAgICAvLyBUaGUgZXhwcmVzc2lvbiBldmFsdWF0b3IsIGZvciBldmFsdWF0aW5nIEVMIGV4cHJlc3Npb25zLgorICAgIHByaXZhdGUgc3RhdGljIEV4cHJlc3Npb25FdmFsdWF0b3JJbXBsIGVsRXhwckV2YWwKKyAgICAgICAgPSBuZXcgRXhwcmVzc2lvbkV2YWx1YXRvckltcGwoZmFsc2UpOworCisgICAgLy8gVGhlIHZhcmlhYmxlIHJlc29sdmVyLCBmb3IgZXZhbHVhdGluZyBFTCBleHByZXNzaW9ucy4KKyAgICBwcml2YXRlIFZhcmlhYmxlUmVzb2x2ZXJJbXBsIHZhcmlhYmxlUmVzb2x2ZXI7CisKKyAgICBwcml2YXRlIEJvZHlDb250ZW50SW1wbFtdIG91dHM7CisgICAgcHJpdmF0ZSBpbnQgZGVwdGg7CisKKyAgICAvLyBwZXItc2VydmxldCBzdGF0ZQorICAgIHByaXZhdGUgU2VydmxldCBzZXJ2bGV0OworICAgIHByaXZhdGUgU2VydmxldENvbmZpZyBjb25maWc7CisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0OworICAgIHByaXZhdGUgU3RyaW5nIGVycm9yUGFnZVVSTDsKKworICAgIC8vIHBhZ2Utc2NvcGUgYXR0cmlidXRlcworICAgIHByaXZhdGUgdHJhbnNpZW50IEhhc2h0YWJsZSAgICAgICAgYXR0cmlidXRlczsKKworICAgIC8vIHBlci1yZXF1ZXN0IHN0YXRlCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgSHR0cFNlc3Npb24gc2Vzc2lvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNJbmNsdWRlZDsKKworICAgIC8vIGluaXRpYWwgb3V0cHV0IHN0cmVhbQorICAgIHByaXZhdGUgdHJhbnNpZW50IEpzcFdyaXRlciBvdXQ7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgSnNwV3JpdGVySW1wbCBiYXNlT3V0OworCisgICAgLyoKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBQYWdlQ29udGV4dEltcGwoSnNwRmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICAgIHRoaXMudmFyaWFibGVSZXNvbHZlciA9IG5ldyBWYXJpYWJsZVJlc29sdmVySW1wbCh0aGlzKTsKKyAgICAgICAgdGhpcy5vdXRzID0gbmV3IEJvZHlDb250ZW50SW1wbFswXTsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgxNik7CisgICAgICAgIHRoaXMuZGVwdGggPSAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFNlcnZsZXQgc2VydmxldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3JQYWdlVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkc1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b0ZsdXNoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIF9pbml0aWFsaXplKHNlcnZsZXQsIHJlcXVlc3QsIHJlc3BvbnNlLCBlcnJvclBhZ2VVUkwsIG5lZWRzU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSwgYXV0b0ZsdXNoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX2luaXRpYWxpemUoU2VydmxldCBzZXJ2bGV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvclBhZ2VVUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZHNTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvRmx1c2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBzdGF0ZQorICAgICAgICB0aGlzLnNlcnZsZXQgPSBzZXJ2bGV0OworICAgICAgICB0aGlzLmNvbmZpZyA9IHNlcnZsZXQuZ2V0U2VydmxldENvbmZpZygpOworICAgICAgICB0aGlzLmNvbnRleHQgPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICAgICAgdGhpcy5lcnJvclBhZ2VVUkwgPSBlcnJvclBhZ2VVUkw7CisgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKworCisgICAgICAgIC8vIFNldHVwIHNlc3Npb24gKGlmIHJlcXVpcmVkKQorICAgICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVxdWVzdCAmJiBuZWVkc1Nlc3Npb24pCisgICAgICAgICAgICB0aGlzLnNlc3Npb24gPSAoKEh0dHBTZXJ2bGV0UmVxdWVzdClyZXF1ZXN0KS5nZXRTZXNzaW9uKCk7CisgICAgICAgIGlmIChuZWVkc1Nlc3Npb24gJiYgc2Vzc2lvbiA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiUGFnZSBuZWVkcyBhIHNlc3Npb24gYW5kIG5vbmUgaXMgYXZhaWxhYmxlIik7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgaW5pdGlhbCBvdXQgLi4uCisgICAgICAgIGRlcHRoID0gLTE7CisgICAgICAgIGlmICh0aGlzLmJhc2VPdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5iYXNlT3V0ID0gbmV3IEpzcFdyaXRlckltcGwocmVzcG9uc2UsIGJ1ZmZlclNpemUsIGF1dG9GbHVzaCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmJhc2VPdXQuaW5pdChyZXNwb25zZSwgYnVmZmVyU2l6ZSwgYXV0b0ZsdXNoKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLm91dCA9IGJhc2VPdXQ7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgbmFtZXMvdmFsdWVzIGFzIHBlciBzcGVjCisgICAgICAgIHNldEF0dHJpYnV0ZShPVVQsIHRoaXMub3V0KTsKKyAgICAgICAgc2V0QXR0cmlidXRlKFJFUVVFU1QsIHJlcXVlc3QpOworICAgICAgICBzZXRBdHRyaWJ1dGUoUkVTUE9OU0UsIHJlc3BvbnNlKTsKKworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKQorICAgICAgICAgICAgc2V0QXR0cmlidXRlKFNFU1NJT04sIHNlc3Npb24pOworCisgICAgICAgIHNldEF0dHJpYnV0ZShQQUdFLCBzZXJ2bGV0KTsKKyAgICAgICAgc2V0QXR0cmlidXRlKENPTkZJRywgY29uZmlnKTsKKyAgICAgICAgc2V0QXR0cmlidXRlKFBBR0VDT05URVhULCB0aGlzKTsKKyAgICAgICAgc2V0QXR0cmlidXRlKEFQUExJQ0FUSU9OLCBjb250ZXh0KTsKKworICAgICAgICBpc0luY2x1ZGVkID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoCisgICAgICAgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLnNlcnZsZXRfcGF0aCIpICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgb3V0ID0gYmFzZU91dDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpc0luY2x1ZGVkKSB7CisgICAgICAgICAgICAgICAgKChKc3BXcml0ZXJJbXBsKW91dCkuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAvLyBwdXNoIGl0IGludG8gdGhlIGluY2x1ZGluZyBqc3BXcml0ZXIKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gT2xkIGNvZGU6CisgICAgICAgICAgICAgICAgLy9vdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAvLyBEbyBub3QgZmx1c2ggdGhlIGJ1ZmZlciBldmVuIGlmIHdlJ3JlIG5vdCBpbmNsdWRlZCAoaS5lLgorICAgICAgICAgICAgICAgIC8vIHdlIGFyZSB0aGUgbWFpbiBwYWdlLiBUaGUgc2VydmxldCB3aWxsIGZsdXNoIGl0IGFuZCBjbG9zZQorICAgICAgICAgICAgICAgIC8vIHRoZSBzdHJlYW0uCisgICAgICAgICAgICAgICAgKChKc3BXcml0ZXJJbXBsKW91dCkuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGNvbnRleHQubG9nKAorICAgICAgICAgICAgICAgICJQYWdlQ29udGV4dEltcGwucmVsZWFzZSgpOiBJbnRlcm5hbCBlcnJvciBmbHVzaGluZyBidWZmZXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlcnZsZXQgPSBudWxsOworICAgICAgICBjb25maWcgPSBudWxsOworICAgICAgICBjb250ZXh0ID0gbnVsbDsKKyAgICAgICAgZXJyb3JQYWdlVVJMID0gbnVsbDsKKyAgICAgICAgcmVxdWVzdCA9IG51bGw7CisgICAgICAgIHJlc3BvbnNlID0gbnVsbDsKKyAgICAgICAgZGVwdGggPSAtMTsKKyAgICAgICAgYmFzZU91dC5yZWN5Y2xlKCk7CisgICAgICAgIHNlc3Npb24gPSBudWxsOworCisgICAgICAgIGF0dHJpYnV0ZXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShmaW5hbCBTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5hdHRyaWJ1dGUubnVsbF9uYW1lIikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKXsKKyAgICAgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCl7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb0dldEF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBkb0dldEF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgZG9HZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpeworICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIGludCBzY29wZSkgeworCisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5hdHRyaWJ1dGUubnVsbF9uYW1lIikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKXsKKyAgICAgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCl7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb0dldEF0dHJpYnV0ZShuYW1lLCBzY29wZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZG9HZXRBdHRyaWJ1dGUobmFtZSwgc2NvcGUpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCBkb0dldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgaW50IHNjb3BlKXsKKyAgICAgICAgc3dpdGNoIChzY29wZSkgeworICAgICAgICAgICAgY2FzZSBQQUdFX1NDT1BFOgorICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMuZ2V0KG5hbWUpOworCisgICAgICAgICAgICBjYXNlIFJFUVVFU1RfU0NPUEU6CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRBdHRyaWJ1dGUobmFtZSk7CisKKyAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9TQ09QRToKKyAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5wYWdlLm5vU2Vzc2lvbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzZXNzaW9uLmdldEF0dHJpYnV0ZShuYW1lKTsKKworICAgICAgICAgICAgY2FzZSBBUFBMSUNBVElPTl9TQ09QRToKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEF0dHJpYnV0ZShuYW1lKTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc2NvcGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IGF0dHJpYnV0ZSkgeworCisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5hdHRyaWJ1dGUubnVsbF9uYW1lIikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKXsKKyAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCl7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKXsKKyAgICAgICAgICAgICAgICAgICAgZG9TZXRBdHRyaWJ1dGUobmFtZSwgYXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb1NldEF0dHJpYnV0ZShuYW1lLCBhdHRyaWJ1dGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvU2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgYXR0cmlidXRlKXsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChuYW1lLCBhdHRyaWJ1dGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVtb3ZlQXR0cmlidXRlKG5hbWUsIFBBR0VfU0NPUEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QgbywgZmluYWwgaW50IHNjb3BlKSB7CisKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWUiKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpeworICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKXsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpeworICAgICAgICAgICAgICAgICAgICBkb1NldEF0dHJpYnV0ZShuYW1lLCBvLCBzY29wZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9TZXRBdHRyaWJ1dGUobmFtZSwgbywgc2NvcGUpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9TZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCBvLCBpbnQgc2NvcGUgKXsKKyAgICAgICAgaWYgKG8gIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoIChzY29wZSkgeworICAgICAgICAgICAgY2FzZSBQQUdFX1NDT1BFOgorICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQobmFtZSwgbyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBSRVFVRVNUX1NDT1BFOgorICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUobmFtZSwgbyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTRVNTSU9OX1NDT1BFOgorICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnBhZ2Uubm9TZXNzaW9uIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUobmFtZSwgbyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBUFBMSUNBVElPTl9TQ09QRToKKyAgICAgICAgICAgIGNvbnRleHQuc2V0QXR0cmlidXRlKG5hbWUsIG8pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHNjb3BlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSwgc2NvcGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBpbnQgc2NvcGUpIHsKKworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYXR0cmlidXRlLm51bGxfbmFtZSIpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpeworICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKXsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpeworICAgICAgICAgICAgICAgICAgICBkb1JlbW92ZUF0dHJpYnV0ZShuYW1lLCBzY29wZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9SZW1vdmVBdHRyaWJ1dGUobmFtZSwgc2NvcGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvUmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lLCBpbnQgc2NvcGUpeworICAgICAgICBzd2l0Y2ggKHNjb3BlKSB7CisgICAgICAgIGNhc2UgUEFHRV9TQ09QRToKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucmVtb3ZlKG5hbWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSRVFVRVNUX1NDT1BFOgorICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNFU1NJT05fU0NPUEU6CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5wYWdlLm5vU2Vzc2lvbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBUFBMSUNBVElPTl9TQ09QRToKKyAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc2NvcGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlc1Njb3BlKGZpbmFsIFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWUiKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpeworICAgICAgICAgICAgcmV0dXJuICgoSW50ZWdlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCl7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihkb0dldEF0dHJpYnV0ZVNjb3BlKG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSkuaW50VmFsdWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBkb0dldEF0dHJpYnV0ZVNjb3BlKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZG9HZXRBdHRyaWJ1dGVTY29wZShTdHJpbmcgbmFtZSl7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzLmdldChuYW1lKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIFBBR0VfU0NPUEU7CisKKyAgICAgICAgaWYgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKG5hbWUpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gUkVRVUVTVF9TQ09QRTsKKworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLmdldEF0dHJpYnV0ZShuYW1lKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0VTU0lPTl9TQ09QRTsKKyAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSkgeworICAgICAgICAgICAgICAgIC8vIFNlc3Npb24gaGFzIGJlZW4gaW52YWxpZGF0ZWQuCisgICAgICAgICAgICAgICAgLy8gSWdub3JlIGFuZCBmYWxsIHRocm91Z2ggdG8gYXBwbGljYXRpb24gc2NvcGUuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29udGV4dC5nZXRBdHRyaWJ1dGUobmFtZSkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBBUFBMSUNBVElPTl9TQ09QRTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGZpbmRBdHRyaWJ1dGUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKXsKKyAgICAgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCl7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5hdHRyaWJ1dGUubnVsbF9uYW1lIikpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvRmluZEF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWUiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBkb0ZpbmRBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCBkb0ZpbmRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpeworCisgICAgICAgIE9iamVjdCBvID0gYXR0cmlidXRlcy5nZXQobmFtZSk7CisgICAgICAgIGlmIChvICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbzsKKworICAgICAgICBvID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgIGlmIChvICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbzsKKworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG8gPSBzZXNzaW9uLmdldEF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSkgeworICAgICAgICAgICAgICAgIC8vIFNlc3Npb24gaGFzIGJlZW4gaW52YWxpZGF0ZWQuCisgICAgICAgICAgICAgICAgLy8gSWdub3JlIGFuZCBmYWxsIHRocm91Z2ggdG8gYXBwbGljYXRpb24gc2NvcGUuCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0QXR0cmlidXRlKG5hbWUpOworICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzSW5TY29wZShmaW5hbCBpbnQgc2NvcGUpIHsKKyAgICAgICAgaWYgKFNlY3VyaXR5VXRpbC5pc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpKXsKKyAgICAgICAgICAgIHJldHVybiAoRW51bWVyYXRpb24pCisgICAgICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCl7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKXsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvR2V0QXR0cmlidXRlTmFtZXNJblNjb3BlKHNjb3BlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBkb0dldEF0dHJpYnV0ZU5hbWVzSW5TY29wZShzY29wZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEVudW1lcmF0aW9uIGRvR2V0QXR0cmlidXRlTmFtZXNJblNjb3BlKGludCBzY29wZSl7CisgICAgICAgIHN3aXRjaCAoc2NvcGUpIHsKKyAgICAgICAgY2FzZSBQQUdFX1NDT1BFOgorICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMua2V5cygpOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgUkVRVUVTVF9TQ09QRToKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldEF0dHJpYnV0ZU5hbWVzKCk7CisKKyAgICAgICAgY2FzZSBTRVNTSU9OX1NDT1BFOgorICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IucGFnZS5ub1Nlc3Npb24iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRBdHRyaWJ1dGVOYW1lcygpOworCisgICAgICAgIGNhc2UgQVBQTElDQVRJT05fU0NPUEU6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRBdHRyaWJ1dGVOYW1lcygpOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHNjb3BlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYXR0cmlidXRlLm51bGxfbmFtZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSl7CisgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCl7CisgICAgICAgICAgICAgICAgICAgIGRvUmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRvUmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIGRvUmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKXsKKyAgICAgICAgcmVtb3ZlQXR0cmlidXRlKG5hbWUsIFBBR0VfU0NPUEUpOworICAgICAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSwgUkVRVUVTVF9TQ09QRSk7CisgICAgICAgIGlmKCBzZXNzaW9uICE9IG51bGwgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZShuYW1lLCBTRVNTSU9OX1NDT1BFKTsKKyAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSkgeworICAgICAgICAgICAgICAgIC8vIFNlc3Npb24gaGFzIGJlZW4gaW52YWxpZGF0ZWQuCisgICAgICAgICAgICAgICAgLy8gSWdub3JlIGFuZCBmYWxsIHRocm93IHRvIGFwcGxpY2F0aW9uIHNjb3BlLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlbW92ZUF0dHJpYnV0ZShuYW1lLCBBUFBMSUNBVElPTl9TQ09QRSk7CisgICAgfQorCisgICAgcHVibGljIEpzcFdyaXRlciBnZXRPdXQoKSB7CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCisgICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oKSB7IHJldHVybiBzZXNzaW9uOyB9CisgICAgcHVibGljIFNlcnZsZXQgZ2V0U2VydmxldCgpIHsgcmV0dXJuIHNlcnZsZXQ7IH0KKyAgICBwdWJsaWMgU2VydmxldENvbmZpZyBnZXRTZXJ2bGV0Q29uZmlnKCkgeyByZXR1cm4gY29uZmlnOyB9CisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgfQorICAgIHB1YmxpYyBTZXJ2bGV0UmVxdWVzdCBnZXRSZXF1ZXN0KCkgeyByZXR1cm4gcmVxdWVzdDsgfQorICAgIHB1YmxpYyBTZXJ2bGV0UmVzcG9uc2UgZ2V0UmVzcG9uc2UoKSB7IHJldHVybiByZXNwb25zZTsgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZQorICAgICAqIGNvbnRleHQsIGlmIGFueS4KKyAgICAgKiA8cC8+CisgICAgICogQWRkZWQgd3JhcHBpbmcgZm9yIFRocm93YWJsZXMgdG8gYXZvaWQgQ2xhc3NDYXN0RXhjZXB0aW9uOgorICAgICAqIHNlZSBCdWd6aWxsYSAzMTE3MSBmb3IgZGV0YWlscy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIEV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWdlIGNvbnRleHQsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKKyAgICAgICAgVGhyb3dhYmxlIHQgPSBKc3BSdW50aW1lTGlicmFyeS5nZXRUaHJvd2FibGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gT25seSB3cmFwIGlmIG5lZWRlZAorICAgICAgICBpZigodCAhPSBudWxsKSAmJiAoISAodCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikpKSB7CisgICAgICAgICAgICB0ID0gbmV3IEpzcEV4Y2VwdGlvbih0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoRXhjZXB0aW9uKSB0OworICAgIH0KKworCisgICAgcHVibGljIE9iamVjdCBnZXRQYWdlKCkgeyByZXR1cm4gc2VydmxldDsgfQorCisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGhSZWxhdGl2ZVRvQ29udGV4dChTdHJpbmcgcmVsYXRpdmVVcmxQYXRoKSB7CisgICAgICAgIFN0cmluZyBwYXRoID0gcmVsYXRpdmVVcmxQYXRoOworCisgICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSAoU3RyaW5nKQorICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmluY2x1ZGUuc2VydmxldF9wYXRoIik7CisgICAgICAgICAgICBpZiAodXJpID09IG51bGwpCisgICAgICAgICAgICAgICAgdXJpID0gKChIdHRwU2VydmxldFJlcXVlc3QpIHJlcXVlc3QpLmdldFNlcnZsZXRQYXRoKCk7CisgICAgICAgICAgICBTdHJpbmcgYmFzZVVSSSA9IHVyaS5zdWJzdHJpbmcoMCwgdXJpLmxhc3RJbmRleE9mKCcvJykpOworICAgICAgICAgICAgcGF0aCA9IGJhc2VVUkkrJy8nK3BhdGg7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbmNsdWRlKFN0cmluZyByZWxhdGl2ZVVybFBhdGgpCisgICAgICAgICAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNwUnVudGltZUxpYnJhcnkuaW5jbHVkZShyZXF1ZXN0LCByZXNwb25zZSwgcmVsYXRpdmVVcmxQYXRoLCBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5jbHVkZShmaW5hbCBTdHJpbmcgcmVsYXRpdmVVcmxQYXRoLCBmaW5hbCBib29sZWFuIGZsdXNoKQorICAgICAgICAgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSl7CisgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKXsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICAgICAgICAgICAgICAgICAgZG9JbmNsdWRlKHJlbGF0aXZlVXJsUGF0aCwgZmx1c2gpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGV4ID0gIGUuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24peworICAgICAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pZXg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFNlcnZsZXRFeGNlcHRpb24pZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9JbmNsdWRlKHJlbGF0aXZlVXJsUGF0aCwgZmx1c2gpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvSW5jbHVkZShTdHJpbmcgcmVsYXRpdmVVcmxQYXRoLCBib29sZWFuIGZsdXNoKQorICAgICAgICAgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzcFJ1bnRpbWVMaWJyYXJ5LmluY2x1ZGUocmVxdWVzdCwgcmVzcG9uc2UsIHJlbGF0aXZlVXJsUGF0aCwgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVSZXNvbHZlciBnZXRWYXJpYWJsZVJlc29sdmVyKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmb3J3YXJkKGZpbmFsIFN0cmluZyByZWxhdGl2ZVVybFBhdGgpCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSl7CisgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKXsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICAgICAgICAgICAgICAgICAgZG9Gb3J3YXJkKHJlbGF0aXZlVXJsUGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZXggPSAgZS5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbil7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbilleDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAoU2VydmxldEV4Y2VwdGlvbilleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb0ZvcndhcmQocmVsYXRpdmVVcmxQYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb0ZvcndhcmQoU3RyaW5nIHJlbGF0aXZlVXJsUGF0aCkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9ueworCisgICAgICAgIC8vIEpTUC40LjUgSWYgdGhlIGJ1ZmZlciB3YXMgZmx1c2hlZCwgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQuY2xlYXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UgPQorICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci5hdHRlbXB0X3RvX2NsZWFyX2ZsdXNoZWRfYnVmZmVyIikpOworICAgICAgICAgICAgaXNlLmluaXRDYXVzZShleCk7CisgICAgICAgICAgICB0aHJvdyBpc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCB0aGUgd3JhcHBlciBmb3IgaW5jbHVkZQorICAgICAgICB3aGlsZSAocmVzcG9uc2UgaW5zdGFuY2VvZiBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVySW5jbHVkZSkgeworICAgICAgICAgICAgcmVzcG9uc2UgPSAoKFNlcnZsZXRSZXNwb25zZVdyYXBwZXJJbmNsdWRlKXJlc3BvbnNlKS5nZXRSZXNwb25zZSgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSBnZXRBYnNvbHV0ZVBhdGhSZWxhdGl2ZVRvQ29udGV4dChyZWxhdGl2ZVVybFBhdGgpOworICAgICAgICBTdHJpbmcgaW5jbHVkZVVyaQorICAgICAgICAgICAgPSAoU3RyaW5nKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuSU5DX1NFUlZMRVRfUEFUSCk7CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKGluY2x1ZGVVcmkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKENvbnN0YW50cy5JTkNfU0VSVkxFVF9QQVRIKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVxdWVzdERpc3BhdGNoZXIocGF0aCkuZm9yd2FyZChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaW5jbHVkZVVyaSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKENvbnN0YW50cy5JTkNfU0VSVkxFVF9QQVRILCBpbmNsdWRlVXJpKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKENvbnN0YW50cy5GT1JXQVJEX1NFRU4sICJ0cnVlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQm9keUNvbnRlbnQgcHVzaEJvZHkoKSB7CisgICAgICAgIHJldHVybiAoQm9keUNvbnRlbnQpIHB1c2hCb2R5KG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBKc3BXcml0ZXIgcHVzaEJvZHkoV3JpdGVyIHdyaXRlcikgeworICAgICAgICBkZXB0aCsrOworICAgICAgICBpZiAoZGVwdGggPj0gb3V0cy5sZW5ndGgpIHsKKyAgICAgICAgICAgIEJvZHlDb250ZW50SW1wbFtdIG5ld091dHMgPSBuZXcgQm9keUNvbnRlbnRJbXBsW2RlcHRoICsgMV07CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8b3V0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIG5ld091dHNbaV0gPSBvdXRzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3T3V0c1tkZXB0aF0gPSBuZXcgQm9keUNvbnRlbnRJbXBsKG91dCk7CisgICAgICAgICAgICBvdXRzID0gbmV3T3V0czsKKyAgICAgICAgfQorCisgICAgICAgIG91dHNbZGVwdGhdLnNldFdyaXRlcih3cml0ZXIpOworICAgICAgICBvdXQgPSBvdXRzW2RlcHRoXTsKKworICAgICAgICAvLyBVcGRhdGUgdGhlIHZhbHVlIG9mIHRoZSAib3V0IiBhdHRyaWJ1dGUgaW4gdGhlIHBhZ2Ugc2NvcGUKKyAgICAgICAgLy8gYXR0cmlidXRlIG5hbWVzcGFjZSBvZiB0aGlzIFBhZ2VDb250ZXh0CisgICAgICAgIHNldEF0dHJpYnV0ZShPVVQsIG91dCk7CisKKyAgICAgICAgcmV0dXJuIG91dHNbZGVwdGhdOworICAgIH0KKworICAgIHB1YmxpYyBKc3BXcml0ZXIgcG9wQm9keSgpIHsKKyAgICAgICAgZGVwdGgtLTsKKyAgICAgICAgaWYgKGRlcHRoID49IDApIHsKKyAgICAgICAgICAgIG91dCA9IG91dHNbZGVwdGhdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0ID0gYmFzZU91dDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgdmFsdWUgb2YgdGhlICJvdXQiIGF0dHJpYnV0ZSBpbiB0aGUgcGFnZSBzY29wZQorICAgICAgICAvLyBhdHRyaWJ1dGUgbmFtZXNwYWNlIG9mIHRoaXMgUGFnZUNvbnRleHQKKyAgICAgICAgc2V0QXR0cmlidXRlKE9VVCwgb3V0KTsKKworICAgICAgICByZXR1cm4gb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIHByb2dyYW1tYXRpYyBhY2Nlc3MgdG8gdGhlIEV4cHJlc3Npb25FdmFsdWF0b3IuCisgICAgICogVGhlIEpTUCBDb250YWluZXIgbXVzdCByZXR1cm4gYSB2YWxpZCBpbnN0YW5jZSBvZiBhbgorICAgICAqIEV4cHJlc3Npb25FdmFsdWF0b3IgdGhhdCBjYW4gcGFyc2UgRUwgZXhwcmVzc2lvbnMuCisgICAgICovCisgICAgcHVibGljIEV4cHJlc3Npb25FdmFsdWF0b3IgZ2V0RXhwcmVzc2lvbkV2YWx1YXRvcigpIHsKKyAgICAgICAgcmV0dXJuIGVsRXhwckV2YWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGFuZGxlUGFnZUV4Y2VwdGlvbihFeGNlcHRpb24gZXgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBzaW5jZSBoYW5kbGVFeGNlcHRpb24oKSBjYWxsZWQgd2l0aCBhCisgICAgICAgIC8vIFRocm93YWJsZSBpbiB0aGUgZ2VuZXJhdGVkIHNlcnZsZXQuCisgICAgICAgIGhhbmRsZVBhZ2VFeGNlcHRpb24oKFRocm93YWJsZSkgZXgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGhhbmRsZVBhZ2VFeGNlcHRpb24oZmluYWwgVGhyb3dhYmxlIHQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibnVsbCBUaHJvd2FibGUiKTsKKworICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpeworICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCl7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvSGFuZGxlUGFnZUV4Y2VwdGlvbih0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBleCA9ICBlLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKWV4OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChTZXJ2bGV0RXhjZXB0aW9uKWV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRvSGFuZGxlUGFnZUV4Y2VwdGlvbih0KTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvSGFuZGxlUGFnZUV4Y2VwdGlvbihUaHJvd2FibGUgdCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZXJyb3JQYWdlVVJMICE9IG51bGwgJiYgIWVycm9yUGFnZVVSTC5lcXVhbHMoIiIpKSB7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTZXQgcmVxdWVzdCBhdHRyaWJ1dGVzLgorICAgICAgICAgICAgICogRG8gbm90IHNldCB0aGUgamF2YXguc2VydmxldC5lcnJvci5leGNlcHRpb24gYXR0cmlidXRlIGhlcmUKKyAgICAgICAgICAgICAqIChpbnN0ZWFkLCBzZXQgaW4gdGhlIGdlbmVyYXRlZCBzZXJ2bGV0IGNvZGUgZm9yIHRoZSBlcnJvciBwYWdlKQorICAgICAgICAgICAgICogaW4gb3JkZXIgdG8gcHJldmVudCB0aGUgRXJyb3JSZXBvcnRWYWx2ZSwgd2hpY2ggaXMgaW52b2tlZCBhcworICAgICAgICAgICAgICogcGFydCBvZiBmb3J3YXJkaW5nIHRoZSByZXF1ZXN0IHRvIHRoZSBlcnJvciBwYWdlLCBmcm9tCisgICAgICAgICAgICAgKiB0aHJvd2luZyBpdCBpZiB0aGUgcmVzcG9uc2UgaGFzIG5vdCBiZWVuIGNvbW1pdHRlZCAodGhlIHJlc3BvbnNlCisgICAgICAgICAgICAgKiB3aWxsIGhhdmUgYmVlbiBjb21taXR0ZWQgaWYgdGhlIGVycm9yIHBhZ2UgaXMgYSBKU1AgcGFnZSkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmpzcC5qc3BFeGNlcHRpb24iLCB0KTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLnN0YXR1c19jb2RlIiwKKyAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUikpOworICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3IucmVxdWVzdF91cmkiLAorICAgICAgICAgICAgKChIdHRwU2VydmxldFJlcXVlc3QpIHJlcXVlc3QpLmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5zZXJ2bGV0X25hbWUiLAorICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmdldFNlcnZsZXROYW1lKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmb3J3YXJkKGVycm9yUGFnZVVSTCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7CisgICAgICAgICAgICAgICAgaW5jbHVkZShlcnJvclBhZ2VVUkwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGUgZXJyb3IgcGFnZSBjb3VsZCBiZSBpbnNpZGUgYW4gaW5jbHVkZS4KKworICAgICAgICAgICAgT2JqZWN0IG5ld0V4Y2VwdGlvbiA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLmV4Y2VwdGlvbiIpOworCisgICAgICAgICAgICAvLyB0PT1udWxsIG1lYW5zIHRoZSBhdHRyaWJ1dGUgd2FzIG5vdCBzZXQuCisgICAgICAgICAgICBpZiggKG5ld0V4Y2VwdGlvbiE9IG51bGwpICYmIChuZXdFeGNlcHRpb249PXQpICkgeworICAgICAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLmV4Y2VwdGlvbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBub3cgY2xlYXIgdGhlIGVycm9yIGNvZGUgLSB0byBwcmV2ZW50IGRvdWJsZSBoYW5kbGluZy4KKyAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLnN0YXR1c19jb2RlIik7CisgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5yZXF1ZXN0X3VyaSIpOworICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3Iuc3RhdHVzX2NvZGUiKTsKKyAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmpzcC5qc3BFeGNlcHRpb24iKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHRocm93IHRoZSBleGNlcHRpb24gd3JhcHBlZCBpbnNpZGUgYSBTZXJ2bGV0RXhjZXB0aW9uLgorICAgICAgICAgICAgLy8gU2V0IHRoZSBleGNlcHRpb24gYXMgdGhlIHJvb3QgY2F1c2UgaW4gdGhlIFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgIC8vIHRvIGdldCBhIHN0YWNrIHRyYWNlIGZvciB0aGUgcmVhbCBwcm9ibGVtCisgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB0aHJvdyAoSU9FeGNlcHRpb24pdDsKKyAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgU2VydmxldEV4Y2VwdGlvbikgdGhyb3cgKFNlcnZsZXRFeGNlcHRpb24pdDsKKyAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pdDsKKworICAgICAgICAgICAgVGhyb3dhYmxlIHJvb3RDYXVzZSA9IG51bGw7CisgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEpzcEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHJvb3RDYXVzZSA9ICgoSnNwRXhjZXB0aW9uKSB0KS5nZXRSb290Q2F1c2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodCBpbnN0YW5jZW9mIEVMRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgcm9vdENhdXNlID0gKChFTEV4Y2VwdGlvbikgdCkuZ2V0Um9vdENhdXNlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyb290Q2F1c2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiAiICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXRNZXNzYWdlKCksIHJvb3RDYXVzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24odCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYXJpYWJsZVJlc29sdmVyIGludGVyZmFjZQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcmVzb2x2ZVZhcmlhYmxlKFN0cmluZyBwTmFtZSkgdGhyb3dzIEVMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHZhcmlhYmxlUmVzb2x2ZXIucmVzb2x2ZVZhcmlhYmxlKHBOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBYTUwtZXNjYXBlIHRoZSBnaXZlbiBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyBUaGUgc3RyaW5nIHRvIGVzY2FwZQorICAgICAqIEByZXR1cm4gVGhlIGVzY2FwZSBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWG1sRXNjYXBlKFN0cmluZyBzKSB7CisgICAgICAgIGlmIChzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChjID09ICc8JykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmx0OyIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICc+JykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmd0OyIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcJycpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiYjMDM5OyIpOyAgICAgICAgLy8gJmFwb3M7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyYnKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImYW1wOyIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICciJykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJiMwMzQ7Iik7ICAgICAgICAvLyAmcXVvdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ByaWV0YXJ5IG1ldGhvZCB0byBldmFsdWF0ZSBFTCBleHByZXNzaW9ucy4KKyAgICAgKiBYWFggLSBUaGlzIG1ldGhvZCBzaG91bGQgZ28gYXdheSBvbmNlIHRoZSBFTCBpbnRlcnByZXRlciBtb3ZlcworICAgICAqIG91dCBvZiBKU1RMIGFuZCBpbnRvIGl0cyBvd24gcHJvamVjdC4gIEZvciBub3csIHRoaXMgaXMgbmVjZXNzYXJ5CisgICAgICogYmVjYXVzZSB0aGUgc3RhbmRhcmQgbWFjaGluZXJ5IGlzIHRvbyBzbG93LgorICAgICAqCisgICAgICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkCisgICAgICogQHBhcmFtIGV4cGVjdGVkVHlwZSBUaGUgZXhwZWN0ZWQgcmVzdWx0aW5nIHR5cGUKKyAgICAgKiBAcGFyYW0gcGFnZUNvbnRleHQgVGhlIHBhZ2UgY29udGV4dAorICAgICAqIEBwYXJhbSBmdW5jdGlvbk1hcCBNYXBzIHByZWZpeCBhbmQgbmFtZSB0byBNZXRob2QKKyAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIGV2YWx1YXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBwcm9wcmlldGFyeUV2YWx1YXRlKGZpbmFsIFN0cmluZyBleHByZXNzaW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGV4cGVjdGVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhZ2VDb250ZXh0IHBhZ2VDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvdGVjdGVkRnVuY3Rpb25NYXBwZXIgZnVuY3Rpb25NYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGVzY2FwZSkKKyAgICAgICAgdGhyb3dzIEVMRXhjZXB0aW9uCisgICAgeworICAgICAgICBPYmplY3QgcmV0VmFsdWU7CisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSl7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldFZhbHVlID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpeworCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbEV4cHJFdmFsLmV2YWx1YXRlKGV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlQ29udGV4dC5nZXRWYXJpYWJsZVJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk1hcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gcmVhbEV4ID0gZXguZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlYWxFeCBpbnN0YW5jZW9mIEVMRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChFTEV4Y2VwdGlvbikgcmVhbEV4OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFTEV4Y2VwdGlvbihyZWFsRXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldFZhbHVlID0gZWxFeHByRXZhbC5ldmFsdWF0ZShleHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlQ29udGV4dC5nZXRWYXJpYWJsZVJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25NYXApOworICAgICAgICB9CisgICAgICAgIGlmIChlc2NhcGUpIHsKKyAgICAgICAgICAgIHJldFZhbHVlID0gWG1sRXNjYXBlKHJldFZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldFZhbHVlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL1BlclRocmVhZFRhZ0hhbmRsZXJQb29sLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvUGVyVGhyZWFkVGFnSGFuZGxlclBvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODY0MGVmCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL1BlclRocmVhZFRhZ0hhbmRsZXJQb29sLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZzsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkNvbnN0YW50czsKKworLyoqCisgKiBUaHJlYWQtbG9jYWwgYmFzZWQgcG9vbCBvZiB0YWcgaGFuZGxlcnMgdGhhdCBjYW4gYmUgcmV1c2VkLgorICoKKyAqIEBhdXRob3IgSmFuIEx1ZWhlCisgKiBAYXV0aG9yIENvc3RpbiBNYW5vbGFjaGUKKyAqLworcHVibGljIGNsYXNzIFBlclRocmVhZFRhZ0hhbmRsZXJQb29sIGV4dGVuZHMgVGFnSGFuZGxlclBvb2wgeworCisgICAgcHJpdmF0ZSBpbnQgbWF4U2l6ZTsKKworICAgIC8vIEZvciBjbGVhbnVwCisgICAgcHJpdmF0ZSBWZWN0b3IgcGVyVGhyZWFkRGF0YVZlY3RvcjsKKworICAgIHByaXZhdGUgVGhyZWFkTG9jYWwgcGVyVGhyZWFkOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGVyVGhyZWFkRGF0YSB7CisgICAgICAgIFRhZyBoYW5kbGVyc1tdOworICAgICAgICBpbnQgY3VycmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdGFnIGhhbmRsZXIgcG9vbCB3aXRoIHRoZSBkZWZhdWx0IGNhcGFjaXR5LgorICAgICAqLworICAgIHB1YmxpYyBQZXJUaHJlYWRUYWdIYW5kbGVyUG9vbCgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgcGVyVGhyZWFkRGF0YVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB7CisgICAgICAgIG1heFNpemUgPSBDb25zdGFudHMuTUFYX1BPT0xfU0laRTsKKyAgICAgICAgU3RyaW5nIG1heFNpemVTID0gZ2V0T3B0aW9uKGNvbmZpZywgT1BUSU9OX01BWFNJWkUsIG51bGwpOworICAgICAgICBpZiAobWF4U2l6ZVMgIT0gbnVsbCkgeworICAgICAgICAgICAgbWF4U2l6ZSA9IEludGVnZXIucGFyc2VJbnQobWF4U2l6ZVMpOworICAgICAgICAgICAgaWYgKG1heFNpemUgPCAwKSB7CisgICAgICAgICAgICAgICAgbWF4U2l6ZSA9IENvbnN0YW50cy5NQVhfUE9PTF9TSVpFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGVyVGhyZWFkID0gbmV3IFRocmVhZExvY2FsKCkgeworICAgICAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBpbml0aWFsVmFsdWUoKSB7CisgICAgICAgICAgICAgICAgUGVyVGhyZWFkRGF0YSBwdGQgPSBuZXcgUGVyVGhyZWFkRGF0YSgpOworICAgICAgICAgICAgICAgIHB0ZC5oYW5kbGVycyA9IG5ldyBUYWdbbWF4U2l6ZV07CisgICAgICAgICAgICAgICAgcHRkLmN1cnJlbnQgPSAtMTsKKyAgICAgICAgICAgICAgICBwZXJUaHJlYWREYXRhVmVjdG9yLmFkZEVsZW1lbnQocHRkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHRkOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5leHQgYXZhaWxhYmxlIHRhZyBoYW5kbGVyIGZyb20gdGhpcyB0YWcgaGFuZGxlciBwb29sLAorICAgICAqIGluc3RhbnRpYXRpbmcgb25lIGlmIHRoaXMgdGFnIGhhbmRsZXIgcG9vbCBpcyBlbXB0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVyQ2xhc3MgVGFnIGhhbmRsZXIgY2xhc3MKKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV1c2VkIG9yIG5ld2x5IGluc3RhbnRpYXRlZCB0YWcgaGFuZGxlcgorICAgICAqCisgICAgICogQHRocm93cyBKc3BFeGNlcHRpb24gaWYgYSB0YWcgaGFuZGxlciBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCisgICAgICovCisgICAgcHVibGljIFRhZyBnZXQoQ2xhc3MgaGFuZGxlckNsYXNzKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKyAgICAgICAgUGVyVGhyZWFkRGF0YSBwdGQgPSAoUGVyVGhyZWFkRGF0YSlwZXJUaHJlYWQuZ2V0KCk7CisgICAgICAgIGlmKHB0ZC5jdXJyZW50ID49MCApIHsKKyAgICAgICAgICAgIHJldHVybiBwdGQuaGFuZGxlcnNbcHRkLmN1cnJlbnQtLV07CisgICAgICAgIH0gZWxzZSB7CisJICAgIHRyeSB7CisJCXJldHVybiAoVGFnKSBoYW5kbGVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKKwkgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gdGFnIGhhbmRsZXIgdG8gdGhpcyB0YWcgaGFuZGxlciBwb29sLCB1bmxlc3MgdGhpcyB0YWcKKyAgICAgKiBoYW5kbGVyIHBvb2wgaGFzIGFscmVhZHkgcmVhY2hlZCBpdHMgY2FwYWNpdHksIGluIHdoaWNoIGNhc2UgdGhlIHRhZworICAgICAqIGhhbmRsZXIncyByZWxlYXNlKCkgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVyIFRhZyBoYW5kbGVyIHRvIGFkZCB0byB0aGlzIHRhZyBoYW5kbGVyIHBvb2wKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXVzZShUYWcgaGFuZGxlcikgeworICAgICAgICBQZXJUaHJlYWREYXRhIHB0ZD0oUGVyVGhyZWFkRGF0YSlwZXJUaHJlYWQuZ2V0KCk7CisJaWYgKHB0ZC5jdXJyZW50IDwgKHB0ZC5oYW5kbGVycy5sZW5ndGggLSAxKSkgeworCSAgICBwdGQuaGFuZGxlcnNbKytwdGQuY3VycmVudF0gPSBoYW5kbGVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGFuZGxlci5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxscyB0aGUgcmVsZWFzZSgpIG1ldGhvZCBvZiBhbGwgdGFnIGhhbmRsZXJzIGluIHRoaXMgdGFnIGhhbmRsZXIgcG9vbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeyAgICAgICAgCisgICAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcGVyVGhyZWFkRGF0YVZlY3Rvci5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkgICAgUGVyVGhyZWFkRGF0YSBwdGQgPSAoUGVyVGhyZWFkRGF0YSllbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKHB0ZC5oYW5kbGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT1wdGQuY3VycmVudDsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwdGQuaGFuZGxlcnNbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHRkLmhhbmRsZXJzW2ldLnJlbGVhc2UoKTsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9Qcm90ZWN0ZWRGdW5jdGlvbk1hcHBlci5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL1Byb3RlY3RlZEZ1bmN0aW9uTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0MzM0NwotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9Qcm90ZWN0ZWRGdW5jdGlvbk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5lbC5GdW5jdGlvbk1hcHBlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnNlY3VyaXR5LlNlY3VyaXR5VXRpbDsKKworLyoqCisgKiBNYXBzIEVMIGZ1bmN0aW9ucyB0byB0aGVpciBKYXZhIG1ldGhvZCBjb3VudGVycGFydHMuICBLZWVwcyB0aGUKKyAqIGFjdHVhbCBNZXRob2Qgb2JqZWN0cyBwcm90ZWN0ZWQgc28gdGhhdCBKU1AgcGFnZXMgY2FuJ3QgaW5kaXJlY3RseQorICogZG8gcmVmbGVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIE1hcmsgUm90aAorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQcm90ZWN0ZWRGdW5jdGlvbk1hcHBlciBpbXBsZW1lbnRzIEZ1bmN0aW9uTWFwcGVyIHsKKworICAgIC8qKiAKKyAgICAgKiBNYXBzICJwcmVmaXg6bmFtZSIgdG8gamF2YS5sYW5nLk1ldGhvZCBvYmplY3RzLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBmbm1hcCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGVyZSBpcyBvbmx5IG9uZSBmdW5jdGlvbiBpbiB0aGUgbWFwLCB0aGlzIGlzIHRoZSBNZXRob2QgZm9yIGl0LgorICAgICAqLworICAgIHByaXZhdGUgTWV0aG9kIHRoZU1ldGhvZCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBoYXMgcHJvdGVjdGVkIGFjY2Vzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFByb3RlY3RlZEZ1bmN0aW9uTWFwcGVyKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlZCBTZXJ2bGV0IGFuZCBUYWcgSGFuZGxlciBpbXBsZW1lbnRhdGlvbnMgY2FsbCB0aGlzCisgICAgICogbWV0aG9kIHRvIHJldHJpZXZlIGFuIGluc3RhbmNlIG9mIHRoZSBQcm90ZWN0ZWRGdW5jdGlvbk1hcHBlci4KKyAgICAgKiBUaGlzIGlzIG5lY2Vzc2FyeSBzaW5jZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0bworICAgICAqIGNyZWF0ZSBpbnN0YW5jZXMgb2YgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgbmV3IHByb3RlY3RlZCBmdW5jdGlvbiBtYXBwZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcm90ZWN0ZWRGdW5jdGlvbk1hcHBlciBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgUHJvdGVjdGVkRnVuY3Rpb25NYXBwZXIgZnVuY01hcHBlcjsKKwlpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpIHsKKwkgICAgZnVuY01hcHBlciA9IChQcm90ZWN0ZWRGdW5jdGlvbk1hcHBlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKwkJbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisJCXB1YmxpYyBPYmplY3QgcnVuKCkgeworCQkgICAgcmV0dXJuIG5ldyBQcm90ZWN0ZWRGdW5jdGlvbk1hcHBlcigpOworCQl9CisJICAgIH0gKTsKKwl9IGVsc2UgeworCSAgICBmdW5jTWFwcGVyID0gbmV3IFByb3RlY3RlZEZ1bmN0aW9uTWFwcGVyKCk7CisJfQorCWZ1bmNNYXBwZXIuZm5tYXAgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKKwlyZXR1cm4gZnVuY01hcHBlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZXMgYSBtYXBwaW5nIGZyb20gdGhlIGdpdmVuIEVMIGZ1bmN0aW9uIHByZWZpeCBhbmQgbmFtZSB0byAKKyAgICAgKiB0aGUgZ2l2ZW4gSmF2YSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm5RTmFtZSBUaGUgRUwgZnVuY3Rpb24gcXVhbGlmaWVkIG5hbWUgKGluY2x1ZGluZyBwcmVmaXgpCisgICAgICogQHBhcmFtIGMgVGhlIGNsYXNzIGNvbnRhaW5pbmcgdGhlIEphdmEgbWV0aG9kCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIEphdmEgbWV0aG9kCisgICAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3VtZW50cyBvZiB0aGUgSmF2YSBtZXRob2QKKyAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gaWYgbm8gbWV0aG9kIHdpdGggdGhlIGdpdmVuIHNpZ25hdHVyZQorICAgICAqICAgICBjb3VsZCBiZSBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtYXBGdW5jdGlvbihTdHJpbmcgZm5RTmFtZSwgZmluYWwgQ2xhc3MgYywKKwkJCSAgICBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgZmluYWwgQ2xhc3NbXSBhcmdzICkgCisgICAgeworCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2Q7CisgICAgICAgIGlmIChTZWN1cml0eVV0aWwuaXNQYWNrYWdlUHJvdGVjdGlvbkVuYWJsZWQoKSl7CisgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgbWV0aG9kID0gKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZClBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpeworCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmdldERlY2xhcmVkTWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3MpOworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0pOyAgICAgIAorICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBleCl7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZ1bmN0aW9uIG1hcHBpbmcgLSBubyBzdWNoIG1ldGhvZDogIgorCQkgICAgKyBleC5nZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkpOyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWV0aG9kID0gYy5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBhcmdzKTsKKyAgICAgICAgICAgIH0gY2F0Y2goIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlICkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmdW5jdGlvbiBtYXBwaW5nIC0gbm8gc3VjaCBtZXRob2Q6ICIKKwkJICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKwl0aGlzLmZubWFwLnB1dChmblFOYW1lLCBtZXRob2QgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZvciB0aGlzIGNsYXNzLCBhbmQgc3RvcmVzIHRoZSBNZXRob2QgZm9yCisgICAgICogdGhlIGdpdmVuIEVMIGZ1bmN0aW9uIHByZWZpeCBhbmQgbmFtZS4gVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IKKyAgICAgKiB0aGUgY2FzZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGZ1bmN0aW9uIGluIHRoZSBFTCBleHByZXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGZuUU5hbWUgVGhlIEVMIGZ1bmN0aW9uIHF1YWxpZmllZCBuYW1lIChpbmNsdWRpbmcgcHJlZml4KQorICAgICAqIEBwYXJhbSBjIFRoZSBjbGFzcyBjb250YWluaW5nIHRoZSBKYXZhIG1ldGhvZAorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBKYXZhIG1ldGhvZAorICAgICAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudHMgb2YgdGhlIEphdmEgbWV0aG9kCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIG5vIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBzaWduYXR1cmUKKyAgICAgKiAgICAgY291bGQgYmUgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcm90ZWN0ZWRGdW5jdGlvbk1hcHBlciBnZXRNYXBGb3JGdW5jdGlvbigKKwkJU3RyaW5nIGZuUU5hbWUsIGZpbmFsIENsYXNzIGMsCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIENsYXNzW10gYXJncyApCisgICAgeworICAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kOworICAgICAgICBQcm90ZWN0ZWRGdW5jdGlvbk1hcHBlciBmdW5jTWFwcGVyOworICAgICAgICBpZiAoU2VjdXJpdHlVdGlsLmlzUGFja2FnZVByb3RlY3Rpb25FbmFibGVkKCkpeworICAgICAgICAgICAgZnVuY01hcHBlciA9IChQcm90ZWN0ZWRGdW5jdGlvbk1hcHBlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb3RlY3RlZEZ1bmN0aW9uTWFwcGVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICBtZXRob2QgPSAoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkCisobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKXsKKworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBFeGNlcHRpb257CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBleCl7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZ1bmN0aW9uIG1hcHBpbmcgLSBubyBzdWNoIG1ldGhvZDogIgorICAgICAgICAgICAgICAgICAgICArIGV4LmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisJICAgIGZ1bmNNYXBwZXIgPSBuZXcgUHJvdGVjdGVkRnVuY3Rpb25NYXBwZXIoKTsKKyAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1ldGhvZCA9IGMuZ2V0RGVjbGFyZWRNZXRob2QobWV0aG9kTmFtZSwgYXJncyk7CisgICAgICAgICAgICB9IGNhdGNoKCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZnVuY3Rpb24gbWFwcGluZyAtIG5vIHN1Y2ggbWV0aG9kOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZ1bmNNYXBwZXIudGhlTWV0aG9kID0gbWV0aG9kOworCXJldHVybiBmdW5jTWFwcGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmVzIHRoZSBzcGVjaWZpZWQgbG9jYWwgbmFtZSBhbmQgcHJlZml4IGludG8gYSBKYXZhLmxhbmcuTWV0aG9kLgorICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgcHJlZml4IGFuZCBsb2NhbCBuYW1lIGFyZSBub3QgZm91bmQuCisgICAgICogCisgICAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IG9mIHRoZSBmdW5jdGlvbgorICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgdGhlIHNob3J0IG5hbWUgb2YgdGhlIGZ1bmN0aW9uCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgbWFwcGluZy4gIE51bGwgbWVhbnMgbm8gZW50cnkgZm91bmQuCisgICAgICoqLworICAgIHB1YmxpYyBNZXRob2QgcmVzb2x2ZUZ1bmN0aW9uKFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUpIHsKKyAgICAgICAgaWYgKHRoaXMuZm5tYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChNZXRob2QpIHRoaXMuZm5tYXAuZ2V0KHByZWZpeCArICI6IiArIGxvY2FsTmFtZSk7CisgICAgICAgIH0KKwlyZXR1cm4gdGhlTWV0aG9kOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL1NlcnZsZXRSZXNwb25zZVdyYXBwZXJJbmNsdWRlLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvU2VydmxldFJlc3BvbnNlV3JhcHBlckluY2x1ZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOThlNzAzCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL1NlcnZsZXRSZXNwb25zZVdyYXBwZXJJbmNsdWRlLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyOworCisvKioKKyAqIFNlcnZsZXRSZXNwb25zZVdyYXBwZXIgdXNlZCBieSB0aGUgSlNQICdpbmNsdWRlJyBhY3Rpb24uCisgKgorICogVGhpcyB3cmFwcGVyIHJlc3BvbnNlIG9iamVjdCBpcyBwYXNzZWQgdG8gUmVxdWVzdERpc3BhdGNoZXIuaW5jbHVkZSgpLCBzbworICogdGhhdCB0aGUgb3V0cHV0IG9mIHRoZSBpbmNsdWRlZCByZXNvdXJjZSBpcyBhcHBlbmRlZCB0byB0aGF0IG9mIHRoZQorICogaW5jbHVkaW5nIHBhZ2UuCisgKgorICogQGF1dGhvciBQaWVycmUgRGVsaXNsZQorICovCisKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVySW5jbHVkZSBleHRlbmRzIEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIHsKKworICAgIC8qKgorICAgICAqIFByaW50V3JpdGVyIHdoaWNoIGFwcGVuZHMgdG8gdGhlIEpzcFdyaXRlciBvZiB0aGUgaW5jbHVkaW5nIHBhZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBQcmludFdyaXRlciBwcmludFdyaXRlcjsKKworICAgIHByaXZhdGUgSnNwV3JpdGVyIGpzcFdyaXRlcjsKKworICAgIHB1YmxpYyBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVySW5jbHVkZShTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIAorCQkJCQkgSnNwV3JpdGVyIGpzcFdyaXRlcikgeworCXN1cGVyKChIdHRwU2VydmxldFJlc3BvbnNlKXJlc3BvbnNlKTsKKwl0aGlzLnByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGpzcFdyaXRlcik7CisJdGhpcy5qc3BXcml0ZXIgPSBqc3BXcml0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBKc3BXcml0ZXIgb2YgdGhlIGluY2x1ZGluZyBwYWdlLgorICAgICAqLworICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXJldHVybiBwcmludFdyaXRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VydmxldE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIG91dHB1dCBidWZmZXIgb2YgdGhlIEpzcFdyaXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGluY2x1ZGluZworICAgICAqIHBhZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXRCdWZmZXIoKSB7CisJdHJ5IHsKKwkgICAganNwV3JpdGVyLmNsZWFyQnVmZmVyKCk7CisJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9UYWdIYW5kbGVyUG9vbC5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL1RhZ0hhbmRsZXJQb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5MTIzMAotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9UYWdIYW5kbGVyUG9vbC5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkNvbnN0YW50czsKKworLyoqCisgKiBQb29sIG9mIHRhZyBoYW5kbGVycyB0aGF0IGNhbiBiZSByZXVzZWQuCisgKgorICogQGF1dGhvciBKYW4gTHVlaGUKKyAqLworcHVibGljIGNsYXNzIFRhZ0hhbmRsZXJQb29sIHsKKworICAgIHByaXZhdGUgVGFnW10gaGFuZGxlcnM7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBPUFRJT05fVEFHUE9PTD0idGFncG9vbENsYXNzTmFtZSI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgT1BUSU9OX01BWFNJWkU9InRhZ3Bvb2xNYXhTaXplIjsKKworICAgIC8vIGluZGV4IG9mIG5leHQgYXZhaWxhYmxlIHRhZyBoYW5kbGVyCisgICAgcHJpdmF0ZSBpbnQgY3VycmVudDsKKworICAgIHB1YmxpYyBzdGF0aWMgVGFnSGFuZGxlclBvb2wgZ2V0VGFnSGFuZGxlclBvb2woIFNlcnZsZXRDb25maWcgY29uZmlnKSB7CisgICAgICAgIFRhZ0hhbmRsZXJQb29sIHJlc3VsdD1udWxsOworCisgICAgICAgIFN0cmluZyB0cENsYXNzTmFtZT1nZXRPcHRpb24oIGNvbmZpZywgT1BUSU9OX1RBR1BPT0wsIG51bGwpOworICAgICAgICBpZiggdHBDbGFzc05hbWUgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgYz1DbGFzcy5mb3JOYW1lKCB0cENsYXNzTmFtZSApOworICAgICAgICAgICAgICAgIHJlc3VsdD0oVGFnSGFuZGxlclBvb2wpYy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIHJlc3VsdD1udWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCByZXN1bHQ9PW51bGwgKSByZXN1bHQ9bmV3IFRhZ0hhbmRsZXJQb29sKCk7CisgICAgICAgIHJlc3VsdC5pbml0KGNvbmZpZyk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCBTZXJ2bGV0Q29uZmlnIGNvbmZpZyApIHsKKyAgICAgICAgaW50IG1heFNpemU9LTE7CisgICAgICAgIFN0cmluZyBtYXhTaXplUz1nZXRPcHRpb24oY29uZmlnLCBPUFRJT05fTUFYU0laRSwgbnVsbCk7CisgICAgICAgIGlmKCBtYXhTaXplUyAhPSBudWxsICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYXhTaXplPUludGVnZXIucGFyc2VJbnQobWF4U2l6ZVMpOworICAgICAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgbWF4U2l6ZT0tMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiggbWF4U2l6ZSA8MCAgKSB7CisgICAgICAgICAgICBtYXhTaXplPUNvbnN0YW50cy5NQVhfUE9PTF9TSVpFOworICAgICAgICB9CisgICAgICAgIHRoaXMuaGFuZGxlcnMgPSBuZXcgVGFnW21heFNpemVdOworICAgICAgICB0aGlzLmN1cnJlbnQgPSAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdGFnIGhhbmRsZXIgcG9vbCB3aXRoIHRoZSBkZWZhdWx0IGNhcGFjaXR5LgorICAgICAqLworICAgIHB1YmxpYyBUYWdIYW5kbGVyUG9vbCgpIHsKKwkvLyBOb3RoaW5nIC0gamFzcGVyIGdlbmVyYXRlZCBzZXJ2bGV0cyBjYWxsIHRoZSBvdGhlciBjb25zdHJ1Y3RvciwKKyAgICAgICAgLy8gdGhpcyBzaG91bGQgYmUgdXNlZCBpbiBmdXR1cmUgKyBpbml0IC4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdGFnIGhhbmRsZXIgcG9vbCB3aXRoIHRoZSBnaXZlbiBjYXBhY2l0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXBhY2l0eSBUYWcgaGFuZGxlciBwb29sIGNhcGFjaXR5CisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHN0YXRpYyBnZXRUYWdIYW5kbGVyUG9vbAorICAgICAqLworICAgIHB1YmxpYyBUYWdIYW5kbGVyUG9vbChpbnQgY2FwYWNpdHkpIHsKKwl0aGlzLmhhbmRsZXJzID0gbmV3IFRhZ1tjYXBhY2l0eV07CisJdGhpcy5jdXJyZW50ID0gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmV4dCBhdmFpbGFibGUgdGFnIGhhbmRsZXIgZnJvbSB0aGlzIHRhZyBoYW5kbGVyIHBvb2wsCisgICAgICogaW5zdGFudGlhdGluZyBvbmUgaWYgdGhpcyB0YWcgaGFuZGxlciBwb29sIGlzIGVtcHR5LgorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXJDbGFzcyBUYWcgaGFuZGxlciBjbGFzcworICAgICAqCisgICAgICogQHJldHVybiBSZXVzZWQgb3IgbmV3bHkgaW5zdGFudGlhdGVkIHRhZyBoYW5kbGVyCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEpzcEV4Y2VwdGlvbiBpZiBhIHRhZyBoYW5kbGVyIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnIGdldChDbGFzcyBoYW5kbGVyQ2xhc3MpIHRocm93cyBKc3BFeGNlcHRpb24geworCVRhZyBoYW5kbGVyID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkKCB0aGlzICkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQgPj0gMCkgeworICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBoYW5kbGVyc1tjdXJyZW50LS1dOworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gT3V0IG9mIHN5bmMgYmxvY2sgLSB0aGVyZSBpcyBubyBuZWVkIGZvciBvdGhlciB0aHJlYWRzIHRvCisgICAgICAgIC8vIHdhaXQgZm9yIHVzIHRvIGNvbnN0cnVjdCBhIHRhZyBmb3IgdGhpcyB0aHJlYWQuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKFRhZykgaGFuZGxlckNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIGdpdmVuIHRhZyBoYW5kbGVyIHRvIHRoaXMgdGFnIGhhbmRsZXIgcG9vbCwgdW5sZXNzIHRoaXMgdGFnCisgICAgICogaGFuZGxlciBwb29sIGhhcyBhbHJlYWR5IHJlYWNoZWQgaXRzIGNhcGFjaXR5LCBpbiB3aGljaCBjYXNlIHRoZSB0YWcKKyAgICAgKiBoYW5kbGVyJ3MgcmVsZWFzZSgpIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlciBUYWcgaGFuZGxlciB0byBhZGQgdG8gdGhpcyB0YWcgaGFuZGxlciBwb29sCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmV1c2UoVGFnIGhhbmRsZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkKCB0aGlzICkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQgPCAoaGFuZGxlcnMubGVuZ3RoIC0gMSkpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVyc1srK2N1cnJlbnRdID0gaGFuZGxlcjsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCBmb3Igb3RoZXIgdGhyZWFkcyB0byB3YWl0IGZvciB1cyB0byByZWxlYXNlCisgICAgICAgIGhhbmRsZXIucmVsZWFzZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxzIHRoZSByZWxlYXNlKCkgbWV0aG9kIG9mIGFsbCBhdmFpbGFibGUgdGFnIGhhbmRsZXJzIGluIHRoaXMgdGFnCisgICAgICogaGFuZGxlciBwb29sLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKCkgeworCWZvciAoaW50IGk9Y3VycmVudDsgaT49MDsgaS0tKSB7CisJICAgIGhhbmRsZXJzW2ldLnJlbGVhc2UoKTsKKwl9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0T3B0aW9uKCBTZXJ2bGV0Q29uZmlnIGNvbmZpZywgU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0VikgeworICAgICAgICBpZiggY29uZmlnID09IG51bGwgKSByZXR1cm4gZGVmYXVsdFY7CisKKyAgICAgICAgU3RyaW5nIHZhbHVlPWNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKG5hbWUpOworICAgICAgICBpZiggdmFsdWUgIT0gbnVsbCApIHJldHVybiB2YWx1ZTsKKyAgICAgICAgaWYoIGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpID09bnVsbCApCisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFY7CisgICAgICAgIHZhbHVlPWNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIobmFtZSk7CisgICAgICAgIGlmKCB2YWx1ZSE9bnVsbCApIHJldHVybiB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3NlY3VyaXR5L1NlY3VyaXR5Q2xhc3NMb2FkLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3NlY3VyaXR5L1NlY3VyaXR5Q2xhc3NMb2FkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzNDkwYgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvc2VjdXJpdHkvU2VjdXJpdHlDbGFzc0xvYWQuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5zZWN1cml0eTsKKworLyoqCisgKiBTdGF0aWMgY2xhc3MgdXNlZCB0byBwcmVsb2FkIGphdmEgY2xhc3NlcyB3aGVuIHVzaW5nIHRoZQorICogSmF2YSBTZWN1cml0eU1hbmFnZXIgc28gdGhhdCB0aGUgZGVmaW5lQ2xhc3NJblBhY2thZ2UKKyAqIFJ1bnRpbWVQZXJtaXNzaW9uIGRvZXMgbm90IHRyaWdnZXIgYW4gQWNjZXNzQ29udHJvbEV4Y2VwdGlvbi4KKyAqCisgKiBAYXV0aG9yIEplYW4tRnJhbmNvaXMgQXJjYW5kCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNlY3VyaXR5Q2xhc3NMb2FkIHsKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2c9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBTZWN1cml0eUNsYXNzTG9hZC5jbGFzcyApOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNlY3VyaXR5Q2xhc3NMb2FkKENsYXNzTG9hZGVyIGxvYWRlcil7CisKKyAgICAgICAgaWYoIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSA9PSBudWxsICl7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgYmFzZVBhY2thZ2UgPSAib3JnLmFwYWNoZS5qYXNwZXIuIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5Kc3BGYWN0b3J5SW1wbCRQcml2aWxlZ2VkR2V0UGFnZUNvbnRleHQiKTsKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5Kc3BGYWN0b3J5SW1wbCRQcml2aWxlZ2VkUmVsZWFzZVBhZ2VDb250ZXh0Iik7CisKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5Kc3BSdW50aW1lTGlicmFyeSIpOworICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICJydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5JFByaXZpbGVnZWRJbnRyb3NwZWN0SGVscGVyIik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5TZXJ2bGV0UmVzcG9uc2VXcmFwcGVySW5jbHVkZSIpOworICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICJydW50aW1lLlRhZ0hhbmRsZXJQb29sIik7CisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuSnNwRnJhZ21lbnRIZWxwZXIiKTsKKworICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICJydW50aW1lLlByb3RlY3RlZEZ1bmN0aW9uTWFwcGVyIik7CisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuUHJvdGVjdGVkRnVuY3Rpb25NYXBwZXIkMSIpOworICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICJydW50aW1lLlByb3RlY3RlZEZ1bmN0aW9uTWFwcGVyJDIiKTsgCisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuUHJvdGVjdGVkRnVuY3Rpb25NYXBwZXIkMyIpOworICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICJydW50aW1lLlByb3RlY3RlZEZ1bmN0aW9uTWFwcGVyJDQiKTsgCisKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5QYWdlQ29udGV4dEltcGwiKTsgICAgICAKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5QYWdlQ29udGV4dEltcGwkMSIpOyAgICAgIAorICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICJydW50aW1lLlBhZ2VDb250ZXh0SW1wbCQyIik7ICAgICAgCisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuUGFnZUNvbnRleHRJbXBsJDMiKTsgICAgICAKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5QYWdlQ29udGV4dEltcGwkNCIpOyAgICAgIAorICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICJydW50aW1lLlBhZ2VDb250ZXh0SW1wbCQ1Iik7ICAgICAgCisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuUGFnZUNvbnRleHRJbXBsJDYiKTsgICAgICAKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5QYWdlQ29udGV4dEltcGwkNyIpOyAgICAgIAorICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICJydW50aW1lLlBhZ2VDb250ZXh0SW1wbCQ4Iik7ICAgICAgCisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuUGFnZUNvbnRleHRJbXBsJDkiKTsgICAgICAKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5QYWdlQ29udGV4dEltcGwkMTAiKTsgICAgICAKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5QYWdlQ29udGV4dEltcGwkMTEiKTsgICAgICAKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5QYWdlQ29udGV4dEltcGwkMTIiKTsgICAgICAKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5QYWdlQ29udGV4dEltcGwkMTMiKTsgICAgICAKKworICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICJydW50aW1lLkpzcENvbnRleHRXcmFwcGVyIik7ICAgCisKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAic2VydmxldC5Kc3BTZXJ2bGV0V3JhcHBlciIpOworCisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuSnNwV3JpdGVySW1wbCQxIik7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiU2VjdXJpdHlDbGFzc0xvYWQiLCBleCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3NlY3VyaXR5L1NlY3VyaXR5VXRpbC5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9zZWN1cml0eS9TZWN1cml0eVV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDYyYTkzCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9zZWN1cml0eS9TZWN1cml0eVV0aWwuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuc2VjdXJpdHk7CisKKy8qKgorICogVXRpbCBjbGFzcyBmb3IgU2VjdXJpdHkgcmVsYXRlZCBvcGVyYXRpb25zLgorICoKKyAqIEBhdXRob3IgSmVhbi1GcmFuY29pcyBBcmNhbmQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2VjdXJpdHlVdGlseworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcGFja2FnZURlZmluaXRpb25FbmFibGVkID0gIAorICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJwYWNrYWdlLmRlZmluaXRpb24iKSA9PSBudWxsID8gZmFsc2UgOiB0cnVlOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgPGNvZGU+U2VjdXJpdHlNYW5hZ2VyPC9jb2RlPiBvbmx5IGlmIFNlY3VyaXR5IGlzIGVuYWJsZWQgQU5ECisgICAgICogcGFja2FnZSBwcm90ZWN0aW9uIG1lY2hhbmlzbSBpcyBlbmFibGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhY2thZ2VQcm90ZWN0aW9uRW5hYmxlZCgpeworICAgICAgICBpZiAocGFja2FnZURlZmluaXRpb25FbmFibGVkICYmIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSAgbnVsbCl7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIAorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9zZXJ2bGV0L0phc3BlckxvYWRlci5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9zZXJ2bGV0L0phc3BlckxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MjZlMjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3NlcnZsZXQvSmFzcGVyTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuQ29uc3RhbnRzOworCisvKioKKyAqIENsYXNzIGxvYWRlciBmb3IgbG9hZGluZyBzZXJ2bGV0IGNsYXNzIGZpbGVzIChjb3JyZXNwb25kaW5nIHRvIEpTUCBmaWxlcykgCisgKiBhbmQgdGFnIGhhbmRsZXIgY2xhc3MgZmlsZXMgKGNvcnJlc3BvbmRpbmcgdG8gdGFnIGZpbGVzKS4KKyAqCisgKiBAYXV0aG9yIEFuaWwgSy4gVmlqZW5kcmFuCisgKiBAYXV0aG9yIEhhcmlzaCBQcmFiYW5kaGFtCisgKiBAYXV0aG9yIEplYW4tRnJhbmNvaXMgQXJjYW5kCisgKi8KK3B1YmxpYyBjbGFzcyBKYXNwZXJMb2FkZXIgZXh0ZW5kcyBVUkxDbGFzc0xvYWRlciB7CisKKyAgICBwcml2YXRlIFBlcm1pc3Npb25Db2xsZWN0aW9uIHBlcm1pc3Npb25Db2xsZWN0aW9uOworICAgIHByaXZhdGUgQ29kZVNvdXJjZSBjb2RlU291cmNlOworICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIHBhcmVudDsKKyAgICBwcml2YXRlIFNlY3VyaXR5TWFuYWdlciBzZWN1cml0eU1hbmFnZXI7CisKKyAgICBwdWJsaWMgSmFzcGVyTG9hZGVyKFVSTFtdIHVybHMsIENsYXNzTG9hZGVyIHBhcmVudCwKKwkJCVBlcm1pc3Npb25Db2xsZWN0aW9uIHBlcm1pc3Npb25Db2xsZWN0aW9uLAorCQkJQ29kZVNvdXJjZSBjb2RlU291cmNlKSB7CisJc3VwZXIodXJscywgcGFyZW50KTsKKwl0aGlzLnBlcm1pc3Npb25Db2xsZWN0aW9uID0gcGVybWlzc2lvbkNvbGxlY3Rpb247CisJdGhpcy5jb2RlU291cmNlID0gY29kZVNvdXJjZTsKKwl0aGlzLnBhcmVudCA9IHBhcmVudDsKKwl0aGlzLnNlY3VyaXR5TWFuYWdlciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gIFRoaXMgbWV0aG9kIHNlYXJjaGVzIGZvcgorICAgICAqIGNsYXNzZXMgaW4gdGhlIHNhbWUgbWFubmVyIGFzIDxjb2RlPmxvYWRDbGFzcyhTdHJpbmcsIGJvb2xlYW4pPC9jb2RlPgorICAgICAqIHdpdGggPGNvZGU+ZmFsc2U8L2NvZGU+IGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjbGFzcyB0byBiZSBsb2FkZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3Mgd2FzIG5vdCBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gKGxvYWRDbGFzcyhuYW1lLCBmYWxzZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgdGhlIGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBzZWFyY2hpbmcgdXNpbmcgdGhlIGZvbGxvd2luZworICAgICAqIGFsZ29yaXRobSB1bnRpbCBpdCBmaW5kcyBhbmQgcmV0dXJucyB0aGUgY2xhc3MuICBJZiB0aGUgY2xhc3MgY2Fubm90CisgICAgICogYmUgZm91bmQsIHJldHVybnMgPGNvZGU+Q2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjwvY29kZT4uCisgICAgICogPHVsPgorICAgICAqIDxsaT5DYWxsIDxjb2RlPmZpbmRMb2FkZWRDbGFzcyhTdHJpbmcpPC9jb2RlPiB0byBjaGVjayBpZiB0aGUKKyAgICAgKiAgICAgY2xhc3MgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQuICBJZiBpdCBoYXMsIHRoZSBzYW1lCisgICAgICogICAgIDxjb2RlPkNsYXNzPC9jb2RlPiBvYmplY3QgaXMgcmV0dXJuZWQuPC9saT4KKyAgICAgKiA8bGk+SWYgdGhlIDxjb2RlPmRlbGVnYXRlPC9jb2RlPiBwcm9wZXJ0eSBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sCisgICAgICogICAgIGNhbGwgdGhlIDxjb2RlPmxvYWRDbGFzcygpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIHBhcmVudCBjbGFzcworICAgICAqICAgICBsb2FkZXIsIGlmIGFueS48L2xpPiAgICAgICAgICAgIAorICAgICAqIDxsaT5DYWxsIDxjb2RlPmZpbmRDbGFzcygpPC9jb2RlPiB0byBmaW5kIHRoaXMgY2xhc3MgaW4gb3VyIGxvY2FsbHkKKyAgICAgKiAgICAgZGVmaW5lZCByZXBvc2l0b3JpZXMuPC9saT4gICAgICAKKyAgICAgKiA8bGk+Q2FsbCB0aGUgPGNvZGU+bG9hZENsYXNzKCk8L2NvZGU+IG1ldGhvZCBvZiBvdXIgcGFyZW50CisgICAgICogICAgIGNsYXNzIGxvYWRlciwgaWYgYW55LjwvbGk+ICAgICAgCisgICAgICogPC91bD4KKyAgICAgKiBJZiB0aGUgY2xhc3Mgd2FzIGZvdW5kIHVzaW5nIHRoZSBhYm92ZSBzdGVwcywgYW5kIHRoZQorICAgICAqIDxjb2RlPnJlc29sdmU8L2NvZGU+IGZsYWcgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoaXMgbWV0aG9kIHdpbGwgdGhlbgorICAgICAqIGNhbGwgPGNvZGU+cmVzb2x2ZUNsYXNzKENsYXNzKTwvY29kZT4gb24gdGhlIHJlc3VsdGluZyBDbGFzcyBvYmplY3QuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgbG9hZGVkCisgICAgICogQHBhcmFtIHJlc29sdmUgSWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiByZXNvbHZlIHRoZSBjbGFzcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3Mgd2FzIG5vdCBmb3VuZAorICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHB1YmxpYyBDbGFzcyBsb2FkQ2xhc3MoZmluYWwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVzb2x2ZSkKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIC8vICgwKSBDaGVjayBvdXIgcHJldmlvdXNseSBsb2FkZWQgY2xhc3MgY2FjaGUKKyAgICAgICAgY2xhenogPSBmaW5kTG9hZGVkQ2xhc3MobmFtZSk7ICAgICAKKyAgICAgICAgaWYgKGNsYXp6ICE9IG51bGwpIHsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChyZXNvbHZlKSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXNvbHZlQ2xhc3MoY2xhenopOyAgICAgICAKKyAgICAgICAgICAgIHJldHVybiAoY2xhenopOyAgICAgICAgCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gKC41KSBQZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGlzIGNsYXNzIHdoZW4gdXNpbmcgYSBTZWN1cml0eU1hbmFnZXIKKyAgICAgICAgaWYgKHNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7ICAgICAKKyAgICAgICAgICAgIGludCBkb3QgPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgICAgICBpZiAoZG90ID49IDApIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdHJ5IHsgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgY2FsbCB0aGUgc2VjdXJpdHkgbWFuYWdlciBzaW5jZSBieSBkZWZhdWx0LCB3ZSBncmFudCB0aGF0IHBhY2thZ2UuCisgICAgICAgICAgICAgICAgICAgIGlmICghIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUiLmVxdWFsc0lnbm9yZUNhc2UobmFtZS5zdWJzdHJpbmcoMCxkb3QpKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eU1hbmFnZXIuY2hlY2tQYWNrYWdlQWNjZXNzKG5hbWUuc3Vic3RyaW5nKDAsZG90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3IgPSAiU2VjdXJpdHkgVmlvbGF0aW9uLCBhdHRlbXB0IHRvIHVzZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJSZXN0cmljdGVkIENsYXNzOiAiICsgbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgc2UucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKGVycm9yKTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorCisJaWYoICFuYW1lLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLkpTUF9QQUNLQUdFX05BTUUpICkgeworICAgICAgICAgICAgLy8gQ2xhc3MgaXMgbm90IGluIG9yZy5hcGFjaGUuanNwLCB0aGVyZWZvcmUsIGhhdmUgb3VyCisgICAgICAgICAgICAvLyBwYXJlbnQgbG9hZCBpdAorICAgICAgICAgICAgY2xhenogPSBwYXJlbnQubG9hZENsYXNzKG5hbWUpOyAgICAgICAgICAgIAorCSAgICBpZiggcmVzb2x2ZSApCisJCXJlc29sdmVDbGFzcyhjbGF6eik7CisJICAgIHJldHVybiBjbGF6ejsKKwl9CisKKwlyZXR1cm4gZmluZENsYXNzKG5hbWUpOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIERlbGVnYXRlIHRvIHBhcmVudAorICAgICAqIAorICAgICAqIEBzZWUgamF2YS5sYW5nLkNsYXNzTG9hZGVyI2dldFJlc291cmNlQXNTdHJlYW0oamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgbmFtZSkgeworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHBhcmVudC5nZXRSZXNvdXJjZUFzU3RyZWFtKG5hbWUpOworICAgICAgICBpZiAoaXMgPT0gbnVsbCkgeworICAgICAgICAgICAgVVJMIHVybCA9IGZpbmRSZXNvdXJjZShuYW1lKTsKKyAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGlzID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlzOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFBlcm1pc3Npb25zIGZvciBhIENvZGVTb3VyY2UuCisgICAgICoKKyAgICAgKiBTaW5jZSB0aGlzIENsYXNzTG9hZGVyIGlzIG9ubHkgdXNlZCBmb3IgYSBKU1AgcGFnZSBpbgorICAgICAqIGEgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQsIHdlIGp1c3QgcmV0dXJuIG91ciBwcmVzZXQKKyAgICAgKiBQZXJtaXNzaW9uQ29sbGVjdGlvbiBmb3IgdGhlIHdlYiBhcHAgY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2RlU291cmNlIENvZGUgc291cmNlIHdoZXJlIHRoZSBjb2RlIHdhcyBsb2FkZWQgZnJvbQorICAgICAqIEByZXR1cm4gUGVybWlzc2lvbkNvbGxlY3Rpb24gZm9yIENvZGVTb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUGVybWlzc2lvbkNvbGxlY3Rpb24gZ2V0UGVybWlzc2lvbnMoQ29kZVNvdXJjZSBjb2RlU291cmNlKSB7CisgICAgICAgIHJldHVybiBwZXJtaXNzaW9uQ29sbGVjdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3NlcnZsZXQvSnNwQ1NlcnZsZXRDb250ZXh0LmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3NlcnZsZXQvSnNwQ1NlcnZsZXRDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzMzU4MgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvc2VydmxldC9Kc3BDU2VydmxldENvbnRleHQuamF2YQpAQCAtMCwwICsxLDQzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuc2VydmxldDsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuUmVxdWVzdERpc3BhdGNoZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworCisKKy8qKgorICogU2ltcGxlIDxjb2RlPlNlcnZsZXRDb250ZXh0PC9jb2RlPiBpbXBsZW1lbnRhdGlvbiB3aXRob3V0CisgKiBIVFRQLXNwZWNpZmljIG1ldGhvZHMuCisgKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaCAocHJAd2ViYXBwLmRlKQorICovCisKK3B1YmxpYyBjbGFzcyBKc3BDU2VydmxldENvbnRleHQgaW1wbGVtZW50cyBTZXJ2bGV0Q29udGV4dCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBTZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIG15QXR0cmlidXRlczsKKworCisgICAgLyoqCisgICAgICogVGhlIGxvZyB3cml0ZXIgd2Ugd2lsbCB3cml0ZSBsb2cgbWVzc2FnZXMgdG8uCisgICAgICovCisgICAgcHJvdGVjdGVkIFByaW50V3JpdGVyIG15TG9nV3JpdGVyOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFzZSBVUkwgKGRvY3VtZW50IHJvb3QpIGZvciB0aGlzIGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFVSTCBteVJlc291cmNlQmFzZVVSTDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIFNlcnZsZXRDb250ZXh0IGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFMb2dXcml0ZXIgUHJpbnRXcml0ZXIgd2hpY2ggaXMgdXNlZCBmb3IgPGNvZGU+bG9nKCk8L2NvZGU+IGNhbGxzCisgICAgICogQHBhcmFtIGFSZXNvdXJjZUJhc2VVUkwgUmVzb3VyY2UgYmFzZSBVUkwKKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwQ1NlcnZsZXRDb250ZXh0KFByaW50V3JpdGVyIGFMb2dXcml0ZXIsIFVSTCBhUmVzb3VyY2VCYXNlVVJMKSB7CisKKyAgICAgICAgbXlBdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBteUxvZ1dyaXRlciA9IGFMb2dXcml0ZXI7CisgICAgICAgIG15UmVzb3VyY2VCYXNlVVJMID0gYVJlc291cmNlQmFzZVVSTDsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgYXR0cmlidXRlLCBpZiBhbnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICByZXR1cm4gKG15QXR0cmlidXRlcy5nZXQobmFtZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgY29udGV4dCBhdHRyaWJ1dGUgbmFtZXMuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeworCisgICAgICAgIHJldHVybiAobXlBdHRyaWJ1dGVzLmtleXMoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VydmxldCBjb250ZXh0IGZvciB0aGUgc3BlY2lmaWVkIHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpcGF0aCBTZXJ2ZXItcmVsYXRpdmUgcGF0aCBzdGFydGluZyB3aXRoICcvJworICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRDb250ZXh0KFN0cmluZyB1cmlwYXRoKSB7CisKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVyCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBuYW1lcyBvZiBjb250ZXh0IGluaXRpYWxpemF0aW9uCisgICAgICogcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCkgeworCisgICAgICAgIHJldHVybiAobmV3IFZlY3RvcigpLmVsZW1lbnRzKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNlcnZsZXQgQVBJIG1ham9yIHZlcnNpb24gbnVtYmVyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWFqb3JWZXJzaW9uKCkgeworCisgICAgICAgIHJldHVybiAoMik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUlNRSB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIGZpbGVuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgRmlsZW5hbWUgd2hvc2UgTUlNRSB0eXBlIGlzIHJlcXVlc3RlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoU3RyaW5nIGZpbGUpIHsKKworICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNlcnZsZXQgQVBJIG1pbm9yIHZlcnNpb24gbnVtYmVyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWlub3JWZXJzaW9uKCkgeworCisgICAgICAgIHJldHVybiAoMyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHJlcXVlc3QgZGlzcGF0Y2hlciBmb3IgdGhlIHNwZWNpZmllZCBzZXJ2bGV0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0ZWQgc2VydmxldAorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0RGlzcGF0Y2hlciBnZXROYW1lZERpc3BhdGNoZXIoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlYWwgcGF0aCBmb3IgdGhlIHNwZWNpZmllZCBjb250ZXh0LXJlbGF0aXZlCisgICAgICogdmlydHVhbCBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIGNvbnRleHQtcmVsYXRpdmUgdmlydHVhbCBwYXRoIHRvIHJlc29sdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxQYXRoKFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgaWYgKCFteVJlc291cmNlQmFzZVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAoZ2V0UmVzb3VyY2UocGF0aCkuZ2V0RmlsZSgpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgcmVxdWVzdCBkaXNwYXRjaGVyIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRleHQtcmVsYXRpdmUgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIENvbnRleHQtcmVsYXRpdmUgcGF0aCBmb3Igd2hpY2ggdG8gYWNxdWlyZSBhIGRpc3BhdGNoZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0UmVxdWVzdERpc3BhdGNoZXIoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBVUkwgb2JqZWN0IG9mIGEgcmVzb3VyY2UgdGhhdCBpcyBtYXBwZWQgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIGNvbnRleHQtcmVsYXRpdmUgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIENvbnRleHQtcmVsYXRpdmUgcGF0aCBvZiB0aGUgZGVzaXJlZCByZXNvdXJjZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgdGhlIHJlc291cmNlIHBhdGggaXMKKyAgICAgKiAgbm90IHByb3Blcmx5IGZvcm1lZAorICAgICAqLworICAgIHB1YmxpYyBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIHBhdGgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworCisgICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCIvIikpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKCJQYXRoICciICsgcGF0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGRvZXMgbm90IHN0YXJ0IHdpdGggJy8nIik7CisgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKG15UmVzb3VyY2VCYXNlVVJMLCBwYXRoLnN1YnN0cmluZygxKSk7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHVybCA9IG51bGw7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXJsOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gSW5wdXRTdHJlYW0gYWxsb3dpbmcgYWNjZXNzIHRvIHRoZSByZXNvdXJjZSBhdCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgY29udGV4dC1yZWxhdGl2ZSBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggQ29udGV4dC1yZWxhdGl2ZSBwYXRoIG9mIHRoZSBkZXNpcmVkIHJlc291cmNlCisgICAgICovCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHBhdGgpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIChnZXRSZXNvdXJjZShwYXRoKS5vcGVuU3RyZWFtKCkpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiByZXNvdXJjZSBwYXRocyBmb3IgdGhlICJkaXJlY3RvcnkiIGF0IHRoZQorICAgICAqIHNwZWNpZmllZCBjb250ZXh0IHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBDb250ZXh0LXJlbGF0aXZlIGJhc2UgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBTZXQgZ2V0UmVzb3VyY2VQYXRocyhTdHJpbmcgcGF0aCkgeworCisgICAgICAgIFNldCB0aGVQYXRocyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIGlmICghcGF0aC5lbmRzV2l0aCgiLyIpKQorICAgICAgICAgICAgcGF0aCArPSAiLyI7CisgICAgICAgIFN0cmluZyBiYXNlUGF0aCA9IGdldFJlYWxQYXRoKHBhdGgpOworICAgICAgICBpZiAoYmFzZVBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAodGhlUGF0aHMpOworICAgICAgICBGaWxlIHRoZUJhc2VEaXIgPSBuZXcgRmlsZShiYXNlUGF0aCk7CisgICAgICAgIGlmICghdGhlQmFzZURpci5leGlzdHMoKSB8fCAhdGhlQmFzZURpci5pc0RpcmVjdG9yeSgpKQorICAgICAgICAgICAgcmV0dXJuICh0aGVQYXRocyk7CisgICAgICAgIFN0cmluZyB0aGVGaWxlc1tdID0gdGhlQmFzZURpci5saXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhlRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgdGVzdEZpbGUgPSBuZXcgRmlsZShiYXNlUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgdGhlRmlsZXNbaV0pOworICAgICAgICAgICAgaWYgKHRlc3RGaWxlLmlzRmlsZSgpKQorICAgICAgICAgICAgICAgIHRoZVBhdGhzLmFkZChwYXRoICsgdGhlRmlsZXNbaV0pOworICAgICAgICAgICAgZWxzZSBpZiAodGVzdEZpbGUuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgICAgICB0aGVQYXRocy5hZGQocGF0aCArIHRoZUZpbGVzW2ldICsgIi8iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHRoZVBhdGhzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc2VydmVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySW5mbygpIHsKKworICAgICAgICByZXR1cm4gKCJKc3BDU2VydmxldENvbnRleHQvMS4wIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG51bGwgcmVmZXJlbmNlIGZvciB0aGUgc3BlY2lmaWVkIHNlcnZsZXQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHJlcXVlc3RlZCBzZXJ2bGV0CisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkIHdpdGggbm8gcmVwbGFjZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldCBnZXRTZXJ2bGV0KFN0cmluZyBuYW1lKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgc2VydmxldCBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldENvbnRleHROYW1lKCkgeworCisgICAgICAgIHJldHVybiAoZ2V0U2VydmVySW5mbygpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGVtcHR5IGVudW1lcmF0aW9uIG9mIHNlcnZsZXQgbmFtZXMuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkIHdpdGggbm8gcmVwbGFjZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0U2VydmxldE5hbWVzKCkgeworCisgICAgICAgIHJldHVybiAobmV3IFZlY3RvcigpLmVsZW1lbnRzKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZW1wdHkgZW51bWVyYXRpb24gb2Ygc2VydmxldHMuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkIHdpdGggbm8gcmVwbGFjZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0U2VydmxldHMoKSB7CisKKyAgICAgICAgcmV0dXJuIChuZXcgVmVjdG9yKCkuZWxlbWVudHMoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExvZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKKworICAgICAgICBteUxvZ1dyaXRlci5wcmludGxuKG1lc3NhZ2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGFuZCBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gYmUgbG9nZ2VkCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2UgbG9nKFN0cmluZyxUaHJvd2FibGUpIGluc3RlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2coRXhjZXB0aW9uIGV4Y2VwdGlvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKKworICAgICAgICBsb2cobWVzc2FnZSwgZXhjZXB0aW9uKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGJlIGxvZ2dlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCisgICAgICAgIG15TG9nV3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIGV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UobXlMb2dXcml0ZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBjb250ZXh0IGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBteUF0dHJpYnV0ZXMucmVtb3ZlKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgb3IgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbnRleHQgYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dCBhdHRyaWJ1dGUgdG8gc2V0CisgICAgICogQHBhcmFtIHZhbHVlIENvcnJlc3BvbmRpbmcgYXR0cmlidXRlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKworICAgICAgICBteUF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKKworICAgIH0KKworCisKK30KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvc2VydmxldC9Kc3BTZXJ2bGV0LmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3NlcnZsZXQvSnNwU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNTAzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3NlcnZsZXQvSnNwU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMzE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5zZXJ2bGV0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5FbWJlZGRlZFNlcnZsZXRPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLk9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuSnNwUnVudGltZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuTG9jYWxpemVyOworCisvKioKKyAqIFRoZSBKU1AgZW5naW5lIChhLmsuYSBKYXNwZXIpLgorICoKKyAqIFRoZSBzZXJ2bGV0IGNvbnRhaW5lciBpcyByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGEKKyAqIFVSTENsYXNzTG9hZGVyIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQgSmFzcGVyCisgKiBpcyBiZWluZyB1c2VkIGluLiBKYXNwZXIgd2lsbCB0cnkgZ2V0IHRoZSBUb21jYXQKKyAqIFNlcnZsZXRDb250ZXh0IGF0dHJpYnV0ZSBmb3IgaXRzIFNlcnZsZXRDb250ZXh0IGNsYXNzCisgKiBsb2FkZXIsIGlmIHRoYXQgZmFpbHMsIGl0IHVzZXMgdGhlIHBhcmVudCBjbGFzcyBsb2FkZXIuCisgKiBJbiBlaXRoZXIgY2FzZSwgaXQgbXVzdCBiZSBhIFVSTENsYXNzTG9hZGVyLgorICoKKyAqIEBhdXRob3IgQW5pbCBLLiBWaWplbmRyYW4KKyAqIEBhdXRob3IgSGFyaXNoIFByYWJhbmRoYW0KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICogQGF1dGhvciBHbGVubiBOaWVsc2VuCisgKi8KK3B1YmxpYyBjbGFzcyBKc3BTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgLy8gTG9nZ2VyCisgICAgcHJpdmF0ZSBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSnNwU2VydmxldC5jbGFzcyk7CisKKyAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQ7CisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29uZmlnIGNvbmZpZzsKKyAgICBwcml2YXRlIE9wdGlvbnMgb3B0aW9uczsKKyAgICBwcml2YXRlIEpzcFJ1bnRpbWVDb250ZXh0IHJjdHh0OworCisKKyAgICAvKgorICAgICAqIEluaXRpYWxpemVzIHRoaXMgSnNwU2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBzdXBlci5pbml0KGNvbmZpZyk7CisgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOworICAgICAgICB0aGlzLmNvbnRleHQgPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICAgICAgCisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpTUCBSdW50aW1lIENvbnRleHQKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGEgY3VzdG9tIE9wdGlvbnMgaW1wbGVtZW50YXRpb24KKyAgICAgICAgU3RyaW5nIGVuZ2luZU9wdGlvbnNOYW1lID0gCisgICAgICAgICAgICBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiZW5naW5lT3B0aW9uc0NsYXNzIik7CisgICAgICAgIGlmIChlbmdpbmVPcHRpb25zTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBJbnN0YW50aWF0ZSB0aGUgaW5kaWNhdGVkIE9wdGlvbnMgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgICAgIENsYXNzIGVuZ2luZU9wdGlvbnNDbGFzcyA9IGxvYWRlci5sb2FkQ2xhc3MoZW5naW5lT3B0aW9uc05hbWUpOworICAgICAgICAgICAgICAgIENsYXNzW10gY3RvclNpZyA9IHsgU2VydmxldENvbmZpZy5jbGFzcywgU2VydmxldENvbnRleHQuY2xhc3MgfTsKKyAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvciBjdG9yID0gZW5naW5lT3B0aW9uc0NsYXNzLmdldENvbnN0cnVjdG9yKGN0b3JTaWcpOworICAgICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSB7IGNvbmZpZywgY29udGV4dCB9OworICAgICAgICAgICAgICAgIG9wdGlvbnMgPSAoT3B0aW9ucykgY3Rvci5uZXdJbnN0YW5jZShhcmdzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBsb2NhbGl6ZSB0aGlzLgorICAgICAgICAgICAgICAgIGxvZy53YXJuKCJGYWlsZWQgdG8gbG9hZCBlbmdpbmVPcHRpb25zQ2xhc3MiLCBlKTsKKyAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgT3B0aW9ucyBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBuZXcgRW1iZWRkZWRTZXJ2bGV0T3B0aW9ucyhjb25maWcsIGNvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IE9wdGlvbnMgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIG9wdGlvbnMgPSBuZXcgRW1iZWRkZWRTZXJ2bGV0T3B0aW9ucyhjb25maWcsIGNvbnRleHQpOworICAgICAgICB9CisgICAgICAgIHJjdHh0ID0gbmV3IEpzcFJ1bnRpbWVDb250ZXh0KGNvbnRleHQsIG9wdGlvbnMpOworICAgICAgICAKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5tZXNzYWdlLnNjcmF0Y2guZGlyLmlzIiwKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXRTY3JhdGNoRGlyKCkudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgbG9nLmRlYnVnKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AubWVzc2FnZS5kb250Lm1vZGlmeS5zZXJ2bGV0cyIpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIEpTUHMgZm9yIHdoaWNoIEpzcFNlcnZsZXRXcmFwcGVycyBleGlzdCwgaS5lLiwKKyAgICAgKiB0aGUgbnVtYmVyIG9mIEpTUHMgdGhhdCBoYXZlIGJlZW4gbG9hZGVkIGludG8gdGhlIHdlYmFwcCB3aXRoIHdoaWNoCisgICAgICogdGhpcyBKc3BTZXJ2bGV0IGlzIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGluZm8gbWF5IGJlIHVzZWQgZm9yIG1vbml0b3JpbmcgcHVycG9zZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgSlNQcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgaW50byB0aGUgd2ViYXBwIHdpdGgKKyAgICAgKiB3aGljaCB0aGlzIEpzcFNlcnZsZXQgaXMgYXNzb2NpYXRlZAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SnNwQ291bnQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJjdHh0LmdldEpzcENvdW50KCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIEpTUCByZWxvYWQgY291bnRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb3VudCBWYWx1ZSB0byB3aGljaCB0byByZXNldCB0aGUgSlNQIHJlbG9hZCBjb3VudGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SnNwUmVsb2FkQ291bnQoaW50IGNvdW50KSB7CisgICAgICAgIHRoaXMucmN0eHQuc2V0SnNwUmVsb2FkQ291bnQoY291bnQpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIEpTUHMgdGhhdCBoYXZlIGJlZW4gcmVsb2FkZWQuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGluZm8gbWF5IGJlIHVzZWQgZm9yIG1vbml0b3JpbmcgcHVycG9zZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgSlNQcyAoaW4gdGhlIHdlYmFwcCB3aXRoIHdoaWNoIHRoaXMgSnNwU2VydmxldCBpcworICAgICAqIGFzc29jaWF0ZWQpIHRoYXQgaGF2ZSBiZWVuIHJlbG9hZGVkCisgICAgICovCisgICAgcHVibGljIGludCBnZXRKc3BSZWxvYWRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmN0eHQuZ2V0SnNwUmVsb2FkQ291bnQoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIDxwPkxvb2sgZm9yIGEgPGVtPnByZWNvbXBpbGF0aW9uIHJlcXVlc3Q8L2VtPiBhcyBkZXNjcmliZWQgaW4KKyAgICAgKiBTZWN0aW9uIDguNC4yIG9mIHRoZSBKU1AgMS4yIFNwZWNpZmljYXRpb24uICA8c3Ryb25nPldBUk5JTkc8L3N0cm9uZz4gLQorICAgICAqIHdlIGNhbm5vdCB1c2UgPGNvZGU+cmVxdWVzdC5nZXRQYXJhbWV0ZXIoKTwvY29kZT4gZm9yIHRoaXMsIGJlY2F1c2UKKyAgICAgKiB0aGF0IHdpbGwgdHJpZ2dlciBwYXJzaW5nIGFsbCBvZiB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzLCBhbmQgbm90IGdpdmUKKyAgICAgKiBhIHNlcnZsZXQgdGhlIG9wcG9ydHVuaXR5IHRvIGNhbGwKKyAgICAgKiA8Y29kZT5yZXF1ZXN0LnNldENoYXJhY3RlckVuY29kaW5nKCk8L2NvZGU+IGZpcnN0LjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVzZXQgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhbiBpbnZhbGlkIHBhcmFtZXRlciB2YWx1ZSBmb3IgdGhlCisgICAgICogIDxjb2RlPmpzcF9wcmVjb21waWxlPC9jb2RlPiBwYXJhbWV0ZXIgbmFtZSBpcyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBib29sZWFuIHByZUNvbXBpbGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgcXVlcnlTdHJpbmcgPSByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCk7CisgICAgICAgIGlmIChxdWVyeVN0cmluZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc3RhcnQgPSBxdWVyeVN0cmluZy5pbmRleE9mKENvbnN0YW50cy5QUkVDT01QSUxFKTsKKyAgICAgICAgaWYgKHN0YXJ0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgcXVlcnlTdHJpbmcgPQorICAgICAgICAgICAgcXVlcnlTdHJpbmcuc3Vic3RyaW5nKHN0YXJ0ICsgQ29uc3RhbnRzLlBSRUNPTVBJTEUubGVuZ3RoKCkpOworICAgICAgICBpZiAocXVlcnlTdHJpbmcubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsgICAgICAgICAgICAgLy8gP2pzcF9wcmVjb21waWxlCisgICAgICAgIH0KKyAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nLnN0YXJ0c1dpdGgoIiYiKSkgeworICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsgICAgICAgICAgICAgLy8gP2pzcF9wcmVjb21waWxlJmZvbz1iYXIuLi4KKyAgICAgICAgfQorICAgICAgICBpZiAoIXF1ZXJ5U3RyaW5nLnN0YXJ0c1dpdGgoIj0iKSkgeworICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7ICAgICAgICAgICAgLy8gcGFydCBvZiBzb21lIG90aGVyIG5hbWUgb3IgdmFsdWUKKyAgICAgICAgfQorICAgICAgICBpbnQgbGltaXQgPSBxdWVyeVN0cmluZy5sZW5ndGgoKTsKKyAgICAgICAgaW50IGFtcGVyc2FuZCA9IHF1ZXJ5U3RyaW5nLmluZGV4T2YoIiYiKTsKKyAgICAgICAgaWYgKGFtcGVyc2FuZCA+IDApIHsKKyAgICAgICAgICAgIGxpbWl0ID0gYW1wZXJzYW5kOworICAgICAgICB9CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IHF1ZXJ5U3RyaW5nLnN1YnN0cmluZygxLCBsaW1pdCk7CisgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoInRydWUiKSkgeworICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsgICAgICAgICAgICAgLy8gP2pzcF9wcmVjb21waWxlPXRydWUKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5lcXVhbHMoImZhbHNlIikpIHsKKyAgICAgICAgICAgIC8vIFNwZWMgc2F5cyBpZiBqc3BfcHJlY29tcGlsZT1mYWxzZSwgdGhlIHJlcXVlc3Qgc2hvdWxkIG5vdAorICAgICAgICAgICAgLy8gYmUgZGVsaXZlcmVkIHRvIHRoZSBKU1AgcGFnZTsgdGhlIGVhc2llc3Qgd2F5IHRvIGltcGxlbWVudAorICAgICAgICAgICAgLy8gdGhpcyBpcyB0byBzZXQgdGhlIGZsYWcgdG8gdHJ1ZSwgYW5kIHByZWNvbXBpbGUgdGhlIHBhZ2UgYW55d2F5LgorICAgICAgICAgICAgLy8gVGhpcyBzdGlsbCBjb25mb3JtcyB0byB0aGUgc3BlYywgc2luY2UgaXQgc2F5cyB0aGUKKyAgICAgICAgICAgIC8vIHByZWNvbXBpbGF0aW9uIHJlcXVlc3QgY2FuIGJlIGlnbm9yZWQuCisgICAgICAgICAgICByZXR1cm4gKHRydWUpOyAgICAgICAgICAgICAvLyA/anNwX3ByZWNvbXBpbGU9ZmFsc2UKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJDYW5ub3QgaGF2ZSByZXF1ZXN0IHBhcmFtZXRlciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5QUkVDT01QSUxFICsgIiBzZXQgdG8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgICAgIH0KKworICAgIH0KKyAgICAKKworICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UgKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICAgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIGpzcFVyaSA9IG51bGw7CisKKyAgICAgICAgU3RyaW5nIGpzcEZpbGUgPSAoU3RyaW5nKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuSlNQX0ZJTEUpOworICAgICAgICBpZiAoanNwRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBKU1AgaXMgc3BlY2lmaWVkIHZpYSA8anNwLWZpbGU+IGluIDxzZXJ2bGV0PiBkZWNsYXJhdGlvbgorICAgICAgICAgICAganNwVXJpID0ganNwRmlsZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIHJlcXVlc3RlZCBKU1AgaGFzIGJlZW4gdGhlIHRhcmdldCBvZiBhCisgICAgICAgICAgICAgKiBSZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAganNwVXJpID0gKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLklOQ19TRVJWTEVUX1BBVEgpOworICAgICAgICAgICAgaWYgKGpzcFVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBSZXF1ZXN0ZWQgSlNQIGhhcyBiZWVuIHRhcmdldCBvZgorICAgICAgICAgICAgICAgICAqIFJlcXVlc3REaXNwYXRjaGVyLmluY2x1ZGUoKS4gSXRzIHBhdGggaXMgYXNzZW1ibGVkIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICogcmVsZXZhbnQgamF2YXguc2VydmxldC5pbmNsdWRlLiogcmVxdWVzdCBhdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGhJbmZvID0gKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLnBhdGhfaW5mbyIpOworICAgICAgICAgICAgICAgIGlmIChwYXRoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGpzcFVyaSArPSBwYXRoSW5mbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogUmVxdWVzdGVkIEpTUCBoYXMgbm90IGJlZW4gdGhlIHRhcmdldCBvZiBhIAorICAgICAgICAgICAgICAgICAqIFJlcXVlc3REaXNwYXRjaGVyLmluY2x1ZGUoKS4gUmVjb25zdHJ1Y3QgaXRzIHBhdGggZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgKiByZXF1ZXN0J3MgZ2V0U2VydmxldFBhdGgoKSBhbmQgZ2V0UGF0aEluZm8oKQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGpzcFVyaSA9IHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aEluZm8gPSByZXF1ZXN0LmdldFBhdGhJbmZvKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhdGhJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAganNwVXJpICs9IHBhdGhJbmZvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJKc3BFbmdpbmUgLS0+ICIgKyBqc3BVcmkpOworICAgICAgICAgICAgbG9nLmRlYnVnKCJcdCAgICAgU2VydmxldFBhdGg6ICIgKyByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkpOworICAgICAgICAgICAgbG9nLmRlYnVnKCJcdCAgICAgICAgUGF0aEluZm86ICIgKyByZXF1ZXN0LmdldFBhdGhJbmZvKCkpOworICAgICAgICAgICAgbG9nLmRlYnVnKCJcdCAgICAgICAgUmVhbFBhdGg6ICIgKyBjb250ZXh0LmdldFJlYWxQYXRoKGpzcFVyaSkpOworICAgICAgICAgICAgbG9nLmRlYnVnKCJcdCAgICAgIFJlcXVlc3RVUkk6ICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgICAgICBsb2cuZGVidWcoIlx0ICAgICBRdWVyeVN0cmluZzogIiArIHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSk7CisgICAgICAgICAgICBsb2cuZGVidWcoIlx0ICBSZXF1ZXN0IFBhcmFtczogIik7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlx0XHQgIiArIG5hbWUgKyAiID0gIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXF1ZXN0LmdldFBhcmFtZXRlcihuYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9vbGVhbiBwcmVjb21waWxlID0gcHJlQ29tcGlsZShyZXF1ZXN0KTsKKyAgICAgICAgICAgIHNlcnZpY2VKc3BGaWxlKHJlcXVlc3QsIHJlc3BvbnNlLCBqc3BVcmksIG51bGwsIHByZWNvbXBpbGUpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gY2F0Y2ggKFNlcnZsZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiSnNwU2VydmxldC5kZXN0cm95KCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJjdHh0LmRlc3Ryb3koKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisgICAgcHJpdmF0ZSB2b2lkIHNlcnZpY2VKc3BGaWxlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcganNwVXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uLCBib29sZWFuIHByZWNvbXBpbGUpCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgSnNwU2VydmxldFdyYXBwZXIgd3JhcHBlciA9CisgICAgICAgICAgICAoSnNwU2VydmxldFdyYXBwZXIpIHJjdHh0LmdldFdyYXBwZXIoanNwVXJpKTsKKyAgICAgICAgaWYgKHdyYXBwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgICAgICB3cmFwcGVyID0gKEpzcFNlcnZsZXRXcmFwcGVyKSByY3R4dC5nZXRXcmFwcGVyKGpzcFVyaSk7CisgICAgICAgICAgICAgICAgaWYgKHdyYXBwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVxdWVzdGVkIEpTUCBwYWdlIGV4aXN0cywgdG8gYXZvaWQKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRpbmcgdW5uZWNlc3NhcnkgZGlyZWN0b3JpZXMgYW5kIGZpbGVzLgorICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBjb250ZXh0LmdldFJlc291cmNlKGpzcFVyaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Vycm9yUGFnZSA9IGV4Y2VwdGlvbiAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICB3cmFwcGVyID0gbmV3IEpzcFNlcnZsZXRXcmFwcGVyKGNvbmZpZywgb3B0aW9ucywganNwVXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXJyb3JQYWdlLCByY3R4dCk7CisgICAgICAgICAgICAgICAgICAgIHJjdHh0LmFkZFdyYXBwZXIoanNwVXJpLHdyYXBwZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdyYXBwZXIuc2VydmljZShyZXF1ZXN0LCByZXNwb25zZSwgcHJlY29tcGlsZSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvc2VydmxldC9Kc3BTZXJ2bGV0V3JhcHBlci5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9zZXJ2bGV0L0pzcFNlcnZsZXRXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzYTE4NQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvc2VydmxldC9Kc3BTZXJ2bGV0V3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsNDg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5zZXJ2bGV0OworCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2luZ2xlVGhyZWFkTW9kZWw7CitpbXBvcnQgamF2YXguc2VydmxldC5VbmF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdJbmZvOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSmFzcGVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkpzcENvbXBpbGF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkVycm9yRGlzcGF0Y2hlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5KYXZhY0Vycm9yRGV0YWlsOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkpzcFJ1bnRpbWVDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFNvdXJjZURlcGVuZGVudDsKKworLyoqCisgKiBUaGUgSlNQIGVuZ2luZSAoYS5rLmEgSmFzcGVyKS4KKyAqCisgKiBUaGUgc2VydmxldCBjb250YWluZXIgaXMgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBhCisgKiBVUkxDbGFzc0xvYWRlciBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0IEphc3BlcgorICogaXMgYmVpbmcgdXNlZCBpbi4gSmFzcGVyIHdpbGwgdHJ5IGdldCB0aGUgVG9tY2F0CisgKiBTZXJ2bGV0Q29udGV4dCBhdHRyaWJ1dGUgZm9yIGl0cyBTZXJ2bGV0Q29udGV4dCBjbGFzcworICogbG9hZGVyLCBpZiB0aGF0IGZhaWxzLCBpdCB1c2VzIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyLgorICogSW4gZWl0aGVyIGNhc2UsIGl0IG11c3QgYmUgYSBVUkxDbGFzc0xvYWRlci4KKyAqCisgKiBAYXV0aG9yIEFuaWwgSy4gVmlqZW5kcmFuCisgKiBAYXV0aG9yIEhhcmlzaCBQcmFiYW5kaGFtCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAYXV0aG9yIEtpbi1tYW4gQ2h1bmcKKyAqIEBhdXRob3IgR2xlbm4gTmllbHNlbgorICogQGF1dGhvciBUaW0gRmVubmVsbAorICovCisKK3B1YmxpYyBjbGFzcyBKc3BTZXJ2bGV0V3JhcHBlciB7CisKKyAgICAvLyBMb2dnZXIKKyAgICBwcml2YXRlIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKc3BTZXJ2bGV0V3JhcHBlci5jbGFzcyk7CisKKyAgICBwcml2YXRlIFNlcnZsZXQgdGhlU2VydmxldDsKKyAgICBwcml2YXRlIFN0cmluZyBqc3BVcmk7CisgICAgcHJpdmF0ZSBDbGFzcyBzZXJ2bGV0Q2xhc3M7CisgICAgcHJpdmF0ZSBDbGFzcyB0YWdIYW5kbGVyQ2xhc3M7CisgICAgcHJpdmF0ZSBKc3BDb21waWxhdGlvbkNvbnRleHQgY3R4dDsKKyAgICBwcml2YXRlIGxvbmcgYXZhaWxhYmxlID0gMEw7CisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29uZmlnIGNvbmZpZzsKKyAgICBwcml2YXRlIE9wdGlvbnMgb3B0aW9uczsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmlyc3RUaW1lID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVsb2FkID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNUYWdGaWxlOworICAgIHByaXZhdGUgaW50IHRyaXBDb3VudDsKKyAgICBwcml2YXRlIEphc3BlckV4Y2VwdGlvbiBjb21waWxlRXhjZXB0aW9uOworICAgIHByaXZhdGUgbG9uZyBzZXJ2bGV0Q2xhc3NMYXN0TW9kaWZpZWRUaW1lOworICAgIHByaXZhdGUgbG9uZyBsYXN0TW9kaWZpY2F0aW9uVGVzdCA9IDBMOworCisgICAgLyoKKyAgICAgKiBKc3BTZXJ2bGV0V3JhcHBlciBmb3IgSlNQIHBhZ2VzLgorICAgICAqLworICAgIEpzcFNlcnZsZXRXcmFwcGVyKFNlcnZsZXRDb25maWcgY29uZmlnLCBPcHRpb25zIG9wdGlvbnMsIFN0cmluZyBqc3BVcmksCisgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Vycm9yUGFnZSwgSnNwUnVudGltZUNvbnRleHQgcmN0eHQpCisgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworCXRoaXMuaXNUYWdGaWxlID0gZmFsc2U7CisgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOworICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICB0aGlzLmpzcFVyaSA9IGpzcFVyaTsKKyAgICAgICAgY3R4dCA9IG5ldyBKc3BDb21waWxhdGlvbkNvbnRleHQoanNwVXJpLCBpc0Vycm9yUGFnZSwgb3B0aW9ucywKKwkJCQkJIGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLAorCQkJCQkgdGhpcywgcmN0eHQpOworICAgIH0KKworICAgIC8qCisgICAgICogSnNwU2VydmxldFdyYXBwZXIgZm9yIHRhZyBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwU2VydmxldFdyYXBwZXIoU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQsCisJCQkgICAgIE9wdGlvbnMgb3B0aW9ucywKKwkJCSAgICAgU3RyaW5nIHRhZ0ZpbGVQYXRoLAorCQkJICAgICBUYWdJbmZvIHRhZ0luZm8sCisJCQkgICAgIEpzcFJ1bnRpbWVDb250ZXh0IHJjdHh0LAorCQkJICAgICBVUkwgdGFnRmlsZUphclVybCkKKwkgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKwl0aGlzLmlzVGFnRmlsZSA9IHRydWU7CisgICAgICAgIHRoaXMuY29uZmlnID0gbnVsbDsJLy8gbm90IHVzZWQKKyAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKwl0aGlzLmpzcFVyaSA9IHRhZ0ZpbGVQYXRoOworCXRoaXMudHJpcENvdW50ID0gMDsKKyAgICAgICAgY3R4dCA9IG5ldyBKc3BDb21waWxhdGlvbkNvbnRleHQoanNwVXJpLCB0YWdJbmZvLCBvcHRpb25zLAorCQkJCQkgc2VydmxldENvbnRleHQsIHRoaXMsIHJjdHh0LAorCQkJCQkgdGFnRmlsZUphclVybCk7CisgICAgfQorCisgICAgcHVibGljIEpzcENvbXBpbGF0aW9uQ29udGV4dCBnZXRKc3BFbmdpbmVDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gY3R4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWxvYWQoYm9vbGVhbiByZWxvYWQpIHsKKyAgICAgICAgdGhpcy5yZWxvYWQgPSByZWxvYWQ7CisgICAgfQorCisgICAgcHVibGljIFNlcnZsZXQgZ2V0U2VydmxldCgpCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAocmVsb2FkKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAvLyBTeW5jaHJvbml6aW5nIG9uIGpzdyBlbmFibGVzIHNpbXVsdGFuZW91cyBsb2FkaW5nCisgICAgICAgICAgICAgICAgLy8gb2YgZGlmZmVyZW50IHBhZ2VzLCBidXQgbm90IHRoZSBzYW1lIHBhZ2UuCisgICAgICAgICAgICAgICAgaWYgKHJlbG9hZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRvIG1haW50YWluIHRoZSBvcmlnaW5hbCBwcm90b2NvbC4KKyAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgU2VydmxldCBzZXJ2bGV0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXRDbGFzcyA9IGN0eHQubG9hZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCA9IChTZXJ2bGV0KSBzZXJ2bGV0Q2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCggSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKCBleDEgKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCggSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oIGV4ICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQuaW5pdChjb25maWcpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RUaW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdHh0LmdldFJ1bnRpbWVDb250ZXh0KCkuaW5jcmVtZW50SnNwUmVsb2FkQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRoZVNlcnZsZXQgPSBzZXJ2bGV0OworICAgICAgICAgICAgICAgICAgICByZWxvYWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ICAgIAorICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGVTZXJ2bGV0OworICAgIH0KKworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbXBpbGF0aW9uIGV4Y2VwdGlvbiBmb3IgdGhpcyBKc3BTZXJ2bGV0V3JhcHBlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqZSBUaGUgY29tcGlsYXRpb24gZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGlsYXRpb25FeGNlcHRpb24oSmFzcGVyRXhjZXB0aW9uIGplKSB7CisgICAgICAgIHRoaXMuY29tcGlsZUV4Y2VwdGlvbiA9IGplOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxhc3QtbW9kaWZpZWQgdGltZSBvZiB0aGUgc2VydmxldCBjbGFzcyBmaWxlIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgSnNwU2VydmxldFdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFzdE1vZGlmaWVkIExhc3QtbW9kaWZpZWQgdGltZSBvZiBzZXJ2bGV0IGNsYXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VydmxldENsYXNzTGFzdE1vZGlmaWVkVGltZShsb25nIGxhc3RNb2RpZmllZCkgeworICAgICAgICBpZiAodGhpcy5zZXJ2bGV0Q2xhc3NMYXN0TW9kaWZpZWRUaW1lIDwgbGFzdE1vZGlmaWVkKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXJ2bGV0Q2xhc3NMYXN0TW9kaWZpZWRUaW1lIDwgbGFzdE1vZGlmaWVkKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmxldENsYXNzTGFzdE1vZGlmaWVkVGltZSA9IGxhc3RNb2RpZmllZDsKKyAgICAgICAgICAgICAgICAgICAgcmVsb2FkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21waWxlIChpZiBuZWVkZWQpIGFuZCBsb2FkIGEgdGFnIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgbG9hZFRhZ0ZpbGUoKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGN0eHQuaXNSZW1vdmVkKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGpzcFVyaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3B0aW9ucy5nZXREZXZlbG9wbWVudCgpIHx8IGZpcnN0VGltZSApIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGN0eHQuY29tcGlsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBpbGVFeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb21waWxlRXhjZXB0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJlbG9hZCkgeworICAgICAgICAgICAgICAgIHRhZ0hhbmRsZXJDbGFzcyA9IGN0eHQubG9hZCgpOworICAgICAgICAgICAgICAgIHJlbG9hZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oZXgpOworCX0KKworCXJldHVybiB0YWdIYW5kbGVyQ2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGlsZSBhbmQgbG9hZCBhIHByb3RvdHlwZSBmb3IgdGhlIFRhZyBmaWxlLiAgVGhpcyBpcyBuZWVkZWQKKyAgICAgKiB3aGVuIGNvbXBpbGluZyB0YWcgZmlsZXMgd2l0aCBjaXJjdWxhciBkZXBlbmRlbmNpZXMuICBBIHByb3RvdHBlCisgICAgICogKHNrZWxldG9uKSB3aXRoIG5vIGRlcGVuZGVuY2llcyBvbiBvdGhlciBvdGhlciB0YWcgZmlsZXMgaXMKKyAgICAgKiBnZW5lcmF0ZWQgYW5kIGNvbXBpbGVkLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBsb2FkVGFnRmlsZVByb3RvdHlwZSgpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJY3R4dC5zZXRQcm90b3R5cGVNb2RlKHRydWUpOworCXRyeSB7CisJICAgIHJldHVybiBsb2FkVGFnRmlsZSgpOworCX0gZmluYWxseSB7CisJICAgIGN0eHQuc2V0UHJvdG90eXBlTW9kZShmYWxzZSk7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIGxpc3Qgb2YgZmlsZXMgdGhhdCB0aGUgY3VycmVudCBwYWdlIGhhcyBzb3VyY2UgZGVwZW5kZW5jeSBvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RGVwZW5kYW50cygpIHsKKwl0cnkgeworCSAgICBPYmplY3QgdGFyZ2V0OworCSAgICBpZiAoaXNUYWdGaWxlKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlbG9hZCkgeworICAgICAgICAgICAgICAgICAgICB0YWdIYW5kbGVyQ2xhc3MgPSBjdHh0LmxvYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVsb2FkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCQl0YXJnZXQgPSB0YWdIYW5kbGVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKKwkgICAgfSBlbHNlIHsKKwkJdGFyZ2V0ID0gZ2V0U2VydmxldCgpOworCSAgICB9CisJICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQgaW5zdGFuY2VvZiBKc3BTb3VyY2VEZXBlbmRlbnQpIHsKKyAgICAgICAgICAgIHJldHVybiAoKGphdmEudXRpbC5MaXN0KSAoKEpzcFNvdXJjZURlcGVuZGVudCkgdGFyZ2V0KS5nZXREZXBlbmRhbnRzKCkpOworCSAgICB9CisJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisJfQorCXJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVGFnRmlsZSgpIHsKKwlyZXR1cm4gdGhpcy5pc1RhZ0ZpbGU7CisgICAgfQorCisgICAgcHVibGljIGludCBpbmNUcmlwQ291bnQoKSB7CisJcmV0dXJuIHRyaXBDb3VudCsrOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZGVjVHJpcENvdW50KCkgeworCXJldHVybiB0cmlwQ291bnQtLTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByZWNvbXBpbGUpCisJICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgaWYgKGN0eHQuaXNSZW1vdmVkKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGpzcFVyaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlID4gMEwpICYmIChhdmFpbGFibGUgPCBMb25nLk1BWF9WQUxVRSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlID4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RGF0ZUhlYWRlcigiUmV0cnktQWZ0ZXIiLCBhdmFpbGFibGUpOworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX1NFUlZJQ0VfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci51bmF2YWlsYWJsZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdhaXQgcGVyaW9kIGhhcyBleHBpcmVkLiBSZXNldC4KKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAoMSkgQ29tcGlsZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAob3B0aW9ucy5nZXREZXZlbG9wbWVudCgpIHx8IGZpcnN0VGltZSApIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBzZXRzIHJlbG9hZCB0byB0cnVlLCBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICAgICAgY3R4dC5jb21waWxlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY29tcGlsZUV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRocm93IGNhY2hlZCBjb21waWxhdGlvbiBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tcGlsZUV4Y2VwdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAoMikgKFJlKWxvYWQgc2VydmxldCBjbGFzcyBmaWxlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGdldFNlcnZsZXQoKTsKKworICAgICAgICAgICAgLy8gSWYgYSBwYWdlIGlzIHRvIGJlIHByZWNvbXBpbGVkIG9ubHksIHJldHVybi4KKyAgICAgICAgICAgIGlmIChwcmVjb21waWxlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogKDMpIFNlcnZpY2UgcmVxdWVzdAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAodGhlU2VydmxldCBpbnN0YW5jZW9mIFNpbmdsZVRocmVhZE1vZGVsKSB7CisgICAgICAgICAgICAgICAvLyBzeW5jIG9uIHRoZSB3cmFwcGVyIHNvIHRoYXQgdGhlIGZyZXNobmVzcworICAgICAgICAgICAgICAgLy8gb2YgdGhlIHBhZ2UgaXMgZGV0ZXJtaW5lZCByaWdodCBiZWZvcmUgc2VydmljaW5nCisgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICB0aGVTZXJ2bGV0LnNlcnZpY2UocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhlU2VydmxldC5zZXJ2aWNlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChVbmF2YWlsYWJsZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgU3RyaW5nIGluY2x1ZGVSZXF1ZXN0VXJpID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5pbmNsdWRlLnJlcXVlc3RfdXJpIik7CisgICAgICAgICAgICBpZiAoaW5jbHVkZVJlcXVlc3RVcmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgZmlsZSB3YXMgaW5jbHVkZWQuIFRocm93IGFuIGV4Y2VwdGlvbiBhcworICAgICAgICAgICAgICAgIC8vIGEgcmVzcG9uc2Uuc2VuZEVycm9yKCkgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZQorICAgICAgICAgICAgICAgIC8vIHNlcnZsZXQgZW5naW5lLgorICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgdW5hdmFpbGFibGVTZWNvbmRzID0gZXguZ2V0VW5hdmFpbGFibGVTZWNvbmRzKCk7CisgICAgICAgICAgICAgICAgaWYgKHVuYXZhaWxhYmxlU2Vjb25kcyA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHVuYXZhaWxhYmxlU2Vjb25kcyA9IDYwOyAgICAgICAgLy8gQXJiaXRyYXJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKworICAgICAgICAgICAgICAgICAgICAodW5hdmFpbGFibGVTZWNvbmRzICogMTAwMEwpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19TRVJWSUNFX1VOQVZBSUxBQkxFLCAKKyAgICAgICAgICAgICAgICAgICAgIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgY3R4dC5pbmNyZW1lbnRSZW1vdmVkKCk7CisgICAgICAgICAgICBTdHJpbmcgaW5jbHVkZVJlcXVlc3RVcmkgPSAoU3RyaW5nKQorICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucmVxdWVzdF91cmkiKTsKKyAgICAgICAgICAgIGlmIChpbmNsdWRlUmVxdWVzdFVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBmaWxlIHdhcyBpbmNsdWRlZC4gVGhyb3cgYW4gZXhjZXB0aW9uIGFzCisgICAgICAgICAgICAgICAgLy8gYSByZXNwb25zZS5zZW5kRXJyb3IoKSB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgLy8gc2VydmxldCBlbmdpbmUuCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuZmlsZS5ub3QuZm91bmQiLAorCQkJCQkJICAgZXguZ2V0TWVzc2FnZSgpKSwKKwkJCSAgICAgIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNlcnZsZXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGlmKG9wdGlvbnMuZ2V0RGV2ZWxvcG1lbnQoKSkgeworICAgICAgICAgICAgICAgIHRocm93IGhhbmRsZUpzcEV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgaWYob3B0aW9ucy5nZXREZXZlbG9wbWVudCgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgaGFuZGxlSnNwRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgaWYob3B0aW9ucy5nZXREZXZlbG9wbWVudCgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgaGFuZGxlSnNwRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgaWYob3B0aW9ucy5nZXREZXZlbG9wbWVudCgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgaGFuZGxlSnNwRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICBpZiAodGhlU2VydmxldCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGVTZXJ2bGV0LmRlc3Ryb3koKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGFzdE1vZGlmaWNhdGlvblRlc3QuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWNhdGlvblRlc3QoKSB7CisgICAgICAgIHJldHVybiBsYXN0TW9kaWZpY2F0aW9uVGVzdDsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIGxhc3RNb2RpZmljYXRpb25UZXN0IFRoZSBsYXN0TW9kaWZpY2F0aW9uVGVzdCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWNhdGlvblRlc3QobG9uZyBsYXN0TW9kaWZpY2F0aW9uVGVzdCkgeworICAgICAgICB0aGlzLmxhc3RNb2RpZmljYXRpb25UZXN0ID0gbGFzdE1vZGlmaWNhdGlvblRlc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+QXR0ZW1wdHMgdG8gY29uc3RydWN0IGEgSmFzcGVyRXhjZXB0aW9uIHRoYXQgY29udGFpbnMgaGVscGZ1bCBpbmZvcm1hdGlvbgorICAgICAqIGFib3V0IHdoYXQgd2VudCB3cm9uZy4gVXNlcyB0aGUgSlNQIGNvbXBpbGVyIHN5c3RlbSB0byB0cmFuc2xhdGUgdGhlIGxpbmUKKyAgICAgKiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzZXJ2bGV0IHRoYXQgb3JpZ2luYXRlZCB0aGUgZXhjZXB0aW9uIHRvIGEgbGluZQorICAgICAqIG51bWJlciBpbiB0aGUgSlNQLiAgVGhlbiBjb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiBjb250YWluaW5nIHRoYXQKKyAgICAgKiBpbmZvcm1hdGlvbiwgYW5kIGEgc25pcHBldCBvZiB0aGUgSlNQIHRvIGhlbHAgZGVidWdnaW5nLgorICAgICAqIFBsZWFzZSBzZWUgaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNzA2MiBhbmQKKyAgICAgKiBodHRwOi8vd3d3LnRmZW5uZS5jb20vamFzcGVyLyBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAqPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGV4IHRoZSBleGNlcHRpb24gdGhhdCB3YXMgdGhlIGNhdXNlIG9mIHRoZSBwcm9ibGVtLgorICAgICAqIEByZXR1cm4gYSBKYXNwZXJFeGNlcHRpb24gd2l0aCBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIEphc3BlckV4Y2VwdGlvbiBoYW5kbGVKc3BFeGNlcHRpb24oRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGV4OworICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmxldEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHJlYWxFeGNlcHRpb24gPSAoKFNlcnZsZXRFeGNlcHRpb24pIGV4KS5nZXRSb290Q2F1c2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmlyc3QgaWRlbnRpZnkgdGhlIHN0YWNrIGZyYW1lIGluIHRoZSB0cmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIEpTUAorICAgICAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnRbXSBmcmFtZXMgPSByZWFsRXhjZXB0aW9uLmdldFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50IGpzcEZyYW1lID0gbnVsbDsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZyYW1lcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGlmICggZnJhbWVzW2ldLmdldENsYXNzTmFtZSgpLmVxdWFscyh0aGlzLmdldFNlcnZsZXQoKS5nZXRDbGFzcygpLmdldE5hbWUoKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGpzcEZyYW1lID0gZnJhbWVzW2ldOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChqc3BGcmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgY291bGRuJ3QgZmluZCBhIGZyYW1lIGluIHRoZSBzdGFjayB0cmFjZSBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAgICAgLy8gdG8gdGhlIGdlbmVyYXRlZCBzZXJ2bGV0IGNsYXNzLCB3ZSBjYW4ndCByZWFsbHkgYWRkIGFueXRoaW5nCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXNwZXJFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGphdmFMaW5lTnVtYmVyID0ganNwRnJhbWUuZ2V0TGluZU51bWJlcigpOworICAgICAgICAgICAgICAgIEphdmFjRXJyb3JEZXRhaWwgZGV0YWlsID0gRXJyb3JEaXNwYXRjaGVyLmNyZWF0ZUphdmFjRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICBqc3BGcmFtZS5nZXRNZXRob2ROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eHQuZ2V0Q29tcGlsZXIoKS5nZXRQYWdlTm9kZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBqYXZhTGluZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4dCk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBudW1iZXIgaXMgbGVzcyB0aGFuIG9uZSB3ZSBjb3VsZG4ndCBmaW5kIG91dAorICAgICAgICAgICAgICAgIC8vIHdoZXJlIGluIHRoZSBKU1AgdGhpbmdzIHdlbnQgd3JvbmcKKyAgICAgICAgICAgICAgICBpbnQganNwTGluZU51bWJlciA9IGRldGFpbC5nZXRKc3BCZWdpbkxpbmVOdW1iZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAoanNwTGluZU51bWJlciA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXNwZXJFeGNlcHRpb24oIkV4Y2VwdGlvbiBpbiBKU1A6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsLmdldEpzcEZpbGVOYW1lKCkgKyAiOiIgKyBqc3BMaW5lTnVtYmVyICsgIlxuXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbC5nZXRKc3BFeHRyYWN0KCkgKyAiXG5cblN0YWNrdHJhY2U6IiwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gamUpIHsKKyAgICAgICAgICAgIC8vIElmIGFueXRoaW5nIGdvZXMgd3JvbmcsIGp1c3QgcmV2ZXJ0IHRvIHRoZSBvcmlnaW5hbCBiZWhhdmlvdXIKKyAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEphc3BlckV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHJldHVybiAoSmFzcGVyRXhjZXB0aW9uKSBleDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXNwZXJFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3NlcnZsZXQvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvc2VydmxldC9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MGE4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3NlcnZsZXQvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxtYmVhbnMtZGVzY3JpcHRvcnM+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iSnNwTW9uaXRvciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSlNQIE1vbml0b3JpbmciCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJNb25pdG9yaW5nIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmphc3Blci5zZXJ2bGV0LkpzcFNlcnZsZXQiPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImpzcENvdW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIEpTUHMgdGhhdCBoYXZlIGJlZW4gbG9hZGVkIGludG8gYSB3ZWJhcHAiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImpzcFJlbG9hZENvdW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIEpTUHMgdGhhdCBoYXZlIGJlZW4gcmVsb2FkZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgIDwvbWJlYW4+CisKKzwvbWJlYW5zLWRlc2NyaXB0b3JzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL1V0aWwuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODE1YTJhCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvVXRpbC5qYXZhCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwVGFnRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0OworCisvKioKKyAqIFV0aWwgY29udGFpbnMgc29tZSBvZnRlbiB1c2VkIGNvbnN0cywgc3RhdGljIG1ldGhvZHMgYW5kIGVtYmVkZGVkIGNsYXNzCisgKiB0byBzdXBwb3J0IHRoZSBKU1RMIHRhZyBwbHVnaW4uCisgKi8KKworcHVibGljIGNsYXNzIFV0aWwgeworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEX1NDSEVNRV9DSEFSID0gCisgICAgICAgICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSsuLSI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FTkNPRElORyA9IAorICAgICAgICAiSVNPLTg4NTktMSI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElHSEVTVF9TUEVDSUFMID0gJz4nOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgY2hhcltdW10gc3BlY2lhbENoYXJhY3RlcnNSZXByZXNlbnRhdGlvbiA9IG5ldyBjaGFyW0hJR0hFU1RfU1BFQ0lBTCArIDFdW107CisgICAgCisgICAgc3RhdGljIHsKKyAgICAgICAgc3BlY2lhbENoYXJhY3RlcnNSZXByZXNlbnRhdGlvblsnJiddID0gIiZhbXA7Ii50b0NoYXJBcnJheSgpOworICAgICAgICBzcGVjaWFsQ2hhcmFjdGVyc1JlcHJlc2VudGF0aW9uWyc8J10gPSAiJmx0OyIudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgc3BlY2lhbENoYXJhY3RlcnNSZXByZXNlbnRhdGlvblsnPiddID0gIiZndDsiLnRvQ2hhckFycmF5KCk7CisgICAgICAgIHNwZWNpYWxDaGFyYWN0ZXJzUmVwcmVzZW50YXRpb25bJyInXSA9ICImIzAzNDsiLnRvQ2hhckFycmF5KCk7CisgICAgICAgIHNwZWNpYWxDaGFyYWN0ZXJzUmVwcmVzZW50YXRpb25bJ1wnJ10gPSAiJiMwMzk7Ii50b0NoYXJBcnJheSgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gc3RyaW5nIGRlc2NyaXB0aW9uIG9mIGEgc2NvcGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBQYWdlQ29udGV4dCBjb25zdGFudC4KKyAgICAgKgorICAgICAqIFRoZSB2YWxpZGl0eSBvZiB0aGUgZ2l2ZW4gc2NvcGUgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGJ5IHRoZQorICAgICAqIGFwcHJvcHJpYXRlIFRMVi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY29wZSBTdHJpbmcgZGVzY3JpcHRpb24gb2Ygc2NvcGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gUGFnZUNvbnRleHQgY29uc3RhbnQgY29ycmVzcG9uZGluZyB0byBnaXZlbiBzY29wZSBkZXNjcmlwdGlvbgorICAgICAqIAorICAgICAqIHRha2VuIGZyb20gb3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5jb21tb24uY29yZS5VdGlsICAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTY29wZShTdHJpbmcgc2NvcGUpeworICAgICAgICBpbnQgcmV0ID0gUGFnZUNvbnRleHQuUEFHRV9TQ09QRTsKKyAgICAgICAgCisgICAgICAgIGlmKCJyZXF1ZXN0Ii5lcXVhbHNJZ25vcmVDYXNlKHNjb3BlKSl7CisgICAgICAgICAgICByZXQgPSBQYWdlQ29udGV4dC5SRVFVRVNUX1NDT1BFOworICAgICAgICB9ZWxzZSBpZigic2Vzc2lvbiIuZXF1YWxzSWdub3JlQ2FzZShzY29wZSkpeworICAgICAgICAgICAgcmV0ID0gUGFnZUNvbnRleHQuU0VTU0lPTl9TQ09QRTsKKyAgICAgICAgfWVsc2UgaWYoImFwcGxpY2F0aW9uIi5lcXVhbHNJZ25vcmVDYXNlKHNjb3BlKSl7CisgICAgICAgICAgICByZXQgPSBQYWdlQ29udGV4dC5BUFBMSUNBVElPTl9TQ09QRTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+IGlmIG91ciBjdXJyZW50IFVSTCBpcyBhYnNvbHV0ZSwKKyAgICAgKiA8dHQ+ZmFsc2U8L3R0PiBvdGhlcndpc2UuCisgICAgICogdGFrZW4gZnJvbSBvcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLmNvbW1vbi5jb3JlLkltcG9ydFN1cHBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBYnNvbHV0ZVVybChTdHJpbmcgdXJsKXsKKyAgICAgICAgaWYodXJsID09IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnQgY29sb25Qb3MgPSB1cmwuaW5kZXhPZigiOiIpOworICAgICAgICBpZihjb2xvblBvcyA9PSAtMSl7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvcihpbnQgaT0wO2k8Y29sb25Qb3M7aSsrKXsKKyAgICAgICAgICAgIGlmKFZBTElEX1NDSEVNRV9DSEFSLmluZGV4T2YodXJsLmNoYXJBdChpKSkgPT0gLTEpeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgY29udGVudC10eXBlIGF0dHJpYnV0ZS4KKyAgICAgKiBTeW50YXggZGVmaW5lZCBpbiBSRkMgMjA0NSwgc2VjdGlvbiA1LjEuCisgICAgICogdGFrZW4gZnJvbSBvcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLmNvbW1vbi5jb3JlLlV0aWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb250ZW50VHlwZUF0dHJpYnV0ZShTdHJpbmcgaW5wdXQsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGludCBiZWdpbjsKKyAgICAgICAgaW50IGVuZDsKKyAgICAgICAgaW50IGluZGV4ID0gaW5wdXQudG9VcHBlckNhc2UoKS5pbmRleE9mKG5hbWUudG9VcHBlckNhc2UoKSk7CisgICAgICAgIGlmIChpbmRleCA9PSAtMSkgcmV0dXJuIG51bGw7CisgICAgICAgIGluZGV4ID0gaW5kZXggKyBuYW1lLmxlbmd0aCgpOyAvLyBwb3NpdGlvbmVkIGFmdGVyIHRoZSBhdHRyaWJ1dGUgbmFtZQorICAgICAgICBpbmRleCA9IGlucHV0LmluZGV4T2YoJz0nLCBpbmRleCk7IC8vIHBvc2l0aW9uZWQgYXQgdGhlICc9JworICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHJldHVybiBudWxsOworICAgICAgICBpbmRleCArPSAxOyAvLyBwb3NpdGlvbmVkIGFmdGVyIHRoZSAnPScKKyAgICAgICAgaW5wdXQgPSBpbnB1dC5zdWJzdHJpbmcoaW5kZXgpLnRyaW0oKTsKKyAgICAgICAgCisgICAgICAgIGlmIChpbnB1dC5jaGFyQXQoMCkgPT0gJyInKSB7CisgICAgICAgICAgICAvLyBhdHRyaWJ1dGUgdmFsdWUgaXMgYSBxdW90ZWQgc3RyaW5nCisgICAgICAgICAgICBiZWdpbiA9IDE7CisgICAgICAgICAgICBlbmQgPSBpbnB1dC5pbmRleE9mKCciJywgYmVnaW4pOworICAgICAgICAgICAgaWYgKGVuZCA9PSAtMSkgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiZWdpbiA9IDA7CisgICAgICAgICAgICBlbmQgPSBpbnB1dC5pbmRleE9mKCc7Jyk7CisgICAgICAgICAgICBpZiAoZW5kID09IC0xKSBlbmQgPSBpbnB1dC5pbmRleE9mKCcgJyk7CisgICAgICAgICAgICBpZiAoZW5kID09IC0xKSBlbmQgPSBpbnB1dC5sZW5ndGgoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5wdXQuc3Vic3RyaW5nKGJlZ2luLCBlbmQpLnRyaW0oKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU3RyaXBzIGEgc2VydmxldCBzZXNzaW9uIElEIGZyb20gPHR0PnVybDwvdHQ+LiAgVGhlIHNlc3Npb24gSUQKKyAgICAgKiBpcyBlbmNvZGVkIGFzIGEgVVJMICJwYXRoIHBhcmFtZXRlciIgYmVnaW5uaW5nIHdpdGggImpzZXNzaW9uaWQ9Ii4KKyAgICAgKiBXZSB0aHVzIHJlbW92ZSBhbnl0aGluZyB3ZSBmaW5kIGJldHdlZW4gIjtqc2Vzc2lvbmlkPSIgKGluY2x1c2l2ZSkKKyAgICAgKiBhbmQgZWl0aGVyIEVPUyBvciBhIHN1YnNlcXVlbnQgJzsnIChleGNsdXNpdmUpLgorICAgICAqIAorICAgICAqIHRha2VuIGZyb20gb3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5jb21tb24uY29yZS5JbXBvcnRTdXBwb3J0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBTZXNzaW9uKFN0cmluZyB1cmwpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHUgPSBuZXcgU3RyaW5nQnVmZmVyKHVybCk7CisgICAgICAgIGludCBzZXNzaW9uU3RhcnQ7CisgICAgICAgIHdoaWxlICgoc2Vzc2lvblN0YXJ0ID0gdS50b1N0cmluZygpLmluZGV4T2YoIjtqc2Vzc2lvbmlkPSIpKSAhPSAtMSkgeworICAgICAgICAgICAgaW50IHNlc3Npb25FbmQgPSB1LnRvU3RyaW5nKCkuaW5kZXhPZigiOyIsIHNlc3Npb25TdGFydCArIDEpOworICAgICAgICAgICAgaWYgKHNlc3Npb25FbmQgPT0gLTEpCisgICAgICAgICAgICAgICAgc2Vzc2lvbkVuZCA9IHUudG9TdHJpbmcoKS5pbmRleE9mKCI/Iiwgc2Vzc2lvblN0YXJ0ICsgMSk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbkVuZCA9PSAtMSkgCQkJCS8vIHN0aWxsCisgICAgICAgICAgICAgICAgc2Vzc2lvbkVuZCA9IHUubGVuZ3RoKCk7CisgICAgICAgICAgICB1LmRlbGV0ZShzZXNzaW9uU3RhcnQsIHNlc3Npb25FbmQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1LnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3Vic3RyaW5nIHJlcGxhY2VtZW50cworICAgICAqICh0byBmYWNpbGl0YXRlIG91dHB1dCB0byBYTUwvSFRNTCBwYWdlcyk6CisgICAgICoKKyAgICAgKiAgICAmIC0+ICZhbXA7CisgICAgICogICAgPCAtPiAmbHQ7CisgICAgICogICAgPiAtPiAmZ3Q7CisgICAgICogICAgIiAtPiAmIzAzNDsKKyAgICAgKiAgICAnIC0+ICYjMDM5OworICAgICAqCisgICAgICogU2VlIGFsc28gT3V0U3VwcG9ydC53cml0ZUVzY2FwZWRYbWwoKS4KKyAgICAgKiAKKyAgICAgKiB0YWtlbiBmcm9tIG9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcuY29tbW9uLmNvcmUuVXRpbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZVhtbChTdHJpbmcgYnVmZmVyKSB7CisgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgIGludCBsZW5ndGggPSBidWZmZXIubGVuZ3RoKCk7CisgICAgICAgIGNoYXJbXSBhcnJheUJ1ZmZlciA9IGJ1ZmZlci50b0NoYXJBcnJheSgpOworICAgICAgICBTdHJpbmdCdWZmZXIgZXNjYXBlZEJ1ZmZlciA9IG51bGw7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBhcnJheUJ1ZmZlcltpXTsKKyAgICAgICAgICAgIGlmIChjIDw9IEhJR0hFU1RfU1BFQ0lBTCkgeworICAgICAgICAgICAgICAgIGNoYXJbXSBlc2NhcGVkID0gc3BlY2lhbENoYXJhY3RlcnNSZXByZXNlbnRhdGlvbltjXTsKKyAgICAgICAgICAgICAgICBpZiAoZXNjYXBlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBTdHJpbmdCdWZmZXIgdG8gaG9sZCBlc2NhcGVkIHhtbCBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB1bmVzY2FwZWQgcG9ydGlvbgorICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPCBpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVkQnVmZmVyLmFwcGVuZChhcnJheUJ1ZmZlcixzdGFydCxpLXN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOworICAgICAgICAgICAgICAgICAgICAvLyBhZGQgZXNjYXBlZCB4bWwKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZEJ1ZmZlci5hcHBlbmQoZXNjYXBlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIG5vIHhtbCBlc2NhcGluZyB3YXMgbmVjZXNzYXJ5CisgICAgICAgIGlmIChzdGFydCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyOworICAgICAgICB9CisgICAgICAgIC8vIGFkZCByZXN0IG9mIHVuZXNjYXBlZCBwb3J0aW9uCisgICAgICAgIGlmIChzdGFydCA8IGxlbmd0aCkgeworICAgICAgICAgICAgZXNjYXBlZEJ1ZmZlci5hcHBlbmQoYXJyYXlCdWZmZXIsc3RhcnQsbGVuZ3RoLXN0YXJ0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXNjYXBlZEJ1ZmZlci50b1N0cmluZygpOworICAgIH0KKyAgICAKKyAgICAvKiogVXRpbGl0eSBtZXRob2RzCisgICAgICogdGFrZW4gZnJvbSBvcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLmNvbW1vbi5jb3JlLlVybFN1cHBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlVXJsKAorICAgICAgICAgICAgU3RyaW5nIHVybCwgU3RyaW5nIGNvbnRleHQsIFBhZ2VDb250ZXh0IHBhZ2VDb250ZXh0KQorICAgIHRocm93cyBKc3BFeGNlcHRpb24geworICAgICAgICAvLyBkb24ndCB0b3VjaCBhYnNvbHV0ZSBVUkxzCisgICAgICAgIGlmIChpc0Fic29sdXRlVXJsKHVybCkpCisgICAgICAgICAgICByZXR1cm4gdXJsOworICAgICAgICAKKyAgICAgICAgLy8gbm9ybWFsaXplIHJlbGF0aXZlIFVSTHMgYWdhaW5zdCBhIGNvbnRleHQgcm9vdAorICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9CisgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXF1ZXN0KSBwYWdlQ29udGV4dC5nZXRSZXF1ZXN0KCk7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aCgiLyIpKQorICAgICAgICAgICAgICAgIHJldHVybiAocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgdXJsKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gdXJsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFjb250ZXh0LnN0YXJ0c1dpdGgoIi8iKSB8fCAhdXJsLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBKc3BUYWdFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkluIFVSTCB0YWdzLCB3aGVuIHRoZSBcImNvbnRleHRcIiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB2YWx1ZXMgb2YgYm90aCBcImNvbnRleHRcIiBhbmQgXCJ1cmxcIiBtdXN0IHN0YXJ0IHdpdGggXCIvXCIuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29udGV4dC5lcXVhbHMoIi8iKSkgeworICAgICAgICAgICAgICAgIC8vIERvbid0IHByb2R1Y2Ugc3RyaW5nIHN0YXJ0aW5nIHdpdGggJy8vJywgbWFueQorICAgICAgICAgICAgICAgIC8vIGJyb3dzZXJzIGludGVycHJldCB0aGlzIGFzIGhvc3QgbmFtZSwgbm90IGFzCisgICAgICAgICAgICAgICAgLy8gcGF0aCBvbiBzYW1lIGhvc3QuCisgICAgICAgICAgICAgICAgcmV0dXJuIHVybDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChjb250ZXh0ICsgdXJsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiogV3JhcHMgcmVzcG9uc2VzIHRvIGFsbG93IHVzIHRvIHJldHJpZXZlIHJlc3VsdHMgYXMgU3RyaW5ncy4gCisgICAgICogbWFpbmx5IHRha2VuIGZyb20gb3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5jb21tb24uY29yZS5pbXBvcnRTdXBwb3J0IAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wb3J0UmVzcG9uc2VXcmFwcGVyIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXJ7CisgICAgICAgIAorICAgICAgICBwcml2YXRlIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBwcml2YXRlIFNlcnZsZXRPdXRwdXRTdHJlYW0gc29zID0gbmV3IFNlcnZsZXRPdXRwdXRTdHJlYW0oKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBib3Mud3JpdGUoYik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1dyaXRlclVzZWQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1N0cmVhbVVzZWQ7CisgICAgICAgIHByaXZhdGUgaW50IHN0YXR1cyA9IDIwMDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2hhckVuY29kaW5nOworICAgICAgICAKKyAgICAgICAgcHVibGljIEltcG9ydFJlc3BvbnNlV3JhcHBlcihIdHRwU2VydmxldFJlc3BvbnNlIGFyZzApIHsKKyAgICAgICAgICAgIHN1cGVyKGFyZzApOworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB7CisgICAgICAgICAgICBpZiAoaXNTdHJlYW1Vc2VkKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgaW50ZXJuYWwgZXJyb3IgZHVyaW5nICZsdDtpbXBvcnQmZ3Q6ICIgKworICAgICAgICAgICAgICAgICJUYXJnZXQgc2VydmxldCBjYWxsZWQgZ2V0V3JpdGVyKCksIHRoZW4gZ2V0T3V0cHV0U3RyZWFtKCkiKTsKKyAgICAgICAgICAgIGlzV3JpdGVyVXNlZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gbmV3IFByaW50V3JpdGVyKHN3KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgeworICAgICAgICAgICAgaWYgKGlzV3JpdGVyVXNlZCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGludGVybmFsIGVycm9yIGR1cmluZyAmbHQ7aW1wb3J0Jmd0OiAiICsKKyAgICAgICAgICAgICAgICAiVGFyZ2V0IHNlcnZsZXQgY2FsbGVkIGdldE91dHB1dFN0cmVhbSgpLCB0aGVuIGdldFdyaXRlcigpIik7CisgICAgICAgICAgICBpc1N0cmVhbVVzZWQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHNvczsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyoqIEhhcyBubyBlZmZlY3QuICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyB4KSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyoqIEhhcyBubyBlZmZlY3QuICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgeCkgeworICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGludCBnZXRTdGF0dXMoKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJFbmNvZGluZygpeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBzZXRDaGFyRW5jb2RpbmcoU3RyaW5nIGNlKXsKKyAgICAgICAgICAgIHRoaXMuY2hhckVuY29kaW5nID0gY2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGlzV3JpdGVyVXNlZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGlzU3RyZWFtVXNlZCkgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoYXJFbmNvZGluZyAhPSBudWxsICYmICF0aGlzLmNoYXJFbmNvZGluZy5lcXVhbHMoIiIpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm9zLnRvU3RyaW5nKGNoYXJFbmNvZGluZyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm9zLnRvU3RyaW5nKCJJU08tODg1OS0xIik7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CQkvLyB0YXJnZXQgZGlkbid0IHdyaXRlIGFueXRoaW5nCisgICAgICAgIH0KKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9jb3JlL0NhdGNoLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9jb3JlL0NhdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkMTU0YQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL2NvcmUvQ2F0Y2guamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5jb3JlOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIudGFncGx1Z2luLlRhZ1BsdWdpbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci50YWdwbHVnaW4uVGFnUGx1Z2luQ29udGV4dDsKKworcHVibGljIGNsYXNzIENhdGNoIGltcGxlbWVudHMgVGFnUGx1Z2luIHsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkb1RhZyhUYWdQbHVnaW5Db250ZXh0IGN0eHQpIHsKKyAgICAgICAgCisgICAgICAgIC8vZmxhZyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgdmFyIGF0dHJpYnV0ZQorICAgICAgICBib29sZWFuIGhhc1ZhciA9IGN0eHQuaXNBdHRyaWJ1dGVTcGVjaWZpZWQoInZhciIpOworICAgICAgICAKKyAgICAgICAgLy90ZW1wIG5hbWUgZm9yIGV4Y2VwdGlvbiBhbmQgY2F1Z2h0CisgICAgICAgIFN0cmluZyBleGNlcHRpb25OYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGNhdWdodE5hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICAKKyAgICAgICAgLy9tYWluIHBhcnQgdG8gZ2VuZXJhdGUgY29kZQorICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiYm9vbGVhbiAiICsgY2F1Z2h0TmFtZSArICIgPSBmYWxzZTsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoInRyeXsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUJvZHkoKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIn0iKTsKKyAgICAgICAgCisgICAgICAgIC8vZG8gY2F0Y2gKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImNhdGNoKFRocm93YWJsZSAiICsgZXhjZXB0aW9uTmFtZSArICIpeyIpOworICAgICAgICAKKyAgICAgICAgLy9pZiB0aGUgdmFyIHNwZWNpZmllZCwgdGhlIGV4Y2VwdGlvbiBvYmplY3Qgc2hvdWxkIAorICAgICAgICAvL2JlIHNldCB0byB0aGUgYXR0cmlidXRlICJ2YXIiIGRlZmluZXMgaW4gcGFnZSBzY29wZSAKKyAgICAgICAgaWYoaGFzVmFyKXsKKyAgICAgICAgICAgIFN0cmluZyBzdHJWYXIgPSBjdHh0LmdldENvbnN0YW50QXR0cmlidXRlKCJ2YXIiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgcGFnZUNvbnRleHQuc2V0QXR0cmlidXRlKFwiIiArIHN0clZhciArICJcIiwgIiAKKyAgICAgICAgICAgICAgICAgICAgKyBleGNlcHRpb25OYW1lICsgIiwgUGFnZUNvbnRleHQuUEFHRV9TQ09QRSk7Iik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vd2hlbmV2ZXIgdGhlcmUncyBleGNlcHRpb24gY2F1Z2h0LCAKKyAgICAgICAgLy90aGUgZmxhZyBjYXVnaHQgc2hvdWxkIGJlIHNldCB0cnVlOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICIgKyBjYXVnaHROYW1lICsgIiA9IHRydWU7Iik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJ9Iik7CisgICAgICAgIAorICAgICAgICAvL2RvIGZpbmFsbHkKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImZpbmFsbHl7Iik7CisgICAgICAgIAorICAgICAgICAvL2lmIHZhciBzcGVjaWZpZWQsIHRoZSBhdHRyaWJ1dGUgaXQgZGVmaW5lcyAKKyAgICAgICAgLy9pbiBwYWdlIHNjb3BlIHNob3VsZCBiZSByZW1vdmVkCisgICAgICAgIGlmKGhhc1Zhcil7CisgICAgICAgICAgICBTdHJpbmcgc3RyVmFyID0gY3R4dC5nZXRDb25zdGFudEF0dHJpYnV0ZSgidmFyIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGlmKCEiICsgY2F1Z2h0TmFtZSArICIpeyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgcGFnZUNvbnRleHQucmVtb3ZlQXR0cmlidXRlKFwiIiArIHN0clZhciArICJcIiwgUGFnZUNvbnRleHQuUEFHRV9TQ09QRSk7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIH0iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIn0iKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9jb3JlL0Nob29zZS5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvY29yZS9DaG9vc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjIyY2VlCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvY29yZS9DaG9vc2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5jb3JlOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIudGFncGx1Z2luLio7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDaG9vc2UgaW1wbGVtZW50cyBUYWdQbHVnaW4geworICAgIAorICAgIHB1YmxpYyB2b2lkIGRvVGFnKFRhZ1BsdWdpbkNvbnRleHQgY3R4dCkgeworICAgICAgICAKKyAgICAgICAgLy8gTm90IG11Y2ggdG8gZG8gaGVyZSwgbXVjaCBvZiB0aGUgd29yayB3aWxsIGJlIGRvbmUgaW4gdGhlCisgICAgICAgIC8vIGNvbnRhaW5pbmcgdGFncywgPGM6d2hlbj4gYW5kIDxjOm90aGVyd2lzZT4uCisgICAgICAgIAorICAgICAgICBjdHh0LmdlbmVyYXRlQm9keSgpOworICAgICAgICAvLyBTZWUgY29tbWVudHMgaW4gV2hlbi5qYXZhIGZvciB0aGUgcmVhc29uICJ9IiBpcyBnZW5lcmF0ZWQgaGVyZS4KKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIn0iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9jb3JlL0ZvckVhY2guamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL2NvcmUvRm9yRWFjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YzlhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9jb3JlL0ZvckVhY2guamF2YQpAQCAtMCwwICsxLDM0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuY29yZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi4qOworCitwdWJsaWMgZmluYWwgY2xhc3MgRm9yRWFjaCBpbXBsZW1lbnRzIFRhZ1BsdWdpbiB7CisgICAgCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1ZhciwgaGFzQmVnaW4sIGhhc0VuZCwgaGFzU3RlcDsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkb1RhZyhUYWdQbHVnaW5Db250ZXh0IGN0eHQpIHsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBpbmRleCA9IG51bGw7CisgICAgICAgIAorICAgICAgICBib29sZWFuIGhhc1ZhclN0YXR1cyA9IGN0eHQuaXNBdHRyaWJ1dGVTcGVjaWZpZWQoInZhclN0YXR1cyIpOworICAgICAgICBpZiAoaGFzVmFyU3RhdHVzKSB7CisgICAgICAgICAgICBjdHh0LmRvbnRVc2VUYWdQbHVnaW4oKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaGFzVmFyID0gY3R4dC5pc0F0dHJpYnV0ZVNwZWNpZmllZCgidmFyIik7CisgICAgICAgIGhhc0JlZ2luID0gY3R4dC5pc0F0dHJpYnV0ZVNwZWNpZmllZCgiYmVnaW4iKTsKKyAgICAgICAgaGFzRW5kID0gY3R4dC5pc0F0dHJpYnV0ZVNwZWNpZmllZCgiZW5kIik7CisgICAgICAgIGhhc1N0ZXAgPSBjdHh0LmlzQXR0cmlidXRlU3BlY2lmaWVkKCJzdGVwIik7CisgICAgICAgIAorICAgICAgICBib29sZWFuIGhhc0l0ZW1zID0gY3R4dC5pc0F0dHJpYnV0ZVNwZWNpZmllZCgiaXRlbXMiKTsKKyAgICAgICAgaWYgKGhhc0l0ZW1zKSB7CisgICAgICAgICAgICBkb0NvbGxlY3Rpb24oY3R4dCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFdlIG11c3QgaGF2ZSBhIGJlZ2luIGFuZCBlbmQgYXR0cmlidXRlcworICAgICAgICBpbmRleCA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJmb3IgKGludCAiICsgaW5kZXggKyAiID0gIik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVBdHRyaWJ1dGUoImJlZ2luIik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCI7ICIgKyBpbmRleCArICIgPD0gIik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVBdHRyaWJ1dGUoImVuZCIpOworICAgICAgICBpZiAoaGFzU3RlcCkgeworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIjsgIiArIGluZGV4ICsgIis9Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJzdGVwIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiKSB7Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiOyAiICsgaW5kZXggKyAiKyspIHsiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWYgdmFyIGlzIHNwZWNpZmllZCBhbmQgdGhlIGJvZHkgY29udGFpbnMgYW4gRUwsIHRoZW4gc3ljbgorICAgICAgICAvLyB0aGUgdmFyIGF0dHJpYnV0ZQorICAgICAgICBpZiAoaGFzVmFyIC8qICYmIGN0eHQuaGFzRUwoKSAqLykgeworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIl9qc3B4X3BhZ2VfY29udGV4dC5zZXRBdHRyaWJ1dGUoIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJ2YXIiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIsIFN0cmluZy52YWx1ZU9mKCIgKyBpbmRleCArICIpKTsiKTsKKyAgICAgICAgfQorICAgICAgICBjdHh0LmdlbmVyYXRlQm9keSgpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgifSIpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBjb2RlcyBmb3IgQ29sbGVjdGlvbnMKKyAgICAgKiBUaGUgcHNldWRvIGNvZGUgaXM6CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRvQ29sbGVjdGlvbihUYWdQbHVnaW5Db250ZXh0IGN0eHQpIHsKKyAgICAgICAgCisgICAgICAgIGN0eHQuZ2VuZXJhdGVJbXBvcnQoImphdmEudXRpbC4qIik7CisgICAgICAgIGdlbmVyYXRlSXRlcmF0b3JzKGN0eHQpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIGl0ZW1zViA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJPYmplY3QgIiArIGl0ZW1zViArICI9ICIpOworICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJpdGVtcyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiOyIpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIGluZGV4Vj1udWxsLCBiZWdpblY9bnVsbCwgZW5kVj1udWxsLCBzdGVwVj1udWxsOworICAgICAgICBpZiAoaGFzQmVnaW4pIHsKKyAgICAgICAgICAgIGJlZ2luViA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiaW50ICIgKyBiZWdpblYgKyAiID0gIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJiZWdpbiIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIjsiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGFzRW5kKSB7CisgICAgICAgICAgICBpbmRleFYgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImludCAiICsgaW5kZXhWICsgIiA9IDA7Iik7CisgICAgICAgICAgICBlbmRWID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJpbnQgIiArIGVuZFYgKyAiID0gIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJlbmQiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCI7Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhc1N0ZXApIHsKKyAgICAgICAgICAgIHN0ZXBWID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJpbnQgIiArIHN0ZXBWICsgIiA9ICIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUF0dHJpYnV0ZSgic3RlcCIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIjsiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIGl0ZXJWID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIkl0ZXJhdG9yICIgKyBpdGVyViArICIgPSBudWxsOyIpOworICAgICAgICAvLyBPYmplY3RbXQorICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiaWYgKCIgKyBpdGVtc1YgKyAiIGluc3RhbmNlb2YgT2JqZWN0W10pIik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKGl0ZXJWICsgIj10b0l0ZXJhdG9yKChPYmplY3RbXSkiICsgaXRlbXNWICsgIik7Iik7CisgICAgICAgIC8vIGJvb2xlYW5bXQorICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiZWxzZSBpZiAoIiArIGl0ZW1zViArICIgaW5zdGFuY2VvZiBib29sZWFuW10pIik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKGl0ZXJWICsgIj10b0l0ZXJhdG9yKChib29sZWFuW10pIiArIGl0ZW1zViArICIpOyIpOworICAgICAgICAvLyBieXRlW10KKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImVsc2UgaWYgKCIgKyBpdGVtc1YgKyAiIGluc3RhbmNlb2YgYnl0ZVtdKSIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZShpdGVyViArICI9dG9JdGVyYXRvcigoYnl0ZVtdKSIgKyBpdGVtc1YgKyAiKTsiKTsKKyAgICAgICAgLy8gY2hhcltdCisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJlbHNlIGlmICgiICsgaXRlbXNWICsgIiBpbnN0YW5jZW9mIGNoYXJbXSkiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaXRlclYgKyAiPXRvSXRlcmF0b3IoKGNoYXJbXSkiICsgaXRlbXNWICsgIik7Iik7CisgICAgICAgIC8vIHNob3J0W10KKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImVsc2UgaWYgKCIgKyBpdGVtc1YgKyAiIGluc3RhbmNlb2Ygc2hvcnRbXSkiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaXRlclYgKyAiPXRvSXRlcmF0b3IoKHNob3J0W10pIiArIGl0ZW1zViArICIpOyIpOworICAgICAgICAvLyBpbnRbXQorICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiZWxzZSBpZiAoIiArIGl0ZW1zViArICIgaW5zdGFuY2VvZiBpbnRbXSkiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaXRlclYgKyAiPXRvSXRlcmF0b3IoKGludFtdKSIgKyBpdGVtc1YgKyAiKTsiKTsKKyAgICAgICAgLy8gbG9uZ1tdCisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJlbHNlIGlmICgiICsgaXRlbXNWICsgIiBpbnN0YW5jZW9mIGxvbmdbXSkiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaXRlclYgKyAiPXRvSXRlcmF0b3IoKGxvbmdbXSkiICsgaXRlbXNWICsgIik7Iik7CisgICAgICAgIC8vIGZsb2F0W10KKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImVsc2UgaWYgKCIgKyBpdGVtc1YgKyAiIGluc3RhbmNlb2YgZmxvYXRbXSkiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaXRlclYgKyAiPXRvSXRlcmF0b3IoKGZsb2F0W10pIiArIGl0ZW1zViArICIpOyIpOworICAgICAgICAvLyBkb3VibGVbXQorICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiZWxzZSBpZiAoIiArIGl0ZW1zViArICIgaW5zdGFuY2VvZiBkb3VibGVbXSkiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaXRlclYgKyAiPXRvSXRlcmF0b3IoKGRvdWJsZVtdKSIgKyBpdGVtc1YgKyAiKTsiKTsKKyAgICAgICAgCisgICAgICAgIC8vIENvbGxlY3Rpb24KKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImVsc2UgaWYgKCIgKyBpdGVtc1YgKyAiIGluc3RhbmNlb2YgQ29sbGVjdGlvbikiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaXRlclYgKyAiPSgoQ29sbGVjdGlvbikiICsgaXRlbXNWICsgIikuaXRlcmF0b3IoKTsiKTsKKyAgICAgICAgCisgICAgICAgIC8vIEl0ZXJhdG9yCisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJlbHNlIGlmICgiICsgaXRlbXNWICsgIiBpbnN0YW5jZW9mIEl0ZXJhdG9yKSIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZShpdGVyViArICI9KEl0ZXJhdG9yKSIgKyBpdGVtc1YgKyAiOyIpOworICAgICAgICAKKyAgICAgICAgLy8gRW51bWVyYXRpb24KKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImVsc2UgaWYgKCIgKyBpdGVtc1YgKyAiIGluc3RhbmNlb2YgRW51bWVyYXRpb24pIik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKGl0ZXJWICsgIj10b0l0ZXJhdG9yKChFbnVtZXJhdGlvbikiICsgaXRlbXNWICsgIik7Iik7CisgICAgICAgIAorICAgICAgICAvLyBNYXAKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImVsc2UgaWYgKCIgKyBpdGVtc1YgKyAiIGluc3RhbmNlb2YgTWFwKSIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZShpdGVyViArICI9KChNYXApIiArIGl0ZW1zViArICIpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsiKTsKKyAgICAgICAgCisgICAgICAgIGlmIChoYXNCZWdpbikgeworICAgICAgICAgICAgU3RyaW5nIHRWID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJmb3IgKGludCAiICsgdFYgKyAiPSIgKyBiZWdpblYgKyAiOyIgKworICAgICAgICAgICAgICAgICAgICB0ViArICI+MCAmJiAiICsgaXRlclYgKyAiLmhhc05leHQoKTsgIiArCisgICAgICAgICAgICAgICAgICAgIHRWICsgIi0tKSIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaXRlclYgKyAiLm5leHQoKTsiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIndoaWxlICgiICsgaXRlclYgKyAiLmhhc05leHQoKSl7Iik7CisgICAgICAgIGlmIChoYXNWYXIpIHsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJfanNweF9wYWdlX2NvbnRleHQuc2V0QXR0cmlidXRlKCIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUF0dHJpYnV0ZSgidmFyIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiLCAiICsgaXRlclYgKyAiLm5leHQoKSk7Iik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGN0eHQuZ2VuZXJhdGVCb2R5KCk7CisgICAgICAgIAorICAgICAgICBpZiAoaGFzU3RlcCkgeworICAgICAgICAgICAgU3RyaW5nIHRWID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJmb3IgKGludCAiICsgdFYgKyAiPSIgKyBzdGVwViArICItMTsiICsKKyAgICAgICAgICAgICAgICAgICAgdFYgKyAiPjAgJiYgIiArIGl0ZXJWICsgIi5oYXNOZXh0KCk7ICIgKworICAgICAgICAgICAgICAgICAgICB0ViArICItLSkiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKGl0ZXJWICsgIi5uZXh0KCk7Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhc0VuZCkgeworICAgICAgICAgICAgaWYgKGhhc1N0ZXApIHsKKyAgICAgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZShpbmRleFYgKyAiKz0iICsgc3RlcFYgKyAiOyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaW5kZXhWICsgIisrOyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhc0JlZ2luKSB7CisgICAgICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImlmKCIgKyBiZWdpblYgKyAiKyIgKyBpbmRleFYgKworICAgICAgICAgICAgICAgICAgICAgICAgIj4iKyBlbmRWICsgIikiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJpZigiICsgaW5kZXhWICsgIj4iICsgZW5kViArICIpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiYnJlYWs7Iik7CisgICAgICAgIH0KKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIn0iKTsJLy8gd2hpbGUKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgaXRlcmF0b3JzIGZvciBkYXRhIHR5cGVzIHN1cHBvcnRlZCBpbiBpdGVtcworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUl0ZXJhdG9ycyhUYWdQbHVnaW5Db250ZXh0IGN0eHQpIHsKKyAgICAgICAgCisgICAgICAgIC8vIE9iamVjdFtdCisgICAgICAgIGN0eHQuZ2VuZXJhdGVEZWNsYXJhdGlvbigiT2JqZWN0QXJyYXlJdGVyYXRvciIsIAorICAgICAgICAgICAgICAgICJwcml2YXRlIEl0ZXJhdG9yIHRvSXRlcmF0b3IoZmluYWwgT2JqZWN0W10gYSl7XG4iICsKKyAgICAgICAgICAgICAgICAiICByZXR1cm4gKG5ldyBJdGVyYXRvcigpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgaW50IGluZGV4PTA7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgcmV0dXJuIGluZGV4IDwgYS5sZW5ndGg7fVxuIiArCisgICAgICAgICAgICAgICAgIiAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgcmV0dXJuIGFbaW5kZXgrK107fVxuIiArCisgICAgICAgICAgICAgICAgIiAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7fVxuIiArCisgICAgICAgICAgICAgICAgIiAgfSk7XG4iICsKKyAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgKTsKKyAgICAgICAgCisgICAgICAgIC8vIGJvb2xlYW5bXQorICAgICAgICBjdHh0LmdlbmVyYXRlRGVjbGFyYXRpb24oImJvb2xlYW5BcnJheUl0ZXJhdG9yIiwgCisgICAgICAgICAgICAgICAgInByaXZhdGUgSXRlcmF0b3IgdG9JdGVyYXRvcihmaW5hbCBib29sZWFuW10gYSl7XG4iICsKKyAgICAgICAgICAgICAgICAiICByZXR1cm4gKG5ldyBJdGVyYXRvcigpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgaW50IGluZGV4PTA7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgcmV0dXJuIGluZGV4IDwgYS5sZW5ndGg7fVxuIiArCisgICAgICAgICAgICAgICAgIiAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgcmV0dXJuIG5ldyBCb29sZWFuKGFbaW5kZXgrK10pO31cbiIgKworICAgICAgICAgICAgICAgICIgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkge31cbiIgKworICAgICAgICAgICAgICAgICIgIH0pO1xuIiArCisgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICk7CisgICAgICAgIAorICAgICAgICAvLyBieXRlW10KKyAgICAgICAgY3R4dC5nZW5lcmF0ZURlY2xhcmF0aW9uKCJieXRlQXJyYXlJdGVyYXRvciIsIAorICAgICAgICAgICAgICAgICJwcml2YXRlIEl0ZXJhdG9yIHRvSXRlcmF0b3IoZmluYWwgYnl0ZVtdIGEpe1xuIiArCisgICAgICAgICAgICAgICAgIiAgcmV0dXJuIChuZXcgSXRlcmF0b3IoKSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIGludCBpbmRleD0wO1xuIiArCisgICAgICAgICAgICAgICAgIiAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkge1xuIiArCisgICAgICAgICAgICAgICAgIiAgICAgIHJldHVybiBpbmRleCA8IGEubGVuZ3RoO31cbiIgKworICAgICAgICAgICAgICAgICIgICAgcHVibGljIE9iamVjdCBuZXh0KCkge1xuIiArCisgICAgICAgICAgICAgICAgIiAgICAgIHJldHVybiBuZXcgQnl0ZShhW2luZGV4KytdKTt9XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHt9XG4iICsKKyAgICAgICAgICAgICAgICAiICB9KTtcbiIgKworICAgICAgICAgICAgICAgICJ9IgorICAgICAgICApOworICAgICAgICAKKyAgICAgICAgLy8gY2hhcltdCisgICAgICAgIGN0eHQuZ2VuZXJhdGVEZWNsYXJhdGlvbigiY2hhckFycmF5SXRlcmF0b3IiLCAKKyAgICAgICAgICAgICAgICAicHJpdmF0ZSBJdGVyYXRvciB0b0l0ZXJhdG9yKGZpbmFsIGNoYXJbXSBhKXtcbiIgKworICAgICAgICAgICAgICAgICIgIHJldHVybiAobmV3IEl0ZXJhdG9yKCkge1xuIiArCisgICAgICAgICAgICAgICAgIiAgICBpbnQgaW5kZXg9MDtcbiIgKworICAgICAgICAgICAgICAgICIgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICByZXR1cm4gaW5kZXggPCBhLmxlbmd0aDt9XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICByZXR1cm4gbmV3IENoYXJhY3RlcihhW2luZGV4KytdKTt9XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHt9XG4iICsKKyAgICAgICAgICAgICAgICAiICB9KTtcbiIgKworICAgICAgICAgICAgICAgICJ9IgorICAgICAgICApOworICAgICAgICAKKyAgICAgICAgLy8gc2hvcnRbXQorICAgICAgICBjdHh0LmdlbmVyYXRlRGVjbGFyYXRpb24oInNob3J0QXJyYXlJdGVyYXRvciIsIAorICAgICAgICAgICAgICAgICJwcml2YXRlIEl0ZXJhdG9yIHRvSXRlcmF0b3IoZmluYWwgc2hvcnRbXSBhKXtcbiIgKworICAgICAgICAgICAgICAgICIgIHJldHVybiAobmV3IEl0ZXJhdG9yKCkge1xuIiArCisgICAgICAgICAgICAgICAgIiAgICBpbnQgaW5kZXg9MDtcbiIgKworICAgICAgICAgICAgICAgICIgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICByZXR1cm4gaW5kZXggPCBhLmxlbmd0aDt9XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICByZXR1cm4gbmV3IFNob3J0KGFbaW5kZXgrK10pO31cbiIgKworICAgICAgICAgICAgICAgICIgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkge31cbiIgKworICAgICAgICAgICAgICAgICIgIH0pO1xuIiArCisgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICk7CisgICAgICAgIAorICAgICAgICAvLyBpbnRbXQorICAgICAgICBjdHh0LmdlbmVyYXRlRGVjbGFyYXRpb24oImludEFycmF5SXRlcmF0b3IiLCAKKyAgICAgICAgICAgICAgICAicHJpdmF0ZSBJdGVyYXRvciB0b0l0ZXJhdG9yKGZpbmFsIGludFtdIGEpe1xuIiArCisgICAgICAgICAgICAgICAgIiAgcmV0dXJuIChuZXcgSXRlcmF0b3IoKSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIGludCBpbmRleD0wO1xuIiArCisgICAgICAgICAgICAgICAgIiAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkge1xuIiArCisgICAgICAgICAgICAgICAgIiAgICAgIHJldHVybiBpbmRleCA8IGEubGVuZ3RoO31cbiIgKworICAgICAgICAgICAgICAgICIgICAgcHVibGljIE9iamVjdCBuZXh0KCkge1xuIiArCisgICAgICAgICAgICAgICAgIiAgICAgIHJldHVybiBuZXcgSW50ZWdlcihhW2luZGV4KytdKTt9XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHt9XG4iICsKKyAgICAgICAgICAgICAgICAiICB9KTtcbiIgKworICAgICAgICAgICAgICAgICJ9IgorICAgICAgICApOworICAgICAgICAKKyAgICAgICAgLy8gbG9uZ1tdCisgICAgICAgIGN0eHQuZ2VuZXJhdGVEZWNsYXJhdGlvbigibG9uZ0FycmF5SXRlcmF0b3IiLCAKKyAgICAgICAgICAgICAgICAicHJpdmF0ZSBJdGVyYXRvciB0b0l0ZXJhdG9yKGZpbmFsIGxvbmdbXSBhKXtcbiIgKworICAgICAgICAgICAgICAgICIgIHJldHVybiAobmV3IEl0ZXJhdG9yKCkge1xuIiArCisgICAgICAgICAgICAgICAgIiAgICBpbnQgaW5kZXg9MDtcbiIgKworICAgICAgICAgICAgICAgICIgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICByZXR1cm4gaW5kZXggPCBhLmxlbmd0aDt9XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICByZXR1cm4gbmV3IExvbmcoYVtpbmRleCsrXSk7fVxuIiArCisgICAgICAgICAgICAgICAgIiAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7fVxuIiArCisgICAgICAgICAgICAgICAgIiAgfSk7XG4iICsKKyAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgKTsKKyAgICAgICAgCisgICAgICAgIC8vIGZsb2F0W10KKyAgICAgICAgY3R4dC5nZW5lcmF0ZURlY2xhcmF0aW9uKCJmbG9hdEFycmF5SXRlcmF0b3IiLAorICAgICAgICAgICAgICAgICJwcml2YXRlIEl0ZXJhdG9yIHRvSXRlcmF0b3IoZmluYWwgZmxvYXRbXSBhKXtcbiIgKworICAgICAgICAgICAgICAgICIgIHJldHVybiAobmV3IEl0ZXJhdG9yKCkge1xuIiArCisgICAgICAgICAgICAgICAgIiAgICBpbnQgaW5kZXg9MDtcbiIgKworICAgICAgICAgICAgICAgICIgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICByZXR1cm4gaW5kZXggPCBhLmxlbmd0aDt9XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICByZXR1cm4gbmV3IEZsb2F0KGFbaW5kZXgrK10pO31cbiIgKworICAgICAgICAgICAgICAgICIgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkge31cbiIgKworICAgICAgICAgICAgICAgICIgIH0pO1xuIiArCisgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICk7CisgICAgICAgIAorICAgICAgICAvLyBkb3VibGVbXQorICAgICAgICBjdHh0LmdlbmVyYXRlRGVjbGFyYXRpb24oImRvdWJsZUFycmF5SXRlcmF0b3IiLAorICAgICAgICAgICAgICAgICJwcml2YXRlIEl0ZXJhdG9yIHRvSXRlcmF0b3IoZmluYWwgZG91YmxlW10gYSl7XG4iICsKKyAgICAgICAgICAgICAgICAiICByZXR1cm4gKG5ldyBJdGVyYXRvcigpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgaW50IGluZGV4PTA7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgcmV0dXJuIGluZGV4IDwgYS5sZW5ndGg7fVxuIiArCisgICAgICAgICAgICAgICAgIiAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgcmV0dXJuIG5ldyBEb3VibGUoYVtpbmRleCsrXSk7fVxuIiArCisgICAgICAgICAgICAgICAgIiAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7fVxuIiArCisgICAgICAgICAgICAgICAgIiAgfSk7XG4iICsKKyAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgKTsKKyAgICAgICAgCisgICAgICAgIC8vIEVudW1lcmF0aW9uCisgICAgICAgIGN0eHQuZ2VuZXJhdGVEZWNsYXJhdGlvbigiZW51bUl0ZXJhdG9yIiwKKyAgICAgICAgICAgICAgICAicHJpdmF0ZSBJdGVyYXRvciB0b0l0ZXJhdG9yKGZpbmFsIEVudW1lcmF0aW9uIGUpe1xuIiArCisgICAgICAgICAgICAgICAgIiAgcmV0dXJuIChuZXcgSXRlcmF0b3IoKSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgcmV0dXJuIGUuaGFzTW9yZUVsZW1lbnRzKCk7fVxuIiArCisgICAgICAgICAgICAgICAgIiAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgcmV0dXJuIGUubmV4dEVsZW1lbnQoKTt9XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHt9XG4iICsKKyAgICAgICAgICAgICAgICAiICB9KTtcbiIgKworICAgICAgICAgICAgICAgICJ9IgorICAgICAgICApOworICAgICAgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9jb3JlL0ZvclRva2Vucy5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvY29yZS9Gb3JUb2tlbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzJmMGFkCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvY29yZS9Gb3JUb2tlbnMuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuY29yZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi5UYWdQbHVnaW47CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIudGFncGx1Z2luLlRhZ1BsdWdpbkNvbnRleHQ7CisKK3B1YmxpYyBjbGFzcyBGb3JUb2tlbnMgaW1wbGVtZW50cyBUYWdQbHVnaW4geworICAgIAorICAgIHB1YmxpYyB2b2lkIGRvVGFnKFRhZ1BsdWdpbkNvbnRleHQgY3R4dCkgeworICAgICAgICBib29sZWFuIGhhc1ZhciwgaGFzVmFyU3RhdHVzLCBoYXNCZWdpbiwgaGFzRW5kLCBoYXNTdGVwOworICAgICAgICAKKyAgICAgICAgLy9pbml0IHRoZSBmbGFncworICAgICAgICBoYXNWYXIgPSBjdHh0LmlzQXR0cmlidXRlU3BlY2lmaWVkKCJ2YXIiKTsKKyAgICAgICAgaGFzVmFyU3RhdHVzID0gY3R4dC5pc0F0dHJpYnV0ZVNwZWNpZmllZCgidmFyU3RhdHVzIik7CisgICAgICAgIGhhc0JlZ2luID0gY3R4dC5pc0F0dHJpYnV0ZVNwZWNpZmllZCgiYmVnaW4iKTsKKyAgICAgICAgaGFzRW5kID0gY3R4dC5pc0F0dHJpYnV0ZVNwZWNpZmllZCgiZW5kIik7CisgICAgICAgIGhhc1N0ZXAgPSBjdHh0LmlzQXR0cmlidXRlU3BlY2lmaWVkKCJzdGVwIik7CisgICAgICAgIAorICAgICAgICBpZihoYXNWYXJTdGF0dXMpeworICAgICAgICAgICAgY3R4dC5kb250VXNlVGFnUGx1Z2luKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vZGVmaW5lIGFsbCB0aGUgdGVtcCB2YXJpYWJsZXMnIG5hbWVzCisgICAgICAgIFN0cmluZyBpdGVtc05hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICBTdHJpbmcgZGVsaW1zTmFtZSA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisgICAgICAgIFN0cmluZyBzdE5hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICBTdHJpbmcgYmVnaW5OYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGVuZE5hbWUgID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHN0ZXBOYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGluZGV4ID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHRlbXAgID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHRva2Vuc0NvdW50TmFtZSA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisgICAgICAgIAorICAgICAgICAvL2dldCB0aGUgdmFsdWUgb2YgdGhlICJpdGVtcyIgYXR0cmlidXRlIAorICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiU3RyaW5nICIgKyBpdGVtc05hbWUgKyAiID0gKFN0cmluZykiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUF0dHJpYnV0ZSgiaXRlbXMiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIjsiKTsKKyAgICAgICAgCisgICAgICAgIC8vZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgImRlbGltIiBhdHRyaWJ1dGUKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIlN0cmluZyAiICsgZGVsaW1zTmFtZSArICIgPSAoU3RyaW5nKSIpOworICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJkZWxpbXMiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIjsiKTsKKyAgICAgICAgCisgICAgICAgIC8vbmV3IGEgU3RyaW5nVG9rZW5pemVyIE9iamVjdCBhY2NvcmRpbmcgdG8gdGhlICJpdGVtcyIgYW5kIHRoZSAiZGVsaW0iCisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyICIgKyBzdE5hbWUgKyAiID0gIiArCisgICAgICAgICAgICAgICAgIm5ldyBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyKCIgKyBpdGVtc05hbWUgKyAiLCAiICsgZGVsaW1zTmFtZSArICIpOyIpOworICAgICAgICAKKyAgICAgICAgLy9pZiAiYmVnaW4iIHNwZWNpZmllZCwgbW92ZSB0aGUgdG9rZW4gdG8gdGhlICJiZWdpbiIgcGxhY2UKKyAgICAgICAgLy9hbmQgcmVjb3JkIHRoZSBiZWdpbiBpbmRleC4gZGVmYXVsdCBiZWdpbiBwbGFjZSBpcyAwLgorICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiaW50ICIgKyB0b2tlbnNDb3VudE5hbWUgKyAiID0gIiArIHN0TmFtZSArICIuY291bnRUb2tlbnMoKTsiKTsKKyAgICAgICAgaWYoaGFzQmVnaW4peworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImludCAiICsgYmVnaW5OYW1lICsgIiA9ICIgICk7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJiZWdpbiIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIjsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJmb3IoaW50ICIgKyBpbmRleCArICIgPSAwOyAiICsgaW5kZXggKyAiIDwgIiArIGJlZ2luTmFtZSArICIgJiYgIiArIHN0TmFtZSArICIuaGFzTW9yZVRva2VucygpOyAiICsgaW5kZXggKyAiKyssICIgKyBzdE5hbWUgKyAiLm5leHRUb2tlbigpKXt9Iik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImludCAiICsgYmVnaW5OYW1lICsgIiA9IDA7Iik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vd2hlbiAiZW5kIiBpcyBzcGVjaWZpZWQsIGlmIHRoZSAiZW5kIiBpcyBtb3JlIHRoYW4gdGhlIGxhc3QgaW5kZXgsCisgICAgICAgIC8vcmVjb3JkIHRoZSBlbmQgcGxhY2UgYXMgdGhlIGxhc3QgaW5kZXgsIG90aGVyd2lzZSwgcmVjb3JkIGl0IGFzICJlbmQiOworICAgICAgICAvL2RlZmF1bHQgZW5kIHBsYWNlIGlzIHRoZSBsYXN0IGluZGV4IAorICAgICAgICBpZihoYXNFbmQpeworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImludCAiICsgZW5kTmFtZSArICIgPSAwOyIgICk7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiaWYoKCIgKyB0b2tlbnNDb3VudE5hbWUgKyAiIC0gMSkgPCAiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVBdHRyaWJ1dGUoImVuZCIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIil7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICIgKyBlbmROYW1lICsgIiA9ICIgKyB0b2tlbnNDb3VudE5hbWUgKyAiIC0gMTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJ9ZWxzZXsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgIiArIGVuZE5hbWUgKyAiID0gIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJlbmQiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCI7fSIpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJpbnQgIiArIGVuZE5hbWUgKyAiID0gIiArIHRva2Vuc0NvdW50TmFtZSArICIgLSAxOyIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvL2dldCB0aGUgc3RlcCB2YWx1ZSBmcm9tICJzdGVwIiBpZiBzcGVjaWZpZWQuCisgICAgICAgIC8vZGVmYXVsdCBzdGVwIHZhbHVlIGlzIDEuCisgICAgICAgIGlmKGhhc1N0ZXApeworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImludCAiICsgc3RlcE5hbWUgKyAiID0gIiAgKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVBdHRyaWJ1dGUoInN0ZXAiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCI7Iik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImludCAiICsgc3RlcE5hbWUgKyAiID0gMTsiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy90aGUgbG9vcAorICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiZm9yKGludCAiICsgaW5kZXggKyAiID0gIiArIGJlZ2luTmFtZSArICI7ICIgKyBpbmRleCArICIgPD0gIiArIGVuZE5hbWUgKyAiOyAiICsgaW5kZXggKyAiKyspeyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIFN0cmluZyAiICsgdGVtcCArICIgPSAiICsgc3ROYW1lICsgIi5uZXh0VG9rZW4oKTsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICBpZigoKCIgKyBpbmRleCArICIgLSAiICsgYmVnaW5OYW1lICsgIikgJSAiICsgc3RlcE5hbWUgKyAiKSA9PSAwKXsiKTsKKyAgICAgICAgLy9pZiB2YXIgc3BlY2lmaWVkLCBwdXQgdGhlIGN1cnJlbnQgdG9rZW4gaW50byB0aGUgYXR0cmlidXRlICJ2YXIiIGRlZmluZXMuCisgICAgICAgIGlmKGhhc1Zhcil7CisgICAgICAgICAgICBTdHJpbmcgc3RyVmFyID0gY3R4dC5nZXRDb25zdGFudEF0dHJpYnV0ZSgidmFyIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICBwYWdlQ29udGV4dC5zZXRBdHRyaWJ1dGUoXCIiICsgc3RyVmFyICsgIlwiLCAiICsgdGVtcCArICIpOyIpOworICAgICAgICB9CisgICAgICAgIGN0eHQuZ2VuZXJhdGVCb2R5KCk7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgfSIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgifSIpOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL2NvcmUvSWYuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL2NvcmUvSWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjVhNmRmCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvY29yZS9JZi5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLmNvcmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci50YWdwbHVnaW4uKjsKKworcHVibGljIGZpbmFsIGNsYXNzIElmIGltcGxlbWVudHMgVGFnUGx1Z2luIHsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkb1RhZyhUYWdQbHVnaW5Db250ZXh0IGN0eHQpIHsKKyAgICAgICAgU3RyaW5nIGNvbmRWID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImJvb2xlYW4gIiArIGNvbmRWICsgIj0iKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUF0dHJpYnV0ZSgidGVzdCIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiOyIpOworICAgICAgICBpZiAoY3R4dC5pc0F0dHJpYnV0ZVNwZWNpZmllZCgidmFyIikpIHsKKyAgICAgICAgICAgIFN0cmluZyBzY29wZSA9ICJQYWdlQ29udGV4dC5QQUdFX1NDT1BFIjsKKyAgICAgICAgICAgIGlmIChjdHh0LmlzQXR0cmlidXRlU3BlY2lmaWVkKCJzY29wZSIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHNjb3BlU3RyID0gY3R4dC5nZXRDb25zdGFudEF0dHJpYnV0ZSgic2NvcGUiKTsKKyAgICAgICAgICAgICAgICBpZiAoInJlcXVlc3QiLmVxdWFscyhzY29wZVN0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUgPSAiUGFnZUNvbnRleHQuUkVRVUVTVF9TQ09QRSI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgic2Vzc2lvbiIuZXF1YWxzKHNjb3BlU3RyKSkgeworICAgICAgICAgICAgICAgICAgICBzY29wZSA9ICJQYWdlQ29udGV4dC5TRVNTSU9OX1NDT1BFIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJhcHBsaWNhdGlvbiIuZXF1YWxzKHNjb3BlU3RyKSkgeworICAgICAgICAgICAgICAgICAgICBzY29wZSA9ICJQYWdlQ29udGV4dC5BUFBMSUNBVElPTl9TQ09QRSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIl9qc3B4X3BhZ2VfY29udGV4dC5zZXRBdHRyaWJ1dGUoIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJ2YXIiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIsIG5ldyBCb29sZWFuKCIgKyBjb25kViArICIpLCIgKyBzY29wZSArICIpOyIpOworICAgICAgICB9CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJpZiAoIiArIGNvbmRWICsgIil7Iik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVCb2R5KCk7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJ9Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvY29yZS9JbXBvcnQuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL2NvcmUvSW1wb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwMzQyOQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL2NvcmUvSW1wb3J0LmphdmEKQEAgLTAsMCArMSwzODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLmNvcmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci50YWdwbHVnaW4uVGFnUGx1Z2luOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi5UYWdQbHVnaW5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5VdGlsOworCitwdWJsaWMgY2xhc3MgSW1wb3J0IGltcGxlbWVudHMgVGFnUGx1Z2luIHsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkb1RhZyhUYWdQbHVnaW5Db250ZXh0IGN0eHQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNDb250ZXh0LCBoYXNWYXIsIGhhc1Njb3BlLCBoYXNWYXJSZWFkZXIsIGhhc0NoYXJFbmNvZGluZzsKKyAgICAgICAgCisgICAgICAgIC8vZmxhZ3MKKyAgICAgICAgaGFzQ29udGV4dCAgPSBjdHh0LmlzQXR0cmlidXRlU3BlY2lmaWVkKCJjb250ZXh0Iik7CisgICAgICAgIGhhc1ZhciA9IGN0eHQuaXNBdHRyaWJ1dGVTcGVjaWZpZWQoInZhciIpOworICAgICAgICBoYXNTY29wZSA9IGN0eHQuaXNBdHRyaWJ1dGVTcGVjaWZpZWQoInNjb3BlIik7CisgICAgICAgIGhhc1ZhclJlYWRlciA9IGN0eHQuaXNBdHRyaWJ1dGVTcGVjaWZpZWQoInZhclJlYWRlciIpOworICAgICAgICBoYXNDaGFyRW5jb2RpbmcgPSBjdHh0LmlzQXR0cmlidXRlU3BlY2lmaWVkKCJjaGFyRW5jb2RpbmciKTsKKyAgICAgICAgCisgICAgICAgIC8vdmFyaWFibGVzJyBuYW1lcworICAgICAgICBTdHJpbmcgdXJsTmFtZSA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7ICAgICAgICAgICAKKyAgICAgICAgU3RyaW5nIGNvbnRleHROYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsgICAgICAgCisgICAgICAgIFN0cmluZyBpYXVOYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsgICAgICAgICAgIC8vIGlzIGFic29sdXRlIHVybAorICAgICAgICBTdHJpbmcgdXJsT2JqTmFtZSA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7ICAgICAgICAvL1VSTCBvYmplY3QKKyAgICAgICAgU3RyaW5nIHVjTmFtZSA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7ICAgICAgICAgICAgLy9VUkxDb25uZWN0aW9uCisgICAgICAgIFN0cmluZyBpbnB1dFN0cmVhbU5hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOyAgIAorICAgICAgICBTdHJpbmcgdGVtcFJlYWRlck5hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICBTdHJpbmcgdGVtcFJlYWRlck5hbWUyID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGNoYXJTZXROYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGNoYXJFbmNvZGluZ05hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICBTdHJpbmcgY29udGVudFR5cGVOYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHZhclJlYWRlck5hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICBTdHJpbmcgc2VydmxldENvbnRleHROYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHNlcnZsZXRQYXRoTmFtZSA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisgICAgICAgIFN0cmluZyByZXF1ZXN0RGlzcGF0Y2hlck5hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICBTdHJpbmcgaXJ3TmFtZSA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7ICAgICAgICAgICAvL0ltcG9ydFJlc3BvbnNlV3JhcHBlciBuYW1lCisgICAgICAgIFN0cmluZyBick5hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOyAgICAgICAgICAgIC8vQnVmZmVyZWRSZWFkZXIgbmFtZQorICAgICAgICBTdHJpbmcgc2JOYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsgICAgICAgICAgICAvL1N0cmluZ0J1ZmZlciBuYW1lCisgICAgICAgIFN0cmluZyB0ZW1wU3RyaW5nTmFtZSA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisgICAgICAgIAorICAgICAgICAvL2lzIGFic29sdXRlIHVybAorICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiYm9vbGVhbiAiICsgaWF1TmFtZSArICI7Iik7CisgICAgICAgIAorICAgICAgICAvL2dldCB0aGUgdXJsIHZhbHVlCisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJTdHJpbmcgIiArIHVybE5hbWUgKyAiID0gIik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVBdHRyaWJ1dGUoInVybCIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiOyIpOworICAgICAgICAKKyAgICAgICAgLy92YWxpZGF0ZSB0aGUgdXJsCisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJpZigiICsgdXJsTmFtZSArICIgPT0gbnVsbCB8fCAiICsgdXJsTmFtZSArICIuZXF1YWxzKFwiXCIpKXsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICB0aHJvdyBuZXcgSnNwVGFnRXhjZXB0aW9uKFwiVGhlIFxcXCJ1cmxcXFwiIGF0dHJpYnV0ZSAiICsKKyAgICAgICAgImlsbGVnYWxseSBldmFsdWF0ZWQgdG8gXFxcIm51bGxcXFwiIG9yIFxcXCJcXFwiIGluICZsdDtpbXBvcnQmZ3Q7XCIpOyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgifSIpOworICAgICAgICAKKyAgICAgICAgLy9pbml0aWFsaXplIHRoZSBpc19hYnNvbHV0ZV91cmwKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaWF1TmFtZSArICIgPSAiICsKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLlV0aWwuaXNBYnNvbHV0ZVVybCgiICsgdXJsTmFtZSArICIpOyIpOworICAgICAgICAKKyAgICAgICAgLy92YWxpZGF0ZSB0aGUgY29udGV4dAorICAgICAgICBpZihoYXNDb250ZXh0KXsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIlN0cmluZyAiICsgY29udGV4dE5hbWUgKyAiID0gIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJjb250ZXh0Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiOyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiaWYoKCEiICsgY29udGV4dE5hbWUgKyAiLnN0YXJ0c1dpdGgoXCIvXCIpKSAiICsKKyAgICAgICAgICAgICAgICAgICAgInx8ICghIiArIHVybE5hbWUgKyAiLnN0YXJ0c1dpdGgoXCIvXCIpKSl7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIHRocm93IG5ldyBKc3BUYWdFeGNlcHRpb24iICsKKyAgICAgICAgICAgICAgICAgICAgIihcIkluIFVSTCB0YWdzLCB3aGVuIHRoZSBcXFwiY29udGV4dFxcXCIgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgIiArCisgICAgICAgICAgICAidmFsdWVzIG9mIGJvdGggXFxcImNvbnRleHRcXFwiIGFuZCBcXFwidXJsXFxcIiBtdXN0IHN0YXJ0IHdpdGggXFxcIi9cXFwiLlwiKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJ9Iik7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy9kZWZpbmUgY2hhcnNldAorICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiU3RyaW5nICIgKyBjaGFyU2V0TmFtZSArICIgPSBudWxsOyIpOworICAgICAgICAKKyAgICAgICAgLy9pZiB0aGUgY2hhckVuY29kaW5nIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQKKyAgICAgICAgaWYoaGFzQ2hhckVuY29kaW5nKXsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9pbml0aWFsaXplIHRoZSBjaGFyRW5jb2RpbmcKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJTdHJpbmcgIiArIGNoYXJFbmNvZGluZ05hbWUgKyAiID0gIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJjaGFyRW5jb2RpbmciKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCI7Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vYXNzaWduIGFwcHJvcHJpYXRlIHZhbHVlIHRwIHRoZSBjaGFyc2V0CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiaWYobnVsbCAhPSAiICsgY2hhckVuY29kaW5nTmFtZSArICIgIiArCisgICAgICAgICAgICAgICAgICAgICImJiAhIiArIGNoYXJFbmNvZGluZ05hbWUgKyAiLmVxdWFscyhcIlwiKSl7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICIgKyBjaGFyU2V0TmFtZSArICIgPSAiIAorICAgICAgICAgICAgICAgICAgICArIGNoYXJFbmNvZGluZ05hbWUgKyAiOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIn0iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy9yZXNoYXBlIHRoZSB1cmwgc3RyaW5nCisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJpZighIitpYXVOYW1lKyIpeyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGlmKCEiICsgdXJsTmFtZSArICIuc3RhcnRzV2l0aChcIi9cIikpeyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICBTdHJpbmcgIiArIHNlcnZsZXRQYXRoTmFtZSArICIgPSAiICsKKyAgICAgICAgIigoSHR0cFNlcnZsZXRSZXF1ZXN0KXBhZ2VDb250ZXh0LmdldFJlcXVlc3QoKSkuZ2V0U2VydmxldFBhdGgoKTsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgIiArIHVybE5hbWUgKyAiID0gIiAKKyAgICAgICAgICAgICAgICArIHNlcnZsZXRQYXRoTmFtZSArICIuc3Vic3RyaW5nKDAsIiArIHNlcnZsZXRQYXRoTmFtZSArICIubGFzdEluZGV4T2YoJy8nKSkgKyAnLycgKyAiICsgdXJsTmFtZSArICI7Iik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgfSIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgifSIpOworICAgICAgICAKKyAgICAgICAgLy9pZiB0aGUgdmFyUmVhZGVyIGF0dHJpYnV0ZSBzcGVjaWZpZWQKKyAgICAgICAgaWYoaGFzVmFyUmVhZGVyKXsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9nZXQgdGhlIFN0cmluZyB2YWx1ZSBvZiB2YXJSZWFkZXIKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJTdHJpbmcgIiArIHZhclJlYWRlck5hbWUgKyAiID0gIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJ2YXJSZWFkZXIiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCI7Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vaWYgdGhlIHVybCBpcyBhYnNvbHV0ZSB1cmwKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJpZigiICsgaWF1TmFtZSArICIpeyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL2dldCB0aGUgY29udGVudCBvZiB0aGUgdGFyZ2V0CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGphdmEubmV0LlVSTCAiICsgdXJsT2JqTmFtZSArICIgPSBuZXcgamF2YS5uZXQuVVJMKCIgKyB1cmxOYW1lICsgIik7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGphdmEubmV0LlVSTENvbm5lY3Rpb24gIiArIHVjTmFtZSArICIgPSAiIAorICAgICAgICAgICAgICAgICAgICArIHVybE9iak5hbWUgKyAiLm9wZW5Db25uZWN0aW9uKCk7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGphdmEuaW8uSW5wdXRTdHJlYW0gIiArIGlucHV0U3RyZWFtTmFtZSArICIgPSAiIAorICAgICAgICAgICAgICAgICAgICArIHVjTmFtZSArICIuZ2V0SW5wdXRTdHJlYW0oKTsiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICBpZigiICsgY2hhclNldE5hbWUgKyAiID09IG51bGwpeyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgU3RyaW5nICIgKyBjb250ZW50VHlwZU5hbWUgKyAiID0gIiAKKyAgICAgICAgICAgICAgICAgICAgKyB1Y05hbWUgKyAiLmdldENvbnRlbnRUeXBlKCk7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICBpZihudWxsICE9ICIgKyBjb250ZW50VHlwZU5hbWUgKyAiKXsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgICAgICAiICsgY2hhclNldE5hbWUgKyAiID0gIiArCisgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuVXRpbC5nZXRDb250ZW50VHlwZUF0dHJpYnV0ZSgiICsgY29udGVudFR5cGVOYW1lICsgIiwgXCJjaGFyc2V0XCIpOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgICAgIGlmKCIgKyBjaGFyU2V0TmFtZSArICIgPT0gbnVsbCkgIiAKKyAgICAgICAgICAgICAgICAgICAgKyBjaGFyU2V0TmFtZSArICIgPSBvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuVXRpbC5ERUZBVUxUX0VOQ09ESU5HOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgfWVsc2V7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICAgICAgIiArIGNoYXJTZXROYW1lICsgIiA9IG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5VdGlsLkRFRkFVTFRfRU5DT0RJTkc7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICB9Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIH0iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoIWhhc0NoYXJFbmNvZGluZyl7CisgICAgICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICBTdHJpbmcgIiArIGNvbnRlbnRUeXBlTmFtZSArICIgPSAiICsgdWNOYW1lICsgIi5nZXRDb250ZW50VHlwZSgpOyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvL2RlZmluZSB0aGUgUmVhZGVyCisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGphdmEuaW8uUmVhZGVyICIgKyB0ZW1wUmVhZGVyTmFtZSArICIgPSBudWxsOyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL2luaXRpYWxpemUgdGhlIFJlYWRlciBvYmplY3QKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgdHJ5eyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgIiArIHRlbXBSZWFkZXJOYW1lICsgIiA9IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKCIgKyBpbnB1dFN0cmVhbU5hbWUgKyAiLCAiICsgY2hhclNldE5hbWUgKyAiKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgfWNhdGNoKEV4Y2VwdGlvbiBleCl7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICAiICsgdGVtcFJlYWRlck5hbWUgKyAiID0gbmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoIiArIGlucHV0U3RyZWFtTmFtZSArICIsIG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5VdGlsLkRFRkFVTFRfRU5DT0RJTkcpOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICB9Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vdmFsaWRhdGUgdGhlIHJlc3BvbnNlCisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGlmKCIgKyB1Y05hbWUgKyAiIGluc3RhbmNlb2YgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb24peyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgaW50IHN0YXR1cyA9ICgoamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb24pICIgKyB1Y05hbWUgKyAiKS5nZXRSZXNwb25zZUNvZGUoKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgIGlmKHN0YXR1cyA8IDIwMCB8fCBzdGF0dXMgPiAyOTkpeyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgICAgIHRocm93IG5ldyBKc3BUYWdFeGNlcHRpb24oc3RhdHVzICsgXCIgXCIgKyAiICsgdXJsTmFtZSArICIpOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgfSIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICB9Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vc2V0IGF0dHJpYnV0ZSBpbiB0aGUgcGFnZSBjb250ZXh0IHNjb3BlCisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIHBhZ2VDb250ZXh0LnNldEF0dHJpYnV0ZSgiICsgdmFyUmVhZGVyTmFtZSArICIsICIgKyB0ZW1wUmVhZGVyTmFtZSArICIpOyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL2lmIHRoZSB1cmwgaXMgcmVsYXRpdmUKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJ9ZWxzZXsiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9pZiB0aGUgdXJsIGlzIHJlbGF0aXZlLCBodHRwIHJlcXVlc3QgaXMgbmVlZGVkCisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGlmICghKHBhZ2VDb250ZXh0LmdldFJlcXVlc3QoKSBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVxdWVzdCAgIiArCisgICAgICAgICAgICAiJiYgcGFnZUNvbnRleHQuZ2V0UmVzcG9uc2UoKSBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVzcG9uc2UpKXsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgIHRocm93IG5ldyBKc3BUYWdFeGNlcHRpb24oXCJSZWxhdGl2ZSAmbHQ7aW1wb3J0Jmd0OyBmcm9tIG5vbi1IVFRQIHJlcXVlc3Qgbm90IGFsbG93ZWRcIik7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIH0iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9nZXQgdGhlIHNlcnZsZXQgY29udGV4dCBvZiB0aGUgY29udGV4dCBkZWZpbmVkIGluIHRoZSBjb250ZXh0IGF0dHJpYnV0ZQorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICBTZXJ2bGV0Q29udGV4dCAiICsgc2VydmxldENvbnRleHROYW1lICsgIiA9IG51bGw7Iik7CisgICAgICAgICAgICBpZihoYXNDb250ZXh0KXsKKyAgICAgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGlmKG51bGwgIT0gIiArIGNvbnRleHROYW1lICsgIil7Iik7CisgICAgICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgIiArIHNlcnZsZXRDb250ZXh0TmFtZSArICIgPSBwYWdlQ29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldENvbnRleHQoIiArIGNvbnRleHROYW1lICsgIik7IiApOworICAgICAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgfWVsc2V7Iik7CisgICAgICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgIiArIHNlcnZsZXRDb250ZXh0TmFtZSArICIgPSBwYWdlQ29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpOyIpOworICAgICAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgfSIpOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAiICsgc2VydmxldENvbnRleHROYW1lICsgIiA9IHBhZ2VDb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCk7Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGlmKCIgKyBzZXJ2bGV0Q29udGV4dE5hbWUgKyAiID09IG51bGwpeyIpOworICAgICAgICAgICAgaWYoaGFzQ29udGV4dCl7CisgICAgICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgdGhyb3cgbmV3IEpzcFRhZ0V4Y2VwdGlvbihcIlVuYWJsZSB0byBnZXQgUmVxdWVzdERpc3BhdGNoZXIgZm9yIENvbnRleHQ6IFxcXCIgXCIrIiArIGNvbnRleHROYW1lICsgIitcIiBcXFwiIGFuZCBVUkw6IFxcXCIgXCIgKyIgKyB1cmxOYW1lICsgIisgXCIgXFxcIi4gVmVyaWZ5IHZhbHVlcyBhbmQvb3IgZW5hYmxlIGNyb3NzIGNvbnRleHQgYWNjZXNzLlwiKTsiKTsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgIHRocm93IG5ldyBKc3BUYWdFeGNlcHRpb24oXCJVbmFibGUgdG8gZ2V0IFJlcXVlc3REaXNwYXRjaGVyIGZvciAgVVJMOiBcXFwiIFwiICsiICsgdXJsTmFtZSArICIrIFwiIFxcXCIuIFZlcmlmeSB2YWx1ZXMgYW5kL29yIGVuYWJsZSBjcm9zcyBjb250ZXh0IGFjY2Vzcy5cIik7Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIH0iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9nZXQgdGhlIHJlcXVlc3QgZGlzcGF0Y2hlcgorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICBSZXF1ZXN0RGlzcGF0Y2hlciAiICsgcmVxdWVzdERpc3BhdGNoZXJOYW1lICsgIiA9ICIgKyBzZXJ2bGV0Q29udGV4dE5hbWUgKyAiLmdldFJlcXVlc3REaXNwYXRjaGVyKG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5VdGlsLnN0cmlwU2Vzc2lvbigiK3VybE5hbWUrIikpOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICBpZigiICsgcmVxdWVzdERpc3BhdGNoZXJOYW1lICsgIiA9PSBudWxsKSB0aHJvdyBuZXcgSnNwVGFnRXhjZXB0aW9uKG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5VdGlsLnN0cmlwU2Vzc2lvbigiK3VybE5hbWUrIikpOyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL2luaXRpYWxpemUgYSBJbXBvcnRSZXNwb25zZVdyYXBwZXIgdG8gaW5jbHVkZSB0aGUgcmVzb3VyY2UKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgb3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLlV0aWwuSW1wb3J0UmVzcG9uc2VXcmFwcGVyICIgKyBpcndOYW1lICsgIiA9IG5ldyBvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuVXRpbC5JbXBvcnRSZXNwb25zZVdyYXBwZXIoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHBhZ2VDb250ZXh0LmdldFJlc3BvbnNlKCkpOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICBpZigiICsgY2hhclNldE5hbWUgKyAiID09IG51bGwpeyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgIiArIGNoYXJTZXROYW1lICsgIiA9IG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5VdGlsLkRFRkFVTFRfRU5DT0RJTkc7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIH0iKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgIiArIGlyd05hbWUgKyAiLnNldENoYXJFbmNvZGluZygiICsgY2hhclNldE5hbWUgKyAiKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgdHJ5eyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgIiArIHJlcXVlc3REaXNwYXRjaGVyTmFtZSArICIuaW5jbHVkZShwYWdlQ29udGV4dC5nZXRSZXF1ZXN0KCksICIgKyBpcndOYW1lICsgIik7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIH1jYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KXsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oZXgpOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICB9Y2F0Y2goUnVudGltZUV4Y2VwdGlvbiBleCl7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKGV4KTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgfWNhdGNoKFNlcnZsZXRFeGNlcHRpb24gZXgpeyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgVGhyb3dhYmxlIHJjID0gZXguZ2V0Um9vdENhdXNlKCk7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICBpZiAocmMgPT0gbnVsbCkiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKGV4KTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgIGVsc2UiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKHJjKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgfSIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL3ZhbGlkYXRlIHRoZSByZXNwb25zZSBzdGF0dXMKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgaWYoIiArIGlyd05hbWUgKyAiLmdldFN0YXR1cygpIDwgMjAwIHx8ICIgKyBpcndOYW1lICsgIi5nZXRTdGF0dXMoKSA+IDI5OSl7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICB0aHJvdyBuZXcgSnNwVGFnRXhjZXB0aW9uKCIgKyBpcndOYW1lICsgIi5nZXRTdGF0dXMoKStcIiBcIiArIG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5VdGlsLnN0cmlwU2Vzc2lvbigiICsgdXJsTmFtZSArICIpKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgfSIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL3B1c2ggaW4gdGhlIHBhZ2UgY29udGV4dAorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICBqYXZhLmlvLlJlYWRlciAiICsgdGVtcFJlYWRlck5hbWUgKyAiID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCIgKyBpcndOYW1lICsgIi5nZXRTdHJpbmcoKSk7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIHBhZ2VDb250ZXh0LnNldEF0dHJpYnV0ZSgiICsgdmFyUmVhZGVyTmFtZSArICIsICIgKyB0ZW1wUmVhZGVyTmFtZSArICIpOyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgifSIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL2V4ZWN1dGUgdGhlIGJvZHkgYWN0aW9uCisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlQm9keSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL2Nsb3NlIHRoZSByZWFkZXIKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJqYXZhLmlvLlJlYWRlciAiICsgdGVtcFJlYWRlck5hbWUyICsgIiA9IChqYXZhLmlvLlJlYWRlcilwYWdlQ29udGV4dC5nZXRBdHRyaWJ1dGUoIiArIHZhclJlYWRlck5hbWUgKyAiKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJpZigiICsgdGVtcFJlYWRlck5hbWUyICsgIiAhPSBudWxsKSAiICsgdGVtcFJlYWRlck5hbWUyICsgIi5jbG9zZSgpOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoInBhZ2VDb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSgiICsgdmFyUmVhZGVyTmFtZSArICIsMSk7Iik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vaWYgdGhlIHZhclJlYWRlciBpcyBub3Qgc3BlY2lmaWVkIAorICAgICAgICBlbHNleworICAgICAgICAgICAgCisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgicGFnZUNvbnRleHQuc2V0QXR0cmlidXRlKFwidXJsX3dpdGhvdXRfcGFyYW1cIiwiICsgdXJsTmFtZSArICIpOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUJvZHkoKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKHVybE5hbWUgKyAiID0gKFN0cmluZylwYWdlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ1cmxfd2l0aG91dF9wYXJhbVwiKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJwYWdlQ29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoXCJ1cmxfd2l0aG91dF9wYXJhbVwiKTsiKTsKKyAgICAgICAgICAgIFN0cmluZyBzdHJTY29wZSA9ICJwYWdlIjsKKyAgICAgICAgICAgIGlmKGhhc1Njb3BlKXsKKyAgICAgICAgICAgICAgICBzdHJTY29wZSA9IGN0eHQuZ2V0Q29uc3RhbnRBdHRyaWJ1dGUoInNjb3BlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgaVNjb3BlID0gVXRpbC5nZXRTY29wZShzdHJTY29wZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJTdHJpbmcgIiArIHRlbXBTdHJpbmdOYW1lICsgIiA9IG51bGw7Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJpZigiICsgaWF1TmFtZSArICIpeyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL2dldCB0aGUgY29udGVudCBvZiB0aGUgdGFyZ2V0CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGphdmEubmV0LlVSTCAiICsgdXJsT2JqTmFtZSArICIgPSBuZXcgamF2YS5uZXQuVVJMKCIgKyB1cmxOYW1lICsgIik7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGphdmEubmV0LlVSTENvbm5lY3Rpb24gIiArIHVjTmFtZSArICIgPSAiICsgdXJsT2JqTmFtZSArICIub3BlbkNvbm5lY3Rpb24oKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgamF2YS5pby5JbnB1dFN0cmVhbSAiICsgaW5wdXRTdHJlYW1OYW1lICsgIiA9ICIgKyB1Y05hbWUgKyAiLmdldElucHV0U3RyZWFtKCk7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGphdmEuaW8uUmVhZGVyICIgKyB0ZW1wUmVhZGVyTmFtZSArICIgPSBudWxsOyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGlmKCIgKyBjaGFyU2V0TmFtZSArICIgPT0gbnVsbCl7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICBTdHJpbmcgIiArIGNvbnRlbnRUeXBlTmFtZSArICIgPSAiIAorICAgICAgICAgICAgICAgICAgICArIHVjTmFtZSArICIuZ2V0Q29udGVudFR5cGUoKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgIGlmKG51bGwgIT0gIiArIGNvbnRlbnRUeXBlTmFtZSArICIpeyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgICAgICIgKyBjaGFyU2V0TmFtZSArICIgPSAiICsKKyAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5VdGlsLmdldENvbnRlbnRUeXBlQXR0cmlidXRlKCIgKyBjb250ZW50VHlwZU5hbWUgKyAiLCBcImNoYXJzZXRcIik7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICAgICAgaWYoIiArIGNoYXJTZXROYW1lICsgIiA9PSBudWxsKSAiIAorICAgICAgICAgICAgICAgICAgICArIGNoYXJTZXROYW1lICsgIiA9IG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5VdGlsLkRFRkFVTFRfRU5DT0RJTkc7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICB9ZWxzZXsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgICAgICAiICsgY2hhclNldE5hbWUgKyAiID0gb3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLlV0aWwuREVGQVVMVF9FTkNPRElORzsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgIH0iKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgfSIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIHRyeXsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgICIgKyB0ZW1wUmVhZGVyTmFtZSArICIgPSBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcigiICsgaW5wdXRTdHJlYW1OYW1lICsgIiwiICsgY2hhclNldE5hbWUgKyAiKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgfWNhdGNoKEV4Y2VwdGlvbiBleCl7Iik7CisgICAgICAgICAgICAvL2N0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgIHRocm93IG5ldyBKc3BUYWdFeGNlcHRpb24oZXgudG9TdHJpbmcoKSk7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICAiICsgdGVtcFJlYWRlck5hbWUgKyAiID0gbmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoIiArIGlucHV0U3RyZWFtTmFtZSArICIsb3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLlV0aWwuREVGQVVMVF9FTkNPRElORyk7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIH0iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy92YWxpZGF0ZSB0aGUgcmVzcG9uc2UKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgaWYoIiArIHVjTmFtZSArICIgaW5zdGFuY2VvZiBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbil7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICBpbnQgc3RhdHVzID0gKChqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbikgIiArIHVjTmFtZSArICIpLmdldFJlc3BvbnNlQ29kZSgpOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgaWYoc3RhdHVzIDwgMjAwIHx8IHN0YXR1cyA+IDI5OSl7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICAgICAgdGhyb3cgbmV3IEpzcFRhZ0V4Y2VwdGlvbihzdGF0dXMgKyBcIiBcIiArICIgKyB1cmxOYW1lICsgIik7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICB9Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIH0iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyICIgKyBick5hbWUgKyAiID0gIG5ldyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyKCIgKyB0ZW1wUmVhZGVyTmFtZSArICIpOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICBTdHJpbmdCdWZmZXIgIiArIHNiTmFtZSArICIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Iik7CisgICAgICAgICAgICBTdHJpbmcgaW5kZXggPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICBpbnQgIiArIGluZGV4ICsgIjsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgd2hpbGUoKCIraW5kZXgrIiA9ICIrYnJOYW1lKyIucmVhZCgpKSAhPSAtMSkgIitzYk5hbWUrIi5hcHBlbmQoKGNoYXIpIitpbmRleCsiKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgIiArIHRlbXBTdHJpbmdOYW1lICsgIiA9ICIgK3NiTmFtZSArICIudG9TdHJpbmcoKTsiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIn1lbHNleyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL2lmIHRoZSB1cmwgaXMgcmVsYXRpdmUsIGh0dHAgcmVxdWVzdCBpcyBuZWVkZWQuCisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGlmICghKHBhZ2VDb250ZXh0LmdldFJlcXVlc3QoKSBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVxdWVzdCAgIiArCisgICAgICAgICAgICAiJiYgcGFnZUNvbnRleHQuZ2V0UmVzcG9uc2UoKSBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVzcG9uc2UpKXsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgIHRocm93IG5ldyBKc3BUYWdFeGNlcHRpb24oXCJSZWxhdGl2ZSAmbHQ7aW1wb3J0Jmd0OyBmcm9tIG5vbi1IVFRQIHJlcXVlc3Qgbm90IGFsbG93ZWRcIik7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIH0iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9nZXQgdGhlIHNlcnZsZXQgY29udGV4dCBvZiB0aGUgY29udGV4dCBkZWZpbmVkIGluIHRoZSBjb250ZXh0IGF0dHJpYnV0ZQorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICBTZXJ2bGV0Q29udGV4dCAiICsgc2VydmxldENvbnRleHROYW1lICsgIiA9IG51bGw7Iik7CisgICAgICAgICAgICBpZihoYXNDb250ZXh0KXsKKyAgICAgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGlmKG51bGwgIT0gIiArIGNvbnRleHROYW1lICsgIil7Iik7CisgICAgICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgIiArIHNlcnZsZXRDb250ZXh0TmFtZSArICIgPSBwYWdlQ29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldENvbnRleHQoIiArIGNvbnRleHROYW1lICsgIik7IiApOworICAgICAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgfWVsc2V7Iik7CisgICAgICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgIiArIHNlcnZsZXRDb250ZXh0TmFtZSArICIgPSBwYWdlQ29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpOyIpOworICAgICAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgfSIpOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAiICsgc2VydmxldENvbnRleHROYW1lICsgIiA9IHBhZ2VDb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCk7Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGlmKCIgKyBzZXJ2bGV0Q29udGV4dE5hbWUgKyAiID09IG51bGwpeyIpOworICAgICAgICAgICAgaWYoaGFzQ29udGV4dCl7CisgICAgICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgdGhyb3cgbmV3IEpzcFRhZ0V4Y2VwdGlvbihcIlVuYWJsZSB0byBnZXQgUmVxdWVzdERpc3BhdGNoZXIgZm9yIENvbnRleHQ6IFxcXCIgXCIgKyIgKyBjb250ZXh0TmFtZSArICIrIFwiIFxcXCIgYW5kIFVSTDogXFxcIiBcIiArIiArIHVybE5hbWUgKyAiKyBcIiBcXFwiLiBWZXJpZnkgdmFsdWVzIGFuZC9vciBlbmFibGUgY3Jvc3MgY29udGV4dCBhY2Nlc3MuXCIpOyIpOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgdGhyb3cgbmV3IEpzcFRhZ0V4Y2VwdGlvbihcIlVuYWJsZSB0byBnZXQgUmVxdWVzdERpc3BhdGNoZXIgZm9yIFVSTDogXFxcIiBcIiArIiArIHVybE5hbWUgKyAiKyBcIiBcXFwiLiBWZXJpZnkgdmFsdWVzIGFuZC9vciBlbmFibGUgY3Jvc3MgY29udGV4dCBhY2Nlc3MuXCIpOyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICB9Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vZ2V0IHRoZSByZXF1ZXN0IGRpc3BhdGNoZXIKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgUmVxdWVzdERpc3BhdGNoZXIgIiArIHJlcXVlc3REaXNwYXRjaGVyTmFtZSArICIgPSAiICsgc2VydmxldENvbnRleHROYW1lICsgIi5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuVXRpbC5zdHJpcFNlc3Npb24oIit1cmxOYW1lKyIpKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgaWYoIiArIHJlcXVlc3REaXNwYXRjaGVyTmFtZSArICIgPT0gbnVsbCkgdGhyb3cgbmV3IEpzcFRhZ0V4Y2VwdGlvbihvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuVXRpbC5zdHJpcFNlc3Npb24oIit1cmxOYW1lKyIpKTsiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9pbml0aWFsaXplIGEgSW1wb3J0UmVzcG9uc2VXcmFwcGVyIHRvIGluY2x1ZGUgdGhlIHJlc291cmNlCisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5VdGlsLkltcG9ydFJlc3BvbnNlV3JhcHBlciAiICsgaXJ3TmFtZSArICIgPSBuZXcgb3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLlV0aWwuSW1wb3J0UmVzcG9uc2VXcmFwcGVyKChIdHRwU2VydmxldFJlc3BvbnNlKSBwYWdlQ29udGV4dC5nZXRSZXNwb25zZSgpKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgaWYoIiArIGNoYXJTZXROYW1lICsgIiA9PSBudWxsKXsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgICIgKyBjaGFyU2V0TmFtZSArICIgPSBvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuVXRpbC5ERUZBVUxUX0VOQ09ESU5HOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICB9Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICIgKyBpcndOYW1lICsgIi5zZXRDaGFyRW5jb2RpbmcoIiArIGNoYXJTZXROYW1lICsgIik7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIHRyeXsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgICIgKyByZXF1ZXN0RGlzcGF0Y2hlck5hbWUgKyAiLmluY2x1ZGUocGFnZUNvbnRleHQuZ2V0UmVxdWVzdCgpLCAiICsgaXJ3TmFtZSArICIpOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICB9Y2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBleCl7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKGV4KTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgfWNhdGNoKFJ1bnRpbWVFeGNlcHRpb24gZXgpeyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbihleCk7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIH1jYXRjaChTZXJ2bGV0RXhjZXB0aW9uIGV4KXsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgIFRocm93YWJsZSByYyA9IGV4LmdldFJvb3RDYXVzZSgpOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgaWYgKHJjID09IG51bGwpIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbihleCk7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICBlbHNlIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbihyYyk7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIH0iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy92YWxpZGF0ZSB0aGUgcmVzcG9uc2Ugc3RhdHVzCisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGlmKCIgKyBpcndOYW1lICsgIi5nZXRTdGF0dXMoKSA8IDIwMCB8fCAiICsgaXJ3TmFtZSArICIuZ2V0U3RhdHVzKCkgPiAyOTkpeyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgdGhyb3cgbmV3IEpzcFRhZ0V4Y2VwdGlvbigiICsgaXJ3TmFtZSArICIuZ2V0U3RhdHVzKCkrXCIgXCIgKyBvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuVXRpbC5zdHJpcFNlc3Npb24oIiArIHVybE5hbWUgKyAiKSk7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIH0iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAiICsgdGVtcFN0cmluZ05hbWUgKyAiID0gIiArIGlyd05hbWUgKyAiLmdldFN0cmluZygpOyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgifSIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZihoYXNWYXIpeworICAgICAgICAgICAgICAgIFN0cmluZyBzdHJWYXIgPSBjdHh0LmdldENvbnN0YW50QXR0cmlidXRlKCJ2YXIiKTsKKyAgICAgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgicGFnZUNvbnRleHQuc2V0QXR0cmlidXRlKFwiIitzdHJWYXIrIlwiLCIgKyB0ZW1wU3RyaW5nTmFtZSArICIsIiArIGlTY29wZSArICIpOyIpOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoInBhZ2VDb250ZXh0LmdldE91dCgpLnByaW50KCIgKyB0ZW1wU3RyaW5nTmFtZSArICIpOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIAorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvY29yZS9PdGhlcndpc2UuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL2NvcmUvT3RoZXJ3aXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzExOWQzMAotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL2NvcmUvT3RoZXJ3aXNlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuY29yZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi4qOworCitwdWJsaWMgZmluYWwgY2xhc3MgT3RoZXJ3aXNlIGltcGxlbWVudHMgVGFnUGx1Z2luIHsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkb1RhZyhUYWdQbHVnaW5Db250ZXh0IGN0eHQpIHsKKyAgICAgICAgCisgICAgICAgIC8vIFNlZSBXaGVuLmphdmEgZm9yIHRoZSByZWFzb24gd2hleSAifSIgaXMgbmVlZCBhdCB0aGUgYmVnaW5uZyBhbmQKKyAgICAgICAgLy8gbm90IGF0IHRoZSBlbmQuCisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJ9IGVsc2UgeyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlQm9keSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL2NvcmUvT3V0LmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9jb3JlL091dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYWMxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9jb3JlL091dC5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLmNvcmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci50YWdwbHVnaW4uVGFnUGx1Z2luOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi5UYWdQbHVnaW5Db250ZXh0OworCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBPdXQgaW1wbGVtZW50cyBUYWdQbHVnaW4geworICAgIAorICAgIHB1YmxpYyB2b2lkIGRvVGFnKFRhZ1BsdWdpbkNvbnRleHQgY3R4dCkgeworICAgICAgICAKKyAgICAgICAgLy90aGVzZSB0d28gZGF0YSBtZW1iZXIgYXJlIHRvIGluZGljYXRlIAorICAgICAgICAvL3doZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIGlzIHNwZWNpZmllZAorICAgICAgICBib29sZWFuIGhhc0RlZmF1bHQ9ZmFsc2UsIGhhc0VzY2FwZVhtbD1mYWxzZTsKKyAgICAgICAgaGFzRGVmYXVsdCA9IGN0eHQuaXNBdHRyaWJ1dGVTcGVjaWZpZWQoImRlZmF1bHQiKTsKKyAgICAgICAgaGFzRXNjYXBlWG1sID0gY3R4dC5pc0F0dHJpYnV0ZVNwZWNpZmllZCgiZXNjYXBlWG1sIik7CisgICAgICAgIAorICAgICAgICAvL3N0clZhbE5hbWUsIHN0ckVzY2FwZVhtbE5hbWUgJiBzdHJEZWZOYW1lIGFyZSB0d28gdmFyaWFibGVzJyBuYW1lIAorICAgICAgICAvL3N0YW5kaW5nIGZvciB2YWx1ZSwgZXNjYXBlWG1sIGFuZCBkZWZhdWx0IGF0dHJpYnV0ZQorICAgICAgICBTdHJpbmcgc3RyVmFsTmFtZSA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisgICAgICAgIFN0cmluZyBzdHJEZWZOYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHN0ckVzY2FwZVhtbE5hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICAKKyAgICAgICAgLy9hY2NvcmRpbmcgdG8gdGhlIHRhZyBmaWxlLCB0aGUgdmFsdWUgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS4KKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIlN0cmluZyAiICsgc3RyVmFsTmFtZSArICIgPSBudWxsOyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiaWYoIik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVBdHRyaWJ1dGUoInZhbHVlIik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIhPW51bGwpeyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICIgKyBzdHJWYWxOYW1lICsgIiA9ICgiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUF0dHJpYnV0ZSgidmFsdWUiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIikudG9TdHJpbmcoKTsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIn0iKTsKKyAgICAgICAgCisgICAgICAgIC8vaW5pdGlhdGUgdGhlIHN0ckRlZk5hbWUgd2l0aCBudWxsLgorICAgICAgICAvL2lmIHRoZSBkZWZhdWx0IGhhcyBiZWVuIHNwZWNpZmllZCwgdGhlbiBhc3NpZ24gdGhlIHZhbHVlIHRvIGl0OworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiU3RyaW5nICIgKyBzdHJEZWZOYW1lICsgIiA9IG51bGw7XG4iKTsKKyAgICAgICAgaWYoaGFzRGVmYXVsdCl7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiaWYoIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJkZWZhdWx0Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICE9IG51bGwpeyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2Uoc3RyRGVmTmFtZSArICIgPSAoIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJkZWZhdWx0Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiKS50b1N0cmluZygpOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIn0iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy9pbml0aWF0ZSB0aGUgc3RyRXNjYXBlWG1sTmFtZSB3aXRoIHRydWU7CisgICAgICAgIC8vaWYgdGhlIGVzY2FwZVhtbCBpcyBzcGVjaWZpZWQsIGFzc2lnbiB0aGUgdmFsdWUgdG8gaXQ7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJib29sZWFuICIgKyBzdHJFc2NhcGVYbWxOYW1lICsgIiA9IHRydWU7Iik7CisgICAgICAgIGlmKGhhc0VzY2FwZVhtbCl7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZShzdHJFc2NhcGVYbWxOYW1lICsgIiA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKCgiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVBdHRyaWJ1dGUoImRlZmF1bHQiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIpLnRvU3RyaW5nKCkpOyIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvL21haW4gcGFydC4gCisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJpZihudWxsICE9ICIgKyBzdHJWYWxOYW1lICsiKXsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICBpZigiICsgc3RyRXNjYXBlWG1sTmFtZSArICIpeyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICAiICsgc3RyVmFsTmFtZSArICIgPSBvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuVXRpbC5lc2NhcGVYbWwoIiArIHN0clZhbE5hbWUgKyAiKTsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICB9Iik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgb3V0LndyaXRlKCIgKyBzdHJWYWxOYW1lICsgIik7Iik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJ9ZWxzZXsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICBpZihudWxsICE9ICIgKyBzdHJEZWZOYW1lICsgIil7Iik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgIGlmKCIgKyBzdHJFc2NhcGVYbWxOYW1lICsgIil7Iik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgICAgICAiICsgc3RyRGVmTmFtZSArICIgPSBvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuVXRpbC5lc2NhcGVYbWwoIiArIHN0ckRlZk5hbWUgKyAiKTsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgfSIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICBvdXQud3JpdGUoIiArIHN0ckRlZk5hbWUgKyAiKTsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICB9ZWxzZXsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUJvZHkoKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICB9Iik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJ9Iik7ICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvY29yZS9QYXJhbS5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvY29yZS9QYXJhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMjU2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9jb3JlL1BhcmFtLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuY29yZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi5UYWdQbHVnaW47CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIudGFncGx1Z2luLlRhZ1BsdWdpbkNvbnRleHQ7CisKK3B1YmxpYyBjbGFzcyBQYXJhbSBpbXBsZW1lbnRzIFRhZ1BsdWdpbiB7CisgICAgCisgICAgcHVibGljIHZvaWQgZG9UYWcoVGFnUGx1Z2luQ29udGV4dCBjdHh0KSB7CisgICAgICAgIAorICAgICAgICAvL2Rvbid0IHN1cHBvcnQgdGhlIGJvZHkgY29udGVudAorICAgICAgICAKKyAgICAgICAgLy9kZWZpbmUgbmFtZXMgb2YgYWxsIHRoZSB0ZW1wIHZhcmlhYmxlcworICAgICAgICBTdHJpbmcgbmFtZU5hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICBTdHJpbmcgdmFsdWVOYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHVybE5hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICBTdHJpbmcgZW5jTmFtZSA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisgICAgICAgIFN0cmluZyBpbmRleCA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisgICAgICAgIAorICAgICAgICAvL2lmIHRoZSBwYXJhbSB0YWcgaGFzIG5vIHBhcmVudHMsIHRocm93IGEgZXhjZXB0aW9uCisgICAgICAgIFRhZ1BsdWdpbkNvbnRleHQgcGFyZW50ID0gY3R4dC5nZXRQYXJlbnRDb250ZXh0KCk7CisgICAgICAgIGlmKHBhcmVudCA9PSBudWxsKXsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgdGhyb3cgbmV3IEpzcFRhZ0V4Y3B0aW9uIiArCisgICAgICAgICAgICAiKFwiJmx0O3BhcmFtJmd0OyBvdXRzaWRlICZsdDtpbXBvcnQmZ3Q7IG9yICZsdDt1cmxFbmNvZGUmZ3Q7XCIpOyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvL2dldCB0aGUgdXJsIHN0cmluZyBiZWZvcmUgYWRkaW5nIHRoaXMgcGFyYW0KKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIlN0cmluZyAiICsgdXJsTmFtZSArICIgPSAiICsKKyAgICAgICAgIihTdHJpbmcpcGFnZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidXJsX3dpdGhvdXRfcGFyYW1cIik7Iik7CisgICAgICAgIAorICAgICAgICAvL2dldCB0aGUgdmFsdWUgb2YgIm5hbWUiCisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJTdHJpbmcgIiArIG5hbWVOYW1lICsgIiA9ICIpOworICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJuYW1lIik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCI7Iik7CisgICAgICAgIAorICAgICAgICAvL2lmIHRoZSAibmFtZSIgaXMgbnVsbCB0aGVuIGRvIG5vdGhpbmcuCisgICAgICAgIC8vZWxzZSBhZGQgc3VjaCBzdHJpbmcgIm5hbWU9dmFsdWUiIHRvIHRoZSB1cmwuCisgICAgICAgIC8vYW5kIHRoZSB1cmwgc2hvdWxkIGJlIGVuY29kZWQKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImlmKCIgKyBuYW1lTmFtZSArICIgIT0gbnVsbCAmJiAhIiArIG5hbWVOYW1lICsgIi5lcXVhbHMoXCJcIikpeyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIFN0cmluZyAiICsgdmFsdWVOYW1lICsgIiA9ICIpOworICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJ2YWx1ZSIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiOyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGlmKCIgKyB2YWx1ZU5hbWUgKyAiID09IG51bGwpICIgKyB2YWx1ZU5hbWUgKyAiID0gXCJcIjsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICBTdHJpbmcgIiArIGVuY05hbWUgKyAiID0gcGFnZUNvbnRleHQuZ2V0UmVzcG9uc2UoKS5nZXRDaGFyYWN0ZXJFbmNvZGluZygpOyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICIgKyBuYW1lTmFtZSArICIgPSBqYXZhLm5ldC5VUkxFbmNvZGVyLmVuY29kZSgiICsgbmFtZU5hbWUgKyAiLCAiICsgZW5jTmFtZSArICIpOyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICIgKyB2YWx1ZU5hbWUgKyAiID0gamF2YS5uZXQuVVJMRW5jb2Rlci5lbmNvZGUoIiArIHZhbHVlTmFtZSArICIsICIgKyBlbmNOYW1lICsgIik7Iik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgaW50ICIgKyBpbmRleCArICI7Iik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgIiArIGluZGV4ICsgIiA9ICIgKyB1cmxOYW1lICsgIi5pbmRleE9mKFwnP1wnKTsiKTsKKyAgICAgICAgLy9pZiB0aGUgY3VycmVudCBwYXJhbSBpcyB0aGUgZmlyc3Qgb25lLCBhZGQgYSAiPyIgYWhlYWQgb2YgaXQKKyAgICAgICAgLy9lbHNlIGFkZCBhICImIiBhaGVhZCBvZiBpdAorICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGlmKCIgKyBpbmRleCArICIgPT0gLTEpeyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICAiICsgdXJsTmFtZSArICIgPSAiICsgdXJsTmFtZSArICIgKyBcIj9cIiArICIgKyBuYW1lTmFtZSArICIgKyBcIj1cIiArICIgKyB2YWx1ZU5hbWUgKyAiOyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIH1lbHNleyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICAiICsgdXJsTmFtZSArICIgPSAiICsgdXJsTmFtZSArICIgKyBcIiZcIiArICIgKyBuYW1lTmFtZSArICIgKyBcIj1cIiArICIgKyB2YWx1ZU5hbWUgKyAiOyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIH0iKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICBwYWdlQ29udGV4dC5zZXRBdHRyaWJ1dGUoXCJ1cmxfd2l0aG91dF9wYXJhbVwiLCIgKyB1cmxOYW1lICsgIik7Iik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJ9Iik7CQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL2NvcmUvUmVkaXJlY3QuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL2NvcmUvUmVkaXJlY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTU4MTNmCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvY29yZS9SZWRpcmVjdC5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLmNvcmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci50YWdwbHVnaW4uVGFnUGx1Z2luOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi5UYWdQbHVnaW5Db250ZXh0OworCitwdWJsaWMgY2xhc3MgUmVkaXJlY3QgaW1wbGVtZW50cyBUYWdQbHVnaW4geworICAgIAorICAgIHB1YmxpYyB2b2lkIGRvVGFnKFRhZ1BsdWdpbkNvbnRleHQgY3R4dCkgeworICAgICAgICAKKyAgICAgICAgLy9mbGFnIGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSAiY29udGV4dCIKKyAgICAgICAgYm9vbGVhbiBoYXNDb250ZXh0ID0gY3R4dC5pc0F0dHJpYnV0ZVNwZWNpZmllZCgiY29udGV4dCIpOworICAgICAgICAKKyAgICAgICAgLy9uYW1lcyBvZiB0aGUgdGVtcCB2YXJpYWJsZXMKKyAgICAgICAgU3RyaW5nIHVybE5hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICBTdHJpbmcgY29udGV4dE5hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICBTdHJpbmcgYmFzZVVybE5hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICBTdHJpbmcgcmVzdWx0TmFtZSA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisgICAgICAgIFN0cmluZyByZXNwb25zZU5hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICAKKyAgICAgICAgLy9nZXQgY29udGV4dAorICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiU3RyaW5nICIgKyBjb250ZXh0TmFtZSArICIgPSBudWxsOyIpOworICAgICAgICBpZihoYXNDb250ZXh0KXsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKGNvbnRleHROYW1lICsgIiA9ICIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUF0dHJpYnV0ZSgiY29udGV4dCIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIjsiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy9nZXQgdGhlIHVybAorICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiU3RyaW5nICIgKyB1cmxOYW1lICsgIiA9ICIpOworICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJ1cmwiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIjsiKTsKKyAgICAgICAgCisgICAgICAgIC8vZ2V0IHRoZSByYXcgdXJsIGFjY29yZGluZyB0byAidXJsIiBhbmQgImNvbnRleHQiCisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJTdHJpbmcgIiArIGJhc2VVcmxOYW1lICsgIiA9ICIgKworICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuVXRpbC5yZXNvbHZlVXJsKCIgKyB1cmxOYW1lICsgIiwgIiArIGNvbnRleHROYW1lICsgIiwgcGFnZUNvbnRleHQpOyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgicGFnZUNvbnRleHQuc2V0QXR0cmlidXRlIiArCisgICAgICAgICAgICAgICAgIihcInVybF93aXRob3V0X3BhcmFtXCIsICIgKyBiYXNlVXJsTmFtZSArICIpOyIpOworICAgICAgICAKKyAgICAgICAgLy9hZGQgcGFyYW1zCisgICAgICAgIGN0eHQuZ2VuZXJhdGVCb2R5KCk7CisgICAgICAgIAorICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiU3RyaW5nICIgKyByZXN1bHROYW1lICsgIiA9ICIgKworICAgICAgICAiKFN0cmluZylwYWdlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ1cmxfd2l0aG91dF9wYXJhbVwiKTsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoInBhZ2VDb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSIgKworICAgICAgICAiKFwidXJsX3dpdGhvdXRfcGFyYW1cIik7Iik7CisgICAgICAgIAorICAgICAgICAvL2dldCB0aGUgcmVzcG9uc2Ugb2JqZWN0CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJIdHRwU2VydmxldFJlc3BvbnNlICIgKyByZXNwb25zZU5hbWUgKyAiID0gIiArCisgICAgICAgICIoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHBhZ2VDb250ZXh0LmdldFJlc3BvbnNlKCkpOyIpOworICAgICAgICAKKyAgICAgICAgLy9pZiB0aGUgdXJsIGlzIHJlbGF0aXZlLCBlbmNvZGUgaXQKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImlmKCFvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuVXRpbC5pc0Fic29sdXRlVXJsKCIgKyByZXN1bHROYW1lICsgIikpeyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICIgKyByZXN1bHROYW1lICsgIiA9ICIKKyAgICAgICAgICAgICAgICArIHJlc3BvbnNlTmFtZSArICIuZW5jb2RlUmVkaXJlY3RVUkwoIiArIHJlc3VsdE5hbWUgKyAiKTsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIn0iKTsKKyAgICAgICAgCisgICAgICAgIC8vZG8gcmVkaXJlY3QKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoInRyeXsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAiICsgcmVzcG9uc2VOYW1lICsgIi5zZW5kUmVkaXJlY3QoIiArIHJlc3VsdE5hbWUgKyAiKTsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIn1jYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KXsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICB0aHJvdyBuZXcgSnNwVGFnRXhjZXB0aW9uKGV4LnRvU3RyaW5nKCksIGV4KTsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIn0iKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9jb3JlL1JlbW92ZS5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvY29yZS9SZW1vdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjFmYThmCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvY29yZS9SZW1vdmUuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5jb3JlOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIudGFncGx1Z2luLlRhZ1BsdWdpbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci50YWdwbHVnaW4uVGFnUGx1Z2luQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuVXRpbDsKKworcHVibGljIGNsYXNzIFJlbW92ZSBpbXBsZW1lbnRzIFRhZ1BsdWdpbiB7CisgICAgCisgICAgcHVibGljIHZvaWQgZG9UYWcoVGFnUGx1Z2luQ29udGV4dCBjdHh0KSB7CisgICAgICAgIAorICAgICAgICAvL3Njb3BlIGZsYWcKKyAgICAgICAgYm9vbGVhbiBoYXNTY29wZSA9IGN0eHQuaXNBdHRyaWJ1dGVTcGVjaWZpZWQoInNjb3BlIik7CisgICAgICAgIAorICAgICAgICAvL3RoZSB2YWx1ZSBvZiB0aGUgInZhciIKKyAgICAgICAgU3RyaW5nIHN0clZhciA9IGN0eHQuZ2V0Q29uc3RhbnRBdHRyaWJ1dGUoInZhciIpOworICAgICAgICAKKyAgICAgICAgLy9yZW1vdmUgYXR0cmlidXRlIGZyb20gY2VydGFpbiBzY29wZS4KKyAgICAgICAgLy9kZWZhdWx0IHNjb3BlIGlzICJwYWdlIi4KKyAgICAgICAgaWYoaGFzU2NvcGUpeworICAgICAgICAgICAgaW50IGlTY29wZSA9IFV0aWwuZ2V0U2NvcGUoY3R4dC5nZXRDb25zdGFudEF0dHJpYnV0ZSgic2NvcGUiKSk7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgicGFnZUNvbnRleHQucmVtb3ZlQXR0cmlidXRlKFwiIiArIHN0clZhciArICJcIiwiICsgaVNjb3BlICsgIik7Iik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoInBhZ2VDb250ZXh0LnJlbW92ZUF0dHJpYnV0ZShcIiIgKyBzdHJWYXIgKyAiXCIpOyIpOworICAgICAgICB9CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvY29yZS9TZXQuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL2NvcmUvU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiMmM4YgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL2NvcmUvU2V0LmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLmNvcmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci50YWdwbHVnaW4uVGFnUGx1Z2luOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi5UYWdQbHVnaW5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5VdGlsOworCitwdWJsaWMgY2xhc3MgU2V0IGltcGxlbWVudHMgVGFnUGx1Z2luIHsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkb1RhZyhUYWdQbHVnaW5Db250ZXh0IGN0eHQpIHsKKyAgICAgICAgCisgICAgICAgIC8vdGhlIGZsYWdzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNwZWNpZmllZAorICAgICAgICBib29sZWFuIGhhc1ZhbHVlID0gZmFsc2UsIGhhc1ZhciA9IGZhbHNlLCBoYXNTY29wZSA9IGZhbHNlLCAKKyAgICAgICAgaGFzVGFyZ2V0ID0gZmFsc2U7CisgICAgICAgIAorICAgICAgICAvL3RoZSBzY29wZSBuYW1lCisgICAgICAgIFN0cmluZyBzdHJTY29wZTsKKyAgICAgICAgLy90aGUgaWQgb2YgdGhlIHNjb3BlCisgICAgICAgIGludCBpU2NvcGU7CisgICAgICAgIAorICAgICAgICAvL2luaXRpYWxpemUgdGhlIGZsYWdzCisgICAgICAgIGhhc1ZhbHVlID0gY3R4dC5pc0F0dHJpYnV0ZVNwZWNpZmllZCgidmFsdWUiKTsKKyAgICAgICAgaGFzVmFyID0gY3R4dC5pc0F0dHJpYnV0ZVNwZWNpZmllZCgidmFyIik7CisgICAgICAgIGhhc1Njb3BlID0gY3R4dC5pc0F0dHJpYnV0ZVNwZWNpZmllZCgic2NvcGUiKTsKKyAgICAgICAgaGFzVGFyZ2V0ID0gY3R4dC5pc0F0dHJpYnV0ZVNwZWNpZmllZCgidGFyZ2V0Iik7CisgICAgICAgIAorICAgICAgICAvL3RoZSB0ZW1wIHZhcmlhYmxlcyBuYW1lCisgICAgICAgIFN0cmluZyByZXN1bHROYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHRhcmdldE5hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgCisgICAgICAgIC8vaW5pdGlhbGl6ZSB0aGUgInJlc3VsdCIgd2hpY2ggd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgdmFyIG9yIHRhcmdldC5wcm9wZXJ0eQorICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiT2JqZWN0ICIgKyByZXN1bHROYW1lICsgIiA9IG51bGw7Iik7CisgICAgICAgIGlmKGhhc1ZhbHVlKXsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKHJlc3VsdE5hbWUgKyAiID0gIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJ2YWx1ZSIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIjsiKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBjdHh0LmRvbnRVc2VUYWdQbHVnaW4oKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy9pbml0aWFsaXplIHRoZSBzdHJTY29wZQorICAgICAgICBpZihoYXNTY29wZSl7CisgICAgICAgICAgICBzdHJTY29wZSA9IGN0eHQuZ2V0Q29uc3RhbnRBdHRyaWJ1dGUoInNjb3BlIik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgc3RyU2NvcGUgPSAicGFnZSI7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vZ2V0IHRoZSBpU2NvcGUgYWNjb3JkaW5nIHRvIHRoZSBzdHJTY29wZQorICAgICAgICBpU2NvcGUgPSBVdGlsLmdldFNjb3BlKHN0clNjb3BlKTsKKyAgICAgICAgCisgICAgICAgIC8vaWYgdGhlIGF0dHJpYnV0ZSB2YXIgaGFzIGJlZW4gc3BlY2lmaWVkIHRoZW4gYXNzaWduIHRoZSByZXN1bHQgdG8gdGhlIHZhcjsKKyAgICAgICAgaWYoaGFzVmFyKXsKKyAgICAgICAgICAgIFN0cmluZyBzdHJWYXIgPSBjdHh0LmdldENvbnN0YW50QXR0cmlidXRlKCJ2YXIiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJpZihudWxsICE9ICIgKyByZXN1bHROYW1lICsgIil7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIHBhZ2VDb250ZXh0LnNldEF0dHJpYnV0ZShcIiIgKyBzdHJWYXIgKyAiXCIsIiArIHJlc3VsdE5hbWUgKyAiLCIgKyBpU2NvcGUgKyAiKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJ9IGVsc2UgeyIpOworICAgICAgICAgICAgaWYoaGFzU2NvcGUpeworICAgICAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgcGFnZUNvbnRleHQucmVtb3ZlQXR0cmlidXRlKFwiIiArIHN0clZhciArICJcIiwiICsgaVNjb3BlICsgIik7Iik7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIHBhZ2VDb250ZXh0LnJlbW92ZUF0dHJpYnV0ZShcIiIgKyBzdHJWYXIgKyAiXCIpOyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIn0iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9lbHNlIGFzc2lnbiB0aGUgcmVzdWx0IHRvIHRoZSB0YXJnZXQucHJvcGVydHkKKyAgICAgICAgfWVsc2UgaWYoaGFzVGFyZ2V0KXsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9nZW5lcmF0ZSB0aGUgdGVtcCB2YXJpYWJsZSBuYW1lCisgICAgICAgICAgICBTdHJpbmcgcGROYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgICAgIFN0cmluZyBzdWNjZXNzRmxhZ05hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICAgICAgU3RyaW5nIGluZGV4ID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9pbml0aWFsaXplIHRoZSBwcm9wZXJ0eQorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIlN0cmluZyAiICsgcHJvcGVydHlOYW1lICsgIiA9IG51bGw7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiaWYoIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJwcm9wZXJ0eSIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAhPSBudWxsKXsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgIiArIHByb3BlcnR5TmFtZSArICIgPSAoIik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJwcm9wZXJ0eSIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIikudG9TdHJpbmcoKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJ9Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vaW5pdGlhbGl6ZSB0aGUgdGFyZ2V0CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiT2JqZWN0ICIgKyB0YXJnZXROYW1lICsgIiA9ICIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUF0dHJpYnV0ZSgidGFyZ2V0Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiOyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL3RoZSB0YXJnZXQgaXMgb2sKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJpZigiICsgdGFyZ2V0TmFtZSArICIgIT0gbnVsbCl7Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vaWYgdGhlIHRhcmdldCBpcyBhIG1hcCwgdGhlbiBwdXQgdGhlIHJlc3VsdCBpbnRvIHRoZSBtYXAgd2l0aCB0aGUga2V5IHByb3BlcnR5CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIGlmKCIgKyB0YXJnZXROYW1lICsgIiBpbnN0YW5jZW9mIGphdmEudXRpbC5NYXApeyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgaWYobnVsbCAhPSAiICsgcmVzdWx0TmFtZSArICIpeyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgICAgICgoamF2YS51dGlsLk1hcCkgIiArIHRhcmdldE5hbWUgKyAiKS5wdXQoIiArIHByb3BlcnR5TmFtZSArICIsIiArIHJlc3VsdE5hbWUgKyAiKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgIH1lbHNleyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgICAgICgoamF2YS51dGlsLk1hcCkgIiArIHRhcmdldE5hbWUgKyAiKS5yZW1vdmUoIiArIHByb3BlcnR5TmFtZSArICIpOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgfSIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL2Vsc2UgYXNzaWduIHRoZSByZXN1bHQgdG8gdGhlIHRhcmdldC5wcm9wZXJ0eQorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICB9ZWxzZXsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgIHRyeXsiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9nZXQgYWxsIHRoZSBwcm9wZXJ0eSBvZiB0aGUgdGFyZ2V0CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICAgICAgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3IgIiArIHBkTmFtZSArICJbXSA9IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKCIgKyB0YXJnZXROYW1lICsgIi5nZXRDbGFzcygpKS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vdGhlIHN1Y2Nlc3MgZmxhZyBpcyB0byBpbXBseSB3aGV0aGVyIHRoZSBhc3NpZ24gaXMgc3VjY2Vzc2Z1bAorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgICAgIGJvb2xlYW4gIiArIHN1Y2Nlc3NGbGFnTmFtZSArICIgPSBmYWxzZTsiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9maW5kIHRoZSByaWdodCBwcm9wZXJ0eQorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgICAgIGZvcihpbnQgIiArIGluZGV4ICsgIj0wOyIgKyBpbmRleCArICI8IiArIHBkTmFtZSArICIubGVuZ3RoOyIgKyBpbmRleCArICIrKyl7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICAgICAgICAgIGlmKCIgKyBwZE5hbWUgKyAiWyIgKyBpbmRleCArICJdLmdldE5hbWUoKS5lcXVhbHMoIiArIHByb3BlcnR5TmFtZSArICIpKXsiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9nZXQgdGhlICJzZXQiIG1ldGhvZDsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCAiICsgbWV0aG9kTmFtZSArICIgPSAiICsgcGROYW1lICsgIlsiICsgaW5kZXggKyAiXS5nZXRXcml0ZU1ldGhvZCgpOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgICAgICAgICAgICAgaWYobnVsbCA9PSAiICsgbWV0aG9kTmFtZSArICIpeyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oXCJObyBzZXR0ZXIgbWV0aG9kIGluICZsdDtzZXQmZ3Q7IGZvciBwcm9wZXJ0eSBcIisiICsgcHJvcGVydHlOYW1lICsgIik7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICAgICAgICAgICAgICB9Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vaW52b2tlIHRoZSBtZXRob2QgdGhyb3VnaCB0aGUgcmVmbGVjdGlvbgorICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgICAgICAgICAgICAgaWYoIiArIHJlc3VsdE5hbWUgKyAiICE9IG51bGwpeyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgICAgICAgICAgICAgICAgICIgKyBtZXRob2ROYW1lICsgIi5pbnZva2UoIiArIHRhcmdldE5hbWUgKyAiLCBuZXcgT2JqZWN0W117KCIgKyBtZXRob2ROYW1lICsgIi5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdKS5jYXN0KCIgKyByZXN1bHROYW1lICsgIil9KTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgICAgICAgICAgICAgIH1lbHNleyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgICAgICAgICAgICAgICAgICIgKyBtZXRob2ROYW1lICsgIi5pbnZva2UoIiArIHRhcmdldE5hbWUgKyAiLCBuZXcgT2JqZWN0W117bnVsbH0pOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgICAgICAgICAgICAgfSIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgICAgICAgICAgICAgIiArIHN1Y2Nlc3NGbGFnTmFtZSArICIgPSB0cnVlOyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgICAgICAgICB9Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICAgICAgfSIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAgICAgICAgIGlmKCEiICsgc3VjY2Vzc0ZsYWdOYW1lICsgIil7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oXCJJbnZhbGlkIHByb3BlcnR5IGluICZsdDtzZXQmZ3Q7OlwiKyIgKyBwcm9wZXJ0eU5hbWUgKyAiKTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgICAgICB9Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICB9Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vY2F0Y2ggdGhlIGVsIGV4Y2VwdGlvbiBhbmQgdGhyb3cgaXQgYXMgYSBKc3BFeGNlcHRpb24KKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbihleCk7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgICAgICB9IGNhdGNoIChqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb24gZXgpIHsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKGV4KTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKGV4KTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgICAgIH0iKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgfSIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIn1lbHNleyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCk7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgifSIpOworICAgICAgICB9CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvY29yZS9VcmwuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL2NvcmUvVXJsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiNjRmNgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL2NvcmUvVXJsLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLmNvcmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci50YWdwbHVnaW4uVGFnUGx1Z2luOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi5UYWdQbHVnaW5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5VdGlsOworCitwdWJsaWMgY2xhc3MgVXJsIGltcGxlbWVudHMgVGFnUGx1Z2luIHsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkb1RhZyhUYWdQbHVnaW5Db250ZXh0IGN0eHQpIHsKKyAgICAgICAgCisgICAgICAgIC8vZmxhZ3MKKyAgICAgICAgYm9vbGVhbiBoYXNWYXIsIGhhc0NvbnRleHQsIGhhc1Njb3BlOworICAgICAgICAKKyAgICAgICAgLy9pbml0IGZsYWdzCisgICAgICAgIGhhc1ZhciA9IGN0eHQuaXNBdHRyaWJ1dGVTcGVjaWZpZWQoInZhciIpOworICAgICAgICBoYXNDb250ZXh0ID0gY3R4dC5pc0F0dHJpYnV0ZVNwZWNpZmllZCgiY29udGV4dCIpOworICAgICAgICBoYXNTY29wZSA9IGN0eHQuaXNBdHRyaWJ1dGVTcGVjaWZpZWQoInNjb3BlIik7CisgICAgICAgIAorICAgICAgICAvL2RlZmluZSBuYW1lIG9mIHRoZSB0ZW1wIHZhcmlhYmxlcworICAgICAgICBTdHJpbmcgdmFsdWVOYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGNvbnRleHROYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGJhc2VVcmxOYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdE5hbWUgPSBjdHh0LmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworICAgICAgICBTdHJpbmcgcmVzcG9uc2VOYW1lID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgCisgICAgICAgIC8vZ2V0IHRoZSBzY29wZQorICAgICAgICBTdHJpbmcgc3RyU2NvcGUgPSAicGFnZSI7CisgICAgICAgIGlmKGhhc1Njb3BlKXsKKyAgICAgICAgICAgIHN0clNjb3BlID0gY3R4dC5nZXRDb25zdGFudEF0dHJpYnV0ZSgic2NvcGUiKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaVNjb3BlID0gVXRpbC5nZXRTY29wZShzdHJTY29wZSk7CisgICAgICAgIAorICAgICAgICAvL2dldCB0aGUgdmFsdWUKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIlN0cmluZyAiICsgdmFsdWVOYW1lICsgIiA9ICIpOworICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJ2YWx1ZSIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiOyIpOworICAgICAgICAKKyAgICAgICAgLy9nZXQgdGhlIGNvbnRleHQKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIlN0cmluZyAiICsgY29udGV4dE5hbWUgKyAiID0gbnVsbDsiKTsKKyAgICAgICAgaWYoaGFzQ29udGV4dCl7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZShjb250ZXh0TmFtZSArICIgPSAiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVBdHRyaWJ1dGUoImNvbnRleHQiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCI7Iik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vZ2V0IHRoZSByYXcgdXJsCisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJTdHJpbmcgIiArIGJhc2VVcmxOYW1lICsgIiA9ICIgKworICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuVXRpbC5yZXNvbHZlVXJsKCIgKyB2YWx1ZU5hbWUgKyAiLCAiICsgY29udGV4dE5hbWUgKyAiLCBwYWdlQ29udGV4dCk7Iik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJwYWdlQ29udGV4dC5zZXRBdHRyaWJ1dGUiICsKKyAgICAgICAgICAgICAgICAiKFwidXJsX3dpdGhvdXRfcGFyYW1cIiwgIiArIGJhc2VVcmxOYW1lICsgIik7Iik7CisgICAgICAgIAorICAgICAgICAvL2FkZCBwYXJhbXMKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUJvZHkoKTsKKyAgICAgICAgCisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJTdHJpbmcgIiArIHJlc3VsdE5hbWUgKyAiID0gIiArCisgICAgICAgICIoU3RyaW5nKXBhZ2VDb250ZXh0LmdldEF0dHJpYnV0ZShcInVybF93aXRob3V0X3BhcmFtXCIpOyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgicGFnZUNvbnRleHQucmVtb3ZlQXR0cmlidXRlKFwidXJsX3dpdGhvdXRfcGFyYW1cIik7Iik7CisgICAgICAgIAorICAgICAgICAvL2lmIHRoZSB1cmwgaXMgcmVsYXRpdmUsIGVuY29kZSBpdAorICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiaWYoIW9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5VdGlsLmlzQWJzb2x1dGVVcmwoIiArIHJlc3VsdE5hbWUgKyAiKSl7Iik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIgICAgSHR0cFNlcnZsZXRSZXNwb25zZSAiICsgcmVzcG9uc2VOYW1lICsgIiA9ICIgKworICAgICAgICAiKChIdHRwU2VydmxldFJlc3BvbnNlKSBwYWdlQ29udGV4dC5nZXRSZXNwb25zZSgpKTsiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICAiICsgcmVzdWx0TmFtZSArICIgPSAiCisgICAgICAgICAgICAgICAgKyByZXNwb25zZU5hbWUgKyAiLmVuY29kZVVSTCgiICsgcmVzdWx0TmFtZSArICIpOyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgifSIpOworICAgICAgICAKKyAgICAgICAgLy9pZiAidmFyIiBpcyBzcGVjaWZpZWQsIHRoZSB1cmwgc3RyaW5nIHN0b3JlIGluIHRoZSBhdHRyaWJ1dGUgdmFyIGRlZmluZXMKKyAgICAgICAgaWYoaGFzVmFyKXsKKyAgICAgICAgICAgIFN0cmluZyBzdHJWYXIgPSBjdHh0LmdldENvbnN0YW50QXR0cmlidXRlKCJ2YXIiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJwYWdlQ29udGV4dC5zZXRBdHRyaWJ1dGUiICsKKyAgICAgICAgICAgICAgICAgICAgIihcIiIgKyBzdHJWYXIgKyAiXCIsICIgKyByZXN1bHROYW1lICsgIiwgIiArIGlTY29wZSArICIpOyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL2lmIHZhciBpcyBub3Qgc3BlY2lmaWVkLCBqdXN0IHByaW50IG91dCB0aGUgdXJsIHN0cmluZworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJ0cnl7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiICAgIHBhZ2VDb250ZXh0LmdldE91dCgpLnByaW50KCIgKyByZXN1bHROYW1lICsgIik7Iik7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgifWNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpeyIpOworICAgICAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIiAgICB0aHJvdyBuZXcgSnNwVGFnRXhjZXB0aW9uKGV4LnRvU3RyaW5nKCksIGV4KTsiKTsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJ9Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9jb3JlL1doZW4uamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL2NvcmUvV2hlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYWVmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9jb3JlL1doZW4uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5jb3JlOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIudGFncGx1Z2luLio7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBXaGVuIGltcGxlbWVudHMgVGFnUGx1Z2luIHsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkb1RhZyhUYWdQbHVnaW5Db250ZXh0IGN0eHQpIHsKKyAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnQgY29udGV4dCB0byBkZXRlcm1pbmUgaWYgdGhpcyBpcyB0aGUgZmlyc3QgPGM6d2hlbj4KKyAgICAgICAgVGFnUGx1Z2luQ29udGV4dCBwYXJlbnRDb250ZXh0ID0gY3R4dC5nZXRQYXJlbnRDb250ZXh0KCk7CisgICAgICAgIGlmIChwYXJlbnRDb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGN0eHQuZG9udFVzZVRhZ1BsdWdpbigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoInRydWUiLmVxdWFscyhwYXJlbnRDb250ZXh0LmdldFBsdWdpbkF0dHJpYnV0ZSgiaGFzQmVlbkhlcmUiKSkpIHsKKyAgICAgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJ9IGVsc2UgaWYoIik7CisgICAgICAgICAgICAvLyBTZWUgY29tbWVudCBiZWxvdyBmb3IgdGhlIHJlYXNvbiB3ZSBnZW5lcmF0ZSB0aGUgZXh0cmEgIn0iIGhlcmUuCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiaWYoIik7CisgICAgICAgICAgICBwYXJlbnRDb250ZXh0LnNldFBsdWdpbkF0dHJpYnV0ZSgiaGFzQmVlbkhlcmUiLCAidHJ1ZSIpOworICAgICAgICB9CisgICAgICAgIGN0eHQuZ2VuZXJhdGVBdHRyaWJ1dGUoInRlc3QiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIil7Iik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVCb2R5KCk7CisgICAgICAgIAorICAgICAgICAvLyBXZSBkb24ndCBnZW5lcmF0ZSB0aGUgY2xvc2luZyAifSIgZm9yIHRoZSAiaWYiIGhlcmUgYmVjYXVzZSB0aGVyZQorICAgICAgICAvLyBtYXkgYmUgd2hpdGVzcGFjZXMgaW4gYmV0d2VlbiA8Yzp3aGVuPidzLiAgSW5zdGVhZCB3ZSBkZWxheQorICAgICAgICAvLyBnZW5lcmF0aW5nIGl0IHVudGlsIHRoZSBuZXh0IDxjOndoZW4+IG9yIDxjOm90aGVyd2lzZT4gb3IKKyAgICAgICAgLy8gPGM6Y2hvb3NlPgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL3RhZ1BsdWdpbnMueG1sIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvdGFnUGx1Z2lucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4NGRjNgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL3RhZ1BsdWdpbnMueG1sCkBAIC0wLDAgKzEsNDYgQEAKKzx0YWctcGx1Z2lucz4KKyAgPHRhZy1wbHVnaW4+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLnJ0LmNvcmUuSWZUYWc8L3RhZy1jbGFzcz4KKyAgICA8cGx1Z2luLWNsYXNzPm9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5jb3JlLklmPC9wbHVnaW4tY2xhc3M+CisgIDwvdGFnLXBsdWdpbj4KKyAgPHRhZy1wbHVnaW4+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLmNvbW1vbi5jb3JlLkNob29zZVRhZzwvdGFnLWNsYXNzPgorICAgIDxwbHVnaW4tY2xhc3M+b3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLmNvcmUuQ2hvb3NlPC9wbHVnaW4tY2xhc3M+CisgIDwvdGFnLXBsdWdpbj4KKyAgPHRhZy1wbHVnaW4+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLnJ0LmNvcmUuV2hlblRhZzwvdGFnLWNsYXNzPgorICAgIDxwbHVnaW4tY2xhc3M+b3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLmNvcmUuV2hlbjwvcGx1Z2luLWNsYXNzPgorICA8L3RhZy1wbHVnaW4+CisgIDx0YWctcGx1Z2luPgorICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5jb21tb24uY29yZS5PdGhlcndpc2VUYWc8L3RhZy1jbGFzcz4KKyAgICA8cGx1Z2luLWNsYXNzPm9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5jb3JlLk90aGVyd2lzZTwvcGx1Z2luLWNsYXNzPgorICA8L3RhZy1wbHVnaW4+CisgIDx0YWctcGx1Z2luPgorICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5ydC5jb3JlLkZvckVhY2hUYWc8L3RhZy1jbGFzcz4KKyAgICA8cGx1Z2luLWNsYXNzPm9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5jb3JlLkZvckVhY2g8L3BsdWdpbi1jbGFzcz4KKyAgPC90YWctcGx1Z2luPgorICA8dGFnLXBsdWdpbj4KKyAgCTx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5ydC5jb3JlLk91dFRhZzwvdGFnLWNsYXNzPgorICAJPHBsdWdpbi1jbGFzcz5vcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuY29yZS5PdXQ8L3BsdWdpbi1jbGFzcz4KKyAgPC90YWctcGx1Z2luPgorICA8dGFnLXBsdWdpbj4KKyAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcucnQuY29yZS5TZXRUYWc8L3RhZy1jbGFzcz4KKyAgICA8cGx1Z2luLWNsYXNzPm9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5jb3JlLlNldDwvcGx1Z2luLWNsYXNzPgorICA8L3RhZy1wbHVnaW4+CisgIDx0YWctcGx1Z2luPgorICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5jb21tb24uY29yZS5SZW1vdmVUYWc8L3RhZy1jbGFzcz4KKyAgICA8cGx1Z2luLWNsYXNzPm9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5jb3JlLlJlbW92ZTwvcGx1Z2luLWNsYXNzPgorICA8L3RhZy1wbHVnaW4+CisgIDx0YWctcGx1Z2luPgorICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5jb21tb24uY29yZS5DYXRjaFRhZzwvdGFnLWNsYXNzPgorICAgIDxwbHVnaW4tY2xhc3M+b3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLmNvcmUuQ2F0Y2g8L3BsdWdpbi1jbGFzcz4KKyAgPC90YWctcGx1Z2luPgorICA8dGFnLXBsdWdpbj4KKyAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcucnQuY29yZS5Gb3JUb2tlbnNUYWc8L3RhZy1jbGFzcz4KKyAgICA8cGx1Z2luLWNsYXNzPm9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5jb3JlLkZvclRva2VuczwvcGx1Z2luLWNsYXNzPgorICA8L3RhZy1wbHVnaW4+CisgIDx0YWctcGx1Z2luPgorICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5ydC5jb3JlLkltcG9ydFRhZzwvdGFnLWNsYXNzPgorICAgIDxwbHVnaW4tY2xhc3M+b3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLmNvcmUuSW1wb3J0PC9wbHVnaW4tY2xhc3M+CisgIDwvdGFnLXBsdWdpbj4KKzwvdGFnLXBsdWdpbnM+CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3V0aWwvRmFzdERhdGVGb3JtYXQuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdXRpbC9GYXN0RGF0ZUZvcm1hdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNGJhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3V0aWwvRmFzdERhdGVGb3JtYXQuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CisKKy8qKgorICogRmFzdCBkYXRlIGZvcm1hdHRlciB0aGF0IGNhY2hlcyByZWNlbnRseSBmb3JtYXR0ZWQgZGF0ZSBpbmZvcm1hdGlvbgorICogYW5kIHVzZXMgaXQgdG8gYXZvaWQgdG9vLWZyZXF1ZW50IGNhbGxzIHRvIHRoZSB1bmRlcmx5aW5nCisgKiBmb3JtYXR0ZXIuICBOb3RlOiBicmVha3MgZmllbGRQb3NpdGlvbiBwYXJhbSBvZiBmb3JtYXQoRGF0ZSwKKyAqIFN0cmluZ0J1ZmZlciwgRmllbGRQb3NpdGlvbikuICBJZiB5b3UgY2FyZSBhYm91dCB0aGUgZmllbGQKKyAqIHBvc2l0aW9uLCBjYWxsIHRoZSB1bmRlcmx5aW5nIERhdGVGb3JtYXQgZGlyZWN0bHkuCisgKgorICogQGF1dGhvciBTdGFuIEJhaWxlcworICogQGF1dGhvciBBbGV4IENoYWZmZWUKKyAqLworcHVibGljIGNsYXNzIEZhc3REYXRlRm9ybWF0IGV4dGVuZHMgRGF0ZUZvcm1hdCB7CisKKyAgICBwcml2YXRlIERhdGVGb3JtYXQgZGY7CisgICAgcHJpdmF0ZSBsb25nIGxhc3RTZWMgPSAtMTsKKyAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBwcml2YXRlIEZpZWxkUG9zaXRpb24gZnAgPSBuZXcgRmllbGRQb3NpdGlvbihEYXRlRm9ybWF0Lk1JTExJU0VDT05EX0ZJRUxEKTsKKyAgICAKKyAgICBwdWJsaWMgRmFzdERhdGVGb3JtYXQoRGF0ZUZvcm1hdCBkZikgeworICAgICAgICB0aGlzLmRmID0gZGY7CisgICAgfQorCisgICAgcHVibGljIERhdGUgcGFyc2UoU3RyaW5nIHRleHQsIFBhcnNlUG9zaXRpb24gcG9zKSB7CisJcmV0dXJuIGRmLnBhcnNlKHRleHQsIHBvcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90ZTogYnJlYWtzIGZ1bmN0aW9uYWxpdHkgb2YgZmllbGRQb3NpdGlvbiBwYXJhbS4gQWxzbzoKKyAgICAgKiB0aGVyZSdzIGEgYnVnIGluIFNpbXBsZURhdGVGb3JtYXQgd2l0aCAiUyIgYW5kICJTUyIsIHVzZSAiU1NTIgorICAgICAqIGluc3RlYWQgaWYgeW91IHdhbnQgYSBtc2VjIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0KERhdGUgZGF0ZSwgU3RyaW5nQnVmZmVyIHRvQXBwZW5kVG8sCisJCQkgICAgICAgRmllbGRQb3NpdGlvbiBmaWVsZFBvc2l0aW9uKSB7CisgICAgICAgIGxvbmcgZHQgPSBkYXRlLmdldFRpbWUoKTsKKyAgICAgICAgbG9uZyBkcyA9IGR0IC8gMTAwMDsKKyAgICAgICAgaWYgKGRzICE9IGxhc3RTZWMpIHsKKyAgICAgICAgICAgIHNiLnNldExlbmd0aCgwKTsKKyAgICAgICAgICAgIGRmLmZvcm1hdChkYXRlLCBzYiwgZnApOworICAgICAgICAgICAgbGFzdFNlYyA9IGRzOworICAgICAgICB9IGVsc2UgeworCSAgICAvLyBtdW5nZSBjdXJyZW50IG1zZWMgaW50byBleGlzdGluZyBzdHJpbmcKKyAgICAgICAgICAgIGludCBtcyA9IChpbnQpKGR0ICUgMTAwMCk7CisgICAgICAgICAgICBpbnQgcG9zID0gZnAuZ2V0RW5kSW5kZXgoKTsKKwkgICAgaW50IGJlZ2luID0gZnAuZ2V0QmVnaW5JbmRleCgpOworCSAgICBpZiAocG9zID4gMCkgeworCQlpZiAocG9zID4gYmVnaW4pCisJCSAgICBzYi5zZXRDaGFyQXQoLS1wb3MsIENoYXJhY3Rlci5mb3JEaWdpdChtcyAlIDEwLCAxMCkpOworCQltcyAvPSAxMDsKKwkJaWYgKHBvcyA+IGJlZ2luKQorCQkgICAgc2Iuc2V0Q2hhckF0KC0tcG9zLCBDaGFyYWN0ZXIuZm9yRGlnaXQobXMgJSAxMCwgMTApKTsKKwkJbXMgLz0gMTA7CisJCWlmIChwb3MgPiBiZWdpbikKKwkJICAgIHNiLnNldENoYXJBdCgtLXBvcywgQ2hhcmFjdGVyLmZvckRpZ2l0KG1zICUgMTAsIDEwKSk7CisJICAgIH0KKyAgICAgICAgfQorCXRvQXBwZW5kVG8uYXBwZW5kKHNiLnRvU3RyaW5nKCkpOworCXJldHVybiB0b0FwcGVuZFRvOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwlTdHJpbmcgZm9ybWF0ID0gInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIjsKKwlpZiAoYXJncy5sZW5ndGggPiAwKQorCSAgICBmb3JtYXQgPSBhcmdzWzBdOworICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KGZvcm1hdCk7CisgICAgICAgIEZhc3REYXRlRm9ybWF0IGZkZiA9IG5ldyBGYXN0RGF0ZUZvcm1hdChzZGYpOworICAgICAgICBEYXRlIGQgPSBuZXcgRGF0ZSgpOworCisJZC5zZXRUaW1lKDEpOworCVN5c3RlbS5vdXQucHJpbnRsbihmZGYuZm9ybWF0KGQpICsgIlx0IiArIHNkZi5mb3JtYXQoZCkpOworCWQuc2V0VGltZSgyMCk7CisJU3lzdGVtLm91dC5wcmludGxuKGZkZi5mb3JtYXQoZCkgKyAiXHQiICsgc2RmLmZvcm1hdChkKSk7CisJZC5zZXRUaW1lKDUwMCk7CisJU3lzdGVtLm91dC5wcmludGxuKGZkZi5mb3JtYXQoZCkgKyAiXHQiICsgc2RmLmZvcm1hdChkKSk7CisJZC5zZXRUaW1lKDU0Myk7CisJU3lzdGVtLm91dC5wcmludGxuKGZkZi5mb3JtYXQoZCkgKyAiXHQiICsgc2RmLmZvcm1hdChkKSk7CisJZC5zZXRUaW1lKDk5OSk7CisJU3lzdGVtLm91dC5wcmludGxuKGZkZi5mb3JtYXQoZCkgKyAiXHQiICsgc2RmLmZvcm1hdChkKSk7CisJZC5zZXRUaW1lKDEwNTApOworCVN5c3RlbS5vdXQucHJpbnRsbihmZGYuZm9ybWF0KGQpICsgIlx0IiArIHNkZi5mb3JtYXQoZCkpOworCWQuc2V0VGltZSgyNTQzKTsKKwlTeXN0ZW0ub3V0LnByaW50bG4oZmRmLmZvcm1hdChkKSArICJcdCIgKyBzZGYuZm9ybWF0KGQpKTsKKwlkLnNldFRpbWUoMTIzNDUpOworCVN5c3RlbS5vdXQucHJpbnRsbihmZGYuZm9ybWF0KGQpICsgIlx0IiArIHNkZi5mb3JtYXQoZCkpOworCWQuc2V0VGltZSgxMjM0MCk7CisJU3lzdGVtLm91dC5wcmludGxuKGZkZi5mb3JtYXQoZCkgKyAiXHQiICsgc2RmLmZvcm1hdChkKSk7CisJCisgICAgICAgIGZpbmFsIGludCByZXBzID0gMTAwMDAwOworICAgICAgICB7CisgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgICAgIGQuc2V0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgZmRmLmZvcm1hdChkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvbmcgZWxhcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZhc3Q6ICIgKyBlbGFwICsgIiBlbGFwc2VkIik7CisJICAgIFN5c3RlbS5vdXQucHJpbnRsbihmZGYuZm9ybWF0KGQpKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgICAgIGQuc2V0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgc2RmLmZvcm1hdChkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvbmcgZWxhcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7CSAgICAKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2xvdzogIiArIGVsYXAgKyAiIGVsYXBzZWQiKTsKKwkgICAgU3lzdGVtLm91dC5wcmludGxuKHNkZi5mb3JtYXQoZCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci91dGlsL1F1ZXVlLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3V0aWwvUXVldWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDUxYjc4Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci91dGlsL1F1ZXVlLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogQSBzaW1wbGUgRklGTyBxdWV1ZSBjbGFzcyB3aGljaCBjYXVzZXMgdGhlIGNhbGxpbmcgdGhyZWFkIHRvIHdhaXQKKyAqIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eSBhbmQgbm90aWZpZXMgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIHdoZW4gaXQKKyAqIGlzIG5vdCBlbXB0eS4KKyAqCisgKiBAYXV0aG9yIEFuaWwgViAoYWt2QGVuZy5zdW4uY29tKQorICovCitwdWJsaWMgY2xhc3MgUXVldWUgeworICAgIHByaXZhdGUgVmVjdG9yIHZlY3RvciA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKiAKKyAgICAgKiBQdXQgdGhlIG9iamVjdCBpbnRvIHRoZSBxdWV1ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0Jb2JqZWN0CQl0aGUgb2JqZWN0IHRvIGJlIGFwcGVuZGVkIHRvIHRoZQorICAgICAqIAkJCQlxdWV1ZS4gCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHB1dChPYmplY3Qgb2JqZWN0KSB7CisJdmVjdG9yLmFkZEVsZW1lbnQob2JqZWN0KTsKKwlub3RpZnkoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHVsbCB0aGUgZmlyc3Qgb2JqZWN0IG91dCBvZiB0aGUgcXVldWUuIFdhaXQgaWYgdGhlIHF1ZXVlIGlzCisgICAgICogZW1wdHkuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcHVsbCgpIHsKKwl3aGlsZSAoaXNFbXB0eSgpKQorCSAgICB0cnkgeworCQl3YWl0KCk7CisJICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisJICAgIH0KKwlyZXR1cm4gZ2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmaXJzdCBvYmplY3Qgb3V0IG9mIHRoZSBxdWV1ZS4gUmV0dXJuIG51bGwgaWYgdGhlIHF1ZXVlCisgICAgICogaXMgZW1wdHkuIAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGdldCgpIHsKKwlPYmplY3Qgb2JqZWN0ID0gcGVlaygpOworCWlmIChvYmplY3QgIT0gbnVsbCkKKwkgICAgdmVjdG9yLnJlbW92ZUVsZW1lbnRBdCgwKTsKKwlyZXR1cm4gb2JqZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlZWsgdG8gc2VlIGlmIHNvbWV0aGluZyBpcyBhdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBwZWVrKCkgeworCWlmIChpc0VtcHR5KCkpCisJICAgIHJldHVybiBudWxsOworCXJldHVybiB2ZWN0b3IuZWxlbWVudEF0KDApOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgcXVldWUgZW1wdHk/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKwlyZXR1cm4gdmVjdG9yLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIb3cgbWFueSBlbGVtZW50cyBhcmUgdGhlcmUgaW4gdGhpcyBxdWV1ZT8KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisJcmV0dXJuIHZlY3Rvci5zaXplKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci91dGlsL1NpbXBsZVBvb2wuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdXRpbC9TaW1wbGVQb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhNTc0ZQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdXRpbC9TaW1wbGVQb29sLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIudXRpbDsKKworLyoqCisgKiBTaW1wbGUgb2JqZWN0IHBvb2wuIEJhc2VkIG9uIFRocmVhZFBvb2wgYW5kIGZldyBvdGhlciBjbGFzc2VzCisgKgorICogVGhlIHBvb2wgd2lsbCBpZ25vcmUgb3ZlcmZsb3cgYW5kIHJldHVybiBudWxsIGlmIGVtcHR5LgorICoKKyAqIEBhdXRob3IgR2FsIFNoYWNob3IKKyAqIEBhdXRob3IgQ29zdGluCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTaW1wbGVQb29sICB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TSVpFPTE2OworCisgICAgLyoKKyAgICAgKiBXaGVyZSB0aGUgdGhyZWFkcyBhcmUgaGVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBwb29sW107CisKKyAgICBwcml2YXRlIGludCBtYXg7CisgICAgcHJpdmF0ZSBpbnQgY3VycmVudD0tMTsKKworICAgIHByaXZhdGUgT2JqZWN0IGxvY2s7CisgICAgCisgICAgcHVibGljIFNpbXBsZVBvb2woKSB7CisJdGhpcy5tYXg9REVGQVVMVF9TSVpFOworCXRoaXMucG9vbD1uZXcgT2JqZWN0W21heF07CisJdGhpcy5sb2NrPW5ldyBPYmplY3QoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFNpbXBsZVBvb2woaW50IG1heCkgeworCXRoaXMubWF4PW1heDsKKwl0aGlzLnBvb2w9bmV3IE9iamVjdFttYXhdOworCXRoaXMubG9jaz1uZXcgT2JqZWN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoZSBwb29sLCBhbmQgZG9lcyBub3RoaW5nIGlmIHRoZSBwb29sIGlzIGZ1bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXQoT2JqZWN0IG8pIHsKKwlzeW5jaHJvbml6ZWQoIGxvY2sgKSB7CisJICAgIGlmKCBjdXJyZW50IDwgKG1heC0xKSApIHsKKwkJY3VycmVudCArPSAxOworCQlwb29sW2N1cnJlbnRdID0gbzsKKyAgICAgICAgICAgIH0KKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFuIG9iamVjdCBmcm9tIHRoZSBwb29sLCBudWxsIGlmIHRoZSBwb29sIGlzIGVtcHR5LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgeworCU9iamVjdCBpdGVtID0gbnVsbDsKKwlzeW5jaHJvbml6ZWQoIGxvY2sgKSB7CisJICAgIGlmKCBjdXJyZW50ID49IDAgKSB7CisJCWl0ZW0gPSBwb29sW2N1cnJlbnRdOworCQljdXJyZW50IC09IDE7CisJICAgIH0KKwl9CisJcmV0dXJuIGl0ZW07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBwb29sCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXgoKSB7CisJcmV0dXJuIG1heDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3V0aWwvU3lzdGVtTG9nSGFuZGxlci5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci91dGlsL1N5c3RlbUxvZ0hhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmIxZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci91dGlsL1N5c3RlbUxvZ0hhbmRsZXIuamF2YQpAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIudXRpbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKKworCisvKioKKyAqIFRoaXMgaGVscGVyIGNsYXNzIG1heSBiZSB1c2VkIHRvIGRvIHNvcGhpc3RpY2F0ZWQgcmVkaXJlY3Rpb24gb2YgCisgKiBTeXN0ZW0ub3V0IGFuZCBTeXN0ZW0uZXJyLgorICogCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKi8KK3B1YmxpYyBjbGFzcyBTeXN0ZW1Mb2dIYW5kbGVyIGV4dGVuZHMgUHJpbnRTdHJlYW0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHRoZSBoYW5kbGVyIHRvIGNhcHR1cmUgdGhlIG91dHB1dCBvZiB0aGUgZ2l2ZW4gc3RlYW0uCisgICAgICovCisgICAgcHVibGljIFN5c3RlbUxvZ0hhbmRsZXIoUHJpbnRTdHJlYW0gd3JhcHBlZCkgeworICAgICAgICBzdXBlcih3cmFwcGVkKTsKKyAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVkIFByaW50U3RyZWFtLgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmludFN0cmVhbSB3cmFwcGVkID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhyZWFkIDwtPiBQcmludFN0cmVhbSBhc3NvY2lhdGlvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBUaHJlYWRMb2NhbCBzdHJlYW1zID0gbmV3IFRocmVhZExvY2FsKCk7CisKKworICAgIC8qKgorICAgICAqIFRocmVhZCA8LT4gQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFzc29jaWF0aW9ucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFRocmVhZExvY2FsIGRhdGEgPSBuZXcgVGhyZWFkTG9jYWwoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIHB1YmxpYyBQcmludFN0cmVhbSBnZXRXcmFwcGVkKCkgeworICAgICAgcmV0dXJuIHdyYXBwZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgY2FwdHVyaW5nIHRocmVhZCdzIG91dHB1dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGhyZWFkKCkgeworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgZGF0YS5zZXQoYmFvcyk7CisgICAgICAgIHN0cmVhbXMuc2V0KG5ldyBQcmludFN0cmVhbShiYW9zKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdG9wIGNhcHR1cmluZyB0aHJlYWQncyBvdXRwdXQgYW5kIHJldHVybiBjYXB0dXJlZCBkYXRhIGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuc2V0VGhyZWFkKCkgeworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IAorICAgICAgICAgICAgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSkgZGF0YS5nZXQoKTsKKyAgICAgICAgaWYgKGJhb3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtcy5zZXQobnVsbCk7CisgICAgICAgIGRhdGEuc2V0KG51bGwpOworICAgICAgICByZXR1cm4gYmFvcy50b1N0cmluZygpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEZpbmQgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdGhlIG91dHB1dCBtdXN0IGJlIHdyaXR0ZW4gdG8uCisgICAgICovCisgICAgcHJvdGVjdGVkIFByaW50U3RyZWFtIGZpbmRTdHJlYW0oKSB7CisgICAgICAgIFByaW50U3RyZWFtIHBzID0gKFByaW50U3RyZWFtKSBzdHJlYW1zLmdldCgpOworICAgICAgICBpZiAocHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcHMgPSB3cmFwcGVkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwczsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpbnRTdHJlYW0gTWV0aG9kcworCisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKKyAgICAgICAgZmluZFN0cmVhbSgpLmZsdXNoKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNoZWNrRXJyb3IoKSB7CisgICAgICAgIHJldHVybiBmaW5kU3RyZWFtKCkuY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldEVycm9yKCkgeworICAgICAgICAvL2ZpbmRTdHJlYW0oKS5zZXRFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS53cml0ZShiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluZFN0cmVhbSgpLndyaXRlKGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICAgICAgZmluZFN0cmVhbSgpLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50KGJvb2xlYW4gYikgeworICAgICAgICBmaW5kU3RyZWFtKCkucHJpbnQoYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnQoY2hhciBjKSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS5wcmludChjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludChpbnQgaSkgeworICAgICAgICBmaW5kU3RyZWFtKCkucHJpbnQoaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnQobG9uZyBsKSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS5wcmludChsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludChmbG9hdCBmKSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS5wcmludChmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludChkb3VibGUgZCkgeworICAgICAgICBmaW5kU3RyZWFtKCkucHJpbnQoZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnQoY2hhcltdIHMpIHsKKyAgICAgICAgZmluZFN0cmVhbSgpLnByaW50KHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50KFN0cmluZyBzKSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS5wcmludChzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludChPYmplY3Qgb2JqKSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS5wcmludChvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oKSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS5wcmludGxuKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihib29sZWFuIHgpIHsKKyAgICAgICAgZmluZFN0cmVhbSgpLnByaW50bG4oeCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihjaGFyIHgpIHsKKyAgICAgICAgZmluZFN0cmVhbSgpLnByaW50bG4oeCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihpbnQgeCkgeworICAgICAgICBmaW5kU3RyZWFtKCkucHJpbnRsbih4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGxvbmcgeCkgeworICAgICAgICBmaW5kU3RyZWFtKCkucHJpbnRsbih4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGZsb2F0IHgpIHsKKyAgICAgICAgZmluZFN0cmVhbSgpLnByaW50bG4oeCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihkb3VibGUgeCkgeworICAgICAgICBmaW5kU3RyZWFtKCkucHJpbnRsbih4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGNoYXJbXSB4KSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS5wcmludGxuKHgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oU3RyaW5nIHgpIHsKKyAgICAgICAgZmluZFN0cmVhbSgpLnByaW50bG4oeCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihPYmplY3QgeCkgeworICAgICAgICBmaW5kU3RyZWFtKCkucHJpbnRsbih4KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL0FTQ0lJUmVhZGVyLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9BU0NJSVJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMTNkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9BU0NJSVJlYWRlci5qYXZhCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci54bWxwYXJzZXI7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuTG9jYWxpemVyOworCisvKioKKyAqIEEgc2ltcGxlIEFTQ0lJIGJ5dGUgcmVhZGVyLiBUaGlzIGlzIGFuIG9wdGltaXplZCByZWFkZXIgZm9yIHJlYWRpbmcKKyAqIGJ5dGUgc3RyZWFtcyB0aGF0IG9ubHkgY29udGFpbiA3LWJpdCBBU0NJSSBjaGFyYWN0ZXJzLgorICoKKyAqIEBhdXRob3IgQW5keSBDbGFyaywgSUJNCisgKgorICogQHZlcnNpb24gJElkJAorICovCitwdWJsaWMgY2xhc3MgQVNDSUlSZWFkZXIKKyAgICBleHRlbmRzIFJlYWRlciB7CisKKyAgICAvLworICAgIC8vIENvbnN0YW50cworICAgIC8vCisKKyAgICAvKiogRGVmYXVsdCBieXRlIGJ1ZmZlciBzaXplICgyMDQ4KS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gMjA0ODsKKworICAgIC8vCisgICAgLy8gRGF0YQorICAgIC8vCisKKyAgICAvKiogSW5wdXQgc3RyZWFtLiAqLworICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBmSW5wdXRTdHJlYW07CisKKyAgICAvKiogQnl0ZSBidWZmZXIuICovCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBmQnVmZmVyOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RvcnMKKyAgICAvLworCisgICAgLyoqIAorICAgICAqIENvbnN0cnVjdHMgYW4gQVNDSUkgcmVhZGVyIGZyb20gdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0gCisgICAgICogYW5kIGJ1ZmZlciBzaXplLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0U3RyZWFtIFRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHBhcmFtIHNpemUgICAgICAgIFRoZSBpbml0aWFsIGJ1ZmZlciBzaXplLgorICAgICAqLworICAgIHB1YmxpYyBBU0NJSVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IHNpemUpIHsKKyAgICAgICAgZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07CisgICAgICAgIGZCdWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFJlYWRlciBtZXRob2RzCisgICAgLy8KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBzaW5nbGUgY2hhcmFjdGVyLiAgVGhpcyBtZXRob2Qgd2lsbCBibG9jayB1bnRpbCBhIGNoYXJhY3RlciBpcworICAgICAqIGF2YWlsYWJsZSwgYW4gSS9PIGVycm9yIG9jY3Vycywgb3IgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCisgICAgICoKKyAgICAgKiA8cD4gU3ViY2xhc3NlcyB0aGF0IGludGVuZCB0byBzdXBwb3J0IGVmZmljaWVudCBzaW5nbGUtY2hhcmFjdGVyIGlucHV0CisgICAgICogc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiAgICAgVGhlIGNoYXJhY3RlciByZWFkLCBhcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSAwIHRvIDEyNworICAgICAqICAgICAgICAgICAgICg8dHQ+MHgwMC0weDdmPC90dD4pLCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaGFzCisgICAgICogICAgICAgICAgICAgYmVlbiByZWFjaGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBiMCA9IGZJbnB1dFN0cmVhbS5yZWFkKCk7CisgICAgICAgIGlmIChiMCA+IDB4ODApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnhtbC5pbnZhbGlkQVNDSUkiLAorCQkJCQkJICAgICAgIEludGVnZXIudG9TdHJpbmcoYjApKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGIwOworICAgIH0gLy8gcmVhZCgpOmludAorCisgICAgLyoqCisgICAgICogUmVhZCBjaGFyYWN0ZXJzIGludG8gYSBwb3J0aW9uIG9mIGFuIGFycmF5LiAgVGhpcyBtZXRob2Qgd2lsbCBibG9jaworICAgICAqIHVudGlsIHNvbWUgaW5wdXQgaXMgYXZhaWxhYmxlLCBhbiBJL08gZXJyb3Igb2NjdXJzLCBvciB0aGUgZW5kIG9mIHRoZQorICAgICAqIHN0cmVhbSBpcyByZWFjaGVkLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgY2ggICAgIERlc3RpbmF0aW9uIGJ1ZmZlcgorICAgICAqIEBwYXJhbSAgICAgIG9mZnNldCBPZmZzZXQgYXQgd2hpY2ggdG8gc3RhcnQgc3RvcmluZyBjaGFyYWN0ZXJzCisgICAgICogQHBhcmFtICAgICAgbGVuZ3RoIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZAorICAgICAqCisgICAgICogQHJldHVybiAgICAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlCisgICAgICogICAgICAgICAgICAgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGludCByZWFkKGNoYXIgY2hbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGxlbmd0aCA+IGZCdWZmZXIubGVuZ3RoKSB7CisgICAgICAgICAgICBsZW5ndGggPSBmQnVmZmVyLmxlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBpbnQgY291bnQgPSBmSW5wdXRTdHJlYW0ucmVhZChmQnVmZmVyLCAwLCBsZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGludCBiMCA9IGZCdWZmZXJbaV07CisgICAgICAgICAgICBpZiAoYjAgPiAweDgwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IueG1sLmludmFsaWRBU0NJSSIsCisJCQkJCQkJICAgSW50ZWdlci50b1N0cmluZyhiMCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoW29mZnNldCArIGldID0gKGNoYXIpYjA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0gLy8gcmVhZChjaGFyW10saW50LGludCkKKworICAgIC8qKgorICAgICAqIFNraXAgY2hhcmFjdGVycy4gIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgc29tZSBjaGFyYWN0ZXJzIGFyZQorICAgICAqIGF2YWlsYWJsZSwgYW4gSS9PIGVycm9yIG9jY3Vycywgb3IgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIG4gIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lwCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseSBza2lwcGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZklucHV0U3RyZWFtLnNraXAobik7CisgICAgfSAvLyBza2lwKGxvbmcpOmxvbmcKKworICAgIC8qKgorICAgICAqIFRlbGwgd2hldGhlciB0aGlzIHN0cmVhbSBpcyByZWFkeSB0byBiZSByZWFkLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBuZXh0IHJlYWQoKSBpcyBndWFyYW50ZWVkIG5vdCB0byBibG9jayBmb3IgaW5wdXQsCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlLiAgTm90ZSB0aGF0IHJldHVybmluZyBmYWxzZSBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUKKyAgICAgKiBuZXh0IHJlYWQgd2lsbCBibG9jay4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXJldHVybiBmYWxzZTsKKyAgICB9IC8vIHJlYWR5KCkKKworICAgIC8qKgorICAgICAqIFRlbGwgd2hldGhlciB0aGlzIHN0cmVhbSBzdXBwb3J0cyB0aGUgbWFyaygpIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgeworCXJldHVybiBmSW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpOworICAgIH0gLy8gbWFya1N1cHBvcnRlZCgpCisKKyAgICAvKioKKyAgICAgKiBNYXJrIHRoZSBwcmVzZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uICBTdWJzZXF1ZW50IGNhbGxzIHRvIHJlc2V0KCkKKyAgICAgKiB3aWxsIGF0dGVtcHQgdG8gcmVwb3NpdGlvbiB0aGUgc3RyZWFtIHRvIHRoaXMgcG9pbnQuICBOb3QgYWxsCisgICAgICogY2hhcmFjdGVyLWlucHV0IHN0cmVhbXMgc3VwcG9ydCB0aGUgbWFyaygpIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgcmVhZEFoZWFkTGltaXQgIExpbWl0IG9uIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IG1heSBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgd2hpbGUgc3RpbGwgcHJlc2VydmluZyB0aGUgbWFyay4gIEFmdGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGluZyB0aGlzIG1hbnkgY2hhcmFjdGVycywgYXR0ZW1wdGluZyB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0IHRoZSBzdHJlYW0gbWF5IGZhaWwuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IG1hcmsoKSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJZklucHV0U3RyZWFtLm1hcmsocmVhZEFoZWFkTGltaXQpOworICAgIH0gLy8gbWFyayhpbnQpCisKKyAgICAvKioKKyAgICAgKiBSZXNldCB0aGUgc3RyZWFtLiAgSWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBtYXJrZWQsIHRoZW4gYXR0ZW1wdCB0bworICAgICAqIHJlcG9zaXRpb24gaXQgYXQgdGhlIG1hcmsuICBJZiB0aGUgc3RyZWFtIGhhcyBub3QgYmVlbiBtYXJrZWQsIHRoZW4KKyAgICAgKiBhdHRlbXB0IHRvIHJlc2V0IGl0IGluIHNvbWUgd2F5IGFwcHJvcHJpYXRlIHRvIHRoZSBwYXJ0aWN1bGFyIHN0cmVhbSwKKyAgICAgKiBmb3IgZXhhbXBsZSBieSByZXBvc2l0aW9uaW5nIGl0IHRvIGl0cyBzdGFydGluZyBwb2ludC4gIE5vdCBhbGwKKyAgICAgKiBjaGFyYWN0ZXItaW5wdXQgc3RyZWFtcyBzdXBwb3J0IHRoZSByZXNldCgpIG9wZXJhdGlvbiwgYW5kIHNvbWUgc3VwcG9ydAorICAgICAqIHJlc2V0KCkgd2l0aG91dCBzdXBwb3J0aW5nIG1hcmsoKS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiB0aGUgc3RyZWFtIGhhcyBub3QgYmVlbiBtYXJrZWQsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIHRoZSBtYXJrIGhhcyBiZWVuIGludmFsaWRhdGVkLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiB0aGUgc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQgcmVzZXQoKSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmSW5wdXRTdHJlYW0ucmVzZXQoKTsKKyAgICB9IC8vIHJlc2V0KCkKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBzdHJlYW0uICBPbmNlIGEgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZCwgZnVydGhlciByZWFkKCksCisgICAgICogcmVhZHkoKSwgbWFyaygpLCBvciByZXNldCgpIGludm9jYXRpb25zIHdpbGwgdGhyb3cgYW4gSU9FeGNlcHRpb24uCisgICAgICogQ2xvc2luZyBhIHByZXZpb3VzbHktY2xvc2VkIHN0cmVhbSwgaG93ZXZlciwgaGFzIG5vIGVmZmVjdC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgIGZJbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICB9IC8vIGNsb3NlKCkKKworfSAvLyBjbGFzcyBBU0NJSVJlYWRlcgpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvRW5jb2RpbmdNYXAuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL0VuY29kaW5nTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViZjMxZgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL0VuY29kaW5nTWFwLmphdmEKQEAgLTAsMCArMSwxMDIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKKyAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBJbnRlcm5hdGlvbmFsCisgKiBCdXNpbmVzcyBNYWNoaW5lcywgSW5jLiwgaHR0cDovL3d3dy5hcGFjaGUub3JnLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIueG1scGFyc2VyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworLyoqCisgKiBFbmNvZGluZ01hcCBpcyBhIGNvbnZlbmllbmNlIGNsYXNzIHdoaWNoIGhhbmRsZXMgY29udmVyc2lvbnMgYmV0d2VlbiAKKyAqIElBTkEgZW5jb2RpbmcgbmFtZXMgYW5kIEphdmEgZW5jb2RpbmcgbmFtZXMsIGFuZCB2aWNlIHZlcnNhLiBUaGUKKyAqIGVuY29kaW5nIG5hbWVzIHVzZWQgaW4gWE1MIGluc3RhbmNlIGRvY3VtZW50cyA8c3Ryb25nPm11c3Q8L3N0cm9uZz4KKyAqIGJlIHRoZSBJQU5BIGVuY29kaW5nIG5hbWVzIHNwZWNpZmllZCBvciBvbmUgb2YgdGhlIGFsaWFzZXMgZm9yIHRob3NlIG5hbWVzCisgKiB3aGljaCBJQU5BIGRlZmluZXMuCisgKiA8cD4KKyAqIDxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBOYW1lPC9CPgorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj48Qj5Vc2UgdGhpcyBuYW1lIGluIFhNTCBmaWxlczwvQj4KKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+PEI+TmFtZSBUeXBlPC9CPgorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj48Qj5YZXJjZXMgY29udmVydHMgdG8gdGhpcyBKYXZhIEVuY29kZXIgTmFtZTwvQj4KKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPjggYml0IFVuaWNvZGU8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5VVEYtOAorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPlVURjgKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPklTTyBMYXRpbiAxPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktMQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTEKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPklTTyBMYXRpbiAyPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktMgorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTIKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPklTTyBMYXRpbiAzPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktMworICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTMKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPklTTyBMYXRpbiA0PC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktNAorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTQKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPklTTyBMYXRpbiBDeXJpbGxpYzwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS01CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5JU08gTGF0aW4gQXJhYmljPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktNgorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTYKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPklTTyBMYXRpbiBHcmVlazwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTcKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS03CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5JU08gTGF0aW4gSGVicmV3PC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktOAorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTgKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPklTTyBMYXRpbiA1PC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktOQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTkKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogVVM8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtdXMKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDAzNworICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBDYW5hZGE8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtY2EKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDAzNworICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBOZXRoZXJsYW5kczwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1ubAorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwMDM3CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IERlbm1hcms8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtZGsKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDI3NworICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBOb3J3YXk8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3Atbm8KKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDI3NworICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBGaW5sYW5kPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWZpCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AyNzgKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogU3dlZGVuPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLXNlCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AyNzgKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogSXRhbHk8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtaXQKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDI4MAorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBTcGFpbiwgTGF0aW4gQW1lcmljYTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1lcworICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwMjg0CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IEdyZWF0IEJyaXRhaW48L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtZ2IKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDI4NQorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBGcmFuY2U8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtZnIKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDI5NworICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBBcmFiaWM8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtYXIxCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3A0MjAKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogSGVicmV3PC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWhlCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3A0MjQKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogU3dpdHplcmxhbmQ8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtY2gKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDUwMAorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBSb2VjZTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1yb2VjZQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwODcwCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IFl1Z29zbGF2aWE8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AteXUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDg3MAorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBJY2VsYW5kPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWlzCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3A4NzEKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogVXJkdTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1hcjIKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDkxOAorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+Q2hpbmVzZSBmb3IgUFJDLCBtaXhlZCAxLzIgYnl0ZTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmdiMjMxMgorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPkdCMjMxMgorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RXh0ZW5kZWQgVW5peCBDb2RlLCBwYWNrZWQgZm9yIEphcGFuZXNlPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZXVjLWpwCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZXVjamlzCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5KYXBhbmVzZTogaXNvLTIwMjItanA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5pc28tMjAyMC1qcAorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPkpJUworICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+SmFwYW5lc2U6IFNoaWZ0IEpJUzwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPlNoaWZ0X0pJUworICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPlNKSVMKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkNoaW5lc2U6IEJpZzU8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5CaWc1CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+QmlnNQorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RXh0ZW5kZWQgVW5peCBDb2RlLCBwYWNrZWQgZm9yIEtvcmVhbjwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmV1Yy1rcgorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmlzbzIwMjJrcgorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+Q3lyaWxsaWM8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5rb2k4LXIKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5rb2k4LXIKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogPC9UQUJMRT4KKyAqIAorICogQGF1dGhvciBUQU1VUkEgS2VudCwgSUJNCisgKiBAYXV0aG9yIEFuZHkgQ2xhcmssIElCTQorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqLworcHVibGljIGNsYXNzIEVuY29kaW5nTWFwIHsKKworICAgIC8vCisgICAgLy8gRGF0YQorICAgIC8vCisKKyAgICAvKiogZklBTkEySmF2YU1hcCAqLworICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgSGFzaHRhYmxlIGZJQU5BMkphdmFNYXAgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAvKiogZkphdmEySUFOQU1hcCAqLworICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgSGFzaHRhYmxlIGZKYXZhMklBTkFNYXAgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAvLworICAgIC8vIFN0YXRpYyBpbml0aWFsaXphdGlvbgorICAgIC8vCisKKyAgICBzdGF0aWMgeworCisgICAgICAgIC8vIGFkZCBJQU5BIHRvIEphdmEgZW5jb2RpbmcgbWFwcGluZ3MuCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJCSUc1IiwgICAgICAgICAgICAiQmlnNSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NCSUc1IiwgICAgICAgICAgICAiQmlnNSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1AwMzciLCAgICAiQ1AwMzciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTAzNyIsICAgICJDUDAzNyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk0wMzciLCAgICAiQ1AwMzciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVCQ0RJQy1DUC1VUyIsICAgICJDUDAzNyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUJDRElDLUNQLUNBIiwgICAgIkNQMDM3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFQkNESUMtQ1AtTkwiLCAgICAiQ1AwMzciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVCQ0RJQy1DUC1XVCIsICAgICJDUDAzNyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMjczIiwgICAgIkNQMjczIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDI3MyIsICAgICJDUDI3MyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk0yNzMiLCAgICAiQ1AyNzMiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTI3NyIsICAgICJDUDI3NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1AyNzciLCAgICAiQ1AyNzciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSUJNMjc3IiwgICAgIkNQMjc3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFQkNESUMtQ1AtREsiLCAgICAiQ1AyNzciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVCQ0RJQy1DUC1OTyIsICAgICJDUDI3NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMjc4IiwgICAgIkNQMjc4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDI3OCIsICAgICJDUDI3OCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk0yNzgiLCAgICAiQ1AyNzgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVCQ0RJQy1DUC1GSSIsICAgICJDUDI3OCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUJDRElDLUNQLVNFIiwgICAgIkNQMjc4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0yODAiLCAgICAiQ1AyODAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMjgwIiwgICAgIkNQMjgwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTI4MCIsICAgICJDUDI4MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUJDRElDLUNQLUlUIiwgICAgIkNQMjgwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0yODQiLCAgICAiQ1AyODQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMjg0IiwgICAgIkNQMjg0Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTI4NCIsICAgICJDUDI4NCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUJDRElDLUNQLUVTIiwgICAgIkNQMjg0Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFQkNESUMtQ1AtR0IiLCAgICAiQ1AyODUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTI4NSIsICAgICJDUDI4NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1AyODUiLCAgICAiQ1AyODUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSUJNMjg1IiwgICAgIkNQMjg1Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFQkNESUMtSlAtS0FOQSIsICAgICJDUDI5MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMjkwIiwgICAgIkNQMjkwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDI5MCIsICAgICJDUDI5MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk0yOTAiLCAgICAiQ1AyOTAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVCQ0RJQy1DUC1GUiIsICAgICJDUDI5NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMjk3IiwgICAgIkNQMjk3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDI5NyIsICAgICJDUDI5NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk0yOTciLCAgICAiQ1AyOTciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVCQ0RJQy1DUC1BUjEiLCAgICJDUDQyMCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNNDIwIiwgICAgIkNQNDIwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDQyMCIsICAgICJDUDQyMCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk00MjAiLCAgICAiQ1A0MjAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVCQ0RJQy1DUC1IRSIsICAgICJDUDQyNCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNNDI0IiwgICAgIkNQNDI0Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDQyNCIsICAgICJDUDQyNCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk00MjQiLCAgICAiQ1A0MjQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTQzNyIsICAgICJDUDQzNyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiNDM3IiwgICAgIkNQNDM3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDQzNyIsICAgICJDUDQzNyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NQQzhDT0RFUEFHRTQzNyIsICAgICJDUDQzNyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUJDRElDLUNQLUNIIiwgICAgIkNQNTAwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk01MDAiLCAgICAiQ1A1MDAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQNTAwIiwgICAgIkNQNTAwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTUwMCIsICAgICJDUDUwMCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUJDRElDLUNQLUNIIiwgICAgIkNQNTAwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFQkNESUMtQ1AtQkUiLCAgICAiQ1A1MDAiKTsgCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk03NzUiLCAgICAiQ1A3NzUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQNzc1IiwgICAgIkNQNzc1Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU1BDNzc1QkFMVElDIiwgICAgIkNQNzc1Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk04NTAiLCAgICAiQ1A4NTAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIjg1MCIsICAgICJDUDg1MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1A4NTAiLCAgICAiQ1A4NTAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTUEM4NTBNVUxUSUxJTkdVQUwiLCAgICAiQ1A4NTAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTg1MiIsICAgICJDUDg1MiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiODUyIiwgICAgIkNQODUyIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDg1MiIsICAgICJDUDg1MiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NQQ1A4NTIiLCAgICAiQ1A4NTIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTg1NSIsICAgICJDUDg1NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiODU1IiwgICAgIkNQODU1Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDg1NSIsICAgICJDUDg1NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk04NTUiLCAgICAiQ1A4NTUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTg1NyIsICAgICJDUDg1NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiODU3IiwgICAgIkNQODU3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDg1NyIsICAgICJDUDg1NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk04NTciLCAgICAiQ1A4NTciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTAwODU4IiwgICAgIkNQODU4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDAwODU4IiwgICAgIkNQODU4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDQ1NJRDAwODU4IiwgICAgIkNQODU4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk04NjAiLCAgICAiQ1A4NjAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIjg2MCIsICAgICJDUDg2MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1A4NjAiLCAgICAiQ1A4NjAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSUJNODYwIiwgICAgIkNQODYwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk04NjEiLCAgICAiQ1A4NjEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIjg2MSIsICAgICJDUDg2MSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1A4NjEiLCAgICAiQ1A4NjEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQLUlTIiwgICAgIkNQODYxIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTg2MSIsICAgICJDUDg2MSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNODYyIiwgICAgIkNQODYyIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCI4NjIiLCAgICAiQ1A4NjIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQODYyIiwgICAgIkNQODYyIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU1BDODYyTEFUSU5IRUJSRVciLCAgICAiQ1A4NjIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTg2MyIsICAgICJDUDg2MyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiODYzIiwgICAgIkNQODYzIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDg2MyIsICAgICJDUDg2MyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk04NjMiLCAgICAiQ1A4NjMiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTg2NCIsICAgICJDUDg2NCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1A4NjQiLCAgICAiQ1A4NjQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSUJNODY0IiwgICAgIkNQODY0Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk04NjUiLCAgICAiQ1A4NjUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIjg2NSIsICAgICJDUDg2NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1A4NjUiLCAgICAiQ1A4NjUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSUJNODY1IiwgICAgIkNQODY1Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk04NjYiLCAgICAiQ1A4NjYiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIjg2NiIsICAgICJDUDg2NiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1A4NjYiLCAgICAiQ1A4NjYiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSUJNODY2IiwgICAgIkNQODY2Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk04NjgiLCAgICAiQ1A4NjgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQODY4IiwgICAgIkNQODY4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTg2OCIsICAgICJDUDg2OCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1AtQVIiLCAgICAgICAgIkNQODY4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk04NjkiLCAgICAiQ1A4NjkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQODY5IiwgICAgIkNQODY5Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTg2OSIsICAgICJDUDg2OSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1AtR1IiLCAgICAgICAgIkNQODY5Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk04NzAiLCAgICAiQ1A4NzAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQODcwIiwgICAgIkNQODcwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTg3MCIsICAgICJDUDg3MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUJDRElDLUNQLVJPRUNFIiwgIkNQODcwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFQkNESUMtQ1AtWVUiLCAgICAiQ1A4NzAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTg3MSIsICAgICJDUDg3MSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1A4NzEiLCAgICAiQ1A4NzEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSUJNODcxIiwgICAgIkNQODcxIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFQkNESUMtQ1AtSVMiLCAgICAiQ1A4NzEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTkxOCIsICAgICJDUDkxOCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1A5MTgiLCAgICAiQ1A5MTgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSUJNOTE4IiwgICAgIkNQOTE4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFQkNESUMtQ1AtQVIyIiwgICAiQ1A5MTgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTAwOTI0IiwgICAgIkNQOTI0Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDAwOTI0IiwgICAgIkNQOTI0Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDQ1NJRDAwOTI0IiwgICAgIkNQOTI0Iik7CisgICAgICAgIC8vIGlzIHRoaXMgYW4gZXJyb3I/Pz8KKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVCQ0RJQy1MQVRJTjktLUVVUk8iLCAgICAiQ1A5MjQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTEwMjYiLCAgICAiQ1AxMDI2Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDEwMjYiLCAgICAiQ1AxMDI2Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTEwMjYiLCAgICAiQ1AxMDI2Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0wMTE0MCIsICAgICJDcDExNDAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMDExNDAiLCAgICAiQ3AxMTQwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDQ1NJRDAxMTQwIiwgICAgIkNwMTE0MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMDExNDEiLCAgICAiQ3AxMTQxIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDAxMTQxIiwgICAgIkNwMTE0MSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ0NTSUQwMTE0MSIsICAgICJDcDExNDEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTAxMTQyIiwgICAgIkNwMTE0MiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1AwMTE0MiIsICAgICJDcDExNDIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNDU0lEMDExNDIiLCAgICAiQ3AxMTQyIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0wMTE0MyIsICAgICJDcDExNDMiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMDExNDMiLCAgICAiQ3AxMTQzIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDQ1NJRDAxMTQzIiwgICAgIkNwMTE0MyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMDExNDQiLCAgICAiQ3AxMTQ0Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDAxMTQ0IiwgICAgIkNwMTE0NCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ0NTSUQwMTE0NCIsICAgICJDcDExNDQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTAxMTQ1IiwgICAgIkNwMTE0NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1AwMTE0NSIsICAgICJDcDExNDUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNDU0lEMDExNDUiLCAgICAiQ3AxMTQ1Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0wMTE0NiIsICAgICJDcDExNDYiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMDExNDYiLCAgICAiQ3AxMTQ2Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDQ1NJRDAxMTQ2IiwgICAgIkNwMTE0NiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMDExNDciLCAgICAiQ3AxMTQ3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDAxMTQ3IiwgICAgIkNwMTE0NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ0NTSUQwMTE0NyIsICAgICJDcDExNDciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTAxMTQ4IiwgICAgIkNwMTE0OCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1AwMTE0OCIsICAgICJDcDExNDgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNDU0lEMDExNDgiLCAgICAiQ3AxMTQ4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0wMTE0OSIsICAgICJDcDExNDkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMDExNDkiLCAgICAiQ3AxMTQ5Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDQ1NJRDAxMTQ5IiwgICAgIkNwMTE0OSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRVVDLUpQIiwgICAgICAgICAgIkVVQ0pJUyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NFVUNQS0RGTVRKQVBBTkVTRSIsICAgICAgICAgICJFVUNKSVMiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVYVEVOREVEX1VOSVhfQ09ERV9QQUNLRURfRk9STUFUX0ZPUl9KQVBBTkVTRSIsICAgICAgICAgICJFVUNKSVMiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVVQy1LUiIsICAgICAgICAgICJLU0M1NjAxIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0VVQ0tSIiwgICAgICAgICAgIktTQzU2MDEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIktTX0NfNTYwMS0xOTg3IiwgICAgICAgICAgIktTX0NfNTYwMS0xOTg3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tSVItMTQ5IiwgICAgICAgICAgIktTX0NfNTYwMS0xOTg3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJLU19DXzU2MDEtMTk4OSIsICAgICAgICAgICJLU19DXzU2MDEtMTk4NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiS1NDXzU2MDEiLCAgICAgICAgICAiS1NfQ181NjAxLTE5ODciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIktPUkVBTiIsICAgICAgICAgICJLU19DXzU2MDEtMTk4NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NLU0M1NjAxMTk4NyIsICAgICAgICAgICJLU19DXzU2MDEtMTk4NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiR0IyMzEyIiwgICAgICAgICAgIkdCMjMxMiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NHQjIzMTIiLCAgICAgICAgICAiR0IyMzEyIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tMjAyMi1KUCIsICAgICAiSklTIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lTTzIwMjJKUCIsICAgICAiSklTIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tMjAyMi1LUiIsICAgICAiSVNPMjAyMktSIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lTTzIwMjJLUiIsICAgICAiSVNPMjAyMktSIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tMjAyMi1DTiIsICAgICAiSVNPMjAyMkNOIik7CisKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIlgwMjAxIiwgICJKSVMwMjAxIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lTTzEzSklTQzYyMjBKUCIsICJKSVMwMjAxIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJYMDIwOCIsICAiSklTMDIwOCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPLUlSLTg3IiwgICJKSVMwMjA4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJYMDIwOGRiaUpJU19YMDIwOC0xOTgzIiwgICJKSVMwMjA4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lTTzg3SklTWDAyMDgiLCAgIkpJUzAyMDgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIlgwMjEyIiwgICJKSVMwMjEyIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tSVItMTU5IiwgICJKSVMwMjEyIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lTTzE1OUpJU1gwMjEyMTk5MCIsICAiSklTMDIxMiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiR0IxODAzMCIsICAgICAgICJHQjE4MDMwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJHQksiLCAgICAgICAiR0JLIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDkzNiIsICAgICAgICJHQksiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIk1TOTM2IiwgICAgICAgIkdCSyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiV0lORE9XUy05MzYiLCAgICAgICAiR0JLIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJTSElGVF9KSVMiLCAgICAgICAiU0pJUyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NTSElGVEpJUyIsICAgICAgICJTSklTIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJNU19LQU5KSSIsICAgICAgICJTSklTIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJXSU5ET1dTLTMxSiIsICAgICAgICJNUzkzMiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NXSU5ET1dTMzFKIiwgICAgICAgIk1TOTMyIik7CisKKwkgICAgLy8gQWRkIHN1cHBvcnQgZm9yIENwMTI1MiBhbmQgaXRzIGZyaWVuZHMKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIldJTkRPV1MtMTI1MCIsICAgIkNwMTI1MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiV0lORE9XUy0xMjUxIiwgICAiQ3AxMjUxIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJXSU5ET1dTLTEyNTIiLCAgICJDcDEyNTIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIldJTkRPV1MtMTI1MyIsICAgIkNwMTI1MyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiV0lORE9XUy0xMjU0IiwgICAiQ3AxMjU0Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJXSU5ET1dTLTEyNTUiLCAgICJDcDEyNTUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIldJTkRPV1MtMTI1NiIsICAgIkNwMTI1NiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiV0lORE9XUy0xMjU3IiwgICAiQ3AxMjU3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJXSU5ET1dTLTEyNTgiLCAgICJDcDEyNTgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIlRJUy02MjAiLCAgICJUSVM2MjAiKTsKKworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPLTg4NTktMSIsICAgICAgIklTTzg4NTlfMSIpOyAKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy1JUi0xMDAiLCAgICAgICJJU084ODU5XzEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTT184ODU5LTEiLCAgICAgICJJU084ODU5XzEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkxBVElOMSIsICAgICAgIklTTzg4NTlfMSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJU09MQVRJTjEiLCAgICAgICJJU084ODU5XzEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkwxIiwgICAgICAiSVNPODg1OV8xIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk04MTkiLCAgICAgICJJU084ODU5XzEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQODE5IiwgICAgICAiSVNPODg1OV8xIik7CisKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy04ODU5LTIiLCAgICAgICJJU084ODU5XzIiKTsgCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tSVItMTAxIiwgICAgICAiSVNPODg1OV8yIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU09fODg1OS0yIiwgICAgICAiSVNPODg1OV8yIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJMQVRJTjIiLCAgICAgICJJU084ODU5XzIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSVNPTEFUSU4yIiwgICAgICAiSVNPODg1OV8yIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJMMiIsICAgICAgIklTTzg4NTlfMiIpOworCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tODg1OS0zIiwgICAgICAiSVNPODg1OV8zIik7IAorICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPLUlSLTEwOSIsICAgICAgIklTTzg4NTlfMyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPXzg4NTktMyIsICAgICAgIklTTzg4NTlfMyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiTEFUSU4zIiwgICAgICAiSVNPODg1OV8zIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lTT0xBVElOMyIsICAgICAgIklTTzg4NTlfMyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiTDMiLCAgICAgICJJU084ODU5XzMiKTsKKworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPLTg4NTktNCIsICAgICAgIklTTzg4NTlfNCIpOyAKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy1JUi0xMTAiLCAgICAgICJJU084ODU5XzQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTT184ODU5LTQiLCAgICAgICJJU084ODU5XzQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkxBVElONCIsICAgICAgIklTTzg4NTlfNCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJU09MQVRJTjQiLCAgICAgICJJU084ODU5XzQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkw0IiwgICAgICAiSVNPODg1OV80Iik7CisKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy04ODU5LTUiLCAgICAgICJJU084ODU5XzUiKTsgCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tSVItMTQ0IiwgICAgICAiSVNPODg1OV81Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU09fODg1OS01IiwgICAgICAiSVNPODg1OV81Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDWVJJTExJQyIsICAgICAgIklTTzg4NTlfNSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJU09MQVRJTkNZUklMTElDIiwgICAgICAiSVNPODg1OV81Iik7CisKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy04ODU5LTYiLCAgICAgICJJU084ODU5XzYiKTsgCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tSVItMTI3IiwgICAgICAiSVNPODg1OV82Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU09fODg1OS02IiwgICAgICAiSVNPODg1OV82Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFQ01BLTExNCIsICAgICAgIklTTzg4NTlfNiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQVNNTy03MDgiLCAgICAgICJJU084ODU5XzYiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkFSQUJJQyIsICAgICAgIklTTzg4NTlfNiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJU09MQVRJTkFSQUJJQyIsICAgICAgIklTTzg4NTlfNiIpOworCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tODg1OS03IiwgICAgICAiSVNPODg1OV83Iik7IAorICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPLUlSLTEyNiIsICAgICAgIklTTzg4NTlfNyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPXzg4NTktNyIsICAgICAgIklTTzg4NTlfNyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUxPVF85MjgiLCAgICAgICJJU084ODU5XzciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVDTUEtMTE4IiwgICAgICAiSVNPODg1OV83Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJHUkVFSyIsICAgICAgIklTTzg4NTlfNyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJU09MQVRJTkdSRUVLIiwgICAgICAiSVNPODg1OV83Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJHUkVFSzgiLCAgICAgICJJU084ODU5XzciKTsKKworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPLTg4NTktOCIsICAgICAgIklTTzg4NTlfOCIpOyAKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy04ODU5LTgtSSIsICAgICAgIklTTzg4NTlfOCIpOyAvLyBhZGRlZCBzaW5jZSB0aGlzIGVuY29kaW5nIG9ubHkgZGlmZmVycyB3LnIudC4gcHJlc2VudGF0aW9uIAorICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPLUlSLTEzOCIsICAgICAgIklTTzg4NTlfOCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPXzg4NTktOCIsICAgICAgIklTTzg4NTlfOCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSEVCUkVXIiwgICAgICAiSVNPODg1OV84Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lTT0xBVElOSEVCUkVXIiwgICAgICAiSVNPODg1OV84Iik7CisKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy04ODU5LTkiLCAgICAgICJJU084ODU5XzkiKTsgCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tSVItMTQ4IiwgICAgICAiSVNPODg1OV85Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU09fODg1OS05IiwgICAgICAiSVNPODg1OV85Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJMQVRJTjUiLCAgICAgICJJU084ODU5XzkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSVNPTEFUSU41IiwgICAgICAiSVNPODg1OV85Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJMNSIsICAgICAgIklTTzg4NTlfOSIpOworCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tODg1OS0xMyIsICAgICAgIklTTzg4NTlfMTMiKTsgCisgICAgICAgIAorICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPLTg4NTktMTUiLCAgICAgICJJU084ODU5XzE1X0ZESVMiKTsgCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU09fODg1OS0xNSIsICAgICAgIklTTzg4NTlfMTVfRkRJUyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiTEFUSU4tOSIsICAgICAgICAgICJJU084ODU5XzE1X0ZESVMiKTsgCisKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIktPSTgtUiIsICAgICAgICAgICJLT0k4X1IiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTS09JOFIiLCAgICAgICAgICAiS09JOF9SIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJVUy1BU0NJSSIsICAgICAgICAiQVNDSUkiKTsgCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tSVItNiIsICAgICAgICAiQVNDSUkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkFOU0lfWDMuNC0xOTY4IiwgICAgICAgICJBU0NJSSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQU5TSV9YMy40LTE5ODYiLCAgICAgICAgIkFTQ0lJIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU09fNjQ2LklSVjoxOTkxIiwgICAgICAgICJBU0NJSSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQVNDSUkiLCAgICAgICAgIkFTQ0lJIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0FTQ0lJIiwgICAgICAgICJBU0NJSSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPNjQ2LVVTIiwgICAgICAgICJBU0NJSSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiVVMiLCAgICAgICAgIkFTQ0lJIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0zNjciLCAgICAgICAgIkFTQ0lJIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDM2NyIsICAgICAgICAiQVNDSUkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIlVURi04IiwgICAgICAgICAgICJVVEY4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJVVEYtMTYiLCAgICAgICAgICAgIlVURi0xNiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiVVRGLTE2QkUiLCAgICAgICAgICAgIlVuaWNvZGVCaWciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIlVURi0xNkxFIiwgICAgICAgICAgICJVbmljb2RlTGl0dGxlIik7CisKKyAgICAgICAgLy8gc3VwcG9ydCBmb3IgMTA0NywgYXMgcHJvcG9zZWQgdG8gYmUgYWRkZWQgdG8gdGhlIAorICAgICAgICAvLyBJQU5BIHJlZ2lzdHJ5IGluIAorICAgICAgICAvLyBodHRwOi8vbGlzdHMudzMub3JnL0FyY2hpdmVzL1B1YmxpYy9pZXRmLWNoYXJzZXQvMjAwMkp1bFNlcC8wMDQ5Lmh0bWwKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0xMDQ3IiwgICAgIkNwMTA0NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMTA0NyIsICAgICJDcDEwNDciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMTA0NyIsICAgICJDcDEwNDciKTsKKworICAgICAgICAvLyBBZGRpbmcgbmV3IGFsaWFzZXMgYXMgcHJvcG9zZWQgaW4KKyAgICAgICAgLy8gaHR0cDovL2xpc3RzLnczLm9yZy9BcmNoaXZlcy9QdWJsaWMvaWV0Zi1jaGFyc2V0LzIwMDJKdWxTZXAvMDA1OC5odG1sCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0tMzciLCAgICAiQ1AwMzciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0yNzMiLCAgICAiQ1AyNzMiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0yNzciLCAgICAiQ1AyNzciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0yNzgiLCAgICAiQ1AyNzgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0yODAiLCAgICAiQ1AyODAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0yODQiLCAgICAiQ1AyODQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0yODUiLCAgICAiQ1AyODUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0yOTAiLCAgICAiQ1AyOTAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0yOTciLCAgICAiQ1AyOTciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS00MjAiLCAgICAiQ1A0MjAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS00MjQiLCAgICAiQ1A0MjQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS00MzciLCAgICAiQ1A0MzciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS01MDAiLCAgICAiQ1A1MDAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS03NzUiLCAgICAiQ1A3NzUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04NTAiLCAgICAiQ1A4NTAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04NTIiLCAgICAiQ1A4NTIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04NTUiLCAgICAiQ1A4NTUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04NTciLCAgICAiQ1A4NTciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04NTgiLCAgICAiQ1A4NTgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04NjAiLCAgICAiQ1A4NjAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04NjEiLCAgICAiQ1A4NjEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04NjIiLCAgICAiQ1A4NjIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04NjMiLCAgICAiQ1A4NjMiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04NjQiLCAgICAiQ1A4NjQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04NjUiLCAgICAiQ1A4NjUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04NjYiLCAgICAiQ1A4NjYiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04NjgiLCAgICAiQ1A4NjgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04NjkiLCAgICAiQ1A4NjkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04NzAiLCAgICAiQ1A4NzAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04NzEiLCAgICAiQ1A4NzEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS05MTgiLCAgICAiQ1A5MTgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS05MjQiLCAgICAiQ1A5MjQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0xMDI2IiwgICAgIkNQMTAyNiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTExNDAiLCAgICAiQ3AxMTQwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0tMTE0MSIsICAgICJDcDExNDEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0xMTQyIiwgICAgIkNwMTE0MiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTExNDMiLCAgICAiQ3AxMTQzIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0tMTE0NCIsICAgICJDcDExNDQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0xMTQ1IiwgICAgIkNwMTE0NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTExNDYiLCAgICAiQ3AxMTQ2Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0tMTE0NyIsICAgICJDcDExNDciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0xMTQ4IiwgICAgIkNwMTE0OCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTExNDkiLCAgICAiQ3AxMTQ5Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0tODE5IiwgICAgICAiSVNPODg1OV8xIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0tMzY3IiwgICAgICAgICJBU0NJSSIpOworCisgICAgICAgIC8vIFJFVklTSVQ6CisgICAgICAgIC8vICAgajpDTlMxMTY0MyAtPiBFVUMtVFc/CisgICAgICAgIC8vICAgSVNPLTIwMjItQ04/IElTTy0yMDIyLUNOLUVYVD8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAvLyBhZGQgSmF2YSB0byBJQU5BIGVuY29kaW5nIG1hcHBpbmdzCisgICAgICAgIC8vZkphdmEySUFOQU1hcC5wdXQoIjg4NTlfMSIsICAgICJVUy1BU0NJSSIpOyAvLyA/CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJJU084ODU5XzEiLCAgICAiSVNPLTg4NTktMSIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiSVNPODg1OV8yIiwgICAgIklTTy04ODU5LTIiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIklTTzg4NTlfMyIsICAgICJJU08tODg1OS0zIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJJU084ODU5XzQiLCAgICAiSVNPLTg4NTktNCIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiSVNPODg1OV81IiwgICAgIklTTy04ODU5LTUiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIklTTzg4NTlfNiIsICAgICJJU08tODg1OS02Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJJU084ODU5XzciLCAgICAiSVNPLTg4NTktNyIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiSVNPODg1OV84IiwgICAgIklTTy04ODU5LTgiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIklTTzg4NTlfOSIsICAgICJJU08tODg1OS05Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJJU084ODU5XzEzIiwgICAgIklTTy04ODU5LTEzIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJJU084ODU5XzE1IiwgICAgIklTTy04ODU5LTE1Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJJU084ODU5XzE1X0ZESVMiLCAgICAiSVNPLTg4NTktMTUiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkJpZzUiLCAgICAgICJCSUc1Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDAzNyIsICAgICAiRUJDRElDLUNQLVVTIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDI3MyIsICAgICAiSUJNMjczIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDI3NyIsICAgICAiRUJDRElDLUNQLURLIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDI3OCIsICAgICAiRUJDRElDLUNQLUZJIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDI4MCIsICAgICAiRUJDRElDLUNQLUlUIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDI4NCIsICAgICAiRUJDRElDLUNQLUVTIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDI4NSIsICAgICAiRUJDRElDLUNQLUdCIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDI5MCIsICAgICAiRUJDRElDLUpQLUtBTkEiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQMjk3IiwgICAgICJFQkNESUMtQ1AtRlIiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQNDIwIiwgICAgICJFQkNESUMtQ1AtQVIxIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDQyNCIsICAgICAiRUJDRElDLUNQLUhFIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDQzNyIsICAgICAiSUJNNDM3Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDUwMCIsICAgICAiRUJDRElDLUNQLUNIIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDc3NSIsICAgICAiSUJNNzc1Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDg1MCIsICAgICAiSUJNODUwIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDg1MiIsICAgICAiSUJNODUyIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDg1NSIsICAgICAiSUJNODU1Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDg1NyIsICAgICAiSUJNODU3Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDg1OCIsICAgICAiSUJNMDA4NTgiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQODYwIiwgICAgICJJQk04NjAiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQODYxIiwgICAgICJJQk04NjEiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQODYyIiwgICAgICJJQk04NjIiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQODYzIiwgICAgICJJQk04NjMiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQODY0IiwgICAgICJJQk04NjQiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQODY1IiwgICAgICJJQk04NjUiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQODY2IiwgICAgICJJQk04NjYiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQODY4IiwgICAgICJJQk04NjgiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQODY5IiwgICAgICJJQk04NjkiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQODcwIiwgICAgICJFQkNESUMtQ1AtUk9FQ0UiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQODcxIiwgICAgICJFQkNESUMtQ1AtSVMiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQOTE4IiwgICAgICJFQkNESUMtQ1AtQVIyIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDkyNCIsICAgICAiSUJNMDA5MjQiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQMTAyNiIsICAgICAiSUJNMTAyNiIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ3AwMTE0MCIsICAgICAiSUJNMDExNDAiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNwMDExNDEiLCAgICAgIklCTTAxMTQxIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDcDAxMTQyIiwgICAgICJJQk0wMTE0MiIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ3AwMTE0MyIsICAgICAiSUJNMDExNDMiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNwMDExNDQiLCAgICAgIklCTTAxMTQ0Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDcDAxMTQ1IiwgICAgICJJQk0wMTE0NSIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ3AwMTE0NiIsICAgICAiSUJNMDExNDYiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNwMDExNDciLCAgICAgIklCTTAxMTQ3Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDcDAxMTQ4IiwgICAgICJJQk0wMTE0OCIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ3AwMTE0OSIsICAgICAiSUJNMDExNDkiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkVVQ0pJUyIsICAgICJFVUMtSlAiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIktTX0NfNTYwMS0xOTg3IiwgICAgICAgICAgIktTX0NfNTYwMS0xOTg3Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJHQjIzMTIiLCAgICAiR0IyMzEyIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJJU08yMDIyS1IiLCAiSVNPLTIwMjItS1IiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIklTTzIwMjJDTiIsICJJU08tMjAyMi1DTiIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiSklTIiwgICAgICAgIklTTy0yMDIyLUpQIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJLT0k4X1IiLCAgICAiS09JOC1SIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJLU0M1NjAxIiwgICAiRVVDLUtSIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJHQjE4MDMwIiwgICAgICAiR0IxODAzMCIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiR0JLIiwgICAgICAgIkdCSyIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiU0pJUyIsICAgICAgIlNISUZUX0pJUyIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiTVM5MzIiLCAgICAgICJXSU5ET1dTLTMxSiIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiVVRGOCIsICAgICAgIlVURi04Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJVbmljb2RlIiwgICAiVVRGLTE2Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJVbmljb2RlQmlnIiwgICAiVVRGLTE2QkUiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIlVuaWNvZGVMaXR0bGUiLCAgICJVVEYtMTZMRSIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiSklTMDIwMSIsICAiWDAyMDEiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkpJUzAyMDgiLCAgIlgwMjA4Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJKSVMwMjEyIiwgICJJU08tSVItMTU5Iik7CisKKyAgICAgICAgLy8gcHJvcG9zZWQgYWRkaXRpb24gKHNlZSBhYm92ZSBmb3IgZGV0YWlscyk6CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDUDEwNDciLCAgICAiSUJNMTA0NyIpOworCisgICAgfSAvLyA8Y2xpbml0PigpCisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9ycworICAgIC8vCisKKyAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KKyAgICBwdWJsaWMgRW5jb2RpbmdNYXAoKSB7fQorCisgICAgLy8KKyAgICAvLyBQdWJsaWMgc3RhdGljIG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogQWRkcyBhbiBJQU5BIHRvIEphdmEgZW5jb2RpbmcgbmFtZSBtYXBwaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpYW5hRW5jb2RpbmcgVGhlIElBTkEgZW5jb2RpbmcgbmFtZS4KKyAgICAgKiBAcGFyYW0gamF2YUVuY29kaW5nIFRoZSBKYXZhIGVuY29kaW5nIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHB1dElBTkEySmF2YU1hcHBpbmcoU3RyaW5nIGlhbmFFbmNvZGluZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGphdmFFbmNvZGluZykgeworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dChpYW5hRW5jb2RpbmcsIGphdmFFbmNvZGluZyk7CisgICAgfSAvLyBwdXRJQU5BMkphdmFNYXBwaW5nKFN0cmluZyxTdHJpbmcpCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIGVuY29kaW5nIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgSUFOQSBlbmNvZGluZyBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpYW5hRW5jb2RpbmcgVGhlIElBTkEgZW5jb2RpbmcgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJQU5BMkphdmFNYXBwaW5nKFN0cmluZyBpYW5hRW5jb2RpbmcpIHsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpZklBTkEySmF2YU1hcC5nZXQoaWFuYUVuY29kaW5nKTsKKyAgICB9IC8vIGdldElBTkEySmF2YU1hcHBpbmcoU3RyaW5nKTpTdHJpbmcKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYW4gSUFOQSB0byBKYXZhIGVuY29kaW5nIG5hbWUgbWFwcGluZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaWFuYUVuY29kaW5nIFRoZSBJQU5BIGVuY29kaW5nIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlSUFOQTJKYXZhTWFwcGluZyhTdHJpbmcgaWFuYUVuY29kaW5nKSB7CisgICAgICAgIHJldHVybiAoU3RyaW5nKWZJQU5BMkphdmFNYXAucmVtb3ZlKGlhbmFFbmNvZGluZyk7CisgICAgfSAvLyByZW1vdmVJQU5BMkphdmFNYXBwaW5nKFN0cmluZyk6U3RyaW5nCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgSmF2YSB0byBJQU5BIGVuY29kaW5nIG5hbWUgbWFwcGluZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gamF2YUVuY29kaW5nIFRoZSBKYXZhIGVuY29kaW5nIG5hbWUuCisgICAgICogQHBhcmFtIGlhbmFFbmNvZGluZyBUaGUgSUFOQSBlbmNvZGluZyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXRKYXZhMklBTkFNYXBwaW5nKFN0cmluZyBqYXZhRW5jb2RpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpYW5hRW5jb2RpbmcpIHsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoamF2YUVuY29kaW5nLCBpYW5hRW5jb2RpbmcpOworICAgIH0gLy8gcHV0SmF2YTJJQU5BTWFwcGluZyhTdHJpbmcsU3RyaW5nKQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSUFOQSBlbmNvZGluZyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIEphdmEgZW5jb2RpbmcgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gamF2YUVuY29kaW5nIFRoZSBKYXZhIGVuY29kaW5nIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SmF2YTJJQU5BTWFwcGluZyhTdHJpbmcgamF2YUVuY29kaW5nKSB7CisgICAgICAgIHJldHVybiAoU3RyaW5nKWZKYXZhMklBTkFNYXAuZ2V0KGphdmFFbmNvZGluZyk7CisgICAgfSAvLyBnZXRKYXZhMklBTkFNYXBwaW5nKFN0cmluZyk6U3RyaW5nCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgSmF2YSB0byBJQU5BIGVuY29kaW5nIG5hbWUgbWFwcGluZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gamF2YUVuY29kaW5nIFRoZSBKYXZhIGVuY29kaW5nIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlSmF2YTJJQU5BTWFwcGluZyhTdHJpbmcgamF2YUVuY29kaW5nKSB7CisgICAgICAgIHJldHVybiAoU3RyaW5nKWZKYXZhMklBTkFNYXAucmVtb3ZlKGphdmFFbmNvZGluZyk7CisgICAgfSAvLyByZW1vdmVKYXZhMklBTkFNYXBwaW5nCisKK30gLy8gY2xhc3MgRW5jb2RpbmdNYXAKZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL1BhcnNlclV0aWxzLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9QYXJzZXJVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU4MTJmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9QYXJzZXJVdGlscy5qYXZhCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci54bWxwYXJzZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5UZXh0OworaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CisKKworLyoqCisgKiBYTUwgcGFyc2luZyB1dGlsaXRpZXMgZm9yIHByb2Nlc3Npbmcgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKKyAqIGRlc2NyaXB0b3IgYW5kIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZmlsZXMuICBGSVhNRSAtIG1ha2UgdGhlc2UKKyAqIHVzZSBhIHNlcGFyYXRlIGNsYXNzIGxvYWRlciBmb3IgdGhlIHBhcnNlciB0byBiZSB1c2VkLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUGFyc2VyVXRpbHMgeworCisgICAgLyoqCisgICAgICogQW4gZXJyb3IgaGFuZGxlciBmb3IgdXNlIHdoZW4gcGFyc2luZyBYTUwgZG9jdW1lbnRzLgorICAgICAqLworICAgIHN0YXRpYyBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbmV3IE15RXJyb3JIYW5kbGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBBbiBlbnRpdHkgcmVzb2x2ZXIgZm9yIHVzZSB3aGVuIHBhcnNpbmcgWE1MIGRvY3VtZW50cy4KKyAgICAgKi8KKyAgICBzdGF0aWMgRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIgPSBuZXcgTXlFbnRpdHlSZXNvbHZlcigpOworCisgICAgLy8gVHVybiBvZmYgZm9yIEpTUCAyLjAgdW50aWwgc3dpdGNoIG92ZXIgdG8gdXNpbmcgeHNjaGVtYS4KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGluZyA9IGZhbHNlOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBzcGVjaWZpZWQgWE1MIGRvY3VtZW50LCBhbmQgcmV0dXJuIGEgPGNvZGU+VHJlZU5vZGU8L2NvZGU+CisgICAgICogdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcm9vdCBub2RlIG9mIHRoZSBkb2N1bWVudCB0cmVlLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBVUkkgb2YgdGhlIFhNTCBkb2N1bWVudCBiZWluZyBwYXJzZWQKKyAgICAgKiBAcGFyYW0gaXMgSW5wdXQgc291cmNlIGNvbnRhaW5pbmcgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBKYXNwZXJFeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gSmFzcGVyRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgVHJlZU5vZGUgcGFyc2VYTUxEb2N1bWVudChTdHJpbmcgdXJpLCBJbnB1dFNvdXJjZSBpcykKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOworCisgICAgICAgIC8vIFBlcmZvcm0gYW4gWE1MIHBhcnNlIG9mIHRoaXMgZG9jdW1lbnQsIHZpYSBKQVhQCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPQorICAgICAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgICAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcodmFsaWRhdGluZyk7CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgICAgICBidWlsZGVyLnNldEVudGl0eVJlc29sdmVyKGVudGl0eVJlc29sdmVyKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RXJyb3JIYW5kbGVyKGVycm9ySGFuZGxlcik7CisgICAgICAgICAgICBkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2UoaXMpOworCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5wYXJzZS54bWwiLCB1cmkpLCBleCk7CisJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5wYXJzZS54bWwubGluZSIsCisJCQkJICAgICAgdXJpLAorCQkJCSAgICAgIEludGVnZXIudG9TdHJpbmcoZXguZ2V0TGluZU51bWJlcigpKSwKKwkJCQkgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGV4LmdldENvbHVtbk51bWJlcigpKSksCisJCSBleCk7CisJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIHN4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IucGFyc2UueG1sIiwgdXJpKSwgc3gpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpbykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnBhcnNlLnhtbCIsIHVyaSksIGlvKTsKKwl9CisKKyAgICAgICAgLy8gQ29udmVydCB0aGUgcmVzdWx0aW5nIGRvY3VtZW50IHRvIGEgZ3JhcGggb2YgVHJlZU5vZGVzCisgICAgICAgIHJldHVybiAoY29udmVydChudWxsLCBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIHNwZWNpZmllZCBYTUwgZG9jdW1lbnQsIGFuZCByZXR1cm4gYSA8Y29kZT5UcmVlTm9kZTwvY29kZT4KKyAgICAgKiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSByb290IG5vZGUgb2YgdGhlIGRvY3VtZW50IHRyZWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFVSSSBvZiB0aGUgWE1MIGRvY3VtZW50IGJlaW5nIHBhcnNlZAorICAgICAqIEBwYXJhbSBpcyBJbnB1dCBzdHJlYW0gY29udGFpbmluZyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEphc3BlckV4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBKYXNwZXJFeGNlcHRpb24gaWYgYSBwYXJzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBUcmVlTm9kZSBwYXJzZVhNTERvY3VtZW50KFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlzKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIChwYXJzZVhNTERvY3VtZW50KHVyaSwgbmV3IElucHV0U291cmNlKGlzKSkpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgVHJlZU5vZGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc3BlY2lmaWVkIE5vZGUsCisgICAgICogaW5jbHVkaW5nIHByb2Nlc3NpbmcgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIGFuZCBjaGlsZHJlbiBub2Rlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBUcmVlTm9kZSAoaWYgYW55KSBmb3IgdGhlIG5ldyBUcmVlTm9kZQorICAgICAqIEBwYXJhbSBub2RlIFRoZSBYTUwgZG9jdW1lbnQgTm9kZSB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVHJlZU5vZGUgY29udmVydChUcmVlTm9kZSBwYXJlbnQsIE5vZGUgbm9kZSkgeworCisgICAgICAgIC8vIENvbnN0cnVjdCBhIG5ldyBUcmVlTm9kZSBmb3IgdGhpcyBub2RlCisgICAgICAgIFRyZWVOb2RlIHRyZWVOb2RlID0gbmV3IFRyZWVOb2RlKG5vZGUuZ2V0Tm9kZU5hbWUoKSwgcGFyZW50KTsKKworICAgICAgICAvLyBDb252ZXJ0IGFsbCBhdHRyaWJ1dGVzIG9mIHRoaXMgbm9kZQorICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgbiA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgIE5vZGUgYXR0cmlidXRlID0gYXR0cmlidXRlcy5pdGVtKGkpOworICAgICAgICAgICAgICAgIHRyZWVOb2RlLmFkZEF0dHJpYnV0ZShhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhbmQgYXR0YWNoIGFsbCBjaGlsZHJlbiBvZiB0aGlzIG5vZGUKKyAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBuID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIENvbW1lbnQpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJvZHkgPSAoKFRleHQpIGNoaWxkKS5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChib2R5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBib2R5LnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib2R5Lmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlTm9kZS5zZXRCb2R5KGJvZHkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgVHJlZU5vZGUgdHJlZUNoaWxkID0gY29udmVydCh0cmVlTm9kZSwgY2hpbGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBjb21wbGV0ZWQgVHJlZU5vZGUgZ3JhcGgKKyAgICAgICAgcmV0dXJuICh0cmVlTm9kZSk7CisgICAgfQorfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIENsYXNzZXMKKworY2xhc3MgTXlFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIEVudGl0eVJlc29sdmVyIHsKKworICAgIC8vIExvZ2dlcgorICAgIHByaXZhdGUgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE15RW50aXR5UmVzb2x2ZXIuY2xhc3MpOworCisgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCisgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDb25zdGFudHMuQ0FDSEVEX0RURF9QVUJMSUNfSURTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgY2FjaGVkRHRkUHVibGljSWQgPSBDb25zdGFudHMuQ0FDSEVEX0RURF9QVUJMSUNfSURTW2ldOworICAgICAgICAgICAgaWYgKGNhY2hlZER0ZFB1YmxpY0lkLmVxdWFscyhwdWJsaWNJZCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VQYXRoID0gQ29uc3RhbnRzLkNBQ0hFRF9EVERfUkVTT1VSQ0VfUEFUSFNbaV07CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlUGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLmludGVybmFsLmZpbGVub3Rmb3VuZCIsIHJlc291cmNlUGF0aCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJbnB1dFNvdXJjZSBpc3JjID0gbmV3IElucHV0U291cmNlKGlucHV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXNyYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlJlc29sdmUgZW50aXR5IGZhaWxlZCIgKyBwdWJsaWNJZCArICIgIiArIHN5c3RlbUlkKTsKKyAgICAgICAgbG9nLmVycm9yKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IucGFyc2UueG1sLmludmFsaWRQdWJsaWNJZCIsCisgICAgICAgICAgICAgICAgcHVibGljSWQpKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQorCitjbGFzcyBNeUVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlciB7CisKKyAgICAvLyBMb2dnZXIKKyAgICBwcml2YXRlIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNeUVycm9ySGFuZGxlci5jbGFzcyk7CisKKyAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJQYXJzZXJVdGlsczogd2FybmluZyAiLCBleCk7CisgICAgICAgIC8vIFdlIGlnbm9yZSB3YXJuaW5ncworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgZXg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IGV4OworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9TeW1ib2xUYWJsZS5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvU3ltYm9sVGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDc3ZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvU3ltYm9sVGFibGUuamF2YQpAQCAtMCwwICsxLDMwMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCisgKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgSW50ZXJuYXRpb25hbAorICogQnVzaW5lc3MgTWFjaGluZXMsIEluYy4sIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgc3ltYm9sIHRhYmxlIGltcGxlbWVudGF0aW9uIHRoYXQgZ3VhcmFudGVlcyB0aGF0CisgKiBzdHJpbmdzIHVzZWQgYXMgaWRlbnRpZmllcnMgYXJlIHVuaXF1ZSByZWZlcmVuY2VzLiBNdWx0aXBsZSBjYWxscworICogdG8gPGNvZGU+YWRkU3ltYm9sPC9jb2RlPiB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgc3RyaW5nCisgKiByZWZlcmVuY2UuCisgKiA8cD4KKyAqIFRoZSBzeW1ib2wgdGFibGUgcGVyZm9ybXMgdGhlIHNhbWUgdGFzayBhcyA8Y29kZT5TdHJpbmcuaW50ZXJuKCk8L2NvZGU+CisgKiB3aXRoIHRoZSBmb2xsb3dpbmcgZGlmZmVyZW5jZXM6CisgKiA8dWw+CisgKiAgPGxpPgorICogICBBIG5ldyBzdHJpbmcgb2JqZWN0IGRvZXMgbm90IG5lZWQgdG8gYmUgY3JlYXRlZCBpbiBvcmRlciB0bworICogICByZXRyaWV2ZSBhIHVuaXF1ZSByZWZlcmVuY2UuIFN5bWJvbHMgY2FuIGJlIGFkZGVkIGJ5IHVzaW5nCisgKiAgIGEgc2VyaWVzIG9mIGNoYXJhY3RlcnMgaW4gYSBjaGFyYWN0ZXIgYXJyYXkuCisgKiAgPC9saT4KKyAqICA8bGk+CisgKiAgIFVzZXJzIG9mIHRoZSBzeW1ib2wgdGFibGUgY2FuIHByb3ZpZGUgdGhlaXIgb3duIHN5bWJvbCBoYXNoaW5nCisgKiAgIGltcGxlbWVudGF0aW9uLiBGb3IgZXhhbXBsZSwgYSBzaW1wbGUgc3RyaW5nIGhhc2hpbmcgYWxnb3JpdGhtCisgKiAgIG1heSBmYWlsIHRvIHByb2R1Y2UgYSBiYWxhbmNlZCBzZXQgb2YgaGFzaGNvZGVzIGZvciBzeW1ib2xzCisgKiAgIHRoYXQgYXJlIDxlbT5tb3N0bHk8L2VtPiB1bmlxdWUuIFN0cmluZ3Mgd2l0aCBzaW1pbGFyIGxlYWRpbmcKKyAqICAgY2hhcmFjdGVycyBhcmUgZXNwZWNpYWxseSBwcm9uZSB0byB0aGlzIHBvb3IgaGFzaGluZyBiZWhhdmlvci4KKyAqICA8L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIEFuZHkgQ2xhcmsKKyAqIEB2ZXJzaW9uICRJZCQKKyAqLworcHVibGljIGNsYXNzIFN5bWJvbFRhYmxlIHsKKworICAgIC8vCisgICAgLy8gQ29uc3RhbnRzCisgICAgLy8KKworICAgIC8qKiBEZWZhdWx0IHRhYmxlIHNpemUuICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVEFCTEVfU0laRSA9IDEwMTsKKworICAgIC8vCisgICAgLy8gRGF0YQorICAgIC8vCisKKyAgICAvKiogQnVja2V0cy4gKi8KKyAgICBwcm90ZWN0ZWQgRW50cnlbXSBmQnVja2V0cyA9IG51bGw7CisKKyAgICAvLyBhY3R1YWwgdGFibGUgc2l6ZQorICAgIHByb3RlY3RlZCBpbnQgZlRhYmxlU2l6ZTsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3JzCisgICAgLy8KKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgc3ltYm9sIHRhYmxlIHdpdGggYSBkZWZhdWx0IG51bWJlciBvZiBidWNrZXRzLiAqLworICAgIHB1YmxpYyBTeW1ib2xUYWJsZSgpIHsKKyAgICAgICAgdGhpcyhUQUJMRV9TSVpFKTsKKyAgICB9CisKKyAgICAvKiogQ29uc3RydWN0cyBhIHN5bWJvbCB0YWJsZSB3aXRoIGEgc3BlY2lmaWVkIG51bWJlciBvZiBidWNrZXRzLiAqLworICAgIHB1YmxpYyBTeW1ib2xUYWJsZShpbnQgdGFibGVTaXplKSB7CisgICAgICAgIGZUYWJsZVNpemUgPSB0YWJsZVNpemU7CisgICAgICAgIGZCdWNrZXRzID0gbmV3IEVudHJ5W2ZUYWJsZVNpemVdOworICAgIH0KKworICAgIC8vCisgICAgLy8gUHVibGljIG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIHN5bWJvbCB0byB0aGUgc3ltYm9sIHRhYmxlIGFuZCByZXR1cm5zIGEKKyAgICAgKiByZWZlcmVuY2UgdG8gdGhlIHVuaXF1ZSBzeW1ib2wuIElmIHRoZSBzeW1ib2wgYWxyZWFkeSBleGlzdHMsCisgICAgICogdGhlIHByZXZpb3VzIHN5bWJvbCByZWZlcmVuY2UgaXMgcmV0dXJuZWQgaW5zdGVhZCwgaW4gb3JkZXIKKyAgICAgKiBndWFyYW50ZWUgdGhhdCBzeW1ib2wgcmVmZXJlbmNlcyByZW1haW4gdW5pcXVlLgorICAgICAqCisgICAgICogQHBhcmFtIHN5bWJvbCBUaGUgbmV3IHN5bWJvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGFkZFN5bWJvbChTdHJpbmcgc3ltYm9sKSB7CisKKyAgICAgICAgLy8gc2VhcmNoIGZvciBpZGVudGljYWwgc3ltYm9sCisgICAgICAgIGludCBidWNrZXQgPSBoYXNoKHN5bWJvbCkgJSBmVGFibGVTaXplOworICAgICAgICBpbnQgbGVuZ3RoID0gc3ltYm9sLmxlbmd0aCgpOworICAgICAgICBPVVRFUjogZm9yIChFbnRyeSBlbnRyeSA9IGZCdWNrZXRzW2J1Y2tldF07IGVudHJ5ICE9IG51bGw7IGVudHJ5ID0gZW50cnkubmV4dCkgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSBlbnRyeS5jaGFyYWN0ZXJzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN5bWJvbC5jaGFyQXQoaSkgIT0gZW50cnkuY2hhcmFjdGVyc1tpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgT1VURVI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnN5bWJvbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSBuZXcgZW50cnkKKyAgICAgICAgRW50cnkgZW50cnkgPSBuZXcgRW50cnkoc3ltYm9sLCBmQnVja2V0c1tidWNrZXRdKTsKKyAgICAgICAgZkJ1Y2tldHNbYnVja2V0XSA9IGVudHJ5OworICAgICAgICByZXR1cm4gZW50cnkuc3ltYm9sOworCisgICAgfSAvLyBhZGRTeW1ib2woU3RyaW5nKTpTdHJpbmcKKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBzeW1ib2wgdG8gdGhlIHN5bWJvbCB0YWJsZSBhbmQgcmV0dXJucyBhCisgICAgICogcmVmZXJlbmNlIHRvIHRoZSB1bmlxdWUgc3ltYm9sLiBJZiB0aGUgc3ltYm9sIGFscmVhZHkgZXhpc3RzLAorICAgICAqIHRoZSBwcmV2aW91cyBzeW1ib2wgcmVmZXJlbmNlIGlzIHJldHVybmVkIGluc3RlYWQsIGluIG9yZGVyCisgICAgICogZ3VhcmFudGVlIHRoYXQgc3ltYm9sIHJlZmVyZW5jZXMgcmVtYWluIHVuaXF1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXIgVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBuZXcgc3ltYm9sLgorICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgb2YgdGhlIG5ldyBzeW1ib2wuCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBuZXcgc3ltYm9sIGluIHRoZSBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhZGRTeW1ib2woY2hhcltdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworCisgICAgICAgIC8vIHNlYXJjaCBmb3IgaWRlbnRpY2FsIHN5bWJvbAorICAgICAgICBpbnQgYnVja2V0ID0gaGFzaChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKSAlIGZUYWJsZVNpemU7CisgICAgICAgIE9VVEVSOiBmb3IgKEVudHJ5IGVudHJ5ID0gZkJ1Y2tldHNbYnVja2V0XTsgZW50cnkgIT0gbnVsbDsgZW50cnkgPSBlbnRyeS5uZXh0KSB7CisgICAgICAgICAgICBpZiAobGVuZ3RoID09IGVudHJ5LmNoYXJhY3RlcnMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyW29mZnNldCArIGldICE9IGVudHJ5LmNoYXJhY3RlcnNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIE9VVEVSOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5zeW1ib2w7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgbmV3IGVudHJ5CisgICAgICAgIEVudHJ5IGVudHJ5ID0gbmV3IEVudHJ5KGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGZCdWNrZXRzW2J1Y2tldF0pOworICAgICAgICBmQnVja2V0c1tidWNrZXRdID0gZW50cnk7CisgICAgICAgIHJldHVybiBlbnRyeS5zeW1ib2w7CisKKyAgICB9IC8vIGFkZFN5bWJvbChjaGFyW10saW50LGludCk6U3RyaW5nCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgaGFzaGNvZGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgc3ltYm9sLiBUaGUgdmFsdWUKKyAgICAgKiByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBtdXN0IGJlIGlkZW50aWNhbCB0byB0aGUgdmFsdWUgcmV0dXJuZWQKKyAgICAgKiBieSB0aGUgPGNvZGU+aGFzaChjaGFyW10saW50LGludCk8L2NvZGU+IG1ldGhvZCB3aGVuIGNhbGxlZAorICAgICAqIHdpdGggdGhlIGNoYXJhY3RlciBhcnJheSB0aGF0IGNvbXByaXNlcyB0aGUgc3ltYm9sIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzeW1ib2wgVGhlIHN5bWJvbCB0byBoYXNoLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgaGFzaChTdHJpbmcgc3ltYm9sKSB7CisKKyAgICAgICAgaW50IGNvZGUgPSAwOworICAgICAgICBpbnQgbGVuZ3RoID0gc3ltYm9sLmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb2RlID0gY29kZSAqIDM3ICsgc3ltYm9sLmNoYXJBdChpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29kZSAmIDB4N0ZGRkZGRjsKKworICAgIH0gLy8gaGFzaChTdHJpbmcpOmludAorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGhhc2hjb2RlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHN5bWJvbCBpbmZvcm1hdGlvbi4KKyAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIHZhbHVlCisgICAgICogcmV0dXJuZWQgYnkgdGhlIDxjb2RlPmhhc2goU3RyaW5nKTwvY29kZT4gbWV0aG9kIHdoZW4gY2FsbGVkCisgICAgICogd2l0aCB0aGUgc3RyaW5nIG9iamVjdCBjcmVhdGVkIGZyb20gdGhlIHN5bWJvbCBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXIgVGhlIGNoYXJhY3RlciBidWZmZXIgY29udGFpbmluZyB0aGUgc3ltYm9sLgorICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBpbnRvIHRoZSBjaGFyYWN0ZXIgYnVmZmVyIG9mIHRoZSBzdGFydAorICAgICAqICAgICAgICAgICAgICAgb2YgdGhlIHN5bWJvbC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHN5bWJvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGhhc2goY2hhcltdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworCisgICAgICAgIGludCBjb2RlID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29kZSA9IGNvZGUgKiAzNyArIGJ1ZmZlcltvZmZzZXQgKyBpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29kZSAmIDB4N0ZGRkZGRjsKKworICAgIH0gLy8gaGFzaChjaGFyW10saW50LGludCk6aW50CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN5bWJvbCB0YWJsZSBhbHJlYWR5IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBzeW1ib2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3ltYm9sIFRoZSBzeW1ib2wgdG8gbG9vayBmb3IuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNTeW1ib2woU3RyaW5nIHN5bWJvbCkgeworCisgICAgICAgIC8vIHNlYXJjaCBmb3IgaWRlbnRpY2FsIHN5bWJvbAorICAgICAgICBpbnQgYnVja2V0ID0gaGFzaChzeW1ib2wpICUgZlRhYmxlU2l6ZTsKKyAgICAgICAgaW50IGxlbmd0aCA9IHN5bWJvbC5sZW5ndGgoKTsKKyAgICAgICAgT1VURVI6IGZvciAoRW50cnkgZW50cnkgPSBmQnVja2V0c1tidWNrZXRdOyBlbnRyeSAhPSBudWxsOyBlbnRyeSA9IGVudHJ5Lm5leHQpIHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPT0gZW50cnkuY2hhcmFjdGVycy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wuY2hhckF0KGkpICE9IGVudHJ5LmNoYXJhY3RlcnNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIE9VVEVSOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgfSAvLyBjb250YWluc1N5bWJvbChTdHJpbmcpOmJvb2xlYW4KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3ltYm9sIHRhYmxlIGFscmVhZHkgY29udGFpbnMgdGhlIHNwZWNpZmllZAorICAgICAqIHN5bWJvbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXIgVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBzeW1ib2wgdG8gbG9vayBmb3IuCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHN5bWJvbCBpbiB0aGUgYnVmZmVyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3ltYm9sKGNoYXJbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKworICAgICAgICAvLyBzZWFyY2ggZm9yIGlkZW50aWNhbCBzeW1ib2wKKyAgICAgICAgaW50IGJ1Y2tldCA9IGhhc2goYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCkgJSBmVGFibGVTaXplOworICAgICAgICBPVVRFUjogZm9yIChFbnRyeSBlbnRyeSA9IGZCdWNrZXRzW2J1Y2tldF07IGVudHJ5ICE9IG51bGw7IGVudHJ5ID0gZW50cnkubmV4dCkgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSBlbnRyeS5jaGFyYWN0ZXJzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcltvZmZzZXQgKyBpXSAhPSBlbnRyeS5jaGFyYWN0ZXJzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBPVVRFUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIH0gLy8gY29udGFpbnNTeW1ib2woY2hhcltdLGludCxpbnQpOmJvb2xlYW4KKworICAgIC8vCisgICAgLy8gQ2xhc3NlcworICAgIC8vCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIGEgc3ltYm9sIHRhYmxlIGVudHJ5LiBFYWNoIGVudHJ5IGFjdHMgYXMgYSBub2RlCisgICAgICogaW4gYSBsaW5rZWQgbGlzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIEVudHJ5IHsKKworICAgICAgICAvLworICAgICAgICAvLyBEYXRhCisgICAgICAgIC8vCisKKyAgICAgICAgLyoqIFN5bWJvbC4gKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBzeW1ib2w7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN5bWJvbCBjaGFyYWN0ZXJzLiBUaGlzIGluZm9ybWF0aW9uIGlzIGR1cGxpY2F0ZWQgaGVyZSBmb3IKKyAgICAgICAgICogY29tcGFyaXNvbiBwZXJmb3JtYW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBjaGFyW10gY2hhcmFjdGVyczsKKworICAgICAgICAvKiogVGhlIG5leHQgZW50cnkuICovCisgICAgICAgIHB1YmxpYyBFbnRyeSBuZXh0OworCisgICAgICAgIC8vCisgICAgICAgIC8vIENvbnN0cnVjdG9ycworICAgICAgICAvLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVudHJ5IGZyb20gdGhlIHNwZWNpZmllZCBzeW1ib2wgYW5kIG5leHQgZW50cnkKKyAgICAgICAgICogcmVmZXJlbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEVudHJ5KFN0cmluZyBzeW1ib2wsIEVudHJ5IG5leHQpIHsKKyAgICAgICAgICAgIHRoaXMuc3ltYm9sID0gc3ltYm9sLmludGVybigpOworICAgICAgICAgICAgY2hhcmFjdGVycyA9IG5ldyBjaGFyW3N5bWJvbC5sZW5ndGgoKV07CisgICAgICAgICAgICBzeW1ib2wuZ2V0Q2hhcnMoMCwgY2hhcmFjdGVycy5sZW5ndGgsIGNoYXJhY3RlcnMsIDApOworICAgICAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVudHJ5IGZyb20gdGhlIHNwZWNpZmllZCBzeW1ib2wgaW5mb3JtYXRpb24gYW5kCisgICAgICAgICAqIG5leHQgZW50cnkgcmVmZXJlbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEVudHJ5KGNoYXJbXSBjaCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgRW50cnkgbmV4dCkgeworICAgICAgICAgICAgY2hhcmFjdGVycyA9IG5ldyBjaGFyW2xlbmd0aF07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNoLCBvZmZzZXQsIGNoYXJhY3RlcnMsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICBzeW1ib2wgPSBuZXcgU3RyaW5nKGNoYXJhY3RlcnMpLmludGVybigpOworICAgICAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgfSAvLyBjbGFzcyBFbnRyeQorCit9IC8vIGNsYXNzIFN5bWJvbFRhYmxlCmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9UcmVlTm9kZS5qYXZhIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvVHJlZU5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2NmOTdiCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvVHJlZU5vZGUuamF2YQpAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIueG1scGFyc2VyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisKKy8qKgorICogU2ltcGxpZmllZCBpbXBsZW1lbnRhdGlvbiBvZiBhIE5vZGUgZnJvbSBhIERvY3VtZW50IE9iamVjdCBNb2RlbCAoRE9NKQorICogcGFyc2Ugb2YgYW4gWE1MIGRvY3VtZW50LiAgVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIERPTSB0cmVlCisgKiBzbyB0aGF0IHRoZSBYTUwgcGFyc2VyJ3MgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+b3JnLnczYy5kb208L2NvZGU+IG5lZWQKKyAqIG5vdCBiZSB2aXNpYmxlIHRvIHRoZSByZW1haW5kZXIgb2YgSmFzcGVyLgorICogPHA+CisgKiA8c3Ryb25nPldBUk5JTkc8L3N0cm9uZz4gLSBDb25zdHJ1Y3Rpb24gb2YgYSBuZXcgdHJlZSwgb3IgbW9kaWZpY2F0aW9ucworICogdG8gYW4gZXhpc3Rpbmcgb25lLCBhcmUgbm90IHRocmVhZC1zYWZlIGFuZCBzdWNoIGFjY2Vzc2VzIG11c3QgYmUKKyAqIHN5bmNocm9uaXplZC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFRyZWVOb2RlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBub2RlIHdpdGggbm8gcGFyZW50LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyBub2RlCisgICAgICovCisgICAgcHVibGljIFRyZWVOb2RlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgdGhpcyhuYW1lLCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgbm9kZQorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIG5vZGUgdGhhdCBpcyB0aGUgcGFyZW50IG9mIHRoaXMgbm9kZQorICAgICAqLworICAgIHB1YmxpYyBUcmVlTm9kZShTdHJpbmcgbmFtZSwgVHJlZU5vZGUgcGFyZW50KSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIGlmICh0aGlzLnBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5wYXJlbnQuYWRkQ2hpbGQodGhpcyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXR0cmlidXRlcyBvZiB0aGlzIG5vZGUsIGtleWVkIGJ5IGF0dHJpYnV0ZSBuYW1lLAorICAgICAqIEluc3RhbnRpYXRlZCBvbmx5IGlmIHJlcXVpcmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIGF0dHJpYnV0ZXMgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYm9keSB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUgKGlmIGFueSkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBib2R5ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSwgaW5zdGFudGlhdGVkIG9ubHkgaWYgcmVxdWlyZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBjaGlsZHJlbiA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgbm9kZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFyZW50IG5vZGUgb2YgdGhpcyBub2RlLgorICAgICAqLworICAgIHByb3RlY3RlZCBUcmVlTm9kZSBwYXJlbnQgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGFuIGF0dHJpYnV0ZSB0byB0aGlzIG5vZGUsIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgYXR0cmlidXRlCisgICAgICogd2l0aCB0aGUgc2FtZSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGFkZAorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGF0dHJpYnV0ZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBhdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBjaGlsZCBub2RlIHRvIHRoaXMgbm9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBub2RlIFRoZSBuZXcgY2hpbGQgbm9kZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKFRyZWVOb2RlIG5vZGUpIHsKKworICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBjaGlsZHJlbi5hZGQobm9kZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBub2RlIGF0dHJpYnV0ZSBpZiBpdCBleGlzdHMsIG9yCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZmluZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIGF0dHJpYnV0ZXMuZ2V0KG5hbWUpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIEl0ZXJhdG9yIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZXMgb2YgdGhpcyBub2RlLiAgSWYgdGhlcmUgYXJlCisgICAgICogbm8gYXR0cmlidXRlcywgYW4gZW1wdHkgSXRlcmF0b3IgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGZpbmRBdHRyaWJ1dGVzKCkgeworCisgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAoYXR0cmlidXRlcy5rZXlTZXQoKS5pdGVyYXRvcigpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmaXJzdCBjaGlsZCBub2RlIG9mIHRoaXMgbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwKKyAgICAgKiBpZiB0aGVyZSBpcyBvbmU7IG90aGVyd2lzZSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgZGVzaXJlZCBjaGlsZCBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIFRyZWVOb2RlIGZpbmRDaGlsZChTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgSXRlcmF0b3IgaXRlbXMgPSBjaGlsZHJlbi5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBUcmVlTm9kZSBpdGVtID0gKFRyZWVOb2RlKSBpdGVtcy5uZXh0KCk7CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoaXRlbS5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiAoaXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIEl0ZXJhdG9yIG9mIGFsbCBjaGlsZHJlbiBvZiB0aGlzIG5vZGUuICBJZiB0aGVyZSBhcmUgbm8KKyAgICAgKiBjaGlsZHJlbiwgYW4gZW1wdHkgSXRlcmF0b3IgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGZpbmRDaGlsZHJlbigpIHsKKworICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIChjaGlsZHJlbi5pdGVyYXRvcigpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIEl0ZXJhdG9yIG92ZXIgYWxsIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSB0aGF0IGhhdmUgdGhlCisgICAgICogc3BlY2lmaWVkIG5hbWUuICBJZiB0aGVyZSBhcmUgbm8gc3VjaCBjaGlsZHJlbiwgYW4gZW1wdHkgSXRlcmF0b3IKKyAgICAgKiBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgdXNlZCB0byBzZWxlY3QgY2hpbGRyZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZmluZENoaWxkcmVuKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKSk7CisKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEl0ZXJhdG9yIGl0ZW1zID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZW1zLmhhc05leHQoKSkgeworICAgICAgICAgICAgVHJlZU5vZGUgaXRlbSA9IChUcmVlTm9kZSkgaXRlbXMubmV4dCgpOworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGl0ZW0uZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChpdGVtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHJlc3VsdHMuaXRlcmF0b3IoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYm9keSB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUgKGlmIGFueSkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRCb2R5KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5ib2R5KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgbm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLm5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IGV4aXN0aW5nIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpCisgICAgICAgICAgICBhdHRyaWJ1dGVzLnJlbW92ZShuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgY2hpbGQgbm9kZSBmcm9tIHRoaXMgbm9kZSwgaWYgaXQgaXMgb25lLgorICAgICAqCisgICAgICogQHBhcmFtIG5vZGUgVGhlIGNoaWxkIG5vZGUgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTm9kZShUcmVlTm9kZSBub2RlKSB7CisKKyAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpCisgICAgICAgICAgICBjaGlsZHJlbi5yZW1vdmUobm9kZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYm9keSB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUgKGlmIGFueSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm9keSBUaGUgYm9keSB0ZXh0IChpZiBhbnkpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qm9keShTdHJpbmcgYm9keSkgeworCisgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFRyZWVOb2RlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICB0b1N0cmluZyhzYiwgMCwgdGhpcyk7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdG8gdGhlIHNwZWNpZmllZCBTdHJpbmdCdWZmZXIgYSBjaGFyYWN0ZXIgcmVwcmVzZW50YXRpb24gb2YKKyAgICAgKiB0aGlzIG5vZGUsIHdpdGggdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgaW5kZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2IgVGhlIFN0cmluZ0J1ZmZlciB0byBhcHBlbmQgdG8KKyAgICAgKiBAcGFyYW0gaW5kZW50IE51bWJlciBvZiBjaGFyYWN0ZXJzIG9mIGluZGVudGF0aW9uCisgICAgICogQHBhcmFtIG5vZGUgVGhlIFRyZWVOb2RlIHRvIGJlIHByaW50ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWZmZXIgc2IsIGludCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZU5vZGUgbm9kZSkgeworCisgICAgICAgIGludCBpbmRlbnQyID0gaW5kZW50ICsgMjsKKworICAgICAgICAvLyBSZWNvbnN0cnVjdCBhbiBvcGVuaW5nIG5vZGUKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOworICAgICAgICBzYi5hcHBlbmQoJzwnKTsKKyAgICAgICAgc2IuYXBwZW5kKG5vZGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgSXRlcmF0b3IgbmFtZXMgPSBub2RlLmZpbmRBdHRyaWJ1dGVzKCk7CisgICAgICAgIHdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0KCk7CisgICAgICAgICAgICBzYi5hcHBlbmQobmFtZSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIj1cIiIpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbm9kZS5maW5kQXR0cmlidXRlKG5hbWUpOworICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIj5cbiIpOworCisgICAgICAgIC8vIFJlY29uc3RydWN0IHRoZSBib2R5IHRleHQgb2YgdGhpcyBub2RlIChpZiBhbnkpCisgICAgICAgIFN0cmluZyBib2R5ID0gbm9kZS5nZXRCb2R5KCk7CisgICAgICAgIGlmICgoYm9keSAhPSBudWxsKSAmJiAoYm9keS5sZW5ndGgoKSA+IDApKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDI7IGkrKykKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChib2R5KTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlY29uc3RydWN0IGNoaWxkIG5vZGVzIHdpdGggZXh0cmEgaW5kZW50YXRpb24KKyAgICAgICAgSXRlcmF0b3IgY2hpbGRyZW4gPSBub2RlLmZpbmRDaGlsZHJlbigpOworICAgICAgICB3aGlsZSAoY2hpbGRyZW4uaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBUcmVlTm9kZSBjaGlsZCA9IChUcmVlTm9kZSkgY2hpbGRyZW4ubmV4dCgpOworICAgICAgICAgICAgdG9TdHJpbmcoc2IsIGluZGVudDIsIGNoaWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlY29uc3RydWN0IGEgY2xvc2luZyBub2RlIG1hcmtlcgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKQorICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7CisgICAgICAgIHNiLmFwcGVuZCgiPC8iKTsKKyAgICAgICAgc2IuYXBwZW5kKG5vZGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCI+XG4iKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9VQ1NSZWFkZXIuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL1VDU1JlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYzU5NmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9VQ1NSZWFkZXIuamF2YQpAQCAtMCwwICsxLDMwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIueG1scGFyc2VyOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworCisvKiogCisgKiBSZWFkZXIgZm9yIFVDUy0yIGFuZCBVQ1MtNCBlbmNvZGluZ3MuCisgKiAoaS5lLiwgZW5jb2RpbmdzIGZyb20gSVNPLTEwNjQ2LVVDUy0oMnw0KSkuCisgKgorICogQGF1dGhvciBOZWlsIEdyYWhhbSwgSUJNCisgKgorICogQHZlcnNpb24gJElkJAorICovCitwdWJsaWMgY2xhc3MgVUNTUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKKworICAgIHByaXZhdGUgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFVDU1JlYWRlci5jbGFzcyApOworICAgIAorICAgIC8vCisgICAgLy8gQ29uc3RhbnRzCisgICAgLy8KKworICAgIC8qKiBEZWZhdWx0IGJ5dGUgYnVmZmVyIHNpemUgKDgxOTIsIGxhcmdlciB0aGFuIHRoYXQgb2YgQVNDSUlSZWFkZXIKKyAgICAgKiBzaW5jZSBpdCdzIHJlYXNvbmFibGUgdG8gc3VybWlzZSB0aGF0IHRoZSBhdmVyYWdlIFVDUy00LWVuY29kZWQKKyAgICAgKiBmaWxlIHNob3VsZCBiZSA0IHRpbWVzIGFzIGxhcmdlIGFzIHRoZSBhdmVyYWdlIEFTQ0lJLWVuY29kZWQgZmlsZSkuIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSA4MTkyOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBVQ1MyTEUgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgVUNTMkJFID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFVDUzRMRSA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBVQ1M0QkUgPSA4OworCisgICAgLy8KKyAgICAvLyBEYXRhCisgICAgLy8KKworICAgIC8qKiBJbnB1dCBzdHJlYW0uICovCisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKKworICAgIC8qKiBCeXRlIGJ1ZmZlci4gKi8KKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGZCdWZmZXI7CisKKyAgICAvLyB3aGF0IGtpbmQgb2YgZGF0YSB3ZSdyZSBkZWFsaW5nIHdpdGgKKyAgICBwcm90ZWN0ZWQgc2hvcnQgZkVuY29kaW5nOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RvcnMKKyAgICAvLworCisgICAgLyoqIAorICAgICAqIENvbnN0cnVjdHMgYW4gQVNDSUkgcmVhZGVyIGZyb20gdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0gCisgICAgICogdXNpbmcgdGhlIGRlZmF1bHQgYnVmZmVyIHNpemUuICBUaGUgRW5kaWFuLW5lc3MgYW5kIHdoZXRoZXIgdGhpcyBpcworICAgICAqIFVDUy0yIG9yIFVDUy00IG5lZWRzIGFsc28gdG8gYmUga25vd24gaW4gYWR2YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbSBUaGUgaW5wdXQgc3RyZWFtLgorICAgICAqIEBwYXJhbSBlbmNvZGluZyBPbmUgb2YgVUNTMkxFLCBVQ1MyQkUsIFVDUzRMRSBvciBVQ1M0QkUuCisgICAgICovCisgICAgcHVibGljIFVDU1JlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgc2hvcnQgZW5jb2RpbmcpIHsKKyAgICAgICAgdGhpcyhpbnB1dFN0cmVhbSwgREVGQVVMVF9CVUZGRVJfU0laRSwgZW5jb2RpbmcpOworICAgIH0gLy8gPGluaXQ+KElucHV0U3RyZWFtLCBzaG9ydCkKKworICAgIC8qKiAKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIEFTQ0lJIHJlYWRlciBmcm9tIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtIAorICAgICAqIGFuZCBidWZmZXIgc2l6ZS4gIFRoZSBFbmRpYW4tbmVzcyBhbmQgd2hldGhlciB0aGlzIGlzCisgICAgICogVUNTLTIgb3IgVUNTLTQgbmVlZHMgYWxzbyB0byBiZSBrbm93biBpbiBhZHZhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0U3RyZWFtIFRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHBhcmFtIHNpemUgICAgICAgIFRoZSBpbml0aWFsIGJ1ZmZlciBzaXplLgorICAgICAqIEBwYXJhbSBlbmNvZGluZyBPbmUgb2YgVUNTMkxFLCBVQ1MyQkUsIFVDUzRMRSBvciBVQ1M0QkUuCisgICAgICovCisgICAgcHVibGljIFVDU1JlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IHNpemUsIHNob3J0IGVuY29kaW5nKSB7CisgICAgICAgIGZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOworICAgICAgICBmQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgIGZFbmNvZGluZyA9IGVuY29kaW5nOworICAgIH0gLy8gPGluaXQ+KElucHV0U3RyZWFtLGludCxzaG9ydCkKKworICAgIC8vCisgICAgLy8gUmVhZGVyIG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogUmVhZCBhIHNpbmdsZSBjaGFyYWN0ZXIuICBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIGEgY2hhcmFjdGVyIGlzCisgICAgICogYXZhaWxhYmxlLCBhbiBJL08gZXJyb3Igb2NjdXJzLCBvciB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KKyAgICAgKgorICAgICAqIDxwPiBTdWJjbGFzc2VzIHRoYXQgaW50ZW5kIHRvIHN1cHBvcnQgZWZmaWNpZW50IHNpbmdsZS1jaGFyYWN0ZXIgaW5wdXQKKyAgICAgKiBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICBUaGUgY2hhcmFjdGVyIHJlYWQsIGFzIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIDAgdG8gMTI3CisgICAgICogICAgICAgICAgICAgKDx0dD4weDAwLTB4N2Y8L3R0PiksIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBoYXMKKyAgICAgKiAgICAgICAgICAgICBiZWVuIHJlYWNoZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgCisgICAgICAgIGludCBiMCA9IGZJbnB1dFN0cmVhbS5yZWFkKCkgJiAweGZmOworICAgICAgICBpZiAoYjAgPT0gMHhmZikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaW50IGIxID0gZklucHV0U3RyZWFtLnJlYWQoKSAmIDB4ZmY7CisgICAgICAgIGlmIChiMSA9PSAweGZmKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZihmRW5jb2RpbmcgPj00KSB7CisgICAgICAgICAgICBpbnQgYjIgPSBmSW5wdXRTdHJlYW0ucmVhZCgpICYgMHhmZjsKKyAgICAgICAgICAgIGlmIChiMiA9PSAweGZmKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGludCBiMyA9IGZJbnB1dFN0cmVhbS5yZWFkKCkgJiAweGZmOworICAgICAgICAgICAgaWYgKGIzID09IDB4ZmYpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiYjAgaXMgIiArIChiMCAmIDB4ZmYpICsgIiBiMSAiICsgKGIxICYgMHhmZikgKyAiIGIyICIgKyAoYjIgJiAweGZmKSArICIgYjMgIiArIChiMyAmIDB4ZmYpKTsKKyAgICAgICAgICAgIGlmIChmRW5jb2RpbmcgPT0gVUNTNEJFKQorICAgICAgICAgICAgICAgIHJldHVybiAoYjA8PDI0KSsoYjE8PDE2KSsoYjI8PDgpK2IzOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoYjM8PDI0KSsoYjI8PDE2KSsoYjE8PDgpK2IwOworICAgICAgICB9IGVsc2UgeyAvLyBVQ1MtMgorICAgICAgICAgICAgaWYgKGZFbmNvZGluZyA9PSBVQ1MyQkUpCisgICAgICAgICAgICAgICAgcmV0dXJuIChiMDw8OCkrYjE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIChiMTw8OCkrYjA7CisgICAgICAgIH0KKyAgICB9IC8vIHJlYWQoKTppbnQKKworICAgIC8qKgorICAgICAqIFJlYWQgY2hhcmFjdGVycyBpbnRvIGEgcG9ydGlvbiBvZiBhbiBhcnJheS4gIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sKKyAgICAgKiB1bnRpbCBzb21lIGlucHV0IGlzIGF2YWlsYWJsZSwgYW4gSS9PIGVycm9yIG9jY3Vycywgb3IgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiBzdHJlYW0gaXMgcmVhY2hlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIGNoICAgICBEZXN0aW5hdGlvbiBidWZmZXIKKyAgICAgKiBAcGFyYW0gICAgICBvZmZzZXQgT2Zmc2V0IGF0IHdoaWNoIHRvIHN0YXJ0IHN0b3JpbmcgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSAgICAgIGxlbmd0aCBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQKKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZQorICAgICAqICAgICAgICAgICAgIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZChjaGFyIGNoW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBieXRlTGVuZ3RoID0gbGVuZ3RoIDw8ICgoZkVuY29kaW5nID49IDQpPzI6MSk7CisgICAgICAgIGlmIChieXRlTGVuZ3RoID4gZkJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgICAgICAgIGJ5dGVMZW5ndGggPSBmQnVmZmVyLmxlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBpbnQgY291bnQgPSBmSW5wdXRTdHJlYW0ucmVhZChmQnVmZmVyLCAwLCBieXRlTGVuZ3RoKTsKKyAgICAgICAgaWYoY291bnQgPT0gLTEpIHJldHVybiAtMTsKKyAgICAgICAgLy8gdHJ5IGFuZCBtYWtlIGNvdW50IGJlIGEgbXVsdGlwbGUgb2YgdGhlIG51bWJlciBvZiBieXRlcyB3ZSdyZSBsb29raW5nIGZvcgorICAgICAgICBpZihmRW5jb2RpbmcgPj0gNCkgeyAvLyBCaWdFbmRpYW4KKyAgICAgICAgICAgIC8vIHRoaXMgbG9va3MgdWdseSwgYnV0IGl0IGF2b2lkcyBhbiBpZiBhdCBhbnkgcmF0ZS4uLgorICAgICAgICAgICAgaW50IG51bVRvUmVhZCA9ICg0IC0gKGNvdW50ICYgMykgJiAzKTsKKyAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpPG51bVRvUmVhZDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGNoYXJSZWFkID0gZklucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZihjaGFyUmVhZCA9PSAtMSkgeyAvLyBlbmQgb2YgaW5wdXQ7IHNvbWV0aGluZyBsaWtlbHkgd2VudCB3cm9uZyFBICBQYWQgYnVmZmVyIHdpdGggbnVsbHMuCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpO2o8bnVtVG9SZWFkOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyW2NvdW50K2pdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlcltjb3VudCtpXSA9IChieXRlKWNoYXJSZWFkOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3VudCArPSBudW1Ub1JlYWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgbnVtVG9SZWFkID0gY291bnQgJiAxOworICAgICAgICAgICAgaWYobnVtVG9SZWFkICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIGludCBjaGFyUmVhZCA9IGZJbnB1dFN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICAgICAgaWYoY2hhclJlYWQgPT0gLTEpIHsgLy8gZW5kIG9mIGlucHV0OyBzb21ldGhpbmcgbGlrZWx5IHdlbnQgd3JvbmchQSAgUGFkIGJ1ZmZlciB3aXRoIG51bGxzLgorICAgICAgICAgICAgICAgICAgICBmQnVmZmVyW2NvdW50XSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlcltjb3VudF0gPSAoYnl0ZSljaGFyUmVhZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBub3cgY291bnQgaXMgYSBtdWx0aXBsZSBvZiB0aGUgcmlnaHQgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgIGludCBudW1DaGFycyA9IGNvdW50ID4+ICgoZkVuY29kaW5nID49IDQpPzI6MSk7CisgICAgICAgIGludCBjdXJQb3MgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNoYXJzOyBpKyspIHsKKyAgICAgICAgICAgIGludCBiMCA9IGZCdWZmZXJbY3VyUG9zKytdICYgMHhmZjsKKyAgICAgICAgICAgIGludCBiMSA9IGZCdWZmZXJbY3VyUG9zKytdICYgMHhmZjsKKyAgICAgICAgICAgIGlmKGZFbmNvZGluZyA+PTQpIHsKKyAgICAgICAgICAgICAgICBpbnQgYjIgPSBmQnVmZmVyW2N1clBvcysrXSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgaW50IGIzID0gZkJ1ZmZlcltjdXJQb3MrK10gJiAweGZmOworICAgICAgICAgICAgICAgIGlmIChmRW5jb2RpbmcgPT0gVUNTNEJFKQorICAgICAgICAgICAgICAgICAgICBjaFtvZmZzZXQraV0gPSAoY2hhcikoKGIwPDwyNCkrKGIxPDwxNikrKGIyPDw4KStiMyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjaFtvZmZzZXQraV0gPSAoY2hhcikoKGIzPDwyNCkrKGIyPDwxNikrKGIxPDw4KStiMCk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBVQ1MtMgorICAgICAgICAgICAgICAgIGlmIChmRW5jb2RpbmcgPT0gVUNTMkJFKQorICAgICAgICAgICAgICAgICAgICBjaFtvZmZzZXQraV0gPSAoY2hhcikoKGIwPDw4KStiMSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjaFtvZmZzZXQraV0gPSAoY2hhcikoKGIxPDw4KStiMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bUNoYXJzOworICAgIH0gLy8gcmVhZChjaGFyW10saW50LGludCkKKworICAgIC8qKgorICAgICAqIFNraXAgY2hhcmFjdGVycy4gIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgc29tZSBjaGFyYWN0ZXJzIGFyZQorICAgICAqIGF2YWlsYWJsZSwgYW4gSS9PIGVycm9yIG9jY3Vycywgb3IgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIG4gIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lwCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseSBza2lwcGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBjaGFyV2lkdGggd2lsbCByZXByZXNlbnQgdGhlIG51bWJlciBvZiBiaXRzIHRvIG1vdmUKKyAgICAgICAgLy8gbiBsZWZ0d2FyZCB0byBnZXQgbnVtIG9mIGJ5dGVzIHRvIHNraXAsIGFuZCB0aGVuIG1vdmUgdGhlIHJlc3VsdCByaWdodHdhcmQKKyAgICAgICAgLy8gdG8gZ2V0IG51bSBvZiBjaGFycyBlZmZlY3RpdmVseSBza2lwcGVkLgorICAgICAgICAvLyBUaGUgdHJpY2sgd2l0aCAmJ2luZywgYXMgd2l0aCBlbHNld2hlcmUgaW4gdGhpcyBkY29kZSwgaXMKKyAgICAgICAgLy8gaW50ZW5kZWQgdG8gYXZvaWQgYW4gZXhwZW5zaXZlIHVzZSBvZiAvIHRoYXQgbWlnaHQgbm90IGJlIG9wdGltaXplZAorICAgICAgICAvLyBhd2F5LgorICAgICAgICBpbnQgY2hhcldpZHRoID0gKGZFbmNvZGluZyA+PTQpPzI6MTsKKyAgICAgICAgbG9uZyBieXRlc1NraXBwZWQgPSBmSW5wdXRTdHJlYW0uc2tpcChuPDxjaGFyV2lkdGgpOworICAgICAgICBpZigoYnl0ZXNTa2lwcGVkICYgKGNoYXJXaWR0aCB8IDEpKSA9PSAwKSByZXR1cm4gYnl0ZXNTa2lwcGVkID4+IGNoYXJXaWR0aDsKKyAgICAgICAgcmV0dXJuIChieXRlc1NraXBwZWQgPj4gY2hhcldpZHRoKSArIDE7CisgICAgfSAvLyBza2lwKGxvbmcpOmxvbmcKKworICAgIC8qKgorICAgICAqIFRlbGwgd2hldGhlciB0aGlzIHN0cmVhbSBpcyByZWFkeSB0byBiZSByZWFkLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBuZXh0IHJlYWQoKSBpcyBndWFyYW50ZWVkIG5vdCB0byBibG9jayBmb3IgaW5wdXQsCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlLiAgTm90ZSB0aGF0IHJldHVybmluZyBmYWxzZSBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUKKyAgICAgKiBuZXh0IHJlYWQgd2lsbCBibG9jay4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXJldHVybiBmYWxzZTsKKyAgICB9IC8vIHJlYWR5KCkKKworICAgIC8qKgorICAgICAqIFRlbGwgd2hldGhlciB0aGlzIHN0cmVhbSBzdXBwb3J0cyB0aGUgbWFyaygpIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgeworCXJldHVybiBmSW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpOworICAgIH0gLy8gbWFya1N1cHBvcnRlZCgpCisKKyAgICAvKioKKyAgICAgKiBNYXJrIHRoZSBwcmVzZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uICBTdWJzZXF1ZW50IGNhbGxzIHRvIHJlc2V0KCkKKyAgICAgKiB3aWxsIGF0dGVtcHQgdG8gcmVwb3NpdGlvbiB0aGUgc3RyZWFtIHRvIHRoaXMgcG9pbnQuICBOb3QgYWxsCisgICAgICogY2hhcmFjdGVyLWlucHV0IHN0cmVhbXMgc3VwcG9ydCB0aGUgbWFyaygpIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgcmVhZEFoZWFkTGltaXQgIExpbWl0IG9uIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IG1heSBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgd2hpbGUgc3RpbGwgcHJlc2VydmluZyB0aGUgbWFyay4gIEFmdGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGluZyB0aGlzIG1hbnkgY2hhcmFjdGVycywgYXR0ZW1wdGluZyB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0IHRoZSBzdHJlYW0gbWF5IGZhaWwuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IG1hcmsoKSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJZklucHV0U3RyZWFtLm1hcmsocmVhZEFoZWFkTGltaXQpOworICAgIH0gLy8gbWFyayhpbnQpCisKKyAgICAvKioKKyAgICAgKiBSZXNldCB0aGUgc3RyZWFtLiAgSWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBtYXJrZWQsIHRoZW4gYXR0ZW1wdCB0bworICAgICAqIHJlcG9zaXRpb24gaXQgYXQgdGhlIG1hcmsuICBJZiB0aGUgc3RyZWFtIGhhcyBub3QgYmVlbiBtYXJrZWQsIHRoZW4KKyAgICAgKiBhdHRlbXB0IHRvIHJlc2V0IGl0IGluIHNvbWUgd2F5IGFwcHJvcHJpYXRlIHRvIHRoZSBwYXJ0aWN1bGFyIHN0cmVhbSwKKyAgICAgKiBmb3IgZXhhbXBsZSBieSByZXBvc2l0aW9uaW5nIGl0IHRvIGl0cyBzdGFydGluZyBwb2ludC4gIE5vdCBhbGwKKyAgICAgKiBjaGFyYWN0ZXItaW5wdXQgc3RyZWFtcyBzdXBwb3J0IHRoZSByZXNldCgpIG9wZXJhdGlvbiwgYW5kIHNvbWUgc3VwcG9ydAorICAgICAqIHJlc2V0KCkgd2l0aG91dCBzdXBwb3J0aW5nIG1hcmsoKS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiB0aGUgc3RyZWFtIGhhcyBub3QgYmVlbiBtYXJrZWQsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIHRoZSBtYXJrIGhhcyBiZWVuIGludmFsaWRhdGVkLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiB0aGUgc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQgcmVzZXQoKSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmSW5wdXRTdHJlYW0ucmVzZXQoKTsKKyAgICB9IC8vIHJlc2V0KCkKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBzdHJlYW0uICBPbmNlIGEgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZCwgZnVydGhlciByZWFkKCksCisgICAgICogcmVhZHkoKSwgbWFyaygpLCBvciByZXNldCgpIGludm9jYXRpb25zIHdpbGwgdGhyb3cgYW4gSU9FeGNlcHRpb24uCisgICAgICogQ2xvc2luZyBhIHByZXZpb3VzbHktY2xvc2VkIHN0cmVhbSwgaG93ZXZlciwgaGFzIG5vIGVmZmVjdC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgIGZJbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICB9IC8vIGNsb3NlKCkKKworfSAvLyBjbGFzcyBVQ1NSZWFkZXIKZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL1VURjhSZWFkZXIuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL1VURjhSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDBhNDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvVVRGOFJlYWRlci5qYXZhCkBAIC0wLDAgKzEsNjM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci54bWxwYXJzZXI7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5VVEZEYXRhRm9ybWF0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkxvY2FsaXplcjsKKworLyoqCisgKiBAYXV0aG9yIEFuZHkgQ2xhcmssIElCTQorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqLworcHVibGljIGNsYXNzIFVURjhSZWFkZXIKKyAgICBleHRlbmRzIFJlYWRlciB7CisKKyAgICBwcml2YXRlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2c9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBVVEY4UmVhZGVyLmNsYXNzICk7CisgICAgCisgICAgLy8KKyAgICAvLyBDb25zdGFudHMKKyAgICAvLworCisgICAgLyoqIERlZmF1bHQgYnl0ZSBidWZmZXIgc2l6ZSAoMjA0OCkuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDIwNDg7CisKKyAgICAvLyBkZWJ1Z2dpbmcKKworICAgIC8qKiBEZWJ1ZyByZWFkLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfUkVBRCA9IGZhbHNlOworCisgICAgLy8KKyAgICAvLyBEYXRhCisgICAgLy8KKworICAgIC8qKiBJbnB1dCBzdHJlYW0uICovCisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKKworICAgIC8qKiBCeXRlIGJ1ZmZlci4gKi8KKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGZCdWZmZXI7CisKKyAgICAvKiogT2Zmc2V0IGludG8gYnVmZmVyLiAqLworICAgIHByb3RlY3RlZCBpbnQgZk9mZnNldDsKKworICAgIC8qKiBTdXJyb2dhdGUgY2hhcmFjdGVyLiAqLworICAgIHByaXZhdGUgaW50IGZTdXJyb2dhdGUgPSAtMTsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3JzCisgICAgLy8KKworICAgIC8qKiAKKyAgICAgKiBDb25zdHJ1Y3RzIGEgVVRGLTggcmVhZGVyIGZyb20gdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0sIAorICAgICAqIGJ1ZmZlciBzaXplIGFuZCBNZXNzYWdlRm9ybWF0dGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0U3RyZWFtIFRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHBhcmFtIHNpemUgICAgICAgIFRoZSBpbml0aWFsIGJ1ZmZlciBzaXplLgorICAgICAqLworICAgIHB1YmxpYyBVVEY4UmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBpbnQgc2l6ZSkgeworICAgICAgICBmSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKKyAgICAgICAgZkJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOworICAgIH0KKworICAgIC8vCisgICAgLy8gUmVhZGVyIG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogUmVhZCBhIHNpbmdsZSBjaGFyYWN0ZXIuICBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIGEgY2hhcmFjdGVyIGlzCisgICAgICogYXZhaWxhYmxlLCBhbiBJL08gZXJyb3Igb2NjdXJzLCBvciB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KKyAgICAgKgorICAgICAqIDxwPiBTdWJjbGFzc2VzIHRoYXQgaW50ZW5kIHRvIHN1cHBvcnQgZWZmaWNpZW50IHNpbmdsZS1jaGFyYWN0ZXIgaW5wdXQKKyAgICAgKiBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICBUaGUgY2hhcmFjdGVyIHJlYWQsIGFzIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIDAgdG8gMTYzODMKKyAgICAgKiAgICAgICAgICAgICAoPHR0PjB4MDAtMHhmZmZmPC90dD4pLCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaGFzCisgICAgICogICAgICAgICAgICAgYmVlbiByZWFjaGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gZGVjb2RlIGNoYXJhY3RlcgorICAgICAgICBpbnQgYyA9IGZTdXJyb2dhdGU7CisgICAgICAgIGlmIChmU3Vycm9nYXRlID09IC0xKSB7CisgICAgICAgICAgICAvLyBOT1RFOiBXZSB1c2UgdGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBpZiB0aGVyZSBhcmUgcmVtYWluaW5nCisgICAgICAgICAgICAvLyAgICAgICBieXRlcyBmcm9tIHRoZSBsYXN0IGJsb2NrIHJlYWQuIC1BYworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKworICAgICAgICAgICAgLy8gZ2V0IGZpcnN0IGJ5dGUKKyAgICAgICAgICAgIGludCBiMCA9IGluZGV4ID09IGZPZmZzZXQgCisgICAgICAgICAgICAgICAgICAgPyBmSW5wdXRTdHJlYW0ucmVhZCgpIDogZkJ1ZmZlcltpbmRleCsrXSAmIDB4MDBGRjsKKyAgICAgICAgICAgIGlmIChiMCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVVRGLTg6ICAgWzB4eHggeHh4eF0KKyAgICAgICAgICAgIC8vIFVuaWNvZGU6IFswMDAwIDAwMDBdIFsweHh4IHh4eHhdCisgICAgICAgICAgICBpZiAoYjAgPCAweDgwKSB7CisgICAgICAgICAgICAgICAgYyA9IChjaGFyKWIwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVVEYtODogICBbMTEweSB5eXl5XSBbMTB4eCB4eHh4XQorICAgICAgICAgICAgLy8gVW5pY29kZTogWzAwMDAgMHl5eV0gW3l5eHggeHh4eF0KKyAgICAgICAgICAgIGVsc2UgaWYgKChiMCAmIDB4RTApID09IDB4QzApIHsKKyAgICAgICAgICAgICAgICBpbnQgYjEgPSBpbmRleCA9PSBmT2Zmc2V0IAorICAgICAgICAgICAgICAgICAgICAgICA/IGZJbnB1dFN0cmVhbS5yZWFkKCkgOiBmQnVmZmVyW2luZGV4KytdICYgMHgwMEZGOworICAgICAgICAgICAgICAgIGlmIChiMSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ5dGUoMiwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoYjEgJiAweEMwKSAhPSAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRCeXRlKDIsIDIsIGIxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYyA9ICgoYjAgPDwgNikgJiAweDA3QzApIHwgKGIxICYgMHgwMDNGKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVVRGLTg6ICAgWzExMTAgenp6el0gWzEweXkgeXl5eV0gWzEweHggeHh4eF0KKyAgICAgICAgICAgIC8vIFVuaWNvZGU6IFt6enp6IHl5eXldIFt5eXh4IHh4eHhdCisgICAgICAgICAgICBlbHNlIGlmICgoYjAgJiAweEYwKSA9PSAweEUwKSB7CisgICAgICAgICAgICAgICAgaW50IGIxID0gaW5kZXggPT0gZk9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICA/IGZJbnB1dFN0cmVhbS5yZWFkKCkgOiBmQnVmZmVyW2luZGV4KytdICYgMHgwMEZGOworICAgICAgICAgICAgICAgIGlmIChiMSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ5dGUoMiwgMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoYjEgJiAweEMwKSAhPSAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRCeXRlKDIsIDMsIGIxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGIyID0gaW5kZXggPT0gZk9mZnNldCAKKyAgICAgICAgICAgICAgICAgICAgICAgPyBmSW5wdXRTdHJlYW0ucmVhZCgpIDogZkJ1ZmZlcltpbmRleCsrXSAmIDB4MDBGRjsKKyAgICAgICAgICAgICAgICBpZiAoYjIgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCeXRlKDMsIDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGIyICYgMHhDMCkgIT0gMHg4MCkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkQnl0ZSgzLCAzLCBiMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGMgPSAoKGIwIDw8IDEyKSAmIDB4RjAwMCkgfCAoKGIxIDw8IDYpICYgMHgwRkMwKSB8CisgICAgICAgICAgICAgICAgICAgIChiMiAmIDB4MDAzRik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVURi04OiAgIFsxMTExIDB1dXVdIFsxMHV1IHp6enpdIFsxMHl5IHl5eXldIFsxMHh4IHh4eHhdKgorICAgICAgICAgICAgLy8gVW5pY29kZTogWzExMDEgMTB3d10gW3d3enogenp5eV0gKGhpZ2ggc3Vycm9nYXRlKQorICAgICAgICAgICAgLy8gICAgICAgICAgWzExMDEgMTF5eV0gW3l5eHggeHh4eF0gKGxvdyBzdXJyb2dhdGUpCisgICAgICAgICAgICAvLyAgICAgICAgICAqIHV1dXV1ID0gd3d3dyArIDEKKyAgICAgICAgICAgIGVsc2UgaWYgKChiMCAmIDB4RjgpID09IDB4RjApIHsKKyAgICAgICAgICAgICAgICBpbnQgYjEgPSBpbmRleCA9PSBmT2Zmc2V0IAorICAgICAgICAgICAgICAgICAgICAgICA/IGZJbnB1dFN0cmVhbS5yZWFkKCkgOiBmQnVmZmVyW2luZGV4KytdICYgMHgwMEZGOworICAgICAgICAgICAgICAgIGlmIChiMSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ5dGUoMiwgNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoYjEgJiAweEMwKSAhPSAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRCeXRlKDIsIDMsIGIxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGIyID0gaW5kZXggPT0gZk9mZnNldCAKKyAgICAgICAgICAgICAgICAgICAgICAgPyBmSW5wdXRTdHJlYW0ucmVhZCgpIDogZkJ1ZmZlcltpbmRleCsrXSAmIDB4MDBGRjsKKyAgICAgICAgICAgICAgICBpZiAoYjIgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCeXRlKDMsIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGIyICYgMHhDMCkgIT0gMHg4MCkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkQnl0ZSgzLCAzLCBiMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBiMyA9IGluZGV4ID09IGZPZmZzZXQgCisgICAgICAgICAgICAgICAgICAgICAgID8gZklucHV0U3RyZWFtLnJlYWQoKSA6IGZCdWZmZXJbaW5kZXgrK10gJiAweDAwRkY7CisgICAgICAgICAgICAgICAgaWYgKGIzID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQnl0ZSg0LCA0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChiMyAmIDB4QzApICE9IDB4ODApIHsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZEJ5dGUoNCwgNCwgYjMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgdXV1dXUgPSAoKGIwIDw8IDIpICYgMHgwMDFDKSB8ICgoYjEgPj4gNCkgJiAweDAwMDMpOworICAgICAgICAgICAgICAgIGlmICh1dXV1dSA+IDB4MTApIHsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZFN1cnJvZ2F0ZSh1dXV1dSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCB3d3d3ID0gdXV1dXUgLSAxOworICAgICAgICAgICAgICAgIGludCBocyA9IDB4RDgwMCB8IAorICAgICAgICAgICAgICAgICAgICAgICAgICgod3d3dyA8PCA2KSAmIDB4MDNDMCkgfCAoKGIxIDw8IDIpICYgMHgwMDNDKSB8IAorICAgICAgICAgICAgICAgICAgICAgICAgICgoYjIgPj4gNCkgJiAweDAwMDMpOworICAgICAgICAgICAgICAgIGludCBscyA9IDB4REMwMCB8ICgoYjIgPDwgNikgJiAweDAzQzApIHwgKGIzICYgMHgwMDNGKTsKKyAgICAgICAgICAgICAgICBjID0gaHM7CisgICAgICAgICAgICAgICAgZlN1cnJvZ2F0ZSA9IGxzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBlcnJvcgorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW52YWxpZEJ5dGUoMSwgMSwgYjApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIHN1cnJvZ2F0ZQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZTdXJyb2dhdGUgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJldHVybiBjaGFyYWN0ZXIKKyAgICAgICAgaWYgKERFQlVHX1JFQUQpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoInJlYWQoKTogMHgiK0ludGVnZXIudG9IZXhTdHJpbmcoYykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjOworCisgICAgfSAvLyByZWFkKCk6aW50CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGNoYXJhY3RlcnMgaW50byBhIHBvcnRpb24gb2YgYW4gYXJyYXkuICBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrCisgICAgICogdW50aWwgc29tZSBpbnB1dCBpcyBhdmFpbGFibGUsIGFuIEkvTyBlcnJvciBvY2N1cnMsIG9yIHRoZSBlbmQgb2YgdGhlCisgICAgICogc3RyZWFtIGlzIHJlYWNoZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBjaCAgICAgRGVzdGluYXRpb24gYnVmZmVyCisgICAgICogQHBhcmFtICAgICAgb2Zmc2V0IE9mZnNldCBhdCB3aGljaCB0byBzdGFydCBzdG9yaW5nIGNoYXJhY3RlcnMKKyAgICAgKiBAcGFyYW0gICAgICBsZW5ndGggTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCwgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoY2hhciBjaFtdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIGhhbmRsZSBzdXJyb2dhdGUKKyAgICAgICAgaW50IG91dCA9IG9mZnNldDsKKyAgICAgICAgaWYgKGZTdXJyb2dhdGUgIT0gLTEpIHsKKyAgICAgICAgICAgIGNoW29mZnNldCArIDFdID0gKGNoYXIpZlN1cnJvZ2F0ZTsKKyAgICAgICAgICAgIGZTdXJyb2dhdGUgPSAtMTsKKyAgICAgICAgICAgIGxlbmd0aC0tOworICAgICAgICAgICAgb3V0Kys7CisgICAgICAgIH0KKworICAgICAgICAvLyByZWFkIGJ5dGVzCisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGlmIChmT2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIC8vIGFkanVzdCBsZW5ndGggdG8gcmVhZAorICAgICAgICAgICAgaWYgKGxlbmd0aCA+IGZCdWZmZXIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gZkJ1ZmZlci5sZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHBlcmZvcm0gcmVhZCBvcGVyYXRpb24KKyAgICAgICAgICAgIGNvdW50ID0gZklucHV0U3RyZWFtLnJlYWQoZkJ1ZmZlciwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvdW50ICs9IG91dCAtIG9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNraXAgcmVhZDsgbGFzdCBjaGFyYWN0ZXIgd2FzIGluIGVycm9yCisgICAgICAgIC8vIE5PVEU6IEhhdmluZyBhbiBvZmZzZXQgdmFsdWUgb3RoZXIgdGhhbiB6ZXJvIG1lYW5zIHRoYXQgdGhlcmUgd2FzCisgICAgICAgIC8vICAgICAgIGFuIGVycm9yIGluIHRoZSBsYXN0IGNoYXJhY3RlciByZWFkLiBJbiB0aGlzIGNhc2UsIHdlIGhhdmUKKyAgICAgICAgLy8gICAgICAgc2tpcHBlZCB0aGUgcmVhZCBzbyB3ZSBkb24ndCBjb25zdW1lIGFueSBieXRlcyBwYXN0IHRoZSAKKyAgICAgICAgLy8gICAgICAgZXJyb3IuIEJ5IHNpZ25hbGxpbmcgdGhlIGVycm9yIG9uIHRoZSBuZXh0IGJsb2NrIHJlYWQgd2UKKyAgICAgICAgLy8gICAgICAgYWxsb3cgdGhlIG1ldGhvZCB0byByZXR1cm4gdGhlIG1vc3QgdmFsaWQgY2hhcmFjdGVycyB0aGF0CisgICAgICAgIC8vICAgICAgIGl0IGNhbiBvbiB0aGUgcHJldmlvdXMgYmxvY2sgcmVhZC4gLUFjCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY291bnQgPSBmT2Zmc2V0OworICAgICAgICAgICAgZk9mZnNldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb252ZXJ0IGJ5dGVzIHRvIGNoYXJhY3RlcnMKKyAgICAgICAgZmluYWwgaW50IHRvdGFsID0gY291bnQ7CisgICAgICAgIGZvciAoaW50IGluID0gMDsgaW4gPCB0b3RhbDsgaW4rKykgeworICAgICAgICAgICAgaW50IGIwID0gZkJ1ZmZlcltpbl0gJiAweDAwRkY7CisKKyAgICAgICAgICAgIC8vIFVURi04OiAgIFsweHh4IHh4eHhdCisgICAgICAgICAgICAvLyBVbmljb2RlOiBbMDAwMCAwMDAwXSBbMHh4eCB4eHh4XQorICAgICAgICAgICAgaWYgKGIwIDwgMHg4MCkgeworICAgICAgICAgICAgICAgIGNoW291dCsrXSA9IChjaGFyKWIwOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVVEYtODogICBbMTEweSB5eXl5XSBbMTB4eCB4eHh4XQorICAgICAgICAgICAgLy8gVW5pY29kZTogWzAwMDAgMHl5eV0gW3l5eHggeHh4eF0KKyAgICAgICAgICAgIGlmICgoYjAgJiAweEUwKSA9PSAweEMwKSB7CisgICAgICAgICAgICAgICAgaW50IGIxID0gLTE7CisgICAgICAgICAgICAgICAgaWYgKCsraW4gPCB0b3RhbCkgeyAKKyAgICAgICAgICAgICAgICAgICAgYjEgPSBmQnVmZmVyW2luXSAmIDB4MDBGRjsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiMSA9IGZJbnB1dFN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiMSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dCA+IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZCdWZmZXJbMF0gPSAoYnl0ZSliMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmT2Zmc2V0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0IC0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCeXRlKDIsIDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoYjEgJiAweEMwKSAhPSAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXQgPiBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZCdWZmZXJbMF0gPSAoYnl0ZSliMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZCdWZmZXJbMV0gPSAoYnl0ZSliMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZPZmZzZXQgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dCAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnZhbGlkQnl0ZSgyLCAyLCBiMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBjID0gKChiMCA8PCA2KSAmIDB4MDdDMCkgfCAoYjEgJiAweDAwM0YpOworICAgICAgICAgICAgICAgIGNoW291dCsrXSA9IChjaGFyKWM7CisgICAgICAgICAgICAgICAgY291bnQgLT0gMTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVVRGLTg6ICAgWzExMTAgenp6el0gWzEweXkgeXl5eV0gWzEweHggeHh4eF0KKyAgICAgICAgICAgIC8vIFVuaWNvZGU6IFt6enp6IHl5eXldIFt5eXh4IHh4eHhdCisgICAgICAgICAgICBpZiAoKGIwICYgMHhGMCkgPT0gMHhFMCkgeworICAgICAgICAgICAgICAgIGludCBiMSA9IC0xOworICAgICAgICAgICAgICAgIGlmICgrK2luIDwgdG90YWwpIHsgCisgICAgICAgICAgICAgICAgICAgIGIxID0gZkJ1ZmZlcltpbl0gJiAweDAwRkY7IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYjEgPSBmSW5wdXRTdHJlYW0ucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYjEgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXQgPiBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyWzBdID0gKGJ5dGUpYjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk9mZnNldCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dCAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQnl0ZSgyLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGIxICYgMHhDMCkgIT0gMHg4MCkgeworICAgICAgICAgICAgICAgICAgICBpZiAob3V0ID4gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyWzBdID0gKGJ5dGUpYjA7CisgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyWzFdID0gKGJ5dGUpYjE7CisgICAgICAgICAgICAgICAgICAgICAgICBmT2Zmc2V0ID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXQgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZEJ5dGUoMiwgMywgYjEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgYjIgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoKytpbiA8IHRvdGFsKSB7IAorICAgICAgICAgICAgICAgICAgICBiMiA9IGZCdWZmZXJbaW5dICYgMHgwMEZGOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGIyID0gZklucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGIyID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0ID4gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclswXSA9IChieXRlKWIwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZCdWZmZXJbMV0gPSAoYnl0ZSliMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmT2Zmc2V0ID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0IC0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCeXRlKDMsIDMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoYjIgJiAweEMwKSAhPSAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXQgPiBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZCdWZmZXJbMF0gPSAoYnl0ZSliMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZCdWZmZXJbMV0gPSAoYnl0ZSliMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZCdWZmZXJbMl0gPSAoYnl0ZSliMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZPZmZzZXQgPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dCAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnZhbGlkQnl0ZSgzLCAzLCBiMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBjID0gKChiMCA8PCAxMikgJiAweEYwMDApIHwgKChiMSA8PCA2KSAmIDB4MEZDMCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgKGIyICYgMHgwMDNGKTsKKyAgICAgICAgICAgICAgICBjaFtvdXQrK10gPSAoY2hhciljOworICAgICAgICAgICAgICAgIGNvdW50IC09IDI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVURi04OiAgIFsxMTExIDB1dXVdIFsxMHV1IHp6enpdIFsxMHl5IHl5eXldIFsxMHh4IHh4eHhdKgorICAgICAgICAgICAgLy8gVW5pY29kZTogWzExMDEgMTB3d10gW3d3enogenp5eV0gKGhpZ2ggc3Vycm9nYXRlKQorICAgICAgICAgICAgLy8gICAgICAgICAgWzExMDEgMTF5eV0gW3l5eHggeHh4eF0gKGxvdyBzdXJyb2dhdGUpCisgICAgICAgICAgICAvLyAgICAgICAgICAqIHV1dXV1ID0gd3d3dyArIDEKKyAgICAgICAgICAgIGlmICgoYjAgJiAweEY4KSA9PSAweEYwKSB7CisgICAgICAgICAgICAgICAgaW50IGIxID0gLTE7CisgICAgICAgICAgICAgICAgaWYgKCsraW4gPCB0b3RhbCkgeyAKKyAgICAgICAgICAgICAgICAgICAgYjEgPSBmQnVmZmVyW2luXSAmIDB4MDBGRjsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiMSA9IGZJbnB1dFN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiMSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dCA+IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZCdWZmZXJbMF0gPSAoYnl0ZSliMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmT2Zmc2V0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0IC0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCeXRlKDIsIDQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoYjEgJiAweEMwKSAhPSAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXQgPiBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZCdWZmZXJbMF0gPSAoYnl0ZSliMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZCdWZmZXJbMV0gPSAoYnl0ZSliMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZPZmZzZXQgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dCAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnZhbGlkQnl0ZSgyLCA0LCBiMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBiMiA9IC0xOworICAgICAgICAgICAgICAgIGlmICgrK2luIDwgdG90YWwpIHsgCisgICAgICAgICAgICAgICAgICAgIGIyID0gZkJ1ZmZlcltpbl0gJiAweDAwRkY7IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYjIgPSBmSW5wdXRTdHJlYW0ucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYjIgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXQgPiBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyWzBdID0gKGJ5dGUpYjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclsxXSA9IChieXRlKWIxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZPZmZzZXQgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXQgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ5dGUoMywgNCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChiMiAmIDB4QzApICE9IDB4ODApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dCA+IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclswXSA9IChieXRlKWIwOworICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclsxXSA9IChieXRlKWIxOworICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclsyXSA9IChieXRlKWIyOworICAgICAgICAgICAgICAgICAgICAgICAgZk9mZnNldCA9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0IC0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRCeXRlKDMsIDQsIGIyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGIzID0gLTE7CisgICAgICAgICAgICAgICAgaWYgKCsraW4gPCB0b3RhbCkgeyAKKyAgICAgICAgICAgICAgICAgICAgYjMgPSBmQnVmZmVyW2luXSAmIDB4MDBGRjsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiMyA9IGZJbnB1dFN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiMyA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dCA+IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZCdWZmZXJbMF0gPSAoYnl0ZSliMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyWzFdID0gKGJ5dGUpYjE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclsyXSA9IChieXRlKWIyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZPZmZzZXQgPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXQgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ5dGUoNCwgNCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChiMyAmIDB4QzApICE9IDB4ODApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dCA+IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclswXSA9IChieXRlKWIwOworICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclsxXSA9IChieXRlKWIxOworICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclsyXSA9IChieXRlKWIyOworICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclszXSA9IChieXRlKWIzOworICAgICAgICAgICAgICAgICAgICAgICAgZk9mZnNldCA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0IC0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRCeXRlKDQsIDQsIGIyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBkZWNvZGUgYnl0ZXMgaW50byBzdXJyb2dhdGUgY2hhcmFjdGVycworICAgICAgICAgICAgICAgIGludCB1dXV1dSA9ICgoYjAgPDwgMikgJiAweDAwMUMpIHwgKChiMSA+PiA0KSAmIDB4MDAwMyk7CisgICAgICAgICAgICAgICAgaWYgKHV1dXV1ID4gMHgxMCkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkU3Vycm9nYXRlKHV1dXV1KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IHd3d3cgPSB1dXV1dSAtIDE7CisgICAgICAgICAgICAgICAgaW50IHp6enogPSBiMSAmIDB4MDAwRjsKKyAgICAgICAgICAgICAgICBpbnQgeXl5eXl5ID0gYjIgJiAweDAwM0Y7CisgICAgICAgICAgICAgICAgaW50IHh4eHh4eCA9IGIzICYgMHgwMDNGOworICAgICAgICAgICAgICAgIGludCBocyA9IDB4RDgwMCB8ICgod3d3dyA8PCA2KSAmIDB4MDNDMCkgfCAoenp6eiA8PCAyKSB8ICh5eXl5eXkgPj4gNCk7CisgICAgICAgICAgICAgICAgaW50IGxzID0gMHhEQzAwIHwgKCh5eXl5eXkgPDwgNikgJiAweDAzQzApIHwgeHh4eHh4OworCisgICAgICAgICAgICAgICAgLy8gc2V0IGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAgICBjaFtvdXQrK10gPSAoY2hhciloczsKKyAgICAgICAgICAgICAgICBjaFtvdXQrK10gPSAoY2hhcilsczsKKyAgICAgICAgICAgICAgICBjb3VudCAtPSAyOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBlcnJvcgorICAgICAgICAgICAgaWYgKG91dCA+IG9mZnNldCkgeworICAgICAgICAgICAgICAgIGZCdWZmZXJbMF0gPSAoYnl0ZSliMDsKKyAgICAgICAgICAgICAgICBmT2Zmc2V0ID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3V0IC0gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW52YWxpZEJ5dGUoMSwgMSwgYjApOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvbnZlcnRlZAorICAgICAgICBpZiAoREVCVUdfUkVBRCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygicmVhZChjaGFyW10sIitvZmZzZXQrJywnK2xlbmd0aCsiKTogY291bnQ9Iitjb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworCisgICAgfSAvLyByZWFkKGNoYXJbXSxpbnQsaW50KQorCisgICAgLyoqCisgICAgICogU2tpcCBjaGFyYWN0ZXJzLiAgVGhpcyBtZXRob2Qgd2lsbCBibG9jayB1bnRpbCBzb21lIGNoYXJhY3RlcnMgYXJlCisgICAgICogYXZhaWxhYmxlLCBhbiBJL08gZXJyb3Igb2NjdXJzLCBvciB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgbiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAKKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IHNraXBwZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgbG9uZyByZW1haW5pbmcgPSBuOworICAgICAgICBmaW5hbCBjaGFyW10gY2ggPSBuZXcgY2hhcltmQnVmZmVyLmxlbmd0aF07CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBjaC5sZW5ndGggPCByZW1haW5pbmcgPyBjaC5sZW5ndGggOiAoaW50KXJlbWFpbmluZzsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHJlYWQoY2gsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IGNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHJlbWFpbmluZyA+IDApOworCisgICAgICAgIGxvbmcgc2tpcHBlZCA9IG4gLSByZW1haW5pbmc7CisgICAgICAgIHJldHVybiBza2lwcGVkOworCisgICAgfSAvLyBza2lwKGxvbmcpOmxvbmcKKworICAgIC8qKgorICAgICAqIFRlbGwgd2hldGhlciB0aGlzIHN0cmVhbSBpcyByZWFkeSB0byBiZSByZWFkLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBuZXh0IHJlYWQoKSBpcyBndWFyYW50ZWVkIG5vdCB0byBibG9jayBmb3IgaW5wdXQsCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlLiAgTm90ZSB0aGF0IHJldHVybmluZyBmYWxzZSBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUKKyAgICAgKiBuZXh0IHJlYWQgd2lsbCBibG9jay4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCSAgICByZXR1cm4gZmFsc2U7CisgICAgfSAvLyByZWFkeSgpCisKKyAgICAvKioKKyAgICAgKiBUZWxsIHdoZXRoZXIgdGhpcyBzdHJlYW0gc3VwcG9ydHMgdGhlIG1hcmsoKSBvcGVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKKwkgICAgcmV0dXJuIGZhbHNlOworICAgIH0gLy8gbWFya1N1cHBvcnRlZCgpCisKKyAgICAvKioKKyAgICAgKiBNYXJrIHRoZSBwcmVzZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uICBTdWJzZXF1ZW50IGNhbGxzIHRvIHJlc2V0KCkKKyAgICAgKiB3aWxsIGF0dGVtcHQgdG8gcmVwb3NpdGlvbiB0aGUgc3RyZWFtIHRvIHRoaXMgcG9pbnQuICBOb3QgYWxsCisgICAgICogY2hhcmFjdGVyLWlucHV0IHN0cmVhbXMgc3VwcG9ydCB0aGUgbWFyaygpIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgcmVhZEFoZWFkTGltaXQgIExpbWl0IG9uIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IG1heSBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgd2hpbGUgc3RpbGwgcHJlc2VydmluZyB0aGUgbWFyay4gIEFmdGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGluZyB0aGlzIG1hbnkgY2hhcmFjdGVycywgYXR0ZW1wdGluZyB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0IHRoZSBzdHJlYW0gbWF5IGZhaWwuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IG1hcmsoKSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IueG1sLm9wZXJhdGlvbk5vdFN1cHBvcnRlZCIsCisJCQkJICAgICAibWFyaygpIiwgIlVURi04IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc2V0IHRoZSBzdHJlYW0uICBJZiB0aGUgc3RyZWFtIGhhcyBiZWVuIG1hcmtlZCwgdGhlbiBhdHRlbXB0IHRvCisgICAgICogcmVwb3NpdGlvbiBpdCBhdCB0aGUgbWFyay4gIElmIHRoZSBzdHJlYW0gaGFzIG5vdCBiZWVuIG1hcmtlZCwgdGhlbgorICAgICAqIGF0dGVtcHQgdG8gcmVzZXQgaXQgaW4gc29tZSB3YXkgYXBwcm9wcmlhdGUgdG8gdGhlIHBhcnRpY3VsYXIgc3RyZWFtLAorICAgICAqIGZvciBleGFtcGxlIGJ5IHJlcG9zaXRpb25pbmcgaXQgdG8gaXRzIHN0YXJ0aW5nIHBvaW50LiAgTm90IGFsbAorICAgICAqIGNoYXJhY3Rlci1pbnB1dCBzdHJlYW1zIHN1cHBvcnQgdGhlIHJlc2V0KCkgb3BlcmF0aW9uLCBhbmQgc29tZSBzdXBwb3J0CisgICAgICogcmVzZXQoKSB3aXRob3V0IHN1cHBvcnRpbmcgbWFyaygpLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIElmIHRoZSBzdHJlYW0gaGFzIG5vdCBiZWVuIG1hcmtlZCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgdGhlIG1hcmsgaGFzIGJlZW4gaW52YWxpZGF0ZWQsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIHRoZSBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCByZXNldCgpLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiBzb21lIG90aGVyIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZPZmZzZXQgPSAwOworICAgICAgICBmU3Vycm9nYXRlID0gLTE7CisgICAgfSAvLyByZXNldCgpCisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgc3RyZWFtLiAgT25jZSBhIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQsIGZ1cnRoZXIgcmVhZCgpLAorICAgICAqIHJlYWR5KCksIG1hcmsoKSwgb3IgcmVzZXQoKSBpbnZvY2F0aW9ucyB3aWxsIHRocm93IGFuIElPRXhjZXB0aW9uLgorICAgICAqIENsb3NpbmcgYSBwcmV2aW91c2x5LWNsb3NlZCBzdHJlYW0sIGhvd2V2ZXIsIGhhcyBubyBlZmZlY3QuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZklucHV0U3RyZWFtLmNsb3NlKCk7CisgICAgfSAvLyBjbG9zZSgpCisKKyAgICAvLworICAgIC8vIFByaXZhdGUgbWV0aG9kcworICAgIC8vCisKKyAgICAvKiogVGhyb3dzIGFuIGV4Y2VwdGlvbiBmb3IgZXhwZWN0ZWQgYnl0ZS4gKi8KKyAgICBwcml2YXRlIHZvaWQgZXhwZWN0ZWRCeXRlKGludCBwb3NpdGlvbiwgaW50IGNvdW50KQorICAgICAgICB0aHJvd3MgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbiB7CisKKyAgICAgICAgdGhyb3cgbmV3IFVURkRhdGFGb3JtYXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci54bWwuZXhwZWN0ZWRCeXRlIiwKKwkJCQkgICAgIEludGVnZXIudG9TdHJpbmcocG9zaXRpb24pLAorCQkJCSAgICAgSW50ZWdlci50b1N0cmluZyhjb3VudCkpKTsKKworICAgIH0gLy8gZXhwZWN0ZWRCeXRlKGludCxpbnQsaW50KQorCisgICAgLyoqIFRocm93cyBhbiBleGNlcHRpb24gZm9yIGludmFsaWQgYnl0ZS4gKi8KKyAgICBwcml2YXRlIHZvaWQgaW52YWxpZEJ5dGUoaW50IHBvc2l0aW9uLCBpbnQgY291bnQsIGludCBjKSAKKyAgICAgICAgdGhyb3dzIFVURkRhdGFGb3JtYXRFeGNlcHRpb24geworCisgICAgICAgIHRocm93IG5ldyBVVEZEYXRhRm9ybWF0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IueG1sLmludmFsaWRCeXRlIiwKKwkJCQkgICAgIEludGVnZXIudG9TdHJpbmcocG9zaXRpb24pLAorCQkJCSAgICAgSW50ZWdlci50b1N0cmluZyhjb3VudCkpKTsKKyAgICB9IC8vIGludmFsaWRCeXRlKGludCxpbnQsaW50LGludCkKKworICAgIC8qKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGZvciBpbnZhbGlkIHN1cnJvZ2F0ZSBiaXRzLiAqLworICAgIHByaXZhdGUgdm9pZCBpbnZhbGlkU3Vycm9nYXRlKGludCB1dXV1dSkgdGhyb3dzIFVURkRhdGFGb3JtYXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgdGhyb3cgbmV3IFVURkRhdGFGb3JtYXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci54bWwuaW52YWxpZEhpZ2hTdXJyb2dhdGUiLAorCQkJCSAgICAgSW50ZWdlci50b0hleFN0cmluZyh1dXV1dSkpKTsKKyAgICB9IC8vIGludmFsaWRTdXJyb2dhdGUoaW50KQorCit9IC8vIGNsYXNzIFVURjhSZWFkZXIKZGlmZiAtLWdpdCBhL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL1hNTENoYXIuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL1hNTENoYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTAyMmVjCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvWE1MQ2hhci5qYXZhCkBAIC0wLDAgKzEsMTAzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCisgKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgSW50ZXJuYXRpb25hbAorICogQnVzaW5lc3MgTWFjaGluZXMsIEluYy4sIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBiYXNpYyBYTUwgY2hhcmFjdGVyIHByb3BlcnRpZXMuIFRoZSBkYXRhCisgKiBpbiB0aGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IGEgY2hhcmFjdGVyIGlzIGEgdmFsaWQKKyAqIFhNTCBjaGFyYWN0ZXIgb3IgaWYgdGhlIGNoYXJhY3RlciBpcyBhIHNwYWNlLCBuYW1lIHN0YXJ0LCBvciBuYW1lCisgKiBjaGFyYWN0ZXIuCisgKiA8cD4KKyAqIEEgc2VyaWVzIG9mIGNvbnZlbmllbmNlIG1ldGhvZHMgYXJlIHN1cHBsaWVkIHRvIGVhc2UgdGhlIGJ1cmRlbgorICogb2YgdGhlIGRldmVsb3Blci4gQmVjYXVzZSBpbmxpbmluZyB0aGUgY2hlY2tzIGNhbiBpbXByb3ZlIHBlcgorICogY2hhcmFjdGVyIHBlcmZvcm1hbmNlLCB0aGUgdGFibGVzIG9mIGNoYXJhY3RlciBwcm9wZXJ0aWVzIGFyZQorICogcHVibGljLiBVc2luZyB0aGUgY2hhcmFjdGVyIGFzIGFuIGluZGV4IGludG8gdGhlIDxjb2RlPkNIQVJTPC9jb2RlPgorICogYXJyYXkgYW5kIGFwcGx5aW5nIHRoZSBhcHByb3ByaWF0ZSBtYXNrIGZsYWcgKGUuZy4KKyAqIDxjb2RlPk1BU0tfVkFMSUQ8L2NvZGU+KSwgeWllbGRzIHRoZSBzYW1lIHJlc3VsdHMgYXMgY2FsbGluZyB0aGUKKyAqIGNvbnZlbmllbmNlIG1ldGhvZHMuIFRoZXJlIGlzIG9uZSBleGNlcHRpb246IGNoZWNrIHRoZSBjb21tZW50cworICogZm9yIHRoZSA8Y29kZT5pc1ZhbGlkPC9jb2RlPiBtZXRob2QgZm9yIGRldGFpbHMuCisgKgorICogQGF1dGhvciBHbGVubiBNYXJjeSwgSUJNCisgKiBAYXV0aG9yIEFuZHkgQ2xhcmssIElCTQorICogQGF1dGhvciBFcmljIFllLCBJQk0KKyAqIEBhdXRob3IgQXJuYXVkICBMZSBIb3JzLCBJQk0KKyAqIEBhdXRob3IgTWljaGFlbCBHbGF2YXNzZXZpY2gsIElCTQorICogQGF1dGhvciBSYWh1bCBTcml2YXN0YXZhLCBTdW4gTWljcm9zeXN0ZW1zIEluYy4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxDaGFyIHsKKworICAgIC8vCisgICAgLy8gQ29uc3RhbnRzCisgICAgLy8KKworICAgIC8qKiBDaGFyYWN0ZXIgZmxhZ3MuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIENIQVJTID0gbmV3IGJ5dGVbMSA8PCAxNl07CisKKyAgICAvKiogVmFsaWQgY2hhcmFjdGVyIG1hc2suICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19WQUxJRCA9IDB4MDE7CisKKyAgICAvKiogU3BhY2UgY2hhcmFjdGVyIG1hc2suICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19TUEFDRSA9IDB4MDI7CisKKyAgICAvKiogTmFtZSBzdGFydCBjaGFyYWN0ZXIgbWFzay4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX05BTUVfU1RBUlQgPSAweDA0OworCisgICAgLyoqIE5hbWUgY2hhcmFjdGVyIG1hc2suICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19OQU1FID0gMHgwODsKKworICAgIC8qKiBQdWJpZCBjaGFyYWN0ZXIgbWFzay4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX1BVQklEID0gMHgxMDsKKyAgICAKKyAgICAvKiogCisgICAgICogQ29udGVudCBjaGFyYWN0ZXIgbWFzay4gU3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSB0aG9zZSB0aGF0IGNhbgorICAgICAqIGJlIGNvbnNpZGVyZWQgdGhlIHN0YXJ0IG9mIG1hcmt1cCwgc3VjaCBhcyAnJmx0OycgYW5kICcmYW1wOycuIAorICAgICAqIFRoZSB2YXJpb3VzIG5ld2xpbmUgY2hhcmFjdGVycyBhcmUgY29uc2lkZXJlZCBzcGVjaWFsIGFzIHdlbGwuCisgICAgICogQWxsIG90aGVyIHZhbGlkIFhNTCBjaGFyYWN0ZXJzIGNhbiBiZSBjb25zaWRlcmVkIGNvbnRlbnQuCisgICAgICogPHA+CisgICAgICogVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gZm9yIHRoZSBpbm5lciBsb29wIG9mIGNoYXJhY3RlciBzY2FubmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX0NPTlRFTlQgPSAweDIwOworCisgICAgLyoqIE5DTmFtZSBzdGFydCBjaGFyYWN0ZXIgbWFzay4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX05DTkFNRV9TVEFSVCA9IDB4NDA7CisKKyAgICAvKiogTkNOYW1lIGNoYXJhY3RlciBtYXNrLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfTkNOQU1FID0gMHg4MDsKKworICAgIC8vCisgICAgLy8gU3RhdGljIGluaXRpYWxpemF0aW9uCisgICAgLy8KKworICAgIHN0YXRpYyB7CisgICAgICAgIAorICAgICAgICAvLyBJbml0aWFsaXppbmcgdGhlIENoYXJhY3RlciBGbGFnIEFycmF5CisgICAgICAgIC8vIENvZGUgZ2VuZXJhdGVkIGJ5OiBYTUxDaGFyR2VuZXJhdG9yLgorICAgICAgICAKKyAgICAgICAgQ0hBUlNbOV0gPSAzNTsKKyAgICAgICAgQ0hBUlNbMTBdID0gMTk7CisgICAgICAgIENIQVJTWzEzXSA9IDE5OworICAgICAgICBDSEFSU1szMl0gPSA1MTsKKyAgICAgICAgQ0hBUlNbMzNdID0gNDk7CisgICAgICAgIENIQVJTWzM0XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzUsIDM4LCAoYnl0ZSkgNDkgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSA0OQorICAgICAgICBDSEFSU1szOF0gPSAxOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzksIDQ1LCAoYnl0ZSkgNDkgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSA0OQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDUsIDQ3LCAoYnl0ZSkgLTcxICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTcxCisgICAgICAgIENIQVJTWzQ3XSA9IDQ5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDgsIDU4LCAoYnl0ZSkgLTcxICk7IC8vIEZpbGwgMTAgb2YgdmFsdWUgKGJ5dGUpIC03MQorICAgICAgICBDSEFSU1s1OF0gPSA2MTsKKyAgICAgICAgQ0hBUlNbNTldID0gNDk7CisgICAgICAgIENIQVJTWzYwXSA9IDE7CisgICAgICAgIENIQVJTWzYxXSA9IDQ5OworICAgICAgICBDSEFSU1s2Ml0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDYzLCA2NSwgKGJ5dGUpIDQ5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgNDkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDY1LCA5MSwgKGJ5dGUpIC0zICk7IC8vIEZpbGwgMjYgb2YgdmFsdWUgKGJ5dGUpIC0zCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA5MSwgOTMsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzkzXSA9IDE7CisgICAgICAgIENIQVJTWzk0XSA9IDMzOworICAgICAgICBDSEFSU1s5NV0gPSAtMzsKKyAgICAgICAgQ0hBUlNbOTZdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA5NywgMTIzLCAoYnl0ZSkgLTMgKTsgLy8gRmlsbCAyNiBvZiB2YWx1ZSAoYnl0ZSkgLTMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyMywgMTgzLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA2MCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbMTgzXSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE4NCwgMTkyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA4IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTkyLCAyMTUsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzIxNV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDIxNiwgMjQ3LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMzEgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1syNDddID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNDgsIDMwNiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDU4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMwNiwgMzA4LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzA4LCAzMTksIChieXRlKSAtMTkgKTsgLy8gRmlsbCAxMSBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMTksIDMyMSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMyMSwgMzI5LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgOCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzMyOV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMzMCwgMzgzLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNTMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1szODNdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzODQsIDQ1MiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDY4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQ1MiwgNDYxLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA5IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDYxLCA0OTcsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAzNiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0OTcsIDUwMCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDUwMCwgNTAyLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA1MDIsIDUwNiwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDUwNiwgNTM2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMzAgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNTM2LCA1OTIsIChieXRlKSAzMyApOyAvLyBGaWxsIDU2IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNTkyLCA2ODEsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA4OSBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA2ODEsIDY5OSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMTggb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA2OTksIDcwNiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDcgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNzA2LCA3MjAsIChieXRlKSAzMyApOyAvLyBGaWxsIDE0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNzIwLCA3MjIsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDcyMiwgNzY4LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0NiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDc2OCwgODM4LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgNzAgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODM4LCA4NjQsIChieXRlKSAzMyApOyAvLyBGaWxsIDI2IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODY0LCA4NjYsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDg2NiwgOTAyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzNiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbOTAyXSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbOTAzXSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDkwNCwgOTA3LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzkwN10gPSAzMzsKKyAgICAgICAgQ0hBUlNbOTA4XSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbOTA5XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgOTEwLCA5MzAsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyMCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzkzMF0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDkzMSwgOTc1LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNDQgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1s5NzVdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA5NzYsIDk4MywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDcgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgOTgzLCA5ODYsIChieXRlKSAzMyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzk4Nl0gPSAtMTk7CisgICAgICAgIENIQVJTWzk4N10gPSAzMzsKKyAgICAgICAgQ0hBUlNbOTg4XSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbOTg5XSA9IDMzOworICAgICAgICBDSEFSU1s5OTBdID0gLTE5OworICAgICAgICBDSEFSU1s5OTFdID0gMzM7CisgICAgICAgIENIQVJTWzk5Ml0gPSAtMTk7CisgICAgICAgIENIQVJTWzk5M10gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDk5NCwgMTAxMiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDE4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEwMTIsIDEwMjUsIChieXRlKSAzMyApOyAvLyBGaWxsIDEzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTAyNSwgMTAzNywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDEyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMTAzN10gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEwMzgsIDExMDQsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA2NiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzExMDRdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMTA1LCAxMTE3LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMTIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1sxMTE3XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTExOCwgMTE1NCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDM2IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMTE1NF0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDExNTUsIDExNTksIChieXRlKSAtODcgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDExNTksIDExNjgsIChieXRlKSAzMyApOyAvLyBGaWxsIDkgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMTY4LCAxMjIxLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNTMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTIyMSwgMTIyMywgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyMjMsIDEyMjUsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyMjUsIDEyMjcsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjI3LCAxMjI5LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjI5LCAxMjMyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTIzMiwgMTI2MCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDI4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyNjAsIDEyNjIsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjYyLCAxMjcwLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgOCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjcwLCAxMjcyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTI3MiwgMTI3NCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTI3NCwgMTMyOSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNTUgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMzI5LCAxMzY3LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMzggb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTM2NywgMTM2OSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbMTM2OV0gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMzcwLCAxMzc3LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA3IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTM3NywgMTQxNSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDM4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE0MTUsIDE0MjUsIChieXRlKSAzMyApOyAvLyBGaWxsIDEwIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTQyNSwgMTQ0MiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDE3IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQ0hBUlNbMTQ0Ml0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE0NDMsIDE0NjYsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyMyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIENIQVJTWzE0NjZdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNDY3LCAxNDcwLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIENIQVJTWzE0NzBdID0gMzM7CisgICAgICAgIENIQVJTWzE0NzFdID0gLTg3OworICAgICAgICBDSEFSU1sxNDcyXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTQ3MywgMTQ3NSwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1sxNDc1XSA9IDMzOworICAgICAgICBDSEFSU1sxNDc2XSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE0NzcsIDE0ODgsIChieXRlKSAzMyApOyAvLyBGaWxsIDExIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTQ4OCwgMTUxNSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDI3IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE1MTUsIDE1MjAsIChieXRlKSAzMyApOyAvLyBGaWxsIDUgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNTIwLCAxNTIzLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNTIzLCAxNTY5LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0NiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE1NjksIDE1OTUsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyNiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNTk1LCAxNjAwLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA1IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1sxNjAwXSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE2MDEsIDE2MTEsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAxMCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNjExLCAxNjE5LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgOCBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNjE5LCAxNjMyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAxMyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE2MzIsIDE2NDIsIChieXRlKSAtODcgKTsgLy8gRmlsbCAxMCBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNjQyLCAxNjQ4LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1sxNjQ4XSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE2NDksIDE3MjAsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA3MSBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNzIwLCAxNzIyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTcyMiwgMTcyNywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDUgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1sxNzI3XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTcyOCwgMTc0MywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDE1IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMTc0M10gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE3NDQsIDE3NDgsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMTc0OF0gPSAzMzsKKyAgICAgICAgQ0hBUlNbMTc0OV0gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNzUwLCAxNzY1LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMTUgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTc2NSwgMTc2NywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTc2NywgMTc2OSwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1sxNzY5XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTc3MCwgMTc3NCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTc3NCwgMTc3NiwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE3NzYsIDE3ODYsIChieXRlKSAtODcgKTsgLy8gRmlsbCAxMCBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNzg2LCAyMzA1LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA1MTkgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyMzA1LCAyMzA4LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIENIQVJTWzIzMDhdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyMzA5LCAyMzYyLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNTMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjM2MiwgMjM2NCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbMjM2NF0gPSAtODc7CisgICAgICAgIENIQVJTWzIzNjVdID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjM2NiwgMjM4MiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDE2IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDIzODIsIDIzODUsIChieXRlKSAzMyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyMzg1LCAyMzg5LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyMzg5LCAyMzkyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjM5MiwgMjQwMiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDEwIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI0MDIsIDI0MDQsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI0MDQsIDI0MDYsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNDA2LCAyNDE2LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMTAgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjQxNiwgMjQzMywgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMTcgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNDMzLCAyNDM2LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIENIQVJTWzI0MzZdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNDM3LCAyNDQ1LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgOCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNDQ1LCAyNDQ3LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjQ0NywgMjQ0OSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjQ0OSwgMjQ1MSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI0NTEsIDI0NzMsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI0NzNdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNDc0LCAyNDgxLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI0ODFdID0gMzM7CisgICAgICAgIENIQVJTWzI0ODJdID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjQ4MywgMjQ4NiwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI0ODYsIDI0OTAsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI0OTAsIDI0OTIsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzI0OTJdID0gLTg3OworICAgICAgICBDSEFSU1syNDkzXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjQ5NCwgMjUwMSwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDcgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjUwMSwgMjUwMywgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI1MDMsIDI1MDUsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI1MDUsIDI1MDcsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNTA3LCAyNTEwLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNTEwLCAyNTE5LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA5IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1syNTE5XSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI1MjAsIDI1MjQsIChieXRlKSAzMyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNTI0LCAyNTI2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI1MjZdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNTI3LCAyNTMwLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNTMwLCAyNTMyLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNTMyLCAyNTM0LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjUzNCwgMjU0NCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDEwIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI1NDQsIDI1NDYsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI1NDYsIDI1NjIsIChieXRlKSAzMyApOyAvLyBGaWxsIDE2IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1syNTYyXSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI1NjMsIDI1NjUsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNTY1LCAyNTcxLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNTcxLCAyNTc1LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjU3NSwgMjU3NywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjU3NywgMjU3OSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI1NzksIDI2MDEsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI2MDFdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjAyLCAyNjA5LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI2MDldID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjEwLCAyNjEyLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI2MTJdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjEzLCAyNjE1LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI2MTVdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjE2LCAyNjE4LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjE4LCAyNjIwLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1syNjIwXSA9IC04NzsKKyAgICAgICAgQ0hBUlNbMjYyMV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI2MjIsIDI2MjcsIChieXRlKSAtODcgKTsgLy8gRmlsbCA1IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI2MjcsIDI2MzEsIChieXRlKSAzMyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjMxLCAyNjMzLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjMzLCAyNjM1LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjYzNSwgMjYzOCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjYzOCwgMjY0OSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMTEgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjQ5LCAyNjUzLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI2NTNdID0gMzM7CisgICAgICAgIENIQVJTWzI2NTRdID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjY1NSwgMjY2MiwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI2NjIsIDI2NzQsIChieXRlKSAtODcgKTsgLy8gRmlsbCAxMiBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjc0LCAyNjc3LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjc3LCAyNjg5LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAxMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI2ODksIDI2OTIsIChieXRlKSAtODcgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQ0hBUlNbMjY5Ml0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI2OTMsIDI3MDAsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA3IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMjcwMF0gPSAzMzsKKyAgICAgICAgQ0hBUlNbMjcwMV0gPSAtMTk7CisgICAgICAgIENIQVJTWzI3MDJdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNzAzLCAyNzA2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI3MDZdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNzA3LCAyNzI5LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMjIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1syNzI5XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjczMCwgMjczNywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDcgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1syNzM3XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjczOCwgMjc0MCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1syNzQwXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjc0MSwgMjc0NiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDUgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjc0NiwgMjc0OCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbMjc0OF0gPSAtODc7CisgICAgICAgIENIQVJTWzI3NDldID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjc1MCwgMjc1OCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDggb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1syNzU4XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjc1OSwgMjc2MiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1syNzYyXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjc2MywgMjc2NiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjc2NiwgMjc4NCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMTggb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzI3ODRdID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjc4NSwgMjc5MCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNSBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI3OTAsIDI4MDAsIChieXRlKSAtODcgKTsgLy8gRmlsbCAxMCBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyODAwLCAyODE3LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAxNyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI4MTcsIDI4MjAsIChieXRlKSAtODcgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQ0hBUlNbMjgyMF0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI4MjEsIDI4MjksIChieXRlKSAtMTkgKTsgLy8gRmlsbCA4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI4MjksIDI4MzEsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyODMxLCAyODMzLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyODMzLCAyODM1LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjgzNSwgMjg1NywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMjg1N10gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI4NTgsIDI4NjUsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA3IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMjg2NV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI4NjYsIDI4NjgsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI4NjgsIDI4NzAsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyODcwLCAyODc0LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyODc0LCAyODc2LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1syODc2XSA9IC04NzsKKyAgICAgICAgQ0hBUlNbMjg3N10gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyODc4LCAyODg0LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgNiBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyODg0LCAyODg3LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjg4NywgMjg4OSwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjg4OSwgMjg5MSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI4OTEsIDI4OTQsIChieXRlKSAtODcgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI4OTQsIDI5MDIsIChieXRlKSAzMyApOyAvLyBGaWxsIDggb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyOTAyLCAyOTA0LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyOTA0LCAyOTA4LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjkwOCwgMjkxMCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1syOTEwXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjkxMSwgMjkxNCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjkxNCwgMjkxOCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI5MTgsIDI5MjgsIChieXRlKSAtODcgKTsgLy8gRmlsbCAxMCBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyOTI4LCAyOTQ2LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAxOCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI5NDYsIDI5NDgsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQ0hBUlNbMjk0OF0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI5NDksIDI5NTUsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI5NTUsIDI5NTgsIChieXRlKSAzMyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyOTU4LCAyOTYxLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI5NjFdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyOTYyLCAyOTY2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyOTY2LCAyOTY5LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjk2OSwgMjk3MSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1syOTcxXSA9IDMzOworICAgICAgICBDSEFSU1syOTcyXSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbMjk3M10gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI5NzQsIDI5NzYsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI5NzYsIDI5NzksIChieXRlKSAzMyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyOTc5LCAyOTgxLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyOTgxLCAyOTg0LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjk4NCwgMjk4NywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjk4NywgMjk5MCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI5OTAsIDI5OTgsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMjk5OF0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI5OTksIDMwMDIsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMwMDIsIDMwMDYsIChieXRlKSAzMyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMDA2LCAzMDExLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgNSBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMDExLCAzMDE0LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzAxNCwgMzAxNywgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1szMDE3XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzAxOCwgMzAyMiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzAyMiwgMzAzMSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgOSBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbMzAzMV0gPSAtODc7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMDMyLCAzMDQ3LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAxNSBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMwNDcsIDMwNTYsIChieXRlKSAtODcgKTsgLy8gRmlsbCA5IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMwNTYsIDMwNzMsIChieXRlKSAzMyApOyAvLyBGaWxsIDE3IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzA3MywgMzA3NiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1szMDc2XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzA3NywgMzA4NSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDggb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1szMDg1XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzA4NiwgMzA4OSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1szMDg5XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzA5MCwgMzExMywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIzIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMzExM10gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMxMTQsIDMxMjQsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAxMCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzMxMjRdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMTI1LCAzMTMwLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNSBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMTMwLCAzMTM0LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzEzNCwgMzE0MSwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDcgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1szMTQxXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzE0MiwgMzE0NSwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1szMTQ1XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzE0NiwgMzE1MCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzE1MCwgMzE1NywgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMxNTcsIDMxNTksIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMxNTksIDMxNjgsIChieXRlKSAzMyApOyAvLyBGaWxsIDkgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMTY4LCAzMTcwLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMTcwLCAzMTc0LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzE3NCwgMzE4NCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDEwIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMxODQsIDMyMDIsIChieXRlKSAzMyApOyAvLyBGaWxsIDE4IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzIwMiwgMzIwNCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1szMjA0XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzIwNSwgMzIxMywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDggb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1szMjEzXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzIxNCwgMzIxNywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1szMjE3XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzIxOCwgMzI0MSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIzIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMzI0MV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMyNDIsIDMyNTIsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAxMCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzMyNTJdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMjUzLCAzMjU4LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNSBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMjU4LCAzMjYyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzI2MiwgMzI2OSwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDcgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1szMjY5XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzI3MCwgMzI3MywgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1szMjczXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzI3NCwgMzI3OCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzI3OCwgMzI4NSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMyODUsIDMyODcsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMyODcsIDMyOTQsIChieXRlKSAzMyApOyAvLyBGaWxsIDcgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzMyOTRdID0gLTE5OworICAgICAgICBDSEFSU1szMjk1XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzI5NiwgMzI5OCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzI5OCwgMzMwMiwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMzMDIsIDMzMTIsIChieXRlKSAtODcgKTsgLy8gRmlsbCAxMCBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMzEyLCAzMzMwLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAxOCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMzMzAsIDMzMzIsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQ0hBUlNbMzMzMl0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMzMzMsIDMzNDEsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMzM0MV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMzNDIsIDMzNDUsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMzM0NV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMzNDYsIDMzNjksIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzMzNjldID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMzcwLCAzMzg2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMTYgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzM4NiwgMzM5MCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMzOTAsIDMzOTYsIChieXRlKSAtODcgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMzOTYsIDMzOTgsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMzk4LCAzNDAxLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIENIQVJTWzM0MDFdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNDAyLCAzNDA2LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNDA2LCAzNDE1LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA5IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1szNDE1XSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM0MTYsIDM0MjQsIChieXRlKSAzMyApOyAvLyBGaWxsIDggb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNDI0LCAzNDI2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNDI2LCAzNDMwLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzQzMCwgMzQ0MCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDEwIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM0NDAsIDM1ODUsIChieXRlKSAzMyApOyAvLyBGaWxsIDE0NSBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM1ODUsIDM2MzEsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA0NiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzM2MzFdID0gMzM7CisgICAgICAgIENIQVJTWzM2MzJdID0gLTE5OworICAgICAgICBDSEFSU1szNjMzXSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM2MzQsIDM2MzYsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM2MzYsIDM2NDMsIChieXRlKSAtODcgKTsgLy8gRmlsbCA3IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM2NDMsIDM2NDgsIChieXRlKSAzMyApOyAvLyBGaWxsIDUgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNjQ4LCAzNjU0LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNjU0LCAzNjYzLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgOSBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIENIQVJTWzM2NjNdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNjY0LCAzNjc0LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMTAgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzY3NCwgMzcxMywgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMzkgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzEzLCAzNzE1LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzM3MTVdID0gMzM7CisgICAgICAgIENIQVJTWzM3MTZdID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzcxNywgMzcxOSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM3MTksIDM3MjEsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMzcyMV0gPSAzMzsKKyAgICAgICAgQ0hBUlNbMzcyMl0gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzIzLCAzNzI1LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1szNzI1XSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM3MjYsIDM3MzIsIChieXRlKSAzMyApOyAvLyBGaWxsIDYgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzMyLCAzNzM2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzM3MzZdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzM3LCAzNzQ0LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzM3NDRdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzQ1LCAzNzQ4LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzM3NDhdID0gMzM7CisgICAgICAgIENIQVJTWzM3NDldID0gLTE5OworICAgICAgICBDSEFSU1szNzUwXSA9IDMzOworICAgICAgICBDSEFSU1szNzUxXSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM3NTIsIDM3NTQsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzU0LCAzNzU2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzM3NTZdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzU3LCAzNzU5LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzM3NTldID0gMzM7CisgICAgICAgIENIQVJTWzM3NjBdID0gLTE5OworICAgICAgICBDSEFSU1szNzYxXSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM3NjIsIDM3NjQsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM3NjQsIDM3NzAsIChieXRlKSAtODcgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQ0hBUlNbMzc3MF0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM3NzEsIDM3NzMsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQ0hBUlNbMzc3M10gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzc0LCAzNzc2LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzc3NiwgMzc4MSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDUgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1szNzgxXSA9IDMzOworICAgICAgICBDSEFSU1szNzgyXSA9IC04NzsKKyAgICAgICAgQ0hBUlNbMzc4M10gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM3ODQsIDM3OTAsIChieXRlKSAtODcgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM3OTAsIDM3OTIsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzkyLCAzODAyLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMTAgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzgwMiwgMzg2NCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNjIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzODY0LCAzODY2LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzODY2LCAzODcyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzg3MiwgMzg4MiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDEwIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM4ODIsIDM4OTMsIChieXRlKSAzMyApOyAvLyBGaWxsIDExIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1szODkzXSA9IC04NzsKKyAgICAgICAgQ0hBUlNbMzg5NF0gPSAzMzsKKyAgICAgICAgQ0hBUlNbMzg5NV0gPSAtODc7CisgICAgICAgIENIQVJTWzM4OTZdID0gMzM7CisgICAgICAgIENIQVJTWzM4OTddID0gLTg3OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzg5OCwgMzkwMiwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM5MDIsIDM5MDQsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM5MDQsIDM5MTIsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMzkxMl0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM5MTMsIDM5NDYsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAzMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzOTQ2LCAzOTUzLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA3IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzk1MywgMzk3MywgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDIwIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQ0hBUlNbMzk3M10gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM5NzQsIDM5ODAsIChieXRlKSAtODcgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM5ODAsIDM5ODQsIChieXRlKSAzMyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzOTg0LCAzOTkwLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgNiBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIENIQVJTWzM5OTBdID0gMzM7CisgICAgICAgIENIQVJTWzM5OTFdID0gLTg3OworICAgICAgICBDSEFSU1szOTkyXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzk5MywgNDAxNCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDIxIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQwMTQsIDQwMTcsIChieXRlKSAzMyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0MDE3LCA0MDI0LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIENIQVJTWzQwMjRdID0gMzM7CisgICAgICAgIENIQVJTWzQwMjVdID0gLTg3OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDAyNiwgNDI1NiwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMjMwIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDI1NiwgNDI5NCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDM4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQyOTQsIDQzMDQsIChieXRlKSAzMyApOyAvLyBGaWxsIDEwIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDMwNCwgNDM0MywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDM5IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQzNDMsIDQzNTIsIChieXRlKSAzMyApOyAvLyBGaWxsIDkgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzQzNTJdID0gLTE5OworICAgICAgICBDSEFSU1s0MzUzXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDM1NCwgNDM1NiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1s0MzU2XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDM1NywgNDM2MCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1s0MzYwXSA9IDMzOworICAgICAgICBDSEFSU1s0MzYxXSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbNDM2Ml0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQzNjMsIDQzNjUsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbNDM2NV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQzNjYsIDQzNzEsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA1IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQzNzEsIDQ0MTIsIChieXRlKSAzMyApOyAvLyBGaWxsIDQxIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1s0NDEyXSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbNDQxM10gPSAzMzsKKyAgICAgICAgQ0hBUlNbNDQxNF0gPSAtMTk7CisgICAgICAgIENIQVJTWzQ0MTVdID0gMzM7CisgICAgICAgIENIQVJTWzQ0MTZdID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDQxNywgNDQyOCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMTEgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzQ0MjhdID0gLTE5OworICAgICAgICBDSEFSU1s0NDI5XSA9IDMzOworICAgICAgICBDSEFSU1s0NDMwXSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbNDQzMV0gPSAzMzsKKyAgICAgICAgQ0hBUlNbNDQzMl0gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NDMzLCA0NDM2LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDQzNiwgNDQzOCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDQzOCwgNDQ0MSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbNDQ0MV0gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NDQyLCA0NDQ3LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA1IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDQ0NywgNDQ1MCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1s0NDUwXSA9IDMzOworICAgICAgICBDSEFSU1s0NDUxXSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbNDQ1Ml0gPSAzMzsKKyAgICAgICAgQ0hBUlNbNDQ1M10gPSAtMTk7CisgICAgICAgIENIQVJTWzQ0NTRdID0gMzM7CisgICAgICAgIENIQVJTWzQ0NTVdID0gLTE5OworICAgICAgICBDSEFSU1s0NDU2XSA9IDMzOworICAgICAgICBDSEFSU1s0NDU3XSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQ0NTgsIDQ0NjEsIChieXRlKSAzMyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NDYxLCA0NDYzLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NDYzLCA0NDY2LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDQ2NiwgNDQ2OCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1s0NDY4XSA9IDMzOworICAgICAgICBDSEFSU1s0NDY5XSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQ0NzAsIDQ1MTAsIChieXRlKSAzMyApOyAvLyBGaWxsIDQwIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1s0NTEwXSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQ1MTEsIDQ1MjAsIChieXRlKSAzMyApOyAvLyBGaWxsIDkgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzQ1MjBdID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDUyMSwgNDUyMywgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbNDUyM10gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NTI0LCA0NTI2LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDUyNiwgNDUyOCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDUyOCwgNDUzNSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQ1MzUsIDQ1MzcsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbNDUzN10gPSAzMzsKKyAgICAgICAgQ0hBUlNbNDUzOF0gPSAtMTk7CisgICAgICAgIENIQVJTWzQ1MzldID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NTQwLCA0NTQ3LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NTQ3LCA0NTg3LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0MCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbNDU4N10gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NTg4LCA0NTkyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1s0NTkyXSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQ1OTMsIDQ2MDEsIChieXRlKSAzMyApOyAvLyBGaWxsIDggb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzQ2MDFdID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDYwMiwgNzY4MCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMzA3OCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDc2ODAsIDc4MzYsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAxNTYgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNzgzNiwgNzg0MCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDc4NDAsIDc5MzAsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA5MCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA3OTMwLCA3OTM2LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNzkzNiwgNzk1OCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDc5NTgsIDc5NjAsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA3OTYwLCA3OTY2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA3OTY2LCA3OTY4LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNzk2OCwgODAwNiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDM4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDgwMDYsIDgwMDgsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4MDA4LCA4MDE0LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4MDE0LCA4MDE2LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODAxNiwgODAyNCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDggb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1s4MDI0XSA9IDMzOworICAgICAgICBDSEFSU1s4MDI1XSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbODAyNl0gPSAzMzsKKyAgICAgICAgQ0hBUlNbODAyN10gPSAtMTk7CisgICAgICAgIENIQVJTWzgwMjhdID0gMzM7CisgICAgICAgIENIQVJTWzgwMjldID0gLTE5OworICAgICAgICBDSEFSU1s4MDMwXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODAzMSwgODA2MiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDMxIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDgwNjIsIDgwNjQsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4MDY0LCA4MTE3LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNTMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1s4MTE3XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODExOCwgODEyNSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDcgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1s4MTI1XSA9IDMzOworICAgICAgICBDSEFSU1s4MTI2XSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDgxMjcsIDgxMzAsIChieXRlKSAzMyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4MTMwLCA4MTMzLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzgxMzNdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4MTM0LCA4MTQxLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4MTQxLCA4MTQ0LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODE0NCwgODE0OCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODE0OCwgODE1MCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDgxNTAsIDgxNTYsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDgxNTYsIDgxNjAsIChieXRlKSAzMyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4MTYwLCA4MTczLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMTMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODE3MywgODE3OCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNSBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDgxNzgsIDgxODEsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbODE4MV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDgxODIsIDgxODksIChieXRlKSAtMTkgKTsgLy8gRmlsbCA3IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDgxODksIDg0MDAsIChieXRlKSAzMyApOyAvLyBGaWxsIDIxMSBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDg0MDAsIDg0MTMsIChieXRlKSAtODcgKTsgLy8gRmlsbCAxMyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4NDEzLCA4NDE3LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1s4NDE3XSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDg0MTgsIDg0ODYsIChieXRlKSAzMyApOyAvLyBGaWxsIDY4IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1s4NDg2XSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDg0ODcsIDg0OTAsIChieXRlKSAzMyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4NDkwLCA4NDkyLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4NDkyLCA4NDk0LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1s4NDk0XSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDg0OTUsIDg1NzYsIChieXRlKSAzMyApOyAvLyBGaWxsIDgxIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODU3NiwgODU3OSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODU3OSwgMTIyOTMsIChieXRlKSAzMyApOyAvLyBGaWxsIDM3MTQgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzEyMjkzXSA9IC04NzsKKyAgICAgICAgQ0hBUlNbMTIyOTRdID0gMzM7CisgICAgICAgIENIQVJTWzEyMjk1XSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyMjk2LCAxMjMyMSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMjUgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjMyMSwgMTIzMzAsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA5IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyMzMwLCAxMjMzNiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDYgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1sxMjMzNl0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyMzM3LCAxMjM0MiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDUgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTIzNDIsIDEyMzUzLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAxMSBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyMzUzLCAxMjQzNywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDg0IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyNDM3LCAxMjQ0MSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyNDQxLCAxMjQ0MywgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTI0NDMsIDEyNDQ1LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTI0NDUsIDEyNDQ3LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjQ0NywgMTI0NDksIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjQ0OSwgMTI1MzksIChieXRlKSAtMTkgKTsgLy8gRmlsbCA5MCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzEyNTM5XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTI1NDAsIDEyNTQzLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjU0MywgMTI1NDksIChieXRlKSAzMyApOyAvLyBGaWxsIDYgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjU0OSwgMTI1ODksIChieXRlKSAtMTkgKTsgLy8gRmlsbCA0MCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjU4OSwgMTk5NjgsIChieXRlKSAzMyApOyAvLyBGaWxsIDczNzkgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxOTk2OCwgNDA4NzAsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyMDkwMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0MDg3MCwgNDQwMzIsIChieXRlKSAzMyApOyAvLyBGaWxsIDMxNjIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NDAzMiwgNTUyMDQsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAxMTE3MiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA1NTIwNCwgNTUyOTYsIChieXRlKSAzMyApOyAvLyBGaWxsIDkyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNTczNDQsIDY1NTM0LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA4MTkwIG9mIHZhbHVlIChieXRlKSAzMworCisgICAgfSAvLyA8Y2xpbml0PigpCisKKyAgICAvLworICAgIC8vIFB1YmxpYyBzdGF0aWMgbWV0aG9kcworICAgIC8vCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSBzdXBwbGVtZW50YWwgY2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdXBwbGVtZW50YWwoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuIChjID49IDB4MTAwMDAgJiYgYyA8PSAweDEwRkZGRik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIHRoZSBzdXBwbGVtZW50YWwgY2hhcmFjdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCisgICAgICogc3Vycm9nYXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoIFRoZSBoaWdoIHN1cnJvZ2F0ZS4KKyAgICAgKiBAcGFyYW0gbCBUaGUgbG93IHN1cnJvZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBzdXBwbGVtZW50YWwoY2hhciBoLCBjaGFyIGwpIHsKKyAgICAgICAgcmV0dXJuIChoIC0gMHhEODAwKSAqIDB4NDAwICsgKGwgLSAweERDMDApICsgMHgxMDAwMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBoaWdoIHN1cnJvZ2F0ZSBvZiBhIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBzdXBwbGVtZW50YWwgY2hhcmFjdGVyIHRvICJzcGxpdCIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjaGFyIGhpZ2hTdXJyb2dhdGUoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuIChjaGFyKSAoKChjIC0gMHgwMDAxMDAwMCkgPj4gMTApICsgMHhEODAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsb3cgc3Vycm9nYXRlIG9mIGEgc3VwcGxlbWVudGFsIGNoYXJhY3RlcgorICAgICAqCisgICAgICogQHBhcmFtIGMgVGhlIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIgdG8gInNwbGl0Ii4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNoYXIgbG93U3Vycm9nYXRlKGludCBjKSB7CisgICAgICAgIHJldHVybiAoY2hhcikgKCgoYyAtIDB4MDAwMTAwMDApICYgMHgzRkYpICsgMHhEQzAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyBhIGhpZ2ggc3Vycm9nYXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hpZ2hTdXJyb2dhdGUoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuICgweEQ4MDAgPD0gYyAmJiBjIDw9IDB4REJGRik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgYSBsb3cgc3Vycm9nYXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xvd1N1cnJvZ2F0ZShpbnQgYykgeworICAgICAgICByZXR1cm4gKDB4REMwMCA8PSBjICYmIGMgPD0gMHhERkZGKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyB2YWxpZC4gVGhpcyBtZXRob2QKKyAgICAgKiBhbHNvIGNoZWNrcyB0aGUgc3Vycm9nYXRlIGNoYXJhY3RlciByYW5nZSBmcm9tIDB4MTAwMDAgdG8gMHgxMEZGRkYuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHByb2dyYW0gY2hvb3NlcyB0byBhcHBseSB0aGUgbWFzayBkaXJlY3RseSB0byB0aGUKKyAgICAgKiA8Y29kZT5DSEFSUzwvY29kZT4gYXJyYXksIHRoZW4gdGhleSBhcmUgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nCisgICAgICogdGhlIHN1cnJvZ2F0ZSBjaGFyYWN0ZXIgcmFuZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKGludCBjKSB7CisgICAgICAgIHJldHVybiAoYyA8IDB4MTAwMDAgJiYgKENIQVJTW2NdICYgTUFTS19WQUxJRCkgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICgweDEwMDAwIDw9IGMgJiYgYyA8PSAweDEwRkZGRik7CisgICAgfSAvLyBpc1ZhbGlkKGludCk6Ym9vbGVhbgorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGludmFsaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ludmFsaWQoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuICFpc1ZhbGlkKGMpOworICAgIH0gLy8gaXNJbnZhbGlkKGludCk6Ym9vbGVhbgorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGNhbiBiZSBjb25zaWRlcmVkIGNvbnRlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRlbnQoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuIChjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX0NPTlRFTlQpICE9IDApIHx8CisgICAgICAgICAgICAgICAoMHgxMDAwMCA8PSBjICYmIGMgPD0gMHgxMEZGRkYpOworICAgIH0gLy8gaXNDb250ZW50KGludCk6Ym9vbGVhbgorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGNhbiBiZSBjb25zaWRlcmVkIG1hcmt1cC4KKyAgICAgKiBNYXJrdXAgY2hhcmFjdGVycyBpbmNsdWRlICcmbHQ7JywgJyZhbXA7JywgYW5kICclJy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFya3VwKGludCBjKSB7CisgICAgICAgIHJldHVybiBjID09ICc8JyB8fCBjID09ICcmJyB8fCBjID09ICclJzsKKyAgICB9IC8vIGlzTWFya3VwKGludCk6Ym9vbGVhbgorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgc3BhY2UgY2hhcmFjdGVyCisgICAgICogYXMgZGVmaW5lZCBieSBwcm9kdWN0aW9uIFszXSBpbiB0aGUgWE1MIDEuMCBzcGVjaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTcGFjZShpbnQgYykgeworICAgICAgICByZXR1cm4gYyA8PSAweDIwICYmIChDSEFSU1tjXSAmIE1BU0tfU1BBQ0UpICE9IDA7CisgICAgfSAvLyBpc1NwYWNlKGludCk6Ym9vbGVhbgorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgdmFsaWQgbmFtZSBzdGFydAorICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzVdIGluIHRoZSBYTUwgMS4wCisgICAgICogc3BlY2lmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmFtZVN0YXJ0KGludCBjKSB7CisgICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX05BTUVfU1RBUlQpICE9IDA7CisgICAgfSAvLyBpc05hbWVTdGFydChpbnQpOmJvb2xlYW4KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHZhbGlkIG5hbWUKKyAgICAgKiBjaGFyYWN0ZXIgYXMgZGVmaW5lZCBieSBwcm9kdWN0aW9uIFs0XSBpbiB0aGUgWE1MIDEuMAorICAgICAqIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05hbWUoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfTkFNRSkgIT0gMDsKKyAgICB9IC8vIGlzTmFtZShpbnQpOmJvb2xlYW4KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHZhbGlkIE5DTmFtZSBzdGFydAorICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzRdIGluIE5hbWVzcGFjZXMgaW4gWE1MCisgICAgICogcmVjb21tZW5kYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05DTmFtZVN0YXJ0KGludCBjKSB7CisgICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX05DTkFNRV9TVEFSVCkgIT0gMDsKKyAgICB9IC8vIGlzTkNOYW1lU3RhcnQoaW50KTpib29sZWFuCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBOQ05hbWUKKyAgICAgKiBjaGFyYWN0ZXIgYXMgZGVmaW5lZCBieSBwcm9kdWN0aW9uIFs1XSBpbiBOYW1lc3BhY2VzIGluIFhNTAorICAgICAqIHJlY29tbWVuZGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOQ05hbWUoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfTkNOQU1FKSAhPSAwOworICAgIH0gLy8gaXNOQ05hbWUoaW50KTpib29sZWFuCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBQdWJpZAorICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzEzXSBpbiB0aGUgWE1MIDEuMAorICAgICAqIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1B1YmlkKGludCBjKSB7CisgICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX1BVQklEKSAhPSAwOworICAgIH0gLy8gaXNQdWJpZChpbnQpOmJvb2xlYW4KKworICAgIC8qCisgICAgICogWzVdIE5hbWUgOjo9IChMZXR0ZXIgfCAnXycgfCAnOicpIChOYW1lQ2hhcikqCisgICAgICovCisgICAgLyoqCisgICAgICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTmFtZSBhY2NvcmRpbmcgdG8gWzVdCisgICAgICogaW4gdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHN0cmluZyB0byBjaGVjaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lIGlzIGEgdmFsaWQgTmFtZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjaGFyIGNoID0gbmFtZS5jaGFyQXQoMCk7CisgICAgICAgIGlmKCBpc05hbWVTdGFydChjaCkgPT0gZmFsc2UpCisgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKysgKSB7CisgICAgICAgICAgIGNoID0gbmFtZS5jaGFyQXQoaSk7CisgICAgICAgICAgIGlmKCBpc05hbWUoIGNoICkgPT0gZmFsc2UgKXsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSAvLyBpc1ZhbGlkTmFtZShTdHJpbmcpOmJvb2xlYW4KKyAgICAKKworICAgIC8qCisgICAgICogZnJvbSB0aGUgbmFtZXNwYWNlIHJlYworICAgICAqIFs0XSBOQ05hbWUgOjo9IChMZXR0ZXIgfCAnXycpIChOQ05hbWVDaGFyKSoKKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBOQ05hbWUgYWNjb3JkaW5nIHRvIFs0XQorICAgICAqIGZyb20gdGhlIFhNTCBOYW1lc3BhY2VzIDEuMCBSZWNvbW1lbmRhdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIG5jTmFtZSBzdHJpbmcgdG8gY2hlY2sKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbmFtZSBpcyBhIHZhbGlkIE5DTmFtZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTkNOYW1lKFN0cmluZyBuY05hbWUpIHsKKyAgICAgICAgaWYgKG5jTmFtZS5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjaGFyIGNoID0gbmNOYW1lLmNoYXJBdCgwKTsKKyAgICAgICAgaWYoIGlzTkNOYW1lU3RhcnQoY2gpID09IGZhbHNlKQorICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbmNOYW1lLmxlbmd0aCgpOyBpKysgKSB7CisgICAgICAgICAgIGNoID0gbmNOYW1lLmNoYXJBdChpKTsKKyAgICAgICAgICAgaWYoIGlzTkNOYW1lKCBjaCApID09IGZhbHNlICl7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gLy8gaXNWYWxpZE5DTmFtZShTdHJpbmcpOmJvb2xlYW4KKworICAgIC8qCisgICAgICogWzddIE5tdG9rZW4gOjo9IChOYW1lQ2hhcikrCisgICAgICovCisgICAgLyoqCisgICAgICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTm10b2tlbiBhY2NvcmRpbmcgdG8gWzddCisgICAgICogaW4gdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBubXRva2VuIHN0cmluZyB0byBjaGVjaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBubXRva2VuIGlzIGEgdmFsaWQgTm10b2tlbiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZE5tdG9rZW4oU3RyaW5nIG5tdG9rZW4pIHsKKyAgICAgICAgaWYgKG5tdG9rZW4ubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBubXRva2VuLmxlbmd0aCgpOyBpKysgKSB7CisgICAgICAgICAgIGNoYXIgY2ggPSBubXRva2VuLmNoYXJBdChpKTsKKyAgICAgICAgICAgaWYoICAhIGlzTmFtZSggY2ggKSApeworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IC8vIGlzVmFsaWROYW1lKFN0cmluZyk6Ym9vbGVhbgorCisKKworCisKKyAgICAvLyBlbmNvZGluZ3MKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5jb2RpbmcgbmFtZSBpcyBhIHZhbGlkIElBTkEgZW5jb2RpbmcuCisgICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlcmUgaXMgYSBkZWNvZGVyIGF2YWlsYWJsZQorICAgICAqIGZvciB0aGlzIGVuY29kaW5nLCBvbmx5IHRoYXQgdGhlIGNoYXJhY3RlcnMgYXJlIHZhbGlkIGZvciBhbgorICAgICAqIElBTkEgZW5jb2RpbmcgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpYW5hRW5jb2RpbmcgVGhlIElBTkEgZW5jb2RpbmcgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZElBTkFFbmNvZGluZyhTdHJpbmcgaWFuYUVuY29kaW5nKSB7CisgICAgICAgIGlmIChpYW5hRW5jb2RpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IGlhbmFFbmNvZGluZy5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gaWFuYUVuY29kaW5nLmNoYXJBdCgwKTsKKyAgICAgICAgICAgICAgICBpZiAoKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB8fCAoYyA+PSAnYScgJiYgYyA8PSAneicpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBpYW5hRW5jb2RpbmcuY2hhckF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjIDwgJ0EnIHx8IGMgPiAnWicpICYmIChjIDwgJ2EnIHx8IGMgPiAneicpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgPCAnMCcgfHwgYyA+ICc5JykgJiYgYyAhPSAnLicgJiYgYyAhPSAnXycgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICE9ICctJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gLy8gaXNWYWxpZElBTkFFbmNvZGluZyhTdHJpbmcpOmJvb2xlYW4KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5jb2RpbmcgbmFtZSBpcyBhIHZhbGlkIEphdmEgZW5jb2RpbmcuCisgICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlcmUgaXMgYSBkZWNvZGVyIGF2YWlsYWJsZQorICAgICAqIGZvciB0aGlzIGVuY29kaW5nLCBvbmx5IHRoYXQgdGhlIGNoYXJhY3RlcnMgYXJlIHZhbGlkIGZvciBhbgorICAgICAqIEphdmEgZW5jb2RpbmcgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXZhRW5jb2RpbmcgVGhlIEphdmEgZW5jb2RpbmcgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEphdmFFbmNvZGluZyhTdHJpbmcgamF2YUVuY29kaW5nKSB7CisgICAgICAgIGlmIChqYXZhRW5jb2RpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IGphdmFFbmNvZGluZy5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSBqYXZhRW5jb2RpbmcuY2hhckF0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGMgPCAnQScgfHwgYyA+ICdaJykgJiYgKGMgPCAnYScgfHwgYyA+ICd6JykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChjIDwgJzAnIHx8IGMgPiAnOScpICYmIGMgIT0gJy4nICYmIGMgIT0gJ18nICYmCisgICAgICAgICAgICAgICAgICAgICAgICBjICE9ICctJykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IC8vIGlzVmFsaWRJQU5BRW5jb2RpbmcoU3RyaW5nKTpib29sZWFuCisKKworfSAvLyBjbGFzcyBYTUxDaGFyCmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9YTUxFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9YTUxFbmNvZGluZ0RldGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmMjFkNAotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL1hNTEVuY29kaW5nRGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDE2MjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIEludGVybmF0aW9uYWwKKyAqIEJ1c2luZXNzIE1hY2hpbmVzLCBJbmMuLCBodHRwOi8vd3d3LmFwYWNoZS5vcmcuICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci54bWxwYXJzZXI7CisKK2ltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Kc3BDb21waWxhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuRXJyb3JEaXNwYXRjaGVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkpzcFV0aWw7CisKK3B1YmxpYyBjbGFzcyBYTUxFbmNvZGluZ0RldGVjdG9yIHsKKyAgICAKKyAgICBwcml2YXRlIElucHV0U3RyZWFtIHN0cmVhbTsKKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZzsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNFbmNvZGluZ1NldEluUHJvbG9nOworICAgIHByaXZhdGUgQm9vbGVhbiBpc0JpZ0VuZGlhbjsKKyAgICBwcml2YXRlIFJlYWRlciByZWFkZXI7CisgICAgCisgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFbnRpdHlNYW5hZ2VyIGZpZWxkcworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSAyMDQ4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfWE1MREVDTF9CVUZGRVJfU0laRSA9IDY0OworICAgIHByaXZhdGUgYm9vbGVhbiBmQWxsb3dKYXZhRW5jb2RpbmdzOworICAgIHByaXZhdGUgU3ltYm9sVGFibGUgZlN5bWJvbFRhYmxlOworICAgIHByaXZhdGUgWE1MRW5jb2RpbmdEZXRlY3RvciBmQ3VycmVudEVudGl0eTsKKyAgICBwcml2YXRlIGludCBmQnVmZmVyU2l6ZSA9IERFRkFVTFRfQlVGRkVSX1NJWkU7CisgICAgCisgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFbnRpdHlNYW5hZ2VyLlNjYW5uZWRFbnRpdHkgZmllbGRzCisgICAgcHJpdmF0ZSBpbnQgbGluZU51bWJlciA9IDE7CisgICAgcHJpdmF0ZSBpbnQgY29sdW1uTnVtYmVyID0gMTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbGl0ZXJhbDsKKyAgICBwcml2YXRlIGNoYXJbXSBjaCA9IG5ldyBjaGFyW0RFRkFVTFRfQlVGRkVSX1NJWkVdOworICAgIHByaXZhdGUgaW50IHBvc2l0aW9uOworICAgIHByaXZhdGUgaW50IGNvdW50OworICAgIHByaXZhdGUgYm9vbGVhbiBtYXlSZWFkQ2h1bmtzID0gZmFsc2U7CisgICAgCisgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxTY2FubmVyIGZpZWxkcworICAgIHByaXZhdGUgWE1MU3RyaW5nIGZTdHJpbmcgPSBuZXcgWE1MU3RyaW5nKCk7ICAgIAorICAgIHByaXZhdGUgWE1MU3RyaW5nQnVmZmVyIGZTdHJpbmdCdWZmZXIgPSBuZXcgWE1MU3RyaW5nQnVmZmVyKCk7CisgICAgcHJpdmF0ZSBYTUxTdHJpbmdCdWZmZXIgZlN0cmluZ0J1ZmZlcjIgPSBuZXcgWE1MU3RyaW5nQnVmZmVyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGZWZXJzaW9uU3ltYm9sID0gInZlcnNpb24iOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBmRW5jb2RpbmdTeW1ib2wgPSAiZW5jb2RpbmciOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBmU3RhbmRhbG9uZVN5bWJvbCA9ICJzdGFuZGFsb25lIjsKKyAgICAKKyAgICAvLyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTERvY3VtZW50RnJhZ21lbnRTY2FubmVySW1wbCBmaWVsZHMKKyAgICBwcml2YXRlIGludCBmTWFya3VwRGVwdGggPSAwOworICAgIHByaXZhdGUgU3RyaW5nW10gZlN0cmluZ3MgPSBuZXcgU3RyaW5nWzNdOworCisgICAgcHJpdmF0ZSBFcnJvckRpc3BhdGNoZXIgZXJyOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MRW5jb2RpbmdEZXRlY3RvcigpIHsKKyAgICAgICAgZlN5bWJvbFRhYmxlID0gbmV3IFN5bWJvbFRhYmxlKCk7CisgICAgICAgIGZDdXJyZW50RW50aXR5ID0gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdXRvZGV0ZWN0cyB0aGUgZW5jb2Rpbmcgb2YgdGhlIFhNTCBkb2N1bWVudCBzdXBwbGllZCBieSB0aGUgZ2l2ZW4KKyAgICAgKiBpbnB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBFbmNvZGluZyBhdXRvZGV0ZWN0aW9uIGlzIGRvbmUgYWNjb3JkaW5nIHRvIHRoZSBYTUwgMS4wIHNwZWNpZmljYXRpb24sCisgICAgICogQXBwZW5kaXggRi4xOiBEZXRlY3Rpb24gV2l0aG91dCBFeHRlcm5hbCBFbmNvZGluZyBJbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHdvLWVsZW1lbnQgYXJyYXksIHdoZXJlIHRoZSBmaXJzdCBlbGVtZW50IChvZiB0eXBlCisgICAgICogamF2YS5sYW5nLlN0cmluZykgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIChhdXRvKWRldGVjdGVkIGVuY29kaW5nLCBhbmQKKyAgICAgKiB0aGUgc2Vjb25kIGVsZW1lbnQgKG9mIHR5cGUgamF2YS5sYW5nLkJvb2xlYW4pIHNwZWNpZmllcyB3aGV0aGVyIHRoZSAKKyAgICAgKiBlbmNvZGluZyB3YXMgc3BlY2lmaWVkIHVzaW5nIHRoZSAnZW5jb2RpbmcnIGF0dHJpYnV0ZSBvZiBhbiBYTUwgcHJvbG9nCisgICAgICogKFRSVUUpIG9yIGF1dG9kZXRlY3RlZCAoRkFMU0UpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0W10gZ2V0RW5jb2RpbmcoU3RyaW5nIGZuYW1lLCBKYXJGaWxlIGphckZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc3BDb21waWxhdGlvbkNvbnRleHQgY3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yRGlzcGF0Y2hlciBlcnIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSmFzcGVyRXhjZXB0aW9uCisgICAgeworICAgICAgICBJbnB1dFN0cmVhbSBpblN0cmVhbSA9IEpzcFV0aWwuZ2V0SW5wdXRTdHJlYW0oZm5hbWUsIGphckZpbGUsIGN0eHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICBYTUxFbmNvZGluZ0RldGVjdG9yIGRldGVjdG9yID0gbmV3IFhNTEVuY29kaW5nRGV0ZWN0b3IoKTsKKyAgICAgICAgT2JqZWN0W10gcmV0ID0gZGV0ZWN0b3IuZ2V0RW5jb2RpbmcoaW5TdHJlYW0sIGVycik7CisgICAgICAgIGluU3RyZWFtLmNsb3NlKCk7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdFtdIGdldEVuY29kaW5nKElucHV0U3RyZWFtIGluLCBFcnJvckRpc3BhdGNoZXIgZXJyKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGhpcy5zdHJlYW0gPSBpbjsKKyAgICAgICAgdGhpcy5lcnI9ZXJyOworICAgICAgICBjcmVhdGVJbml0aWFsUmVhZGVyKCk7CisgICAgICAgIHNjYW5YTUxEZWNsKCk7CisJCisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10geyB0aGlzLmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odGhpcy5pc0VuY29kaW5nU2V0SW5Qcm9sb2cpIH07CisgICAgfQorICAgIAorICAgIC8vIHN0dWIgbWV0aG9kCisgICAgdm9pZCBlbmRFbnRpdHkoKSB7CisgICAgfQorICAgIAorICAgIC8vIEFkYXB0ZWQgZnJvbToKKyAgICAvLyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVudGl0eU1hbmFnZXIuc3RhcnRFbnRpdHkoKQorICAgIHByaXZhdGUgdm9pZCBjcmVhdGVJbml0aWFsUmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKYXNwZXJFeGNlcHRpb24geworCisJLy8gd3JhcCB0aGlzIHN0cmVhbSBpbiBSZXdpbmRhYmxlSW5wdXRTdHJlYW0KKwlzdHJlYW0gPSBuZXcgUmV3aW5kYWJsZUlucHV0U3RyZWFtKHN0cmVhbSk7CisKKwkvLyBwZXJmb3JtIGF1dG8tZGV0ZWN0IG9mIGVuY29kaW5nIGlmIG5lY2Vzc2FyeQorCWlmIChlbmNvZGluZyA9PSBudWxsKSB7CisJICAgIC8vIHJlYWQgZmlyc3QgZm91ciBieXRlcyBhbmQgZGV0ZXJtaW5lIGVuY29kaW5nCisJICAgIGZpbmFsIGJ5dGVbXSBiNCA9IG5ldyBieXRlWzRdOworCSAgICBpbnQgY291bnQgPSAwOworCSAgICBmb3IgKDsgY291bnQ8NDsgY291bnQrKyApIHsKKwkJYjRbY291bnRdID0gKGJ5dGUpc3RyZWFtLnJlYWQoKTsKKwkgICAgfQorCSAgICBpZiAoY291bnQgPT0gNCkgeworCQlPYmplY3QgW10gZW5jb2RpbmdEZXNjID0gZ2V0RW5jb2RpbmdOYW1lKGI0LCBjb3VudCk7CisJCWVuY29kaW5nID0gKFN0cmluZykoZW5jb2RpbmdEZXNjWzBdKTsKKwkJaXNCaWdFbmRpYW4gPSAoQm9vbGVhbikoZW5jb2RpbmdEZXNjWzFdKTsKKworCQlzdHJlYW0ucmVzZXQoKTsKKwkJLy8gU3BlY2lhbCBjYXNlIFVURi04IGZpbGVzIHdpdGggQk9NIGNyZWF0ZWQgYnkgTWljcm9zb2Z0CisJCS8vIHRvb2xzLiBJdCdzIG1vcmUgZWZmaWNpZW50IHRvIGNvbnN1bWUgdGhlIEJPTSB0aGFuIG1ha2UKKwkJLy8gdGhlIHJlYWRlciBwZXJmb3JtIGV4dHJhIGNoZWNrcy4gLUFjCisJCWlmIChjb3VudCA+IDIgJiYgZW5jb2RpbmcuZXF1YWxzKCJVVEYtOCIpKSB7CisJCSAgICBpbnQgYjAgPSBiNFswXSAmIDB4RkY7CisJCSAgICBpbnQgYjEgPSBiNFsxXSAmIDB4RkY7CisJCSAgICBpbnQgYjIgPSBiNFsyXSAmIDB4RkY7CisJCSAgICBpZiAoYjAgPT0gMHhFRiAmJiBiMSA9PSAweEJCICYmIGIyID09IDB4QkYpIHsKKwkJCS8vIGlnbm9yZSBmaXJzdCB0aHJlZSBieXRlcy4uLgorCQkJc3RyZWFtLnNraXAoMyk7CisJCSAgICB9CisJCX0KKwkJcmVhZGVyID0gY3JlYXRlUmVhZGVyKHN0cmVhbSwgZW5jb2RpbmcsIGlzQmlnRW5kaWFuKTsKKwkgICAgfSBlbHNlIHsKKwkJcmVhZGVyID0gY3JlYXRlUmVhZGVyKHN0cmVhbSwgZW5jb2RpbmcsIGlzQmlnRW5kaWFuKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvLyBBZGFwdGVkIGZyb206CisgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFbnRpdHlNYW5hZ2VyLmNyZWF0ZVJlYWRlcgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSByZWFkZXIgY2FwYWJsZSBvZiByZWFkaW5nIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gaW4KKyAgICAgKiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0U3RyZWFtICBUaGUgaW5wdXQgc3RyZWFtLgorICAgICAqIEBwYXJhbSBlbmNvZGluZyAgICAgVGhlIGVuY29kaW5nIG5hbWUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICBlbmNvZGVkIHVzaW5nLiBJZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIHRoYXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIEphdmEgZW5jb2RpbmcgbmFtZXMgYXJlIGFsbG93ZWQsIHRoZW4gdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyBuYW1lIG1heSBiZSBhIEphdmEgZW5jb2RpbmcgbmFtZTsKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSwgaXQgaXMgYW4gaWFuYUVuY29kaW5nIG5hbWUuCisgICAgICogQHBhcmFtIGlzQmlnRW5kaWFuICAgRm9yIGVuY29kaW5ncyAobGlrZSB1Q1MtNCksIHdob3NlIG5hbWVzIGNhbm5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgYSBieXRlIG9yZGVyLCB0aGlzIHRlbGxzIHdoZXRoZXIgdGhlIG9yZGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaXMgYmlnRW5kaWFuLiBudWxsIG1lYW5zIHVua25vd24gb3Igbm90IHJlbGV2YW50LgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgcmVhZGVyLgorICAgICAqLworICAgIHByaXZhdGUgUmVhZGVyIGNyZWF0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgU3RyaW5nIGVuY29kaW5nLAorCQkJCUJvb2xlYW4gaXNCaWdFbmRpYW4pCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIC8vIG5vcm1hbGl6ZSBlbmNvZGluZyBuYW1lCisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICBlbmNvZGluZyA9ICJVVEYtOCI7CisgICAgICAgIH0KKworICAgICAgICAvLyB0cnkgdG8gdXNlIGFuIG9wdGltaXplZCByZWFkZXIKKyAgICAgICAgU3RyaW5nIEVOQ09ESU5HID0gZW5jb2RpbmcudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpOworICAgICAgICBpZiAoRU5DT0RJTkcuZXF1YWxzKCJVVEYtOCIpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVURjhSZWFkZXIoaW5wdXRTdHJlYW0sIGZCdWZmZXJTaXplKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoRU5DT0RJTkcuZXF1YWxzKCJVUy1BU0NJSSIpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFTQ0lJUmVhZGVyKGlucHV0U3RyZWFtLCBmQnVmZmVyU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEVOQ09ESU5HLmVxdWFscygiSVNPLTEwNjQ2LVVDUy00IikpIHsKKyAgICAgICAgICAgIGlmIChpc0JpZ0VuZGlhbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0JFID0gaXNCaWdFbmRpYW4uYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKGlzQkUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVQ1NSZWFkZXIoaW5wdXRTdHJlYW0sIFVDU1JlYWRlci5VQ1M0QkUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVUNTUmVhZGVyKGlucHV0U3RyZWFtLCBVQ1NSZWFkZXIuVUNTNExFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC5lbmNvZGluZ0J5dGVPcmRlclVuc3VwcG9ydGVkIiwKKwkJCSAgICAgZW5jb2RpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChFTkNPRElORy5lcXVhbHMoIklTTy0xMDY0Ni1VQ1MtMiIpKSB7CisgICAgICAgICAgICBpZiAoaXNCaWdFbmRpYW4gIT0gbnVsbCkgeyAvLyBzb3VsZCBuZXZlciBoYXBwZW4gd2l0aCB0aGlzIGVuY29kaW5nLi4uCisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0JFID0gaXNCaWdFbmRpYW4uYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKGlzQkUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVQ1NSZWFkZXIoaW5wdXRTdHJlYW0sIFVDU1JlYWRlci5VQ1MyQkUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVUNTUmVhZGVyKGlucHV0U3RyZWFtLCBVQ1NSZWFkZXIuVUNTMkxFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC5lbmNvZGluZ0J5dGVPcmRlclVuc3VwcG9ydGVkIiwKKwkJCSAgICAgZW5jb2RpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgZm9yIHZhbGlkIG5hbWUKKyAgICAgICAgYm9vbGVhbiB2YWxpZElBTkEgPSBYTUxDaGFyLmlzVmFsaWRJQU5BRW5jb2RpbmcoZW5jb2RpbmcpOworICAgICAgICBib29sZWFuIHZhbGlkSmF2YSA9IFhNTENoYXIuaXNWYWxpZEphdmFFbmNvZGluZyhlbmNvZGluZyk7CisgICAgICAgIGlmICghdmFsaWRJQU5BIHx8IChmQWxsb3dKYXZhRW5jb2RpbmdzICYmICF2YWxpZEphdmEpKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci54bWwuZW5jb2RpbmdEZWNsSW52YWxpZCIsIGVuY29kaW5nKTsKKyAgICAgICAgICAgIC8vIE5PVEU6IEFuZHlIIHN1Z2dlc3RlZCB0aGF0LCBvbiBmYWlsdXJlLCB3ZSB1c2UgSVNPIExhdGluIDEKKyAgICAgICAgICAgIC8vICAgICAgIGJlY2F1c2UgZXZlcnkgYnl0ZSBpcyBhIHZhbGlkIElTTyBMYXRpbiAxIGNoYXJhY3Rlci4KKyAgICAgICAgICAgIC8vICAgICAgIEl0IG1heSBub3QgdHJhbnNsYXRlIGNvcnJlY3RseSBidXQgaWYgd2UgZmFpbGVkIG9uCisgICAgICAgICAgICAvLyAgICAgICB0aGUgZW5jb2RpbmcgYW55d2F5LCB0aGVuIHdlJ3JlIGV4cGVjdGluZyB0aGUgY29udGVudAorICAgICAgICAgICAgLy8gICAgICAgb2YgdGhlIGRvY3VtZW50IHRvIGJlIGJhZC4gVGhpcyB3aWxsIGp1c3QgcHJldmVudCBhbgorICAgICAgICAgICAgLy8gICAgICAgaW52YWxpZCBVVEYtOCBzZXF1ZW5jZSB0byBiZSBkZXRlY3RlZC4gVGhpcyBpcyBvbmx5CisgICAgICAgICAgICAvLyAgICAgICBpbXBvcnRhbnQgd2hlbiBjb250aW51ZS1hZnRlci1mYXRhbC1lcnJvciBpcyB0dXJuZWQKKyAgICAgICAgICAgIC8vICAgICAgIG9uLiAtQWMKKyAgICAgICAgICAgIGVuY29kaW5nID0gIklTTy04ODU5LTEiOworICAgICAgICB9CisKKyAgICAgICAgLy8gdHJ5IHRvIHVzZSBhIEphdmEgcmVhZGVyCisgICAgICAgIFN0cmluZyBqYXZhRW5jb2RpbmcgPSBFbmNvZGluZ01hcC5nZXRJQU5BMkphdmFNYXBwaW5nKEVOQ09ESU5HKTsKKyAgICAgICAgaWYgKGphdmFFbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZkFsbG93SmF2YUVuY29kaW5ncykgeworCQlqYXZhRW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLmVuY29kaW5nRGVjbEludmFsaWQiLCBlbmNvZGluZyk7CisgICAgICAgICAgICAgICAgLy8gc2VlIGNvbW1lbnQgYWJvdmUuCisgICAgICAgICAgICAgICAgamF2YUVuY29kaW5nID0gIklTTzg4NTlfMSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSwgamF2YUVuY29kaW5nKTsKKworICAgIH0gLy8gY3JlYXRlUmVhZGVyKElucHV0U3RyZWFtLFN0cmluZywgQm9vbGVhbik6IFJlYWRlcgorCisgICAgLy8gQWRhcHRlZCBmcm9tOgorICAgIC8vIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRW50aXR5TWFuYWdlci5nZXRFbmNvZGluZ05hbWUKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBJQU5BIGVuY29kaW5nIG5hbWUgdGhhdCBpcyBhdXRvLWRldGVjdGVkIGZyb20KKyAgICAgKiB0aGUgYnl0ZXMgc3BlY2lmaWVkLCB3aXRoIHRoZSBlbmRpYW4tbmVzcyBvZiB0aGF0IGVuY29kaW5nIHdoZXJlCisgICAgICogYXBwcm9wcmlhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYjQgICAgVGhlIGZpcnN0IGZvdXIgYnl0ZXMgb2YgdGhlIGlucHV0LgorICAgICAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQuCisgICAgICogQHJldHVybiBhIDItZWxlbWVudCBhcnJheTogIHRoZSBmaXJzdCBlbGVtZW50LCBhbiBJQU5BLWVuY29kaW5nIHN0cmluZywKKyAgICAgKiAgdGhlIHNlY29uZCBlbGVtZW50IGEgQm9vbGVhbiB3aGljaCBpcyB0cnVlIGlmZiB0aGUgZG9jdW1lbnQgaXMgYmlnCisgICAgICogIGVuZGlhbiwgZmFsc2UgaWYgaXQncyBsaXR0bGUtZW5kaWFuLCBhbmQgbnVsbCBpZiB0aGUgZGlzdGluY3Rpb24gaXNuJ3QKKyAgICAgKiAgcmVsZXZhbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3RbXSBnZXRFbmNvZGluZ05hbWUoYnl0ZVtdIGI0LCBpbnQgY291bnQpIHsKKworICAgICAgICBpZiAoY291bnQgPCAyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdeyJVVEYtOCIsIG51bGx9OworICAgICAgICB9CisKKyAgICAgICAgLy8gVVRGLTE2LCB3aXRoIEJPTQorICAgICAgICBpbnQgYjAgPSBiNFswXSAmIDB4RkY7CisgICAgICAgIGludCBiMSA9IGI0WzFdICYgMHhGRjsKKyAgICAgICAgaWYgKGIwID09IDB4RkUgJiYgYjEgPT0gMHhGRikgeworICAgICAgICAgICAgLy8gVVRGLTE2LCBiaWctZW5kaWFuCisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdCBbXSB7IlVURi0xNkJFIiwgbmV3IEJvb2xlYW4odHJ1ZSl9OworICAgICAgICB9CisgICAgICAgIGlmIChiMCA9PSAweEZGICYmIGIxID09IDB4RkUpIHsKKyAgICAgICAgICAgIC8vIFVURi0xNiwgbGl0dGxlLWVuZGlhbgorICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3QgW10geyJVVEYtMTZMRSIsIG5ldyBCb29sZWFuKGZhbHNlKX07CisgICAgICAgIH0KKworICAgICAgICAvLyBkZWZhdWx0IHRvIFVURi04IGlmIHdlIGRvbid0IGhhdmUgZW5vdWdoIGJ5dGVzIHRvIG1ha2UgYQorICAgICAgICAvLyBnb29kIGRldGVybWluYXRpb24gb2YgdGhlIGVuY29kaW5nCisgICAgICAgIGlmIChjb3VudCA8IDMpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0IFtdIHsiVVRGLTgiLCBudWxsfTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVURi04IHdpdGggYSBCT00KKyAgICAgICAgaW50IGIyID0gYjRbMl0gJiAweEZGOworICAgICAgICBpZiAoYjAgPT0gMHhFRiAmJiBiMSA9PSAweEJCICYmIGIyID09IDB4QkYpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0IFtdIHsiVVRGLTgiLCBudWxsfTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlZmF1bHQgdG8gVVRGLTggaWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggYnl0ZXMgdG8gbWFrZSBhCisgICAgICAgIC8vIGdvb2QgZGV0ZXJtaW5hdGlvbiBvZiB0aGUgZW5jb2RpbmcKKyAgICAgICAgaWYgKGNvdW50IDwgNCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3QgW10geyJVVEYtOCIsIG51bGx9OworICAgICAgICB9CisKKyAgICAgICAgLy8gb3RoZXIgZW5jb2RpbmdzCisgICAgICAgIGludCBiMyA9IGI0WzNdICYgMHhGRjsKKyAgICAgICAgaWYgKGIwID09IDB4MDAgJiYgYjEgPT0gMHgwMCAmJiBiMiA9PSAweDAwICYmIGIzID09IDB4M0MpIHsKKyAgICAgICAgICAgIC8vIFVDUy00LCBiaWcgZW5kaWFuICgxMjM0KQorICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3QgW10geyJJU08tMTA2NDYtVUNTLTQiLCBuZXcgQm9vbGVhbih0cnVlKX07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGIwID09IDB4M0MgJiYgYjEgPT0gMHgwMCAmJiBiMiA9PSAweDAwICYmIGIzID09IDB4MDApIHsKKyAgICAgICAgICAgIC8vIFVDUy00LCBsaXR0bGUgZW5kaWFuICg0MzIxKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3QgW10geyJJU08tMTA2NDYtVUNTLTQiLCBuZXcgQm9vbGVhbihmYWxzZSl9OworICAgICAgICB9CisgICAgICAgIGlmIChiMCA9PSAweDAwICYmIGIxID09IDB4MDAgJiYgYjIgPT0gMHgzQyAmJiBiMyA9PSAweDAwKSB7CisgICAgICAgICAgICAvLyBVQ1MtNCwgdW51c3VhbCBvY3RldCBvcmRlciAoMjE0MykKKyAgICAgICAgICAgIC8vIFJFVklTSVQ6IFdoYXQgc2hvdWxkIHRoaXMgYmU/CisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdCBbXSB7IklTTy0xMDY0Ni1VQ1MtNCIsIG51bGx9OworICAgICAgICB9CisgICAgICAgIGlmIChiMCA9PSAweDAwICYmIGIxID09IDB4M0MgJiYgYjIgPT0gMHgwMCAmJiBiMyA9PSAweDAwKSB7CisgICAgICAgICAgICAvLyBVQ1MtNCwgdW51c3VhbCBvY3RlY3Qgb3JkZXIgKDM0MTIpCisgICAgICAgICAgICAvLyBSRVZJU0lUOiBXaGF0IHNob3VsZCB0aGlzIGJlPworICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3QgW10geyJJU08tMTA2NDYtVUNTLTQiLCBudWxsfTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYjAgPT0gMHgwMCAmJiBiMSA9PSAweDNDICYmIGIyID09IDB4MDAgJiYgYjMgPT0gMHgzRikgeworICAgICAgICAgICAgLy8gVVRGLTE2LCBiaWctZW5kaWFuLCBubyBCT00KKyAgICAgICAgICAgIC8vIChvciBjb3VsZCB0dXJuIG91dCB0byBiZSBVQ1MtMi4uLgorICAgICAgICAgICAgLy8gUkVWSVNJVDogV2hhdCBzaG91bGQgdGhpcyBiZT8KKyAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0IFtdIHsiVVRGLTE2QkUiLCBuZXcgQm9vbGVhbih0cnVlKX07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGIwID09IDB4M0MgJiYgYjEgPT0gMHgwMCAmJiBiMiA9PSAweDNGICYmIGIzID09IDB4MDApIHsKKyAgICAgICAgICAgIC8vIFVURi0xNiwgbGl0dGxlLWVuZGlhbiwgbm8gQk9NCisgICAgICAgICAgICAvLyAob3IgY291bGQgdHVybiBvdXQgdG8gYmUgVUNTLTIuLi4KKyAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0IFtdIHsiVVRGLTE2TEUiLCBuZXcgQm9vbGVhbihmYWxzZSl9OworICAgICAgICB9CisgICAgICAgIGlmIChiMCA9PSAweDRDICYmIGIxID09IDB4NkYgJiYgYjIgPT0gMHhBNyAmJiBiMyA9PSAweDk0KSB7CisgICAgICAgICAgICAvLyBFQkNESUMKKyAgICAgICAgICAgIC8vIGEgbGEgeGVyY2VzMSwgcmV0dXJuIENQMDM3IGluc3RlYWQgb2YgRUJDRElDIGhlcmUKKyAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0IFtdIHsiQ1AwMzciLCBudWxsfTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlZmF1bHQgZW5jb2RpbmcKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3QgW10geyJVVEYtOCIsIG51bGx9OworCisgICAgfQorCisgICAgLy8gQWRhcHRlZCBmcm9tOgorICAgIC8vIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRW50aXR5TWFuYWdlci5FbnRpdHlTY2FubmVyLmlzRXh0ZXJuYWwKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGVudGl0eSBiZWluZyBzY2FubmVkIGlzIGV4dGVybmFsLiAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoKSB7CisJcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gQWRhcHRlZCBmcm9tOgorICAgIC8vIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRW50aXR5TWFuYWdlci5FbnRpdHlTY2FubmVyLnBlZWtDaGFyCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgb24gdGhlIGlucHV0LgorICAgICAqIDxwPgorICAgICAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIGNoYXJhY3RlciBpcyA8ZW0+bm90PC9lbT4gY29uc3VtZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBUaHJvd24gaWYgaS9vIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbiBUaHJvd24gb24gZW5kIG9mIGZpbGUuCisgICAgICovCisgICAgcHVibGljIGludCBwZWVrQ2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCisJLy8gbG9hZCBtb3JlIGNoYXJhY3RlcnMsIGlmIG5lZWRlZAorCWlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCSAgICBsb2FkKDAsIHRydWUpOworCX0KKwkKKwkvLyBwZWVrIGF0IGNoYXJhY3RlcgorCWludCBjID0gZkN1cnJlbnRFbnRpdHkuY2hbZkN1cnJlbnRFbnRpdHkucG9zaXRpb25dOworCisJLy8gcmV0dXJuIHBlZWtlZCBjaGFyYWN0ZXIKKwlpZiAoZkN1cnJlbnRFbnRpdHkuaXNFeHRlcm5hbCgpKSB7CisJICAgIHJldHVybiBjICE9ICdccicgPyBjIDogJ1xuJzsKKwl9CisJZWxzZSB7CisJICAgIHJldHVybiBjOworCX0KKwkKKyAgICB9IC8vIHBlZWtDaGFyKCk6aW50CisgICAgCisgICAgLy8gQWRhcHRlZCBmcm9tOgorICAgIC8vIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRW50aXR5TWFuYWdlci5FbnRpdHlTY2FubmVyLnNjYW5DaGFyCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgb24gdGhlIGlucHV0LgorICAgICAqIDxwPgorICAgICAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIGNoYXJhY3RlciBpcyBjb25zdW1lZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIFRocm93biBpZiBpL28gZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uIFRocm93biBvbiBlbmQgb2YgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNjYW5DaGFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCS8vIGxvYWQgbW9yZSBjaGFyYWN0ZXJzLCBpZiBuZWVkZWQKKwlpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQpIHsKKwkgICAgbG9hZCgwLCB0cnVlKTsKKwl9CisKKwkvLyBzY2FuIGNoYXJhY3RlcgorCWludCBjID0gZkN1cnJlbnRFbnRpdHkuY2hbZkN1cnJlbnRFbnRpdHkucG9zaXRpb24rK107CisJYm9vbGVhbiBleHRlcm5hbCA9IGZhbHNlOworCWlmIChjID09ICdcbicgfHwKKwkgICAgKGMgPT0gJ1xyJyAmJiAoZXh0ZXJuYWwgPSBmQ3VycmVudEVudGl0eS5pc0V4dGVybmFsKCkpKSkgeworCSAgICBmQ3VycmVudEVudGl0eS5saW5lTnVtYmVyKys7CisJICAgIGZDdXJyZW50RW50aXR5LmNvbHVtbk51bWJlciA9IDE7CisJICAgIGlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCQlmQ3VycmVudEVudGl0eS5jaFswXSA9IChjaGFyKWM7CisJCWxvYWQoMSwgZmFsc2UpOworCSAgICB9CisJICAgIGlmIChjID09ICdccicgJiYgZXh0ZXJuYWwpIHsKKwkJaWYgKGZDdXJyZW50RW50aXR5LmNoW2ZDdXJyZW50RW50aXR5LnBvc2l0aW9uKytdICE9ICdcbicpIHsKKwkJICAgIGZDdXJyZW50RW50aXR5LnBvc2l0aW9uLS07CisJCX0KKwkJYyA9ICdcbic7CisJICAgIH0KKwl9CisKKwkvLyByZXR1cm4gY2hhcmFjdGVyIHRoYXQgd2FzIHNjYW5uZWQKKwlmQ3VycmVudEVudGl0eS5jb2x1bW5OdW1iZXIrKzsKKwlyZXR1cm4gYzsKKwkKKyAgICB9CisKKyAgICAvLyBBZGFwdGVkIGZyb206CisgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFbnRpdHlNYW5hZ2VyLkVudGl0eVNjYW5uZXIuc2Nhbk5hbWUKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIG1hdGNoaW5nIHRoZSBOYW1lIHByb2R1Y3Rpb24gYXBwZWFyaW5nIGltbWVkaWF0ZWx5CisgICAgICogb24gdGhlIGlucHV0IGFzIGEgc3ltYm9sLCBvciBudWxsIGlmIG5vIE5hbWUgc3RyaW5nIGlzIHByZXNlbnQuCisgICAgICogPHA+CisgICAgICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgTmFtZSBjaGFyYWN0ZXJzIGFyZSBjb25zdW1lZC4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBzdHJpbmcgcmV0dXJuZWQgbXVzdCBiZSBhIHN5bWJvbC4gVGhlCisgICAgICogU3ltYm9sVGFibGUgY2FuIGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIFRocm93biBpZiBpL28gZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uIFRocm93biBvbiBlbmQgb2YgZmlsZS4KKyAgICAgKgorICAgICAqIEBzZWUgU3ltYm9sVGFibGUKKyAgICAgKiBAc2VlIFhNTENoYXIjaXNOYW1lCisgICAgICogQHNlZSBYTUxDaGFyI2lzTmFtZVN0YXJ0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzY2FuTmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCisJLy8gbG9hZCBtb3JlIGNoYXJhY3RlcnMsIGlmIG5lZWRlZAorCWlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCSAgICBsb2FkKDAsIHRydWUpOworCX0KKwkKKwkvLyBzY2FuIG5hbWUKKwlpbnQgb2Zmc2V0ID0gZkN1cnJlbnRFbnRpdHkucG9zaXRpb247CisJaWYgKFhNTENoYXIuaXNOYW1lU3RhcnQoZkN1cnJlbnRFbnRpdHkuY2hbb2Zmc2V0XSkpIHsKKwkgICAgaWYgKCsrZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQpIHsKKwkJZkN1cnJlbnRFbnRpdHkuY2hbMF0gPSBmQ3VycmVudEVudGl0eS5jaFtvZmZzZXRdOworCQlvZmZzZXQgPSAwOworCQlpZiAobG9hZCgxLCBmYWxzZSkpIHsKKwkJICAgIGZDdXJyZW50RW50aXR5LmNvbHVtbk51bWJlcisrOworCQkgICAgU3RyaW5nIHN5bWJvbCA9IGZTeW1ib2xUYWJsZS5hZGRTeW1ib2woZkN1cnJlbnRFbnRpdHkuY2gsCisJCQkJCQkJICAgMCwgMSk7CisJCSAgICByZXR1cm4gc3ltYm9sOworCQl9CisJICAgIH0KKwkgICAgd2hpbGUgKFhNTENoYXIuaXNOYW1lKGZDdXJyZW50RW50aXR5LmNoW2ZDdXJyZW50RW50aXR5LnBvc2l0aW9uXSkpIHsKKwkJaWYgKCsrZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQpIHsKKwkJICAgIGludCBsZW5ndGggPSBmQ3VycmVudEVudGl0eS5wb3NpdGlvbiAtIG9mZnNldDsKKwkJICAgIGlmIChsZW5ndGggPT0gZkJ1ZmZlclNpemUpIHsKKwkJCS8vIGJhZCBsdWNrIHdlIGhhdmUgdG8gcmVzaXplIG91ciBidWZmZXIKKwkJCWNoYXJbXSB0bXAgPSBuZXcgY2hhcltmQnVmZmVyU2l6ZSAqIDJdOworCQkJU3lzdGVtLmFycmF5Y29weShmQ3VycmVudEVudGl0eS5jaCwgb2Zmc2V0LAorCQkJCQkgdG1wLCAwLCBsZW5ndGgpOworCQkJZkN1cnJlbnRFbnRpdHkuY2ggPSB0bXA7CisJCQlmQnVmZmVyU2l6ZSAqPSAyOworCQkgICAgfSBlbHNlIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoZkN1cnJlbnRFbnRpdHkuY2gsIG9mZnNldCwKKwkJCQkJIGZDdXJyZW50RW50aXR5LmNoLCAwLCBsZW5ndGgpOworCQkgICAgfQorCQkgICAgb2Zmc2V0ID0gMDsKKwkJICAgIGlmIChsb2FkKGxlbmd0aCwgZmFsc2UpKSB7CisJCQlicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCWludCBsZW5ndGggPSBmQ3VycmVudEVudGl0eS5wb3NpdGlvbiAtIG9mZnNldDsKKwlmQ3VycmVudEVudGl0eS5jb2x1bW5OdW1iZXIgKz0gbGVuZ3RoOworCisJLy8gcmV0dXJuIG5hbWUKKwlTdHJpbmcgc3ltYm9sID0gbnVsbDsKKwlpZiAobGVuZ3RoID4gMCkgeworCSAgICBzeW1ib2wgPSBmU3ltYm9sVGFibGUuYWRkU3ltYm9sKGZDdXJyZW50RW50aXR5LmNoLCBvZmZzZXQsIGxlbmd0aCk7CisJfQorCXJldHVybiBzeW1ib2w7CisJCisgICAgfQorCisgICAgLy8gQWRhcHRlZCBmcm9tOgorICAgIC8vIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRW50aXR5TWFuYWdlci5FbnRpdHlTY2FubmVyLnNjYW5MaXRlcmFsCisgICAgLyoqCisgICAgICogU2NhbnMgYSByYW5nZSBvZiBhdHRyaWJ1dGUgdmFsdWUgZGF0YSwgc2V0dGluZyB0aGUgZmllbGRzIG9mIHRoZQorICAgICAqIFhNTFN0cmluZyBzdHJ1Y3R1cmUsIGFwcHJvcHJpYXRlbHkuCisgICAgICogPHA+CisgICAgICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgY2hhcmFjdGVycyBhcmUgY29uc3VtZWQuCisgICAgICogPHA+CisgICAgICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBndWFyYW50ZWUgdG8gcmV0dXJuCisgICAgICogdGhlIGxvbmdlc3QgcnVuIG9mIGF0dHJpYnV0ZSB2YWx1ZSBkYXRhLiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuCisgICAgICogYmVmb3JlIHRoZSBxdW90ZSBjaGFyYWN0ZXIgZHVlIHRvIHJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIGlucHV0CisgICAgICogYnVmZmVyIG9yIGFueSBvdGhlciByZWFzb24uCisgICAgICogPHA+CisgICAgICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgZmllbGRzIGNvbnRhaW5lZCBpbiB0aGUgWE1MU3RyaW5nCisgICAgICogc3RydWN0dXJlIGFyZSBub3QgZ3VhcmFudGVlZCB0byByZW1haW4gdmFsaWQgdXBvbiBzdWJzZXF1ZW50IGNhbGxzCisgICAgICogdG8gdGhlIGVudGl0eSBzY2FubmVyLiBUaGVyZWZvcmUsIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCisgICAgICogaW1tZWRpYXRlbHkgdXNpbmcgdGhlIHJldHVybmVkIGNoYXJhY3RlciBkYXRhIG9yIG1ha2luZyBhIGNvcHkgb2YKKyAgICAgKiB0aGUgY2hhcmFjdGVyIGRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcXVvdGUgICBUaGUgcXVvdGUgY2hhcmFjdGVyIHRoYXQgc2lnbmlmaWVzIHRoZSBlbmQgb2YgdGhlCisgICAgICogICAgICAgICAgICAgICAgYXR0cmlidXRlIHZhbHVlIGRhdGEuCisgICAgICogQHBhcmFtIGNvbnRlbnQgVGhlIGNvbnRlbnQgc3RydWN0dXJlIHRvIGZpbGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5leHQgY2hhcmFjdGVyIG9uIHRoZSBpbnB1dCwgaWYga25vd24uIFRoaXMKKyAgICAgKiAgICAgICAgIHZhbHVlIG1heSBiZSAtMSBidXQgdGhpcyBkb2VzIDxlbT5ub3RlPC9lbT4gZGVzaWduYXRlCisgICAgICogICAgICAgICBlbmQgb2YgZmlsZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIFRocm93biBpZiBpL28gZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uIFRocm93biBvbiBlbmQgb2YgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNjYW5MaXRlcmFsKGludCBxdW90ZSwgWE1MU3RyaW5nIGNvbnRlbnQpCisJdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCS8vIGxvYWQgbW9yZSBjaGFyYWN0ZXJzLCBpZiBuZWVkZWQKKwlpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQpIHsKKwkgICAgbG9hZCgwLCB0cnVlKTsKKwl9IGVsc2UgaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID09IGZDdXJyZW50RW50aXR5LmNvdW50IC0gMSkgeworCSAgICBmQ3VycmVudEVudGl0eS5jaFswXSA9IGZDdXJyZW50RW50aXR5LmNoW2ZDdXJyZW50RW50aXR5LmNvdW50IC0gMV07CisJICAgIGxvYWQoMSwgZmFsc2UpOworCSAgICBmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9IDA7CisJfQorCisJLy8gbm9ybWFsaXplIG5ld2xpbmVzCisJaW50IG9mZnNldCA9IGZDdXJyZW50RW50aXR5LnBvc2l0aW9uOworCWludCBjID0gZkN1cnJlbnRFbnRpdHkuY2hbb2Zmc2V0XTsKKwlpbnQgbmV3bGluZXMgPSAwOworCWJvb2xlYW4gZXh0ZXJuYWwgPSBmQ3VycmVudEVudGl0eS5pc0V4dGVybmFsKCk7CisJaWYgKGMgPT0gJ1xuJyB8fCAoYyA9PSAnXHInICYmIGV4dGVybmFsKSkgeworCSAgICBkbyB7CisJCWMgPSBmQ3VycmVudEVudGl0eS5jaFtmQ3VycmVudEVudGl0eS5wb3NpdGlvbisrXTsKKwkJaWYgKGMgPT0gJ1xyJyAmJiBleHRlcm5hbCkgeworCQkgICAgbmV3bGluZXMrKzsKKwkJICAgIGZDdXJyZW50RW50aXR5LmxpbmVOdW1iZXIrKzsKKwkJICAgIGZDdXJyZW50RW50aXR5LmNvbHVtbk51bWJlciA9IDE7CisJCSAgICBpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQpIHsKKwkJCW9mZnNldCA9IDA7CisJCQlmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9IG5ld2xpbmVzOworCQkJaWYgKGxvYWQobmV3bGluZXMsIGZhbHNlKSkgeworCQkJICAgIGJyZWFrOworCQkJfQorCQkgICAgfQorCQkgICAgaWYgKGZDdXJyZW50RW50aXR5LmNoW2ZDdXJyZW50RW50aXR5LnBvc2l0aW9uXSA9PSAnXG4nKSB7CisJCQlmQ3VycmVudEVudGl0eS5wb3NpdGlvbisrOworCQkJb2Zmc2V0Kys7CisJCSAgICB9CisJCSAgICAvKioqIE5FV0xJTkUgTk9STUFMSVpBVElPTiAqKiovCisJCSAgICBlbHNlIHsKKwkJCW5ld2xpbmVzKys7CisJCSAgICB9CisJCSAgICAvKioqLworCQl9CisJCWVsc2UgaWYgKGMgPT0gJ1xuJykgeworCQkgICAgbmV3bGluZXMrKzsKKwkJICAgIGZDdXJyZW50RW50aXR5LmxpbmVOdW1iZXIrKzsKKwkJICAgIGZDdXJyZW50RW50aXR5LmNvbHVtbk51bWJlciA9IDE7CisJCSAgICBpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQpIHsKKwkJCW9mZnNldCA9IDA7CisJCQlmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9IG5ld2xpbmVzOworCQkJaWYgKGxvYWQobmV3bGluZXMsIGZhbHNlKSkgeworCQkJICAgIGJyZWFrOworCQkJfQorCQkgICAgfQorCQkgICAgLyoqKiBORVdMSU5FIE5PUk1BTElaQVRJT04gKioqCisJCQkgaWYgKGZDdXJyZW50RW50aXR5LmNoW2ZDdXJyZW50RW50aXR5LnBvc2l0aW9uXSA9PSAnXHInCisJCQkgJiYgZXh0ZXJuYWwpIHsKKwkJCSBmQ3VycmVudEVudGl0eS5wb3NpdGlvbisrOworCQkJIG9mZnNldCsrOworCQkJIH0KKwkJCSAvKioqLworCQl9CisJCWVsc2UgeworCQkgICAgZkN1cnJlbnRFbnRpdHkucG9zaXRpb24tLTsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0gd2hpbGUgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uIDwgZkN1cnJlbnRFbnRpdHkuY291bnQgLSAxKTsKKwkgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGZDdXJyZW50RW50aXR5LnBvc2l0aW9uOyBpKyspIHsKKwkJZkN1cnJlbnRFbnRpdHkuY2hbaV0gPSAnXG4nOworCSAgICB9CisJICAgIGludCBsZW5ndGggPSBmQ3VycmVudEVudGl0eS5wb3NpdGlvbiAtIG9mZnNldDsKKwkgICAgaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID09IGZDdXJyZW50RW50aXR5LmNvdW50IC0gMSkgeworCQljb250ZW50LnNldFZhbHVlcyhmQ3VycmVudEVudGl0eS5jaCwgb2Zmc2V0LCBsZW5ndGgpOworCQlyZXR1cm4gLTE7CisJICAgIH0KKwl9CisKKwkvLyBzY2FuIGxpdGVyYWwgdmFsdWUKKwl3aGlsZSAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPCBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCSAgICBjID0gZkN1cnJlbnRFbnRpdHkuY2hbZkN1cnJlbnRFbnRpdHkucG9zaXRpb24rK107CisJICAgIGlmICgoYyA9PSBxdW90ZSAmJgorCQkgKCFmQ3VycmVudEVudGl0eS5saXRlcmFsIHx8IGV4dGVybmFsKSkKKwkJfHwgYyA9PSAnJScgfHwgIVhNTENoYXIuaXNDb250ZW50KGMpKSB7CisJCWZDdXJyZW50RW50aXR5LnBvc2l0aW9uLS07CisJCWJyZWFrOworCSAgICB9CisJfQorCWludCBsZW5ndGggPSBmQ3VycmVudEVudGl0eS5wb3NpdGlvbiAtIG9mZnNldDsKKwlmQ3VycmVudEVudGl0eS5jb2x1bW5OdW1iZXIgKz0gbGVuZ3RoIC0gbmV3bGluZXM7CisJY29udGVudC5zZXRWYWx1ZXMoZkN1cnJlbnRFbnRpdHkuY2gsIG9mZnNldCwgbGVuZ3RoKTsKKworCS8vIHJldHVybiBuZXh0IGNoYXJhY3RlcgorCWlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiAhPSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCSAgICBjID0gZkN1cnJlbnRFbnRpdHkuY2hbZkN1cnJlbnRFbnRpdHkucG9zaXRpb25dOworCSAgICAvLyBOT1RFOiBXZSBkb24ndCB3YW50IHRvIGFjY2lkZW50YWxseSBzaWduYWwgdGhlCisJICAgIC8vICAgICAgIGVuZCBvZiB0aGUgbGl0ZXJhbCBpZiB3ZSdyZSBleHBhbmRpbmcgYW4KKwkgICAgLy8gICAgICAgZW50aXR5IGFwcGVhcmluZyBpbiB0aGUgbGl0ZXJhbC4gLUFjCisJICAgIGlmIChjID09IHF1b3RlICYmIGZDdXJyZW50RW50aXR5LmxpdGVyYWwpIHsKKwkJYyA9IC0xOworCSAgICB9CisJfQorCWVsc2UgeworCSAgICBjID0gLTE7CisJfQorCXJldHVybiBjOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2NhbnMgYSByYW5nZSBvZiBjaGFyYWN0ZXIgZGF0YSB1cCB0byB0aGUgc3BlY2lmaWVkIGRlbGltaXRlciwKKyAgICAgKiBzZXR0aW5nIHRoZSBmaWVsZHMgb2YgdGhlIFhNTFN0cmluZyBzdHJ1Y3R1cmUsIGFwcHJvcHJpYXRlbHkuCisgICAgICogPHA+CisgICAgICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgY2hhcmFjdGVycyBhcmUgY29uc3VtZWQuCisgICAgICogPHA+CisgICAgICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgaW50ZXJuYWwgYnVmZmVyIGlzCisgICAgICogYXQgbGVhc3QgdGhlIHNhbWUgc2l6ZSwgb3IgYmlnZ2VyLCB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGRlbGltaXRlcgorICAgICAqIGFuZCB0aGF0IHRoZSBkZWxpbWl0ZXIgY29udGFpbnMgYXQgbGVhc3Qgb25lIGNoYXJhY3Rlci4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoaXMgbWV0aG9kIGRvZXMgbm90IGd1YXJhbnRlZSB0byByZXR1cm4KKyAgICAgKiB0aGUgbG9uZ2VzdCBydW4gb2YgY2hhcmFjdGVyIGRhdGEuIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gYmVmb3JlCisgICAgICogdGhlIGRlbGltaXRlciBkdWUgdG8gcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgaW5wdXQgYnVmZmVyIG9yIGFueQorICAgICAqIG90aGVyIHJlYXNvbi4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBmaWVsZHMgY29udGFpbmVkIGluIHRoZSBYTUxTdHJpbmcKKyAgICAgKiBzdHJ1Y3R1cmUgYXJlIG5vdCBndWFyYW50ZWVkIHRvIHJlbWFpbiB2YWxpZCB1cG9uIHN1YnNlcXVlbnQgY2FsbHMKKyAgICAgKiB0byB0aGUgZW50aXR5IHNjYW5uZXIuIFRoZXJlZm9yZSwgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAgICAgKiBpbW1lZGlhdGVseSB1c2luZyB0aGUgcmV0dXJuZWQgY2hhcmFjdGVyIGRhdGEgb3IgbWFraW5nIGEgY29weSBvZgorICAgICAqIHRoZSBjaGFyYWN0ZXIgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWxpbWl0ZXIgVGhlIHN0cmluZyB0aGF0IHNpZ25pZmllcyB0aGUgZW5kIG9mIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgIGRhdGEgdG8gYmUgc2Nhbm5lZC4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgIFRoZSBkYXRhIHN0cnVjdHVyZSB0byBmaWxsLgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIHNjYW4sIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIFRocm93biBpZiBpL28gZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uIFRocm93biBvbiBlbmQgb2YgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzY2FuRGF0YShTdHJpbmcgZGVsaW1pdGVyLCBYTUxTdHJpbmdCdWZmZXIgYnVmZmVyKQorCXRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwlib29sZWFuIGRvbmUgPSBmYWxzZTsKKwlpbnQgZGVsaW1MZW4gPSBkZWxpbWl0ZXIubGVuZ3RoKCk7CisJY2hhciBjaGFyQXQwID0gZGVsaW1pdGVyLmNoYXJBdCgwKTsKKwlib29sZWFuIGV4dGVybmFsID0gZkN1cnJlbnRFbnRpdHkuaXNFeHRlcm5hbCgpOworCWRvIHsKKyAgICAKKwkgICAgLy8gbG9hZCBtb3JlIGNoYXJhY3RlcnMsIGlmIG5lZWRlZAorICAgIAorCSAgICBpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQpIHsKKwkJbG9hZCgwLCB0cnVlKTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA+PSBmQ3VycmVudEVudGl0eS5jb3VudCAtIGRlbGltTGVuKSB7CisJCVN5c3RlbS5hcnJheWNvcHkoZkN1cnJlbnRFbnRpdHkuY2gsIGZDdXJyZW50RW50aXR5LnBvc2l0aW9uLAorCQkJCSBmQ3VycmVudEVudGl0eS5jaCwgMCwgZkN1cnJlbnRFbnRpdHkuY291bnQgLSBmQ3VycmVudEVudGl0eS5wb3NpdGlvbik7CisJCWxvYWQoZkN1cnJlbnRFbnRpdHkuY291bnQgLSBmQ3VycmVudEVudGl0eS5wb3NpdGlvbiwgZmFsc2UpOworCQlmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9IDA7CisJICAgIH0gCisJICAgIGlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA+PSBmQ3VycmVudEVudGl0eS5jb3VudCAtIGRlbGltTGVuKSB7CisJCS8vIHNvbWV0aGluZyBtdXN0IGJlIHdyb25nIHdpdGggdGhlIGlucHV0OiBlLmcuLCBmaWxlIGVuZHMgYW4KKwkJLy8gdW50ZXJtaW5hdGVkIGNvbW1lbnQKKwkJaW50IGxlbmd0aCA9IGZDdXJyZW50RW50aXR5LmNvdW50IC0gZkN1cnJlbnRFbnRpdHkucG9zaXRpb247CisJCWJ1ZmZlci5hcHBlbmQgKGZDdXJyZW50RW50aXR5LmNoLCBmQ3VycmVudEVudGl0eS5wb3NpdGlvbiwKKwkJCSAgICAgICBsZW5ndGgpOyAKKwkJZkN1cnJlbnRFbnRpdHkuY29sdW1uTnVtYmVyICs9IGZDdXJyZW50RW50aXR5LmNvdW50OworCQlmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9IGZDdXJyZW50RW50aXR5LmNvdW50OworCQlsb2FkKDAsdHJ1ZSk7CisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorICAgIAorCSAgICAvLyBub3JtYWxpemUgbmV3bGluZXMKKwkgICAgaW50IG9mZnNldCA9IGZDdXJyZW50RW50aXR5LnBvc2l0aW9uOworCSAgICBpbnQgYyA9IGZDdXJyZW50RW50aXR5LmNoW29mZnNldF07CisJICAgIGludCBuZXdsaW5lcyA9IDA7CisJICAgIGlmIChjID09ICdcbicgfHwgKGMgPT0gJ1xyJyAmJiBleHRlcm5hbCkpIHsKKwkJZG8geworCQkgICAgYyA9IGZDdXJyZW50RW50aXR5LmNoW2ZDdXJyZW50RW50aXR5LnBvc2l0aW9uKytdOworCQkgICAgaWYgKGMgPT0gJ1xyJyAmJiBleHRlcm5hbCkgeworCQkJbmV3bGluZXMrKzsKKwkJCWZDdXJyZW50RW50aXR5LmxpbmVOdW1iZXIrKzsKKwkJCWZDdXJyZW50RW50aXR5LmNvbHVtbk51bWJlciA9IDE7CisJCQlpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQpIHsKKwkJCSAgICBvZmZzZXQgPSAwOworCQkJICAgIGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID0gbmV3bGluZXM7CisJCQkgICAgaWYgKGxvYWQobmV3bGluZXMsIGZhbHNlKSkgeworCQkJCWJyZWFrOworCQkJICAgIH0KKwkJCX0KKwkJCWlmIChmQ3VycmVudEVudGl0eS5jaFtmQ3VycmVudEVudGl0eS5wb3NpdGlvbl0gPT0gJ1xuJykgeworCQkJICAgIGZDdXJyZW50RW50aXR5LnBvc2l0aW9uKys7CisJCQkgICAgb2Zmc2V0Kys7CisJCQl9CisJCQkvKioqIE5FV0xJTkUgTk9STUFMSVpBVElPTiAqKiovCisJCQllbHNlIHsKKwkJCSAgICBuZXdsaW5lcysrOworCQkJfQorCQkgICAgfQorCQkgICAgZWxzZSBpZiAoYyA9PSAnXG4nKSB7CisJCQluZXdsaW5lcysrOworCQkJZkN1cnJlbnRFbnRpdHkubGluZU51bWJlcisrOworCQkJZkN1cnJlbnRFbnRpdHkuY29sdW1uTnVtYmVyID0gMTsKKwkJCWlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCQkJICAgIG9mZnNldCA9IDA7CisJCQkgICAgZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPSBuZXdsaW5lczsKKwkJCSAgICBmQ3VycmVudEVudGl0eS5jb3VudCA9IG5ld2xpbmVzOworCQkJICAgIGlmIChsb2FkKG5ld2xpbmVzLCBmYWxzZSkpIHsKKwkJCQlicmVhazsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCSAgICBlbHNlIHsKKwkJCWZDdXJyZW50RW50aXR5LnBvc2l0aW9uLS07CisJCQlicmVhazsKKwkJICAgIH0KKwkJfSB3aGlsZSAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPCBmQ3VycmVudEVudGl0eS5jb3VudCAtIDEpOworCQlmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgZkN1cnJlbnRFbnRpdHkucG9zaXRpb247IGkrKykgeworCQkgICAgZkN1cnJlbnRFbnRpdHkuY2hbaV0gPSAnXG4nOworCQl9CisJCWludCBsZW5ndGggPSBmQ3VycmVudEVudGl0eS5wb3NpdGlvbiAtIG9mZnNldDsKKwkJaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID09IGZDdXJyZW50RW50aXR5LmNvdW50IC0gMSkgeworCQkgICAgYnVmZmVyLmFwcGVuZChmQ3VycmVudEVudGl0eS5jaCwgb2Zmc2V0LCBsZW5ndGgpOworCQkgICAgcmV0dXJuIHRydWU7CisJCX0KKwkgICAgfQorICAgIAorCSAgICAvLyBpdGVyYXRlIG92ZXIgYnVmZmVyIGxvb2tpbmcgZm9yIGRlbGltaXRlcgorCU9VVEVSOiB3aGlsZSAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPCBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCSAgICBjID0gZkN1cnJlbnRFbnRpdHkuY2hbZkN1cnJlbnRFbnRpdHkucG9zaXRpb24rK107CisJICAgIGlmIChjID09IGNoYXJBdDApIHsKKwkJLy8gbG9va3MgbGlrZSB3ZSBqdXN0IGhpdCB0aGUgZGVsaW1pdGVyCisJCWludCBkZWxpbU9mZnNldCA9IGZDdXJyZW50RW50aXR5LnBvc2l0aW9uIC0gMTsKKwkJZm9yIChpbnQgaSA9IDE7IGkgPCBkZWxpbUxlbjsgaSsrKSB7CisJCSAgICBpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQpIHsKKwkJCWZDdXJyZW50RW50aXR5LnBvc2l0aW9uIC09IGk7CisJCQlicmVhayBPVVRFUjsKKwkJICAgIH0KKwkJICAgIGMgPSBmQ3VycmVudEVudGl0eS5jaFtmQ3VycmVudEVudGl0eS5wb3NpdGlvbisrXTsKKwkJICAgIGlmIChkZWxpbWl0ZXIuY2hhckF0KGkpICE9IGMpIHsKKwkJCWZDdXJyZW50RW50aXR5LnBvc2l0aW9uLS07CisJCQlicmVhazsKKwkJICAgIH0KKwkJfQorCQlpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZGVsaW1PZmZzZXQgKyBkZWxpbUxlbikgeworCQkgICAgZG9uZSA9IHRydWU7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJICAgIGVsc2UgaWYgKGMgPT0gJ1xuJyB8fCAoZXh0ZXJuYWwgJiYgYyA9PSAnXHInKSkgeworCQlmQ3VycmVudEVudGl0eS5wb3NpdGlvbi0tOworCQlicmVhazsKKwkgICAgfQorCSAgICBlbHNlIGlmIChYTUxDaGFyLmlzSW52YWxpZChjKSkgeworCQlmQ3VycmVudEVudGl0eS5wb3NpdGlvbi0tOworCQlpbnQgbGVuZ3RoID0gZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gLSBvZmZzZXQ7CisJCWZDdXJyZW50RW50aXR5LmNvbHVtbk51bWJlciArPSBsZW5ndGggLSBuZXdsaW5lczsKKwkJYnVmZmVyLmFwcGVuZChmQ3VycmVudEVudGl0eS5jaCwgb2Zmc2V0LCBsZW5ndGgpOyAKKwkJcmV0dXJuIHRydWU7CisJICAgIH0KKwl9CisJICAgIGludCBsZW5ndGggPSBmQ3VycmVudEVudGl0eS5wb3NpdGlvbiAtIG9mZnNldDsKKwkgICAgZkN1cnJlbnRFbnRpdHkuY29sdW1uTnVtYmVyICs9IGxlbmd0aCAtIG5ld2xpbmVzOworCSAgICBpZiAoZG9uZSkgeworCQlsZW5ndGggLT0gZGVsaW1MZW47CisJICAgIH0KKwkgICAgYnVmZmVyLmFwcGVuZCAoZkN1cnJlbnRFbnRpdHkuY2gsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAKKwkgICAgLy8gcmV0dXJuIHRydWUgaWYgc3RyaW5nIHdhcyBza2lwcGVkCisJfSB3aGlsZSAoIWRvbmUpOworCXJldHVybiAhZG9uZTsKKworICAgIH0KKworICAgIC8vIEFkYXB0ZWQgZnJvbToKKyAgICAvLyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVudGl0eU1hbmFnZXIuRW50aXR5U2Nhbm5lci5za2lwQ2hhcgorICAgIC8qKgorICAgICAqIFNraXBzIGEgY2hhcmFjdGVyIGFwcGVhcmluZyBpbW1lZGlhdGVseSBvbiB0aGUgaW5wdXQuCisgICAgICogPHA+CisgICAgICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgY2hhcmFjdGVyIGlzIGNvbnN1bWVkIG9ubHkgaWYgaXQgbWF0Y2hlcworICAgICAqIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBza2lwLgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciB3YXMgc2tpcHBlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIFRocm93biBpZiBpL28gZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uIFRocm93biBvbiBlbmQgb2YgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBza2lwQ2hhcihpbnQgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCS8vIGxvYWQgbW9yZSBjaGFyYWN0ZXJzLCBpZiBuZWVkZWQKKwlpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQpIHsKKwkgICAgbG9hZCgwLCB0cnVlKTsKKwl9CisKKwkvLyBza2lwIGNoYXJhY3RlcgorCWludCBjYyA9IGZDdXJyZW50RW50aXR5LmNoW2ZDdXJyZW50RW50aXR5LnBvc2l0aW9uXTsKKwlpZiAoY2MgPT0gYykgeworCSAgICBmQ3VycmVudEVudGl0eS5wb3NpdGlvbisrOworCSAgICBpZiAoYyA9PSAnXG4nKSB7CisJCWZDdXJyZW50RW50aXR5LmxpbmVOdW1iZXIrKzsKKwkJZkN1cnJlbnRFbnRpdHkuY29sdW1uTnVtYmVyID0gMTsKKwkgICAgfQorCSAgICBlbHNlIHsKKwkJZkN1cnJlbnRFbnRpdHkuY29sdW1uTnVtYmVyKys7CisJICAgIH0KKwkgICAgcmV0dXJuIHRydWU7CisJfSBlbHNlIGlmIChjID09ICdcbicgJiYgY2MgPT0gJ1xyJyAmJiBmQ3VycmVudEVudGl0eS5pc0V4dGVybmFsKCkpIHsKKwkgICAgLy8gaGFuZGxlIG5ld2xpbmVzCisJICAgIGlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCQlmQ3VycmVudEVudGl0eS5jaFswXSA9IChjaGFyKWNjOworCQlsb2FkKDEsIGZhbHNlKTsKKwkgICAgfQorCSAgICBmQ3VycmVudEVudGl0eS5wb3NpdGlvbisrOworCSAgICBpZiAoZkN1cnJlbnRFbnRpdHkuY2hbZkN1cnJlbnRFbnRpdHkucG9zaXRpb25dID09ICdcbicpIHsKKwkJZkN1cnJlbnRFbnRpdHkucG9zaXRpb24rKzsKKwkgICAgfQorCSAgICBmQ3VycmVudEVudGl0eS5saW5lTnVtYmVyKys7CisJICAgIGZDdXJyZW50RW50aXR5LmNvbHVtbk51bWJlciA9IDE7CisJICAgIHJldHVybiB0cnVlOworCX0KKworCS8vIGNoYXJhY3RlciB3YXMgbm90IHNraXBwZWQKKwlyZXR1cm4gZmFsc2U7CisKKyAgICB9CisKKyAgICAvLyBBZGFwdGVkIGZyb206CisgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFbnRpdHlNYW5hZ2VyLkVudGl0eVNjYW5uZXIuc2tpcFNwYWNlcworICAgIC8qKgorICAgICAqIFNraXBzIHNwYWNlIGNoYXJhY3RlcnMgYXBwZWFyaW5nIGltbWVkaWF0ZWx5IG9uIHRoZSBpbnB1dC4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBjaGFyYWN0ZXJzIGFyZSBjb25zdW1lZCBvbmx5IGlmIHRoZXkgYXJlCisgICAgICogc3BhY2UgY2hhcmFjdGVycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBzcGFjZSBjaGFyYWN0ZXIgd2FzIHNraXBwZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBUaHJvd24gaWYgaS9vIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbiBUaHJvd24gb24gZW5kIG9mIGZpbGUuCisgICAgICoKKyAgICAgKiBAc2VlIFhNTENoYXIjaXNTcGFjZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNraXBTcGFjZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJLy8gbG9hZCBtb3JlIGNoYXJhY3RlcnMsIGlmIG5lZWRlZAorCWlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCSAgICBsb2FkKDAsIHRydWUpOworCX0KKworCS8vIHNraXAgc3BhY2VzCisJaW50IGMgPSBmQ3VycmVudEVudGl0eS5jaFtmQ3VycmVudEVudGl0eS5wb3NpdGlvbl07CisJaWYgKFhNTENoYXIuaXNTcGFjZShjKSkgeworCSAgICBib29sZWFuIGV4dGVybmFsID0gZkN1cnJlbnRFbnRpdHkuaXNFeHRlcm5hbCgpOworCSAgICBkbyB7CisJCWJvb2xlYW4gZW50aXR5Q2hhbmdlZCA9IGZhbHNlOworCQkvLyBoYW5kbGUgbmV3bGluZXMKKwkJaWYgKGMgPT0gJ1xuJyB8fCAoZXh0ZXJuYWwgJiYgYyA9PSAnXHInKSkgeworCQkgICAgZkN1cnJlbnRFbnRpdHkubGluZU51bWJlcisrOworCQkgICAgZkN1cnJlbnRFbnRpdHkuY29sdW1uTnVtYmVyID0gMTsKKwkJICAgIGlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCAtIDEpIHsKKwkJCWZDdXJyZW50RW50aXR5LmNoWzBdID0gKGNoYXIpYzsKKwkJCWVudGl0eUNoYW5nZWQgPSBsb2FkKDEsIHRydWUpOworCQkJaWYgKCFlbnRpdHlDaGFuZ2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9hZCBjaGFuZ2UgdGhlIHBvc2l0aW9uIHRvIGJlIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gcmVzdG9yZSBpdCB3aGVuIGVudGl0eSBub3QgY2hhbmdlZAorCQkJICAgIGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID0gMDsKKwkJICAgIH0KKwkJICAgIGlmIChjID09ICdccicgJiYgZXh0ZXJuYWwpIHsKKwkJCS8vIFJFVklTSVQ6IERvZXMgdGhpcyBuZWVkIHRvIGJlIHVwZGF0ZWQgdG8gZml4IHRoZQorCQkJLy8gICAgICAgICAgI3gwRCBeI3gwQSBuZXdsaW5lIG5vcm1hbGl6YXRpb24gcHJvYmxlbT8gLUFjCisJCQlpZiAoZkN1cnJlbnRFbnRpdHkuY2hbKytmQ3VycmVudEVudGl0eS5wb3NpdGlvbl0gIT0gJ1xuJykgeworCQkJICAgIGZDdXJyZW50RW50aXR5LnBvc2l0aW9uLS07CisJCQl9CisJCSAgICB9CisJCSAgICAvKioqIE5FV0xJTkUgTk9STUFMSVpBVElPTiAqKioKKwkJCSBlbHNlIHsKKwkJCSBpZiAoZkN1cnJlbnRFbnRpdHkuY2hbZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gKyAxXSA9PSAnXHInCisJCQkgJiYgZXh0ZXJuYWwpIHsKKwkJCSBmQ3VycmVudEVudGl0eS5wb3NpdGlvbisrOworCQkJIH0KKwkJCSB9CisJCQkgLyoqKi8KKwkJfQorCQllbHNlIHsKKwkJICAgIGZDdXJyZW50RW50aXR5LmNvbHVtbk51bWJlcisrOworCQl9CisJCS8vIGxvYWQgbW9yZSBjaGFyYWN0ZXJzLCBpZiBuZWVkZWQKKwkJaWYgKCFlbnRpdHlDaGFuZ2VkKQorCQkgICAgZkN1cnJlbnRFbnRpdHkucG9zaXRpb24rKzsKKwkJaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID09IGZDdXJyZW50RW50aXR5LmNvdW50KSB7CisJCSAgICBsb2FkKDAsIHRydWUpOworCQl9CisJICAgIH0gd2hpbGUgKFhNTENoYXIuaXNTcGFjZShjID0gZkN1cnJlbnRFbnRpdHkuY2hbZkN1cnJlbnRFbnRpdHkucG9zaXRpb25dKSk7CisJICAgIHJldHVybiB0cnVlOworCX0KKworCS8vIG5vIHNwYWNlcyB3ZXJlIGZvdW5kCisJcmV0dXJuIGZhbHNlOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2tpcHMgdGhlIHNwZWNpZmllZCBzdHJpbmcgYXBwZWFyaW5nIGltbWVkaWF0ZWx5IG9uIHRoZSBpbnB1dC4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBjaGFyYWN0ZXJzIGFyZSBjb25zdW1lZCBvbmx5IGlmIHRoZXkgYXJlCisgICAgICogc3BhY2UgY2hhcmFjdGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIFRoZSBzdHJpbmcgdG8gc2tpcC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgd2FzIHNraXBwZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBUaHJvd24gaWYgaS9vIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbiBUaHJvd24gb24gZW5kIG9mIGZpbGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2tpcFN0cmluZyhTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCS8vIGxvYWQgbW9yZSBjaGFyYWN0ZXJzLCBpZiBuZWVkZWQKKwlpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQpIHsKKwkgICAgbG9hZCgwLCB0cnVlKTsKKwl9CisKKwkvLyBza2lwIHN0cmluZworCWZpbmFsIGludCBsZW5ndGggPSBzLmxlbmd0aCgpOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkgICAgY2hhciBjID0gZkN1cnJlbnRFbnRpdHkuY2hbZkN1cnJlbnRFbnRpdHkucG9zaXRpb24rK107CisJICAgIGlmIChjICE9IHMuY2hhckF0KGkpKSB7CisJCWZDdXJyZW50RW50aXR5LnBvc2l0aW9uIC09IGkgKyAxOworCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwkgICAgaWYgKGkgPCBsZW5ndGggLSAxICYmIGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID09IGZDdXJyZW50RW50aXR5LmNvdW50KSB7CisJCVN5c3RlbS5hcnJheWNvcHkoZkN1cnJlbnRFbnRpdHkuY2gsIGZDdXJyZW50RW50aXR5LmNvdW50IC0gaSAtIDEsIGZDdXJyZW50RW50aXR5LmNoLCAwLCBpICsgMSk7CisJCS8vIFJFVklTSVQ6IENhbiBhIHN0cmluZyB0byBiZSBza2lwcGVkIGNyb3NzIGFuCisJCS8vICAgICAgICAgIGVudGl0eSBib3VuZGFyeT8gLUFjCisJCWlmIChsb2FkKGkgKyAxLCBmYWxzZSkpIHsKKwkJICAgIGZDdXJyZW50RW50aXR5LnBvc2l0aW9uIC09IGkgKyAxOworCQkgICAgcmV0dXJuIGZhbHNlOworCQl9CisJICAgIH0KKwl9CisJZkN1cnJlbnRFbnRpdHkuY29sdW1uTnVtYmVyICs9IGxlbmd0aDsKKwlyZXR1cm4gdHJ1ZTsKKworICAgIH0KKworICAgIC8vIEFkYXB0ZWQgZnJvbToKKyAgICAvLyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVudGl0eU1hbmFnZXIuRW50aXR5U2Nhbm5lci5sb2FkCisgICAgLyoqCisgICAgICogTG9hZHMgYSBjaHVuayBvZiB0ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIG9mZnNldCAgICAgICBUaGUgb2Zmc2V0IGludG8gdGhlIGNoYXJhY3RlciBidWZmZXIgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHJlYWQgdGhlIG5leHQgYmF0Y2ggb2YgY2hhcmFjdGVycy4KKyAgICAgKiBAcGFyYW0gY2hhbmdlRW50aXR5IFRydWUgaWYgdGhlIGxvYWQgc2hvdWxkIGNoYW5nZSBlbnRpdGllcworICAgICAqICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIGVuZCBvZiB0aGUgZW50aXR5LCBvdGhlcndpc2UgbGVhdmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGVudGl0eSBpbiBwbGFjZSBhbmQgdGhlIGVudGl0eQorICAgICAqICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnkgd2lsbCBiZSBzaWduYWxlZCBieSB0aGUgcmV0dXJuCisgICAgICogICAgICAgICAgICAgICAgICAgICB2YWx1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW50aXR5IGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgdGhpcworICAgICAqICAgICAgICAgIGxvYWQgb3BlcmF0aW9uLgorICAgICAqLworICAgIGZpbmFsIGJvb2xlYW4gbG9hZChpbnQgb2Zmc2V0LCBib29sZWFuIGNoYW5nZUVudGl0eSkKKwl0aHJvd3MgSU9FeGNlcHRpb24geworCisJLy8gcmVhZCBjaGFyYWN0ZXJzCisJaW50IGxlbmd0aCA9IGZDdXJyZW50RW50aXR5Lm1heVJlYWRDaHVua3M/CisJICAgIChmQ3VycmVudEVudGl0eS5jaC5sZW5ndGggLSBvZmZzZXQpOgorCSAgICAoREVGQVVMVF9YTUxERUNMX0JVRkZFUl9TSVpFKTsKKwlpbnQgY291bnQgPSBmQ3VycmVudEVudGl0eS5yZWFkZXIucmVhZChmQ3VycmVudEVudGl0eS5jaCwgb2Zmc2V0LAorCQkJCQkgICAgICAgbGVuZ3RoKTsKKworCS8vIHJlc2V0IGNvdW50IGFuZCBwb3NpdGlvbgorCWJvb2xlYW4gZW50aXR5Q2hhbmdlZCA9IGZhbHNlOworCWlmIChjb3VudCAhPSAtMSkgeworCSAgICBpZiAoY291bnQgIT0gMCkgeworCQlmQ3VycmVudEVudGl0eS5jb3VudCA9IGNvdW50ICsgb2Zmc2V0OworCQlmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9IG9mZnNldDsKKwkgICAgfQorCX0KKworCS8vIGVuZCBvZiB0aGlzIGVudGl0eQorCWVsc2UgeworCSAgICBmQ3VycmVudEVudGl0eS5jb3VudCA9IG9mZnNldDsKKwkgICAgZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPSBvZmZzZXQ7CisJICAgIGVudGl0eUNoYW5nZWQgPSB0cnVlOworCSAgICBpZiAoY2hhbmdlRW50aXR5KSB7CisJCWVuZEVudGl0eSgpOworCQlpZiAoZkN1cnJlbnRFbnRpdHkgPT0gbnVsbCkgeworCQkgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigpOworCQl9CisJCS8vIGhhbmRsZSB0aGUgdHJhaWxpbmcgZWRnZXMKKwkJaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID09IGZDdXJyZW50RW50aXR5LmNvdW50KSB7CisJCSAgICBsb2FkKDAsIGZhbHNlKTsKKwkJfQorCSAgICB9CisJfQorCisJcmV0dXJuIGVudGl0eUNoYW5nZWQ7CisKKyAgICB9CisKKyAgICAvLyBBZGFwdGVkIGZyb206CisgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFbnRpdHlNYW5hZ2VyLlJld2luZGFibGVJbnB1dFN0cmVhbQorICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3Mgd3JhcHMgdGhlIGJ5dGUgaW5wdXRzdHJlYW1zIHdlJ3JlIHByZXNlbnRlZCB3aXRoLgorICAgICAqIFdlIG5lZWQgaXQgYmVjYXVzZSBqYXZhLmlvLklucHV0U3RyZWFtcyBkb24ndCBwcm92aWRlCisgICAgICogZnVuY3Rpb25hbGl0eSB0byByZXJlYWQgcHJvY2Vzc2VkIGJ5dGVzLCBhbmQgdGhleSBoYXZlIGEgaGFiaXQKKyAgICAgKiBvZiByZWFkaW5nIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyIHdoZW4geW91IGNhbGwgdGhlaXIgcmVhZCgpCisgICAgICogbWV0aG9kcy4gIFRoaXMgbWVhbnMgdGhhdCwgb25jZSB3ZSBkaXNjb3ZlciB0aGUgdHJ1ZSAoZGVjbGFyZWQpCisgICAgICogZW5jb2Rpbmcgb2YgYSBkb2N1bWVudCwgd2UgY2FuIG5laXRoZXIgYmFja3RyYWNrIHRvIHJlYWQgdGhlCisgICAgICogd2hvbGUgZG9jIGFnYWluIG5vciBzdGFydCByZWFkaW5nIHdoZXJlIHdlIGFyZSB3aXRoIGEgbmV3CisgICAgICogcmVhZGVyLgorICAgICAqCisgICAgICogVGhpcyBjbGFzcyBhbGxvd3MgcmV3aW5kaW5nIGFuIGlucHV0U3RyZWFtIGJ5IGFsbG93aW5nIGEgbWFyaworICAgICAqIHRvIGJlIHNldCwgYW5kIHRoZSBzdHJlYW0gcmVzZXQgdG8gdGhhdCBwb3NpdGlvbi4gIDxzdHJvbmc+VGhlCisgICAgICogY2xhc3MgYXNzdW1lcyB0aGF0IGl0IG5lZWRzIHRvIHJlYWQgb25lIGNoYXJhY3RlciBwZXIKKyAgICAgKiBpbnZvY2F0aW9uIHdoZW4gaXQncyByZWFkKCkgbWV0aG9kIGlzIGlub3ZrZWQsIGJ1dCB1c2VzIHRoZQorICAgICAqIHVuZGVybHlpbmcgSW5wdXRTdHJlYW0ncyByZWFkKGNoYXJbXSwgb2Zmc2V0IGxlbmd0aCkgbWV0aG9kLS1pdAorICAgICAqIHdvbid0IGJ1ZmZlciBkYXRhIHJlYWQgdGhpcyB3YXkhPC9zdHJvbmc+CisgICAgICoKKyAgICAgKiBAYXV0aG9yIE5laWwgR3JhaGFtLCBJQk0KKyAgICAgKiBAYXV0aG9yIEdsZW5uIE1hcmN5LCBJQk0KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFJld2luZGFibGVJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKworICAgICAgICBwcml2YXRlIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gZkRhdGE7CisgICAgICAgIHByaXZhdGUgaW50IGZTdGFydE9mZnNldDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgZkVuZE9mZnNldDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgZk9mZnNldDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgZkxlbmd0aDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgZk1hcms7CisKKyAgICAgICAgcHVibGljIFJld2luZGFibGVJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcykgeworICAgICAgICAgICAgZkRhdGEgPSBuZXcgYnl0ZVtERUZBVUxUX1hNTERFQ0xfQlVGRkVSX1NJWkVdOworICAgICAgICAgICAgZklucHV0U3RyZWFtID0gaXM7CisgICAgICAgICAgICBmU3RhcnRPZmZzZXQgPSAwOworICAgICAgICAgICAgZkVuZE9mZnNldCA9IC0xOworICAgICAgICAgICAgZk9mZnNldCA9IDA7CisgICAgICAgICAgICBmTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGZNYXJrID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgICAgIGZTdGFydE9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJld2luZCgpIHsKKyAgICAgICAgICAgIGZPZmZzZXQgPSBmU3RhcnRPZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaW50IGIgPSAwOworICAgICAgICAgICAgaWYgKGZPZmZzZXQgPCBmTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZEYXRhW2ZPZmZzZXQrK10gJiAweGZmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZPZmZzZXQgPT0gZkVuZE9mZnNldCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmT2Zmc2V0ID09IGZEYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBuZXdEYXRhID0gbmV3IGJ5dGVbZk9mZnNldCA8PCAxXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGZEYXRhLCAwLCBuZXdEYXRhLCAwLCBmT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBmRGF0YSA9IG5ld0RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiID0gZklucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChiID09IC0xKSB7CisgICAgICAgICAgICAgICAgZkVuZE9mZnNldCA9IGZPZmZzZXQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZkRhdGFbZkxlbmd0aCsrXSA9IChieXRlKWI7CisgICAgICAgICAgICBmT2Zmc2V0Kys7CisgICAgICAgICAgICByZXR1cm4gYiAmIDB4ZmY7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgYnl0ZXNMZWZ0ID0gZkxlbmd0aCAtIGZPZmZzZXQ7CisgICAgICAgICAgICBpZiAoYnl0ZXNMZWZ0ID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZk9mZnNldCA9PSBmRW5kT2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gYmV0dGVyIGdldCBzb21lIG1vcmUgZm9yIHRoZSB2b3JhY2lvdXMgcmVhZGVyLi4uCisgICAgICAgICAgICAgICAgaWYgKGZDdXJyZW50RW50aXR5Lm1heVJlYWRDaHVua3MpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZJbnB1dFN0cmVhbS5yZWFkKGIsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IHJldHVybmVkVmFsID0gcmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZFZhbCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBmRW5kT2Zmc2V0ID0gZk9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiW29mZl0gPSAoYnl0ZSlyZXR1cm5lZFZhbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZW4gPCBieXRlc0xlZnQpIHsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbGVuID0gYnl0ZXNMZWZ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZkRhdGEsIGZPZmZzZXQsIGIsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZPZmZzZXQgKz0gbGVuOworICAgICAgICAgICAgcmV0dXJuIGxlbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBuKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBieXRlc0xlZnQ7CisgICAgICAgICAgICBpZiAobiA8PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlc0xlZnQgPSBmTGVuZ3RoIC0gZk9mZnNldDsKKyAgICAgICAgICAgIGlmIChieXRlc0xlZnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChmT2Zmc2V0ID09IGZFbmRPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmSW5wdXRTdHJlYW0uc2tpcChuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuIDw9IGJ5dGVzTGVmdCkgeworICAgICAgICAgICAgICAgIGZPZmZzZXQgKz0gbjsKKyAgICAgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZPZmZzZXQgKz0gYnl0ZXNMZWZ0OworICAgICAgICAgICAgaWYgKGZPZmZzZXQgPT0gZkVuZE9mZnNldCkgeworICAgICAgICAgICAgICAgIHJldHVybiBieXRlc0xlZnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuIC09IGJ5dGVzTGVmdDsKKwkgICAgLyoKKwkgICAgICogSW4gYSBtYW5uZXIgb2Ygc3BlYWtpbmcsIHdoZW4gdGhpcyBjbGFzcyBpc24ndCBwZXJtaXR0aW5nIG1vcmUKKwkgICAgICogdGhhbiBvbmUgYnl0ZSBhdCBhIHRpbWUgdG8gYmUgcmVhZCwgaXQgaXMgImJsb2NraW5nIi4gIFRoZQorCSAgICAgKiBhdmFpbGFibGUoKSBtZXRob2Qgc2hvdWxkIGluZGljYXRlIGhvdyBtdWNoIGNhbiBiZSByZWFkIHdpdGhvdXQKKwkgICAgICogYmxvY2tpbmcsIHNvIHdoaWxlIHdlJ3JlIGluIHRoaXMgbW9kZSwgaXQgc2hvdWxkIG9ubHkgaW5kaWNhdGUKKwkgICAgICogdGhhdCBieXRlcyBpbiBpdHMgYnVmZmVyIGFyZSBhdmFpbGFibGU7IG90aGVyd2lzZSwgdGhlIHJlc3VsdCBvZgorCSAgICAgKiBhdmFpbGFibGUoKSBvbiB0aGUgdW5kZXJseWluZyBJbnB1dFN0cmVhbSBpcyBhcHByb3ByaWF0ZS4KKwkgICAgICovCisgICAgICAgICAgICByZXR1cm4gZklucHV0U3RyZWFtLnNraXAobikgKyBieXRlc0xlZnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgYnl0ZXNMZWZ0ID0gZkxlbmd0aCAtIGZPZmZzZXQ7CisgICAgICAgICAgICBpZiAoYnl0ZXNMZWZ0ID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZk9mZnNldCA9PSBmRW5kT2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZDdXJyZW50RW50aXR5Lm1heVJlYWRDaHVua3MgPyBmSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkKKwkJICAgIDogMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBieXRlc0xlZnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBtYXJrKGludCBob3dNdWNoKSB7CisgICAgICAgICAgICBmTWFyayA9IGZPZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIGZPZmZzZXQgPSBmTWFyazsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChmSW5wdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZJbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIGZJbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IC8vIGVuZCBvZiBSZXdpbmRhYmxlSW5wdXRTdHJlYW0gY2xhc3MKKworICAgIC8vIEFkYXB0ZWQgZnJvbToKKyAgICAvLyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTERvY3VtZW50U2Nhbm5lckltcGwuZGlzcGF0Y2gKKyAgICBwcml2YXRlIHZvaWQgc2NhblhNTERlY2woKSB0aHJvd3MgSU9FeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbiB7CisKKwlpZiAoc2tpcFN0cmluZygiPD94bWwiKSkgeworCSAgICBmTWFya3VwRGVwdGgrKzsKKwkgICAgLy8gTk9URTogc3BlY2lhbCBjYXNlIHdoZXJlIGRvY3VtZW50IHN0YXJ0cyB3aXRoIGEgUEkKKwkgICAgLy8gICAgICAgd2hvc2UgbmFtZSBzdGFydHMgd2l0aCAieG1sIiAoZS5nLiAieG1sZm9vIikKKwkgICAgaWYgKFhNTENoYXIuaXNOYW1lKHBlZWtDaGFyKCkpKSB7CisJCWZTdHJpbmdCdWZmZXIuY2xlYXIoKTsKKwkJZlN0cmluZ0J1ZmZlci5hcHBlbmQoInhtbCIpOworCQl3aGlsZSAoWE1MQ2hhci5pc05hbWUocGVla0NoYXIoKSkpIHsKKwkJICAgIGZTdHJpbmdCdWZmZXIuYXBwZW5kKChjaGFyKXNjYW5DaGFyKCkpOworCQl9CisJCVN0cmluZyB0YXJnZXQgPSBmU3ltYm9sVGFibGUuYWRkU3ltYm9sKGZTdHJpbmdCdWZmZXIuY2gsCisJCQkJCQkgICAgICAgZlN0cmluZ0J1ZmZlci5vZmZzZXQsCisJCQkJCQkgICAgICAgZlN0cmluZ0J1ZmZlci5sZW5ndGgpOworCQlzY2FuUElEYXRhKHRhcmdldCwgZlN0cmluZyk7CisJICAgIH0KKworCSAgICAvLyBzdGFuZGFyZCBYTUwgZGVjbGFyYXRpb24KKwkgICAgZWxzZSB7CisJCXNjYW5YTUxEZWNsT3JUZXh0RGVjbChmYWxzZSk7CisJICAgIH0KKwl9CisgICAgfQorICAgIAorICAgIC8vIEFkYXB0ZWQgZnJvbToKKyAgICAvLyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTERvY3VtZW50RnJhZ21lbnRTY2FubmVySW1wbC5zY2FuWE1MRGVjbE9yVGV4dERlY2wKKyAgICAvKioKKyAgICAgKiBTY2FucyBhbiBYTUwgb3IgdGV4dCBkZWNsYXJhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiA8cHJlPgorICAgICAqIFsyM10gWE1MRGVjbCA6Oj0gJyZsdDs/eG1sJyBWZXJzaW9uSW5mbyBFbmNvZGluZ0RlY2w/IFNERGVjbD8gUz8gJz8+JworICAgICAqIFsyNF0gVmVyc2lvbkluZm8gOjo9IFMgJ3ZlcnNpb24nIEVxICgnIFZlcnNpb25OdW0gJyB8ICIgVmVyc2lvbk51bSAiKQorICAgICAqIFs4MF0gRW5jb2RpbmdEZWNsIDo6PSBTICdlbmNvZGluZycgRXEgKCciJyBFbmNOYW1lICciJyB8ICAiJyIgRW5jTmFtZSAiJyIgKQorICAgICAqIFs4MV0gRW5jTmFtZSA6Oj0gW0EtWmEtel0gKFtBLVphLXowLTkuX10gfCAnLScpKgorICAgICAqIFszMl0gU0REZWNsIDo6PSBTICdzdGFuZGFsb25lJyBFcSAoKCInIiAoJ3llcycgfCAnbm8nKSAiJyIpCisgICAgICogICAgICAgICAgICAgICAgIHwgKCciJyAoJ3llcycgfCAnbm8nKSAnIicpKQorICAgICAqCisgICAgICogWzc3XSBUZXh0RGVjbCA6Oj0gJyZsdDs/eG1sJyBWZXJzaW9uSW5mbz8gRW5jb2RpbmdEZWNsIFM/ICc/PicKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY2FubmluZ1RleHREZWNsIFRydWUgaWYgYSB0ZXh0IGRlY2xhcmF0aW9uIGlzIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2Nhbm5lZCBpbnN0ZWFkIG9mIGFuIFhNTAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzY2FuWE1MRGVjbE9yVGV4dERlY2woYm9vbGVhbiBzY2FubmluZ1RleHREZWNsKSAKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIC8vIHNjYW4gZGVjbAorICAgICAgICBzY2FuWE1MRGVjbE9yVGV4dERlY2woc2Nhbm5pbmdUZXh0RGVjbCwgZlN0cmluZ3MpOworICAgICAgICBmTWFya3VwRGVwdGgtLTsKKworICAgICAgICAvLyBwc2V1ZG8tYXR0cmlidXRlIHZhbHVlcworICAgICAgICBTdHJpbmcgZW5jb2RpbmdQc2V1ZG9BdHRyID0gZlN0cmluZ3NbMV07CisKKyAgICAgICAgLy8gc2V0IGVuY29kaW5nIG9uIHJlYWRlcgorICAgICAgICBpZiAoZW5jb2RpbmdQc2V1ZG9BdHRyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlzRW5jb2RpbmdTZXRJblByb2xvZyA9IHRydWU7CisJICAgIGVuY29kaW5nID0gZW5jb2RpbmdQc2V1ZG9BdHRyOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQWRhcHRlZCBmcm9tOgorICAgIC8vIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MU2Nhbm5lci5zY2FuWE1MRGVjbE9yVGV4dERlY2wKKyAgICAvKioKKyAgICAgKiBTY2FucyBhbiBYTUwgb3IgdGV4dCBkZWNsYXJhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiA8cHJlPgorICAgICAqIFsyM10gWE1MRGVjbCA6Oj0gJzw/eG1sJyBWZXJzaW9uSW5mbyBFbmNvZGluZ0RlY2w/IFNERGVjbD8gUz8gJz8+JworICAgICAqIFsyNF0gVmVyc2lvbkluZm8gOjo9IFMgJ3ZlcnNpb24nIEVxICgnIFZlcnNpb25OdW0gJyB8ICIgVmVyc2lvbk51bSAiKQorICAgICAqIFs4MF0gRW5jb2RpbmdEZWNsIDo6PSBTICdlbmNvZGluZycgRXEgKCciJyBFbmNOYW1lICciJyB8ICAiJyIgRW5jTmFtZSAiJyIgKQorICAgICAqIFs4MV0gRW5jTmFtZSA6Oj0gW0EtWmEtel0gKFtBLVphLXowLTkuX10gfCAnLScpKgorICAgICAqIFszMl0gU0REZWNsIDo6PSBTICdzdGFuZGFsb25lJyBFcSAoKCInIiAoJ3llcycgfCAnbm8nKSAiJyIpCisgICAgICogICAgICAgICAgICAgICAgIHwgKCciJyAoJ3llcycgfCAnbm8nKSAnIicpKQorICAgICAqCisgICAgICogWzc3XSBUZXh0RGVjbCA6Oj0gJzw/eG1sJyBWZXJzaW9uSW5mbz8gRW5jb2RpbmdEZWNsIFM/ICc/PicKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY2FubmluZ1RleHREZWNsIFRydWUgaWYgYSB0ZXh0IGRlY2xhcmF0aW9uIGlzIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2Nhbm5lZCBpbnN0ZWFkIG9mIGFuIFhNTAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLgorICAgICAqIEBwYXJhbSBwc2V1ZG9BdHRyaWJ1dGVWYWx1ZXMgQW4gYXJyYXkgb2Ygc2l6ZSAzIHRvIHJldHVybiB0aGUgdmVyc2lvbiwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyBhbmQgc3RhbmRhbG9uZSBwc2V1ZG8gYXR0cmlidXRlIHZhbHVlcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIChpbiB0aGF0IG9yZGVyKS4KKyAgICAgKgorICAgICAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBtZXRob2QgdXNlcyBmU3RyaW5nLCBhbnl0aGluZyBpbiBpdAorICAgICAqIGF0IHRoZSB0aW1lIG9mIGNhbGxpbmcgaXMgbG9zdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2NhblhNTERlY2xPclRleHREZWNsKGJvb2xlYW4gc2Nhbm5pbmdUZXh0RGVjbCwKKwkJCQkgICAgICAgU3RyaW5nW10gcHNldWRvQXR0cmlidXRlVmFsdWVzKSAKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gcHNldWRvLWF0dHJpYnV0ZSB2YWx1ZXMKKyAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBudWxsOworICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBudWxsOworICAgICAgICBTdHJpbmcgc3RhbmRhbG9uZSA9IG51bGw7CisKKyAgICAgICAgLy8gc2NhbiBwc2V1ZG8tYXR0cmlidXRlcworICAgICAgICBmaW5hbCBpbnQgU1RBVEVfVkVSU0lPTiA9IDA7CisgICAgICAgIGZpbmFsIGludCBTVEFURV9FTkNPRElORyA9IDE7CisgICAgICAgIGZpbmFsIGludCBTVEFURV9TVEFOREFMT05FID0gMjsKKyAgICAgICAgZmluYWwgaW50IFNUQVRFX0RPTkUgPSAzOworICAgICAgICBpbnQgc3RhdGUgPSBTVEFURV9WRVJTSU9OOworCisgICAgICAgIGJvb2xlYW4gZGF0YUZvdW5kRm9yVGFyZ2V0ID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gc2F3U3BhY2UgPSBza2lwU3BhY2VzKCk7CisgICAgICAgIHdoaWxlIChwZWVrQ2hhcigpICE9ICc/JykgeworICAgICAgICAgICAgZGF0YUZvdW5kRm9yVGFyZ2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gc2NhblBzZXVkb0F0dHJpYnV0ZShzY2FubmluZ1RleHREZWNsLCBmU3RyaW5nKTsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1ZFUlNJT046IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gZlZlcnNpb25TeW1ib2wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2F3U3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRGYXRhbEVycm9yKHNjYW5uaW5nVGV4dERlY2wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gImpzcC5lcnJvci54bWwuc3BhY2VSZXF1aXJlZEJlZm9yZVZlcnNpb25JblRleHREZWNsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAianNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlVmVyc2lvbkluWE1MRGVjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBmU3RyaW5nLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0VOQ09ESU5HOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2ZXJzaW9uLmVxdWFscygiMS4wIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSRVZJU0lUOiBYTUwgUkVDIHNheXMgd2Ugc2hvdWxkIHRocm93IGFuIGVycm9yCisJCQkgICAgLy8gaW4gc3VjaCBjYXNlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21lIG1heSBvYmplY3QgdGhlIHRocm93aW5nIG9mIGZhdGFsRXJyb3IuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLnZlcnNpb25Ob3RTdXBwb3J0ZWQiLAorCQkJCQkgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBmRW5jb2RpbmdTeW1ib2wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2Nhbm5pbmdUZXh0RGVjbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC52ZXJzaW9uSW5mb1JlcXVpcmVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNhd1NwYWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0RmF0YWxFcnJvcihzY2FubmluZ1RleHREZWNsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gImpzcC5lcnJvci54bWwuc3BhY2VSZXF1aXJlZEJlZm9yZUVuY29kaW5nSW5UZXh0RGVjbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAianNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlRW5jb2RpbmdJblhNTERlY2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGZTdHJpbmcudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc2Nhbm5pbmdUZXh0RGVjbCA/IFNUQVRFX0RPTkUgOiBTVEFURV9TVEFOREFMT05FOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW5uaW5nVGV4dERlY2wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci54bWwuZW5jb2RpbmdEZWNsUmVxdWlyZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC52ZXJzaW9uSW5mb1JlcXVpcmVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfRU5DT0RJTkc6IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gZkVuY29kaW5nU3ltYm9sKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNhd1NwYWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0RmF0YWxFcnJvcihzY2FubmluZ1RleHREZWNsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gImpzcC5lcnJvci54bWwuc3BhY2VSZXF1aXJlZEJlZm9yZUVuY29kaW5nSW5UZXh0RGVjbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAianNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlRW5jb2RpbmdJblhNTERlY2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGZTdHJpbmcudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc2Nhbm5pbmdUZXh0RGVjbCA/IFNUQVRFX0RPTkUgOiBTVEFURV9TVEFOREFMT05FOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgZW5jb2RpbmcgbmFtZTsgc2V0IGVuY29kaW5nIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBlbnRpdHkgc2Nhbm5lcgorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzY2FubmluZ1RleHREZWNsICYmIG5hbWUgPT0gZlN0YW5kYWxvbmVTeW1ib2wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2F3U3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci54bWwuc3BhY2VSZXF1aXJlZEJlZm9yZVN0YW5kYWxvbmUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYWxvbmUgPSBmU3RyaW5nLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0RPTkU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YW5kYWxvbmUuZXF1YWxzKCJ5ZXMiKSAmJiAhc3RhbmRhbG9uZS5lcXVhbHMoIm5vIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci54bWwuc2REZWNsSW52YWxpZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLmVuY29kaW5nRGVjbFJlcXVpcmVkIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfU1RBTkRBTE9ORTogeworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBmU3RhbmRhbG9uZVN5bWJvbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzYXdTcGFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlU3RhbmRhbG9uZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhbG9uZSA9IGZTdHJpbmcudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfRE9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhbmRhbG9uZS5lcXVhbHMoInllcyIpICYmICFzdGFuZGFsb25lLmVxdWFscygibm8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC5zZERlY2xJbnZhbGlkIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCQllcnIuanNwRXJyb3IoImpzcC5lcnJvci54bWwuZW5jb2RpbmdEZWNsUmVxdWlyZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci54bWwubm9Nb3JlUHNldWRvQXR0cmlidXRlcyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNhd1NwYWNlID0gc2tpcFNwYWNlcygpOworICAgICAgICB9CisgICAgICAgIC8vIFJFVklTSVQ6IHNob3VsZCB3ZSByZW1vdmUgdGhpcyBlcnJvciByZXBvcnRpbmc/CisgICAgICAgIGlmIChzY2FubmluZ1RleHREZWNsICYmIHN0YXRlICE9IFNUQVRFX0RPTkUpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC5tb3JlUHNldWRvQXR0cmlidXRlcyIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBkYXRhIGluIHRoZSB4bWwgb3IgdGV4dCBkZWNsIHRoZW4gd2UgZmFpbCB0byByZXBvcnQKKwkvLyBlcnJvciBmb3IgdmVyc2lvbiBvciBlbmNvZGluZyBpbmZvIGFib3ZlLgorICAgICAgICBpZiAoc2Nhbm5pbmdUZXh0RGVjbCkgeworICAgICAgICAgICAgaWYgKCFkYXRhRm91bmRGb3JUYXJnZXQgJiYgZW5jb2RpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC5lbmNvZGluZ0RlY2xSZXF1aXJlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFkYXRhRm91bmRGb3JUYXJnZXQgJiYgdmVyc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLnZlcnNpb25JbmZvUmVxdWlyZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGVuZAorICAgICAgICBpZiAoIXNraXBDaGFyKCc/JykpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC54bWxEZWNsVW50ZXJtaW5hdGVkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFza2lwQ2hhcignPicpKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci54bWwueG1sRGVjbFVudGVybWluYXRlZCIpOworCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIGZpbGwgaW4gcmV0dXJuIGFycmF5CisgICAgICAgIHBzZXVkb0F0dHJpYnV0ZVZhbHVlc1swXSA9IHZlcnNpb247CisgICAgICAgIHBzZXVkb0F0dHJpYnV0ZVZhbHVlc1sxXSA9IGVuY29kaW5nOworICAgICAgICBwc2V1ZG9BdHRyaWJ1dGVWYWx1ZXNbMl0gPSBzdGFuZGFsb25lOworICAgIH0KKworICAgIC8vIEFkYXB0ZWQgZnJvbToKKyAgICAvLyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTFNjYW5uZXIuc2NhblBzZXVkb0F0dHJpYnV0ZQorICAgIC8qKgorICAgICAqIFNjYW5zIGEgcHNldWRvIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY2FubmluZ1RleHREZWNsIFRydWUgaWYgc2Nhbm5pbmcgdGhpcyBwc2V1ZG8tYXR0cmlidXRlIGZvciBhCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgVGV4dERlY2w7IGZhbHNlIGlmIHNjYW5uaW5nIFhNTERlY2wuIFRoaXMgCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyBpcyBuZWVkZWQgdG8gcmVwb3J0IHRoZSBjb3JyZWN0IHR5cGUgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci4KKyAgICAgKiBAcGFyYW0gdmFsdWUgICAgICAgICAgICBUaGUgc3RyaW5nIHRvIGZpbGwgaW4gd2l0aCB0aGUgYXR0cmlidXRlIAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICoKKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoaXMgbWV0aG9kIHVzZXMgZlN0cmluZ0J1ZmZlcjIsIGFueXRoaW5nIGluIGl0CisgICAgICogYXQgdGhlIHRpbWUgb2YgY2FsbGluZyBpcyBsb3N0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc2NhblBzZXVkb0F0dHJpYnV0ZShib29sZWFuIHNjYW5uaW5nVGV4dERlY2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJpbmcgdmFsdWUpIAorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IHNjYW5OYW1lKCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC5wc2V1ZG9BdHRyTmFtZUV4cGVjdGVkIik7CisgICAgICAgIH0KKyAgICAgICAgc2tpcFNwYWNlcygpOworICAgICAgICBpZiAoIXNraXBDaGFyKCc9JykpIHsKKyAgICAgICAgICAgIHJlcG9ydEZhdGFsRXJyb3Ioc2Nhbm5pbmdUZXh0RGVjbCA/CisJCQkgICAgICJqc3AuZXJyb3IueG1sLmVxUmVxdWlyZWRJblRleHREZWNsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJqc3AuZXJyb3IueG1sLmVxUmVxdWlyZWRJblhNTERlY2wiLAorCQkJICAgICBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBza2lwU3BhY2VzKCk7CisgICAgICAgIGludCBxdW90ZSA9IHBlZWtDaGFyKCk7CisgICAgICAgIGlmIChxdW90ZSAhPSAnXCcnICYmIHF1b3RlICE9ICciJykgeworICAgICAgICAgICAgcmVwb3J0RmF0YWxFcnJvcihzY2FubmluZ1RleHREZWNsID8KKwkJCSAgICAgImpzcC5lcnJvci54bWwucXVvdGVSZXF1aXJlZEluVGV4dERlY2wiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImpzcC5lcnJvci54bWwucXVvdGVSZXF1aXJlZEluWE1MRGVjbCIgLAorCQkJICAgICBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBzY2FuQ2hhcigpOworICAgICAgICBpbnQgYyA9IHNjYW5MaXRlcmFsKHF1b3RlLCB2YWx1ZSk7CisgICAgICAgIGlmIChjICE9IHF1b3RlKSB7CisgICAgICAgICAgICBmU3RyaW5nQnVmZmVyMi5jbGVhcigpOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGZTdHJpbmdCdWZmZXIyLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGMgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyYnIHx8IGMgPT0gJyUnIHx8IGMgPT0gJzwnIHx8IGMgPT0gJ10nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmU3RyaW5nQnVmZmVyMi5hcHBlbmQoKGNoYXIpc2NhbkNoYXIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoWE1MQ2hhci5pc0hpZ2hTdXJyb2dhdGUoYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5TdXJyb2dhdGVzKGZTdHJpbmdCdWZmZXIyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChYTUxDaGFyLmlzSW52YWxpZChjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IHNjYW5uaW5nVGV4dERlY2wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJqc3AuZXJyb3IueG1sLmludmFsaWRDaGFySW5UZXh0RGVjbCIKKwkJCSAgICA6ICJqc3AuZXJyb3IueG1sLmludmFsaWRDaGFySW5YTUxEZWNsIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydEZhdGFsRXJyb3Ioa2V5LCBJbnRlZ2VyLnRvU3RyaW5nKGMsIDE2KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuQ2hhcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGMgPSBzY2FuTGl0ZXJhbChxdW90ZSwgdmFsdWUpOworICAgICAgICAgICAgfSB3aGlsZSAoYyAhPSBxdW90ZSk7CisgICAgICAgICAgICBmU3RyaW5nQnVmZmVyMi5hcHBlbmQodmFsdWUpOworICAgICAgICAgICAgdmFsdWUuc2V0VmFsdWVzKGZTdHJpbmdCdWZmZXIyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNraXBDaGFyKHF1b3RlKSkgeworICAgICAgICAgICAgcmVwb3J0RmF0YWxFcnJvcihzY2FubmluZ1RleHREZWNsID8KKwkJCSAgICAgImpzcC5lcnJvci54bWwuY2xvc2VRdW90ZU1pc3NpbmdJblRleHREZWNsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJqc3AuZXJyb3IueG1sLmNsb3NlUXVvdGVNaXNzaW5nSW5YTUxEZWNsIiwKKwkJCSAgICAgbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXR1cm4KKyAgICAgICAgcmV0dXJuIG5hbWU7CisKKyAgICB9CisgICAgCisgICAgLy8gQWRhcHRlZCBmcm9tOgorICAgIC8vIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MU2Nhbm5lci5zY2FuUElEYXRhCisgICAgLyoqCisgICAgICogU2NhbnMgYSBwcm9jZXNzaW5nIGRhdGEuIFRoaXMgaXMgbmVlZGVkIHRvIGhhbmRsZSB0aGUgc2l0dWF0aW9uCisgICAgICogd2hlcmUgYSBkb2N1bWVudCBzdGFydHMgd2l0aCBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gd2hvc2UgCisgICAgICogdGFyZ2V0IG5hbWUgPGVtPnN0YXJ0cyB3aXRoPC9lbT4gInhtbCIuIChlLmcuIHhtbGZvbykKKyAgICAgKgorICAgICAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBtZXRob2QgdXNlcyBmU3RyaW5nQnVmZmVyLCBhbnl0aGluZyBpbiBpdAorICAgICAqIGF0IHRoZSB0aW1lIG9mIGNhbGxpbmcgaXMgbG9zdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIFBJIHRhcmdldAorICAgICAqIEBwYXJhbSBkYXRhIFRoZSBzdHJpbmcgdG8gZmlsbCBpbiB3aXRoIHRoZSBkYXRhCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNjYW5QSURhdGEoU3RyaW5nIHRhcmdldCwgWE1MU3RyaW5nIGRhdGEpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gY2hlY2sgdGFyZ2V0CisgICAgICAgIGlmICh0YXJnZXQubGVuZ3RoKCkgPT0gMykgeworICAgICAgICAgICAgY2hhciBjMCA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh0YXJnZXQuY2hhckF0KDApKTsKKyAgICAgICAgICAgIGNoYXIgYzEgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UodGFyZ2V0LmNoYXJBdCgxKSk7CisgICAgICAgICAgICBjaGFyIGMyID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHRhcmdldC5jaGFyQXQoMikpOworICAgICAgICAgICAgaWYgKGMwID09ICd4JyAmJiBjMSA9PSAnbScgJiYgYzIgPT0gJ2wnKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLnJlc2VydmVkUElUYXJnZXQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNwYWNlcworICAgICAgICBpZiAoIXNraXBTcGFjZXMoKSkgeworICAgICAgICAgICAgaWYgKHNraXBTdHJpbmcoIj8+IikpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBmb3VuZCB0aGUgZW5kLCB0aGVyZSBpcyBubyBkYXRhCisgICAgICAgICAgICAgICAgZGF0YS5jbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGRhdGEgdGhlcmUgc2hvdWxkIGJlIHNvbWUgc3BhY2UKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci54bWwuc3BhY2VSZXF1aXJlZEluUEkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZTdHJpbmdCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgLy8gZGF0YQorICAgICAgICBpZiAoc2NhbkRhdGEoIj8+IiwgZlN0cmluZ0J1ZmZlcikpIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IHBlZWtDaGFyKCk7CisgICAgICAgICAgICAgICAgaWYgKGMgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhNTENoYXIuaXNIaWdoU3Vycm9nYXRlKGMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuU3Vycm9nYXRlcyhmU3RyaW5nQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChYTUxDaGFyLmlzSW52YWxpZChjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLmludmFsaWRDaGFySW5QSSIsCisJCQkJICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5DaGFyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChzY2FuRGF0YSgiPz4iLCBmU3RyaW5nQnVmZmVyKSk7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS5zZXRWYWx1ZXMoZlN0cmluZ0J1ZmZlcik7CisKKyAgICB9CisKKyAgICAvLyBBZGFwdGVkIGZyb206CisgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxTY2FubmVyLnNjYW5TdXJyb2dhdGVzCisgICAgLyoqCisgICAgICogU2NhbnMgc3Vycm9nYXRlcyBhbmQgYXBwZW5kIHRoZW0gdG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgICAgICogPHA+CisgICAgICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIGFzc3VtZXMgdGhlIGN1cnJlbnQgY2hhciBoYXMgYWxyZWFkeSBiZWVuCisgICAgICogaWRlbnRpZmllZCBhcyBhIGhpZ2ggc3Vycm9nYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZiBUaGUgU3RyaW5nQnVmZmVyIHRvIGFwcGVuZCB0aGUgcmVhZCBzdXJyb2dhdGVzIHRvLgorICAgICAqIEByZXR1cm5zIFRydWUgaWYgaXQgc3VjY2VlZGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzY2FuU3Vycm9nYXRlcyhYTUxTdHJpbmdCdWZmZXIgYnVmKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IGhpZ2ggPSBzY2FuQ2hhcigpOworICAgICAgICBpbnQgbG93ID0gcGVla0NoYXIoKTsKKyAgICAgICAgaWYgKCFYTUxDaGFyLmlzTG93U3Vycm9nYXRlKGxvdykpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC5pbnZhbGlkQ2hhckluQ29udGVudCIsCisJCQkgSW50ZWdlci50b1N0cmluZyhoaWdoLCAxNikpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHNjYW5DaGFyKCk7CisKKyAgICAgICAgLy8gY29udmVydCBzdXJyb2dhdGVzIHRvIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIKKyAgICAgICAgaW50IGMgPSBYTUxDaGFyLnN1cHBsZW1lbnRhbCgoY2hhciloaWdoLCAoY2hhcilsb3cpOworCisgICAgICAgIC8vIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIgbXVzdCBiZSBhIHZhbGlkIFhNTCBjaGFyYWN0ZXIKKyAgICAgICAgaWYgKCFYTUxDaGFyLmlzVmFsaWQoYykpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC5pbnZhbGlkQ2hhckluQ29udGVudCIsCisJCQkgSW50ZWdlci50b1N0cmluZyhjLCAxNikpOyAKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZpbGwgaW4gdGhlIGJ1ZmZlcgorICAgICAgICBidWYuYXBwZW5kKChjaGFyKWhpZ2gpOworICAgICAgICBidWYuYXBwZW5kKChjaGFyKWxvdyk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB9CisKKyAgICAvLyBBZGFwdGVkIGZyb206CisgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxTY2FubmVyLnJlcG9ydEZhdGFsRXJyb3IKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB1c2VkIGluIGFsbCBYTUwgc2Nhbm5lcnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlcG9ydEZhdGFsRXJyb3IoU3RyaW5nIG1zZ0lkLCBTdHJpbmcgYXJnKQorICAgICAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBlcnIuanNwRXJyb3IobXNnSWQsIGFyZyk7CisgICAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvWE1MU3RyaW5nLmphdmEgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9YTUxTdHJpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzExY2RkCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvWE1MU3RyaW5nLmphdmEKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIEludGVybmF0aW9uYWwKKyAqIEJ1c2luZXNzIE1hY2hpbmVzLCBJbmMuLCBodHRwOi8vd3d3LmFwYWNoZS5vcmcuICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci54bWxwYXJzZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgc3RydWN0dXJlIHRvIHBhc3MgdGV4dCBjb250YWluZWQgaW4gdGhlIHVuZGVybHlpbmcKKyAqIGNoYXJhY3RlciBidWZmZXIgb2YgdGhlIHNjYW5uZXIuIFRoZSBvZmZzZXQgYW5kIGxlbmd0aCBmaWVsZHMgYWxsb3cgdGhlCisgKiBidWZmZXIgdG8gYmUgcmUtdXNlZCB3aXRob3V0IGNyZWF0aW5nIG5ldyBjaGFyYWN0ZXIgYXJyYXlzLgorICogPHA+CisgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IE1ldGhvZHMgdGhhdCBhcmUgcGFzc2VkIGFuIFhNTFN0cmluZyBzdHJ1Y3R1cmUKKyAqIHNob3VsZCBjb25zaWRlciB0aGUgY29udGVudHMgcmVhZC1vbmx5IGFuZCBub3QgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucworICogdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuIFRoZSBtZXRob2QgcmVjZWl2aW5nIHRoaXMgc3RydWN0dXJlCisgKiBzaG91bGQgYWxzbyBub3QgbW9kaWZ5IHRoZSBvZmZzZXQgYW5kIGxlbmd0aCBpZiB0aGlzIHN0cnVjdHVyZSAob3IKKyAqIHRoZSB2YWx1ZXMgb2YgdGhpcyBzdHJ1Y3R1cmUpIGFyZSBwYXNzZWQgdG8gYW5vdGhlciBtZXRob2QuCisgKiA8cD4KKyAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gTWV0aG9kcyB0aGF0IGFyZSBwYXNzZWQgYW4gWE1MU3RyaW5nIHN0cnVjdHVyZQorICogYXJlIHJlcXVpcmVkIHRvIGNvcHkgdGhlIGluZm9ybWF0aW9uIG91dCBvZiB0aGUgYnVmZmVyIGlmIGl0IGlzIHRvIGJlCisgKiBzYXZlZCBmb3IgdXNlIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhlIG1ldGhvZC4gVGhlIGNvbnRlbnRzIG9mIHRoZSAKKyAqIHN0cnVjdHVyZSBhcmUgdm9sYXRpbGUgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhcmFjdGVyIGJ1ZmZlciBjYW5ub3QKKyAqIGJlIGFzc3VyZWQgb25jZSB0aGUgbWV0aG9kIHRoYXQgaXMgcGFzc2VkIHRoaXMgc3RydWN0dXJlIHJldHVybnMuCisgKiBUaGVyZWZvcmUsIG1ldGhvZHMgcGFzc2VkIHRoaXMgc3RydWN0dXJlIHNob3VsZCBub3Qgc2F2ZSBhbnkgcmVmZXJlbmNlCisgKiB0byB0aGUgc3RydWN0dXJlIG9yIHRoZSBjaGFyYWN0ZXIgYXJyYXkgY29udGFpbmVkIGluIHRoZSBzdHJ1Y3R1cmUuCisgKgorICogQGF1dGhvciBFcmljIFllLCBJQk0KKyAqIEBhdXRob3IgQW5keSBDbGFyaywgSUJNCisgKgorICogQHZlcnNpb24gJElkJAorICovCitwdWJsaWMgY2xhc3MgWE1MU3RyaW5nIHsKKworICAgIC8vCisgICAgLy8gRGF0YQorICAgIC8vCisKKyAgICAvKiogVGhlIGNoYXJhY3RlciBhcnJheS4gKi8KKyAgICBwdWJsaWMgY2hhcltdIGNoOworCisgICAgLyoqIFRoZSBvZmZzZXQgaW50byB0aGUgY2hhcmFjdGVyIGFycmF5LiAqLworICAgIHB1YmxpYyBpbnQgb2Zmc2V0OworCisgICAgLyoqIFRoZSBsZW5ndGggb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBvZmZzZXQuICovCisgICAgcHVibGljIGludCBsZW5ndGg7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9ycworICAgIC8vCisKKyAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KKyAgICBwdWJsaWMgWE1MU3RyaW5nKCkgeworICAgIH0gLy8gPGluaXQ+KCkKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gWE1MU3RyaW5nIHN0cnVjdHVyZSBwcmVzZXQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogdmFsdWVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjaCAgICAgVGhlIGNoYXJhY3RlciBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgaW50byB0aGUgY2hhcmFjdGVyIGFycmF5LgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIGxlbmd0aCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIG9mZnNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MU3RyaW5nKGNoYXJbXSBjaCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICBzZXRWYWx1ZXMoY2gsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICB9IC8vIDxpbml0PihjaGFyW10saW50LGludCkKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gWE1MU3RyaW5nIHN0cnVjdHVyZSB3aXRoIGNvcGllcyBvZiB0aGUgdmFsdWVzIGluCisgICAgICogdGhlIGdpdmVuIHN0cnVjdHVyZS4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoaXMgZG9lcyBub3QgY29weSB0aGUgY2hhcmFjdGVyIGFycmF5OworICAgICAqIG9ubHkgdGhlIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgaXMgY29waWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyBUaGUgWE1MU3RyaW5nIHRvIGNvcHkuCisgICAgICovCisgICAgcHVibGljIFhNTFN0cmluZyhYTUxTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIHNldFZhbHVlcyhzdHJpbmcpOworICAgIH0gLy8gPGluaXQ+KFhNTFN0cmluZykKKworICAgIC8vCisgICAgLy8gUHVibGljIG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBYTUxTdHJpbmcgc3RydWN0dXJlIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIHZhbHVlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2ggICAgIFRoZSBjaGFyYWN0ZXIgYXJyYXkuCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGludG8gdGhlIGNoYXJhY3RlciBhcnJheS4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBvZmZzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVzKGNoYXJbXSBjaCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICB0aGlzLmNoID0gY2g7CisgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKKyAgICB9IC8vIHNldFZhbHVlcyhjaGFyW10saW50LGludCkKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBjb250ZW50cyBvZiB0aGUgWE1MU3RyaW5nIHN0cnVjdHVyZSB3aXRoIGNvcGllcworICAgICAqIG9mIHRoZSBnaXZlbiBzdHJpbmcgc3RydWN0dXJlLgorICAgICAqIDxwPgorICAgICAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBkb2VzIG5vdCBjb3B5IHRoZSBjaGFyYWN0ZXIgYXJyYXk7CisgICAgICogb25seSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBhcnJheSBpcyBjb3BpZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoWE1MU3RyaW5nIHMpIHsKKyAgICAgICAgc2V0VmFsdWVzKHMuY2gsIHMub2Zmc2V0LCBzLmxlbmd0aCk7CisgICAgfSAvLyBzZXRWYWx1ZXMoWE1MU3RyaW5nKQorCisgICAgLyoqIFJlc2V0cyBhbGwgb2YgdGhlIHZhbHVlcyB0byB0aGVpciBkZWZhdWx0cy4gKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgdGhpcy5jaCA9IG51bGw7CisgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKKyAgICAgICAgdGhpcy5sZW5ndGggPSAtMTsKKyAgICB9IC8vIGNsZWFyKCkKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGVudHMgb2YgdGhpcyBYTUxTdHJpbmcgc3RydWN0dXJlIGFuZAorICAgICAqIHRoZSBzcGVjaWZpZWQgYXJyYXkgYXJlIGVxdWFsLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjaCAgICAgVGhlIGNoYXJhY3RlciBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgaW50byB0aGUgY2hhcmFjdGVyIGFycmF5LgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIGxlbmd0aCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIG9mZnNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoY2hhcltdIGNoLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChjaCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMubGVuZ3RoICE9IGxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGhpcy5jaFt0aGlzLm9mZnNldCtpXSAhPSBjaFtvZmZzZXQraV0gKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gLy8gZXF1YWxzKGNoYXJbXSxpbnQsaW50KTpib29sZWFuCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRlbnRzIG9mIHRoaXMgWE1MU3RyaW5nIHN0cnVjdHVyZSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhcmUgZXF1YWwuCisgICAgICogCisgICAgICogQHBhcmFtIHMgVGhlIHN0cmluZyB0byBjb21wYXJlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhTdHJpbmcgcykgeworICAgICAgICBpZiAocyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBsZW5ndGggIT0gcy5sZW5ndGgoKSApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlzIHRoaXMgZmFzdGVyIHRoYW4gY2FsbCBzLnRvQ2hhckFycmF5IGZpcnN0IGFuZCBjb21wYXJlIHRoZSAKKyAgICAgICAgLy8gdHdvIGFycmF5cyBkaXJlY3RseSwgd2hpY2ggd2lsbCBwb3NzaWJseSBpbnZvbHZlIGNyZWF0aW5nIGEKKyAgICAgICAgLy8gbmV3IGNoYXIgYXJyYXkgb2JqZWN0LgorICAgICAgICBmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjaFtvZmZzZXQraV0gIT0gcy5jaGFyQXQoaSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IC8vIGVxdWFscyhTdHJpbmcpOmJvb2xlYW4KKworICAgIC8vCisgICAgLy8gT2JqZWN0IG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGxlbmd0aCA+IDAgPyBuZXcgU3RyaW5nKGNoLCBvZmZzZXQsIGxlbmd0aCkgOiAiIjsKKyAgICB9IC8vIHRvU3RyaW5nKCk6U3RyaW5nCisKK30gLy8gY2xhc3MgWE1MU3RyaW5nCmRpZmYgLS1naXQgYS9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9YTUxTdHJpbmdCdWZmZXIuamF2YSBiL2phc3Blci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL1hNTFN0cmluZ0J1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ODAyZDAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9YTUxTdHJpbmdCdWZmZXIuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCisgKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgSW50ZXJuYXRpb25hbAorICogQnVzaW5lc3MgTWFjaGluZXMsIEluYy4sIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlcjsKKworLyoqCisgKiBYTUxTdHJpbmcgaXMgYSBzdHJ1Y3R1cmUgdXNlZCB0byBwYXNzIGNoYXJhY3RlciBhcnJheXMuIEhvd2V2ZXIsCisgKiBYTUxTdHJpbmdCdWZmZXIgaXMgYSBidWZmZXIgaW4gd2hpY2ggY2hhcmFjdGVycyBjYW4gYmUgYXBwZW5kZWQKKyAqIGFuZCBleHRlbmRzIFhNTFN0cmluZyBzbyB0aGF0IGl0IGNhbiBiZSBwYXNzZWQgdG8gbWV0aG9kcworICogZXhwZWN0aW5nIGFuIFhNTFN0cmluZyBvYmplY3QuIFRoaXMgaXMgYSBzYWZlIG9wZXJhdGlvbiBiZWNhdXNlCisgKiBpdCBpcyBhc3N1bWVkIHRoYXQgYW55IGNhbGxlZSB3aWxsIDxzdHJvbmc+bm90PC9zdHJvbmc+IG1vZGlmeQorICogdGhlIGNvbnRlbnRzIG9mIHRoZSBYTUxTdHJpbmcgc3RydWN0dXJlLgorICogPHA+IAorICogVGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgYXJlIG1hbmFnZWQgYnkgdGhlIHN0cmluZyBidWZmZXIuIEFzCisgKiBjaGFyYWN0ZXJzIGFyZSBhcHBlbmRlZCwgdGhlIHN0cmluZyBidWZmZXIgd2lsbCBncm93IGFzIG5lZWRlZC4KKyAqIDxwPgorICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBOZXZlciBzZXQgdGhlIDxjb2RlPmNoPC9jb2RlPiwgCisgKiA8Y29kZT5vZmZzZXQ8L2NvZGU+LCBhbmQgPGNvZGU+bGVuZ3RoPC9jb2RlPiBmaWVsZHMgZGlyZWN0bHkuCisgKiBUaGVzZSBmaWVsZHMgYXJlIG1hbmFnZWQgYnkgdGhlIHN0cmluZyBidWZmZXIuIEluIG9yZGVyIHRvIHJlc2V0CisgKiB0aGUgYnVmZmVyLCBjYWxsIDxjb2RlPmNsZWFyKCk8L2NvZGU+LgorICogCisgKiBAYXV0aG9yIEFuZHkgQ2xhcmssIElCTQorICogQGF1dGhvciBFcmljIFllLCBJQk0KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxTdHJpbmdCdWZmZXIKKyAgICBleHRlbmRzIFhNTFN0cmluZyB7CisKKyAgICAvLworICAgIC8vIENvbnN0YW50cworICAgIC8vCisKKyAgICAvKiogRGVmYXVsdCBidWZmZXIgc2l6ZSAoMzIpLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU0laRSA9IDMyOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RvcnMKKyAgICAvLworCisgICAgLyoqCisgICAgICogCisgICAgICovCisgICAgcHVibGljIFhNTFN0cmluZ0J1ZmZlcigpIHsKKyAgICAgICAgdGhpcyhERUZBVUxUX1NJWkUpOworICAgIH0gLy8gPGluaXQ+KCkKKworICAgIC8qKgorICAgICAqIAorICAgICAqIAorICAgICAqIEBwYXJhbSBzaXplIAorICAgICAqLworICAgIHB1YmxpYyBYTUxTdHJpbmdCdWZmZXIoaW50IHNpemUpIHsKKyAgICAgICAgY2ggPSBuZXcgY2hhcltzaXplXTsKKyAgICB9IC8vIDxpbml0PihpbnQpCisKKyAgICAvKiogQ29uc3RydWN0cyBhIHN0cmluZyBidWZmZXIgZnJvbSBhIGNoYXIuICovCisgICAgcHVibGljIFhNTFN0cmluZ0J1ZmZlcihjaGFyIGMpIHsKKyAgICAgICAgdGhpcygxKTsKKyAgICAgICAgYXBwZW5kKGMpOworICAgIH0gLy8gPGluaXQ+KGNoYXIpCisKKyAgICAvKiogQ29uc3RydWN0cyBhIHN0cmluZyBidWZmZXIgZnJvbSBhIFN0cmluZy4gKi8KKyAgICBwdWJsaWMgWE1MU3RyaW5nQnVmZmVyKFN0cmluZyBzKSB7CisgICAgICAgIHRoaXMocy5sZW5ndGgoKSk7CisgICAgICAgIGFwcGVuZChzKTsKKyAgICB9IC8vIDxpbml0PihTdHJpbmcpCisKKyAgICAvKiogQ29uc3RydWN0cyBhIHN0cmluZyBidWZmZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBhcnJheS4gKi8KKyAgICBwdWJsaWMgWE1MU3RyaW5nQnVmZmVyKGNoYXJbXSBjaCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICB0aGlzKGxlbmd0aCk7CisgICAgICAgIGFwcGVuZChjaCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0gLy8gPGluaXQ+KGNoYXJbXSxpbnQsaW50KQorCisgICAgLyoqIENvbnN0cnVjdHMgYSBzdHJpbmcgYnVmZmVyIGZyb20gdGhlIHNwZWNpZmllZCBYTUxTdHJpbmcuICovCisgICAgcHVibGljIFhNTFN0cmluZ0J1ZmZlcihYTUxTdHJpbmcgcykgeworICAgICAgICB0aGlzKHMubGVuZ3RoKTsKKyAgICAgICAgYXBwZW5kKHMpOworICAgIH0gLy8gPGluaXQ+KFhNTFN0cmluZykKKworICAgIC8vCisgICAgLy8gUHVibGljIG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqIENsZWFycyB0aGUgc3RyaW5nIGJ1ZmZlci4gKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgbGVuZ3RoID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhcHBlbmQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYyAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBlbmQoY2hhciBjKSB7CisgICAgICAgIGlmICh0aGlzLmxlbmd0aCArIDEgPiB0aGlzLmNoLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgbmV3TGVuZ3RoID0gdGhpcy5jaC5sZW5ndGgqMjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0xlbmd0aCA8IHRoaXMuY2gubGVuZ3RoICsgREVGQVVMVF9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVuZ3RoID0gdGhpcy5jaC5sZW5ndGggKyBERUZBVUxUX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBuZXdjaCA9IG5ldyBjaGFyW25ld0xlbmd0aF07CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGhpcy5jaCwgMCwgbmV3Y2gsIDAsIHRoaXMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jaCA9IG5ld2NoOworICAgICAgICB9CisgICAgICAgIHRoaXMuY2hbdGhpcy5sZW5ndGhdID0gYzsKKyAgICAgICAgdGhpcy5sZW5ndGgrKzsKKyAgICB9IC8vIGFwcGVuZChjaGFyKQorCisgICAgLyoqCisgICAgICogYXBwZW5kCisgICAgICogCisgICAgICogQHBhcmFtIHMgCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kKFN0cmluZyBzKSB7CisgICAgICAgIGludCBsZW5ndGggPSBzLmxlbmd0aCgpOworICAgICAgICBpZiAodGhpcy5sZW5ndGggKyBsZW5ndGggPiB0aGlzLmNoLmxlbmd0aCkgeworICAgICAgICAgICAgaW50IG5ld0xlbmd0aCA9IHRoaXMuY2gubGVuZ3RoKjI7CisgICAgICAgICAgICBpZiAobmV3TGVuZ3RoIDwgdGhpcy5sZW5ndGggKyBsZW5ndGggKyBERUZBVUxUX1NJWkUpCisgICAgICAgICAgICAgICAgbmV3TGVuZ3RoID0gdGhpcy5jaC5sZW5ndGggKyBsZW5ndGggKyBERUZBVUxUX1NJWkU7CisgICAgICAgICAgICBjaGFyW10gbmV3Y2ggPSBuZXcgY2hhcltuZXdMZW5ndGhdOyAgICAgICAgICAgIAorICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0aGlzLmNoLCAwLCBuZXdjaCwgMCwgdGhpcy5sZW5ndGgpOworICAgICAgICAgICAgdGhpcy5jaCA9IG5ld2NoOworICAgICAgICB9CisgICAgICAgIHMuZ2V0Q2hhcnMoMCwgbGVuZ3RoLCB0aGlzLmNoLCB0aGlzLmxlbmd0aCk7CisgICAgICAgIHRoaXMubGVuZ3RoICs9IGxlbmd0aDsKKyAgICB9IC8vIGFwcGVuZChTdHJpbmcpCisKKyAgICAvKioKKyAgICAgKiBhcHBlbmQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2ggCisgICAgICogQHBhcmFtIG9mZnNldCAKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFwcGVuZChjaGFyW10gY2gsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKHRoaXMubGVuZ3RoICsgbGVuZ3RoID4gdGhpcy5jaC5sZW5ndGgpIHsKKyAgICAgICAgICAgIGNoYXJbXSBuZXdjaCA9IG5ldyBjaGFyW3RoaXMuY2gubGVuZ3RoICsgbGVuZ3RoICsgREVGQVVMVF9TSVpFXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGhpcy5jaCwgMCwgbmV3Y2gsIDAsIHRoaXMubGVuZ3RoKTsKKyAgICAgICAgICAgIHRoaXMuY2ggPSBuZXdjaDsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNoLCBvZmZzZXQsIHRoaXMuY2gsIHRoaXMubGVuZ3RoLCBsZW5ndGgpOworICAgICAgICB0aGlzLmxlbmd0aCArPSBsZW5ndGg7CisgICAgfSAvLyBhcHBlbmQoY2hhcltdLGludCxpbnQpCisKKyAgICAvKioKKyAgICAgKiBhcHBlbmQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcyAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBlbmQoWE1MU3RyaW5nIHMpIHsKKyAgICAgICAgYXBwZW5kKHMuY2gsIHMub2Zmc2V0LCBzLmxlbmd0aCk7CisgICAgfSAvLyBhcHBlbmQoWE1MU3RyaW5nKQorCit9IC8vIGNsYXNzIFhNTFN0cmluZ0J1ZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS8uY2xhc3NwYXRoIGIvc2VydmxldGFwaS8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YmNlMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqc3IxNTIvc3JjL3NoYXJlIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ianNyMTU0L3NyYy9zaGFyZSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImpzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2xpYi9qc3RsLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImpzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2xpYi9zdGFuZGFyZC5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS8ucHJvamVjdCBiL3NlcnZsZXRhcGkvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhY2NhNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvLnByb2plY3QKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+c2VydmxldGFwaTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi8uY3ZzaWdub3JlIGIvc2VydmxldGFwaS9qc3IxNTIvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmMxNTc0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvLmN2c2lnbm9yZQpAQCAtMCwwICsxLDQgQEAKK2J1aWxkCitidWlsZC5wcm9wZXJ0aWVzLnNhbXBsZQorZGlzdAorbGliCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9CVUlMRElORy50eHQgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9CVUlMRElORy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0NmM1OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL0JVSUxESU5HLnR4dApAQCAtMCwwICsxLDEzNCBAQAorJElkJAorCisKKyAgICAgICAgICAgICAgIEJ1aWxkaW5nIFRoZSBKYXZhIFNlcnZsZXQgYW5kIEpTUCBBUEkgQ2xhc3NlcworICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgc3VicHJvamVjdCBjb250YWlucyB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIG9mIHRoZQorSmF2YSBTZXJ2bGV0IGFuZCBKU1AgQVBJcyAocGFja2FnZXMgamF2YXguc2VydmxldCwgamF2YXguc2VydmxldC5odHRwLAoramF2YXguc2VydmxldC5qc3AsIGFuZCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQpLiAgSW4gb3JkZXIgdG8gYnVpbGQgdGhlc2UKK3NvdXJjZXMgc3VjY2Vzc2Z1bGx5LCB5b3UgbXVzdCBkbyB0aGUgZm9sbG93aW5nOgorCisKKygxKSBEb3dubG9hZCBhbmQgSW5zdGFsbCB0aGUgQW50IEJpbmFyeSBEaXN0cmlidXRpb24KKworTk9URTogIFRoZXNlIGluc3RydWN0aW9ucyBhc3N1bWUgdGhhdCB5b3UgYXJlIHVzaW5nIHRoZSBBbnQgMS4zIHJlbGVhc2UuCitQcm9jZWR1cmVzIGZvciBBbnQgMS40IGFuZCBsYXRlciB2ZXJzaW9ucyBzaG91bGQgYmUgc2ltaWxhciwgYnV0IGhhdmUgbm90CitiZWVuIHRlc3RlZC4KKworKiBEb3dubG9hZCBhIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgQW50IDEuMyBmcm9tOgorCisgICAgaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9idWlsZHMvamFrYXJ0YS1hbnQvcmVsZWFzZS92MS4zL2Jpbi8KKworICBPbiBhIFdpbmRvd3MgcGxhdGZvcm0sIHlvdSB3aWxsIG5lZWQ6CisgICAgamFrYXJ0YS1hbnQtMS4zLWJpbi56aXAKKyAgICBqYWthcnRhLWFudC0xLjMtb3B0aW9uYWwuamFyCisKKyAgT24gYSBVbml4IHBsYXRmb3JtLCB5b3Ugd2lsbCBuZWVkOgorICAgIGpha2FydGEtYW50LTEuMy1iaW4udGFyLmd6CisgICAgamFrYXJ0YS1hbnQtMS4zLW9wdGlvbmFsLmphcgorCisqIFVucGFjayB0aGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiBpbnRvIGEgY29udmVuaWVudCBsb2NhdGlvbiBzbyB0aGF0IHRoZQorICBBbnQgcmVsZWFzZSByZXNpZGVzIGluIGl0cyBvd24gZGlyZWN0b3J5IChjb252ZW50aW9uYWxseSBuYW1lZAorICAiamFrYXJ0YS1hbnQtMS4zIikuICBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSByZW1haW5kZXIgb2YgdGhpcyBkb2N1bWVudCwKKyAgdGhlIHN5bWJvbGljIG5hbWUgIiR7YW50LmhvbWV9IiBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBmdWxsIHBhdGhuYW1lIG9mCisgIHRoZSByZWxlYXNlIGRpcmVjdG9yeS4KKworKiBDb3B5IHRoZSBmaWxlICJqYWthcnRhLWFudC0xLjMtb3B0aW9uYWwuamFyIiwgZG93bmxvYWRlZCBhYm92ZSwgaW50bworICB0aGUgZGlyZWN0b3J5ICIke2FudC5ob21lfS9saWIiLiAgVGhpcyBtYWtlcyBhdmFpbGFibGUgc2V2ZXJhbCBBbnQKKyAgZXh0ZW5zaW9uIGNvbW1hbmRzIHRoYXQgYXJlIGNvbW1vbmx5IHJlcXVpcmVkIHdoZW4gYnVpbGRpbmcgSmFrYXJ0YQorICBiYXNlZCBwcm9qZWN0cy4KKworKiBNb2RpZnkgdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gaW5jbHVkZSBkaXJlY3RvcnkKKyAgIiR7YW50LmhvbWV9L2JpbiIgaW4gaXRzIGxpc3QuICBUaGlzIG1ha2VzIHRoZSAiYW50IiBjb21tYW5kIGxpbmUgc2NyaXB0CisgIGF2YWlsYWJsZSwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGFjdHVhbGx5IHBlcmZvcm0gdGhlIGJ1aWxkLgorCisKKygyKSBEb3dubG9hZCBhbmQgSW5zdGFsbCB0aGUgSkFYUC8xLjEgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uIChPUFRJT05BTCkKKworTk9URTogIEFsdGhvdWdoIHRoaXMgc3RlcCBpcyBub3QgcmVxdWlyZWQgdG8gYnVpbGQgdGhpcyBwYXJ0aWN1bGFyIHN1YnByb2plY3QsCitpdCBpcyBjb21tb25seSByZXF1aXJlZCB0byBidWlsZCBvdGhlciBKYWthcnRhIHByb2plY3RzLiAgSGVuY2UsIHRoZSBzdGVwcworcmVxdWlyZWQgYXJlIGRvY3VtZW50ZWQgaGVyZS4KKworKiBEb3dubG9hZCBhIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgSkFYUCAxLjEgKEZpbmFsIFZlcnNpb24pIGZyb206CisKKyAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9kb3dubG9hZC5odG1sCisKKyogVW5wYWNrIHRoZSBiaW5hcnkgZGlzdHJpYnV0aW9uIGludG8gYSBjb252ZW5pZW50IGxvY2F0aW9uIHNvIHRoYXQgdGhlCisgIEpBWFAvMS4xIHJlbGVhc2UgcmVzaWRlcyBpbiBpdHMgb3duIGRpcmVjdG9yeSAoY29udmVudGlvbmFsbHkgbmFtZWQKKyAgImpheHAtMS4xIi4gIEZvciB0aGUgcHVycG9zZXMgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGlzIGRvY3VtZW50LCB0aGUKKyAgc3ltYm9saWMgbmFtZSAiJHtqYXhwLmhvbWV9IiBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBmdWxsIHBhdGhuYW1lIG9mCisgIHRoZSByZWxlYXNlIGRpcmVjdG9yeS4KKworKiBNYWtlIHRoZSBKQVIgZmlsZXMgb2YgdGhpcyBkaXN0cmlidXRpb24gKCJjcmltc29uLmphciIsICJqYXhwLmphciIsIGFuZAorICAieGFsYW4uamFyIikgYXZhaWxhYmxlIGZvciB1c2UgYnkgcGVyZm9ybWluZyBPTkUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCisgIC0gUmVtb3ZlIHRoZSBleGlzdGluZyAiamF4cC5qYXIiIGFuZCAicGFyc2VyLmphciIgZmlsZXMgZm91bmQgaW4gdGhlCisgICAgIiR7YW50LmhvbWV9L2xpYiIgZGlyZWN0b3J5LCBhbmQgY29weSB0aGVzZSBKQVIgZmlsZXMgaW50byB0aGUKKyAgICAiJHthbnQuaG9tZX0vbGliIiBkaXJlY3RvcnkgKHByZWZlcmVkIG9wdGlvbikuCisKKyAgLSBBZGQgdGhlc2UgZmlsZXMgdG8geW91ciBDTEFTU1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKworKDMpIERvd25sb2FkIGFuZCBJbnN0YWxsIFN1YnByb2plY3QgU291cmNlIENvZGUKKworKiBVc2UgQW5vbnltb3VzIENWUyAoYXMgZGVzY3JpYmVkIG9uIHRoZSBKYWthcnRhIHdlYiBzaXRlIGF0CisgIDxodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3NpdGUvY3ZzaW5kZXguaHRtbD4sIG9yCisgIGRvd25sb2FkIGEgc291cmNlIGRpc3RyaWJ1dGlvbiBmcm9tOgorCisgICAgaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9idWlsZHMvamFrYXJ0YS1zZXJ2bGV0YXBpLTQvbmlnaHRseS9zcmMvCisKKyAgT24gYSBXaW5kb3dzIHBsYXRmb3JtLCB5b3Ugd2lsbCBuZWVkOgorICAgIGpha2FydGEtc2VydmxldGFwaS00LXNyYy1ZWVlZTU1ERC56aXAKKworICBPbiBhIFVuaXggcGxhdGZvcm0sIHlvdSB3aWxsIG5lZWQ6CisgICAgamFrYXJ0YS1zZXJ2bGV0YXBpLTQtc3JjLVlZWVlNTURELnppcAorCisgIChBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRvd25sb2FkIHRoZSBTZXJ2bGV0IEFQSSBzb3VyY2UgZGlzdHJpYnV0aW9uCisgIGZyb20gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHlvdSBmaW5kIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBUb21jYXQgNC4KKyAgU3VjaCBkaXN0cmlidXRpb25zIHdpbGwgY29udGFpbiBleGFjdGx5IHRoZSBTZXJ2bGV0IEFQSSBjbGFzc2VzIHVzZWQKKyAgdG8gYnVpbGQgdGhlICJzZXJ2bGV0LmphciIgZmlsZSBpbnNpZGUgdGhhdCBUb21jYXQgZGlzdHJpYnV0aW9uLikKKworKiBVbnBhY2sgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gaW50byBhIGNvbnZlbmllbnQgbG9jYXRpb24gc28gdGhhdCB0aGUKKyAgZGlzdHJpYnV0aW9uIHJlc2lkZXMgaW4gaXRzIG93biBkaXJlY3RvcnkgKGNvbnZlbnRpb25hbGx5IG5hbWVkCisgICJqYWthcnRhLXNlcnZsZXRhcGktNCIpLiAgRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUgcmVtYWluZGVyIG9mIHRoaXMgZG9jdW1lbnQsCisgIHRoZSBzeW1ib2xpYyBuYW1lICIke3NlcnZsZXRhcGkuc291cmNlfSIgaXMgdXNlZCB0byByZWZlciB0byB0aGUgZnVsbAorICBwYXRobmFtZSBvZiB0aGUgcmVsZWFzZSBkaXJlY3RvcnkuCisKKworKDQpIEN1c3RvbWl6ZSBCdWlsZCBQcm9wZXJ0aWVzIEZvciBUaGlzIFN1YnByb2plY3QKKworTW9zdCBKYWthcnRhIHN1YnByb2plY3RzIGFsbG93IHlvdSB0byBjdXN0b21pemUgQW50IHByb3BlcnRpZXMgKHdpdGggZGVmYXVsdAordmFsdWVzIGRlZmluZWQgaW4gdGhlICJidWlsZC54bWwiIGZpbGUuICBUaGlzIGlzIGRvbmUgYnkgY3JlYXRpbmcgYSB0ZXh0IGZpbGUKK25hbWVkICJidWlsZC5wcm9wZXJ0aWVzIiBpbiB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBkaXJlY3RvcnkgKGZvciBwcm9wZXJ0eQorZGVmaW5pdGlvbnMgbG9jYWwgdG8gdGhpcyBzdWJwcm9qZWN0KSBhbmQvb3IgeW91ciB1c2VyIGhvbWUgZGlyZWN0b3J5IChmb3IKK3Byb3BlcnR5IGRlZmluaXRpb25zIHNoYXJlZCBhY3Jvc3Mgc3VicHJvamVjdHMpLgorCitUaGUgImpha2FydGEtc2VydmxldGFwaS00IiBzdWJwcm9qZWN0IGRvZXMgbm90IGRlZmluZSBhbnkgY3VzdG9taXphYmxlCitidWlsZCBwcm9wZXJ0aWVzLgorCisKKyg1KSBCdWlsZCBBIEJpbmFyeSBEaXN0cmlidXRpb24KKworT3BlbiBhIGNvbW1hbmQgbGluZSBzaGVsbCwgYW5kIGlzc3VlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKyAgY2QgJHtzZXJ2bGV0YXBpLnNvdXJjZX0KKyAgYW50IC1wcm9qZWN0aGVscAorCitJZiBldmVyeXRoaW5nIGlzIGluc3RhbGxlZCBjb3JyZWN0bHksIHlvdSBzaG91bGQgc2VlIGEgbGlzdCBvZiB0aGUgQW50CisidGFyZ2V0cyIgdGhhdCByZXByZXNlbnQgZGlmZmVyZW50IGNvbW1hbmRzIHlvdSBtaWdodCB3aXNoIHRvIGJ1aWxkLiAgQnkKK2NvbnZlbnRpb24sIHRoZSAiZGlzdCIgdGFyZ2V0IGNyZWF0ZXMgYSBjb21wbGV0ZSBiaW5hcnkgZGlzdHJpYnV0aW9uLiAgVG8KK2V4ZWN1dGUgaXQsIHR5cGUgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworICBjZCAke3NlcnZsZXRhcGkuc291cmNlfQorICBhbnQgZGlzdAorCitUaGlzIHdpbGwgY3JlYXRlIGEgY29tcGxldGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiB0aGUgc3VicHJvamVjdCAoZXF1aXZhbGVudAoraW4gc3RydWN0dXJlIHRvIHRoZSBjb3JyZXNwb25kaW5nIGJpbmFyeSBkaXN0cmlidXRpb24gZG93bmxvYWRhYmxlIGZyb20gdGhlCitKYWthcnRhIHdlYiBzaXRlKSwgaW4gdGhlICIke3NlcnZsZXRhcGkuc291cmNlfS9kaXN0IiBkaXJlY3RvcnkuICBJdCB3aWxsIGhhdmUKK3RoZSBjb250ZW50cyBkZXNjcmliZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgIlJFQURNRS50eHQiIGZpbGUuCisKK1RoZSBmaWxlIG1vc3QgY29tbW9ubHkgcmVxdWlyZWQgYnkgb3RoZXIgcHJvamVjdHMgd2lsbCBiZSB0aGUgInNlcnZsZXQuamFyIgorZmlsZSwgZm91bmQgaW4gIiR7c2VydmxldGFwaS5zb3VyY2V9L2xpYi9zZXJ2bGV0LmphciIuICBNYWtlIGEgbm90ZSBvZiB0aGUKK2Z1bGwgcGF0aG5hbWUgdG8gdGhpcyBmaWxlLCBiZWNhdXNlIHlvdSB3aWxsIG5lZWQgaXQgd2hlbiBjdXN0b21pemluZyBidWlsZAorcHJvcGVydGllcyBmb3Igb3RoZXIgSmFrYXJ0YSBzdWJwcm9qZWN0cyB0aGF0IGRlcGVuZCBvbiB0aGVzZSBjbGFzc2VzLgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvTElDRU5TRSBiL3NlcnZsZXRhcGkvanNyMTUyL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0NTY5NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL0xJQ0VOU0UKQEAgLTAsMCArMSwyMDIgQEAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9SRUFETUUudHh0IGIvc2VydmxldGFwaS9qc3IxNTIvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGI4MzI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvUkVBRE1FLnR4dApAQCAtMCwwICsxLDI4IEBACiskSWQkCisKKyAgICAgICAgICAgICAgICAgICAgICBKYXZhIFNlcnZsZXQgYW5kIEpTUCBBUEkgQ2xhc3NlcworICAgICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgc3VicHJvamVjdCBjb250YWlucyB0aGUgY29tcGlsZWQgY29kZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgb2YKK3RoZSBKYXZhIFNlcnZsZXQgYW5kIEpTUCBBUElzIChwYWNrYWdlcyBqYXZheC5zZXJ2bGV0LCBqYXZheC5zZXJ2bGV0Lmh0dHAsCitqYXZheC5zZXJ2bGV0LmpzcCwgYW5kIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dCkuICBJdCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nCitjb250ZW50czoKKworCisgIEJVSUxESU5HLnR4dCAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nIGZyb20gc291cmNlcworICBMSUNFTlNFICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgZm9yIHRoaXMgcmVsZWFzZQorICBSRUFETUUudHh0ICAgICAgICAgICAgICAgICAgVGhpcyBkb2N1bWVudAorICBkb2NzLyAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBmb3IgdGhpcyByZWxlYXNlCisgICAgICBhcGkvICAgICAgICAgICAgICAgICAgICBKYXZhZG9jcyBmb3IgU2VydmxldCBhbmQgSlNQIEFQSSBjbGFzc2VzCisgIGxpYi8gICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnkgSkFSIGZpbGVzIGZvciB0aGlzIHJlbGVhc2UKKyAgICAgIHNlcnZsZXQuamFyICAgICAgICAgICAgIEJpbmFyeSBTZXJ2bGV0IGFuZCBKU1AgQVBJIGNsYXNzZXMKKyAgc3JjLyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZXMgZm9yIFNlcnZsZXQgYW5kIEpTUCBBUEkgY2xhc3NlcworCitJbiBnZW5lcmFsLCB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB0aGUgInNlcnZsZXQuamFyIiBmaWxlIChmb3VuZCBpbiB0aGUgImxpYiIKK3N1YmRpcmVjdG9yeSBvZiB0aGlzIHJlbGVhc2UpIGludG8gdGhlIGNvbXBpbGF0aW9uIGNsYXNzIHBhdGggZm9yIHlvdXIKK3Byb2plY3RzIHRoYXQgZGVwZW5kIG9uIHRoZXNlIEFQSXMuCisKK1RoZSBjb21waWxlZCAic2VydmxldC5qYXIiIGZpbGUgaW5jbHVkZWQgaW4gdGhpcyBzdWJwcm9qZWN0IGlzIGF1dG9tYXRpY2FsbHkKK2luY2x1ZGVkIGluIGJpbmFyeSBkaXN0cmlidXRpb25zIG9mIFRvbWNhdCA0LjAsIHNvIHlvdSBuZWVkIG5vdCBkb3dubG9hZCB0aGlzCitzdWJwcm9qZWN0IHNlcGFyYXRlbHkgdW5sZXNzIHlvdSB3aXNoIHRvIHV0aWxpemUgdGhlIEphdmFkb2NzLCBvciBwZXJ1c2UgdGhlCitzb3VyY2UgY29kZSB0byBzZWUgaG93IHRoZSBBUEkgY2xhc3NlcyBhcmUgaW1wbGVtZW50ZWQuCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9idWlsZC54bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmMTdjNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2J1aWxkLnhtbApAQCAtMCwwICsxLDI3OSBAQAorPHByb2plY3QgbmFtZT0iSlNQIEFQSSBDbGFzc2VzIiBkZWZhdWx0PSJjb21waWxlIiBiYXNlZGlyPSIuIj4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBFbnZpcm9ubWVudGFsIFByb3BlcnRpZXMgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPCEtLSBMb2FkIHVzZXIgcHJvcGVydHkgZGVmaW5pdGlvbiBvdmVycmlkZXMgLS0+CisgIDxwcm9wZXJ0eSBmaWxlPSJidWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3VzZXIuaG9tZX0vYnVpbGQucHJvcGVydGllcyIvPgorCisgIDwhLS0gRXN0YWJsaXNoIHByb3BlcnR5IGRlZmluaXRpb24gZGVmYXVsdHMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLmRlYnVnIiAgICAgICB2YWx1ZT0idHJ1ZSIvPgorICA8cHJvcGVydHkgbmFtZT0iY29tcGlsZS5kZXByZWNhdGlvbiIgdmFsdWU9ImZhbHNlIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLm9wdGltaXplIiAgICB2YWx1ZT0idHJ1ZSIvPgorICA8cHJvcGVydHkgbmFtZT0iaW1wbGVtZW50YXRpb24ucmV2aXNpb24iIHZhbHVlPSJwdWJsaWNfZHJhZnQiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImpzcC1hcGkuYnVpbGQiICAgIHZhbHVlPSJidWlsZCIvPgorICA8cHJvcGVydHkgbmFtZT0ianNwLWFwaS5kaXN0IiAgICAgdmFsdWU9ImRpc3QiLz4KKyAgPHByb3BlcnR5IG5hbWU9InNlcnZsZXQtYXBpLmphciIgIHZhbHVlPSIuLi9qc3IxNTQvZGlzdC9saWIvc2VydmxldC1hcGkuamFyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqc3AtYXBpLmphciIgdmFsdWU9IiR7anNwLWFwaS5kaXN0fS9saWIvanNwLWFwaS5qYXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImpzcC1hbnR0YXNrLmphciIgdmFsdWU9IiR7anNwLWFwaS5idWlsZH0vanNwLWFudHRhc2suamFyIiAvPgorCisgIDxwYXRoIGlkPSJleGFtcGxlcy5jbGFzc3BhdGgiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqc3AtYXBpLmJ1aWxkfS9jbGFzc2VzIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3NlcnZsZXQtYXBpLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bWFpbC5qYXJ9Ii8+CisgIDwvcGF0aD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IFByZXBhcmUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJwcmVwYXJlIj4KKworICAgIDwhLS0gIkJ1aWxkIiBIaWVyYXJjaHkgLS0+CisgICAgPG1rZGlyIGRpcj0iJHtqc3AtYXBpLmJ1aWxkfSIvPgorICAgIDxta2RpciBkaXI9IiR7anNwLWFwaS5idWlsZH0vY2xhc3NlcyIvPgorICAgIDxta2RpciBkaXI9IiR7anNwLWFwaS5idWlsZH0vZG9jcyIvPgorICAgIDxta2RpciBkaXI9IiR7anNwLWFwaS5idWlsZH0vZG9jcy9hcGkiLz4KKyAgICA8bWtkaXIgZGlyPSIke2pzcC1hcGkuYnVpbGR9L2V4YW1wbGVzIi8+CisgICAgPG1rZGlyIGRpcj0iJHtqc3AtYXBpLmJ1aWxkfS9hbnQiLz4KKworICAgIDwhLS0gIkRpc3QiIEhpZXJhcmNoeSAtLT4KKyAgICA8bWtkaXIgZGlyPSIke2pzcC1hcGkuZGlzdH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2pzcC1hcGkuZGlzdH0vZG9jcyIvPgorICAgIDxta2RpciBkaXI9IiR7anNwLWFwaS5kaXN0fS9kb2NzL2FwaSIvPgorICAgIDxta2RpciBkaXI9IiR7anNwLWFwaS5kaXN0fS9saWIiLz4KKyAgICA8bWtkaXIgZGlyPSIke2pzcC1hcGkuZGlzdH0vc3JjIi8+CisgICAgPG1rZGlyIGRpcj0iJHtqc3AtYXBpLmRpc3R9L2V4YW1wbGVzIi8+CisKKyAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImRvY3MudXB0b2RhdGUiIHRhcmdldGZpbGU9IiR7anNwLWFwaS5idWlsZH0vZG9jcy9hcGkvaW5kZXguaHRtbCI+CisgICAgICA8c3JjZmlsZXMgZGlyPSJzcmMvc2hhcmUiIGluY2x1ZGVzPSIqKi8qLmphdmEiIC8+CisgICAgPC91cHRvZGF0ZT4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IFN0YXRpYyBGaWxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0ic3RhdGljIiBkZXBlbmRzPSJwcmVwYXJlIj4KKworICAgIDwhLS0gIkRpc3QiIEhpZXJhcmNoeSAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtqc3AtYXBpLmRpc3R9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IkJVSUxESU5HLnR4dCIvPgorICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iTElDRU5TRSIvPgorICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iUkVBRE1FLnR4dCIvPgorICAgIDwvY29weT4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09IENvbXBpbGUgQ2xhc3NlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJzdGF0aWMiCisgICBkZXNjcmlwdGlvbj0iQ29tcGlsZSBBUEkgY2xhc3NlcyAoRGVmYXVsdCkiPgorCisgICAgPCEtLSBKYXZhIGNsYXNzZXMgLS0+CisgICAgPGphdmFjIHNyY2Rpcj0ic3JjL3NoYXJlIiBkZXN0ZGlyPSIke2pzcC1hcGkuYnVpbGR9L2NsYXNzZXMiCisgICAgICAgICAgIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IiBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKyAgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iCisgICAgICAgY2xhc3NwYXRoPSIke3NlcnZsZXQtYXBpLmphcn0iIC8+CisKKyAgICA8IS0tIEFzc29jaWF0ZWQgcHJvcGVydHkgZmlsZXMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7anNwLWFwaS5idWlsZH0vY2xhc3NlcyI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3NoYXJlIj4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KKyAgICAgICAgPC9maWxlc2V0PgorICAgIDwvY29weT4KKworICAgIDwhLS0gSlNQIHJlc291cmNlcyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtqc3AtYXBpLmJ1aWxkfS9jbGFzc2VzL2phdmF4L3NlcnZsZXQvanNwL3Jlc291cmNlcyI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3NoYXJlL2R0ZCI+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ianNwKi5kdGQiLz4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqc3AqLnhzZCIvPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IndlYi1qc3AqLmR0ZCIvPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IndlYi1qc3AqLnhzZCIvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT0gQnVpbGQgSmF2YURvYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVwZW5kcz0icHJlcGFyZSIgdW5sZXNzPSJkb2NzLnVwdG9kYXRlIj4KKworICAgIDxqYXZhZG9jIHBhY2thZ2VuYW1lcz0iamF2YXguc2VydmxldC5qc3AuKiIKKyAgICAgICAgICAgICBzb3VyY2VwYXRoPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZSIKKyAgICAgICAgICAgICBjbGFzc3BhdGg9IiR7c2VydmxldC1hcGkuamFyfSIKKyAgICAgICAgICAgICBkZXN0ZGlyPSIke2pzcC1hcGkuYnVpbGR9L2RvY3MvYXBpIgorICAgICAgICAgICAgIHVzZT0idHJ1ZSIKKyAgICAgICAgICAgICB3aW5kb3d0aXRsZT0iSmF2YVNlcnZlciBQYWdlcyBBUEkgRG9jdW1lbnRhdGlvbiIKKyAgICAgICAgICAgICBkb2N0aXRsZT0iSmF2YVNlcnZlciBQYWdlcyBBUEkgRG9jdW1lbnRhdGlvbiIKKyAgICAgICAgICAgICBib3R0b209IkNvcHlyaWdodCAmYW1wO2NvcHk7IDE5OTktMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLiIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT0gQnVpbGQgRXhhbXBsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImFudCIgZGVwZW5kcz0icHJlcGFyZSI+CisgICAgPGphdmFjICBzcmNkaXI9InNyYy9hbnQiIGRlc3RkaXI9IiR7anNwLWFwaS5idWlsZH0vYW50IgorICAgICAgICAgICAgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iIGRlcHJlY2F0aW9uPSIke2NvbXBpbGUuZGVwcmVjYXRpb259IgorICAgICAgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iIAorICAgICAgICAgICAgY2xhc3NwYXRoPSIke2FudC5ob21lfS9saWIvYW50LmphciIgLz4KKyAgICA8amFyIGphcmZpbGU9IiR7anNwLWFudHRhc2suamFyfSIgIGJhc2VkaXI9IiR7anNwLWFwaS5idWlsZH0vYW50IiAgLz4KKyAgICA8dGFza2RlZiAgICBuYW1lPSJ0eHQyaHRtbCIgY2xhc3NuYW1lPSJ0YXNrLlR4dDJIdG1sIgorICAgICAgICAgICAgICAgIGNsYXNzcGF0aD0iJHtqc3AtYW50dGFzay5qYXJ9IiAvPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0iZXhhbXBsZXMiIGRlcGVuZHM9InByZXBhcmUsYW50Ij4KKworICAgIDxjb3B5IHRvZGlyPSIke2pzcC1hcGkuYnVpbGR9L2V4YW1wbGVzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iZXhhbXBsZXMiPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJidWlsZC4qIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorCisgICAgPHR4dDJodG1sIHRvZGlyPSIke2pzcC1hcGkuYnVpbGR9L2V4YW1wbGVzL2pzcDIvc2ltcGxldGFnIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJCb29rQmVhbi5qYXZhIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8ZmlsZXNldCBkaXI9ImV4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkZpbmRCb29rU2ltcGxlVGFnLmphdmEiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iUmVwZWF0U2ltcGxlVGFnLmphdmEiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iSGVsbG9Xb3JsZFNpbXBsZVRhZy5qYXZhIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8ZmlsZXNldCBkaXI9ImV4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL2VsIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iRnVuY3Rpb25zLmphdmEiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L3R4dDJodG1sPgorCisgICAgPHR4dDJodG1sIHRvZGlyPSIke2pzcC1hcGkuYnVpbGR9L2V4YW1wbGVzL2pzcDIvanNwYXR0cmlidXRlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJGb29CZWFuLmphdmEiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICAgIDxmaWxlc2V0IGRpcj0iZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvc2ltcGxldGFnIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iU2h1ZmZsZVNpbXBsZVRhZy5qYXZhIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IlRpbGVTaW1wbGVUYWcuamF2YSIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJIZWxsb1dvcmxkU2ltcGxlVGFnLmphdmEiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L3R4dDJodG1sPgorCisgICAgPHR4dDJodG1sIHRvZGlyPSIke2pzcC1hcGkuYnVpbGR9L2V4YW1wbGVzL2NhbCI+CisgICAgICA8ZmlsZXNldCBkaXI9ImV4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jYWwiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJFbnRyaWVzLmphdmEiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iRW50cnkuamF2YSIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJKc3BDYWxlbmRhci5qYXZhIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IlRhYmxlQmVhbi5qYXZhIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC90eHQyaHRtbD4KKworICAgIDx0eHQyaHRtbCB0b2Rpcj0iJHtqc3AtYXBpLmJ1aWxkfS9leGFtcGxlcy9qc3B0b3NlcnYiPgorICAgICAgPGZpbGVzZXQgZGlyPSJleGFtcGxlcy9XRUItSU5GL2NsYXNzZXMiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2bGV0VG9Kc3AuamF2YSIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvdHh0Mmh0bWw+CisKKyAgICA8dHh0Mmh0bWwgdG9kaXI9IiR7anNwLWFwaS5idWlsZH0vZXhhbXBsZXMvanNwMi9lbCI+CisgICAgICA8ZmlsZXNldCBkaXI9ImV4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL2VsIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iRnVuY3Rpb25zLmphdmEiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L3R4dDJodG1sPgorCisgICAgPHR4dDJodG1sIHRvZGlyPSIke2pzcC1hcGkuYnVpbGR9L2V4YW1wbGVzL2pzcDIvbWlzYyI+CisgICAgICA8ZmlsZXNldCBkaXI9ImV4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkVjaG9BdHRyaWJ1dGVzVGFnLmphdmEiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L3R4dDJodG1sPgorCisgICAgPHR4dDJodG1sIHRvZGlyPSIke2pzcC1hcGkuYnVpbGR9L2V4YW1wbGVzL2pzcDIvdGFnZmlsZXMiPgorICAgICAgPGZpbGVzZXQgZGlyPSJleGFtcGxlcy9XRUItSU5GL3RhZ3MiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnRhZyIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L3R4dDJodG1sPgorCisgICAgPHR4dDJodG1sIHRvZGlyPSIke2pzcC1hcGkuYnVpbGR9L2V4YW1wbGVzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iZXhhbXBsZXMiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmpzcCIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qc3B4IiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmpzcGYiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImVycm9yL2Vycm9ycGdlLmpzcCIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJmb3J3YXJkL29uZS5qc3AiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iaW5jbHVkZS9mb28uanNwIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImpzcHRvc2Vydi9oZWxsby5qc3AiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ic2VjdXJpdHkvcHJvdGVjdGVkL2Vycm9yLmpzcCIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJzZWN1cml0eS9wcm90ZWN0ZWQvaW5kZXguanNwIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9InNlY3VyaXR5L3Byb3RlY3RlZC9sb2dpbi5qc3AiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ic291cmNlLmpzcCIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvdHh0Mmh0bWw+CisKKyAgICA8amF2YWMgICBzcmNkaXI9ImV4YW1wbGVzL1dFQi1JTkYvY2xhc3NlcyIgCisgICAgICAgICAgICAgZGVzdGRpcj0iJHtqc3AtYXBpLmJ1aWxkfS9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMiCisgICAgICAgICAgICAgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iIGRlcHJlY2F0aW9uPSIke2NvbXBpbGUuZGVwcmVjYXRpb259IgorICAgICAgICAgICAgIG9wdGltaXplPSIke2NvbXBpbGUub3B0aW1pemV9IgorICAgICAgICAgICAgIGV4Y2x1ZGVzPSIqKi9DVlMvKioiPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0iZXhhbXBsZXMuY2xhc3NwYXRoIiAvPgorICAgIDwvamF2YWM+CisKKyAgICA8amF2YWMgICBzcmNkaXI9ImV4YW1wbGVzL3BsdWdpbi9hcHBsZXQiIAorICAgICAgICAgICAgIGRlc3RkaXI9IiR7anNwLWFwaS5idWlsZH0vZXhhbXBsZXMvcGx1Z2luL2FwcGxldCIKKyAgICAgICAgICAgICBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIgZGVwcmVjYXRpb249IiR7Y29tcGlsZS5kZXByZWNhdGlvbn0iCisgICAgICAgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iCisgICAgICAgICAgICAgZXhjbHVkZXM9IioqL0NWUy8qKiI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJleGFtcGxlcy5jbGFzc3BhdGgiIC8+CisgICAgPC9qYXZhYz4KKworICAgIDxqYXIgICBqYXJmaWxlPSIke2pzcC1hcGkuZGlzdH0vZXhhbXBsZXMvZXhhbXBsZXMud2FyIgorICAgICAgICAgICBiYXNlZGlyPSIke2pzcC1hcGkuYnVpbGR9L2V4YW1wbGVzIiBpbmNsdWRlcz0iKioiLz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IERpc3RyaWJ1dGlvbiBGaWxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImphciIgZGVwZW5kcz0iY29tcGlsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGphciI+CisKKyAgICA8IS0tIFByZXBhcmUgTWFuaWZlc3QgLS0+CisgICAgPGNvcHkgdG9maWxlPSIke2pzcC1hcGkuYnVpbGR9L21hbmlmZXN0IgorICAgICAgICAgICAgZmlsZT0ic3JjL2V0Yy9tYW5pZmVzdCIgb3ZlcndyaXRlPSJ5ZXMiPgorICAgICAgPGZpbHRlcnNldD4KKyAgICAgICAgPGZpbHRlciB0b2tlbj0iaW1wbGVtZW50YXRpb24ucmV2aXNpb24iCisgICAgICAgICAgICAgICAgdmFsdWU9IiR7aW1wbGVtZW50YXRpb24ucmV2aXNpb259Ii8+CisgICAgICA8L2ZpbHRlcnNldD4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIENyZWF0ZSBKQVIgZmlsZSAtLT4KKyAgICA8amFyIGphcmZpbGU9IiR7anNwLWFwaS5qYXJ9IgorICAgICAgICAgYmFzZWRpcj0iJHtqc3AtYXBpLmJ1aWxkfS9jbGFzc2VzIgorICAgICAgICAgbWFuaWZlc3Q9IiR7anNwLWFwaS5idWlsZH0vbWFuaWZlc3QiPgorICAgICAgPGluY2x1ZGUgbmFtZT0iamF2YXgvc2VydmxldC9qc3AvKioiIC8+CisgICAgPC9qYXI+CisKKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJjb21waWxlLGV4YW1wbGVzLGphdmFkb2MsamFyIgorICAgZGVzY3JpcHRpb249IkNyZWF0ZSBiaW5hcnkgZGlzdHJpYnV0aW9uIj4KKworICAgIDwhLS0gQ29weSBKYXZhZG9jcyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtqc3AtYXBpLmRpc3R9L2RvY3MvYXBpIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke2pzcC1hcGkuYnVpbGR9L2RvY3MvYXBpIi8+CisgICAgPC9jb3B5PgorCisgICAgPCEtLSBDb3B5IEFQSSBzb3VyY2UgZmlsZXMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7anNwLWFwaS5kaXN0fS9zcmMiPgorICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy9zaGFyZSIvPgorICAgIDwvY29weT4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBDbGVhbiBHZW5lcmF0ZWQgRmlsZXMgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuIgorICAgZGVzY3JpcHRpb249IkNsZWFuIHByZXZpb3VzIGJ1aWxkIHJlc3VsdHMiPgorCisgICAgPGRlbGV0ZSBkaXI9IiR7anNwLWFwaS5idWlsZH0iLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtqc3AtYXBpLmRpc3R9Ii8+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT0gQWxsIEluIE9uZSBCdWlsZCA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImNsZWFuLGRpc3QiCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4sIGNvbXBpbGUsIGFuZCBkaXN0Ii8+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NhbC9FbnRyaWVzLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY2FsL0VudHJpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWY2Yzc4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NhbC9FbnRyaWVzLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGNhbDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCitwdWJsaWMgY2xhc3MgRW50cmllcyB7CisKKyAgcHJpdmF0ZSBIYXNodGFibGUgZW50cmllczsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gdGltZSA9IHsiOGFtIiwgIjlhbSIsICIxMGFtIiwgIjExYW0iLCAiMTJwbSIsIAorCQkJCQkiMXBtIiwgIjJwbSIsICIzcG0iLCAiNHBtIiwgIjVwbSIsICI2cG0iLAorCQkJCQkiN3BtIiwgIjhwbSIgfTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcm93cyA9IDEyOworCisgIHB1YmxpYyBFbnRyaWVzICgpIHsgICAKKyAgIGVudHJpZXMgPSBuZXcgSGFzaHRhYmxlIChyb3dzKTsKKyAgIGZvciAoaW50IGk9MDsgaSA8IHJvd3M7IGkrKykgeworICAgICBlbnRyaWVzLnB1dCAodGltZVtpXSwgbmV3IEVudHJ5KHRpbWVbaV0pKTsKKyAgIH0KKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0Um93cyAoKSB7CisgICAgcmV0dXJuIHJvd3M7CisgIH0KKworICBwdWJsaWMgRW50cnkgZ2V0RW50cnkgKGludCBpbmRleCkgeworICAgIHJldHVybiAoRW50cnkpdGhpcy5lbnRyaWVzLmdldCh0aW1lW2luZGV4XSk7CisgIH0KKworICBwdWJsaWMgaW50IGdldEluZGV4IChTdHJpbmcgdG0pIHsKKyAgICBmb3IgKGludCBpPTA7IGk8cm93czsgaSsrKQorICAgICAgaWYodG0uZXF1YWxzKHRpbWVbaV0pKSByZXR1cm4gaTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBwdWJsaWMgdm9pZCBwcm9jZXNzUmVxdWVzdCAoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyB0bSkgeworICAgIGludCBpbmRleCA9IGdldEluZGV4ICh0bSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgIFN0cmluZyBkZXNjciA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyICgiZGVzY3JpcHRpb24iKTsKKyAgICAgICgoRW50cnkpZW50cmllcy5nZXQodGltZVtpbmRleF0pKS5zZXREZXNjcmlwdGlvbiAoZGVzY3IpOworICAgIH0KKyAgfQorCit9CisKKworCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jYWwvRW50cnkuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jYWwvRW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGI4MjZlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NhbC9FbnRyeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGNhbDsKKworcHVibGljIGNsYXNzIEVudHJ5IHsKKworICBTdHJpbmcgaG91cjsKKyAgU3RyaW5nIGRlc2NyaXB0aW9uOworICBTdHJpbmcgY29sb3I7CisKKyAgcHVibGljIEVudHJ5IChTdHJpbmcgaG91cikgeworICAgIHRoaXMuaG91ciA9IGhvdXI7CisgICAgdGhpcy5kZXNjcmlwdGlvbiA9ICIiOworCisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldEhvdXIgKCkgeworICAgIHJldHVybiB0aGlzLmhvdXI7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldENvbG9yICgpIHsKKyAgICBpZiAoZGVzY3JpcHRpb24uZXF1YWxzKCIiKSkgcmV0dXJuICJsaWdodGJsdWUiOworICAgIGVsc2UgcmV0dXJuICJyZWQiOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiAoKSB7CisgICAgaWYgKGRlc2NyaXB0aW9uLmVxdWFscygiIikpIHJldHVybiAiTm9uZSI7CisgICAgZWxzZSByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uIChTdHJpbmcgZGVzY3IpIHsKKyAgICBkZXNjcmlwdGlvbiA9IGRlc2NyOworICB9CisgCit9CisKKworCisKKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NhbC9Kc3BDYWxlbmRhci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NhbC9Kc3BDYWxlbmRhci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NWVmM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY2FsL0pzcENhbGVuZGFyLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGNhbDsKKworaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC4qOworCitwdWJsaWMgY2xhc3MgSnNwQ2FsZW5kYXIgeworICAgIENhbGVuZGFyICBjYWxlbmRhciA9IG51bGw7CisgICAgRGF0ZSBjdXJyZW50RGF0ZTsKKworICAgIHB1YmxpYyBKc3BDYWxlbmRhcigpIHsKKwljYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisJRGF0ZSB0cmlhbFRpbWUgPSBuZXcgRGF0ZSgpOworCWNhbGVuZGFyLnNldFRpbWUodHJpYWxUaW1lKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0WWVhcigpIHsKKwlyZXR1cm4gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1vbnRoKCkgeworCWludCBtID0gZ2V0TW9udGhJbnQoKTsKKwlTdHJpbmdbXSBtb250aHMgPSBuZXcgU3RyaW5nIFtdIHsgIkphbnVhcnkiLCAiRmVicnVhcnkiLCAiTWFyY2giLAorCQkJCQkiQXByaWwiLCAiTWF5IiwgIkp1bmUiLAorCQkJCQkiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwKKwkJCQkJIk9jdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiIH07CisJaWYgKG0gPiAxMikKKwkgICAgcmV0dXJuICJVbmtub3duIHRvIE1hbiI7CisJCisJcmV0dXJuIG1vbnRoc1ttIC0gMV07CisKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERheSgpIHsKKwlpbnQgeCA9IGdldERheU9mV2VlaygpOworCVN0cmluZ1tdIGRheXMgPSBuZXcgU3RyaW5nW10geyJTdW5kYXkiLCAiTW9uZGF5IiwgIlR1ZXNkYXkiLCAiV2VkbmVzZGF5IiwgCisJCQkJICAgICAgIlRodXJzZGF5IiwgIkZyaWRheSIsICJTYXR1cmRheSJ9OworCisJaWYgKHggPiA3KQorCSAgICByZXR1cm4gIlVua25vd24gdG8gTWFuIjsKKworCXJldHVybiBkYXlzW3ggLSAxXTsKKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldE1vbnRoSW50KCkgeworCXJldHVybiAxICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1PTlRIKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERhdGUoKSB7CisJcmV0dXJuIGdldE1vbnRoSW50KCkgKyAiLyIgKyBnZXREYXlPZk1vbnRoKCkgKyAiLyIgKyAgZ2V0WWVhcigpOwkKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnREYXRlKCkgeworICAgICAgICBEYXRlIGR0ID0gbmV3IERhdGUgKCk7CisJY2FsZW5kYXIuc2V0VGltZSAoZHQpOworCXJldHVybiBnZXRNb250aEludCgpICsgIi8iICsgZ2V0RGF5T2ZNb250aCgpICsgIi8iICsgIGdldFllYXIoKTsKKworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmV4dERhdGUoKSB7CisgICAgICAgIGNhbGVuZGFyLnNldCAoQ2FsZW5kYXIuREFZX09GX01PTlRILCBnZXREYXlPZk1vbnRoKCkgKyAxKTsKKwlyZXR1cm4gZ2V0RGF0ZSAoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByZXZEYXRlKCkgeworICAgICAgICBjYWxlbmRhci5zZXQgKENhbGVuZGFyLkRBWV9PRl9NT05USCwgZ2V0RGF5T2ZNb250aCgpIC0gMSk7CisJcmV0dXJuIGdldERhdGUgKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUaW1lKCkgeworCXJldHVybiBnZXRIb3VyKCkgKyAiOiIgKyBnZXRNaW51dGUoKSArICI6IiArIGdldFNlY29uZCgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RGF5T2ZNb250aCgpIHsKKwlyZXR1cm4gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREYXlPZlllYXIoKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfWUVBUik7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRXZWVrT2ZZZWFyKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuV0VFS19PRl9ZRUFSKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFdlZWtPZk1vbnRoKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuV0VFS19PRl9NT05USCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREYXlPZldlZWsoKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfV0VFSyk7CisgICAgfQorICAgICAKKyAgICBwdWJsaWMgaW50IGdldEhvdXIoKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0TWludXRlKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTUlOVVRFKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0U2Vjb25kKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuU0VDT05EKTsKKyAgICB9CisKKyAgCisgICAgcHVibGljIGludCBnZXRFcmEoKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5FUkEpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVNUaW1lWm9uZSgpIHsKKwlTdHJpbmdbXSB6b25lcyA9IG5ldyBTdHJpbmdbXSB7Ikhhd2FpaSIsICJBbGFza2FuIiwgIlBhY2lmaWMiLAorCQkJCSAgICAgICAiTW91bnRhaW4iLCAiQ2VudHJhbCIsICJFYXN0ZXJuIn07CisJCisJcmV0dXJuIHpvbmVzWzEwICsgZ2V0Wm9uZU9mZnNldCgpXTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFpvbmVPZmZzZXQoKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5aT05FX09GRlNFVCkvKDYwKjYwKjEwMDApOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXREU1RPZmZzZXQoKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5EU1RfT0ZGU0VUKS8oNjAqNjAqMTAwMCk7CisgICAgfQorCisgICAgCisgICAgcHVibGljIGludCBnZXRBTVBNKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuQU1fUE0pOworICAgIH0KK30KKworCisKKworCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY2FsL1RhYmxlQmVhbi5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NhbC9UYWJsZUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmUzYjAxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NhbC9UYWJsZUJlYW4uamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGNhbDsKKworaW1wb3J0IGphdmEuYmVhbnMuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworcHVibGljIGNsYXNzIFRhYmxlQmVhbiB7CisKKyAgSGFzaHRhYmxlIHRhYmxlOworICBKc3BDYWxlbmRhciBKc3BDYWw7CisgIEVudHJpZXMgZW50cmllczsKKyAgU3RyaW5nIGRhdGU7CisgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgU3RyaW5nIGVtYWlsID0gbnVsbDsKKyAgYm9vbGVhbiBwcm9jZXNzRXJyb3IgPSBmYWxzZTsKKworICBwdWJsaWMgVGFibGVCZWFuICgpIHsKKyAgICB0aGlzLnRhYmxlID0gbmV3IEhhc2h0YWJsZSAoMTApOworICAgIHRoaXMuSnNwQ2FsID0gbmV3IEpzcENhbGVuZGFyICgpOworICAgIHRoaXMuZGF0ZSA9IEpzcENhbC5nZXRDdXJyZW50RGF0ZSAoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldE5hbWUgKFN0cmluZyBubSkgeworICAgIHRoaXMubmFtZSA9IG5tOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXROYW1lICgpIHsKKyAgICByZXR1cm4gdGhpcy5uYW1lOworICB9CisgIAorICBwdWJsaWMgdm9pZCBzZXRFbWFpbCAoU3RyaW5nIG1haWwpIHsKKyAgICB0aGlzLmVtYWlsID0gbWFpbDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwgKCkgeworICAgIHJldHVybiB0aGlzLmVtYWlsOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXREYXRlICgpIHsKKyAgICByZXR1cm4gdGhpcy5kYXRlOworICB9CisKKyAgcHVibGljIEVudHJpZXMgZ2V0RW50cmllcyAoKSB7CisgICAgcmV0dXJuIHRoaXMuZW50cmllczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHByb2Nlc3NSZXF1ZXN0IChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgLy8gR2V0IHRoZSBuYW1lIGFuZCBlLW1haWwuCisgICAgdGhpcy5wcm9jZXNzRXJyb3IgPSBmYWxzZTsKKyAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCIiKSkgc2V0TmFtZShyZXF1ZXN0LmdldFBhcmFtZXRlciAoIm5hbWUiKSk7ICAKKyAgICBpZiAoZW1haWwgPT0gbnVsbCB8fCBlbWFpbC5lcXVhbHMoIiIpKSBzZXRFbWFpbChyZXF1ZXN0LmdldFBhcmFtZXRlciAoImVtYWlsIikpOworICAgIGlmIChuYW1lID09IG51bGwgfHwgZW1haWwgPT0gbnVsbCB8fAorCQluYW1lLmVxdWFscygiIikgfHwgZW1haWwuZXF1YWxzKCIiKSkgeworICAgICAgdGhpcy5wcm9jZXNzRXJyb3IgPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEdldCB0aGUgZGF0ZS4KKyAgICBTdHJpbmcgZGF0ZVIgPSByZXF1ZXN0LmdldFBhcmFtZXRlciAoImRhdGUiKTsKKyAgICBpZiAoZGF0ZVIgPT0gbnVsbCkgZGF0ZSA9IEpzcENhbC5nZXRDdXJyZW50RGF0ZSAoKTsKKyAgICBlbHNlIGlmIChkYXRlUi5lcXVhbHNJZ25vcmVDYXNlKCJuZXh0IikpIGRhdGUgPSBKc3BDYWwuZ2V0TmV4dERhdGUgKCk7CisgICAgZWxzZSBpZiAoZGF0ZVIuZXF1YWxzSWdub3JlQ2FzZSgicHJldiIpKSBkYXRlID0gSnNwQ2FsLmdldFByZXZEYXRlICgpOworCisgICAgZW50cmllcyA9IChFbnRyaWVzKSB0YWJsZS5nZXQgKGRhdGUpOworICAgIGlmIChlbnRyaWVzID09IG51bGwpIHsKKyAgICAgIGVudHJpZXMgPSBuZXcgRW50cmllcyAoKTsKKyAgICAgIHRhYmxlLnB1dCAoZGF0ZSwgZW50cmllcyk7CisgICAgfQorCisgICAgLy8gSWYgdGltZSBpcyBwcm92aWRlZCBhZGQgdGhlIGV2ZW50LgorCVN0cmluZyB0aW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInRpbWUiKTsKKyAgICBpZiAodGltZSAhPSBudWxsKSBlbnRyaWVzLnByb2Nlc3NSZXF1ZXN0IChyZXF1ZXN0LCB0aW1lKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGdldFByb2Nlc3NFcnJvciAoKSB7CisgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0Vycm9yOworICB9Cit9CisKKworCisKKworCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY2hlY2tib3gvQ2hlY2tUZXN0LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY2hlY2tib3gvQ2hlY2tUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwNzAyMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jaGVja2JveC9DaGVja1Rlc3QuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBjaGVja2JveDsKKworcHVibGljIGNsYXNzIENoZWNrVGVzdCB7CisKKyAgICBTdHJpbmcgYltdID0gbmV3IFN0cmluZ1tdIHsgIjEiLCAiMiIsICIzIiwgIjQiIH07CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RnJ1aXQoKSB7CisJcmV0dXJuIGI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RnJ1aXQoU3RyaW5nIFtdIGIpIHsKKwl0aGlzLmIgPSBiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb2xvcnMvQ29sb3JHYW1lQmVhbi5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbG9ycy9Db2xvckdhbWVCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5ZTE1OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb2xvcnMvQ29sb3JHYW1lQmVhbi5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgY29sb3JzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKK3B1YmxpYyBjbGFzcyBDb2xvckdhbWVCZWFuIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGJhY2tncm91bmQgPSAieWVsbG93IjsKKyAgICBwcml2YXRlIFN0cmluZyBmb3JlZ3JvdW5kID0gInJlZCI7CisgICAgcHJpdmF0ZSBTdHJpbmcgY29sb3IxID0gZm9yZWdyb3VuZDsKKyAgICBwcml2YXRlIFN0cmluZyBjb2xvcjIgPSBiYWNrZ3JvdW5kOworICAgIHByaXZhdGUgU3RyaW5nIGhpbnQgPSAibm8iOworICAgIHByaXZhdGUgaW50IGF0dGVtcHRzID0gMDsKKwlwcml2YXRlIGludCBpbnR2YWwgPSAwOworICAgIHByaXZhdGUgYm9vbGVhbiB0b29rSGludHMgPSBmYWxzZTsKKworICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKwkvLyBiYWNrZ3JvdW5kID0gInllbGxvdyI7CisJLy8gZm9yZWdyb3VuZCA9ICJyZWQiOworCisJaWYgKCEgY29sb3IxLmVxdWFscyhmb3JlZ3JvdW5kKSkgeworCSAgICBpZiAoY29sb3IxLmVxdWFsc0lnbm9yZUNhc2UoImJsYWNrIikgfHwKKwkJCWNvbG9yMS5lcXVhbHNJZ25vcmVDYXNlKCJjeWFuIikpIHsKKwkJCWJhY2tncm91bmQgPSBjb2xvcjE7CisJCX0KKwl9CisKKwlpZiAoISBjb2xvcjIuZXF1YWxzKGJhY2tncm91bmQpKSB7CisJICAgIGlmIChjb2xvcjIuZXF1YWxzSWdub3JlQ2FzZSgiYmxhY2siKSB8fAorCQkJY29sb3IyLmVxdWFsc0lnbm9yZUNhc2UoImN5YW4iKSkgeworCQkJZm9yZWdyb3VuZCA9IGNvbG9yMjsKKwkgICAgfQorCX0KKworCWF0dGVtcHRzKys7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29sb3IyKFN0cmluZyB4KSB7CisJY29sb3IyID0geDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcjEoU3RyaW5nIHgpIHsKKwljb2xvcjEgPSB4OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgeCkgeworCWlmICghdG9va0hpbnRzKQorCSAgICB0b29rSGludHMgPSB4LmVxdWFsc0lnbm9yZUNhc2UoIkhpbnQiKTsKKwloaW50ID0geDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbG9yMigpIHsKKwkgcmV0dXJuIGJhY2tncm91bmQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb2xvcjEoKSB7CisJIHJldHVybiBmb3JlZ3JvdW5kOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QXR0ZW1wdHMoKSB7CisJcmV0dXJuIGF0dGVtcHRzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEhpbnQoKSB7CisJcmV0dXJuIGhpbnQuZXF1YWxzSWdub3JlQ2FzZSgiSGludCIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFN1Y2Nlc3MoKSB7CisJaWYgKGJhY2tncm91bmQuZXF1YWxzSWdub3JlQ2FzZSgiYmxhY2siKSB8fAorCSAgICBiYWNrZ3JvdW5kLmVxdWFsc0lnbm9yZUNhc2UoImN5YW4iKSkgeworCQorCSAgICBpZiAoZm9yZWdyb3VuZC5lcXVhbHNJZ25vcmVDYXNlKCJibGFjayIpIHx8CisJCWZvcmVncm91bmQuZXF1YWxzSWdub3JlQ2FzZSgiY3lhbiIpKQorCQlyZXR1cm4gdHJ1ZTsKKwkgICAgZWxzZQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEhpbnRUYWtlbigpIHsKKwlyZXR1cm4gdG9va0hpbnRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworCWZvcmVncm91bmQgPSAicmVkIjsKKwliYWNrZ3JvdW5kID0gInllbGxvdyI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW50dmFsKGludCB2YWx1ZSkgeworCWludHZhbCA9IHZhbHVlOworCX0KKworICAgIHB1YmxpYyBpbnQgZ2V0SW50dmFsKCkgeworCXJldHVybiBpbnR2YWw7CisJfQorfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY29tcHJlc3Npb25GaWx0ZXJzL0NvbXByZXNzaW9uRmlsdGVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY29tcHJlc3Npb25GaWx0ZXJzL0NvbXByZXNzaW9uRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiOTE2YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb21wcmVzc2lvbkZpbHRlcnMvQ29tcHJlc3Npb25GaWx0ZXIuamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcGFja2FnZSBjb21wcmVzc2lvbkZpbHRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5qYXZheC5zZXJ2bGV0LkZpbHRlcjwvY29kZT4gdXNlZCB0byBjb21wcmVzcworICogdGhlIFNlcnZsZXRSZXNwb25zZSBpZiBpdCBpcyBiaWdnZXIgdGhhbiBhIHRocmVzaG9sZC4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEBhdXRob3IgRG1pdHJpIFZhbGRpbgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbXByZXNzaW9uRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyeworCisgICAgLyoqCisgICAgICogVGhlIGZpbHRlciBjb25maWd1cmF0aW9uIG9iamVjdCB3ZSBhcmUgYXNzb2NpYXRlZCB3aXRoLiAgSWYgdGhpcyB2YWx1ZQorICAgICAqIGlzIG51bGwsIHRoaXMgZmlsdGVyIGluc3RhbmNlIGlzIG5vdCBjdXJyZW50bHkgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbHRlckNvbmZpZyBjb25maWcgPSBudWxsOworCisgICAgLyoqCisgICAgICogTWluaW1hbCByZWFzb25hYmxlIHRocmVzaG9sZAorICAgICAqLworICAgIHByaXZhdGUgaW50IG1pblRocmVzaG9sZCA9IDEyODsKKworCisgICAgLyoqCisgICAgICogVGhlIHRocmVzaG9sZCBudW1iZXIgdG8gY29tcHJlc3MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGNvbXByZXNzaW9uVGhyZXNob2xkOworCisgICAgLyoqCisgICAgICogRGVidWcgbGV2ZWwgZm9yIHRoaXMgZmlsdGVyCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVidWcgPSAwOworCisgICAgLyoqCisgICAgICogUGxhY2UgdGhpcyBmaWx0ZXIgaW50byBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlckNvbmZpZyBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHsKKworICAgICAgICBjb25maWcgPSBmaWx0ZXJDb25maWc7CisgICAgICAgIGlmIChmaWx0ZXJDb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZmlsdGVyQ29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImRlYnVnIik7CisgICAgICAgICAgICBpZiAodmFsdWUhPW51bGwpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgc3RyID0gZmlsdGVyQ29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImNvbXByZXNzaW9uVGhyZXNob2xkIik7CisgICAgICAgICAgICBpZiAoc3RyIT1udWxsKSB7CisgICAgICAgICAgICAgICAgY29tcHJlc3Npb25UaHJlc2hvbGQgPSBJbnRlZ2VyLnBhcnNlSW50KHN0cik7CisgICAgICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uVGhyZXNob2xkICE9IDAgJiYgY29tcHJlc3Npb25UaHJlc2hvbGQgPCBtaW5UaHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjb21wcmVzc2lvblRocmVzaG9sZCBzaG91bGQgYmUgZWl0aGVyIDAgLSBubyBjb21wcmVzc2lvbiBvciA+PSAiICsgbWluVGhyZXNob2xkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY29tcHJlc3Npb25UaHJlc2hvbGQgc2V0IHRvICIgKyBtaW5UaHJlc2hvbGQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uVGhyZXNob2xkID0gbWluVGhyZXNob2xkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29tcHJlc3Npb25UaHJlc2hvbGQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb21wcmVzc2lvblRocmVzaG9sZCA9IDA7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICogVGFrZSB0aGlzIGZpbHRlciBvdXQgb2Ygc2VydmljZS4KKyAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisKKyAgICAgICAgdGhpcy5jb25maWcgPSBudWxsOworCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPmRvRmlsdGVyPC9jb2RlPiBtZXRob2Qgb2YgdGhlIEZpbHRlciBpcyBjYWxsZWQgYnkgdGhlIGNvbnRhaW5lcgorICAgICAqIGVhY2ggdGltZSBhIHJlcXVlc3QvcmVzcG9uc2UgcGFpciBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgY2hhaW4gZHVlCisgICAgICogdG8gYSBjbGllbnQgcmVxdWVzdCBmb3IgYSByZXNvdXJjZSBhdCB0aGUgZW5kIG9mIHRoZSBjaGFpbi4KKyAgICAgKiBUaGUgRmlsdGVyQ2hhaW4gcGFzc2VkIGludG8gdGhpcyBtZXRob2QgYWxsb3dzIHRoZSBGaWx0ZXIgdG8gcGFzcyBvbiB0aGUKKyAgICAgKiByZXF1ZXN0IGFuZCByZXNwb25zZSB0byB0aGUgbmV4dCBlbnRpdHkgaW4gdGhlIGNoYWluLjxwPgorICAgICAqIFRoaXMgbWV0aG9kIGZpcnN0IGV4YW1pbmVzIHRoZSByZXF1ZXN0IHRvIGNoZWNrIHdoZXRoZXIgdGhlIGNsaWVudCBzdXBwb3J0CisgICAgICogY29tcHJlc3Npb24uIDxicj4KKyAgICAgKiBJdCBzaW1wbHkganVzdCBwYXNzIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSBpZiB0aGVyZSBpcyBubyBzdXBwb3J0IGZvcgorICAgICAqIGNvbXByZXNzaW9uLjxicj4KKyAgICAgKiBJZiB0aGUgY29tcHJlc3Npb24gc3VwcG9ydCBpcyBhdmFpbGFibGUsIGl0IGNyZWF0ZXMgYQorICAgICAqIENvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlciBvYmplY3Qgd2hpY2ggY29tcHJlc3NlcyB0aGUgY29udGVudCBhbmQKKyAgICAgKiBtb2RpZmllcyB0aGUgaGVhZGVyIGlmIHRoZSBjb250ZW50IGxlbmd0aCBpcyBiaWcgZW5vdWdoLgorICAgICAqIEl0IHRoZW4gaW52b2tlcyB0aGUgbmV4dCBlbnRpdHkgaW4gdGhlIGNoYWluIHVzaW5nIHRoZSBGaWx0ZXJDaGFpbiBvYmplY3QKKyAgICAgKiAoPGNvZGU+Y2hhaW4uZG9GaWx0ZXIoKTwvY29kZT4pLCA8YnI+CisgICAgICoqLworCisgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIgKCBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDaGFpbiBjaGFpbiApIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJAZG9GaWx0ZXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb21wcmVzc2lvblRocmVzaG9sZCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoZGVidWcgPiAwKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkb0ZpbHRlciBnZXRzIGNhbGxlZCwgYnV0IGNvbXByZXNzaW9uVHJlc2hvbGQgaXMgc2V0IHRvIDAgLSBubyBjb21wcmVzc2lvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBzdXBwb3J0Q29tcHJlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlcXVlc3QpIHsKKyAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlcXVlc3RVUkkgPSAiICsgKChIdHRwU2VydmxldFJlcXVlc3QpcmVxdWVzdCkuZ2V0UmVxdWVzdFVSSSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQXJlIHdlIGFsbG93ZWQgdG8gY29tcHJlc3MgPworICAgICAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKSAoKEh0dHBTZXJ2bGV0UmVxdWVzdClyZXF1ZXN0KS5nZXRQYXJhbWV0ZXIoImd6aXAiKTsKKyAgICAgICAgICAgIGlmICgiZmFsc2UiLmVxdWFscyhzKSkgeworICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnb3QgcGFyYW1ldGVyIGd6aXA9ZmFsc2UgLS0+IGRvbid0IGNvbXByZXNzLCBqdXN0IGNoYWluIGZpbHRlciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0KKyAgICAgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVxdWVzdClyZXF1ZXN0KS5nZXRIZWFkZXJzKCJBY2NlcHQtRW5jb2RpbmciKTsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5pbmRleE9mKCJnemlwIikgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzdXBwb3J0cyBjb21wcmVzc2lvbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRDb21wcmVzc2lvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJubyBzdXBwb3J0IGZvciBjb21wcmVzaW9uIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXN1cHBvcnRDb21wcmVzc2lvbikgeworICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZG9GaWx0ZXIgZ2V0cyBjYWxsZWQgd28gY29tcHJlc3Npb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBDb21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIgd3JhcHBlZFJlc3BvbnNlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlcigoSHR0cFNlcnZsZXRSZXNwb25zZSlyZXNwb25zZSk7CisgICAgICAgICAgICAgICAgd3JhcHBlZFJlc3BvbnNlLnNldERlYnVnTGV2ZWwoZGVidWcpOworICAgICAgICAgICAgICAgIHdyYXBwZWRSZXNwb25zZS5zZXRDb21wcmVzc2lvblRocmVzaG9sZChjb21wcmVzc2lvblRocmVzaG9sZCk7CisgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRvRmlsdGVyIGdldHMgY2FsbGVkIHdpdGggY29tcHJlc3Npb24iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgd3JhcHBlZFJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICB3cmFwcGVkUmVzcG9uc2UuZmluaXNoUmVzcG9uc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGZpbHRlciBjb25maWcKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gaW5pdC4gUmVxdWlyZWQgYnkgV2VibG9naWMgNi4xCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyQ29uZmlnIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJDb25maWcoRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgeworICAgICAgICBpbml0KGZpbHRlckNvbmZpZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGZpbHRlciBjb25maWcKKyAgICAgKiBSZXF1aXJlZCBieSBXZWJsb2dpYyA2LjEKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsdGVyQ29uZmlnIGdldEZpbHRlckNvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvbkZpbHRlclRlc3RTZXJ2bGV0LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY29tcHJlc3Npb25GaWx0ZXJzL0NvbXByZXNzaW9uRmlsdGVyVGVzdFNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWVhNjMxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvbkZpbHRlclRlc3RTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgY29tcHJlc3Npb25GaWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFZlcnkgU2ltcGxlIHRlc3Qgc2VydmxldCB0byB0ZXN0IGNvbXByZXNzaW9uIGZpbHRlcgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29tcHJlc3Npb25GaWx0ZXJUZXN0U2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIFNlcnZsZXRPdXRwdXRTdHJlYW0gb3V0ID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisKKyAgICAgICAgRW51bWVyYXRpb24gZSA9ICgoSHR0cFNlcnZsZXRSZXF1ZXN0KXJlcXVlc3QpLmdldEhlYWRlcnMoIkFjY2VwdC1FbmNvZGluZyIpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKG5hbWUpOworICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZigiZ3ppcCIpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oImd6aXAgc3VwcG9ydGVkIC0tIGFibGUgdG8gY29tcHJlc3MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJnemlwIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgb3V0LnByaW50bG4oIkNvbXByZXNzaW9uIEZpbHRlciBUZXN0IFNlcnZsZXQiKTsKKyAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb21wcmVzc2lvbkZpbHRlcnMvQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvblJlc3BvbnNlU3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5YWM0NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb21wcmVzc2lvbkZpbHRlcnMvQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMzI1IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBjb21wcmVzc2lvbkZpbHRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiA8Yj5TZXJ2bGV0T3V0cHV0U3RyZWFtPC9iPiB0aGF0IHdvcmtzIHdpdGgKKyAqIHRoZSBDb21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIgaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAYXV0aG9yIERtaXRyaSBWYWxkaW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb21wcmVzc2lvblJlc3BvbnNlU3RyZWFtCisgICAgZXh0ZW5kcyBTZXJ2bGV0T3V0cHV0U3RyZWFtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIHNlcnZsZXQgb3V0cHV0IHN0cmVhbSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBSZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgYXNzb2NpYXRlZCByZXNwb25zZQorICAgICAqLworICAgIHB1YmxpYyBDb21wcmVzc2lvblJlc3BvbnNlU3RyZWFtKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbnsKKworICAgICAgICBzdXBlcigpOworICAgICAgICBjbG9zZWQgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICAgICAgICB0aGlzLm91dHB1dCA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHRocmVzaG9sZCBudW1iZXIgd2hpY2ggZGVjaWRlcyB0byBjb21wcmVzcyBvciBub3QuCisgICAgICogVXNlcnMgY2FuIGNvbmZpZ3VyZSBpbiB3ZWIueG1sIHRvIHNldCBpdCB0byBmaXQgdGhlaXIgbmVlZHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBjb21wcmVzc2lvblRocmVzaG9sZCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEZWJ1ZyBsZXZlbAorICAgICAqLworICAgIHByaXZhdGUgaW50IGRlYnVnID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSBidWZmZXIgdGhyb3VnaCB3aGljaCBhbGwgb2Ygb3VyIG91dHB1dCBieXRlcyBhcmUgcGFzc2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBieXRlW10gYnVmZmVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGJ1ZmZlckNvdW50ID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSB1bmRlcmx5aW5nIGd6aXAgb3V0cHV0IHN0cmVhbSB0byB3aGljaCB3ZSBzaG91bGQgd3JpdGUgZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIGd6aXBzdHJlYW0gPSBudWxsOworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgc3RyZWFtIGJlZW4gY2xvc2VkPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVGhlIGNvbnRlbnQgbGVuZ3RoIHBhc3Qgd2hpY2ggd2Ugd2lsbCBub3Qgd3JpdGUsIG9yIC0xIGlmIHRoZXJlIGlzCisgICAgICogbm8gZGVmaW5lZCBjb250ZW50IGxlbmd0aC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGxlbmd0aCA9IC0xOworCisgICAgLyoqCisgICAgICogVGhlIHJlc3BvbnNlIHdpdGggd2hpY2ggdGhpcyBzZXJ2bGV0IG91dHB1dCBzdHJlYW0gaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdW5kZXJseWluZyBzZXJ2a2V0IG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggd2Ugc2hvdWxkIHdyaXRlIGRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIFNlcnZsZXRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBTZXQgZGVidWcgbGV2ZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Z0xldmVsKGludCBkZWJ1ZykgeworICAgICAgICB0aGlzLmRlYnVnID0gZGVidWc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbXByZXNzaW9uVGhyZXNob2xkIG51bWJlciBhbmQgY3JlYXRlIGJ1ZmZlciBmb3IgdGhpcyBzaXplCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0QnVmZmVyKGludCB0aHJlc2hvbGQpIHsKKyAgICAgICAgY29tcHJlc3Npb25UaHJlc2hvbGQgPSB0aHJlc2hvbGQ7CisgICAgICAgIGJ1ZmZlciA9IG5ldyBieXRlW2NvbXByZXNzaW9uVGhyZXNob2xkXTsKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJidWZmZXIgaXMgc2V0IHRvICIrY29tcHJlc3Npb25UaHJlc2hvbGQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhpcyBvdXRwdXQgc3RyZWFtLCBjYXVzaW5nIGFueSBidWZmZXJlZCBkYXRhIHRvIGJlIGZsdXNoZWQgYW5kCisgICAgICogYW55IGZ1cnRoZXIgb3V0cHV0IGRhdGEgdG8gdGhyb3cgYW4gSU9FeGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2xvc2UoKSBAIENvbXByZXNzaW9uUmVzcG9uc2VTdHJlYW0iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xvc2VkKQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUaGlzIG91dHB1dCBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQiKTsKKworICAgICAgICBpZiAoZ3ppcHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICBmbHVzaFRvR1ppcCgpOworICAgICAgICAgICAgZ3ppcHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgZ3ppcHN0cmVhbSA9IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMikgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJvdXRwdXQud3JpdGUoIik7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQud3JpdGUoYnVmZmVyLCAwLCBidWZmZXJDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoYnVmZmVyLCAwLCBidWZmZXJDb3VudCk7CisgICAgICAgICAgICAgICAgYnVmZmVyQ291bnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgICAgIGNsb3NlZCA9IHRydWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZsdXNoIGFueSBidWZmZXJlZCBkYXRhIGZvciB0aGlzIG91dHB1dCBzdHJlYW0sIHdoaWNoIGFsc28gY2F1c2VzIHRoZQorICAgICAqIHJlc3BvbnNlIHRvIGJlIGNvbW1pdHRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmbHVzaCgpIEAgQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbSIpOworICAgICAgICB9CisgICAgICAgIGlmIChjbG9zZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IGZsdXNoIGEgY2xvc2VkIG91dHB1dCBzdHJlYW0iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnemlwc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGd6aXBzdHJlYW0uZmx1c2goKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmx1c2hUb0daaXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmx1c2hUb0daaXAoKSBAIENvbXByZXNzaW9uUmVzcG9uc2VTdHJlYW0iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyQ291bnQgPiAwKSB7CisgICAgICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmbHVzaGluZyBvdXQgdG8gR1ppcFN0cmVhbSwgYnVmZmVyQ291bnQgPSAiICsgYnVmZmVyQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVUb0daaXAoYnVmZmVyLCAwLCBidWZmZXJDb3VudCk7CisgICAgICAgICAgICBidWZmZXJDb3VudCA9IDA7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBzcGVjaWZpZWQgYnl0ZSB0byBvdXIgb3V0cHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIFRoZSBieXRlIHRvIGJlIHdyaXR0ZW4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigid3JpdGUgIitiKyIgaW4gQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbSAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xvc2VkKQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgdG8gYSBjbG9zZWQgb3V0cHV0IHN0cmVhbSIpOworCisgICAgICAgIGlmIChidWZmZXJDb3VudCA+PSBidWZmZXIubGVuZ3RoKSB7CisgICAgICAgICAgICBmbHVzaFRvR1ppcCgpOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyW2J1ZmZlckNvdW50KytdID0gKGJ5dGUpIGI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIDxjb2RlPmIubGVuZ3RoPC9jb2RlPiBieXRlcyBmcm9tIHRoZSBzcGVjaWZpZWQgYnl0ZSBhcnJheQorICAgICAqIHRvIG91ciBvdXRwdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGIgVGhlIGJ5dGUgYXJyYXkgdG8gYmUgd3JpdHRlbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBiW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgd3JpdGUoYiwgMCwgYi5sZW5ndGgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSA8Y29kZT5sZW48L2NvZGU+IGJ5dGVzIGZyb20gdGhlIHNwZWNpZmllZCBieXRlIGFycmF5LCBzdGFydGluZworICAgICAqIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LCB0byBvdXIgb3V0cHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIFRoZSBieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGJ5dGVzIHRvIGJlIHdyaXR0ZW4KKyAgICAgKiBAcGFyYW0gb2ZmIFplcm8tcmVsYXRpdmUgc3RhcnRpbmcgb2Zmc2V0IG9mIHRoZSBieXRlcyB0byBiZSB3cml0dGVuCisgICAgICogQHBhcmFtIGxlbiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigid3JpdGUsIGJ1ZmZlckNvdW50ID0gIiArIGJ1ZmZlckNvdW50ICsgIiBsZW4gPSAiICsgbGVuICsgIiBvZmYgPSAiICsgb2ZmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVidWcgPiAyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ3cml0ZSgiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQud3JpdGUoYiwgb2ZmLCBsZW4pOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIpIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xvc2VkKQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgdG8gYSBjbG9zZWQgb3V0cHV0IHN0cmVhbSIpOworCisgICAgICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBDYW4gd2Ugd3JpdGUgaW50byBidWZmZXIgPworICAgICAgICBpZiAobGVuIDw9IChidWZmZXIubGVuZ3RoIC0gYnVmZmVyQ291bnQpKSB7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGIsIG9mZiwgYnVmZmVyLCBidWZmZXJDb3VudCwgbGVuKTsKKyAgICAgICAgICAgIGJ1ZmZlckNvdW50ICs9IGxlbjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgaW4gYnVmZmVyLiBGbHVzaCBpdCAuLi4KKyAgICAgICAgZmx1c2hUb0daaXAoKTsKKworICAgICAgICAvLyAuLi4gYW5kIHRyeSBhZ2Fpbi4gTm90ZSwgdGhhdCBidWZmZXJDb3VudCA9IDAgaGVyZSAhCisgICAgICAgIGlmIChsZW4gPD0gKGJ1ZmZlci5sZW5ndGggLSBidWZmZXJDb3VudCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgb2ZmLCBidWZmZXIsIGJ1ZmZlckNvdW50LCBsZW4pOworICAgICAgICAgICAgYnVmZmVyQ291bnQgKz0gbGVuOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gd3JpdGUgZGlyZWN0IHRvIGd6aXAKKyAgICAgICAgd3JpdGVUb0daaXAoYiwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9HWmlwKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigid3JpdGVUb0daaXAsIGxlbiA9ICIgKyBsZW4pOworICAgICAgICB9CisgICAgICAgIGlmIChkZWJ1ZyA+IDIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIndyaXRlVG9HWmlwKCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC53cml0ZShiLCBvZmYsIGxlbik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIikiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ3ppcHN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJuZXcgR1pJUE91dHB1dFN0cmVhbSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmlzQ29tbWl0dGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPiAxKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJSZXNwb25zZSBhbHJlYWR5IGNvbW1pdHRlZC4gVXNpbmcgb3JpZ2luYWwgb3V0cHV0IHN0cmVhbSIpOworICAgICAgICAgICAgICAgIGd6aXBzdHJlYW0gPSBvdXRwdXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcigiQ29udGVudC1FbmNvZGluZyIsICJnemlwIik7CisgICAgICAgICAgICAgICAgZ3ppcHN0cmVhbSA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKG91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ3ppcHN0cmVhbS53cml0ZShiLCBvZmYsIGxlbik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhpcyByZXNwb25zZSBzdHJlYW0gYmVlbiBjbG9zZWQ/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2xvc2VkKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jbG9zZWQpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY29tcHJlc3Npb25GaWx0ZXJzL0NvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjk2NWEwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgY29tcHJlc3Npb25GaWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgPGI+SHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI8L2I+IHRoYXQgd29ya3Mgd2l0aAorICogdGhlIENvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlU3RyZWFtIGltcGxlbWVudGF0aW9uLi4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEBhdXRob3IgRG1pdHJpIFZhbGRpbgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlciBleHRlbmRzIEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKyAgICAvKioKKyAgICAgKiBDYWxscyB0aGUgcGFyZW50IGNvbnN0cnVjdG9yIHdoaWNoIGNyZWF0ZXMgYSBTZXJ2bGV0UmVzcG9uc2UgYWRhcHRvcgorICAgICAqIHdyYXBwaW5nIHRoZSBnaXZlbiByZXNwb25zZSBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgQ29tcHJlc3Npb25TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgc3VwZXIocmVzcG9uc2UpOworICAgICAgICBvcmlnUmVzcG9uc2UgPSByZXNwb25zZTsKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIgY29uc3RydWN0b3IgZ2V0cyBjYWxsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBPcmlnaW5hbCByZXNwb25zZQorICAgICAqLworCisgICAgcHJvdGVjdGVkIEh0dHBTZXJ2bGV0UmVzcG9uc2Ugb3JpZ1Jlc3BvbnNlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUmVzcG9uc2UgaW1wbGVtZW50YXRpb24uCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIkNvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlciI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgU2VydmxldE91dHB1dFN0cmVhbSB0aGF0IGhhcyBiZWVuIHJldHVybmVkIGJ5CisgICAgICogPGNvZGU+Z2V0T3V0cHV0U3RyZWFtKCk8L2NvZGU+LCBpZiBhbnkuCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgU2VydmxldE91dHB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgUHJpbnRXcml0ZXIgdGhhdCBoYXMgYmVlbiByZXR1cm5lZCBieQorICAgICAqIDxjb2RlPmdldFdyaXRlcigpPC9jb2RlPiwgaWYgYW55LgorICAgICAqLworCisgICAgcHJvdGVjdGVkIFByaW50V3JpdGVyIHdyaXRlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGhyZXNob2xkIG51bWJlciB0byBjb21wcmVzcworICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgdGhyZXNob2xkID0gMDsKKworICAgIC8qKgorICAgICAqIERlYnVnIGxldmVsCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVidWcgPSAwOworCisgICAgLyoqCisgICAgICogQ29udGVudCB0eXBlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogU2V0IGNvbnRlbnQgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgeworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNldENvbnRlbnRUeXBlIHRvICIrY29udGVudFR5cGUpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKyAgICAgICAgb3JpZ1Jlc3BvbnNlLnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aHJlc2hvbGQgbnVtYmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcHJlc3Npb25UaHJlc2hvbGQoaW50IHRocmVzaG9sZCkgeworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNldENvbXByZXNzaW9uVGhyZXNob2xkIHRvICIgKyB0aHJlc2hvbGQpOworICAgICAgICB9CisgICAgICAgIHRoaXMudGhyZXNob2xkID0gdGhyZXNob2xkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGRlYnVnIGxldmVsCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVidWdMZXZlbChpbnQgZGVidWcpIHsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBTZXJ2bGV0T3V0cHV0U3RyZWFtIHRvIHdyaXRlIHRoZSBjb250ZW50CisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldE91dHB1dFN0cmVhbSBjcmVhdGVPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZU91dHB1dFN0cmVhbSBnZXRzIGNhbGxlZCIpOworICAgICAgICB9CisKKyAgICAgICAgQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbSBzdHJlYW0gPSBuZXcgQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbShvcmlnUmVzcG9uc2UpOworICAgICAgICBzdHJlYW0uc2V0RGVidWdMZXZlbChkZWJ1Zyk7CisgICAgICAgIHN0cmVhbS5zZXRCdWZmZXIodGhyZXNob2xkKTsKKworICAgICAgICByZXR1cm4gc3RyZWFtOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGaW5pc2ggYSByZXNwb25zZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaW5pc2hSZXNwb25zZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXJ2bGV0UmVzcG9uc2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgYnVmZmVyIGFuZCBjb21taXQgdGhpcyByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmbHVzaCBidWZmZXIgQCBDb21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIiKTsKKyAgICAgICAgfQorICAgICAgICAoKENvbXByZXNzaW9uUmVzcG9uc2VTdHJlYW0pc3RyZWFtKS5mbHVzaCgpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJ2bGV0IG91dHB1dCBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiA8Y29kZT5nZXRXcml0ZXI8L2NvZGU+IGhhcworICAgICAqICBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHJlc3BvbnNlCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRXcml0ZXIoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXNwb25zZSIpOworCisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHN0cmVhbSA9IGNyZWF0ZU91dHB1dFN0cmVhbSgpOworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN0cmVhbSBpcyBzZXQgdG8gIitzdHJlYW0rIiBpbiBnZXRPdXRwdXRTdHJlYW0iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoc3RyZWFtKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgd3JpdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlc3BvbnNlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+Z2V0T3V0cHV0U3RyZWFtPC9jb2RlPiBoYXMKKyAgICAgKiAgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXNwb25zZQorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAod3JpdGVyKTsKKworICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRPdXRwdXRTdHJlYW0oKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXNwb25zZSIpOworCisgICAgICAgIHN0cmVhbSA9IGNyZWF0ZU91dHB1dFN0cmVhbSgpOworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN0cmVhbSBpcyBzZXQgdG8gIitzdHJlYW0rIiBpbiBnZXRXcml0ZXIiKTsKKyAgICAgICAgfQorICAgICAgICAvL1N0cmluZyBjaGFyc2V0ID0gZ2V0Q2hhcnNldEZyb21Db250ZW50VHlwZShjb250ZW50VHlwZSk7CisgICAgICAgIFN0cmluZyBjaGFyRW5jID0gb3JpZ1Jlc3BvbnNlLmdldENoYXJhY3RlckVuY29kaW5nKCk7CisgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhcmFjdGVyIGVuY29kaW5nIGlzICIgKyBjaGFyRW5jKTsKKyAgICAgICAgfQorICAgICAgICAvLyBIdHRwU2VydmxldFJlc3BvbnNlLmdldENoYXJhY3RlckVuY29kaW5nKCkgc2hvdWxkbid0IHJldHVybiBudWxsCisgICAgICAgIC8vIGFjY29yZGluZyB0aGUgc3BlYywgc28gZmVlbCBmcmVlIHRvIHJlbW92ZSB0aGF0ICJpZiIKKyAgICAgICAgaWYgKGNoYXJFbmMgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtLCBjaGFyRW5jKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuICh3cml0ZXIpOworCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TGVuZ3RoKGludCBsZW5ndGgpIHsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9kYXRlcy9Kc3BDYWxlbmRhci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2RhdGVzL0pzcENhbGVuZGFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5ZWVhMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9kYXRlcy9Kc3BDYWxlbmRhci5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgZGF0ZXM7CisKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGNsYXNzIEpzcENhbGVuZGFyIHsKKyAgICBDYWxlbmRhciAgY2FsZW5kYXIgPSBudWxsOworCisgICAgcHVibGljIEpzcENhbGVuZGFyKCkgeworCWNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwlEYXRlIHRyaWFsVGltZSA9IG5ldyBEYXRlKCk7CisJY2FsZW5kYXIuc2V0VGltZSh0cmlhbFRpbWUpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0WWVhcigpIHsKKwlyZXR1cm4gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1vbnRoKCkgeworCWludCBtID0gZ2V0TW9udGhJbnQoKTsKKwlTdHJpbmdbXSBtb250aHMgPSBuZXcgU3RyaW5nIFtdIHsgIkphbnVhcnkiLCAiRmVicnVhcnkiLCAiTWFyY2giLAorCQkJCQkiQXByaWwiLCAiTWF5IiwgIkp1bmUiLAorCQkJCQkiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwKKwkJCQkJIk9jdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiIH07CisJaWYgKG0gPiAxMikKKwkgICAgcmV0dXJuICJVbmtub3duIHRvIE1hbiI7CisJCisJcmV0dXJuIG1vbnRoc1ttIC0gMV07CisKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERheSgpIHsKKwlpbnQgeCA9IGdldERheU9mV2VlaygpOworCVN0cmluZ1tdIGRheXMgPSBuZXcgU3RyaW5nW10geyJTdW5kYXkiLCAiTW9uZGF5IiwgIlR1ZXNkYXkiLCAiV2VkbmVzZGF5IiwgCisJCQkJICAgICAgIlRodXJzZGF5IiwgIkZyaWRheSIsICJTYXR1cmRheSJ9OworCisJaWYgKHggPiA3KQorCSAgICByZXR1cm4gIlVua25vd24gdG8gTWFuIjsKKworCXJldHVybiBkYXlzW3ggLSAxXTsKKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldE1vbnRoSW50KCkgeworCXJldHVybiAxICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1PTlRIKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERhdGUoKSB7CisJcmV0dXJuIGdldE1vbnRoSW50KCkgKyAiLyIgKyBnZXREYXlPZk1vbnRoKCkgKyAiLyIgKyAgZ2V0WWVhcigpOworCisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUaW1lKCkgeworCXJldHVybiBnZXRIb3VyKCkgKyAiOiIgKyBnZXRNaW51dGUoKSArICI6IiArIGdldFNlY29uZCgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RGF5T2ZNb250aCgpIHsKKwlyZXR1cm4gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREYXlPZlllYXIoKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfWUVBUik7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRXZWVrT2ZZZWFyKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuV0VFS19PRl9ZRUFSKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFdlZWtPZk1vbnRoKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuV0VFS19PRl9NT05USCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREYXlPZldlZWsoKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfV0VFSyk7CisgICAgfQorICAgICAKKyAgICBwdWJsaWMgaW50IGdldEhvdXIoKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0TWludXRlKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTUlOVVRFKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0U2Vjb25kKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuU0VDT05EKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisJSnNwQ2FsZW5kYXIgZGIgPSBuZXcgSnNwQ2FsZW5kYXIoKTsKKwlwKCJkYXRlOiAiICsgZGIuZ2V0RGF5T2ZNb250aCgpKTsKKwlwKCJ5ZWFyOiAiICsgZGIuZ2V0WWVhcigpKTsKKwlwKCJtb250aDogIiArIGRiLmdldE1vbnRoKCkpOworCXAoInRpbWU6ICIgKyBkYi5nZXRUaW1lKCkpOworCXAoImRhdGU6ICIgKyBkYi5nZXREYXRlKCkpOworCXAoIkRheTogIiArIGRiLmdldERheSgpKTsKKwlwKCJEYXlPZlllYXI6ICIgKyBkYi5nZXREYXlPZlllYXIoKSk7CisJcCgiV2Vla09mWWVhcjogIiArIGRiLmdldFdlZWtPZlllYXIoKSk7CisJcCgiZXJhOiAiICsgZGIuZ2V0RXJhKCkpOworCXAoImFtcG06ICIgKyBkYi5nZXRBTVBNKCkpOworCXAoIkRTVDogIiArIGRiLmdldERTVE9mZnNldCgpKTsKKwlwKCJaT05FIE9mZnNldDogIiArIGRiLmdldFpvbmVPZmZzZXQoKSk7CisJcCgiVElNRVpPTkU6ICIgKyBkYi5nZXRVU1RpbWVab25lKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcChTdHJpbmcgeCkgeworCVN5c3RlbS5vdXQucHJpbnRsbih4KTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0RXJhKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuRVJBKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVTVGltZVpvbmUoKSB7CisJU3RyaW5nW10gem9uZXMgPSBuZXcgU3RyaW5nW10geyJIYXdhaWkiLCAiQWxhc2thbiIsICJQYWNpZmljIiwKKwkJCQkgICAgICAgIk1vdW50YWluIiwgIkNlbnRyYWwiLCAiRWFzdGVybiJ9OworCQorCXJldHVybiB6b25lc1sxMCArIGdldFpvbmVPZmZzZXQoKV07CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRab25lT2Zmc2V0KCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuWk9ORV9PRkZTRVQpLyg2MCo2MCoxMDAwKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0RFNUT2Zmc2V0KCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuRFNUX09GRlNFVCkvKDYwKjYwKjEwMDApOworICAgIH0KKworICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0QU1QTSgpIHsKKwlyZXR1cm4gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkFNX1BNKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9lcnJvci9TbWFydC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2Vycm9yL1NtYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5YWVmMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9lcnJvci9TbWFydC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3BhY2thZ2UgZXJyb3I7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5sYW5nLio7CisKK3B1YmxpYyBjbGFzcyBTbWFydCB7CisKKyAgU3RyaW5nIG5hbWUgPSAiSlNQIjsKKworICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkgeworCXJldHVybiBuYW1lOworICB9CQorCisgIHB1YmxpYyB2b2lkIHNldE5hbWUgKFN0cmluZyBuYW1lKSB7CisJdGhpcy5uYW1lID0gbmFtZTsKKyAgfQkKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9leGFtcGxlcy9FeGFtcGxlVGFnQmFzZS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2V4YW1wbGVzL0V4YW1wbGVUYWdCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVkM2EzMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9leGFtcGxlcy9FeGFtcGxlVGFnQmFzZS5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBleGFtcGxlczsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLio7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0Lio7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeGFtcGxlVGFnQmFzZSBleHRlbmRzIEJvZHlUYWdTdXBwb3J0IHsKKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChUYWcgcGFyZW50KSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJvZHlDb250ZW50KEJvZHlDb250ZW50IGJvZHlPdXQpIHsKKyAgICAgICAgdGhpcy5ib2R5T3V0ID0gYm9keU91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYWdlQ29udGV4dChQYWdlQ29udGV4dCBwYWdlQ29udGV4dCkgeworICAgICAgICB0aGlzLnBhZ2VDb250ZXh0ID0gcGFnZUNvbnRleHQ7CisgICAgfQorCisgICAgcHVibGljIFRhZyBnZXRQYXJlbnQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBhcmVudDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBkb1N0YXJ0VGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBTS0lQX0JPRFk7CisgICAgfQorCisgICAgcHVibGljIGludCBkb0VuZFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworICAgICAgICByZXR1cm4gRVZBTF9QQUdFOworICAgIH0KKyAgICAKKworICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBCb2R5VGFnIG1ldGhvZHMgYXMgd2VsbAorICAgIC8vIGp1c3QgaW4gY2FzZSBhIHRhZyBkZWNpZGVzIHRvIGltcGxlbWVudCBCb2R5VGFnLgorICAgIHB1YmxpYyB2b2lkIGRvSW5pdEJvZHkoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGRvQWZ0ZXJCb2R5KCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBTS0lQX0JPRFk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgYm9keU91dCA9IG51bGw7CisgICAgICAgIHBhZ2VDb250ZXh0ID0gbnVsbDsKKyAgICAgICAgcGFyZW50ID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIEJvZHlDb250ZW50IGJvZHlPdXQ7CisgICAgcHJvdGVjdGVkIFBhZ2VDb250ZXh0IHBhZ2VDb250ZXh0OworICAgIHByb3RlY3RlZCBUYWcgcGFyZW50OworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2V4YW1wbGVzL0Zvb1RhZy5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2V4YW1wbGVzL0Zvb1RhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NWYzNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZXhhbXBsZXMvRm9vVGFnLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGV4YW1wbGVzOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogRXhhbXBsZTE6IHRoZSBzaW1wbGVzdCB0YWcKKyAqIENvbGxlY3QgYXR0cmlidXRlcyBhbmQgY2FsbCBpbnRvIHNvbWUgYWN0aW9ucworICoKKyAqIDxmb28gYXR0MT0iLi4uIiBhdHQyPSIuLi4uIiBhdHQzPSIuLi4uIiAvPgorICovCisKK3B1YmxpYyBjbGFzcyBGb29UYWcgCisgICAgZXh0ZW5kcyBFeGFtcGxlVGFnQmFzZSAKK3sKKyAgICBwcml2YXRlIFN0cmluZyBhdHRzW10gPSBuZXcgU3RyaW5nWzNdOworICAgIGludCBpID0gMDsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgc2V0QXR0KGludCBpbmRleCwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGF0dHNbaW5kZXhdID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEF0dDEoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHNldEF0dCgwLCB2YWx1ZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEF0dDIoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHNldEF0dCgxLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXR0MyhTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgc2V0QXR0KDIsIHZhbHVlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyBzdGFydCB0YWcKKyAgICAgKgorICAgICAqIEByZXR1cm4gRVZBTF9CT0RZX0lOQ0xVREUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRvU3RhcnRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKyAgICAgICAgaSA9IDA7CisJcmV0dXJuIEVWQUxfQk9EWV9UQUc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9Jbml0Qm9keSgpIHRocm93cyBKc3BFeGNlcHRpb24geworICAgICAgICBwYWdlQ29udGV4dC5zZXRBdHRyaWJ1dGUoIm1lbWJlciIsIGF0dHNbaV0pOworICAgICAgICBpKys7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZG9BZnRlckJvZHkoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpID09IDMpIHsKKyAgICAgICAgICAgICAgICBib2R5T3V0LndyaXRlT3V0KGJvZHlPdXQuZ2V0RW5jbG9zaW5nV3JpdGVyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBTS0lQX0JPRFk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBwYWdlQ29udGV4dC5zZXRBdHRyaWJ1dGUoIm1lbWJlciIsIGF0dHNbaV0pOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgcmV0dXJuIEVWQUxfQk9EWV9UQUc7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwVGFnRXhjZXB0aW9uKGV4LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZXhhbXBsZXMvRm9vVGFnRXh0cmFJbmZvLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZXhhbXBsZXMvRm9vVGFnRXh0cmFJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczM2VmZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9leGFtcGxlcy9Gb29UYWdFeHRyYUluZm8uamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgZXhhbXBsZXM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuKjsKKworcHVibGljIGNsYXNzIEZvb1RhZ0V4dHJhSW5mbyBleHRlbmRzIFRhZ0V4dHJhSW5mbyB7CisgICAgcHVibGljIFZhcmlhYmxlSW5mb1tdIGdldFZhcmlhYmxlSW5mbyhUYWdEYXRhIGRhdGEpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBWYXJpYWJsZUluZm9bXSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVJbmZvKCJtZW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVJbmZvLk5FU1RFRCkKKyAgICAgICAgICAgIH07CisgICAgfQorfQorCisgICAgICAgIApkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2V4YW1wbGVzL0xvZ1RhZy5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2V4YW1wbGVzL0xvZ1RhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzk0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZXhhbXBsZXMvTG9nVGFnLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGV4YW1wbGVzOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC4qOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBMb2cgdGhlIGNvbnRlbnRzIG9mIHRoZSBib2R5LiBDb3VsZCBiZSB1c2VkIHRvIGhhbmRsZSBlcnJvcnMgZXRjLiAKKyAqLworcHVibGljIGNsYXNzIExvZ1RhZyAKKyAgICBleHRlbmRzIEV4YW1wbGVUYWdCYXNlCit7CisgICAgYm9vbGVhbiB0b0Jyb3dzZXIgPSBmYWxzZTsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRUb0Jyb3dzZXIoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgdG9Ccm93c2VyID0gZmFsc2U7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkKKyAgICAgICAgICAgIHRvQnJvd3NlciA9IHRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRvQnJvd3NlciA9IGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZG9TdGFydFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworICAgICAgICByZXR1cm4gRVZBTF9CT0RZX1RBRzsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBkb0FmdGVyQm9keSgpIHRocm93cyBKc3BFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIHMgPSBib2R5T3V0LmdldFN0cmluZygpOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHMpOworICAgICAgICAgICAgaWYgKHRvQnJvd3NlcikKKyAgICAgICAgICAgICAgICBib2R5T3V0LndyaXRlT3V0KGJvZHlPdXQuZ2V0RW5jbG9zaW5nV3JpdGVyKCkpOworICAgICAgICAgICAgcmV0dXJuIFNLSVBfQk9EWTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKc3BUYWdFeGNlcHRpb24oZXgudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyAgICAKKyAgICAgICAgCisgICAgCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZXhhbXBsZXMvU2hvd1NvdXJjZS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2V4YW1wbGVzL1Nob3dTb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmI2NWM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2V4YW1wbGVzL1Nob3dTb3VyY2UuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgZXhhbXBsZXM7CisKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC4qOworCitpbXBvcnQgamF2YS5pby4qOworCisvKioKKyAqIERpc3BsYXkgdGhlIHNvdXJjZXMgb2YgdGhlIEpTUCBmaWxlLgorICovCitwdWJsaWMgY2xhc3MgU2hvd1NvdXJjZQorICAgIGV4dGVuZHMgVGFnU3VwcG9ydAoreworICAgIFN0cmluZyBqc3BGaWxlOworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEpzcEZpbGUoU3RyaW5nIGpzcEZpbGUpIHsKKyAgICAgICAgdGhpcy5qc3BGaWxlID0ganNwRmlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGRvRW5kVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisJaWYgKChqc3BGaWxlLmluZGV4T2YoICIuLiIgKSA+PSAwKSB8fAorICAgICAgICAgICAgKGpzcEZpbGUudG9VcHBlckNhc2UoKS5pbmRleE9mKCIvV0VCLUlORi8iKSAhPSAwKSB8fAorICAgICAgICAgICAgKGpzcEZpbGUudG9VcHBlckNhc2UoKS5pbmRleE9mKCIvTUVUQS1JTkYvIikgIT0gMCkpCisJICAgIHRocm93IG5ldyBKc3BUYWdFeGNlcHRpb24oIkludmFsaWQgSlNQIGZpbGUgIiArIGpzcEZpbGUpOworCisgICAgICAgIElucHV0U3RyZWFtIGluCisgICAgICAgICAgICA9IHBhZ2VDb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShqc3BGaWxlKTsKKworICAgICAgICBpZiAoaW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBKc3BUYWdFeGNlcHRpb24oIlVuYWJsZSB0byBmaW5kIEpTUCBmaWxlOiAiK2pzcEZpbGUpOworCisgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbik7CisJSnNwV3JpdGVyIG91dCA9IHBhZ2VDb250ZXh0LmdldE91dCgpOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8Ym9keT4iKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8cHJlPiIpOworICAgICAgICAgICAgZm9yKGludCBjaCA9IGluLnJlYWQoKTsgY2ggIT0gLTE7IGNoID0gaW4ucmVhZCgpKQorICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPCcpCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiJmx0OyIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KChjaGFyKSBjaCk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiPC9wcmU+Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiPC9ib2R5PiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEpzcFRhZ0V4Y2VwdGlvbigiSU9FeGNlcHRpb246ICIrZXgudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmRvRW5kVGFnKCk7CisgICAgfQorfQorCisgICAgCisgICAgICAgIAorICAgIApkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2ZpbHRlcnMvRXhhbXBsZUZpbHRlci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2ZpbHRlcnMvRXhhbXBsZUZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYjA5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycy9FeGFtcGxlRmlsdGVyLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3BhY2thZ2UgZmlsdGVyczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CisKKworLyoqCisgKiBFeGFtcGxlIGZpbHRlciB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBlaXRoZXIgYW4gaW5kaXZpZHVhbCBzZXJ2bGV0CisgKiBvciB0byBhIFVSTCBwYXR0ZXJuLiAgVGhpcyBmaWx0ZXIgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CisgKiA8dWw+CisgKiA8bGk+QXR0YWNoZXMgaXRzZWxmIGFzIGEgcmVxdWVzdCBhdHRyaWJ1dGUsIHVuZGVyIHRoZSBhdHRyaWJ1dGUgbmFtZQorICogICAgIGRlZmluZWQgYnkgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5hdHRyaWJ1dGU8L2NvZGU+IGluaXRpYWxpemF0aW9uCisgKiAgICAgcGFyYW1ldGVyLjwvbGk+CisgKiA8bGk+Q2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyByZXF1aXJlZCB0byBwZXJmb3JtIHRoZQorICogICAgIHNlcnZsZXQgcHJvY2Vzc2luZyByZXF1aXJlZCBieSB0aGlzIHJlcXVlc3QsIGluY2x1ZGluZyBhbnkKKyAqICAgICBzdWJzZXF1ZW50bHkgZGVmaW5lZCBmaWx0ZXJzLCBhbmQgbG9ncyB0aGUgcmVzdWx0IHRvIHRoZSBzZXJ2bGV0CisgKiAgICAgY29udGV4dCBsb2cgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgRXhhbXBsZUZpbHRlciBpbXBsZW1lbnRzIEZpbHRlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgbmFtZSB1bmRlciB3aGljaCB3ZSBzdG9yZSBhIHJlZmVyZW5jZSB0byBvdXJzZWxmLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3Qgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aC4gIElmIHRoaXMgdmFsdWUKKyAgICAgKiBpcyBudWxsLCB0aGlzIGZpbHRlciBpbnN0YW5jZSBpcyBub3QgY3VycmVudGx5IGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFRha2UgdGhpcyBmaWx0ZXIgb3V0IG9mIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKworICAgICAgICB0aGlzLmF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRoaXMuZmlsdGVyQ29uZmlnID0gbnVsbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGltZSB0aGUgcHJvY2Vzc2luZyB0aGF0IGlzIHBlcmZvcm1lZCBieSBhbGwgc3Vic2VxdWVudCBmaWx0ZXJzIGluIHRoZQorICAgICAqIGN1cnJlbnQgZmlsdGVyIHN0YWNrLCBpbmNsdWRpbmcgdGhlIHVsdGltYXRlbHkgaW52b2tlZCBzZXJ2bGV0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHBhcmFtIGNoYWluIFRoZSBmaWx0ZXIgY2hhaW4gd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlckNoYWluIGNoYWluKQorCXRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKwkvLyBTdG9yZSBvdXJzZWx2ZXMgYXMgYSByZXF1ZXN0IGF0dHJpYnV0ZSAoaWYgcmVxdWVzdGVkKQorCWlmIChhdHRyaWJ1dGUgIT0gbnVsbCkKKwkgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB0aGlzKTsKKworCS8vIFRpbWUgYW5kIGxvZyB0aGUgc3Vic2VxdWVudCBwcm9jZXNzaW5nCisJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwlmaWx0ZXJDb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5sb2cKKwkgICAgKHRoaXMudG9TdHJpbmcoKSArICI6ICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsKKwkgICAgICIgbWlsbGlzZWNvbmRzIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBsYWNlIHRoaXMgZmlsdGVyIGludG8gc2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJDb25maWcgVGhlIGZpbHRlciBjb25maWd1cmF0aW9uIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisJdGhpcy5maWx0ZXJDb25maWcgPSBmaWx0ZXJDb25maWc7CisgICAgICAgIHRoaXMuYXR0cmlidXRlID0gZmlsdGVyQ29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImF0dHJpYnV0ZSIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworCWlmIChmaWx0ZXJDb25maWcgPT0gbnVsbCkKKwkgICAgcmV0dXJuICgiSW52b2tlckZpbHRlcigpIik7CisJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiSW52b2tlckZpbHRlcigiKTsKKwlzYi5hcHBlbmQoZmlsdGVyQ29uZmlnKTsKKwlzYi5hcHBlbmQoIikiKTsKKwlyZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2ZpbHRlcnMvUmVxdWVzdER1bXBlckZpbHRlci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2ZpbHRlcnMvUmVxdWVzdER1bXBlckZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOWE3YjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycy9SZXF1ZXN0RHVtcGVyRmlsdGVyLmphdmEKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKKworcGFja2FnZSBmaWx0ZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKworLyoqCisgKiBFeGFtcGxlIGZpbHRlciB0aGF0IGR1bXBzIGludGVyZXN0aW5nIHN0YXRlIGluZm9ybWF0aW9uIGFib3V0IGEgcmVxdWVzdAorICogdG8gdGhlIGFzc29jaWF0ZWQgc2VydmxldCBjb250ZXh0IGxvZyBmaWxlLCBiZWZvcmUgYWxsb3dpbmcgdGhlIHNlcnZsZXQKKyAqIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QgaW4gdGhlIHVzdWFsIHdheS4gIFRoaXMgY2FuIGJlIGluc3RhbGxlZCBhcyBuZWVkZWQKKyAqIHRvIGFzc2lzdCBpbiBkZWJ1Z2dpbmcgcHJvYmxlbXMuCisgKgorICogQGF1dGhvciBDcmFpZyBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXF1ZXN0RHVtcGVyRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3Qgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aC4gIElmIHRoaXMgdmFsdWUKKyAgICAgKiBpcyBudWxsLCB0aGlzIGZpbHRlciBpbnN0YW5jZSBpcyBub3QgY3VycmVudGx5IGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFRha2UgdGhpcyBmaWx0ZXIgb3V0IG9mIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKworICAgICAgICB0aGlzLmZpbHRlckNvbmZpZyA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRpbWUgdGhlIHByb2Nlc3NpbmcgdGhhdCBpcyBwZXJmb3JtZWQgYnkgYWxsIHN1YnNlcXVlbnQgZmlsdGVycyBpbiB0aGUKKyAgICAgKiBjdXJyZW50IGZpbHRlciBzdGFjaywgaW5jbHVkaW5nIHRoZSB1bHRpbWF0ZWx5IGludm9rZWQgc2VydmxldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzdWx0IFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSBjaGFpbiBUaGUgZmlsdGVyIGNoYWluIHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDaGFpbiBjaGFpbikKKwl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIGlmIChmaWx0ZXJDb25maWcgPT0gbnVsbCkKKwkgICAgcmV0dXJuOworCisJLy8gUmVuZGVyIHRoZSBnZW5lcmljIHNlcnZsZXQgcmVxdWVzdCBwcm9wZXJ0aWVzCisJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdyk7CisJd3JpdGVyLnByaW50bG4oIlJlcXVlc3QgUmVjZWl2ZWQgYXQgIiArCisJCSAgICAgICAobmV3IFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpKTsKKwl3cml0ZXIucHJpbnRsbigiIGNoYXJhY3RlckVuY29kaW5nPSIgKyByZXF1ZXN0LmdldENoYXJhY3RlckVuY29kaW5nKCkpOworCXdyaXRlci5wcmludGxuKCIgICAgIGNvbnRlbnRMZW5ndGg9IiArIHJlcXVlc3QuZ2V0Q29udGVudExlbmd0aCgpKTsKKwl3cml0ZXIucHJpbnRsbigiICAgICAgIGNvbnRlbnRUeXBlPSIgKyByZXF1ZXN0LmdldENvbnRlbnRUeXBlKCkpOworCXdyaXRlci5wcmludGxuKCIgICAgICAgICAgICBsb2NhbGU9IiArIHJlcXVlc3QuZ2V0TG9jYWxlKCkpOworCXdyaXRlci5wcmludCgiICAgICAgICAgICBsb2NhbGVzPSIpOworCUVudW1lcmF0aW9uIGxvY2FsZXMgPSByZXF1ZXN0LmdldExvY2FsZXMoKTsKKwlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwl3aGlsZSAobG9jYWxlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworCSAgICBMb2NhbGUgbG9jYWxlID0gKExvY2FsZSkgbG9jYWxlcy5uZXh0RWxlbWVudCgpOworCSAgICBpZiAoZmlyc3QpCisJICAgICAgICBmaXJzdCA9IGZhbHNlOworCSAgICBlbHNlCisJICAgICAgICB3cml0ZXIucHJpbnQoIiwgIik7CisJICAgIHdyaXRlci5wcmludChsb2NhbGUudG9TdHJpbmcoKSk7CisJfQorCXdyaXRlci5wcmludGxuKCk7CisJRW51bWVyYXRpb24gbmFtZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7CisJd2hpbGUgKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisJICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMubmV4dEVsZW1lbnQoKTsKKwkgICAgd3JpdGVyLnByaW50KCIgICAgICAgICBwYXJhbWV0ZXI9IiArIG5hbWUgKyAiPSIpOworCSAgICBTdHJpbmcgdmFsdWVzW10gPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhuYW1lKTsKKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKwkgICAgICAgIGlmIChpID4gMCkKKwkJICAgIHdyaXRlci5wcmludCgiLCAiKTsKKwkJd3JpdGVyLnByaW50KHZhbHVlc1tpXSk7CisJICAgIH0KKwkgICAgd3JpdGVyLnByaW50bG4oKTsKKwl9CisJd3JpdGVyLnByaW50bG4oIiAgICAgICAgICBwcm90b2NvbD0iICsgcmVxdWVzdC5nZXRQcm90b2NvbCgpKTsKKwl3cml0ZXIucHJpbnRsbigiICAgICAgICByZW1vdGVBZGRyPSIgKyByZXF1ZXN0LmdldFJlbW90ZUFkZHIoKSk7CisJd3JpdGVyLnByaW50bG4oIiAgICAgICAgcmVtb3RlSG9zdD0iICsgcmVxdWVzdC5nZXRSZW1vdGVIb3N0KCkpOworCXdyaXRlci5wcmludGxuKCIgICAgICAgICAgICBzY2hlbWU9IiArIHJlcXVlc3QuZ2V0U2NoZW1lKCkpOworCXdyaXRlci5wcmludGxuKCIgICAgICAgIHNlcnZlck5hbWU9IiArIHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpKTsKKwl3cml0ZXIucHJpbnRsbigiICAgICAgICBzZXJ2ZXJQb3J0PSIgKyByZXF1ZXN0LmdldFNlcnZlclBvcnQoKSk7CisJd3JpdGVyLnByaW50bG4oIiAgICAgICAgICBpc1NlY3VyZT0iICsgcmVxdWVzdC5pc1NlY3VyZSgpKTsKKworCS8vIFJlbmRlciB0aGUgSFRUUCBzZXJ2bGV0IHJlcXVlc3QgcHJvcGVydGllcworCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXF1ZXN0KSB7CisJICAgIHdyaXRlci5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwkgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IGhyZXF1ZXN0ID0gKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxdWVzdDsKKwkgICAgd3JpdGVyLnByaW50bG4oIiAgICAgICBjb250ZXh0UGF0aD0iICsgaHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSk7CisJICAgIENvb2tpZSBjb29raWVzW10gPSBocmVxdWVzdC5nZXRDb29raWVzKCk7CisgICAgICAgICAgICBpZiAoY29va2llcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvb2tpZXMgPSBuZXcgQ29va2llWzBdOworCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHsKKwkgICAgICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgICAgICBjb29raWU9IiArIGNvb2tpZXNbaV0uZ2V0TmFtZSgpICsKKwkJCSAgICAgICAiPSIgKyBjb29raWVzW2ldLmdldFZhbHVlKCkpOworCSAgICB9CisJICAgIG5hbWVzID0gaHJlcXVlc3QuZ2V0SGVhZGVyTmFtZXMoKTsKKwkgICAgd2hpbGUgKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisJICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHRFbGVtZW50KCk7CisJCVN0cmluZyB2YWx1ZSA9IGhyZXF1ZXN0LmdldEhlYWRlcihuYW1lKTsKKwkgICAgICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgICAgICBoZWFkZXI9IiArIG5hbWUgKyAiPSIgKyB2YWx1ZSk7CisJICAgIH0KKwkgICAgd3JpdGVyLnByaW50bG4oIiAgICAgICAgICAgIG1ldGhvZD0iICsgaHJlcXVlc3QuZ2V0TWV0aG9kKCkpOworCSAgICB3cml0ZXIucHJpbnRsbigiICAgICAgICAgIHBhdGhJbmZvPSIgKyBocmVxdWVzdC5nZXRQYXRoSW5mbygpKTsKKwkgICAgd3JpdGVyLnByaW50bG4oIiAgICAgICBxdWVyeVN0cmluZz0iICsgaHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSk7CisJICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgIHJlbW90ZVVzZXI9IiArIGhyZXF1ZXN0LmdldFJlbW90ZVVzZXIoKSk7CisJICAgIHdyaXRlci5wcmludGxuKCJyZXF1ZXN0ZWRTZXNzaW9uSWQ9IiArCisJCQkgICBocmVxdWVzdC5nZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKSk7CisJICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgIHJlcXVlc3RVUkk9IiArIGhyZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7CisJICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgc2VydmxldFBhdGg9IiArIGhyZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkpOworCX0KKwl3cml0ZXIucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisKKwkvLyBMb2cgdGhlIHJlc3VsdGluZyBzdHJpbmcKKwl3cml0ZXIuZmx1c2goKTsKKwlmaWx0ZXJDb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5sb2coc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKSk7CisKKwkvLyBQYXNzIGNvbnRyb2wgb24gdG8gdGhlIG5leHQgZmlsdGVyCisgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGxhY2UgdGhpcyBmaWx0ZXIgaW50byBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlckNvbmZpZyBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKwl0aGlzLmZpbHRlckNvbmZpZyA9IGZpbHRlckNvbmZpZzsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKwlpZiAoZmlsdGVyQ29uZmlnID09IG51bGwpCisJICAgIHJldHVybiAoIlJlcXVlc3REdW1wZXJGaWx0ZXIoKSIpOworCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlJlcXVlc3REdW1wZXJGaWx0ZXIoIik7CisJc2IuYXBwZW5kKGZpbHRlckNvbmZpZyk7CisJc2IuYXBwZW5kKCIpIik7CisJcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9maWx0ZXJzL1NldENoYXJhY3RlckVuY29kaW5nRmlsdGVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycy9TZXRDaGFyYWN0ZXJFbmNvZGluZ0ZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ODY4YzUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycy9TZXRDaGFyYWN0ZXJFbmNvZGluZ0ZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwYWNrYWdlIGZpbHRlcnM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlVuYXZhaWxhYmxlRXhjZXB0aW9uOworCisKKy8qKgorICogPHA+RXhhbXBsZSBmaWx0ZXIgdGhhdCBzZXRzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgdXNlZCBpbiBwYXJzaW5nIHRoZQorICogaW5jb21pbmcgcmVxdWVzdCwgZWl0aGVyIHVuY29uZGl0aW9uYWxseSBvciBvbmx5IGlmIHRoZSBjbGllbnQgZGlkIG5vdAorICogc3BlY2lmeSBhIGNoYXJhY3RlciBlbmNvZGluZy4gIENvbmZpZ3VyYXRpb24gb2YgdGhpcyBmaWx0ZXIgaXMgYmFzZWQgb24KKyAqIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyczo8L3A+CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5lbmNvZGluZzwvc3Ryb25nPiAtIFRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgY29uZmlndXJlZAorICogICAgIGZvciB0aGlzIHJlcXVlc3QsIGVpdGhlciBjb25kaXRpb25hbGx5IG9yIHVuY29uZGl0aW9uYWxseSBiYXNlZCBvbgorICogICAgIHRoZSA8Y29kZT5pZ25vcmU8L2NvZGU+IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlci4gIFRoaXMgcGFyYW1ldGVyCisgKiAgICAgaXMgcmVxdWlyZWQsIHNvIHRoZXJlIGlzIG5vIGRlZmF1bHQuPC9saT4KKyAqIDxsaT48c3Ryb25nPmlnbm9yZTwvc3Ryb25nPiAtIElmIHNldCB0byAidHJ1ZSIsIGFueSBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAqICAgICBzcGVjaWZpZWQgYnkgdGhlIGNsaWVudCBpcyBpZ25vcmVkLCBhbmQgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZQorICogICAgIDxjb2RlPnNlbGVjdEVuY29kaW5nKCk8L2NvZGU+IG1ldGhvZCBpcyBzZXQuICBJZiBzZXQgdG8gImZhbHNlLAorICogICAgIDxjb2RlPnNlbGVjdEVuY29kaW5nKCk8L2NvZGU+IGlzIGNhbGxlZCA8c3Ryb25nPm9ubHk8L3N0cm9uZz4gaWYgdGhlCisgKiAgICAgY2xpZW50IGhhcyBub3QgYWxyZWFkeSBzcGVjaWZpZWQgYW4gZW5jb2RpbmcuICBCeSBkZWZhdWx0LCB0aGlzCisgKiAgICAgcGFyYW1ldGVyIGlzIHNldCB0byAidHJ1ZSIuPC9saT4KKyAqIDwvdWw+CisgKgorICogPHA+QWx0aG91Z2ggdGhpcyBmaWx0ZXIgY2FuIGJlIHVzZWQgdW5jaGFuZ2VkLCBpdCBpcyBhbHNvIGVhc3kgdG8KKyAqIHN1YmNsYXNzIGl0IGFuZCBtYWtlIHRoZSA8Y29kZT5zZWxlY3RFbmNvZGluZygpPC9jb2RlPiBtZXRob2QgbW9yZQorICogaW50ZWxsaWdlbnQgYWJvdXQgd2hhdCBlbmNvZGluZyB0byBjaG9vc2UsIGJhc2VkIG9uIGNoYXJhY3RlcmlzdGljcyBvZgorICogdGhlIGluY29taW5nIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIHZhbHVlcyBvZiB0aGUgPGNvZGU+QWNjZXB0LUxhbmd1YWdlPC9jb2RlPgorICogYW5kIDxjb2RlPlVzZXItQWdlbnQ8L2NvZGU+IGhlYWRlcnMsIG9yIGEgdmFsdWUgc3Rhc2hlZCBpbiB0aGUgY3VycmVudAorICogdXNlcidzIHNlc3Npb24uPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2V0Q2hhcmFjdGVyRW5jb2RpbmdGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHNldCBmb3IgcmVxdWVzdHMgdGhhdCBwYXNzIHRocm91Z2gKKyAgICAgKiB0aGlzIGZpbHRlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGZpbHRlciBjb25maWd1cmF0aW9uIG9iamVjdCB3ZSBhcmUgYXNzb2NpYXRlZCB3aXRoLiAgSWYgdGhpcyB2YWx1ZQorICAgICAqIGlzIG51bGwsIHRoaXMgZmlsdGVyIGluc3RhbmNlIGlzIG5vdCBjdXJyZW50bHkgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFNob3VsZCBhIGNoYXJhY3RlciBlbmNvZGluZyBzcGVjaWZpZWQgYnkgdGhlIGNsaWVudCBiZSBpZ25vcmVkPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlnbm9yZSA9IHRydWU7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBUYWtlIHRoaXMgZmlsdGVyIG91dCBvZiBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IG51bGw7CisgICAgICAgIHRoaXMuZmlsdGVyQ29uZmlnID0gbnVsbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VsZWN0IGFuZCBzZXQgKGlmIHNwZWNpZmllZCkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSB1c2VkIHRvCisgICAgICogaW50ZXJwcmV0IHJlcXVlc3QgcGFyYW1ldGVycyBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHBhcmFtIGNoYWluIFRoZSBmaWx0ZXIgY2hhaW4gd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlckNoYWluIGNoYWluKQorCXRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ29uZGl0aW9uYWxseSBzZWxlY3QgYW5kIHNldCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIGJlIHVzZWQKKyAgICAgICAgaWYgKGlnbm9yZSB8fCAocmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpID09IG51bGwpKSB7CisgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBzZWxlY3RFbmNvZGluZyhyZXF1ZXN0KTsKKyAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0Q2hhcmFjdGVyRW5jb2RpbmcoZW5jb2RpbmcpOworICAgICAgICB9CisKKwkvLyBQYXNzIGNvbnRyb2wgb24gdG8gdGhlIG5leHQgZmlsdGVyCisgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGxhY2UgdGhpcyBmaWx0ZXIgaW50byBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlckNvbmZpZyBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKwl0aGlzLmZpbHRlckNvbmZpZyA9IGZpbHRlckNvbmZpZzsKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IGZpbHRlckNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJlbmNvZGluZyIpOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBmaWx0ZXJDb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiaWdub3JlIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgdGhpcy5pZ25vcmUgPSB0cnVlOworICAgICAgICBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpCisgICAgICAgICAgICB0aGlzLmlnbm9yZSA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInllcyIpKQorICAgICAgICAgICAgdGhpcy5pZ25vcmUgPSB0cnVlOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aGlzLmlnbm9yZSA9IGZhbHNlOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogU2VsZWN0IGFuIGFwcHJvcHJpYXRlIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSB1c2VkLCBiYXNlZCBvbiB0aGUKKyAgICAgKiBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQvb3IgZmlsdGVyIGluaXRpYWxpemF0aW9uCisgICAgICogcGFyYW1ldGVycy4gIElmIG5vIGNoYXJhY3RlciBlbmNvZGluZyBzaG91bGQgYmUgc2V0LCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1bmNvbmRpdGlvbmFsbHkgcmV0dXJucyB0aGUgdmFsdWUgY29uZmlndXJlZAorICAgICAqIGJ5IHRoZSA8c3Ryb25nPmVuY29kaW5nPC9zdHJvbmc+IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBmb3IgdGhpcworICAgICAqIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlbGVjdEVuY29kaW5nKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZW5jb2RpbmcpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL0Jvb2tCZWFuLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9Cb29rQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmN2I1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9Cb29rQmVhbi5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3BhY2thZ2UganNwMi5leGFtcGxlczsKKworcHVibGljIGNsYXNzIEJvb2tCZWFuIHsKKyAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKKyAgICBwcml2YXRlIFN0cmluZyBhdXRob3I7CisgICAgcHJpdmF0ZSBTdHJpbmcgaXNibjsKKyAgICAKKyAgICBwdWJsaWMgQm9va0JlYW4oIFN0cmluZyB0aXRsZSwgU3RyaW5nIGF1dGhvciwgU3RyaW5nIGlzYm4gKSB7CisgICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKKyAgICAgICAgdGhpcy5hdXRob3IgPSBhdXRob3I7CisgICAgICAgIHRoaXMuaXNibiA9IGlzYm47CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudGl0bGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9yKCkgeworICAgICAgICByZXR1cm4gdGhpcy5hdXRob3I7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXNibigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaXNibjsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9Gb29CZWFuLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9Gb29CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwNTExZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL0Zvb0JlYW4uamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwYWNrYWdlIGpzcDIuZXhhbXBsZXM7CisKK3B1YmxpYyBjbGFzcyBGb29CZWFuIHsKKyAgICBwcml2YXRlIFN0cmluZyBiYXI7CisgICAgCisgICAgcHVibGljIEZvb0JlYW4oKSB7CisgICAgICAgIGJhciA9ICJJbml0aWFsIHZhbHVlIjsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRCYXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJhcjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0QmFyKFN0cmluZyBiYXIpIHsKKyAgICAgICAgdGhpcy5iYXIgPSBiYXI7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvZWwvRnVuY3Rpb25zLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9lbC9GdW5jdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjVjMmZlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvZWwvRnVuY3Rpb25zLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGpzcDIuZXhhbXBsZXMuZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBEZWZpbmVzIHRoZSBmdW5jdGlvbnMgZm9yIHRoZSBqc3AyIGV4YW1wbGUgdGFnIGxpYnJhcnkuCisgKiAKKyAqIDxwPkVhY2ggZnVuY3Rpb24gaXMgZGVmaW5lZCBhcyBhIHN0YXRpYyBtZXRob2QuPC9wPgorICovCitwdWJsaWMgY2xhc3MgRnVuY3Rpb25zIHsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXZlcnNlKCBTdHJpbmcgdGV4dCApIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoIHRleHQgKS5yZXZlcnNlKCkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBudW1Wb3dlbHMoIFN0cmluZyB0ZXh0ICkgeworICAgICAgICBTdHJpbmcgdm93ZWxzID0gImFlaW91QUVJT1UiOworCWludCByZXN1bHQgPSAwOworICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKyApIHsKKwkgICAgaWYoIHZvd2Vscy5pbmRleE9mKCB0ZXh0LmNoYXJBdCggaSApICkgIT0gLTEgKSB7CisJICAgICAgICByZXN1bHQrKzsKKwkgICAgfQorCX0KKwlyZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcHMoIFN0cmluZyB0ZXh0ICkgeworICAgICAgICByZXR1cm4gdGV4dC50b1VwcGVyQ2FzZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZy9FY2hvQXR0cmlidXRlc1RhZy5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvc2ltcGxldGFnL0VjaG9BdHRyaWJ1dGVzVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyZTcxMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZy9FY2hvQXR0cmlidXRlc1RhZy5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3BhY2thZ2UganNwMi5leGFtcGxlcy5zaW1wbGV0YWc7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5TaW1wbGVUYWdTdXBwb3J0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5EeW5hbWljQXR0cmlidXRlczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIFNpbXBsZVRhZyBoYW5kbGVyIHRoYXQgZWNob2VzIGFsbCBpdHMgYXR0cmlidXRlcyAKKyAqLworcHVibGljIGNsYXNzIEVjaG9BdHRyaWJ1dGVzVGFnIAorICAgIGV4dGVuZHMgU2ltcGxlVGFnU3VwcG9ydAorICAgIGltcGxlbWVudHMgRHluYW1pY0F0dHJpYnV0ZXMKK3sKKyAgICBwcml2YXRlIEFycmF5TGlzdCBrZXlzID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgQXJyYXlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIHB1YmxpYyB2b2lkIGRvVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCUpzcFdyaXRlciBvdXQgPSBnZXRKc3BDb250ZXh0KCkuZ2V0T3V0KCk7CisJZm9yKCBpbnQgaSA9IDA7IGkgPCBrZXlzLnNpemUoKTsgaSsrICkgeworCSAgICBTdHJpbmcga2V5ID0gKFN0cmluZylrZXlzLmdldCggaSApOworCSAgICBPYmplY3QgdmFsdWUgPSB2YWx1ZXMuZ2V0KCBpICk7CisJICAgIG91dC5wcmludGxuKCAiPGxpPiIgKyBrZXkgKyAiID0gIiArIHZhbHVlICsgIjwvbGk+IiApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RHluYW1pY0F0dHJpYnV0ZSggU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgCisJT2JqZWN0IHZhbHVlICkgCisJdGhyb3dzIEpzcEV4Y2VwdGlvbgorICAgIHsKKwlrZXlzLmFkZCggbG9jYWxOYW1lICk7CisJdmFsdWVzLmFkZCggdmFsdWUgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9zaW1wbGV0YWcvRmluZEJvb2tTaW1wbGVUYWcuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZy9GaW5kQm9va1NpbXBsZVRhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OGVkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9zaW1wbGV0YWcvRmluZEJvb2tTaW1wbGVUYWcuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwYWNrYWdlIGpzcDIuZXhhbXBsZXMuc2ltcGxldGFnOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5TaW1wbGVUYWdTdXBwb3J0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGpzcDIuZXhhbXBsZXMuQm9va0JlYW47CisKKy8qKgorICogU2ltcGxlVGFnIGhhbmRsZXIgdGhhdCBwcmV0ZW5kcyB0byBzZWFyY2ggZm9yIGEgYm9vaywgYW5kIHN0b3JlcworICogdGhlIHJlc3VsdCBpbiBhIHNjb3BlZCB2YXJpYWJsZS4KKyAqLworcHVibGljIGNsYXNzIEZpbmRCb29rU2ltcGxlVGFnIGV4dGVuZHMgU2ltcGxlVGFnU3VwcG9ydCB7CisgICAgcHJpdmF0ZSBTdHJpbmcgdmFyOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LX1RJVExFID0gIlRoZSBMb3JkIG9mIHRoZSBSaW5ncyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tfQVVUSE9SID0gIkouIFIuIFIuIFRvbGtlaW4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LX0lTQk4gPSAiMDYxODAwMjI1MSI7CisKKyAgICBwdWJsaWMgdm9pZCBkb1RhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworICAgICAgICBCb29rQmVhbiBib29rID0gbmV3IEJvb2tCZWFuKCBCT09LX1RJVExFLCBCT09LX0FVVEhPUiwgQk9PS19JU0JOICk7CisgICAgICAgIGdldEpzcENvbnRleHQoKS5zZXRBdHRyaWJ1dGUoIHRoaXMudmFyLCBib29rICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFyKCBTdHJpbmcgdmFyICkgeworCXRoaXMudmFyID0gdmFyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZy9IZWxsb1dvcmxkU2ltcGxlVGFnLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9zaW1wbGV0YWcvSGVsbG9Xb3JsZFNpbXBsZVRhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZTNhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9zaW1wbGV0YWcvSGVsbG9Xb3JsZFNpbXBsZVRhZy5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3BhY2thZ2UganNwMi5leGFtcGxlcy5zaW1wbGV0YWc7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlNpbXBsZVRhZ1N1cHBvcnQ7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBTaW1wbGVUYWcgaGFuZGxlciB0aGF0IHByaW50cyAiSGVsbG8sIHdvcmxkISIKKyAqLworcHVibGljIGNsYXNzIEhlbGxvV29ybGRTaW1wbGVUYWcgZXh0ZW5kcyBTaW1wbGVUYWdTdXBwb3J0IHsKKyAgICBwdWJsaWMgdm9pZCBkb1RhZygpIHRocm93cyBKc3BFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwlnZXRKc3BDb250ZXh0KCkuZ2V0T3V0KCkud3JpdGUoICJIZWxsbywgd29ybGQhIiApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZy9SZXBlYXRTaW1wbGVUYWcuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZy9SZXBlYXRTaW1wbGVUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmQ2OTUyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvc2ltcGxldGFnL1JlcGVhdFNpbXBsZVRhZy5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3BhY2thZ2UganNwMi5leGFtcGxlcy5zaW1wbGV0YWc7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlNpbXBsZVRhZ1N1cHBvcnQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBTaW1wbGVUYWcgaGFuZGxlciB0aGF0IGFjY2VwdHMgYSBudW0gYXR0cmlidXRlIGFuZCAKKyAqIGludm9rZXMgaXRzIGJvZHkgJ251bScgdGltZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBSZXBlYXRTaW1wbGVUYWcgZXh0ZW5kcyBTaW1wbGVUYWdTdXBwb3J0IHsKKyAgICBwcml2YXRlIGludCBudW07CisKKyAgICBwdWJsaWMgdm9pZCBkb1RhZygpIHRocm93cyBKc3BFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bTsgaSsrKSB7CisgICAgICAgICAgICBnZXRKc3BDb250ZXh0KCkuc2V0QXR0cmlidXRlKCJjb3VudCIsIFN0cmluZy52YWx1ZU9mKCBpICsgMSApICk7CisJICAgIGdldEpzcEJvZHkoKS5pbnZva2UobnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROdW0oaW50IG51bSkgeworCXRoaXMubnVtID0gbnVtOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZy9TaHVmZmxlU2ltcGxlVGFnLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9zaW1wbGV0YWcvU2h1ZmZsZVNpbXBsZVRhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMWMwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9zaW1wbGV0YWcvU2h1ZmZsZVNpbXBsZVRhZy5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3BhY2thZ2UganNwMi5leGFtcGxlcy5zaW1wbGV0YWc7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkpzcEZyYWdtZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5TaW1wbGVUYWdTdXBwb3J0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogU2ltcGxlVGFnIGhhbmRsZXIgdGhhdCBhY2NlcHRzIHRha2VzIHRocmVlIGF0dHJpYnV0ZXMgb2YgdHlwZQorICogSnNwRnJhZ21lbnQgYW5kIGludm9rZXMgdGhlbiBpbiBhIHJhbmRvbSBvcmRlci4KKyAqLworcHVibGljIGNsYXNzIFNodWZmbGVTaW1wbGVUYWcgZXh0ZW5kcyBTaW1wbGVUYWdTdXBwb3J0IHsKKyAgICBwcml2YXRlIEpzcEZyYWdtZW50IGZyYWdtZW50MTsKKyAgICBwcml2YXRlIEpzcEZyYWdtZW50IGZyYWdtZW50MjsKKyAgICBwcml2YXRlIEpzcEZyYWdtZW50IGZyYWdtZW50MzsKKworICAgIHB1YmxpYyB2b2lkIGRvVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBzd2l0Y2goIChpbnQpKE1hdGgucmFuZG9tKCkgKiA2KSApIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBmcmFnbWVudDEuaW52b2tlKCBudWxsICk7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQyLmludm9rZSggbnVsbCApOworICAgICAgICAgICAgICAgIGZyYWdtZW50My5pbnZva2UoIG51bGwgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBmcmFnbWVudDEuaW52b2tlKCBudWxsICk7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQzLmludm9rZSggbnVsbCApOworICAgICAgICAgICAgICAgIGZyYWdtZW50Mi5pbnZva2UoIG51bGwgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBmcmFnbWVudDIuaW52b2tlKCBudWxsICk7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQxLmludm9rZSggbnVsbCApOworICAgICAgICAgICAgICAgIGZyYWdtZW50My5pbnZva2UoIG51bGwgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBmcmFnbWVudDIuaW52b2tlKCBudWxsICk7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQzLmludm9rZSggbnVsbCApOworICAgICAgICAgICAgICAgIGZyYWdtZW50MS5pbnZva2UoIG51bGwgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBmcmFnbWVudDMuaW52b2tlKCBudWxsICk7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQxLmludm9rZSggbnVsbCApOworICAgICAgICAgICAgICAgIGZyYWdtZW50Mi5pbnZva2UoIG51bGwgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICBmcmFnbWVudDMuaW52b2tlKCBudWxsICk7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQyLmludm9rZSggbnVsbCApOworICAgICAgICAgICAgICAgIGZyYWdtZW50MS5pbnZva2UoIG51bGwgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZyYWdtZW50MSggSnNwRnJhZ21lbnQgZnJhZ21lbnQxICkgeworICAgICAgICB0aGlzLmZyYWdtZW50MSA9IGZyYWdtZW50MTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RnJhZ21lbnQyKCBKc3BGcmFnbWVudCBmcmFnbWVudDIgKSB7CisgICAgICAgIHRoaXMuZnJhZ21lbnQyID0gZnJhZ21lbnQyOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRGcmFnbWVudDMoIEpzcEZyYWdtZW50IGZyYWdtZW50MyApIHsKKyAgICAgICAgdGhpcy5mcmFnbWVudDMgPSBmcmFnbWVudDM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvc2ltcGxldGFnL1RpbGVTaW1wbGVUYWcuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZy9UaWxlU2ltcGxlVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU3ZGQzNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZy9UaWxlU2ltcGxlVGFnLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcGFja2FnZSBqc3AyLmV4YW1wbGVzLnNpbXBsZXRhZzsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuU2ltcGxlVGFnU3VwcG9ydDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIERpc3BsYXlzIGEgdGlsZSBhcyBhIHNpbmdsZSBjZWxsIGluIGEgdGFibGUuCisgKi8KK3B1YmxpYyBjbGFzcyBUaWxlU2ltcGxlVGFnIGV4dGVuZHMgU2ltcGxlVGFnU3VwcG9ydCB7CisgICAgcHJpdmF0ZSBTdHJpbmcgY29sb3I7CisgICAgcHJpdmF0ZSBTdHJpbmcgbGFiZWw7CisKKyAgICBwdWJsaWMgdm9pZCBkb1RhZygpIHRocm93cyBKc3BFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwlnZXRKc3BDb250ZXh0KCkuZ2V0T3V0KCkud3JpdGUoIAorCSAgICAiPHRkIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGJnY29sb3I9XCIiICsgdGhpcy5jb2xvciArIAorCSAgICAiXCI+PGZvbnQgY29sb3I9XCIjZmZmZmZmXCI+PGNlbnRlcj4iICsgdGhpcy5sYWJlbCArIAorICAgICAgICAgICAgICAgICI8L2NlbnRlcj48L2ZvbnQ+PC90ZD4iICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29sb3IoIFN0cmluZyBjb2xvciApIHsKKyAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbCggU3RyaW5nIGxhYmVsICkgeworICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2xpc3RlbmVycy9Db250ZXh0TGlzdGVuZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9saXN0ZW5lcnMvQ29udGV4dExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlZWFmMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9saXN0ZW5lcnMvQ29udGV4dExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3BhY2thZ2UgbGlzdGVuZXJzOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRBdHRyaWJ1dGVFdmVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEV2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRMaXN0ZW5lcjsKKworCisvKioKKyAqIEV4YW1wbGUgbGlzdGVuZXIgZm9yIGNvbnRleHQtcmVsYXRlZCBhcHBsaWNhdGlvbiBldmVudHMsIHdoaWNoIHdlcmUKKyAqIGludHJvZHVjZWQgaW4gdGhlIDIuMyB2ZXJzaW9uIG9mIHRoZSBTZXJ2bGV0IEFQSS4gIFRoaXMgbGlzdGVuZXIKKyAqIG1lcmVseSBkb2N1bWVudHMgdGhlIG9jY3VycmVuY2Ugb2Ygc3VjaCBldmVudHMgaW4gdGhlIGFwcGxpY2F0aW9uIGxvZworICogYXNzb2NpYXRlZCB3aXRoIG91ciBzZXJ2bGV0IGNvbnRleHQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb250ZXh0TGlzdGVuZXIKKyAgICBpbXBsZW1lbnRzIFNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXIsIFNlcnZsZXRDb250ZXh0TGlzdGVuZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZsZXQgY29udGV4dCB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgY29udGV4dCA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCBhIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgd2FzIGFkZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlQWRkZWQoU2VydmxldENvbnRleHRBdHRyaWJ1dGVFdmVudCBldmVudCkgeworCisJbG9nKCJhdHRyaWJ1dGVBZGRlZCgnIiArIGV2ZW50LmdldE5hbWUoKSArICInLCAnIiArCisJICAgIGV2ZW50LmdldFZhbHVlKCkgKyAiJykiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgYSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIHdhcyByZW1vdmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlUmVtb3ZlZChTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IGV2ZW50KSB7CisKKwlsb2coImF0dHJpYnV0ZVJlbW92ZWQoJyIgKyBldmVudC5nZXROYW1lKCkgKyAiJywgJyIgKworCSAgICBldmVudC5nZXRWYWx1ZSgpICsgIicpIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IGEgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB3YXMgcmVwbGFjZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZXBsYWNlZChTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IGV2ZW50KSB7CisKKwlsb2coImF0dHJpYnV0ZVJlcGxhY2VkKCciICsgZXZlbnQuZ2V0TmFtZSgpICsgIicsICciICsKKwkgICAgZXZlbnQuZ2V0VmFsdWUoKSArICInKSIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCB0aGlzIHdlYiBhcHBsaWNhdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlcnZsZXQgY29udGV4dCBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbnRleHREZXN0cm95ZWQoU2VydmxldENvbnRleHRFdmVudCBldmVudCkgeworCisJbG9nKCJjb250ZXh0RGVzdHJveWVkKCkiKTsKKwl0aGlzLmNvbnRleHQgPSBudWxsOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCB0aGlzIHdlYiBhcHBsaWNhdGlvbiBoYXMgYmVlbiBpbml0aWFsaXplZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2VydmxldCBjb250ZXh0IGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgY29udGV4dEluaXRpYWxpemVkKFNlcnZsZXRDb250ZXh0RXZlbnQgZXZlbnQpIHsKKworCXRoaXMuY29udGV4dCA9IGV2ZW50LmdldFNlcnZsZXRDb250ZXh0KCk7CisJbG9nKCJjb250ZXh0SW5pdGlhbGl6ZWQoKSIpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogTG9nIGEgbWVzc2FnZSB0byB0aGUgc2VydmxldCBjb250ZXh0IGFwcGxpY2F0aW9uIGxvZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UgdG8gYmUgbG9nZ2VkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgeworCisJaWYgKGNvbnRleHQgIT0gbnVsbCkKKwkgICAgY29udGV4dC5sb2coIkNvbnRleHRMaXN0ZW5lcjogIiArIG1lc3NhZ2UpOworCWVsc2UKKwkgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb250ZXh0TGlzdGVuZXI6ICIgKyBtZXNzYWdlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTG9nIGEgbWVzc2FnZSBhbmQgYXNzb2NpYXRlZCBleGNlcHRpb24gdG8gdGhlIHNlcnZsZXQgY29udGV4dAorICAgICAqIGFwcGxpY2F0aW9uIGxvZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UgdG8gYmUgbG9nZ2VkCisgICAgICogQHBhcmFtIHRocm93YWJsZSBFeGNlcHRpb24gdG8gYmUgbG9nZ2VkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworCisJaWYgKGNvbnRleHQgIT0gbnVsbCkKKwkgICAgY29udGV4dC5sb2coIkNvbnRleHRMaXN0ZW5lcjogIiArIG1lc3NhZ2UsIHRocm93YWJsZSk7CisJZWxzZSB7CisJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29udGV4dExpc3RlbmVyOiAiICsgbWVzc2FnZSk7CisJICAgIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisJfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9saXN0ZW5lcnMvU2Vzc2lvbkxpc3RlbmVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvbGlzdGVuZXJzL1Nlc3Npb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZjE5OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvbGlzdGVuZXJzL1Nlc3Npb25MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTg0IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwYWNrYWdlIGxpc3RlbmVyczsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0RXZlbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dExpc3RlbmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkJpbmRpbmdFdmVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25FdmVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25MaXN0ZW5lcjsKKworCisvKioKKyAqIEV4YW1wbGUgbGlzdGVuZXIgZm9yIGNvbnRleHQtcmVsYXRlZCBhcHBsaWNhdGlvbiBldmVudHMsIHdoaWNoIHdlcmUKKyAqIGludHJvZHVjZWQgaW4gdGhlIDIuMyB2ZXJzaW9uIG9mIHRoZSBTZXJ2bGV0IEFQSS4gIFRoaXMgbGlzdGVuZXIKKyAqIG1lcmVseSBkb2N1bWVudHMgdGhlIG9jY3VycmVuY2Ugb2Ygc3VjaCBldmVudHMgaW4gdGhlIGFwcGxpY2F0aW9uIGxvZworICogYXNzb2NpYXRlZCB3aXRoIG91ciBzZXJ2bGV0IGNvbnRleHQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXNzaW9uTGlzdGVuZXIKKyAgICBpbXBsZW1lbnRzIFNlcnZsZXRDb250ZXh0TGlzdGVuZXIsCisJICAgICAgIEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIsIEh0dHBTZXNzaW9uTGlzdGVuZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZsZXQgY29udGV4dCB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgY29udGV4dCA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCBhIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgd2FzIGFkZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXNzaW9uIGF0dHJpYnV0ZSBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZUFkZGVkKEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50KSB7CisKKwlsb2coImF0dHJpYnV0ZUFkZGVkKCciICsgZXZlbnQuZ2V0U2Vzc2lvbigpLmdldElkKCkgKyAiJywgJyIgKworCSAgICBldmVudC5nZXROYW1lKCkgKyAiJywgJyIgKyBldmVudC5nZXRWYWx1ZSgpICsgIicpIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IGEgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB3YXMgcmVtb3ZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBhdHRyaWJ1dGUgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZW1vdmVkKEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50KSB7CisKKwlsb2coImF0dHJpYnV0ZVJlbW92ZWQoJyIgKyBldmVudC5nZXRTZXNzaW9uKCkuZ2V0SWQoKSArICInLCAnIiArCisJICAgIGV2ZW50LmdldE5hbWUoKSArICInLCAnIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiJykiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgYSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIHdhcyByZXBsYWNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBhdHRyaWJ1dGUgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZXBsYWNlZChIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCkgeworCisJbG9nKCJhdHRyaWJ1dGVSZXBsYWNlZCgnIiArIGV2ZW50LmdldFNlc3Npb24oKS5nZXRJZCgpICsgIicsICciICsKKwkgICAgZXZlbnQuZ2V0TmFtZSgpICsgIicsICciICsgZXZlbnQuZ2V0VmFsdWUoKSArICInKSIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCB0aGlzIHdlYiBhcHBsaWNhdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlcnZsZXQgY29udGV4dCBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbnRleHREZXN0cm95ZWQoU2VydmxldENvbnRleHRFdmVudCBldmVudCkgeworCisJbG9nKCJjb250ZXh0RGVzdHJveWVkKCkiKTsKKwl0aGlzLmNvbnRleHQgPSBudWxsOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCB0aGlzIHdlYiBhcHBsaWNhdGlvbiBoYXMgYmVlbiBpbml0aWFsaXplZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2VydmxldCBjb250ZXh0IGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgY29udGV4dEluaXRpYWxpemVkKFNlcnZsZXRDb250ZXh0RXZlbnQgZXZlbnQpIHsKKworCXRoaXMuY29udGV4dCA9IGV2ZW50LmdldFNlcnZsZXRDb250ZXh0KCk7CisJbG9nKCJjb250ZXh0SW5pdGlhbGl6ZWQoKSIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCBhIHNlc3Npb24gaGFzIGJlZW4gY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlc3Npb25DcmVhdGVkKEh0dHBTZXNzaW9uRXZlbnQgZXZlbnQpIHsKKworCWxvZygic2Vzc2lvbkNyZWF0ZWQoJyIgKyBldmVudC5nZXRTZXNzaW9uKCkuZ2V0SWQoKSArICInKSIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCBhIHNlc3Npb24gaGFzIGJlZW4gZGVzdHJveWVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXNzaW9uIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2Vzc2lvbkRlc3Ryb3llZChIdHRwU2Vzc2lvbkV2ZW50IGV2ZW50KSB7CisKKwlsb2coInNlc3Npb25EZXN0cm95ZWQoJyIgKyBldmVudC5nZXRTZXNzaW9uKCkuZ2V0SWQoKSArICInKSIpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogTG9nIGEgbWVzc2FnZSB0byB0aGUgc2VydmxldCBjb250ZXh0IGFwcGxpY2F0aW9uIGxvZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UgdG8gYmUgbG9nZ2VkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgeworCisJaWYgKGNvbnRleHQgIT0gbnVsbCkKKwkgICAgY29udGV4dC5sb2coIlNlc3Npb25MaXN0ZW5lcjogIiArIG1lc3NhZ2UpOworCWVsc2UKKwkgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXNzaW9uTGlzdGVuZXI6ICIgKyBtZXNzYWdlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTG9nIGEgbWVzc2FnZSBhbmQgYXNzb2NpYXRlZCBleGNlcHRpb24gdG8gdGhlIHNlcnZsZXQgY29udGV4dAorICAgICAqIGFwcGxpY2F0aW9uIGxvZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UgdG8gYmUgbG9nZ2VkCisgICAgICogQHBhcmFtIHRocm93YWJsZSBFeGNlcHRpb24gdG8gYmUgbG9nZ2VkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworCisJaWYgKGNvbnRleHQgIT0gbnVsbCkKKwkgICAgY29udGV4dC5sb2coIlNlc3Npb25MaXN0ZW5lcjogIiArIG1lc3NhZ2UsIHRocm93YWJsZSk7CisJZWxzZSB7CisJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2Vzc2lvbkxpc3RlbmVyOiAiICsgbWVzc2FnZSk7CisJICAgIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisJfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9udW0vTnVtYmVyR3Vlc3NCZWFuLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvbnVtL051bWJlckd1ZXNzQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MDBhZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvbnVtL051bWJlckd1ZXNzQmVhbi5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKgorICogT3JpZ2luYWxseSB3cml0dGVuIGJ5IEphc29uIEh1bnRlciwgaHR0cDovL3d3dy5zZXJ2bGV0cy5jb20uCisgKi8KKworcGFja2FnZSBudW07CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGNsYXNzIE51bWJlckd1ZXNzQmVhbiB7CisKKyAgaW50IGFuc3dlcjsKKyAgYm9vbGVhbiBzdWNjZXNzOworICBTdHJpbmcgaGludDsKKyAgaW50IG51bUd1ZXNzZXM7CisKKyAgcHVibGljIE51bWJlckd1ZXNzQmVhbigpIHsKKyAgICByZXNldCgpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0R3Vlc3MoU3RyaW5nIGd1ZXNzKSB7CisgICAgbnVtR3Vlc3NlcysrOworCisgICAgaW50IGc7CisgICAgdHJ5IHsKKyAgICAgIGcgPSBJbnRlZ2VyLnBhcnNlSW50KGd1ZXNzKTsKKyAgICB9CisgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICBnID0gLTE7CisgICAgfQorCisgICAgaWYgKGcgPT0gYW5zd2VyKSB7CisgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICB9CisgICAgZWxzZSBpZiAoZyA9PSAtMSkgeworICAgICAgaGludCA9ICJhIG51bWJlciBuZXh0IHRpbWUiOworICAgIH0KKyAgICBlbHNlIGlmIChnIDwgYW5zd2VyKSB7CisgICAgICBoaW50ID0gImhpZ2hlciI7CisgICAgfQorICAgIGVsc2UgaWYgKGcgPiBhbnN3ZXIpIHsKKyAgICAgIGhpbnQgPSAibG93ZXIiOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGdldFN1Y2Nlc3MoKSB7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldEhpbnQoKSB7CisgICAgcmV0dXJuICIiICsgaGludDsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0TnVtR3Vlc3NlcygpIHsKKyAgICByZXR1cm4gbnVtR3Vlc3NlczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgIGFuc3dlciA9IE1hdGguYWJzKG5ldyBSYW5kb20oKS5uZXh0SW50KCkgJSAxMDApICsgMTsKKyAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgbnVtR3Vlc3NlcyA9IDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9zZXJ2bGV0VG9Kc3AuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9zZXJ2bGV0VG9Kc3AuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWRmOTI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL3NlcnZsZXRUb0pzcC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworcHVibGljIGNsYXNzIHNlcnZsZXRUb0pzcCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0IChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKworCXRyeSB7CisJICAgIC8vIFNldCB0aGUgYXR0cmlidXRlIGFuZCBGb3J3YXJkIHRvIGhlbGxvLmpzcAorCSAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSAoInNlcnZsZXROYW1lIiwgInNlcnZsZXRUb0pzcCIpOworCSAgICBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL2pzcHRvc2Vydi9oZWxsby5qc3AiKS5mb3J3YXJkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKwl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkgICAgZXgucHJpbnRTdGFja1RyYWNlICgpOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvc2Vzc2lvbnMvRHVtbXlDYXJ0LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvc2Vzc2lvbnMvRHVtbXlDYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhNmRmNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9zZXNzaW9ucy9EdW1teUNhcnQuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2Ugc2Vzc2lvbnM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworcHVibGljIGNsYXNzIER1bW15Q2FydCB7CisgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgU3RyaW5nIHN1Ym1pdCA9IG51bGw7CisgICAgU3RyaW5nIGl0ZW0gPSBudWxsOworICAgIAorICAgIHByaXZhdGUgdm9pZCBhZGRJdGVtKFN0cmluZyBuYW1lKSB7CisJdi5hZGRFbGVtZW50KG5hbWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVJdGVtKFN0cmluZyBuYW1lKSB7CisJdi5yZW1vdmVFbGVtZW50KG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEl0ZW0oU3RyaW5nIG5hbWUpIHsKKwlpdGVtID0gbmFtZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0U3VibWl0KFN0cmluZyBzKSB7CisJc3VibWl0ID0gczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SXRlbXMoKSB7CisJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbdi5zaXplKCldOworCXYuY29weUludG8ocyk7CisJcmV0dXJuIHM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisJLy8gbnVsbCB2YWx1ZSBmb3Igc3VibWl0IC0gdXNlciBoaXQgZW50ZXIgaW5zdGVhZCBvZiBjbGlja2luZyBvbiAKKwkvLyAiYWRkIiBvciAicmVtb3ZlIgorCWlmIChzdWJtaXQgPT0gbnVsbCkgCisJICAgIGFkZEl0ZW0oaXRlbSk7CisKKwlpZiAoc3VibWl0LmVxdWFscygiYWRkIikpCisJICAgIGFkZEl0ZW0oaXRlbSk7CisJZWxzZSBpZiAoc3VibWl0LmVxdWFscygicmVtb3ZlIikpIAorCSAgICByZW1vdmVJdGVtKGl0ZW0pOworCQorCS8vIHJlc2V0IGF0IHRoZSBlbmQgb2YgdGhlIHJlcXVlc3QKKwlyZXNldCgpOworICAgIH0KKworICAgIC8vIHJlc2V0CisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0KCkgeworCXN1Ym1pdCA9IG51bGw7CisJaXRlbSA9IG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL3V0aWwvSFRNTEZpbHRlci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL3V0aWwvSFRNTEZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MzhmMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvdXRpbC9IVE1MRmlsdGVyLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgdXRpbDsKKworLyoqCisgKiBIVE1MIGZpbHRlciB1dGlsaXR5LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBUaW0gVHllCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBIVE1MRmlsdGVyIHsKKworCisgICAgLyoqCisgICAgICogRmlsdGVyIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBzdHJpbmcgZm9yIGNoYXJhY3RlcnMgdGhhdCBhcmUgc2Vuc2l0aXZlCisgICAgICogaW4gSFRNTC4gIFRoaXMgYXZvaWRzIHBvdGVudGlhbCBhdHRhY2tzIGNhdXNlZCBieSBpbmNsdWRpbmcgSmF2YVNjcmlwdAorICAgICAqIGNvZGVzIGluIHRoZSByZXF1ZXN0IFVSTCB0aGF0IGlzIG9mdGVuIHJlcG9ydGVkIGluIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugc3RyaW5nIHRvIGJlIGZpbHRlcmVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyKFN0cmluZyBtZXNzYWdlKSB7CisKKyAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgY2hhciBjb250ZW50W10gPSBuZXcgY2hhclttZXNzYWdlLmxlbmd0aCgpXTsKKyAgICAgICAgbWVzc2FnZS5nZXRDaGFycygwLCBtZXNzYWdlLmxlbmd0aCgpLCBjb250ZW50LCAwKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoY29udGVudC5sZW5ndGggKyA1MCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChjb250ZW50W2ldKSB7CisgICAgICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImbHQ7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImZ3Q7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcmJzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImYW1wOyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiJnF1b3Q7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoY29udGVudFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChyZXN1bHQudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvdmFsaWRhdG9ycy9EZWJ1Z1ZhbGlkYXRvci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL3ZhbGlkYXRvcnMvRGVidWdWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzU3YzY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL3ZhbGlkYXRvcnMvRGVidWdWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwYWNrYWdlIHZhbGlkYXRvcnM7CisKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuUGFnZURhdGE7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0xpYnJhcnlWYWxpZGF0b3I7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlZhbGlkYXRpb25NZXNzYWdlOworCisKKy8qKgorICogRXhhbXBsZSB0YWcgbGlicmFyeSB2YWxpZGF0b3IgdGhhdCBzaW1wbHkgZHVtcHMgdGhlIFhNTCB2ZXJzaW9uIG9mIGVhY2gKKyAqIHBhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0ICh3aGljaCB3aWxsIHR5cGljYWxseSBiZSBzZW50IHRvIHRoZSBmaWxlCisgKiA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9sb2dzL2NhdGFsaW5hLm91dDwvY29kZT4pLiAgVG8gdXRpbGl6ZSBpdCwgc2ltcGx5CisgKiBpbmNsdWRlIGEgPGNvZGU+dGFnbGliPC9jb2RlPiBkaXJlY3RpdmUgZm9yIHRoaXMgdGFnIGxpYnJhcnkgYXQgdGhlIHRvcAorICogb2YgeW91ciBKU1AgcGFnZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlYnVnVmFsaWRhdG9yIGV4dGVuZHMgVGFnTGlicmFyeVZhbGlkYXRvciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgYSBKU1AgcGFnZS4gIFRoaXMgd2lsbCBnZXQgaW52b2tlZCBvbmNlIHBlciBkaXJlY3RpdmUgaW4gdGhlCisgICAgICogSlNQIHBhZ2UuICBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcGFnZSBpcworICAgICAqIHZhbGlkOyBvdGhlcndpc2UgdGhlIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mCisgICAgICogPGNvZGU+VmFsaWRhdGlvbk1lc3NhZ2U8L2NvZGU+IG9iamVjdHMuICBBbiBhcnJheSBvZiBsZW5ndGggemVybyBpcworICAgICAqIGFsc28gaW50ZXJwcmV0ZWQgYXMgbm8gZXJyb3JzLgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBUaGUgdmFsdWUgb2YgdGhlIHByZWZpeCBhcmd1bWVudCBpbiB0aGlzIGRpcmVjdGl2ZQorICAgICAqIEBwYXJhbSB1cmkgVGhlIHZhbHVlIG9mIHRoZSBVUkkgYXJndW1lbnQgaW4gdGhpcyBkaXJlY3RpdmUKKyAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSBkYXRhIGZvciB0aGlzIHBhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VbXSB2YWxpZGF0ZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VEYXRhIHBhZ2UpIHsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0gUHJlZml4PSIgKyBwcmVmaXggKyAiIFVSST0iICsgdXJpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0tLS0tIik7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBwYWdlLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludCBjaCA9IGlzLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPCAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KChjaGFyKSBjaCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2pzcC9hcHBsZXQvQ2xvY2syLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2pzcC9hcHBsZXQvQ2xvY2syLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4NjUyMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvanNwL2FwcGxldC9DbG9jazIuamF2YQpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqYXZhLmFwcGxldC4qOworaW1wb3J0IGphdmEudGV4dC4qOworCisvKioKKyAqIFRpbWUhCisgKgorICogQGF1dGhvciBSYWNoZWwgR29sbHViCisgKi8KKworcHVibGljIGNsYXNzIENsb2NrMiBleHRlbmRzIEFwcGxldCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICBUaHJlYWQgdGltZXI7ICAgICAgICAgICAgICAgIC8vIFRoZSB0aHJlYWQgdGhhdCBkaXNwbGF5cyBjbG9jaworICAgIGludCBsYXN0eHMsIGxhc3R5cywgbGFzdHhtLAorICAgICAgICBsYXN0eW0sIGxhc3R4aCwgbGFzdHloOyAgLy8gRGltZW5zaW9ucyB1c2VkIHRvIGRyYXcgaGFuZHMgCisgICAgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXR0ZXI7ICAvLyBGb3JtYXRzIHRoZSBkYXRlIGRpc3BsYXllZAorICAgIFN0cmluZyBsYXN0ZGF0ZTsgICAgICAgICAgICAgLy8gU3RyaW5nIHRvIGhvbGQgZGF0ZSBkaXNwbGF5ZWQKKyAgICBGb250IGNsb2NrRmFjZUZvbnQ7ICAgICAgICAgIC8vIEZvbnQgZm9yIG51bWJlciBkaXNwbGF5IG9uIGNsb2NrCisgICAgRGF0ZSBjdXJyZW50RGF0ZTsgICAgICAgICAgICAvLyBVc2VkIHRvIGdldCBkYXRlIHRvIGRpc3BsYXkKKyAgICBDb2xvciBoYW5kQ29sb3I7ICAgICAgICAgICAgIC8vIENvbG9yIG9mIG1haW4gaGFuZHMgYW5kIGRpYWwKKyAgICBDb2xvciBudW1iZXJDb2xvcjsgICAgICAgICAgIC8vIENvbG9yIG9mIHNlY29uZCBoYW5kIGFuZCBudW1iZXJzCisKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgICAgICBpbnQgeCx5OworICAgICAgICBsYXN0eHMgPSBsYXN0eXMgPSBsYXN0eG0gPSBsYXN0eW0gPSBsYXN0eGggPSBsYXN0eWggPSAwOworICAgICAgICBmb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCAoIkVFRSBNTU0gZGQgaGg6bW06c3MgeXl5eSIsIExvY2FsZS5nZXREZWZhdWx0KCkpOworICAgICAgICBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7CisgICAgICAgIGxhc3RkYXRlID0gZm9ybWF0dGVyLmZvcm1hdChjdXJyZW50RGF0ZSk7CisgICAgICAgIGNsb2NrRmFjZUZvbnQgPSBuZXcgRm9udCgiU2VyaWYiLCBGb250LlBMQUlOLCAxNCk7CisgICAgICAgIGhhbmRDb2xvciA9IENvbG9yLmJsdWU7CisgICAgICAgIG51bWJlckNvbG9yID0gQ29sb3IuZGFya0dyYXk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNldEJhY2tncm91bmQobmV3IENvbG9yKEludGVnZXIucGFyc2VJbnQoZ2V0UGFyYW1ldGVyKCJiZ2NvbG9yIiksMTYpKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBFKSB7IH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGhhbmRDb2xvciA9IG5ldyBDb2xvcihJbnRlZ2VyLnBhcnNlSW50KGdldFBhcmFtZXRlcigiZmdjb2xvcjEiKSwxNikpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gRSkgeyB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBudW1iZXJDb2xvciA9IG5ldyBDb2xvcihJbnRlZ2VyLnBhcnNlSW50KGdldFBhcmFtZXRlcigiZmdjb2xvcjIiKSwxNikpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gRSkgeyB9CisgICAgICAgIHJlc2l6ZSgzMDAsMzAwKTsgICAgICAgICAgICAgIC8vIFNldCBjbG9jayB3aW5kb3cgc2l6ZQorICAgIH0KKworICAgIC8vIFBsb3Rwb2ludHMgYWxsb3dzIGNhbGN1bGF0aW9uIHRvIG9ubHkgY292ZXIgNDUgZGVncmVlcyBvZiB0aGUgY2lyY2xlLAorICAgIC8vIGFuZCB0aGVuIG1pcnJvcgorICAgIHB1YmxpYyB2b2lkIHBsb3Rwb2ludHMoaW50IHgwLCBpbnQgeTAsIGludCB4LCBpbnQgeSwgR3JhcGhpY3MgZykgeworICAgICAgICBnLmRyYXdMaW5lKHgwK3gseTAreSx4MCt4LHkwK3kpOworICAgICAgICBnLmRyYXdMaW5lKHgwK3kseTAreCx4MCt5LHkwK3gpOworICAgICAgICBnLmRyYXdMaW5lKHgwK3kseTAteCx4MCt5LHkwLXgpOworICAgICAgICBnLmRyYXdMaW5lKHgwK3gseTAteSx4MCt4LHkwLXkpOworICAgICAgICBnLmRyYXdMaW5lKHgwLXgseTAteSx4MC14LHkwLXkpOworICAgICAgICBnLmRyYXdMaW5lKHgwLXkseTAteCx4MC15LHkwLXgpOworICAgICAgICBnLmRyYXdMaW5lKHgwLXkseTAreCx4MC15LHkwK3gpOworICAgICAgICBnLmRyYXdMaW5lKHgwLXgseTAreSx4MC14LHkwK3kpOworICAgIH0KKworICAgIC8vIENpcmNsZSBpcyBqdXN0IEJyZXNlbmhhbSdzIGFsZ29yaXRobSBmb3IgYSBzY2FuIGNvbnZlcnRlZCBjaXJjbGUKKyAgICBwdWJsaWMgdm9pZCBjaXJjbGUoaW50IHgwLCBpbnQgeTAsIGludCByLCBHcmFwaGljcyBnKSB7CisgICAgICAgIGludCB4LHk7CisgICAgICAgIGZsb2F0IGQ7CisgICAgICAgIHg9MDsKKyAgICAgICAgeT1yOworICAgICAgICBkPTUvNC1yOworICAgICAgICBwbG90cG9pbnRzKHgwLHkwLHgseSxnKTsKKworICAgICAgICB3aGlsZSAoeT54KXsKKyAgICAgICAgICAgIGlmIChkPDApIHsKKyAgICAgICAgICAgICAgICBkPWQrMip4KzM7CisgICAgICAgICAgICAgICAgeCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZD1kKzIqKHgteSkrNTsKKyAgICAgICAgICAgICAgICB4Kys7CisgICAgICAgICAgICAgICAgeS0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGxvdHBvaW50cyh4MCx5MCx4LHksZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQYWludCBpcyB0aGUgbWFpbiBwYXJ0IG9mIHRoZSBwcm9ncmFtCisgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykgeworICAgICAgICBpbnQgeGgsIHloLCB4bSwgeW0sIHhzLCB5cywgcyA9IDAsIG0gPSAxMCwgaCA9IDEwLCB4Y2VudGVyLCB5Y2VudGVyOworICAgICAgICBTdHJpbmcgdG9kYXk7CisKKyAgICAgICAgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpOworICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJzIixMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMgPSBJbnRlZ2VyLnBhcnNlSW50KGZvcm1hdHRlci5mb3JtYXQoY3VycmVudERhdGUpKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG4pIHsKKyAgICAgICAgICAgIHMgPSAwOworICAgICAgICB9CisgICAgICAgIGZvcm1hdHRlci5hcHBseVBhdHRlcm4oIm0iKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG0gPSBJbnRlZ2VyLnBhcnNlSW50KGZvcm1hdHRlci5mb3JtYXQoY3VycmVudERhdGUpKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG4pIHsKKyAgICAgICAgICAgIG0gPSAxMDsKKyAgICAgICAgfSAgICAKKyAgICAgICAgZm9ybWF0dGVyLmFwcGx5UGF0dGVybigiaCIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaCA9IEludGVnZXIucGFyc2VJbnQoZm9ybWF0dGVyLmZvcm1hdChjdXJyZW50RGF0ZSkpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbikgeworICAgICAgICAgICAgaCA9IDEwOworICAgICAgICB9CisgICAgICAgIGZvcm1hdHRlci5hcHBseVBhdHRlcm4oIkVFRSBNTU0gZGQgSEg6bW06c3MgeXl5eSIpOworICAgICAgICB0b2RheSA9IGZvcm1hdHRlci5mb3JtYXQoY3VycmVudERhdGUpOworICAgICAgICB4Y2VudGVyPTgwOworICAgICAgICB5Y2VudGVyPTU1OworICAgIAorICAgIC8vIGE9IHMqIHBpLzIgLSBwaS8yICh0byBzd2l0Y2ggMCwwIGZyb20gMzowMCB0byAxMjowMCkKKyAgICAvLyB4ID0gcihjb3MgYSkgKyB4Y2VudGVyLCB5ID0gcihzaW4gYSkgKyB5Y2VudGVyCisgICAgCisgICAgICAgIHhzID0gKGludCkoTWF0aC5jb3MocyAqIDMuMTRmLzMwIC0gMy4xNGYvMikgKiA0NSArIHhjZW50ZXIpOworICAgICAgICB5cyA9IChpbnQpKE1hdGguc2luKHMgKiAzLjE0Zi8zMCAtIDMuMTRmLzIpICogNDUgKyB5Y2VudGVyKTsKKyAgICAgICAgeG0gPSAoaW50KShNYXRoLmNvcyhtICogMy4xNGYvMzAgLSAzLjE0Zi8yKSAqIDQwICsgeGNlbnRlcik7CisgICAgICAgIHltID0gKGludCkoTWF0aC5zaW4obSAqIDMuMTRmLzMwIC0gMy4xNGYvMikgKiA0MCArIHljZW50ZXIpOworICAgICAgICB4aCA9IChpbnQpKE1hdGguY29zKChoKjMwICsgbS8yKSAqIDMuMTRmLzE4MCAtIDMuMTRmLzIpICogMzAgKyB4Y2VudGVyKTsKKyAgICAgICAgeWggPSAoaW50KShNYXRoLnNpbigoaCozMCArIG0vMikgKiAzLjE0Zi8xODAgLSAzLjE0Zi8yKSAqIDMwICsgeWNlbnRlcik7CisgICAgCisgICAgLy8gRHJhdyB0aGUgY2lyY2xlIGFuZCBudW1iZXJzCisgICAgCisgICAgICAgIGcuc2V0Rm9udChjbG9ja0ZhY2VGb250KTsKKyAgICAgICAgZy5zZXRDb2xvcihoYW5kQ29sb3IpOworICAgICAgICBjaXJjbGUoeGNlbnRlcix5Y2VudGVyLDUwLGcpOworICAgICAgICBnLnNldENvbG9yKG51bWJlckNvbG9yKTsKKyAgICAgICAgZy5kcmF3U3RyaW5nKCI5Iix4Y2VudGVyLTQ1LHljZW50ZXIrMyk7IAorICAgICAgICBnLmRyYXdTdHJpbmcoIjMiLHhjZW50ZXIrNDAseWNlbnRlciszKTsKKyAgICAgICAgZy5kcmF3U3RyaW5nKCIxMiIseGNlbnRlci01LHljZW50ZXItMzcpOworICAgICAgICBnLmRyYXdTdHJpbmcoIjYiLHhjZW50ZXItMyx5Y2VudGVyKzQ1KTsKKworICAgIC8vIEVyYXNlIGlmIG5lY2Vzc2FyeSwgYW5kIHJlZHJhdworICAgIAorICAgICAgICBnLnNldENvbG9yKGdldEJhY2tncm91bmQoKSk7CisgICAgICAgIGlmICh4cyAhPSBsYXN0eHMgfHwgeXMgIT0gbGFzdHlzKSB7CisgICAgICAgICAgICBnLmRyYXdMaW5lKHhjZW50ZXIsIHljZW50ZXIsIGxhc3R4cywgbGFzdHlzKTsKKyAgICAgICAgICAgIGcuZHJhd1N0cmluZyhsYXN0ZGF0ZSwgNSwgMTI1KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeG0gIT0gbGFzdHhtIHx8IHltICE9IGxhc3R5bSkgeworICAgICAgICAgICAgZy5kcmF3TGluZSh4Y2VudGVyLCB5Y2VudGVyLTEsIGxhc3R4bSwgbGFzdHltKTsKKyAgICAgICAgICAgIGcuZHJhd0xpbmUoeGNlbnRlci0xLCB5Y2VudGVyLCBsYXN0eG0sIGxhc3R5bSk7IH0KKyAgICAgICAgaWYgKHhoICE9IGxhc3R4aCB8fCB5aCAhPSBsYXN0eWgpIHsKKyAgICAgICAgICAgIGcuZHJhd0xpbmUoeGNlbnRlciwgeWNlbnRlci0xLCBsYXN0eGgsIGxhc3R5aCk7CisgICAgICAgICAgICBnLmRyYXdMaW5lKHhjZW50ZXItMSwgeWNlbnRlciwgbGFzdHhoLCBsYXN0eWgpOyB9CisgICAgICAgIGcuc2V0Q29sb3IobnVtYmVyQ29sb3IpOworICAgICAgICBnLmRyYXdTdHJpbmcoIiIsIDUsIDEyNSk7CisgICAgICAgIGcuZHJhd1N0cmluZyh0b2RheSwgNSwgMTI1KTsgICAgCisgICAgICAgIGcuZHJhd0xpbmUoeGNlbnRlciwgeWNlbnRlciwgeHMsIHlzKTsKKyAgICAgICAgZy5zZXRDb2xvcihoYW5kQ29sb3IpOworICAgICAgICBnLmRyYXdMaW5lKHhjZW50ZXIsIHljZW50ZXItMSwgeG0sIHltKTsKKyAgICAgICAgZy5kcmF3TGluZSh4Y2VudGVyLTEsIHljZW50ZXIsIHhtLCB5bSk7CisgICAgICAgIGcuZHJhd0xpbmUoeGNlbnRlciwgeWNlbnRlci0xLCB4aCwgeWgpOworICAgICAgICBnLmRyYXdMaW5lKHhjZW50ZXItMSwgeWNlbnRlciwgeGgsIHloKTsKKyAgICAgICAgbGFzdHhzPXhzOyBsYXN0eXM9eXM7CisgICAgICAgIGxhc3R4bT14bTsgbGFzdHltPXltOworICAgICAgICBsYXN0eGg9eGg7IGxhc3R5aD15aDsKKyAgICAgICAgbGFzdGRhdGUgPSB0b2RheTsKKyAgICAgICAgY3VycmVudERhdGU9bnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgdGltZXIgPSBuZXcgVGhyZWFkKHRoaXMpOworICAgICAgICB0aW1lci5zdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHRpbWVyID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIFRocmVhZCBtZSA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgIHdoaWxlICh0aW1lciA9PSBtZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNsZWVwKDEwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBhaW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoR3JhcGhpY3MgZykgeworICAgICAgICBwYWludChnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFwcGxldEluZm8oKSB7CisgICAgICAgIHJldHVybiAiVGl0bGU6IEEgQ2xvY2sgXG5BdXRob3I6IFJhY2hlbCBHb2xsdWIsIDE5OTUgXG5BbiBhbmFsb2cgY2xvY2suIjsKKyAgICB9CisgIAorICAgIHB1YmxpYyBTdHJpbmdbXVtdIGdldFBhcmFtZXRlckluZm8oKSB7CisgICAgICAgIFN0cmluZ1tdW10gaW5mbyA9IHsKKyAgICAgICAgICAgIHsiYmdjb2xvciIsICJoZXhhZGVjaW1hbCBSR0IgbnVtYmVyIiwgIlRoZSBiYWNrZ3JvdW5kIGNvbG9yLiBEZWZhdWx0IGlzIHRoZSBjb2xvciBvZiB5b3VyIGJyb3dzZXIuIn0sCisgICAgICAgICAgICB7ImZnY29sb3IxIiwgImhleGFkZWNpbWFsIFJHQiBudW1iZXIiLCAiVGhlIGNvbG9yIG9mIHRoZSBoYW5kcyBhbmQgZGlhbC4gRGVmYXVsdCBpcyBibHVlLiJ9LAorICAgICAgICAgICAgeyJmZ2NvbG9yMiIsICJoZXhhZGVjaW1hbCBSR0IgbnVtYmVyIiwgIlRoZSBjb2xvciBvZiB0aGUgc2Vjb25kcyBoYW5kIGFuZCBudW1iZXJzLiBEZWZhdWx0IGlzIGRhcmsgZ3JheS4ifQorICAgICAgICB9OworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2pzcC9kZWJ1Zy10YWdsaWIudGxkIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9qc3AvZGVidWctdGFnbGliLnRsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWY3ZjkyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9qc3AvZGVidWctdGFnbGliLnRsZApAQCAtMCwwICsxLDU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgdGFnbGliCisgICAgICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIgorCSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiPgorCis8IS0tIGEgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciAtLT4KKworPHRhZ2xpYj4KKyAgPHRsaWItdmVyc2lvbj4xLjA8L3RsaWItdmVyc2lvbj4KKyAgPGpzcC12ZXJzaW9uPjEuMjwvanNwLXZlcnNpb24+CisgIDxzaG9ydC1uYW1lPmRlYnVnPC9zaG9ydC1uYW1lPgorICA8dXJpPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0L2RlYnVnLXRhZ2xpYjwvdXJpPgorICA8ZGVzY3JpcHRpb24+CisgICAgVGhpcyB0YWcgbGlicmFyeSBkZWZpbmVzIG5vIHRhZ3MuICBJbnN0ZWFkLCBpdHMgcHVycG9zZSBpcyBlbmNhcHN1bGF0ZWQKKyAgICBpbiB0aGUgVGFnTGlicmFyeVZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbiB0aGF0IHNpbXBseSBvdXRwdXRzIHRoZSBYTUwKKyAgICB2ZXJzaW9uIG9mIGEgSlNQIHBhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0LCB3aGVuZXZlciB0aGlzIHRhZyBsaWJyYXJ5IGlzCisgICAgcmVmZXJlbmNlZCBpbiBhICJ0YWdsaWIiIGRpcmVjdGl2ZSBpbiBhIEpTUCBwYWdlLgorICA8L2Rlc2NyaXB0aW9uPgorICA8dmFsaWRhdG9yPgorICAgIDx2YWxpZGF0b3ItY2xhc3M+dmFsaWRhdG9ycy5EZWJ1Z1ZhbGlkYXRvcjwvdmFsaWRhdG9yLWNsYXNzPgorICA8L3ZhbGlkYXRvcj4KKworICA8IS0tIFRoaXMgaXMgYSBkdW1teSB0YWcgc29sZWx5IHRvIHNhdGlzZnkgRFREIHJlcXVpcmVtZW50cyAtLT4gIAorICA8dGFnPgorICAgIDxuYW1lPmxvZzwvbmFtZT4KKyAgICA8dGFnLWNsYXNzPmV4YW1wbGVzLkxvZ1RhZzwvdGFnLWNsYXNzPgorICAgIDxib2R5LWNvbnRlbnQ+VEFHREVQRU5ERU5UPC9ib2R5LWNvbnRlbnQ+CisgICAgPGRlc2NyaXB0aW9uPgorCVBlcmZvcm0gYSBzZXJ2ZXIgc2lkZSBhY3Rpb247IExvZyB0aGUgbWVzc2FnZS4KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDxhdHRyaWJ1dGU+CisJPG5hbWU+dG9Ccm93c2VyPC9uYW1lPgorCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgPC9hdHRyaWJ1dGU+CisgIDwvdGFnPgorICAKKworPC90YWdsaWI+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2pzcC9leGFtcGxlLXRhZ2xpYi50bGQgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2pzcC9leGFtcGxlLXRhZ2xpYi50bGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZiYjU5MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvanNwL2V4YW1wbGUtdGFnbGliLnRsZApAQCAtMCwwICsxLDgzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgdGFnbGliCisgICAgICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIgorCSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiPgorCis8dGFnbGliPgorCisgIDx0bGliLXZlcnNpb24+MS4wPC90bGliLXZlcnNpb24+CisgIDxqc3AtdmVyc2lvbj4xLjI8L2pzcC12ZXJzaW9uPgorICA8c2hvcnQtbmFtZT5zaW1wbGU8L3Nob3J0LW5hbWU+CisgIDx1cmk+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvZXhhbXBsZS10YWdsaWI8L3VyaT4KKyAgPGRlc2NyaXB0aW9uPgorCUEgc2ltcGxlIHRhYiBsaWJyYXJ5IGZvciB0aGUgZXhhbXBsZXMKKyAgPC9kZXNjcmlwdGlvbj4KKworICA8dGFnPgorICAgIDxuYW1lPlNob3dTb3VyY2U8L25hbWU+CisgICAgPHRhZy1jbGFzcz5leGFtcGxlcy5TaG93U291cmNlPC90YWctY2xhc3M+CisgICAgPGRlc2NyaXB0aW9uPiBEaXNwbGF5IEpTUCBzb3VyY2VzIDwvZGVzY3JpcHRpb24+CisgICAgPGF0dHJpYnV0ZT4KKyAgICAgICA8bmFtZT5qc3BGaWxlPC9uYW1lPgorICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KKyAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgPC9hdHRyaWJ1dGU+CisgIDwvdGFnPiAgICAgICAKKworICA8IS0tIEEgc2ltcGxlIFRhZyAtLT4KKyAgPCEtLSBmb28gdGFnIC0tPgorICA8dGFnPgorICAgIDxuYW1lPmZvbzwvbmFtZT4KKyAgICA8dGFnLWNsYXNzPmV4YW1wbGVzLkZvb1RhZzwvdGFnLWNsYXNzPgorICAgIDx0ZWktY2xhc3M+ZXhhbXBsZXMuRm9vVGFnRXh0cmFJbmZvPC90ZWktY2xhc3M+CisgICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KKyAgICA8ZGVzY3JpcHRpb24+CisJUGVyZm9ybSBhIHNlcnZlciBzaWRlIGFjdGlvbjsgdXNlcyAzIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5hdHQxPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgorICAgIDwvYXR0cmlidXRlPgorICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5hdHQyPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgorICAgIDwvYXR0cmlidXRlPgorICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5hdHQzPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgorICAgIDwvYXR0cmlidXRlPgorICA8L3RhZz4KKworICA8IS0tIEFub3RoZXIgc2ltcGxlIHRhZyAtLT4KKyAgPCEtLSBsb2cgdGFnIC0tPgorICA8dGFnPgorICAgIDxuYW1lPmxvZzwvbmFtZT4KKyAgICA8dGFnLWNsYXNzPmV4YW1wbGVzLkxvZ1RhZzwvdGFnLWNsYXNzPgorICAgIDxib2R5LWNvbnRlbnQ+VEFHREVQRU5ERU5UPC9ib2R5LWNvbnRlbnQ+CisgICAgPGRlc2NyaXB0aW9uPgorCVBlcmZvcm0gYSBzZXJ2ZXIgc2lkZSBhY3Rpb247IExvZyB0aGUgbWVzc2FnZS4KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDxhdHRyaWJ1dGU+CisJPG5hbWU+dG9Ccm93c2VyPC9uYW1lPgorCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgPC9hdHRyaWJ1dGU+CisgIDwvdGFnPgorICAKKzwvdGFnbGliPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9qc3AyL2pzcDItZXhhbXBsZS10YWdsaWIudGxkIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9qc3AyL2pzcDItZXhhbXBsZS10YWdsaWIudGxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZTBiM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2pzcDIvanNwMi1leGFtcGxlLXRhZ2xpYi50bGQKQEAgLTAsMCArMSwxMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzx0YWdsaWIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkIgorICAgIHZlcnNpb249IjIuMCI+CisgICAgPGRlc2NyaXB0aW9uPkEgdGFnIGxpYnJhcnkgZXhlcmNpc2luZyBTaW1wbGVUYWcgaGFuZGxlcnMuPC9kZXNjcmlwdGlvbj4KKyAgICA8dGxpYi12ZXJzaW9uPjEuMDwvdGxpYi12ZXJzaW9uPgorICAgIDxzaG9ydC1uYW1lPlNpbXBsZVRhZ0xpYnJhcnk8L3Nob3J0LW5hbWU+CisgICAgPHVyaT4vU2ltcGxlVGFnTGlicmFyeTwvdXJpPgorICAgIDx0YWc+CisJPGRlc2NyaXB0aW9uPk91dHB1dHMgSGVsbG8sIFdvcmxkPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPG5hbWU+aGVsbG9Xb3JsZDwvbmFtZT4KKwk8dGFnLWNsYXNzPmpzcDIuZXhhbXBsZXMuc2ltcGxldGFnLkhlbGxvV29ybGRTaW1wbGVUYWc8L3RhZy1jbGFzcz4KKwk8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+CisgICAgPC90YWc+CisgICAgPHRhZz4KKyAgICAgICAgPGRlc2NyaXB0aW9uPlJlcGVhdHMgdGhlIGJvZHkgb2YgdGhlIHRhZyAnbnVtJyB0aW1lczwvZGVzY3JpcHRpb24+CisgICAgICAgIDxuYW1lPnJlcGVhdDwvbmFtZT4KKyAgICAgICAgPHRhZy1jbGFzcz5qc3AyLmV4YW1wbGVzLnNpbXBsZXRhZy5SZXBlYXRTaW1wbGVUYWc8L3RhZy1jbGFzcz4KKyAgICAgICAgPGJvZHktY29udGVudD5zY3JpcHRsZXNzPC9ib2R5LWNvbnRlbnQ+CisgICAgICAgIDx2YXJpYWJsZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5DdXJyZW50IGludm9jYXRpb24gY291bnQgKDEgdG8gbnVtKTwvZGVzY3JpcHRpb24+CisgICAgICAgICAgICA8bmFtZS1naXZlbj5jb3VudDwvbmFtZS1naXZlbj4KKyAgICAgICAgPC92YXJpYWJsZT4KKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPm51bTwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC90YWc+CisgICAgPHRhZz4KKwk8ZGVzY3JpcHRpb24+UG9wdWxhdGVzIHRoZSBwYWdlIGNvbnRleHQgd2l0aCBhIEJvb2tCZWFuPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPG5hbWU+ZmluZEJvb2s8L25hbWU+CisJPHRhZy1jbGFzcz5qc3AyLmV4YW1wbGVzLnNpbXBsZXRhZy5GaW5kQm9va1NpbXBsZVRhZzwvdGFnLWNsYXNzPgorCTxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4KKwk8YXR0cmlidXRlPgorCSAgICA8bmFtZT52YXI8L25hbWU+CisJICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KKwkgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorCTwvYXR0cmlidXRlPgorICAgIDwvdGFnPgorICAgIDx0YWc+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgIFRha2VzIDMgZnJhZ21lbnRzIGFuZCBpbnZva2VzIHRoZW0gaW4gYSByYW5kb20gb3JkZXIKKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPG5hbWU+c2h1ZmZsZTwvbmFtZT4KKyAgICAgICAgPHRhZy1jbGFzcz5qc3AyLmV4YW1wbGVzLnNpbXBsZXRhZy5TaHVmZmxlU2ltcGxlVGFnPC90YWctY2xhc3M+CisgICAgICAgIDxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4KKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmZyYWdtZW50MTwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KKwkgICAgPGZyYWdtZW50PnRydWU8L2ZyYWdtZW50PgorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmZyYWdtZW50MjwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KKwkgICAgPGZyYWdtZW50PnRydWU8L2ZyYWdtZW50PgorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmZyYWdtZW50MzwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KKwkgICAgPGZyYWdtZW50PnRydWU8L2ZyYWdtZW50PgorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L3RhZz4KKyAgICA8dGFnPgorICAgICAgICA8ZGVzY3JpcHRpb24+T3V0cHV0cyBhIGNvbG9yZWQgdGlsZTwvZGVzY3JpcHRpb24+CisgICAgICAgIDxuYW1lPnRpbGU8L25hbWU+CisgICAgICAgIDx0YWctY2xhc3M+anNwMi5leGFtcGxlcy5zaW1wbGV0YWcuVGlsZVNpbXBsZVRhZzwvdGFnLWNsYXNzPgorICAgICAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+CisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5jb2xvcjwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5sYWJlbDwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC90YWc+CisgICAgPHRhZz4KKwk8ZGVzY3JpcHRpb24+CisJICBUYWcgdGhhdCBlY2hvZXMgYWxsIGl0cyBhdHRyaWJ1dGVzIGFuZCBib2R5IGNvbnRlbnQKKwk8L2Rlc2NyaXB0aW9uPgorCTxuYW1lPmVjaG9BdHRyaWJ1dGVzPC9uYW1lPgorCTx0YWctY2xhc3M+anNwMi5leGFtcGxlcy5zaW1wbGV0YWcuRWNob0F0dHJpYnV0ZXNUYWc8L3RhZy1jbGFzcz4KKwk8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+CisJPGR5bmFtaWMtYXR0cmlidXRlcz50cnVlPC9keW5hbWljLWF0dHJpYnV0ZXM+CisgICAgPC90YWc+CisgICAgPGZ1bmN0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+UmV2ZXJzZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuIFN0cmluZzwvZGVzY3JpcHRpb24+CisgICAgICAgIDxuYW1lPnJldmVyc2U8L25hbWU+CisJPGZ1bmN0aW9uLWNsYXNzPmpzcDIuZXhhbXBsZXMuZWwuRnVuY3Rpb25zPC9mdW5jdGlvbi1jbGFzcz4KKwk8ZnVuY3Rpb24tc2lnbmF0dXJlPmphdmEubGFuZy5TdHJpbmcgcmV2ZXJzZSggamF2YS5sYW5nLlN0cmluZyApPC9mdW5jdGlvbi1zaWduYXR1cmU+CisgICAgPC9mdW5jdGlvbj4KKyAgICA8ZnVuY3Rpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj5Db3VudHMgdGhlIG51bWJlciBvZiB2b3dlbHMgKGEsZSxpLG8sdSkgaW4gdGhlIGdpdmVuIFN0cmluZzwvZGVzY3JpcHRpb24+CisgICAgICAgIDxuYW1lPmNvdW50Vm93ZWxzPC9uYW1lPgorCTxmdW5jdGlvbi1jbGFzcz5qc3AyLmV4YW1wbGVzLmVsLkZ1bmN0aW9uczwvZnVuY3Rpb24tY2xhc3M+CisJPGZ1bmN0aW9uLXNpZ25hdHVyZT5qYXZhLmxhbmcuU3RyaW5nIG51bVZvd2VscyggamF2YS5sYW5nLlN0cmluZyApPC9mdW5jdGlvbi1zaWduYXR1cmU+CisgICAgPC9mdW5jdGlvbj4KKyAgICA8ZnVuY3Rpb24+CisJPGRlc2NyaXB0aW9uPkNvbnZlcnRzIHRoZSBzdHJpbmcgdG8gYWxsIGNhcHM8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8bmFtZT5jYXBzPC9uYW1lPgorCTxmdW5jdGlvbi1jbGFzcz5qc3AyLmV4YW1wbGVzLmVsLkZ1bmN0aW9uczwvZnVuY3Rpb24tY2xhc3M+CisJPGZ1bmN0aW9uLXNpZ25hdHVyZT5qYXZhLmxhbmcuU3RyaW5nIGNhcHMoIGphdmEubGFuZy5TdHJpbmcgKTwvZnVuY3Rpb24tc2lnbmF0dXJlPgorICAgIDwvZnVuY3Rpb24+Cis8L3RhZ2xpYj4KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9saWIvanN0bC5qYXIgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2xpYi9qc3RsLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjQxMzU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9saWIvanN0bC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9saWIvc3RhbmRhcmQuamFyIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9saWIvc3RhbmRhcmQuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OGRhYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2xpYi9zdGFuZGFyZC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi90YWdzL2Rpc3BsYXlQcm9kdWN0cy50YWcgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL3RhZ3MvZGlzcGxheVByb2R1Y3RzLnRhZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGFkOWY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi90YWdzL2Rpc3BsYXlQcm9kdWN0cy50YWcKQEAgLTAsMCArMSw1NSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8JUAgdGFnbGliIHByZWZpeD0iYyIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiICU+Cis8JUAgYXR0cmlidXRlIG5hbWU9Im5vcm1hbFByaWNlIiBmcmFnbWVudD0idHJ1ZSIgJT4KKzwlQCBhdHRyaWJ1dGUgbmFtZT0ib25TYWxlIiBmcmFnbWVudD0idHJ1ZSIgJT4KKzwlQCB2YXJpYWJsZSBuYW1lLWdpdmVuPSJuYW1lIiAlPgorPCVAIHZhcmlhYmxlIG5hbWUtZ2l2ZW49InByaWNlIiAlPgorPCVAIHZhcmlhYmxlIG5hbWUtZ2l2ZW49Im9yaWdQcmljZSIgJT4KKzwlQCB2YXJpYWJsZSBuYW1lLWdpdmVuPSJzYWxlUHJpY2UiICU+CisKKzx0YWJsZSBib3JkZXI9IjEiPgorICA8dHI+CisgICAgPHRkPiAKKyAgICAgIDxjOnNldCB2YXI9Im5hbWUiIHZhbHVlPSJIYW5kLWhlbGQgQ29sb3IgUERBIi8+CisgICAgICA8YzpzZXQgdmFyPSJwcmljZSIgdmFsdWU9IiQyOTguODYiLz4KKyAgICAgIDxqc3A6aW52b2tlIGZyYWdtZW50PSJub3JtYWxQcmljZSIvPgorICAgIDwvdGQ+CisgICAgPHRkPiAKKyAgICAgIDxjOnNldCB2YXI9Im5hbWUiIHZhbHVlPSI0LVBhY2sgMTUwIFdhdHQgTGlnaHQgQnVsYnMiLz4KKyAgICAgIDxjOnNldCB2YXI9Im9yaWdQcmljZSIgdmFsdWU9IiQyLjk4Ii8+CisgICAgICA8YzpzZXQgdmFyPSJzYWxlUHJpY2UiIHZhbHVlPSIkMi4zMiIvPgorICAgICAgPGpzcDppbnZva2UgZnJhZ21lbnQ9Im9uU2FsZSIvPgorICAgIDwvdGQ+CisgICAgPHRkPiAKKyAgICAgIDxjOnNldCB2YXI9Im5hbWUiIHZhbHVlPSJEaWdpdGFsIENlbGx1bGFyIFBob25lIi8+CisgICAgICA8YzpzZXQgdmFyPSJwcmljZSIgdmFsdWU9IiQ2OC43NCIvPgorICAgICAgPGpzcDppbnZva2UgZnJhZ21lbnQ9Im5vcm1hbFByaWNlIi8+CisgICAgPC90ZD4KKyAgICA8dGQ+IAorICAgICAgPGM6c2V0IHZhcj0ibmFtZSIgdmFsdWU9IkJhYnkgR3JhbmQgUGlhbm8iLz4KKyAgICAgIDxjOnNldCB2YXI9InByaWNlIiB2YWx1ZT0iJDEwLDgwMC4wMCIvPgorICAgICAgPGpzcDppbnZva2UgZnJhZ21lbnQ9Im5vcm1hbFByaWNlIi8+CisgICAgPC90ZD4KKyAgICA8dGQ+IAorICAgICAgPGM6c2V0IHZhcj0ibmFtZSIgdmFsdWU9Ikx1eHVyeSBDYXIgdy8gTGVhdGhlciBTZWF0cyIvPgorICAgICAgPGM6c2V0IHZhcj0ib3JpZ1ByaWNlIiB2YWx1ZT0iJDIzLDk4MC4wMCIvPgorICAgICAgPGM6c2V0IHZhcj0ic2FsZVByaWNlIiB2YWx1ZT0iJDIxLDA3MC4wMCIvPgorICAgICAgPGpzcDppbnZva2UgZnJhZ21lbnQ9Im9uU2FsZSIvPgorICAgIDwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi90YWdzL2hlbGxvV29ybGQudGFnIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi90YWdzL2hlbGxvV29ybGQudGFnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MmJmNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL3RhZ3MvaGVsbG9Xb3JsZC50YWcKQEAgLTAsMCArMSwxNyBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CitIZWxsbywgd29ybGQhCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL3RhZ3MvcGFuZWwudGFnIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi90YWdzL3BhbmVsLnRhZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGYzMGQwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi90YWdzL3BhbmVsLnRhZwpAQCAtMCwwICsxLDI5IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwlQCBhdHRyaWJ1dGUgbmFtZT0iY29sb3IiICU+Cis8JUAgYXR0cmlidXRlIG5hbWU9ImJnY29sb3IiICU+Cis8JUAgYXR0cmlidXRlIG5hbWU9InRpdGxlIiAlPgorPHRhYmxlIGJvcmRlcj0iMSIgYmdjb2xvcj0iJHtjb2xvcn0iPgorICA8dHI+CisgICAgPHRkPjxiPiR7dGl0bGV9PC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgYmdjb2xvcj0iJHtiZ2NvbG9yfSI+CisgICAgICA8anNwOmRvQm9keS8+CisgICAgPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL3RhZ3MveGh0bWxiYXNpYy50YWcgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL3RhZ3MveGh0bWxiYXNpYy50YWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwYTliYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvdGFncy94aHRtbGJhc2ljLnRhZwpAQCAtMCwwICsxLDIxIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiIKKyJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1iYXNpYy94aHRtbC1iYXNpYzEwLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8anNwOmRvQm9keS8+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL3dlYi54bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg2MGUyMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDI1OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgorICAgIHZlcnNpb249IjIuNCI+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBKU1AgMi4wIEV4YW1wbGVzLgorICAgIDwvZGVzY3JpcHRpb24+CisgICAgPGRpc3BsYXktbmFtZT5KU1AgMi4wIEV4YW1wbGVzPC9kaXNwbGF5LW5hbWU+CisKKworICAgIDwhLS0gRGVmaW5lIHNlcnZsZXQtbWFwcGVkIGFuZCBwYXRoLW1hcHBlZCBleGFtcGxlIGZpbHRlcnMgLS0+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPlNlcnZsZXQgTWFwcGVkIEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+ZmlsdGVycy5FeGFtcGxlRmlsdGVyPC9maWx0ZXItY2xhc3M+CisJPGluaXQtcGFyYW0+CisJICAgIDxwYXJhbS1uYW1lPmF0dHJpYnV0ZTwvcGFyYW0tbmFtZT4KKwkgICAgPHBhcmFtLXZhbHVlPmZpbHRlcnMuRXhhbXBsZUZpbHRlci5TRVJWTEVUX01BUFBFRDwvcGFyYW0tdmFsdWU+CisJPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5QYXRoIE1hcHBlZCBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPmZpbHRlcnMuRXhhbXBsZUZpbHRlcjwvZmlsdGVyLWNsYXNzPgorCTxpbml0LXBhcmFtPgorCSAgICA8cGFyYW0tbmFtZT5hdHRyaWJ1dGU8L3BhcmFtLW5hbWU+CisJICAgIDxwYXJhbS12YWx1ZT5maWx0ZXJzLkV4YW1wbGVGaWx0ZXIuUEFUSF9NQVBQRUQ8L3BhcmFtLXZhbHVlPgorCTwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+UmVxdWVzdCBEdW1wZXIgRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5maWx0ZXJzLlJlcXVlc3REdW1wZXJGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICA8L2ZpbHRlcj4KKworICAgIDwhLS0gRXhhbXBsZSBmaWx0ZXIgdG8gc2V0IGNoYXJhY3RlciBlbmNvZGluZyBvbiBlYWNoIHJlcXVlc3QgLS0+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPlNldCBDaGFyYWN0ZXIgRW5jb2Rpbmc8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPmZpbHRlcnMuU2V0Q2hhcmFjdGVyRW5jb2RpbmdGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5lbmNvZGluZzwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5FVUNfSlA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisKKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+Q29tcHJlc3Npb24gRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5jb21wcmVzc2lvbkZpbHRlcnMuQ29tcHJlc3Npb25GaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKworICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICA8cGFyYW0tbmFtZT5jb21wcmVzc2lvblRocmVzaG9sZDwvcGFyYW0tbmFtZT4KKyAgICAgICAgICA8cGFyYW0tdmFsdWU+MTA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgIDxwYXJhbS1uYW1lPmRlYnVnPC9wYXJhbS1uYW1lPgorICAgICAgICAgIDxwYXJhbS12YWx1ZT4wPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorCis8IS0tIEV4YW1wbGUgZmlsdGVyIG1hcHBpbmcgdG8gYXBwbHkgdGhlICJTZXQgQ2hhcmFjdGVyIEVuY29kaW5nIiBmaWx0ZXIKKyAgICAgdG8gKmFsbCogcmVxdWVzdHMgcHJvY2Vzc2VkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uIC0tPgorPCEtLQorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPlNldCBDaGFyYWN0ZXIgRW5jb2Rpbmc8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CistLT4KKworPCEtLQorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgIDxmaWx0ZXItbmFtZT5Db21wcmVzc2lvbiBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgPHVybC1wYXR0ZXJuPi9Db21wcmVzc2lvblRlc3Q8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CistLT4KKworPCEtLQorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPlJlcXVlc3QgRHVtcGVyIEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKy0tPgorCisgICAgPCEtLSBEZWZpbmUgZXhhbXBsZSBhcHBsaWNhdGlvbiBldmVudHMgbGlzdGVuZXJzIC0tPgorICAgIDxsaXN0ZW5lcj4KKyAgICAgICAgPGxpc3RlbmVyLWNsYXNzPmxpc3RlbmVycy5Db250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgorICAgIDwvbGlzdGVuZXI+CisgICAgPGxpc3RlbmVyPgorICAgICAgICA8bGlzdGVuZXItY2xhc3M+bGlzdGVuZXJzLlNlc3Npb25MaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+CisgICAgPC9saXN0ZW5lcj4KKworICAgIDwhLS0gRGVmaW5lIHNlcnZsZXRzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBleGFtcGxlIGFwcGxpY2F0aW9uIC0tPgorCisgICAgPHNlcnZsZXQ+CisgICAgICA8c2VydmxldC1uYW1lPgorICAgICAgICAgIHNlcnZsZXRUb0pzcAorICAgICAgPC9zZXJ2bGV0LW5hbWU+CisgICAgICA8c2VydmxldC1jbGFzcz4KKyAgICAgICAgICBzZXJ2bGV0VG9Kc3AKKyAgICAgIDwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT4KKyAgICAgICAgICAgIENvbXByZXNzaW9uRmlsdGVyVGVzdFNlcnZsZXQKKyAgICAgICAgPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPgorICAgICAgICAgICAgY29tcHJlc3Npb25GaWx0ZXJzLkNvbXByZXNzaW9uRmlsdGVyVGVzdFNlcnZsZXQKKyAgICAgICAgPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+CisgICAgICAgICAgICBDb21wcmVzc2lvbkZpbHRlclRlc3RTZXJ2bGV0CisgICAgICAgIDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+CisgICAgICAgICAgICAvQ29tcHJlc3Npb25UZXN0CisgICAgICAgIDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPgorICAgICAgICAgICAgc2VydmxldFRvSnNwCisgICAgICAgIDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+CisgICAgICAgICAgICAvc2VydmxldFRvSnNwCisgICAgICAgIDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8anNwLWNvbmZpZz4KKyAgICAgICAgPHRhZ2xpYj4KKwkgICAgPHRhZ2xpYi11cmk+CisJICAgICAgIGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0L2RlYnVnLXRhZ2xpYgorCSAgICA8L3RhZ2xpYi11cmk+CisJICAgIDx0YWdsaWItbG9jYXRpb24+CisJICAgICAgIC9XRUItSU5GL2pzcC9kZWJ1Zy10YWdsaWIudGxkCisJICAgIDwvdGFnbGliLWxvY2F0aW9uPgorCTwvdGFnbGliPgorCisJPHRhZ2xpYj4KKwkgICAgPHRhZ2xpYi11cmk+CisJICAgICAgIGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0L2V4YW1wbGVzLXRhZ2xpYgorCSAgICA8L3RhZ2xpYi11cmk+CisJICAgIDx0YWdsaWItbG9jYXRpb24+CisJICAgICAgIC9XRUItSU5GL2pzcC9leGFtcGxlLXRhZ2xpYi50bGQKKwkgICAgPC90YWdsaWItbG9jYXRpb24+CisJPC90YWdsaWI+CisKKwk8dGFnbGliPgorCSAgICA8dGFnbGliLXVyaT4KKwkgICAgICAgaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvanNwMi1leGFtcGxlLXRhZ2xpYgorCSAgICA8L3RhZ2xpYi11cmk+CisJICAgIDx0YWdsaWItbG9jYXRpb24+CisJICAgICAgIC9XRUItSU5GL2pzcDIvanNwMi1leGFtcGxlLXRhZ2xpYi50bGQKKwkgICAgPC90YWdsaWItbG9jYXRpb24+CisJPC90YWdsaWI+CisKKwk8anNwLXByb3BlcnR5LWdyb3VwPgorCSAgICA8ZGVzY3JpcHRpb24+CisJCVNwZWNpYWwgcHJvcGVydHkgZ3JvdXAgZm9yIEpTUCBDb25maWd1cmF0aW9uIEpTUCBleGFtcGxlLgorCSAgICA8L2Rlc2NyaXB0aW9uPgorCSAgICA8ZGlzcGxheS1uYW1lPkpTUENvbmZpZ3VyYXRpb248L2Rpc3BsYXktbmFtZT4KKwkgICAgPHVybC1wYXR0ZXJuPi9qc3AyL21pc2MvY29uZmlnLmpzcDwvdXJsLXBhdHRlcm4+CisJICAgIDxlbC1pZ25vcmVkPnRydWU8L2VsLWlnbm9yZWQ+CisJICAgIDxwYWdlLWVuY29kaW5nPklTTy04ODU5LTE8L3BhZ2UtZW5jb2Rpbmc+CisJICAgIDxzY3JpcHRpbmctaW52YWxpZD50cnVlPC9zY3JpcHRpbmctaW52YWxpZD4KKwkgICAgPGluY2x1ZGUtcHJlbHVkZT4vanNwMi9taXNjL3ByZWx1ZGUuanNwZjwvaW5jbHVkZS1wcmVsdWRlPgorCSAgICA8aW5jbHVkZS1jb2RhPi9qc3AyL21pc2MvY29kYS5qc3BmPC9pbmNsdWRlLWNvZGE+CisJPC9qc3AtcHJvcGVydHktZ3JvdXA+CisgICAgPC9qc3AtY29uZmlnPgorICAgIAorICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgICA8ZGlzcGxheS1uYW1lPkV4YW1wbGUgU2VjdXJpdHkgQ29uc3RyYWludDwvZGlzcGxheS1uYW1lPgorICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPlByb3RlY3RlZCBBcmVhPC93ZWItcmVzb3VyY2UtbmFtZT4KKwkgPCEtLSBEZWZpbmUgdGhlIGNvbnRleHQtcmVsYXRpdmUgVVJMKHMpIHRvIGJlIHByb3RlY3RlZCAtLT4KKyAgICAgICAgIDx1cmwtcGF0dGVybj4vc2VjdXJpdHkvcHJvdGVjdGVkLyo8L3VybC1wYXR0ZXJuPgorCSA8IS0tIElmIHlvdSBsaXN0IGh0dHAgbWV0aG9kcywgb25seSB0aG9zZSBtZXRob2RzIGFyZSBwcm90ZWN0ZWQgLS0+CisJIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgorICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+CisgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+CisJIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgorICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICAgIDxhdXRoLWNvbnN0cmFpbnQ+CisgICAgICAgICA8IS0tIEFueW9uZSB3aXRoIG9uZSBvZiB0aGUgbGlzdGVkIHJvbGVzIG1heSBhY2Nlc3MgdGhpcyBhcmVhIC0tPgorICAgICAgICAgPHJvbGUtbmFtZT50b21jYXQ8L3JvbGUtbmFtZT4KKwkgPHJvbGUtbmFtZT5yb2xlMTwvcm9sZS1uYW1lPgorICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+CisgICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgorCisgICAgPCEtLSBEZWZhdWx0IGxvZ2luIGNvbmZpZ3VyYXRpb24gdXNlcyBmb3JtLWJhc2VkIGF1dGhlbnRpY2F0aW9uIC0tPgorICAgIDxsb2dpbi1jb25maWc+CisgICAgICA8YXV0aC1tZXRob2Q+Rk9STTwvYXV0aC1tZXRob2Q+CisgICAgICA8cmVhbG0tbmFtZT5FeGFtcGxlIEZvcm0tQmFzZWQgQXV0aGVudGljYXRpb24gQXJlYTwvcmVhbG0tbmFtZT4KKyAgICAgIDxmb3JtLWxvZ2luLWNvbmZpZz4KKyAgICAgICAgPGZvcm0tbG9naW4tcGFnZT4vc2VjdXJpdHkvcHJvdGVjdGVkL2xvZ2luLmpzcDwvZm9ybS1sb2dpbi1wYWdlPgorICAgICAgICA8Zm9ybS1lcnJvci1wYWdlPi9zZWN1cml0eS9wcm90ZWN0ZWQvZXJyb3IuanNwPC9mb3JtLWVycm9yLXBhZ2U+CisgICAgICA8L2Zvcm0tbG9naW4tY29uZmlnPgorICAgIDwvbG9naW4tY29uZmlnPgorICAgICAgICAKKyAgICA8IS0tIFNlY3VyaXR5IHJvbGVzIHJlZmVyZW5jZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24gLS0+CisgICAgPHNlY3VyaXR5LXJvbGU+CisgICAgICA8cm9sZS1uYW1lPnJvbGUxPC9yb2xlLW5hbWU+CisgICAgPC9zZWN1cml0eS1yb2xlPgorICAgIDxzZWN1cml0eS1yb2xlPgorICAgICAgPHJvbGUtbmFtZT50b21jYXQ8L3JvbGUtbmFtZT4KKyAgICA8L3NlY3VyaXR5LXJvbGU+ICAgIAorCisgICAgPCEtLSBFbnZpcm9ubWVudCBlbnRyeSBleGFtcGxlcyAtLT4KKyAgICA8IS0tZW52LWVudHJ5PgorICAgICAgPGVudi1lbnRyeS1kZXNjcmlwdGlvbj4KKyAgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0YXggZXhlbXB0aW9ucyBhbGxvd2VkIHRvIGJlIHNldC4KKyAgICAgIDwvZW52LWVudHJ5LWRlc2NyaXB0aW9uPgorICAgICAgPGVudi1lbnRyeS1uYW1lPm1heEV4ZW1wdGlvbnM8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KKyAgICAgIDxlbnYtZW50cnktdmFsdWU+MTU8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICA8L2Vudi1lbnRyeS0tPgorICAgIDxlbnYtZW50cnk+CisgICAgICA8ZW52LWVudHJ5LW5hbWU+bWluRXhlbXB0aW9uczwvZW52LWVudHJ5LW5hbWU+CisgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgorICAgICAgPGVudi1lbnRyeS12YWx1ZT4xPC9lbnYtZW50cnktdmFsdWU+CisgICAgPC9lbnYtZW50cnk+CisgICAgPGVudi1lbnRyeT4KKyAgICAgIDxlbnYtZW50cnktbmFtZT5mb28vbmFtZTE8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgorICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZTE8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICA8L2Vudi1lbnRyeT4KKyAgICA8ZW52LWVudHJ5PgorICAgICAgPGVudi1lbnRyeS1uYW1lPmZvby9iYXIvbmFtZTI8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KKyAgICAgIDxlbnYtZW50cnktdmFsdWU+dHJ1ZTwvZW52LWVudHJ5LXZhbHVlPgorICAgIDwvZW52LWVudHJ5PgorICAgIDxlbnYtZW50cnk+CisgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZTM8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KKyAgICAgIDxlbnYtZW50cnktdmFsdWU+MTwvZW52LWVudHJ5LXZhbHVlPgorICAgIDwvZW52LWVudHJ5PgorICAgIDxlbnYtZW50cnk+CisgICAgICA8ZW52LWVudHJ5LW5hbWU+Zm9vL25hbWU0PC9lbnYtZW50cnktbmFtZT4KKyAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+CisgICAgICA8ZW52LWVudHJ5LXZhbHVlPjEwPC9lbnYtZW50cnktdmFsdWU+CisgICAgPC9lbnYtZW50cnk+CisKKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NhbC9jYWwxLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NhbC9jYWwxLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjA1NzU3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2FsL2NhbDEuanNwCkBAIC0wLDAgKzEsOTUgQEAKKzxIVE1MPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8SEVBRD48VElUTEU+IAorCUNhbGVuZGFyOiBBIEpTUCBBUFBMSUNBVElPTgorPC9USVRMRT48L0hFQUQ+CisKKworPEJPRFkgQkdDT0xPUj0id2hpdGUiPgorCis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJjYWwuKiIgJT4KKzxqc3A6dXNlQmVhbiBpZD0idGFibGUiIHNjb3BlPSJzZXNzaW9uIiBjbGFzcz0iY2FsLlRhYmxlQmVhbiIgLz4KKworPCUKKwl0YWJsZS5wcm9jZXNzUmVxdWVzdChyZXF1ZXN0KTsKKwlpZiAodGFibGUuZ2V0UHJvY2Vzc0Vycm9yKCkgPT0gZmFsc2UpIHsKKyU+CisKKzwhLS0gaHRtbCB0YWJsZSBnb2VzIGhlcmUgLS0+Cis8Q0VOVEVSPgorPFRBQkxFIFdJRFRIPTYwJSBCR0NPTE9SPXllbGxvdyBDRUxMUEFERElORz0xNT4KKzxUUj4KKzxURCBBTElHTj1DRU5URVI+IDxBIEhSRUY9Y2FsMS5qc3A/ZGF0ZT1wcmV2PiBwcmV2IDwvQT4KKzxURCBBTElHTj1DRU5URVI+IENhbGVuZGFyOjwlPSB0YWJsZS5nZXREYXRlKCkgJT48L1REPgorPFREIEFMSUdOPUNFTlRFUj4gPEEgSFJFRj1jYWwxLmpzcD9kYXRlPW5leHQ+IG5leHQgPC9BPgorPC9UUj4KKzwvVEFCTEU+CisKKzwhLS0gdGhlIG1haW4gdGFibGUgLS0+Cis8VEFCTEUgV0lEVEg9NjAlIEJHQ09MT1I9bGlnaHRibHVlIEJPUkRFUj0xIENFTExQQURESU5HPTEwPgorPFRSPgorPFRIPiBUaW1lIDwvVEg+Cis8VEg+IEFwcG9pbnRtZW50IDwvVEg+Cis8L1RSPgorPEZPUk0gTUVUSE9EPVBPU1QgQUNUSU9OPWNhbDEuanNwPgorPCUKKwlmb3IoaW50IGk9MDsgaTx0YWJsZS5nZXRFbnRyaWVzKCkuZ2V0Um93cygpOyBpKyspIHsKKwkgICBjYWwuRW50cnkgZW50ciA9IHRhYmxlLmdldEVudHJpZXMoKS5nZXRFbnRyeShpKTsJCislPgorCTxUUj4KKwk8VEQ+IAorCTxBIEhSRUY9Y2FsMi5qc3A/dGltZT08JT0gZW50ci5nZXRIb3VyKCkgJT4+CisJCTwlPSBlbnRyLmdldEhvdXIoKSAlPiA8L0E+CisJPC9URD4KKwk8VEQgQkdDT0xPUj08JT0gZW50ci5nZXRDb2xvcigpICU+PgorCTwlIG91dC5wcmludCh1dGlsLkhUTUxGaWx0ZXIuZmlsdGVyKGVudHIuZ2V0RGVzY3JpcHRpb24oKSkpOyAlPgorCTwvVEQ+IAorCTwvVFI+Cis8JQorCX0KKyU+Cis8L0ZPUk0+Cis8L1RBQkxFPgorPEJSPgorCis8IS0tIGZvb3RlciAtLT4KKzxUQUJMRSBXSURUSD02MCUgQkdDT0xPUj15ZWxsb3cgQ0VMTFBBRERJTkc9MTU+Cis8VFI+Cis8VEQgQUxJR049Q0VOVEVSPiAgPCUgb3V0LnByaW50KHV0aWwuSFRNTEZpbHRlci5maWx0ZXIodGFibGUuZ2V0TmFtZSgpKSk7ICU+IDogCisJCSAgICAgPCUgb3V0LnByaW50KHV0aWwuSFRNTEZpbHRlci5maWx0ZXIodGFibGUuZ2V0RW1haWwoKSkpOyAlPiA8L1REPgorPC9UUj4KKzwvVEFCTEU+Cis8L0NFTlRFUj4KKworPCUKKwl9IGVsc2UgeworJT4KKzxmb250IHNpemU9NT4KKwlZb3UgbXVzdCBlbnRlciB5b3VyIG5hbWUgYW5kIGVtYWlsIGFkZHJlc3MgY29ycmVjdGx5LgorPC9mb250PgorPCUKKwl9CislPgorCisKKzwvQk9EWT4KKzwvSFRNTD4KKworCisKKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2FsL2NhbDIuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2FsL2NhbDIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMTViN2UKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jYWwvY2FsMi5qc3AKQEAgLTAsMCArMSw0NSBAQAorPEhUTUw+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEhFQUQ+PFRJVExFPiAKKwlDYWxlbmRhcjogQSBKU1AgQVBQTElDQVRJT04KKzwvVElUTEU+PC9IRUFEPgorCisKKzxCT0RZIEJHQ09MT1I9IndoaXRlIj4KKzxqc3A6dXNlQmVhbiBpZD0idGFibGUiIHNjb3BlPSJzZXNzaW9uIiBjbGFzcz0iY2FsLlRhYmxlQmVhbiIgLz4KKworPCUgCisJU3RyaW5nIHRpbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlciAoInRpbWUiKTsKKyU+CisKKzxGT05UIFNJWkU9NT4gUGxlYXNlIGFkZCB0aGUgZm9sbG93aW5nIGV2ZW50OgorPEJSPiA8aDM+IERhdGUgPCU9IHRhYmxlLmdldERhdGUoKSAlPgorPEJSPiBUaW1lIDwlPSB1dGlsLkhUTUxGaWx0ZXIuZmlsdGVyKHRpbWUpICU+IDwvaDM+Cis8L0ZPTlQ+Cis8Rk9STSBNRVRIT0Q9UE9TVCBBQ1RJT049Y2FsMS5qc3A+Cis8QlI+IAorPEJSPiA8SU5QVVQgTkFNRT0iZGF0ZSIgVFlQRT1ISURERU4gVkFMVUU9ImN1cnJlbnQiPgorPEJSPiA8SU5QVVQgTkFNRT0idGltZSIgVFlQRT1ISURERU4gVkFMVUU9PCU9IHV0aWwuSFRNTEZpbHRlci5maWx0ZXIodGltZSkgJT4KKzxCUj4gPGgyPiBEZXNjcmlwdGlvbiBvZiB0aGUgZXZlbnQgPElOUFVUIE5BTUU9ImRlc2NyaXB0aW9uIiBUWVBFPVRFWFQgU0laRT0yMD4gPC9oMj4KKzxCUj4gPElOUFVUIFRZUEU9U1VCTUlUIFZBTFVFPSJzdWJtaXQiPgorPC9GT1JNPgorCis8L0JPRFk+Cis8L0hUTUw+CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NhbC9jYWxlbmRhci5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2FsL2NhbGVuZGFyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhM2VhMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NhbC9jYWxlbmRhci5odG1sCkBAIC0wLDAgKzEsNDMgQEAKKzxodG1sPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxoZWFkPgorPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJsb2dpbi5odG1sIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMj4gU291cmNlIENvZGUgZm9yIENhbGVuZGFyIEV4YW1wbGUuIDxicj4KKzxoMz48YSBocmVmPSJjYWwxLmpzcC5odG1sIj5jYWwxLmpzcDxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKzxoMz48YSBocmVmPSJjYWwyLmpzcC5odG1sIj5jYWwyLmpzcDxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPGJyPgorPGgyPiBCZWFucy4KKzxoMz48YSBocmVmPSJUYWJsZUJlYW4uamF2YS5odG1sIj5UYWJsZUJlYW48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+Cis8aDM+PGEgaHJlZj0iRW50cmllcy5qYXZhLmh0bWwiPkVudHJpZXM8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+Cis8aDM+PGEgaHJlZj0iRW50cnkuamF2YS5odG1sIj5FbnRyeTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2FsL2xvZ2luLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jYWwvbG9naW4uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjAxYjE3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2FsL2xvZ2luLmh0bWwKQEAgLTAsMCArMSw0NyBAQAorPGh0bWw+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGhlYWQ+CisJPHRpdGxlPiBMb2dpbiBwYWdlIGZvciB0aGUgY2FsZW5kYXIuIDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IndoaXRlIj4KKzxjZW50ZXI+CisKKwk8Zm9udCBzaXplPTcgY29sb3I9InJlZCI+IFBsZWFzZSBFbnRlciB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOiA8L2ZvbnQ+CisKKzxicj4KKwk8Zm9ybSBtZXRob2Q9R0VUIGFjdGlvbj1jYWwxLmpzcD4KKworCQk8Zm9udCBzaXplPTU+IE5hbWUgPGlucHV0IHR5cGU9dGV4dCBuYW1lPSJuYW1lIiBzaXplPTIwPgorCQk8L2ZvbnQ+CisJCTxicj4KKwkJPGZvbnQgc2l6ZT01PiBFbWFpbCA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9ImVtYWlsIiBzaXplPTIwPgorCQk8L2ZvbnQ+CisJCTxicj4KKwkJPGlucHV0IHR5cGU9c3VibWl0IG5hbWU9YWN0aW9uIHZhbHVlPSJTdWJtaXQiPgorCisJPC9mb3JtPgorPGhyPgorPGZvbnQgc2l6ZT0zIGNvbG9yPSJyZWQiPiBOb3RlOiBUaGlzIGFwcGxpY2F0aW9uIGRvZXMgbm90IGltcGxlbWVudCB0aGUgY29tcGxldGUgCitmdW5jdGlvbmFsaXR5IG9mIGEgdHlwaWNhbCBjYWxlbmRhciBhcHBsaWNhdGlvbi4gSXQgZGVtb3N0YXJ0ZXMgYSB3YXkgSlNQIGNhbiBiZSAKK3VzZWQgd2l0aCBodG1sIHRhYmxlcyBhbmQgZm9ybXMuPC9mb250PgorCis8L2NlbnRlcj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NoZWNrYm94L0NoZWNrVGVzdC5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2hlY2tib3gvQ2hlY2tUZXN0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg0ZDllYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NoZWNrYm94L0NoZWNrVGVzdC5odG1sCkBAIC0wLDAgKzEsNTYgQEAKKzxIVE1MPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxIRUFEPgorPHRpdGxlPgorY2hlY2tib3guQ2hlY2tUZXN0IEJlYW4gUHJvcGVydGllcworPC90aXRsZT4KKzxCT0RZIEJHQ09MT1I9IndoaXRlIj4KKzxIMj4KK2NoZWNrYm94LkNoZWNrVGVzdCBCZWFuIFByb3BlcnRpZXMKKzwvSDI+Cis8SFI+Cis8REw+Cis8RFQ+cHVibGljIGNsYXNzIDxCPkNoZWNrVGVzdDwvQj48RFQ+ZXh0ZW5kcyBPYmplY3Q8L0RMPgorCis8UD4KKzxIUj4KKworPFA+CisKKzxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiPgorPFRSIEJHQ09MT1I9IiNFRUVFRkYiPgorPFREIENPTFNQQU49Mz48Rk9OVCBTSVpFPSIrMiI+Cis8Qj5Qcm9wZXJ0aWVzIFN1bW1hcnk8L0I+PC9GT05UPjwvVEQ+Cis8L1RSPgorPFRSIEJHQ09MT1I9IndoaXRlIj4KKzx0ZCBhbGlnbj0icmlnaHQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMSUiPgorPEZPTlQgU0laRT0iLTEiPgorU3RyaW5nCis8L0ZPTlQ+PC9URD4KKzxURD48Qj5DaGVja1Rlc3Q6ZnJ1aXQ8L0I+Cis8QlI+CisgICAgICAgPC9URD4KKzx0ZCB3aWR0aD0iMSUiPgorPEZPTlQgU0laRT0iLTEiPgorTXVsdGkKKzwvRk9OVD48L1REPgorPC9UQUJMRT4KKzxIUj4KKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NoZWNrYm94L2NoZWNrLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jaGVja2JveC9jaGVjay5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDZiM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jaGVja2JveC9jaGVjay5odG1sCkBAIC0wLDAgKzEsMzggQEAKKzxIVE1MPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxCT0RZIGJnY29sb3I9IndoaXRlIj4KKworCis8Rk9STSBUWVBFPVBPU1QgQUNUSU9OPWNoZWNrcmVzdWx0LmpzcD4KKzxCUj4KKzxmb250IHNpemU9NSBjb2xvcj0icmVkIj4KK0NoZWNrIGFsbCBGYXZvcml0ZSBmcnVpdHM6IDxicj4KKworPGlucHV0IFRZUEU9Y2hlY2tib3ggbmFtZT1mcnVpdCBWQUxVRT1hcHBsZXM+IEFwcGxlcyA8QlI+Cis8aW5wdXQgVFlQRT1jaGVja2JveCBuYW1lPWZydWl0IFZBTFVFPWdyYXBlcz4gR3JhcGVzIDxCUj4KKzxpbnB1dCBUWVBFPWNoZWNrYm94IG5hbWU9ZnJ1aXQgVkFMVUU9b3Jhbmdlcz4gT3JhbmdlcyA8QlI+Cis8aW5wdXQgVFlQRT1jaGVja2JveCBuYW1lPWZydWl0IFZBTFVFPW1lbG9ucz4gTWVsb25zIDxCUj4KKworCis8YnI+IDxJTlBVVCBUWVBFPXN1Ym1pdCBuYW1lPXN1Ym1pdCBWYWx1ZT0iU3VibWl0Ij4KKworPC9mb250PgorPC9GT1JNPgorPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2hlY2tib3gvY2hlY2tyZXN1bHQuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2hlY2tib3gvY2hlY2tyZXN1bHQuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNzA1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jaGVja2JveC9jaGVja3Jlc3VsdC5qc3AKQEAgLTAsMCArMSw2NCBAQAorPGh0bWw+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorPGZvbnQgc2l6ZT01IGNvbG9yPSJyZWQiPgorPCUhIFN0cmluZ1tdIGZydWl0czsgJT4KKzxqc3A6dXNlQmVhbiBpZD0iZm9vIiBzY29wZT0icGFnZSIgY2xhc3M9ImNoZWNrYm94LkNoZWNrVGVzdCIgLz4KKworPGpzcDpzZXRQcm9wZXJ0eSBuYW1lPSJmb28iIHByb3BlcnR5PSJmcnVpdCIgcGFyYW09ImZydWl0IiAvPgorPGhyPgorVGhlIGNoZWNrZWQgZnJ1aXRzIChnb3QgdXNpbmcgcmVxdWVzdCkgYXJlOiA8YnI+Cis8JSAKKwlmcnVpdHMgPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcygiZnJ1aXQiKTsKKyU+Cis8dWw+Cis8JQorICAgIGlmIChmcnVpdHMgIT0gbnVsbCkgeworCSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcnVpdHMubGVuZ3RoOyBpKyspIHsKKyU+Cis8bGk+Cis8JQorCSAgICAgIG91dC5wcmludGxuICh1dGlsLkhUTUxGaWx0ZXIuZmlsdGVyKGZydWl0c1tpXSkpOworCSAgfQorCX0gZWxzZSBvdXQucHJpbnRsbiAoIm5vbmUgc2VsZWN0ZWQiKTsKKyU+Cis8L3VsPgorPGJyPgorPGhyPgorCitUaGUgY2hlY2tlZCBmcnVpdHMgKGdvdCB1c2luZyBiZWFucykgYXJlIDxicj4KKworPCUgCisJCWZydWl0cyA9IGZvby5nZXRGcnVpdCgpOworJT4KKzx1bD4KKzwlCisgICAgaWYgKCFmcnVpdHNbMF0uZXF1YWxzKCIxIikpIHsKKwkgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJ1aXRzLmxlbmd0aDsgaSsrKSB7CislPgorPGxpPgorPCUKKwkJICBvdXQucHJpbnRsbiAodXRpbC5IVE1MRmlsdGVyLmZpbHRlcihmcnVpdHNbaV0pKTsKKwkgIH0KKwl9IGVsc2Ugb3V0LnByaW50bG4gKCJub25lIHNlbGVjdGVkIik7CislPgorPC91bD4KKzwvZm9udD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NoZWNrYm94L2NyZXN1bHQuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NoZWNrYm94L2NyZXN1bHQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmEyOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2hlY2tib3gvY3Jlc3VsdC5odG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxodG1sPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxoZWFkPgorPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJjaGVjay5odG1sIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJjaGVja3Jlc3VsdC5qc3AuaHRtbCI+U291cmNlIENvZGUgZm9yIENoZWNrYm94IEV4YW1wbGU8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzxoMz48YSBocmVmPSJDaGVja1Rlc3QuaHRtbCI+UHJvcGVydHkgU2hlZXQgZm9yIENoZWNrVGVzdAorPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4gPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jb2xvcnMvQ29sb3JHYW1lQmVhbi5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY29sb3JzL0NvbG9yR2FtZUJlYW4uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzJiYzY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY29sb3JzL0NvbG9yR2FtZUJlYW4uaHRtbApAQCAtMCwwICsxLDExNiBAQAorPEhUTUw+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEhFQUQ+Cis8dGl0bGU+Citjb2xvcnMuQ29sb3JHYW1lQmVhbiBCZWFuIFByb3BlcnRpZXMKKzwvdGl0bGU+Cis8Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Cis8SDI+Citjb2xvcnMuQ29sb3JHYW1lQmVhbiBCZWFuIFByb3BlcnRpZXMKKzwvSDI+Cis8SFI+Cis8REw+Cis8RFQ+cHVibGljIGNsYXNzIDxCPkNvbG9yR2FtZUJlYW48L0I+PERUPmV4dGVuZHMgT2JqZWN0PC9ETD4KKworPFA+Cis8SFI+CisKKzxQPgorCis8VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIj4KKzxUUiBCR0NPTE9SPSIjRUVFRUZGIj4KKzxURCBDT0xTUEFOPTM+PEZPTlQgU0laRT0iKzIiPgorPEI+UHJvcGVydGllcyBTdW1tYXJ5PC9CPjwvRk9OVD48L1REPgorPC9UUj4KKzxUUiBCR0NPTE9SPSJ3aGl0ZSI+Cis8dGQgYWxpZ249InJpZ2h0IiB2YWxpZ249InRvcCIgd2lkdGg9IjElIj4KKzxGT05UIFNJWkU9Ii0xIj4KK1N0cmluZworPC9GT05UPjwvVEQ+Cis8VEQ+PEI+Q29sb3JHYW1lQmVhbjpjb2xvcjI8L0I+Cis8QlI+CisgICAgICAgPC9URD4KKzx0ZCB3aWR0aD0iMSUiPgorPEZPTlQgU0laRT0iLTEiPgorU2luZ2xlCis8L0ZPTlQ+PC9URD4KKzxUUiBCR0NPTE9SPSJ3aGl0ZSI+Cis8dGQgYWxpZ249InJpZ2h0IiB2YWxpZ249InRvcCIgd2lkdGg9IjElIj4KKzxGT05UIFNJWkU9Ii0xIj4KK1N0cmluZworPC9GT05UPjwvVEQ+Cis8VEQ+PEI+Q29sb3JHYW1lQmVhbjpjb2xvcjE8L0I+Cis8QlI+CisgICAgICAgPC9URD4KKzx0ZCB3aWR0aD0iMSUiPgorPEZPTlQgU0laRT0iLTEiPgorU2luZ2xlCis8L0ZPTlQ+PC9URD4KKzxUUiBCR0NPTE9SPSJ3aGl0ZSI+Cis8dGQgYWxpZ249InJpZ2h0IiB2YWxpZ249InRvcCIgd2lkdGg9IjElIj4KKzxGT05UIFNJWkU9Ii0xIj4KK2ludAorPC9GT05UPjwvVEQ+Cis8VEQ+PEI+Q29sb3JHYW1lQmVhbjphdHRlbXB0czwvQj4KKzxCUj4KKyAgICAgICA8L1REPgorPHRkIHdpZHRoPSIxJSI+Cis8Rk9OVCBTSVpFPSItMSI+CitTaW5nbGUKKzwvRk9OVD48L1REPgorPFRSIEJHQ09MT1I9IndoaXRlIj4KKzx0ZCBhbGlnbj0icmlnaHQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMSUiPgorPEZPTlQgU0laRT0iLTEiPgorYm9vbGVhbgorPC9GT05UPjwvVEQ+Cis8VEQ+PEI+Q29sb3JHYW1lQmVhbjpoaW50PC9CPgorPEJSPgorICAgICAgIDwvVEQ+Cis8dGQgd2lkdGg9IjElIj4KKzxGT05UIFNJWkU9Ii0xIj4KK1NpbmdsZQorPC9GT05UPjwvVEQ+Cis8VFIgQkdDT0xPUj0id2hpdGUiPgorPHRkIGFsaWduPSJyaWdodCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxJSI+Cis8Rk9OVCBTSVpFPSItMSI+Citib29sZWFuCis8L0ZPTlQ+PC9URD4KKzxURD48Qj5Db2xvckdhbWVCZWFuOnN1Y2Nlc3M8L0I+Cis8QlI+CisgICAgICAgPC9URD4KKzx0ZCB3aWR0aD0iMSUiPgorPEZPTlQgU0laRT0iLTEiPgorU2luZ2xlCis8L0ZPTlQ+PC9URD4KKzxUUiBCR0NPTE9SPSJ3aGl0ZSI+Cis8dGQgYWxpZ249InJpZ2h0IiB2YWxpZ249InRvcCIgd2lkdGg9IjElIj4KKzxGT05UIFNJWkU9Ii0xIj4KK2Jvb2xlYW4KKzwvRk9OVD48L1REPgorPFREPjxCPkNvbG9yR2FtZUJlYW46aGludFRha2VuPC9CPgorPEJSPgorICAgICAgIDwvVEQ+Cis8dGQgd2lkdGg9IjElIj4KKzxGT05UIFNJWkU9Ii0xIj4KK1NpbmdsZQorPC9GT05UPjwvVEQ+Cis8L1RBQkxFPgorPEhSPgorPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY29sb3JzL2Nsci5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY29sb3JzL2Nsci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MTFmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jb2xvcnMvY2xyLmh0bWwKQEAgLTAsMCArMSwzNCBAQAorPGh0bWw+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGhlYWQ+Cis8dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9ImNvbG9ycy5odG1sIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJjb2xycy5qc3AuaHRtbCI+U291cmNlIENvZGUgZm9yIENvbG9yIEV4YW1wbGU8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzxoMz48YSBocmVmPSJDb2xvckdhbWVCZWFuLmh0bWwiPlByb3BlcnR5IFNoZWV0IGZvciBDb2xvckdhbWVCZWFuCis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPiA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NvbG9ycy9jb2xvcnMuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NvbG9ycy9jb2xvcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjkyNjhkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY29sb3JzL2NvbG9ycy5odG1sCkBAIC0wLDAgKzEsNDcgQEAKKzxodG1sPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxib2R5IGJnY29sb3I9IHdoaXRlPgorPGZvbnQgc2l6ZT02IGNvbG9yPXJlZD4KKworPGhyPgorVGhpcyB3ZWIgcGFnZSBpcyBhbiBleGFtcGxlIHVzaW5nIEpTUCBhbmQgQkVBTnMuIAorPHA+CitHdWVzcyBteSBmYXZvcml0ZSB0d28gY29sb3JzIAorCis8cD4gSWYgeW91IGZhaWwgdG8gZ3Vlc3MgYm90aCBvZiB0aGVtIC0geW91IGdldCB5ZWxsb3cgb24gcmVkLgorCis8cD4gSWYgeW91IGd1ZXNzIG9uZSBvZiB0aGVtIHJpZ2h0LCBlaXRoZXIgeW91ciBmb3JlZ3JvdW5kIG9yIAorICAgIHlvdXIgYmFja2dyb3VuZCB3aWxsIGNoYW5nZSB0byB0aGUgY29sb3IgdGhhdCB3YXMgZ3Vlc3NlZCByaWdodC4KKworPHA+IEd1ZXNzIHRoZW0gYm90aCByaWdodCBhbmQgeW91ciBicm93c2VyIGZvcmVncm91bmQvYmFja2dyb3VuZCAKKyAgICB3aWxsIGNoYW5nZSB0byBteSB0d28gZmF2b3JpdGUgY29sb3JzIHRvIGRpc3BsYXkgdGhpcyBwYWdlLgorCis8aHI+Cis8Zm9ybSBtZXRob2Q9R0VUIGFjdGlvbj1jb2xycy5qc3A+CitDb2xvciAjMTogPGlucHV0IHR5cGU9dGV4dCBuYW1lPSBjb2xvcjEgc2l6ZT0xNj4KKzxicj4KK0NvbG9yICMyOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9IGNvbG9yMiBzaXplPTE2PgorPHA+Cis8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1hY3Rpb24gdmFsdWU9IlN1Ym1pdCI+Cis8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1hY3Rpb24gdmFsdWU9IkhpbnQiPgorPC9mb3JtPgorCis8L2ZvbnQ+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jb2xvcnMvY29scnMuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY29sb3JzL2NvbHJzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmIwZDkzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY29sb3JzL2NvbHJzLmpzcApAQCAtMCwwICsxLDcwIEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8anNwOnVzZUJlYW4gaWQ9ImNiIiBzY29wZT0ic2Vzc2lvbiIgY2xhc3M9ImNvbG9ycy5Db2xvckdhbWVCZWFuIiAvPgorPGpzcDpzZXRQcm9wZXJ0eSBuYW1lPSJjYiIgcHJvcGVydHk9IioiIC8+CisKKzwlCisJY2IucHJvY2Vzc1JlcXVlc3QocmVxdWVzdCk7CislPgorCis8Ym9keSBiZ2NvbG9yPTwlPSBjYi5nZXRDb2xvcjEoKSAlPj4KKzxmb250IHNpemU9NiBjb2xvcj08JT0gY2IuZ2V0Q29sb3IyKCkgJT4+Cis8cD4KKworPCUgaWYgKGNiLmdldEhpbnQoKT09dHJ1ZSkgeyAlPgorCQorCTxwPiBIaW50ICMxOiBWYW1waXJlcyBwcmV5IGF0IG5pZ2h0IQorCTxwPiAgPHA+IEhpbnQgIzI6IE5hbmN5IHdpdGhvdXQgdGhlIG4uCisKKzwlIH0gJT4KKworPCUgaWYgIChjYi5nZXRTdWNjZXNzKCk9PXRydWUpIHsgJT4KKworICAgIDxwPiBDT05HUkFUVUxBVElPTlMhIQorCTwlIGlmICAoY2IuZ2V0SGludFRha2VuKCk9PXRydWUpIHsgJT4KKyAgICAKKyAgICAgICAgPHA+ICggYWx0aG91Z2ggSSBrbm93IHlvdSBjaGVhdGVkIGFuZCBwZWVrZWQgaW50byB0aGUgaGludHMpCisKKwk8JSB9ICU+CisKKzwlIH0gJT4KKworPHA+IFRvdGFsIGF0dGVtcHRzIHNvIGZhcjogPCU9IGNiLmdldEF0dGVtcHRzKCkgJT4KKzxwPgorCis8cD4KKworPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPWNvbHJzLmpzcD4KKworQ29sb3IgIzE6IDxpbnB1dCB0eXBlPXRleHQgbmFtZT0gY29sb3IxIHNpemU9MTY+CisKKzxicj4KKworQ29sb3IgIzI6IDxpbnB1dCB0eXBlPXRleHQgbmFtZT0gY29sb3IyIHNpemU9MTY+CisKKzxwPgorCis8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1hY3Rpb24gdmFsdWU9IlN1Ym1pdCI+Cis8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1hY3Rpb24gdmFsdWU9IkhpbnQiPgorCis8L2Zvcm0+CisKKzwvZm9udD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2RhdGVzL2RhdGUuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2RhdGVzL2RhdGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODNhYjRkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZGF0ZXMvZGF0ZS5odG1sCkBAIC0wLDAgKzEsMzEgQEAKKzxodG1sPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxoZWFkPgorPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJkYXRlLmpzcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSIuLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0iZGF0ZS5qc3AuaHRtbCI+U291cmNlIENvZGUgZm9yIERhdGUgRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZGF0ZXMvZGF0ZS5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9kYXRlcy9kYXRlLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzM2OTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZGF0ZXMvZGF0ZS5qc3AKQEAgLTAsMCArMSw0MSBAQAorPGh0bWw+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCVAIHBhZ2Ugc2Vzc2lvbj0iZmFsc2UiJT4KKworPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorPGpzcDp1c2VCZWFuIGlkPSdjbG9jaycgc2NvcGU9J3BhZ2UnIGNsYXNzPSdkYXRlcy5Kc3BDYWxlbmRhcicgdHlwZT0iZGF0ZXMuSnNwQ2FsZW5kYXIiIC8+CisKKzxmb250IHNpemU9ND4KKzx1bD4KKzxsaT4JRGF5IG9mIG1vbnRoOiBpcyAgPGpzcDpnZXRQcm9wZXJ0eSBuYW1lPSJjbG9jayIgcHJvcGVydHk9ImRheU9mTW9udGgiLz4KKzxsaT4JWWVhcjogaXMgIDxqc3A6Z2V0UHJvcGVydHkgbmFtZT0iY2xvY2siIHByb3BlcnR5PSJ5ZWFyIi8+Cis8bGk+CU1vbnRoOiBpcyAgPGpzcDpnZXRQcm9wZXJ0eSBuYW1lPSJjbG9jayIgcHJvcGVydHk9Im1vbnRoIi8+Cis8bGk+CVRpbWU6IGlzICA8anNwOmdldFByb3BlcnR5IG5hbWU9ImNsb2NrIiBwcm9wZXJ0eT0idGltZSIvPgorPGxpPglEYXRlOiBpcyAgPGpzcDpnZXRQcm9wZXJ0eSBuYW1lPSJjbG9jayIgcHJvcGVydHk9ImRhdGUiLz4KKzxsaT4JRGF5OiBpcyAgPGpzcDpnZXRQcm9wZXJ0eSBuYW1lPSJjbG9jayIgcHJvcGVydHk9ImRheSIvPgorPGxpPglEYXkgT2YgWWVhcjogaXMgIDxqc3A6Z2V0UHJvcGVydHkgbmFtZT0iY2xvY2siIHByb3BlcnR5PSJkYXlPZlllYXIiLz4KKzxsaT4JV2VlayBPZiBZZWFyOiBpcyAgPGpzcDpnZXRQcm9wZXJ0eSBuYW1lPSJjbG9jayIgcHJvcGVydHk9IndlZWtPZlllYXIiLz4KKzxsaT4JZXJhOiBpcyAgPGpzcDpnZXRQcm9wZXJ0eSBuYW1lPSJjbG9jayIgcHJvcGVydHk9ImVyYSIvPgorPGxpPglEU1QgT2Zmc2V0OiBpcyAgPGpzcDpnZXRQcm9wZXJ0eSBuYW1lPSJjbG9jayIgcHJvcGVydHk9IkRTVE9mZnNldCIvPgorPGxpPglab25lIE9mZnNldDogaXMgIDxqc3A6Z2V0UHJvcGVydHkgbmFtZT0iY2xvY2siIHByb3BlcnR5PSJ6b25lT2Zmc2V0Ii8+Cis8L3VsPgorPC9mb250PgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9lcnJvci9lci5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZXJyb3IvZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjc4MTU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZXJyb3IvZXIuaHRtbApAQCAtMCwwICsxLDMxIEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8aGVhZD4KKzx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0iZXJyb3IuaHRtbCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSIuLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0iZXJyLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgRXJyb3IgRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZXJyb3IvZXJyLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2Vycm9yL2Vyci5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyZjc5NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2Vycm9yL2Vyci5qc3AKQEAgLTAsMCArMSw0NCBAQAorPGh0bWw+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxib2R5IGJnY29sb3I9ImxpZ2h0Ymx1ZSI+CisKKwk8JUAgcGFnZSBlcnJvclBhZ2U9ImVycm9ycGdlLmpzcCIgJT4KKwk8anNwOnVzZUJlYW4gaWQ9ImZvbyIgc2NvcGU9InJlcXVlc3QiIGNsYXNzPSJlcnJvci5TbWFydCIgLz4KKwk8JSAKKwkJU3RyaW5nIG5hbWUgPSBudWxsOworCisJCWlmIChyZXF1ZXN0LmdldFBhcmFtZXRlcigibmFtZSIpID09IG51bGwpIHsKKwklPgorCTwlQCBpbmNsdWRlIGZpbGU9Ii9lcnJvci9lcnJvci5odG1sIiAlPgorCTwlCisJCX0gZWxzZSB7CisJCSAgZm9vLnNldE5hbWUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm5hbWUiKSk7CisJCSAgaWYgKGZvby5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiaW50ZWdyYSIpKQorCQkgIAluYW1lID0gImFjdXJhIjsKKwkJICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJhY3VyYSIpKSB7CisJJT4KKworCTxIMT4gWWVzISEhIDxhIGhyZWY9Imh0dHA6Ly93d3cuYWN1cmEuY29tIj5BY3VyYTwvYT4gaXMgbXkgZmF2b3JpdGUgY2FyLgorCisJPCUgCisJCSAgfQorCQl9CQorCSU+CQorPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9lcnJvci9lcnJvci5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZXJyb3IvZXJyb3IuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWIwMjljCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZXJyb3IvZXJyb3IuaHRtbApAQCAtMCwwICsxLDM3IEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+CisKKzxoMT4gVGhpcyBleGFtcGxlIHVzZXMgPGI+ZXJyb3JwYWdlPC9iPiBkaXJlY3RpdmUgPC9oMT4KKzxicj4KKzxoMz4gU2VsZWN0IG15IGZhdm91cml0ZSBjYXIuPC9oMz4KKzxmb3JtIG1ldGhvZD1nZXQgYWN0aW9uPWVyci5qc3A+Cis8IS0tIDxicj4gTWFrZSBhIGd1ZXNzOiAtLT4KKzxTRUxFQ1QgTkFNRT0ibmFtZSIgU0laRT01PgorPE9QVElPTiBWQUxVRT0iaW50ZWdyYSI+IEFjdXJhIEludGVncmEgPEJSPgorPE9QVElPTiBWQUxVRT0iYm13MzI4aSI+IEJNVyAzMjhJIDxCUj4KKzxPUFRJT04gVkFMVUU9InozIj4gQk1XIFozIDxCUj4KKzxPUFRJT04gVkFMVUU9ImluZmluaXRpIj4gSW5maW5pdGlRMyA8QlI+Cis8T1BUSU9OIFZBTFVFPSJhdWRpIj4gQXVkaSBBOCA8QlI+Cis8L1NFTEVDVD4KKzxicj4gPElOUFVUIFRZUEU9c3VibWl0IG5hbWU9c3VibWl0IFZhbHVlPSJTdWJtaXQiPgorPC9mb3JtPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9lcnJvci9lcnJvcnBnZS5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9lcnJvci9lcnJvcnBnZS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlZWJjZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2Vycm9yL2Vycm9ycGdlLmpzcApAQCAtMCwwICsxLDI1IEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Ym9keSBiZ2NvbG9yPSJyZWQiPgorCisJPCVAIHBhZ2UgaXNFcnJvclBhZ2U9InRydWUiICU+CisJPGgxPiBUaGUgZXhjZXB0aW9uIDwlPSBleGNlcHRpb24uZ2V0TWVzc2FnZSgpICU+IHRlbGxzIG1lIHlvdQorCSAgICAgbWFkZSBhIHdyb25nIGNob2ljZS4gCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9mb3J3YXJkL2ZvcndhcmQuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZm9yd2FyZC9mb3J3YXJkLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTM3ZmQwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZm9yd2FyZC9mb3J3YXJkLmpzcApAQCAtMCwwICsxLDIyIEBACis8aHRtbD4KKzwhLS0KKyAgQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCisgIHJlc2VydmVkLgorLS0+CisKKzwlIAorICAgZG91YmxlIGZyZWVNZW0gPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCk7CisgICBkb3VibGUgdG90bE1lbSA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLnRvdGFsTWVtb3J5KCk7CisgICBkb3VibGUgcGVyY2VudCA9IGZyZWVNZW0vdG90bE1lbTsKKyAgIGlmIChwZXJjZW50IDwgMC41KSB7IAorJT4KKworPGpzcDpmb3J3YXJkIHBhZ2U9Ii9mb3J3YXJkL29uZS5qc3AiLz4KKworPCUgfSBlbHNlIHsgJT4KKworPGpzcDpmb3J3YXJkIHBhZ2U9InR3by5odG1sIi8+CisKKzwlIH0gJT4KKworPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZm9yd2FyZC9md2QuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ZvcndhcmQvZndkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgwYTUzZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ZvcndhcmQvZndkLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICByZXNlcnZlZC4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9ImZvcndhcmQuanNwIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJmb3J3YXJkLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgRm9yd2FyZCBFeGFtcGxlPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9mb3J3YXJkL29uZS5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9mb3J3YXJkL29uZS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmZTZmMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ZvcndhcmQvb25lLmpzcApAQCAtMCwwICsxLDExIEBACis8aHRtbD4KKzwhLS0KKyAgQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCisgIHJlc2VydmVkLgorLS0+CisKKzxib2R5IGJnY29sb3I9IndoaXRlIj4KKzxmb250IGNvbG9yPSJyZWQiPgorCitWTSBNZW1vcnkgdXNhZ2UgPCA1MCUuCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZm9yd2FyZC90d28uaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ZvcndhcmQvdHdvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjMjkxNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ZvcndhcmQvdHdvLmh0bWwKQEAgLTAsMCArMSwxMSBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICByZXNlcnZlZC4KKy0tPgorCis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+Cis8Zm9udCBjb2xvcj0icmVkIj4KKworVk0gTWVtb3J5IHVzYWdlID4gNTAlLgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ltYWdlcy9jb2RlLmdpZiBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ltYWdlcy9jb2RlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2FmMmNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW1hZ2VzL2NvZGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ltYWdlcy9leGVjdXRlLmdpZiBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ltYWdlcy9leGVjdXRlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjRkNzBmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW1hZ2VzL2V4ZWN1dGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ltYWdlcy9yZWFkLmdpZiBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ltYWdlcy9yZWFkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmNiNGU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW1hZ2VzL3JlYWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ltYWdlcy9yZXR1cm4uZ2lmIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW1hZ2VzL3JldHVybi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0ZjY4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ltYWdlcy9yZXR1cm4uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2luY2x1ZGUvZm9vLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9pbmNsdWRlL2Zvby5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OGM4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9pbmNsdWRlL2Zvby5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorVG8gZ2V0IHRoZSBjdXJyZW50IHRpbWUgaW4gbXMKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2luY2x1ZGUvZm9vLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2luY2x1ZGUvZm9vLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWUzZTgzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW5jbHVkZS9mb28uanNwCkBAIC0wLDAgKzEsMjEgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+Cis8Zm9udCBjb2xvcj0icmVkIj4KKworPCU9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICU+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9pbmNsdWRlL2luYy5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW5jbHVkZS9pbmMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWRhZWQwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW5jbHVkZS9pbmMuaHRtbApAQCAtMCwwICsxLDMwIEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9ImluY2x1ZGUuanNwIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJpbmNsdWRlLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgSW5jbHVkZSBFeGFtcGxlPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9pbmNsdWRlL2luY2x1ZGUuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW5jbHVkZS9pbmNsdWRlLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjI5NTlkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW5jbHVkZS9pbmNsdWRlLmpzcApAQCAtMCwwICsxLDM1IEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+CisKKzxmb250IGNvbG9yPSJyZWQiPgorCis8JUAgcGFnZSBidWZmZXI9IjVrYiIgYXV0b0ZsdXNoPSJmYWxzZSIgJT4KKworPHA+SW4gcGxhY2UgZXZhbHVhdGlvbiBvZiBhbm90aGVyIEpTUCB3aGljaCBnaXZlcyB5b3UgdGhlIGN1cnJlbnQgdGltZToKKworPCVAIGluY2x1ZGUgZmlsZT0iZm9vLmpzcCIgJT4KKworPHA+IDxqc3A6aW5jbHVkZSBwYWdlPSIvaW5jbHVkZS9mb28uaHRtbCIgZmx1c2g9InRydWUiLz4gYnkgaW5jbHVkaW5nIHRoZSBvdXRwdXQgb2YgYW5vdGhlciBKU1A6CisKKzxqc3A6aW5jbHVkZSBwYWdlPSJmb28uanNwIiBmbHVzaD0idHJ1ZSIvPgorCis6LSkgCisKKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2luZGV4Lmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NzgyYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9pbmRleC5odG1sCkBAIC0wLDAgKzEsMzc0IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+CitcPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNjEgW2VuXSAoV2luTlQ7IEkpIFtOZXRzY2FwZV0iPgorICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJBbmlsIEsuIFZpamVuZHJhbiI+CisgICA8dGl0bGU+SlNQIEV4YW1wbGVzPC90aXRsZT4KKzwhLS0KKyAgQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCisgIHJlc2VydmVkLgorLS0+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxiPjxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiPjxmb250IHNpemU9KzI+SlNQCitTYW1wbGVzPC9mb250PjwvZm9udD48L2I+Cis8cD5UaGlzIGlzIGEgY29sbGVjdGlvbiBvZiBzYW1wbGVzIGRlbW9uc3RyYXRpbmcgdGhlIHVzYWdlIG9mIGRpZmZlcmVudAorcGFydHMgb2YgdGhlIEphdmEgU2VydmVyIFBhZ2VzIChKU1ApIHNwZWNpZmljYXRpb24uICBCb3RoIEpTUCAyLjAgYW5kCitKU1AgMS4yIGV4YW1wbGVzIGFyZSBwcmVzZW50ZWQgYmVsb3cuCis8cD5UaGVzZSBleGFtcGxlcyB3aWxsIG9ubHkgd29yayB3aGVuIHRoZXNlIHBhZ2VzIGFyZSBiZWluZyBzZXJ2ZWQgYnkgYQorc2VydmxldCBlbmdpbmU7IG9mIGNvdXJzZSwgd2UgcmVjb21tZW5kCis8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RvbWNhdC8iPlRvbWNhdDwvYT4uCitUaGV5IHdpbGwgbm90IHdvcmsgaWYgeW91IGFyZSB2aWV3aW5nIHRoZXNlIHBhZ2VzIHZpYSBhCisiZmlsZTovLy4uLiIgVVJMLgorPHA+VG8gbmF2aWdhdGUgeW91ciB3YXkgdGhyb3VnaCB0aGUgZXhhbXBsZXMsIHRoZSBmb2xsb3dpbmcgaWNvbnMgd2lsbAoraGVscDoKKzxicj4mbmJzcDsKKzx0YWJsZSBCT1JERVI9MCBDRUxMU1BBQ0lORz01IFdJRFRIPSI4NSUiID4KKzx0ciBWQUxJR049VE9QPgorPHRkIFdJRFRIPSIzMCI+PGltZyBTUkM9ImltYWdlcy9leGVjdXRlLmdpZiIgPjwvdGQ+CisKKzx0ZD5FeGVjdXRlIHRoZSBleGFtcGxlPC90ZD4KKzwvdHI+CisKKzx0ciBWQUxJR049VE9QPgorPHRkIFdJRFRIPSIzMCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgaGVpZ2h0PTI0IHdpZHRoPTI0PjwvdGQ+CisKKzx0ZD5Mb29rIGF0IHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIGV4YW1wbGU8L3RkPgorPC90cj4KKworPCEtLTx0ciBWQUxJR049VE9QPgorPHRkIFdJRFRIPSIzMCI+PGltZyBTUkM9ImltYWdlcy9yZWFkLmdpZiIgaGVpZ2h0PTI0IHdpZHRoPTI0PjwvdGQ+CisKKzx0ZD5SZWFkIG1vcmUgYWJvdXQgdGhpcyBmZWF0dXJlPC90ZD4KKy0tPgorCis8L3RyPgorPHRyIFZBTElHTj1UT1A+Cis8dGQgV0lEVEg9IjMwIj48aW1nIFNSQz0iaW1hZ2VzL3JldHVybi5naWYiIGhlaWdodD0yNCB3aWR0aD0yND48L3RkPgorCis8dGQ+UmV0dXJuIHRvIHRoaXMgc2NyZWVuPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCis8cD5UaXA6IEZvciBzZXNzaW9uIHNjb3BlZCBiZWFucyB0byB3b3JrLCB0aGUgY29va2llcyBtdXN0IGJlIGVuYWJsZWQuCitUaGlzIGNhbiBiZSBkb25lIHVzaW5nIGJyb3dzZXIgb3B0aW9ucy4KKzxicj4mbmJzcDsKKzxicj4KKzxiPjx1Pjxmb250IHNpemU9IisxIj5KU1AgMi4wIEV4YW1wbGVzPC9mb250PjwvdT48L2I+PGJyPgorCis8dGFibGUgQk9SREVSPTAgQ0VMTFNQQUNJTkc9NSBXSURUSD0iODUlIiA+Cis8dHIgdmFsaWduPVRPUD4KKzx0ZD48Yj5FeHByZXNzaW9uIExhbmd1YWdlPC9iPjwvdGQ+Cis8L3RyPgorCis8dHIgdmFsaWduPVRPUD4KKzx0ZD5CYXNpYyBBcml0aG1ldGljPC90ZD4KKzx0ZCB2YWxpZ249VE9QIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvZWwvYmFzaWMtYXJpdGhtZXRpYy5qc3AiPjxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0ZS5naWYiIGhzcGFjZT00IGJvcmRlcj0wICBhbGlnbj10b3A+PC9hPjxhIGhyZWY9ImpzcDIvZWwvYmFzaWMtYXJpdGhtZXRpYy5qc3AiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvZWwvYmFzaWMtYXJpdGhtZXRpYy5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJqc3AyL2VsL2Jhc2ljLWFyaXRobWV0aWMuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgdmFsaWduPVRPUD4KKzx0ZD5CYXNpYyBDb21wYXJpc29uczwvdGQ+Cis8dGQgdmFsaWduPVRPUCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL2VsL2Jhc2ljLWNvbXBhcmlzb25zLmpzcCI+PGltZyBzcmM9ImltYWdlcy9leGVjdXRlLmdpZiIgaHNwYWNlPTQgYm9yZGVyPTAgIGFsaWduPXRvcD48L2E+PGEgaHJlZj0ianNwMi9lbC9iYXNpYy1jb21wYXJpc29ucy5qc3AiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvZWwvYmFzaWMtY29tcGFyaXNvbnMuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0ianNwMi9lbC9iYXNpYy1jb21wYXJpc29ucy5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciB2YWxpZ249VE9QPgorPHRkPkltcGxpY2l0IE9iamVjdHM8L3RkPgorPHRkIHZhbGlnbj1UT1Agd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9lbC9pbXBsaWNpdC1vYmplY3RzLmpzcD9mb289YmFyIj48aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBoc3BhY2U9NCBib3JkZXI9MCAgYWxpZ249dG9wPjwvYT48YSBocmVmPSJqc3AyL2VsL2ltcGxpY2l0LW9iamVjdHMuanNwP2Zvbz1iYXIiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvZWwvaW1wbGljaXQtb2JqZWN0cy5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJqc3AyL2VsL2ltcGxpY2l0LW9iamVjdHMuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorPHRyIHZhbGlnbj1UT1A+CisKKzx0ZD5GdW5jdGlvbnM8L3RkPgorPHRkIHZhbGlnbj1UT1Agd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9lbC9mdW5jdGlvbnMuanNwP2Zvbz1KU1ArMi4wIj48aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBoc3BhY2U9NCBib3JkZXI9MCAgYWxpZ249dG9wPjwvYT48YSBocmVmPSJqc3AyL2VsL2Z1bmN0aW9ucy5qc3A/Zm9vPUpTUCsyLjAiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvZWwvZnVuY3Rpb25zLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImpzcDIvZWwvZnVuY3Rpb25zLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIHZhbGlnbj1UT1A+Cis8dGQ+PGJyPjxiPlNpbXBsZVRhZyBIYW5kbGVycyBhbmQgSlNQIEZyYWdtZW50czwvYj48L3RkPgorPC90cj4KKworPHRyIHZhbGlnbj1UT1A+Cis8dGQ+SGVsbG8gV29ybGQgVGFnPC90ZD4KKzx0ZCB2YWxpZ249VE9QIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvc2ltcGxldGFnL2hlbGxvLmpzcCI+PGltZyBzcmM9ImltYWdlcy9leGVjdXRlLmdpZiIgaHNwYWNlPTQgYm9yZGVyPTAgIGFsaWduPXRvcD48L2E+PGEgaHJlZj0ianNwMi9zaW1wbGV0YWcvaGVsbG8uanNwIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL3NpbXBsZXRhZy9oZWxsby5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJqc3AyL3NpbXBsZXRhZy9oZWxsby5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciB2YWxpZ249VE9QPgorPHRkPlJlcGVhdCBUYWc8L3RkPgorPHRkIHZhbGlnbj1UT1Agd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9zaW1wbGV0YWcvcmVwZWF0LmpzcCI+PGltZyBzcmM9ImltYWdlcy9leGVjdXRlLmdpZiIgaHNwYWNlPTQgYm9yZGVyPTAgIGFsaWduPXRvcD48L2E+PGEgaHJlZj0ianNwMi9zaW1wbGV0YWcvcmVwZWF0LmpzcCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9zaW1wbGV0YWcvcmVwZWF0Lmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImpzcDIvc2ltcGxldGFnL3JlcGVhdC5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciB2YWxpZ249VE9QPgorPHRkPkJvb2sgRXhhbXBsZTwvdGQ+Cis8dGQgdmFsaWduPVRPUCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL3NpbXBsZXRhZy9ib29rLmpzcCI+PGltZyBzcmM9ImltYWdlcy9leGVjdXRlLmdpZiIgaHNwYWNlPTQgYm9yZGVyPTAgIGFsaWduPXRvcD48L2E+PGEgaHJlZj0ianNwMi9zaW1wbGV0YWcvYm9vay5qc3AiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvc2ltcGxldGFnL2Jvb2suaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0ianNwMi9zaW1wbGV0YWcvYm9vay5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciB2YWxpZ249VE9QPgorPHRkPjxicj48Yj5UYWcgRmlsZXM8L2I+PC90ZD4KKzwvdHI+CisKKzx0ciB2YWxpZ249VE9QPgorPHRkPkhlbGxvIFdvcmxkIFRhZyBGaWxlPC90ZD4KKzx0ZCB2YWxpZ249VE9QIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvdGFnZmlsZXMvaGVsbG8uanNwIj48aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBoc3BhY2U9NCBib3JkZXI9MCAgYWxpZ249dG9wPjwvYT48YSBocmVmPSJqc3AyL3RhZ2ZpbGVzL2hlbGxvLmpzcCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi90YWdmaWxlcy9oZWxsby5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJqc3AyL3RhZ2ZpbGVzL2hlbGxvLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIHZhbGlnbj1UT1A+Cis8dGQ+UGFuZWwgVGFnIEZpbGU8L3RkPgorPHRkIHZhbGlnbj1UT1Agd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi90YWdmaWxlcy9wYW5lbC5qc3AiPjxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0ZS5naWYiIGhzcGFjZT00IGJvcmRlcj0wICBhbGlnbj10b3A+PC9hPjxhIGhyZWY9ImpzcDIvdGFnZmlsZXMvcGFuZWwuanNwIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL3RhZ2ZpbGVzL3BhbmVsLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImpzcDIvdGFnZmlsZXMvcGFuZWwuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgdmFsaWduPVRPUD4KKzx0ZD5EaXNwbGF5IFByb2R1Y3RzIEV4YW1wbGU8L3RkPgorPHRkIHZhbGlnbj1UT1Agd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi90YWdmaWxlcy9wcm9kdWN0cy5qc3AiPjxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0ZS5naWYiIGhzcGFjZT00IGJvcmRlcj0wICBhbGlnbj10b3A+PC9hPjxhIGhyZWY9ImpzcDIvdGFnZmlsZXMvcHJvZHVjdHMuanNwIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL3RhZ2ZpbGVzL3Byb2R1Y3RzLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImpzcDIvdGFnZmlsZXMvcHJvZHVjdHMuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgdmFsaWduPVRPUD4KKzx0ZD48YnI+PGI+TmV3IEpTUCBYTUwgU3ludGF4ICguanNweCk8L2I+PC90ZD4KKzwvdHI+CisKKzx0ciB2YWxpZ249VE9QPgorPHRkPlhIVE1MIEJhc2ljIEV4YW1wbGU8L3RkPgorPHRkIHZhbGlnbj1UT1Agd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9qc3B4L2Jhc2ljLmpzcHgiPjxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0ZS5naWYiIGhzcGFjZT00IGJvcmRlcj0wICBhbGlnbj10b3A+PC9hPjxhIGhyZWY9ImpzcDIvanNweC9iYXNpYy5qc3B4Ij5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL2pzcHgvYmFzaWMuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0ianNwMi9qc3B4L2Jhc2ljLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIHZhbGlnbj1UT1A+Cis8dGQ+U1ZHIChTY2FsYWJsZSBWZWN0b3IgR3JhcGhpY3MpPC90ZD4KKzx0ZCB2YWxpZ249VE9QIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvanNweC9zdmdleGFtcGxlLmh0bWwiPjxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0ZS5naWYiIGhzcGFjZT00IGJvcmRlcj0wICBhbGlnbj10b3A+PC9hPjxhIGhyZWY9ImpzcDIvanNweC9zdmdleGFtcGxlLmh0bWwiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvanNweC90ZXh0Um90YXRlLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImpzcDIvanNweC90ZXh0Um90YXRlLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIHZhbGlnbj1UT1A+Cis8dGQ+PGJyPjxiPk90aGVyIEpTUCAyLjAgRmVhdHVyZXM8L2I+PC90ZD4KKzwvdHI+CisKKzx0ciB2YWxpZ249VE9QPgorPHRkPiZsdDtqc3A6YXR0cmlidXRlJmd0OyBhbmQgJmx0O2pzcDpib2R5Jmd0OzwvdGQ+Cis8dGQgdmFsaWduPVRPUCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL2pzcGF0dHJpYnV0ZS9qc3BhdHRyaWJ1dGUuanNwIj48aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBoc3BhY2U9NCBib3JkZXI9MCAgYWxpZ249dG9wPjwvYT48YSBocmVmPSJqc3AyL2pzcGF0dHJpYnV0ZS9qc3BhdHRyaWJ1dGUuanNwIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL2pzcGF0dHJpYnV0ZS9qc3BhdHRyaWJ1dGUuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0ianNwMi9qc3BhdHRyaWJ1dGUvanNwYXR0cmlidXRlLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIHZhbGlnbj1UT1A+Cis8dGQ+U2h1ZmZsZSBFeGFtcGxlPC90ZD4KKzx0ZCB2YWxpZ249VE9QIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvanNwYXR0cmlidXRlL3NodWZmbGUuanNwIj48aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBoc3BhY2U9NCBib3JkZXI9MCAgYWxpZ249dG9wPjwvYT48YSBocmVmPSJqc3AyL2pzcGF0dHJpYnV0ZS9zaHVmZmxlLmpzcCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9qc3BhdHRyaWJ1dGUvc2h1ZmZsZS5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJqc3AyL2pzcGF0dHJpYnV0ZS9zaHVmZmxlLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIHZhbGlnbj1UT1A+Cis8dGQ+QXR0cmlidXRlcyBXaXRoIER5bmFtaWMgTmFtZXM8L3RkPgorPHRkIHZhbGlnbj1UT1Agd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9taXNjL2R5bmFtaWNhdHRycy5qc3AiPjxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0ZS5naWYiIGhzcGFjZT00IGJvcmRlcj0wICBhbGlnbj10b3A+PC9hPjxhIGhyZWY9ImpzcDIvbWlzYy9keW5hbWljYXR0cnMuanNwIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL21pc2MvZHluYW1pY2F0dHJzLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImpzcDIvbWlzYy9keW5hbWljYXR0cnMuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgdmFsaWduPVRPUD4KKzx0ZD5KU1AgQ29uZmlndXJhdGlvbjwvdGQ+Cis8dGQgdmFsaWduPVRPUCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL21pc2MvY29uZmlnLmpzcCI+PGltZyBzcmM9ImltYWdlcy9leGVjdXRlLmdpZiIgaHNwYWNlPTQgYm9yZGVyPTAgIGFsaWduPXRvcD48L2E+PGEgaHJlZj0ianNwMi9taXNjL2NvbmZpZy5qc3AiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvbWlzYy9jb25maWcuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0ianNwMi9taXNjL2NvbmZpZy5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzwvdGFibGU+CisKKzxicj4KKzxiPjx1Pjxmb250IHNpemU9IisxIj5KU1AgMS4yIEV4YW1wbGVzPC9mb250PjwvdT48L2I+PGJyPgorPHRhYmxlIEJPUkRFUj0wIENFTExTUEFDSU5HPTUgV0lEVEg9Ijg1JSIgPgorPHRyIFZBTElHTj1UT1A+Cis8dGQ+TnVtYmVyZ3Vlc3MmbmJzcDs8L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMzAlIj48YSBocmVmPSJudW0vbnVtZ3Vlc3MuanNwIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCAgYWxpZ249VE9QPjwvYT48YSBocmVmPSJudW0vbnVtZ3Vlc3MuanNwIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCBXSURUSD0iMzAlIj48YSBocmVmPSJudW0vbnVtZ3Vlc3MuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0ibnVtL251bWd1ZXNzLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIFZBTElHTj1UT1A+Cis8dGQ+RGF0ZSZuYnNwOzwvdGQ+CisKKzx0ZCBWQUxJR049VE9QIFdJRFRIPSIzMCUiPjxhIGhyZWY9ImRhdGVzL2RhdGUuanNwIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCAgYWxpZ249VE9QPjwvYT48YSBocmVmPSJkYXRlcy9kYXRlLmpzcCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0iZGF0ZXMvZGF0ZS5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJkYXRlcy9kYXRlLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIFZBTElHTj1UT1A+Cis8dGQ+U25vb3A8L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0ic25wL3Nub29wLmpzcCI+PGltZyBTUkM9ImltYWdlcy9leGVjdXRlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgIGFsaWduPVRPUD48L2E+PGEgaHJlZj0ic25wL3Nub29wLmpzcCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0ic25wL3Nub29wLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InNucC9zbm9vcC5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciBWQUxJR049VE9QPgorPHRkPkVycm9yUGFnZSZuYnNwOzwvdGQ+CisKKzx0ZCBXSURUSD0iMzAlIj48YSBocmVmPSJlcnJvci9lcnJvci5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCAgYWxpZ249VE9QPjwvYT48YSBocmVmPSJlcnJvci9lcnJvci5odG1sIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCBXSURUSD0iMzAlIj48YSBocmVmPSJlcnJvci9lci5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJlcnJvci9lci5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciBWQUxJR049VE9QPgorPHRkPkNhcnRzJm5ic3A7PC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9IjMwJSI+PGEgaHJlZj0ic2Vzc2lvbnMvY2FydHMuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9leGVjdXRlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgIGFsaWduPVRPUD48L2E+PGEgaHJlZj0ic2Vzc2lvbnMvY2FydHMuaHRtbCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0ic2Vzc2lvbnMvY3J0Lmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InNlc3Npb25zL2NydC5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciBWQUxJR049VE9QPgorPHRkPkNoZWNrYm94Jm5ic3A7PC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9IjMwJSI+PGEgaHJlZj0iY2hlY2tib3gvY2hlY2suaHRtbCI+PGltZyBTUkM9ImltYWdlcy9leGVjdXRlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgIGFsaWduPVRPUD48L2E+PGEgaHJlZj0iY2hlY2tib3gvY2hlY2suaHRtbCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0iY2hlY2tib3gvY3Jlc3VsdC5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJjaGVja2JveC9jcmVzdWx0Lmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIFZBTElHTj1UT1A+Cis8dGQ+Q29sb3ImbmJzcDs8L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMzAlIj48YSBocmVmPSJjb2xvcnMvY29sb3JzLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImNvbG9ycy9jb2xvcnMuaHRtbCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0iY29sb3JzL2Nsci5odG1sLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImNvbG9ycy9jbHIuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgVkFMSUdOPVRPUD4KKzx0ZD5DYWxlbmRhciZuYnNwOzwvdGQ+CisKKzx0ZCBXSURUSD0iMzAlIj48YSBocmVmPSJjYWwvbG9naW4uaHRtbCI+PGltZyBTUkM9ImltYWdlcy9leGVjdXRlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgIGFsaWduPVRPUD48L2E+PGEgaHJlZj0iY2FsL2xvZ2luLmh0bWwiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9ImNhbC9jYWxlbmRhci5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJjYWwvY2FsZW5kYXIuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgVkFMSUdOPVRPUD4KKzx0ZD5JbmNsdWRlJm5ic3A7PC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9IjMwJSI+PGEgaHJlZj0iL2luY2x1ZGUvaW5jbHVkZS5qc3AiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImluY2x1ZGUvaW5jbHVkZS5qc3AiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9ImluY2x1ZGUvaW5jLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImluY2x1ZGUvaW5jLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIFZBTElHTj1UT1A+Cis8dGQ+Rm9yd2FyZCZuYnNwOzwvdGQ+CisKKzx0ZCBWQUxJR049VE9QIFdJRFRIPSIzMCUiPjxhIGhyZWY9ImZvcndhcmQvZm9yd2FyZC5qc3AiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImZvcndhcmQvZm9yd2FyZC5qc3AiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9ImZvcndhcmQvZndkLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImZvcndhcmQvZndkLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIFZBTElHTj1UT1A+Cis8dGQ+UGx1Z2luJm5ic3A7PC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9IjMwJSI+PGEgaHJlZj0icGx1Z2luL3BsdWdpbi5qc3AiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InBsdWdpbi9wbHVnaW4uanNwIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCBXSURUSD0iMzAlIj48YSBocmVmPSJwbHVnaW4vcGx1Z2luLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InBsdWdpbi9wbHVnaW4uaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgVkFMSUdOPVRPUD4KKzx0ZD5KU1AtU2VydmxldC1KU1AmbmJzcDs8L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMzAlIj48YSBocmVmPSJqc3B0b3NlcnYvanNwdG9zZXJ2bGV0LmpzcCI+PGltZyBTUkM9ImltYWdlcy9leGVjdXRlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgIGFsaWduPVRPUD48L2E+PGEgaHJlZj0ianNwdG9zZXJ2L2pzcHRvc2VydmxldC5qc3AiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9ImpzcHRvc2Vydi9qdHMuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0ianNwdG9zZXJ2L2p0cy5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciBWQUxJR049VE9QPgorPHRkPkN1c3RvbSB0YWcgZXhhbXBsZTwvdGQ+CisKKzx0ZCBWQUxJR049VE9QIFdJRFRIPSIzMCUiPjxhIGhyZWY9InNpbXBsZXRhZy9mb28uanNwIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCAgYWxpZ249VE9QPjwvYT48YSBocmVmPSJzaW1wbGV0YWcvZm9vLmpzcCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0ic2ltcGxldGFnL2Zvby5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJzaW1wbGV0YWcvZm9vLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIHZhbGlnbj1UT1A+Cis8dGQ+WE1MIHN5bnRheCBleGFtcGxlPC90ZD4KKzx0ZCB2YWxpZ249VE9QIHdpZHRoPSIzMCUiPjxhIGhyZWY9InhtbC94bWwuanNwIj48aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBoc3BhY2U9NCBib3JkZXI9MCAgYWxpZ249dG9wPjwvYT48YSBocmVmPSJ4bWwveG1sLmpzcCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgd2lkdGg9IjMwJSI+PGEgaHJlZj0ieG1sL3htbC5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJ4bWwveG1sLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPC90YWJsZT4KKworPGJyLz4KKzxiPjx1Pjxmb250IHNpemU9IisxIj5UYWcgUGx1Z2luczwvZm9udD48L3U+PC9iPjxicj4KKzx0YWJsZSBCT1JERVI9MCBDRUxMU1BBQ0lORz01IFdJRFRIPSI4NSUiID4KKworPHRyIFZBTElHTj1UT1A+CisgIDx0ZD5JZiZuYnNwOzwvdGQ+CisgIDx0ZCBWQUxJR049VE9QIFdJRFRIPSIzMCUiPgorICAgIDxhIGhyZWY9InRhZ3BsdWdpbi9pZi5qc3AiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICAKK2FsaWduPVRPUD48L2E+CisgICAgPGEgaHJlZj0idGFncGx1Z2luL2lmLmpzcCI+RXhlY3V0ZTwvYT4KKyAgPC90ZD4KKyAgPHRkIFdJRFRIPSIzMCUiPgorICAgIDxhIGhyZWY9InRhZ3BsdWdpbi9pZi5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWkKK2dodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPgorICAgIDxhIGhyZWY9InRhZ3BsdWdpbi9pZi5odG1sIj5Tb3VyY2U8L2E+CisgIDwvdGQ+Cis8L3RyPgorCis8dHIgVkFMSUdOPVRPUD4KKyAgPHRkPkZvckVhY2gmbmJzcDs8L3RkPgorICA8dGQgVkFMSUdOPVRPUCBXSURUSD0iMzAlIj4KKyAgICA8YSBocmVmPSJ0YWdwbHVnaW4vZm9yZWFjaC5qc3AiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICAKK2FsaWduPVRPUD48L2E+CisgICAgPGEgaHJlZj0idGFncGx1Z2luL2ZvcmVhY2guanNwIj5FeGVjdXRlPC9hPgorICA8L3RkPgorICA8dGQgV0lEVEg9IjMwJSI+CisgICAgPGEgaHJlZj0idGFncGx1Z2luL2ZvcmVhY2guaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpCitnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT4KKyAgICA8YSBocmVmPSJ0YWdwbHVnaW4vZm9yZWFjaC5odG1sIj5Tb3VyY2U8L2E+CisgIDwvdGQ+Cis8L3RyPgorCis8dHIgVkFMSUdOPVRPUD4KKyAgPHRkPkNob29zZSZuYnNwOzwvdGQ+CisgIDx0ZCBWQUxJR049VE9QIFdJRFRIPSIzMCUiPgorICAgIDxhIGhyZWY9InRhZ3BsdWdpbi9jaG9vc2UuanNwIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCAgYWxpZ249VE9QPjwvYT4KKyAgICA8YSBocmVmPSJ0YWdwbHVnaW4vY2hvb3NlLmpzcCI+RXhlY3V0ZTwvYT4KKyAgPC90ZD4KKyAgPHRkIFdJRFRIPSIzMCUiPgorICAgIDxhIGhyZWY9InRhZ3BsdWdpbi9jaG9vc2UuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+CisgICAgPGEgaHJlZj0idGFncGx1Z2luL2Nob29zZS5odG1sIj5Tb3VyY2U8L2E+CisgIDwvdGQ+Cis8L3RyPgorCis8L3RhYmxlPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2Jhc2ljLWFyaXRobWV0aWMuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvYmFzaWMtYXJpdGhtZXRpYy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMmYwYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2Jhc2ljLWFyaXRobWV0aWMuaHRtbApAQCAtMCwwICsxLDMwIEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VmlldyBTb3VyY2UgQ29kZTwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0iYmFzaWMtYXJpdGhtZXRpYy5qc3AiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9ImJhc2ljLWFyaXRobWV0aWMuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBCYXNpYyBBcml0aG1ldGljIEV4YW1wbGU8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvYmFzaWMtYXJpdGhtZXRpYy5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2Jhc2ljLWFyaXRobWV0aWMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YWE3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2Jhc2ljLWFyaXRobWV0aWMuanNwCkBAIC0wLDAgKzEsODggQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5KU1AgMi4wIEV4cHJlc3Npb24gTGFuZ3VhZ2UgLSBCYXNpYyBBcml0aG1ldGljPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+SlNQIDIuMCBFeHByZXNzaW9uIExhbmd1YWdlIC0gQmFzaWMgQXJpdGhtZXRpYzwvaDE+CisgICAgPGhyPgorICAgIFRoaXMgZXhhbXBsZSBpbGx1c3RyYXRlcyBiYXNpYyBFeHByZXNzaW9uIExhbmd1YWdlIGFyaXRobWV0aWMuCisgICAgQWRkaXRpb24gKCspLCBzdWJ0cmFjdGlvbiAoLSksIG11bHRpcGxpY2F0aW9uICgqKSwgZGl2aXNpb24gKC8gb3IgZGl2KSwgCisgICAgYW5kIG1vZHVsdXMgKCUgb3IgbW9kKSBhcmUgYWxsIHN1cHBvcnRlZC4gIEVycm9yIGNvbmRpdGlvbnMsIGxpa2UKKyAgICBkaXZpc2lvbiBieSB6ZXJvLCBhcmUgaGFuZGxlZCBncmFjZWZ1bGx5LgorICAgIDxicj4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxjb2RlPgorICAgICAgICA8dGFibGUgYm9yZGVyPSIxIj4KKyAgICAgICAgICA8dGhlYWQ+CisJICAgIDx0ZD48Yj5FTCBFeHByZXNzaW9uPC9iPjwvdGQ+CisJICAgIDx0ZD48Yj5SZXN1bHQ8L2I+PC90ZD4KKwkgIDwvdGhlYWQ+CisJICA8dHI+CisJICAgIDx0ZD5cJHsxfTwvdGQ+CisJICAgIDx0ZD4kezF9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHsxICsgMn08L3RkPgorCSAgICA8dGQ+JHsxICsgMn08L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwkezEuMiArIDIuM308L3RkPgorCSAgICA8dGQ+JHsxLjIgKyAyLjN9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHsxLjJFNCArIDEuNH08L3RkPgorCSAgICA8dGQ+JHsxLjJFNCArIDEuNH08L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwkey00IC0gMn08L3RkPgorCSAgICA8dGQ+JHstNCAtIDJ9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHsyMSAqIDJ9PC90ZD4KKwkgICAgPHRkPiR7MjEgKiAyfTwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7My80fTwvdGQ+CisJICAgIDx0ZD4kezMvNH08L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwkezMgZGl2IDR9PC90ZD4KKwkgICAgPHRkPiR7MyBkaXYgNH08L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwkezMvMH08L3RkPgorCSAgICA8dGQ+JHszLzB9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHsxMCU0fTwvdGQ+CisJICAgIDx0ZD4kezEwJTR9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHsxMCBtb2QgNH08L3RkPgorCSAgICA8dGQ+JHsxMCBtb2QgNH08L3RkPgorCSAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+XCR7KDE9PTIpID8gMyA6IDR9PC90ZD4KKyAgICAgIDx0ZD4keygxPT0yKSA/IDMgOiA0fTwvdGQ+CisgICAgPC90cj4KKwk8L3RhYmxlPgorICAgICAgPC9jb2RlPgorICAgIDwvYmxvY2txdW90ZT4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9lbC9iYXNpYy1jb21wYXJpc29ucy5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9lbC9iYXNpYy1jb21wYXJpc29ucy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZmI0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2Jhc2ljLWNvbXBhcmlzb25zLmh0bWwKQEAgLTAsMCArMSwzMCBAQAorPGh0bWw+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxoZWFkPgorPHRpdGxlPlZpZXcgU291cmNlIENvZGU8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9ImJhc2ljLWNvbXBhcmlzb25zLmpzcCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0iYmFzaWMtY29tcGFyaXNvbnMuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBCYXNpYyBDb21wYXJpc29ucyBFeGFtcGxlPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2Jhc2ljLWNvbXBhcmlzb25zLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvYmFzaWMtY29tcGFyaXNvbnMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTZjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2Jhc2ljLWNvbXBhcmlzb25zLmpzcApAQCAtMCwwICsxLDExNiBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkpTUCAyLjAgRXhwcmVzc2lvbiBMYW5ndWFnZSAtIEJhc2ljIENvbXBhcmlzb25zPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+SlNQIDIuMCBFeHByZXNzaW9uIExhbmd1YWdlIC0gQmFzaWMgQ29tcGFyaXNvbnM8L2gxPgorICAgIDxocj4KKyAgICBUaGlzIGV4YW1wbGUgaWxsdXN0cmF0ZXMgYmFzaWMgRXhwcmVzc2lvbiBMYW5ndWFnZSBjb21wYXJpc29ucy4KKyAgICBUaGUgZm9sbG93aW5nIGNvbXBhcmlzb24gb3BlcmF0b3JzIGFyZSBzdXBwb3J0ZWQ6CisgICAgPHVsPgorICAgICAgPGxpPkxlc3MtdGhhbiAoJmx0OyBvciBsdCk8L2xpPgorICAgICAgPGxpPkdyZWF0ZXItdGhhbiAoJmd0OyBvciBndCk8L2xpPgorICAgICAgPGxpPkxlc3MtdGhhbi1vci1lcXVhbCAoJmx0Oz0gb3IgbGUpPC9saT4KKyAgICAgIDxsaT5HcmVhdGVyLXRoYW4tb3ItZXF1YWwgKCZndDs9IG9yIGdlKTwvbGk+CisgICAgICA8bGk+RXF1YWwgKD09IG9yIGVxKTwvbGk+CisgICAgICA8bGk+Tm90IEVxdWFsICghPSBvciBuZSk8L2xpPgorICAgIDwvdWw+CisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8dT48Yj5OdW1lcmljPC9iPjwvdT4KKyAgICAgIDxjb2RlPgorICAgICAgICA8dGFibGUgYm9yZGVyPSIxIj4KKyAgICAgICAgICA8dGhlYWQ+CisJICAgIDx0ZD48Yj5FTCBFeHByZXNzaW9uPC9iPjwvdGQ+CisJICAgIDx0ZD48Yj5SZXN1bHQ8L2I+PC90ZD4KKwkgIDwvdGhlYWQ+CisJICA8dHI+CisJICAgIDx0ZD5cJHsxICZsdDsgMn08L3RkPgorCSAgICA8dGQ+JHsxIDwgMn08L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwkezEgbHQgMn08L3RkPgorCSAgICA8dGQ+JHsxIGx0IDJ9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHsxICZndDsgKDQvMil9PC90ZD4KKwkgICAgPHRkPiR7MSA+ICg0LzIpfTwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7MSAmZ3Q7ICg0LzIpfTwvdGQ+CisJICAgIDx0ZD4kezEgPiAoNC8yKX08L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwkezQuMCAmZ3Q7PSAzfTwvdGQ+CisJICAgIDx0ZD4kezQuMCA+PSAzfTwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7NC4wIGdlIDN9PC90ZD4KKwkgICAgPHRkPiR7NC4wIGdlIDN9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHs0ICZsdDs9IDN9PC90ZD4KKwkgICAgPHRkPiR7NCA8PSAzfTwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7NCBsZSAzfTwvdGQ+CisJICAgIDx0ZD4kezQgbGUgM308L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwkezEwMC4wID09IDEwMH08L3RkPgorCSAgICA8dGQ+JHsxMDAuMCA9PSAxMDB9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHsxMDAuMCBlcSAxMDB9PC90ZD4KKwkgICAgPHRkPiR7MTAwLjAgZXEgMTAwfTwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7KDEwKjEwKSAhPSAxMDB9PC90ZD4KKwkgICAgPHRkPiR7KDEwKjEwKSAhPSAxMDB9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHsoMTAqMTApIG5lIDEwMH08L3RkPgorCSAgICA8dGQ+JHsoMTAqMTApIG5lIDEwMH08L3RkPgorCSAgPC90cj4KKwk8L3RhYmxlPgorICAgICAgPC9jb2RlPgorICAgICAgPGJyPgorICAgICAgPHU+PGI+QWxwaGFiZXRpYzwvYj48L3U+CisgICAgICA8Y29kZT4KKyAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSI+CisgICAgICAgICAgPHRoZWFkPgorCSAgICA8dGQ+PGI+RUwgRXhwcmVzc2lvbjwvYj48L3RkPgorCSAgICA8dGQ+PGI+UmVzdWx0PC9iPjwvdGQ+CisJICA8L3RoZWFkPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7J2EnICZsdDsgJ2InfTwvdGQ+CisJICAgIDx0ZD4keydhJyA8ICdiJ308L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwkeydoaXAnICZndDsgJ2hpdCd9PC90ZD4KKwkgICAgPHRkPiR7J2hpcCcgPiAnaGl0J308L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwkeyc0JyAmZ3Q7IDN9PC90ZD4KKwkgICAgPHRkPiR7JzQnID4gM308L3RkPgorCSAgPC90cj4KKwk8L3RhYmxlPgorICAgICAgPC9jb2RlPgorICAgIDwvYmxvY2txdW90ZT4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9lbC9mdW5jdGlvbnMuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvZnVuY3Rpb25zLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2ZGRhMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvZnVuY3Rpb25zLmh0bWwKQEAgLTAsMCArMSwzMiBAQAorPGh0bWw+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxoZWFkPgorPHRpdGxlPlZpZXcgU291cmNlIENvZGU8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9ImZ1bmN0aW9ucy5qc3A/Zm9vPUpTUCsyLjAiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9ImZ1bmN0aW9ucy5qc3AuaHRtbCI+U291cmNlIENvZGUgZm9yIGZ1bmN0aW9ucy5qc3A8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+Cis8aDM+PGEgaHJlZj0iRnVuY3Rpb25zLmphdmEuaHRtbCI+U291cmNlIENvZGUgZm9yIEZ1bmN0aW9ucy5qYXZhPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2Z1bmN0aW9ucy5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2Z1bmN0aW9ucy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5ZTg1NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvZnVuY3Rpb25zLmpzcApAQCAtMCwwICsxLDY2IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwlQCB0YWdsaWIgcHJlZml4PSJmbiIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2Z1bmN0aW9ucyIgJT4KKzwlQCB0YWdsaWIgcHJlZml4PSJteSIgdXJpPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RvbWNhdC9qc3AyLWV4YW1wbGUtdGFnbGliIiU+CisKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+SlNQIDIuMCBFeHByZXNzaW9uIExhbmd1YWdlIC0gRnVuY3Rpb25zPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+SlNQIDIuMCBFeHByZXNzaW9uIExhbmd1YWdlIC0gRnVuY3Rpb25zPC9oMT4KKyAgICA8aHI+CisgICAgQW4gdXBncmFkZSBmcm9tIHRoZSBKU1RMIGV4cHJlc3Npb24gbGFuZ3VhZ2UsIHRoZSBKU1AgMi4wIEVMIGFsc28KKyAgICBhbGxvd3MgZm9yIHNpbXBsZSBmdW5jdGlvbiBpbnZvY2F0aW9uLiAgRnVuY3Rpb25zIGFyZSBkZWZpbmVkCisgICAgYnkgdGFnIGxpYnJhcmllcyBhbmQgYXJlIGltcGxlbWVudGVkIGJ5IGEgSmF2YSBwcm9ncmFtbWVyIGFzIAorICAgIHN0YXRpYyBtZXRob2RzLgorCisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8dT48Yj5DaGFuZ2UgUGFyYW1ldGVyPC9iPjwvdT4KKyAgICAgIDxmb3JtIGFjdGlvbj0iZnVuY3Rpb25zLmpzcCIgbWV0aG9kPSJHRVQiPgorCSAgZm9vID0gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImZvbyIgdmFsdWU9IiR7Zm46ZXNjYXBlWG1sKHBhcmFtWyJmb28iXSl9Ij4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0Ij4KKyAgICAgIDwvZm9ybT4KKyAgICAgIDxicj4KKyAgICAgIDxjb2RlPgorICAgICAgICA8dGFibGUgYm9yZGVyPSIxIj4KKyAgICAgICAgICA8dGhlYWQ+CisJICAgIDx0ZD48Yj5FTCBFeHByZXNzaW9uPC9iPjwvdGQ+CisJICAgIDx0ZD48Yj5SZXN1bHQ8L2I+PC90ZD4KKwkgIDwvdGhlYWQ+CisJICA8dHI+CisJICAgIDx0ZD5cJHtwYXJhbVsiZm9vIl19PC90ZD4KKwkgICAgPHRkPiR7Zm46ZXNjYXBlWG1sKHBhcmFtWyJmb28iXSl9Jm5ic3A7PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHtteTpyZXZlcnNlKHBhcmFtWyJmb28iXSl9PC90ZD4KKwkgICAgPHRkPiR7bXk6cmV2ZXJzZShmbjplc2NhcGVYbWwocGFyYW1bImZvbyJdKSl9Jm5ic3A7PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHtteTpyZXZlcnNlKG15OnJldmVyc2UocGFyYW1bImZvbyJdKSl9PC90ZD4KKwkgICAgPHRkPiR7bXk6cmV2ZXJzZShteTpyZXZlcnNlKGZuOmVzY2FwZVhtbChwYXJhbVsiZm9vIl0pKSl9Jm5ic3A7PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHtteTpjb3VudFZvd2VscyhwYXJhbVsiZm9vIl0pfTwvdGQ+CisJICAgIDx0ZD4ke215OmNvdW50Vm93ZWxzKGZuOmVzY2FwZVhtbChwYXJhbVsiZm9vIl0pKX0mbmJzcDs8L3RkPgorCSAgPC90cj4KKwk8L3RhYmxlPgorICAgICAgPC9jb2RlPgorICAgIDwvYmxvY2txdW90ZT4KKyAgPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2ltcGxpY2l0LW9iamVjdHMuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvaW1wbGljaXQtb2JqZWN0cy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MWVjZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2ltcGxpY2l0LW9iamVjdHMuaHRtbApAQCAtMCwwICsxLDE5IEBACis8aHRtbD4KKzwhLS0KKyAgQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCisgIHJlc2VydmVkLgorLS0+Cis8aGVhZD4KKzx0aXRsZT5WaWV3IFNvdXJjZSBDb2RlPC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJpbXBsaWNpdC1vYmplY3RzLmpzcD9mb289YmFyIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPgorPGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9ImltcGxpY2l0LW9iamVjdHMuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBJbXBsaWNpdCBPYmplY3RzIEV4YW1wbGU8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvaW1wbGljaXQtb2JqZWN0cy5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2ltcGxpY2l0LW9iamVjdHMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMDk4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2ltcGxpY2l0LW9iamVjdHMuanNwCkBAIC0wLDAgKzEsODkgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCVAIHRhZ2xpYiBwcmVmaXg9ImZuIiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvZnVuY3Rpb25zIiAlPgorCis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkpTUCAyLjAgRXhwcmVzc2lvbiBMYW5ndWFnZSAtIEltcGxpY2l0IE9iamVjdHM8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5KU1AgMi4wIEV4cHJlc3Npb24gTGFuZ3VhZ2UgLSBJbXBsaWNpdCBPYmplY3RzPC9oMT4KKyAgICA8aHI+CisgICAgVGhpcyBleGFtcGxlIGlsbHVzdHJhdGVzIHNvbWUgb2YgdGhlIGltcGxpY2l0IG9iamVjdHMgYXZhaWxhYmxlIAorICAgIGluIHRoZSBFeHByZXNzaW9uIExhbmFndWFnZS4gIFRoZSBmb2xsb3dpbmcgaW1wbGljaXQgb2JqZWN0cyBhcmUgCisgICAgYXZhaWxhYmxlIChub3QgYWxsIGlsbHVzdHJhdGVkIGhlcmUpOgorICAgIDx1bD4KKyAgICAgIDxsaT5wYWdlQ29udGV4dCAtIHRoZSBQYWdlQ29udGV4dCBvYmplY3Q8L2xpPgorICAgICAgPGxpPnBhZ2VTY29wZSAtIGEgTWFwIHRoYXQgbWFwcyBwYWdlLXNjb3BlZCBhdHRyaWJ1dGUgbmFtZXMgdG8gCisgICAgICAgICAgdGhlaXIgdmFsdWVzPC9saT4KKyAgICAgIDxsaT5yZXF1ZXN0U2NvcGUgLSBhIE1hcCB0aGF0IG1hcHMgcmVxdWVzdC1zY29wZWQgYXR0cmlidXRlIG5hbWVzIAorICAgICAgICAgIHRvIHRoZWlyIHZhbHVlczwvbGk+CisgICAgICA8bGk+c2Vzc2lvblNjb3BlIC0gYSBNYXAgdGhhdCBtYXBzIHNlc3Npb24tc2NvcGVkIGF0dHJpYnV0ZSBuYW1lcyAKKyAgICAgICAgICB0byB0aGVpciB2YWx1ZXM8L2xpPgorICAgICAgPGxpPmFwcGxpY2F0aW9uU2NvcGUgLSBhIE1hcCB0aGF0IG1hcHMgYXBwbGljYXRpb24tc2NvcGVkIGF0dHJpYnV0ZSAKKyAgICAgICAgICBuYW1lcyB0byB0aGVpciB2YWx1ZXM8L2xpPgorICAgICAgPGxpPnBhcmFtIC0gYSBNYXAgdGhhdCBtYXBzIHBhcmFtZXRlciBuYW1lcyB0byBhIHNpbmdsZSBTdHJpbmcgCisgICAgICAgICAgcGFyYW1ldGVyIHZhbHVlPC9saT4KKyAgICAgIDxsaT5wYXJhbVZhbHVlcyAtIGEgTWFwIHRoYXQgbWFwcyBwYXJhbWV0ZXIgbmFtZXMgdG8gYSBTdHJpbmdbXSBvZiAKKyAgICAgICAgICBhbGwgdmFsdWVzIGZvciB0aGF0IHBhcmFtZXRlcjwvbGk+CisgICAgICA8bGk+aGVhZGVyIC0gYSBNYXAgdGhhdCBtYXBzIGhlYWRlciBuYW1lcyB0byBhIHNpbmdsZSBTdHJpbmcgCisgICAgICAgICAgaGVhZGVyIHZhbHVlPC9saT4KKyAgICAgIDxsaT5oZWFkZXJWYWx1ZXMgLSBhIE1hcCB0aGF0IG1hcHMgaGVhZGVyIG5hbWVzIHRvIGEgU3RyaW5nW10gb2YgCisgICAgICAgICAgYWxsIHZhbHVlcyBmb3IgdGhhdCBoZWFkZXI8L2xpPgorICAgICAgPGxpPmluaXRQYXJhbSAtIGEgTWFwIHRoYXQgbWFwcyBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciAKKyAgICAgICAgICBuYW1lcyB0byB0aGVpciBTdHJpbmcgcGFyYW1ldGVyIHZhbHVlPC9saT4KKyAgICAgIDxsaT5jb29raWUgLSBhIE1hcCB0aGF0IG1hcHMgY29va2llIG5hbWVzIHRvIGEgc2luZ2xlIENvb2tpZSBvYmplY3QuPC9saT4KKyAgICA8L3VsPgorCisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8dT48Yj5DaGFuZ2UgUGFyYW1ldGVyPC9iPjwvdT4KKyAgICAgIDxmb3JtIGFjdGlvbj0iaW1wbGljaXQtb2JqZWN0cy5qc3AiIG1ldGhvZD0iR0VUIj4KKwkgIGZvbyA9IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJmb28iIHZhbHVlPSIke2ZuOmVzY2FwZVhtbChwYXJhbVsiZm9vIl0pfSI+CisgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCI+CisgICAgICA8L2Zvcm0+CisgICAgICA8YnI+CisgICAgICA8Y29kZT4KKyAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSI+CisgICAgICAgICAgPHRoZWFkPgorCSAgICA8dGQ+PGI+RUwgRXhwcmVzc2lvbjwvYj48L3RkPgorCSAgICA8dGQ+PGI+UmVzdWx0PC9iPjwvdGQ+CisJICA8L3RoZWFkPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7cGFyYW0uZm9vfTwvdGQ+CisJICAgIDx0ZD4ke2ZuOmVzY2FwZVhtbChwYXJhbVsiZm9vIl0pfSZuYnNwOzwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7cGFyYW1bImZvbyJdfTwvdGQ+CisJICAgIDx0ZD4ke2ZuOmVzY2FwZVhtbChwYXJhbVsiZm9vIl0pfSZuYnNwOzwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7aGVhZGVyWyJob3N0Il19PC90ZD4KKwkgICAgPHRkPiR7Zm46ZXNjYXBlWG1sKGhlYWRlclsiaG9zdCJdKX0mbmJzcDs8L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwke2hlYWRlclsiYWNjZXB0Il19PC90ZD4KKwkgICAgPHRkPiR7Zm46ZXNjYXBlWG1sKGhlYWRlclsiYWNjZXB0Il0pfSZuYnNwOzwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7aGVhZGVyWyJ1c2VyLWFnZW50Il19PC90ZD4KKwkgICAgPHRkPiR7Zm46ZXNjYXBlWG1sKGhlYWRlclsidXNlci1hZ2VudCJdKX0mbmJzcDs8L3RkPgorCSAgPC90cj4KKwk8L3RhYmxlPgorICAgICAgPC9jb2RlPgorICAgIDwvYmxvY2txdW90ZT4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3BhdHRyaWJ1dGUvanNwYXR0cmlidXRlLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcGF0dHJpYnV0ZS9qc3BhdHRyaWJ1dGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjFiNmU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3BhdHRyaWJ1dGUvanNwYXR0cmlidXRlLmh0bWwKQEAgLTAsMCArMSwzNyBAQAorPGh0bWw+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxoZWFkPgorPHRpdGxlPlZpZXcgU291cmNlIENvZGU8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9ImpzcGF0dHJpYnV0ZS5qc3AiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+Cis8YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0ianNwYXR0cmlidXRlLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IganNwYXR0cmlidXRlLmpzcDxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPGgzPjxhIGhyZWY9IkhlbGxvV29ybGRTaW1wbGVUYWcuamF2YS5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgSGVsbG9Xb3JsZFNpbXBsZVRhZy5qYXZhPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8aDM+PGEgaHJlZj0iRm9vQmVhbi5qYXZhLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBGb29CZWFuLmphdmE8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNwYXR0cmlidXRlL2pzcGF0dHJpYnV0ZS5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcGF0dHJpYnV0ZS9qc3BhdHRyaWJ1dGUuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NjViMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcGF0dHJpYnV0ZS9qc3BhdHRyaWJ1dGUuanNwCkBAIC0wLDAgKzEsNDYgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCVAIHRhZ2xpYiBwcmVmaXg9Im15IiB1cmk9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0L2pzcDItZXhhbXBsZS10YWdsaWIiJT4KKworPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5KU1AgMi4wIEV4YW1wbGVzIC0ganNwOmF0dHJpYnV0ZSBhbmQganNwOmJvZHk8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5KU1AgMi4wIEV4YW1wbGVzIC0ganNwOmF0dHJpYnV0ZSBhbmQganNwOmJvZHk8L2gxPgorICAgIDxocj4KKyAgICA8cD5UaGUgbmV3ICZsdDtqc3A6YXR0cmlidXRlJmd0OyBhbmQgJmx0O2pzcDpib2R5Jmd0OyAKKyAgICBzdGFuZGFyZCBhY3Rpb25zIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHZhbHVlIG9mIGFueSBzdGFuZGFyZAorICAgIGFjdGlvbiBvciBjdXN0b20gYWN0aW9uIGF0dHJpYnV0ZS48L3A+CisgICAgPHA+VGhpcyBleGFtcGxlIHVzZXMgdGhlICZsdDtqc3A6YXR0cmlidXRlJmd0OworICAgIHN0YW5kYXJkIGFjdGlvbiB0byB1c2UgdGhlIG91dHB1dCBvZiBhIGN1c3RvbSBhY3Rpb24gaW52b2NhdGlvbgorICAgIChvbmUgdGhhdCBzaW1wbHkgb3V0cHV0cyAiSGVsbG8sIFdvcmxkISIpIHRvIHNldCB0aGUgdmFsdWUgb2YgYQorICAgIGJlYW4gcHJvcGVydHkuICBUaGlzIHdvdWxkIG5vcm1hbGx5IHJlcXVpcmUgYW4gaW50ZXJtZWRpYXJ5CisgICAgc3RlcCwgc3VjaCBhcyB1c2luZyBKU1RMJ3MgJmx0O2M6c2V0Jmd0OyBhY3Rpb24uPC9wPgorICAgIDxicj4KKyAgICA8anNwOnVzZUJlYW4gaWQ9ImZvbyIgY2xhc3M9ImpzcDIuZXhhbXBsZXMuRm9vQmVhbiI+CisgICAgICBCZWFuIGNyZWF0ZWQhICBTZXR0aW5nIGZvby5iYXIuLi48YnI+CisgICAgICA8anNwOnNldFByb3BlcnR5IG5hbWU9ImZvbyIgcHJvcGVydHk9ImJhciI+CisgICAgICAgIDxqc3A6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4KKwkgIDxteTpoZWxsb1dvcmxkLz4KKyAgICAgICAgPC9qc3A6YXR0cmlidXRlPgorICAgICAgPC9qc3A6c2V0UHJvcGVydHk+CisgICAgPC9qc3A6dXNlQmVhbj4KKyAgICA8YnI+CisgICAgUmVzdWx0OiAke2Zvby5iYXJ9CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNwYXR0cmlidXRlL3NodWZmbGUuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNwYXR0cmlidXRlL3NodWZmbGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzExODYwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3BhdHRyaWJ1dGUvc2h1ZmZsZS5odG1sCkBAIC0wLDAgKzEsMzcgQEAKKzxodG1sPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aGVhZD4KKzx0aXRsZT5WaWV3IFNvdXJjZSBDb2RlPC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJzaHVmZmxlLmpzcCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT4KKzxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJzaHVmZmxlLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3Igc2h1ZmZsZS5qc3A8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzxoMz48YSBocmVmPSJTaHVmZmxlU2ltcGxlVGFnLmphdmEuaHRtbCI+U291cmNlIENvZGUgZm9yIFNodWZmbGVTaW1wbGVUYWcuamF2YTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPGgzPjxhIGhyZWY9IlRpbGVTaW1wbGVUYWcuamF2YS5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgVGlsZVNpbXBsZVRhZy5qYXZhPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcGF0dHJpYnV0ZS9zaHVmZmxlLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNwYXR0cmlidXRlL3NodWZmbGUuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZDMxYjUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcGF0dHJpYnV0ZS9zaHVmZmxlLmpzcApAQCAtMCwwICsxLDkwIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwlQCB0YWdsaWIgcHJlZml4PSJteSIgdXJpPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RvbWNhdC9qc3AyLWV4YW1wbGUtdGFnbGliIiU+CisKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+SlNQIDIuMCBFeGFtcGxlcyAtIFNodWZmbGUgRXhhbXBsZTwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGgxPkpTUCAyLjAgRXhhbXBsZXMgLSBTaHVmZmxlIEV4YW1wbGU8L2gxPgorICAgIDxocj4KKyAgICA8cD5UcnkgcmVsb2FkaW5nIHRoZSBwYWdlIGEgZmV3IHRpbWVzLiAgQm90aCB0aGUgcm93cyBhbmQgdGhlIGNvbHVtbnMKKyAgICBhcmUgc2h1ZmZsZWQgYW5kIGFwcGVhciBkaWZmZXJlbnQgZWFjaCB0aW1lLjwvcD4KKyAgICA8cD5IZXJlJ3MgaG93IHRoZSBjb2RlIHdvcmtzLiAgVGhlIFNpbXBsZVRhZyBoYW5kbGVyIGNhbGxlZCAKKyAgICAmbHQ7bXk6c2h1ZmZsZSZndDsgYWNjZXB0cyB0aHJlZSBhdHRyaWJ1dGVzLiAgRWFjaCBhdHRyaWJ1dGUgaXMgYSAKKyAgICBKU1AgRnJhZ21lbnQsIG1lYW5pbmcgaXQgaXMgYSBmcmFnbWVudCBvZiBKU1AgY29kZSB0aGF0IGNhbiBiZQorICAgIGR5bmFtaWNhbGx5IGV4ZWN1dGVkIGJ5IHRoZSBzaHVmZmxlIHRhZyBoYW5kbGVyIG9uIGRlbWFuZC4gIFRoZSAKKyAgICBzaHVmZmxlIHRhZyBoYW5kbGVyIGV4ZWN1dGVzIHRoZSB0aHJlZSBmcmFnbWVudHMgaW4gYSByYW5kb20gb3JkZXIuCisgICAgVG8gc2h1ZmZsZSBib3RoIHRoZSByb3dzIGFuZCB0aGUgY29sdW1ucywgdGhlIHNodWZmbGUgdGFnIGlzIHVzZWQKKyAgICB3aXRoIGl0c2VsZiBhcyBhIHBhcmFtZXRlci48L3A+CisgICAgPGhyPgorICAgIDxibG9ja3F1b3RlPgorICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiI+CisgICAgICA8dGFibGU+CisgICAgICAgIDxteTpzaHVmZmxlPgorICAgICAgICAgIDxqc3A6YXR0cmlidXRlIG5hbWU9ImZyYWdtZW50MSI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDxteTpzaHVmZmxlPgorICAgICAgICAgICAgICAgIDxqc3A6YXR0cmlidXRlIG5hbWU9ImZyYWdtZW50MSI+CisgICAgICAgICAgICAgICAgICA8bXk6dGlsZSBjb2xvcj0iI2ZmMDAwMCIgbGFiZWw9IkEiLz4KKyAgICAgICAgICAgICAgICA8L2pzcDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgPGpzcDphdHRyaWJ1dGUgbmFtZT0iZnJhZ21lbnQyIj4KKyAgICAgICAgICAgICAgICAgIDxteTp0aWxlIGNvbG9yPSIjMDBmZjAwIiBsYWJlbD0iQiIvPgorICAgICAgICAgICAgICAgIDwvanNwOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICA8anNwOmF0dHJpYnV0ZSBuYW1lPSJmcmFnbWVudDMiPgorICAgICAgICAgICAgICAgICAgPG15OnRpbGUgY29sb3I9IiMwMDAwZmYiIGxhYmVsPSJDIi8+CisgICAgICAgICAgICAgICAgPC9qc3A6YXR0cmlidXRlPgorICAgICAgICAgICAgICA8L215OnNodWZmbGU+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgIDwvanNwOmF0dHJpYnV0ZT4KKyAgICAgICAgICA8anNwOmF0dHJpYnV0ZSBuYW1lPSJmcmFnbWVudDIiPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8bXk6c2h1ZmZsZT4KKyAgICAgICAgICAgICAgICA8anNwOmF0dHJpYnV0ZSBuYW1lPSJmcmFnbWVudDEiPgorICAgICAgICAgICAgICAgICAgPG15OnRpbGUgY29sb3I9IiNmZjAwMDAiIGxhYmVsPSIxIi8+CisgICAgICAgICAgICAgICAgPC9qc3A6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgIDxqc3A6YXR0cmlidXRlIG5hbWU9ImZyYWdtZW50MiI+CisgICAgICAgICAgICAgICAgICA8bXk6dGlsZSBjb2xvcj0iIzAwZmYwMCIgbGFiZWw9IjIiLz4KKyAgICAgICAgICAgICAgICA8L2pzcDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgPGpzcDphdHRyaWJ1dGUgbmFtZT0iZnJhZ21lbnQzIj4KKyAgICAgICAgICAgICAgICAgIDxteTp0aWxlIGNvbG9yPSIjMDAwMGZmIiBsYWJlbD0iMyIvPgorICAgICAgICAgICAgICAgIDwvanNwOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgPC9teTpzaHVmZmxlPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8L2pzcDphdHRyaWJ1dGU+CisgICAgICAgICAgPGpzcDphdHRyaWJ1dGUgbmFtZT0iZnJhZ21lbnQzIj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPG15OnNodWZmbGU+CisgICAgICAgICAgICAgICAgPGpzcDphdHRyaWJ1dGUgbmFtZT0iZnJhZ21lbnQxIj4KKyAgICAgICAgICAgICAgICAgIDxteTp0aWxlIGNvbG9yPSIjZmYwMDAwIiBsYWJlbD0iISIvPgorICAgICAgICAgICAgICAgIDwvanNwOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICA8anNwOmF0dHJpYnV0ZSBuYW1lPSJmcmFnbWVudDIiPgorICAgICAgICAgICAgICAgICAgPG15OnRpbGUgY29sb3I9IiMwMGZmMDAiIGxhYmVsPSJAIi8+CisgICAgICAgICAgICAgICAgPC9qc3A6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgIDxqc3A6YXR0cmlidXRlIG5hbWU9ImZyYWdtZW50MyI+CisgICAgICAgICAgICAgICAgICA8bXk6dGlsZSBjb2xvcj0iIzAwMDBmZiIgbGFiZWw9IiMiLz4KKyAgICAgICAgICAgICAgICA8L2pzcDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgIDwvbXk6c2h1ZmZsZT4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPC9qc3A6YXR0cmlidXRlPgorICAgICAgICA8L215OnNodWZmbGU+CisgICAgICA8L3RhYmxlPgorICAgICA8L2ZvbnQ+CisgICAgPC9ibG9ja3F1b3RlPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcHgvYmFzaWMuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNweC9iYXNpYy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNTUyZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcHgvYmFzaWMuaHRtbApAQCAtMCwwICsxLDMxIEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VmlldyBTb3VyY2UgQ29kZTwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0iYmFzaWMuanNweCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YQoraHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9ImJhc2ljLmpzcHguaHRtbCI+U291cmNlIENvZGUgZm9yIFhIVE1MIEJhc2ljIEV4YW1wbGU8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNweC9iYXNpYy5qc3B4IGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3B4L2Jhc2ljLmpzcHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyZjM1YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNweC9iYXNpYy5qc3B4CkBAIC0wLDAgKzEsMzAgQEAKKzx0YWdzOnhodG1sYmFzaWMgeG1sbnM6dGFncz0idXJuOmpzcHRhZ2RpcjovV0VCLUlORi90YWdzIgorICAgICAgICAgICAgICAgICB4bWxuczpqc3A9Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiCisgICAgICAgICAgICAgICAgIHhtbG5zOmZtdD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9mbXQiCisJCSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgIDxqc3A6ZGlyZWN0aXZlLnBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIgLz4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkpTUFggLSBYSFRNTCBCYXNpYyBFeGFtcGxlPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+SlNQWCAtIFhIVE1MIEJhc2ljIEV4YW1wbGU8L2gxPgorICAgIDxoci8+CisgICAgVGhpcyBleGFtcGxlIGlsbHVzdHJhdGVzIGhvdyB0byB1c2UgSlNQWCB0byBwcm9kdWNlIGFuIFhIVE1MIGJhc2ljCisgICAgZG9jdW1lbnQgc3VpdGFibGUgZm9yIHVzZSB3aXRoIG1vYmlsZSBwaG9uZXMsIHRlbGV2aXNpb25zLCAKKyAgICBQREFzLCB2ZW5kaW5nIG1hY2hpbmVzLCBwYWdlcnMsIGNhciBuYXZpZ2F0aW9uIHN5c3RlbXMsCisgICAgbW9iaWxlIGdhbWUgbWFjaGluZXMsIGRpZ2l0YWwgYm9vayByZWFkZXJzLCBzbWFydCB3YXRjaGVzLCBldGMuCisgICAgPHAvPgorICAgIEpTUFggbGV0cyB5b3UgY3JlYXRlIGR5bmFtaWMgZG9jdW1lbnRzIGluIGEgcHVyZSBYTUwgc3ludGF4IGNvbXBhdGlibGUKKyAgICB3aXRoIGV4aXN0aW5nIFhNTCB0b29scy4gIFRoZSBYTUwgc3ludGF4IGluIEpTUCAxLjIgd2FzIGF3a3dhcmQgYW5kCisgICAgcmVxdWlyZWQgJmFtcDtsdDtqc3A6cm9vdCZhbXA7Z3Q7IHRvIGJlIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGRvY3VtZW50LgorICAgIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlIGluIEpTUCAyLjAuCisgICAgPHAvPgorICAgIFRoaXMgcGFydGljdWxhciBleGFtcGxlIHVzZXMgYSB0YWcgZmlsZSB0byBwcm9kdWNlIHRoZSBET0NUWVBFIGFuZAorICAgIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgdG8gbWFrZSB0aGUgb3V0cHV0IG9mIHRoaXMgcGFnZSBhIHZhbGlkIFhIVE1MCisgICAgQmFzaWMgZG9jdW1lbnQuCisgICAgPHAvPgorICAgIEp1c3QgdG8gcHJvdmUgdGhpcyBpcyBsaXZlLCBoZXJlJ3Mgc29tZSBkeW5hbWljIGNvbnRlbnQ6CisgICAgPGpzcDp1c2VCZWFuIGlkPSJub3ciIGNsYXNzPSJqYXZhLnV0aWwuRGF0ZSIgLz4KKyAgICA8Zm10OmZvcm1hdERhdGUgdmFsdWU9IiR7bm93fSIgcGF0dGVybj0iTU1NTSBkLCB5eXl5LCBIOm1tOnNzIi8+CisgIDwvYm9keT4KKzwvdGFnczp4aHRtbGJhc2ljPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3B4L3N2Z2V4YW1wbGUuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNweC9zdmdleGFtcGxlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiNmFlMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNweC9zdmdleGFtcGxlLmh0bWwKQEAgLTAsMCArMSw1MiBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkpTUCAyLjAgU1ZHIEV4YW1wbGU8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5KU1AgMi4wIFNWRyBFeGFtcGxlPC9oMT4KKyAgICA8aHI+CisgICAgVGhpcyBleGFtcGxlIHVzZXMgSlNQIDIuMCdzIG5ldywgc2ltcGxpZmllZCBKU1BYIHN5bnRheCB0byByZW5kZXIgYQorICAgIFNjYWxhYmxlIFZlY3RvciBHcmFwaGljcyAoU1ZHKSBkb2N1bWVudC4gIFdoZW4geW91IHZpZXcgdGhlIHNvdXJjZSwKKyAgICBub3RpY2UgdGhlIGxhY2sgb2YgYSAmbHQ7anNwOnJvb3QmZ3Q7IGVsZW1lbnQhICBUaGUgdGV4dCB0byBiZSByZW5kZXJlZCAKKyAgICBjYW4gYmUgbW9kaWZpZWQgYnkgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIHRoZSBuYW1lIHBhcmFtZXRlci4KKyAgICA8cD4KKyAgICBTVkcgaGFzIG1hbnkgcG90ZW50aWFsIHVzZXMsIHN1Y2ggYXMgc2VhcmNoYWJsZSBpbWFnZXMsIG9yIGltYWdlcworICAgIGN1c3RvbWl6ZWQgd2l0aCB0aGUgbmFtZSBvZiB5b3VyIHNpdGUncyB2aXNpdG9yIChlLmcuIGEgIlN1c2FuJ3MgU3RvcmUiCisgICAgdGFiIGltYWdlKS4gIEpTUFggaXMgYSBuYXR1cmFsIGZpdCBmb3IgZ2VuZXJhdGluZyBkeW5hbWljIFhNTCBjb250ZW50CisgICAgc3VjaCBhcyBTVkcuCisgICAgPHA+CisgICAgVG8gZXhlY3V0ZSB0aGlzIGV4YW1wbGUsIGZvbGxvdyB0aGVzZSBzdGVwczoKKyAgICA8b2w+CisgICAgICA8bGk+RG93bmxvYWQgPGEgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL2JhdGlrL2luZGV4Lmh0bWwiPkJhdGlrPC9hPiwKKyAgICAgICAgICBvciBhbnkgb3RoZXIgU1ZHIHZpZXdlci48L2xpPgorICAgICAgPGxpPkNvcHkgdGhlIGZvbGxvd2luZyBVUkw6CisgICAgICA8YSBocmVmPSJodHRwOi8vbG9jYWxob3N0OjgwODAvanNwLWV4YW1wbGVzL2pzcDIvanNweC90ZXh0Um90YXRlLmpzcHg/bmFtZT1KU1BYIj4KKyAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qc3AtZXhhbXBsZXMvanNwMi9qc3B4L3RleHRSb3RhdGUuanNweD9uYW1lPUpTUFg8L2E+CisgICAgICA8L2xpPgorICAgICAgPGxpPlBhc3RlIHRoZSBVUkwgaW50byBCYXRpaydzIExvY2F0aW9uIGZpZWxkIGFuZCBwcmVzcyBFbnRlcjwvbGk+CisgICAgICA8bGk+Q3VzdG9taXplIGJ5IGNoYW5naW5nIHRoZSBuYW1lPUpTUFggcGFyYW1ldGVyPC9saT4KKyAgICA8L29sPgorICAgIDxicj4KKyAgICBUaGUgZm9sbG93aW5nIGlzIGEgc2NyZWVuc2hvdCBvZiB0aGUgcmVzdWx0aW5nIGltYWdlLCBmb3IgdGhvc2UgdGhhdAorICAgIGRvbid0IGhhdmUgYW4gU1ZHIHZpZXdlcjoKKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxpbWcgc3JjPSJ0ZXh0Um90YXRlLmpwZyIgYm9yZGVyPSIxIj4KKyAgICA8L2Jsb2NrcXVvdGU+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNweC90ZXh0Um90YXRlLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcHgvdGV4dFJvdGF0ZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZjljZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcHgvdGV4dFJvdGF0ZS5odG1sCkBAIC0wLDAgKzEsMzIgQEAKKzxodG1sPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aGVhZD4KKzx0aXRsZT5WaWV3IFNvdXJjZSBDb2RlPC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJ0ZXh0Um90YXRlLmpzcHgiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PGEKK2hyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJ0ZXh0Um90YXRlLmpzcHguaHRtbCI+U291cmNlIENvZGUgZm9yIFNWRyAoU2NhbGFibGUgVmVjdG9yIEdyYXBoaWNzKQorRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3B4L3RleHRSb3RhdGUuanBnIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3B4L3RleHRSb3RhdGUuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOTg3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcHgvdGV4dFJvdGF0ZS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3B4L3RleHRSb3RhdGUuanNweCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNweC90ZXh0Um90YXRlLmpzcHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmNTg5MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNweC90ZXh0Um90YXRlLmpzcHgKQEAgLTAsMCArMSwzNiBAQAorPCEtLSAKKyAgLSBUaGlzIGV4YW1wbGUgaXMgYmFzZWQgb2ZmIHRoZSB0ZXh0Um90YXRlLnN2ZyBleGFtcGxlIHRoYXQgY29tZXMKKyAgLSB3aXRoIEJhdGlrLiAgVGhlIG9yaWdpbmFsIGV4YW1wbGUgd2FzIHdyaXR0ZW4gYnkgQmlsbCBIYW5lbWFuLgorICAtIFRoaXMgdmVyc2lvbiBieSBNYXJrIFJvdGguCisgIC0tPgorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICAgIHdpZHRoPSI0NTAiIGhlaWdodD0iNTAwIiB2aWV3Qm94PSIwIDAgNDUwIDUwMCIKKyAgICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIgorICAgICB4bWxuczpmbj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9mdW5jdGlvbnMiCisgICAgIHhtbG5zOmpzcD0iaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSI+CisgIDxqc3A6ZGlyZWN0aXZlLnBhZ2UgY29udGVudFR5cGU9ImltYWdlL3N2Zyt4bWwiIC8+CisgIDx0aXRsZT5KU1AgMi4wIEpTUFg8L3RpdGxlPgorICA8IS0tIHNlbGVjdCBuYW1lIHBhcmFtZXRlciwgb3IgZGVmYXVsdCB0byBKU1BYIC0tPgorICA8YzpzZXQgdmFyPSJuYW1lIiB2YWx1ZT0nJHtlbXB0eSBmbjplc2NhcGVYbWwocGFyYW1bIm5hbWUiXSkgPyAiSlNQWCIgOiBmbjplc2NhcGVYbWwocGFyYW1bIm5hbWUiXSl9Jy8+CisgIDxnIGlkPSJ0ZXN0Q29udGVudCI+CisgICAgPHRleHQgY2xhc3M9InRpdGxlIiB4PSI1MCUiIHk9IjEwJSIgZm9udC1zaXplPSIxNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgPgorICAgICAgICAgICAgSlNQIDIuMCBYTUwgU3ludGF4ICguanNweCkgRGVtbzwvdGV4dD4KKyAgICA8dGV4dCBjbGFzcz0idGl0bGUiIHg9IjUwJSIgeT0iMTUlIiBmb250LXNpemU9IjE1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiA+CisgICAgICAgICAgICBUcnkgY2hhbmdpbmcgdGhlIG5hbWUgcGFyYW1ldGVyITwvdGV4dD4KKyAgICA8ZyBvcGFjaXR5PSIxLjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIyNSwgMjUwKSIgaWQ9InJvdGF0ZWRUZXh0Ij4KKyAgICAgIDxjOmZvckVhY2ggdmFyPSJpIiBiZWdpbj0iMSIgZW5kPSIyNCI+CisgICAgICAgIDxqc3A6dGV4dD4KKyAgICAgICAgICA8IVtDREFUQVs8ZyBvcGFjaXR5PSIwLjk1IiB0cmFuc2Zvcm09InNjYWxlKDEuMDUpIHJvdGF0ZSgxNSkiPl1dPgorICAgICAgICA8L2pzcDp0ZXh0PgorICAgICAgICA8dGV4dCB4PSIwIiB5PSIwIiB0cmFuc2Zvcm09InNjYWxlKDEuNiwgMS42KSIgZmlsbD0iRGFya1NsYXRlQmx1ZSIgCisgICAgICAgICAgICAgIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iNDAiIGZvbnQtZmFtaWx5PSJTZXJpZiIgCisgICAgICAgICAgICAgIGlkPSJ3b3JkcyI+JHtuYW1lfTwvdGV4dD4KKyAgICAgIDwvYzpmb3JFYWNoPgorICAgICAgPGM6Zm9yRWFjaCB2YXI9ImkiIGJlZ2luPSIxIiBlbmQ9IjI0Ij4KKyAgICAgICAgPGpzcDp0ZXh0PjwhW0NEQVRBWzwvZz5dXT48L2pzcDp0ZXh0PgorICAgICAgPC9jOmZvckVhY2g+CisgICAgICA8dGV4dCBzdHlsZT0iZm9udC1zaXplOjc1O2ZvbnQtZmFtaWx5OlNlcmlmO2ZpbGw6d2hpdGUiIAorICAgICAgICAgICAgdGV4dC1hbmNob3I9Im1pZGRsZSI+JHtuYW1lfTwvdGV4dD4KKyAgICA8L2c+CisgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9taXNjL2NvZGEuanNwZiBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvbWlzYy9jb2RhLmpzcGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFmYWVjMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvbWlzYy9jb2RhLmpzcGYKQEAgLTAsMCArMSw1IEBACis8aHI+Cis8Y2VudGVyPgorVGhpcyBiYW5uZXIgaW5jbHVkZWQgd2l0aCAmbHQ7aW5jbHVkZS1jb2RhJmd0OworPC9jZW50ZXI+Cis8aHI+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL21pc2MvY29uZmlnLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL21pc2MvY29uZmlnLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3ZDY4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvbWlzYy9jb25maWcuaHRtbApAQCAtMCwwICsxLDM1IEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VmlldyBTb3VyY2UgQ29kZTwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0iY29uZmlnLmpzcCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT4KKzxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJjb25maWcuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBjb25maWcuanNwPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorPGgzPjxhIGhyZWY9InByZWx1ZGUuanNwZi5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgcHJlbHVkZS5qc3BmPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorPGgzPjxhIGhyZWY9ImNvZGEuanNwZi5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgY29kYS5qc3BmPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL21pc2MvY29uZmlnLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvbWlzYy9jb25maWcuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZWMxNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL21pc2MvY29uZmlnLmpzcApAQCAtMCwwICsxLDMyIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwlQCB0YWdsaWIgcHJlZml4PSJteSIgdXJpPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RvbWNhdC9qc3AyLWV4YW1wbGUtdGFnbGliIiU+CisgICAgPGgxPkpTUCAyLjAgRXhhbXBsZXMgLSBKU1AgQ29uZmlndXJhdGlvbjwvaDE+CisgICAgPGhyPgorICAgIDxwPlVzaW5nIGEgJmx0O2pzcC1wcm9wZXJ0eS1ncm91cCZndDsgZWxlbWVudCBpbiB0aGUgd2ViLnhtbCAKKyAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIHRoaXMgSlNQIHBhZ2UgaGFzIGJlZW4gY29uZmlndXJlZCBpbiB0aGUKKyAgICBmb2xsb3dpbmcgd2F5czo8L3A+CisgICAgPHVsPgorICAgICAgPGxpPlVzZXMgJmx0O2luY2x1ZGUtcHJlbHVkZSZndDsgdG8gaW5jbHVkZSB0aGUgdG9wIGJhbm5lci48L2xpPgorICAgICAgPGxpPlVzZXMgJmx0O2luY2x1ZGUtY29kYSZndDsgdG8gaW5jbHVkZSB0aGUgYm90dG9tIGJhbm5lci48L2xpPgorICAgICAgPGxpPlVzZXMgJmx0O3NjcmlwdGluZy1pbnZhbGlkJmd0OyB0cnVlIHRvIGRpc2FibGUgCisJICAmbHQ7JSBzY3JpcHRpbmcgJSZndDsgZWxlbWVudHM8L2xpPgorICAgICAgPGxpPlVzZXMgJmx0O2VsLWlnbm9yZWQmZ3Q7IHRydWUgdG8gZGlzYWJsZSAke0VMfSBlbGVtZW50czwvbGk+CisgICAgICA8bGk+VXNlcyAmbHQ7cGFnZS1lbmNvZGluZyZndDsgSVNPLTg4NTktMSB0byBzZXQgdGhlIHBhZ2UgZW5jb2RpbmcgKHRob3VnaCB0aGlzIGlzIHRoZSBkZWZhdWx0IGFueXdheSk8L2xpPgorICAgIDwvdWw+CisgICAgVGhlcmUgYXJlIHZhcmlvdXMgb3RoZXIgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQuCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvbWlzYy9keW5hbWljYXR0cnMuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvbWlzYy9keW5hbWljYXR0cnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmExYmYxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9taXNjL2R5bmFtaWNhdHRycy5odG1sCkBAIC0wLDAgKzEsMzMgQEAKKzxodG1sPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aGVhZD4KKzx0aXRsZT5WaWV3IFNvdXJjZSBDb2RlPC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJkeW5hbWljYXR0cnMuanNwIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPgorPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9ImR5bmFtaWNhdHRycy5qc3AuaHRtbCI+U291cmNlIENvZGUgZm9yIGR5bmFtaWNhdHRycy5qc3A8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+Cis8aDM+PGEgaHJlZj0iRWNob0F0dHJpYnV0ZXNUYWcuamF2YS5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgRWNob0F0dHJpYnV0ZXNUYWcuamF2YTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9taXNjL2R5bmFtaWNhdHRycy5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL21pc2MvZHluYW1pY2F0dHJzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2Y4YTAyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9taXNjL2R5bmFtaWNhdHRycy5qc3AKQEAgLTAsMCArMSw0NCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8JUAgdGFnbGliIHByZWZpeD0ibXkiIHVyaT0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvanNwMi1leGFtcGxlLXRhZ2xpYiIlPgorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5KU1AgMi4wIEV4YW1wbGVzIC0gRHluYW1pYyBBdHRyaWJ1dGVzPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+SlNQIDIuMCBFeGFtcGxlcyAtIER5bmFtaWMgQXR0cmlidXRlczwvaDE+CisgICAgPGhyPgorICAgIDxwPlRoaXMgSlNQIHBhZ2UgaW52b2tlcyBhIGN1c3RvbSB0YWcgdGhhdCBhY2NlcHRzIGEgZHluYW1pYyBzZXQgCisgICAgb2YgYXR0cmlidXRlcy4gIFRoZSB0YWcgZWNob2VzIHRoZSBuYW1lIGFuZCB2YWx1ZSBvZiBhbGwgYXR0cmlidXRlcworICAgIHBhc3NlZCB0byBpdC48L3A+CisgICAgPGhyPgorICAgIDxoMj5JbnZvY2F0aW9uIDEgKHNpeCBhdHRyaWJ1dGVzKTwvaDI+CisgICAgPHVsPgorICAgICAgPG15OmVjaG9BdHRyaWJ1dGVzIHg9IjEiIHk9IjIiIHo9IjMiIHI9InJlZCIgZz0iZ3JlZW4iIGI9ImJsdWUiLz4KKyAgICA8L3VsPgorICAgIDxoMj5JbnZvY2F0aW9uIDIgKHplcm8gYXR0cmlidXRlcyk8L2gyPgorICAgIDx1bD4KKyAgICAgIDxteTplY2hvQXR0cmlidXRlcy8+CisgICAgPC91bD4KKyAgICA8aDI+SW52b2NhdGlvbiAzICh0aHJlZSBhdHRyaWJ1dGVzKTwvaDI+CisgICAgPHVsPgorICAgICAgPG15OmVjaG9BdHRyaWJ1dGVzIGRvZ05hbWU9IlNjcnVmZnkiIAorCSAgIAkJIGNhdE5hbWU9IkZsdWZmeSIgCisJCQkgYmxvd2Zpc2hOYW1lPSJQdWZmeSIvPgorICAgIDwvdWw+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvbWlzYy9wcmVsdWRlLmpzcGYgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL21pc2MvcHJlbHVkZS5qc3BmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMGE4ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL21pc2MvcHJlbHVkZS5qc3BmCkBAIC0wLDAgKzEsNSBAQAorPGhyPgorPGNlbnRlcj4KK1RoaXMgYmFubmVyIGluY2x1ZGVkIHdpdGggJmx0O2luY2x1ZGUtcHJlbHVkZSZndDsKKzwvY2VudGVyPgorPGhyPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9zaW1wbGV0YWcvYm9vay5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9zaW1wbGV0YWcvYm9vay5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NDFhY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3NpbXBsZXRhZy9ib29rLmh0bWwKQEAgLTAsMCArMSwzNyBAQAorPGh0bWw+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxoZWFkPgorPHRpdGxlPlZpZXcgU291cmNlIENvZGU8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9ImJvb2suanNwIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPgorPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9ImJvb2suanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciB0aGUgQm9vayBFeGFtcGxlIEpTUDxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKzxoMz48YSBocmVmPSJGaW5kQm9va1NpbXBsZVRhZy5qYXZhLmh0bWwiPlNvdXJjZSBDb2RlIGZvciB0aGUgRmluZEJvb2sgU2ltcGxlVGFnIEhhbmRsZXI8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+Cis8aDM+PGEgaHJlZj0iQm9va0JlYW4uamF2YS5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgQm9va0JlYW48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+Cis8aDM+PGEgaHJlZj0iRnVuY3Rpb25zLmphdmEuaHRtbCI+U291cmNlIENvZGUgZm9yIHRoZSBFTCBGdW5jdGlvbnM8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvc2ltcGxldGFnL2Jvb2suanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9zaW1wbGV0YWcvYm9vay5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdjMzBkNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvc2ltcGxldGFnL2Jvb2suanNwCkBAIC0wLDAgKzEsNTUgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCVAIHRhZ2xpYiBwcmVmaXg9Im15IiB1cmk9Ii9XRUItSU5GL2pzcDIvanNwMi1leGFtcGxlLXRhZ2xpYi50bGQiICU+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkpTUCAyLjAgRXhhbXBsZXMgLSBCb29rIFNpbXBsZVRhZyBIYW5kbGVyPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+SlNQIDIuMCBFeGFtcGxlcyAtIEJvb2sgU2ltcGxlVGFnIEhhbmRsZXI8L2gxPgorICAgIDxocj4KKyAgICA8cD5JbGx1c3RyYXRlcyBhIHNlbWktcmVhbGlzdGljIHVzZSBvZiBTaW1wbGVUYWcgYW5kIHRoZSBFeHByZXNzaW9uIAorICAgIExhbmd1YWdlLiAgRmlyc3QsIGEgJmx0O215OmZpbmRCb29rJmd0OyB0YWcgaXMgaW52b2tlZCB0byBwb3B1bGF0ZSAKKyAgICB0aGUgcGFnZSBjb250ZXh0IHdpdGggYSBCb29rQmVhbi4gIFRoZW4sIHRoZSBib29rcyBmaWVsZHMgYXJlIHByaW50ZWQgCisgICAgaW4gYWxsIGNhcHMuPC9wPgorICAgIDxicj4KKyAgICA8Yj48dT5SZXN1bHQ6PC91PjwvYj48YnI+CisgICAgPG15OmZpbmRCb29rIHZhcj0iYm9vayIvPgorICAgIDx0YWJsZSBib3JkZXI9IjEiPgorICAgICAgICA8dGhlYWQ+CisJICAgIDx0ZD48Yj5GaWVsZDwvYj48L3RkPgorCSAgICA8dGQ+PGI+VmFsdWU8L2I+PC90ZD4KKwkgICAgPHRkPjxiPkNhcGl0YWxpemVkPC9iPjwvdGQ+CisJPC90aGVhZD4KKwk8dHI+CisJICAgIDx0ZD5UaXRsZTwvdGQ+CisJICAgIDx0ZD4ke2Jvb2sudGl0bGV9PC90ZD4KKwkgICAgPHRkPiR7bXk6Y2Fwcyhib29rLnRpdGxlKX08L3RkPgorCTwvdHI+CisJPHRyPgorCSAgICA8dGQ+QXV0aG9yPC90ZD4KKwkgICAgPHRkPiR7Ym9vay5hdXRob3J9PC90ZD4KKwkgICAgPHRkPiR7bXk6Y2Fwcyhib29rLmF1dGhvcil9PC90ZD4KKwk8L3RyPgorCTx0cj4KKwkgICAgPHRkPklTQk48L3RkPgorCSAgICA8dGQ+JHtib29rLmlzYm59PC90ZD4KKwkgICAgPHRkPiR7bXk6Y2Fwcyhib29rLmlzYm4pfTwvdGQ+CisJPC90cj4KKyAgICA8L3RhYmxlPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3NpbXBsZXRhZy9oZWxsby5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9zaW1wbGV0YWcvaGVsbG8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGNhZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9zaW1wbGV0YWcvaGVsbG8uaHRtbApAQCAtMCwwICsxLDMzIEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VmlldyBTb3VyY2UgQ29kZTwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0iaGVsbG8uanNwIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPgorPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9ImhlbGxvLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgdGhlIEhlbGxvIFdvcmxkIFRhZyBFeGFtcGxlIEpTUDxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKzxoMz48YSBocmVmPSJIZWxsb1dvcmxkU2ltcGxlVGFnLmphdmEuaHRtbCI+U291cmNlIENvZGUgZm9yIHRoZSBIZWxsbyBXb3JsZCBTaW1wbGVUYWcgSGFuZGxlcjxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9zaW1wbGV0YWcvaGVsbG8uanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9zaW1wbGV0YWcvaGVsbG8uanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MjEzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3NpbXBsZXRhZy9oZWxsby5qc3AKQEAgLTAsMCArMSwzMSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8JUAgdGFnbGliIHByZWZpeD0ibXl0YWciIHVyaT0iL1dFQi1JTkYvanNwMi9qc3AyLWV4YW1wbGUtdGFnbGliLnRsZCIgJT4KKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+SlNQIDIuMCBFeGFtcGxlcyAtIEhlbGxvIFdvcmxkIFNpbXBsZVRhZyBIYW5kbGVyPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+SlNQIDIuMCBFeGFtcGxlcyAtIEhlbGxvIFdvcmxkIFNpbXBsZVRhZyBIYW5kbGVyPC9oMT4KKyAgICA8aHI+CisgICAgPHA+VGhpcyB0YWcgaGFuZGxlciBzaW1wbHkgZWNob3MgIkhlbGxvLCBXb3JsZCEiICBJdCdzIGFuIGV4YW1wbGUgb2YKKyAgICBhIHZlcnkgYmFzaWMgU2ltcGxlVGFnIGhhbmRsZXIgd2l0aCBubyBib2R5LjwvcD4KKyAgICA8YnI+CisgICAgPGI+PHU+UmVzdWx0OjwvdT48L2I+CisgICAgPG15dGFnOmhlbGxvV29ybGQvPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3NpbXBsZXRhZy9yZXBlYXQuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvc2ltcGxldGFnL3JlcGVhdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NmJmY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3NpbXBsZXRhZy9yZXBlYXQuaHRtbApAQCAtMCwwICsxLDMzIEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VmlldyBTb3VyY2UgQ29kZTwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0icmVwZWF0LmpzcCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT4KKzxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJyZXBlYXQuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciB0aGUgUmVwZWF0IFRhZyBFeGFtcGxlIEpTUDxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKzxoMz48YSBocmVmPSJSZXBlYXRTaW1wbGVUYWcuamF2YS5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgdGhlIFJlcGVhdCBTaW1wbGVUYWcgSGFuZGxlcjxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9zaW1wbGV0YWcvcmVwZWF0LmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvc2ltcGxldGFnL3JlcGVhdC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVkYmY2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvc2ltcGxldGFnL3JlcGVhdC5qc3AKQEAgLTAsMCArMSwzOSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8JUAgdGFnbGliIHByZWZpeD0ibXl0YWciIHVyaT0iL1dFQi1JTkYvanNwMi9qc3AyLWV4YW1wbGUtdGFnbGliLnRsZCIgJT4KKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+SlNQIDIuMCBFeGFtcGxlcyAtIFJlcGVhdCBTaW1wbGVUYWcgSGFuZGxlcjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGgxPkpTUCAyLjAgRXhhbXBsZXMgLSBSZXBlYXQgU2ltcGxlVGFnIEhhbmRsZXI8L2gxPgorICAgIDxocj4KKyAgICA8cD5UaGlzIHRhZyBoYW5kbGVyIGFjY2VwdHMgYSAibnVtIiBwYXJhbWV0ZXIgYW5kIHJlcGVhdHMgdGhlIGJvZHkgb2YgdGhlCisgICAgdGFnICJudW0iIHRpbWVzLiAgSXQncyBhIHNpbXBsZSBleGFtcGxlLCBidXQgdGhlIGltcGxlbWVudGF0aW9uIG9mIAorICAgIHN1Y2ggYSB0YWcgaW4gSlNQIDIuMCBpcyBzdWJzdGFudGlhbGx5IHNpbXBsZXIgdGhhbiB0aGUgZXF1aXZhbGVudCAKKyAgICBKU1AgMS4yLXN0eWxlIGNsYXNzaWMgdGFnIGhhbmRsZXIuPC9wPgorICAgIDxwPlRoZSBib2R5IG9mIHRoZSB0YWcgaXMgZW5jYXBzdWxhdGVkIGluIGEgIkpTUCBGcmFnbWVudCIgYW5kIHBhc3NlZAorICAgIHRvIHRoZSB0YWcgaGFuZGxlciwgd2hpY2ggdGhlbiBleGVjdXRlcyBpdCBmaXZlIHRpbWVzLCBpbnNpZGUgYSAKKyAgICBmb3IgbG9vcC4gIFRoZSB0YWcgaGFuZGxlciBwYXNzZXMgaW4gdGhlIGN1cnJlbnQgaW52b2NhdGlvbiBpbiBhCisgICAgc2NvcGVkIHZhcmlhYmxlIGNhbGxlZCBjb3VudCwgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIHRoZSBFTC48L3A+CisgICAgPGJyPgorICAgIDxiPjx1PlJlc3VsdDo8L3U+PC9iPjxicj4KKyAgICA8bXl0YWc6cmVwZWF0IG51bT0iNSI+CisgICAgICBJbnZvY2F0aW9uICR7Y291bnR9IG9mIDU8YnI+CisgICAgPC9teXRhZzpyZXBlYXQ+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvdGFnZmlsZXMvaGVsbG8uaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvdGFnZmlsZXMvaGVsbG8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjlhMzc5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi90YWdmaWxlcy9oZWxsby5odG1sCkBAIC0wLDAgKzEsMzMgQEAKKzxodG1sPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aGVhZD4KKzx0aXRsZT5WaWV3IFNvdXJjZSBDb2RlPC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJoZWxsby5qc3AiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+Cis8YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0iaGVsbG8uanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBoZWxsby5qc3A8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+Cis8aDM+PGEgaHJlZj0iaGVsbG9Xb3JsZC50YWcuaHRtbCI+U291cmNlIENvZGUgZm9yIGhlbGxvV29ybGQudGFnPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3RhZ2ZpbGVzL2hlbGxvLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvdGFnZmlsZXMvaGVsbG8uanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYTAxNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3RhZ2ZpbGVzL2hlbGxvLmpzcApAQCAtMCwwICsxLDM1IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwlQCB0YWdsaWIgcHJlZml4PSJ0YWdzIiB0YWdkaXI9Ii9XRUItSU5GL3RhZ3MiICU+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkpTUCAyLjAgRXhhbXBsZXMgLSBIZWxsbyBXb3JsZCBVc2luZyBhIFRhZyBGaWxlPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+SlNQIDIuMCBFeGFtcGxlcyAtIEhlbGxvIFdvcmxkIFVzaW5nIGEgVGFnIEZpbGU8L2gxPgorICAgIDxocj4KKyAgICA8cD5UaGlzIEpTUCBwYWdlIGludm9rZXMgYSBjdXN0b20gdGFnIHRoYXQgc2ltcGx5IGVjaG9zICJIZWxsbywgV29ybGQhIiAgCisgICAgVGhlIGN1c3RvbSB0YWcgaXMgZ2VuZXJhdGVkIGZyb20gYSB0YWcgZmlsZSBpbiB0aGUgL1dFQi1JTkYvdGFncworICAgIGRpcmVjdG9yeS48L3A+CisgICAgPHA+Tm90aWNlIHRoYXQgd2UgZGlkIG5vdCBuZWVkIHRvIHdyaXRlIGEgVExEIGZvciB0aGlzIHRhZy4gIFdlIGp1c3QKKyAgICBjcmVhdGVkIC9XRUItSU5GL3RhZ3MvaGVsbG9Xb3JsZC50YWcsIGltcG9ydGVkIGl0IHVzaW5nIHRoZSB0YWdsaWIKKyAgICBkaXJlY3RpdmUsIGFuZCB1c2VkIGl0ITwvcD4KKyAgICA8YnI+CisgICAgPGI+PHU+UmVzdWx0OjwvdT48L2I+CisgICAgPHRhZ3M6aGVsbG9Xb3JsZC8+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvdGFnZmlsZXMvcGFuZWwuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvdGFnZmlsZXMvcGFuZWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjAzYjljCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi90YWdmaWxlcy9wYW5lbC5odG1sCkBAIC0wLDAgKzEsMzMgQEAKKzxodG1sPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aGVhZD4KKzx0aXRsZT5WaWV3IFNvdXJjZSBDb2RlPC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJwYW5lbC5qc3AiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+Cis8YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0icGFuZWwuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBwYW5lbC5qc3A8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+Cis8aDM+PGEgaHJlZj0icGFuZWwudGFnLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBwYW5lbC50YWc8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvdGFnZmlsZXMvcGFuZWwuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi90YWdmaWxlcy9wYW5lbC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlOWJhZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvdGFnZmlsZXMvcGFuZWwuanNwCkBAIC0wLDAgKzEsNTggQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCVAIHRhZ2xpYiBwcmVmaXg9InRhZ3MiIHRhZ2Rpcj0iL1dFQi1JTkYvdGFncyIgJT4KKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+SlNQIDIuMCBFeGFtcGxlcyAtIFBhbmVscyB1c2luZyBUYWcgRmlsZXM8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5KU1AgMi4wIEV4YW1wbGVzIC0gUGFuZWxzIHVzaW5nIFRhZyBGaWxlczwvaDE+CisgICAgPGhyPgorICAgIDxwPlRoaXMgSlNQIHBhZ2UgaW52b2tlcyBhIGN1c3RvbSB0YWcgdGhhdCBkcmF3cyBhIAorICAgIHBhbmVsIGFyb3VuZCB0aGUgY29udGVudHMgb2YgdGhlIHRhZyBib2R5LiAgTm9ybWFsbHksIHN1Y2ggYSB0YWcgCisgICAgaW1wbGVtZW50YXRpb24gd291bGQgcmVxdWlyZSBhIEphdmEgY2xhc3Mgd2l0aCBtYW55IHByaW50bG4oKSBzdGF0ZW1lbnRzLAorICAgIG91dHB1dHRpbmcgSFRNTC4gIEluc3RlYWQsIHdlIGNhbiB1c2UgYSAudGFnIGZpbGUgYXMgYSB0ZW1wbGF0ZSwKKyAgICBhbmQgd2UgZG9uJ3QgbmVlZCB0byB3cml0ZSBhIHNpbmdsZSBsaW5lIG9mIEphdmEgb3IgZXZlbiBhIFRMRCE8L3A+CisgICAgPGhyPgorICAgIDx0YWJsZSBib3JkZXI9IjAiPgorICAgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHRkPgorICAgICAgICAgIDx0YWdzOnBhbmVsIGNvbG9yPSIjZmY4MDgwIiBiZ2NvbG9yPSIjZmZjMGMwIiB0aXRsZT0iUGFuZWwgMSI+CisJICAgIEZpcnN0IHBhbmVsLjxici8+CisJICA8L3RhZ3M6cGFuZWw+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dGFnczpwYW5lbCBjb2xvcj0iIzgwZmY4MCIgYmdjb2xvcj0iI2MwZmZjMCIgdGl0bGU9IlBhbmVsIDIiPgorCSAgICBTZWNvbmQgcGFuZWwuPGJyLz4KKwkgICAgU2Vjb25kIHBhbmVsLjxici8+CisJICAgIFNlY29uZCBwYW5lbC48YnIvPgorCSAgICBTZWNvbmQgcGFuZWwuPGJyLz4KKwkgIDwvdGFnczpwYW5lbD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgIDx0YWdzOnBhbmVsIGNvbG9yPSIjODA4MGZmIiBiZ2NvbG9yPSIjYzBjMGZmIiB0aXRsZT0iUGFuZWwgMyI+CisJICAgIFRoaXJkIHBhbmVsLjxici8+CisgICAgICAgICAgICA8dGFnczpwYW5lbCBjb2xvcj0iI2ZmODBmZiIgYmdjb2xvcj0iI2ZmYzBmZiIgdGl0bGU9IklubmVyIj4KKwkgICAgICBBIHBhbmVsIGluIGEgcGFuZWwuCisJICAgIDwvdGFnczpwYW5lbD4KKwkgICAgVGhpcmQgcGFuZWwuPGJyLz4KKwkgIDwvdGFnczpwYW5lbD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC90YWJsZT4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi90YWdmaWxlcy9wcm9kdWN0cy5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi90YWdmaWxlcy9wcm9kdWN0cy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwM2U4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3RhZ2ZpbGVzL3Byb2R1Y3RzLmh0bWwKQEAgLTAsMCArMSwyMSBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICByZXNlcnZlZC4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VmlldyBTb3VyY2UgQ29kZTwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0icHJvZHVjdHMuanNwIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPgorPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9InByb2R1Y3RzLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgcHJvZHVjdHMuanNwPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorPGgzPjxhIGhyZWY9ImRpc3BsYXlQcm9kdWN0cy50YWcuaHRtbCI+U291cmNlIENvZGUgZm9yIGRpc3BsYXlQcm9kdWN0cy50YWc8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvdGFnZmlsZXMvcHJvZHVjdHMuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi90YWdmaWxlcy9wcm9kdWN0cy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxMzhmMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvdGFnZmlsZXMvcHJvZHVjdHMuanNwCkBAIC0wLDAgKzEsNTQgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCVAIHRhZ2xpYiBwcmVmaXg9InRhZ3MiIHRhZ2Rpcj0iL1dFQi1JTkYvdGFncyIgJT4KKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+SlNQIDIuMCBFeGFtcGxlcyAtIERpc3BsYXkgUHJvZHVjdHMgVGFnIEZpbGU8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5KU1AgMi4wIEV4YW1wbGVzIC0gRGlzcGxheSBQcm9kdWN0cyBUYWcgRmlsZTwvaDE+CisgICAgPGhyPgorICAgIDxwPlRoaXMgSlNQIHBhZ2UgaW52b2tlcyBhIHRhZyBmaWxlIHRoYXQgZGlzcGxheXMgYSBsaXN0aW5nIG9mIAorICAgIHByb2R1Y3RzLiAgVGhlIGN1c3RvbSB0YWcgYWNjZXB0cyB0d28gZnJhZ21lbnRzIHRoYXQgZW5hYmxlCisgICAgY3VzdG9taXphdGlvbiBvZiBhcHBlYXJhbmNlLiAgT25lIGZvciB3aGVuIHRoZSBwcm9kdWN0IGlzIG9uIHNhbGUKKyAgICBhbmQgb25lIGZvciBub3JtYWwgcHJpY2UuPC9wPgorICAgIDxwPlRoZSB0YWcgaXMgaW52b2tlZCB0d2ljZSwgdXNpbmcgZGlmZmVyZW50IHN0eWxlczwvcD4KKyAgICA8aHI+CisgICAgPGgyPlByb2R1Y3RzPC9oMj4KKyAgICA8dGFnczpkaXNwbGF5UHJvZHVjdHM+CisgICAgICA8anNwOmF0dHJpYnV0ZSBuYW1lPSJub3JtYWxQcmljZSI+CisJSXRlbTogJHtuYW1lfTxici8+CisJUHJpY2U6ICR7cHJpY2V9CisgICAgICA8L2pzcDphdHRyaWJ1dGU+CisgICAgICA8anNwOmF0dHJpYnV0ZSBuYW1lPSJvblNhbGUiPgorCUl0ZW06ICR7bmFtZX08YnIvPgorCTxmb250IGNvbG9yPSJyZWQiPjxzdHJpa2U+V2FzOiAke29yaWdQcmljZX08L3N0cmlrZT48L2ZvbnQ+PGJyLz4KKwk8Yj5Ob3c6ICR7c2FsZVByaWNlfTwvYj4KKyAgICAgIDwvanNwOmF0dHJpYnV0ZT4KKyAgICA8L3RhZ3M6ZGlzcGxheVByb2R1Y3RzPgorICAgIDxocj4KKyAgICA8aDI+UHJvZHVjdHMgKFNhbWUgdGFnLCBhbHRlcm5hdGUgc3R5bGUpPC9oMj4KKyAgICA8dGFnczpkaXNwbGF5UHJvZHVjdHM+CisgICAgICA8anNwOmF0dHJpYnV0ZSBuYW1lPSJub3JtYWxQcmljZSI+CisJPGI+JHtuYW1lfTwvYj4gQCAke3ByaWNlfSBlYS4KKyAgICAgIDwvanNwOmF0dHJpYnV0ZT4KKyAgICAgIDxqc3A6YXR0cmlidXRlIG5hbWU9Im9uU2FsZSI+CisJPGI+JHtuYW1lfTwvYj4gQCAke3NhbGVQcmljZX0gZWEuICh3YXM6ICR7b3JpZ1ByaWNlfSkKKyAgICAgIDwvanNwOmF0dHJpYnV0ZT4KKyAgICA8L3RhZ3M6ZGlzcGxheVByb2R1Y3RzPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3B0b3NlcnYvaGVsbG8uanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwdG9zZXJ2L2hlbGxvLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTgxMDUwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwdG9zZXJ2L2hlbGxvLmpzcApAQCAtMCwwICsxLDI2IEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorCis8aDE+CitJIGhhdmUgYmVlbiBpbnZva2VkIGJ5Cis8JSBvdXQucHJpbnQgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJzZXJ2bGV0TmFtZSIpLnRvU3RyaW5nKCkpOyAlPgorU2VydmxldC4KKzwvaDE+CisKKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3B0b3NlcnYvanNwdG9zZXJ2bGV0LmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcHRvc2Vydi9qc3B0b3NlcnZsZXQuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhN2U1N2YKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3B0b3NlcnYvanNwdG9zZXJ2bGV0LmpzcApAQCAtMCwwICsxLDIzIEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorCis8IS0tIEZvcndhcmQgdG8gYSBzZXJ2bGV0IC0tPgorPGpzcDpmb3J3YXJkIHBhZ2U9Ii9zZXJ2bGV0VG9Kc3AiIC8+CisKKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3B0b3NlcnYvanRzLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3B0b3NlcnYvanRzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwZThlNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcHRvc2Vydi9qdHMuaHRtbApAQCAtMCwwICsxLDM0IEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8aGVhZD4KKzx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0ianNwdG9zZXJ2bGV0LmpzcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSIuLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0ianNwdG9zZXJ2bGV0LmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgSlNQIGNhbGxpbmcgc2VydmxldCA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzxoMz48YSBocmVmPSJzZXJ2bGV0VG9Kc3AuamF2YS5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgU2VydmxldCBjYWxsaW5nIEpTUCAKKzxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+IDwvZm9udD4gPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvbnVtL251bWd1ZXNzLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9udW0vbnVtZ3Vlc3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzVhNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvbnVtL251bWd1ZXNzLmh0bWwKQEAgLTAsMCArMSwzNCBAQAorPGh0bWw+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyAgTnVtYmVyIEd1ZXNzIEdhbWUKKyAgV3JpdHRlbiBieSBKYXNvbiBIdW50ZXIsIENUTywgSyZBIFNvZnR3YXJlCisgIGh0dHA6Ly93d3cuc2VydmxldHMuY29tCistLT4KKzxoZWFkPgorPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJudW1ndWVzcy5qc3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9Im51bWd1ZXNzLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgTnVtZ3Vlc3MgRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvbnVtL251bWd1ZXNzLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL251bS9udW1ndWVzcy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2MWJmNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL251bS9udW1ndWVzcy5qc3AKQEAgLTAsMCArMSw2OSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisgIE51bWJlciBHdWVzcyBHYW1lCisgIFdyaXR0ZW4gYnkgSmFzb24gSHVudGVyLCBDVE8sIEsmQSBTb2Z0d2FyZQorICBodHRwOi8vd3d3LnNlcnZsZXRzLmNvbQorLS0+CisKKzwlQCBwYWdlIGltcG9ydCA9ICJudW0uTnVtYmVyR3Vlc3NCZWFuIiAlPgorCis8anNwOnVzZUJlYW4gaWQ9Im51bWd1ZXNzIiBjbGFzcz0ibnVtLk51bWJlckd1ZXNzQmVhbiIgc2NvcGU9InNlc3Npb24iLz4KKzxqc3A6c2V0UHJvcGVydHkgbmFtZT0ibnVtZ3Vlc3MiIHByb3BlcnR5PSIqIi8+CisKKzxodG1sPgorPGhlYWQ+PHRpdGxlPk51bWJlciBHdWVzczwvdGl0bGU+PC9oZWFkPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorPGZvbnQgc2l6ZT00PgorCis8JSBpZiAobnVtZ3Vlc3MuZ2V0U3VjY2VzcygpKSB7ICU+CisKKyAgQ29uZ3JhdHVsYXRpb25zISAgWW91IGdvdCBpdC4KKyAgQW5kIGFmdGVyIGp1c3QgPCU9IG51bWd1ZXNzLmdldE51bUd1ZXNzZXMoKSAlPiB0cmllcy48cD4KKworICA8JSBudW1ndWVzcy5yZXNldCgpOyAlPgorCisgIENhcmUgdG8gPGEgaHJlZj0ibnVtZ3Vlc3MuanNwIj50cnkgYWdhaW48L2E+PworCis8JSB9IGVsc2UgaWYgKG51bWd1ZXNzLmdldE51bUd1ZXNzZXMoKSA9PSAwKSB7ICU+CisKKyAgV2VsY29tZSB0byB0aGUgTnVtYmVyIEd1ZXNzIGdhbWUuPHA+CisKKyAgSSdtIHRoaW5raW5nIG9mIGEgbnVtYmVyIGJldHdlZW4gMSBhbmQgMTAwLjxwPgorCisgIDxmb3JtIG1ldGhvZD1nZXQ+CisgIFdoYXQncyB5b3VyIGd1ZXNzPyA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9Z3Vlc3M+CisgIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iU3VibWl0Ij4KKyAgPC9mb3JtPgorCis8JSB9IGVsc2UgeyAlPgorCisgIEdvb2QgZ3Vlc3MsIGJ1dCBub3BlLiAgVHJ5IDxiPjwlPSBudW1ndWVzcy5nZXRIaW50KCkgJT48L2I+LgorCisgIFlvdSBoYXZlIG1hZGUgPCU9IG51bWd1ZXNzLmdldE51bUd1ZXNzZXMoKSAlPiBndWVzc2VzLjxwPgorCisgIEknbSB0aGlua2luZyBvZiBhIG51bWJlciBiZXR3ZWVuIDEgYW5kIDEwMC48cD4KKworICA8Zm9ybSBtZXRob2Q9Z2V0PgorICBXaGF0J3MgeW91ciBndWVzcz8gPGlucHV0IHR5cGU9dGV4dCBuYW1lPWd1ZXNzPgorICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9IlN1Ym1pdCI+CisgIDwvZm9ybT4KKworPCUgfSAlPgorCis8L2ZvbnQ+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9wbHVnaW4vYXBwbGV0L0Nsb2NrMi5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvcGx1Z2luL2FwcGxldC9DbG9jazIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWQ3MDU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvcGx1Z2luL2FwcGxldC9DbG9jazIuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXBwbGV0Lio7CitpbXBvcnQgamF2YS50ZXh0Lio7CisKKy8qKgorICogVGltZSEKKyAqCisgKiBAYXV0aG9yIFJhY2hlbCBHb2xsdWIKKyAqLworCitwdWJsaWMgY2xhc3MgQ2xvY2syIGV4dGVuZHMgQXBwbGV0IGltcGxlbWVudHMgUnVubmFibGUgeworICAgIFRocmVhZCB0aW1lcjsgICAgICAgICAgICAgICAgLy8gVGhlIHRocmVhZCB0aGF0IGRpc3BsYXlzIGNsb2NrCisgICAgaW50IGxhc3R4cywgbGFzdHlzLCBsYXN0eG0sCisgICAgICAgIGxhc3R5bSwgbGFzdHhoLCBsYXN0eWg7ICAvLyBEaW1lbnNpb25zIHVzZWQgdG8gZHJhdyBoYW5kcyAKKyAgICBTaW1wbGVEYXRlRm9ybWF0IGZvcm1hdHRlcjsgIC8vIEZvcm1hdHMgdGhlIGRhdGUgZGlzcGxheWVkCisgICAgU3RyaW5nIGxhc3RkYXRlOyAgICAgICAgICAgICAvLyBTdHJpbmcgdG8gaG9sZCBkYXRlIGRpc3BsYXllZAorICAgIEZvbnQgY2xvY2tGYWNlRm9udDsgICAgICAgICAgLy8gRm9udCBmb3IgbnVtYmVyIGRpc3BsYXkgb24gY2xvY2sKKyAgICBEYXRlIGN1cnJlbnREYXRlOyAgICAgICAgICAgIC8vIFVzZWQgdG8gZ2V0IGRhdGUgdG8gZGlzcGxheQorICAgIENvbG9yIGhhbmRDb2xvcjsgICAgICAgICAgICAgLy8gQ29sb3Igb2YgbWFpbiBoYW5kcyBhbmQgZGlhbAorICAgIENvbG9yIG51bWJlckNvbG9yOyAgICAgICAgICAgLy8gQ29sb3Igb2Ygc2Vjb25kIGhhbmQgYW5kIG51bWJlcnMKKworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIGludCB4LHk7CisgICAgICAgIGxhc3R4cyA9IGxhc3R5cyA9IGxhc3R4bSA9IGxhc3R5bSA9IGxhc3R4aCA9IGxhc3R5aCA9IDA7CisgICAgICAgIGZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0ICgiRUVFIE1NTSBkZCBoaDptbTpzcyB5eXl5IiwgTG9jYWxlLmdldERlZmF1bHQoKSk7CisgICAgICAgIGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTsKKyAgICAgICAgbGFzdGRhdGUgPSBmb3JtYXR0ZXIuZm9ybWF0KGN1cnJlbnREYXRlKTsKKyAgICAgICAgY2xvY2tGYWNlRm9udCA9IG5ldyBGb250KCJTZXJpZiIsIEZvbnQuUExBSU4sIDE0KTsKKyAgICAgICAgaGFuZENvbG9yID0gQ29sb3IuYmx1ZTsKKyAgICAgICAgbnVtYmVyQ29sb3IgPSBDb2xvci5kYXJrR3JheTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0QmFja2dyb3VuZChuZXcgQ29sb3IoSW50ZWdlci5wYXJzZUludChnZXRQYXJhbWV0ZXIoImJnY29sb3IiKSwxNikpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIEUpIHsgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaGFuZENvbG9yID0gbmV3IENvbG9yKEludGVnZXIucGFyc2VJbnQoZ2V0UGFyYW1ldGVyKCJmZ2NvbG9yMSIpLDE2KSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBFKSB7IH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG51bWJlckNvbG9yID0gbmV3IENvbG9yKEludGVnZXIucGFyc2VJbnQoZ2V0UGFyYW1ldGVyKCJmZ2NvbG9yMiIpLDE2KSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBFKSB7IH0KKyAgICAgICAgcmVzaXplKDMwMCwzMDApOyAgICAgICAgICAgICAgLy8gU2V0IGNsb2NrIHdpbmRvdyBzaXplCisgICAgfQorCisgICAgLy8gUGxvdHBvaW50cyBhbGxvd3MgY2FsY3VsYXRpb24gdG8gb25seSBjb3ZlciA0NSBkZWdyZWVzIG9mIHRoZSBjaXJjbGUsCisgICAgLy8gYW5kIHRoZW4gbWlycm9yCisgICAgcHVibGljIHZvaWQgcGxvdHBvaW50cyhpbnQgeDAsIGludCB5MCwgaW50IHgsIGludCB5LCBHcmFwaGljcyBnKSB7CisgICAgICAgIGcuZHJhd0xpbmUoeDAreCx5MCt5LHgwK3gseTAreSk7CisgICAgICAgIGcuZHJhd0xpbmUoeDAreSx5MCt4LHgwK3kseTAreCk7CisgICAgICAgIGcuZHJhd0xpbmUoeDAreSx5MC14LHgwK3kseTAteCk7CisgICAgICAgIGcuZHJhd0xpbmUoeDAreCx5MC15LHgwK3gseTAteSk7CisgICAgICAgIGcuZHJhd0xpbmUoeDAteCx5MC15LHgwLXgseTAteSk7CisgICAgICAgIGcuZHJhd0xpbmUoeDAteSx5MC14LHgwLXkseTAteCk7CisgICAgICAgIGcuZHJhd0xpbmUoeDAteSx5MCt4LHgwLXkseTAreCk7CisgICAgICAgIGcuZHJhd0xpbmUoeDAteCx5MCt5LHgwLXgseTAreSk7CisgICAgfQorCisgICAgLy8gQ2lyY2xlIGlzIGp1c3QgQnJlc2VuaGFtJ3MgYWxnb3JpdGhtIGZvciBhIHNjYW4gY29udmVydGVkIGNpcmNsZQorICAgIHB1YmxpYyB2b2lkIGNpcmNsZShpbnQgeDAsIGludCB5MCwgaW50IHIsIEdyYXBoaWNzIGcpIHsKKyAgICAgICAgaW50IHgseTsKKyAgICAgICAgZmxvYXQgZDsKKyAgICAgICAgeD0wOworICAgICAgICB5PXI7CisgICAgICAgIGQ9NS80LXI7CisgICAgICAgIHBsb3Rwb2ludHMoeDAseTAseCx5LGcpOworCisgICAgICAgIHdoaWxlICh5PngpeworICAgICAgICAgICAgaWYgKGQ8MCkgeworICAgICAgICAgICAgICAgIGQ9ZCsyKngrMzsKKyAgICAgICAgICAgICAgICB4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBkPWQrMiooeC15KSs1OworICAgICAgICAgICAgICAgIHgrKzsKKyAgICAgICAgICAgICAgICB5LS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwbG90cG9pbnRzKHgwLHkwLHgseSxnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFBhaW50IGlzIHRoZSBtYWluIHBhcnQgb2YgdGhlIHByb2dyYW0KKyAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBnKSB7CisgICAgICAgIGludCB4aCwgeWgsIHhtLCB5bSwgeHMsIHlzLCBzID0gMCwgbSA9IDEwLCBoID0gMTAsIHhjZW50ZXIsIHljZW50ZXI7CisgICAgICAgIFN0cmluZyB0b2RheTsKKworICAgICAgICBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7CisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInMiLExvY2FsZS5nZXREZWZhdWx0KCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcyA9IEludGVnZXIucGFyc2VJbnQoZm9ybWF0dGVyLmZvcm1hdChjdXJyZW50RGF0ZSkpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbikgeworICAgICAgICAgICAgcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZm9ybWF0dGVyLmFwcGx5UGF0dGVybigibSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbSA9IEludGVnZXIucGFyc2VJbnQoZm9ybWF0dGVyLmZvcm1hdChjdXJyZW50RGF0ZSkpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbikgeworICAgICAgICAgICAgbSA9IDEwOworICAgICAgICB9ICAgIAorICAgICAgICBmb3JtYXR0ZXIuYXBwbHlQYXR0ZXJuKCJoIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBoID0gSW50ZWdlci5wYXJzZUludChmb3JtYXR0ZXIuZm9ybWF0KGN1cnJlbnREYXRlKSk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuKSB7CisgICAgICAgICAgICBoID0gMTA7CisgICAgICAgIH0KKyAgICAgICAgZm9ybWF0dGVyLmFwcGx5UGF0dGVybigiRUVFIE1NTSBkZCBISDptbTpzcyB5eXl5Iik7CisgICAgICAgIHRvZGF5ID0gZm9ybWF0dGVyLmZvcm1hdChjdXJyZW50RGF0ZSk7CisgICAgICAgIHhjZW50ZXI9ODA7CisgICAgICAgIHljZW50ZXI9NTU7CisgICAgCisgICAgLy8gYT0gcyogcGkvMiAtIHBpLzIgKHRvIHN3aXRjaCAwLDAgZnJvbSAzOjAwIHRvIDEyOjAwKQorICAgIC8vIHggPSByKGNvcyBhKSArIHhjZW50ZXIsIHkgPSByKHNpbiBhKSArIHljZW50ZXIKKyAgICAKKyAgICAgICAgeHMgPSAoaW50KShNYXRoLmNvcyhzICogMy4xNGYvMzAgLSAzLjE0Zi8yKSAqIDQ1ICsgeGNlbnRlcik7CisgICAgICAgIHlzID0gKGludCkoTWF0aC5zaW4ocyAqIDMuMTRmLzMwIC0gMy4xNGYvMikgKiA0NSArIHljZW50ZXIpOworICAgICAgICB4bSA9IChpbnQpKE1hdGguY29zKG0gKiAzLjE0Zi8zMCAtIDMuMTRmLzIpICogNDAgKyB4Y2VudGVyKTsKKyAgICAgICAgeW0gPSAoaW50KShNYXRoLnNpbihtICogMy4xNGYvMzAgLSAzLjE0Zi8yKSAqIDQwICsgeWNlbnRlcik7CisgICAgICAgIHhoID0gKGludCkoTWF0aC5jb3MoKGgqMzAgKyBtLzIpICogMy4xNGYvMTgwIC0gMy4xNGYvMikgKiAzMCArIHhjZW50ZXIpOworICAgICAgICB5aCA9IChpbnQpKE1hdGguc2luKChoKjMwICsgbS8yKSAqIDMuMTRmLzE4MCAtIDMuMTRmLzIpICogMzAgKyB5Y2VudGVyKTsKKyAgICAKKyAgICAvLyBEcmF3IHRoZSBjaXJjbGUgYW5kIG51bWJlcnMKKyAgICAKKyAgICAgICAgZy5zZXRGb250KGNsb2NrRmFjZUZvbnQpOworICAgICAgICBnLnNldENvbG9yKGhhbmRDb2xvcik7CisgICAgICAgIGNpcmNsZSh4Y2VudGVyLHljZW50ZXIsNTAsZyk7CisgICAgICAgIGcuc2V0Q29sb3IobnVtYmVyQ29sb3IpOworICAgICAgICBnLmRyYXdTdHJpbmcoIjkiLHhjZW50ZXItNDUseWNlbnRlciszKTsgCisgICAgICAgIGcuZHJhd1N0cmluZygiMyIseGNlbnRlcis0MCx5Y2VudGVyKzMpOworICAgICAgICBnLmRyYXdTdHJpbmcoIjEyIix4Y2VudGVyLTUseWNlbnRlci0zNyk7CisgICAgICAgIGcuZHJhd1N0cmluZygiNiIseGNlbnRlci0zLHljZW50ZXIrNDUpOworCisgICAgLy8gRXJhc2UgaWYgbmVjZXNzYXJ5LCBhbmQgcmVkcmF3CisgICAgCisgICAgICAgIGcuc2V0Q29sb3IoZ2V0QmFja2dyb3VuZCgpKTsKKyAgICAgICAgaWYgKHhzICE9IGxhc3R4cyB8fCB5cyAhPSBsYXN0eXMpIHsKKyAgICAgICAgICAgIGcuZHJhd0xpbmUoeGNlbnRlciwgeWNlbnRlciwgbGFzdHhzLCBsYXN0eXMpOworICAgICAgICAgICAgZy5kcmF3U3RyaW5nKGxhc3RkYXRlLCA1LCAxMjUpOworICAgICAgICB9CisgICAgICAgIGlmICh4bSAhPSBsYXN0eG0gfHwgeW0gIT0gbGFzdHltKSB7CisgICAgICAgICAgICBnLmRyYXdMaW5lKHhjZW50ZXIsIHljZW50ZXItMSwgbGFzdHhtLCBsYXN0eW0pOworICAgICAgICAgICAgZy5kcmF3TGluZSh4Y2VudGVyLTEsIHljZW50ZXIsIGxhc3R4bSwgbGFzdHltKTsgfQorICAgICAgICBpZiAoeGggIT0gbGFzdHhoIHx8IHloICE9IGxhc3R5aCkgeworICAgICAgICAgICAgZy5kcmF3TGluZSh4Y2VudGVyLCB5Y2VudGVyLTEsIGxhc3R4aCwgbGFzdHloKTsKKyAgICAgICAgICAgIGcuZHJhd0xpbmUoeGNlbnRlci0xLCB5Y2VudGVyLCBsYXN0eGgsIGxhc3R5aCk7IH0KKyAgICAgICAgZy5zZXRDb2xvcihudW1iZXJDb2xvcik7CisgICAgICAgIGcuZHJhd1N0cmluZygiIiwgNSwgMTI1KTsKKyAgICAgICAgZy5kcmF3U3RyaW5nKHRvZGF5LCA1LCAxMjUpOyAgICAKKyAgICAgICAgZy5kcmF3TGluZSh4Y2VudGVyLCB5Y2VudGVyLCB4cywgeXMpOworICAgICAgICBnLnNldENvbG9yKGhhbmRDb2xvcik7CisgICAgICAgIGcuZHJhd0xpbmUoeGNlbnRlciwgeWNlbnRlci0xLCB4bSwgeW0pOworICAgICAgICBnLmRyYXdMaW5lKHhjZW50ZXItMSwgeWNlbnRlciwgeG0sIHltKTsKKyAgICAgICAgZy5kcmF3TGluZSh4Y2VudGVyLCB5Y2VudGVyLTEsIHhoLCB5aCk7CisgICAgICAgIGcuZHJhd0xpbmUoeGNlbnRlci0xLCB5Y2VudGVyLCB4aCwgeWgpOworICAgICAgICBsYXN0eHM9eHM7IGxhc3R5cz15czsKKyAgICAgICAgbGFzdHhtPXhtOyBsYXN0eW09eW07CisgICAgICAgIGxhc3R4aD14aDsgbGFzdHloPXloOworICAgICAgICBsYXN0ZGF0ZSA9IHRvZGF5OworICAgICAgICBjdXJyZW50RGF0ZT1udWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICB0aW1lciA9IG5ldyBUaHJlYWQodGhpcyk7CisgICAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgdGltZXIgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgVGhyZWFkIG1lID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgd2hpbGUgKHRpbWVyID09IG1lKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGFpbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShHcmFwaGljcyBnKSB7CisgICAgICAgIHBhaW50KGcpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwbGV0SW5mbygpIHsKKyAgICAgICAgcmV0dXJuICJUaXRsZTogQSBDbG9jayBcbkF1dGhvcjogUmFjaGVsIEdvbGx1YiwgMTk5NSBcbkFuIGFuYWxvZyBjbG9jay4iOworICAgIH0KKyAgCisgICAgcHVibGljIFN0cmluZ1tdW10gZ2V0UGFyYW1ldGVySW5mbygpIHsKKyAgICAgICAgU3RyaW5nW11bXSBpbmZvID0geworICAgICAgICAgICAgeyJiZ2NvbG9yIiwgImhleGFkZWNpbWFsIFJHQiBudW1iZXIiLCAiVGhlIGJhY2tncm91bmQgY29sb3IuIERlZmF1bHQgaXMgdGhlIGNvbG9yIG9mIHlvdXIgYnJvd3Nlci4ifSwKKyAgICAgICAgICAgIHsiZmdjb2xvcjEiLCAiaGV4YWRlY2ltYWwgUkdCIG51bWJlciIsICJUaGUgY29sb3Igb2YgdGhlIGhhbmRzIGFuZCBkaWFsLiBEZWZhdWx0IGlzIGJsdWUuIn0sCisgICAgICAgICAgICB7ImZnY29sb3IyIiwgImhleGFkZWNpbWFsIFJHQiBudW1iZXIiLCAiVGhlIGNvbG9yIG9mIHRoZSBzZWNvbmRzIGhhbmQgYW5kIG51bWJlcnMuIERlZmF1bHQgaXMgZGFyayBncmF5LiJ9CisgICAgICAgIH07CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3BsdWdpbi9wbHVnaW4uaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3BsdWdpbi9wbHVnaW4uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2JjNTFiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvcGx1Z2luL3BsdWdpbi5odG1sCkBAIC0wLDAgKzEsMzAgQEAKKzxodG1sPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aGVhZD4KKzx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0icGx1Z2luLmpzcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSIuLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0icGx1Z2luLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgUGx1Z2luIEV4YW1wbGU8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3BsdWdpbi9wbHVnaW4uanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvcGx1Z2luL3BsdWdpbi5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4YTExMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3BsdWdpbi9wbHVnaW4uanNwCkBAIC0wLDAgKzEsMzQgQEAKKzxodG1sPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8dGl0bGU+IFBsdWdpbiBleGFtcGxlIDwvdGl0bGU+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+Cis8aDM+IEN1cnJlbnQgdGltZSBpcyA6IDwvaDM+Cis8anNwOnBsdWdpbiB0eXBlPSJhcHBsZXQiIGNvZGU9IkNsb2NrMi5jbGFzcyIgY29kZWJhc2U9ImFwcGxldCIganJldmVyc2lvbj0iMS4yIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjE1MCIgPgorICAgIDxqc3A6ZmFsbGJhY2s+CisgICAgICAgIFBsdWdpbiB0YWcgT0JKRUNUIG9yIEVNQkVEIG5vdCBzdXBwb3J0ZWQgYnkgYnJvd3Nlci4KKyAgICA8L2pzcDpmYWxsYmFjaz4KKzwvanNwOnBsdWdpbj4KKzxwPgorPGg0PgorPGZvbnQgY29sb3I9cmVkPiAKK1RoZSBhYm92ZSBhcHBsZXQgaXMgbG9hZGVkIHVzaW5nIHRoZSBKYXZhIFBsdWdpbiBmcm9tIGEganNwIHBhZ2UgdXNpbmcgdGhlCitwbHVnaW4gdGFnLgorPC9mb250PgorPC9oND4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NlY3VyaXR5L3Byb3RlY3RlZC9lcnJvci5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zZWN1cml0eS9wcm90ZWN0ZWQvZXJyb3IuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZmY1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zZWN1cml0eS9wcm90ZWN0ZWQvZXJyb3IuanNwCkBAIC0wLDAgKzEsMjUgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5FcnJvciBQYWdlIEZvciBFeGFtcGxlczwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+CitJbnZhbGlkIHVzZXJuYW1lIGFuZC9vciBwYXNzd29yZCwgcGxlYXNlIHRyeQorPGEgaHJlZj0nPCU9IHJlc3BvbnNlLmVuY29kZVVSTCgibG9naW4uanNwIikgJT4nPmFnYWluPC9hPi4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NlY3VyaXR5L3Byb3RlY3RlZC9pbmRleC5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zZWN1cml0eS9wcm90ZWN0ZWQvaW5kZXguanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NTg1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zZWN1cml0eS9wcm90ZWN0ZWQvaW5kZXguanNwCkBAIC0wLDAgKzEsNzkgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCUKKyAgaWYgKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJsb2dvZmYiKSAhPSBudWxsKSB7CisgICAgc2Vzc2lvbi5pbnZhbGlkYXRlKCk7CisgICAgcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KCJpbmRleC5qc3AiKTsKKyAgICByZXR1cm47CisgIH0KKyU+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPlByb3RlY3RlZCBQYWdlIGZvciBFeGFtcGxlczwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+CisKK1lvdSBhcmUgbG9nZ2VkIGluIGFzIHJlbW90ZSB1c2VyIDxiPjwlPSByZXF1ZXN0LmdldFJlbW90ZVVzZXIoKSAlPjwvYj4KK2luIHNlc3Npb24gPGI+PCU9IHNlc3Npb24uZ2V0SWQoKSAlPjwvYj48YnI+PGJyPgorCis8JQorICBpZiAocmVxdWVzdC5nZXRVc2VyUHJpbmNpcGFsKCkgIT0gbnVsbCkgeworJT4KKyAgICBZb3VyIHVzZXIgcHJpbmNpcGFsIG5hbWUgaXMKKyAgICA8Yj48JT0gcmVxdWVzdC5nZXRVc2VyUHJpbmNpcGFsKCkuZ2V0TmFtZSgpICU+PC9iPjxicj48YnI+Cis8JQorICB9IGVsc2UgeworJT4KKyAgICBObyB1c2VyIHByaW5jaXBhbCBjb3VsZCBiZSBpZGVudGlmaWVkLjxicj48YnI+Cis8JQorICB9CislPgorCis8JQorICBTdHJpbmcgcm9sZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJyb2xlIik7CisgIGlmIChyb2xlID09IG51bGwpCisgICAgcm9sZSA9ICIiOworICBpZiAocm9sZS5sZW5ndGgoKSA+IDApIHsKKyAgICBpZiAocmVxdWVzdC5pc1VzZXJJblJvbGUocm9sZSkpIHsKKyU+CisgICAgICBZb3UgaGF2ZSBiZWVuIGdyYW50ZWQgcm9sZQorICAgICAgPGI+PCU9IHV0aWwuSFRNTEZpbHRlci5maWx0ZXIocm9sZSkgJT48L2I+PGJyPjxicj4KKzwlCisgICAgfSBlbHNlIHsKKyU+CisgICAgICBZb3UgaGF2ZSA8aT5ub3Q8L2k+IGJlZW4gZ3JhbnRlZCByb2xlCisgICAgICA8Yj48JT0gdXRpbC5IVE1MRmlsdGVyLmZpbHRlcihyb2xlKSAlPjwvYj48YnI+PGJyPgorPCUKKyAgICB9CisgIH0KKyU+CisKK1RvIGNoZWNrIHdoZXRoZXIgeW91ciB1c2VybmFtZSBoYXMgYmVlbiBncmFudGVkIGEgcGFydGljdWxhciByb2xlLAorZW50ZXIgaXQgaGVyZToKKzxmb3JtIG1ldGhvZD0iR0VUIiBhY3Rpb249JzwlPSByZXNwb25zZS5lbmNvZGVVUkwoImluZGV4LmpzcCIpICU+Jz4KKzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJyb2xlIiB2YWx1ZT0iPCU9IHV0aWwuSFRNTEZpbHRlci5maWx0ZXIocm9sZSkgJT4iPgorPC9mb3JtPgorPGJyPjxicj4KKworSWYgeW91IGhhdmUgY29uZmlndXJlZCB0aGlzIGFwcCBmb3IgZm9ybS1iYXNlZCBhdXRoZW50aWNhdGlvbiwgeW91IGNhbiBsb2cKK29mZiBieSBjbGlja2luZworPGEgaHJlZj0nPCU9IHJlc3BvbnNlLmVuY29kZVVSTCgiaW5kZXguanNwP2xvZ29mZj10cnVlIikgJT4nPmhlcmU8L2E+LgorVGhpcyBzaG91bGQgY2F1c2UgeW91IHRvIGJlIHJldHVybmVkIHRvIHRoZSBsb2dvbiBwYWdlIGFmdGVyIHRoZSByZWRpcmVjdAordGhhdCBpcyBwZXJmb3JtZWQuCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NlY3VyaXR5L3Byb3RlY3RlZC9sb2dpbi5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zZWN1cml0eS9wcm90ZWN0ZWQvbG9naW4uanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMzgxYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zZWN1cml0eS9wcm90ZWN0ZWQvbG9naW4uanNwCkBAIC0wLDAgKzEsMzggQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5Mb2dpbiBQYWdlIGZvciBFeGFtcGxlczwvdGl0bGU+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+Cis8Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0nPCU9IHJlc3BvbnNlLmVuY29kZVVSTCgial9zZWN1cml0eV9jaGVjayIpICU+JyA+CisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSI1Ij4KKyAgICA8dHI+CisgICAgICA8dGggYWxpZ249InJpZ2h0Ij5Vc2VybmFtZTo8L3RoPgorICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ial91c2VybmFtZSI+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0aCBhbGlnbj0icmlnaHQiPlBhc3N3b3JkOjwvdGg+CisgICAgICA8dGQgYWxpZ249ImxlZnQiPjxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0ial9wYXNzd29yZCI+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJMb2cgSW4iPjwvdGQ+CisgICAgICA8dGQgYWxpZ249ImxlZnQiPjxpbnB1dCB0eXBlPSJyZXNldCI+PC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorPC9mb3JtPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc2Vzc2lvbnMvRHVtbXlDYXJ0Lmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zZXNzaW9ucy9EdW1teUNhcnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTUzZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc2Vzc2lvbnMvRHVtbXlDYXJ0Lmh0bWwKQEAgLTAsMCArMSw1NiBAQAorPEhUTUw+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEhFQUQ+Cis8dGl0bGU+CitzZXNzaW9ucy5EdW1teUNhcnQgQmVhbiBQcm9wZXJ0aWVzCis8L3RpdGxlPgorPEJPRFkgQkdDT0xPUj0id2hpdGUiPgorPEgyPgorc2Vzc2lvbnMuRHVtbXlDYXJ0IEJlYW4gUHJvcGVydGllcworPC9IMj4KKzxIUj4KKzxETD4KKzxEVD5wdWJsaWMgY2xhc3MgPEI+RHVtbXlDYXJ0PC9CPjxEVD5leHRlbmRzIE9iamVjdDwvREw+CisKKzxQPgorPEhSPgorCis8UD4KKworPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCI+Cis8VFIgQkdDT0xPUj0iI0VFRUVGRiI+Cis8VEQgQ09MU1BBTj0zPjxGT05UIFNJWkU9IisyIj4KKzxCPlByb3BlcnRpZXMgU3VtbWFyeTwvQj48L0ZPTlQ+PC9URD4KKzwvVFI+Cis8VFIgQkdDT0xPUj0id2hpdGUiPgorPHRkIGFsaWduPSJyaWdodCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxJSI+Cis8Rk9OVCBTSVpFPSItMSI+CitTdHJpbmcKKzwvRk9OVD48L1REPgorPFREPjxCPkR1bW15Q2FydDppdGVtczwvQj4KKzxCUj4KKyAgICAgICA8L1REPgorPHRkIHdpZHRoPSIxJSI+Cis8Rk9OVCBTSVpFPSItMSI+CitNdWx0aQorPC9GT05UPjwvVEQ+Cis8L1RBQkxFPgorPEhSPgorPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc2Vzc2lvbnMvY2FydHMuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3Nlc3Npb25zL2NhcnRzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjZTI5MQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3Nlc3Npb25zL2NhcnRzLmh0bWwKQEAgLTAsMCArMSw1MyBAQAorPGh0bWw+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGhlYWQ+CisgICAgPHRpdGxlPmNhcnRzPC90aXRsZT4KKzwvaGVhZD4KKworIDxib2R5IGJnY29sb3I9IndoaXRlIj4KKzxmb250IHNpemUgPSA1IGNvbG9yPSIjQ0MwMDAwIj4KKworPGZvcm0gdHlwZT1QT1NUIGFjdGlvbj1jYXJ0cy5qc3A+Cis8QlI+CitQbGVhc2UgZW50ZXIgaXRlbSB0byBhZGQgb3IgcmVtb3ZlOgorPGJyPgorQWRkIEl0ZW06CisKKzxTRUxFQ1QgTkFNRT0iaXRlbSI+Cis8T1BUSU9OPkJlYXZpcyAmIEJ1dHQtaGVhZCBWaWRlbyBjb2xsZWN0aW9uCis8T1BUSU9OPlgtZmlsZXMgbW92aWUKKzxPUFRJT04+VHdpbiBwZWFrcyB0YXBlcworPE9QVElPTj5OSU4gQ0QKKzxPUFRJT04+SlNQIEJvb2sKKzxPUFRJT04+Q29uY2VydCB0aWNrZXRzCis8T1BUSU9OPkxvdmUgbGlmZQorPE9QVElPTj5Td2l0Y2ggYmxhZGUKKzxPUFRJT04+UmV4LCBSdWdzICYgUm9jayBuJyBSb2xsCis8L1NFTEVDVD4KKworCis8YnI+IDxicj4KKzxJTlBVVCBUWVBFPXN1Ym1pdCBuYW1lPSJzdWJtaXQiIHZhbHVlPSJhZGQiPgorPElOUFVUIFRZUEU9c3VibWl0IG5hbWU9InN1Ym1pdCIgdmFsdWU9InJlbW92ZSI+CisKKzwvZm9ybT4KKyAgICAgICAKKzwvRk9OVD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3Nlc3Npb25zL2NhcnRzLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3Nlc3Npb25zL2NhcnRzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjlkZjc0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc2Vzc2lvbnMvY2FydHMuanNwCkBAIC0wLDAgKzEsNDQgQEAKKzxodG1sPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxqc3A6dXNlQmVhbiBpZD0iY2FydCIgc2NvcGU9InNlc3Npb24iIGNsYXNzPSJzZXNzaW9ucy5EdW1teUNhcnQiIC8+CisKKzxqc3A6c2V0UHJvcGVydHkgbmFtZT0iY2FydCIgcHJvcGVydHk9IioiIC8+Cis8JQorCWNhcnQucHJvY2Vzc1JlcXVlc3QocmVxdWVzdCk7CislPgorCisKKzxGT05UIHNpemUgPSA1IENPTE9SPSIjQ0MwMDAwIj4KKzxicj4gWW91IGhhdmUgdGhlIGZvbGxvd2luZyBpdGVtcyBpbiB5b3VyIGNhcnQ6Cis8b2w+Cis8JSAKKwlTdHJpbmdbXSBpdGVtcyA9IGNhcnQuZ2V0SXRlbXMoKTsKKwlmb3IgKGludCBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKKyU+Cis8bGk+IDwlIG91dC5wcmludCh1dGlsLkhUTUxGaWx0ZXIuZmlsdGVyKGl0ZW1zW2ldKSk7ICU+IAorPCUKKwl9CislPgorPC9vbD4KKworPC9GT05UPgorCis8aHI+Cis8JUAgaW5jbHVkZSBmaWxlID0iL3Nlc3Npb25zL2NhcnRzLmh0bWwiICU+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zZXNzaW9ucy9jcnQuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3Nlc3Npb25zL2NydC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZTZlZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zZXNzaW9ucy9jcnQuaHRtbApAQCAtMCwwICsxLDM0IEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8aGVhZD4KKzx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0iY2FydHMuaHRtbCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSIuLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0iY2FydHMuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBDYXJ0IEV4YW1wbGU8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzxoMz48YSBocmVmPSJEdW1teUNhcnQuaHRtbCI+UHJvcGVydHkgU2hlZXQgZm9yIER1bW15Q2FydAorPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4gPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zaW1wbGV0YWcvZm9vLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zaW1wbGV0YWcvZm9vLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwZjg0MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NpbXBsZXRhZy9mb28uaHRtbApAQCAtMCwwICsxLDMwIEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9ImZvby5qc3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9ImZvby5qc3AuaHRtbCI+U291cmNlIENvZGUgZm9yIHRoZSBTaW1wbGUgVGFnIEV4YW1wbGU8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NpbXBsZXRhZy9mb28uanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc2ltcGxldGFnL2Zvby5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3ZGJhMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NpbXBsZXRhZy9mb28uanNwCkBAIC0wLDAgKzEsMzggQEAKKzxodG1sPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Ym9keT4KKzwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RvbWNhdC9leGFtcGxlcy10YWdsaWIiIHByZWZpeD0iZWciJT4KKworUmFkaW8gc3RhdGlvbnMgdGhhdCByb2NrOgorCis8dWw+Cis8ZWc6Zm9vIGF0dDE9Ijk4LjUiIGF0dDI9IjkyLjMiIGF0dDM9IjEwNy43Ij4KKzxsaT48JT0gbWVtYmVyICU+PC9saT4KKzwvZWc6Zm9vPgorPC91bD4KKworPGVnOmxvZz4KK0RpZCB5b3Ugc2VlIG1lIG9uIHRoZSBzdGRlcnIgd2luZG93PworPC9lZzpsb2c+CisKKzxlZzpsb2cgdG9Ccm93c2VyPSJ0cnVlIj4KK0RpZCB5b3Ugc2VlIG1lIG9uIHRoZSBicm93c2VyIHdpbmRvdyBhcyB3ZWxsPworPC9lZzpsb2c+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NucC9zbm9vcC5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc25wL3Nub29wLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxZjA4OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NucC9zbm9vcC5odG1sCkBAIC0wLDAgKzEsMzEgQEAKKzxodG1sPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxoZWFkPgorPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJzbm9vcC5qc3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9InNub29wLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgUmVxdWVzdCBQYXJhbWV0ZXJzIEV4YW1wbGU8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NucC9zbm9vcC5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zbnAvc25vb3AuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOTc5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zbnAvc25vb3AuanNwCkBAIC0wLDAgKzEsNTYgQEAKKzxodG1sPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxib2R5IGJnY29sb3I9IndoaXRlIj4KKzxoMT4gUmVxdWVzdCBJbmZvcm1hdGlvbiA8L2gxPgorPGZvbnQgc2l6ZT0iNCI+CitKU1AgUmVxdWVzdCBNZXRob2Q6IDwlIG91dC5wcmludCh1dGlsLkhUTUxGaWx0ZXIuZmlsdGVyKHJlcXVlc3QuZ2V0TWV0aG9kKCkpKTsgJT4KKzxicj4KK1JlcXVlc3QgVVJJOiA8JT0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkgJT4KKzxicj4KK1JlcXVlc3QgUHJvdG9jb2w6IDwlPSByZXF1ZXN0LmdldFByb3RvY29sKCkgJT4KKzxicj4KK1NlcnZsZXQgcGF0aDogPCU9IHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSAlPgorPGJyPgorUGF0aCBpbmZvOiA8JSBvdXQucHJpbnQodXRpbC5IVE1MRmlsdGVyLmZpbHRlcihyZXF1ZXN0LmdldFBhdGhJbmZvKCkpKTsgJT4KKzxicj4KK1F1ZXJ5IHN0cmluZzogPCUgb3V0LnByaW50KHV0aWwuSFRNTEZpbHRlci5maWx0ZXIocmVxdWVzdC5nZXRRdWVyeVN0cmluZygpKSk7ICU+Cis8YnI+CitDb250ZW50IGxlbmd0aDogPCU9IHJlcXVlc3QuZ2V0Q29udGVudExlbmd0aCgpICU+Cis8YnI+CitDb250ZW50IHR5cGU6IDwlIG91dC5wcmludCh1dGlsLkhUTUxGaWx0ZXIuZmlsdGVyKHJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKSkpOyAlPgorPGJyPgorU2VydmVyIG5hbWU6IDwlPSByZXF1ZXN0LmdldFNlcnZlck5hbWUoKSAlPgorPGJyPgorU2VydmVyIHBvcnQ6IDwlPSByZXF1ZXN0LmdldFNlcnZlclBvcnQoKSAlPgorPGJyPgorUmVtb3RlIHVzZXI6IDwlPSByZXF1ZXN0LmdldFJlbW90ZVVzZXIoKSAlPgorPGJyPgorUmVtb3RlIGFkZHJlc3M6IDwlPSByZXF1ZXN0LmdldFJlbW90ZUFkZHIoKSAlPgorPGJyPgorUmVtb3RlIGhvc3Q6IDwlPSByZXF1ZXN0LmdldFJlbW90ZUhvc3QoKSAlPgorPGJyPgorQXV0aG9yaXphdGlvbiBzY2hlbWU6IDwlPSByZXF1ZXN0LmdldEF1dGhUeXBlKCkgJT4gCis8YnI+CitMb2NhbGU6IDwlPSByZXF1ZXN0LmdldExvY2FsZSgpICU+Cis8aHI+CitUaGUgYnJvd3NlciB5b3UgYXJlIHVzaW5nIGlzIDwlIG91dC5wcmludCh1dGlsLkhUTUxGaWx0ZXIuZmlsdGVyKHJlcXVlc3QuZ2V0SGVhZGVyKCJVc2VyLUFnZW50IikpKTsgJT4KKzxocj4KKzwvZm9udD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NvdXJjZS5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zb3VyY2UuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDA3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zb3VyY2UuanNwCkBAIC0wLDAgKzEsMjAgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0L2V4YW1wbGVzLXRhZ2xpYiIKKyAgICAgICAgcHJlZml4PSJlZyIgJT4KKworPGVnOlNob3dTb3VyY2UganNwRmlsZT0iPCU9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSAlPiIvPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvdGFncGx1Z2luL2Nob29zZS5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvdGFncGx1Z2luL2Nob29zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZTkwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vY2hvb3NlLmh0bWwKQEAgLTAsMCArMSwzNiBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPlZpZXcgU291cmNlIENvZGU8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj4KKyAgPGEgaHJlZj0iY2hvb3NlLmpzcCI+CisgICAgPGltZyBzcmM9Ii4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT4KKyAgPGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+CisgICAgPGltZyBzcmM9Ii4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj4KKyAgPC9hPjwvZm9udD4KKzwvcD4KKworPGgzPgorICA8YSBocmVmPSJjaG9vc2UuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBjaG9vc2UuanNwPGZvbnQgY29sb3I9IiMwMDAwRkYiLz48L2E+Cis8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vY2hvb3NlLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3RhZ3BsdWdpbi9jaG9vc2UuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYjUxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vY2hvb3NlLmpzcApAQCAtMCwwICsxLDU4IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+VGFnIEV4YW1wbGVzIC0gY2hvb3NlPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+VGFnIFBsdWdpbiBFeGFtcGxlcyAtICZsdDtjOmNob29zZT48L2gxPgorCisgICAgPGhyPgorICAgIDwvYnI+CisgICAgPGEgaHJlZj0ibm90ZXMuaHRtbCI+UGx1Z2luIEludHJvZHVjdG9yeSBOb3Rlczxmb250IDxmb250IGNvbG9yPSIjMDAwMEZGIj48LworYT4KKyAgICA8YnIvPgorICAgIDxhIGhyZWY9Imhvd3RvLmh0bWwiPkJyaWVmIEluc3RydWN0aW9ucyBmb3IgV3JpdGluZyBQbHVnaW5zPGZvbnQgY29sb3I9IiMwMDAKKzAKK0ZGIj48L2E+CisgICAgPGJyLz4gPGJyLz4KKyAgICA8aHI+CisKKyAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIvPgorICAgIDwvYnI+CisKKyAgICA8JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIiBwcmVmaXg9ImMiICU+CisKKyAgICA8Yzpmb3JFYWNoIHZhcj0iaW5kZXgiIGJlZ2luPSIwIiBlbmQ9IjQiPgorICAgICAgIyAke2luZGV4fTogCisgICAgICA8YzpjaG9vc2U+CisJPGM6d2hlbiB0ZXN0PSIke2luZGV4ID09IDF9Ij4KKyAgICAgICAgICBPbmUhPC9icj4KKwk8L2M6d2hlbj4KKwk8Yzp3aGVuIHRlc3Q9IiR7aW5kZXggPT0gNH0iPgorICAgICAgICAgIEZvdXIhPC9icj4KKwk8L2M6d2hlbj4KKwk8Yzp3aGVuIHRlc3Q9IiR7aW5kZXggPT0gM30iPgorICAgICAgICAgIFRocmVlITwvYnI+CisJPC9jOndoZW4+CisJPGM6b3RoZXJ3aXNlPgorICAgICAgICAgIEh1aD88L2JyPgorCTwvYzpvdGhlcndpc2U+CisgICAgICA8L2M6Y2hvb3NlPgorICAgIDwvYzpmb3JFYWNoPgorICA8L2JvZHk+Cis8L2h0bWw+IApkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvdGFncGx1Z2luL2ZvcmVhY2guaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3RhZ3BsdWdpbi9mb3JlYWNoLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyZTYwOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3RhZ3BsdWdpbi9mb3JlYWNoLmh0bWwKQEAgLTAsMCArMSwzNiBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPlZpZXcgU291cmNlIENvZGU8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj4KKyAgPGEgaHJlZj0iZm9yZWFjaC5qc3AiPgorICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+CisgIDxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPgorICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+CisgIDwvYT48L2ZvbnQ+Cis8L3A+CisKKzxoMz4KKyAgPGEgaHJlZj0iZm9yZWFjaC5qc3AuaHRtbCI+U291cmNlIENvZGUgZm9yIGZvcmVhY2guanNwPGZvbnQgY29sb3I9IiMwMDAwRkYiLz48L2E+Cis8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vZm9yZWFjaC5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vZm9yZWFjaC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2Y2VlMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3RhZ3BsdWdpbi9mb3JlYWNoLmpzcApAQCAtMCwwICsxLDU3IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+VGFnIFBsdWdpbiBFeGFtcGxlczogZm9yRWFjaDwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGgxPlRhZyBQbHVnaW4gRXhhbXBsZXMgLSAmbHQ7Yzpmb3JFYWNoPjwvaDE+CisKKyAgICA8aHI+CisgICAgPC9icj4KKyAgICA8YSBocmVmPSJub3Rlcy5odG1sIj5QbHVnaW4gSW50cm9kdWN0b3J5IE5vdGVzPGZvbnQgPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvCithPgorICAgIDxici8+CisgICAgPGEgaHJlZj0iaG93dG8uaHRtbCI+QnJpZWYgSW5zdHJ1Y3Rpb25zIGZvciBXcml0aW5nIFBsdWdpbnM8Zm9udCBjb2xvcj0iIzAwMDAKK0ZGIj48L2E+CisgICAgPGJyLz4gPGJyLz4KKyAgICA8aHI+CisKKyAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIvPgorICAgIDwvYnI+CisKKyAgICA8JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIiBwcmVmaXg9ImMiICU+CisgICAgPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuVmVjdG9yIiAlPgorCisgICAgPGgzPkl0ZXJhdGluZyBvdmVyIGEgcmFuZ2U8L2gzPgorICAgIDxjOmZvckVhY2ggdmFyPSJpdGVtIiBiZWdpbj0iMSIgZW5kPSIxMCI+CisgICAgICAgICR7aXRlbX0KKyAgICA8L2M6Zm9yRWFjaD4KKworICAgIDwlIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworCXYuYWRkKCJPbmUiKTsgdi5hZGQoIlR3byIpOyB2LmFkZCgiVGhyZWUiKTsgdi5hZGQoIkZvdXIiKTsKKworCXBhZ2VDb250ZXh0LnNldEF0dHJpYnV0ZSgidmVjdG9yIiwgdik7CisgICAgJT4KKworICAgIDxoMz5JdGVyYXRpbmcgb3ZlciBhIFZlY3RvcjwvaDM+CisKKyAgICA8Yzpmb3JFYWNoIGl0ZW1zPSIke3ZlY3Rvcn0iIHZhcj0iaXRlbSIgPgorCSR7aXRlbX0KKyAgICA8L2M6Zm9yRWFjaD4KKyAgPC9ib2R5PgorPC9odG1sPiAKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3RhZ3BsdWdpbi9ob3d0by5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvdGFncGx1Z2luL2hvd3RvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1NGRlYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3RhZ3BsdWdpbi9ob3d0by5odG1sCkBAIC0wLDAgKzEsNDMgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5UYWcgUGx1Z2luIEltcGxlbWVudGF0aW9uPC90aXRsZT4KKyAgICA8aDI+SG93IHRvIHdyaXRlIHRhZyBwbHVnaW5zPC9oMj4KKyAgICA8cD4KKyAgICAgIFRvIHdyaXRlIGEgcGx1Z2luLCB5b3UnbGwgbmVlZCB0byBkb3dubG9hZCB0aGUgc291cmNlIGZvciBUb21jYXQgNS4KKyAgICAgIFRoZXJlIGFyZSB0d28gc3RlcHM6CisgICAgPG9sPgorICAgICAgPGxpPgorICAgICAgICBJbXBsZW1lbnQgdGhlIHBsdWdpbiBjbGFzcy48cC8+CisgICAgICAgIFRoaXMgY2xhc3MsIHdoaWNoIGltcGxlbWVudHMgCisgICAgICAgIDx0dD5vcmcuYXBhY2hlLmphc3Blci5jb21waWxlci50YWdwbHVnaW4uVGFnUGx1Z2luPC90dD4KKyAgICAgICAgaW5zdHJ1Y3RzIEphc3BlciB3aGF0IEphdmEgY29kZXMgdG8gZ2VuZXJhdGUgaW4gcGxhY2Ugb2YgdGhlIHRhZworICAgICAgICBoYW5kbGVyIGNhbGxzLgorICAgICAgICBTZWUgSmF2YWRvYyBmb3IgPHR0Pm9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi5UYWdQbHVnaW48L3R0PgorICAgICAgICBmb3IgZGV0YWlscy4KKyAgICAgIDwvbGk+CisKKyAgICAgIDxsaT4KKyAgICAgICAgQ3JlYXRlIHRoZSBwbHVnaW4gZGVzY3JpcHRvciBmaWxlIDx0dD4gV0VCLUlORi90YWdQbHVnaW5zLnhtbDwvdHQ+PHAvPgorICAgICAgICBUaGlzIGZpbGUKKyAgICAgICAgc3BlY2lmaWVzIHRoZSBwbHVnaW4gY2xhc3NlcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB0YWcgaGFuZGxlcgorICAgICAgICBjbGFzc2VzLgorICAgICAgPC9saT4KKyAgICA8L29sPgorICA8L2hlYWQ+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vaWYuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3RhZ3BsdWdpbi9pZi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNGFjNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vaWYuaHRtbApAQCAtMCwwICsxLDM2IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+VmlldyBTb3VyY2UgQ29kZTwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPgorICA8YSBocmVmPSJpZi5qc3AiPgorICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+CisgIDxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPgorICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+CisgIDwvYT48L2ZvbnQ+Cis8L3A+CisKKzxoMz4KKyAgPGEgaHJlZj0iaWYuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBpZi5qc3A8Zm9udCBjb2xvcj0iIzAwMDBGRiIvPjwvYT4KKzwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3RhZ3BsdWdpbi9pZi5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vaWYuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYTQzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vaWYuanNwCkBAIC0wLDAgKzEsNDUgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5UYWcgUGx1Z2luIEV4YW1wbGVzOiBpZjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGgxPlRhZyBQbHVnaW4gRXhhbXBsZXMgLSAmbHQ7YzppZj48L2gxPgorCisgICAgPGhyPgorICAgIDwvYnI+CisgICAgPGEgaHJlZj0ibm90ZXMuaHRtbCI+UGx1Z2luIEludHJvZHVjdG9yeSBOb3Rlczxmb250IDxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgICAgPGJyLz4KKyAgICA8YSBocmVmPSJob3d0by5odG1sIj5CcmllZiBJbnN0cnVjdGlvbnMgZm9yIFdyaWV0aW5nIFBsdWdpbnM8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICAgIDxici8+IDxici8+CisgICAgPGhyPgorCisgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiLz4KKyAgICA8L2JyPgorICAgIDwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiIHByZWZpeD0iYyIgJT4KKworICAgIDxoMz5TZXQgdGhlIHRlc3QgcmVzdWx0IHRvIGEgdmFyaWFibGU8L2gzPgorICAgIDxjOmlmIHRlc3Q9IiR7MT09MX0iIHZhcj0idGhlVHJ1dGgiIHNjb3BlPSJzZXNzaW9uIi8+CisgICAgVGhlIHJlc3VsdCBvZiB0ZXN0aW5nIGZvciAoMT09MSkgaXM6ICR7dGhlVHJ1dGh9CisKKyAgICA8aDM+Q29uZGl0aW9uYWxseSBleGVjdXRlIHRoZSBib2R5PC9oMz4KKyAgICA8YzppZiB0ZXN0PSIkezI+MH0iPgorCUl0J3MgdHJ1ZSB0aGF0ICgyPjApIQorICAgIDwvYzppZj4KKyAgPC9ib2R5PgorPC9odG1sPiAKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3RhZ3BsdWdpbi9ub3Rlcy5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvdGFncGx1Z2luL25vdGVzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyMWExYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3RhZ3BsdWdpbi9ub3Rlcy5odG1sCkBAIC0wLDAgKzEsMzkgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5UYWcgUGx1Z2luIEludHJvZHVjdGlvbjwvdGl0bGU+CisgICAgPGgyPlRhZyBQbHVnaW5zOiBJbnRyb2R1Y3RvcnkgTm90ZXM8L2gyPgorICAgIDxwPgorICAgICAgVG9tY2F0IDUgcHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIGltcGxlbWVudGluZyB0YWcgcGx1Z2lucy4gIFRoZQorICAgICAgcGx1Z2lucyBpbnN0cnVjdCBKYXNwZXIsIGF0IHRyYW5zbGF0aW9uIHRpbWUsIHRvIHJlcGxhY2UgdGFnIGhhbmRsZXIKKyAgICAgIGNhbGxzIHdpdGggSmF2YSBzY3JpcHRsZXRzLgorICAgICAgVGhlIGZyYW1ld29yayBhbGxvd3MgdGFnIGxpYnJhcnkgYXV0aG9ycyB0byBpbXBsZW1lbnQgcGx1Z2lucyBmb3IKKyAgICAgIHRoZWlyIHRhZ3MuCisgICAgPC9wPgorICAgIDxwPgorICAgICAgVG9tY2F0IDUgaXMgcmVsZWFzZWQgd2l0aCBwbHVnaW5zIGZvciBzZXZlcmFsIEpTVEwgdGFncy4gIE5vdGUKKyAgICAgIHRoYXQgdGhlc2UgcGx1Z2lucyB3b3JrIHdpdGggSlNUTCAxLjEgYXMgd2VsbCBhcyBKU1RMIDEuMCwgdGhvdWdoCisgICAgICB0aGUgZXhhbXBsZXMgdXNlcyBKU1RMIDEuMSBhbmQgSlNQIDIuMC4gIAorICAgICAgVGhlc2UgcGx1Z2lucyBhcmUgbm90IGNvbXBsZXRlIChmb3IgaW5zdGFuY2UsIHNvbWUgaXRlbSB0eXBlcyBub3QKKyAgICAgIGhhbmRsZWQgaW4gJmx0O2M6aWY+KS4KKyAgICAgIFRoZXkgZG8gc2VydmUgYXMgZXhhbXBsZXMgdG8gc2hvdyBwbHVnaW5zIGluIGFjdGlvbiAoanVzdAorICAgICAgZXhhbWluZSB0aGUgZ2VuZXJhdGVkIEphdmEgZmlsZXMpLCBhbmQgaG93IHRoZXkgY2FuIGJlIGltcGxlbWVudGVkLgorICAgIDwvcD4KKyAgPC9oZWFkPgorPC9odG1sPgorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy94bWwveG1sLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy94bWwveG1sLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxMjE0MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3htbC94bWwuaHRtbApAQCAtMCwwICsxLDMxIEBACis8aHRtbD4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8aGVhZD4KKzx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0ieG1sLmpzcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSIuLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0ieG1sLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgWE1MIHN5bnRheCBFeGFtcGxlPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy94bWwveG1sLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3htbC94bWwuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NGFlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy94bWwveG1sLmpzcApAQCAtMCwwICsxLDcwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGpzcDpyb290IHhtbG5zOmpzcD0iaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIKKyAgdmVyc2lvbj0iMS4yIj4KKzxqc3A6ZGlyZWN0aXZlLnBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIvPgorPGpzcDpkaXJlY3RpdmUucGFnZSBpbXBvcnQ9ImphdmEudXRpbC5EYXRlLCBqYXZhLnV0aWwuTG9jYWxlIi8+Cis8anNwOmRpcmVjdGl2ZS5wYWdlIGltcG9ydD0iamF2YS50ZXh0LioiLz4KKworPGpzcDpkZWNsYXJhdGlvbj4KKyAgU3RyaW5nIGdldERhdGVUaW1lU3RyKExvY2FsZSBsKSB7CisgICAgRGF0ZUZvcm1hdCBkZiA9IFNpbXBsZURhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZShEYXRlRm9ybWF0Lk1FRElVTSwgRGF0ZUZvcm1hdC5NRURJVU0sIGwpOworICAgIHJldHVybiBkZi5mb3JtYXQobmV3IERhdGUoKSk7CisgIH0KKzwvanNwOmRlY2xhcmF0aW9uPgorCis8aHRtbD4KKzxoZWFkPgorICA8dGl0bGU+RXhhbXBsZSBKU1AgaW4gWE1MIGZvcm1hdDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorVGhpcyBpcyB0aGUgb3V0cHV0IG9mIGEgc2ltcGxlIEpTUCB1c2luZyBYTUwgZm9ybWF0LiAKKzxiciAvPgorCis8ZGl2PlVzZSBhIGpzcDpzY3JpcHRsZXQgdG8gbG9vcCBmcm9tIDEgdG8gMTA6IDwvZGl2PgorPGpzcDpzY3JpcHRsZXQ+CisvLyBOb3RlIHdlIG5lZWQgdG8gZGVjbGFyZSBDREFUQSBiZWNhdXNlIHdlIGRvbid0IGVzY2FwZSB0aGUgbGVzcyB0aGFuIHN5bWJvbAorPCFbQ0RBVEFbCisgIGZvciAoaW50IGkgPSAxOyBpPD0xMDsgaSsrKSB7CisgICAgb3V0LnByaW50bG4oaSk7CisgICAgaWYgKGkgPCAxMCkgeworICAgICAgb3V0LnByaW50bG4oIiwgIik7CisgICAgfQorICB9CitdXT4KKzwvanNwOnNjcmlwdGxldD4KKworPCEtLSBCZWNhdXNlIEkgb21pdCBicidzIGVuZCB0YWcsIGRlY2xhcmUgaXQgYXMgQ0RBVEEgLS0+Cis8IVtDREFUQVsKKyAgPGJyPjxicj4KK11dPgorCis8ZGl2IGFsaWduPSJsZWZ0Ij4KKyAgVXNlIGEganNwOmV4cHJlc3Npb24gdG8gd3JpdGUgdGhlIGRhdGUgYW5kIHRpbWUgaW4gdGhlIGJyb3dzZXIncyBsb2NhbGU6IAorICA8anNwOmV4cHJlc3Npb24+Z2V0RGF0ZVRpbWVTdHIocmVxdWVzdC5nZXRMb2NhbGUoKSk8L2pzcDpleHByZXNzaW9uPgorPC9kaXY+CisKKworPGpzcDp0ZXh0PgorICAmbHQ7cCZndDtUaGlzIHNlbnRlbmNlIGlzIGVuY2xvc2VkIGluIGEganNwOnRleHQgZWxlbWVudC4mbHQ7L3AmZ3Q7Cis8L2pzcDp0ZXh0PgorCis8L2JvZHk+Cis8L2h0bWw+Cis8L2pzcDpyb290PgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL2FudC90YXNrL1R4dDJIdG1sLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvYW50L3Rhc2svVHh0Mkh0bWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDZmNjY1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL2FudC90YXNrL1R4dDJIdG1sLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIHRhc2s7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKKworLyoqCisgKiBBbnQgdGFzayB0byBjb252ZXJ0IGEgZ2l2ZW4gc2V0IG9mIGZpbGVzIGZyb20gVGV4dCB0byBIVE1MLgorICogSW5zZXJ0cyBhbiBIVE1MIGhlYWRlciBpbmNsdWRpbmcgcHJlIHRhZ3MgYW5kIHJlcGxhY2VzIHNwZWNpYWwgY2hhcmFjdGVycworICogd2l0aCB0aGVpciBIVE1MIGVzY2FwZWQgZXF1aXZhbGVudHMuCisgKgorICogPHA+VGhpcyB0YXNrIGlzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBhbnQgc2NyaXB0IHRvIGJ1aWxkIG91ciBleGFtcGxlczwvcD4KKyAqCisgKiBAYXV0aG9yIE1hcmsgUm90aAorICovCitwdWJsaWMgY2xhc3MgVHh0Mkh0bWwgCisgICAgZXh0ZW5kcyBUYXNrIAoreworICAgIAorICAgIC8qKiBUaGUgZGlyZWN0b3J5IHRvIGNvbnRhaW4gdGhlIHJlc3VsdGluZyBmaWxlcyAqLworICAgIHByaXZhdGUgRmlsZSB0b2RpcjsKKyAgICAKKyAgICAvKiogVGhlIGZpbGUgdG8gYmUgY29udmVydGVkIGludG8gSFRNTCAqLworICAgIHByaXZhdGUgTGlzdCBmaWxlc2V0cyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGlyZWN0b3J5IHRvIGNvbnRhaW4gdGhlIHJlc3VsdGluZyBmaWxlcworICAgICAqCisgICAgICogQHBhcmFtIHRvZGlyIFRoZSBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb2RpciggRmlsZSB0b2RpciApIHsKKyAgICAgICAgdGhpcy50b2RpciA9IHRvZGlyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBmaWxlcyB0byBiZSBjb252ZXJ0ZWQgaW50byBIVE1MCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZXNldCBUaGUgZmlsZXNldCB0byBiZSBjb252ZXJ0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldCggRmlsZVNldCBmcyApIHsKKyAgICAgICAgZmlsZXNldHMuYWRkKCBmcyApOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHRoZSBjb252ZXJzaW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gQnVpbGRFeGNlcHRpb24gVGhyb3duIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgZXhlY3V0aW9uIG9mCisgICAgICogICAgdGhpcyB0YXNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSAKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIAorICAgIHsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgCisgICAgICAgIC8vIFN0ZXAgdGhyb3VnaCBlYWNoIGZpbGUgYW5kIGNvbnZlcnQuCisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBmaWxlc2V0cy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSggaXRlci5oYXNOZXh0KCkgKSB7CisgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpaXRlci5uZXh0KCk7CisgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lciggcHJvamVjdCApOworICAgICAgICAgICAgRmlsZSBiYXNlZGlyID0gZHMuZ2V0QmFzZWRpcigpOworICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgIEZpbGUgZnJvbSA9IG5ldyBGaWxlKCBiYXNlZGlyLCBmaWxlc1tpXSApOworICAgICAgICAgICAgICAgIEZpbGUgdG8gPSBuZXcgRmlsZSggdG9kaXIsIGZpbGVzW2ldICsgIi5odG1sIiApOworICAgICAgICAgICAgICAgIGlmKCAhdG8uZXhpc3RzKCkgfHwgCisgICAgICAgICAgICAgICAgICAgIChmcm9tLmxhc3RNb2RpZmllZCgpID4gdG8ubGFzdE1vZGlmaWVkKCkpICkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2coICJDb252ZXJ0aW5nIGZpbGUgJyIgKyBmcm9tLmdldEFic29sdXRlUGF0aCgpICsgCisgICAgICAgICAgICAgICAgICAgICAgICAiJyB0byAnIiArIHRvLmdldEFic29sdXRlUGF0aCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFICk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0KCBmcm9tLCB0byApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCAiQ291bGQgbm90IGNvbnZlcnQgJyIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tLmdldEFic29sdXRlUGF0aCgpICsgIicgdG8gJyIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0by5nZXRBYnNvbHV0ZVBhdGgoKSArICInIiwgZSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICBsb2coICJDb252ZXJ0ZWQgIiArIGNvdW50ICsgIiBmaWxlIiArIChjb3VudCA+IDEgPyAicyIgOiAiIikgKyAKKyAgICAgICAgICAgICAgICAgICAgIiB0byAiICsgdG9kaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgY29weSBhbmQgY29udmVyc2lvbgorICAgICAqCisgICAgICogQHBhcmFtIGZyb20gVGhlIGlucHV0IGZpbGUKKyAgICAgKiBAcGFyYW0gdG8gVGhlIG91dHB1dCBmaWxlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgY29udmVyc2lvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjb252ZXJ0KCBGaWxlIGZyb20sIEZpbGUgdG8gKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIE9wZW4gZmlsZXM6CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBuZXcgRmlsZVJlYWRlciggZnJvbSApICk7CisgICAgICAgIFByaW50V3JpdGVyIG91dCA9IG5ldyBQcmludFdyaXRlciggbmV3IEZpbGVXcml0ZXIoIHRvICkgKTsKKyAgICAgICAgCisgICAgICAgIC8vIE91dHB1dCBoZWFkZXI6CisgICAgICAgIG91dC5wcmludGxuKCAiPGh0bWw+PGJvZHk+PHByZT4iICk7CisgICAgICAgIAorICAgICAgICAvLyBDb252ZXJ0LCBsaW5lLWJ5LWxpbmU6CisgICAgICAgIFN0cmluZyBsaW5lOworICAgICAgICB3aGlsZSggKGxpbmUgPSBpbi5yZWFkTGluZSgpKSAhPSBudWxsICkgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGludCBsZW4gPSBsaW5lLmxlbmd0aCgpOworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBsaW5lLmNoYXJBdCggaSApOworICAgICAgICAgICAgICAgIHN3aXRjaCggYyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnJic6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCAiJmFtcDsiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCAiJmx0OyIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCggYyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludGxuKCByZXN1bHQudG9TdHJpbmcoKSApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBPdXRwdXQgZm9vdGVyOgorICAgICAgICBvdXQucHJpbnRsbiggIjwvcHJlPjwvYm9keT48L2h0bWw+IiApOworICAgICAgICAKKyAgICAgICAgLy8gQ2xvc2Ugc3RyZWFtczoKKyAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgIGluLmNsb3NlKCk7CisgICAgfQorICAgIAorfQorCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9ldGMvbWFuaWZlc3QgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvZXRjL21hbmlmZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDg0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvZXRjL21hbmlmZXN0CkBAIC0wLDAgKzEsMTAgQEAKK01hbmlmZXN0LXZlcnNpb246IDEuMAorCitOYW1lOiBqYXZheC9zZXJ2bGV0L2pzcC8KK1NwZWNpZmljYXRpb24tVGl0bGU6IEphdmEgQVBJIGZvciBKYXZhU2VydmVyIFBhZ2VzCitTcGVjaWZpY2F0aW9uLVZlcnNpb246IDIuMAorU3BlY2lmaWNhdGlvbi1WZW5kb3I6IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KK0ltcGxlbWVudGF0aW9uLVRpdGxlOiBqYXZheC5zZXJ2bGV0LmpzcAorSW1wbGVtZW50YXRpb24tVmVyc2lvbjogMi4wLkBpbXBsZW1lbnRhdGlvbi5yZXZpc2lvbkAKK0ltcGxlbWVudGF0aW9uLVZlbmRvcjogQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2R0ZC9qc3BfMl8wLnhzZCBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9kdGQvanNwXzJfMC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBlM2MzZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9kdGQvanNwXzJfMC54c2QKQEAgLTAsMCArMSwzMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKwkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKKwkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgorCSAgICB2ZXJzaW9uPSIyLjAiPgorICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgQCgjKWpzcF8yXzAueHNkcwkxLjE3IDAzLzE4LzAzCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KKyAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKKyAgICAgIHJlc2VydmVkLgorCisgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCisgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgorICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCisgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cworICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQorICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKKyAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KKworICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQorICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAorICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50CisgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgorICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgorCisgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKKyAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCisKKyAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAorICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQorICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgorICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCisKKyAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycworICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgorCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgSlNQIDIuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAgICAgIHR5cGVzLiAgVGhlIEpTUCAyLjAgc2NoZW1hIGNvbnRhaW5zIGFsbCB0aGUgc3BlY2lhbAorICAgICAgc3RydWN0dXJlcyBhbmQgZGF0YXR5cGVzIHRoYXQgYXJlIG5lY2Vzc2FyeSB0byB1c2UgSlNQIGZpbGVzCisgICAgICBmcm9tIGEgd2ViIGFwcGxpY2F0aW9uLgorCisgICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBzY2hlbWEgaXMgdXNlZCBieSB0aGUgd2ViLWFwcF8yXzQueHNkCisgICAgICBmaWxlIHRvIGRlZmluZSBKU1Agc3BlY2lmaWMgY29udGVudC4KKworICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQorICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgorCisgICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCisJc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKKwlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKKwl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCisJc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKKwlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQorCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQorCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgorCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImoyZWVfMV80LnhzZCIvPgorCisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpzcC1jb25maWdUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUganNwLWNvbmZpZ1R5cGUgaXMgdXNlZCB0byBwcm92aWRlIGdsb2JhbCBjb25maWd1cmF0aW9uCisJaW5mb3JtYXRpb24gZm9yIHRoZSBKU1AgZmlsZXMgaW4gYSB3ZWIgYXBwbGljYXRpb24uIEl0IGhhcworCXR3byBzdWJlbGVtZW50cywgdGFnbGliIGFuZCBqc3AtcHJvcGVydHktZ3JvdXAuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliIgorCQkgICB0eXBlPSJqMmVlOnRhZ2xpYlR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqc3AtcHJvcGVydHktZ3JvdXAiCisJCSAgIHR5cGU9ImoyZWU6anNwLXByb3BlcnR5LWdyb3VwVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpzcC1maWxlVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGpzcC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGwgcGF0aCB0byBhIEpTUCBmaWxlCisJd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24gYmVnaW5uaW5nIHdpdGggYSBgLycuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpwYXRoVHlwZSIvPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqc3AtcHJvcGVydHktZ3JvdXBUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUganNwLXByb3BlcnR5LWdyb3VwVHlwZSBpcyB1c2VkIHRvIGdyb3VwIGEgbnVtYmVyIG9mCisJZmlsZXMgc28gdGhleSBjYW4gYmUgZ2l2ZW4gZ2xvYmFsIHByb3BlcnR5IGluZm9ybWF0aW9uLgorCUFsbCBmaWxlcyBzbyBkZXNjcmliZWQgYXJlIGRlZW1lZCB0byBiZSBKU1AgZmlsZXMuICBUaGUKKwlmb2xsb3dpbmcgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGNhbiBiZSBkZXNjcmliZWQ6CisKKwkgICAgLSBDb250cm9sIHdoZXRoZXIgRUwgaXMgaWdub3JlZAorCSAgICAtIENvbnRyb2wgd2hldGhlciBzY3JpcHRpbmcgZWxlbWVudHMgYXJlIGludmFsaWQKKwkgICAgLSBJbmRpY2F0ZSBwYWdlRW5jb2RpbmcgaW5mb3JtYXRpb24uCisJICAgIC0gSW5kaWNhdGUgdGhhdCBhIHJlc291cmNlIGlzIGEgSlNQIGRvY3VtZW50IChYTUwpCisJICAgIC0gUHJlbHVkZSBhbmQgQ29kYSBhdXRvbWF0aWMgaW5jbHVkZXMuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCisJCSAgIHR5cGU9ImoyZWU6dXJsLXBhdHRlcm5UeXBlIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsLWlnbm9yZWQiCisJCSAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIENhbiBiZSB1c2VkIHRvIGVhc2lseSBzZXQgdGhlIGlzRUxJZ25vcmVkCisJICAgIHByb3BlcnR5IG9mIGEgZ3JvdXAgb2YgSlNQIHBhZ2VzLiAgQnkgZGVmYXVsdCwgdGhlCisJICAgIEVMIGV2YWx1YXRpb24gaXMgZW5hYmxlZCBmb3IgV2ViIEFwcGxpY2F0aW9ucyB1c2luZworCSAgICBhIFNlcnZsZXQgMi40IG9yIGdyZWF0ZXIgd2ViLnhtbCwgYW5kIGRpc2FibGVkCisJICAgIG90aGVyd2lzZS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWdlLWVuY29kaW5nIgorCQkgICB0eXBlPSJqMmVlOnN0cmluZyIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHZhbGlkIHZhbHVlcyBvZiBwYWdlLWVuY29kaW5nIGFyZSB0aG9zZSBvZiB0aGUKKwkgICAgcGFnZUVuY29kaW5nIHBhZ2UgZGlyZWN0aXZlLiAgSXQgaXMgYQorCSAgICB0cmFuc2xhdGlvbi10aW1lIGVycm9yIHRvIG5hbWUgZGlmZmVyZW50IGVuY29kaW5ncworCSAgICBpbiB0aGUgcGFnZUVuY29kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgcGFnZSBkaXJlY3RpdmUKKwkgICAgb2YgYSBKU1AgcGFnZSBhbmQgaW4gYSBKU1AgY29uZmlndXJhdGlvbiBlbGVtZW50CisJICAgIG1hdGNoaW5nIHRoZSBwYWdlLiAgSXQgaXMgYWxzbyBhIHRyYW5zbGF0aW9uLXRpbWUKKwkgICAgZXJyb3IgdG8gbmFtZSBkaWZmZXJlbnQgZW5jb2RpbmdzIGluIHRoZSBwcm9sb2cKKwkgICAgb3IgdGV4dCBkZWNsYXJhdGlvbiBvZiBhIGRvY3VtZW50IGluIFhNTCBzeW50YXggYW5kCisJICAgIGluIGEgSlNQIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBtYXRjaGluZyB0aGUgZG9jdW1lbnQuCisJICAgIEl0IGlzIGxlZ2FsIHRvIG5hbWUgdGhlIHNhbWUgZW5jb2RpbmcgdGhyb3VnaAorCSAgICBtdWxpdHBsZSBtZWNoYW5pc21zLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjcmlwdGluZy1pbnZhbGlkIgorCQkgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBDYW4gYmUgdXNlZCB0byBlYXNpbHkgZGlzYWJsZSBzY3JpcHRpbmcgaW4gYQorCSAgICBncm91cCBvZiBKU1AgcGFnZXMuICBCeSBkZWZhdWx0LCBzY3JpcHRpbmcgaXMKKwkgICAgZW5hYmxlZC4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpcy14bWwiCisJCSAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIElmIHRydWUsIGRlbm90ZXMgdGhhdCB0aGUgZ3JvdXAgb2YgcmVzb3VyY2VzCisJICAgIHRoYXQgbWF0Y2ggdGhlIFVSTCBwYXR0ZXJuIGFyZSBKU1AgZG9jdW1lbnRzLAorCSAgICBhbmQgdGh1cyBtdXN0IGJlIGludGVycHJldGVkIGFzIFhNTCBkb2N1bWVudHMuCisJICAgIElmIGZhbHNlLCB0aGUgcmVzb3VyY2VzIGFyZSBhc3N1bWVkIHRvIG5vdAorCSAgICBiZSBKU1AgZG9jdW1lbnRzLCB1bmxlc3MgdGhlcmUgaXMgYW5vdGhlcgorCSAgICBwcm9wZXJ0eSBncm91cCB0aGF0IGluZGljYXRlcyBvdGhlcndpc2UuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5jbHVkZS1wcmVsdWRlIgorCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIGluY2x1ZGUtcHJlbHVkZSBlbGVtZW50IGlzIGEgY29udGV4dC1yZWxhdGl2ZQorCSAgICBwYXRoIHRoYXQgbXVzdCBjb3JyZXNwb25kIHRvIGFuIGVsZW1lbnQgaW4gdGhlCisJICAgIFdlYiBBcHBsaWNhdGlvbi4gIFdoZW4gdGhlIGVsZW1lbnQgaXMgcHJlc2VudCwKKwkgICAgdGhlIGdpdmVuIHBhdGggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIChhcworCSAgICBpbiBhbiBpbmNsdWRlIGRpcmVjdGl2ZSkgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoCisJICAgIEpTUCBwYWdlIGluIHRoaXMganNwLXByb3BlcnR5LWdyb3VwLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluY2x1ZGUtY29kYSIKKwkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBpbmNsdWRlLWNvZGEgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUKKwkgICAgcGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZQorCSAgICBXZWIgQXBwbGljYXRpb24uICBXaGVuIHRoZSBlbGVtZW50IGlzIHByZXNlbnQsCisJICAgIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMKKwkgICAgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBlbmQgb2YgZWFjaAorCSAgICBKU1AgcGFnZSBpbiB0aGlzIGpzcC1wcm9wZXJ0eS1ncm91cC4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWdsaWJUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgdGFnbGliVHlwZSBkZWZpbmVzIHRoZSBzeW50YXggZm9yIGRlY2xhcmluZyBpbgorCXRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgdGhhdCBhIHRhZyBsaWJyYXJ5IGlzCisJYXZhaWxhYmxlIHRvIHRoZSBhcHBsaWNhdGlvbi4gIFRoaXMgY2FuIGJlIGRvbmUKKwl0byBvdmVycmlkZSBpbXBsaWNpdCBtYXAgZW50cmllcyBmcm9tIFRMRCBmaWxlcyBhbmQKKwlmcm9tIHRoZSBjb250YWluZXIuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliLXVyaSIKKwkJICAgdHlwZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBBIHRhZ2xpYi11cmkgZWxlbWVudCBkZXNjcmliZXMgYSBVUkkgaWRlbnRpZnlpbmcgYQorCSAgICB0YWcgbGlicmFyeSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uICBUaGUgYm9keQorCSAgICBvZiB0aGUgdGFnbGliLXVyaSBlbGVtZW50IG1heSBiZSBlaXRoZXIgYW4KKwkgICAgYWJzb2x1dGUgVVJJIHNwZWNpZmljYXRpb24sIG9yIGEgcmVsYXRpdmUgVVJJLgorCSAgICBUaGVyZSBzaG91bGQgYmUgbm8gZW50cmllcyBpbiB3ZWIueG1sIHdpdGggdGhlCisJICAgIHNhbWUgdGFnbGliLXVyaSB2YWx1ZS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi1sb2NhdGlvbiIKKwkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIHRoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24KKwkgICAgKGFzIGEgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYgorCSAgICBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnIExpYnJhcnkKKwkgICAgRGVzY3JpcHRpb24gZmlsZSBmb3IgdGhlIHRhZyBsaWJyYXJ5LgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPC94c2Q6c2NoZW1hPgorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvZHRkL2pzcHhtbC5kdGQgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvZHRkL2pzcHhtbC5kdGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4NTE1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9kdGQvanNweG1sLmR0ZApAQCAtMCwwICsxLDE5MCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIERURCBmb3IgSlNQIDIuMAorICAgICB0aGFua3MgdG8gQm9iIEZvc3RlciwgV2ViR2FpbgorLS0+CisKKzwhLS0gCisgICAgIFRoaXMgRFREIGlzIG5vdCBjb25kaXRpb25hbCBvbiBhbnkgcGFyYW1ldGVyIGVudGl0aWVzIGluIHRoZSBpbnRlcm5hbAorICAgICBzdWJzZXQgYW5kIGRvZXMgbm90IGV4cG9ydCBhbnkgZ2VuZXJhbCBlbnRpdGllcy4KKy0tPgorCis8IS0tPT09PT09PT09PT09PT09PT09IENvbnN0cmFpbmVkIE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCis8IUVOVElUWSAlIFVSSSAiQ0RBVEEiPgorICAgIDwhLS0gYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsIHNlZSBbUkZDMjM5Nl0gLS0+CisKKzwhRU5USVRZICUgVXJpTGlzdCAiQ0RBVEEiPgorICAgIDwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzIC0tPgorCis8IUVOVElUWSAlIFVSTCAiQ0RBVEEiPgorICAgIDwhLS0gYSByZWxhdGl2ZSB1cmxTcGVjIGlzIGFzIGluIFNlY3Rpb24gMi4xMC4yLiAtLT4KKworPCFFTlRJVFkgJSBCZWFuSUQgIklEUkVGIj4KKyAgICA8IS0tIGEgcHJldmlvdXNseSBkZWNsYXJlZCBiZWFuIElEIGluIHRoZSBjdXJyZW50IHNjb3BlLiAtLT4KKworPCFFTlRJVFkgJSBQcmVmaXggIkNEQVRBIj4KKyAgICA8IS0tIGEgTmFtZSB0aGF0IGNvbnRhaW5zIG5vIDogY2hhcmFjdGVycy4gLS0+CisKKzwhRU5USVRZICUgQ2xhc3NOYW1lICJDREFUQSI+CisgICAgPCEtLSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLiAtLT4KKworPCFFTlRJVFkgJSBUeXBlTmFtZSAiQ0RBVEEiPgorICAgIDwhLS0gYSBmdWxseSBxdWFsaWZpZWQgY2xhc3Mgb3IgaW50ZXJmYWNlIG5hbWUuIC0tPgorCis8IUVOVElUWSAlIEJlYW5OYW1lICJDREFUQSI+CisgICAgPCEtLSBhIGJlYW4gbmFtZSBhcyBleHBlY3RlZCBieSBqYXZhLmJlYW5zLkJlYW5zIGluc3RhbnRpYXRlKCkuIC0tPgorCis8IUVOVElUWSAlIENvbnRlbnQgIkNEQVRBIj4KKyAgICA8IS0tIGEgTUlNRSB0eXBlIGZvbGxvd2VkIGJ5IGFuIElBTkEgY2hhcnNldCwgYXMgIiB0eXBlIFs7IFM/IFsnY2hhcnNldD0nXSBjaGFyc2V0XSAiIC0tPgorCis8IUVOVElUWSAlIExlbmd0aCAiQ0RBVEEiPgorICAgIDwhLS0gbm4gZm9yIHBpeGVscyBvciBubiUgZm9yIHBlcmNlbnRhZ2UgbGVuZ3RoIC0tPgorCis8IUVOVElUWSAlIFBpeGVscyAiQ0RBVEEiPgorICAgIDwhLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KKworPCFFTlRJVFkgJSBCb29sICIodHJ1ZXxmYWxzZXx5ZXN8bm8pIj4KKyAgICA8IS0tIGJvb2xlYW4gLS0+CisKKzwhLS0gdXNlZCBmb3Igb2JqZWN0LCBhcHBsZXQsIGltZywgaW5wdXQgYW5kIGlmcmFtZSAtLT4KKzwhRU5USVRZICUgSW1nQWxpZ24gIih0b3B8bWlkZGxlfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+CisKKzwhLS09PT09PT09PT09PT09PT09PT09IEVsZW1lbnQgR3JvdXBzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCis8IUVOVElUWSAlIERpcmVjdGl2ZXMgImpzcDpkaXJlY3RpdmUucGFnZXxqc3A6ZGlyZWN0aXZlLmluY2x1ZGUiPgorCis8IUVOVElUWSAlIFNjcmlwdHMgImpzcDpzY3JpcHRsZXR8anNwOmRlY2xhcmF0aW9ufGpzcDpleHByZXNzaW9uIj4KKworPCFFTlRJVFkgJSBBY3Rpb25zCisgICAgImpzcDp1c2VCZWFuCisgICAgfGpzcDpzZXRQcm9wZXJ0eQorICAgIHxqc3A6Z2V0UHJvcGVydHkKKyAgICB8anNwOmluY2x1ZGUKKyAgICB8anNwOmZvcndhcmQKKyAgICB8anNwOnBsdWdpbiIKKz4KKworPCFFTlRJVFkgJSBCb2R5ICIoanNwOnRleHR8JURpcmVjdGl2ZXM7fCVTY3JpcHRzO3wlQWN0aW9uczspKiI+CisKKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzwhLS0gICAgUm9vdCBlbGVtZW50IG9mIGEgSlNQIHBhZ2UuCistLT4KKzwhRUxFTUVOVCBqc3A6cm9vdCAlQm9keTs+Cis8IUFUVExJU1QganNwOnJvb3QKKyAgICB4bWxuczpqc3AgICAgICAgQ0RBVEEgICAgICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIgorICAgIHZlcnNpb24gICAgICAgICBDREFUQSAgICAgICAgICAgI1JFUVVJUkVECis+CisKKzwhRUxFTUVOVCBqc3A6ZGlyZWN0aXZlLnBhZ2UgRU1QVFk+Cis8IUFUVExJU1QganNwOmRpcmVjdGl2ZS5wYWdlCisgICAgbGFuZ3VhZ2UgICAgICAgIENEQVRBICAgICAgICAgICAiamF2YSIKKyAgICBleHRlbmRzICAgICAgICAgJUNsYXNzTmFtZTsgICAgICNJTVBMSUVECisgICAgY29udGVudFR5cGUgICAgICVDb250ZW50OyAgICAgICAidGV4dC9odG1sOyBJU08tODg1OS0xIgorICAgIGltcG9ydCAgICAgICAgICBDREFUQSAgICAgICAgICAgI0lNUExJRUQKKyAgICBzZXNzaW9uICAgICAgICAgJUJvb2w7ICAgICAgICAgICJ0cnVlIgorICAgIGJ1ZmZlciAgICAgICAgICBDREFUQSAgICAgICAgICAgIjhrYiIKKyAgICBhdXRvRmx1c2ggICAgICAgJUJvb2w7ICAgICAgICAgICJ0cnVlIgorICAgIGlzVGhyZWFkU2FmZSAgICAlQm9vbDsgICAgICAgICAgInRydWUiCisgICAgaW5mbyAgICAgICAgICAgIENEQVRBICAgICAgICAgICAjSU1QTElFRAorICAgIGVycm9yUGFnZSAgICAgICAlVVJMOyAgICAgICAgICAgI0lNUExJRUQKKyAgICBpc0Vycm9yUGFnZSAgICAgJUJvb2w7ICAgICAgICAgICJmYWxzZSIKKyAgICBwYWdlRW5jb2RpbmcgICAgQ0RBVEEgICAgICAgICAgICNJTVBMSUVECisgICAgaXNFTElnbm9yZWQgICAgICVCb29sOyAgICAgICAgICAjSU1QTElFRAorPgorCis8IS0tIHRoZSBqc3A6ZGlyZWN0aXZlLmluY2x1ZGUgb25seSBhcHBlYXJzIGluIEpTUCBkb2N1bWVudHMgYW5kIGRvZXMKKyAgICAgbm90IGFwcGVhciBpbiB0aGUgWE1MIHZpZXdzIG9mIEpTUCBwYWdlcy4KKy0tPgorCis8IUVMRU1FTlQganNwOmRpcmVjdGl2ZS5pbmNsdWRlIEVNUFRZPgorPCFBVFRMSVNUIGpzcDpkaXJlY3RpdmUuaW5jbHVkZQorICAgIGZpbGUgICAgICAgICAgICAlVVJJOyAgICAgICAgICAgI1JFUVVJUkVECis+CisKKzwhRUxFTUVOVCBqc3A6c2NyaXB0bGV0ICgjUENEQVRBKT4KKworPCFFTEVNRU5UIGpzcDpkZWNsYXJhdGlvbiAoI1BDREFUQSk+CisKKzwhRUxFTUVOVCBqc3A6ZXhwcmVzc2lvbiAoI1BDREFUQSk+CisKKzwhRUxFTUVOVCBqc3A6dXNlQmVhbiAlQm9keTs+Cis8IUFUVExJU1QganNwOnVzZUJlYW4KKyAgICBpZCAgICAgICAgICAgICAgSUQgICAgICAgICAgICAgICNSRVFVSVJFRAorICAgIGNsYXNzICAgICAgICAgICAlQ2xhc3NOYW1lOyAgICAgI0lNUExJRUQKKyAgICB0eXBlICAgICAgICAgICAgJVR5cGVOYW1lOyAgICAgICNJTVBMSUVECisgICAgYmVhbk5hbWUgICAgICAgICVCZWFuTmFtZTsgICAgICAjSU1QTElFRAorICAgIHNjb3BlICAgICAgICAgICAocGFnZQorICAgICAgICAgICAgICAgICAgICB8c2Vzc2lvbgorICAgICAgICAgICAgICAgICAgICB8cmVxdWVzdAorICAgICAgICAgICAgICAgICAgICB8YXBwbGljYXRpb24pICAgInBhZ2UiCis+CisKKzwhRUxFTUVOVCBqc3A6c2V0UHJvcGVydHkgRU1QVFk+Cis8IUFUVExJU1QganNwOnNldFByb3BlcnR5CisgICAgbmFtZSAgICAgICAgICAgICVCZWFuSUQ7ICAgICAgICAjUkVRVUlSRUQKKyAgICBwcm9wZXJ0eSAgICAgICAgQ0RBVEEgICAgICAgICAgICNSRVFVSVJFRAorICAgIHZhbHVlICAgICAgICAgICBDREFUQSAgICAgICAgICAgI0lNUExJRUQKKyAgICBwYXJhbSAgICAgICAgICAgQ0RBVEEgICAgICAgICAgICNJTVBMSUVECis+CisKKzwhRUxFTUVOVCBqc3A6Z2V0UHJvcGVydHkgRU1QVFk+Cis8IUFUVExJU1QganNwOmdldFByb3BlcnR5CisgICAgbmFtZSAgICAgICAgICAgICVCZWFuSUQ7ICAgICAgICAjUkVRVUlSRUQKKyAgICBwcm9wZXJ0eSAgICAgICAgQ0RBVEEgICAgICAgICAgICNSRVFVSVJFRAorPgorCis8IUVMRU1FTlQganNwOmluY2x1ZGUgKGpzcDpwYXJhbSopPgorPCFBVFRMSVNUIGpzcDppbmNsdWRlCisgICAgZmx1c2ggICAgICAgICAgICVCb29sOyAgICAgICAgICAiZmFsc2UiCisgICAgcGFnZSAgICAgICAgICAgICVVUkw7ICAgICAgICAgICAjUkVRVUlSRUQKKz4KKworPCFFTEVNRU5UIGpzcDpmb3J3YXJkIChqc3A6cGFyYW0qKT4KKzwhQVRUTElTVCBqc3A6Zm9yd2FyZAorICAgIHBhZ2UgICAgICAgICAgICAlVVJMOyAgICAgICAgICAgI1JFUVVJUkVECis+CisKKzwhRUxFTUVOVCBqc3A6cGx1Z2luIChqc3A6cGFyYW1zPywganNwOmZhbGxiYWNrPyk+Cis8IUFUVExJU1QganNwOnBsdWdpbgorICAgIHR5cGUgICAgICAgICAgICAoYmVhbnxhcHBsZXQpICAgI1JFUVVJUkVECisgICAgY29kZSAgICAgICAgICAgICVVUkk7ICAgICAgICAgICAjSU1QTElFRAorICAgIGNvZGViYXNlICAgICAgICAlVVJJOyAgICAgICAgICAgI0lNUExJRUQKKyAgICBhbGlnbiAgICAgICAgICAgJUltZ0FsaWduOyAgICAgICNJTVBMSUVECisgICAgYXJjaGl2ZSAgICAgICAgICVVcmlMaXN0OyAgICAgICAjSU1QTElFRAorICAgIGhlaWdodCAgICAgICAgICAlTGVuZ3RoOyAgICAgICAgI0lNUExJRUQKKyAgICBoc3BhY2UgICAgICAgICAgJVBpeGVsczsgICAgICAgICNJTVBMSUVECisgICAganJldmVyc2lvbiAgICAgIENEQVRBICAgICAgICAgICAiMS4yIgorICAgIG5hbWUgICAgICAgICAgICBOTVRPS0VOICAgICAgICAgI0lNUExJRUQKKyAgICB2c3BhY2UgICAgICAgICAgJVBpeGVsczsgICAgICAgICNJTVBMSUVECisgICAgd2lkdGggICAgICAgICAgICVMZW5ndGg7ICAgICAgICAjSU1QTElFRAorICAgIG5zcGx1Z2ludXJsICAgICAlVVJJOyAgICAgICAgICAgI0lNUExJRUQKKyAgICBpZXBsdWdpbnVybCAgICAgJVVSSTsgICAgICAgICAgICNJTVBMSUVECis+CisKKzwhRUxFTUVOVCBqc3A6cGFyYW1zIChqc3A6cGFyYW0rKT4KKworPCFFTEVNRU5UIGpzcDpwYXJhbSBFTVBUWT4KKzwhQVRUTElTVCBqc3A6cGFyYW0KKyAgICBuYW1lICAgICAgICAgICAgQ0RBVEEgICAgICAgICAgICNSRVFVSVJFRAorICAgIHZhbHVlICAgICAgICAgICBDREFUQSAgICAgICAgICAgI1JFUVVJUkVECis+CisKKzwhRUxFTUVOVCBqc3A6dGV4dCAjUENEQVRBPgorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvZHRkL2pzcHhtbC54c2QgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvZHRkL2pzcHhtbC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzMmRjNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9kdGQvanNweG1sLnhzZApAQCAtMCwwICsxLDUxNCBAQAorPD94bWwgdmVyc2lvbiA9IjEuMCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgc2NoZW1hIFsKKzwhLS0gUGF0dGVybnMgLS0+Cis8IUVOVElUWSBJZGVudGlmaWVyICAgIihccHtMfXxffCQpKFxwe059fFxwe0x9fF98JCkqIj4KKzwhRU5USVRZIFR5cGVOYW1lICAgICAiJklkZW50aWZpZXI7KFwuJklkZW50aWZpZXI7KSoiPgorPCFFTlRJVFkgV1MgICAgICAgIlxzKiI+Cis8IUVOVElUWSBJbXBvcnQgICAgICImVHlwZU5hbWU7KFwuXCopPyI+Cis8IUVOVElUWSBJbXBvcnRMaXN0ICAgIiZJbXBvcnQ7KCZXUzssJldTOyZJbXBvcnQ7KSoiPgorPCFFTlRJVFkgU2V0UHJvcCAgICAiKCZJZGVudGlmaWVyO3xcKikiPgorPCFFTlRJVFkgUmVsYXRpdmVVUkwgICJbXjojL1w/XSooOnswLDB9fFsjL1w/XS4qKSI+Cis8IUVOVElUWSBMZW5ndGggICAgICJbMC05XSomI3gyNTs/Ij4KKzwhRU5USVRZIEFzY2lpTmFtZSAgICAiW0EtWmEtejAtOV8tXSoiPgorPCFFTlRJVFkgVmFsaWRDb250ZW50VHlwZSAgIiZBc2NpaU5hbWU7LyZBc2NpaU5hbWU7KDsmV1M7KGNoYXJzZXQ9KT8mQXNjaWlOYW1lOyk/Ij4KKzwhRU5USVRZIFZhbGlkUGFnZUVuY29kaW5nICAiJkFzY2lpTmFtZTsvJkFzY2lpTmFtZTsiPgorPCFFTlRJVFkgQnVmZmVyICAgICAiWzAtOV0ra2IiPgorPCFFTlRJVFkgUlRleHByICAgICAiJiN4MjU7PS4qJiN4MjU7Ij4KK10+CisKKworPCEtLUNvbmZvcm1zIHRvIHczYyBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSAtLT4KKworPHhzZDpzY2hlbWEKKyAgICB4bWxucyA9ICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIgorICAgIHhtbG5zOnhzZCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgICB4bWxuczpqc3AgPSAiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIKKyAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIKKyAgICBlbGVtZW50Rm9ybURlZmF1bHQgPSAicXVhbGlmaWVkIgorICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0ID0gInVucXVhbGlmaWVkIj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgWE1MIFNjaGVtYSBmb3IgSlNQIDIuMC4KKworICAgICAgVGhpcyBzY2hlbWEgaXMgYmFzZWQgdXBvbiB0aGUgcmVjZW50IChNYXkgNXRoLCAyMDAxKQorICAgICAgVzNDIHJlY29tbWVuZGF0aW9uIGZvciBYTUwgU2NoZW1hLgorCisgICAgICBBIEpTUCB0cmFuc2xhdG9yIHNob3VsZCByZWplY3QgYW4gWE1MLWZvcm1hdCBmaWxlIHRoYXQgaXMKKyAgICAgIG5vdCBzdHJpY3RseSB2YWxpZCBhY2NvcmRpbmcgdG8gdGhpcyBzY2hlbWEgb3IgZG9lcyBub3Qgb2JzZXJ2ZQorICAgICAgdGhlIGNvbnN0cmFpbnRzIGRvY3VtZW50ZWQgaGVyZS4gQSB0cmFuc2xhdG9yIGlzIG5vdCByZXF1aXJlZAorICAgICAgdG8gdXNlIHRoaXMgc2NoZW1hIGZvciB2YWxpZGF0aW9uIG9yIHRvIHVzZSBhIHZhbGlkYXRpbmcgcGFyc2VyLgorICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKworICA8IS0tIENvbXBsZXggVHlwZXMgLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gIkJvZHkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgQm9keSBkZWZpbmVzIHRoZSAidG9wLWxldmVsIiBlbGVtZW50cyBpbiByb290IGFuZCBiZWFuSW5mby4KKyAgICAgICAgVGhlcmUgYXJlIHByb2JhYmx5IG90aGVyIGVsZW1lbnRzIHRoYXQgc2hvdWxkIHVzZSBpdC4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmdyb3VwIHJlZiA9ICJCb2R5Z3JvdXAiIG1pbk9jY3VycyA9ICIwIiBtYXhPY2N1cnMgPSAidW5ib3VuZGVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gZ3JvdXBzIC0tPgorCisgIDx4c2Q6Z3JvdXAgbmFtZSA9ICJCb2R5Z3JvdXAiPgorICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJkaXJlY3RpdmUucGFnZSIvPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJkaXJlY3RpdmUuaW5jbHVkZSIvPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJzY3JpcHRsZXQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAiZGVjbGFyYXRpb24iLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAiZXhwcmVzc2lvbiIvPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJ1c2VCZWFuIi8+CisgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gInNldFByb3BlcnR5Ii8+CisgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gImdldFByb3BlcnR5Ii8+CisgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gImluY2x1ZGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAiZm9yd2FyZCIvPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJwbHVnaW4iLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAidGV4dCIvPgorICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHMgPSAibGF4Ii8+CisgICAgPC94c2Q6Y2hvaWNlPgorICA8L3hzZDpncm91cD4KKworCisgIDwhLS0gU2ltcGxlIHR5cGVzIGFyZSBuZXh0IC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lID0gIlJURSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBBIHJlcXVlc3QtdGltZSBleHByZXNzaW9uIHZhbHVlCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlID0gInhzZDpzdHJpbmciPgorICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlID0gIiZSVGV4cHI7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiQm9vbCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBCb29sIHdvdWxkIGJlIGJvb2xlYW4gZXhjZXB0IGl0IGRvZXMgbm90IGFjY2VwdCAxIGFuZCAwLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6Tk1UT0tFTiIgPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJ0cnVlIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gImZhbHNlIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gInllcyIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJubyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPiAgICAgCisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiSWRlbnRpZmllciI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBJZGVudGlmaWVyIGlzIGFuIHVucXVhbGlmaWVkIEphdmEgaWRlbnRpZmllci4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJklkZW50aWZpZXI7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisgIAorICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJUeXBlTmFtZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBUeXBlTmFtZSBpcyBvbmUgb3IgbW9yZSBKYXZhIGlkZW50aWZpZXJzIHNlcGFyYXRlZCBieSBkb3RzCisgICAgICAgIHdpdGggbm8gd2hpdGVzcGFjZS4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJlR5cGVOYW1lOyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorICAKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiSW1wb3J0TGlzdCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBJbXBvcnRMaXN0IGlzIG9uZSBvciBtb3JlIHR5cGVOYW1lcyBzZXBhcmF0ZWQgYnkgY29tbWFzLgorICAgICAgICBXaGl0ZXNwYWNlIGlzIGFsbG93ZWQgYmVmb3JlIGFuZCBhZnRlciB0aGUgY29tbWEuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlID0gInhzZDpzdHJpbmciPgorICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlID0gIiZJbXBvcnRMaXN0OyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorICAKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiU2V0UHJvcCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBTZXRQcm9wIGlzIGFuIElkZW50aWZpZXIgb3IgKi4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJlNldFByb3A7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisgIAorICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJSZWxhdGl2ZVVSTCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBSZWxhdGl2ZVVSTCBpcyBhIHVyaVJlZmVyZW5jZSB3aXRoIG5vIGNvbG9uIGNoYXJhY3RlcgorICAgICAgICBiZWZvcmUgdGhlIGZpcnN0IC8sID8gb3IgIywgaWYgYW55IChSRkMyMzk2KS4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKwk8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOmFueVVSSSI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJlJlbGF0aXZlVVJMOyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lID0gIlJURVJlbGF0aXZlVVJMIj4KKyAgICA8eHNkOnVuaW9uIG1lbWJlclR5cGVzID0gIlJlbGF0aXZlVVJMIFJURSIvPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lID0gIkxlbmd0aCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBMZW5ndGggaXMgbm4gb3Igbm4lLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6c3RyaW5nIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZSA9ICImTGVuZ3RoOyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorICAKKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJFeHBsaWNpdEJ1ZmZlclNpemUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIEJ1ZmZlciBTaXplIHdpdGggYW4gZXhwbGljaXQgdmFsdWUKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4gCisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlID0gInhzZDpzdHJpbmciPgorICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlID0gIiZCdWZmZXI7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiTm9uZUJ1ZmZlclNpemUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIEJ1ZmZlciBTaXplIHdpdGggYSAibm9uZSIgdmFsdWUKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4gCisgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlID0gInhzZDpzdHJpbmciPgorICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJub25lIi8+CisgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiQnVmZmVyU2l6ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBCdWZmZXIgc2l6ZSBpcyB4a2Igb3Igbm9uZS4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnVuaW9uIG1lbWJlclR5cGVzID0gIkV4cGxpY2l0QnVmZmVyU2l6ZSBOb25lQnVmZmVyU2l6ZSIvPgorICA8L3hzZDpzaW1wbGVUeXBlPgorICAKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiQ29udGVudFR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgQ29udGVudCB0eXBlIGFuZCBjaGFyYWN0ZXIgZW5jb2RpbmcgZm9yIHRoaXMgcGFnZS4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJlZhbGlkQ29udGVudFR5cGU7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiUGFnZUVuY29kaW5nIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIFBhZ2UgRW5jb2RpbmcgZm9yIHRoaXMgcGFnZS4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJlZhbGlkUGFnZUVuY29kaW5nOyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lID0gIlNjb3BlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIHZhbGlkIHNjb3BlIHZhbHVlcworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6Tk1UT0tFTiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gInBhZ2UiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAic2Vzc2lvbiIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJyZXF1ZXN0Ii8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gImFwcGxpY2F0aW9uIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiUGx1Z0luVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICB2YWxpZCB2YWx1ZXMgZm9yIGEgcGx1Z2luIHR5cGUKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOk5NVE9LRU4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJiZWFuIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gImFwcGxldCIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lID0gIkFsaWduVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBCdWZmZXIgc2l6ZSBpcyB4a2IuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlID0gInhzZDpOTVRPS0VOIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAidG9wIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gIm1pZGRsZSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJib3R0b20iLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAibGVmdCIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJyaWdodCIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gRWxlbWVudHMgZm9sbG93IC0tPgorCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gInJvb3QiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgVGhlIHJvb3QgZWxlbWVudCBvZiBhbGwgSlNQIGRvY3VtZW50cyBpcyBuYW1lZCByb290LgorICAgICAgICAKKyAgICAgICAgQXV0aG9ycyBtYXksIGlmIHRoZXkgd2lzaCwgaW5jbHVkZSBzY2hlbWEgbG9jYXRpb24gaW5mb3JtYXRpb24uCisgICAgICAgIElmIHNwZWNpZmllZCwgdGhlIGluZm9ybWF0aW9uIG1heSBhcHBlYXIgYXMgYXR0cmlidXRlcyBvZgorICAgICAgICB0aGUgcm9vdCBlbGVtZW50IGFzIGZvbGxvd3M6CisKKyAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIHhzZC1maWxlLWxvY2F0aW9uIgorCisgICAgICAgIERvY3VtZW50cyBzaG91bGQgbm90IHNwZWNpZnkgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIGEgRFRECisgICAgICAgIGluIGEgRE9DVFlQRSBkZWNsYXJhdGlvbi4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KKyAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZSA9ICJCb2R5Ij4KKyAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInZlcnNpb24iIGZpeGVkID0gIjIuMCIgdHlwZSA9ICJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICA8L3hzZDplbGVtZW50PgorICAKKyAgPHhzZDplbGVtZW50IG5hbWUgPSAiZGlyZWN0aXZlLnBhZ2UiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgZGlyZWN0aXZlLnBhZ2UgaXMgdGhlICJwYWdlIGRpcmVjdGl2ZSIuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAibGFuZ3VhZ2UiIGRlZmF1bHQgPSAiamF2YSIgdHlwZSA9ICJ4c2Q6c3RyaW5nIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImV4dGVuZHMiIHR5cGUgPSAiVHlwZU5hbWUiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiY29udGVudFR5cGUiIGRlZmF1bHQgPSAidGV4dC9odG1sOyBJU08tODg1OS0xIiB0eXBlID0gIkNvbnRlbnRUeXBlIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInBhZ2VFbmNvZGluZyIgdXNlID0gIm9wdGlvbmFsIiB0eXBlID0gIlBhZ2VFbmNvZGluZyIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpbXBvcnQiIHR5cGUgPSAiSW1wb3J0TGlzdCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJzZXNzaW9uIiBkZWZhdWx0ID0gInRydWUiIHR5cGUgPSAiQm9vbCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJidWZmZXIiIGRlZmF1bHQgPSAiOGtiIiB0eXBlID0gIkJ1ZmZlclNpemUiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiYXV0b0ZsdXNoIiBkZWZhdWx0ID0gInRydWUiIHR5cGUgPSAiQm9vbCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpc1RocmVhZFNhZmUiIGRlZmF1bHQgPSAidHJ1ZSIgdHlwZSA9ICJCb29sIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImluZm8iIHR5cGUgPSAieHNkOnN0cmluZyIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJlcnJvclBhZ2UiIHR5cGUgPSAiUmVsYXRpdmVVUkwiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiaXNFcnJvclBhZ2UiIGRlZmF1bHQgPSAiZmFsc2UiIHR5cGUgPSAiQm9vbCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpc0VMSWdub3JlZCIgdHlwZSA9ICJCb29sIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisgIAorICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJkaXJlY3RpdmUuaW5jbHVkZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBkaXJlY3RpdmUuaW5jbHVkZSBpcyB0aGUgImluY2x1ZGUgZGlyZWN0aXZlIi4KKwlUaGlzIGVsZW1lbnQgZG9lcyBub3QgYXBwZWFyIG9uIFhNTCB2aWV3cyBvZiBKU1AgcGFnZXMuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiZmlsZSIgdXNlID0gInJlcXVpcmVkIiB0eXBlID0gIlJlbGF0aXZlVVJMIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisKKyAgPHhzZDplbGVtZW50IG5hbWUgPSAic2NyaXB0bGV0IiB0eXBlID0gInhzZDpzdHJpbmciPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgVGhlIHJlcHJlc2VudGF0aW9uIG9mIGEgc2NyaXBsZXQuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgIDwveHNkOmVsZW1lbnQ+CisgIAorICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJkZWNsYXJhdGlvbiIgdHlwZSA9ICJ4c2Q6c3RyaW5nIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIFRoZSByZXByc2VudGF0aW9uIG9mIGEgZGVjbGFyYXRpb24uCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgIDwveHNkOmVsZW1lbnQ+CisgIAorICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJleHByZXNzaW9uIiB0eXBlID0gInhzZDpzdHJpbmciPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgVGhlIHJlcHJlc2VudGF0aW9uIG9mIGFuIGV4cHJlc3Npb24uCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgIDwveHNkOmVsZW1lbnQ+CisgCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gInRleHQiIHR5cGUgPSAieHNkOnN0cmluZyI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBWZXJiYXRpbSB0ZW1wbGF0ZSB0ZXh0LgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICA8L3hzZDplbGVtZW50PgorCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gInVzZUJlYW4iPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgdXNlQmVhbiBpbnN0YW50aWF0ZXMgb3IgYWNjZXNzZXMgYSBiZWFuIGluIHRoZSBzcGVjaWZpZWQgc2NvcGUuCisgICAgICAgIAorICAgICAgICBDb25zdHJhaW50OiBUaGUgYWxsb3dlZCBjb21iaW5hdGlvbnMgb2YgYXR0cmlidXRlcyBhcmU6CisgICAgICAgIAorICAgICAgICAgIGNsYXNzIFt0eXBlXSB8IHR5cGUgWyggY2xhc3MgfCBiZWFuTmFtZSldCisgICAgICAgIAorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgorICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJCb2R5Ij4KKyAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImlkIiB1c2UgPSAicmVxdWlyZWQiIHR5cGUgPSAiSWRlbnRpZmllciIvPgorICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiY2xhc3MiIHR5cGUgPSAiVHlwZU5hbWUiLz4KKyAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInR5cGUiIHR5cGUgPSAiVHlwZU5hbWUiLz4KKyAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImJlYW5OYW1lIiB0eXBlID0gIlR5cGVOYW1lIi8+CisgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJzY29wZSIgZGVmYXVsdCA9ICJwYWdlIiB0eXBlID0gIlNjb3BlIi8+CisgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICA8L3hzZDplbGVtZW50PgorICAKKyAgPHhzZDplbGVtZW50IG5hbWUgPSAic2V0UHJvcGVydHkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgc2V0UHJvcGVydHkgY2hhbmdlcyB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IHByb3BlcnR5LgorICAgICAgICAKKyAgICAgICAgQ29uc3RyYWludDogVGhlIG9iamVjdCBuYW1lZCBieSB0aGUgbmFtZSBtdXN0IGhhdmUgYmVlbgorICAgICAgICAiaW50cm9kdWNlZCIgdG8gdGhlIEpTUCBwcm9jZXNzb3IgdXNpbmcgZWl0aGVyIHRoZQorICAgICAgICBqc3A6dXNlQmVhbiBhY3Rpb24gb3IgYSBjdXN0b20gYWN0aW9uIHdpdGggYW4gYXNzb2NpYXRlZAorICAgICAgICBWYXJpYWJsZUluZm8gZW50cnkgZm9yIHRoaXMgbmFtZS4KKworICAgICAgICBFeGFjdCB2YWxpZCBjb21iaW5hdGlvbnMgYXJlIG5vdCBleHByZXNzYWJsZSBpbiBYTUwgU2NoZW1hLgorICAgICAgICBUaGV5IGFyZToKKworICAgICAgICBuYW1lPSJJZGVudGlmaWVyIiBwcm9wZXJ0eT0iKiIKKyAgICAgICAgbmFtZT0iSWRlbnRpZmllciIgcHJvcGVydHk9IklkZW50ZmlpZXIiIHBhcmFtPSJzdHJpbmciCisgICAgICAgIG5hbWU9IklkZW50aWZpZXIiIHByb3BlcnR5PSJJZGVudGlmaWVyIiB2YWx1ZT0ic3RyaW5nIgorICAgICAgICAgICAgICAgIAorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gIm5hbWUiIHVzZSA9ICJyZXF1aXJlZCIgdHlwZSA9ICJJZGVudGlmaWVyIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInByb3BlcnR5IiB1c2UgPSAicmVxdWlyZWQiIHR5cGUgPSAiU2V0UHJvcCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJwYXJhbSIgdHlwZSA9ICJ4c2Q6c3RyaW5nIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInZhbHVlIiB0eXBlID0gInhzZDpzdHJpbmciLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKworICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJnZXRQcm9wZXJ0eSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBnZXRQcm9wZXJ0eSBvYnRhaW5zIHRoZSB2YWx1ZSBvZiBhbiBvYmplY3QgcHJvcGVydHkuCisgICAgICAgIAorICAgICAgICBDb25zdHJhaW50OiBUaGUgb2JqZWN0IG5hbWVkIGJ5IHRoZSBuYW1lIG11c3QgaGF2ZSBiZWVuCisgICAgICAgICJpbnRyb2R1Y2VkIiB0byB0aGUgSlNQIHByb2Nlc3NvciB1c2luZyBlaXRoZXIgdGhlCisgICAgICAgIGpzcDp1c2VCZWFuIGFjdGlvbiBvciBhIGN1c3RvbSBhY3Rpb24gd2l0aCBhbiBhc3NvY2lhdGVkCisgICAgICAgIFZhcmlhYmxlSW5mbyBlbnRyeSBmb3IgdGhpcyBuYW1lLgorICAgICAgICAKKyAgICAgICAgPz8/VGhlIHNwZWMgaXMgaW50ZXJwcmV0ZWQgYXMgcmVzdHJpY3RpbmcgdGhlIHZhbHVlcyBvZgorICAgICAgICBwcm9wZXJ0eSB0byBJZGVudGlmaWVyLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gIm5hbWUiIHVzZSA9ICJyZXF1aXJlZCIgdHlwZSA9ICJJZGVudGlmaWVyIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInByb3BlcnR5IiB1c2UgPSAicmVxdWlyZWQiIHR5cGUgPSAiSWRlbnRpZmllciIvPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICA8L3hzZDplbGVtZW50PgorICAKKyAgPHhzZDplbGVtZW50IG5hbWUgPSAiaW5jbHVkZSI+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAicGFyYW0iIG1pbk9jY3VycyA9ICIwIiBtYXhPY2N1cnMgPSAidW5ib3VuZGVkIi8+CisgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiZmx1c2giIGRlZmF1bHQgPSAiZmFsc2UiIHR5cGUgPSAiQm9vbCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJwYWdlIiB1c2UgPSAicmVxdWlyZWQiIHR5cGUgPSAiUlRFUmVsYXRpdmVVUkwiLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKworICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJmb3J3YXJkIj4KKyAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJwYXJhbSIgbWluT2NjdXJzID0gIjAiIG1heE9jY3VycyA9ICJ1bmJvdW5kZWQiLz4KKyAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJwYWdlIiB1c2UgPSAicmVxdWlyZWQiIHR5cGUgPSAiUlRFUmVsYXRpdmVVUkwiLz4KKyAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisgIAorICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJwbHVnaW4iPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+IDwhLS0gY29udGVudCBvbmx5ISAtLT4KKyAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAicGFyYW1zIiBtaW5PY2N1cnMgPSAiMCIgbWF4T2NjdXJzID0gIjEiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWUgPSAiZmFsbGJhY2siIG1pbk9jY3VycyA9ICIwIiBtYXhPY2N1cnMgPSAiMSIgdHlwZSA9ICJCb2R5Ii8+CisgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAidHlwZSIgdXNlID0gInJlcXVpcmVkIiB0eXBlID0gIlBsdWdJblR5cGUiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiY29kZSIgdHlwZSA9ICJ4c2Q6YW55VVJJIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImNvZGViYXNlIiB0eXBlID0gInhzZDphbnlVUkkiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiYWxpZ24iIHR5cGUgPSAiQWxpZ25UeXBlIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImFyY2hpdmUiPgorICAgICAgICA8eHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgIDx4c2Q6bGlzdCBpdGVtVHlwZT0ieHNkOmFueVVSSSIvPgorICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgICAgPC94c2Q6YXR0cmlidXRlPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJoZWlnaHQiIHR5cGUgPSAiTGVuZ3RoIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImhzcGFjZSIgdHlwZSA9ICJ4c2Q6aW50Ii8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImpyZXZlcnNpb24iIGRlZmF1bHQgPSAiMS4yIiB0eXBlID0gInhzZDpzdHJpbmciLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAibmFtZSIgdHlwZSA9ICJ4c2Q6Tk1UT0tFTiIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJ2c3BhY2UiIHR5cGUgPSAieHNkOmludCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJ3aWR0aCIgdHlwZSA9ICJMZW5ndGgiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAibnNwbHVnaW51cmwiIHR5cGUgPSAieHNkOmFueVVSSSIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpZXBsdWdpbnVybCIgdHlwZSA9ICJ4c2Q6YW55VVJJIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisgIAorICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJwYXJhbXMiPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAicGFyYW0iIG1pbk9jY3VycyA9ICIxIiBtYXhPY2N1cnMgPSAidW5ib3VuZGVkIi8+CisgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisKKyAgPHhzZDplbGVtZW50IG5hbWUgPSAicGFyYW0iPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gIm5hbWUiIHVzZSA9ICJyZXF1aXJlZCIgdHlwZSA9ICJ4c2Q6Tk1UT0tFTiIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJ2YWx1ZSIgdXNlID0gInJlcXVpcmVkIiB0eXBlID0gInhzZDpzdHJpbmciLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKyAgCis8L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxNTQyMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8xLmR0ZApAQCAtMCwwICsxLDIwNyBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tCisKKyAgIFRoaXMgaXMgdGhlIERURCBkZWZpbmluZyB0aGUgSmF2YVNlcnZlciBQYWdlcyAxLjEgVGFnIExpYnJhcnkKKyAgIGRlc2NyaXB0b3IgKC50bGQpIChYTUwpIGZpbGUgZm9ybWF0L3N5bnRheC4KKworICAgQSBUYWcgTGlicmFyeSBpcyBhIEpBUiBmaWxlIGNvbnRhaW5pbmcgYSB2YWxpZCBpbnN0YW5jZSBvZiBhIFRhZyBMaWJyYXJ5CisgICBEZXNjcmlwdG9yICh0YWdsaWIudGxkKSBmaWxlIGluIHRoZSBNRVRBLUlORiBzdWJkaXJlY3RvcnksIGFsb25nIHdpdGggdGhlCisgICBhcHByb3ByaWF0ZSBpbXBsZW1lbnRpbmcgY2xhc3NlcywgYW5kIG90aGVyIHJlc291cmNlcyByZXF1aXJlZCB0bworICAgaW1wbGVtZW50IHRoZSB0YWdzIGRlZmluZWQgdGhlcmVpbi4KKworICAgVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcy4KKyAgLS0+CisKKzwhLS0KK1RoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LCBpdCBkZWZpbmVzOgorCit0bGlidmVyc2lvbgl0aGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KK2pzcHZlcnNpb24JdGhlIHZlcnNpb24gb2YgSlNQIHRoZSB0YWcgbGlicmFyeSBkZXBlbmRzIHVwb24KKworc2hvcnRuYW1lCWEgc2ltcGxlIGRlZmF1bHQgc2hvcnQgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkKKwkJYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYSBtbmVtb25pYworCQl2YWx1ZTsgZm9yIGV4YW1wbGUsIHRoZSBpdCBtYXkgYmUgdXNlZCBhcyB0aGUgcHJlZmVyZWQKKwkJcHJlZml4IHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzCit1cmkJCWEgdXJpIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgdGFnbGliCitpbmZvCQlhIHNpbXBsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgInVzZSIgb2YgdGhpcyB0YWdsaWIsCisJCXNob3VsZCBiZSB1c2VyIGRpc2Nlcm5hYmxlCistLT4KKworPCFFTEVNRU5UIHRhZ2xpYiAodGxpYnZlcnNpb24sIGpzcHZlcnNpb24/LCBzaG9ydG5hbWUsIHVyaT8sIGluZm8/LCB0YWcrKSA+Cis8IUFUVExJU1QgdGFnbGliIGlkIElEICNJTVBMSUVECisJICB4bWxucyBDREFUQSAjRklYRUQKKwkJImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQiCis+CisKKzwhLS0KK0Rlc2NyaWJlcyB0aGlzIHZlcnNpb24gKG51bWJlcikgb2YgdGhlIHRhZ2xpYnJhcnkgKGRld2V5IGRlY2ltYWwpCisKKyNQQ0RBVEEgOjo9IFswLTldKnsgIi4iWzAtOV0gfTAuLjMKKy0tPgorCis8IUVMRU1FTlQgdGxpYnZlcnNpb24gKCNQQ0RBVEEpID4KKworPCEtLQorRGVzY3JpYmVzIHRoZSBKU1AgdmVyc2lvbiAobnVtYmVyKSB0aGlzIHRhZ2xpYnJhcnkgcmVxdWlyZXMgaW4KK29yZGVyIHRvIGZ1bmN0aW9uIChkZXdleSBkZWNpbWFsKQorCitUaGUgZGVmYXVsdCBpcyAxLjEKKworI1BDREFUQSA6Oj0gWzAtOV0qeyAiLiJbMC05XSB9MC4uMworLS0+CisKKzwhRUxFTUVOVCBqc3B2ZXJzaW9uICAoI1BDREFUQSkgPgorCis8IS0tCitEZWZpbmVzIGEgc2hvcnQgKGRlZmF1bHQpIHNob3J0bmFtZSB0byBiZSB1c2VkIGZvciB0YWdzIGFuZAordmFyaWFibGUgbmFtZXMgdXNlZC9jcmVhdGVkIGJ5IHRoaXMgdGFnIGxpYnJhcnkuICBEbyBub3QgdXNlCit3aGl0ZSBzcGFjZSwgYW5kIGRvIG5vdCBzdGFydCB3aXRoIGRpZ2l0cyBvciB1bmRlcnNjb3JlLgorCisjUENEQVRBIDo6PSBOTVRPS0VOCistLT4KKworPCFFTEVNRU5UIHNob3J0bmFtZSAgICAgICgjUENEQVRBKSA+CisKKzwhLS0KK0RlZmluZXMgYSBwdWJsaWMgVVJJIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIHZlcnNpb24gb2YKK3RoZSB0YWdsaWJyYXJ5IExlYXZlIGl0IGVtcHR5IGlmIGl0IGRvZXMgbm90IGFwcGx5LgorLS0+CisKKzwhRUxFTUVOVCB1cmkJICgjUENEQVRBKSA+CisKKzwhLS0KK0RlZmluZXMgYW4gYXJiaXRyYXJ5IHRleHQgc3RyaW5nIGRlc2NpcmJpbmcgdGhlIHRhZyBsaWJyYXJ5CistLT4KKworPCFFTEVNRU5UIGluZm8JKCNQQ0RBVEEpID4KKworPCEtLQorVGhlIHRhZyBkZWZpbmVzIGEgdW5pcXVlIHRhZyBpbiB0aGlzIHRhZyBsaWJyYXJ5LCBkZWZpbmluZzoKKworLSB0aGUgdW5pcXVlIHRhZy9lbGVtZW50IG5hbWUKKy0gdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcgaW1wbGVtZW50YXRpb24gY2xhc3MKKy0gYW4gb3B0aW9uYWwgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbworLSB0aGUgYm9keSBjb250ZW50IHR5cGUgKGhpbnQpCistIG9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgorLSBhbnkgYXR0cmlidXRlcworLS0+CisKKzwhRUxFTUVOVCB0YWcgKG5hbWUsIHRhZ2NsYXNzLCB0ZWljbGFzcz8sIGJvZHljb250ZW50PywgaW5mbz8sIGF0dHJpYnV0ZSopID4KKworPCEtLQorRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VybHZldC5qc3AudGFnZXh0LlRhZyB0aGF0IGltcGxlbWVudHMKK3RoZSByZXF1ZXN0IHRpbWUgc2VtYW50aWNzIGZvciB0aGlzIHRhZy4gKHJlcXVpcmVkKQorCisjUENEQVRBIDo6PSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCistLT4KKworPCFFTEVNRU5UIHRhZ2NsYXNzICgjUENEQVRBKSA+CisKKzwhLS0KK0RlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8gZm9yCit0aGlzIHRhZy4gKG9wdGlvbmFsKQorCitJZiB0aGlzIGlzIG5vdCBnaXZlbiwgdGhlIGNsYXNzIGlzIG5vdCBjb25zdWx0ZWQgYXQgdHJhbnNsYXRpb24gdGltZS4KKworI1BDREFUQSA6Oj0gZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQorLS0+CisKKzwhRUxFTUVOVCB0ZWljbGFzcyAoI1BDREFUQSkgPgorCis8IS0tCitQcm92aWRlcyBhIGhpbnQgYXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGJvZHkgb2YgdGhpcyB0YWcuIFByaW1hcmlseQoraW50ZW5kZWQgZm9yIHVzZSBieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzLgorCitUaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIHZhbHVlcyBzcGVjaWZpZWQ6CisKK3RhZ2RlcGVuZGVudAlUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcKKwkJaW1wbGVtZW50YXRpb24gaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkgaW4gYQorCQlkaWZmZXJlbnQgImxhbmdhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMIHN0YXRlbWVudHMuCisKK0pTUAkJVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQIHN5bnRheAorCitlbXB0eQkJVGhlIGJvZHkgbXVzdCBiZSBlbXB0eQorCitUaGUgZGVmYXVsdCAoaWYgbm90IGRlZmluZWQpIGlzIEpTUAorCisjUENEQVRBIDo6PSAgdGFnZGVwZW5kZW50IHwgSlNQIHwgZW1wdHkKKworLS0+CisKKzwhRUxFTUVOVCBib2R5Y29udGVudCAoI1BDREFUQSkgPgorCis8IS0tCitUaGUgYXR0cmlidXRlIHRhZyBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcgdGFnCisKK0FuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGlzIGNvbXBvc2VkIG9mOgorCistIHRoZSBhdHRyaWJ1dGVzIG5hbWUgKHJlcXVpcmVkKQorLSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsIChvcHRpb25hbCkKKy0gaWYgdGhlIGF0dHJpYnV0ZXMgdmFsdWUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgYXQgcnVudGltZQorICBieSBhIHNjcmlwdGxldCBleHByZXNzaW9uIChvcHRpb25hbCkKKworLS0+CisKKzwhRUxFTUVOVCBhdHRyaWJ1dGUgKG5hbWUsIHJlcXVpcmVkPyAsIHJ0ZXhwcnZhbHVlPykgPgorCis8IS0tCitEZWZpbmVzIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIHRhZyBvciBhdHRyaWJ1dGUgYmVpbmcgZGVmaW5lZAorCisjUENEQVRBIDo6PSBOTVRPS0VOCistLT4KKworPCFFTEVNRU5UIG5hbWUJKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwuCisKKyNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCisKK0lmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKK2lzIG9wdGlvbmFsLgorLS0+CisKKzwhRUxFTUVOVCByZXF1aXJlZCAgICAoI1BDREFUQSkgPgorCis8IS0tCitEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBjYW4gaGF2ZSBzY3JpcHRsZXQgZXhwcmVzc2lvbnMgYXMKK2EgdmFsdWUsIGkuZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZAorYXQgcmVxdWVzdCB0aW1lLCBhcyBvcHBvc2VkIHRvIGEgc3RhdGljIHZhbHVlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb24KK3RpbWUuCisKKyNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCisKK0lmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKK2hhcyBhIHN0YXRpYyB2YWx1ZQorLS0+CisKKzwhRUxFTUVOVCBydGV4cHJ2YWx1ZSAoI1BDREFUQSkgPgorCis8IUFUVExJU1QgdGxpYnZlcnNpb24gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QganNwdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzaG9ydG5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdXJpIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGluZm8gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdGFnIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHRhZ2NsYXNzIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHRlaWNsYXNzIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGJvZHljb250ZW50IGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGF0dHJpYnV0ZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBuYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJlcXVpcmVkIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJ0ZXhwcnZhbHVlIGlkIElEICNJTVBMSUVEPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2R0ZC93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2R0ZC93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZTM5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQKQEAgLTAsMCArMSw0NzggQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLQorCisgICBUaGlzIGlzIHRoZSBEVEQgZGVmaW5pbmcgdGhlIEphdmFTZXJ2ZXIgUGFnZXMgMS4yIFRhZyBMaWJyYXJ5CisgICBkZXNjcmlwdG9yICgudGxkKSAoWE1MKSBmaWxlIGZvcm1hdC9zeW50YXguCisKKyAgIEEgVGFnIExpYnJhcnkgaXMgYSBKQVIgZmlsZSBjb250YWluaW5nIGEgdmFsaWQgaW5zdGFuY2Ugb2YgYSBUYWcgTGlicmFyeQorICAgRGVzY3JpcHRvciAodGFnbGliLnRsZCkgZmlsZSBpbiB0aGUgTUVUQS1JTkYgc3ViZGlyZWN0b3J5LCBhbG9uZyB3aXRoIHRoZQorICAgYXBwcm9wcmlhdGUgaW1wbGVtZW50aW5nIGNsYXNzZXMsIGFuZCBvdGhlciByZXNvdXJjZXMgcmVxdWlyZWQgdG8KKyAgIGltcGxlbWVudCB0aGUgdGFncyBkZWZpbmVkIHRoZXJlaW4uCisKKyAgIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCisgIC0tPgorCis8IU5PVEFUSU9OIFdFQi1KU1BUQUdMSUIuMV8yIFBVQkxJQworICAgICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMi8vRU4iPgorCis8IS0tCitUaGlzIGlzIHRoZSBYTUwgRFREIGZvciB0aGUgSlNQIDEuMiBUYWcgTGlicmFyeSBEZXNjcmlwdG9yLgorQWxsIEpTUCAxLjIgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcnMgbXVzdCBpbmNsdWRlIGEgRE9DVFlQRQorb2YgdGhlIGZvbGxvd2luZyBmb3JtOgorCisgIDwhRE9DVFlQRSB0YWdsaWIKKyAgICAgICAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMi8vRU4iCisJImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiPgorCistLT4KKworPCEtLQorVGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QsIGl0IGRlZmluZXM6CisKK3RsaWItdmVyc2lvbgl0aGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KKworanNwLXZlcnNpb24JdGhlIHZlcnNpb24gb2YgSlNQIHRoZSB0YWcgbGlicmFyeSBkZXBlbmRzIHVwb24KKworc2hvcnQtbmFtZQlhIHNpbXBsZSBkZWZhdWx0IHNob3J0IG5hbWUgdGhhdCBjb3VsZCBiZSB1c2VkIGJ5CisJCWEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSBuYW1lcyB3aXRoIGEgbW5lbW9uaWMKKwkJdmFsdWU7IGZvciBleGFtcGxlLCB0aGUgaXQgbWF5IGJlIHVzZWQgYXMgdGhlIHByZWZlcmVkCisJCXByZWZpeCB2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcworCit1cmkJCWEgdXJpIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgdGFnbGliCisKK2Rpc3BsYXktbmFtZSAgICB0aGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQKKyAgICAgICAgICAgICAgICBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMKK3NtYWxsLWljb24gICAgICBvcHRpb25hbCBzbWFsbC1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKKworbGFyZ2UtaWNvbiAgICAgIG9wdGlvbmFsIGxhcmdlLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scworCitkZXNjcmlwdGlvbglhIHNpbXBsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgInVzZSIgb2YgdGhpcyB0YWdsaWIsCisJCXNob3VsZCBiZSB1c2VyIGRpc2Nlcm5hYmxlCisKK3ZhbGlkYXRvciAgICAgICBvcHRpb25hbCBUYWdMaWJyYXJ5VmFsaWRhdG9yIGluZm9ybWF0aW9uCisKK2xpc3RlbmVyICAgICAgICBvcHRpb25hbCBldmVudCBsaXN0ZW5lciBzcGVjaWZpY2F0aW9uCisKKworLS0+CisKKzwhRUxFTUVOVCB0YWdsaWIgKHRsaWItdmVyc2lvbiwganNwLXZlcnNpb24sIHNob3J0LW5hbWUsIHVyaT8sCisgICAgICAgICAgICAgICAgICBkaXNwbGF5LW5hbWU/LCBzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8sIGRlc2NyaXB0aW9uPywKKyAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcj8sIGxpc3RlbmVyKiwgdGFnKykgPgorCis8IUFUVExJU1QgdGFnbGliIGlkIElEICNJTVBMSUVECisJICB4bWxucyBDREFUQSAjRklYRUQKKwkJImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1RhZ0xpYnJhcnlEZXNjcmlwdG9yIgorPgorCis8IS0tCitEZXNjcmliZXMgdGhpcyB2ZXJzaW9uIChudW1iZXIpIG9mIHRoZSB0YWdsaWJyYXJ5IChkZXdleSBkZWNpbWFsKQorCisjUENEQVRBIDo6PSBbMC05XSp7ICIuIlswLTldIH0wLi4zCistLT4KKworPCFFTEVNRU5UIHRsaWItdmVyc2lvbiAoI1BDREFUQSkgPgorCis8IS0tCitEZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnbGlicmFyeSByZXF1aXJlcyBpbgorb3JkZXIgdG8gZnVuY3Rpb24gKGRld2V5IGRlY2ltYWwpCisKK1RoZSBkZWZhdWx0IGlzIDEuMgorCisjUENEQVRBIDo6PSBbMC05XSp7ICIuIlswLTldIH0wLi4zCistLT4KKworPCFFTEVNRU5UIGpzcC12ZXJzaW9uICAoI1BDREFUQSkgPgorCis8IS0tCitEZWZpbmVzIGEgc2hvcnQgKGRlZmF1bHQpIHNob3J0LW5hbWUgdG8gYmUgdXNlZCBmb3IgdGFncyBhbmQKK3ZhcmlhYmxlIG5hbWVzIHVzZWQvY3JlYXRlZCBieSB0aGlzIHRhZyBsaWJyYXJ5LiAgRG8gbm90IHVzZQord2hpdGUgc3BhY2UsIGFuZCBkbyBub3Qgc3RhcnQgd2l0aCBkaWdpdHMgb3IgdW5kZXJzY29yZS4KKworI1BDREFUQSA6Oj0gTk1UT0tFTgorLS0+CisKKzwhRUxFTUVOVCBzaG9ydC1uYW1lICAgICAgKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyBhIHB1YmxpYyBVUkkgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgdmVyc2lvbiBvZgordGhlIHRhZ2xpYnJhcnkuICBMZWF2ZSBpdCBlbXB0eSBpZiBpdCBkb2VzIG5vdCBhcHBseS4KKy0tPgorCis8IUVMRU1FTlQgdXJpCSAoI1BDREFUQSkgPgorCis8IS0tCitEZWZpbmVzIGFuIGFyYml0cmFyeSB0ZXh0IHN0cmluZyBkZXNjaXJiaW5nIHRoZSB0YWcgbGlicmFyeQorLS0+CisKKzwhRUxFTUVOVCBkZXNjcmlwdGlvbgkoI1BDREFUQSkgPgorCis8IS0tCisKK0RlZmluZXMgYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8KK3ZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkuCistLT4KKworPCFFTEVNRU5UIHZhbGlkYXRvciAodmFsaWRhdG9yLWNsYXNzLCBpbml0LXBhcmFtKiwgZGVzY3JpcHRpb24/KSA+CisKKworPCEtLQorCitEZWZpbmVzIHRoZSBUYWdMaWJyYXJ5VmFsaWRhdG9yIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8KK3ZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkuCistLT4KKworPCFFTEVNRU5UIHZhbGlkYXRvci1jbGFzcyAoI1BDREFUQSkgPgorCisKKzwhLS0KKworVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcyBhbgoraW5pdGlhbGl6YXRpb24gcGFyYW0KKy0tPgorCis8IUVMRU1FTlQgaW5pdC1wYXJhbSAocGFyYW0tbmFtZSwgcGFyYW0tdmFsdWUsIGRlc2NyaXB0aW9uPyk+CisKKzwhLS0KKworVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KKy0tPgorCis8IUVMRU1FTlQgcGFyYW0tbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KKworVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLgorLS0+CisKKzwhRUxFTUVOVCBwYXJhbS12YWx1ZSAoI1BDREFUQSk+CisKKworPCEtLQorCitEZWZpbmVzIGFuIG9wdGlvbmFsIGV2ZW50IGxpc3RlbmVyIG9iamVjdCB0byBiZSBpbnN0YW50aWF0ZWQgYW5kCityZWdpc3RlcmVkIGF1dG9tYXRpY2FsbHkuCistLT4KKworPCFFTEVNRU5UIGxpc3RlbmVyIChsaXN0ZW5lci1jbGFzcykgPgorCis8IS0tCisKK1RoZSBsaXN0ZW5lci1jbGFzcyBlbGVtZW50IGRlY2xhcmVzIGEgY2xhc3MgaW4gdGhlIGFwcGxpY2F0aW9uIHRoYXQKK211c3QgYmUgcmVnaXN0ZXJlZCBhcyBhIHdlYiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLiAgU2VlIHRoZQorU2VydmxldCAyLjMgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKy0tPgorCis8IUVMRU1FTlQgbGlzdGVuZXItY2xhc3MgKCNQQ0RBVEEpID4KKworCis8IS0tCitUaGUgdGFnIGRlZmluZXMgYSB1bmlxdWUgdGFnIGluIHRoaXMgdGFnIGxpYnJhcnkuICBJdCBoYXMgb25lCithdHRyaWJ1dGUsIGlkLgorCitUaGUgdGFnIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKKworbmFtZSAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZQorCit0YWctY2xhc3MgICAgICAgICBUaGUgdGFnIGhhbmRsZXIgY2xhc3MgaW1wbGVtZW50aW5nCisgICAgICAgICAgICAgICAgICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnCisKK3RlaS1jbGFzcyAgICAgICAgIEFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mCisgICAgICAgICAgICAgICAgICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCisKK2JvZHktY29udGVudCAgICAgIFRoZSBib2R5IGNvbnRlbnQgdHlwZQorCitkaXNwbGF5LW5hbWUgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQKKyAgICAgICAgICAgICAgICAgIGJ5IHRvb2xzCisKK3NtYWxsLWljb24gICAgICAgIE9wdGlvbmFsIHNtYWxsLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scworCitsYXJnZS1pY29uICAgICAgICBPcHRpb25hbCBsYXJnZS1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKKworZGVzY3JpcHRpb24gICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCisKK3ZhcmlhYmxlICAgICAgICAgIE9wdGlvbmFsIHNjcmlwdGluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbgorCithdHRyaWJ1dGUgICAgICAgICBBbGwgYXR0cmlidXRlcyBvZiB0aGlzIGFjdGlvbgorCitleGFtcGxlICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbiBleGFtcGxlIG9mIGEKKyAgICAgICAgICAgICAgICAgIHVzZSBvZiB0aGlzIHRhZworCistLT4KKworPCFFTEVNRU5UIHRhZyAobmFtZSwgdGFnLWNsYXNzLCB0ZWktY2xhc3M/LCBib2R5LWNvbnRlbnQ/LCBkaXNwbGF5LW5hbWU/LAorICAgICAgICAgICAgICAgc21hbGwtaWNvbj8sIGxhcmdlLWljb24/LCBkZXNjcmlwdGlvbj8sIHZhcmlhYmxlKiwgYXR0cmlidXRlKiwKKyAgICAgICAgICAgICAgIGV4YW1wbGU/KSA+CisKKzwhLS0KK0RlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcmx2ZXQuanNwLnRhZ2V4dC5UYWcgdGhhdCBpbXBsZW1lbnRzCit0aGUgcmVxdWVzdCB0aW1lIHNlbWFudGljcyBmb3IgdGhpcyB0YWcuIChyZXF1aXJlZCkKKworI1BDREFUQSA6Oj0gZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQorLS0+CisKKzwhRUxFTUVOVCB0YWctY2xhc3MgKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbyBmb3IKK3RoaXMgdGFnLiAob3B0aW9uYWwpCisKK0lmIHRoaXMgaXMgbm90IGdpdmVuLCB0aGUgY2xhc3MgaXMgbm90IGNvbnN1bHRlZCBhdCB0cmFuc2xhdGlvbiB0aW1lLgorCisjUENEQVRBIDo6PSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCistLT4KKworPCFFTEVNRU5UIHRlaS1jbGFzcyAoI1BDREFUQSkgPgorCis8IS0tCitQcm92aWRlcyBhIGhpbnQgYXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGJvZHkgb2YgdGhpcyB0YWcuIFByaW1hcmlseQoraW50ZW5kZWQgZm9yIHVzZSBieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzLgorCitUaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIHZhbHVlcyBzcGVjaWZpZWQ6CisKK3RhZ2RlcGVuZGVudAlUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcKKwkJaW1wbGVtZW50YXRpb24gaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkgaW4gYQorCQlkaWZmZXJlbnQgImxhbmdhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMIHN0YXRlbWVudHMuCisKK0pTUAkJVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQIHN5bnRheAorCitlbXB0eQkJVGhlIGJvZHkgbXVzdCBiZSBlbXB0eQorCitUaGUgZGVmYXVsdCAoaWYgbm90IGRlZmluZWQpIGlzIEpTUAorCisjUENEQVRBIDo6PSAgdGFnZGVwZW5kZW50IHwgSlNQIHwgZW1wdHkKKworLS0+CisKKzwhRUxFTUVOVCBib2R5LWNvbnRlbnQgKCNQQ0RBVEEpID4KKworPCEtLQorCitUaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQKK3RvIGJlIGRpc3BsYXllZCBieSB0b29scy4KKy0tPgorCis8IUVMRU1FTlQgZGlzcGxheS1uYW1lICgjUENEQVRBKSA+CisKKworPCEtLQorCitUaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgbGFyZ2UKKygzMiB4IDMyKSBpY29uIGltYWdlLiAgVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZQordGFnIGxpYnJhcnkuICBUaGUgaW1hZ2UgbXVzdCBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdCwgYW5kCit0aGUgZmlsZSBuYW1lIG11c3QgZW5kIHdpdGggdGhlIHN1ZmZpeCAiLmpwZyIgb3IgIi5naWYiIHJlc3BlY3RpdmVseS4KK1RoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgorLS0+CisKKzwhRUxFTUVOVCBsYXJnZS1pY29uICgjUENEQVRBKSA+CisKKzwhLS0KKworVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyBhIGxhcmdlCisoMzIgeCAzMikgaWNvbiBpbWFnZS4gIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUKK3RhZyBsaWJyYXJ5LiAgVGhlIGltYWdlIG11c3QgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQsIGFuZAordGhlIGZpbGUgbmFtZSBtdXN0IGVuZCB3aXRoIHRoZSBzdWZmaXggIi5qcGciIG9yICIuZ2lmIiByZXNwZWN0aXZlbHkuCitUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KKy0tPgorCis8IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSkgPgorCis8IS0tCisKK1RoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZQorb2YgdGhlIHVzZSBvZiBhIHRhZy4KKy0tPgorCis8IUVMRU1FTlQgZXhhbXBsZSAoI1BDREFUQSkgPgorCis8IS0tCisKK1RoZSB2YXJpYWJsZSB0YWcgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZyB2YXJpYWJsZXMKK2RlZmluZWQgYnkgdGhpcyB0YWcuICBJdCBpcyBhICh0cmFuc2xhdGlvbiB0aW1lKSBlcnJvciBmb3IgYSB0YWcKK3RoYXQgaGFzIG9uZSBvciBtb3JlIHZhcmlhYmxlIHN1YmVsZW1lbnRzIHRvIGhhdmUgYSBUYWdFeHRyYUluZm8KK2NsYXNzIHRoYXQgcmV0dXJucyBhIG5vbi1udWxsIG9iamVjdC4KKworVGhlIHN1YmVsZW1lbnRzIG9mIHZhcmlhYmxlIGFyZSBvZiB0aGUgZm9ybToKKworbmFtZS1naXZlbiAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSBuYW1lIGFzIGEgY29uc3RhbnQKKworbmFtZS1mcm9tLWF0dHJpYnV0ZSAgICAgIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lKSB2YWx1ZSB3aWxsIGdpdmUgdGhlIG5hbWUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuICBPbmUgb2YgbmFtZS1naXZlbiBvcgorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUtZnJvbS1hdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCisKK3ZhcmlhYmxlLWNsYXNzICAgICAgICAgICBOYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGUgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBpcyBkZWZhdWx0LgorCitkZWNsYXJlICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUgaXMgdGhlIGRlZmF1bHQuCisKK3Njb3BlICAgICAgICAgICAgICAgICAgICBUaGUgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJhaWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQuICBORVNURUQgaXMgZGVmYXVsdC4KKworZGVzY3JpcHRpb24gICAgICAgICAgICAgIE9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoaXMgdmFyaWFibGUKKworLS0+CisKKzwhRUxFTUVOVCB2YXJpYWJsZSAoIChuYW1lLWdpdmVuIHwgbmFtZS1mcm9tLWF0dHJpYnV0ZSksIHZhcmlhYmxlLWNsYXNzPywKKyAgICAgICAgICAgICAgICAgICAgZGVjbGFyZT8sIHNjb3BlPywgZGVzY3JpcHRpb24/KSA+CisKKzwhLS0KKworVGhlIG5hbWUgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuICBPbmUgb2YgbmFtZS1naXZlbiBvcgorbmFtZS1mcm9tLWF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KKy0tPgorCis8IUVMRU1FTlQgbmFtZS1naXZlbiAoI1BDREFUQSkgPgorCis8IS0tCisKK1RoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24tdGltZSkgdmFsdWUgd2lsbCBnaXZlCit0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuICBPbmUgb2YgbmFtZS1naXZlbiBvciBuYW1lLWZyb20tYXR0cmlidXRlCitpcyByZXF1aXJlZC4KKy0tPgorCis8IUVMRU1FTlQgbmFtZS1mcm9tLWF0dHJpYnV0ZSAoI1BDREFUQSkgPgorCis8IS0tCisKK1RoZSBvcHRpb25hbCBuYW1lIG9mIHRoZSBjbGFzcyBmb3IgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4gIFRoZQorZGVmYXVsdCBpcyBqYXZhLmxhbmcuU3RyaW5nLgorLS0+CisKKzwhRUxFTUVOVCB2YXJpYWJsZS1jbGFzcyAoI1BDREFUQSkgPgorCis8IS0tCisKK1doZXRoZXIgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBpcyB0byBiZSBkZWZpbmVkIG9yIG5vdC4gIFNlZQorVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLiAgVGhpcyBlbGVtZW50IGlzIG9wdGlvbmFsIGFuZCAidHJ1ZSIKK2lzIHRoZSBkZWZhdWx0LgorLS0+CisKKzwhRUxFTUVOVCBkZWNsYXJlICgjUENEQVRBKSA+CisKKzwhLS0KKworVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuICBTZWUgVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLgorVGhlIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kICJORVNURUQiIGlzIHRoZSBkZWZhdWx0LiAgT3RoZXIgbGVnYWwKK3ZhbHVlcyBhcmUgIkFUX0JFR0lOIiBhbmQgIkFUX0VORCIuCistLT4KKworPCFFTEVNRU5UIHNjb3BlICgjUENEQVRBKSA+CisKKzwhLS0KKworVGhlIGF0dHJpYnV0ZSB0YWcgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBuZXN0aW5nIHRhZworCitBbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBpcyBjb21wb3NlZCBvZjoKKwkKKy0gdGhlIGF0dHJpYnV0ZXMgbmFtZSAocmVxdWlyZWQpCistIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwgKG9wdGlvbmFsKQorLSBpZiB0aGUgYXR0cmlidXRlcyB2YWx1ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBhdCBydW50aW1lCisgIGJ5IGEgc2NyaXB0bGV0IGV4cHJlc3Npb24gKG9wdGlvbmFsKQorLSB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZSAob3B0aW9uYWwpCistIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBtZWFuaW5nIG9mIHRoZSBhdHRyaWJ1dGUgKG9wdGlvbmFsKQorCistLT4KKworCis8IS0tCitUaGUgYXR0cmlidXRlIHRhZyBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcgdGFnCisKK0FuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGlzIGNvbXBvc2VkIG9mOgorCistIHRoZSBhdHRyaWJ1dGVzIG5hbWUgKHJlcXVpcmVkKQorCistIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwgKG9wdGlvbmFsKQorCistIGlmIHRoZSBhdHRyaWJ1dGVzIHZhbHVlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkIGF0IHJ1bnRpbWUKKyAgYnkgYSBzY3JpcHRsZXQgZXhwcmVzc2lvbiAob3B0aW9uYWwpCisKKy0gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUgKG9wdGlvbmFsKQorCistIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBtZWFuaW5nIG9mIHRoZSBhdHRyaWJ1dGUgKG9wdGlvbmFsKQorLS0+CisKKzwhRUxFTUVOVCBhdHRyaWJ1dGUgKG5hbWUsIHJlcXVpcmVkPyAsIHJ0ZXhwcnZhbHVlPywgdHlwZT8sIGRlc2NyaXB0aW9uPykgPgorCis8IS0tCitEZWZpbmVzIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIHRhZyBvciBhdHRyaWJ1dGUgYmVpbmcgZGVmaW5lZAorCisjUENEQVRBIDo6PSBOTVRPS0VOCistLT4KKworPCFFTEVNRU5UIG5hbWUJKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwuCisKKyNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCisKK0lmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKK2lzIG9wdGlvbmFsLgorLS0+CisKKzwhRUxFTUVOVCByZXF1aXJlZCAgICAoI1BDREFUQSkgPgorCis8IS0tCitEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBjYW4gaGF2ZSBzY3JpcHRsZXQgZXhwcmVzc2lvbnMgYXMKK2EgdmFsdWUsIGkuZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZAorYXQgcmVxdWVzdCB0aW1lLCBhcyBvcHBvc2VkIHRvIGEgc3RhdGljIHZhbHVlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb24KK3RpbWUuCisKKyNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCisKK0lmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKK2hhcyBhIHN0YXRpYyB2YWx1ZQorLS0+CisKKzwhRUxFTUVOVCBydGV4cHJ2YWx1ZSAoI1BDREFUQSkgPgorCisKKzwhLS0KKworRGVmaW5lcyB0aGUgSmF2YSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzIHZhbHVlLiAgRm9yIHN0YXRpYyB2YWx1ZXMKKyh0aG9zZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9uIHRpbWUpIHRoZSB0eXBlIGlzIGFsd2F5cworamF2YS5sYW5nLlN0cmluZy4KKy0tPgorCis8IUVMRU1FTlQgdHlwZSAoI1BDREFUQSkgPgorCisKKzwhLS0gSUQgYXR0cmlidXRlcyAtLT4KKworPCFBVFRMSVNUIHRsaWItdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBqc3AtdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzaG9ydC1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHVyaSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBleGFtcGxlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHRhZyBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB0YWctY2xhc3MgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdGVpLWNsYXNzIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGJvZHktY29udGVudCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBhdHRyaWJ1dGUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByZXF1aXJlZCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBydGV4cHJ2YWx1ZSBpZCBJRCAjSU1QTElFRD4KKworCis8IUFUVExJU1QgcGFyYW0tbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBwYXJhbS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsaXN0ZW5lciBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsaXN0ZW5lci1jbGFzcyBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZCBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTliMzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2R0ZC93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkCkBAIC0wLDAgKzEsMTAyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHhzZDpzY2hlbWEKKyAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorICAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKKyAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgorICAgICB2ZXJzaW9uPSIyLjAiPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAlVyUgJUclCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICBDb3B5cmlnaHQgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KKyAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKKyAgICAgIHJlc2VydmVkLgorCisgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCisgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgorICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCisgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cworICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQorICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKKyAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KKworICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQorICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAorICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50CisgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgorICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgorCisgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKKyAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCisKKyAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAorICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQorICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgorICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCisKKyAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycworICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgorCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPCFbQ0RBVEFbCisKKwlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgSlNQIFRhZ2xpYnJhcnkKKwlkZXNjcmlwdG9yLiAgQWxsIFRhZ2xpYnJhcnkgZGVzY3JpcHRvcnMgbXVzdAorCWluZGljYXRlIHRoZSB0YWcgbGlicmFyeSBzY2hlbWEgYnkgdXNpbmcgdGhlIFRhZ2xpYnJhcnkKKwluYW1lc3BhY2U6CisKKwlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCisKKwlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5CisJdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKKworCSAgICA8dGFnbGliIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisJICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSIuLi4iCisJICAgICAgdmVyc2lvbj0iMi4wIj4KKwkgICAgICAuLi4KKwkgICAgPC90YWdsaWI+CisKKwlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkCisJdmVyc2lvbiBvZiB0aGUgc2NoZW1hIHVzaW5nIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUKKwlmb3IgSjJFRSBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgorCisJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkCisKKwldXT4KKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+CisKKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisKKyAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYiIgdHlwZT0iajJlZTp0bGRUYWdsaWJUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgdGFnbGliIHRhZyBpcyB0aGUgZG9jdW1lbnQgcm9vdC4KKwlUaGUgZGVmaW5pdGlvbiBvZiB0YWdsaWIgaXMgcHJvdmlkZWQKKwlieSB0aGUgdGxkVGFnbGliVHlwZS4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6dW5pcXVlIG5hbWU9InRhZy1uYW1lLXVuaXF1ZW5lc3MiPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgVGhlIHRhZ2xpYiBlbGVtZW50IGNvbnRhaW5zLCBhbW9uZyBvdGhlciB0aGluZ3MsIHRhZyBhbmQKKwkgIHRhZy1maWxlIGVsZW1lbnRzLgorCSAgVGhlIG5hbWUgc3ViZWxlbWVudHMgb2YgdGhlc2UgZWxlbWVudHMgbXVzdCBlYWNoIGJlIHVuaXF1ZS4KKworCTwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTp0YWd8ajJlZTp0YWctZmlsZSIvPgorICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpuYW1lIi8+CisgICAgPC94c2Q6dW5pcXVlPgorCisgICAgPHhzZDp1bmlxdWUgbmFtZT0iZnVuY3Rpb24tbmFtZS11bmlxdWVuZXNzIj4KKyAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKwk8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgIFRoZSB0YWdsaWIgZWxlbWVudCBjb250YWlucyBmdW5jdGlvbiBlbGVtZW50cy4KKwkgIFRoZSBuYW1lIHN1YmVsZW1lbnRzIG9mIHRoZXNlIGVsZW1lbnRzIG11c3QgZWFjaCBiZSB1bmlxdWUuCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZnVuY3Rpb24iLz4KKyAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bmFtZSIvPgorICAgIDwveHNkOnVuaXF1ZT4KKworICA8L3hzZDplbGVtZW50PgorCisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJvZHktY29udGVudFR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgYm9keSB0aGF0IGlzIHZhbGlkIGZvciBhIHRhZy4KKwlUaGlzIHZhbHVlIGlzIHVzZWQgYnkgdGhlIEpTUCBjb250YWluZXIgdG8gdmFsaWRhdGUKKwl0aGF0IGEgdGFnIGludm9jYXRpb24gaGFzIHRoZSBjb3JyZWN0IGJvZHkgc3ludGF4IGFuZAorCWJ5IHBhZ2UgY29tcG9zaXRpb24gdG9vbHMgdG8gYXNzaXN0IHRoZSBwYWdlIGF1dGhvcgorCWluIHByb3ZpZGluZyBhIHZhbGlkIHRhZyBib2R5LgorCisJVGhlcmUgYXJlIGN1cnJlbnRseSBmb3VyIHZhbHVlcyBzcGVjaWZpZWQ6CisKKwl0YWdkZXBlbmRlbnQgICAgVGhlIGJvZHkgb2YgdGhlIHRhZyBpcyBpbnRlcnByZXRlZCBieSB0aGUgdGFnCisJCQlpbXBsZW1lbnRhdGlvbiBpdHNlbGYsIGFuZCBpcyBtb3N0IGxpa2VseQorCQkJaW4gYSBkaWZmZXJlbnQgImxhbmd1YWdlIiwgZS5nIGVtYmVkZGVkIFNRTAorCQkJc3RhdGVtZW50cy4KKworCUpTUCAgICAgICAgICAgICBUaGUgYm9keSBvZiB0aGUgdGFnIGNvbnRhaW5zIG5lc3RlZCBKU1AKKwkJCXN5bnRheC4KKworCWVtcHR5ICAgICAgICAgICBUaGUgYm9keSBtdXN0IGJlIGVtcHR5CisKKwlzY3JpcHRsZXNzICAgICAgVGhlIGJvZHkgYWNjZXB0cyBvbmx5IHRlbXBsYXRlIHRleHQsIEVMCisJCQlFeHByZXNzaW9ucywgYW5kIEpTUCBhY3Rpb24gZWxlbWVudHMuICBObworCQkJc2NyaXB0aW5nIGVsZW1lbnRzIGFyZSBhbGxvd2VkLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0YWdkZXBlbmRlbnQiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKU1AiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlbXB0eSIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNjcmlwdGxlc3MiLz4KKyAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJleHRlbnNpYmxlVHlwZSIgYWJzdHJhY3Q9InRydWUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBleHRlbnNpYmxlVHlwZSBpcyBhbiBhYnN0cmFjdCBiYXNlIHR5cGUgdGhhdCBpcyB1c2VkIHRvCisJZGVmaW5lIHRoZSB0eXBlIG9mIGV4dGVuc2lvbi1lbGVtZW50cy4gSW5zdGFuY2UgZG9jdW1lbnRzCisJbXVzdCBzdWJzdGl0dXRlIGEga25vd24gdHlwZSB0byBkZWZpbmUgdGhlIGV4dGVuc2lvbiBieQorCXVzaW5nIHhzaTp0eXBlIGF0dHJpYnV0ZSB0byBkZWZpbmUgdGhlIGFjdHVhbCB0eXBlIG9mCisJZXh0ZW5zaW9uLWVsZW1lbnRzLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZnVuY3Rpb25UeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgZnVuY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gZWFjaAorCWZ1bmN0aW9uIGluIHRoZSB0YWcgbGlicmFyeSB0aGF0IGlzIHRvIGJlIGV4cG9zZWQgdG8gdGhlIEVMLgorCisJVGhlIGZ1bmN0aW9uIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKKworCWRlc2NyaXB0aW9uICAgICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCisKKwlkaXNwbGF5LW5hbWUgICAgICAgIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCisJCQkgICAgZGlzcGxheWVkIGJ5IHRvb2xzCisKKwlpY29uICAgICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkCisJCQkgICAgYnkgdG9vbHMKKworCW5hbWUgICAgICAgICAgICAgICAgQSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbgorCisJZnVuY3Rpb24tY2xhc3MgICAgICBQcm92aWRlcyB0aGUgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0CisJCQkgICAgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb24KKworCWZ1bmN0aW9uLXNpZ25hdHVyZSAgUHJvdmlkZXMgdGhlIHNpZ25hdHVyZSwgYXMgaW4gdGhlIEphdmEKKwkJCSAgICBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBvZiB0aGUgSmF2YQorCQkJICAgIG1ldGhvZCB0aGF0IGlzIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50CisJCQkgICAgdGhlIGZ1bmN0aW9uLgorCisJZXhhbXBsZSAgICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbgorCQkJICAgIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyBmdW5jdGlvbgorCisJZnVuY3Rpb24tZXh0ZW5zaW9uICBaZXJvIG9yIG1vcmUgZXh0ZW5zaW9ucyB0aGF0IHByb3ZpZGUgZXh0cmEKKwkJCSAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGZ1bmN0aW9uLCBmb3IgdG9vbAorCQkJICAgIGNvbnN1bXB0aW9uCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKKwkJICAgdHlwZT0iajJlZTp0bGQtY2Fub25pY2FsLW5hbWVUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgQSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbi4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1jbGFzcyIKKwkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgUHJvdmlkZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBKYXZhCisJICAgIGNsYXNzIGNvbnRhaW5pbmcgdGhlIHN0YXRpYyBtZXRob2QgdGhhdCBpbXBsZW1lbnRzCisJICAgIHRoZSBmdW5jdGlvbi4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorCisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLXNpZ25hdHVyZSIKKwkJICAgdHlwZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBQcm92aWRlcyB0aGUgc2lnbmF0dXJlLCBvZiB0aGUgc3RhdGljIEphdmEgbWV0aG9kIHRoYXQgaXMKKwkgICAgdG8gYmUgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9uLiAgVGhlIHN5bnRheCBvZiB0aGUKKwkgICAgZnVuY3Rpb24tc2lnbmF0dXJlIGVsZW1lbnQgaXMgYXMgZm9sbG93czoKKworCQlGdW5jdGlvblNpZ25hdHVyZSA6Oj0gUmV0dXJuVHlwZSBTIE1ldGhvZE5hbWUgUz8KKwkJCQkgICAgICAnKCcgUz8gUGFyYW1ldGVycz8gUz8gJyknCisKKyAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICAgICA6Oj0gVHlwZQorCisJCU1ldGhvZE5hbWUgICAgICAgIDo6PSBJZGVudGlmaWVyCisKKwkJUGFyYW1ldGVycyAgICAgICAgOjo9ICAgUGFyYW1ldGVyCisJCQkJICAgICAgfCAoIFBhcmFtZXRlciBTPyAnLCcgUz8gUGFyYW1ldGVycyApCisKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgICAgICAgICA6Oj0gVHlwZQorCisJCVdoZXJlOgorCisgCQkgICAgKiBUeXBlIGlzIGEgYmFzaWMgdHlwZSBvciBhIGZ1bGx5IHF1YWxpZmllZAorCQkgICAgICBKYXZhIGNsYXNzIG5hbWUgKGluY2x1ZGluZyBwYWNrYWdlIG5hbWUpLAorCQkgICAgICBhcyBwZXIgdGhlICdUeXBlJyBwcm9kdWN0aW9uIGluIHRoZSBKYXZhCisJCSAgICAgIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIFNlY29uZCBFZGl0aW9uLAorCQkgICAgICBDaGFwdGVyIDE4LgorCisgICAgICAgICAgICAgICAgICAgICogSWRlbnRpZmllciBpcyBhIEphdmEgaWRlbnRpZmllciwgYXMgcGVyCisJCSAgICAgIHRoZSAnSWRlbnRpZmllcicgcHJvZHVjdGlvbiBpbiB0aGUgSmF2YQorCQkgICAgICBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBTZWNvbmQKKwkJICAgICAgRWRpdGlvbiwgQ2hhcHRlciAxOC4KKworCSAgICBFeGFtcGxlOgorCisJICAgIGphdmEubGFuZy5TdHJpbmcgbmlja05hbWUoIGphdmEubGFuZy5TdHJpbmcsIGludCApCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKworICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGFtcGxlIgorCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24KKwkgICAgb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24uCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKworICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1leHRlbnNpb24iCisJCSAgIHR5cGU9ImoyZWU6dGxkLWV4dGVuc2lvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBGdW5jdGlvbiBleHRlbnNpb25zIGFyZSBmb3IgdG9vbCB1c2Ugb25seSBhbmQgbXVzdCBub3QgYWZmZWN0CisJICAgIHRoZSBiZWhhdmlvciBvZiBhIGNvbnRhaW5lci4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWdGaWxlVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJRGVmaW5lcyBhbiBhY3Rpb24gaW4gdGhpcyB0YWcgbGlicmFyeSB0aGF0IGlzIGltcGxlbWVudGVkCisJYXMgYSAudGFnIGZpbGUuCisKKwlUaGUgdGFnLWZpbGUgZWxlbWVudCBoYXMgdHdvIHJlcXVpcmVkIHN1YmVsZW1lbnRzOgorCisJZGVzY3JpcHRpb24gICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCisKKwlkaXNwbGF5LW5hbWUgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQorCQkJICBkaXNwbGF5ZWQgYnkgdG9vbHMKKworCWljb24gICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkCisJCQkgIGJ5IHRvb2xzCisKKwluYW1lICAgICAgICAgICAgICBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lCisKKwlwYXRoICAgICAgICAgICAgICBXaGVyZSB0byBmaW5kIHRoZSAudGFnIGZpbGUgaW1wbGVtZW50aW5nIHRoaXMKKwkJCSAgYWN0aW9uLCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViCisJCQkgIGFwcGxpY2F0aW9uIG9yIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSBmb3IgYQorCQkJICB0YWcgbGlicmFyeSBwYWNrYWdlZCBpbiBhIEpBUi4gIFRoaXMgbXVzdAorCQkJICBiZWdpbiB3aXRoIC9XRUItSU5GL3RhZ3MgaWYgdGhlIC50YWcgZmlsZQorCQkJICByZXNpZGVzIGluIHRoZSBXQVIsIG9yIC9NRVRBLUlORi90YWdzIGlmIHRoZQorCQkJICAudGFnIGZpbGUgcmVzaWRlcyBpbiBhIEpBUi4KKworCWV4YW1wbGUgICAgICAgICAgIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuCisJCQkgIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyB0YWcKKworCXRhZy1leHRlbnNpb24gICAgIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQorCQkJICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZywgZm9yIHRvb2wKKwkJCSAgY29uc3VtcHRpb24KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgorCQkgICB0eXBlPSJqMmVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXRoIgorCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhhbXBsZSIKKwkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uCisJICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiBhIHRhZy4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorCisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1leHRlbnNpb24iCisJCSAgIHR5cGU9ImoyZWU6dGxkLWV4dGVuc2lvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUYWcgZXh0ZW5zaW9ucyBhcmUgZm9yIHRvb2wgdXNlIG9ubHkgYW5kIG11c3Qgbm90IGFmZmVjdAorCSAgICB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFnVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHRhZyBkZWZpbmVzIGEgdW5pcXVlIHRhZyBpbiB0aGlzIHRhZyBsaWJyYXJ5LiAgSXQgaGFzIG9uZQorCWF0dHJpYnV0ZSwgaWQuCisKKwlUaGUgdGFnIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKKworCWRlc2NyaXB0aW9uICAgICAgIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgorCisJZGlzcGxheS1uYW1lICAgICAgQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKKwkJCSAgZGlzcGxheWVkIGJ5IHRvb2xzCisKKwlpY29uICAgICAgICAgICAgICBPcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZAorCQkJICBieSB0b29scworCisJbmFtZSAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZQorCisJdGFnLWNsYXNzICAgICAgICAgVGhlIHRhZyBoYW5kbGVyIGNsYXNzIGltcGxlbWVudGluZworCQkJICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuSnNwVGFnCisKKwl0ZWktY2xhc3MgICAgICAgICBBbiBvcHRpb25hbCBzdWJjbGFzcyBvZgorCQkJICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCisKKwlib2R5LWNvbnRlbnQgICAgICBUaGUgYm9keSBjb250ZW50IHR5cGUKKworCXZhcmlhYmxlICAgICAgICAgIE9wdGlvbmFsIHNjcmlwdGluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbgorCisJYXR0cmlidXRlICAgICAgICAgQWxsIGF0dHJpYnV0ZXMgb2YgdGhpcyBhY3Rpb24gdGhhdCBhcmUKKwkJCSAgZXZhbHVhdGVkIHByaW9yIHRvIGludm9jYXRpb24uCisKKwlkeW5hbWljLWF0dHJpYnV0ZXMgV2hldGhlciB0aGlzIHRhZyBzdXBwb3J0cyBhZGRpdGlvbmFsCisJCQkgICBhdHRyaWJ1dGVzIHdpdGggZHluYW1pYyBuYW1lcy4gIElmCisJCQkgICB0cnVlLCB0aGUgdGFnLWNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQorCQkJICAgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkR5bmFtaWNBdHRyaWJ1dGVzCisJCQkgICBpbnRlcmZhY2UuICBEZWZhdWx0cyB0byBmYWxzZS4KKworCWV4YW1wbGUgICAgICAgICAgIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuCisJCQkgIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyB0YWcKKworCXRhZy1leHRlbnNpb24gICAgIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQorCQkJICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZywgZm9yIHRvb2wKKwkJCSAgY29uc3VtcHRpb24KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgorCQkgICB0eXBlPSJqMmVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctY2xhc3MiCisJCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcmx2ZXQuanNwLnRhZ2V4dC5Kc3BUYWcKKwkgICAgdGhhdCBpbXBsZW1lbnRzIHRoZSByZXF1ZXN0IHRpbWUgc2VtYW50aWNzIGZvcgorCSAgICB0aGlzIHRhZy4gKHJlcXVpcmVkKQorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisKKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVpLWNsYXNzIgorCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KKwkgICAgZm9yIHRoaXMgdGFnLiAob3B0aW9uYWwpCisKKwkgICAgSWYgdGhpcyBpcyBub3QgZ2l2ZW4sIHRoZSBjbGFzcyBpcyBub3QgY29uc3VsdGVkIGF0CisJICAgIHRyYW5zbGF0aW9uIHRpbWUuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYm9keS1jb250ZW50IgorCQkgICB0eXBlPSJqMmVlOmJvZHktY29udGVudFR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBTcGVjaWZpZXMgdGhlIGZvcm1hdCBmb3IgdGhlIGJvZHkgb2YgdGhpcyB0YWcuCisJICAgIFRoZSBkZWZhdWx0IGluIEpTUCAxLjIgd2FzICJKU1AiIGJ1dCBiZWNhdXNlIHRoaXMKKwkgICAgaXMgYW4gaW52YWxpZCBzZXR0aW5nIGZvciBzaW1wbGUgdGFnIGhhbmRsZXJzLCB0aGVyZQorCSAgICBpcyBubyBsb25nZXIgYSBkZWZhdWx0IGluIEpTUCAyLjAuICBBIHJlYXNvbmFibGUKKwkgICAgZGVmYXVsdCBmb3Igc2ltcGxlIHRhZyBoYW5kbGVycyBpcyAic2NyaXB0bGVzcyIgaWYKKwkgICAgdGhlIHRhZyBjYW4gaGF2ZSBhIGJvZHkuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUiCisJCSAgIHR5cGU9ImoyZWU6dmFyaWFibGVUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIgorCQkgICB0eXBlPSJqMmVlOnRsZC1hdHRyaWJ1dGVUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZHluYW1pYy1hdHRyaWJ1dGVzIgorCQkgICB0eXBlPSJqMmVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4YW1wbGUiCisJCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbgorCSAgICBvZiBhbiBleGFtcGxlIG9mIHRoZSB1c2Ugb2YgYSB0YWcuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKworICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctZXh0ZW5zaW9uIgorCQkgICB0eXBlPSJqMmVlOnRsZC1leHRlbnNpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGFnIGV4dGVuc2lvbnMgYXJlIGZvciB0b29sIHVzZSBvbmx5IGFuZCBtdXN0IG5vdCBhZmZlY3QKKwkgICAgdGhlIGJlaGF2aW9yIG9mIGEgY29udGFpbmVyLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1hdHRyaWJ1dGVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgYXR0cmlidXRlIGVsZW1lbnQgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBuZXN0aW5nCisJdGFnLiAgVGhlIGF0dHJpYnV0cmUgZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzCisJZGVmaW5pbmc6CisKKwlkZXNjcmlwdGlvbiAgICAgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYXR0cmlidXRlCisKKwluYW1lICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQorCisJcmVxdWlyZWQgICAgICAgIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvcgorCQkJb3B0aW9uYWwKKworCXJ0ZXhwcnZhbHVlICAgICB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgYSBydW50aW1lIGF0dHJpYnV0ZQorCisJdHlwZSAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzCisKKwlmcmFnbWVudCAgICAgICAgd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyBhIGZyYWdtZW50CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCisJCSAgIHR5cGU9ImoyZWU6amF2YS1pZGVudGlmaWVyVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVkIgorCQkgICB0eXBlPSJqMmVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yCisJICAgIG9wdGlvbmFsLgorCisJICAgIElmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lCisJICAgIHRoZSBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6Y2hvaWNlPgorCTx4c2Q6c2VxdWVuY2U+CisJICA8eHNkOmVsZW1lbnQgbmFtZT0icnRleHBydmFsdWUiCisJCSAgICAgICB0eXBlPSJqMmVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCisJCSAgICAgICBtaW5PY2N1cnM9IjAiPgorCSAgICA8eHNkOmFubm90YXRpb24+CisJICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJCURlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGNhbiBoYXZlIHNjcmlwdGxldAorCQlleHByZXNzaW9ucyBhcyBhIHZhbHVlLCBpLmUgdGhlIHZhbHVlIG9mIHRoZQorCQlhdHRyaWJ1dGUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgYXQgcmVxdWVzdAorCQl0aW1lLCBhcyBvcHBvc2VkIHRvIGEgc3RhdGljIHZhbHVlIGRldGVybWluZWQgYXQKKwkJdHJhbnNsYXRpb24gdGltZS4KKworCQlJZiBub3QgcHJlc2VudCB0aGVuIHRoZSBkZWZhdWx0IGlzICJmYWxzZSIsIGkuZSB0aGUKKwkJYXR0cmlidXRlIGhhcyBhIHN0YXRpYyB2YWx1ZQorCisJICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworCSAgPC94c2Q6ZWxlbWVudD4KKwkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlIgorCQkgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgorCQkgICAgICAgbWluT2NjdXJzPSIwIj4KKwkgICAgPHhzZDphbm5vdGF0aW9uPgorCSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCQlEZWZpbmVzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUuICBGb3IKKwkJc3RhdGljIHZhbHVlcyAodGhvc2UgZGV0ZXJtaW5lZCBhdCB0cmFuc2xhdGlvbiB0aW1lKQorCQl0aGUgdHlwZSBpcyBhbHdheXMgamF2YS5sYW5nLlN0cmluZy4KKworCSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJICAgIDwveHNkOmFubm90YXRpb24+CisJICA8L3hzZDplbGVtZW50PgorCTwveHNkOnNlcXVlbmNlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJmcmFnbWVudCIKKwkJICAgICB0eXBlPSJqMmVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCisJCSAgICAgbWluT2NjdXJzPSIwIj4KKwkgIDx4c2Q6YW5ub3RhdGlvbj4KKwkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgICAgInRydWUiIGlmIHRoaXMgYXR0cmlidXRlIGlzIG9mIHR5cGUKKwkgICAgICBqYXZheC5qc3AudGFnZXh0LkpzcEZyYWdtZW50LCByZXByZXNlbnRpbmcgZHluYW1pYworCSAgICAgIGNvbnRlbnQgdGhhdCBjYW4gYmUgcmUtZXZhbHVhdGVkIGFzIG1hbnkgdGltZXMKKwkgICAgICBhcyBuZWVkZWQgYnkgdGhlIHRhZyBoYW5kbGVyLiAgSWYgb21pdHRlZCBvciAiZmFsc2UiLAorCSAgICAgIHRoZSBkZWZhdWx0IGlzIHN0aWxsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisKKwkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgIDwveHNkOmFubm90YXRpb24+CisJPC94c2Q6ZWxlbWVudD4KKyAgICAgIDwveHNkOmNob2ljZT4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGQtY2Fub25pY2FsLW5hbWVUeXBlIj4KKworICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCURlZmluZXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgdGFnIG9yIGF0dHJpYnV0ZSBiZWluZworCWRlZmluZWQuCisKKwlUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTp4c2ROTVRPS0VOVHlwZSIvPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGQtZXh0ZW5zaW9uVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHRsZC1leHRlbnNpb25UeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUKKwlleHRlbnNpb25zIHRvIGEgc3BlY2lmaWMgVExEIGVsZW1lbnQuCisKKwlJdCBpcyB1c2VkIGJ5IGVsZW1lbnRzIHRvIGRlc2lnbmF0ZSBhbiBleHRlbnNpb24gYmxvY2sKKwl0aGF0IGlzIHRhcmdldGVkIHRvIGEgc3BlY2lmaWMgZXh0ZW5zaW9uIGRlc2lnbmF0ZWQgYnkKKwlhIHNldCBvZiBleHRlbnNpb24gZWxlbWVudHMgdGhhdCBhcmUgZGVjbGFyZWQgYnkgYQorCW5hbWVzcGFjZS4gVGhlIG5hbWVzcGFjZSBpZGVudGlmaWVzIHRoZSBleHRlbnNpb24gdG8KKwl0aGUgdG9vbCB0aGF0IHByb2Nlc3NlcyB0aGUgZXh0ZW5zaW9uLgorCisJVGhlIHR5cGUgb2YgdGhlIGV4dGVuc2lvbi1lbGVtZW50IGlzIGFic3RyYWN0LiBUaGVyZWZvcmUsCisJYSBjb25jcmV0ZSB0eXBlIG11c3QgYmUgc3BlY2lmaWVkIGJ5IHRoZSBUTEQgdXNpbmcKKwl4c2k6dHlwZSBhdHRyaWJ1dGUgZm9yIGVhY2ggZXh0ZW5zaW9uLWVsZW1lbnQuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uLWVsZW1lbnQiCisJCSAgIHR5cGU9ImoyZWU6ZXh0ZW5zaWJsZVR5cGUiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisKKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiCisJCSAgIHVzZT0icmVxdWlyZWQiCisJCSAgIHR5cGU9InhzZDphbnlVUkkiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisKKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZFRhZ2xpYlR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LCBpdCBkZWZpbmVzOgorCisJZGVzY3JpcHRpb24gICAgIGEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAidXNlIiBvZiB0aGlzCisJCQl0YWdsaWIsIHNob3VsZCBiZSB1c2VyIGRpc2Nlcm5hYmxlCisKKwlkaXNwbGF5LW5hbWUgICAgdGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEKKwkJCXNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQKKwkJCWJ5IHRvb2xzCisKKwlpY29uICAgICAgICAgICAgb3B0aW9uYWwgaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCisKKwl0bGliLXZlcnNpb24gICAgdGhlIHZlcnNpb24gb2YgdGhlIHRhZyBsaWJyYXJ5IGltcGxlbWVudGF0aW9uCisKKwlzaG9ydC1uYW1lICAgICAgYSBzaW1wbGUgZGVmYXVsdCBzaG9ydCBuYW1lIHRoYXQgY291bGQgYmUKKwkJCXVzZWQgYnkgYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlCisJCQluYW1lcyB3aXRoIGEgbW5lbW9uaWMgdmFsdWU7IGZvciBleGFtcGxlLAorCQkJdGhlIGl0IG1heSBiZSB1c2VkIGFzIHRoZSBwcmVmZXJlZCBwcmVmaXgKKwkJCXZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzCisKKwl1cmkgICAgICAgICAgICAgYSB1cmkgdW5pcXVlbHkgaWRlbnRpZnlpbmcgdGhpcyB0YWdsaWIKKworCXZhbGlkYXRvciAgICAgICBvcHRpb25hbCBUYWdMaWJyYXJ5VmFsaWRhdG9yIGluZm9ybWF0aW9uCisKKwlsaXN0ZW5lciAgICAgICAgb3B0aW9uYWwgZXZlbnQgbGlzdGVuZXIgc3BlY2lmaWNhdGlvbgorCisJdGFnICAgICAgICAgICAgIHRhZ3MgaW4gdGhpcyB0YWcgbGlicmFyeQorCisJdGFnLWZpbGUgICAgICAgIHRhZyBmaWxlcyBpbiB0aGlzIHRhZyBsaWJyYXJ5CisKKwlmdW5jdGlvbiAgICAgICAgemVybyBvciBtb3JlIEVMIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMKKwkJCXRhZyBsaWJyYXJ5CisKKwl0YWdsaWItZXh0ZW5zaW9uIHplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQorCQkJaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YWdsaWIsIGZvciB0b29sCisJCQljb25zdW1wdGlvbgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0bGliLXZlcnNpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBEZXNjcmliZXMgdGhpcyB2ZXJzaW9uIChudW1iZXIpIG9mIHRoZSB0YWdsaWJyYXJ5LgorCSAgICBJdCBpcyBkZXNjcmliZWQgYXMgYSBkZXdleSBkZWNpbWFsLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisKKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzaG9ydC1uYW1lIgorCQkgICB0eXBlPSJqMmVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBEZWZpbmVzIGEgc2ltcGxlIGRlZmF1bHQgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkKKwkgICAgYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYQorCSAgICBtbmVtb25pY3ZhbHVlOyBmb3IgZXhhbXBsZSwgaXQgbWF5IGJlIHVzZWQgYXMgdGhlCisJICAgIHByZWZlcnJlZCBwcmVmaXggdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMuICBEbworCSAgICBub3QgdXNlIHdoaXRlIHNwYWNlLCBhbmQgZG8gbm90IHN0YXJ0IHdpdGggZGlnaXRzCisJICAgIG9yIHVuZGVyc2NvcmUuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKworICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmkiCisJCSAgIHR5cGU9ImoyZWU6eHNkQW55VVJJVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgRGVmaW5lcyBhIHB1YmxpYyBVUkkgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMKKwkgICAgdmVyc2lvbiBvZiB0aGUgdGFnbGlicmFyeS4gIExlYXZlIGl0IGVtcHR5IGlmIGl0CisJICAgIGRvZXMgbm90IGFwcGx5LgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisKKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yIgorCQkgICB0eXBlPSJqMmVlOnZhbGlkYXRvclR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3RlbmVyIgorCQkgICB0eXBlPSJqMmVlOmxpc3RlbmVyVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZyIKKwkJICAgdHlwZT0iajJlZTp0YWdUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLWZpbGUiCisJCSAgIHR5cGU9ImoyZWU6dGFnRmlsZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbiIKKwkJICAgdHlwZT0iajJlZTpmdW5jdGlvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItZXh0ZW5zaW9uIgorCQkgICB0eXBlPSJqMmVlOnRsZC1leHRlbnNpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGFnbGliIGV4dGVuc2lvbnMgYXJlIGZvciB0b29sIHVzZSBvbmx5IGFuZCBtdXN0IG5vdCBhZmZlY3QKKwkgICAgdGhlIGJlaGF2aW9yIG9mIGEgY29udGFpbmVyLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCisJCSAgIGZpeGVkPSIyLjAiCisJCSAgIHVzZT0icmVxdWlyZWQiPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgRGVzY3JpYmVzIHRoZSBKU1AgdmVyc2lvbiAobnVtYmVyKSB0aGlzIHRhZ2xpYnJhcnkKKwkgIHJlcXVpcmVzIGluIG9yZGVyIHRvIGZ1bmN0aW9uIChkZXdleSBkZWNpbWFsKQorCisJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8L3hzZDphdHRyaWJ1dGU+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsaWRhdG9yVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJQSB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZQorCXRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkgaXMKKwlkZWZpbmVkIGJ5IGEgdmFsaWRhdG9yVHlwZS4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKKwkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItY2xhc3MiCisJCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgdGhlIFRhZ0xpYnJhcnlWYWxpZGF0b3IgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZAorCSAgICB0byB2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzCisJICAgIHRhZyBsaWJyYXJ5LgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCisJCSAgIHR5cGU9ImoyZWU6cGFyYW0tdmFsdWVUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcyBhbgorCSAgICBpbml0aWFsaXphdGlvbiBwYXJhbS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorCisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtc2NvcGVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGlzIHR5cGUgZGVmaW5lcyBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlLiAgU2VlCisJVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLiAgVGhlIGFsbG93ZWQgdmFsdWVzIGFyZSwKKwkiTkVTVEVEIiwgIkFUX0JFR0lOIiBhbmQgIkFUX0VORCIuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5FU1RFRCIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUX0JFR0lOIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRfRU5EIi8+CisgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgdmFyaWFibGVUeXBlIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBzY3JpcHRpbmcKKwl2YXJpYWJsZXMgZGVmaW5lZCBieSB1c2luZyB0aGlzIHRhZy4gIEl0IGlzIGEgKHRyYW5zbGF0aW9uCisJdGltZSkgZXJyb3IgZm9yIGEgdGFnIHRoYXQgaGFzIG9uZSBvciBtb3JlIHZhcmlhYmxlCisJc3ViZWxlbWVudHMgdG8gaGF2ZSBhIFRhZ0V4dHJhSW5mbyBjbGFzcyB0aGF0IHJldHVybnMgYQorCW5vbi1udWxsIHZhbHVlIGZyb20gYSBjYWxsIHRvIGdldFZhcmlhYmxlSW5mbygpLgorCisJVGhlIHN1YmVsZW1lbnRzIG9mIHZhcmlhYmxlVHlwZSBhcmUgb2YgdGhlIGZvcm06CisKKwlkZXNjcmlwdGlvbiAgICAgICAgICAgICAgT3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhpcworCQkJCSB2YXJpYWJsZQorCisJbmFtZS1naXZlbiAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSBuYW1lIGFzIGEgY29uc3RhbnQKKworCW5hbWUtZnJvbS1hdHRyaWJ1dGUgICAgICBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UKKwkJCQkgKHRyYW5zbGF0aW9uIHRpbWUpIHZhbHVlIHdpbGwKKwkJCQkgZ2l2ZSB0aGUgbmFtZSBvZiB0aGUKKwkJCQkgdmFyaWFibGUuICBPbmUgb2YgbmFtZS1naXZlbiBvcgorCQkJCSBuYW1lLWZyb20tYXR0cmlidXRlIGlzIHJlcXVpcmVkLgorCisJdmFyaWFibGUtY2xhc3MgICAgICAgICAgIE5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZSB2YXJpYWJsZS4KKwkJCQkgamF2YS5sYW5nLlN0cmluZyBpcyBkZWZhdWx0LgorCisJZGVjbGFyZSAgICAgICAgICAgICAgICAgIFdoZXRoZXIgdGhlIHZhcmlhYmxlIGlzIGRlY2xhcmVkCisJCQkJIG9yIG5vdC4gIFRydWUgaXMgdGhlIGRlZmF1bHQuCisKKwlzY29wZSAgICAgICAgICAgICAgICAgICAgVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyYWlibGUKKwkJCQkgZGVmaW5lZC4gIE5FU1RFRCBpcyBkZWZhdWx0LgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDpjaG9pY2U+CisJPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZ2l2ZW4iCisJCSAgICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KKwkgIDx4c2Q6YW5ub3RhdGlvbj4KKwkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgICAgVGhlIG5hbWUgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuCisKKwkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgIDwveHNkOmFubm90YXRpb24+CisJPC94c2Q6ZWxlbWVudD4KKworCTx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWZyb20tYXR0cmlidXRlIgorCQkgICAgIHR5cGU9ImoyZWU6amF2YS1pZGVudGlmaWVyVHlwZSI+CisJICA8eHNkOmFubm90YXRpb24+CisJICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICAgIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZQorCSAgICAgICh0cmFuc2xhdGlvbi10aW1lKSB2YWx1ZSB3aWxsIGdpdmUgdGhlIG5hbWUgb2YKKwkgICAgICB0aGUgdmFyaWFibGUuCisKKwkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgIDwveHNkOmFubm90YXRpb24+CisJPC94c2Q6ZWxlbWVudD4KKyAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZS1jbGFzcyIKKwkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgb3B0aW9uYWwgbmFtZSBvZiB0aGUgY2xhc3MgZm9yIHRoZSBzY3JpcHRpbmcKKwkgICAgdmFyaWFibGUuICBUaGUgZGVmYXVsdCBpcyBqYXZhLmxhbmcuU3RyaW5nLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisKKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWNsYXJlIgorCQkgICB0eXBlPSJqMmVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisKKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgV2hldGhlciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIHRvIGJlIGRlZmluZWQKKwkgICAgb3Igbm90LiAgU2VlIFRhZ0V4dHJhSW5mbyBmb3IgZGV0YWlscy4gIFRoaXMKKwkgICAgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgInRydWUiIGlzIHRoZSBkZWZhdWx0LgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjb3BlIgorCQkgICB0eXBlPSJqMmVlOnZhcmlhYmxlLXNjb3BlVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kICJORVNURUQiIGlzIHRoZSBkZWZhdWx0LgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwveHNkOnNjaGVtYT4KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0Vycm9yRGF0YS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0Vycm9yRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjQxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvRXJyb3JEYXRhLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovIAorcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcDsKKworLyoqCisgKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhbiBlcnJvciwgZm9yIGVycm9yIHBhZ2VzLgorICogVGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGlzIGluc3RhbmNlIGlzIG1lYW5pbmdsZXNzIGlmIG5vdCB1c2VkCisgKiBpbiB0aGUgY29udGV4dCBvZiBhbiBlcnJvciBwYWdlLiAgVG8gaW5kaWNhdGUgYSBKU1AgaXMgYW4gZXJyb3IgcGFnZSwKKyAqIHRoZSBwYWdlIGF1dGhvciBtdXN0IHNldCB0aGUgaXNFcnJvclBhZ2UgYXR0cmlidXRlIG9mIHRoZSBwYWdlIGRpcmVjdGl2ZQorICogdG8gInRydWUiLgorICoKKyAqIEBzZWUgUGFnZUNvbnRleHQjZ2V0RXJyb3JEYXRhCisgKiBAc2luY2UgMi4wCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEVycm9yRGF0YSB7CisKKyAgICBwcml2YXRlIFRocm93YWJsZSB0aHJvd2FibGU7CisgICAgcHJpdmF0ZSBpbnQgc3RhdHVzQ29kZTsKKyAgICBwcml2YXRlIFN0cmluZyB1cmk7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmxldE5hbWU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IEVycm9yRGF0YSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhyb3dhYmxlIFRoZSBUaHJvd2FibGUgdGhhdCBpcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yCisgICAgICogQHBhcmFtIHN0YXR1c0NvZGUgVGhlIHN0YXR1cyBjb2RlIG9mIHRoZSBlcnJvcgorICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlcXVlc3QgVVJJCisgICAgICogQHBhcmFtIHNlcnZsZXROYW1lIFRoZSBuYW1lIG9mIHRoZSBzZXJ2bGV0IGludm9rZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRXJyb3JEYXRhKCBUaHJvd2FibGUgdGhyb3dhYmxlLCBpbnQgc3RhdHVzQ29kZSwgU3RyaW5nIHVyaSwgCisJU3RyaW5nIHNlcnZsZXROYW1lICkKKyAgICB7CisJdGhpcy50aHJvd2FibGUgPSB0aHJvd2FibGU7CisJdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTsKKwl0aGlzLnVyaSA9IHVyaTsKKwl0aGlzLnNlcnZsZXROYW1lID0gc2VydmxldE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgVGhyb3dhYmxlIHRoYXQgY2F1c2VkIHRoZSBlcnJvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIFRocm93YWJsZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldFRocm93YWJsZSgpIHsKKwlyZXR1cm4gdGhpcy50aHJvd2FibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RhdHVzIGNvZGUgb2YgdGhlIGVycm9yLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc3RhdHVzIGNvZGUgb2YgdGhlIGVycm9yCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkgeworCXJldHVybiB0aGlzLnN0YXR1c0NvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmVxdWVzdCBVUkkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSByZXF1ZXN0IFVSSQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFVSSSgpIHsKKwlyZXR1cm4gdGhpcy51cmk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc2VydmxldCBpbnZva2VkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgc2VydmxldCBpbnZva2VkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0TmFtZSgpIHsKKwlyZXR1cm4gdGhpcy5zZXJ2bGV0TmFtZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSHR0cEpzcFBhZ2UuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9IdHRwSnNwUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NWNhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSHR0cEpzcFBhZ2UuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3A7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBUaGUgSHR0cEpzcFBhZ2UgaW50ZXJmYWNlIGRlc2NyaWJlcyB0aGUgaW50ZXJhY3Rpb24gdGhhdCBhIEpTUCBQYWdlCisgKiBJbXBsZW1lbnRhdGlvbiBDbGFzcyBtdXN0IHNhdGlzZnkgd2hlbiB1c2luZyB0aGUgSFRUUCBwcm90b2NvbC4KKyAqCisgKiA8cD4KKyAqIFRoZSBiZWhhdmlvdXIgaXMgaWRlbnRpY2FsIHRvIHRoYXQgb2YgdGhlIEpzcFBhZ2UsIGV4Y2VwdCBmb3IgdGhlIHNpZ25hdHVyZQorICogb2YgdGhlIF9qc3BTZXJ2aWNlIG1ldGhvZCwgd2hpY2ggaXMgbm93IGV4cHJlc3NpYmxlIGluIHRoZSBKYXZhIHR5cGUKKyAqIHN5c3RlbSBhbmQgaW5jbHVkZWQgZXhwbGljaXRseSBpbiB0aGUgaW50ZXJmYWNlLgorICogCisgKiBAc2VlIEpzcFBhZ2UKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIEh0dHBKc3BQYWdlIGV4dGVuZHMgSnNwUGFnZSB7CisKKyAgICAvKiogVGhlIF9qc3BTZXJ2aWNlKCltZXRob2QgY29ycmVzcG9uZHMgdG8gdGhlIGJvZHkgb2YgdGhlIEpTUCBwYWdlLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGRlZmluZWQgYXV0b21hdGljYWxseSBieSB0aGUgSlNQIGNvbnRhaW5lciBhbmQgc2hvdWxkIG5ldmVyCisgICAgICogYmUgZGVmaW5lZCBieSB0aGUgSlNQIHBhZ2UgYXV0aG9yLgorICAgICAqIDxwPgorICAgICAqIElmIGEgc3VwZXJjbGFzcyBpcyBzcGVjaWZpZWQgdXNpbmcgdGhlIGV4dGVuZHMgYXR0cmlidXRlLCB0aGF0CisgICAgICogc3VwZXJjbGFzcyBtYXkgY2hvb3NlIHRvIHBlcmZvcm0gc29tZSBhY3Rpb25zIGluIGl0cyBzZXJ2aWNlKCkgbWV0aG9kCisgICAgICogYmVmb3JlIG9yIGFmdGVyIGNhbGxpbmcgdGhlIF9qc3BTZXJ2aWNlKCkgbWV0aG9kLiAgU2VlIHVzaW5nIHRoZSBleHRlbmRzCisgICAgICogYXR0cmlidXRlIGluIHRoZSBKU1BfRW5naW5lIGNoYXB0ZXIgb2YgdGhlIEpTUCBzcGVjaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUHJvdmlkZXMgY2xpZW50IHJlcXVlc3QgaW5mb3JtYXRpb24gdG8gdGhlIEpTUC4KKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgQXNzaXN0cyB0aGUgSlNQIGluIHNlbmRpbmcgYSByZXNwb25zZSB0byB0aGUgY2xpZW50LgorICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiBUaHJvd24gaWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSAKKyAgICAgKiAgICAgcHJvY2Vzc2luZyBvZiB0aGUgSlNQIGFuZCB0aGF0IHRoZSBjb250YWluZXIgc2hvdWxkIHRha2UgCisgICAgICogICAgIGFwcHJvcHJpYXRlIGFjdGlvbiB0byBjbGVhbiB1cCB0aGUgcmVxdWVzdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93biBpZiBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIHRoZQorICAgICAqICAgICByZXNwb25zZSBmb3IgdGhpcyBwYWdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIF9qc3BTZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0pzcENvbnRleHQuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9Kc3BDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2NTBkZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9Kc3BDb250ZXh0LmphdmEKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLyAKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3A7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5lbC5FeHByZXNzaW9uRXZhbHVhdG9yOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLmVsLlZhcmlhYmxlUmVzb2x2ZXI7CisKKy8qKgorICogPHA+CisgKiA8Y29kZT5Kc3BDb250ZXh0PC9jb2RlPiBzZXJ2ZXMgYXMgdGhlIGJhc2UgY2xhc3MgZm9yIHRoZSAKKyAqIFBhZ2VDb250ZXh0IGNsYXNzIGFuZCBhYnN0cmFjdHMgYWxsIGluZm9ybWF0aW9uIHRoYXQgaXMgbm90IHNwZWNpZmljCisgKiB0byBzZXJ2bGV0cy4gIFRoaXMgYWxsb3dzIGZvciBTaW1wbGUgVGFnIEV4dGVuc2lvbnMgdG8gYmUgdXNlZAorICogb3V0c2lkZSBvZiB0aGUgY29udGV4dCBvZiBhIHJlcXVlc3QvcmVzcG9uc2UgU2VydmxldC4KKyAqIDxwPgorICogVGhlIEpzcENvbnRleHQgcHJvdmlkZXMgYSBudW1iZXIgb2YgZmFjaWxpdGllcyB0byB0aGUgCisgKiBwYWdlL2NvbXBvbmVudCBhdXRob3IgYW5kIHBhZ2UgaW1wbGVtZW50b3IsIGluY2x1ZGluZzoKKyAqIDx1bD4KKyAqIDxsaT5hIHNpbmdsZSBBUEkgdG8gbWFuYWdlIHRoZSB2YXJpb3VzIHNjb3BlZCBuYW1lc3BhY2VzCisgKiA8bGk+YSBtZWNoYW5pc20gdG8gb2J0YWluIHRoZSBKc3BXcml0ZXIgZm9yIG91dHB1dAorICogPGxpPmEgbWVjaGFuaXNtIHRvIGV4cG9zZSBwYWdlIGRpcmVjdGl2ZSBhdHRyaWJ1dGVzIHRvIHRoZSAKKyAqICAgICBzY3JpcHRpbmcgZW52aXJvbm1lbnQKKyAqIDwvdWw+CisgKgorICogPHA+PEI+TWV0aG9kcyBJbnRlbmRlZCBmb3IgQ29udGFpbmVyIEdlbmVyYXRlZCBDb2RlPC9CPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgZW5hYmxlIHRoZSA8Qj5tYW5hZ2VtZW50IG9mIG5lc3RlZDwvQj4gSnNwV3JpdGVyIAorICogc3RyZWFtcyB0byBpbXBsZW1lbnQgVGFnIEV4dGVuc2lvbnM6IDxjb2RlPnB1c2hCb2R5KCk8L2NvZGU+IGFuZAorICogPGNvZGU+cG9wQm9keSgpPC9jb2RlPgorICoKKyAqIDxwPjxCPk1ldGhvZHMgSW50ZW5kZWQgZm9yIEpTUCBhdXRob3JzPC9CPgorICogPHA+CisgKiBTb21lIG1ldGhvZHMgcHJvdmlkZSA8Qj51bmlmb3JtIGFjY2VzczwvQj4gdG8gdGhlIGRpdmVyc2Ugb2JqZWN0cworICogcmVwcmVzZW50aW5nIHNjb3Blcy4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IHVzZSB0aGUgdW5kZXJseWluZyBtYWNoaW5lcnkKKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBzY29wZSwgc28gaW5mb3JtYXRpb24gY2FuIGJlIHBhc3NlZCBiYWNrIGFuZAorICogZm9ydGggYmV0d2VlbiB0aGUgdW5kZXJseWluZyBlbnZpcm9ubWVudCAoZS5nLiBTZXJ2bGV0cykgYW5kIEpTUCBwYWdlcy4KKyAqIFRoZSBtZXRob2RzIGFyZToKKyAqIDxjb2RlPnNldEF0dHJpYnV0ZSgpPC9jb2RlPiwgIDxjb2RlPmdldEF0dHJpYnV0ZSgpPC9jb2RlPiwKKyAqIDxjb2RlPmZpbmRBdHRyaWJ1dGUoKTwvY29kZT4sICA8Y29kZT5yZW1vdmVBdHRyaWJ1dGUoKTwvY29kZT4sCisgKiA8Y29kZT5nZXRBdHRyaWJ1dGVzU2NvcGUoKTwvY29kZT4gYW5kIAorICogPGNvZGU+Z2V0QXR0cmlidXRlTmFtZXNJblNjb3BlKCk8L2NvZGU+LgorICogCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBwcm92aWRlIDxCPmNvbnZlbmllbnQgYWNjZXNzPC9CPiB0byBpbXBsaWNpdCBvYmplY3RzOgorICogPGNvZGU+Z2V0T3V0KCk8L2NvZGU+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgcHJvdmlkZSA8Qj5wcm9ncmFtbWF0aWMgYWNjZXNzPC9iPiB0byB0aGUgCisgKiBFeHByZXNzaW9uIExhbmd1YWdlIGV2YWx1YXRvcjoKKyAqIDxjb2RlPmdldEV4cHJlc3Npb25FdmFsdWF0b3IoKTwvY29kZT4sIDxjb2RlPmdldFZhcmlhYmxlUmVzb2x2ZXIoKTwvY29kZT4KKyAqCisgKiBAc2luY2UgMi4wCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIEpzcENvbnRleHQgeworCisgICAgLyoqCisgICAgICogU29sZSBjb25zdHJ1Y3Rvci4gKEZvciBpbnZvY2F0aW9uIGJ5IHN1YmNsYXNzIGNvbnN0cnVjdG9ycywgCisgICAgICogdHlwaWNhbGx5IGltcGxpY2l0LikKKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwQ29udGV4dCgpIHsKKyAgICB9CisgICAgCisgICAgLyoqIAorICAgICAqIFJlZ2lzdGVyIHRoZSBuYW1lIGFuZCB2YWx1ZSBzcGVjaWZpZWQgd2l0aCBwYWdlIHNjb3BlIHNlbWFudGljcy4KKyAgICAgKiBJZiB0aGUgdmFsdWUgcGFzc2VkIGluIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGlzIGhhcyB0aGUgc2FtZSAKKyAgICAgKiBlZmZlY3QgYXMgY2FsbGluZyAKKyAgICAgKiA8Y29kZT5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUsIFBhZ2VDb250ZXh0LlBBR0VfU0NPUEUgKTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHNldAorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5hbWUsIG9yIG51bGwgaWYgdGhlCisgICAgICogICAgIGF0dHJpYnV0ZSBpcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIHBhZ2Ugc2NvcGUuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBpcyBudWxsCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciB0aGUgbmFtZSBhbmQgdmFsdWUgc3BlY2lmaWVkIHdpdGggYXBwcm9wcmlhdGUgCisgICAgICogc2NvcGUgc2VtYW50aWNzLiAgSWYgdGhlIHZhbHVlIHBhc3NlZCBpbiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgCisgICAgICogdGhpcyBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNhbGxpbmcKKyAgICAgKiA8Y29kZT5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUsIHNjb3BlICk8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gc2V0CisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBvYmplY3QgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5hbWUsIG9yIG51bGwgaWYKKyAgICAgKiAgICAgdGhlIGF0dHJpYnV0ZSBpcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIHNwZWNpZmllZCBzY29wZS4KKyAgICAgKiBAcGFyYW0gc2NvcGUgdGhlIHNjb3BlIHdpdGggd2hpY2ggdG8gYXNzb2NpYXRlIHRoZSBuYW1lL29iamVjdAorICAgICAqIAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgbnVsbAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzY29wZSBpcyBpbnZhbGlkCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHNjb3BlIGlzIAorICAgICAqICAgICBQYWdlQ29udGV4dC5TRVNTSU9OX1NDT1BFIGJ1dCB0aGUgcGFnZSB0aGF0IHdhcyByZXF1ZXN0ZWQKKyAgICAgKiAgICAgZG9lcyBub3QgcGFydGljaXBhdGUgaW4gYSBzZXNzaW9uIG9yIHRoZSBzZXNzaW9uIGhhcyBiZWVuCisgICAgICogICAgIGludmFsaWRhdGVkLgorICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIGludCBzY29wZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lIGluIHRoZSBwYWdlIHNjb3BlIG9yIG51bGwKKyAgICAgKiBpZiBub3QgZm91bmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGdldAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUgaW4gdGhlIHBhZ2Ugc2NvcGUgCisgICAgICogICAgIG9yIG51bGwgaWYgbm90IGZvdW5kLgorICAgICAqIAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgbnVsbAorICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBzY29wZSBvciBudWxsIGlmIG5vdCBmb3VuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gc2V0CisgICAgICogQHBhcmFtIHNjb3BlIHRoZSBzY29wZSB3aXRoIHdoaWNoIHRvIGFzc29jaWF0ZSB0aGUgbmFtZS9vYmplY3QKKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgc2NvcGUgb3IgbnVsbCBpZiBub3QgZm91bmQuCisgICAgICogCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBpcyBudWxsCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNjb3BlIGlzIGludmFsaWQgCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHNjb3BlIGlzIAorICAgICAqICAgICBQYWdlQ29udGV4dC5TRVNTSU9OX1NDT1BFIGJ1dCB0aGUgcGFnZSB0aGF0IHdhcyByZXF1ZXN0ZWQKKyAgICAgKiAgICAgZG9lcyBub3QgcGFydGljaXBhdGUgaW4gYSBzZXNzaW9uIG9yIHRoZSBzZXNzaW9uIGhhcyBiZWVuCisgICAgICogICAgIGludmFsaWRhdGVkLgorICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGludCBzY29wZSk7CisKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyBmb3IgdGhlIG5hbWVkIGF0dHJpYnV0ZSBpbiBwYWdlLCByZXF1ZXN0LCBzZXNzaW9uIChpZiB2YWxpZCksCisgICAgICogYW5kIGFwcGxpY2F0aW9uIHNjb3BlKHMpIGluIG9yZGVyIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIG9yCisgICAgICogbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gc2VhcmNoIGZvcgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgb3IgbnVsbAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgbnVsbAorICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIE9iamVjdCBmaW5kQXR0cmlidXRlKFN0cmluZyBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgb2JqZWN0IHJlZmVyZW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUKKyAgICAgKiBmcm9tIGFsbCBzY29wZXMuICBEb2VzIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gc3VjaCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIHJlbW92ZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIG51bGwKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIG9iamVjdCByZWZlcmVuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQorICAgICAqIGluIHRoZSBnaXZlbiBzY29wZS4gIERvZXMgbm90aGluZyBpZiB0aGVyZSBpcyBubyBzdWNoIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gcmVtb3ZlLgorICAgICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgd2hlcmUgdG8gbG9vay4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2NvcGUgaXMgaW52YWxpZAorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBzY29wZSBpcyAKKyAgICAgKiAgICAgUGFnZUNvbnRleHQuU0VTU0lPTl9TQ09QRSBidXQgdGhlIHBhZ2UgdGhhdCB3YXMgcmVxdWVzdGVkCisgICAgICogICAgIGRvZXMgbm90IHBhcnRpY2lwYXRlIGluIGEgc2Vzc2lvbiBvciB0aGUgc2Vzc2lvbiBoYXMgYmVlbgorICAgICAqICAgICBpbnZhbGlkYXRlZC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIG51bGwKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgaW50IHNjb3BlKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2NvcGUgd2hlcmUgYSBnaXZlbiBhdHRyaWJ1dGUgaXMgZGVmaW5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gcmV0dXJuIHRoZSBzY29wZSBmb3IKKyAgICAgKiBAcmV0dXJuIHRoZSBzY29wZSBvZiB0aGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSBzcGVjaWZpZWQgb3IgMAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgbnVsbAorICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIGludCBnZXRBdHRyaWJ1dGVzU2NvcGUoU3RyaW5nIG5hbWUpOworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlIGFsbCB0aGUgYXR0cmlidXRlcyBpbiBhIGdpdmVuIHNjb3BlLgorICAgICAqCisgICAgICogQHBhcmFtIHNjb3BlIHRoZSBzY29wZSB0byBlbnVtZXJhdGUgYWxsIHRoZSBhdHRyaWJ1dGVzIGZvcgorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgbmFtZXMgKGphdmEubGFuZy5TdHJpbmcpIG9mIGFsbCB0aGUgCisgICAgICogICAgIGF0dHJpYnV0ZXMgdGhlIHNwZWNpZmllZCBzY29wZQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzY29wZSBpcyBpbnZhbGlkCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHNjb3BlIGlzIAorICAgICAqICAgICBQYWdlQ29udGV4dC5TRVNTSU9OX1NDT1BFIGJ1dCB0aGUgcGFnZSB0aGF0IHdhcyByZXF1ZXN0ZWQKKyAgICAgKiAgICAgZG9lcyBub3QgcGFydGljaXBhdGUgaW4gYSBzZXNzaW9uIG9yIHRoZSBzZXNzaW9uIGhhcyBiZWVuCisgICAgICogICAgIGludmFsaWRhdGVkLgorICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzSW5TY29wZShpbnQgc2NvcGUpOworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIG91dCBvYmplY3QgKGEgSnNwV3JpdGVyKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgSnNwV3JpdGVyIHN0cmVhbSBiZWluZyB1c2VkIGZvciBjbGllbnQgcmVzcG9uc2UKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgSnNwV3JpdGVyIGdldE91dCgpOworICAgIAorICAgIC8qKgorICAgICAqIFByb3ZpZGVzIHByb2dyYW1tYXRpYyBhY2Nlc3MgdG8gdGhlIEV4cHJlc3Npb25FdmFsdWF0b3IuCisgICAgICogVGhlIEpTUCBDb250YWluZXIgbXVzdCByZXR1cm4gYSB2YWxpZCBpbnN0YW5jZSBvZiBhbiAKKyAgICAgKiBFeHByZXNzaW9uRXZhbHVhdG9yIHRoYXQgY2FuIHBhcnNlIEVMIGV4cHJlc3Npb25zLgorICAgICAqCisgICAgICogQHJldHVybiBBIHZhbGlkIGluc3RhbmNlIG9mIGFuIEV4cHJlc3Npb25FdmFsdWF0b3IuCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBFeHByZXNzaW9uRXZhbHVhdG9yIGdldEV4cHJlc3Npb25FdmFsdWF0b3IoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIGEgVmFyaWFibGVSZXNvbHZlciB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUKKyAgICAgKiBpbXBsaWNpdCBvYmplY3RzIHNwZWNpZmllZCBpbiB0aGUgSlNQIHNwZWNpZmljYXRpb24gdXNpbmcgdGhpcyBKc3BDb250ZXh0CisgICAgICogYXMgdGhlIGNvbnRleHQgb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBBIHZhbGlkIGluc3RhbmNlIG9mIGEgVmFyaWFibGVSZXNvbHZlci4KKyAgICAgKiBAc2luY2UgMi4wCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFZhcmlhYmxlUmVzb2x2ZXIgZ2V0VmFyaWFibGVSZXNvbHZlcigpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiBhIG5ldyBKc3BXcml0ZXIgb2JqZWN0IHRoYXQgc2VuZHMgb3V0cHV0IHRvIHRoZQorICAgICAqIHByb3ZpZGVkIFdyaXRlci4gIFNhdmVzIHRoZSBjdXJyZW50ICJvdXQiIEpzcFdyaXRlciwKKyAgICAgKiBhbmQgdXBkYXRlcyB0aGUgdmFsdWUgb2YgdGhlICJvdXQiIGF0dHJpYnV0ZSBpbiB0aGUKKyAgICAgKiBwYWdlIHNjb3BlIGF0dHJpYnV0ZSBuYW1lc3BhY2Ugb2YgdGhlIEpzcENvbnRleHQuCisgICAgICogPHA+VGhlIHJldHVybmVkIEpzcFdyaXRlciBtdXN0IGltcGxlbWVudCBhbGwgbWV0aG9kcyBhbmQKKyAgICAgKiBiZWhhdmUgYXMgdGhvdWdoIGl0IHdlcmUgdW5idWZmZXJlZC4gIE1vcmUgc3BlY2lmaWNhbGx5OgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5jbGVhcigpIG11c3QgdGhyb3cgYW4gSU9FeGNlcHRpb248L2xpPgorICAgICAqICAgPGxpPmNsZWFyQnVmZmVyKCkgZG9lcyBub3RoaW5nPC9saT4KKyAgICAgKiAgIDxsaT5nZXRCdWZmZXJTaXplKCkgYWx3YXlzIHJldHVybnMgMDwvbGk+CisgICAgICogICA8bGk+Z2V0UmVtYWluaW5nKCkgYWx3YXlzIHJldHVybnMgMDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFRoZSBXcml0ZXIgZm9yIHRoZSByZXR1cm5lZCBKc3BXcml0ZXIgdG8gc2VuZAorICAgICAqICAgICBvdXRwdXQgdG8uCisgICAgICogQHJldHVybiBhIG5ldyBKc3BXcml0ZXIgdGhhdCB3cml0ZXMgdG8gdGhlIGdpdmVuIFdyaXRlci4KKyAgICAgKiBAc2luY2UgMi4wCisgICAgICovCisgICAgcHVibGljIEpzcFdyaXRlciBwdXNoQm9keSggamF2YS5pby5Xcml0ZXIgd3JpdGVyICkgeworICAgICAgICByZXR1cm4gbnVsbDsgLy8gWFhYIHRvIGltcGxlbWVudAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByZXZpb3VzIEpzcFdyaXRlciAib3V0IiBzYXZlZCBieSB0aGUgbWF0Y2hpbmcKKyAgICAgKiBwdXNoQm9keSgpLCBhbmQgdXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgIm91dCIgYXR0cmlidXRlIGluCisgICAgICogdGhlIHBhZ2Ugc2NvcGUgYXR0cmlidXRlIG5hbWVzcGFjZSBvZiB0aGUgSnNwQ29udGV4dC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNhdmVkIEpzcFdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwV3JpdGVyIHBvcEJvZHkoKSB7CisgICAgICAgIHJldHVybiBudWxsOyAvLyBYWFggdG8gaW1wbGVtZW50CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0pzcEVuZ2luZUluZm8uamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9Kc3BFbmdpbmVJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM2Y2E2NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9Kc3BFbmdpbmVJbmZvLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovIAorcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcDsKKworLyoqCisgKiBUaGUgSnNwRW5naW5lSW5mbyBpcyBhbiBhYnN0cmFjdCBjbGFzcyB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZQorICogY3VycmVudCBKU1AgZW5naW5lLgorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKc3BFbmdpbmVJbmZvIHsKKworICAgIC8qKgorICAgICAqIFNvbGUgY29uc3RydWN0b3IuIChGb3IgaW52b2NhdGlvbiBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcnMsIAorICAgICAqIHR5cGljYWxseSBpbXBsaWNpdC4pCisgICAgICovCisgICAgcHVibGljIEpzcEVuZ2luZUluZm8oKSB7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIEpTUCBzcGVjaWZpY2F0aW9uIHRoYXQgaXMgc3VwcG9ydGVkIGJ5CisgICAgICogdGhpcyBKU1AgZW5naW5lLgorICAgICAqIDxwPgorICAgICAqIFNwZWNpZmljYXRpb24gdmVyc2lvbiBudW1iZXJzIHRoYXQgY29uc2lzdHMgb2YgcG9zaXRpdmUgZGVjaW1hbCBpbnRlZ2VycworICAgICAqIHNlcGFyYXRlZCBieSBwZXJpb2RzICIuIiwgZm9yIGV4YW1wbGUsICIyLjAiIG9yICIxLjIuMy40LjUuNi43Ii4KKyAgICAgKiBUaGlzIGFsbG93cyBhbiBleHRlbnNpYmxlIG51bWJlciB0byBiZSB1c2VkIHRvCisgICAgICogcmVwcmVzZW50IG1ham9yLCBtaW5vciwgbWljcm8sIGV0YyB2ZXJzaW9ucy4KKyAgICAgKiBUaGUgdmVyc2lvbiBudW1iZXIgbXVzdCBiZWdpbiB3aXRoIGEgbnVtYmVyLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNwZWNpZmljYXRpb24gdmVyc2lvbiwgbnVsbCBpcyByZXR1cm5lZCBpZiBpdCBpcyBub3Qga25vd24KKyAgICAgKi8KKworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U3BlY2lmaWNhdGlvblZlcnNpb24oKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9Kc3BFeGNlcHRpb24uamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9Kc3BFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDBmMTcyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0pzcEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3A7CisKKy8qKgorICogQSBnZW5lcmljIGV4Y2VwdGlvbiBrbm93biB0byB0aGUgSlNQIGVuZ2luZTsgdW5jYXVnaHQKKyAqIEpzcEV4Y2VwdGlvbnMgd2lsbCByZXN1bHQgaW4gYW4gaW52b2NhdGlvbiBvZiB0aGUgZXJyb3JwYWdlCisgKiBtYWNoaW5lcnkuCisgKi8KKworcHVibGljIGNsYXNzIEpzcEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIFRocm93YWJsZSByb290Q2F1c2U7CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIEpzcEV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwRXhjZXB0aW9uKCkgeworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBKU1AgZXhjZXB0aW9uIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIG1lc3NhZ2UuIFRoZSBtZXNzYWdlIGNhbiBiZSB3cml0dGVuIAorICAgICAqIHRvIHRoZSBzZXJ2ZXIgbG9nIGFuZC9vciBkaXNwbGF5ZWQgZm9yIHRoZSB1c2VyLiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cgCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gCisgICAgICoJCQkJc3BlY2lmeWluZyB0aGUgdGV4dCBvZiAKKyAgICAgKgkJCQl0aGUgZXhjZXB0aW9uIG1lc3NhZ2UKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBKc3BFeGNlcHRpb24oU3RyaW5nIG1zZykgeworCXN1cGVyKG1zZyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEpTUCBleGNlcHRpb24gd2hlbiB0aGUgSlNQIAorICAgICAqIG5lZWRzIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBhbmQgaW5jbHVkZSBhIG1lc3NhZ2UgCisgICAgICogYWJvdXQgdGhlICJyb290IGNhdXNlIiBleGNlcHRpb24gdGhhdCBpbnRlcmZlcmVkIHdpdGggaXRzIAorICAgICAqIG5vcm1hbCBvcGVyYXRpb24sIGluY2x1ZGluZyBhIGRlc2NyaXB0aW9uIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIAkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgCisgICAgICoJCQkJdGhlIHRleHQgb2YgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdENhdXNlCQl0aGUgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBleGNlcHRpb24gCisgICAgICoJCQkJdGhhdCBpbnRlcmZlcmVkIHdpdGggdGhlIHNlcnZsZXQncworICAgICAqCQkJCW5vcm1hbCBvcGVyYXRpb24sIG1ha2luZyB0aGlzIHNlcnZsZXQKKyAgICAgKgkJCQlleGNlcHRpb24gbmVjZXNzYXJ5CisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgSnNwRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgcm9vdENhdXNlKSB7CisJc3VwZXIobWVzc2FnZSk7CisJdGhpcy5yb290Q2F1c2UgPSByb290Q2F1c2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEpTUCBleGNlcHRpb24gd2hlbiB0aGUgSlNQIAorICAgICAqIG5lZWRzIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBhbmQgaW5jbHVkZSBhIG1lc3NhZ2UKKyAgICAgKiBhYm91dCB0aGUgInJvb3QgY2F1c2UiIGV4Y2VwdGlvbiB0aGF0IGludGVyZmVyZWQgd2l0aCBpdHMKKyAgICAgKiBub3JtYWwgb3BlcmF0aW9uLiAgVGhlIGV4Y2VwdGlvbidzIG1lc3NhZ2UgaXMgYmFzZWQgb24gdGhlIGxvY2FsaXplZAorICAgICAqIG1lc3NhZ2Ugb2YgdGhlIHVuZGVybHlpbmcgZXhjZXB0aW9uLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgY2FsbHMgdGhlIDxjb2RlPmdldExvY2FsaXplZE1lc3NhZ2U8L2NvZGU+IG1ldGhvZAorICAgICAqIG9uIHRoZSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IGV4Y2VwdGlvbiB0byBnZXQgYSBsb2NhbGl6ZWQgZXhjZXB0aW9uCisgICAgICogbWVzc2FnZS4gV2hlbiBzdWJjbGFzc2luZyA8Y29kZT5Kc3BFeGNlcHRpb248L2NvZGU+LCAKKyAgICAgKiB0aGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiB0byBjcmVhdGUgYW4gZXhjZXB0aW9uIG1lc3NhZ2UgCisgICAgICogZGVzaWduZWQgZm9yIGEgc3BlY2lmaWMgbG9jYWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHJvb3RDYXVzZSAJdGhlIDxjb2RlPlRocm93YWJsZTwvY29kZT4gZXhjZXB0aW9uCisgICAgICogCQkJCXRoYXQgaW50ZXJmZXJlZCB3aXRoIHRoZSBKU1AncworICAgICAqCQkJCW5vcm1hbCBvcGVyYXRpb24sIG1ha2luZyB0aGUgSlNQIGV4Y2VwdGlvbgorICAgICAqCQkJCW5lY2Vzc2FyeQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgSnNwRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKKwlzdXBlcihyb290Q2F1c2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKKwl0aGlzLnJvb3RDYXVzZSA9IHJvb3RDYXVzZTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhpcyBKU1AgZXhjZXB0aW9uLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJdGhlIDxjb2RlPlRocm93YWJsZTwvY29kZT4gCisgICAgICoJCQkJdGhhdCBjYXVzZWQgdGhpcyBKU1AgZXhjZXB0aW9uCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldFJvb3RDYXVzZSgpIHsKKwlyZXR1cm4gcm9vdENhdXNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9Kc3BGYWN0b3J5LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSnNwRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZDdjZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSnNwRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3A7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5QYWdlQ29udGV4dDsKKworLyoqCisgKiA8cD4KKyAqIFRoZSBKc3BGYWN0b3J5IGlzIGFuIGFic3RyYWN0IGNsYXNzIHRoYXQgZGVmaW5lcyBhIG51bWJlciBvZiBmYWN0b3J5CisgKiBtZXRob2RzIGF2YWlsYWJsZSB0byBhIEpTUCBwYWdlIGF0IHJ1bnRpbWUgZm9yIHRoZSBwdXJwb3NlcyBvZiBjcmVhdGluZworICogaW5zdGFuY2VzIG9mIHZhcmlvdXMgaW50ZXJmYWNlcyBhbmQgY2xhc3NlcyB1c2VkIHRvIHN1cHBvcnQgdGhlIEpTUCAKKyAqIGltcGxlbWVudGF0aW9uLgorICogPHA+CisgKiBBIGNvbmZvcm1hbnQgSlNQIEVuZ2luZSBpbXBsZW1lbnRhdGlvbiB3aWxsLCBkdXJpbmcgaXQncyBpbml0aWFsaXphdGlvbgorICogaW5zdGFudGlhdGUgYW4gaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IHN1YmNsYXNzIG9mIHRoaXMgY2xhc3MsIGFuZCBtYWtlIAorICogaXQgZ2xvYmFsbHkgYXZhaWxhYmxlIGZvciB1c2UgYnkgSlNQIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgYnkgcmVnaXN0ZXJpbmcKKyAqIHRoZSBpbnN0YW5jZSBjcmVhdGVkIHdpdGggdGhpcyBjbGFzcyB2aWEgdGhlCisgKiBzdGF0aWMgPGNvZGU+IHNldERlZmF1bHRGYWN0b3J5KCkgPC9jb2RlPiBtZXRob2QuCisgKiA8cD4KKyAqIFRoZSBQYWdlQ29udGV4dCBhbmQgdGhlIEpzcEVuZ2luZUluZm8gY2xhc3NlcyBhcmUgdGhlIG9ubHkgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50CisgKiBjbGFzc2VzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgZnJvbSB0aGUgZmFjdG9yeS4KKyAqIDxwPgorICogSnNwRmFjdG9yeSBvYmplY3RzIHNob3VsZCBub3QgYmUgdXNlZCBieSBKU1AgcGFnZSBhdXRob3JzLgorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKc3BGYWN0b3J5IHsKKworICAgIHByaXZhdGUgc3RhdGljIEpzcEZhY3RvcnkgZGVmbHQgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFNvbGUgY29uc3RydWN0b3IuIChGb3IgaW52b2NhdGlvbiBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcnMsIAorICAgICAqIHR5cGljYWxseSBpbXBsaWNpdC4pCisgICAgICovCisgICAgcHVibGljIEpzcEZhY3RvcnkoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogc2V0IHRoZSBkZWZhdWx0IGZhY3RvcnkgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uIEl0IGlzIGlsbGVnYWwgZm9yCisgICAgICogYW55IHByaW5jaXBhbCBvdGhlciB0aGFuIHRoZSBKU1AgRW5naW5lIHJ1bnRpbWUgdG8gY2FsbCB0aGlzIG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVmbHQJVGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXREZWZhdWx0RmFjdG9yeShKc3BGYWN0b3J5IGRlZmx0KSB7CisJSnNwRmFjdG9yeS5kZWZsdCA9IGRlZmx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgZmFjdG9yeSBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgZmFjdG9yeSBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgSnNwRmFjdG9yeSBnZXREZWZhdWx0RmFjdG9yeSgpIHsKKwlyZXR1cm4gZGVmbHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogb2J0YWlucyBhbiBpbnN0YW5jZSBvZiBhbiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgCisgICAgICogamF2YXguc2VydmxldC5qc3AuUGFnZUNvbnRleHQgYWJzdHJhY3QgY2xhc3MgZm9yIHRoZSBjYWxsaW5nIFNlcnZsZXQKKyAgICAgKiBhbmQgY3VycmVudGx5IHBlbmRpbmcgcmVxdWVzdCBhbmQgcmVzcG9uc2UuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IGNhbGxlZCBlYXJseSBpbiB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgCisgICAgICogX2pzcFNlcnZpY2UoKSBtZXRob2Qgb2YgYSBKU1AgaW1wbGVtZW50YXRpb24gY2xhc3MgaW4gb3JkZXIgdG8gCisgICAgICogb2J0YWluIGEgUGFnZUNvbnRleHQgb2JqZWN0IGZvciB0aGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEludm9raW5nIHRoaXMgbWV0aG9kIHNoYWxsIHJlc3VsdCBpbiB0aGUgUGFnZUNvbnRleHQuaW5pdGlhbGl6ZSgpCisgICAgICogbWV0aG9kIGJlaW5nIGludm9rZWQuIFRoZSBQYWdlQ29udGV4dCByZXR1cm5lZCBpcyBwcm9wZXJseSBpbml0aWFsaXplZC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQWxsIFBhZ2VDb250ZXh0IG9iamVjdHMgb2J0YWluZWQgdmlhIHRoaXMgbWV0aG9kIHNoYWxsIGJlIHJlbGVhc2VkCisgICAgICogYnkgaW52b2tpbmcgcmVsZWFzZVBhZ2VDb250ZXh0KCkuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZsZXQgICB0aGUgcmVxdWVzdGluZyBzZXJ2bGV0CisgICAgICogQHBhcmFtIHJlcXVlc3QJdGhlIGN1cnJlbnQgcmVxdWVzdCBwZW5kaW5nIG9uIHRoZSBzZXJ2bGV0CisgICAgICogQHBhcmFtIHJlc3BvbnNlCXRoZSBjdXJyZW50IHJlc3BvbnNlIHBlbmRpbmcgb24gdGhlIHNlcnZsZXQKKyAgICAgKiBAcGFyYW0gZXJyb3JQYWdlVVJMIHRoZSBVUkwgb2YgdGhlIGVycm9yIHBhZ2UgZm9yIHRoZSByZXF1ZXN0aW5nIEpTUCwgb3IgbnVsbAorICAgICAqIEBwYXJhbSBuZWVkc1Nlc3Npb24gdHJ1ZSBpZiB0aGUgSlNQIHBhcnRpY2lwYXRlcyBpbiBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW0gYnVmZmVyCXNpemUgb2YgYnVmZmVyIGluIGJ5dGVzLCBQYWdlQ29udGV4dC5OT19CVUZGRVIgaWYgbm8gYnVmZmVyLAorICAgICAqCQkJUGFnZUNvbnRleHQuREVGQVVMVF9CVUZGRVIgaWYgaW1wbGVtZW50YXRpb24gZGVmYXVsdC4KKyAgICAgKiBAcGFyYW0gYXV0b2ZsdXNoCXNob3VsZCB0aGUgYnVmZmVyIGF1dG9mbHVzaCB0byB0aGUgb3V0cHV0IHN0cmVhbSBvbiBidWZmZXIKKyAgICAgKgkJCW92ZXJmbG93LCBvciB0aHJvdyBhbiBJT0V4Y2VwdGlvbj8KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHBhZ2UgY29udGV4dAorICAgICAqCisgICAgICogQHNlZSBqYXZheC5zZXJ2bGV0LmpzcC5QYWdlQ29udGV4dAorICAgICAqLworCisgICAgcHVibGljIGFic3RyYWN0IFBhZ2VDb250ZXh0IGdldFBhZ2VDb250ZXh0KFNlcnZsZXQJICAgICAgIHNlcnZsZXQsCisJCQkJICAgIAkgICAgICAgU2VydmxldFJlcXVlc3QgIHJlcXVlc3QsCisJCQkJICAgIAkgICAgICAgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorCQkJCSAgICAJICAgICAgIFN0cmluZwkgICAgICAgZXJyb3JQYWdlVVJMLAorCQkJCSAgICAJICAgICAgIGJvb2xlYW4gICAgICAgICBuZWVkc1Nlc3Npb24sCisJCQkJICAgIAkgICAgICAgaW50ICAgICAgICAgICAgIGJ1ZmZlciwKKwkJCQkgICAgCSAgICAgICBib29sZWFuICAgICAgICAgYXV0b2ZsdXNoKTsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIGNhbGxlZCB0byByZWxlYXNlIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgUGFnZUNvbnRleHQgb2JqZWN0LgorICAgICAqIFJlc3VsdHMgaW4gUGFnZUNvbnRleHQucmVsZWFzZSgpIGJlaW5nIGludm9rZWQuCisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGludm9rZWQgcHJpb3IgdG8gcmV0dXJuaW5nIGZyb20gdGhlIF9qc3BTZXJ2aWNlKCkgbWV0aG9kIG9mIGEgSlNQIGltcGxlbWVudGF0aW9uCisgICAgICogY2xhc3MuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBjIEEgUGFnZUNvbnRleHQgcHJldmlvdXNseSBvYnRhaW5lZCBieSBnZXRQYWdlQ29udGV4dCgpCisgICAgICovCisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWxlYXNlUGFnZUNvbnRleHQoUGFnZUNvbnRleHQgcGMpOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogY2FsbGVkIHRvIGdldCBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBpbmZvcm1hdGlvbiBvbiB0aGUgY3VycmVudCBKU1AgZW5naW5lLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBKc3BFbmdpbmVJbmZvIG9iamVjdCBkZXNjcmliaW5nIHRoZSBjdXJyZW50IEpTUCBlbmdpbmUKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgYWJzdHJhY3QgSnNwRW5naW5lSW5mbyBnZXRFbmdpbmVJbmZvKCk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSnNwUGFnZS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0pzcFBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWNmY2NlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0pzcFBhZ2UuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8gCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwOworCitpbXBvcnQgamF2YXguc2VydmxldC4qOworCisvKioKKyAqIFRoZSBKc3BQYWdlIGludGVyZmFjZSBkZXNjcmliZXMgdGhlIGdlbmVyaWMgaW50ZXJhY3Rpb24gdGhhdCBhIEpTUCBQYWdlCisgKiBJbXBsZW1lbnRhdGlvbiBjbGFzcyBtdXN0IHNhdGlzZnk7IHBhZ2VzIHRoYXQgdXNlIHRoZSBIVFRQIHByb3RvY29sCisgKiBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBIdHRwSnNwUGFnZSBpbnRlcmZhY2UuCisgKgorICogPHA+PEI+VHdvIHBsdXMgT25lIE1ldGhvZHM8L0I+CisgKiA8cD4KKyAqIFRoZSBpbnRlcmZhY2UgZGVmaW5lcyBhIHByb3RvY29sIHdpdGggMyBtZXRob2RzOyBvbmx5IHR3byBvZgorICogdGhlbToganNwSW5pdCgpIGFuZCBqc3BEZXN0cm95KCkgYXJlIHBhcnQgb2YgdGhpcyBpbnRlcmZhY2UgYXMKKyAqIHRoZSBzaWduYXR1cmUgb2YgdGhlIHRoaXJkIG1ldGhvZDogX2pzcFNlcnZpY2UoKSBkZXBlbmRzIG9uCisgKiB0aGUgc3BlY2lmaWMgcHJvdG9jb2wgdXNlZCBhbmQgY2Fubm90IGJlIGV4cHJlc3NlZCBpbiBhIGdlbmVyaWMKKyAqIHdheSBpbiBKYXZhLgorICogPHA+CisgKiBBIGNsYXNzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBpcyByZXNwb25zaWJsZSBmb3IgaW52b2tpbmcKKyAqIHRoZSBhYm92ZSBtZXRob2RzIGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lIGJhc2VkIG9uIHRoZQorICogY29ycmVzcG9uZGluZyBTZXJ2bGV0LWJhc2VkIG1ldGhvZCBpbnZvY2F0aW9ucy4KKyAqIDxwPgorICogVGhlIGpzcEluaXQoKSBhbmQganNwRGVzdHJveSgpIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgYnkgYSBKU1AKKyAqIGF1dGhvciwgYnV0IHRoZSBfanNwU2VydmljZSgpIG1ldGhvZCBpcyBkZWZpbmVkIGF1dG9tYXRpY2FsbHkKKyAqIGJ5IHRoZSBKU1AgcHJvY2Vzc29yIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgSlNQIHBhZ2UuCisgKgorICogPHA+PEI+X2pzcFNlcnZpY2UoKTwvQj4KKyAqIDxwPgorICogVGhlIF9qc3BTZXJ2aWNlKCltZXRob2QgY29ycmVzcG9uZHMgdG8gdGhlIGJvZHkgb2YgdGhlIEpTUCBwYWdlLiBUaGlzCisgKiBtZXRob2QgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBKU1AgY29udGFpbmVyIGFuZCBzaG91bGQgbmV2ZXIKKyAqIGJlIGRlZmluZWQgYnkgdGhlIEpTUCBwYWdlIGF1dGhvci4KKyAqIDxwPgorICogSWYgYSBzdXBlcmNsYXNzIGlzIHNwZWNpZmllZCB1c2luZyB0aGUgZXh0ZW5kcyBhdHRyaWJ1dGUsIHRoYXQKKyAqIHN1cGVyY2xhc3MgbWF5IGNob29zZSB0byBwZXJmb3JtIHNvbWUgYWN0aW9ucyBpbiBpdHMgc2VydmljZSgpIG1ldGhvZAorICogYmVmb3JlIG9yIGFmdGVyIGNhbGxpbmcgdGhlIF9qc3BTZXJ2aWNlKCkgbWV0aG9kLiAgU2VlIHVzaW5nIHRoZSBleHRlbmRzCisgKiBhdHRyaWJ1dGUgaW4gdGhlIEpTUF9FbmdpbmUgY2hhcHRlciBvZiB0aGUgSlNQIHNwZWNpZmljYXRpb24uCisgKiA8cD4KKyAqIFRoZSBzcGVjaWZpYyBzaWduYXR1cmUgZGVwZW5kcyBvbiB0aGUgcHJvdG9jb2wgc3VwcG9ydGVkIGJ5IHRoZSBKU1AgcGFnZS4KKyAqCisgKiA8cHJlPgorICogcHVibGljIHZvaWQgX2pzcFNlcnZpY2UoPGVtPlNlcnZsZXRSZXF1ZXN0U3VidHlwZTwvZW0+IHJlcXVlc3QsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtPlNlcnZsZXRSZXNwb25zZVN1YnR5cGU8L2VtPiByZXNwb25zZSkKKyAqICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisgKiA8L3ByZT4KKyAqLworCisKK3B1YmxpYyBpbnRlcmZhY2UgSnNwUGFnZSBleHRlbmRzIFNlcnZsZXQgeworCisgICAgLyoqCisgICAgICogVGhlIGpzcEluaXQoKSBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBKU1AgcGFnZSBpcyBpbml0aWFsaXplZC4gSXQKKyAgICAgKiBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIEpTUCBpbXBsZW1lbnRhdGlvbiAoYW5kIG9mIHRoZSBjbGFzcworICAgICAqIG1lbnRpb25lZCBieSB0aGUgZXh0ZW5kcyBhdHRyaWJ1dGUsIGlmIHByZXNlbnQpIHRoYXQgYXQgdGhpcyBwb2ludAorICAgICAqIGludm9jYXRpb25zIHRvIHRoZSBnZXRTZXJ2bGV0Q29uZmlnKCkgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBkZXNpcmVkCisgICAgICogdmFsdWUuCisgICAgICoKKyAgICAgKiBBIEpTUCBwYWdlIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCBieSBpbmNsdWRpbmcgYSBkZWZpbml0aW9uIGZvciBpdAorICAgICAqIGluIGEgZGVjbGFyYXRpb24gZWxlbWVudC4KKyAgICAgKgorICAgICAqIEEgSlNQIHBhZ2Ugc2hvdWxkIHJlZGVmaW5lIHRoZSBpbml0KCkgbWV0aG9kIGZyb20gU2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqc3BJbml0KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUganNwRGVzdHJveSgpIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gdGhlIEpTUCBwYWdlIGlzIGFib3V0IHRvIGJlCisgICAgICogZGVzdHJveWVkLgorICAgICAqIAorICAgICAqIEEgSlNQIHBhZ2UgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGJ5IGluY2x1ZGluZyBhIGRlZmluaXRpb24gZm9yIGl0CisgICAgICogaW4gYSBkZWNsYXJhdGlvbiBlbGVtZW50LgorICAgICAqCisgICAgICogQSBKU1AgcGFnZSBzaG91bGQgcmVkZWZpbmUgdGhlIGRlc3Ryb3koKSBtZXRob2QgZnJvbSBTZXJ2bGV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGpzcERlc3Ryb3koKTsKKworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0pzcFRhZ0V4Y2VwdGlvbi5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0pzcFRhZ0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMzdiM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSnNwVGFnRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwOworCisvKioKKyAqIEV4Y2VwdGlvbiB0byBiZSB1c2VkIGJ5IGEgVGFnIEhhbmRsZXIgdG8gaW5kaWNhdGUgc29tZSB1bnJlY292ZXJhYmxlCisgKiBlcnJvci4KKyAqIFRoaXMgZXJyb3IgaXMgdG8gYmUgY2F1Z2h0IGJ5IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIEpTUCBwYWdlIGFuZCB3aWxsIHJlc3VsdAorICogaW4gYW4gZXJyb3IgcGFnZS4KKyAqLworCitwdWJsaWMgY2xhc3MgSnNwVGFnRXhjZXB0aW9uIGV4dGVuZHMgSnNwRXhjZXB0aW9uIHsKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEpzcFRhZ0V4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KKyAgICAgKiBUaGUgbWVzc2FnZSBjYW4gYmUgd3JpdHRlbiB0byB0aGUgc2VydmVyIGxvZyBhbmQvb3IgZGlzcGxheWVkCisgICAgICogZm9yIHRoZSB1c2VyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIHRleHQgb2YgCisgICAgICogICAgIHRoZSBleGNlcHRpb24gbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBKc3BUYWdFeGNlcHRpb24oU3RyaW5nIG1zZykgeworCXN1cGVyKCBtc2cgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEpzcFRhZ0V4Y2VwdGlvbiB3aXRoIG5vIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIEpzcFRhZ0V4Y2VwdGlvbigpIHsKKwlzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgSnNwVGFnRXhjZXB0aW9uIHdoZW4gdGhlIEpTUCBUYWcKKyAgICAgKiBuZWVkcyB0byB0aHJvdyBhbiBleGNlcHRpb24gYW5kIGluY2x1ZGUgYSBtZXNzYWdlIAorICAgICAqIGFib3V0IHRoZSAicm9vdCBjYXVzZSIgZXhjZXB0aW9uIHRoYXQgaW50ZXJmZXJlZCB3aXRoIGl0cyAKKyAgICAgKiBub3JtYWwgb3BlcmF0aW9uLCBpbmNsdWRpbmcgYSBkZXNjcmlwdGlvbiBtZXNzYWdlLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSAJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIAorICAgICAqCQkJCXRoZSB0ZXh0IG9mIHRoZSBleGNlcHRpb24gbWVzc2FnZQorICAgICAqCisgICAgICogQHBhcmFtIHJvb3RDYXVzZQkJdGhlIDxjb2RlPlRocm93YWJsZTwvY29kZT4gZXhjZXB0aW9uIAorICAgICAqCQkJCXRoYXQgaW50ZXJmZXJlZCB3aXRoIHRoZSBKU1AgVGFnJ3MKKyAgICAgKgkJCQlub3JtYWwgb3BlcmF0aW9uLCBtYWtpbmcgdGhpcyBKU1AgVGFnCisgICAgICoJCQkJZXhjZXB0aW9uIG5lY2Vzc2FyeQorICAgICAqCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworICAgIHB1YmxpYyBKc3BUYWdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSByb290Q2F1c2UpIHsKKwlzdXBlciggbWVzc2FnZSwgcm9vdENhdXNlICk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEpTUCBUYWcgZXhjZXB0aW9uIHdoZW4gdGhlIEpTUCBUYWcKKyAgICAgKiBuZWVkcyB0byB0aHJvdyBhbiBleGNlcHRpb24gYW5kIGluY2x1ZGUgYSBtZXNzYWdlCisgICAgICogYWJvdXQgdGhlICJyb290IGNhdXNlIiBleGNlcHRpb24gdGhhdCBpbnRlcmZlcmVkIHdpdGggaXRzCisgICAgICogbm9ybWFsIG9wZXJhdGlvbi4gIFRoZSBleGNlcHRpb24ncyBtZXNzYWdlIGlzIGJhc2VkIG9uIHRoZSBsb2NhbGl6ZWQKKyAgICAgKiBtZXNzYWdlIG9mIHRoZSB1bmRlcmx5aW5nIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGNhbGxzIHRoZSA8Y29kZT5nZXRMb2NhbGl6ZWRNZXNzYWdlPC9jb2RlPiBtZXRob2QKKyAgICAgKiBvbiB0aGUgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBleGNlcHRpb24gdG8gZ2V0IGEgbG9jYWxpemVkIGV4Y2VwdGlvbgorICAgICAqIG1lc3NhZ2UuIFdoZW4gc3ViY2xhc3NpbmcgPGNvZGU+SnNwVGFnRXhjZXB0aW9uPC9jb2RlPiwgCisgICAgICogdGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gdG8gY3JlYXRlIGFuIGV4Y2VwdGlvbiBtZXNzYWdlIAorICAgICAqIGRlc2lnbmVkIGZvciBhIHNwZWNpZmljIGxvY2FsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb290Q2F1c2UgCXRoZSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IGV4Y2VwdGlvbgorICAgICAqIAkJCQl0aGF0IGludGVyZmVyZWQgd2l0aCB0aGUgSlNQIFRhZydzCisgICAgICoJCQkJbm9ybWFsIG9wZXJhdGlvbiwgbWFraW5nIHRoZSBKU1AgVGFnIAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24gbmVjZXNzYXJ5CisgICAgICoKKyAgICAgKiBAc2luY2UgMi4wCisgICAgICovCisKKyAgICBwdWJsaWMgSnNwVGFnRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKKwlzdXBlciggcm9vdENhdXNlICk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSnNwV3JpdGVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSnNwV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwMWM0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9Kc3BXcml0ZXIuamF2YQpAQCAtMCwwICsxLDQ0MyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiA8cD4KKyAqIFRoZSBhY3Rpb25zIGFuZCB0ZW1wbGF0ZSBkYXRhIGluIGEgSlNQIHBhZ2UgaXMgd3JpdHRlbiB1c2luZyB0aGUKKyAqIEpzcFdyaXRlciBvYmplY3QgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBpbXBsaWNpdCB2YXJpYWJsZSBvdXQgd2hpY2gKKyAqIGlzIGluaXRpYWxpemVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgbWV0aG9kcyBpbiB0aGUgUGFnZUNvbnRleHQgb2JqZWN0LgorICo8cD4KKyAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgZW11bGF0ZXMgc29tZSBvZiB0aGUgZnVuY3Rpb25hbGl0eSBmb3VuZCBpbiB0aGUKKyAqIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIgYW5kIGphdmEuaW8uUHJpbnRXcml0ZXIgY2xhc3NlcywKKyAqIGhvd2V2ZXIgaXQgZGlmZmVycyBpbiB0aGF0IGl0IHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIGZyb20gdGhlIHByaW50CisgKiBtZXRob2RzIHdoaWxlIFByaW50V3JpdGVyIGRvZXMgbm90LgorICogPHA+PEI+QnVmZmVyaW5nPC9CPgorICogPHA+CisgKiBUaGUgaW5pdGlhbCBKc3BXcml0ZXIgb2JqZWN0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgUHJpbnRXcml0ZXIgb2JqZWN0CisgKiBvZiB0aGUgU2VydmxldFJlc3BvbnNlIGluIGEgd2F5IHRoYXQgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBwYWdlIGlzIG9yCisgKiBpcyBub3QgYnVmZmVyZWQuIElmIHRoZSBwYWdlIGlzIG5vdCBidWZmZXJlZCwgb3V0cHV0IHdyaXR0ZW4gdG8gdGhpcworICogSnNwV3JpdGVyIG9iamVjdCB3aWxsIGJlIHdyaXR0ZW4gdGhyb3VnaCB0byB0aGUgUHJpbnRXcml0ZXIgZGlyZWN0bHksCisgKiB3aGljaCB3aWxsIGJlIGNyZWF0ZWQgaWYgbmVjZXNzYXJ5IGJ5IGludm9raW5nIHRoZSBnZXRXcml0ZXIoKSBtZXRob2QKKyAqIG9uIHRoZSByZXNwb25zZSBvYmplY3QuIEJ1dCBpZiB0aGUgcGFnZSBpcyBidWZmZXJlZCwgdGhlIFByaW50V3JpdGVyCisgKiBvYmplY3Qgd2lsbCBub3QgYmUgY3JlYXRlZCB1bnRpbCB0aGUgYnVmZmVyIGlzIGZsdXNoZWQgYW5kCisgKiBvcGVyYXRpb25zIGxpa2Ugc2V0Q29udGVudFR5cGUoKSBhcmUgbGVnYWwuIFNpbmNlIHRoaXMgZmxleGliaWxpdHkKKyAqIHNpbXBsaWZpZXMgcHJvZ3JhbW1pbmcgc3Vic3RhbnRpYWxseSwgYnVmZmVyaW5nIGlzIHRoZSBkZWZhdWx0IGZvciBKU1AKKyAqIHBhZ2VzLgorICogPHA+CisgKiBCdWZmZXJpbmcgcmFpc2VzIHRoZSBpc3N1ZSBvZiB3aGF0IHRvIGRvIHdoZW4gdGhlIGJ1ZmZlciBpcworICogZXhjZWVkZWQuIFR3byBhcHByb2FjaGVzIGNhbiBiZSB0YWtlbjoKKyAqIDx1bD4KKyAqIDxsaT4KKyAqIEV4Y2VlZGluZyB0aGUgYnVmZmVyIGlzIG5vdCBhIGZhdGFsIGVycm9yOyB3aGVuIHRoZSBidWZmZXIgaXMKKyAqIGV4Y2VlZGVkLCBqdXN0IGZsdXNoIHRoZSBvdXRwdXQuCisgKiA8bGk+CisgKiBFeGNlZWRpbmcgdGhlIGJ1ZmZlciBpcyBhIGZhdGFsIGVycm9yOyB3aGVuIHRoZSBidWZmZXIgaXMgZXhjZWVkZWQsCisgKiByYWlzZSBhbiBleGNlcHRpb24uCisgKiA8L3VsPgorICogPHA+CisgKiBCb3RoIGFwcHJvYWNoZXMgYXJlIHZhbGlkLCBhbmQgdGh1cyBib3RoIGFyZSBzdXBwb3J0ZWQgaW4gdGhlIEpTUAorICogdGVjaG5vbG9neS4gVGhlIGJlaGF2aW9yIG9mIGEgcGFnZSBpcyBjb250cm9sbGVkIGJ5IHRoZSBhdXRvRmx1c2gKKyAqIGF0dHJpYnV0ZSwgd2hpY2ggZGVmYXVsdHMgdG8gdHJ1ZS4gSW4gZ2VuZXJhbCwgSlNQIHBhZ2VzIHRoYXQgbmVlZCB0bworICogYmUgc3VyZSB0aGF0IGNvcnJlY3QgYW5kIGNvbXBsZXRlIGRhdGEgaGFzIGJlZW4gc2VudCB0byB0aGVpciBjbGllbnQKKyAqIG1heSB3YW50IHRvIHNldCBhdXRvRmx1c2ggdG8gZmFsc2UsIHdpdGggYSB0eXBpY2FsIGNhc2UgYmVpbmcgdGhhdAorICogd2hlcmUgdGhlIGNsaWVudCBpcyBhbiBhcHBsaWNhdGlvbiBpdHNlbGYuIE9uIHRoZSBvdGhlciBoYW5kLCBKU1AKKyAqIHBhZ2VzIHRoYXQgc2VuZCBkYXRhIHRoYXQgaXMgbWVhbmluZ2Z1bCBldmVuIHdoZW4gcGFydGlhbGx5CisgKiBjb25zdHJ1Y3RlZCBtYXkgd2FudCB0byBzZXQgYXV0b0ZsdXNoIHRvIHRydWU7IHN1Y2ggYXMgd2hlbiB0aGUKKyAqIGRhdGEgaXMgc2VudCBmb3IgaW1tZWRpYXRlIGRpc3BsYXkgdGhyb3VnaCBhIGJyb3dzZXIuIEVhY2ggYXBwbGljYXRpb24KKyAqIHdpbGwgbmVlZCB0byBjb25zaWRlciB0aGVpciBzcGVjaWZpYyBuZWVkcy4KKyAqIDxwPgorICogQW4gYWx0ZXJuYXRpdmUgY29uc2lkZXJlZCB3YXMgdG8gbWFrZSB0aGUgYnVmZmVyIHNpemUgdW5ib3VuZGVkOyBidXQsCisgKiB0aGlzIGhhZCB0aGUgZGlzYWR2YW50YWdlIHRoYXQgcnVuYXdheSBjb21wdXRhdGlvbnMgd291bGQgY29uc3VtZSBhbgorICogdW5ib3VuZGVkIGFtb3VudCBvZiByZXNvdXJjZXMuCisgKiA8cD4KKyAqIFRoZSAib3V0IiBpbXBsaWNpdCB2YXJpYWJsZSBvZiBhIEpTUCBpbXBsZW1lbnRhdGlvbiBjbGFzcyBpcyBvZiB0aGlzIHR5cGUuCisgKiBJZiB0aGUgcGFnZSBkaXJlY3RpdmUgc2VsZWN0cyBhdXRvZmx1c2g9InRydWUiIHRoZW4gYWxsIHRoZSBJL08gb3BlcmF0aW9ucworICogb24gdGhpcyBjbGFzcyBzaGFsbCBhdXRvbWF0aWNhbGx5IGZsdXNoIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIGlmIGFuCisgKiBvdmVyZmxvdyBjb25kaXRpb24gd291bGQgcmVzdWx0IGlmIHRoZSBjdXJyZW50IG9wZXJhdGlvbiB3ZXJlIHBlcmZvcm1lZAorICogd2l0aG91dCBhIGZsdXNoLiBJZiBhdXRvZmx1c2g9ImZhbHNlIiB0aGVuIGFsbCB0aGUgSS9PIG9wZXJhdGlvbnMgb24gdGhpcworICogY2xhc3Mgc2hhbGwgdGhyb3cgYW4gSU9FeGNlcHRpb24gaWYgcGVyZm9ybWluZyB0aGUgY3VycmVudCBvcGVyYXRpb24gd291bGQKKyAqIHJlc3VsdCBpbiBhIGJ1ZmZlciBvdmVyZmxvdyBjb25kaXRpb24uCisgKgorICogQHNlZSBqYXZhLmlvLldyaXRlcgorICogQHNlZSBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyCisgKiBAc2VlIGphdmEuaW8uUHJpbnRXcml0ZXIKKyAqLworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgSnNwV3JpdGVyIGV4dGVuZHMgamF2YS5pby5Xcml0ZXIgeworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSBXcml0ZXIgaXMgbm90IGJ1ZmZlcmluZyBvdXRwdXQuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludAlOT19CVUZGRVIgPSAwOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSBXcml0ZXIgaXMgYnVmZmVyZWQgYW5kIGlzIHVzaW5nIHRoZQorICAgICAqIGltcGxlbWVudGF0aW9uIGRlZmF1bHQgYnVmZmVyIHNpemUuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludAlERUZBVUxUX0JVRkZFUiA9IC0xOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSBXcml0ZXIgaXMgYnVmZmVyZWQgYW5kIGlzIHVuYm91bmRlZDsgdGhpcworICAgICAqIGlzIHVzZWQgaW4gQm9keUNvbnRlbnQuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludAlVTkJPVU5ERURfQlVGRkVSID0gLTI7CisKKyAgICAvKioKKyAgICAgKiBQcm90ZWN0ZWQgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmZmVyU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHRvIGJlIHVzZWQgYnkgdGhlIEpzcFdyaXRlcgorICAgICAqIEBwYXJhbSBhdXRvRmx1c2ggd2hldGhlciB0aGUgSnNwV3JpdGVyIHNob3VsZCBiZSBhdXRvZmx1c2hpbmcKKyAgICAgKi8KKworICAgIHByb3RlY3RlZCBKc3BXcml0ZXIoaW50IGJ1ZmZlclNpemUsIGJvb2xlYW4gYXV0b0ZsdXNoKSB7CisJdGhpcy5idWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKKwl0aGlzLmF1dG9GbHVzaCAgPSBhdXRvRmx1c2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBsaW5lIHNlcGFyYXRvci4gIFRoZSBsaW5lIHNlcGFyYXRvciBzdHJpbmcgaXMgZGVmaW5lZCBieSB0aGUKKyAgICAgKiBzeXN0ZW0gcHJvcGVydHkgPHR0PmxpbmUuc2VwYXJhdG9yPC90dD4sIGFuZCBpcyBub3QgbmVjZXNzYXJpbHkgYSBzaW5nbGUKKyAgICAgKiBuZXdsaW5lICgnXG4nKSBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgbmV3TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFByaW50IGEgYm9vbGVhbiB2YWx1ZS4gIFRoZSBzdHJpbmcgcHJvZHVjZWQgYnkgPGNvZGU+e0BsaW5rCisgICAgICogamF2YS5sYW5nLlN0cmluZyN2YWx1ZU9mKGJvb2xlYW4pfTwvY29kZT4gaXMgd3JpdHRlbiB0byB0aGUKKyAgICAgKiBKc3BXcml0ZXIncyBidWZmZXIgb3IsIGlmIG5vIGJ1ZmZlciBpcyB1c2VkLCBkaXJlY3RseSB0byB0aGUgCisgICAgICogdW5kZXJseWluZyB3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBiICAgVGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHRvIGJlIHByaW50ZWQKKyAgICAgKiBAdGhyb3dzCSAgIGphdmEuaW8uSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB3cml0aW5nCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBwcmludChib29sZWFuIGIpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFByaW50IGEgY2hhcmFjdGVyLiAgVGhlIGNoYXJhY3RlciBpcyB3cml0dGVuIHRvIHRoZQorICAgICAqIEpzcFdyaXRlcidzIGJ1ZmZlciBvciwgaWYgbm8gYnVmZmVyIGlzIHVzZWQsIGRpcmVjdGx5IHRvIHRoZQorICAgICAqIHVuZGVybHlpbmcgd3JpdGVyLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgYyAgIFRoZSA8Y29kZT5jaGFyPC9jb2RlPiB0byBiZSBwcmludGVkCisgICAgICogQHRocm93cwkgICBqYXZhLmlvLklPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgd3JpdGluZworICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgcHJpbnQoY2hhciBjKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhbiBpbnRlZ2VyLiAgVGhlIHN0cmluZyBwcm9kdWNlZCBieSA8Y29kZT57QGxpbmsKKyAgICAgKiBqYXZhLmxhbmcuU3RyaW5nI3ZhbHVlT2YoaW50KX08L2NvZGU+IGlzIHdyaXR0ZW4gdG8gdGhlCisgICAgICogSnNwV3JpdGVyJ3MgYnVmZmVyIG9yLCBpZiBubyBidWZmZXIgaXMgdXNlZCwgZGlyZWN0bHkgdG8gdGhlCisgICAgICogdW5kZXJseWluZyB3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBpICAgVGhlIDxjb2RlPmludDwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqIEBzZWUgICAgICAgIGphdmEubGFuZy5JbnRlZ2VyI3RvU3RyaW5nKGludCkKKyAgICAgKiBAdGhyb3dzCSAgIGphdmEuaW8uSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB3cml0aW5nCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBwcmludChpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUHJpbnQgYSBsb25nIGludGVnZXIuICBUaGUgc3RyaW5nIHByb2R1Y2VkIGJ5IDxjb2RlPntAbGluaworICAgICAqIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihsb25nKX08L2NvZGU+IGlzIHdyaXR0ZW4gdG8gdGhlCisgICAgICogSnNwV3JpdGVyJ3MgYnVmZmVyIG9yLCBpZiBubyBidWZmZXIgaXMgdXNlZCwgZGlyZWN0bHkgdG8gdGhlCisgICAgICogdW5kZXJseWluZyB3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBsICAgVGhlIDxjb2RlPmxvbmc8L2NvZGU+IHRvIGJlIHByaW50ZWQKKyAgICAgKiBAc2VlICAgICAgICBqYXZhLmxhbmcuTG9uZyN0b1N0cmluZyhsb25nKQorICAgICAqIEB0aHJvd3MJICAgamF2YS5pby5JT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHdyaXRpbmcKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHByaW50KGxvbmcgbCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUHJpbnQgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuICBUaGUgc3RyaW5nIHByb2R1Y2VkIGJ5IDxjb2RlPntAbGluaworICAgICAqIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihmbG9hdCl9PC9jb2RlPiBpcyB3cml0dGVuIHRvIHRoZQorICAgICAqIEpzcFdyaXRlcidzIGJ1ZmZlciBvciwgaWYgbm8gYnVmZmVyIGlzIHVzZWQsIGRpcmVjdGx5IHRvIHRoZQorICAgICAqIHVuZGVybHlpbmcgd3JpdGVyLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgZiAgIFRoZSA8Y29kZT5mbG9hdDwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqIEBzZWUgICAgICAgIGphdmEubGFuZy5GbG9hdCN0b1N0cmluZyhmbG9hdCkKKyAgICAgKiBAdGhyb3dzCSAgIGphdmEuaW8uSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB3cml0aW5nCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBwcmludChmbG9hdCBmKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgbnVtYmVyLiAgVGhlIHN0cmluZyBwcm9kdWNlZCBieQorICAgICAqIDxjb2RlPntAbGluayBqYXZhLmxhbmcuU3RyaW5nI3ZhbHVlT2YoZG91YmxlKX08L2NvZGU+IGlzIHdyaXR0ZW4gdG8KKyAgICAgKiB0aGUgSnNwV3JpdGVyJ3MgYnVmZmVyIG9yLCBpZiBubyBidWZmZXIgaXMgdXNlZCwgZGlyZWN0bHkgdG8gdGhlCisgICAgICogdW5kZXJseWluZyB3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBkICAgVGhlIDxjb2RlPmRvdWJsZTwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqIEBzZWUgICAgICAgIGphdmEubGFuZy5Eb3VibGUjdG9TdHJpbmcoZG91YmxlKQorICAgICAqIEB0aHJvd3MJICAgamF2YS5pby5JT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHdyaXRpbmcKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHByaW50KGRvdWJsZSBkKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLiAgVGhlIGNoYXJhY3RlcnMgYXJlIHdyaXR0ZW4gdG8gdGhlCisgICAgICogSnNwV3JpdGVyJ3MgYnVmZmVyIG9yLCBpZiBubyBidWZmZXIgaXMgdXNlZCwgZGlyZWN0bHkgdG8gdGhlCisgICAgICogdW5kZXJseWluZyB3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBzICAgVGhlIGFycmF5IG9mIGNoYXJzIHRvIGJlIHByaW50ZWQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgIE51bGxQb2ludGVyRXhjZXB0aW9uICBJZiA8Y29kZT5zPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqIEB0aHJvd3MJICAgamF2YS5pby5JT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHdyaXRpbmcKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHByaW50KGNoYXIgc1tdKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIHN0cmluZy4gIElmIHRoZSBhcmd1bWVudCBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIHRoZSBzdHJpbmcKKyAgICAgKiA8Y29kZT4ibnVsbCI8L2NvZGU+IGlzIHByaW50ZWQuICBPdGhlcndpc2UsIHRoZSBzdHJpbmcncyBjaGFyYWN0ZXJzIGFyZQorICAgICAqIHdyaXR0ZW4gdG8gdGhlIEpzcFdyaXRlcidzIGJ1ZmZlciBvciwgaWYgbm8gYnVmZmVyIGlzIHVzZWQsIGRpcmVjdGx5CisgICAgICogdG8gdGhlIHVuZGVybHlpbmcgd3JpdGVyLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgcyAgIFRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGJlIHByaW50ZWQKKyAgICAgKiBAdGhyb3dzCSAgIGphdmEuaW8uSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB3cml0aW5nCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBwcmludChTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUHJpbnQgYW4gb2JqZWN0LiAgVGhlIHN0cmluZyBwcm9kdWNlZCBieSB0aGUgPGNvZGU+e0BsaW5rCisgICAgICogamF2YS5sYW5nLlN0cmluZyN2YWx1ZU9mKE9iamVjdCl9PC9jb2RlPiBtZXRob2QgaXMgd3JpdHRlbiB0byB0aGUKKyAgICAgKiBKc3BXcml0ZXIncyBidWZmZXIgb3IsIGlmIG5vIGJ1ZmZlciBpcyB1c2VkLCBkaXJlY3RseSB0byB0aGUKKyAgICAgKiB1bmRlcmx5aW5nIHdyaXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIG9iaiAgIFRoZSA8Y29kZT5PYmplY3Q8L2NvZGU+IHRvIGJlIHByaW50ZWQKKyAgICAgKiBAc2VlICAgICAgICBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKyAgICAgKiBAdGhyb3dzCSAgIGphdmEuaW8uSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB3cml0aW5nCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBwcmludChPYmplY3Qgb2JqKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBUZXJtaW5hdGUgdGhlIGN1cnJlbnQgbGluZSBieSB3cml0aW5nIHRoZSBsaW5lIHNlcGFyYXRvciBzdHJpbmcuICBUaGUKKyAgICAgKiBsaW5lIHNlcGFyYXRvciBzdHJpbmcgaXMgZGVmaW5lZCBieSB0aGUgc3lzdGVtIHByb3BlcnR5CisgICAgICogPGNvZGU+bGluZS5zZXBhcmF0b3I8L2NvZGU+LCBhbmQgaXMgbm90IG5lY2Vzc2FyaWx5IGEgc2luZ2xlIG5ld2xpbmUKKyAgICAgKiBjaGFyYWN0ZXIgKDxjb2RlPidcbic8L2NvZGU+KS4KKyAgICAgKiBAdGhyb3dzCSAgIGphdmEuaW8uSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB3cml0aW5nCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBwcmludGxuKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUHJpbnQgYSBib29sZWFuIHZhbHVlIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMKKyAgICAgKiBhcyB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KGJvb2xlYW4pfTwvY29kZT4gYW5kIHRoZW4KKyAgICAgKiA8Y29kZT57QGxpbmsgI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgeCB0aGUgYm9vbGVhbiB0byB3cml0ZQorICAgICAqIEB0aHJvd3MJICAgamF2YS5pby5JT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHdyaXRpbmcKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHByaW50bG4oYm9vbGVhbiB4KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGNoYXJhY3RlciBhbmQgdGhlbiB0ZXJtaW5hdGUgdGhlIGxpbmUuICBUaGlzIG1ldGhvZCBiZWhhdmVzIGFzCisgICAgICogdGhvdWdoIGl0IGludm9rZXMgPGNvZGU+e0BsaW5rICNwcmludChjaGFyKX08L2NvZGU+IGFuZCB0aGVuIDxjb2RlPntAbGluaworICAgICAqICNwcmludGxuKCl9PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIHggdGhlIGNoYXIgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzCSAgIGphdmEuaW8uSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB3cml0aW5nCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBwcmludGxuKGNoYXIgeCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUHJpbnQgYW4gaW50ZWdlciBhbmQgdGhlbiB0ZXJtaW5hdGUgdGhlIGxpbmUuICBUaGlzIG1ldGhvZCBiZWhhdmVzIGFzCisgICAgICogdGhvdWdoIGl0IGludm9rZXMgPGNvZGU+e0BsaW5rICNwcmludChpbnQpfTwvY29kZT4gYW5kIHRoZW4gPGNvZGU+e0BsaW5rCisgICAgICogI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgeCB0aGUgaW50IHRvIHdyaXRlCisgICAgICogQHRocm93cwkgICBqYXZhLmlvLklPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgd3JpdGluZworICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgcHJpbnRsbihpbnQgeCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUHJpbnQgYSBsb25nIGludGVnZXIgYW5kIHRoZW4gdGVybWluYXRlIHRoZSBsaW5lLiAgVGhpcyBtZXRob2QgYmVoYXZlcworICAgICAqIGFzIHRob3VnaCBpdCBpbnZva2VzIDxjb2RlPntAbGluayAjcHJpbnQobG9uZyl9PC9jb2RlPiBhbmQgdGhlbgorICAgICAqIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICB4IHRoZSBsb25nIHRvIHdyaXRlCisgICAgICogQHRocm93cwkgICBqYXZhLmlvLklPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgd3JpdGluZworICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgcHJpbnRsbihsb25nIHgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFByaW50IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kCisgICAgICogYmVoYXZlcyBhcyB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KGZsb2F0KX08L2NvZGU+IGFuZCB0aGVuCisgICAgICogPGNvZGU+e0BsaW5rICNwcmludGxuKCl9PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIHggdGhlIGZsb2F0IHRvIHdyaXRlCisgICAgICogQHRocm93cwkgICBqYXZhLmlvLklPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgd3JpdGluZworICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgcHJpbnRsbihmbG9hdCB4KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgbnVtYmVyIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUKKyAgICAgKiBsaW5lLiAgVGhpcyBtZXRob2QgYmVoYXZlcyBhcyB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsKKyAgICAgKiAjcHJpbnQoZG91YmxlKX08L2NvZGU+IGFuZCB0aGVuIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICB4IHRoZSBkb3VibGUgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzCSAgIGphdmEuaW8uSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB3cml0aW5nCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBwcmludGxuKGRvdWJsZSB4KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kCisgICAgICogYmVoYXZlcyBhcyB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT5wcmludChjaGFyW10pPC9jb2RlPiBhbmQgdGhlbgorICAgICAqIDxjb2RlPnByaW50bG4oKTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICB4IHRoZSBjaGFyW10gdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzCSAgIGphdmEuaW8uSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB3cml0aW5nCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBwcmludGxuKGNoYXIgeFtdKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIFN0cmluZyBhbmQgdGhlbiB0ZXJtaW5hdGUgdGhlIGxpbmUuICBUaGlzIG1ldGhvZCBiZWhhdmVzIGFzCisgICAgICogdGhvdWdoIGl0IGludm9rZXMgPGNvZGU+e0BsaW5rICNwcmludChTdHJpbmcpfTwvY29kZT4gYW5kIHRoZW4KKyAgICAgKiA8Y29kZT57QGxpbmsgI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgeCB0aGUgU3RyaW5nIHRvIHdyaXRlCisgICAgICogQHRocm93cwkgICBqYXZhLmlvLklPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgd3JpdGluZworICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgcHJpbnRsbihTdHJpbmcgeCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUHJpbnQgYW4gT2JqZWN0IGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMgYXMKKyAgICAgKiB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KE9iamVjdCl9PC9jb2RlPiBhbmQgdGhlbgorICAgICAqIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICB4IHRoZSBPYmplY3QgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzCSAgIGphdmEuaW8uSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB3cml0aW5nCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBwcmludGxuKE9iamVjdCB4KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIENsZWFyIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyLiBJZiB0aGUgYnVmZmVyIGhhcyBiZWVuIGFscmVhZHkKKyAgICAgKiBiZWVuIGZsdXNoZWQgdGhlbiB0aGUgY2xlYXIgb3BlcmF0aW9uIHNoYWxsIHRocm93IGFuIElPRXhjZXB0aW9uCisgICAgICogdG8gc2lnbmFsIHRoZSBmYWN0IHRoYXQgc29tZSBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gaXJyZXZvY2FibHkgCisgICAgICogd3JpdHRlbiB0byB0aGUgY2xpZW50IHJlc3BvbnNlIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24JCUlmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIGNsZWFyKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuIFVubGlrZSBjbGVhcigpLCB0aGlzCisgICAgICogbWV0aG9kIHdpbGwgbm90IHRocm93IGFuIElPRXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgaGFzIGFscmVhZHkgYmVlbgorICAgICAqIGZsdXNoZWQuIEl0IG1lcmVseSBjbGVhcnMgdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgYnVmZmVyIGFuZAorICAgICAqIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCQlJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBjbGVhckJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEZsdXNoIHRoZSBzdHJlYW0uICBJZiB0aGUgc3RyZWFtIGhhcyBzYXZlZCBhbnkgY2hhcmFjdGVycyBmcm9tIHRoZQorICAgICAqIHZhcmlvdXMgd3JpdGUoKSBtZXRob2RzIGluIGEgYnVmZmVyLCB3cml0ZSB0aGVtIGltbWVkaWF0ZWx5IHRvIHRoZWlyCisgICAgICogaW50ZW5kZWQgZGVzdGluYXRpb24uICBUaGVuLCBpZiB0aGF0IGRlc3RpbmF0aW9uIGlzIGFub3RoZXIgY2hhcmFjdGVyIG9yCisgICAgICogYnl0ZSBzdHJlYW0sIGZsdXNoIGl0LiAgVGh1cyBvbmUgZmx1c2goKSBpbnZvY2F0aW9uIHdpbGwgZmx1c2ggYWxsIHRoZQorICAgICAqIGJ1ZmZlcnMgaW4gYSBjaGFpbiBvZiBXcml0ZXJzIGFuZCBPdXRwdXRTdHJlYW1zLgorICAgICAqIDxwPgorICAgICAqIFRoZSBtZXRob2QgbWF5IGJlIGludm9rZWQgaW5kaXJlY3RseSBpZiB0aGUgYnVmZmVyIHNpemUgaXMgZXhjZWVkZWQuCisgICAgICogPHA+CisgICAgICogT25jZSBhIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQsCisgICAgICogZnVydGhlciB3cml0ZSgpIG9yIGZsdXNoKCkgaW52b2NhdGlvbnMgd2lsbCBjYXVzZSBhbiBJT0V4Y2VwdGlvbiB0byBiZQorICAgICAqIHRocm93bi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBzdHJlYW0sIGZsdXNoaW5nIGl0IGZpcnN0LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIG5lZWRzIG5vdCBiZSBpbnZva2VkIGV4cGxpY2l0bHkgZm9yIHRoZSBpbml0aWFsIEpzcFdyaXRlcgorICAgICAqIGFzIHRoZSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgSlNQIGNvbnRhaW5lciB3aWxsIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBpbmNsdWRlIGEgY2FsbCB0byBjbG9zZSgpLgorICAgICAqIDxwPgorICAgICAqIENsb3NpbmcgYSBwcmV2aW91c2x5LWNsb3NlZCBzdHJlYW0sIHVubGlrZSBmbHVzaCgpLCBoYXMgbm8gZWZmZWN0LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHVzZWQgYnkgdGhlIEpzcFdyaXRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlcywgb3IgMCBpcyB1bmJ1ZmZlcmVkLgorICAgICAqLworCisgICAgcHVibGljIGludCBnZXRCdWZmZXJTaXplKCkgeyByZXR1cm4gYnVmZmVyU2l6ZTsgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVudXNlZCBieXRlcyBpbiB0aGUgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVudXNlZCBpbiB0aGUgYnVmZmVyCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgaW50IGdldFJlbWFpbmluZygpOworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIEpzcFdyaXRlciBpcyBhdXRvRmx1c2hpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGlmIHRoaXMgSnNwV3JpdGVyIGlzIGF1dG8gZmx1c2hpbmcgb3IgdGhyb3dpbmcgSU9FeGNlcHRpb25zIAorICAgICAqICAgICBvbiBidWZmZXIgb3ZlcmZsb3cgY29uZGl0aW9ucworICAgICAqLworCisgICAgcHVibGljIGJvb2xlYW4gaXNBdXRvRmx1c2goKSB7IHJldHVybiBhdXRvRmx1c2g7IH0KKworICAgIC8qCisgICAgICogZmllbGRzCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHVzZWQgYnkgdGhlIEpzcFdyaXRlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50ICAgICBidWZmZXJTaXplOworICAgIAorICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIEpzcFdyaXRlciBpcyBhdXRvZmx1c2hpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXV0b0ZsdXNoOworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL1BhZ2VDb250ZXh0LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvUGFnZUNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODNmNDYzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL1BhZ2VDb250ZXh0LmphdmEKQEAgLTAsMCArMSw1MjMgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIAorcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuQm9keUNvbnRlbnQ7CisKKy8qKgorICogPHA+CisgKiBQYWdlQ29udGV4dCBleHRlbmRzIEpzcENvbnRleHQgdG8gcHJvdmlkZSB1c2VmdWwgY29udGV4dCBpbmZvcm1hdGlvbiBmb3IKKyAqIHdoZW4gSlNQIHRlY2hub2xvZ3kgaXMgdXNlZCBpbiBhIFNlcnZsZXQgZW52aXJvbm1lbnQuCisgKiA8cD4KKyAqIEEgUGFnZUNvbnRleHQgaW5zdGFuY2UgcHJvdmlkZXMgYWNjZXNzIHRvIGFsbCB0aGUgbmFtZXNwYWNlcyBhc3NvY2lhdGVkCisgKiB3aXRoIGEgSlNQIHBhZ2UsIHByb3ZpZGVzIGFjY2VzcyB0byBzZXZlcmFsIHBhZ2UgYXR0cmlidXRlcywgYXMgd2VsbCBhcworICogYSBsYXllciBhYm92ZSB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscy4gIEltcGxpY2l0IG9iamVjdHMgYXJlIGFkZGVkCisgKiB0byB0aGUgcGFnZUNvbnRleHQgYXV0b21hdGljYWxseS4KKyAqCisgKiA8cD4gVGhlIDxjb2RlPiBQYWdlQ29udGV4dCA8L2NvZGU+IGNsYXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzLCBkZXNpZ25lZCB0byBiZQorICogZXh0ZW5kZWQgdG8gcHJvdmlkZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgaW1wbGVtZW50YXRpb25zIHRoZXJlb2YsIGJ5CisgKiBjb25mb3JtYW50IEpTUCBlbmdpbmUgcnVudGltZSBlbnZpcm9ubWVudHMuIEEgUGFnZUNvbnRleHQgaW5zdGFuY2UgaXMgCisgKiBvYnRhaW5lZCBieSBhIEpTUCBpbXBsZW1lbnRhdGlvbiBjbGFzcyBieSBjYWxsaW5nIHRoZQorICogSnNwRmFjdG9yeS5nZXRQYWdlQ29udGV4dCgpIG1ldGhvZCwgYW5kIGlzIHJlbGVhc2VkIGJ5IGNhbGxpbmcKKyAqIEpzcEZhY3RvcnkucmVsZWFzZVBhZ2VDb250ZXh0KCkuCisgKgorICogPHA+IEFuIGV4YW1wbGUgb2YgaG93IFBhZ2VDb250ZXh0LCBKc3BGYWN0b3J5LCBhbmQgb3RoZXIgY2xhc3NlcyBjYW4gYmUKKyAqIHVzZWQgIHdpdGhpbiBhIEpTUCBQYWdlIEltcGxlbWVudGF0aW9uIG9iamVjdCBpcyBnaXZlbiBlbHNld2hlcmUuCisgKgorICogPHA+CisgKiBUaGUgUGFnZUNvbnRleHQgcHJvdmlkZXMgYSBudW1iZXIgb2YgZmFjaWxpdGllcyB0byB0aGUgcGFnZS9jb21wb25lbnQgCisgKiBhdXRob3IgYW5kIHBhZ2UgaW1wbGVtZW50b3IsIGluY2x1ZGluZzoKKyAqIDx1bD4KKyAqIDxsaT5hIHNpbmdsZSBBUEkgdG8gbWFuYWdlIHRoZSB2YXJpb3VzIHNjb3BlZCBuYW1lc3BhY2VzCisgKiA8bGk+YSBudW1iZXIgb2YgY29udmVuaWVuY2UgQVBJJ3MgdG8gYWNjZXNzIHZhcmlvdXMgcHVibGljIG9iamVjdHMKKyAqIDxsaT5hIG1lY2hhbmlzbSB0byBvYnRhaW4gdGhlIEpzcFdyaXRlciBmb3Igb3V0cHV0CisgKiA8bGk+YSBtZWNoYW5pc20gdG8gbWFuYWdlIHNlc3Npb24gdXNhZ2UgYnkgdGhlIHBhZ2UKKyAqIDxsaT5hIG1lY2hhbmlzbSB0byBleHBvc2UgcGFnZSBkaXJlY3RpdmUgYXR0cmlidXRlcyB0byB0aGUgc2NyaXB0aW5nIAorICogICAgIGVudmlyb25tZW50CisgKiA8bGk+bWVjaGFuaXNtcyB0byBmb3J3YXJkIG9yIGluY2x1ZGUgdGhlIGN1cnJlbnQgcmVxdWVzdCB0byBvdGhlciBhY3RpdmUgCisgKiAgICAgY29tcG9uZW50cyBpbiB0aGUgYXBwbGljYXRpb24KKyAqIDxsaT5hIG1lY2hhbmlzbSB0byBoYW5kbGUgZXJyb3JwYWdlIGV4Y2VwdGlvbiBwcm9jZXNzaW5nCisgKiA8L3VsPgorICoKKyAqIDxwPjxCPk1ldGhvZHMgSW50ZW5kZWQgZm9yIENvbnRhaW5lciBHZW5lcmF0ZWQgQ29kZTwvQj4KKyAqIDxwPlNvbWUgbWV0aG9kcyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgdGhlCisgKiBjb250YWluZXIsIG5vdCBieSBjb2RlIHdyaXR0ZW4gYnkgSlNQIHBhZ2UgYXV0aG9ycywgb3IgSlNQIHRhZyBsaWJyYXJ5IAorICogYXV0aG9ycy4KKyAqIDxwPlRoZSBtZXRob2RzIHN1cHBvcnRpbmcgPEI+bGlmZWN5Y2xlPC9CPiBhcmUgPGNvZGU+aW5pdGlhbGl6ZSgpPC9jb2RlPgorICogYW5kIDxjb2RlPnJlbGVhc2UoKTwvY29kZT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBlbmFibGUgdGhlIDxCPm1hbmFnZW1lbnQgb2YgbmVzdGVkPC9CPiBKc3BXcml0ZXIgCisgKiBzdHJlYW1zIHRvIGltcGxlbWVudCBUYWcgRXh0ZW5zaW9uczogPGNvZGU+cHVzaEJvZHkoKTwvY29kZT4KKyAqCisgKiA8cD48Qj5NZXRob2RzIEludGVuZGVkIGZvciBKU1AgYXV0aG9yczwvQj4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBtZXRob2RzIHByb3ZpZGUgPEI+Y29udmVuaWVudCBhY2Nlc3M8L0I+IHRvIGltcGxpY2l0IG9iamVjdHM6CisgKiA8Y29kZT5nZXRFeGNlcHRpb24oKTwvY29kZT4sICA8Y29kZT5nZXRQYWdlKCk8L2NvZGU+CisgKiA8Y29kZT5nZXRSZXF1ZXN0KCk8L2NvZGU+LCAgPGNvZGU+Z2V0UmVzcG9uc2UoKTwvY29kZT4sCisgKiA8Y29kZT5nZXRTZXNzaW9uKCk8L2NvZGU+LCAgPGNvZGU+Z2V0U2VydmxldENvbmZpZygpPC9jb2RlPgorICogYW5kIDxjb2RlPmdldFNlcnZsZXRDb250ZXh0KCk8L2NvZGU+LgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBtZXRob2RzIHByb3ZpZGUgc3VwcG9ydCBmb3IgPEI+Zm9yd2FyZGluZywgaW5jbHVzaW9uCisgKiBhbmQgZXJyb3IgaGFuZGxpbmc8L0I+OgorICogPGNvZGU+Zm9yd2FyZCgpPC9jb2RlPiwgIDxjb2RlPmluY2x1ZGUoKTwvY29kZT4sCisgKiBhbmQgIDxjb2RlPmhhbmRsZVBhZ2VFeGNlcHRpb24oKTwvY29kZT4uCisgKi8KKworYWJzdHJhY3QgcHVibGljIGNsYXNzIFBhZ2VDb250ZXh0IAorICAgIGV4dGVuZHMgSnNwQ29udGV4dAoreworICAgIAorICAgIC8qKgorICAgICAqIFNvbGUgY29uc3RydWN0b3IuIChGb3IgaW52b2NhdGlvbiBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcnMsIAorICAgICAqIHR5cGljYWxseSBpbXBsaWNpdC4pCisgICAgICovCisgICAgcHVibGljIFBhZ2VDb250ZXh0KCkgeworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQYWdlIHNjb3BlOiAodGhpcyBpcyB0aGUgZGVmYXVsdCkgdGhlIG5hbWVkIHJlZmVyZW5jZSByZW1haW5zIGF2YWlsYWJsZQorICAgICAqIGluIHRoaXMgUGFnZUNvbnRleHQgdW50aWwgdGhlIHJldHVybiBmcm9tIHRoZSBjdXJyZW50IFNlcnZsZXQuc2VydmljZSgpCisgICAgICogaW52b2NhdGlvbi4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBR0VfU0NPUEUJCT0gMTsKKworICAgIC8qKgorICAgICAqIFJlcXVlc3Qgc2NvcGU6IHRoZSBuYW1lZCByZWZlcmVuY2UgcmVtYWlucyBhdmFpbGFibGUgZnJvbSB0aGUgCisgICAgICogU2VydmxldFJlcXVlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBTZXJ2bGV0IHVudGlsIHRoZSBjdXJyZW50IHJlcXVlc3QgCisgICAgICogaXMgY29tcGxldGVkLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9TQ09QRQk9IDI7CisKKyAgICAvKioKKyAgICAgKiBTZXNzaW9uIHNjb3BlIChvbmx5IHZhbGlkIGlmIHRoaXMgcGFnZSBwYXJ0aWNpcGF0ZXMgaW4gYSBzZXNzaW9uKToKKyAgICAgKiB0aGUgbmFtZWQgcmVmZXJlbmNlIHJlbWFpbnMgYXZhaWxhYmxlIGZyb20gdGhlIEh0dHBTZXNzaW9uIChpZiBhbnkpCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBTZXJ2bGV0IHVudGlsIHRoZSBIdHRwU2Vzc2lvbiBpcyBpbnZhbGlkYXRlZC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFU1NJT05fU0NPUEUJPSAzOworCisgICAgLyoqCisgICAgICogQXBwbGljYXRpb24gc2NvcGU6IG5hbWVkIHJlZmVyZW5jZSByZW1haW5zIGF2YWlsYWJsZSBpbiB0aGUgCisgICAgICogU2VydmxldENvbnRleHQgdW50aWwgaXQgaXMgcmVjbGFpbWVkLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQTElDQVRJT05fU0NPUEUJPSA0OworCisgICAgLyoqCisgICAgICogTmFtZSB1c2VkIHRvIHN0b3JlIHRoZSBTZXJ2bGV0IGluIHRoaXMgUGFnZUNvbnRleHQncyBuYW1ldGFibGVzLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRSA9ICJqYXZheC5zZXJ2bGV0LmpzcC5qc3BQYWdlIjsKKworICAgIC8qKgorICAgICAqIE5hbWUgdXNlZCB0byBzdG9yZSB0aGlzIFBhZ2VDb250ZXh0IGluIGl0J3Mgb3duIG5hbWUgdGFibGUuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFQ09OVEVYVCA9ICJqYXZheC5zZXJ2bGV0LmpzcC5qc3BQYWdlQ29udGV4dCI7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIHVzZWQgdG8gc3RvcmUgU2VydmxldFJlcXVlc3QgaW4gUGFnZUNvbnRleHQgbmFtZSB0YWJsZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1QgPSAiamF2YXguc2VydmxldC5qc3AuanNwUmVxdWVzdCI7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIHVzZWQgdG8gc3RvcmUgU2VydmxldFJlc3BvbnNlIGluIFBhZ2VDb250ZXh0IG5hbWUgdGFibGUuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRSA9ICJqYXZheC5zZXJ2bGV0LmpzcC5qc3BSZXNwb25zZSI7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIHVzZWQgdG8gc3RvcmUgU2VydmxldENvbmZpZyBpbiBQYWdlQ29udGV4dCBuYW1lIHRhYmxlLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHID0gImphdmF4LnNlcnZsZXQuanNwLmpzcENvbmZpZyI7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIHVzZWQgdG8gc3RvcmUgSHR0cFNlc3Npb24gaW4gUGFnZUNvbnRleHQgbmFtZSB0YWJsZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT04gPSAiamF2YXguc2VydmxldC5qc3AuanNwU2Vzc2lvbiI7CisgICAgLyoqCisgICAgICogTmFtZSB1c2VkIHRvIHN0b3JlIGN1cnJlbnQgSnNwV3JpdGVyIGluIFBhZ2VDb250ZXh0IG5hbWUgdGFibGUuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVQgPSAiamF2YXguc2VydmxldC5qc3AuanNwT3V0IjsKKworICAgIC8qKgorICAgICAqIE5hbWUgdXNlZCB0byBzdG9yZSBTZXJ2bGV0Q29udGV4dCBpbiBQYWdlQ29udGV4dCBuYW1lIHRhYmxlLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT04gPSAiamF2YXguc2VydmxldC5qc3AuanNwQXBwbGljYXRpb24iOworCisgICAgLyoqCisgICAgICogTmFtZSB1c2VkIHRvIHN0b3JlIHVuY2F1Z2h0IGV4Y2VwdGlvbiBpbiBTZXJ2bGV0UmVxdWVzdCBhdHRyaWJ1dGUgCisgICAgICogbGlzdCBhbmQgUGFnZUNvbnRleHQgbmFtZSB0YWJsZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTiA9ICJqYXZheC5zZXJ2bGV0LmpzcC5qc3BFeGNlcHRpb24iOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogVGhlIGluaXRpYWxpemUgbWV0aG9kIGlzIGNhbGxlZCB0byBpbml0aWFsaXplIGFuIHVuaW5pdGlhbGl6ZWQgUGFnZUNvbnRleHQKKyAgICAgKiBzbyB0aGF0IGl0IG1heSBiZSB1c2VkIGJ5IGEgSlNQIEltcGxlbWVudGF0aW9uIGNsYXNzIHRvIHNlcnZpY2UgYW4KKyAgICAgKiBpbmNvbWluZyByZXF1ZXN0IGFuZCByZXNwb25zZSB3aXRoaW4gaXQncyBfanNwU2VydmljZSgpIG1ldGhvZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSBjYWxsZWQgZnJvbSBKc3BGYWN0b3J5LmdldFBhZ2VDb250ZXh0KCkgaW4KKyAgICAgKiBvcmRlciB0byBpbml0aWFsaXplIHN0YXRlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGFuIGluaXRpYWwgSnNwV3JpdGVyLCBhbmQgYXNzb2NpYXRlCisgICAgICogdGhlICJvdXQiIG5hbWUgaW4gcGFnZSBzY29wZSB3aXRoIHRoaXMgbmV3bHkgY3JlYXRlZCBvYmplY3QuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgcGFnZSAgb3IgdGFnIGxpYnJhcnkgYXV0aG9ycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2bGV0IFRoZSBTZXJ2bGV0IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUGFnZUNvbnRleHQKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgY3VycmVudGx5IHBlbmRpbmcgcmVxdWVzdCBmb3IgdGhpcyBTZXJ2bGV0CisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBjdXJyZW50bHkgcGVuZGluZyByZXNwb25zZSBmb3IgdGhpcyBTZXJ2bGV0CisgICAgICogQHBhcmFtIGVycm9yUGFnZVVSTCBUaGUgdmFsdWUgb2YgdGhlIGVycm9ycGFnZSBhdHRyaWJ1dGUgZnJvbSB0aGUgcGFnZSAKKyAgICAgKiAgICAgZGlyZWN0aXZlIG9yIG51bGwKKyAgICAgKiBAcGFyYW0gbmVlZHNTZXNzaW9uIFRoZSB2YWx1ZSBvZiB0aGUgc2Vzc2lvbiBhdHRyaWJ1dGUgZnJvbSB0aGUgCisgICAgICogICAgIHBhZ2UgZGlyZWN0aXZlCisgICAgICogQHBhcmFtIGJ1ZmZlclNpemUgVGhlIHZhbHVlIG9mIHRoZSBidWZmZXIgYXR0cmlidXRlIGZyb20gdGhlIHBhZ2UgCisgICAgICogICAgIGRpcmVjdGl2ZQorICAgICAqIEBwYXJhbSBhdXRvRmx1c2ggVGhlIHZhbHVlIG9mIHRoZSBhdXRvZmx1c2ggYXR0cmlidXRlIGZyb20gdGhlIHBhZ2UgCisgICAgICogICAgIGRpcmVjdGl2ZQorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBkdXJpbmcgY3JlYXRpb24gb2YgSnNwV3JpdGVyCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgb3V0IG5vdCBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiBvbmUgb2YgdGhlIGdpdmVuIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgaXMgaW52YWxpZAorICAgICAqLworIAorICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIGluaXRpYWxpemUoU2VydmxldCBzZXJ2bGV0LCBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCAKKyAgICAgICAgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgZXJyb3JQYWdlVVJMLCBib29sZWFuIG5lZWRzU2Vzc2lvbiwgCisgICAgICAgIGludCBidWZmZXJTaXplLCBib29sZWFuIGF1dG9GbHVzaCkgIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2Qgc2hhbGwgInJlc2V0IiB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgYSBQYWdlQ29udGV4dCwgcmVsZWFzaW5nCisgICAgICogYWxsIGludGVybmFsIHJlZmVyZW5jZXMsIGFuZCBwcmVwYXJpbmcgdGhlIFBhZ2VDb250ZXh0IGZvciBwb3RlbnRpYWwKKyAgICAgKiByZXVzZSBieSBhIGxhdGVyIGludm9jYXRpb24gb2YgaW5pdGlhbGl6ZSgpLiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkKKyAgICAgKiBjYWxsZWQgZnJvbSBKc3BGYWN0b3J5LnJlbGVhc2VQYWdlQ29udGV4dCgpLgorICAgICAqCisgICAgICogPHA+CisgICAgICogU3ViY2xhc3NlcyBzaGFsbCBlbnZlbG9wZSB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCBieSBwYWdlICBvciB0YWcgbGlicmFyeSBhdXRob3JzLgorICAgICAqCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCByZWxlYXNlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2Vzc2lvbiBvYmplY3QgKGFuIEh0dHBTZXNzaW9uKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIEh0dHBTZXNzaW9uIGZvciB0aGlzIFBhZ2VDb250ZXh0IG9yIG51bGwKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcGFnZSBvYmplY3QgKEluIGEgU2VydmxldCBlbnZpcm9ubWVudCwgCisgICAgICogdGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBqYXZheC5zZXJ2bGV0LlNlcnZsZXQpLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgUGFnZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBpbnN0YW5jZSBhc3NvY2lhdGVkIAorICAgICAqICAgICB3aXRoIHRoaXMgUGFnZUNvbnRleHQKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyBPYmplY3QgZ2V0UGFnZSgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcmVxdWVzdCBvYmplY3QgKGEgU2VydmxldFJlcXVlc3QpLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgU2VydmxldFJlcXVlc3QgZm9yIHRoaXMgUGFnZUNvbnRleHQKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyBTZXJ2bGV0UmVxdWVzdCBnZXRSZXF1ZXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcmVzcG9uc2Ugb2JqZWN0IChhIFNlcnZsZXRSZXNwb25zZSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBTZXJ2bGV0UmVzcG9uc2UgZm9yIHRoaXMgUGFnZUNvbnRleHQKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyBTZXJ2bGV0UmVzcG9uc2UgZ2V0UmVzcG9uc2UoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBleGNlcHRpb24gb2JqZWN0IChhbiBFeGNlcHRpb24pLgorICAgICAqCisgICAgICogQHJldHVybiBhbnkgZXhjZXB0aW9uIHBhc3NlZCB0byB0aGlzIGFzIGFuIGVycm9ycGFnZQorICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKTsKKworICAgIC8qKgorICAgICAqIFRoZSBTZXJ2bGV0Q29uZmlnIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgU2VydmxldENvbmZpZyBmb3IgdGhpcyBQYWdlQ29udGV4dAorICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIFNlcnZsZXRDb25maWcgZ2V0U2VydmxldENvbmZpZygpOworCisgICAgLyoqCisgICAgICogVGhlIFNlcnZsZXRDb250ZXh0IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIFNlcnZsZXRDb250ZXh0IGZvciB0aGlzIFBhZ2VDb250ZXh0CisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKTsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmUtZGlyZWN0LCBvciAiZm9yd2FyZCIgdGhlIGN1cnJlbnQgCisgICAgICogU2VydmxldFJlcXVlc3QgYW5kIFNlcnZsZXRSZXNwb25zZSB0byBhbm90aGVyIGFjdGl2ZSBjb21wb25lbnQgaW4gCisgICAgICogdGhlIGFwcGxpY2F0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgPEk+IHJlbGF0aXZlVXJsUGF0aCA8L0k+IGJlZ2lucyB3aXRoIGEgIi8iIHRoZW4gdGhlIFVSTCBzcGVjaWZpZWQKKyAgICAgKiBpcyBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIHRoZSBET0NST09UIG9mIHRoZSA8Y29kZT4gU2VydmxldENvbnRleHQgPC9jb2RlPgorICAgICAqIGZvciB0aGlzIEpTUC4gSWYgdGhlIHBhdGggZG9lcyBub3QgYmVnaW4gd2l0aCBhICIvIiB0aGVuIHRoZSBVUkwgCisgICAgICogc3BlY2lmaWVkIGlzIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gdGhlIFVSTCBvZiB0aGUgcmVxdWVzdCB0aGF0IHdhcworICAgICAqIG1hcHBlZCB0byB0aGUgY2FsbGluZyBKU1AuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIG9ubHkgdmFsaWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIGEgPGNvZGU+IFRocmVhZCA8L2NvZGU+CisgICAgICogZXhlY3V0aW5nIHdpdGhpbiBhIDxjb2RlPiBfanNwU2VydmljZSguLi4pIDwvY29kZT4gbWV0aG9kIG9mIGEgSlNQLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBPbmNlIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCBzdWNjZXNzZnVsbHksIGl0IGlzIGlsbGVnYWwgZm9yIHRoZQorICAgICAqIGNhbGxpbmcgPGNvZGU+IFRocmVhZCA8L2NvZGU+IHRvIGF0dGVtcHQgdG8gbW9kaWZ5IHRoZSA8Y29kZT4KKyAgICAgKiBTZXJ2bGV0UmVzcG9uc2UgPC9jb2RlPiBvYmplY3QuICBBbnkgc3VjaCBhdHRlbXB0IHRvIGRvIHNvLCBzaGFsbCByZXN1bHQKKyAgICAgKiBpbiB1bmRlZmluZWQgYmVoYXZpb3IuIFR5cGljYWxseSwgY2FsbGVycyBpbW1lZGlhdGVseSByZXR1cm4gZnJvbSAKKyAgICAgKiA8Y29kZT4gX2pzcFNlcnZpY2UoLi4uKSA8L2NvZGU+IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHJlbGF0aXZlVXJsUGF0aCBzcGVjaWZpZXMgdGhlIHJlbGF0aXZlIFVSTCBwYXRoIHRvIHRoZSB0YXJnZXQgCisgICAgICogICAgIHJlc291cmNlIGFzIGRlc2NyaWJlZCBhYm92ZQorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+IFNlcnZsZXRSZXNwb25zZSA8L2NvZGU+IGlzIG5vdCAKKyAgICAgKiAgICAgaW4gYSBzdGF0ZSB3aGVyZSBhIGZvcndhcmQgY2FuIGJlIHBlcmZvcm1lZAorICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiBpZiB0aGUgcGFnZSB0aGF0IHdhcyBmb3J3YXJkZWQgdG8gdGhyb3dzCisgICAgICogICAgIGEgU2VydmxldEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3VycmVkIHdoaWxlIGZvcndhcmRpbmcKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIGZvcndhcmQoU3RyaW5nIHJlbGF0aXZlVXJsUGF0aCkgCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIENhdXNlcyB0aGUgcmVzb3VyY2Ugc3BlY2lmaWVkIHRvIGJlIHByb2Nlc3NlZCBhcyBwYXJ0IG9mIHRoZSBjdXJyZW50CisgICAgICogU2VydmxldFJlcXVlc3QgYW5kIFNlcnZsZXRSZXNwb25zZSBiZWluZyBwcm9jZXNzZWQgYnkgdGhlIGNhbGxpbmcgVGhyZWFkLgorICAgICAqIFRoZSBvdXRwdXQgb2YgdGhlIHRhcmdldCByZXNvdXJjZXMgcHJvY2Vzc2luZyBvZiB0aGUgcmVxdWVzdCBpcyB3cml0dGVuCisgICAgICogZGlyZWN0bHkgdG8gdGhlIFNlcnZsZXRSZXNwb25zZSBvdXRwdXQgc3RyZWFtLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY3VycmVudCBKc3BXcml0ZXIgIm91dCIgZm9yIHRoaXMgSlNQIGlzIGZsdXNoZWQgYXMgYSBzaWRlLWVmZmVjdAorICAgICAqIG9mIHRoaXMgY2FsbCwgcHJpb3IgdG8gcHJvY2Vzc2luZyB0aGUgaW5jbHVkZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogSWYgdGhlIDxJPiByZWxhdGl2ZVVybFBhdGggPC9JPiBiZWdpbnMgd2l0aCBhICIvIiB0aGVuIHRoZSBVUkwgc3BlY2lmaWVkCisgICAgICogaXMgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byB0aGUgRE9DUk9PVCBvZiB0aGUgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+CisgICAgICogZm9yIHRoaXMgSlNQLiBJZiB0aGUgcGF0aCBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgIi8iIHRoZW4gdGhlIFVSTCAKKyAgICAgKiBzcGVjaWZpZWQgaXMgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byB0aGUgVVJMIG9mIHRoZSByZXF1ZXN0IHRoYXQgd2FzCisgICAgICogbWFwcGVkIHRvIHRoZSBjYWxsaW5nIEpTUC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogSXQgaXMgb25seSB2YWxpZCB0byBjYWxsIHRoaXMgbWV0aG9kIGZyb20gYSA8Y29kZT4gVGhyZWFkIDwvY29kZT4KKyAgICAgKiBleGVjdXRpbmcgd2l0aGluIGEgPGNvZGU+IF9qc3BTZXJ2aWNlKC4uLikgPC9jb2RlPiBtZXRob2Qgb2YgYSBKU1AuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHJlbGF0aXZlVXJsUGF0aCBzcGVjaWZpZXMgdGhlIHJlbGF0aXZlIFVSTCBwYXRoIHRvIHRoZSB0YXJnZXQgCisgICAgICogICAgIHJlc291cmNlIHRvIGJlIGluY2x1ZGVkCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gaWYgdGhlIHBhZ2UgdGhhdCB3YXMgZm9yd2FyZGVkIHRvIHRocm93cworICAgICAqICAgICBhIFNlcnZsZXRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnJlZCB3aGlsZSBmb3J3YXJkaW5nCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgaW5jbHVkZShTdHJpbmcgcmVsYXRpdmVVcmxQYXRoKSAKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogQ2F1c2VzIHRoZSByZXNvdXJjZSBzcGVjaWZpZWQgdG8gYmUgcHJvY2Vzc2VkIGFzIHBhcnQgb2YgdGhlIGN1cnJlbnQKKyAgICAgKiBTZXJ2bGV0UmVxdWVzdCBhbmQgU2VydmxldFJlc3BvbnNlIGJlaW5nIHByb2Nlc3NlZCBieSB0aGUgY2FsbGluZyBUaHJlYWQuCisgICAgICogVGhlIG91dHB1dCBvZiB0aGUgdGFyZ2V0IHJlc291cmNlcyBwcm9jZXNzaW5nIG9mIHRoZSByZXF1ZXN0IGlzIHdyaXR0ZW4KKyAgICAgKiBkaXJlY3RseSB0byB0aGUgY3VycmVudCBKc3BXcml0ZXIgcmV0dXJuZWQgYnkgYSBjYWxsIHRvIGdldE91dCgpLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBmbHVzaCBpcyB0cnVlLCBUaGUgY3VycmVudCBKc3BXcml0ZXIgIm91dCIgZm9yIHRoaXMgSlNQIAorICAgICAqIGlzIGZsdXNoZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiB0aGlzIGNhbGwsIHByaW9yIHRvIHByb2Nlc3NpbmcgCisgICAgICogdGhlIGluY2x1ZGUuICBPdGhlcndpc2UsIHRoZSBKc3BXcml0ZXIgIm91dCIgaXMgbm90IGZsdXNoZWQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSA8aT5yZWxhdGl2ZVVybFBhdGg8L2k+IGJlZ2lucyB3aXRoIGEgIi8iIHRoZW4gdGhlIFVSTCBzcGVjaWZpZWQKKyAgICAgKiBpcyBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIHRoZSBET0NST09UIG9mIHRoZSA8Y29kZT5TZXJ2bGV0Q29udGV4dDwvY29kZT4KKyAgICAgKiBmb3IgdGhpcyBKU1AuIElmIHRoZSBwYXRoIGRvZXMgbm90IGJlZ2luIHdpdGggYSAiLyIgdGhlbiB0aGUgVVJMIAorICAgICAqIHNwZWNpZmllZCBpcyBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIHRoZSBVUkwgb2YgdGhlIHJlcXVlc3QgdGhhdCB3YXMKKyAgICAgKiBtYXBwZWQgdG8gdGhlIGNhbGxpbmcgSlNQLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBvbmx5IHZhbGlkIHRvIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBhIDxjb2RlPiBUaHJlYWQgPC9jb2RlPgorICAgICAqIGV4ZWN1dGluZyB3aXRoaW4gYSA8Y29kZT4gX2pzcFNlcnZpY2UoLi4uKSA8L2NvZGU+IG1ldGhvZCBvZiBhIEpTUC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVsYXRpdmVVcmxQYXRoIHNwZWNpZmllcyB0aGUgcmVsYXRpdmUgVVJMIHBhdGggdG8gdGhlIAorICAgICAqICAgICB0YXJnZXQgcmVzb3VyY2UgdG8gYmUgaW5jbHVkZWQKKyAgICAgKiBAcGFyYW0gZmx1c2ggVHJ1ZSBpZiB0aGUgSnNwV3JpdGVyIGlzIHRvIGJlIGZsdXNoZWQgYmVmb3JlIHRoZSBpbmNsdWRlLAorICAgICAqICAgICBvciBmYWxzZSBpZiBub3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gaWYgdGhlIHBhZ2UgdGhhdCB3YXMgZm9yd2FyZGVkIHRvIHRocm93cworICAgICAqICAgICBhIFNlcnZsZXRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnJlZCB3aGlsZSBmb3J3YXJkaW5nCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIGluY2x1ZGUoU3RyaW5nIHJlbGF0aXZlVXJsUGF0aCwgYm9vbGVhbiBmbHVzaCkgCisJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gcHJvY2VzcyBhbiB1bmhhbmRsZWQgJ3BhZ2UnIGxldmVsCisgICAgICogZXhjZXB0aW9uIGJ5IGZvcndhcmRpbmcgdGhlIGV4Y2VwdGlvbiB0byB0aGUgc3BlY2lmaWVkCisgICAgICogZXJyb3IgcGFnZSBmb3IgdGhpcyBKU1AuICBJZiBmb3J3YXJkaW5nIGlzIG5vdCBwb3NzaWJsZSAoZm9yCisgICAgICogZXhhbXBsZSBiZWNhdXNlIHRoZSByZXNwb25zZSBoYXMgYWxyZWFkeSBiZWVuIGNvbW1pdHRlZCksIGFuCisgICAgICogaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IG1lY2hhbmlzbSBzaG91bGQgYmUgdXNlZCB0byBpbnZva2UKKyAgICAgKiB0aGUgZXJyb3IgcGFnZSAoZS5nLiAiaW5jbHVkaW5nIiB0aGUgZXJyb3IgcGFnZSBpbnN0ZWFkKS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIElmIG5vIGVycm9yIHBhZ2UgaXMgZGVmaW5lZCBpbiB0aGUgcGFnZSwgdGhlIGV4Y2VwdGlvbiBzaG91bGQKKyAgICAgKiBiZSByZXRocm93biBzbyB0aGF0IHRoZSBzdGFuZGFyZCBzZXJ2bGV0IGVycm9yIGhhbmRsaW5nCisgICAgICogdGFrZXMgb3Zlci4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEEgSlNQIGltcGxlbWVudGF0aW9uIGNsYXNzIHNoYWxsIHR5cGljYWxseSBjbGVhbiB1cCBhbnkgbG9jYWwgc3RhdGUKKyAgICAgKiBwcmlvciB0byBpbnZva2luZyB0aGlzIGFuZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseSB0aGVyZWFmdGVyLiBJdCBpcworICAgICAqIGlsbGVnYWwgdG8gZ2VuZXJhdGUgYW55IG91dHB1dCB0byB0aGUgY2xpZW50LCBvciB0byBtb2RpZnkgYW55IAorICAgICAqIFNlcnZsZXRSZXNwb25zZSBzdGF0ZSBhZnRlciBpbnZva2luZyB0aGlzIGNhbGwuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBrZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJsaXR5IHJlYXNvbnMuICBOZXdseQorICAgICAqIGdlbmVyYXRlZCBjb2RlIHNob3VsZCB1c2UgUGFnZUNvbnRleHQuaGFuZGxlUGFnZUV4Y2VwdGlvbihUaHJvd2FibGUpLgorICAgICAqCisgICAgICogQHBhcmFtIGUgdGhlIGV4Y2VwdGlvbiB0byBiZSBoYW5kbGVkCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGludm9raW5nIHRoZSBlcnJvciBwYWdlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaW52b2tpbmcgdGhlIGVycm9yCisgICAgICogICAgIHBhZ2UKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBleGNlcHRpb24gaXMgbnVsbAorICAgICAqCisgICAgICogQHNlZSAjaGFuZGxlUGFnZUV4Y2VwdGlvbihUaHJvd2FibGUpCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBoYW5kbGVQYWdlRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSAKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gcHJvY2VzcyBhbiB1bmhhbmRsZWQgJ3BhZ2UnIGxldmVsCisgICAgICogZXhjZXB0aW9uIGJ5IGZvcndhcmRpbmcgdGhlIGV4Y2VwdGlvbiB0byB0aGUgc3BlY2lmaWVkCisgICAgICogZXJyb3IgcGFnZSBmb3IgdGhpcyBKU1AuICBJZiBmb3J3YXJkaW5nIGlzIG5vdCBwb3NzaWJsZSAoZm9yCisgICAgICogZXhhbXBsZSBiZWNhdXNlIHRoZSByZXNwb25zZSBoYXMgYWxyZWFkeSBiZWVuIGNvbW1pdHRlZCksIGFuCisgICAgICogaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IG1lY2hhbmlzbSBzaG91bGQgYmUgdXNlZCB0byBpbnZva2UKKyAgICAgKiB0aGUgZXJyb3IgcGFnZSAoZS5nLiAiaW5jbHVkaW5nIiB0aGUgZXJyb3IgcGFnZSBpbnN0ZWFkKS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIElmIG5vIGVycm9yIHBhZ2UgaXMgZGVmaW5lZCBpbiB0aGUgcGFnZSwgdGhlIGV4Y2VwdGlvbiBzaG91bGQKKyAgICAgKiBiZSByZXRocm93biBzbyB0aGF0IHRoZSBzdGFuZGFyZCBzZXJ2bGV0IGVycm9yIGhhbmRsaW5nCisgICAgICogdGFrZXMgb3Zlci4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIHRvIHByb2Nlc3MgYW4gdW5oYW5kbGVkICJwYWdlIiBsZXZlbCBleGNlcHRpb24KKyAgICAgKiBieSByZWRpcmVjdGluZyB0aGUgZXhjZXB0aW9uIHRvIGVpdGhlciB0aGUgc3BlY2lmaWVkIGVycm9yIHBhZ2UgZm9yIHRoaXMKKyAgICAgKiBKU1AsIG9yIGlmIG5vbmUgd2FzIHNwZWNpZmllZCwgdG8gcGVyZm9ybSBzb21lIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudAorICAgICAqIGFjdGlvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEEgSlNQIGltcGxlbWVudGF0aW9uIGNsYXNzIHNoYWxsIHR5cGljYWxseSBjbGVhbiB1cCBhbnkgbG9jYWwgc3RhdGUKKyAgICAgKiBwcmlvciB0byBpbnZva2luZyB0aGlzIGFuZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseSB0aGVyZWFmdGVyLiBJdCBpcworICAgICAqIGlsbGVnYWwgdG8gZ2VuZXJhdGUgYW55IG91dHB1dCB0byB0aGUgY2xpZW50LCBvciB0byBtb2RpZnkgYW55IAorICAgICAqIFNlcnZsZXRSZXNwb25zZSBzdGF0ZSBhZnRlciBpbnZva2luZyB0aGlzIGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdCB0aGUgdGhyb3dhYmxlIHRvIGJlIGhhbmRsZWQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgaW52b2tpbmcgdGhlIGVycm9yIHBhZ2UKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnJlZCB3aGlsZSBpbnZva2luZyB0aGUgZXJyb3IKKyAgICAgKiAgICAgcGFnZQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGV4Y2VwdGlvbiBpcyBudWxsCisgICAgICoKKyAgICAgKiBAc2VlICNoYW5kbGVQYWdlRXhjZXB0aW9uKEV4Y2VwdGlvbikKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIGhhbmRsZVBhZ2VFeGNlcHRpb24oVGhyb3dhYmxlIHQpIAorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuZXcgQm9keUNvbnRlbnQgb2JqZWN0LCBzYXZlIHRoZSBjdXJyZW50ICJvdXQiIEpzcFdyaXRlciwKKyAgICAgKiBhbmQgdXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgIm91dCIgYXR0cmlidXRlIGluIHRoZSBwYWdlIHNjb3BlCisgICAgICogYXR0cmlidXRlIG5hbWVzcGFjZSBvZiB0aGUgUGFnZUNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgQm9keUNvbnRlbnQKKyAgICAgKi8KKworICAgIHB1YmxpYyBCb2R5Q29udGVudCBwdXNoQm9keSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7IC8vIFhYWCB0byBpbXBsZW1lbnQKKyAgICB9CisgICAgICAgICAKKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIGNvbnZlbmllbnQgYWNjZXNzIHRvIGVycm9yIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBFcnJvckRhdGEgaW5zdGFuY2UgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgCisgICAgICogZXJyb3IsIGFzIG9idGFpbmVkIGZyb20gdGhlIHJlcXVlc3QgYXR0cmlidXRlcywgYXMgcGVyIHRoZSAKKyAgICAgKiBTZXJ2bGV0IHNwZWNpZmljYXRpb24uICBJZiB0aGlzIGlzIG5vdCBhbiBlcnJvciBwYWdlICh0aGF0IGlzLAorICAgICAqIGlmIHRoZSBpc0Vycm9yUGFnZSBhdHRyaWJ1dGUgb2YgdGhlIHBhZ2UgZGlyZWN0aXZlIGlzIG5vdCBzZXQKKyAgICAgKiB0byAidHJ1ZSIpLCB0aGUgaW5mb3JtYXRpb24gaXMgbWVhbmluZ2xlc3MuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi4wCisgICAgICovCisgICAgcHVibGljIEVycm9yRGF0YSBnZXRFcnJvckRhdGEoKSB7CisJcmV0dXJuIG5ldyBFcnJvckRhdGEoIAorCSAgICAoVGhyb3dhYmxlKWdldFJlcXVlc3QoKS5nZXRBdHRyaWJ1dGUoICJqYXZheC5zZXJ2bGV0LmVycm9yLmV4Y2VwdGlvbiIgKSwKKwkgICAgKChJbnRlZ2VyKWdldFJlcXVlc3QoKS5nZXRBdHRyaWJ1dGUoIAorCQkiamF2YXguc2VydmxldC5lcnJvci5zdGF0dXNfY29kZSIgKSkuaW50VmFsdWUoKSwKKwkgICAgKFN0cmluZylnZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlKCAiamF2YXguc2VydmxldC5lcnJvci5yZXF1ZXN0X3VyaSIgKSwKKwkgICAgKFN0cmluZylnZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlKCAiamF2YXguc2VydmxldC5lcnJvci5zZXJ2bGV0X25hbWUiICkgKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvU2tpcFBhZ2VFeGNlcHRpb24uamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9Ta2lwUGFnZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MDAxZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvU2tpcFBhZ2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3A7CisKKy8qKgorICogRXhjZXB0aW9uIHRvIGluZGljYXRlIHRoZSBjYWxsaW5nIHBhZ2UgbXVzdCBjZWFzZSBldmFsdWF0aW9uLgorICogVGhyb3duIGJ5IGEgc2ltcGxlIHRhZyBoYW5kbGVyIHRvIGluZGljYXRlIHRoYXQgdGhlIHJlbWFpbmRlciBvZiAKKyAqIHRoZSBwYWdlIG11c3Qgbm90IGJlIGV2YWx1YXRlZC4gIFRoZSByZXN1bHQgaXMgcHJvcGFnYXRlZCBiYWNrIHRvCisgKiB0aGUgcGFnZWluIHRoZSBjYXNlIHdoZXJlIG9uZSB0YWcgaW52b2tlcyBhbm90aGVyIChhcyBjYW4gYmUKKyAqIHRoZSBjYXNlIHdpdGggdGFnIGZpbGVzKS4gIFRoZSBlZmZlY3QgaXMgc2ltaWxhciB0byB0aGF0IG9mIGEgCisgKiBDbGFzc2ljIFRhZyBIYW5kbGVyIHJldHVybmluZyBUYWcuU0tJUF9QQUdFIGZyb20gZG9FbmRUYWcoKS4KKyAqIEpzcCBGcmFnbWVudHMgbWF5IGFsc28gdGhyb3cgdGhpcyBleGNlcHRpb24uICBUaGlzIGV4Y2VwdGlvbgorICogc2hvdWxkIG5vdCBiZSB0aHJvd24gbWFudWFsbHkgaW4gYSBKU1AgcGFnZSBvciB0YWcgZmlsZSAtIHRoZSBiZWhhdmlvciBpcworICogdW5kZWZpbmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB0aHJvd24gaW5zaWRlIAorICogU2ltcGxlVGFnIGhhbmRsZXJzIGFuZCBpbiBKU1AgZnJhZ21lbnRzLgorICogCisgKiBAc2VlIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5TaW1wbGVUYWcjZG9UYWcKKyAqIEBzZWUgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkpzcEZyYWdtZW50I2ludm9rZQorICogQHNlZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnI2RvRW5kVGFnCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBTa2lwUGFnZUV4Y2VwdGlvbgorICAgIGV4dGVuZHMgSnNwRXhjZXB0aW9uCit7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIFNraXBQYWdlRXhjZXB0aW9uIHdpdGggbm8gbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2tpcFBhZ2VFeGNlcHRpb24oKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBTa2lwUGFnZUV4Y2VwdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGRldGFpbCBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIFNraXBQYWdlRXhjZXB0aW9uKCBTdHJpbmcgbWVzc2FnZSApIHsKKyAgICAgICAgc3VwZXIoIG1lc3NhZ2UgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgU2tpcFBhZ2VFeGNlcHRpb24gd2l0aCB0aGUgcHJvdmlkZWQgbWVzc2FnZSBhbmQgcm9vdCBjYXVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBkZXRhaWwgbWVzc2FnZQorICAgICAqIEBwYXJhbSByb290Q2F1c2UgdGhlIG9yaWdpbmF0aW5nIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIFNraXBQYWdlRXhjZXB0aW9uKCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHJvb3RDYXVzZSApIHsKKwlzdXBlciggbWVzc2FnZSwgcm9vdENhdXNlICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIFNraXBQYWdlRXhjZXB0aW9uIHdpdGggdGhlIHByb3ZpZGVkIHJvb3QgY2F1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdENhdXNlIHRoZSBvcmlnaW5hdGluZyBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBTa2lwUGFnZUV4Y2VwdGlvbiggVGhyb3dhYmxlIHJvb3RDYXVzZSApIHsKKwlzdXBlciggcm9vdENhdXNlICk7CisgICAgfQorICAgIAorfQorCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9FTEV4Y2VwdGlvbi5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL2VsL0VMRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EyMGY3MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9FTEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLmVsOworCisKKy8qKgorICogUmVwcmVzZW50cyBhbnkgb2YgdGhlIGV4Y2VwdGlvbiBjb25kaXRpb25zIHRoYXQgYXJpc2UgZHVyaW5nIHRoZQorICogb3BlcmF0aW9uIGV2YWx1YXRpb24gb2YgdGhlIGV2YWx1YXRvci4KKyAqCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBFTEV4Y2VwdGlvbgorICBleHRlbmRzIEV4Y2VwdGlvbgoreworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gTWVtYmVyIHZhcmlhYmxlcworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBwcml2YXRlIFRocm93YWJsZSBtUm9vdENhdXNlOworCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvKioKKyAgICogQ3JlYXRlcyBhbiBFTEV4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbCBtZXNzYWdlLgorICAgKiovCisgIHB1YmxpYyBFTEV4Y2VwdGlvbiAoKQorICB7CisgICAgc3VwZXIgKCk7CisgIH0KKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLyoqCisgICAqIENyZWF0ZXMgYW4gRUxFeGNlcHRpb24gd2l0aCB0aGUgcHJvdmlkZWQgZGV0YWlsIG1lc3NhZ2UuCisgICAqCisgICAqIEBwYXJhbSBwTWVzc2FnZSB0aGUgZGV0YWlsIG1lc3NhZ2UKKyAgICoqLworICBwdWJsaWMgRUxFeGNlcHRpb24gKFN0cmluZyBwTWVzc2FnZSkKKyAgeworICAgIHN1cGVyIChwTWVzc2FnZSk7CisgIH0KKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLyoqCisgICAqIENyZWF0ZXMgYW4gRUxFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gcm9vdCBjYXVzZS4KKyAgICoKKyAgICogQHBhcmFtIHBSb290Q2F1c2UgdGhlIG9yaWdpbmF0aW5nIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uCisgICAqKi8KKyAgcHVibGljIEVMRXhjZXB0aW9uIChUaHJvd2FibGUgcFJvb3RDYXVzZSkKKyAgeworICAgIHN1cGVyKCBwUm9vdENhdXNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSApOworICAgIG1Sb290Q2F1c2UgPSBwUm9vdENhdXNlOworICB9CisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8qKgorICAgKiBDcmVhdGVzIGFuIEVMRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIGRldGFpbCBtZXNzYWdlIGFuZCByb290IGNhdXNlLgorICAgKgorICAgKiBAcGFyYW0gcE1lc3NhZ2UgdGhlIGRldGFpbCBtZXNzYWdlCisgICAqIEBwYXJhbSBwUm9vdENhdXNlIHRoZSBvcmlnaW5hdGluZyBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbgorICAgKiovCisgIHB1YmxpYyBFTEV4Y2VwdGlvbiAoU3RyaW5nIHBNZXNzYWdlLAorCQkgICAgICBUaHJvd2FibGUgcFJvb3RDYXVzZSkKKyAgeworICAgIHN1cGVyIChwTWVzc2FnZSk7CisgICAgbVJvb3RDYXVzZSA9IHBSb290Q2F1c2U7CisgIH0KKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHJvb3QgY2F1c2UuCisgICAqCisgICAqIEByZXR1cm4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Um9vdENhdXNlICgpCisgIHsKKyAgICByZXR1cm4gbVJvb3RDYXVzZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL2VsL0VMUGFyc2VFeGNlcHRpb24uamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9FTFBhcnNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI1Zjk3NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9FTFBhcnNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AuZWw7CisKKworLyoqCisgKiBSZXByZXNlbnRzIGEgcGFyc2luZyBlcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBwYXJzaW5nIGFuIEVMIGV4cHJlc3Npb24uCisgKgorICogQHNpbmNlIDIuMAorICovCisKK3B1YmxpYyBjbGFzcyBFTFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgRUxFeGNlcHRpb24geworCisgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8qKgorICAgKiBDcmVhdGVzIGFuIEVMUGFyc2VFeGNlcHRpb24gd2l0aCBubyBkZXRhaWwgbWVzc2FnZS4KKyAgICovCisgIHB1YmxpYyBFTFBhcnNlRXhjZXB0aW9uICgpCisgIHsKKyAgICBzdXBlciAoKTsKKyAgfQorCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvKioKKyAgICogQ3JlYXRlcyBhbiBFTFBhcnNlRXhjZXB0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGRldGFpbCBtZXNzYWdlLgorICAgKgorICAgKiBAcGFyYW0gcE1lc3NhZ2UgdGhlIGRldGFpbCBtZXNzYWdlCisgICAqKi8KKyAgcHVibGljIEVMUGFyc2VFeGNlcHRpb24gKFN0cmluZyBwTWVzc2FnZSkKKyAgeworICAgIHN1cGVyIChwTWVzc2FnZSk7CisgIH0KKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9FeHByZXNzaW9uLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvZWwvRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YjA5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvZWwvRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AuZWw7CisKKworLyoqCisgKiA8cD5UaGUgYWJzdHJhY3QgY2xhc3MgZm9yIGEgcHJlcGFyZWQgZXhwcmVzc2lvbi48L3A+CisgKgorICogPHA+QW4gaW5zdGFuY2Ugb2YgYW4gRXhwcmVzc2lvbiBjYW4gYmUgb2J0YWluZWQgdmlhIGZyb20gYW4gCisgKiBFeHByZXNzaW9uRXZhbHVhdG9yIGluc3RhbmNlLjwvcD4KKyAqCisgKiA8cD5BbiBFeHByZXNzaW9uIG1heSBvciBub3QgaGF2ZSBkb25lIGEgc3ludGFjdGljIHBhcnNlIG9mIHRoZSBleHByZXNzaW9uLgorICogQSBjbGllbnQgaW52b2tpbmcgdGhlIGV2YWx1YXRlKCkgbWV0aG9kIHNob3VsZCBiZSByZWFkeSBmb3IgdGhlIGNhc2UgCisgKiB3aGVyZSBFTFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbnMgYXJlIHJhaXNlZC4gPC9wPgorICoKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb24geworCisgICAgLyoqIAorICAgICAqIEV2YWx1YXRlcyBhbiBleHByZXNzaW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgcHJlcGFyZWQuICBJbiBzb21lIAorICAgICAqIGltcGxlbWVudGF0aW9ucyBwcmVwYXJpbmcgYW4gZXhwcmVzc2lvbiBpbnZvbHZlcyBmdWxsIHN5bnRhY3RpYyAKKyAgICAgKiB2YWxpZGF0aW9uLCBidXQgb3RoZXJzIG1heSBub3QgZG8gc28uICBFdmFsdWF0aW5nIHRoZSBleHByZXNzaW9uIG1heSAKKyAgICAgKiByYWlzZSBhbiBFTFBhcnNlRXhjZXB0aW9uIGFzIHdlbGwgYXMgb3RoZXIgRUxFeGNlcHRpb25zIGR1ZSB0byAKKyAgICAgKiBydW4tdGltZSBldmFsdWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHZSZXNvbHZlciBBIFZhcmlhYmxlUmVzb2x2ZXIgaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZCBhdCAKKyAgICAgKiAgIHJ1bnRpbWUgdG8gcmVzb2x2ZSB0aGUgbmFtZSBvZiBpbXBsaWNpdCBvYmplY3RzIGludG8gT2JqZWN0cy4KKyAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRUxFeGNlcHRpb24gVGhyb3duIGlmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRpb24gZmFpbGVkLgorICAgICAqLyAKKyAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGV2YWx1YXRlKCBWYXJpYWJsZVJlc29sdmVyIHZSZXNvbHZlciApCisgICAgICAgIHRocm93cyBFTEV4Y2VwdGlvbjsKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL2VsL0V4cHJlc3Npb25FdmFsdWF0b3IuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9FeHByZXNzaW9uRXZhbHVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2NmEzNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9FeHByZXNzaW9uRXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLmVsOworCisKKy8qKgorICogPHA+VGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFuIGV4cHJlc3Npb24tbGFuZ3VhZ2UgZXZhbHVhdG9yLgorICogQ2xhc3NlcyB0aGF0IGltcGxlbWVudCBhbiBleHByZXNzaW9uIGxhbmd1YWdlIGV4cG9zZSB0aGVpciBmdW5jdGlvbmFsaXR5CisgKiB2aWEgdGhpcyBhYnN0cmFjdCBjbGFzcy48L3A+CisgKgorICogPHA+QW4gaW5zdGFuY2Ugb2YgdGhlIEV4cHJlc3Npb25FdmFsdWF0b3IgY2FuIGJlIG9idGFpbmVkIHZpYSB0aGUgCisgKiBKc3BDb250ZXh0IC8gUGFnZUNvbnRleHQ8L3A+CisgKgorICogPHA+VGhlIHBhcnNlRXhwcmVzc2lvbigpIGFuZCBldmFsdWF0ZSgpIG1ldGhvZHMgbXVzdCBiZSB0aHJlYWQtc2FmZS4gIAorICogVGhhdCBpcywgbXVsdGlwbGUgdGhyZWFkcyBtYXkgY2FsbCB0aGVzZSBtZXRob2RzIG9uIHRoZSBzYW1lIAorICogRXhwcmVzc2lvbkV2YWx1YXRvciBvYmplY3Qgc2ltdWx0YW5lb3VzbHkuICBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIAorICogc3luY2hyb25pemUgYWNjZXNzIGlmIHRoZXkgZGVwZW5kIG9uIHRyYW5zaWVudCBzdGF0ZS4gIEltcGxlbWVudGF0aW9ucyAKKyAqIHNob3VsZCBub3QsIGhvd2V2ZXIsIGFzc3VtZSB0aGF0IG9ubHkgb25lIG9iamVjdCBvZiBlYWNoIAorICogRXhwcmVzc2lvbkV2YWx1YXRvciB0eXBlIHdpbGwgYmUgaW5zdGFudGlhdGVkOyBnbG9iYWwgY2FjaGluZyBzaG91bGQgCisgKiB0aGVyZWZvcmUgYmUgc3RhdGljLjwvcD4KKyAqCisgKiA8cD5Pbmx5IGEgc2luZ2xlIEVMIGV4cHJlc3Npb24sIHN0YXJ0aW5nIHdpdGggJyR7JyBhbmQgZW5kaW5nIHdpdGgKKyAqICd9JywgY2FuIGJlIHBhcnNlZCBvciBldmFsdWF0ZWQgYXQgYSB0aW1lLiAgRUwgZXhwcmVzc2lvbnMgCisgKiBjYW5ub3QgYmUgbWl4ZWQgd2l0aCBzdGF0aWMgdGV4dC4gIEZvciBleGFtcGxlLCBhdHRlbXB0aW5nIHRvIAorICogcGFyc2Ugb3IgZXZhbHVhdGUgIjxjb2RlPmFiYyR7MSsxfWRlZiR7MSsxfWdoaTwvY29kZT4iIG9yIGV2ZW4KKyAqICI8Y29kZT4kezErMX0kezErMX08L2NvZGU+IiB3aWxsIGNhdXNlIGFuIDxjb2RlPkVMRXhjZXB0aW9uPC9jb2RlPiB0bworICogYmUgdGhyb3duLjwvcD4KKyAqCisgKiA8cD5UaGUgZm9sbG93aW5nIGFyZSBleGFtcGxlcyBvZiBzeW50YWN0aWNhbGx5IGxlZ2FsIEVMIGV4cHJlc3Npb25zOgorICoKKyAqIDx1bD4KKyAqICAgPGxpPjxjb2RlPiR7cGVyc29uLmxhc3ROYW1lfTwvY29kZT48L2xpPgorICogICA8bGk+PGNvZGU+JHs4ICogOH08L2NvZGU+PC9saT4KKyAqICAgPGxpPjxjb2RlPiR7bXk6cmV2ZXJzZSgnaGVsbG8nKX08L2NvZGU+PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvbkV2YWx1YXRvciB7CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGFuIGV4cHJlc3Npb24gZm9yIGxhdGVyIGV2YWx1YXRpb24uICBUaGlzIG1ldGhvZCBzaG91bGQgcGVyZm9ybQorICAgICAqIHN5bnRhY3RpYyB2YWxpZGF0aW9uIG9mIHRoZSBleHByZXNzaW9uOyBpZiBpbiBkb2luZyBzbyBpdCBkZXRlY3RzIAorICAgICAqIGVycm9ycywgaXQgc2hvdWxkIHJhaXNlIGFuIEVMUGFyc2VFeGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBiZSBldmFsdWF0ZWQuCisgICAgICogQHBhcmFtIGV4cGVjdGVkVHlwZSBUaGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVzdWx0IG9mIHRoZSBldmFsdWF0aW9uCisgICAgICogQHBhcmFtIGZNYXBwZXIgQSBGdW5jdGlvbk1hcHBlciB0byByZXNvbHZlIGZ1bmN0aW9ucyBmb3VuZCBpbiAKKyAgICAgKiAgICAgdGhlIGV4cHJlc3Npb24uICBJdCBjYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSBubyBmdW5jdGlvbnMgCisgICAgICogICAgIGFyZSBzdXBwb3J0ZWQgZm9yIHRoaXMgaW52b2NhdGlvbi4gIFRoZSBFeHByZXNzaW9uRXZhbHVhdG9yIAorICAgICAqICAgICBtdXN0IG5vdCBob2xkIG9uIHRvIHRoZSBGdW5jdGlvbk1hcHBlciByZWZlcmVuY2UgYWZ0ZXIgCisgICAgICogICAgIHJldHVybmluZyBmcm9tIDxjb2RlPnBhcnNlRXhwcmVzc2lvbigpPC9jb2RlPi4gIFRoZSAKKyAgICAgKiAgICAgPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4gb2JqZWN0IHJldHVybmVkIG11c3QgaW52b2tlIHRoZSBzYW1lIAorICAgICAqICAgICBmdW5jdGlvbnMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBtYXBwaW5ncyBpbiB0aGUgCisgICAgICogICAgIHByb3ZpZGVkIDxjb2RlPkZ1bmN0aW9uTWFwcGVyPC9jb2RlPiBpbnN0YW5jZSBjaGFuZ2UgYmV0d2VlbiAKKyAgICAgKiAgICAgY2FsbGluZyA8Y29kZT5FeHByZXNzaW9uRXZhbHVhdG9yLnBhcnNlRXhwcmVzc2lvbigpPC9jb2RlPgorICAgICAqICAgICBhbmQgPGNvZGU+RXhwcmVzc2lvbi5ldmFsdWF0ZSgpPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIFRoZSBFeHByZXNzaW9uIG9iamVjdCBlbmNhcHN1bGF0aW5nIHRoZSBhcmd1bWVudHMuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEVMRXhjZXB0aW9uIFRocm93biBpZiBwYXJzaW5nIGVycm9ycyB3ZXJlIGZvdW5kLgorICAgICAqLyAKKyAgICBwdWJsaWMgYWJzdHJhY3QgRXhwcmVzc2lvbiBwYXJzZUV4cHJlc3Npb24oIFN0cmluZyBleHByZXNzaW9uLCAKKwkJCQkgICAgICAgQ2xhc3MgZXhwZWN0ZWRUeXBlLCAKKwkJCQkgICAgICAgRnVuY3Rpb25NYXBwZXIgZk1hcHBlciApIAorICAgICAgdGhyb3dzIEVMRXhjZXB0aW9uOyAKKworCisgICAgLyoqIAorICAgICAqIEV2YWx1YXRlcyBhbiBleHByZXNzaW9uLiAgVGhpcyBtZXRob2QgbWF5IHBlcmZvcm0gc29tZSBzeW50YWN0aWMgCisgICAgICogdmFsaWRhdGlvbiBhbmQsIGlmIHNvLCBpdCBzaG91bGQgcmFpc2UgYW4gRUxQYXJzZUV4Y2VwdGlvbiBlcnJvciBpZiAKKyAgICAgKiBpdCBlbmNvdW50ZXJzIHN5bnRhY3RpYyBlcnJvcnMuICBFTCBldmFsdWF0aW9uIGVycm9ycyBzaG91bGQgY2F1c2UgCisgICAgICogYW4gRUxFeGNlcHRpb24gdG8gYmUgcmFpc2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkLgorICAgICAqIEBwYXJhbSBleHBlY3RlZFR5cGUgVGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgZXZhbHVhdGlvbgorICAgICAqIEBwYXJhbSB2UmVzb2x2ZXIgQSBWYXJpYWJsZVJlc29sdmVyIGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgYXQgCisgICAgICogICAgIHJ1bnRpbWUgdG8gcmVzb2x2ZSB0aGUgbmFtZSBvZiBpbXBsaWNpdCBvYmplY3RzIGludG8gT2JqZWN0cy4KKyAgICAgKiBAcGFyYW0gZk1hcHBlciBBIEZ1bmN0aW9uTWFwcGVyIHRvIHJlc29sdmUgZnVuY3Rpb25zIGZvdW5kIGluIAorICAgICAqICAgICB0aGUgZXhwcmVzc2lvbi4gIEl0IGNhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlIG5vIGZ1bmN0aW9ucyAKKyAgICAgKiAgICAgYXJlIHN1cHBvcnRlZCBmb3IgdGhpcyBpbnZvY2F0aW9uLiAgCisgICAgICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBleHByZXNzaW9uIGV2YWx1YXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEVMRXhjZXB0aW9uIFRocm93biBpZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGZhaWxlZC4KKyAgICAgKi8gCisgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBldmFsdWF0ZSggU3RyaW5nIGV4cHJlc3Npb24sIAorCQkJICAgIENsYXNzIGV4cGVjdGVkVHlwZSwgCisJCQkgICAgVmFyaWFibGVSZXNvbHZlciB2UmVzb2x2ZXIsCisJCQkgICAgRnVuY3Rpb25NYXBwZXIgZk1hcHBlciApIAorICAgICAgdGhyb3dzIEVMRXhjZXB0aW9uOyAKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL2VsL0Z1bmN0aW9uTWFwcGVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvZWwvRnVuY3Rpb25NYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGI1ZmZjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL2VsL0Z1bmN0aW9uTWFwcGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AuZWw7CisKKy8qKgorICogPHA+VGhlIGludGVyZmFjZSB0byBhIG1hcCBiZXR3ZWVuIEVMIGZ1bmN0aW9uIG5hbWVzIGFuZCBtZXRob2RzLjwvcD4KKyAqCisgKiA8cD5DbGFzc2VzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBtYXksIGZvciBpbnN0YW5jZSwgY29uc3VsdCB0YWcgbGlicmFyeQorICogaW5mb3JtYXRpb24gdG8gcmVzb2x2ZSB0aGUgbWFwLiA8L3A+CisgKgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEZ1bmN0aW9uTWFwcGVyIHsKKyAgLyoqCisgICAqIFJlc29sdmVzIHRoZSBzcGVjaWZpZWQgbG9jYWwgbmFtZSBhbmQgcHJlZml4IGludG8gYSBKYXZhLmxhbmcuTWV0aG9kLgorICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHByZWZpeCBhbmQgbG9jYWwgbmFtZSBhcmUgbm90IGZvdW5kLgorICAgKiAKKyAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IG9mIHRoZSBmdW5jdGlvbiwgb3IgIiIgaWYgbm8gcHJlZml4LgorICAgKiBAcGFyYW0gbG9jYWxOYW1lIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBmdW5jdGlvbgorICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZCBtYXBwaW5nLiAgTnVsbCBtZWFucyBubyBlbnRyeSBmb3VuZC4KKyAgICoqLworICBwdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIHJlc29sdmVGdW5jdGlvbihTdHJpbmcgcHJlZml4LCAKKyAgICAgIFN0cmluZyBsb2NhbE5hbWUpOworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL2VsL1ZhcmlhYmxlUmVzb2x2ZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9WYXJpYWJsZVJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc0YTdhZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9WYXJpYWJsZVJlc29sdmVyLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AuZWw7CisKKy8qKgorICogPHA+VGhpcyBjbGFzcyBpcyB1c2VkIHRvIGN1c3RvbWl6ZSB0aGUgd2F5IGFuIEV4cHJlc3Npb25FdmFsdWF0b3IgcmVzb2x2ZXMKKyAqIHZhcmlhYmxlIHJlZmVyZW5jZXMgYXQgZXZhbHVhdGlvbiB0aW1lLiAgRm9yIGV4YW1wbGUsIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGNhbgorICogaW1wbGVtZW50IHRoZWlyIG93biB2YXJpYWJsZSBsb29rdXAgbWVjaGFuaXNtcywgb3IgaW50cm9kdWNlIHRoZQorICogbm90aW9uIG9mICJpbXBsaWNpdCB2YXJpYWJsZXMiIHdoaWNoIG92ZXJyaWRlIGFueSBvdGhlciB2YXJpYWJsZXMuCisgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHNob3VsZCBiZSBwYXNzZWQgd2hlbiBldmFsdWF0aW5nCisgKiBhbiBleHByZXNzaW9uLjwvcD4KKyAqCisgKiA8cD5BbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGluY2x1ZGVzIHRoZSBjb250ZXh0IGFnYWluc3Qgd2hpY2ggcmVzb2x1dGlvbgorICogd2lsbCBoYXBwZW48L3A+CisgKgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFZhcmlhYmxlUmVzb2x2ZXIKK3sKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8qKgorICAgKiBSZXNvbHZlcyB0aGUgc3BlY2lmaWVkIHZhcmlhYmxlLgorICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBmb3VuZC4KKyAgICogCisgICAqIEBwYXJhbSBwTmFtZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gcmVzb2x2ZQorICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIHZhcmlhYmxlIHJlc29sdXRpb24KKyAgICoKKyAgICogQHRocm93cyBFTEV4Y2VwdGlvbiBpZiBhIGZhaWx1cmUgb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHJlc29sdmUKKyAgICogICAgIHRoZSBnaXZlbiB2YXJpYWJsZQorICAgKiovCisgIHB1YmxpYyBPYmplY3QgcmVzb2x2ZVZhcmlhYmxlIChTdHJpbmcgcE5hbWUpCisgICAgdGhyb3dzIEVMRXhjZXB0aW9uOworCQkJCQkKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvZWwvcGFja2FnZS5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL2VsL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGVhZmJiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL2VsL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDc1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPCEtLQorICAtIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAgLQorICAtIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICAtIHJlc2VydmVkLgorICAtCisgIC0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIC0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIC0gYXJlIG1ldDoKKyAgLQorICAtIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgIC0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAgLQorICAtIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgIC0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgIC0gICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICAtICAgIGRpc3RyaWJ1dGlvbi4KKyAgLQorICAtIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICAtICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKKyAgLSAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCisgIC0gICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgIC0gICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICAtICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgIC0KKyAgLSA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiVG9tY2F0IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAgLSAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgIC0gICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKKyAgLSAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAgLQorICAtIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgIC0gICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgIC0gICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICAtCisgIC0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICAtIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgIC0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgLSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgIC0gSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICAtIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAgLSBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgIC0gVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICAtIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAtIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICAtIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICAtIFNVQ0ggREFNQUdFLgorICAtID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC0KKyAgLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICAtIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICAtIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICAtIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAgLQorICAtLT4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IndoaXRlIj4KKworQ2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBmb3IgdGhlIEpTUCAyLjAgRXhwcmVzc2lvbiBMYW5ndWFnZSBBUEkuCisKKzxwPgorVGhlIEphdmFTZXJ2ZXIgUGFnZXModG0pIChKU1ApIDIuMCBzcGVjaWZpY2F0aW9uIHByb3ZpZGVzIGEgcG9ydGFibGUKK0FQSSBmb3IgZXZhbHVhdGluZyAiRUwgRXhwcmVzc2lvbnMiLiAgQXMgb2YgSlNQIDIuMCwgRUwgZXhwcmVzc2lvbnMgY2FuCitiZSBwbGFjZWQgZGlyZWN0bHkgaW4gdGhlIHRlbXBsYXRlIHRleHQgb2YgSlNQIHBhZ2VzIGFuZCB0YWcgZmlsZXMuCis8cD4KK1RoaXMgcGFja2FnZSBjb250YWlucyBhIG51bWJlciBvZiBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIHRoYXQgZGVzY3JpYmUgCithbmQgZGVmaW5lIHByb2dyYW1tYXRpYyBhY2Nlc3MgdG8gdGhlIEV4cHJlc3Npb24gTGFuZ3VhZ2UgZXZhbHVhdG9yLiAKK1RoaXMgQVBJIGNhbiBhbHNvIGJlIHVzZWQgYnkgYW4gaW1wbGVtZW50YXRpb24gb2YgSlNQIHRvIGV2YWx1YXRlIHRoZSAKK2V4cHJlc3Npb25zLCBidXQgb3RoZXIgaW1wbGVtZW50YXRpb25zLCBsaWtlIG9wZW4tY29kaW5nIGludG8gSmF2YSAKK2J5dGVjb2RlcywgYXJlIGFsbG93ZWQuICBUaGlzIHBhY2thZ2UgaXMgaW50ZW5kZWQgdG8gaGF2ZSBubyBkZXBlbmRlbmNpZXMgCitvbiBvdGhlciBwb3J0aW9ucyBvZiB0aGUgSlNQIDIuMCBzcGVjaWZpY2F0aW9uLiAKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9wYWNrYWdlLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZWFmYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsNjcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8IS0tCisgIC0gVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICAtCisgIC0gQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCisgIC0gcmVzZXJ2ZWQuCisgIC0KKyAgLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgLSBhcmUgbWV0OgorICAtCisgIC0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICAtCisgIC0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAgLSAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgIC0gICAgZGlzdHJpYnV0aW9uLgorICAtCisgIC0gMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgIC0gICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAorICAtICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKKyAgLSAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAgLSAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgIC0gICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAgLQorICAtIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJUb21jYXQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICAtICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgLSAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAorICAtICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICAtCisgIC0gNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAgLSAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgLSAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgIC0KKyAgLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgIC0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAgLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAtIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAgLSBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgIC0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICAtIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAgLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgIC0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgIC0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgIC0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgIC0gU1VDSCBEQU1BR0UuCisgIC0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLQorICAtIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgIC0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgIC0gaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgIC0gPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICAtCisgIC0tPgorPC9oZWFkPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorQ2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBmb3IgdGhlIENvcmUgSlNQIDIuMCBBUEkuCis8cD4KK1RoZSBqYXZheC5zZXJ2bGV0LmpzcCBwYWNrYWdlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIGNsYXNzZXMgYW5kCitpbnRlcmZhY2VzIHRoYXQgZGVzY3JpYmUgYW5kIGRlZmluZSB0aGUgY29udHJhY3RzIGJldHdlZW4gYSBKU1AgcGFnZQoraW1wbGVtZW50YXRpb24gY2xhc3MgYW5kIHRoZSBydW50aW1lIGVudmlyb25tZW50IHByb3ZpZGVkIGZvciBhbgoraW5zdGFuY2Ugb2Ygc3VjaCBhIGNsYXNzIGJ5IGEgY29uZm9ybWluZyBKU1AgY29udGFpbmVyLgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9Cb2R5Q29udGVudC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9Cb2R5Q29udGVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Mzc1YjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L0JvZHlDb250ZW50LmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLyAKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC4qOworCisvKioKKyAqIEFuIGVuY2Fwc3VsYXRpb24gb2YgdGhlIGV2YWx1YXRpb24gb2YgdGhlIGJvZHkgb2YgYW4gYWN0aW9uIHNvIGl0IGlzCisgKiBhdmFpbGFibGUgdG8gYSB0YWcgaGFuZGxlci4gIEJvZHlDb250ZW50IGlzIGEgc3ViY2xhc3Mgb2YgSnNwV3JpdGVyLgorICoKKyAqIDxwPgorICogTm90ZSB0aGF0IHRoZSBjb250ZW50IG9mIEJvZHlDb250ZW50IGlzIHRoZSByZXN1bHQgb2YgZXZhbHVhdGlvbiwgc28KKyAqIGl0IHdpbGwgbm90IGNvbnRhaW4gYWN0aW9ucyBhbmQgdGhlIGxpa2UsIGJ1dCB0aGUgcmVzdWx0IG9mIHRoZWlyCisgKiBpbnZvY2F0aW9uLgorICogCisgKiA8cD4KKyAqIEJvZHlDb250ZW50IGhhcyBtZXRob2RzIHRvIGNvbnZlcnQgaXRzIGNvbnRlbnRzIGludG8KKyAqIGEgU3RyaW5nLCB0byByZWFkIGl0cyBjb250ZW50cywgYW5kIHRvIGNsZWFyIHRoZSBjb250ZW50cy4KKyAqCisgKiA8cD4KKyAqIFRoZSBidWZmZXIgc2l6ZSBvZiBhIEJvZHlDb250ZW50IG9iamVjdCBpcyB1bmJvdW5kZWQuICBBCisgKiBCb2R5Q29udGVudCBvYmplY3QgY2Fubm90IGJlIGluIGF1dG9GbHVzaCBtb2RlLiAgSXQgaXMgbm90IHBvc3NpYmxlIHRvCisgKiBpbnZva2UgZmx1c2ggb24gYSBCb2R5Q29udGVudCBvYmplY3QsIGFzIHRoZXJlIGlzIG5vIGJhY2tpbmcgc3RyZWFtLgorICoKKyAqIDxwPgorICogSW5zdGFuY2VzIG9mIEJvZHlDb250ZW50IGFyZSBjcmVhdGVkIGJ5IGludm9raW5nIHRoZSBwdXNoQm9keSBhbmQKKyAqIHBvcEJvZHkgbWV0aG9kcyBvZiB0aGUgUGFnZUNvbnRleHQgY2xhc3MuICBBIEJvZHlDb250ZW50IGlzIGVuY2xvc2VkCisgKiB3aXRoaW4gYW5vdGhlciBKc3BXcml0ZXIgKG1heWJlIGFub3RoZXIgQm9keUNvbnRlbnQgb2JqZWN0KSBmb2xsb3dpbmcKKyAqIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlaXIgYXNzb2NpYXRlZCBhY3Rpb25zLgorICoKKyAqIDxwPgorICogQSBCb2R5Q29udGVudCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhIEJvZHlUYWcgdGhyb3VnaCBhIHNldEJvZHlDb250ZW50KCkKKyAqIGNhbGwuICBUaGUgdGFnIGhhbmRsZXIgY2FuIHVzZSB0aGUgb2JqZWN0IHVudGlsIGFmdGVyIHRoZSBjYWxsIHRvCisgKiBkb0VuZFRhZygpLgorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCb2R5Q29udGVudCBleHRlbmRzIEpzcFdyaXRlciB7CisgICAgCisgICAgLyoqCisgICAgICogUHJvdGVjdGVkIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogVW5ib3VuZGVkIGJ1ZmZlciwgbm8gYXV0b2ZsdXNoaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGUgdGhlIGVuY2xvc2luZyBKc3BXcml0ZXIKKyAgICAgKi8KKworICAgIHByb3RlY3RlZCBCb2R5Q29udGVudChKc3BXcml0ZXIgZSkgeworCXN1cGVyKFVOQk9VTkRFRF9CVUZGRVIgLCBmYWxzZSk7CisJdGhpcy5lbmNsb3NpbmdXcml0ZXIgPSBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZGVmaW5lZCBmbHVzaCgpIHNvIGl0IGlzIG5vdCBsZWdhbC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIG5vdCB2YWxpZCB0byBmbHVzaCBhIEJvZHlDb250ZW50IGJlY2F1c2UgdGhlcmUgaXMgbm8gYmFja2luZworICAgICAqIHN0cmVhbSBiZWhpbmQgaXQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGFsd2F5cyB0aHJvd24KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIklsbGVnYWwgdG8gZmx1c2ggd2l0aGluIGEgY3VzdG9tIHRhZyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIHRoZSBib2R5IHdpdGhvdXQgdGhyb3dpbmcgYW55IGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgY2xlYXJCb2R5KCkgeworCXRyeSB7CisJICAgIHRoaXMuY2xlYXIoKTsKKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworCSAgICAvLyBUT0RPIC0tIGNsZWFuIHRoaXMgb25lIHVwLgorCSAgICB0aHJvdyBuZXcgRXJyb3IoImludGVybmFsIGVycm9yITsiKTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIEJvZHlDb250ZW50IGFzIGEgUmVhZGVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyBCb2R5Q29udGVudCBhcyBhIFJlYWRlcgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBSZWFkZXIgZ2V0UmVhZGVyKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIEJvZHlDb250ZW50IGFzIGEgU3RyaW5nLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIEJvZHlDb250ZW50IGFzIGEgU3RyaW5nCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdHJpbmcoKTsKKwkKKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGlzIEJvZHlDb250ZW50IGludG8gYSBXcml0ZXIuCisgICAgICogU3ViY2xhc3NlcyBtYXkgb3B0aW1pemUgY29tbW9uIGludm9jYXRpb24gcGF0dGVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0IFRoZSB3cml0ZXIgaW50byB3aGljaCB0byBwbGFjZSB0aGUgY29udGVudHMgb2YKKyAgICAgKiAgICAgdGhpcyBib2R5IGV2YWx1YXRpb24KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIHRoZQorICAgICAqICAgICBjb250ZW50cyBvZiB0aGlzIEJvZHlDb250ZW50IHRvIHRoZSBnaXZlbiBXcml0ZXIKKyAgICAgKi8KKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlT3V0KFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBlbmNsb3NpbmcgSnNwV3JpdGVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZW5jbG9zaW5nIEpzcFdyaXRlciBwYXNzZWQgYXQgY29uc3RydWN0aW9uIHRpbWUKKyAgICAgKi8KKworICAgIHB1YmxpYyBKc3BXcml0ZXIgZ2V0RW5jbG9zaW5nV3JpdGVyKCkgeworCXJldHVybiBlbmNsb3NpbmdXcml0ZXI7CisgICAgfQorCisKKyAgICAvLyBwcml2YXRlIGZpZWxkcworCisgICAgcHJpdmF0ZSBKc3BXcml0ZXIgZW5jbG9zaW5nV3JpdGVyOworIH0KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvQm9keVRhZy5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9Cb2R5VGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1M2QyMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvQm9keVRhZy5qYXZhCkBAIC0wLDAgKzEsMTg2IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuKjsKKworLyoqCisgKiBUaGUgQm9keVRhZyBpbnRlcmZhY2UgZXh0ZW5kcyBJdGVyYXRpb25UYWcgYnkgZGVmaW5pbmcgYWRkaXRpb25hbAorICogbWV0aG9kcyB0aGF0IGxldCBhIHRhZyBoYW5kbGVyIG1hbmlwdWxhdGUgdGhlIGNvbnRlbnQgb2YgZXZhbHVhdGluZyBpdHMgYm9keS4KKyAqCisgKiA8cD4KKyAqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdGFnIGhhbmRsZXIgdG8gbWFuaXB1bGF0ZSB0aGUgYm9keQorICogY29udGVudC4gIEZvciBleGFtcGxlIHRoZSB0YWcgaGFuZGxlciBtYXkgdGFrZSB0aGUgYm9keSBjb250ZW50LAorICogY29udmVydCBpdCBpbnRvIGEgU3RyaW5nIHVzaW5nIHRoZSBib2R5Q29udGVudC5nZXRTdHJpbmcKKyAqIG1ldGhvZCBhbmQgdGhlbiB1c2UgaXQuICBPciB0aGUgdGFnIGhhbmRsZXIgbWF5IHRha2UgdGhlIGJvZHkKKyAqIGNvbnRlbnQgYW5kIHdyaXRlIGl0IG91dCBpbnRvIGl0cyBlbmNsb3NpbmcgSnNwV3JpdGVyIHVzaW5nCisgKiB0aGUgYm9keUNvbnRlbnQud3JpdGVPdXQgbWV0aG9kLgorICoKKyAqIDxwPiBBIHRhZyBoYW5kbGVyIHRoYXQgaW1wbGVtZW50cyBCb2R5VGFnIGlzIHRyZWF0ZWQgYXMgb25lIHRoYXQKKyAqIGltcGxlbWVudHMgSXRlcmF0aW9uVGFnLCBleGNlcHQgdGhhdCB0aGUgZG9TdGFydFRhZyBtZXRob2QgY2FuCisgKiByZXR1cm4gU0tJUF9CT0RZLCBFVkFMX0JPRFlfSU5DTFVERSBvciBFVkFMX0JPRFlfQlVGRkVSRUQuCisgKgorICogPHA+CisgKiBJZiBFVkFMX0JPRFlfSU5DTFVERSBpcyByZXR1cm5lZCwgdGhlbiBldmFsdWF0aW9uIGhhcHBlbnMKKyAqIGFzIGluIEl0ZXJhdGlvblRhZy4KKyAqCisgKiA8cD4KKyAqIElmIEVWQUxfQk9EWV9CVUZGRVJFRCBpcyByZXR1cm5lZCwgdGhlbiBhIEJvZHlDb250ZW50IG9iamVjdCB3aWxsIGJlCisgKiBjcmVhdGVkIChieSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgSlNQIGNvbXBpbGVyKSB0byBjYXB0dXJlIHRoZSBib2R5CisgKiBldmFsdWF0aW9uLgorICogVGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBKU1AgY29tcGlsZXIgb2J0YWlucyB0aGUgQm9keUNvbnRlbnQgb2JqZWN0IGJ5CisgKiBjYWxsaW5nIHRoZSBwdXNoQm9keSBtZXRob2Qgb2YgdGhlIGN1cnJlbnQgcGFnZUNvbnRleHQsIHdoaWNoCisgKiBhZGRpdGlvbmFsbHkgaGFzIHRoZSBlZmZlY3Qgb2Ygc2F2aW5nIHRoZSBwcmV2aW91cyBvdXQgdmFsdWUuCisgKiBUaGUgcGFnZSBjb21waWxlciByZXR1cm5zIHRoaXMgb2JqZWN0IGJ5IGNhbGxpbmcgdGhlIHBvcEJvZHkKKyAqIG1ldGhvZCBvZiB0aGUgUGFnZUNvbnRleHQgY2xhc3M7CisgKiB0aGUgY2FsbCBhbHNvIHJlc3RvcmVzIHRoZSB2YWx1ZSBvZiBvdXQuCisgKgorICogPHA+CisgKiBUaGUgaW50ZXJmYWNlIHByb3ZpZGVzIG9uZSBuZXcgcHJvcGVydHkgd2l0aCBhIHNldHRlciBtZXRob2QgYW5kIG9uZQorICogbmV3IGFjdGlvbiBtZXRob2QuCisgKgorICogPHA+PEI+UHJvcGVydGllczwvQj4KKyAqIDxwPiBUaGVyZSBpcyBhIG5ldyBwcm9wZXJ0eTogYm9keUNvbnRlbnQsIHRvIGNvbnRhaW4gdGhlIEJvZHlDb250ZW50CisgKiBvYmplY3QsIHdoZXJlIHRoZSBKU1AgUGFnZSBpbXBsZW1lbnRhdGlvbiBvYmplY3Qgd2lsbCBwbGFjZSB0aGUKKyAqIGV2YWx1YXRpb24gKGFuZCByZWV2YWx1YXRpb24sIGlmIGFwcHJvcHJpYXRlKSBvZiB0aGUgYm9keS4gIFRoZSBzZXR0ZXIKKyAqIG1ldGhvZCAoc2V0Qm9keUNvbnRlbnQpIHdpbGwgb25seSBiZSBpbnZva2VkIGlmIGRvU3RhcnRUYWcoKSByZXR1cm5zCisgKiBFVkFMX0JPRFlfQlVGRkVSRUQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGFjdGlvbiBlbGVtZW50IGRvZXMgbm90IGhhdmUKKyAqIGFuIGVtcHR5IGJvZHkuCisgKgorICogPHA+PEI+TWV0aG9kczwvQj4KKyAqIDxwPiBJbiBhZGRpdGlvbiB0byB0aGUgc2V0dGVyIG1ldGhvZCBmb3IgdGhlIGJvZHlDb250ZW50IHByb3BlcnR5LCB0aGVyZQorICogaXMgYSBuZXcgYWN0aW9uIG1ldGhvZDogZG9Jbml0Qm9keSgpLCB3aGljaCBpcyBpbnZva2VkIHJpZ2h0IGFmdGVyCisgKiBzZXRCb2R5Q29udGVudCgpIGFuZCBiZWZvcmUgdGhlIGJvZHkgZXZhbHVhdGlvbi4gIFRoaXMgbWV0aG9kIGlzIG9ubHkKKyAqIGludm9rZWQgaWYgZG9TdGFydFRhZygpIHJldHVybnMgRVZBTF9CT0RZX0JVRkZFUkVELgorICoKKyAqIDxwPjxCPkxpZmVjeWNsZTwvQj4KKyAqIDxwPiBMaWZlY3ljbGUgZGV0YWlscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSB0cmFuc2l0aW9uIGRpYWdyYW0gYmVsb3cuCisgKiBFeGNlcHRpb25zIHRoYXQgYXJlIHRocm93biBkdXJpbmcgdGhlIGNvbXB1dGF0aW9uIG9mIGRvU3RhcnRUYWcoKSwKKyAqIHNldEJvZHlDb250ZW50KCksIGRvSW5pdEJvZHkoKSwgQk9EWSwgZG9BZnRlckJvZHkoKSBpbnRlcnJ1cHQgdGhlCisgKiBleGVjdXRpb24gc2VxdWVuY2UgYW5kIGFyZSBwcm9wYWdhdGVkIHVwIHRoZSBzdGFjaywgdW5sZXNzIHRoZQorICogdGFnIGhhbmRsZXIgaW1wbGVtZW50cyB0aGUgVHJ5Q2F0Y2hGaW5hbGx5IGludGVyZmFjZTsgc2VlIHRoYXQKKyAqIGludGVyZmFjZSBmb3IgZGV0YWlscy4KKyAqIDxwPgorICogPElNRyBzcmM9ImRvYy1maWxlcy9Cb2R5VGFnUHJvdG9jb2wuZ2lmIgorICogICAgICBhbHQ9IkxpZmVjeWNsZSBEZXRhaWxzIFRyYW5zaXRpb24gRGlhZ3JhbSBmb3IgQm9keVRhZyIvPgorICoKKyAqIDxwPjxCPkVtcHR5IGFuZCBOb24tRW1wdHkgQWN0aW9uPC9CPgorICogPHA+IElmIHRoZSBUYWdMaWJyYXJ5RGVzY3JpcHRvciBmaWxlIGluZGljYXRlcyB0aGF0IHRoZSBhY3Rpb24gbXVzdAorICogYWx3YXlzIGhhdmUgYW4gZW1wdHkgZWxlbWVudCBib2R5LCBieSBhbiAmbHQ7Ym9keS1jb250ZW50Jmd0OyBlbnRyeSAKKyAqIG9mICJlbXB0eSIsIHRoZW4gdGhlIGRvU3RhcnRUYWcoKSBtZXRob2QgbXVzdCByZXR1cm4gU0tJUF9CT0RZLgorICogT3RoZXJ3aXNlLCB0aGUgZG9TdGFydFRhZygpIG1ldGhvZCBtYXkgcmV0dXJuIFNLSVBfQk9EWSwKKyAqIEVWQUxfQk9EWV9JTkNMVURFLCBvciBFVkFMX0JPRFlfQlVGRkVSRUQuCisgKgorICogPHA+Tm90ZSB0aGF0IHdoaWNoIG1ldGhvZHMgYXJlIGludm9rZWQgYWZ0ZXIgdGhlIGRvU3RhcnRUYWcoKSBkZXBlbmRzIG9uIAorICogYm90aCB0aGUgcmV0dXJuIHZhbHVlIGFuZCBvbiBpZiB0aGUgY3VzdG9tIGFjdGlvbiBlbGVtZW50IGlzIGVtcHR5CisgKiBvciBub3QgaW4gdGhlIEpTUCBwYWdlLCBub3QgaG93IGl0J3MgZGVjbGFyZWQgaW4gdGhlIFRMRC4KKyAqCisgKiA8cD4KKyAqIElmIFNLSVBfQk9EWSBpcyByZXR1cm5lZCB0aGUgYm9keSBpcyBub3QgZXZhbHVhdGVkLCBhbmQgZG9FbmRUYWcoKSBpcworICogaW52b2tlZC4KKyAqCisgKiA8cD4KKyAqIElmIEVWQUxfQk9EWV9JTkNMVURFIGlzIHJldHVybmVkLCBhbmQgdGhlIGN1c3RvbSBhY3Rpb24gZWxlbWVudCBpcyBub3QKKyAqIGVtcHR5LCBzZXRCb2R5Q29udGVudCgpIGlzIG5vdCBpbnZva2VkLAorICogZG9Jbml0Qm9keSgpIGlzIG5vdCBpbnZva2VkLCB0aGUgYm9keSBpcyBldmFsdWF0ZWQgYW5kCisgKiAicGFzc2VkIHRocm91Z2giIHRvIHRoZSBjdXJyZW50IG91dCwgZG9BZnRlckJvZHkoKSBpcyBpbnZva2VkCisgKiBhbmQgdGhlbiwgYWZ0ZXIgemVybyBvciBtb3JlIGl0ZXJhdGlvbnMsIGRvRW5kVGFnKCkgaXMgaW52b2tlZC4KKyAqIElmIHRoZSBjdXN0b20gYWN0aW9uIGVsZW1lbnQgaXMgZW1wdHksIG9ubHkgZG9TdGFydCgpIGFuZCAKKyAqIGRvRW5kVGFnKCkgYXJlIGludm9rZWQuCisgKgorICogPHA+CisgKiBJZiBFVkFMX0JPRFlfQlVGRkVSRUQgaXMgcmV0dXJuZWQsIGFuZCB0aGUgY3VzdG9tIGFjdGlvbiBlbGVtZW50IGlzIG5vdAorICogZW1wdHksIHNldEJvZHlDb250ZW50KCkgaXMgaW52b2tlZCwKKyAqIGRvSW5pdEJvZHkoKSBpcyBpbnZva2VkLCB0aGUgYm9keSBpcyBldmFsdWF0ZWQsIGRvQWZ0ZXJCb2R5KCkgaXMKKyAqIGludm9rZWQsIGFuZCB0aGVuLCBhZnRlciB6ZXJvIG9yIG1vcmUgaXRlcmF0aW9ucywgZG9FbmRUYWcoKSBpcyBpbnZva2VkLgorICogSWYgdGhlIGN1c3RvbSBhY3Rpb24gZWxlbWVudCBpcyBlbXB0eSwgb25seSBkb1N0YXJ0KCkgYW5kIGRvRW5kVGFnKCkgCisgKiBhcmUgaW52b2tlZC4KKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIEJvZHlUYWcgZXh0ZW5kcyBJdGVyYXRpb25UYWcgeworCisgICAgLyoqCisgICAgICogRGVwcmVjYXRlZCBjb25zdGFudCB0aGF0IGhhcyB0aGUgc2FtZSB2YWx1ZSBhcyBFVkFMX0JPRFlfQlVGRkVSRUQKKyAgICAgKiBhbmQgRVZBTF9CT0RZX0FHQUlOLiAgVGhpcyBuYW1lIGhhcyBiZWVuIG1hcmtlZCBhcyBkZXByZWNhdGVkCisgICAgICogdG8gZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhlIHR3byBkaWZmZXJlbnQgdGVybXMsIHdoaWNoIGFyZSBtdWNoCisgICAgICogbW9yZSBkZXNjcmlwdGl2ZS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkCUFzIG9mIEphdmEgSlNQIEFQSSAxLjIsIHVzZSBCb2R5VGFnLkVWQUxfQk9EWV9CVUZGRVJFRAorICAgICAqIG9yIEl0ZXJhdGlvblRhZy5FVkFMX0JPRFlfQUdBSU4uCisgICAgICovCisgCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVZBTF9CT0RZX1RBRyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IHRoZSBjcmVhdGlvbiBvZiBuZXcgYnVmZmVyLCBhIEJvZHlDb250ZW50IG9uIHdoaWNoIHRvCisgICAgICogZXZhbHVhdGUgdGhlIGJvZHkgb2YgdGhpcyB0YWcuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBmcm9tIGRvU3RhcnRUYWcgd2hlbiBpdCBpbXBsZW1lbnRzIEJvZHlUYWcuCisgICAgICogVGhpcyBpcyBhbiBpbGxlZ2FsIHJldHVybiB2YWx1ZSBmb3IgZG9TdGFydFRhZyB3aGVuIHRoZSBjbGFzcworICAgICAqIGRvZXMgbm90IGltcGxlbWVudCBCb2R5VGFnLgorICAgICAqLworCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVZBTF9CT0RZX0JVRkZFUkVEID0gMjsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBib2R5Q29udGVudCBwcm9wZXJ0eS4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBKU1AgcGFnZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QgYXQKKyAgICAgKiBtb3N0IG9uY2UgcGVyIGFjdGlvbiBpbnZvY2F0aW9uLgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBiZWZvcmUgZG9Jbml0Qm9keS4KKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkIGZvciBlbXB0eSB0YWdzIG9yIGZvciBub24tZW1wdHkKKyAgICAgKiB0YWdzIHdob3NlIGRvU3RhcnRUYWcoKSBtZXRob2QgcmV0dXJucyBTS0lQX0JPRFkgb3IgRVZBTF9CT0RZX0lOQ0xVREUuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHNldEJvZHlDb250ZW50IGlzIGludm9rZWQsIHRoZSB2YWx1ZSBvZiB0aGUgaW1wbGljaXQgb2JqZWN0IG91dAorICAgICAqIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCBpbiB0aGUgcGFnZUNvbnRleHQgb2JqZWN0LiAgVGhlIEJvZHlDb250ZW50CisgICAgICogb2JqZWN0IHBhc3NlZCB3aWxsIGhhdmUgbm90IGRhdGEgb24gaXQgYnV0IG1heSBoYXZlIGJlZW4gcmV1c2VkCisgICAgICogKGFuZCBjbGVhcmVkKSBmcm9tIHNvbWUgcHJldmlvdXMgaW52b2NhdGlvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBCb2R5Q29udGVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFuZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50CisgICAgICogdW50aWwgYWZ0ZXIgdGhlIGludm9jYXRpb24gb2YgdGhlIGRvRW5kVGFnIG1ldGhvZCwgYXQgd2hpY2ggY2FzZSBpdAorICAgICAqIG1heSBiZSByZXVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiB0aGUgQm9keUNvbnRlbnQKKyAgICAgKiBAc2VlICNkb0luaXRCb2R5CisgICAgICogQHNlZSAjZG9BZnRlckJvZHkKKyAgICAgKi8KKworICAgIHZvaWQgc2V0Qm9keUNvbnRlbnQoQm9keUNvbnRlbnQgYik7CisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIGV2YWx1YXRpb24gb2YgdGhlIGJvZHkuCisgICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgSlNQIHBhZ2UgaW1wbGVtZW50YXRpb24gb2JqZWN0CisgICAgICogYWZ0ZXIgc2V0Qm9keUNvbnRlbnQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdGltZQorICAgICAqIHRoZSBib2R5IGlzIHRvIGJlIGV2YWx1YXRlZC4KKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkIGZvciBlbXB0eSB0YWdzIG9yIGZvciBub24tZW1wdHkKKyAgICAgKiB0YWdzIHdob3NlIGRvU3RhcnRUYWcoKSBtZXRob2QgcmV0dXJucyBTS0lQX0JPRFkgb3IgRVZBTF9CT0RZX0lOQ0xVREUuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgSlNQIGNvbnRhaW5lciB3aWxsIHJlc3luY2hyb25pemUgdGhlIHZhbHVlcyBvZiBhbnkgQVRfQkVHSU4gYW5kCisgICAgICogTkVTVEVEIHZhcmlhYmxlcyAoZGVmaW5lZCBieSB0aGUgYXNzb2NpYXRlZCBUYWdFeHRyYUluZm8gb3IgVExEKSBhZnRlcgorICAgICAqIHRoZSBpbnZvY2F0aW9uIG9mIGRvSW5pdEJvZHkoKS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSnNwRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyB0YWcKKyAgICAgKiBAc2VlICNkb0FmdGVyQm9keQorICAgICAqLworCisgICAgdm9pZCBkb0luaXRCb2R5KCkgdGhyb3dzIEpzcEV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9Cb2R5VGFnU3VwcG9ydC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9Cb2R5VGFnU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMDIyZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L0JvZHlUYWdTdXBwb3J0LmphdmEKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyOworCisvKioKKyAqIEEgYmFzZSBjbGFzcyBmb3IgZGVmaW5pbmcgdGFnIGhhbmRsZXJzIGltcGxlbWVudGluZyBCb2R5VGFnLgorICoKKyAqIDxwPgorICogVGhlIEJvZHlUYWdTdXBwb3J0IGNsYXNzIGltcGxlbWVudHMgdGhlIEJvZHlUYWcgaW50ZXJmYWNlIGFuZCBhZGRzCisgKiBhZGRpdGlvbmFsIGNvbnZlbmllbmNlIG1ldGhvZHMgaW5jbHVkaW5nIGdldHRlciBtZXRob2RzIGZvciB0aGUKKyAqIGJvZHlDb250ZW50IHByb3BlcnR5IGFuZCBtZXRob2RzIHRvIGdldCBhdCB0aGUgcHJldmlvdXMgb3V0IEpzcFdyaXRlci4KKyAqCisgKiA8cD4KKyAqIE1hbnkgdGFnIGhhbmRsZXJzIHdpbGwgZXh0ZW5kIEJvZHlUYWdTdXBwb3J0IGFuZCBvbmx5IHJlZGVmaW5lIGEKKyAqIGZldyBtZXRob2RzLgorICovCisKK3B1YmxpYyBjbGFzcyBCb2R5VGFnU3VwcG9ydCBleHRlbmRzIFRhZ1N1cHBvcnQgaW1wbGVtZW50cyBCb2R5VGFnIHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IsIGFsbCBzdWJjbGFzc2VzIGFyZSByZXF1aXJlZCB0byBvbmx5IGRlZmluZQorICAgICAqIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlLCBhbmQgdG8gY2FsbCB0aGUKKyAgICAgKiBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBKU1AKKyAgICAgKiB0cmFuc2xhdG9yLgorICAgICAqLworCisgICAgcHVibGljIEJvZHlUYWdTdXBwb3J0KCkgeworCXN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBwcm9jZXNzaW5nIG9mIHRoZSBzdGFydCB0YWcgcmV0dXJuaW5nIEVWQUxfQk9EWV9CVUZGRVJFRC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gRVZBTF9CT0RZX0JVRkZFUkVECisgICAgICogQHRocm93cyBKc3BFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGlzIHRhZworICAgICAqIEBzZWUgQm9keVRhZyNkb1N0YXJ0VGFnCisgICAgICovCisgCisgICAgcHVibGljIGludCBkb1N0YXJ0VGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBFVkFMX0JPRFlfQlVGRkVSRUQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHByb2Nlc3Npbmcgb2YgdGhlIGVuZCB0YWcgcmV0dXJuaW5nIEVWQUxfUEFHRS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gRVZBTF9QQUdFCisgICAgICogQHRocm93cyBKc3BFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGlzIHRhZworICAgICAqIEBzZWUgVGFnI2RvRW5kVGFnCisgICAgICovCisKKyAgICBwdWJsaWMgaW50IGRvRW5kVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisJcmV0dXJuIHN1cGVyLmRvRW5kVGFnKCk7CisgICAgfQorCisKKyAgICAvLyBBY3Rpb25zIHJlbGF0ZWQgdG8gYm9keSBldmFsdWF0aW9uCisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciBldmFsdWF0aW9uIG9mIHRoZSBib2R5OiBzdGFzaCB0aGUgYm9keUNvbnRlbnQgYXdheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIHRoZSBCb2R5Q29udGVudAorICAgICAqIEBzZWUgI2RvQWZ0ZXJCb2R5CisgICAgICogQHNlZSAjZG9Jbml0Qm9keSgpCisgICAgICogQHNlZSBCb2R5VGFnI3NldEJvZHlDb250ZW50CisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRCb2R5Q29udGVudChCb2R5Q29udGVudCBiKSB7CisJdGhpcy5ib2R5Q29udGVudCA9IGI7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciBldmFsdWF0aW9uIG9mIHRoZSBib2R5IGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBib2R5IGV2YWx1YXRpb246CisgICAgICogbm8gYWN0aW9uLgorICAgICAqCisgICAgICogQHRocm93cyBKc3BFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGlzIHRhZworICAgICAqIEBzZWUgI3NldEJvZHlDb250ZW50CisgICAgICogQHNlZSAjZG9BZnRlckJvZHkKKyAgICAgKiBAc2VlIEJvZHlUYWcjZG9Jbml0Qm9keQorICAgICAqLworCisgICAgcHVibGljIHZvaWQgZG9Jbml0Qm9keSgpIHRocm93cyBKc3BFeGNlcHRpb24geworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWZ0ZXIgdGhlIGJvZHkgZXZhbHVhdGlvbjogZG8gbm90IHJlZXZhbHVhdGUgYW5kIGNvbnRpbnVlIHdpdGggdGhlIHBhZ2UuCisgICAgICogQnkgZGVmYXVsdCBub3RoaW5nIGlzIGRvbmUgd2l0aCB0aGUgYm9keUNvbnRlbnQgZGF0YSAoaWYgYW55KS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU0tJUF9CT0RZCisgICAgICogQHRocm93cyBKc3BFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGlzIHRhZworICAgICAqIEBzZWUgI2RvSW5pdEJvZHkKKyAgICAgKiBAc2VlIEJvZHlUYWcjZG9BZnRlckJvZHkKKyAgICAgKi8KKworICAgIHB1YmxpYyBpbnQgZG9BZnRlckJvZHkoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKyAJcmV0dXJuIFNLSVBfQk9EWTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbGVhc2Ugc3RhdGUuCisgICAgICoKKyAgICAgKiBAc2VlIFRhZyNyZWxlYXNlCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworCWJvZHlDb250ZW50ID0gbnVsbDsKKworCXN1cGVyLnJlbGVhc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY3VycmVudCBib2R5Q29udGVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGJvZHkgY29udGVudC4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgQm9keUNvbnRlbnQgZ2V0Qm9keUNvbnRlbnQoKSB7CisJcmV0dXJuIGJvZHlDb250ZW50OworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHN1cnJvdW5kaW5nIG91dCBKc3BXcml0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBlbmNsb3NpbmcgSnNwV3JpdGVyLCBmcm9tIHRoZSBib2R5Q29udGVudC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBKc3BXcml0ZXIgZ2V0UHJldmlvdXNPdXQoKSB7CisJcmV0dXJuIGJvZHlDb250ZW50LmdldEVuY2xvc2luZ1dyaXRlcigpOworICAgIH0KKworICAgIC8vIHByb3RlY3RlZCBmaWVsZHMKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IEJvZHlDb250ZW50IGZvciB0aGlzIEJvZHlUYWcuCisgICAgICovCisgICAgcHJvdGVjdGVkIEJvZHlDb250ZW50ICAgYm9keUNvbnRlbnQ7Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L0R5bmFtaWNBdHRyaWJ1dGVzLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L0R5bmFtaWNBdHRyaWJ1dGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3N2Y2NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvRHluYW1pY0F0dHJpYnV0ZXMuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uOworCisvKioKKyAqIEZvciBhIHRhZyB0byBkZWNsYXJlIHRoYXQgaXQgYWNjZXB0cyBkeW5hbWljIGF0dHJpYnV0ZXMsIGl0IG11c3QgaW1wbGVtZW50CisgKiB0aGlzIGludGVyZmFjZS4gIFRoZSBlbnRyeSBmb3IgdGhlIHRhZyBpbiB0aGUgVGFnIExpYnJhcnkgRGVzY3JpcHRvciBtdXN0IAorICogYWxzbyBiZSBjb25maWd1cmVkIHRvIGluZGljYXRlIGR5bmFtaWMgYXR0cmlidXRlcyBhcmUgYWNjZXB0ZWQuCisgKiA8YnI+CisgKiBGb3IgYW55IGF0dHJpYnV0ZSB0aGF0IGlzIG5vdCBkZWNsYXJlZCBpbiB0aGUgVGFnIExpYnJhcnkgRGVzY3JpcHRvciBmb3IKKyAqIHRoaXMgdGFnLCBpbnN0ZWFkIG9mIGdldHRpbmcgYW4gZXJyb3IgYXQgdHJhbnNsYXRpb24gdGltZSwgdGhlIAorICogPGNvZGU+c2V0RHluYW1pY0F0dHJpYnV0ZSgpPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLCB3aXRoIHRoZSBuYW1lIGFuZAorICogdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdGFnIHRvIAorICogcmVtZW1iZXIgdGhlIG5hbWVzIGFuZCB2YWx1ZXMgb2YgdGhlIGR5bmFtaWMgYXR0cmlidXRlcy4KKyAqCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRHluYW1pY0F0dHJpYnV0ZXMgeworICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgdGFnIGRlY2xhcmVkIHRvIGFjY2VwdCBkeW5hbWljIGF0dHJpYnV0ZXMgaXMgcGFzc2VkCisgICAgICogYW4gYXR0cmlidXRlIHRoYXQgaXMgbm90IGRlY2xhcmVkIGluIHRoZSBUYWcgTGlicmFyeSBEZXNjcmlwdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSB1cmkgdGhlIG5hbWVzcGFjZSBvZiB0aGUgYXR0cmlidXRlLCBvciBudWxsIGlmIGluIHRoZSBkZWZhdWx0CisgICAgICogICAgIG5hbWVzcGFjZS4KKyAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgYmVpbmcgc2V0LgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQorICAgICAqIEB0aHJvd3MgSnNwRXhjZXB0aW9uIGlmIHRoZSB0YWcgaGFuZGxlciB3aXNoZXMgdG8KKyAgICAgKiAgICAgc2lnbmFsIHRoYXQgaXQgZG9lcyBub3QgYWNjZXB0IHRoZSBnaXZlbiBhdHRyaWJ1dGUuICBUaGUgCisgICAgICogICAgIGNvbnRhaW5lciBtdXN0IG5vdCBjYWxsIGRvU3RhcnRUYWcoKSBvciBkb1RhZygpIGZvciB0aGlzIHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREeW5hbWljQXR0cmlidXRlKAorICAgICAgICBTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBPYmplY3QgdmFsdWUgKSAKKyAgICAgICAgdGhyb3dzIEpzcEV4Y2VwdGlvbjsKKyAgICAKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvRnVuY3Rpb25JbmZvLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L0Z1bmN0aW9uSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NmMxNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L0Z1bmN0aW9uSW5mby5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIAorcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7CisKKy8qKgorICogSW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24gaW4gYSBUYWcgTGlicmFyeS4KKyAqIFRoaXMgY2xhc3MgaXMgaW5zdGFudGlhdGVkIGZyb20gdGhlIFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IgZmlsZSAoVExEKQorICogYW5kIGlzIGF2YWlsYWJsZSBvbmx5IGF0IHRyYW5zbGF0aW9uIHRpbWUuCisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEZ1bmN0aW9uSW5mbyB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRnVuY3Rpb25JbmZvLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIGtsYXNzIFRoZSBjbGFzcyBvZiB0aGUgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gc2lnbmF0dXJlIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uCisgICAgICovCisKKyAgICBwdWJsaWMgRnVuY3Rpb25JbmZvKFN0cmluZyBuYW1lLCBTdHJpbmcga2xhc3MsIFN0cmluZyBzaWduYXR1cmUpIHsKKworCXRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuZnVuY3Rpb25DbGFzcyA9IGtsYXNzOworICAgICAgICB0aGlzLmZ1bmN0aW9uU2lnbmF0dXJlID0gc2lnbmF0dXJlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIG9mIHRoZSBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNsYXNzIG9mIHRoZSBmdW5jdGlvbgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRGdW5jdGlvbkNsYXNzKCkgeworICAgICAgICByZXR1cm4gZnVuY3Rpb25DbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNpZ25hdHVyZSBvZiB0aGUgZnVuY3Rpb24KKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVuY3Rpb25TaWduYXR1cmUoKSB7CisgICAgICAgIHJldHVybiBmdW5jdGlvblNpZ25hdHVyZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGZpZWxkcworICAgICAqLworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBmdW5jdGlvbkNsYXNzOworICAgIHByaXZhdGUgU3RyaW5nIGZ1bmN0aW9uU2lnbmF0dXJlOworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9JdGVyYXRpb25UYWcuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvSXRlcmF0aW9uVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0YTM2MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvSXRlcmF0aW9uVGFnLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLio7CisKKy8qKgorICogVGhlIEl0ZXJhdGlvblRhZyBpbnRlcmZhY2UgZXh0ZW5kcyBUYWcgYnkgZGVmaW5pbmcgb25lIGFkZGl0aW9uYWwKKyAqIG1ldGhvZCB0aGF0IGNvbnRyb2xzIHRoZSByZWV2YWx1YXRpb24gb2YgaXRzIGJvZHkuCisgKgorICogPHA+IEEgdGFnIGhhbmRsZXIgdGhhdCBpbXBsZW1lbnRzIEl0ZXJhdGlvblRhZyBpcyB0cmVhdGVkIGFzIG9uZSB0aGF0CisgKiBpbXBsZW1lbnRzIFRhZyByZWdhcmRpbmcgIHRoZSBkb1N0YXJ0VGFnKCkgYW5kIGRvRW5kVGFnKCkgbWV0aG9kcy4KKyAqIEl0ZXJhdGlvblRhZyBwcm92aWRlcyBhIG5ldyBtZXRob2Q6IDxjb2RlPmRvQWZ0ZXJCb2R5KCk8L2NvZGU+LgorICoKKyAqIDxwPiBUaGUgZG9BZnRlckJvZHkoKSBtZXRob2QgaXMgaW52b2tlZCBhZnRlciBldmVyeSBib2R5IGV2YWx1YXRpb24KKyAqIHRvIGNvbnRyb2wgd2hldGhlciB0aGUgYm9keSB3aWxsIGJlIHJlZXZhbHVhdGVkIG9yIG5vdC4gIElmIGRvQWZ0ZXJCb2R5KCkKKyAqIHJldHVybnMgSXRlcmF0aW9uVGFnLkVWQUxfQk9EWV9BR0FJTiwgdGhlbiB0aGUgYm9keSB3aWxsIGJlIHJlZXZhbHVhdGVkLgorICogSWYgZG9BZnRlckJvZHkoKSByZXR1cm5zIFRhZy5TS0lQX0JPRFksIHRoZW4gdGhlIGJvZHkgd2lsbCBiZSBza2lwcGVkCisgKiBhbmQgZG9FbmRUYWcoKSB3aWxsIGJlIGV2YWx1YXRlZCBpbnN0ZWFkLgorICoKKyAqIDxwPjxCPlByb3BlcnRpZXM8L0I+CisgKiBUaGVyZSBhcmUgbm8gbmV3IHByb3BlcnRpZXMgaW4gYWRkaXRpb24gdG8gdGhvc2UgaW4gVGFnLgorICoKKyAqIDxwPjxCPk1ldGhvZHM8L0I+CisgKiBUaGVyZSBpcyBvbmUgbmV3IG1ldGhvZHM6IGRvQWZ0ZXJCb2R5KCkuCisgKgorICogPHA+PEI+TGlmZWN5Y2xlPC9CPgorICoKKyAqIDxwPiBMaWZlY3ljbGUgZGV0YWlscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSB0cmFuc2l0aW9uIGRpYWdyYW0KKyAqIGJlbG93LiAgRXhjZXB0aW9ucyB0aGF0IGFyZSB0aHJvd24gZHVyaW5nIHRoZSBjb21wdXRhdGlvbiBvZgorICogZG9TdGFydFRhZygpLCBCT0RZIGFuZCBkb0FmdGVyQm9keSgpIGludGVycnVwdCB0aGUgZXhlY3V0aW9uCisgKiBzZXF1ZW5jZSBhbmQgYXJlIHByb3BhZ2F0ZWQgdXAgdGhlIHN0YWNrLCB1bmxlc3MgdGhlIHRhZyBoYW5kbGVyCisgKiBpbXBsZW1lbnRzIHRoZSBUcnlDYXRjaEZpbmFsbHkgaW50ZXJmYWNlOyBzZWUgdGhhdCBpbnRlcmZhY2UgZm9yCisgKiBkZXRhaWxzLgorICoKKyAqIDxwPgorICogPElNRyBzcmM9ImRvYy1maWxlcy9JdGVyYXRpb25UYWdQcm90b2NvbC5naWYiCisgKiAgICAgIGFsdD0iTGlmZWN5Y2xlIERldGFpbHMgVHJhbnNpdGlvbiBEaWFncmFtIGZvciBJdGVyYXRpb25UYWciLz4KKyAqCisgKiA8cD48Qj5FbXB0eSBhbmQgTm9uLUVtcHR5IEFjdGlvbjwvQj4KKyAqIDxwPiBJZiB0aGUgVGFnTGlicmFyeURlc2NyaXB0b3IgZmlsZSBpbmRpY2F0ZXMgdGhhdCB0aGUgYWN0aW9uIG11c3QKKyAqIGFsd2F5cyBoYXZlIGFuIGVtcHR5IGVsZW1lbnQgYm9keSwgYnkgYSAmbHQ7Ym9keS1jb250ZW50Jmd0OyBlbnRyeSBvZiAKKyAqICJlbXB0eSIsIHRoZW4gdGhlIGRvU3RhcnRUYWcoKSBtZXRob2QgbXVzdCByZXR1cm4gU0tJUF9CT0RZLgorICoKKyAqIDxwPk5vdGUgdGhhdCB3aGljaCBtZXRob2RzIGFyZSBpbnZva2VkIGFmdGVyIHRoZSBkb1N0YXJ0VGFnKCkgZGVwZW5kcyBvbgorICogYm90aCB0aGUgcmV0dXJuIHZhbHVlIGFuZCBvbiBpZiB0aGUgY3VzdG9tIGFjdGlvbiBlbGVtZW50IGlzIGVtcHR5CisgKiBvciBub3QgaW4gdGhlIEpTUCBwYWdlLCBub3Qgb24gaG93IGl0J3MgZGVjbGFyZWQgaW4gdGhlIFRMRC4KKyAqCisgKiA8cD4KKyAqIElmIFNLSVBfQk9EWSBpcyByZXR1cm5lZCB0aGUgYm9keSBpcyBub3QgZXZhbHVhdGVkLCBhbmQgdGhlbiBkb0VuZFRhZygpCisgKiBpcyBpbnZva2VkLgorICoKKyAqIDxwPgorICogSWYgRVZBTF9CT0RZX0lOQ0xVREUgaXMgcmV0dXJuZWQsIGFuZCB0aGUgY3VzdG9tIGFjdGlvbiBlbGVtZW50IGlzIG5vdAorICogZW1wdHksIHRoZSBib2R5IGlzIGV2YWx1YXRlZCBhbmQgInBhc3NlZCB0aHJvdWdoIiB0byB0aGUgY3VycmVudCBvdXQsIAorICogdGhlbiBkb0FmdGVyQm9keSgpIGlzIGludm9rZWQgYW5kLCBhZnRlciB6ZXJvIG9yIG1vcmUgaXRlcmF0aW9ucywgCisgKiBkb0VuZFRhZygpIGlzIGludm9rZWQuCisgKi8KKworcHVibGljIGludGVyZmFjZSBJdGVyYXRpb25UYWcgZXh0ZW5kcyBUYWcgeworCisgICAgLyoqCisgICAgICogUmVxdWVzdCB0aGUgcmVldmFsdWF0aW9uIG9mIHNvbWUgYm9keS4KKyAgICAgKiBSZXR1cm5lZCBmcm9tIGRvQWZ0ZXJCb2R5LgorICAgICAqCisgICAgICogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBKU1AgMS4xLCB0aGUgdmFsdWUgaXMgY2FyZWZ1bGx5IHNlbGVjdGVkCisgICAgICogdG8gYmUgdGhlIHNhbWUgYXMgdGhlLCBub3cgZGVwcmVjYXRlZCwgQm9keVRhZy5FVkFMX0JPRFlfVEFHLAorICAgICAqIAorICAgICAqLworIAorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVWQUxfQk9EWV9BR0FJTiA9IDI7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGJvZHkgKHJlKWV2YWx1YXRpb24uICBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZQorICAgICAqIEpTUCBQYWdlIGltcGxlbWVudGF0aW9uIG9iamVjdCBhZnRlciBldmVyeSBldmFsdWF0aW9uIG9mCisgICAgICogdGhlIGJvZHkgaW50byB0aGUgQm9keUV2YWx1YXRpb24gb2JqZWN0LiBUaGUgbWV0aG9kIGlzCisgICAgICogbm90IGludm9rZWQgaWYgdGhlcmUgaXMgbm8gYm9keSBldmFsdWF0aW9uLgorICAgICAqCisgICAgICogPHA+CisgICAgICogSWYgZG9BZnRlckJvZHkgcmV0dXJucyBFVkFMX0JPRFlfQUdBSU4sIGEgbmV3IGV2YWx1YXRpb24gb2YgdGhlCisgICAgICogYm9keSB3aWxsIGhhcHBlbiAoZm9sbG93ZWQgYnkgYW5vdGhlciBpbnZvY2F0aW9uIG9mIGRvQWZ0ZXJCb2R5KS4KKyAgICAgKiBJZiBkb0FmdGVyQm9keSByZXR1cm5zIFNLSVBfQk9EWSwgbm8gbW9yZSBib2R5IGV2YWx1YXRpb25zIHdpbGwgb2NjdXIsCisgICAgICogYW5kIHRoZSBkb0VuZFRhZyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkLgorICAgICAqCisgICAgICogPHA+CisgICAgICogSWYgdGhpcyB0YWcgaGFuZGxlciBpbXBsZW1lbnRzIEJvZHlUYWcgYW5kIGRvQWZ0ZXJCb2R5IHJldHVybnMKKyAgICAgKiBTS0lQX0JPRFksIHRoZSB2YWx1ZSBvZiBvdXQgd2lsbCBiZSByZXN0b3JlZCB1c2luZyB0aGUgcG9wQm9keSAKKyAgICAgKiBtZXRob2QgaW4gcGFnZUNvbnRleHQgcHJpb3IgdG8gaW52b2tpbmcgZG9FbmRUYWcuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbWV0aG9kIHJlLWludm9jYXRpb25zIG1heSBiZSBsZWFkIHRvIGRpZmZlcmVudCBhY3Rpb25zIGJlY2F1c2UKKyAgICAgKiB0aGVyZSBtaWdodCBoYXZlIGJlZW4gc29tZSBjaGFuZ2VzIHRvIHNoYXJlZCBzdGF0ZSwgb3IgYmVjYXVzZQorICAgICAqIG9mIGV4dGVybmFsIGNvbXB1dGF0aW9uLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIEpTUCBjb250YWluZXIgd2lsbCByZXN5bmNocm9uaXplIHRoZSB2YWx1ZXMgb2YgYW55IEFUX0JFR0lOIGFuZAorICAgICAqIE5FU1RFRCB2YXJpYWJsZXMgKGRlZmluZWQgYnkgdGhlIGFzc29jaWF0ZWQgVGFnRXh0cmFJbmZvIG9yIFRMRCkgYWZ0ZXIKKyAgICAgKiB0aGUgaW52b2NhdGlvbiBvZiBkb0FmdGVyQm9keSgpLgorICAgICAqCisgICAgICogQHJldHVybiB3aGV0aGVyIGFkZGl0aW9uYWwgZXZhbHVhdGlvbnMgb2YgdGhlIGJvZHkgYXJlIGRlc2lyZWQKKyAgICAgKiBAdGhyb3dzIEpzcEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoaXMgdGFnCisgICAgICovCisKKyAgICBpbnQgZG9BZnRlckJvZHkoKSB0aHJvd3MgSnNwRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9Kc3BGcmFnbWVudC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9Kc3BGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNDZlOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L0pzcEZyYWdtZW50LmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuKjsKKworLyoqCisgKiBFbmNhcHN1bGF0ZXMgYSBwb3J0aW9uIG9mIEpTUCBjb2RlIGluIGFuIG9iamVjdCB0aGF0IAorICogY2FuIGJlIGludm9rZWQgYXMgbWFueSB0aW1lcyBhcyBuZWVkZWQuICBKU1AgRnJhZ21lbnRzIGFyZSBkZWZpbmVkIAorICogdXNpbmcgSlNQIHN5bnRheCBhcyB0aGUgYm9keSBvZiBhIHRhZyBmb3IgYW4gaW52b2NhdGlvbiB0byBhIFNpbXBsZVRhZyAKKyAqIGhhbmRsZXIsIG9yIGFzIHRoZSBib2R5IG9mIGEgJmx0O2pzcDphdHRyaWJ1dGUmZ3Q7IHN0YW5kYXJkIGFjdGlvbgorICogc3BlY2lmeWluZyB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlIHRoYXQgaXMgZGVjbGFyZWQgYXMgYSBmcmFnbWVudCwKKyAqIG9yIHRvIGJlIG9mIHR5cGUgSnNwRnJhZ21lbnQgaW4gdGhlIFRMRC4KKyAqIDxwPgorICogVGhlIGRlZmluaXRpb24gb2YgdGhlIEpTUCBmcmFnbWVudCBtdXN0IG9ubHkgY29udGFpbiB0ZW1wbGF0ZSAKKyAqIHRleHQgYW5kIEpTUCBhY3Rpb24gZWxlbWVudHMuICBJbiBvdGhlciB3b3JkcywgaXQgbXVzdCBub3QgY29udGFpbgorICogc2NyaXB0bGV0cyBvciBzY3JpcHRsZXQgZXhwcmVzc2lvbnMuICBBdCB0cmFuc2xhdGlvbiB0aW1lLCB0aGUgCisgKiBjb250YWluZXIgZ2VuZXJhdGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBKc3BGcmFnbWVudCBhYnN0cmFjdCBjbGFzcworICogY2FwYWJsZSBvZiBleGVjdXRpbmcgdGhlIGRlZmluZWQgZnJhZ21lbnQuCisgKiA8cD4KKyAqIEEgdGFnIGhhbmRsZXIgY2FuIGludm9rZSB0aGUgZnJhZ21lbnQgemVybyBvciBtb3JlIHRpbWVzLCBvciAKKyAqIHBhc3MgaXQgYWxvbmcgdG8gb3RoZXIgdGFncywgYmVmb3JlIHJldHVybmluZy4gIFRvIGNvbW11bmljYXRlIHZhbHVlcworICogdG8vZnJvbSBhIEpTUCBmcmFnbWVudCwgdGFnIGhhbmRsZXJzIHN0b3JlL3JldHJpZXZlIHZhbHVlcyBpbiAKKyAqIHRoZSBKc3BDb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZnJhZ21lbnQuCisgKiA8cD4KKyAqIE5vdGUgdGhhdCB0YWcgbGlicmFyeSBkZXZlbG9wZXJzIGFuZCBwYWdlIGF1dGhvcnMgc2hvdWxkIG5vdCBnZW5lcmF0ZQorICogSnNwRnJhZ21lbnQgaW1wbGVtZW50YXRpb25zIG1hbnVhbGx5LgorICogPHA+CisgKiA8aT5JbXBsZW1lbnRhdGlvbiBOb3RlPC9pPjogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBnZW5lcmF0ZSBhIAorICogc2VwYXJhdGUgY2xhc3MgZm9yIGVhY2ggZnJhZ21lbnQuICBPbmUgcG9zc2libGUgaW1wbGVtZW50YXRpb24gaXMgCisgKiB0byBnZW5lcmF0ZSBhIHNpbmdsZSBoZWxwZXIgY2xhc3MgZm9yIGVhY2ggcGFnZSB0aGF0IGltcGxlbWVudHMgCisgKiBKc3BGcmFnbWVudC4gVXBvbiBjb25zdHJ1Y3Rpb24sIGEgZGlzY3JpbWluYXRvciBjYW4gYmUgcGFzc2VkIHRvIAorICogc2VsZWN0IHdoaWNoIGZyYWdtZW50IHRoYXQgaW5zdGFuY2Ugd2lsbCBleGVjdXRlLgorICoKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEpzcEZyYWdtZW50IHsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBmcmFnbWVudCBhbmQgZGlyZWN0cyBhbGwgb3V0cHV0IHRvIHRoZSBnaXZlbiBXcml0ZXIsCisgICAgICogb3IgdGhlIEpzcFdyaXRlciByZXR1cm5lZCBieSB0aGUgZ2V0T3V0KCkgbWV0aG9kIG9mIHRoZSBKc3BDb250ZXh0CisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBmcmFnbWVudCBpZiBvdXQgaXMgbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXQgVGhlIFdyaXRlciB0byBvdXRwdXQgdGhlIGZyYWdtZW50IHRvLCBvciBudWxsIGlmIAorICAgICAqICAgICBvdXRwdXQgc2hvdWxkIGJlIHNlbnQgdG8gSnNwQ29udGV4dC5nZXRPdXQoKS4KKyAgICAgKiBAdGhyb3dzIGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbiBUaHJvd24gaWYgYW4gZXJyb3Igb2NjdXJlZAorICAgICAqICAgICB3aGlsZSBpbnZva2luZyB0aGlzIGZyYWdtZW50LgorICAgICAqIEB0aHJvd3MgamF2YXguc2VydmxldC5qc3AuU2tpcFBhZ2VFeGNlcHRpb24gVGhyb3duIGlmIHRoZSBwYWdlCisgICAgICogICAgIHRoYXQgKGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5KSBpbnZva2VkIHRoZSB0YWcgaGFuZGxlciB0aGF0CisgICAgICogICAgIGludm9rZWQgdGhpcyBmcmFnbWVudCBpcyB0byBjZWFzZSBldmFsdWF0aW9uLiAgVGhlIGNvbnRhaW5lcgorICAgICAqICAgICBtdXN0IHRocm93IHRoaXMgZXhjZXB0aW9uIGlmIGEgQ2xhc3NpYyBUYWcgSGFuZGxlciByZXR1cm5lZAorICAgICAqICAgICBUYWcuU0tJUF9QQUdFIG9yIGlmIGEgU2ltcGxlIFRhZyBIYW5kbGVyIHRocmV3IFNraXBQYWdlRXhjZXB0aW9uLgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyB0byB0aGUgCisgICAgICogICAgIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnZva2UoIFdyaXRlciBvdXQgKQorICAgICAgICB0aHJvd3MgSnNwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEpzcENvbnRleHQgdGhhdCBpcyBib3VuZCB0byB0aGlzIEpzcEZyYWdtZW50LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgSnNwQ29udGV4dCB1c2VkIGJ5IHRoaXMgZnJhZ21lbnQgYXQgaW52b2NhdGlvbiB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBKc3BDb250ZXh0IGdldEpzcENvbnRleHQoKTsKKworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9Kc3BUYWcuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvSnNwVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjZGQ2OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvSnNwVGFnLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dDsKKworLyoqCisgKiBTZXJ2ZXMgYXMgYSBiYXNlIGNsYXNzIGZvciBUYWcgYW5kIFNpbXBsZVRhZy4gIAorICogVGhpcyBpcyBtb3N0bHkgZm9yIG9yZ2FuaXphdGlvbmFsIGFuZCB0eXBlLXNhZmV0eSBwdXJwb3Nlcy4KKyAqCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSnNwVGFnIHsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvUGFnZURhdGEuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvUGFnZURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2M2ZjYzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9QYWdlRGF0YS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworLyoqCisgKiBUcmFuc2xhdGlvbi10aW1lIGluZm9ybWF0aW9uIG9uIGEgSlNQIHBhZ2UuICBUaGUgaW5mb3JtYXRpb24KKyAqIGNvcnJlc3BvbmRzIHRvIHRoZSBYTUwgdmlldyBvZiB0aGUgSlNQIHBhZ2UuCisgKgorICogPHA+CisgKiBPYmplY3RzIG9mIHRoaXMgdHlwZSBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBKU1AgdHJhbnNsYXRvciwgZS5nLgorICogd2hlbiBiZWluZyBwYXNlZCB0byBhIFRhZ0xpYnJhcnlWYWxpZGF0b3IgaW5zdGFuY2UuCisgKi8KKworYWJzdHJhY3QgcHVibGljIGNsYXNzIFBhZ2VEYXRhIHsKKworICAgIC8qKgorICAgICAqIFNvbGUgY29uc3RydWN0b3IuIChGb3IgaW52b2NhdGlvbiBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcnMsIAorICAgICAqIHR5cGljYWxseSBpbXBsaWNpdC4pCisgICAgICovCisgICAgcHVibGljIFBhZ2VEYXRhKCkgeworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGlucHV0IHN0cmVhbSBvbiB0aGUgWE1MIHZpZXcgb2YgYSBKU1AgcGFnZS4KKyAgICAgKiBUaGUgc3RyZWFtIGlzIGVuY29kZWQgaW4gVVRGLTguICBSZWNhbGwgdGh0IHRoZSBYTUwgdmlldyBvZiBhIAorICAgICAqIEpTUCBwYWdlIGhhcyB0aGUgaW5jbHVkZSBkaXJlY3RpdmVzIGV4cGFuZGVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQW4gaW5wdXQgc3RyZWFtIG9uIHRoZSBkb2N1bWVudC4KKyAgICAgKi8KKyAgIGFic3RyYWN0IHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpOworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9TaW1wbGVUYWcuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvU2ltcGxlVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1NjlhNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvU2ltcGxlVGFnLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BDb250ZXh0OworCisvKioKKyAqIEludGVyZmFjZSBmb3IgZGVmaW5pbmcgU2ltcGxlIFRhZyBIYW5kbGVycy4KKyAqIAorICogPHA+U2ltcGxlIFRhZyBIYW5kbGVycyBkaWZmZXIgZnJvbSBDbGFzc2ljIFRhZyBIYW5kbGVycyBpbiB0aGF0IGluc3RlYWQgCisgKiBvZiBzdXBwb3J0aW5nIDxjb2RlPmRvU3RhcnRUYWcoKTwvY29kZT4gYW5kIDxjb2RlPmRvRW5kVGFnKCk8L2NvZGU+LCAKKyAqIHRoZSA8Y29kZT5TaW1wbGVUYWc8L2NvZGU+IGludGVyZmFjZSBwcm92aWRlcyBhIHNpbXBsZSAKKyAqIDxjb2RlPmRvVGFnKCk8L2NvZGU+IG1ldGhvZCwgd2hpY2ggaXMgY2FsbGVkIG9uY2UgYW5kIG9ubHkgb25jZSBmb3IgYW55IAorICogZ2l2ZW4gdGFnIGludm9jYXRpb24uICBBbGwgdGFnIGxvZ2ljLCBpdGVyYXRpb24sIGJvZHkgZXZhbHVhdGlvbnMsIGV0Yy4gCisgKiBhcmUgdG8gYmUgcGVyZm9ybWVkIGluIHRoaXMgc2luZ2xlIG1ldGhvZC4gIFRodXMsIHNpbXBsZSB0YWcgaGFuZGxlcnMgCisgKiBoYXZlIHRoZSBlcXVpdmFsZW50IHBvd2VyIG9mIDxjb2RlPkJvZHlUYWc8L2NvZGU+LCBidXQgd2l0aCBhIG11Y2ggCisgKiBzaW1wbGVyIGxpZmVjeWNsZSBhbmQgaW50ZXJmYWNlLjwvcD4KKyAqCisgKiA8cD5UbyBzdXBwb3J0IGJvZHkgY29udGVudCwgdGhlIDxjb2RlPnNldEpzcEJvZHkoKTwvY29kZT4gCisgKiBtZXRob2QgaXMgcHJvdmlkZWQuICBUaGUgY29udGFpbmVyIGludm9rZXMgdGhlIDxjb2RlPnNldEpzcEJvZHkoKTwvY29kZT4gCisgKiBtZXRob2Qgd2l0aCBhIDxjb2RlPkpzcEZyYWdtZW50PC9jb2RlPiBvYmplY3QgZW5jYXBzdWxhdGluZyB0aGUgYm9keSBvZiAKKyAqIHRoZSB0YWcuICBUaGUgdGFnIGhhbmRsZXIgaW1wbGVtZW50YXRpb24gY2FuIGNhbGwgCisgKiA8Y29kZT5pbnZva2UoKTwvY29kZT4gb24gdGhhdCBmcmFnbWVudCB0byBldmFsdWF0ZSB0aGUgYm9keSBhcworICogbWFueSB0aW1lcyBhcyBpdCBuZWVkcy48L3A+CisgKgorICogPHA+QSBTaW1wbGVUYWcgaGFuZGxlciBtdXN0IGhhdmUgYSBwdWJsaWMgbm8tYXJncyBjb25zdHJ1Y3Rvci4gIE1vc3QKKyAqIFNpbXBsZVRhZyBoYW5kbGVycyBzaG91bGQgZXh0ZW5kIFNpbXBsZVRhZ1N1cHBvcnQuPC9wPgorICogCisgKiA8cD48Yj5MaWZlY3ljbGU8L2I+PC9wPgorICoKKyAqIDxwPlRoZSBmb2xsb3dpbmcgaXMgYSBub24tbm9ybWF0aXZlLCBicmllZiBvdmVydmlldyBvZiB0aGUgCisgKiBTaW1wbGVUYWcgbGlmZWN5Y2xlLiAgUmVmZXIgdG8gdGhlIEpTUCBTcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLjwvcD4KKyAqCisgKiA8b2w+CisgKiAgIDxsaT5BIG5ldyB0YWcgaGFuZGxlciBpbnN0YW5jZSBpcyBjcmVhdGVkIGVhY2ggdGltZSBieSB0aGUgY29udGFpbmVyIAorICogICAgICAgYnkgY2FsbGluZyB0aGUgcHJvdmlkZWQgemVyby1hcmdzIGNvbnN0cnVjdG9yLiAgVW5saWtlIGNsYXNzaWMKKyAqICAgICAgIHRhZyBoYW5kbGVycywgc2ltcGxlIHRhZyBoYW5kbGVycyBhcmUgbmV2ZXIgY2FjaGVkIGFuZCByZXVzZWQgYnkKKyAqICAgICAgIHRoZSBKU1AgY29udGFpbmVyLjwvbGk+CisgKiAgIDxsaT5UaGUgPGNvZGU+c2V0SnNwQ29udGV4dCgpPC9jb2RlPiBhbmQgPGNvZGU+c2V0UGFyZW50KCk8L2NvZGU+IAorICogICAgICAgbWV0aG9kcyBhcmUgY2FsbGVkIGJ5IHRoZSBjb250YWluZXIuICBUaGUgPGNvZGU+c2V0UGFyZW50KCk8L2NvZGU+CisgKiAgICAgICBtZXRob2QgaXMgb25seSBjYWxsZWQgaWYgdGhlIGVsZW1lbnQgaXMgbmVzdGVkIHdpdGhpbiBhbm90aGVyIHRhZyAKKyAqICAgICAgIGludm9jYXRpb24uPC9saT4KKyAqICAgPGxpPlRoZSBzZXR0ZXJzIGZvciBlYWNoIGF0dHJpYnV0ZSBkZWZpbmVkIGZvciB0aGlzIHRhZyBhcmUgY2FsbGVkCisgKiAgICAgICBieSB0aGUgY29udGFpbmVyLjwvbGk+CisgKiAgIDxsaT5JZiBhIGJvZHkgZXhpc3RzLCB0aGUgPGNvZGU+c2V0SnNwQm9keSgpPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkIAorICogICAgICAgYnkgdGhlIGNvbnRhaW5lciB0byBzZXQgdGhlIGJvZHkgb2YgdGhpcyB0YWcsIGFzIGEgCisgKiAgICAgICA8Y29kZT5Kc3BGcmFnbWVudDwvY29kZT4uICBJZiB0aGUgYWN0aW9uIGVsZW1lbnQgaXMgZW1wdHkgaW4KKyAqICAgICAgIHRoZSBwYWdlLCB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIGF0IGFsbC48L2xpPgorICogICA8bGk+VGhlIDxjb2RlPmRvVGFnKCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGNvbnRhaW5lci4gIEFsbAorICogICAgICAgdGFnIGxvZ2ljLCBpdGVyYXRpb24sIGJvZHkgZXZhbHVhdGlvbnMsIGV0Yy4gb2NjdXIgaW4gdGhpcyAKKyAqICAgICAgIG1ldGhvZC48L2xpPgorICogICA8bGk+VGhlIDxjb2RlPmRvVGFnKCk8L2NvZGU+IG1ldGhvZCByZXR1cm5zIGFuZCBhbGwgdmFyaWFibGVzIGFyZQorICogICAgICAgc3luY2hyb25pemVkLjwvbGk+CisgKiA8L29sPgorICogCisgKiBAc2VlIFNpbXBsZVRhZ1N1cHBvcnQKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGludGVyZmFjZSBTaW1wbGVUYWcgZXh0ZW5kcyBKc3BUYWcgeworICAgIAorICAgIC8qKiAKKyAgICAgKiBDYWxsZWQgYnkgdGhlIGNvbnRhaW5lciB0byBpbnZva2UgdGhpcyB0YWcuCisgICAgICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGJ5IHRoZSB0YWcgbGlicmFyeQorICAgICAqIGRldmVsb3BlciwgYW5kIGhhbmRsZXMgYWxsIHRhZyBwcm9jZXNzaW5nLCBib2R5IGl0ZXJhdGlvbiwgZXRjLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIEpTUCBjb250YWluZXIgd2lsbCByZXN5bmNocm9uaXplIGFueSBBVF9CRUdJTiBhbmQgQVRfRU5ECisgICAgICogdmFyaWFibGVzIChkZWZpbmVkIGJ5IHRoZSBhc3NvY2lhdGVkIHRhZyBmaWxlLCBUYWdFeHRyYUluZm8sIG9yIFRMRCkKKyAgICAgKiBhZnRlciB0aGUgaW52b2NhdGlvbiBvZiBkb1RhZygpLgorICAgICAqIAorICAgICAqIEB0aHJvd3MgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycmVkIAorICAgICAqICAgICB3aGlsZSBwcm9jZXNzaW5nIHRoaXMgdGFnLgorICAgICAqIEB0aHJvd3MgamF2YXguc2VydmxldC5qc3AuU2tpcFBhZ2VFeGNlcHRpb24gSWYgdGhlIHBhZ2UgdGhhdAorICAgICAqICAgICAoZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIGludm9rZWQgdGhpcyB0YWcgaXMgdG8KKyAgICAgKiAgICAgY2Vhc2UgZXZhbHVhdGlvbi4gIEEgU2ltcGxlIFRhZyBIYW5kbGVyIGdlbmVyYXRlZCBmcm9tIGEgCisgICAgICogICAgIHRhZyBmaWxlIG11c3QgdGhyb3cgdGhpcyBleGNlcHRpb24gaWYgYW4gaW52b2tlZCBDbGFzc2ljIAorICAgICAqICAgICBUYWcgSGFuZGxlciByZXR1cm5lZCBTS0lQX1BBR0Ugb3IgaWYgYW4gaW52b2tlZCBTaW1wbGUKKyAgICAgKiAgICAgVGFnIEhhbmRsZXIgdGhyZXcgU2tpcFBhZ2VFeGNlcHRpb24gb3IgaWYgYW4gaW52b2tlZCBKc3AgRnJhZ21lbnQKKyAgICAgKiAgICAgdGhyZXcgYSBTa2lwUGFnZUV4Y2VwdGlvbi4KKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgdG8gdGhlCisgICAgICogICAgIG91dHB1dCBzdHJlYW0uCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIGRvVGFnKCkgCisgICAgICAgIHRocm93cyBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb247CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcGFyZW50IG9mIHRoaXMgdGFnLCBmb3IgY29sbGFib3JhdGlvbiBwdXJwb3Nlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY29udGFpbmVyIGludm9rZXMgdGhpcyBtZXRob2Qgb25seSBpZiB0aGlzIHRhZyBpbnZvY2F0aW9uIGlzIAorICAgICAqIG5lc3RlZCB3aXRoaW4gYW5vdGhlciB0YWcgaW52b2NhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHRhZyB0aGF0IGVuY2xvc2VzIHRoaXMgdGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KCBKc3BUYWcgcGFyZW50ICk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGFyZW50IG9mIHRoaXMgdGFnLCBmb3IgY29sbGFib3JhdGlvbiBwdXJwb3Nlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBvZiB0aGlzIHRhZworICAgICAqLyAKKyAgICBwdWJsaWMgSnNwVGFnIGdldFBhcmVudCgpOworICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgY29udGFpbmVyIHRvIHByb3ZpZGUgdGhpcyB0YWcgaGFuZGxlciB3aXRoCisgICAgICogdGhlIDxjb2RlPkpzcENvbnRleHQ8L2NvZGU+IGZvciB0aGlzIGludm9jYXRpb24uCisgICAgICogQW4gaW1wbGVtZW50YXRpb24gc2hvdWxkIHNhdmUgdGhpcyB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGMgdGhlIHBhZ2UgY29udGV4dCBmb3IgdGhpcyBpbnZvY2F0aW9uCisgICAgICogQHNlZSBUYWcjc2V0UGFnZUNvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKc3BDb250ZXh0KCBKc3BDb250ZXh0IHBjICk7CisgICAgICAgICAgICAgICAgCisgICAgLyoqIAorICAgICAqIFByb3ZpZGVzIHRoZSBib2R5IG9mIHRoaXMgdGFnIGFzIGEgSnNwRnJhZ21lbnQgb2JqZWN0LCBhYmxlIHRvIGJlIAorICAgICAqIGludm9rZWQgemVybyBvciBtb3JlIHRpbWVzIGJ5IHRoZSB0YWcgaGFuZGxlci4gCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgSlNQIHBhZ2UgaW1wbGVtZW50YXRpb24gCisgICAgICogb2JqZWN0IHByaW9yIHRvIDxjb2RlPmRvVGFnKCk8L2NvZGU+LiAgSWYgdGhlIGFjdGlvbiBlbGVtZW50IGlzCisgICAgICogZW1wdHkgaW4gdGhlIHBhZ2UsIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgYXQgYWxsLgorICAgICAqIAorICAgICAqIEBwYXJhbSBqc3BCb2R5IFRoZSBmcmFnbWVudCBlbmNhcHN1bGF0aW5nIHRoZSBib2R5IG9mIHRoaXMgdGFnLgorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCBzZXRKc3BCb2R5KCBKc3BGcmFnbWVudCBqc3BCb2R5ICk7CisKKyAgICAKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvU2ltcGxlVGFnU3VwcG9ydC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9TaW1wbGVUYWdTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyNmVmYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvU2ltcGxlVGFnU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMjEzIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBBIGJhc2UgY2xhc3MgZm9yIGRlZmluaW5nIHRhZyBoYW5kbGVycyBpbXBsZW1lbnRpbmcgU2ltcGxlVGFnLgorICogPHA+CisgKiBUaGUgU2ltcGxlVGFnU3VwcG9ydCBjbGFzcyBpcyBhIHV0aWxpdHkgY2xhc3MgaW50ZW5kZWQgdG8gYmUgdXNlZAorICogYXMgdGhlIGJhc2UgY2xhc3MgZm9yIG5ldyBzaW1wbGUgdGFnIGhhbmRsZXJzLiAgVGhlIFNpbXBsZVRhZ1N1cHBvcnQKKyAqIGNsYXNzIGltcGxlbWVudHMgdGhlIFNpbXBsZVRhZyBpbnRlcmZhY2UgYW5kIGFkZHMgYWRkaXRpb25hbAorICogY29udmVuaWVuY2UgbWV0aG9kcyBpbmNsdWRpbmcgZ2V0dGVyIG1ldGhvZHMgZm9yIHRoZSBwcm9wZXJ0aWVzIGluCisgKiBTaW1wbGVUYWcuCisgKgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlVGFnU3VwcG9ydCAKKyAgICBpbXBsZW1lbnRzIFNpbXBsZVRhZworeworICAgIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyB0YWcuICovCisgICAgcHJpdmF0ZSBKc3BUYWcgcGFyZW50VGFnOworICAgIAorICAgIC8qKiBUaGUgSlNQIGNvbnRleHQgZm9yIHRoZSB1cGNvbWluZyB0YWcgaW52b2NhdGlvbi4gKi8KKyAgICBwcml2YXRlIEpzcENvbnRleHQganNwQ29udGV4dDsKKyAgICAKKyAgICAvKiogVGhlIGJvZHkgb2YgdGhlIHRhZy4gKi8KKyAgICBwcml2YXRlIEpzcEZyYWdtZW50IGpzcEJvZHk7CisgICAgCisgICAgLyoqCisgICAgICogU29sZSBjb25zdHJ1Y3Rvci4gKEZvciBpbnZvY2F0aW9uIGJ5IHN1YmNsYXNzIGNvbnN0cnVjdG9ycywgCisgICAgICogdHlwaWNhbGx5IGltcGxpY2l0LikKKyAgICAgKi8KKyAgICBwdWJsaWMgU2ltcGxlVGFnU3VwcG9ydCgpIHsKKyAgICB9CisgICAgCisgICAgLyoqIAorICAgICAqIERlZmF1bHQgcHJvY2Vzc2luZyBvZiB0aGUgdGFnIGRvZXMgbm90aGluZy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSnNwRXhjZXB0aW9uIFN1YmNsYXNzZXMgY2FuIHRocm93IEpzcEV4Y2VwdGlvbiB0byBpbmRpY2F0ZQorICAgICAqICAgICBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoaXMgdGFnLgorICAgICAqIEB0aHJvd3MgamF2YXguc2VydmxldC5qc3AuU2tpcFBhZ2VFeGNlcHRpb24gSWYgdGhlIHBhZ2UgdGhhdAorICAgICAqICAgICAoZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIGludm9rZWQgdGhpcyB0YWcgaXMgdG8KKyAgICAgKiAgICAgY2Vhc2UgZXZhbHVhdGlvbi4gIEEgU2ltcGxlIFRhZyBIYW5kbGVyIGdlbmVyYXRlZCBmcm9tIGEgCisgICAgICogICAgIHRhZyBmaWxlIG11c3QgdGhyb3cgdGhpcyBleGNlcHRpb24gaWYgYW4gaW52b2tlZCBDbGFzc2ljIAorICAgICAqICAgICBUYWcgSGFuZGxlciByZXR1cm5lZCBTS0lQX1BBR0Ugb3IgaWYgYW4gaW52b2tlZCBTaW1wbGUKKyAgICAgKiAgICAgVGFnIEhhbmRsZXIgdGhyZXcgU2tpcFBhZ2VFeGNlcHRpb24gb3IgaWYgYW4gaW52b2tlZCBKc3AgRnJhZ21lbnQKKyAgICAgKiAgICAgdGhyZXcgYSBTa2lwUGFnZUV4Y2VwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFN1YmNsYXNzZXMgY2FuIHRocm93IElPRXhjZXB0aW9uIGlmIHRoZXJlIHdhcworICAgICAqICAgICBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICogQHNlZSBTaW1wbGVUYWcjZG9UYWcoKQorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCBkb1RhZygpIAorICAgICAgICB0aHJvd3MgSnNwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcGFyZW50IG9mIHRoaXMgdGFnLCBmb3IgY29sbGFib3JhdGlvbiBwdXJwb3Nlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY29udGFpbmVyIGludm9rZXMgdGhpcyBtZXRob2Qgb25seSBpZiB0aGlzIHRhZyBpbnZvY2F0aW9uIGlzCisgICAgICogbmVzdGVkIHdpdGhpbiBhbm90aGVyIHRhZyBpbnZvY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCB0aGUgdGFnIHRoYXQgZW5jbG9zZXMgdGhpcyB0YWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoIEpzcFRhZyBwYXJlbnQgKSB7CisgICAgICAgIHRoaXMucGFyZW50VGFnID0gcGFyZW50OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhpcyB0YWcsIGZvciBjb2xsYWJvcmF0aW9uIHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcGFyZW50IG9mIHRoaXMgdGFnCisgICAgICovIAorICAgIHB1YmxpYyBKc3BUYWcgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRUYWc7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFN0b3JlcyB0aGUgcHJvdmlkZWQgSlNQIGNvbnRleHQgaW4gdGhlIHByaXZhdGUganNwQ29udGV4dCBmaWVsZC4KKyAgICAgKiBTdWJjbGFzc2VzIGNhbiBhY2Nlc3MgdGhlIDxjb2RlPkpzcENvbnRleHQ8L2NvZGU+IHZpYSAKKyAgICAgKiA8Y29kZT5nZXRKc3BDb250ZXh0KCk8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYyB0aGUgcGFnZSBjb250ZXh0IGZvciB0aGlzIGludm9jYXRpb24KKyAgICAgKiBAc2VlIFNpbXBsZVRhZyNzZXRKc3BDb250ZXh0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SnNwQ29udGV4dCggSnNwQ29udGV4dCBwYyApIHsKKyAgICAgICAgdGhpcy5qc3BDb250ZXh0ID0gcGM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHBhZ2UgY29udGV4dCBwYXNzZWQgaW4gYnkgdGhlIGNvbnRhaW5lciB2aWEgCisgICAgICogc2V0SnNwQ29udGV4dC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHBhZ2UgY29udGV4dCBmb3IgdGhpcyBpbnZvY2F0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIEpzcENvbnRleHQgZ2V0SnNwQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuanNwQ29udGV4dDsKKyAgICB9CisgICAgICAgICAgICAgICAgCisgICAgLyoqIAorICAgICAqIFN0b3JlcyB0aGUgcHJvdmlkZWQgSnNwRnJhZ21lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ganNwQm9keSBUaGUgZnJhZ21lbnQgZW5jYXBzdWxhdGluZyB0aGUgYm9keSBvZiB0aGlzIHRhZy4KKyAgICAgKiAgICAgSWYgdGhlIGFjdGlvbiBlbGVtZW50IGlzIGVtcHR5IGluIHRoZSBwYWdlLCB0aGlzIG1ldGhvZCBpcyAKKyAgICAgKiAgICAgbm90IGNhbGxlZCBhdCBhbGwuCisgICAgICogQHNlZSBTaW1wbGVUYWcjc2V0SnNwQm9keQorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCBzZXRKc3BCb2R5KCBKc3BGcmFnbWVudCBqc3BCb2R5ICkgeworICAgICAgICB0aGlzLmpzcEJvZHkgPSBqc3BCb2R5OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBib2R5IHBhc3NlZCBpbiBieSB0aGUgY29udGFpbmVyIHZpYSBzZXRKc3BCb2R5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZnJhZ21lbnQgZW5jYXBzdWxhdGluZyB0aGUgYm9keSBvZiB0aGlzIHRhZywgb3IKKyAgICAgKiAgICBudWxsIGlmIHRoZSBhY3Rpb24gZWxlbWVudCBpcyBlbXB0eSBpbiB0aGUgcGFnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSnNwRnJhZ21lbnQgZ2V0SnNwQm9keSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuanNwQm9keTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBpbnN0YW5jZSBvZiBhIGdpdmVuIGNsYXNzIHR5cGUgdGhhdCBpcyBjbG9zZXN0IHRvIGEgZ2l2ZW4KKyAgICAgKiBpbnN0YW5jZS4KKyAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBnZXRQYXJlbnQgbWV0aG9kIGZyb20gdGhlIFRhZyBhbmQvb3IgU2ltcGxlVGFnCisgICAgICogaW50ZXJmYWNlcy4gIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGNvb3JkaW5hdGlvbiBhbW9uZyAKKyAgICAgKiBjb29wZXJhdGluZyB0YWdzLgorICAgICAqCisgICAgICogPHA+IEZvciBldmVyeSBpbnN0YW5jZSBvZiBUYWdBZGFwdGVyCisgICAgICogZW5jb3VudGVyZWQgd2hpbGUgdHJhdmVyc2luZyB0aGUgYW5jZXN0b3JzLCB0aGUgdGFnIGhhbmRsZXIgcmV0dXJuZWQgYnkKKyAgICAgKiA8dHQ+VGFnQWRhcHRlci5nZXRBZGFwdGVlKCk8L3R0PiAtIGluc3RlYWQgb2YgdGhlIFRhZ0FkcGF0ZXIgaXRzZWxmIC0KKyAgICAgKiBpcyBjb21wYXJlZCB0byA8dHQ+a2xhc3M8L3R0Pi4gSWYgdGhlIHRhZyBoYW5kbGVyIG1hdGNoZXMsIGl0IC0gYW5kCisgICAgICogbm90IGl0cyBUYWdBZGFwdGVyIC0gaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIG9ubHkgcHJvdmlkZXMgb25lIGZvcm1hbAorICAgICAqIHdheSBvZiBpbmRpY2F0aW5nIHRoZSBvYnNlcnZhYmxlIHR5cGUgb2YgYSB0YWcgaGFuZGxlcjogaXRzCisgICAgICogdGFnIGhhbmRsZXIgaW1wbGVtZW50YXRpb24gY2xhc3MsIGRlc2NyaWJlZCBpbiB0aGUgdGFnLWNsYXNzCisgICAgICogc3ViZWxlbWVudCBvZiB0aGUgdGFnIGVsZW1lbnQuICBUaGlzIGlzIGV4dGVuZGVkIGluIGFuCisgICAgICogaW5mb3JtYWwgbWFubmVyIGJ5IGFsbG93aW5nIHRoZSB0YWcgbGlicmFyeSBhdXRob3IgdG8KKyAgICAgKiBpbmRpY2F0ZSBpbiB0aGUgZGVzY3JpcHRpb24gc3ViZWxlbWVudCBhbiBvYnNlcnZhYmxlIHR5cGUuCisgICAgICogVGhlIHR5cGUgc2hvdWxkIGJlIGEgc3VidHlwZSBvZiB0aGUgdGFnIGhhbmRsZXIgaW1wbGVtZW50YXRpb24KKyAgICAgKiBjbGFzcyBvciB2b2lkLgorICAgICAqIFRoaXMgYWRkaXRpdGlvbmFsIGNvbnN0cmFpbnQgY2FuIGJlIGV4cGxvaXRlZCBieSBhCisgICAgICogc3BlY2lhbGl6ZWQgY29udGFpbmVyIHRoYXQga25vd3MgYWJvdXQgdGhhdCBzcGVjaWZpYyB0YWcgbGlicmFyeSwKKyAgICAgKiBhcyBpbiB0aGUgY2FzZSBvZiB0aGUgSlNQIHN0YW5kYXJkIHRhZyBsaWJyYXJ5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogV2hlbiBhIHRhZyBsaWJyYXJ5IGF1dGhvciBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUKKyAgICAgKiBvYnNlcnZhYmxlIHR5cGUgb2YgYSB0YWcgaGFuZGxlciwgY2xpZW50IHByb2dyYW1tYXRpYyBjb2RlCisgICAgICogc2hvdWxkIGFkaGVyZSB0byB0aGF0IGNvbnN0cmFpbnQuICBTcGVjaWZpY2FsbHksIHRoZSBDbGFzcworICAgICAqIHBhc3NlZCB0byBmaW5kQW5jZXN0b3JXaXRoQ2xhc3Mgc2hvdWxkIGJlIGEgc3VidHlwZSBvZiB0aGUKKyAgICAgKiBvYnNlcnZhYmxlIHR5cGUuCisgICAgICogCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbSBUaGUgaW5zdGFuY2UgZnJvbSB3aGVyZSB0byBzdGFydCBsb29raW5nLgorICAgICAqIEBwYXJhbSBrbGFzcyBUaGUgc3ViY2xhc3Mgb2YgSnNwVGFnIG9yIGludGVyZmFjZSB0byBiZSBtYXRjaGVkCisgICAgICogQHJldHVybiB0aGUgbmVhcmVzdCBhbmNlc3RvciB0aGF0IGltcGxlbWVudHMgdGhlIGludGVyZmFjZQorICAgICAqIG9yIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEpzcFRhZyBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoCisJSnNwVGFnIGZyb20sIENsYXNzIGtsYXNzKSAKKyAgICB7CisJYm9vbGVhbiBpc0ludGVyZmFjZSA9IGZhbHNlOworCisJaWYgKGZyb20gPT0gbnVsbCB8fCBrbGFzcyA9PSBudWxsCisJICAgICAgICB8fCAoIUpzcFRhZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGtsYXNzKQorCQkgICAgJiYgIShpc0ludGVyZmFjZSA9IGtsYXNzLmlzSW50ZXJmYWNlKCkpKSkgeworCSAgICByZXR1cm4gbnVsbDsKKwl9CisKKwlmb3IgKDs7KSB7CisJICAgIEpzcFRhZyBwYXJlbnQgPSBudWxsOworCSAgICBpZiggZnJvbSBpbnN0YW5jZW9mIFNpbXBsZVRhZyApIHsKKwkJcGFyZW50ID0gKChTaW1wbGVUYWcpZnJvbSkuZ2V0UGFyZW50KCk7CisJICAgIH0KKwkgICAgZWxzZSBpZiggZnJvbSBpbnN0YW5jZW9mIFRhZyApIHsKKwkJcGFyZW50ID0gKChUYWcpZnJvbSkuZ2V0UGFyZW50KCk7CisJICAgIH0KKwkgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOworCSAgICB9CisKKwkgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRhZ0FkYXB0ZXIpIHsKKwkJcGFyZW50ID0gKChUYWdBZGFwdGVyKSBwYXJlbnQpLmdldEFkYXB0ZWUoKTsKKwkgICAgfQorCisJICAgIGlmICgoaXNJbnRlcmZhY2UgJiYga2xhc3MuaXNJbnN0YW5jZShwYXJlbnQpKQorCQkgICAgfHwga2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwYXJlbnQuZ2V0Q2xhc3MoKSkpIHsKKwkJcmV0dXJuIHBhcmVudDsKKwkgICAgfQorCisJICAgIGZyb20gPSBwYXJlbnQ7CisJfQorICAgIH0gICAgCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZy5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGQzZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWcuamF2YQpAQCAtMCwwICsxLDI2MyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLio7CisKKworLyoqCisgKiBUaGUgaW50ZXJmYWNlIG9mIGEgY2xhc3NpYyB0YWcgaGFuZGxlciB0aGF0IGRvZXMgbm90IHdhbnQgdG8gbWFuaXB1bGF0ZSAKKyAqIGl0cyBib2R5LiAgVGhlIFRhZyBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgYmFzaWMgcHJvdG9jb2wgYmV0d2VlbiBhIFRhZyAKKyAqIGhhbmRsZXIgYW5kIEpTUCBwYWdlIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgSXQgZGVmaW5lcyB0aGUgbGlmZSBjeWNsZSAKKyAqIGFuZCB0aGUgbWV0aG9kcyB0byBiZSBpbnZva2VkIGF0IHN0YXJ0IGFuZCBlbmQgdGFnLgorICoKKyAqIDxwPjxCPlByb3BlcnRpZXM8L0I+PC9wPgorICoKKyAqIDxwPlRoZSBUYWcgaW50ZXJmYWNlIHNwZWNpZmllcyB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIgbWV0aG9kcyBmb3IgdGhlIGNvcmUKKyAqIHBhZ2VDb250ZXh0IGFuZCBwYXJlbnQgcHJvcGVydGllcy48L3A+CisgKgorICogPHA+VGhlIEpTUCBwYWdlIGltcGxlbWVudGF0aW9uIG9iamVjdCBpbnZva2VzIHNldFBhZ2VDb250ZXh0IGFuZAorICogc2V0UGFyZW50LCBpbiB0aGF0IG9yZGVyLCBiZWZvcmUgaW52b2tpbmcgZG9TdGFydFRhZygpIG9yIGRvRW5kVGFnKCkuPC9wPgorICoKKyAqIDxwPjxCPk1ldGhvZHM8L0I+PC9wPgorICoKKyAqIDxwPlRoZXJlIGFyZSB0d28gbWFpbiBhY3Rpb25zOiBkb1N0YXJ0VGFnIGFuZCBkb0VuZFRhZy4gIE9uY2UgYWxsCisgKiBhcHByb3ByaWF0ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBpbml0aWFsaXplZCwgdGhlIGRvU3RhcnRUYWcgYW5kCisgKiBkb0VuZFRhZyBtZXRob2RzIGNhbiBiZSBpbnZva2VkIG9uIHRoZSB0YWcgaGFuZGxlci4gIEJldHdlZW4gdGhlc2UKKyAqIGludm9jYXRpb25zLCB0aGUgdGFnIGhhbmRsZXIgaXMgYXNzdW1lZCB0byBob2xkIGEgc3RhdGUgdGhhdCBtdXN0CisgKiBiZSBwcmVzZXJ2ZWQuICBBZnRlciB0aGUgZG9FbmRUYWcgaW52b2NhdGlvbiwgdGhlIHRhZyBoYW5kbGVyIGlzCisgKiBhdmFpbGFibGUgZm9yIGZ1cnRoZXIgaW52b2NhdGlvbnMgKGFuZCBpdCBpcyBleHBlY3RlZCB0byBoYXZlCisgKiByZXRhaW5lZCBpdHMgcHJvcGVydGllcykuPC9wPgorICoKKyAqIDxwPjxCPkxpZmVjeWNsZTwvQj48L3A+CisgKgorICogPHA+TGlmZWN5Y2xlIGRldGFpbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgdHJhbnNpdGlvbiBkaWFncmFtIGJlbG93LAorICogd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1lbnRzOgorICogPHVsPgorICogPGxpPiBbMV0gVGhpcyB0cmFuc2l0aW9uIGlzIGludGVuZGVkIHRvIGJlIGZvciByZWxlYXNpbmcgbG9uZy10ZXJtIGRhdGEuCisgKiBubyBndWFyYW50ZWVzIGFyZSBhc3N1bWVkIG9uIHdoZXRoZXIgYW55IHByb3BlcnRpZXMgaGF2ZSBiZWVuIHJldGFpbmVkCisgKiBvciBub3QuCisgKiA8bGk+IFsyXSBUaGlzIHRyYW5zaXRpb24gaGFwcGVucyBpZiBhbmQgb25seSBpZiB0aGUgdGFnIGVuZHMgbm9ybWFsbHkKKyAqIHdpdGhvdXQgcmFpc2luZyBhbiBleGNlcHRpb24KKyAqIDxsaT4gWzNdIFNvbWUgc2V0dGVycyBtYXkgYmUgY2FsbGVkIGFnYWluIGJlZm9yZSBhIHRhZyBoYW5kbGVyIGlzIAorICogcmV1c2VkLiAgRm9yIGluc3RhbmNlLCA8Y29kZT5zZXRQYXJlbnQoKTwvY29kZT4gaXMgY2FsbGVkIGlmIGl0J3MgCisgKiByZXVzZWQgd2l0aGluIHRoZSBzYW1lIHBhZ2UgYnV0IGF0IGEgZGlmZmVyZW50IGxldmVsLCAKKyAqIDxjb2RlPnNldFBhZ2VDb250ZXh0KCk8L2NvZGU+IGlzIGNhbGxlZCBpZiBpdCdzIHVzZWQgaW4gYW5vdGhlciBwYWdlLCAKKyAqIGFuZCBhdHRyaWJ1dGUgc2V0dGVycyBhcmUgY2FsbGVkIGlmIHRoZSB2YWx1ZXMgZGlmZmVyIG9yIGFyZSBleHByZXNzZWQgCisgKiBhcyByZXF1ZXN0LXRpbWUgYXR0cmlidXRlIHZhbHVlcy4KKyAqIDxsaT4gQ2hlY2sgdGhlIFRyeUNhdGNoRmluYWxseSBpbnRlcmZhY2UgZm9yIGFkZGl0aW9uYWwgZGV0YWlscyByZWxhdGVkCisgKiB0byBleGNlcHRpb24gaGFuZGxpbmcgYW5kIHJlc291cmNlIG1hbmFnZW1lbnQuCisgKiA8L3VsPjwvcD4KKyAqCisgKiA8SU1HIHNyYz0iZG9jLWZpbGVzL1RhZ1Byb3RvY29sLmdpZiIKKyAqICAgICAgYWx0PSJMaWZlY3ljbGUgRGV0YWlscyBUcmFuc2l0aW9uIERpYWdyYW0gZm9yIFRhZyIvPgorICogCisgKiA8cD5PbmNlIGFsbCBpbnZvY2F0aW9ucyBvbiB0aGUgdGFnIGhhbmRsZXIKKyAqIGFyZSBjb21wbGV0ZWQsIHRoZSByZWxlYXNlIG1ldGhvZCBpcyBpbnZva2VkIG9uIGl0LiAgT25jZSBhIHJlbGVhc2UKKyAqIG1ldGhvZCBpcyBpbnZva2VkIDxlbT5hbGw8L2VtPiBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgcGFyZW50IGFuZAorICogcGFnZUNvbnRleHQsIGFyZSBhc3N1bWVkIHRvIGhhdmUgYmVlbiByZXNldCB0byBhbiB1bnNwZWNpZmllZCB2YWx1ZS4KKyAqIFRoZSBwYWdlIGNvbXBpbGVyIGd1YXJhbnRlZXMgdGhhdCByZWxlYXNlKCkgd2lsbCBiZSBpbnZva2VkIG9uIHRoZSBUYWcKKyAqIGhhbmRsZXIgYmVmb3JlIHRoZSBoYW5kbGVyIGlzIHJlbGVhc2VkIHRvIHRoZSBHQy48L3A+CisgKgorICogPHA+PEI+RW1wdHkgYW5kIE5vbi1FbXB0eSBBY3Rpb248L0I+PC9wPgorICogPHA+SWYgdGhlIFRhZ0xpYnJhcnlEZXNjcmlwdG9yIGZpbGUgaW5kaWNhdGVzIHRoYXQgdGhlIGFjdGlvbiBtdXN0CisgKiBhbHdheXMgaGF2ZSBhbiBlbXB0eSBhY3Rpb24sIGJ5IGFuICZsdDtib2R5LWNvbnRlbnQmZ3Q7IGVudHJ5IG9mICJlbXB0eSIsCisgKiB0aGVuIHRoZSBkb1N0YXJ0VGFnKCkgbWV0aG9kIG11c3QgcmV0dXJuIFNLSVBfQk9EWS48L3A+CisgKgorICogPHA+T3RoZXJ3aXNlLCB0aGUgZG9TdGFydFRhZygpIG1ldGhvZCBtYXkgcmV0dXJuIFNLSVBfQk9EWSBvcgorICogRVZBTF9CT0RZX0lOQ0xVREUuPC9wPgorICoKKyAqIDxwPklmIFNLSVBfQk9EWSBpcyByZXR1cm5lZCB0aGUgYm9keSwgaWYgcHJlc2VudCwgaXMgbm90IGV2YWx1YXRlZC48L3A+CisgKiAKKyAqIDxwPklmIEVWQUxfQk9EWV9JTkNMVURFIGlzIHJldHVybmVkLCB0aGUgYm9keSBpcyBldmFsdWF0ZWQgYW5kCisgKiAicGFzc2VkIHRocm91Z2giIHRvIHRoZSBjdXJyZW50IG91dC48L3A+CisqLworCitwdWJsaWMgaW50ZXJmYWNlIFRhZyBleHRlbmRzIEpzcFRhZyB7CisKKyAgICAvKioKKyAgICAgKiBTa2lwIGJvZHkgZXZhbHVhdGlvbi4KKyAgICAgKiBWYWxpZCByZXR1cm4gdmFsdWUgZm9yIGRvU3RhcnRUYWcgYW5kIGRvQWZ0ZXJCb2R5LgorICAgICAqLworIAorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNLSVBfQk9EWSA9IDA7CisgCisgICAgLyoqCisgICAgICogRXZhbHVhdGUgYm9keSBpbnRvIGV4aXN0aW5nIG91dCBzdHJlYW0uCisgICAgICogVmFsaWQgcmV0dXJuIHZhbHVlIGZvciBkb1N0YXJ0VGFnLgorICAgICAqLworIAorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVWQUxfQk9EWV9JTkNMVURFID0gMTsKKworICAgIC8qKgorICAgICAqIFNraXAgdGhlIHJlc3Qgb2YgdGhlIHBhZ2UuCisgICAgICogVmFsaWQgcmV0dXJuIHZhbHVlIGZvciBkb0VuZFRhZy4KKyAgICAgKi8KKworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNLSVBfUEFHRSA9IDU7CisKKyAgICAvKioKKyAgICAgKiBDb250aW51ZSBldmFsdWF0aW5nIHRoZSBwYWdlLgorICAgICAqIFZhbGlkIHJldHVybiB2YWx1ZSBmb3IgZG9FbmRUYWcoKS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVWQUxfUEFHRSA9IDY7CisKKyAgICAvLyBTZXR0ZXJzIGZvciBUYWcgaGFuZGxlciBkYXRhCisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY3VycmVudCBwYWdlIGNvbnRleHQuCisgICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgSlNQIHBhZ2UgaW1wbGVtZW50YXRpb24gb2JqZWN0CisgICAgICogcHJpb3IgdG8gZG9TdGFydFRhZygpLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgdmFsdWUgaXMgKm5vdCogcmVzZXQgYnkgZG9FbmRUYWcoKSBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IHJlc2V0CisgICAgICogYnkgYSBwYWdlIGltcGxlbWVudGF0aW9uIGlmIGl0IGNoYW5nZXMgYmV0d2VlbiBjYWxscyB0byBkb1N0YXJ0VGFnKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGMgVGhlIHBhZ2UgY29udGV4dCBmb3IgdGhpcyB0YWcgaGFuZGxlci4KKyAgICAgKi8KKworICAgIHZvaWQgc2V0UGFnZUNvbnRleHQoUGFnZUNvbnRleHQgcGMpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhcmVudCAoY2xvc2VzdCBlbmNsb3NpbmcgdGFnIGhhbmRsZXIpIG9mIHRoaXMgdGFnIGhhbmRsZXIuCisgICAgICogSW52b2tlZCBieSB0aGUgSlNQIHBhZ2UgaW1wbGVtZW50YXRpb24gb2JqZWN0IHByaW9yIHRvIGRvU3RhcnRUYWcoKS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHZhbHVlIGlzICpub3QqIHJlc2V0IGJ5IGRvRW5kVGFnKCkgYW5kIG11c3QgYmUgZXhwbGljaXRseSByZXNldAorICAgICAqIGJ5IGEgcGFnZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0IFRoZSBwYXJlbnQgdGFnLCBvciBudWxsLgorICAgICAqLworCisKKyAgICB2b2lkIHNldFBhcmVudChUYWcgdCk7CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGFyZW50IChjbG9zZXN0IGVuY2xvc2luZyB0YWcgaGFuZGxlcikgZm9yIHRoaXMgdGFnIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZ2V0UGFyZW50KCkgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIG5hdmlnYXRlIHRoZSBuZXN0ZWQgdGFnCisgICAgICogaGFuZGxlciBzdHJ1Y3R1cmUgYXQgcnVudGltZSBmb3IgY29vcGVyYXRpb24gYW1vbmcgY3VzdG9tIGFjdGlvbnM7CisgICAgICogZm9yIGV4YW1wbGUsIHRoZSBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoKSBtZXRob2QgaW4gVGFnU3VwcG9ydAorICAgICAqIHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgb2YgZG9pbmcgdGhpcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24gb25seSBwcm92aWRlcyBvbmUgZm9ybWFsCisgICAgICogd2F5IG9mIGluZGljYXRpbmcgdGhlIG9ic2VydmFibGUgdHlwZSBvZiBhIHRhZyBoYW5kbGVyOiBpdHMKKyAgICAgKiB0YWcgaGFuZGxlciBpbXBsZW1lbnRhdGlvbiBjbGFzcywgZGVzY3JpYmVkIGluIHRoZSB0YWctY2xhc3MKKyAgICAgKiBzdWJlbGVtZW50IG9mIHRoZSB0YWcgZWxlbWVudC4gIFRoaXMgaXMgZXh0ZW5kZWQgaW4gYW4KKyAgICAgKiBpbmZvcm1hbCBtYW5uZXIgYnkgYWxsb3dpbmcgdGhlIHRhZyBsaWJyYXJ5IGF1dGhvciB0bworICAgICAqIGluZGljYXRlIGluIHRoZSBkZXNjcmlwdGlvbiBzdWJlbGVtZW50IGFuIG9ic2VydmFibGUgdHlwZS4KKyAgICAgKiBUaGUgdHlwZSBzaG91bGQgYmUgYSBzdWJ0eXBlIG9mIHRoZSB0YWcgaGFuZGxlciBpbXBsZW1lbnRhdGlvbgorICAgICAqIGNsYXNzIG9yIHZvaWQuCisgICAgICogVGhpcyBhZGRpdGl0aW9uYWwgY29uc3RyYWludCBjYW4gYmUgZXhwbG9pdGVkIGJ5IGEKKyAgICAgKiBzcGVjaWFsaXplZCBjb250YWluZXIgdGhhdCBrbm93cyBhYm91dCB0aGF0IHNwZWNpZmljIHRhZyBsaWJyYXJ5LAorICAgICAqIGFzIGluIHRoZSBjYXNlIG9mIHRoZSBKU1Agc3RhbmRhcmQgdGFnIGxpYnJhcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHBhcmVudCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEBzZWUgVGFnU3VwcG9ydCNmaW5kQW5jZXN0b3JXaXRoQ2xhc3MKKyAgICAgKi8KKworICAgIFRhZyBnZXRQYXJlbnQoKTsKKworCisgICAgLy8gQWN0aW9ucyBmb3IgYmFzaWMgc3RhcnQvZW5kIHByb2Nlc3NpbmcuCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHN0YXJ0IHRhZyBmb3IgdGhpcyBpbnN0YW5jZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBKU1AgcGFnZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZG9TdGFydFRhZyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBwcm9wZXJ0aWVzIHBhZ2VDb250ZXh0IGFuZAorICAgICAqIHBhcmVudCBoYXZlIGJlZW4gc2V0LiBJdCBhbHNvIGFzc3VtZXMgdGhhdCBhbnkgcHJvcGVydGllcyBleHBvc2VkIGFzCisgICAgICogYXR0cmlidXRlcyBoYXZlIGJlZW4gc2V0IHRvby4gIFdoZW4gdGhpcyBtZXRob2QgaXMgaW52b2tlZCwgdGhlIGJvZHkKKyAgICAgKiBoYXMgbm90IHlldCBiZWVuIGV2YWx1YXRlZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgVGFnLkVWQUxfQk9EWV9JTkNMVURFIG9yCisgICAgICogQm9keVRhZy5FVkFMX0JPRFlfQlVGRkVSRUQgdG8gaW5kaWNhdGUKKyAgICAgKiB0aGF0IHRoZSBib2R5IG9mIHRoZSBhY3Rpb24gc2hvdWxkIGJlIGV2YWx1YXRlZCBvciBTS0lQX0JPRFkgdG8KKyAgICAgKiBpbmRpY2F0ZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIGEgVGFnIHJldHVybnMgRVZBTF9CT0RZX0lOQ0xVREUgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nCisgICAgICogdGhlIGJvZHkgKGlmIGFueSkgaXMgaW5jbHVkZWQgaW50byB0aGUgY3VycmVudCAib3V0IiBKc3BXcml0ZXIgYXMgaXQKKyAgICAgKiBoYXBwZW5zIGFuZCB0aGVuIGRvRW5kVGFnKCkgaXMgaW52b2tlZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEJvZHlUYWcuRVZBTF9CT0RZX0JVRkZFUkVEIGlzIG9ubHkgdmFsaWQgIGlmIHRoZSB0YWcgaGFuZGxlcgorICAgICAqIGltcGxlbWVudHMgQm9keVRhZy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBKU1AgY29udGFpbmVyIHdpbGwgcmVzeW5jaHJvbml6ZSB0aGUgdmFsdWVzIG9mIGFueSBBVF9CRUdJTiBhbmQKKyAgICAgKiBORVNURUQgdmFyaWFibGVzIChkZWZpbmVkIGJ5IHRoZSBhc3NvY2lhdGVkIFRhZ0V4dHJhSW5mbyBvciBUTEQpCisgICAgICogYWZ0ZXIgdGhlIGludm9jYXRpb24gb2YgZG9TdGFydFRhZygpLCBleGNlcHQgZm9yIGEgdGFnIGhhbmRsZXIKKyAgICAgKiBpbXBsZW1lbnRpbmcgQm9keVRhZyB3aG9zZSBkb1N0YXJ0VGFnKCkgbWV0aG9kIHJldHVybnMKKyAgICAgKiBCb2R5VGFnLkVWQUxfQk9EWV9CVUZGRVJFRC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gRVZBTF9CT0RZX0lOQ0xVREUgaWYgdGhlIHRhZyB3YW50cyB0byBwcm9jZXNzIGJvZHksIFNLSVBfQk9EWSAKKyAgICAgKiAgICAgaWYgaXQgZG9lcyBub3Qgd2FudCB0byBwcm9jZXNzIGl0LgorICAgICAqIEB0aHJvd3MgSnNwRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyB0YWcKKyAgICAgKiBAc2VlIEJvZHlUYWcKKyAgICAgKi8KKyAKKyAgICBpbnQgZG9TdGFydFRhZygpIHRocm93cyBKc3BFeGNlcHRpb247CisgCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBlbmQgdGFnIGZvciB0aGlzIGluc3RhbmNlLgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYnkgdGhlIEpTUCBwYWdlIGltcGxlbWVudGF0aW9uIG9iamVjdAorICAgICAqIG9uIGFsbCBUYWcgaGFuZGxlcnMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciByZXR1cm5pbmcgZnJvbSBkb1N0YXJ0VGFnLiBUaGUKKyAgICAgKiBib2R5IG9mIHRoZSBhY3Rpb24gbWF5IG9yIG1heSBub3QgaGF2ZSBiZWVuIGV2YWx1YXRlZCwgZGVwZW5kaW5nIG9uCisgICAgICogdGhlIHJldHVybiB2YWx1ZSBvZiBkb1N0YXJ0VGFnLgorICAgICAqCisgICAgICogPHA+CisgICAgICogSWYgdGhpcyBtZXRob2QgcmV0dXJucyBFVkFMX1BBR0UsIHRoZSByZXN0IG9mIHRoZSBwYWdlIGNvbnRpbnVlcworICAgICAqIHRvIGJlIGV2YWx1YXRlZC4gIElmIHRoaXMgbWV0aG9kIHJldHVybnMgU0tJUF9QQUdFLCB0aGUgcmVzdCBvZgorICAgICAqIHRoZSBwYWdlIGlzIG5vdCBldmFsdWF0ZWQsIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlZCwgYW5kIAorICAgICAqIHRoZSBkb0VuZFRhZygpIG1ldGhvZHMgb2YgZW5jbG9zaW5nIHRhZ3MgYXJlIG5vdCBpbnZva2VkLiAgSWYgdGhpcworICAgICAqIHJlcXVlc3Qgd2FzIGZvcndhcmRlZCBvciBpbmNsdWRlZCBmcm9tIGFub3RoZXIgcGFnZSAob3IgU2VydmxldCksCisgICAgICogb25seSB0aGUgY3VycmVudCBwYWdlIGV2YWx1YXRpb24gaXMgc3RvcHBlZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBKU1AgY29udGFpbmVyIHdpbGwgcmVzeW5jaHJvbml6ZSB0aGUgdmFsdWVzIG9mIGFueSBBVF9CRUdJTiBhbmQKKyAgICAgKiBBVF9FTkQgdmFyaWFibGVzIChkZWZpbmVkIGJ5IHRoZSBhc3NvY2lhdGVkIFRhZ0V4dHJhSW5mbyBvciBUTEQpCisgICAgICogYWZ0ZXIgdGhlIGludm9jYXRpb24gb2YgZG9FbmRUYWcoKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRvIGNvbnRpbnVlIGV2YWx1YXRpbmcgdGhlIEpTUCBwYWdlLgorICAgICAqIEB0aHJvd3MgSnNwRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyB0YWcKKyAgICAgKi8KKworICAgIGludCBkb0VuZFRhZygpIHRocm93cyBKc3BFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgb24gYSBUYWcgaGFuZGxlciB0byByZWxlYXNlIHN0YXRlLgorICAgICAqIFRoZSBwYWdlIGNvbXBpbGVyIGd1YXJhbnRlZXMgdGhhdCBKU1AgcGFnZSBpbXBsZW1lbnRhdGlvbgorICAgICAqIG9iamVjdHMgd2lsbCBpbnZva2UgdGhpcyBtZXRob2Qgb24gYWxsIHRhZyBoYW5kbGVycywKKyAgICAgKiBidXQgdGhlcmUgbWF5IGJlIG11bHRpcGxlIGludm9jYXRpb25zIG9uIGRvU3RhcnRUYWcgYW5kIGRvRW5kVGFnIGluIGJldHdlZW4uCisgICAgICovCisKKyAgICB2b2lkIHJlbGVhc2UoKTsKKworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdBZGFwdGVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZ0FkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjMwOWE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIAorcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC4qOworCisKKy8qKgorICogV3JhcHMgYW55IFNpbXBsZVRhZyBhbmQgZXhwb3NlcyBpdCB1c2luZyBhIFRhZyBpbnRlcmZhY2UuICBUaGlzIGlzIHVzZWQKKyAqIHRvIGFsbG93IGNvbGxhYm9yYXRpb24gYmV0d2VlbiBjbGFzc2ljIFRhZyBoYW5kbGVycyBhbmQgU2ltcGxlVGFnCisgKiBoYW5kbGVycy4KKyAqIDxwPgorICogQmVjYXVzZSBTaW1wbGVUYWcgZG9lcyBub3QgZXh0ZW5kIFRhZywgYW5kIGJlY2F1c2UgVGFnLnNldFBhcmVudCgpCisgKiBvbmx5IGFjY2VwdHMgYSBUYWcgaW5zdGFuY2UsIGEgY2xhc3NpYyB0YWcgaGFuZGxlciAob25lCisgKiB0aGF0IGltcGxlbWVudHMgVGFnKSBjYW5ub3QgaGF2ZSBhIFNpbXBsZVRhZyBhcyBpdHMgcGFyZW50LiAgVG8gcmVtZWR5CisgKiB0aGlzLCBhIFRhZ0FkYXB0ZXIgaXMgY3JlYXRlZCB0byB3cmFwIHRoZSBTaW1wbGVUYWcgcGFyZW50LCBhbmQgdGhlCisgKiBhZGFwdGVyIGlzIHBhc3NlZCB0byBzZXRQYXJlbnQoKSBpbnN0ZWFkLiAgQSBjbGFzc2ljIFRhZyBIYW5kbGVyIGNhbgorICogY2FsbCBnZXRBZGFwdGVlKCkgdG8gcmV0cmlldmUgdGhlIGVuY2Fwc3VsYXRlZCBTaW1wbGVUYWcgaW5zdGFuY2UuCisgKgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgVGFnQWRhcHRlciAKKyAgICBpbXBsZW1lbnRzIFRhZworeworICAgIC8qKiBUaGUgc2ltcGxlIHRhZyB0aGF0J3MgYmVpbmcgYWRhcHRlZC4gKi8KKyAgICBwcml2YXRlIFNpbXBsZVRhZyBzaW1wbGVUYWdBZGFwdGVlOworCisgICAgLyoqIFRoZSBwYXJlbnQsIG9mIHRoaXMgdGFnLCBjb252ZXJ0ZWQgKGlmIG5lY2Vzc2FyeSkgdG8gYmUgb2YgdHlwZSBUYWcuICovCisgICAgcHJpdmF0ZSBUYWcgcGFyZW50OworCisgICAgLy8gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgd2UgaGF2ZSBhbHJlYWR5IGRldGVybWluZWQgdGhlIHBhcmVudAorICAgIHByaXZhdGUgYm9vbGVhbiBwYXJlbnREZXRlcm1pbmVkOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBUYWdBZGFwdGVyIHRoYXQgd3JhcHMgdGhlIGdpdmVuIFNpbXBsZVRhZyBhbmQgCisgICAgICogcmV0dXJucyB0aGUgcGFyZW50IHRhZyB3aGVuIGdldFBhcmVudCgpIGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVlIFRoZSBTaW1wbGVUYWcgYmVpbmcgYWRhcHRlZCBhcyBhIFRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnQWRhcHRlciggU2ltcGxlVGFnIGFkYXB0ZWUgKSB7CisgICAgICAgIGlmKCBhZGFwdGVlID09IG51bGwgKSB7CisJICAgIC8vIENhbm5vdCB3cmFwIGEgbnVsbCBhZGFwdGVlLgorCSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zaW1wbGVUYWdBZGFwdGVlID0gYWRhcHRlZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogTXVzdCBub3QgYmUgY2FsbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHBjIGlnbm9yZWQuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBNdXN0IG5vdCBiZSBjYWxsZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYWdlQ29udGV4dChQYWdlQ29udGV4dCBwYykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIAorICAgICAgICAgICAgIklsbGVnYWwgdG8gaW52b2tlIHNldFBhZ2VDb250ZXh0KCkgb24gVGFnQWRhcHRlciB3cmFwcGVyIiApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogTXVzdCBub3QgYmUgY2FsbGVkLiAgVGhlIHBhcmVudCBvZiB0aGlzIHRhZyBpcyBhbHdheXMgCisgICAgICogZ2V0QWRhcHRlZSgpLmdldFBhcmVudCgpLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudFRhZyBpZ25vcmVkLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gTXVzdCBub3QgYmUgY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudCggVGFnIHBhcmVudFRhZyApIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAKKyAgICAgICAgICAgICJJbGxlZ2FsIHRvIGludm9rZSBzZXRQYXJlbnQoKSBvbiBUYWdBZGFwdGVyIHdyYXBwZXIiICk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhpcyB0YWcsIHdoaWNoIGlzIGFsd2F5cworICAgICAqIGdldEFkYXB0ZWUoKS5nZXRQYXJlbnQoKS4gIAorICAgICAqCisgICAgICogVGhpcyB3aWxsIGVpdGhlciBiZSB0aGUgZW5jbG9zaW5nIFRhZyAoaWYgZ2V0QWRhcHRlZSgpLmdldFBhcmVudCgpCisgICAgICogaW1wbGVtZW50cyBUYWcpLCBvciBhbiBhZGFwdGVyIHRvIHRoZSBlbmNsb3NpbmcgVGFnIChpZiAKKyAgICAgKiBnZXRBZGFwdGVlKCkuZ2V0UGFyZW50KCkgZG9lcyBub3QgaW1wbGVtZW50IFRhZykuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBwYXJlbnQgb2YgdGhlIHRhZyBiZWluZyBhZGFwdGVkLgorICAgICAqLworICAgIHB1YmxpYyBUYWcgZ2V0UGFyZW50KCkgeworCWlmICghcGFyZW50RGV0ZXJtaW5lZCkgeworCSAgICBKc3BUYWcgYWRhcHRlZVBhcmVudCA9IHNpbXBsZVRhZ0FkYXB0ZWUuZ2V0UGFyZW50KCk7CisJICAgIGlmIChhZGFwdGVlUGFyZW50ICE9IG51bGwpIHsKKwkJaWYgKGFkYXB0ZWVQYXJlbnQgaW5zdGFuY2VvZiBUYWcpIHsKKwkJICAgIHRoaXMucGFyZW50ID0gKFRhZykgYWRhcHRlZVBhcmVudDsKKwkJfSBlbHNlIHsKKwkJICAgIC8vIE11c3QgYmUgU2ltcGxlVGFnIC0gbm8gb3RoZXIgdHlwZXMgZGVmaW5lZC4KKwkJICAgIHRoaXMucGFyZW50ID0gbmV3IFRhZ0FkYXB0ZXIoKFNpbXBsZVRhZykgYWRhcHRlZVBhcmVudCk7CisJCX0KKwkgICAgfQorCSAgICBwYXJlbnREZXRlcm1pbmVkID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gdGhpcy5wYXJlbnQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIHRhZyB0aGF0IGlzIGJlaW5nIGFkYXB0ZWQgdG8gdGhlIFRhZyBpbnRlcmZhY2UuCisgICAgICogVGhpcyBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgU2ltcGxlVGFnIGluIEpTUCAyLjAsIGJ1dCByb29tCisgICAgICogaXMgbGVmdCBmb3Igb3RoZXIga2luZHMgb2YgdGFncyBpbiBmdXR1cmUgc3BlYyB2ZXJzaW9ucy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRhZyB0aGF0IGlzIGJlaW5nIGFkYXB0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwVGFnIGdldEFkYXB0ZWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNpbXBsZVRhZ0FkYXB0ZWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogTXVzdCBub3QgYmUgY2FsbGVkLgorICAgICAqCisgICAgICogQHJldHVybiBhbHdheXMgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBNdXN0IG5vdCBiZSBjYWxsZWQKKyAgICAgKiBAdGhyb3dzIEpzcEV4Y2VwdGlvbiBuZXZlciB0aHJvd24KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRvU3RhcnRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAKKyAgICAgICAgICAgICJJbGxlZ2FsIHRvIGludm9rZSBkb1N0YXJ0VGFnKCkgb24gVGFnQWRhcHRlciB3cmFwcGVyIiApOworICAgIH0KKyAKKyAgICAvKioKKyAgICAgKiBNdXN0IG5vdCBiZSBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFsd2F5cyB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIE11c3Qgbm90IGJlIGNhbGxlZAorICAgICAqIEB0aHJvd3MgSnNwRXhjZXB0aW9uIG5ldmVyIHRocm93bgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZG9FbmRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAKKyAgICAgICAgICAgICJJbGxlZ2FsIHRvIGludm9rZSBkb0VuZFRhZygpIG9uIFRhZ0FkYXB0ZXIgd3JhcHBlciIgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXN0IG5vdCBiZSBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIE11c3Qgbm90IGJlIGNhbGxlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggCisgICAgICAgICAgICAiSWxsZWdhbCB0byBpbnZva2UgcmVsZWFzZSgpIG9uIFRhZ0FkYXB0ZXIgd3JhcHBlciIgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZ0F0dHJpYnV0ZUluZm8uamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnQXR0cmlidXRlSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MTBmYTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZ0F0dHJpYnV0ZUluZm8uamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyAKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCisvKioKKyAqIEluZm9ybWF0aW9uIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIGEgVGFnLCBhdmFpbGFibGUgYXQgdHJhbnNsYXRpb24gdGltZS4KKyAqIFRoaXMgY2xhc3MgaXMgaW5zdGFudGlhdGVkIGZyb20gdGhlIFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IgZmlsZSAoVExEKS4KKyAqCisgKiA8cD4KKyAqIE9ubHkgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBnZW5lcmF0ZSBjb2RlIGlzIGluY2x1ZGVkIGhlcmUuICBPdGhlciBpbmZvcm1hdGlvbgorICogbGlrZSBTQ0hFTUEgZm9yIHZhbGlkYXRpb24gYmVsb25ncyBlbHNld2hlcmUuCisgKi8KKworcHVibGljIGNsYXNzIFRhZ0F0dHJpYnV0ZUluZm8geworICAgIC8qKgorICAgICAqICJpZCIgaXMgd2lyZWQgaW4gdG8gYmUgSUQuICBUaGVyZSBpcyBubyByZWFsIGJlbmVmaXQgaW4gaGF2aW5nIGl0IGJlIHNvbWV0aGluZyBlbHNlCisgICAgICogSURSRUZzIGFyZSBub3QgaGFuZGxlZCBhbnkgZGlmZmVyZW50bHkuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJpZCI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgVGFnQXR0cmlidXRlSW5mby4KKyAgICAgKiBUaGlzIGNsYXNzIGlzIHRvIGJlIGluc3RhbnRpYXRlZCBvbmx5IGZyb20gdGhlCisgICAgICogVGFnTGlicmFyeSBjb2RlIHVuZGVyIHJlcXVlc3QgZnJvbSBzb21lIEpTUCBjb2RlIHRoYXQgaXMgcGFyc2luZyBhCisgICAgICogVExEIChUYWcgTGlicmFyeSBEZXNjcmlwdG9yKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHJlcXVpcmVkIElmIHRoaXMgYXR0cmlidXRlIGlzIHJlcXVpcmVkIGluIHRhZyBpbnN0YW5jZXMuCisgICAgICogQHBhcmFtIHR5cGUgVGhlIG5hbWUgb2YgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gcmVxVGltZSBXaGV0aGVyIHRoaXMgYXR0cmlidXRlIGhvbGRzIGEgcmVxdWVzdC10aW1lIEF0dHJpYnV0ZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBUYWdBdHRyaWJ1dGVJbmZvKFN0cmluZyBuYW1lLCBib29sZWFuIHJlcXVpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlLCBib29sZWFuIHJlcVRpbWUpCisgICAgeworCXRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMucmVxdWlyZWQgPSByZXF1aXJlZDsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKwl0aGlzLnJlcVRpbWUgPSByZXFUaW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpTUCAyLjAgQ29uc3RydWN0b3IgZm9yIFRhZ0F0dHJpYnV0ZUluZm8uCisgICAgICogVGhpcyBjbGFzcyBpcyB0byBiZSBpbnN0YW50aWF0ZWQgb25seSBmcm9tIHRoZQorICAgICAqIFRhZ0xpYnJhcnkgY29kZSB1bmRlciByZXF1ZXN0IGZyb20gc29tZSBKU1AgY29kZSB0aGF0IGlzIHBhcnNpbmcgYQorICAgICAqIFRMRCAoVGFnIExpYnJhcnkgRGVzY3JpcHRvcikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSByZXF1aXJlZCBJZiB0aGlzIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBpbiB0YWcgaW5zdGFuY2VzLgorICAgICAqIEBwYXJhbSB0eXBlIFRoZSBuYW1lIG9mIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHJlcVRpbWUgV2hldGhlciB0aGlzIGF0dHJpYnV0ZSBob2xkcyBhIHJlcXVlc3QtdGltZSBBdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGZyYWdtZW50IFdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUgaXMgb2YgdHlwZSBKc3BGcmFnbWVudAorICAgICAqCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworCisgICAgcHVibGljIFRhZ0F0dHJpYnV0ZUluZm8oU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVxdWlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUsIGJvb2xlYW4gcmVxVGltZSwKKwkJCSAgICBib29sZWFuIGZyYWdtZW50KQorICAgIHsKKwl0aGlzKCBuYW1lLCByZXF1aXJlZCwgdHlwZSwgcmVxVGltZSApOworCXRoaXMuZnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCXJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIChhcyBhIFN0cmluZykgb2YgdGhpcyBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7CisJcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIGF0dHJpYnV0ZSBjYW4gaG9sZCBhIHJlcXVlc3QtdGltZSB2YWx1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaWYgdGhlIGF0dHJpYnV0ZSBjYW4gaG9sZCBhIHJlcXVlc3QtdGltZSB2YWx1ZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBib29sZWFuIGNhbkJlUmVxdWVzdFRpbWUoKSB7CisJcmV0dXJuIHJlcVRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgeworICAgICAgICByZXR1cm4gcmVxdWlyZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2Ugc3RhdGljIG1ldGhvZCB0aGF0IGdvZXMgdGhyb3VnaCBhbiBhcnJheSBvZiBUYWdBdHRyaWJ1dGVJbmZvCisgICAgICogb2JqZWN0cyBhbmQgbG9va3MgZm9yICJpZCIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYSBBbiBhcnJheSBvZiBUYWdBdHRyaWJ1dGVJbmZvCisgICAgICogQHJldHVybiBUaGUgVGFnQXR0cmlidXRlSW5mbyByZWZlcmVuY2Ugd2l0aCBuYW1lICJpZCIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFRhZ0F0dHJpYnV0ZUluZm8gZ2V0SWRBdHRyaWJ1dGUoVGFnQXR0cmlidXRlSW5mbyBhW10pIHsKKwlmb3IgKGludCBpPTA7IGk8YS5sZW5ndGg7IGkrKykgeworCSAgICBpZiAoYVtpXS5nZXROYW1lKCkuZXF1YWxzKElEKSkgeworCQlyZXR1cm4gYVtpXTsKKwkgICAgfQorCX0KKwlyZXR1cm4gbnVsbDsJCS8vIG5vIHN1Y2ggYXR0cmlidXRlCisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyBvZiB0eXBlIEpzcEZyYWdtZW50LgorICAgICAqCisgICAgICogQHJldHVybiBpZiB0aGUgYXR0cmlidXRlIGlzIG9mIHR5cGUgSnNwRnJhZ21lbnQKKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZyYWdtZW50KCkgeworCXJldHVybiBmcmFnbWVudDsKKyAgICB9CisKKworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBUYWdBdHRyaWJ1dGVJbmZvLCBzdWl0YWJsZQorICAgICAqIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgVGFnQXR0cmlidXRlSW5mbworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBiLmFwcGVuZCgibmFtZSA9ICIrbmFtZSsiICIpOworICAgICAgICBiLmFwcGVuZCgidHlwZSA9ICIrdHlwZSsiICIpOworCWIuYXBwZW5kKCJyZXFUaW1lID0gIityZXFUaW1lKyIgIik7CisgICAgICAgIGIuYXBwZW5kKCJyZXF1aXJlZCA9ICIrcmVxdWlyZWQrIiAiKTsKKyAgICAgICAgYi5hcHBlbmQoImZyYWdtZW50ID0gIitmcmFnbWVudCsiICIpOworICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qCisgICAgICogcHJpdmF0ZSBmaWVsZHMKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7CisgICAgcHJpdmF0ZSBib29sZWFuIHJlcVRpbWU7CisgICAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVkOworCisgICAgLyoKKyAgICAgKiBwcml2YXRlIGZpZWxkcyBmb3IgSlNQIDIuMAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBmcmFnbWVudDsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnRGF0YS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5YmQ0MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnRGF0YS5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCisvKioKKyAqIFRoZSAodHJhbnNsYXRpb24tdGltZSBvbmx5KSBhdHRyaWJ1dGUvdmFsdWUgaW5mb3JtYXRpb24gZm9yIGEgdGFnIGluc3RhbmNlLgorICoKKyAqIDxwPgorICogVGFnRGF0YSBpcyBvbmx5IHVzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIGlzVmFsaWQsIHZhbGlkYXRlLCBhbmQgCisgKiBnZXRWYXJpYWJsZUluZm8gbWV0aG9kcyBvZiBUYWdFeHRyYUluZm8sIHdoaWNoIGFyZSBpbnZva2VkIGF0IAorICogdHJhbnNsYXRpb24gdGltZS4KKyAqLworCitwdWJsaWMgY2xhc3MgVGFnRGF0YSBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBEaXN0aW5ndWlzaGVkIHZhbHVlIGZvciBhbiBhdHRyaWJ1dGUgdG8gaW5kaWNhdGUgaXRzIHZhbHVlCisgICAgICogaXMgYSByZXF1ZXN0LXRpbWUgZXhwcmVzc2lvbiAod2hpY2ggaXMgbm90IHlldCBhdmFpbGFibGUgYmVjYXVzZQorICAgICAqIFRhZ0RhdGEgaW5zdGFuY2VzIGFyZSB1c2VkIGF0IHRyYW5zbGF0aW9uLXRpbWUpLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVRVUVTVF9USU1FX1ZBTFVFID0gbmV3IE9iamVjdCgpOworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgVGFnRGF0YS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEEgdHlwaWNhbCBjb25zdHJ1Y3RvciBtYXkgYmUKKyAgICAgKiA8cHJlPgorICAgICAqIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGF0dCA9IHt7ImNvbm5lY3Rpb24iLCAiY29ubjAifSwgeyJpZCIsICJxdWVyeTAifX07CisgICAgICogc3RhdGljIGZpbmFsIFRhZ0RhdGEgdGQgPSBuZXcgVGFnRGF0YShhdHQpOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQWxsIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgZXhjZXB0IGZvciB0aG9zZSBob2xkaW5nIHRoZQorICAgICAqIGRpc3Rpbmd1aXNoZWQgb2JqZWN0IFJFUVVFU1RfVElNRV9WQUxVRS4KKworICAgICAqIEBwYXJhbSBhdHRzIHRoZSBzdGF0aWMgYXR0cmlidXRlIGFuZCB2YWx1ZXMuICBNYXkgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnRGF0YShPYmplY3RbXSBhdHRzW10pIHsKKwlpZiAoYXR0cyA9PSBudWxsKSB7CisJICAgIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisJfSBlbHNlIHsKKwkgICAgYXR0cmlidXRlcyA9IG5ldyBIYXNodGFibGUoYXR0cy5sZW5ndGgpOworCX0KKworCWlmIChhdHRzICE9IG51bGwpIHsKKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzLmxlbmd0aDsgaSsrKSB7CisJCWF0dHJpYnV0ZXMucHV0KGF0dHNbaV1bMF0sIGF0dHNbaV1bMV0pOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBhIFRhZ0RhdGEuCisgICAgICoKKyAgICAgKiBJZiB5b3UgYWxyZWFkeSBoYXZlIHRoZSBhdHRyaWJ1dGVzIGluIGEgaGFzaHRhYmxlLCB1c2UgdGhpcworICAgICAqIGNvbnN0cnVjdG9yLiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRycyBBIGhhc2h0YWJsZSB0byBnZXQgdGhlIHZhbHVlcyBmcm9tLgorICAgICAqLworICAgIHB1YmxpYyBUYWdEYXRhKEhhc2h0YWJsZSBhdHRycykgeworICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRhZydzIGlkIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB0YWcncyBpZCBhdHRyaWJ1dGUsIG9yIG51bGwgaWYgbm8gc3VjaAorICAgICAqICAgICBhdHRyaWJ1dGUgd2FzIHNwZWNpZmllZC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJcmV0dXJuIGdldEF0dHJpYnV0ZVN0cmluZyhUYWdBdHRyaWJ1dGVJbmZvLklEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKiBJZiBhIHN0YXRpYyB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yIGFuIGF0dHJpYnV0ZSB0aGF0IGFjY2VwdHMgYQorICAgICAqIHJlcXVlc3QtdGltZSBhdHRyaWJ1dGUgZXhwcmVzc2lvbiB0aGVuIHRoYXQgc3RhdGljIHZhbHVlIGlzIHJldHVybmVkLAorICAgICAqIGV2ZW4gaWYgdGhlIHZhbHVlIGlzIHByb3ZpZGVkIGluIHRoZSBib2R5IG9mIGEgPGpzcDphdHRyaWJ1dGU+IGFjdGlvbi4KKyAgICAgKiBUaGUgZGlzdGluZ3Vpc2hlZCBvYmplY3QgUkVRVUVTVF9USU1FX1ZBTFVFIGlzIG9ubHkgcmV0dXJuZWQgaWYKKyAgICAgKiB0aGUgdmFsdWUgaXMgc3BlY2lmaWVkIGFzIGEgcmVxdWVzdC10aW1lIGF0dHJpYnV0ZSBleHByZXNzaW9uCisgICAgICogb3IgdmlhIHRoZSAmbHQ7anNwOmF0dHJpYnV0ZSZndDsgYWN0aW9uIHdpdGggYSBib2R5IHRoYXQgY29udGFpbnMKKyAgICAgKiBkeW5hbWljIGNvbnRlbnQgKHNjcmlwdGxldHMsIHNjcmlwdGluZyBleHByZXNzaW9ucywgRUwgZXhwcmVzc2lvbnMsIAorICAgICAqIHN0YW5kYXJkIGFjdGlvbnMsIG9yIGN1c3RvbSBhY3Rpb25zKS4gIFJldHVybnMgbnVsbCBpZiB0aGUgYXR0cmlidXRlIAorICAgICAqIGlzIG5vdCBzZXQuIAorICAgICAqCisgICAgICogQHBhcmFtIGF0dE5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQorICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIHZhbHVlCisgICAgICovCisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0TmFtZSkgeworCXJldHVybiBhdHRyaWJ1dGVzLmdldChhdHROYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHROYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0TmFtZSwKKwkJCSAgICAgT2JqZWN0IHZhbHVlKSB7CisJYXR0cmlidXRlcy5wdXQoYXR0TmFtZSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dE5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQorICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZSBzdHJpbmcKKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiBhdHRyaWJ1dGUgdmFsdWUgaXMgbm90IGEgU3RyaW5nCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVN0cmluZyhTdHJpbmcgYXR0TmFtZSkgeworCU9iamVjdCBvID0gYXR0cmlidXRlcy5nZXQoYXR0TmFtZSk7CisJaWYgKG8gPT0gbnVsbCkgeworCSAgICByZXR1cm4gbnVsbDsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gKFN0cmluZykgbzsKKwl9CQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgdGhlIGF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKkByZXR1cm4gQW4gZW51bWVyYXRpb24gb2YgdGhlIGF0dHJpYnV0ZXMgaW4gYSBUYWdEYXRhCisgICAgICovCisgICAgcHVibGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5rZXlzKCk7CisgICAgfTsKKworICAgIC8vIHByaXZhdGUgZGF0YQorCisgICAgcHJpdmF0ZSBIYXNodGFibGUgYXR0cmlidXRlczsJLy8gdGhlIHRhZ25hbWUvdmFsdWUgbWFwCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZ0V4dHJhSW5mby5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdFeHRyYUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTUwZjVkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdFeHRyYUluZm8uamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyAKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCisvKioKKyAqIE9wdGlvbmFsIGNsYXNzIHByb3ZpZGVkIGJ5IHRoZSB0YWcgbGlicmFyeSBhdXRob3IgdG8gZGVzY3JpYmUgYWRkaXRpb25hbAorICogdHJhbnNsYXRpb24tdGltZSBpbmZvcm1hdGlvbiBub3QgZGVzY3JpYmVkIGluIHRoZSBUTEQuCisgKiBUaGUgVGFnRXh0cmFJbmZvIGNsYXNzIGlzIG1lbnRpb25lZCBpbiB0aGUgVGFnIExpYnJhcnkgRGVzY3JpcHRvciBmaWxlIChUTEQpLgorICoKKyAqIDxwPgorICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZDoKKyAqIDx1bD4KKyAqIDxsaT4gdG8gaW5kaWNhdGUgdGhhdCB0aGUgdGFnIGRlZmluZXMgc2NyaXB0aW5nIHZhcmlhYmxlcworICogPGxpPiB0byBwZXJmb3JtIHRyYW5zbGF0aW9uLXRpbWUgdmFsaWRhdGlvbiBvZiB0aGUgdGFnIGF0dHJpYnV0ZXMuCisgKiA8L3VsPgorICoKKyAqIDxwPgorICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBKU1AgdHJhbnNsYXRvciB0aGF0IHRoZSBpbml0aWFsIHZhbHVlCisgKiB0byBiZSByZXR1cm5lZCBieSBjYWxscyB0byBnZXRUYWdJbmZvKCkgY29ycmVzcG9uZHMgdG8gYSBUYWdJbmZvCisgKiBvYmplY3QgZm9yIHRoZSB0YWcgYmVpbmcgdHJhbnNsYXRlZC4gSWYgYW4gZXhwbGljaXQgY2FsbCB0bworICogc2V0VGFnSW5mbygpIGlzIGRvbmUsIHRoZW4gdGhlIG9iamVjdCBwYXNzZWQgd2lsbCBiZSByZXR1cm5lZCBpbgorICogc3Vic2VxdWVudCBjYWxscyB0byBnZXRUYWdJbmZvKCkuCisgKiAKKyAqIDxwPgorICogVGhlIG9ubHkgd2F5IHRvIGFmZmVjdCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZ2V0VGFnSW5mbygpCisgKiBpcyB0aHJvdWdoIGEgc2V0VGFnSW5mbygpIGNhbGwsIGFuZCB0aHVzLCBUYWdFeHRyYUluZm8uc2V0VGFnSW5mbygpIGlzCisgKiB0byBiZSBjYWxsZWQgYnkgdGhlIEpTUCB0cmFuc2xhdG9yLCB3aXRoIGEgVGFnSW5mbyBvYmplY3QgdGhhdAorICogY29ycmVzcG9uZHMgdG8gdGhlIHRhZyBiZWluZyB0cmFuc2xhdGVkLiBUaGUgY2FsbCBzaG91bGQgaGFwcGVuIGJlZm9yZQorICogYW55IGludm9jYXRpb24gb24gdmFsaWRhdGUoKSBhbmQgYmVmb3JlIGFueSBpbnZvY2F0aW9uIG9uCisgKiBnZXRWYXJpYWJsZUluZm8oKS4KKyAqCisgKiA8cD4KKyAqIDx0dD5OT1RFOjwvdHQ+IEl0IGlzIGEgKHRyYW5zbGF0aW9uIHRpbWUpIGVycm9yIGZvciBhIHRhZyBkZWZpbml0aW9uCisgKiBpbiBhIFRMRCB3aXRoIG9uZSBvciBtb3JlIHZhcmlhYmxlIHN1YmVsZW1lbnRzIHRvIGhhdmUgYW4gYXNzb2NpYXRlZAorICogVGFnRXh0cmFJbmZvIGltcGxlbWVudGF0aW9uIHRoYXQgcmV0dXJucyBhIFZhcmlhYmxlSW5mbyBhcnJheSB3aXRoCisgKiBvbmUgb3IgbW9yZSBlbGVtZW50cyBmcm9tIGEgY2FsbCB0byBnZXRWYXJpYWJsZUluZm8oKS4KKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGFnRXh0cmFJbmZvIHsKKworICAgIC8qKgorICAgICAqIFNvbGUgY29uc3RydWN0b3IuIChGb3IgaW52b2NhdGlvbiBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcnMsIAorICAgICAqIHR5cGljYWxseSBpbXBsaWNpdC4pCisgICAgICovCisgICAgcHVibGljIFRhZ0V4dHJhSW5mbygpIHsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogaW5mb3JtYXRpb24gb24gc2NyaXB0aW5nIHZhcmlhYmxlcyBkZWZpbmVkIGJ5IHRoZSB0YWcgYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhpcyBUYWdFeHRyYUluZm8gaW5zdGFuY2UuCisgICAgICogUmVxdWVzdC10aW1lIGF0dHJpYnV0ZXMgYXJlIGluZGljYXRlZCBhcyBzdWNoIGluIHRoZSBUYWdEYXRhIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIFRoZSBUYWdEYXRhIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgVmFyaWFibGVJbmZvIGRhdGEsIG9yIG51bGwgb3IgYSB6ZXJvIGxlbmd0aCBhcnJheQorICAgICAqICAgICAgICAgaWYgbm8gc2NyaXB0aW5nIHZhcmlhYmxlcyBhcmUgdG8gYmUgZGVmaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFyaWFibGVJbmZvW10gZ2V0VmFyaWFibGVJbmZvKFRhZ0RhdGEgZGF0YSkgeworCXJldHVybiBaRVJPX1ZBUklBQkxFX0lORk87CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNsYXRpb24tdGltZSB2YWxpZGF0aW9uIG9mIHRoZSBhdHRyaWJ1dGVzLiAKKyAgICAgKiBSZXF1ZXN0LXRpbWUgYXR0cmlidXRlcyBhcmUgaW5kaWNhdGVkIGFzIHN1Y2ggaW4gdGhlIFRhZ0RhdGEgcGFyYW1ldGVyLgorICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSB0byBkbyB2YWxpZGF0aW9uIGlzIHdpdGggdGhlIHZhbGlkYXRlKCkKKyAgICAgKiBtZXRob2QsIHNpbmNlIGl0IGNhbiByZXR1cm4gbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIFRoZSBUYWdEYXRhIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGlzIHRhZyBpbnN0YW5jZSBpcyB2YWxpZC4KKyAgICAgKiBAc2VlIFRhZ0V4dHJhSW5mbyN2YWxpZGF0ZQorICAgICAqLworCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChUYWdEYXRhIGRhdGEpIHsKKwlyZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGlvbi10aW1lIHZhbGlkYXRpb24gb2YgdGhlIGF0dHJpYnV0ZXMuCisgICAgICogUmVxdWVzdC10aW1lIGF0dHJpYnV0ZXMgYXJlIGluZGljYXRlZCBhcyBzdWNoIGluIHRoZSBUYWdEYXRhIHBhcmFtZXRlci4KKyAgICAgKiBCZWNhdXNlIG9mIHRoZSBoaWdoZXIgcXVhbGl0eSB2YWxpZGF0aW9uIG1lc3NhZ2VzIHBvc3NpYmxlLCAKKyAgICAgKiB0aGlzIGlzIHRoZSBwcmVmZXJyZWQgd2F5IHRvIGRvIHZhbGlkYXRpb24gKGFsdGhvdWdoIGlzVmFsaWQoKSAKKyAgICAgKiBzdGlsbCB3b3JrcykuICAKKyAgICAgKiAKKyAgICAgKiA8cD5KU1AgMi4wIGFuZCBoaWdoZXIgY29udGFpbmVycyBjYWxsIHZhbGlkYXRlKCkgaW5zdGVhZCBvZiBpc1ZhbGlkKCkuCisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaXMgdG8gY2FsbCBpc1ZhbGlkKCkuICBJZiAKKyAgICAgKiBpc1ZhbGlkKCkgcmV0dXJucyBmYWxzZSwgYSBnZW5lcmljIFZhbGlkYXRpb25NZXNzYWdlW10gaXMgcmV0dXJuZWQKKyAgICAgKiBpbmRpY2F0aW5nIGlzVmFsaWQoKSByZXR1cm5lZCBmYWxzZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBUaGUgVGFnRGF0YSBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIEEgbnVsbCBvYmplY3QsIG9yIHplcm8gbGVuZ3RoIGFycmF5IGlmIG5vIGVycm9ycywgYW4gCisgICAgICogICAgIGFycmF5IG9mIFZhbGlkYXRpb25NZXNzYWdlcyBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworICAgIHB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZVtdIHZhbGlkYXRlKCBUYWdEYXRhIGRhdGEgKSB7CisJVmFsaWRhdGlvbk1lc3NhZ2VbXSByZXN1bHQgPSBudWxsOworCisJaWYoICFpc1ZhbGlkKCBkYXRhICkgKSB7CisJICAgIHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uTWVzc2FnZVtdIHsKKwkJbmV3IFZhbGlkYXRpb25NZXNzYWdlKCBkYXRhLmdldElkKCksICJpc1ZhbGlkKCkgPT0gZmFsc2UiICkgfTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgVGFnSW5mbyBmb3IgdGhpcyBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWdJbmZvIFRoZSBUYWdJbmZvIHRoaXMgaW5zdGFuY2UgaXMgZXh0ZW5kaW5nCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0VGFnSW5mbyhUYWdJbmZvIHRhZ0luZm8pIHsKKwl0aGlzLnRhZ0luZm8gPSB0YWdJbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgVGFnSW5mbyBmb3IgdGhpcyBjbGFzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRhZ2luZm8gaW5zdGFuY2UgdGhpcyBpbnN0YW5jZSBpcyBleHRlbmRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgVGFnSW5mbyBnZXRUYWdJbmZvKCkgeworCXJldHVybiB0YWdJbmZvOworICAgIH0KKyAgICAKKyAgICAvLyBwcml2YXRlIGRhdGEKKyAgICBwcml2YXRlIFRhZ0luZm8gdGFnSW5mbzsKKworICAgIC8vIHplcm8gbGVuZ3RoIFZhcmlhYmxlSW5mbyBhcnJheQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFZhcmlhYmxlSW5mb1tdIFpFUk9fVkFSSUFCTEVfSU5GTyA9IHsgfTsKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdGaWxlSW5mby5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdGaWxlSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNWJjY2EKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZ0ZpbGVJbmZvLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyAKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCisvKioKKyAqIFRhZyBpbmZvcm1hdGlvbiBmb3IgYSB0YWcgZmlsZSBpbiBhIFRhZyBMaWJyYXJ5OworICogVGhpcyBjbGFzcyBpcyBpbnN0YW50aWF0ZWQgZnJvbSB0aGUgVGFnIExpYnJhcnkgRGVzY3JpcHRvciBmaWxlIChUTEQpCisgKiBhbmQgaXMgYXZhaWxhYmxlIG9ubHkgYXQgdHJhbnNsYXRpb24gdGltZS4KKyAqCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBUYWdGaWxlSW5mbyB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgVGFnRmlsZUluZm8gZnJvbSBkYXRhIGluIHRoZSBKU1AgMi4wIGZvcm1hdCBmb3IgVExELgorICAgICAqIFRoaXMgY2xhc3MgaXMgdG8gYmUgaW5zdGFudGlhdGVkIG9ubHkgZnJvbSB0aGUgVGFnTGlicmFyeSBjb2RlCisgICAgICogdW5kZXIgcmVxdWVzdCBmcm9tIHNvbWUgSlNQIGNvZGUgdGhhdCBpcyBwYXJzaW5nIGEKKyAgICAgKiBUTEQgKFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IpLgorICAgICAqCisgICAgICogTm90ZSB0aGF0LCBzaW5jZSBUYWdMaWJpYnJhcnlJbmZvIHJlZmxlY3RzIGJvdGggVExEIGluZm9ybWF0aW9uCisgICAgICogYW5kIHRhZ2xpYiBkaXJlY3RpdmUgaW5mb3JtYXRpb24sIGEgVGFnRmlsZUluZm8gaW5zdGFuY2UgaXMKKyAgICAgKiBkZXBlbmRlbnQgb24gYSB0YWdsaWIgZGlyZWN0aXZlLiAgVGhpcyBpcyBwcm9iYWJseSBhCisgICAgICogZGVzaWduIGVycm9yLCB3aGljaCBtYXkgYmUgZml4ZWQgaW4gdGhlIGZ1dHVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUgb2YgdGhpcyB0YWcKKyAgICAgKiBAcGFyYW0gcGF0aCBXaGVyZSB0byBmaW5kIHRoZSAudGFnIGZpbGUgaW1wbGVtZW50aW5nIHRoaXMgCisgICAgICogICAgIGFjdGlvbiwgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBUTEQgZmlsZS4KKyAgICAgKiBAcGFyYW0gdGFnSW5mbyBUaGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YWcsIGFzIHBhcnNlZAorICAgICAqICAgICBmcm9tIHRoZSBkaXJlY3RpdmVzIGluIHRoZSB0YWcgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnRmlsZUluZm8oIFN0cmluZyBuYW1lLCBTdHJpbmcgcGF0aCwgVGFnSW5mbyB0YWdJbmZvICkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgICAgICB0aGlzLnRhZ0luZm8gPSB0YWdJbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUgb2YgdGhpcyB0YWcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSAoc2hvcnQpIG5hbWUgb2YgdGhlIHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXJlIHRvIGZpbmQgdGhlIC50YWcgZmlsZSBpbXBsZW1lbnRpbmcgdGhpcyBhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBwYXRoIG9mIHRoZSB0YWcgZmlsZSwgcmVsYXRpdmUgdG8gdGhlIFRMRCwgb3IgIi4iIGlmIAorICAgICAqICAgICB0aGUgdGFnIGZpbGUgd2FzIGRlZmluZWQgaW4gYW4gaW1wbGljaXQgdGFnIGZpbGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnLCBwYXJzZWQgZnJvbSB0aGUgZGlyZWN0aXZlcyAKKyAgICAgKiBpbiB0aGUgdGFnIGZpbGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgVGFnSW5mbyBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZworICAgICAqLworICAgIHB1YmxpYyBUYWdJbmZvIGdldFRhZ0luZm8oKSB7CisgICAgICAgIHJldHVybiB0YWdJbmZvOworICAgIH0KKworICAgIC8vIHByaXZhdGUgZmllbGRzIGZvciAyLjAgaW5mbworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsKKyAgICBwcml2YXRlIFRhZ0luZm8gdGFnSW5mbzsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnSW5mby5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiNTk3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnSW5mby5qYXZhCkBAIC0wLDAgKzEsNDQ3IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworIAorcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7CisKKy8qKgorICogVGFnIGluZm9ybWF0aW9uIGZvciBhIHRhZyBpbiBhIFRhZyBMaWJyYXJ5OworICogVGhpcyBjbGFzcyBpcyBpbnN0YW50aWF0ZWQgZnJvbSB0aGUgVGFnIExpYnJhcnkgRGVzY3JpcHRvciBmaWxlIChUTEQpCisgKiBhbmQgaXMgYXZhaWxhYmxlIG9ubHkgYXQgdHJhbnNsYXRpb24gdGltZS4KKyAqCisgKiAKKyovCisKK3B1YmxpYyBjbGFzcyBUYWdJbmZvIHsKKworICAgIC8qKgorICAgICAqIFN0YXRpYyBjb25zdGFudCBmb3IgZ2V0Qm9keUNvbnRlbnQoKSB3aGVuIGl0IGlzIEpTUC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPRFlfQ09OVEVOVF9KU1AgPSAiSlNQIjsKKworICAgIC8qKgorICAgICAqIFN0YXRpYyBjb25zdGFudCBmb3IgZ2V0Qm9keUNvbnRlbnQoKSB3aGVuIGl0IGlzIFRhZyBkZXBlbmRlbnQuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZX0NPTlRFTlRfVEFHX0RFUEVOREVOVCA9ICJUQUdERVBFTkRFTlQiOworCisKKyAgICAvKioKKyAgICAgKiBTdGF0aWMgY29uc3RhbnQgZm9yIGdldEJvZHlDb250ZW50KCkgd2hlbiBpdCBpcyBlbXB0eS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPRFlfQ09OVEVOVF9FTVBUWSA9ICJFTVBUWSI7CisgICAgCisgICAgLyoqCisgICAgICogU3RhdGljIGNvbnN0YW50IGZvciBnZXRCb2R5Q29udGVudCgpIHdoZW4gaXQgaXMgc2NyaXB0bGVzcy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgMi4wCisgICAgICovIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPRFlfQ09OVEVOVF9TQ1JJUFRMRVNTID0gIlNDUklQVExFU1MiOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFRhZ0luZm8gZnJvbSBkYXRhIGluIHRoZSBKU1AgMS4xIGZvcm1hdCBmb3IgVExELgorICAgICAqIFRoaXMgY2xhc3MgaXMgdG8gYmUgaW5zdGFudGlhdGVkIG9ubHkgZnJvbSB0aGUgVGFnTGlicmFyeSBjb2RlCisgICAgICogdW5kZXIgcmVxdWVzdCBmcm9tIHNvbWUgSlNQIGNvZGUgdGhhdCBpcyBwYXJzaW5nIGEKKyAgICAgKiBUTEQgKFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IpLgorICAgICAqCisgICAgICogTm90ZSB0aGF0LCBzaW5jZSBUYWdMaWJpYnJhcnlJbmZvIHJlZmxlY3RzIGJvdGggVExEIGluZm9ybWF0aW9uCisgICAgICogYW5kIHRhZ2xpYiBkaXJlY3RpdmUgaW5mb3JtYXRpb24sIGEgVGFnSW5mbyBpbnN0YW5jZSBpcworICAgICAqIGRlcGVuZGVudCBvbiBhIHRhZ2xpYiBkaXJlY3RpdmUuICBUaGlzIGlzIHByb2JhYmx5IGEKKyAgICAgKiBkZXNpZ24gZXJyb3IsIHdoaWNoIG1heSBiZSBmaXhlZCBpbiB0aGUgZnV0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHRhZ05hbWUgVGhlIG5hbWUgb2YgdGhpcyB0YWcKKyAgICAgKiBAcGFyYW0gdGFnQ2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWcgaGFuZGxlciBjbGFzcworICAgICAqIEBwYXJhbSBib2R5Y29udGVudCBJbmZvcm1hdGlvbiBvbiB0aGUgYm9keSBjb250ZW50IG9mIHRoZXNlIHRhZ3MKKyAgICAgKiBAcGFyYW0gaW5mb1N0cmluZyBUaGUgKG9wdGlvbmFsKSBzdHJpbmcgaW5mb3JtYXRpb24gZm9yIHRoaXMgdGFnCisgICAgICogQHBhcmFtIHRhZ2xpYiBUaGUgaW5zdGFuY2Ugb2YgdGhlIHRhZyBsaWJyYXJ5IHRoYXQgY29udGFpbnMgdXMuCisgICAgICogQHBhcmFtIHRhZ0V4dHJhSW5mbyBUaGUgaW5zdGFuY2UgcHJvdmlkaW5nIGV4dHJhIFRhZyBpbmZvLiAgTWF5IGJlIG51bGwKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlSW5mbyBBbiBhcnJheSBvZiBBdHRyaWJ1dGVJbmZvIGRhdGEgZnJvbSBkZXNjcmlwdG9yLgorICAgICAqIE1heSBiZSBudWxsOworICAgICAqCisgICAgICovCisgICAgcHVibGljIFRhZ0luZm8oU3RyaW5nIHRhZ05hbWUsCisJICAgIFN0cmluZyB0YWdDbGFzc05hbWUsCisJICAgIFN0cmluZyBib2R5Y29udGVudCwKKwkgICAgU3RyaW5nIGluZm9TdHJpbmcsCisJICAgIFRhZ0xpYnJhcnlJbmZvIHRhZ2xpYiwKKwkgICAgVGFnRXh0cmFJbmZvIHRhZ0V4dHJhSW5mbywKKwkgICAgVGFnQXR0cmlidXRlSW5mb1tdIGF0dHJpYnV0ZUluZm8pIHsKKwl0aGlzLnRhZ05hbWUgICAgICAgPSB0YWdOYW1lOworCXRoaXMudGFnQ2xhc3NOYW1lICA9IHRhZ0NsYXNzTmFtZTsKKwl0aGlzLmJvZHlDb250ZW50ICAgPSBib2R5Y29udGVudDsKKwl0aGlzLmluZm9TdHJpbmcgICAgPSBpbmZvU3RyaW5nOworCXRoaXMudGFnTGlicmFyeSAgICA9IHRhZ2xpYjsKKwl0aGlzLnRhZ0V4dHJhSW5mbyAgPSB0YWdFeHRyYUluZm87CisJdGhpcy5hdHRyaWJ1dGVJbmZvID0gYXR0cmlidXRlSW5mbzsKKworCWlmICh0YWdFeHRyYUluZm8gIT0gbnVsbCkKKyAgICAgICAgICAgIHRhZ0V4dHJhSW5mby5zZXRUYWdJbmZvKHRoaXMpOworICAgIH0KKwkJCSAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgVGFnSW5mbyBmcm9tIGRhdGEgaW4gdGhlIEpTUCAxLjIgZm9ybWF0IGZvciBUTEQuCisgICAgICogVGhpcyBjbGFzcyBpcyB0byBiZSBpbnN0YW50aWF0ZWQgb25seSBmcm9tIHRoZSBUYWdMaWJyYXJ5IGNvZGUKKyAgICAgKiB1bmRlciByZXF1ZXN0IGZyb20gc29tZSBKU1AgY29kZSB0aGF0IGlzIHBhcnNpbmcgYQorICAgICAqIFRMRCAoVGFnIExpYnJhcnkgRGVzY3JpcHRvcikuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQsIHNpbmNlIFRhZ0xpYmlicmFyeUluZm8gcmVmbGVjdHMgYm90aCBUTEQgaW5mb3JtYXRpb24KKyAgICAgKiBhbmQgdGFnbGliIGRpcmVjdGl2ZSBpbmZvcm1hdGlvbiwgYSBUYWdJbmZvIGluc3RhbmNlIGlzCisgICAgICogZGVwZW5kZW50IG9uIGEgdGFnbGliIGRpcmVjdGl2ZS4gIFRoaXMgaXMgcHJvYmFibHkgYQorICAgICAqIGRlc2lnbiBlcnJvciwgd2hpY2ggbWF5IGJlIGZpeGVkIGluIHRoZSBmdXR1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFnTmFtZSBUaGUgbmFtZSBvZiB0aGlzIHRhZworICAgICAqIEBwYXJhbSB0YWdDbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIHRhZyBoYW5kbGVyIGNsYXNzCisgICAgICogQHBhcmFtIGJvZHljb250ZW50IEluZm9ybWF0aW9uIG9uIHRoZSBib2R5IGNvbnRlbnQgb2YgdGhlc2UgdGFncworICAgICAqIEBwYXJhbSBpbmZvU3RyaW5nIFRoZSAob3B0aW9uYWwpIHN0cmluZyBpbmZvcm1hdGlvbiBmb3IgdGhpcyB0YWcKKyAgICAgKiBAcGFyYW0gdGFnbGliIFRoZSBpbnN0YW5jZSBvZiB0aGUgdGFnIGxpYnJhcnkgdGhhdCBjb250YWlucyB1cy4KKyAgICAgKiBAcGFyYW0gdGFnRXh0cmFJbmZvIFRoZSBpbnN0YW5jZSBwcm92aWRpbmcgZXh0cmEgVGFnIGluZm8uICBNYXkgYmUgbnVsbAorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVJbmZvIEFuIGFycmF5IG9mIEF0dHJpYnV0ZUluZm8gZGF0YSBmcm9tIGRlc2NyaXB0b3IuCisgICAgICogTWF5IGJlIG51bGw7CisgICAgICogQHBhcmFtIGRpc3BsYXlOYW1lIEEgc2hvcnQgbmFtZSB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMKKyAgICAgKiBAcGFyYW0gc21hbGxJY29uIFBhdGggdG8gYSBzbWFsbCBpY29uIHRvIGJlIGRpc3BsYXllZCBieSB0b29scworICAgICAqIEBwYXJhbSBsYXJnZUljb24gUGF0aCB0byBhIGxhcmdlIGljb24gdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzCisgICAgICogQHBhcmFtIHR2aSBBbiBhcnJheSBvZiBhIFRhZ1ZhcmlhYmxlSW5mbyAob3IgbnVsbCkKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnSW5mbyhTdHJpbmcgdGFnTmFtZSwKKwkgICAgU3RyaW5nIHRhZ0NsYXNzTmFtZSwKKwkgICAgU3RyaW5nIGJvZHljb250ZW50LAorCSAgICBTdHJpbmcgaW5mb1N0cmluZywKKwkgICAgVGFnTGlicmFyeUluZm8gdGFnbGliLAorCSAgICBUYWdFeHRyYUluZm8gdGFnRXh0cmFJbmZvLAorCSAgICBUYWdBdHRyaWJ1dGVJbmZvW10gYXR0cmlidXRlSW5mbywKKwkgICAgU3RyaW5nIGRpc3BsYXlOYW1lLAorCSAgICBTdHJpbmcgc21hbGxJY29uLAorCSAgICBTdHJpbmcgbGFyZ2VJY29uLAorCSAgICBUYWdWYXJpYWJsZUluZm9bXSB0dmkpIHsKKwl0aGlzLnRhZ05hbWUgICAgICAgPSB0YWdOYW1lOworCXRoaXMudGFnQ2xhc3NOYW1lICA9IHRhZ0NsYXNzTmFtZTsKKwl0aGlzLmJvZHlDb250ZW50ICAgPSBib2R5Y29udGVudDsKKwl0aGlzLmluZm9TdHJpbmcgICAgPSBpbmZvU3RyaW5nOworCXRoaXMudGFnTGlicmFyeSAgICA9IHRhZ2xpYjsKKwl0aGlzLnRhZ0V4dHJhSW5mbyAgPSB0YWdFeHRyYUluZm87CisJdGhpcy5hdHRyaWJ1dGVJbmZvID0gYXR0cmlidXRlSW5mbzsKKwl0aGlzLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7CisJdGhpcy5zbWFsbEljb24gPSBzbWFsbEljb247CisJdGhpcy5sYXJnZUljb24gPSBsYXJnZUljb247CisJdGhpcy50YWdWYXJpYWJsZUluZm8gPSB0dmk7CisKKwlpZiAodGFnRXh0cmFJbmZvICE9IG51bGwpCisgICAgICAgICAgICB0YWdFeHRyYUluZm8uc2V0VGFnSW5mbyh0aGlzKTsKKyAgICB9CisJCQkgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFRhZ0luZm8gZnJvbSBkYXRhIGluIHRoZSBKU1AgMi4wIGZvcm1hdCBmb3IgVExELgorICAgICAqIFRoaXMgY2xhc3MgaXMgdG8gYmUgaW5zdGFudGlhdGVkIG9ubHkgZnJvbSB0aGUgVGFnTGlicmFyeSBjb2RlCisgICAgICogdW5kZXIgcmVxdWVzdCBmcm9tIHNvbWUgSlNQIGNvZGUgdGhhdCBpcyBwYXJzaW5nIGEKKyAgICAgKiBUTEQgKFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IpLgorICAgICAqCisgICAgICogTm90ZSB0aGF0LCBzaW5jZSBUYWdMaWJpYnJhcnlJbmZvIHJlZmxlY3RzIGJvdGggVExEIGluZm9ybWF0aW9uCisgICAgICogYW5kIHRhZ2xpYiBkaXJlY3RpdmUgaW5mb3JtYXRpb24sIGEgVGFnSW5mbyBpbnN0YW5jZSBpcworICAgICAqIGRlcGVuZGVudCBvbiBhIHRhZ2xpYiBkaXJlY3RpdmUuICBUaGlzIGlzIHByb2JhYmx5IGEKKyAgICAgKiBkZXNpZ24gZXJyb3IsIHdoaWNoIG1heSBiZSBmaXhlZCBpbiB0aGUgZnV0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHRhZ05hbWUgVGhlIG5hbWUgb2YgdGhpcyB0YWcKKyAgICAgKiBAcGFyYW0gdGFnQ2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWcgaGFuZGxlciBjbGFzcworICAgICAqIEBwYXJhbSBib2R5Y29udGVudCBJbmZvcm1hdGlvbiBvbiB0aGUgYm9keSBjb250ZW50IG9mIHRoZXNlIHRhZ3MKKyAgICAgKiBAcGFyYW0gaW5mb1N0cmluZyBUaGUgKG9wdGlvbmFsKSBzdHJpbmcgaW5mb3JtYXRpb24gZm9yIHRoaXMgdGFnCisgICAgICogQHBhcmFtIHRhZ2xpYiBUaGUgaW5zdGFuY2Ugb2YgdGhlIHRhZyBsaWJyYXJ5IHRoYXQgY29udGFpbnMgdXMuCisgICAgICogQHBhcmFtIHRhZ0V4dHJhSW5mbyBUaGUgaW5zdGFuY2UgcHJvdmlkaW5nIGV4dHJhIFRhZyBpbmZvLiAgTWF5IGJlIG51bGwKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlSW5mbyBBbiBhcnJheSBvZiBBdHRyaWJ1dGVJbmZvIGRhdGEgZnJvbSBkZXNjcmlwdG9yLgorICAgICAqIE1heSBiZSBudWxsOworICAgICAqIEBwYXJhbSBkaXNwbGF5TmFtZSBBIHNob3J0IG5hbWUgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzCisgICAgICogQHBhcmFtIHNtYWxsSWNvbiBQYXRoIHRvIGEgc21hbGwgaWNvbiB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMKKyAgICAgKiBAcGFyYW0gbGFyZ2VJY29uIFBhdGggdG8gYSBsYXJnZSBpY29uIHRvIGJlIGRpc3BsYXllZCBieSB0b29scworICAgICAqIEBwYXJhbSB0dmkgQW4gYXJyYXkgb2YgYSBUYWdWYXJpYWJsZUluZm8gKG9yIG51bGwpCisgICAgICogQHBhcmFtIGR5bmFtaWNBdHRyaWJ1dGVzIFRydWUgaWYgc3VwcG9ydHMgZHluYW1pYyBhdHRyaWJ1dGVzCisgICAgICoKKyAgICAgKiBAc2luY2UgMi4wCisgICAgICovCisgICAgcHVibGljIFRhZ0luZm8oU3RyaW5nIHRhZ05hbWUsCisgICAgICAgICAgICBTdHJpbmcgdGFnQ2xhc3NOYW1lLAorICAgICAgICAgICAgU3RyaW5nIGJvZHljb250ZW50LAorICAgICAgICAgICAgU3RyaW5nIGluZm9TdHJpbmcsCisgICAgICAgICAgICBUYWdMaWJyYXJ5SW5mbyB0YWdsaWIsCisgICAgICAgICAgICBUYWdFeHRyYUluZm8gdGFnRXh0cmFJbmZvLAorICAgICAgICAgICAgVGFnQXR0cmlidXRlSW5mb1tdIGF0dHJpYnV0ZUluZm8sCisgICAgICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWUsCisgICAgICAgICAgICBTdHJpbmcgc21hbGxJY29uLAorICAgICAgICAgICAgU3RyaW5nIGxhcmdlSWNvbiwKKyAgICAgICAgICAgIFRhZ1ZhcmlhYmxlSW5mb1tdIHR2aSwKKyAgICAgICAgICAgIGJvb2xlYW4gZHluYW1pY0F0dHJpYnV0ZXMpIHsKKyAgICAgICAgdGhpcy50YWdOYW1lICAgICAgID0gdGFnTmFtZTsKKyAgICAgICAgdGhpcy50YWdDbGFzc05hbWUgID0gdGFnQ2xhc3NOYW1lOworICAgICAgICB0aGlzLmJvZHlDb250ZW50ICAgPSBib2R5Y29udGVudDsKKyAgICAgICAgdGhpcy5pbmZvU3RyaW5nICAgID0gaW5mb1N0cmluZzsKKyAgICAgICAgdGhpcy50YWdMaWJyYXJ5ICAgID0gdGFnbGliOworICAgICAgICB0aGlzLnRhZ0V4dHJhSW5mbyAgPSB0YWdFeHRyYUluZm87CisgICAgICAgIHRoaXMuYXR0cmlidXRlSW5mbyA9IGF0dHJpYnV0ZUluZm87CisgICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKKyAgICAgICAgdGhpcy5zbWFsbEljb24gPSBzbWFsbEljb247CisgICAgICAgIHRoaXMubGFyZ2VJY29uID0gbGFyZ2VJY29uOworICAgICAgICB0aGlzLnRhZ1ZhcmlhYmxlSW5mbyA9IHR2aTsKKyAgICAgICAgdGhpcy5keW5hbWljQXR0cmlidXRlcyA9IGR5bmFtaWNBdHRyaWJ1dGVzOworCisgICAgICAgIGlmICh0YWdFeHRyYUluZm8gIT0gbnVsbCkKKyAgICAgICAgICAgIHRhZ0V4dHJhSW5mby5zZXRUYWdJbmZvKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBUYWcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSAoc2hvcnQpIG5hbWUgb2YgdGhlIHRhZy4KKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKKwlyZXR1cm4gdGFnTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgaW5mb3JtYXRpb24gKGluIHRoZSBUTEQpIG9uIHRoaXMgdGFnLgorICAgICAqIFRoZSByZXR1cm4gaXMgYW4gYXJyYXkgZGVzY3JpYmluZyB0aGUgYXR0cmlidXRlcyBvZiB0aGlzIHRhZywgYXMKKyAgICAgKiBpbmRpY2F0ZWQgaW4gdGhlIFRMRC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGFycmF5IG9mIFRhZ0F0dHJpYnV0ZUluZm8gZm9yIHRoaXMgdGFnLCBvciBhCisgICAgICogICAgICAgICB6ZXJvLWxlbmd0aCBhcnJheSBpZiB0aGUgdGFnIGhhcyBubyBhdHRyaWJ1dGVzLgorICAgICAqLworCisgICBwdWJsaWMgVGFnQXR0cmlidXRlSW5mb1tdIGdldEF0dHJpYnV0ZXMoKSB7CisgICAgICAgcmV0dXJuIGF0dHJpYnV0ZUluZm87CisgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1hdGlvbiBvbiB0aGUgc2NyaXB0aW5nIG9iamVjdHMgY3JlYXRlZCBieSB0aGlzIHRhZyBhdCBydW50aW1lLgorICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2Qgb24gdGhlIGFzc29jaWF0ZWQgVGFnRXh0cmFJbmZvIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgVGFnRGF0YSBkZXNjcmliaW5nIHRoaXMgYWN0aW9uLgorICAgICAqIEByZXR1cm4gaWYgYSBUYWdFeHRyYUluZm8gb2JqZWN0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRhZ0luZm8sIHRoZQorICAgICAqICAgICByZXN1bHQgb2YgZ2V0VGFnRXh0cmFJbmZvKCkuZ2V0VmFyaWFibGVJbmZvKCBkYXRhICksIG90aGVyd2lzZQorICAgICAqICAgICBudWxsLgorICAgICAqLworICAgcHVibGljIFZhcmlhYmxlSW5mb1tdIGdldFZhcmlhYmxlSW5mbyhUYWdEYXRhIGRhdGEpIHsKKyAgICAgICBWYXJpYWJsZUluZm9bXSByZXN1bHQgPSBudWxsOworICAgICAgIFRhZ0V4dHJhSW5mbyB0ZWkgPSBnZXRUYWdFeHRyYUluZm8oKTsKKyAgICAgICBpZiAodGVpICE9IG51bGwpIHsKKwkgICByZXN1bHQgPSB0ZWkuZ2V0VmFyaWFibGVJbmZvKCBkYXRhICk7CisgICAgICAgfQorICAgICAgIHJldHVybiByZXN1bHQ7CisgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGlvbi10aW1lIHZhbGlkYXRpb24gb2YgdGhlIGF0dHJpYnV0ZXMuIAorICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2Qgb24gdGhlIGFzc29jaWF0ZWQgVGFnRXh0cmFJbmZvIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgVGhlIHRyYW5zbGF0aW9uLXRpbWUgVGFnRGF0YSBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGRhdGEgaXMgdmFsaWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChUYWdEYXRhIGRhdGEpIHsKKyAgICAgICAgVGFnRXh0cmFJbmZvIHRlaSA9IGdldFRhZ0V4dHJhSW5mbygpOworICAgICAgICBpZiAodGVpID09IG51bGwpIHsKKwkgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRlaS5pc1ZhbGlkKGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zbGF0aW9uLXRpbWUgdmFsaWRhdGlvbiBvZiB0aGUgYXR0cmlidXRlcy4KKyAgICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIG9uIHRoZSBhc3NvY2lhdGVkIFRhZ0V4dHJhSW5mbyBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIFRoZSB0cmFuc2xhdGlvbi10aW1lIFRhZ0RhdGEgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBBIG51bGwgb2JqZWN0LCBvciB6ZXJvIGxlbmd0aCBhcnJheSBpZiBubyBlcnJvcnMsIGFuCisgICAgICogICAgIGFycmF5IG9mIFZhbGlkYXRpb25NZXNzYWdlcyBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworICAgIHB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZVtdIHZhbGlkYXRlKCBUYWdEYXRhIGRhdGEgKSB7CisJVGFnRXh0cmFJbmZvIHRlaSA9IGdldFRhZ0V4dHJhSW5mbygpOworCWlmKCB0ZWkgPT0gbnVsbCApIHsKKwkgICAgcmV0dXJuIG51bGw7CisJfQorCXJldHVybiB0ZWkudmFsaWRhdGUoIGRhdGEgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGZvciBleHRyYSB0YWcgaW5mb3JtYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIHRlaSB0aGUgVGFnRXh0cmFJbmZvIGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFnRXh0cmFJbmZvKFRhZ0V4dHJhSW5mbyB0ZWkpIHsKKwl0YWdFeHRyYUluZm8gPSB0ZWk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5zdGFuY2UgKGlmIGFueSkgZm9yIGV4dHJhIHRhZyBpbmZvcm1hdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBUYWdFeHRyYUluZm8gaW5zdGFuY2UsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnRXh0cmFJbmZvIGdldFRhZ0V4dHJhSW5mbygpIHsKKwlyZXR1cm4gdGFnRXh0cmFJbmZvOworICAgIH0KKworCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBwcm92aWRlcyB0aGUgaGFuZGxlciBmb3IgdGhpcyB0YWcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSB0YWcgaGFuZGxlciBjbGFzcy4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhZ0NsYXNzTmFtZSgpIHsKKwlyZXR1cm4gdGFnQ2xhc3NOYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGJvZHljb250ZW50IGluZm9ybWF0aW9uIGZvciB0aGlzIHRhZy4KKyAgICAgKiBJZiB0aGUgYm9keWNvbnRlbnQgaXMgbm90IGRlZmluZWQgZm9yIHRoaXMKKyAgICAgKiB0YWcsIHRoZSBkZWZhdWx0IG9mIEpTUCB3aWxsIGJlIHJldHVybmVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYm9keSBjb250ZW50IHN0cmluZy4KKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm9keUNvbnRlbnQoKSB7CisJcmV0dXJuIGJvZHlDb250ZW50OworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGluZm9ybWF0aW9uIHN0cmluZyBmb3IgdGhlIHRhZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGluZm8gc3RyaW5nLCBvciBudWxsIGlmIAorICAgICAqICAgICAgICAgbm90IGRlZmluZWQKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mb1N0cmluZygpIHsKKwlyZXR1cm4gaW5mb1N0cmluZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgVGFnTGlicmFyeUluZm8gcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgYSBUYWdMaWJyYXJ5SW5mbyBlbGVtZW50IGlzIGRlcGVuZGVudAorICAgICAqIG5vdCBqdXN0IG9uIHRoZSBUTEQgaW5mb3JtYXRpb24gYnV0IGFsc28gb24gdGhlCisgICAgICogc3BlY2lmaWMgdGFnbGliIGluc3RhbmNlIHVzZWQuICBUaGlzIG1lYW5zIHRoYXQKKyAgICAgKiBhIGZhaXIgYW1vdW50IG9mIHdvcmsgbmVlZHMgdG8gYmUgZG9uZSB0byBjb25zdHJ1Y3QKKyAgICAgKiBhbmQgaW5pdGlhbGl6ZSBUYWdMaWIgb2JqZWN0cy4KKyAgICAgKgorICAgICAqIElmIHVzZWQgY2FyZWZ1bGx5LCB0aGlzIHNldHRlciBjYW4gYmUgdXNlZCB0byBhdm9pZCBoYXZpbmcgdG8KKyAgICAgKiBjcmVhdGUgbmV3IFRhZ0luZm8gZWxlbWVudHMgZm9yIGVhY2ggdGFnbGliIGRpcmVjdGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0bCB0aGUgVGFnTGlicmFyeUluZm8gdG8gYXNzaWduCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRUYWdMaWJyYXJ5KFRhZ0xpYnJhcnlJbmZvIHRsKSB7CisJdGFnTGlicmFyeSA9IHRsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBpbnN0YW5jZSBvZiBUYWJMaWJyYXJ5SW5mbyB3ZSBiZWxvbmcgdG8uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB0YWcgbGlicmFyeSBpbnN0YW5jZSB3ZSBiZWxvbmcgdG8KKyAgICAgKi8KKworICAgIHB1YmxpYyBUYWdMaWJyYXJ5SW5mbyBnZXRUYWdMaWJyYXJ5KCkgeworCXJldHVybiB0YWdMaWJyYXJ5OworICAgIH0KKworCisgICAgLy8gPT09PT09PT09PT09PT0gSlNQIDIuMCBUTEQgSW5mb3JtYXRpb24gPT09PT09PT0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkaXNwbGF5TmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBzaG9ydCBuYW1lIHRvIGJlIGRpc3BsYXllZCBieSB0b29scywKKyAgICAgKiAgICAgICAgIG9yIG51bGwgaWYgbm90IGRlZmluZWQKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7CisJcmV0dXJuIGRpc3BsYXlOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGF0aCB0byB0aGUgc21hbGwgaWNvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUGF0aCB0byBhIHNtYWxsIGljb24gdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLAorICAgICAqICAgICAgICAgb3IgbnVsbCBpZiBub3QgZGVmaW5lZAorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRTbWFsbEljb24oKSB7CisJcmV0dXJuIHNtYWxsSWNvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHBhdGggdG8gdGhlIGxhcmdlIGljb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFBhdGggdG8gYSBsYXJnZSBpY29uIHRvIGJlIGRpc3BsYXllZCBieSB0b29scywKKyAgICAgKiAgICAgICAgIG9yIG51bGwgaWYgbm90IGRlZmluZWQKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFyZ2VJY29uKCkgeworCXJldHVybiBsYXJnZUljb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IFRhZ1ZhcmlhYmxlSW5mbyBvYmplY3RzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRhZ0luZm8uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFycmF5IG9mIFRhZ1ZhcmlhYmxlSW5mbyBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgKiAgICAgICAgIHZhcmlhYmxlcyBkZWNsYXJlZCBieSB0aGlzIHRhZywgb3IgYSB6ZXJvIGxlbmd0aAorICAgICAqICAgICAgICAgYXJyYXkgaWYgbm8gdmFyaWFibGVzIGhhdmUgYmVlbiBkZWNsYXJlZAorICAgICAqLworCisgICAgcHVibGljIFRhZ1ZhcmlhYmxlSW5mb1tdIGdldFRhZ1ZhcmlhYmxlSW5mb3MoKSB7CisJcmV0dXJuIHRhZ1ZhcmlhYmxlSW5mbzsKKyAgICB9CisKKworICAgIC8vID09PT09PT09PT09PT09IEpTUCAyLjAgVExEIEluZm9ybWF0aW9uID09PT09PT09CisKKyAgICAvKioKKyAgICAgKiBHZXQgZHluYW1pY0F0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVGFnSW5mby4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0YWcgaGFuZGxlciBzdXBwb3J0cyBkeW5hbWljIGF0dHJpYnV0ZXMKKyAgICAgKiBAc2luY2UgMi4wCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRHluYW1pY0F0dHJpYnV0ZXMoKSB7CisgICAgICAgIHJldHVybiBkeW5hbWljQXR0cmlidXRlczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHByaXZhdGUgZmllbGRzIGZvciAxLjEgaW5mbworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgIHRhZ05hbWU7IC8vIHRoZSBuYW1lIG9mIHRoZSB0YWcKKyAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICB0YWdDbGFzc05hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgYm9keUNvbnRlbnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgaW5mb1N0cmluZzsKKyAgICBwcml2YXRlIFRhZ0xpYnJhcnlJbmZvICAgICB0YWdMaWJyYXJ5OworICAgIHByaXZhdGUgVGFnRXh0cmFJbmZvICAgICAgIHRhZ0V4dHJhSW5mbzsgLy8gaW5zdGFuY2Ugb2YgVGFnRXh0cmFJbmZvCisgICAgcHJpdmF0ZSBUYWdBdHRyaWJ1dGVJbmZvW10gYXR0cmlidXRlSW5mbzsKKworICAgIC8qCisgICAgICogcHJpdmF0ZSBmaWVsZHMgZm9yIDEuMiBpbmZvCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgZGlzcGxheU5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgc21hbGxJY29uOworICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgIGxhcmdlSWNvbjsKKyAgICBwcml2YXRlIFRhZ1ZhcmlhYmxlSW5mb1tdICB0YWdWYXJpYWJsZUluZm87CisKKyAgICAvKgorICAgICAqIEFkZGl0aW9uYWwgcHJpdmF0ZSBmaWVsZHMgZm9yIDIuMCBpbmZvCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGR5bmFtaWNBdHRyaWJ1dGVzOworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdMaWJyYXJ5SW5mby5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdMaWJyYXJ5SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MGZkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZ0xpYnJhcnlJbmZvLmphdmEKQEAgLTAsMCArMSwyODcgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIAorcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRmlsZUluZm87CisKKy8qKgorICogVHJhbnNsYXRpb24tdGltZSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSB0YWdsaWIgZGlyZWN0aXZlLCBhbmQgaXRzCisgKiB1bmRlcmx5aW5nIFRMRCBmaWxlLgorICoKKyAqIE1vc3Qgb2YgdGhlIGluZm9ybWF0aW9uIGlzIGRpcmVjdGx5IGZyb20gdGhlIFRMRCwgZXhjZXB0IGZvcgorICogdGhlIHByZWZpeCBhbmQgdGhlIHVyaSB2YWx1ZXMgdXNlZCBpbiB0aGUgdGFnbGliIGRpcmVjdGl2ZQorICoKKyAqCisgKi8KKworYWJzdHJhY3QgcHVibGljIGNsYXNzIFRhZ0xpYnJhcnlJbmZvIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogVGhpcyB3aWxsIGludm9rZSB0aGUgY29uc3RydWN0b3JzIGZvciBUYWdJbmZvLCBhbmQgVGFnQXR0cmlidXRlSW5mbworICAgICAqIGFmdGVyIHBhcnNpbmcgdGhlIFRMRCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IGFjdHVhbGx5IHVzZWQgYnkgdGhlIHRhZ2xpYiBkaXJlY3RpdmUKKyAgICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgYWN0dWFsbHkgdXNlZCBieSB0aGUgdGFnbGliIGRpcmVjdGl2ZQorICAgICAqLworICAgIHByb3RlY3RlZCBUYWdMaWJyYXJ5SW5mbyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7CisJdGhpcy5wcmVmaXggPSBwcmVmaXg7CisJdGhpcy51cmkgICAgPSB1cmk7CisgICAgfQorCisgICAgLy8gPT09PSBtZXRob2RzIGFjY2Vzc2luZyB0YWdsaWIgaW5mb3JtYXRpb24gPT09PT09PQorCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIHRoZSB1cmkgYXR0cmlidXRlIGZyb20gdGhlIHRhZ2xpYiBkaXJlY3RpdmUgZm9yIAorICAgICAqIHRoaXMgbGlicmFyeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB1cmkgYXR0cmlidXRlCisgICAgICovCisgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJlZml4IGFzc2lnbmVkIHRvIHRoaXMgdGFnbGliIGZyb20gdGhlIHRhZ2xpYiBkaXJlY3RpdmUKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByZWZpeCBhc3NpZ25lZCB0byB0aGlzIHRhZ2xpYiBmcm9tIHRoZSB0YWdsaWIgZGlyZWN0aXZlCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeFN0cmluZygpIHsKKwlyZXR1cm4gcHJlZml4OworICAgIH0KKworICAgIC8vID09PT0gbWV0aG9kcyB1c2luZyB0aGUgVExEIGRhdGEgPT09PT09PQorCisgICAgLyoqCisgICAgICogVGhlIHByZWZlcnJlZCBzaG9ydCBuYW1lIChwcmVmaXgpIGFzIGluZGljYXRlZCBpbiB0aGUgVExELgorICAgICAqIFRoaXMgbWF5IGJlIHVzZWQgYnkgYXV0aG9yaW5nIHRvb2xzIGFzIHRoZSBwcmVmZXJyZWQgcHJlZml4CisgICAgICogdG8gdXNlIHdoZW4gY3JlYXRpbmcgYW4gdGFnbGliIGRpcmVjdGl2ZSBmb3IgdGhpcyBsaWJyYXJ5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcHJlZmVycmVkIHNob3J0IG5hbWUgZm9yIHRoZSBsaWJyYXJ5CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTaG9ydE5hbWUoKSB7CisgICAgICAgIHJldHVybiBzaG9ydG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlICJyZWxpYWJsZSIgVVJOIGluZGljYXRlZCBpbiB0aGUgVExEICh0aGUgdXJpIGVsZW1lbnQpLgorICAgICAqIFRoaXMgbWF5IGJlIHVzZWQgYnkgYXV0aG9yaW5nIHRvb2xzIGFzIGEgZ2xvYmFsIGlkZW50aWZpZXIKKyAgICAgKiB0byB1c2Ugd2hlbiBjcmVhdGluZyBhIHRhZ2xpYiBkaXJlY3RpdmUgZm9yIHRoaXMgbGlicmFyeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSByZWxpYWJsZSBVUk4gdG8gYSBUTEQgbGlrZSB0aGlzCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZWxpYWJsZVVSTigpIHsKKyAgICAgICAgcmV0dXJuIHVybjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEluZm9ybWF0aW9uIChkb2N1bWVudGF0aW9uKSBmb3IgdGhpcyBUTEQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmZvIHN0cmluZyBmb3IgdGhpcyB0YWcgbGliCisgICAgICovCisgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcmVxdWlyZWQgdmVyc2lvbiBvZiB0aGUgSlNQIGNvbnRhaW5lci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSAobWluaW1hbCkgcmVxdWlyZWQgdmVyc2lvbiBvZiB0aGUgSlNQIGNvbnRhaW5lci4KKyAgICAgKiBAc2VlIGphdmF4LnNlcnZsZXQuanNwLkpzcEVuZ2luZUluZm8KKyAgICAgKi8KKyAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZWRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4ganNwdmVyc2lvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFuIGFycmF5IGRlc2NyaWJpbmcgdGhlIHRhZ3MgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGlzIHRhZyBsaWJyYXJ5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgVGFnSW5mbyBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhZ3MgZGVmaW5lZCBieSB0aGlzCisgICAgICogICAgICAgICB0YWcgbGlicmFyeSwgb3IgYSB6ZXJvIGxlbmd0aCBhcnJheSBpZiB0aGlzIHRhZyBsaWJyYXJ5CisgICAgICogICAgICAgICBkZWZpbmVzIG5vIHRhZ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnSW5mb1tdIGdldFRhZ3MoKSB7CisgICAgICAgIHJldHVybiB0YWdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGFycmF5IGRlc2NyaWJpbmcgdGhlIHRhZyBmaWxlcyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoaXMgdGFnIGxpYnJhcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBUYWdGaWxlSW5mbyBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhZyBmaWxlcyBkZWZpbmVkCisgICAgICogICAgICAgICBieSB0aGlzIHRhZyBsaWJyYXJ5LCBvciBhIHplcm8gbGVuZ3RoIGFycmF5IGlmIHRoaXMKKyAgICAgKiAgICAgICAgIHRhZyBsaWJyYXJ5IGRlZmluZXMgbm8gdGFncyBmaWxlcworICAgICAqIEBzaW5jZSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnRmlsZUluZm9bXSBnZXRUYWdGaWxlcygpIHsKKyAgICAgICAgcmV0dXJuIHRhZ0ZpbGVzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBUYWdJbmZvIGZvciBhIGdpdmVuIHRhZyBuYW1lLCBsb29raW5nIHRocm91Z2ggYWxsIHRoZQorICAgICAqIHRhZ3MgaW4gdGhpcyB0YWcgbGlicmFyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaG9ydG5hbWUgVGhlIHNob3J0IG5hbWUgKG5vIHByZWZpeCkgb2YgdGhlIHRhZworICAgICAqIEByZXR1cm4gdGhlIFRhZ0luZm8gZm9yIHRoZSB0YWcgd2l0aCB0aGUgc3BlY2lmaWVkIHNob3J0IG5hbWUsIG9yCisgICAgICogICAgICAgICBudWxsIGlmIG5vIHN1Y2ggdGFnIGlzIGZvdW5kCisgICAgICovCisKKyAgICBwdWJsaWMgVGFnSW5mbyBnZXRUYWcoU3RyaW5nIHNob3J0bmFtZSkgeworICAgICAgICBUYWdJbmZvIHRhZ3NbXSA9IGdldFRhZ3MoKTsKKworICAgICAgICBpZiAodGFncyA9PSBudWxsIHx8IHRhZ3MubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgdGFncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHRhZ3NbaV0uZ2V0VGFnTmFtZSgpLmVxdWFscyhzaG9ydG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRhZ3NbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBUYWdGaWxlSW5mbyBmb3IgYSBnaXZlbiB0YWcgbmFtZSwgbG9va2luZyB0aHJvdWdoIGFsbCB0aGUKKyAgICAgKiB0YWcgZmlsZXMgaW4gdGhpcyB0YWcgbGlicmFyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaG9ydG5hbWUgVGhlIHNob3J0IG5hbWUgKG5vIHByZWZpeCkgb2YgdGhlIHRhZworICAgICAqIEByZXR1cm4gdGhlIFRhZ0ZpbGVJbmZvIGZvciB0aGUgc3BlY2lmaWVkIFRhZyBmaWxlLCBvciBudWxsCisgICAgICogICAgICAgICBpZiBubyBUYWcgZmlsZSBpcyBmb3VuZAorICAgICAqIEBzaW5jZSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnRmlsZUluZm8gZ2V0VGFnRmlsZShTdHJpbmcgc2hvcnRuYW1lKSB7CisgICAgICAgIFRhZ0ZpbGVJbmZvIHRhZ0ZpbGVzW10gPSBnZXRUYWdGaWxlcygpOworCisgICAgICAgIGlmICh0YWdGaWxlcyA9PSBudWxsIHx8IHRhZ0ZpbGVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHRhZ0ZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGFnRmlsZXNbaV0uZ2V0TmFtZSgpLmVxdWFscyhzaG9ydG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRhZ0ZpbGVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGFycmF5IGRlc2NyaWJpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoaXMgdGFnIGxpYnJhcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzIHRhZyBsaWJyYXJ5LCBvciBhIHplcm8KKyAgICAgKiAgICAgICAgIGxlbmd0aCBhcnJheSBpZiB0aGUgdGFnIGxpYnJhcnkgZGVmaW5lcyBubyBmdW5jdGlvbnMuCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworICAgIHB1YmxpYyBGdW5jdGlvbkluZm9bXSBnZXRGdW5jdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbnM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIEZ1bmN0aW9uSW5mbyBmb3IgYSBnaXZlbiBmdW5jdGlvbiBuYW1lLCBsb29raW5nIHRocm91Z2ggYWxsIHRoZQorICAgICAqIGZ1bmN0aW9ucyBpbiB0aGlzIHRhZyBsaWJyYXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgKG5vIHByZWZpeCkgb2YgdGhlIGZ1bmN0aW9uCisgICAgICogQHJldHVybiB0aGUgRnVuY3Rpb25JbmZvIGZvciB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgbnVsbAorICAgICAqICAgICAgICAgaWYgbm8gc3VjaCBmdW5jdGlvbiBleGlzdHMKKyAgICAgKiBAc2luY2UgMi4wCisgICAgICovCisgICAgcHVibGljIEZ1bmN0aW9uSW5mbyBnZXRGdW5jdGlvbihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChmdW5jdGlvbnMgPT0gbnVsbCB8fCBmdW5jdGlvbnMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTm8gZnVuY3Rpb25zIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGZ1bmN0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGZ1bmN0aW9uc1tpXS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKworICAgIC8vIFByb3RlY3RlZCBmaWVsZHMKKworICAgIC8qKgorICAgICAqIFRoZSBwcmVmaXggYXNzaWduZWQgdG8gdGhpcyB0YWdsaWIgZnJvbSB0aGUgdGFnbGliIGRpcmVjdGl2ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nICAgICAgICBwcmVmaXg7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIHRoZSB1cmkgYXR0cmlidXRlIGZyb20gdGhlIHRhZ2xpYiBkaXJlY3RpdmUgZm9yIAorICAgICAqIHRoaXMgbGlicmFyeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nICAgICAgICB1cmk7CisgICAgCisgICAgLyoqCisgICAgICogQW4gYXJyYXkgZGVzY3JpYmluZyB0aGUgdGFncyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoaXMgdGFnIGxpYnJhcnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFRhZ0luZm9bXSAgICAgdGFnczsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBbiBhcnJheSBkZXNjcmliaW5nIHRoZSB0YWcgZmlsZXMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGlzIHRhZyBsaWJyYXJ5LgorICAgICAqCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworICAgIHByb3RlY3RlZCBUYWdGaWxlSW5mb1tdIHRhZ0ZpbGVzOworICAgIAorICAgIC8qKgorICAgICAqIEFuIGFycmF5IGRlc2NyaWJpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoaXMgdGFnIGxpYnJhcnkuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi4wCisgICAgICovCisgICAgcHJvdGVjdGVkIEZ1bmN0aW9uSW5mb1tdIGZ1bmN0aW9uczsKKworICAgIC8vIFRhZyBMaWJyYXJ5IERhdGEKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB0bGlidmVyc2lvbjsgLy8gcmVxdWlyZWQKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgSlNQIHNwZWNpZmljYXRpb24gdGhpcyB0YWcgbGlicmFyeSBpcyB3cml0dGVuIHRvLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcganNwdmVyc2lvbjsgIC8vIHJlcXVpcmVkCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHByZWZlcnJlZCBzaG9ydCBuYW1lIChwcmVmaXgpIGFzIGluZGljYXRlZCBpbiB0aGUgVExELgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc2hvcnRuYW1lOyAgIC8vIHJlcXVpcmVkCisgICAgCisgICAgLyoqCisgICAgICogVGhlICJyZWxpYWJsZSIgVVJOIGluZGljYXRlZCBpbiB0aGUgVExELgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXJuOyAgICAgICAgIC8vIHJlcXVpcmVkCisgICAgCisgICAgLyoqCisgICAgICogSW5mb3JtYXRpb24gKGRvY3VtZW50YXRpb24pIGZvciB0aGlzIFRMRC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGluZm87ICAgICAgICAvLyBvcHRpb25hbAorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdMaWJyYXJ5VmFsaWRhdG9yLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZ0xpYnJhcnlWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2JkZTEyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdMaWJyYXJ5VmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogVHJhbnNsYXRpb24tdGltZSB2YWxpZGF0b3IgY2xhc3MgZm9yIGEgSlNQIHBhZ2UuIAorICogQSB2YWxpZGF0b3Igb3BlcmF0ZXMgb24gdGhlIFhNTCB2aWV3IGFzc29jaWF0ZWQgd2l0aCB0aGUgSlNQIHBhZ2UuCisgKgorICogPHA+CisgKiBUaGUgVExEIGZpbGUgYXNzb2NpYXRlcyBhIFRhZ0xpYnJhcnlWYWxpZGF0b3IgY2xhc3MgYW5kIHNvbWUgaW5pdAorICogYXJndW1lbnRzIHdpdGggYSB0YWcgbGlicmFyeS4KKyAqCisgKiA8cD4KKyAqIFRoZSBKU1AgY29udGFpbmVyIGlzIHJlcG9uc2libGUgZm9yIGxvY2F0aW5nIGFuIGFwcHJvcHJpYXRlCisgKiBpbnN0YW5jZSBvZiB0aGUgYXBwcm9wcmlhdGUgc3ViY2xhc3MgYnkKKyAqCisgKiA8dWw+CisgKiA8bGk+IG5ldyBhIGZyZXNoIGluc3RhbmNlLCBvciByZXVzZSBhbiBhdmFpbGFibGUgb25lCisgKiA8bGk+IGludm9rZSB0aGUgc2V0SW5pdFBhcmFtcyhNYXApIG1ldGhvZCBvbiB0aGUgaW5zdGFuY2UKKyAqIDwvdWw+CisgKgorICogb25jZSBpbml0aWFsaXplZCwgdGhlIHZhbGlkYXRlKFN0cmluZywgU3RyaW5nLCBQYWdlRGF0YSkgbWV0aG9kIHdpbGwKKyAqIGJlIGludm9rZWQsIHdoZXJlIHRoZSBmaXJzdCB0d28gYXJndW1lbnRzIGFyZSB0aGUgcHJlZml4CisgKiBhbmQgdXJpIGZvciB0aGlzIHRhZyBsaWJyYXJ5IGluIHRoZSBYTUwgVmlldy4gIFRoZSBwcmVmaXggaXMgaW50ZW5kZWQKKyAqIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHByb2R1Y2UgYW4gZXJyb3IgbWVzc2FnZS4gIEhvd2V2ZXIsIGl0IGlzIG5vdAorICogYWx3YXlzIGFjY3VyYXRlLiAgSW4gdGhlIGNhc2Ugd2hlcmUgYSBzaW5nbGUgVVJJIGlzIG1hcHBlZCB0byBtb3JlIAorICogdGhhbiBvbmUgcHJlZml4IGluIHRoZSBYTUwgdmlldywgdGhlIHByZWZpeCBvZiB0aGUgZmlyc3QgVVJJIGlzIHByb3ZpZGVkLgorICogVGhlcmVmb3JlLCB0byBwcm92aWRlIGhpZ2ggcXVhbGl0eSBlcnJvciBtZXNzYWdlcyBpbiBjYXNlcyB3aGVyZSB0aGUgCisgKiB0YWcgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgY2hlY2tlZCwgdGhlIHByZWZpeCBwYXJhbWV0ZXIgc2hvdWxkIGJlIAorICogaWdub3JlZCBhbmQgdGhlIGFjdHVhbCBwcmVmaXggb2YgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4gIAorICogVGFnTGlicmFyeVZhbGlkYXRvcnMgc2hvdWxkIGFsd2F5cyB1c2UgdGhlIHVyaSB0byBpZGVudGlmeSBlbGVtZW50cyAKKyAqIGFzIGJlbG9uaW5nIHRvIHRoZSB0YWcgbGlicmFyeSwgbm90IHRoZSBwcmVmaXguCisgKgorICogPHA+CisgKiBBIFRhZ0xpYnJhcnlWYWxpZGF0b3IgaW5zdGFuY2UKKyAqIG1heSBjcmVhdGUgYXV4aWxpYXJ5IG9iamVjdHMgaW50ZXJuYWxseSB0byBwZXJmb3JtCisgKiB0aGUgdmFsaWRhdGlvbiAoZS5nLiBhbiBYU2NoZW1hIHZhbGlkYXRvcikgYW5kIG1heSByZXVzZSBpdCBmb3IgYWxsCisgKiB0aGUgcGFnZXMgaW4gYSBnaXZlbiB0cmFuc2xhdGlvbiBydW4uCisgKgorICogPHA+CisgKiBUaGUgSlNQIGNvbnRhaW5lciBpcyBub3QgZ3VhcmFudGVlZCB0byBzZXJpYWxpemUgaW52b2NhdGlvbnMgb2YKKyAqIHZhbGlkYXRlKCkgbWV0aG9kLCBhbmQgVGFnTGlicmFyeVZhbGlkYXRvcnMgc2hvdWxkIHBlcmZvcm0gYW55CisgKiBzeW5jaHJvbml6YXRpb24gdGhleSBtYXkgcmVxdWlyZS4KKyAqCisgKiA8cD4KKyAqIEFzIG9mIEpTUCAyLjAsIGEgSlNQIGNvbnRhaW5lciBtdXN0IHByb3ZpZGUgYSBqc3A6aWQgYXR0cmlidXRlIHRvCisgKiBwcm92aWRlIGhpZ2hlciBxdWFsaXR5IHZhbGlkYXRpb24gZXJyb3JzLgorICogVGhlIGNvbnRhaW5lciB3aWxsIHRyYWNrIHRoZSBKU1AgcGFnZXMKKyAqIGFzIHBhc3NlZCB0byB0aGUgY29udGFpbmVyLCBhbmQgd2lsbCBhc3NpZ24gdG8gZWFjaCBlbGVtZW50CisgKiBhIHVuaXF1ZSAiaWQiLCB3aGljaCBpcyBwYXNzZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSBqc3A6aWQKKyAqIGF0dHJpYnV0ZS4gIEVhY2ggWE1MIGVsZW1lbnQgaW4gdGhlIFhNTCB2aWV3IGF2YWlsYWJsZSB3aWxsCisgKiBiZSBleHRlbmRlZCB3aXRoIHRoaXMgYXR0cmlidXRlLiAgVGhlIFRhZ0xpYnJhcnlWYWxpZGF0b3IKKyAqIGNhbiB0aGVuIHVzZSB0aGUgYXR0cmlidXRlIGluIG9uZSBvciBtb3JlIFZhbGlkYXRpb25NZXNzYWdlCisgKiBvYmplY3RzLiAgVGhlIGNvbnRhaW5lciB0aGVuLCBpbiB0dXJuLCBjYW4gdXNlIHRoZXNlCisgKiB2YWx1ZXMgdG8gcHJvdmlkZSBtb3JlIHByZWNpc2UgaW5mb3JtYXRpb24gb24gdGhlIGxvY2F0aW9uCisgKiBvZiBhbiBlcnJvci4KKyAqCisgKiA8cD4KKyAqIFRoZSBhY3R1YWwgcHJlZml4IG9mIHRoZSA8Y29kZT5pZDwvY29kZT4gYXR0cmlidXRlIG1heSBvciBtYXkgbm90IGJlIAorICogPGNvZGU+anNwPC9jb2RlPiBidXQgaXQgd2lsbCBhbHdheXMgbWFwIHRvIHRoZSBuYW1lc3BhY2UKKyAqIDxjb2RlPmh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2U8L2NvZGU+LiAgQSBUYWdMaWJyYXJ5VmFsaWRhdG9yCisgKiBpbXBsZW1lbnRhdGlvbiBtdXN0IHJlbHkgb24gdGhlIHVyaSwgbm90IHRoZSBwcmVmaXgsIG9mIHRoZSA8Y29kZT5pZDwvY29kZT4KKyAqIGF0dHJpYnV0ZS4KKyAqLworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgVGFnTGlicmFyeVZhbGlkYXRvciB7CisKKyAgICAvKioKKyAgICAgKiBTb2xlIGNvbnN0cnVjdG9yLiAoRm9yIGludm9jYXRpb24gYnkgc3ViY2xhc3MgY29uc3RydWN0b3JzLCAKKyAgICAgKiB0eXBpY2FsbHkgaW1wbGljaXQuKQorICAgICAqLworICAgIHB1YmxpYyBUYWdMaWJyYXJ5VmFsaWRhdG9yKCkgeworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGluaXQgZGF0YSBpbiB0aGUgVExEIGZvciB0aGlzIHZhbGlkYXRvci4KKyAgICAgKiBQYXJhbWV0ZXIgbmFtZXMgYXJlIGtleXMsIGFuZCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSB0aGUgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcCBBIE1hcCBkZXNjcmliaW5nIHRoZSBpbml0IHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbml0UGFyYW1ldGVycyhNYXAgbWFwKSB7CisJaW5pdFBhcmFtZXRlcnMgPSBtYXA7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGluaXQgcGFyYW1ldGVycyBkYXRhIGFzIGFuIGltbXV0YWJsZSBNYXAuCisgICAgICogUGFyYW1ldGVyIG5hbWVzIGFyZSBrZXlzLCBhbmQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgdGhlIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGluaXQgcGFyYW1ldGVycyBhcyBhbiBpbW11dGFibGUgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBNYXAgZ2V0SW5pdFBhcmFtZXRlcnMoKSB7CisJcmV0dXJuIGluaXRQYXJhbWV0ZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIGEgSlNQIHBhZ2UuCisgICAgICogVGhpcyB3aWxsIGdldCBpbnZva2VkIG9uY2UgcGVyIHVuaXF1ZSB0YWcgbGlicmFyeSBVUkkgaW4gdGhlCisgICAgICogWE1MIHZpZXcuICBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGlmIHRoZSBwYWdlIGlzIHZhbGlkOyBvdGhlcndpc2UKKyAgICAgKiB0aGUgbWV0aG9kIHNob3VsZCByZXR1cm4gYW4gYXJyYXkgb2YgVmFsaWRhdGlvbk1lc3NhZ2Ugb2JqZWN0cy4KKyAgICAgKiBBbiBhcnJheSBvZiBsZW5ndGggemVybyBpcyBhbHNvIGludGVycHJldGVkIGFzIG5vIGVycm9ycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIGZpcnN0IHByZWZpeCB3aXRoIHdoaWNoIHRoZSB0YWcgbGlicmFyeSBpcyAKKyAgICAgKiAgICAgYXNzb2NpYXRlZCwgaW4gdGhlIFhNTCB2aWV3LiAgTm90ZSB0aGF0IHNvbWUgdGFncyBtYXkgdXNlIAorICAgICAqICAgICBhIGRpZmZlcmVudCBwcmVmaXggaWYgdGhlIG5hbWVzcGFjZSBpcyByZWRlZmluZWQuCisgICAgICogQHBhcmFtIHVyaSB0aGUgdGFnIGxpYnJhcnkncyB1bmlxdWUgaWRlbnRpZmllcgorICAgICAqIEBwYXJhbSBwYWdlIHRoZSBKc3BEYXRhIHBhZ2Ugb2JqZWN0CisgICAgICogQHJldHVybiBBIG51bGwgb2JqZWN0LCBvciB6ZXJvIGxlbmd0aCBhcnJheSBpZiBubyBlcnJvcnMsIGFuIGFycmF5CisgICAgICogb2YgVmFsaWRhdGlvbk1lc3NhZ2VzIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VbXSB2YWxpZGF0ZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCAKKyAgICAgICAgUGFnZURhdGEgcGFnZSkgCisgICAgeworCXJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgYW55IGRhdGEga2VwdCBieSB0aGlzIGluc3RhbmNlIGZvciB2YWxpZGF0aW9uIHB1cnBvc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7CisJaW5pdFBhcmFtZXRlcnMgPSBudWxsOworICAgIH0KKworICAgIC8vIFByaXZhdGUgZGF0YQorICAgIHByaXZhdGUgTWFwIGluaXRQYXJhbWV0ZXJzOworCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZ1N1cHBvcnQuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZjI1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZ1N1cHBvcnQuamF2YQpAQCAtMCwwICsxLDI5NCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0OworCisvKioKKyAqIEEgYmFzZSBjbGFzcyBmb3IgZGVmaW5pbmcgbmV3IHRhZyBoYW5kbGVycyBpbXBsZW1lbnRpbmcgVGFnLgorICoKKyAqIDxwPiBUaGUgVGFnU3VwcG9ydCBjbGFzcyBpcyBhIHV0aWxpdHkgY2xhc3MgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcworICogdGhlIGJhc2UgY2xhc3MgZm9yIG5ldyB0YWcgaGFuZGxlcnMuICBUaGUgVGFnU3VwcG9ydCBjbGFzcworICogaW1wbGVtZW50cyB0aGUgVGFnIGFuZCBJdGVyYXRpb25UYWcgaW50ZXJmYWNlcyBhbmQgYWRkcyBhZGRpdGlvbmFsCisgKiBjb252ZW5pZW5jZSBtZXRob2RzIGluY2x1ZGluZyBnZXR0ZXIgbWV0aG9kcyBmb3IgdGhlIHByb3BlcnRpZXMgaW4KKyAqIFRhZy4gIFRhZ1N1cHBvcnQgaGFzIG9uZSBzdGF0aWMgbWV0aG9kIHRoYXQgaXMgaW5jbHVkZWQgdG8KKyAqIGZhY2lsaXRhdGUgY29vcmRpbmF0aW9uIGFtb25nIGNvb3BlcmF0aW5nIHRhZ3MuCisgKgorICogPHA+IE1hbnkgdGFnIGhhbmRsZXJzIHdpbGwgZXh0ZW5kIFRhZ1N1cHBvcnQgYW5kIG9ubHkgcmVkZWZpbmUgYQorICogZmV3IG1ldGhvZHMuIAorICovCisKK3B1YmxpYyBjbGFzcyBUYWdTdXBwb3J0IGltcGxlbWVudHMgSXRlcmF0aW9uVGFnLCBTZXJpYWxpemFibGUgeworCisgICAgLyoqCisgICAgICogRmluZCB0aGUgaW5zdGFuY2Ugb2YgYSBnaXZlbiBjbGFzcyB0eXBlIHRoYXQgaXMgY2xvc2VzdCB0byBhIGdpdmVuCisgICAgICogaW5zdGFuY2UuCisgICAgICogVGhpcyBtZXRob2QgdXNlcyB0aGUgZ2V0UGFyZW50IG1ldGhvZCBmcm9tIHRoZSBUYWcKKyAgICAgKiBpbnRlcmZhY2UuCisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgY29vcmRpbmF0aW9uIGFtb25nIGNvb3BlcmF0aW5nIHRhZ3MuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIG9ubHkgcHJvdmlkZXMgb25lIGZvcm1hbAorICAgICAqIHdheSBvZiBpbmRpY2F0aW5nIHRoZSBvYnNlcnZhYmxlIHR5cGUgb2YgYSB0YWcgaGFuZGxlcjogaXRzCisgICAgICogdGFnIGhhbmRsZXIgaW1wbGVtZW50YXRpb24gY2xhc3MsIGRlc2NyaWJlZCBpbiB0aGUgdGFnLWNsYXNzCisgICAgICogc3ViZWxlbWVudCBvZiB0aGUgdGFnIGVsZW1lbnQuICBUaGlzIGlzIGV4dGVuZGVkIGluIGFuCisgICAgICogaW5mb3JtYWwgbWFubmVyIGJ5IGFsbG93aW5nIHRoZSB0YWcgbGlicmFyeSBhdXRob3IgdG8KKyAgICAgKiBpbmRpY2F0ZSBpbiB0aGUgZGVzY3JpcHRpb24gc3ViZWxlbWVudCBhbiBvYnNlcnZhYmxlIHR5cGUuCisgICAgICogVGhlIHR5cGUgc2hvdWxkIGJlIGEgc3VidHlwZSBvZiB0aGUgdGFnIGhhbmRsZXIgaW1wbGVtZW50YXRpb24KKyAgICAgKiBjbGFzcyBvciB2b2lkLgorICAgICAqIFRoaXMgYWRkaXRpdGlvbmFsIGNvbnN0cmFpbnQgY2FuIGJlIGV4cGxvaXRlZCBieSBhCisgICAgICogc3BlY2lhbGl6ZWQgY29udGFpbmVyIHRoYXQga25vd3MgYWJvdXQgdGhhdCBzcGVjaWZpYyB0YWcgbGlicmFyeSwKKyAgICAgKiBhcyBpbiB0aGUgY2FzZSBvZiB0aGUgSlNQIHN0YW5kYXJkIHRhZyBsaWJyYXJ5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogV2hlbiBhIHRhZyBsaWJyYXJ5IGF1dGhvciBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUKKyAgICAgKiBvYnNlcnZhYmxlIHR5cGUgb2YgYSB0YWcgaGFuZGxlciwgY2xpZW50IHByb2dyYW1tYXRpYyBjb2RlCisgICAgICogc2hvdWxkIGFkaGVyZSB0byB0aGF0IGNvbnN0cmFpbnQuICBTcGVjaWZpY2FsbHksIHRoZSBDbGFzcworICAgICAqIHBhc3NlZCB0byBmaW5kQW5jZXN0b3JXaXRoQ2xhc3Mgc2hvdWxkIGJlIGEgc3VidHlwZSBvZiB0aGUKKyAgICAgKiBvYnNlcnZhYmxlIHR5cGUuCisgICAgICogCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbSBUaGUgaW5zdGFuY2UgZnJvbSB3aGVyZSB0byBzdGFydCBsb29raW5nLgorICAgICAqIEBwYXJhbSBrbGFzcyBUaGUgc3ViY2xhc3Mgb2YgVGFnIG9yIGludGVyZmFjZSB0byBiZSBtYXRjaGVkCisgICAgICogQHJldHVybiB0aGUgbmVhcmVzdCBhbmNlc3RvciB0aGF0IGltcGxlbWVudHMgdGhlIGludGVyZmFjZQorICAgICAqIG9yIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBzcGVjaWZpZWQKKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGFnIGZpbmRBbmNlc3RvcldpdGhDbGFzcyhUYWcgZnJvbSwgQ2xhc3Mga2xhc3MpIHsKKwlib29sZWFuIGlzSW50ZXJmYWNlID0gZmFsc2U7CisKKwlpZiAoZnJvbSA9PSBudWxsIHx8CisJICAgIGtsYXNzID09IG51bGwgfHwKKwkgICAgKCFUYWcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShrbGFzcykgJiYKKwkgICAgICEoaXNJbnRlcmZhY2UgPSBrbGFzcy5pc0ludGVyZmFjZSgpKSkpIHsKKwkgICAgcmV0dXJuIG51bGw7CisJfQorCisJZm9yICg7OykgeworCSAgICBUYWcgdGFnID0gZnJvbS5nZXRQYXJlbnQoKTsKKworCSAgICBpZiAodGFnID09IG51bGwpIHsKKwkJcmV0dXJuIG51bGw7CisJICAgIH0KKworCSAgICBpZiAoKGlzSW50ZXJmYWNlICYmIGtsYXNzLmlzSW5zdGFuY2UodGFnKSkgfHwKKwkgICAgICAgIGtsYXNzLmlzQXNzaWduYWJsZUZyb20odGFnLmdldENsYXNzKCkpKQorCQlyZXR1cm4gdGFnOworCSAgICBlbHNlCisJCWZyb20gPSB0YWc7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IsIGFsbCBzdWJjbGFzc2VzIGFyZSByZXF1aXJlZCB0byBkZWZpbmUgb25seQorICAgICAqIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlLCBhbmQgdG8gY2FsbCB0aGUKKyAgICAgKiBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBKU1AKKyAgICAgKiB0cmFuc2xhdG9yLgorICAgICAqLworCisgICAgcHVibGljIFRhZ1N1cHBvcnQoKSB7IH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgcHJvY2Vzc2luZyBvZiB0aGUgc3RhcnQgdGFnLCByZXR1cm5pbmcgU0tJUF9CT0RZLgorICAgICAqCisgICAgICogQHJldHVybiBTS0lQX0JPRFkKKyAgICAgKiBAdGhyb3dzIEpzcEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcHJvY2Vzc2luZyB0aGlzIHRhZworICAgICAqCisgICAgICogQHNlZSBUYWcjZG9TdGFydFRhZygpCisgICAgICovCisgCisgICAgcHVibGljIGludCBkb1N0YXJ0VGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBTS0lQX0JPRFk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBwcm9jZXNzaW5nIG9mIHRoZSBlbmQgdGFnIHJldHVybmluZyBFVkFMX1BBR0UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEVWQUxfUEFHRQorICAgICAqIEB0aHJvd3MgSnNwRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwcm9jZXNzaW5nIHRoaXMgdGFnCisgICAgICoKKyAgICAgKiBAc2VlIFRhZyNkb0VuZFRhZygpCisgICAgICovCisKKyAgICBwdWJsaWMgaW50IGRvRW5kVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisJcmV0dXJuIEVWQUxfUEFHRTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgcHJvY2Vzc2luZyBmb3IgYSBib2R5LgorICAgICAqCisgICAgICogQHJldHVybiBTS0lQX0JPRFkKKyAgICAgKiBAdGhyb3dzIEpzcEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcHJvY2Vzc2luZyB0aGlzIHRhZworICAgICAqCisgICAgICogQHNlZSBJdGVyYXRpb25UYWcjZG9BZnRlckJvZHkoKQorICAgICAqLworICAgIAorICAgIHB1YmxpYyBpbnQgZG9BZnRlckJvZHkoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKwlyZXR1cm4gU0tJUF9CT0RZOworICAgIH0KKworICAgIC8vIEFjdGlvbnMgcmVsYXRlZCB0byBib2R5IGV2YWx1YXRpb24KKworCisgICAgLyoqCisgICAgICogUmVsZWFzZSBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBzZWUgVGFnI3JlbGVhc2UoKQorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKwlwYXJlbnQgPSBudWxsOworCWlkID0gbnVsbDsKKwlpZiggdmFsdWVzICE9IG51bGwgKSB7CisJICAgIHZhbHVlcy5jbGVhcigpOworCX0KKwl2YWx1ZXMgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmVzdGluZyB0YWcgb2YgdGhpcyB0YWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdCBUaGUgcGFyZW50IFRhZy4KKyAgICAgKiBAc2VlIFRhZyNzZXRQYXJlbnQoVGFnKQorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KFRhZyB0KSB7CisJcGFyZW50ID0gdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgVGFnIGluc3RhbmNlIG1vc3QgY2xvc2VseSBlbmNsb3NpbmcgdGhpcyB0YWcgaW5zdGFuY2UuCisgICAgICogQHNlZSBUYWcjZ2V0UGFyZW50KCkKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCB0YWcgaW5zdGFuY2Ugb3IgbnVsbAorICAgICAqLworCisgICAgcHVibGljIFRhZyBnZXRQYXJlbnQoKSB7CisJcmV0dXJuIHBhcmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGlkIGF0dHJpYnV0ZSBmb3IgdGhpcyB0YWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgVGhlIFN0cmluZyBmb3IgdGhlIGlkLgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7CisJdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaWQgYXR0cmlidXRlIG9mIHRoaXMgdGFnOyBvciBudWxsLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGlkIGF0dHJpYnV0ZSwgb3IgbnVsbAorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJcmV0dXJuIGlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFnZSBjb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHBhZ2VDb250ZXh0IFRoZSBQYWdlQ29udGV4dC4KKyAgICAgKiBAc2VlIFRhZyNzZXRQYWdlQ29udGV4dAorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0UGFnZUNvbnRleHQoUGFnZUNvbnRleHQgcGFnZUNvbnRleHQpIHsKKwl0aGlzLnBhZ2VDb250ZXh0ID0gcGFnZUNvbnRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlIGEgdmFsdWUgd2l0aCBhIFN0cmluZyBrZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gayBUaGUga2V5IFN0cmluZy4KKyAgICAgKiBAcGFyYW0gbyBUaGUgdmFsdWUgdG8gYXNzb2NpYXRlLgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIGssIE9iamVjdCBvKSB7CisJaWYgKHZhbHVlcyA9PSBudWxsKSB7CisJICAgIHZhbHVlcyA9IG5ldyBIYXNodGFibGUoKTsKKwl9CisJdmFsdWVzLnB1dChrLCBvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEga2V5LgorICAgICAqCisgICAgICogQHBhcmFtIGsgVGhlIHN0cmluZyBrZXkuCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksIG9yIG51bGwuCisgICAgICovCisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKFN0cmluZyBrKSB7CisJaWYgKHZhbHVlcyA9PSBudWxsKSB7CisJICAgIHJldHVybiBudWxsOworCX0gZWxzZSB7CisJICAgIHJldHVybiB2YWx1ZXMuZ2V0KGspOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBrZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gayBUaGUgc3RyaW5nIGtleS4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVZhbHVlKFN0cmluZyBrKSB7CisJaWYgKHZhbHVlcyAhPSBudWxsKSB7CisJICAgIHZhbHVlcy5yZW1vdmUoayk7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZSB0aGUga2V5cyBmb3IgdGhlIHZhbHVlcyBrZXB0IGJ5IHRoaXMgdGFnIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIGVudW1lcmF0aW9uIG9mIGFsbCB0aGUga2V5cyBmb3IgdGhlIHZhbHVlcyBzZXQsCisgICAgICogICAgIG9yIG51bGwgb3IgYW4gZW1wdHkgRW51bWVyYXRpb24gaWYgbm8gdmFsdWVzIGhhdmUgYmVlbiBzZXQuCisgICAgICovCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0VmFsdWVzKCkgeworCWlmICh2YWx1ZXMgPT0gbnVsbCkgeworCSAgICByZXR1cm4gbnVsbDsKKwl9CisJcmV0dXJuIHZhbHVlcy5rZXlzKCk7CisgICAgfQorCisgICAgLy8gcHJpdmF0ZSBmaWVsZHMKKworICAgIHByaXZhdGUgICBUYWcgICAgICAgICBwYXJlbnQ7CisgICAgcHJpdmF0ZSAgIEhhc2h0YWJsZSAgIHZhbHVlczsKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGlkIGF0dHJpYnV0ZSBvZiB0aGlzIHRhZzsgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nCSAgaWQ7CisKKyAgICAvLyBwcm90ZWN0ZWQgZmllbGRzCisKKyAgICAvKioKKyAgICAgKiBUaGUgUGFnZUNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFBhZ2VDb250ZXh0IHBhZ2VDb250ZXh0OworfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZ1ZhcmlhYmxlSW5mby5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdWYXJpYWJsZUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDVhNTBkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdWYXJpYWJsZUluZm8uamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyAKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCisvKioKKyAqIFZhcmlhYmxlIGluZm9ybWF0aW9uIGZvciBhIHRhZyBpbiBhIFRhZyBMaWJyYXJ5OworICogVGhpcyBjbGFzcyBpcyBpbnN0YW50aWF0ZWQgZnJvbSB0aGUgVGFnIExpYnJhcnkgRGVzY3JpcHRvciBmaWxlIChUTEQpCisgKiBhbmQgaXMgYXZhaWxhYmxlIG9ubHkgYXQgdHJhbnNsYXRpb24gdGltZS4KKyAqCisgKiBUaGlzIG9iamVjdCBzaG91bGQgYmUgaW1tdXRhYmxlLgorICoKKyAqIFRoaXMgaW5mb3JtYXRpb24gaXMgb25seSBhdmFpbGFibGUgaW4gSlNQIDEuMiBmb3JtYXQgVExEcyBvciBhYm92ZS4KKyAqLworCitwdWJsaWMgY2xhc3MgVGFnVmFyaWFibGVJbmZvIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBUYWdWYXJpYWJsZUluZm8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZUdpdmVuIHZhbHVlIG9mICZsdDtuYW1lLWdpdmVuJmd0OworICAgICAqIEBwYXJhbSBuYW1lRnJvbUF0dHJpYnV0ZSB2YWx1ZSBvZiAmbHQ7bmFtZS1mcm9tLWF0dHJpYnV0ZSZndDsKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHZhbHVlIG9mICZsdDt2YXJpYWJsZS1jbGFzcyZndDsKKyAgICAgKiBAcGFyYW0gZGVjbGFyZSB2YWx1ZSBvZiAmbHQ7ZGVjbGFyZSZndDsKKyAgICAgKiBAcGFyYW0gc2NvcGUgdmFsdWUgb2YgJmx0O3Njb3BlJmd0OworICAgICAqLworICAgIHB1YmxpYyBUYWdWYXJpYWJsZUluZm8oCisJICAgIFN0cmluZyBuYW1lR2l2ZW4sCisJICAgIFN0cmluZyBuYW1lRnJvbUF0dHJpYnV0ZSwKKwkgICAgU3RyaW5nIGNsYXNzTmFtZSwKKwkgICAgYm9vbGVhbiBkZWNsYXJlLAorCSAgICBpbnQgc2NvcGUpIHsKKwl0aGlzLm5hbWVHaXZlbiAgICAgICAgID0gbmFtZUdpdmVuOworCXRoaXMubmFtZUZyb21BdHRyaWJ1dGUgPSBuYW1lRnJvbUF0dHJpYnV0ZTsKKwl0aGlzLmNsYXNzTmFtZSAgICAgICAgID0gY2xhc3NOYW1lOworCXRoaXMuZGVjbGFyZSAgICAgICAgICAgPSBkZWNsYXJlOworCXRoaXMuc2NvcGUgICAgICAgICAgICAgPSBzY29wZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYm9keSBvZiB0aGUgJmx0O25hbWUtZ2l2ZW4mZ3Q7IGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB2YXJpYWJsZSBuYW1lIGFzIGEgY29uc3RhbnQKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZUdpdmVuKCkgeworCXJldHVybiBuYW1lR2l2ZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJvZHkgb2YgdGhlICZsdDtuYW1lLWZyb20tYXR0cmlidXRlJmd0OyBlbGVtZW50LgorICAgICAqIFRoaXMgaXMgdGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlICh0cmFuc2xhdGlvbi10aW1lKQorICAgICAqIHZhbHVlIHdpbGwgZ2l2ZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuICBPbmUgb2YKKyAgICAgKiAmbHQ7bmFtZS1naXZlbiZndDsgb3IgJmx0O25hbWUtZnJvbS1hdHRyaWJ1dGUmZ3Q7IGlzIHJlcXVpcmVkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgYXR0cmlidXRlIHdob3NlIHZhbHVlIGRlZmluZXMgdGhlIHZhcmlhYmxlIG5hbWUKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKSB7CisJcmV0dXJuIG5hbWVGcm9tQXR0cmlidXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBib2R5IG9mIHRoZSAmbHQ7dmFyaWFibGUtY2xhc3MmZ3Q7IGVsZW1lbnQuICAKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZSB2YXJpYWJsZSBvcgorICAgICAqICAgICAgICAgJ2phdmEubGFuZy5TdHJpbmcnIGlmIG5vdCBkZWZpbmVkIGluIHRoZSBUTEQuCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKwlyZXR1cm4gY2xhc3NOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBib2R5IG9mIHRoZSAmbHQ7ZGVjbGFyZSZndDsgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGUgdmFyaWFibGUgaXMgdG8gYmUgZGVjbGFyZWQgb3Igbm90LgorICAgICAqICAgICAgICAgSWYgbm90IGRlZmluZWQgaW4gdGhlIFRMRCwgJ3RydWUnIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICovCisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWNsYXJlKCkgeworCXJldHVybiBkZWNsYXJlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBib2R5IG9mIHRoZSAmbHQ7c2NvcGUmZ3Q7IGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBzY29wZSB0byBnaXZlIHRoZSB2YXJpYWJsZS4gIE5FU1RFRAorICAgICAqICAgICAgICAgc2NvcGUgd2lsbCBiZSByZXR1cm5lZCBpZiBub3QgZGVmaW5lZCBpbiAKKyAgICAgKiAgICAgICAgIHRoZSBUTEQuCisgICAgICovCisKKyAgICBwdWJsaWMgaW50IGdldFNjb3BlKCkgeworCXJldHVybiBzY29wZTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogcHJpdmF0ZSBmaWVsZHMKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyAgIG5hbWVHaXZlbjsgICAgICAgICAvLyA8bmFtZS1naXZlbj4KKyAgICBwcml2YXRlIFN0cmluZyAgIG5hbWVGcm9tQXR0cmlidXRlOyAvLyA8bmFtZS1mcm9tLWF0dHJpYnV0ZT4KKyAgICBwcml2YXRlIFN0cmluZyAgIGNsYXNzTmFtZTsgICAgICAgICAvLyA8Y2xhc3M+CisgICAgcHJpdmF0ZSBib29sZWFuICBkZWNsYXJlOyAgICAgICAgICAgLy8gPGRlY2xhcmU+CisgICAgcHJpdmF0ZSBpbnQgICAgICBzY29wZTsgICAgICAgICAgICAgLy8gPHNjb3BlPgorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UcnlDYXRjaEZpbmFsbHkuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVHJ5Q2F0Y2hGaW5hbGx5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2MjFmMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVHJ5Q2F0Y2hGaW5hbGx5LmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyAKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCisKKworLyoqCisgKiBUaGUgYXV4aWxpYXJ5IGludGVyZmFjZSBvZiBhIFRhZywgSXRlcmF0aW9uVGFnIG9yIEJvZHlUYWcgdGFnCisgKiBoYW5kbGVyIHRoYXQgd2FudHMgYWRkaXRpb25hbCBob29rcyBmb3IgbWFuYWdpbmcgcmVzb3VyY2VzLgorICoKKyAqIDxwPlRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHR3byBuZXcgbWV0aG9kczogZG9DYXRjaChUaHJvd2FibGUpCisgKiBhbmQgZG9GaW5hbGx5KCkuICBUaGUgcHJvdG90eXBpY2FsIGludm9jYXRpb24gaXMgYXMgZm9sbG93czoKKyAqCisgKiA8cHJlPgorICogaCA9IGdldCBhIFRhZygpOyAgLy8gZ2V0IGEgdGFnIGhhbmRsZXIsIHBlcmhhcHMgZnJvbSBwb29sCisgKgorICogaC5zZXRQYWdlQ29udGV4dChwYyk7ICAvLyBpbml0aWFsaXplIGFzIGRlc2lyZWQKKyAqIGguc2V0UGFyZW50KG51bGwpOworICogaC5zZXRGb28oImZvbyIpOworICogCisgKiAvLyB0YWcgaW52b2NhdGlvbiBwcm90b2NvbDsgc2VlIFRhZy5qYXZhCisgKiB0cnkgeworICogICBkb1N0YXJ0VGFnKCkuLi4KKyAqICAgLi4uLgorICogICBkb0VuZFRhZygpLi4uCisgKiB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICogICAvLyByZWFjdCB0byBleGNlcHRpb25hbCBjb25kaXRpb24KKyAqICAgaC5kb0NhdGNoKHQpOworICogfSBmaW5hbGx5IHsKKyAqICAgLy8gcmVzdG9yZSBkYXRhIGludmFyaWFudHMgYW5kIHJlbGVhc2UgcGVyLWludm9jYXRpb24gcmVzb3VyY2VzCisgKiAgIGguZG9GaW5hbGx5KCk7CisgKiB9CisgKiAKKyAqIC4uLiBvdGhlciBpbnZvY2F0aW9ucyBwZXJoYXBzIHdpdGggc29tZSBuZXcgc2V0dGVycworICogLi4uCisgKiBoLnJlbGVhc2UoKTsgIC8vIHJlbGVhc2UgbG9uZy10ZXJtIHJlc291cmNlcworICogPC9wcmU+CisgKi8KKworcHVibGljIGludGVyZmFjZSBUcnlDYXRjaEZpbmFsbHkgeworCisgICAgLyoqCisgICAgICogSW52b2tlZCBpZiBhIFRocm93YWJsZSBvY2N1cnMgd2hpbGUgZXZhbHVhdGluZyB0aGUgQk9EWQorICAgICAqIGluc2lkZSBhIHRhZyBvciBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorICAgICAqIFRhZy5kb1N0YXJ0VGFnKCksIFRhZy5kb0VuZFRhZygpLAorICAgICAqIEl0ZXJhdGlvblRhZy5kb0FmdGVyQm9keSgpIGFuZCBCb2R5VGFnLmRvSW5pdEJvZHkoKS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIG5vdCBpbnZva2VkIGlmIHRoZSBUaHJvd2FibGUgb2NjdXJzIGR1cmluZworICAgICAqIG9uZSBvZiB0aGUgc2V0dGVyIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBtYXkgdGhyb3cgYW4gZXhjZXB0aW9uICh0aGUgc2FtZSBvciBhIG5ldyBvbmUpCisgICAgICogdGhhdCB3aWxsIGJlIHByb3BhZ2F0ZWQgZnVydGhlciB1cCB0aGUgbmVzdCBjaGFpbi4gIElmIGFuIGV4Y2VwdGlvbgorICAgICAqIGlzIHRocm93biwgZG9GaW5hbGx5KCkgd2lsbCBiZSBpbnZva2VkLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byByZXNwb25kIHRvIGFuIGV4Y2VwdGlvbmFsCisgICAgICogY29uZGl0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHQgVGhlIHRocm93YWJsZSBleGNlcHRpb24gbmF2aWdhdGluZyB0aHJvdWdoIHRoaXMgdGFnLgorICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlIGlmIHRoZSBleGNlcHRpb24gaXMgdG8gYmUgcmV0aHJvd24gZnVydGhlciB1cCAKKyAgICAgKiAgICAgdGhlIG5lc3QgY2hhaW4uCisgICAgICovCisgCisgICAgdm9pZCBkb0NhdGNoKFRocm93YWJsZSB0KSB0aHJvd3MgVGhyb3dhYmxlOworCisgICAgLyoqCisgICAgICogSW52b2tlZCBpbiBhbGwgY2FzZXMgYWZ0ZXIgZG9FbmRUYWcoKSBmb3IgYW55IGNsYXNzIGltcGxlbWVudGluZworICAgICAqIFRhZywgSXRlcmF0aW9uVGFnIG9yIEJvZHlUYWcuICBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGV2ZW4gaWYKKyAgICAgKiBhbiBleGNlcHRpb24gaGFzIG9jY3VycmVkIGluIHRoZSBCT0RZIG9mIHRoZSB0YWcsCisgICAgICogb3IgaW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKyAgICAgKiBUYWcuZG9TdGFydFRhZygpLCBUYWcuZG9FbmRUYWcoKSwKKyAgICAgKiBJdGVyYXRpb25UYWcuZG9BZnRlckJvZHkoKSBhbmQgQm9keVRhZy5kb0luaXRCb2R5KCkuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBub3QgaW52b2tlZCBpZiB0aGUgVGhyb3dhYmxlIG9jY3VycyBkdXJpbmcKKyAgICAgKiBvbmUgb2YgdGhlIHNldHRlciBtZXRob2RzLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2Qgc2hvdWxkIG5vdCB0aHJvdyBhbiBFeGNlcHRpb24uCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCB0byBtYWludGFpbiBwZXItaW52b2NhdGlvbiBkYXRhCisgICAgICogaW50ZWdyaXR5IGFuZCByZXNvdXJjZSBtYW5hZ2VtZW50IGFjdGlvbnMuCisgICAgICovCisKKyAgICB2b2lkIGRvRmluYWxseSgpOworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9WYWxpZGF0aW9uTWVzc2FnZS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9WYWxpZGF0aW9uTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZGQ0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1ZhbGlkYXRpb25NZXNzYWdlLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7CisKKworLyoqCisgKiBBIHZhbGlkYXRpb24gbWVzc2FnZSBmcm9tIGVpdGhlciBUYWdMaWJyYXJ5VmFsaWRhdG9yIG9yIFRhZ0V4dHJhSW5mby4KKyAqIDxwPgorICogQXMgb2YgSlNQIDIuMCwgYSBKU1AgY29udGFpbmVyIG11c3Qgc3VwcG9ydCBhIGpzcDppZCBhdHRyaWJ1dGUKKyAqIHRvIHByb3ZpZGUgaGlnaGVyIHF1YWxpdHkgdmFsaWRhdGlvbiBlcnJvcnMuCisgKiBUaGUgY29udGFpbmVyIHdpbGwgdHJhY2sgdGhlIEpTUCBwYWdlcworICogYXMgcGFzc2VkIHRvIHRoZSBjb250YWluZXIsIGFuZCB3aWxsIGFzc2lnbiB0byBlYWNoIGVsZW1lbnQKKyAqIGEgdW5pcXVlICJpZCIsIHdoaWNoIGlzIHBhc3NlZCBhcyB0aGUgdmFsdWUgb2YgdGhlIGpzcDppZAorICogYXR0cmlidXRlLiAgRWFjaCBYTUwgZWxlbWVudCBpbiB0aGUgWE1MIHZpZXcgYXZhaWxhYmxlIHdpbGwKKyAqIGJlIGV4dGVuZGVkIHdpdGggdGhpcyBhdHRyaWJ1dGUuICBUaGUgVGFnTGlicmFyeVZhbGlkYXRvcgorICogY2FuIHRoZW4gdXNlIHRoZSBhdHRyaWJ1dGUgaW4gb25lIG9yIG1vcmUgVmFsaWRhdGlvbk1lc3NhZ2UKKyAqIG9iamVjdHMuICBUaGUgY29udGFpbmVyIHRoZW4sIGluIHR1cm4sIGNhbiB1c2UgdGhlc2UKKyAqIHZhbHVlcyB0byBwcm92aWRlIG1vcmUgcHJlY2lzZSBpbmZvcm1hdGlvbiBvbiB0aGUgbG9jYXRpb24KKyAqIG9mIGFuIGVycm9yLgorICogIAorICogPHA+CisgKiBUaGUgYWN0dWFsIHByZWZpeCBvZiB0aGUgPGNvZGU+aWQ8L2NvZGU+IGF0dHJpYnV0ZSBtYXkgb3IgbWF5IG5vdCBiZSAKKyAqIDxjb2RlPmpzcDwvY29kZT4gYnV0IGl0IHdpbGwgYWx3YXlzIG1hcCB0byB0aGUgbmFtZXNwYWNlCisgKiA8Y29kZT5odHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlPC9jb2RlPi4gIEEgVGFnTGlicmFyeVZhbGlkYXRvcgorICogaW1wbGVtZW50YXRpb24gbXVzdCByZWx5IG9uIHRoZSB1cmksIG5vdCB0aGUgcHJlZml4LCBvZiB0aGUgPGNvZGU+aWQ8L2NvZGU+CisgKiBhdHRyaWJ1dGUuCisgKi8KKworcHVibGljIGNsYXNzIFZhbGlkYXRpb25NZXNzYWdlIHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIFZhbGlkYXRpb25NZXNzYWdlLiAgVGhlIG1lc3NhZ2UgU3RyaW5nIHNob3VsZCBiZQorICAgICAqIG5vbi1udWxsLiAgVGhlIHZhbHVlIG9mIGlkIG1heSBiZSBudWxsLCBpZiB0aGUgbWVzc2FnZQorICAgICAqIGlzIG5vdCBzcGVjaWZpYyB0byBhbnkgWE1MIGVsZW1lbnQsIG9yIGlmIG5vIGpzcDppZAorICAgICAqIGF0dHJpYnV0ZXMgd2VyZSBwYXNzZWQgb24uICBJZiBub24tbnVsbCwgdGhlIHZhbHVlIG9mCisgICAgICogaWQgbXVzdCBiZSB0aGUgdmFsdWUgb2YgYSBqc3A6aWQgYXR0cmlidXRlIGZvciB0aGUgUGFnZURhdGEKKyAgICAgKiBwYXNzZWQgaW50byB0aGUgdmFsaWRhdGUoKSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgRWl0aGVyIG51bGwsIG9yIHRoZSB2YWx1ZSBvZiBhIGpzcDppZCBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIG1lc3NhZ2UgQSBsb2NhbGl6ZWQgdmFsaWRhdGlvbiBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZShTdHJpbmcgaWQsIFN0cmluZyBtZXNzYWdlKSB7CisJdGhpcy5pZCA9IGlkOworCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGpzcDppZC4KKyAgICAgKiBOdWxsIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gaW5mb3JtYXRpb24gYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUganNwOmlkIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJcmV0dXJuIGlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbG9jYWxpemVkIHZhbGlkYXRpb24gbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSB2YWxpZGF0aW9uIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKXsKKwlyZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICAvLyBQcml2YXRlIGRhdGEKKyAgICBwcml2YXRlIFN0cmluZyBpZDsKKyAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9WYXJpYWJsZUluZm8uamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVmFyaWFibGVJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmZDMzMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVmFyaWFibGVJbmZvLmphdmEKQEAgLTAsMCArMSwyODQgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisgCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dDsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBvbiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlcyB0aGF0IGFyZSBjcmVhdGVkL21vZGlmaWVkIGJ5CisgKiBhIHRhZyAoYXQgcnVuLXRpbWUpLiBUaGlzIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIGJ5IFRhZ0V4dHJhSW5mbworICogY2xhc3NlcyBhbmQgaXQgaXMgdXNlZCBieSB0aGUgdHJhbnNsYXRpb24gcGhhc2Ugb2YgSlNQLgorICoKKyAqIDxwPgorICogU2NyaXB0aW5nIHZhcmlhYmxlcyBnZW5lcmF0ZWQgYnkgYSBjdXN0b20gYWN0aW9uIGhhdmUgYW4gYXNzb2NpYXRlZCAKKyAqIHNjb3BlIG9mIGVpdGhlciBBVF9CRUdJTiwgTkVTVEVELCBvciBBVF9FTkQuCisgKgorICogPHA+CisgKiBUaGUgY2xhc3MgbmFtZSAoVmFyaWFibGVJbmZvLmdldENsYXNzTmFtZSkgaW4gdGhlIHJldHVybmVkIG9iamVjdHMKKyAqIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlcyBvZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlcy4KKyAqIE5vdGUgdGhhdCBiZWNhdXNlIHNjcmlwdGluZyB2YXJpYWJsZXMgYXJlIGFzc2lnbmVkIHRoZWlyIHZhbHVlcworICogZnJvbSBzY29wZWQgYXR0cmlidXRlcyB3aGljaCBjYW5ub3QgYmUgb2YgcHJpbWl0aXZlIHR5cGVzLAorICogJnF1b3Q7Ym94ZWQmcXVvdDsgdHlwZXMgc3VjaCBhcyA8Y29kZT5qYXZhLmxhbmcuSW50ZWdlcjwvY29kZT4gbXVzdCAKKyAqIGJlIHVzZWQgaW5zdGVhZCBvZiBwcmltaXRpdmVzLgorICoKKyAqIDxwPgorICogVGhlIGNsYXNzIG5hbWUgbWF5IGJlIGEgRnVsbHkgUXVhbGlmaWVkIENsYXNzIE5hbWUsIG9yIGEgc2hvcnQKKyAqIGNsYXNzIG5hbWUuCisgKgorICogPHA+CisgKiBJZiBhIEZ1bGx5IFF1YWxpZmllZCBDbGFzcyBOYW1lIGlzIHByb3ZpZGVkLCBpdCBzaG91bGQgcmVmZXIgdG8gYQorICogY2xhc3MgdGhhdCBzaG91bGQgYmUgaW4gdGhlIENMQVNTUEFUSCBmb3IgdGhlIFdlYiBBcHBsaWNhdGlvbiAoc2VlCisgKiBTZXJ2bGV0IDIuNCBzcGVjaWZpY2F0aW9uIC0gZXNzZW50aWFsbHkgaXQgaXMgV0VCLUlORi9saWIgYW5kCisgKiBXRUItSU5GL2NsYXNzZXMpLiBGYWlsdXJlIHRvIGJlIHNvIHdpbGwgbGVhZCB0byBhIHRyYW5zbGF0aW9uLXRpbWUKKyAqIGVycm9yLgorICoKKyAqIDxwPgorICogSWYgYSBzaG9ydCBjbGFzcyBuYW1lIGlzIGdpdmVuIGluIHRoZSBWYXJpYWJsZUluZm8gb2JqZWN0cywgdGhlbgorICogdGhlIGNsYXNzIG5hbWUgbXVzdCBiZSB0aGF0IG9mIGEgcHVibGljIGNsYXNzIGluIHRoZSBjb250ZXh0IG9mIHRoZQorICogaW1wb3J0IGRpcmVjdGl2ZXMgb2YgdGhlIHBhZ2Ugd2hlcmUgdGhlIGN1c3RvbSBhY3Rpb24gYXBwZWFycy4gCisgKiBUaGUgY2xhc3MgbXVzdCBhbHNvIGJlIGluIHRoZSBDTEFTU1BBVEggZm9yIHRoZSBXZWIgQXBwbGljYXRpb24gCisgKiAoc2VlIFNlcnZsZXQgMi40IHNwZWNpZmljYXRpb24gLSBlc3NlbnRpYWxseSBpdCBpcyBXRUItSU5GL2xpYiBhbmQKKyAqIFdFQi1JTkYvY2xhc3NlcykuIEZhaWx1cmUgdG8gYmUgc28gd2lsbCBsZWFkIHRvIGEgdHJhbnNsYXRpb24tdGltZQorICogZXJyb3IuCisgKgorICogPHA+PEI+VXNhZ2UgQ29tbWVudHM8L0I+CisgKiA8cD4KKyAqIEZyZXF1ZW50bHkgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSB3aWxsIHJlZmVyIHRvIGEgY2xhc3MgdGhhdAorICogaXMga25vd24gdG8gdGhlIHRhZyBsaWJyYXJ5IGFuZCB0aHVzLCBkZWxpdmVyZWQgaW4gdGhlIHNhbWUgSkFSCisgKiBmaWxlIGFzIHRoZSB0YWcgaGFuZGxlcnMuIEluIG1vc3Qgb3RoZXIgcmVtYWluaW5nIGNhc2VzIGl0IHdpbGwKKyAqIHJlZmVyIHRvIGEgY2xhc3MgdGhhdCBpcyBpbiB0aGUgcGxhdGZvcm0gb24gd2hpY2ggdGhlIEpTUCBwcm9jZXNzb3IKKyAqIGlzIGJ1aWx0IChsaWtlIEoyRUUpLiBVc2luZyBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZXMgaW4gdGhpcworICogbWFubmVyIG1ha2VzIHRoZSB1c2FnZSByZWxhdGl2ZWx5IHJlc2lzdGFudCB0byBjb25maWd1cmF0aW9uCisgKiBlcnJvcnMuCisgKgorICogPHA+CisgKiBBIHNob3J0IG5hbWUgaXMgdXN1YWxseSBnZW5lcmF0ZWQgYnkgdGhlIHRhZyBsaWJyYXJ5IGJhc2VkIG9uIHNvbWUKKyAqIGF0dHJpYnV0ZXMgcGFzc2VkIHRocm91Z2ggZnJvbSB0aGUgY3VzdG9tIGFjdGlvbiB1c2VyICh0aGUgYXV0aG9yKSwKKyAqIGFuZCBpdCBpcyB0aHVzIGxlc3Mgcm9idXN0OiBmb3IgaW5zdGFuY2UgYSBtaXNzaW5nIGltcG9ydCBkaXJlY3RpdmUKKyAqIGluIHRoZSByZWZlcnJpbmcgSlNQIHBhZ2Ugd2lsbCBsZWFkIHRvIGFuIGludmFsaWQgc2hvcnQgbmFtZSBjbGFzcworICogYW5kIGEgdHJhbnNsYXRpb24gZXJyb3IuCisgKgorICogPHA+PEI+U3luY2hyb25pemF0aW9uIFByb3RvY29sPC9CPgorICoKKyAqIDxwPgorICogVGhlIHJlc3VsdCBvZiB0aGUgaW52b2NhdGlvbiBvbiBnZXRWYXJpYWJsZUluZm8gaXMgYW4gYXJyYXkgb2YKKyAqIFZhcmlhYmxlSW5mbyBvYmplY3RzLiAgRWFjaCBzdWNoIG9iamVjdCBkZXNjcmliZXMgYSBzY3JpcHRpbmcKKyAqIHZhcmlhYmxlIGJ5IHByb3ZpZGluZyBpdHMgbmFtZSwgaXRzIHR5cGUsIHdoZXRoZXIgdGhlIHZhcmlhYmxlIGlzCisgKiBuZXcgb3Igbm90LCBhbmQgd2hhdCBpdHMgc2NvcGUgaXMuICBTY29wZSBpcyBiZXN0IGRlc2NyaWJlZCB0aHJvdWdoCisgKiBhIHBpY3R1cmU6CisgKgorICogPHA+CisgKiA8SU1HIHNyYz0iZG9jLWZpbGVzL1ZhcmlhYmxlSW5mby0xLmdpZiIKKyAqICAgICAgYWx0PSJORVNURUQsIEFUX0JFR0lOIGFuZCBBVF9FTkQgVmFyaWFibGUgU2NvcGVzIi8+CisgKgorICo8cD4KKyAqIFRoZSBKU1AgMi4wIHNwZWNpZmljYXRpb24gZGVmaW5lcyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgMyB2YWx1ZXM6CisgKiAKKyAqIDx1bD4KKyAqIDxsaT4gTkVTVEVELCBpZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIGF2YWlsYWJsZSBiZXR3ZWVuCisgKiB0aGUgc3RhcnQgdGFnIGFuZCB0aGUgZW5kIHRhZyBvZiB0aGUgYWN0aW9uIHRoYXQgZGVmaW5lcyBpdC4KKyAqIDxsaT4KKyAqIEFUX0JFR0lOLCBpZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBzdGFydCB0YWcKKyAqIG9mIHRoZSBhY3Rpb24gdGhhdCBkZWZpbmVzIGl0IHVudGlsIHRoZSBlbmQgb2YgdGhlIHNjb3BlLgorICogPGxpPiBBVF9FTkQsIGlmIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgaXMgYXZhaWxhYmxlIGFmdGVyIHRoZSBlbmQgdGFnCisgKiBvZiB0aGUgYWN0aW9uIHRoYXQgZGVmaW5lcyBpdCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBzY29wZS4KKyAqIDwvdWw+CisgKgorICogVGhlIHNjb3BlIHZhbHVlIGZvciBhIHZhcmlhYmxlIGltcGxpZXMgd2hhdCBtZXRob2RzIG1heSBhZmZlY3QgaXRzCisgKiB2YWx1ZSBhbmQgdGh1cyB3aGVyZSBzeW5jaHJvbml6YXRpb24gaXMgbmVlZGVkIGFzIGlsbHVzdHJhdGVkIGJ5CisgKiB0aGUgdGFibGUgYmVsb3cuICA8Yj5Ob3RlOjwvYj4gdGhlIHN5bmNocm9uaXphdGlvbiBvZiB0aGUgdmFyaWFibGUocykKKyAqIHdpbGwgb2NjdXIgPGVtPmFmdGVyPC9lbT4gdGhlIHJlc3BlY3RpdmUgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4KKyAqCisgKiA8YmxvY2txdW90ZT4KKyAqIDx0YWJsZSBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjIiIGJvcmRlcj0iMCIgd2lkdGg9IjU1JSIKKyAqICAgICAgICBiZ2NvbG9yPSIjOTk5OTk5IiBzdW1tYXJ5PSJWYXJpYWJsZSBTeW5jaHJvbml6YXRpb24gUG9pbnRzIj4KKyAqIDx0Ym9keT4KKyAqICAgPHRyIGFsaWduPSJjZW50ZXIiPgorICogICAgIDx0ZCB2YWxpZ249InRvcCIgY29sc3Bhbj0iNiIgYmdjb2xvcj0iIzk5OTk5OSI+PHU+PGI+VmFyaWFibGUgU3luY2hyb25pemF0aW9uCisgKiAgICAgUG9pbnRzPC9iPjwvdT48YnI+CisgKiAgICAgPC90ZD4KKyAqICAgPC90cj4KKyAqICAgPHRyPgorICogICAgIDx0aCB2YWxpZ249InRvcCIgYmdjb2xvcj0iI2MwYzBjMCI+Jm5ic3A7PC90aD4KKyAqICAgICA8dGggdmFsaWduPSJ0b3AiIGJnY29sb3I9IiNjMGMwYzAiIGFsaWduPSJjZW50ZXIiPmRvU3RhcnRUYWcoKTwvdGg+CisgKiAgICAgPHRoIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjYzBjMGMwIiBhbGlnbj0iY2VudGVyIj5kb0luaXRCb2R5KCk8L3RoPgorICogICAgIDx0aCB2YWxpZ249InRvcCIgYmdjb2xvcj0iI2MwYzBjMCIgYWxpZ249ImNlbnRlciI+ZG9BZnRlckJvZHkoKTwvdGg+CisgKiAgICAgPHRoIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjYzBjMGMwIiBhbGlnbj0iY2VudGVyIj5kb0VuZFRhZygpPC90aD4KKyAqICAgICA8dGggdmFsaWduPSJ0b3AiIGJnY29sb3I9IiNjMGMwYzAiIGFsaWduPSJjZW50ZXIiPmRvVGFnKCk8L3RoPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjYzBjMGMwIj48Yj5UYWc8YnI+CisgKiAgICAgPC9iPjwvdGQ+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj5BVF9CRUdJTiwgTkVTVEVEPGJyPgorICogICAgIDwvdGQ+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj48YnI+CisgKiAgICAgPC90ZD4KKyAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPjxicj4KKyAqICAgICA8L3RkPgorICogICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+QVRfQkVHSU4sIEFUX0VORDxicj4KKyAqICAgICA8L3RkPgorICogICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+PGJyPgorICogICAgIDwvdGQ+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGJnY29sb3I9IiNjMGMwYzAiPjxiPkl0ZXJhdGlvblRhZzxicj4KKyAqICAgICA8L2I+PC90ZD4KKyAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPkFUX0JFR0lOLCBORVNURUQ8YnI+CisgKiAgICAgPC90ZD4KKyAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPjxicj4KKyAqICAgICA8L3RkPgorICogICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+QVRfQkVHSU4sIE5FU1RFRDxicj4KKyAqICAgICA8L3RkPgorICogICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+QVRfQkVHSU4sIEFUX0VORDxicj4KKyAqICAgICA8L3RkPgorICogICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+PGJyPgorICogICAgIDwvdGQ+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGJnY29sb3I9IiNjMGMwYzAiPjxiPkJvZHlUYWc8YnI+CisgKiAgICAgPC9iPjwvdGQ+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj5BVF9CRUdJTiwgTkVTVEVEPHN1cD4xPC9zdXA+PGJyPgorICogICAgIDwvdGQ+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj5BVF9CRUdJTiwgTkVTVEVEPHN1cD4xPC9zdXA+PGJyPgorICogICAgIDwvdGQ+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj5BVF9CRUdJTiwgTkVTVEVEPGJyPgorICogICAgIDwvdGQ+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj5BVF9CRUdJTiwgQVRfRU5EPGJyPgorICogICAgIDwvdGQ+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj48YnI+CisgKiAgICAgPC90ZD4KKyAqICAgPC90cj4KKyAqICAgPHRyPgorICogICAgIDx0ZCB2YWxpZ249InRvcCIgYmdjb2xvcj0iI2MwYzBjMCI+PGI+U2ltcGxlVGFnPGJyPgorICogICAgIDwvYj48L3RkPgorICogICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+PGJyPgorICogICAgIDwvdGQ+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj48YnI+CisgKiAgICAgPC90ZD4KKyAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPjxicj4KKyAqICAgICA8L3RkPgorICogICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+PGJyPgorICogICAgIDwvdGQ+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj5BVF9CRUdJTiwgQVRfRU5EPGJyPgorICogICAgIDwvdGQ+CisgKiAgIDwvdHI+CisgKiA8L3Rib2R5PgorICogPC90YWJsZT4KKyAqIDxzdXA+MTwvc3VwPiBDYWxsZWQgYWZ0ZXIgPGNvZGU+ZG9TdGFydFRhZygpPC9jb2RlPiBpZiAKKyAqIDxjb2RlPkVWQUxfQk9EWV9JTkNMVURFPC9jb2RlPiBpcyByZXR1cm5lZCwgb3IgYWZ0ZXIgCisgKiA8Y29kZT5kb0luaXRCb2R5KCk8L2NvZGU+IG90aGVyd2lzZS4KKyAqIDwvYmxvY2txdW90ZT4KKyAqCisgKiA8cD48Qj5WYXJpYWJsZSBJbmZvcm1hdGlvbiBpbiB0aGUgVExEPC9CPgorICogPHA+CisgKiBTY3JpcHRpbmcgdmFyaWFibGUgaW5mb3JtYXRpb24gY2FuIGFsc28gYmUgZW5jb2RlZCBkaXJlY3RseSBmb3IgbW9zdCBjYXNlcworICogaW50byB0aGUgVGFnIExpYnJhcnkgRGVzY3JpcHRvciB1c2luZyB0aGUgJmx0O3ZhcmlhYmxlJmd0OyBzdWJlbGVtZW50IG9mIHRoZQorICogJmx0O3RhZyZndDsgZWxlbWVudC4gIFNlZSB0aGUgSlNQIHNwZWNpZmljYXRpb24uCisgKi8KKworcHVibGljIGNsYXNzIFZhcmlhYmxlSW5mbyB7CisKKyAgICAvKioKKyAgICAgKiBTY29wZSBpbmZvcm1hdGlvbiB0aGF0IHNjcmlwdGluZyB2YXJpYWJsZSBpcyB2aXNpYmxlIG9ubHkgd2l0aGluIHRoZQorICAgICAqIHN0YXJ0L2VuZCB0YWdzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FU1RFRCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTY29wZSBpbmZvcm1hdGlvbiB0aGF0IHNjcmlwdGluZyB2YXJpYWJsZSBpcyB2aXNpYmxlIGFmdGVyIHN0YXJ0IHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVF9CRUdJTiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBTY29wZSBpbmZvcm1hdGlvbiB0aGF0IHNjcmlwdGluZyB2YXJpYWJsZSBpcyB2aXNpYmxlIGFmdGVyIGVuZCB0YWcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRfRU5EID0gMjsKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKiBUaGVzZSBvYmplY3RzIGNhbiBiZSBjcmVhdGVkIChhdCB0cmFuc2xhdGlvbiB0aW1lKSBieSB0aGUgVGFnRXh0cmFJbmZvCisgICAgICogaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIHZhck5hbWUgVGhlIG5hbWUgb2YgdGhlIHNjcmlwdGluZyB2YXJpYWJsZQorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIHR5cGUgb2YgdGhpcyB2YXJpYWJsZQorICAgICAqIEBwYXJhbSBkZWNsYXJlIElmIHRydWUsIGl0IGlzIGEgbmV3IHZhcmlhYmxlIChpbiBzb21lIGxhbmd1YWdlcyB0aGlzIHdpbGwKKyAgICAgKiAgICAgcmVxdWlyZSBhIGRlY2xhcmF0aW9uKQorICAgICAqIEBwYXJhbSBzY29wZSBJbmRpY2F0aW9uIG9uIHRoZSBsZXhpY2FsIHNjb3BlIG9mIHRoZSB2YXJpYWJsZQorICAgICAqLworCisgICAgcHVibGljIFZhcmlhYmxlSW5mbyhTdHJpbmcgdmFyTmFtZSwKKwkJCVN0cmluZyBjbGFzc05hbWUsCisJCQlib29sZWFuIGRlY2xhcmUsCisJCQlpbnQgc2NvcGUpIHsKKwl0aGlzLnZhck5hbWUgPSB2YXJOYW1lOworCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworCXRoaXMuZGVjbGFyZSA9IGRlY2xhcmU7CisJdGhpcy5zY29wZSA9IHNjb3BlOworICAgIH0KKworICAgIC8vIEFjY2Vzc29yIG1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhck5hbWUoKSB7IAorICAgICAgICByZXR1cm4gdmFyTmFtZTsgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyB2YXJpYWJsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyB2YXJpYWJsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeyAKKyAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGlzIGEgbmV3IHZhcmlhYmxlLgorICAgICAqIElmIHNvLCBpbiBzb21lIGxhbmd1YWdlcyB0aGlzIHdpbGwgcmVxdWlyZSBhIGRlY2xhcmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBuZXcgdmFyaWFibGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGVjbGFyZSgpIHsgCisgICAgICAgIHJldHVybiBkZWNsYXJlOyAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGV4aWNhbCBzY29wZSBvZiB0aGUgdmFyaWFibGUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbGV4aWNhbCBzY29wZSBvZiB0aGUgdmFyaWFibGUsIGVpdGhlciBBVF9CRUdJTiwgQVRfRU5ELAorICAgICAqICAgIG9yIE5FU1RFRC4KKyAgICAgKiBAc2VlICNBVF9CRUdJTgorICAgICAqIEBzZWUgI0FUX0VORAorICAgICAqIEBzZWUgI05FU1RFRAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2NvcGUoKSB7IAorICAgICAgICByZXR1cm4gc2NvcGU7IAorICAgIH0KKworCisgICAgLy8gPT0gcHJpdmF0ZSBkYXRhCisgICAgcHJpdmF0ZSBTdHJpbmcgdmFyTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CisgICAgcHJpdmF0ZSBib29sZWFuIGRlY2xhcmU7CisgICAgcHJpdmF0ZSBpbnQgc2NvcGU7Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvZG9jLWZpbGVzL0JvZHlUYWdQcm90b2NvbC5naWYgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L2RvYy1maWxlcy9Cb2R5VGFnUHJvdG9jb2wuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MWU4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L2RvYy1maWxlcy9Cb2R5VGFnUHJvdG9jb2wuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvZG9jLWZpbGVzL0l0ZXJhdGlvblRhZ1Byb3RvY29sLmdpZiBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvZG9jLWZpbGVzL0l0ZXJhdGlvblRhZ1Byb3RvY29sLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjYyMzQxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9kb2MtZmlsZXMvSXRlcmF0aW9uVGFnUHJvdG9jb2wuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvZG9jLWZpbGVzL1RhZ1Byb3RvY29sLmdpZiBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvZG9jLWZpbGVzL1RhZ1Byb3RvY29sLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTE4ODBlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9kb2MtZmlsZXMvVGFnUHJvdG9jb2wuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvZG9jLWZpbGVzL1ZhcmlhYmxlSW5mby0xLmdpZiBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvZG9jLWZpbGVzL1ZhcmlhYmxlSW5mby0xLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmVhYmViCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9kb2MtZmlsZXMvVmFyaWFibGVJbmZvLTEuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvcGFja2FnZS5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0YWZjOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsODUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8IS0tCisgIC0gVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICAtCisgIC0gQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCisgIC0gcmVzZXJ2ZWQuCisgIC0KKyAgLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgLSBhcmUgbWV0OgorICAtCisgIC0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICAtCisgIC0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAgLSAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgIC0gICAgZGlzdHJpYnV0aW9uLgorICAtCisgIC0gMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgIC0gICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAorICAtICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKKyAgLSAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAgLSAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgIC0gICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAgLQorICAtIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJUb21jYXQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICAtICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgLSAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAorICAtICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICAtCisgIC0gNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAgLSAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgLSAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgIC0KKyAgLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgIC0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAgLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICAtIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAgLSBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgIC0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICAtIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAgLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgIC0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgIC0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgIC0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgIC0gU1VDSCBEQU1BR0UuCisgIC0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLQorICAtIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgIC0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgIC0gaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgIC0gPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICAtCisgIC0tPgorPC9oZWFkPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorCitDbGFzc2VzIGFuZCBpbnRlcmZhY2VzIGZvciB0aGUgZGVmaW5pdGlvbiBvZiBKYXZhU2VydmVyIFBhZ2VzIFRhZyBMaWJyYXJpZXMuCisKKzxwPgorVGhlIEphdmFTZXJ2ZXIgUGFnZXModG0pIChKU1ApIDIuMCBzcGVjaWZpY2F0aW9uIHByb3ZpZGVzIGEgcG9ydGFibGUKK21lY2hhbmlzbSBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRhZyBsaWJyYXJpZXMuCis8cD4KK0EgSlNQIHRhZyBsaWJyYXJ5IGNvbnRhaW5zCis8dWw+Cis8bGk+QSBUYWcgTGlicmFyeSBEZXNjcmlwdG9yPC9saT4KKzxsaT5BIG51bWJlciBvZiBUYWcgRmlsZXMgb3IgVGFnIGhhbmRsZXIgY2xhc3NlcyBkZWZpbmluZyAKKyAgICByZXF1ZXN0LXRpbWUgYmVoYXZpb3I8L2xpPgorPGxpPkFkZGl0aW9uYWwgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIHVzZWQgYXQgcnVudGltZTwvbGk+Cis8bGk+UG9zc2libHkgc29tZSBhZGRpdGlvbmFsIGNsYXNzZXMgdG8gcHJvdmlkZSBleHRyYSB0cmFuc2xhdGlvbiAKKyAgICBpbmZvcm1hdGlvbjwvbGk+Cis8L3VsPgorPHA+CitUaGUgSlNQIDIuMCBzcGVjaWZpY2F0aW9uIGFuZCB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGJvdGggY29udGFpbgorc2ltcGxlIGFuZCBtb2RlcmF0ZWx5IGNvbXBsZXggZXhhbXBsZXMgb2YgYWN0aW9ucyBkZWZpbmVkIHVzaW5nIHRoaXMKK21lY2hhbmlzbS4gIFRoZXNlIGFyZSBhdmFpbGFibGUgYXQgSlNQJ3Mgd2ViIHNpdGUsIGF0Cis8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pzcCI+aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qc3A8L2E+LgorU29tZSByZWFkZXJzIG1heSB3YW50IHRvIGNvbnN1bHQgdGhvc2UgdG8gZ2V0IGEgcXVpY2sgZmVlbCBmb3IgaG93Cit0aGUgbWVjaGFuaXNtcyB3b3JrIHRvZ2V0aGVyLgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC8uY3ZzaWdub3JlIGIvc2VydmxldGFwaS9qc3IxNTQvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmMxNTc0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvLmN2c2lnbm9yZQpAQCAtMCwwICsxLDQgQEAKK2J1aWxkCitidWlsZC5wcm9wZXJ0aWVzLnNhbXBsZQorZGlzdAorbGliCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9CVUlMRElORy50eHQgYi9zZXJ2bGV0YXBpL2pzcjE1NC9CVUlMRElORy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0NmM1OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L0JVSUxESU5HLnR4dApAQCAtMCwwICsxLDEzNCBAQAorJElkJAorCisKKyAgICAgICAgICAgICAgIEJ1aWxkaW5nIFRoZSBKYXZhIFNlcnZsZXQgYW5kIEpTUCBBUEkgQ2xhc3NlcworICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgc3VicHJvamVjdCBjb250YWlucyB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIG9mIHRoZQorSmF2YSBTZXJ2bGV0IGFuZCBKU1AgQVBJcyAocGFja2FnZXMgamF2YXguc2VydmxldCwgamF2YXguc2VydmxldC5odHRwLAoramF2YXguc2VydmxldC5qc3AsIGFuZCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQpLiAgSW4gb3JkZXIgdG8gYnVpbGQgdGhlc2UKK3NvdXJjZXMgc3VjY2Vzc2Z1bGx5LCB5b3UgbXVzdCBkbyB0aGUgZm9sbG93aW5nOgorCisKKygxKSBEb3dubG9hZCBhbmQgSW5zdGFsbCB0aGUgQW50IEJpbmFyeSBEaXN0cmlidXRpb24KKworTk9URTogIFRoZXNlIGluc3RydWN0aW9ucyBhc3N1bWUgdGhhdCB5b3UgYXJlIHVzaW5nIHRoZSBBbnQgMS4zIHJlbGVhc2UuCitQcm9jZWR1cmVzIGZvciBBbnQgMS40IGFuZCBsYXRlciB2ZXJzaW9ucyBzaG91bGQgYmUgc2ltaWxhciwgYnV0IGhhdmUgbm90CitiZWVuIHRlc3RlZC4KKworKiBEb3dubG9hZCBhIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgQW50IDEuMyBmcm9tOgorCisgICAgaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9idWlsZHMvamFrYXJ0YS1hbnQvcmVsZWFzZS92MS4zL2Jpbi8KKworICBPbiBhIFdpbmRvd3MgcGxhdGZvcm0sIHlvdSB3aWxsIG5lZWQ6CisgICAgamFrYXJ0YS1hbnQtMS4zLWJpbi56aXAKKyAgICBqYWthcnRhLWFudC0xLjMtb3B0aW9uYWwuamFyCisKKyAgT24gYSBVbml4IHBsYXRmb3JtLCB5b3Ugd2lsbCBuZWVkOgorICAgIGpha2FydGEtYW50LTEuMy1iaW4udGFyLmd6CisgICAgamFrYXJ0YS1hbnQtMS4zLW9wdGlvbmFsLmphcgorCisqIFVucGFjayB0aGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiBpbnRvIGEgY29udmVuaWVudCBsb2NhdGlvbiBzbyB0aGF0IHRoZQorICBBbnQgcmVsZWFzZSByZXNpZGVzIGluIGl0cyBvd24gZGlyZWN0b3J5IChjb252ZW50aW9uYWxseSBuYW1lZAorICAiamFrYXJ0YS1hbnQtMS4zIikuICBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSByZW1haW5kZXIgb2YgdGhpcyBkb2N1bWVudCwKKyAgdGhlIHN5bWJvbGljIG5hbWUgIiR7YW50LmhvbWV9IiBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBmdWxsIHBhdGhuYW1lIG9mCisgIHRoZSByZWxlYXNlIGRpcmVjdG9yeS4KKworKiBDb3B5IHRoZSBmaWxlICJqYWthcnRhLWFudC0xLjMtb3B0aW9uYWwuamFyIiwgZG93bmxvYWRlZCBhYm92ZSwgaW50bworICB0aGUgZGlyZWN0b3J5ICIke2FudC5ob21lfS9saWIiLiAgVGhpcyBtYWtlcyBhdmFpbGFibGUgc2V2ZXJhbCBBbnQKKyAgZXh0ZW5zaW9uIGNvbW1hbmRzIHRoYXQgYXJlIGNvbW1vbmx5IHJlcXVpcmVkIHdoZW4gYnVpbGRpbmcgSmFrYXJ0YQorICBiYXNlZCBwcm9qZWN0cy4KKworKiBNb2RpZnkgdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gaW5jbHVkZSBkaXJlY3RvcnkKKyAgIiR7YW50LmhvbWV9L2JpbiIgaW4gaXRzIGxpc3QuICBUaGlzIG1ha2VzIHRoZSAiYW50IiBjb21tYW5kIGxpbmUgc2NyaXB0CisgIGF2YWlsYWJsZSwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGFjdHVhbGx5IHBlcmZvcm0gdGhlIGJ1aWxkLgorCisKKygyKSBEb3dubG9hZCBhbmQgSW5zdGFsbCB0aGUgSkFYUC8xLjEgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uIChPUFRJT05BTCkKKworTk9URTogIEFsdGhvdWdoIHRoaXMgc3RlcCBpcyBub3QgcmVxdWlyZWQgdG8gYnVpbGQgdGhpcyBwYXJ0aWN1bGFyIHN1YnByb2plY3QsCitpdCBpcyBjb21tb25seSByZXF1aXJlZCB0byBidWlsZCBvdGhlciBKYWthcnRhIHByb2plY3RzLiAgSGVuY2UsIHRoZSBzdGVwcworcmVxdWlyZWQgYXJlIGRvY3VtZW50ZWQgaGVyZS4KKworKiBEb3dubG9hZCBhIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgSkFYUCAxLjEgKEZpbmFsIFZlcnNpb24pIGZyb206CisKKyAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9kb3dubG9hZC5odG1sCisKKyogVW5wYWNrIHRoZSBiaW5hcnkgZGlzdHJpYnV0aW9uIGludG8gYSBjb252ZW5pZW50IGxvY2F0aW9uIHNvIHRoYXQgdGhlCisgIEpBWFAvMS4xIHJlbGVhc2UgcmVzaWRlcyBpbiBpdHMgb3duIGRpcmVjdG9yeSAoY29udmVudGlvbmFsbHkgbmFtZWQKKyAgImpheHAtMS4xIi4gIEZvciB0aGUgcHVycG9zZXMgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGlzIGRvY3VtZW50LCB0aGUKKyAgc3ltYm9saWMgbmFtZSAiJHtqYXhwLmhvbWV9IiBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBmdWxsIHBhdGhuYW1lIG9mCisgIHRoZSByZWxlYXNlIGRpcmVjdG9yeS4KKworKiBNYWtlIHRoZSBKQVIgZmlsZXMgb2YgdGhpcyBkaXN0cmlidXRpb24gKCJjcmltc29uLmphciIsICJqYXhwLmphciIsIGFuZAorICAieGFsYW4uamFyIikgYXZhaWxhYmxlIGZvciB1c2UgYnkgcGVyZm9ybWluZyBPTkUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCisgIC0gUmVtb3ZlIHRoZSBleGlzdGluZyAiamF4cC5qYXIiIGFuZCAicGFyc2VyLmphciIgZmlsZXMgZm91bmQgaW4gdGhlCisgICAgIiR7YW50LmhvbWV9L2xpYiIgZGlyZWN0b3J5LCBhbmQgY29weSB0aGVzZSBKQVIgZmlsZXMgaW50byB0aGUKKyAgICAiJHthbnQuaG9tZX0vbGliIiBkaXJlY3RvcnkgKHByZWZlcmVkIG9wdGlvbikuCisKKyAgLSBBZGQgdGhlc2UgZmlsZXMgdG8geW91ciBDTEFTU1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKworKDMpIERvd25sb2FkIGFuZCBJbnN0YWxsIFN1YnByb2plY3QgU291cmNlIENvZGUKKworKiBVc2UgQW5vbnltb3VzIENWUyAoYXMgZGVzY3JpYmVkIG9uIHRoZSBKYWthcnRhIHdlYiBzaXRlIGF0CisgIDxodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3NpdGUvY3ZzaW5kZXguaHRtbD4sIG9yCisgIGRvd25sb2FkIGEgc291cmNlIGRpc3RyaWJ1dGlvbiBmcm9tOgorCisgICAgaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9idWlsZHMvamFrYXJ0YS1zZXJ2bGV0YXBpLTQvbmlnaHRseS9zcmMvCisKKyAgT24gYSBXaW5kb3dzIHBsYXRmb3JtLCB5b3Ugd2lsbCBuZWVkOgorICAgIGpha2FydGEtc2VydmxldGFwaS00LXNyYy1ZWVlZTU1ERC56aXAKKworICBPbiBhIFVuaXggcGxhdGZvcm0sIHlvdSB3aWxsIG5lZWQ6CisgICAgamFrYXJ0YS1zZXJ2bGV0YXBpLTQtc3JjLVlZWVlNTURELnppcAorCisgIChBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRvd25sb2FkIHRoZSBTZXJ2bGV0IEFQSSBzb3VyY2UgZGlzdHJpYnV0aW9uCisgIGZyb20gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHlvdSBmaW5kIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBUb21jYXQgNC4KKyAgU3VjaCBkaXN0cmlidXRpb25zIHdpbGwgY29udGFpbiBleGFjdGx5IHRoZSBTZXJ2bGV0IEFQSSBjbGFzc2VzIHVzZWQKKyAgdG8gYnVpbGQgdGhlICJzZXJ2bGV0LmphciIgZmlsZSBpbnNpZGUgdGhhdCBUb21jYXQgZGlzdHJpYnV0aW9uLikKKworKiBVbnBhY2sgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gaW50byBhIGNvbnZlbmllbnQgbG9jYXRpb24gc28gdGhhdCB0aGUKKyAgZGlzdHJpYnV0aW9uIHJlc2lkZXMgaW4gaXRzIG93biBkaXJlY3RvcnkgKGNvbnZlbnRpb25hbGx5IG5hbWVkCisgICJqYWthcnRhLXNlcnZsZXRhcGktNCIpLiAgRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUgcmVtYWluZGVyIG9mIHRoaXMgZG9jdW1lbnQsCisgIHRoZSBzeW1ib2xpYyBuYW1lICIke3NlcnZsZXRhcGkuc291cmNlfSIgaXMgdXNlZCB0byByZWZlciB0byB0aGUgZnVsbAorICBwYXRobmFtZSBvZiB0aGUgcmVsZWFzZSBkaXJlY3RvcnkuCisKKworKDQpIEN1c3RvbWl6ZSBCdWlsZCBQcm9wZXJ0aWVzIEZvciBUaGlzIFN1YnByb2plY3QKKworTW9zdCBKYWthcnRhIHN1YnByb2plY3RzIGFsbG93IHlvdSB0byBjdXN0b21pemUgQW50IHByb3BlcnRpZXMgKHdpdGggZGVmYXVsdAordmFsdWVzIGRlZmluZWQgaW4gdGhlICJidWlsZC54bWwiIGZpbGUuICBUaGlzIGlzIGRvbmUgYnkgY3JlYXRpbmcgYSB0ZXh0IGZpbGUKK25hbWVkICJidWlsZC5wcm9wZXJ0aWVzIiBpbiB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBkaXJlY3RvcnkgKGZvciBwcm9wZXJ0eQorZGVmaW5pdGlvbnMgbG9jYWwgdG8gdGhpcyBzdWJwcm9qZWN0KSBhbmQvb3IgeW91ciB1c2VyIGhvbWUgZGlyZWN0b3J5IChmb3IKK3Byb3BlcnR5IGRlZmluaXRpb25zIHNoYXJlZCBhY3Jvc3Mgc3VicHJvamVjdHMpLgorCitUaGUgImpha2FydGEtc2VydmxldGFwaS00IiBzdWJwcm9qZWN0IGRvZXMgbm90IGRlZmluZSBhbnkgY3VzdG9taXphYmxlCitidWlsZCBwcm9wZXJ0aWVzLgorCisKKyg1KSBCdWlsZCBBIEJpbmFyeSBEaXN0cmlidXRpb24KKworT3BlbiBhIGNvbW1hbmQgbGluZSBzaGVsbCwgYW5kIGlzc3VlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKyAgY2QgJHtzZXJ2bGV0YXBpLnNvdXJjZX0KKyAgYW50IC1wcm9qZWN0aGVscAorCitJZiBldmVyeXRoaW5nIGlzIGluc3RhbGxlZCBjb3JyZWN0bHksIHlvdSBzaG91bGQgc2VlIGEgbGlzdCBvZiB0aGUgQW50CisidGFyZ2V0cyIgdGhhdCByZXByZXNlbnQgZGlmZmVyZW50IGNvbW1hbmRzIHlvdSBtaWdodCB3aXNoIHRvIGJ1aWxkLiAgQnkKK2NvbnZlbnRpb24sIHRoZSAiZGlzdCIgdGFyZ2V0IGNyZWF0ZXMgYSBjb21wbGV0ZSBiaW5hcnkgZGlzdHJpYnV0aW9uLiAgVG8KK2V4ZWN1dGUgaXQsIHR5cGUgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworICBjZCAke3NlcnZsZXRhcGkuc291cmNlfQorICBhbnQgZGlzdAorCitUaGlzIHdpbGwgY3JlYXRlIGEgY29tcGxldGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiB0aGUgc3VicHJvamVjdCAoZXF1aXZhbGVudAoraW4gc3RydWN0dXJlIHRvIHRoZSBjb3JyZXNwb25kaW5nIGJpbmFyeSBkaXN0cmlidXRpb24gZG93bmxvYWRhYmxlIGZyb20gdGhlCitKYWthcnRhIHdlYiBzaXRlKSwgaW4gdGhlICIke3NlcnZsZXRhcGkuc291cmNlfS9kaXN0IiBkaXJlY3RvcnkuICBJdCB3aWxsIGhhdmUKK3RoZSBjb250ZW50cyBkZXNjcmliZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgIlJFQURNRS50eHQiIGZpbGUuCisKK1RoZSBmaWxlIG1vc3QgY29tbW9ubHkgcmVxdWlyZWQgYnkgb3RoZXIgcHJvamVjdHMgd2lsbCBiZSB0aGUgInNlcnZsZXQuamFyIgorZmlsZSwgZm91bmQgaW4gIiR7c2VydmxldGFwaS5zb3VyY2V9L2xpYi9zZXJ2bGV0LmphciIuICBNYWtlIGEgbm90ZSBvZiB0aGUKK2Z1bGwgcGF0aG5hbWUgdG8gdGhpcyBmaWxlLCBiZWNhdXNlIHlvdSB3aWxsIG5lZWQgaXQgd2hlbiBjdXN0b21pemluZyBidWlsZAorcHJvcGVydGllcyBmb3Igb3RoZXIgSmFrYXJ0YSBzdWJwcm9qZWN0cyB0aGF0IGRlcGVuZCBvbiB0aGVzZSBjbGFzc2VzLgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvTElDRU5TRSBiL3NlcnZsZXRhcGkvanNyMTU0L0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0NTY5NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L0xJQ0VOU0UKQEAgLTAsMCArMSwyMDIgQEAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9SRUFETUUudHh0IGIvc2VydmxldGFwaS9qc3IxNTQvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGI4MzI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvUkVBRE1FLnR4dApAQCAtMCwwICsxLDI4IEBACiskSWQkCisKKyAgICAgICAgICAgICAgICAgICAgICBKYXZhIFNlcnZsZXQgYW5kIEpTUCBBUEkgQ2xhc3NlcworICAgICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgc3VicHJvamVjdCBjb250YWlucyB0aGUgY29tcGlsZWQgY29kZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgb2YKK3RoZSBKYXZhIFNlcnZsZXQgYW5kIEpTUCBBUElzIChwYWNrYWdlcyBqYXZheC5zZXJ2bGV0LCBqYXZheC5zZXJ2bGV0Lmh0dHAsCitqYXZheC5zZXJ2bGV0LmpzcCwgYW5kIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dCkuICBJdCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nCitjb250ZW50czoKKworCisgIEJVSUxESU5HLnR4dCAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nIGZyb20gc291cmNlcworICBMSUNFTlNFICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgZm9yIHRoaXMgcmVsZWFzZQorICBSRUFETUUudHh0ICAgICAgICAgICAgICAgICAgVGhpcyBkb2N1bWVudAorICBkb2NzLyAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBmb3IgdGhpcyByZWxlYXNlCisgICAgICBhcGkvICAgICAgICAgICAgICAgICAgICBKYXZhZG9jcyBmb3IgU2VydmxldCBhbmQgSlNQIEFQSSBjbGFzc2VzCisgIGxpYi8gICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnkgSkFSIGZpbGVzIGZvciB0aGlzIHJlbGVhc2UKKyAgICAgIHNlcnZsZXQuamFyICAgICAgICAgICAgIEJpbmFyeSBTZXJ2bGV0IGFuZCBKU1AgQVBJIGNsYXNzZXMKKyAgc3JjLyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZXMgZm9yIFNlcnZsZXQgYW5kIEpTUCBBUEkgY2xhc3NlcworCitJbiBnZW5lcmFsLCB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB0aGUgInNlcnZsZXQuamFyIiBmaWxlIChmb3VuZCBpbiB0aGUgImxpYiIKK3N1YmRpcmVjdG9yeSBvZiB0aGlzIHJlbGVhc2UpIGludG8gdGhlIGNvbXBpbGF0aW9uIGNsYXNzIHBhdGggZm9yIHlvdXIKK3Byb2plY3RzIHRoYXQgZGVwZW5kIG9uIHRoZXNlIEFQSXMuCisKK1RoZSBjb21waWxlZCAic2VydmxldC5qYXIiIGZpbGUgaW5jbHVkZWQgaW4gdGhpcyBzdWJwcm9qZWN0IGlzIGF1dG9tYXRpY2FsbHkKK2luY2x1ZGVkIGluIGJpbmFyeSBkaXN0cmlidXRpb25zIG9mIFRvbWNhdCA0LjAsIHNvIHlvdSBuZWVkIG5vdCBkb3dubG9hZCB0aGlzCitzdWJwcm9qZWN0IHNlcGFyYXRlbHkgdW5sZXNzIHlvdSB3aXNoIHRvIHV0aWxpemUgdGhlIEphdmFkb2NzLCBvciBwZXJ1c2UgdGhlCitzb3VyY2UgY29kZSB0byBzZWUgaG93IHRoZSBBUEkgY2xhc3NlcyBhcmUgaW1wbGVtZW50ZWQuCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9idWlsZC54bWwgYi9zZXJ2bGV0YXBpL2pzcjE1NC9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjMTc3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2J1aWxkLnhtbApAQCAtMCwwICsxLDE3OCBAQAorPHByb2plY3QgbmFtZT0iU2VydmxldCBBUEkgQ2xhc3NlcyIgZGVmYXVsdD0iY29tcGlsZSIgYmFzZWRpcj0iLiI+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gRW52aXJvbm1lbnRhbCBQcm9wZXJ0aWVzID09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDwhLS0gTG9hZCB1c2VyIHByb3BlcnR5IGRlZmluaXRpb24gb3ZlcnJpZGVzIC0tPgorICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9L2J1aWxkLnByb3BlcnRpZXMiLz4KKworICA8IS0tIEVzdGFibGlzaCBwcm9wZXJ0eSBkZWZpbml0aW9uIGRlZmF1bHRzIC0tPgorICA8cHJvcGVydHkgbmFtZT0iY29tcGlsZS5kZWJ1ZyIgICAgICAgdmFsdWU9InRydWUiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNvbXBpbGUuZGVwcmVjYXRpb24iIHZhbHVlPSJmYWxzZSIvPgorICA8cHJvcGVydHkgbmFtZT0iY29tcGlsZS5vcHRpbWl6ZSIgICAgdmFsdWU9InRydWUiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImltcGxlbWVudGF0aW9uLnJldmlzaW9uIiB2YWx1ZT0icHVibGljX2RyYWZ0Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2bGV0LWFwaS5idWlsZCIgICAgdmFsdWU9ImJ1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2bGV0LWFwaS5kaXN0IiAgICAgdmFsdWU9ImRpc3QiLz4KKyAgPHByb3BlcnR5IG5hbWU9InNlcnZsZXQtYXBpLmphciIgdmFsdWU9IiR7c2VydmxldC1hcGkuZGlzdH0vbGliL3NlcnZsZXQtYXBpLmphciIvPgorICA8cGF0aCBpZD0iZXhhbXBsZXMuY2xhc3NwYXRoIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7c2VydmxldC1hcGkuYnVpbGR9L2NsYXNzZXMiLz4KKyAgPC9wYXRoPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gUHJlcGFyZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9InByZXBhcmUiPgorCisgICAgPCEtLSAiQnVpbGQiIEhpZXJhcmNoeSAtLT4KKyAgICA8bWtkaXIgZGlyPSIke3NlcnZsZXQtYXBpLmJ1aWxkfSIvPgorICAgIDxta2RpciBkaXI9IiR7c2VydmxldC1hcGkuYnVpbGR9L2NsYXNzZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke3NlcnZsZXQtYXBpLmJ1aWxkfS9kb2NzIi8+CisgICAgPG1rZGlyIGRpcj0iJHtzZXJ2bGV0LWFwaS5idWlsZH0vZG9jcy9hcGkiLz4KKyAgICA8bWtkaXIgZGlyPSIke3NlcnZsZXQtYXBpLmJ1aWxkfS9leGFtcGxlcyIvPgorCisgICAgPCEtLSAiRGlzdCIgSGllcmFyY2h5IC0tPgorICAgIDxta2RpciBkaXI9IiR7c2VydmxldC1hcGkuZGlzdH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke3NlcnZsZXQtYXBpLmRpc3R9L2RvY3MiLz4KKyAgICA8bWtkaXIgZGlyPSIke3NlcnZsZXQtYXBpLmRpc3R9L2RvY3MvYXBpIi8+CisgICAgPG1rZGlyIGRpcj0iJHtzZXJ2bGV0LWFwaS5kaXN0fS9saWIiLz4KKyAgICA8bWtkaXIgZGlyPSIke3NlcnZsZXQtYXBpLmRpc3R9L3NyYyIvPgorICAgIDxta2RpciBkaXI9IiR7c2VydmxldC1hcGkuZGlzdH0vZXhhbXBsZXMiLz4KKworICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0iZG9jcy51cHRvZGF0ZSIgdGFyZ2V0ZmlsZT0iJHtzZXJ2bGV0LWFwaS5idWlsZH0vZG9jcy9hcGkvaW5kZXguaHRtbCI+CisgICAgICA8c3JjZmlsZXMgZGlyPSJzcmMvc2hhcmUiIGluY2x1ZGVzPSIqKi8qLmphdmEiIC8+CisgICAgPC91cHRvZGF0ZT4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IFN0YXRpYyBGaWxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0ic3RhdGljIiBkZXBlbmRzPSJwcmVwYXJlIj4KKworICAgIDwhLS0gIkRpc3QiIEhpZXJhcmNoeSAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtzZXJ2bGV0LWFwaS5kaXN0fSI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJCVUlMRElORy50eHQiLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IkxJQ0VOU0UiLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IlJFQURNRS50eHQiLz4KKyAgICA8L2NvcHk+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PSBDb21waWxlIENsYXNzZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0ic3RhdGljIgorICAgZGVzY3JpcHRpb249IkNvbXBpbGUgQVBJIGNsYXNzZXMgKERlZmF1bHQpIj4KKworICAgIDwhLS0gSmF2YSBjbGFzc2VzIC0tPgorICAgIDxqYXZhYyBzcmNkaXI9InNyYy9zaGFyZSIgZGVzdGRpcj0iJHtzZXJ2bGV0LWFwaS5idWlsZH0vY2xhc3NlcyIKKyAgICAgICAgICAgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iIGRlcHJlY2F0aW9uPSIke2NvbXBpbGUuZGVwcmVjYXRpb259IgorICAgICAgICBvcHRpbWl6ZT0iJHtjb21waWxlLm9wdGltaXplfSIvPgorCisgICAgPCEtLSBBc3NvY2lhdGVkIHByb3BlcnR5IGZpbGVzIC0tPgorICAgIDxjb3B5IHRvZGlyPSIke3NlcnZsZXQtYXBpLmJ1aWxkfS9jbGFzc2VzIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvc2hhcmUiPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorCisgICAgPCEtLSBTZXJ2bGV0IHJlc291cmNlcyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtzZXJ2bGV0LWFwaS5idWlsZH0vY2xhc3Nlcy9qYXZheC9zZXJ2bGV0L3Jlc291cmNlcyI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3NoYXJlL2R0ZCIgaW5jbHVkZXM9IiouZHRkLCoueHNkIj4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJqc3AqLmR0ZCIvPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9IndlYi1qc3AqLmR0ZCIvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT0gQnVpbGQgSmF2YURvYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVwZW5kcz0icHJlcGFyZSIgdW5sZXNzPSJkb2NzLnVwdG9kYXRlIj4KKworICAgIDxqYXZhZG9jIHBhY2thZ2VuYW1lcz0iamF2YXguc2VydmxldC4qIgorICAgICAgICAgICAgIHNvdXJjZXBhdGg9IiR7YmFzZWRpcn0vc3JjL3NoYXJlIgorICAgICAgICAgICAgIGRlc3RkaXI9IiR7c2VydmxldC1hcGkuYnVpbGR9L2RvY3MvYXBpIgorICAgICAgICAgICAgIHVzZT0idHJ1ZSIKKyAgICAgICAgICAgICB3aW5kb3d0aXRsZT0iU2VydmxldCBBUEkgRG9jdW1lbnRhdGlvbiIKKyAgICAgICAgICAgICBkb2N0aXRsZT0iU2VydmxldCBBUEkgRG9jdW1lbnRhdGlvbiIKKyAgICAgICAgICAgICBib3R0b209IkNvcHlyaWdodCAmYW1wO2NvcHk7IDE5OTktMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLiIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT0gQnVpbGQgSmF2YURvYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZXhhbXBsZXMiIGRlcGVuZHM9InByZXBhcmUiPgorCisgICAgPGNvcHkgdG9kaXI9IiR7c2VydmxldC1hcGkuYnVpbGR9L2V4YW1wbGVzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iZXhhbXBsZXMiPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJidWlsZC4qIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorCisgICAgPGphdmFjICAgc3JjZGlyPSJleGFtcGxlcy9XRUItSU5GL2NsYXNzZXMiIAorICAgICAgICAgICAgIGRlc3RkaXI9IiR7c2VydmxldC1hcGkuYnVpbGR9L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3NlcyIKKyAgICAgICAgICAgICBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIgZGVwcmVjYXRpb249IiR7Y29tcGlsZS5kZXByZWNhdGlvbn0iCisgICAgICAgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iCisgICAgICAgICAgICAgZXhjbHVkZXM9IioqL0NWUy8qKiI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJleGFtcGxlcy5jbGFzc3BhdGgiIC8+CisgICAgPC9qYXZhYz4KKworICAgIDxqYXIgICBqYXJmaWxlPSIke3NlcnZsZXQtYXBpLmRpc3R9L2V4YW1wbGVzL2V4YW1wbGVzLndhciIKKyAgICAgICAgICAgYmFzZWRpcj0iJHtzZXJ2bGV0LWFwaS5idWlsZH0vZXhhbXBsZXMiIGluY2x1ZGVzPSIqKiIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gRGlzdHJpYnV0aW9uIEZpbGVzID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iamFyIiBkZXBlbmRzPSJjb21waWxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgdGhlIGphciI+CisKKyAgICA8IS0tIFByZXBhcmUgTWFuaWZlc3QgLS0+CisgICAgPGNvcHkgdG9maWxlPSIke3NlcnZsZXQtYXBpLmJ1aWxkfS9tYW5pZmVzdCIKKyAgICAgICAgICAgIGZpbGU9InNyYy9ldGMvbWFuaWZlc3QiIG92ZXJ3cml0ZT0ieWVzIj4KKyAgICAgIDxmaWx0ZXJzZXQ+CisgICAgICAgIDxmaWx0ZXIgdG9rZW49ImltcGxlbWVudGF0aW9uLnJldmlzaW9uIgorICAgICAgICAgICAgICAgIHZhbHVlPSIke2ltcGxlbWVudGF0aW9uLnJldmlzaW9ufSIvPgorICAgICAgPC9maWx0ZXJzZXQ+CisgICAgPC9jb3B5PgorCisgICAgPCEtLSBDcmVhdGUgSkFSIGZpbGUgLS0+CisgICAgPGphciBqYXJmaWxlPSIke3NlcnZsZXQtYXBpLmphcn0iCisgICAgICAgICBiYXNlZGlyPSIke3NlcnZsZXQtYXBpLmJ1aWxkfS9jbGFzc2VzIgorICAgICAgICAgbWFuaWZlc3Q9IiR7c2VydmxldC1hcGkuYnVpbGR9L21hbmlmZXN0Ij4KKyAgICAgIDxpbmNsdWRlIG5hbWU9ImphdmF4L3NlcnZsZXQvKioiLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImphdmF4L3NlcnZsZXQvanNwLyoqIi8+CisgICAgPC9qYXI+CisKKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJjb21waWxlLGV4YW1wbGVzLGphdmFkb2MsamFyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiI+CisKKyAgICA8IS0tIENvcHkgSmF2YWRvY3MgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7c2VydmxldC1hcGkuZGlzdH0vZG9jcy9hcGkiPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c2VydmxldC1hcGkuYnVpbGR9L2RvY3MvYXBpIi8+CisgICAgPC9jb3B5PgorCisgICAgPCEtLSBDb3B5IEFQSSBzb3VyY2UgZmlsZXMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7c2VydmxldC1hcGkuZGlzdH0vc3JjIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvc2hhcmUiLz4KKyAgICA8L2NvcHk+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gQ2xlYW4gR2VuZXJhdGVkIEZpbGVzID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJjbGVhbiIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiBwcmV2aW91cyBidWlsZCByZXN1bHRzIj4KKworICAgIDxkZWxldGUgZGlyPSIke3NlcnZsZXQtYXBpLmJ1aWxkfSIvPgorICAgIDxkZWxldGUgZGlyPSIke3NlcnZsZXQtYXBpLmRpc3R9Ii8+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT0gQWxsIEluIE9uZSBCdWlsZCA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImNsZWFuLGRpc3QiCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4sIGNvbXBpbGUsIGFuZCBkaXN0Ii8+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL0Nvb2tpZUV4YW1wbGUuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9Db29raWVFeGFtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiMzkyNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9Db29raWVFeGFtcGxlLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLyogJElkJAorICoKKyAqLworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudGV4dC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworaW1wb3J0IHV0aWwuSFRNTEZpbHRlcjsKKworLyoqCisgKiBFeGFtcGxlIHNlcnZsZXQgc2hvd2luZyByZXF1ZXN0IGhlYWRlcnMKKyAqCisgKiBAYXV0aG9yIEphbWVzIER1bmNhbiBEYXZpZHNvbiA8ZHVuY2FuQGVuZy5zdW4uY29tPgorICovCisKK3B1YmxpYyBjbGFzcyBDb29raWVFeGFtcGxlIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgUmVzb3VyY2VCdW5kbGUgcmIgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIkxvY2FsU3RyaW5ncyIpOworICAgIAorICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOworCisgICAgICAgIFByaW50V3JpdGVyIG91dCA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBvdXQucHJpbnRsbigiPGh0bWw+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8Ym9keSBiZ2NvbG9yPVwid2hpdGVcIj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxoZWFkPiIpOworCisgICAgICAgIFN0cmluZyB0aXRsZSA9IHJiLmdldFN0cmluZygiY29va2llcy50aXRsZSIpOworICAgICAgICBvdXQucHJpbnRsbigiPHRpdGxlPiIgKyB0aXRsZSArICI8L3RpdGxlPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPC9oZWFkPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGJvZHk+Iik7CisKKwkvLyByZWxhdGl2ZSBsaW5rcworCisgICAgICAgIC8vIFhYWAorICAgICAgICAvLyBtYWtpbmcgdGhlc2UgYWJzb2x1dGUgdGlsbCB3ZSB3b3JrIG91dCB0aGUKKyAgICAgICAgLy8gYWRkaXRpb24gb2YgYSBQYXRoSW5mbyBpc3N1ZSAKKwkKKyAgICAgICAgb3V0LnByaW50bG4oIjxhIGhyZWY9XCIuLi9jb29raWVzLmh0bWxcIj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbWcgc3JjPVwiLi4vaW1hZ2VzL2NvZGUuZ2lmXCIgaGVpZ2h0PTI0ICIgKworICAgICAgICAgICAgICAgICAgICAid2lkdGg9MjQgYWxpZ249cmlnaHQgYm9yZGVyPTAgYWx0PVwidmlldyBjb2RlXCI+PC9hPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGEgaHJlZj1cIi4uL2luZGV4Lmh0bWxcIj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbWcgc3JjPVwiLi4vaW1hZ2VzL3JldHVybi5naWZcIiBoZWlnaHQ9MjQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aWR0aD0yNCBhbGlnbj1yaWdodCBib3JkZXI9MCBhbHQ9XCJyZXR1cm5cIj48L2E+Iik7CisKKyAgICAgICAgb3V0LnByaW50bG4oIjxoMz4iICsgdGl0bGUgKyAiPC9oMz4iKTsKKworICAgICAgICBDb29raWVbXSBjb29raWVzID0gcmVxdWVzdC5nZXRDb29raWVzKCk7CisgICAgICAgIGlmICgoY29va2llcyAhPSBudWxsKSAmJiAoY29va2llcy5sZW5ndGggPiAwKSkgeworICAgICAgICAgICAgb3V0LnByaW50bG4ocmIuZ2V0U3RyaW5nKCJjb29raWVzLmNvb2tpZXMiKSArICI8YnI+Iik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBDb29raWUgY29va2llID0gY29va2llc1tpXTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIkNvb2tpZSBOYW1lOiAiICsgSFRNTEZpbHRlci5maWx0ZXIoY29va2llLmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGJyPiIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgIENvb2tpZSBWYWx1ZTogIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEhUTUxGaWx0ZXIuZmlsdGVyKGNvb2tpZS5nZXRWYWx1ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjxicj48YnI+Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoImNvb2tpZXMubm8tY29va2llcyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBjb29raWVOYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImNvb2tpZW5hbWUiKTsKKyAgICAgICAgU3RyaW5nIGNvb2tpZVZhbHVlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImNvb2tpZXZhbHVlIik7CisgICAgICAgIGlmIChjb29raWVOYW1lICE9IG51bGwgJiYgY29va2llVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgQ29va2llIGNvb2tpZSA9IG5ldyBDb29raWUoY29va2llTmFtZSwgY29va2llVmFsdWUpOworICAgICAgICAgICAgcmVzcG9uc2UuYWRkQ29va2llKGNvb2tpZSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiPFA+Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoImNvb2tpZXMuc2V0IikgKyAiPGJyPiIpOworICAgICAgICAgICAgb3V0LnByaW50KHJiLmdldFN0cmluZygiY29va2llcy5uYW1lIikgKyAiICAiIAorICAgICAgICAgICAgICAgICAgICAgICsgSFRNTEZpbHRlci5maWx0ZXIoY29va2llTmFtZSkgKyAiPGJyPiIpOworICAgICAgICAgICAgb3V0LnByaW50KHJiLmdldFN0cmluZygiY29va2llcy52YWx1ZSIpICsgIiAgIiAKKyAgICAgICAgICAgICAgICAgICAgICArIEhUTUxGaWx0ZXIuZmlsdGVyKGNvb2tpZVZhbHVlKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG91dC5wcmludGxuKCI8UD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4ocmIuZ2V0U3RyaW5nKCJjb29raWVzLm1ha2UtY29va2llIikgKyAiPGJyPiIpOworICAgICAgICBvdXQucHJpbnQoIjxmb3JtIGFjdGlvbj1cIiIpOworICAgICAgICBvdXQucHJpbnRsbigiQ29va2llRXhhbXBsZVwiIG1ldGhvZD1QT1NUPiIpOworICAgICAgICBvdXQucHJpbnQocmIuZ2V0U3RyaW5nKCJjb29raWVzLm5hbWUiKSArICIgICIpOworICAgICAgICBvdXQucHJpbnRsbigiPGlucHV0IHR5cGU9dGV4dCBsZW5ndGg9MjAgbmFtZT1jb29raWVuYW1lPjxicj4iKTsKKyAgICAgICAgb3V0LnByaW50KHJiLmdldFN0cmluZygiY29va2llcy52YWx1ZSIpICsgIiAgIik7CisgICAgICAgIG91dC5wcmludGxuKCI8aW5wdXQgdHlwZT10ZXh0IGxlbmd0aD0yMCBuYW1lPWNvb2tpZXZhbHVlPjxicj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbnB1dCB0eXBlPXN1Ym1pdD48L2Zvcm0+Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICBvdXQucHJpbnRsbigiPC9ib2R5PiIpOworICAgICAgICBvdXQucHJpbnRsbigiPC9odG1sPiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRvR2V0KHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvSGVsbG9Xb3JsZEV4YW1wbGUuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9IZWxsb1dvcmxkRXhhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZjI0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvSGVsbG9Xb3JsZEV4YW1wbGUuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy8qICRJZCQKKyAqCisgKi8KKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnRleHQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogVGhlIHNpbXBsZXN0IHBvc3NpYmxlIHNlcnZsZXQuCisgKgorICogQGF1dGhvciBKYW1lcyBEdW5jYW4gRGF2aWRzb24KKyAqLworCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZEV4YW1wbGUgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmIgPQorICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJMb2NhbFN0cmluZ3MiLHJlcXVlc3QuZ2V0TG9jYWxlKCkpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7CisgICAgICAgIFByaW50V3JpdGVyIG91dCA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIG91dC5wcmludGxuKCI8aHRtbD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxoZWFkPiIpOworCisJICAgIFN0cmluZyB0aXRsZSA9IHJiLmdldFN0cmluZygiaGVsbG93b3JsZC50aXRsZSIpOworCisJICAgIG91dC5wcmludGxuKCI8dGl0bGU+IiArIHRpdGxlICsgIjwvdGl0bGU+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8L2hlYWQ+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8Ym9keSBiZ2NvbG9yPVwid2hpdGVcIj4iKTsKKworCS8vIG5vdGUgdGhhdCBhbGwgbGlua3MgYXJlIGNyZWF0ZWQgdG8gYmUgcmVsYXRpdmUuIHRoaXMKKwkvLyBlbnN1cmVzIHRoYXQgd2UgY2FuIG1vdmUgdGhlIHdlYiBhcHBsaWNhdGlvbiB0aGF0IHRoaXMKKwkvLyBzZXJ2bGV0IGJlbG9uZ3MgdG8gdG8gYSBkaWZmZXJlbnQgcGxhY2UgaW4gdGhlIHVybAorCS8vIHRyZWUgYW5kIG5vdCBoYXZlIGFueSBoYXJtZnVsIHNpZGUgZWZmZWN0cy4KKworICAgICAgICAvLyBYWFgKKyAgICAgICAgLy8gbWFraW5nIHRoZXNlIGFic29sdXRlIHRpbGwgd2Ugd29yayBvdXQgdGhlCisgICAgICAgIC8vIGFkZGl0aW9uIG9mIGEgUGF0aEluZm8gaXNzdWUKKworCSAgICBvdXQucHJpbnRsbigiPGEgaHJlZj1cIi4uL2hlbGxvd29ybGQuaHRtbFwiPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGltZyBzcmM9XCIuLi9pbWFnZXMvY29kZS5naWZcIiBoZWlnaHQ9MjQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aWR0aD0yNCBhbGlnbj1yaWdodCBib3JkZXI9MCBhbHQ9XCJ2aWV3IGNvZGVcIj48L2E+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8YSBocmVmPVwiLi4vaW5kZXguaHRtbFwiPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGltZyBzcmM9XCIuLi9pbWFnZXMvcmV0dXJuLmdpZlwiIGhlaWdodD0yNCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpZHRoPTI0IGFsaWduPXJpZ2h0IGJvcmRlcj0wIGFsdD1cInJldHVyblwiPjwvYT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxoMT4iICsgdGl0bGUgKyAiPC9oMT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvYm9keT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvaHRtbD4iKTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY5NWNkMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMCwwICsxLDUzIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgJElkJAorCisjIERlZmF1bHQgbG9jYWxpemVkIHJlc291cmNlcyBmb3IgZXhhbXBsZSBzZXJ2bGV0cworIyBUaGlzIGxvY2FsZSBpcyBlbl9VUworCitoZWxsb3dvcmxkLnRpdGxlPUhlbGxvIFdvcmxkIQorCityZXF1ZXN0aW5mby50aXRsZT1SZXF1ZXN0IEluZm9ybWF0aW9uIEV4YW1wbGUKK3JlcXVlc3RpbmZvLmxhYmVsLm1ldGhvZD1NZXRob2Q6CityZXF1ZXN0aW5mby5sYWJlbC5yZXF1ZXN0dXJpPVJlcXVlc3QgVVJJOgorcmVxdWVzdGluZm8ubGFiZWwucHJvdG9jb2w9UHJvdG9jb2w6CityZXF1ZXN0aW5mby5sYWJlbC5wYXRoaW5mbz1QYXRoIEluZm86CityZXF1ZXN0aW5mby5sYWJlbC5yZW1vdGVhZGRyPVJlbW90ZSBBZGRyZXNzOgorCityZXF1ZXN0aGVhZGVyLnRpdGxlPVJlcXVlc3QgSGVhZGVyIEV4YW1wbGUKKworcmVxdWVzdHBhcmFtcy50aXRsZT1SZXF1ZXN0IFBhcmFtZXRlcnMgRXhhbXBsZQorcmVxdWVzdHBhcmFtcy5wYXJhbXMtaW4tcmVxPVBhcmFtZXRlcnMgaW4gdGhpcyByZXF1ZXN0OgorcmVxdWVzdHBhcmFtcy5uby1wYXJhbXM9Tm8gUGFyYW1ldGVycywgUGxlYXNlIGVudGVyIHNvbWUKK3JlcXVlc3RwYXJhbXMuZmlyc3RuYW1lPUZpcnN0IE5hbWU6CityZXF1ZXN0cGFyYW1zLmxhc3RuYW1lPUxhc3QgTmFtZToKKworY29va2llcy50aXRsZT1Db29raWVzIEV4YW1wbGUKK2Nvb2tpZXMuY29va2llcz1Zb3VyIGJyb3dzZXIgaXMgc2VuZGluZyB0aGUgZm9sbG93aW5nIGNvb2tpZXM6Citjb29raWVzLm5vLWNvb2tpZXM9WW91ciBicm93c2VyIGlzbid0IHNlbmRpbmcgYW55IGNvb2tpZXMKK2Nvb2tpZXMubWFrZS1jb29raWU9Q3JlYXRlIGEgY29va2llIHRvIHNlbmQgdG8geW91ciBicm93c2VyCitjb29raWVzLm5hbWU9TmFtZToKK2Nvb2tpZXMudmFsdWU9VmFsdWU6Citjb29raWVzLnNldD1Zb3UganVzdCBzZW50IHRoZSBmb2xsb3dpbmcgY29va2llIHRvIHlvdXIgYnJvd3NlcjoKKworc2Vzc2lvbnMudGl0bGU9U2Vzc2lvbnMgRXhhbXBsZQorc2Vzc2lvbnMuaWQ9U2Vzc2lvbiBJRDoKK3Nlc3Npb25zLmNyZWF0ZWQ9Q3JlYXRlZDoKK3Nlc3Npb25zLmxhc3RhY2Nlc3NlZD1MYXN0IEFjY2Vzc2VkOgorc2Vzc2lvbnMuZGF0YT1UaGUgZm9sbG93aW5nIGRhdGEgaXMgaW4geW91ciBzZXNzaW9uOgorc2Vzc2lvbnMuYWRkZGF0YT1BZGQgZGF0YSB0byB5b3VyIHNlc3Npb24KK3Nlc3Npb25zLmRhdGFuYW1lPU5hbWUgb2YgU2Vzc2lvbiBBdHRyaWJ1dGU6CitzZXNzaW9ucy5kYXRhdmFsdWU9VmFsdWUgb2YgU2Vzc2lvbiBBdHRyaWJ1dGU6CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvTG9jYWxTdHJpbmdzX2VuLnByb3BlcnRpZXMgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvTG9jYWxTdHJpbmdzX2VuLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY5NWNkMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9Mb2NhbFN0cmluZ3NfZW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDUzIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgJElkJAorCisjIERlZmF1bHQgbG9jYWxpemVkIHJlc291cmNlcyBmb3IgZXhhbXBsZSBzZXJ2bGV0cworIyBUaGlzIGxvY2FsZSBpcyBlbl9VUworCitoZWxsb3dvcmxkLnRpdGxlPUhlbGxvIFdvcmxkIQorCityZXF1ZXN0aW5mby50aXRsZT1SZXF1ZXN0IEluZm9ybWF0aW9uIEV4YW1wbGUKK3JlcXVlc3RpbmZvLmxhYmVsLm1ldGhvZD1NZXRob2Q6CityZXF1ZXN0aW5mby5sYWJlbC5yZXF1ZXN0dXJpPVJlcXVlc3QgVVJJOgorcmVxdWVzdGluZm8ubGFiZWwucHJvdG9jb2w9UHJvdG9jb2w6CityZXF1ZXN0aW5mby5sYWJlbC5wYXRoaW5mbz1QYXRoIEluZm86CityZXF1ZXN0aW5mby5sYWJlbC5yZW1vdGVhZGRyPVJlbW90ZSBBZGRyZXNzOgorCityZXF1ZXN0aGVhZGVyLnRpdGxlPVJlcXVlc3QgSGVhZGVyIEV4YW1wbGUKKworcmVxdWVzdHBhcmFtcy50aXRsZT1SZXF1ZXN0IFBhcmFtZXRlcnMgRXhhbXBsZQorcmVxdWVzdHBhcmFtcy5wYXJhbXMtaW4tcmVxPVBhcmFtZXRlcnMgaW4gdGhpcyByZXF1ZXN0OgorcmVxdWVzdHBhcmFtcy5uby1wYXJhbXM9Tm8gUGFyYW1ldGVycywgUGxlYXNlIGVudGVyIHNvbWUKK3JlcXVlc3RwYXJhbXMuZmlyc3RuYW1lPUZpcnN0IE5hbWU6CityZXF1ZXN0cGFyYW1zLmxhc3RuYW1lPUxhc3QgTmFtZToKKworY29va2llcy50aXRsZT1Db29raWVzIEV4YW1wbGUKK2Nvb2tpZXMuY29va2llcz1Zb3VyIGJyb3dzZXIgaXMgc2VuZGluZyB0aGUgZm9sbG93aW5nIGNvb2tpZXM6Citjb29raWVzLm5vLWNvb2tpZXM9WW91ciBicm93c2VyIGlzbid0IHNlbmRpbmcgYW55IGNvb2tpZXMKK2Nvb2tpZXMubWFrZS1jb29raWU9Q3JlYXRlIGEgY29va2llIHRvIHNlbmQgdG8geW91ciBicm93c2VyCitjb29raWVzLm5hbWU9TmFtZToKK2Nvb2tpZXMudmFsdWU9VmFsdWU6Citjb29raWVzLnNldD1Zb3UganVzdCBzZW50IHRoZSBmb2xsb3dpbmcgY29va2llIHRvIHlvdXIgYnJvd3NlcjoKKworc2Vzc2lvbnMudGl0bGU9U2Vzc2lvbnMgRXhhbXBsZQorc2Vzc2lvbnMuaWQ9U2Vzc2lvbiBJRDoKK3Nlc3Npb25zLmNyZWF0ZWQ9Q3JlYXRlZDoKK3Nlc3Npb25zLmxhc3RhY2Nlc3NlZD1MYXN0IEFjY2Vzc2VkOgorc2Vzc2lvbnMuZGF0YT1UaGUgZm9sbG93aW5nIGRhdGEgaXMgaW4geW91ciBzZXNzaW9uOgorc2Vzc2lvbnMuYWRkZGF0YT1BZGQgZGF0YSB0byB5b3VyIHNlc3Npb24KK3Nlc3Npb25zLmRhdGFuYW1lPU5hbWUgb2YgU2Vzc2lvbiBBdHRyaWJ1dGU6CitzZXNzaW9ucy5kYXRhdmFsdWU9VmFsdWUgb2YgU2Vzc2lvbiBBdHRyaWJ1dGU6CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ2MjUxOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDUzIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgJElkJAorIworIyBEZWZhdWx0IGxvY2FsaXplZCBzdHJpbmcgaW5mb3JtYXRpb24KKyMgTG9jYWxpemVkIHBhcmEgTG9jYWxlIGVzX0VTCisKK2hlbGxvd29ybGQudGl0bGU9SG9sYSBNdW5kbyEKKworcmVxdWVzdGluZm8udGl0bGU9RWplbXBsbyBkZSBJbmZvcm1hY2lvbiBkZSBSZXF1ZXN0CityZXF1ZXN0aW5mby5sYWJlbC5tZXRob2Q9TWV0b2RvOgorcmVxdWVzdGluZm8ubGFiZWwucmVxdWVzdHVyaT1SZXF1ZXN0IFVSSToKK3JlcXVlc3RpbmZvLmxhYmVsLnByb3RvY29sPVByb3RvY29sbzoKK3JlcXVlc3RpbmZvLmxhYmVsLnBhdGhpbmZvPVBhdGggSW5mbzoKK3JlcXVlc3RpbmZvLmxhYmVsLnJlbW90ZWFkZHI9RGlyZWNjaW9uIFJlbW90YToKKworcmVxdWVzdGhlYWRlci50aXRsZT1FamVtcGxvIGRlIENhYmVjZXJhIGRlIFJlcXVlc3QKKworcmVxdWVzdHBhcmFtcy50aXRsZT1FamVtcGxvIGRlIHBhcmFtZXRyb3MgZGUgUmVxdWVzdAorcmVxdWVzdHBhcmFtcy5wYXJhbXMtaW4tcmVxPVBhcmFtZXRyb3MgZW4gZXN0ZSBSZXF1ZXN0OgorcmVxdWVzdHBhcmFtcy5uby1wYXJhbXM9Tm8gaGF5IHBhcmFtZXRyby4gcG9yIGZhdm9yIHVzYSBhbGd1bm8KK3JlcXVlc3RwYXJhbXMuZmlyc3RuYW1lPU5vbWJyZToKK3JlcXVlc3RwYXJhbXMubGFzdG5hbWU9QXBlbGxpZG9zOgorCitjb29raWVzLnRpdGxlPUVqZW1wbG8gZGUgQ29va2llcworY29va2llcy5jb29raWVzPVR1IG5hdmVnYWRvciBlc3RhIGVudmlhbmRvIGxvcyBzaWd1aWVudGVzIGNvb2tpZXM6Citjb29raWVzLm5vLWNvb2tpZXM9VHUgbmF2ZWdhZG9yIG5vIGVzdGEgZW52aWFuZG8gY29va2llcworY29va2llcy5tYWtlLWNvb2tpZT1DcmVhIHVuIGNvb2tpZSBwYXJhIGVudmlhcmxvIGEgdHUgbmF2ZWdhZG9yCitjb29raWVzLm5hbWU9Tm9tYnJlOgorY29va2llcy52YWx1ZT1WYWxvcjoKK2Nvb2tpZXMuc2V0PUFjYWJhcyBkZSBlbnZpYXIgYSB0dSBuYXZlZ2Fkb3IgZXN0b3MgY29va2llczoKKworc2Vzc2lvbnMudGl0bGU9ZWplbXBsbyBkZSBTZXNpb25lcworc2Vzc2lvbnMuaWQ9SUQgZGUgU2VzaW9uOgorc2Vzc2lvbnMuY3JlYXRlZD1DcmVhZG86CitzZXNzaW9ucy5sYXN0YWNjZXNzZWQ9VWx0aW1vIEFjY2VzbzoKK3Nlc3Npb25zLmRhdGE9TG8gc2lndWllbnRlcyBkYXRvcyBlc3RhbiBlbiB0dSBzZXNpb246CitzZXNzaW9ucy5hZGRkYXRhPUHxYWRlIGRhdG9zIGEgdHUgc2VzaW9uOgorc2Vzc2lvbnMuZGF0YW5hbWU9Tm9tYnJlIGRlbCBhdHJpYnV0byBkZSBzZXNpb246CitzZXNzaW9ucy5kYXRhdmFsdWU9VmFsb3IgZGVsIGF0cmlidXRvIGRlIHNlc2lvbjoKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2MwMDMxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTMgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyAkSWQkCisKKyMgRGVmYXVsdCBsb2NhbGl6ZWQgcmVzb3VyY2VzIGZvciBleGFtcGxlIHNlcnZsZXRzCisjIFRoaXMgbG9jYWxlIGlzIGZyX0ZSCisKK2hlbGxvd29ybGQudGl0bGU9U2FsdXQgbGUgTW9uZGUhCisKK3JlcXVlc3RpbmZvLnRpdGxlPUV4ZW1wbGUgZCcnaW5mb3JtYXRpb24gc3VyIGxhIHJlcXXqdGUKK3JlcXVlc3RpbmZvLmxhYmVsLm1ldGhvZD1N6XRob2RlOgorcmVxdWVzdGluZm8ubGFiZWwucmVxdWVzdHVyaT1VUkkgZGUgcmVxdep0ZToKK3JlcXVlc3RpbmZvLmxhYmVsLnByb3RvY29sPVByb3RvY29sZToKK3JlcXVlc3RpbmZvLmxhYmVsLnBhdGhpbmZvPUluZm8gZGUgY2hlbWluOgorcmVxdWVzdGluZm8ubGFiZWwucmVtb3RlYWRkcj1BZHJlc3NlIGRpc3RhbnRlOgorCityZXF1ZXN0aGVhZGVyLnRpdGxlPUV4ZW1wbGUgZCcnaW5mb3JtYXRpb24gc3VyIGxlcyBlbnTqdGUgZGUgcmVxdep0ZQorCityZXF1ZXN0cGFyYW1zLnRpdGxlPUV4ZW1wbGUgZGUgcmVxdep0ZSBhdmVjIHBhcmFt6nRyZXMKK3JlcXVlc3RwYXJhbXMucGFyYW1zLWluLXJlcT1QYXJhbep0cmVzIGRhbnMgbGEgcmVxdep0ZToKK3JlcXVlc3RwYXJhbXMubm8tcGFyYW1zPVBhcyBkZSBwYXJhbep0cmUsIG1lcmNpIGRhbnMgc2Fpc2lyIHF1ZWxxdSd1bnMKK3JlcXVlc3RwYXJhbXMuZmlyc3RuYW1lPVBy6W5vbToKK3JlcXVlc3RwYXJhbXMubGFzdG5hbWU9Tm9tOgorCitjb29raWVzLnRpdGxlPUV4ZW1wbGUgZCcndXRpbGlzYXRpb24gZGUgQ29va2llcworY29va2llcy5jb29raWVzPVZvdHJlIG5hdmlnYXRldXIgcmV0b3VybmUgbGVzIGNvb2tpZXMgc3VpdmFudDoKK2Nvb2tpZXMubm8tY29va2llcz1Wb3RyZSBuYXZpZ2F0ZXVyIG5lIHJldG91cm5lIGF1Y3VuIGNvb2tpZQorY29va2llcy5tYWtlLWNvb2tpZT1DculhdGlvbiBkJyd1biBjb29raWUg4CByZXRvdXJuZXIg4CB2b3RyZSBuYXZpZ2F0ZXVyCitjb29raWVzLm5hbWU9Tm9tOgorY29va2llcy52YWx1ZT1WYWxldXI6Citjb29raWVzLnNldD1Wb3VzIHZlbmV6IGQnJ2Vudm95ZXIgbGUgY29va2llIHN1aXZhbnQg4CB2b3RyZSBuYXZpZ2F0ZXVyOgorCitzZXNzaW9ucy50aXRsZT1FeGVtcGxlIGRlIFNlc3Npb25zCitzZXNzaW9ucy5pZD1JRCBkZSBTZXNzaW9uOgorc2Vzc2lvbnMuY3JlYXRlZD1DcullIGxlOgorc2Vzc2lvbnMubGFzdGFjY2Vzc2VkPURlcm5pZXIgYWNj6HM6CitzZXNzaW9ucy5kYXRhPUxlcyBkb25u6WVzIGV4aXN0YW50ZXMgZGFucyB2b3RyZSBzZXNzaW9uOgorc2Vzc2lvbnMuYWRkZGF0YT1Bam91dGVyIGRlcyBkb25u6WVzIOAgdm90cmUgc2Vzc2lvbgorc2Vzc2lvbnMuZGF0YW5hbWU9Tm9tIGRlIGwnJ0F0dHJpYnV0IGRlIFNlc3Npb246CitzZXNzaW9ucy5kYXRhdmFsdWU9VmFsZXVyIGRlIGwnJ0F0dHJpYnV0IGRlIFNlc3Npb246CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvTG9jYWxTdHJpbmdzX3B0LnByb3BlcnRpZXMgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvTG9jYWxTdHJpbmdzX3B0LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3ZTkxNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9Mb2NhbFN0cmluZ3NfcHQucHJvcGVydGllcwpAQCAtMCwwICsxLDUzIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgJElkJAorCisjIERlZmF1bHQgbG9jYWxpemVkIHJlc291cmNlcyBmb3IgZXhhbXBsZSBzZXJ2bGV0cworIyBUaGlzIGxvY2FsZSBpcyBwdF9QVAorCitoZWxsb3dvcmxkLnRpdGxlPU9sYSBNdW5kbyEKKworcmVxdWVzdGluZm8udGl0bGU9RXhlbXBsbyBkYSBJbmZvcm1hY2FvIGRvIFBlZGlkbworcmVxdWVzdGluZm8ubGFiZWwubWV0aG9kPU1ldG9kbzoKK3JlcXVlc3RpbmZvLmxhYmVsLnJlcXVlc3R1cmk9VVJJIGRvIFBlZGlkbzoKK3JlcXVlc3RpbmZvLmxhYmVsLnByb3RvY29sPVByb3RvY29sbzoKK3JlcXVlc3RpbmZvLmxhYmVsLnBhdGhpbmZvPUluZm9ybWFjYW8gZG8gQ2FtaW5obzoKK3JlcXVlc3RpbmZvLmxhYmVsLnJlbW90ZWFkZHI9RW5kZXJlY28gUmVtb3RvOgorCityZXF1ZXN0aGVhZGVyLnRpdGxlPUV4ZW1wbG8gZGEgQ2ViZWNlaXJhIGRvIFBlZGlkbworCityZXF1ZXN0cGFyYW1zLnRpdGxlPUV4YW1wbG8gZGUgUGFyYW1ldHJvcyBkbyBQZWRpZG8KK3JlcXVlc3RwYXJhbXMucGFyYW1zLWluLXJlcT1QYXJhbWV0cm9zIG5lc3RlIHBlZGlkbzoKK3JlcXVlc3RwYXJhbXMubm8tcGFyYW1zPVNlbSBQYXJhbWV0cm9zLCBQb3IgZmF2b3IgZW50cmUgYWxndW5zCityZXF1ZXN0cGFyYW1zLmZpcnN0bmFtZT1QcmltZWlybyBOb21lOgorcmVxdWVzdHBhcmFtcy5sYXN0bmFtZT1BcGVsaWRvOgorCitjb29raWVzLnRpdGxlPUNFeGFtcGxvIGRlIENvb2tpZXMKK2Nvb2tpZXMuY29va2llcz1PIHNlIGJyb3dzZXIgZXN0YSBhIGVudmlhciBvcyBzZWd1aW50ZXMgY29va2llczoKK2Nvb2tpZXMubm8tY29va2llcz1PIHNldSBicm93c2VyIG5hbyBlc3RhIGEgZW52aWFyIG5lbmh1bnMgY29va2llcworY29va2llcy5tYWtlLWNvb2tpZT1DcmllIHVtIGNvb2tpZSBwYXJhIGVudmlhciBwYXJhIG8gc2V1IGJyb3dzZXIKK2Nvb2tpZXMubmFtZT1Ob21lOgorY29va2llcy52YWx1ZT1WYWxvcjoKK2Nvb2tpZXMuc2V0PUFjYWJvdSBkZSBlbnZpYXIgbyBzZWd1aW50ZSBjb29raWUgcGFyYSBvIHNldSBicm93c2VyOgorCitzZXNzaW9ucy50aXRsZT1FeGFtcGxvIGRlIHNlc3NvZXMKK3Nlc3Npb25zLmlkPUlkZW50aWZpY2Fkb3IgZGEgU2Vzc2FvOgorc2Vzc2lvbnMuY3JlYXRlZD1DcmlhZGE6CitzZXNzaW9ucy5sYXN0YWNjZXNzZWQ9VWx0aW1hIHZleiBhY2VkaWRhOgorc2Vzc2lvbnMuZGF0YT1PcyBzZWd1aW50ZXMgZGFkb3MgZmF6ZW0gcGFydGUgZGEgc3VhIHNlc3NhbzoKK3Nlc3Npb25zLmFkZGRhdGE9QWRpY2lvbmUgZGF0YSBhIHN1YSBzZXNzYW8KK3Nlc3Npb25zLmRhdGFuYW1lPU5vbWUgZG8gYXRyaWJ1dG8gZGEgc2Vzc2FvOgorc2Vzc2lvbnMuZGF0YXZhbHVlPVZhbG9yIGRvIGF0cmlidXRvIGRhIFNlc3NhbzoKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9SZXF1ZXN0SGVhZGVyRXhhbXBsZS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL1JlcXVlc3RIZWFkZXJFeGFtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlOGIwYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9SZXF1ZXN0SGVhZGVyRXhhbXBsZS5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLyogJElkJAorICoKKyAqLworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudGV4dC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworaW1wb3J0IHV0aWwuSFRNTEZpbHRlcjsKKworLyoqCisgKiBFeGFtcGxlIHNlcnZsZXQgc2hvd2luZyByZXF1ZXN0IGhlYWRlcnMKKyAqCisgKiBAYXV0aG9yIEphbWVzIER1bmNhbiBEYXZpZHNvbiA8ZHVuY2FuQGVuZy5zdW4uY29tPgorICovCisKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0SGVhZGVyRXhhbXBsZSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIFJlc291cmNlQnVuZGxlIHJiID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJMb2NhbFN0cmluZ3MiKTsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKKworICAgICAgICBQcmludFdyaXRlciBvdXQgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxodG1sPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGJvZHkgYmdjb2xvcj1cIndoaXRlXCI+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8aGVhZD4iKTsKKworICAgICAgICBTdHJpbmcgdGl0bGUgPSByYi5nZXRTdHJpbmcoInJlcXVlc3RoZWFkZXIudGl0bGUiKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjx0aXRsZT4iICsgdGl0bGUgKyAiPC90aXRsZT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvaGVhZD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxib2R5PiIpOworCisJLy8gYWxsIGxpbmtzIHJlbGF0aXZlCisKKyAgICAgICAgLy8gWFhYCisgICAgICAgIC8vIG1ha2luZyB0aGVzZSBhYnNvbHV0ZSB0aWxsIHdlIHdvcmsgb3V0IHRoZQorICAgICAgICAvLyBhZGRpdGlvbiBvZiBhIFBhdGhJbmZvIGlzc3VlIAorCQorICAgICAgICBvdXQucHJpbnRsbigiPGEgaHJlZj1cIi4uL3JlcWhlYWRlcnMuaHRtbFwiPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGltZyBzcmM9XCIuLi9pbWFnZXMvY29kZS5naWZcIiBoZWlnaHQ9MjQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aWR0aD0yNCBhbGlnbj1yaWdodCBib3JkZXI9MCBhbHQ9XCJ2aWV3IGNvZGVcIj48L2E+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8YSBocmVmPVwiLi4vaW5kZXguaHRtbFwiPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGltZyBzcmM9XCIuLi9pbWFnZXMvcmV0dXJuLmdpZlwiIGhlaWdodD0yNCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpZHRoPTI0IGFsaWduPXJpZ2h0IGJvcmRlcj0wIGFsdD1cInJldHVyblwiPjwvYT4iKTsKKworICAgICAgICBvdXQucHJpbnRsbigiPGgzPiIgKyB0aXRsZSArICI8L2gzPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPHRhYmxlIGJvcmRlcj0wPiIpOworICAgICAgICBFbnVtZXJhdGlvbiBlID0gcmVxdWVzdC5nZXRIZWFkZXJOYW1lcygpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGhlYWRlck5hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIFN0cmluZyBoZWFkZXJWYWx1ZSA9IHJlcXVlc3QuZ2V0SGVhZGVyKGhlYWRlck5hbWUpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjx0cj48dGQgYmdjb2xvcj1cIiNDQ0NDQ0NcIj4iKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKEhUTUxGaWx0ZXIuZmlsdGVyKGhlYWRlck5hbWUpKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8L3RkPjx0ZD4iKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKEhUTUxGaWx0ZXIuZmlsdGVyKGhlYWRlclZhbHVlKSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiPC90ZD48L3RyPiIpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludGxuKCI8L3RhYmxlPiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRvR2V0KHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL1JlcXVlc3RJbmZvRXhhbXBsZS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL1JlcXVlc3RJbmZvRXhhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNzY4YjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvUmVxdWVzdEluZm9FeGFtcGxlLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLyogJElkJAorICoKKyAqLworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudGV4dC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworaW1wb3J0IHV0aWwuSFRNTEZpbHRlcjsKKworLyoqCisgKiBFeGFtcGxlIHNlcnZsZXQgc2hvd2luZyByZXF1ZXN0IGluZm9ybWF0aW9uLgorICoKKyAqIEBhdXRob3IgSmFtZXMgRHVuY2FuIERhdmlkc29uIDxkdW5jYW5AZW5nLnN1bi5jb20+CisgKi8KKworcHVibGljIGNsYXNzIFJlcXVlc3RJbmZvRXhhbXBsZSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgUmVzb3VyY2VCdW5kbGUgcmIgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIkxvY2FsU3RyaW5ncyIpOworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7CisKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIG91dC5wcmludGxuKCI8aHRtbD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxib2R5PiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGhlYWQ+Iik7CisKKyAgICAgICAgU3RyaW5nIHRpdGxlID0gcmIuZ2V0U3RyaW5nKCJyZXF1ZXN0aW5mby50aXRsZSIpOworICAgICAgICBvdXQucHJpbnRsbigiPHRpdGxlPiIgKyB0aXRsZSArICI8L3RpdGxlPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPC9oZWFkPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGJvZHkgYmdjb2xvcj1cIndoaXRlXCI+Iik7CisKKyAgICAgICAgLy8gaW1nIHN0dWZmIG5vdCByZXEnZCBmb3Igc291cmNlIGNvZGUgaHRtbCBzaG93aW5nCisJLy8gYWxsIGxpbmtzIHJlbGF0aXZlIQorCisgICAgICAgIC8vIFhYWAorICAgICAgICAvLyBtYWtpbmcgdGhlc2UgYWJzb2x1dGUgdGlsbCB3ZSB3b3JrIG91dCB0aGUKKyAgICAgICAgLy8gYWRkaXRpb24gb2YgYSBQYXRoSW5mbyBpc3N1ZQorCQorICAgICAgICBvdXQucHJpbnRsbigiPGEgaHJlZj1cIi4uL3JlcWluZm8uaHRtbFwiPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGltZyBzcmM9XCIuLi9pbWFnZXMvY29kZS5naWZcIiBoZWlnaHQ9MjQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aWR0aD0yNCBhbGlnbj1yaWdodCBib3JkZXI9MCBhbHQ9XCJ2aWV3IGNvZGVcIj48L2E+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8YSBocmVmPVwiLi4vaW5kZXguaHRtbFwiPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGltZyBzcmM9XCIuLi9pbWFnZXMvcmV0dXJuLmdpZlwiIGhlaWdodD0yNCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpZHRoPTI0IGFsaWduPXJpZ2h0IGJvcmRlcj0wIGFsdD1cInJldHVyblwiPjwvYT4iKTsKKworICAgICAgICBvdXQucHJpbnRsbigiPGgzPiIgKyB0aXRsZSArICI8L2gzPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPHRhYmxlIGJvcmRlcj0wPjx0cj48dGQ+Iik7CisgICAgICAgIG91dC5wcmludGxuKHJiLmdldFN0cmluZygicmVxdWVzdGluZm8ubGFiZWwubWV0aG9kIikpOworICAgICAgICBvdXQucHJpbnRsbigiPC90ZD48dGQ+Iik7CisgICAgICAgIG91dC5wcmludGxuKHJlcXVlc3QuZ2V0TWV0aG9kKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPC90ZD48L3RyPjx0cj48dGQ+Iik7CisgICAgICAgIG91dC5wcmludGxuKHJiLmdldFN0cmluZygicmVxdWVzdGluZm8ubGFiZWwucmVxdWVzdHVyaSIpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvdGQ+PHRkPiIpOyAgICAgICAgCisgICAgICAgIG91dC5wcmludGxuKEhUTUxGaWx0ZXIuZmlsdGVyKHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8L3RkPjwvdHI+PHRyPjx0ZD4iKTsgICAgICAgIAorICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInJlcXVlc3RpbmZvLmxhYmVsLnByb3RvY29sIikpOworICAgICAgICBvdXQucHJpbnRsbigiPC90ZD48dGQ+Iik7ICAgICAgICAKKyAgICAgICAgb3V0LnByaW50bG4ocmVxdWVzdC5nZXRQcm90b2NvbCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvdGQ+PC90cj48dHI+PHRkPiIpOworICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInJlcXVlc3RpbmZvLmxhYmVsLnBhdGhpbmZvIikpOworICAgICAgICBvdXQucHJpbnRsbigiPC90ZD48dGQ+Iik7ICAgICAgICAKKyAgICAgICAgb3V0LnByaW50bG4oSFRNTEZpbHRlci5maWx0ZXIocmVxdWVzdC5nZXRQYXRoSW5mbygpKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8L3RkPjwvdHI+PHRyPjx0ZD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4ocmIuZ2V0U3RyaW5nKCJyZXF1ZXN0aW5mby5sYWJlbC5yZW1vdGVhZGRyIikpOworCisgCVN0cmluZyBjaXBoZXJTdWl0ZT0KKyAJICAgIChTdHJpbmcpcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQucmVxdWVzdC5jaXBoZXJfc3VpdGUiKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvdGQ+PHRkPiIpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgb3V0LnByaW50bG4ocmVxdWVzdC5nZXRSZW1vdGVBZGRyKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPC90YWJsZT4iKTsKKworIAlpZihjaXBoZXJTdWl0ZSE9bnVsbCl7CisgCSAgICBvdXQucHJpbnRsbigiPC90ZD48L3RyPjx0cj48dGQ+Iik7CQorIAkgICAgb3V0LnByaW50bG4oIlNTTENpcGhlclN1aXRlOiIpOworIAkgICAgb3V0LnByaW50bG4oIjwvdGQ+Iik7CisgCSAgICBvdXQucHJpbnRsbigiPHRkPiIpOwkgICAgCisgCSAgICBvdXQucHJpbnRsbihyZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5yZXF1ZXN0LmNpcGhlcl9zdWl0ZSIpKTsKKwkgICAgb3V0LnByaW50bG4oIjwvdGQ+Iik7CSAgICAKKyAJfQorCQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRvR2V0KHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL1JlcXVlc3RQYXJhbUV4YW1wbGUuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9SZXF1ZXN0UGFyYW1FeGFtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkM2MzYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9SZXF1ZXN0UGFyYW1FeGFtcGxlLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLyogJElkJAorICoKKyAqLworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudGV4dC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworaW1wb3J0IHV0aWwuSFRNTEZpbHRlcjsKKworLyoqCisgKiBFeGFtcGxlIHNlcnZsZXQgc2hvd2luZyByZXF1ZXN0IGhlYWRlcnMKKyAqCisgKiBAYXV0aG9yIEphbWVzIER1bmNhbiBEYXZpZHNvbiA8ZHVuY2FuQGVuZy5zdW4uY29tPgorICovCisKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0UGFyYW1FeGFtcGxlIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBSZXNvdXJjZUJ1bmRsZSByYiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiTG9jYWxTdHJpbmdzIik7CisgICAgCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7CisKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIG91dC5wcmludGxuKCI8aHRtbD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxib2R5PiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGhlYWQ+Iik7CisKKyAgICAgICAgU3RyaW5nIHRpdGxlID0gcmIuZ2V0U3RyaW5nKCJyZXF1ZXN0cGFyYW1zLnRpdGxlIik7CisgICAgICAgIG91dC5wcmludGxuKCI8dGl0bGU+IiArIHRpdGxlICsgIjwvdGl0bGU+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8L2hlYWQ+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8Ym9keSBiZ2NvbG9yPVwid2hpdGVcIj4iKTsKKworICAgICAgICAvLyBpbWcgc3R1ZmYgbm90IHJlcSdkIGZvciBzb3VyY2UgY29kZSBodG1sIHNob3dpbmcKKworCS8vIGFsbCBsaW5rcyByZWxhdGl2ZQorCisgICAgICAgIC8vIFhYWAorICAgICAgICAvLyBtYWtpbmcgdGhlc2UgYWJzb2x1dGUgdGlsbCB3ZSB3b3JrIG91dCB0aGUKKyAgICAgICAgLy8gYWRkaXRpb24gb2YgYSBQYXRoSW5mbyBpc3N1ZSAKKwkKKyAgICAgICAgb3V0LnByaW50bG4oIjxhIGhyZWY9XCIuLi9yZXFwYXJhbXMuaHRtbFwiPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGltZyBzcmM9XCIuLi9pbWFnZXMvY29kZS5naWZcIiBoZWlnaHQ9MjQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aWR0aD0yNCBhbGlnbj1yaWdodCBib3JkZXI9MCBhbHQ9XCJ2aWV3IGNvZGVcIj48L2E+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8YSBocmVmPVwiLi4vaW5kZXguaHRtbFwiPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGltZyBzcmM9XCIuLi9pbWFnZXMvcmV0dXJuLmdpZlwiIGhlaWdodD0yNCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpZHRoPTI0IGFsaWduPXJpZ2h0IGJvcmRlcj0wIGFsdD1cInJldHVyblwiPjwvYT4iKTsKKworICAgICAgICBvdXQucHJpbnRsbigiPGgzPiIgKyB0aXRsZSArICI8L2gzPiIpOworICAgICAgICBTdHJpbmcgZmlyc3ROYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImZpcnN0bmFtZSIpOworICAgICAgICBTdHJpbmcgbGFzdE5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigibGFzdG5hbWUiKTsKKyAgICAgICAgb3V0LnByaW50bG4ocmIuZ2V0U3RyaW5nKCJyZXF1ZXN0cGFyYW1zLnBhcmFtcy1pbi1yZXEiKSArICI8YnI+Iik7CisgICAgICAgIGlmIChmaXJzdE5hbWUgIT0gbnVsbCB8fCBsYXN0TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInJlcXVlc3RwYXJhbXMuZmlyc3RuYW1lIikpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIiA9ICIgKyBIVE1MRmlsdGVyLmZpbHRlcihmaXJzdE5hbWUpICsgIjxicj4iKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKHJiLmdldFN0cmluZygicmVxdWVzdHBhcmFtcy5sYXN0bmFtZSIpKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIgPSAiICsgSFRNTEZpbHRlci5maWx0ZXIobGFzdE5hbWUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKHJiLmdldFN0cmluZygicmVxdWVzdHBhcmFtcy5uby1wYXJhbXMiKSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIjxQPiIpOworICAgICAgICBvdXQucHJpbnQoIjxmb3JtIGFjdGlvbj1cIiIpOworICAgICAgICBvdXQucHJpbnQoIlJlcXVlc3RQYXJhbUV4YW1wbGVcIiAiKTsKKyAgICAgICAgb3V0LnByaW50bG4oIm1ldGhvZD1QT1NUPiIpOworICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInJlcXVlc3RwYXJhbXMuZmlyc3RuYW1lIikpOworICAgICAgICBvdXQucHJpbnRsbigiPGlucHV0IHR5cGU9dGV4dCBzaXplPTIwIG5hbWU9Zmlyc3RuYW1lPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGJyPiIpOworICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInJlcXVlc3RwYXJhbXMubGFzdG5hbWUiKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8aW5wdXQgdHlwZT10ZXh0IHNpemU9MjAgbmFtZT1sYXN0bmFtZT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxicj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbnB1dCB0eXBlPXN1Ym1pdD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvZm9ybT4iKTsKKworICAgICAgICBvdXQucHJpbnRsbigiPC9ib2R5PiIpOworICAgICAgICBvdXQucHJpbnRsbigiPC9odG1sPiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRvR2V0KHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9TZXNzaW9uRXhhbXBsZS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL1Nlc3Npb25FeGFtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0Yzk0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9TZXNzaW9uRXhhbXBsZS5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy8qICRJZCQKKyAqCisgKi8KKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnRleHQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKK2ltcG9ydCB1dGlsLkhUTUxGaWx0ZXI7CisKKy8qKgorICogRXhhbXBsZSBzZXJ2bGV0IHNob3dpbmcgcmVxdWVzdCBoZWFkZXJzCisgKgorICogQGF1dGhvciBKYW1lcyBEdW5jYW4gRGF2aWRzb24gPGR1bmNhbkBlbmcuc3VuLmNvbT4KKyAqLworCitwdWJsaWMgY2xhc3MgU2Vzc2lvbkV4YW1wbGUgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBSZXNvdXJjZUJ1bmRsZSByYiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiTG9jYWxTdHJpbmdzIik7CisgICAgCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7CisKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIG91dC5wcmludGxuKCI8aHRtbD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxib2R5IGJnY29sb3I9XCJ3aGl0ZVwiPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGhlYWQ+Iik7CisKKyAgICAgICAgU3RyaW5nIHRpdGxlID0gcmIuZ2V0U3RyaW5nKCJzZXNzaW9ucy50aXRsZSIpOworICAgICAgICBvdXQucHJpbnRsbigiPHRpdGxlPiIgKyB0aXRsZSArICI8L3RpdGxlPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPC9oZWFkPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGJvZHk+Iik7CisKKyAgICAgICAgLy8gaW1nIHN0dWZmIG5vdCByZXEnZCBmb3Igc291cmNlIGNvZGUgaHRtbCBzaG93aW5nCisJLy8gcmVsYXRpdmUgbGlua3MgZXZlcnl3aGVyZSEKKworICAgICAgICAvLyBYWFgKKyAgICAgICAgLy8gbWFraW5nIHRoZXNlIGFic29sdXRlIHRpbGwgd2Ugd29yayBvdXQgdGhlCisgICAgICAgIC8vIGFkZGl0aW9uIG9mIGEgUGF0aEluZm8gaXNzdWUgCisJCisgICAgICAgIG91dC5wcmludGxuKCI8YSBocmVmPVwiLi4vc2Vzc2lvbnMuaHRtbFwiPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGltZyBzcmM9XCIuLi9pbWFnZXMvY29kZS5naWZcIiBoZWlnaHQ9MjQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aWR0aD0yNCBhbGlnbj1yaWdodCBib3JkZXI9MCBhbHQ9XCJ2aWV3IGNvZGVcIj48L2E+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8YSBocmVmPVwiLi4vaW5kZXguaHRtbFwiPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGltZyBzcmM9XCIuLi9pbWFnZXMvcmV0dXJuLmdpZlwiIGhlaWdodD0yNCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpZHRoPTI0IGFsaWduPXJpZ2h0IGJvcmRlcj0wIGFsdD1cInJldHVyblwiPjwvYT4iKTsKKworICAgICAgICBvdXQucHJpbnRsbigiPGgzPiIgKyB0aXRsZSArICI8L2gzPiIpOworCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24odHJ1ZSk7CisgICAgICAgIG91dC5wcmludGxuKHJiLmdldFN0cmluZygic2Vzc2lvbnMuaWQiKSArICIgIiArIHNlc3Npb24uZ2V0SWQoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8YnI+Iik7CisgICAgICAgIG91dC5wcmludGxuKHJiLmdldFN0cmluZygic2Vzc2lvbnMuY3JlYXRlZCIpICsgIiAiKTsKKyAgICAgICAgb3V0LnByaW50bG4obmV3IERhdGUoc2Vzc2lvbi5nZXRDcmVhdGlvblRpbWUoKSkgKyAiPGJyPiIpOworICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInNlc3Npb25zLmxhc3RhY2Nlc3NlZCIpICsgIiAiKTsKKyAgICAgICAgb3V0LnByaW50bG4obmV3IERhdGUoc2Vzc2lvbi5nZXRMYXN0QWNjZXNzZWRUaW1lKCkpKTsKKworICAgICAgICBTdHJpbmcgZGF0YU5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiZGF0YW5hbWUiKTsKKyAgICAgICAgU3RyaW5nIGRhdGFWYWx1ZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhdmFsdWUiKTsKKyAgICAgICAgaWYgKGRhdGFOYW1lICE9IG51bGwgJiYgZGF0YVZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKGRhdGFOYW1lLCBkYXRhVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgb3V0LnByaW50bG4oIjxQPiIpOworICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInNlc3Npb25zLmRhdGEiKSArICI8YnI+Iik7CisgICAgICAgIEVudW1lcmF0aW9uIG5hbWVzID0gc2Vzc2lvbi5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgICAgICB3aGlsZSAobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMubmV4dEVsZW1lbnQoKTsgCisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBzZXNzaW9uLmdldEF0dHJpYnV0ZShuYW1lKS50b1N0cmluZygpOworICAgICAgICAgICAgb3V0LnByaW50bG4oSFRNTEZpbHRlci5maWx0ZXIobmFtZSkgKyAiID0gIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgSFRNTEZpbHRlci5maWx0ZXIodmFsdWUpICsgIjxicj4iKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dC5wcmludGxuKCI8UD4iKTsKKyAgICAgICAgb3V0LnByaW50KCI8Zm9ybSBhY3Rpb249XCIiKTsKKwlvdXQucHJpbnQocmVzcG9uc2UuZW5jb2RlVVJMKCJTZXNzaW9uRXhhbXBsZSIpKTsKKyAgICAgICAgb3V0LnByaW50KCJcIiAiKTsKKyAgICAgICAgb3V0LnByaW50bG4oIm1ldGhvZD1QT1NUPiIpOworICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInNlc3Npb25zLmRhdGFuYW1lIikpOworICAgICAgICBvdXQucHJpbnRsbigiPGlucHV0IHR5cGU9dGV4dCBzaXplPTIwIG5hbWU9ZGF0YW5hbWU+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8YnI+Iik7CisgICAgICAgIG91dC5wcmludGxuKHJiLmdldFN0cmluZygic2Vzc2lvbnMuZGF0YXZhbHVlIikpOworICAgICAgICBvdXQucHJpbnRsbigiPGlucHV0IHR5cGU9dGV4dCBzaXplPTIwIG5hbWU9ZGF0YXZhbHVlPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGJyPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGlucHV0IHR5cGU9c3VibWl0PiIpOworICAgICAgICBvdXQucHJpbnRsbigiPC9mb3JtPiIpOworCisgICAgICAgIG91dC5wcmludGxuKCI8UD5HRVQgYmFzZWQgZm9ybTo8YnI+Iik7CisgICAgICAgIG91dC5wcmludCgiPGZvcm0gYWN0aW9uPVwiIik7CisJb3V0LnByaW50KHJlc3BvbnNlLmVuY29kZVVSTCgiU2Vzc2lvbkV4YW1wbGUiKSk7CisgICAgICAgIG91dC5wcmludCgiXCIgIik7CisgICAgICAgIG91dC5wcmludGxuKCJtZXRob2Q9R0VUPiIpOworICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInNlc3Npb25zLmRhdGFuYW1lIikpOworICAgICAgICBvdXQucHJpbnRsbigiPGlucHV0IHR5cGU9dGV4dCBzaXplPTIwIG5hbWU9ZGF0YW5hbWU+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8YnI+Iik7CisgICAgICAgIG91dC5wcmludGxuKHJiLmdldFN0cmluZygic2Vzc2lvbnMuZGF0YXZhbHVlIikpOworICAgICAgICBvdXQucHJpbnRsbigiPGlucHV0IHR5cGU9dGV4dCBzaXplPTIwIG5hbWU9ZGF0YXZhbHVlPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGJyPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGlucHV0IHR5cGU9c3VibWl0PiIpOworICAgICAgICBvdXQucHJpbnRsbigiPC9mb3JtPiIpOworCisgICAgICAgIG91dC5wcmludCgiPHA+PGEgaHJlZj1cIiIpOworCW91dC5wcmludChyZXNwb25zZS5lbmNvZGVVUkwoIlNlc3Npb25FeGFtcGxlP2RhdGFuYW1lPWZvbyZkYXRhdmFsdWU9YmFyIikpOworCW91dC5wcmludGxuKCJcIiA+VVJMIGVuY29kZWQgPC9hPiIpOworCQorICAgICAgICBvdXQucHJpbnRsbigiPC9ib2R5PiIpOworICAgICAgICBvdXQucHJpbnRsbigiPC9odG1sPiIpOworICAgICAgICAKKyAgICAgICAgb3V0LnByaW50bG4oIjwvYm9keT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvaHRtbD4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICBkb0dldChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY29tcHJlc3Npb25GaWx0ZXJzL0NvbXByZXNzaW9uRmlsdGVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY29tcHJlc3Npb25GaWx0ZXJzL0NvbXByZXNzaW9uRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc3NDg3YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb21wcmVzc2lvbkZpbHRlcnMvQ29tcHJlc3Npb25GaWx0ZXIuamF2YQpAQCAtMCwwICsxLDIxOSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgY29tcHJlc3Npb25GaWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgPGNvZGU+amF2YXguc2VydmxldC5GaWx0ZXI8L2NvZGU+IHVzZWQgdG8gY29tcHJlc3MKKyAqIHRoZSBTZXJ2bGV0UmVzcG9uc2UgaWYgaXQgaXMgYmlnZ2VyIHRoYW4gYSB0aHJlc2hvbGQuCisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAYXV0aG9yIERtaXRyaSBWYWxkaW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb21wcmVzc2lvbkZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcnsKKworICAgIC8qKgorICAgICAqIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3Qgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aC4gIElmIHRoaXMgdmFsdWUKKyAgICAgKiBpcyBudWxsLCB0aGlzIGZpbHRlciBpbnN0YW5jZSBpcyBub3QgY3VycmVudGx5IGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWx0ZXJDb25maWcgY29uZmlnID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIE1pbmltYWwgcmVhc29uYWJsZSB0aHJlc2hvbGQKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtaW5UaHJlc2hvbGQgPSAxMjg7CisKKworICAgIC8qKgorICAgICAqIFRoZSB0aHJlc2hvbGQgbnVtYmVyIHRvIGNvbXByZXNzCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBjb21wcmVzc2lvblRocmVzaG9sZDsKKworICAgIC8qKgorICAgICAqIERlYnVnIGxldmVsIGZvciB0aGlzIGZpbHRlcgorICAgICAqLworICAgIHByaXZhdGUgaW50IGRlYnVnID0gMDsKKworICAgIC8qKgorICAgICAqIFBsYWNlIHRoaXMgZmlsdGVyIGludG8gc2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJDb25maWcgVGhlIGZpbHRlciBjb25maWd1cmF0aW9uIG9iamVjdAorICAgICAqLworCisgICAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB7CisKKyAgICAgICAgY29uZmlnID0gZmlsdGVyQ29uZmlnOworICAgICAgICBpZiAoZmlsdGVyQ29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGZpbHRlckNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJkZWJ1ZyIpOworICAgICAgICAgICAgaWYgKHZhbHVlIT1udWxsKSB7CisgICAgICAgICAgICAgICAgZGVidWcgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVidWcgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHN0ciA9IGZpbHRlckNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJjb21wcmVzc2lvblRocmVzaG9sZCIpOworICAgICAgICAgICAgaWYgKHN0ciE9bnVsbCkgeworICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uVGhyZXNob2xkID0gSW50ZWdlci5wYXJzZUludChzdHIpOworICAgICAgICAgICAgICAgIGlmIChjb21wcmVzc2lvblRocmVzaG9sZCAhPSAwICYmIGNvbXByZXNzaW9uVGhyZXNob2xkIDwgbWluVGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY29tcHJlc3Npb25UaHJlc2hvbGQgc2hvdWxkIGJlIGVpdGhlciAwIC0gbm8gY29tcHJlc3Npb24gb3IgPj0gIiArIG1pblRocmVzaG9sZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNvbXByZXNzaW9uVGhyZXNob2xkIHNldCB0byAiICsgbWluVGhyZXNob2xkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblRocmVzaG9sZCA9IG1pblRocmVzaG9sZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uVGhyZXNob2xkID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29tcHJlc3Npb25UaHJlc2hvbGQgPSAwOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFRha2UgdGhpcyBmaWx0ZXIgb3V0IG9mIHNlcnZpY2UuCisgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworCisgICAgICAgIHRoaXMuY29uZmlnID0gbnVsbDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5kb0ZpbHRlcjwvY29kZT4gbWV0aG9kIG9mIHRoZSBGaWx0ZXIgaXMgY2FsbGVkIGJ5IHRoZSBjb250YWluZXIKKyAgICAgKiBlYWNoIHRpbWUgYSByZXF1ZXN0L3Jlc3BvbnNlIHBhaXIgaXMgcGFzc2VkIHRocm91Z2ggdGhlIGNoYWluIGR1ZQorICAgICAqIHRvIGEgY2xpZW50IHJlcXVlc3QgZm9yIGEgcmVzb3VyY2UgYXQgdGhlIGVuZCBvZiB0aGUgY2hhaW4uCisgICAgICogVGhlIEZpbHRlckNoYWluIHBhc3NlZCBpbnRvIHRoaXMgbWV0aG9kIGFsbG93cyB0aGUgRmlsdGVyIHRvIHBhc3Mgb24gdGhlCisgICAgICogcmVxdWVzdCBhbmQgcmVzcG9uc2UgdG8gdGhlIG5leHQgZW50aXR5IGluIHRoZSBjaGFpbi48cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBmaXJzdCBleGFtaW5lcyB0aGUgcmVxdWVzdCB0byBjaGVjayB3aGV0aGVyIHRoZSBjbGllbnQgc3VwcG9ydAorICAgICAqIGNvbXByZXNzaW9uLiA8YnI+CisgICAgICogSXQgc2ltcGx5IGp1c3QgcGFzcyB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgaWYgdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IKKyAgICAgKiBjb21wcmVzc2lvbi48YnI+CisgICAgICogSWYgdGhlIGNvbXByZXNzaW9uIHN1cHBvcnQgaXMgYXZhaWxhYmxlLCBpdCBjcmVhdGVzIGEKKyAgICAgKiBDb21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIgb2JqZWN0IHdoaWNoIGNvbXByZXNzZXMgdGhlIGNvbnRlbnQgYW5kCisgICAgICogbW9kaWZpZXMgdGhlIGhlYWRlciBpZiB0aGUgY29udGVudCBsZW5ndGggaXMgYmlnIGVub3VnaC4KKyAgICAgKiBJdCB0aGVuIGludm9rZXMgdGhlIG5leHQgZW50aXR5IGluIHRoZSBjaGFpbiB1c2luZyB0aGUgRmlsdGVyQ2hhaW4gb2JqZWN0CisgICAgICogKDxjb2RlPmNoYWluLmRvRmlsdGVyKCk8L2NvZGU+KSwgPGJyPgorICAgICAqKi8KKworICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyICggU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyQ2hhaW4gY2hhaW4gKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIGlmIChkZWJ1ZyA+IDApIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQGRvRmlsdGVyIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29tcHJlc3Npb25UaHJlc2hvbGQgPT0gMCkgeworICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZG9GaWx0ZXIgZ2V0cyBjYWxsZWQsIGJ1dCBjb21wcmVzc2lvblRyZXNob2xkIGlzIHNldCB0byAwIC0gbm8gY29tcHJlc3Npb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gc3VwcG9ydENvbXByZXNzaW9uID0gZmFsc2U7CisgICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXF1ZXN0KSB7CisgICAgICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZXF1ZXN0VVJJID0gIiArICgoSHR0cFNlcnZsZXRSZXF1ZXN0KXJlcXVlc3QpLmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFyZSB3ZSBhbGxvd2VkIHRvIGNvbXByZXNzID8KKyAgICAgICAgICAgIFN0cmluZyBzID0gKFN0cmluZykgKChIdHRwU2VydmxldFJlcXVlc3QpcmVxdWVzdCkuZ2V0UGFyYW1ldGVyKCJnemlwIik7CisgICAgICAgICAgICBpZiAoImZhbHNlIi5lcXVhbHMocykpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ290IHBhcmFtZXRlciBnemlwPWZhbHNlIC0tPiBkb24ndCBjb21wcmVzcywganVzdCBjaGFpbiBmaWx0ZXIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9CisgICAgICAgICAgICAgICAgKChIdHRwU2VydmxldFJlcXVlc3QpcmVxdWVzdCkuZ2V0SGVhZGVycygiQWNjZXB0LUVuY29kaW5nIik7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZigiZ3ppcCIpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3VwcG9ydHMgY29tcHJlc3Npb24iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0Q29tcHJlc3Npb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibm8gc3VwcG9ydCBmb3IgY29tcHJlc2lvbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdXBwb3J0Q29tcHJlc3Npb24pIHsKKyAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDApIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRvRmlsdGVyIGdldHMgY2FsbGVkIHdvIGNvbXByZXNzaW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgQ29tcHJlc3Npb25TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIHdyYXBwZWRSZXNwb25zZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIHdyYXBwZWRSZXNwb25zZS5zZXREZWJ1Z0xldmVsKGRlYnVnKTsKKyAgICAgICAgICAgICAgICB3cmFwcGVkUmVzcG9uc2Uuc2V0Q29tcHJlc3Npb25UaHJlc2hvbGQoY29tcHJlc3Npb25UaHJlc2hvbGQpOworICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkb0ZpbHRlciBnZXRzIGNhbGxlZCB3aXRoIGNvbXByZXNzaW9uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHdyYXBwZWRSZXNwb25zZSk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgd3JhcHBlZFJlc3BvbnNlLmZpbmlzaFJlc3BvbnNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBmaWx0ZXIgY29uZmlnCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGluaXQuIFJlcXVpcmVkIGJ5IFdlYmxvZ2ljIDYuMQorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlckNvbmZpZyBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyQ29uZmlnKEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHsKKyAgICAgICAgaW5pdChmaWx0ZXJDb25maWcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBmaWx0ZXIgY29uZmlnCisgICAgICogUmVxdWlyZWQgYnkgV2VibG9naWMgNi4xCisgICAgICovCisgICAgcHVibGljIEZpbHRlckNvbmZpZyBnZXRGaWx0ZXJDb25maWcoKSB7CisgICAgICAgIHJldHVybiBjb25maWc7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb21wcmVzc2lvbkZpbHRlcnMvQ29tcHJlc3Npb25GaWx0ZXJUZXN0U2VydmxldC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvbkZpbHRlclRlc3RTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlYTYzMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb21wcmVzc2lvbkZpbHRlcnMvQ29tcHJlc3Npb25GaWx0ZXJUZXN0U2VydmxldC5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGNvbXByZXNzaW9uRmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBWZXJ5IFNpbXBsZSB0ZXN0IHNlcnZsZXQgdG8gdGVzdCBjb21wcmVzc2lvbiBmaWx0ZXIKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbXByZXNzaW9uRmlsdGVyVGVzdFNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBTZXJ2bGV0T3V0cHV0U3RyZWFtIG91dCA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworCisgICAgICAgIEVudW1lcmF0aW9uIGUgPSAoKEh0dHBTZXJ2bGV0UmVxdWVzdClyZXF1ZXN0KS5nZXRIZWFkZXJzKCJBY2NlcHQtRW5jb2RpbmciKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRsbihuYW1lKTsKKyAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoImd6aXAiKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJnemlwIHN1cHBvcnRlZCAtLSBhYmxlIHRvIGNvbXByZXNzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiZ3ppcCBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIG91dC5wcmludGxuKCJDb21wcmVzc2lvbiBGaWx0ZXIgVGVzdCBTZXJ2bGV0Iik7CisgICAgICAgIG91dC5jbG9zZSgpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY29tcHJlc3Npb25GaWx0ZXJzL0NvbXByZXNzaW9uUmVzcG9uc2VTdHJlYW0uamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb21wcmVzc2lvbkZpbHRlcnMvQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYzAyMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY29tcHJlc3Npb25GaWx0ZXJzL0NvbXByZXNzaW9uUmVzcG9uc2VTdHJlYW0uamF2YQpAQCAtMCwwICsxLDMyNCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGNvbXByZXNzaW9uRmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIDxiPlNlcnZsZXRPdXRwdXRTdHJlYW08L2I+IHRoYXQgd29ya3Mgd2l0aAorICogdGhlIENvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlciBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEBhdXRob3IgRG1pdHJpIFZhbGRpbgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbXByZXNzaW9uUmVzcG9uc2VTdHJlYW0KKyAgICBleHRlbmRzIFNlcnZsZXRPdXRwdXRTdHJlYW0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgc2VydmxldCBvdXRwdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIFJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBhc3NvY2lhdGVkIHJlc3BvbnNlCisgICAgICovCisgICAgcHVibGljIENvbXByZXNzaW9uUmVzcG9uc2VTdHJlYW0oSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9ueworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIGNsb3NlZCA9IGZhbHNlOworICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisgICAgICAgIHRoaXMub3V0cHV0ID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGhyZXNob2xkIG51bWJlciB3aGljaCBkZWNpZGVzIHRvIGNvbXByZXNzIG9yIG5vdC4KKyAgICAgKiBVc2VycyBjYW4gY29uZmlndXJlIGluIHdlYi54bWwgdG8gc2V0IGl0IHRvIGZpdCB0aGVpciBuZWVkcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGNvbXByZXNzaW9uVGhyZXNob2xkID0gMDsKKworICAgIC8qKgorICAgICAqIERlYnVnIGxldmVsCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVidWcgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGJ1ZmZlciB0aHJvdWdoIHdoaWNoIGFsbCBvZiBvdXIgb3V0cHV0IGJ5dGVzIGFyZSBwYXNzZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBidWZmZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgYnVmZmVyQ291bnQgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIHVuZGVybHlpbmcgZ3ppcCBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIHdlIHNob3VsZCB3cml0ZSBkYXRhLgorICAgICAqLworICAgIHByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZ3ppcHN0cmVhbSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhpcyBzdHJlYW0gYmVlbiBjbG9zZWQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGVudCBsZW5ndGggcGFzdCB3aGljaCB3ZSB3aWxsIG5vdCB3cml0ZSwgb3IgLTEgaWYgdGhlcmUgaXMKKyAgICAgKiBubyBkZWZpbmVkIGNvbnRlbnQgbGVuZ3RoLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgbGVuZ3RoID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzcG9uc2Ugd2l0aCB3aGljaCB0aGlzIHNlcnZsZXQgb3V0cHV0IHN0cmVhbSBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB1bmRlcmx5aW5nIHNlcnZrZXQgb3V0cHV0IHN0cmVhbSB0byB3aGljaCB3ZSBzaG91bGQgd3JpdGUgZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2VydmxldE91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFNldCBkZWJ1ZyBsZXZlbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnTGV2ZWwoaW50IGRlYnVnKSB7CisgICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29tcHJlc3Npb25UaHJlc2hvbGQgbnVtYmVyIGFuZCBjcmVhdGUgYnVmZmVyIGZvciB0aGlzIHNpemUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRCdWZmZXIoaW50IHRocmVzaG9sZCkgeworICAgICAgICBjb21wcmVzc2lvblRocmVzaG9sZCA9IHRocmVzaG9sZDsKKyAgICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbY29tcHJlc3Npb25UaHJlc2hvbGRdOworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImJ1ZmZlciBpcyBzZXQgdG8gIitjb21wcmVzc2lvblRocmVzaG9sZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGlzIG91dHB1dCBzdHJlYW0sIGNhdXNpbmcgYW55IGJ1ZmZlcmVkIGRhdGEgdG8gYmUgZmx1c2hlZCBhbmQKKyAgICAgKiBhbnkgZnVydGhlciBvdXRwdXQgZGF0YSB0byB0aHJvdyBhbiBJT0V4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjbG9zZSgpIEAgQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbSIpOworICAgICAgICB9CisgICAgICAgIGlmIChjbG9zZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlRoaXMgb3V0cHV0IHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCIpOworCisgICAgICAgIGlmIChnemlwc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZsdXNoVG9HWmlwKCk7CisgICAgICAgICAgICBnemlwc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICBnemlwc3RyZWFtID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChidWZmZXJDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPiAyKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIm91dHB1dC53cml0ZSgiKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC53cml0ZShidWZmZXIsIDAsIGJ1ZmZlckNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIpIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZShidWZmZXIsIDAsIGJ1ZmZlckNvdW50KTsKKyAgICAgICAgICAgICAgICBidWZmZXJDb3VudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmx1c2ggYW55IGJ1ZmZlcmVkIGRhdGEgZm9yIHRoaXMgb3V0cHV0IHN0cmVhbSwgd2hpY2ggYWxzbyBjYXVzZXMgdGhlCisgICAgICogcmVzcG9uc2UgdG8gYmUgY29tbWl0dGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZsdXNoKCkgQCBDb21wcmVzc2lvblJlc3BvbnNlU3RyZWFtIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsb3NlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgZmx1c2ggYSBjbG9zZWQgb3V0cHV0IHN0cmVhbSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGd6aXBzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgZ3ppcHN0cmVhbS5mbHVzaCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaFRvR1ppcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmbHVzaFRvR1ppcCgpIEAgQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbSIpOworICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXJDb3VudCA+IDApIHsKKyAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZsdXNoaW5nIG91dCB0byBHWmlwU3RyZWFtLCBidWZmZXJDb3VudCA9ICIgKyBidWZmZXJDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZVRvR1ppcChidWZmZXIsIDAsIGJ1ZmZlckNvdW50KTsKKyAgICAgICAgICAgIGJ1ZmZlckNvdW50ID0gMDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIHNwZWNpZmllZCBieXRlIHRvIG91ciBvdXRwdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGIgVGhlIGJ5dGUgdG8gYmUgd3JpdHRlbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ3cml0ZSAiK2IrIiBpbiBDb21wcmVzc2lvblJlc3BvbnNlU3RyZWFtICIpOworICAgICAgICB9CisgICAgICAgIGlmIChjbG9zZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCB3cml0ZSB0byBhIGNsb3NlZCBvdXRwdXQgc3RyZWFtIik7CisKKyAgICAgICAgaWYgKGJ1ZmZlckNvdW50ID49IGJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgICAgICAgIGZsdXNoVG9HWmlwKCk7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXJbYnVmZmVyQ291bnQrK10gPSAoYnl0ZSkgYjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgPGNvZGU+Yi5sZW5ndGg8L2NvZGU+IGJ5dGVzIGZyb20gdGhlIHNwZWNpZmllZCBieXRlIGFycmF5CisgICAgICogdG8gb3VyIG91dHB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiBUaGUgYnl0ZSBhcnJheSB0byBiZSB3cml0dGVuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICB3cml0ZShiLCAwLCBiLmxlbmd0aCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIDxjb2RlPmxlbjwvY29kZT4gYnl0ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJ5dGUgYXJyYXksIHN0YXJ0aW5nCisgICAgICogYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQsIHRvIG91ciBvdXRwdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGIgVGhlIGJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgYnl0ZXMgdG8gYmUgd3JpdHRlbgorICAgICAqIEBwYXJhbSBvZmYgWmVyby1yZWxhdGl2ZSBzdGFydGluZyBvZmZzZXQgb2YgdGhlIGJ5dGVzIHRvIGJlIHdyaXR0ZW4KKyAgICAgKiBAcGFyYW0gbGVuIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ3cml0ZSwgYnVmZmVyQ291bnQgPSAiICsgYnVmZmVyQ291bnQgKyAiIGxlbiA9ICIgKyBsZW4gKyAiIG9mZiA9ICIgKyBvZmYpOworICAgICAgICB9CisgICAgICAgIGlmIChkZWJ1ZyA+IDIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIndyaXRlKCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC53cml0ZShiLCBvZmYsIGxlbik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIikiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbG9zZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCB3cml0ZSB0byBhIGNsb3NlZCBvdXRwdXQgc3RyZWFtIik7CisKKyAgICAgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIENhbiB3ZSB3cml0ZSBpbnRvIGJ1ZmZlciA/CisgICAgICAgIGlmIChsZW4gPD0gKGJ1ZmZlci5sZW5ndGggLSBidWZmZXJDb3VudCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgb2ZmLCBidWZmZXIsIGJ1ZmZlckNvdW50LCBsZW4pOworICAgICAgICAgICAgYnVmZmVyQ291bnQgKz0gbGVuOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSBpbiBidWZmZXIuIEZsdXNoIGl0IC4uLgorICAgICAgICBmbHVzaFRvR1ppcCgpOworCisgICAgICAgIC8vIC4uLiBhbmQgdHJ5IGFnYWluLiBOb3RlLCB0aGF0IGJ1ZmZlckNvdW50ID0gMCBoZXJlICEKKyAgICAgICAgaWYgKGxlbiA8PSAoYnVmZmVyLmxlbmd0aCAtIGJ1ZmZlckNvdW50KSkgeworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShiLCBvZmYsIGJ1ZmZlciwgYnVmZmVyQ291bnQsIGxlbik7CisgICAgICAgICAgICBidWZmZXJDb3VudCArPSBsZW47CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyB3cml0ZSBkaXJlY3QgdG8gZ3ppcAorICAgICAgICB3cml0ZVRvR1ppcChiLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb0daaXAoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ3cml0ZVRvR1ppcCwgbGVuID0gIiArIGxlbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYnVnID4gMikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgid3JpdGVUb0daaXAoIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LndyaXRlKGIsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKSIpOworICAgICAgICB9CisgICAgICAgIGlmIChnemlwc3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm5ldyBHWklQT3V0cHV0U3RyZWFtIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzcG9uc2UuaXNDb21taXR0ZWQoKSkgeworICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlJlc3BvbnNlIGFscmVhZHkgY29tbWl0dGVkLiBVc2luZyBvcmlnaW5hbCBvdXRwdXQgc3RyZWFtIik7CisgICAgICAgICAgICAgICAgZ3ppcHN0cmVhbSA9IG91dHB1dDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiKTsKKyAgICAgICAgICAgICAgICBnemlwc3RyZWFtID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0ob3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBnemlwc3RyZWFtLndyaXRlKGIsIG9mZiwgbGVuKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIHJlc3BvbnNlIHN0cmVhbSBiZWVuIGNsb3NlZD8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjbG9zZWQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmNsb3NlZCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb21wcmVzc2lvbkZpbHRlcnMvQ29tcHJlc3Npb25TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY29tcHJlc3Npb25GaWx0ZXJzL0NvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NDkyMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY29tcHJlc3Npb25GaWx0ZXJzL0NvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgY29tcHJlc3Npb25GaWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgPGI+SHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI8L2I+IHRoYXQgd29ya3Mgd2l0aAorICogdGhlIENvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlU3RyZWFtIGltcGxlbWVudGF0aW9uLi4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEBhdXRob3IgRG1pdHJpIFZhbGRpbgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlciBleHRlbmRzIEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKyAgICAvKioKKyAgICAgKiBDYWxscyB0aGUgcGFyZW50IGNvbnN0cnVjdG9yIHdoaWNoIGNyZWF0ZXMgYSBTZXJ2bGV0UmVzcG9uc2UgYWRhcHRvcgorICAgICAqIHdyYXBwaW5nIHRoZSBnaXZlbiByZXNwb25zZSBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgQ29tcHJlc3Npb25TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgc3VwZXIocmVzcG9uc2UpOworICAgICAgICBvcmlnUmVzcG9uc2UgPSByZXNwb25zZTsKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIgY29uc3RydWN0b3IgZ2V0cyBjYWxsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBPcmlnaW5hbCByZXNwb25zZQorICAgICAqLworCisgICAgcHJvdGVjdGVkIEh0dHBTZXJ2bGV0UmVzcG9uc2Ugb3JpZ1Jlc3BvbnNlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUmVzcG9uc2UgaW1wbGVtZW50YXRpb24uCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIkNvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlciI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgU2VydmxldE91dHB1dFN0cmVhbSB0aGF0IGhhcyBiZWVuIHJldHVybmVkIGJ5CisgICAgICogPGNvZGU+Z2V0T3V0cHV0U3RyZWFtKCk8L2NvZGU+LCBpZiBhbnkuCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgU2VydmxldE91dHB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgUHJpbnRXcml0ZXIgdGhhdCBoYXMgYmVlbiByZXR1cm5lZCBieQorICAgICAqIDxjb2RlPmdldFdyaXRlcigpPC9jb2RlPiwgaWYgYW55LgorICAgICAqLworCisgICAgcHJvdGVjdGVkIFByaW50V3JpdGVyIHdyaXRlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGhyZXNob2xkIG51bWJlciB0byBjb21wcmVzcworICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgdGhyZXNob2xkID0gMDsKKworICAgIC8qKgorICAgICAqIERlYnVnIGxldmVsCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVidWcgPSAwOworCisgICAgLyoqCisgICAgICogQ29udGVudCB0eXBlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogU2V0IGNvbnRlbnQgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgeworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNldENvbnRlbnRUeXBlIHRvICIrY29udGVudFR5cGUpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKyAgICAgICAgb3JpZ1Jlc3BvbnNlLnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aHJlc2hvbGQgbnVtYmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcHJlc3Npb25UaHJlc2hvbGQoaW50IHRocmVzaG9sZCkgeworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNldENvbXByZXNzaW9uVGhyZXNob2xkIHRvICIgKyB0aHJlc2hvbGQpOworICAgICAgICB9CisgICAgICAgIHRoaXMudGhyZXNob2xkID0gdGhyZXNob2xkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGRlYnVnIGxldmVsCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVidWdMZXZlbChpbnQgZGVidWcpIHsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBTZXJ2bGV0T3V0cHV0U3RyZWFtIHRvIHdyaXRlIHRoZSBjb250ZW50CisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldE91dHB1dFN0cmVhbSBjcmVhdGVPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZU91dHB1dFN0cmVhbSBnZXRzIGNhbGxlZCIpOworICAgICAgICB9CisKKyAgICAgICAgQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbSBzdHJlYW0gPSBuZXcgQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbShvcmlnUmVzcG9uc2UpOworICAgICAgICBzdHJlYW0uc2V0RGVidWdMZXZlbChkZWJ1Zyk7CisgICAgICAgIHN0cmVhbS5zZXRCdWZmZXIodGhyZXNob2xkKTsKKworICAgICAgICByZXR1cm4gc3RyZWFtOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGaW5pc2ggYSByZXNwb25zZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaW5pc2hSZXNwb25zZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXJ2bGV0UmVzcG9uc2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgYnVmZmVyIGFuZCBjb21taXQgdGhpcyByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmbHVzaCBidWZmZXIgQCBDb21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIiKTsKKyAgICAgICAgfQorICAgICAgICAoKENvbXByZXNzaW9uUmVzcG9uc2VTdHJlYW0pc3RyZWFtKS5mbHVzaCgpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJ2bGV0IG91dHB1dCBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiA8Y29kZT5nZXRXcml0ZXI8L2NvZGU+IGhhcworICAgICAqICBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHJlc3BvbnNlCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRXcml0ZXIoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXNwb25zZSIpOworCisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHN0cmVhbSA9IGNyZWF0ZU91dHB1dFN0cmVhbSgpOworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN0cmVhbSBpcyBzZXQgdG8gIitzdHJlYW0rIiBpbiBnZXRPdXRwdXRTdHJlYW0iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoc3RyZWFtKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgd3JpdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlc3BvbnNlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+Z2V0T3V0cHV0U3RyZWFtPC9jb2RlPiBoYXMKKyAgICAgKiAgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXNwb25zZQorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAod3JpdGVyKTsKKworICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRPdXRwdXRTdHJlYW0oKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXNwb25zZSIpOworCisgICAgICAgIHN0cmVhbSA9IGNyZWF0ZU91dHB1dFN0cmVhbSgpOworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN0cmVhbSBpcyBzZXQgdG8gIitzdHJlYW0rIiBpbiBnZXRXcml0ZXIiKTsKKyAgICAgICAgfQorICAgICAgICAvL1N0cmluZyBjaGFyc2V0ID0gZ2V0Q2hhcnNldEZyb21Db250ZW50VHlwZShjb250ZW50VHlwZSk7CisgICAgICAgIFN0cmluZyBjaGFyRW5jID0gb3JpZ1Jlc3BvbnNlLmdldENoYXJhY3RlckVuY29kaW5nKCk7CisgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhcmFjdGVyIGVuY29kaW5nIGlzICIgKyBjaGFyRW5jKTsKKyAgICAgICAgfQorICAgICAgICAvLyBIdHRwU2VydmxldFJlc3BvbnNlLmdldENoYXJhY3RlckVuY29kaW5nKCkgc2hvdWxkbid0IHJldHVybiBudWxsCisgICAgICAgIC8vIGFjY29yZGluZyB0aGUgc3BlYywgc28gZmVlbCBmcmVlIHRvIHJlbW92ZSB0aGF0ICJpZiIKKyAgICAgICAgaWYgKGNoYXJFbmMgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtLCBjaGFyRW5jKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuICh3cml0ZXIpOworCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TGVuZ3RoKGludCBsZW5ndGgpIHsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9maWx0ZXJzL0V4YW1wbGVGaWx0ZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9maWx0ZXJzL0V4YW1wbGVGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGFhNGVjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2ZpbHRlcnMvRXhhbXBsZUZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBmaWx0ZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKKworCisvKioKKyAqIEV4YW1wbGUgZmlsdGVyIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGVpdGhlciBhbiBpbmRpdmlkdWFsIHNlcnZsZXQKKyAqIG9yIHRvIGEgVVJMIHBhdHRlcm4uICBUaGlzIGZpbHRlciBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAqIDx1bD4KKyAqIDxsaT5BdHRhY2hlcyBpdHNlbGYgYXMgYSByZXF1ZXN0IGF0dHJpYnV0ZSwgdW5kZXIgdGhlIGF0dHJpYnV0ZSBuYW1lCisgKiAgICAgZGVmaW5lZCBieSB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmF0dHJpYnV0ZTwvY29kZT4gaW5pdGlhbGl6YXRpb24KKyAqICAgICBwYXJhbWV0ZXIuPC9saT4KKyAqIDxsaT5DYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHJlcXVpcmVkIHRvIHBlcmZvcm0gdGhlCisgKiAgICAgc2VydmxldCBwcm9jZXNzaW5nIHJlcXVpcmVkIGJ5IHRoaXMgcmVxdWVzdCwgaW5jbHVkaW5nIGFueQorICogICAgIHN1YnNlcXVlbnRseSBkZWZpbmVkIGZpbHRlcnMsIGFuZCBsb2dzIHRoZSByZXN1bHQgdG8gdGhlIHNlcnZsZXQKKyAqICAgICBjb250ZXh0IGxvZyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBFeGFtcGxlRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSBuYW1lIHVuZGVyIHdoaWNoIHdlIHN0b3JlIGEgcmVmZXJlbmNlIHRvIG91cnNlbGYuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGZpbHRlciBjb25maWd1cmF0aW9uIG9iamVjdCB3ZSBhcmUgYXNzb2NpYXRlZCB3aXRoLiAgSWYgdGhpcyB2YWx1ZQorICAgICAqIGlzIG51bGwsIHRoaXMgZmlsdGVyIGluc3RhbmNlIGlzIG5vdCBjdXJyZW50bHkgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogVGFrZSB0aGlzIGZpbHRlciBvdXQgb2Ygc2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworCisgICAgICAgIHRoaXMuYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdGhpcy5maWx0ZXJDb25maWcgPSBudWxsOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaW1lIHRoZSBwcm9jZXNzaW5nIHRoYXQgaXMgcGVyZm9ybWVkIGJ5IGFsbCBzdWJzZXF1ZW50IGZpbHRlcnMgaW4gdGhlCisgICAgICogY3VycmVudCBmaWx0ZXIgc3RhY2ssIGluY2x1ZGluZyB0aGUgdWx0aW1hdGVseSBpbnZva2VkIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3VsdCBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKiBAcGFyYW0gY2hhaW4gVGhlIGZpbHRlciBjaGFpbiB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyQ2hhaW4gY2hhaW4pCisJdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworCS8vIFN0b3JlIG91cnNlbHZlcyBhcyBhIHJlcXVlc3QgYXR0cmlidXRlIChpZiByZXF1ZXN0ZWQpCisJaWYgKGF0dHJpYnV0ZSAhPSBudWxsKQorCSAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHRoaXMpOworCisJLy8gVGltZSBhbmQgbG9nIHRoZSBzdWJzZXF1ZW50IHByb2Nlc3NpbmcKKwlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBjaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSk7CisJbG9uZyBzdG9wVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCWZpbHRlckNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmxvZworCSAgICAodGhpcy50b1N0cmluZygpICsgIjogIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKworCSAgICAgIiBtaWxsaXNlY29uZHMiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGxhY2UgdGhpcyBmaWx0ZXIgaW50byBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlckNvbmZpZyBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKwl0aGlzLmZpbHRlckNvbmZpZyA9IGZpbHRlckNvbmZpZzsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBmaWx0ZXJDb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiYXR0cmlidXRlIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisJaWYgKGZpbHRlckNvbmZpZyA9PSBudWxsKQorCSAgICByZXR1cm4gKCJJbnZva2VyRmlsdGVyKCkiKTsKKwlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJJbnZva2VyRmlsdGVyKCIpOworCXNiLmFwcGVuZChmaWx0ZXJDb25maWcpOworCXNiLmFwcGVuZCgiKSIpOworCXJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycy9SZXF1ZXN0RHVtcGVyRmlsdGVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycy9SZXF1ZXN0RHVtcGVyRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkZjI0NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9maWx0ZXJzL1JlcXVlc3REdW1wZXJGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcGFja2FnZSBmaWx0ZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKworLyoqCisgKiBFeGFtcGxlIGZpbHRlciB0aGF0IGR1bXBzIGludGVyZXN0aW5nIHN0YXRlIGluZm9ybWF0aW9uIGFib3V0IGEgcmVxdWVzdAorICogdG8gdGhlIGFzc29jaWF0ZWQgc2VydmxldCBjb250ZXh0IGxvZyBmaWxlLCBiZWZvcmUgYWxsb3dpbmcgdGhlIHNlcnZsZXQKKyAqIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QgaW4gdGhlIHVzdWFsIHdheS4gIFRoaXMgY2FuIGJlIGluc3RhbGxlZCBhcyBuZWVkZWQKKyAqIHRvIGFzc2lzdCBpbiBkZWJ1Z2dpbmcgcHJvYmxlbXMuCisgKgorICogQGF1dGhvciBDcmFpZyBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXF1ZXN0RHVtcGVyRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3Qgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aC4gIElmIHRoaXMgdmFsdWUKKyAgICAgKiBpcyBudWxsLCB0aGlzIGZpbHRlciBpbnN0YW5jZSBpcyBub3QgY3VycmVudGx5IGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFRha2UgdGhpcyBmaWx0ZXIgb3V0IG9mIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKworICAgICAgICB0aGlzLmZpbHRlckNvbmZpZyA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRpbWUgdGhlIHByb2Nlc3NpbmcgdGhhdCBpcyBwZXJmb3JtZWQgYnkgYWxsIHN1YnNlcXVlbnQgZmlsdGVycyBpbiB0aGUKKyAgICAgKiBjdXJyZW50IGZpbHRlciBzdGFjaywgaW5jbHVkaW5nIHRoZSB1bHRpbWF0ZWx5IGludm9rZWQgc2VydmxldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzdWx0IFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSBjaGFpbiBUaGUgZmlsdGVyIGNoYWluIHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDaGFpbiBjaGFpbikKKwl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIGlmIChmaWx0ZXJDb25maWcgPT0gbnVsbCkKKwkgICAgcmV0dXJuOworCisJLy8gUmVuZGVyIHRoZSBnZW5lcmljIHNlcnZsZXQgcmVxdWVzdCBwcm9wZXJ0aWVzCisJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdyk7CisJd3JpdGVyLnByaW50bG4oIlJlcXVlc3QgUmVjZWl2ZWQgYXQgIiArCisJCSAgICAgICAobmV3IFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpKTsKKwl3cml0ZXIucHJpbnRsbigiIGNoYXJhY3RlckVuY29kaW5nPSIgKyByZXF1ZXN0LmdldENoYXJhY3RlckVuY29kaW5nKCkpOworCXdyaXRlci5wcmludGxuKCIgICAgIGNvbnRlbnRMZW5ndGg9IiArIHJlcXVlc3QuZ2V0Q29udGVudExlbmd0aCgpKTsKKwl3cml0ZXIucHJpbnRsbigiICAgICAgIGNvbnRlbnRUeXBlPSIgKyByZXF1ZXN0LmdldENvbnRlbnRUeXBlKCkpOworCXdyaXRlci5wcmludGxuKCIgICAgICAgICAgICBsb2NhbGU9IiArIHJlcXVlc3QuZ2V0TG9jYWxlKCkpOworCXdyaXRlci5wcmludCgiICAgICAgICAgICBsb2NhbGVzPSIpOworCUVudW1lcmF0aW9uIGxvY2FsZXMgPSByZXF1ZXN0LmdldExvY2FsZXMoKTsKKwlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwl3aGlsZSAobG9jYWxlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworCSAgICBMb2NhbGUgbG9jYWxlID0gKExvY2FsZSkgbG9jYWxlcy5uZXh0RWxlbWVudCgpOworCSAgICBpZiAoZmlyc3QpCisJICAgICAgICBmaXJzdCA9IGZhbHNlOworCSAgICBlbHNlCisJICAgICAgICB3cml0ZXIucHJpbnQoIiwgIik7CisJICAgIHdyaXRlci5wcmludChsb2NhbGUudG9TdHJpbmcoKSk7CisJfQorCXdyaXRlci5wcmludGxuKCk7CisJRW51bWVyYXRpb24gbmFtZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7CisJd2hpbGUgKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisJICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMubmV4dEVsZW1lbnQoKTsKKwkgICAgd3JpdGVyLnByaW50KCIgICAgICAgICBwYXJhbWV0ZXI9IiArIG5hbWUgKyAiPSIpOworCSAgICBTdHJpbmcgdmFsdWVzW10gPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhuYW1lKTsKKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKwkgICAgICAgIGlmIChpID4gMCkKKwkJICAgIHdyaXRlci5wcmludCgiLCAiKTsKKwkJd3JpdGVyLnByaW50KHZhbHVlc1tpXSk7CisJICAgIH0KKwkgICAgd3JpdGVyLnByaW50bG4oKTsKKwl9CisJd3JpdGVyLnByaW50bG4oIiAgICAgICAgICBwcm90b2NvbD0iICsgcmVxdWVzdC5nZXRQcm90b2NvbCgpKTsKKwl3cml0ZXIucHJpbnRsbigiICAgICAgICByZW1vdGVBZGRyPSIgKyByZXF1ZXN0LmdldFJlbW90ZUFkZHIoKSk7CisJd3JpdGVyLnByaW50bG4oIiAgICAgICAgcmVtb3RlSG9zdD0iICsgcmVxdWVzdC5nZXRSZW1vdGVIb3N0KCkpOworCXdyaXRlci5wcmludGxuKCIgICAgICAgICAgICBzY2hlbWU9IiArIHJlcXVlc3QuZ2V0U2NoZW1lKCkpOworCXdyaXRlci5wcmludGxuKCIgICAgICAgIHNlcnZlck5hbWU9IiArIHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpKTsKKwl3cml0ZXIucHJpbnRsbigiICAgICAgICBzZXJ2ZXJQb3J0PSIgKyByZXF1ZXN0LmdldFNlcnZlclBvcnQoKSk7CisJd3JpdGVyLnByaW50bG4oIiAgICAgICAgICBpc1NlY3VyZT0iICsgcmVxdWVzdC5pc1NlY3VyZSgpKTsKKworCS8vIFJlbmRlciB0aGUgSFRUUCBzZXJ2bGV0IHJlcXVlc3QgcHJvcGVydGllcworCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXF1ZXN0KSB7CisJICAgIHdyaXRlci5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwkgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IGhyZXF1ZXN0ID0gKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxdWVzdDsKKwkgICAgd3JpdGVyLnByaW50bG4oIiAgICAgICBjb250ZXh0UGF0aD0iICsgaHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSk7CisJICAgIENvb2tpZSBjb29raWVzW10gPSBocmVxdWVzdC5nZXRDb29raWVzKCk7CisgICAgICAgICAgICBpZiAoY29va2llcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvb2tpZXMgPSBuZXcgQ29va2llWzBdOworCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHsKKwkgICAgICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgICAgICBjb29raWU9IiArIGNvb2tpZXNbaV0uZ2V0TmFtZSgpICsKKwkJCSAgICAgICAiPSIgKyBjb29raWVzW2ldLmdldFZhbHVlKCkpOworCSAgICB9CisJICAgIG5hbWVzID0gaHJlcXVlc3QuZ2V0SGVhZGVyTmFtZXMoKTsKKwkgICAgd2hpbGUgKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisJICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHRFbGVtZW50KCk7CisJCVN0cmluZyB2YWx1ZSA9IGhyZXF1ZXN0LmdldEhlYWRlcihuYW1lKTsKKwkgICAgICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgICAgICBoZWFkZXI9IiArIG5hbWUgKyAiPSIgKyB2YWx1ZSk7CisJICAgIH0KKwkgICAgd3JpdGVyLnByaW50bG4oIiAgICAgICAgICAgIG1ldGhvZD0iICsgaHJlcXVlc3QuZ2V0TWV0aG9kKCkpOworCSAgICB3cml0ZXIucHJpbnRsbigiICAgICAgICAgIHBhdGhJbmZvPSIgKyBocmVxdWVzdC5nZXRQYXRoSW5mbygpKTsKKwkgICAgd3JpdGVyLnByaW50bG4oIiAgICAgICBxdWVyeVN0cmluZz0iICsgaHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSk7CisJICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgIHJlbW90ZVVzZXI9IiArIGhyZXF1ZXN0LmdldFJlbW90ZVVzZXIoKSk7CisJICAgIHdyaXRlci5wcmludGxuKCJyZXF1ZXN0ZWRTZXNzaW9uSWQ9IiArCisJCQkgICBocmVxdWVzdC5nZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKSk7CisJICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgIHJlcXVlc3RVUkk9IiArIGhyZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7CisJICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgc2VydmxldFBhdGg9IiArIGhyZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkpOworCX0KKwl3cml0ZXIucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisKKwkvLyBMb2cgdGhlIHJlc3VsdGluZyBzdHJpbmcKKwl3cml0ZXIuZmx1c2goKTsKKwlmaWx0ZXJDb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5sb2coc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKSk7CisKKwkvLyBQYXNzIGNvbnRyb2wgb24gdG8gdGhlIG5leHQgZmlsdGVyCisgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGxhY2UgdGhpcyBmaWx0ZXIgaW50byBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlckNvbmZpZyBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKwl0aGlzLmZpbHRlckNvbmZpZyA9IGZpbHRlckNvbmZpZzsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKwlpZiAoZmlsdGVyQ29uZmlnID09IG51bGwpCisJICAgIHJldHVybiAoIlJlcXVlc3REdW1wZXJGaWx0ZXIoKSIpOworCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlJlcXVlc3REdW1wZXJGaWx0ZXIoIik7CisJc2IuYXBwZW5kKGZpbHRlckNvbmZpZyk7CisJc2IuYXBwZW5kKCIpIik7CisJcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9maWx0ZXJzL1NldENoYXJhY3RlckVuY29kaW5nRmlsdGVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycy9TZXRDaGFyYWN0ZXJFbmNvZGluZ0ZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYmJlY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycy9TZXRDaGFyYWN0ZXJFbmNvZGluZ0ZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBmaWx0ZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5VbmF2YWlsYWJsZUV4Y2VwdGlvbjsKKworCisvKioKKyAqIDxwPkV4YW1wbGUgZmlsdGVyIHRoYXQgc2V0cyB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIGJlIHVzZWQgaW4gcGFyc2luZyB0aGUKKyAqIGluY29taW5nIHJlcXVlc3QsIGVpdGhlciB1bmNvbmRpdGlvbmFsbHkgb3Igb25seSBpZiB0aGUgY2xpZW50IGRpZCBub3QKKyAqIHNwZWNpZnkgYSBjaGFyYWN0ZXIgZW5jb2RpbmcuICBDb25maWd1cmF0aW9uIG9mIHRoaXMgZmlsdGVyIGlzIGJhc2VkIG9uCisgKiB0aGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnM6PC9wPgorICogPHVsPgorICogPGxpPjxzdHJvbmc+ZW5jb2Rpbmc8L3N0cm9uZz4gLSBUaGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIGJlIGNvbmZpZ3VyZWQKKyAqICAgICBmb3IgdGhpcyByZXF1ZXN0LCBlaXRoZXIgY29uZGl0aW9uYWxseSBvciB1bmNvbmRpdGlvbmFsbHkgYmFzZWQgb24KKyAqICAgICB0aGUgPGNvZGU+aWdub3JlPC9jb2RlPiBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIuICBUaGlzIHBhcmFtZXRlcgorICogICAgIGlzIHJlcXVpcmVkLCBzbyB0aGVyZSBpcyBubyBkZWZhdWx0LjwvbGk+CisgKiA8bGk+PHN0cm9uZz5pZ25vcmU8L3N0cm9uZz4gLSBJZiBzZXQgdG8gInRydWUiLCBhbnkgY2hhcmFjdGVyIGVuY29kaW5nCisgKiAgICAgc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQgaXMgaWdub3JlZCwgYW5kIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUKKyAqICAgICA8Y29kZT5zZWxlY3RFbmNvZGluZygpPC9jb2RlPiBtZXRob2QgaXMgc2V0LiAgSWYgc2V0IHRvICJmYWxzZSwKKyAqICAgICA8Y29kZT5zZWxlY3RFbmNvZGluZygpPC9jb2RlPiBpcyBjYWxsZWQgPHN0cm9uZz5vbmx5PC9zdHJvbmc+IGlmIHRoZQorICogICAgIGNsaWVudCBoYXMgbm90IGFscmVhZHkgc3BlY2lmaWVkIGFuIGVuY29kaW5nLiAgQnkgZGVmYXVsdCwgdGhpcworICogICAgIHBhcmFtZXRlciBpcyBzZXQgdG8gInRydWUiLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIDxwPkFsdGhvdWdoIHRoaXMgZmlsdGVyIGNhbiBiZSB1c2VkIHVuY2hhbmdlZCwgaXQgaXMgYWxzbyBlYXN5IHRvCisgKiBzdWJjbGFzcyBpdCBhbmQgbWFrZSB0aGUgPGNvZGU+c2VsZWN0RW5jb2RpbmcoKTwvY29kZT4gbWV0aG9kIG1vcmUKKyAqIGludGVsbGlnZW50IGFib3V0IHdoYXQgZW5jb2RpbmcgdG8gY2hvb3NlLCBiYXNlZCBvbiBjaGFyYWN0ZXJpc3RpY3Mgb2YKKyAqIHRoZSBpbmNvbWluZyByZXF1ZXN0IChzdWNoIGFzIHRoZSB2YWx1ZXMgb2YgdGhlIDxjb2RlPkFjY2VwdC1MYW5ndWFnZTwvY29kZT4KKyAqIGFuZCA8Y29kZT5Vc2VyLUFnZW50PC9jb2RlPiBoZWFkZXJzLCBvciBhIHZhbHVlIHN0YXNoZWQgaW4gdGhlIGN1cnJlbnQKKyAqIHVzZXIncyBzZXNzaW9uLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFNldENoYXJhY3RlckVuY29kaW5nRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZyB0byBzZXQgZm9yIHJlcXVlc3RzIHRoYXQgcGFzcyB0aHJvdWdoCisgICAgICogdGhpcyBmaWx0ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBlbmNvZGluZyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3Qgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aC4gIElmIHRoaXMgdmFsdWUKKyAgICAgKiBpcyBudWxsLCB0aGlzIGZpbHRlciBpbnN0YW5jZSBpcyBub3QgY3VycmVudGx5IGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgYSBjaGFyYWN0ZXIgZW5jb2Rpbmcgc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQgYmUgaWdub3JlZD8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpZ25vcmUgPSB0cnVlOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogVGFrZSB0aGlzIGZpbHRlciBvdXQgb2Ygc2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworCisgICAgICAgIHRoaXMuZW5jb2RpbmcgPSBudWxsOworICAgICAgICB0aGlzLmZpbHRlckNvbmZpZyA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlbGVjdCBhbmQgc2V0IChpZiBzcGVjaWZpZWQpIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgdXNlZCB0bworICAgICAqIGludGVycHJldCByZXF1ZXN0IHBhcmFtZXRlcnMgZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzdWx0IFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSBjaGFpbiBUaGUgZmlsdGVyIGNoYWluIHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDaGFpbiBjaGFpbikKKwl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIENvbmRpdGlvbmFsbHkgc2VsZWN0IGFuZCBzZXQgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSB1c2VkCisgICAgICAgIGlmIChpZ25vcmUgfHwgKHJlcXVlc3QuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSA9PSBudWxsKSkgeworICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gc2VsZWN0RW5jb2RpbmcocmVxdWVzdCk7CisgICAgICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnNldENoYXJhY3RlckVuY29kaW5nKGVuY29kaW5nKTsKKyAgICAgICAgfQorCisJLy8gUGFzcyBjb250cm9sIG9uIHRvIHRoZSBuZXh0IGZpbHRlcgorICAgICAgICBjaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBsYWNlIHRoaXMgZmlsdGVyIGludG8gc2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJDb25maWcgVGhlIGZpbHRlciBjb25maWd1cmF0aW9uIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisJdGhpcy5maWx0ZXJDb25maWcgPSBmaWx0ZXJDb25maWc7CisgICAgICAgIHRoaXMuZW5jb2RpbmcgPSBmaWx0ZXJDb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiZW5jb2RpbmciKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gZmlsdGVyQ29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImlnbm9yZSIpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuaWdub3JlID0gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQorICAgICAgICAgICAgdGhpcy5pZ25vcmUgPSB0cnVlOworICAgICAgICBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ5ZXMiKSkKKyAgICAgICAgICAgIHRoaXMuaWdub3JlID0gdHJ1ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy5pZ25vcmUgPSBmYWxzZTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFNlbGVjdCBhbiBhcHByb3ByaWF0ZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgdXNlZCwgYmFzZWQgb24gdGhlCisgICAgICogY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kL29yIGZpbHRlciBpbml0aWFsaXphdGlvbgorICAgICAqIHBhcmFtZXRlcnMuICBJZiBubyBjaGFyYWN0ZXIgZW5jb2Rpbmcgc2hvdWxkIGJlIHNldCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdW5jb25kaXRpb25hbGx5IHJldHVybnMgdGhlIHZhbHVlIGNvbmZpZ3VyZWQKKyAgICAgKiBieSB0aGUgPHN0cm9uZz5lbmNvZGluZzwvc3Ryb25nPiBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgZm9yIHRoaXMKKyAgICAgKiBmaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzZWxlY3RFbmNvZGluZyhTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmVuY29kaW5nKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvbGlzdGVuZXJzL0NvbnRleHRMaXN0ZW5lci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2xpc3RlbmVycy9Db250ZXh0TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGFhZjIwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2xpc3RlbmVycy9Db250ZXh0TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgbGlzdGVuZXJzOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRBdHRyaWJ1dGVFdmVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEV2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRMaXN0ZW5lcjsKKworCisvKioKKyAqIEV4YW1wbGUgbGlzdGVuZXIgZm9yIGNvbnRleHQtcmVsYXRlZCBhcHBsaWNhdGlvbiBldmVudHMsIHdoaWNoIHdlcmUKKyAqIGludHJvZHVjZWQgaW4gdGhlIDIuMyB2ZXJzaW9uIG9mIHRoZSBTZXJ2bGV0IEFQSS4gIFRoaXMgbGlzdGVuZXIKKyAqIG1lcmVseSBkb2N1bWVudHMgdGhlIG9jY3VycmVuY2Ugb2Ygc3VjaCBldmVudHMgaW4gdGhlIGFwcGxpY2F0aW9uIGxvZworICogYXNzb2NpYXRlZCB3aXRoIG91ciBzZXJ2bGV0IGNvbnRleHQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb250ZXh0TGlzdGVuZXIKKyAgICBpbXBsZW1lbnRzIFNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXIsIFNlcnZsZXRDb250ZXh0TGlzdGVuZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZsZXQgY29udGV4dCB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgY29udGV4dCA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCBhIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgd2FzIGFkZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlQWRkZWQoU2VydmxldENvbnRleHRBdHRyaWJ1dGVFdmVudCBldmVudCkgeworCisJbG9nKCJhdHRyaWJ1dGVBZGRlZCgnIiArIGV2ZW50LmdldE5hbWUoKSArICInLCAnIiArCisJICAgIGV2ZW50LmdldFZhbHVlKCkgKyAiJykiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgYSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIHdhcyByZW1vdmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlUmVtb3ZlZChTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IGV2ZW50KSB7CisKKwlsb2coImF0dHJpYnV0ZVJlbW92ZWQoJyIgKyBldmVudC5nZXROYW1lKCkgKyAiJywgJyIgKworCSAgICBldmVudC5nZXRWYWx1ZSgpICsgIicpIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IGEgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB3YXMgcmVwbGFjZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZXBsYWNlZChTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IGV2ZW50KSB7CisKKwlsb2coImF0dHJpYnV0ZVJlcGxhY2VkKCciICsgZXZlbnQuZ2V0TmFtZSgpICsgIicsICciICsKKwkgICAgZXZlbnQuZ2V0VmFsdWUoKSArICInKSIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCB0aGlzIHdlYiBhcHBsaWNhdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlcnZsZXQgY29udGV4dCBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbnRleHREZXN0cm95ZWQoU2VydmxldENvbnRleHRFdmVudCBldmVudCkgeworCisJbG9nKCJjb250ZXh0RGVzdHJveWVkKCkiKTsKKwl0aGlzLmNvbnRleHQgPSBudWxsOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCB0aGlzIHdlYiBhcHBsaWNhdGlvbiBoYXMgYmVlbiBpbml0aWFsaXplZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2VydmxldCBjb250ZXh0IGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgY29udGV4dEluaXRpYWxpemVkKFNlcnZsZXRDb250ZXh0RXZlbnQgZXZlbnQpIHsKKworCXRoaXMuY29udGV4dCA9IGV2ZW50LmdldFNlcnZsZXRDb250ZXh0KCk7CisJbG9nKCJjb250ZXh0SW5pdGlhbGl6ZWQoKSIpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogTG9nIGEgbWVzc2FnZSB0byB0aGUgc2VydmxldCBjb250ZXh0IGFwcGxpY2F0aW9uIGxvZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UgdG8gYmUgbG9nZ2VkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgeworCisJaWYgKGNvbnRleHQgIT0gbnVsbCkKKwkgICAgY29udGV4dC5sb2coIkNvbnRleHRMaXN0ZW5lcjogIiArIG1lc3NhZ2UpOworCWVsc2UKKwkgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb250ZXh0TGlzdGVuZXI6ICIgKyBtZXNzYWdlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTG9nIGEgbWVzc2FnZSBhbmQgYXNzb2NpYXRlZCBleGNlcHRpb24gdG8gdGhlIHNlcnZsZXQgY29udGV4dAorICAgICAqIGFwcGxpY2F0aW9uIGxvZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UgdG8gYmUgbG9nZ2VkCisgICAgICogQHBhcmFtIHRocm93YWJsZSBFeGNlcHRpb24gdG8gYmUgbG9nZ2VkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworCisJaWYgKGNvbnRleHQgIT0gbnVsbCkKKwkgICAgY29udGV4dC5sb2coIkNvbnRleHRMaXN0ZW5lcjogIiArIG1lc3NhZ2UsIHRocm93YWJsZSk7CisJZWxzZSB7CisJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29udGV4dExpc3RlbmVyOiAiICsgbWVzc2FnZSk7CisJICAgIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisJfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9saXN0ZW5lcnMvU2Vzc2lvbkxpc3RlbmVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvbGlzdGVuZXJzL1Nlc3Npb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MTQyZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvbGlzdGVuZXJzL1Nlc3Npb25MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTgzIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBsaXN0ZW5lcnM7CisKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEV2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uRXZlbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uTGlzdGVuZXI7CisKKworLyoqCisgKiBFeGFtcGxlIGxpc3RlbmVyIGZvciBjb250ZXh0LXJlbGF0ZWQgYXBwbGljYXRpb24gZXZlbnRzLCB3aGljaCB3ZXJlCisgKiBpbnRyb2R1Y2VkIGluIHRoZSAyLjMgdmVyc2lvbiBvZiB0aGUgU2VydmxldCBBUEkuICBUaGlzIGxpc3RlbmVyCisgKiBtZXJlbHkgZG9jdW1lbnRzIHRoZSBvY2N1cnJlbmNlIG9mIHN1Y2ggZXZlbnRzIGluIHRoZSBhcHBsaWNhdGlvbiBsb2cKKyAqIGFzc29jaWF0ZWQgd2l0aCBvdXIgc2VydmxldCBjb250ZXh0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2Vzc2lvbkxpc3RlbmVyCisgICAgaW1wbGVtZW50cyBTZXJ2bGV0Q29udGV4dExpc3RlbmVyLAorCSAgICAgICBIdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyLCBIdHRwU2Vzc2lvbkxpc3RlbmVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2bGV0IGNvbnRleHQgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgYSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIHdhcyBhZGRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBhdHRyaWJ1dGUgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVBZGRlZChIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCkgeworCisJbG9nKCJhdHRyaWJ1dGVBZGRlZCgnIiArIGV2ZW50LmdldFNlc3Npb24oKS5nZXRJZCgpICsgIicsICciICsKKwkgICAgZXZlbnQuZ2V0TmFtZSgpICsgIicsICciICsgZXZlbnQuZ2V0VmFsdWUoKSArICInKSIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCBhIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgd2FzIHJlbW92ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gYXR0cmlidXRlIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlUmVtb3ZlZChIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCkgeworCisJbG9nKCJhdHRyaWJ1dGVSZW1vdmVkKCciICsgZXZlbnQuZ2V0U2Vzc2lvbigpLmdldElkKCkgKyAiJywgJyIgKworCSAgICBldmVudC5nZXROYW1lKCkgKyAiJywgJyIgKyBldmVudC5nZXRWYWx1ZSgpICsgIicpIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IGEgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB3YXMgcmVwbGFjZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gYXR0cmlidXRlIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlUmVwbGFjZWQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpIHsKKworCWxvZygiYXR0cmlidXRlUmVwbGFjZWQoJyIgKyBldmVudC5nZXRTZXNzaW9uKCkuZ2V0SWQoKSArICInLCAnIiArCisJICAgIGV2ZW50LmdldE5hbWUoKSArICInLCAnIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiJykiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgdGhpcyB3ZWIgYXBwbGljYXRpb24gaGFzIGJlZW4gZGVzdHJveWVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXJ2bGV0IGNvbnRleHQgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0RGVzdHJveWVkKFNlcnZsZXRDb250ZXh0RXZlbnQgZXZlbnQpIHsKKworCWxvZygiY29udGV4dERlc3Ryb3llZCgpIik7CisJdGhpcy5jb250ZXh0ID0gbnVsbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgdGhpcyB3ZWIgYXBwbGljYXRpb24gaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlcnZsZXQgY29udGV4dCBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbnRleHRJbml0aWFsaXplZChTZXJ2bGV0Q29udGV4dEV2ZW50IGV2ZW50KSB7CisKKwl0aGlzLmNvbnRleHQgPSBldmVudC5nZXRTZXJ2bGV0Q29udGV4dCgpOworCWxvZygiY29udGV4dEluaXRpYWxpemVkKCkiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgYSBzZXNzaW9uIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uQ3JlYXRlZChIdHRwU2Vzc2lvbkV2ZW50IGV2ZW50KSB7CisKKwlsb2coInNlc3Npb25DcmVhdGVkKCciICsgZXZlbnQuZ2V0U2Vzc2lvbigpLmdldElkKCkgKyAiJykiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgYSBzZXNzaW9uIGhhcyBiZWVuIGRlc3Ryb3llZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlc3Npb25EZXN0cm95ZWQoSHR0cFNlc3Npb25FdmVudCBldmVudCkgeworCisJbG9nKCJzZXNzaW9uRGVzdHJveWVkKCciICsgZXZlbnQuZ2V0U2Vzc2lvbigpLmdldElkKCkgKyAiJykiKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIExvZyBhIG1lc3NhZ2UgdG8gdGhlIHNlcnZsZXQgY29udGV4dCBhcHBsaWNhdGlvbiBsb2cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIHRvIGJlIGxvZ2dlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKKworCWlmIChjb250ZXh0ICE9IG51bGwpCisJICAgIGNvbnRleHQubG9nKCJTZXNzaW9uTGlzdGVuZXI6ICIgKyBtZXNzYWdlKTsKKwllbHNlCisJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2Vzc2lvbkxpc3RlbmVyOiAiICsgbWVzc2FnZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExvZyBhIG1lc3NhZ2UgYW5kIGFzc29jaWF0ZWQgZXhjZXB0aW9uIHRvIHRoZSBzZXJ2bGV0IGNvbnRleHQKKyAgICAgKiBhcHBsaWNhdGlvbiBsb2cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIHRvIGJlIGxvZ2dlZAorICAgICAqIEBwYXJhbSB0aHJvd2FibGUgRXhjZXB0aW9uIHRvIGJlIGxvZ2dlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKworCWlmIChjb250ZXh0ICE9IG51bGwpCisJICAgIGNvbnRleHQubG9nKCJTZXNzaW9uTGlzdGVuZXI6ICIgKyBtZXNzYWdlLCB0aHJvd2FibGUpOworCWVsc2UgeworCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlc3Npb25MaXN0ZW5lcjogIiArIG1lc3NhZ2UpOworCSAgICB0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworCX0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvdXRpbC9IVE1MRmlsdGVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvdXRpbC9IVE1MRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxMGFkZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy91dGlsL0hUTUxGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgdXRpbDsKKworLyoqCisgKiBIVE1MIGZpbHRlciB1dGlsaXR5LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBUaW0gVHllCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBIVE1MRmlsdGVyIHsKKworCisgICAgLyoqCisgICAgICogRmlsdGVyIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBzdHJpbmcgZm9yIGNoYXJhY3RlcnMgdGhhdCBhcmUgc2Vuc2l0aXZlCisgICAgICogaW4gSFRNTC4gIFRoaXMgYXZvaWRzIHBvdGVudGlhbCBhdHRhY2tzIGNhdXNlZCBieSBpbmNsdWRpbmcgSmF2YVNjcmlwdAorICAgICAqIGNvZGVzIGluIHRoZSByZXF1ZXN0IFVSTCB0aGF0IGlzIG9mdGVuIHJlcG9ydGVkIGluIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugc3RyaW5nIHRvIGJlIGZpbHRlcmVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyKFN0cmluZyBtZXNzYWdlKSB7CisKKyAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgY2hhciBjb250ZW50W10gPSBuZXcgY2hhclttZXNzYWdlLmxlbmd0aCgpXTsKKyAgICAgICAgbWVzc2FnZS5nZXRDaGFycygwLCBtZXNzYWdlLmxlbmd0aCgpLCBjb250ZW50LCAwKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoY29udGVudC5sZW5ndGggKyA1MCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChjb250ZW50W2ldKSB7CisgICAgICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImbHQ7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImZ3Q7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcmJzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImYW1wOyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiJnF1b3Q7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoY29udGVudFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChyZXN1bHQudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL3dlYi54bWwgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkZjg4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDI0OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgorICAgIHZlcnNpb249IjIuNCI+CisKKyAgICA8ZGlzcGxheS1uYW1lPlNlcnZsZXQgMi40IEV4YW1wbGVzPC9kaXNwbGF5LW5hbWU+CisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgU2VydmxldCAyLjQgRXhhbXBsZXMuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDwhLS0gRGVmaW5lIHNlcnZsZXQtbWFwcGVkIGFuZCBwYXRoLW1hcHBlZCBleGFtcGxlIGZpbHRlcnMgLS0+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPlNlcnZsZXQgTWFwcGVkIEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+ZmlsdGVycy5FeGFtcGxlRmlsdGVyPC9maWx0ZXItY2xhc3M+CisJPGluaXQtcGFyYW0+CisJICAgIDxwYXJhbS1uYW1lPmF0dHJpYnV0ZTwvcGFyYW0tbmFtZT4KKwkgICAgPHBhcmFtLXZhbHVlPmZpbHRlcnMuRXhhbXBsZUZpbHRlci5TRVJWTEVUX01BUFBFRDwvcGFyYW0tdmFsdWU+CisJPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5QYXRoIE1hcHBlZCBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPmZpbHRlcnMuRXhhbXBsZUZpbHRlcjwvZmlsdGVyLWNsYXNzPgorCTxpbml0LXBhcmFtPgorCSAgICA8cGFyYW0tbmFtZT5hdHRyaWJ1dGU8L3BhcmFtLW5hbWU+CisJICAgIDxwYXJhbS12YWx1ZT5maWx0ZXJzLkV4YW1wbGVGaWx0ZXIuUEFUSF9NQVBQRUQ8L3BhcmFtLXZhbHVlPgorCTwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+UmVxdWVzdCBEdW1wZXIgRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5maWx0ZXJzLlJlcXVlc3REdW1wZXJGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICA8L2ZpbHRlcj4KKworICAgIDwhLS0gRXhhbXBsZSBmaWx0ZXIgdG8gc2V0IGNoYXJhY3RlciBlbmNvZGluZyBvbiBlYWNoIHJlcXVlc3QgLS0+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPlNldCBDaGFyYWN0ZXIgRW5jb2Rpbmc8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPmZpbHRlcnMuU2V0Q2hhcmFjdGVyRW5jb2RpbmdGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5lbmNvZGluZzwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5FVUNfSlA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisKKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+Q29tcHJlc3Npb24gRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5jb21wcmVzc2lvbkZpbHRlcnMuQ29tcHJlc3Npb25GaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKworICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICA8cGFyYW0tbmFtZT5jb21wcmVzc2lvblRocmVzaG9sZDwvcGFyYW0tbmFtZT4KKyAgICAgICAgICA8cGFyYW0tdmFsdWU+MTA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgIDxwYXJhbS1uYW1lPmRlYnVnPC9wYXJhbS1uYW1lPgorICAgICAgICAgIDxwYXJhbS12YWx1ZT4wPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorCisgICAgPCEtLSBEZWZpbmUgZmlsdGVyIG1hcHBpbmdzIGZvciB0aGUgZGVmaW5lZCBmaWx0ZXJzIC0tPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPlNlcnZsZXQgTWFwcGVkIEZpbHRlcjwvZmlsdGVyLW5hbWU+CisJPHNlcnZsZXQtbmFtZT5pbnZva2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5QYXRoIE1hcHBlZCBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorCTx1cmwtcGF0dGVybj4vc2VydmxldC8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisKKzwhLS0gRXhhbXBsZSBmaWx0ZXIgbWFwcGluZyB0byBhcHBseSB0aGUgIlNldCBDaGFyYWN0ZXIgRW5jb2RpbmciIGZpbHRlcgorICAgICB0byAqYWxsKiByZXF1ZXN0cyBwcm9jZXNzZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24gLS0+Cis8IS0tCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+U2V0IENoYXJhY3RlciBFbmNvZGluZzwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKy0tPgorCis8IS0tCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgPGZpbHRlci1uYW1lPkNvbXByZXNzaW9uIEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICA8dXJsLXBhdHRlcm4+L0NvbXByZXNzaW9uVGVzdDwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKy0tPgorCis8IS0tCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+UmVxdWVzdCBEdW1wZXIgRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorLS0+CisKKyAgICA8IS0tIERlZmluZSBleGFtcGxlIGFwcGxpY2F0aW9uIGV2ZW50cyBsaXN0ZW5lcnMgLS0+CisgICAgPGxpc3RlbmVyPgorICAgICAgICA8bGlzdGVuZXItY2xhc3M+bGlzdGVuZXJzLkNvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+CisgICAgPC9saXN0ZW5lcj4KKyAgICA8bGlzdGVuZXI+CisgICAgICAgIDxsaXN0ZW5lci1jbGFzcz5saXN0ZW5lcnMuU2Vzc2lvbkxpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KKyAgICA8L2xpc3RlbmVyPgorCisgICAgPCEtLSBEZWZpbmUgc2VydmxldHMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGV4YW1wbGUgYXBwbGljYXRpb24gLS0+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Db21wcmVzc2lvbkZpbHRlclRlc3RTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPmNvbXByZXNzaW9uRmlsdGVycy5Db21wcmVzc2lvbkZpbHRlclRlc3RTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5IZWxsb1dvcmxkRXhhbXBsZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5IZWxsb1dvcmxkRXhhbXBsZTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVxdWVzdEluZm9FeGFtcGxlPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPlJlcXVlc3RJbmZvRXhhbXBsZTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVxdWVzdEhlYWRlckV4YW1wbGU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+UmVxdWVzdEhlYWRlckV4YW1wbGU8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlJlcXVlc3RQYXJhbUV4YW1wbGU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+UmVxdWVzdFBhcmFtRXhhbXBsZTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Q29va2llRXhhbXBsZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5Db29raWVFeGFtcGxlPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXNzaW9uRXhhbXBsZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5TZXNzaW9uRXhhbXBsZTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkNvbXByZXNzaW9uRmlsdGVyVGVzdFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Db21wcmVzc2lvblRlc3Q8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SGVsbG9Xb3JsZEV4YW1wbGU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9zZXJ2bGV0L0hlbGxvV29ybGRFeGFtcGxlPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlcXVlc3RJbmZvRXhhbXBsZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L3NlcnZsZXQvUmVxdWVzdEluZm9FeGFtcGxlLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVxdWVzdEhlYWRlckV4YW1wbGU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9zZXJ2bGV0L1JlcXVlc3RIZWFkZXJFeGFtcGxlPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlcXVlc3RQYXJhbUV4YW1wbGU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9zZXJ2bGV0L1JlcXVlc3RQYXJhbUV4YW1wbGU8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Q29va2llRXhhbXBsZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L3NlcnZsZXQvQ29va2llRXhhbXBsZTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXNzaW9uRXhhbXBsZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L3NlcnZsZXQvU2Vzc2lvbkV4YW1wbGU8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgICA8ZGlzcGxheS1uYW1lPkV4YW1wbGUgU2VjdXJpdHkgQ29uc3RyYWludDwvZGlzcGxheS1uYW1lPgorICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPlByb3RlY3RlZCBBcmVhPC93ZWItcmVzb3VyY2UtbmFtZT4KKwkgPCEtLSBEZWZpbmUgdGhlIGNvbnRleHQtcmVsYXRpdmUgVVJMKHMpIHRvIGJlIHByb3RlY3RlZCAtLT4KKyAgICAgICAgIDx1cmwtcGF0dGVybj4vanNwL3NlY3VyaXR5L3Byb3RlY3RlZC8qPC91cmwtcGF0dGVybj4KKwkgPCEtLSBJZiB5b3UgbGlzdCBodHRwIG1ldGhvZHMsIG9ubHkgdGhvc2UgbWV0aG9kcyBhcmUgcHJvdGVjdGVkIC0tPgorCSA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KKyAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgorICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgorCSA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KKyAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICA8YXV0aC1jb25zdHJhaW50PgorICAgICAgICAgPCEtLSBBbnlvbmUgd2l0aCBvbmUgb2YgdGhlIGxpc3RlZCByb2xlcyBtYXkgYWNjZXNzIHRoaXMgYXJlYSAtLT4KKyAgICAgICAgIDxyb2xlLW5hbWU+dG9tY2F0PC9yb2xlLW5hbWU+CisJIDxyb2xlLW5hbWU+cm9sZTE8L3JvbGUtbmFtZT4KKyAgICAgIDwvYXV0aC1jb25zdHJhaW50PgorICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KKworICAgIDwhLS0gRGVmYXVsdCBsb2dpbiBjb25maWd1cmF0aW9uIHVzZXMgZm9ybS1iYXNlZCBhdXRoZW50aWNhdGlvbiAtLT4KKyAgICA8bG9naW4tY29uZmlnPgorICAgICAgPGF1dGgtbWV0aG9kPkZPUk08L2F1dGgtbWV0aG9kPgorICAgICAgPHJlYWxtLW5hbWU+RXhhbXBsZSBGb3JtLUJhc2VkIEF1dGhlbnRpY2F0aW9uIEFyZWE8L3JlYWxtLW5hbWU+CisgICAgICA8Zm9ybS1sb2dpbi1jb25maWc+CisgICAgICAgIDxmb3JtLWxvZ2luLXBhZ2U+L2pzcC9zZWN1cml0eS9wcm90ZWN0ZWQvbG9naW4uanNwPC9mb3JtLWxvZ2luLXBhZ2U+CisgICAgICAgIDxmb3JtLWVycm9yLXBhZ2U+L2pzcC9zZWN1cml0eS9wcm90ZWN0ZWQvZXJyb3IuanNwPC9mb3JtLWVycm9yLXBhZ2U+CisgICAgICA8L2Zvcm0tbG9naW4tY29uZmlnPgorICAgIDwvbG9naW4tY29uZmlnPgorCisgICAgPCEtLSBTZWN1cml0eSByb2xlcyByZWZlcmVuY2VkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uIC0tPgorICAgIDxzZWN1cml0eS1yb2xlPgorICAgICAgPHJvbGUtbmFtZT5yb2xlMTwvcm9sZS1uYW1lPgorICAgIDwvc2VjdXJpdHktcm9sZT4KKyAgICA8c2VjdXJpdHktcm9sZT4KKyAgICAgIDxyb2xlLW5hbWU+dG9tY2F0PC9yb2xlLW5hbWU+CisgICAgPC9zZWN1cml0eS1yb2xlPgorCisgICAgPCEtLSBFbnZpcm9ubWVudCBlbnRyeSBleGFtcGxlcyAtLT4KKyAgICA8IS0tZW52LWVudHJ5PgorICAgICAgPGVudi1lbnRyeS1kZXNjcmlwdGlvbj4KKyAgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0YXggZXhlbXB0aW9ucyBhbGxvd2VkIHRvIGJlIHNldC4KKyAgICAgIDwvZW52LWVudHJ5LWRlc2NyaXB0aW9uPgorICAgICAgPGVudi1lbnRyeS1uYW1lPm1heEV4ZW1wdGlvbnM8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgPGVudi1lbnRyeS12YWx1ZT4xNTwvZW52LWVudHJ5LXZhbHVlPgorICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KKyAgICA8L2Vudi1lbnRyeS0tPgorICAgIDxlbnYtZW50cnk+CisgICAgICA8ZW52LWVudHJ5LW5hbWU+bWluRXhlbXB0aW9uczwvZW52LWVudHJ5LW5hbWU+CisgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgorICAgICAgPGVudi1lbnRyeS12YWx1ZT4xPC9lbnYtZW50cnktdmFsdWU+CisgICAgPC9lbnYtZW50cnk+CisgICAgPGVudi1lbnRyeT4KKyAgICAgIDxlbnYtZW50cnktbmFtZT5mb28vbmFtZTE8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgorICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZTE8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICA8L2Vudi1lbnRyeT4KKyAgICA8ZW52LWVudHJ5PgorICAgICAgPGVudi1lbnRyeS1uYW1lPmZvby9iYXIvbmFtZTI8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KKyAgICAgIDxlbnYtZW50cnktdmFsdWU+dHJ1ZTwvZW52LWVudHJ5LXZhbHVlPgorICAgIDwvZW52LWVudHJ5PgorICAgIDxlbnYtZW50cnk+CisgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZTM8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KKyAgICAgIDxlbnYtZW50cnktdmFsdWU+MTwvZW52LWVudHJ5LXZhbHVlPgorICAgIDwvZW52LWVudHJ5PgorICAgIDxlbnYtZW50cnk+CisgICAgICA8ZW52LWVudHJ5LW5hbWU+Zm9vL25hbWU0PC9lbnYtZW50cnktbmFtZT4KKyAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+CisgICAgICA8ZW52LWVudHJ5LXZhbHVlPjEwPC9lbnYtZW50cnktdmFsdWU+CisgICAgPC9lbnYtZW50cnk+CisKKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL2Nvb2tpZXMuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL2Nvb2tpZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTk1MDIwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvY29va2llcy5odG1sCkBAIC0wLDAgKzEsNjEgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0ic2VydmxldC9Db29raWVFeGFtcGxlIj48aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9ImluZGV4Lmh0bWwiPjxpbWcgc3JjPSJpbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+Cis8aDM+U291cmNlIENvZGUgZm9yIENvb2tpZSBFeGFtcGxlPGZvbnQgY29sb3I9IiMwMDAwRkYiPjxicj4KKyAgPC9mb250PiA8L2gzPgorPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvZm9udD4gCis8cHJlPjxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmEuaW8uKjsKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmF4LnNlcnZsZXQuKjsKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+cHVibGljIGNsYXNzPC9mb250PiBDb29raWVFeGFtcGxlIDxmb250IGNvbG9yPSIjMDAwMEZGIj5leHRlbmRzPC9mb250PiBIdHRwU2VydmxldCB7CisKKyAgICA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+cHVibGljIHZvaWQ8L2ZvbnQ+IGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgIDxmb250IGNvbG9yPSIjMDAwMEZGIj50aHJvd3M8L2ZvbnQ+IElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+dGV4dC9odG1sPC9mb250PiZxdW90Oyk7CisgICAgICAgIFByaW50V3JpdGVyIG91dCA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICAKKyAgICAgICAgPGZvbnQgY29sb3I9IiNDQzAwMDAiPi8vIHByaW50IG91dCBjb29raWVzPC9mb250PgorCisgICAgICAgIENvb2tpZVtdIGNvb2tpZXMgPSByZXF1ZXN0LmdldENvb2tpZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBjb29raWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBDb29raWUgYyA9IGNvb2tpZXNbaV07CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGMuZ2V0TmFtZSgpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYy5nZXRWYWx1ZSgpOworICAgICAgICAgICAgb3V0LnByaW50bG4obmFtZSArICZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4gPSA8L2ZvbnQ+JnF1b3Q7ICsgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgPGZvbnQgY29sb3I9IiNDQzAwMDAiPi8vIHNldCBhIGNvb2tpZTwvZm9udD4KKworICAgICAgICBTdHJpbmcgbmFtZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj5jb29raWVOYW1lPC9mb250PiZxdW90Oyk7CisgICAgICAgIGlmIChuYW1lICE9IG51bGwgJmFtcDsmYW1wOyBuYW1lLmxlbmd0aCgpICZndDsgMCkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPmNvb2tpZVZhbHVlPC9mb250PiZxdW90Oyk7CisgICAgICAgICAgICBDb29raWUgYyA9IG5ldyBDb29raWUobmFtZSwgdmFsdWUpOworICAgICAgICAgICAgcmVzcG9uc2UuYWRkQ29va2llKGMpOworICAgICAgICB9CisgICAgfQorfTwvcHJlPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvaGVsbG93b3JsZC5odG1sIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvaGVsbG93b3JsZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMjM0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9oZWxsb3dvcmxkLmh0bWwKQEAgLTAsMCArMSw1MCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJzZXJ2bGV0L0hlbGxvV29ybGRFeGFtcGxlIj48aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9ImluZGV4Lmh0bWwiPjxpbWcgc3JjPSJpbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+Cis8aDM+U291cmNlIENvZGUgZm9yIEhlbGxvV29ybGQgRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48YnI+CisgIDwvZm9udD4gPC9oMz4KKzxmb250IGNvbG9yPSIjMDAwMEZGIj48L2ZvbnQ+Cis8cHJlPjxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmEuaW8uKjsKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmF4LnNlcnZsZXQuKjsKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+cHVibGljIGNsYXNzPC9mb250PiBIZWxsb1dvcmxkIDxmb250IGNvbG9yPSIjMDAwMEZGIj5leHRlbmRzPC9mb250PiBIdHRwU2VydmxldCB7CisKKyAgICA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+cHVibGljIHZvaWQ8L2ZvbnQ+IGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgIDxmb250IGNvbG9yPSIjMDAwMEZGIj50aHJvd3M8L2ZvbnQ+IElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+dGV4dC9odG1sPC9mb250PiZxdW90Oyk7CisgICAgICAgIFByaW50V3JpdGVyIG91dCA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0O2h0bWwmZ3Q7PC9mb250PiZxdW90Oyk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4mbHQ7aGVhZCZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDt0aXRsZSZndDtIZWxsbyBXb3JsZCEmbHQ7L3RpdGxlJmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0Oy9oZWFkJmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0O2JvZHkmZ3Q7PC9mb250PiZxdW90Oyk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4mbHQ7aDEmZ3Q7SGVsbG8gV29ybGQhJmx0Oy9oMSZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDsvYm9keSZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDsvaHRtbCZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICB9Cit9PC9wcmU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9pbWFnZXMvY29kZS5naWYgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9pbWFnZXMvY29kZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhZjJjZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL2ltYWdlcy9jb2RlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9pbWFnZXMvZXhlY3V0ZS5naWYgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9pbWFnZXMvZXhlY3V0ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0ZDcwZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL2ltYWdlcy9leGVjdXRlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9pbWFnZXMvcmV0dXJuLmdpZiBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL2ltYWdlcy9yZXR1cm4uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNGY2OGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9pbWFnZXMvcmV0dXJuLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9pbmRleC5odG1sIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTMxNTVhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvaW5kZXguaHRtbApAQCAtMCwwICsxLDEyMSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNjEgW2VuXSAoV2luTlQ7IEkpIFtOZXRzY2FwZV0iPgorICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJBbmlsIEsuIFZpamVuZHJhbiI+CisgICA8dGl0bGU+U2VydmxldCBFeGFtcGxlczwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxiPjxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiPjxmb250IHNpemU9KzI+U2VydmxldAorRXhhbXBsZXMgd2l0aCBDb2RlPC9mb250PjwvZm9udD48L2I+Cis8cD5UaGlzIGlzIGEgY29sbGVjdGlvbiBvZiBleGFtcGxlcyB3aGljaCBkZW1vbnN0cmF0ZSBzb21lIG9mIHRoZSBtb3JlCitmcmVxdWVudGx5IHVzZWQgcGFydHMgb2YgdGhlIFNlcnZsZXQgQVBJLiBGYW1pbGlhcml0eSB3aXRoIHRoZSBKYXZhKHRtKQorUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgaXMgYXNzdW1lZC4KKzxwPlRoZXNlIGV4YW1wbGVzIHdpbGwgb25seSB3b3JrIHdoZW4gdmlld2VkIHZpYSBhbiBodHRwIFVSTC4gVGhleSB3aWxsCitub3Qgd29yayBpZiB5b3UgYXJlIHZpZXdpbmcgdGhlc2UgcGFnZXMgdmlhIGEgImZpbGU6Ly8uLi4iIFVSTC4gUGxlYXNlCityZWZlciB0byB0aGUgPGk+UkVBRE1FPC9pPiBmaWxlIHByb3ZpZGUgd2l0aCB0aGlzIFRvbWNhdCByZWxlYXNlIHJlZ2FyZGluZworaG93IHRvIGNvbmZpZ3VyZSBhbmQgc3RhcnQgdGhlIHByb3ZpZGVkIHdlYiBzZXJ2ZXIuCis8cD5XaGVyZXZlciB5b3Ugc2VlIGEgZm9ybSwgZW50ZXIgc29tZSBkYXRhIGFuZCBzZWUgaG93IHRoZSBzZXJ2bGV0IHJlYWN0cy4KK1doZW4gcGxheWluZyB3aXRoIHRoZSBDb29raWUgYW5kIFNlc3Npb24gRXhhbXBsZXMsIGp1bXAgYmFjayB0byB0aGUgSGVhZGVycworRXhhbXBsZSB0byBzZWUgZXhhY3RseSB3aGF0IHlvdXIgYnJvd3NlciBpcyBzZW5kaW5nIHRoZSBzZXJ2ZXIuCis8cD5UbyBuYXZpZ2F0ZSB5b3VyIHdheSB0aHJvdWdoIHRoZSBleGFtcGxlcywgdGhlIGZvbGxvd2luZyBpY29ucyB3aWxsCitoZWxwOgorPGJyPiZuYnNwOworPHRhYmxlIEJPUkRFUj0wIENFTExTUEFDSU5HPTUgV0lEVEg9Ijg1JSIgPgorPHRyIFZBTElHTj1UT1A+Cis8dGQgV0lEVEg9IjMwIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiA+PC90ZD4KKworPHRkPkV4ZWN1dGUgdGhlIGV4YW1wbGU8L3RkPgorPC90cj4KKworPHRyIFZBTElHTj1UT1A+Cis8dGQgV0lEVEg9IjMwIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBoZWlnaHQ9MjQgd2lkdGg9MjQ+PC90ZD4KKworPHRkPkxvb2sgYXQgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgZXhhbXBsZTwvdGQ+Cis8L3RyPgorCis8dHIgVkFMSUdOPVRPUD4KKzx0ZCBXSURUSD0iMzAiPjxpbWcgU1JDPSJpbWFnZXMvcmV0dXJuLmdpZiIgaGVpZ2h0PTI0IHdpZHRoPTI0PjwvdGQ+CisKKzx0ZD5SZXR1cm4gdG8gdGhpcyBzY3JlZW48L3RkPgorPC90cj4KKzwvdGFibGU+CisKKzxwPlRpcDogVG8gc2VlIHRoZSBjb29raWUgaW50ZXJhY3Rpb25zIHdpdGggeW91ciBicm93c2VyLCB0cnkgdHVybmluZyBvbgordGhlICJub3RpZnkgd2hlbiBzZXR0aW5nIGEgY29va2llIiBvcHRpb24gaW4geW91ciBicm93c2VyIHByZWZlcmVuY2VzLgorVGhpcyB3aWxsIGxldCB5b3Ugc2VlIHdoZW4gYSBzZXNzaW9uIGlzIGNyZWF0ZWQgYW5kIGdpdmUgc29tZSBmZWVkYmFjaword2hlbiBsb29raW5nIGF0IHRoZSBjb29raWUgZGVtby4KKzxicj4mbmJzcDsKKzx0YWJsZSBCT1JERVI9MCBDRUxMU1BBQ0lORz01IFdJRFRIPSI4NSUiID4KKzx0ciBWQUxJR049VE9QPgorPHRkPkhlbGxvIFdvcmxkPC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9IjMwJSI+PGEgaHJlZj0ic2VydmxldC9IZWxsb1dvcmxkRXhhbXBsZSI+PGltZyBTUkM9ImltYWdlcy9leGVjdXRlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgIGFsaWduPVRPUD48L2E+PGEgaHJlZj0ic2VydmxldC9IZWxsb1dvcmxkRXhhbXBsZSI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0iaGVsbG93b3JsZC5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJoZWxsb3dvcmxkLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIFZBTElHTj1UT1A+Cis8dGQ+UmVxdWVzdCBJbmZvPC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9InNlcnZsZXQvUmVxdWVzdEluZm9FeGFtcGxlIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCAgYWxpZ249VE9QPjwvYT48YSBocmVmPSJzZXJ2bGV0L1JlcXVlc3RJbmZvRXhhbXBsZSI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0icmVxaW5mby5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJyZXFpbmZvLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIFZBTElHTj1UT1A+Cis8dGQ+UmVxdWVzdCBIZWFkZXJzPC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9InNlcnZsZXQvUmVxdWVzdEhlYWRlckV4YW1wbGUiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InNlcnZsZXQvUmVxdWVzdEhlYWRlckV4YW1wbGUiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9InJlcWhlYWRlcnMuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0icmVxaGVhZGVycy5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciBWQUxJR049VE9QPgorPHRkPlJlcXVlc3QgUGFyYW1ldGVyczwvdGQ+CisKKzx0ZCBXSURUSD0iMzAlIj48YSBocmVmPSJzZXJ2bGV0L1JlcXVlc3RQYXJhbUV4YW1wbGUiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InNlcnZsZXQvUmVxdWVzdFBhcmFtRXhhbXBsZSI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0icmVxcGFyYW1zLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InJlcXBhcmFtcy5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciBWQUxJR049VE9QPgorPHRkPkNvb2tpZXM8L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0ic2VydmxldC9Db29raWVFeGFtcGxlIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCAgYWxpZ249VE9QPjwvYT48YSBocmVmPSJzZXJ2bGV0L0Nvb2tpZUV4YW1wbGUiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9ImNvb2tpZXMuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0iY29va2llcy5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciBWQUxJR049VE9QPgorPHRkPlNlc3Npb25zPC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9InNlcnZsZXQvU2Vzc2lvbkV4YW1wbGUiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InNlcnZsZXQvU2Vzc2lvbkV4YW1wbGUiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9InNlc3Npb25zLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InNlc3Npb25zLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKzwvdGFibGU+CisKKzxwPk5vdGU6IFRoZSBzb3VyY2UgY29kZSBmb3IgdGhlc2UgZXhhbXBsZXMgZG9lcyBub3QgY29udGFpbiBhbGwgb2YgdGhlCitzb3VyY2UgY29kZSB0aGF0IGlzIGFjdHVhbGx5IGluIHRoZSBleGFtcGxlLCBvbmx5IHRoZSBpbXBvcnRhbnQgc2VjdGlvbnMKK29mIGNvZGUuIENvZGUgbm90IGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHRoZSBleGFtcGxlIGhhcyBiZWVuIHJlbW92ZWQKK2ZvciBjbGFyaXR5LgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvcmVxaGVhZGVycy5odG1sIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvcmVxaGVhZGVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZGEzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9yZXFoZWFkZXJzLmh0bWwKQEAgLTAsMCArMSw0OSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJzZXJ2bGV0L1JlcXVlc3RIZWFkZXJFeGFtcGxlIj48aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9ImluZGV4Lmh0bWwiPjxpbWcgc3JjPSJpbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+Cis8aDM+U291cmNlIENvZGUgZm9yIFJlcXVlc3RIZWFkZXIgRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48YnI+CisgIDwvZm9udD4gPC9oMz4KKzxmb250IGNvbG9yPSIjMDAwMEZGIj48L2ZvbnQ+Cis8cHJlPjxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmEuaW8uKjsKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmEudXRpbC4qOworPGZvbnQgY29sb3I9IiMwMDAwRkYiPmltcG9ydDwvZm9udD4gamF2YXguc2VydmxldC4qOworPGZvbnQgY29sb3I9IiMwMDAwRkYiPmltcG9ydDwvZm9udD4gamF2YXguc2VydmxldC5odHRwLio7CisKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5wdWJsaWMgY2xhc3M8L2ZvbnQ+IFJlcXVlc3RIZWFkZXJFeGFtcGxlIDxmb250IGNvbG9yPSIjMDAwMEZGIj5leHRlbmRzPC9mb250PiBIdHRwU2VydmxldCB7CisKKyAgICA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+cHVibGljIHZvaWQ8L2ZvbnQ+IGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgIDxmb250IGNvbG9yPSIjMDAwMEZGIj50aHJvd3M8L2ZvbnQ+IElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+dGV4dC9odG1sPC9mb250PiZxdW90Oyk7CisgICAgICAgIFByaW50V3JpdGVyIG91dCA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBFbnVtZXJhdGlvbiBlID0gcmVxdWVzdC5nZXRIZWFkZXJOYW1lcygpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHJlcXVlc3QuZ2V0SGVhZGVyKG5hbWUpOworICAgICAgICAgICAgb3V0LnByaW50bG4obmFtZSArICZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4gPSA8L2ZvbnQ+JnF1b3Q7ICsgdmFsdWUpOworICAgICAgICB9CisgICAgfQorfTwvcHJlPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvcmVxaW5mby5odG1sIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvcmVxaW5mby5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZWM0OWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9yZXFpbmZvLmh0bWwKQEAgLTAsMCArMSw2OCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJzZXJ2bGV0L1JlcXVlc3RJbmZvRXhhbXBsZSI+PGltZyBzcmM9ImltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSJpbmRleC5odG1sIj48aW1nIHNyYz0iaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorPGgzPlNvdXJjZSBDb2RlIGZvciBSZXF1ZXN0IEluZm8gRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48YnI+CisgIDwvZm9udD4gPC9oMz4KKzxmb250IGNvbG9yPSIjMDAwMEZGIj48L2ZvbnQ+IAorPHByZT48Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW1wb3J0PC9mb250PiBqYXZhLmlvLio7Cis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW1wb3J0PC9mb250PiBqYXZheC5zZXJ2bGV0Lio7Cis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW1wb3J0PC9mb250PiBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworPGZvbnQgY29sb3I9IiMwMDAwRkYiPnB1YmxpYyBjbGFzczwvZm9udD4gUmVxdWVzdEluZm8gPGZvbnQgY29sb3I9IiMwMDAwRkYiPmV4dGVuZHM8L2ZvbnQ+IEh0dHBTZXJ2bGV0IHsKKworICAgIDxmb250IGNvbG9yPSIjMDAwMEZGIj5wdWJsaWMgdm9pZDwvZm9udD4gZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgPGZvbnQgY29sb3I9IiMwMDAwRkYiPnRocm93czwvZm9udD4gSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj50ZXh0L2h0bWw8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4mbHQ7aHRtbCZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDtib2R5Jmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0O2hlYWQmZ3Q7PC9mb250PiZxdW90Oyk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4mbHQ7dGl0bGUmZ3Q7UmVxdWVzdCBJbmZvcm1hdGlvbiBFeGFtcGxlJmx0Oy90aXRsZSZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDsvaGVhZCZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDtib2R5Jmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0O2gzJmd0O1JlcXVlc3QgSW5mb3JtYXRpb24gRXhhbXBsZSZsdDsvaDMmZ3Q7PC9mb250PiZxdW90Oyk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj5NZXRob2Q6IDwvZm9udD4mcXVvdDsgKyByZXF1ZXN0LmdldE1ldGhvZCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPlJlcXVlc3QgVVJJOiA8L2ZvbnQ+JnF1b3Q7ICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+UHJvdG9jb2w6IDwvZm9udD4mcXVvdDsgKyByZXF1ZXN0LmdldFByb3RvY29sKCkpOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+UGF0aEluZm86IDwvZm9udD4mcXVvdDsgKyByZXF1ZXN0LmdldFBhdGhJbmZvKCkpOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+UmVtb3RlIEFkZHJlc3M6IDwvZm9udD4mcXVvdDsgKyByZXF1ZXN0LmdldFJlbW90ZUFkZHIoKSk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4mbHQ7L2JvZHkmZ3Q7PC9mb250PiZxdW90Oyk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4mbHQ7L2h0bWwmZ3Q7PC9mb250PiZxdW90Oyk7CisgICAgfQorCis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+ICAgIC8qKgorICAgICAqIFdlIGFyZSBnb2luZyB0byBwZXJmb3JtIHRoZSBzYW1lIG9wZXJhdGlvbnMgZm9yIFBPU1QgcmVxdWVzdHMKKyAgICAgKiBhcyBmb3IgR0VUIG1ldGhvZHMsIHNvIHRoaXMgbWV0aG9kIGp1c3Qgc2VuZHMgdGhlIHJlcXVlc3QgdG8KKyAgICAgKiB0aGUgZG9HZXQgbWV0aG9kLgorICAgICAqLzwvZm9udD4KKworICAgIDxmb250IGNvbG9yPSIjMDAwMEZGIj5wdWJsaWMgdm9pZDwvZm9udD4gZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgIDxmb250IGNvbG9yPSIjMDAwMEZGIj50aHJvd3M8L2ZvbnQ+IElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICBkb0dldChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorfTwvcHJlPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvcmVxcGFyYW1zLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9yZXFwYXJhbXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGNkZjBkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvcmVxcGFyYW1zLmh0bWwKQEAgLTAsMCArMSw3OCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJzZXJ2bGV0L1JlcXVlc3RQYXJhbUV4YW1wbGUiPjxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PGEgaHJlZj0iaW5kZXguaHRtbCI+PGltZyBzcmM9ImltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKzxoMz5Tb3VyY2UgQ29kZSBmb3IgUmVxdWVzdCBQYXJhbWV0ZXIgRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48YnI+CisgIDwvZm9udD4gPC9oMz4KKzxmb250IGNvbG9yPSIjMDAwMEZGIj48L2ZvbnQ+IAorPHByZT48Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW1wb3J0PC9mb250PiBqYXZhLmlvLio7Cis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW1wb3J0PC9mb250PiBqYXZhLnV0aWwuKjsKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmF4LnNlcnZsZXQuKjsKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+cHVibGljIGNsYXNzPC9mb250PiBSZXF1ZXN0UGFyYW1FeGFtcGxlIDxmb250IGNvbG9yPSIjMDAwMEZGIj5leHRlbmRzPC9mb250PiBIdHRwU2VydmxldCB7CisKKyAgICA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+cHVibGljIHZvaWQ8L2ZvbnQ+IGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgIDxmb250IGNvbG9yPSIjMDAwMEZGIj50aHJvd3M8L2ZvbnQ+IElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+dGV4dC9odG1sPC9mb250PiZxdW90Oyk7CisgICAgICAgIFByaW50V3JpdGVyIG91dCA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0O2h0bWwmZ3Q7PC9mb250PiZxdW90Oyk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4mbHQ7aGVhZCZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDt0aXRsZSZndDtSZXF1ZXN0IFBhcmFtZXRlcnMgRXhhbXBsZSZsdDsvdGl0bGUmZ3Q7PC9mb250PiZxdW90Oyk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4mbHQ7L2hlYWQmZ3Q7PC9mb250PiZxdW90Oyk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4mbHQ7Ym9keSZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDtoMyZndDtSZXF1ZXN0IFBhcmFtZXRlcnMgRXhhbXBsZSZsdDsvaDMmZ3Q7PC9mb250PiZxdW90Oyk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj5QYXJhbWV0ZXJzIGluIHRoaXMgcmVxdWVzdDombHQ7YnImZ3Q7PC9mb250PiZxdW90Oyk7CisgICAgICAgIGlmIChmaXJzdE5hbWUgIT0gbnVsbCB8fCBsYXN0TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Rmlyc3QgTmFtZTo8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4gPSA8L2ZvbnQ+JnF1b3Q7ICsgSFRNTEZpbHRlci5maWx0ZXIoZmlyc3ROYW1lKSArICZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4mbHQ7YnImZ3Q7PC9mb250PiZxdW90Oyk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+TGFzdCBOYW1lOjwvZm9udD4mcXVvdDspOworICAgICAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiA9IDwvZm9udD4mcXVvdDsgKyBIVE1MRmlsdGVyLmZpbHRlcihsYXN0TmFtZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPk5vIFBhcmFtZXRlcnMsIFBsZWFzZSBlbnRlciBzb21lPC9mb250PiZxdW90Oyk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDtQJmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnQoJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDtmb3JtIGFjdGlvbj1cIjwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnQoJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPlJlcXVlc3RQYXJhbUV4YW1wbGVcIiA8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPm1ldGhvZD1QT1NUJmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Rmlyc3QgTmFtZTo8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDtpbnB1dCB0eXBlPXRleHQgc2l6ZT0yMCBuYW1lPWZpcnN0bmFtZSZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDticiZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPkxhc3QgTmFtZTo8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDtpbnB1dCB0eXBlPXRleHQgc2l6ZT0yMCBuYW1lPWxhc3RuYW1lJmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0O2JyJmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0O2lucHV0IHR5cGU9c3VibWl0Jmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0Oy9mb3JtJmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0Oy9ib2R5Jmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0Oy9odG1sJmd0OzwvZm9udD4mcXVvdDspOworICAgIH0KKworICAgIDxmb250IGNvbG9yPSIjMDAwMEZGIj5wdWJsaWMgdm9pZDwvZm9udD4gZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKKyAgICA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+dGhyb3dzPC9mb250PiBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZG9HZXQocmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0KK308L3ByZT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL3Nlc3Npb25zLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9zZXNzaW9ucy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MmQ0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9zZXNzaW9ucy5odG1sCkBAIC0wLDAgKzEsNzAgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0ic2VydmxldC9TZXNzaW9uRXhhbXBsZSI+PGltZyBzcmM9ImltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSJpbmRleC5odG1sIj48aW1nIHNyYz0iaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorPGgzPlNvdXJjZSBDb2RlIGZvciBTZXNzaW9uIEV4YW1wbGU8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGJyPgorICA8L2ZvbnQ+IDwvaDM+Cis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9mb250PiAKKzxwcmU+PGZvbnQgY29sb3I9IiMwMDAwRkYiPmltcG9ydDwvZm9udD4gamF2YS5pby4qOworPGZvbnQgY29sb3I9IiMwMDAwRkYiPmltcG9ydDwvZm9udD4gamF2YS51dGlsLio7Cis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW1wb3J0PC9mb250PiBqYXZheC5zZXJ2bGV0Lio7Cis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW1wb3J0PC9mb250PiBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworPGZvbnQgY29sb3I9IiMwMDAwRkYiPnB1YmxpYyBjbGFzczwvZm9udD4gU2Vzc2lvbkV4YW1wbGUgPGZvbnQgY29sb3I9IiMwMDAwRkYiPmV4dGVuZHM8L2ZvbnQ+IEh0dHBTZXJ2bGV0IHsKKworICAgIDxmb250IGNvbG9yPSIjMDAwMEZGIj5wdWJsaWMgdm9pZDwvZm9udD4gZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgPGZvbnQgY29sb3I9IiMwMDAwRkYiPnRocm93czwvZm9udD4gSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj50ZXh0L2h0bWw8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKHRydWUpOworCisgICAgICAgIDxmb250IGNvbG9yPSIjQ0MwMDAwIj4vLyBwcmludCBzZXNzaW9uIGluZm88L2ZvbnQ+CisKKyAgICAgICAgRGF0ZSBjcmVhdGVkID0gbmV3IERhdGUoc2Vzc2lvbi5nZXRDcmVhdGlvblRpbWUoKSk7CisgICAgICAgIERhdGUgYWNjZXNzZWQgPSBuZXcgRGF0ZShzZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWUoKSk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj5JRCA8L2ZvbnQ+JnF1b3Q7ICsgc2Vzc2lvbi5nZXRJZCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPkNyZWF0ZWQ6IDwvZm9udD4mcXVvdDsgKyBjcmVhdGVkKTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPkxhc3QgQWNjZXNzZWQ6IDwvZm9udD4mcXVvdDsgKyBhY2Nlc3NlZCk7CisKKyAgICAgICAgPGZvbnQgY29sb3I9IiNDQzAwMDAiPi8vIHNldCBzZXNzaW9uIGluZm8gaWYgbmVlZGVkPC9mb250PgorCisgICAgICAgIFN0cmluZyBkYXRhTmFtZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj5kYXRhTmFtZTwvZm9udD4mcXVvdDspOworICAgICAgICBpZiAoZGF0YU5hbWUgIT0gbnVsbCAmYW1wOyZhbXA7IGRhdGFOYW1lLmxlbmd0aCgpICZndDsgMCkgeworICAgICAgICAgICAgU3RyaW5nIGRhdGFWYWx1ZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj5kYXRhVmFsdWU8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKGRhdGFOYW1lLCBkYXRhVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJpbnQgc2Vzc2lvbiBjb250ZW50cworCisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBzZXNzaW9uLmdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gc2Vzc2lvbi5nZXRBdHRyaWJ1dGUobmFtZSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKG5hbWUgKyAmcXVvdDsgPGZvbnQgY29sb3I9IiMwMDk5MDAiPj0gPC9mb250PiZxdW90OyArIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK308L3ByZT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9ldGMvbWFuaWZlc3QgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvZXRjL21hbmlmZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNTc2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvZXRjL21hbmlmZXN0CkBAIC0wLDAgKzEsMTAgQEAKK01hbmlmZXN0LXZlcnNpb246IDEuMAorCitOYW1lOiBqYXZheC9zZXJ2bGV0LworU3BlY2lmaWNhdGlvbi1UaXRsZTogSmF2YSBBUEkgZm9yIFNlcnZsZXRzCitTcGVjaWZpY2F0aW9uLVZlcnNpb246IDIuNAorU3BlY2lmaWNhdGlvbi1WZW5kb3I6IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KK0ltcGxlbWVudGF0aW9uLVRpdGxlOiBqYXZheC5zZXJ2bGV0CitJbXBsZW1lbnRhdGlvbi1WZXJzaW9uOiAyLjQuQGltcGxlbWVudGF0aW9uLnJldmlzaW9uQAorSW1wbGVtZW50YXRpb24tVmVuZG9yOiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL1hNTFNjaGVtYS5kdGQgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL1hNTFNjaGVtYS5kdGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyNTYwMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvWE1MU2NoZW1hLmR0ZApAQCAtMCwwICsxLDQxOCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIERURCBmb3IgWE1MIFNjaGVtYXM6IFBhcnQgMTogU3RydWN0dXJlcworICAgICBQdWJsaWMgSWRlbnRpZmllcjogIi0vL1czQy8vRFREIFhNTFNDSEVNQSAyMDAxMDIvL0VOIgorICAgICBPZmZpY2lhbCBMb2NhdGlvbjogaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEuZHRkIC0tPgorPCEtLSAkSWQkIC0tPgorPCEtLSBOb3RlIHRoaXMgRFREIGlzIE5PVCBub3JtYXRpdmUsIG9yIGV2ZW4gZGVmaW5pdGl2ZS4gLS0+ICAgICAgICAgICA8IS0tZC0tPgorPCEtLSBwcm9zZSBjb3B5IGluIHRoZSBzdHJ1Y3R1cmVzIFJFQyBpcyB0aGUgZGVmaW5pdGl2ZSB2ZXJzaW9uIC0tPiAgICA8IS0tZC0tPgorPCEtLSAod2hpY2ggc2hvdWxkbid0IGRpZmZlciBmcm9tIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhpcyAtLT4gICAgICAgICA8IS0tZC0tPgorPCEtLSBjb21tZW50IGFuZCBlbnRpdHkgZXhwYW5zaW9ucywgYnV0IGp1c3QgaW4gY2FzZSkgLS0+ICAgICAgICAgICAgICA8IS0tZC0tPgorPCEtLSBXaXRoIHRoZSBleGNlcHRpb24gb2YgY2FzZXMgd2l0aCBtdWx0aXBsZSBuYW1lc3BhY2UKKyAgICAgcHJlZml4ZXMgZm9yIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZSwgYW55IFhNTCBkb2N1bWVudCB3aGljaCBpcworICAgICBub3QgdmFsaWQgcGVyIHRoaXMgRFREIGdpdmVuIHJlZGVmaW5pdGlvbnMgaW4gaXRzIGludGVybmFsIHN1YnNldCBvZiB0aGUKKyAgICAgJ3AnIGFuZCAncycgcGFyYW1ldGVyIGVudGl0aWVzIGJlbG93IGFwcHJvcHJpYXRlIHRvIGl0cyBuYW1lc3BhY2UKKyAgICAgZGVjbGFyYXRpb24gb2YgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlIGlzIGFsbW9zdCBjZXJ0YWlubHkgbm90CisgICAgIGEgdmFsaWQgc2NoZW1hLiAtLT4KKworPCEtLSBUaGUgc2ltcGxlVHlwZSBlbGVtZW50IGFuZCBpdHMgY29uc3RpdHVlbnQgcGFydHMKKyAgICAgYXJlIGRlZmluZWQgaW4gWE1MIFNjaGVtYTogUGFydCAyOiBEYXRhdHlwZXMgLS0+Cis8IUVOVElUWSAlIHhzLWRhdGF0eXBlcyBQVUJMSUMgJ2RhdGF0eXBlcycgJ2RhdGF0eXBlcy5kdGQnID4KKworPCFFTlRJVFkgJSBwICd4czonPiA8IS0tIGNhbiBiZSBvdmVycmlkZW4gaW4gdGhlIGludGVybmFsIHN1YnNldCBvZiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hIGRvY3VtZW50IHRvIGVzdGFibGlzaCBhIGRpZmZlcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBwcmVmaXggLS0+Cis8IUVOVElUWSAlIHMgJzp4cyc+IDwhLS0gaWYgJXAgaXMgZGVmaW5lZCAoZS5nLiBhcyBmb286KSB0aGVuIHlvdSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgYWxzbyBkZWZpbmUgJXMgYXMgdGhlIHN1ZmZpeCBmb3IgdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIChlLmcuIDpmb28pIC0tPgorPCFFTlRJVFkgJSBuZHMgJ3htbG5zJXM7Jz4KKworPCEtLSBEZWZpbmUgYWxsIHRoZSBlbGVtZW50IG5hbWVzLCB3aXRoIG9wdGlvbmFsIHByZWZpeCAtLT4KKzwhRU5USVRZICUgc2NoZW1hICIlcDtzY2hlbWEiPgorPCFFTlRJVFkgJSBjb21wbGV4VHlwZSAiJXA7Y29tcGxleFR5cGUiPgorPCFFTlRJVFkgJSBjb21wbGV4Q29udGVudCAiJXA7Y29tcGxleENvbnRlbnQiPgorPCFFTlRJVFkgJSBzaW1wbGVDb250ZW50ICIlcDtzaW1wbGVDb250ZW50Ij4KKzwhRU5USVRZICUgZXh0ZW5zaW9uICIlcDtleHRlbnNpb24iPgorPCFFTlRJVFkgJSBlbGVtZW50ICIlcDtlbGVtZW50Ij4KKzwhRU5USVRZICUgdW5pcXVlICIlcDt1bmlxdWUiPgorPCFFTlRJVFkgJSBrZXkgIiVwO2tleSI+Cis8IUVOVElUWSAlIGtleXJlZiAiJXA7a2V5cmVmIj4KKzwhRU5USVRZICUgc2VsZWN0b3IgIiVwO3NlbGVjdG9yIj4KKzwhRU5USVRZICUgZmllbGQgIiVwO2ZpZWxkIj4KKzwhRU5USVRZICUgZ3JvdXAgIiVwO2dyb3VwIj4KKzwhRU5USVRZICUgYWxsICIlcDthbGwiPgorPCFFTlRJVFkgJSBjaG9pY2UgIiVwO2Nob2ljZSI+Cis8IUVOVElUWSAlIHNlcXVlbmNlICIlcDtzZXF1ZW5jZSI+Cis8IUVOVElUWSAlIGFueSAiJXA7YW55Ij4KKzwhRU5USVRZICUgYW55QXR0cmlidXRlICIlcDthbnlBdHRyaWJ1dGUiPgorPCFFTlRJVFkgJSBhdHRyaWJ1dGUgIiVwO2F0dHJpYnV0ZSI+Cis8IUVOVElUWSAlIGF0dHJpYnV0ZUdyb3VwICIlcDthdHRyaWJ1dGVHcm91cCI+Cis8IUVOVElUWSAlIGluY2x1ZGUgIiVwO2luY2x1ZGUiPgorPCFFTlRJVFkgJSBpbXBvcnQgIiVwO2ltcG9ydCI+Cis8IUVOVElUWSAlIHJlZGVmaW5lICIlcDtyZWRlZmluZSI+Cis8IUVOVElUWSAlIG5vdGF0aW9uICIlcDtub3RhdGlvbiI+CisKKzwhLS0gYW5ub3RhdGlvbiBlbGVtZW50cyAtLT4KKzwhRU5USVRZICUgYW5ub3RhdGlvbiAiJXA7YW5ub3RhdGlvbiI+Cis8IUVOVElUWSAlIGFwcGluZm8gIiVwO2FwcGluZm8iPgorPCFFTlRJVFkgJSBkb2N1bWVudGF0aW9uICIlcDtkb2N1bWVudGF0aW9uIj4KKworPCEtLSBDdXN0b21pc2F0aW9uIGVudGl0aWVzIGZvciB0aGUgQVRUTElTVCBvZiBlYWNoIGVsZW1lbnQgdHlwZS4KKyAgICAgRGVmaW5lIG9uZSBvZiB0aGVzZSBpZiB5b3VyIHNjaGVtYSB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlCisgICAgIGFueUF0dHJpYnV0ZT0nIyNvdGhlcicgaW4gdGhlIHNjaGVtYSBmb3Igc2NoZW1hcyAtLT4KKworPCFFTlRJVFkgJSBzY2hlbWFBdHRycyAnJz4KKzwhRU5USVRZICUgY29tcGxleFR5cGVBdHRycyAnJz4KKzwhRU5USVRZICUgY29tcGxleENvbnRlbnRBdHRycyAnJz4KKzwhRU5USVRZICUgc2ltcGxlQ29udGVudEF0dHJzICcnPgorPCFFTlRJVFkgJSBleHRlbnNpb25BdHRycyAnJz4KKzwhRU5USVRZICUgZWxlbWVudEF0dHJzICcnPgorPCFFTlRJVFkgJSBncm91cEF0dHJzICcnPgorPCFFTlRJVFkgJSBhbGxBdHRycyAnJz4KKzwhRU5USVRZICUgY2hvaWNlQXR0cnMgJyc+Cis8IUVOVElUWSAlIHNlcXVlbmNlQXR0cnMgJyc+Cis8IUVOVElUWSAlIGFueUF0dHJzICcnPgorPCFFTlRJVFkgJSBhbnlBdHRyaWJ1dGVBdHRycyAnJz4KKzwhRU5USVRZICUgYXR0cmlidXRlQXR0cnMgJyc+Cis8IUVOVElUWSAlIGF0dHJpYnV0ZUdyb3VwQXR0cnMgJyc+Cis8IUVOVElUWSAlIHVuaXF1ZUF0dHJzICcnPgorPCFFTlRJVFkgJSBrZXlBdHRycyAnJz4KKzwhRU5USVRZICUga2V5cmVmQXR0cnMgJyc+Cis8IUVOVElUWSAlIHNlbGVjdG9yQXR0cnMgJyc+Cis8IUVOVElUWSAlIGZpZWxkQXR0cnMgJyc+Cis8IUVOVElUWSAlIGluY2x1ZGVBdHRycyAnJz4KKzwhRU5USVRZICUgaW1wb3J0QXR0cnMgJyc+Cis8IUVOVElUWSAlIHJlZGVmaW5lQXR0cnMgJyc+Cis8IUVOVElUWSAlIG5vdGF0aW9uQXR0cnMgJyc+Cis8IUVOVElUWSAlIGFubm90YXRpb25BdHRycyAnJz4KKzwhRU5USVRZICUgYXBwaW5mb0F0dHJzICcnPgorPCFFTlRJVFkgJSBkb2N1bWVudGF0aW9uQXR0cnMgJyc+CisKKzwhRU5USVRZICUgY29tcGxleERlcml2YXRpb25TZXQgIkNEQVRBIj4KKyAgICAgIDwhLS0gI2FsbCBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBkcmF3biBmcm9tIGRlcml2YXRpb25DaG9pY2UgLS0+Cis8IUVOVElUWSAlIGJsb2NrU2V0ICJDREFUQSI+CisgICAgICA8IS0tICNhbGwgb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3QgZHJhd24gZnJvbQorICAgICAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25DaG9pY2UgKyAnc3Vic3RpdHV0aW9uJyAtLT4KKworPCFFTlRJVFkgJSBtZ3MgJyVhbGw7IHwgJWNob2ljZTsgfCAlc2VxdWVuY2U7Jz4KKzwhRU5USVRZICUgY3MgJyVjaG9pY2U7IHwgJXNlcXVlbmNlOyc+Cis8IUVOVElUWSAlIGZvcm1WYWx1ZXMgJyhxdWFsaWZpZWR8dW5xdWFsaWZpZWQpJz4KKworCis8IUVOVElUWSAlIGF0dHJEZWNscyAgICAnKCglYXR0cmlidXRlO3wgJWF0dHJpYnV0ZUdyb3VwOykqLCglYW55QXR0cmlidXRlOyk/KSc+CisKKzwhRU5USVRZICUgcGFydGljbGVBbmRBdHRycyAnKCglbWdzOyB8ICVncm91cDspPywgJWF0dHJEZWNsczspJz4KKworPCEtLSBUaGlzIGlzIHVzZWQgaW4gcGFydDIgLS0+Cis8IUVOVElUWSAlIHJlc3RyaWN0aW9uMSAnKCglbWdzOyB8ICVncm91cDspPyknPgorCisleHMtZGF0YXR5cGVzOworCis8IS0tIHRoZSBkdXBsaWNhdGlvbiBiZWxvdyBpcyB0byBwcm9kdWNlIGFuIHVuYW1iaWd1b3VzIGNvbnRlbnQgbW9kZWwKKyAgICAgd2hpY2ggYWxsb3dzIGFubm90YXRpb24gZXZlcnl3aGVyZSAtLT4KKzwhRUxFTUVOVCAlc2NoZW1hOyAoKCVpbmNsdWRlOyB8ICVpbXBvcnQ7IHwgJXJlZGVmaW5lOyB8ICVhbm5vdGF0aW9uOykqLAorICAgICAgICAgICAgICAgICAgICAoKCVzaW1wbGVUeXBlOyB8ICVjb21wbGV4VHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICB8ICVlbGVtZW50OyB8ICVhdHRyaWJ1dGU7CisgICAgICAgICAgICAgICAgICAgICAgfCAlYXR0cmlidXRlR3JvdXA7IHwgJWdyb3VwOworICAgICAgICAgICAgICAgICAgICAgIHwgJW5vdGF0aW9uOyApLAorICAgICAgICAgICAgICAgICAgICAgKCVhbm5vdGF0aW9uOykqKSogKT4KKzwhQVRUTElTVCAlc2NoZW1hOworICAgdGFyZ2V0TmFtZXNwYWNlICAgICAgJVVSSXJlZjsgICAgICAgICAgICAgICAjSU1QTElFRAorICAgdmVyc2lvbiAgICAgICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgJW5kczsgICAgICAgICAgICAgICAgJVVSSXJlZjsgICAgICAgICAgICAgICAjRklYRUQgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJworICAgeG1sbnMgICAgICAgICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgZmluYWxEZWZhdWx0ICAgICAgICAgJWNvbXBsZXhEZXJpdmF0aW9uU2V0OyAnJworICAgYmxvY2tEZWZhdWx0ICAgICAgICAgJWJsb2NrU2V0OyAgICAgICAgICAgICAnJworICAgaWQgICAgICAgICAgICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgZWxlbWVudEZvcm1EZWZhdWx0ICAgJWZvcm1WYWx1ZXM7ICAgICAgICAgICAndW5xdWFsaWZpZWQnCisgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdCAlZm9ybVZhbHVlczsgICAgICAgICAgICd1bnF1YWxpZmllZCcKKyAgIHhtbDpsYW5nICAgICAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICVzY2hlbWFBdHRyczs+Cis8IS0tIE5vdGUgdGhlIHhtbG5zIGRlY2xhcmF0aW9uIGlzIE5PVCBpbiB0aGUgU2NoZW1hIGZvciBTY2hlbWFzLAorICAgICBiZWNhdXNlIGF0IHRoZSBJbmZvc2V0IGxldmVsIHdoZXJlIHNjaGVtYXMgb3BlcmF0ZSwKKyAgICAgeG1sbnMoOnByZWZpeCkgaXMgTk9UIGFuIGF0dHJpYnV0ZSEgLS0+Cis8IS0tIFRoZSBkZWNsYXJhdGlvbiBvZiB4bWxucyBpcyBhIGNvbnZlbmllbmNlIGZvciBzY2hlbWEgYXV0aG9ycyAtLT4KKyAKKzwhLS0gVGhlIGlkIGF0dHJpYnV0ZSBoZXJlIGFuZCBiZWxvdyBpcyBmb3IgdXNlIGluIGV4dGVybmFsIHJlZmVyZW5jZXMKKyAgICAgZnJvbSBub24tc2NoZW1hcyB1c2luZyBzaW1wbGUgZnJhZ21lbnQgaWRlbnRpZmllcnMuCisgICAgIEl0IGlzIE5PVCB1c2VkIGZvciBzY2hlbWEtdG8tc2NoZW1hIHJlZmVyZW5jZSwgaW50ZXJuYWwgb3IKKyAgICAgZXh0ZXJuYWwuIC0tPgorCis8IS0tIGEgdHlwZSBpcyBhIG5hbWVkIGNvbnRlbnQgdHlwZSBzcGVjaWZpY2F0aW9uIHdoaWNoIGFsbG93cyBhdHRyaWJ1dGUKKyAgICAgZGVjbGFyYXRpb25zLS0+Cis8IS0tIC0tPgorCis8IUVMRU1FTlQgJWNvbXBsZXhUeXBlOyAoKCVhbm5vdGF0aW9uOyk/LAorICAgICAgICAgICAgICAgICAgICAgICAgICglc2ltcGxlQ29udGVudDt8JWNvbXBsZXhDb250ZW50O3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJXBhcnRpY2xlQW5kQXR0cnM7KSk+CisKKzwhQVRUTElTVCAlY29tcGxleFR5cGU7CisgICAgICAgICAgbmFtZSAgICAgICVOQ05hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBpZCAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgIGFic3RyYWN0ICAlYm9vbGVhbjsgICAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgZmluYWwgICAgICVjb21wbGV4RGVyaXZhdGlvblNldDsgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBibG9jayAgICAgJWNvbXBsZXhEZXJpdmF0aW9uU2V0OyAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgIG1peGVkICh0cnVlfGZhbHNlKSAnZmFsc2UnCisgICAgICAgICAgJWNvbXBsZXhUeXBlQXR0cnM7PgorCis8IS0tIHBhcnRpY2xlQW5kQXR0cnMgaXMgc2hvcnRoYW5kIGZvciBhIHJvb3QgdHlwZSAtLT4KKzwhLS0gbWl4ZWQgaXMgZGlzYWxsb3dlZCBpZiBzaW1wbGVDb250ZW50LCBvdmVycmlkZW4gaWYgY29tcGxleENvbnRlbnQKKyAgICAgaGFzIG9uZSB0b28uIC0tPgorCis8IS0tIElmIGFueUF0dHJpYnV0ZSBhcHBlYXJzIGluIG9uZSBvciBtb3JlIHJlZmVyZW5jZWQgYXR0cmlidXRlR3JvdXBzCisgICAgIGFuZC9vciBleHBsaWNpdGx5LCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBwZXJtaXNzaW9ucyBpcyB1c2VkIC0tPgorCis8IUVMRU1FTlQgJWNvbXBsZXhDb250ZW50OyAoKCVhbm5vdGF0aW9uOyk/LCAoJXJlc3RyaWN0aW9uO3wlZXh0ZW5zaW9uOykpPgorPCFBVFRMSVNUICVjb21wbGV4Q29udGVudDsKKyAgICAgICAgICBtaXhlZCAodHJ1ZXxmYWxzZSkgI0lNUExJRUQKKyAgICAgICAgICBpZCAgICBJRCAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAlY29tcGxleENvbnRlbnRBdHRyczs+CisKKzwhLS0gcmVzdHJpY3Rpb24gc2hvdWxkIHVzZSB0aGUgYnJhbmNoIGRlZmluZWQgYWJvdmUsIG5vdCB0aGUgc2ltcGxlCisgICAgIG9uZSBmcm9tIHBhcnQyOyBleHRlbnNpb24gc2hvdWxkIHVzZSB0aGUgZnVsbCBtb2RlbCAgLS0+CisKKzwhRUxFTUVOVCAlc2ltcGxlQ29udGVudDsgKCglYW5ub3RhdGlvbjspPywgKCVyZXN0cmljdGlvbjt8JWV4dGVuc2lvbjspKT4KKzwhQVRUTElTVCAlc2ltcGxlQ29udGVudDsKKyAgICAgICAgICBpZCAgICBJRCAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAlc2ltcGxlQ29udGVudEF0dHJzOz4KKworPCEtLSByZXN0cmljdGlvbiBzaG91bGQgdXNlIHRoZSBzaW1wbGUgYnJhbmNoIGZyb20gcGFydDIsIG5vdCB0aGUgCisgICAgIG9uZSBkZWZpbmVkIGFib3ZlOyBleHRlbnNpb24gc2hvdWxkIGhhdmUgbm8gcGFydGljbGUgIC0tPgorCis8IUVMRU1FTlQgJWV4dGVuc2lvbjsgKCglYW5ub3RhdGlvbjspPywgKCVwYXJ0aWNsZUFuZEF0dHJzOykpPgorPCFBVFRMSVNUICVleHRlbnNpb247CisgICAgICAgICAgYmFzZSAgJVFOYW1lOyAgICAgICNSRVFVSVJFRAorICAgICAgICAgIGlkICAgIElEICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICVleHRlbnNpb25BdHRyczs+CisKKzwhLS0gYW4gZWxlbWVudCBpcyBkZWNsYXJlZCBieSBlaXRoZXI6CisgYSBuYW1lIGFuZCBhIHR5cGUgKGVpdGhlciBuZXN0ZWQgb3IgcmVmZXJlbmNlZCB2aWEgdGhlIHR5cGUgYXR0cmlidXRlKQorIG9yIGEgcmVmIHRvIGFuIGV4aXN0aW5nIGVsZW1lbnQgZGVjbGFyYXRpb24gLS0+CisKKzwhRUxFTUVOVCAlZWxlbWVudDsgKCglYW5ub3RhdGlvbjspPywgKCVjb21wbGV4VHlwZTt8ICVzaW1wbGVUeXBlOyk/LAorICAgICAgICAgICAgICAgICAgICAgKCV1bmlxdWU7IHwgJWtleTsgfCAla2V5cmVmOykqKT4KKzwhLS0gc2ltcGxlVHlwZSBvciBjb21wbGV4VHlwZSBvbmx5IGlmIG5vIHR5cGV8cmVmIGF0dHJpYnV0ZSAtLT4KKzwhLS0gcmVmIG5vdCBhbGxvd2VkIGF0IHRvcCBsZXZlbCAtLT4KKzwhQVRUTElTVCAlZWxlbWVudDsKKyAgICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAlTkNOYW1lOyAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgcmVmICAgICAgICAgICAgICAgICVRTmFtZTsgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAlUU5hbWU7ICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgICBtaW5PY2N1cnMgICAgICAgICAgJW5vbk5lZ2F0aXZlSW50ZWdlcjsgICAjSU1QTElFRAorICAgICAgICAgICAgbWF4T2NjdXJzICAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAgIG5pbGxhYmxlICAgICAgICAgICAlYm9vbGVhbjsgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgICBzdWJzdGl0dXRpb25Hcm91cCAgJVFOYW1lOyAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgYWJzdHJhY3QgICAgICAgICAgICVib29sZWFuOyAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAgIGZpbmFsICAgICAgICAgICAgICAlY29tcGxleERlcml2YXRpb25TZXQ7ICNJTVBMSUVECisgICAgICAgICAgICBibG9jayAgICAgICAgICAgICAgJWJsb2NrU2V0OyAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgZGVmYXVsdCAgICAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAgIGZpeGVkICAgICAgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgICBmb3JtICAgICAgICAgICAgICAgJWZvcm1WYWx1ZXM7ICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgJWVsZW1lbnRBdHRyczs+Cis8IS0tIHR5cGUgYW5kIHJlZiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorICAgICBuYW1lIGFuZCByZWYgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgb25lIGlzIHJlcXVpcmVkIC0tPgorPCEtLSBJbiB0aGUgYWJzZW5jZSBvZiB0eXBlIEFORCByZWYsIHR5cGUgZGVmYXVsdHMgdG8gdHlwZSBvZgorICAgICBzdWJzdGl0dXRpb25Hcm91cCwgaWYgYW55LCBlbHNlIHRoZSB1ci10eXBlLCBpLmUuIHVuY29uc3RyYWluZWQgLS0+Cis8IS0tIGRlZmF1bHQgYW5kIGZpeGVkIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgLS0+CisKKzwhRUxFTUVOVCAlZ3JvdXA7ICgoJWFubm90YXRpb247KT8sKCVtZ3M7KT8pPgorPCFBVFRMSVNUICVncm91cDsgCisgICAgICAgICAgbmFtZSAgICAgICAgJU5DTmFtZTsgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgIHJlZiAgICAgICAgICVRTmFtZTsgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBtaW5PY2N1cnMgICAlbm9uTmVnYXRpdmVJbnRlZ2VyOyAgICNJTVBMSUVECisgICAgICAgICAgbWF4T2NjdXJzICAgQ0RBVEEgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgIGlkICAgICAgICAgIElEICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAlZ3JvdXBBdHRyczs+CisKKzwhRUxFTUVOVCAlYWxsOyAoKCVhbm5vdGF0aW9uOyk/LCAoJWVsZW1lbnQ7KSopPgorPCFBVFRMSVNUICVhbGw7CisgICAgICAgICAgbWluT2NjdXJzICAgKDEpICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgIG1heE9jY3VycyAgICgxKSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgJWFsbEF0dHJzOz4KKworPCFFTEVNRU5UICVjaG9pY2U7ICgoJWFubm90YXRpb247KT8sICglZWxlbWVudDt8ICVncm91cDt8ICVjczsgfCAlYW55OykqKT4KKzwhQVRUTElTVCAlY2hvaWNlOworICAgICAgICAgIG1pbk9jY3VycyAgICVub25OZWdhdGl2ZUludGVnZXI7ICAgI0lNUExJRUQKKyAgICAgICAgICBtYXhPY2N1cnMgICBDREFUQSAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICVjaG9pY2VBdHRyczs+CisKKzwhRUxFTUVOVCAlc2VxdWVuY2U7ICgoJWFubm90YXRpb247KT8sICglZWxlbWVudDt8ICVncm91cDt8ICVjczsgfCAlYW55OykqKT4KKzwhQVRUTElTVCAlc2VxdWVuY2U7CisgICAgICAgICAgbWluT2NjdXJzICAgJW5vbk5lZ2F0aXZlSW50ZWdlcjsgICAjSU1QTElFRAorICAgICAgICAgIG1heE9jY3VycyAgIENEQVRBICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgJXNlcXVlbmNlQXR0cnM7PgorCis8IS0tIGFuIGFub255bW91cyBncm91cGluZyBpbiBhIG1vZGVsLCBvcgorICAgICBhIHRvcC1sZXZlbCBuYW1lZCBncm91cCBkZWZpbml0aW9uLCBvciBhIHJlZmVyZW5jZSB0byBzYW1lIC0tPgorCis8IS0tIE5vdGUgdGhhdCBpZiBvcmRlciBpcyAnYWxsJywgZ3JvdXAgaXMgbm90IGFsbG93ZWQgaW5zaWRlLgorICAgICBJZiBvcmRlciBpcyAnYWxsJyBUSElTIGdyb3VwIG11c3QgYmUgYWxvbmUgKG9yIHJlZmVyZW5jZWQgYWxvbmUpIGF0CisgICAgIHRoZSB0b3AgbGV2ZWwgb2YgYSBjb250ZW50IG1vZGVsIC0tPgorPCEtLSBJZiBvcmRlciBpcyAnYWxsJywgbWluT2NjdXJzPT1tYXhPY2N1cnM9PTEgb24gZWxlbWVudC9hbnkgaW5zaWRlIC0tPgorPCEtLSBTaG91bGQgYWxsb3cgbWluT2NjdXJzPTAgaW5zaWRlIG9yZGVyPSdhbGwnIC4gLiAuIC0tPgorCis8IUVMRU1FTlQgJWFueTsgKCVhbm5vdGF0aW9uOyk/PgorPCFBVFRMSVNUICVhbnk7CisgICAgICAgICAgICBuYW1lc3BhY2UgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAnIyNhbnknCisgICAgICAgICAgICBwcm9jZXNzQ29udGVudHMgKHNraXB8bGF4fHN0cmljdCkgICAgICAnc3RyaWN0JworICAgICAgICAgICAgbWluT2NjdXJzICAgICAgICVub25OZWdhdGl2ZUludGVnZXI7ICAgJzEnCisgICAgICAgICAgICBtYXhPY2N1cnMgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAnMScKKyAgICAgICAgICAgIGlkICAgICAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgICAlYW55QXR0cnM7PgorCis8IS0tIG5hbWVzcGFjZSBpcyBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgICAgIyNhbnkgICAgICAtIC0gYW55IG5vbi1jb25mbGljdGluZyBXRlhNTCBhdCBhbGwKKworICAgICAgICAgICAgICAgICAgIyNvdGhlciAgICAtIC0gYW55IG5vbi1jb25mbGljdGluZyBXRlhNTCBmcm9tIG5hbWVzcGFjZSBvdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gdGFyZ2V0TmFtZXNwYWNlCisKKyAgICAgICAgICAgICAgICAgICMjbG9jYWwgICAgLSAtIGFueSB1bnF1YWxpZmllZCBub24tY29uZmxpY3RpbmcgV0ZYTUwvYXR0cmlidXRlCisgICAgICAgICAgICAgICAgICBvbmUgb3IgICAgIC0gLSBhbnkgbm9uLWNvbmZsaWN0aW5nIFdGWE1MIGZyb20KKyAgICAgICAgICAgICAgICAgIG1vcmUgVVJJICAgICAgICB0aGUgbGlzdGVkIG5hbWVzcGFjZXMKKyAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZXMKKworICAgICAgICAgICAgICAgICAgIyN0YXJnZXROYW1lc3BhY2UgIyNsb2NhbCBtYXkgYXBwZWFyIGluIHRoZSBhYm92ZSBsaXN0LAorICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBvYnZpb3VzIG1lYW5pbmcgLS0+CisKKzwhRUxFTUVOVCAlYW55QXR0cmlidXRlOyAoJWFubm90YXRpb247KT8+Cis8IUFUVExJU1QgJWFueUF0dHJpYnV0ZTsKKyAgICAgICAgICAgIG5hbWVzcGFjZSAgICAgICBDREFUQSAgICAgICAgICAgICAgJyMjYW55JworICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzIChza2lwfGxheHxzdHJpY3QpICAnc3RyaWN0JworICAgICAgICAgICAgaWQgICAgICAgICAgICAgIElEICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgJWFueUF0dHJpYnV0ZUF0dHJzOz4KKzwhLS0gbmFtZXNwYWNlIGlzIGludGVycHJldGVkIGFzIGZvciAnYW55JyBhYm92ZSAtLT4KKworPCEtLSBzaW1wbGVUeXBlIG9ubHkgaWYgbm8gdHlwZXxyZWYgYXR0cmlidXRlIC0tPgorPCEtLSByZWYgbm90IGFsbG93ZWQgYXQgdG9wIGxldmVsLCBuYW1lIGlmZiBhdCB0b3AgbGV2ZWwgLS0+Cis8IUVMRU1FTlQgJWF0dHJpYnV0ZTsgKCglYW5ub3RhdGlvbjspPywgKCVzaW1wbGVUeXBlOyk/KT4KKzwhQVRUTElTVCAlYXR0cmlidXRlOworICAgICAgICAgIG5hbWUgICAgICAlTkNOYW1lOyAgICAgICNJTVBMSUVECisgICAgICAgICAgaWQgICAgICAgIElEICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICByZWYgICAgICAgJVFOYW1lOyAgICAgICAjSU1QTElFRAorICAgICAgICAgIHR5cGUgICAgICAlUU5hbWU7ICAgICAgICNJTVBMSUVECisgICAgICAgICAgdXNlICAgICAgIChwcm9oaWJpdGVkfG9wdGlvbmFsfHJlcXVpcmVkKSAjSU1QTElFRAorICAgICAgICAgIGRlZmF1bHQgICBDREFUQSAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgZml4ZWQgICAgIENEQVRBICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBmb3JtICAgICAgJWZvcm1WYWx1ZXM7ICAjSU1QTElFRAorICAgICAgICAgICVhdHRyaWJ1dGVBdHRyczs+Cis8IS0tIHR5cGUgYW5kIHJlZiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorICAgICBuYW1lIGFuZCByZWYgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgb25lIGlzIHJlcXVpcmVkIC0tPgorPCEtLSBkZWZhdWx0IGZvciB1c2UgaXMgb3B0aW9uYWwgd2hlbiBuZXN0ZWQsIG5vbmUgb3RoZXJ3aXNlIC0tPgorPCEtLSBkZWZhdWx0IGFuZCBmaXhlZCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIC0tPgorPCEtLSB0eXBlIGF0dHIgYW5kIHNpbXBsZVR5cGUgY29udGVudCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIC0tPgorCis8IS0tIGFuIGF0dHJpYnV0ZUdyb3VwIGlzIGEgbmFtZWQgY29sbGVjdGlvbiBvZiBhdHRyaWJ1dGUgZGVjbHMsIG9yIGEKKyAgICAgcmVmZXJlbmNlIHRoZXJldG8gLS0+Cis8IUVMRU1FTlQgJWF0dHJpYnV0ZUdyb3VwOyAoKCVhbm5vdGF0aW9uOyk/LAorICAgICAgICAgICAgICAgICAgICAgICAoJWF0dHJpYnV0ZTsgfCAlYXR0cmlidXRlR3JvdXA7KSosCisgICAgICAgICAgICAgICAgICAgICAgICglYW55QXR0cmlidXRlOyk/KSA+Cis8IUFUVExJU1QgJWF0dHJpYnV0ZUdyb3VwOworICAgICAgICAgICAgICAgICBuYW1lICAgICAgICVOQ05hbWU7ICAgICAgICNJTVBMSUVECisgICAgICAgICAgICAgICAgIGlkICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAgICAgICAgcmVmICAgICAgICAlUU5hbWU7ICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgICAgICAlYXR0cmlidXRlR3JvdXBBdHRyczs+CisKKzwhLS0gcmVmIGlmZiBubyBjb250ZW50LCBubyBuYW1lLiAgcmVmIGlmZiBub3QgdG9wIGxldmVsIC0tPgorCis8IS0tIGJldHRlciByZWZlcmVuY2UgbWVjaGFuaXNtcyAtLT4KKzwhRUxFTUVOVCAldW5pcXVlOyAoKCVhbm5vdGF0aW9uOyk/LCAlc2VsZWN0b3I7LCAoJWZpZWxkOykrKT4KKzwhQVRUTElTVCAldW5pcXVlOworICAgICAgICAgIG5hbWUgICAgICVOQ05hbWU7ICAgICAgICNSRVFVSVJFRAorCSAgaWQgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKKwkgICV1bmlxdWVBdHRyczs+CisKKzwhRUxFTUVOVCAla2V5OyAgICAoKCVhbm5vdGF0aW9uOyk/LCAlc2VsZWN0b3I7LCAoJWZpZWxkOykrKT4KKzwhQVRUTElTVCAla2V5OworICAgICAgICAgIG5hbWUgICAgICVOQ05hbWU7ICAgICAgICNSRVFVSVJFRAorCSAgaWQgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKKwkgICVrZXlBdHRyczs+CisKKzwhRUxFTUVOVCAla2V5cmVmOyAoKCVhbm5vdGF0aW9uOyk/LCAlc2VsZWN0b3I7LCAoJWZpZWxkOykrKT4KKzwhQVRUTElTVCAla2V5cmVmOworICAgICAgICAgIG5hbWUgICAgICVOQ05hbWU7ICAgICAgICNSRVFVSVJFRAorCSAgcmVmZXIgICAgJVFOYW1lOyAgICAgICAgI1JFUVVJUkVECisJICBpZCAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAorCSAgJWtleXJlZkF0dHJzOz4KKworPCFFTEVNRU5UICVzZWxlY3RvcjsgKCglYW5ub3RhdGlvbjspPyk+Cis8IUFUVExJU1QgJXNlbGVjdG9yOworICAgICAgICAgIHhwYXRoICVYUGF0aEV4cHI7ICNSRVFVSVJFRAorICAgICAgICAgIGlkICAgIElEICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgJXNlbGVjdG9yQXR0cnM7PgorPCFFTEVNRU5UICVmaWVsZDsgKCglYW5ub3RhdGlvbjspPyk+Cis8IUFUVExJU1QgJWZpZWxkOworICAgICAgICAgIHhwYXRoICVYUGF0aEV4cHI7ICNSRVFVSVJFRAorICAgICAgICAgIGlkICAgIElEICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgJWZpZWxkQXR0cnM7PgorCis8IS0tIFNjaGVtYSBjb21iaW5hdGlvbiBtZWNoYW5pc21zIC0tPgorPCFFTEVNRU5UICVpbmNsdWRlOyAoJWFubm90YXRpb247KT8+Cis8IUFUVExJU1QgJWluY2x1ZGU7CisgICAgICAgICAgc2NoZW1hTG9jYXRpb24gJVVSSXJlZjsgI1JFUVVJUkVECisgICAgICAgICAgaWQgICAgICAgICAgICAgSUQgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAlaW5jbHVkZUF0dHJzOz4KKworPCFFTEVNRU5UICVpbXBvcnQ7ICglYW5ub3RhdGlvbjspPz4KKzwhQVRUTElTVCAlaW1wb3J0OworICAgICAgICAgIG5hbWVzcGFjZSAgICAgICVVUklyZWY7ICNJTVBMSUVECisgICAgICAgICAgc2NoZW1hTG9jYXRpb24gJVVSSXJlZjsgI0lNUExJRUQKKyAgICAgICAgICBpZCAgICAgICAgICAgICBJRCAgICAgICAjSU1QTElFRAorICAgICAgICAgICVpbXBvcnRBdHRyczs+CisKKzwhRUxFTUVOVCAlcmVkZWZpbmU7ICglYW5ub3RhdGlvbjsgfCAlc2ltcGxlVHlwZTsgfCAlY29tcGxleFR5cGU7IHwKKyAgICAgICAgICAgICAgICAgICAgICAlYXR0cmlidXRlR3JvdXA7IHwgJWdyb3VwOykqPgorPCFBVFRMSVNUICVyZWRlZmluZTsKKyAgICAgICAgICBzY2hlbWFMb2NhdGlvbiAlVVJJcmVmOyAjUkVRVUlSRUQKKyAgICAgICAgICBpZCAgICAgICAgICAgICBJRCAgICAgICAjSU1QTElFRAorICAgICAgICAgICVyZWRlZmluZUF0dHJzOz4KKworPCFFTEVNRU5UICVub3RhdGlvbjsgKCVhbm5vdGF0aW9uOyk/PgorPCFBVFRMSVNUICVub3RhdGlvbjsKKwkgIG5hbWUgICAgICAgICVOQ05hbWU7ICAgICNSRVFVSVJFRAorCSAgaWQgICAgICAgICAgSUQgICAgICAgICAgI0lNUExJRUQKKwkgIHB1YmxpYyAgICAgIENEQVRBICAgICAgICNSRVFVSVJFRAorCSAgc3lzdGVtICAgICAgJVVSSXJlZjsgICAgI0lNUExJRUQKKwkgICVub3RhdGlvbkF0dHJzOz4KKworPCEtLSBBbm5vdGF0aW9uIGlzIGVpdGhlciBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBvciBkb2N1bWVudGF0aW9uIC0tPgorPCEtLSBCeSBoYXZpbmcgdGhlc2UgaGVyZSB0aGV5IGFyZSBhdmFpbGFibGUgZm9yIGRhdGF0eXBlcyBhcyB3ZWxsCisgICAgIGFzIGFsbCB0aGUgc3RydWN0dXJlcyBlbGVtZW50cyAtLT4KKworPCFFTEVNRU5UICVhbm5vdGF0aW9uOyAoJWFwcGluZm87IHwgJWRvY3VtZW50YXRpb247KSo+Cis8IUFUVExJU1QgJWFubm90YXRpb247ICVhbm5vdGF0aW9uQXR0cnM7PgorCis8IS0tIFVzZXIgbXVzdCBkZWZpbmUgYW5ub3RhdGlvbiBlbGVtZW50cyBpbiBpbnRlcm5hbCBzdWJzZXQgZm9yIHRoaXMKKyAgICAgdG8gd29yayAtLT4KKzwhRUxFTUVOVCAlYXBwaW5mbzsgQU5ZPiAgIDwhLS0gdG9vIHJlc3RyaWN0aXZlIC0tPgorPCFBVFRMSVNUICVhcHBpbmZvOworICAgICAgICAgIHNvdXJjZSAgICAgJVVSSXJlZjsgICAgICAjSU1QTElFRAorICAgICAgICAgIGlkICAgICAgICAgSUQgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICVhcHBpbmZvQXR0cnM7PgorPCFFTEVNRU5UICVkb2N1bWVudGF0aW9uOyBBTlk+ICAgPCEtLSB0b28gcmVzdHJpY3RpdmUgLS0+Cis8IUFUVExJU1QgJWRvY3VtZW50YXRpb247CisgICAgICAgICAgc291cmNlICAgICAlVVJJcmVmOyAgICNJTVBMSUVECisgICAgICAgICAgaWQgICAgICAgICBJRCAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgeG1sOmxhbmcgICBDREFUQSAgICAgICNJTVBMSUVECisgICAgICAgICAgJWRvY3VtZW50YXRpb25BdHRyczs+CisKKzwhTk9UQVRJT04gWE1MU2NoZW1hU3RydWN0dXJlcyBQVUJMSUMKKyAgICAgICAgICAgJ3N0cnVjdHVyZXMnICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS54c2QnID4KKzwhTk9UQVRJT04gWE1MIFBVQkxJQworICAgICAgICAgICAnUkVDLXhtbC0xOTk4LTAyMTAnICdodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy14bWwtMTk5ODAyMTAnID4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvZGF0YXR5cGVzLmR0ZCBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvZGF0YXR5cGVzLmR0ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2U4OTIwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9kYXRhdHlwZXMuZHRkCkBAIC0wLDAgKzEsMjE5IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0KKyAgICAgICAgRFREIGZvciBYTUwgU2NoZW1hczogUGFydCAyOiBEYXRhdHlwZXMKKyAgICAgICAgJElkJAorICAgICAgICBOb3RlIHRoaXMgRFREIGlzIE5PVCBub3JtYXRpdmUsIG9yIGV2ZW4gZGVmaW5pdGl2ZS4gLSAtIHRoZQorICAgICAgICBwcm9zZSBjb3B5IGluIHRoZSBkYXRhdHlwZXMgUkVDIGlzIHRoZSBkZWZpbml0aXZlIHZlcnNpb24KKyAgICAgICAgKHdoaWNoIHNob3VsZG4ndCBkaWZmZXIgZnJvbSB0aGlzIG9uZSBleGNlcHQgZm9yIHRoaXMgY29tbWVudAorICAgICAgICBhbmQgZW50aXR5IGV4cGFuc2lvbnMsIGJ1dCBqdXN0IGluIGNhc2UpCisgIC0tPgorCis8IS0tCisgICAgICAgIFRoaXMgRFREIGNhbm5vdCBiZSB1c2VkIG9uIGl0cyBvd24sIGl0IGlzIGludGVuZGVkCisgICAgICAgIG9ubHkgZm9yIGluY29ycG9yYXRpb24gaW4gWE1MU2NoZW1hLmR0ZCwgcS52LgorICAtLT4KKworPCEtLSBEZWZpbmUgYWxsIHRoZSBlbGVtZW50IG5hbWVzLCB3aXRoIG9wdGlvbmFsIHByZWZpeCAtLT4KKzwhRU5USVRZICUgc2ltcGxlVHlwZSAiJXA7c2ltcGxlVHlwZSI+Cis8IUVOVElUWSAlIHJlc3RyaWN0aW9uICIlcDtyZXN0cmljdGlvbiI+Cis8IUVOVElUWSAlIGxpc3QgIiVwO2xpc3QiPgorPCFFTlRJVFkgJSB1bmlvbiAiJXA7dW5pb24iPgorPCFFTlRJVFkgJSBtYXhFeGNsdXNpdmUgIiVwO21heEV4Y2x1c2l2ZSI+Cis8IUVOVElUWSAlIG1pbkV4Y2x1c2l2ZSAiJXA7bWluRXhjbHVzaXZlIj4KKzwhRU5USVRZICUgbWF4SW5jbHVzaXZlICIlcDttYXhJbmNsdXNpdmUiPgorPCFFTlRJVFkgJSBtaW5JbmNsdXNpdmUgIiVwO21pbkluY2x1c2l2ZSI+Cis8IUVOVElUWSAlIHRvdGFsRGlnaXRzICIlcDt0b3RhbERpZ2l0cyI+Cis8IUVOVElUWSAlIGZyYWN0aW9uRGlnaXRzICIlcDtmcmFjdGlvbkRpZ2l0cyI+Cis8IUVOVElUWSAlIGxlbmd0aCAiJXA7bGVuZ3RoIj4KKzwhRU5USVRZICUgbWluTGVuZ3RoICIlcDttaW5MZW5ndGgiPgorPCFFTlRJVFkgJSBtYXhMZW5ndGggIiVwO21heExlbmd0aCI+Cis8IUVOVElUWSAlIGVudW1lcmF0aW9uICIlcDtlbnVtZXJhdGlvbiI+Cis8IUVOVElUWSAlIHdoaXRlU3BhY2UgIiVwO3doaXRlU3BhY2UiPgorPCFFTlRJVFkgJSBwYXR0ZXJuICIlcDtwYXR0ZXJuIj4KKworPCEtLQorICAgICAgICBDdXN0b21pc2F0aW9uIGVudGl0aWVzIGZvciB0aGUgQVRUTElTVCBvZiBlYWNoIGVsZW1lbnQKKyAgICAgICAgdHlwZS4gRGVmaW5lIG9uZSBvZiB0aGVzZSBpZiB5b3VyIHNjaGVtYSB0YWtlcyBhZHZhbnRhZ2UKKyAgICAgICAgb2YgdGhlIGFueUF0dHJpYnV0ZT0nIyNvdGhlcicgaW4gdGhlIHNjaGVtYSBmb3Igc2NoZW1hcworICAtLT4KKworPCFFTlRJVFkgJSBzaW1wbGVUeXBlQXR0cnMgIiI+Cis8IUVOVElUWSAlIHJlc3RyaWN0aW9uQXR0cnMgIiI+Cis8IUVOVElUWSAlIGxpc3RBdHRycyAiIj4KKzwhRU5USVRZICUgdW5pb25BdHRycyAiIj4KKzwhRU5USVRZICUgbWF4RXhjbHVzaXZlQXR0cnMgIiI+Cis8IUVOVElUWSAlIG1pbkV4Y2x1c2l2ZUF0dHJzICIiPgorPCFFTlRJVFkgJSBtYXhJbmNsdXNpdmVBdHRycyAiIj4KKzwhRU5USVRZICUgbWluSW5jbHVzaXZlQXR0cnMgIiI+Cis8IUVOVElUWSAlIHRvdGFsRGlnaXRzQXR0cnMgIiI+Cis8IUVOVElUWSAlIGZyYWN0aW9uRGlnaXRzQXR0cnMgIiI+Cis8IUVOVElUWSAlIGxlbmd0aEF0dHJzICIiPgorPCFFTlRJVFkgJSBtaW5MZW5ndGhBdHRycyAiIj4KKzwhRU5USVRZICUgbWF4TGVuZ3RoQXR0cnMgIiI+Cis8IUVOVElUWSAlIGVudW1lcmF0aW9uQXR0cnMgIiI+Cis8IUVOVElUWSAlIHdoaXRlU3BhY2VBdHRycyAiIj4KKzwhRU5USVRZICUgcGF0dGVybkF0dHJzICIiPgorCis8IS0tIERlZmluZSBzb21lIGVudGl0aWVzIGZvciBpbmZvcm1hdGl2ZSB1c2UgYXMgYXR0cmlidXRlCisgICAgICAgIHR5cGVzIC0tPgorPCFFTlRJVFkgJSBVUklyZWYgIkNEQVRBIj4KKzwhRU5USVRZICUgWFBhdGhFeHByICJDREFUQSI+Cis8IUVOVElUWSAlIFFOYW1lICJOTVRPS0VOIj4KKzwhRU5USVRZICUgUU5hbWVzICJOTVRPS0VOUyI+Cis8IUVOVElUWSAlIE5DTmFtZSAiTk1UT0tFTiI+Cis8IUVOVElUWSAlIG5vbk5lZ2F0aXZlSW50ZWdlciAiTk1UT0tFTiI+Cis8IUVOVElUWSAlIGJvb2xlYW4gIih0cnVlfGZhbHNlKSI+Cis8IUVOVElUWSAlIHNpbXBsZURlcml2YXRpb25TZXQgIkNEQVRBIj4KKzwhLS0KKyAgICAgICAgI2FsbCBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBkcmF3biBmcm9tIGRlcml2YXRpb25DaG9pY2UKKyAgLS0+CisKKzwhLS0KKyAgICAgICAgTm90ZSB0aGF0IHRoZSB1c2Ugb2YgJ2ZhY2V0JyBiZWxvdyBpcyBsZXNzIHJlc3RyaWN0aXZlCisgICAgICAgIHRoYW4gaXMgcmVhbGx5IGludGVuZGVkOiAgVGhlcmUgc2hvdWxkIGluIGZhY3QgYmUgbm8KKyAgICAgICAgbW9yZSB0aGFuIG9uZSBvZiBlYWNoIG9mIG1pbkluY2x1c2l2ZSwgbWluRXhjbHVzaXZlLAorICAgICAgICBtYXhJbmNsdXNpdmUsIG1heEV4Y2x1c2l2ZSwgdG90YWxEaWdpdHMsIGZyYWN0aW9uRGlnaXRzLAorICAgICAgICBsZW5ndGgsIG1heExlbmd0aCwgbWluTGVuZ3RoIHdpdGhpbiBkYXRhdHlwZSwKKyAgICAgICAgYW5kIHRoZSBtaW4tIGFuZCBtYXgtIHZhcmlhbnRzIG9mIEluY2x1c2l2ZSBhbmQgRXhjbHVzaXZlCisgICAgICAgIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIE9uIHRoZSBvdGhlciBoYW5kLCAgcGF0dGVybiBhbmQKKyAgICAgICAgZW51bWVyYXRpb24gbWF5IHJlcGVhdC4KKyAgLS0+Cis8IUVOVElUWSAlIG1pbkJvdW5kICIoJW1pbkluY2x1c2l2ZTsgfCAlbWluRXhjbHVzaXZlOykiPgorPCFFTlRJVFkgJSBtYXhCb3VuZCAiKCVtYXhJbmNsdXNpdmU7IHwgJW1heEV4Y2x1c2l2ZTspIj4KKzwhRU5USVRZICUgYm91bmRzICIlbWluQm91bmQ7IHwgJW1heEJvdW5kOyI+Cis8IUVOVElUWSAlIG51bWVyaWMgIiV0b3RhbERpZ2l0czsgfCAlZnJhY3Rpb25EaWdpdHM7Ij4KKzwhRU5USVRZICUgb3JkZXJlZCAiJWJvdW5kczsgfCAlbnVtZXJpYzsiPgorPCFFTlRJVFkgJSB1bm9yZGVyZWQKKyAgICIlcGF0dGVybjsgfCAlZW51bWVyYXRpb247IHwgJXdoaXRlU3BhY2U7IHwgJWxlbmd0aDsgfAorICAgJW1heExlbmd0aDsgfCAlbWluTGVuZ3RoOyI+Cis8IUVOVElUWSAlIGZhY2V0ICIlb3JkZXJlZDsgfCAldW5vcmRlcmVkOyI+Cis8IUVOVElUWSAlIGZhY2V0QXR0ciAKKyAgICAgICAgInZhbHVlIENEQVRBICNSRVFVSVJFRAorICAgICAgICBpZCBJRCAjSU1QTElFRCI+Cis8IUVOVElUWSAlIGZpeGVkQXR0ciAiZml4ZWQgJWJvb2xlYW47ICNJTVBMSUVEIj4KKzwhRU5USVRZICUgZmFjZXRNb2RlbCAiKCVhbm5vdGF0aW9uOyk/Ij4KKzwhRUxFTUVOVCAlc2ltcGxlVHlwZTsKKyAgICAgICAgKCglYW5ub3RhdGlvbjspPywgKCVyZXN0cmljdGlvbjsgfCAlbGlzdDsgfCAldW5pb247KSk+Cis8IUFUVExJU1QgJXNpbXBsZVR5cGU7CisgICAgbmFtZSAgICAgICVOQ05hbWU7ICNJTVBMSUVECisgICAgZmluYWwgICAgICVzaW1wbGVEZXJpdmF0aW9uU2V0OyAjSU1QTElFRAorICAgIGlkICAgICAgICBJRCAgICAgICAjSU1QTElFRAorICAgICVzaW1wbGVUeXBlQXR0cnM7PgorPCEtLSBuYW1lIGlzIHJlcXVpcmVkIGF0IHRvcCBsZXZlbCAtLT4KKzwhRUxFTUVOVCAlcmVzdHJpY3Rpb247ICgoJWFubm90YXRpb247KT8sCisgICAgICAgICAgICAgICAgICAgICAgICAgKCVyZXN0cmljdGlvbjE7IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCglc2ltcGxlVHlwZTspPywoJWZhY2V0OykqKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCVhdHRyRGVjbHM7KSk+Cis8IUFUVExJU1QgJXJlc3RyaWN0aW9uOworICAgIGJhc2UgICAgICAlUU5hbWU7ICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICBpZCAgICAgICAgSUQgICAgICAgI0lNUExJRUQKKyAgICAlcmVzdHJpY3Rpb25BdHRyczs+Cis8IS0tCisgICAgICAgIGJhc2UgYW5kIHNpbXBsZVR5cGUgY2hpbGQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwKKyAgICAgICAgb25lIGlzIHJlcXVpcmVkLgorCisgICAgICAgIHJlc3RyaWN0aW9uIGlzIHNoYXJlZCBiZXR3ZWVuIHNpbXBsZVR5cGUgYW5kCisgICAgICAgIHNpbXBsZUNvbnRlbnQgYW5kIGNvbXBsZXhDb250ZW50IChpbiBYTUxTY2hlbWEueHNkKS4KKyAgICAgICAgcmVzdHJpY3Rpb24xIGlzIGZvciB0aGUgbGF0dGVyIGNhc2VzLCB3aGVuIHRoaXMKKyAgICAgICAgaXMgcmVzdHJpY3RpbmcgYSBjb21wbGV4IHR5cGUsIGFzIGlzIGF0dHJEZWNscy4KKyAgLS0+Cis8IUVMRU1FTlQgJWxpc3Q7ICgoJWFubm90YXRpb247KT8sKCVzaW1wbGVUeXBlOyk/KT4KKzwhQVRUTElTVCAlbGlzdDsKKyAgICBpdGVtVHlwZSAgICAgICVRTmFtZTsgICAgICAgICAgICAgI0lNUExJRUQKKyAgICBpZCAgICAgICAgSUQgICAgICAgI0lNUExJRUQKKyAgICAlbGlzdEF0dHJzOz4KKzwhLS0KKyAgICAgICAgaXRlbVR5cGUgYW5kIHNpbXBsZVR5cGUgY2hpbGQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwKKyAgICAgICAgb25lIGlzIHJlcXVpcmVkCisgIC0tPgorPCFFTEVNRU5UICV1bmlvbjsgKCglYW5ub3RhdGlvbjspPywoJXNpbXBsZVR5cGU7KSopPgorPCFBVFRMSVNUICV1bmlvbjsKKyAgICBpZCAgICAgICAgICAgIElEICAgICAgICNJTVBMSUVECisgICAgbWVtYmVyVHlwZXMgICAlUU5hbWVzOyAgICAgICAgICAgICNJTVBMSUVECisgICAgJXVuaW9uQXR0cnM7PgorPCEtLQorICAgICAgICBBdCBsZWFzdCBvbmUgaXRlbSBpbiBtZW1iZXJUeXBlcyBvciBvbmUgc2ltcGxlVHlwZQorICAgICAgICBjaGlsZCBpcyByZXF1aXJlZAorICAtLT4KKworPCFFTEVNRU5UICVtYXhFeGNsdXNpdmU7ICVmYWNldE1vZGVsOz4KKzwhQVRUTElTVCAlbWF4RXhjbHVzaXZlOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZml4ZWRBdHRyOworICAgICAgICAlbWF4RXhjbHVzaXZlQXR0cnM7PgorPCFFTEVNRU5UICVtaW5FeGNsdXNpdmU7ICVmYWNldE1vZGVsOz4KKzwhQVRUTElTVCAlbWluRXhjbHVzaXZlOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZml4ZWRBdHRyOworICAgICAgICAlbWluRXhjbHVzaXZlQXR0cnM7PgorCis8IUVMRU1FTlQgJW1heEluY2x1c2l2ZTsgJWZhY2V0TW9kZWw7PgorPCFBVFRMSVNUICVtYXhJbmNsdXNpdmU7CisgICAgICAgICVmYWNldEF0dHI7CisgICAgICAgICVmaXhlZEF0dHI7CisgICAgICAgICVtYXhJbmNsdXNpdmVBdHRyczs+Cis8IUVMRU1FTlQgJW1pbkluY2x1c2l2ZTsgJWZhY2V0TW9kZWw7PgorPCFBVFRMSVNUICVtaW5JbmNsdXNpdmU7CisgICAgICAgICVmYWNldEF0dHI7CisgICAgICAgICVmaXhlZEF0dHI7CisgICAgICAgICVtaW5JbmNsdXNpdmVBdHRyczs+CisKKzwhRUxFTUVOVCAldG90YWxEaWdpdHM7ICVmYWNldE1vZGVsOz4KKzwhQVRUTElTVCAldG90YWxEaWdpdHM7CisgICAgICAgICVmYWNldEF0dHI7CisgICAgICAgICVmaXhlZEF0dHI7CisgICAgICAgICV0b3RhbERpZ2l0c0F0dHJzOz4KKzwhRUxFTUVOVCAlZnJhY3Rpb25EaWdpdHM7ICVmYWNldE1vZGVsOz4KKzwhQVRUTElTVCAlZnJhY3Rpb25EaWdpdHM7CisgICAgICAgICVmYWNldEF0dHI7CisgICAgICAgICVmaXhlZEF0dHI7CisgICAgICAgICVmcmFjdGlvbkRpZ2l0c0F0dHJzOz4KKworPCFFTEVNRU5UICVsZW5ndGg7ICVmYWNldE1vZGVsOz4KKzwhQVRUTElTVCAlbGVuZ3RoOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZml4ZWRBdHRyOworICAgICAgICAlbGVuZ3RoQXR0cnM7PgorPCFFTEVNRU5UICVtaW5MZW5ndGg7ICVmYWNldE1vZGVsOz4KKzwhQVRUTElTVCAlbWluTGVuZ3RoOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZml4ZWRBdHRyOworICAgICAgICAlbWluTGVuZ3RoQXR0cnM7PgorPCFFTEVNRU5UICVtYXhMZW5ndGg7ICVmYWNldE1vZGVsOz4KKzwhQVRUTElTVCAlbWF4TGVuZ3RoOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZml4ZWRBdHRyOworICAgICAgICAlbWF4TGVuZ3RoQXR0cnM7PgorCis8IS0tIFRoaXMgb25lIGNhbiBiZSByZXBlYXRlZCAtLT4KKzwhRUxFTUVOVCAlZW51bWVyYXRpb247ICVmYWNldE1vZGVsOz4KKzwhQVRUTElTVCAlZW51bWVyYXRpb247CisgICAgICAgICVmYWNldEF0dHI7CisgICAgICAgICVlbnVtZXJhdGlvbkF0dHJzOz4KKworPCFFTEVNRU5UICV3aGl0ZVNwYWNlOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJXdoaXRlU3BhY2U7CisgICAgICAgICVmYWNldEF0dHI7CisgICAgICAgICVmaXhlZEF0dHI7CisgICAgICAgICV3aGl0ZVNwYWNlQXR0cnM7PgorCis8IS0tIFRoaXMgb25lIGNhbiBiZSByZXBlYXRlZCAtLT4KKzwhRUxFTUVOVCAlcGF0dGVybjsgJWZhY2V0TW9kZWw7PgorPCFBVFRMSVNUICVwYXR0ZXJuOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlcGF0dGVybkF0dHJzOz4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvajJlZV8xXzQueHNkIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9qMmVlXzFfNC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjOTk4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvajJlZV8xXzQueHNkCkBAIC0wLDAgKzEsMTYyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHhzZDpzY2hlbWEKKyAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorICAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKKyAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgorICAgICB2ZXJzaW9uPSIxLjQiPgorICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgQCgjKWoyZWVfMV80LnhzZHMJMS40MyAwMy8wOS8xNgorICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCisgICAgICBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCisgICAgICByZXNlcnZlZC4KKworICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cworICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KKyAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAorICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKKyAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKKyAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCisgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCisKKyAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKKyAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKKyAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAorICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKKyAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KKworICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCisgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgorCisgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKKyAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKKyAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KKyAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgorCisgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKKyAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KKworICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+Cis8eHNkOmFubm90YXRpb24+Cis8eHNkOmRvY3VtZW50YXRpb24+CisKK1RoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgdGhhdCBhcHBlYXIgaW4gdGhlIGNvbW1vbgorc2hhcmVhYmxlIHNjaGVtYShzKSBvZiBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgc2hvdWxkIGJlCitpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbnRleHQgdGhleSBhcmUgaW5jbHVkZWQ6CisKK0RlcGxveW1lbnQgQ29tcG9uZW50IG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICBqMmVlIGFwcGxpY2F0aW9uOworICAgIGFwcGxpY2F0aW9uIGNsaWVudDsKKyAgICB3ZWIgYXBwbGljYXRpb247CisgICAgZW50ZXJwcmlzZSBiZWFuOworICAgIHJlc291cmNlIGFkYXB0ZXI7CisKK0RlcGxveW1lbnQgRmlsZSBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgZWFyIGZpbGU7CisgICAgd2FyIGZpbGU7CisgICAgamFyIGZpbGU7CisgICAgcmFyIGZpbGU7CisKKzwveHNkOmRvY3VtZW50YXRpb24+Cis8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgorCSAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLz4KKworICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249CisJImh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy94c2QvajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2QiLz4KKworCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpncm91cCBuYW1lPSJkZXNjcmlwdGlvbkdyb3VwIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGlzIGdyb3VwIGtlZXBzIHRoZSB1c2FnZSBvZiB0aGUgY29udGFpbmVkIGRlc2NyaXB0aW9uIHJlbGF0ZWQKKwllbGVtZW50cyBjb25zaXN0ZW50IGFjcm9zcyBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuCisKKwlBbGwgZWxlbWVudHMgbWF5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IGxhbmd1YWdlcywKKwl0byBzdXBwb3J0IGxvY2FsaXphdGlvbiBvZiB0aGUgY29udGVudC4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgorCQkgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgorCQkgICB0eXBlPSJqMmVlOmljb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmdyb3VwPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZXNjcmlwdGlvblR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBkZXNjcmlwdGlvbiB0eXBlIGlzIHVzZWQgYnkgYSBkZXNjcmlwdGlvbiBlbGVtZW50IHRvCisJcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGVsZW1lbnRzCisJdGhhdCB1c2UgdGhpcyB0eXBlIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZQorCURlcGxveW1lbnQgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlIGZpbGUgcHJvZHVjZXIgd2FudHMKKwl0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncworCURlcGxveW1lbnQgRmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUKKwl0b29scyB1c2VkIGJ5IHN1Y2ggYSBEZXBsb3ltZW50IEZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5CisJdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdAorCWNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KKworCVRoZSBsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZQorCWRlc2NyaXB0aW9uIGlzIHByb3ZpZGVkIGluLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiZW4iIChFbmdsaXNoKS4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImoyZWU6eHNkU3RyaW5nVHlwZSI+CisJPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgorICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRld2V5LXZlcnNpb25UeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGlzIHR5cGUgZGVmaW5lcyBhIGRld2V5IGRlY2ltYWwgd2hpY2ggaXMgdXNlZAorCXRvIGRlc2NyaWJlIHZlcnNpb25zIG9mIGRvY3VtZW50cy4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+CisgICAgICA8eHNkOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisKKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzcGxheS1uYW1lVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCTwhW0NEQVRBWworCisJICBUaGUgZGlzcGxheS1uYW1lIHR5cGUgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQKKwkgIHRvIGJlIGRpc3BsYXllZCBieSB0b29scy4gSXQgaXMgdXNlZCBieSBkaXNwbGF5LW5hbWUKKwkgIGVsZW1lbnRzLiAgVGhlIGRpc3BsYXkgbmFtZSBuZWVkIG5vdCBiZSB1bmlxdWUuCisKKwkgIEV4YW1wbGU6CisKKwkgIC4uLgorCSAgICAgPGRpc3BsYXktbmFtZSB4bWw6bGFuZz0iZW4iPkVtcGxveWVlIFNlbGYgU2VydmljZTwvZGlzcGxheS1uYW1lPgorCisJICBUaGUgdmFsdWUgb2YgdGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBpcyAiZW4iIChFbmdsaXNoKSBieSBkZWZhdWx0LgorCisJICBdXT4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqMmVlOnN0cmluZyI+CisJPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgorICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItbGlua1R5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8IVtDREFUQVsKKworCSAgVGhlIGVqYi1saW5rVHlwZSBpcyB1c2VkIGJ5IGVqYi1saW5rCisJICBlbGVtZW50cyBpbiB0aGUgZWpiLXJlZiBvciBlamItbG9jYWwtcmVmIGVsZW1lbnRzIHRvIHNwZWNpZnkKKwkgIHRoYXQgYW4gRUpCIHJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gZW50ZXJwcmlzZSBiZWFuLgorCisJICBUaGUgdmFsdWUgb2YgdGhlIGVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW4KKwkgIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgc2FtZSBlamItamFyIGZpbGUgb3IgaW4gYW5vdGhlciBlamItamFyCisJICBmaWxlIGluIHRoZSBzYW1lIEoyRUUgYXBwbGljYXRpb24gdW5pdC4KKworCSAgQWx0ZXJuYXRpdmVseSwgdGhlIG5hbWUgaW4gdGhlIGVqYi1saW5rIGVsZW1lbnQgbWF5IGJlCisJICBjb21wb3NlZCBvZiBhIHBhdGggbmFtZSBzcGVjaWZ5aW5nIHRoZSBlamItamFyIGNvbnRhaW5pbmcgdGhlCisJICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbiB3aXRoIHRoZSBlamItbmFtZSBvZiB0aGUgdGFyZ2V0CisJICBiZWFuIGFwcGVuZGVkIGFuZCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGF0aCBuYW1lIGJ5ICIjIi4gIFRoZQorCSAgcGF0aCBuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBEZXBsb3ltZW50IEZpbGUgY29udGFpbmluZworCSAgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCBpcyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZQorCSAgYmVhbi4gIFRoaXMgYWxsb3dzIG11bHRpcGxlIGVudGVycHJpc2UgYmVhbnMgd2l0aCB0aGUgc2FtZQorCSAgZWpiLW5hbWUgdG8gYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KKworCSAgRXhhbXBsZXM6CisKKwkgICAgICA8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8L2VqYi1saW5rPgorCisJICAgICAgPGVqYi1saW5rPi4uL3Byb2R1Y3RzL3Byb2R1Y3QuamFyI1Byb2R1Y3RFSkI8L2VqYi1saW5rPgorCisJICBdXT4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1sb2NhbC1yZWZUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgZWpiLWxvY2FsLXJlZlR5cGUgaXMgdXNlZCBieSBlamItbG9jYWwtcmVmIGVsZW1lbnRzIGZvcgorCXRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbAorCWhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKKworCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCisJICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSBEZXBsb3ltZW50CisJICAgICAgQ29tcG9uZW50IHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuCisJICAgIC0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCisJICAgIC0gdGhlIGV4cGVjdGVkIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMgb2YgdGhlCisJICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KKwkgICAgLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZQorCSAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi1uYW1lIgorCQkgICB0eXBlPSJqMmVlOmVqYi1yZWYtbmFtZVR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLXR5cGUiCisJCSAgIHR5cGU9ImoyZWU6ZWpiLXJlZi10eXBlVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCisJCSAgIHR5cGU9ImoyZWU6bG9jYWwtaG9tZVR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbCIKKwkJICAgdHlwZT0iajJlZTpsb2NhbFR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKKwkJICAgdHlwZT0iajJlZTplamItbGlua1R5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWYtbmFtZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8IVtDREFUQVsKKworCSAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgorCSAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKKwkgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQorCSAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQorCSAgRGVwbG95bWVudCBDb21wb25lbnQuCisKKwkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KKworCSAgRXhhbXBsZToKKworCSAgPGVqYi1yZWYtbmFtZT5lamIvUGF5cm9sbDwvZWpiLXJlZi1uYW1lPgorCisJICBdXT4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6am5kaS1uYW1lVHlwZSIvPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVmLXR5cGVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgZWpiLXJlZi10eXBlVHlwZSBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUKKwlyZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KKworCVRoZSBlamItcmVmLXR5cGUgZGVzaWduYXRlcyBhIHZhbHVlCisJdGhhdCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisJICAgIEVudGl0eQorCSAgICBTZXNzaW9uCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdHkiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXNzaW9uIi8+CisgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlZlR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBlamItcmVmVHlwZSBpcyB1c2VkIGJ5IGVqYi1yZWYgZWxlbWVudHMgZm9yIHRoZQorCWRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUuIFRoZQorCWRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgorCisJICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KKwkgICAgLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YKKwkgICAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlCisJICAgICAgYmVhbgorCSAgICAtIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgorCSAgICAtIHRoZSBleHBlY3RlZCBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZAorCSAgICAgIGVudGVycHJpc2UgYmVhbgorCSAgICAtIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlCisJICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKKwkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6ZWpiLXJlZi1uYW1lVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtdHlwZSIKKwkJICAgdHlwZT0iajJlZTplamItcmVmLXR5cGVUeXBlIi8+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJob21lIgorCQkgICB0eXBlPSJqMmVlOmhvbWVUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlIgorCQkgICB0eXBlPSJqMmVlOnJlbW90ZVR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKKwkJICAgdHlwZT0iajJlZTplamItbGlua1R5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtcHR5VHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhpcyB0eXBlIGlzIHVzZWQgdG8gZGVzaWduYXRlIGFuIGVtcHR5CisJZWxlbWVudCB3aGVuIHVzZWQuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisJPCFbQ0RBVEFbCisKKwkgIFRoaXMgdHlwZSBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBvZiB0aGUKKwkgIGVudmlyb25tZW50IGVudHJ5IHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYnkgdGhlCisJICBhcHBsaWNhdGlvbidzIGNvZGUuCisKKwkgIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZToKKworCSAgICAgIGphdmEubGFuZy5Cb29sZWFuCisJICAgICAgamF2YS5sYW5nLkJ5dGUKKwkgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyCisJICAgICAgamF2YS5sYW5nLlN0cmluZworCSAgICAgIGphdmEubGFuZy5TaG9ydAorCSAgICAgIGphdmEubGFuZy5JbnRlZ2VyCisJICAgICAgamF2YS5sYW5nLkxvbmcKKwkgICAgICBqYXZhLmxhbmcuRmxvYXQKKwkgICAgICBqYXZhLmxhbmcuRG91YmxlCisKKwkgIEV4YW1wbGU6CisKKwkgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+CisKKwkgIF1dPgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Cb29sZWFuIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkJ5dGUiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQ2hhcmFjdGVyIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TaG9ydCIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5JbnRlZ2VyIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkxvbmciLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuRmxvYXQiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuRG91YmxlIi8+CisgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW52LWVudHJ5VHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGVudi1lbnRyeVR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGFuIGFwcGxpY2F0aW9uJ3MKKwllbnZpcm9ubWVudCBlbnRyeS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCisJZGVzY3JpcHRpb24sIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYW5kIGFuCisJb3B0aW9uYWwgdmFsdWUuICBJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQsIG9uZSBtdXN0IGJlCisJc3VwcGxpZWQgZHVyaW5nIGRlcGxveW1lbnQuCisKKwlJdCBpcyB1c2VkIGJ5IGVudi1lbnRyeSBlbGVtZW50cy4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKKwkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktbmFtZSIKKwkJICAgdHlwZT0iajJlZTpqbmRpLW5hbWVUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisJICAgIDwhW0NEQVRBWworCisJICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQorCSAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZQorCSAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52CisJICAgICAgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhCisJICAgICAgRGVwbG95bWVudCBDb21wb25lbnQuIFRoZSB1bmlxdWVuZXNzCisJICAgICAgY29uc3RyYWludHMgbXVzdCBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgZGVjbGFyZWQKKwkgICAgICBjb250ZXh0LgorCisJICAgICAgRXhhbXBsZToKKworCSAgICAgIDxlbnYtZW50cnktbmFtZT5taW5BbW91bnQ8L2Vudi1lbnRyeS1uYW1lPgorCisJICAgICAgXV0+CisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5LXR5cGUiCisJCSAgIHR5cGU9ImoyZWU6ZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZSIvPgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5LXZhbHVlIgorCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCSAgICA8IVtDREFUQVsKKworCSAgICAgIFRoZSBlbnYtZW50cnktdmFsdWUgZGVzaWduYXRlcyB0aGUgdmFsdWUgb2YgYQorCSAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuIFRoZSB2YWx1ZQorCSAgICAgIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlCisJICAgICAgY29uc3RydWN0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYQorCSAgICAgIHNpbmdsZSBTdHJpbmcgcGFyYW1ldGVyLCBvciBmb3IgamF2YS5sYW5nLkNoYXJhY3RlciwKKwkgICAgICBhIHNpbmdsZSBjaGFyYWN0ZXIuCisKKwkgICAgICBFeGFtcGxlOgorCisJICAgICAgPGVudi1lbnRyeS12YWx1ZT4xMDAuMDA8L2Vudi1lbnRyeS12YWx1ZT4KKworCSAgICAgIF1dPgorCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgZGVzaWduYXRlIHRoZSBuYW1lIG9mIGEKKwlKYXZhIGNsYXNzIG9yIGludGVyZmFjZS4gIFRoZSBuYW1lIGlzIGluIHRoZSBmb3JtIG9mIGEKKwkiYmluYXJ5IG5hbWUiLCBhcyBkZWZpbmVkIGluIHRoZSBKTFMuICBUaGlzIGlzIHRoZSBmb3JtCisJb2YgbmFtZSB1c2VkIGluIENsYXNzLmZvck5hbWUoKS4gIFRvb2xzIHRoYXQgbmVlZCB0aGUKKwljYW5vbmljYWwgbmFtZSAodGhlIG5hbWUgdXNlZCBpbiBzb3VyY2UgY29kZSkgd2lsbCBuZWVkCisJdG8gY29udmVydCB0aGlzIGJpbmFyeSBuYW1lIHRvIHRoZSBjYW5vbmljYWwgbmFtZS4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJpYy1ib29sZWFuVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhpcyB0eXBlIGRlZmluZXMgZm91ciBkaWZmZXJlbnQgdmFsdWVzIHdoaWNoIGNhbiBkZXNpZ25hdGUKKwlib29sZWFuIHZhbHVlcy4gVGhpcyBpbmNsdWRlcyB2YWx1ZXMgeWVzIGFuZCBubyB3aGljaCBhcmUKKwlub3QgZGVzaWduYXRlZCBieSB4c2Q6Ym9vbGVhbgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieWVzIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8iLz4KKyAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJob21lVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCTwhW0NEQVRBWworCisJICBUaGUgaG9tZVR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YKKwkgIGFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlLgorCisJICBFeGFtcGxlOgorCisJICAgICAgPGhvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWU8L2hvbWU+CisKKwkgIF1dPgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imljb25UeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgaWNvbiB0eXBlIGNvbnRhaW5zIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudHMKKwl0aGF0IHNwZWNpZnkgdGhlIGZpbGUgbmFtZXMgZm9yIHNtYWxsIGFuZCBsYXJnZSBHSUYgb3IKKwlKUEVHIGljb24gaW1hZ2VzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhCisJR1VJIHRvb2wuCisKKwlUaGUgeG1sOmxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlCisJaWNvbiBmaWxlIG5hbWVzIGFyZSBwcm92aWRlZCBpbi4gSXRzIHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpCisJYnkgZGVmYXVsdC4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzbWFsbC1pY29uIiB0eXBlPSJqMmVlOnBhdGhUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgICAgPCFbQ0RBVEFbCisKKwkgICAgICBUaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQorCSAgICAgIGNvbnRhaW5pbmcgYSBzbWFsbCAoMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKKwkgICAgICBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQKKwkgICAgICBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUuCisKKwkgICAgICBUaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgorCSAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgorCisJICAgICAgRXhhbXBsZToKKworCSAgICAgIDxzbWFsbC1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjE2eDE2LmpwZzwvc21hbGwtaWNvbj4KKworCSAgICAgIF1dPgorCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsYXJnZS1pY29uIiB0eXBlPSJqMmVlOnBhdGhUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgICAgPCFbQ0RBVEFbCisKKwkgICAgICBUaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQorCSAgICAgIGNvbnRhaW5pbmcgYSBsYXJnZQorCSAgICAgICgzMiB4IDMyKSBpY29uIGltYWdlLiBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUKKwkgICAgICBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50CisJICAgICAgRmlsZS4KKworCSAgICAgIFRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCisJICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCisKKwkgICAgICBFeGFtcGxlOgorCisJICAgICAgPGxhcmdlLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnPC9sYXJnZS1pY29uPgorCisJICAgICAgXV0+CisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgPC94c2Q6c2VxdWVuY2U+CisKKyAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorCisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYXZhLWlkZW50aWZpZXJUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgamF2YS1pZGVudGlmaWVyVHlwZSBkZWZpbmVzIGEgSmF2YSBpZGVudGlmaWVyLgorCVRoZSB1c2VycyBvZiB0aGlzIHR5cGUgc2hvdWxkIGZ1cnRoZXIgdmVyaWZ5IHRoYXQKKwl0aGUgY29udGVudCBkb2VzIG5vdCBjb250YWluIEphdmEgcmVzZXJ2ZWQga2V5d29yZHMuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOnBhdHRlcm4gdmFsdWU9IigkfF98XHB7TH0pKFxwe0x9fFxwe05kfXxffCQpKiIvPgorICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtdHlwZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoaXMgaXMgYSBnZW5lcmljIHR5cGUgdGhhdCBkZXNpZ25hdGVzIGEgSmF2YSBwcmltaXRpdmUKKwl0eXBlIG9yIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGludGVyZmFjZS90eXBlLAorCW9yIGFuIGFycmF5IG9mIHN1Y2ggdHlwZXMuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOnBhdHRlcm4gdmFsdWU9IlteXHB7Wn1dKiIvPgorICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpuZGktbmFtZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBqbmRpLW5hbWVUeXBlIHR5cGUgZGVzaWduYXRlcyBhIEpOREkgbmFtZSBpbiB0aGUKKwlEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKKwlqYXZhOmNvbXAvZW52IGNvbnRleHQuICBBIEpOREkgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlCisJRGVwbG95bWVudCBDb21wb25lbnQuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmdyb3VwIG5hbWU9ImpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhpcyBncm91cCBrZWVwcyB0aGUgdXNhZ2Ugb2YgdGhlIGNvbnRhaW5lZCBKTkRJIGVudmlyb25tZW50CisJcmVmZXJlbmNlIGVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgorCQkgICB0eXBlPSJqMmVlOmVudi1lbnRyeVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgorCQkgICB0eXBlPSJqMmVlOmVqYi1yZWZUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWxvY2FsLXJlZiIKKwkJICAgdHlwZT0iajJlZTplamItbG9jYWwtcmVmVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6c2VydmljZS1yZWZHcm91cCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLXJlZiIKKwkJICAgdHlwZT0iajJlZTpyZXNvdXJjZS1yZWZUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZiIKKwkJICAgdHlwZT0iajJlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIgorCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICA8L3hzZDpncm91cD4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibGlzdGVuZXJUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgbGlzdGVuZXJUeXBlIGluZGljYXRlcyB0aGUgZGVwbG95bWVudCBwcm9wZXJ0aWVzIGZvciBhIHdlYgorCWFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdGVuZXItY2xhc3MiCisJCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBsaXN0ZW5lci1jbGFzcyBlbGVtZW50IGRlY2xhcmVzIGEgY2xhc3MgaW4gdGhlCisJICAgIGFwcGxpY2F0aW9uIG11c3QgYmUgcmVnaXN0ZXJlZCBhcyBhIHdlYgorCSAgICBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLiBUaGUgdmFsdWUgaXMgdGhlIGZ1bGx5CisJICAgIHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGxpc3RlbmVyIGNsYXNzLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsLWhvbWVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgbG9jYWwtaG9tZVR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkCisJbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lIGludGVyZmFjZS4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGxvY2FsVHlwZSBkZWZpbmVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhbgorCWVudGVycHJpc2UgYmVhbidzIGxvY2FsIGludGVyZmFjZS4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIGlzIHVzZWQgdG8gbGluayBhIG1lc3NhZ2UKKwlkZXN0aW5hdGlvbiByZWZlcmVuY2Ugb3IgbWVzc2FnZS1kcml2ZW4gYmVhbiB0byBhIG1lc3NhZ2UKKwlkZXN0aW5hdGlvbi4KKworCVRoZSBBc3NlbWJsZXIgc2V0cyB0aGUgdmFsdWUgdG8gcmVmbGVjdCB0aGUgZmxvdyBvZiBtZXNzYWdlcworCWJldHdlZW4gcHJvZHVjZXJzIGFuZCBjb25zdW1lcnMgaW4gdGhlIGFwcGxpY2F0aW9uLgorCisJVGhlIHZhbHVlIG11c3QgYmUgdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBvZiBhIG1lc3NhZ2UKKwlkZXN0aW5hdGlvbiBpbiB0aGUgc2FtZSBEZXBsb3ltZW50IEZpbGUgb3IgaW4gYW5vdGhlcgorCURlcGxveW1lbnQgRmlsZSBpbiB0aGUgc2FtZSBKMkVFIGFwcGxpY2F0aW9uIHVuaXQuCisKKwlBbHRlcm5hdGl2ZWx5LCB0aGUgdmFsdWUgbWF5IGJlIGNvbXBvc2VkIG9mIGEgcGF0aCBuYW1lCisJc3BlY2lmeWluZyBhIERlcGxveW1lbnQgRmlsZSBjb250YWluaW5nIHRoZSByZWZlcmVuY2VkCisJbWVzc2FnZSBkZXN0aW5hdGlvbiB3aXRoIHRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgb2YgdGhlCisJZGVzdGluYXRpb24gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRoIG5hbWUgYnkKKwkiIyIuIFRoZSBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIERlcGxveW1lbnQgRmlsZQorCWNvbnRhaW5pbmcgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCBpcyByZWZlcmVuY2luZyB0aGUKKwltZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBhbGxvd3MgbXVsdGlwbGUgbWVzc2FnZQorCWRlc3RpbmF0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgdG8gYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisJPCFbQ0RBVEFbCisKKwkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KKwkgIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgbWVzc2FnZSBkZXN0aW5hdGlvbgorCSAgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gRGVwbG95bWVudCBDb21wb25lbnQncworCSAgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mOgorCisJCSAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgorCQkgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUKKwkJICAtIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHR5cGUKKwkJICAtIGEgc3BlY2lmaWNhdGlvbiBhcyB0byB3aGV0aGVyIHRoZQorCQkgICAgZGVzdGluYXRpb24gaXMgdXNlZCBmb3IKKwkJICAgIGNvbnN1bWluZyBvciBwcm9kdWNpbmcgbWVzc2FnZXMsIG9yIGJvdGgKKwkJICAtIGEgbGluayB0byB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbgorCisJICBFeGFtcGxlczoKKworCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmPgorCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlCisJCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPgorCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlCisJCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+CisJCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+Q29uc3VtZXMKKwkJICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+CisJCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24tbGluaz5Db3Jwb3JhdGVTdG9ja3MKKwkJICA8L21lc3NhZ2UtZGVzdGluYXRpb24tbGluaz4KKwkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+CisKKwkgIF1dPgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIKKwkJICAgdHlwZT0iajJlZTpqbmRpLW5hbWVUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMKKwkgICAgdGhlIG5hbWUgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzCisJICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KKwkgICAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lCisJICAgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUKKwkgICAgdW5pcXVlIHdpdGhpbiBhbiBlamItamFyIChmb3IgZW50ZXJwcmlzZSBiZWFucykgb3IgYQorCSAgICBEZXBsb3ltZW50IEZpbGUgKGZvciBvdGhlcnMpLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZSIKKwkJICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSIKKwkJICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGluayIKKwkJICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisKKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8IVtDREFUQVsKKworCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUgc3BlY2lmaWVzIHRoZSB0eXBlIG9mCisJICB0aGUgZGVzdGluYXRpb24uIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UKKwkgIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkZXN0aW5hdGlvbi4KKworCSAgRXhhbXBsZToKKworCSAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZQorCSAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT4KKworCSAgXV0+CisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZSBzcGVjaWZpZXMgdGhlIHVzZSBvZiB0aGUKKwltZXNzYWdlIGRlc3RpbmF0aW9uIGluZGljYXRlZCBieSB0aGUgcmVmZXJlbmNlLiAgVGhlIHZhbHVlCisJaW5kaWNhdGVzIHdoZXRoZXIgbWVzc2FnZXMgYXJlIGNvbnN1bWVkIGZyb20gdGhlIG1lc3NhZ2UKKwlkZXN0aW5hdGlvbiwgcHJvZHVjZWQgZm9yIHRoZSBkZXN0aW5hdGlvbiwgb3IgYm90aC4gIFRoZQorCUFzc2VtYmxlciBtYWtlcyB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbiBpbiBsaW5raW5nIHByb2R1Y2VycworCW9mIGEgZGVzdGluYXRpb24gd2l0aCBpdHMgY29uc3VtZXJzLgorCisJVGhlIHZhbHVlIG9mIHRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlIGVsZW1lbnQgbXVzdCBiZQorCW9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAgICBDb25zdW1lcworCSAgICBQcm9kdWNlcworCSAgICBDb25zdW1lc1Byb2R1Y2VzCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lcyIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2VzIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXNQcm9kdWNlcyIvPgorICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisJPCFbQ0RBVEFbCisKKwkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSBzcGVjaWZpZXMgYSBtZXNzYWdlCisJICBkZXN0aW5hdGlvbi4gVGhlIGxvZ2ljYWwgZGVzdGluYXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMKKwkgIGVsZW1lbnQgaXMgbWFwcGVkIHRvIGEgcGh5c2ljYWwgZGVzdGluYXRpb24gYnkgdGhlIERlcGxveWVyLgorCisJICBUaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBlbGVtZW50IGNvbnRhaW5zOgorCisJCSAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgorCQkgIC0gYW4gb3B0aW9uYWwgZGlzcGxheS1uYW1lCisJCSAgLSBhbiBvcHRpb25hbCBpY29uCisJCSAgLSBhIG1lc3NhZ2UgZGVzdGluYXRpb24gbmFtZSB3aGljaCBtdXN0IGJlIHVuaXF1ZQorCQkgICAgYW1vbmcgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lcyB3aXRoaW4gdGhlIHNhbWUKKwkJICAgIERlcGxveW1lbnQgRmlsZS4KKworCSAgRXhhbXBsZToKKworCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24+CisJCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZT5Db3Jwb3JhdGVTdG9ja3MKKwkJICA8L21lc3NhZ2UtZGVzdGluYXRpb24tbmFtZT4KKwkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbj4KKworCSAgXV0+CisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhCisJICAgIG5hbWUgZm9yIGEgbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgbmFtZSBtdXN0IGJlCisJICAgIHVuaXF1ZSBhbW9uZyB0aGUgbmFtZXMgb2YgbWVzc2FnZSBkZXN0aW5hdGlvbnMKKwkgICAgd2l0aGluIHRoZSBEZXBsb3ltZW50IEZpbGUuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFyYW0tdmFsdWVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGlzIHR5cGUgaXMgYSBnZW5lcmFsIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWNsYXJlCisJcGFyYW1ldGVyL3ZhbHVlIGxpc3RzLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtLW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCisJICAgIHBhcmFtZXRlci4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtLXZhbHVlIgorCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYQorCSAgICBwYXJhbWV0ZXIuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGF0aFR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgZGVzaWduYXRlIGVpdGhlciBhIHJlbGF0aXZlCisJcGF0aCBvciBhbiBhYnNvbHV0ZSBwYXRoIHN0YXJ0aW5nIHdpdGggYSAiLyIuCisKKwlJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQorCXNhbWUgRGVwbG95bWVudCBGaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAorCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgorCXRoZSBEZXBsb3ltZW50IEZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sCisJdGhvc2Ugc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZgorCXRoZSBEZXBsb3ltZW50IEZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcworCWFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKKwluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVtb3RlVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCTwhW0NEQVRBWworCisJICBUaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lCisJICBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4KKworCSAgRXhhbXBsZToKKworCSAgICAgIDxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgorCisJICBdXT4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXMtYXV0aFR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSByZXMtYXV0aFR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50CisJY29kZSBzaWducyBvbiBwcm9ncmFtbWF0aWNhbGx5IHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBvcgorCXdoZXRoZXIgdGhlIENvbnRhaW5lciB3aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIKKwlvbiBiZWhhbGYgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50LiBJbiB0aGUgbGF0dGVyIGNhc2UsCisJdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlCisJRGVwbG95ZXIuCisKKwlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6CisKKwkgICAgQXBwbGljYXRpb24KKwkgICAgQ29udGFpbmVyCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbiIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgorICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcy1zaGFyaW5nLXNjb3BlVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHJlcy1zaGFyaW5nLXNjb3BlIHR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgY29ubmVjdGlvbnMKKwlvYnRhaW5lZCB0aHJvdWdoIHRoZSBnaXZlbiByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24KKwlmYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUgc2hhcmVkLiBUaGUgdmFsdWUsIGlmIHNwZWNpZmllZCwKKwltdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKKworCSAgICBTaGFyZWFibGUKKwkgICAgVW5zaGFyZWFibGUKKworCVRoZSBkZWZhdWx0IHZhbHVlIGlzIFNoYXJlYWJsZS4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlYWJsZSIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2hhcmVhYmxlIi8+CisgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzb3VyY2UtZW52LXJlZlR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8IVtDREFUQVsKKworCSAgVGhlIHJlc291cmNlLWVudi1yZWZUeXBlIGlzIHVzZWQgdG8gZGVmaW5lCisJICByZXNvdXJjZS1lbnYtdHlwZSBlbGVtZW50cy4gIEl0IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQorCSAgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdAorCSAgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MKKwkgIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZQorCSAgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbiBpbmRpY2F0aW9uIG9mCisJICB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlCisJICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLgorCisJICBFeGFtcGxlOgorCisJICA8cmVzb3VyY2UtZW52LXJlZj4KKwkgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlCisJICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+CisJICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZheC5qbXMuUXVldWUKKwkgICAgICA8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KKwkgIDwvcmVzb3VyY2UtZW52LXJlZj4KKworCSAgXV0+CisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYtbmFtZSIKKwkJICAgdHlwZT0iajJlZTpqbmRpLW5hbWVUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQorCSAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCisJICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KKwkgICAgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkKKwkgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0CisJICAgIGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudC4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYtdHlwZSIKKwkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHJlc291cmNlLWVudi1yZWYtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZQorCSAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZS4gIEl0IGlzIHRoZQorCSAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IKKwkgICAgaW50ZXJmYWNlLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzb3VyY2UtcmVmVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCTwhW0NEQVRBWworCisJICBUaGUgcmVzb3VyY2UtcmVmVHlwZSBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEKKwkgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLiBJdAorCSAgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyCisJICBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsIHRoZSBpbmRpY2F0aW9uIG9mIHRoZQorCSAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZSBleHBlY3RlZCBieSB0aGUKKwkgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUsIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uCisJICAoQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwgYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YKKwkgIHRoZSBzaGFyZWFiaWxpdHkgb2YgY29ubmVjdGlvbnMgb2J0YWluZWQgZnJvbSB0aGUgcmVzb3VyY2UKKwkgIChTaGFyZWFibGUgb3IgVW5zaGFyZWFibGUpLgorCisJICBFeGFtcGxlOgorCisJICA8cmVzb3VyY2UtcmVmPgorCSAgICAgIDxyZXMtcmVmLW5hbWU+amRiYy9FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+CisJICAgICAgPHJlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlPC9yZXMtdHlwZT4KKwkgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KKwkgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KKwkgIDwvcmVzb3VyY2UtcmVmPgorCisJICBdXT4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLXJlZi1uYW1lIgorCQkgICB0eXBlPSJqMmVlOmpuZGktbmFtZVR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKKwkgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLgorCSAgICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKKwkgICAgamF2YTpjb21wL2VudiBjb250ZXh0LgorCSAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IEZpbGUuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXMtdHlwZSIKKwkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhCisJICAgIHNvdXJjZS4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBmdWxseSBxdWFsaWZpZWQKKwkgICAgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UKKwkgICAgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRhdGEgc291cmNlLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLWF1dGgiCisJCSAgIHR5cGU9ImoyZWU6cmVzLWF1dGhUeXBlIi8+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXMtc2hhcmluZy1zY29wZSIKKwkJICAgdHlwZT0iajJlZTpyZXMtc2hhcmluZy1zY29wZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJvbGUtbmFtZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSByb2xlLW5hbWVUeXBlIGRlc2lnbmF0ZXMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgorCisJVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhIHRva2VuLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJ1bi1hc1R5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBydW4tYXNUeXBlIHNwZWNpZmllcyB0aGUgcnVuLWFzIGlkZW50aXR5IHRvIGJlCisJdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiBhIGNvbXBvbmVudC4gSXQgY29udGFpbnMgYW4KKwlvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKKwkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6cm9sZS1uYW1lVHlwZSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHNlY3VyaXR5LXJvbGUtcmVmVHlwZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYQorCXNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIGluIGEgY29tcG9uZW50J3Mgb3IgYQorCURlcGxveW1lbnQgQ29tcG9uZW50J3MgY29kZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuCisJb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdXNlZCBpbiB0aGUKKwljb2RlLCBhbmQgYW4gb3B0aW9uYWwgbGluayB0byBhIHNlY3VyaXR5IHJvbGUuIElmIHRoZQorCXNlY3VyaXR5IHJvbGUgaXMgbm90IHNwZWNpZmllZCwgdGhlIERlcGxveWVyIG11c3QgY2hvb3NlIGFuCisJYXBwcm9wcmlhdGUgc2VjdXJpdHkgcm9sZS4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKKwkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6cm9sZS1uYW1lVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgU3RyaW5nIHVzZWQKKwkgICAgYXMgdGhlIHBhcmFtZXRlciB0byB0aGUKKwkgICAgRUpCQ29udGV4dC5pc0NhbGxlckluUm9sZShTdHJpbmcgcm9sZU5hbWUpIG1ldGhvZCBvciB0aGUKKwkgICAgSHR0cFNlcnZsZXRSZXF1ZXN0LmlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgbWV0aG9kLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1saW5rIgorCQkgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSByb2xlLWxpbmsgZWxlbWVudCBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQKKwkgICAgc2VjdXJpdHkgcm9sZS4gVGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgY29udGFpbgorCSAgICB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlCisJICAgIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktcm9sZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8IVtDREFUQVsKKworCSAgVGhlIHNlY3VyaXR5LXJvbGVUeXBlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkKKwkgIHJvbGUuIFRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZQorCSAgc2VjdXJpdHkgcm9sZSwgYW5kIHRoZSBzZWN1cml0eSByb2xlIG5hbWUuCisKKwkgIEV4YW1wbGU6CisKKwkgICAgICA8c2VjdXJpdHktcm9sZT4KKwkgICAgICA8ZGVzY3JpcHRpb24+CisJCSAgVGhpcyByb2xlIGluY2x1ZGVzIGFsbCBlbXBsb3llZXMgd2hvIGFyZSBhdXRob3JpemVkCisJCSAgdG8gYWNjZXNzIHRoZSBlbXBsb3llZSBzZXJ2aWNlIGFwcGxpY2F0aW9uLgorCSAgICAgIDwvZGVzY3JpcHRpb24+CisJICAgICAgPHJvbGUtbmFtZT5lbXBsb3llZTwvcm9sZS1uYW1lPgorCSAgICAgIDwvc2VjdXJpdHktcm9sZT4KKworCSAgXV0+CisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKKwkJICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RyaW5nIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGlzIGlzIGEgc3BlY2lhbCBzdHJpbmcgZGF0YXR5cGUgdGhhdCBpcyBkZWZpbmVkIGJ5IEoyRUUgYXMKKwlhIGJhc2UgdHlwZSBmb3IgZGVmaW5pbmcgY29sbGFwc2VkIHN0cmluZ3MuIFdoZW4gc2NoZW1hcworCXJlcXVpcmUgdHJhaWxpbmcvbGVhZGluZyBzcGFjZSBlbGltaW5hdGlvbiBhcyB3ZWxsIGFzCisJY29sbGFwc2luZyB0aGUgZXhpc3Rpbmcgd2hpdGVzcGFjZSwgdGhpcyBiYXNlIHR5cGUgbWF5IGJlCisJdXNlZC4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDp0b2tlbiI+CisJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cnVlLWZhbHNlVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhpcyBzaW1wbGUgdHlwZSBkZXNpZ25hdGVzIGEgYm9vbGVhbiB3aXRoIG9ubHkgdHdvCisJcGVybWlzc2libGUgdmFsdWVzCisKKwktIHRydWUKKwktIGZhbHNlCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6eHNkQm9vbGVhblR5cGUiPgorCTx4c2Q6cGF0dGVybiB2YWx1ZT0iKHRydWV8ZmFsc2UpIi8+CisgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXJsLXBhdHRlcm5UeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgdXJsLXBhdHRlcm5UeXBlIGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUgbWFwcGluZy4KKwlJdCBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgc3BlY2lmaWVkIGluIFNlY3Rpb24gMTEuMiBvZiB0aGUKKwlTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLiBUaGlzIHBhdHRlcm4gaXMgYXNzdW1lZCB0byBiZSBpbgorCVVSTC1kZWNvZGVkIGZvcm0gYW5kIG11c3Qgbm90IGNvbnRhaW4gQ1IoI3hEKSBvciBMRigjeEEpLgorCUlmIGl0IGNvbnRhaW5zIHRob3NlIGNoYXJhY3RlcnMsIHRoZSBjb250YWluZXIgbXVzdCBpbmZvcm0KKwl0aGUgZGV2ZWxvcGVyIHdpdGggYSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlLgorCVRoZSBjb250YWluZXIgbXVzdCBwcmVzZXJ2ZSBhbGwgY2hhcmFjdGVycyBpbmNsdWRpbmcgd2hpdGVzcGFjZXMuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZEFueVVSSVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDphbnlVUkkuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6YW55VVJJIj4KKwk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZEJvb2xlYW5UeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6Ym9vbGVhbi4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpib29sZWFuIj4KKwk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZEludGVnZXJUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6aW50ZWdlci4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDppbnRlZ2VyIj4KKwk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZE5NVE9LRU5UeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6Tk1UT0tFTi4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKwk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZE5vbk5lZ2F0aXZlSW50ZWdlclR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpub25OZWdhdGl2ZUludGVnZXIuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KKwk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZFBvc2l0aXZlSW50ZWdlclR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpwb3NpdGl2ZUludGVnZXIuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6cG9zaXRpdmVJbnRlZ2VyIj4KKwk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZFFOYW1lVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOlFOYW1lLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOlFOYW1lIj4KKwk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZFN0cmluZ1R5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpzdHJpbmcuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKwk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwveHNkOnNjaGVtYT4KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0Zjc1YTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QKQEAgLTAsMCArMSw1MDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKwkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKKwkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgorCSAgICB2ZXJzaW9uPSIxLjEiPgorICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgQCgjKWoyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2RzCTEuMTEgMDIvMTEvMDMKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbworICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cworICAgICAgcmVzZXJ2ZWQuCisKKyAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKKyAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCisgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKKyAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCisgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCisgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQorICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgorCisgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCisgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCisgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKKyAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCisgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCisKKyAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcworICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KKworICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCisgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCisgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCisgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KKworICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCisgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCisKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgorCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPCFbQ0RBVEFbCisKKwlUaGUgd2Vic2VydmljZXMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGUgd2ViIHNlcnZpY2VzCisJZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgSXQgc3BlY2lmaWVzIHRoZSBzZXQgb2Ygd2ViIHNlcnZpY2UKKwlkZXNjcmlwdGlvbnMgdGhhdCBhcmUgdG8gYmUgZGVwbG95ZWQgaW50byB0aGUgSjJFRSBBcHBsaWNhdGlvbgorCVNlcnZlciBhbmQgdGhlIGRlcGVuZGVuY2llcyB0aGV5IGhhdmUgb24gY29udGFpbmVyIHJlc291cmNlcyBhbmQKKwlzZXJ2aWNlcy4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZAorCSJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiIGluIHRoZSB3ZWIgc2VydmljZXMnIGphciBmaWxlLgorCisJVXNlZCBpbjogd2Vic2VydmljZXMueG1sCisKKwlBbGwgd2Vic2VydmljZXMgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlIHRoZQorCXdlYnNlcnZpY2VzIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6CisKKwlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCisKKwlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSB2ZXJzaW9uCisJZWxlbWVudCBhcyBzaG93biBiZWxvdzoKKworCSAgICA8d2Vic2VydmljZXMgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisJICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKKwkJaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIgorCSAgICAgIHZlcnNpb249IjEuMSI+CisJICAgICAgLi4uCisJICAgIDwvd2Vic2VydmljZXM+CisKKwlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YgdGhlCisJc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciB0aGUgSjJFRQorCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246CisKKwlodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QKKworCV1dPgorICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQorICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgorCisgICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCisJc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKKwlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKKwl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCisJc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKKwlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQorCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQorCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgorCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImoyZWVfMV80LnhzZCIvPgorCisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworCisgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlcyIgdHlwZT0iajJlZTp3ZWJzZXJ2aWNlc1R5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSB3ZWJzZXJ2aWNlcyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgZm9yIHRoZSB3ZWIgc2VydmljZXMKKwlkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBJdCBzcGVjaWZpZXMgdGhlIHNldCBvZiB3ZWIgc2VydmljZQorCWRlc2NyaXB0aW9ucyB0aGF0IGFyZSB0byBiZSBkZXBsb3llZCBpbnRvIHRoZSBKMkVFIEFwcGxpY2F0aW9uIFNlcnZlcgorCWFuZCB0aGUgZGVwZW5kZW5jaWVzIHRoZXkgaGF2ZSBvbiBjb250YWluZXIgcmVzb3VyY2VzIGFuZCBzZXJ2aWNlcy4KKworCVVzZWQgaW46IHdlYnNlcnZpY2VzLnhtbAorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOmtleSBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUta2V5Ij4KKyAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKwk8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgIFRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUgaWRlbnRpZmllcyB0aGUgY29sbGVjdGlvbiBvZgorCSAgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQyBtYXBwaW5nLiBUaGUKKwkgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6d2Vic2VydmljZS1kZXNjcmlwdGlvbiIvPgorICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iajJlZTp3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUiLz4KKyAgICA8L3hzZDprZXk+CisgIDwveHNkOmVsZW1lbnQ+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvcnQtY29tcG9uZW50VHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHBvcnQtY29tcG9uZW50IGVsZW1lbnQgYXNzb2NpYXRlcyBhIFdTREwgcG9ydCB3aXRoIGEgd2ViIHNlcnZpY2UKKwlpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uLiAgSXQgZGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgcG9ydCBhcyBhCisJY29tcG9uZW50LCBvcHRpb25hbCBkZXNjcmlwdGlvbiwgb3B0aW9uYWwgZGlzcGxheSBuYW1lLCBvcHRpb25hbCBpY29uaWMKKwlyZXByZXNlbnRhdGlvbnMsIFdTREwgcG9ydCBRTmFtZSwgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UsIFNlcnZpY2UKKwlJbXBsZW1lbnRhdGlvbiBCZWFuLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgorCQkgICB0eXBlPSJqMmVlOmljb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50LW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisJICAgIDwhW0NEQVRBWworCisJICAgICAgVGhlIHBvcnQtY29tcG9uZW50LW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYSBwb3J0IGNvbXBvbmVudCdzCisJICAgICAgbmFtZS4gIFRoaXMgbmFtZSBpcyBhc3NpZ25lZCBieSB0aGUgbW9kdWxlIHByb2R1Y2VyIHRvIG5hbWUKKwkgICAgICB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIGluIHRoZSBtb2R1bGUncyBkZXBsb3ltZW50CisJICAgICAgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgYW1vbmcgdGhlIHBvcnQgY29tcG9uZW50CisJICAgICAgbmFtZXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBtb2R1bGUuCisKKwkgICAgICBVc2VkIGluOiBwb3J0LWNvbXBvbmVudAorCisJICAgICAgRXhhbXBsZToKKwkJICAgICAgPHBvcnQtY29tcG9uZW50LW5hbWU+RW1wbG95ZWVTZXJ2aWNlCisJCSAgICAgIDwvcG9ydC1jb21wb25lbnQtbmFtZT4KKworCSAgICAgIF1dPgorCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLXBvcnQiCisJCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgRGVmaW5lcyB0aGUgbmFtZSBzcGFjZSBhbmQgbG9jYWwgbmFtZSBwYXJ0IG9mIHRoZSBXU0RMIHBvcnQgUU5hbWUuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiCisJCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCSAgICA8IVtDREFUQVsKKworCSAgICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGNvbnRhaW5zIHRoZQorCSAgICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBwb3J0IGNvbXBvbmVudCdzIFNlcnZpY2UgRW5kcG9pbnQKKwkgICAgICBJbnRlcmZhY2UuCisKKwkgICAgICBVc2VkIGluOiBwb3J0LWNvbXBvbmVudAorCisJICAgICAgRXhhbXBsZToKKwkJICAgICAgPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+CisKKwkgICAgICBdXT4KKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1pbXBsLWJlYW4iCisJCSAgIHR5cGU9ImoyZWU6c2VydmljZS1pbXBsLWJlYW5UeXBlIi8+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyIgorCQkgICB0eXBlPSJqMmVlOnBvcnQtY29tcG9uZW50X2hhbmRsZXJUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9ydC1jb21wb25lbnRfaGFuZGxlclR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCURlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZQorCWluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLgorCisJVXNlZCBpbjogcG9ydC1jb21wb25lbnQKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1uYW1lIgorCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKKwkgICAgbW9kdWxlLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItY2xhc3MiCisJCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24uCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKKwkJICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtaGVhZGVyIgorCQkgICB0eXBlPSJqMmVlOnhzZFFOYW1lVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgdGhlIFFOYW1lIG9mIGEgU09BUCBoZWFkZXIgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUKKwkgICAgaGFuZGxlci4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb2FwLXJvbGUiCisJCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHNvYXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGEgU09BUCBhY3RvciBkZWZpbml0aW9uIHRoYXQgdGhlCisJICAgIEhhbmRsZXIgd2lsbCBwbGF5IGFzIGEgcm9sZS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLWltcGwtYmVhblR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50IGRlZmluZXMgdGhlIHdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uLgorCUEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgYW4gRUpCIGJlYW4gY2xhc3Mgb3IgSkFYLVJQQyB3ZWIKKwljb21wb25lbnQuICBFeGlzdGluZyBFSkIgaW1wbGVtZW50YXRpb25zIGFyZSBleHBvc2VkIGFzIGEgd2ViIHNlcnZpY2UKKwl1c2luZyBhbiBlamItbGluay4KKworCVVzZWQgaW46IHBvcnQtY29tcG9uZW50CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmNob2ljZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKKwkJICAgdHlwZT0iajJlZTplamItbGlua1R5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LWxpbmsiCisJCSAgIHR5cGU9ImoyZWU6c2VydmxldC1saW5rVHlwZSIvPgorICAgIDwveHNkOmNob2ljZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0LWxpbmtUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisJPCFbQ0RBVEFbCisKKwkgIFRoZSBzZXJ2bGV0LWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50CisJICB0byBzcGVjaWZ5IHRoYXQgYSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4gaXMgZGVmaW5lZCBhcyBhCisJICBKQVgtUlBDIFNlcnZpY2UgRW5kcG9pbnQuCisKKwkgIFRoZSB2YWx1ZSBvZiB0aGUgc2VydmxldC1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgc2VydmxldC1uYW1lIG9mCisJICBhIEpBWC1SUEMgU2VydmljZSBFbmRwb2ludCBpbiB0aGUgc2FtZSBXQVIgZmlsZS4KKworCSAgVXNlZCBpbjogc2VydmljZS1pbXBsLWJlYW4KKworCSAgRXhhbXBsZToKKwkJICA8c2VydmxldC1saW5rPlN0b2NrUXVvdGVTZXJ2aWNlPC9zZXJ2bGV0LWxpbms+CisKKwkgIF1dPgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic2VydmljZS1kZXNjcmlwdGlvblR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIGVsZW1lbnQgZGVmaW5lcyBhIFdTREwgZG9jdW1lbnQgZmlsZQorCWFuZCB0aGUgc2V0IG9mIFBvcnQgY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREwgcG9ydHMKKwlkZWZpbmVkIGluIHRoZSBXU0RMIGRvY3VtZW50LiAgVGhlcmUgbWF5IGJlIG11bHRpcGxlCisJd2Vic2VydmljZS1kZXNjcmlwdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBtb2R1bGUuCisKKwlBbGwgV1NETCBmaWxlIHBvcnRzIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgcG9ydC1jb21wb25lbnQgZWxlbWVudAorCWRlZmluZWQuCisKKwlVc2VkIGluOiB3ZWJzZXJ2aWNlcworCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgorCQkgICB0eXBlPSJqMmVlOmljb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSIKKwkJICAgdHlwZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lIGlkZW50aWZpZXMgdGhlIGNvbGxlY3Rpb24gb2YKKwkgICAgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQworCSAgICBtYXBwaW5nLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLWZpbGUiCisJCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBXU0RMIGZpbGUgaW4gdGhlCisJICAgIG1vZHVsZS4gIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpheHJwYy1tYXBwaW5nLWZpbGUiCisJCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0CisJICAgIGRlc2NyaWJlcyB0aGUgSkFYLVJQQyBtYXBwaW5nIGJldHdlZW4gdGhlIEphdmEgaW50ZXJhY2VzIHVzZWQgYnkKKwkgICAgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgV1NETCBkZXNjcmlwdGlvbiBpbiB0aGUgd3NkbC1maWxlLiAgVGhlCisJICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQiCisJCSAgIHR5cGU9ImoyZWU6cG9ydC1jb21wb25lbnRUeXBlIgorCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmtleSBuYW1lPSJwb3J0LWNvbXBvbmVudF9oYW5kbGVyLW5hbWUta2V5Ij4KKwkgIDx4c2Q6YW5ub3RhdGlvbj4KKwkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKKwkgICAgICB3aXRoaW4gdGhlIG1vZHVsZS4KKworCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgPC94c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6aGFuZGxlciIvPgorCSAgPHhzZDpmaWVsZCB4cGF0aD0iajJlZTpoYW5kbGVyLW5hbWUiLz4KKwk8L3hzZDprZXk+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNlcnZpY2VzVHlwZSI+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOndlYnNlcnZpY2UtZGVzY3JpcHRpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmtleSBuYW1lPSJwb3J0LWNvbXBvbmVudC1uYW1lLWtleSI+CisJICA8eHNkOmFubm90YXRpb24+CisJICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgICAgICA8IVtDREFUQVsKKworCQlUaGUgcG9ydC1jb21wb25lbnQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhIHBvcnQKKwkJY29tcG9uZW50J3MgbmFtZS4gIFRoaXMgbmFtZSBpcyBhc3NpZ25lZCBieSB0aGUgbW9kdWxlCisJCXByb2R1Y2VyIHRvIG5hbWUgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBpbiB0aGUKKwkJbW9kdWxlJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQorCQlhbW9uZyB0aGUgcG9ydCBjb21wb25lbnQgbmFtZXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBtb2R1bGUuCisKKwkJVXNlZCBpbjogcG9ydC1jb21wb25lbnQKKworCQlFeGFtcGxlOgorCQkJPHBvcnQtY29tcG9uZW50LW5hbWU+RW1wbG95ZWVTZXJ2aWNlCisJCQk8L3BvcnQtY29tcG9uZW50LW5hbWU+CisKKwkJXV0+CisJICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJICA8L3hzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpwb3J0LWNvbXBvbmVudCIvPgorCSAgPHhzZDpmaWVsZCB4cGF0aD0iajJlZTpwb3J0LWNvbXBvbmVudC1uYW1lIi8+CisJPC94c2Q6a2V5PgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKworICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCisJCSAgIGZpeGVkPSIxLjEiCisJCSAgIHVzZT0icmVxdWlyZWQiPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjEuCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8L3hzZDphdHRyaWJ1dGU+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPC94c2Q6c2NoZW1hPgorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODNiZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZApAQCAtMCwwICsxLDM1OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisJICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisJICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisJICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgorCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCisJICAgIHZlcnNpb249IjEuMSI+CisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICBAKCMpajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2RzCTEuMTAgMDIvMTEvMDMKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbworICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cworICAgICAgcmVzZXJ2ZWQuCisKKyAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKKyAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCisgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKKyAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCisgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCisgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQorICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgorCisgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCisgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCisgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKKyAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCisgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCisKKyAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcworICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KKworICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCisgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCisgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCisgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KKworICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCisgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCisKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgorCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3J0LWNvbXBvbmVudC1yZWZUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeQorCW9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCisJdG8gYSBXU0RMIHBvcnQuIEl0IG9wdGlvbmFsbHkgYXNzb2NpYXRlcyB0aGUgU2VydmljZSBFbmRwb2ludAorCUludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQKKwlieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiCisJCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQKKwkgICAgSmF2YSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIG9mIGEKKwkgICAgV1NETCBwb3J0LgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQtbGluayIKKwkJICAgdHlwZT0iajJlZTpzdHJpbmciCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHBvcnQtY29tcG9uZW50LWxpbmsgZWxlbWVudCBsaW5rcyBhIHBvcnQtY29tcG9uZW50LXJlZgorCSAgICB0byBhIHNwZWNpZmljIHBvcnQtY29tcG9uZW50IHJlcXVpcmVkIHRvIGJlIG1hZGUgYXZhaWxhYmxlCisJICAgIGJ5IGEgc2VydmljZSByZWZlcmVuY2UuCisKKwkgICAgVGhlIHZhbHVlIG9mIGEgcG9ydC1jb21wb25lbnQtbGluayBtdXN0IGJlIHRoZQorCSAgICBwb3J0LWNvbXBvbmVudC1uYW1lIG9mIGEgcG9ydC1jb21wb25lbnQgaW4gdGhlIHNhbWUgbW9kdWxlCisJICAgIG9yIGFub3RoZXIgbW9kdWxlIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uIHVuaXQuIFRoZSBzeW50YXgKKwkgICAgZm9yIHNwZWNpZmljYXRpb24gZm9sbG93cyB0aGUgc3ludGF4IGRlZmluZWQgZm9yIGVqYi1saW5rCisJICAgIGluIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Z3JvdXAgbmFtZT0ic2VydmljZS1yZWZHcm91cCI+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXJlZiIKKwkJICAgdHlwZT0iajJlZTpzZXJ2aWNlLXJlZlR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCTx4c2Q6a2V5IG5hbWU9InNlcnZpY2UtcmVmX2hhbmRsZXItbmFtZS1rZXkiPgorCSAgPHhzZDphbm5vdGF0aW9uPgorCSAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQorCSAgICAgIHdpdGhpbiB0aGUgbW9kdWxlLgorCisJICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJICA8L3hzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpoYW5kbGVyIi8+CisJICA8eHNkOmZpZWxkIHhwYXRoPSJqMmVlOmhhbmRsZXItbmFtZSIvPgorCTwveHNkOmtleT4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmdyb3VwPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLXJlZlR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBzZXJ2aWNlLXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgcmVmZXJlbmNlIHRvIGEgV2ViCisJc2VydmljZS4gSXQgY29udGFpbnMgb3B0aW9uYWwgZGVzY3JpcHRpb24sIGRpc3BsYXkgbmFtZSBhbmQKKwlpY29ucywgYSBkZWNsYXJhdGlvbiBvZiB0aGUgcmVxdWlyZWQgU2VydmljZSBpbnRlcmZhY2UsCisJYW4gb3B0aW9uYWwgV1NETCBkb2N1bWVudCBsb2NhdGlvbiwgYW4gb3B0aW9uYWwgc2V0CisJb2YgSkFYLVJQQyBtYXBwaW5ncywgYW4gb3B0aW9uYWwgUU5hbWUgZm9yIHRoZSBzZXJ2aWNlIGVsZW1lbnQsCisJYW4gb3B0aW9uYWwgc2V0IG9mIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlcyB0byBiZSByZXNvbHZlZAorCWJ5IHRoZSBjb250YWluZXIgdG8gYSBXU0RMIHBvcnQsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgaGFuZGxlcnMuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1yZWYtbmFtZSIKKwkJICAgdHlwZT0iajJlZTpqbmRpLW5hbWVUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHNlcnZpY2UtcmVmLW5hbWUgZWxlbWVudCBkZWNsYXJlcyBsb2dpY2FsIG5hbWUgdGhhdCB0aGUKKwkgICAgY29tcG9uZW50cyBpbiB0aGUgbW9kdWxlIHVzZSB0byBsb29rIHVwIHRoZSBXZWIgc2VydmljZS4gSXQKKwkgICAgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgc2VydmljZSByZWZlcmVuY2UgbmFtZXMgc3RhcnQgd2l0aAorCSAgICAic2VydmljZS8iLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1pbnRlcmZhY2UiCisJCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBzZXJ2aWNlLWludGVyZmFjZSBlbGVtZW50IGRlY2xhcmVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKKwkgICAgbmFtZSBvZiB0aGUgSkFYLVJQQyBTZXJ2aWNlIGludGVyZmFjZSB0aGUgY2xpZW50IGRlcGVuZHMgb24uCisJICAgIEluIG1vc3QgY2FzZXMgdGhlIHZhbHVlIHdpbGwgYmUgamF2YXgueG1sLnJwYy5TZXJ2aWNlLiAgQSBKQVgtUlBDCisJICAgIGdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZSBjbGFzcyBtYXkgYWxzbyBiZSBzcGVjaWZpZWQuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLWZpbGUiCisJCSAgIHR5cGU9ImoyZWU6eHNkQW55VVJJVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIFVSSSBsb2NhdGlvbiBvZiBhIFdTREwKKwkgICAgZmlsZS4gVGhlIGxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBtb2R1bGUuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqYXhycGMtbWFwcGluZy1maWxlIgorCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQKKwkgICAgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieQorCSAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuICBUaGUKKwkgICAgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZSBmaWxlLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1xbmFtZSIKKwkJICAgdHlwZT0iajJlZTp4c2RRTmFtZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHNlcnZpY2UtcW5hbWUgZWxlbWVudCBkZWNsYXJlcyB0aGUgc3BlY2lmaWMgV1NETCBzZXJ2aWNlCisJICAgIGVsZW1lbnQgdGhhdCBpcyBiZWluZyByZWZlcmVkIHRvLiAgSXQgaXMgbm90IHNwZWNpZmllZCBpZiBubworCSAgICB3c2RsLWZpbGUgaXMgZGVjbGFyZWQuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LWNvbXBvbmVudC1yZWYiCisJCSAgIHR5cGU9ImoyZWU6cG9ydC1jb21wb25lbnQtcmVmVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBwb3J0LWNvbXBvbmVudC1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIGNsaWVudCBkZXBlbmRlbmN5CisJICAgIG9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCisJICAgIHRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKKwkgICAgSW50ZXJmYWNlIHdpdGggYSBwYXJ0aWN1bGFyIHBvcnQtY29tcG9uZW50LiBUaGlzIGlzIG9ubHkgdXNlZAorCSAgICBieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyIgorCQkgICB0eXBlPSJqMmVlOnNlcnZpY2UtcmVmX2hhbmRsZXJUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbgorCSAgICBhY2Nlc3MgdGhlIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUKKwkgICAgSGFuZGxlckluZm8gaW50ZXJmYWNlLiBJZiBwb3J0LW5hbWUgaXMgbm90IHNwZWNpZmllZCwgdGhlCisJICAgIGhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYWxsIHBvcnRzIG9mIHRoZQorCSAgICBzZXJ2aWNlLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmX2hhbmRsZXJUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuIGFjY2VzcyB0aGUKKwlpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYKKwlwb3J0LW5hbWUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZSBhc3NvY2lhdGVkCisJd2l0aCBhbGwgcG9ydHMgb2YgdGhlIHNlcnZpY2UuCisKKwlVc2VkIGluOiBzZXJ2aWNlLXJlZgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKKwkgICAgd2l0aGluIHRoZSBtb2R1bGUuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jbGFzcyIKKwkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgRGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgaGFuZGxlcgorCSAgICBpbXBsZW1lbnRhdGlvbi4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgorCQkgICB0eXBlPSJqMmVlOnBhcmFtLXZhbHVlVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic29hcC1oZWFkZXIiCisJCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgRGVmaW5lcyB0aGUgUU5hbWUgb2YgYSBTT0FQIGhlYWRlciB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkCisJICAgIGJ5IHRoZSBoYW5kbGVyLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic29hcC1yb2xlIgorCQkgICB0eXBlPSJqMmVlOnN0cmluZyIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0CisJICAgIHRoZSBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHBvcnQtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIFdTREwgcG9ydC1uYW1lIHRoYXQgYQorCSAgICBoYW5kbGVyIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGguCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPC94c2Q6c2NoZW1hPgorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL2pzcF8yXzAueHNkIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9qc3BfMl8wLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGUzYzNmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9qc3BfMl8wLnhzZApAQCAtMCwwICsxLDMyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisJICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisJICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisJICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgorCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCisJICAgIHZlcnNpb249IjIuMCI+CisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICBAKCMpanNwXzJfMC54c2RzCTEuMTcgMDMvMTgvMDMKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbworICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cworICAgICAgcmVzZXJ2ZWQuCisKKyAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKKyAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCisgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKKyAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCisgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCisgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQorICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgorCisgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCisgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCisgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKKyAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCisgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCisKKyAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcworICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KKworICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCisgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCisgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCisgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KKworICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCisgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCisKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgMi4wIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAgICAgdHlwZXMuICBUaGUgSlNQIDIuMCBzY2hlbWEgY29udGFpbnMgYWxsIHRoZSBzcGVjaWFsCisgICAgICBzdHJ1Y3R1cmVzIGFuZCBkYXRhdHlwZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHVzZSBKU1AgZmlsZXMKKyAgICAgIGZyb20gYSB3ZWIgYXBwbGljYXRpb24uCisKKyAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIHNjaGVtYSBpcyB1c2VkIGJ5IHRoZSB3ZWItYXBwXzJfNC54c2QKKyAgICAgIGZpbGUgdG8gZGVmaW5lIEpTUCBzcGVjaWZpYyBjb250ZW50LgorCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFCisgICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCisKKyAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKKwlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAorCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgorCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKKwlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQorCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCisJcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCisJbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCisKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+CisKKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLWNvbmZpZ1R5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBqc3AtY29uZmlnVHlwZSBpcyB1c2VkIHRvIHByb3ZpZGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24KKwlpbmZvcm1hdGlvbiBmb3IgdGhlIEpTUCBmaWxlcyBpbiBhIHdlYiBhcHBsaWNhdGlvbi4gSXQgaGFzCisJdHdvIHN1YmVsZW1lbnRzLCB0YWdsaWIgYW5kIGpzcC1wcm9wZXJ0eS1ncm91cC4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWIiCisJCSAgIHR5cGU9ImoyZWU6dGFnbGliVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpzcC1wcm9wZXJ0eS1ncm91cCIKKwkJICAgdHlwZT0iajJlZTpqc3AtcHJvcGVydHktZ3JvdXBUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLWZpbGVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUganNwLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbCBwYXRoIHRvIGEgSlNQIGZpbGUKKwl3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBiZWdpbm5pbmcgd2l0aCBhIGAvJy4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnBhdGhUeXBlIi8+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpzcC1wcm9wZXJ0eS1ncm91cFR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBqc3AtcHJvcGVydHktZ3JvdXBUeXBlIGlzIHVzZWQgdG8gZ3JvdXAgYSBudW1iZXIgb2YKKwlmaWxlcyBzbyB0aGV5IGNhbiBiZSBnaXZlbiBnbG9iYWwgcHJvcGVydHkgaW5mb3JtYXRpb24uCisJQWxsIGZpbGVzIHNvIGRlc2NyaWJlZCBhcmUgZGVlbWVkIHRvIGJlIEpTUCBmaWxlcy4gIFRoZQorCWZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgY2FuIGJlIGRlc2NyaWJlZDoKKworCSAgICAtIENvbnRyb2wgd2hldGhlciBFTCBpcyBpZ25vcmVkCisJICAgIC0gQ29udHJvbCB3aGV0aGVyIHNjcmlwdGluZyBlbGVtZW50cyBhcmUgaW52YWxpZAorCSAgICAtIEluZGljYXRlIHBhZ2VFbmNvZGluZyBpbmZvcm1hdGlvbi4KKwkgICAgLSBJbmRpY2F0ZSB0aGF0IGEgcmVzb3VyY2UgaXMgYSBKU1AgZG9jdW1lbnQgKFhNTCkKKwkgICAgLSBQcmVsdWRlIGFuZCBDb2RhIGF1dG9tYXRpYyBpbmNsdWRlcy4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKKwkJICAgdHlwZT0iajJlZTp1cmwtcGF0dGVyblR5cGUiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWwtaWdub3JlZCIKKwkJICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IHNldCB0aGUgaXNFTElnbm9yZWQKKwkgICAgcHJvcGVydHkgb2YgYSBncm91cCBvZiBKU1AgcGFnZXMuICBCeSBkZWZhdWx0LCB0aGUKKwkgICAgRUwgZXZhbHVhdGlvbiBpcyBlbmFibGVkIGZvciBXZWIgQXBwbGljYXRpb25zIHVzaW5nCisJICAgIGEgU2VydmxldCAyLjQgb3IgZ3JlYXRlciB3ZWIueG1sLCBhbmQgZGlzYWJsZWQKKwkgICAgb3RoZXJ3aXNlLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhZ2UtZW5jb2RpbmciCisJCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgdmFsaWQgdmFsdWVzIG9mIHBhZ2UtZW5jb2RpbmcgYXJlIHRob3NlIG9mIHRoZQorCSAgICBwYWdlRW5jb2RpbmcgcGFnZSBkaXJlY3RpdmUuICBJdCBpcyBhCisJICAgIHRyYW5zbGF0aW9uLXRpbWUgZXJyb3IgdG8gbmFtZSBkaWZmZXJlbnQgZW5jb2RpbmdzCisJICAgIGluIHRoZSBwYWdlRW5jb2RpbmcgYXR0cmlidXRlIG9mIHRoZSBwYWdlIGRpcmVjdGl2ZQorCSAgICBvZiBhIEpTUCBwYWdlIGFuZCBpbiBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQKKwkgICAgbWF0Y2hpbmcgdGhlIHBhZ2UuICBJdCBpcyBhbHNvIGEgdHJhbnNsYXRpb24tdGltZQorCSAgICBlcnJvciB0byBuYW1lIGRpZmZlcmVudCBlbmNvZGluZ3MgaW4gdGhlIHByb2xvZworCSAgICBvciB0ZXh0IGRlY2xhcmF0aW9uIG9mIGEgZG9jdW1lbnQgaW4gWE1MIHN5bnRheCBhbmQKKwkgICAgaW4gYSBKU1AgY29uZmlndXJhdGlvbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBkb2N1bWVudC4KKwkgICAgSXQgaXMgbGVnYWwgdG8gbmFtZSB0aGUgc2FtZSBlbmNvZGluZyB0aHJvdWdoCisJICAgIG11bGl0cGxlIG1lY2hhbmlzbXMuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NyaXB0aW5nLWludmFsaWQiCisJCSAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIENhbiBiZSB1c2VkIHRvIGVhc2lseSBkaXNhYmxlIHNjcmlwdGluZyBpbiBhCisJICAgIGdyb3VwIG9mIEpTUCBwYWdlcy4gIEJ5IGRlZmF1bHQsIHNjcmlwdGluZyBpcworCSAgICBlbmFibGVkLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlzLXhtbCIKKwkJICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgSWYgdHJ1ZSwgZGVub3RlcyB0aGF0IHRoZSBncm91cCBvZiByZXNvdXJjZXMKKwkgICAgdGhhdCBtYXRjaCB0aGUgVVJMIHBhdHRlcm4gYXJlIEpTUCBkb2N1bWVudHMsCisJICAgIGFuZCB0aHVzIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgWE1MIGRvY3VtZW50cy4KKwkgICAgSWYgZmFsc2UsIHRoZSByZXNvdXJjZXMgYXJlIGFzc3VtZWQgdG8gbm90CisJICAgIGJlIEpTUCBkb2N1bWVudHMsIHVubGVzcyB0aGVyZSBpcyBhbm90aGVyCisJICAgIHByb3BlcnR5IGdyb3VwIHRoYXQgaW5kaWNhdGVzIG90aGVyd2lzZS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmNsdWRlLXByZWx1ZGUiCisJCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgaW5jbHVkZS1wcmVsdWRlIGVsZW1lbnQgaXMgYSBjb250ZXh0LXJlbGF0aXZlCisJICAgIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUKKwkgICAgV2ViIEFwcGxpY2F0aW9uLiAgV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAorCSAgICB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgKGFzCisJICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2gKKwkgICAgSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5jbHVkZS1jb2RhIgorCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIGluY2x1ZGUtY29kYSBlbGVtZW50IGlzIGEgY29udGV4dC1yZWxhdGl2ZQorCSAgICBwYXRoIHRoYXQgbXVzdCBjb3JyZXNwb25kIHRvIGFuIGVsZW1lbnQgaW4gdGhlCisJICAgIFdlYiBBcHBsaWNhdGlvbi4gIFdoZW4gdGhlIGVsZW1lbnQgaXMgcHJlc2VudCwKKwkgICAgdGhlIGdpdmVuIHBhdGggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIChhcworCSAgICBpbiBhbiBpbmNsdWRlIGRpcmVjdGl2ZSkgYXQgdGhlIGVuZCBvZiBlYWNoCisJICAgIEpTUCBwYWdlIGluIHRoaXMganNwLXByb3BlcnR5LWdyb3VwLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhZ2xpYlR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSB0YWdsaWJUeXBlIGRlZmluZXMgdGhlIHN5bnRheCBmb3IgZGVjbGFyaW5nIGluCisJdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0aGF0IGEgdGFnIGxpYnJhcnkgaXMKKwlhdmFpbGFibGUgdG8gdGhlIGFwcGxpY2F0aW9uLiAgVGhpcyBjYW4gYmUgZG9uZQorCXRvIG92ZXJyaWRlIGltcGxpY2l0IG1hcCBlbnRyaWVzIGZyb20gVExEIGZpbGVzIGFuZAorCWZyb20gdGhlIGNvbnRhaW5lci4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItdXJpIgorCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIEEgdGFnbGliLXVyaSBlbGVtZW50IGRlc2NyaWJlcyBhIFVSSSBpZGVudGlmeWluZyBhCisJICAgIHRhZyBsaWJyYXJ5IHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gIFRoZSBib2R5CisJICAgIG9mIHRoZSB0YWdsaWItdXJpIGVsZW1lbnQgbWF5IGJlIGVpdGhlciBhbgorCSAgICBhYnNvbHV0ZSBVUkkgc3BlY2lmaWNhdGlvbiwgb3IgYSByZWxhdGl2ZSBVUkkuCisJICAgIFRoZXJlIHNob3VsZCBiZSBubyBlbnRyaWVzIGluIHdlYi54bWwgd2l0aCB0aGUKKwkgICAgc2FtZSB0YWdsaWItdXJpIHZhbHVlLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliLWxvY2F0aW9uIgorCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgdGhlIHRhZ2xpYi1sb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbgorCSAgICAoYXMgYSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViCisJICAgIGFwcGxpY2F0aW9uKSB3aGVyZSB0byBmaW5kIHRoZSBUYWcgTGlicmFyeQorCSAgICBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8L3hzZDpzY2hlbWE+CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvanNweG1sLmR0ZCBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvanNweG1sLmR0ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDg1MTVkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9qc3B4bWwuZHRkCkBAIC0wLDAgKzEsMTkwIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gRFREIGZvciBKU1AgMi4wCisgICAgIHRoYW5rcyB0byBCb2IgRm9zdGVyLCBXZWJHYWluCistLT4KKworPCEtLSAKKyAgICAgVGhpcyBEVEQgaXMgbm90IGNvbmRpdGlvbmFsIG9uIGFueSBwYXJhbWV0ZXIgZW50aXRpZXMgaW4gdGhlIGludGVybmFsCisgICAgIHN1YnNldCBhbmQgZG9lcyBub3QgZXhwb3J0IGFueSBnZW5lcmFsIGVudGl0aWVzLgorLS0+CisKKzwhLS09PT09PT09PT09PT09PT09PT0gQ29uc3RyYWluZWQgTmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzwhRU5USVRZICUgVVJJICJDREFUQSI+CisgICAgPCEtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwgc2VlIFtSRkMyMzk2XSAtLT4KKworPCFFTlRJVFkgJSBVcmlMaXN0ICJDREFUQSI+CisgICAgPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMgLS0+CisKKzwhRU5USVRZICUgVVJMICJDREFUQSI+CisgICAgPCEtLSBhIHJlbGF0aXZlIHVybFNwZWMgaXMgYXMgaW4gU2VjdGlvbiAyLjEwLjIuIC0tPgorCis8IUVOVElUWSAlIEJlYW5JRCAiSURSRUYiPgorICAgIDwhLS0gYSBwcmV2aW91c2x5IGRlY2xhcmVkIGJlYW4gSUQgaW4gdGhlIGN1cnJlbnQgc2NvcGUuIC0tPgorCis8IUVOVElUWSAlIFByZWZpeCAiQ0RBVEEiPgorICAgIDwhLS0gYSBOYW1lIHRoYXQgY29udGFpbnMgbm8gOiBjaGFyYWN0ZXJzLiAtLT4KKworPCFFTlRJVFkgJSBDbGFzc05hbWUgIkNEQVRBIj4KKyAgICA8IS0tIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUuIC0tPgorCis8IUVOVElUWSAlIFR5cGVOYW1lICJDREFUQSI+CisgICAgPCEtLSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBvciBpbnRlcmZhY2UgbmFtZS4gLS0+CisKKzwhRU5USVRZICUgQmVhbk5hbWUgIkNEQVRBIj4KKyAgICA8IS0tIGEgYmVhbiBuYW1lIGFzIGV4cGVjdGVkIGJ5IGphdmEuYmVhbnMuQmVhbnMgaW5zdGFudGlhdGUoKS4gLS0+CisKKzwhRU5USVRZICUgQ29udGVudCAiQ0RBVEEiPgorICAgIDwhLS0gYSBNSU1FIHR5cGUgZm9sbG93ZWQgYnkgYW4gSUFOQSBjaGFyc2V0LCBhcyAiIHR5cGUgWzsgUz8gWydjaGFyc2V0PSddIGNoYXJzZXRdICIgLS0+CisKKzwhRU5USVRZICUgTGVuZ3RoICJDREFUQSI+CisgICAgPCEtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+CisKKzwhRU5USVRZICUgUGl4ZWxzICJDREFUQSI+CisgICAgPCEtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgorCis8IUVOVElUWSAlIEJvb2wgIih0cnVlfGZhbHNlfHllc3xubykiPgorICAgIDwhLS0gYm9vbGVhbiAtLT4KKworPCEtLSB1c2VkIGZvciBvYmplY3QsIGFwcGxldCwgaW1nLCBpbnB1dCBhbmQgaWZyYW1lIC0tPgorPCFFTlRJVFkgJSBJbWdBbGlnbiAiKHRvcHxtaWRkbGV8Ym90dG9tfGxlZnR8cmlnaHQpIj4KKworPCEtLT09PT09PT09PT09PT09PT09PT0gRWxlbWVudCBHcm91cHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzwhRU5USVRZICUgRGlyZWN0aXZlcyAianNwOmRpcmVjdGl2ZS5wYWdlfGpzcDpkaXJlY3RpdmUuaW5jbHVkZSI+CisKKzwhRU5USVRZICUgU2NyaXB0cyAianNwOnNjcmlwdGxldHxqc3A6ZGVjbGFyYXRpb258anNwOmV4cHJlc3Npb24iPgorCis8IUVOVElUWSAlIEFjdGlvbnMKKyAgICAianNwOnVzZUJlYW4KKyAgICB8anNwOnNldFByb3BlcnR5CisgICAgfGpzcDpnZXRQcm9wZXJ0eQorICAgIHxqc3A6aW5jbHVkZQorICAgIHxqc3A6Zm9yd2FyZAorICAgIHxqc3A6cGx1Z2luIgorPgorCis8IUVOVElUWSAlIEJvZHkgIihqc3A6dGV4dHwlRGlyZWN0aXZlczt8JVNjcmlwdHM7fCVBY3Rpb25zOykqIj4KKworCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPCEtLSAgICBSb290IGVsZW1lbnQgb2YgYSBKU1AgcGFnZS4KKy0tPgorPCFFTEVNRU5UIGpzcDpyb290ICVCb2R5Oz4KKzwhQVRUTElTVCBqc3A6cm9vdAorICAgIHhtbG5zOmpzcCAgICAgICBDREFUQSAgICAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiCisgICAgdmVyc2lvbiAgICAgICAgIENEQVRBICAgICAgICAgICAjUkVRVUlSRUQKKz4KKworPCFFTEVNRU5UIGpzcDpkaXJlY3RpdmUucGFnZSBFTVBUWT4KKzwhQVRUTElTVCBqc3A6ZGlyZWN0aXZlLnBhZ2UKKyAgICBsYW5ndWFnZSAgICAgICAgQ0RBVEEgICAgICAgICAgICJqYXZhIgorICAgIGV4dGVuZHMgICAgICAgICAlQ2xhc3NOYW1lOyAgICAgI0lNUExJRUQKKyAgICBjb250ZW50VHlwZSAgICAgJUNvbnRlbnQ7ICAgICAgICJ0ZXh0L2h0bWw7IElTTy04ODU5LTEiCisgICAgaW1wb3J0ICAgICAgICAgIENEQVRBICAgICAgICAgICAjSU1QTElFRAorICAgIHNlc3Npb24gICAgICAgICAlQm9vbDsgICAgICAgICAgInRydWUiCisgICAgYnVmZmVyICAgICAgICAgIENEQVRBICAgICAgICAgICAiOGtiIgorICAgIGF1dG9GbHVzaCAgICAgICAlQm9vbDsgICAgICAgICAgInRydWUiCisgICAgaXNUaHJlYWRTYWZlICAgICVCb29sOyAgICAgICAgICAidHJ1ZSIKKyAgICBpbmZvICAgICAgICAgICAgQ0RBVEEgICAgICAgICAgICNJTVBMSUVECisgICAgZXJyb3JQYWdlICAgICAgICVVUkw7ICAgICAgICAgICAjSU1QTElFRAorICAgIGlzRXJyb3JQYWdlICAgICAlQm9vbDsgICAgICAgICAgImZhbHNlIgorICAgIHBhZ2VFbmNvZGluZyAgICBDREFUQSAgICAgICAgICAgI0lNUExJRUQKKyAgICBpc0VMSWdub3JlZCAgICAgJUJvb2w7ICAgICAgICAgICNJTVBMSUVECis+CisKKzwhLS0gdGhlIGpzcDpkaXJlY3RpdmUuaW5jbHVkZSBvbmx5IGFwcGVhcnMgaW4gSlNQIGRvY3VtZW50cyBhbmQgZG9lcworICAgICBub3QgYXBwZWFyIGluIHRoZSBYTUwgdmlld3Mgb2YgSlNQIHBhZ2VzLgorLS0+CisKKzwhRUxFTUVOVCBqc3A6ZGlyZWN0aXZlLmluY2x1ZGUgRU1QVFk+Cis8IUFUVExJU1QganNwOmRpcmVjdGl2ZS5pbmNsdWRlCisgICAgZmlsZSAgICAgICAgICAgICVVUkk7ICAgICAgICAgICAjUkVRVUlSRUQKKz4KKworPCFFTEVNRU5UIGpzcDpzY3JpcHRsZXQgKCNQQ0RBVEEpPgorCis8IUVMRU1FTlQganNwOmRlY2xhcmF0aW9uICgjUENEQVRBKT4KKworPCFFTEVNRU5UIGpzcDpleHByZXNzaW9uICgjUENEQVRBKT4KKworPCFFTEVNRU5UIGpzcDp1c2VCZWFuICVCb2R5Oz4KKzwhQVRUTElTVCBqc3A6dXNlQmVhbgorICAgIGlkICAgICAgICAgICAgICBJRCAgICAgICAgICAgICAgI1JFUVVJUkVECisgICAgY2xhc3MgICAgICAgICAgICVDbGFzc05hbWU7ICAgICAjSU1QTElFRAorICAgIHR5cGUgICAgICAgICAgICAlVHlwZU5hbWU7ICAgICAgI0lNUExJRUQKKyAgICBiZWFuTmFtZSAgICAgICAgJUJlYW5OYW1lOyAgICAgICNJTVBMSUVECisgICAgc2NvcGUgICAgICAgICAgIChwYWdlCisgICAgICAgICAgICAgICAgICAgIHxzZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIHxyZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgIHxhcHBsaWNhdGlvbikgICAicGFnZSIKKz4KKworPCFFTEVNRU5UIGpzcDpzZXRQcm9wZXJ0eSBFTVBUWT4KKzwhQVRUTElTVCBqc3A6c2V0UHJvcGVydHkKKyAgICBuYW1lICAgICAgICAgICAgJUJlYW5JRDsgICAgICAgICNSRVFVSVJFRAorICAgIHByb3BlcnR5ICAgICAgICBDREFUQSAgICAgICAgICAgI1JFUVVJUkVECisgICAgdmFsdWUgICAgICAgICAgIENEQVRBICAgICAgICAgICAjSU1QTElFRAorICAgIHBhcmFtICAgICAgICAgICBDREFUQSAgICAgICAgICAgI0lNUExJRUQKKz4KKworPCFFTEVNRU5UIGpzcDpnZXRQcm9wZXJ0eSBFTVBUWT4KKzwhQVRUTElTVCBqc3A6Z2V0UHJvcGVydHkKKyAgICBuYW1lICAgICAgICAgICAgJUJlYW5JRDsgICAgICAgICNSRVFVSVJFRAorICAgIHByb3BlcnR5ICAgICAgICBDREFUQSAgICAgICAgICAgI1JFUVVJUkVECis+CisKKzwhRUxFTUVOVCBqc3A6aW5jbHVkZSAoanNwOnBhcmFtKik+Cis8IUFUVExJU1QganNwOmluY2x1ZGUKKyAgICBmbHVzaCAgICAgICAgICAgJUJvb2w7ICAgICAgICAgICJmYWxzZSIKKyAgICBwYWdlICAgICAgICAgICAgJVVSTDsgICAgICAgICAgICNSRVFVSVJFRAorPgorCis8IUVMRU1FTlQganNwOmZvcndhcmQgKGpzcDpwYXJhbSopPgorPCFBVFRMSVNUIGpzcDpmb3J3YXJkCisgICAgcGFnZSAgICAgICAgICAgICVVUkw7ICAgICAgICAgICAjUkVRVUlSRUQKKz4KKworPCFFTEVNRU5UIGpzcDpwbHVnaW4gKGpzcDpwYXJhbXM/LCBqc3A6ZmFsbGJhY2s/KT4KKzwhQVRUTElTVCBqc3A6cGx1Z2luCisgICAgdHlwZSAgICAgICAgICAgIChiZWFufGFwcGxldCkgICAjUkVRVUlSRUQKKyAgICBjb2RlICAgICAgICAgICAgJVVSSTsgICAgICAgICAgICNJTVBMSUVECisgICAgY29kZWJhc2UgICAgICAgICVVUkk7ICAgICAgICAgICAjSU1QTElFRAorICAgIGFsaWduICAgICAgICAgICAlSW1nQWxpZ247ICAgICAgI0lNUExJRUQKKyAgICBhcmNoaXZlICAgICAgICAgJVVyaUxpc3Q7ICAgICAgICNJTVBMSUVECisgICAgaGVpZ2h0ICAgICAgICAgICVMZW5ndGg7ICAgICAgICAjSU1QTElFRAorICAgIGhzcGFjZSAgICAgICAgICAlUGl4ZWxzOyAgICAgICAgI0lNUExJRUQKKyAgICBqcmV2ZXJzaW9uICAgICAgQ0RBVEEgICAgICAgICAgICIxLjIiCisgICAgbmFtZSAgICAgICAgICAgIE5NVE9LRU4gICAgICAgICAjSU1QTElFRAorICAgIHZzcGFjZSAgICAgICAgICAlUGl4ZWxzOyAgICAgICAgI0lNUExJRUQKKyAgICB3aWR0aCAgICAgICAgICAgJUxlbmd0aDsgICAgICAgICNJTVBMSUVECisgICAgbnNwbHVnaW51cmwgICAgICVVUkk7ICAgICAgICAgICAjSU1QTElFRAorICAgIGllcGx1Z2ludXJsICAgICAlVVJJOyAgICAgICAgICAgI0lNUExJRUQKKz4KKworPCFFTEVNRU5UIGpzcDpwYXJhbXMgKGpzcDpwYXJhbSspPgorCis8IUVMRU1FTlQganNwOnBhcmFtIEVNUFRZPgorPCFBVFRMSVNUIGpzcDpwYXJhbQorICAgIG5hbWUgICAgICAgICAgICBDREFUQSAgICAgICAgICAgI1JFUVVJUkVECisgICAgdmFsdWUgICAgICAgICAgIENEQVRBICAgICAgICAgICAjUkVRVUlSRUQKKz4KKworPCFFTEVNRU5UIGpzcDp0ZXh0ICNQQ0RBVEE+CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvanNweG1sLnhzZCBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvanNweG1sLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTMyZGM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9qc3B4bWwueHNkCkBAIC0wLDAgKzEsNTE0IEBACis8P3htbCB2ZXJzaW9uID0iMS4wIj8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhRE9DVFlQRSBzY2hlbWEgWworPCEtLSBQYXR0ZXJucyAtLT4KKzwhRU5USVRZIElkZW50aWZpZXIgICAiKFxwe0x9fF98JCkoXHB7Tn18XHB7TH18X3wkKSoiPgorPCFFTlRJVFkgVHlwZU5hbWUgICAgICImSWRlbnRpZmllcjsoXC4mSWRlbnRpZmllcjspKiI+Cis8IUVOVElUWSBXUyAgICAgICAiXHMqIj4KKzwhRU5USVRZIEltcG9ydCAgICAgIiZUeXBlTmFtZTsoXC5cKik/Ij4KKzwhRU5USVRZIEltcG9ydExpc3QgICAiJkltcG9ydDsoJldTOywmV1M7JkltcG9ydDspKiI+Cis8IUVOVElUWSBTZXRQcm9wICAgICIoJklkZW50aWZpZXI7fFwqKSI+Cis8IUVOVElUWSBSZWxhdGl2ZVVSTCAgIlteOiMvXD9dKig6ezAsMH18WyMvXD9dLiopIj4KKzwhRU5USVRZIExlbmd0aCAgICAgIlswLTldKiYjeDI1Oz8iPgorPCFFTlRJVFkgQXNjaWlOYW1lICAgICJbQS1aYS16MC05Xy1dKiI+Cis8IUVOVElUWSBWYWxpZENvbnRlbnRUeXBlICAiJkFzY2lpTmFtZTsvJkFzY2lpTmFtZTsoOyZXUzsoY2hhcnNldD0pPyZBc2NpaU5hbWU7KT8iPgorPCFFTlRJVFkgVmFsaWRQYWdlRW5jb2RpbmcgICImQXNjaWlOYW1lOy8mQXNjaWlOYW1lOyI+Cis8IUVOVElUWSBCdWZmZXIgICAgICJbMC05XStrYiI+Cis8IUVOVElUWSBSVGV4cHIgICAgICImI3gyNTs9LiomI3gyNTsiPgorXT4KKworCis8IS0tQ29uZm9ybXMgdG8gdzNjIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIC0tPgorCis8eHNkOnNjaGVtYQorICAgIHhtbG5zID0gImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiCisgICAgeG1sbnM6eHNkID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgIHhtbG5zOmpzcCA9ICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIgorICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIgorICAgIGVsZW1lbnRGb3JtRGVmYXVsdCA9ICJxdWFsaWZpZWQiCisgICAgYXR0cmlidXRlRm9ybURlZmF1bHQgPSAidW5xdWFsaWZpZWQiPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICBYTUwgU2NoZW1hIGZvciBKU1AgMi4wLgorCisgICAgICBUaGlzIHNjaGVtYSBpcyBiYXNlZCB1cG9uIHRoZSByZWNlbnQgKE1heSA1dGgsIDIwMDEpCisgICAgICBXM0MgcmVjb21tZW5kYXRpb24gZm9yIFhNTCBTY2hlbWEuCisKKyAgICAgIEEgSlNQIHRyYW5zbGF0b3Igc2hvdWxkIHJlamVjdCBhbiBYTUwtZm9ybWF0IGZpbGUgdGhhdCBpcworICAgICAgbm90IHN0cmljdGx5IHZhbGlkIGFjY29yZGluZyB0byB0aGlzIHNjaGVtYSBvciBkb2VzIG5vdCBvYnNlcnZlCisgICAgICB0aGUgY29uc3RyYWludHMgZG9jdW1lbnRlZCBoZXJlLiBBIHRyYW5zbGF0b3IgaXMgbm90IHJlcXVpcmVkCisgICAgICB0byB1c2UgdGhpcyBzY2hlbWEgZm9yIHZhbGlkYXRpb24gb3IgdG8gdXNlIGEgdmFsaWRhdGluZyBwYXJzZXIuCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworCisgIDwhLS0gQ29tcGxleCBUeXBlcyAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiQm9keSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBCb2R5IGRlZmluZXMgdGhlICJ0b3AtbGV2ZWwiIGVsZW1lbnRzIGluIHJvb3QgYW5kIGJlYW5JbmZvLgorICAgICAgICBUaGVyZSBhcmUgcHJvYmFibHkgb3RoZXIgZWxlbWVudHMgdGhhdCBzaG91bGQgdXNlIGl0LgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6Z3JvdXAgcmVmID0gIkJvZHlncm91cCIgbWluT2NjdXJzID0gIjAiIG1heE9jY3VycyA9ICJ1bmJvdW5kZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSBncm91cHMgLS0+CisKKyAgPHhzZDpncm91cCBuYW1lID0gIkJvZHlncm91cCI+CisgICAgPHhzZDpjaG9pY2U+CisgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gImRpcmVjdGl2ZS5wYWdlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gImRpcmVjdGl2ZS5pbmNsdWRlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gInNjcmlwdGxldCIvPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJkZWNsYXJhdGlvbiIvPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJleHByZXNzaW9uIi8+CisgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gInVzZUJlYW4iLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAic2V0UHJvcGVydHkiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAiZ2V0UHJvcGVydHkiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAiaW5jbHVkZSIvPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJmb3J3YXJkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gInBsdWdpbiIvPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJ0ZXh0Ii8+CisgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cyA9ICJsYXgiLz4KKyAgICA8L3hzZDpjaG9pY2U+CisgIDwveHNkOmdyb3VwPgorCisKKyAgPCEtLSBTaW1wbGUgdHlwZXMgYXJlIG5leHQgLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiUlRFIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIEEgcmVxdWVzdC10aW1lIGV4cHJlc3Npb24gdmFsdWUKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJlJUZXhwcjsiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJCb29sIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIEJvb2wgd291bGQgYmUgYm9vbGVhbiBleGNlcHQgaXQgZG9lcyBub3QgYWNjZXB0IDEgYW5kIDAuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlID0gInhzZDpOTVRPS0VOIiA+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gInRydWUiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAiZmFsc2UiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAieWVzIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gIm5vIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+ICAgICAKKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJJZGVudGlmaWVyIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIElkZW50aWZpZXIgaXMgYW4gdW5xdWFsaWZpZWQgSmF2YSBpZGVudGlmaWVyLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6c3RyaW5nIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZSA9ICImSWRlbnRpZmllcjsiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lID0gIlR5cGVOYW1lIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIFR5cGVOYW1lIGlzIG9uZSBvciBtb3JlIEphdmEgaWRlbnRpZmllcnMgc2VwYXJhdGVkIGJ5IGRvdHMKKyAgICAgICAgd2l0aCBubyB3aGl0ZXNwYWNlLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6c3RyaW5nIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZSA9ICImVHlwZU5hbWU7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisgIAorICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJJbXBvcnRMaXN0Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIEltcG9ydExpc3QgaXMgb25lIG9yIG1vcmUgdHlwZU5hbWVzIHNlcGFyYXRlZCBieSBjb21tYXMuCisgICAgICAgIFdoaXRlc3BhY2UgaXMgYWxsb3dlZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBjb21tYS4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJkltcG9ydExpc3Q7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisgIAorICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJTZXRQcm9wIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIFNldFByb3AgaXMgYW4gSWRlbnRpZmllciBvciAqLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6c3RyaW5nIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZSA9ICImU2V0UHJvcDsiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lID0gIlJlbGF0aXZlVVJMIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIFJlbGF0aXZlVVJMIGlzIGEgdXJpUmVmZXJlbmNlIHdpdGggbm8gY29sb24gY2hhcmFjdGVyCisgICAgICAgIGJlZm9yZSB0aGUgZmlyc3QgLywgPyBvciAjLCBpZiBhbnkgKFJGQzIzOTYpLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6YW55VVJJIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZSA9ICImUmVsYXRpdmVVUkw7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiUlRFUmVsYXRpdmVVUkwiPgorICAgIDx4c2Q6dW5pb24gbWVtYmVyVHlwZXMgPSAiUmVsYXRpdmVVUkwgUlRFIi8+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiTGVuZ3RoIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIExlbmd0aCBpcyBubiBvciBubiUuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlID0gInhzZDpzdHJpbmciPgorICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlID0gIiZMZW5ndGg7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisgIAorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lID0gIkV4cGxpY2l0QnVmZmVyU2l6ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAgQnVmZmVyIFNpemUgd2l0aCBhbiBleHBsaWNpdCB2YWx1ZQorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPiAKKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJkJ1ZmZlcjsiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJOb25lQnVmZmVyU2l6ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAgQnVmZmVyIFNpemUgd2l0aCBhICJub25lIiB2YWx1ZQorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPiAKKyAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gIm5vbmUiLz4KKyAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJCdWZmZXJTaXplIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIEJ1ZmZlciBzaXplIGlzIHhrYiBvciBub25lLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6dW5pb24gbWVtYmVyVHlwZXMgPSAiRXhwbGljaXRCdWZmZXJTaXplIE5vbmVCdWZmZXJTaXplIi8+CisgIDwveHNkOnNpbXBsZVR5cGU+CisgIAorICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJDb250ZW50VHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBDb250ZW50IHR5cGUgYW5kIGNoYXJhY3RlciBlbmNvZGluZyBmb3IgdGhpcyBwYWdlLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6c3RyaW5nIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZSA9ICImVmFsaWRDb250ZW50VHlwZTsiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJQYWdlRW5jb2RpbmciPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgUGFnZSBFbmNvZGluZyBmb3IgdGhpcyBwYWdlLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6c3RyaW5nIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZSA9ICImVmFsaWRQYWdlRW5jb2Rpbmc7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiU2NvcGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgdmFsaWQgc2NvcGUgdmFsdWVzCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlID0gInhzZDpOTVRPS0VOIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAicGFnZSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJzZXNzaW9uIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gInJlcXVlc3QiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAiYXBwbGljYXRpb24iLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJQbHVnSW5UeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIHZhbGlkIHZhbHVlcyBmb3IgYSBwbHVnaW4gdHlwZQorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6Tk1UT0tFTiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gImJlYW4iLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAiYXBwbGV0Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiQWxpZ25UeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIEJ1ZmZlciBzaXplIGlzIHhrYi4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOk5NVE9LRU4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJ0b3AiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAibWlkZGxlIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gImJvdHRvbSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJsZWZ0Ii8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gInJpZ2h0Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSBFbGVtZW50cyBmb2xsb3cgLS0+CisKKyAgPHhzZDplbGVtZW50IG5hbWUgPSAicm9vdCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBUaGUgcm9vdCBlbGVtZW50IG9mIGFsbCBKU1AgZG9jdW1lbnRzIGlzIG5hbWVkIHJvb3QuCisgICAgICAgIAorICAgICAgICBBdXRob3JzIG1heSwgaWYgdGhleSB3aXNoLCBpbmNsdWRlIHNjaGVtYSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKyAgICAgICAgSWYgc3BlY2lmaWVkLCB0aGUgaW5mb3JtYXRpb24gbWF5IGFwcGVhciBhcyBhdHRyaWJ1dGVzIG9mCisgICAgICAgIHRoZSByb290IGVsZW1lbnQgYXMgZm9sbG93czoKKworICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UgeHNkLWZpbGUtbG9jYXRpb24iCisKKyAgICAgICAgRG9jdW1lbnRzIHNob3VsZCBub3Qgc3BlY2lmeSB0aGUgc3lzdGVtIGlkZW50aWZpZXIgb2YgYSBEVEQKKyAgICAgICAgaW4gYSBET0NUWVBFIGRlY2xhcmF0aW9uLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgorICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlID0gIkJvZHkiPgorICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAidmVyc2lvbiIgZml4ZWQgPSAiMi4wIiB0eXBlID0gInhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisgIAorICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJkaXJlY3RpdmUucGFnZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBkaXJlY3RpdmUucGFnZSBpcyB0aGUgInBhZ2UgZGlyZWN0aXZlIi4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJsYW5ndWFnZSIgZGVmYXVsdCA9ICJqYXZhIiB0eXBlID0gInhzZDpzdHJpbmciLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiZXh0ZW5kcyIgdHlwZSA9ICJUeXBlTmFtZSIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJjb250ZW50VHlwZSIgZGVmYXVsdCA9ICJ0ZXh0L2h0bWw7IElTTy04ODU5LTEiIHR5cGUgPSAiQ29udGVudFR5cGUiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAicGFnZUVuY29kaW5nIiB1c2UgPSAib3B0aW9uYWwiIHR5cGUgPSAiUGFnZUVuY29kaW5nIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImltcG9ydCIgdHlwZSA9ICJJbXBvcnRMaXN0Ii8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInNlc3Npb24iIGRlZmF1bHQgPSAidHJ1ZSIgdHlwZSA9ICJCb29sIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImJ1ZmZlciIgZGVmYXVsdCA9ICI4a2IiIHR5cGUgPSAiQnVmZmVyU2l6ZSIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJhdXRvRmx1c2giIGRlZmF1bHQgPSAidHJ1ZSIgdHlwZSA9ICJCb29sIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImlzVGhyZWFkU2FmZSIgZGVmYXVsdCA9ICJ0cnVlIiB0eXBlID0gIkJvb2wiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiaW5mbyIgdHlwZSA9ICJ4c2Q6c3RyaW5nIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImVycm9yUGFnZSIgdHlwZSA9ICJSZWxhdGl2ZVVSTCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpc0Vycm9yUGFnZSIgZGVmYXVsdCA9ICJmYWxzZSIgdHlwZSA9ICJCb29sIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImlzRUxJZ25vcmVkIiB0eXBlID0gIkJvb2wiLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKyAgCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gImRpcmVjdGl2ZS5pbmNsdWRlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIGRpcmVjdGl2ZS5pbmNsdWRlIGlzIHRoZSAiaW5jbHVkZSBkaXJlY3RpdmUiLgorCVRoaXMgZWxlbWVudCBkb2VzIG5vdCBhcHBlYXIgb24gWE1MIHZpZXdzIG9mIEpTUCBwYWdlcy4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJmaWxlIiB1c2UgPSAicmVxdWlyZWQiIHR5cGUgPSAiUmVsYXRpdmVVUkwiLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKworICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJzY3JpcHRsZXQiIHR5cGUgPSAieHNkOnN0cmluZyI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBUaGUgcmVwcmVzZW50YXRpb24gb2YgYSBzY3JpcGxldC4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgPC94c2Q6ZWxlbWVudD4KKyAgCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gImRlY2xhcmF0aW9uIiB0eXBlID0gInhzZDpzdHJpbmciPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgVGhlIHJlcHJzZW50YXRpb24gb2YgYSBkZWNsYXJhdGlvbi4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgPC94c2Q6ZWxlbWVudD4KKyAgCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gImV4cHJlc3Npb24iIHR5cGUgPSAieHNkOnN0cmluZyI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBUaGUgcmVwcmVzZW50YXRpb24gb2YgYW4gZXhwcmVzc2lvbi4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgPC94c2Q6ZWxlbWVudD4KKyAKKyAgPHhzZDplbGVtZW50IG5hbWUgPSAidGV4dCIgdHlwZSA9ICJ4c2Q6c3RyaW5nIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIFZlcmJhdGltIHRlbXBsYXRlIHRleHQuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgIDwveHNkOmVsZW1lbnQ+CisKKyAgPHhzZDplbGVtZW50IG5hbWUgPSAidXNlQmVhbiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICB1c2VCZWFuIGluc3RhbnRpYXRlcyBvciBhY2Nlc3NlcyBhIGJlYW4gaW4gdGhlIHNwZWNpZmllZCBzY29wZS4KKyAgICAgICAgCisgICAgICAgIENvbnN0cmFpbnQ6IFRoZSBhbGxvd2VkIGNvbWJpbmF0aW9ucyBvZiBhdHRyaWJ1dGVzIGFyZToKKyAgICAgICAgCisgICAgICAgICAgY2xhc3MgW3R5cGVdIHwgdHlwZSBbKCBjbGFzcyB8IGJlYW5OYW1lKV0KKyAgICAgICAgCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+CisgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IkJvZHkiPgorICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiaWQiIHVzZSA9ICJyZXF1aXJlZCIgdHlwZSA9ICJJZGVudGlmaWVyIi8+CisgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJjbGFzcyIgdHlwZSA9ICJUeXBlTmFtZSIvPgorICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAidHlwZSIgdHlwZSA9ICJUeXBlTmFtZSIvPgorICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiYmVhbk5hbWUiIHR5cGUgPSAiVHlwZU5hbWUiLz4KKyAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInNjb3BlIiBkZWZhdWx0ID0gInBhZ2UiIHR5cGUgPSAiU2NvcGUiLz4KKyAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisgIAorICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJzZXRQcm9wZXJ0eSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBzZXRQcm9wZXJ0eSBjaGFuZ2VzIHRoZSB2YWx1ZSBvZiBhbiBvYmplY3QgcHJvcGVydHkuCisgICAgICAgIAorICAgICAgICBDb25zdHJhaW50OiBUaGUgb2JqZWN0IG5hbWVkIGJ5IHRoZSBuYW1lIG11c3QgaGF2ZSBiZWVuCisgICAgICAgICJpbnRyb2R1Y2VkIiB0byB0aGUgSlNQIHByb2Nlc3NvciB1c2luZyBlaXRoZXIgdGhlCisgICAgICAgIGpzcDp1c2VCZWFuIGFjdGlvbiBvciBhIGN1c3RvbSBhY3Rpb24gd2l0aCBhbiBhc3NvY2lhdGVkCisgICAgICAgIFZhcmlhYmxlSW5mbyBlbnRyeSBmb3IgdGhpcyBuYW1lLgorCisgICAgICAgIEV4YWN0IHZhbGlkIGNvbWJpbmF0aW9ucyBhcmUgbm90IGV4cHJlc3NhYmxlIGluIFhNTCBTY2hlbWEuCisgICAgICAgIFRoZXkgYXJlOgorCisgICAgICAgIG5hbWU9IklkZW50aWZpZXIiIHByb3BlcnR5PSIqIgorICAgICAgICBuYW1lPSJJZGVudGlmaWVyIiBwcm9wZXJ0eT0iSWRlbnRmaWllciIgcGFyYW09InN0cmluZyIKKyAgICAgICAgbmFtZT0iSWRlbnRpZmllciIgcHJvcGVydHk9IklkZW50aWZpZXIiIHZhbHVlPSJzdHJpbmciCisgICAgICAgICAgICAgICAgCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAibmFtZSIgdXNlID0gInJlcXVpcmVkIiB0eXBlID0gIklkZW50aWZpZXIiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAicHJvcGVydHkiIHVzZSA9ICJyZXF1aXJlZCIgdHlwZSA9ICJTZXRQcm9wIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInBhcmFtIiB0eXBlID0gInhzZDpzdHJpbmciLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAidmFsdWUiIHR5cGUgPSAieHNkOnN0cmluZyIvPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICA8L3hzZDplbGVtZW50PgorCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gImdldFByb3BlcnR5Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIGdldFByb3BlcnR5IG9idGFpbnMgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBwcm9wZXJ0eS4KKyAgICAgICAgCisgICAgICAgIENvbnN0cmFpbnQ6IFRoZSBvYmplY3QgbmFtZWQgYnkgdGhlIG5hbWUgbXVzdCBoYXZlIGJlZW4KKyAgICAgICAgImludHJvZHVjZWQiIHRvIHRoZSBKU1AgcHJvY2Vzc29yIHVzaW5nIGVpdGhlciB0aGUKKyAgICAgICAganNwOnVzZUJlYW4gYWN0aW9uIG9yIGEgY3VzdG9tIGFjdGlvbiB3aXRoIGFuIGFzc29jaWF0ZWQKKyAgICAgICAgVmFyaWFibGVJbmZvIGVudHJ5IGZvciB0aGlzIG5hbWUuCisgICAgICAgIAorICAgICAgICA/Pz9UaGUgc3BlYyBpcyBpbnRlcnByZXRlZCBhcyByZXN0cmljdGluZyB0aGUgdmFsdWVzIG9mCisgICAgICAgIHByb3BlcnR5IHRvIElkZW50aWZpZXIuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAibmFtZSIgdXNlID0gInJlcXVpcmVkIiB0eXBlID0gIklkZW50aWZpZXIiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAicHJvcGVydHkiIHVzZSA9ICJyZXF1aXJlZCIgdHlwZSA9ICJJZGVudGlmaWVyIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisgIAorICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJpbmNsdWRlIj4KKyAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJwYXJhbSIgbWluT2NjdXJzID0gIjAiIG1heE9jY3VycyA9ICJ1bmJvdW5kZWQiLz4KKyAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJmbHVzaCIgZGVmYXVsdCA9ICJmYWxzZSIgdHlwZSA9ICJCb29sIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInBhZ2UiIHVzZSA9ICJyZXF1aXJlZCIgdHlwZSA9ICJSVEVSZWxhdGl2ZVVSTCIvPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICA8L3hzZDplbGVtZW50PgorCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gImZvcndhcmQiPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gInBhcmFtIiBtaW5PY2N1cnMgPSAiMCIgbWF4T2NjdXJzID0gInVuYm91bmRlZCIvPgorICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInBhZ2UiIHVzZSA9ICJyZXF1aXJlZCIgdHlwZSA9ICJSVEVSZWxhdGl2ZVVSTCIvPgorICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKyAgCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gInBsdWdpbiI+CisgICAgPHhzZDpjb21wbGV4VHlwZT4gPCEtLSBjb250ZW50IG9ubHkhIC0tPgorICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJwYXJhbXMiIG1pbk9jY3VycyA9ICIwIiBtYXhPY2N1cnMgPSAiMSIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJmYWxsYmFjayIgbWluT2NjdXJzID0gIjAiIG1heE9jY3VycyA9ICIxIiB0eXBlID0gIkJvZHkiLz4KKyAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJ0eXBlIiB1c2UgPSAicmVxdWlyZWQiIHR5cGUgPSAiUGx1Z0luVHlwZSIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJjb2RlIiB0eXBlID0gInhzZDphbnlVUkkiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiY29kZWJhc2UiIHR5cGUgPSAieHNkOmFueVVSSSIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJhbGlnbiIgdHlwZSA9ICJBbGlnblR5cGUiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiYXJjaGl2ZSI+CisgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgPHhzZDpsaXN0IGl0ZW1UeXBlPSJ4c2Q6YW55VVJJIi8+CisgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgICA8L3hzZDphdHRyaWJ1dGU+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImhlaWdodCIgdHlwZSA9ICJMZW5ndGgiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiaHNwYWNlIiB0eXBlID0gInhzZDppbnQiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAianJldmVyc2lvbiIgZGVmYXVsdCA9ICIxLjIiIHR5cGUgPSAieHNkOnN0cmluZyIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJuYW1lIiB0eXBlID0gInhzZDpOTVRPS0VOIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInZzcGFjZSIgdHlwZSA9ICJ4c2Q6aW50Ii8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gIndpZHRoIiB0eXBlID0gIkxlbmd0aCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJuc3BsdWdpbnVybCIgdHlwZSA9ICJ4c2Q6YW55VVJJIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImllcGx1Z2ludXJsIiB0eXBlID0gInhzZDphbnlVUkkiLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKyAgCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gInBhcmFtcyI+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJwYXJhbSIgbWluT2NjdXJzID0gIjEiIG1heE9jY3VycyA9ICJ1bmJvdW5kZWQiLz4KKyAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKworICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJwYXJhbSI+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAibmFtZSIgdXNlID0gInJlcXVpcmVkIiB0eXBlID0gInhzZDpOTVRPS0VOIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInZhbHVlIiB1c2UgPSAicmVxdWlyZWQiIHR5cGUgPSAieHNkOnN0cmluZyIvPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICA8L3hzZDplbGVtZW50PgorICAKKzwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvd2ViLWFwcF8yXzIuZHRkIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC93ZWItYXBwXzJfMi5kdGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmYmRhZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvd2ViLWFwcF8yXzIuZHRkCkBAIC0wLDAgKzEsNTgxIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLQorVGhlIHdlYi1hcHAgZWxlbWVudCBpcyB0aGUgcm9vdCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvcgorYSB3ZWIgYXBwbGljYXRpb24KKy0tPgorCis8IUVMRU1FTlQgd2ViLWFwcCAoaWNvbj8sIGRpc3BsYXktbmFtZT8sIGRlc2NyaXB0aW9uPywgZGlzdHJpYnV0YWJsZT8sCitjb250ZXh0LXBhcmFtKiwgc2VydmxldCosIHNlcnZsZXQtbWFwcGluZyosIHNlc3Npb24tY29uZmlnPywKK21pbWUtbWFwcGluZyosIHdlbGNvbWUtZmlsZS1saXN0PywgZXJyb3ItcGFnZSosIHRhZ2xpYiosCityZXNvdXJjZS1yZWYqLCBzZWN1cml0eS1jb25zdHJhaW50KiwgbG9naW4tY29uZmlnPywgc2VjdXJpdHktcm9sZSosCitlbnYtZW50cnkqLCBlamItcmVmKik+CisKKzwhLS0KK1RoZSBpY29uIGVsZW1lbnQgY29udGFpbnMgYSBzbWFsbC1pY29uIGFuZCBhIGxhcmdlLWljb24gZWxlbWVudAord2hpY2ggc3BlY2lmeSB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZm9yIGEgc21hbGwgYW5kCitsYXJnZSBpbWFnZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgd2ViIGFwcGxpY2F0aW9uIGluIGEgR1VJIHRvb2wuIEF0IGEKK21pbmltdW0sIHRvb2xzIG11c3QgYWNjZXB0IEdJRiBhbmQgSlBFRyBmb3JtYXQgaW1hZ2VzLgorLS0+CisKKzwhRUxFTUVOVCBpY29uIChzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8pPgorCis8IS0tCitUaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHdlYgorYXBwbGljYXRpb24gb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBzbWFsbCAoMTZ4MTYgcGl4ZWwpIGljb24gaW1hZ2UuCistLT4KKworPCFFTEVNRU5UIHNtYWxsLWljb24gKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHdlYgorYXBwbGljYXRpb24gb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBsYXJnZSAoMzJ4MzIgcGl4ZWwpIGljb24gaW1hZ2UuCistLT4KKworPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQKK3RvIGJlIGRpc3BsYXllZCBieSBHVUkgdG9vbHMKKy0tPgorCis8IUVMRU1FTlQgZGlzcGxheS1uYW1lICgjUENEQVRBKT4KKworPCEtLQorVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBwcm92aWRlIGRlc2NyaXB0aXZlIHRleHQgYWJvdXQKK3RoZSBwYXJlbnQgZWxlbWVudC4KKy0tPgorCis8IUVMRU1FTlQgZGVzY3JpcHRpb24gKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZGlzdHJpYnV0YWJsZSBlbGVtZW50LCBieSBpdHMgcHJlc2VuY2UgaW4gYSB3ZWIgYXBwbGljYXRpb24KK2RlcGxveW1lbnQgZGVzY3JpcHRvciwgaW5kaWNhdGVzIHRoYXQgdGhpcyB3ZWIgYXBwbGljYXRpb24gaXMKK3Byb2dyYW1tZWQgYXBwcm9wcmlhdGVseSB0byBiZSBkZXBsb3llZCBpbnRvIGEgZGlzdHJpYnV0ZWQgc2VydmxldAorY29udGFpbmVyCistLT4KKworPCFFTEVNRU5UIGRpc3RyaWJ1dGFibGUgRU1QVFk+CisKKzwhLS0KK1RoZSBjb250ZXh0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgd2ViCithcHBsaWNhdGlvbidzIHNlcnZsZXQgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgorLS0+CisKKzwhRUxFTUVOVCBjb250ZXh0LXBhcmFtIChwYXJhbS1uYW1lLCBwYXJhbS12YWx1ZSwgZGVzY3JpcHRpb24/KT4KKworPCEtLQorVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KKy0tPgorCis8IUVMRU1FTlQgcGFyYW0tbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4KKy0tPgorCis8IUVMRU1FTlQgcGFyYW0tdmFsdWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgc2VydmxldCBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGl2ZSBkYXRhIG9mIGEKK3NlcnZsZXQuIElmIGEganNwLWZpbGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaXMKK3ByZXNlbnQsIHRoZW4gdGhlIEpTUCBzaG91bGQgYmUgcHJlY29tcGlsZWQgYW5kIGxvYWRlZC4KKy0tPgorCis8IUVMRU1FTlQgc2VydmxldCAoaWNvbj8sIHNlcnZsZXQtbmFtZSwgZGlzcGxheS1uYW1lPywgZGVzY3JpcHRpb24/LAorKHNlcnZsZXQtY2xhc3N8anNwLWZpbGUpLCBpbml0LXBhcmFtKiwgbG9hZC1vbi1zdGFydHVwPywgc2VjdXJpdHktcm9sZS1yZWYqKT4KKworPCEtLQorVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUKK3NlcnZsZXQuCistLT4KKworPCFFTEVNRU5UIHNlcnZsZXQtbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBzZXJ2bGV0LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCitvZiB0aGUgc2VydmxldC4KKy0tPgorCis8IUVMRU1FTlQgc2VydmxldC1jbGFzcyAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZSB3aXRoaW4KK3RoZSB3ZWIgYXBwbGljYXRpb24uCistLT4KKworPCFFTEVNRU5UIGpzcC1maWxlICgjUENEQVRBKT4KKworPCEtLQorVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcyBhbgoraW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgdGhlIHNlcnZsZXQKKy0tPgorCis8IUVMRU1FTlQgaW5pdC1wYXJhbSAocGFyYW0tbmFtZSwgcGFyYW0tdmFsdWUsIGRlc2NyaXB0aW9uPyk+CisKKzwhLS0KK1RoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHNlcnZsZXQgc2hvdWxkIGJlCitsb2FkZWQgb24gdGhlIHN0YXJ0dXAgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mCit0aGVzZSBlbGVtZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG9yZGVyIGluIHdoaWNoCit0aGUgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkLiBMb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkIGJlZm9yZSBoaWdoZXIKK2ludGVnZXJzLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgbm90IGEKK3Bvc2l0aXZlIGludGVnZXIsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIGl0IGF0IGFueSB0aW1lIGluIHRoZQorc3RhcnR1cCBzZXF1ZW5jZS4KKy0tPgorCis8IUVMRU1FTlQgbG9hZC1vbi1zdGFydHVwICgjUENEQVRBKT4KKworPCEtLQorVGhlIHNlcnZsZXQtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYSBzZXJ2bGV0CithbmQgYSB1cmwgcGF0dGVybgorLS0+CisKKzwhRUxFTUVOVCBzZXJ2bGV0LW1hcHBpbmcgKHNlcnZsZXQtbmFtZSwgdXJsLXBhdHRlcm4pPgorCis8IS0tCitUaGUgdXJsLXBhdHRlcm4gZWxlbWVudCBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlCittYXBwaW5nLiBNdXN0IGZvbGxvdyB0aGUgcnVsZXMgc3BlY2lmaWVkIGluIFNlY3Rpb24gMTAgb2YgdGhlIFNlcnZsZXQKK0FQSSBTcGVjaWZpY2F0aW9uLgorLS0+CisKKzwhRUxFTUVOVCB1cmwtcGF0dGVybiAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBzZXNzaW9uLWNvbmZpZyBlbGVtZW50IGRlZmluZXMgdGhlIHNlc3Npb24gcGFyYW1ldGVycyBmb3IKK3RoaXMgd2ViIGFwcGxpY2F0aW9uLgorLS0+CisKKzwhRUxFTUVOVCBzZXNzaW9uLWNvbmZpZyAoc2Vzc2lvbi10aW1lb3V0Pyk+CisKKzwhLS0KK1RoZSBzZXNzaW9uLXRpbWVvdXQgZWxlbWVudCBkZWZpbmVzIHRoZSBkZWZhdWx0IHNlc3Npb24gdGltZW91dAoraW50ZXJ2YWwgZm9yIGFsbCBzZXNzaW9ucyBjcmVhdGVkIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUKK3NwZWNpZmllZCB0aW1lb3V0IG11c3QgYmUgZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCistLT4KKworPCFFTEVNRU5UIHNlc3Npb24tdGltZW91dCAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBtaW1lLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGV4dGVuc2lvbgorYW5kIGEgbWltZSB0eXBlLgorLS0+CisKKzwhRUxFTUVOVCBtaW1lLW1hcHBpbmcgKGV4dGVuc2lvbiwgbWltZS10eXBlKT4KKworPCEtLQorVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4KK2V4dGVuc2lvbi4gZXhhbXBsZTogInR4dCIKKy0tPgorCis8IUVMRU1FTlQgZXh0ZW5zaW9uICgjUENEQVRBKT4KKworPCEtLQorVGhlIG1pbWUtdHlwZSBlbGVtZW50IGNvbnRhaW5zIGEgZGVmaW5lZCBtaW1lIHR5cGUuIGV4YW1wbGU6CisidGV4dC9wbGFpbiIKKy0tPgorCis8IUVMRU1FTlQgbWltZS10eXBlICgjUENEQVRBKT4KKworPCEtLQorVGhlIHdlbGNvbWUtZmlsZS1saXN0IGNvbnRhaW5zIGFuIG9yZGVyZWQgbGlzdCBvZiB3ZWxjb21lIGZpbGVzCitlbGVtZW50cy4KKy0tPgorCis8IUVMRU1FTlQgd2VsY29tZS1maWxlLWxpc3QgKHdlbGNvbWUtZmlsZSspPgorCis8IS0tCitUaGUgd2VsY29tZS1maWxlIGVsZW1lbnQgY29udGFpbnMgZmlsZSBuYW1lIHRvIHVzZSBhcyBhIGRlZmF1bHQKK3dlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sCistLT4KKworPCFFTEVNRU5UIHdlbGNvbWUtZmlsZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSB0YWdsaWIgZWxlbWVudCBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgSlNQIHRhZyBsaWJyYXJ5LgorLS0+CisKKzwhRUxFTUVOVCB0YWdsaWIgKHRhZ2xpYi11cmksIHRhZ2xpYi1sb2NhdGlvbik+CisKKzwhLS0KK1RoZSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJLCByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24KK29mIHRoZSB3ZWIueG1sIGRvY3VtZW50LCBpZGVudGlmeWluZyBhIFRhZyBMaWJyYXJ5IHVzZWQgaW4gdGhlIFdlYgorQXBwbGljYXRpb24uCistLT4KKworPCFFTEVNRU5UIHRhZ2xpYi11cmkgKCNQQ0RBVEEpPgorCis8IS0tCit0aGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIChhcyBhIHJlc291cmNlCityZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uKSB3aGVyZSB0byBmaW5kIHRoZSBUYWcKK0xpYmFyeSBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuCistLT4KKworPCFFTEVNRU5UIHRhZ2xpYi1sb2NhdGlvbiAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBlcnJvci1wYWdlIGVsZW1lbnQgY29udGFpbnMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXJyb3IgY29kZQorb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCistLT4KKworPCFFTEVNRU5UIGVycm9yLXBhZ2UgKChlcnJvci1jb2RlIHwgZXhjZXB0aW9uLXR5cGUpLCBsb2NhdGlvbik+CisKKzwhLS0KK1RoZSBlcnJvci1jb2RlIGNvbnRhaW5zIGFuIEhUVFAgZXJyb3IgY29kZSwgZXg6IDQwNAorLS0+CisKKzwhRUxFTUVOVCBlcnJvci1jb2RlICgjUENEQVRBKT4KKworPCEtLQorVGhlIGV4Y2VwdGlvbiB0eXBlIGNvbnRhaW5zIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYQorSmF2YSBleGNlcHRpb24gdHlwZS4KKy0tPgorCis8IUVMRU1FTlQgZXhjZXB0aW9uLXR5cGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIGluIHRoZQord2ViIGFwcGxpY2F0aW9uCistLT4KKworPCFFTEVNRU5UIGxvY2F0aW9uICgjUENEQVRBKT4KKworPCEtLQorVGhlIHJlc291cmNlLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSBXZWIKK0FwcGxpY2F0aW9uJ3MgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLgorLS0+CisKKzwhRUxFTUVOVCByZXNvdXJjZS1yZWYgKGRlc2NyaXB0aW9uPywgcmVzLXJlZi1uYW1lLCByZXMtdHlwZSwgcmVzLWF1dGgpPgorCis8IS0tCitUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZQorZmFjdG9yeSByZWZlcmVuY2UgbmFtZS4KKy0tPgorCis8IUVMRU1FTlQgcmVzLXJlZi1uYW1lICgjUENEQVRBKT4KKworPCEtLQorVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSAoSmF2YSBjbGFzcykgdHlwZSBvZiB0aGUgZGF0YQorc291cmNlLgorLS0+CisKKzwhRUxFTUVOVCByZXMtdHlwZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSByZXMtYXV0aCBlbGVtZW50IGluZGljYXRlcyB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQKK2NvZGUgcGVyZm9ybXMgcmVzb3VyY2Ugc2lnbm9uIHByb2dyYW1tYXRpY2FsbHkgb3Igd2hldGhlciB0aGUKK2NvbnRhaW5lciBzaWducyBvbnRvIHRoZSByZXNvdXJjZSBiYXNlZCBvbiB0aGUgcHJpbmNpcGxlIG1hcHBpbmcKK2luZm9ybWF0aW9uIHN1cHBsaWVkIGJ5IHRoZSBkZXBsb3llci4gTXVzdCBiZSBDT05UQUlORVIgb3IgU0VSVkxFVAorLS0+CisKKzwhRUxFTUVOVCByZXMtYXV0aCAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBzZWN1cml0eS1jb25zdHJhaW50IGVsZW1lbnQgaXMgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdHkKK2NvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlIGNvbGxlY3Rpb25zCistLT4KKworPCFFTEVNRU5UIHNlY3VyaXR5LWNvbnN0cmFpbnQgKHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uKywKK2F1dGgtY29uc3RyYWludD8sIHVzZXItZGF0YS1jb25zdHJhaW50Pyk+CisKKzwhLS0KK1RoZSB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBzdWJzZXQKK29mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluIGEgd2ViCithcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYgbm8gSFRUUCBtZXRob2RzCithcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMgdG8gYWxsIEhUVFAKK21ldGhvZHMuCistLT4KKworPCFFTEVNRU5UIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uICh3ZWItcmVzb3VyY2UtbmFtZSwgZGVzY3JpcHRpb24/LAordXJsLXBhdHRlcm4qLCBodHRwLW1ldGhvZCopPgorCis8IS0tCitUaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIgcmVzb3VyY2UKK2NvbGxlY3Rpb24KKy0tPgorCis8IUVMRU1FTlQgd2ViLXJlc291cmNlLW5hbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgaHR0cC1tZXRob2QgY29udGFpbnMgYW4gSFRUUCBtZXRob2QgKEdFVCB8IFBPU1QgfC4uLikKKy0tPgorCis8IUVMRU1FTlQgaHR0cC1tZXRob2QgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgdXNlci1kYXRhLWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGluZGljYXRlIGhvdyBkYXRhCitjb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlIHByb3RlY3RlZAorLS0+CisKKzwhRUxFTUVOVCB1c2VyLWRhdGEtY29uc3RyYWludCAoZGVzY3JpcHRpb24/LCB0cmFuc3BvcnQtZ3VhcmFudGVlKT4KKworPCEtLQorVGhlIHRyYW5zcG9ydC1ndWFyYW50ZWUgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbgorYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yCitDT05GSURFTlRJQUwuIE5PTkUgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QgcmVxdWlyZSBhbnkKK3RyYW5zcG9ydCBndWFyYW50ZWVzLiBBIHZhbHVlIG9mIElOVEVHUkFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uCityZXF1aXJlcyB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbgorc3VjaCBhIHdheSB0aGF0IGl0IGNhbid0IGJlIGNoYW5nZWQgaW4gdHJhbnNpdC4gQ09ORklERU5USUFMIG1lYW5zCit0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIGJlIHRyYW5zbWl0dGVkIGluIGEKK2Zhc2hpb24gdGhhdCBwcmV2ZW50cyBvdGhlciBlbnRpdGllcyBmcm9tIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YKK3RoZSB0cmFuc21pc3Npb24uIEluIG1vc3QgY2FzZXMsIHRoZSBwcmVzZW5jZSBvZiB0aGUgSU5URUdSQUwgb3IKK0NPTkZJREVOVElBTCBmbGFnIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIFNTTCBpcyByZXF1aXJlZC4KKy0tPgorCis8IUVMRU1FTlQgdHJhbnNwb3J0LWd1YXJhbnRlZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBhdXRoLWNvbnN0cmFpbnQgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdCBzaG91bGQKK2JlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uLiBUaGUgcm9sZSB1c2VkIGhlcmUKK211c3QgYXBwZWFyIGluIGEgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudC4KKy0tPgorCis8IUVMRU1FTlQgYXV0aC1jb25zdHJhaW50IChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSopPgorCis8IS0tCitUaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgorLS0+CisKKzwhRUxFTUVOVCByb2xlLW5hbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgbG9naW4tY29uZmlnIGVsZW1lbnQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCittZXRob2QgdGhhdCBzaG91bGQgYmUgdXNlZCwgdGhlIHJlYWxtIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IKK3RoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSBuZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4KK21lY2hhbmlzbS4KKy0tPgorCis8IUVMRU1FTlQgbG9naW4tY29uZmlnIChhdXRoLW1ldGhvZD8sIHJlYWxtLW5hbWU/LCBmb3JtLWxvZ2luLWNvbmZpZz8pPgorCis8IS0tCitUaGUgcmVhbG0gbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcmVhbG0gbmFtZSB0byB1c2UgaW4gSFRUUAorQmFzaWMgYXV0aG9yaXphdGlvbgorLS0+CisKKzwhRUxFTUVOVCByZWFsbS1uYW1lICgjUENEQVRBKT4KKworPCEtLQorVGhlIGZvcm0tbG9naW4tY29uZmlnIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IgcGFnZXMKK3RoYXQgc2hvdWxkIGJlIHVzZWQgaW4gZm9ybSBiYXNlZCBsb2dpbi4gSWYgZm9ybSBiYXNlZCBhdXRoZW50aWNhdGlvbgoraXMgbm90IHVzZWQsIHRoZXNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLgorLS0+CisKKzwhRUxFTUVOVCBmb3JtLWxvZ2luLWNvbmZpZyAoZm9ybS1sb2dpbi1wYWdlLCBmb3JtLWVycm9yLXBhZ2UpPgorCis8IS0tCitUaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAKK3doZXJlIHRoZSBwYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZSBmb3VuZAorLS0+CisKKzwhRUxFTUVOVCBmb3JtLWxvZ2luLXBhZ2UgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZm9ybS1lcnJvci1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAKK3doZXJlIHRoZSBlcnJvciBwYWdlIHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gbG9naW4gaXMgbm90IHN1Y2Nlc3NmdWwKK2NhbiBiZSBmb3VuZAorLS0+CisKKzwhRUxFTUVOVCBmb3JtLWVycm9yLXBhZ2UgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgYXV0aC1tZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KK21lY2hhbmlzbSBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbi4gQXMgYSBwcmVyZXF1aXNpdGUgdG8gZ2FpbmluZyBhY2Nlc3MKK3RvIGFueSB3ZWIgcmVzb3VyY2VzIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkgYW4gYXV0aG9yaXphdGlvbgorY29uc3RyYWludCwgYSB1c2VyIG11c3QgaGF2ZSBhdXRoZW50aWNhdGVkIHVzaW5nIHRoZSBjb25maWd1cmVkCittZWNoYW5pc20uIExlZ2FsIHZhbHVlcyBmb3IgdGhpcyBlbGVtZW50IGFyZSAiQkFTSUMiLCAiRElHRVNUIiwKKyJGT1JNIiwgb3IgIkNMSUVOVC1DRVJUIi4KKy0tPgorCis8IUVMRU1FTlQgYXV0aC1tZXRob2QgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgc2VjdXJpdHktcm9sZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHNlY3VyaXR5Cityb2xlIHdoaWNoIGlzIHVzZWQgaW4gdGhlIHNlY3VyaXR5LWNvbnN0cmFpbnRzIHBsYWNlZCBvbiB0aGUgd2ViCithcHBsaWNhdGlvbi4KKy0tPgorCis8IUVMRU1FTlQgc2VjdXJpdHktcm9sZSAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUpPgorCis8IS0tCitUaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSByb2xlLiBUaGlzIGVsZW1lbnQKK211c3QgY29udGFpbiBhIG5vbi1lbXB0eSBzdHJpbmcuCistLT4KKworPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUtcmVmIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSwgcm9sZS1saW5rKT4KKworPCEtLQorVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIHVzZWQgdG8gbGluayBhIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlCit0byBhIGRlZmluZWQgc2VjdXJpdHkgcm9sZS4gVGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgY29udGFpbiB0aGUKK25hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlCitlbGVtZW50cy4KKy0tPgorCis8IUVMRU1FTlQgcm9sZS1saW5rICgjUENEQVRBKT4KKworPCEtLQorVGhlIGVudi1lbnRyeSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhbgorYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBlbnRyeS4gVGhpcyBlbGVtZW50IGlzIHJlcXVpcmVkIHRvIGJlCitob25vcmVkIG9uIGluIEoyRUUgY29tcGxpYW50IHNlcnZsZXQgY29udGFpbmVycy4KKy0tPgorCis8IUVMRU1FTlQgZW52LWVudHJ5IChkZXNjcmlwdGlvbj8sIGVudi1lbnRyeS1uYW1lLCBlbnYtZW50cnktdmFsdWU/LAorZW52LWVudHJ5LXR5cGUpPgorCis8IS0tCitUaGUgZW52LWVudHJ5LW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gYXBwbGljYXRpb24ncworZW52aXJvbm1lbnQgZW50cnkKKy0tPgorCis8IUVMRU1FTlQgZW52LWVudHJ5LW5hbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZW52LWVudHJ5LXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGFuCithcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGVudHJ5CistLT4KKworPCFFTEVNRU5UIGVudi1lbnRyeS12YWx1ZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSB0eXBlCitvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24KK2NvZGUuIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGU6CitqYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsCitqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuRmxvYXQuCistLT4KKworPCFFTEVNRU5UIGVudi1lbnRyeS10eXBlICgjUENEQVRBKT4KKworPCEtLQorVGhlIGVqYi1yZWYgZWxlbWVudCBpcyB1c2VkIHRvIGRlY2xhcmUgYSByZWZlcmVuY2UgdG8gYW4KK2VudGVycHJpc2UgYmVhbi4gCistLT4KKworPCFFTEVNRU5UIGVqYi1yZWYgKGRlc2NyaXB0aW9uPywgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsIGhvbWUsIHJlbW90ZSwKK2VqYi1saW5rPyk+CisKKzwhLS0KK1RoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKK3JlZmVyZW5jZS4gVGhpcyBpcyB0aGUgSk5ESSBuYW1lIHRoYXQgdGhlIHNlcnZsZXQgY29kZSB1c2VzIHRvIGdldCBhCityZWZlcmVuY2UgdG8gdGhlIGVudGVycHJpc2UgYmVhbi4KKy0tPgorCis8IUVMRU1FTlQgZWpiLXJlZi1uYW1lICgjUENEQVRBKT4KKworPCEtLQorVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBleHBlY3RlZCBqYXZhIGNsYXNzIHR5cGUgb2YKK3RoZSByZWZlcmVuY2VkIEVKQi4KKy0tPgorCis8IUVMRU1FTlQgZWpiLXJlZi10eXBlICgjUENEQVRBKT4KKworPCEtLQorVGhlIGVqYi1ob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZQorRUpCJ3MgaG9tZSBpbnRlcmZhY2UKKy0tPgorCis8IUVMRU1FTlQgaG9tZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBlamItcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZQorRUpCJ3MgcmVtb3RlIGludGVyZmFjZQorLS0+CisKKzwhRUxFTUVOVCByZW1vdGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBlamItcmVmIGVsZW1lbnQgdG8gc3BlY2lmeQordGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBhbiBFSkIgaW4gYW4gZW5jb21wYXNzaW5nIEphdmEyCitFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIGFwcGxpY2F0aW9uIHBhY2thZ2UuIFRoZSB2YWx1ZSBvZiB0aGUKK2VqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW5kIEVKQiBpbiB0aGUgSjJFRQorYXBwbGljYXRpb24gcGFja2FnZS4KKy0tPgorCis8IUVMRU1FTlQgZWpiLWxpbmsgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgSUQgbWVjaGFuaXNtIGlzIHRvIGFsbG93IHRvb2xzIHRvIGVhc2lseSBtYWtlIHRvb2wtc3BlY2lmaWMKK3JlZmVyZW5jZXMgdG8gdGhlIGVsZW1lbnRzIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoaXMgYWxsb3dzCit0b29scyB0aGF0IHByb2R1Y2UgYWRkaXRpb25hbCBkZXBsb3ltZW50IGluZm9ybWF0aW9uIChpLmUgaW5mb3JtYXRpb24KK2JleW9uZCB0aGUgc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yIGluZm9ybWF0aW9uKSB0byBzdG9yZSB0aGUKK25vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBhIHNlcGFyYXRlIGZpbGUsIGFuZCBlYXNpbHkgcmVmZXIgZnJvbQordGhlc2UgdG9vbHMtc3BlY2lmaWMgZmlsZXMgdG8gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBzdGFuZGFyZCB3ZWItYXBwCitkZXBsb3ltZW50IGRlc2NyaXB0b3IuCistLT4KKworPCFBVFRMSVNUIHdlYi1hcHAgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgaWNvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzbWFsbC1pY29uIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGxhcmdlLWljb24gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZGlzcGxheS1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGRpc3RyaWJ1dGFibGUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgY29udGV4dC1wYXJhbSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBwYXJhbS1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHBhcmFtLXZhbHVlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHNlcnZsZXQgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgc2VydmxldC1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHNlcnZsZXQtY2xhc3MgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QganNwLWZpbGUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgaW5pdC1wYXJhbSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsb2FkLW9uLXN0YXJ0dXAgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgc2VydmxldC1tYXBwaW5nIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHVybC1wYXR0ZXJuIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHNlc3Npb24tY29uZmlnIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHNlc3Npb24tdGltZW91dCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBtaW1lLW1hcHBpbmcgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZXh0ZW5zaW9uIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIG1pbWUtdHlwZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB3ZWxjb21lLWZpbGUtbGlzdCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB3ZWxjb21lLWZpbGUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdGFnbGliIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHRhZ2xpYi11cmkgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdGFnbGliLWxvY2F0aW9uIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGVycm9yLXBhZ2UgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZXJyb3ItY29kZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBleGNlcHRpb24tdHlwZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsb2NhdGlvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByZXNvdXJjZS1yZWYgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgcmVzLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJlcy10eXBlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJlcy1hdXRoIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHNlY3VyaXR5LWNvbnN0cmFpbnQgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgd2ViLXJlc291cmNlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgaHR0cC1tZXRob2QgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdXNlci1kYXRhLWNvbnN0cmFpbnQgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdHJhbnNwb3J0LWd1YXJhbnRlZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBhdXRoLWNvbnN0cmFpbnQgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgcm9sZS1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGxvZ2luLWNvbmZpZyBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByZWFsbS1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGZvcm0tbG9naW4tY29uZmlnIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGZvcm0tbG9naW4tcGFnZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBmb3JtLWVycm9yLXBhZ2UgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgYXV0aC1tZXRob2QgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgc2VjdXJpdHktcm9sZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzZWN1cml0eS1yb2xlLXJlZiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByb2xlLWxpbmsgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZW52LWVudHJ5IGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGVudi1lbnRyeS1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGVudi1lbnRyeS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBlbnYtZW50cnktdHlwZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBlamItcmVmIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGVqYi1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBlamItcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgaG9tZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByZW1vdGUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZWpiLWxpbmsgaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL3dlYi1hcHBfMl8zLmR0ZCBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvd2ViLWFwcF8yXzMuZHRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZTMzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL3dlYi1hcHBfMl8zLmR0ZApAQCAtMCwwICsxLDEwNzUgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLQorQ29weXJpZ2h0IDIwMDAtMjAwMSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIDkwMSBTYW4gQW50b25pbyBSb2FkLAorUGFsbyBBbHRvLCBDQSAgOTQzMDMsIFUuUy5BLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworVGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50IGlzIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgYW5kIGRpc3RyaWJ1dGVkCit1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyBpdHMgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAorZGVjb21waWxhdGlvbi4gIE5vIHBhcnQgb2YgdGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50YXRpb24gbWF5IGJlCityZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCisKK1RoaXJkIHBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQKK2xpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KKworU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIExvZ28sIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgUGFnZXMsIEphdmEKK05hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCBhbmQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsCithcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jIGluIHRoZSBVLlMuCithbmQgb3RoZXIgY291bnRyaWVzLgorCitBbGwgU1BBUkMgdHJhZGVtYXJrcyBhcmUgdXNlZCB1bmRlciBsaWNlbnNlIGFuZCBhcmUgdHJhZGVtYXJrcworb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFNQQVJDIEludGVybmF0aW9uYWwsIEluYy4KK2luIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuIFByb2R1Y3RzIGJlYXJpbmcgU1BBUkMKK3RyYWRlbWFya3MgYXJlIGJhc2VkIHVwb24gYW4gYXJjaGl0ZWN0dXJlIGRldmVsb3BlZCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisKK1Bvc3RTY3JpcHQgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zLCBJbmMuCisKK0ZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvCitTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgorCitET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKK0NPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWQorSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRSBPUiBOT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUCitUTyBUSEUgRVhURU5UIFRIQVQgU1VDSCBESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZCitJTlZBTElELgorCitfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKK0NvcHlyaWdodCAyMDAwLTIwMDEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwKKzkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBICA5NDMwMywgRXRhdHMtVW5pcy4KK1RvdXMgZHJvaXRzIHJlJ3NlcnZlJ3MuCisKKworQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJyBhdmVjCitkZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEgZGlzdHJpYnV0aW9uLAorZXQgbGEgZGUnY29tcGlsYXRpb24uICBBdWN1bmUgcGFydGllIGRlIGNlIHByb2R1aXQgb3UgZGUgc2EgZG9jdW1lbnRhdGlvbgorYXNzb2NpZSdlIG5lIHBldXQgZV50cmUgcmVwcm9kdWl0ZSBzb3VzIGF1Y3VuZSBmb3JtZSwgcGFyIHF1ZWxxdWUgbW95ZW4KK3F1ZSBjZSBzb2l0LCBzYW5zIGwnYXV0b3Jpc2F0aW9uIHByZSdhbGFibGUgZXQgZSdjcml0ZSBkZSBTdW4gZXQgZGUgc2VzCitiYWlsbGV1cnMgZGUgbGljZW5jZSwgcydpbCB5IGVuIGEuCisKK0xlIGxvZ2ljaWVsIGRlJ3RlbnUgcGFyIGRlcyB0aWVycywgZXQgcXVpIGNvbXByZW5kIGxhIHRlY2hub2xvZ2llCityZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0CitldCBsaWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgorCitTdW4sIFN1biBNaWNyb3N5c3RlbXMsIGxlIGxvZ28gU3VuLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhCitOYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwsIGV0IEVudGVycHJpc2UgSmF2YUJlYW5zLAorc29udCBkZXMgbWFycXVlcyBkZSBmYWJyaXF1ZSBvdSBkZXMgbWFycXVlcyBkZSdwb3NlJ2VzIGRlIFN1bgorTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFdGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMgcGF5cy4KKworVG91dGVzIGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQgdXRpbGlzZSdlcyBzb3VzIGxpY2VuY2UgZXQgc29udAorZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTUEFSQworSW50ZXJuYXRpb25hbCwgSW5jLiBhdXggRXRhdHMtVW5pcyBldCAgZGFucworZCdhdXRyZXMgcGF5cy4gTGVzIHByb2R1aXRzIHBvcnRhbnQgbGVzIG1hcnF1ZXMgU1BBUkMgc29udAorYmFzZSdzIHN1ciB1bmUgYXJjaGl0ZWN0dXJlIGRlJ3ZlbG9wcGUnZSBwYXIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorCitQb3N0Y3JpcHQgZXN0IHVuZSBtYXJxdWUgZW5yZWdpc3RyZSdlIGQnQWRvYmUgU3lzdGVtcyBJbmMuCisKK0xBIERPQ1VNRU5UQVRJT04gRVNUIEZPVVJOSUUgIkVOIEwnRVRBVCIgRVQgVE9VVEVTIEFVVFJFUyBDT05ESVRJT05TLAorREVDTEFSQVRJT05TIEVUIEdBUkFOVElFUyBFWFBSRVNTRVMgT1UgVEFDSVRFUyBTT05UIEZPUk1FTExFTUVOVCBFWENMVUVTLAorREFOUyBMQSBNRVNVUkUgQVVUT1JJU0VFIFBBUiBMQSBMT0kgQVBQTElDQUJMRSwgWSBDT01QUklTIE5PVEFNTUVOVAorVE9VVEUgR0FSQU5USUUgSU1QTElDSVRFIFJFTEFUSVZFIEEgTEEgUVVBTElURSBNQVJDSEFOREUsIEEgTCdBUFRJVFVERQorQSBVTkUgVVRJTElTQVRJT04gUEFSVElDVUxJRVJFIE9VIEEgTCdBQlNFTkNFIERFIENPTlRSRUZBQ09OLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgdGhlIFhNTCBEVEQgZm9yIHRoZSBTZXJ2bGV0IDIuMyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCitBbGwgU2VydmxldCAyLjMgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluY2x1ZGUgYSBET0NUWVBFCitvZiB0aGUgZm9sbG93aW5nIGZvcm06CisKKyAgPCFET0NUWVBFIHdlYi1hcHAgUFVCTElDCisJIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIKKwkiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIj4KKworLS0+CisKKzwhLS0KK1RoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9yCitlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KKworLSBJbiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gUENEQVRBLCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCisgIGluIHRoZSBkYXRhIG1heSBiZSBpZ25vcmVkLgorCistIEluIGVsZW1lbnRzIHdob3NlIHZhbHVlIGlzIGFuICJlbnVtZXJhdGVkIHR5cGUiLCB0aGUgdmFsdWUgaXMKKyAgY2FzZSBzZW5zaXRpdmUuCisKKy0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUgc2FtZQorICBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3Qgc3RhcnRpbmcgd2l0aCAiLyIpCisgIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4KKyAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5CisgIG5hbWVzIGluIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlCisgIG5hbWVzIGFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKKyAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgc2VydmxldCBBUEkuCistLT4KKworCis8IS0tCitUaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yCithIHdlYiBhcHBsaWNhdGlvbi4KKy0tPgorPCFFTEVNRU5UIHdlYi1hcHAgKGljb24/LCBkaXNwbGF5LW5hbWU/LCBkZXNjcmlwdGlvbj8sIGRpc3RyaWJ1dGFibGU/LAorY29udGV4dC1wYXJhbSosIGZpbHRlciosIGZpbHRlci1tYXBwaW5nKiwgbGlzdGVuZXIqLCBzZXJ2bGV0KiwKK3NlcnZsZXQtbWFwcGluZyosIHNlc3Npb24tY29uZmlnPywgbWltZS1tYXBwaW5nKiwgd2VsY29tZS1maWxlLWxpc3Q/LAorZXJyb3ItcGFnZSosIHRhZ2xpYiosIHJlc291cmNlLWVudi1yZWYqLCByZXNvdXJjZS1yZWYqLCBzZWN1cml0eS1jb25zdHJhaW50KiwKK2xvZ2luLWNvbmZpZz8sIHNlY3VyaXR5LXJvbGUqLCBlbnYtZW50cnkqLCBlamItcmVmKiwgIGVqYi1sb2NhbC1yZWYqKT4KKworPCEtLQorVGhlIGF1dGgtY29uc3RyYWludCBlbGVtZW50IGluZGljYXRlcyB0aGUgdXNlciByb2xlcyB0aGF0IHNob3VsZAorYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlIGNvbGxlY3Rpb24uIFRoZSByb2xlLW5hbWUKK3VzZWQgaGVyZSBtdXN0IGVpdGhlciBjb3JyZXNwb25kIHRvIHRoZSByb2xlLW5hbWUgb2Ygb25lIG9mIHRoZQorc2VjdXJpdHktcm9sZSBlbGVtZW50cyBkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwgb3IgYmUKK3RoZSBzcGVjaWFsbHkgcmVzZXJ2ZWQgcm9sZS1uYW1lICIqIiB0aGF0IGlzIGEgY29tcGFjdCBzeW50YXggZm9yCitpbmRpY2F0aW5nIGFsbCByb2xlcyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJZiBib3RoICIqIiBhbmQKK3JvbGVuYW1lcyBhcHBlYXIsIHRoZSBjb250YWluZXIgaW50ZXJwcmV0cyB0aGlzIGFzIGFsbCByb2xlcy4KK0lmIG5vIHJvbGVzIGFyZSBkZWZpbmVkLCBubyB1c2VyIGlzIGFsbG93ZWQgYWNjZXNzIHRvIHRoZSBwb3J0aW9uIG9mCit0aGUgd2ViIGFwcGxpY2F0aW9uIGRlc2NyaWJlZCBieSB0aGUgY29udGFpbmluZyBzZWN1cml0eS1jb25zdHJhaW50LgorVGhlIGNvbnRhaW5lciBtYXRjaGVzIHJvbGUgbmFtZXMgY2FzZSBzZW5zaXRpdmVseSB3aGVuIGRldGVybWluaW5nCithY2Nlc3MuCisKKworVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAorLS0+Cis8IUVMRU1FTlQgYXV0aC1jb25zdHJhaW50IChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSopPgorCis8IS0tCitUaGUgYXV0aC1tZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KK21lY2hhbmlzbSBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbi4gQXMgYSBwcmVyZXF1aXNpdGUgdG8gZ2FpbmluZyBhY2Nlc3MgdG8gYW55IHdlYiByZXNvdXJjZXMgd2hpY2ggYXJlIHByb3RlY3RlZCBieSBhbiBhdXRob3JpemF0aW9uCitjb25zdHJhaW50LCBhIHVzZXIgbXVzdCBoYXZlIGF1dGhlbnRpY2F0ZWQgdXNpbmcgdGhlIGNvbmZpZ3VyZWQKK21lY2hhbmlzbS4gTGVnYWwgdmFsdWVzIGZvciB0aGlzIGVsZW1lbnQgYXJlICJCQVNJQyIsICJESUdFU1QiLAorIkZPUk0iLCBvciAiQ0xJRU5ULUNFUlQiLgorCitVc2VkIGluOiBsb2dpbi1jb25maWcKKy0tPgorPCFFTEVNRU5UIGF1dGgtbWV0aG9kICgjUENEQVRBKT4KKworPCEtLQorVGhlIGNvbnRleHQtcGFyYW0gZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSB3ZWIKK2FwcGxpY2F0aW9uJ3Mgc2VydmxldCBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisKK1VzZWQgaW46IHdlYi1hcHAKKy0tPgorPCFFTEVNRU5UIGNvbnRleHQtcGFyYW0gKHBhcmFtLW5hbWUsIHBhcmFtLXZhbHVlLCBkZXNjcmlwdGlvbj8pPgorCis8IS0tCitUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQKK2VsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdAordGhlIHdlYiBhcHBsaWNhdGlvbiB3YXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgordGhlIHdlYiBhcHBsaWNhdGlvbiB3YXIgZmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMKK3VzZWQgYnkgdGhlIHdlYiBhcHBsaWNhdGlvbiB3YXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uCit3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgorCitVc2VkIGluOiBhdXRoLWNvbnN0cmFpbnQsIGNvbnRleHQtcGFyYW0sIGVqYi1sb2NhbC1yZWYsIGVqYi1yZWYsCitlbnYtZW50cnksIGZpbHRlciwgaW5pdC1wYXJhbSwgcmVzb3VyY2UtZW52LXJlZiwgcmVzb3VyY2UtcmVmLCBydW4tYXMsCitzZWN1cml0eS1yb2xlLCBzZWN1cml0eS1yb2xlLXJlZiwgc2VydmxldCwgdXNlci1kYXRhLWNvbnN0cmFpbnQsCit3ZWItYXBwLCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbgorLS0+Cis8IUVMRU1FTlQgZGVzY3JpcHRpb24gKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKK2Rpc3BsYXllZCBieSB0b29scy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLgorCitVc2VkIGluOiBmaWx0ZXIsIHNlY3VyaXR5LWNvbnN0cmFpbnQsIHNlcnZsZXQsIHdlYi1hcHAKKworRXhhbXBsZToKKworPGRpc3BsYXktbmFtZT5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KKy0tPgorPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBkaXN0cmlidXRhYmxlIGVsZW1lbnQsIGJ5IGl0cyBwcmVzZW5jZSBpbiBhIHdlYiBhcHBsaWNhdGlvbgorZGVwbG95bWVudCBkZXNjcmlwdG9yLCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHdlYiBhcHBsaWNhdGlvbiBpcworcHJvZ3JhbW1lZCBhcHByb3ByaWF0ZWx5IHRvIGJlIGRlcGxveWVkIGludG8gYSBkaXN0cmlidXRlZCBzZXJ2bGV0Citjb250YWluZXIKKworVXNlZCBpbjogd2ViLWFwcAorLS0+Cis8IUVMRU1FTlQgZGlzdHJpYnV0YWJsZSBFTVBUWT4KKworPCEtLQorVGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgZWpiLXJlZiBvciBlamItbG9jYWwtcmVmCitlbGVtZW50cyB0byBzcGVjaWZ5IHRoYXQgYW4gRUpCIHJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gYW4KK2VudGVycHJpc2UgYmVhbi4KKworVGhlIG5hbWUgaW4gdGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgY29tcG9zZWQgb2YgYQorcGF0aCBuYW1lIHNwZWNpZnlpbmcgdGhlIGVqYi1qYXIgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlCitiZWFuIHdpdGggdGhlIGVqYi1uYW1lIG9mIHRoZSB0YXJnZXQgYmVhbiBhcHBlbmRlZCBhbmQgc2VwYXJhdGVkIGZyb20KK3RoZSBwYXRoIG5hbWUgYnkgIiMiLiAgVGhlIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgd2FyIGZpbGUKK2NvbnRhaW5pbmcgdGhlIHdlYiBhcHBsaWNhdGlvbiB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4uCitUaGlzIGFsbG93cyBtdWx0aXBsZSBlbnRlcnByaXNlIGJlYW5zIHdpdGggdGhlIHNhbWUgZWpiLW5hbWUgdG8gYmUKK3VuaXF1ZWx5IGlkZW50aWZpZWQuCisKK1VzZWQgaW46IGVqYi1sb2NhbC1yZWYsIGVqYi1yZWYKKworRXhhbXBsZXM6CisKKwk8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8L2VqYi1saW5rPgorCisJPGVqYi1saW5rPi4uL3Byb2R1Y3RzL3Byb2R1Y3QuamFyI1Byb2R1Y3RFSkI8L2VqYi1saW5rPgorCistLT4KKzwhRUxFTUVOVCBlamItbGluayAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBlamItbG9jYWwtcmVmIGVsZW1lbnQgaXMgdXNlZCBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvCithbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6CisKKwktIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCisJLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbgorCSAgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4KKwktIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgorCS0gdGhlIGV4cGVjdGVkIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQKKwkgIGVudGVycHJpc2UgYmVhbgorCS0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZAorCSAgZW50ZXJwcmlzZSBiZWFuCisKK1VzZWQgaW46IHdlYi1hcHAKKy0tPgorPCFFTEVNRU5UIGVqYi1sb2NhbC1yZWYgKGRlc2NyaXB0aW9uPywgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsCisJCWxvY2FsLWhvbWUsIGxvY2FsLCBlamItbGluaz8pPgorCis8IS0tCitUaGUgZWpiLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0bworYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgorCisJLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgorCS0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mCisJICB0aGUgd2ViIGFwcGxpY2F0aW9uIHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuCisJLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KKwktIHRoZSBleHBlY3RlZCBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZAorCSAgZW50ZXJwcmlzZSBiZWFuCisJLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZSByZWZlcmVuY2VkCisJICBlbnRlcnByaXNlIGJlYW4KKworVXNlZCBpbjogd2ViLWFwcAorLS0+Cis8IUVMRU1FTlQgZWpiLXJlZiAoZGVzY3JpcHRpb24/LCBlamItcmVmLW5hbWUsIGVqYi1yZWYtdHlwZSwKKwkJaG9tZSwgcmVtb3RlLCBlamItbGluaz8pPgorCis8IS0tCitUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCIHJlZmVyZW5jZS4gVGhlCitFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMKK3JlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQord2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCisKK0l0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KKworVXNlZCBpbjogZWpiLWxvY2FsLXJlZiwgZWpiLXJlZgorCitFeGFtcGxlOgorCis8ZWpiLXJlZi1uYW1lPmVqYi9QYXlyb2xsPC9lamItcmVmLW5hbWU+CistLT4KKzwhRUxFTUVOVCBlamItcmVmLW5hbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlCityZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KKworVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKwk8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgorCTxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgorCitVc2VkIGluOiBlamItbG9jYWwtcmVmLCBlamItcmVmCistLT4KKzwhRUxFTUVOVCBlamItcmVmLXR5cGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3MKK2Vudmlyb25tZW50IGVudHJ5LiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKK2Rlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbAordmFsdWUuICBJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQsIG9uZSBtdXN0IGJlIHN1cHBsaWVkCitkdXJpbmcgZGVwbG95bWVudC4KKy0tPgorPCFFTEVNRU5UIGVudi1lbnRyeSAoZGVzY3JpcHRpb24/LCBlbnYtZW50cnktbmFtZSwgZW52LWVudHJ5LXZhbHVlPywKK2Vudi1lbnRyeS10eXBlKT4KKworPCEtLQorVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSB3ZWIgYXBwbGljYXRpb25zJ3MKK2Vudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCitqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCisKK0V4YW1wbGU6CisKKzxlbnYtZW50cnktbmFtZT5taW5BbW91bnQ8L2Vudi1lbnRyeS1uYW1lPgorCitVc2VkIGluOiBlbnYtZW50cnkKKy0tPgorPCFFTEVNRU5UIGVudi1lbnRyeS1uYW1lICgjUENEQVRBKT4KKworPCEtLQorVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YKK3RoZSBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZSB3ZWIgYXBwbGljYXRpb24ncworY29kZS4KKworVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZToKKworCWphdmEubGFuZy5Cb29sZWFuCisJamF2YS5sYW5nLkJ5dGUKKwlqYXZhLmxhbmcuQ2hhcmFjdGVyCisJamF2YS5sYW5nLlN0cmluZworCWphdmEubGFuZy5TaG9ydAorCWphdmEubGFuZy5JbnRlZ2VyCisJamF2YS5sYW5nLkxvbmcKKwlqYXZhLmxhbmcuRmxvYXQKKwlqYXZhLmxhbmcuRG91YmxlCisKK1VzZWQgaW46IGVudi1lbnRyeQorLS0+Cis8IUVMRU1FTlQgZW52LWVudHJ5LXR5cGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZW52LWVudHJ5LXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3MKK2Vudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUKK2NvbnN0cnVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEgc2luZ2xlIFN0cmluZworcGFyYW1ldGVyLCBvciBmb3IgamF2YS5sYW5nLkNoYXJhY3RlciwgYSBzaW5nbGUgY2hhcmFjdGVyLgorCitFeGFtcGxlOgorCis8ZW52LWVudHJ5LXZhbHVlPjEwMC4wMDwvZW52LWVudHJ5LXZhbHVlPgorCitVc2VkIGluOiBlbnYtZW50cnkKKy0tPgorPCFFTEVNRU5UIGVudi1lbnRyeS12YWx1ZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBlcnJvci1jb2RlIGNvbnRhaW5zIGFuIEhUVFAgZXJyb3IgY29kZSwgZXg6IDQwNAorCitVc2VkIGluOiBlcnJvci1wYWdlCistLT4KKzwhRUxFTUVOVCBlcnJvci1jb2RlICgjUENEQVRBKT4KKworPCEtLQorVGhlIGVycm9yLXBhZ2UgZWxlbWVudCBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlCitvciBleGNlcHRpb24gdHlwZSB0byB0aGUgcGF0aCBvZiBhIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24KKworVXNlZCBpbjogd2ViLWFwcAorLS0+Cis8IUVMRU1FTlQgZXJyb3ItcGFnZSAoKGVycm9yLWNvZGUgfCBleGNlcHRpb24tdHlwZSksIGxvY2F0aW9uKT4KKworPCEtLQorVGhlIGV4Y2VwdGlvbiB0eXBlIGNvbnRhaW5zIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYQorSmF2YSBleGNlcHRpb24gdHlwZS4KKworVXNlZCBpbjogZXJyb3ItcGFnZQorLS0+Cis8IUVMRU1FTlQgZXhjZXB0aW9uLXR5cGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZXh0ZW5zaW9uIGVsZW1lbnQgY29udGFpbnMgYSBzdHJpbmcgZGVzY3JpYmluZyBhbgorZXh0ZW5zaW9uLiBleGFtcGxlOiAidHh0IgorCitVc2VkIGluOiBtaW1lLW1hcHBpbmcKKy0tPgorPCFFTEVNRU5UIGV4dGVuc2lvbiAoI1BDREFUQSk+CisKKzwhLS0KK0RlY2xhcmVzIGEgZmlsdGVyIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSBmaWx0ZXIgaXMgbWFwcGVkIHRvCitlaXRoZXIgYSBzZXJ2bGV0IG9yIGEgVVJMIHBhdHRlcm4gaW4gdGhlIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIHVzaW5nCit0aGUgZmlsdGVyLW5hbWUgdmFsdWUgdG8gcmVmZXJlbmNlLiBGaWx0ZXJzIGNhbiBhY2Nlc3MgdGhlCitpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXQKK3J1bnRpbWUgdmlhIHRoZSBGaWx0ZXJDb25maWcgaW50ZXJmYWNlLgorCitVc2VkIGluOiB3ZWItYXBwCistLT4KKzwhRUxFTUVOVCBmaWx0ZXIgKGljb24/LCBmaWx0ZXItbmFtZSwgZGlzcGxheS1uYW1lPywgZGVzY3JpcHRpb24/LAorZmlsdGVyLWNsYXNzLCBpbml0LXBhcmFtKik+CisKKzwhLS0KK1RoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBmaWx0ZXIuCisKK1VzZWQgaW46IGZpbHRlcgorLS0+Cis8IUVMRU1FTlQgZmlsdGVyLWNsYXNzICgjUENEQVRBKT4KKworPCEtLQorRGVjbGFyYXRpb24gb2YgdGhlIGZpbHRlciBtYXBwaW5ncyBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlCitjb250YWluZXIgdXNlcyB0aGUgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRvIGRlY2lkZSB3aGljaCBmaWx0ZXJzCit0byBhcHBseSB0byBhIHJlcXVlc3QsIGFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlCityZXF1ZXN0IFVSSSB0byBhIFNlcnZsZXQgaW4gdGhlIG5vcm1hbCB3YXkuIFRvIGRldGVybWluZSB3aGljaCBmaWx0ZXJzCit0byBhcHBseSBpdCBtYXRjaGVzIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyBlaXRoZXIgb24gc2VydmxldC1uYW1lLAorb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgZGVwZW5kaW5nIG9uIHdoaWNoCitzdHlsZSBpcyB1c2VkLiBUaGUgb3JkZXIgaW4gd2hpY2ggZmlsdGVycyBhcmUgaW52b2tlZCBpcyB0aGUgb3JkZXIgaW4KK3doaWNoIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0aGF0IG1hdGNoIGEgcmVxdWVzdCBVUkkgZm9yIGEKK3NlcnZsZXQgYXBwZWFyIGluIHRoZSBsaXN0IG9mIGZpbHRlci1tYXBwaW5nIGVsZW1lbnRzLlRoZSBmaWx0ZXItbmFtZQordmFsdWUgbXVzdCBiZSB0aGUgdmFsdWUgb2YgdGhlIDxmaWx0ZXItbmFtZT4gc3ViLWVsZW1lbnRzIG9mIG9uZSBvZiB0aGUKKzxmaWx0ZXI+IGRlY2xhcmF0aW9ucyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgorCitVc2VkIGluOiB3ZWItYXBwCistLT4KKzwhRUxFTUVOVCBmaWx0ZXItbWFwcGluZyAoZmlsdGVyLW5hbWUsICh1cmwtcGF0dGVybiB8IHNlcnZsZXQtbmFtZSkpPgorCis8IS0tCitUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBmaWx0ZXIuIFRoaXMgbmFtZSBpcyB1c2VkIHRvIG1hcCB0aGUgZmlsdGVyLgorRWFjaCBmaWx0ZXIgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCisKK1VzZWQgaW46IGZpbHRlciwgZmlsdGVyLW1hcHBpbmcKKy0tPgorPCFFTEVNRU5UIGZpbHRlci1uYW1lICgjUENEQVRBKT4KKworPCEtLQorVGhlIGZvcm0tZXJyb3ItcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIgYXBwCit3aGVyZSB0aGUgZXJyb3IgcGFnZSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsCitjYW4gYmUgZm91bmQuIFRoZSBwYXRoIGJlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZAorcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KKworVXNlZCBpbjogZm9ybS1sb2dpbi1jb25maWcKKy0tPgorPCFFTEVNRU5UIGZvcm0tZXJyb3ItcGFnZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBmb3JtLWxvZ2luLWNvbmZpZyBlbGVtZW50IHNwZWNpZmllcyB0aGUgbG9naW4gYW5kIGVycm9yIHBhZ2VzCit0aGF0IHNob3VsZCBiZSB1c2VkIGluIGZvcm0gYmFzZWQgbG9naW4uIElmIGZvcm0gYmFzZWQgYXV0aGVudGljYXRpb24KK2lzIG5vdCB1c2VkLCB0aGVzZSBlbGVtZW50cyBhcmUgaWdub3JlZC4KKworVXNlZCBpbjogbG9naW4tY29uZmlnCistLT4KKzwhRUxFTUVOVCBmb3JtLWxvZ2luLWNvbmZpZyAoZm9ybS1sb2dpbi1wYWdlLCBmb3JtLWVycm9yLXBhZ2UpPgorCis8IS0tCitUaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAKK3doZXJlIHRoZSBwYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZSBmb3VuZC4gVGhlIHBhdGgKK2JlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV0FSLgorCitVc2VkIGluOiBmb3JtLWxvZ2luLWNvbmZpZworLS0+Cis8IUVMRU1FTlQgZm9ybS1sb2dpbi1wYWdlICgjUENEQVRBKT4KKworPCEtLQorVGhlIGhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UKK2JlYW4ncyBob21lIGludGVyZmFjZS4KKworVXNlZCBpbjogZWpiLXJlZgorCitFeGFtcGxlOgorCis8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4KKy0tPgorPCFFTEVNRU5UIGhvbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgaHR0cC1tZXRob2QgY29udGFpbnMgYW4gSFRUUCBtZXRob2QgKEdFVCB8IFBPU1QgfC4uLikuCisKK1VzZWQgaW46IHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uCistLT4KKzwhRUxFTUVOVCBodHRwLW1ldGhvZCAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBpY29uIGVsZW1lbnQgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cyB0aGF0CitzcGVjaWZ5IHRoZSBmaWxlIG5hbWVzIGZvciBzbWFsbCBhbmQgYSBsYXJnZSBHSUYgb3IgSlBFRyBpY29uIGltYWdlcwordXNlZCB0byByZXByZXNlbnQgdGhlIHBhcmVudCBlbGVtZW50IGluIGEgR1VJIHRvb2wuCisKK1VzZWQgaW46IGZpbHRlciwgc2VydmxldCwgd2ViLWFwcAorLS0+Cis8IUVMRU1FTlQgaWNvbiAoc21hbGwtaWNvbj8sIGxhcmdlLWljb24/KT4KKworPCEtLQorVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcyBhbgoraW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgdGhlIHNlcnZsZXQKKworVXNlZCBpbjogZmlsdGVyLCBzZXJ2bGV0CistLT4KKzwhRUxFTUVOVCBpbml0LXBhcmFtIChwYXJhbS1uYW1lLCBwYXJhbS12YWx1ZSwgZGVzY3JpcHRpb24/KT4KKworPCEtLQorVGhlIGpzcC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGwgcGF0aCB0byBhIEpTUCBmaWxlIHdpdGhpbgordGhlIHdlYiBhcHBsaWNhdGlvbiBiZWdpbm5pbmcgd2l0aCBhIGAvJy4KKworVXNlZCBpbjogc2VydmxldAorLS0+Cis8IUVMRU1FTlQganNwLWZpbGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQorY29udGFpbmluZyBhIGxhcmdlICgzMiB4IDMyKSBpY29uIGltYWdlLiBUaGUgZmlsZQorbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24ncword2FyIGZpbGUuCisKK1RoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCitUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KKworVXNlZCBpbjogaWNvbgorCitFeGFtcGxlOgorCis8bGFyZ2UtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+CistLT4KKzwhRUxFTUVOVCBsYXJnZS1pY29uICgjUENEQVRBKT4KKworPCEtLQorVGhlIGxpc3RlbmVyIGVsZW1lbnQgaW5kaWNhdGVzIHRoZSBkZXBsb3ltZW50IHByb3BlcnRpZXMgZm9yIGEgd2ViCithcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLgorCitVc2VkIGluOiB3ZWItYXBwCistLT4KKzwhRUxFTUVOVCBsaXN0ZW5lciAobGlzdGVuZXItY2xhc3MpPgorCis8IS0tCitUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGJlCityZWdpc3RlcmVkIGFzIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIFRoZSB2YWx1ZSBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgbGlzdGVuZXIgY2xhc3MuCisKKworVXNlZCBpbjogbGlzdGVuZXIKKy0tPgorPCFFTEVNRU5UIGxpc3RlbmVyLWNsYXNzICgjUENEQVRBKT4KKworPCEtLQorVGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoaXMgc2VydmxldCBzaG91bGQgYmUKK2xvYWRlZCAoaW5zdGFudGlhdGVkIGFuZCBoYXZlIGl0cyBpbml0KCkgY2FsbGVkKSBvbiB0aGUgc3RhcnR1cAorb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mCit0aGVzZSBlbGVtZW50IG11c3QgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcmRlciBpbiB3aGljaAordGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4gSWYgdGhlIHZhbHVlIGlzIGEgbmVnYXRpdmUgaW50ZWdlciwKK29yIHRoZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50LCB0aGUgY29udGFpbmVyIGlzIGZyZWUgdG8gbG9hZCB0aGUKK3NlcnZsZXQgd2hlbmV2ZXIgaXQgY2hvb3Nlcy4gSWYgdGhlIHZhbHVlIGlzIGEgcG9zaXRpdmUgaW50ZWdlcgorb3IgMCwgdGhlIGNvbnRhaW5lciBtdXN0IGxvYWQgYW5kIGluaXRpYWxpemUgdGhlIHNlcnZsZXQgYXMgdGhlCithcHBsaWNhdGlvbiBpcyBkZXBsb3llZC4gVGhlIGNvbnRhaW5lciBtdXN0IGd1YXJhbnRlZSB0aGF0CitzZXJ2bGV0cyBtYXJrZWQgd2l0aCBsb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkIGJlZm9yZSBzZXJ2bGV0cworbWFya2VkIHdpdGggaGlnaGVyIGludGVnZXJzLiBUaGUgY29udGFpbmVyIG1heSBjaG9vc2UgdGhlIG9yZGVyCitvZiBsb2FkaW5nIG9mIHNlcnZsZXRzIHdpdGggdGhlIHNhbWUgbG9hZC1vbi1zdGFydC11cCB2YWx1ZS4KKworVXNlZCBpbjogc2VydmxldAorLS0+Cis8IUVMRU1FTlQgbG9hZC1vbi1zdGFydHVwICgjUENEQVRBKT4KKworPCEtLQorCitUaGUgbG9jYWwgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCitlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBpbnRlcmZhY2UuCisKK1VzZWQgaW46IGVqYi1sb2NhbC1yZWYKKworLS0+Cis8IUVMRU1FTlQgbG9jYWwgKCNQQ0RBVEEpPgorCis8IS0tCisKK1RoZSBsb2NhbC1ob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZQorZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaG9tZSBpbnRlcmZhY2UuCisKK1VzZWQgaW46IGVqYi1sb2NhbC1yZWYKKy0tPgorPCFFTEVNRU5UIGxvY2FsLWhvbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIGluIHRoZSB3ZWIKK2FwcGxpY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSB2YWx1ZSBvZgordGhlIGxvY2F0aW9uIG11c3QgaGF2ZSBhIGxlYWRpbmcgYC8nLgorCitVc2VkIGluOiBlcnJvci1wYWdlCistLT4KKzwhRUxFTUVOVCBsb2NhdGlvbiAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBsb2dpbi1jb25maWcgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KK21ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkLCB0aGUgcmVhbG0gbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvcgordGhpcyBhcHBsaWNhdGlvbiwgYW5kIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5lZWRlZCBieSB0aGUgZm9ybSBsb2dpbgorbWVjaGFuaXNtLgorCitVc2VkIGluOiB3ZWItYXBwCistLT4KKzwhRUxFTUVOVCBsb2dpbi1jb25maWcgKGF1dGgtbWV0aG9kPywgcmVhbG0tbmFtZT8sIGZvcm0tbG9naW4tY29uZmlnPyk+CisKKzwhLS0KK1RoZSBtaW1lLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGV4dGVuc2lvbgorYW5kIGEgbWltZSB0eXBlLgorCitVc2VkIGluOiB3ZWItYXBwCistLT4KKzwhRUxFTUVOVCBtaW1lLW1hcHBpbmcgKGV4dGVuc2lvbiwgbWltZS10eXBlKT4KKworPCEtLQorVGhlIG1pbWUtdHlwZSBlbGVtZW50IGNvbnRhaW5zIGEgZGVmaW5lZCBtaW1lIHR5cGUuIGV4YW1wbGU6CisidGV4dC9wbGFpbiIKKworVXNlZCBpbjogbWltZS1tYXBwaW5nCistLT4KKzwhRUxFTUVOVCBtaW1lLXR5cGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLiBFYWNoIHBhcmFtZXRlcgorbmFtZSBtdXN0IGJlIHVuaXF1ZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgorCisKK1VzZWQgaW46IGNvbnRleHQtcGFyYW0sIGluaXQtcGFyYW0KKy0tPgorPCFFTEVNRU5UIHBhcmFtLW5hbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIuCisKK1VzZWQgaW46IGNvbnRleHQtcGFyYW0sIGluaXQtcGFyYW0KKy0tPgorPCFFTEVNRU5UIHBhcmFtLXZhbHVlICgjUENEQVRBKT4KKworPCEtLQorVGhlIHJlYWxtIG5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHJlYWxtIG5hbWUgdG8gdXNlIGluIEhUVFAKK0Jhc2ljIGF1dGhvcml6YXRpb24uCisKK1VzZWQgaW46IGxvZ2luLWNvbmZpZworLS0+Cis8IUVMRU1FTlQgcmVhbG0tbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UKK2JlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgorCitVc2VkIGluOiBlamItcmVmCisKK0V4YW1wbGU6CisKKzxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgorLS0+Cis8IUVMRU1FTlQgcmVtb3RlICgjUENEQVRBKT4KKworPCEtLQorVGhlIHJlcy1hdXRoIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlIHNpZ25zCitvbiBwcm9ncmFtbWF0aWNhbGx5IHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBvciB3aGV0aGVyIHRoZSBDb250YWluZXIKK3dpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciBvbiBiZWhhbGYgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gSW4gdGhlCitsYXR0ZXIgY2FzZSwgdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlCitEZXBsb3llci4KKworVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKKworCTxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+CisJPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+CisKK1VzZWQgaW46IHJlc291cmNlLXJlZgorLS0+Cis8IUVMRU1FTlQgcmVzLWF1dGggKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UgbWFuYWdlcgorY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQoramF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgorCitVc2VkIGluOiByZXNvdXJjZS1yZWYKKy0tPgorPCFFTEVNRU5UIHJlcy1yZWYtbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSByZXMtc2hhcmluZy1zY29wZSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zIG9idGFpbmVkCit0aHJvdWdoIHRoZSBnaXZlbiByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgY2FuIGJlCitzaGFyZWQuIFRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQsIGlmIHNwZWNpZmllZCwgbXVzdCBiZSBvbmUgb2YgdGhlCit0d28gZm9sbG93aW5nOgorCisJPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+CisJPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KKworVGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLgorCitVc2VkIGluOiByZXNvdXJjZS1yZWYKKy0tPgorPCFFTEVNRU5UIHJlcy1zaGFyaW5nLXNjb3BlICgjUENEQVRBKT4KKworPCEtLQorVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhIHNvdXJjZS4gVGhlIHR5cGUKK2lzIHNwZWNpZmllZCBieSB0aGUgZnVsbHkgcXVhbGlmaWVkIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlCitleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGF0YSBzb3VyY2UuCisKK1VzZWQgaW46IHJlc291cmNlLXJlZgorLS0+Cis8IUVMRU1FTlQgcmVzLXR5cGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgcmVzb3VyY2UtZW52LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSB3ZWIgYXBwbGljYXRpb24ncworcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UKK2luIHRoZSB3ZWIgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCitkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4KK2luZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5Cit0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuCisKK1VzZWQgaW46IHdlYi1hcHAKKworRXhhbXBsZToKKworPHJlc291cmNlLWVudi1yZWY+CisgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgorICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Cis8L3Jlc291cmNlLWVudi1yZWY+CistLT4KKzwhRUxFTUVOVCByZXNvdXJjZS1lbnYtcmVmIChkZXNjcmlwdGlvbj8sIHJlc291cmNlLWVudi1yZWYtbmFtZSwKKwkJcmVzb3VyY2UtZW52LXJlZi10eXBlKT4KKworPCEtLQorVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHJlc291cmNlCitlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCit0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKK2phdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgorCitVc2VkIGluOiByZXNvdXJjZS1lbnYtcmVmCistLT4KKzwhRUxFTUVOVCByZXNvdXJjZS1lbnYtcmVmLW5hbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgcmVzb3VyY2UtZW52LXJlZi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGEgcmVzb3VyY2UKK2Vudmlyb25tZW50IHJlZmVyZW5jZS4gIEl0IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEKK2xhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZS4KKworVXNlZCBpbjogcmVzb3VyY2UtZW52LXJlZgorLS0+Cis8IUVMRU1FTlQgcmVzb3VyY2UtZW52LXJlZi10eXBlICgjUENEQVRBKT4KKworPCEtLQorVGhlIHJlc291cmNlLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSB3ZWIgYXBwbGljYXRpb24ncworcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAorZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwKK3RoZSBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlCitleHBlY3RlZCBieSB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUsIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uCisoQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwgYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlCitzaGFyZWFiaWxpdHkgb2YgY29ubmVjdGlvbnMgb2J0YWluZWQgZnJvbSB0aGUgcmVzb3VyY2UgKFNoYXJlYWJsZSBvcgorVW5zaGFyZWFibGUpLgorCitVc2VkIGluOiB3ZWItYXBwCisKK0V4YW1wbGU6CisKKyAgICA8cmVzb3VyY2UtcmVmPgorCTxyZXMtcmVmLW5hbWU+amRiYy9FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+CisJPHJlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlPC9yZXMtdHlwZT4KKwk8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KKwk8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KKyAgICA8L3Jlc291cmNlLXJlZj4KKy0tPgorPCFFTEVNRU5UIHJlc291cmNlLXJlZiAoZGVzY3JpcHRpb24/LCByZXMtcmVmLW5hbWUsIHJlcy10eXBlLCByZXMtYXV0aCwKKwkJcmVzLXNoYXJpbmctc2NvcGU/KT4KKworPCEtLQorVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZCBzZWN1cml0eSByb2xlLiBUaGUKK3JvbGUtbGluayBlbGVtZW50IG11c3QgY29udGFpbiB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzCitkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgorCitVc2VkIGluOiBzZWN1cml0eS1yb2xlLXJlZgorLS0+Cis8IUVMRU1FTlQgcm9sZS1saW5rICgjUENEQVRBKT4KKworPCEtLQorVGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KKworVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLgorCitVc2VkIGluOiBhdXRoLWNvbnN0cmFpbnQsIHJ1bi1hcywgc2VjdXJpdHktcm9sZSwgc2VjdXJpdHktcm9sZS1yZWYKKy0tPgorPCFFTEVNRU5UIHJvbGUtbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBydW4tYXMgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUKK2V4ZWN1dGlvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kCit0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCisKK1VzZWQgaW46IHNlcnZsZXQKKy0tPgorPCFFTEVNRU5UIHJ1bi1hcyAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUpPgorCis8IS0tCitUaGUgc2VjdXJpdHktY29uc3RyYWludCBlbGVtZW50IGlzIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXR5Citjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9ucworCitVc2VkIGluOiB3ZWItYXBwCistLT4KKzwhRUxFTUVOVCBzZWN1cml0eS1jb25zdHJhaW50IChkaXNwbGF5LW5hbWU/LCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbissCithdXRoLWNvbnN0cmFpbnQ/LCB1c2VyLWRhdGEtY29uc3RyYWludD8pPgorCis8IS0tCitUaGUgc2VjdXJpdHktcm9sZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkKK3JvbGUuIFRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZQorc2VjdXJpdHkgcm9sZSwgYW5kIHRoZSBzZWN1cml0eSByb2xlIG5hbWUuCisKK1VzZWQgaW46IHdlYi1hcHAKKworRXhhbXBsZToKKworICAgIDxzZWN1cml0eS1yb2xlPgorCTxkZXNjcmlwdGlvbj4KKwkgICAgVGhpcyByb2xlIGluY2x1ZGVzIGFsbCBlbXBsb3llZXMgd2hvIGFyZSBhdXRob3JpemVkCisJICAgIHRvIGFjY2VzcyB0aGUgZW1wbG95ZWUgc2VydmljZSBhcHBsaWNhdGlvbi4KKwk8L2Rlc2NyaXB0aW9uPgorCTxyb2xlLW5hbWU+ZW1wbG95ZWU8L3JvbGUtbmFtZT4KKyAgICA8L3NlY3VyaXR5LXJvbGU+CistLT4KKzwhRUxFTUVOVCBzZWN1cml0eS1yb2xlIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSk+CisKKzwhLS0KK1RoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHNlY3VyaXR5Cityb2xlIHJlZmVyZW5jZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MgY29kZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzCitvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZSB1c2VkIGluIHRoZSBjb2RlLAorYW5kIGFuIG9wdGlvbmFsIGxpbmsgdG8gYSBzZWN1cml0eSByb2xlLiBJZiB0aGUgc2VjdXJpdHkgcm9sZSBpcyBub3QKK3NwZWNpZmllZCwgdGhlIERlcGxveWVyIG11c3QgY2hvb3NlIGFuIGFwcHJvcHJpYXRlIHNlY3VyaXR5IHJvbGUuCisKK1RoZSB2YWx1ZSBvZiB0aGUgcm9sZS1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgU3RyaW5nIHVzZWQgYXMgdGhlCitwYXJhbWV0ZXIgdG8gdGhlIEVKQkNvbnRleHQuaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGVOYW1lKSBtZXRob2QKK29yIHRoZSBIdHRwU2VydmxldFJlcXVlc3QuaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSBtZXRob2QuCisKK1VzZWQgaW46IHNlcnZsZXQKKworLS0+Cis8IUVMRU1FTlQgc2VjdXJpdHktcm9sZS1yZWYgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lLCByb2xlLWxpbms/KT4KKworPCEtLQorVGhlIHNlcnZsZXQgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpdmUgZGF0YSBvZiBhCitzZXJ2bGV0LiBJZiBhIGpzcC1maWxlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGlzCitwcmVzZW50LCB0aGVuIHRoZSBKU1Agc2hvdWxkIGJlIHByZWNvbXBpbGVkIGFuZCBsb2FkZWQuCisKK1VzZWQgaW46IHdlYi1hcHAKKy0tPgorPCFFTEVNRU5UIHNlcnZsZXQgKGljb24/LCBzZXJ2bGV0LW5hbWUsIGRpc3BsYXktbmFtZT8sIGRlc2NyaXB0aW9uPywKKyhzZXJ2bGV0LWNsYXNzfGpzcC1maWxlKSwgaW5pdC1wYXJhbSosIGxvYWQtb24tc3RhcnR1cD8sIHJ1bi1hcz8sIHNlY3VyaXR5LXJvbGUtcmVmKik+CisKKzwhLS0KK1RoZSBzZXJ2bGV0LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCitvZiB0aGUgc2VydmxldC4KKworVXNlZCBpbjogc2VydmxldAorLS0+Cis8IUVMRU1FTlQgc2VydmxldC1jbGFzcyAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBzZXJ2bGV0LW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEgc2VydmxldAorYW5kIGEgdXJsIHBhdHRlcm4KKworVXNlZCBpbjogd2ViLWFwcAorLS0+Cis8IUVMRU1FTlQgc2VydmxldC1tYXBwaW5nIChzZXJ2bGV0LW5hbWUsIHVybC1wYXR0ZXJuKT4KKworPCEtLQorVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUKK3NlcnZsZXQuIEVhY2ggc2VydmxldCBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KKworVXNlZCBpbjogZmlsdGVyLW1hcHBpbmcsIHNlcnZsZXQsIHNlcnZsZXQtbWFwcGluZworLS0+Cis8IUVMRU1FTlQgc2VydmxldC1uYW1lICgjUENEQVRBKT4KKworPCEtLQorVGhlIHNlc3Npb24tY29uZmlnIGVsZW1lbnQgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZvcgordGhpcyB3ZWIgYXBwbGljYXRpb24uCisKK1VzZWQgaW46IHdlYi1hcHAKKy0tPgorPCFFTEVNRU5UIHNlc3Npb24tY29uZmlnIChzZXNzaW9uLXRpbWVvdXQ/KT4KKworPCEtLQorVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQgc2Vzc2lvbiB0aW1lb3V0CitpbnRlcnZhbCBmb3IgYWxsIHNlc3Npb25zIGNyZWF0ZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZQorc3BlY2lmaWVkIHRpbWVvdXQgbXVzdCBiZSBleHByZXNzZWQgaW4gYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4KK0lmIHRoZSB0aW1lb3V0IGlzIDAgb3IgbGVzcywgdGhlIGNvbnRhaW5lciBlbnN1cmVzIHRoZSBkZWZhdWx0CitiZWhhdmlvdXIgb2Ygc2Vzc2lvbnMgaXMgbmV2ZXIgdG8gdGltZSBvdXQuCisKK1VzZWQgaW46IHNlc3Npb24tY29uZmlnCistLT4KKzwhRUxFTUVOVCBzZXNzaW9uLXRpbWVvdXQgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQorY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQorbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24ncword2FyIGZpbGUuCisKK1RoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCitUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KKworVXNlZCBpbjogaWNvbgorCitFeGFtcGxlOgorCis8c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+CistLT4KKzwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KKworPCEtLQorVGhlIHRhZ2xpYiBlbGVtZW50IGlzIHVzZWQgdG8gZGVzY3JpYmUgYSBKU1AgdGFnIGxpYnJhcnkuCisKK1VzZWQgaW46IHdlYi1hcHAKKy0tPgorPCFFTEVNRU5UIHRhZ2xpYiAodGFnbGliLXVyaSwgdGFnbGliLWxvY2F0aW9uKT4KKworPCEtLQordGhlIHRhZ2xpYi1sb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiAoYXMgYSByZXNvdXJjZQorcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnCitMaWJhcnkgRGVzY3JpcHRpb24gZmlsZSBmb3IgdGhlIHRhZyBsaWJyYXJ5LgorCitVc2VkIGluOiB0YWdsaWIKKy0tPgorPCFFTEVNRU5UIHRhZ2xpYi1sb2NhdGlvbiAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJLCByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24KK29mIHRoZSB3ZWIueG1sIGRvY3VtZW50LCBpZGVudGlmeWluZyBhIFRhZyBMaWJyYXJ5IHVzZWQgaW4gdGhlIFdlYgorQXBwbGljYXRpb24uCisKK1VzZWQgaW46IHRhZ2xpYgorLS0+Cis8IUVMRU1FTlQgdGFnbGliLXVyaSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSB0cmFuc3BvcnQtZ3VhcmFudGVlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIGNvbW11bmljYXRpb24KK2JldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc2hvdWxkIGJlIE5PTkUsIElOVEVHUkFMLCBvcgorQ09ORklERU5USUFMLiBOT05FIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW55Cit0cmFuc3BvcnQgZ3VhcmFudGVlcy4gQSB2YWx1ZSBvZiBJTlRFR1JBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbgorcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBzZW50IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyIGJlIHNlbnQgaW4KK3N1Y2ggYSB3YXkgdGhhdCBpdCBjYW4ndCBiZSBjaGFuZ2VkIGluIHRyYW5zaXQuIENPTkZJREVOVElBTCBtZWFucwordGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBiZSB0cmFuc21pdHRlZCBpbiBhCitmYXNoaW9uIHRoYXQgcHJldmVudHMgb3RoZXIgZW50aXRpZXMgZnJvbSBvYnNlcnZpbmcgdGhlIGNvbnRlbnRzIG9mCit0aGUgdHJhbnNtaXNzaW9uLiBJbiBtb3N0IGNhc2VzLCB0aGUgcHJlc2VuY2Ugb2YgdGhlIElOVEVHUkFMIG9yCitDT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMgcmVxdWlyZWQuCisKK1VzZWQgaW46IHVzZXItZGF0YS1jb25zdHJhaW50CistLT4KKzwhRUxFTUVOVCB0cmFuc3BvcnQtZ3VhcmFudGVlICgjUENEQVRBKT4KKworPCEtLQorVGhlIHVybC1wYXR0ZXJuIGVsZW1lbnQgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLiBNdXN0Citmb2xsb3cgdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDExLjIgb2YgdGhlIFNlcnZsZXQgQVBJCitTcGVjaWZpY2F0aW9uLgorCitVc2VkIGluOiBmaWx0ZXItbWFwcGluZywgc2VydmxldC1tYXBwaW5nLCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbgorLS0+Cis8IUVMRU1FTlQgdXJsLXBhdHRlcm4gKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgdXNlci1kYXRhLWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGluZGljYXRlIGhvdyBkYXRhCitjb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlIHByb3RlY3RlZC4KKworVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAorLS0+Cis8IUVMRU1FTlQgdXNlci1kYXRhLWNvbnN0cmFpbnQgKGRlc2NyaXB0aW9uPywgdHJhbnNwb3J0LWd1YXJhbnRlZSk+CisKKzwhLS0KK1RoZSB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBzdWJzZXQKK29mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluIGEgd2ViCithcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYgbm8gSFRUUCBtZXRob2RzCithcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMgdG8gYWxsIEhUVFAKK21ldGhvZHMuCisKK1VzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKKy0tPgorPCFFTEVNRU5UIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uICh3ZWItcmVzb3VyY2UtbmFtZSwgZGVzY3JpcHRpb24/LAordXJsLXBhdHRlcm4qLCBodHRwLW1ldGhvZCopPgorCis8IS0tCitUaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIgcmVzb3VyY2UKK2NvbGxlY3Rpb24uCisKK1VzZWQgaW46IHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uCistLT4KKzwhRUxFTUVOVCB3ZWItcmVzb3VyY2UtbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSB3ZWxjb21lLWZpbGUgZWxlbWVudCBjb250YWlucyBmaWxlIG5hbWUgdG8gdXNlIGFzIGEgZGVmYXVsdAord2VsY29tZSBmaWxlLCBzdWNoIGFzIGluZGV4Lmh0bWwKKworVXNlZCBpbjogd2VsY29tZS1maWxlLWxpc3QKKy0tPgorPCFFTEVNRU5UIHdlbGNvbWUtZmlsZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSB3ZWxjb21lLWZpbGUtbGlzdCBjb250YWlucyBhbiBvcmRlcmVkIGxpc3Qgb2Ygd2VsY29tZSBmaWxlcworZWxlbWVudHMuCisKK1VzZWQgaW46IHdlYi1hcHAKKy0tPgorPCFFTEVNRU5UIHdlbGNvbWUtZmlsZS1saXN0ICh3ZWxjb21lLWZpbGUrKT4KKworPCEtLQorVGhlIElEIG1lY2hhbmlzbSBpcyB0byBhbGxvdyB0b29scyB0aGF0IHByb2R1Y2UgYWRkaXRpb25hbCBkZXBsb3ltZW50CitpbmZvcm1hdGlvbiAoaS5lLiwgaW5mb3JtYXRpb24gYmV5b25kIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50CitkZXNjcmlwdG9yIGluZm9ybWF0aW9uKSB0byBzdG9yZSB0aGUgbm9uLXN0YW5kYXJkIGluZm9ybWF0aW9uIGluIGEKK3NlcGFyYXRlIGZpbGUsIGFuZCBlYXNpbHkgcmVmZXIgZnJvbSB0aGVzZSB0b29sLXNwZWNpZmljIGZpbGVzIHRvIHRoZQoraW5mb3JtYXRpb24gaW4gdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKworVG9vbHMgYXJlIG5vdCBhbGxvd2VkIHRvIGFkZCB0aGUgbm9uLXN0YW5kYXJkIGluZm9ybWF0aW9uIGludG8gdGhlCitzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCistLT4KKworPCFBVFRMSVNUIGF1dGgtY29uc3RyYWludCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBhdXRoLW1ldGhvZCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBjb250ZXh0LXBhcmFtIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGRpc3BsYXktbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBkaXN0cmlidXRhYmxlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGVqYi1saW5rIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGVqYi1sb2NhbC1yZWYgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZWpiLXJlZiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBlamItcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZWpiLXJlZi10eXBlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGVudi1lbnRyeSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBlbnYtZW50cnktbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBlbnYtZW50cnktdHlwZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBlbnYtZW50cnktdmFsdWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZXJyb3ItY29kZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBlcnJvci1wYWdlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGV4Y2VwdGlvbi10eXBlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGV4dGVuc2lvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBmaWx0ZXIgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZmlsdGVyLWNsYXNzIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGZpbHRlci1tYXBwaW5nIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGZpbHRlci1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGZvcm0tZXJyb3ItcGFnZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBmb3JtLWxvZ2luLWNvbmZpZyBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBmb3JtLWxvZ2luLXBhZ2UgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgaG9tZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBodHRwLW1ldGhvZCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBpY29uIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGluaXQtcGFyYW0gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QganNwLWZpbGUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgbGFyZ2UtaWNvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsaXN0ZW5lciBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsaXN0ZW5lci1jbGFzcyBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsb2FkLW9uLXN0YXJ0dXAgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgbG9jYWwgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgbG9jYWwtaG9tZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsb2NhdGlvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsb2dpbi1jb25maWcgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgbWltZS1tYXBwaW5nIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIG1pbWUtdHlwZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBwYXJhbS1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHBhcmFtLXZhbHVlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJlYWxtLW5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgcmVtb3RlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJlcy1hdXRoIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJlcy1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByZXMtc2hhcmluZy1zY29wZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByZXMtdHlwZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJlc291cmNlLWVudi1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgcmVzb3VyY2UtcmVmIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJvbGUtbGluayBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByb2xlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgcnVuLWFzIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHNlY3VyaXR5LWNvbnN0cmFpbnQgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgc2VjdXJpdHktcm9sZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzZWN1cml0eS1yb2xlLXJlZiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzZXJ2bGV0IGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHNlcnZsZXQtY2xhc3MgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgc2VydmxldC1tYXBwaW5nIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHNlcnZsZXQtbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzZXNzaW9uLWNvbmZpZyBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzZXNzaW9uLXRpbWVvdXQgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgc21hbGwtaWNvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB0YWdsaWIgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdGFnbGliLWxvY2F0aW9uIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHRhZ2xpYi11cmkgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdHJhbnNwb3J0LWd1YXJhbnRlZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB1cmwtcGF0dGVybiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB1c2VyLWRhdGEtY29uc3RyYWludCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB3ZWItYXBwIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHdlYi1yZXNvdXJjZS1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHdlbGNvbWUtZmlsZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB3ZWxjb21lLWZpbGUtbGlzdCBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvd2ViLWFwcF8yXzQueHNkIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC93ZWItYXBwXzJfNC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmYjAyZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvd2ViLWFwcF8yXzQueHNkCkBAIC0wLDAgKzEsMTI0OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisJICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisJICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisJICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgorCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCisJICAgIHZlcnNpb249IjIuNCI+CisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAlVyUgJUUlCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICBDb3B5cmlnaHQgMjAwNCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KKyAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKKyAgICAgIHJlc2VydmVkLgorCisgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCisgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgorICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCisgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cworICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQorICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKKyAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KKworICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQorICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAorICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50CisgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgorICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgorCisgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKKyAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCisKKyAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAorICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQorICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgorICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCisKKyAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycworICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgorCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPCFbQ0RBVEFbCisKKwlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgU2VydmxldCAyLjQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgorCVRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZCAiV0VCLUlORi93ZWIueG1sIiBpbiB0aGUKKwl3ZWIgYXBwbGljYXRpb24ncyB3YXIgZmlsZS4gIEFsbCBTZXJ2bGV0IGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKKwltdXN0IGluZGljYXRlIHRoZSB3ZWIgYXBwbGljYXRpb24gc2NoZW1hIGJ5IHVzaW5nIHRoZSBKMkVFCisJbmFtZXNwYWNlOgorCisJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQorCisJYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQorCXVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6CisKKwkgICAgPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisJICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Ii4uLiIKKwkgICAgICB2ZXJzaW9uPSIyLjQiPgorCSAgICAgIC4uLgorCSAgICA8L3dlYi1hcHA+CisKKwlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKKwl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCisJbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKKworCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkCisKKwldXT4KKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKKyAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KKworICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQorCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90CisJc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCisJdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQorCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCisJSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKKwlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKKwluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KKworICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KKyAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqc3BfMl8wLnhzZCIvPgorCisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworCisgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItYXBwIiB0eXBlPSJqMmVlOndlYi1hcHBUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50CisJZGVzY3JpcHRvciBmb3IgYSB3ZWIgYXBwbGljYXRpb24uICBOb3RlIHRoYXQgdGhlIHN1Yi1lbGVtZW50cworCW9mIHRoaXMgZWxlbWVudCBjYW4gYmUgaW4gdGhlIGFyYml0cmFyeSBvcmRlci4gQmVjYXVzZSBvZgorCXRoYXQsIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIGVsZW1lbnRzIG9mIGRpc3RyaWJ1dGFibGUsCisJc2Vzc2lvbi1jb25maWcsIHdlbGNvbWUtZmlsZS1saXN0LCBqc3AtY29uZmlnLCBsb2dpbi1jb25maWcsCisJYW5kIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3Qgd2FzIGNoYW5nZWQgZnJvbSAiPyIgdG8gIioiCisJaW4gdGhpcyBzY2hlbWEuICBIb3dldmVyLCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGluc3RhbmNlCisJZmlsZSBtdXN0IG5vdCBjb250YWluIG11bHRpcGxlIGVsZW1lbnRzIG9mIHNlc3Npb24tY29uZmlnLAorCWpzcC1jb25maWcsIGFuZCBsb2dpbi1jb25maWcuIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIG9mCisJd2VsY29tZS1maWxlLWxpc3Qgb3IgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCwgdGhlIGNvbnRhaW5lcgorCW11c3QgY29uY2F0aW5hdGUgdGhlIGVsZW1lbnQgY29udGVudHMuICBUaGUgbXVsdGlwbGUgb2NjdXJhbmNlCisJb2YgdGhlIGVsZW1lbnQgZGlzdHJpYnV0YWJsZSBpcyByZWR1bmRhbnQgYW5kIHRoZSBjb250YWluZXIKKwl0cmVhdHMgdGhhdCBjYXNlIGV4YWN0bHkgaW4gdGhlIHNhbWUgd2F5IHdoZW4gdGhlcmUgaXMgb25seQorCW9uZSBkaXN0cmlidXRhYmxlLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLXNlcnZsZXQtbmFtZS11bmlxdWVuZXNzIj4KKyAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKwk8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgIFRoZSBzZXJ2bGV0IGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZXJ2bGV0LgorCSAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6c2VydmxldCIvPgorICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpzZXJ2bGV0LW5hbWUiLz4KKyAgICA8L3hzZDp1bmlxdWU+CisKKyAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLWZpbHRlci1uYW1lLXVuaXF1ZW5lc3MiPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgVGhlIGZpbHRlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsdGVyLgorCSAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZmlsdGVyIi8+CisgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmZpbHRlci1uYW1lIi8+CisgICAgPC94c2Q6dW5pcXVlPgorCisgICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+CisgICAgICA8eHNkOmFubm90YXRpb24+CisJPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICBUaGUgZWpiLWxvY2FsLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCisJICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIKKwkgIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQorCSAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCisJICB0aGUgd2ViIGFwcGxpY2F0aW9uLgorCisJICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLWxvY2FsLXJlZiIvPgorICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KKyAgICA8L3hzZDp1bmlxdWU+CisKKyAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KKyAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKwk8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKKwkgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIHdlYgorCSAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCisJICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KKwkgIHRoZSB3ZWIgYXBwbGljYXRpb24uCisKKwkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KKworCTwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+CisgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgorICAgIDwveHNkOnVuaXF1ZT4KKworICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KKyAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKwk8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKKwkgIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCisJICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLgorCSAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKKwkgIGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KKworCTwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmIi8+CisgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgorICAgIDwveHNkOnVuaXF1ZT4KKworICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+CisgICAgICA8eHNkOmFubm90YXRpb24+CisJPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgorCSAgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZQorCSAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4KKwkgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52CisJICBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KKyAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgorICAgIDwveHNkOnVuaXF1ZT4KKworICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCisJICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZQorCSAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KKwkgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KKworCTwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1yZWYiLz4KKyAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+CisgICAgPC94c2Q6dW5pcXVlPgorCisgICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KKyAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKwk8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgd2ViCisJICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCisJICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZQorCSAgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgorCisJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZW52LWVudHJ5Ii8+CisgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVudi1lbnRyeS1uYW1lIi8+CisgICAgPC94c2Q6dW5pcXVlPgorCisgICAgPHhzZDprZXkgbmFtZT0id2ViLWFwcC1yb2xlLW5hbWUta2V5Ij4KKyAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKwk8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgIEEgcm9sZS1uYW1lLWtleSBpcyBzcGVjaWZpZWQgdG8gYWxsb3cgdGhlIHJlZmVyZW5jZXMKKwkgIGZyb20gdGhlIHNlY3VyaXR5LXJvbGUtcmVmcy4KKworCTwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpzZWN1cml0eS1yb2xlIi8+CisgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJvbGUtbmFtZSIvPgorICAgIDwveHNkOmtleT4KKworICAgIDx4c2Q6a2V5cmVmIG5hbWU9IndlYi1hcHAtcm9sZS1uYW1lLXJlZmVyZW5jZXMiCisJCXJlZmVyPSJqMmVlOndlYi1hcHAtcm9sZS1uYW1lLWtleSI+CisgICAgICA8eHNkOmFubm90YXRpb24+CisJPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCisJICBzZWN1cml0eS1yb2xlLXJlZiB0byBhIHNwZWNpZmllZCByb2xlLW5hbWUuCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6c2VydmxldC9qMmVlOnNlY3VyaXR5LXJvbGUtcmVmIi8+CisgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJvbGUtbGluayIvPgorICAgIDwveHNkOmtleXJlZj4KKyAgPC94c2Q6ZWxlbWVudD4KKworCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdXRoLWNvbnN0cmFpbnRUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgYXV0aC1jb25zdHJhaW50VHlwZSBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdAorCXNob3VsZCBiZSBwZXJtaXR0ZWQgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UKKwljb2xsZWN0aW9uLiBUaGUgcm9sZS1uYW1lIHVzZWQgaGVyZSBtdXN0IGVpdGhlciBjb3JyZXNwb25kCisJdG8gdGhlIHJvbGUtbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMKKwlkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwgb3IgYmUgdGhlIHNwZWNpYWxseQorCXJlc2VydmVkIHJvbGUtbmFtZSAiKiIgdGhhdCBpcyBhIGNvbXBhY3Qgc3ludGF4IGZvcgorCWluZGljYXRpbmcgYWxsIHJvbGVzIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uIElmIGJvdGggIioiCisJYW5kIHJvbGVuYW1lcyBhcHBlYXIsIHRoZSBjb250YWluZXIgaW50ZXJwcmV0cyB0aGlzIGFzIGFsbAorCXJvbGVzLiAgSWYgbm8gcm9sZXMgYXJlIGRlZmluZWQsIG5vIHVzZXIgaXMgYWxsb3dlZCBhY2Nlc3MKKwl0byB0aGUgcG9ydGlvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlc2NyaWJlZCBieSB0aGUKKwljb250YWluaW5nIHNlY3VyaXR5LWNvbnN0cmFpbnQuICBUaGUgY29udGFpbmVyIG1hdGNoZXMKKwlyb2xlIG5hbWVzIGNhc2Ugc2Vuc2l0aXZlbHkgd2hlbiBkZXRlcm1pbmluZyBhY2Nlc3MuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgorCQkgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdXRoLW1ldGhvZFR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBhdXRoLW1ldGhvZFR5cGUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCisJbWVjaGFuaXNtIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uLiBBcyBhIHByZXJlcXVpc2l0ZSB0bworCWdhaW5pbmcgYWNjZXNzIHRvIGFueSB3ZWIgcmVzb3VyY2VzIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkKKwlhbiBhdXRob3JpemF0aW9uIGNvbnN0cmFpbnQsIGEgdXNlciBtdXN0IGhhdmUgYXV0aGVudGljYXRlZAorCXVzaW5nIHRoZSBjb25maWd1cmVkIG1lY2hhbmlzbS4gTGVnYWwgdmFsdWVzIGFyZSAiQkFTSUMiLAorCSJESUdFU1QiLCAiRk9STSIsICJDTElFTlQtQ0VSVCIsIG9yIGEgdmVuZG9yLXNwZWNpZmljCisJYXV0aGVudGljYXRpb24gc2NoZW1lLgorCisJVXNlZCBpbjogbG9naW4tY29uZmlnCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzcGF0Y2hlclR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBkaXNwYXRjaGVyIGhhcyBmb3VyIGxlZ2FsIHZhbHVlczogRk9SV0FSRCwgUkVRVUVTVCwgSU5DTFVERSwKKwlhbmQgRVJST1IuIEEgdmFsdWUgb2YgRk9SV0FSRCBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZAorCXVuZGVyIFJlcXVlc3REaXNwYXRjaGVyLmZvcndhcmQoKSBjYWxscy4gIEEgdmFsdWUgb2YgUkVRVUVTVAorCW1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyIG9yZGluYXJ5IGNsaWVudCBjYWxscyB0bworCXRoZSBwYXRoIG9yIHNlcnZsZXQuIEEgdmFsdWUgb2YgSU5DTFVERSBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUKKwlhcHBsaWVkIHVuZGVyIFJlcXVlc3REaXNwYXRjaGVyLmluY2x1ZGUoKSBjYWxscy4gIEEgdmFsdWUgb2YKKwlFUlJPUiBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZCB1bmRlciB0aGUgZXJyb3IgcGFnZQorCW1lY2hhbmlzbS4gIFRoZSBhYnNlbmNlIG9mIGFueSBkaXNwYXRjaGVyIGVsZW1lbnRzIGluIGEKKwlmaWx0ZXItbWFwcGluZyBpbmRpY2F0ZXMgYSBkZWZhdWx0IG9mIGFwcGx5aW5nIGZpbHRlcnMgb25seSB1bmRlcgorCW9yZGluYXJ5IGNsaWVudCBjYWxscyB0byB0aGUgcGF0aCBvciBzZXJ2bGV0LgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGT1JXQVJEIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5DTFVERSIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFUVVFU1QiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUlJPUiIvPgorICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW5jb2RpbmdUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgZW5jb2RpbmdUeXBlIGRlZmluZXMgSUFOQSBjaGFyYWN0ZXIgc2V0cy4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iW15cc10rIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVycm9yLWNvZGVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgZXJyb3ItY29kZSBjb250YWlucyBhbiBIVFRQIGVycm9yIGNvZGUsIGV4OiA0MDQKKworCVVzZWQgaW46IGVycm9yLXBhZ2UKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnhzZFBvc2l0aXZlSW50ZWdlclR5cGUiPgorCTx4c2Q6cGF0dGVybiB2YWx1ZT0iXGR7M30iLz4KKwk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXJyb3ItcGFnZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBlcnJvci1wYWdlVHlwZSBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlCisJb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViCisJYXBwbGljYXRpb24uCisKKwlVc2VkIGluOiB3ZWItYXBwCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmNob2ljZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iZXJyb3ItY29kZSIKKwkJICAgICB0eXBlPSJqMmVlOmVycm9yLWNvZGVUeXBlIi8+CisKKwk8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uLXR5cGUiCisJCSAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KKwkgIDx4c2Q6YW5ub3RhdGlvbj4KKwkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgICAgVGhlIGV4Y2VwdGlvbi10eXBlIGNvbnRhaW5zIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCisJICAgICAgbmFtZSBvZiBhIEphdmEgZXhjZXB0aW9uIHR5cGUuCisKKwkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgIDwveHNkOmFubm90YXRpb24+CisJPC94c2Q6ZWxlbWVudD4KKyAgICAgIDwveHNkOmNob2ljZT4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2F0aW9uIgorCQkgICB0eXBlPSJqMmVlOndhci1wYXRoVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBsb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUKKwkgICAgcmVzb3VyY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgorCSAgICB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIG11c3QgaGF2ZQorCSAgICBhIGxlYWRpbmcgYC8nLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbHRlci1tYXBwaW5nVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJRGVjbGFyYXRpb24gb2YgdGhlIGZpbHRlciBtYXBwaW5ncyBpbiB0aGlzIHdlYgorCWFwcGxpY2F0aW9uIGlzIGRvbmUgYnkgdXNpbmcgZmlsdGVyLW1hcHBpbmdUeXBlLgorCVRoZSBjb250YWluZXIgdXNlcyB0aGUgZmlsdGVyLW1hcHBpbmcKKwlkZWNsYXJhdGlvbnMgdG8gZGVjaWRlIHdoaWNoIGZpbHRlcnMgdG8gYXBwbHkgdG8gYSByZXF1ZXN0LAorCWFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlIHJlcXVlc3QgVVJJIHRvCisJYSBTZXJ2bGV0IGluIHRoZSBub3JtYWwgd2F5LiBUbyBkZXRlcm1pbmUgd2hpY2ggZmlsdGVycyB0bworCWFwcGx5IGl0IG1hdGNoZXMgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIGVpdGhlciBvbgorCXNlcnZsZXQtbmFtZSwgb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcKKwllbGVtZW50LCBkZXBlbmRpbmcgb24gd2hpY2ggc3R5bGUgaXMgdXNlZC4gVGhlIG9yZGVyIGluCisJd2hpY2ggZmlsdGVycyBhcmUgaW52b2tlZCBpcyB0aGUgb3JkZXIgaW4gd2hpY2gKKwlmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdGhhdCBtYXRjaCBhIHJlcXVlc3QgVVJJIGZvciBhCisJc2VydmxldCBhcHBlYXIgaW4gdGhlIGxpc3Qgb2YgZmlsdGVyLW1hcHBpbmcgZWxlbWVudHMuVGhlCisJZmlsdGVyLW5hbWUgdmFsdWUgbXVzdCBiZSB0aGUgdmFsdWUgb2YgdGhlIGZpbHRlci1uYW1lCisJc3ViLWVsZW1lbnRzIG9mIG9uZSBvZiB0aGUgZmlsdGVyIGRlY2xhcmF0aW9ucyBpbiB0aGUKKwlkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6ZmlsdGVyLW5hbWVUeXBlIi8+CisgICAgICA8eHNkOmNob2ljZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCisJCSAgICAgdHlwZT0iajJlZTp1cmwtcGF0dGVyblR5cGUiLz4KKwk8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1uYW1lIgorCQkgICAgIHR5cGU9ImoyZWU6c2VydmxldC1uYW1lVHlwZSIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BhdGNoZXIiCisJCSAgIHR5cGU9ImoyZWU6ZGlzcGF0Y2hlclR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI0Ii8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmlsdGVyLW5hbWVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBmaWx0ZXIgaXMgZGVjbGFyZQorCWJ5IHVzaW5nIGZpbHRlci1uYW1lVHlwZS4gVGhpcyBuYW1lIGlzIHVzZWQgdG8gbWFwIHRoZQorCWZpbHRlci4gIEVhY2ggZmlsdGVyIG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViCisJYXBwbGljYXRpb24uCisKKwlVc2VkIGluOiBmaWx0ZXIsIGZpbHRlci1tYXBwaW5nCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImoyZWU6bm9uRW1wdHlTdHJpbmdUeXBlIi8+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbHRlclR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBmaWx0ZXJUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhIGZpbHRlciBpbiB0aGUgd2ViCisJYXBwbGljYXRpb24uIFRoZSBmaWx0ZXIgaXMgbWFwcGVkIHRvIGVpdGhlciBhIHNlcnZsZXQgb3IgYQorCVVSTCBwYXR0ZXJuIGluIHRoZSBmaWx0ZXItbWFwcGluZyBlbGVtZW50LCB1c2luZyB0aGUKKwlmaWx0ZXItbmFtZSB2YWx1ZSB0byByZWZlcmVuY2UuIEZpbHRlcnMgY2FuIGFjY2VzcyB0aGUKKwlpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50CisJZGVzY3JpcHRvciBhdCBydW50aW1lIHZpYSB0aGUgRmlsdGVyQ29uZmlnIGludGVyZmFjZS4KKworCVVzZWQgaW46IHdlYi1hcHAKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItbmFtZSIKKwkJICAgdHlwZT0iajJlZTpmaWx0ZXItbmFtZVR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItY2xhc3MiCisJCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBmaWx0ZXIuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgorCQkgICB0eXBlPSJqMmVlOnBhcmFtLXZhbHVlVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMKKwkgICAgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgYSBzZXJ2bGV0IGZpbHRlcgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZvcm0tbG9naW4tY29uZmlnVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGZvcm0tbG9naW4tY29uZmlnVHlwZSBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvcgorCXBhZ2VzIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gZm9ybSBiYXNlZCBsb2dpbi4gSWYgZm9ybSBiYXNlZAorCWF1dGhlbnRpY2F0aW9uIGlzIG5vdCB1c2VkLCB0aGVzZSBlbGVtZW50cyBhcmUgaWdub3JlZC4KKworCVVzZWQgaW46IGxvZ2luLWNvbmZpZworCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1sb2dpbi1wYWdlIgorCQkgICB0eXBlPSJqMmVlOndhci1wYXRoVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBmb3JtLWxvZ2luLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViCisJICAgIGFwcCB3aGVyZSB0aGUgcGFnZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBsb2dpbiBjYW4gYmUKKwkgICAgZm91bmQuICBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQKKwkgICAgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcm0tZXJyb3ItcGFnZSIKKwkJICAgdHlwZT0iajJlZTp3YXItcGF0aFR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgZm9ybS1lcnJvci1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4KKwkgICAgdGhlIHdlYiBhcHAgd2hlcmUgdGhlIGVycm9yIHBhZ2UgdGhhdCBpcyBkaXNwbGF5ZWQKKwkgICAgd2hlbiBsb2dpbiBpcyBub3Qgc3VjY2Vzc2Z1bCBjYW4gYmUgZm91bmQuCisJICAgIFRoZSBwYXRoIGJlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZAorCSAgICByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV0FSLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaHR0cC1tZXRob2RUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisKKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBodHRwLW1ldGhvZCBjb250YWlucyBhbiBIVFRQIG1ldGhvZCByZWNvZ25pemVkIGJ5IHRoZQorCXdlYi1hcHAsIGZvciBleGFtcGxlIEdFVCwgUE9TVCwgLi4uCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdFVCIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBPU1QiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVVQiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUxFVEUiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIRUFEIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU9OUyIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSQUNFIi8+CisgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdFR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IGNvbnRhaW5zIG9uZSBvciBtb3JlCisJbG9jYWxlLWVuY29kaW5nLW1hcHBpbmcocykuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmciCisJCSAgIHR5cGU9ImoyZWU6bG9jYWxlLWVuY29kaW5nLW1hcHBpbmdUeXBlIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nIGNvbnRhaW5zIGxvY2FsZSBuYW1lIGFuZAorCWVuY29kaW5nIG5hbWUuIFRoZSBsb2NhbGUgbmFtZSBtdXN0IGJlIGVpdGhlciAiTGFuZ3VhZ2UtY29kZSIsCisJc3VjaCBhcyAiamEiLCBkZWZpbmVkIGJ5IElTTy02Mzkgb3IgIkxhbmd1YWdlLWNvZGVfQ291bnRyeS1jb2RlIiwKKwlzdWNoIGFzICJqYV9KUCIuICAiQ291bnRyeSBjb2RlIiBpcyBkZWZpbmVkIGJ5IElTTy0zMTY2LgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZSIKKwkJICAgdHlwZT0iajJlZTpsb2NhbGVUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jb2RpbmciCisJCSAgIHR5cGU9ImoyZWU6ZW5jb2RpbmdUeXBlIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb2NhbGVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgbG9jYWxlVHlwZSBkZWZpbmVzIHZhbGlkIGxvY2FsZSBkZWZpbmVkIGJ5IElTTy02MzktMQorCWFuZCBJU08tMzE2Ni4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iW2Etel17Mn0oX3wtKT8oW1xwe0x9XC1ccHtOZH1dezJ9KT8iLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9naW4tY29uZmlnVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGxvZ2luLWNvbmZpZ1R5cGUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCisJbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlCisJdXNlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbiwgYW5kIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlCisJbmVlZGVkIGJ5IHRoZSBmb3JtIGxvZ2luIG1lY2hhbmlzbS4KKworCVVzZWQgaW46IHdlYi1hcHAKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdXRoLW1ldGhvZCIKKwkJICAgdHlwZT0iajJlZTphdXRoLW1ldGhvZFR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWxtLW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgcmVhbG0gbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcmVhbG0gbmFtZSB0bworCSAgICB1c2UgaW4gSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcm0tbG9naW4tY29uZmlnIgorCQkgICB0eXBlPSJqMmVlOmZvcm0tbG9naW4tY29uZmlnVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWltZS1tYXBwaW5nVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIG1pbWUtbWFwcGluZ1R5cGUgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBleHRlbnNpb24KKwlhbmQgYSBtaW1lIHR5cGUuCisKKwlVc2VkIGluOiB3ZWItYXBwCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmFubm90YXRpb24+CisJPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICBUaGUgZXh0ZW5zaW9uIGVsZW1lbnQgY29udGFpbnMgYSBzdHJpbmcgZGVzY3JpYmluZyBhbgorCSAgZXh0ZW5zaW9uLiBleGFtcGxlOiAidHh0IgorCisJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iCisJCSAgIHR5cGU9ImoyZWU6c3RyaW5nIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWltZS10eXBlIgorCQkgICB0eXBlPSJqMmVlOm1pbWUtdHlwZVR5cGUiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtaW1lLXR5cGVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgbWltZS10eXBlVHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGEgZGVmaW5lZCBtaW1lIHR5cGUuCisKKwlFeGFtcGxlOgorCSJ0ZXh0L3BsYWluIgorCisJVXNlZCBpbjogbWltZS1tYXBwaW5nCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgorICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iW15ccHtDY31eXHNdKy9bXlxwe0NjfV5cc10rIi8+CisgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm9uRW1wdHlTdHJpbmdUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisJVGhpcyB0eXBlIGRlZmluZXMgYSBzdHJpbmcgd2hpY2ggY29udGFpbnMgYXQgbGVhc3Qgb25lCisJY2hhcmFjdGVyLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6bWluTGVuZ3RoIHZhbHVlPSIxIi8+CisgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktY29uc3RyYWludFR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBzZWN1cml0eS1jb25zdHJhaW50VHlwZSBpcyB1c2VkIHRvIGFzc29jaWF0ZQorCXNlY3VyaXR5IGNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlCisJY29sbGVjdGlvbnMKKworCVVzZWQgaW46IHdlYi1hcHAKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIgorCQkgICB0eXBlPSJqMmVlOndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdXRoLWNvbnN0cmFpbnQiCisJCSAgIHR5cGU9ImoyZWU6YXV0aC1jb25zdHJhaW50VHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1kYXRhLWNvbnN0cmFpbnQiCisJCSAgIHR5cGU9ImoyZWU6dXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0LW1hcHBpbmdUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgc2VydmxldC1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEKKwlzZXJ2bGV0IGFuZCBhIHVybCBwYXR0ZXJuLgorCisJVXNlZCBpbjogd2ViLWFwcAorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKKwkJICAgdHlwZT0iajJlZTpzZXJ2bGV0LW5hbWVUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCisJCSAgIHR5cGU9ImoyZWU6dXJsLXBhdHRlcm5UeXBlIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldC1uYW1lVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUKKwlzZXJ2bGV0LiBFYWNoIHNlcnZsZXQgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIKKwlhcHBsaWNhdGlvbi4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iajJlZTpub25FbXB0eVN0cmluZ1R5cGUiLz4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldFR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBzZXJ2bGV0VHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYSBzZXJ2bGV0LgorCUl0IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGl2ZSBkYXRhIG9mIGEKKwlzZXJ2bGV0LiBJZiBhIGpzcC1maWxlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGxvYWQtb24tc3RhcnR1cAorCWVsZW1lbnQgaXMgcHJlc2VudCwgdGhlbiB0aGUgSlNQIHNob3VsZCBiZSBwcmVjb21waWxlZCBhbmQKKwlsb2FkZWQuCisKKwlVc2VkIGluOiB3ZWItYXBwCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1uYW1lIgorCQkgICB0eXBlPSJqMmVlOnNlcnZsZXQtbmFtZVR5cGUiLz4KKyAgICAgIDx4c2Q6Y2hvaWNlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LWNsYXNzIgorCQkgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+CisJICA8eHNkOmFubm90YXRpb24+CisJICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICAgIFRoZSBzZXJ2bGV0LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5CisJICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHNlcnZsZXQuCisKKwkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgIDwveHNkOmFubm90YXRpb24+CisJPC94c2Q6ZWxlbWVudD4KKworCTx4c2Q6ZWxlbWVudCBuYW1lPSJqc3AtZmlsZSIKKwkJICAgICB0eXBlPSJqMmVlOmpzcC1maWxlVHlwZSIvPgorCisgICAgICA8L3hzZDpjaG9pY2U+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgorCQkgICB0eXBlPSJqMmVlOnBhcmFtLXZhbHVlVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYWQtb24tc3RhcnR1cCIKKwkJICAgdHlwZT0iajJlZTp4c2RJbnRlZ2VyVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoaXMKKwkgICAgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkIChpbnN0YW50aWF0ZWQgYW5kIGhhdmUKKwkgICAgaXRzIGluaXQoKSBjYWxsZWQpIG9uIHRoZSBzdGFydHVwIG9mIHRoZSB3ZWIKKwkgICAgYXBwbGljYXRpb24uIFRoZSBvcHRpb25hbCBjb250ZW50cyBvZiB0aGVzZQorCSAgICBlbGVtZW50IG11c3QgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcmRlciBpbgorCSAgICB3aGljaCB0aGUgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkLiBJZiB0aGUgdmFsdWUKKwkgICAgaXMgYSBuZWdhdGl2ZSBpbnRlZ2VyLCBvciB0aGUgZWxlbWVudCBpcyBub3QKKwkgICAgcHJlc2VudCwgdGhlIGNvbnRhaW5lciBpcyBmcmVlIHRvIGxvYWQgdGhlIHNlcnZsZXQKKwkgICAgd2hlbmV2ZXIgaXQgY2hvb3Nlcy4gSWYgdGhlIHZhbHVlIGlzIGEgcG9zaXRpdmUKKwkgICAgaW50ZWdlciBvciAwLCB0aGUgY29udGFpbmVyIG11c3QgbG9hZCBhbmQKKwkgICAgaW5pdGlhbGl6ZSB0aGUgc2VydmxldCBhcyB0aGUgYXBwbGljYXRpb24gaXMKKwkgICAgZGVwbG95ZWQuIFRoZSBjb250YWluZXIgbXVzdCBndWFyYW50ZWUgdGhhdAorCSAgICBzZXJ2bGV0cyBtYXJrZWQgd2l0aCBsb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkCisJICAgIGJlZm9yZSBzZXJ2bGV0cyBtYXJrZWQgd2l0aCBoaWdoZXIgaW50ZWdlcnMuIFRoZQorCSAgICBjb250YWluZXIgbWF5IGNob29zZSB0aGUgb3JkZXIgb2YgbG9hZGluZyBvZgorCSAgICBzZXJ2bGV0cyB3aXRoIHRoZSBzYW1lIGxvYWQtb24tc3RhcnQtdXAgdmFsdWUuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icnVuLWFzIgorCQkgICB0eXBlPSJqMmVlOnJ1bi1hc1R5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgorCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGUtcmVmVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tY29uZmlnVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHNlc3Npb24tY29uZmlnVHlwZSBkZWZpbmVzIHRoZSBzZXNzaW9uIHBhcmFtZXRlcnMKKwlmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisKKwlVc2VkIGluOiB3ZWItYXBwCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi10aW1lb3V0IgorCQkgICB0eXBlPSJqMmVlOnhzZEludGVnZXJUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgc2Vzc2lvbi10aW1lb3V0IGVsZW1lbnQgZGVmaW5lcyB0aGUgZGVmYXVsdAorCSAgICBzZXNzaW9uIHRpbWVvdXQgaW50ZXJ2YWwgZm9yIGFsbCBzZXNzaW9ucyBjcmVhdGVkCisJICAgIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgc3BlY2lmaWVkIHRpbWVvdXQKKwkgICAgbXVzdCBiZSBleHByZXNzZWQgaW4gYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4KKwkgICAgSWYgdGhlIHRpbWVvdXQgaXMgMCBvciBsZXNzLCB0aGUgY29udGFpbmVyIGVuc3VyZXMKKwkgICAgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHNlc3Npb25zIGlzIG5ldmVyIHRvIHRpbWUKKwkgICAgb3V0LiBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGNvbnRhaW5lcgorCSAgICBtdXN0IHNldCBpdHMgZGVmYXVsdCB0aW1lb3V0IHBlcmlvZC4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uCisJYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yCisJQ09ORklERU5USUFMLiBOT05FIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90CisJcmVxdWlyZSBhbnkgdHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMKKwl0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUKKwljbGllbnQgYW5kIHNlcnZlciBiZSBzZW50IGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBjYW4ndCBiZQorCWNoYW5nZWQgaW4gdHJhbnNpdC4gQ09ORklERU5USUFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uCisJcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBiZSB0cmFuc21pdHRlZCBpbiBhIGZhc2hpb24gdGhhdAorCXByZXZlbnRzIG90aGVyIGVudGl0aWVzIGZyb20gb2JzZXJ2aW5nIHRoZSBjb250ZW50cyBvZiB0aGUKKwl0cmFuc21pc3Npb24uIEluIG1vc3QgY2FzZXMsIHRoZSBwcmVzZW5jZSBvZiB0aGUgSU5URUdSQUwgb3IKKwlDT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMKKwlyZXF1aXJlZC4KKworCVVzZWQgaW46IHVzZXItZGF0YS1jb25zdHJhaW50CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR1JBTCIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPTkZJREVOVElBTCIvPgorICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVzZXItZGF0YS1jb25zdHJhaW50VHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHVzZXItZGF0YS1jb25zdHJhaW50VHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGhvdworCWRhdGEgY29tbXVuaWNhdGVkIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgY29udGFpbmVyIHNob3VsZCBiZQorCXByb3RlY3RlZC4KKworCVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKKwkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQtZ3VhcmFudGVlIgorCQkgICB0eXBlPSJqMmVlOnRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2FyLXBhdGhUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSBhIHBhdGggc3RhcnRpbmcKKwl3aXRoIGEgIi8iIGFuZCBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiBhIFdBUgorCWZpbGUuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOnBhdHRlcm4gdmFsdWU9Ii8uKiIvPgorICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0id2ViLWFwcC12ZXJzaW9uVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSByZWNvZ25pemVkIHZlcnNpb25zIG9mCisJd2ViLWFwcGxpY2F0aW9uIHN1cHBvcnRlZC4gSXQgaXMgdXNlZCB0byBkZXNpZ25hdGUgdGhlCisJdmVyc2lvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMi40Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYi1hcHBUeXBlIj4KKworICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3RyaWJ1dGFibGUiCisJCSAgIHR5cGU9ImoyZWU6ZW1wdHlUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGV4dC1wYXJhbSIKKwkJICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiPgorCisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBjb250ZXh0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uCisJICAgIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3Mgc2VydmxldCBjb250ZXh0CisJICAgIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiCisJCSAgIHR5cGU9ImoyZWU6ZmlsdGVyVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1tYXBwaW5nIgorCQkgICB0eXBlPSJqMmVlOmZpbHRlci1tYXBwaW5nVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3RlbmVyIgorCQkgICB0eXBlPSJqMmVlOmxpc3RlbmVyVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQiCisJCSAgIHR5cGU9ImoyZWU6c2VydmxldFR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW1hcHBpbmciCisJCSAgIHR5cGU9ImoyZWU6c2VydmxldC1tYXBwaW5nVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tY29uZmlnIgorCQkgICB0eXBlPSJqMmVlOnNlc3Npb24tY29uZmlnVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbWUtbWFwcGluZyIKKwkJICAgdHlwZT0iajJlZTptaW1lLW1hcHBpbmdUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2VsY29tZS1maWxlLWxpc3QiCisJCSAgIHR5cGU9ImoyZWU6d2VsY29tZS1maWxlLWxpc3RUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXJyb3ItcGFnZSIKKwkJICAgdHlwZT0iajJlZTplcnJvci1wYWdlVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpzcC1jb25maWciCisJCSAgIHR5cGU9ImoyZWU6anNwLWNvbmZpZ1R5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1jb25zdHJhaW50IgorCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9naW4tY29uZmlnIgorCQkgICB0eXBlPSJqMmVlOmxvZ2luLWNvbmZpZ1R5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlIgorCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGVUeXBlIi8+CisgICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uIgorCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCIKKwkJICAgdHlwZT0iajJlZTpsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0VHlwZSIvPgorICAgIDwveHNkOmNob2ljZT4KKworICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCisJCSAgIHR5cGU9ImoyZWU6d2ViLWFwcC12ZXJzaW9uVHlwZSIKKwkJICAgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0CisJb2YgdGhlIHJlc291cmNlcyBhbmQgSFRUUCBtZXRob2RzIG9uIHRob3NlIHJlc291cmNlcyB3aXRoaW4KKwlhIHdlYiBhcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYKKwlubyBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludAorCWFwcGxpZXMgdG8gYWxsIEhUVFAgbWV0aG9kcy4KKworCVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItcmVzb3VyY2UtbmFtZSIKKwkJICAgdHlwZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIKKwkgICAgcmVzb3VyY2UgY29sbGVjdGlvbi4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKKwkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKKwkJICAgdHlwZT0iajJlZTp1cmwtcGF0dGVyblR5cGUiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaHR0cC1tZXRob2QiCisJCSAgIHR5cGU9ImoyZWU6aHR0cC1tZXRob2RUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VsY29tZS1maWxlLWxpc3RUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUKKwlmaWxlcyBlbGVtZW50cy4KKworCVVzZWQgaW46IHdlYi1hcHAKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWxjb21lLWZpbGUiCisJCSAgIHR5cGU9InhzZDpzdHJpbmciCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHdlbGNvbWUtZmlsZSBlbGVtZW50IGNvbnRhaW5zIGZpbGUgbmFtZSB0byB1c2UKKwkgICAgYXMgYSBkZWZhdWx0IHdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPC94c2Q6c2NoZW1hPgorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxNTQyMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8xLmR0ZApAQCAtMCwwICsxLDIwNyBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tCisKKyAgIFRoaXMgaXMgdGhlIERURCBkZWZpbmluZyB0aGUgSmF2YVNlcnZlciBQYWdlcyAxLjEgVGFnIExpYnJhcnkKKyAgIGRlc2NyaXB0b3IgKC50bGQpIChYTUwpIGZpbGUgZm9ybWF0L3N5bnRheC4KKworICAgQSBUYWcgTGlicmFyeSBpcyBhIEpBUiBmaWxlIGNvbnRhaW5pbmcgYSB2YWxpZCBpbnN0YW5jZSBvZiBhIFRhZyBMaWJyYXJ5CisgICBEZXNjcmlwdG9yICh0YWdsaWIudGxkKSBmaWxlIGluIHRoZSBNRVRBLUlORiBzdWJkaXJlY3RvcnksIGFsb25nIHdpdGggdGhlCisgICBhcHByb3ByaWF0ZSBpbXBsZW1lbnRpbmcgY2xhc3NlcywgYW5kIG90aGVyIHJlc291cmNlcyByZXF1aXJlZCB0bworICAgaW1wbGVtZW50IHRoZSB0YWdzIGRlZmluZWQgdGhlcmVpbi4KKworICAgVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcy4KKyAgLS0+CisKKzwhLS0KK1RoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LCBpdCBkZWZpbmVzOgorCit0bGlidmVyc2lvbgl0aGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KK2pzcHZlcnNpb24JdGhlIHZlcnNpb24gb2YgSlNQIHRoZSB0YWcgbGlicmFyeSBkZXBlbmRzIHVwb24KKworc2hvcnRuYW1lCWEgc2ltcGxlIGRlZmF1bHQgc2hvcnQgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkKKwkJYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYSBtbmVtb25pYworCQl2YWx1ZTsgZm9yIGV4YW1wbGUsIHRoZSBpdCBtYXkgYmUgdXNlZCBhcyB0aGUgcHJlZmVyZWQKKwkJcHJlZml4IHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzCit1cmkJCWEgdXJpIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgdGFnbGliCitpbmZvCQlhIHNpbXBsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgInVzZSIgb2YgdGhpcyB0YWdsaWIsCisJCXNob3VsZCBiZSB1c2VyIGRpc2Nlcm5hYmxlCistLT4KKworPCFFTEVNRU5UIHRhZ2xpYiAodGxpYnZlcnNpb24sIGpzcHZlcnNpb24/LCBzaG9ydG5hbWUsIHVyaT8sIGluZm8/LCB0YWcrKSA+Cis8IUFUVExJU1QgdGFnbGliIGlkIElEICNJTVBMSUVECisJICB4bWxucyBDREFUQSAjRklYRUQKKwkJImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQiCis+CisKKzwhLS0KK0Rlc2NyaWJlcyB0aGlzIHZlcnNpb24gKG51bWJlcikgb2YgdGhlIHRhZ2xpYnJhcnkgKGRld2V5IGRlY2ltYWwpCisKKyNQQ0RBVEEgOjo9IFswLTldKnsgIi4iWzAtOV0gfTAuLjMKKy0tPgorCis8IUVMRU1FTlQgdGxpYnZlcnNpb24gKCNQQ0RBVEEpID4KKworPCEtLQorRGVzY3JpYmVzIHRoZSBKU1AgdmVyc2lvbiAobnVtYmVyKSB0aGlzIHRhZ2xpYnJhcnkgcmVxdWlyZXMgaW4KK29yZGVyIHRvIGZ1bmN0aW9uIChkZXdleSBkZWNpbWFsKQorCitUaGUgZGVmYXVsdCBpcyAxLjEKKworI1BDREFUQSA6Oj0gWzAtOV0qeyAiLiJbMC05XSB9MC4uMworLS0+CisKKzwhRUxFTUVOVCBqc3B2ZXJzaW9uICAoI1BDREFUQSkgPgorCis8IS0tCitEZWZpbmVzIGEgc2hvcnQgKGRlZmF1bHQpIHNob3J0bmFtZSB0byBiZSB1c2VkIGZvciB0YWdzIGFuZAordmFyaWFibGUgbmFtZXMgdXNlZC9jcmVhdGVkIGJ5IHRoaXMgdGFnIGxpYnJhcnkuICBEbyBub3QgdXNlCit3aGl0ZSBzcGFjZSwgYW5kIGRvIG5vdCBzdGFydCB3aXRoIGRpZ2l0cyBvciB1bmRlcnNjb3JlLgorCisjUENEQVRBIDo6PSBOTVRPS0VOCistLT4KKworPCFFTEVNRU5UIHNob3J0bmFtZSAgICAgICgjUENEQVRBKSA+CisKKzwhLS0KK0RlZmluZXMgYSBwdWJsaWMgVVJJIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIHZlcnNpb24gb2YKK3RoZSB0YWdsaWJyYXJ5IExlYXZlIGl0IGVtcHR5IGlmIGl0IGRvZXMgbm90IGFwcGx5LgorLS0+CisKKzwhRUxFTUVOVCB1cmkJICgjUENEQVRBKSA+CisKKzwhLS0KK0RlZmluZXMgYW4gYXJiaXRyYXJ5IHRleHQgc3RyaW5nIGRlc2NpcmJpbmcgdGhlIHRhZyBsaWJyYXJ5CistLT4KKworPCFFTEVNRU5UIGluZm8JKCNQQ0RBVEEpID4KKworPCEtLQorVGhlIHRhZyBkZWZpbmVzIGEgdW5pcXVlIHRhZyBpbiB0aGlzIHRhZyBsaWJyYXJ5LCBkZWZpbmluZzoKKworLSB0aGUgdW5pcXVlIHRhZy9lbGVtZW50IG5hbWUKKy0gdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcgaW1wbGVtZW50YXRpb24gY2xhc3MKKy0gYW4gb3B0aW9uYWwgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbworLSB0aGUgYm9keSBjb250ZW50IHR5cGUgKGhpbnQpCistIG9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgorLSBhbnkgYXR0cmlidXRlcworLS0+CisKKzwhRUxFTUVOVCB0YWcgKG5hbWUsIHRhZ2NsYXNzLCB0ZWljbGFzcz8sIGJvZHljb250ZW50PywgaW5mbz8sIGF0dHJpYnV0ZSopID4KKworPCEtLQorRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VybHZldC5qc3AudGFnZXh0LlRhZyB0aGF0IGltcGxlbWVudHMKK3RoZSByZXF1ZXN0IHRpbWUgc2VtYW50aWNzIGZvciB0aGlzIHRhZy4gKHJlcXVpcmVkKQorCisjUENEQVRBIDo6PSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCistLT4KKworPCFFTEVNRU5UIHRhZ2NsYXNzICgjUENEQVRBKSA+CisKKzwhLS0KK0RlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8gZm9yCit0aGlzIHRhZy4gKG9wdGlvbmFsKQorCitJZiB0aGlzIGlzIG5vdCBnaXZlbiwgdGhlIGNsYXNzIGlzIG5vdCBjb25zdWx0ZWQgYXQgdHJhbnNsYXRpb24gdGltZS4KKworI1BDREFUQSA6Oj0gZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQorLS0+CisKKzwhRUxFTUVOVCB0ZWljbGFzcyAoI1BDREFUQSkgPgorCis8IS0tCitQcm92aWRlcyBhIGhpbnQgYXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGJvZHkgb2YgdGhpcyB0YWcuIFByaW1hcmlseQoraW50ZW5kZWQgZm9yIHVzZSBieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzLgorCitUaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIHZhbHVlcyBzcGVjaWZpZWQ6CisKK3RhZ2RlcGVuZGVudAlUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcKKwkJaW1wbGVtZW50YXRpb24gaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkgaW4gYQorCQlkaWZmZXJlbnQgImxhbmdhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMIHN0YXRlbWVudHMuCisKK0pTUAkJVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQIHN5bnRheAorCitlbXB0eQkJVGhlIGJvZHkgbXVzdCBiZSBlbXB0eQorCitUaGUgZGVmYXVsdCAoaWYgbm90IGRlZmluZWQpIGlzIEpTUAorCisjUENEQVRBIDo6PSAgdGFnZGVwZW5kZW50IHwgSlNQIHwgZW1wdHkKKworLS0+CisKKzwhRUxFTUVOVCBib2R5Y29udGVudCAoI1BDREFUQSkgPgorCis8IS0tCitUaGUgYXR0cmlidXRlIHRhZyBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcgdGFnCisKK0FuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGlzIGNvbXBvc2VkIG9mOgorCistIHRoZSBhdHRyaWJ1dGVzIG5hbWUgKHJlcXVpcmVkKQorLSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsIChvcHRpb25hbCkKKy0gaWYgdGhlIGF0dHJpYnV0ZXMgdmFsdWUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgYXQgcnVudGltZQorICBieSBhIHNjcmlwdGxldCBleHByZXNzaW9uIChvcHRpb25hbCkKKworLS0+CisKKzwhRUxFTUVOVCBhdHRyaWJ1dGUgKG5hbWUsIHJlcXVpcmVkPyAsIHJ0ZXhwcnZhbHVlPykgPgorCis8IS0tCitEZWZpbmVzIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIHRhZyBvciBhdHRyaWJ1dGUgYmVpbmcgZGVmaW5lZAorCisjUENEQVRBIDo6PSBOTVRPS0VOCistLT4KKworPCFFTEVNRU5UIG5hbWUJKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwuCisKKyNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCisKK0lmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKK2lzIG9wdGlvbmFsLgorLS0+CisKKzwhRUxFTUVOVCByZXF1aXJlZCAgICAoI1BDREFUQSkgPgorCis8IS0tCitEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBjYW4gaGF2ZSBzY3JpcHRsZXQgZXhwcmVzc2lvbnMgYXMKK2EgdmFsdWUsIGkuZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZAorYXQgcmVxdWVzdCB0aW1lLCBhcyBvcHBvc2VkIHRvIGEgc3RhdGljIHZhbHVlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb24KK3RpbWUuCisKKyNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCisKK0lmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKK2hhcyBhIHN0YXRpYyB2YWx1ZQorLS0+CisKKzwhRUxFTUVOVCBydGV4cHJ2YWx1ZSAoI1BDREFUQSkgPgorCis8IUFUVExJU1QgdGxpYnZlcnNpb24gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QganNwdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzaG9ydG5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdXJpIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGluZm8gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdGFnIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHRhZ2NsYXNzIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHRlaWNsYXNzIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGJvZHljb250ZW50IGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGF0dHJpYnV0ZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBuYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJlcXVpcmVkIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJ0ZXhwcnZhbHVlIGlkIElEICNJTVBMSUVEPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZTM5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQKQEAgLTAsMCArMSw0NzggQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLQorCisgICBUaGlzIGlzIHRoZSBEVEQgZGVmaW5pbmcgdGhlIEphdmFTZXJ2ZXIgUGFnZXMgMS4yIFRhZyBMaWJyYXJ5CisgICBkZXNjcmlwdG9yICgudGxkKSAoWE1MKSBmaWxlIGZvcm1hdC9zeW50YXguCisKKyAgIEEgVGFnIExpYnJhcnkgaXMgYSBKQVIgZmlsZSBjb250YWluaW5nIGEgdmFsaWQgaW5zdGFuY2Ugb2YgYSBUYWcgTGlicmFyeQorICAgRGVzY3JpcHRvciAodGFnbGliLnRsZCkgZmlsZSBpbiB0aGUgTUVUQS1JTkYgc3ViZGlyZWN0b3J5LCBhbG9uZyB3aXRoIHRoZQorICAgYXBwcm9wcmlhdGUgaW1wbGVtZW50aW5nIGNsYXNzZXMsIGFuZCBvdGhlciByZXNvdXJjZXMgcmVxdWlyZWQgdG8KKyAgIGltcGxlbWVudCB0aGUgdGFncyBkZWZpbmVkIHRoZXJlaW4uCisKKyAgIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCisgIC0tPgorCis8IU5PVEFUSU9OIFdFQi1KU1BUQUdMSUIuMV8yIFBVQkxJQworICAgICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMi8vRU4iPgorCis8IS0tCitUaGlzIGlzIHRoZSBYTUwgRFREIGZvciB0aGUgSlNQIDEuMiBUYWcgTGlicmFyeSBEZXNjcmlwdG9yLgorQWxsIEpTUCAxLjIgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcnMgbXVzdCBpbmNsdWRlIGEgRE9DVFlQRQorb2YgdGhlIGZvbGxvd2luZyBmb3JtOgorCisgIDwhRE9DVFlQRSB0YWdsaWIKKyAgICAgICAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMi8vRU4iCisJImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiPgorCistLT4KKworPCEtLQorVGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QsIGl0IGRlZmluZXM6CisKK3RsaWItdmVyc2lvbgl0aGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KKworanNwLXZlcnNpb24JdGhlIHZlcnNpb24gb2YgSlNQIHRoZSB0YWcgbGlicmFyeSBkZXBlbmRzIHVwb24KKworc2hvcnQtbmFtZQlhIHNpbXBsZSBkZWZhdWx0IHNob3J0IG5hbWUgdGhhdCBjb3VsZCBiZSB1c2VkIGJ5CisJCWEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSBuYW1lcyB3aXRoIGEgbW5lbW9uaWMKKwkJdmFsdWU7IGZvciBleGFtcGxlLCB0aGUgaXQgbWF5IGJlIHVzZWQgYXMgdGhlIHByZWZlcmVkCisJCXByZWZpeCB2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcworCit1cmkJCWEgdXJpIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgdGFnbGliCisKK2Rpc3BsYXktbmFtZSAgICB0aGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQKKyAgICAgICAgICAgICAgICBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMKK3NtYWxsLWljb24gICAgICBvcHRpb25hbCBzbWFsbC1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKKworbGFyZ2UtaWNvbiAgICAgIG9wdGlvbmFsIGxhcmdlLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scworCitkZXNjcmlwdGlvbglhIHNpbXBsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgInVzZSIgb2YgdGhpcyB0YWdsaWIsCisJCXNob3VsZCBiZSB1c2VyIGRpc2Nlcm5hYmxlCisKK3ZhbGlkYXRvciAgICAgICBvcHRpb25hbCBUYWdMaWJyYXJ5VmFsaWRhdG9yIGluZm9ybWF0aW9uCisKK2xpc3RlbmVyICAgICAgICBvcHRpb25hbCBldmVudCBsaXN0ZW5lciBzcGVjaWZpY2F0aW9uCisKKworLS0+CisKKzwhRUxFTUVOVCB0YWdsaWIgKHRsaWItdmVyc2lvbiwganNwLXZlcnNpb24sIHNob3J0LW5hbWUsIHVyaT8sCisgICAgICAgICAgICAgICAgICBkaXNwbGF5LW5hbWU/LCBzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8sIGRlc2NyaXB0aW9uPywKKyAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcj8sIGxpc3RlbmVyKiwgdGFnKykgPgorCis8IUFUVExJU1QgdGFnbGliIGlkIElEICNJTVBMSUVECisJICB4bWxucyBDREFUQSAjRklYRUQKKwkJImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1RhZ0xpYnJhcnlEZXNjcmlwdG9yIgorPgorCis8IS0tCitEZXNjcmliZXMgdGhpcyB2ZXJzaW9uIChudW1iZXIpIG9mIHRoZSB0YWdsaWJyYXJ5IChkZXdleSBkZWNpbWFsKQorCisjUENEQVRBIDo6PSBbMC05XSp7ICIuIlswLTldIH0wLi4zCistLT4KKworPCFFTEVNRU5UIHRsaWItdmVyc2lvbiAoI1BDREFUQSkgPgorCis8IS0tCitEZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnbGlicmFyeSByZXF1aXJlcyBpbgorb3JkZXIgdG8gZnVuY3Rpb24gKGRld2V5IGRlY2ltYWwpCisKK1RoZSBkZWZhdWx0IGlzIDEuMgorCisjUENEQVRBIDo6PSBbMC05XSp7ICIuIlswLTldIH0wLi4zCistLT4KKworPCFFTEVNRU5UIGpzcC12ZXJzaW9uICAoI1BDREFUQSkgPgorCis8IS0tCitEZWZpbmVzIGEgc2hvcnQgKGRlZmF1bHQpIHNob3J0LW5hbWUgdG8gYmUgdXNlZCBmb3IgdGFncyBhbmQKK3ZhcmlhYmxlIG5hbWVzIHVzZWQvY3JlYXRlZCBieSB0aGlzIHRhZyBsaWJyYXJ5LiAgRG8gbm90IHVzZQord2hpdGUgc3BhY2UsIGFuZCBkbyBub3Qgc3RhcnQgd2l0aCBkaWdpdHMgb3IgdW5kZXJzY29yZS4KKworI1BDREFUQSA6Oj0gTk1UT0tFTgorLS0+CisKKzwhRUxFTUVOVCBzaG9ydC1uYW1lICAgICAgKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyBhIHB1YmxpYyBVUkkgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgdmVyc2lvbiBvZgordGhlIHRhZ2xpYnJhcnkuICBMZWF2ZSBpdCBlbXB0eSBpZiBpdCBkb2VzIG5vdCBhcHBseS4KKy0tPgorCis8IUVMRU1FTlQgdXJpCSAoI1BDREFUQSkgPgorCis8IS0tCitEZWZpbmVzIGFuIGFyYml0cmFyeSB0ZXh0IHN0cmluZyBkZXNjaXJiaW5nIHRoZSB0YWcgbGlicmFyeQorLS0+CisKKzwhRUxFTUVOVCBkZXNjcmlwdGlvbgkoI1BDREFUQSkgPgorCis8IS0tCisKK0RlZmluZXMgYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8KK3ZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkuCistLT4KKworPCFFTEVNRU5UIHZhbGlkYXRvciAodmFsaWRhdG9yLWNsYXNzLCBpbml0LXBhcmFtKiwgZGVzY3JpcHRpb24/KSA+CisKKworPCEtLQorCitEZWZpbmVzIHRoZSBUYWdMaWJyYXJ5VmFsaWRhdG9yIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8KK3ZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkuCistLT4KKworPCFFTEVNRU5UIHZhbGlkYXRvci1jbGFzcyAoI1BDREFUQSkgPgorCisKKzwhLS0KKworVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcyBhbgoraW5pdGlhbGl6YXRpb24gcGFyYW0KKy0tPgorCis8IUVMRU1FTlQgaW5pdC1wYXJhbSAocGFyYW0tbmFtZSwgcGFyYW0tdmFsdWUsIGRlc2NyaXB0aW9uPyk+CisKKzwhLS0KKworVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KKy0tPgorCis8IUVMRU1FTlQgcGFyYW0tbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KKworVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLgorLS0+CisKKzwhRUxFTUVOVCBwYXJhbS12YWx1ZSAoI1BDREFUQSk+CisKKworPCEtLQorCitEZWZpbmVzIGFuIG9wdGlvbmFsIGV2ZW50IGxpc3RlbmVyIG9iamVjdCB0byBiZSBpbnN0YW50aWF0ZWQgYW5kCityZWdpc3RlcmVkIGF1dG9tYXRpY2FsbHkuCistLT4KKworPCFFTEVNRU5UIGxpc3RlbmVyIChsaXN0ZW5lci1jbGFzcykgPgorCis8IS0tCisKK1RoZSBsaXN0ZW5lci1jbGFzcyBlbGVtZW50IGRlY2xhcmVzIGEgY2xhc3MgaW4gdGhlIGFwcGxpY2F0aW9uIHRoYXQKK211c3QgYmUgcmVnaXN0ZXJlZCBhcyBhIHdlYiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLiAgU2VlIHRoZQorU2VydmxldCAyLjMgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKy0tPgorCis8IUVMRU1FTlQgbGlzdGVuZXItY2xhc3MgKCNQQ0RBVEEpID4KKworCis8IS0tCitUaGUgdGFnIGRlZmluZXMgYSB1bmlxdWUgdGFnIGluIHRoaXMgdGFnIGxpYnJhcnkuICBJdCBoYXMgb25lCithdHRyaWJ1dGUsIGlkLgorCitUaGUgdGFnIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKKworbmFtZSAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZQorCit0YWctY2xhc3MgICAgICAgICBUaGUgdGFnIGhhbmRsZXIgY2xhc3MgaW1wbGVtZW50aW5nCisgICAgICAgICAgICAgICAgICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnCisKK3RlaS1jbGFzcyAgICAgICAgIEFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mCisgICAgICAgICAgICAgICAgICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCisKK2JvZHktY29udGVudCAgICAgIFRoZSBib2R5IGNvbnRlbnQgdHlwZQorCitkaXNwbGF5LW5hbWUgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQKKyAgICAgICAgICAgICAgICAgIGJ5IHRvb2xzCisKK3NtYWxsLWljb24gICAgICAgIE9wdGlvbmFsIHNtYWxsLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scworCitsYXJnZS1pY29uICAgICAgICBPcHRpb25hbCBsYXJnZS1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKKworZGVzY3JpcHRpb24gICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCisKK3ZhcmlhYmxlICAgICAgICAgIE9wdGlvbmFsIHNjcmlwdGluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbgorCithdHRyaWJ1dGUgICAgICAgICBBbGwgYXR0cmlidXRlcyBvZiB0aGlzIGFjdGlvbgorCitleGFtcGxlICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbiBleGFtcGxlIG9mIGEKKyAgICAgICAgICAgICAgICAgIHVzZSBvZiB0aGlzIHRhZworCistLT4KKworPCFFTEVNRU5UIHRhZyAobmFtZSwgdGFnLWNsYXNzLCB0ZWktY2xhc3M/LCBib2R5LWNvbnRlbnQ/LCBkaXNwbGF5LW5hbWU/LAorICAgICAgICAgICAgICAgc21hbGwtaWNvbj8sIGxhcmdlLWljb24/LCBkZXNjcmlwdGlvbj8sIHZhcmlhYmxlKiwgYXR0cmlidXRlKiwKKyAgICAgICAgICAgICAgIGV4YW1wbGU/KSA+CisKKzwhLS0KK0RlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcmx2ZXQuanNwLnRhZ2V4dC5UYWcgdGhhdCBpbXBsZW1lbnRzCit0aGUgcmVxdWVzdCB0aW1lIHNlbWFudGljcyBmb3IgdGhpcyB0YWcuIChyZXF1aXJlZCkKKworI1BDREFUQSA6Oj0gZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQorLS0+CisKKzwhRUxFTUVOVCB0YWctY2xhc3MgKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbyBmb3IKK3RoaXMgdGFnLiAob3B0aW9uYWwpCisKK0lmIHRoaXMgaXMgbm90IGdpdmVuLCB0aGUgY2xhc3MgaXMgbm90IGNvbnN1bHRlZCBhdCB0cmFuc2xhdGlvbiB0aW1lLgorCisjUENEQVRBIDo6PSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCistLT4KKworPCFFTEVNRU5UIHRlaS1jbGFzcyAoI1BDREFUQSkgPgorCis8IS0tCitQcm92aWRlcyBhIGhpbnQgYXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGJvZHkgb2YgdGhpcyB0YWcuIFByaW1hcmlseQoraW50ZW5kZWQgZm9yIHVzZSBieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzLgorCitUaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIHZhbHVlcyBzcGVjaWZpZWQ6CisKK3RhZ2RlcGVuZGVudAlUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcKKwkJaW1wbGVtZW50YXRpb24gaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkgaW4gYQorCQlkaWZmZXJlbnQgImxhbmdhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMIHN0YXRlbWVudHMuCisKK0pTUAkJVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQIHN5bnRheAorCitlbXB0eQkJVGhlIGJvZHkgbXVzdCBiZSBlbXB0eQorCitUaGUgZGVmYXVsdCAoaWYgbm90IGRlZmluZWQpIGlzIEpTUAorCisjUENEQVRBIDo6PSAgdGFnZGVwZW5kZW50IHwgSlNQIHwgZW1wdHkKKworLS0+CisKKzwhRUxFTUVOVCBib2R5LWNvbnRlbnQgKCNQQ0RBVEEpID4KKworPCEtLQorCitUaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQKK3RvIGJlIGRpc3BsYXllZCBieSB0b29scy4KKy0tPgorCis8IUVMRU1FTlQgZGlzcGxheS1uYW1lICgjUENEQVRBKSA+CisKKworPCEtLQorCitUaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgbGFyZ2UKKygzMiB4IDMyKSBpY29uIGltYWdlLiAgVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZQordGFnIGxpYnJhcnkuICBUaGUgaW1hZ2UgbXVzdCBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdCwgYW5kCit0aGUgZmlsZSBuYW1lIG11c3QgZW5kIHdpdGggdGhlIHN1ZmZpeCAiLmpwZyIgb3IgIi5naWYiIHJlc3BlY3RpdmVseS4KK1RoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgorLS0+CisKKzwhRUxFTUVOVCBsYXJnZS1pY29uICgjUENEQVRBKSA+CisKKzwhLS0KKworVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyBhIGxhcmdlCisoMzIgeCAzMikgaWNvbiBpbWFnZS4gIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUKK3RhZyBsaWJyYXJ5LiAgVGhlIGltYWdlIG11c3QgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQsIGFuZAordGhlIGZpbGUgbmFtZSBtdXN0IGVuZCB3aXRoIHRoZSBzdWZmaXggIi5qcGciIG9yICIuZ2lmIiByZXNwZWN0aXZlbHkuCitUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KKy0tPgorCis8IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSkgPgorCis8IS0tCisKK1RoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZQorb2YgdGhlIHVzZSBvZiBhIHRhZy4KKy0tPgorCis8IUVMRU1FTlQgZXhhbXBsZSAoI1BDREFUQSkgPgorCis8IS0tCisKK1RoZSB2YXJpYWJsZSB0YWcgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZyB2YXJpYWJsZXMKK2RlZmluZWQgYnkgdGhpcyB0YWcuICBJdCBpcyBhICh0cmFuc2xhdGlvbiB0aW1lKSBlcnJvciBmb3IgYSB0YWcKK3RoYXQgaGFzIG9uZSBvciBtb3JlIHZhcmlhYmxlIHN1YmVsZW1lbnRzIHRvIGhhdmUgYSBUYWdFeHRyYUluZm8KK2NsYXNzIHRoYXQgcmV0dXJucyBhIG5vbi1udWxsIG9iamVjdC4KKworVGhlIHN1YmVsZW1lbnRzIG9mIHZhcmlhYmxlIGFyZSBvZiB0aGUgZm9ybToKKworbmFtZS1naXZlbiAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSBuYW1lIGFzIGEgY29uc3RhbnQKKworbmFtZS1mcm9tLWF0dHJpYnV0ZSAgICAgIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lKSB2YWx1ZSB3aWxsIGdpdmUgdGhlIG5hbWUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuICBPbmUgb2YgbmFtZS1naXZlbiBvcgorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUtZnJvbS1hdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCisKK3ZhcmlhYmxlLWNsYXNzICAgICAgICAgICBOYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGUgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBpcyBkZWZhdWx0LgorCitkZWNsYXJlICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUgaXMgdGhlIGRlZmF1bHQuCisKK3Njb3BlICAgICAgICAgICAgICAgICAgICBUaGUgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJhaWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQuICBORVNURUQgaXMgZGVmYXVsdC4KKworZGVzY3JpcHRpb24gICAgICAgICAgICAgIE9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoaXMgdmFyaWFibGUKKworLS0+CisKKzwhRUxFTUVOVCB2YXJpYWJsZSAoIChuYW1lLWdpdmVuIHwgbmFtZS1mcm9tLWF0dHJpYnV0ZSksIHZhcmlhYmxlLWNsYXNzPywKKyAgICAgICAgICAgICAgICAgICAgZGVjbGFyZT8sIHNjb3BlPywgZGVzY3JpcHRpb24/KSA+CisKKzwhLS0KKworVGhlIG5hbWUgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuICBPbmUgb2YgbmFtZS1naXZlbiBvcgorbmFtZS1mcm9tLWF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KKy0tPgorCis8IUVMRU1FTlQgbmFtZS1naXZlbiAoI1BDREFUQSkgPgorCis8IS0tCisKK1RoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24tdGltZSkgdmFsdWUgd2lsbCBnaXZlCit0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuICBPbmUgb2YgbmFtZS1naXZlbiBvciBuYW1lLWZyb20tYXR0cmlidXRlCitpcyByZXF1aXJlZC4KKy0tPgorCis8IUVMRU1FTlQgbmFtZS1mcm9tLWF0dHJpYnV0ZSAoI1BDREFUQSkgPgorCis8IS0tCisKK1RoZSBvcHRpb25hbCBuYW1lIG9mIHRoZSBjbGFzcyBmb3IgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4gIFRoZQorZGVmYXVsdCBpcyBqYXZhLmxhbmcuU3RyaW5nLgorLS0+CisKKzwhRUxFTUVOVCB2YXJpYWJsZS1jbGFzcyAoI1BDREFUQSkgPgorCis8IS0tCisKK1doZXRoZXIgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBpcyB0byBiZSBkZWZpbmVkIG9yIG5vdC4gIFNlZQorVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLiAgVGhpcyBlbGVtZW50IGlzIG9wdGlvbmFsIGFuZCAidHJ1ZSIKK2lzIHRoZSBkZWZhdWx0LgorLS0+CisKKzwhRUxFTUVOVCBkZWNsYXJlICgjUENEQVRBKSA+CisKKzwhLS0KKworVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuICBTZWUgVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLgorVGhlIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kICJORVNURUQiIGlzIHRoZSBkZWZhdWx0LiAgT3RoZXIgbGVnYWwKK3ZhbHVlcyBhcmUgIkFUX0JFR0lOIiBhbmQgIkFUX0VORCIuCistLT4KKworPCFFTEVNRU5UIHNjb3BlICgjUENEQVRBKSA+CisKKzwhLS0KKworVGhlIGF0dHJpYnV0ZSB0YWcgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBuZXN0aW5nIHRhZworCitBbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBpcyBjb21wb3NlZCBvZjoKKwkKKy0gdGhlIGF0dHJpYnV0ZXMgbmFtZSAocmVxdWlyZWQpCistIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwgKG9wdGlvbmFsKQorLSBpZiB0aGUgYXR0cmlidXRlcyB2YWx1ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBhdCBydW50aW1lCisgIGJ5IGEgc2NyaXB0bGV0IGV4cHJlc3Npb24gKG9wdGlvbmFsKQorLSB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZSAob3B0aW9uYWwpCistIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBtZWFuaW5nIG9mIHRoZSBhdHRyaWJ1dGUgKG9wdGlvbmFsKQorCistLT4KKworCis8IS0tCitUaGUgYXR0cmlidXRlIHRhZyBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcgdGFnCisKK0FuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGlzIGNvbXBvc2VkIG9mOgorCistIHRoZSBhdHRyaWJ1dGVzIG5hbWUgKHJlcXVpcmVkKQorCistIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwgKG9wdGlvbmFsKQorCistIGlmIHRoZSBhdHRyaWJ1dGVzIHZhbHVlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkIGF0IHJ1bnRpbWUKKyAgYnkgYSBzY3JpcHRsZXQgZXhwcmVzc2lvbiAob3B0aW9uYWwpCisKKy0gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUgKG9wdGlvbmFsKQorCistIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBtZWFuaW5nIG9mIHRoZSBhdHRyaWJ1dGUgKG9wdGlvbmFsKQorLS0+CisKKzwhRUxFTUVOVCBhdHRyaWJ1dGUgKG5hbWUsIHJlcXVpcmVkPyAsIHJ0ZXhwcnZhbHVlPywgdHlwZT8sIGRlc2NyaXB0aW9uPykgPgorCis8IS0tCitEZWZpbmVzIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIHRhZyBvciBhdHRyaWJ1dGUgYmVpbmcgZGVmaW5lZAorCisjUENEQVRBIDo6PSBOTVRPS0VOCistLT4KKworPCFFTEVNRU5UIG5hbWUJKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwuCisKKyNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCisKK0lmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKK2lzIG9wdGlvbmFsLgorLS0+CisKKzwhRUxFTUVOVCByZXF1aXJlZCAgICAoI1BDREFUQSkgPgorCis8IS0tCitEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBjYW4gaGF2ZSBzY3JpcHRsZXQgZXhwcmVzc2lvbnMgYXMKK2EgdmFsdWUsIGkuZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZAorYXQgcmVxdWVzdCB0aW1lLCBhcyBvcHBvc2VkIHRvIGEgc3RhdGljIHZhbHVlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb24KK3RpbWUuCisKKyNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCisKK0lmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKK2hhcyBhIHN0YXRpYyB2YWx1ZQorLS0+CisKKzwhRUxFTUVOVCBydGV4cHJ2YWx1ZSAoI1BDREFUQSkgPgorCisKKzwhLS0KKworRGVmaW5lcyB0aGUgSmF2YSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzIHZhbHVlLiAgRm9yIHN0YXRpYyB2YWx1ZXMKKyh0aG9zZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9uIHRpbWUpIHRoZSB0eXBlIGlzIGFsd2F5cworamF2YS5sYW5nLlN0cmluZy4KKy0tPgorCis8IUVMRU1FTlQgdHlwZSAoI1BDREFUQSkgPgorCisKKzwhLS0gSUQgYXR0cmlidXRlcyAtLT4KKworPCFBVFRMSVNUIHRsaWItdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBqc3AtdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzaG9ydC1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHVyaSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBleGFtcGxlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHRhZyBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB0YWctY2xhc3MgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdGVpLWNsYXNzIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGJvZHktY29udGVudCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBhdHRyaWJ1dGUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByZXF1aXJlZCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBydGV4cHJ2YWx1ZSBpZCBJRCAjSU1QTElFRD4KKworCis8IUFUVExJU1QgcGFyYW0tbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBwYXJhbS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsaXN0ZW5lciBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsaXN0ZW5lci1jbGFzcyBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZCBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzQ2MzIwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkCkBAIC0wLDAgKzEsMTAyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHhzZDpzY2hlbWEKKyAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorICAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgICB4bWxuczp4bWw9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKKyAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCisgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKKyAgICAgdmVyc2lvbj0iMi4wIj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgJVclICVHJQorICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbworICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cworICAgICAgcmVzZXJ2ZWQuCisKKyAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKKyAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCisgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKKyAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCisgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCisgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQorICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgorCisgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCisgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCisgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKKyAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCisgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCisKKyAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcworICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KKworICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCisgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCisgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCisgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KKworICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCisgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCisKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICA8IVtDREFUQVsKKworCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgVGFnbGlicmFyeQorCWRlc2NyaXB0b3IuICBBbGwgVGFnbGlicmFyeSBkZXNjcmlwdG9ycyBtdXN0CisJaW5kaWNhdGUgdGhlIHRhZyBsaWJyYXJ5IHNjaGVtYSBieSB1c2luZyB0aGUgVGFnbGlicmFyeQorCW5hbWVzcGFjZToKKworCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKKworCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKKwl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgorCisJICAgIDx0YWdsaWIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisJICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Ii4uLiIKKwkgICAgICB2ZXJzaW9uPSIyLjAiPgorCSAgICAgIC4uLgorCSAgICA8L3RhZ2xpYj4KKworCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQKKwl2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgdXNpbmcgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZQorCWZvciBKMkVFIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246CisKKwlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMC54c2QKKworCV1dPgorICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KKworCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKworICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliIiB0eXBlPSJqMmVlOnRsZFRhZ2xpYlR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LgorCVRoZSBkZWZpbml0aW9uIG9mIHRhZ2xpYiBpcyBwcm92aWRlZAorCWJ5IHRoZSB0bGRUYWdsaWJUeXBlLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDp1bmlxdWUgbmFtZT0idGFnLW5hbWUtdW5pcXVlbmVzcyI+CisgICAgICA8eHNkOmFubm90YXRpb24+CisJPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICBUaGUgdGFnbGliIGVsZW1lbnQgY29udGFpbnMsIGFtb25nIG90aGVyIHRoaW5ncywgdGFnIGFuZAorCSAgdGFnLWZpbGUgZWxlbWVudHMuCisJICBUaGUgbmFtZSBzdWJlbGVtZW50cyBvZiB0aGVzZSBlbGVtZW50cyBtdXN0IGVhY2ggYmUgdW5pcXVlLgorCisJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnRhZ3xqMmVlOnRhZy1maWxlIi8+CisgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm5hbWUiLz4KKyAgICA8L3hzZDp1bmlxdWU+CisKKyAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmdW5jdGlvbi1uYW1lLXVuaXF1ZW5lc3MiPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgVGhlIHRhZ2xpYiBlbGVtZW50IGNvbnRhaW5zIGZ1bmN0aW9uIGVsZW1lbnRzLgorCSAgVGhlIG5hbWUgc3ViZWxlbWVudHMgb2YgdGhlc2UgZWxlbWVudHMgbXVzdCBlYWNoIGJlIHVuaXF1ZS4KKworCTwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpmdW5jdGlvbiIvPgorICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpuYW1lIi8+CisgICAgPC94c2Q6dW5pcXVlPgorCisgIDwveHNkOmVsZW1lbnQ+CisKKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYm9keS1jb250ZW50VHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBib2R5IHRoYXQgaXMgdmFsaWQgZm9yIGEgdGFnLgorCVRoaXMgdmFsdWUgaXMgdXNlZCBieSB0aGUgSlNQIGNvbnRhaW5lciB0byB2YWxpZGF0ZQorCXRoYXQgYSB0YWcgaW52b2NhdGlvbiBoYXMgdGhlIGNvcnJlY3QgYm9keSBzeW50YXggYW5kCisJYnkgcGFnZSBjb21wb3NpdGlvbiB0b29scyB0byBhc3Npc3QgdGhlIHBhZ2UgYXV0aG9yCisJaW4gcHJvdmlkaW5nIGEgdmFsaWQgdGFnIGJvZHkuCisKKwlUaGVyZSBhcmUgY3VycmVudGx5IGZvdXIgdmFsdWVzIHNwZWNpZmllZDoKKworCXRhZ2RlcGVuZGVudCAgICBUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcKKwkJCWltcGxlbWVudGF0aW9uIGl0c2VsZiwgYW5kIGlzIG1vc3QgbGlrZWx5CisJCQlpbiBhIGRpZmZlcmVudCAibGFuZ3VhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMCisJCQlzdGF0ZW1lbnRzLgorCisJSlNQICAgICAgICAgICAgIFRoZSBib2R5IG9mIHRoZSB0YWcgY29udGFpbnMgbmVzdGVkIEpTUAorCQkJc3ludGF4LgorCisJZW1wdHkgICAgICAgICAgIFRoZSBib2R5IG11c3QgYmUgZW1wdHkKKworCXNjcmlwdGxlc3MgICAgICBUaGUgYm9keSBhY2NlcHRzIG9ubHkgdGVtcGxhdGUgdGV4dCwgRUwKKwkJCUV4cHJlc3Npb25zLCBhbmQgSlNQIGFjdGlvbiBlbGVtZW50cy4gIE5vCisJCQlzY3JpcHRpbmcgZWxlbWVudHMgYXJlIGFsbG93ZWQuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRhZ2RlcGVuZGVudCIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpTUCIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVtcHR5Ii8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2NyaXB0bGVzcyIvPgorICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV4dGVuc2libGVUeXBlIiBhYnN0cmFjdD0idHJ1ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGV4dGVuc2libGVUeXBlIGlzIGFuIGFic3RyYWN0IGJhc2UgdHlwZSB0aGF0IGlzIHVzZWQgdG8KKwlkZWZpbmUgdGhlIHR5cGUgb2YgZXh0ZW5zaW9uLWVsZW1lbnRzLiBJbnN0YW5jZSBkb2N1bWVudHMKKwltdXN0IHN1YnN0aXR1dGUgYSBrbm93biB0eXBlIHRvIGRlZmluZSB0aGUgZXh0ZW5zaW9uIGJ5CisJdXNpbmcgeHNpOnR5cGUgYXR0cmlidXRlIHRvIGRlZmluZSB0aGUgYWN0dWFsIHR5cGUgb2YKKwlleHRlbnNpb24tZWxlbWVudHMuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmdW5jdGlvblR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBmdW5jdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBlYWNoCisJZnVuY3Rpb24gaW4gdGhlIHRhZyBsaWJyYXJ5IHRoYXQgaXMgdG8gYmUgZXhwb3NlZCB0byB0aGUgRUwuCisKKwlUaGUgZnVuY3Rpb24gZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzIGRlZmluaW5nOgorCisJZGVzY3JpcHRpb24gICAgICAgICBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KKworCWRpc3BsYXktbmFtZSAgICAgICAgQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKKwkJCSAgICBkaXNwbGF5ZWQgYnkgdG9vbHMKKworCWljb24gICAgICAgICAgICAgICAgT3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQKKwkJCSAgICBieSB0b29scworCisJbmFtZSAgICAgICAgICAgICAgICBBIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uCisKKwlmdW5jdGlvbi1jbGFzcyAgICAgIFByb3ZpZGVzIHRoZSBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQKKwkJCSAgICBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbgorCisJZnVuY3Rpb24tc2lnbmF0dXJlICBQcm92aWRlcyB0aGUgc2lnbmF0dXJlLCBhcyBpbiB0aGUgSmF2YQorCQkJICAgIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIG9mIHRoZSBKYXZhCisJCQkgICAgbWV0aG9kIHRoYXQgaXMgdG8gYmUgdXNlZCB0byBpbXBsZW1lbnQKKwkJCSAgICB0aGUgZnVuY3Rpb24uCisKKwlleGFtcGxlICAgICAgICAgICAgIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuCisJCQkgICAgZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIGZ1bmN0aW9uCisKKwlmdW5jdGlvbi1leHRlbnNpb24gIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQorCQkJICAgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZnVuY3Rpb24sIGZvciB0b29sCisJCQkgICAgY29uc3VtcHRpb24KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgorCQkgICB0eXBlPSJqMmVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBBIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLWNsYXNzIgorCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBQcm92aWRlcyB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIEphdmEKKwkgICAgY2xhc3MgY29udGFpbmluZyB0aGUgc3RhdGljIG1ldGhvZCB0aGF0IGltcGxlbWVudHMKKwkgICAgdGhlIGZ1bmN0aW9uLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisKKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tc2lnbmF0dXJlIgorCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIG9mIHRoZSBzdGF0aWMgSmF2YSBtZXRob2QgdGhhdCBpcworCSAgICB0byBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb24uICBUaGUgc3ludGF4IG9mIHRoZQorCSAgICBmdW5jdGlvbi1zaWduYXR1cmUgZWxlbWVudCBpcyBhcyBmb2xsb3dzOgorCisJCUZ1bmN0aW9uU2lnbmF0dXJlIDo6PSBSZXR1cm5UeXBlIFMgTWV0aG9kTmFtZSBTPworCQkJCSAgICAgICcoJyBTPyBQYXJhbWV0ZXJzPyBTPyAnKScKKworICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgICAgIDo6PSBUeXBlCisKKwkJTWV0aG9kTmFtZSAgICAgICAgOjo9IElkZW50aWZpZXIKKworCQlQYXJhbWV0ZXJzICAgICAgICA6Oj0gICBQYXJhbWV0ZXIKKwkJCQkgICAgICB8ICggUGFyYW1ldGVyIFM/ICcsJyBTPyBQYXJhbWV0ZXJzICkKKworICAgICAgICAgICAgICAgIFBhcmFtZXRlciAgICAgICAgIDo6PSBUeXBlCisKKwkJV2hlcmU6CisKKyAJCSAgICAqIFR5cGUgaXMgYSBiYXNpYyB0eXBlIG9yIGEgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQorCQkgICAgICAoaW5jbHVkaW5nIHBhY2thZ2UgbmFtZSksIGFzIHBlciB0aGUgJ1R5cGUnIHByb2R1Y3Rpb24KKwkJICAgICAgaW4gdGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgU2Vjb25kIEVkaXRpb24sCisJCSAgICAgIENoYXB0ZXIgMTguCisKKyAgICAgICAgICAgICAgICAgICAgKiBJZGVudGlmaWVyIGlzIGEgSmF2YSBpZGVudGlmaWVyLCBhcyBwZXIgdGhlICdJZGVudGlmaWVyJworCQkgICAgICBwcm9kdWN0aW9uIGluIHRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIFNlY29uZAorCQkgICAgICBFZGl0aW9uLCBDaGFwdGVyIDE4LgorCisJICAgIEV4YW1wbGU6CisKKwkgICAgamF2YS5sYW5nLlN0cmluZyBuaWNrTmFtZSggamF2YS5sYW5nLlN0cmluZywgaW50ICkKKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorCisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4YW1wbGUiCisJCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbgorCSAgICBvZiBhbiBleGFtcGxlIG9mIHRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbi4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorCisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLWV4dGVuc2lvbiIKKwkJICAgdHlwZT0iajJlZTp0bGQtZXh0ZW5zaW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIEZ1bmN0aW9uIGV4dGVuc2lvbnMgYXJlIGZvciB0b29sIHVzZSBvbmx5IGFuZCBtdXN0IG5vdCBhZmZlY3QKKwkgICAgdGhlIGJlaGF2aW9yIG9mIGEgY29udGFpbmVyLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhZ0ZpbGVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlEZWZpbmVzIGFuIGFjdGlvbiBpbiB0aGlzIHRhZyBsaWJyYXJ5IHRoYXQgaXMgaW1wbGVtZW50ZWQKKwlhcyBhIC50YWcgZmlsZS4KKworCVRoZSB0YWctZmlsZSBlbGVtZW50IGhhcyB0d28gcmVxdWlyZWQgc3ViZWxlbWVudHM6CisKKwlkZXNjcmlwdGlvbiAgICAgICBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KKworCWRpc3BsYXktbmFtZSAgICAgIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCisJCQkgIGRpc3BsYXllZCBieSB0b29scworCisJaWNvbiAgICAgICAgICAgICAgT3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQKKwkJCSAgYnkgdG9vbHMKKworCW5hbWUgICAgICAgICAgICAgIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUKKworCXBhdGggICAgICAgICAgICAgIFdoZXJlIHRvIGZpbmQgdGhlIC50YWcgZmlsZSBpbXBsZW1lbnRpbmcgdGhpcworCQkJICBhY3Rpb24sIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIKKwkJCSAgYXBwbGljYXRpb24gb3IgdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlIGZvciBhCisJCQkgIHRhZyBsaWJyYXJ5IHBhY2thZ2VkIGluIGEgSkFSLiAgVGhpcyBtdXN0CisJCQkgIGJlZ2luIHdpdGggL1dFQi1JTkYvdGFncyBpZiB0aGUgLnRhZyBmaWxlCisJCQkgIHJlc2lkZXMgaW4gdGhlIFdBUiwgb3IgL01FVEEtSU5GL3RhZ3MgaWYgdGhlCisJCQkgIC50YWcgZmlsZSByZXNpZGVzIGluIGEgSkFSLgorCisJZXhhbXBsZSAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4KKwkJCSAgZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIHRhZworCisJdGFnLWV4dGVuc2lvbiAgICAgWmVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCisJCQkgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnLCBmb3IgdG9vbAorCQkJICBjb25zdW1wdGlvbgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCisJCSAgIHR5cGU9ImoyZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhdGgiCisJCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGFtcGxlIgorCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24KKwkgICAgb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIGEgdGFnLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisKKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLWV4dGVuc2lvbiIKKwkJICAgdHlwZT0iajJlZTp0bGQtZXh0ZW5zaW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRhZyBleHRlbnNpb25zIGFyZSBmb3IgdG9vbCB1c2Ugb25seSBhbmQgbXVzdCBub3QgYWZmZWN0CisJICAgIHRoZSBiZWhhdmlvciBvZiBhIGNvbnRhaW5lci4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWdUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgdGFnIGRlZmluZXMgYSB1bmlxdWUgdGFnIGluIHRoaXMgdGFnIGxpYnJhcnkuICBJdCBoYXMgb25lCisJYXR0cmlidXRlLCBpZC4KKworCVRoZSB0YWcgZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzIGRlZmluaW5nOgorCisJZGVzY3JpcHRpb24gICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCisKKwlkaXNwbGF5LW5hbWUgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQorCQkJICBkaXNwbGF5ZWQgYnkgdG9vbHMKKworCWljb24gICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkCisJCQkgIGJ5IHRvb2xzCisKKwluYW1lICAgICAgICAgICAgICBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lCisKKwl0YWctY2xhc3MgICAgICAgICBUaGUgdGFnIGhhbmRsZXIgY2xhc3MgaW1wbGVtZW50aW5nCisJCQkgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BUYWcKKworCXRlaS1jbGFzcyAgICAgICAgIEFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mCisJCQkgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KKworCWJvZHktY29udGVudCAgICAgIFRoZSBib2R5IGNvbnRlbnQgdHlwZQorCisJdmFyaWFibGUgICAgICAgICAgT3B0aW9uYWwgc2NyaXB0aW5nIHZhcmlhYmxlIGluZm9ybWF0aW9uCisKKwlhdHRyaWJ1dGUgICAgICAgICBBbGwgYXR0cmlidXRlcyBvZiB0aGlzIGFjdGlvbiB0aGF0IGFyZQorCQkJICBldmFsdWF0ZWQgcHJpb3IgdG8gaW52b2NhdGlvbi4KKworCWR5bmFtaWMtYXR0cmlidXRlcyBXaGV0aGVyIHRoaXMgdGFnIHN1cHBvcnRzIGFkZGl0aW9uYWwKKwkJCSAgIGF0dHJpYnV0ZXMgd2l0aCBkeW5hbWljIG5hbWVzLiAgSWYKKwkJCSAgIHRydWUsIHRoZSB0YWctY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlCisJCQkgICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuRHluYW1pY0F0dHJpYnV0ZXMKKwkJCSAgIGludGVyZmFjZS4gIERlZmF1bHRzIHRvIGZhbHNlLgorCisJZXhhbXBsZSAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4KKwkJCSAgZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIHRhZworCisJdGFnLWV4dGVuc2lvbiAgICAgWmVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCisJCQkgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnLCBmb3IgdG9vbAorCQkJICBjb25zdW1wdGlvbgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCisJCSAgIHR5cGU9ImoyZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1jbGFzcyIKKwkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VybHZldC5qc3AudGFnZXh0LkpzcFRhZworCSAgICB0aGF0IGltcGxlbWVudHMgdGhlIHJlcXVlc3QgdGltZSBzZW1hbnRpY3MgZm9yCisJICAgIHRoaXMgdGFnLiAocmVxdWlyZWQpCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKworICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZWktY2xhc3MiCisJCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbworCSAgICBmb3IgdGhpcyB0YWcuIChvcHRpb25hbCkKKworCSAgICBJZiB0aGlzIGlzIG5vdCBnaXZlbiwgdGhlIGNsYXNzIGlzIG5vdCBjb25zdWx0ZWQgYXQKKwkgICAgdHJhbnNsYXRpb24gdGltZS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJib2R5LWNvbnRlbnQiCisJCSAgIHR5cGU9ImoyZWU6Ym9keS1jb250ZW50VHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFNwZWNpZmllcyB0aGUgZm9ybWF0IGZvciB0aGUgYm9keSBvZiB0aGlzIHRhZy4KKwkgICAgVGhlIGRlZmF1bHQgaW4gSlNQIDEuMiB3YXMgIkpTUCIgYnV0IGJlY2F1c2UgdGhpcworCSAgICBpcyBhbiBpbnZhbGlkIHNldHRpbmcgZm9yIHNpbXBsZSB0YWcgaGFuZGxlcnMsIHRoZXJlCisJICAgIGlzIG5vIGxvbmdlciBhIGRlZmF1bHQgaW4gSlNQIDIuMC4gIEEgcmVhc29uYWJsZQorCSAgICBkZWZhdWx0IGZvciBzaW1wbGUgdGFnIGhhbmRsZXJzIGlzICJzY3JpcHRsZXNzIiBpZgorCSAgICB0aGUgdGFnIGNhbiBoYXZlIGEgYm9keS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZSIKKwkJICAgdHlwZT0iajJlZTp2YXJpYWJsZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCisJCSAgIHR5cGU9ImoyZWU6dGxkLWF0dHJpYnV0ZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkeW5hbWljLWF0dHJpYnV0ZXMiCisJCSAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhhbXBsZSIKKwkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uCisJICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiBhIHRhZy4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorCisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1leHRlbnNpb24iCisJCSAgIHR5cGU9ImoyZWU6dGxkLWV4dGVuc2lvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUYWcgZXh0ZW5zaW9ucyBhcmUgZm9yIHRvb2wgdXNlIG9ubHkgYW5kIG11c3Qgbm90IGFmZmVjdAorCSAgICB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkLWF0dHJpYnV0ZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBhdHRyaWJ1dGUgZWxlbWVudCBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcKKwl0YWcuICBUaGUgYXR0cmlidXRyZSBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMKKwlkZWZpbmluZzoKKworCWRlc2NyaXB0aW9uICAgICBhIGRlc2NyaXB0aW9uIG9mIHRoZSBhdHRyaWJ1dGUKKworCW5hbWUgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisKKwlyZXF1aXJlZCAgICAgICAgd2hldGhlciB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yCisJCQlvcHRpb25hbAorCisJcnRleHBydmFsdWUgICAgIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyBhIHJ1bnRpbWUgYXR0cmlidXRlCisKKwl0eXBlICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMKKworCWZyYWdtZW50ICAgICAgICB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIGlzIGEgZnJhZ21lbnQKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKKwkJICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWlyZWQiCisJCSAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3IKKwkgICAgb3B0aW9uYWwuCisKKwkgICAgSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUKKwkgICAgdGhlIGF0dHJpYnV0ZSBpcyBvcHRpb25hbC4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgPHhzZDpjaG9pY2U+CisJPHhzZDpzZXF1ZW5jZT4KKwkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJydGV4cHJ2YWx1ZSIKKwkJICAgICAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKKwkJICAgICAgIG1pbk9jY3Vycz0iMCI+CisJICAgIDx4c2Q6YW5ub3RhdGlvbj4KKwkgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkJRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgY2FuIGhhdmUgc2NyaXB0bGV0CisJCWV4cHJlc3Npb25zIGFzIGEgdmFsdWUsIGkuZSB0aGUgdmFsdWUgb2YgdGhlCisJCWF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBhdCByZXF1ZXN0CisJCXRpbWUsIGFzIG9wcG9zZWQgdG8gYSBzdGF0aWMgdmFsdWUgZGV0ZXJtaW5lZCBhdAorCQl0cmFuc2xhdGlvbiB0aW1lLgorCisJCUlmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZQorCQlhdHRyaWJ1dGUgaGFzIGEgc3RhdGljIHZhbHVlCisKKwkgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgICA8L3hzZDphbm5vdGF0aW9uPgorCisJICA8L3hzZDplbGVtZW50PgorCSAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUiCisJCSAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCisJCSAgICAgICBtaW5PY2N1cnM9IjAiPgorCSAgICA8eHNkOmFubm90YXRpb24+CisJICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJCURlZmluZXMgdGhlIEphdmEgdHlwZSBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZS4gIEZvcgorCQlzdGF0aWMgdmFsdWVzICh0aG9zZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9uIHRpbWUpCisJCXRoZSB0eXBlIGlzIGFsd2F5cyBqYXZhLmxhbmcuU3RyaW5nLgorCisJICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgICAgPC94c2Q6YW5ub3RhdGlvbj4KKwkgIDwveHNkOmVsZW1lbnQ+CisJPC94c2Q6c2VxdWVuY2U+CisJPHhzZDplbGVtZW50IG5hbWU9ImZyYWdtZW50IgorCQkgICAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKKwkJICAgICBtaW5PY2N1cnM9IjAiPgorCSAgPHhzZDphbm5vdGF0aW9uPgorCSAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgICAidHJ1ZSIgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgb2YgdHlwZQorCSAgICAgIGphdmF4LmpzcC50YWdleHQuSnNwRnJhZ21lbnQsIHJlcHJlc2VudGluZyBkeW5hbWljCisJICAgICAgY29udGVudCB0aGF0IGNhbiBiZSByZS1ldmFsdWF0ZWQgYXMgbWFueSB0aW1lcworCSAgICAgIGFzIG5lZWRlZCBieSB0aGUgdGFnIGhhbmRsZXIuICBJZiBvbWl0dGVkIG9yICJmYWxzZSIsCisJICAgICAgdGhlIGRlZmF1bHQgaXMgc3RpbGwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKworCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgPC94c2Q6YW5ub3RhdGlvbj4KKwk8L3hzZDplbGVtZW50PgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1jYW5vbmljYWwtbmFtZVR5cGUiPgorCisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJRGVmaW5lcyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYSB0YWcgb3IgYXR0cmlidXRlIGJlaW5nCisJZGVmaW5lZC4KKworCVRoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnhzZE5NVE9LRU5UeXBlIi8+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1leHRlbnNpb25UeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgdGxkLWV4dGVuc2lvblR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZQorCWV4dGVuc2lvbnMgdG8gYSBzcGVjaWZpYyBUTEQgZWxlbWVudC4KKworCUl0IGlzIHVzZWQgYnkgZWxlbWVudHMgdG8gZGVzaWduYXRlIGFuIGV4dGVuc2lvbiBibG9jaworCXRoYXQgaXMgdGFyZ2V0ZWQgdG8gYSBzcGVjaWZpYyBleHRlbnNpb24gZGVzaWduYXRlZCBieQorCWEgc2V0IG9mIGV4dGVuc2lvbiBlbGVtZW50cyB0aGF0IGFyZSBkZWNsYXJlZCBieSBhCisJbmFtZXNwYWNlLiBUaGUgbmFtZXNwYWNlIGlkZW50aWZpZXMgdGhlIGV4dGVuc2lvbiB0bworCXRoZSB0b29sIHRoYXQgcHJvY2Vzc2VzIHRoZSBleHRlbnNpb24uCisKKwlUaGUgdHlwZSBvZiB0aGUgZXh0ZW5zaW9uLWVsZW1lbnQgaXMgYWJzdHJhY3QuIFRoZXJlZm9yZSwKKwlhIGNvbmNyZXRlIHR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgYnkgdGhlIFRMRCB1c2luZworCXhzaTp0eXBlIGF0dHJpYnV0ZSBmb3IgZWFjaCBleHRlbnNpb24tZWxlbWVudC4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24tZWxlbWVudCIKKwkJICAgdHlwZT0iajJlZTpleHRlbnNpYmxlVHlwZSIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKworICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIKKwkJICAgdXNlPSJyZXF1aXJlZCIKKwkJICAgdHlwZT0ieHNkOmFueVVSSSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKworICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkVGFnbGliVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QsIGl0IGRlZmluZXM6CisKKwlkZXNjcmlwdGlvbiAgICAgYSBzaW1wbGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlICJ1c2UiIG9mIHRoaXMgdGFnbGliLAorCQkJc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUKKworCWRpc3BsYXktbmFtZSAgICB0aGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYQorCQkJc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZAorCQkJYnkgdG9vbHMKKworCWljb24gICAgICAgICAgICBvcHRpb25hbCBpY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKKworCXRsaWItdmVyc2lvbiAgICB0aGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KKworCXNob3J0LW5hbWUgICAgICBhIHNpbXBsZSBkZWZhdWx0IHNob3J0IG5hbWUgdGhhdCBjb3VsZCBiZQorCQkJdXNlZCBieSBhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUKKwkJCW5hbWVzIHdpdGggYSBtbmVtb25pYyB2YWx1ZTsgZm9yIGV4YW1wbGUsCisJCQl0aGUgaXQgbWF5IGJlIHVzZWQgYXMgdGhlIHByZWZlcmVkIHByZWZpeAorCQkJdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMKKworCXVyaSAgICAgICAgICAgICBhIHVyaSB1bmlxdWVseSBpZGVudGlmeWluZyB0aGlzIHRhZ2xpYgorCisJdmFsaWRhdG9yICAgICAgIG9wdGlvbmFsIFRhZ0xpYnJhcnlWYWxpZGF0b3IgaW5mb3JtYXRpb24KKworCWxpc3RlbmVyICAgICAgICBvcHRpb25hbCBldmVudCBsaXN0ZW5lciBzcGVjaWZpY2F0aW9uCisKKwl0YWcgICAgICAgICAgICAgdGFncyBpbiB0aGlzIHRhZyBsaWJyYXJ5CisKKwl0YWctZmlsZSAgICAgICAgdGFnIGZpbGVzIGluIHRoaXMgdGFnIGxpYnJhcnkKKworCWZ1bmN0aW9uICAgICAgICB6ZXJvIG9yIG1vcmUgRUwgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcworCQkJdGFnIGxpYnJhcnkKKworCXRhZ2xpYi1leHRlbnNpb24gemVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCisJCQlpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZ2xpYiwgZm9yIHRvb2wKKwkJCWNvbnN1bXB0aW9uCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRsaWItdmVyc2lvbiIKKwkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlc2NyaWJlcyB0aGlzIHZlcnNpb24gKG51bWJlcikgb2YgdGhlIHRhZ2xpYnJhcnkuCisJICAgIEl0IGlzIGRlc2NyaWJlZCBhcyBhIGRld2V5IGRlY2ltYWwuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKworICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNob3J0LW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgYSBzaW1wbGUgZGVmYXVsdCBuYW1lIHRoYXQgY291bGQgYmUgdXNlZCBieQorCSAgICBhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUgbmFtZXMgd2l0aCBhCisJICAgIG1uZW1vbmljdmFsdWU7IGZvciBleGFtcGxlLCBpdCBtYXkgYmUgdXNlZCBhcyB0aGUKKwkgICAgcHJlZmVycmVkIHByZWZpeCB2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcy4gIERvCisJICAgIG5vdCB1c2Ugd2hpdGUgc3BhY2UsIGFuZCBkbyBub3Qgc3RhcnQgd2l0aCBkaWdpdHMKKwkgICAgb3IgdW5kZXJzY29yZS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorCisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVyaSIKKwkJICAgdHlwZT0iajJlZTp4c2RBbnlVUklUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBEZWZpbmVzIGEgcHVibGljIFVSSSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcworCSAgICB2ZXJzaW9uIG9mIHRoZSB0YWdsaWJyYXJ5LiAgTGVhdmUgaXQgZW1wdHkgaWYgaXQKKwkgICAgZG9lcyBub3QgYXBwbHkuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKworICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3IiCisJCSAgIHR5cGU9ImoyZWU6dmFsaWRhdG9yVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdGVuZXIiCisJCSAgIHR5cGU9ImoyZWU6bGlzdGVuZXJUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnIgorCQkgICB0eXBlPSJqMmVlOnRhZ1R5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctZmlsZSIKKwkJICAgdHlwZT0iajJlZTp0YWdGaWxlVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uIgorCQkgICB0eXBlPSJqMmVlOmZ1bmN0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi1leHRlbnNpb24iCisJCSAgIHR5cGU9ImoyZWU6dGxkLWV4dGVuc2lvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUYWdsaWIgZXh0ZW5zaW9ucyBhcmUgZm9yIHRvb2wgdXNlIG9ubHkgYW5kIG11c3Qgbm90IGFmZmVjdAorCSAgICB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKKwkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSIKKwkJICAgZml4ZWQ9IjIuMCIKKwkJICAgdXNlPSJyZXF1aXJlZCI+CisgICAgICA8eHNkOmFubm90YXRpb24+CisJPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICBEZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnbGlicmFyeQorCSAgcmVxdWlyZXMgaW4gb3JkZXIgdG8gZnVuY3Rpb24gKGRld2V5IGRlY2ltYWwpCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDwveHNkOmF0dHJpYnV0ZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWxpZGF0b3JUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlBIHZhbGlkYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlCisJdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeSBpcworCWRlZmluZWQgYnkgYSB2YWxpZGF0b3JUeXBlLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRvci1jbGFzcyIKKwkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgRGVmaW5lcyB0aGUgVGFnTGlicmFyeVZhbGlkYXRvciBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkCisJICAgIHRvIHZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMKKwkgICAgdGFnIGxpYnJhcnkuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKKwkJICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzIGFuCisJICAgIGluaXRpYWxpemF0aW9uIHBhcmFtLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisKKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1zY29wZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoaXMgdHlwZSBkZWZpbmVzIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuICBTZWUKKwlUYWdFeHRyYUluZm8gZm9yIGRldGFpbHMuICBUaGUgYWxsb3dlZCB2YWx1ZXMgYXJlLAorCSJORVNURUQiLCAiQVRfQkVHSU4iIGFuZCAiQVRfRU5EIi4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkVTVEVEIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRfQkVHSU4iLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVF9FTkQiLz4KKyAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSB2YXJpYWJsZVR5cGUgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZworCXZhcmlhYmxlcyBkZWZpbmVkIGJ5IHVzaW5nIHRoaXMgdGFnLiAgSXQgaXMgYSAodHJhbnNsYXRpb24KKwl0aW1lKSBlcnJvciBmb3IgYSB0YWcgdGhhdCBoYXMgb25lIG9yIG1vcmUgdmFyaWFibGUKKwlzdWJlbGVtZW50cyB0byBoYXZlIGEgVGFnRXh0cmFJbmZvIGNsYXNzIHRoYXQgcmV0dXJucyBhCisJbm9uLW51bGwgdmFsdWUgZnJvbSBhIGNhbGwgdG8gZ2V0VmFyaWFibGVJbmZvKCkuCisKKwlUaGUgc3ViZWxlbWVudHMgb2YgdmFyaWFibGVUeXBlIGFyZSBvZiB0aGUgZm9ybToKKworCWRlc2NyaXB0aW9uICAgICAgICAgICAgICBPcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGlzCisJCQkJIHZhcmlhYmxlCisKKwluYW1lLWdpdmVuICAgICAgICAgICAgICAgVGhlIHZhcmlhYmxlIG5hbWUgYXMgYSBjb25zdGFudAorCisJbmFtZS1mcm9tLWF0dHJpYnV0ZSAgICAgIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZQorCQkJCSAodHJhbnNsYXRpb24gdGltZSkgdmFsdWUgd2lsbAorCQkJCSBnaXZlIHRoZSBuYW1lIG9mIHRoZQorCQkJCSB2YXJpYWJsZS4gIE9uZSBvZiBuYW1lLWdpdmVuIG9yCisJCQkJIG5hbWUtZnJvbS1hdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCisKKwl2YXJpYWJsZS1jbGFzcyAgICAgICAgICAgTmFtZSBvZiB0aGUgY2xhc3Mgb2YgdGhlIHZhcmlhYmxlLgorCQkJCSBqYXZhLmxhbmcuU3RyaW5nIGlzIGRlZmF1bHQuCisKKwlkZWNsYXJlICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQKKwkJCQkgb3Igbm90LiAgVHJ1ZSBpcyB0aGUgZGVmYXVsdC4KKworCXNjb3BlICAgICAgICAgICAgICAgICAgICBUaGUgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJhaWJsZQorCQkJCSBkZWZpbmVkLiAgTkVTVEVEIGlzIGRlZmF1bHQuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmNob2ljZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1naXZlbiIKKwkJICAgICB0eXBlPSJqMmVlOmphdmEtaWRlbnRpZmllclR5cGUiPgorCSAgPHhzZDphbm5vdGF0aW9uPgorCSAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgICBUaGUgbmFtZSBmb3IgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4KKworCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgPC94c2Q6YW5ub3RhdGlvbj4KKwk8L3hzZDplbGVtZW50PgorCisJPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZnJvbS1hdHRyaWJ1dGUiCisJCSAgICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KKwkgIDx4c2Q6YW5ub3RhdGlvbj4KKwkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgICAgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlCisJICAgICAgKHRyYW5zbGF0aW9uLXRpbWUpIHZhbHVlIHdpbGwgZ2l2ZSB0aGUgbmFtZSBvZgorCSAgICAgIHRoZSB2YXJpYWJsZS4KKworCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgPC94c2Q6YW5ub3RhdGlvbj4KKwk8L3hzZDplbGVtZW50PgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLWNsYXNzIgorCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBvcHRpb25hbCBuYW1lIG9mIHRoZSBjbGFzcyBmb3IgdGhlIHNjcmlwdGluZworCSAgICB2YXJpYWJsZS4gIFRoZSBkZWZhdWx0IGlzIGphdmEubGFuZy5TdHJpbmcuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKworICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlY2xhcmUiCisJCSAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKworCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBXaGV0aGVyIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgaXMgdG8gYmUgZGVmaW5lZAorCSAgICBvciBub3QuICBTZWUgVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLiAgVGhpcworCSAgICBlbGVtZW50IGlzIG9wdGlvbmFsIGFuZCAidHJ1ZSIgaXMgdGhlIGRlZmF1bHQuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NvcGUiCisJCSAgIHR5cGU9ImoyZWU6dmFyaWFibGUtc2NvcGVUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgIk5FU1RFRCIgaXMgdGhlIGRlZmF1bHQuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPC94c2Q6c2NoZW1hPgorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL3htbC54c2QgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL3htbC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4NjZiNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQveG1sLnhzZApAQCAtMCwwICsxLDk3IEBACis8P3htbCB2ZXJzaW9uPScxLjAnPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIHhzOnNjaGVtYSBQVUJMSUMgIi0vL1czQy8vRFREIFhNTFNDSEVNQSAyMDAxMDIvL0VOIiAiWE1MU2NoZW1hLmR0ZCIgPgorPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWw6bGFuZz0iZW4iPgorCisgPHhzOmFubm90YXRpb24+CisgIDx4czpkb2N1bWVudGF0aW9uPgorICAgU2VlIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS5odG1sIGFuZAorICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBuYW1lc3BhY2UuCisgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyA8L3hzOmFubm90YXRpb24+CisKKyA8eHM6YW5ub3RhdGlvbj4KKyAgPHhzOmRvY3VtZW50YXRpb24+VGhpcyBzY2hlbWEgZGVmaW5lcyBhdHRyaWJ1dGVzIGFuZCBhbiBhdHRyaWJ1dGUgZ3JvdXAKKyAgICAgICAgc3VpdGFibGUgZm9yIHVzZSBieQorICAgICAgICBzY2hlbWFzIHdpc2hpbmcgdG8gYWxsb3cgeG1sOmJhc2UsIHhtbDpsYW5nIG9yIHhtbDpzcGFjZSBhdHRyaWJ1dGVzCisgICAgICAgIG9uIGVsZW1lbnRzIHRoZXkgZGVmaW5lLgorCisgICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hCisgICAgICAgIGZvciB0aGUgWE1MIG5hbWVzcGFjZSwgZS5nLiBhcyBmb2xsb3dzOgorICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuPgorICAgICAgICAgLiAuIC4KKyAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCisgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2QiLz4KKworICAgICAgICBTdWJzZXF1ZW50bHksIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBhdHRyaWJ1dGVzCisgICAgICAgIG9yIHRoZSBncm91cCBkZWZpbmVkIGJlbG93IHdpbGwgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QsIGUuZy4KKworICAgICAgICAmbHQ7dHlwZSAuIC4gLj4KKyAgICAgICAgIC4gLiAuCisgICAgICAgICAmbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJ4bWw6c3BlY2lhbEF0dHJzIi8+CisgCisgICAgICAgICB3aWxsIGRlZmluZSBhIHR5cGUgd2hpY2ggd2lsbCBzY2hlbWEtdmFsaWRhdGUgYW4gaW5zdGFuY2UKKyAgICAgICAgIGVsZW1lbnQgd2l0aCBhbnkgb2YgdGhvc2UgYXR0cmlidXRlczwveHM6ZG9jdW1lbnRhdGlvbj4KKyA8L3hzOmFubm90YXRpb24+CisKKyA8eHM6YW5ub3RhdGlvbj4KKyAgPHhzOmRvY3VtZW50YXRpb24+SW4ga2VlcGluZyB3aXRoIHRoZSBYTUwgU2NoZW1hIFdHJ3Mgc3RhbmRhcmQgdmVyc2lvbmluZworICAgcG9saWN5LCB0aGlzIHNjaGVtYSBkb2N1bWVudCB3aWxsIHBlcnNpc3QgYXQKKyAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZC4KKyAgIEF0IHRoZSBkYXRlIG9mIGlzc3VlIGl0IGNhbiBhbHNvIGJlIGZvdW5kIGF0CisgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QuCisgICBUaGUgc2NoZW1hIGRvY3VtZW50IGF0IHRoYXQgVVJJIG1heSBob3dldmVyIGNoYW5nZSBpbiB0aGUgZnV0dXJlLAorICAgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgWE1MIFNjaGVtYQorICAgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZSBjaGFuZ2VzLCB0aGUgdmVyc2lvbgorICAgb2YgdGhpcyBkb2N1bWVudCBhdAorICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIHdpbGwgY2hhbmdlCisgICBhY2NvcmRpbmdseTsgdGhlIHZlcnNpb24gYXQKKyAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZCB3aWxsIG5vdCBjaGFuZ2UuCisgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyA8L3hzOmFubm90YXRpb24+CisKKyA8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzOmxhbmd1YWdlIj4KKyAgPHhzOmFubm90YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbj5JbiBkdWUgY291cnNlLCB3ZSBzaG91bGQgaW5zdGFsbCB0aGUgcmVsZXZhbnQgSVNPIDItIGFuZCAzLWxldHRlcgorICAgICAgICAgY29kZXMgYXMgdGhlIGVudW1lcmF0ZWQgcG9zc2libGUgdmFsdWVzIC4gLiAuPC94czpkb2N1bWVudGF0aW9uPgorICA8L3hzOmFubm90YXRpb24+CisgPC94czphdHRyaWJ1dGU+CisKKyA8eHM6YXR0cmlidXRlIG5hbWU9InNwYWNlIiBkZWZhdWx0PSJwcmVzZXJ2ZSI+CisgIDx4czpzaW1wbGVUeXBlPgorICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5DTmFtZSI+CisgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkZWZhdWx0Ii8+CisgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcmVzZXJ2ZSIvPgorICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorIDwveHM6YXR0cmlidXRlPgorCisgPHhzOmF0dHJpYnV0ZSBuYW1lPSJiYXNlIiB0eXBlPSJ4czphbnlVUkkiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uPlNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi94bWxiYXNlLyBmb3IKKyAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXR0cmlidXRlLjwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgPC94czphbm5vdGF0aW9uPgorIDwveHM6YXR0cmlidXRlPgorCisgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9InNwZWNpYWxBdHRycyI+CisgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6YmFzZSIvPgorICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KKyAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpzcGFjZSIvPgorIDwveHM6YXR0cmlidXRlR3JvdXA+CisKKzwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvRmlsdGVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9GaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWVhZTAzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvRmlsdGVyLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisJLyoqIAorCSogQSBmaWx0ZXIgaXMgYW4gb2JqZWN0IHRoYXQgcGVyZm9ybXMgZmlsdGVyaW5nIHRhc2tzIG9uIGVpdGhlciB0aGUgcmVxdWVzdCB0byBhIHJlc291cmNlIChhIHNlcnZsZXQgb3Igc3RhdGljIGNvbnRlbnQpLCBvciBvbiB0aGUgcmVzcG9uc2UgZnJvbSBhIHJlc291cmNlLCBvciBib3RoLgorICAgICAgICAqIDxicj48YnI+CisJKiBGaWx0ZXJzIHBlcmZvcm0gZmlsdGVyaW5nIGluIHRoZSA8Y29kZT5kb0ZpbHRlcjwvY29kZT4gbWV0aG9kLiBFdmVyeSBGaWx0ZXIgaGFzIGFjY2VzcyB0byAKKwkqKiBhIEZpbHRlckNvbmZpZyBvYmplY3QgZnJvbSB3aGljaCBpdCBjYW4gb2J0YWluIGl0cyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLCBhCisJKiogcmVmZXJlbmNlIHRvIHRoZSBTZXJ2bGV0Q29udGV4dCB3aGljaCBpdCBjYW4gdXNlLCBmb3IgZXhhbXBsZSwgdG8gbG9hZCByZXNvdXJjZXMKKwkqKiBuZWVkZWQgZm9yIGZpbHRlcmluZyB0YXNrcy4KKwkqKiA8cD4KKwkqKiBGaWx0ZXJzIGFyZSBjb25maWd1cmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb2YgYSB3ZWIgYXBwbGljYXRpb24KKwkqKiA8cD4KKwkqKiBFeGFtcGxlcyB0aGF0IGhhdmUgYmVlbiBpZGVudGlmaWVkIGZvciB0aGlzIGRlc2lnbiBhcmU8YnI+CisJKiogMSkgQXV0aGVudGljYXRpb24gRmlsdGVycyA8YnI+CisJKiogMikgTG9nZ2luZyBhbmQgQXVkaXRpbmcgRmlsdGVycyA8YnI+CisJKiogMykgSW1hZ2UgY29udmVyc2lvbiBGaWx0ZXJzIDxicj4KKyAgICAJKiogNCkgRGF0YSBjb21wcmVzc2lvbiBGaWx0ZXJzIDxicj4KKwkqKiA1KSBFbmNyeXB0aW9uIEZpbHRlcnMgPGJyPgorCSoqIDYpIFRva2VuaXppbmcgRmlsdGVycyA8YnI+CisJKiogNykgRmlsdGVycyB0aGF0IHRyaWdnZXIgcmVzb3VyY2UgYWNjZXNzIGV2ZW50cyA8YnI+CisJKiogOCkgWFNML1QgZmlsdGVycyA8YnI+CisJKiogOSkgTWltZS10eXBlIGNoYWluIEZpbHRlciA8YnI+CisJICogQHNpbmNlCVNlcnZsZXQgMi4zCisJKi8KKworcHVibGljIGludGVyZmFjZSBGaWx0ZXIgeworCisJLyoqIAorCSogQ2FsbGVkIGJ5IHRoZSB3ZWIgY29udGFpbmVyIHRvIGluZGljYXRlIHRvIGEgZmlsdGVyIHRoYXQgaXQgaXMgYmVpbmcgcGxhY2VkIGludG8KKwkqIHNlcnZpY2UuIFRoZSBzZXJ2bGV0IGNvbnRhaW5lciBjYWxscyB0aGUgaW5pdCBtZXRob2QgZXhhY3RseSBvbmNlIGFmdGVyIGluc3RhbnRpYXRpbmcgdGhlCisJKiBmaWx0ZXIuIFRoZSBpbml0IG1ldGhvZCBtdXN0IGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSBiZWZvcmUgdGhlIGZpbHRlciBpcyBhc2tlZCB0byBkbyBhbnkKKwkqIGZpbHRlcmluZyB3b3JrLiA8YnI+PGJyPgorCisgICAgIAkqIFRoZSB3ZWIgY29udGFpbmVyIGNhbm5vdCBwbGFjZSB0aGUgZmlsdGVyIGludG8gc2VydmljZSBpZiB0aGUgaW5pdCBtZXRob2QgZWl0aGVyPGJyPgorICAgICAgICAqIDEuVGhyb3dzIGEgU2VydmxldEV4Y2VwdGlvbiA8YnI+CisgICAgICAgICogMi5Eb2VzIG5vdCByZXR1cm4gd2l0aGluIGEgdGltZSBwZXJpb2QgZGVmaW5lZCBieSB0aGUgd2ViIGNvbnRhaW5lciAKKwkqLworCXB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb247CisJCisJCisJLyoqCisJKiBUaGUgPGNvZGU+ZG9GaWx0ZXI8L2NvZGU+IG1ldGhvZCBvZiB0aGUgRmlsdGVyIGlzIGNhbGxlZCBieSB0aGUgY29udGFpbmVyCisJKiBlYWNoIHRpbWUgYSByZXF1ZXN0L3Jlc3BvbnNlIHBhaXIgaXMgcGFzc2VkIHRocm91Z2ggdGhlIGNoYWluIGR1ZQorCSogdG8gYSBjbGllbnQgcmVxdWVzdCBmb3IgYSByZXNvdXJjZSBhdCB0aGUgZW5kIG9mIHRoZSBjaGFpbi4gVGhlIEZpbHRlckNoYWluIHBhc3NlZCBpbiB0byB0aGlzCisJKiBtZXRob2QgYWxsb3dzIHRoZSBGaWx0ZXIgdG8gcGFzcyBvbiB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgdG8gdGhlIG5leHQgZW50aXR5IGluIHRoZQorCSogY2hhaW4uPHA+CisJKiBBIHR5cGljYWwgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgd291bGQgZm9sbG93IHRoZSBmb2xsb3dpbmcgcGF0dGVybjotIDxicj4KKwkqIDEuIEV4YW1pbmUgdGhlIHJlcXVlc3Q8YnI+CisJKiAyLiBPcHRpb25hbGx5IHdyYXAgdGhlIHJlcXVlc3Qgb2JqZWN0IHdpdGggYSBjdXN0b20gaW1wbGVtZW50YXRpb24gdG8KKwkqIGZpbHRlciBjb250ZW50IG9yIGhlYWRlcnMgZm9yIGlucHV0IGZpbHRlcmluZyA8YnI+CisJKiAzLiBPcHRpb25hbGx5IHdyYXAgdGhlIHJlc3BvbnNlIG9iamVjdCB3aXRoIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uIHRvCisJKiBmaWx0ZXIgY29udGVudCBvciBoZWFkZXJzIGZvciBvdXRwdXQgZmlsdGVyaW5nIDxicj4KKwkqIDQuIGEpIDxzdHJvbmc+RWl0aGVyPC9zdHJvbmc+IGludm9rZSB0aGUgbmV4dCBlbnRpdHkgaW4gdGhlIGNoYWluIHVzaW5nIHRoZSBGaWx0ZXJDaGFpbiBvYmplY3QgKDxjb2RlPmNoYWluLmRvRmlsdGVyKCk8L2NvZGU+KSwgPGJyPiAgIAorCSoqIDQuIGIpIDxzdHJvbmc+b3I8L3N0cm9uZz4gbm90IHBhc3Mgb24gdGhlIHJlcXVlc3QvcmVzcG9uc2UgcGFpciB0byB0aGUgbmV4dCBlbnRpdHkgaW4gdGhlIGZpbHRlciBjaGFpbiB0byBibG9jayB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nPGJyPgorCSoqIDUuIERpcmVjdGx5IHNldCBoZWFkZXJzIG9uIHRoZSByZXNwb25zZSBhZnRlciBpbnZvY2F0aW9uIG9mIHRoZSBuZXh0IGVudGl0eSBpbiB0aGUgZmlsdGVyIGNoYWluLgorCSoqLworICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyICggU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBGaWx0ZXJDaGFpbiBjaGFpbiApIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbjsKKworCS8qKgorCSogQ2FsbGVkIGJ5IHRoZSB3ZWIgY29udGFpbmVyIHRvIGluZGljYXRlIHRvIGEgZmlsdGVyIHRoYXQgaXQgaXMgYmVpbmcgdGFrZW4gb3V0IG9mIHNlcnZpY2UuIFRoaXMgCisJKiBtZXRob2QgaXMgb25seSBjYWxsZWQgb25jZSBhbGwgdGhyZWFkcyB3aXRoaW4gdGhlIGZpbHRlcidzIGRvRmlsdGVyIG1ldGhvZCBoYXZlIGV4aXRlZCBvciBhZnRlcgorCSogYSB0aW1lb3V0IHBlcmlvZCBoYXMgcGFzc2VkLiBBZnRlciB0aGUgd2ViIGNvbnRhaW5lciBjYWxscyB0aGlzIG1ldGhvZCwgaXQgd2lsbCBub3QgY2FsbCB0aGUKKwkqIGRvRmlsdGVyIG1ldGhvZCBhZ2FpbiBvbiB0aGlzIGluc3RhbmNlIG9mIHRoZSBmaWx0ZXIuIDxicj48YnI+CisJKiAKKyAgICAgCSogVGhpcyBtZXRob2QgZ2l2ZXMgdGhlIGZpbHRlciBhbiBvcHBvcnR1bml0eSB0byBjbGVhbiB1cCBhbnkgcmVzb3VyY2VzIHRoYXQgYXJlIGJlaW5nIGhlbGQgKGZvcgorCSogZXhhbXBsZSwgbWVtb3J5LCBmaWxlIGhhbmRsZXMsIHRocmVhZHMpIGFuZCBtYWtlIHN1cmUgdGhhdCBhbnkgcGVyc2lzdGVudCBzdGF0ZSBpcyBzeW5jaHJvbml6ZWQKKwkqIHdpdGggdGhlIGZpbHRlcidzIGN1cnJlbnQgc3RhdGUgaW4gbWVtb3J5LgorCSovCisKKwlwdWJsaWMgdm9pZCBkZXN0cm95KCk7CisKKworfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9GaWx0ZXJDaGFpbi5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvRmlsdGVyQ2hhaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2JhNDU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvRmlsdGVyQ2hhaW4uamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAqIEEgRmlsdGVyQ2hhaW4gaXMgYW4gb2JqZWN0IHByb3ZpZGVkIGJ5IHRoZSBzZXJ2bGV0IGNvbnRhaW5lciB0byB0aGUgZGV2ZWxvcGVyCisgICAgKiBnaXZpbmcgYSB2aWV3IGludG8gdGhlIGludm9jYXRpb24gY2hhaW4gb2YgYSBmaWx0ZXJlZCByZXF1ZXN0IGZvciBhIHJlc291cmNlLiBGaWx0ZXJzCisgICAgKiB1c2UgdGhlIEZpbHRlckNoYWluIHRvIGludm9rZSB0aGUgbmV4dCBmaWx0ZXIgaW4gdGhlIGNoYWluLCBvciBpZiB0aGUgY2FsbGluZyBmaWx0ZXIKKyAgICAqIGlzIHRoZSBsYXN0IGZpbHRlciBpbiB0aGUgY2hhaW4sIHRvIGludm9rZSB0aGUgcmVzb3VyY2UgYXQgdGhlIGVuZCBvZiB0aGUgY2hhaW4uCisgICAgKgorICAgICogQHNlZSBGaWx0ZXIKKyAgICAqIEBzaW5jZSBTZXJ2bGV0IDIuMworICAgICoqLworCitwdWJsaWMgaW50ZXJmYWNlIEZpbHRlckNoYWluIHsKKwkKKwkvKioKKwkqIENhdXNlcyB0aGUgbmV4dCBmaWx0ZXIgaW4gdGhlIGNoYWluIHRvIGJlIGludm9rZWQsIG9yIGlmIHRoZSBjYWxsaW5nIGZpbHRlciBpcyB0aGUgbGFzdCBmaWx0ZXIKKwkqIGluIHRoZSBjaGFpbiwgY2F1c2VzIHRoZSByZXNvdXJjZSBhdCB0aGUgZW5kIG9mIHRoZSBjaGFpbiB0byBiZSBpbnZva2VkLgorCSoKKwkqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0IHRvIHBhc3MgYWxvbmcgdGhlIGNoYWluLgorCSogQHBhcmFtIHJlc3BvbnNlIHRoZSByZXNwb25zZSB0byBwYXNzIGFsb25nIHRoZSBjaGFpbi4KKwkqCisJKiBAc2luY2UgMi4zCisJKi8KKwkKKyAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlciAoIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSApIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbjsKKworfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9GaWx0ZXJDb25maWcuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L0ZpbHRlckNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZWY2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9GaWx0ZXJDb25maWcuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBqYXZheC5zZXJ2bGV0OworCisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKKwkgLyoqIAorCSAqCisJICogQSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3QgdXNlZCBieSBhIHNlcnZsZXQgY29udGFpbmVyCisJICogdG8gcGFzcyBpbmZvcm1hdGlvbiB0byBhIGZpbHRlciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisJICogQHNlZSBGaWx0ZXIgCisJICAqIEBzaW5jZQlTZXJ2bGV0IDIuMworCSAqCisJICovCisKKworcHVibGljIGludGVyZmFjZSBGaWx0ZXJDb25maWcgeworCisJLyoqIAorCSogUmV0dXJucyB0aGUgZmlsdGVyLW5hbWUgb2YgdGhpcyBmaWx0ZXIgYXMgZGVmaW5lZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAKKwkqLworCQorCXB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyTmFtZSgpOworCisKKyAvKioKKyAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSB7QGxpbmsgU2VydmxldENvbnRleHR9IGluIHdoaWNoIHRoZSBjYWxsZXIKKyAgICAgKiBpcyBleGVjdXRpbmcuCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEge0BsaW5rIFNlcnZsZXRDb250ZXh0fSBvYmplY3QsIHVzZWQKKyAgICAgKgkJCWJ5IHRoZSBjYWxsZXIgdG8gaW50ZXJhY3Qgd2l0aCBpdHMgc2VydmxldCAKKyAgICAgKiAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcgorICAgICAqIAorICAgICAqIEBzZWUJCVNlcnZsZXRDb250ZXh0CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIHZhbHVlIG9mIHRoZSAKKyAgICAgKiBuYW1lZCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorICAgICAqIHRoZSBwYXJhbWV0ZXIgZG9lcyBub3QgZXhpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgbmFtZQorICAgICAqCQkJb2YgdGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIHZhbHVlIAorICAgICAqCQkJb2YgdGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZmlsdGVyJ3MgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycworICAgICAqIGFzIGFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdHMsIAorICAgICAqIG9yIGFuIGVtcHR5IDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBpZiB0aGUgZmlsdGVyIGhhcworICAgICAqIG5vIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhbiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gb2YgPGNvZGU+U3RyaW5nPC9jb2RlPiAKKyAgICAgKgkJCW9iamVjdHMgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIGZpbHRlcidzIAorICAgICAqCQkJaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycworICAgICAqCisgICAgICoKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEluaXRQYXJhbWV0ZXJOYW1lcygpOworCisKKworCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9HZW5lcmljU2VydmxldC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvR2VuZXJpY1NlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWVjMGM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvR2VuZXJpY1NlcnZsZXQuamF2YQpAQCAtMCwwICsxLDMyNCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworLyoqCisgKgorICogRGVmaW5lcyBhIGdlbmVyaWMsIHByb3RvY29sLWluZGVwZW5kZW50CisgKiBzZXJ2bGV0LiBUbyB3cml0ZSBhbiBIVFRQIHNlcnZsZXQgZm9yIHVzZSBvbiB0aGUKKyAqIFdlYiwgZXh0ZW5kIHtAbGluayBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXR9IGluc3RlYWQuCisgKgorICogPHA+PGNvZGU+R2VuZXJpY1NlcnZsZXQ8L2NvZGU+IGltcGxlbWVudHMgdGhlIDxjb2RlPlNlcnZsZXQ8L2NvZGU+CisgKiBhbmQgPGNvZGU+U2VydmxldENvbmZpZzwvY29kZT4gaW50ZXJmYWNlcy4gPGNvZGU+R2VuZXJpY1NlcnZsZXQ8L2NvZGU+CisgKiBtYXkgYmUgZGlyZWN0bHkgZXh0ZW5kZWQgYnkgYSBzZXJ2bGV0LCBhbHRob3VnaCBpdCdzIG1vcmUgY29tbW9uIHRvIGV4dGVuZAorICogYSBwcm90b2NvbC1zcGVjaWZpYyBzdWJjbGFzcyBzdWNoIGFzIDxjb2RlPkh0dHBTZXJ2bGV0PC9jb2RlPi4KKyAqCisgKiA8cD48Y29kZT5HZW5lcmljU2VydmxldDwvY29kZT4gbWFrZXMgd3JpdGluZyBzZXJ2bGV0cworICogZWFzaWVyLiBJdCBwcm92aWRlcyBzaW1wbGUgdmVyc2lvbnMgb2YgdGhlIGxpZmVjeWNsZSBtZXRob2RzIAorICogPGNvZGU+aW5pdDwvY29kZT4gYW5kIDxjb2RlPmRlc3Ryb3k8L2NvZGU+IGFuZCBvZiB0aGUgbWV0aG9kcyAKKyAqIGluIHRoZSA8Y29kZT5TZXJ2bGV0Q29uZmlnPC9jb2RlPiBpbnRlcmZhY2UuIDxjb2RlPkdlbmVyaWNTZXJ2bGV0PC9jb2RlPgorICogYWxzbyBpbXBsZW1lbnRzIHRoZSA8Y29kZT5sb2c8L2NvZGU+IG1ldGhvZCwgZGVjbGFyZWQgaW4gdGhlCisgKiA8Y29kZT5TZXJ2bGV0Q29udGV4dDwvY29kZT4gaW50ZXJmYWNlLiAKKyAqCisgKiA8cD5UbyB3cml0ZSBhIGdlbmVyaWMgc2VydmxldCwgeW91IG5lZWQgb25seQorICogb3ZlcnJpZGUgdGhlIGFic3RyYWN0IDxjb2RlPnNlcnZpY2U8L2NvZGU+IG1ldGhvZC4gCisgKgorICoKKyAqIEBhdXRob3IgCVZhcmlvdXMKKyAqIEB2ZXJzaW9uIAkkVmVyc2lvbiQKKyAqCisgKgorICoKKyAqLworCisgCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJpY1NlcnZsZXQgCisgICAgaW1wbGVtZW50cyBTZXJ2bGV0LCBTZXJ2bGV0Q29uZmlnLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQoreworCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgU2VydmxldENvbmZpZyBjb25maWc7CisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIERvZXMgbm90aGluZy4gQWxsIG9mIHRoZSBzZXJ2bGV0IGluaXRpYWxpemF0aW9uCisgICAgICogaXMgZG9uZSBieSBvbmUgb2YgdGhlIDxjb2RlPmluaXQ8L2NvZGU+IG1ldGhvZHMuCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBHZW5lcmljU2VydmxldCgpIHsgfQorICAgIAorICAgIAorICAgIAorICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBzZXJ2bGV0IGNvbnRhaW5lciB0byBpbmRpY2F0ZSB0byBhIHNlcnZsZXQgdGhhdCB0aGUKKyAgICAgKiBzZXJ2bGV0IGlzIGJlaW5nIHRha2VuIG91dCBvZiBzZXJ2aWNlLiAgU2VlIHtAbGluayBTZXJ2bGV0I2Rlc3Ryb3l9LgorICAgICAqCisgICAgICogCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQKKyAgICAgKiBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwYXJhbWV0ZXIgZG9lcworICAgICAqIG5vdCBleGlzdC4gIFNlZSB7QGxpbmsgU2VydmxldENvbmZpZyNnZXRJbml0UGFyYW1ldGVyfS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIHN1cHBsaWVkIGZvciBjb252ZW5pZW5jZS4gSXQgZ2V0cyB0aGUgCisgICAgICogdmFsdWUgb2YgdGhlIG5hbWVkIHBhcmFtZXRlciBmcm9tIHRoZSBzZXJ2bGV0J3MgCisgICAgICogPGNvZGU+U2VydmxldENvbmZpZzwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgbmFtZSAKKyAgICAgKgkJCQlvZiB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyAJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIHRoZSB2YWx1ZQorICAgICAqCQkJCW9mIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIKKyAgICAgKgorICAgICAqLyAKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworCXJldHVybiBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0SW5pdFBhcmFtZXRlcihuYW1lKTsKKyAgICB9CisgICAgCisgICAgCisKKyAgIC8qKgorICAgICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIHNlcnZsZXQncyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIAorICAgICogYXMgYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0cywKKyAgICAqIG9yIGFuIGVtcHR5IDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBpZiB0aGUgc2VydmxldCBoYXMgbm8KKyAgICAqIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuICBTZWUge0BsaW5rCisgICAgKiBTZXJ2bGV0Q29uZmlnI2dldEluaXRQYXJhbWV0ZXJOYW1lc30uCisgICAgKgorICAgICogPHA+VGhpcyBtZXRob2QgaXMgc3VwcGxpZWQgZm9yIGNvbnZlbmllbmNlLiBJdCBnZXRzIHRoZSAKKyAgICAqIHBhcmFtZXRlciBuYW1lcyBmcm9tIHRoZSBzZXJ2bGV0J3MgPGNvZGU+U2VydmxldENvbmZpZzwvY29kZT4gb2JqZWN0LiAKKyAgICAqCisgICAgKgorICAgICogQHJldHVybiBFbnVtZXJhdGlvbiAJYW4gZW51bWVyYXRpb24gb2YgPGNvZGU+U3RyaW5nPC9jb2RlPgorICAgICoJCQkJb2JqZWN0cyBjb250YWluaW5nIHRoZSBuYW1lcyBvZiAKKyAgICAqCQkJCXRoZSBzZXJ2bGV0J3MgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycworICAgICoKKyAgICAqLworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEluaXRQYXJhbWV0ZXJOYW1lcygpIHsKKwlyZXR1cm4gZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXJOYW1lcygpOworICAgIH0gICAKKyAgICAKKyAgICAgCisgCisgICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIHNlcnZsZXQncyB7QGxpbmsgU2VydmxldENvbmZpZ30gb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBTZXJ2bGV0Q29uZmlnIAl0aGUgPGNvZGU+U2VydmxldENvbmZpZzwvY29kZT4gb2JqZWN0CisgICAgICoJCQkJdGhhdCBpbml0aWFsaXplZCB0aGlzIHNlcnZsZXQKKyAgICAgKgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTZXJ2bGV0Q29uZmlnIGdldFNlcnZsZXRDb25maWcoKSB7CisJcmV0dXJuIGNvbmZpZzsKKyAgICB9CisgICAgCisgICAgCisgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUge0BsaW5rIFNlcnZsZXRDb250ZXh0fSBpbiB3aGljaCB0aGlzIHNlcnZsZXQKKyAgICAgKiBpcyBydW5uaW5nLiAgU2VlIHtAbGluayBTZXJ2bGV0Q29uZmlnI2dldFNlcnZsZXRDb250ZXh0fS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIHN1cHBsaWVkIGZvciBjb252ZW5pZW5jZS4gSXQgZ2V0cyB0aGUgCisgICAgICogY29udGV4dCBmcm9tIHRoZSBzZXJ2bGV0J3MgPGNvZGU+U2VydmxldENvbmZpZzwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFNlcnZsZXRDb250ZXh0IAl0aGUgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+IG9iamVjdAorICAgICAqCQkJCXBhc3NlZCB0byB0aGlzIHNlcnZsZXQgYnkgdGhlIDxjb2RlPmluaXQ8L2NvZGU+CisgICAgICoJCQkJbWV0aG9kCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKKwlyZXR1cm4gZ2V0U2VydmxldENvbmZpZygpLmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgfQorCisKKworIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VydmxldCwgc3VjaCBhcyAKKyAgICAgKiBhdXRob3IsIHZlcnNpb24sIGFuZCBjb3B5cmlnaHQuIAorICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLiAgT3ZlcnJpZGUgdGhpcyBtZXRob2QKKyAgICAgKiB0byBoYXZlIGl0IHJldHVybiBhIG1lYW5pbmdmdWwgdmFsdWUuICBTZWUge0BsaW5rCisgICAgICogU2VydmxldCNnZXRTZXJ2bGV0SW5mb30uCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIAkJaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzZXJ2bGV0LCBieSBkZWZhdWx0IGFuCisgICAgICogCQkJCWVtcHR5IHN0cmluZworICAgICAqCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0SW5mbygpIHsKKwlyZXR1cm4gIiI7CisgICAgfQorCisKKworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBDYWxsZWQgYnkgdGhlIHNlcnZsZXQgY29udGFpbmVyIHRvIGluZGljYXRlIHRvIGEgc2VydmxldCB0aGF0IHRoZQorICAgICAqIHNlcnZsZXQgaXMgYmVpbmcgcGxhY2VkIGludG8gc2VydmljZS4gIFNlZSB7QGxpbmsgU2VydmxldCNpbml0fS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gc3RvcmVzIHRoZSB7QGxpbmsgU2VydmxldENvbmZpZ30KKyAgICAgKiBvYmplY3QgaXQgcmVjZWl2ZXMgZnJvbSB0aGUgc2VydmxldCBjb250YWluZXIgZm9yIGxhdGVyIHVzZS4KKyAgICAgKiBXaGVuIG92ZXJyaWRpbmcgdGhpcyBmb3JtIG9mIHRoZSBtZXRob2QsIGNhbGwgCisgICAgICogPGNvZGU+c3VwZXIuaW5pdChjb25maWcpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgCQkJdGhlIDxjb2RlPlNlcnZsZXRDb25maWc8L2NvZGU+IG9iamVjdAorICAgICAqCQkJCQl0aGF0IGNvbnRhaW5zIGNvbmZpZ3V0YXRpb24KKyAgICAgKgkJCQkJaW5mb3JtYXRpb24gZm9yIHRoaXMgc2VydmxldAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIAlpZiBhbiBleGNlcHRpb24gb2NjdXJzIHRoYXQKKyAgICAgKgkJCQkJaW50ZXJydXB0cyB0aGUgc2VydmxldCdzIG5vcm1hbAorICAgICAqCQkJCQlvcGVyYXRpb24KKyAgICAgKgorICAgICAqIAorICAgICAqIEBzZWUgCQkJCVVuYXZhaWxhYmxlRXhjZXB0aW9uCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKwl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKwl0aGlzLmluaXQoKTsKKyAgICB9CisKKworCisKKworICAgIC8qKgorICAgICAqCisgICAgICogQSBjb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gc28gdGhhdCB0aGVyZSdzIG5vIG5lZWQKKyAgICAgKiB0byBjYWxsIDxjb2RlPnN1cGVyLmluaXQoY29uZmlnKTwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD5JbnN0ZWFkIG9mIG92ZXJyaWRpbmcge0BsaW5rICNpbml0KFNlcnZsZXRDb25maWcpfSwgc2ltcGx5IG92ZXJyaWRlCisgICAgICogdGhpcyBtZXRob2QgYW5kIGl0IHdpbGwgYmUgY2FsbGVkIGJ5CisgICAgICogPGNvZGU+R2VuZXJpY1NlcnZsZXQuaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZyk8L2NvZGU+LgorICAgICAqIFRoZSA8Y29kZT5TZXJ2bGV0Q29uZmlnPC9jb2RlPiBvYmplY3QgY2FuIHN0aWxsIGJlIHJldHJpZXZlZCB2aWEge0BsaW5rCisgICAgICogI2dldFNlcnZsZXRDb25maWd9LiAKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiAJaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB0aGF0CisgICAgICoJCQkJCWludGVycnVwdHMgdGhlIHNlcnZsZXQncworICAgICAqCQkJCQlub3JtYWwgb3BlcmF0aW9uCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgfQorICAgIAorCisKKworICAgIC8qKgorICAgICAqIAorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgdG8gYSBzZXJ2bGV0IGxvZyBmaWxlLCBwcmVwZW5kZWQgYnkgdGhlCisgICAgICogc2VydmxldCdzIG5hbWUuICBTZWUge0BsaW5rIFNlcnZsZXRDb250ZXh0I2xvZyhTdHJpbmcpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cgCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nCisgICAgICoJCQl0aGUgbWVzc2FnZSB0byBiZSB3cml0dGVuIHRvIHRoZSBsb2cgZmlsZQorICAgICAqCisgICAgICovCisgICAgIAorICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7CisJZ2V0U2VydmxldENvbnRleHQoKS5sb2coZ2V0U2VydmxldE5hbWUoKSArICI6ICIrIG1zZyk7CisgICAgfQorICAgCisgICAKKyAgIAorICAgCisgICAgLyoqCisgICAgICogV3JpdGVzIGFuIGV4cGxhbmF0b3J5IG1lc3NhZ2UgYW5kIGEgc3RhY2sgdHJhY2UKKyAgICAgKiBmb3IgYSBnaXZlbiA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IGV4Y2VwdGlvbgorICAgICAqIHRvIHRoZSBzZXJ2bGV0IGxvZyBmaWxlLCBwcmVwZW5kZWQgYnkgdGhlIHNlcnZsZXQncyBuYW1lLgorICAgICAqIFNlZSB7QGxpbmsgU2VydmxldENvbnRleHQjbG9nKFN0cmluZywgVGhyb3dhYmxlKX0uCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIAkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRoYXQgZGVzY3JpYmVzCisgICAgICoJCQkJdGhlIGVycm9yIG9yIGV4Y2VwdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIHQJCQl0aGUgPGNvZGU+amF2YS5sYW5nLlRocm93YWJsZTwvY29kZT4gZXJyb3IKKyAgICAgKiAJCQkJb3IgZXhjZXB0aW9uCisgICAgICoKKyAgICAgKgorICAgICAqLworICAgCisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdCkgeworCWdldFNlcnZsZXRDb250ZXh0KCkubG9nKGdldFNlcnZsZXROYW1lKCkgKyAiOiAiICsgbWVzc2FnZSwgdCk7CisgICAgfQorICAgIAorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgc2VydmxldCBjb250YWluZXIgdG8gYWxsb3cgdGhlIHNlcnZsZXQgdG8gcmVzcG9uZCB0bworICAgICAqIGEgcmVxdWVzdC4gIFNlZSB7QGxpbmsgU2VydmxldCNzZXJ2aWNlfS4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBkZWNsYXJlZCBhYnN0cmFjdCBzbyBzdWJjbGFzc2VzLCBzdWNoIGFzIAorICAgICAqIDxjb2RlPkh0dHBTZXJ2bGV0PC9jb2RlPiwgbXVzdCBvdmVycmlkZSBpdC4KKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxIAl0aGUgPGNvZGU+U2VydmxldFJlcXVlc3Q8L2NvZGU+IG9iamVjdAorICAgICAqCQkJdGhhdCBjb250YWlucyB0aGUgY2xpZW50J3MgcmVxdWVzdAorICAgICAqCisgICAgICogQHBhcmFtIHJlcyAJdGhlIDxjb2RlPlNlcnZsZXRSZXNwb25zZTwvY29kZT4gb2JqZWN0CisgICAgICoJCQl0aGF0IHdpbGwgY29udGFpbiB0aGUgc2VydmxldCdzIHJlc3BvbnNlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gCWlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgdGhhdAorICAgICAqCQkJCQlpbnRlcmZlcmVzIHdpdGggdGhlIHNlcnZsZXQncworICAgICAqCQkJCQlub3JtYWwgb3BlcmF0aW9uIG9jY3VycmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIAkJaWYgYW4gaW5wdXQgb3Igb3V0cHV0CisgICAgICoJCQkJCWV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2VydmljZShTZXJ2bGV0UmVxdWVzdCByZXEsIFNlcnZsZXRSZXNwb25zZSByZXMpCisJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uOworICAgIAorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgc2VydmxldCBpbnN0YW5jZS4KKyAgICAgKiBTZWUge0BsaW5rIFNlcnZsZXRDb25maWcjZ2V0U2VydmxldE5hbWV9LgorICAgICAqCisgICAgICogQHJldHVybiAgICAgICAgICB0aGUgbmFtZSBvZiB0aGlzIHNlcnZsZXQgaW5zdGFuY2UKKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBjb25maWcuZ2V0U2VydmxldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZmIyODcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMCwwICsxLDIxIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgRGVmYXVsdCBsb2NhbGl6ZWQgc3RyaW5nIGluZm9ybWF0aW9uCisjIExvY2FsaXplZCBmb3IgTG9jYWxlIGVuX1VTCisKK2Vyci5ub3RfaXNvODg1OV8xPU5vdCBhbiBJU08gODg1OS0xIGNoYXJhY3RlcjogezB9Cit2YWx1ZS50cnVlPXRydWUKK3ZhbHVlLmZhbHNlPWZhbHNlCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDU3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpAQCAtMCwwICsxLDIzIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgRGVmYXVsdCBsb2NhbGl6ZWQgc3RyaW5nIGluZm9ybWF0aW9uCisjIExvY2FsaXplZCBmb3IgTG9jYWxlIGZyX0ZSCisKK2Vyci5ub3RfaXNvODg1OV8xPXswfSBuJydlc3QgcGFzIHVuIGNhcmFjdOhyZSBJU08gODg1OS0xCit2YWx1ZS50cnVlPXRydWUKK3ZhbHVlLmZhbHNlPWZhbHNlIAorCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE4NzQ4MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjEgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBEZWZhdWx0IGxvY2FsaXplZCBzdHJpbmcgaW5mb3JtYXRpb24KKyMgTG9jYWxpemVkIGZvciBMb2NhbGUgamFfSlAKKworZXJyLm5vdF9pc284ODU5XzE9SVNPIDg4NTktMSBcdTMwNmVcdTY1ODdcdTViNTdcdTMwNjdcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTM6IHswfQordmFsdWUudHJ1ZT10cnVlCit2YWx1ZS5mYWxzZT1mYWxzZQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvUmVxdWVzdERpc3BhdGNoZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1JlcXVlc3REaXNwYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTllNzliMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1JlcXVlc3REaXNwYXRjaGVyLmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisKKy8qKgorICogRGVmaW5lcyBhbiBvYmplY3QgdGhhdCByZWNlaXZlcyByZXF1ZXN0cyBmcm9tIHRoZSBjbGllbnQKKyAqIGFuZCBzZW5kcyB0aGVtIHRvIGFueSByZXNvdXJjZSAoc3VjaCBhcyBhIHNlcnZsZXQsIAorICogSFRNTCBmaWxlLCBvciBKU1AgZmlsZSkgb24gdGhlIHNlcnZlci4gVGhlIHNlcnZsZXQKKyAqIGNvbnRhaW5lciBjcmVhdGVzIHRoZSA8Y29kZT5SZXF1ZXN0RGlzcGF0Y2hlcjwvY29kZT4gb2JqZWN0LAorICogd2hpY2ggaXMgdXNlZCBhcyBhIHdyYXBwZXIgYXJvdW5kIGEgc2VydmVyIHJlc291cmNlIGxvY2F0ZWQKKyAqIGF0IGEgcGFydGljdWxhciBwYXRoIG9yIGdpdmVuIGJ5IGEgcGFydGljdWxhciBuYW1lLgorICoKKyAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIHdyYXAgc2VydmxldHMsCisgKiBidXQgYSBzZXJ2bGV0IGNvbnRhaW5lciBjYW4gY3JlYXRlIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyPC9jb2RlPgorICogb2JqZWN0cyB0byB3cmFwIGFueSB0eXBlIG9mIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgCVZhcmlvdXMKKyAqIEB2ZXJzaW9uIAkkVmVyc2lvbiQKKyAqCisgKiBAc2VlIAlTZXJ2bGV0Q29udGV4dCNnZXRSZXF1ZXN0RGlzcGF0Y2hlcihqYXZhLmxhbmcuU3RyaW5nKQorICogQHNlZSAJU2VydmxldENvbnRleHQjZ2V0TmFtZWREaXNwYXRjaGVyKGphdmEubGFuZy5TdHJpbmcpCisgKiBAc2VlIAlTZXJ2bGV0UmVxdWVzdCNnZXRSZXF1ZXN0RGlzcGF0Y2hlcihqYXZhLmxhbmcuU3RyaW5nKQorICoKKyAqLworIAorcHVibGljIGludGVyZmFjZSBSZXF1ZXN0RGlzcGF0Y2hlciB7CisKKworCisKKworLyoqCisgKiBGb3J3YXJkcyBhIHJlcXVlc3QgZnJvbQorICogYSBzZXJ2bGV0IHRvIGFub3RoZXIgcmVzb3VyY2UgKHNlcnZsZXQsIEpTUCBmaWxlLCBvcgorICogSFRNTCBmaWxlKSBvbiB0aGUgc2VydmVyLiBUaGlzIG1ldGhvZCBhbGxvd3MKKyAqIG9uZSBzZXJ2bGV0IHRvIGRvIHByZWxpbWluYXJ5IHByb2Nlc3Npbmcgb2YKKyAqIGEgcmVxdWVzdCBhbmQgYW5vdGhlciByZXNvdXJjZSB0byBnZW5lcmF0ZQorICogdGhlIHJlc3BvbnNlLgorICoKKyAqIDxwPkZvciBhIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyPC9jb2RlPiBvYnRhaW5lZCB2aWEgCisgKiA8Y29kZT5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigpPC9jb2RlPiwgdGhlIDxjb2RlPlNlcnZsZXRSZXF1ZXN0PC9jb2RlPiAKKyAqIG9iamVjdCBoYXMgaXRzIHBhdGggZWxlbWVudHMgYW5kIHBhcmFtZXRlcnMgYWRqdXN0ZWQgdG8gbWF0Y2gKKyAqIHRoZSBwYXRoIG9mIHRoZSB0YXJnZXQgcmVzb3VyY2UuCisgKgorICogPHA+PGNvZGU+Zm9yd2FyZDwvY29kZT4gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHJlc3BvbnNlIGhhcyBiZWVuIAorICogY29tbWl0dGVkIHRvIHRoZSBjbGllbnQgKGJlZm9yZSByZXNwb25zZSBib2R5IG91dHB1dCBoYXMgYmVlbiBmbHVzaGVkKS4gIAorICogSWYgdGhlIHJlc3BvbnNlIGFscmVhZHkgaGFzIGJlZW4gY29tbWl0dGVkLCB0aGlzIG1ldGhvZCB0aHJvd3MKKyAqIGFuIDxjb2RlPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4uCisgKiBVbmNvbW1pdHRlZCBvdXRwdXQgaW4gdGhlIHJlc3BvbnNlIGJ1ZmZlciBpcyBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgCisgKiBiZWZvcmUgdGhlIGZvcndhcmQuCisgKgorICogPHA+VGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHBhcmFtZXRlcnMgbXVzdCBiZSBlaXRoZXIgdGhlIHNhbWUKKyAqIG9iamVjdHMgYXMgd2VyZSBwYXNzZWQgdG8gdGhlIGNhbGxpbmcgc2VydmxldCdzIHNlcnZpY2UgbWV0aG9kIG9yIGJlCisgKiBzdWJjbGFzc2VzIG9mIHRoZSB7QGxpbmsgU2VydmxldFJlcXVlc3RXcmFwcGVyfSBvciB7QGxpbmsgU2VydmxldFJlc3BvbnNlV3JhcHBlcn0gY2xhc3NlcworICogdGhhdCB3cmFwIHRoZW0uCisgKgorICoKKyAqIEBwYXJhbSByZXF1ZXN0CQlhIHtAbGluayBTZXJ2bGV0UmVxdWVzdH0gb2JqZWN0CisgKgkJCQl0aGF0IHJlcHJlc2VudHMgdGhlIHJlcXVlc3QgdGhlIGNsaWVudAorICogCQkJCW1ha2VzIG9mIHRoZSBzZXJ2bGV0CisgKgorICogQHBhcmFtIHJlc3BvbnNlCQlhIHtAbGluayBTZXJ2bGV0UmVzcG9uc2V9IG9iamVjdAorICoJCQkJdGhhdCByZXByZXNlbnRzIHRoZSByZXNwb25zZSB0aGUgc2VydmxldAorICoJCQkJcmV0dXJucyB0byB0aGUgY2xpZW50CisgKgorICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uCWlmIHRoZSB0YXJnZXQgcmVzb3VyY2UgdGhyb3dzIHRoaXMgZXhjZXB0aW9uCisgKgorICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbglpZiB0aGUgdGFyZ2V0IHJlc291cmNlIHRocm93cyB0aGlzIGV4Y2VwdGlvbgorICoKKyAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCWlmIHRoZSByZXNwb25zZSB3YXMgYWxyZWFkeSBjb21taXR0ZWQKKyAqCisgKi8KKworICAgIHB1YmxpYyB2b2lkIGZvcndhcmQoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKKworCisKKworICAgIC8qKgorICAgICAqCisgICAgICogSW5jbHVkZXMgdGhlIGNvbnRlbnQgb2YgYSByZXNvdXJjZSAoc2VydmxldCwgSlNQIHBhZ2UsCisgICAgICogSFRNTCBmaWxlKSBpbiB0aGUgcmVzcG9uc2UuIEluIGVzc2VuY2UsIHRoaXMgbWV0aG9kIGVuYWJsZXMgCisgICAgICogcHJvZ3JhbW1hdGljIHNlcnZlci1zaWRlIGluY2x1ZGVzLgorICAgICAqCisgICAgICogPHA+VGhlIHtAbGluayBTZXJ2bGV0UmVzcG9uc2V9IG9iamVjdCBoYXMgaXRzIHBhdGggZWxlbWVudHMKKyAgICAgKiBhbmQgcGFyYW1ldGVycyByZW1haW4gdW5jaGFuZ2VkIGZyb20gdGhlIGNhbGxlcidzLiBUaGUgaW5jbHVkZWQKKyAgICAgKiBzZXJ2bGV0IGNhbm5vdCBjaGFuZ2UgdGhlIHJlc3BvbnNlIHN0YXR1cyBjb2RlIG9yIHNldCBoZWFkZXJzOworICAgICAqIGFueSBhdHRlbXB0IHRvIG1ha2UgYSBjaGFuZ2UgaXMgaWdub3JlZC4KKyAgICAgKgorICAgICAqIDxwPlRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSBwYXJhbWV0ZXJzIG11c3QgYmUgZWl0aGVyIHRoZSBzYW1lCisgICAgICogb2JqZWN0cyBhcyB3ZXJlIHBhc3NlZCB0byB0aGUgY2FsbGluZyBzZXJ2bGV0J3Mgc2VydmljZSBtZXRob2Qgb3IgYmUKKyAgICAgKiBzdWJjbGFzc2VzIG9mIHRoZSB7QGxpbmsgU2VydmxldFJlcXVlc3RXcmFwcGVyfSBvciB7QGxpbmsgU2VydmxldFJlc3BvbnNlV3JhcHBlcn0gY2xhc3NlcworICAgICAqIHRoYXQgd3JhcCB0aGVtLgorICAgICAqIAorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCAJCQlhIHtAbGluayBTZXJ2bGV0UmVxdWVzdH0gb2JqZWN0IAorICAgICAqCQkJCQl0aGF0IGNvbnRhaW5zIHRoZSBjbGllbnQncyByZXF1ZXN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgCQkJYSB7QGxpbmsgU2VydmxldFJlc3BvbnNlfSBvYmplY3QgCisgICAgICogCQkJCQl0aGF0IGNvbnRhaW5zIHRoZSBzZXJ2bGV0J3MgcmVzcG9uc2UKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiAJaWYgdGhlIGluY2x1ZGVkIHJlc291cmNlIHRocm93cyB0aGlzIGV4Y2VwdGlvbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiAJCWlmIHRoZSBpbmNsdWRlZCByZXNvdXJjZSB0aHJvd3MgdGhpcyBleGNlcHRpb24KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgIAorICAgIHB1YmxpYyB2b2lkIGluY2x1ZGUoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKK30KKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhZTQxOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXQuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisKKy8qKgorICogRGVmaW5lcyBtZXRob2RzIHRoYXQgYWxsIHNlcnZsZXRzIG11c3QgaW1wbGVtZW50LgorICoKKyAqIDxwPkEgc2VydmxldCBpcyBhIHNtYWxsIEphdmEgcHJvZ3JhbSB0aGF0IHJ1bnMgd2l0aGluIGEgV2ViIHNlcnZlci4KKyAqIFNlcnZsZXRzIHJlY2VpdmUgYW5kIHJlc3BvbmQgdG8gcmVxdWVzdHMgZnJvbSBXZWIgY2xpZW50cywKKyAqIHVzdWFsbHkgYWNyb3NzIEhUVFAsIHRoZSBIeXBlclRleHQgVHJhbnNmZXIgUHJvdG9jb2wuIAorICoKKyAqIDxwPlRvIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgeW91IGNhbiB3cml0ZSBhIGdlbmVyaWMgc2VydmxldAorICogdGhhdCBleHRlbmRzCisgKiA8Y29kZT5qYXZheC5zZXJ2bGV0LkdlbmVyaWNTZXJ2bGV0PC9jb2RlPiBvciBhbiBIVFRQIHNlcnZsZXQgdGhhdAorICogZXh0ZW5kcyA8Y29kZT5qYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ8L2NvZGU+LgorICoKKyAqIDxwPlRoaXMgaW50ZXJmYWNlIGRlZmluZXMgbWV0aG9kcyB0byBpbml0aWFsaXplIGEgc2VydmxldCwKKyAqIHRvIHNlcnZpY2UgcmVxdWVzdHMsIGFuZCB0byByZW1vdmUgYSBzZXJ2bGV0IGZyb20gdGhlIHNlcnZlci4KKyAqIFRoZXNlIGFyZSBrbm93biBhcyBsaWZlLWN5Y2xlIG1ldGhvZHMgYW5kIGFyZSBjYWxsZWQgaW4gdGhlCisgKiBmb2xsb3dpbmcgc2VxdWVuY2U6CisgKiA8b2w+CisgKiA8bGk+VGhlIHNlcnZsZXQgaXMgY29uc3RydWN0ZWQsIHRoZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgPGNvZGU+aW5pdDwvY29kZT4gbWV0aG9kLgorICogPGxpPkFueSBjYWxscyBmcm9tIGNsaWVudHMgdG8gdGhlIDxjb2RlPnNlcnZpY2U8L2NvZGU+IG1ldGhvZCBhcmUgaGFuZGxlZC4KKyAqIDxsaT5UaGUgc2VydmxldCBpcyB0YWtlbiBvdXQgb2Ygc2VydmljZSwgdGhlbiBkZXN0cm95ZWQgd2l0aCB0aGUgCisgKiA8Y29kZT5kZXN0cm95PC9jb2RlPiBtZXRob2QsIHRoZW4gZ2FyYmFnZSBjb2xsZWN0ZWQgYW5kIGZpbmFsaXplZC4KKyAqIDwvb2w+CisgKgorICogPHA+SW4gYWRkaXRpb24gdG8gdGhlIGxpZmUtY3ljbGUgbWV0aG9kcywgdGhpcyBpbnRlcmZhY2UKKyAqIHByb3ZpZGVzIHRoZSA8Y29kZT5nZXRTZXJ2bGV0Q29uZmlnPC9jb2RlPiBtZXRob2QsIHdoaWNoIHRoZSBzZXJ2bGV0IAorICogY2FuIHVzZSB0byBnZXQgYW55IHN0YXJ0dXAgaW5mb3JtYXRpb24sIGFuZCB0aGUgPGNvZGU+Z2V0U2VydmxldEluZm88L2NvZGU+CisgKiBtZXRob2QsIHdoaWNoIGFsbG93cyB0aGUgc2VydmxldCB0byByZXR1cm4gYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgaXRzZWxmLAorICogc3VjaCBhcyBhdXRob3IsIHZlcnNpb24sIGFuZCBjb3B5cmlnaHQuCisgKgorICogQGF1dGhvciAJVmFyaW91cworICogQHZlcnNpb24gCSRWZXJzaW9uJAorICoKKyAqIEBzZWUgCUdlbmVyaWNTZXJ2bGV0CisgKiBAc2VlIAlqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQKKyAqCisgKi8KKworCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZsZXQgeworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBzZXJ2bGV0IGNvbnRhaW5lciB0byBpbmRpY2F0ZSB0byBhIHNlcnZsZXQgdGhhdCB0aGUgCisgICAgICogc2VydmxldCBpcyBiZWluZyBwbGFjZWQgaW50byBzZXJ2aWNlLgorICAgICAqCisgICAgICogPHA+VGhlIHNlcnZsZXQgY29udGFpbmVyIGNhbGxzIHRoZSA8Y29kZT5pbml0PC9jb2RlPgorICAgICAqIG1ldGhvZCBleGFjdGx5IG9uY2UgYWZ0ZXIgaW5zdGFudGlhdGluZyB0aGUgc2VydmxldC4KKyAgICAgKiBUaGUgPGNvZGU+aW5pdDwvY29kZT4gbWV0aG9kIG11c3QgY29tcGxldGUgc3VjY2Vzc2Z1bGx5CisgICAgICogYmVmb3JlIHRoZSBzZXJ2bGV0IGNhbiByZWNlaXZlIGFueSByZXF1ZXN0cy4KKyAgICAgKgorICAgICAqIDxwPlRoZSBzZXJ2bGV0IGNvbnRhaW5lciBjYW5ub3QgcGxhY2UgdGhlIHNlcnZsZXQgaW50byBzZXJ2aWNlCisgICAgICogaWYgdGhlIDxjb2RlPmluaXQ8L2NvZGU+IG1ldGhvZAorICAgICAqIDxvbD4KKyAgICAgKiA8bGk+VGhyb3dzIGEgPGNvZGU+U2VydmxldEV4Y2VwdGlvbjwvY29kZT4KKyAgICAgKiA8bGk+RG9lcyBub3QgcmV0dXJuIHdpdGhpbiBhIHRpbWUgcGVyaW9kIGRlZmluZWQgYnkgdGhlIFdlYiBzZXJ2ZXIKKyAgICAgKiA8L29sPgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnCQkJYSA8Y29kZT5TZXJ2bGV0Q29uZmlnPC9jb2RlPiBvYmplY3QgCisgICAgICoJCQkJCWNvbnRhaW5pbmcgdGhlIHNlcnZsZXQncworICAgICAqIAkJCQkJY29uZmlndXJhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIAlpZiBhbiBleGNlcHRpb24gaGFzIG9jY3VycmVkIHRoYXQKKyAgICAgKgkJCQkJaW50ZXJmZXJlcyB3aXRoIHRoZSBzZXJ2bGV0J3Mgbm9ybWFsCisgICAgICoJCQkJCW9wZXJhdGlvbgorICAgICAqCisgICAgICogQHNlZSAJCQkJVW5hdmFpbGFibGVFeGNlcHRpb24KKyAgICAgKiBAc2VlIAkJCQkjZ2V0U2VydmxldENvbmZpZworICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbjsKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyBhIHtAbGluayBTZXJ2bGV0Q29uZmlnfSBvYmplY3QsIHdoaWNoIGNvbnRhaW5zCisgICAgICogaW5pdGlhbGl6YXRpb24gYW5kIHN0YXJ0dXAgcGFyYW1ldGVycyBmb3IgdGhpcyBzZXJ2bGV0LgorICAgICAqIFRoZSA8Y29kZT5TZXJ2bGV0Q29uZmlnPC9jb2RlPiBvYmplY3QgcmV0dXJuZWQgaXMgdGhlIG9uZSAKKyAgICAgKiBwYXNzZWQgdG8gdGhlIDxjb2RlPmluaXQ8L2NvZGU+IG1ldGhvZC4gCisgICAgICoKKyAgICAgKiA8cD5JbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBpbnRlcmZhY2UgYXJlIHJlc3BvbnNpYmxlIGZvciBzdG9yaW5nIHRoZSAKKyAgICAgKiA8Y29kZT5TZXJ2bGV0Q29uZmlnPC9jb2RlPiBvYmplY3Qgc28gdGhhdCB0aGlzIAorICAgICAqIG1ldGhvZCBjYW4gcmV0dXJuIGl0LiBUaGUge0BsaW5rIEdlbmVyaWNTZXJ2bGV0fQorICAgICAqIGNsYXNzLCB3aGljaCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLCBhbHJlYWR5IGRvZXMgdGhpcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCXRoZSA8Y29kZT5TZXJ2bGV0Q29uZmlnPC9jb2RlPiBvYmplY3QKKyAgICAgKgkJCXRoYXQgaW5pdGlhbGl6ZXMgdGhpcyBzZXJ2bGV0CisgICAgICoKKyAgICAgKiBAc2VlIAkJI2luaXQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFNlcnZsZXRDb25maWcgZ2V0U2VydmxldENvbmZpZygpOworICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBzZXJ2bGV0IGNvbnRhaW5lciB0byBhbGxvdyB0aGUgc2VydmxldCB0byByZXNwb25kIHRvIAorICAgICAqIGEgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIGFmdGVyIHRoZSBzZXJ2bGV0J3MgPGNvZGU+aW5pdCgpPC9jb2RlPgorICAgICAqIG1ldGhvZCBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAKKyAgICAgKiA8cD4gIFRoZSBzdGF0dXMgY29kZSBvZiB0aGUgcmVzcG9uc2UgYWx3YXlzIHNob3VsZCBiZSBzZXQgZm9yIGEgc2VydmxldCAKKyAgICAgKiB0aGF0IHRocm93cyBvciBzZW5kcyBhbiBlcnJvci4KKyAgICAgKgorICAgICAqIAorICAgICAqIDxwPlNlcnZsZXRzIHR5cGljYWxseSBydW4gaW5zaWRlIG11bHRpdGhyZWFkZWQgc2VydmxldCBjb250YWluZXJzCisgICAgICogdGhhdCBjYW4gaGFuZGxlIG11bHRpcGxlIHJlcXVlc3RzIGNvbmN1cnJlbnRseS4gRGV2ZWxvcGVycyBtdXN0IAorICAgICAqIGJlIGF3YXJlIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byBhbnkgc2hhcmVkIHJlc291cmNlcyBzdWNoIGFzIGZpbGVzLAorICAgICAqIG5ldHdvcmsgY29ubmVjdGlvbnMsIGFuZCBhcyB3ZWxsIGFzIHRoZSBzZXJ2bGV0J3MgY2xhc3MgYW5kIGluc3RhbmNlIAorICAgICAqIHZhcmlhYmxlcy4gCisgICAgICogTW9yZSBpbmZvcm1hdGlvbiBvbiBtdWx0aXRocmVhZGVkIHByb2dyYW1taW5nIGluIEphdmEgaXMgYXZhaWxhYmxlIGluIAorICAgICAqIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vU2VyaWVzL1R1dG9yaWFsL2phdmEvdGhyZWFkcy9tdWx0aXRocmVhZGVkLmh0bWwiPgorICAgICAqIHRoZSBKYXZhIHR1dG9yaWFsIG9uIG11bHRpLXRocmVhZGVkIHByb2dyYW1taW5nPC9hPi4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIHJlcSAJdGhlIDxjb2RlPlNlcnZsZXRSZXF1ZXN0PC9jb2RlPiBvYmplY3QgdGhhdCBjb250YWlucworICAgICAqCQkJdGhlIGNsaWVudCdzIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXMgCXRoZSA8Y29kZT5TZXJ2bGV0UmVzcG9uc2U8L2NvZGU+IG9iamVjdCB0aGF0IGNvbnRhaW5zCisgICAgICoJCQl0aGUgc2VydmxldCdzIHJlc3BvbnNlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gCWlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgdGhhdCBpbnRlcmZlcmVzCisgICAgICoJCQkJCXdpdGggdGhlIHNlcnZsZXQncyBub3JtYWwgb3BlcmF0aW9uIAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiAJCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJzCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmxldFJlcXVlc3QgcmVxLCBTZXJ2bGV0UmVzcG9uc2UgcmVzKQorCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKKwkKKwkKKworICAgIC8qKgorICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZsZXQsIHN1Y2gKKyAgICAgKiBhcyBhdXRob3IsIHZlcnNpb24sIGFuZCBjb3B5cmlnaHQuCisgICAgICogCisgICAgICogPHA+VGhlIHN0cmluZyB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMgc2hvdWxkCisgICAgICogYmUgcGxhaW4gdGV4dCBhbmQgbm90IG1hcmt1cCBvZiBhbnkga2luZCAoc3VjaCBhcyBIVE1MLCBYTUwsCisgICAgICogZXRjLikuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIAkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgc2VydmxldCBpbmZvcm1hdGlvbgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRJbmZvKCk7CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIENhbGxlZCBieSB0aGUgc2VydmxldCBjb250YWluZXIgdG8gaW5kaWNhdGUgdG8gYSBzZXJ2bGV0IHRoYXQgdGhlCisgICAgICogc2VydmxldCBpcyBiZWluZyB0YWtlbiBvdXQgb2Ygc2VydmljZS4gIFRoaXMgbWV0aG9kIGlzCisgICAgICogb25seSBjYWxsZWQgb25jZSBhbGwgdGhyZWFkcyB3aXRoaW4gdGhlIHNlcnZsZXQncworICAgICAqIDxjb2RlPnNlcnZpY2U8L2NvZGU+IG1ldGhvZCBoYXZlIGV4aXRlZCBvciBhZnRlciBhIHRpbWVvdXQKKyAgICAgKiBwZXJpb2QgaGFzIHBhc3NlZC4gQWZ0ZXIgdGhlIHNlcnZsZXQgY29udGFpbmVyIGNhbGxzIHRoaXMgCisgICAgICogbWV0aG9kLCBpdCB3aWxsIG5vdCBjYWxsIHRoZSA8Y29kZT5zZXJ2aWNlPC9jb2RlPiBtZXRob2QgYWdhaW4KKyAgICAgKiBvbiB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBnaXZlcyB0aGUgc2VydmxldCBhbiBvcHBvcnR1bml0eSAKKyAgICAgKiB0byBjbGVhbiB1cCBhbnkgcmVzb3VyY2VzIHRoYXQgYXJlIGJlaW5nIGhlbGQgKGZvciBleGFtcGxlLCBtZW1vcnksCisgICAgICogZmlsZSBoYW5kbGVzLCB0aHJlYWRzKSBhbmQgbWFrZSBzdXJlIHRoYXQgYW55IHBlcnNpc3RlbnQgc3RhdGUgaXMKKyAgICAgKiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgc2VydmxldCdzIGN1cnJlbnQgc3RhdGUgaW4gbWVtb3J5LgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0Q29uZmlnLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0Q29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhNmJiZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRDb25maWcuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworCisKKy8qKgorICogCisgKiBBIHNlcnZsZXQgY29uZmlndXJhdGlvbiBvYmplY3QgdXNlZCBieSBhIHNlcnZsZXQgY29udGFpbmVyCisgKiB0byBwYXNzIGluZm9ybWF0aW9uIHRvIGEgc2VydmxldCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIAorICoKKyAqLworIAorcHVibGljIGludGVyZmFjZSBTZXJ2bGV0Q29uZmlnIHsKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBzZXJ2bGV0IGluc3RhbmNlLgorICAgICAqIFRoZSBuYW1lIG1heSBiZSBwcm92aWRlZCB2aWEgc2VydmVyIGFkbWluaXN0cmF0aW9uLCBhc3NpZ25lZCBpbiB0aGUgCisgICAgICogd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgb3IgZm9yIGFuIHVucmVnaXN0ZXJlZCAoYW5kIHRodXMKKyAgICAgKiB1bm5hbWVkKSBzZXJ2bGV0IGluc3RhbmNlIGl0IHdpbGwgYmUgdGhlIHNlcnZsZXQncyBjbGFzcyBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybgkJdGhlIG5hbWUgb2YgdGhlIHNlcnZsZXQgaW5zdGFuY2UKKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHtAbGluayBTZXJ2bGV0Q29udGV4dH0gaW4gd2hpY2ggdGhlIGNhbGxlcgorICAgICAqIGlzIGV4ZWN1dGluZy4KKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybgkJYSB7QGxpbmsgU2VydmxldENvbnRleHR9IG9iamVjdCwgdXNlZAorICAgICAqCQkJYnkgdGhlIGNhbGxlciB0byBpbnRlcmFjdCB3aXRoIGl0cyBzZXJ2bGV0IAorICAgICAqICAgICAgICAgICAgICAgICAgY29udGFpbmVyCisgICAgICogCisgICAgICogQHNlZQkJU2VydmxldENvbnRleHQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIAorICAgICAqIG5hbWVkIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisgICAgICogdGhlIHBhcmFtZXRlciBkb2VzIG5vdCBleGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBuYW1lCisgICAgICoJCQlvZiB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgdmFsdWUgCisgICAgICoJCQlvZiB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBzZXJ2bGV0J3MgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycworICAgICAqIGFzIGFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdHMsIAorICAgICAqIG9yIGFuIGVtcHR5IDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBpZiB0aGUgc2VydmxldCBoYXMKKyAgICAgKiBubyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHJldHVybgkJYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIDxjb2RlPlN0cmluZzwvY29kZT4gCisgICAgICoJCQlvYmplY3RzIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBzZXJ2bGV0J3MgCisgICAgICoJCQlpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCk7CisKKworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldENvbnRleHQuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxZjg5MQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRDb250ZXh0LmphdmEKQEAgLTAsMCArMSw2NDQgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0OworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisKKy8qKgorICogCisgKiBEZWZpbmVzIGEgc2V0IG9mIG1ldGhvZHMgdGhhdCBhIHNlcnZsZXQgdXNlcyB0byBjb21tdW5pY2F0ZSB3aXRoIGl0cworICogc2VydmxldCBjb250YWluZXIsIGZvciBleGFtcGxlLCB0byBnZXQgdGhlIE1JTUUgdHlwZSBvZiBhIGZpbGUsIGRpc3BhdGNoCisgKiByZXF1ZXN0cywgb3Igd3JpdGUgdG8gYSBsb2cgZmlsZS4KKyAqCisgKiA8cD5UaGVyZSBpcyBvbmUgY29udGV4dCBwZXIgIndlYiBhcHBsaWNhdGlvbiIgcGVyIEphdmEgVmlydHVhbCBNYWNoaW5lLiAgKEEKKyAqICJ3ZWIgYXBwbGljYXRpb24iIGlzIGEgY29sbGVjdGlvbiBvZiBzZXJ2bGV0cyBhbmQgY29udGVudCBpbnN0YWxsZWQgdW5kZXIgYQorICogc3BlY2lmaWMgc3Vic2V0IG9mIHRoZSBzZXJ2ZXIncyBVUkwgbmFtZXNwYWNlIHN1Y2ggYXMgPGNvZGU+L2NhdGFsb2c8L2NvZGU+CisgKiBhbmQgcG9zc2libHkgaW5zdGFsbGVkIHZpYSBhIDxjb2RlPi53YXI8L2NvZGU+IGZpbGUuKSAKKyAqCisgKiA8cD5JbiB0aGUgY2FzZSBvZiBhIHdlYgorICogYXBwbGljYXRpb24gbWFya2VkICJkaXN0cmlidXRlZCIgaW4gaXRzIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgdGhlcmUgd2lsbAorICogYmUgb25lIGNvbnRleHQgaW5zdGFuY2UgZm9yIGVhY2ggdmlydHVhbCBtYWNoaW5lLiAgSW4gdGhpcyBzaXR1YXRpb24sIHRoZSAKKyAqIGNvbnRleHQgY2Fubm90IGJlIHVzZWQgYXMgYSBsb2NhdGlvbiB0byBzaGFyZSBnbG9iYWwgaW5mb3JtYXRpb24gKGJlY2F1c2UKKyAqIHRoZSBpbmZvcm1hdGlvbiB3b24ndCBiZSB0cnVseSBnbG9iYWwpLiAgVXNlIGFuIGV4dGVybmFsIHJlc291cmNlIGxpa2UgCisgKiBhIGRhdGFiYXNlIGluc3RlYWQuCisgKgorICogPHA+VGhlIDxjb2RlPlNlcnZsZXRDb250ZXh0PC9jb2RlPiBvYmplY3QgaXMgY29udGFpbmVkIHdpdGhpbiAKKyAqIHRoZSB7QGxpbmsgU2VydmxldENvbmZpZ30gb2JqZWN0LCB3aGljaCB0aGUgV2ViIHNlcnZlciBwcm92aWRlcyB0aGUKKyAqIHNlcnZsZXQgd2hlbiB0aGUgc2VydmxldCBpcyBpbml0aWFsaXplZC4KKyAqCisgKiBAYXV0aG9yIAlWYXJpb3VzCisgKiBAdmVyc2lvbiAJJFZlcnNpb24kCisgKgorICogQHNlZSAJU2VydmxldCNnZXRTZXJ2bGV0Q29uZmlnCisgKiBAc2VlIAlTZXJ2bGV0Q29uZmlnI2dldFNlcnZsZXRDb250ZXh0CisgKgorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgU2VydmxldENvbnRleHQgeworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+IG9iamVjdCB0aGF0IAorICAgICAqIGNvcnJlc3BvbmRzIHRvIGEgc3BlY2lmaWVkIFVSTCBvbiB0aGUgc2VydmVyLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgYWxsb3dzIHNlcnZsZXRzIHRvIGdhaW4KKyAgICAgKiBhY2Nlc3MgdG8gdGhlIGNvbnRleHQgZm9yIHZhcmlvdXMgcGFydHMgb2YgdGhlIHNlcnZlciwgYW5kIGFzCisgICAgICogbmVlZGVkIG9idGFpbiB7QGxpbmsgUmVxdWVzdERpc3BhdGNoZXJ9IG9iamVjdHMgZnJvbSB0aGUgY29udGV4dC4KKyAgICAgKiBUaGUgZ2l2ZW4gcGF0aCBtdXN0IGJlIGJlZ2luIHdpdGggIi8iLCBpcyBpbnRlcnByZXRlZCByZWxhdGl2ZSAKKyAgICAgKiB0byB0aGUgc2VydmVyJ3MgZG9jdW1lbnQgcm9vdCBhbmQgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBjb250ZXh0IHJvb3RzIG9mCisgICAgICogb3RoZXIgd2ViIGFwcGxpY2F0aW9ucyBob3N0ZWQgb24gdGhpcyBjb250YWluZXIuCisgICAgICogCisgICAgICogPHA+SW4gYSBzZWN1cml0eSBjb25zY2lvdXMgZW52aXJvbm1lbnQsIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBtYXkKKyAgICAgKiByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gZm9yIGEgZ2l2ZW4gVVJMLgorICAgICAqICAgICAgIAorICAgICAqIEBwYXJhbSB1cmlwYXRoIAlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgY29udGV4dCBwYXRoIG9mCisgICAgICoJCQlhbm90aGVyIHdlYiBhcHBsaWNhdGlvbiBpbiB0aGUgY29udGFpbmVyLgorICAgICAqIEByZXR1cm4JCXRoZSA8Y29kZT5TZXJ2bGV0Q29udGV4dDwvY29kZT4gb2JqZWN0IHRoYXQKKyAgICAgKgkJCWNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lZCBVUkwsIG9yIG51bGwgaWYgZWl0aGVyCisJCQlub25lIGV4aXN0cyBvciB0aGUgY29udGFpbmVyIHdpc2hlcyB0byByZXN0cmljdCAKKyAgICAgKiAJCQl0aGlzIGFjY2Vzcy4KKyAgICAgKgorICAgICAqIEBzZWUgCQlSZXF1ZXN0RGlzcGF0Y2hlcgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0Q29udGV4dChTdHJpbmcgdXJpcGF0aCk7CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBKYXZhIFNlcnZsZXQgQVBJIHRoYXQgdGhpcworICAgICAqIHNlcnZsZXQgY29udGFpbmVyIHN1cHBvcnRzLiBBbGwgaW1wbGVtZW50YXRpb25zIHRoYXQgY29tcGx5CisgICAgICogd2l0aCBWZXJzaW9uIDIuNCBtdXN0IGhhdmUgdGhpcyBtZXRob2QKKyAgICAgKiByZXR1cm4gdGhlIGludGVnZXIgMi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gCQkyCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldE1ham9yVmVyc2lvbigpOworICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWlub3IgdmVyc2lvbiBvZiB0aGUgU2VydmxldCBBUEkgdGhhdCB0aGlzCisgICAgICogc2VydmxldCBjb250YWluZXIgc3VwcG9ydHMuIEFsbCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjb21wbHkKKyAgICAgKiB3aXRoIFZlcnNpb24gMi40IG11c3QgaGF2ZSB0aGlzIG1ldGhvZAorICAgICAqIHJldHVybiB0aGUgaW50ZWdlciA0LgorICAgICAqCisgICAgICogQHJldHVybiAJCTQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIGludCBnZXRNaW5vclZlcnNpb24oKTsKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIE1JTUUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorICAgICAqIHRoZSBNSU1FIHR5cGUgaXMgbm90IGtub3duLiBUaGUgTUlNRSB0eXBlIGlzIGRldGVybWluZWQKKyAgICAgKiBieSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgc2VydmxldCBjb250YWluZXIsIGFuZCBtYXkgYmUgc3BlY2lmaWVkCisgICAgICogaW4gYSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yLiBDb21tb24gTUlNRQorICAgICAqIHR5cGVzIGFyZSA8Y29kZT4idGV4dC9odG1sIjwvY29kZT4gYW5kIDxjb2RlPiJpbWFnZS9naWYiPC9jb2RlPi4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtICAgZmlsZSAgICBhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgbmFtZQorICAgICAqCQkJb2YgYSBmaWxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIAkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIGZpbGUncyBNSU1FIHR5cGUKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZShTdHJpbmcgZmlsZSk7CisgICAgCisgICAgLyoqCisgICAgKiBSZXR1cm5zIGEgZGlyZWN0b3J5LWxpa2UgbGlzdGluZyBvZiBhbGwgdGhlIHBhdGhzIHRvIHJlc291cmNlcyB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiB3aG9zZSBsb25nZXN0IHN1Yi1wYXRoCisgICAgKiBtYXRjaGVzIHRoZSBzdXBwbGllZCBwYXRoIGFyZ3VtZW50LiBQYXRocyBpbmRpY2F0aW5nIHN1YmRpcmVjdG9yeSBwYXRocyBlbmQgd2l0aCBhICcvJy4gVGhlIHJldHVybmVkIHBhdGhzIGFyZSBhbGwgCisgICAgKiByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGFuZCBoYXZlIGEgbGVhZGluZyAnLycuIEZvciBleGFtcGxlLCBmb3IgYSB3ZWIgYXBwbGljYXRpb24gCisgICAgKiBjb250YWluaW5nPGJyPjxicj4KKworICAgICogL3dlbGNvbWUuaHRtbDxicj4KKyAgICAqIC9jYXRhbG9nL2luZGV4Lmh0bWw8YnI+CisgICAgKiAvY2F0YWxvZy9wcm9kdWN0cy5odG1sPGJyPgorICAgICogL2NhdGFsb2cvb2ZmZXJzL2Jvb2tzLmh0bWw8YnI+CisgICAgKiAvY2F0YWxvZy9vZmZlcnMvbXVzaWMuaHRtbDxicj4KKyAgICAqIC9jdXN0b21lci9sb2dpbi5qc3A8YnI+CisgICAgKiAvV0VCLUlORi93ZWIueG1sPGJyPgorICAgICogL1dFQi1JTkYvY2xhc3Nlcy9jb20uYWNtZS5PcmRlclNlcnZsZXQuY2xhc3MsPGJyPjxicj4KKyAgICAqCisgICAgKiBnZXRSZXNvdXJjZVBhdGhzKCIvIikgcmV0dXJucyB7Ii93ZWxjb21lLmh0bWwiLCAiL2NhdGFsb2cvIiwgIi9jdXN0b21lci8iLCAiL1dFQi1JTkYvIn08YnI+CisgICAgKiBnZXRSZXNvdXJjZVBhdGhzKCIvY2F0YWxvZy8iKSByZXR1cm5zIHsiL2NhdGFsb2cvaW5kZXguaHRtbCIsICIvY2F0YWxvZy9wcm9kdWN0cy5odG1sIiwgIi9jYXRhbG9nL29mZmVycy8ifS48YnI+CisJICAgCisKKworICAgICpAcGFyYW0gcGF0aAkJdGhlIHBhcnRpYWwgcGF0aCB1c2VkIHRvIG1hdGNoIHRoZSByZXNvdXJjZXMsCisgICAgKgkJCQl3aGljaCBtdXN0IHN0YXJ0IHdpdGggYSAvCisgICAgKkByZXR1cm4gYSBTZXQgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IGxpc3RpbmcsIG9yIG51bGwgaWYgdGhlcmUgYXJlIG5vIHJlc291cmNlcyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIHdob3NlIHBhdGgKKwkqIGJlZ2lucyB3aXRoIHRoZSBzdXBwbGllZCBwYXRoLgorCisgICAgKiBAc2luY2UgU2VydmxldCAyLjMKKyAgICAqLworICAgIAorICAgIHB1YmxpYyBTZXQgZ2V0UmVzb3VyY2VQYXRocyhTdHJpbmcgcGF0aCk7CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgVVJMIHRvIHRoZSByZXNvdXJjZSB0aGF0IGlzIG1hcHBlZCB0byBhIHNwZWNpZmllZAorICAgICAqIHBhdGguIFRoZSBwYXRoIG11c3QgYmVnaW4gd2l0aCBhICIvIiBhbmQgaXMgaW50ZXJwcmV0ZWQKKyAgICAgKiBhcyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBjb250ZXh0IHJvb3QuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBhbGxvd3MgdGhlIHNlcnZsZXQgY29udGFpbmVyIHRvIG1ha2UgYSByZXNvdXJjZSAKKyAgICAgKiBhdmFpbGFibGUgdG8gc2VydmxldHMgZnJvbSBhbnkgc291cmNlLiBSZXNvdXJjZXMgCisgICAgICogY2FuIGJlIGxvY2F0ZWQgb24gYSBsb2NhbCBvciByZW1vdGUKKyAgICAgKiBmaWxlIHN5c3RlbSwgaW4gYSBkYXRhYmFzZSwgb3IgaW4gYSA8Y29kZT4ud2FyPC9jb2RlPiBmaWxlLiAKKyAgICAgKgorICAgICAqIDxwPlRoZSBzZXJ2bGV0IGNvbnRhaW5lciBtdXN0IGltcGxlbWVudCB0aGUgVVJMIGhhbmRsZXJzCisgICAgICogYW5kIDxjb2RlPlVSTENvbm5lY3Rpb248L2NvZGU+IG9iamVjdHMgdGhhdCBhcmUgbmVjZXNzYXJ5CisgICAgICogdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiBpZiBubyByZXNvdXJjZSBpcyBtYXBwZWQgdG8gdGhlIHBhdGhuYW1lLgorICAgICAqCisgICAgICogPHA+U29tZSBjb250YWluZXJzIG1heSBhbGxvdyB3cml0aW5nIHRvIHRoZSBVUkwgcmV0dXJuZWQgYnkKKyAgICAgKiB0aGlzIG1ldGhvZCB1c2luZyB0aGUgbWV0aG9kcyBvZiB0aGUgVVJMIGNsYXNzLgorICAgICAqCisgICAgICogPHA+VGhlIHJlc291cmNlIGNvbnRlbnQgaXMgcmV0dXJuZWQgZGlyZWN0bHksIHNvIGJlIGF3YXJlIHRoYXQgCisgICAgICogcmVxdWVzdGluZyBhIDxjb2RlPi5qc3A8L2NvZGU+IHBhZ2UgcmV0dXJucyB0aGUgSlNQIHNvdXJjZSBjb2RlLgorICAgICAqIFVzZSBhIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyPC9jb2RlPiBpbnN0ZWFkIHRvIGluY2x1ZGUgcmVzdWx0cyBvZiAKKyAgICAgKiBhbiBleGVjdXRpb24uCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBoYXMgYSBkaWZmZXJlbnQgcHVycG9zZSB0aGFuCisgICAgICogPGNvZGU+amF2YS5sYW5nLkNsYXNzLmdldFJlc291cmNlPC9jb2RlPiwKKyAgICAgKiB3aGljaCBsb29rcyB1cCByZXNvdXJjZXMgYmFzZWQgb24gYSBjbGFzcyBsb2FkZXIuIFRoaXMKKyAgICAgKiBtZXRob2QgZG9lcyBub3QgdXNlIGNsYXNzIGxvYWRlcnMuCisgICAgICogCisgICAgICogQHBhcmFtIHBhdGggCQkJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nCisgICAgICoJCQkJCQl0aGUgcGF0aCB0byB0aGUgcmVzb3VyY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gCQkJCQl0aGUgcmVzb3VyY2UgbG9jYXRlZCBhdCB0aGUgbmFtZWQgcGF0aCwKKyAgICAgKiAJCQkJCQlvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyByZXNvdXJjZQorICAgICAqCQkJCQkJYXQgdGhhdCBwYXRoCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiAJaWYgdGhlIHBhdGhuYW1lIGlzIG5vdCBnaXZlbiBpbiAKKyAgICAgKiAJCQkJCQl0aGUgY29ycmVjdCBmb3JtCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyBwYXRoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgbG9jYXRlZCBhdCB0aGUgbmFtZWQgcGF0aCBhcworICAgICAqIGFuIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiA8cD5UaGUgZGF0YSBpbiB0aGUgPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IGNhbiBiZSAKKyAgICAgKiBvZiBhbnkgdHlwZSBvciBsZW5ndGguIFRoZSBwYXRoIG11c3QgYmUgc3BlY2lmaWVkIGFjY29yZGluZworICAgICAqIHRvIHRoZSBydWxlcyBnaXZlbiBpbiA8Y29kZT5nZXRSZXNvdXJjZTwvY29kZT4uCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyByZXNvdXJjZSBleGlzdHMgYXQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHBhdGguIAorICAgICAqIAorICAgICAqIDxwPk1ldGEtaW5mb3JtYXRpb24gc3VjaCBhcyBjb250ZW50IGxlbmd0aCBhbmQgY29udGVudCB0eXBlCisgICAgICogdGhhdCBpcyBhdmFpbGFibGUgdmlhIDxjb2RlPmdldFJlc291cmNlPC9jb2RlPgorICAgICAqIG1ldGhvZCBpcyBsb3N0IHdoZW4gdXNpbmcgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiA8cD5UaGUgc2VydmxldCBjb250YWluZXIgbXVzdCBpbXBsZW1lbnQgdGhlIFVSTCBoYW5kbGVycworICAgICAqIGFuZCA8Y29kZT5VUkxDb25uZWN0aW9uPC9jb2RlPiBvYmplY3RzIG5lY2Vzc2FyeSB0byBhY2Nlc3MKKyAgICAgKiB0aGUgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBkaWZmZXJlbnQgZnJvbSAKKyAgICAgKiA8Y29kZT5qYXZhLmxhbmcuQ2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbTwvY29kZT4sCisgICAgICogd2hpY2ggdXNlcyBhIGNsYXNzIGxvYWRlci4gVGhpcyBtZXRob2QgYWxsb3dzIHNlcnZsZXQgY29udGFpbmVycyAKKyAgICAgKiB0byBtYWtlIGEgcmVzb3VyY2UgYXZhaWxhYmxlCisgICAgICogdG8gYSBzZXJ2bGV0IGZyb20gYW55IGxvY2F0aW9uLCB3aXRob3V0IHVzaW5nIGEgY2xhc3MgbG9hZGVyLgorICAgICAqIAorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBwYXRoCisgICAgICoJCQl0byB0aGUgcmVzb3VyY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gCQl0aGUgPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IHJldHVybmVkIHRvIHRoZSAKKyAgICAgKgkJCXNlcnZsZXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHJlc291cmNlCisgICAgICoJCQlleGlzdHMgYXQgdGhlIHNwZWNpZmllZCBwYXRoIAorICAgICAqCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyBwYXRoKTsKKyAgICAKKworCisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFJlcXVlc3REaXNwYXRjaGVyfSBvYmplY3QgdGhhdCBhY3RzCisgICAgICogYXMgYSB3cmFwcGVyIGZvciB0aGUgcmVzb3VyY2UgbG9jYXRlZCBhdCB0aGUgZ2l2ZW4gcGF0aC4KKyAgICAgKiBBIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyPC9jb2RlPiBvYmplY3QgY2FuIGJlIHVzZWQgdG8gZm9yd2FyZCAKKyAgICAgKiBhIHJlcXVlc3QgdG8gdGhlIHJlc291cmNlIG9yIHRvIGluY2x1ZGUgdGhlIHJlc291cmNlIGluIGEgcmVzcG9uc2UuCisgICAgICogVGhlIHJlc291cmNlIGNhbiBiZSBkeW5hbWljIG9yIHN0YXRpYy4KKyAgICAgKgorICAgICAqIDxwPlRoZSBwYXRobmFtZSBtdXN0IGJlZ2luIHdpdGggYSAiLyIgYW5kIGlzIGludGVycHJldGVkIGFzIHJlbGF0aXZlCisgICAgICogdG8gdGhlIGN1cnJlbnQgY29udGV4dCByb290LiAgVXNlIDxjb2RlPmdldENvbnRleHQ8L2NvZGU+IHRvIG9idGFpbgorICAgICAqIGEgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+IGZvciByZXNvdXJjZXMgaW4gZm9yZWlnbiBjb250ZXh0cy4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSA8Y29kZT5TZXJ2bGV0Q29udGV4dDwvY29kZT4KKyAgICAgKiBjYW5ub3QgcmV0dXJuIGEgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBwYXRobmFtZQorICAgICAqCQkJdG8gdGhlIHJlc291cmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIAkJYSA8Y29kZT5SZXF1ZXN0RGlzcGF0Y2hlcjwvY29kZT4gb2JqZWN0CisgICAgICoJCQl0aGF0IGFjdHMgYXMgYSB3cmFwcGVyIGZvciB0aGUgcmVzb3VyY2UKKyAgICAgKgkJCWF0IHRoZSBzcGVjaWZpZWQgcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisgICAgICoJCQl0aGUgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+IGNhbm5vdCByZXR1cm4KKyAgICAgKgkJCWEgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+CisgICAgICoKKyAgICAgKiBAc2VlIAkJUmVxdWVzdERpc3BhdGNoZXIKKyAgICAgKiBAc2VlIAkJU2VydmxldENvbnRleHQjZ2V0Q29udGV4dAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0UmVxdWVzdERpc3BhdGNoZXIoU3RyaW5nIHBhdGgpOworCisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgUmVxdWVzdERpc3BhdGNoZXJ9IG9iamVjdCB0aGF0IGFjdHMKKyAgICAgKiBhcyBhIHdyYXBwZXIgZm9yIHRoZSBuYW1lZCBzZXJ2bGV0LgorICAgICAqCisgICAgICogPHA+U2VydmxldHMgKGFuZCBKU1AgcGFnZXMgYWxzbykgbWF5IGJlIGdpdmVuIG5hbWVzIHZpYSBzZXJ2ZXIgCisgICAgICogYWRtaW5pc3RyYXRpb24gb3IgdmlhIGEgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAgICAgKiBBIHNlcnZsZXQgaW5zdGFuY2UgY2FuIGRldGVybWluZSBpdHMgbmFtZSB1c2luZyAKKyAgICAgKiB7QGxpbmsgU2VydmxldENvbmZpZyNnZXRTZXJ2bGV0TmFtZX0uCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSAKKyAgICAgKiA8Y29kZT5TZXJ2bGV0Q29udGV4dDwvY29kZT4KKyAgICAgKiBjYW5ub3QgcmV0dXJuIGEgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+IGZvciBhbnkgcmVhc29uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBuYW1lCisgICAgICoJCQlvZiBhIHNlcnZsZXQgdG8gd3JhcAorICAgICAqCisgICAgICogQHJldHVybiAJCWEgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+IG9iamVjdAorICAgICAqCQkJdGhhdCBhY3RzIGFzIGEgd3JhcHBlciBmb3IgdGhlIG5hbWVkIHNlcnZsZXQsCisgICAgICoJCQlvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+CisgICAgICoJCQljYW5ub3QgcmV0dXJuIGEgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+CisgICAgICoKKyAgICAgKiBAc2VlIAkJUmVxdWVzdERpc3BhdGNoZXIKKyAgICAgKiBAc2VlIAkJU2VydmxldENvbnRleHQjZ2V0Q29udGV4dAorICAgICAqIEBzZWUgCQlTZXJ2bGV0Q29uZmlnI2dldFNlcnZsZXROYW1lCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBSZXF1ZXN0RGlzcGF0Y2hlciBnZXROYW1lZERpc3BhdGNoZXIoU3RyaW5nIG5hbWUpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgIC8qKgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQJQXMgb2YgSmF2YSBTZXJ2bGV0IEFQSSAyLjEsIHdpdGggbm8gZGlyZWN0IHJlcGxhY2VtZW50LgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2Qgd2FzIG9yaWdpbmFsbHkgZGVmaW5lZCB0byByZXRyaWV2ZSBhIHNlcnZsZXQKKyAgICAgKiBmcm9tIGEgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+LiBJbiB0aGlzIHZlcnNpb24sIHRoaXMgbWV0aG9kIAorICAgICAqIGFsd2F5cyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGFuZCByZW1haW5zIG9ubHkgdG8gcHJlc2VydmUgCisgICAgICogYmluYXJ5IGNvbXBhdGliaWxpdHkuIFRoaXMgbWV0aG9kIHdpbGwgYmUgcGVybWFuZW50bHkgcmVtb3ZlZCAKKyAgICAgKiBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoZSBKYXZhIFNlcnZsZXQgQVBJLgorICAgICAqCisgICAgICogPHA+SW4gbGlldSBvZiB0aGlzIG1ldGhvZCwgc2VydmxldHMgY2FuIHNoYXJlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSAKKyAgICAgKiA8Y29kZT5TZXJ2bGV0Q29udGV4dDwvY29kZT4gY2xhc3MgYW5kIGNhbiBwZXJmb3JtIHNoYXJlZCBidXNpbmVzcyBsb2dpYworICAgICAqIGJ5IGludm9raW5nIG1ldGhvZHMgb24gY29tbW9uIG5vbi1zZXJ2bGV0IGNsYXNzZXMuCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTZXJ2bGV0IGdldFNlcnZsZXQoU3RyaW5nIG5hbWUpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uOworICAgIAorICAKKyAgCisgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZAlBcyBvZiBKYXZhIFNlcnZsZXQgQVBJIDIuMCwgd2l0aCBubyByZXBsYWNlbWVudC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHdhcyBvcmlnaW5hbGx5IGRlZmluZWQgdG8gcmV0dXJuIGFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPgorICAgICAqIG9mIGFsbCB0aGUgc2VydmxldHMga25vd24gdG8gdGhpcyBzZXJ2bGV0IGNvbnRleHQuIEluIHRoaXMKKyAgICAgKiB2ZXJzaW9uLCB0aGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyBhbiBlbXB0eSBlbnVtZXJhdGlvbiBhbmQKKyAgICAgKiByZW1haW5zIG9ubHkgdG8gcHJlc2VydmUgYmluYXJ5IGNvbXBhdGliaWxpdHkuIFRoaXMgbWV0aG9kCisgICAgICogd2lsbCBiZSBwZXJtYW5lbnRseSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgdGhlIEphdmEKKyAgICAgKiBTZXJ2bGV0IEFQSS4KKyAgICAgKgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRTZXJ2bGV0cygpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQJQXMgb2YgSmF2YSBTZXJ2bGV0IEFQSSAyLjEsIHdpdGggbm8gcmVwbGFjZW1lbnQuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCB3YXMgb3JpZ2luYWxseSBkZWZpbmVkIHRvIHJldHVybiBhbiAKKyAgICAgKiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4KKyAgICAgKiBvZiBhbGwgdGhlIHNlcnZsZXQgbmFtZXMga25vd24gdG8gdGhpcyBjb250ZXh0LiBJbiB0aGlzIHZlcnNpb24sCisgICAgICogdGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgYW4gZW1wdHkgPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IGFuZCAKKyAgICAgKiByZW1haW5zIG9ubHkgdG8gcHJlc2VydmUgYmluYXJ5IGNvbXBhdGliaWxpdHkuIFRoaXMgbWV0aG9kIHdpbGwgCisgICAgICogYmUgcGVybWFuZW50bHkgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoZSBKYXZhIFNlcnZsZXQgQVBJLgorICAgICAqCisgICAgICovCisgCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFNlcnZsZXROYW1lcygpOworICAgIAorICAKKyAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICoKKyAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBtZXNzYWdlIHRvIGEgc2VydmxldCBsb2cgZmlsZSwgdXN1YWxseQorICAgICAqIGFuIGV2ZW50IGxvZy4gVGhlIG5hbWUgYW5kIHR5cGUgb2YgdGhlIHNlcnZsZXQgbG9nIGZpbGUgaXMgCisgICAgICogc3BlY2lmaWMgdG8gdGhlIHNlcnZsZXQgY29udGFpbmVyLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNnIAlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgCisgICAgICoJCQltZXNzYWdlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGxvZyBmaWxlCisgICAgICoKKyAgICAgKi8KKyAgICAgCisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtc2cpOworICAgIAorICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQJQXMgb2YgSmF2YSBTZXJ2bGV0IEFQSSAyLjEsIHVzZQorICAgICAqIAkJCXtAbGluayAjbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKX0gCisgICAgICoJCQlpbnN0ZWFkLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2Qgd2FzIG9yaWdpbmFsbHkgZGVmaW5lZCB0byB3cml0ZSBhbiAKKyAgICAgKiBleGNlcHRpb24ncyBzdGFjayB0cmFjZSBhbmQgYW4gZXhwbGFuYXRvcnkgZXJyb3IgbWVzc2FnZQorICAgICAqIHRvIHRoZSBzZXJ2bGV0IGxvZyBmaWxlLgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBsb2coRXhjZXB0aW9uIGV4Y2VwdGlvbiwgU3RyaW5nIG1zZyk7CisgICAgCisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYW4gZXhwbGFuYXRvcnkgbWVzc2FnZSBhbmQgYSBzdGFjayB0cmFjZQorICAgICAqIGZvciBhIGdpdmVuIDxjb2RlPlRocm93YWJsZTwvY29kZT4gZXhjZXB0aW9uCisgICAgICogdG8gdGhlIHNlcnZsZXQgbG9nIGZpbGUuIFRoZSBuYW1lIGFuZCB0eXBlIG9mIHRoZSBzZXJ2bGV0IGxvZyAKKyAgICAgKiBmaWxlIGlzIHNwZWNpZmljIHRvIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciwgdXN1YWxseSBhbiBldmVudCBsb2cuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIAkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRoYXQgCisgICAgICoJCQkJZGVzY3JpYmVzIHRoZSBlcnJvciBvciBleGNlcHRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aHJvd2FibGUgCXRoZSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IGVycm9yIAorICAgICAqCQkJCW9yIGV4Y2VwdGlvbgorICAgICAqCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIHRoZSByZWFsIHBhdGggCisgICAgICogZm9yIGEgZ2l2ZW4gdmlydHVhbCBwYXRoLiBGb3IgZXhhbXBsZSwgdGhlIHBhdGggIi9pbmRleC5odG1sIgorICAgICAqIHJldHVybnMgdGhlIGFic29sdXRlIGZpbGUgcGF0aCBvbiB0aGUgc2VydmVyJ3MgZmlsZXN5c3RlbSB3b3VsZCBiZQorICAgICAqIHNlcnZlZCBieSBhIHJlcXVlc3QgZm9yICJodHRwOi8vaG9zdC9jb250ZXh0UGF0aC9pbmRleC5odG1sIiwKKyAgICAgKiB3aGVyZSBjb250ZXh0UGF0aCBpcyB0aGUgY29udGV4dCBwYXRoIG9mIHRoaXMgU2VydmxldENvbnRleHQuLgorICAgICAqCisgICAgICogPHA+VGhlIHJlYWwgcGF0aCByZXR1cm5lZCB3aWxsIGJlIGluIGEgZm9ybQorICAgICAqIGFwcHJvcHJpYXRlIHRvIHRoZSBjb21wdXRlciBhbmQgb3BlcmF0aW5nIHN5c3RlbSBvbgorICAgICAqIHdoaWNoIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBpcyBydW5uaW5nLCBpbmNsdWRpbmcgdGhlCisgICAgICogcHJvcGVyIHBhdGggc2VwYXJhdG9ycy4gVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqIGlmIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBjYW5ub3QgdHJhbnNsYXRlIHRoZSB2aXJ0dWFsIHBhdGgKKyAgICAgKiB0byBhIHJlYWwgcGF0aCBmb3IgYW55IHJlYXNvbiAoc3VjaCBhcyB3aGVuIHRoZSBjb250ZW50IGlzCisgICAgICogYmVpbmcgbWFkZSBhdmFpbGFibGUgZnJvbSBhIDxjb2RlPi53YXI8L2NvZGU+IGFyY2hpdmUpLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCAJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgYSB2aXJ0dWFsIHBhdGgKKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybiAJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSByZWFsIHBhdGgsCisgICAgICogICAgICAgICAgICAgICAgICBvciBudWxsIGlmIHRoZSB0cmFuc2xhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkCisgICAgICoJCQkKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRSZWFsUGF0aChTdHJpbmcgcGF0aCk7CisgICAgCisgICAgCisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhlIHNlcnZsZXQgY29udGFpbmVyIG9uIHdoaWNoCisgICAgICogdGhlIHNlcnZsZXQgaXMgcnVubmluZy4gCisgICAgICoKKyAgICAgKiA8cD5UaGUgZm9ybSBvZiB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzIAorICAgICAqIDxpPnNlcnZlcm5hbWU8L2k+LzxpPnZlcnNpb25udW1iZXI8L2k+LgorICAgICAqIEZvciBleGFtcGxlLCB0aGUgSmF2YVNlcnZlciBXZWIgRGV2ZWxvcG1lbnQgS2l0IG1heSByZXR1cm4gdGhlIHN0cmluZworICAgICAqIDxjb2RlPkphdmFTZXJ2ZXIgV2ViIERldiBLaXQvMS4wPC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPlRoZSBzZXJ2bGV0IGNvbnRhaW5lciBtYXkgcmV0dXJuIG90aGVyIG9wdGlvbmFsIGluZm9ybWF0aW9uIAorICAgICAqIGFmdGVyIHRoZSBwcmltYXJ5IHN0cmluZyBpbiBwYXJlbnRoZXNlcywgZm9yIGV4YW1wbGUsCisgICAgICogPGNvZGU+SmF2YVNlcnZlciBXZWIgRGV2IEtpdC8xLjAgKEpESyAxLjEuNjsgV2luZG93cyBOVCA0LjAgeDg2KTwvY29kZT4uCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4gCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyBhdCBsZWFzdCB0aGUgCisgICAgICoJCQlzZXJ2bGV0IGNvbnRhaW5lciBuYW1lIGFuZCB2ZXJzaW9uIG51bWJlcgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckluZm8oKTsKKyAgICAKKyAgICAKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkCisgICAgICogY29udGV4dC13aWRlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIAorICAgICAqIHBhcmFtZXRlciBkb2VzIG5vdCBleGlzdC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGNhbiBtYWtlIGF2YWlsYWJsZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHVzZWZ1bAorICAgICAqIHRvIGFuIGVudGlyZSAid2ViIGFwcGxpY2F0aW9uIi4gIEZvciBleGFtcGxlLCBpdCBjYW4gcHJvdmlkZSBhIAorICAgICAqIHdlYm1hc3RlcidzIGVtYWlsIGFkZHJlc3Mgb3IgdGhlIG5hbWUgb2YgYSBzeXN0ZW0gdGhhdCBob2xkcyAKKyAgICAgKiBjcml0aWNhbCBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtCW5hbWUJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlCisgICAgICogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgd2hvc2UgdmFsdWUgaXMgcmVxdWVzdGVkCisgICAgICogCisgICAgICogQHJldHVybiAJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIGF0IGxlYXN0IHRoZSAKKyAgICAgKgkJCXNlcnZsZXQgY29udGFpbmVyIG5hbWUgYW5kIHZlcnNpb24gbnVtYmVyCisgICAgICoKKyAgICAgKiBAc2VlIFNlcnZsZXRDb25maWcjZ2V0SW5pdFBhcmFtZXRlcgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBuYW1lKTsKKyAgICAKKyAgICAKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGNvbnRleHQncyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGFzIGFuCisgICAgICogPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0cywgb3IgYW4KKyAgICAgKiBlbXB0eSA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gaWYgdGhlIGNvbnRleHQgaGFzIG5vIGluaXRpYWxpemF0aW9uCisgICAgICogcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gCQlhbiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gb2YgPGNvZGU+U3RyaW5nPC9jb2RlPiAKKyAgICAgKiAgICAgICAgICAgICAgICAgIG9iamVjdHMgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIGNvbnRleHQncworICAgICAqICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycworICAgICAqCisgICAgICogQHNlZSBTZXJ2bGV0Q29uZmlnI2dldEluaXRQYXJhbWV0ZXIKKyAgICAgKi8KKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRJbml0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNlcnZsZXQgY29udGFpbmVyIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCAKKyAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lLgorICAgICAqIEFuIGF0dHJpYnV0ZSBhbGxvd3MgYSBzZXJ2bGV0IGNvbnRhaW5lciB0byBnaXZlIHRoZQorICAgICAqIHNlcnZsZXQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBub3QKKyAgICAgKiBhbHJlYWR5IHByb3ZpZGVkIGJ5IHRoaXMgaW50ZXJmYWNlLiBTZWUgeW91cgorICAgICAqIHNlcnZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBhYm91dCBpdHMgYXR0cmlidXRlcy4KKyAgICAgKiBBIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgY2FuIGJlIHJldHJpZXZlZCB1c2luZworICAgICAqIDxjb2RlPmdldEF0dHJpYnV0ZU5hbWVzPC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPlRoZSBhdHRyaWJ1dGUgaXMgcmV0dXJuZWQgYXMgYSA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPgorICAgICAqIG9yIHNvbWUgc3ViY2xhc3MuCisgICAgICogQXR0cmlidXRlIG5hbWVzIHNob3VsZCBmb2xsb3cgdGhlIHNhbWUgY29udmVudGlvbiBhcyBwYWNrYWdlCisgICAgICogbmFtZXMuIFRoZSBKYXZhIFNlcnZsZXQgQVBJIHNwZWNpZmljYXRpb24gcmVzZXJ2ZXMgbmFtZXMKKyAgICAgKiBtYXRjaGluZyA8Y29kZT5qYXZhLio8L2NvZGU+LCA8Y29kZT5qYXZheC4qPC9jb2RlPiwKKyAgICAgKiBhbmQgPGNvZGU+c3VuLio8L2NvZGU+LgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSAJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIG5hbWUgCisgICAgICoJCQlvZiB0aGUgYXR0cmlidXRlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIAkJYW4gPGNvZGU+T2JqZWN0PC9jb2RlPiBjb250YWluaW5nIHRoZSB2YWx1ZSAKKyAgICAgKgkJCW9mIHRoZSBhdHRyaWJ1dGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICoJCQlpZiBubyBhdHRyaWJ1dGUgZXhpc3RzIG1hdGNoaW5nIHRoZSBnaXZlbgorICAgICAqCQkJbmFtZQorICAgICAqCisgICAgICogQHNlZSAJCVNlcnZsZXRDb250ZXh0I2dldEF0dHJpYnV0ZU5hbWVzCisgICAgICoKKyAgICAgKi8KKyAgCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gY29udGFpbmluZyB0aGUgCisgICAgICogYXR0cmlidXRlIG5hbWVzIGF2YWlsYWJsZQorICAgICAqIHdpdGhpbiB0aGlzIHNlcnZsZXQgY29udGV4dC4gVXNlIHRoZQorICAgICAqIHtAbGluayAjZ2V0QXR0cmlidXRlfSBtZXRob2Qgd2l0aCBhbiBhdHRyaWJ1dGUgbmFtZQorICAgICAqIHRvIGdldCB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHJldHVybiAJCWFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiBhdHRyaWJ1dGUgCisgICAgICoJCQluYW1lcworICAgICAqCisgICAgICogQHNlZQkJI2dldEF0dHJpYnV0ZQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QXR0cmlidXRlTmFtZXMoKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKgorICAgICAqIEJpbmRzIGFuIG9iamVjdCB0byBhIGdpdmVuIGF0dHJpYnV0ZSBuYW1lIGluIHRoaXMgc2VydmxldCBjb250ZXh0LiBJZgorICAgICAqIHRoZSBuYW1lIHNwZWNpZmllZCBpcyBhbHJlYWR5IHVzZWQgZm9yIGFuIGF0dHJpYnV0ZSwgdGhpcworICAgICAqIG1ldGhvZCB3aWxsIHJlcGxhY2UgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBuZXcgdG8gdGhlIG5ldyBhdHRyaWJ1dGUuCisgICAgICogPHA+SWYgbGlzdGVuZXJzIGFyZSBjb25maWd1cmVkIG9uIHRoZSA8Y29kZT5TZXJ2bGV0Q29udGV4dDwvY29kZT4gdGhlICAKKyAgICAgKiBjb250YWluZXIgbm90aWZpZXMgdGhlbSBhY2NvcmRpbmdseS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIG51bGwgdmFsdWUgaXMgcGFzc2VkLCB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgCisgICAgICogPGNvZGU+cmVtb3ZlQXR0cmlidXRlKCk8L2NvZGU+LgorICAgICAqIAorICAgICAqIDxwPkF0dHJpYnV0ZSBuYW1lcyBzaG91bGQgZm9sbG93IHRoZSBzYW1lIGNvbnZlbnRpb24gYXMgcGFja2FnZQorICAgICAqIG5hbWVzLiBUaGUgSmF2YSBTZXJ2bGV0IEFQSSBzcGVjaWZpY2F0aW9uIHJlc2VydmVzIG5hbWVzCisgICAgICogbWF0Y2hpbmcgPGNvZGU+amF2YS4qPC9jb2RlPiwgPGNvZGU+amF2YXguKjwvY29kZT4sIGFuZAorICAgICAqIDxjb2RlPnN1bi4qPC9jb2RlPi4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBuYW1lIAorICAgICAqCQkJb2YgdGhlIGF0dHJpYnV0ZQorICAgICAqCisgICAgICogQHBhcmFtIG9iamVjdCAJYW4gPGNvZGU+T2JqZWN0PC9jb2RlPiByZXByZXNlbnRpbmcgdGhlCisgICAgICoJCQlhdHRyaWJ1dGUgdG8gYmUgYm91bmQKKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCBvYmplY3QpOworICAgIAorICAgIAorCisKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGZyb20gCisgICAgICogdGhlIHNlcnZsZXQgY29udGV4dC4gQWZ0ZXIgcmVtb3ZhbCwgc3Vic2VxdWVudCBjYWxscyB0bworICAgICAqIHtAbGluayAjZ2V0QXR0cmlidXRlfSB0byByZXRyaWV2ZSB0aGUgYXR0cmlidXRlJ3MgdmFsdWUKKyAgICAgKiB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKworICAgICAqIDxwPklmIGxpc3RlbmVycyBhcmUgY29uZmlndXJlZCBvbiB0aGUgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+IHRoZSAKKyAgICAgKiBjb250YWluZXIgbm90aWZpZXMgdGhlbSBhY2NvcmRpbmdseS4KKworICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgbmFtZSAKKyAgICAgKiAJCQlvZiB0aGUgYXR0cmlidXRlIHRvIGJlIHJlbW92ZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgd2ViIGFwcGxpY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBTZXJ2bGV0Q29udGV4dCBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlcGxveW1lbnQKKyAgICAgKiBkZXNjcmlwdG9yIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiBieSB0aGUgZGlzcGxheS1uYW1lIGVsZW1lbnQuCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4JICAgIFRoZSBuYW1lIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gb3IgbnVsbCBpZiBubyBuYW1lIGhhcyBiZWVuIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgICAgICogQHNpbmNlIFNlcnZsZXQgMi4zCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0Q29udGV4dE5hbWUoKTsKK30KKworCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlNDkzNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRDb250ZXh0QXR0cmlidXRlRXZlbnQuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworCisJLyoqIAorCSogVGhpcyBpcyB0aGUgZXZlbnQgY2xhc3MgZm9yIG5vdGlmaWNhdGlvbnMgYWJvdXQgY2hhbmdlcyB0byB0aGUgYXR0cmlidXRlcyBvZiB0aGUKKwkqICBzZXJ2bGV0IGNvbnRleHQgb2YgYSB3ZWIgYXBwbGljYXRpb24uCisJKiBAc2VlIFNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXIKKwkgKiBAc2luY2UJdiAyLjMKKwkqLworCitwdWJsaWMgY2xhc3MgU2VydmxldENvbnRleHRBdHRyaWJ1dGVFdmVudCBleHRlbmRzIFNlcnZsZXRDb250ZXh0RXZlbnQgeyAKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCXByaXZhdGUgT2JqZWN0IHZhbHVlOworCisJLyoqIENvbnN0cnVjdCBhIFNlcnZsZXRDb250ZXh0QXR0cmlidXRlRXZlbnQgZnJvbSB0aGUgZ2l2ZW4gY29udGV4dCBmb3IgdGhlCisJKiogZ2l2ZW4gYXR0cmlidXRlIG5hbWUgYW5kIGF0dHJpYnV0ZSB2YWx1ZS4gCisJKi8KKwlwdWJsaWMgU2VydmxldENvbnRleHRBdHRyaWJ1dGVFdmVudChTZXJ2bGV0Q29udGV4dCBzb3VyY2UsIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKwkgICAgc3VwZXIoc291cmNlKTsKKwkgICAgdGhpcy5uYW1lID0gbmFtZTsKKwkgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKwkKKwkvKioKKwkqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgY2hhbmdlZCBvbiB0aGUgU2VydmxldENvbnRleHQuCisJKgorCSovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKwkKKwkvKioKKwkqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBoYXMgYmVlbiBhZGRlZCwgcmVtb3ZlZCwgb3IgcmVwbGFjZWQuCisJKiBJZiB0aGUgYXR0cmlidXRlIHdhcyBhZGRlZCwgdGhpcyBpcyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gSWYgdGhlIGF0dHJpYnV0ZSB3YXMKKwkqIHJlbW92ZWQsIHRoaXMgaXMgdGhlIHZhbHVlIG9mIHRoZSByZW1vdmVkIGF0dHJpYnV0ZS4gSWYgdGhlIGF0dHJpYnV0ZSB3YXMgcmVwbGFjZWQsIHRoaXMKKwkqIGlzIHRoZSBvbGQgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4KKwkqCisJKi8KKwkKKwlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworCSAgICByZXR1cm4gdGhpcy52YWx1ZTsgICAKKwl9Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2I1NTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0OworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CisKKwkvKiogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBvZgorCSoqIGNoYW5nZXMgdG8gdGhlIGF0dHJpYnV0ZSBsaXN0IG9uIHRoZSBzZXJ2bGV0IGNvbnRleHQgb2YgYSB3ZWIgYXBwbGljYXRpb24uIAorCSogVG8gcmVjZWl2ZSBub3RpZmljYXRpb24gZXZlbnRzLCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MKKwkqIG11c3QgYmUgY29uZmlndXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uLgorCSogQHNlZSBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50CisJICogQHNpbmNlCXYgMi4zCisJKi8KKworcHVibGljIGludGVyZmFjZSBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CisJLyoqIE5vdGlmaWNhdGlvbiB0aGF0IGEgbmV3IGF0dHJpYnV0ZSB3YXMgYWRkZWQgdG8gdGhlIHNlcnZsZXQgY29udGV4dC4gQ2FsbGVkIGFmdGVyIHRoZSBhdHRyaWJ1dGUgaXMgYWRkZWQuKi8KK3B1YmxpYyB2b2lkIGF0dHJpYnV0ZUFkZGVkKFNlcnZsZXRDb250ZXh0QXR0cmlidXRlRXZlbnQgc2NhYik7CisJLyoqIE5vdGlmaWNhdGlvbiB0aGF0IGFuIGV4aXN0aW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHNlcnZsZXQgY29udGV4dC4gQ2FsbGVkIGFmdGVyIHRoZSBhdHRyaWJ1dGUgaXMgcmVtb3ZlZC4qLworcHVibGljIHZvaWQgYXR0cmlidXRlUmVtb3ZlZChTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IHNjYWIpOworCS8qKiBOb3RpZmljYXRpb24gdGhhdCBhbiBhdHRyaWJ1dGUgb24gdGhlIHNlcnZsZXQgY29udGV4dCBoYXMgYmVlbiByZXBsYWNlZC4gQ2FsbGVkIGFmdGVyIHRoZSBhdHRyaWJ1dGUgaXMgcmVwbGFjZWQuICovCitwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZXBsYWNlZChTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IHNjYWIpOworfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0Q29udGV4dEV2ZW50LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0Q29udGV4dEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzNzU5NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRDb250ZXh0RXZlbnQuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworCisJLyoqIAorCSAqIFRoaXMgaXMgdGhlIGV2ZW50IGNsYXNzIGZvciBub3RpZmljYXRpb25zIGFib3V0IGNoYW5nZXMgdG8KKwkgKiB0aGUgc2VydmxldCBjb250ZXh0IG9mIGEgd2ViIGFwcGxpY2F0aW9uLgorCSAqIEBzZWUgU2VydmxldENvbnRleHRMaXN0ZW5lcgorCSAqIEBzaW5jZQl2IDIuMworCSAqLworCitwdWJsaWMgY2xhc3MgU2VydmxldENvbnRleHRFdmVudCBleHRlbmRzIGphdmEudXRpbC5FdmVudE9iamVjdCB7IAorCisJLyoqIENvbnN0cnVjdCBhIFNlcnZsZXRDb250ZXh0RXZlbnQgZnJvbSB0aGUgZ2l2ZW4gY29udGV4dC4KKwkgKgorCSAqIEBwYXJhbSBzb3VyY2UgLSB0aGUgU2VydmxldENvbnRleHQgdGhhdCBpcyBzZW5kaW5nIHRoZSBldmVudC4KKwkgKi8KKyAgICBwdWJsaWMgU2VydmxldENvbnRleHRFdmVudChTZXJ2bGV0Q29udGV4dCBzb3VyY2UpIHsKKwlzdXBlcihzb3VyY2UpOworICAgIH0KKyAgICAKKwkvKioKKwkgKiBSZXR1cm4gdGhlIFNlcnZsZXRDb250ZXh0IHRoYXQgY2hhbmdlZC4KKwkgKgorCSAqIEByZXR1cm4gdGhlIFNlcnZsZXRDb250ZXh0IHRoYXQgc2VudCB0aGUgZXZlbnQuCisJICovCisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0ICgpIHsgCisJcmV0dXJuIChTZXJ2bGV0Q29udGV4dCkgc3VwZXIuZ2V0U291cmNlKCk7CisgICAgfQorICAgIAorfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0Q29udGV4dExpc3RlbmVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0Q29udGV4dExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiMDE2NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRDb250ZXh0TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOworCisJLyoqIAorCSAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSByZWNlaXZlIG5vdGlmaWNhdGlvbnMgYWJvdXQKKwkgKiBjaGFuZ2VzIHRvIHRoZSBzZXJ2bGV0IGNvbnRleHQgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiB0aGV5IGFyZQorCSAqIHBhcnQgb2YuCisJICogVG8gcmVjZWl2ZSBub3RpZmljYXRpb24gZXZlbnRzLCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MKKwkgKiBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgdGhlIHdlYgorCSAqIGFwcGxpY2F0aW9uLgorCSAqIEBzZWUgU2VydmxldENvbnRleHRFdmVudAorCSAqIEBzaW5jZQl2IDIuMworCSAqLworCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZsZXRDb250ZXh0TGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKKwkvKioKKwkgKiogTm90aWZpY2F0aW9uIHRoYXQgdGhlIHdlYiBhcHBsaWNhdGlvbiBpbml0aWFsaXphdGlvbgorCSAqKiBwcm9jZXNzIGlzIHN0YXJ0aW5nLgorCSAqKiBBbGwgU2VydmxldENvbnRleHRMaXN0ZW5lcnMgYXJlIG5vdGlmaWVkIG9mIGNvbnRleHQKKwkgKiogaW5pdGlhbGl6YXRpb24gYmVmb3JlIGFueSBmaWx0ZXIgb3Igc2VydmxldCBpbiB0aGUgd2ViCisJICoqIGFwcGxpY2F0aW9uIGlzIGluaXRpYWxpemVkLgorCSAqLworCisgICAgcHVibGljIHZvaWQgY29udGV4dEluaXRpYWxpemVkICggU2VydmxldENvbnRleHRFdmVudCBzY2UgKTsKKworCS8qKgorCSAqKiBOb3RpZmljYXRpb24gdGhhdCB0aGUgc2VydmxldCBjb250ZXh0IGlzIGFib3V0IHRvIGJlIHNodXQgZG93bi4KKwkgKiogQWxsIHNlcnZsZXRzIGFuZCBmaWx0ZXJzIGhhdmUgYmVlbiBkZXN0cm95KCllZCBiZWZvcmUgYW55CisJICoqIFNlcnZsZXRDb250ZXh0TGlzdGVuZXJzIGFyZSBub3RpZmllZCBvZiBjb250ZXh0CisJICoqIGRlc3RydWN0aW9uLgorCSAqLworICAgIHB1YmxpYyB2b2lkIGNvbnRleHREZXN0cm95ZWQgKCBTZXJ2bGV0Q29udGV4dEV2ZW50IHNjZSApOworfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0RXhjZXB0aW9uLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliNDA0NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKKworLyoqCisgKiBEZWZpbmVzIGEgZ2VuZXJhbCBleGNlcHRpb24gYSBzZXJ2bGV0IGNhbiB0aHJvdyB3aGVuIGl0CisgKiBlbmNvdW50ZXJzIGRpZmZpY3VsdHkuCisgKgorICogQGF1dGhvciAJVmFyaW91cworICogQHZlcnNpb24gCSRWZXJzaW9uJAorICoKKyAqLworCisKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgVGhyb3dhYmxlIHJvb3RDYXVzZTsKKworCisKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBzZXJ2bGV0IGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFNlcnZsZXRFeGNlcHRpb24oKSB7CisJc3VwZXIoKTsKKyAgICB9CisgICAgCisgICAKKworICAgIAorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBzZXJ2bGV0IGV4Y2VwdGlvbiB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBtZXNzYWdlLiBUaGUgbWVzc2FnZSBjYW4gYmUgd3JpdHRlbiAKKyAgICAgKiB0byB0aGUgc2VydmVyIGxvZyBhbmQvb3IgZGlzcGxheWVkIGZvciB0aGUgdXNlci4gCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSAJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiAKKyAgICAgKgkJCQlzcGVjaWZ5aW5nIHRoZSB0ZXh0IG9mIAorICAgICAqCQkJCXRoZSBleGNlcHRpb24gbWVzc2FnZQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU2VydmxldEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCXN1cGVyKG1lc3NhZ2UpOworICAgIH0KKyAgICAKKyAgIAorICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNlcnZsZXQgZXhjZXB0aW9uIHdoZW4gdGhlIHNlcnZsZXQgCisgICAgICogbmVlZHMgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGFuZCBpbmNsdWRlIGEgbWVzc2FnZSAKKyAgICAgKiBhYm91dCB0aGUgInJvb3QgY2F1c2UiIGV4Y2VwdGlvbiB0aGF0IGludGVyZmVyZWQgd2l0aCBpdHMgCisgICAgICogbm9ybWFsIG9wZXJhdGlvbiwgaW5jbHVkaW5nIGEgZGVzY3JpcHRpb24gbWVzc2FnZS4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyAKKyAgICAgKgkJCQl0aGUgdGV4dCBvZiB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UKKyAgICAgKgorICAgICAqIEBwYXJhbSByb290Q2F1c2UJCXRoZSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IGV4Y2VwdGlvbiAKKyAgICAgKgkJCQl0aGF0IGludGVyZmVyZWQgd2l0aCB0aGUgc2VydmxldCdzCisgICAgICoJCQkJbm9ybWFsIG9wZXJhdGlvbiwgbWFraW5nIHRoaXMgc2VydmxldAorICAgICAqCQkJCWV4Y2VwdGlvbiBuZWNlc3NhcnkKKyAgICAgKgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTZXJ2bGV0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgcm9vdENhdXNlKSB7CisJc3VwZXIobWVzc2FnZSk7CisJdGhpcy5yb290Q2F1c2UgPSByb290Q2F1c2U7CisgICAgfQorCisKKworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNlcnZsZXQgZXhjZXB0aW9uIHdoZW4gdGhlIHNlcnZsZXQgCisgICAgICogbmVlZHMgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGFuZCBpbmNsdWRlIGEgbWVzc2FnZQorICAgICAqIGFib3V0IHRoZSAicm9vdCBjYXVzZSIgZXhjZXB0aW9uIHRoYXQgaW50ZXJmZXJlZCB3aXRoIGl0cworICAgICAqIG5vcm1hbCBvcGVyYXRpb24uICBUaGUgZXhjZXB0aW9uJ3MgbWVzc2FnZSBpcyBiYXNlZCBvbiB0aGUgbG9jYWxpemVkCisgICAgICogbWVzc2FnZSBvZiB0aGUgdW5kZXJseWluZyBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBjYWxscyB0aGUgPGNvZGU+Z2V0TG9jYWxpemVkTWVzc2FnZTwvY29kZT4gbWV0aG9kCisgICAgICogb24gdGhlIDxjb2RlPlRocm93YWJsZTwvY29kZT4gZXhjZXB0aW9uIHRvIGdldCBhIGxvY2FsaXplZCBleGNlcHRpb24KKyAgICAgKiBtZXNzYWdlLiBXaGVuIHN1YmNsYXNzaW5nIDxjb2RlPlNlcnZsZXRFeGNlcHRpb248L2NvZGU+LCAKKyAgICAgKiB0aGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiB0byBjcmVhdGUgYW4gZXhjZXB0aW9uIG1lc3NhZ2UgCisgICAgICogZGVzaWduZWQgZm9yIGEgc3BlY2lmaWMgbG9jYWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHJvb3RDYXVzZSAJdGhlIDxjb2RlPlRocm93YWJsZTwvY29kZT4gZXhjZXB0aW9uCisgICAgICogCQkJCXRoYXQgaW50ZXJmZXJlZCB3aXRoIHRoZSBzZXJ2bGV0J3MKKyAgICAgKgkJCQlub3JtYWwgb3BlcmF0aW9uLCBtYWtpbmcgdGhlIHNlcnZsZXQgZXhjZXB0aW9uCisgICAgICoJCQkJbmVjZXNzYXJ5CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTZXJ2bGV0RXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKKwlzdXBlcihyb290Q2F1c2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKKwl0aGlzLnJvb3RDYXVzZSA9IHJvb3RDYXVzZTsKKyAgICB9CisgIAorICAKKyAKKyAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhpcyBzZXJ2bGV0IGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybgkJCXRoZSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IAorICAgICAqCQkJCXRoYXQgY2F1c2VkIHRoaXMgc2VydmxldCBleGNlcHRpb24KKyAgICAgKgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Um9vdENhdXNlKCkgeworCXJldHVybiByb290Q2F1c2U7CisgICAgfQorfQorCisKKworCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRJbnB1dFN0cmVhbS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldElucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI5YzgwOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiAKKyAqIFByb3ZpZGVzIGFuIGlucHV0IHN0cmVhbSBmb3IgcmVhZGluZyBiaW5hcnkgZGF0YSBmcm9tIGEgY2xpZW50CisgKiByZXF1ZXN0LCBpbmNsdWRpbmcgYW4gZWZmaWNpZW50IDxjb2RlPnJlYWRMaW5lPC9jb2RlPiBtZXRob2QKKyAqIGZvciByZWFkaW5nIGRhdGEgb25lIGxpbmUgYXQgYSB0aW1lLiBXaXRoIHNvbWUgcHJvdG9jb2xzLCBzdWNoCisgKiBhcyBIVFRQIFBPU1QgYW5kIFBVVCwgYSA8Y29kZT5TZXJ2bGV0SW5wdXRTdHJlYW08L2NvZGU+CisgKiBvYmplY3QgY2FuIGJlIHVzZWQgdG8gcmVhZCBkYXRhIHNlbnQgZnJvbSB0aGUgY2xpZW50LgorICoKKyAqIDxwPkEgPGNvZGU+U2VydmxldElucHV0U3RyZWFtPC9jb2RlPiBvYmplY3QgaXMgbm9ybWFsbHkgcmV0cmlldmVkIHZpYQorICogdGhlIHtAbGluayBTZXJ2bGV0UmVxdWVzdCNnZXRJbnB1dFN0cmVhbX0gbWV0aG9kLgorICoKKyAqCisgKiA8cD5UaGlzIGlzIGFuIGFic3RyYWN0IGNsYXNzIHRoYXQgYSBzZXJ2bGV0IGNvbnRhaW5lciBpbXBsZW1lbnRzLgorICogU3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzCisgKiBtdXN0IGltcGxlbWVudCB0aGUgPGNvZGU+amF2YS5pby5JbnB1dFN0cmVhbS5yZWFkKCk8L2NvZGU+IG1ldGhvZC4KKyAqCisgKgorICogQGF1dGhvciAJVmFyaW91cworICogQHZlcnNpb24gCSRWZXJzaW9uJAorICoKKyAqIEBzZWUJCVNlcnZsZXRSZXF1ZXN0IAorICoKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmxldElucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworCisKKworICAgIC8qKgorICAgICAqIERvZXMgbm90aGluZywgYmVjYXVzZSB0aGlzIGlzIGFuIGFic3RyYWN0IGNsYXNzLgorICAgICAqCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgU2VydmxldElucHV0U3RyZWFtKCkgeyB9CisKKyAgCisgIAorICAgIAorICAgIC8qKgorICAgICAqCisgICAgICogUmVhZHMgdGhlIGlucHV0IHN0cmVhbSwgb25lIGxpbmUgYXQgYSB0aW1lLiBTdGFydGluZyBhdCBhbgorICAgICAqIG9mZnNldCwgcmVhZHMgYnl0ZXMgaW50byBhbiBhcnJheSwgdW50aWwgaXQgcmVhZHMgYSBjZXJ0YWluIG51bWJlcgorICAgICAqIG9mIGJ5dGVzIG9yIHJlYWNoZXMgYSBuZXdsaW5lIGNoYXJhY3Rlciwgd2hpY2ggaXQgcmVhZHMgaW50byB0aGUKKyAgICAgKiBhcnJheSBhcyB3ZWxsLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgcmV0dXJucyAtMSBpZiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGlucHV0CisgICAgICogc3RyZWFtIGJlZm9yZSByZWFkaW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcy4KKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiAJCWFuIGFycmF5IG9mIGJ5dGVzIGludG8gd2hpY2ggZGF0YSBpcyByZWFkCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2ZmIAkJYW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBjaGFyYWN0ZXIgYXQgd2hpY2gKKyAgICAgKgkJCQl0aGlzIG1ldGhvZCBiZWdpbnMgcmVhZGluZworICAgICAqCisgICAgICogQHBhcmFtIGxlbgkJYW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiAKKyAgICAgKgkJCQlieXRlcyB0byByZWFkCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJYW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIAorICAgICAqCQkJCXJlYWQsIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gaGFzIG9jY3VycmVkCisgICAgICoKKyAgICAgKi8KKyAgICAgCisgICAgcHVibGljIGludCByZWFkTGluZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCWlmIChsZW4gPD0gMCkgeworCSAgICByZXR1cm4gMDsKKwl9CisJaW50IGNvdW50ID0gMCwgYzsKKworCXdoaWxlICgoYyA9IHJlYWQoKSkgIT0gLTEpIHsKKwkgICAgYltvZmYrK10gPSAoYnl0ZSljOworCSAgICBjb3VudCsrOworCSAgICBpZiAoYyA9PSAnXG4nIHx8IGNvdW50ID09IGxlbikgeworCQlicmVhazsKKwkgICAgfQorCX0KKwlyZXR1cm4gY291bnQgPiAwID8gY291bnQgOiAtMTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0T3V0cHV0U3RyZWFtLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0T3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiNzI4MQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRPdXRwdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDM2NCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uQ2hhckNvbnZlcnNpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCisvKioKKyAqIFByb3ZpZGVzIGFuIG91dHB1dCBzdHJlYW0gZm9yIHNlbmRpbmcgYmluYXJ5IGRhdGEgdG8gdGhlCisgKiBjbGllbnQuIEEgPGNvZGU+U2VydmxldE91dHB1dFN0cmVhbTwvY29kZT4gb2JqZWN0IGlzIG5vcm1hbGx5IHJldHJpZXZlZCAKKyAqIHZpYSB0aGUge0BsaW5rIFNlcnZsZXRSZXNwb25zZSNnZXRPdXRwdXRTdHJlYW19IG1ldGhvZC4KKyAqCisgKiA8cD5UaGlzIGlzIGFuIGFic3RyYWN0IGNsYXNzIHRoYXQgdGhlIHNlcnZsZXQgY29udGFpbmVyIGltcGxlbWVudHMuCisgKiBTdWJjbGFzc2VzIG9mIHRoaXMgY2xhc3MKKyAqIG11c3QgaW1wbGVtZW50IHRoZSA8Y29kZT5qYXZhLmlvLk91dHB1dFN0cmVhbS53cml0ZShpbnQpPC9jb2RlPgorICogbWV0aG9kLgorICoKKyAqIAorICogQGF1dGhvciAJVmFyaW91cworICogQHZlcnNpb24gCSRWZXJzaW9uJAorICoKKyAqIEBzZWUgCVNlcnZsZXRSZXNwb25zZQorICoKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmxldE91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFNUUklOR19GSUxFID0gImphdmF4LnNlcnZsZXQuTG9jYWxTdHJpbmdzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBsU3RyaW5ncyA9CisJUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKExTVFJJTkdfRklMRSk7CisKKworICAgIAorICAgIC8qKgorICAgICAqCisgICAgICogRG9lcyBub3RoaW5nLCBiZWNhdXNlIHRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MuCisgICAgICoKKyAgICAgKi8KKworICAgIHByb3RlY3RlZCBTZXJ2bGV0T3V0cHV0U3RyZWFtKCkgeyB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gdGhlIGNsaWVudCwgCisgICAgICogd2l0aG91dCBhIGNhcnJpYWdlIHJldHVybi1saW5lIGZlZWQgKENSTEYpIAorICAgICAqIGNoYXJhY3RlciBhdCB0aGUgZW5kLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcwkJCXRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIHNlbmQgdG8gdGhlIGNsaWVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiAJaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGV4Y2VwdGlvbiBvY2N1cnJlZAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpZiAocz09bnVsbCkgcz0ibnVsbCI7CisJaW50IGxlbiA9IHMubGVuZ3RoKCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworCSAgICBjaGFyIGMgPSBzLmNoYXJBdCAoaSk7CisKKwkgICAgLy8KKwkgICAgLy8gWFhYIE5PVEU6ICBUaGlzIGlzIGNsZWFybHkgaW5jb3JyZWN0IGZvciBtYW55IHN0cmluZ3MsCisJICAgIC8vIGJ1dCBpcyB0aGUgb25seSBjb25zaXN0ZW50IGFwcHJvYWNoIHdpdGhpbiB0aGUgY3VycmVudAorCSAgICAvLyBzZXJ2bGV0IGZyYW1ld29yay4gIEl0IG11c3Qgc3VmZmljZSB1bnRpbCBzZXJ2bGV0IG91dHB1dAorCSAgICAvLyBzdHJlYW1zIHByb3Blcmx5IGVuY29kZSB0aGVpciBvdXRwdXQuCisJICAgIC8vCisJICAgIGlmICgoYyAmIDB4ZmYwMCkgIT0gMCkgewkvLyBoaWdoIG9yZGVyIGJ5dGUgbXVzdCBiZSB6ZXJvCisJCVN0cmluZyBlcnJNc2cgPSBsU3RyaW5ncy5nZXRTdHJpbmcoImVyci5ub3RfaXNvODg1OV8xIik7CisJCU9iamVjdFtdIGVyckFyZ3MgPSBuZXcgT2JqZWN0WzFdOworCQllcnJBcmdzWzBdID0gbmV3IENoYXJhY3RlcihjKTsKKwkJZXJyTXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZXJyTXNnLCBlcnJBcmdzKTsKKwkJdGhyb3cgbmV3IENoYXJDb252ZXJzaW9uRXhjZXB0aW9uKGVyck1zZyk7CisJICAgIH0KKwkgICAgd3JpdGUgKGMpOworCX0KKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgdG8gdGhlIGNsaWVudCwKKyAgICAgKiB3aXRoIG5vIGNhcnJpYWdlIHJldHVybi1saW5lIGZlZWQgKENSTEYpIAorICAgICAqIGNoYXJhY3RlciBhdCB0aGUgZW5kLgorICAgICAqCisgICAgICogQHBhcmFtIGIJCQl0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgCisgICAgICoJCQkJdG8gc2VuZCB0byB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIAlpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIG9jY3VycmVkCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHByaW50KGJvb2xlYW4gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlTdHJpbmcgbXNnOworCWlmIChiKSB7CisJICAgIG1zZyA9IGxTdHJpbmdzLmdldFN0cmluZygidmFsdWUudHJ1ZSIpOworCX0gZWxzZSB7CisJICAgIG1zZyA9IGxTdHJpbmdzLmdldFN0cmluZygidmFsdWUuZmFsc2UiKTsKKwl9CisJcHJpbnQobXNnKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgY2hhcmFjdGVyIHRvIHRoZSBjbGllbnQsCisgICAgICogd2l0aCBubyBjYXJyaWFnZSByZXR1cm4tbGluZSBmZWVkIChDUkxGKSAKKyAgICAgKiBhdCB0aGUgZW5kLgorICAgICAqCisgICAgICogQHBhcmFtIGMJCQl0aGUgY2hhcmFjdGVyIHRvIHNlbmQgdG8gdGhlIGNsaWVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiAJaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGV4Y2VwdGlvbiBvY2N1cnJlZAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChjaGFyIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpbnQoU3RyaW5nLnZhbHVlT2YoYykpOworICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqCisgICAgICogV3JpdGVzIGFuIGludCB0byB0aGUgY2xpZW50LAorICAgICAqIHdpdGggbm8gY2FycmlhZ2UgcmV0dXJuLWxpbmUgZmVlZCAoQ1JMRikgCisgICAgICogYXQgdGhlIGVuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpCQkJdGhlIGludCB0byBzZW5kIHRvIHRoZSBjbGllbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKgorICAgICAqLyAgCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcmludChTdHJpbmcudmFsdWVPZihpKSk7CisgICAgfQorCisKKworIAorICAgIC8qKgorICAgICAqIAorICAgICAqIFdyaXRlcyBhIDxjb2RlPmxvbmc8L2NvZGU+IHZhbHVlIHRvIHRoZSBjbGllbnQsCisgICAgICogd2l0aCBubyBjYXJyaWFnZSByZXR1cm4tbGluZSBmZWVkIChDUkxGKSBhdCB0aGUgZW5kLgorICAgICAqCisgICAgICogQHBhcmFtIGwJCQl0aGUgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUgCisgICAgICoJCQkJdG8gc2VuZCB0byB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIAlpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIAorICAgICAqCQkJCW9jY3VycmVkCisgICAgICogCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChsb25nIGwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpbnQoU3RyaW5nLnZhbHVlT2YobCkpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFdyaXRlcyBhIDxjb2RlPmZsb2F0PC9jb2RlPiB2YWx1ZSB0byB0aGUgY2xpZW50LAorICAgICAqIHdpdGggbm8gY2FycmlhZ2UgcmV0dXJuLWxpbmUgZmVlZCAoQ1JMRikgYXQgdGhlIGVuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmCQkJdGhlIDxjb2RlPmZsb2F0PC9jb2RlPiB2YWx1ZQorICAgICAqCQkJCXRvIHNlbmQgdG8gdGhlIGNsaWVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbglpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIG9jY3VycmVkCisgICAgICoKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcHJpbnQoZmxvYXQgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcmludChTdHJpbmcudmFsdWVPZihmKSk7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqCisgICAgICogV3JpdGVzIGEgPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZSB0byB0aGUgY2xpZW50LAorICAgICAqIHdpdGggbm8gY2FycmlhZ2UgcmV0dXJuLWxpbmUgZmVlZCAoQ1JMRikgYXQgdGhlIGVuZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZAkJCXRoZSA8Y29kZT5kb3VibGU8L2NvZGU+IHZhbHVlCisgICAgICoJCQkJdG8gc2VuZCB0byB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIAlpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIG9jY3VycmVkCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHByaW50KGRvdWJsZSBkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaW50KFN0cmluZy52YWx1ZU9mKGQpKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgY2FycmlhZ2UgcmV0dXJuLWxpbmUgZmVlZCAoQ1JMRikKKyAgICAgKiB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICoKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcHJpbnRsbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpbnQoIlxyXG4iKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byB0aGUgY2xpZW50LCAKKyAgICAgKiBmb2xsb3dlZCBieSBhIGNhcnJpYWdlIHJldHVybi1saW5lIGZlZWQgKENSTEYpLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcwkJCXRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIHdyaXRlIHRvIHRoZSBjbGllbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcmludChzKTsKKwlwcmludGxuKCk7CisgICAgfQorCisKKworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBXcml0ZXMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSB0byB0aGUgY2xpZW50LCAKKyAgICAgKiBmb2xsb3dlZCBieSBhIAorICAgICAqIGNhcnJpYWdlIHJldHVybi1saW5lIGZlZWQgKENSTEYpLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gYgkJCXRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSAKKyAgICAgKgkJCQl0byB3cml0ZSB0byB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIAlpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIG9jY3VycmVkCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oYm9vbGVhbiBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaW50KGIpOworCXByaW50bG4oKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBXcml0ZXMgYSBjaGFyYWN0ZXIgdG8gdGhlIGNsaWVudCwgZm9sbG93ZWQgYnkgYSBjYXJyaWFnZQorICAgICAqIHJldHVybi1saW5lIGZlZWQgKENSTEYpLgorICAgICAqCisgICAgICogQHBhcmFtIGMJCQl0aGUgY2hhcmFjdGVyIHRvIHdyaXRlIHRvIHRoZSBjbGllbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihjaGFyIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpbnQoYyk7CisJcHJpbnRsbigpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFdyaXRlcyBhbiBpbnQgdG8gdGhlIGNsaWVudCwgZm9sbG93ZWQgYnkgYSAKKyAgICAgKiBjYXJyaWFnZSByZXR1cm4tbGluZSBmZWVkIChDUkxGKSBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBpCQkJdGhlIGludCB0byB3cml0ZSB0byB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIAlpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIG9jY3VycmVkCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpbnQoaSk7CisJcHJpbnRsbigpOworICAgIH0KKworCisKKyAgICAvKiogIAorICAgICAqCisgICAgICogV3JpdGVzIGEgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUgdG8gdGhlIGNsaWVudCwgZm9sbG93ZWQgYnkgYSAKKyAgICAgKiBjYXJyaWFnZSByZXR1cm4tbGluZSBmZWVkIChDUkxGKS4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIGwJCQl0aGUgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUgdG8gd3JpdGUgdG8gdGhlIGNsaWVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiAJaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGV4Y2VwdGlvbiBvY2N1cnJlZAorICAgICAqCisgICAgICovICAKKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4obG9uZyBsKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaW50KGwpOworCXByaW50bG4oKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBXcml0ZXMgYSA8Y29kZT5mbG9hdDwvY29kZT4gdmFsdWUgdG8gdGhlIGNsaWVudCwgCisgICAgICogZm9sbG93ZWQgYnkgYSBjYXJyaWFnZSByZXR1cm4tbGluZSBmZWVkIChDUkxGKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmCQkJdGhlIDxjb2RlPmZsb2F0PC9jb2RlPiB2YWx1ZSAKKyAgICAgKgkJCQl0byB3cml0ZSB0byB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gCisgICAgICoJCQkJb2NjdXJyZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihmbG9hdCBmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaW50KGYpOworCXByaW50bG4oKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBXcml0ZXMgYSA8Y29kZT5kb3VibGU8L2NvZGU+IHZhbHVlIHRvIHRoZSBjbGllbnQsIAorICAgICAqIGZvbGxvd2VkIGJ5IGEgY2FycmlhZ2UgcmV0dXJuLWxpbmUgZmVlZCAoQ1JMRikuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBkCQkJdGhlIDxjb2RlPmRvdWJsZTwvY29kZT4gdmFsdWUKKyAgICAgKgkJCQl0byB3cml0ZSB0byB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIAlpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIG9jY3VycmVkCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oZG91YmxlIGQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpbnQoZCk7CisJcHJpbnRsbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YjM1OWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsNTk4IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisKKworLyoqCisgKiBEZWZpbmVzIGFuIG9iamVjdCB0byBwcm92aWRlIGNsaWVudCByZXF1ZXN0IGluZm9ybWF0aW9uIHRvIGEgc2VydmxldC4gIFRoZQorICogc2VydmxldCBjb250YWluZXIgY3JlYXRlcyBhIDxjb2RlPlNlcnZsZXRSZXF1ZXN0PC9jb2RlPiBvYmplY3QgYW5kIHBhc3NlcworICogaXQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIHNlcnZsZXQncyA8Y29kZT5zZXJ2aWNlPC9jb2RlPiBtZXRob2QuCisgKgorICogPHA+QSA8Y29kZT5TZXJ2bGV0UmVxdWVzdDwvY29kZT4gb2JqZWN0IHByb3ZpZGVzIGRhdGEgaW5jbHVkaW5nCisgKiBwYXJhbWV0ZXIgbmFtZSBhbmQgdmFsdWVzLCBhdHRyaWJ1dGVzLCBhbmQgYW4gaW5wdXQgc3RyZWFtLgorICogSW50ZXJmYWNlcyB0aGF0IGV4dGVuZCA8Y29kZT5TZXJ2bGV0UmVxdWVzdDwvY29kZT4gY2FuIHByb3ZpZGUKKyAqIGFkZGl0aW9uYWwgcHJvdG9jb2wtc3BlY2lmaWMgZGF0YSAoZm9yIGV4YW1wbGUsIEhUVFAgZGF0YSBpcworICogcHJvdmlkZWQgYnkge0BsaW5rIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3R9LgorICogCisgKiBAYXV0aG9yIAlWYXJpb3VzCisgKiBAdmVyc2lvbiAJJFZlcnNpb24kCisgKgorICogQHNlZSAJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdAorICoKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZsZXRSZXF1ZXN0IHsKKworCisKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkIGF0dHJpYnV0ZSBhcyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+LAorICAgICAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMuIAorICAgICAqCisgICAgICogPHA+IEF0dHJpYnV0ZXMgY2FuIGJlIHNldCB0d28gd2F5cy4gIFRoZSBzZXJ2bGV0IGNvbnRhaW5lciBtYXkgc2V0CisgICAgICogYXR0cmlidXRlcyB0byBtYWtlIGF2YWlsYWJsZSBjdXN0b20gaW5mb3JtYXRpb24gYWJvdXQgYSByZXF1ZXN0LgorICAgICAqIEZvciBleGFtcGxlLCBmb3IgcmVxdWVzdHMgbWFkZSB1c2luZyBIVFRQUywgdGhlIGF0dHJpYnV0ZQorICAgICAqIDxjb2RlPmphdmF4LnNlcnZsZXQucmVxdWVzdC5YNTA5Q2VydGlmaWNhdGU8L2NvZGU+IGNhbiBiZSB1c2VkIHRvCisgICAgICogcmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGNlcnRpZmljYXRlIG9mIHRoZSBjbGllbnQuICBBdHRyaWJ1dGVzCisgICAgICogY2FuIGFsc28gYmUgc2V0IHByb2dyYW1hdGljYWxseSB1c2luZyAKKyAgICAgKiB7QGxpbmsgU2VydmxldFJlcXVlc3Qjc2V0QXR0cmlidXRlfS4gIFRoaXMgYWxsb3dzIGluZm9ybWF0aW9uIHRvIGJlCisgICAgICogZW1iZWRkZWQgaW50byBhIHJlcXVlc3QgYmVmb3JlIGEge0BsaW5rIFJlcXVlc3REaXNwYXRjaGVyfSBjYWxsLgorICAgICAqCisgICAgICogPHA+QXR0cmlidXRlIG5hbWVzIHNob3VsZCBmb2xsb3cgdGhlIHNhbWUgY29udmVudGlvbnMgYXMgcGFja2FnZQorICAgICAqIG5hbWVzLiBUaGlzIHNwZWNpZmljYXRpb24gcmVzZXJ2ZXMgbmFtZXMgbWF0Y2hpbmcgPGNvZGU+amF2YS4qPC9jb2RlPiwKKyAgICAgKiA8Y29kZT5qYXZheC4qPC9jb2RlPiwgYW5kIDxjb2RlPnN1bi4qPC9jb2RlPi4gCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgbmFtZSBvZiAKKyAgICAgKgkJCXRoZSBhdHRyaWJ1dGUKKyAgICAgKgorICAgICAqIEByZXR1cm4JCWFuIDxjb2RlPk9iamVjdDwvY29kZT4gY29udGFpbmluZyB0aGUgdmFsdWUgCisgICAgICoJCQlvZiB0aGUgYXR0cmlidXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqCQkJdGhlIGF0dHJpYnV0ZSBkb2VzIG5vdCBleGlzdAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSk7CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBjb250YWluaW5nIHRoZQorICAgICAqIG5hbWVzIG9mIHRoZSBhdHRyaWJ1dGVzIGF2YWlsYWJsZSB0byB0aGlzIHJlcXVlc3QuIAorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgPGNvZGU+RW51bWVyYXRpb248L2NvZGU+CisgICAgICogaWYgdGhlIHJlcXVlc3QgaGFzIG5vIGF0dHJpYnV0ZXMgYXZhaWxhYmxlIHRvIGl0LgorICAgICAqIAorICAgICAqCisgICAgICogQHJldHVybgkJYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIHN0cmluZ3MgCisgICAgICoJCQljb250YWluaW5nIHRoZSBuYW1lcyAKKyAgICAgKiAJCQlvZiB0aGUgcmVxdWVzdCdzIGF0dHJpYnV0ZXMKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgaW4gdGhlIGJvZHkgb2YgdGhpcworICAgICAqIHJlcXVlc3QuIFRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlcXVlc3QKKyAgICAgKiBkb2VzIG5vdCBzcGVjaWZ5IGEgY2hhcmFjdGVyIGVuY29kaW5nCisgICAgICogCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgbmFtZSBvZiAKKyAgICAgKgkJCXRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICoJCQlpZiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBzcGVjaWZ5IGEgY2hhcmFjdGVyIGVuY29kaW5nCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTsKKworIC8qKgorICAgICAqIE92ZXJyaWRlcyB0aGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgaW4gdGhlIGJvZHkgb2YgdGhpcworICAgICAqIHJlcXVlc3QuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIHJlYWRpbmcgcmVxdWVzdCBwYXJhbWV0ZXJzCisgICAgICogb3IgcmVhZGluZyBpbnB1dCB1c2luZyBnZXRSZWFkZXIoKS4KKyAgICAgKiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnYJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgCisgICAgICoJCQl0aGUgY2hhcmFjdGVyIGVuY29kaW5nLgorICAgICAqIEB0aHJvd3MJCWphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBpZiB0aGlzIGlzIG5vdCBhIHZhbGlkIGVuY29kaW5nCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgZW52KSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIHJlcXVlc3QgYm9keSAKKyAgICAgKiBhbmQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIGlucHV0IHN0cmVhbSwgb3IgLTEgaWYgdGhlCisgICAgICogbGVuZ3RoIGlzIG5vdCBrbm93bi4gRm9yIEhUVFAgc2VydmxldHMsIHNhbWUgYXMgdGhlIHZhbHVlCisgICAgICogb2YgdGhlIENHSSB2YXJpYWJsZSBDT05URU5UX0xFTkdUSC4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCWFuIGludGVnZXIgY29udGFpbmluZyB0aGUgbGVuZ3RoIG9mIHRoZSAKKyAgICAgKiAJCQlyZXF1ZXN0IGJvZHkgb3IgLTEgaWYgdGhlIGxlbmd0aCBpcyBub3Qga25vd24KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBNSU1FIHR5cGUgb2YgdGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QsIG9yIAorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB0eXBlIGlzIG5vdCBrbm93bi4gRm9yIEhUVFAgc2VydmxldHMsIAorICAgICAqIHNhbWUgYXMgdGhlIHZhbHVlIG9mIHRoZSBDR0kgdmFyaWFibGUgQ09OVEVOVF9UWVBFLgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIG5hbWUgCisgICAgICoJCQlvZiB0aGUgTUlNRSB0eXBlIG9mIAorICAgICAqIAkJCXRoZSByZXF1ZXN0LCBvciBudWxsIGlmIHRoZSB0eXBlIGlzIG5vdCBrbm93bgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QgYXMgYmluYXJ5IGRhdGEgdXNpbmcKKyAgICAgKiBhIHtAbGluayBTZXJ2bGV0SW5wdXRTdHJlYW19LiAgRWl0aGVyIHRoaXMgbWV0aG9kIG9yIAorICAgICAqIHtAbGluayAjZ2V0UmVhZGVyfSBtYXkgYmUgY2FsbGVkIHRvIHJlYWQgdGhlIGJvZHksIG5vdCBib3RoLgorICAgICAqCisgICAgICogQHJldHVybgkJCWEge0BsaW5rIFNlcnZsZXRJbnB1dFN0cmVhbX0gb2JqZWN0IGNvbnRhaW5pbmcKKyAgICAgKiAJCQkJdGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uICBpZiB0aGUge0BsaW5rICNnZXRSZWFkZXJ9IG1ldGhvZAorICAgICAqIAkJCQkJIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gICAgCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFNlcnZsZXRJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbjsgCisgICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSByZXF1ZXN0IHBhcmFtZXRlciBhcyBhIDxjb2RlPlN0cmluZzwvY29kZT4sCisgICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHBhcmFtZXRlciBkb2VzIG5vdCBleGlzdC4gUmVxdWVzdCBwYXJhbWV0ZXJzCisgICAgICogYXJlIGV4dHJhIGluZm9ybWF0aW9uIHNlbnQgd2l0aCB0aGUgcmVxdWVzdC4gIEZvciBIVFRQIHNlcnZsZXRzLAorICAgICAqIHBhcmFtZXRlcnMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgcXVlcnkgc3RyaW5nIG9yIHBvc3RlZCBmb3JtIGRhdGEuCisgICAgICoKKyAgICAgKiA8cD5Zb3Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgbWV0aG9kIHdoZW4geW91IGFyZSBzdXJlIHRoZQorICAgICAqIHBhcmFtZXRlciBoYXMgb25seSBvbmUgdmFsdWUuIElmIHRoZSBwYXJhbWV0ZXIgbWlnaHQgaGF2ZQorICAgICAqIG1vcmUgdGhhbiBvbmUgdmFsdWUsIHVzZSB7QGxpbmsgI2dldFBhcmFtZXRlclZhbHVlc30uCisgICAgICoKKyAgICAgKiA8cD5JZiB5b3UgdXNlIHRoaXMgbWV0aG9kIHdpdGggYSBtdWx0aXZhbHVlZAorICAgICAqIHBhcmFtZXRlciwgdGhlIHZhbHVlIHJldHVybmVkIGlzIGVxdWFsIHRvIHRoZSBmaXJzdCB2YWx1ZQorICAgICAqIGluIHRoZSBhcnJheSByZXR1cm5lZCBieSA8Y29kZT5nZXRQYXJhbWV0ZXJWYWx1ZXM8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+SWYgdGhlIHBhcmFtZXRlciBkYXRhIHdhcyBzZW50IGluIHRoZSByZXF1ZXN0IGJvZHksIHN1Y2ggYXMgb2NjdXJzCisgICAgICogd2l0aCBhbiBIVFRQIFBPU1QgcmVxdWVzdCwgdGhlbiByZWFkaW5nIHRoZSBib2R5IGRpcmVjdGx5IHZpYSB7QGxpbmsKKyAgICAgKiAjZ2V0SW5wdXRTdHJlYW19IG9yIHtAbGluayAjZ2V0UmVhZGVyfSBjYW4gaW50ZXJmZXJlCisgICAgICogd2l0aCB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSAKKyAgICAgKgkJCW5hbWUgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgCisgICAgICoJCQlzaW5nbGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqCisgICAgICogQHNlZSAJCSNnZXRQYXJhbWV0ZXJWYWx1ZXMKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+CisgICAgICogb2JqZWN0cyBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgcGFyYW1ldGVycyBjb250YWluZWQKKyAgICAgKiBpbiB0aGlzIHJlcXVlc3QuIElmIHRoZSByZXF1ZXN0IGhhcyAKKyAgICAgKiBubyBwYXJhbWV0ZXJzLCB0aGUgbWV0aG9kIHJldHVybnMgYW4gCisgICAgICogZW1wdHkgPGNvZGU+RW51bWVyYXRpb248L2NvZGU+LiAKKyAgICAgKgorICAgICAqIEByZXR1cm4JCWFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+CisgICAgICoJCQlvYmplY3RzLCBlYWNoIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZworICAgICAqIAkJCXRoZSBuYW1lIG9mIGEgcmVxdWVzdCBwYXJhbWV0ZXI7IG9yIGFuIAorICAgICAqCQkJZW1wdHkgPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IGlmIHRoZQorICAgICAqCQkJcmVxdWVzdCBoYXMgbm8gcGFyYW1ldGVycworICAgICAqCisgICAgICovCisgICAgIAorICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQYXJhbWV0ZXJOYW1lcygpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdHMgY29udGFpbmluZyAKKyAgICAgKiBhbGwgb2YgdGhlIHZhbHVlcyB0aGUgZ2l2ZW4gcmVxdWVzdCBwYXJhbWV0ZXIgaGFzLCBvciAKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcGFyYW1ldGVyIGRvZXMgbm90IGV4aXN0LgorICAgICAqCisgICAgICogPHA+SWYgdGhlIHBhcmFtZXRlciBoYXMgYSBzaW5nbGUgdmFsdWUsIHRoZSBhcnJheSBoYXMgYSBsZW5ndGgKKyAgICAgKiBvZiAxLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgCisgICAgICoJCQl0aGUgcGFyYW1ldGVyIHdob3NlIHZhbHVlIGlzIHJlcXVlc3RlZAorICAgICAqCisgICAgICogQHJldHVybgkJYW4gYXJyYXkgb2YgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3RzIAorICAgICAqCQkJY29udGFpbmluZyB0aGUgcGFyYW1ldGVyJ3MgdmFsdWVzCisgICAgICoKKyAgICAgKiBAc2VlCQkjZ2V0UGFyYW1ldGVyCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIG5hbWUpOworIAorICAgIC8qKiBSZXR1cm5zIGEgamF2YS51dGlsLk1hcCBvZiB0aGUgcGFyYW1ldGVycyBvZiB0aGlzIHJlcXVlc3QuCisgICAgICogUmVxdWVzdCBwYXJhbWV0ZXJzCisgICAgICogYXJlIGV4dHJhIGluZm9ybWF0aW9uIHNlbnQgd2l0aCB0aGUgcmVxdWVzdC4gIEZvciBIVFRQIHNlcnZsZXRzLAorICAgICAqIHBhcmFtZXRlcnMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgcXVlcnkgc3RyaW5nIG9yIHBvc3RlZCBmb3JtIGRhdGEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSBqYXZhLnV0aWwuTWFwIGNvbnRhaW5pbmcgcGFyYW1ldGVyIG5hbWVzIGFzIAorICAgICAqIGtleXMgYW5kIHBhcmFtZXRlciB2YWx1ZXMgYXMgbWFwIHZhbHVlcy4gVGhlIGtleXMgaW4gdGhlIHBhcmFtZXRlcgorICAgICAqIG1hcCBhcmUgb2YgdHlwZSBTdHJpbmcuIFRoZSB2YWx1ZXMgaW4gdGhlIHBhcmFtZXRlciBtYXAgYXJlIG9mIHR5cGUKKyAgICAgKiBTdHJpbmcgYXJyYXkuCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBNYXAgZ2V0UGFyYW1ldGVyTWFwKCk7CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoZSBwcm90b2NvbCB0aGUgcmVxdWVzdCB1c2VzCisgICAgICogaW4gdGhlIGZvcm0gPGk+cHJvdG9jb2wvbWFqb3JWZXJzaW9uLm1pbm9yVmVyc2lvbjwvaT4sIGZvciAKKyAgICAgKiBleGFtcGxlLCBIVFRQLzEuMS4gRm9yIEhUVFAgc2VydmxldHMsIHRoZSB2YWx1ZQorICAgICAqIHJldHVybmVkIGlzIHRoZSBzYW1lIGFzIHRoZSB2YWx1ZSBvZiB0aGUgQ0dJIHZhcmlhYmxlIAorICAgICAqIDxjb2RlPlNFUlZFUl9QUk9UT0NPTDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgcHJvdG9jb2wgCisgICAgICoJCQluYW1lIGFuZCB2ZXJzaW9uIG51bWJlcgorICAgICAqCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc2NoZW1lIHVzZWQgdG8gbWFrZSB0aGlzIHJlcXVlc3QsIAorICAgICAqIGZvciBleGFtcGxlLAorICAgICAqIDxjb2RlPmh0dHA8L2NvZGU+LCA8Y29kZT5odHRwczwvY29kZT4sIG9yIDxjb2RlPmZ0cDwvY29kZT4uCisgICAgICogRGlmZmVyZW50IHNjaGVtZXMgaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNvbnN0cnVjdGluZyBVUkxzLAorICAgICAqIGFzIG5vdGVkIGluIFJGQyAxNzM4LgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIG5hbWUgCisgICAgICoJCQlvZiB0aGUgc2NoZW1lIHVzZWQgdG8gbWFrZSB0aGlzIHJlcXVlc3QKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWUoKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGhvc3QgbmFtZSBvZiB0aGUgc2VydmVyIHRvIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyBzZW50LgorICAgICAqIEl0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgcGFydCBiZWZvcmUgIjoiIGluIHRoZSA8Y29kZT5Ib3N0PC9jb2RlPgorICAgICAqIGhlYWRlciB2YWx1ZSwgaWYgYW55LCBvciB0aGUgcmVzb2x2ZWQgc2VydmVyIG5hbWUsIG9yIHRoZSBzZXJ2ZXIgSVAgYWRkcmVzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIHRoZSBuYW1lIAorICAgICAqCQkJb2YgdGhlIHNlcnZlcgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJOYW1lKCk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwb3J0IG51bWJlciB0byB3aGljaCB0aGUgcmVxdWVzdCB3YXMgc2VudC4KKyAgICAgKiBJdCBpcyB0aGUgdmFsdWUgb2YgdGhlIHBhcnQgYWZ0ZXIgIjoiIGluIHRoZSA8Y29kZT5Ib3N0PC9jb2RlPgorICAgICAqIGhlYWRlciB2YWx1ZSwgaWYgYW55LCBvciB0aGUgc2VydmVyIHBvcnQgd2hlcmUgdGhlIGNsaWVudCBjb25uZWN0aW9uCisgICAgICogd2FzIGFjY2VwdGVkIG9uLgorICAgICAqCisgICAgICogQHJldHVybgkJYW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBwb3J0IG51bWJlcgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgaW50IGdldFNlcnZlclBvcnQoKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QgYXMgY2hhcmFjdGVyIGRhdGEgdXNpbmcKKyAgICAgKiBhIDxjb2RlPkJ1ZmZlcmVkUmVhZGVyPC9jb2RlPi4gIFRoZSByZWFkZXIgdHJhbnNsYXRlcyB0aGUgY2hhcmFjdGVyCisgICAgICogZGF0YSBhY2NvcmRpbmcgdG8gdGhlIGNoYXJhY3RlciBlbmNvZGluZyB1c2VkIG9uIHRoZSBib2R5LgorICAgICAqIEVpdGhlciB0aGlzIG1ldGhvZCBvciB7QGxpbmsgI2dldElucHV0U3RyZWFtfSBtYXkgYmUgY2FsbGVkIHRvIHJlYWQgdGhlCisgICAgICogYm9keSwgbm90IGJvdGguCisgICAgICogCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJCQlhIDxjb2RlPkJ1ZmZlcmVkUmVhZGVyPC9jb2RlPgorICAgICAqCQkJCQkJY29udGFpbmluZyB0aGUgYm9keSBvZiB0aGUgcmVxdWVzdAkKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiAJaWYgdGhlIGNoYXJhY3RlciBzZXQgZW5jb2RpbmcKKyAgICAgKiAJCQkJCQl1c2VkIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHRoZSAKKyAgICAgKgkJCQkJCXRleHQgY2Fubm90IGJlIGRlY29kZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uICAgCWlmIHtAbGluayAjZ2V0SW5wdXRTdHJlYW19IG1ldGhvZAorICAgICAqIAkJCQkJCWhhcyBiZWVuIGNhbGxlZCBvbiB0aGlzIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gIAkJCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKgorICAgICAqIEBzZWUgCQkJCQkjZ2V0SW5wdXRTdHJlYW0KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIEJ1ZmZlcmVkUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEludGVybmV0IFByb3RvY29sIChJUCkgYWRkcmVzcyBvZiB0aGUgY2xpZW50IAorICAgICAqIG9yIGxhc3QgcHJveHkgdGhhdCBzZW50IHRoZSByZXF1ZXN0LgorICAgICAqIEZvciBIVFRQIHNlcnZsZXRzLCBzYW1lIGFzIHRoZSB2YWx1ZSBvZiB0aGUgCisgICAgICogQ0dJIHZhcmlhYmxlIDxjb2RlPlJFTU9URV9BRERSPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIHRoZSAKKyAgICAgKgkJCUlQIGFkZHJlc3Mgb2YgdGhlIGNsaWVudCB0aGF0IHNlbnQgdGhlIHJlcXVlc3QKKyAgICAgKgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlQWRkcigpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsaWVudAorICAgICAqIG9yIHRoZSBsYXN0IHByb3h5IHRoYXQgc2VudCB0aGUgcmVxdWVzdC4KKyAgICAgKiBJZiB0aGUgZW5naW5lIGNhbm5vdCBvciBjaG9vc2VzIG5vdCB0byByZXNvbHZlIHRoZSBob3N0bmFtZSAKKyAgICAgKiAodG8gaW1wcm92ZSBwZXJmb3JtYW5jZSksIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGRvdHRlZC1zdHJpbmcgZm9ybSBvZiAKKyAgICAgKiB0aGUgSVAgYWRkcmVzcy4gRm9yIEhUVFAgc2VydmxldHMsIHNhbWUgYXMgdGhlIHZhbHVlIG9mIHRoZSBDR0kgdmFyaWFibGUgCisgICAgICogPGNvZGU+UkVNT1RFX0hPU1Q8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGZ1bGx5IAorICAgICAqCQkJcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsaWVudAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUhvc3QoKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogU3RvcmVzIGFuIGF0dHJpYnV0ZSBpbiB0aGlzIHJlcXVlc3QuCisgICAgICogQXR0cmlidXRlcyBhcmUgcmVzZXQgYmV0d2VlbiByZXF1ZXN0cy4gIFRoaXMgbWV0aG9kIGlzIG1vc3QKKyAgICAgKiBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgge0BsaW5rIFJlcXVlc3REaXNwYXRjaGVyfS4KKyAgICAgKgorICAgICAqIDxwPkF0dHJpYnV0ZSBuYW1lcyBzaG91bGQgZm9sbG93IHRoZSBzYW1lIGNvbnZlbnRpb25zIGFzCisgICAgICogcGFja2FnZSBuYW1lcy4gTmFtZXMgYmVnaW5uaW5nIHdpdGggPGNvZGU+amF2YS4qPC9jb2RlPiwKKyAgICAgKiA8Y29kZT5qYXZheC4qPC9jb2RlPiwgYW5kIDxjb2RlPmNvbS5zdW4uKjwvY29kZT4sIGFyZQorICAgICAqIHJlc2VydmVkIGZvciB1c2UgYnkgU3VuIE1pY3Jvc3lzdGVtcy4KKyAgICAgKjxicj4gSWYgdGhlIG9iamVjdCBwYXNzZWQgaW4gaXMgbnVsbCwgdGhlIGVmZmVjdCBpcyB0aGUgc2FtZSBhcworICAgICAqIGNhbGxpbmcge0BsaW5rICNyZW1vdmVBdHRyaWJ1dGV9LgorICAgICAqIDxicj4gSXQgaXMgd2FybmVkIHRoYXQgd2hlbiB0aGUgcmVxdWVzdCBpcyBkaXNwYXRjaGVkIGZyb20gdGhlCisgICAgICogc2VydmxldCByZXNpZGVzIGluIGEgZGlmZmVyZW50IHdlYiBhcHBsaWNhdGlvbiBieQorICAgICAqIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyPC9jb2RlPiwgdGhlIG9iamVjdCBzZXQgYnkgdGhpcyBtZXRob2QKKyAgICAgKiBtYXkgbm90IGJlIGNvcnJlY3RseSByZXRyaWV2ZWQgaW4gdGhlIGNhbGxlciBzZXJ2bGV0LgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQkJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIAorICAgICAqCQkJCQl0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gbwkJCQl0aGUgPGNvZGU+T2JqZWN0PC9jb2RlPiB0byBiZSBzdG9yZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3Qgbyk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJlbW92ZXMgYW4gYXR0cmlidXRlIGZyb20gdGhpcyByZXF1ZXN0LiAgVGhpcyBtZXRob2QgaXMgbm90CisgICAgICogZ2VuZXJhbGx5IG5lZWRlZCBhcyBhdHRyaWJ1dGVzIG9ubHkgcGVyc2lzdCBhcyBsb25nIGFzIHRoZSByZXF1ZXN0CisgICAgICogaXMgYmVpbmcgaGFuZGxlZC4KKyAgICAgKgorICAgICAqIDxwPkF0dHJpYnV0ZSBuYW1lcyBzaG91bGQgZm9sbG93IHRoZSBzYW1lIGNvbnZlbnRpb25zIGFzCisgICAgICogcGFja2FnZSBuYW1lcy4gTmFtZXMgYmVnaW5uaW5nIHdpdGggPGNvZGU+amF2YS4qPC9jb2RlPiwKKyAgICAgKiA8Y29kZT5qYXZheC4qPC9jb2RlPiwgYW5kIDxjb2RlPmNvbS5zdW4uKjwvY29kZT4sIGFyZQorICAgICAqIHJlc2VydmVkIGZvciB1c2UgYnkgU3VuIE1pY3Jvc3lzdGVtcy4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUJCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyAKKyAgICAgKgkJCQkJdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byByZW1vdmUKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyB0aGUgcHJlZmVycmVkIDxjb2RlPkxvY2FsZTwvY29kZT4gdGhhdCB0aGUgY2xpZW50IHdpbGwgCisgICAgICogYWNjZXB0IGNvbnRlbnQgaW4sIGJhc2VkIG9uIHRoZSBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyLgorICAgICAqIElmIHRoZSBjbGllbnQgcmVxdWVzdCBkb2Vzbid0IHByb3ZpZGUgYW4gQWNjZXB0LUxhbmd1YWdlIGhlYWRlciwKKyAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBkZWZhdWx0IGxvY2FsZSBmb3IgdGhlIHNlcnZlci4KKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybgkJdGhlIHByZWZlcnJlZCA8Y29kZT5Mb2NhbGU8L2NvZGU+IGZvciB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJldHVybnMgYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIDxjb2RlPkxvY2FsZTwvY29kZT4gb2JqZWN0cworICAgICAqIGluZGljYXRpbmcsIGluIGRlY3JlYXNpbmcgb3JkZXIgc3RhcnRpbmcgd2l0aCB0aGUgcHJlZmVycmVkIGxvY2FsZSwgdGhlCisgICAgICogbG9jYWxlcyB0aGF0IGFyZSBhY2NlcHRhYmxlIHRvIHRoZSBjbGllbnQgYmFzZWQgb24gdGhlIEFjY2VwdC1MYW5ndWFnZQorICAgICAqIGhlYWRlci4KKyAgICAgKiBJZiB0aGUgY2xpZW50IHJlcXVlc3QgZG9lc24ndCBwcm92aWRlIGFuIEFjY2VwdC1MYW5ndWFnZSBoZWFkZXIsCisgICAgICogdGhpcyBtZXRob2QgcmV0dXJucyBhbiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gY29udGFpbmluZyBvbmUgCisgICAgICogPGNvZGU+TG9jYWxlPC9jb2RlPiwgdGhlIGRlZmF1bHQgbG9jYWxlIGZvciB0aGUgc2VydmVyLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhbiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gb2YgcHJlZmVycmVkIAorICAgICAqICAgICAgICAgICAgICAgICAgPGNvZGU+TG9jYWxlPC9jb2RlPiBvYmplY3RzIGZvciB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRMb2NhbGVzKCk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHJlcXVlc3Qgd2FzIG1hZGUgdXNpbmcgYQorICAgICAqIHNlY3VyZSBjaGFubmVsLCBzdWNoIGFzIEhUVFBTLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgcmVxdWVzdCB3YXMgbWFkZSB1c2luZyBhCisgICAgICogICAgICAgICAgICAgICAgICBzZWN1cmUgY2hhbm5lbAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFJlcXVlc3REaXNwYXRjaGVyfSBvYmplY3QgdGhhdCBhY3RzIGFzIGEgd3JhcHBlciBmb3IKKyAgICAgKiB0aGUgcmVzb3VyY2UgbG9jYXRlZCBhdCB0aGUgZ2l2ZW4gcGF0aC4gIAorICAgICAqIEEgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+IG9iamVjdCBjYW4gYmUgdXNlZCB0byBmb3J3YXJkCisgICAgICogYSByZXF1ZXN0IHRvIHRoZSByZXNvdXJjZSBvciB0byBpbmNsdWRlIHRoZSByZXNvdXJjZSBpbiBhIHJlc3BvbnNlLgorICAgICAqIFRoZSByZXNvdXJjZSBjYW4gYmUgZHluYW1pYyBvciBzdGF0aWMuCisgICAgICoKKyAgICAgKiA8cD5UaGUgcGF0aG5hbWUgc3BlY2lmaWVkIG1heSBiZSByZWxhdGl2ZSwgYWx0aG91Z2ggaXQgY2Fubm90IGV4dGVuZAorICAgICAqIG91dHNpZGUgdGhlIGN1cnJlbnQgc2VydmxldCBjb250ZXh0LiAgSWYgdGhlIHBhdGggYmVnaW5zIHdpdGggCisgICAgICogYSAiLyIgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgY29udGV4dCByb290LiAgCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc2VydmxldCBjb250YWluZXIKKyAgICAgKiBjYW5ub3QgcmV0dXJuIGEgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+VGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIG1ldGhvZCBhbmQge0BsaW5rCisgICAgICogU2VydmxldENvbnRleHQjZ2V0UmVxdWVzdERpc3BhdGNoZXJ9IGlzIHRoYXQgdGhpcyBtZXRob2QgY2FuIHRha2UgYQorICAgICAqIHJlbGF0aXZlIHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCAgICAgIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBwYXRobmFtZQorICAgICAqICAgICAgICAgICAgICAgICAgdG8gdGhlIHJlc291cmNlLiBJZiBpdCBpcyByZWxhdGl2ZSwgaXQgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgYWdhaW5zdCB0aGUgY3VycmVudCBzZXJ2bGV0LgorICAgICAqCisgICAgICogQHJldHVybiAgICAgICAgICBhIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyPC9jb2RlPiBvYmplY3QKKyAgICAgKiAgICAgICAgICAgICAgICAgIHRoYXQgYWN0cyBhcyBhIHdyYXBwZXIgZm9yIHRoZSByZXNvdXJjZQorICAgICAqICAgICAgICAgICAgICAgICAgYXQgdGhlIHNwZWNpZmllZCBwYXRoLCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICAgaWYgdGhlIHNlcnZsZXQgY29udGFpbmVyIGNhbm5vdCByZXR1cm4gYQorICAgICAqICAgICAgICAgICAgICAgICAgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+CisgICAgICoKKyAgICAgKiBAc2VlICAgICAgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyCisgICAgICogQHNlZSAgICAgICAgICAgICBTZXJ2bGV0Q29udGV4dCNnZXRSZXF1ZXN0RGlzcGF0Y2hlcgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0UmVxdWVzdERpc3BhdGNoZXIoU3RyaW5nIHBhdGgpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogCisgICAgICogQGRlcHJlY2F0ZWQgCUFzIG9mIFZlcnNpb24gMi4xIG9mIHRoZSBKYXZhIFNlcnZsZXQgQVBJLAorICAgICAqIAkJCXVzZSB7QGxpbmsgU2VydmxldENvbnRleHQjZ2V0UmVhbFBhdGh9IGluc3RlYWQuCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbFBhdGgoU3RyaW5nIHBhdGgpOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEludGVybmV0IFByb3RvY29sIChJUCkgc291cmNlIHBvcnQgb2YgdGhlIGNsaWVudAorICAgICAqIG9yIGxhc3QgcHJveHkgdGhhdCBzZW50IHRoZSByZXF1ZXN0LgorICAgICAqCisgICAgICogQHJldHVybglhbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIHBvcnQgbnVtYmVyCisgICAgICoKKyAgICAgKiBAc2luY2UgMi40CisgICAgICovICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0UmVtb3RlUG9ydCgpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBob3N0IG5hbWUgb2YgdGhlIEludGVybmV0IFByb3RvY29sIChJUCkgaW50ZXJmYWNlIG9uCisgICAgICogd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIHJlY2VpdmVkLgorICAgICAqCisgICAgICogQHJldHVybglhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgaG9zdAorICAgICAqCQluYW1lIG9mIHRoZSBJUCBvbiB3aGljaCB0aGUgcmVxdWVzdCB3YXMgcmVjZWl2ZWQuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi40CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEludGVybmV0IFByb3RvY29sIChJUCkgYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlIG9uCisgICAgICogd2hpY2ggdGhlIHJlcXVlc3QgIHdhcyByZWNlaXZlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4JYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlCisgICAgICoJCUlQIGFkZHJlc3Mgb24gd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIHJlY2VpdmVkLiAKKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjQKKyAgICAgKgorICAgICAqLyAgICAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsQWRkcigpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBJbnRlcm5ldCBQcm90b2NvbCAoSVApIHBvcnQgbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UKKyAgICAgKiBvbiB3aGljaCB0aGUgcmVxdWVzdCB3YXMgcmVjZWl2ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgcG9ydCBudW1iZXIKKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpOworCit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGE1ODYxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVFdmVudC5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0OworCisKKyAgICAvKiogCisgICAgICAqIFRoaXMgaXMgdGhlIGV2ZW50IGNsYXNzIGZvciBub3RpZmljYXRpb25zIG9mIGNoYW5nZXMgdG8gdGhlIAorICAgICAgKiBhdHRyaWJ1dGVzIG9mIHRoZSBzZXJ2bGV0IHJlcXVlc3QgaW4gYW4gYXBwbGljYXRpb24uCisgICAgICAqIEBzZWUgU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVMaXN0ZW5lcgorICAgICAgKiBAc2luY2UJU2VydmxldCAyLjQKKyAgICAgICovCisKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUV2ZW50IGV4dGVuZHMgU2VydmxldFJlcXVlc3RFdmVudCB7IAorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7CisKKyAgICAgLyoqIENvbnN0cnVjdCBhIFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQgZ2l2aW5nIHRoZSBzZXJ2bGV0IGNvbnRleHQKKyAgICAgICogb2YgdGhpcyB3ZWIgYXBwbGljYXRpb24sIHRoZSBTZXJ2bGV0UmVxdWVzdCB3aG9zZSBhdHRyaWJ1dGVzIGFyZQorICAgICAgKiBjaGFuZ2luZyBhbmQgdGhlIG5hbWUgYW5kIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICAqCisgICAgICAqIEBwYXJhbSBzYwkJdGhlIFNlcnZsZXRDb250ZXh0IHRoYXQgaXMgc2VuZGluZyB0aGUgZXZlbnQuCisgICAgICAqIEBwYXJhbSByZXF1ZXN0CQl0aGUgU2VydmxldFJlcXVlc3QgdGhhdCBpcyBzZW5kaW5nIHRoZSBldmVudC4KKyAgICAgICogQHBhcmFtIG5hbWUJCXRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0IGF0dHJpYnV0ZS4KKyAgICAgICogQHBhcmFtIHZhbHVlCQl0aGUgdmFsdWUgb2YgdGhlIHJlcXVlc3QgYXR0cmlidXRlLgorICAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVFdmVudChTZXJ2bGV0Q29udGV4dCBzYywgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzdXBlcihzYywgcmVxdWVzdCk7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkIG9uIHRoZSBTZXJ2bGV0UmVxdWVzdC4KKyAgICAgICoKKyAgICAgICogQHJldHVybgkJdGhlIG5hbWUgb2YgdGhlIGNoYW5nZWQgcmVxdWVzdCBhdHRyaWJ1dGUKKyAgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgaGFzIGJlZW4gYWRkZWQsIHJlbW92ZWQgb3IgCisgICAgICAqIHJlcGxhY2VkLiBJZiB0aGUgYXR0cmlidXRlIHdhcyBhZGRlZCwgdGhpcyBpcyB0aGUgdmFsdWUgb2YgdGhlIAorICAgICAgKiBhdHRyaWJ1dGUuIElmIHRoZSBhdHRyaWJ1dGUgd2FzIHJlbW92ZWQsIHRoaXMgaXMgdGhlIHZhbHVlIG9mIHRoZSAKKyAgICAgICogcmVtb3ZlZCBhdHRyaWJ1dGUuIElmIHRoZSBhdHRyaWJ1dGUgd2FzIHJlcGxhY2VkLCB0aGlzIGlzIHRoZSBvbGQgCisgICAgICAqIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICAqCisgICAgICAqIEByZXR1cm4JCXRoZSB2YWx1ZSBvZiB0aGUgY2hhbmdlZCByZXF1ZXN0IGF0dHJpYnV0ZQorICAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2NWZhMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0QXR0cmlidXRlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOworCisgICAgLyoqCisgICAgICogQSBTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyIGNhbiBiZSBpbXBsZW1lbnRlZCBieSB0aGUKKyAgICAgKiBkZXZlbG9wZXIgaW50ZXJlc3RlZCBpbiBiZWluZyBub3RpZmllZCBvZiByZXF1ZXN0IGF0dHJpYnV0ZQorICAgICAqIGNoYW5nZXMuIE5vdGlmaWNhdGlvbnMgd2lsbCBiZSBnZW5lcmF0ZWQgd2hpbGUgdGhlIHJlcXVlc3QKKyAgICAgKiBpcyB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gaW4gd2hpY2ggdGhlIGxpc3RlbmVyCisgICAgICogaXMgcmVnaXN0ZXJlZC4gQSByZXF1ZXN0IGlzIGRlZmluZWQgYXMgY29taW5nIGludG8gc2NvcGUgd2hlbgorICAgICAqIGl0IGlzIGFib3V0IHRvIGVudGVyIHRoZSBmaXJzdCBzZXJ2bGV0IG9yIGZpbHRlciBpbiBlYWNoIHdlYgorICAgICAqIGFwcGxpY2F0aW9uLCBhcyBnb2luZyBvdXQgb2Ygc2NvcGUgd2hlbiBpdCBleGl0cyB0aGUgbGFzdCBzZXJ2bGV0CisgICAgICogb3IgdGhlIGZpcnN0IGZpbHRlciBpbiB0aGUgY2hhaW4uCisgICAgICoKKyAgICAgKiBAc2luY2UgU2VydmxldCAyLjQKKyAgICAgKi8KKworcHVibGljIGludGVyZmFjZSBTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CisgICAgLyoqIE5vdGlmaWNhdGlvbiB0aGF0IGEgbmV3IGF0dHJpYnV0ZSB3YXMgYWRkZWQgdG8gdGhlCisgICAgICoqIHNlcnZsZXQgcmVxdWVzdC4gQ2FsbGVkIGFmdGVyIHRoZSBhdHRyaWJ1dGUgaXMgYWRkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlQWRkZWQoU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVFdmVudCBzcmFlKTsKKworICAgIC8qKiBOb3RpZmljYXRpb24gdGhhdCBhbiBleGlzdGluZyBhdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZQorICAgICAqKiBzZXJ2bGV0IHJlcXVlc3QuIENhbGxlZCBhZnRlciB0aGUgYXR0cmlidXRlIGlzIHJlbW92ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlUmVtb3ZlZChTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUV2ZW50IHNyYWUpOworCisgICAgLyoqIE5vdGlmaWNhdGlvbiB0aGF0IGFuIGF0dHJpYnV0ZSB3YXMgcmVwbGFjZWQgb24gdGhlCisgICAgICoqIHNlcnZsZXQgcmVxdWVzdC4gQ2FsbGVkIGFmdGVyIHRoZSBhdHRyaWJ1dGUgaXMgcmVwbGFjZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlUmVwbGFjZWQoU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVFdmVudCBzcmFlKTsKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3RFdmVudC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3RFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTUwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdEV2ZW50LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKKworICAgIC8qKiAKKyAgICAgICogRXZlbnRzIG9mIHRoaXMga2luZCBpbmRpY2F0ZSBsaWZlY3ljbGUKKyAgICAgICogZXZlbnRzIGZvciBhIFNlcnZsZXRSZXF1ZXN0LgorICAgICAgKiBUaGUgc291cmNlIG9mIHRoZSBldmVudAorICAgICAgKiBpcyB0aGUgU2VydmxldENvbnRleHQgb2YgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICAqIEBzZWUgU2VydmxldFJlcXVlc3RMaXN0ZW5lcgorICAgICAgKiBAc2luY2UJU2VydmxldCAyLjQKKyAgICAgICovCisKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0UmVxdWVzdEV2ZW50IGV4dGVuZHMgamF2YS51dGlsLkV2ZW50T2JqZWN0IHsgCisgICAgcHJpdmF0ZSBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OworCisgICAgLyoqIENvbnN0cnVjdCBhIFNlcnZsZXRSZXF1ZXN0RXZlbnQgZm9yIHRoZSBnaXZlbiBTZXJ2bGV0Q29udGV4dAorICAgICAgKiBhbmQgU2VydmxldFJlcXVlc3QuCisgICAgICAqCisgICAgICAqIEBwYXJhbSBzYwkJdGhlIFNlcnZsZXRDb250ZXh0IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uCisgICAgICAqIEBwYXJhbSByZXF1ZXN0CQl0aGUgU2VydmxldFJlcXVlc3QgdGhhdCBpcyBzZW5kaW5nIHRoZSBldmVudC4KKyAgICAgICovCisgICAgcHVibGljIFNlcnZsZXRSZXF1ZXN0RXZlbnQoU2VydmxldENvbnRleHQgc2MsIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgc3VwZXIoc2MpOworICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgICogUmV0dXJucyB0aGUgU2VydmxldFJlcXVlc3QgdGhhdCBpcyBjaGFuZ2luZy4KKyAgICAgICovCisgICAgcHVibGljIFNlcnZsZXRSZXF1ZXN0IGdldFNlcnZsZXRSZXF1ZXN0ICgpIHsgCisgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICAqIFJldHVybnMgdGhlIFNlcnZsZXRDb250ZXh0IG9mIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQgKCkgeyAKKyAgICAgICAgcmV0dXJuIChTZXJ2bGV0Q29udGV4dCkgc3VwZXIuZ2V0U291cmNlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3RMaXN0ZW5lci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3RMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYzcwNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKKworICAgIC8qKgorICAgICAqIEEgU2VydmxldFJlcXVlc3RMaXN0ZW5lciBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRldmVsb3BlcgorICAgICAqIGludGVyZXN0ZWQgaW4gYmVpbmcgbm90aWZpZWQgb2YgcmVxdWVzdHMgY29taW5nIGluIGFuZCBvdXQgb2YKKyAgICAgKiBzY29wZSBpbiBhIHdlYiBjb21wb25lbnQuIEEgcmVxdWVzdCBpcyBkZWZpbmVkIGFzIGNvbWluZyBpbnRvCisgICAgICogc2NvcGUgd2hlbiBpdCBpcyBhYm91dCB0byBlbnRlciB0aGUgZmlyc3Qgc2VydmxldCBvciBmaWx0ZXIKKyAgICAgKiBpbiBlYWNoIHdlYiBhcHBsaWNhdGlvbiwgYXMgZ29pbmcgb3V0IG9mIHNjb3BlIHdoZW4gaXQgZXhpdHMKKyAgICAgKiB0aGUgbGFzdCBzZXJ2bGV0IG9yIHRoZSBmaXJzdCBmaWx0ZXIgaW4gdGhlIGNoYWluLgorICAgICAqCisgICAgICogQHNpbmNlIFNlcnZsZXQgMi40CisgICAgICovCisKKworcHVibGljIGludGVyZmFjZSBTZXJ2bGV0UmVxdWVzdExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CisKKyAgICAvKiogVGhlIHJlcXVlc3QgaXMgYWJvdXQgdG8gZ28gb3V0IG9mIHNjb3BlIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uICovCisgICAgcHVibGljIHZvaWQgcmVxdWVzdERlc3Ryb3llZCAoIFNlcnZsZXRSZXF1ZXN0RXZlbnQgc3JlICk7CisKKyAgICAvKiogVGhlIHJlcXVlc3QgaXMgYWJvdXQgdG8gY29tZSBpbnRvIHNjb3BlIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uICovCisgICAgcHVibGljIHZvaWQgcmVxdWVzdEluaXRpYWxpemVkICggU2VydmxldFJlcXVlc3RFdmVudCBzcmUgKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3RXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4MGE4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsNDAxIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisKKworLyoqCisgKiAKKyAqIFByb3ZpZGVzIGEgY29udmVuaWVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2VydmxldFJlcXVlc3QgaW50ZXJmYWNlIHRoYXQKKyAqIGNhbiBiZSBzdWJjbGFzc2VkIGJ5IGRldmVsb3BlcnMgd2lzaGluZyB0byBhZGFwdCB0aGUgcmVxdWVzdCB0byBhIFNlcnZsZXQuCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFdyYXBwZXIgb3IgRGVjb3JhdG9yIHBhdHRlcm4uIE1ldGhvZHMgZGVmYXVsdCB0bworICogY2FsbGluZyB0aHJvdWdoIHRvIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAqIEBzaW5jZQl2IDIuMworICogCisgKiAKKyAqCisgKiBAc2VlIAlqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0CisgKgorICovCisKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgaW1wbGVtZW50cyBTZXJ2bGV0UmVxdWVzdCB7CisgICAgcHJpdmF0ZSBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OworCisJLyoqCisJKiBDcmVhdGVzIGEgU2VydmxldFJlcXVlc3QgYWRhcHRvciB3cmFwcGluZyB0aGUgZ2l2ZW4gcmVxdWVzdCBvYmplY3QuIAorCSogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSByZXF1ZXN0IGlzIG51bGwKKwkqLworCisgICAgcHVibGljIFNlcnZsZXRSZXF1ZXN0V3JhcHBlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisJaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworCSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZXF1ZXN0IGNhbm5vdCBiZSBudWxsIik7ICAgCisJfQorCXRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgfQorCisJLyoqCisJKiBSZXR1cm4gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisJKi8KKwlwdWJsaWMgU2VydmxldFJlcXVlc3QgZ2V0UmVxdWVzdCgpIHsKKwkJcmV0dXJuIHRoaXMucmVxdWVzdDsKKwl9CisJCisJLyoqCisJKiBTZXRzIHRoZSByZXF1ZXN0IG9iamVjdCBiZWluZyB3cmFwcGVkLiAKKwkqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcmVxdWVzdCBpcyBudWxsLgorCSovCisJCisJcHVibGljIHZvaWQgc2V0UmVxdWVzdChTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisJICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVxdWVzdCBjYW5ub3QgYmUgbnVsbCIpOworCSAgICB9CisJICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisJfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRBdHRyaWJ1dGUobmFtZSk7CisJfQorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldEF0dHJpYnV0ZU5hbWVzKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVOYW1lcygpIHsKKwlyZXR1cm4gdGhpcy5yZXF1ZXN0LmdldEF0dHJpYnV0ZU5hbWVzKCk7CisJfSAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldENoYXJhY3RlckVuY29kaW5nKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpOworCX0KKwkKKyAgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gc2V0IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlckVuY29kaW5nKFN0cmluZyBlbmMpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworCXRoaXMucmVxdWVzdC5zZXRDaGFyYWN0ZXJFbmNvZGluZyhlbmMpOworCX0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldENvbnRlbnRMZW5ndGgoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCkgeworCXJldHVybiB0aGlzLnJlcXVlc3QuZ2V0Q29udGVudExlbmd0aCgpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKworICAgICAgIC8qKgorICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0Q29udGVudFR5cGUoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRDb250ZW50VHlwZSgpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKworICAgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldElucHV0U3RyZWFtKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBTZXJ2bGV0SW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXJldHVybiB0aGlzLnJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKTsKKwl9CisgICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworCXJldHVybiB0aGlzLnJlcXVlc3QuZ2V0UGFyYW1ldGVyKG5hbWUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldFBhcmFtZXRlck1hcCgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIE1hcCBnZXRQYXJhbWV0ZXJNYXAoKSB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRQYXJhbWV0ZXJNYXAoKTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldFBhcmFtZXRlck5hbWVzKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICAgCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFBhcmFtZXRlck5hbWVzKCkgeworCXJldHVybiB0aGlzLnJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisKKyAgICAgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgbmFtZSkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBuYW1lKSB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMobmFtZSk7CisJfQorICAgIAorICAgIAorICAgIAorCisgICAgIC8qKgorICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0UHJvdG9jb2woKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRQcm90b2NvbCgpOworCX0KKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0U2NoZW1lKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICAKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1lKCkgeworCXJldHVybiB0aGlzLnJlcXVlc3QuZ2V0U2NoZW1lKCk7CisJfQorICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRTZXJ2ZXJOYW1lKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlck5hbWUoKSB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCk7CisJfQorICAgIAorICAgIAorICAgIAorCisgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldFNlcnZlclBvcnQoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIGludCBnZXRTZXJ2ZXJQb3J0KCkgeworCXJldHVybiB0aGlzLnJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpOworCX0KKyAgICAKKyAgICAKKyAgICAKKyAgLyoqCisgICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRSZWFkZXIoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIEJ1ZmZlcmVkUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRSZWFkZXIoKTsKKwl9CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldFJlbW90ZUFkZHIoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlQWRkcigpIHsKKwlyZXR1cm4gdGhpcy5yZXF1ZXN0LmdldFJlbW90ZUFkZHIoKTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisKKyAgICAgIC8qKgorICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0UmVtb3RlSG9zdCgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUhvc3QoKSB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRSZW1vdGVIb3N0KCk7CisgICAgfQorICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCBvKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgbykgeworCXRoaXMucmVxdWVzdC5zZXRBdHRyaWJ1dGUobmFtZSwgbyk7CisgICAgfQorICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCXRoaXMucmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorICAgIAorICAgIAorICAgIAorCisgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldExvY2FsZSgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKKwlyZXR1cm4gdGhpcy5yZXF1ZXN0LmdldExvY2FsZSgpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKworICAgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldExvY2FsZXMoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldExvY2FsZXMoKSB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRMb2NhbGVzKCk7CisgICAgfQorICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBpc1NlY3VyZSgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKKwlyZXR1cm4gdGhpcy5yZXF1ZXN0LmlzU2VjdXJlKCk7CisgICAgfQorICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRSZXF1ZXN0RGlzcGF0Y2hlcihTdHJpbmcgcGF0aCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBSZXF1ZXN0RGlzcGF0Y2hlciBnZXRSZXF1ZXN0RGlzcGF0Y2hlcihTdHJpbmcgcGF0aCkgeworCXJldHVybiB0aGlzLnJlcXVlc3QuZ2V0UmVxdWVzdERpc3BhdGNoZXIocGF0aCk7CisgICAgfQorICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRSZWFsUGF0aChTdHJpbmcgcGF0aCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbFBhdGgoU3RyaW5nIHBhdGgpIHsKKwlyZXR1cm4gdGhpcy5yZXF1ZXN0LmdldFJlYWxQYXRoKHBhdGgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4KKyAgICAgKiBnZXRSZW1vdGVQb3J0KCkgb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi40CisgICAgICovICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0UmVtb3RlUG9ydCgpeworICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldFJlbW90ZVBvcnQoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybgorICAgICAqIGdldExvY2FsTmFtZSgpIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqCisgICAgICogQHNpbmNlIDIuNAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCl7CisgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0TG9jYWxOYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuCisgICAgICogZ2V0TG9jYWxBZGRyKCkgb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi40CisgICAgICovICAgICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxBZGRyKCl7CisgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0TG9jYWxBZGRyKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4KKyAgICAgKiBnZXRMb2NhbFBvcnQoKSBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpeworICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldExvY2FsUG9ydCgpOworICAgIH0KKyAgICAKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldFJlc3BvbnNlLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0UmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTQyN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldFJlc3BvbnNlLmphdmEKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKworLyoqCisgKiBEZWZpbmVzIGFuIG9iamVjdCB0byBhc3Npc3QgYSBzZXJ2bGV0IGluIHNlbmRpbmcgYSByZXNwb25zZSB0byB0aGUgY2xpZW50LgorICogVGhlIHNlcnZsZXQgY29udGFpbmVyIGNyZWF0ZXMgYSA8Y29kZT5TZXJ2bGV0UmVzcG9uc2U8L2NvZGU+IG9iamVjdCBhbmQKKyAqIHBhc3NlcyBpdCBhcyBhbiBhcmd1bWVudCB0byB0aGUgc2VydmxldCdzIDxjb2RlPnNlcnZpY2U8L2NvZGU+IG1ldGhvZC4KKyAqCisgKiA8cD5UbyBzZW5kIGJpbmFyeSBkYXRhIGluIGEgTUlNRSBib2R5IHJlc3BvbnNlLCB1c2UKKyAqIHRoZSB7QGxpbmsgU2VydmxldE91dHB1dFN0cmVhbX0gcmV0dXJuZWQgYnkge0BsaW5rICNnZXRPdXRwdXRTdHJlYW19LgorICogVG8gc2VuZCBjaGFyYWN0ZXIgZGF0YSwgdXNlIHRoZSA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4gb2JqZWN0IAorICogcmV0dXJuZWQgYnkge0BsaW5rICNnZXRXcml0ZXJ9LiBUbyBtaXggYmluYXJ5IGFuZCB0ZXh0IGRhdGEsCisgKiBmb3IgZXhhbXBsZSwgdG8gY3JlYXRlIGEgbXVsdGlwYXJ0IHJlc3BvbnNlLCB1c2UgYQorICogPGNvZGU+U2VydmxldE91dHB1dFN0cmVhbTwvY29kZT4gYW5kIG1hbmFnZSB0aGUgY2hhcmFjdGVyIHNlY3Rpb25zCisgKiBtYW51YWxseS4KKyAqCisgKiA8cD5UaGUgY2hhcnNldCBmb3IgdGhlIE1JTUUgYm9keSByZXNwb25zZSBjYW4gYmUgc3BlY2lmaWVkCisgKiBleHBsaWNpdGx5IHVzaW5nIHRoZSB7QGxpbmsgI3NldENoYXJhY3RlckVuY29kaW5nfSBhbmQKKyAqIHtAbGluayAjc2V0Q29udGVudFR5cGV9IG1ldGhvZHMsIG9yIGltcGxpY2l0bHkKKyAqIHVzaW5nIHRoZSB7QGxpbmsgI3NldExvY2FsZX0gbWV0aG9kLgorICogRXhwbGljaXQgc3BlY2lmaWNhdGlvbnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIKKyAqIGltcGxpY2l0IHNwZWNpZmljYXRpb25zLiBJZiBubyBjaGFyc2V0IGlzIHNwZWNpZmllZCwgSVNPLTg4NTktMSB3aWxsIGJlCisgKiB1c2VkLiBUaGUgPGNvZGU+c2V0Q2hhcmFjdGVyRW5jb2Rpbmc8L2NvZGU+LAorICogPGNvZGU+c2V0Q29udGVudFR5cGU8L2NvZGU+LCBvciA8Y29kZT5zZXRMb2NhbGU8L2NvZGU+IG1ldGhvZCBtdXN0CisgKiBiZSBjYWxsZWQgYmVmb3JlIDxjb2RlPmdldFdyaXRlcjwvY29kZT4gYW5kIGJlZm9yZSBjb21taXR0aW5nCisgKiB0aGUgcmVzcG9uc2UgZm9yIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgdXNlZC4KKyAqIAorICogPHA+U2VlIHRoZSBJbnRlcm5ldCBSRkNzIHN1Y2ggYXMgCisgKiA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMDQ1LnR4dCI+CisgKiBSRkMgMjA0NTwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gTUlNRS4gUHJvdG9jb2xzIHN1Y2ggYXMgU01UUAorICogYW5kIEhUVFAgZGVmaW5lIHByb2ZpbGVzIG9mIE1JTUUsIGFuZCB0aG9zZSBzdGFuZGFyZHMKKyAqIGFyZSBzdGlsbCBldm9sdmluZy4KKyAqCisgKiBAYXV0aG9yIAlWYXJpb3VzCisgKiBAdmVyc2lvbiAJJFZlcnNpb24kCisgKgorICogQHNlZQkJU2VydmxldE91dHB1dFN0cmVhbQorICoKKyAqLworIAorcHVibGljIGludGVyZmFjZSBTZXJ2bGV0UmVzcG9uc2UgeworCisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgKE1JTUUgY2hhcnNldCkKKyAgICAgKiB1c2VkIGZvciB0aGUgYm9keSBzZW50IGluIHRoaXMgcmVzcG9uc2UuCisgICAgICogVGhlIGNoYXJhY3RlciBlbmNvZGluZyBtYXkgaGF2ZSBiZWVuIHNwZWNpZmllZCBleHBsaWNpdGx5CisgICAgICogdXNpbmcgdGhlIHtAbGluayAjc2V0Q2hhcmFjdGVyRW5jb2Rpbmd9IG9yCisgICAgICoge0BsaW5rICNzZXRDb250ZW50VHlwZX0gbWV0aG9kcywgb3IgaW1wbGljaXRseSB1c2luZyB0aGUKKyAgICAgKiB7QGxpbmsgI3NldExvY2FsZX0gbWV0aG9kLiBFeHBsaWNpdCBzcGVjaWZpY2F0aW9ucyB0YWtlCisgICAgICogcHJlY2VkZW5jZSBvdmVyIGltcGxpY2l0IHNwZWNpZmljYXRpb25zLiBDYWxscyBtYWRlCisgICAgICogdG8gdGhlc2UgbWV0aG9kcyBhZnRlciA8Y29kZT5nZXRXcml0ZXI8L2NvZGU+IGhhcyBiZWVuCisgICAgICogY2FsbGVkIG9yIGFmdGVyIHRoZSByZXNwb25zZSBoYXMgYmVlbiBjb21taXR0ZWQgaGF2ZSBubworICAgICAqIGVmZmVjdCBvbiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nLiBJZiBubyBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAgICAgKiBoYXMgYmVlbiBzcGVjaWZpZWQsIDxjb2RlPklTTy04ODU5LTE8L2NvZGU+IGlzIHJldHVybmVkLgorICAgICAqIDxwPlNlZSBSRkMgMjA0NyAoaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjA0Ny50eHQpCisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY2hhcmFjdGVyIGVuY29kaW5nIGFuZCBNSU1FLgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlCisgICAgICoJCQluYW1lIG9mIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGZvcgorICAgICAqCQkJZXhhbXBsZSwgPGNvZGU+VVRGLTg8L2NvZGU+CisgICAgICoKKyAgICAgKi8KKyAgCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpOworICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29udGVudCB0eXBlIHVzZWQgZm9yIHRoZSBNSU1FIGJvZHkKKyAgICAgKiBzZW50IGluIHRoaXMgcmVzcG9uc2UuIFRoZSBjb250ZW50IHR5cGUgcHJvcGVyIG11c3QKKyAgICAgKiBoYXZlIGJlZW4gc3BlY2lmaWVkIHVzaW5nIHtAbGluayAjc2V0Q29udGVudFR5cGV9CisgICAgICogYmVmb3JlIHRoZSByZXNwb25zZSBpcyBjb21taXR0ZWQuIElmIG5vIGNvbnRlbnQgdHlwZQorICAgICAqIGhhcyBiZWVuIHNwZWNpZmllZCwgdGhpcyBtZXRob2QgcmV0dXJucyBudWxsLgorICAgICAqIElmIGEgY29udGVudCB0eXBlIGhhcyBiZWVuIHNwZWNpZmllZCBhbmQgYQorICAgICAqIGNoYXJhY3RlciBlbmNvZGluZyBoYXMgYmVlbiBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkKKyAgICAgKiBzcGVjaWZpZWQgYXMgZGVzY3JpYmVkIGluIHtAbGluayAjZ2V0Q2hhcmFjdGVyRW5jb2Rpbmd9LAorICAgICAqIHRoZSBjaGFyc2V0IHBhcmFtZXRlciBpcyBpbmNsdWRlZCBpbiB0aGUgc3RyaW5nIHJldHVybmVkLgorICAgICAqIElmIG5vIGNoYXJhY3RlciBlbmNvZGluZyBoYXMgYmVlbiBzcGVjaWZpZWQsIHRoZQorICAgICAqIGNoYXJzZXQgcGFyYW1ldGVyIGlzIG9taXR0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUKKyAgICAgKgkJCWNvbnRlbnQgdHlwZSwgZm9yIGV4YW1wbGUsCisgICAgICoJCQk8Y29kZT50ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTg8L2NvZGU+LAorICAgICAqCQkJb3IgbnVsbAorICAgICAqCisgICAgICogQHNpbmNlIDIuNAorICAgICAqLworICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCk7CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFNlcnZsZXRPdXRwdXRTdHJlYW19IHN1aXRhYmxlIGZvciB3cml0aW5nIGJpbmFyeSAKKyAgICAgKiBkYXRhIGluIHRoZSByZXNwb25zZS4gVGhlIHNlcnZsZXQgY29udGFpbmVyIGRvZXMgbm90IGVuY29kZSB0aGUKKyAgICAgKiBiaW5hcnkgZGF0YS4gIAorICAgICAKKyAgICAgKiA8cD4gQ2FsbGluZyBmbHVzaCgpIG9uIHRoZSBTZXJ2bGV0T3V0cHV0U3RyZWFtIGNvbW1pdHMgdGhlIHJlc3BvbnNlLgorICAgICAKKyAgICAgKiBFaXRoZXIgdGhpcyBtZXRob2Qgb3Ige0BsaW5rICNnZXRXcml0ZXJ9IG1heSAKKyAgICAgKiBiZSBjYWxsZWQgdG8gd3JpdGUgdGhlIGJvZHksIG5vdCBib3RoLgorICAgICAqCisgICAgICogQHJldHVybgkJCQlhIHtAbGluayBTZXJ2bGV0T3V0cHV0U3RyZWFtfSBmb3Igd3JpdGluZyBiaW5hcnkgZGF0YQkKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5nZXRXcml0ZXI8L2NvZGU+IG1ldGhvZAorICAgICAqIAkJCQkJaGFzIGJlZW4gY2FsbGVkIG9uIHRoaXMgcmVzcG9uc2UKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gCQlpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIG9jY3VycmVkCisgICAgICoKKyAgICAgKiBAc2VlIAkJCQkjZ2V0V3JpdGVyCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTZXJ2bGV0T3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4gb2JqZWN0IHRoYXQKKyAgICAgKiBjYW4gc2VuZCBjaGFyYWN0ZXIgdGV4dCB0byB0aGUgY2xpZW50LgorICAgICAqIFRoZSA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4gdXNlcyB0aGUgY2hhcmFjdGVyCisgICAgICogZW5jb2RpbmcgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRDaGFyYWN0ZXJFbmNvZGluZ30uCisgICAgICogSWYgdGhlIHJlc3BvbnNlJ3MgY2hhcmFjdGVyIGVuY29kaW5nIGhhcyBub3QgYmVlbgorICAgICAqIHNwZWNpZmllZCBhcyBkZXNjcmliZWQgaW4gPGNvZGU+Z2V0Q2hhcmFjdGVyRW5jb2Rpbmc8L2NvZGU+CisgICAgICogKGkuZS4sIHRoZSBtZXRob2QganVzdCByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIAorICAgICAqIDxjb2RlPklTTy04ODU5LTE8L2NvZGU+KSwgPGNvZGU+Z2V0V3JpdGVyPC9jb2RlPgorICAgICAqIHVwZGF0ZXMgaXQgdG8gPGNvZGU+SVNPLTg4NTktMTwvY29kZT4uCisgICAgICogPHA+Q2FsbGluZyBmbHVzaCgpIG9uIHRoZSA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4KKyAgICAgKiBjb21taXRzIHRoZSByZXNwb25zZS4KKyAgICAgKiA8cD5FaXRoZXIgdGhpcyBtZXRob2Qgb3Ige0BsaW5rICNnZXRPdXRwdXRTdHJlYW19IG1heSBiZSBjYWxsZWQKKyAgICAgKiB0byB3cml0ZSB0aGUgYm9keSwgbm90IGJvdGguCisgICAgICoKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIAkJYSA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4gb2JqZWN0IHRoYXQgCisgICAgICoJCQljYW4gcmV0dXJuIGNoYXJhY3RlciBkYXRhIHRvIHRoZSBjbGllbnQgCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgICAgKgkJCWlmIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgcmV0dXJuZWQKKyAgICAgKgkJCWJ5IDxjb2RlPmdldENoYXJhY3RlckVuY29kaW5nPC9jb2RlPiBjYW5ub3QgYmUgdXNlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKgkJCWlmIHRoZSA8Y29kZT5nZXRPdXRwdXRTdHJlYW08L2NvZGU+CisgICAgICogCQkJbWV0aG9kIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIAorICAgICAqCQkJcmVzcG9uc2Ugb2JqZWN0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCisgICAgICoJCQlpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIG9jY3VycmVkCisgICAgICoKKyAgICAgKiBAc2VlIAkJI2dldE91dHB1dFN0cmVhbQorICAgICAqIEBzZWUgCQkjc2V0Q2hhcmFjdGVyRW5jb2RpbmcKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgKE1JTUUgY2hhcnNldCkgb2YgdGhlIHJlc3BvbnNlCisgICAgICogYmVpbmcgc2VudCB0byB0aGUgY2xpZW50LCBmb3IgZXhhbXBsZSwgdG8gVVRGLTguCisgICAgICogSWYgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBoYXMgYWxyZWFkeSBiZWVuIHNldCBieQorICAgICAqIHtAbGluayAjc2V0Q29udGVudFR5cGV9IG9yIHtAbGluayAjc2V0TG9jYWxlfSwKKyAgICAgKiB0aGlzIG1ldGhvZCBvdmVycmlkZXMgaXQuCisgICAgICogQ2FsbGluZyB7QGxpbmsgI3NldENvbnRlbnRUeXBlfSB3aXRoIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+CisgICAgICogb2YgPGNvZGU+dGV4dC9odG1sPC9jb2RlPiBhbmQgY2FsbGluZworICAgICAqIHRoaXMgbWV0aG9kIHdpdGggdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gb2YgPGNvZGU+VVRGLTg8L2NvZGU+CisgICAgICogaXMgZXF1aXZhbGVudCB3aXRoIGNhbGxpbmcKKyAgICAgKiA8Y29kZT5zZXRDb250ZW50VHlwZTwvY29kZT4gd2l0aCB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBvZgorICAgICAqIDxjb2RlPnRleHQvaHRtbDsgY2hhcnNldD1VVEYtODwvY29kZT4uCisgICAgICogPHA+VGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCByZXBlYXRlZGx5IHRvIGNoYW5nZSB0aGUgY2hhcmFjdGVyCisgICAgICogZW5jb2RpbmcuCisgICAgICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiBpdCBpcyBjYWxsZWQgYWZ0ZXIKKyAgICAgKiA8Y29kZT5nZXRXcml0ZXI8L2NvZGU+IGhhcyBiZWVuCisgICAgICogY2FsbGVkIG9yIGFmdGVyIHRoZSByZXNwb25zZSBoYXMgYmVlbiBjb21taXR0ZWQuCisgICAgICogPHA+Q29udGFpbmVycyBtdXN0IGNvbW11bmljYXRlIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdXNlZCBmb3IKKyAgICAgKiB0aGUgc2VydmxldCByZXNwb25zZSdzIHdyaXRlciB0byB0aGUgY2xpZW50IGlmIHRoZSBwcm90b2NvbAorICAgICAqIHByb3ZpZGVzIGEgd2F5IGZvciBkb2luZyBzby4gSW4gdGhlIGNhc2Ugb2YgSFRUUCwgdGhlIGNoYXJhY3RlcgorICAgICAqIGVuY29kaW5nIGlzIGNvbW11bmljYXRlZCBhcyBwYXJ0IG9mIHRoZSA8Y29kZT5Db250ZW50LVR5cGU8L2NvZGU+CisgICAgICogaGVhZGVyIGZvciB0ZXh0IG1lZGlhIHR5cGVzLiBOb3RlIHRoYXQgdGhlIGNoYXJhY3RlciBlbmNvZGluZworICAgICAqIGNhbm5vdCBiZSBjb21tdW5pY2F0ZWQgdmlhIEhUVFAgaGVhZGVycyBpZiB0aGUgc2VydmxldCBkb2VzIG5vdAorICAgICAqIHNwZWNpZnkgYSBjb250ZW50IHR5cGU7IGhvd2V2ZXIsIGl0IGlzIHN0aWxsIHVzZWQgdG8gZW5jb2RlIHRleHQKKyAgICAgKiB3cml0dGVuIHZpYSB0aGUgc2VydmxldCByZXNwb25zZSdzIHdyaXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGFyc2V0IAlhIFN0cmluZyBzcGVjaWZ5aW5nIG9ubHkgdGhlIGNoYXJhY3RlciBzZXQKKyAgICAgKiAJCQlkZWZpbmVkIGJ5IElBTkEgQ2hhcmFjdGVyIFNldHMKKyAgICAgKgkJCShodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2NoYXJhY3Rlci1zZXRzKQorICAgICAqCisgICAgICogQHNlZQkJI3NldENvbnRlbnRUeXBlCisgICAgICogCQkJI3NldExvY2FsZQorICAgICAqCisgICAgICogQHNpbmNlIDIuNAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgY2hhcnNldCk7CisgICAgCisgICAgCisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxlbmd0aCBvZiB0aGUgY29udGVudCBib2R5IGluIHRoZSByZXNwb25zZQorICAgICAqIEluIEhUVFAgc2VydmxldHMsIHRoaXMgbWV0aG9kIHNldHMgdGhlIEhUVFAgQ29udGVudC1MZW5ndGggaGVhZGVyLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVuIAlhbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIGxlbmd0aCBvZiB0aGUgCisgICAgICogCQkJY29udGVudCBiZWluZyByZXR1cm5lZCB0byB0aGUgY2xpZW50OyBzZXRzCisgICAgICoJCQl0aGUgQ29udGVudC1MZW5ndGggaGVhZGVyCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRMZW5ndGgoaW50IGxlbik7CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHJlc3BvbnNlIGJlaW5nIHNlbnQgdG8KKyAgICAgKiB0aGUgY2xpZW50LCBpZiB0aGUgcmVzcG9uc2UgaGFzIG5vdCBiZWVuIGNvbW1pdHRlZCB5ZXQuCisgICAgICogVGhlIGdpdmVuIGNvbnRlbnQgdHlwZSBtYXkgaW5jbHVkZSBhIGNoYXJhY3RlciBlbmNvZGluZworICAgICAqIHNwZWNpZmljYXRpb24sIGZvciBleGFtcGxlLCA8Y29kZT50ZXh0L2h0bWw7Y2hhcnNldD1VVEYtODwvY29kZT4uCisgICAgICogVGhlIHJlc3BvbnNlJ3MgY2hhcmFjdGVyIGVuY29kaW5nIGlzIG9ubHkgc2V0IGZyb20gdGhlIGdpdmVuCisgICAgICogY29udGVudCB0eXBlIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgPGNvZGU+Z2V0V3JpdGVyPC9jb2RlPgorICAgICAqIGlzIGNhbGxlZC4KKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIHJlcGVhdGVkbHkgdG8gY2hhbmdlIGNvbnRlbnQgdHlwZSBhbmQKKyAgICAgKiBjaGFyYWN0ZXIgZW5jb2RpbmcuCisgICAgICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiBjYWxsZWQgYWZ0ZXIgdGhlIHJlc3BvbnNlCisgICAgICogaGFzIGJlZW4gY29tbWl0dGVkLiBJdCBkb2VzIG5vdCBzZXQgdGhlIHJlc3BvbnNlJ3MgY2hhcmFjdGVyCisgICAgICogZW5jb2RpbmcgaWYgaXQgaXMgY2FsbGVkIGFmdGVyIDxjb2RlPmdldFdyaXRlcjwvY29kZT4KKyAgICAgKiBoYXMgYmVlbiBjYWxsZWQgb3IgYWZ0ZXIgdGhlIHJlc3BvbnNlIGhhcyBiZWVuIGNvbW1pdHRlZC4KKyAgICAgKiA8cD5Db250YWluZXJzIG11c3QgY29tbXVuaWNhdGUgdGhlIGNvbnRlbnQgdHlwZSBhbmQgdGhlIGNoYXJhY3RlcgorICAgICAqIGVuY29kaW5nIHVzZWQgZm9yIHRoZSBzZXJ2bGV0IHJlc3BvbnNlJ3Mgd3JpdGVyIHRvIHRoZSBjbGllbnQgaWYKKyAgICAgKiB0aGUgcHJvdG9jb2wgcHJvdmlkZXMgYSB3YXkgZm9yIGRvaW5nIHNvLiBJbiB0aGUgY2FzZSBvZiBIVFRQLAorICAgICAqIHRoZSA8Y29kZT5Db250ZW50LVR5cGU8L2NvZGU+IGhlYWRlciBpcyB1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBNSU1FIAorICAgICAqCQkJdHlwZSBvZiB0aGUgY29udGVudAorICAgICAqCisgICAgICogQHNlZSAJCSNzZXRMb2NhbGUKKyAgICAgKiBAc2VlIAkJI3NldENoYXJhY3RlckVuY29kaW5nCisgICAgICogQHNlZSAJCSNnZXRPdXRwdXRTdHJlYW0KKyAgICAgKiBAc2VlIAkJI2dldFdyaXRlcgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgdHlwZSk7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwcmVmZXJyZWQgYnVmZmVyIHNpemUgZm9yIHRoZSBib2R5IG9mIHRoZSByZXNwb25zZS4gIAorICAgICAqIFRoZSBzZXJ2bGV0IGNvbnRhaW5lciB3aWxsIHVzZSBhIGJ1ZmZlciBhdCBsZWFzdCBhcyBsYXJnZSBhcyAKKyAgICAgKiB0aGUgc2l6ZSByZXF1ZXN0ZWQuICBUaGUgYWN0dWFsIGJ1ZmZlciBzaXplIHVzZWQgY2FuIGJlIGZvdW5kCisgICAgICogdXNpbmcgPGNvZGU+Z2V0QnVmZmVyU2l6ZTwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD5BIGxhcmdlciBidWZmZXIgYWxsb3dzIG1vcmUgY29udGVudCB0byBiZSB3cml0dGVuIGJlZm9yZSBhbnl0aGluZyBpcworICAgICAqIGFjdHVhbGx5IHNlbnQsIHRodXMgcHJvdmlkaW5nIHRoZSBzZXJ2bGV0IHdpdGggbW9yZSB0aW1lIHRvIHNldAorICAgICAqIGFwcHJvcHJpYXRlIHN0YXR1cyBjb2RlcyBhbmQgaGVhZGVycy4gIEEgc21hbGxlciBidWZmZXIgZGVjcmVhc2VzIAorICAgICAqIHNlcnZlciBtZW1vcnkgbG9hZCBhbmQgYWxsb3dzIHRoZSBjbGllbnQgdG8gc3RhcnQgcmVjZWl2aW5nIGRhdGEgbW9yZQorICAgICAqIHF1aWNrbHkuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IHJlc3BvbnNlIGJvZHkgY29udGVudCBpcworICAgICAqIHdyaXR0ZW47IGlmIGNvbnRlbnQgaGFzIGJlZW4gd3JpdHRlbiBvciB0aGUgcmVzcG9uc2Ugb2JqZWN0IGhhcworICAgICAqIGJlZW4gY29tbWl0dGVkLCB0aGlzIG1ldGhvZCB0aHJvd3MgYW4gCisgICAgICogPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaXplIAl0aGUgcHJlZmVycmVkIGJ1ZmZlciBzaXplCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gIAlpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIKKyAgICAgKgkJCQkJCWNvbnRlbnQgaGFzIGJlZW4gd3JpdHRlbgorICAgICAqCisgICAgICogQHNlZSAJCSNnZXRCdWZmZXJTaXplCisgICAgICogQHNlZSAJCSNmbHVzaEJ1ZmZlcgorICAgICAqIEBzZWUgCQkjaXNDb21taXR0ZWQKKyAgICAgKiBAc2VlIAkJI3Jlc2V0CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldEJ1ZmZlclNpemUoaW50IHNpemUpOworICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplIHVzZWQgZm9yIHRoZSByZXNwb25zZS4gIElmIG5vIGJ1ZmZlcmluZworICAgICAqIGlzIHVzZWQsIHRoaXMgbWV0aG9kIHJldHVybnMgMC4KKyAgICAgKgorICAgICAqIEByZXR1cm4JIAl0aGUgYWN0dWFsIGJ1ZmZlciBzaXplIHVzZWQKKyAgICAgKgorICAgICAqIEBzZWUgCQkjc2V0QnVmZmVyU2l6ZQorICAgICAqIEBzZWUgCQkjZmx1c2hCdWZmZXIKKyAgICAgKiBAc2VlIAkJI2lzQ29tbWl0dGVkCisgICAgICogQHNlZSAJCSNyZXNldAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgaW50IGdldEJ1ZmZlclNpemUoKTsKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIEZvcmNlcyBhbnkgY29udGVudCBpbiB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGNsaWVudC4gIEEgY2FsbAorICAgICAqIHRvIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkgY29tbWl0cyB0aGUgcmVzcG9uc2UsIG1lYW5pbmcgdGhlIHN0YXR1cyAKKyAgICAgKiBjb2RlIGFuZCBoZWFkZXJzIHdpbGwgYmUgd3JpdHRlbi4KKyAgICAgKgorICAgICAqIEBzZWUgCQkjc2V0QnVmZmVyU2l6ZQorICAgICAqIEBzZWUgCQkjZ2V0QnVmZmVyU2l6ZQorICAgICAqIEBzZWUgCQkjaXNDb21taXR0ZWQKKyAgICAgKiBAc2VlIAkJI3Jlc2V0CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGZsdXNoQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIAorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgY29udGVudCBvZiB0aGUgdW5kZXJseWluZyBidWZmZXIgaW4gdGhlIHJlc3BvbnNlIHdpdGhvdXQKKyAgICAgKiBjbGVhcmluZyBoZWFkZXJzIG9yIHN0YXR1cyBjb2RlLiBJZiB0aGUgCisgICAgICogcmVzcG9uc2UgaGFzIGJlZW4gY29tbWl0dGVkLCB0aGlzIG1ldGhvZCB0aHJvd3MgYW4gCisgICAgICogPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBzZWUgCQkjc2V0QnVmZmVyU2l6ZQorICAgICAqIEBzZWUgCQkjZ2V0QnVmZmVyU2l6ZQorICAgICAqIEBzZWUgCQkjaXNDb21taXR0ZWQKKyAgICAgKiBAc2VlIAkJI3Jlc2V0CisgICAgICoKKyAgICAgKiBAc2luY2UgMi4zCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCByZXNldEJ1ZmZlcigpOworICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgcmVzcG9uc2UgaGFzIGJlZW4KKyAgICAgKiBjb21taXR0ZWQuICBBIGNvbW1pdHRlZCByZXNwb25zZSBoYXMgYWxyZWFkeSBoYWQgaXRzIHN0YXR1cyAKKyAgICAgKiBjb2RlIGFuZCBoZWFkZXJzIHdyaXR0ZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgcmVzcG9uc2UgaGFzIGJlZW4KKyAgICAgKiAgCQljb21taXR0ZWQKKyAgICAgKgorICAgICAqIEBzZWUgCQkjc2V0QnVmZmVyU2l6ZQorICAgICAqIEBzZWUgCQkjZ2V0QnVmZmVyU2l6ZQorICAgICAqIEBzZWUgCQkjZmx1c2hCdWZmZXIKKyAgICAgKiBAc2VlIAkJI3Jlc2V0CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWl0dGVkKCk7CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgYW55IGRhdGEgdGhhdCBleGlzdHMgaW4gdGhlIGJ1ZmZlciBhcyB3ZWxsIGFzIHRoZSBzdGF0dXMgY29kZSBhbmQKKyAgICAgKiBoZWFkZXJzLiAgSWYgdGhlIHJlc3BvbnNlIGhhcyBiZWVuIGNvbW1pdHRlZCwgdGhpcyBtZXRob2QgdGhyb3dzIGFuIAorICAgICAqIDxjb2RlPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAgaWYgdGhlIHJlc3BvbnNlIGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0dGVkCisgICAgICoKKyAgICAgKiBAc2VlIAkJI3NldEJ1ZmZlclNpemUKKyAgICAgKiBAc2VlIAkJI2dldEJ1ZmZlclNpemUKKyAgICAgKiBAc2VlIAkJI2ZsdXNoQnVmZmVyCisgICAgICogQHNlZSAJCSNpc0NvbW1pdHRlZAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpOworICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbG9jYWxlIG9mIHRoZSByZXNwb25zZSwgaWYgdGhlIHJlc3BvbnNlIGhhcyBub3QgYmVlbgorICAgICAqIGNvbW1pdHRlZCB5ZXQuIEl0IGFsc28gc2V0cyB0aGUgcmVzcG9uc2UncyBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAgICAgKiBhcHByb3ByaWF0ZWx5IGZvciB0aGUgbG9jYWxlLCBpZiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGhhcyBub3QKKyAgICAgKiBiZWVuIGV4cGxpY2l0bHkgc2V0IHVzaW5nIHtAbGluayAjc2V0Q29udGVudFR5cGV9IG9yCisgICAgICoge0BsaW5rICNzZXRDaGFyYWN0ZXJFbmNvZGluZ30sIDxjb2RlPmdldFdyaXRlcjwvY29kZT4gaGFzbid0CisgICAgICogYmVlbiBjYWxsZWQgeWV0LCBhbmQgdGhlIHJlc3BvbnNlIGhhc24ndCBiZWVuIGNvbW1pdHRlZCB5ZXQuCisgICAgICogSWYgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBjb250YWlucyBhIAorICAgICAqIDxjb2RlPmxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3Q8L2NvZGU+IGVsZW1lbnQsIGFuZCB0aGF0CisgICAgICogZWxlbWVudCBwcm92aWRlcyBhIG1hcHBpbmcgZm9yIHRoZSBnaXZlbiBsb2NhbGUsIHRoYXQgbWFwcGluZworICAgICAqIGlzIHVzZWQuIE90aGVyd2lzZSwgdGhlIG1hcHBpbmcgZnJvbSBsb2NhbGUgdG8gY2hhcmFjdGVyCisgICAgICogZW5jb2RpbmcgaXMgY29udGFpbmVyIGRlcGVuZGVudC4KKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIHJlcGVhdGVkbHkgdG8gY2hhbmdlIGxvY2FsZSBhbmQKKyAgICAgKiBjaGFyYWN0ZXIgZW5jb2RpbmcuIFRoZSBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiBjYWxsZWQgYWZ0ZXIgdGhlCisgICAgICogcmVzcG9uc2UgaGFzIGJlZW4gY29tbWl0dGVkLiBJdCBkb2VzIG5vdCBzZXQgdGhlIHJlc3BvbnNlJ3MKKyAgICAgKiBjaGFyYWN0ZXIgZW5jb2RpbmcgaWYgaXQgaXMgY2FsbGVkIGFmdGVyIHtAbGluayAjc2V0Q29udGVudFR5cGV9CisgICAgICogaGFzIGJlZW4gY2FsbGVkIHdpdGggYSBjaGFyc2V0IHNwZWNpZmljYXRpb24sIGFmdGVyCisgICAgICoge0BsaW5rICNzZXRDaGFyYWN0ZXJFbmNvZGluZ30gaGFzIGJlZW4gY2FsbGVkLCBhZnRlcgorICAgICAqIDxjb2RlPmdldFdyaXRlcjwvY29kZT4gaGFzIGJlZW4gY2FsbGVkLCBvciBhZnRlciB0aGUgcmVzcG9uc2UKKyAgICAgKiBoYXMgYmVlbiBjb21taXR0ZWQuCisgICAgICogPHA+Q29udGFpbmVycyBtdXN0IGNvbW11bmljYXRlIHRoZSBsb2NhbGUgYW5kIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAgICAgKiB1c2VkIGZvciB0aGUgc2VydmxldCByZXNwb25zZSdzIHdyaXRlciB0byB0aGUgY2xpZW50IGlmIHRoZSBwcm90b2NvbAorICAgICAqIHByb3ZpZGVzIGEgd2F5IGZvciBkb2luZyBzby4gSW4gdGhlIGNhc2Ugb2YgSFRUUCwgdGhlIGxvY2FsZSBpcworICAgICAqIGNvbW11bmljYXRlZCB2aWEgdGhlIDxjb2RlPkNvbnRlbnQtTGFuZ3VhZ2U8L2NvZGU+IGhlYWRlciwKKyAgICAgKiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGFzIHBhcnQgb2YgdGhlIDxjb2RlPkNvbnRlbnQtVHlwZTwvY29kZT4KKyAgICAgKiBoZWFkZXIgZm9yIHRleHQgbWVkaWEgdHlwZXMuIE5vdGUgdGhhdCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nCisgICAgICogY2Fubm90IGJlIGNvbW11bmljYXRlZCB2aWEgSFRUUCBoZWFkZXJzIGlmIHRoZSBzZXJ2bGV0IGRvZXMgbm90CisgICAgICogc3BlY2lmeSBhIGNvbnRlbnQgdHlwZTsgaG93ZXZlciwgaXQgaXMgc3RpbGwgdXNlZCB0byBlbmNvZGUgdGV4dAorICAgICAqIHdyaXR0ZW4gdmlhIHRoZSBzZXJ2bGV0IHJlc3BvbnNlJ3Mgd3JpdGVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBsb2MgIHRoZSBsb2NhbGUgb2YgdGhlIHJlc3BvbnNlCisgICAgICoKKyAgICAgKiBAc2VlIAkJI2dldExvY2FsZQorICAgICAqIEBzZWUgCQkjc2V0Q29udGVudFR5cGUKKyAgICAgKiBAc2VlIAkJI3NldENoYXJhY3RlckVuY29kaW5nCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jKTsKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxvY2FsZSBzcGVjaWZpZWQgZm9yIHRoaXMgcmVzcG9uc2UKKyAgICAgKiB1c2luZyB0aGUge0BsaW5rICNzZXRMb2NhbGV9IG1ldGhvZC4gQ2FsbHMgbWFkZSB0bworICAgICAqIDxjb2RlPnNldExvY2FsZTwvY29kZT4gYWZ0ZXIgdGhlIHJlc3BvbnNlIGlzIGNvbW1pdHRlZAorICAgICAqIGhhdmUgbm8gZWZmZWN0LiBJZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLAorICAgICAqIHRoZSBjb250YWluZXIncyBkZWZhdWx0IGxvY2FsZSBpcyByZXR1cm5lZC4KKyAgICAgKiAKKyAgICAgKiBAc2VlIAkJI3NldExvY2FsZQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpOworCisKKworfQorCisKKworCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzU4Y2E3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldFJlc3BvbnNlV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCisvKioKKyAqIAorICogUHJvdmlkZXMgYSBjb252ZW5pZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBTZXJ2bGV0UmVzcG9uc2UgaW50ZXJmYWNlIHRoYXQKKyAqIGNhbiBiZSBzdWJjbGFzc2VkIGJ5IGRldmVsb3BlcnMgd2lzaGluZyB0byBhZGFwdCB0aGUgcmVzcG9uc2UgZnJvbSBhIFNlcnZsZXQuCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFdyYXBwZXIgb3IgRGVjb3JhdG9yIHBhdHRlcm4uIE1ldGhvZHMgZGVmYXVsdCB0bworICogY2FsbGluZyB0aHJvdWdoIHRvIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAqIAorICogQGF1dGhvciAJVmFyaW91cworICogQHZlcnNpb24gCSRWZXJzaW9uJAorICogQHNpbmNlCXYgMi4zCisgKgorICogQHNlZSAJamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2UKKyAqCisgKi8KKworIAorcHVibGljIGNsYXNzIFNlcnZsZXRSZXNwb25zZVdyYXBwZXIgaW1wbGVtZW50cyBTZXJ2bGV0UmVzcG9uc2UgeworCXByaXZhdGUgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOworCS8qKgorCSogQ3JlYXRlcyBhIFNlcnZsZXRSZXNwb25zZSBhZGFwdG9yIHdyYXBwaW5nIHRoZSBnaXZlbiByZXNwb25zZSBvYmplY3QuCisJKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHJlc3BvbnNlIGlzIG51bGwuCisJKi8KKworCisJcHVibGljIFNlcnZsZXRSZXNwb25zZVdyYXBwZXIoU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisJICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlc3BvbnNlIGNhbm5vdCBiZSBudWxsIik7CisJICAgIH0KKwkgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworCX0KKworCS8qKgorCSogUmV0dXJuIHRoZSB3cmFwcGVkIFNlcnZsZXRSZXNwb25zZSBvYmplY3QuCisJKi8KKworCXB1YmxpYyBTZXJ2bGV0UmVzcG9uc2UgZ2V0UmVzcG9uc2UoKSB7CisJCXJldHVybiB0aGlzLnJlc3BvbnNlOworCX0JCisJCisJCisJLyoqCisJKiBTZXRzIHRoZSByZXNwb25zZSBiZWluZyB3cmFwcGVkLiAKKwkqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcmVzcG9uc2UgaXMgbnVsbC4KKwkqLworCQorCXB1YmxpYyB2b2lkIHNldFJlc3BvbnNlKFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworCSAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZXNwb25zZSBjYW5ub3QgYmUgbnVsbCIpOworCSAgICB9CisJICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKwl9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIHNldENoYXJhY3RlckVuY29kaW5nKFN0cmluZyBjaGFyc2V0KQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjQKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlckVuY29kaW5nKFN0cmluZyBjaGFyc2V0KSB7CisJdGhpcy5yZXNwb25zZS5zZXRDaGFyYWN0ZXJFbmNvZGluZyhjaGFyc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSB7CisJcmV0dXJuIHRoaXMucmVzcG9uc2UuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTsKKwl9CisgICAgCisgICAgCisJICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0T3V0cHV0U3RyZWFtKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgU2VydmxldE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXJldHVybiB0aGlzLnJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOworICAgIH0gIAorICAgICAgCisgICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRXcml0ZXIoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKworCisgICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcmV0dXJuIHRoaXMucmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisJfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgc2V0Q29udGVudExlbmd0aChpbnQgbGVuKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRMZW5ndGgoaW50IGxlbikgeworCXRoaXMucmVzcG9uc2Uuc2V0Q29udGVudExlbmd0aChsZW4pOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIHNldENvbnRlbnRUeXBlKFN0cmluZyB0eXBlKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyB0eXBlKSB7CisJdGhpcy5yZXNwb25zZS5zZXRDb250ZW50VHlwZSh0eXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0Q29udGVudFR5cGUoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjQKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisJcmV0dXJuIHRoaXMucmVzcG9uc2UuZ2V0Q29udGVudFR5cGUoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gY2FsbCBzZXRCdWZmZXJTaXplKGludCBzaXplKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCdWZmZXJTaXplKGludCBzaXplKSB7CisJdGhpcy5yZXNwb25zZS5zZXRCdWZmZXJTaXplKHNpemUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0QnVmZmVyU2l6ZSgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QnVmZmVyU2l6ZSgpIHsKKwlyZXR1cm4gdGhpcy5yZXNwb25zZS5nZXRCdWZmZXJTaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gY2FsbCBmbHVzaEJ1ZmZlcigpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgZmx1c2hCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXRoaXMucmVzcG9uc2UuZmx1c2hCdWZmZXIoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGlzQ29tbWl0dGVkKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb21taXR0ZWQoKSB7CisJcmV0dXJuIHRoaXMucmVzcG9uc2UuaXNDb21taXR0ZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIHJlc2V0KCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKwl0aGlzLnJlc3BvbnNlLnJlc2V0KCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgcmVzZXRCdWZmZXIoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKyAgICAgCisgICAgcHVibGljIHZvaWQgcmVzZXRCdWZmZXIoKSB7CisJdGhpcy5yZXNwb25zZS5yZXNldEJ1ZmZlcigpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIHNldExvY2FsZShMb2NhbGUgbG9jKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jKSB7CisJdGhpcy5yZXNwb25zZS5zZXRMb2NhbGUobG9jKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldExvY2FsZSgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgeworCXJldHVybiB0aGlzLnJlc3BvbnNlLmdldExvY2FsZSgpOworICAgIH0KKworCit9CisKKworCisKKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2luZ2xlVGhyZWFkTW9kZWwuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NpbmdsZVRocmVhZE1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyZTkyYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NpbmdsZVRocmVhZE1vZGVsLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKKy8qKgorICogRW5zdXJlcyB0aGF0IHNlcnZsZXRzIGhhbmRsZQorICogb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUuIFRoaXMgaW50ZXJmYWNlIGhhcyBubyBtZXRob2RzLgorICoKKyAqIDxwPklmIGEgc2VydmxldCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLCB5b3UgYXJlIDxpPmd1YXJhbnRlZWQ8L2k+CisgKiB0aGF0IG5vIHR3byB0aHJlYWRzIHdpbGwgZXhlY3V0ZSBjb25jdXJyZW50bHkgaW4gdGhlCisgKiBzZXJ2bGV0J3MgPGNvZGU+c2VydmljZTwvY29kZT4gbWV0aG9kLiBUaGUgc2VydmxldCBjb250YWluZXIKKyAqIGNhbiBtYWtlIHRoaXMgZ3VhcmFudGVlIGJ5IHN5bmNocm9uaXppbmcgYWNjZXNzIHRvIGEgc2luZ2xlCisgKiBpbnN0YW5jZSBvZiB0aGUgc2VydmxldCwgb3IgYnkgbWFpbnRhaW5pbmcgYSBwb29sIG9mIHNlcnZsZXQKKyAqIGluc3RhbmNlcyBhbmQgZGlzcGF0Y2hpbmcgZWFjaCBuZXcgcmVxdWVzdCB0byBhIGZyZWUgc2VydmxldC4KKyAqCisgKiA8cD5Ob3RlIHRoYXQgU2luZ2xlVGhyZWFkTW9kZWwgZG9lcyBub3Qgc29sdmUgYWxsIHRocmVhZCBzYWZldHkKKyAqIGlzc3Vlcy4gIEZvciBleGFtcGxlLCBzZXNzaW9uIGF0dHJpYnV0ZXMgYW5kIHN0YXRpYyB2YXJpYWJsZXMgY2FuCisgKiBzdGlsbCBiZSBhY2Nlc3NlZCBieSBtdWx0aXBsZSByZXF1ZXN0cyBvbiBtdWx0aXBsZSB0aHJlYWRzCisgKiBhdCB0aGUgc2FtZSB0aW1lLCBldmVuIHdoZW4gU2luZ2xlVGhyZWFkTW9kZWwgc2VydmxldHMgYXJlIHVzZWQuCisgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGEgZGV2ZWxvcGVyIHRha2Ugb3RoZXIgbWVhbnMgdG8gcmVzb2x2ZQorICogdGhvc2UgaXNzdWVzIGluc3RlYWQgb2YgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlLCBzdWNoIGFzCisgKiBhdm9pZGluZyB0aGUgdXNhZ2Ugb2YgYW4gaW5zdGFuY2UgdmFyaWFibGUgb3Igc3luY2hyb25pemluZworICogdGhlIGJsb2NrIG9mIHRoZSBjb2RlIGFjY2Vzc2luZyB0aG9zZSByZXNvdXJjZXMuCisgKiBUaGlzIGludGVyZmFjZSBpcyBkZXByZWNhdGVkIGluIFNlcnZsZXQgQVBJIHZlcnNpb24gMi40LgorICoKKyAqCisgKiBAYXV0aG9yCVZhcmlvdXMKKyAqIEB2ZXJzaW9uCSRWZXJzaW9uJAorICoKKyAqIEBkZXByZWNhdGVkCUFzIG9mIEphdmEgU2VydmxldCBBUEkgMi40LCB3aXRoIG5vIGRpcmVjdAorICoJcmVwbGFjZW1lbnQuCisgKi8KKworcHVibGljIGludGVyZmFjZSBTaW5nbGVUaHJlYWRNb2RlbCB7Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9VbmF2YWlsYWJsZUV4Y2VwdGlvbi5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvVW5hdmFpbGFibGVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGUyZGVhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvVW5hdmFpbGFibGVFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworCisvKioKKyAqIERlZmluZXMgYW4gZXhjZXB0aW9uIHRoYXQgYSBzZXJ2bGV0IG9yIGZpbHRlciB0aHJvd3MgdG8gaW5kaWNhdGUKKyAqIHRoYXQgaXQgaXMgcGVybWFuZW50bHkgb3IgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUuIAorICoKKyAqIDxwPldoZW4gYSBzZXJ2bGV0IG9yIGZpbHRlciBpcyBwZXJtYW5lbnRseSB1bmF2YWlsYWJsZSwgc29tZXRoaW5nIGlzIHdyb25nCisgKiB3aXRoIGl0LCBhbmQgaXQgY2Fubm90IGhhbmRsZQorICogcmVxdWVzdHMgdW50aWwgc29tZSBhY3Rpb24gaXMgdGFrZW4uIEZvciBleGFtcGxlLCBhIHNlcnZsZXQKKyAqIG1pZ2h0IGJlIGNvbmZpZ3VyZWQgaW5jb3JyZWN0bHksIG9yIGEgZmlsdGVyJ3Mgc3RhdGUgbWF5IGJlIGNvcnJ1cHRlZC4KKyAqIFRoZSBjb21wb25lbnQgc2hvdWxkIGxvZyBib3RoIHRoZSBlcnJvciBhbmQgdGhlIGNvcnJlY3RpdmUgYWN0aW9uCisgKiB0aGF0IGlzIG5lZWRlZC4KKyAqCisgKiA8cD5BIHNlcnZsZXQgb3IgZmlsdGVyIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlIGlmIGl0IGNhbm5vdCBoYW5kbGUKKyAqIHJlcXVlc3RzIG1vbWVudGFyaWx5IGR1ZSB0byBzb21lIHN5c3RlbS13aWRlIHByb2JsZW0uIEZvciBleGFtcGxlLAorICogYSB0aGlyZC10aWVyIHNlcnZlciBtaWdodCBub3QgYmUgYWNjZXNzaWJsZSwgb3IgdGhlcmUgbWF5IGJlIAorICogaW5zdWZmaWNpZW50IG1lbW9yeSBvciBkaXNrIHN0b3JhZ2UgdG8gaGFuZGxlIHJlcXVlc3RzLiBBIHN5c3RlbQorICogYWRtaW5pc3RyYXRvciBtYXkgbmVlZCB0byB0YWtlIGNvcnJlY3RpdmUgYWN0aW9uLgorICoKKyAqIDxwPlNlcnZsZXQgY29udGFpbmVycyBjYW4gc2FmZWx5IHRyZWF0IGJvdGggdHlwZXMgb2YgdW5hdmFpbGFibGUKKyAqIGV4Y2VwdGlvbnMgaW4gdGhlIHNhbWUgd2F5LiBIb3dldmVyLCB0cmVhdGluZyB0ZW1wb3JhcnkgdW5hdmFpbGFiaWxpdHkKKyAqIGVmZmVjdGl2ZWx5IG1ha2VzIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBtb3JlIHJvYnVzdC4gU3BlY2lmaWNhbGx5LAorICogdGhlIHNlcnZsZXQgY29udGFpbmVyIG1pZ2h0IGJsb2NrIHJlcXVlc3RzIHRvIHRoZSBzZXJ2bGV0IG9yIGZpbHRlciBmb3IgYSBwZXJpb2QKKyAqIG9mIHRpbWUgc3VnZ2VzdGVkIGJ5IHRoZSBleGNlcHRpb24sIHJhdGhlciB0aGFuIHJlamVjdGluZyB0aGVtIHVudGlsCisgKiB0aGUgc2VydmxldCBjb250YWluZXIgcmVzdGFydHMuCisgKgorICoKKyAqIEBhdXRob3IgCVZhcmlvdXMKKyAqIEB2ZXJzaW9uIAkkVmVyc2lvbiQKKyAqCisgKi8KKworcHVibGljIGNsYXNzIFVuYXZhaWxhYmxlRXhjZXB0aW9uCitleHRlbmRzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBTZXJ2bGV0ICAgICBzZXJ2bGV0OyAgICAgICAgICAgLy8gd2hhdCdzIHVuYXZhaWxhYmxlCisgICAgcHJpdmF0ZSBib29sZWFuICAgICBwZXJtYW5lbnQ7ICAgICAgICAgLy8gbmVlZHMgYWRtaW4gYWN0aW9uPworICAgIHByaXZhdGUgaW50ICAgICAgICAgc2Vjb25kczsgICAgICAgICAgIC8vIHVuYXZhaWxhYmlsaXR5IGVzdGltYXRlCisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAZGVwcmVjYXRlZAlBcyBvZiBKYXZhIFNlcnZsZXQgQVBJIDIuMiwgdXNlIHtAbGluaworICAgICAqIAkJCSNVbmF2YWlsYWJsZUV4Y2VwdGlvbihTdHJpbmcpfSBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZsZXQgCXRoZSA8Y29kZT5TZXJ2bGV0PC9jb2RlPiBpbnN0YW5jZSB0aGF0IGlzCisgICAgICogICAgICAgICAgICAgICAgICB1bmF2YWlsYWJsZQorICAgICAqCisgICAgICogQHBhcmFtIG1zZyAJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlCisgICAgICogICAgICAgICAgICAgICAgICBkZXNjcmlwdGl2ZSBtZXNzYWdlCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBVbmF2YWlsYWJsZUV4Y2VwdGlvbihTZXJ2bGV0IHNlcnZsZXQsIFN0cmluZyBtc2cpIHsKKwlzdXBlcihtc2cpOworCXRoaXMuc2VydmxldCA9IHNlcnZsZXQ7CisJcGVybWFuZW50ID0gdHJ1ZTsKKyAgICB9CisgCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQJQXMgb2YgSmF2YSBTZXJ2bGV0IEFQSSAyLjIsIHVzZSB7QGxpbmsKKyAgICAgKgkJCSNVbmF2YWlsYWJsZUV4Y2VwdGlvbihTdHJpbmcsIGludCl9IGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vjb25kcwlhbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBzZWNvbmRzCisgICAgICogCQkJdGhlIHNlcnZsZXQgZXhwZWN0cyB0byBiZSB1bmF2YWlsYWJsZTsgaWYKKyAgICAgKgkJCXplcm8gb3IgbmVnYXRpdmUsIGluZGljYXRlcyB0aGF0IHRoZSBzZXJ2bGV0CisgICAgICoJCQljYW4ndCBtYWtlIGFuIGVzdGltYXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmxldAl0aGUgPGNvZGU+U2VydmxldDwvY29kZT4gdGhhdCBpcyB1bmF2YWlsYWJsZQorICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIGRlc2NyaXB0aXZlIAorICAgICAqCQkJbWVzc2FnZSwgd2hpY2ggY2FuIGJlIHdyaXR0ZW4gdG8gYSBsb2cgZmlsZSBvciAKKyAgICAgKgkJCWRpc3BsYXllZCBmb3IgdGhlIHVzZXIuCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgVW5hdmFpbGFibGVFeGNlcHRpb24oaW50IHNlY29uZHMsIFNlcnZsZXQgc2VydmxldCwgU3RyaW5nIG1zZykgeworCXN1cGVyKG1zZyk7CisJdGhpcy5zZXJ2bGV0ID0gc2VydmxldDsKKwlpZiAoc2Vjb25kcyA8PSAwKQorCSAgICB0aGlzLnNlY29uZHMgPSAtMTsKKwllbHNlCisJICAgIHRoaXMuc2Vjb25kcyA9IHNlY29uZHM7CisJcGVybWFuZW50ID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCBhIGRlc2NyaXB0aXZlCisgICAgICogbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHNlcnZsZXQgaXMgcGVybWFuZW50bHkKKyAgICAgKiB1bmF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cgCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpdmUgbWVzc2FnZQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgVW5hdmFpbGFibGVFeGNlcHRpb24oU3RyaW5nIG1zZykgeworCXN1cGVyKG1zZyk7CisKKwlwZXJtYW5lbnQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggYSBkZXNjcmlwdGl2ZSBtZXNzYWdlCisgICAgICogaW5kaWNhdGluZyB0aGF0IHRoZSBzZXJ2bGV0IGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlCisgICAgICogYW5kIGdpdmluZyBhbiBlc3RpbWF0ZSBvZiBob3cgbG9uZyBpdCB3aWxsIGJlIHVuYXZhaWxhYmxlLgorICAgICAqIAorICAgICAqIDxwPkluIHNvbWUgY2FzZXMsIHRoZSBzZXJ2bGV0IGNhbm5vdCBtYWtlIGFuIGVzdGltYXRlLiBGb3IKKyAgICAgKiBleGFtcGxlLCB0aGUgc2VydmxldCBtaWdodCBrbm93IHRoYXQgYSBzZXJ2ZXIgaXQgbmVlZHMgaXMKKyAgICAgKiBub3QgcnVubmluZywgYnV0IG5vdCBiZSBhYmxlIHRvIHJlcG9ydCBob3cgbG9uZyBpdCB3aWxsIHRha2UKKyAgICAgKiB0byBiZSByZXN0b3JlZCB0byBmdW5jdGlvbmFsaXR5LiBUaGlzIGNhbiBiZSBpbmRpY2F0ZWQgd2l0aAorICAgICAqIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSBmb3IgdGhlIDxjb2RlPnNlY29uZHM8L2NvZGU+IGFyZ3VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIG1zZwlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aXZlIG1lc3NhZ2UsIHdoaWNoIGNhbiBiZSB3cml0dGVuCisgICAgICogICAgICAgICAgICAgICAgICB0byBhIGxvZyBmaWxlIG9yIGRpc3BsYXllZCBmb3IgdGhlIHVzZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vjb25kcwlhbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBzZWNvbmRzCisgICAgICogCQkJdGhlIHNlcnZsZXQgZXhwZWN0cyB0byBiZSB1bmF2YWlsYWJsZTsgaWYKKyAgICAgKgkJCXplcm8gb3IgbmVnYXRpdmUsIGluZGljYXRlcyB0aGF0IHRoZSBzZXJ2bGV0CisgICAgICoJCQljYW4ndCBtYWtlIGFuIGVzdGltYXRlCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgVW5hdmFpbGFibGVFeGNlcHRpb24oU3RyaW5nIG1zZywgaW50IHNlY29uZHMpIHsKKwlzdXBlcihtc2cpOworCisJaWYgKHNlY29uZHMgPD0gMCkKKwkgICAgdGhpcy5zZWNvbmRzID0gLTE7CisJZWxzZQorCSAgICB0aGlzLnNlY29uZHMgPSBzZWNvbmRzOworCisJcGVybWFuZW50ID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZworICAgICAqIHdoZXRoZXIgdGhlIHNlcnZsZXQgaXMgcGVybWFuZW50bHkgdW5hdmFpbGFibGUuCisgICAgICogSWYgc28sIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBzZXJ2bGV0LCBhbmQgdGhlCisgICAgICogc3lzdGVtIGFkbWluaXN0cmF0b3IgbXVzdCB0YWtlIHNvbWUgY29ycmVjdGl2ZSBhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQk8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmxldCBpcworICAgICAqCQkJcGVybWFuZW50bHkgdW5hdmFpbGFibGU7IDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqCQkJaWYgdGhlIHNlcnZsZXQgaXMgYXZhaWxhYmxlIG9yIHRlbXBvcmFyaWx5CisgICAgICoJCQl1bmF2YWlsYWJsZQorICAgICAqCisgICAgICovCisgICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzUGVybWFuZW50KCkgeworCXJldHVybiBwZXJtYW5lbnQ7CisgICAgfQorICAKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZAlBcyBvZiBKYXZhIFNlcnZsZXQgQVBJIDIuMiwgd2l0aCBubyByZXBsYWNlbWVudC4KKyAgICAgKgorICAgICAqIFJldHVybnMgdGhlIHNlcnZsZXQgdGhhdCBpcyByZXBvcnRpbmcgaXRzIHVuYXZhaWxhYmlsaXR5LgorICAgICAqIAorICAgICAqIEByZXR1cm4JCXRoZSA8Y29kZT5TZXJ2bGV0PC9jb2RlPiBvYmplY3QgdGhhdCBpcyAKKyAgICAgKgkJCXRocm93aW5nIHRoZSA8Y29kZT5VbmF2YWlsYWJsZUV4Y2VwdGlvbjwvY29kZT4KKyAgICAgKgorICAgICAqLworICAgICAKKyAgICBwdWJsaWMgU2VydmxldCBnZXRTZXJ2bGV0KCkgeworCXJldHVybiBzZXJ2bGV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRoZSBzZXJ2bGV0IGV4cGVjdHMgdG8gCisgICAgICogYmUgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUuICAKKyAgICAgKgorICAgICAqIDxwPklmIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZWdhdGl2ZSBudW1iZXIsIHRoZSBzZXJ2bGV0CisgICAgICogaXMgcGVybWFuZW50bHkgdW5hdmFpbGFibGUgb3IgY2Fubm90IHByb3ZpZGUgYW4gZXN0aW1hdGUgb2YKKyAgICAgKiBob3cgbG9uZyBpdCB3aWxsIGJlIHVuYXZhaWxhYmxlLiBObyBlZmZvcnQgaXMKKyAgICAgKiBtYWRlIHRvIGNvcnJlY3QgZm9yIHRoZSB0aW1lIGVsYXBzZWQgc2luY2UgdGhlIGV4Y2VwdGlvbiB3YXMKKyAgICAgKiBmaXJzdCByZXBvcnRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCWFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIHNlY29uZHMKKyAgICAgKgkJCXRoZSBzZXJ2bGV0IHdpbGwgYmUgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUsCisgICAgICoJCQlvciBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGUgc2VydmxldCBpcyBwZXJtYW5lbnRseQorICAgICAqCQkJdW5hdmFpbGFibGUgb3IgY2Fubm90IG1ha2UgYW4gZXN0aW1hdGUKKyAgICAgKgorICAgICAqLworICAgICAKKyAgICBwdWJsaWMgaW50IGdldFVuYXZhaWxhYmxlU2Vjb25kcygpIHsKKwlyZXR1cm4gcGVybWFuZW50ID8gLTEgOiBzZWNvbmRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvQ29va2llLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0Nvb2tpZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNjJmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0Nvb2tpZS5qYXZhCkBAIC0wLDAgKzEsNTM3IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldC5odHRwOworCitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCisvKioKKyAqCisgKiBDcmVhdGVzIGEgY29va2llLCBhIHNtYWxsIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBzZW50IGJ5IGEgc2VydmxldCB0byAKKyAqIGEgV2ViIGJyb3dzZXIsIHNhdmVkIGJ5IHRoZSBicm93c2VyLCBhbmQgbGF0ZXIgc2VudCBiYWNrIHRvIHRoZSBzZXJ2ZXIuCisgKiBBIGNvb2tpZSdzIHZhbHVlIGNhbiB1bmlxdWVseSAKKyAqIGlkZW50aWZ5IGEgY2xpZW50LCBzbyBjb29raWVzIGFyZSBjb21tb25seSB1c2VkIGZvciBzZXNzaW9uIG1hbmFnZW1lbnQuCisgKiAKKyAqIDxwPkEgY29va2llIGhhcyBhIG5hbWUsIGEgc2luZ2xlIHZhbHVlLCBhbmQgb3B0aW9uYWwgYXR0cmlidXRlcworICogc3VjaCBhcyBhIGNvbW1lbnQsIHBhdGggYW5kIGRvbWFpbiBxdWFsaWZpZXJzLCBhIG1heGltdW0gYWdlLCBhbmQgYQorICogdmVyc2lvbiBudW1iZXIuIFNvbWUgV2ViIGJyb3dzZXJzIGhhdmUgYnVncyBpbiBob3cgdGhleSBoYW5kbGUgdGhlIAorICogb3B0aW9uYWwgYXR0cmlidXRlcywgc28gdXNlIHRoZW0gc3BhcmluZ2x5IHRvIGltcHJvdmUgdGhlIGludGVyb3BlcmFiaWxpdHkgCisgKiBvZiB5b3VyIHNlcnZsZXRzLgorICoKKyAqIDxwPlRoZSBzZXJ2bGV0IHNlbmRzIGNvb2tpZXMgdG8gdGhlIGJyb3dzZXIgYnkgdXNpbmcgdGhlCisgKiB7QGxpbmsgSHR0cFNlcnZsZXRSZXNwb25zZSNhZGRDb29raWV9IG1ldGhvZCwgd2hpY2ggYWRkcworICogZmllbGRzIHRvIEhUVFAgcmVzcG9uc2UgaGVhZGVycyB0byBzZW5kIGNvb2tpZXMgdG8gdGhlIAorICogYnJvd3Nlciwgb25lIGF0IGEgdGltZS4gVGhlIGJyb3dzZXIgaXMgZXhwZWN0ZWQgdG8gCisgKiBzdXBwb3J0IDIwIGNvb2tpZXMgZm9yIGVhY2ggV2ViIHNlcnZlciwgMzAwIGNvb2tpZXMgdG90YWwsIGFuZAorICogbWF5IGxpbWl0IGNvb2tpZSBzaXplIHRvIDQgS0IgZWFjaC4KKyAqIAorICogPHA+VGhlIGJyb3dzZXIgcmV0dXJucyBjb29raWVzIHRvIHRoZSBzZXJ2bGV0IGJ5IGFkZGluZyAKKyAqIGZpZWxkcyB0byBIVFRQIHJlcXVlc3QgaGVhZGVycy4gQ29va2llcyBjYW4gYmUgcmV0cmlldmVkCisgKiBmcm9tIGEgcmVxdWVzdCBieSB1c2luZyB0aGUge0BsaW5rIEh0dHBTZXJ2bGV0UmVxdWVzdCNnZXRDb29raWVzfSBtZXRob2QuCisgKiBTZXZlcmFsIGNvb2tpZXMgbWlnaHQgaGF2ZSB0aGUgc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQgcGF0aCBhdHRyaWJ1dGVzLgorICogCisgKiA8cD5Db29raWVzIGFmZmVjdCB0aGUgY2FjaGluZyBvZiB0aGUgV2ViIHBhZ2VzIHRoYXQgdXNlIHRoZW0uIAorICogSFRUUCAxLjAgZG9lcyBub3QgY2FjaGUgcGFnZXMgdGhhdCB1c2UgY29va2llcyBjcmVhdGVkIHdpdGgKKyAqIHRoaXMgY2xhc3MuIFRoaXMgY2xhc3MgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY2FjaGUgY29udHJvbAorICogZGVmaW5lZCB3aXRoIEhUVFAgMS4xLgorICoKKyAqIDxwPlRoaXMgY2xhc3Mgc3VwcG9ydHMgYm90aCB0aGUgVmVyc2lvbiAwIChieSBOZXRzY2FwZSkgYW5kIFZlcnNpb24gMSAKKyAqIChieSBSRkMgMjEwOSkgY29va2llIHNwZWNpZmljYXRpb25zLiBCeSBkZWZhdWx0LCBjb29raWVzIGFyZQorICogY3JlYXRlZCB1c2luZyBWZXJzaW9uIDAgdG8gZW5zdXJlIHRoZSBiZXN0IGludGVyb3BlcmFiaWxpdHkuCisgKgorICoKKyAqIEBhdXRob3IJVmFyaW91cworICogQHZlcnNpb24JJFZlcnNpb24kCisgKgorICovCisKKy8vIFhYWCB3b3VsZCBpbXBsZW1lbnQgamF2YS5pby5TZXJpYWxpemFibGUgdG9vLCBidXQgY2FuJ3QgZG8gdGhhdAorLy8gc28gbG9uZyBhcyBzdW4uc2VydmxldC4qIG11c3QgcnVuIG9uIG9sZGVyIEpESyAxLjAyIEpWTXMgd2hpY2gKKy8vIGRvbid0IGluY2x1ZGUgdGhhdCBzdXBwb3J0LgorCitwdWJsaWMgY2xhc3MgQ29va2llIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMU1RSSU5HX0ZJTEUgPQorCSJqYXZheC5zZXJ2bGV0Lmh0dHAuTG9jYWxTdHJpbmdzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBsU3RyaW5ncyA9CisJUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKExTVFJJTkdfRklMRSk7CisgICAgCisgICAgLy8KKyAgICAvLyBUaGUgdmFsdWUgb2YgdGhlIGNvb2tpZSBpdHNlbGYuCisgICAgLy8KKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOwkvLyBOQU1FPSAuLi4gIiROYW1lIiBzdHlsZSBpcyByZXNlcnZlZAorICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOwkvLyB2YWx1ZSBvZiBOQU1FCisKKyAgICAvLworICAgIC8vIEF0dHJpYnV0ZXMgZW5jb2RlZCBpbiB0aGUgaGVhZGVyJ3MgY29va2llIGZpZWxkcy4KKyAgICAvLworICAgIAorICAgIHByaXZhdGUgU3RyaW5nIGNvbW1lbnQ7CS8vIDtDb21tZW50PVZBTFVFIC4uLiBkZXNjcmliZXMgY29va2llJ3MgdXNlCisJCQkJLy8gO0Rpc2NhcmQgLi4uIGltcGxpZWQgYnkgbWF4QWdlIDwgMAorICAgIHByaXZhdGUgU3RyaW5nIGRvbWFpbjsJLy8gO0RvbWFpbj1WQUxVRSAuLi4gZG9tYWluIHRoYXQgc2VlcyBjb29raWUKKyAgICBwcml2YXRlIGludCBtYXhBZ2UgPSAtMTsJLy8gO01heC1BZ2U9VkFMVUUgLi4uIGNvb2tpZXMgYXV0by1leHBpcmUKKyAgICBwcml2YXRlIFN0cmluZyBwYXRoOwkvLyA7UGF0aD1WQUxVRSAuLi4gVVJMcyB0aGF0IHNlZSB0aGUgY29va2llCisgICAgcHJpdmF0ZSBib29sZWFuIHNlY3VyZTsJLy8gO1NlY3VyZSAuLi4gZS5nLiB1c2UgU1NMCisgICAgcHJpdmF0ZSBpbnQgdmVyc2lvbiA9IDA7CS8vIDtWZXJzaW9uPTEgLi4uIG1lYW5zIFJGQyAyMTA5Kysgc3R5bGUKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBjb29raWUgd2l0aCBhIHNwZWNpZmllZCBuYW1lIGFuZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIDxwPlRoZSBuYW1lIG11c3QgY29uZm9ybSB0byBSRkMgMjEwOS4gVGhhdCBtZWFucyBpdCBjYW4gY29udGFpbiAKKyAgICAgKiBvbmx5IEFTQ0lJIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFuZCBjYW5ub3QgY29udGFpbiBjb21tYXMsIAorICAgICAqIHNlbWljb2xvbnMsIG9yIHdoaXRlIHNwYWNlIG9yIGJlZ2luIHdpdGggYSAkIGNoYXJhY3Rlci4gVGhlIGNvb2tpZSdzCisgICAgICogbmFtZSBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciBjcmVhdGlvbi4KKyAgICAgKgorICAgICAqIDxwPlRoZSB2YWx1ZSBjYW4gYmUgYW55dGhpbmcgdGhlIHNlcnZlciBjaG9vc2VzIHRvIHNlbmQuIEl0cworICAgICAqIHZhbHVlIGlzIHByb2JhYmx5IG9mIGludGVyZXN0IG9ubHkgdG8gdGhlIHNlcnZlci4gVGhlIGNvb2tpZSdzCisgICAgICogdmFsdWUgY2FuIGJlIGNoYW5nZWQgYWZ0ZXIgY3JlYXRpb24gd2l0aCB0aGUKKyAgICAgKiA8Y29kZT5zZXRWYWx1ZTwvY29kZT4gbWV0aG9kLgorICAgICAqCisgICAgICogPHA+QnkgZGVmYXVsdCwgY29va2llcyBhcmUgY3JlYXRlZCBhY2NvcmRpbmcgdG8gdGhlIE5ldHNjYXBlCisgICAgICogY29va2llIHNwZWNpZmljYXRpb24uIFRoZSB2ZXJzaW9uIGNhbiBiZSBjaGFuZ2VkIHdpdGggdGhlIAorICAgICAqIDxjb2RlPnNldFZlcnNpb248L2NvZGU+IG1ldGhvZC4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgCQkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlIGNvb2tpZQorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlCQkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIHZhbHVlIG9mIHRoZSBjb29raWUKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCWlmIHRoZSBjb29raWUgbmFtZSBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMKKyAgICAgKgkJCQkJKGZvciBleGFtcGxlLCBhIGNvbW1hLCBzcGFjZSwgb3Igc2VtaWNvbG9uKQorICAgICAqCQkJCQlvciBpdCBpcyBvbmUgb2YgdGhlIHRva2VucyByZXNlcnZlZCBmb3IgdXNlCisgICAgICoJCQkJCWJ5IHRoZSBjb29raWUgcHJvdG9jb2wKKyAgICAgKiBAc2VlICNzZXRWYWx1ZQorICAgICAqIEBzZWUgI3NldFZlcnNpb24KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIENvb2tpZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisJaWYgKCFpc1Rva2VuKG5hbWUpCisJCXx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiQ29tbWVudCIpCS8vIHJmYzIwMTkKKwkJfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJEaXNjYXJkIikJLy8gMjAxOSsrCisJCXx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiRG9tYWluIikKKwkJfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJFeHBpcmVzIikJLy8gKG9sZCBjb29raWVzKQorCQl8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIk1heC1BZ2UiKQkvLyByZmMyMDE5CisJCXx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiUGF0aCIpCisJCXx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiU2VjdXJlIikKKwkJfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJWZXJzaW9uIikKKwkJfHwgbmFtZS5zdGFydHNXaXRoKCIkIikKKwkgICAgKSB7CisJICAgIFN0cmluZyBlcnJNc2cgPSBsU3RyaW5ncy5nZXRTdHJpbmcoImVyci5jb29raWVfbmFtZV9pc190b2tlbiIpOworCSAgICBPYmplY3RbXSBlcnJBcmdzID0gbmV3IE9iamVjdFsxXTsKKwkgICAgZXJyQXJnc1swXSA9IG5hbWU7CisJICAgIGVyck1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGVyck1zZywgZXJyQXJncyk7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXJyTXNnKTsKKwl9CisKKwl0aGlzLm5hbWUgPSBuYW1lOworCXRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKworCisKKworICAgIC8qKgorICAgICAqCisgICAgICogU3BlY2lmaWVzIGEgY29tbWVudCB0aGF0IGRlc2NyaWJlcyBhIGNvb2tpZSdzIHB1cnBvc2UuCisgICAgICogVGhlIGNvbW1lbnQgaXMgdXNlZnVsIGlmIHRoZSBicm93c2VyIHByZXNlbnRzIHRoZSBjb29raWUgCisgICAgICogdG8gdGhlIHVzZXIuIENvbW1lbnRzCisgICAgICogYXJlIG5vdCBzdXBwb3J0ZWQgYnkgTmV0c2NhcGUgVmVyc2lvbiAwIGNvb2tpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHVycG9zZQkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIGNvbW1lbnQgCisgICAgICoJCQkJdG8gZGlzcGxheSB0byB0aGUgdXNlcgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Q29tbWVudAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBwdXJwb3NlKSB7CisJY29tbWVudCA9IHB1cnBvc2U7CisgICAgfQorICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29tbWVudCBkZXNjcmliaW5nIHRoZSBwdXJwb3NlIG9mIHRoaXMgY29va2llLCBvcgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjb29raWUgaGFzIG5vIGNvbW1lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGNvbW1lbnQsCisgICAgICoJCQkJb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorICAgICAqCisgICAgICogQHNlZSAjc2V0Q29tbWVudAorICAgICAqCisgICAgICovIAorCisgICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgeworCXJldHVybiBjb21tZW50OworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGRvbWFpbiB3aXRoaW4gd2hpY2ggdGhpcyBjb29raWUgc2hvdWxkIGJlIHByZXNlbnRlZC4KKyAgICAgKgorICAgICAqIDxwPlRoZSBmb3JtIG9mIHRoZSBkb21haW4gbmFtZSBpcyBzcGVjaWZpZWQgYnkgUkZDIDIxMDkuIEEgZG9tYWluCisgICAgICogbmFtZSBiZWdpbnMgd2l0aCBhIGRvdCAoPGNvZGU+LmZvby5jb208L2NvZGU+KSBhbmQgbWVhbnMgdGhhdAorICAgICAqIHRoZSBjb29raWUgaXMgdmlzaWJsZSB0byBzZXJ2ZXJzIGluIGEgc3BlY2lmaWVkIERvbWFpbiBOYW1lIFN5c3RlbQorICAgICAqIChETlMpIHpvbmUgKGZvciBleGFtcGxlLCA8Y29kZT53d3cuZm9vLmNvbTwvY29kZT4sIGJ1dCBub3QgCisgICAgICogPGNvZGU+YS5iLmZvby5jb208L2NvZGU+KS4gQnkgZGVmYXVsdCwgY29va2llcyBhcmUgb25seSByZXR1cm5lZAorICAgICAqIHRvIHRoZSBzZXJ2ZXIgdGhhdCBzZW50IHRoZW0uCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgZG9tYWluIG5hbWUKKyAgICAgKgkJCQl3aXRoaW4gd2hpY2ggdGhpcyBjb29raWUgaXMgdmlzaWJsZTsKKyAgICAgKgkJCQlmb3JtIGlzIGFjY29yZGluZyB0byBSRkMgMjEwOQorICAgICAqCisgICAgICogQHNlZSAjZ2V0RG9tYWluCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgcGF0dGVybikgeworCWRvbWFpbiA9IHBhdHRlcm4udG9Mb3dlckNhc2UoKTsJLy8gSUUgYWxsZWdlZGx5IG5lZWRzIHRoaXMKKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkb21haW4gbmFtZSBzZXQgZm9yIHRoaXMgY29va2llLiBUaGUgZm9ybSBvZiAKKyAgICAgKiB0aGUgZG9tYWluIG5hbWUgaXMgc2V0IGJ5IFJGQyAyMTA5LgorICAgICAqCisgICAgICogQHJldHVybgkJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIHRoZSBkb21haW4gbmFtZQorICAgICAqCisgICAgICogQHNlZSAjc2V0RG9tYWluCisgICAgICoKKyAgICAgKi8gCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKwlyZXR1cm4gZG9tYWluOworICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1heGltdW0gYWdlIG9mIHRoZSBjb29raWUgaW4gc2Vjb25kcy4KKyAgICAgKgorICAgICAqIDxwPkEgcG9zaXRpdmUgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIGNvb2tpZSB3aWxsIGV4cGlyZQorICAgICAqIGFmdGVyIHRoYXQgbWFueSBzZWNvbmRzIGhhdmUgcGFzc2VkLiBOb3RlIHRoYXQgdGhlIHZhbHVlIGlzCisgICAgICogdGhlIDxpPm1heGltdW08L2k+IGFnZSB3aGVuIHRoZSBjb29raWUgd2lsbCBleHBpcmUsIG5vdCB0aGUgY29va2llJ3MKKyAgICAgKiBjdXJyZW50IGFnZS4KKyAgICAgKgorICAgICAqIDxwPkEgbmVnYXRpdmUgdmFsdWUgbWVhbnMKKyAgICAgKiB0aGF0IHRoZSBjb29raWUgaXMgbm90IHN0b3JlZCBwZXJzaXN0ZW50bHkgYW5kIHdpbGwgYmUgZGVsZXRlZAorICAgICAqIHdoZW4gdGhlIFdlYiBicm93c2VyIGV4aXRzLiBBIHplcm8gdmFsdWUgY2F1c2VzIHRoZSBjb29raWUKKyAgICAgKiB0byBiZSBkZWxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV4cGlyeQkJYW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBtYXhpbXVtIGFnZSBvZiB0aGUKKyAgICAgKiAJCQkJY29va2llIGluIHNlY29uZHM7IGlmIG5lZ2F0aXZlLCBtZWFucworICAgICAqCQkJCXRoZSBjb29raWUgaXMgbm90IHN0b3JlZDsgaWYgemVybywgZGVsZXRlcworICAgICAqCQkJCXRoZSBjb29raWUKKyAgICAgKgorICAgICAqCisgICAgICogQHNlZSAjZ2V0TWF4QWdlCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldE1heEFnZShpbnQgZXhwaXJ5KSB7CisJbWF4QWdlID0gZXhwaXJ5OworICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gYWdlIG9mIHRoZSBjb29raWUsIHNwZWNpZmllZCBpbiBzZWNvbmRzLAorICAgICAqIEJ5IGRlZmF1bHQsIDxjb2RlPi0xPC9jb2RlPiBpbmRpY2F0aW5nIHRoZSBjb29raWUgd2lsbCBwZXJzaXN0CisgICAgICogdW50aWwgYnJvd3NlciBzaHV0ZG93bi4KKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybgkJCWFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgbWF4aW11bSBhZ2Ugb2YgdGhlCisgICAgICoJCQkJY29va2llIGluIHNlY29uZHM7IGlmIG5lZ2F0aXZlLCBtZWFucworICAgICAqCQkJCXRoZSBjb29raWUgcGVyc2lzdHMgdW50aWwgYnJvd3NlciBzaHV0ZG93bgorICAgICAqCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRNYXhBZ2UKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIGludCBnZXRNYXhBZ2UoKSB7CisJcmV0dXJuIG1heEFnZTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgYSBwYXRoIGZvciB0aGUgY29va2llCisgICAgICogdG8gd2hpY2ggdGhlIGNsaWVudCBzaG91bGQgcmV0dXJuIHRoZSBjb29raWUuCisgICAgICoKKyAgICAgKiA8cD5UaGUgY29va2llIGlzIHZpc2libGUgdG8gYWxsIHRoZSBwYWdlcyBpbiB0aGUgZGlyZWN0b3J5CisgICAgICogeW91IHNwZWNpZnksIGFuZCBhbGwgdGhlIHBhZ2VzIGluIHRoYXQgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMuIAorICAgICAqIEEgY29va2llJ3MgcGF0aCBtdXN0IGluY2x1ZGUgdGhlIHNlcnZsZXQgdGhhdCBzZXQgdGhlIGNvb2tpZSwKKyAgICAgKiBmb3IgZXhhbXBsZSwgPGk+L2NhdGFsb2c8L2k+LCB3aGljaCBtYWtlcyB0aGUgY29va2llCisgICAgICogdmlzaWJsZSB0byBhbGwgZGlyZWN0b3JpZXMgb24gdGhlIHNlcnZlciB1bmRlciA8aT4vY2F0YWxvZzwvaT4uCisgICAgICoKKyAgICAgKiA8cD5Db25zdWx0IFJGQyAyMTA5IChhdmFpbGFibGUgb24gdGhlIEludGVybmV0KSBmb3IgbW9yZQorICAgICAqIGluZm9ybWF0aW9uIG9uIHNldHRpbmcgcGF0aCBuYW1lcyBmb3IgY29va2llcy4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIHVyaQkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgYSBwYXRoCisgICAgICoKKyAgICAgKgorICAgICAqIEBzZWUgI2dldFBhdGgKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgdXJpKSB7CisJcGF0aCA9IHVyaTsKKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXRoIG9uIHRoZSBzZXJ2ZXIgCisgICAgICogdG8gd2hpY2ggdGhlIGJyb3dzZXIgcmV0dXJucyB0aGlzIGNvb2tpZS4gVGhlCisgICAgICogY29va2llIGlzIHZpc2libGUgdG8gYWxsIHN1YnBhdGhzIG9uIHRoZSBzZXJ2ZXIuCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIGEgcGF0aCB0aGF0IGNvbnRhaW5zCisgICAgICoJCQlhIHNlcnZsZXQgbmFtZSwgZm9yIGV4YW1wbGUsIDxpPi9jYXRhbG9nPC9pPgorICAgICAqCisgICAgICogQHNlZSAjc2V0UGF0aAorICAgICAqCisgICAgICovIAorCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworCXJldHVybiBwYXRoOworICAgIH0KKworCisKKworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRvIHRoZSBicm93c2VyIHdoZXRoZXIgdGhlIGNvb2tpZSBzaG91bGQgb25seSBiZSBzZW50CisgICAgICogdXNpbmcgYSBzZWN1cmUgcHJvdG9jb2wsIHN1Y2ggYXMgSFRUUFMgb3IgU1NMLgorICAgICAqCisgICAgICogPHA+VGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZsYWcJaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHNlbmRzIHRoZSBjb29raWUgZnJvbSB0aGUgYnJvd3NlcgorICAgICAqCQkJdG8gdGhlIHNlcnZlciBvbmx5IHdoZW4gdXNpbmcgYSBzZWN1cmUgcHJvdG9jb2w7CisgICAgICoJCQlpZiA8Y29kZT5mYWxzZTwvY29kZT4sIHNlbnQgb24gYW55IHByb3RvY29sCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRTZWN1cmUKKyAgICAgKgorICAgICAqLworIAorICAgIHB1YmxpYyB2b2lkIHNldFNlY3VyZShib29sZWFuIGZsYWcpIHsKKwlzZWN1cmUgPSBmbGFnOworICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGJyb3dzZXIgaXMgc2VuZGluZyBjb29raWVzCisgICAgICogb25seSBvdmVyIGEgc2VjdXJlIHByb3RvY29sLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlCisgICAgICogYnJvd3NlciBjYW4gc2VuZCBjb29raWVzIHVzaW5nIGFueSBwcm90b2NvbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCTxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBicm93c2VyIHVzZXMgYSBzZWN1cmUgcHJvdG9jb2w7CisgICAgICogCQkJIG90aGVyd2lzZSwgPGNvZGU+dHJ1ZTwvY29kZT4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFNlY3VyZQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTZWN1cmUoKSB7CisJcmV0dXJuIHNlY3VyZTsKKyAgICB9CisKKworCisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNvb2tpZS4gVGhlIG5hbWUgY2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIKKyAgICAgKiBjcmVhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBjb29raWUncyBuYW1lCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwlyZXR1cm4gbmFtZTsKKyAgICB9CisKKworCisKKworICAgIC8qKgorICAgICAqCisgICAgICogQXNzaWducyBhIG5ldyB2YWx1ZSB0byBhIGNvb2tpZSBhZnRlciB0aGUgY29va2llIGlzIGNyZWF0ZWQuCisgICAgICogSWYgeW91IHVzZSBhIGJpbmFyeSB2YWx1ZSwgeW91IG1heSB3YW50IHRvIHVzZSBCQVNFNjQgZW5jb2RpbmcuCisgICAgICoKKyAgICAgKiA8cD5XaXRoIFZlcnNpb24gMCBjb29raWVzLCB2YWx1ZXMgc2hvdWxkIG5vdCBjb250YWluIHdoaXRlIAorICAgICAqIHNwYWNlLCBicmFja2V0cywgcGFyZW50aGVzZXMsIGVxdWFscyBzaWducywgY29tbWFzLAorICAgICAqIGRvdWJsZSBxdW90ZXMsIHNsYXNoZXMsIHF1ZXN0aW9uIG1hcmtzLCBhdCBzaWducywgY29sb25zLAorICAgICAqIGFuZCBzZW1pY29sb25zLiBFbXB0eSB2YWx1ZXMgbWF5IG5vdCBiZWhhdmUgdGhlIHNhbWUgd2F5CisgICAgICogb24gYWxsIGJyb3dzZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIG5ld1ZhbHVlCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgbmV3IHZhbHVlIAorICAgICAqCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRWYWx1ZQorICAgICAqIEBzZWUgQ29va2llCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgeworCXZhbHVlID0gbmV3VmFsdWU7CisgICAgfQorCisKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGNvb2tpZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgY29va2llJ3MKKyAgICAgKgkJCQlwcmVzZW50IHZhbHVlCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRWYWx1ZQorICAgICAqIEBzZWUgQ29va2llCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJcmV0dXJuIHZhbHVlOworICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIHByb3RvY29sIHRoaXMgY29va2llIGNvbXBsaWVzIAorICAgICAqIHdpdGguIFZlcnNpb24gMSBjb21wbGllcyB3aXRoIFJGQyAyMTA5LCAKKyAgICAgKiBhbmQgdmVyc2lvbiAwIGNvbXBsaWVzIHdpdGggdGhlIG9yaWdpbmFsCisgICAgICogY29va2llIHNwZWNpZmljYXRpb24gZHJhZnRlZCBieSBOZXRzY2FwZS4gQ29va2llcyBwcm92aWRlZAorICAgICAqIGJ5IGEgYnJvd3NlciB1c2UgYW5kIGlkZW50aWZ5IHRoZSBicm93c2VyJ3MgY29va2llIHZlcnNpb24uCisgICAgICogCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJMCBpZiB0aGUgY29va2llIGNvbXBsaWVzIHdpdGggdGhlCisgICAgICoJCQkJb3JpZ2luYWwgTmV0c2NhcGUgc3BlY2lmaWNhdGlvbjsgMQorICAgICAqCQkJCWlmIHRoZSBjb29raWUgY29tcGxpZXMgd2l0aCBSRkMgMjEwOQorICAgICAqCisgICAgICogQHNlZSAjc2V0VmVyc2lvbgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7CisJcmV0dXJuIHZlcnNpb247CisgICAgfQorCisKKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmVyc2lvbiBvZiB0aGUgY29va2llIHByb3RvY29sIHRoaXMgY29va2llIGNvbXBsaWVzCisgICAgICogd2l0aC4gVmVyc2lvbiAwIGNvbXBsaWVzIHdpdGggdGhlIG9yaWdpbmFsIE5ldHNjYXBlIGNvb2tpZQorICAgICAqIHNwZWNpZmljYXRpb24uIFZlcnNpb24gMSBjb21wbGllcyB3aXRoIFJGQyAyMTA5LgorICAgICAqCisgICAgICogPHA+U2luY2UgUkZDIDIxMDkgaXMgc3RpbGwgc29tZXdoYXQgbmV3LCBjb25zaWRlcgorICAgICAqIHZlcnNpb24gMSBhcyBleHBlcmltZW50YWw7IGRvIG5vdCB1c2UgaXQgeWV0IG9uIHByb2R1Y3Rpb24gc2l0ZXMuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSB2CQkJMCBpZiB0aGUgY29va2llIHNob3VsZCBjb21wbHkgd2l0aCAKKyAgICAgKgkJCQl0aGUgb3JpZ2luYWwgTmV0c2NhcGUgc3BlY2lmaWNhdGlvbjsKKyAgICAgKgkJCQkxIGlmIHRoZSBjb29raWUgc2hvdWxkIGNvbXBseSB3aXRoIFJGQyAyMTA5CisgICAgICoKKyAgICAgKiBAc2VlICNnZXRWZXJzaW9uCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oaW50IHYpIHsKKwl2ZXJzaW9uID0gdjsKKyAgICB9CisKKyAgICAvLyBOb3RlIC0tIGRpc2FibGVkIGZvciBub3cgdG8gYWxsb3cgZnVsbCBOZXRzY2FwZSBjb21wYXRpYmlsaXR5CisgICAgLy8gZnJvbSBSRkMgMjA2OCwgdG9rZW4gc3BlY2lhbCBjYXNlIGNoYXJhY3RlcnMKKyAgICAvLyAKKyAgICAvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdHNwZWNpYWxzID0gIigpPD5ALDs6XFxcIi9bXT89e30gXHQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRzcGVjaWFscyA9ICIsOyAiOworICAgIAorICAgIAorICAgIAorCisgICAgLyoKKyAgICAgKiBUZXN0cyBhIHN0cmluZyBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgY291bnRzIGFzIGEgCisgICAgICogcmVzZXJ2ZWQgdG9rZW4gaW4gdGhlIEphdmEgbGFuZ3VhZ2UuCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlCQl0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBiZSB0ZXN0ZWQKKyAgICAgKgorICAgICAqIEByZXR1cm4JCQk8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBpcworICAgICAqCQkJCWEgcmVzZXJ2ZWQgdG9rZW47IDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqCQkJCWlmIGl0IGlzIG5vdAkJCQorICAgICAqLworCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVG9rZW4oU3RyaW5nIHZhbHVlKSB7CisJaW50IGxlbiA9IHZhbHVlLmxlbmd0aCgpOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworCSAgICBjaGFyIGMgPSB2YWx1ZS5jaGFyQXQoaSk7CisKKwkgICAgaWYgKGMgPCAweDIwIHx8IGMgPj0gMHg3ZiB8fCB0c3BlY2lhbHMuaW5kZXhPZihjKSAhPSAtMSkKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKKyAgICB9CisKKworCisKKworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBPdmVycmlkZXMgdGhlIHN0YW5kYXJkIDxjb2RlPmphdmEubGFuZy5PYmplY3QuY2xvbmU8L2NvZGU+IAorICAgICAqIG1ldGhvZCB0byByZXR1cm4gYSBjb3B5IG9mIHRoaXMgY29va2llLgorICAgICAqCQkKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKwl0cnkgeworCSAgICByZXR1cm4gc3VwZXIuY2xvbmUoKTsKKwl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisJICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKwl9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiNGM2OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDEwMTkgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0Lmh0dHA7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkdlbmVyaWNTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKKworCisvKioKKyAqCisgKiBQcm92aWRlcyBhbiBhYnN0cmFjdCBjbGFzcyB0byBiZSBzdWJjbGFzc2VkIHRvIGNyZWF0ZQorICogYW4gSFRUUCBzZXJ2bGV0IHN1aXRhYmxlIGZvciBhIFdlYiBzaXRlLiBBIHN1YmNsYXNzIG9mCisgKiA8Y29kZT5IdHRwU2VydmxldDwvY29kZT4gbXVzdCBvdmVycmlkZSBhdCBsZWFzdCAKKyAqIG9uZSBtZXRob2QsIHVzdWFsbHkgb25lIG9mIHRoZXNlOgorICoKKyAqIDx1bD4KKyAqIDxsaT4gPGNvZGU+ZG9HZXQ8L2NvZGU+LCBpZiB0aGUgc2VydmxldCBzdXBwb3J0cyBIVFRQIEdFVCByZXF1ZXN0cworICogPGxpPiA8Y29kZT5kb1Bvc3Q8L2NvZGU+LCBmb3IgSFRUUCBQT1NUIHJlcXVlc3RzCisgKiA8bGk+IDxjb2RlPmRvUHV0PC9jb2RlPiwgZm9yIEhUVFAgUFVUIHJlcXVlc3RzCisgKiA8bGk+IDxjb2RlPmRvRGVsZXRlPC9jb2RlPiwgZm9yIEhUVFAgREVMRVRFIHJlcXVlc3RzCisgKiA8bGk+IDxjb2RlPmluaXQ8L2NvZGU+IGFuZCA8Y29kZT5kZXN0cm95PC9jb2RlPiwgCisgKiB0byBtYW5hZ2UgcmVzb3VyY2VzIHRoYXQgYXJlIGhlbGQgZm9yIHRoZSBsaWZlIG9mIHRoZSBzZXJ2bGV0CisgKiA8bGk+IDxjb2RlPmdldFNlcnZsZXRJbmZvPC9jb2RlPiwgd2hpY2ggdGhlIHNlcnZsZXQgdXNlcyB0bworICogcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBpdHNlbGYgCisgKiA8L3VsPgorICoKKyAqIDxwPlRoZXJlJ3MgYWxtb3N0IG5vIHJlYXNvbiB0byBvdmVycmlkZSB0aGUgPGNvZGU+c2VydmljZTwvY29kZT4KKyAqIG1ldGhvZC4gPGNvZGU+c2VydmljZTwvY29kZT4gaGFuZGxlcyBzdGFuZGFyZCBIVFRQCisgKiByZXF1ZXN0cyBieSBkaXNwYXRjaGluZyB0aGVtIHRvIHRoZSBoYW5kbGVyIG1ldGhvZHMKKyAqIGZvciBlYWNoIEhUVFAgcmVxdWVzdCB0eXBlICh0aGUgPGNvZGU+ZG88L2NvZGU+PGk+WFhYPC9pPgorICogbWV0aG9kcyBsaXN0ZWQgYWJvdmUpLgorICoKKyAqIDxwPkxpa2V3aXNlLCB0aGVyZSdzIGFsbW9zdCBubyByZWFzb24gdG8gb3ZlcnJpZGUgdGhlIAorICogPGNvZGU+ZG9PcHRpb25zPC9jb2RlPiBhbmQgPGNvZGU+ZG9UcmFjZTwvY29kZT4gbWV0aG9kcy4KKyAqIAorICogPHA+U2VydmxldHMgdHlwaWNhbGx5IHJ1biBvbiBtdWx0aXRocmVhZGVkIHNlcnZlcnMsCisgKiBzbyBiZSBhd2FyZSB0aGF0IGEgc2VydmxldCBtdXN0IGhhbmRsZSBjb25jdXJyZW50CisgKiByZXF1ZXN0cyBhbmQgYmUgY2FyZWZ1bCB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gc2hhcmVkIHJlc291cmNlcy4KKyAqIFNoYXJlZCByZXNvdXJjZXMgaW5jbHVkZSBpbi1tZW1vcnkgZGF0YSBzdWNoIGFzCisgKiBpbnN0YW5jZSBvciBjbGFzcyB2YXJpYWJsZXMgYW5kIGV4dGVybmFsIG9iamVjdHMKKyAqIHN1Y2ggYXMgZmlsZXMsIGRhdGFiYXNlIGNvbm5lY3Rpb25zLCBhbmQgbmV0d29yayAKKyAqIGNvbm5lY3Rpb25zLgorICogU2VlIHRoZQorICogPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9TZXJpZXMvVHV0b3JpYWwvamF2YS90aHJlYWRzL211bHRpdGhyZWFkZWQuaHRtbCI+CisgKiBKYXZhIFR1dG9yaWFsIG9uIE11bHRpdGhyZWFkZWQgUHJvZ3JhbW1pbmc8L2E+IGZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiBoYW5kbGluZyBtdWx0aXBsZSB0aHJlYWRzIGluIGEgSmF2YSBwcm9ncmFtLgorICoKKyAqIEBhdXRob3IJVmFyaW91cworICogQHZlcnNpb24JJFZlcnNpb24kCisgKgorICovCisKKworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSHR0cFNlcnZsZXQgZXh0ZW5kcyBHZW5lcmljU2VydmxldAorICAgIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0RFTEVURSA9ICJERUxFVEUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfSEVBRCA9ICJIRUFEIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0dFVCA9ICJHRVQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfT1BUSU9OUyA9ICJPUFRJT05TIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1BPU1QgPSAiUE9TVCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9QVVQgPSAiUFVUIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1RSQUNFID0gIlRSQUNFIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfSUZNT0RTSU5DRSA9ICJJZi1Nb2RpZmllZC1TaW5jZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9MQVNUTU9EID0gIkxhc3QtTW9kaWZpZWQiOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMU1RSSU5HX0ZJTEUgPQorCSJqYXZheC5zZXJ2bGV0Lmh0dHAuTG9jYWxTdHJpbmdzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBsU3RyaW5ncyA9CisJUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKExTVFJJTkdfRklMRSk7CisgICAKKyAgIAorICAgCisgICAgCisgICAgLyoqCisgICAgICogRG9lcyBub3RoaW5nLCBiZWNhdXNlIHRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MuCisgICAgICogCisgICAgICovCisKKyAgICBwdWJsaWMgSHR0cFNlcnZsZXQoKSB7IH0KKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgKHZpYSB0aGUgPGNvZGU+c2VydmljZTwvY29kZT4gbWV0aG9kKSB0bworICAgICAqIGFsbG93IGEgc2VydmxldCB0byBoYW5kbGUgYSBHRVQgcmVxdWVzdC4gCisgICAgICoKKyAgICAgKiA8cD5PdmVycmlkaW5nIHRoaXMgbWV0aG9kIHRvIHN1cHBvcnQgYSBHRVQgcmVxdWVzdCBhbHNvCisgICAgICogYXV0b21hdGljYWxseSBzdXBwb3J0cyBhbiBIVFRQIEhFQUQgcmVxdWVzdC4gQSBIRUFECisgICAgICogcmVxdWVzdCBpcyBhIEdFVCByZXF1ZXN0IHRoYXQgcmV0dXJucyBubyBib2R5IGluIHRoZQorICAgICAqIHJlc3BvbnNlLCBvbmx5IHRoZSByZXF1ZXN0IGhlYWRlciBmaWVsZHMuCisgICAgICoKKyAgICAgKiA8cD5XaGVuIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QsIHJlYWQgdGhlIHJlcXVlc3QgZGF0YSwKKyAgICAgKiB3cml0ZSB0aGUgcmVzcG9uc2UgaGVhZGVycywgZ2V0IHRoZSByZXNwb25zZSdzIHdyaXRlciBvciAKKyAgICAgKiBvdXRwdXQgc3RyZWFtIG9iamVjdCwgYW5kIGZpbmFsbHksIHdyaXRlIHRoZSByZXNwb25zZSBkYXRhLgorICAgICAqIEl0J3MgYmVzdCB0byBpbmNsdWRlIGNvbnRlbnQgdHlwZSBhbmQgZW5jb2RpbmcuIFdoZW4gdXNpbmcKKyAgICAgKiBhIDxjb2RlPlByaW50V3JpdGVyPC9jb2RlPiBvYmplY3QgdG8gcmV0dXJuIHRoZSByZXNwb25zZSwKKyAgICAgKiBzZXQgdGhlIGNvbnRlbnQgdHlwZSBiZWZvcmUgYWNjZXNzaW5nIHRoZQorICAgICAqIDxjb2RlPlByaW50V3JpdGVyPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiA8cD5UaGUgc2VydmxldCBjb250YWluZXIgbXVzdCB3cml0ZSB0aGUgaGVhZGVycyBiZWZvcmUKKyAgICAgKiBjb21taXR0aW5nIHRoZSByZXNwb25zZSwgYmVjYXVzZSBpbiBIVFRQIHRoZSBoZWFkZXJzIG11c3QgYmUgc2VudAorICAgICAqIGJlZm9yZSB0aGUgcmVzcG9uc2UgYm9keS4KKyAgICAgKgorICAgICAqIDxwPldoZXJlIHBvc3NpYmxlLCBzZXQgdGhlIENvbnRlbnQtTGVuZ3RoIGhlYWRlciAod2l0aCB0aGUKKyAgICAgKiB7QGxpbmsgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2Ujc2V0Q29udGVudExlbmd0aH0gbWV0aG9kKSwKKyAgICAgKiB0byBhbGxvdyB0aGUgc2VydmxldCBjb250YWluZXIgdG8gdXNlIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uIAorICAgICAqIHRvIHJldHVybiBpdHMgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCwgaW1wcm92aW5nIHBlcmZvcm1hbmNlLgorICAgICAqIFRoZSBjb250ZW50IGxlbmd0aCBpcyBhdXRvbWF0aWNhbGx5IHNldCBpZiB0aGUgZW50aXJlIHJlc3BvbnNlIGZpdHMKKyAgICAgKiBpbnNpZGUgdGhlIHJlc3BvbnNlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIDxwPldoZW4gdXNpbmcgSFRUUCAxLjEgY2h1bmtlZCBlbmNvZGluZyAod2hpY2ggbWVhbnMgdGhhdCB0aGUgcmVzcG9uc2UKKyAgICAgKiBoYXMgYSBUcmFuc2Zlci1FbmNvZGluZyBoZWFkZXIpLCBkbyBub3Qgc2V0IHRoZSBDb250ZW50LUxlbmd0aCBoZWFkZXIuCisgICAgICoKKyAgICAgKiA8cD5UaGUgR0VUIG1ldGhvZCBzaG91bGQgYmUgc2FmZSwgdGhhdCBpcywgd2l0aG91dAorICAgICAqIGFueSBzaWRlIGVmZmVjdHMgZm9yIHdoaWNoIHVzZXJzIGFyZSBoZWxkIHJlc3BvbnNpYmxlLgorICAgICAqIEZvciBleGFtcGxlLCBtb3N0IGZvcm0gcXVlcmllcyBoYXZlIG5vIHNpZGUgZWZmZWN0cy4KKyAgICAgKiBJZiBhIGNsaWVudCByZXF1ZXN0IGlzIGludGVuZGVkIHRvIGNoYW5nZSBzdG9yZWQgZGF0YSwKKyAgICAgKiB0aGUgcmVxdWVzdCBzaG91bGQgdXNlIHNvbWUgb3RoZXIgSFRUUCBtZXRob2QuCisgICAgICoKKyAgICAgKiA8cD5UaGUgR0VUIG1ldGhvZCBzaG91bGQgYWxzbyBiZSBpZGVtcG90ZW50LCBtZWFuaW5nCisgICAgICogdGhhdCBpdCBjYW4gYmUgc2FmZWx5IHJlcGVhdGVkLiBTb21ldGltZXMgbWFraW5nIGEKKyAgICAgKiBtZXRob2Qgc2FmZSBhbHNvIG1ha2VzIGl0IGlkZW1wb3RlbnQuIEZvciBleGFtcGxlLCAKKyAgICAgKiByZXBlYXRpbmcgcXVlcmllcyBpcyBib3RoIHNhZmUgYW5kIGlkZW1wb3RlbnQsIGJ1dAorICAgICAqIGJ1eWluZyBhIHByb2R1Y3Qgb25saW5lIG9yIG1vZGlmeWluZyBkYXRhIGlzIG5laXRoZXIKKyAgICAgKiBzYWZlIG5vciBpZGVtcG90ZW50LiAKKyAgICAgKgorICAgICAqIDxwPklmIHRoZSByZXF1ZXN0IGlzIGluY29ycmVjdGx5IGZvcm1hdHRlZCwgPGNvZGU+ZG9HZXQ8L2NvZGU+CisgICAgICogcmV0dXJucyBhbiBIVFRQICJCYWQgUmVxdWVzdCIgbWVzc2FnZS4KKyAgICAgKiAKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXEJYW4ge0BsaW5rIEh0dHBTZXJ2bGV0UmVxdWVzdH0gb2JqZWN0IHRoYXQKKyAgICAgKgkJCWNvbnRhaW5zIHRoZSByZXF1ZXN0IHRoZSBjbGllbnQgaGFzIG1hZGUKKyAgICAgKgkJCW9mIHRoZSBzZXJ2bGV0CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcAlhbiB7QGxpbmsgSHR0cFNlcnZsZXRSZXNwb25zZX0gb2JqZWN0IHRoYXQKKyAgICAgKgkJCWNvbnRhaW5zIHRoZSByZXNwb25zZSB0aGUgc2VydmxldCBzZW5kcworICAgICAqCQkJdG8gdGhlIGNsaWVudAorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24JaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGVycm9yIGlzIAorICAgICAqCQkJCWRldGVjdGVkIHdoZW4gdGhlIHNlcnZsZXQgaGFuZGxlcworICAgICAqCQkJCXRoZSBHRVQgcmVxdWVzdAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uCWlmIHRoZSByZXF1ZXN0IGZvciB0aGUgR0VUCisgICAgICoJCQkJCWNvdWxkIG5vdCBiZSBoYW5kbGVkCisgICAgICoKKyAgICAgKiAKKyAgICAgKiBAc2VlIGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlI3NldENvbnRlbnRUeXBlCisgICAgICoKKyAgICAgKi8KKworICAgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKwl0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICB7CisJU3RyaW5nIHByb3RvY29sID0gcmVxLmdldFByb3RvY29sKCk7CisJU3RyaW5nIG1zZyA9IGxTdHJpbmdzLmdldFN0cmluZygiaHR0cC5tZXRob2RfZ2V0X25vdF9zdXBwb3J0ZWQiKTsKKwlpZiAocHJvdG9jb2wuZW5kc1dpdGgoIjEuMSIpKSB7CisJICAgIHJlc3Auc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTUVUSE9EX05PVF9BTExPV0VELCBtc2cpOworCX0gZWxzZSB7CisJICAgIHJlc3Auc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1zZyk7CisJfQorICAgIH0KKworCisKKworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIHRoZSA8Y29kZT5IdHRwU2VydmxldFJlcXVlc3Q8L2NvZGU+CisgICAgICogb2JqZWN0IHdhcyBsYXN0IG1vZGlmaWVkLAorICAgICAqIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCBKYW51YXJ5IDEsIDE5NzAgR01ULgorICAgICAqIElmIHRoZSB0aW1lIGlzIHVua25vd24sIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZWdhdGl2ZQorICAgICAqIG51bWJlciAodGhlIGRlZmF1bHQpLgorICAgICAqCisgICAgICogPHA+U2VydmxldHMgdGhhdCBzdXBwb3J0IEhUVFAgR0VUIHJlcXVlc3RzIGFuZCBjYW4gcXVpY2tseSBkZXRlcm1pbmUKKyAgICAgKiB0aGVpciBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKyAgICAgKiBUaGlzIG1ha2VzIGJyb3dzZXIgYW5kIHByb3h5IGNhY2hlcyB3b3JrIG1vcmUgZWZmZWN0aXZlbHksCisgICAgICogcmVkdWNpbmcgdGhlIGxvYWQgb24gc2VydmVyIGFuZCBuZXR3b3JrIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIHJlcQl0aGUgPGNvZGU+SHR0cFNlcnZsZXRSZXF1ZXN0PC9jb2RlPiAKKyAgICAgKgkJCW9iamVjdCB0aGF0IGlzIHNlbnQgdG8gdGhlIHNlcnZsZXQKKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+bG9uZzwvY29kZT4gaW50ZWdlciBzcGVjaWZ5aW5nCisgICAgICoJCQl0aGUgdGltZSB0aGUgPGNvZGU+SHR0cFNlcnZsZXRSZXF1ZXN0PC9jb2RlPgorICAgICAqCQkJb2JqZWN0IHdhcyBsYXN0IG1vZGlmaWVkLCBpbiBtaWxsaXNlY29uZHMKKyAgICAgKgkJCXNpbmNlIG1pZG5pZ2h0LCBKYW51YXJ5IDEsIDE5NzAgR01ULCBvcgorICAgICAqCQkJLTEgaWYgdGhlIHRpbWUgaXMgbm90IGtub3duCisgICAgICoKKyAgICAgKi8KKworICAgIHByb3RlY3RlZCBsb25nIGdldExhc3RNb2RpZmllZChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisJcmV0dXJuIC0xOworICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqIAorICAgICAqCisgICAgICogPHA+UmVjZWl2ZXMgYW4gSFRUUCBIRUFEIHJlcXVlc3QgZnJvbSB0aGUgcHJvdGVjdGVkCisgICAgICogPGNvZGU+c2VydmljZTwvY29kZT4gbWV0aG9kIGFuZCBoYW5kbGVzIHRoZQorICAgICAqIHJlcXVlc3QuCisgICAgICogVGhlIGNsaWVudCBzZW5kcyBhIEhFQUQgcmVxdWVzdCB3aGVuIGl0IHdhbnRzCisgICAgICogdG8gc2VlIG9ubHkgdGhlIGhlYWRlcnMgb2YgYSByZXNwb25zZSwgc3VjaCBhcworICAgICAqIENvbnRlbnQtVHlwZSBvciBDb250ZW50LUxlbmd0aC4gVGhlIEhUVFAgSEVBRAorICAgICAqIG1ldGhvZCBjb3VudHMgdGhlIG91dHB1dCBieXRlcyBpbiB0aGUgcmVzcG9uc2UKKyAgICAgKiB0byBzZXQgdGhlIENvbnRlbnQtTGVuZ3RoIGhlYWRlciBhY2N1cmF0ZWx5LgorICAgICAqCisgICAgICogPHA+SWYgeW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCB5b3UgY2FuIGF2b2lkIGNvbXB1dGluZworICAgICAqIHRoZSByZXNwb25zZSBib2R5IGFuZCBqdXN0IHNldCB0aGUgcmVzcG9uc2UgaGVhZGVycworICAgICAqIGRpcmVjdGx5IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuIE1ha2Ugc3VyZSB0aGF0IHRoZQorICAgICAqIDxjb2RlPmRvSGVhZDwvY29kZT4gbWV0aG9kIHlvdSB3cml0ZSBpcyBib3RoIHNhZmUKKyAgICAgKiBhbmQgaWRlbXBvdGVudCAodGhhdCBpcywgcHJvdGVjdHMgaXRzZWxmIGZyb20gYmVpbmcKKyAgICAgKiBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIG9uZSBIVFRQIEhFQUQgcmVxdWVzdCkuCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgSFRUUCBIRUFEIHJlcXVlc3QgaXMgaW5jb3JyZWN0bHkgZm9ybWF0dGVkLAorICAgICAqIDxjb2RlPmRvSGVhZDwvY29kZT4gcmV0dXJucyBhbiBIVFRQICJCYWQgUmVxdWVzdCIKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxCXRoZSByZXF1ZXN0IG9iamVjdCB0aGF0IGlzIHBhc3NlZAorICAgICAqCQkJdG8gdGhlIHNlcnZsZXQKKyAgICAgKgkJCQorICAgICAqIEBwYXJhbSByZXNwCXRoZSByZXNwb25zZSBvYmplY3QgdGhhdCB0aGUgc2VydmxldAorICAgICAqCQkJdXNlcyB0byByZXR1cm4gdGhlIGhlYWRlcnMgdG8gdGhlIGNsaWVuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCQlpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24JaWYgdGhlIHJlcXVlc3QgZm9yIHRoZSBIRUFECisgICAgICoJCQkJCWNvdWxkIG5vdCBiZSBoYW5kbGVkCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0hlYWQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgIHsKKwlOb0JvZHlSZXNwb25zZSByZXNwb25zZSA9IG5ldyBOb0JvZHlSZXNwb25zZShyZXNwKTsKKwkKKwlkb0dldChyZXEsIHJlc3BvbnNlKTsKKwlyZXNwb25zZS5zZXRDb250ZW50TGVuZ3RoKCk7CisgICAgfQorICAgIAorCisKKworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBDYWxsZWQgYnkgdGhlIHNlcnZlciAodmlhIHRoZSA8Y29kZT5zZXJ2aWNlPC9jb2RlPiBtZXRob2QpCisgICAgICogdG8gYWxsb3cgYSBzZXJ2bGV0IHRvIGhhbmRsZSBhIFBPU1QgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIFRoZSBIVFRQIFBPU1QgbWV0aG9kIGFsbG93cyB0aGUgY2xpZW50IHRvIHNlbmQKKyAgICAgKiBkYXRhIG9mIHVubGltaXRlZCBsZW5ndGggdG8gdGhlIFdlYiBzZXJ2ZXIgYSBzaW5nbGUgdGltZQorICAgICAqIGFuZCBpcyB1c2VmdWwgd2hlbiBwb3N0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMKKyAgICAgKiBjcmVkaXQgY2FyZCBudW1iZXJzLgorICAgICAqCisgICAgICogPHA+V2hlbiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLCByZWFkIHRoZSByZXF1ZXN0IGRhdGEsCisgICAgICogd3JpdGUgdGhlIHJlc3BvbnNlIGhlYWRlcnMsIGdldCB0aGUgcmVzcG9uc2UncyB3cml0ZXIgb3Igb3V0cHV0CisgICAgICogc3RyZWFtIG9iamVjdCwgYW5kIGZpbmFsbHksIHdyaXRlIHRoZSByZXNwb25zZSBkYXRhLiBJdCdzIGJlc3QgCisgICAgICogdG8gaW5jbHVkZSBjb250ZW50IHR5cGUgYW5kIGVuY29kaW5nLiBXaGVuIHVzaW5nIGEKKyAgICAgKiA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4gb2JqZWN0IHRvIHJldHVybiB0aGUgcmVzcG9uc2UsIHNldCB0aGUgCisgICAgICogY29udGVudCB0eXBlIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIDxjb2RlPlByaW50V3JpdGVyPC9jb2RlPiBvYmplY3QuIAorICAgICAqCisgICAgICogPHA+VGhlIHNlcnZsZXQgY29udGFpbmVyIG11c3Qgd3JpdGUgdGhlIGhlYWRlcnMgYmVmb3JlIGNvbW1pdHRpbmcgdGhlCisgICAgICogcmVzcG9uc2UsIGJlY2F1c2UgaW4gSFRUUCB0aGUgaGVhZGVycyBtdXN0IGJlIHNlbnQgYmVmb3JlIHRoZSAKKyAgICAgKiByZXNwb25zZSBib2R5LgorICAgICAqCisgICAgICogPHA+V2hlcmUgcG9zc2libGUsIHNldCB0aGUgQ29udGVudC1MZW5ndGggaGVhZGVyICh3aXRoIHRoZQorICAgICAqIHtAbGluayBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZSNzZXRDb250ZW50TGVuZ3RofSBtZXRob2QpLAorICAgICAqIHRvIGFsbG93IHRoZSBzZXJ2bGV0IGNvbnRhaW5lciB0byB1c2UgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gCisgICAgICogdG8gcmV0dXJuIGl0cyByZXNwb25zZSB0byB0aGUgY2xpZW50LCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UuCisgICAgICogVGhlIGNvbnRlbnQgbGVuZ3RoIGlzIGF1dG9tYXRpY2FsbHkgc2V0IGlmIHRoZSBlbnRpcmUgcmVzcG9uc2UgZml0cworICAgICAqIGluc2lkZSB0aGUgcmVzcG9uc2UgYnVmZmVyLiAgCisgICAgICoKKyAgICAgKiA8cD5XaGVuIHVzaW5nIEhUVFAgMS4xIGNodW5rZWQgZW5jb2RpbmcgKHdoaWNoIG1lYW5zIHRoYXQgdGhlIHJlc3BvbnNlCisgICAgICogaGFzIGEgVHJhbnNmZXItRW5jb2RpbmcgaGVhZGVyKSwgZG8gbm90IHNldCB0aGUgQ29udGVudC1MZW5ndGggaGVhZGVyLiAKKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGRvZXMgbm90IG5lZWQgdG8gYmUgZWl0aGVyIHNhZmUgb3IgaWRlbXBvdGVudC4KKyAgICAgKiBPcGVyYXRpb25zIHJlcXVlc3RlZCB0aHJvdWdoIFBPU1QgY2FuIGhhdmUgc2lkZSBlZmZlY3RzIGZvcgorICAgICAqIHdoaWNoIHRoZSB1c2VyIGNhbiBiZSBoZWxkIGFjY291bnRhYmxlLCBmb3IgZXhhbXBsZSwgCisgICAgICogdXBkYXRpbmcgc3RvcmVkIGRhdGEgb3IgYnV5aW5nIGl0ZW1zIG9ubGluZS4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSBIVFRQIFBPU1QgcmVxdWVzdCBpcyBpbmNvcnJlY3RseSBmb3JtYXR0ZWQsCisgICAgICogPGNvZGU+ZG9Qb3N0PC9jb2RlPiByZXR1cm5zIGFuIEhUVFAgIkJhZCBSZXF1ZXN0IiBtZXNzYWdlLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxCWFuIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3R9IG9iamVjdCB0aGF0CisgICAgICoJCQljb250YWlucyB0aGUgcmVxdWVzdCB0aGUgY2xpZW50IGhhcyBtYWRlCisgICAgICoJCQlvZiB0aGUgc2VydmxldAorICAgICAqCisgICAgICogQHBhcmFtIHJlc3AJYW4ge0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2V9IG9iamVjdCB0aGF0CisgICAgICoJCQljb250YWlucyB0aGUgcmVzcG9uc2UgdGhlIHNlcnZsZXQgc2VuZHMKKyAgICAgKgkJCXRvIHRoZSBjbGllbnQKKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCWlmIGFuIGlucHV0IG9yIG91dHB1dCBlcnJvciBpcyAKKyAgICAgKgkJCQlkZXRlY3RlZCB3aGVuIHRoZSBzZXJ2bGV0IGhhbmRsZXMKKyAgICAgKgkJCQl0aGUgcmVxdWVzdAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uCWlmIHRoZSByZXF1ZXN0IGZvciB0aGUgUE9TVAorICAgICAqCQkJCQljb3VsZCBub3QgYmUgaGFuZGxlZAorICAgICAqCisgICAgICoKKyAgICAgKiBAc2VlIGphdmF4LnNlcnZsZXQuU2VydmxldE91dHB1dFN0cmVhbQorICAgICAqIEBzZWUgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2Ujc2V0Q29udGVudFR5cGUKKyAgICAgKgorICAgICAqCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgIHsKKwlTdHJpbmcgcHJvdG9jb2wgPSByZXEuZ2V0UHJvdG9jb2woKTsKKwlTdHJpbmcgbXNnID0gbFN0cmluZ3MuZ2V0U3RyaW5nKCJodHRwLm1ldGhvZF9wb3N0X25vdF9zdXBwb3J0ZWQiKTsKKwlpZiAocHJvdG9jb2wuZW5kc1dpdGgoIjEuMSIpKSB7CisJICAgIHJlc3Auc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTUVUSE9EX05PVF9BTExPV0VELCBtc2cpOworCX0gZWxzZSB7CisJICAgIHJlc3Auc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1zZyk7CisJfQorICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgc2VydmVyICh2aWEgdGhlIDxjb2RlPnNlcnZpY2U8L2NvZGU+IG1ldGhvZCkKKyAgICAgKiB0byBhbGxvdyBhIHNlcnZsZXQgdG8gaGFuZGxlIGEgUFVUIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBUaGUgUFVUIG9wZXJhdGlvbiBhbGxvd3MgYSBjbGllbnQgdG8gCisgICAgICogcGxhY2UgYSBmaWxlIG9uIHRoZSBzZXJ2ZXIgYW5kIGlzIHNpbWlsYXIgdG8gCisgICAgICogc2VuZGluZyBhIGZpbGUgYnkgRlRQLgorICAgICAqCisgICAgICogPHA+V2hlbiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLCBsZWF2ZSBpbnRhY3QKKyAgICAgKiBhbnkgY29udGVudCBoZWFkZXJzIHNlbnQgd2l0aCB0aGUgcmVxdWVzdCAoaW5jbHVkaW5nCisgICAgICogQ29udGVudC1MZW5ndGgsIENvbnRlbnQtVHlwZSwgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZywKKyAgICAgKiBDb250ZW50LUVuY29kaW5nLCBDb250ZW50LUJhc2UsIENvbnRlbnQtTGFuZ3VhZ2UsIENvbnRlbnQtTG9jYXRpb24sCisgICAgICogQ29udGVudC1NRDUsIGFuZCBDb250ZW50LVJhbmdlKS4gSWYgeW91ciBtZXRob2QgY2Fubm90CisgICAgICogaGFuZGxlIGEgY29udGVudCBoZWFkZXIsIGl0IG11c3QgaXNzdWUgYW4gZXJyb3IgbWVzc2FnZQorICAgICAqIChIVFRQIDUwMSAtIE5vdCBJbXBsZW1lbnRlZCkgYW5kIGRpc2NhcmQgdGhlIHJlcXVlc3QuCisgICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gSFRUUCAxLjEsIHNlZSBSRkMgMjYxNgorICAgICAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzI2MTYudHh0Ij48L2E+LgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgZG9lcyBub3QgbmVlZCB0byBiZSBlaXRoZXIgc2FmZSBvciBpZGVtcG90ZW50LgorICAgICAqIE9wZXJhdGlvbnMgdGhhdCA8Y29kZT5kb1B1dDwvY29kZT4gcGVyZm9ybXMgY2FuIGhhdmUgc2lkZQorICAgICAqIGVmZmVjdHMgZm9yIHdoaWNoIHRoZSB1c2VyIGNhbiBiZSBoZWxkIGFjY291bnRhYmxlLiBXaGVuIHVzaW5nCisgICAgICogdGhpcyBtZXRob2QsIGl0IG1heSBiZSB1c2VmdWwgdG8gc2F2ZSBhIGNvcHkgb2YgdGhlCisgICAgICogYWZmZWN0ZWQgVVJMIGluIHRlbXBvcmFyeSBzdG9yYWdlLgorICAgICAqCisgICAgICogPHA+SWYgdGhlIEhUVFAgUFVUIHJlcXVlc3QgaXMgaW5jb3JyZWN0bHkgZm9ybWF0dGVkLAorICAgICAqIDxjb2RlPmRvUHV0PC9jb2RlPiByZXR1cm5zIGFuIEhUVFAgIkJhZCBSZXF1ZXN0IiBtZXNzYWdlLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxCXRoZSB7QGxpbmsgSHR0cFNlcnZsZXRSZXF1ZXN0fSBvYmplY3QgdGhhdAorICAgICAqCQkJY29udGFpbnMgdGhlIHJlcXVlc3QgdGhlIGNsaWVudCBtYWRlIG9mCisgICAgICoJCQl0aGUgc2VydmxldAorICAgICAqCisgICAgICogQHBhcmFtIHJlc3AJdGhlIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlfSBvYmplY3QgdGhhdAorICAgICAqCQkJY29udGFpbnMgdGhlIHJlc3BvbnNlIHRoZSBzZXJ2bGV0IHJldHVybnMKKyAgICAgKgkJCXRvIHRoZSBjbGllbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24JaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqCQkJCXdoaWxlIHRoZSBzZXJ2bGV0IGlzIGhhbmRsaW5nIHRoZQorICAgICAqCQkJCVBVVCByZXF1ZXN0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24JaWYgdGhlIHJlcXVlc3QgZm9yIHRoZSBQVVQKKyAgICAgKgkJCQkJY2Fubm90IGJlIGhhbmRsZWQKKyAgICAgKgorICAgICAqLworICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb1B1dChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworCVN0cmluZyBwcm90b2NvbCA9IHJlcS5nZXRQcm90b2NvbCgpOworCVN0cmluZyBtc2cgPSBsU3RyaW5ncy5nZXRTdHJpbmcoImh0dHAubWV0aG9kX3B1dF9ub3Rfc3VwcG9ydGVkIik7CisJaWYgKHByb3RvY29sLmVuZHNXaXRoKCIxLjEiKSkgeworCSAgICByZXNwLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX01FVEhPRF9OT1RfQUxMT1dFRCwgbXNnKTsKKwl9IGVsc2UgeworCSAgICByZXNwLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULCBtc2cpOworCX0KKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBDYWxsZWQgYnkgdGhlIHNlcnZlciAodmlhIHRoZSA8Y29kZT5zZXJ2aWNlPC9jb2RlPiBtZXRob2QpCisgICAgICogdG8gYWxsb3cgYSBzZXJ2bGV0IHRvIGhhbmRsZSBhIERFTEVURSByZXF1ZXN0LgorICAgICAqCisgICAgICogVGhlIERFTEVURSBvcGVyYXRpb24gYWxsb3dzIGEgY2xpZW50IHRvIHJlbW92ZSBhIGRvY3VtZW50CisgICAgICogb3IgV2ViIHBhZ2UgZnJvbSB0aGUgc2VydmVyLgorICAgICAqIAorICAgICAqIDxwPlRoaXMgbWV0aG9kIGRvZXMgbm90IG5lZWQgdG8gYmUgZWl0aGVyIHNhZmUKKyAgICAgKiBvciBpZGVtcG90ZW50LiBPcGVyYXRpb25zIHJlcXVlc3RlZCB0aHJvdWdoCisgICAgICogREVMRVRFIGNhbiBoYXZlIHNpZGUgZWZmZWN0cyBmb3Igd2hpY2ggdXNlcnMKKyAgICAgKiBjYW4gYmUgaGVsZCBhY2NvdW50YWJsZS4gV2hlbiB1c2luZworICAgICAqIHRoaXMgbWV0aG9kLCBpdCBtYXkgYmUgdXNlZnVsIHRvIHNhdmUgYSBjb3B5IG9mIHRoZQorICAgICAqIGFmZmVjdGVkIFVSTCBpbiB0ZW1wb3Jhcnkgc3RvcmFnZS4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSBIVFRQIERFTEVURSByZXF1ZXN0IGlzIGluY29ycmVjdGx5IGZvcm1hdHRlZCwKKyAgICAgKiA8Y29kZT5kb0RlbGV0ZTwvY29kZT4gcmV0dXJucyBhbiBIVFRQICJCYWQgUmVxdWVzdCIKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxCXRoZSB7QGxpbmsgSHR0cFNlcnZsZXRSZXF1ZXN0fSBvYmplY3QgdGhhdAorICAgICAqCQkJY29udGFpbnMgdGhlIHJlcXVlc3QgdGhlIGNsaWVudCBtYWRlIG9mCisgICAgICoJCQl0aGUgc2VydmxldAorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcAl0aGUge0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2V9IG9iamVjdCB0aGF0CisgICAgICoJCQljb250YWlucyB0aGUgcmVzcG9uc2UgdGhlIHNlcnZsZXQgcmV0dXJucworICAgICAqCQkJdG8gdGhlIGNsaWVudAkJCQkKKyAgICAgKgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbglpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICoJCQkJd2hpbGUgdGhlIHNlcnZsZXQgaXMgaGFuZGxpbmcgdGhlCisgICAgICoJCQkJREVMRVRFIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbglpZiB0aGUgcmVxdWVzdCBmb3IgdGhlCisgICAgICoJCQkJCURFTEVURSBjYW5ub3QgYmUgaGFuZGxlZAorICAgICAqCisgICAgICovCisgICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGRvRGVsZXRlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCisJCQkgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgIHsKKwlTdHJpbmcgcHJvdG9jb2wgPSByZXEuZ2V0UHJvdG9jb2woKTsKKwlTdHJpbmcgbXNnID0gbFN0cmluZ3MuZ2V0U3RyaW5nKCJodHRwLm1ldGhvZF9kZWxldGVfbm90X3N1cHBvcnRlZCIpOworCWlmIChwcm90b2NvbC5lbmRzV2l0aCgiMS4xIikpIHsKKwkgICAgcmVzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19NRVRIT0RfTk9UX0FMTE9XRUQsIG1zZyk7CisJfSBlbHNlIHsKKwkgICAgcmVzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbXNnKTsKKwl9CisgICAgfQorICAgIAorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kW10gZ2V0QWxsRGVjbGFyZWRNZXRob2RzKENsYXNzIGMpIHsKKworICAgICAgICBpZiAoYy5lcXVhbHMoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0LmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBNZXRob2RbXSBwYXJlbnRNZXRob2RzID0gZ2V0QWxsRGVjbGFyZWRNZXRob2RzKGMuZ2V0U3VwZXJjbGFzcygpKTsKKyAgICAgICAgTWV0aG9kW10gdGhpc01ldGhvZHMgPSBjLmdldERlY2xhcmVkTWV0aG9kcygpOworCQorICAgICAgICBpZiAoKHBhcmVudE1ldGhvZHMgIT0gbnVsbCkgJiYgKHBhcmVudE1ldGhvZHMubGVuZ3RoID4gMCkpIHsKKyAgICAgICAgICAgIE1ldGhvZFtdIGFsbE1ldGhvZHMgPQorICAgICAgICAgICAgICAgIG5ldyBNZXRob2RbcGFyZW50TWV0aG9kcy5sZW5ndGggKyB0aGlzTWV0aG9kcy5sZW5ndGhdOworCSAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcmVudE1ldGhvZHMsIDAsIGFsbE1ldGhvZHMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1ldGhvZHMubGVuZ3RoKTsKKwkgICAgU3lzdGVtLmFycmF5Y29weSh0aGlzTWV0aG9kcywgMCwgYWxsTWV0aG9kcywgcGFyZW50TWV0aG9kcy5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNNZXRob2RzLmxlbmd0aCk7CisKKwkgICAgdGhpc01ldGhvZHMgPSBhbGxNZXRob2RzOworCX0KKworCXJldHVybiB0aGlzTWV0aG9kczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgc2VydmVyICh2aWEgdGhlIDxjb2RlPnNlcnZpY2U8L2NvZGU+IG1ldGhvZCkKKyAgICAgKiB0byBhbGxvdyBhIHNlcnZsZXQgdG8gaGFuZGxlIGEgT1BUSU9OUyByZXF1ZXN0LgorICAgICAqCisgICAgICogVGhlIE9QVElPTlMgcmVxdWVzdCBkZXRlcm1pbmVzIHdoaWNoIEhUVFAgbWV0aG9kcyAKKyAgICAgKiB0aGUgc2VydmVyIHN1cHBvcnRzIGFuZAorICAgICAqIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgaGVhZGVyLiBGb3IgZXhhbXBsZSwgaWYgYSBzZXJ2bGV0CisgICAgICogb3ZlcnJpZGVzIDxjb2RlPmRvR2V0PC9jb2RlPiwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUKKyAgICAgKiBmb2xsb3dpbmcgaGVhZGVyOgorICAgICAqCisgICAgICogPHA+PGNvZGU+QWxsb3c6IEdFVCwgSEVBRCwgVFJBQ0UsIE9QVElPTlM8L2NvZGU+CisgICAgICoKKyAgICAgKiA8cD5UaGVyZSdzIG5vIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdW5sZXNzIHRoZQorICAgICAqIHNlcnZsZXQgaW1wbGVtZW50cyBuZXcgSFRUUCBtZXRob2RzLCBiZXlvbmQgdGhvc2UgCisgICAgICogaW1wbGVtZW50ZWQgYnkgSFRUUCAxLjEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxCXRoZSB7QGxpbmsgSHR0cFNlcnZsZXRSZXF1ZXN0fSBvYmplY3QgdGhhdAorICAgICAqCQkJY29udGFpbnMgdGhlIHJlcXVlc3QgdGhlIGNsaWVudCBtYWRlIG9mCisgICAgICoJCQl0aGUgc2VydmxldAorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcAl0aGUge0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2V9IG9iamVjdCB0aGF0CisgICAgICoJCQljb250YWlucyB0aGUgcmVzcG9uc2UgdGhlIHNlcnZsZXQgcmV0dXJucworICAgICAqCQkJdG8gdGhlIGNsaWVudAkJCQkKKyAgICAgKgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbglpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICoJCQkJd2hpbGUgdGhlIHNlcnZsZXQgaXMgaGFuZGxpbmcgdGhlCisgICAgICoJCQkJT1BUSU9OUyByZXF1ZXN0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24JaWYgdGhlIHJlcXVlc3QgZm9yIHRoZQorICAgICAqCQkJCQlPUFRJT05TIGNhbm5vdCBiZSBoYW5kbGVkCisgICAgICoKKyAgICAgKi8KKyAgICAgICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGRvT3B0aW9ucyhIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworCU1ldGhvZFtdIG1ldGhvZHMgPSBnZXRBbGxEZWNsYXJlZE1ldGhvZHModGhpcy5nZXRDbGFzcygpKTsKKwkKKwlib29sZWFuIEFMTE9XX0dFVCA9IGZhbHNlOworCWJvb2xlYW4gQUxMT1dfSEVBRCA9IGZhbHNlOworCWJvb2xlYW4gQUxMT1dfUE9TVCA9IGZhbHNlOworCWJvb2xlYW4gQUxMT1dfUFVUID0gZmFsc2U7CisJYm9vbGVhbiBBTExPV19ERUxFVEUgPSBmYWxzZTsKKwlib29sZWFuIEFMTE9XX1RSQUNFID0gdHJ1ZTsKKwlib29sZWFuIEFMTE9XX09QVElPTlMgPSB0cnVlOworCQorCWZvciAoaW50IGk9MDsgaTxtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisJICAgIE1ldGhvZCBtID0gbWV0aG9kc1tpXTsKKwkgICAgCisJICAgIGlmIChtLmdldE5hbWUoKS5lcXVhbHMoImRvR2V0IikpIHsKKwkJQUxMT1dfR0VUID0gdHJ1ZTsKKwkJQUxMT1dfSEVBRCA9IHRydWU7CisJICAgIH0KKwkgICAgaWYgKG0uZ2V0TmFtZSgpLmVxdWFscygiZG9Qb3N0IikpIAorCQlBTExPV19QT1NUID0gdHJ1ZTsKKwkgICAgaWYgKG0uZ2V0TmFtZSgpLmVxdWFscygiZG9QdXQiKSkKKwkJQUxMT1dfUFVUID0gdHJ1ZTsKKwkgICAgaWYgKG0uZ2V0TmFtZSgpLmVxdWFscygiZG9EZWxldGUiKSkKKwkJQUxMT1dfREVMRVRFID0gdHJ1ZTsKKwkgICAgCisJfQorCQorCVN0cmluZyBhbGxvdyA9IG51bGw7CisJaWYgKEFMTE9XX0dFVCkKKwkgICAgaWYgKGFsbG93PT1udWxsKSBhbGxvdz1NRVRIT0RfR0VUOworCWlmIChBTExPV19IRUFEKQorCSAgICBpZiAoYWxsb3c9PW51bGwpIGFsbG93PU1FVEhPRF9IRUFEOworCSAgICBlbHNlIGFsbG93ICs9ICIsICIgKyBNRVRIT0RfSEVBRDsKKwlpZiAoQUxMT1dfUE9TVCkKKwkgICAgaWYgKGFsbG93PT1udWxsKSBhbGxvdz1NRVRIT0RfUE9TVDsKKwkgICAgZWxzZSBhbGxvdyArPSAiLCAiICsgTUVUSE9EX1BPU1Q7CisJaWYgKEFMTE9XX1BVVCkKKwkgICAgaWYgKGFsbG93PT1udWxsKSBhbGxvdz1NRVRIT0RfUFVUOworCSAgICBlbHNlIGFsbG93ICs9ICIsICIgKyBNRVRIT0RfUFVUOworCWlmIChBTExPV19ERUxFVEUpCisJICAgIGlmIChhbGxvdz09bnVsbCkgYWxsb3c9TUVUSE9EX0RFTEVURTsKKwkgICAgZWxzZSBhbGxvdyArPSAiLCAiICsgTUVUSE9EX0RFTEVURTsKKwlpZiAoQUxMT1dfVFJBQ0UpCisJICAgIGlmIChhbGxvdz09bnVsbCkgYWxsb3c9TUVUSE9EX1RSQUNFOworCSAgICBlbHNlIGFsbG93ICs9ICIsICIgKyBNRVRIT0RfVFJBQ0U7CisJaWYgKEFMTE9XX09QVElPTlMpCisJICAgIGlmIChhbGxvdz09bnVsbCkgYWxsb3c9TUVUSE9EX09QVElPTlM7CisJICAgIGVsc2UgYWxsb3cgKz0gIiwgIiArIE1FVEhPRF9PUFRJT05TOworCQorCXJlc3Auc2V0SGVhZGVyKCJBbGxvdyIsIGFsbG93KTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgKHZpYSB0aGUgPGNvZGU+c2VydmljZTwvY29kZT4gbWV0aG9kKQorICAgICAqIHRvIGFsbG93IGEgc2VydmxldCB0byBoYW5kbGUgYSBUUkFDRSByZXF1ZXN0LgorICAgICAqCisgICAgICogQSBUUkFDRSByZXR1cm5zIHRoZSBoZWFkZXJzIHNlbnQgd2l0aCB0aGUgVFJBQ0UKKyAgICAgKiByZXF1ZXN0IHRvIHRoZSBjbGllbnQsIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBpbgorICAgICAqIGRlYnVnZ2luZy4gVGhlcmUncyBubyBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiAKKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxCXRoZSB7QGxpbmsgSHR0cFNlcnZsZXRSZXF1ZXN0fSBvYmplY3QgdGhhdAorICAgICAqCQkJY29udGFpbnMgdGhlIHJlcXVlc3QgdGhlIGNsaWVudCBtYWRlIG9mCisgICAgICoJCQl0aGUgc2VydmxldAorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcAl0aGUge0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2V9IG9iamVjdCB0aGF0CisgICAgICoJCQljb250YWlucyB0aGUgcmVzcG9uc2UgdGhlIHNlcnZsZXQgcmV0dXJucworICAgICAqCQkJdG8gdGhlIGNsaWVudAkJCQkKKyAgICAgKgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbglpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICoJCQkJd2hpbGUgdGhlIHNlcnZsZXQgaXMgaGFuZGxpbmcgdGhlCisgICAgICoJCQkJVFJBQ0UgcmVxdWVzdAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uCWlmIHRoZSByZXF1ZXN0IGZvciB0aGUKKyAgICAgKgkJCQkJVFJBQ0UgY2Fubm90IGJlIGhhbmRsZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHJvdGVjdGVkIHZvaWQgZG9UcmFjZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApIAorCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgIHsKKwkKKwlpbnQgcmVzcG9uc2VMZW5ndGg7CisJCisJU3RyaW5nIENSTEYgPSAiXHJcbiI7CisJU3RyaW5nIHJlc3BvbnNlU3RyaW5nID0gIlRSQUNFICIrIHJlcS5nZXRSZXF1ZXN0VVJJKCkrCisJICAgICIgIiArIHJlcS5nZXRQcm90b2NvbCgpOworCQorCUVudW1lcmF0aW9uIHJlcUhlYWRlckVudW0gPSByZXEuZ2V0SGVhZGVyTmFtZXMoKTsKKwkKKwl3aGlsZSggcmVxSGVhZGVyRW51bS5oYXNNb3JlRWxlbWVudHMoKSApIHsKKwkgICAgU3RyaW5nIGhlYWRlck5hbWUgPSAoU3RyaW5nKXJlcUhlYWRlckVudW0ubmV4dEVsZW1lbnQoKTsKKwkgICAgcmVzcG9uc2VTdHJpbmcgKz0gQ1JMRiArIGhlYWRlck5hbWUgKyAiOiAiICsKKwkJcmVxLmdldEhlYWRlcihoZWFkZXJOYW1lKTsgCisJfQorCQorCXJlc3BvbnNlU3RyaW5nICs9IENSTEY7CisJCisJcmVzcG9uc2VMZW5ndGggPSByZXNwb25zZVN0cmluZy5sZW5ndGgoKTsKKwkKKwlyZXNwLnNldENvbnRlbnRUeXBlKCJtZXNzYWdlL2h0dHAiKTsKKwlyZXNwLnNldENvbnRlbnRMZW5ndGgocmVzcG9uc2VMZW5ndGgpOworCVNlcnZsZXRPdXRwdXRTdHJlYW0gb3V0ID0gcmVzcC5nZXRPdXRwdXRTdHJlYW0oKTsKKwlvdXQucHJpbnQocmVzcG9uc2VTdHJpbmcpOwkKKwlvdXQuY2xvc2UoKTsKKwlyZXR1cm47CisgICAgfQkJCisKKworCisKKworICAgIC8qKgorICAgICAqCisgICAgICogUmVjZWl2ZXMgc3RhbmRhcmQgSFRUUCByZXF1ZXN0cyBmcm9tIHRoZSBwdWJsaWMKKyAgICAgKiA8Y29kZT5zZXJ2aWNlPC9jb2RlPiBtZXRob2QgYW5kIGRpc3BhdGNoZXMKKyAgICAgKiB0aGVtIHRvIHRoZSA8Y29kZT5kbzwvY29kZT48aT5YWFg8L2k+IG1ldGhvZHMgZGVmaW5lZCBpbiAKKyAgICAgKiB0aGlzIGNsYXNzLiBUaGlzIG1ldGhvZCBpcyBhbiBIVFRQLXNwZWNpZmljIHZlcnNpb24gb2YgdGhlIAorICAgICAqIHtAbGluayBqYXZheC5zZXJ2bGV0LlNlcnZsZXQjc2VydmljZX0gbWV0aG9kLiBUaGVyZSdzIG5vCisgICAgICogbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxCXRoZSB7QGxpbmsgSHR0cFNlcnZsZXRSZXF1ZXN0fSBvYmplY3QgdGhhdAorICAgICAqCQkJY29udGFpbnMgdGhlIHJlcXVlc3QgdGhlIGNsaWVudCBtYWRlIG9mCisgICAgICoJCQl0aGUgc2VydmxldAorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcAl0aGUge0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2V9IG9iamVjdCB0aGF0CisgICAgICoJCQljb250YWlucyB0aGUgcmVzcG9uc2UgdGhlIHNlcnZsZXQgcmV0dXJucworICAgICAqCQkJdG8gdGhlIGNsaWVudAkJCQkKKyAgICAgKgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbglpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICoJCQkJd2hpbGUgdGhlIHNlcnZsZXQgaXMgaGFuZGxpbmcgdGhlCisgICAgICoJCQkJSFRUUCByZXF1ZXN0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24JaWYgdGhlIEhUVFAgcmVxdWVzdAorICAgICAqCQkJCQljYW5ub3QgYmUgaGFuZGxlZAorICAgICAqIAorICAgICAqIEBzZWUgCQkJCWphdmF4LnNlcnZsZXQuU2VydmxldCNzZXJ2aWNlCisgICAgICoKKyAgICAgKi8KKworICAgIHByb3RlY3RlZCB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgIHsKKwlTdHJpbmcgbWV0aG9kID0gcmVxLmdldE1ldGhvZCgpOworCisJaWYgKG1ldGhvZC5lcXVhbHMoTUVUSE9EX0dFVCkpIHsKKwkgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBnZXRMYXN0TW9kaWZpZWQocmVxKTsKKwkgICAgaWYgKGxhc3RNb2RpZmllZCA9PSAtMSkgeworCQkvLyBzZXJ2bGV0IGRvZXNuJ3Qgc3VwcG9ydCBpZi1tb2RpZmllZC1zaW5jZSwgbm8gcmVhc29uCisJCS8vIHRvIGdvIHRocm91Z2ggZnVydGhlciBleHBlbnNpdmUgbG9naWMKKwkJZG9HZXQocmVxLCByZXNwKTsKKwkgICAgfSBlbHNlIHsKKwkJbG9uZyBpZk1vZGlmaWVkU2luY2UgPSByZXEuZ2V0RGF0ZUhlYWRlcihIRUFERVJfSUZNT0RTSU5DRSk7CisJCWlmIChpZk1vZGlmaWVkU2luY2UgPCAobGFzdE1vZGlmaWVkIC8gMTAwMCAqIDEwMDApKSB7CisJCSAgICAvLyBJZiB0aGUgc2VydmxldCBtb2QgdGltZSBpcyBsYXRlciwgY2FsbCBkb0dldCgpCisgICAgICAgICAgICAgICAgICAgIC8vIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3Qgc2Vjb25kIGZvciBhIHByb3BlciBjb21wYXJlCisgICAgICAgICAgICAgICAgICAgIC8vIEEgaWZNb2RpZmllZFNpbmNlIG9mIC0xIHdpbGwgYWx3YXlzIGJlIGxlc3MKKwkJICAgIG1heWJlU2V0TGFzdE1vZGlmaWVkKHJlc3AsIGxhc3RNb2RpZmllZCk7CisJCSAgICBkb0dldChyZXEsIHJlc3ApOworCQl9IGVsc2UgeworCQkgICAgcmVzcC5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfTU9ESUZJRUQpOworCQl9CisJICAgIH0KKworCX0gZWxzZSBpZiAobWV0aG9kLmVxdWFscyhNRVRIT0RfSEVBRCkpIHsKKwkgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBnZXRMYXN0TW9kaWZpZWQocmVxKTsKKwkgICAgbWF5YmVTZXRMYXN0TW9kaWZpZWQocmVzcCwgbGFzdE1vZGlmaWVkKTsKKwkgICAgZG9IZWFkKHJlcSwgcmVzcCk7CisKKwl9IGVsc2UgaWYgKG1ldGhvZC5lcXVhbHMoTUVUSE9EX1BPU1QpKSB7CisJICAgIGRvUG9zdChyZXEsIHJlc3ApOworCSAgICAKKwl9IGVsc2UgaWYgKG1ldGhvZC5lcXVhbHMoTUVUSE9EX1BVVCkpIHsKKwkgICAgZG9QdXQocmVxLCByZXNwKTsJCisJICAgIAorCX0gZWxzZSBpZiAobWV0aG9kLmVxdWFscyhNRVRIT0RfREVMRVRFKSkgeworCSAgICBkb0RlbGV0ZShyZXEsIHJlc3ApOworCSAgICAKKwl9IGVsc2UgaWYgKG1ldGhvZC5lcXVhbHMoTUVUSE9EX09QVElPTlMpKSB7CisJICAgIGRvT3B0aW9ucyhyZXEscmVzcCk7CisJICAgIAorCX0gZWxzZSBpZiAobWV0aG9kLmVxdWFscyhNRVRIT0RfVFJBQ0UpKSB7CisJICAgIGRvVHJhY2UocmVxLHJlc3ApOworCSAgICAKKwl9IGVsc2UgeworCSAgICAvLworCSAgICAvLyBOb3RlIHRoYXQgdGhpcyBtZWFucyBOTyBzZXJ2bGV0IHN1cHBvcnRzIHdoYXRldmVyCisJICAgIC8vIG1ldGhvZCB3YXMgcmVxdWVzdGVkLCBhbnl3aGVyZSBvbiB0aGlzIHNlcnZlci4KKwkgICAgLy8KKworCSAgICBTdHJpbmcgZXJyTXNnID0gbFN0cmluZ3MuZ2V0U3RyaW5nKCJodHRwLm1ldGhvZF9ub3RfaW1wbGVtZW50ZWQiKTsKKwkgICAgT2JqZWN0W10gZXJyQXJncyA9IG5ldyBPYmplY3RbMV07CisJICAgIGVyckFyZ3NbMF0gPSBtZXRob2Q7CisJICAgIGVyck1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGVyck1zZywgZXJyQXJncyk7CisJICAgIAorCSAgICByZXNwLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9JTVBMRU1FTlRFRCwgZXJyTXNnKTsKKwl9CisgICAgfQorICAgIAorCisKKworCisgICAgLyoKKyAgICAgKiBTZXRzIHRoZSBMYXN0LU1vZGlmaWVkIGVudGl0eSBoZWFkZXIgZmllbGQsIGlmIGl0IGhhcyBub3QKKyAgICAgKiBhbHJlYWR5IGJlZW4gc2V0IGFuZCBpZiB0aGUgdmFsdWUgaXMgbWVhbmluZ2Z1bC4gIENhbGxlZCBiZWZvcmUKKyAgICAgKiBkb0dldCwgdG8gZW5zdXJlIHRoYXQgaGVhZGVycyBhcmUgc2V0IGJlZm9yZSByZXNwb25zZSBkYXRhIGlzCisgICAgICogd3JpdHRlbi4gIEEgc3ViY2xhc3MgbWlnaHQgaGF2ZSBzZXQgdGhpcyBoZWFkZXIgYWxyZWFkeSwgc28gd2UKKyAgICAgKiBjaGVjay4KKyAgICAgKi8KKworICAgIHByaXZhdGUgdm9pZCBtYXliZVNldExhc3RNb2RpZmllZChIdHRwU2VydmxldFJlc3BvbnNlIHJlc3AsCisJCQkJICAgICAgbG9uZyBsYXN0TW9kaWZpZWQpIHsKKwlpZiAocmVzcC5jb250YWluc0hlYWRlcihIRUFERVJfTEFTVE1PRCkpCisJICAgIHJldHVybjsKKwlpZiAobGFzdE1vZGlmaWVkID49IDApCisJICAgIHJlc3Auc2V0RGF0ZUhlYWRlcihIRUFERVJfTEFTVE1PRCwgbGFzdE1vZGlmaWVkKTsKKyAgICB9CisgICAKKyAgIAorICAgCisgICAgCisgICAgLyoqCisgICAgICoKKyAgICAgKiBEaXNwYXRjaGVzIGNsaWVudCByZXF1ZXN0cyB0byB0aGUgcHJvdGVjdGVkCisgICAgICogPGNvZGU+c2VydmljZTwvY29kZT4gbWV0aG9kLiBUaGVyZSdzIG5vIG5lZWQgdG8KKyAgICAgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIAorICAgICAqIEBwYXJhbSByZXEJdGhlIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3R9IG9iamVjdCB0aGF0CisgICAgICoJCQljb250YWlucyB0aGUgcmVxdWVzdCB0aGUgY2xpZW50IG1hZGUgb2YKKyAgICAgKgkJCXRoZSBzZXJ2bGV0CisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXMJdGhlIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlfSBvYmplY3QgdGhhdAorICAgICAqCQkJY29udGFpbnMgdGhlIHJlc3BvbnNlIHRoZSBzZXJ2bGV0IHJldHVybnMKKyAgICAgKgkJCXRvIHRoZSBjbGllbnQJCQkJCisgICAgICoKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24JaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqCQkJCXdoaWxlIHRoZSBzZXJ2bGV0IGlzIGhhbmRsaW5nIHRoZQorICAgICAqCQkJCUhUVFAgcmVxdWVzdAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uCWlmIHRoZSBIVFRQIHJlcXVlc3QgY2Fubm90CisgICAgICoJCQkJCWJlIGhhbmRsZWQKKyAgICAgKgorICAgICAqIAorICAgICAqIEBzZWUgamF2YXguc2VydmxldC5TZXJ2bGV0I3NlcnZpY2UKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2bGV0UmVxdWVzdCByZXEsIFNlcnZsZXRSZXNwb25zZSByZXMpCisJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworCUh0dHBTZXJ2bGV0UmVxdWVzdAlyZXF1ZXN0OworCUh0dHBTZXJ2bGV0UmVzcG9uc2UJcmVzcG9uc2U7CisJCisJdHJ5IHsKKwkgICAgcmVxdWVzdCA9IChIdHRwU2VydmxldFJlcXVlc3QpIHJlcTsKKwkgICAgcmVzcG9uc2UgPSAoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzOworCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisJICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJub24tSFRUUCByZXF1ZXN0IG9yIHJlc3BvbnNlIik7CisJfQorCXNlcnZpY2UocmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0KK30KKworCisKKworLyoKKyAqIEEgcmVzcG9uc2UgdGhhdCBpbmNsdWRlcyBubyBib2R5LCBmb3IgdXNlIGluIChkdW1iKSAiSEVBRCIgc3VwcG9ydC4KKyAqIFRoaXMganVzdCBzd2FsbG93cyB0aGF0IGJvZHksIGNvdW50aW5nIHRoZSBieXRlcyBpbiBvcmRlciB0byBzZXQKKyAqIHRoZSBjb250ZW50IGxlbmd0aCBhcHByb3ByaWF0ZWx5LiAgQWxsIG90aGVyIG1ldGhvZHMgZGVsZWdhdGUgZGlyZWN0bHkKKyAqIHRvIHRoZSBIVFRQIFNlcnZsZXQgUmVzcG9uc2Ugb2JqZWN0IHVzZWQgdG8gY29uc3RydWN0IHRoaXMgb25lLgorICovCisvLyBmaWxlIHByaXZhdGUKK2NsYXNzIE5vQm9keVJlc3BvbnNlIGltcGxlbWVudHMgSHR0cFNlcnZsZXRSZXNwb25zZSB7CisgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlc3BvbnNlCQlyZXNwOworICAgIHByaXZhdGUgTm9Cb2R5T3V0cHV0U3RyZWFtCQlub0JvZHk7CisgICAgcHJpdmF0ZSBQcmludFdyaXRlcgkJCXdyaXRlcjsKKyAgICBwcml2YXRlIGJvb2xlYW4JCQlkaWRTZXRDb250ZW50TGVuZ3RoOworCisgICAgLy8gZmlsZSBwcml2YXRlCisgICAgTm9Cb2R5UmVzcG9uc2UoSHR0cFNlcnZsZXRSZXNwb25zZSByKSB7CisJcmVzcCA9IHI7CisJbm9Cb2R5ID0gbmV3IE5vQm9keU91dHB1dFN0cmVhbSgpOworICAgIH0KKworICAgIC8vIGZpbGUgcHJpdmF0ZQorICAgIHZvaWQgc2V0Q29udGVudExlbmd0aCgpIHsKKwlpZiAoIWRpZFNldENvbnRlbnRMZW5ndGgpCisJICByZXNwLnNldENvbnRlbnRMZW5ndGgobm9Cb2R5LmdldENvbnRlbnRMZW5ndGgoKSk7CisgICAgfQorCisKKyAgICAvLyBTRVJWTEVUIFJFU1BPTlNFIGludGVyZmFjZSBtZXRob2RzCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TGVuZ3RoKGludCBsZW4pIHsKKwlyZXNwLnNldENvbnRlbnRMZW5ndGgobGVuKTsKKwlkaWRTZXRDb250ZW50TGVuZ3RoID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgY2hhcnNldCkKKyAgICAgIHsgcmVzcC5zZXRDaGFyYWN0ZXJFbmNvZGluZyhjaGFyc2V0KTsgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIHR5cGUpCisgICAgICB7IHJlc3Auc2V0Q29udGVudFR5cGUodHlwZSk7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKQorICAgICAgeyByZXR1cm4gcmVzcC5nZXRDb250ZW50VHlwZSgpOyB9CisKKyAgICBwdWJsaWMgU2VydmxldE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgIHsgcmV0dXJuIG5vQm9keTsgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpCisJeyByZXR1cm4gcmVzcC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpOyB9CisKKyAgICBwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgICB7CisJaWYgKHdyaXRlciA9PSBudWxsKSB7CisJICAgIE91dHB1dFN0cmVhbVdyaXRlcgl3OworCisJICAgIHcgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5vQm9keSwgZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSk7CisJICAgIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcih3KTsKKwl9CisJcmV0dXJuIHdyaXRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCdWZmZXJTaXplKGludCBzaXplKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICB7IHJlc3Auc2V0QnVmZmVyU2l6ZShzaXplKTsgfQorCisgICAgcHVibGljIGludCBnZXRCdWZmZXJTaXplKCkKKyAgICAgIHsgcmV0dXJuIHJlc3AuZ2V0QnVmZmVyU2l6ZSgpOyB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgIHsgcmVzcC5yZXNldCgpOyB9CisgICAgICAKKyAgICAgIHB1YmxpYyB2b2lkIHJlc2V0QnVmZmVyKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgeyByZXNwLnJlc2V0QnVmZmVyKCk7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWl0dGVkKCkKKyAgICAgIHsgcmV0dXJuIHJlc3AuaXNDb21taXR0ZWQoKTsgfQorCisgICAgcHVibGljIHZvaWQgZmx1c2hCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgIHsgcmVzcC5mbHVzaEJ1ZmZlcigpOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvYykKKyAgICAgIHsgcmVzcC5zZXRMb2NhbGUobG9jKTsgfQorCisgICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKQorICAgICAgeyByZXR1cm4gcmVzcC5nZXRMb2NhbGUoKTsgfQorCisKKyAgICAvLyBIVFRQIFNFUlZMRVQgUkVTUE9OU0UgaW50ZXJmYWNlIG1ldGhvZHMKKworICAgIHB1YmxpYyB2b2lkIGFkZENvb2tpZShDb29raWUgY29va2llKQorICAgICAgeyByZXNwLmFkZENvb2tpZShjb29raWUpOyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0hlYWRlcihTdHJpbmcgbmFtZSkKKyAgICAgIHsgcmV0dXJuIHJlc3AuY29udGFpbnNIZWFkZXIobmFtZSk7IH0KKworICAgIC8qKiBAZGVwcmVjYXRlZCAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc2MsIFN0cmluZyBzbSkKKyAgICAgIHsgcmVzcC5zZXRTdGF0dXMoc2MsIHNtKTsgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzYykKKyAgICAgIHsgcmVzcC5zZXRTdGF0dXMoc2MpOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKKyAgICAgIHsgcmVzcC5zZXRIZWFkZXIobmFtZSwgdmFsdWUpOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRIZWFkZXIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkKKyAgICAgIHsgcmVzcC5zZXRJbnRIZWFkZXIobmFtZSwgdmFsdWUpOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlSGVhZGVyKFN0cmluZyBuYW1lLCBsb25nIGRhdGUpCisgICAgICB7IHJlc3Auc2V0RGF0ZUhlYWRlcihuYW1lLCBkYXRlKTsgfQorCisgICAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBzYywgU3RyaW5nIG1zZykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICB7IHJlc3Auc2VuZEVycm9yKHNjLCBtc2cpOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHNjKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgIHsgcmVzcC5zZW5kRXJyb3Ioc2MpOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZW5kUmVkaXJlY3QoU3RyaW5nIGxvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgIHsgcmVzcC5zZW5kUmVkaXJlY3QobG9jYXRpb24pOyB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVVUkwoU3RyaW5nIHVybCkgCisgICAgICB7IHJldHVybiByZXNwLmVuY29kZVVSTCh1cmwpOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VVJMKFN0cmluZyB1cmwpCisgICAgICB7IHJldHVybiByZXNwLmVuY29kZVJlZGlyZWN0VVJMKHVybCk7IH0KKyAgICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQorICAgICAgeyByZXNwLmFkZEhlYWRlcihuYW1lLCB2YWx1ZSk7IH0KKyAgICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZERhdGVIZWFkZXIoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpCisgICAgICB7IHJlc3AuYWRkRGF0ZUhlYWRlcihuYW1lLCB2YWx1ZSk7IH0KKyAgICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKQorICAgICAgeyByZXNwLmFkZEludEhlYWRlcihuYW1lLCB2YWx1ZSk7IH0KKyAgICAgIAorICAgICAgCisgICAgICAKKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCUFzIG9mIFZlcnNpb24gMi4xLCByZXBsYWNlZCBieQorICAgICAqIAkJCXtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlI2VuY29kZVVSTH0uCisgICAgICoKKyAgICAgKi8KKyAgICAgCisgICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlVXJsKFN0cmluZyB1cmwpIAorICAgICAgeyByZXR1cm4gdGhpcy5lbmNvZGVVUkwodXJsKTsgfQorICAgICAgCisgICAgICAKKyAgICAgIAorICAgICAgCisgICAgICAKKyAgICAgIAorICAgICAgCisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZAlBcyBvZiBWZXJzaW9uIDIuMSwgcmVwbGFjZWQgYnkKKyAgICAgKgkJCXtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlI2VuY29kZVJlZGlyZWN0VVJMfS4KKyAgICAgKgorICAgICAqLworICAgICAKKyAgICAgCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVSZWRpcmVjdFVybChTdHJpbmcgdXJsKQorICAgICAgeyByZXR1cm4gdGhpcy5lbmNvZGVSZWRpcmVjdFVSTCh1cmwpOyB9CisKK30KKworCisKKworCisKKworLyoKKyAqIFNlcnZsZXQgb3V0cHV0IHN0cmVhbSB0aGF0IGdvYmJsZXMgdXAgYWxsIGl0cyBkYXRhLgorICovCisgCisvLyBmaWxlIHByaXZhdGUKK2NsYXNzIE5vQm9keU91dHB1dFN0cmVhbSBleHRlbmRzIFNlcnZsZXRPdXRwdXRTdHJlYW0geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExTVFJJTkdfRklMRSA9CisJImphdmF4LnNlcnZsZXQuaHR0cC5Mb2NhbFN0cmluZ3MiOworICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGxTdHJpbmdzID0KKwlSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoTFNUUklOR19GSUxFKTsKKworICAgIHByaXZhdGUgaW50CQljb250ZW50TGVuZ3RoID0gMDsKKworICAgIC8vIGZpbGUgcHJpdmF0ZQorICAgIE5vQm9keU91dHB1dFN0cmVhbSgpIHt9CisKKyAgICAvLyBmaWxlIHByaXZhdGUKKyAgICBpbnQgZ2V0Q29udGVudExlbmd0aCgpIHsKKwlyZXR1cm4gY29udGVudExlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgeworCWNvbnRlbnRMZW5ndGgrKzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJ1ZltdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQorCXRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKwlpZiAobGVuID49IDApIHsKKwkgICAgY29udGVudExlbmd0aCArPSBsZW47CisJfSBlbHNlIHsKKwkgICAgLy8gWFhYCisJICAgIC8vIGlzbid0IHRoaXMgcmVhbGx5IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbj8KKwkgICAgCisJICAgIFN0cmluZyBtc2cgPSBsU3RyaW5ncy5nZXRTdHJpbmcoImVyci5pby5uZWdhdGl2ZWxlbmd0aCIpOworCSAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIm5lZ2F0aXZlIGxlbmd0aCIpOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGI1ZDRmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDY2MSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXguc2VydmxldC5odHRwOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKKy8qKgorICoKKyAqIEV4dGVuZHMgdGhlIHtAbGluayBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0fSBpbnRlcmZhY2UKKyAqIHRvIHByb3ZpZGUgcmVxdWVzdCBpbmZvcm1hdGlvbiBmb3IgSFRUUCBzZXJ2bGV0cy4gCisgKgorICogPHA+VGhlIHNlcnZsZXQgY29udGFpbmVyIGNyZWF0ZXMgYW4gPGNvZGU+SHR0cFNlcnZsZXRSZXF1ZXN0PC9jb2RlPiAKKyAqIG9iamVjdCBhbmQgcGFzc2VzIGl0IGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBzZXJ2bGV0J3Mgc2VydmljZQorICogbWV0aG9kcyAoPGNvZGU+ZG9HZXQ8L2NvZGU+LCA8Y29kZT5kb1Bvc3Q8L2NvZGU+LCBldGMpLgorICoKKyAqCisgKiBAYXV0aG9yIAlWYXJpb3VzCisgKiBAdmVyc2lvbgkkVmVyc2lvbiQKKyAqCisgKgorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgSHR0cFNlcnZsZXRSZXF1ZXN0IGV4dGVuZHMgU2VydmxldFJlcXVlc3QgeworCisgICAgLyoqCisgICAgKiBTdHJpbmcgaWRlbnRpZmllciBmb3IgQmFzaWMgYXV0aGVudGljYXRpb24uIFZhbHVlICJCQVNJQyIKKyAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0lDX0FVVEggPSAiQkFTSUMiOworICAgIC8qKgorICAgICogU3RyaW5nIGlkZW50aWZpZXIgZm9yIEZvcm0gYXV0aGVudGljYXRpb24uIFZhbHVlICJGT1JNIgorICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9BVVRIID0gIkZPUk0iOworICAgIC8qKgorICAgICogU3RyaW5nIGlkZW50aWZpZXIgZm9yIENsaWVudCBDZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbi4gVmFsdWUgIkNMSUVOVF9DRVJUIgorICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0NFUlRfQVVUSCA9ICJDTElFTlRfQ0VSVCI7CisgICAgLyoqCisgICAgKiBTdHJpbmcgaWRlbnRpZmllciBmb3IgRGlnZXN0IGF1dGhlbnRpY2F0aW9uLiBWYWx1ZSAiRElHRVNUIgorICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElHRVNUX0FVVEggPSAiRElHRVNUIjsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSB1c2VkIHRvIHByb3RlY3QKKyAgICAgKiB0aGUgc2VydmxldC4gQWxsIHNlcnZsZXQgY29udGFpbmVycyBzdXBwb3J0IGJhc2ljLCBmb3JtIGFuZCBjbGllbnQgCisgICAgICogY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24sIGFuZCBtYXkgYWRkaXRpb25hbGx5IHN1cHBvcnQgZGlnZXN0IAorICAgICAqIGF1dGhlbnRpY2F0aW9uLgorICAgICAqIElmIHRoZSBzZXJ2bGV0IGlzIG5vdCBhdXRoZW50aWNhdGVkIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLiAKKyAgICAgKgorICAgICAqIDxwPlNhbWUgYXMgdGhlIHZhbHVlIG9mIHRoZSBDR0kgdmFyaWFibGUgQVVUSF9UWVBFLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlvbmUgb2YgdGhlIHN0YXRpYyBtZW1iZXJzIEJBU0lDX0FVVEgsIAorICAgICAqCQkJRk9STV9BVVRILCBDTElFTlRfQ0VSVF9BVVRILCBESUdFU1RfQVVUSAorICAgICAqCQkJKHN1aXRhYmxlIGZvciA9PSBjb21wYXJpc29uKSBvcgorICAgICAqCQkJdGhlIGNvbnRhaW5lci1zcGVjaWZpYyBzdHJpbmcgaW5kaWNhdGluZworICAgICAqCQkJdGhlIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSwgb3IKKyAgICAgKgkJCTxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXF1ZXN0IHdhcyAKKyAgICAgKgkJCW5vdCBhdXRoZW50aWNhdGVkLiAgICAgCisgICAgICoKKyAgICAgKi8KKyAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aFR5cGUoKTsKKyAgICAKKyAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSA8Y29kZT5Db29raWU8L2NvZGU+CisgICAgICogb2JqZWN0cyB0aGUgY2xpZW50IHNlbnQgd2l0aCB0aGlzIHJlcXVlc3QuCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBjb29raWVzIHdlcmUgc2VudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCWFuIGFycmF5IG9mIGFsbCB0aGUgPGNvZGU+Q29va2llczwvY29kZT4KKyAgICAgKgkJCWluY2x1ZGVkIHdpdGggdGhpcyByZXF1ZXN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqCQkJaWYgdGhlIHJlcXVlc3QgaGFzIG5vIGNvb2tpZXMKKyAgICAgKgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgQ29va2llW10gZ2V0Q29va2llcygpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgaGVhZGVyCisgICAgICogYXMgYSA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgYSAKKyAgICAgKiA8Y29kZT5EYXRlPC9jb2RlPiBvYmplY3QuIFVzZSB0aGlzIG1ldGhvZCB3aXRoCisgICAgICogaGVhZGVycyB0aGF0IGNvbnRhaW4gZGF0ZXMsIHN1Y2ggYXMKKyAgICAgKiA8Y29kZT5JZi1Nb2RpZmllZC1TaW5jZTwvY29kZT4uIAorICAgICAqCisgICAgICogPHA+VGhlIGRhdGUgaXMgcmV0dXJuZWQgYXMKKyAgICAgKiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzAgR01ULgorICAgICAqIFRoZSBoZWFkZXIgbmFtZSBpcyBjYXNlIGluc2Vuc2l0aXZlLgorICAgICAqCisgICAgICogPHA+SWYgdGhlIHJlcXVlc3QgZGlkIG5vdCBoYXZlIGEgaGVhZGVyIG9mIHRoZQorICAgICAqIHNwZWNpZmllZCBuYW1lLCB0aGlzIG1ldGhvZCByZXR1cm5zIC0xLiBJZiB0aGUgaGVhZGVyCisgICAgICogY2FuJ3QgYmUgY29udmVydGVkIHRvIGEgZGF0ZSwgdGhlIG1ldGhvZCB0aHJvd3MKKyAgICAgKiBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZQorICAgICAqCQkJCW5hbWUgb2YgdGhlIGhlYWRlcgorICAgICAqCisgICAgICogQHJldHVybgkJCWEgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUKKyAgICAgKgkJCQlyZXByZXNlbnRpbmcgdGhlIGRhdGUgc3BlY2lmaWVkCisgICAgICoJCQkJaW4gdGhlIGhlYWRlciBleHByZXNzZWQgYXMKKyAgICAgKgkJCQl0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcworICAgICAqCQkJCXNpbmNlIEphbnVhcnkgMSwgMTk3MCBHTVQsCisgICAgICoJCQkJb3IgLTEgaWYgdGhlIG5hbWVkIGhlYWRlcgorICAgICAqCQkJCXdhcyBub3QgaW5jbHVkZWQgd2l0aCB0aGUKKyAgICAgKgkJCQlyZXF1ZXN0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uCUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbglJZiB0aGUgaGVhZGVyIHZhbHVlCisgICAgICoJCQkJCQkJY2FuJ3QgYmUgY29udmVydGVkCisgICAgICoJCQkJCQkJdG8gYSBkYXRlCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBsb25nIGdldERhdGVIZWFkZXIoU3RyaW5nIG5hbWUpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgaGVhZGVyCisgICAgICogYXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+LiBJZiB0aGUgcmVxdWVzdCBkaWQgbm90IGluY2x1ZGUgYSBoZWFkZXIKKyAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIG5hbWUsIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIGhlYWRlcnMgd2l0aCB0aGUgc2FtZSBuYW1lLCB0aGlzIG1ldGhvZAorICAgICAqIHJldHVybnMgdGhlIGZpcnN0IGhlYWQgaW4gdGhlIHJlcXVlc3QuCisgICAgICogVGhlIGhlYWRlciBuYW1lIGlzIGNhc2UgaW5zZW5zaXRpdmUuIFlvdSBjYW4gdXNlCisgICAgICogdGhpcyBtZXRob2Qgd2l0aCBhbnkgcmVxdWVzdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlCisgICAgICoJCQkJaGVhZGVyIG5hbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4JCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUKKyAgICAgKgkJCQl2YWx1ZSBvZiB0aGUgcmVxdWVzdGVkCisgICAgICoJCQkJaGVhZGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqCQkJCWlmIHRoZSByZXF1ZXN0IGRvZXMgbm90CisgICAgICoJCQkJaGF2ZSBhIGhlYWRlciBvZiB0aGF0IG5hbWUKKyAgICAgKgorICAgICAqLwkJCQorCisgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXIoU3RyaW5nIG5hbWUpOyAKKworCisKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyBhbGwgdGhlIHZhbHVlcyBvZiB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgaGVhZGVyCisgICAgICogYXMgYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0cy4KKyAgICAgKgorICAgICAqIDxwPlNvbWUgaGVhZGVycywgc3VjaCBhcyA8Y29kZT5BY2NlcHQtTGFuZ3VhZ2U8L2NvZGU+IGNhbiBiZSBzZW50CisgICAgICogYnkgY2xpZW50cyBhcyBzZXZlcmFsIGhlYWRlcnMgZWFjaCB3aXRoIGEgZGlmZmVyZW50IHZhbHVlIHJhdGhlciB0aGFuCisgICAgICogc2VuZGluZyB0aGUgaGVhZGVyIGFzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QuCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgcmVxdWVzdCBkaWQgbm90IGluY2x1ZGUgYW55IGhlYWRlcnMKKyAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIG5hbWUsIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkKKyAgICAgKiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4uCisgICAgICogVGhlIGhlYWRlciBuYW1lIGlzIGNhc2UgaW5zZW5zaXRpdmUuIFlvdSBjYW4gdXNlCisgICAgICogdGhpcyBtZXRob2Qgd2l0aCBhbnkgcmVxdWVzdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlCisgICAgICoJCQkJaGVhZGVyIG5hbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4JCQlhbiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gY29udGFpbmluZworICAgICAqICAgICAgICAgICAgICAgICAgCXRoZSB2YWx1ZXMgb2YgdGhlIHJlcXVlc3RlZCBoZWFkZXIuIElmCisgICAgICogICAgICAgICAgICAgICAgICAJdGhlIHJlcXVlc3QgZG9lcyBub3QgaGF2ZSBhbnkgaGVhZGVycyBvZgorICAgICAqICAgICAgICAgICAgICAgICAgCXRoYXQgbmFtZSByZXR1cm4gYW4gZW1wdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgIAllbnVtZXJhdGlvbi4gSWYgCisgICAgICogICAgICAgICAgICAgICAgICAJdGhlIGNvbnRhaW5lciBkb2VzIG5vdCBhbGxvdyBhY2Nlc3MgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgIAloZWFkZXIgaW5mb3JtYXRpb24sIHJldHVybiBudWxsCisgICAgICoKKyAgICAgKi8JCQkKKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRIZWFkZXJzKFN0cmluZyBuYW1lKTsgCisgICAgCisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIHRoZSBoZWFkZXIgbmFtZXMKKyAgICAgKiB0aGlzIHJlcXVlc3QgY29udGFpbnMuIElmIHRoZSByZXF1ZXN0IGhhcyBubworICAgICAqIGhlYWRlcnMsIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgZW51bWVyYXRpb24uCisgICAgICoKKyAgICAgKiA8cD5Tb21lIHNlcnZsZXQgY29udGFpbmVycyBkbyBub3QgYWxsb3cKKyAgICAgKiBzZXJ2bGV0cyB0byBhY2Nlc3MgaGVhZGVycyB1c2luZyB0aGlzIG1ldGhvZCwgaW4KKyAgICAgKiB3aGljaCBjYXNlIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCQlhbiBlbnVtZXJhdGlvbiBvZiBhbGwgdGhlCisgICAgICoJCQkJaGVhZGVyIG5hbWVzIHNlbnQgd2l0aCB0aGlzCisgICAgICoJCQkJcmVxdWVzdDsgaWYgdGhlIHJlcXVlc3QgaGFzCisgICAgICoJCQkJbm8gaGVhZGVycywgYW4gZW1wdHkgZW51bWVyYXRpb247CisgICAgICoJCQkJaWYgdGhlIHNlcnZsZXQgY29udGFpbmVyIGRvZXMgbm90CisgICAgICoJCQkJYWxsb3cgc2VydmxldHMgdG8gdXNlIHRoaXMgbWV0aG9kLAorICAgICAqCQkJCTxjb2RlPm51bGw8L2NvZGU+CisgICAgICoJCQkJCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRIZWFkZXJOYW1lcygpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgaGVhZGVyCisgICAgICogYXMgYW4gPGNvZGU+aW50PC9jb2RlPi4gSWYgdGhlIHJlcXVlc3QgZG9lcyBub3QgaGF2ZSBhIGhlYWRlcgorICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgbmFtZSwgdGhpcyBtZXRob2QgcmV0dXJucyAtMS4gSWYgdGhlCisgICAgICogaGVhZGVyIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlciwgdGhpcyBtZXRob2QKKyAgICAgKiB0aHJvd3MgYSA8Y29kZT5OdW1iZXJGb3JtYXRFeGNlcHRpb248L2NvZGU+LgorICAgICAqCisgICAgICogPHA+VGhlIGhlYWRlciBuYW1lIGlzIGNhc2UgaW5zZW5zaXRpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIG5hbWUKKyAgICAgKgkJCQlvZiBhIHJlcXVlc3QgaGVhZGVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJYW4gaW50ZWdlciBleHByZXNzaW5nIHRoZSB2YWx1ZSAKKyAgICAgKiAJCQkJb2YgdGhlIHJlcXVlc3QgaGVhZGVyIG9yIC0xCisgICAgICoJCQkJaWYgdGhlIHJlcXVlc3QgZG9lc24ndCBoYXZlIGEKKyAgICAgKgkJCQloZWFkZXIgb2YgdGhpcyBuYW1lCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uCU51bWJlckZvcm1hdEV4Y2VwdGlvbgkJSWYgdGhlIGhlYWRlciB2YWx1ZQorICAgICAqCQkJCQkJCWNhbid0IGJlIGNvbnZlcnRlZAorICAgICAqCQkJCQkJCXRvIGFuIDxjb2RlPmludDwvY29kZT4KKyAgICAgKi8KKworICAgIHB1YmxpYyBpbnQgZ2V0SW50SGVhZGVyKFN0cmluZyBuYW1lKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgSFRUUCBtZXRob2Qgd2l0aCB3aGljaCB0aGlzIAorICAgICAqIHJlcXVlc3Qgd2FzIG1hZGUsIGZvciBleGFtcGxlLCBHRVQsIFBPU1QsIG9yIFBVVC4KKyAgICAgKiBTYW1lIGFzIHRoZSB2YWx1ZSBvZiB0aGUgQ0dJIHZhcmlhYmxlIFJFUVVFU1RfTUVUSE9ELgorICAgICAqCisgICAgICogQHJldHVybgkJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiAKKyAgICAgKgkJCQlzcGVjaWZ5aW5nIHRoZSBuYW1lCisgICAgICoJCQkJb2YgdGhlIG1ldGhvZCB3aXRoIHdoaWNoCisgICAgICoJCQkJdGhpcyByZXF1ZXN0IHdhcyBtYWRlCisgICAgICoKKyAgICAgKi8KKyAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGFueSBleHRyYSBwYXRoIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBVUkwgdGhlIGNsaWVudCBzZW50IHdoZW4gaXQgbWFkZSB0aGlzIHJlcXVlc3QuCisgICAgICogVGhlIGV4dHJhIHBhdGggaW5mb3JtYXRpb24gZm9sbG93cyB0aGUgc2VydmxldCBwYXRoCisgICAgICogYnV0IHByZWNlZGVzIHRoZSBxdWVyeSBzdHJpbmcgYW5kIHdpbGwgc3RhcnQgd2l0aAorICAgICAqIGEgIi8iIGNoYXJhY3Rlci4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUKKyAgICAgKiB3YXMgbm8gZXh0cmEgcGF0aCBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIDxwPlNhbWUgYXMgdGhlIHZhbHVlIG9mIHRoZSBDR0kgdmFyaWFibGUgUEFUSF9JTkZPLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4sIGRlY29kZWQgYnkgdGhlCisgICAgICoJCQl3ZWIgY29udGFpbmVyLCBzcGVjaWZ5aW5nIAorICAgICAqCQkJZXh0cmEgcGF0aCBpbmZvcm1hdGlvbiB0aGF0IGNvbWVzCisgICAgICoJCQlhZnRlciB0aGUgc2VydmxldCBwYXRoIGJ1dCBiZWZvcmUKKyAgICAgKgkJCXRoZSBxdWVyeSBzdHJpbmcgaW4gdGhlIHJlcXVlc3QgVVJMOworICAgICAqCQkJb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIFVSTCBkb2VzIG5vdCBoYXZlCisgICAgICoJCQlhbnkgZXh0cmEgcGF0aCBpbmZvcm1hdGlvbgorICAgICAqCisgICAgICovCisgICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aEluZm8oKTsKKyAgICAKKworIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGFueSBleHRyYSBwYXRoIGluZm9ybWF0aW9uIGFmdGVyIHRoZSBzZXJ2bGV0IG5hbWUKKyAgICAgKiBidXQgYmVmb3JlIHRoZSBxdWVyeSBzdHJpbmcsIGFuZCB0cmFuc2xhdGVzIGl0IHRvIGEgcmVhbAorICAgICAqIHBhdGguIFNhbWUgYXMgdGhlIHZhbHVlIG9mIHRoZSBDR0kgdmFyaWFibGUgUEFUSF9UUkFOU0xBVEVELgorICAgICAqCisgICAgICogPHA+SWYgdGhlIFVSTCBkb2VzIG5vdCBoYXZlIGFueSBleHRyYSBwYXRoIGluZm9ybWF0aW9uLAorICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gb3IgdGhlIHNlcnZsZXQgY29udGFpbmVyCisgICAgICogY2Fubm90IHRyYW5zbGF0ZSB0aGUgdmlydHVhbCBwYXRoIHRvIGEgcmVhbCBwYXRoIGZvciBhbnkgcmVhc29uCisgICAgICogKHN1Y2ggYXMgd2hlbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGlzIGV4ZWN1dGVkIGZyb20gYW4gYXJjaGl2ZSkuCisgICAgICoKKyAgICAgKiBUaGUgd2ViIGNvbnRhaW5lciBkb2VzIG5vdCBkZWNvZGUgdGhpcyBzdHJpbmcuCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZQorICAgICAqCQkJcmVhbCBwYXRoLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqCQkJdGhlIFVSTCBkb2VzIG5vdCBoYXZlIGFueSBleHRyYSBwYXRoCisgICAgICoJCQlpbmZvcm1hdGlvbgorICAgICAqCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFRyYW5zbGF0ZWQoKTsKKyAgICAKKworIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSBwb3J0aW9uIG9mIHRoZSByZXF1ZXN0IFVSSSB0aGF0IGluZGljYXRlcyB0aGUgY29udGV4dAorICAgICAqIG9mIHRoZSByZXF1ZXN0LiAgVGhlIGNvbnRleHQgcGF0aCBhbHdheXMgY29tZXMgZmlyc3QgaW4gYSByZXF1ZXN0CisgICAgICogVVJJLiAgVGhlIHBhdGggc3RhcnRzIHdpdGggYSAiLyIgY2hhcmFjdGVyIGJ1dCBkb2VzIG5vdCBlbmQgd2l0aCBhICIvIgorICAgICAqIGNoYXJhY3Rlci4gIEZvciBzZXJ2bGV0cyBpbiB0aGUgZGVmYXVsdCAocm9vdCkgY29udGV4dCwgdGhpcyBtZXRob2QKKyAgICAgKiByZXR1cm5zICIiLiBUaGUgY29udGFpbmVyIGRvZXMgbm90IGRlY29kZSB0aGlzIHN0cmluZy4KKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlCisgICAgICoJCQlwb3J0aW9uIG9mIHRoZSByZXF1ZXN0IFVSSSB0aGF0IGluZGljYXRlcyB0aGUgY29udGV4dAorICAgICAqCQkJb2YgdGhlIHJlcXVlc3QKKyAgICAgKgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQYXRoKCk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJldHVybnMgdGhlIHF1ZXJ5IHN0cmluZyB0aGF0IGlzIGNvbnRhaW5lZCBpbiB0aGUgcmVxdWVzdAorICAgICAqIFVSTCBhZnRlciB0aGUgcGF0aC4gVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqIGlmIHRoZSBVUkwgZG9lcyBub3QgaGF2ZSBhIHF1ZXJ5IHN0cmluZy4gU2FtZSBhcyB0aGUgdmFsdWUKKyAgICAgKiBvZiB0aGUgQ0dJIHZhcmlhYmxlIFFVRVJZX1NUUklORy4gCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgcXVlcnkKKyAgICAgKgkJCXN0cmluZyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgVVJMIAorICAgICAqCQkJY29udGFpbnMgbm8gcXVlcnkgc3RyaW5nLiBUaGUgdmFsdWUgaXMgbm90CisgICAgICoJCQlkZWNvZGVkIGJ5IHRoZSBjb250YWluZXIuCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyB0aGUgbG9naW4gb2YgdGhlIHVzZXIgbWFraW5nIHRoaXMgcmVxdWVzdCwgaWYgdGhlCisgICAgICogdXNlciBoYXMgYmVlbiBhdXRoZW50aWNhdGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdXNlciAKKyAgICAgKiBoYXMgbm90IGJlZW4gYXV0aGVudGljYXRlZC4KKyAgICAgKiBXaGV0aGVyIHRoZSB1c2VyIG5hbWUgaXMgc2VudCB3aXRoIGVhY2ggc3Vic2VxdWVudCByZXF1ZXN0CisgICAgICogZGVwZW5kcyBvbiB0aGUgYnJvd3NlciBhbmQgdHlwZSBvZiBhdXRoZW50aWNhdGlvbi4gU2FtZSBhcyB0aGUgCisgICAgICogdmFsdWUgb2YgdGhlIENHSSB2YXJpYWJsZSBSRU1PVEVfVVNFUi4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBsb2dpbgorICAgICAqCQkJb2YgdGhlIHVzZXIgbWFraW5nIHRoaXMgcmVxdWVzdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKgkJCWlmIHRoZSB1c2VyIGxvZ2luIGlzIG5vdCBrbm93bgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZVVzZXIoKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIgaXMgaW5jbHVkZWQKKyAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIGxvZ2ljYWwgInJvbGUiLiAgUm9sZXMgYW5kIHJvbGUgbWVtYmVyc2hpcCBjYW4gYmUKKyAgICAgKiBkZWZpbmVkIHVzaW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuICBJZiB0aGUgdXNlciBoYXMgbm90IGJlZW4KKyAgICAgKiBhdXRoZW50aWNhdGVkLCB0aGUgbWV0aG9kIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBuYW1lCisgICAgICoJCQkJb2YgdGhlIHJvbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZyB3aGV0aGVyCisgICAgICoJCQl0aGUgdXNlciBtYWtpbmcgdGhpcyByZXF1ZXN0IGJlbG9uZ3MgdG8gYSBnaXZlbiByb2xlOworICAgICAqCQkJPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSB1c2VyIGhhcyBub3QgYmVlbiAKKyAgICAgKgkJCWF1dGhlbnRpY2F0ZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyBhIDxjb2RlPmphdmEuc2VjdXJpdHkuUHJpbmNpcGFsPC9jb2RlPiBvYmplY3QgY29udGFpbmluZworICAgICAqIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGF1dGhlbnRpY2F0ZWQgdXNlci4gSWYgdGhlIHVzZXIgaGFzIG5vdCBiZWVuCisgICAgICogYXV0aGVudGljYXRlZCwgdGhlIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5qYXZhLnNlY3VyaXR5LlByaW5jaXBhbDwvY29kZT4gY29udGFpbmluZworICAgICAqCQkJdGhlIG5hbWUgb2YgdGhlIHVzZXIgbWFraW5nIHRoaXMgcmVxdWVzdDsKKyAgICAgKgkJCTxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB1c2VyIGhhcyBub3QgYmVlbiAKKyAgICAgKgkJCWF1dGhlbnRpY2F0ZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyB0aGUgc2Vzc2lvbiBJRCBzcGVjaWZpZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBtYXkKKyAgICAgKiBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIElEIG9mIHRoZSBjdXJyZW50IHZhbGlkIHNlc3Npb24KKyAgICAgKiBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqIElmIHRoZSBjbGllbnQgZGlkIG5vdCBzcGVjaWZ5IGEgc2Vzc2lvbiBJRCwgdGhpcyBtZXRob2QgcmV0dXJucworICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgc2Vzc2lvbgorICAgICAqCQkJSUQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXF1ZXN0IGRpZAorICAgICAqCQkJbm90IHNwZWNpZnkgYSBzZXNzaW9uIElECisgICAgICoKKyAgICAgKiBAc2VlCQkjaXNSZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RlZFNlc3Npb25JZCgpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyB0aGUgcGFydCBvZiB0aGlzIHJlcXVlc3QncyBVUkwgZnJvbSB0aGUgcHJvdG9jb2wKKyAgICAgKiBuYW1lIHVwIHRvIHRoZSBxdWVyeSBzdHJpbmcgaW4gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIEhUVFAgcmVxdWVzdC4KKyAgICAgKiBUaGUgd2ViIGNvbnRhaW5lciBkb2VzIG5vdCBkZWNvZGUgdGhpcyBTdHJpbmcuCisgICAgICogRm9yIGV4YW1wbGU6CisgICAgICoKKyAgICAgKiAKKworICAgICAqIDx0YWJsZSBzdW1tYXJ5PSJFeGFtcGxlcyBvZiBSZXR1cm5lZCBWYWx1ZXMiPgorICAgICAqIDx0ciBhbGlnbj1sZWZ0Pjx0aD5GaXJzdCBsaW5lIG9mIEhUVFAgcmVxdWVzdCAgICAgIDwvdGg+CisgICAgICogPHRoPiAgICAgUmV0dXJuZWQgVmFsdWU8L3RoPgorICAgICAqIDx0cj48dGQ+UE9TVCAvc29tZS9wYXRoLmh0bWwgSFRUUC8xLjE8dGQ+PHRkPi9zb21lL3BhdGguaHRtbAorICAgICAqIDx0cj48dGQ+R0VUIGh0dHA6Ly9mb28uYmFyL2EuaHRtbCBIVFRQLzEuMAorICAgICAqIDx0ZD48dGQ+L2EuaHRtbAorICAgICAqIDx0cj48dGQ+SEVBRCAveHl6P2E9YiBIVFRQLzEuMTx0ZD48dGQ+L3h5egorICAgICAqIDwvdGFibGU+CisgICAgICoKKyAgICAgKiA8cD5UbyByZWNvbnN0cnVjdCBhbiBVUkwgd2l0aCBhIHNjaGVtZSBhbmQgaG9zdCwgdXNlCisgICAgICoge0BsaW5rIEh0dHBVdGlscyNnZXRSZXF1ZXN0VVJMfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nCisgICAgICoJCQl0aGUgcGFydCBvZiB0aGUgVVJMIGZyb20gdGhlIAorICAgICAqCQkJcHJvdG9jb2wgbmFtZSB1cCB0byB0aGUgcXVlcnkgc3RyaW5nCisgICAgICoKKyAgICAgKiBAc2VlCQlIdHRwVXRpbHMjZ2V0UmVxdWVzdFVSTAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RVUkkoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJlY29uc3RydWN0cyB0aGUgVVJMIHRoZSBjbGllbnQgdXNlZCB0byBtYWtlIHRoZSByZXF1ZXN0LgorICAgICAqIFRoZSByZXR1cm5lZCBVUkwgY29udGFpbnMgYSBwcm90b2NvbCwgc2VydmVyIG5hbWUsIHBvcnQKKyAgICAgKiBudW1iZXIsIGFuZCBzZXJ2ZXIgcGF0aCwgYnV0IGl0IGRvZXMgbm90IGluY2x1ZGUgcXVlcnkKKyAgICAgKiBzdHJpbmcgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIDxwPkJlY2F1c2UgdGhpcyBtZXRob2QgcmV0dXJucyBhIDxjb2RlPlN0cmluZ0J1ZmZlcjwvY29kZT4sCisgICAgICogbm90IGEgc3RyaW5nLCB5b3UgY2FuIG1vZGlmeSB0aGUgVVJMIGVhc2lseSwgZm9yIGV4YW1wbGUsCisgICAgICogdG8gYXBwZW5kIHF1ZXJ5IHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGNyZWF0aW5nIHJlZGlyZWN0IG1lc3NhZ2VzCisgICAgICogYW5kIGZvciByZXBvcnRpbmcgZXJyb3JzLgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5TdHJpbmdCdWZmZXI8L2NvZGU+IG9iamVjdCBjb250YWluaW5nCisgICAgICoJCQl0aGUgcmVjb25zdHJ1Y3RlZCBVUkwKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0UmVxdWVzdFVSTCgpOworICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXJ0IG9mIHRoaXMgcmVxdWVzdCdzIFVSTCB0aGF0IGNhbGxzCisgICAgICogdGhlIHNlcnZsZXQuIFRoaXMgcGF0aCBzdGFydHMgd2l0aCBhICIvIiBjaGFyYWN0ZXIKKyAgICAgKiBhbmQgaW5jbHVkZXMgZWl0aGVyIHRoZSBzZXJ2bGV0IG5hbWUgb3IgYSBwYXRoIHRvCisgICAgICogdGhlIHNlcnZsZXQsIGJ1dCBkb2VzIG5vdCBpbmNsdWRlIGFueSBleHRyYSBwYXRoCisgICAgICogaW5mb3JtYXRpb24gb3IgYSBxdWVyeSBzdHJpbmcuIFNhbWUgYXMgdGhlIHZhbHVlIG9mCisgICAgICogdGhlIENHSSB2YXJpYWJsZSBTQ1JJUFRfTkFNRS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZyAoIiIpIGlmIHRoZQorICAgICAqIHNlcnZsZXQgdXNlZCB0byBwcm9jZXNzIHRoaXMgcmVxdWVzdCB3YXMgbWF0Y2hlZCB1c2luZworICAgICAqIHRoZSAiLyoiIHBhdHRlcm4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZworICAgICAqCQkJdGhlIG5hbWUgb3IgcGF0aCBvZiB0aGUgc2VydmxldCBiZWluZworICAgICAqCQkJY2FsbGVkLCBhcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgVVJMLAorICAgICAqCQkJZGVjb2RlZCwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBzZXJ2bGV0CisgICAgICoJCQl1c2VkIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QgaXMgbWF0Y2hlZAorICAgICAqCQkJdXNpbmcgdGhlICIvKiIgcGF0dGVybi4KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IDxjb2RlPkh0dHBTZXNzaW9uPC9jb2RlPgorICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3Qgb3IsIGlmIHRoZXJlIGlzIG5vCisgICAgICogY3VycmVudCBzZXNzaW9uIGFuZCA8Y29kZT5jcmVhdGU8L2NvZGU+IGlzIHRydWUsIHJldHVybnMgCisgICAgICogYSBuZXcgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIDxwPklmIDxjb2RlPmNyZWF0ZTwvY29kZT4gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICogYW5kIHRoZSByZXF1ZXN0IGhhcyBubyB2YWxpZCA8Y29kZT5IdHRwU2Vzc2lvbjwvY29kZT4sCisgICAgICogdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPlRvIG1ha2Ugc3VyZSB0aGUgc2Vzc2lvbiBpcyBwcm9wZXJseSBtYWludGFpbmVkLAorICAgICAqIHlvdSBtdXN0IGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIAorICAgICAqIHRoZSByZXNwb25zZSBpcyBjb21taXR0ZWQuIElmIHRoZSBjb250YWluZXIgaXMgdXNpbmcgY29va2llcworICAgICAqIHRvIG1haW50YWluIHNlc3Npb24gaW50ZWdyaXR5IGFuZCBpcyBhc2tlZCB0byBjcmVhdGUgYSBuZXcgc2Vzc2lvbgorICAgICAqIHdoZW4gdGhlIHJlc3BvbnNlIGlzIGNvbW1pdHRlZCwgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBjcmVhdGUJPGNvZGU+dHJ1ZTwvY29kZT4gdG8gY3JlYXRlCisgICAgICoJCQlhIG5ldyBzZXNzaW9uIGZvciB0aGlzIHJlcXVlc3QgaWYgbmVjZXNzYXJ5OyAKKyAgICAgKgkJCTxjb2RlPmZhbHNlPC9jb2RlPiB0byByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKgkJCWlmIHRoZXJlJ3Mgbm8gY3VycmVudCBzZXNzaW9uCisgICAgICoJCQkKKyAgICAgKgorICAgICAqIEByZXR1cm4gCQl0aGUgPGNvZGU+SHR0cFNlc3Npb248L2NvZGU+IGFzc29jaWF0ZWQgCisgICAgICoJCQl3aXRoIHRoaXMgcmVxdWVzdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqIAkJCTxjb2RlPmNyZWF0ZTwvY29kZT4gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICoJCQlhbmQgdGhlIHJlcXVlc3QgaGFzIG5vIHZhbGlkIHNlc3Npb24KKyAgICAgKgorICAgICAqIEBzZWUJI2dldFNlc3Npb24oKQorICAgICAqCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKGJvb2xlYW4gY3JlYXRlKTsKKyAgICAKKyAgICAKKyAgICAKKyAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdCwKKyAgICAgKiBvciBpZiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBoYXZlIGEgc2Vzc2lvbiwgY3JlYXRlcyBvbmUuCisgICAgICogCisgICAgICogQHJldHVybgkJdGhlIDxjb2RlPkh0dHBTZXNzaW9uPC9jb2RlPiBhc3NvY2lhdGVkCisgICAgICoJCQl3aXRoIHRoaXMgcmVxdWVzdAorICAgICAqCisgICAgICogQHNlZQkjZ2V0U2Vzc2lvbihib29sZWFuKQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbigpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcmVxdWVzdGVkIHNlc3Npb24gSUQgaXMgc3RpbGwgdmFsaWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcworICAgICAqCQkJCXJlcXVlc3QgaGFzIGFuIGlkIGZvciBhIHZhbGlkIHNlc3Npb24KKyAgICAgKgkJCQlpbiB0aGUgY3VycmVudCBzZXNzaW9uIGNvbnRleHQ7CisgICAgICoJCQkJPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorICAgICAqCisgICAgICogQHNlZQkJCSNnZXRSZXF1ZXN0ZWRTZXNzaW9uSWQKKyAgICAgKiBAc2VlCQkJI2dldFNlc3Npb24KKyAgICAgKiBAc2VlCQkJSHR0cFNlc3Npb25Db250ZXh0CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHJlcXVlc3RlZCBzZXNzaW9uIElEIGNhbWUgaW4gYXMgYSBjb29raWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlc3Npb24gSUQKKyAgICAgKgkJCQljYW1lIGluIGFzIGEKKyAgICAgKgkJCQljb29raWU7IG90aGVyd2lzZSwgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICoKKyAgICAgKgorICAgICAqIEBzZWUJCQkjZ2V0U2Vzc2lvbgorICAgICAqCisgICAgICovIAorCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tQ29va2llKCk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBJRCBjYW1lIGluIGFzIHBhcnQgb2YgdGhlIAorICAgICAqIHJlcXVlc3QgVVJMLgorICAgICAqCisgICAgICogQHJldHVybgkJCTxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXNzaW9uIElECisgICAgICoJCQkJY2FtZSBpbiBhcyBwYXJ0IG9mIGEgVVJMOyBvdGhlcndpc2UsCisgICAgICoJCQkJPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICoKKyAgICAgKgorICAgICAqIEBzZWUJCQkjZ2V0U2Vzc2lvbgorICAgICAqCisgICAgICovCisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVVJMKCk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZAkJQXMgb2YgVmVyc2lvbiAyLjEgb2YgdGhlIEphdmEgU2VydmxldAorICAgICAqCQkJCUFQSSwgdXNlIHtAbGluayAjaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVVJMfQorICAgICAqCQkJCWluc3RlYWQuCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVybCgpOworCisKKyAgICAKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjYzNhOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldC5odHRwOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdFdyYXBwZXI7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCisvKioKKyAqIAorICogUHJvdmlkZXMgYSBjb252ZW5pZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBIdHRwU2VydmxldFJlcXVlc3QgaW50ZXJmYWNlIHRoYXQKKyAqIGNhbiBiZSBzdWJjbGFzc2VkIGJ5IGRldmVsb3BlcnMgd2lzaGluZyB0byBhZGFwdCB0aGUgcmVxdWVzdCB0byBhIFNlcnZsZXQuCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFdyYXBwZXIgb3IgRGVjb3JhdG9yIHBhdHRlcm4uIE1ldGhvZHMgZGVmYXVsdCB0bworICogY2FsbGluZyB0aHJvdWdoIHRvIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICogCisgKgorICogQHNlZSAJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdAorICAqIEBzaW5jZQl2IDIuMworICoKKyAqLworCisKK3B1YmxpYyBjbGFzcyBIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIGV4dGVuZHMgU2VydmxldFJlcXVlc3RXcmFwcGVyIGltcGxlbWVudHMgSHR0cFNlcnZsZXRSZXF1ZXN0IHsKKworCS8qKiAKKwkqIENvbnN0cnVjdHMgYSByZXF1ZXN0IG9iamVjdCB3cmFwcGluZyB0aGUgZ2l2ZW4gcmVxdWVzdC4KKwkqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcmVxdWVzdCBpcyBudWxsCisJKi8KKyAgICBwdWJsaWMgSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCSAgICBzdXBlcihyZXF1ZXN0KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlcXVlc3QgX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpIHsKKwlyZXR1cm4gKEh0dHBTZXJ2bGV0UmVxdWVzdCkgc3VwZXIuZ2V0UmVxdWVzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRBdXRoVHlwZSgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhUeXBlKCkgeworCXJldHVybiB0aGlzLl9nZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRBdXRoVHlwZSgpOworICAgIH0KKyAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRDb29raWVzKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29va2llW10gZ2V0Q29va2llcygpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0Q29va2llcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXREYXRlSGVhZGVyKFN0cmluZyBuYW1lKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldERhdGVIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0RGF0ZUhlYWRlcihuYW1lKTsKKyAgICB9CisgICAgICAgIAkKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0SGVhZGVyKFN0cmluZyBuYW1lKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyKFN0cmluZyBuYW1lKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldEhlYWRlcihuYW1lKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldEhlYWRlcnMoU3RyaW5nIG5hbWUpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEhlYWRlcnMoU3RyaW5nIG5hbWUpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0SGVhZGVycyhuYW1lKTsKKyAgICB9ICAKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRIZWFkZXJOYW1lcygpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisgIAorICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRIZWFkZXJOYW1lcygpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0SGVhZGVyTmFtZXMoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldEludEhlYWRlcihTdHJpbmcgbmFtZSkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKworICAgICBwdWJsaWMgaW50IGdldEludEhlYWRlcihTdHJpbmcgbmFtZSkgeworCXJldHVybiB0aGlzLl9nZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRJbnRIZWFkZXIobmFtZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRNZXRob2QoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKCkgeworCXJldHVybiB0aGlzLl9nZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRNZXRob2QoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldFBhdGhJbmZvKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhJbmZvKCkgeworCXJldHVybiB0aGlzLl9nZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRQYXRoSW5mbygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRQYXRoVHJhbnNsYXRlZCgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisKKyAgICAgcHVibGljIFN0cmluZyBnZXRQYXRoVHJhbnNsYXRlZCgpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UGF0aFRyYW5zbGF0ZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0Q29udGV4dFBhdGgoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFBhdGgoKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldENvbnRleHRQYXRoKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRRdWVyeVN0cmluZygpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UXVlcnlTdHJpbmcoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldFJlbW90ZVVzZXIoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlVXNlcigpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UmVtb3RlVXNlcigpOworICAgIH0KKyAgICAKKyAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgeworCXJldHVybiB0aGlzLl9nZXRIdHRwU2VydmxldFJlcXVlc3QoKS5pc1VzZXJJblJvbGUocm9sZSk7CisgICAgfQorICAgIAorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRVc2VyUHJpbmNpcGFsKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0VXNlclByaW5jaXBhbCgpOworICAgIH0KKyAgICAKKyAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCkgeworCXJldHVybiB0aGlzLl9nZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldFJlcXVlc3RVUkkoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFVSSSgpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UmVxdWVzdFVSSSgpOworICAgIH0KKwkvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0UmVxdWVzdFVSTCgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ0J1ZmZlciBnZXRSZXF1ZXN0VVJMKCkgeworCXJldHVybiB0aGlzLl9nZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRSZXF1ZXN0VVJMKCk7CisgICAgfQorCQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRTZXJ2bGV0UGF0aCgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0U2VydmxldFBhdGgoKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldFNlc3Npb24oYm9vbGVhbiBjcmVhdGUpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oYm9vbGVhbiBjcmVhdGUpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0U2Vzc2lvbihjcmVhdGUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0U2Vzc2lvbigpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFNlc3Npb24oKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLyAKKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKTsKKyAgICB9CisgICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tQ29va2llKCk7CisgICAgfQorICAgIAorICAgIAkgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VUkwoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLyAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VUkwoKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVXJsKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VcmwoKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVybCgpOworICAgIH0KKworCisgICAgCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2UuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTAyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDYzNyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuaHR0cDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKKworLyoqCisgKgorICogRXh0ZW5kcyB0aGUge0BsaW5rIFNlcnZsZXRSZXNwb25zZX0gaW50ZXJmYWNlIHRvIHByb3ZpZGUgSFRUUC1zcGVjaWZpYworICogZnVuY3Rpb25hbGl0eSBpbiBzZW5kaW5nIGEgcmVzcG9uc2UuICBGb3IgZXhhbXBsZSwgaXQgaGFzIG1ldGhvZHMKKyAqIHRvIGFjY2VzcyBIVFRQIGhlYWRlcnMgYW5kIGNvb2tpZXMuCisgKgorICogPHA+VGhlIHNlcnZsZXQgY29udGFpbmVyIGNyZWF0ZXMgYW4gPGNvZGU+SHR0cFNlcnZsZXRSZXNwb25zZTwvY29kZT4gb2JqZWN0CisgKiBhbmQgcGFzc2VzIGl0IGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBzZXJ2bGV0J3Mgc2VydmljZSBtZXRob2RzCisgKiAoPGNvZGU+ZG9HZXQ8L2NvZGU+LCA8Y29kZT5kb1Bvc3Q8L2NvZGU+LCBldGMpLgorICoKKyAqIAorICogQGF1dGhvcglWYXJpb3VzCisgKiBAdmVyc2lvbgkkVmVyc2lvbiQKKyAqCisgKiBAc2VlCQlqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZQorICoKKyAqLworCisKKworcHVibGljIGludGVyZmFjZSBIdHRwU2VydmxldFJlc3BvbnNlIGV4dGVuZHMgU2VydmxldFJlc3BvbnNlIHsKKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBjb29raWUgdG8gdGhlIHJlc3BvbnNlLiAgVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZAorICAgICAqIG11bHRpcGxlIHRpbWVzIHRvIHNldCBtb3JlIHRoYW4gb25lIGNvb2tpZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb29raWUgdGhlIENvb2tpZSB0byByZXR1cm4gdG8gdGhlIGNsaWVudAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBhZGRDb29raWUoQ29va2llIGNvb2tpZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG5hbWVkIHJlc3BvbnNlIGhlYWRlciAKKyAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIHNldC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0JbmFtZQl0aGUgaGVhZGVyIG5hbWUKKyAgICAgKiBAcmV0dXJuCQk8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbmFtZWQgcmVzcG9uc2UgaGVhZGVyIAorICAgICAqCQkJaGFzIGFscmVhZHkgYmVlbiBzZXQ7IAorICAgICAqIAkJCTxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKyAgICAgKi8KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSGVhZGVyKFN0cmluZyBuYW1lKTsKKworICAgIC8qKgorICAgICAqIEVuY29kZXMgdGhlIHNwZWNpZmllZCBVUkwgYnkgaW5jbHVkaW5nIHRoZSBzZXNzaW9uIElEIGluIGl0LAorICAgICAqIG9yLCBpZiBlbmNvZGluZyBpcyBub3QgbmVlZGVkLCByZXR1cm5zIHRoZSBVUkwgdW5jaGFuZ2VkLgorICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBpbmNsdWRlcyB0aGUgbG9naWMgdG8KKyAgICAgKiBkZXRlcm1pbmUgd2hldGhlciB0aGUgc2Vzc2lvbiBJRCBuZWVkcyB0byBiZSBlbmNvZGVkIGluIHRoZSBVUkwuCisgICAgICogRm9yIGV4YW1wbGUsIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIGNvb2tpZXMsIG9yIHNlc3Npb24KKyAgICAgKiB0cmFja2luZyBpcyB0dXJuZWQgb2ZmLCBVUkwgZW5jb2RpbmcgaXMgdW5uZWNlc3NhcnkuCisgICAgICogCisgICAgICogPHA+Rm9yIHJvYnVzdCBzZXNzaW9uIHRyYWNraW5nLCBhbGwgVVJMcyBlbWl0dGVkIGJ5IGEgc2VydmxldCAKKyAgICAgKiBzaG91bGQgYmUgcnVuIHRocm91Z2ggdGhpcworICAgICAqIG1ldGhvZC4gIE90aGVyd2lzZSwgVVJMIHJld3JpdGluZyBjYW5ub3QgYmUgdXNlZCB3aXRoIGJyb3dzZXJzCisgICAgICogd2hpY2ggZG8gbm90IHN1cHBvcnQgY29va2llcy4KKyAgICAgKgorICAgICAqIEBwYXJhbQl1cmwJdGhlIHVybCB0byBiZSBlbmNvZGVkLgorICAgICAqIEByZXR1cm4JCXRoZSBlbmNvZGVkIFVSTCBpZiBlbmNvZGluZyBpcyBuZWVkZWQ7CisgICAgICogCQkJdGhlIHVuY2hhbmdlZCBVUkwgb3RoZXJ3aXNlLgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVVUkwoU3RyaW5nIHVybCk7CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHRoZSBzcGVjaWZpZWQgVVJMIGZvciB1c2UgaW4gdGhlCisgICAgICogPGNvZGU+c2VuZFJlZGlyZWN0PC9jb2RlPiBtZXRob2Qgb3IsIGlmIGVuY29kaW5nIGlzIG5vdCBuZWVkZWQsCisgICAgICogcmV0dXJucyB0aGUgVVJMIHVuY2hhbmdlZC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZAorICAgICAqIGluY2x1ZGVzIHRoZSBsb2dpYyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgc2Vzc2lvbiBJRAorICAgICAqIG5lZWRzIHRvIGJlIGVuY29kZWQgaW4gdGhlIFVSTC4gIEJlY2F1c2UgdGhlIHJ1bGVzIGZvciBtYWtpbmcKKyAgICAgKiB0aGlzIGRldGVybWluYXRpb24gY2FuIGRpZmZlciBmcm9tIHRob3NlIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8KKyAgICAgKiBlbmNvZGUgYSBub3JtYWwgbGluaywgdGhpcyBtZXRob2QgaXMgc2VwYXJhdGVkIGZyb20gdGhlCisgICAgICogPGNvZGU+ZW5jb2RlVVJMPC9jb2RlPiBtZXRob2QuCisgICAgICogCisgICAgICogPHA+QWxsIFVSTHMgc2VudCB0byB0aGUgPGNvZGU+SHR0cFNlcnZsZXRSZXNwb25zZS5zZW5kUmVkaXJlY3Q8L2NvZGU+CisgICAgICogbWV0aG9kIHNob3VsZCBiZSBydW4gdGhyb3VnaCB0aGlzIG1ldGhvZC4gIE90aGVyd2lzZSwgVVJMCisgICAgICogcmV3cml0aW5nIGNhbm5vdCBiZSB1c2VkIHdpdGggYnJvd3NlcnMgd2hpY2ggZG8gbm90IHN1cHBvcnQKKyAgICAgKiBjb29raWVzLgorICAgICAqCisgICAgICogQHBhcmFtCXVybAl0aGUgdXJsIHRvIGJlIGVuY29kZWQuCisgICAgICogQHJldHVybgkJdGhlIGVuY29kZWQgVVJMIGlmIGVuY29kaW5nIGlzIG5lZWRlZDsKKyAgICAgKiAJCQl0aGUgdW5jaGFuZ2VkIFVSTCBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAc2VlICNzZW5kUmVkaXJlY3QKKyAgICAgKiBAc2VlICNlbmNvZGVVcmwKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlUmVkaXJlY3RVUkwoU3RyaW5nIHVybCk7CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZAlBcyBvZiB2ZXJzaW9uIDIuMSwgdXNlIGVuY29kZVVSTChTdHJpbmcgdXJsKSBpbnN0ZWFkCisgICAgICoKKyAgICAgKiBAcGFyYW0JdXJsCXRoZSB1cmwgdG8gYmUgZW5jb2RlZC4KKyAgICAgKiBAcmV0dXJuCQl0aGUgZW5jb2RlZCBVUkwgaWYgZW5jb2RpbmcgaXMgbmVlZGVkOyAKKyAgICAgKiAJCQl0aGUgdW5jaGFuZ2VkIFVSTCBvdGhlcndpc2UuCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVybChTdHJpbmcgdXJsKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZAlBcyBvZiB2ZXJzaW9uIDIuMSwgdXNlIAorICAgICAqCQkJZW5jb2RlUmVkaXJlY3RVUkwoU3RyaW5nIHVybCkgaW5zdGVhZAorICAgICAqCisgICAgICogQHBhcmFtCXVybAl0aGUgdXJsIHRvIGJlIGVuY29kZWQuCisgICAgICogQHJldHVybgkJdGhlIGVuY29kZWQgVVJMIGlmIGVuY29kaW5nIGlzIG5lZWRlZDsgCisgICAgICogCQkJdGhlIHVuY2hhbmdlZCBVUkwgb3RoZXJ3aXNlLgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVSZWRpcmVjdFVybChTdHJpbmcgdXJsKTsKKworICAgIC8qKgorICAgICAqIFNlbmRzIGFuIGVycm9yIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQgdXNpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIHN0YXR1cy4gIFRoZSBzZXJ2ZXIgZGVmYXVsdHMgdG8gY3JlYXRpbmcgdGhlCisgICAgICogcmVzcG9uc2UgdG8gbG9vayBsaWtlIGFuIEhUTUwtZm9ybWF0dGVkIHNlcnZlciBlcnJvciBwYWdlCisgICAgICogY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIHNldHRpbmcgdGhlIGNvbnRlbnQgdHlwZQorICAgICAqIHRvICJ0ZXh0L2h0bWwiLCBsZWF2aW5nIGNvb2tpZXMgYW5kIG90aGVyIGhlYWRlcnMgdW5tb2RpZmllZC4KKyAgICAgKgorICAgICAqIElmIGFuIGVycm9yLXBhZ2UgZGVjbGFyYXRpb24gaGFzIGJlZW4gbWFkZSBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbgorICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXR1cyBjb2RlIHBhc3NlZCBpbiwgaXQgd2lsbCBiZSBzZXJ2ZWQgYmFjayBpbiAKKyAgICAgKiBwcmVmZXJlbmNlIHRvIHRoZSBzdWdnZXN0ZWQgbXNnIHBhcmFtZXRlci4gCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgcmVzcG9uc2UgaGFzIGFscmVhZHkgYmVlbiBjb21taXR0ZWQsIHRoaXMgbWV0aG9kIHRocm93cyAKKyAgICAgKiBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uCisgICAgICogQWZ0ZXIgdXNpbmcgdGhpcyBtZXRob2QsIHRoZSByZXNwb25zZSBzaG91bGQgYmUgY29uc2lkZXJlZAorICAgICAqIHRvIGJlIGNvbW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB3cml0dGVuIHRvLgorICAgICAqCisgICAgICogQHBhcmFtCXNjCXRoZSBlcnJvciBzdGF0dXMgY29kZQorICAgICAqIEBwYXJhbQltc2cJdGhlIGRlc2NyaXB0aXZlIG1lc3NhZ2UKKyAgICAgKiBAZXhjZXB0aW9uCUlPRXhjZXB0aW9uCUlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbglJbGxlZ2FsU3RhdGVFeGNlcHRpb24JSWYgdGhlIHJlc3BvbnNlIHdhcyBjb21taXR0ZWQKKyAgICAgKi8KKyAgIAorICAgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgc2MsIFN0cmluZyBtc2cpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNlbmRzIGFuIGVycm9yIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQgdXNpbmcgdGhlIHNwZWNpZmllZCBzdGF0dXMKKyAgICAgKiBjb2RlIGFuZCBjbGVhcmluZyB0aGUgYnVmZmVyLiAKKyAgICAgKiA8cD5JZiB0aGUgcmVzcG9uc2UgaGFzIGFscmVhZHkgYmVlbiBjb21taXR0ZWQsIHRoaXMgbWV0aG9kIHRocm93cyAKKyAgICAgKiBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uCisgICAgICogQWZ0ZXIgdXNpbmcgdGhpcyBtZXRob2QsIHRoZSByZXNwb25zZSBzaG91bGQgYmUgY29uc2lkZXJlZAorICAgICAqIHRvIGJlIGNvbW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB3cml0dGVuIHRvLgorICAgICAqCisgICAgICogQHBhcmFtCXNjCXRoZSBlcnJvciBzdGF0dXMgY29kZQorICAgICAqIEBleGNlcHRpb24JSU9FeGNlcHRpb24JSWYgYW4gaW5wdXQgb3Igb3V0cHV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uCUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbglJZiB0aGUgcmVzcG9uc2Ugd2FzIGNvbW1pdHRlZAorICAgICAqCQkJCQkJYmVmb3JlIHRoaXMgbWV0aG9kIGNhbGwKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgc2MpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNlbmRzIGEgdGVtcG9yYXJ5IHJlZGlyZWN0IHJlc3BvbnNlIHRvIHRoZSBjbGllbnQgdXNpbmcgdGhlCisgICAgICogc3BlY2lmaWVkIHJlZGlyZWN0IGxvY2F0aW9uIFVSTC4gIFRoaXMgbWV0aG9kIGNhbiBhY2NlcHQgcmVsYXRpdmUgVVJMczsKKyAgICAgKiB0aGUgc2VydmxldCBjb250YWluZXIgbXVzdCBjb252ZXJ0IHRoZSByZWxhdGl2ZSBVUkwgdG8gYW4gYWJzb2x1dGUgVVJMCisgICAgICogYmVmb3JlIHNlbmRpbmcgdGhlIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQuIElmIHRoZSBsb2NhdGlvbiBpcyByZWxhdGl2ZSAKKyAgICAgKiB3aXRob3V0IGEgbGVhZGluZyAnLycgdGhlIGNvbnRhaW5lciBpbnRlcnByZXRzIGl0IGFzIHJlbGF0aXZlIHRvCisgICAgICogdGhlIGN1cnJlbnQgcmVxdWVzdCBVUkkuIElmIHRoZSBsb2NhdGlvbiBpcyByZWxhdGl2ZSB3aXRoIGEgbGVhZGluZworICAgICAqICcvJyB0aGUgY29udGFpbmVyIGludGVycHJldHMgaXQgYXMgcmVsYXRpdmUgdG8gdGhlIHNlcnZsZXQgY29udGFpbmVyIHJvb3QuCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgcmVzcG9uc2UgaGFzIGFscmVhZHkgYmVlbiBjb21taXR0ZWQsIHRoaXMgbWV0aG9kIHRocm93cyAKKyAgICAgKiBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uCisgICAgICogQWZ0ZXIgdXNpbmcgdGhpcyBtZXRob2QsIHRoZSByZXNwb25zZSBzaG91bGQgYmUgY29uc2lkZXJlZAorICAgICAqIHRvIGJlIGNvbW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB3cml0dGVuIHRvLgorICAgICAqCisgICAgICogQHBhcmFtCQlsb2NhdGlvbgl0aGUgcmVkaXJlY3QgbG9jYXRpb24gVVJMCisgICAgICogQGV4Y2VwdGlvbglJT0V4Y2VwdGlvbglJZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqIEBleGNlcHRpb24JSWxsZWdhbFN0YXRlRXhjZXB0aW9uCUlmIHRoZSByZXNwb25zZSB3YXMgY29tbWl0dGVkIG9yCisgaWYgYSBwYXJ0aWFsIFVSTCBpcyBnaXZlbiBhbmQgY2Fubm90IGJlIGNvbnZlcnRlZCBpbnRvIGEgdmFsaWQgVVJMCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZW5kUmVkaXJlY3QoU3RyaW5nIGxvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgCisgICAgLyoqCisgICAgICogCisgICAgICogU2V0cyBhIHJlc3BvbnNlIGhlYWRlciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZAorICAgICAqIGRhdGUtdmFsdWUuICBUaGUgZGF0ZSBpcyBzcGVjaWZpZWQgaW4gdGVybXMgb2YKKyAgICAgKiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLiAgSWYgdGhlIGhlYWRlciBoYWQgYWxyZWFkeQorICAgICAqIGJlZW4gc2V0LCB0aGUgbmV3IHZhbHVlIG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzIG9uZS4gIFRoZQorICAgICAqIDxjb2RlPmNvbnRhaW5zSGVhZGVyPC9jb2RlPiBtZXRob2QgY2FuIGJlIHVzZWQgdG8gdGVzdCBmb3IgdGhlCisgICAgICogcHJlc2VuY2Ugb2YgYSBoZWFkZXIgYmVmb3JlIHNldHRpbmcgaXRzIHZhbHVlLgorICAgICAqIAorICAgICAqIEBwYXJhbQluYW1lCXRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgdG8gc2V0CisgICAgICogQHBhcmFtCWRhdGUJdGhlIGFzc2lnbmVkIGRhdGUgdmFsdWUKKyAgICAgKiAKKyAgICAgKiBAc2VlICNjb250YWluc0hlYWRlcgorICAgICAqIEBzZWUgI2FkZERhdGVIZWFkZXIKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldERhdGVIZWFkZXIoU3RyaW5nIG5hbWUsIGxvbmcgZGF0ZSk7CisgICAgCisgICAgLyoqCisgICAgICogCisgICAgICogQWRkcyBhIHJlc3BvbnNlIGhlYWRlciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZAorICAgICAqIGRhdGUtdmFsdWUuICBUaGUgZGF0ZSBpcyBzcGVjaWZpZWQgaW4gdGVybXMgb2YKKyAgICAgKiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLiAgVGhpcyBtZXRob2QgYWxsb3dzIHJlc3BvbnNlIGhlYWRlcnMgCisgICAgICogdG8gaGF2ZSBtdWx0aXBsZSB2YWx1ZXMuCisgICAgICogCisgICAgICogQHBhcmFtCW5hbWUJdGhlIG5hbWUgb2YgdGhlIGhlYWRlciB0byBzZXQKKyAgICAgKiBAcGFyYW0JZGF0ZQl0aGUgYWRkaXRpb25hbCBkYXRlIHZhbHVlCisgICAgICogCisgICAgICogQHNlZSAjc2V0RGF0ZUhlYWRlcgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgYWRkRGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyBkYXRlKTsKKyAgICAKKyAgICAvKioKKyAgICAgKgorICAgICAqIFNldHMgYSByZXNwb25zZSBoZWFkZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuCisgICAgICogSWYgdGhlIGhlYWRlciBoYWQgYWxyZWFkeSBiZWVuIHNldCwgdGhlIG5ldyB2YWx1ZSBvdmVyd3JpdGVzIHRoZQorICAgICAqIHByZXZpb3VzIG9uZS4gIFRoZSA8Y29kZT5jb250YWluc0hlYWRlcjwvY29kZT4gbWV0aG9kIGNhbiBiZQorICAgICAqIHVzZWQgdG8gdGVzdCBmb3IgdGhlIHByZXNlbmNlIG9mIGEgaGVhZGVyIGJlZm9yZSBzZXR0aW5nIGl0cworICAgICAqIHZhbHVlLgorICAgICAqIAorICAgICAqIEBwYXJhbQluYW1lCXRoZSBuYW1lIG9mIHRoZSBoZWFkZXIKKyAgICAgKiBAcGFyYW0JdmFsdWUJdGhlIGhlYWRlciB2YWx1ZSAgSWYgaXQgY29udGFpbnMgb2N0ZXQgc3RyaW5nLAorICAgICAqCQlpdCBzaG91bGQgYmUgZW5jb2RlZCBhY2NvcmRpbmcgdG8gUkZDIDIwNDcKKyAgICAgKgkJKGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwNDcudHh0KQorICAgICAqCisgICAgICogQHNlZSAjY29udGFpbnNIZWFkZXIKKyAgICAgKiBAc2VlICNhZGRIZWFkZXIKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcmVzcG9uc2UgaGVhZGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHZhbHVlLgorICAgICAqIFRoaXMgbWV0aG9kIGFsbG93cyByZXNwb25zZSBoZWFkZXJzIHRvIGhhdmUgbXVsdGlwbGUgdmFsdWVzLgorICAgICAqIAorICAgICAqIEBwYXJhbQluYW1lCXRoZSBuYW1lIG9mIHRoZSBoZWFkZXIKKyAgICAgKiBAcGFyYW0JdmFsdWUJdGhlIGFkZGl0aW9uYWwgaGVhZGVyIHZhbHVlICAgSWYgaXQgY29udGFpbnMKKyAgICAgKgkJb2N0ZXQgc3RyaW5nLCBpdCBzaG91bGQgYmUgZW5jb2RlZAorICAgICAqCQlhY2NvcmRpbmcgdG8gUkZDIDIwNDcKKyAgICAgKgkJKGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwNDcudHh0KQorICAgICAqCisgICAgICogQHNlZSAjc2V0SGVhZGVyCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgcmVzcG9uc2UgaGVhZGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kCisgICAgICogaW50ZWdlciB2YWx1ZS4gIElmIHRoZSBoZWFkZXIgaGFkIGFscmVhZHkgYmVlbiBzZXQsIHRoZSBuZXcgdmFsdWUKKyAgICAgKiBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyBvbmUuICBUaGUgPGNvZGU+Y29udGFpbnNIZWFkZXI8L2NvZGU+CisgICAgICogbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHRlc3QgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIGhlYWRlciBiZWZvcmUKKyAgICAgKiBzZXR0aW5nIGl0cyB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbQluYW1lCXRoZSBuYW1lIG9mIHRoZSBoZWFkZXIKKyAgICAgKiBAcGFyYW0JdmFsdWUJdGhlIGFzc2lnbmVkIGludGVnZXIgdmFsdWUKKyAgICAgKgorICAgICAqIEBzZWUgI2NvbnRhaW5zSGVhZGVyCisgICAgICogQHNlZSAjYWRkSW50SGVhZGVyCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRIZWFkZXIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcmVzcG9uc2UgaGVhZGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kCisgICAgICogaW50ZWdlciB2YWx1ZS4gIFRoaXMgbWV0aG9kIGFsbG93cyByZXNwb25zZSBoZWFkZXJzIHRvIGhhdmUgbXVsdGlwbGUKKyAgICAgKiB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0JbmFtZQl0aGUgbmFtZSBvZiB0aGUgaGVhZGVyCisgICAgICogQHBhcmFtCXZhbHVlCXRoZSBhc3NpZ25lZCBpbnRlZ2VyIHZhbHVlCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRJbnRIZWFkZXIKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGFkZEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKTsKKworCisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc3RhdHVzIGNvZGUgZm9yIHRoaXMgcmVzcG9uc2UuICBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvCisgICAgICogc2V0IHRoZSByZXR1cm4gc3RhdHVzIGNvZGUgd2hlbiB0aGVyZSBpcyBubyBlcnJvciAoZm9yIGV4YW1wbGUsCisgICAgICogZm9yIHRoZSBzdGF0dXMgY29kZXMgU0NfT0sgb3IgU0NfTU9WRURfVEVNUE9SQVJJTFkpLiAgSWYgdGhlcmUKKyAgICAgKiBpcyBhbiBlcnJvciwgYW5kIHRoZSBjYWxsZXIgd2lzaGVzIHRvIGludm9rZSBhbiBlcnJvci1wYWdlIGRlZmluZWQKKyAgICAgKiBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLCB0aGUgPGNvZGU+c2VuZEVycm9yPC9jb2RlPiBtZXRob2Qgc2hvdWxkIGJlIHVzZWQKKyAgICAgKiBpbnN0ZWFkLgorICAgICAqIDxwPiBUaGUgY29udGFpbmVyIGNsZWFycyB0aGUgYnVmZmVyIGFuZCBzZXRzIHRoZSBMb2NhdGlvbiBoZWFkZXIsIHByZXNlcnZpbmcKKyAgICAgKiBjb29raWVzIGFuZCBvdGhlciBoZWFkZXJzLgorICAgICAqCisgICAgICogQHBhcmFtCXNjCXRoZSBzdGF0dXMgY29kZQorICAgICAqCisgICAgICogQHNlZSAjc2VuZEVycm9yCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHNjKTsKKyAgCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgdmVyc2lvbiAyLjEsIGR1ZSB0byBhbWJpZ3VvdXMgbWVhbmluZyBvZiB0aGUgCisgICAgICogbWVzc2FnZSBwYXJhbWV0ZXIuIFRvIHNldCBhIHN0YXR1cyBjb2RlIAorICAgICAqIHVzZSA8Y29kZT5zZXRTdGF0dXMoaW50KTwvY29kZT4sIHRvIHNlbmQgYW4gZXJyb3Igd2l0aCBhIGRlc2NyaXB0aW9uCisgICAgICogdXNlIDxjb2RlPnNlbmRFcnJvcihpbnQsIFN0cmluZyk8L2NvZGU+LgorICAgICAqCisgICAgICogU2V0cyB0aGUgc3RhdHVzIGNvZGUgYW5kIG1lc3NhZ2UgZm9yIHRoaXMgcmVzcG9uc2UuCisgICAgICogCisgICAgICogQHBhcmFtCXNjCXRoZSBzdGF0dXMgY29kZQorICAgICAqIEBwYXJhbQlzbQl0aGUgc3RhdHVzIG1lc3NhZ2UKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc2MsIFN0cmluZyBzbSk7CisKKyAgICAKKyAgICAvKgorICAgICAqIFNlcnZlciBzdGF0dXMgY29kZXM7IHNlZSBSRkMgMjA2OC4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgxMDApIGluZGljYXRpbmcgdGhlIGNsaWVudCBjYW4gY29udGludWUuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19DT05USU5VRSA9IDEwMDsKKworICAgIAorICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgxMDEpIGluZGljYXRpbmcgdGhlIHNlcnZlciBpcyBzd2l0Y2hpbmcgcHJvdG9jb2xzCisgICAgICogYWNjb3JkaW5nIHRvIFVwZ3JhZGUgaGVhZGVyLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfU1dJVENISU5HX1BST1RPQ09MUyA9IDEwMTsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgyMDApIGluZGljYXRpbmcgdGhlIHJlcXVlc3Qgc3VjY2VlZGVkIG5vcm1hbGx5LgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfT0sgPSAyMDA7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMjAxKSBpbmRpY2F0aW5nIHRoZSByZXF1ZXN0IHN1Y2NlZWRlZCBhbmQgY3JlYXRlZAorICAgICAqIGEgbmV3IHJlc291cmNlIG9uIHRoZSBzZXJ2ZXIuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19DUkVBVEVEID0gMjAxOworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDIwMikgaW5kaWNhdGluZyB0aGF0IGEgcmVxdWVzdCB3YXMgYWNjZXB0ZWQgZm9yCisgICAgICogcHJvY2Vzc2luZywgYnV0IHdhcyBub3QgY29tcGxldGVkLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfQUNDRVBURUQgPSAyMDI7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMjAzKSBpbmRpY2F0aW5nIHRoYXQgdGhlIG1ldGEgaW5mb3JtYXRpb24gcHJlc2VudGVkCisgICAgICogYnkgdGhlIGNsaWVudCBkaWQgbm90IG9yaWdpbmF0ZSBmcm9tIHRoZSBzZXJ2ZXIuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19OT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTiA9IDIwMzsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgyMDQpIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdCBzdWNjZWVkZWQgYnV0IHRoYXQKKyAgICAgKiB0aGVyZSB3YXMgbm8gbmV3IGluZm9ybWF0aW9uIHRvIHJldHVybi4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX05PX0NPTlRFTlQgPSAyMDQ7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMjA1KSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFnZW50IDxlbT5TSE9VTEQ8L2VtPiByZXNldAorICAgICAqIHRoZSBkb2N1bWVudCB2aWV3IHdoaWNoIGNhdXNlZCB0aGUgcmVxdWVzdCB0byBiZSBzZW50LgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfUkVTRVRfQ09OVEVOVCA9IDIwNTsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgyMDYpIGluZGljYXRpbmcgdGhhdCB0aGUgc2VydmVyIGhhcyBmdWxmaWxsZWQKKyAgICAgKiB0aGUgcGFydGlhbCBHRVQgcmVxdWVzdCBmb3IgdGhlIHJlc291cmNlLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfUEFSVElBTF9DT05URU5UID0gMjA2OworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDMwMCkgaW5kaWNhdGluZyB0aGF0IHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UKKyAgICAgKiBjb3JyZXNwb25kcyB0byBhbnkgb25lIG9mIGEgc2V0IG9mIHJlcHJlc2VudGF0aW9ucywgZWFjaCB3aXRoCisgICAgICogaXRzIG93biBzcGVjaWZpYyBsb2NhdGlvbi4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX01VTFRJUExFX0NIT0lDRVMgPSAzMDA7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMzAxKSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlc291cmNlIGhhcyBwZXJtYW5lbnRseQorICAgICAqIG1vdmVkIHRvIGEgbmV3IGxvY2F0aW9uLCBhbmQgdGhhdCBmdXR1cmUgcmVmZXJlbmNlcyBzaG91bGQgdXNlIGEKKyAgICAgKiBuZXcgVVJJIHdpdGggdGhlaXIgcmVxdWVzdHMuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19NT1ZFRF9QRVJNQU5FTlRMWSA9IDMwMTsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgzMDIpIGluZGljYXRpbmcgdGhhdCB0aGUgcmVzb3VyY2UgaGFzIHRlbXBvcmFyaWx5CisgICAgICogbW92ZWQgdG8gYW5vdGhlciBsb2NhdGlvbiwgYnV0IHRoYXQgZnV0dXJlIHJlZmVyZW5jZXMgc2hvdWxkCisgICAgICogc3RpbGwgdXNlIHRoZSBvcmlnaW5hbCBVUkkgdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIFRoaXMgZGVmaW5pdGlvbiBpcyBiZWluZyByZXRhaW5lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgICAgICogU0NfRk9VTkQgaXMgbm93IHRoZSBwcmVmZXJyZWQgZGVmaW5pdGlvbi4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX01PVkVEX1RFTVBPUkFSSUxZID0gMzAyOworCisgICAgLyoqCisgICAgKiBTdGF0dXMgY29kZSAoMzAyKSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlc291cmNlIHJlc2lkZQorICAgICogdGVtcG9yYXJpbHkgdW5kZXIgYSBkaWZmZXJlbnQgVVJJLiBTaW5jZSB0aGUgcmVkaXJlY3Rpb24gbWlnaHQKKyAgICAqIGJlIGFsdGVyZWQgb24gb2NjYXNpb24sIHRoZSBjbGllbnQgc2hvdWxkIGNvbnRpbnVlIHRvIHVzZSB0aGUKKyAgICAqIFJlcXVlc3QtVVJJIGZvciBmdXR1cmUgcmVxdWVzdHMuKEhUVFAvMS4xKSBUbyByZXByZXNlbnQgdGhlCisgICAgKiBzdGF0dXMgY29kZSAoMzAyKSwgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgdmFyaWFibGUuCisgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0ZPVU5EID0gMzAyOworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDMwMykgaW5kaWNhdGluZyB0aGF0IHRoZSByZXNwb25zZSB0byB0aGUgcmVxdWVzdAorICAgICAqIGNhbiBiZSBmb3VuZCB1bmRlciBhIGRpZmZlcmVudCBVUkkuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19TRUVfT1RIRVIgPSAzMDM7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMzA0KSBpbmRpY2F0aW5nIHRoYXQgYSBjb25kaXRpb25hbCBHRVQgb3BlcmF0aW9uCisgICAgICogZm91bmQgdGhhdCB0aGUgcmVzb3VyY2Ugd2FzIGF2YWlsYWJsZSBhbmQgbm90IG1vZGlmaWVkLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTk9UX01PRElGSUVEID0gMzA0OworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDMwNSkgaW5kaWNhdGluZyB0aGF0IHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UKKyAgICAgKiA8ZW0+TVVTVDwvZW0+IGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIHByb3h5IGdpdmVuIGJ5IHRoZQorICAgICAqIDxjb2RlPjxlbT5Mb2NhdGlvbjwvZW0+PC9jb2RlPiBmaWVsZC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1VTRV9QUk9YWSA9IDMwNTsKKworICAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMzA3KSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSAKKyAgICAgKiByZXNpZGVzIHRlbXBvcmFyaWx5IHVuZGVyIGEgZGlmZmVyZW50IFVSSS4gVGhlIHRlbXBvcmFyeSBVUkkKKyAgICAgKiA8ZW0+U0hPVUxEPC9lbT4gYmUgZ2l2ZW4gYnkgdGhlIDxjb2RlPjxlbT5Mb2NhdGlvbjwvZW0+PC9jb2RlPiAKKyAgICAgKiBmaWVsZCBpbiB0aGUgcmVzcG9uc2UuCisgICAgICovCisKKyAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfVEVNUE9SQVJZX1JFRElSRUNUID0gMzA3OworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQwMCkgaW5kaWNhdGluZyB0aGUgcmVxdWVzdCBzZW50IGJ5IHRoZSBjbGllbnQgd2FzCisgICAgICogc3ludGFjdGljYWxseSBpbmNvcnJlY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19CQURfUkVRVUVTVCA9IDQwMDsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MDEpIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdCByZXF1aXJlcyBIVFRQCisgICAgICogYXV0aGVudGljYXRpb24uCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19VTkFVVEhPUklaRUQgPSA0MDE7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDAyKSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1BBWU1FTlRfUkVRVUlSRUQgPSA0MDI7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDAzKSBpbmRpY2F0aW5nIHRoZSBzZXJ2ZXIgdW5kZXJzdG9vZCB0aGUgcmVxdWVzdAorICAgICAqIGJ1dCByZWZ1c2VkIHRvIGZ1bGZpbGwgaXQuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19GT1JCSURERU4gPSA0MDM7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDA0KSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBpcyBub3QKKyAgICAgKiBhdmFpbGFibGUuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19OT1RfRk9VTkQgPSA0MDQ7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDA1KSBpbmRpY2F0aW5nIHRoYXQgdGhlIG1ldGhvZCBzcGVjaWZpZWQgaW4gdGhlCisgICAgICogPGNvZGU+PGVtPlJlcXVlc3QtTGluZTwvZW0+PC9jb2RlPiBpcyBub3QgYWxsb3dlZCBmb3IgdGhlIHJlc291cmNlCisgICAgICogaWRlbnRpZmllZCBieSB0aGUgPGNvZGU+PGVtPlJlcXVlc3QtVVJJPC9lbT48L2NvZGU+LgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTUVUSE9EX05PVF9BTExPV0VEID0gNDA1OworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQwNikgaW5kaWNhdGluZyB0aGF0IHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoZQorICAgICAqIHJlcXVlc3QgaXMgb25seSBjYXBhYmxlIG9mIGdlbmVyYXRpbmcgcmVzcG9uc2UgZW50aXRpZXMgd2hpY2ggaGF2ZQorICAgICAqIGNvbnRlbnQgY2hhcmFjdGVyaXN0aWNzIG5vdCBhY2NlcHRhYmxlIGFjY29yZGluZyB0byB0aGUgYWNjZXB0CisgICAgICogaGVhZGVycyBzZW50IGluIHRoZSByZXF1ZXN0LgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTk9UX0FDQ0VQVEFCTEUgPSA0MDY7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDA3KSBpbmRpY2F0aW5nIHRoYXQgdGhlIGNsaWVudCA8ZW0+TVVTVDwvZW0+IGZpcnN0CisgICAgICogYXV0aGVudGljYXRlIGl0c2VsZiB3aXRoIHRoZSBwcm94eS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1BST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEID0gNDA3OworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQwOCkgaW5kaWNhdGluZyB0aGF0IHRoZSBjbGllbnQgZGlkIG5vdCBwcm9kdWNlIGEKKyAgICAgKiByZXF1ZXN0IHdpdGhpbiB0aGUgdGltZSB0aGF0IHRoZSBzZXJ2ZXIgd2FzIHByZXBhcmVkIHRvIHdhaXQuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19SRVFVRVNUX1RJTUVPVVQgPSA0MDg7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDA5KSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3QgY291bGQgbm90IGJlCisgICAgICogY29tcGxldGVkIGR1ZSB0byBhIGNvbmZsaWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCisgICAgICogcmVzb3VyY2UuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19DT05GTElDVCA9IDQwOTsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MTApIGluZGljYXRpbmcgdGhhdCB0aGUgcmVzb3VyY2UgaXMgbm8gbG9uZ2VyCisgICAgICogYXZhaWxhYmxlIGF0IHRoZSBzZXJ2ZXIgYW5kIG5vIGZvcndhcmRpbmcgYWRkcmVzcyBpcyBrbm93bi4KKyAgICAgKiBUaGlzIGNvbmRpdGlvbiA8ZW0+U0hPVUxEPC9lbT4gYmUgY29uc2lkZXJlZCBwZXJtYW5lbnQuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19HT05FID0gNDEwOworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQxMSkgaW5kaWNhdGluZyB0aGF0IHRoZSByZXF1ZXN0IGNhbm5vdCBiZSBoYW5kbGVkCisgICAgICogd2l0aG91dCBhIGRlZmluZWQgPGNvZGU+PGVtPkNvbnRlbnQtTGVuZ3RoPC9lbT48L2NvZGU+LgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTEVOR1RIX1JFUVVJUkVEID0gNDExOworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQxMikgaW5kaWNhdGluZyB0aGF0IHRoZSBwcmVjb25kaXRpb24gZ2l2ZW4gaW4gb25lCisgICAgICogb3IgbW9yZSBvZiB0aGUgcmVxdWVzdC1oZWFkZXIgZmllbGRzIGV2YWx1YXRlZCB0byBmYWxzZSB3aGVuIGl0CisgICAgICogd2FzIHRlc3RlZCBvbiB0aGUgc2VydmVyLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfUFJFQ09ORElUSU9OX0ZBSUxFRCA9IDQxMjsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MTMpIGluZGljYXRpbmcgdGhhdCB0aGUgc2VydmVyIGlzIHJlZnVzaW5nIHRvIHByb2Nlc3MKKyAgICAgKiB0aGUgcmVxdWVzdCBiZWNhdXNlIHRoZSByZXF1ZXN0IGVudGl0eSBpcyBsYXJnZXIgdGhhbiB0aGUgc2VydmVyIGlzCisgICAgICogd2lsbGluZyBvciBhYmxlIHRvIHByb2Nlc3MuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19SRVFVRVNUX0VOVElUWV9UT09fTEFSR0UgPSA0MTM7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDE0KSBpbmRpY2F0aW5nIHRoYXQgdGhlIHNlcnZlciBpcyByZWZ1c2luZyB0byBzZXJ2aWNlCisgICAgICogdGhlIHJlcXVlc3QgYmVjYXVzZSB0aGUgPGNvZGU+PGVtPlJlcXVlc3QtVVJJPC9lbT48L2NvZGU+IGlzIGxvbmdlcgorICAgICAqIHRoYW4gdGhlIHNlcnZlciBpcyB3aWxsaW5nIHRvIGludGVycHJldC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1JFUVVFU1RfVVJJX1RPT19MT05HID0gNDE0OworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQxNSkgaW5kaWNhdGluZyB0aGF0IHRoZSBzZXJ2ZXIgaXMgcmVmdXNpbmcgdG8gc2VydmljZQorICAgICAqIHRoZSByZXF1ZXN0IGJlY2F1c2UgdGhlIGVudGl0eSBvZiB0aGUgcmVxdWVzdCBpcyBpbiBhIGZvcm1hdCBub3QKKyAgICAgKiBzdXBwb3J0ZWQgYnkgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBmb3IgdGhlIHJlcXVlc3RlZCBtZXRob2QuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19VTlNVUFBPUlRFRF9NRURJQV9UWVBFID0gNDE1OworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQxNikgaW5kaWNhdGluZyB0aGF0IHRoZSBzZXJ2ZXIgY2Fubm90IHNlcnZlIHRoZQorICAgICAqIHJlcXVlc3RlZCBieXRlIHJhbmdlLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfUkVRVUVTVEVEX1JBTkdFX05PVF9TQVRJU0ZJQUJMRSA9IDQxNjsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MTcpIGluZGljYXRpbmcgdGhhdCB0aGUgc2VydmVyIGNvdWxkIG5vdCBtZWV0IHRoZQorICAgICAqIGV4cGVjdGF0aW9uIGdpdmVuIGluIHRoZSBFeHBlY3QgcmVxdWVzdCBoZWFkZXIuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19FWFBFQ1RBVElPTl9GQUlMRUQgPSA0MTc7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNTAwKSBpbmRpY2F0aW5nIGFuIGVycm9yIGluc2lkZSB0aGUgSFRUUCBzZXJ2ZXIKKyAgICAgKiB3aGljaCBwcmV2ZW50ZWQgaXQgZnJvbSBmdWxmaWxsaW5nIHRoZSByZXF1ZXN0LgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SID0gNTAwOworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDUwMSkgaW5kaWNhdGluZyB0aGUgSFRUUCBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydAorICAgICAqIHRoZSBmdW5jdGlvbmFsaXR5IG5lZWRlZCB0byBmdWxmaWxsIHRoZSByZXF1ZXN0LgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTk9UX0lNUExFTUVOVEVEID0gNTAxOworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDUwMikgaW5kaWNhdGluZyB0aGF0IHRoZSBIVFRQIHNlcnZlciByZWNlaXZlZCBhbgorICAgICAqIGludmFsaWQgcmVzcG9uc2UgZnJvbSBhIHNlcnZlciBpdCBjb25zdWx0ZWQgd2hlbiBhY3RpbmcgYXMgYQorICAgICAqIHByb3h5IG9yIGdhdGV3YXkuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19CQURfR0FURVdBWSA9IDUwMjsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg1MDMpIGluZGljYXRpbmcgdGhhdCB0aGUgSFRUUCBzZXJ2ZXIgaXMKKyAgICAgKiB0ZW1wb3JhcmlseSBvdmVybG9hZGVkLCBhbmQgdW5hYmxlIHRvIGhhbmRsZSB0aGUgcmVxdWVzdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1NFUlZJQ0VfVU5BVkFJTEFCTEUgPSA1MDM7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNTA0KSBpbmRpY2F0aW5nIHRoYXQgdGhlIHNlcnZlciBkaWQgbm90IHJlY2VpdmUKKyAgICAgKiBhIHRpbWVseSByZXNwb25zZSBmcm9tIHRoZSB1cHN0cmVhbSBzZXJ2ZXIgd2hpbGUgYWN0aW5nIGFzCisgICAgICogYSBnYXRld2F5IG9yIHByb3h5LgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfR0FURVdBWV9USU1FT1VUID0gNTA0OworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDUwNSkgaW5kaWNhdGluZyB0aGF0IHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydAorICAgICAqIG9yIHJlZnVzZXMgdG8gc3VwcG9ydCB0aGUgSFRUUCBwcm90b2NvbCB2ZXJzaW9uIHRoYXQgd2FzIHVzZWQKKyAgICAgKiBpbiB0aGUgcmVxdWVzdCBtZXNzYWdlLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfSFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQgPSA1MDU7Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2M2I3YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuaHR0cDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZVdyYXBwZXI7CisKKy8qKgorICogCisgKiBQcm92aWRlcyBhIGNvbnZlbmllbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEh0dHBTZXJ2bGV0UmVzcG9uc2UgaW50ZXJmYWNlIHRoYXQKKyAqIGNhbiBiZSBzdWJjbGFzc2VkIGJ5IGRldmVsb3BlcnMgd2lzaGluZyB0byBhZGFwdCB0aGUgcmVzcG9uc2UgZnJvbSBhIFNlcnZsZXQuCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFdyYXBwZXIgb3IgRGVjb3JhdG9yIHBhdHRlcm4uIE1ldGhvZHMgZGVmYXVsdCB0bworICogY2FsbGluZyB0aHJvdWdoIHRvIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAqIAorICogQGF1dGhvciAJVmFyaW91cworICogQHZlcnNpb24gCSRWZXJzaW9uJAorICAqIEBzaW5jZQl2IDIuMworICoKKyAqIEBzZWUgCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlciBleHRlbmRzIFNlcnZsZXRSZXNwb25zZVdyYXBwZXIgaW1wbGVtZW50cyBIdHRwU2VydmxldFJlc3BvbnNlIHsKKworCisgICAgLyoqIAorICAgICogQ29uc3RydWN0cyBhIHJlc3BvbnNlIGFkYXB0b3Igd3JhcHBpbmcgdGhlIGdpdmVuIHJlc3BvbnNlLgorICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSByZXNwb25zZSBpcyBudWxsCisgICAgKi8KKyAgICBwdWJsaWMgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworCSAgICBzdXBlcihyZXNwb25zZSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXNwb25zZSBfZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpIHsKKwlyZXR1cm4gKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHN1cGVyLmdldFJlc3BvbnNlKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgYWRkQ29va2llKENvb2tpZSBjb29raWUpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvb2tpZShDb29raWUgY29va2llKSB7CisJdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmFkZENvb2tpZShjb29raWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgY29udGFpbnNIZWFkZXIoU3RyaW5nIG5hbWUpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworCisgCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmNvbnRhaW5zSGVhZGVyKG5hbWUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIGVuY29kZVVSTChTdHJpbmcgdXJsKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVSTChTdHJpbmcgdXJsKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5lbmNvZGVVUkwodXJsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZW5jb2RlUmVkaXJlY3RVUkwoU3RyaW5nIHVybCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVSZWRpcmVjdFVSTChTdHJpbmcgdXJsKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5lbmNvZGVSZWRpcmVjdFVSTCh1cmwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgZW5jb2RlVXJsKFN0cmluZyB1cmwpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlVXJsKFN0cmluZyB1cmwpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmVuY29kZVVybCh1cmwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZW5jb2RlUmVkaXJlY3RVcmwoU3RyaW5nIHVybCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVSZWRpcmVjdFVybChTdHJpbmcgdXJsKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5lbmNvZGVSZWRpcmVjdFVybCh1cmwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIHNlbmRFcnJvcihpbnQgc2MsIFN0cmluZyBtc2cpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgc2MsIFN0cmluZyBtc2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNlbmRFcnJvcihzYywgbXNnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIHNlbmRFcnJvcihpbnQgc2MpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworCisKKyAgICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHNjKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXRoaXMuX2dldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5zZW5kRXJyb3Ioc2MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBzZW5kUmVkaXJlY3QoU3RyaW5nIGxvY2F0aW9uKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kUmVkaXJlY3QoU3RyaW5nIGxvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXRoaXMuX2dldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5zZW5kUmVkaXJlY3QobG9jYXRpb24pOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIHNldERhdGVIZWFkZXIoU3RyaW5nIG5hbWUsIGxvbmcgZGF0ZSkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyBkYXRlKSB7CisJdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNldERhdGVIZWFkZXIobmFtZSwgZGF0ZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgYWRkRGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyBkYXRlKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKyAgIHB1YmxpYyB2b2lkIGFkZERhdGVIZWFkZXIoU3RyaW5nIG5hbWUsIGxvbmcgZGF0ZSkgeworCXRoaXMuX2dldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5hZGREYXRlSGVhZGVyKG5hbWUsIGRhdGUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gc2V0SGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisJdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBhZGRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisJdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmFkZEhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgc2V0SW50SGVhZGVyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7CisJdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNldEludEhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgYWRkSW50SGVhZGVyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7CisJdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmFkZEludEhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gY2FsbCBzZXRTdGF0dXMoaW50IHNjKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKworCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzYykgeworCXRoaXMuX2dldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5zZXRTdGF0dXMoc2MpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIHNldFN0YXR1cyhpbnQgc2MsIFN0cmluZyBzbSkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc2MsIFN0cmluZyBzbSkgeworCXRoaXMuX2dldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5zZXRTdGF0dXMoc2MsIHNtKTsKKyAgICB9CisKKyAgIAorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbi5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYTRlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uLmphdmEKQEAgLTAsMCArMSw0MjQgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0Lmh0dHA7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKKworLyoqCisgKgorICogUHJvdmlkZXMgYSB3YXkgdG8gaWRlbnRpZnkgYSB1c2VyIGFjcm9zcyBtb3JlIHRoYW4gb25lIHBhZ2UKKyAqIHJlcXVlc3Qgb3IgdmlzaXQgdG8gYSBXZWIgc2l0ZSBhbmQgdG8gc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhhdCB1c2VyLgorICoKKyAqIDxwPlRoZSBzZXJ2bGV0IGNvbnRhaW5lciB1c2VzIHRoaXMgaW50ZXJmYWNlIHRvIGNyZWF0ZSBhIHNlc3Npb24KKyAqIGJldHdlZW4gYW4gSFRUUCBjbGllbnQgYW5kIGFuIEhUVFAgc2VydmVyLiBUaGUgc2Vzc2lvbiBwZXJzaXN0cworICogZm9yIGEgc3BlY2lmaWVkIHRpbWUgcGVyaW9kLCBhY3Jvc3MgbW9yZSB0aGFuIG9uZSBjb25uZWN0aW9uIG9yCisgKiBwYWdlIHJlcXVlc3QgZnJvbSB0aGUgdXNlci4gQSBzZXNzaW9uIHVzdWFsbHkgY29ycmVzcG9uZHMgdG8gb25lIAorICogdXNlciwgd2hvIG1heSB2aXNpdCBhIHNpdGUgbWFueSB0aW1lcy4gVGhlIHNlcnZlciBjYW4gbWFpbnRhaW4gYSAKKyAqIHNlc3Npb24gaW4gbWFueSB3YXlzIHN1Y2ggYXMgdXNpbmcgY29va2llcyBvciByZXdyaXRpbmcgVVJMcy4KKyAqCisgKiA8cD5UaGlzIGludGVyZmFjZSBhbGxvd3Mgc2VydmxldHMgdG8gCisgKiA8dWw+CisgKiA8bGk+VmlldyBhbmQgbWFuaXB1bGF0ZSBpbmZvcm1hdGlvbiBhYm91dCBhIHNlc3Npb24sIHN1Y2ggYXMKKyAqICAgICB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyLCBjcmVhdGlvbiB0aW1lLCBhbmQgbGFzdCBhY2Nlc3NlZCB0aW1lCisgKiA8bGk+QmluZCBvYmplY3RzIHRvIHNlc3Npb25zLCBhbGxvd2luZyB1c2VyIGluZm9ybWF0aW9uIHRvIHBlcnNpc3QgCisgKiAgICAgYWNyb3NzIG11bHRpcGxlIHVzZXIgY29ubmVjdGlvbnMKKyAqIDwvdWw+CisgKgorICogPHA+V2hlbiBhbiBhcHBsaWNhdGlvbiBzdG9yZXMgYW4gb2JqZWN0IGluIG9yIHJlbW92ZXMgYW4gb2JqZWN0IGZyb20gYQorICogc2Vzc2lvbiwgdGhlIHNlc3Npb24gY2hlY2tzIHdoZXRoZXIgdGhlIG9iamVjdCBpbXBsZW1lbnRzCisgKiB7QGxpbmsgSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXJ9LiBJZiBpdCBkb2VzLCAKKyAqIHRoZSBzZXJ2bGV0IG5vdGlmaWVzIHRoZSBvYmplY3QgdGhhdCBpdCBoYXMgYmVlbiBib3VuZCB0byBvciB1bmJvdW5kIAorICogZnJvbSB0aGUgc2Vzc2lvbi4gTm90aWZpY2F0aW9ucyBhcmUgc2VudCBhZnRlciB0aGUgYmluZGluZyBtZXRob2RzIGNvbXBsZXRlLiAKKyAqIEZvciBzZXNzaW9uIHRoYXQgYXJlIGludmFsaWRhdGVkIG9yIGV4cGlyZSwgbm90aWZpY2F0aW9ucyBhcmUgc2VudCBhZnRlcgorICogdGhlIHNlc3Npb24gaGFzIGJlZW4gaW52YWxpZGF0ZWQgb3IgZXhwaXJlZC4KKyAqCisgKiA8cD4gV2hlbiBjb250YWluZXIgbWlncmF0ZXMgYSBzZXNzaW9uIGJldHdlZW4gVk1zIGluIGEgZGlzdHJpYnV0ZWQgY29udGFpbmVyCisgKiBzZXR0aW5nLCBhbGwgc2Vzc2lvbiBhdHRyaWJ1dGVzIGltcGxlbWVudGluZyB0aGUge0BsaW5rIEh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyfQorICogaW50ZXJmYWNlIGFyZSBub3RpZmllZC4KKyAqIAorICogPHA+QSBzZXJ2bGV0IHNob3VsZCBiZSBhYmxlIHRvIGhhbmRsZSBjYXNlcyBpbiB3aGljaAorICogdGhlIGNsaWVudCBkb2VzIG5vdCBjaG9vc2UgdG8gam9pbiBhIHNlc3Npb24sIHN1Y2ggYXMgd2hlbiBjb29raWVzIGFyZQorICogaW50ZW50aW9uYWxseSB0dXJuZWQgb2ZmLiBVbnRpbCB0aGUgY2xpZW50IGpvaW5zIHRoZSBzZXNzaW9uLAorICogPGNvZGU+aXNOZXc8L2NvZGU+IHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uICBJZiB0aGUgY2xpZW50IGNob29zZXMgCisgKiBub3QgdG8gam9pbgorICogdGhlIHNlc3Npb24sIDxjb2RlPmdldFNlc3Npb248L2NvZGU+IHdpbGwgcmV0dXJuIGEgZGlmZmVyZW50IHNlc3Npb24KKyAqIG9uIGVhY2ggcmVxdWVzdCwgYW5kIDxjb2RlPmlzTmV3PC9jb2RlPiB3aWxsIGFsd2F5cyByZXR1cm4KKyAqIDxjb2RlPnRydWU8L2NvZGU+LgorICoKKyAqIDxwPlNlc3Npb24gaW5mb3JtYXRpb24gaXMgc2NvcGVkIG9ubHkgdG8gdGhlIGN1cnJlbnQgd2ViIGFwcGxpY2F0aW9uCisgKiAoPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+KSwgc28gaW5mb3JtYXRpb24gc3RvcmVkIGluIG9uZSBjb250ZXh0CisgKiB3aWxsIG5vdCBiZSBkaXJlY3RseSB2aXNpYmxlIGluIGFub3RoZXIuCisgKgorICogQGF1dGhvcglWYXJpb3VzCisgKiBAdmVyc2lvbgkkVmVyc2lvbiQKKyAqCisgKgorICogQHNlZSAJSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIKKyAqIEBzZWUgCUh0dHBTZXNzaW9uQ29udGV4dAorICoKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIEh0dHBTZXNzaW9uIHsKKworCisKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyB0aGUgdGltZSB3aGVuIHRoaXMgc2Vzc2lvbiB3YXMgY3JlYXRlZCwgbWVhc3VyZWQKKyAgICAgKiBpbiBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQgSmFudWFyeSAxLCAxOTcwIEdNVC4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCQkJYSA8Y29kZT5sb25nPC9jb2RlPiBzcGVjaWZ5aW5nCisgICAgICogCQkJCQl3aGVuIHRoaXMgc2Vzc2lvbiB3YXMgY3JlYXRlZCwKKyAgICAgKgkJCQkJZXhwcmVzc2VkIGluIAorICAgICAqCQkJCQltaWxsaXNlY29uZHMgc2luY2UgMS8xLzE5NzAgR01UCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbglpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKgkJCQkJaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgbG9uZyBnZXRDcmVhdGlvblRpbWUoKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgYXNzaWduZWQgCisgICAgICogdG8gdGhpcyBzZXNzaW9uLiBUaGUgaWRlbnRpZmllciBpcyBhc3NpZ25lZCAKKyAgICAgKiBieSB0aGUgc2VydmxldCBjb250YWluZXIgYW5kIGlzIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuCQkJCWEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIGlkZW50aWZpZXIKKyAgICAgKgkJCQkJYXNzaWduZWQgdG8gdGhpcyBzZXNzaW9uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbglpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKgkJCQkJaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJldHVybnMgdGhlIGxhc3QgdGltZSB0aGUgY2xpZW50IHNlbnQgYSByZXF1ZXN0IGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgc2Vzc2lvbiwgYXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQKKyAgICAgKiBKYW51YXJ5IDEsIDE5NzAgR01ULCBhbmQgbWFya2VkIGJ5IHRoZSB0aW1lIHRoZSBjb250YWluZXIgcmVjZWl2ZWQgdGhlIHJlcXVlc3QuIAorICAgICAqCisgICAgICogPHA+QWN0aW9ucyB0aGF0IHlvdXIgYXBwbGljYXRpb24gdGFrZXMsIHN1Y2ggYXMgZ2V0dGluZyBvciBzZXR0aW5nCisgICAgICogYSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb24sIGRvIG5vdCBhZmZlY3QgdGhlIGFjY2VzcworICAgICAqIHRpbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJCWEgPGNvZGU+bG9uZzwvY29kZT4KKyAgICAgKgkJCQkJcmVwcmVzZW50aW5nIHRoZSBsYXN0IHRpbWUgCisgICAgICoJCQkJCXRoZSBjbGllbnQgc2VudCBhIHJlcXVlc3QgYXNzb2NpYXRlZAorICAgICAqCQkJCQl3aXRoIHRoaXMgc2Vzc2lvbiwgZXhwcmVzc2VkIGluIAorICAgICAqCQkJCQltaWxsaXNlY29uZHMgc2luY2UgMS8xLzE5NzAgR01UCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbglpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKgkJCQkJaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgbG9uZyBnZXRMYXN0QWNjZXNzZWRUaW1lKCk7CisgICAgCisgICAgCisgICAgLyoqCisgICAgKiBSZXR1cm5zIHRoZSBTZXJ2bGV0Q29udGV4dCB0byB3aGljaCB0aGlzIHNlc3Npb24gYmVsb25ncy4KKyAgICAqICAgIAorICAgICogQHJldHVybiBUaGUgU2VydmxldENvbnRleHQgb2JqZWN0IGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgKiBAc2luY2UgMi4zCisgICAgKi8KKworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpOworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFNwZWNpZmllcyB0aGUgdGltZSwgaW4gc2Vjb25kcywgYmV0d2VlbiBjbGllbnQgcmVxdWVzdHMgYmVmb3JlIHRoZSAKKyAgICAgKiBzZXJ2bGV0IGNvbnRhaW5lciB3aWxsIGludmFsaWRhdGUgdGhpcyBzZXNzaW9uLiAgQSBuZWdhdGl2ZSB0aW1lCisgICAgICogaW5kaWNhdGVzIHRoZSBzZXNzaW9uIHNob3VsZCBuZXZlciB0aW1lb3V0LgorICAgICAqCisgICAgICogQHBhcmFtIGludGVydmFsCQlBbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIG51bWJlcgorICAgICAqIAkJCQlvZiBzZWNvbmRzIAorICAgICAqCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0TWF4SW5hY3RpdmVJbnRlcnZhbChpbnQgaW50ZXJ2YWwpOworCisKKworCisgICAvKioKKyAgICAqIFJldHVybnMgdGhlIG1heGltdW0gdGltZSBpbnRlcnZhbCwgaW4gc2Vjb25kcywgdGhhdCAKKyAgICAqIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciB3aWxsIGtlZXAgdGhpcyBzZXNzaW9uIG9wZW4gYmV0d2VlbiAKKyAgICAqIGNsaWVudCBhY2Nlc3Nlcy4gQWZ0ZXIgdGhpcyBpbnRlcnZhbCwgdGhlIHNlcnZsZXQgY29udGFpbmVyCisgICAgKiB3aWxsIGludmFsaWRhdGUgdGhlIHNlc3Npb24uICBUaGUgbWF4aW11bSB0aW1lIGludGVydmFsIGNhbiBiZSBzZXQKKyAgICAqIHdpdGggdGhlIDxjb2RlPnNldE1heEluYWN0aXZlSW50ZXJ2YWw8L2NvZGU+IG1ldGhvZC4KKyAgICAqIEEgbmVnYXRpdmUgdGltZSBpbmRpY2F0ZXMgdGhlIHNlc3Npb24gc2hvdWxkIG5ldmVyIHRpbWVvdXQuCisgICAgKiAgCisgICAgKgorICAgICogQHJldHVybgkJYW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YKKyAgICAqCQkJc2Vjb25kcyB0aGlzIHNlc3Npb24gcmVtYWlucyBvcGVuCisgICAgKgkJCWJldHdlZW4gY2xpZW50IHJlcXVlc3RzCisgICAgKgorICAgICogQHNlZQkJI3NldE1heEluYWN0aXZlSW50ZXJ2YWwKKyAgICAqCisgICAgKgorICAgICovCisKKyAgICBwdWJsaWMgaW50IGdldE1heEluYWN0aXZlSW50ZXJ2YWwoKTsKKyAgICAKKyAgICAKKworCisgICAvKioKKyAgICAqCisgICAgKiBAZGVwcmVjYXRlZCAJQXMgb2YgVmVyc2lvbiAyLjEsIHRoaXMgbWV0aG9kIGlzCisgICAgKgkJCWRlcHJlY2F0ZWQgYW5kIGhhcyBubyByZXBsYWNlbWVudC4KKyAgICAqCQkJSXQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlCisgICAgKgkJCXZlcnNpb24gb2YgdGhlIEphdmEgU2VydmxldCBBUEkuCisgICAgKgorICAgICovCisKKyAgICBwdWJsaWMgSHR0cFNlc3Npb25Db250ZXh0IGdldFNlc3Npb25Db250ZXh0KCk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSBvYmplY3QgYm91bmQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhpcyBzZXNzaW9uLCBvcgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG9iamVjdCBpcyBib3VuZCB1bmRlciB0aGUgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lCQlhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QKKyAgICAgKgorICAgICAqIEByZXR1cm4JCQl0aGUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbglpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKgkJCQkJaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqCisgICAgICovCisgIAorICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIAlBcyBvZiBWZXJzaW9uIDIuMiwgdGhpcyBtZXRob2QgaXMKKyAgICAgKiAJCQlyZXBsYWNlZCBieSB7QGxpbmsgI2dldEF0dHJpYnV0ZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQkJYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJdGhlIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24JaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICoJCQkJCWludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKgorICAgICAqLworICAKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKFN0cmluZyBuYW1lKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyBhbiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gb2YgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3RzCisgICAgICogY29udGFpbmluZyB0aGUgbmFtZXMgb2YgYWxsIHRoZSBvYmplY3RzIGJvdW5kIHRvIHRoaXMgc2Vzc2lvbi4gCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIAorICAgICAqCQkJCTxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0cyBzcGVjaWZ5aW5nIHRoZQorICAgICAqCQkJCW5hbWVzIG9mIGFsbCB0aGUgb2JqZWN0cyBib3VuZCB0bworICAgICAqCQkJCXRoaXMgc2Vzc2lvbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24JaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICoJCQkJCWludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVOYW1lcygpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCAJQXMgb2YgVmVyc2lvbiAyLjIsIHRoaXMgbWV0aG9kIGlzCisgICAgICogCQkJcmVwbGFjZWQgYnkge0BsaW5rICNnZXRBdHRyaWJ1dGVOYW1lc30KKyAgICAgKgorICAgICAqIEByZXR1cm4JCQkJYW4gYXJyYXkgb2YgPGNvZGU+U3RyaW5nPC9jb2RlPgorICAgICAqCQkJCQlvYmplY3RzIHNwZWNpZnlpbmcgdGhlCisgICAgICoJCQkJCW5hbWVzIG9mIGFsbCB0aGUgb2JqZWN0cyBib3VuZCB0bworICAgICAqCQkJCQl0aGlzIHNlc3Npb24KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCWlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqCQkJCQlpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVOYW1lcygpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogQmluZHMgYW4gb2JqZWN0IHRvIHRoaXMgc2Vzc2lvbiwgdXNpbmcgdGhlIG5hbWUgc3BlY2lmaWVkLgorICAgICAqIElmIGFuIG9iamVjdCBvZiB0aGUgc2FtZSBuYW1lIGlzIGFscmVhZHkgYm91bmQgdG8gdGhlIHNlc3Npb24sCisgICAgICogdGhlIG9iamVjdCBpcyByZXBsYWNlZC4KKyAgICAgKgorICAgICAqIDxwPkFmdGVyIHRoaXMgbWV0aG9kIGV4ZWN1dGVzLCBhbmQgaWYgdGhlIG5ldyBvYmplY3QKKyAgICAgKiBpbXBsZW1lbnRzIDxjb2RlPkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyPC9jb2RlPiwKKyAgICAgKiB0aGUgY29udGFpbmVyIGNhbGxzIAorICAgICAqIDxjb2RlPkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyLnZhbHVlQm91bmQ8L2NvZGU+LiBUaGUgY29udGFpbmVyIHRoZW4gICAKKyAgICAgKiBub3RpZmllcyBhbnkgPGNvZGU+SHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcjwvY29kZT5zIGluIHRoZSB3ZWIgCisgICAgICogYXBwbGljYXRpb24uCisgICAgIAorICAgICAqIDxwPklmIGFuIG9iamVjdCB3YXMgYWxyZWFkeSBib3VuZCB0byB0aGlzIHNlc3Npb24gb2YgdGhpcyBuYW1lCisgICAgICogdGhhdCBpbXBsZW1lbnRzIDxjb2RlPkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyPC9jb2RlPiwgaXRzIAorICAgICAqIDxjb2RlPkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyLnZhbHVlVW5ib3VuZDwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSB2YWx1ZSBwYXNzZWQgaW4gaXMgbnVsbCwgdGhpcyBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNhbGxpbmcgCisgICAgICogPGNvZGU+cmVtb3ZlQXR0cmlidXRlKCk8Y29kZT4uCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lCQkJdGhlIG5hbWUgdG8gd2hpY2ggdGhlIG9iamVjdCBpcyBib3VuZDsKKyAgICAgKgkJCQkJY2Fubm90IGJlIG51bGwKKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQkJCXRoZSBvYmplY3QgdG8gYmUgYm91bmQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCWlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqCQkJCQlpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICoKKyAgICAgKi8KKyAKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSk7CisgICAgCisKKworCisgICAgCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCAJQXMgb2YgVmVyc2lvbiAyLjIsIHRoaXMgbWV0aG9kIGlzCisgICAgICogCQkJcmVwbGFjZWQgYnkge0BsaW5rICNzZXRBdHRyaWJ1dGV9CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQkJCXRoZSBuYW1lIHRvIHdoaWNoIHRoZSBvYmplY3QgaXMgYm91bmQ7CisgICAgICoJCQkJCWNhbm5vdCBiZSBudWxsCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUJCQl0aGUgb2JqZWN0IHRvIGJlIGJvdW5kOyBjYW5ub3QgYmUgbnVsbAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24JaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICoJCQkJCWludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKgorICAgICAqLworIAorICAgIHB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpOworCisKKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJlbW92ZXMgdGhlIG9iamVjdCBib3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBmcm9tCisgICAgICogdGhpcyBzZXNzaW9uLiBJZiB0aGUgc2Vzc2lvbiBkb2VzIG5vdCBoYXZlIGFuIG9iamVjdAorICAgICAqIGJvdW5kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCisgICAgICoKKyAgICAgKiA8cD5BZnRlciB0aGlzIG1ldGhvZCBleGVjdXRlcywgYW5kIGlmIHRoZSBvYmplY3QKKyAgICAgKiBpbXBsZW1lbnRzIDxjb2RlPkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyPC9jb2RlPiwKKyAgICAgKiB0aGUgY29udGFpbmVyIGNhbGxzIAorICAgICAqIDxjb2RlPkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyLnZhbHVlVW5ib3VuZDwvY29kZT4uIFRoZSBjb250YWluZXIKKyAgICAgKiB0aGVuIG5vdGlmaWVzIGFueSA8Y29kZT5IdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyPC9jb2RlPnMgaW4gdGhlIHdlYiAKKyAgICAgKiBhcHBsaWNhdGlvbi4KKyAgICAgKiAKKyAgICAgKiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lCQkJCXRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8KKyAgICAgKgkJCQkJCXJlbW92ZSBmcm9tIHRoaXMgc2Vzc2lvbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24JaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICoJCQkJCWludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSk7CisKKworCisKKworICAgIC8qKgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgCUFzIG9mIFZlcnNpb24gMi4yLCB0aGlzIG1ldGhvZCBpcworICAgICAqIAkJCXJlcGxhY2VkIGJ5IHtAbGluayAjcmVtb3ZlQXR0cmlidXRlfQorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUJCQkJdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0bworICAgICAqCQkJCQkJcmVtb3ZlIGZyb20gdGhpcyBzZXNzaW9uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbglpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKgkJCQkJaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVmFsdWUoU3RyaW5nIG5hbWUpOworCisKKworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBJbnZhbGlkYXRlcyB0aGlzIHNlc3Npb24gdGhlbiB1bmJpbmRzIGFueSBvYmplY3RzIGJvdW5kCisgICAgICogdG8gaXQuIAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24JaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICoJCQkJCWFscmVhZHkgaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjbGllbnQgZG9lcyBub3QgeWV0IGtub3cgYWJvdXQgdGhlCisgICAgICogc2Vzc2lvbiBvciBpZiB0aGUgY2xpZW50IGNob29zZXMgbm90IHRvIGpvaW4gdGhlIHNlc3Npb24uICBGb3IgCisgICAgICogZXhhbXBsZSwgaWYgdGhlIHNlcnZlciB1c2VkIG9ubHkgY29va2llLWJhc2VkIHNlc3Npb25zLCBhbmQKKyAgICAgKiB0aGUgY2xpZW50IGhhZCBkaXNhYmxlZCB0aGUgdXNlIG9mIGNvb2tpZXMsIHRoZW4gYSBzZXNzaW9uIHdvdWxkCisgICAgICogYmUgbmV3IG9uIGVhY2ggcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gCQkJCTxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSAKKyAgICAgKgkJCQkJc2VydmVyIGhhcyBjcmVhdGVkIGEgc2Vzc2lvbiwgCisgICAgICoJCQkJCWJ1dCB0aGUgY2xpZW50IGhhcyBub3QgeWV0IGpvaW5lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24JaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICoJCQkJCWFscmVhZHkgaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc05ldygpOworCisKKworfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlhOWYwMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldC5odHRwOworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CisKKyAgICAvKiogT2JqZWN0cyB0aGF0IGFyZSBib3VuZCB0byBhIHNlc3Npb24gbWF5IGxpc3RlbiB0byBjb250YWluZXIKKyAgICAqKiBldmVudHMgbm90aWZ5aW5nIHRoZW0gdGhhdCBzZXNzaW9ucyB3aWxsIGJlIHBhc3NpdmF0ZWQgYW5kIHRoYXQKKyAgICAqKiBzZXNzaW9uIHdpbGwgYmUgYWN0aXZhdGVkLiBBIGNvbnRhaW5lciB0aGF0IG1pZ3JhdGVzIHNlc3Npb24gYmV0d2VlbiBWTXMKKyAgICAqKiBvciBwZXJzaXN0cyBzZXNzaW9ucyBpcyByZXF1aXJlZCB0byBub3RpZnkgYWxsIGF0dHJpYnV0ZXMgYm91bmQgdG8gc2Vzc2lvbnMKKyAgICAqKiBpbXBsZW1lbnRpbmcgSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXIuCisgICAgKioKKyAgICAqIEBzaW5jZSAyLjMKKyAgICAqLworICAgIAorcHVibGljIGludGVyZmFjZSBIdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgeyAKKworICAgIC8qKiBOb3RpZmljYXRpb24gdGhhdCB0aGUgc2Vzc2lvbiBpcyBhYm91dCB0byBiZSBwYXNzaXZhdGVkLiovCisgICAgcHVibGljIHZvaWQgc2Vzc2lvbldpbGxQYXNzaXZhdGUoSHR0cFNlc3Npb25FdmVudCBzZSk7IAorICAgIC8qKiBOb3RpZmljYXRpb24gdGhhdCB0aGUgc2Vzc2lvbiBoYXMganVzdCBiZWVuIGFjdGl2YXRlZC4qLworICAgIHB1YmxpYyB2b2lkIHNlc3Npb25EaWRBY3RpdmF0ZShIdHRwU2Vzc2lvbkV2ZW50IHNlKTsKK30gCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyNTdhNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0Lmh0dHA7CisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKKworCS8qKiBUaGlzIGxpc3RlbmVyIGludGVyZmFjZSBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gb3JkZXIgdG8KKwkqIGdldCBub3RpZmljYXRpb25zIG9mIGNoYW5nZXMgdG8gdGhlIGF0dHJpYnV0ZSBsaXN0cyBvZiBzZXNzaW9ucyB3aXRoaW4KKwkqIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorCSogQHNpbmNlCXYgMi4zCisqLworCitwdWJsaWMgaW50ZXJmYWNlIEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKKwkvKiogTm90aWZpY2F0aW9uIHRoYXQgYW4gYXR0cmlidXRlIGhhcyBiZWVuIGFkZGVkIHRvIGEgc2Vzc2lvbi4gQ2FsbGVkIGFmdGVyIHRoZSBhdHRyaWJ1dGUgaXMgYWRkZWQuKi8KKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVBZGRlZCAoIEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IHNlICk7CisJLyoqIE5vdGlmaWNhdGlvbiB0aGF0IGFuIGF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gYSBzZXNzaW9uLiBDYWxsZWQgYWZ0ZXIgdGhlIGF0dHJpYnV0ZSBpcyByZW1vdmVkLiAqLworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZVJlbW92ZWQgKCBIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBzZSApOworCS8qKiBOb3RpZmljYXRpb24gdGhhdCBhbiBhdHRyaWJ1dGUgaGFzIGJlZW4gcmVwbGFjZWQgaW4gYSBzZXNzaW9uLiBDYWxsZWQgYWZ0ZXIgdGhlIGF0dHJpYnV0ZSBpcyByZXBsYWNlZC4gKi8KKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZXBsYWNlZCAoIEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IHNlICk7CisKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkJpbmRpbmdFdmVudC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkJpbmRpbmdFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzJmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uQmluZGluZ0V2ZW50LmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuaHR0cDsKKworCisKKy8qKgorICoKKyAqIEV2ZW50cyBvZiB0aGlzIHR5cGUgYXJlIGVpdGhlciBzZW50IHRvIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMKKyAqIHtAbGluayBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcn0gd2hlbiBpdCBpcyBib3VuZCBvciAKKyAqIHVuYm91bmQgZnJvbSBhIHNlc3Npb24sIG9yIHRvIGEge0BsaW5rIEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXJ9IAorICogdGhhdCBoYXMgYmVlbiBjb25maWd1cmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igd2hlbiBhbnkgYXR0cmlidXRlIGlzCisgKiBib3VuZCwgdW5ib3VuZCBvciByZXBsYWNlZCBpbiBhIHNlc3Npb24uCisgKgorICogPHA+VGhlIHNlc3Npb24gYmluZHMgdGhlIG9iamVjdCBieSBhIGNhbGwgdG8KKyAqIDxjb2RlPkh0dHBTZXNzaW9uLnNldEF0dHJpYnV0ZTwvY29kZT4gYW5kIHVuYmluZHMgdGhlIG9iamVjdAorICogYnkgYSBjYWxsIHRvIDxjb2RlPkh0dHBTZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZTwvY29kZT4uCisgKgorICoKKyAqCisgKiBAYXV0aG9yCQlWYXJpb3VzCisgKiBAdmVyc2lvbgkJJFZlcnNpb24kCisgKiAKKyAqIEBzZWUgCQlIdHRwU2Vzc2lvbgorICogQHNlZSAJCUh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyCisgKiBAc2VlCQkJSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcgorICovCisKK3B1YmxpYyBjbGFzcyBIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBleHRlbmRzIEh0dHBTZXNzaW9uRXZlbnQgeworCisKKworCisgICAgLyogVGhlIG5hbWUgdG8gd2hpY2ggdGhlIG9iamVjdCBpcyBiZWluZyBib3VuZCBvciB1bmJvdW5kICovCisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIAorICAgIC8qIFRoZSBvYmplY3QgaXMgYmVpbmcgYm91bmQgb3IgdW5ib3VuZCAqLworCisgICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7CisgICAgCisgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGV2ZW50IHRoYXQgbm90aWZpZXMgYW4gb2JqZWN0IHRoYXQgaXQKKyAgICAgKiBoYXMgYmVlbiBib3VuZCB0byBvciB1bmJvdW5kIGZyb20gYSBzZXNzaW9uLiAKKyAgICAgKiBUbyByZWNlaXZlIHRoZSBldmVudCwgdGhlIG9iamVjdCBtdXN0IGltcGxlbWVudAorICAgICAqIHtAbGluayBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcn0uCisgICAgICoKKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb24gCXRoZSBzZXNzaW9uIHRvIHdoaWNoIHRoZSBvYmplY3QgaXMgYm91bmQgb3IgdW5ib3VuZAorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgCXRoZSBuYW1lIHdpdGggd2hpY2ggdGhlIG9iamVjdCBpcyBib3VuZCBvciB1bmJvdW5kCisgICAgICoKKyAgICAgKiBAc2VlCQkJI2dldE5hbWUKKyAgICAgKiBAc2VlCQkJI2dldFNlc3Npb24KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50KEh0dHBTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBuYW1lKSB7CisJc3VwZXIoc2Vzc2lvbik7CisJdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICoKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGV2ZW50IHRoYXQgbm90aWZpZXMgYW4gb2JqZWN0IHRoYXQgaXQKKyAgICAgKiBoYXMgYmVlbiBib3VuZCB0byBvciB1bmJvdW5kIGZyb20gYSBzZXNzaW9uLiAKKyAgICAgKiBUbyByZWNlaXZlIHRoZSBldmVudCwgdGhlIG9iamVjdCBtdXN0IGltcGxlbWVudAorICAgICAqIHtAbGluayBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcn0uCisgICAgICoKKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb24gCXRoZSBzZXNzaW9uIHRvIHdoaWNoIHRoZSBvYmplY3QgaXMgYm91bmQgb3IgdW5ib3VuZAorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgCXRoZSBuYW1lIHdpdGggd2hpY2ggdGhlIG9iamVjdCBpcyBib3VuZCBvciB1bmJvdW5kCisgICAgICoKKyAgICAgKiBAc2VlCQkJI2dldE5hbWUKKyAgICAgKiBAc2VlCQkJI2dldFNlc3Npb24KKyAgICAgKgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudChIdHRwU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisJc3VwZXIoc2Vzc2lvbik7CisJdGhpcy5uYW1lID0gbmFtZTsKKwl0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIAorICAgCS8qKiBSZXR1cm4gdGhlIHNlc3Npb24gdGhhdCBjaGFuZ2VkLiAqLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uICgpIHsgCisJcmV0dXJuIHN1cGVyLmdldFNlc3Npb24oKTsKKyAgICB9CisgCisgICAKKyAgCisgICAgCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIHdpdGggd2hpY2ggdGhlIGF0dHJpYnV0ZSBpcyBib3VuZCB0byBvcgorICAgICAqIHVuYm91bmQgZnJvbSB0aGUgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybgkJYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgbmFtZSB3aXRoIHdoaWNoCisgICAgICoJCQl0aGUgb2JqZWN0IGlzIGJvdW5kIHRvIG9yIHVuYm91bmQgZnJvbQorICAgICAqCQkJdGhlIHNlc3Npb24KKyAgICAgKgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJcmV0dXJuIG5hbWU7CisgICAgfQorICAgIAorICAgIC8qKgorCSogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IGhhcyBiZWVuIGFkZGVkLCByZW1vdmVkIG9yIHJlcGxhY2VkLgorCSogSWYgdGhlIGF0dHJpYnV0ZSB3YXMgYWRkZWQgKG9yIGJvdW5kKSwgdGhpcyBpcyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gSWYgdGhlIGF0dHJpYnV0ZSB3YXMKKwkqIHJlbW92ZWQgKG9yIHVuYm91bmQpLCB0aGlzIGlzIHRoZSB2YWx1ZSBvZiB0aGUgcmVtb3ZlZCBhdHRyaWJ1dGUuIElmIHRoZSBhdHRyaWJ1dGUgd2FzIHJlcGxhY2VkLCB0aGlzCisJKiBpcyB0aGUgb2xkIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCisJKgorICAgICAgICAqIEBzaW5jZSAyLjMKKwkqLworCQorCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisJICAgIHJldHVybiB0aGlzLnZhbHVlOyAgIAorCX0KKyAgICAKK30KKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MmIyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXguc2VydmxldC5odHRwOworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CisKKworIAorIAorCisvKioKKyAqIENhdXNlcyBhbiBvYmplY3QgdG8gYmUgbm90aWZpZWQgd2hlbiBpdCBpcyBib3VuZCB0bworICogb3IgdW5ib3VuZCBmcm9tIGEgc2Vzc2lvbi4gVGhlIG9iamVjdCBpcyBub3RpZmllZAorICogYnkgYW4ge0BsaW5rIEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50fSBvYmplY3QuIFRoaXMgbWF5IGJlIGFzIGEgcmVzdWx0CisgKiBvZiBhIHNlcnZsZXQgcHJvZ3JhbW1lciBleHBsaWNpdGx5IHVuYmluZGluZyBhbiBhdHRyaWJ1dGUgZnJvbSBhIHNlc3Npb24sCisgKiBkdWUgdG8gYSBzZXNzaW9uIGJlaW5nIGludmFsaWRhdGVkLCBvciBkdWUgdG8gYSBzZXNzaW9uIHRpbWluZyBvdXQuCisgKgorICoKKyAqIEBhdXRob3IJCVZhcmlvdXMKKyAqIEB2ZXJzaW9uCQkkVmVyc2lvbiQKKyAqCisgKiBAc2VlIEh0dHBTZXNzaW9uCisgKiBAc2VlIEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50CisgKgorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIE5vdGlmaWVzIHRoZSBvYmplY3QgdGhhdCBpdCBpcyBiZWluZyBib3VuZCB0bworICAgICAqIGEgc2Vzc2lvbiBhbmQgaWRlbnRpZmllcyB0aGUgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudAkJdGhlIGV2ZW50IHRoYXQgaWRlbnRpZmllcyB0aGUKKyAgICAgKgkJCQlzZXNzaW9uIAorICAgICAqCisgICAgICogQHNlZSAjdmFsdWVVbmJvdW5kCisgICAgICoKKyAgICAgKi8gCisKKyAgICBwdWJsaWMgdm9pZCB2YWx1ZUJvdW5kKEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50KTsKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogTm90aWZpZXMgdGhlIG9iamVjdCB0aGF0IGl0IGlzIGJlaW5nIHVuYm91bmQKKyAgICAgKiBmcm9tIGEgc2Vzc2lvbiBhbmQgaWRlbnRpZmllcyB0aGUgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudAkJdGhlIGV2ZW50IHRoYXQgaWRlbnRpZmllcworICAgICAqCQkJCXRoZSBzZXNzaW9uIAorICAgICAqCQorICAgICAqIEBzZWUgI3ZhbHVlQm91bmQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgdmFsdWVVbmJvdW5kKEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50KTsKKyAgICAKKyAgICAKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkNvbnRleHQuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb25Db250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgxMGFiYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb25Db250ZXh0LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcGFja2FnZSBqYXZheC5zZXJ2bGV0Lmh0dHA7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKKy8qKgorICoKKyAqIEBhdXRob3IJCVZhcmlvdXMKKyAqIEB2ZXJzaW9uCQkkVmVyc2lvbiQKKyAqCisgKiBAZGVwcmVjYXRlZAkJQXMgb2YgSmF2YSh0bSkgU2VydmxldCBBUEkgMi4xCisgKgkJCWZvciBzZWN1cml0eSByZWFzb25zLCB3aXRoIG5vIHJlcGxhY2VtZW50LgorICoJCQlUaGlzIGludGVyZmFjZSB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUKKyAqCQkJdmVyc2lvbiBvZiB0aGlzIEFQSS4KKyAqCisgKiBAc2VlCQkJSHR0cFNlc3Npb24KKyAqIEBzZWUJCQlIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudAorICogQHNlZQkJCUh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyCisgKgorICovCisKKworcHVibGljIGludGVyZmFjZSBIdHRwU2Vzc2lvbkNvbnRleHQgeworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCAJQXMgb2YgSmF2YSBTZXJ2bGV0IEFQSSAyLjEgd2l0aAorICAgICAqCQkJbm8gcmVwbGFjZW1lbnQuIFRoaXMgbWV0aG9kIG11c3QgCisgICAgICoJCQlyZXR1cm4gbnVsbCBhbmQgd2lsbCBiZSByZW1vdmVkIGluCisgICAgICoJCQlhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoaXMgQVBJLgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbihTdHJpbmcgc2Vzc2lvbklkKTsKKyAgICAKKyAgICAKKyAgICAKKyAgCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZAlBcyBvZiBKYXZhIFNlcnZsZXQgQVBJIDIuMSB3aXRoCisgICAgICoJCQlubyByZXBsYWNlbWVudC4gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gCisgICAgICoJCQlhbiBlbXB0eSA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gYW5kIHdpbGwgYmUgcmVtb3ZlZAorICAgICAqCQkJaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGlzIEFQSS4KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldElkcygpOworfQorCisKKworCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb25FdmVudC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0MzU5YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb25FdmVudC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0Lmh0dHA7CisKKworCS8qKiBUaGlzIGlzIHRoZSBjbGFzcyByZXByZXNlbnRpbmcgZXZlbnQgbm90aWZpY2F0aW9ucyBmb3IKKwkqIGNoYW5nZXMgdG8gc2Vzc2lvbnMgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgorCSAqIEBzaW5jZQl2IDIuMworCSovCitwdWJsaWMgY2xhc3MgSHR0cFNlc3Npb25FdmVudCBleHRlbmRzIGphdmEudXRpbC5FdmVudE9iamVjdCB7CisJLyoqIENvbnN0cnVjdCBhIHNlc3Npb24gZXZlbnQgZnJvbSB0aGUgZ2l2ZW4gc291cmNlLiovCisJIHB1YmxpYyBIdHRwU2Vzc2lvbkV2ZW50KEh0dHBTZXNzaW9uIHNvdXJjZSkgeworCQlzdXBlcihzb3VyY2UpOworfQorCS8qKiBSZXR1cm4gdGhlIHNlc3Npb24gdGhhdCBjaGFuZ2VkLiovCisgICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24gKCkgeyAKKwlyZXR1cm4gKEh0dHBTZXNzaW9uKSBzdXBlci5nZXRTb3VyY2UoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb25MaXN0ZW5lci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIyZmE3OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb25MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0Lmh0dHA7CisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKKworCS8qKiAKKwkqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBhcmUgbm90aWZpZWQgb2YgY2hhbmdlcyB0byB0aGUgCisJKiBsaXN0IG9mIGFjdGl2ZSBzZXNzaW9ucyBpbiBhIHdlYiBhcHBsaWNhdGlvbi4KKwkqIFRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIGV2ZW50cywgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzCisJKiBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbi4KKwkqIEBzZWUgSHR0cFNlc3Npb25FdmVudAorCSAqIEBzaW5jZQl2IDIuMworCSovCisKK3B1YmxpYyBpbnRlcmZhY2UgSHR0cFNlc3Npb25MaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgeworICAgIAorCS8qKiAKKwkqIE5vdGlmaWNhdGlvbiB0aGF0IGEgc2Vzc2lvbiB3YXMgY3JlYXRlZC4KKwkqIEBwYXJhbSBzZSB0aGUgbm90aWZpY2F0aW9uIGV2ZW50CisJKi8KKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uQ3JlYXRlZCAoIEh0dHBTZXNzaW9uRXZlbnQgc2UgKTsKKyAgICAKKwkvKiogCisJKiBOb3RpZmljYXRpb24gdGhhdCBhIHNlc3Npb24gaXMgYWJvdXQgdG8gYmUgaW52YWxpZGF0ZWQuCisJKiBAcGFyYW0gc2UgdGhlIG5vdGlmaWNhdGlvbiBldmVudAorCSovCisgICAgcHVibGljIHZvaWQgc2Vzc2lvbkRlc3Ryb3llZCAoIEh0dHBTZXNzaW9uRXZlbnQgc2UgKTsKKyAgICAKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwVXRpbHMuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJiY2U4MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFV0aWxzLmphdmEKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuaHR0cDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldElucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBAZGVwcmVjYXRlZAkJQXMgb2YgSmF2YSh0bSkgU2VydmxldCBBUEkgMi4zLiAKKyAqCQkJVGhlc2UgbWV0aG9kcyB3ZXJlIG9ubHkgdXNlZnVsCisgKgkJCXdpdGggdGhlIGRlZmF1bHQgZW5jb2RpbmcgYW5kIGhhdmUgYmVlbiBtb3ZlZAorICoJCQl0byB0aGUgcmVxdWVzdCBpbnRlcmZhY2VzLgorICoKKyovCisKKworcHVibGljIGNsYXNzIEh0dHBVdGlscyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFNUUklOR19GSUxFID0KKwkiamF2YXguc2VydmxldC5odHRwLkxvY2FsU3RyaW5ncyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgbFN0cmluZ3MgPQorCVJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShMU1RSSU5HX0ZJTEUpOworICAgICAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IDxjb2RlPkh0dHBVdGlsczwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgSHR0cFV0aWxzKCkge30KKyAgICAKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogUGFyc2VzIGEgcXVlcnkgc3RyaW5nIHBhc3NlZCBmcm9tIHRoZSBjbGllbnQgdG8gdGhlCisgICAgICogc2VydmVyIGFuZCBidWlsZHMgYSA8Y29kZT5IYXNoVGFibGU8L2NvZGU+IG9iamVjdAorICAgICAqIHdpdGgga2V5LXZhbHVlIHBhaXJzLiAKKyAgICAgKiBUaGUgcXVlcnkgc3RyaW5nIHNob3VsZCBiZSBpbiB0aGUgZm9ybSBvZiBhIHN0cmluZworICAgICAqIHBhY2thZ2VkIGJ5IHRoZSBHRVQgb3IgUE9TVCBtZXRob2QsIHRoYXQgaXMsIGl0CisgICAgICogc2hvdWxkIGhhdmUga2V5LXZhbHVlIHBhaXJzIGluIHRoZSBmb3JtIDxpPmtleT12YWx1ZTwvaT4sCisgICAgICogd2l0aCBlYWNoIHBhaXIgc2VwYXJhdGVkIGZyb20gdGhlIG5leHQgYnkgYSAmYW1wOyBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiA8cD5BIGtleSBjYW4gYXBwZWFyIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBxdWVyeSBzdHJpbmcKKyAgICAgKiB3aXRoIGRpZmZlcmVudCB2YWx1ZXMuIEhvd2V2ZXIsIHRoZSBrZXkgYXBwZWFycyBvbmx5IG9uY2UgaW4gCisgICAgICogdGhlIGhhc2h0YWJsZSwgd2l0aCBpdHMgdmFsdWUgYmVpbmcKKyAgICAgKiBhbiBhcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIG11bHRpcGxlIHZhbHVlcyBzZW50CisgICAgICogYnkgdGhlIHF1ZXJ5IHN0cmluZy4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUga2V5cyBhbmQgdmFsdWVzIGluIHRoZSBoYXNodGFibGUgYXJlIHN0b3JlZCBpbiB0aGVpcgorICAgICAqIGRlY29kZWQgZm9ybSwgc28KKyAgICAgKiBhbnkgKyBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQgdG8gc3BhY2VzLCBhbmQgY2hhcmFjdGVycworICAgICAqIHNlbnQgaW4gaGV4YWRlY2ltYWwgbm90YXRpb24gKGxpa2UgPGk+JXh4PC9pPikgYXJlCisgICAgICogY29udmVydGVkIHRvIEFTQ0lJIGNoYXJhY3RlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcwkJYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcXVlcnkgdG8gYmUgcGFyc2VkCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPkhhc2hUYWJsZTwvY29kZT4gb2JqZWN0IGJ1aWx0CisgICAgICogCQkJZnJvbSB0aGUgcGFyc2VkIGtleS12YWx1ZSBwYWlycworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24JaWYgdGhlIHF1ZXJ5IHN0cmluZyAKKyAgICAgKgkJCQkJCWlzIGludmFsaWQKKyAgICAgKgorICAgICAqLworCisgICAgc3RhdGljIHB1YmxpYyBIYXNodGFibGUgcGFyc2VRdWVyeVN0cmluZyhTdHJpbmcgcykgeworCisJU3RyaW5nIHZhbEFycmF5W10gPSBudWxsOworCQorCWlmIChzID09IG51bGwpIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCX0KKwlIYXNodGFibGUgaHQgPSBuZXcgSGFzaHRhYmxlKCk7CisJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocywgIiYiKTsKKwl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisJICAgIFN0cmluZyBwYWlyID0gKFN0cmluZylzdC5uZXh0VG9rZW4oKTsKKwkgICAgaW50IHBvcyA9IHBhaXIuaW5kZXhPZignPScpOworCSAgICBpZiAocG9zID09IC0xKSB7CisJCS8vIFhYWAorCQkvLyBzaG91bGQgZ2l2ZSBtb3JlIGRldGFpbCBhYm91dCB0aGUgaWxsZWdhbCBhcmd1bWVudAorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJICAgIH0KKwkgICAgU3RyaW5nIGtleSA9IHBhcnNlTmFtZShwYWlyLnN1YnN0cmluZygwLCBwb3MpLCBzYik7CisJICAgIFN0cmluZyB2YWwgPSBwYXJzZU5hbWUocGFpci5zdWJzdHJpbmcocG9zKzEsIHBhaXIubGVuZ3RoKCkpLCBzYik7CisJICAgIGlmIChodC5jb250YWluc0tleShrZXkpKSB7CisJCVN0cmluZyBvbGRWYWxzW10gPSAoU3RyaW5nIFtdKSBodC5nZXQoa2V5KTsKKwkJdmFsQXJyYXkgPSBuZXcgU3RyaW5nW29sZFZhbHMubGVuZ3RoICsgMV07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkVmFscy5sZW5ndGg7IGkrKykgCisJCSAgICB2YWxBcnJheVtpXSA9IG9sZFZhbHNbaV07CisJCXZhbEFycmF5W29sZFZhbHMubGVuZ3RoXSA9IHZhbDsKKwkgICAgfSBlbHNlIHsKKwkJdmFsQXJyYXkgPSBuZXcgU3RyaW5nWzFdOworCQl2YWxBcnJheVswXSA9IHZhbDsKKwkgICAgfQorCSAgICBodC5wdXQoa2V5LCB2YWxBcnJheSk7CisJfQorCXJldHVybiBodDsKKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFBhcnNlcyBkYXRhIGZyb20gYW4gSFRNTCBmb3JtIHRoYXQgdGhlIGNsaWVudCBzZW5kcyB0byAKKyAgICAgKiB0aGUgc2VydmVyIHVzaW5nIHRoZSBIVFRQIFBPU1QgbWV0aG9kIGFuZCB0aGUgCisgICAgICogPGk+YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkPC9pPiBNSU1FIHR5cGUuCisgICAgICoKKyAgICAgKiA8cD5UaGUgZGF0YSBzZW50IGJ5IHRoZSBQT1NUIG1ldGhvZCBjb250YWlucyBrZXktdmFsdWUKKyAgICAgKiBwYWlycy4gQSBrZXkgY2FuIGFwcGVhciBtb3JlIHRoYW4gb25jZSBpbiB0aGUgUE9TVCBkYXRhCisgICAgICogd2l0aCBkaWZmZXJlbnQgdmFsdWVzLiBIb3dldmVyLCB0aGUga2V5IGFwcGVhcnMgb25seSBvbmNlIGluIAorICAgICAqIHRoZSBoYXNodGFibGUsIHdpdGggaXRzIHZhbHVlIGJlaW5nCisgICAgICogYW4gYXJyYXkgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRoZSBtdWx0aXBsZSB2YWx1ZXMgc2VudAorICAgICAqIGJ5IHRoZSBQT1NUIG1ldGhvZC4KKyAgICAgKgorICAgICAqIDxwPlRoZSBrZXlzIGFuZCB2YWx1ZXMgaW4gdGhlIGhhc2h0YWJsZSBhcmUgc3RvcmVkIGluIHRoZWlyCisgICAgICogZGVjb2RlZCBmb3JtLCBzbworICAgICAqIGFueSArIGNoYXJhY3RlcnMgYXJlIGNvbnZlcnRlZCB0byBzcGFjZXMsIGFuZCBjaGFyYWN0ZXJzCisgICAgICogc2VudCBpbiBoZXhhZGVjaW1hbCBub3RhdGlvbiAobGlrZSA8aT4leHg8L2k+KSBhcmUKKyAgICAgKiBjb252ZXJ0ZWQgdG8gQVNDSUkgY2hhcmFjdGVycy4KKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVuCWFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgbGVuZ3RoLAorICAgICAqCQkJaW4gY2hhcmFjdGVycywgb2YgdGhlIAorICAgICAqCQkJPGNvZGU+U2VydmxldElucHV0U3RyZWFtPC9jb2RlPgorICAgICAqCQkJb2JqZWN0IHRoYXQgaXMgYWxzbyBwYXNzZWQgdG8gdGhpcworICAgICAqCQkJbWV0aG9kCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4JdGhlIDxjb2RlPlNlcnZsZXRJbnB1dFN0cmVhbTwvY29kZT4KKyAgICAgKgkJCW9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIHNlbnQKKyAgICAgKgkJCWZyb20gdGhlIGNsaWVudAorICAgICAqIAorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+SGFzaFRhYmxlPC9jb2RlPiBvYmplY3QgYnVpbHQKKyAgICAgKgkJCWZyb20gdGhlIHBhcnNlZCBrZXktdmFsdWUgcGFpcnMKKyAgICAgKgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24JaWYgdGhlIGRhdGEKKyAgICAgKgkJCXNlbnQgYnkgdGhlIFBPU1QgbWV0aG9kIGlzIGludmFsaWQKKyAgICAgKgorICAgICAqLworICAgICAKKworICAgIHN0YXRpYyBwdWJsaWMgSGFzaHRhYmxlIHBhcnNlUG9zdERhdGEoaW50IGxlbiwgCisJCQkJCSAgU2VydmxldElucHV0U3RyZWFtIGluKQorICAgIHsKKwkvLyBYWFgKKwkvLyBzaG91bGQgYSBsZW5ndGggb2YgMCBiZSBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkKKwlpZiAobGVuIDw9MCkKKwkgICAgcmV0dXJuIG5ldyBIYXNodGFibGUoKTsgLy8gY2hlYXAgaGFjayB0byByZXR1cm4gYW4gZW1wdHkgaGFzaAorCisJaWYgKGluID09IG51bGwpIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCX0KKwkKKwkvLworCS8vIE1ha2Ugc3VyZSB3ZSByZWFkIHRoZSBlbnRpcmUgUE9TVGVkIGJvZHkuCisJLy8KKyAgICAgICAgYnl0ZVtdIHBvc3RlZEJ5dGVzID0gbmV3IGJ5dGUgW2xlbl07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgICAKKwkgICAgZG8geworCQlpbnQgaW5wdXRMZW4gPSBpbi5yZWFkIChwb3N0ZWRCeXRlcywgb2Zmc2V0LCBsZW4gLSBvZmZzZXQpOworCQlpZiAoaW5wdXRMZW4gPD0gMCkgeworCQkgICAgU3RyaW5nIG1zZyA9IGxTdHJpbmdzLmdldFN0cmluZygiZXJyLmlvLnNob3J0X3JlYWQiKTsKKwkJICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gKG1zZyk7CisJCX0KKwkJb2Zmc2V0ICs9IGlucHV0TGVuOworCSAgICB9IHdoaWxlICgobGVuIC0gb2Zmc2V0KSA+IDApOworCisJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKwl9CisKKyAgICAgICAgLy8gWFhYIHdlIHNob3VsZG4ndCBhc3N1bWUgdGhhdCB0aGUgb25seSBraW5kIG9mIFBPU1QgYm9keQorICAgICAgICAvLyBpcyBGT1JNIGRhdGEgZW5jb2RlZCB1c2luZyBBU0NJSSBvciBJU08gTGF0aW4vMSAuLi4gb3IKKyAgICAgICAgLy8gdGhhdCB0aGUgYm9keSBzaG91bGQgYWx3YXlzIGJlIHRyZWF0ZWQgYXMgRk9STSBkYXRhLgorICAgICAgICAvLworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgcG9zdGVkQm9keSA9IG5ldyBTdHJpbmcocG9zdGVkQnl0ZXMsIDAsIGxlbiwgIjg4NTlfMSIpOworICAgICAgICAgICAgcmV0dXJuIHBhcnNlUXVlcnlTdHJpbmcocG9zdGVkQm9keSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBYWFggZnVuY3Rpb24gc2hvdWxkIGFjY2VwdCBhbiBlbmNvZGluZyBwYXJhbWV0ZXIgJiB0aHJvdyB0aGlzCisgICAgICAgICAgICAvLyBleGNlcHRpb24uICBPdGhlcndpc2UgdGhyb3cgc29tZXRoaW5nIGV4cGVjdGVkLgorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKworCisKKyAgICAvKgorICAgICAqIFBhcnNlIGEgbmFtZSBpbiB0aGUgcXVlcnkgc3RyaW5nLgorICAgICAqLworCisgICAgc3RhdGljIHByaXZhdGUgU3RyaW5nIHBhcnNlTmFtZShTdHJpbmcgcywgU3RyaW5nQnVmZmVyIHNiKSB7CisJc2Iuc2V0TGVuZ3RoKDApOworCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CisJICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOyAKKwkgICAgc3dpdGNoIChjKSB7CisJICAgIGNhc2UgJysnOgorCQlzYi5hcHBlbmQoJyAnKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgJyUnOgorCQl0cnkgeworCQkgICAgc2IuYXBwZW5kKChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KHMuc3Vic3RyaW5nKGkrMSwgaSszKSwgCisJCQkJCQkgICAgICAxNikpOworCQkgICAgaSArPSAyOworCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkgICAgLy8gWFhYCisJCSAgICAvLyBuZWVkIHRvIGJlIG1vcmUgc3BlY2lmaWMgYWJvdXQgaWxsZWdhbCBhcmcKKwkJICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfSBjYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCSAgICBTdHJpbmcgcmVzdCAgPSBzLnN1YnN0cmluZyhpKTsKKwkJICAgIHNiLmFwcGVuZChyZXN0KTsKKwkJICAgIGlmIChyZXN0Lmxlbmd0aCgpPT0yKQorCQkJaSsrOworCQl9CisJCQorCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJc2IuYXBwZW5kKGMpOworCQlicmVhazsKKwkgICAgfQorCX0KKwlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJlY29uc3RydWN0cyB0aGUgVVJMIHRoZSBjbGllbnQgdXNlZCB0byBtYWtlIHRoZSByZXF1ZXN0LAorICAgICAqIHVzaW5nIGluZm9ybWF0aW9uIGluIHRoZSA8Y29kZT5IdHRwU2VydmxldFJlcXVlc3Q8L2NvZGU+IG9iamVjdC4KKyAgICAgKiBUaGUgcmV0dXJuZWQgVVJMIGNvbnRhaW5zIGEgcHJvdG9jb2wsIHNlcnZlciBuYW1lLCBwb3J0CisgICAgICogbnVtYmVyLCBhbmQgc2VydmVyIHBhdGgsIGJ1dCBpdCBkb2VzIG5vdCBpbmNsdWRlIHF1ZXJ5CisgICAgICogc3RyaW5nIHBhcmFtZXRlcnMuCisgICAgICogCisgICAgICogPHA+QmVjYXVzZSB0aGlzIG1ldGhvZCByZXR1cm5zIGEgPGNvZGU+U3RyaW5nQnVmZmVyPC9jb2RlPiwKKyAgICAgKiBub3QgYSBzdHJpbmcsIHlvdSBjYW4gbW9kaWZ5IHRoZSBVUkwgZWFzaWx5LCBmb3IgZXhhbXBsZSwKKyAgICAgKiB0byBhcHBlbmQgcXVlcnkgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgcmVkaXJlY3QgbWVzc2FnZXMKKyAgICAgKiBhbmQgZm9yIHJlcG9ydGluZyBlcnJvcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxCWEgPGNvZGU+SHR0cFNlcnZsZXRSZXF1ZXN0PC9jb2RlPiBvYmplY3QKKyAgICAgKgkJCWNvbnRhaW5pbmcgdGhlIGNsaWVudCdzIHJlcXVlc3QKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZ0J1ZmZlcjwvY29kZT4gb2JqZWN0IGNvbnRhaW5pbmcKKyAgICAgKgkJCXRoZSByZWNvbnN0cnVjdGVkIFVSTAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBnZXRSZXF1ZXN0VVJMIChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisJU3RyaW5nQnVmZmVyIHVybCA9IG5ldyBTdHJpbmdCdWZmZXIgKCk7CisJU3RyaW5nIHNjaGVtZSA9IHJlcS5nZXRTY2hlbWUgKCk7CisJaW50IHBvcnQgPSByZXEuZ2V0U2VydmVyUG9ydCAoKTsKKwlTdHJpbmcgdXJsUGF0aCA9IHJlcS5nZXRSZXF1ZXN0VVJJKCk7CisJCisJLy9TdHJpbmcJCXNlcnZsZXRQYXRoID0gcmVxLmdldFNlcnZsZXRQYXRoICgpOworCS8vU3RyaW5nCQlwYXRoSW5mbyA9IHJlcS5nZXRQYXRoSW5mbyAoKTsKKworCXVybC5hcHBlbmQgKHNjaGVtZSk7CQkvLyBodHRwLCBodHRwcworCXVybC5hcHBlbmQgKCI6Ly8iKTsKKwl1cmwuYXBwZW5kIChyZXEuZ2V0U2VydmVyTmFtZSAoKSk7CisJaWYgKChzY2hlbWUuZXF1YWxzICgiaHR0cCIpICYmIHBvcnQgIT0gODApCisJCXx8IChzY2hlbWUuZXF1YWxzICgiaHR0cHMiKSAmJiBwb3J0ICE9IDQ0MykpIHsKKwkgICAgdXJsLmFwcGVuZCAoJzonKTsKKwkgICAgdXJsLmFwcGVuZCAocmVxLmdldFNlcnZlclBvcnQgKCkpOworCX0KKwkvL2lmIChzZXJ2bGV0UGF0aCAhPSBudWxsKQorCS8vICAgIHVybC5hcHBlbmQgKHNlcnZsZXRQYXRoKTsKKwkvL2lmIChwYXRoSW5mbyAhPSBudWxsKQorCS8vICAgIHVybC5hcHBlbmQgKHBhdGhJbmZvKTsKKwl1cmwuYXBwZW5kKHVybFBhdGgpOworCXJldHVybiB1cmw7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkYjk5MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyOCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIERlZmF1bHQgbG9jYWxpemVkIHN0cmluZyBpbmZvcm1hdGlvbgorIyBMb2NhbGl6ZWQgZm9yIExvY2FsZSBlbl9VUworCitlcnIuY29va2llX25hbWVfaXNfdG9rZW49Q29va2llIG5hbWUgXCJ7MH1cIiBpcyBhIHJlc2VydmVkIHRva2VuCitlcnIuaW8ubmVnYXRpdmVsZW5ndGg9TmVnYXRpdmUgTGVuZ3RoIGdpdmVuIGluIHdyaXRlIG1ldGhvZAorZXJyLmlvLnNob3J0X3JlYWQ9U2hvcnQgUmVhZAorCitodHRwLm1ldGhvZF9ub3RfaW1wbGVtZW50ZWQ9TWV0aG9kIHswfSBpcyBub3QgZGVmaW5lZCBpbiBSRkMgMjA2OCBhbmQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgU2VydmxldCBBUEkgCisKK2h0dHAubWV0aG9kX2dldF9ub3Rfc3VwcG9ydGVkPUhUVFAgbWV0aG9kIEdFVCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgVVJMCitodHRwLm1ldGhvZF9wb3N0X25vdF9zdXBwb3J0ZWQ9SFRUUCBtZXRob2QgUE9TVCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgVVJMCitodHRwLm1ldGhvZF9wdXRfbm90X3N1cHBvcnRlZD1IVFRQIG1ldGhvZCBQVVQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIFVSTAoraHR0cC5tZXRob2RfZGVsZXRlX25vdF9zdXBwb3J0ZWQ9SHR0cCBtZXRob2QgREVMRVRFIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBVUkwKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1Y2RhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzAgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyAkSWQkCisjCisjIERlZmF1bHQgbG9jYWxpemVkIHN0cmluZyBpbmZvcm1hdGlvbgorIyBMb2NhbGl6ZWQgcGFyYSBMb2NhbGUgZXNfRVMKKworZXJyLmNvb2tpZV9uYW1lX2lzX3Rva2VuPUVsIE5vbWJyZSBkZSBDb29raWUgezB9IGVzIHVuYSBwYWxhYnJhIHJlc2VydmFkYQorZXJyLmlvLm5lZ2F0aXZlbGVuZ3RoPUxvbmdpdHVkIE5lZ2F0aXZhIGVuIGVsIG1ldG9kbyB3cml0ZQorZXJyLmlvLnNob3J0X3JlYWQ9TGVjdHVyYSBDb3J0YQorCitodHRwLm1ldGhvZF9ub3RfaW1wbGVtZW50ZWQ9RWwgTWV0b2RvIHswfSBubyBlc3RhIGRlZmluaWRvIGVuIGxhIGVzcGVjaWZpY2FjaW9uIFJGQyAyMDY4IHkgbm8gZXMgc29wb3J0YWRvIHBvciBsYSBBUEkgU2VydmxldCAKKworaHR0cC5tZXRob2RfZ2V0X25vdF9zdXBwb3J0ZWQ9RWwgTWV0b2RvIEhUVFAgR0VUIG5vIGVzIHNvcG9ydGFkbyBwb3IgZXN0YSBVUkwKK2h0dHAubWV0aG9kX3Bvc3Rfbm90X3N1cHBvcnRlZD1FbCBNZXRvZG8gSFRUUCBQT1NUIG5vIGVzIHNvcG9ydGFkbyBwb3IgZXN0YSBVUkwKK2h0dHAubWV0aG9kX3B1dF9ub3Rfc3VwcG9ydGVkPUVsIE1ldG9kbyBIVFRQIFBVVCBubyBlcyBzb3BvcnRhZG8gcG9yIGVzdGEgVVJMCitodHRwLm1ldGhvZF9kZWxldGVfbm90X3N1cHBvcnRlZD1FbCBNZXRvZG8gSFRUUCBERUxFVEUgbm8gZXMgc29wb3J0YWRvIHBvciBlc3RhIFVSTApkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZhZWRjZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyOCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIERlZmF1bHQgbG9jYWxpemVkIHN0cmluZyBpbmZvcm1hdGlvbgorIyBMb2NhbGl6ZWQgZm9yIExvY2FsZSBmcl9GUgorCitlcnIuY29va2llX25hbWVfaXNfdG9rZW49TGUgbm9tIGRlIGNvb2tpZSBcInswfVwiIGVzdCB1biBcInRva2VuXCIgculzZXJ26QorZXJyLmlvLm5lZ2F0aXZlbGVuZ3RoPVRhaWxsZSBu6WdhdGl2ZSBkb25u6WUgZGFucyBsYSBt6XRob2RlIFwid3JpdGVcIgorZXJyLmlvLnNob3J0X3JlYWQ9TGVjdHVyZSBwYXJ0aWVsbGUKKworaHR0cC5tZXRob2Rfbm90X2ltcGxlbWVudGVkPUxlIG3pdGhvZGUgezB9IG4nJ2VzdCBwYXMgZOlmaW5pZSBkYW5zIGxhIFJGQyAyMDY4IGV0IG4nJ2VzdCBwYXMgc3VwcG9ydOllIHBhciBsJydBUEkgU2VydmxldAorCitodHRwLm1ldGhvZF9nZXRfbm90X3N1cHBvcnRlZD1MYSBt6XRob2RlIEhUVFAgR0VUIG4nJ2VzdCBwYXMgc3VwcG9ydOllIHBhciBjZXR0ZSBVUkwKK2h0dHAubWV0aG9kX3Bvc3Rfbm90X3N1cHBvcnRlZD1MYSBt6XRob2RlIEhUVFAgUE9TVCBuJydlc3QgcGFzIHN1cHBvcnTpZSBwYXIgY2V0dGUgVVJMCitodHRwLm1ldGhvZF9wdXRfbm90X3N1cHBvcnRlZD1MYSBt6XRob2RlIEhUVFAgUFVUIG4nJ2VzdCBwYXMgc3VwcG9ydOllIHBhciBjZXR0ZSBVUkwKK2h0dHAubWV0aG9kX2RlbGV0ZV9ub3Rfc3VwcG9ydGVkPUxhIG3pdGhvZGUgSFRUUCBERUxFVEUgbicnZXN0IHBhcyBzdXBwb3J06WUgcGFyIGNldHRlIFVSTCAKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOTgzZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjggQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBEZWZhdWx0IGxvY2FsaXplZCBzdHJpbmcgaW5mb3JtYXRpb24KKyMgTG9jYWxpemVkIGZvciBMb2NhbGUgamFfSlAKKworZXJyLmNvb2tpZV9uYW1lX2lzX3Rva2VuPVx1MzBhZlx1MzBjM1x1MzBhZFx1MzBmY1x1NTQwZCBcInswfVwiIFx1MzA2Zlx1NGU4OFx1N2QwNFx1NmUwOFx1MzA2ZVx1MzBjOFx1MzBmY1x1MzBhZlx1MzBmM1x1MzA2N1x1MzA1OVx1MzAwMgorZXJyLmlvLm5lZ2F0aXZlbGVuZ3RoPXdyaXRlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDZiXHU4Y2EwXHUzMDZlXHU5NTc3XHUzMDU1XHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCitlcnIuaW8uc2hvcnRfcmVhZD1cdThhYWRcdTMwN2ZcdThmYmNcdTMwN2ZcdTMwNGNcdTMwNTlcdTMwNTBcdTMwNmJcdTdkNDJcdTMwOGZcdTMwOGFcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIKKworaHR0cC5tZXRob2Rfbm90X2ltcGxlbWVudGVkPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOSB7MH0gXHUzMDZmUkZDIDIwNjhcdTMwNmJcdTMwNmZcdTViOWFcdTdmYTlcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNGFcdTMwODlcdTMwNWFcdTMwMDFcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhBUElcdTMwNjdcdTMwNmZcdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIKKworaHR0cC5tZXRob2RfZ2V0X25vdF9zdXBwb3J0ZWQ9SFRUUFx1MzA2ZUdFVFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVVSTFx1MzA2N1x1MzA2Zlx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMgoraHR0cC5tZXRob2RfcG9zdF9ub3Rfc3VwcG9ydGVkPUhUVFBcdTMwNmVQT1NUXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDZmXHUzMDAxXHUzMDUzXHUzMDZlVVJMXHUzMDY3XHUzMDZmXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCitodHRwLm1ldGhvZF9wdXRfbm90X3N1cHBvcnRlZD1IVFRQXHUzMDZlUFVUXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDZmXHUzMDAxXHUzMDUzXHUzMDZlVVJMXHUzMDY3XHUzMDZmXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCitodHRwLm1ldGhvZF9kZWxldGVfbm90X3N1cHBvcnRlZD1IVFRQXHUzMDZlREVMRVRFXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDZmXHUzMDAxXHUzMDUzXHUzMDZlVVJMXHUzMDY3XHUzMDZmXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL3BhY2thZ2UuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZGJkZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDIzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Cis8SFRNTD4KKzxIRUFEPgorPCEtLQorCisgIENvcHlyaWdodCAyMDAxIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICBUaGlzIHNvZnR3YXJlIGlzIHRoZSBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbiBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICAKKyAgVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcy4KKworLS0+CisKKzwvSEVBRD4KKzxCT0RZIEJHQ09MT1I9IndoaXRlIj4KKworVGhlIGphdmF4LnNlcnZsZXQuaHR0cCBwYWNrYWdlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIGNsYXNzZXMgYW5kIGludGVyZmFjZXMKK3RoYXQgZGVzY3JpYmUgYW5kIGRlZmluZSB0aGUgY29udHJhY3RzIGJldHdlZW4gYSBzZXJ2bGV0IGNsYXNzCitydW5uaW5nIHVuZGVyIHRoZSBIVFRQIHByb3RvY29sIGFuZCB0aGUgcnVudGltZSBlbnZpcm9ubWVudCBwcm92aWRlZAorZm9yIGFuIGluc3RhbmNlIG9mIHN1Y2ggYSBjbGFzcyBieSBhIGNvbmZvcm1pbmcgc2VydmxldCBjb250YWluZXIuCisKKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvcGFja2FnZS5odG1sIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNzIwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwyMyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgorPEhUTUw+Cis8SEVBRD4KKzwhLS0KKworICBDb3B5cmlnaHQgMjAwMSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyB0aGUgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24gb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgCisgIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCisKKy0tPgorCis8L0hFQUQ+Cis8Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+CisKK1RoZSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UgY29udGFpbnMgYSBudW1iZXIgb2YgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyB0aGF0CitkZXNjcmliZSBhbmQgZGVmaW5lIHRoZSBjb250cmFjdHMgYmV0d2VlbiBhIHNlcnZsZXQgY2xhc3MgYW5kIHRoZQorcnVudGltZSBlbnZpcm9ubWVudCBwcm92aWRlZCBmb3IgYW4gaW5zdGFuY2Ugb2Ygc3VjaCBhIGNsYXNzIGJ5IGEKK2NvbmZvcm1pbmcgc2VydmxldCBjb250YWluZXIuCisKKworPC9CT0RZPgorPC9IVE1MPgo=